[SCM] ardour/upstream: Imported Upstream version 5.0~dfsg

adiknoth-guest at users.alioth.debian.org adiknoth-guest at users.alioth.debian.org
Mon Aug 15 23:26:49 UTC 2016


The following commit has been merged in the upstream branch:
commit 6a5f902d3c618ad069a29f8074e7783fc9c3e163
Author: Adrian Knoth <adi at drcomp.erfurt.thur.de>
Date:   Sun Aug 14 11:56:44 2016 +0200

    Imported Upstream version 5.0~dfsg

diff --git a/TRANSLATORS b/TRANSLATORS
index 26211ad..b8c4c40 100644
--- a/TRANSLATORS
+++ b/TRANSLATORS
@@ -22,7 +22,7 @@ showing the case for Russian):
 libs/gtkmm2ext/po/ru.po
 
 Every PO file's name is a two-character code, e.g. 'de' for German, 'es' for
-Spanish and so on. However it's fairly common to have localizations for local
+Spanish, and so on. However it's fairly common to have localizations for local
 versions of a language, e.g. 'pt_BR' would stand for Brazilian Portuguese, and
 'es_MX' would stand for Mexican Spanish. Please refer to ISO language code
 table for details.
@@ -30,22 +30,47 @@ table for details.
 Here is the best workflow for existing translations.
 
 1. Build Ardour  using './waf' command (this step is actually optional).
+
 2a. If there is no existing translation for your language, run './waf i18n_pot'
 which will generate a POT (.pot) file for each of the directories shown
-above. For each directory you plan to translate, rename the POT file to end in .po and then
-continue with step 3.
+above. For each directory you plan to translate, rename the POT file to end in 
+.po and then continue with step 3.
+
 2b. If there is an existing translation for your language, run './waf
-i18n_pot' which will bring it up to date (along with all other PO files)
+i18n_po' which will bring it up to date (along with all other PO files)
+
 3. Open the relevant PO file in you PO editor of choice (see below).
-4. Open Ardour, find something untranslated, locate this phrase in PO file, translate.
+
+4. Open Ardour, find something untranslated, locate this phrase in PO file, 
+translate.
+
 5. Repeat previous step several times, save the PO file.
-6. Run './waf i18n_mo' to regenerate binary MO files and 'sudo ./waf install' to install them.
-7. Restart Ardour to see what your translation looks like and whether it needs fixes, e.g. has to be shorter.
 
-Note that as of Ardour 3 beta 1 the translations are only installed when you
-run './waf i18n' after './waf' and before 'sudo ./waf install'.
+6. Run './waf i18n_mo' to regenerate binary MO files and 'sudo ./waf install' 
+to install them.
+
+7. Restart Ardour to see what your translation looks like and whether it needs 
+fixes, e.g. has to be shorter.
+
+Note that as of Ardour 4 the translations are only installed when you run 
+'./waf i18n' after './waf' and before 'sudo ./waf install'.
+
+When you are done translating, it's best to get credited for your contribution. 
+Here is how you can do it:
+
+1. Run 'git commit -a' (assuming you only modified translation files) and 
+describe the changes you made. Typically the commit message looks like 
+'Update German translation'. That should be sufficient.
+
+2. Run 'git format-patch origin/master' (assuming you worked on a clone of the 
+master branch. That should generate a file called something like 
+'0001-Update-German-translation.patch'.
+
+3. Run 'bzip2 0001-Update-German-translation.patch' to compress the file.
 
-When you are done, save the file and submit it to the tracker.
+4. File a new bug report at http://tracker.ardour.org and attach the resulted 
+compressed file and tell either rgareus (Robin Gareus) or las (Paul Davis) on 
+the project's IRC channel (#ardour at irc.freenode.net) about your patch.
 
 There are some more things you need to know.
 
diff --git a/ardour.1.fr b/ardour.1.fr
index 368cb81..4a46d2d 100644
--- a/ardour.1.fr
+++ b/ardour.1.fr
@@ -1,6 +1,6 @@
 .TH ARDOUR 1 2002-12-29
 .SH NOM
-ardour \- une station de travail audio-numérique
+ardour \- une station de travail audio-numérique
 .SH SYNOPSIS
 ardour
 .B \-b
@@ -12,30 +12,30 @@ ardour
 .B \-\-help
 .SH DESCRIPTION
 Ardour est un enregistreur sur disque dur multi-canaux (HDR) et une station de
-travail audio-numérique (DAW).
-Il est capable d'enregistrer simultanément 24 ou plus canaux audio 32 bits à
+travail audio-numérique (DAW).
+Il est capable d'enregistrer simultanément 24 ou plus canaux audio 32 bits à
 48 kHz.
 Ardour a pour vocation de fonctionner comme un enregistreur sur disque dur
-"professionnel", en remplacement de solutions matérielles dédiées comme le
-Mackie HDR, le Tascam 2424 et les plus traditionnels système à bande tels que
-la série Alesis ADAT.
-Il est aussi conçu pour procurer les mêmes ou de meilleures fonctionnalités
-que des systèmes logiciels comme ProTools, Samplitude, Logic Audio, Nuendo et
-Cubase VST (nous reconnaissons ces marques comme marques déposées appartenant
-à leurs propriétaires respectifs).
-Il supporte MIDI Machine Control, et peut ainsi être contrôlé depuis
-n'importe quel contrôleur MMC, comme le Mackie Digital 8 Bus mixer et de nombreux autres mélangeurs audio-numériques modernes.
+"professionnel", en remplacement de solutions matérielles dédiées comme le
+Mackie HDR, le Tascam 2424 et les plus traditionnels système à bande tels que
+la série Alesis ADAT.
+Il est aussi conçu pour procurer les mêmes ou de meilleures fonctionnalités
+que des systèmes logiciels comme ProTools, Samplitude, Logic Audio, Nuendo et
+Cubase VST (nous reconnaissons ces marques comme marques déposées appartenant
+à leurs propriétaires respectifs).
+Il supporte MIDI Machine Control, et peut ainsi être contrôlé depuis
+n'importe quel contrôleur MMC, comme le Mackie Digital 8 Bus mixer et de nombreux autres mélangeurs audio-numériques modernes.
 .SH OPTIONS
 .TP
 .B \-b
 Affiche tous les noms des codes clavier possibles.
 .TP
 .B \-U
-Indiquer le chemin vers le fichier GTK RC à utiliser.
+Indiquer le chemin vers le fichier GTK RC à utiliser.
 Le fichier fourni s'appelle
 .B ardour_ui.rc
-et se trouve dans la racine du répertoire du code source d'Ardour.
-Ce fichier gère l'utilisation de toutes les couleurs et polices de caractère
+et se trouve dans la racine du répertoire du code source d'Ardour.
+Ce fichier gère l'utilisation de toutes les couleurs et polices de caractère
 dans Ardour.
 Ardour fonctionnera sans, mais son aspect sera, disons, affreux.
 .TP
@@ -44,10 +44,10 @@ Affiche le message d'aide.
 .SH FICHIERS
 .TP
 .B ardour.rc
-Paramètre par défaut et de démarrage d'Ardour.
+Paramètre par défaut et de démarrage d'Ardour.
 .TP
 .B ardour_ui.rc
-Définitions pour l'interface d'Ardour.
+Définitions pour l'interface d'Ardour.
 .SH ENVIRONNEMENT
 .TP
 .B ARDOUR_RC
@@ -65,7 +65,7 @@ Paul Davis.
 Ne
 .I pas
 le contacter directement.
-Contactez-le plutôt à <ardour-dev at lists.ardour.org>.
+Contactez-le plutôt à <ardour-dev at lists.ardour.org>.
 Vous pouvez vous inscrire ici :
 .br
 http://lists.ardour.org/listinfo.cgi/ardour-dev-ardour.org
diff --git a/ardour.1.ru b/ardour.1.ru
index 06ab114..66f29f0 100644
--- a/ardour.1.ru
+++ b/ardour.1.ru
@@ -1,84 +1,84 @@
 .TH "ARDOUR" "1" "2004-05-10" "" ""
-.SH "éíñ"
-ardour \- ÒÁÂÏÞÁÑ ÓÔÁÎÃÉÑ ÄÌÑ ÃÉÆÒÏ×ÏÊ ÏÂÒÁÂÏÔËÉ Ú×ÕËÁ
-.SH "ïâúïò"
+.SH "ИМЯ"
+ardour \- рабочая станция для цифровой обработки звука
+.SH "ОБЗОР"
 ardour
 .B \-b
 .RB [ \-U
-.I R ÆÁÊÌ ]
-.RI [ ÓÅÓÓÉÑ ]
+.I R файл ]
+.RI [ сессия ]
 .br 
 ardour
 .B \-\-help
-.SH "ïðéóáîéå"
-Ardour \- ÜÔÏ ÐÒÏÇÒÁÍÍÁ ÄÌÑ ÍÎÏÇÏËÁÎÁÌØÎÏÊ ÚÁÐÉÓÉ ÎÁ Ö£ÓÔËÉÊ ÄÉÓË
-(hard disk recorder \- HDR) É ÏÄÎÏ×ÒÅÍÅÎÎÏ ÒÅÄÁËÔÏÒ ÄÌÑ ÃÉÆÒÏ×ÏÊ ÏÂÒÁÂÏÔËÉ Ú×ÕËÁ
+.SH "ОПИСАНИЕ"
+Ardour \- это программа для многоканальной записи на жёсткий диск
+(hard disk recorder \- HDR) и одновременно редактор для цифровой обработки звука
 (digital audio workstation \- DAW).
 .br 
-ïÎ ÓÐÏÓÏÂÅÎ ÚÁÐÉÓÙ×ÁÔØ ÏÄÎÏ×ÒÅÍÅÎÎÏ ÄÏ 24 ÉÌÉ ÂÏÌÅÅ ËÁÎÁÌÏ× 32\-ÂÉÔÎÙÈ
-ÁÕÄÉÏÄÁÎÎÙÈ Ó ÞÁÓÔÏÔÏÊ ÄÉÓËÒÅÔÉÚÁÃÉÉ 48 ËçÃ.
-Ardour ÎÁÃÅÌÅÎ ÒÁÂÏÔÁÔØ ËÁË "ÐÒÏÆÅÓÓÉÏÎÁÌØÎÁÑ" HDR\-ÓÉÓÔÅÍÁ, ÓÐÏÓÏÂÎÁÑ
-ÚÁÍÅÎÉÔØ ÔÁËÉÅ ÁÐÐÁÒÁÔÎÙÅ ÒÅÛÅÎÉÑ ËÁË Mackie HDR, Tascam 2424 É ÍÎÏÇÉÅ
-ÔÒÁÄÉÃÉÏÎÎÙÅ ÓÉÓÔÅÍÙ ÚÁÐÉÓÉ ÎÁ ÍÁÇÎÉÔÎÕÀ ÌÅÎÔÕ, ÎÁÐÒÉÍÅÒ ÓÅÒÉÀ Alesis ADAT.
-ôÁËÖÅ ÐÒÅÓÌÅÄÕÅÔÓÑ ÃÅÌØ ÏÂÅÓÐÅÞÉÔØ ÆÕÎËÃÉÏÎÁÌØÎÏÓÔØ ÁÎÁÌÏÇÉÞÎÕÀ ÉÌÉ ÄÁÖÅ ÂÏÌØÛÕÀ
-ÐÏ ÓÒÁ×ÎÅÎÉÀ Ó ÔÁËÉÍÉ ÐÒÏÇÒÁÍÍÎÙÍÉ ÐÒÏÄÕËÔÁÍÉ ËÁË ProTools, Samplitude, Logic Audio,
-Nuendo and Cubase VST (ÍÙ ÐÒÉÚÎÁ£Í, ÞÔÏ ÜÔÉ É ÄÒÕÇÉÅ ÎÁÉÍÅÎÏ×ÁÎÉÑ Ñ×ÌÑÀÔÓÑ
-ÔÏÒÇÏ×ÙÍÉ ÍÁÒËÁÍÉ, ËÏÔÏÒÙÅ ÐÒÉÎÁÄÌÅÖÁÔ ÓÏÏÔ×ÅÔÓÔ×ÕÀÝÉÍ ÏÂÌÁÄÁÔÅÌÑÍ).
+Он способен записывать одновременно до 24 или более каналов 32\-битных
+аудиоданных с частотой дискретизации 48 кГц.
+Ardour нацелен работать как "профессиональная" HDR\-система, способная
+заменить такие аппаратные решения как Mackie HDR, Tascam 2424 и многие
+традиционные системы записи на магнитную ленту, например серию Alesis ADAT.
+Также преследуется цель обеспечить функциональность аналогичную или даже большую
+по сравнению с такими программными продуктами как ProTools, Samplitude, Logic Audio,
+Nuendo and Cubase VST (мы признаём, что эти и другие наименования являются
+торговыми марками, которые принадлежат соответствующим обладателям).
 .br 
-éÍÅÅÔÓÑ ÐÏÄÄÅÒÖËÁ MIDI Machine Control (MMC), × ÔÏÍ ÞÉÓÌÅ ×ÏÚÍÏÖÎÏ É
-ÕÐÒÁ×ÌÅÎÉÅ ÏÔ ÌÀÂÏÇÏ MMC\-ËÏÎÔÒÏÌÌÅÒÁ, ÎÁÐÒÉÍÅÒ, ÔÁËÏÇÏ ËÁË ÍÉËÛÅÒ Mackie Digital
-8 Bus ÉÌÉ ÌÀÂÏÇÏ ÄÒÕÇÏÇÏ ÓÏ×ÒÅÍÅÎÎÏÇÏ ÍÉËÛÅÒÁ.
-.SH "ëìàþé ëïíáîäîïê óôòïëé"
+Имеется поддержка MIDI Machine Control (MMC), в том числе возможно и
+управление от любого MMC\-контроллера, например, такого как микшер Mackie Digital
+8 Bus или любого другого современного микшера.
+.SH "КЛЮЧИ КОМАНДНОЙ СТРОКИ"
 .TP 
 .B \-b, \-\-bindings
-÷Ù×ÅÓÔÉ ÓÐÉÓÏË ÄÏÓÔÕÐÎÙÈ "ÇÏÒÑÞÉÈ" ËÌÁ×ÉÛ.
+Вывести список доступных "горячих" клавиш.
 .TP 
 .B \-n, \-\-no\-splash
-îÅ ×Ù×ÏÄÉÔØ ÚÁÓÔÁ×ËÕ.
+Не выводить заставку.
 .TP 
-.B \-U, \-\-ui\-rcfile ÐÕÔØ
-õËÁÚÁÔØ ÐÕÔØ Ë ÆÁÊÌÕ ÏÐÉÓÁÎÉÑ ÇÒÁÆÉÞÅÓËÏÇÏ ÉÎÔÅÒÆÅÊÓÁ (GTK RC).
-÷ Î£Í ÏÐÒÅÄÅÌÅÎÙ ×ÓÅ ÛÒÉÆÔÙ É Ã×ÅÔÁ ÜÌÅÍÅÎÔÏ× ÉÎÔÅÒÆÅÊÓÁ Ardour.
-æÁÊÌ ÄÏÌÖÅÎ ÉÍÅÎÏ×ÁÔØÓÑ ËÁË
+.B \-U, \-\-ui\-rcfile путь
+Указать путь к файлу описания графического интерфейса (GTK RC).
+В нём определены все шрифты и цвета элементов интерфейса Ardour.
+Файл должен именоваться как
 .B ardour_ui.rc
-, ÅÇÏ ÛÁÂÌÏÎ ÎÁÈÏÄÉÔÓÑ × ËÏÒÎÅ×ÏÍ ËÁÔÁÌÏÇÅ ÉÓÈÏÄÎÙÈ ÔÅËÓÔÏ× Ardour.
-Ardour ÍÏÖÎÏ ÚÁÐÕÓÔÉÔØ É ÂÅÚ ÎÅÇÏ, ÎÏ ×ÎÅÛÎÉÊ ×ÉÄ ÉÎÔÅÒÆÅÊÓÁ ÂÕÄÅÔ ÂÅÚÏÂÒÁÚÎÙÍ.
+, его шаблон находится в корневом каталоге исходных текстов Ardour.
+Ardour можно запустить и без него, но внешний вид интерфейса будет безобразным.
 .TP 
-.B \-c, \-\-jack\-client\-name ÉÍÑ
-éÓÐÏÌØÚÏ×ÁÔØ ÄÒÕÇÏÅ ÉÍÑ jack\-ËÌÉÅÎÔÁ, ardour ÐÏ ÕÍÏÌÞÁÎÉÀ.
+.B \-c, \-\-jack\-client\-name имя
+Использовать другое имя jack\-клиента, ardour по умолчанию.
 .TP 
 .B \-v, \-\-version
-éÎÆÏÒÍÁÃÉÑ Ï ×ÅÒÓÉÉ ÐÒÏÇÒÁÍÍÙ.
+Информация о версии программы.
 .TP 
 .B \-h, \-\-help
-ðÏËÁÚÁÔØ ÓÐÒÁ×ËÕ.
-.SH "æáêìù"
+Показать справку.
+.SH "ФАЙЛЫ"
 .TP 
 .B ardour.rc
-îÁÓÔÒÏÊËÉ ÐÏ ÕÍÏÌÞÁÎÉÀ É ÕÓÔÁÎÏ×ËÉ "ÇÏÒÑÞÉÈ" ËÌÁ×ÉÛ ÄÌÑ Ardour.
+Настройки по умолчанию и установки "горячих" клавиш для Ardour.
 .TP 
 .B ardour_ui.rc
-ïÐÉÓÁÎÉÅ ÐÏÌØÚÏ×ÁÔÅÌØÓËÏÇÏ ÉÎÔÅÒÆÅÊÓÁ Ardour.
-.SH "ïëòõöåîéå"
+Описание пользовательского интерфейса Ardour.
+.SH "ОКРУЖЕНИЕ"
 .TP 
 .B ARDOUR_RC
-ðÕÔØ Ë ÆÁÊÌÕ ardour.rc.
+Путь к файлу ardour.rc.
 .TP 
 .B ARDOUR_SYSTEM_RC
-ðÕÔØ Ë ÆÁÊÌÕ ardour_system.rc
+Путь к файлу ardour_system.rc
 .TP 
 .B LADSPA_PATH
-ðÕÔØ Ë ÍÏÄÕÌÑÍ (ÐÌÁÇÉÎÁÍ) LADSPA.
-.SH "ïûéâëé ÷ ðòïçòáííå"
-äÁ, ÉÍÅÀÔÓÑ.
-.SH "á÷ôïò"
-Paul Davis (ðÏÌ äÜ×ÉÓ).
-ðÏÖÁÌÕÊÓÔÁ,
-.I ÎÅ ÏÂÒÁÝÁÊÔÅÓØ
-Ë ÎÅÍÕ ÎÁÐÒÑÍÕÀ.
-ó×ÑÚÁÔØÓÑ Ó ÎÉÍ É ÄÒÕÇÉÍÉ ÒÁÚÒÁÂÏÔÞÉËÁÍÉ ÍÏÖÎÏ ÏÔÐÒÁ×É× ÓÏÏÂÝÅÎÉÅ × ÓÐÉÓÏË ÒÁÓÓÙÌËÉ,
+Путь к модулям (плагинам) LADSPA.
+.SH "ОШИБКИ В ПРОГРАММЕ"
+Да, имеются.
+.SH "АВТОР"
+Paul Davis (Пол Дэвис).
+Пожалуйста,
+.I не обращайтесь
+к нему напрямую.
+Связаться с ним и другими разработчиками можно отправив сообщение в список рассылки,
 <ardour-dev at lists.ardour.org>.
 .br 
-÷Ù ÍÏÖÅÔÅ ÐÏÄÐÉÓÁÔØÓÑ ÎÁ ÎÅÇÏ ÐÏ ÁÄÒÅÓÕ:
+Вы можете подписаться на него по адресу:
 .br 
 http://lists.ardour.org/listinfo.cgi/ardour-dev-ardour.org
diff --git a/cfgtool/wscript b/cfgtool/wscript
index 04dda4f..6f594ca 100644
--- a/cfgtool/wscript
+++ b/cfgtool/wscript
@@ -19,6 +19,6 @@ def build(bld):
     obj = bld (features = 'cxx c cxxprogram')
     obj.source       = 'cfgtool.cc'
     obj.target       = 'cfgtool'
-    obj.use          = [ 'libpbd', 'libardour', ]
-    obj.use          = [ 'libpbd', 'libardour', ]
+    obj.use          = [ 'libpbd', 'libardour' ]
+    obj.uselib       = [ 'GLIBMM', 'XML' ]
     obj.install_path = None
diff --git a/doc/.gitignore b/doc/.gitignore
deleted file mode 100644
index 2ec816f..0000000
--- a/doc/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-html
-latex
diff --git a/doc/layering/.gitignore b/doc/layering/.gitignore
deleted file mode 100644
index debc120..0000000
--- a/doc/layering/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-*.aux
-*.pdf
-*.log
diff --git a/doc/updating_waf.txt b/doc/updating_waf.txt
index 622a0f6..69c1225 100644
--- a/doc/updating_waf.txt
+++ b/doc/updating_waf.txt
@@ -1,7 +1,15 @@
-Download waf (http://code.google.com/p/waf/)
+Download waf (https://waf.io/)
+
 autowaf.py is present in the tools directory of the Ardour source code.
+a patch for C++11/clang can be found in tools/waflib.patch (needed for waf 1.8.19)
+
+Current waf is build as follows;
 
-From within the waf source tree, run:
+ARDOURSRC=`pwd`
+cd /tmp
+curl https://waf.io/waf-1.6.11.tar.bz2 | tar xj
+cd waf-1.6.11
 
-./waf-light -v --make-waf --tools=misc,doxygen,/path/to/autowaf.py --prelude=''
-cp ./waf /path/to/ardour/3.0/waf
+patch -p1 < $ARDOURSRC/tools/waflib.patch
+./waf-light -v --make-waf --tools=misc,doxygen,$ARDOURSRC/tools/autowaf.py --prelude=''
+cp ./waf $ARDOURSRC/waf
diff --git a/gtk2_ardour/about.cc b/gtk2_ardour/about.cc
index 09781f1..72bccfd 100644
--- a/gtk2_ardour/about.cc
+++ b/gtk2_ardour/about.cc
@@ -36,7 +36,7 @@
 #include "configinfo.h"
 #include "rgb_macros.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 #ifdef WAF_BUILD
 #include "gtk2ardour-version.h"
@@ -124,6 +124,7 @@ static const gchar * paypal_xpm[] = {
 #endif
 
 static const char* authors[] = {
+	N_("Fons Adriaensen"),
 	N_("Brian Ahr"),
 	N_("John Anderson"),
 	N_("Marcus Andersson"),
@@ -175,6 +176,7 @@ static const char* authors[] = {
 	N_("Jack O'Quin"),
 	N_("Pavel Potocek"),
 	N_("Nimal Ratnayake"),
+	N_("Julien Rivaud"),
 	N_("David Robillard"),
 	N_("Julien Roger"),
 	N_("Taybin Rutkin"),
@@ -613,16 +615,22 @@ About::About ()
 		codename = "";
 	}
 
+#ifndef NDEBUG
+	const std::string suffix = _(" - debug");
+#else
+	const std::string suffix = "";
+#endif
+
 	set_translator_credits (t);
 	set_copyright (_("Copyright (C) 1999-2015 Paul Davis\n"));
 	set_license (gpl);
 	set_name (X_("Ardour"));
 	set_website (X_("http://ardour.org/"));
 	set_website_label (_("http://ardour.org/"));
-	set_version ((string_compose(_("%1%2\n(built from revision %3)\n%4"),
+	set_version ((string_compose(_("%1%2\n(rev %3)\n%4%5"),
 				     VERSIONSTRING,
 				     codename,
-				     revision, cpu_arch)));
+				     revision, cpu_arch, suffix)));
 
 	Gtk::Button* config_button = manage (new Button (_("Config")));
 
diff --git a/gtk2_ardour/actions.cc b/gtk2_ardour/actions.cc
index ea6cc4b..1edbcaf 100644
--- a/gtk2_ardour/actions.cc
+++ b/gtk2_ardour/actions.cc
@@ -37,7 +37,7 @@
 #include "gtkmm2ext/actions.h"
 
 #include "actions.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace Gtk;
@@ -45,23 +45,23 @@ using namespace Glib;
 using namespace PBD;
 using namespace ARDOUR;
 
-vector<RefPtr<Gtk::Action> > ActionManager::session_sensitive_actions;
-vector<RefPtr<Gtk::Action> > ActionManager::write_sensitive_actions;
-vector<RefPtr<Gtk::Action> > ActionManager::region_list_selection_sensitive_actions;
-vector<RefPtr<Gtk::Action> > ActionManager::track_selection_sensitive_actions;
-vector<RefPtr<Gtk::Action> > ActionManager::point_selection_sensitive_actions;
-vector<RefPtr<Gtk::Action> > ActionManager::time_selection_sensitive_actions;
-vector<RefPtr<Gtk::Action> > ActionManager::line_selection_sensitive_actions;
-vector<RefPtr<Gtk::Action> > ActionManager::playlist_selection_sensitive_actions;
-vector<RefPtr<Gtk::Action> > ActionManager::mouse_edit_point_requires_canvas_actions;
-
-vector<RefPtr<Gtk::Action> > ActionManager::range_sensitive_actions;
-vector<RefPtr<Gtk::Action> > ActionManager::engine_sensitive_actions;
-vector<RefPtr<Gtk::Action> > ActionManager::engine_opposite_sensitive_actions;
-vector<RefPtr<Gtk::Action> > ActionManager::transport_sensitive_actions;
-vector<RefPtr<Gtk::Action> > ActionManager::edit_point_in_region_sensitive_actions;
-
-static Glib::RefPtr<UIManager> ui_manager;
+typedef std::vector<RefPtr<Gtk::Action> > RelatedActions;
+
+RelatedActions ActionManager::session_sensitive_actions;
+RelatedActions ActionManager::write_sensitive_actions;
+RelatedActions ActionManager::region_list_selection_sensitive_actions;
+RelatedActions ActionManager::plugin_selection_sensitive_actions;
+RelatedActions ActionManager::track_selection_sensitive_actions;
+RelatedActions ActionManager::point_selection_sensitive_actions;
+RelatedActions ActionManager::time_selection_sensitive_actions;
+RelatedActions ActionManager::line_selection_sensitive_actions;
+RelatedActions ActionManager::playlist_selection_sensitive_actions;
+RelatedActions ActionManager::mouse_edit_point_requires_canvas_actions;
+RelatedActions ActionManager::range_sensitive_actions;
+RelatedActions ActionManager::engine_sensitive_actions;
+RelatedActions ActionManager::engine_opposite_sensitive_actions;
+RelatedActions ActionManager::transport_sensitive_actions;
+RelatedActions ActionManager::edit_point_in_region_sensitive_actions;
 
 void
 ActionManager::init ()
diff --git a/gtk2_ardour/actions.h b/gtk2_ardour/actions.h
index 1335834..6900e83 100644
--- a/gtk2_ardour/actions.h
+++ b/gtk2_ardour/actions.h
@@ -37,6 +37,7 @@ namespace ActionManager {
 	extern std::vector<Glib::RefPtr<Gtk::Action> > session_sensitive_actions;
 	extern std::vector<Glib::RefPtr<Gtk::Action> > write_sensitive_actions;
 	extern std::vector<Glib::RefPtr<Gtk::Action> > region_list_selection_sensitive_actions;
+	extern std::vector<Glib::RefPtr<Gtk::Action> > plugin_selection_sensitive_actions;
 
 	extern std::vector<Glib::RefPtr<Gtk::Action> > track_selection_sensitive_actions;
 	extern std::vector<Glib::RefPtr<Gtk::Action> > point_selection_sensitive_actions;
diff --git a/gtk2_ardour/add_route_dialog.cc b/gtk2_ardour/add_route_dialog.cc
index 0a14647..90ccff5 100644
--- a/gtk2_ardour/add_route_dialog.cc
+++ b/gtk2_ardour/add_route_dialog.cc
@@ -28,18 +28,22 @@
 
 #include "pbd/error.h"
 #include "pbd/convert.h"
+
 #include "gtkmm2ext/utils.h"
+#include "gtkmm2ext/doi.h"
 
 #include "ardour/plugin_manager.h"
 #include "ardour/profile.h"
 #include "ardour/template_utils.h"
 #include "ardour/route_group.h"
 #include "ardour/session.h"
+#include "ardour/vca.h"
 
 #include "utils.h"
 #include "add_route_dialog.h"
 #include "route_group_dialog.h"
-#include "i18n.h"
+#include "tooltips.h"
+#include "pbd/i18n.h"
 
 using namespace Gtk;
 using namespace Gtkmm2ext;
@@ -51,7 +55,7 @@ using namespace ARDOUR_UI_UTILS;
 std::vector<std::string> AddRouteDialog::channel_combo_strings;
 
 AddRouteDialog::AddRouteDialog ()
-	: ArdourDialog (_("Add Track or Bus"))
+	: ArdourDialog (_("Add Track/Bus/VCA"))
 	, routes_adjustment (1, 1, 128, 1, 4)
 	, routes_spinner (routes_adjustment)
 	, configuration_label (_("Configuration:"))
@@ -59,33 +63,34 @@ AddRouteDialog::AddRouteDialog ()
 	, instrument_label (_("Instrument:"))
 {
 	set_name ("AddRouteDialog");
-	set_modal (true);
 	set_skip_taskbar_hint (true);
 	set_resizable (false);
+	set_position (WIN_POS_MOUSE);
 
 	name_template_entry.set_name (X_("AddRouteDialogNameTemplateEntry"));
 	// routes_spinner.set_name (X_("AddRouteDialogSpinner"));
 	channel_combo.set_name (X_("ChannelCountSelector"));
 	mode_combo.set_name (X_("ChannelCountSelector"));
 
-	refill_channel_setups ();
-	refill_route_groups ();
 	refill_track_modes ();
 
-	channel_combo.set_active_text (channel_combo_strings.front());
-
 	track_bus_combo.append_text (_("Audio Tracks"));
 	track_bus_combo.append_text (_("MIDI Tracks"));
 	track_bus_combo.append_text (_("Audio+MIDI Tracks"));
-	track_bus_combo.append_text (_("Busses"));
+	track_bus_combo.append_text (_("Audio Busses"));
+	track_bus_combo.append_text (_("MIDI Busses"));
+	track_bus_combo.append_text (_("VCA Masters"));
 	track_bus_combo.set_active (0);
 
 	insert_at_combo.append_text (_("First"));
 	insert_at_combo.append_text (_("Before Selection"));
 	insert_at_combo.append_text (_("After Selection"));
 	insert_at_combo.append_text (_("Last"));
+	insert_at_combo.set_active (3);
 
-	insert_at_combo.set_active (1);
+	strict_io_combo.append_text (_("Flexible-I/O"));
+	strict_io_combo.append_text (_("Strict-I/O"));
+	strict_io_combo.set_active (Config->get_strict_io () ? 1 : 0);
 
 	VBox* vbox = manage (new VBox);
 	Gtk::Label* l;
@@ -135,16 +140,10 @@ AddRouteDialog::AddRouteDialog ()
 	table2->attach (channel_combo, 2, 3, n, n + 1, Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 0, 0);
 	++n;
 
-	if (!ARDOUR::Profile->get_sae ()) {
-
-		/* Track mode */
-
-		mode_label.set_alignment (Gtk::ALIGN_LEFT, Gtk::ALIGN_CENTER);
-		table2->attach (mode_label, 1, 2, n, n + 1, Gtk::FILL, Gtk::EXPAND, 0, 0);
-		table2->attach (mode_combo, 2, 3, n, n + 1, Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 0, 0);
-		++n;
-
-	}
+	mode_label.set_alignment (Gtk::ALIGN_LEFT, Gtk::ALIGN_CENTER);
+	table2->attach (mode_label, 1, 2, n, n + 1, Gtk::FILL, Gtk::EXPAND, 0, 0);
+	table2->attach (mode_combo, 2, 3, n, n + 1, Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 0, 0);
+	++n;
 
 	instrument_label.set_alignment (Gtk::ALIGN_LEFT, Gtk::ALIGN_CENTER);
 	table2->attach (instrument_label, 1, 2, n, n + 1, Gtk::FILL, Gtk::EXPAND, 0, 0);
@@ -164,6 +163,20 @@ AddRouteDialog::AddRouteDialog ()
 	table2->attach (insert_at_combo, 2, 3, n, n + 1, Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 0, 0);
 	++n;
 
+	/* New Route's Routing is.. */
+
+	if (Profile->get_mixbus ()) {
+		strict_io_combo.set_active (1);
+	} else {
+		l = manage (new Label (_("Output Ports:"), Gtk::ALIGN_LEFT, Gtk::ALIGN_CENTER, false));
+		table2->attach (*l, 1, 2, n, n + 1, Gtk::FILL, Gtk::EXPAND, 0, 0);
+		table2->attach (strict_io_combo, 2, 3, n, n + 1, Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 0, 0);
+
+		ARDOUR_UI_UTILS::set_tooltip (strict_io_combo,
+				_("With strict-i/o enabled, Effect Processors will not modify the number of channels on a track. The number of output channels will always match the number of input channels."));
+		++n;
+	}
+
 	options_box->pack_start (*table2, false, true);
 	vbox->pack_start (*options_box, false, true);
 
@@ -204,29 +217,24 @@ AddRouteDialog::TypeWanted
 AddRouteDialog::type_wanted() const
 {
 	std::string str = track_bus_combo.get_active_text();
-	if (str == _("Busses")) {
+	if (str == _("Audio Busses")) {
 		return AudioBus;
+	} else if (str == _("MIDI Busses")){
+		return MidiBus;
 	} else if (str == _("MIDI Tracks")){
 		return MidiTrack;
 	} else if (str == _("Audio+MIDI Tracks")) {
 		return MixedTrack;
-	} else {
+	} else if (str == _("Audio Tracks")) {
 		return AudioTrack;
+	} else {
+		return VCAMaster;
 	}
 }
 
 void
 AddRouteDialog::maybe_update_name_template_entry ()
 {
-	if (
-		name_template_entry.get_text() != "" &&
-		name_template_entry.get_text() != _("Audio") &&
-		name_template_entry.get_text() != _("MIDI")  &&
-		name_template_entry.get_text() != _("Audio+MIDI")  &&
-		name_template_entry.get_text() != _("Bus")) {
-		return;
-	}
-
 	switch (type_wanted()) {
 	case AudioTrack:
 		name_template_entry.set_text (_("Audio"));
@@ -238,8 +246,12 @@ AddRouteDialog::maybe_update_name_template_entry ()
 		name_template_entry.set_text (_("Audio+MIDI"));
 		break;
 	case AudioBus:
+	case MidiBus:
 		name_template_entry.set_text (_("Bus"));
 		break;
+	case VCAMaster:
+		name_template_entry.set_text (VCA::default_name_template());
+		break;
 	}
 }
 
@@ -254,6 +266,9 @@ AddRouteDialog::track_type_chosen ()
 		configuration_label.set_sensitive (true);
 		mode_label.set_sensitive (true);
 		instrument_label.set_sensitive (false);
+		route_group_combo.set_sensitive (true);
+		strict_io_combo.set_sensitive (true);
+		insert_at_combo.set_sensitive (true);
 		break;
 	case MidiTrack:
 		channel_combo.set_sensitive (false);
@@ -262,9 +277,12 @@ AddRouteDialog::track_type_chosen ()
 		configuration_label.set_sensitive (false);
 		mode_label.set_sensitive (false);
 		instrument_label.set_sensitive (true);
+		route_group_combo.set_sensitive (true);
+		strict_io_combo.set_sensitive (true);
+		insert_at_combo.set_sensitive (true);
 		break;
 	case MixedTrack:
-          	{
+		{
 			MessageDialog msg (_("Audio+MIDI tracks are intended for use <b>ONLY</b> with plugins that use both audio and MIDI input data\n\n"
 					     "If you do not plan to use such a plugin, then use a normal audio or MIDI track instead."),
 					   true, MESSAGE_INFO, BUTTONS_OK, true);
@@ -277,6 +295,9 @@ AddRouteDialog::track_type_chosen ()
 		configuration_label.set_sensitive (true);
 		mode_label.set_sensitive (true);
 		instrument_label.set_sensitive (true);
+		route_group_combo.set_sensitive (true);
+		strict_io_combo.set_sensitive (true);
+		insert_at_combo.set_sensitive (true);
 		break;
 	case AudioBus:
 		mode_combo.set_sensitive (false);
@@ -285,6 +306,30 @@ AddRouteDialog::track_type_chosen ()
 		configuration_label.set_sensitive (true);
 		mode_label.set_sensitive (true);
 		instrument_label.set_sensitive (false);
+		route_group_combo.set_sensitive (true);
+		strict_io_combo.set_sensitive (true);
+		insert_at_combo.set_sensitive (true);
+		break;
+	case VCAMaster:
+		mode_combo.set_sensitive (false);
+		channel_combo.set_sensitive (false);
+		instrument_combo.set_sensitive (false);
+		configuration_label.set_sensitive (false);
+		mode_label.set_sensitive (false);
+		instrument_label.set_sensitive (false);
+		route_group_combo.set_sensitive (false);
+		strict_io_combo.set_sensitive (false);
+		insert_at_combo.set_sensitive (false);
+		break;
+	case MidiBus:
+		mode_combo.set_sensitive (false);
+		channel_combo.set_sensitive (false);
+		instrument_combo.set_sensitive (true);
+		configuration_label.set_sensitive (false);
+		mode_label.set_sensitive (true);
+		instrument_label.set_sensitive (true);
+		strict_io_combo.set_sensitive (true);
+		insert_at_combo.set_sensitive (true);
 		break;
 	}
 
@@ -306,7 +351,8 @@ AddRouteDialog::name_template_is_default() const
 	if (n == _("Audio") ||
 	    n == _("MIDI") ||
 	    n == _("Audio+MIDI") ||
-	    n == _("Bus")) {
+	    n == _("Bus") ||
+	    n == VCA::default_name_template()) {
 		return true;
 	}
 
@@ -325,11 +371,8 @@ AddRouteDialog::refill_track_modes ()
 	vector<string> s;
 
 	s.push_back (_("Normal"));
-
-	if (!ARDOUR::Profile->get_sae ()) {
-		s.push_back (_("Non Layered"));
-		s.push_back (_("Tape"));
-	}
+	s.push_back (_("Non Layered"));
+	s.push_back (_("Tape"));
 
 	set_popdown_strings (mode_combo, s);
 	mode_combo.set_active_text (s.front());
@@ -338,10 +381,6 @@ AddRouteDialog::refill_track_modes ()
 ARDOUR::TrackMode
 AddRouteDialog::mode ()
 {
-	if (ARDOUR::Profile->get_sae()) {
-		return ARDOUR::Normal;
-	}
-
 	std::string str = mode_combo.get_active_text();
 	if (str == _("Normal")) {
 		return ARDOUR::Normal;
@@ -376,6 +415,7 @@ AddRouteDialog::channels ()
 		ret.set (DataType::MIDI, 0);
 		break;
 
+	case MidiBus:
 	case MidiTrack:
 		ret.set (DataType::AUDIO, 0);
 		ret.set (DataType::MIDI, 1);
@@ -391,6 +431,8 @@ AddRouteDialog::channels ()
 		}
 		ret.set (DataType::MIDI, 1);
 		break;
+	default:
+		break;
 	}
 
 	return ret;
@@ -425,6 +467,9 @@ AddRouteDialog::refill_channel_setups ()
 	ChannelSetup chn;
 
 	route_templates.clear ();
+
+	string channel_current_choice = channel_combo.get_active_text();
+
 	channel_combo_strings.clear ();
 	channel_setups.clear ();
 
@@ -441,56 +486,59 @@ AddRouteDialog::refill_channel_setups ()
 
 	ARDOUR::find_route_templates (route_templates);
 
-	if (!ARDOUR::Profile->get_sae()) {
-		if (!route_templates.empty()) {
-			vector<string> v;
-			for (vector<TemplateInfo>::iterator x = route_templates.begin(); x != route_templates.end(); ++x) {
-				chn.name = x->name;
-				chn.channels = 0;
-				chn.template_path = x->path;
-				channel_setups.push_back (chn);
-			}
+	if (!route_templates.empty()) {
+		vector<string> v;
+		for (vector<TemplateInfo>::iterator x = route_templates.begin(); x != route_templates.end(); ++x) {
+			chn.name = x->name;
+			chn.channels = 0;
+			chn.template_path = x->path;
+			channel_setups.push_back (chn);
 		}
+	}
 
-		/* clear template path for the rest */
+	/* clear template path for the rest */
 
-		chn.template_path = "";
+	chn.template_path = "";
 
-		chn.name = _("3 Channel");
-		chn.channels = 3;
-		channel_setups.push_back (chn);
+	chn.name = _("3 Channel");
+	chn.channels = 3;
+	channel_setups.push_back (chn);
 
-		chn.name = _("4 Channel");
-		chn.channels = 4;
-		channel_setups.push_back (chn);
+	chn.name = _("4 Channel");
+	chn.channels = 4;
+	channel_setups.push_back (chn);
 
-		chn.name = _("5 Channel");
-		chn.channels = 5;
-		channel_setups.push_back (chn);
+	chn.name = _("5 Channel");
+	chn.channels = 5;
+	channel_setups.push_back (chn);
 
-		chn.name = _("6 Channel");
-		chn.channels = 6;
-		channel_setups.push_back (chn);
+	chn.name = _("6 Channel");
+	chn.channels = 6;
+	channel_setups.push_back (chn);
 
-		chn.name = _("8 Channel");
-		chn.channels = 8;
-		channel_setups.push_back (chn);
+	chn.name = _("8 Channel");
+	chn.channels = 8;
+	channel_setups.push_back (chn);
 
-		chn.name = _("12 Channel");
-		chn.channels = 12;
-		channel_setups.push_back (chn);
+	chn.name = _("12 Channel");
+	chn.channels = 12;
+	channel_setups.push_back (chn);
 
-		chn.name = _("Custom");
-		chn.channels = 0;
-		channel_setups.push_back (chn);
-	}
+	chn.name = _("Custom");
+	chn.channels = 0;
+	channel_setups.push_back (chn);
 
 	for (ChannelSetups::iterator i = channel_setups.begin(); i != channel_setups.end(); ++i) {
 		channel_combo_strings.push_back ((*i).name);
 	}
 
 	set_popdown_strings (channel_combo, channel_combo_strings);
-	channel_combo.set_active_text (channel_combo_strings.front());
+
+	if (!channel_current_choice.empty()) {
+		channel_combo.set_active_text (channel_current_choice);
+	} else {
+		channel_combo.set_active_text (channel_combo_strings.front());
+	}
 }
 
 void
@@ -509,6 +557,11 @@ AddRouteDialog::route_group ()
 	return _session->route_group_by_name (route_group_combo.get_active_text());
 }
 
+bool
+AddRouteDialog::use_strict_io() {
+	return strict_io_combo.get_active_row_number () == 1;
+}
+
 void
 AddRouteDialog::refill_route_groups ()
 {
@@ -531,19 +584,34 @@ AddRouteDialog::group_changed ()
 {
 	if (_session && route_group_combo.get_active_text () == _("New Group...")) {
 		RouteGroup* g = new RouteGroup (*_session, "");
-		RouteGroupDialog d (g, true);
-
-		if (d.do_run ()) {
-			delete g;
-			route_group_combo.set_active (2);
-		} else {
-			if (_session) {
-				_session->add_route_group (g);
-			}
-			add_route_group (g);
-			route_group_combo.set_active (3);
+		RouteGroupDialog* d = new RouteGroupDialog (g, true);
+
+		d->signal_response().connect (sigc::bind (sigc::mem_fun (*this, &AddRouteDialog::new_group_dialog_finished), d));
+		d->present();
+	}
+}
+
+void
+AddRouteDialog::new_group_dialog_finished (int r, RouteGroupDialog* d)
+{
+	if (r == RESPONSE_OK) {
+
+		if (!d->name_check()) {
+			return;
 		}
+
+		if (_session) {
+			_session->add_route_group (d->group());
+		}
+
+		add_route_group (d->group());
+		route_group_combo.set_active (3);
+	} else {
+		delete d->group ();
+		route_group_combo.set_active (2);
 	}
+
+	delete_when_idle (d);
 }
 
 AddRouteDialog::InsertAt
diff --git a/gtk2_ardour/add_route_dialog.h b/gtk2_ardour/add_route_dialog.h
index eb38338..6856220 100644
--- a/gtk2_ardour/add_route_dialog.h
+++ b/gtk2_ardour/add_route_dialog.h
@@ -42,6 +42,7 @@
 #include "instrument_selector.h"
 
 class Editor;
+class RouteGroupDialog;
 
 class AddRouteDialog : public ArdourDialog
 {
@@ -49,19 +50,21 @@ class AddRouteDialog : public ArdourDialog
 	AddRouteDialog ();
 	~AddRouteDialog ();
 
-        enum TypeWanted {
+	enum TypeWanted {
 		AudioTrack,
 		MidiTrack,
 		MixedTrack,
-		AudioBus
+		AudioBus,
+		MidiBus,
+		VCAMaster,
 	};
-        TypeWanted type_wanted() const;
+	TypeWanted type_wanted() const;
 
-        ARDOUR::ChanCount channels ();
+	ARDOUR::ChanCount channels ();
 	int count ();
 
-        std::string name_template () const;
-        bool name_template_is_default () const;
+	std::string name_template () const;
+	bool name_template_is_default () const;
 	std::string track_template ();
 	ARDOUR::PluginInfoPtr requested_instrument ();
 
@@ -74,6 +77,7 @@ class AddRouteDialog : public ArdourDialog
 		Last
 	};
 	InsertAt insert_at();
+	bool use_strict_io();
 
   private:
 	Gtk::Entry name_template_entry;
@@ -87,8 +91,8 @@ class AddRouteDialog : public ArdourDialog
 	Gtk::ComboBoxText mode_combo;
 	Gtk::ComboBoxText route_group_combo;
 	InstrumentSelector instrument_combo;
-	Gtk::Label insert_at_label;
 	Gtk::ComboBoxText insert_at_combo;
+	Gtk::ComboBoxText strict_io_combo;
 
 	std::vector<ARDOUR::TemplateInfo> route_templates;
 
@@ -104,7 +108,7 @@ class AddRouteDialog : public ArdourDialog
 	void maybe_update_name_template_entry ();
 
 	void reset_template_option_visibility ();
-
+	void new_group_dialog_finished (int, RouteGroupDialog*);
 	void on_show ();
 
 	struct ChannelSetup {
diff --git a/gtk2_ardour/add_video_dialog.cc b/gtk2_ardour/add_video_dialog.cc
index 5fc53c7..bd94c37 100644
--- a/gtk2_ardour/add_video_dialog.cc
+++ b/gtk2_ardour/add_video_dialog.cc
@@ -34,8 +34,9 @@
 #include "ardour_ui.h"
 
 #include "add_video_dialog.h"
+#include "ardour_http.h"
 #include "utils_videotl.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace Gtk;
 using namespace std;
@@ -108,7 +109,7 @@ AddVideoDialog::AddVideoDialog (Session* s)
 
 	/* file chooser */
 	chooser.set_border_width (4);
-#ifdef GTKOSX
+#ifdef __APPLE__
 	/* some broken redraw behaviour - this is a bandaid */
 	chooser.signal_selection_changed().connect (mem_fun (chooser, &Widget::queue_draw));
 #endif
@@ -504,7 +505,7 @@ AddVideoDialog::harvid_request(std::string u)
 
 	harvid_list->clear();
 
-	char *res = a3_curl_http_get(url, &status);
+	char* res = ArdourCurl::http_get (url, &status);
 	if (status != 200) {
 		printf("request failed\n"); // XXX
 		harvid_path.set_text(" - request failed -");
@@ -684,7 +685,7 @@ AddVideoDialog::request_preview(std::string u)
 		, (long long) (video_duration * seek_slider.get_value() / 1000.0)
 		, clip_width, clip_height, u.c_str());
 
-	char *data = a3_curl_http_get(url, NULL);
+	char* data = ArdourCurl::http_get (url, NULL);
 	if (!data) {
 		printf("image preview request failed %s\n", url);
 		imgbuf->fill(RGBA_TO_UINT(0,0,0,255));
diff --git a/gtk2_ardour/ambiguous_file_dialog.cc b/gtk2_ardour/ambiguous_file_dialog.cc
index 98d0eae..900ab4e 100644
--- a/gtk2_ardour/ambiguous_file_dialog.cc
+++ b/gtk2_ardour/ambiguous_file_dialog.cc
@@ -20,7 +20,7 @@
 #include <gtkmm/label.h>
 #include "pbd/compose.h"
 #include "ambiguous_file_dialog.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
diff --git a/gtk2_ardour/analysis_window.cc b/gtk2_ardour/analysis_window.cc
index 4ed17b4..a1a98a8 100644
--- a/gtk2_ardour/analysis_window.cc
+++ b/gtk2_ardour/analysis_window.cc
@@ -36,25 +36,19 @@
 #include "selection.h"
 #include "audio_region_view.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 using namespace PBD;
 
-AnalysisWindow::AnalysisWindow() :
-
-	  source_selection_label       (_("Signal source")),
-	  source_selection_ranges_rb   (_("Selected ranges")),
-	  source_selection_regions_rb  (_("Selected regions")),
-
-	  display_model_label                   (_("Display model")),
-	  display_model_composite_separate_rb   (_("Composite graphs for each track")),
-	  display_model_composite_all_tracks_rb (_("Composite graph of all tracks")),
-
-	  show_minmax_button	 (_("Show frequency power range")),
-	  show_normalized_button (_("Normalize values")),
-
-	  fft_graph (16384)
+AnalysisWindow::AnalysisWindow()
+	: source_selection_label       (_("Signal source"))
+	, source_selection_ranges_rb   (_("Selected ranges"))
+	, source_selection_regions_rb  (_("Selected regions"))
+	, show_minmax_button	 (_("Show frequency power range"))
+	, show_normalized_button (_("Fit dB range"))
+	, show_proportional_button (_("Proportional Spectrum, -18dB"))
+	, fft_graph (16384)
 {
 	set_name(_("FFT analysis window"));
 	set_title (_("Spectral Analysis"));
@@ -107,49 +101,31 @@ AnalysisWindow::AnalysisWindow() :
 				sigc::bind ( sigc::mem_fun(*this, &AnalysisWindow::source_selection_changed), &source_selection_regions_rb));
 	}
 
-	vbox.pack_start(hseparator1, false, false);
-
-	// "Display model"
-	vbox.pack_start(display_model_label, false, false);
-	{
-		Gtk::RadioButtonGroup group = display_model_composite_separate_rb.get_group();
-		display_model_composite_all_tracks_rb.set_group (group);
-
-		display_model_composite_separate_rb.set_active();
-
-		vbox.pack_start (display_model_composite_separate_rb,   false, false);
-		vbox.pack_start (display_model_composite_all_tracks_rb, false, false);
-
-		// "Composite graphs for all tracks"
-		display_model_composite_separate_rb.signal_toggled().connect (
-				sigc::bind ( sigc::mem_fun(*this, &AnalysisWindow::display_model_changed), &display_model_composite_separate_rb));
-
-		// "Composite graph of all tracks"
-		display_model_composite_all_tracks_rb.signal_toggled().connect (
-				sigc::bind ( sigc::mem_fun(*this, &AnalysisWindow::display_model_changed), &display_model_composite_all_tracks_rb));
-	}
-
 	// Analyze button
 
 	refresh_button.set_name("EditorGTKButton");
 	refresh_button.set_label(_("Re-analyze data"));
 
+
 	refresh_button.signal_clicked().connect ( sigc::bind ( sigc::mem_fun(*this, &AnalysisWindow::analyze_data), &refresh_button));
 
 	vbox.pack_start(refresh_button, false, false, 10);
 
+	vbox.pack_start(hseparator1, false, false);
 
 	// Feature checkboxes
 
-	// minmax
-	show_minmax_button.signal_toggled().connect( sigc::mem_fun(*this, &AnalysisWindow::show_minmax_changed));
-	vbox.pack_start(show_minmax_button, false, false);
-
-	// normalize
+	// normalize, fit y-range
 	show_normalized_button.signal_toggled().connect( sigc::mem_fun(*this, &AnalysisWindow::show_normalized_changed));
 	vbox.pack_start(show_normalized_button, false, false);
 
+	// minmax
+	show_minmax_button.signal_toggled().connect( sigc::mem_fun(*this, &AnalysisWindow::show_minmax_changed));
+	vbox.pack_start(show_minmax_button, false, false);
 
+	// pink-noise / proportional spectrum
+	show_proportional_button.signal_toggled().connect( sigc::mem_fun(*this, &AnalysisWindow::show_proportional_changed));
+	vbox.pack_start(show_proportional_button, false, false);
 
 
 
@@ -186,6 +162,12 @@ AnalysisWindow::show_normalized_changed()
 }
 
 void
+AnalysisWindow::show_proportional_changed()
+{
+	fft_graph.set_show_proportioanl(show_proportional_button.get_active());
+}
+
+void
 AnalysisWindow::set_rangemode()
 {
 	source_selection_ranges_rb.set_active(true);
@@ -273,7 +255,7 @@ AnalysisWindow::analyze_data (Gtk::Button * /*button*/)
 
 				// std::cerr << "Analyzing ranges on track " << rui->route()->name() << std::endl;
 
-				FFTResult *res = fft_graph.prepareResult(rui->color(), rui->route()->name());
+				FFTResult *res = fft_graph.prepareResult(rui->route_color(), rui->route()->name());
 				for (std::list<AudioRange>::iterator j = ts.begin(); j != ts.end(); ++j) {
 
 					int n;
@@ -308,7 +290,7 @@ AnalysisWindow::analyze_data (Gtk::Button * /*button*/)
 				Gtk::TreeModel::Row newrow = *(tlmodel)->append();
 				newrow[tlcols.trackname]   = rui->route()->name();
 				newrow[tlcols.visible]     = true;
-				newrow[tlcols.color]       = rui->color();
+				newrow[tlcols.color]       = rui->route_color ();
 				newrow[tlcols.graph]       = res;
 			}
 		} else if (source_selection_regions_rb.get_active()) {
diff --git a/gtk2_ardour/analysis_window.h b/gtk2_ardour/analysis_window.h
index af540b9..cee37b3 100644
--- a/gtk2_ardour/analysis_window.h
+++ b/gtk2_ardour/analysis_window.h
@@ -46,7 +46,6 @@ namespace ARDOUR {
 	class Session;
 }
 
-
 class AnalysisWindow : public Gtk::Window, public ARDOUR::SessionHandlePtr
 {
 public:
@@ -65,10 +64,12 @@ private:
 
 	void source_selection_changed (Gtk::RadioButton *);
 	void display_model_changed    (Gtk::RadioButton *);
-	void show_minmax_changed	();
-	void show_normalized_changed	();
 
-	void analyze_data				(Gtk::Button *);
+	void show_minmax_changed ();
+	void show_normalized_changed ();
+	void show_proportional_changed ();
+
+	void analyze_data (Gtk::Button *);
 
 	struct TrackListColumns : public Gtk::TreeModel::ColumnRecord {
 		public:
@@ -95,22 +96,16 @@ private:
 
 	Gtk::Label source_selection_label;
 
-
 	Gtk::RadioButton source_selection_ranges_rb;
 	Gtk::RadioButton source_selection_regions_rb;
 
 	Gtk::HSeparator hseparator1;
 
-	Gtk::Label display_model_label;
-	Gtk::RadioButton display_model_composite_separate_rb;
-	Gtk::RadioButton display_model_composite_all_tracks_rb;
-
 	Gtk::Button refresh_button;
 
-
 	Gtk::CheckButton show_minmax_button;
 	Gtk::CheckButton show_normalized_button;
-
+	Gtk::CheckButton show_proportional_button;
 
 	// The graph
 	FFTGraph fft_graph;
diff --git a/gtk2_ardour/appdata/po/zh.po b/gtk2_ardour/appdata/po/zh.po
new file mode 100644
index 0000000..2df3f2f
--- /dev/null
+++ b/gtk2_ardour/appdata/po/zh.po
@@ -0,0 +1,53 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: Ardour 4\n"
+"POT-Creation-Date: 2015-11-06 11:59+0100\n"
+"PO-Revision-Date: 2016-03-07 09:55+0800\n"
+"Last-Translator: 一善鱼 <YQ-YSY at 163.com>\n"
+"Language-Team: 一善鱼 YQ-YSY at 163.com\n"
+"Language: zh\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 1.8.4\n"
+"X-Poedit-SourceCharset: UTF-8\n"
+
+# Intentionally left untranslated.
+#. (itstool) path: component/name
+#: /home/nils/src/ardour/gtk2_ardour/ardour.appdata.xml.in.in:6
+msgid "Ardour"
+msgstr ""
+
+# Intentionally left untranslated.
+#. (itstool) path: component/summary
+#: /home/nils/src/ardour/gtk2_ardour/ardour.appdata.xml.in.in:8
+msgid "Digital Audio Workstation"
+msgstr "数字音频工作站"
+
+#. (itstool) path: description/p
+#: /home/nils/src/ardour/gtk2_ardour/ardour.appdata.xml.in.in:10
+msgid ""
+"Ardour is a multi-channel digital audio workstation, allowing you to record, "
+"edit, mix and master audio and MIDI projects."
+msgstr ""
+"Ardour 是一个多声道数字音频工作站,允许您录制,编辑,混音并且主控音频和 MIDI "
+"项目。"
+
+#. (itstool) path: description/p
+#: /home/nils/src/ardour/gtk2_ardour/ardour.appdata.xml.in.in:14
+msgid ""
+"It is targeted at audio engineers, musicians, soundtrack editors and "
+"composers."
+msgstr "它的应用人群针对的是音频工程师、乐师、声音轨道编辑师和作曲家。"
+
+#. (itstool) path: screenshot/caption
+#: /home/nils/src/ardour/gtk2_ardour/ardour.appdata.xml.in.in:23
+msgid ""
+"The Editor window where you can arrange audio and MIDI data along a timeline"
+msgstr "编辑器窗口是您可以沿着时间线排列音频和 MIDI 数据的地方"
+
+#. (itstool) path: screenshot/caption
+#: /home/nils/src/ardour/gtk2_ardour/ardour.appdata.xml.in.in:27
+msgid "The Mixer window which includes channel strips for each track and bus"
+msgstr "混音器窗口包括有每个音轨和总线的声道工具栏"
diff --git a/gtk2_ardour/ardbg-core b/gtk2_ardour/ardbg-core
new file mode 100755
index 0000000..d7c949d
--- /dev/null
+++ b/gtk2_ardour/ardbg-core
@@ -0,0 +1,14 @@
+#!/bin/sh
+COREFILE=core
+TOP=`dirname "$0"`/..
+. $TOP/build/gtk2_ardour/ardev_common_waf.sh
+LD_LIBRARY_PATH=$LD_LIBRARY_PATH
+export ARDOUR_INSIDE_GDB=1
+
+if test -n "`which gdb`"; then
+	exec gdb --core $COREFILE --args $TOP/$EXECUTABLE $@
+fi
+if test -n "`which lldb`"; then
+	exec lldb -c $COREFILE -- $TOP/$EXECUTABLE $@
+fi
+echo "neither gdb nor lldb was found."
diff --git a/gtk2_ardour/ardev_common.sh.in b/gtk2_ardour/ardev_common.sh.in
index e3161e0..7c6e050 100644
--- a/gtk2_ardour/ardev_common.sh.in
+++ b/gtk2_ardour/ardev_common.sh.in
@@ -10,12 +10,12 @@ libs=$TOP/@LIBS@
 # can find all the components.
 #
 
-export ARDOUR_PATH=$TOP/gtk2_ardour/icons:$TOP/gtk2_ardour/pixmaps:$TOP/build/gtk2_ardour:$TOP/gtk2_ardour:.
 export ARDOUR_SURFACES_PATH=$libs/surfaces/osc:$libs/surfaces/faderport:$libs/surfaces/generic_midi:$libs/surfaces/tranzport:$libs/surfaces/powermate:$libs/surfaces/mackie:$libs/surfaces/wiimote
 export ARDOUR_PANNER_PATH=$libs/panners
 export ARDOUR_DATA_PATH=$TOP:$TOP/build:$TOP/gtk2_ardour:$TOP/build/gtk2_ardour:.
 export ARDOUR_MIDIMAPS_PATH=$TOP/midi_maps:.
 export ARDOUR_EXPORT_FORMATS_PATH=$TOP/export:.
+export ARDOUR_THEMES_PATH=$TOP/gtk2_ardour/themes:.
 export ARDOUR_BACKEND_PATH=$libs/backends/jack:$libs/backends/wavesaudio:$libs/backends/dummy:$libs/backends/alsa:$libs/backends/coreaudio:$libs/backends/portaudio:$libs/backends/asio
 export ARDOUR_TEST_PATH=$TOP/libs/ardour/test/data
 export PBD_TEST_PATH=$TOP/libs/pbd/test
diff --git a/gtk2_ardour/ardour.keys.in b/gtk2_ardour/ardour.keys.in
new file mode 100644
index 0000000..f4312e5
--- /dev/null
+++ b/gtk2_ardour/ardour.keys.in
@@ -0,0 +1,409 @@
+; this is a template file processed by tools/fmt-bindings to generate either 
+; a gtk accelmap file or a LaTeX key binding cheat sheet.
+;
+; it is the reference for any bindings or cheatsheets
+;
+;
+; FORMAT:
+; $text -> defines cheatsheet title as "text", which may contain LaTeX markup
+;
+; %group owner text -> defines a binding group called "group" which will have the title "text" on the cheatsheet. 
+;                may be followed by zero or more lines of descriptive text,
+;                which may contain LaTeX markup. When generating native ardour
+;                bindings, the definition for a binding in group "group" will
+;                be placed in the "owner" block of the bindings file. The
+;                "owner" field is otherwise ignored.
+;
+;                If the group name starts with "-", the binding will not appear
+;                on the cheetsheet.
+;
+; @group|action|binding|description -> defines an action+binding with description, as a member of a binding group
+;                                       if group starts with '-' it will not be printed in the cheatsheet.
+;                                       if group starts with '+' it will be printed in the cheatsheet no matter what
+;                                       if the group is a mouse binding group, action should contain a ':', and
+;                                            have the binding before the colon, and the target area after it
+
+;; Title
+$ARDOUR Shortcuts \linebreak Mnemonic US-Keypad
+
+;; GROUP DEFINITIONS
+
+%trans Global Transport \& Recording Control
+
+%sess Global Session \& File Handling
+
+%edit Editor Basic Editing
+
+%vis Editor Changing What's Visible
+
+%wvis Global Window Visibility
+
+%eep Editor Editing with Edit Point
+Most edit functions operate on a single "Edit Point". The edit point can be any of: playhead (default), the mouse or an active marker. The choice of Edit Point (by default) also sets the Zoom Focus.
+
+%aep Editor Aligning with the Edit Point
+Align operations move regions so that their start/end/sync point is at the edit point. "Relative" operations
+just align the first region and moves other selected regions to maintain relative positioning.
+
+%epp Editor Edit Point Playback
+
+%movp Editor Moving the Playhead
+A left click in the rulers positions the playhead unless Ardour is recording. You can use {\tt KP$\_$n} to move the 
+playhead to the n-th marker.
+
+%rop Editor Region Operations
+
+%edit Editor Edit Range
+There are only a few functions that refer to an "Edit Range". The current edit range is defined using combinations of the possible edit points: Playhead, Marker or Mouse.\par
+\begin{tabular}{lll}
+{\bf Edit Point} & {\bf Active Mark?} & {\bf Edit Range} \\
+Playhead & no & from Playhead to Mouse \\
+Playhead & yes & from Playhead to Active Marker \\
+ & & \\
+Mouse & no & from Mouse to Playhead \\
+Mouse & yes & from Mouse to Active Marker \\
+ & & \\
+Marker & no & {\it No edit range defined} \\
+Marker & yes & from Active Marker to Mouse
+\end{tabular}
+
+%select Editor Selecting
+
+%ranges Editor Defining Loop, Punch Range and Tempo Changes
+
+%markers Editor Markers \& Locations
+The "move" commands all move the active marker(s). Jump to the first 9 markers using
+the keypad digits 1-9 (requires numlock).
+
+%mmode Editor Mouse Modes
+
+%mouse Editor Mouse Usage
+Right click on most objects and controls displays a context menu
+Shift+Right click deletes most objects. 
+OS X users without a 3 button mouse can use {\tt Option+Ctrl+Left} to simulate "Middle" for some purposes.
+Use F1 to step through mouse modes.
+
+%mobject Editor Mouse Object Mode
+This mode provides many different operations on both regions and control points, partially depending on where you click/drag with the mouse. The "body" of a region is the area where the waveform is displayed.
+
+%mzoom Editor Mouse Zoom Mode
+%mops Editor Mouse Ops on Solo/Mute/Rec-enable
+%mopsolo Editor Mouse Ops on Solo Buttons only
+%mopsfader Editor Mouse Ops on Faders \& Plugin Controls
+
+%midi Global MIDI specific commands
+
+;; END GROUP DEFINITIONS
+
+;; punctuation
+
+ at vis|Editor/temporal-zoom-in|equal|zoom in
+ at vis|Editor/temporal-zoom-out|minus|zoom out
+ at vis|Editor/zoom-to-session|<@TERTIARY@>underscore|zoom to session
+ at eep|Editor/edit-cursor-to-previous-region-sync|apostrophe|EP to prev region sync
+ at eep|Editor/edit-cursor-to-next-region-sync|semicolon|EP to next region sync
+ at eep|Editor/cycle-edit-point|grave|next EP w/o marker
+ at eep|Editor/cycle-edit-point-with-marker|<@PRIMARY@>grave|next EP w/marker
+
+ at trans|Transport/ToggleRoll|space|toggle roll
+ at trans|Transport/PlaySelection|<@SECONDARY@>space|play edit range
+ at epp|Editor/play-from-edit-point-and-return|<@PRIMARY@><@TERTIARY@>space|play from EP \& return
+ at trans|Transport/ToggleRollMaybe|<@PRIMARY@><@SECONDARY@>space|stop (keep loop/range play)
+ at trans|Transport/ToggleRollForgetCapture|<@PRIMARY@>space|stop and destroy
+ at trans|Transport/record-roll|<@TERTIARY@>space|start recording
+
+ at edit|Editor/add-location-from-playhead|Tab|add marker
+ at edit|Editor/remove-location-from-playhead|<@PRIMARY@>nabla|add marker
+ at trans|Transport/alternate-GotoStart|Return|to start marker
+
+ at edit|Editor/editor-fade-range|slash|fade range selection
+ at rop|Region/set-fade-in-length|<@PRIMARY@>slash|set fade in length
+;;@rop|Region/toggle-region-fade-out|<@PRIMARY@>slash|toggle fade in active
+ at rop|Region/set-fade-out-length|<@PRIMARY@>backslash|set fade out length
+;;@rop|Region/toggle-region-fade-out|<@PRIMARY@>backslash|toggle fade out active
+
+ at eep|Region/trim-to-previous-region|<@PRIMARY@>j|trim region to end of prev region
+ at eep|Region/trim-to-next-region|<@PRIMARY@>k|trim region to start of next region
+
+ at ranges|Editor/set-loop-from-edit-range|bracketright|set loop range from edit range
+
+ at ranges|Editor/set-punch-from-edit-range|bracketleft|set punch range from edit range
+
+
+;; Alt+number row:  region operations
+ at rop|Region/toggle-region-mute|<@SECONDARY@>1|mute/unmute
+ at rop|Region/naturalize-region|<@SECONDARY@>2|move to original position
+ at rop|Region/normalize-region|<@SECONDARY@>3|normalize
+ at rop|Region/reverse-region|<@SECONDARY@>4|reverse
+ at rop|Region/quantize-region|<@SECONDARY@>5|quantize MIDI notes \linebreak[4] in selected region(s)
+ at rop|Region/boost-region-gain|<@SECONDARY@>6|increase region gain
+ at rop|Region/cut-region-gain|<@SECONDARY@>7|reduce region gain
+ at rop|Region/pitch-shift-region|<@SECONDARY@>8|transpose
+ at rop|Region/lower-region|<@SECONDARY@>9|lower region layer
+ at rop|Region/raise-region|<@SECONDARY@>0|raise region layer
+
+;; letters
+;; TOP ROW
+
+ at sess|Common/Quit|<@PRIMARY@>q|quit
+ at sess|Common/Hide|<@PRIMARY@>h|hide
+ at movp|Editor/jump-forward-to-mark|w|to next mark
+ at movp|Editor/jump-backward-to-mark|q|to previous mark
+
+;; note that ctrl-w is special and consumed by the keyboard snooper
+
+ at select|Editor/select-all-before-edit-cursor|<@PRIMARY@>e|select all before EP
+ at rop|Region/export-region|<@PRIMARY@><@SECONDARY@>e|export selected region(s)
+ at sess|Main/ExportAudio|<@SECONDARY@>e|export session
+ at select|Editor/select-all-after-edit-cursor|<@PRIMARY@><@TERTIARY@>e|select all after EP
+ at vis|Editor/show-editor-mixer|<@TERTIARY@>e|toggle editor window mixer
+ at mmode|MouseMode/set-mouse-mode-range|r|range mode
+ at edit|Editor/redo|<@PRIMARY@>r|redo
+ at trans|Transport/Record|<@TERTIARY@>r|engage record
+ at mmode|MouseMode/set-mouse-mode-timefx|t|timefx mode
+ at eep|Editor/select-all-tracks|<@PRIMARY@>t|select all tracks
+ at mmode|MouseMode/set-mouse-mode-object-range|y|link object/range tools
+ at edit|Editor/alternate-redo|<@PRIMARY@>y|redo
+ at select|Editor/select-all-between-cursors|<@PRIMARY@>u|all enclosed by edit range
+ at select|Editor/select-all-within-cursors|u|all present in edit range
+ at eep|Region/insert-region-from-region-list|i|insert from region list
+ at select|Editor/invert-selection|<@TERTIARY@>i|invert selection
+ at edit|Editor/addExistingAudioFiles|<@PRIMARY@>i|import audio files
+ at edit|Editor/toggle-midi-input-active|<@SECONDARY@>i|toggle sel. track MIDI input
+ at mmode|MouseMode/set-mouse-mode-object|g|object mode
+ at mmode|MouseMode/set-mouse-mode-content|e|content mode
+ at sess|Main/Open|<@PRIMARY@>o|open an existing session
+ at sess|Main/Recent|<@PRIMARY@><@TERTIARY@>o|open a recent session
+ at wvis|Window/toggle-session-options-editor|<@SECONDARY@>o|toggle preferences dialog
+ at edit|Editor/set-playhead|p|set playhead position
+ at wvis|Window/toggle-audio-connection-manager|<@SECONDARY@>p|toggle global audio patchbay
+ at midi|MIDI/panic|<@PRIMARY@><@SECONDARY@>p|MIDI panic (stop all notes etc)
+
+;; MIDDLE ROW
+
+ at aep|Region/align-regions-sync-relative|a|align sync points (relative)
+ at select|Editor/select-all-objects|<@PRIMARY@>a|select all objects
+ at aep|Region/align-regions-end|<@SECONDARY@>a|align end(s)
+ at aep|Region/align-regions-sync|<@TERTIARY@>a|align sync points
+ at aep|Region/align-regions-start|<@PRIMARY@><@SECONDARY@>a|align start(s)
+ at aep|Region/align-regions-start-relative|<@PRIMARY@><@TERTIARY@>a|align start(s) relative
+ at rop|Region/split-region|s|split
+ at sess|Common/Save|<@PRIMARY@>s|save session
+ at sess|Main/SnapshotStay|<@PRIMARY@><@TERTIARY@>s|snapshot session
+ at edit|Editor/track-solo-toggle|<@SECONDARY@>s|toggle track solo status
+ at mmode|MouseMode/set-mouse-mode-draw|d|note-draw mode
+ at rop|Region/duplicate-region|<@SECONDARY@>d|duplicate region (once)
+ at rop|Region/multi-duplicate-region|<@TERTIARY@>d|duplicate region (multi)
+ at select|Editor/select-all-in-punch-range|<@PRIMARY@>d|select all in punch range
+ at vis|Editor/fit-selection|f|fit selection vertically
+ at edit|Editor/toggle-follow-playhead|<@PRIMARY@>f|toggle playhead tracking
+ at edit|Region/show-rhythm-ferret|<@SECONDARY@>f|show rhythm ferret window 
+ at trans|Transport/ToggleFollowEdits|<@TERTIARY@>f|toggle playhead follows edits
+ at wvis|Common/ToggleMaximalEditor|<@PRIMARY@><@SECONDARY@>f|maximise editor space
+ at wvis|Common/ToggleMaximalMixer|<@PRIMARY@><@TERTIARY@>f|maximise mixer space
+ at epp|Region/play-selected-regions|h|play selected region(s)
+ at eep|Region/trim-front|j|trim front
+ at eep|Region/trim-back|k|trim back
+ at wvis|Window/toggle-key-editor|<@SECONDARY@>k|toggle key bindings editor
+ at trans|Transport/Loop|l|loop play (the loop range)
+ at select|Editor/select-all-in-loop-range|<@PRIMARY@>l|select all in loop range
+ at wvis|Window/toggle-locations|<@SECONDARY@>l| toggle locations dialog
+
+;; BOTTOM ROW
+
+ at mmode|Editor/zoom-to-selection|z|zoom to selection
+ at edit|Editor/undo|<@PRIMARY@>z|undo
+ at edit|Editor/alternate-alternate-redo|<@PRIMARY@><@TERTIARY@>z|redo
+ at vis|Editor/toggle-zoom|<@TERTIARY@>z|toggle last 2 zoom states
+ at mmode|MouseMode/set-mouse-mode-cut|c|cut mode
+ at edit|Editor/editor-cut|<@PRIMARY@>x|cut
+ at edit|Editor/editor-copy|<@PRIMARY@>c|copy
+ at wvis|Window/toggle-big-clock|<@SECONDARY@>c|toggle big clock
+ at -edit|Editor/crop|<@PRIMARY@><@TERTIARY@>c|crop
+ at rop|Region/set-region-sync-position|v|set region sync point
+ at edit|Editor/editor-paste|<@PRIMARY@>v|paste
+ at edit|Editor/ToggleJadeo|<@SECONDARY@>v|video window
+ at wvis|Common/toggle-meterbridge|<@SECONDARY@>b|show meter bridge
+ at edit|Editor/track-record-enable-toggle|<@TERTIARY@>b|toggle track rec-enable 
+ at sess|Main/AddTrackBus|<@PRIMARY@><@TERTIARY@>n|add track(s) or bus(ses)
+ at sess|Main/New|<@PRIMARY@>n|open a new session
+ at wvis|Window/toggle-midi-connection-manager|<@SECONDARY@><@TERTIARY@>m|toggle global midi patchbay
+ at wvis|Common/toggle-editor-and-mixer|<@SECONDARY@>m|toggle editor & mixer
+
+;; arrow keys, navigation etc.
+
+ at vis|Editor/step-tracks-up|Up|scroll up (step)
+ at trans|Transport/TransitionToRoll|<@TERTIARY@>Up|transition to roll
+ at select|Editor/select-prev-route|<@SECONDARY@>Up|select previous track/bus
+ at vis|Editor/move-selected-tracks-up|<@PRIMARY@>Up|move selected tracks up
+
+ at vis|Editor/step-tracks-down|Down|scroll down (step)
+ at trans|Transport/TransitionToReverse|<@TERTIARY@>Down|transition to reverse
+ at select|Editor/select-next-route|<@SECONDARY@>Down|select next track/bus
+ at vis|Editor/move-selected-tracks-down|<@PRIMARY@>Down|move selected tracks down
+
+ at movp|Editor/playhead-to-previous-region-boundary|Left|to previous region edge
+;@movp|Editor/playhead-to-previous-region-boundary-noselection|<@LEVEL4@>Left|to previous edge \linebreak[4] (ignoring selection)
+ at movp|Editor/playhead-to-previous-region-sync|<@PRIMARY@><@SECONDARY@>Left|to previous region sync
+ at movp|Editor/tab-to-transient-backwards|<@PRIMARY@>Left|to previous transient
+ at movp|Editor/nudge-playhead-backward|<@SECONDARY@>Left|nudge backward
+ at movp|Editor/playhead-backward-to-grid|<@SECONDARY@><@TERTIARY@>Left|to previous grid point
+ at trans|Transport/Rewind|<@TERTIARY@>Left|rewind
+ at markers|Editor/selected-marker-to-previous-region-boundary|<@PRIMARY@><@TERTIARY@>Left|move to prev region edge
+
+ at movp|Editor/playhead-to-next-region-boundary|Right|to next region edge
+;@movp|Editor/playhead-to-next-region-boundary-noselection|<@LEVEL4@>Right|to next region edge \linebreak[4] (ignoring selection)
+ at movp|Editor/playhead-to-next-region-sync|<@PRIMARY@><@SECONDARY@>Right|to next region sync
+ at movp|Editor/tab-to-transient-forwards|<@PRIMARY@>Right|to next transient
+ at movp|Editor/nudge-playhead-forward|<@SECONDARY@>Right|nudge forwards
+ at movp|Editor/playhead-forward-to-grid|<@SECONDARY@><@TERTIARY@>Right|to next grid point
+ at trans|Transport/Forward|<@TERTIARY@>Right|fast forward
+ at markers|Editor/selected-marker-to-next-region-boundary|<@PRIMARY@><@TERTIARY@>Right|move to next region edge
+
+ at wvis|Common/next-tab|<@PRIMARY@>Page_Down|next tab
+ at wvis|Common/previous-tab|<@PRIMARY@>Page_Up|previous tab
+ at vis|Editor/scroll-tracks-down|Page_Down|scroll down (page)
+ at vis|Editor/scroll-tracks-up|Page_Up|scroll up (page)
+ at trans|Transport/GotoStart|Home|to start marker
+ at trans|Transport/GotoEnd|End|to end marker
+ at edit|Editor/editor-delete|Delete|delete
+ at edit|Editor/alternate-editor-delete|BackSpace|backspace (delete)
+
+;; this one is super-global, so we put it in the session group but don't show
+;; it on cheat sheets etc.
+ at -sess|Main/Escape|Escape|break drag or deselect all
+
+;; keypad
+
+ at rop|Region/nudge-backward|KP_Subtract|nudge backward
+ at -edit|Editor/nudge-next-backward|<@PRIMARY@>KP_Subtract|some text
+
+ at movp|Editor/alternate-jump-forward-to-mark|<@PRIMARY@>KP_Right|to next mark
+ at movp|Editor/alternate-jump-backward-to-mark|<@PRIMARY@>KP_Left|to previous mark
+
+ at rop|Region/nudge-forward|KP_Add|nudge forward
+ at -edit|Editor/nudge-next-forward|<@PRIMARY@>KP_Add|some text
+
+ at -edit|Editor/start-range|comma|some text
+ at -edit|Editor/finish-range|period|some text
+ at -edit|Editor/alt-start-range|<@PRIMARY@>KP_Down|set the start of the range selection
+ at -edit|Editor/alt-finish-range|<@PRIMARY@>KP_Up|set the end of the range selection
+ at -edit|Editor/start-punch-range|<@PRIMARY@>comma|set the start of the Punch range
+ at -edit|Editor/finish-punch-range|<@PRIMARY@>period|set the end of the Punch range
+ at -edit|Editor/start-loop-range|<@SECONDARY@>comma|set the start of the Loop range
+ at -edit|Editor/finish-loop-range|<@SECONDARY@>period|set the end of the Loop range
+
+ at markers|Editor/alternate-add-location-from-playhead|KP_Enter|add mark at playhead
+ at markers|Editor/alternate-remove-location-from-playhead|<@PRIMARY@>KP_Enter|add mark at playhead
+ at wvis|Transport/focus-on-clock|KP_Divide|focus on main clock
+
+ at trans|Transport/numpad-decimal|KP_Decimal|numpad decimal should initiate and finalize a locate-to-marker
+ at trans|Transport/alternate-numpad-decimal|KP_Separator|(some keybd layouts have separator instead of decimal)
+
+ at trans|Transport/numpad-0|KP_0|some text
+ at -trans|Transport/numpad-1|KP_1|some text
+ at -trans|Transport/numpad-2|KP_2|some text
+ at -trans|Transport/numpad-3|KP_3|some text
+ at -trans|Transport/numpad-4|KP_4|some text
+ at -trans|Transport/numpad-5|KP_5|some text
+ at -trans|Transport/numpad-6|KP_6|some text
+ at -trans|Transport/numpad-7|KP_7|some text
+ at -trans|Transport/numpad-8|KP_8|some text
+ at -trans|Transport/numpad-9|KP_9|some text
+
+;; F-N keys
+
+ at -edit|Editor/edit-cursor-to-range-start|F1|some text
+ at -edit|Editor/edit-cursor-to-range-end|F2|some text
+
+ at -edit|Editor/save-visual-state-1|<@PRIMARY@>F1|some text
+ at -edit|Editor/save-visual-state-2|<@PRIMARY@>F2|some text
+ at -edit|Editor/save-visual-state-3|<@PRIMARY@>F3|some text
+ at -edit|Editor/save-visual-state-4|<@PRIMARY@>F4|some text
+ at -edit|Editor/save-visual-state-5|<@PRIMARY@>F5|some text
+ at -edit|Editor/save-visual-state-6|<@PRIMARY@>F6|some text
+ at -edit|Editor/save-visual-state-7|<@PRIMARY@>F7|some text
+ at -edit|Editor/save-visual-state-8|<@PRIMARY@>F8|some text
+ at -edit|Editor/save-visual-state-9|<@PRIMARY@>F9|some text
+ at -edit|Editor/save-visual-state-10|<@PRIMARY@>F10|some text
+ at -edit|Editor/save-visual-state-11|<@PRIMARY@>F11|some text
+ at -edit|Editor/save-visual-state-12|<@PRIMARY@>F12|some text
+
+ at -edit|Editor/goto-visual-state-1|F1|some text
+ at -edit|Editor/goto-visual-state-2|F2|some text
+ at -edit|Editor/goto-visual-state-3|F3|some text
+ at -edit|Editor/goto-visual-state-4|F4|some text
+ at -edit|Editor/goto-visual-state-5|F5|some text
+ at -edit|Editor/goto-visual-state-6|F6|some text
+ at -edit|Editor/goto-visual-state-7|F7|some text
+ at -edit|Editor/goto-visual-state-8|F8|some text
+ at -edit|Editor/goto-visual-state-9|F9|some text
+ at -edit|Editor/goto-visual-state-10|F10|some text
+ at -edit|Editor/goto-visual-state-11|F11|some text
+ at -edit|Editor/goto-visual-state-12|F12|some text
+
+
+;; numbers
+
+ at eep|Editor/cycle-zoom-focus|1|cycle to next zoom focus
+ at eep|Editor/cycle-snap-mode|2|cycle to next grid snap mode
+ at eep|Editor/prev-snap-choice|3|use next grid unit
+ at eep|Editor/prev-snap-choice-music-only|<@PRIMARY@>3|use previous grid unit
+ at eep|Editor/next-snap-choice|4|use next grid unit
+ at eep|Editor/next-snap-choice-music-only|<@PRIMARY@>4|use next musical grid unit
+ at trans|Transport/ToggleAutoPlay|5|toggle auto play
+ at trans|Transport/ToggleAutoReturn|6|toggle auto return
+ at trans|Transport/ToggleClick|7|toggle click (metronome)
+ at ranges|Region/set-tempo-from-region|9|set tempo (1 bar) from region(s)
+ at ranges|Editor/set-tempo-from-edit-range|0|set tempo (1 bar) from edit range
+
+; mouse stuff
+
+ at +mobject|foo|left-click:on body|select
+ at +mobject|foo|<@TERTIARY@>left-click:on body|extend selection
+ at +mobject|foo|<@PRIMARY@>left-click:on body|add/remove selection
+ at +mobject|foo|left-drag:on body|move region(s)
+ at +mobject|foo|<@PRIMARY@>left-drag:on body|copy+move region(s)
+ at +mobject|foo|<@PRIMARY@>middle-drag:on body|fixed time copy+move
+ at +mobject|foo|middle-drag:on body|fixed time move
+ at +mobject|foo|<@SECONDARY@><@TERTIARY@>midde:on body|lower region
+ at +mobject|foo|<@TERTIARY@>middle:on body|raise region
+ at +mobject|foo|<@PRIMARY@>left-drag:in trim bar|slip audio in region
+ at +mobject|foo|left-click:in trim bar|set region start
+ at +mobject|foo|middle:in trim bar|set region end
+ at +mobject|foo|left-drag:near ends of trim bar|adjust region edges
+ at +mobject|foo|left-click:in auto track|add control point
+ at +mobject|foo|left-drag:on point|move control point
+ at +mobject|foo|middle-drag:on point|fixed time adjust
+ at +mobject|foo|<@PRIMARY@>left-drag:on point|move point+later points
+ at +mobject|foo|<@PRIMARY@>middle-drag:on point|fixed time move
+ at +mobject|foo|left-drag:on line|move line segment
+ at +mobject|foo|<@PRIMARY@><@SECONDARY@>left-drag:on regions|rubber-band select
+ at +mobject|foo|left-drag:in auto track|rubber-band select\linebreak control points
+ at +mobject|foo|left-drag:empty space|rubber-band select
+
+; mouse zoom
+ at +mzoom|foo|<@PRIMARY@>middle|zoom to session
+ at +mzoom|foo|middle-click|zoom out
+ at +mzoom|foo|left-click|zoom in
+ at +mzoom|foo|left+drag |define the new visible area
+
+; mouse solo etc.
+ at +mops|foo|<@PRIMARY@>middle-click|learn MIDI control
+ at +mops|foo|<@PRIMARY@><@TERTIARY@>left-click|apply to all tracks/busses
+ at +mops|foo|<@PRIMARY@>left-click|apply to group
+ at +mops|foo|middle-click|momentary switch
+ at +mops|foo|left-click|apply to track or active group
+
+; mouse solo
+
+ at +mopsolo|foo|<@PRIMARY@><@SECONDARY@>left-click|exclusive solo
+ at +mopsolo|foo|<@TERTIARY@>left-click|temporary latched solo
+
+; mouse fader etc.
+
+ at +mopsfader|foo|<@PRIMARY@>middle-click|learn MIDI control
+ at +mopsfader|foo|<@TERTIARY@>left-click|reset to default
+ at +mopsfader|foo|<@PRIMARY@><@SECONDARY@>left-drag|finest-drag control
+ at +mopsfader|foo|<@PRIMARY@>left-drag|fine-drag control
+ at +mopsfader|foo|left-drag|adjust
diff --git a/gtk2_ardour/ardour.menus.in b/gtk2_ardour/ardour.menus.in
index 411b262..d8ea6eb 100644
--- a/gtk2_ardour/ardour.menus.in
+++ b/gtk2_ardour/ardour.menus.in
@@ -8,7 +8,7 @@
       <separator/>
       <menuitem action='Save'/>
       <menuitem action='SaveAs'/>
-#ifndef WINDOWS // can't move open files.
+#ifndef WINDOWS /* can't move open files. */
       <menuitem action='Rename'/>
       <menuitem action='SnapshotStay'/>
       <menuitem action='SnapshotSwitch'/>
@@ -19,7 +19,7 @@
         <menuitem action='ImportMetadata'/>
       </menu>
       <separator/>
-      <menuitem action='AddTrackBus'/>	
+      <menuitem action='AddTrackBus'/>
       <separator/>
       <menuitem action='addExistingAudioFiles'/>
 #ifdef PTFORMAT
@@ -27,11 +27,16 @@
 #endif
       <!--menuitem action='importFromSession'/-->
 
+      <menu name='Scripting' action='Scripting'>
+        <menuitem action='AddLuaScript'/>
+        <menuitem action='RemoveLuaScript'/>
+      </menu>
+
       <menuitem action='OpenVideo'/>
       <menuitem action='CloseVideo'/>
 
       <menu name='Export' action='Export'>
-       <menuitem action='ExportAudio'/>
+        <menuitem action='ExportAudio'/>
         <menuitem action='StemExport'/>
         <menuitem action='ExportVideo'/>
       </menu>
@@ -43,13 +48,14 @@
       </menu>
       <separator/>
       <menuitem action='toggle-session-options-editor'/>
-#ifdef GTKOSX      
+#ifdef __APPLE__
       <menuitem action='toggle-about'/>
-      <menuitem action='toggle-rc-options-editor'/>
 #endif
+#ifndef MIXBUS
       <separator/>
       <menuitem action='lock'/>
-#ifndef GTKOSX
+#endif
+#ifndef __APPLE__
       <separator/>
       <menuitem action='Quit'/>
 #endif
@@ -83,7 +89,7 @@
       <menuitem action='TransitionToReverse'/>
       <separator/>
 
-      
+
       <menu action="MovePlayHeadMenu">
         <menuitem action='set-playhead'/>
         <menuitem action='playhead-to-edit'/>
@@ -123,7 +129,7 @@
 
       <menu action="MarkerMenu">
         <menuitem action='add-location-from-playhead'/>
-		<menuitem action='remove-location-from-playhead'/>
+        <menuitem action='remove-location-from-playhead'/>
         <separator/>
         <menuitem action='goto-mark-1'/>
         <menuitem action='goto-mark-2'/>
@@ -135,8 +141,8 @@
         <menuitem action='goto-mark-8'/>
         <menuitem action='goto-mark-9'/>
         <separator/>
-		<menuitem action='set-session-start-from-playhead'/>
-		<menuitem action='set-session-end-from-playhead'/>
+        <menuitem action='set-session-start-from-playhead'/>
+        <menuitem action='set-session-end-from-playhead'/>
       </menu>
 
       <separator/>
@@ -153,7 +159,7 @@
       <menuitem action='toggle-stationary-playhead'/>
       <menuitem action='ToggleFollowEdits'/>
       <menuitem action='panic'/>
-     <separator/>
+      <separator/>
     </menu>
 
     <menu name='Edit' action='Edit'>
@@ -162,22 +168,22 @@
       <separator/>
       <menuitem action='undo-last-selection-op'/>
       <menuitem action='redo-last-selection-op'/>
-      <separator/>  
+      <separator/>
       <menuitem action='editor-cut'/>
       <menuitem action='editor-copy'/>
       <menuitem action='editor-paste'/>
-      <separator/>       
-      <menu action="SelectMenu">	   
+      <separator/>
+      <menu action="SelectMenu">
         <menuitem action='select-all-objects'/>
         <menuitem action='select-all-tracks'/>
         <menuitem action='deselect-all'/>
         <menuitem action='invert-selection'/>
         <separator/>
-	<menuitem action='select-loop-range'/>
-	<menuitem action='select-punch-range'/>
-	<menuitem action='select-from-regions'/>
+        <menuitem action='select-loop-range'/>
+        <menuitem action='select-punch-range'/>
+        <menuitem action='select-from-regions'/>
         <separator/>
-	<menuitem action='select-all-after-edit-cursor'/>
+        <menuitem action='select-all-after-edit-cursor'/>
         <menuitem action='select-all-before-edit-cursor'/>
         <menuitem action='select-all-between-cursors'/>
         <menuitem action='select-all-within-cursors'/>
@@ -194,7 +200,7 @@
         <separator/>
         <menuitem action='select-next-route'/>
         <menuitem action='select-prev-route'/>
-      </menu>	   
+      </menu>
       <separator/>
       <menuitem action='editor-delete'/>
       <menuitem action='editor-crop'/>
@@ -220,7 +226,7 @@
         <menuitem action='set-fade-out-length'/>
         <menuitem action='toggle-region-fade-out'/>
       </menu>
-      <separator/>       
+      <separator/>
       <menuitem action='remove-last-capture'/>
       <separator/>
       <menu action="EditPointMenu">
@@ -276,11 +282,25 @@
         <menuitem action='set-tempo-from-edit-range'/>
       </menu>
       <menuitem action='set-mouse-mode-object-range'/>
-#ifndef GTKOSX
       <separator/>
-      <menuitem action='toggle-rc-options-editor'/>
+      <menu action="ActionScripts">
+        <menuitem action='toggle-script-manager'/>
+        <separator/>
+        <menuitem action='script-action-1'/>
+        <menuitem action='script-action-2'/>
+        <menuitem action='script-action-3'/>
+        <menuitem action='script-action-4'/>
+        <menuitem action='script-action-5'/>
+        <menuitem action='script-action-6'/>
+        <menuitem action='script-action-7'/>
+        <menuitem action='script-action-8'/>
+        <menuitem action='script-action-9'/>
+      </menu>
+#ifndef __APPLE__
+      <separator/>
 #endif
-    </menu>         
+      <menuitem action='menu-show-preferences'/>
+    </menu>
 
     <menu name='RegionMenu' action='RegionMenu'>
       <menuitem action='insert-region-from-region-list'/>
@@ -288,18 +308,20 @@
       <menuitem action='loop-region'/>
       <menuitem action='rename-region'/>
       <menuitem action='show-region-properties'/>
-      <menuitem action='analyze-region'/>
+      <menuitem action='loudness-analyze-region'/>
+      <menuitem action='spectral-analyze-region'/>
       <menu action='RegionMenuEdit'>
-         <menuitem action='combine-regions'/>
-         <menuitem action='uncombine-regions'/>
-         <menuitem action='pitch-shift-region'/>
-         <menuitem action='split-region-at-transients'/>
-         <menuitem action='split-multichannel-region'/>
-         <menuitem action='close-region-gaps'/>
-         <menuitem action='place-transient' />
-         <menuitem action='show-rhythm-ferret'/>
-         <menuitem action='strip-region-silence'/>
-         <menuitem action='reverse-region'/>    
+        <menuitem action='combine-regions'/>
+        <menuitem action='uncombine-regions'/>
+        <menuitem action='pitch-shift-region'/>
+        <menuitem action='split-region'/>
+        <menuitem action='split-region-at-transients'/>
+        <menuitem action='split-multichannel-region'/>
+        <menuitem action='close-region-gaps'/>
+        <menuitem action='place-transient' />
+        <menuitem action='show-rhythm-ferret'/>
+        <menuitem action='strip-region-silence'/>
+        <menuitem action='reverse-region'/>
       </menu>
       <menu action='RegionMenuLayering'>
         <menuitem action='raise-region-to-top'/>
@@ -322,7 +344,7 @@
         <menuitem action='toggle-region-mute'/>
         <menuitem action='normalize-region'/>
         <menuitem action='boost-region-gain'/>
-        <menuitem action='cut-region-gain'/>      		   
+        <menuitem action='cut-region-gain'/>
         <menuitem action='reset-region-gain-envelopes'/>
         <menuitem action='toggle-region-gain-envelope-active'/>
       </menu>
@@ -338,7 +360,7 @@
         <menuitem action='nudge-backward'/>
         <menuitem action='nudge-forward-by-capture-offset'/>
         <menuitem action='nudge-backward-by-capture-offset'/>
-	<menuitem action='sequence-regions'/>
+        <menuitem action='sequence-regions'/>
       </menu>
       <menu action='RegionMenuTrim'>
         <menuitem action='trim-front'/>
@@ -366,15 +388,20 @@
         <menuitem action='region-fill-track'/>
       </menu>
       <menuitem action='export-region'/>
-      <menuitem action='bounce-regions-processed'/>
       <menuitem action='bounce-regions-unprocessed'/>
+#ifndef MIXBUS
+      <menuitem action='bounce-regions-processed'/>
+#endif
       <separator/>
       <menuitem action='remove-region'/>
     </menu>
 
     <menu action='TrackMenu'>
-      <menuitem action='AddTrackBus'/>	
-      <menuitem action='duplicate-routes'/>	
+      <menuitem action='AddTrackBus'/>
+#ifdef MIXBUS
+      <menuitem action='addExistingAudioFiles'/>
+#endif
+      <menuitem action='duplicate-routes'/>
       <separator/>
       <menuitem action='track-record-enable-toggle'/>
       <menuitem action='track-solo-toggle'/>
@@ -393,20 +420,18 @@
         <menuitem action='track-height-small'/>
       </menu>
       <separator/>
-     <menuitem action='toggle-track-active'/>	
-      <menuitem action='remove-track'/>	
+      <menuitem action='toggle-track-active'/>
+      <menuitem action='remove-track'/>
     </menu>
 
     <menu name='View' action = 'View'>
       <menuitem action='ToggleMaximalEditor'/>
       <menuitem action='ToggleMaximalMixer'/>
-      <menuitem action='KeepTearoffs'/>
-      <menuitem action='reattach-all-tearoffs'/>
 
       <separator/>
 
       <menu action="PrimaryClockMenu">
-		<menuitem action='focus-on-clock'/>
+        <menuitem action='focus-on-clock'/>
         <menuitem action="primary-clock-timecode"/>
         <menuitem action="primary-clock-bbt"/>
         <menuitem action="primary-clock-minsec"/>
@@ -515,20 +540,46 @@
     <menu action = 'WindowMenu'>
       <menuitem action='toggle-audio-midi-setup'/>
       <separator/>
-      <menuitem action='toggle-mixer'/>
+      <menu action='EditorMenu'>
+        <menuitem action='show-editor'/>
+        <menuitem action='hide-editor'/>
+        <menuitem action='attach-editor'/>
+        <menuitem action='detach-editor'/>
+      </menu>
+      <menu action='MixerMenu'>
+        <menuitem action='show-mixer'/>
+        <menuitem action='hide-mixer'/>
+        <menuitem action='attach-mixer'/>
+        <menuitem action='detach-mixer'/>
+      </menu>
+      <menu action='PrefsMenu'>
+        <menuitem action='show-preferences'/>
+        <menuitem action='hide-preferences'/>
+        <menuitem action='attach-preferences'/>
+        <menuitem action='detach-preferences'/>
+      </menu>
       <menuitem action='toggle-meterbridge'/>
-      <menuitem action='toggle-editor-mixer'/>
+      <menuitem action='toggle-luawindow'/>
       <separator/>
+#ifndef MIXBUS
       <menuitem action='toggle-inspector'/>
+#endif
       <menuitem action='toggle-locations'/>
       <menuitem action='toggle-key-editor'/>
+#ifndef MIXBUS
       <menuitem action='toggle-bundle-manager'/>
+#endif
       <menuitem action='toggle-big-clock'/>
 #if 0
       <menuitem action='toggle-speaker-config'/>
 #endif
 
       <separator/>
+#ifdef MIXBUS
+      <menuitem action='license-manager'/>
+
+      <separator/>
+#endif
 
       <menuitem action='ToggleJadeo'/>
       <separator/>
@@ -540,9 +591,15 @@
       <separator/>
     </menu>
     <menu name='Help' action='Help'>
-#ifndef GTKOSX
+#ifndef __APPLE__
       <menuitem action='toggle-about'/>
 #endif
+#ifdef MIXBUS
+      <menuitem action='reference'/>
+      <menuitem action='manual'/>
+      <menuitem action='forums'/>
+      <menuitem action='chat'/>
+#else
       <menuitem action='chat'/>
       <menuitem action='manual'/>
       <menuitem action='reference'/>
@@ -551,9 +608,31 @@
       <menuitem action='tracker'/>
       <menuitem action='website'/>
       <menuitem action='website-dev'/>
+#endif
     </menu>
   </menubar>
 
+  <popup action="editorTabbableButtonMenu">
+    <menuitem action='show-editor'/>
+    <menuitem action='hide-editor'/>
+    <menuitem action='attach-editor'/>
+    <menuitem action='detach-editor'/>
+  </popup>
+
+  <popup action="mixerTabbableButtonMenu">
+    <menuitem action='show-mixer'/>
+    <menuitem action='hide-mixer'/>
+    <menuitem action='attach-mixer'/>
+    <menuitem action='detach-mixer'/>
+  </popup>
+
+  <popup action="preferencesTabbableButtonMenu">
+    <menuitem action='show-preferences'/>
+    <menuitem action='hide-preferences'/>
+    <menuitem action='attach-preferences'/>
+    <menuitem action='detach-preferences'/>
+  </popup>
+
   <popup action="RulerMenuPopup">
     <menuitem action="toggle-minsec-ruler"/>
     <menuitem action="toggle-timecode-ruler"/>
@@ -578,7 +657,9 @@
     <menuitem action='newaux'/>
     <separator/>
     <menuitem action='controls'/>
+#ifndef MIXBUS
     <menuitem action='send_options'/>
+#endif
     <separator/>
     <menuitem action='clear'/>
     <menuitem action='clear_pre'/>
@@ -596,7 +677,11 @@
     <separator/>
     <menuitem action='activate_all'/>
     <menuitem action='deactivate_all'/>
+#ifndef MIXBUS
     <menuitem action='ab_plugins'/>
+#endif
+    <separator/>
+    <menuitem action='manage-pins'/>
     <separator/>
     <menuitem action='edit'/>
     <menuitem action='edit-generic'/>
@@ -632,7 +717,7 @@
     <separator/>
     <menuitem action='addExternalAudioToRegionList'/>
     <separator/>
-    <menuitem action='removeUnusedRegions'/>    
+    <menuitem action='removeUnusedRegions'/>
   </popup>
 
   <popup name='PopupRegionMenu' action='PopupRegionMenu'>
@@ -641,16 +726,17 @@
     <menuitem action='rename-region'/>
     <menuitem action='show-region-properties'/>
     <menu action='RegionMenuEdit'>
-       <menuitem action='combine-regions'/>
-       <menuitem action='uncombine-regions'/>
-       <menuitem action='split-region'/>
-       <menuitem action='split-multichannel-region'/>
-       <menuitem action='pitch-shift-region'/>
-       <menuitem action='reverse-region'/>    
-       <menuitem action='close-region-gaps'/>
-       <menuitem action='place-transient' />
-       <menuitem action='show-rhythm-ferret'/>
-       <menuitem action='strip-region-silence'/>
+      <menuitem action='combine-regions'/>
+      <menuitem action='uncombine-regions'/>
+      <menuitem action='pitch-shift-region'/>
+      <menuitem action='split-region'/>
+      <menuitem action='split-region-at-transients'/>
+      <menuitem action='split-multichannel-region'/>
+      <menuitem action='close-region-gaps'/>
+      <menuitem action='place-transient' />
+      <menuitem action='show-rhythm-ferret'/>
+      <menuitem action='strip-region-silence'/>
+      <menuitem action='reverse-region'/>
     </menu>
     <menu action='RegionMenuMIDI'>
       <menuitem action='transpose-region'/>
@@ -702,7 +788,7 @@
       <menuitem action='toggle-region-mute'/>
       <menuitem action='normalize-region'/>
       <menuitem action='boost-region-gain'/>
-      <menuitem action='cut-region-gain'/>      		   
+      <menuitem action='cut-region-gain'/>
       <menuitem action='reset-region-gain-envelopes'/>
       <menuitem action='toggle-region-gain-envelope-active'/>
     </menu>
@@ -717,12 +803,15 @@
       <menuitem action='region-fill-track'/>
     </menu>
     <menuitem action='export-region'/>
-    <menuitem action='bounce-regions-processed'/>
     <menuitem action='bounce-regions-unprocessed'/>
-    <menuitem action='analyze-region'/>
+#ifndef MIXBUS
+    <menuitem action='bounce-regions-processed'/>
+#endif
+    <menuitem action='loudness-analyze-region'/>
+    <menuitem action='spectral-analyze-region'/>
     <separator/>
     <menuitem action='remove-region'/>
-    
+
   </popup>
 
 </ui>
diff --git a/gtk2_ardour/ardour.sh.in b/gtk2_ardour/ardour.sh.in
index 288c51f..8bcad1b 100644
--- a/gtk2_ardour/ardour.sh.in
+++ b/gtk2_ardour/ardour.sh.in
@@ -25,7 +25,7 @@ fi
 
 GLIB=$(ldd @LIBDIR@/ardour- at VERSION@ 2> /dev/null | grep glib-2.0 | sed 's/.*=> \([^ ]*\) .*/\1/')
 
-if [ "$GLIB" = "" ]; then
+if ! type nm >/dev/null 2>&1 || [ "$GLIB" = "" ]; then
 	echo "WARNING: Could not check your glib-2.0 for mutex locking atomic operations."
 	echo ""
 elif [ $(nm -D --radix=dec --defined-only -S $GLIB | grep -w g_atomic_int_add | cut -d ' ' -f 2) -gt 32 ]; then
@@ -57,7 +57,7 @@ export ARDOUR_SELF="$0"
 # VAMP has its own lookup path
 # 
 
-export VAMP_PATH=@LIBDIR@/vamp
+export VAMP_PATH=@LIBDIR@/vamp${VAMP_PATH:+:$VAMP_PATH}
 
 if [ $# -gt 0 ] ; then
     case $1 in
diff --git a/gtk2_ardour/ardour_button.cc b/gtk2_ardour/ardour_button.cc
index a4f346a..5685488 100644
--- a/gtk2_ardour/ardour_button.cc
+++ b/gtk2_ardour/ardour_button.cc
@@ -39,7 +39,7 @@
 #include "tooltips.h"
 #include "ui_config.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 #define BASELINESTRETCH (1.25)
 #define TRACKHEADERBTNW (3.10)
@@ -102,6 +102,9 @@ ArdourButton::ArdourButton (Element e)
 ArdourButton::ArdourButton (const std::string& str, Element e)
 	: _elements (e)
 	, _tweaks (Tweaks (0))
+	, _char_pixel_width (0)
+	, _char_pixel_height (0)
+	, _char_avg_pixel_width (0)
 	, _text_width (0)
 	, _text_height (0)
 	, _diameter (0)
@@ -169,6 +172,9 @@ ArdourButton::set_layout_font (const Pango::FontDescription& fd)
 void
 ArdourButton::set_text (const std::string& str)
 {
+	if (_text == str) {
+		return;
+	}
 	_text = str;
 	if (!is_realized()) {
 		return;
@@ -284,7 +290,7 @@ ArdourButton::render (cairo_t* cr, cairo_rectangle_t *)
 	}
 
 	//show the "convex" or "concave" gradient
-	if (!_flat_buttons) {
+	if (!_flat_buttons && (_elements & Body)==Body) {
 		if ( active_state() == Gtkmm2ext::ExplicitActive && ( !((_elements & Indicator)==Indicator) || use_custom_led_color) ) {
 			//concave
 			cairo_set_source (cr, concave_pattern);
@@ -535,12 +541,40 @@ ArdourButton::on_size_request (Gtk::Requisition* req)
 		}
 	}
 
-	if ((_elements & Text) && !_text.empty()) {
-		// if _layout does not exist, char_pixel_height() creates it,
-		req->height = std::max(req->height, (int) ceil(char_pixel_height() * BASELINESTRETCH + 1.0));
-		_layout->get_pixel_size (_text_width, _text_height);
-		req->width += rint(1.75 * char_pixel_width()); // padding
-		req->width += _text_width;
+	if (_elements & Text) {
+
+		if (_tweaks & OccasionalText) {
+
+			/* size should not change based on presence or absence
+			 * of text.
+			 */
+
+			if (!_text.empty()) {
+				ensure_layout ();
+				_layout->set_text (_text);
+				_layout->get_pixel_size (_text_width, _text_height);
+			}
+
+		} else if (!_text.empty()) {
+
+			//if _layout does not exist, char_pixel_height() creates it,
+
+			req->height = std::max(req->height, (int) ceil(char_pixel_height() * BASELINESTRETCH + 1.0));
+			assert (_layout);
+			_layout->get_pixel_size (_text_width, _text_height);
+			req->width += rint(1.75 * char_pixel_width()); // padding
+			req->width += _text_width;
+		}
+
+		/* XXX hack (surprise). Deal with two common rotation angles */
+
+		if (_angle == 90 || _angle == 270) {
+			/* do not swap text width or height because we rely on
+			   these being the un-rotated values in ::render()
+			*/
+			swap (req->width, req->height);
+		}
+
 	} else {
 		_text_width = 0;
 		_text_height = 0;
@@ -601,19 +635,26 @@ void
 ArdourButton::set_colors ()
 {
 	_update_colors = false;
-	if (_fixed_colors_set) {
+
+	if (_fixed_colors_set == 0x3) {
 		return;
 	}
+
 	std::string name = get_name();
 	bool failed = false;
 
-	fill_active_color = UIConfiguration::instance().color (string_compose ("%1: fill active", name), &failed);
-	if (failed) {
-		fill_active_color = UIConfiguration::instance().color ("generic button: fill active");
+	if (!(_fixed_colors_set & 0x1)) {
+		fill_active_color = UIConfiguration::instance().color (string_compose ("%1: fill active", name), &failed);
+		if (failed) {
+			fill_active_color = UIConfiguration::instance().color ("generic button: fill active");
+		}
 	}
-	fill_inactive_color = UIConfiguration::instance().color (string_compose ("%1: fill", name), &failed);
-	if (failed) {
-		fill_inactive_color = UIConfiguration::instance().color ("generic button: fill");
+
+	if (!(_fixed_colors_set & 0x2)) {
+		fill_inactive_color = UIConfiguration::instance().color (string_compose ("%1: fill", name), &failed);
+		if (failed) {
+			fill_inactive_color = UIConfiguration::instance().color ("generic button: fill");
+		}
 	}
 
 	text_active_color = ArdourCanvas::contrasting_text_color (fill_active_color);
@@ -641,13 +682,18 @@ ArdourButton::set_colors ()
  */
 void ArdourButton::set_fixed_colors (const uint32_t color_active, const uint32_t color_inactive)
 {
-	_fixed_colors_set = true;
+	set_active_color (color_active);
+	set_inactive_color (color_inactive);
+}
+
+void ArdourButton::set_active_color (const uint32_t color)
+{
+	_fixed_colors_set |= 0x1;
 
-	fill_active_color = color_active;
-	fill_inactive_color = color_inactive;
+	fill_active_color = color;
 
 	unsigned char r, g, b, a;
-	UINT_TO_RGBA(color_active, &r, &g, &b, &a);
+	UINT_TO_RGBA(color, &r, &g, &b, &a);
 
 	double white_contrast = (max (double(r), 255.) - min (double(r), 255.)) +
 		(max (double(g), 255.) - min (double(g), 255.)) +
@@ -661,14 +707,24 @@ void ArdourButton::set_fixed_colors (const uint32_t color_active, const uint32_t
 		RGBA_TO_UINT(255, 255, 255, 255) : /* use white */
 		RGBA_TO_UINT(  0,   0,   0,   255);  /* use black */
 
+	/* XXX what about led colors ? */
+	CairoWidget::set_dirty ();
+}
+
+void ArdourButton::set_inactive_color (const uint32_t color)
+{
+	_fixed_colors_set |= 0x2;
 
-	UINT_TO_RGBA(color_inactive, &r, &g, &b, &a);
+	fill_inactive_color = color;
 
-	white_contrast = (max (double(r), 255.) - min (double(r), 255.)) +
+	unsigned char r, g, b, a;
+	UINT_TO_RGBA(color, &r, &g, &b, &a);
+
+	double white_contrast = (max (double(r), 255.) - min (double(r), 255.)) +
 		(max (double(g), 255.) - min (double(g), 255.)) +
 		(max (double(b), 255.) - min (double(b), 255.));
 
-	black_contrast = (max (double(r), 0.) - min (double(r), 0.)) +
+	double black_contrast = (max (double(r), 0.) - min (double(r), 0.)) +
 		(max (double(g), 0.) - min (double(g), 0.)) +
 		(max (double(b), 0.) - min (double(b), 0.));
 
@@ -724,7 +780,7 @@ ArdourButton::set_led_left (bool yn)
 bool
 ArdourButton::on_button_press_event (GdkEventButton *ev)
 {
-	focus_handler ();
+	focus_handler (this);
 
 	if (ev->button == 1 && (_elements & Indicator) && _led_rect && _distinct_led_click) {
 		if (ev->x >= _led_rect->x && ev->x < _led_rect->x + _led_rect->width &&
diff --git a/gtk2_ardour/ardour_button.h b/gtk2_ardour/ardour_button.h
index 25986cc..78c2f5e 100644
--- a/gtk2_ardour/ardour_button.h
+++ b/gtk2_ardour/ardour_button.h
@@ -55,7 +55,8 @@ class ArdourButton : public CairoWidget , public Gtkmm2ext::Activatable
 	enum Tweaks {
 		Square = 0x1,
 		TrackHeader = 0x2,
-		unused3 = 0x4,
+		OccasionalText = 0x4,
+		unused4 = 0x8,
 	};
 
 	Tweaks tweaks() const { return _tweaks; }
@@ -104,7 +105,9 @@ class ArdourButton : public CairoWidget , public Gtkmm2ext::Activatable
 
 	void set_image (const Glib::RefPtr<Gdk::Pixbuf>&);
 
-	void set_fixed_colors (const uint32_t active_color, const uint32_t inactive_color);
+	void set_fixed_colors   (const uint32_t active_color, const uint32_t inactive_color);
+	void set_active_color   (const uint32_t active_color);
+	void set_inactive_color (const uint32_t inactive_color);
 
 	void set_fallthrough_to_parent(bool fall) { _fallthrough_to_parent = fall; }
 
@@ -172,7 +175,7 @@ class ArdourButton : public CairoWidget , public Gtkmm2ext::Activatable
 	bool _distinct_led_click;
 	bool _hovering;
 	bool _focused;
-	bool _fixed_colors_set;
+	int  _fixed_colors_set;
 	bool _fallthrough_to_parent;
 	int _layout_ellipsize_width;
 	Pango::EllipsizeMode _ellipsis;
diff --git a/gtk2_ardour/ardour_dialog.cc b/gtk2_ardour/ardour_dialog.cc
index f8071c2..89b9914 100644
--- a/gtk2_ardour/ardour_dialog.cc
+++ b/gtk2_ardour/ardour_dialog.cc
@@ -60,7 +60,8 @@ ArdourDialog::~ArdourDialog ()
                         spl->pop_front();
                 }
         }
-	WM::Manager::instance().remove (proxy);
+        Keyboard::the_keyboard().focus_out_window (0, this);
+        WM::Manager::instance().remove (proxy);
 }
 
 bool
diff --git a/gtk2_ardour/ardour_display.cc b/gtk2_ardour/ardour_display.cc
index 17f3dc5..d4c75af 100644
--- a/gtk2_ardour/ardour_display.cc
+++ b/gtk2_ardour/ardour_display.cc
@@ -37,7 +37,7 @@
 
 #include "ardour_display.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace Gtkmm2ext;
 using namespace Gdk;
@@ -51,8 +51,6 @@ using namespace std;
 
 ArdourDisplay::ArdourDisplay (Element e)
 {
-	add_elements(e);
-	add_elements(ArdourButton::Menu);
 	add_elements(ArdourButton::Text);
 }
 
@@ -60,12 +58,6 @@ ArdourDisplay::~ArdourDisplay ()
 {
 }
 
-bool
-ArdourDisplay::on_button_press_event (GdkEventButton*)
-{
-	_menu.popup (1, gtk_get_current_event_time());
-	return true;
-}
 
 bool
 ArdourDisplay::on_scroll_event (GdkEventScroll* ev)
@@ -101,10 +93,7 @@ void
 ArdourDisplay::add_controllable_preset (const char *txt, float val)
 {
 	using namespace Menu_Helpers;
-
-	MenuList& items = _menu.items ();
-
-	items.push_back (MenuElem (txt, sigc::bind (sigc::mem_fun(*this, &ArdourDisplay::handle_controllable_preset), val)));
+	AddMenuElem(MenuElem (txt, sigc::bind (sigc::mem_fun(*this, &ArdourDisplay::handle_controllable_preset), val)));
 }
 
 
diff --git a/gtk2_ardour/ardour_display.h b/gtk2_ardour/ardour_display.h
index 8b7712d..1b7c654 100644
--- a/gtk2_ardour/ardour_display.h
+++ b/gtk2_ardour/ardour_display.h
@@ -27,9 +27,9 @@
 #include <gtkmm/menuitem.h>
 
 
-#include "ardour_button.h"
+#include "ardour_dropdown.h"
 
-class ArdourDisplay : public ArdourButton
+class ArdourDisplay : public ArdourDropdown
 {
   public:
 
@@ -39,8 +39,6 @@ class ArdourDisplay : public ArdourButton
 	boost::shared_ptr<PBD::Controllable> get_controllable() { return binding_proxy.get_controllable(); }
  	void set_controllable (boost::shared_ptr<PBD::Controllable> c);
 
-	bool on_button_press_event (GdkEventButton*);  //mousedown will pop up our preset menu
-//	bool on_button_press_event (GdkEventButton*);
 //	bool on_button_release_event (GdkEventButton*);
 	bool on_scroll_event (GdkEventScroll* ev);
 //	bool on_motion_notify_event (GdkEventMotion *ev) ;
@@ -50,9 +48,6 @@ class ArdourDisplay : public ArdourButton
 
 	void controllable_changed ();
 	PBD::ScopedConnection watch_connection;
-
-  private:
-	Gtk::Menu      _menu;
 };
 
 #endif /* __gtk2_ardour_ardour_menu_h__ */
diff --git a/gtk2_ardour/ardour_dropdown.cc b/gtk2_ardour/ardour_dropdown.cc
index 5c0e25f..741db8c 100644
--- a/gtk2_ardour/ardour_dropdown.cc
+++ b/gtk2_ardour/ardour_dropdown.cc
@@ -35,7 +35,7 @@
 
 #include "ardour_dropdown.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 #define REFLECTION_HEIGHT 2
 
@@ -43,8 +43,6 @@ using namespace Gdk;
 using namespace Gtk;
 using namespace Glib;
 using namespace PBD;
-using std::max;
-using std::min;
 using namespace std;
 
 
@@ -52,6 +50,9 @@ ArdourDropdown::ArdourDropdown (Element e)
 	: _scrolling_disabled(false)
 {
 //	signal_button_press_event().connect (sigc::mem_fun(*this, &ArdourDropdown::on_mouse_pressed));
+	_menu.signal_size_request().connect (sigc::mem_fun(*this, &ArdourDropdown::menu_size_request));
+
+	_menu.set_reserve_toggle_size(false);
 
 	add_elements(e);
 	add_elements(ArdourButton::Menu);
@@ -61,11 +62,22 @@ ArdourDropdown::~ArdourDropdown ()
 {
 }
 
+void
+ArdourDropdown::menu_size_request(Requisition *req) {
+	req->width = max(req->width, get_allocation().get_width());
+}
+
+void
+ArdourDropdown::position_menu(int& x, int& y, bool& push_in) {
+    Gtkmm2ext::position_menu_anchored (&_menu, this, get_text(), x, y, push_in);
+}
+
 bool
 ArdourDropdown::on_button_press_event (GdkEventButton* ev)
 {
 	if (ev->type == GDK_BUTTON_PRESS) {
-		_menu.popup (1, gtk_get_current_event_time());
+		_menu.popup (sigc::mem_fun(this, &ArdourDropdown::position_menu),
+		             1, ev->time);
 	}
 	return true;
 }
diff --git a/gtk2_ardour/ardour_dropdown.h b/gtk2_ardour/ardour_dropdown.h
index 638f54c..5a710ec 100644
--- a/gtk2_ardour/ardour_dropdown.h
+++ b/gtk2_ardour/ardour_dropdown.h
@@ -38,6 +38,8 @@ class ArdourDropdown : public ArdourButton
 
 	bool on_button_press_event (GdkEventButton*);
 	bool on_scroll_event (GdkEventScroll*);
+	void position_menu(int&, int&, bool&);
+	void menu_size_request(Gtk::Requisition*);
 
 	void clear_items ();
 	void AddMenuElem (Gtk::Menu_Helpers::Element e);
diff --git a/gtk2_ardour/ardour_http.cc b/gtk2_ardour/ardour_http.cc
new file mode 100644
index 0000000..3ffea61
--- /dev/null
+++ b/gtk2_ardour/ardour_http.cc
@@ -0,0 +1,200 @@
+/*
+ * Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+
+#include <assert.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <cstring>
+
+#include <glibmm.h>
+
+#include "pbd/compose.h"
+#include "pbd/i18n.h"
+#include "pbd/error.h"
+
+#include "ardour_http.h"
+
+#ifdef WAF_BUILD
+#include "gtk2ardour-version.h"
+#endif
+
+#ifndef ARDOUR_CURL_TIMEOUT
+#define ARDOUR_CURL_TIMEOUT (60)
+#endif
+
+using namespace ArdourCurl;
+
+const char* HttpGet::ca_path = NULL;
+const char* HttpGet::ca_info = NULL;
+
+void
+HttpGet::setup_certificate_paths ()
+{
+	/* this is only needed for Linux Bundles.
+	 * (on OSX, Windows, we use system-wide ssl (darwinssl, winssl)
+	 * Gnu/Linux distro will link against system-wide libcurl.
+	 *
+	 * but for linux-bundles we get to enjoy:
+	 * https://www.happyassassin.net/2015/01/12/a-note-about-ssltls-trusted-certificate-stores-and-platforms/
+	 *
+	 * (we do ship curl + nss + nss-pem)
+	 *
+	 * Short of this mess: we could simply bundle a .crt of
+	 * COMODO (ardour) and ghandi (freesound) and be done with it.
+	 */
+	assert (!ca_path && !ca_info); // call once
+
+	curl_global_init (CURL_GLOBAL_DEFAULT);
+
+	if (Glib::file_test ("/etc/pki/tls/certs/ca-bundle.crt", Glib::FILE_TEST_EXISTS|Glib::FILE_TEST_IS_REGULAR)) {
+		// Fedora / RHEL, Arch
+		ca_info = "/etc/pki/tls/certs/ca-bundle.crt";
+	}
+	else if (Glib::file_test ("/etc/ssl/certs/ca-certificates.crt", Glib::FILE_TEST_EXISTS|Glib::FILE_TEST_IS_REGULAR)) {
+		// Debian and derivatives
+		ca_info = "/etc/ssl/certs/ca-certificates.crt";
+	}
+	else if (Glib::file_test ("/etc/pki/tls/cert.pem", Glib::FILE_TEST_EXISTS|Glib::FILE_TEST_IS_REGULAR)) {
+		// GNU/TLS can keep extra stuff here
+		ca_info = "/etc/pki/tls/cert.pem";
+	}
+	// else NULL: use default (currently) "/etc/ssl/certs/ca-certificates.crt" if it exists
+
+	if (Glib::file_test ("/etc/pki/tls/certs/ca-bundle.crt", Glib::FILE_TEST_EXISTS|Glib::FILE_TEST_IS_DIR)) {
+		// we're on RHEL // https://bugzilla.redhat.com/show_bug.cgi?id=1053882
+		ca_path = "/nonexistent_path"; // don't try "/etc/ssl/certs" in case it's curl's default
+	}
+	else if (Glib::file_test ("/etc/ssl/certs", Glib::FILE_TEST_EXISTS|Glib::FILE_TEST_IS_DIR)) {
+		// Debian and derivs + OpenSuSe
+		ca_path = "/etc/ssl/certs";
+	} else {
+		ca_path = "/nonexistent_path"; // don't try -- just in case:
+	}
+
+	/* If we don't set anything defaults are used. at the time of writing we compile bundled curl on debian
+	 * and it'll default to  /etc/ssl/certs and /etc/ssl/certs/ca-certificates.crt
+	 */
+}
+
+static size_t
+WriteMemoryCallback (void *ptr, size_t size, size_t nmemb, void *data) {
+	size_t realsize = size * nmemb;
+	struct HttpGet::MemStruct *mem = (struct HttpGet::MemStruct*)data;
+
+	mem->data = (char *)realloc (mem->data, mem->size + realsize + 1);
+	if (mem->data) {
+		memcpy (&(mem->data[mem->size]), ptr, realsize);
+		mem->size += realsize;
+		mem->data[mem->size] = 0;
+	}
+	return realsize;
+}
+
+
+HttpGet::HttpGet (bool p, bool ssl)
+	: persist (p)
+	, _status (-1)
+	, _result (-1)
+{
+	error_buffer[0] = '\0';
+	_curl = curl_easy_init ();
+
+	curl_easy_setopt (_curl, CURLOPT_WRITEDATA, (void *)&mem);
+	curl_easy_setopt (_curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
+	curl_easy_setopt (_curl, CURLOPT_USERAGENT, PROGRAM_NAME VERSIONSTRING);
+	curl_easy_setopt (_curl, CURLOPT_TIMEOUT, ARDOUR_CURL_TIMEOUT);
+	curl_easy_setopt (_curl, CURLOPT_NOSIGNAL, 1);
+	curl_easy_setopt (_curl, CURLOPT_ERRORBUFFER, error_buffer);
+
+	// by default use curl's default.
+	if (ssl && ca_info) {
+		curl_easy_setopt (_curl, CURLOPT_CAINFO, ca_info);
+	}
+	if (ssl && ca_path) {
+		curl_easy_setopt (_curl, CURLOPT_CAPATH, ca_path);
+	}
+}
+
+HttpGet::~HttpGet ()
+{
+	curl_easy_cleanup (_curl);
+	if (!persist) {
+		free (mem.data);
+	}
+}
+
+char*
+HttpGet::get (const char* url)
+{
+	_status = _result = -1;
+	if (!_curl || !url) {
+		return NULL;
+	}
+
+	if (strncmp ("http://", url, 7) && strncmp ("https://", url, 8)) {
+		return NULL;
+	}
+
+	if (!persist) {
+		free (mem.data);
+	} // otherwise caller is expected to have free()d or re-used it.
+
+	mem.data = NULL;
+	mem.size = 0;
+
+	curl_easy_setopt (_curl, CURLOPT_URL, url);
+	_result = curl_easy_perform (_curl);
+	curl_easy_getinfo (_curl, CURLINFO_RESPONSE_CODE, &_status);
+
+	if (_result) {
+		PBD::error << string_compose (_("HTTP request failed: (%1) %2"), _result, error_buffer);
+		return NULL;
+	}
+	if (_status != 200) {
+		PBD::error << string_compose (_("HTTP request status: %1"), _status);
+		return NULL;
+	}
+
+	return mem.data;
+}
+
+std::string
+HttpGet::error () const {
+	if (_result != 0) {
+		return string_compose (_("HTTP request failed: (%1) %2"), _result, error_buffer);
+	}
+	if (_status != 200) {
+		return string_compose (_("HTTP request status: %1"), _status);
+	}
+	return "No Error";
+}
+
+char*
+ArdourCurl::http_get (const char* url, int* status) {
+	HttpGet h (true);
+	char* rv = h.get (url);
+	if (status) {
+		*status = h.status ();
+	}
+	return rv;
+}
+
+std::string
+ArdourCurl::http_get (const std::string& url) {
+	return HttpGet (false).get (url);
+}
diff --git a/gtk2_ardour/ardour_http.h b/gtk2_ardour/ardour_http.h
new file mode 100644
index 0000000..06cf46f
--- /dev/null
+++ b/gtk2_ardour/ardour_http.h
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+
+#ifndef __gtk_ardour_http_h__
+#define __gtk_ardour_http_h__
+
+#include <curl/curl.h>
+#include <string>
+
+namespace ArdourCurl {
+
+class HttpGet {
+	public:
+	HttpGet (bool persist = false, bool ssl = true);
+	~HttpGet ();
+
+	struct MemStruct {
+		MemStruct () : data (0), size (0) {}
+		char*  data;
+		size_t size;
+	};
+
+	char* get (const char* url);
+
+	std::string get (const std::string& url) {
+		char *rv = get (url.c_str ());
+		return rv ? std::string (rv) : std::string ("");
+	}
+
+	char* data () const { return mem.data; }
+	size_t data_size () const { return mem.size; }
+
+	long int status () const { return _status; }
+
+	char* escape (const char* s, int l) const {
+		return curl_easy_escape (_curl, s, l);
+	}
+
+	char* unescape (const char* s, int l, int *o) const {
+		return curl_easy_unescape (_curl, s, l, o);
+	}
+
+	void free (void *p) const {
+		curl_free (p);
+	}
+
+	std::string error () const;
+
+	CURL* curl () const { return _curl; }
+
+	// called from fixup_bundle_environment
+	static void setup_certificate_paths ();
+
+	private:
+	CURL* _curl;
+	bool  persist;
+
+	long int _status;
+	long int _result;
+
+	char error_buffer[CURL_ERROR_SIZE];
+
+	struct MemStruct mem;
+
+	static const char* ca_path;
+	static const char* ca_info;
+};
+
+char* http_get (const char* url, int* status);
+
+std::string http_get (const std::string& url);
+
+} // namespace
+
+#endif /* __gtk_ardour_http_h__ */
diff --git a/gtk2_ardour/ardour_knob.cc b/gtk2_ardour/ardour_knob.cc
index 8cea0f4..cf9eace 100644
--- a/gtk2_ardour/ardour_knob.cc
+++ b/gtk2_ardour/ardour_knob.cc
@@ -33,6 +33,7 @@
 #include "gtkmm2ext/gui_thread.h"
 #include "gtkmm2ext/keyboard.h"
 
+#include "ardour/automation_control.h"
 #include "ardour/rc_configuration.h" // for widget prelight preference
 
 #include "ardour_knob.h"
@@ -42,7 +43,7 @@
 #include "canvas/colors.h"
 #include "canvas/utils.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace Gtkmm2ext;
 using namespace Gdk;
@@ -69,7 +70,8 @@ ArdourKnob::ArdourKnob (Element e, Flags flags)
 	UIConfiguration::instance().ColorsChanged.connect (sigc::mem_fun (*this, &ArdourKnob::color_handler));
 
 	// watch automation :(
-	Timers::rapid_connect (sigc::mem_fun (*this, &ArdourKnob::controllable_changed));
+	// TODO only use for GainAutomation
+	Timers::rapid_connect (sigc::bind (sigc::mem_fun (*this, &ArdourKnob::controllable_changed), false));
 }
 
 ArdourKnob::~ArdourKnob()
@@ -460,7 +462,7 @@ ArdourKnob::set_controllable (boost::shared_ptr<Controllable> c)
 
 	binding_proxy.set_controllable (c);
 
-	c->Changed.connect (watch_connection, invalidator(*this), boost::bind (&ArdourKnob::controllable_changed, this), gui_context());
+	c->Changed.connect (watch_connection, invalidator(*this), boost::bind (&ArdourKnob::controllable_changed, this, false), gui_context());
 
 	_normal = c->internal_to_interface(c->normal());
 
@@ -468,7 +470,7 @@ ArdourKnob::set_controllable (boost::shared_ptr<Controllable> c)
 }
 
 void
-ArdourKnob::controllable_changed ()
+ArdourKnob::controllable_changed (bool force_update)
 {
 	boost::shared_ptr<PBD::Controllable> c = binding_proxy.get_controllable();
 	if (!c) return;
@@ -476,13 +478,19 @@ ArdourKnob::controllable_changed ()
 	float val = c->get_interface();
 	val = min( max(0.0f, val), 1.0f); // clamp
 
-	if (val == _val) {
+	if (val == _val && !force_update) {
 		return;
 	}
 
 	_val = val;
 	if (!_tooltip_prefix.empty()) {
-		_tooltip.set_tip (_tooltip_prefix + c->get_user_string());
+		boost::shared_ptr<ARDOUR::AutomationControl> ac = boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (c);
+		if (_printer && ac) {
+
+			_tooltip.set_tip (_tooltip_prefix + _printer->value_as_string (ac));
+		} else {
+			_tooltip.set_tip (_tooltip_prefix + c->get_user_string());
+		}
 	}
 	set_dirty();
 }
diff --git a/gtk2_ardour/ardour_knob.h b/gtk2_ardour/ardour_knob.h
index d9a9c94..ede200f 100644
--- a/gtk2_ardour/ardour_knob.h
+++ b/gtk2_ardour/ardour_knob.h
@@ -25,6 +25,8 @@
 #include <gtkmm/action.h>
 
 #include "pbd/signals.h"
+#include "ardour/automatable.h"
+
 #include "gtkmm2ext/binding_proxy.h"
 #include "gtkmm2ext/activatable.h"
 #include "gtkmm2ext/cairo_widget.h"
@@ -74,7 +76,7 @@ public:
 	void add_elements (Element);
 	static Element default_elements;
 
-	void set_tooltip_prefix (std::string pfx) { _tooltip_prefix = pfx; }
+	void set_tooltip_prefix (std::string pfx) { _tooltip_prefix = pfx; controllable_changed (true); }
 
 	boost::shared_ptr<PBD::Controllable> get_controllable() { return binding_proxy.get_controllable(); }
  	void set_controllable (boost::shared_ptr<PBD::Controllable> c);
@@ -84,6 +86,8 @@ public:
 	bool on_scroll_event (GdkEventScroll* ev);
 	bool on_motion_notify_event (GdkEventMotion *ev) ;
 
+	void set_printer (boost::shared_ptr<ARDOUR::Automatable> p) { _printer = p; controllable_changed (true); }
+
 	void color_handler ();
 
   protected:
@@ -97,14 +101,14 @@ public:
 	bool on_focus_in_event (GdkEventFocus*);
 	bool on_focus_out_event (GdkEventFocus*);
 
-	void controllable_changed ();
+	void controllable_changed (bool force_update = false);
 	PBD::ScopedConnection watch_connection;
 
 
   private:
-	Element                     _elements;
-
-	BindingProxy                binding_proxy;
+	Element _elements;
+	BindingProxy binding_proxy;
+	boost::shared_ptr<ARDOUR::Automatable> _printer;
 
 	bool _hovering;
 	float _grabbed_x;
diff --git a/gtk2_ardour/ardour_spinner.cc b/gtk2_ardour/ardour_spinner.cc
new file mode 100644
index 0000000..66307d6
--- /dev/null
+++ b/gtk2_ardour/ardour_spinner.cc
@@ -0,0 +1,213 @@
+/*
+ * Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+ * Copyright (C) 2011 Paul Davis
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+
+#include "gtkmm2ext/gui_thread.h"
+#include "gtkmm2ext/utils.h"
+#include "gtkmm2ext/keyboard.h"
+
+#include "ardour/value_as_string.h"
+
+#include "ardour_spinner.h"
+
+using namespace ARDOUR;
+
+ArdourSpinner::ArdourSpinner (
+		boost::shared_ptr<ARDOUR::AutomationControl> c,
+		Gtk::Adjustment* adj,
+		boost::shared_ptr<ARDOUR::Automatable> p)
+	: _btn (ArdourButton::Text)
+	, _ctrl_adj (adj)
+	, _spin_adj (0, c->lower (), c->upper (), .1, .01)
+	, _spinner (_spin_adj)
+	, _switching (false)
+	, _switch_on_release (false)
+	, _ctrl_ignore (false)
+	, _spin_ignore (false)
+	, _controllable (c)
+	, _printer (p)
+{
+	add_events (Gdk::BUTTON_PRESS_MASK | Gdk::BUTTON_RELEASE_MASK);
+	set (.5, .5, 1.0, 1.0);
+	set_border_width (0);
+
+	_btn.set_controllable (c);
+	_btn.set_fallthrough_to_parent (true);
+
+	_spinner.signal_activate().connect (mem_fun (*this, &ArdourSpinner::entry_activated));
+	_spinner.signal_focus_out_event().connect (mem_fun (*this, &ArdourSpinner::entry_focus_out));
+	_spinner.set_digits (4);
+	_spinner.set_numeric (true);
+	_spinner.set_name ("BarControlSpinner");
+
+	_spin_adj.set_step_increment(c->interface_to_internal(_ctrl_adj->get_step_increment()) - c->lower ());
+	_spin_adj.set_page_increment(c->interface_to_internal(_ctrl_adj->get_page_increment()) - c->lower ());
+
+	_spin_adj.signal_value_changed().connect (sigc::mem_fun(*this, &ArdourSpinner::spin_adjusted));
+	adj->signal_value_changed().connect (sigc::mem_fun(*this, &ArdourSpinner::ctrl_adjusted));
+	c->Changed.connect (watch_connection, invalidator(*this), boost::bind (&ArdourSpinner::controllable_changed, this), gui_context());
+
+
+	// this assume the "upper" value needs most space.
+	std::string txt = ARDOUR::value_as_string (c->desc(), c->upper ());
+	Gtkmm2ext::set_size_request_to_display_given_text (*this, txt, 2, 2);
+
+	add (_btn);
+	show_all ();
+
+	controllable_changed();
+	ctrl_adjusted ();
+}
+
+
+ArdourSpinner::~ArdourSpinner ()
+{
+}
+
+bool
+ArdourSpinner::on_button_press_event (GdkEventButton* ev)
+{
+	if (get_child() != &_btn) {
+		return false;
+	}
+
+	if (ev->button == 1 && ev->type == GDK_2BUTTON_PRESS) {
+		_switch_on_release = true;
+		return true;
+	} else {
+		_switch_on_release = false;
+	}
+	return false;
+}
+
+bool
+ArdourSpinner::on_button_release_event (GdkEventButton* ev)
+{
+	if (get_child() != &_btn) {
+		return false;
+	}
+	if (ev->button == 1 && _switch_on_release) {
+		Glib::signal_idle().connect (mem_fun (*this, &ArdourSpinner::switch_to_spinner));
+		return true;
+	}
+	return false;
+}
+
+bool
+ArdourSpinner::on_scroll_event (GdkEventScroll* ev)
+{
+	float scale = 1.0;
+	if (ev->state & Gtkmm2ext::Keyboard::GainFineScaleModifier) {
+		if (ev->state & Gtkmm2ext::Keyboard::GainExtraFineScaleModifier) {
+			scale *= 0.01;
+		} else {
+			scale *= 0.10;
+		}
+	}
+
+	boost::shared_ptr<PBD::Controllable> c = _btn.get_controllable();
+	if (c) {
+		float val = c->get_interface();
+
+		if ( ev->direction == GDK_SCROLL_UP )
+			val += 0.05 * scale;  //by default, we step in 1/20ths of the knob travel
+		else
+			val -= 0.05 * scale;
+
+		c->set_interface(val);
+	}
+
+	return true;
+}
+
+gint
+ArdourSpinner::switch_to_button ()
+{
+	if (_switching || get_child() == &_btn) {
+		return false;
+	}
+	_switching = true;
+	remove ();
+	add (_btn);
+	_btn.show ();
+	_btn.set_dirty ();
+	_switching = false;
+	return false;
+}
+
+gint
+ArdourSpinner::switch_to_spinner ()
+{
+	if (_switching || get_child() != &_btn) {
+		return false;
+	}
+	_switching = true;
+	remove ();
+	add (_spinner);
+	_spinner.show ();
+	_spinner.select_region (0, _spinner.get_text_length ());
+	_spinner.grab_focus ();
+	_switching = false;
+	return false;
+}
+
+void
+ArdourSpinner::entry_activated ()
+{
+	switch_to_button ();
+}
+
+bool
+ArdourSpinner::entry_focus_out (GdkEventFocus* /*ev*/)
+{
+	entry_activated ();
+	return true;
+}
+
+void
+ArdourSpinner::ctrl_adjusted ()
+{
+	if (_spin_ignore) {
+		return;
+	}
+	_ctrl_ignore = true;
+	_spin_adj.set_value (_controllable->interface_to_internal (_ctrl_adj->get_value ()));
+	_ctrl_ignore = false;
+}
+
+void
+ArdourSpinner::spin_adjusted ()
+{
+	if (_ctrl_ignore) {
+		return;
+	}
+	_spin_ignore = true;
+	_ctrl_adj->set_value (_controllable->internal_to_interface (_spin_adj.get_value ()));
+	_spin_ignore = false;
+}
+
+void
+ArdourSpinner::controllable_changed ()
+{
+	if (_printer) {
+		_btn.set_text (_printer->value_as_string (_controllable));
+	} else {
+		_btn.set_text (_controllable->get_user_string());
+	}
+	_btn.set_dirty();
+}
diff --git a/gtk2_ardour/ardour_spinner.h b/gtk2_ardour/ardour_spinner.h
new file mode 100644
index 0000000..de8c9a1
--- /dev/null
+++ b/gtk2_ardour/ardour_spinner.h
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+ * Copyright (C) 2011 Paul Davis
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+
+#include <boost/algorithm/string.hpp>
+#ifndef __gtk2_ardour_ardour_spinner_h__
+#define __gtk2_ardour_ardour_spinner_h__
+
+#include <gtkmm.h>
+
+#include "ardour/automatable.h"
+#include "ardour/automation_control.h"
+#include "ardour_button.h"
+
+class ArdourSpinner : public Gtk::Alignment
+{
+	public:
+		ArdourSpinner (
+				boost::shared_ptr<ARDOUR::AutomationControl>,
+				Gtk::Adjustment* adj,
+				boost::shared_ptr<ARDOUR::Automatable>);
+
+		virtual ~ArdourSpinner ();
+
+	protected:
+		bool on_button_press_event (GdkEventButton*);
+		bool on_button_release_event (GdkEventButton*);
+		bool on_scroll_event (GdkEventScroll* ev);
+
+		void controllable_changed ();
+		PBD::ScopedConnection watch_connection;
+
+	private:
+
+		bool entry_focus_out (GdkEventFocus*);
+		void entry_activated ();
+		gint switch_to_button ();
+		gint switch_to_spinner ();
+
+		void ctrl_adjusted();
+		void spin_adjusted();
+
+		ArdourButton     _btn;
+		Gtk::Adjustment* _ctrl_adj;
+		Gtk::Adjustment  _spin_adj;
+		Gtk::SpinButton  _spinner;
+		bool             _switching;
+		bool             _switch_on_release;
+		bool             _ctrl_ignore;
+		bool             _spin_ignore;
+
+		boost::shared_ptr<ARDOUR::AutomationControl> _controllable;
+		boost::shared_ptr<ARDOUR::Automatable>       _printer;
+
+};
+
+#endif /* __gtk2_ardour_ardour_menu_h__ */
diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc
index 4d6a0a7..e9cf5b2 100644
--- a/gtk2_ardour/ardour_ui.cc
+++ b/gtk2_ardour/ardour_ui.cc
@@ -33,6 +33,11 @@
 #include <sys/resource.h>
 #endif
 
+#ifdef __FreeBSD__
+#include <sys/types.h>
+#include <sys/sysctl.h>
+#endif
+
 #include <stdint.h>
 #include <fcntl.h>
 #include <signal.h>
@@ -44,10 +49,12 @@
 
 #include <gtkmm/messagedialog.h>
 #include <gtkmm/accelmap.h>
+#include <gtkmm/stock.h>
 
 #include "pbd/error.h"
 #include "pbd/basename.h"
 #include "pbd/compose.h"
+#include "pbd/convert.h"
 #include "pbd/failed_constructor.h"
 #include "pbd/enumwriter.h"
 #include "pbd/memento_command.h"
@@ -70,6 +77,7 @@
 
 #include "ardour/ardour.h"
 #include "ardour/audio_backend.h"
+#include "ardour/audio_track.h"
 #include "ardour/audioengine.h"
 #include "ardour/audiofilesource.h"
 #include "ardour/automation_watch.h"
@@ -77,11 +85,13 @@
 #include "ardour/filename_extensions.h"
 #include "ardour/filesystem_paths.h"
 #include "ardour/ltc_file_reader.h"
+#include "ardour/midi_track.h"
 #include "ardour/port.h"
 #include "ardour/plugin_manager.h"
 #include "ardour/process_thread.h"
 #include "ardour/profile.h"
 #include "ardour/recent_sessions.h"
+#include "ardour/record_enable_control.h"
 #include "ardour/session_directory.h"
 #include "ardour/session_route.h"
 #include "ardour/session_state_utils.h"
@@ -89,6 +99,11 @@
 #include "ardour/source_factory.h"
 #include "ardour/slave.h"
 #include "ardour/system_exec.h"
+#include "ardour/track.h"
+#include "ardour/vca_manager.h"
+#include "ardour/utils.h"
+
+#include "LuaBridge/LuaBridge.h"
 
 #ifdef WINDOWS_VST_SUPPORT
 #include <fst.h>
@@ -97,6 +112,11 @@
 #include "ardour/audio_unit.h"
 #endif
 
+// fix for OSX (nsm.h has a check function, AU/Apple defines check)
+#ifdef check
+#undef check
+#endif
+
 #include "timecode/time.h"
 
 typedef uint64_t microseconds_t;
@@ -112,6 +132,7 @@ typedef uint64_t microseconds_t;
 #include "big_clock_window.h"
 #include "bundle_manager.h"
 #include "duplicate_routes_dialog.h"
+#include "debug.h"
 #include "engine_dialog.h"
 #include "export_video_dialog.h"
 #include "export_video_infobox.h"
@@ -122,6 +143,8 @@ typedef uint64_t microseconds_t;
 #include "keyboard.h"
 #include "keyeditor.h"
 #include "location_ui.h"
+#include "lua_script_manager.h"
+#include "luawindow.h"
 #include "main_clock.h"
 #include "missing_file_dialog.h"
 #include "missing_plugin_dialog.h"
@@ -138,6 +161,7 @@ typedef uint64_t microseconds_t;
 #include "route_time_axis.h"
 #include "route_params_ui.h"
 #include "save_as_dialog.h"
+#include "script_selector.h"
 #include "session_dialog.h"
 #include "session_metadata_dialog.h"
 #include "session_option_editor.h"
@@ -153,7 +177,7 @@ typedef uint64_t microseconds_t;
 #include "add_video_dialog.h"
 #include "transcode_video_dialog.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 using namespace ARDOUR_UI_UTILS;
@@ -212,19 +236,23 @@ libxml_structured_error_func (void* /* parsing_context*/,
 
 	replace_all (msg, "\n", "");
 
-	if (err->file && err->line) {
-		error << X_("XML error: ") << msg << " in " << err->file << " at line " << err->line;
+	if (!msg.empty()) {
+		if (err->file && err->line) {
+			error << X_("XML error: ") << msg << " in " << err->file << " at line " << err->line;
 
-		if (err->int2) {
-			error << ':' << err->int2;
+			if (err->int2) {
+				error << ':' << err->int2;
+			}
+
+			error << endmsg;
+		} else {
+			error << X_("XML error: ") << msg << endmsg;
 		}
 	}
-	error << endmsg;
 }
 
 
 ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir)
-
 	: Gtkmm2ext::UI (PROGRAM_NAME, X_("gui"), argcp, argvp)
 	, session_loaded (false)
 	, gui_object_state (new GUIObjectState)
@@ -232,7 +260,9 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir)
 	, secondary_clock (new MainClock (X_("secondary"), X_("secondary"), false))
 	, big_clock (new AudioClock (X_("bigclock"), false, "big", true, true, false, false))
 	, video_timeline(0)
+	, global_actions (X_("global"))
 	, ignore_dual_punch (false)
+	, main_window_visibility (0)
 	, editor (0)
 	, mixer (0)
 	, nsm (0)
@@ -261,21 +291,23 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir)
 	, last_key_press_time (0)
 	, save_as_dialog (0)
 	, meterbridge (0)
+	, luawindow (0)
+	, rc_option_editor (0)
 	, speaker_config_window (X_("speaker-config"), _("Speaker Configuration"))
-	, key_editor (X_("key-editor"), _("Key Bindings"))
-	, rc_option_editor (X_("rc-options-editor"), _("Preferences"))
 	, add_route_dialog (X_("add-routes"), _("Add Tracks/Busses"))
 	, about (X_("about"), _("About"))
-	, location_ui (X_("locations"), _("Locations"))
+	, location_ui (X_("locations"), S_("Ranges|Locations"))
 	, route_params (X_("inspector"), _("Tracks and Busses"))
 	, audio_midi_setup (X_("audio-midi-setup"), _("Audio/MIDI Setup"))
 	, export_video_dialog (X_("video-export"), _("Video Export Dialog"))
+	, lua_script_window (X_("script-manager"), _("Script Manager"))
 	, session_option_editor (X_("session-options-editor"), _("Properties"), boost::bind (&ARDOUR_UI::create_session_option_editor, this))
-	, add_video_dialog (X_("add-video"), _("Add Tracks/Busses"), boost::bind (&ARDOUR_UI::create_add_video_dialog, this))
+	, add_video_dialog (X_("add-video"), _("Add Video"), boost::bind (&ARDOUR_UI::create_add_video_dialog, this))
 	, bundle_manager (X_("bundle-manager"), _("Bundle Manager"), boost::bind (&ARDOUR_UI::create_bundle_manager, this))
 	, big_clock_window (X_("big-clock"), _("Big Clock"), boost::bind (&ARDOUR_UI::create_big_clock_window, this))
 	, audio_port_matrix (X_("audio-connection-manager"), _("Audio Connections"), boost::bind (&ARDOUR_UI::create_global_port_matrix, this, ARDOUR::DataType::AUDIO))
 	, midi_port_matrix (X_("midi-connection-manager"), _("MIDI Connections"), boost::bind (&ARDOUR_UI::create_global_port_matrix, this, ARDOUR::DataType::MIDI))
+	, key_editor (X_("key-editor"), _("Bindings Editor"), boost::bind (&ARDOUR_UI::create_key_editor, this))
 	, video_server_process (0)
 	, splash (0)
 	, have_configure_timeout (false)
@@ -286,6 +318,9 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir)
 	, _feedback_exists (false)
 	, _log_not_acknowledged (LogLevelNone)
 	, duplicate_routes_dialog (0)
+	, editor_visibility_button (S_("Window|Editor"))
+	, mixer_visibility_button (S_("Window|Mixer"))
+	, prefs_visibility_button (S_("Window|Preferences"))
 {
 	Gtkmm2ext::init (localedir);
 
@@ -298,10 +333,22 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir)
 		_exit (0);
 	}
 
+
+	if (string (VERSIONSTRING).find (".pre") != string::npos) {
+		/* check this is not being run from ./ardev etc. */
+		if (!running_from_source_tree ()) {
+			pre_release_dialog ();
+		}
+	}
+
 	if (theArdourUI == 0) {
 		theArdourUI = this;
 	}
 
+	/* track main window visibility */
+
+	main_window_visibility = new VisibilityTracker (_main_window);
+
 	/* stop libxml from spewing to stdout/stderr */
 
 	xmlSetGenericErrorFunc (this, libxml_generic_error_func);
@@ -349,6 +396,9 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir)
 
 	ARDOUR::Session::AskAboutSampleRateMismatch.connect_same_thread (forever_connections, boost::bind (&ARDOUR_UI::sr_mismatch_dialog, this, _1, _2));
 
+	/* handle sr mismatch with a dialog - cross-thread from engine */
+	ARDOUR::Session::NotifyAboutSampleRateMismatch.connect (forever_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::sr_mismatch_message, this, _1, _2), gui_context ());
+
 	/* handle requests to quit (coming from JACK session) */
 
 	ARDOUR::Session::Quit.connect (forever_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::finish, this), gui_context ());
@@ -391,9 +441,6 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir)
 		keyboard->set_state (*node, Stateful::loading_state_version);
 	}
 
-	/* we don't like certain modifiers */
-	Bindings::set_ignored_state (GDK_LOCK_MASK|GDK_MOD2_MASK|GDK_MOD3_MASK);
-
 	UIConfiguration::instance().reset_dpi ();
 
 	TimeAxisViewItem::set_constant_heights ();
@@ -407,24 +454,25 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir)
 	const XMLNode* ui_xml = Config->extra_xml (X_("UI"));
 
 	if (ui_xml) {
-		key_editor.set_state (*ui_xml);
-		rc_option_editor.set_state (*ui_xml);
-		session_option_editor.set_state (*ui_xml);
-		speaker_config_window.set_state (*ui_xml);
-		about.set_state (*ui_xml);
-		add_route_dialog.set_state (*ui_xml);
-		add_video_dialog.set_state (*ui_xml);
-		route_params.set_state (*ui_xml);
-		bundle_manager.set_state (*ui_xml);
-		location_ui.set_state (*ui_xml);
-		big_clock_window.set_state (*ui_xml);
-		audio_port_matrix.set_state (*ui_xml);
-		midi_port_matrix.set_state (*ui_xml);
-		export_video_dialog.set_state (*ui_xml);
-	}
+		key_editor.set_state (*ui_xml, 0);
+		session_option_editor.set_state (*ui_xml, 0);
+		speaker_config_window.set_state (*ui_xml, 0);
+		about.set_state (*ui_xml, 0);
+		add_route_dialog.set_state (*ui_xml, 0);
+		add_video_dialog.set_state (*ui_xml, 0);
+		route_params.set_state (*ui_xml, 0);
+		bundle_manager.set_state (*ui_xml, 0);
+		location_ui.set_state (*ui_xml, 0);
+		big_clock_window.set_state (*ui_xml, 0);
+		audio_port_matrix.set_state (*ui_xml, 0);
+		midi_port_matrix.set_state (*ui_xml, 0);
+		export_video_dialog.set_state (*ui_xml, 0);
+		lua_script_window.set_state (*ui_xml, 0);
+	}
+
+	/* Separate windows */
 
 	WM::Manager::instance().register_window (&key_editor);
-	WM::Manager::instance().register_window (&rc_option_editor);
 	WM::Manager::instance().register_window (&session_option_editor);
 	WM::Manager::instance().register_window (&speaker_config_window);
 	WM::Manager::instance().register_window (&about);
@@ -433,12 +481,16 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir)
 	WM::Manager::instance().register_window (&route_params);
 	WM::Manager::instance().register_window (&audio_midi_setup);
 	WM::Manager::instance().register_window (&export_video_dialog);
+	WM::Manager::instance().register_window (&lua_script_window);
 	WM::Manager::instance().register_window (&bundle_manager);
 	WM::Manager::instance().register_window (&location_ui);
 	WM::Manager::instance().register_window (&big_clock_window);
 	WM::Manager::instance().register_window (&audio_port_matrix);
 	WM::Manager::instance().register_window (&midi_port_matrix);
 
+	/* do not retain position for add route dialog */
+	add_route_dialog.set_state_mask (WindowProxy::Size);
+
 	/* Trigger setting up the color scheme and loading the GTK RC file */
 
 	UIConfiguration::instance().load_rc_file (false);
@@ -451,6 +503,40 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir)
 	attach_to_engine ();
 }
 
+void
+ARDOUR_UI::pre_release_dialog ()
+{
+	ArdourDialog d (_("Pre-Release Warning"), true, false);
+	d.add_button (Gtk::Stock::OK, Gtk::RESPONSE_OK);
+
+        Label* label = manage (new Label);
+        label->set_markup (string_compose (_("<b>Welcome to this pre-release build of %1 %2</b>\n\n\
+There are still several issues and bugs to be worked on,\n\
+as well as general workflow improvements, before this can be considered\n\
+release software. So, a few guidelines:\n\
+\n\
+1) Please do <b>NOT</b> use this software with the expectation that it is stable or reliable\n\
+   though it may be so, depending on your workflow.\n\
+2) Please wait for a helpful writeup of new features.\n\
+3) <b>Please do NOT use the forums at ardour.org to report issues</b>.\n\
+4) Please <b>DO</b> use the bugtracker at http://tracker.ardour.org/ to report issues\n\
+   making sure to note the product version number as 5.0-pre.\n\
+5) Please <b>DO</b> use the ardour-users mailing list to discuss ideas and pass on comments.\n\
+6) Please <b>DO</b> join us on IRC for real time discussions about %1 %2. You\n\
+   can get there directly from within the program via the Help->Chat menu option.\n\
+\n\
+Full information on all the above can be found on the support page at\n\
+\n\
+                http://ardour.org/support\n\
+"), PROGRAM_NAME, VERSIONSTRING));
+
+        d.get_vbox()->set_border_width (12);
+        d.get_vbox()->pack_start (*label, false, false, 12);
+        d.get_vbox()->show_all ();
+
+        d.run ();
+}
+
 GlobalPortMatrixWindow*
 ARDOUR_UI::create_global_port_matrix (ARDOUR::DataType type)
 {
@@ -533,7 +619,7 @@ was not fast enough. Try to restart\n\
 the audio backend and save the session."), PROGRAM_NAME);
 	}
 
-	MessageDialog msg (*editor, msgstr);
+	MessageDialog msg (_main_window, msgstr);
 	pop_back_splash (msg);
 	msg.run ();
 
@@ -578,22 +664,32 @@ ARDOUR_UI::post_engine ()
 
 	check_memory_locking();
 
-	/* this is the first point at which all the keybindings are available */
+	/* this is the first point at which all the possible actions are
+	 * available, because some of the available actions are dependent on
+	 * aspects of the engine/backend.
+	 */
 
 	if (ARDOUR_COMMAND_LINE::show_key_actions) {
-		vector<string> names;
+
+
 		vector<string> paths;
+		vector<string> labels;
 		vector<string> tooltips;
 		vector<string> keys;
-		vector<AccelKey> bindings;
+		vector<Glib::RefPtr<Gtk::Action> > actions;
 
-		ActionManager::get_all_actions (names, paths, tooltips, keys, bindings);
+		Gtkmm2ext::ActionMap::get_all_actions (paths, labels, tooltips, keys, actions);
 
-		vector<string>::iterator n;
 		vector<string>::iterator k;
 		vector<string>::iterator p;
-		for (n = names.begin(), k = keys.begin(), p = paths.begin(); n != names.end(); ++n, ++k, ++p) {
-			cout << "Action: '" << (*n) << "' bound to '" << (*k) << "' Path: '" << (*p) << "'" << endl;
+
+		for (p = paths.begin(), k = keys.begin(); p != paths.end(); ++k, ++p) {
+
+			if ((*k).empty()) {
+				cout << *p << endl;
+			} else {
+				cout << *p << " => " << *k << endl;
+			}
 		}
 
 		halt_connection.disconnect ();
@@ -608,17 +704,12 @@ ARDOUR_UI::post_engine ()
 
 	/* set default clock modes */
 
-	if (Profile->get_sae()) {
-		primary_clock->set_mode (AudioClock::BBT);
-		secondary_clock->set_mode (AudioClock::MinSec);
-	}  else {
-		primary_clock->set_mode (AudioClock::Timecode);
-		secondary_clock->set_mode (AudioClock::BBT);
-	}
+	primary_clock->set_mode (AudioClock::Timecode);
+	secondary_clock->set_mode (AudioClock::BBT);
 
 	/* start the time-of-day-clock */
 
-#ifndef GTKOSX
+#ifndef __APPLE__
 	/* OS X provides a nearly-always visible wallclock, so don't be stupid */
 	update_wall_clock ();
 	Glib::signal_timeout().connect_seconds (sigc::mem_fun(*this, &ARDOUR_UI::update_wall_clock), 1);
@@ -642,15 +733,17 @@ ARDOUR_UI::~ARDOUR_UI ()
 
 	if (getenv ("ARDOUR_RUNNING_UNDER_VALGRIND")) {
 		// don't bother at 'real' exit. the OS cleans up for us.
-		delete big_clock;
-		delete primary_clock;
-		delete secondary_clock;
-		delete _process_thread;
-		delete meterbridge;
-		delete editor;
-		delete mixer;
-		delete nsm;
-		delete gui_object_state;
+		delete big_clock; big_clock = 0;
+		delete primary_clock; primary_clock = 0;
+		delete secondary_clock; secondary_clock = 0;
+		delete _process_thread; _process_thread = 0;
+		delete meterbridge; meterbridge = 0;
+		delete luawindow; luawindow = 0;
+		delete editor; editor = 0;
+		delete mixer; mixer = 0;
+		delete nsm; nsm = 0;
+		delete gui_object_state; gui_object_state = 0;
+		delete main_window_visibility;
 		FastMeter::flush_pattern_cache ();
 		PixFader::flush_pattern_cache ();
 	}
@@ -709,7 +802,7 @@ ARDOUR_UI::configure_handler (GdkEventConfigure* /*conf*/)
 void
 ARDOUR_UI::set_transport_controllable_state (const XMLNode& node)
 {
-	const XMLProperty* prop;
+	XMLProperty const * prop;
 
 	if ((prop = node.property ("roll")) != 0) {
 		roll_controllable->set_id (prop->value());
@@ -794,10 +887,15 @@ ARDOUR_UI::autosave_session ()
 }
 
 void
-ARDOUR_UI::update_autosave ()
+ARDOUR_UI::session_dirty_changed ()
 {
-	ENSURE_GUI_THREAD (*this, &ARDOUR_UI::update_autosave)
+	update_autosave ();
+	update_title ();
+}
 
+void
+ARDOUR_UI::update_autosave ()
+{
 	if (_session && _session->dirty()) {
 		if (_autosave_connection.connected()) {
 			_autosave_connection.disconnect();
@@ -848,6 +946,13 @@ ARDOUR_UI::check_announcements ()
 #endif
 }
 
+static bool
+_hide_splash (gpointer arg)
+{
+	((ARDOUR_UI*)arg)->hide_splash();
+	return false;
+}
+
 int
 ARDOUR_UI::starting ()
 {
@@ -1020,8 +1125,6 @@ ARDOUR_UI::starting ()
 
 	use_config ();
 
-	goto_editor_window ();
-
 	WM::Manager::instance().show_visible ();
 
 	/* We have to do this here since goto_editor_window() ends up calling show_all() on the
@@ -1030,6 +1133,14 @@ ARDOUR_UI::starting ()
 	_status_bar_visibility.update ();
 
 	BootMessage (string_compose (_("%1 is ready for use"), PROGRAM_NAME));
+
+	if (splash && splash->is_visible()) {
+		// in 1 second, hide the splash screen
+		Glib::signal_timeout().connect (sigc::bind (sigc::ptr_fun (_hide_splash), this), 1000);
+	}
+
+	/* all other dialogs are created conditionally */
+
 	return 0;
 }
 
@@ -1097,7 +1208,6 @@ ARDOUR_UI::check_memory_locking ()
 
 				pop_back_splash (msg);
 
-				editor->ensure_float (msg);
 				msg.run ();
 
 				if (cb.get_active()) {
@@ -1143,7 +1253,7 @@ ARDOUR_UI::finish()
 				/* use the default name */
 				if (save_state_canfail ("")) {
 					/* failed - don't quit */
-					MessageDialog msg (*editor,
+					MessageDialog msg (_main_window,
 							   string_compose (_("\
 %1 was unable to save your session.\n\n\
 If you still wish to quit, please use the\n\n\
@@ -1514,7 +1624,7 @@ void
 ARDOUR_UI::count_recenabled_streams (Route& route)
 {
 	Track* track = dynamic_cast<Track*>(&route);
-	if (track && track->record_enabled()) {
+	if (track && track->rec_enable_control()->get_value()) {
 		rec_enabled_streams += track->n_inputs().n_total();
 	}
 }
@@ -1665,6 +1775,10 @@ ARDOUR_UI::open_recent_session ()
 
 		can_return = false;
 	}
+	if (splash && splash->is_visible()) {
+		// in 1 second, hide the splash screen
+		Glib::signal_timeout().connect (sigc::bind (sigc::ptr_fun (_hide_splash), this), 1000);
+	}
 }
 
 bool
@@ -1672,8 +1786,8 @@ ARDOUR_UI::check_audioengine (Gtk::Window& parent)
 {
 	if (!AudioEngine::instance()->connected()) {
 		MessageDialog msg (parent, string_compose (
-					   _("%1 is not connected to any audio backend.\n"
-					     "You cannot open or close sessions in this condition"),
+			                   _("%1 is not connected to any audio backend.\n"
+			                     "You cannot open or close sessions in this condition"),
 					   PROGRAM_NAME));
 		pop_back_splash (msg);
 		msg.run ();
@@ -1685,7 +1799,7 @@ ARDOUR_UI::check_audioengine (Gtk::Window& parent)
 void
 ARDOUR_UI::open_session ()
 {
-	if (!check_audioengine(*editor)) {
+	if (!check_audioengine (_main_window)) {
 		return;
 	}
 
@@ -1737,10 +1851,27 @@ ARDOUR_UI::open_session ()
 	}
 }
 
+void
+ARDOUR_UI::session_add_vca (const string& name_template, uint32_t n)
+{
+	if (!_session) {
+		return;
+	}
+
+	_session->vca_manager().create_vca (n, name_template);
+}
 
 void
-ARDOUR_UI::session_add_mixed_track (const ChanCount& input, const ChanCount& output, RouteGroup* route_group,
-				    uint32_t how_many, const string& name_template, PluginInfoPtr instrument)
+ARDOUR_UI::session_add_mixed_track (
+		const ChanCount& input,
+		const ChanCount& output,
+		RouteGroup* route_group,
+		uint32_t how_many,
+		const string& name_template,
+		bool strict_io,
+		PluginInfoPtr instrument,
+		Plugin::PresetRecord* pset,
+		ARDOUR::PresentationInfo::order_t order)
 {
 	list<boost::shared_ptr<MidiTrack> > tracks;
 
@@ -1750,7 +1881,7 @@ ARDOUR_UI::session_add_mixed_track (const ChanCount& input, const ChanCount& out
 	}
 
 	try {
-		tracks = _session->new_midi_track (input, output, instrument, ARDOUR::Normal, route_group, how_many, name_template);
+		tracks = _session->new_midi_track (input, output, instrument, pset, route_group, how_many, name_template, order, ARDOUR::Normal);
 
 		if (tracks.size() != how_many) {
 			error << string_compose(P_("could not create %1 new mixed track", "could not create %1 new mixed tracks", how_many), how_many) << endmsg;
@@ -1758,24 +1889,72 @@ ARDOUR_UI::session_add_mixed_track (const ChanCount& input, const ChanCount& out
 	}
 
 	catch (...) {
-		MessageDialog msg (*editor,
-				   string_compose (_("There are insufficient ports available\n\
-to create a new track or bus.\n\
-You should save %1, exit and\n\
-restart with more ports."), PROGRAM_NAME));
-		msg.run ();
+		display_insufficient_ports_message ();
+		return;
+	}
+
+	if (strict_io) {
+		for (list<boost::shared_ptr<MidiTrack> >::iterator i = tracks.begin(); i != tracks.end(); ++i) {
+			(*i)->set_strict_io (true);
+		}
 	}
 }
 
+void
+ARDOUR_UI::session_add_midi_bus (
+		RouteGroup* route_group,
+		uint32_t how_many,
+		const string& name_template,
+		bool strict_io,
+		PluginInfoPtr instrument,
+		Plugin::PresetRecord* pset,
+		ARDOUR::PresentationInfo::order_t order)
+{
+	RouteList routes;
+
+	if (_session == 0) {
+		warning << _("You cannot add a track without a session already loaded.") << endmsg;
+		return;
+	}
+
+	try {
+
+		routes = _session->new_midi_route (route_group, how_many, name_template, instrument, pset, PresentationInfo::MidiBus, order);
+		if (routes.size() != how_many) {
+			error << string_compose(P_("could not create %1 new Midi Bus", "could not create %1 new Midi Busses", how_many), how_many) << endmsg;
+		}
+
+	}
+	catch (...) {
+		display_insufficient_ports_message ();
+		return;
+	}
+
+	if (strict_io) {
+		for (RouteList::iterator i = routes.begin(); i != routes.end(); ++i) {
+			(*i)->set_strict_io (true);
+		}
+	}
+}
 
 void
-ARDOUR_UI::session_add_midi_route (bool disk, RouteGroup* route_group, uint32_t how_many, const string& name_template, PluginInfoPtr instrument)
+ARDOUR_UI::session_add_midi_route (
+		bool disk,
+		RouteGroup* route_group,
+		uint32_t how_many,
+		const string& name_template,
+		bool strict_io,
+		PluginInfoPtr instrument,
+		Plugin::PresetRecord* pset,
+		ARDOUR::PresentationInfo::order_t order)
 {
 	ChanCount one_midi_channel;
 	one_midi_channel.set (DataType::MIDI, 1);
 
 	if (disk) {
-		session_add_mixed_track (one_midi_channel, one_midi_channel, route_group, how_many, name_template, instrument);
+		session_add_mixed_track (one_midi_channel, one_midi_channel, route_group, how_many, name_template, strict_io, instrument, pset, order);
+	} else {
+		session_add_midi_bus (route_group, how_many, name_template, strict_io, instrument, pset, order);
 	}
 }
 
@@ -1787,8 +1966,9 @@ ARDOUR_UI::session_add_audio_route (
 	ARDOUR::TrackMode mode,
 	RouteGroup* route_group,
 	uint32_t how_many,
-	string const & name_template
-	)
+	string const & name_template,
+	bool strict_io,
+	ARDOUR::PresentationInfo::order_t order)
 {
 	list<boost::shared_ptr<AudioTrack> > tracks;
 	RouteList routes;
@@ -1800,7 +1980,7 @@ ARDOUR_UI::session_add_audio_route (
 
 	try {
 		if (track) {
-			tracks = _session->new_audio_track (input_channels, output_channels, mode, route_group, how_many, name_template);
+			tracks = _session->new_audio_track (input_channels, output_channels, route_group, how_many, name_template, order, mode);
 
 			if (tracks.size() != how_many) {
 				error << string_compose (P_("could not create %1 new audio track", "could not create %1 new audio tracks", how_many), how_many)
@@ -1809,7 +1989,7 @@ ARDOUR_UI::session_add_audio_route (
 
 		} else {
 
-			routes = _session->new_audio_route (input_channels, output_channels, route_group, how_many, name_template);
+			routes = _session->new_audio_route (input_channels, output_channels, route_group, how_many, name_template, PresentationInfo::AudioBus, order);
 
 			if (routes.size() != how_many) {
 				error << string_compose (P_("could not create %1 new audio bus", "could not create %1 new audio busses", how_many), how_many)
@@ -1819,14 +1999,30 @@ ARDOUR_UI::session_add_audio_route (
 	}
 
 	catch (...) {
-		MessageDialog msg (*editor,
-				   string_compose (_("There are insufficient ports available\n\
+		display_insufficient_ports_message ();
+		return;
+	}
+
+	if (strict_io) {
+		for (list<boost::shared_ptr<AudioTrack> >::iterator i = tracks.begin(); i != tracks.end(); ++i) {
+			(*i)->set_strict_io (true);
+		}
+		for (RouteList::iterator i = routes.begin(); i != routes.end(); ++i) {
+			(*i)->set_strict_io (true);
+		}
+	}
+}
+
+void
+ARDOUR_UI::display_insufficient_ports_message ()
+{
+	MessageDialog msg (_main_window,
+			string_compose (_("There are insufficient ports available\n\
 to create a new track or bus.\n\
 You should save %1, exit and\n\
 restart with more ports."), PROGRAM_NAME));
-		pop_back_splash (msg);
-		msg.run ();
-	}
+	pop_back_splash (msg);
+	msg.run ();
 }
 
 void
@@ -1945,14 +2141,14 @@ ARDOUR_UI::trx_record_enable_all_tracks ()
 		boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*r);
 		assert (t);
 
-		if (t->record_enabled()) {
+		if (t->rec_enable_control()->get_value()) {
 			none_record_enabled = false;
 			break;
 		}
 	}
 
 	if (none_record_enabled) {
-		_session->set_record_enabled (rl, true, Session::rt_cleanup);
+		_session->set_controls (route_list_to_control_list (rl, &Stripable::rec_enable_control), 1.0, Controllable::NoGroup);
 	}
 
 	return none_record_enabled;
@@ -1965,7 +2161,7 @@ ARDOUR_UI::transport_record (bool roll)
 		switch (_session->record_status()) {
 		case Session::Disabled:
 			if (_session->ntracks() == 0) {
-				MessageDialog msg (*editor, _("Please create one or more tracks before trying to record.\nYou can do this with the \"Add Track or Bus\" option in the Session menu."));
+				MessageDialog msg (_main_window, _("Please create one or more tracks before trying to record.\nYou can do this with the \"Add Track or Bus\" option in the Session menu."));
 				msg.run ();
 				return;
 			}
@@ -2110,7 +2306,12 @@ ARDOUR_UI::toggle_roll (bool with_abort, bool roll_out_of_bounded_mode)
 	if (affect_transport) {
 		if (rolling) {
 			_session->request_stop (with_abort, true);
-		} else {
+
+		} else if (!with_abort) { /* with_abort == true means the
+		                           * command was intended to stop
+		                           * transport, not start.
+		                           */
+
 			/* the only external sync condition we can be in here
 			 * would be Engine (JACK) sync, in which case we still
 			 * want to do this.
@@ -2237,7 +2438,7 @@ ARDOUR_UI::transport_forward (int option)
 }
 
 void
-ARDOUR_UI::toggle_record_enable (uint32_t rid)
+ARDOUR_UI::toggle_record_enable (uint16_t rid)
 {
 	if (!_session) {
 		return;
@@ -2245,12 +2446,12 @@ ARDOUR_UI::toggle_record_enable (uint32_t rid)
 
 	boost::shared_ptr<Route> r;
 
-	if ((r = _session->route_by_remote_id (rid)) != 0) {
+	if ((r = _session->get_remote_nth_route (rid)) != 0) {
 
 		boost::shared_ptr<Track> t;
 
 		if ((t = boost::dynamic_pointer_cast<Track>(r)) != 0) {
-			t->set_record_enabled (!t->record_enabled(), Controllable::UseGroup);
+			t->rec_enable_control()->set_value (!t->rec_enable_control()->get_value(), Controllable::UseGroup);
 		}
 	}
 }
@@ -2520,7 +2721,7 @@ ARDOUR_UI::snapshot_session (bool switch_to_it)
 	prompter.set_name ("Prompter");
 	prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
 	if (switch_to_it) {
-		prompter.set_title (_("Save as..."));
+		prompter.set_title (_("Snapshot and switch"));
 		prompter.set_prompt (_("New session name"));
 	} else {
 		prompter.set_title (_("Take Snapshot"));
@@ -2739,7 +2940,7 @@ ARDOUR_UI::save_template ()
 {
 	ArdourPrompter prompter (true);
 
-	if (!check_audioengine(*editor)) {
+	if (!check_audioengine (_main_window)) {
 		return;
 	}
 
@@ -2811,7 +3012,7 @@ ARDOUR_UI::build_session_from_dialog (SessionDialog& sd, const std::string& sess
 {
 	BusProfile bus_profile;
 
-	if (nsm || Profile->get_sae()) {
+	if (nsm) {
 
 		bus_profile.master_out_channels = 2;
 		bus_profile.input_ac = AutoConnectPhysical;
@@ -2899,8 +3100,6 @@ ARDOUR_UI::load_from_application_api (const std::string& path)
 		if (get_session_parameters (true, false)) {
 			exit (1);
 		}
-
-		goto_editor_window ();
 	}
 }
 
@@ -3147,7 +3346,7 @@ ARDOUR_UI::get_session_parameters (bool quit_on_cancel, bool should_be_new, stri
 void
 ARDOUR_UI::close_session()
 {
-	if (!check_audioengine(*editor)) {
+	if (!check_audioengine (_main_window)) {
 		return;
 	}
 
@@ -3160,8 +3359,10 @@ ARDOUR_UI::close_session()
 	if (get_session_parameters (true, false)) {
 		exit (1);
 	}
-
-	goto_editor_window ();
+	if (splash && splash->is_visible()) {
+		// in 1 second, hide the splash screen
+		Glib::signal_timeout().connect (sigc::bind (sigc::ptr_fun (_hide_splash), this), 1000);
+	}
 }
 
 /** @param snap_name Snapshot name (without .ardour suffix).
@@ -3298,8 +3499,6 @@ ARDOUR_UI::load_session (const std::string& path, const std::string& snap_name,
 
 	session_loaded = true;
 
-	goto_editor_window ();
-
 	if (_session) {
 		_session->set_clean ();
 	}
@@ -3310,7 +3509,7 @@ ARDOUR_UI::load_session (const std::string& path, const std::string& snap_name,
 
 	{
 		Timers::TimerSuspender t;
-		flush_pending ();
+		flush_pending (10);
 	}
 
 #ifdef WINDOWS_VST_SUPPORT
@@ -3375,6 +3574,11 @@ ARDOUR_UI::build_session (const std::string& path, const std::string& snap_name,
 		new_session->add_instant_xml (*n, false);
 	}
 
+	n = Config->instant_xml (X_("Preferences"));
+	if (n) {
+		new_session->add_instant_xml (*n, false);
+	}
+
 	/* Put the playhead at 0 and scroll fully left */
 	n = new_session->instant_xml (X_("Editor"));
 	if (n) {
@@ -3515,7 +3719,7 @@ ARDOUR_UI::display_cleanup_results (ARDOUR::CleanupReport& rep, const gchar* lis
 	removed = rep.paths.size();
 
 	if (removed == 0) {
-		MessageDialog msgd (*editor,
+		MessageDialog msgd (_main_window,
 				    _("No files were ready for clean-up"),
 				    true,
 				    Gtk::MESSAGE_INFO,
@@ -3764,15 +3968,15 @@ ARDOUR_UI::cleanup_peakfiles ()
 	}
 }
 
-void
-ARDOUR_UI::setup_order_hint (AddRouteDialog::InsertAt place)
+PresentationInfo::order_t
+ARDOUR_UI::translate_order (AddRouteDialog::InsertAt place)
 {
-	uint32_t order_hint = UINT32_MAX;
-
 	if (editor->get_selection().tracks.empty()) {
-		return;
+		return PresentationInfo::max_order;
 	}
 
+	PresentationInfo::order_t order_hint = PresentationInfo::max_order;
+
 	/*
 	  we want the new routes to have their order keys set starting from
 	  the highest order key in the selection + 1 (if available).
@@ -3781,42 +3985,21 @@ ARDOUR_UI::setup_order_hint (AddRouteDialog::InsertAt place)
 	if (place == AddRouteDialog::AfterSelection) {
 		RouteTimeAxisView *rtav = dynamic_cast<RouteTimeAxisView*> (editor->get_selection().tracks.back());
 		if (rtav) {
-			order_hint = rtav->route()->order_key();
+			order_hint = rtav->route()->presentation_info().order();
 			order_hint++;
 		}
 	} else if (place == AddRouteDialog::BeforeSelection) {
 		RouteTimeAxisView *rtav = dynamic_cast<RouteTimeAxisView*> (editor->get_selection().tracks.front());
 		if (rtav) {
-			order_hint = rtav->route()->order_key();
+			order_hint = rtav->route()->presentation_info().order();
 		}
 	} else if (place == AddRouteDialog::First) {
 		order_hint = 0;
 	} else {
-		/* leave order_hint at UINT32_MAX */
+		/* leave order_hint at max_order */
 	}
 
-	if (order_hint == UINT32_MAX) {
-		/** AddRouteDialog::Last or selection with first/last not a RouteTimeAxisView
-		 * not setting an order hint will place new routes last.
-		 */
-		return;
-	}
-
-	_session->set_order_hint (order_hint);
-
-	/* create a gap in the existing route order keys to accomodate new routes.*/
-	boost::shared_ptr <RouteList> rd = _session->get_routes();
-	for (RouteList::iterator ri = rd->begin(); ri != rd->end(); ++ri) {
-		boost::shared_ptr<Route> rt (*ri);
-
-		if (rt->is_monitor()) {
-			continue;
-		}
-
-		if (rt->order_key () >= order_hint) {
-			rt->set_order_key (rt->order_key () + add_route_dialog->count());
-		}
-	}
+	return order_hint;
 }
 
 void
@@ -3834,9 +4017,11 @@ ARDOUR_UI::start_duplicate_routes ()
 }
 
 void
-ARDOUR_UI::add_route (Gtk::Window* /* ignored */)
+ARDOUR_UI::add_route ()
 {
-	int count;
+	if (!add_route_dialog.get (false)) {
+		add_route_dialog->signal_response().connect (sigc::mem_fun (*this, &ARDOUR_UI::add_route_dialog_finished));
+	}
 
 	if (!_session) {
 		return;
@@ -3847,7 +4032,14 @@ ARDOUR_UI::add_route (Gtk::Window* /* ignored */)
 		return;
 	}
 
-	ResponseType r = (ResponseType) add_route_dialog->run ();
+	add_route_dialog->set_position (WIN_POS_MOUSE);
+	add_route_dialog->present();
+}
+
+void
+ARDOUR_UI::add_route_dialog_finished (int r)
+{
+	int count;
 
 	add_route_dialog->hide();
 
@@ -3863,8 +4055,7 @@ ARDOUR_UI::add_route (Gtk::Window* /* ignored */)
 		return;
 	}
 
-	setup_order_hint(add_route_dialog->insert_at());
-
+	PresentationInfo::order_t order = translate_order (add_route_dialog->insert_at());
 	string template_path = add_route_dialog->track_template();
 	DisplaySuspender ds;
 
@@ -3883,6 +4074,7 @@ ARDOUR_UI::add_route (Gtk::Window* /* ignored */)
 	PluginInfoPtr instrument = add_route_dialog->requested_instrument ();
 	RouteGroup* route_group = add_route_dialog->route_group ();
 	AutoConnectOption oac = Config->get_output_auto_connect();
+	bool strict_io = add_route_dialog->use_strict_io ();
 
 	if (oac & AutoConnectMaster) {
 		output_chan.set (DataType::AUDIO, (_session->master_out() ? _session->master_out()->n_inputs().n_audio() : input_chan.n_audio()));
@@ -3895,21 +4087,110 @@ ARDOUR_UI::add_route (Gtk::Window* /* ignored */)
 
 	switch (add_route_dialog->type_wanted()) {
 	case AddRouteDialog::AudioTrack:
-		session_add_audio_track (input_chan.n_audio(), output_chan.n_audio(), add_route_dialog->mode(), route_group, count, name_template);
+		session_add_audio_track (input_chan.n_audio(), output_chan.n_audio(), add_route_dialog->mode(), route_group, count, name_template, strict_io, order);
 		break;
 	case AddRouteDialog::MidiTrack:
-		session_add_midi_track (route_group, count, name_template, instrument);
+		session_add_midi_track (route_group, count, name_template, strict_io, instrument, 0, order);
 		break;
 	case AddRouteDialog::MixedTrack:
-		session_add_mixed_track (input_chan, output_chan, route_group, count, name_template, instrument);
+		session_add_mixed_track (input_chan, output_chan, route_group, count, name_template, strict_io, instrument, 0, order);
 		break;
 	case AddRouteDialog::AudioBus:
-		session_add_audio_bus (input_chan.n_audio(), output_chan.n_audio(), route_group, count, name_template);
+		session_add_audio_bus (input_chan.n_audio(), output_chan.n_audio(), route_group, count, name_template, strict_io, order);
+		break;
+	case AddRouteDialog::MidiBus:
+		session_add_midi_bus (route_group, count, name_template, strict_io, instrument, 0, order);
+		break;
+	case AddRouteDialog::VCAMaster:
+		session_add_vca (name_template, count);
 		break;
 	}
 }
 
 void
+ARDOUR_UI::add_lua_script ()
+{
+	if (!_session) {
+		return;
+	}
+
+	LuaScriptInfoPtr spi;
+	ScriptSelector ss ("Add Lua Session Script", LuaScriptInfo::Session);
+	switch (ss.run ()) {
+		case Gtk::RESPONSE_ACCEPT:
+			spi = ss.script();
+			break;
+		default:
+			return;
+	}
+	ss.hide();
+
+	std::string script = "";
+
+	try {
+		script = Glib::file_get_contents (spi->path);
+	} catch (Glib::FileError e) {
+		string msg = string_compose (_("Cannot read session script '%1': %2"), spi->path, e.what());
+		MessageDialog am (msg);
+		am.run ();
+		return;
+	}
+
+	LuaScriptParamList lsp = LuaScriptParams::script_params (spi, "sess_params");
+	std::vector<std::string> reg = _session->registered_lua_functions ();
+
+	ScriptParameterDialog spd (_("Set Script Parameters"), spi, reg, lsp);
+	switch (spd.run ()) {
+		case Gtk::RESPONSE_ACCEPT:
+			break;
+		default:
+			return;
+	}
+
+	try {
+		_session->register_lua_function (spd.name(), script, lsp);
+	} catch (luabridge::LuaException const& e) {
+		string msg = string_compose (_("Session script '%1' instantiation failed: %2"), spd.name(), e.what ());
+		MessageDialog am (msg);
+		am.run ();
+	} catch (SessionException e) {
+		string msg = string_compose (_("Loading Session script '%1' failed: %2"), spd.name(), e.what ());
+		MessageDialog am (msg);
+		am.run ();
+	}
+}
+
+void
+ARDOUR_UI::remove_lua_script ()
+{
+	if (!_session) {
+		return;
+	}
+	if (_session->registered_lua_function_count () ==  0) {
+		string msg = _("There are no active Lua session scripts present in this session.");
+		MessageDialog am (msg);
+		am.run ();
+		return;
+	}
+
+	std::vector<std::string> reg = _session->registered_lua_functions ();
+	SessionScriptManager sm ("Remove Lua Session Script", reg);
+	switch (sm.run ()) {
+		case Gtk::RESPONSE_ACCEPT:
+			break;
+		default:
+			return;
+	}
+	try {
+		_session->unregister_lua_function (sm.name());
+	} catch (luabridge::LuaException const& e) {
+		string msg = string_compose (_("Session script '%1' removal failed: %2"), sm.name(), e.what ());
+		MessageDialog am (msg);
+		am.run ();
+	}
+}
+
+void
 ARDOUR_UI::stop_video_server (bool ask_confirm)
 {
 	if (!video_server_process && ask_confirm) {
@@ -4269,6 +4550,24 @@ ARDOUR_UI::export_video (bool range)
 }
 
 XMLNode*
+ARDOUR_UI::preferences_settings () const
+{
+	XMLNode* node = 0;
+
+	if (_session) {
+		node = _session->instant_xml(X_("Preferences"));
+	} else {
+		node = Config->instant_xml(X_("Preferences"));
+	}
+
+	if (!node) {
+		node = new XMLNode (X_("Preferences"));
+	}
+
+	return node;
+}
+
+XMLNode*
 ARDOUR_UI::mixer_settings () const
 {
 	XMLNode* node = 0;
@@ -4287,6 +4586,30 @@ ARDOUR_UI::mixer_settings () const
 }
 
 XMLNode*
+ARDOUR_UI::main_window_settings () const
+{
+	XMLNode* node = 0;
+
+	if (_session) {
+		node = _session->instant_xml(X_("Main"));
+	} else {
+		node = Config->instant_xml(X_("Main"));
+	}
+
+	if (!node) {
+		if (getenv("ARDOUR_INSTANT_XML_PATH")) {
+			node = Config->instant_xml(getenv("ARDOUR_INSTANT_XML_PATH"));
+		}
+	}
+
+	if (!node) {
+		node = new XMLNode (X_("Main"));
+	}
+
+	return node;
+}
+
+XMLNode*
 ARDOUR_UI::editor_settings () const
 {
 	XMLNode* node = 0;
@@ -4337,7 +4660,7 @@ void
 ARDOUR_UI::halt_on_xrun_message ()
 {
         cerr << "HALT on xrun\n";
-	MessageDialog msg (*editor, _("Recording was stopped because your system could not keep up."));
+        MessageDialog msg (_main_window, _("Recording was stopped because your system could not keep up."));
 	msg.run ();
 }
 
@@ -4366,7 +4689,7 @@ ARDOUR_UI::disk_overrun_handler ()
 
 	if (!have_disk_speed_dialog_displayed) {
 		have_disk_speed_dialog_displayed = true;
-		MessageDialog* msg = new MessageDialog (*editor, string_compose (_("\
+		MessageDialog* msg = new MessageDialog (_main_window, string_compose (_("\
 The disk system on your computer\n\
 was not able to keep up with %1.\n\
 \n\
@@ -4501,7 +4824,7 @@ ARDOUR_UI::disk_underrun_handler ()
 	if (!have_disk_speed_dialog_displayed) {
 		have_disk_speed_dialog_displayed = true;
 		MessageDialog* msg = new MessageDialog (
-			*editor, string_compose (_("The disk system on your computer\n\
+			_main_window, string_compose (_("The disk system on your computer\n\
 was not able to keep up with %1.\n\
 \n\
 Specifically, it failed to read data from disk\n\
@@ -4525,12 +4848,7 @@ ARDOUR_UI::session_dialog (std::string msg)
 
 	MessageDialog* d;
 
-	if (editor) {
-		d = new MessageDialog (*editor, msg, false, MESSAGE_INFO, BUTTONS_OK, true);
-	} else {
-		d = new MessageDialog (msg, false, MESSAGE_INFO, BUTTONS_OK, true);
-	}
-
+	d = new MessageDialog (msg, false, MESSAGE_INFO, BUTTONS_OK, true);
 	d->show_all ();
 	d->run ();
 	delete d;
@@ -4604,6 +4922,21 @@ audio may be played at the wrong sample rate.\n"), desired, PROGRAM_NAME, actual
 }
 
 void
+ARDOUR_UI::sr_mismatch_message (framecnt_t desired, framecnt_t actual)
+{
+	MessageDialog msg (string_compose (_("\
+This session was created with a sample rate of %1 Hz, but\n\
+%2 is currently running at %3 Hz.\n\
+Audio will be recorded and played at the wrong sample rate.\n\
+Re-Configure the Audio Engine in\n\
+Menu > Window > Audio/Midi Setup"),
+				desired, PROGRAM_NAME, actual),
+			true,
+			Gtk::MESSAGE_WARNING);
+	msg.run ();
+}
+
+void
 ARDOUR_UI::use_config ()
 {
 	XMLNode* node = Config->extra_xml (X_("TransportControllables"));
@@ -4786,11 +5119,6 @@ ARDOUR_UI::setup_profile ()
 		Profile->set_small_screen ();
 	}
 
-	if (g_getenv ("ARDOUR_SAE")) {
-		Profile->set_sae ();
-		Profile->set_single_package ();
-	}
-
 	if (g_getenv ("TRX")) {
 		Profile->set_trx ();
 	}
@@ -4880,7 +5208,7 @@ ARDOUR_UI::session_format_mismatch (std::string xml_path, std::string backup_pat
 
 	MessageDialog msg (string_compose (_("%4This is a session from an older version of %3%5\n\n"
 					     "%3 has copied the old session file\n\n%6%1%7\n\nto\n\n%6%2%7\n\n"
-					     "From now on, use the -2000 version with older versions of %3"),
+					     "From now on, use the backup copy with older versions of %3"),
 					   xml_path, backup_path, PROGRAM_NAME,
 					   start_big, end_big,
 					   start_mono, end_mono), true);
@@ -4922,10 +5250,15 @@ ARDOUR_UI::do_audio_midi_setup (uint32_t desired_sample_rate)
 	audio_midi_setup->set_desired_sample_rate (desired_sample_rate);
 	audio_midi_setup->set_position (WIN_POS_CENTER);
 
-	int response;
+	if (Config->get_try_autostart_engine () || getenv ("TRY_AUTOSTART_ENGINE")) {
+		audio_midi_setup->try_autostart ();
+		if (ARDOUR::AudioEngine::instance()->running()) {
+			return 0;
+		}
+	}
 
 	while (true) {
-		response = audio_midi_setup->run();
+		int response = audio_midi_setup->run();
 		switch (response) {
 		case Gtk::RESPONSE_OK:
 			if (!AudioEngine::instance()->running()) {
@@ -5056,15 +5389,278 @@ ARDOUR_UI::hide_application ()
 }
 
 void
-ARDOUR_UI::cancel_solo ()
+ARDOUR_UI::setup_toplevel_window (Gtk::Window& window, const string& name, void* owner)
 {
-	if (_session) {
-		if (_session->soloing()) {
-			_session->set_solo (_session->get_routes(), false);
-		} else if (_session->listening()) {
-			_session->set_listen (_session->get_routes(), false);
+	/* icons, titles, WM stuff */
+
+	static list<Glib::RefPtr<Gdk::Pixbuf> > window_icons;
+
+	if (window_icons.empty()) {
+		Glib::RefPtr<Gdk::Pixbuf> icon;
+		if ((icon = ::get_icon (PROGRAM_NAME "-icon_16px"))) {
+			window_icons.push_back (icon);
+		}
+		if ((icon = ::get_icon (PROGRAM_NAME "-icon_22px"))) {
+			window_icons.push_back (icon);
+		}
+		if ((icon = ::get_icon (PROGRAM_NAME "-icon_32px"))) {
+			window_icons.push_back (icon);
+		}
+		if ((icon = ::get_icon (PROGRAM_NAME "-icon_48px"))) {
+			window_icons.push_back (icon);
+		}
+	}
+
+	if (!window_icons.empty()) {
+		window.set_default_icon_list (window_icons);
+	}
+
+	Gtkmm2ext::WindowTitle title (Glib::get_application_name());
+
+	if (!name.empty()) {
+		title += name;
+	}
+
+	window.set_title (title.get_string());
+	window.set_wmclass (string_compose (X_("%1_%1"), downcase (PROGRAM_NAME), downcase (name)), PROGRAM_NAME);
+
+	window.set_flags (CAN_FOCUS);
+	window.add_events (Gdk::KEY_PRESS_MASK|Gdk::KEY_RELEASE_MASK);
+
+	/* This is a hack to ensure that GTK-accelerators continue to
+	 * work. Once we switch over to entirely native bindings, this will be
+	 * unnecessary and should be removed
+	 */
+	window.add_accel_group (ActionManager::ui_manager->get_accel_group());
+
+	window.signal_configure_event().connect (sigc::mem_fun (*this, &ARDOUR_UI::configure_handler));
+	window.signal_window_state_event().connect (sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::tabbed_window_state_event_handler), owner));
+	window.signal_key_press_event().connect (sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::key_event_handler), &window), false);
+	window.signal_key_release_event().connect (sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::key_event_handler), &window), false);
+}
+
+bool
+ARDOUR_UI::key_event_handler (GdkEventKey* ev, Gtk::Window* event_window)
+{
+	Gtkmm2ext::Bindings* bindings = 0;
+	Gtk::Window* window = 0;
+
+	/* until we get ardour bindings working, we are not handling key
+	 * releases yet.
+	 */
+
+	if (ev->type != GDK_KEY_PRESS) {
+		return false;
+	}
+
+	if (event_window == &_main_window) {
+
+		window = event_window;
+
+		/* find current tab contents */
+
+		Gtk::Widget* w = _tabs.get_nth_page (_tabs.get_current_page());
+
+		/* see if it uses the ardour binding system */
+
+		if (w) {
+			bindings = reinterpret_cast<Gtkmm2ext::Bindings*>(w->get_data ("ardour-bindings"));
+		}
+
+		DEBUG_TRACE (DEBUG::Accelerators, string_compose ("main window key event, bindings = %1, global = %2\n", bindings, &global_bindings));
+
+	} else {
+
+		window = event_window;
+
+		/* see if window uses ardour binding system */
+
+		bindings = reinterpret_cast<Gtkmm2ext::Bindings*>(window->get_data ("ardour-bindings"));
+	}
+
+	/* An empty binding set is treated as if it doesn't exist */
+
+	if (bindings && bindings->empty()) {
+		bindings = 0;
+	}
+
+	return key_press_focus_accelerator_handler (*window, ev, bindings);
+}
+
+static Gtkmm2ext::Bindings*
+get_bindings_from_widget_heirarchy (GtkWidget* w)
+{
+	void* p = NULL;
+
+	while (w) {
+		if ((p = g_object_get_data (G_OBJECT(w), "ardour-bindings")) != 0) {
+			break;
 		}
+		w = gtk_widget_get_parent (w);
+	}
+
+	return reinterpret_cast<Gtkmm2ext::Bindings*> (p);
+}
+
+bool
+ARDOUR_UI::key_press_focus_accelerator_handler (Gtk::Window& window, GdkEventKey* ev, Gtkmm2ext::Bindings* bindings)
+{
+	GtkWindow* win = window.gobj();
+	GtkWidget* focus = gtk_window_get_focus (win);
+	bool special_handling_of_unmodified_accelerators = false;
+	const guint mask = (Keyboard::RelevantModifierKeyMask & ~(Gdk::SHIFT_MASK|Gdk::LOCK_MASK));
+
+        if (focus) {
+
+		/* some widget has keyboard focus */
+
+		if (GTK_IS_ENTRY(focus) || Keyboard::some_magic_widget_has_focus()) {
+
+			/* A particular kind of focusable widget currently has keyboard
+			 * focus. All unmodified key events should go to that widget
+			 * first and not be used as an accelerator by default
+			 */
+
+			special_handling_of_unmodified_accelerators = true;
+
+		} else {
+
+			Gtkmm2ext::Bindings* focus_bindings = get_bindings_from_widget_heirarchy (focus);
+			if (focus_bindings) {
+				bindings = focus_bindings;
+				DEBUG_TRACE (DEBUG::Accelerators, string_compose ("Switch bindings based on focus widget, now using %1\n", bindings->name()));
+			}
+		}
+	}
+
+        DEBUG_TRACE (DEBUG::Accelerators, string_compose ("Win = %1 [title = %9] focus = %7 (%8) Key event: code = %2  state = %3 special handling ? %4 magic widget focus ? %5 focus widget %6 named %7 mods ? %8\n",
+                                                          win,
+                                                          ev->keyval,
+							  Gtkmm2ext::show_gdk_event_state (ev->state),
+                                                          special_handling_of_unmodified_accelerators,
+                                                          Keyboard::some_magic_widget_has_focus(),
+							  focus,
+                                                          (focus ? gtk_widget_get_name (focus) : "no focus widget"),
+                                                          ((ev->state & mask) ? "yes" : "no"),
+                                                          window.get_title()));
+
+	/* This exists to allow us to override the way GTK handles
+	   key events. The normal sequence is:
+
+	   a) event is delivered to a GtkWindow
+	   b) accelerators/mnemonics are activated
+	   c) if (b) didn't handle the event, propagate to
+	       the focus widget and/or focus chain
+
+	   The problem with this is that if the accelerators include
+	   keys without modifiers, such as the space bar or the
+	   letter "e", then pressing the key while typing into
+	   a text entry widget results in the accelerator being
+	   activated, instead of the desired letter appearing
+	   in the text entry.
+
+	   There is no good way of fixing this, but this
+	   represents a compromise. The idea is that
+	   key events involving modifiers (not Shift)
+	   get routed into the activation pathway first, then
+	   get propagated to the focus widget if necessary.
+
+	   If the key event doesn't involve modifiers,
+	   we deliver to the focus widget first, thus allowing
+	   it to get "normal text" without interference
+	   from acceleration.
+
+	   Of course, this can also be problematic: if there
+	   is a widget with focus, then it will swallow
+	   all "normal text" accelerators.
+	*/
+
+
+	if (!special_handling_of_unmodified_accelerators || (ev->state & mask)) {
 
-		_session->clear_all_solo_state (_session->get_routes()); // safeguard, ideally this won't do anything, check the log-window
+		/* no special handling or there are modifiers in effect: accelerate first */
+
+                DEBUG_TRACE (DEBUG::Accelerators, "\tactivate, then propagate\n");
+		DEBUG_TRACE (DEBUG::Accelerators, string_compose ("\tevent send-event:%1 time:%2 length:%3 name %7 string:%4 hardware_keycode:%5 group:%6\n",
+								  ev->send_event, ev->time, ev->length, ev->string, ev->hardware_keycode, ev->group, gdk_keyval_name (ev->keyval)));
+
+		DEBUG_TRACE (DEBUG::Accelerators, "\tsending to window\n");
+		KeyboardKey k (ev->state, ev->keyval);
+
+		if (bindings) {
+
+			DEBUG_TRACE (DEBUG::Accelerators, string_compose ("\tusing Ardour bindings %1 @ %2 for this event\n", bindings->name(), bindings));
+
+			if (bindings->activate (k, Bindings::Press)) {
+				DEBUG_TRACE (DEBUG::Accelerators, "\t\thandled\n");
+				return true;
+			}
+		}
+
+		DEBUG_TRACE (DEBUG::Accelerators, "\tnot yet handled, try global bindings\n");
+
+		if (global_bindings && global_bindings->activate (k, Bindings::Press)) {
+			DEBUG_TRACE (DEBUG::Accelerators, "\t\thandled\n");
+			return true;
+		}
+
+                DEBUG_TRACE (DEBUG::Accelerators, "\tnot accelerated, now propagate\n");
+
+                if (gtk_window_propagate_key_event (win, ev)) {
+	                DEBUG_TRACE (DEBUG::Accelerators, "\tpropagate handled\n");
+	                return true;
+                }
+
+	} else {
+
+		/* no modifiers, propagate first */
+
+		DEBUG_TRACE (DEBUG::Accelerators, "\tpropagate, then activate\n");
+
+		if (gtk_window_propagate_key_event (win, ev)) {
+			DEBUG_TRACE (DEBUG::Accelerators, "\thandled by propagate\n");
+			return true;
+		}
+
+		DEBUG_TRACE (DEBUG::Accelerators, "\tpropagation didn't handle, so activate\n");
+		KeyboardKey k (ev->state, ev->keyval);
+
+		if (bindings) {
+
+			DEBUG_TRACE (DEBUG::Accelerators, "\tusing Ardour bindings for this window\n");
+
+
+			if (bindings->activate (k, Bindings::Press)) {
+				DEBUG_TRACE (DEBUG::Accelerators, "\t\thandled\n");
+				return true;
+			}
+
+		}
+
+		DEBUG_TRACE (DEBUG::Accelerators, "\tnot yet handled, try global bindings\n");
+
+		if (global_bindings && global_bindings->activate (k, Bindings::Press)) {
+			DEBUG_TRACE (DEBUG::Accelerators, "\t\thandled\n");
+			return true;
+		}
+	}
+
+	DEBUG_TRACE (DEBUG::Accelerators, "\tnot handled\n");
+	return true;
+}
+
+void
+ARDOUR_UI::load_bindings ()
+{
+	if ((global_bindings = Bindings::get_bindings (X_("Global"), global_actions)) == 0) {
+		error << _("Global keybindings are missing") << endmsg;
+	}
+}
+
+void
+ARDOUR_UI::cancel_solo ()
+{
+	if (_session) {
+		_session->cancel_all_solo ();
 	}
 }
diff --git a/gtk2_ardour/ardour_ui.h b/gtk2_ardour/ardour_ui.h
index 3b62065..59a3c96 100644
--- a/gtk2_ardour/ardour_ui.h
+++ b/gtk2_ardour/ardour_ui.h
@@ -53,10 +53,13 @@
 #include <gtkmm/menubar.h>
 #include <gtkmm/textbuffer.h>
 #include <gtkmm/adjustment.h>
-#include <gtkmm2ext/gtk_ui.h>
-#include <gtkmm2ext/click_box.h>
-#include <gtkmm2ext/stateful_button.h>
-#include <gtkmm2ext/bindable_button.h>
+
+#include "gtkmm2ext/gtk_ui.h"
+#include "gtkmm2ext/click_box.h"
+#include "gtkmm2ext/stateful_button.h"
+#include "gtkmm2ext/bindable_button.h"
+#include "gtkmm2ext/bindings.h"
+#include "gtkmm2ext/visibility_tracker.h"
 
 #include "ardour/ardour.h"
 #include "ardour/types.h"
@@ -86,6 +89,7 @@
 #include "global_port_matrix.h"
 #include "keyeditor.h"
 #include "location_ui.h"
+#include "lua_script_manager.h"
 #include "rc_option_editor.h"
 #include "route_params_ui.h"
 #include "session_option_editor.h"
@@ -100,6 +104,7 @@ class EngineControl;
 class ExportVideoDialog;
 class KeyEditor;
 class LocationUIWindow;
+class LuaScriptManager;
 class RCOptionEditor;
 class RouteParams_UI;
 class SessionOptionEditor;
@@ -119,11 +124,12 @@ class ArdourPrompter;
 class PublicEditor;
 class SaveAsDialog;
 class SessionDialog;
-class SessionOptionEditor;
+class SessionOptionEditorWindow;
 class ShuttleControl;
 class Splash;
 class TimeInfoBox;
 class Meterbridge;
+class LuaWindow;
 class MidiTracer;
 class NSM_Client;
 class LevelMeterHBox;
@@ -139,17 +145,17 @@ namespace ARDOUR {
 	class ProcessThread;
 }
 
-namespace Gtkmm2ext {
-	class TearOff;
-}
-
 namespace Gtk {
 	class ProgressBar;
 }
 
+namespace Gtkmm2ext {
+	class Tabbable;
+}
+
 class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr
 {
-    public:
+public:
 	ARDOUR_UI (int *argcp, char **argvp[], const char* localedir);
 	~ARDOUR_UI();
 
@@ -184,7 +190,7 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr
 	bool get_smart_mode () const;
 
 	int get_session_parameters (bool quit_on_cancel, bool should_be_new = false, std::string load_template = "");
-        int  build_session_from_dialog (SessionDialog&, const std::string& session_name, const std::string& session_path);
+	int  build_session_from_dialog (SessionDialog&, const std::string& session_name, const std::string& session_path);
 	bool ask_about_loading_existing_session (const std::string& session_path);
 
 	/// @return true if session was successfully unloaded.
@@ -196,6 +202,12 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr
 
 	static ARDOUR_UI *instance () { return theArdourUI; }
 
+	/* signal emitted when escape key is pressed. All UI components that
+	   need to respond to Escape in some way (e.g. break drag, clear
+	   selection, etc) should connect to and handle this.
+	*/
+	PBD::Signal0<void> Escape;
+
 	PublicEditor&	  the_editor() { return *editor;}
 	Mixer_UI* the_mixer() { return mixer; }
 
@@ -216,9 +228,11 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr
 	static sigc::signal<void, framepos_t, bool, framepos_t> Clock;
 
 	static void close_all_dialogs () { CloseAllDialogs(); }
-        static sigc::signal<void> CloseAllDialogs;
+	static sigc::signal<void> CloseAllDialogs;
 
+	XMLNode* main_window_settings() const;
 	XMLNode* editor_settings() const;
+	XMLNode* preferences_settings() const;
 	XMLNode* mixer_settings () const;
 	XMLNode* keyboard_settings () const;
 	XMLNode* tearoff_settings (const char*) const;
@@ -247,12 +261,17 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr
 
 	void synchronize_sync_source_and_video_pullup ();
 
-	void add_route (Gtk::Window* float_window);
-        void add_routes_part_two ();
-        void add_routes_thread ();
+	void add_route ();
+	void add_route_dialog_finished (int);
+
+	void add_routes_part_two ();
+	void add_routes_thread ();
 
 	void start_duplicate_routes ();
 
+	void add_lua_script ();
+	void remove_lua_script ();
+
 	void add_video (Gtk::Window* float_window);
 	void remove_video ();
 	void start_video_server_menu (Gtk::Window* float_window);
@@ -261,36 +280,57 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr
 	void flush_videotimeline_cache (bool localcacheonly=false);
 	void export_video (bool range = false);
 
+	void session_add_vca (std::string const &, uint32_t);
+
+	void session_add_audio_route (bool, int32_t, int32_t, ARDOUR::TrackMode, ARDOUR::RouteGroup *, uint32_t, std::string const &, bool, ARDOUR::PresentationInfo::order_t order);
 	void session_add_audio_track (
 		int input_channels,
 		int32_t output_channels,
 		ARDOUR::TrackMode mode,
 		ARDOUR::RouteGroup* route_group,
 		uint32_t how_many,
-		std::string const & name_template
+		std::string const & name_template,
+		bool strict_io,
+		ARDOUR::PresentationInfo::order_t order
 		) {
-
-		session_add_audio_route (true, input_channels, output_channels, mode, route_group, how_many, name_template);
+		session_add_audio_route (true, input_channels, output_channels, mode, route_group, how_many, name_template, strict_io, order);
 	}
 
-	void session_add_audio_bus (int input_channels, int32_t output_channels, ARDOUR::RouteGroup* route_group,
-				    uint32_t how_many, std::string const & name_template) {
-		session_add_audio_route (false, input_channels, output_channels, ARDOUR::Normal, route_group, how_many, name_template);
+	void session_add_audio_bus (
+			int input_channels,
+			int32_t output_channels,
+			ARDOUR::RouteGroup* route_group,
+			uint32_t how_many,
+			std::string const & name_template,
+			bool strict_io,
+			ARDOUR::PresentationInfo::order_t order
+			) {
+		session_add_audio_route (false, input_channels, output_channels, ARDOUR::Normal, route_group, how_many, name_template, strict_io, order);
 	}
 
-	void session_add_midi_track (ARDOUR::RouteGroup* route_group, uint32_t how_many, std::string const & name_template,
-				     ARDOUR::PluginInfoPtr instrument) {
-		session_add_midi_route (true, route_group, how_many, name_template, instrument);
+	void session_add_midi_track (
+			ARDOUR::RouteGroup* route_group,
+			uint32_t how_many,
+			std::string const & name_template,
+			bool strict_io,
+			ARDOUR::PluginInfoPtr instrument,
+			ARDOUR::Plugin::PresetRecord* preset,
+			ARDOUR::PresentationInfo::order_t order
+		) {
+		session_add_midi_route (true, route_group, how_many, name_template, strict_io, instrument, preset, order);
 	}
 
-        void session_add_mixed_track (const ARDOUR::ChanCount& input, const ARDOUR::ChanCount& output, ARDOUR::RouteGroup* route_group, uint32_t how_many, std::string const & name_template,
-				      ARDOUR::PluginInfoPtr instrument);
-
-	/*void session_add_midi_bus () {
-		session_add_midi_route (false);
-	}*/
-
-        void attach_to_engine ();
+	void session_add_mixed_track (const ARDOUR::ChanCount&, const ARDOUR::ChanCount&, ARDOUR::RouteGroup*, uint32_t, std::string const &, bool,
+	                              ARDOUR::PluginInfoPtr, ARDOUR::Plugin::PresetRecord* pset,
+	                              ARDOUR::PresentationInfo::order_t order);
+	void session_add_midi_bus (ARDOUR::RouteGroup*, uint32_t, std::string const &, bool, ARDOUR::PluginInfoPtr, ARDOUR::Plugin::PresetRecord* pset,
+	                           ARDOUR::PresentationInfo::order_t order);
+	void session_add_midi_route (bool, ARDOUR::RouteGroup *, uint32_t, std::string const &, bool,
+	                             ARDOUR::PluginInfoPtr, ARDOUR::Plugin::PresetRecord*,
+	                             ARDOUR::PresentationInfo::order_t order);
+	void display_insufficient_ports_message ();
+
+	void attach_to_engine ();
 	void post_engine ();
 
 	gint exit_on_main_window_close (GdkEventAny *);
@@ -302,8 +342,6 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr
 
 	bool check_audioengine(Gtk::Window&);
 
-	void update_tearoff_visibility ();
-
 	void setup_profile ();
 	void setup_tooltips ();
 
@@ -316,11 +354,29 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr
 	void reset_route_peak_display (ARDOUR::Route*);
 	void reset_group_peak_display (ARDOUR::RouteGroup*);
 
-        const std::string& announce_string() const { return _announce_string; }
+	const std::string& announce_string() const { return _announce_string; }
 
 	void hide_application ();
 
-  protected:
+	Gtk::Notebook& tabs();
+	Gtk::Window& main_window () { return _main_window; }
+
+	void setup_toplevel_window (Gtk::Window&, const std::string& name, void* owner);
+
+	/* called from a static C function */
+
+	GtkNotebook* tab_window_root_drop (GtkNotebook* src,
+	                                   GtkWidget* w,
+	                                   gint x,
+	                                   gint y,
+	                                   gpointer user_data);
+
+	bool tabbed_window_state_event_handler (GdkEventWindowState*, void* object);
+	bool key_event_handler (GdkEventKey*, Gtk::Window* window);
+
+	Gtkmm2ext::ActionMap global_actions;
+
+protected:
 	friend class PublicEditor;
 
 	void toggle_auto_play ();
@@ -334,25 +390,38 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr
 	void reenable_hide_loop_punch_ruler_if_appropriate ();
 	void toggle_auto_return ();
 	void toggle_click ();
-        void toggle_audio_midi_setup ();
+	void toggle_audio_midi_setup ();
 	void toggle_session_auto_loop ();
 	void toggle_rc_options_window ();
 	void toggle_session_options_window ();
 
-  private:
-	PublicEditor*        editor;
-	Mixer_UI*            mixer;
-	NSM_Client*          nsm;
-	bool                _was_dirty;
-        bool                _mixer_on_top;
-        bool                _initial_verbose_plugin_scan;
-        bool first_time_engine_run;
-
-	void goto_editor_window ();
-	void goto_mixer_window ();
-	void toggle_mixer_window ();
+private:
+	Gtk::Window   _main_window;
+	Gtkmm2ext::VisibilityTracker* main_window_visibility;
+	Gtk::VBox      main_vpacker;
+	Gtk::HBox      status_bar_hpacker;
+	Gtk::Notebook _tabs;
+	PublicEditor*  editor;
+	Mixer_UI*      mixer;
+	Gtk::Tooltips _tooltips;
+	NSM_Client*    nsm;
+	bool          _was_dirty;
+	bool          _mixer_on_top;
+	bool          _initial_verbose_plugin_scan;
+	bool           first_time_engine_run;
+
+	void show_tabbable (Gtkmm2ext::Tabbable*);
+	void hide_tabbable (Gtkmm2ext::Tabbable*);
+	void detach_tabbable (Gtkmm2ext::Tabbable*);
+	void attach_tabbable (Gtkmm2ext::Tabbable*);
+	void button_change_tabbable_visibility (Gtkmm2ext::Tabbable*);
+	void key_change_tabbable_visibility (Gtkmm2ext::Tabbable*);
+	void toggle_editor_and_mixer ();
+
+	void tabbable_state_change (Gtkmm2ext::Tabbable&);
+
 	void toggle_meterbridge ();
-        void toggle_editor_mixer ();
+	void toggle_luawindow ();
 
 	int  setup_windows ();
 	void setup_transport ();
@@ -361,7 +430,7 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr
 	static ARDOUR_UI *theArdourUI;
 	SessionDialog *_session_dialog;
 
-        int starting ();
+	int starting ();
 
 	int  ask_about_saving_session (const std::vector<std::string>& actions);
 
@@ -371,6 +440,9 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr
 	void update_autosave();
 	sigc::connection _autosave_connection;
 
+	void session_dirty_changed ();
+	void update_title ();
+
 	void map_transport_state ();
 	int32_t do_engine_start ();
 
@@ -389,22 +461,14 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr
 	void         start_clocking ();
 	void         stop_clocking ();
 
-	bool main_window_state_event_handler (GdkEventWindowState*, bool window_was_editor);
-
 	void update_transport_clocks (framepos_t pos);
 	void record_state_changed ();
 
 	std::list<MidiTracer*> _midi_tracer_windows;
 
-	void detach_tearoff (Gtk::Box* parent, Gtk::Widget* contents);
-	void reattach_tearoff (Gtk::Box* parent, Gtk::Widget* contents, int32_t order);
-	void reattach_all_tearoffs ();
-
 	/* Transport Control */
 
-	Gtkmm2ext::TearOff*      transport_tearoff;
 	Gtk::Frame               transport_frame;
-	Gtk::HBox                transport_tearoff_hbox;
 	Gtk::HBox                transport_hbox;
 	Gtk::Fixed               transport_base;
 	Gtk::Fixed               transport_button_base;
@@ -475,6 +539,9 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr
 	ArdourButton feedback_alert_button;
 	ArdourButton error_alert_button;
 
+	ArdourButton action_script_call_btn[10];
+	Gtk::Table action_script_table;
+
 	Gtk::VBox alert_box;
 	Gtk::VBox meter_box;
 	LevelMeterHBox * editor_meter;
@@ -568,9 +635,6 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr
 	void edit_metadata ();
 	void import_metadata ();
 
-	void session_add_audio_route (bool, int32_t, int32_t, ARDOUR::TrackMode, ARDOUR::RouteGroup *, uint32_t, std::string const &);
-	void session_add_midi_route (bool, ARDOUR::RouteGroup *, uint32_t, std::string const &, ARDOUR::PluginInfoPtr);
-
 	void set_transport_sensitivity (bool);
 
 	//stuff for ProTools-style numpad
@@ -616,41 +680,49 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr
 	bool save_as_progress_update (float fraction, int64_t cnt, int64_t total, Gtk::Label* label, Gtk::ProgressBar* bar);
 	void save_session_as ();
 	void rename_session ();
-	void setup_order_hint (AddRouteDialog::InsertAt);
+	ARDOUR::PresentationInfo::order_t translate_order (AddRouteDialog::InsertAt);
 
 	int         create_mixer ();
 	int         create_editor ();
+	int         create_meterbridge ();
+	int         create_luawindow ();
+	int         create_masters ();
 
 	Meterbridge  *meterbridge;
-	int         create_meterbridge ();
-        /* Dialogs that can be created via new<T> */
-
-        WM::Proxy<SpeakerDialog> speaker_config_window;
-        WM::Proxy<KeyEditor> key_editor;
-        WM::Proxy<RCOptionEditor> rc_option_editor;
-        WM::Proxy<AddRouteDialog> add_route_dialog;
-        WM::Proxy<About> about;
-        WM::Proxy<LocationUIWindow> location_ui;
-        WM::Proxy<RouteParams_UI> route_params;
-        WM::Proxy<EngineControl> audio_midi_setup;
-        WM::Proxy<ExportVideoDialog> export_video_dialog;
-
-        /* Windows/Dialogs that require a creator method */
-
-        WM::ProxyWithConstructor<SessionOptionEditor> session_option_editor;
-        WM::ProxyWithConstructor<AddVideoDialog> add_video_dialog;
-        WM::ProxyWithConstructor<BundleManager> bundle_manager;
-        WM::ProxyWithConstructor<BigClockWindow> big_clock_window;
-        WM::ProxyWithConstructor<GlobalPortMatrixWindow> audio_port_matrix;
-        WM::ProxyWithConstructor<GlobalPortMatrixWindow> midi_port_matrix;
-
-        /* creator methods */
-
-        SessionOptionEditor*    create_session_option_editor ();
-        BundleManager*          create_bundle_manager ();
-        AddVideoDialog*         create_add_video_dialog ();
-        BigClockWindow*         create_big_clock_window();
-        GlobalPortMatrixWindow* create_global_port_matrix (ARDOUR::DataType);
+	LuaWindow    *luawindow;
+
+	/* Dialogs that can be created via new<T> */
+
+	RCOptionEditor* rc_option_editor;
+	Gtk::HBox rc_option_editor_placeholder;
+
+	WM::Proxy<SpeakerDialog> speaker_config_window;
+	WM::Proxy<AddRouteDialog> add_route_dialog;
+	WM::Proxy<About> about;
+	WM::Proxy<LocationUIWindow> location_ui;
+	WM::Proxy<RouteParams_UI> route_params;
+	WM::Proxy<EngineControl> audio_midi_setup;
+	WM::Proxy<ExportVideoDialog> export_video_dialog;
+	WM::Proxy<LuaScriptManager> lua_script_window;
+
+	/* Windows/Dialogs that require a creator method */
+
+	WM::ProxyWithConstructor<SessionOptionEditor> session_option_editor;
+	WM::ProxyWithConstructor<AddVideoDialog> add_video_dialog;
+	WM::ProxyWithConstructor<BundleManager> bundle_manager;
+	WM::ProxyWithConstructor<BigClockWindow> big_clock_window;
+	WM::ProxyWithConstructor<GlobalPortMatrixWindow> audio_port_matrix;
+	WM::ProxyWithConstructor<GlobalPortMatrixWindow> midi_port_matrix;
+	WM::ProxyWithConstructor<KeyEditor> key_editor;
+
+	/* creator methods */
+
+	SessionOptionEditor*    create_session_option_editor ();
+	BundleManager*          create_bundle_manager ();
+	AddVideoDialog*         create_add_video_dialog ();
+	BigClockWindow*         create_big_clock_window();
+	GlobalPortMatrixWindow* create_global_port_matrix (ARDOUR::DataType);
+	KeyEditor*              create_key_editor ();
 
 	ARDOUR::SystemExec *video_server_process;
 
@@ -664,7 +736,7 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr
 
 	void install_actions ();
 
-	void toggle_record_enable (uint32_t);
+	void toggle_record_enable (uint16_t);
 
 	uint32_t rec_enabled_streams;
 	void count_recenabled_streams (ARDOUR::Route&);
@@ -700,11 +772,12 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr
 	void plugin_scan_dialog (std::string type, std::string plugin, bool);
 	void plugin_scan_timeout (int);
 
-        void session_format_mismatch (std::string, std::string);
+	void session_format_mismatch (std::string, std::string);
 
 	void session_dialog (std::string);
 	int pending_state_dialog ();
 	int sr_mismatch_dialog (ARDOUR::framecnt_t, ARDOUR::framecnt_t);
+	void sr_mismatch_message (ARDOUR::framecnt_t, ARDOUR::framecnt_t);
 
 	Gtk::MenuItem* jack_disconnect_item;
 	Gtk::MenuItem* jack_reconnect_item;
@@ -737,26 +810,22 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr
 			Glib::RefPtr<Gtk::TextBuffer::Tag> ptag, Glib::RefPtr<Gtk::TextBuffer::Tag> mtag,
 			const char *msg);
 	Gtk::Label status_bar_label;
-        bool status_bar_button_press (GdkEventButton*);
+	bool status_bar_button_press (GdkEventButton*);
 
 	void loading_message (const std::string& msg);
 
 	PBD::ScopedConnectionList forever_connections;
-        PBD::ScopedConnection halt_connection;
-
-        void step_edit_status_change (bool);
+	PBD::ScopedConnection halt_connection;
 
-	void platform_specific ();
-	void platform_setup ();
+	void step_edit_status_change (bool);
 
-	/* these are used only in response to a platform-specific "ShouldQuit" signal
-	 */
+	/* these are used only in response to a platform-specific "ShouldQuit" signal */
 	bool idle_finish ();
 	void queue_finish ();
 	void fontconfig_dialog ();
 
-        int missing_file (ARDOUR::Session*s, std::string str, ARDOUR::DataType type);
-        int ambiguous_file (std::string file, std::vector<std::string> hits);
+	int missing_file (ARDOUR::Session*s, std::string str, ARDOUR::DataType type);
+	int ambiguous_file (std::string file, std::vector<std::string> hits);
 
 	bool click_button_clicked (GdkEventButton *);
 
@@ -788,13 +857,37 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr
 
 	bool xrun_button_release (GdkEventButton* ev);
 
-        std::string _announce_string;
-        void check_announcements ();
+	std::string _announce_string;
+	void check_announcements ();
 
-        int do_audio_midi_setup (uint32_t);
+	int do_audio_midi_setup (uint32_t);
 	void audioengine_became_silent ();
 
 	DuplicateRouteDialog* duplicate_routes_dialog;
+
+	void grab_focus_after_dialog ();
+
+	void tabs_switch (GtkNotebookPage*, guint page_number);
+	void tabs_page_added (Gtk::Widget*, guint);
+	void tabs_page_removed (Gtk::Widget*, guint);
+	ArdourButton editor_visibility_button;
+	ArdourButton mixer_visibility_button;
+	ArdourButton prefs_visibility_button;
+
+	bool key_press_focus_accelerator_handler (Gtk::Window& window, GdkEventKey* ev, Gtkmm2ext::Bindings*);
+	bool try_gtk_accel_binding (GtkWindow* win, GdkEventKey* ev, bool translate, GdkModifierType modifier);
+
+	bool main_window_delete_event (GdkEventAny*);
+	bool idle_ask_about_quit ();
+
+	void load_bindings ();
+	bool tabbable_visibility_button_press (GdkEventButton* ev, std::string const& tabbable_name);
+
+	void step_up_through_tabs ();
+	void step_down_through_tabs ();
+
+	void escape ();
+	void pre_release_dialog ();
 };
 
 #endif /* __ardour_gui_h__ */
diff --git a/gtk2_ardour/ardour_ui2.cc b/gtk2_ardour/ardour_ui2.cc
index 3e8fde5..c4404b8 100644
--- a/gtk2_ardour/ardour_ui2.cc
+++ b/gtk2_ardour/ardour_ui2.cc
@@ -29,13 +29,16 @@
 #include <cmath>
 
 #include <sigc++/bind.h>
+#include "canvas/canvas.h"
+
 #include "pbd/error.h"
 #include "pbd/basename.h"
 #include "pbd/fastlog.h"
-#include <gtkmm2ext/cairocell.h>
-#include <gtkmm2ext/utils.h>
-#include <gtkmm2ext/click_box.h>
-#include <gtkmm2ext/tearoff.h>
+
+#include "gtkmm2ext/cairocell.h"
+#include "gtkmm2ext/utils.h"
+#include "gtkmm2ext/click_box.h"
+#include "gtkmm2ext/window_title.h"
 
 #include "ardour/profile.h"
 #include "ardour/session.h"
@@ -47,6 +50,7 @@
 #include "audio_clock.h"
 #include "actions.h"
 #include "main_clock.h"
+#include "mixer_ui.h"
 #include "utils.h"
 #include "theme_manager.h"
 #include "midi_tracer.h"
@@ -56,7 +60,7 @@
 #include "rc_option_editor.h"
 #include "time_info_box.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
@@ -66,65 +70,12 @@ using namespace Gtk;
 using namespace Glib;
 using namespace ARDOUR_UI_UTILS;
 
-int
-ARDOUR_UI::setup_windows ()
-{
-	if (create_editor ()) {
-		error << _("UI: cannot setup editor") << endmsg;
-		return -1;
-	}
-
-	if (create_mixer ()) {
-		error << _("UI: cannot setup mixer") << endmsg;
-		return -1;
-	}
-
-	if (create_meterbridge ()) {
-		error << _("UI: cannot setup meterbridge") << endmsg;
-		return -1;
-	}
-
-	/* all other dialogs are created conditionally */
-
-	we_have_dependents ();
-
-#ifdef TOP_MENUBAR
-	HBox* status_bar_packer = manage (new HBox);
-	EventBox* status_bar_event_box = manage (new EventBox);
-
-	status_bar_event_box->add (status_bar_label);
-	status_bar_event_box->add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK);
-	status_bar_label.set_size_request (300, -1);
-	status_bar_packer->pack_start (*status_bar_event_box, true, true, 6);
-
-	status_bar_label.show ();
-	status_bar_event_box->show ();
-	status_bar_packer->show ();
-
-	status_bar_event_box->signal_button_press_event().connect (mem_fun (*this, &ARDOUR_UI::status_bar_button_press));
-
-	editor->get_status_bar_packer().pack_start (*status_bar_packer, true, true);
-	editor->get_status_bar_packer().pack_start (menu_bar_base, false, false, 2);
-#else
-	top_packer.pack_start (menu_bar_base, false, false);
-#endif
-
-	editor->add_toplevel_menu (top_packer);
-
-	editor->add_transport_frame (transport_frame);
-
-	setup_transport();
-
-	build_menu_bar ();
-
-	setup_tooltips ();
-
-	return 0;
-}
 
 void
 ARDOUR_UI::setup_tooltips ()
 {
+	ArdourCanvas::Canvas::set_tooltip_timeout (Gtk::Settings::get_default()->property_gtk_tooltip_timeout ());
+
 	set_tip (roll_button, _("Play from playhead"));
 	set_tip (stop_button, _("Stop playback"));
 	set_tip (rec_button, _("Toggle record"));
@@ -218,23 +169,23 @@ ARDOUR_UI::tearoff_settings (const char* name) const
 
 #define PX_SCALE(px) std::max((float)px, rintf((float)px * UIConfiguration::instance().get_ui_scale()))
 
+static
+bool drag_failed (const Glib::RefPtr<Gdk::DragContext>& context, DragResult result, Tabbable* tab)
+{
+	if (result == Gtk::DRAG_RESULT_NO_TARGET) {
+		tab->detach ();
+		return true;
+	}
+	return false;
+}
+
 void
 ARDOUR_UI::setup_transport ()
 {
 	RefPtr<Action> act;
 
-	transport_tearoff_hbox.set_border_width (PX_SCALE(3));
-	transport_tearoff_hbox.set_spacing (PX_SCALE(3));
-
-	transport_tearoff = manage (new TearOff (transport_tearoff_hbox));
-	transport_tearoff->set_name ("TransportBase");
-	transport_tearoff->tearoff_window().signal_key_press_event().connect (sigc::bind (sigc::ptr_fun (relay_key_press), &transport_tearoff->tearoff_window()), false);
-
-	if (Profile->get_sae() || Profile->get_mixbus()) {
-		transport_tearoff->set_can_be_torn_off (false);
-	}
-
-	transport_hbox.pack_start (*transport_tearoff, true, false);
+	transport_hbox.set_border_width (PX_SCALE(3));
+	transport_hbox.set_spacing (PX_SCALE(3));
 
 	transport_base.set_name ("TransportBase");
 	transport_base.add (transport_hbox);
@@ -243,15 +194,6 @@ ARDOUR_UI::setup_transport ()
 	transport_frame.set_name ("BaseFrame");
 	transport_frame.add (transport_base);
 
-	transport_tearoff->Detach.connect (sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::detach_tearoff), static_cast<Box*>(&top_packer),
-						 static_cast<Widget*>(&transport_frame)));
-	transport_tearoff->Attach.connect (sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::reattach_tearoff), static_cast<Box*> (&top_packer),
-						 static_cast<Widget*> (&transport_frame), 1));
-	transport_tearoff->Hidden.connect (sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::detach_tearoff), static_cast<Box*>(&top_packer),
-						 static_cast<Widget*>(&transport_frame)));
-	transport_tearoff->Visible.connect (sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::reattach_tearoff), static_cast<Box*> (&top_packer),
-						  static_cast<Widget*> (&transport_frame), 1));
-
 	auto_return_button.set_text(_("Auto Return"));
 
 	follow_edits_button.set_text(_("Follow Edits"));
@@ -425,11 +367,7 @@ ARDOUR_UI::setup_transport ()
 
 	time_info_box = manage (new TimeInfoBox);
 
-	if (ARDOUR::Profile->get_trx()) {
-		transport_tearoff_hbox.pack_start (*time_info_box, false, false);
-	}
-
-	transport_tearoff_hbox.pack_start (*transport_vbox, false, false);
+	transport_hbox.pack_start (*transport_vbox, false, true);
 
 	/* transport related toggle controls */
 
@@ -443,60 +381,67 @@ ARDOUR_UI::setup_transport ()
 	}
 
 	if (!ARDOUR::Profile->get_trx()) {
-		transport_tearoff_hbox.pack_start (*auto_box, false, false);
+		transport_hbox.pack_start (*auto_box, false, false);
 	}
-	transport_tearoff_hbox.pack_start (*clock_box, true, true);
+	transport_hbox.pack_start (*clock_box, true, true);
 
 	if (ARDOUR::Profile->get_trx()) {
-		transport_tearoff_hbox.pack_start (*auto_box, false, false);
+		transport_hbox.pack_start (*auto_box, false, false);
 	}
 
 	if (!ARDOUR::Profile->get_trx()) {
-		transport_tearoff_hbox.pack_start (*time_info_box, false, false);
+		transport_hbox.pack_start (*time_info_box, false, false);
 	}
 
 	if (!ARDOUR::Profile->get_trx()) {
-		transport_tearoff_hbox.pack_start (alert_box, false, false);
-		transport_tearoff_hbox.pack_start (meter_box, false, false);
-		transport_tearoff_hbox.pack_start (editor_meter_peak_display, false, false);
+		transport_hbox.pack_start (alert_box, false, false);
+		transport_hbox.pack_start (meter_box, false, false);
+		transport_hbox.pack_start (editor_meter_peak_display, false, false);
 	}
 
-	if (Profile->get_sae()) {
-		Image* img = manage (new Image ((::get_icon (X_("sae")))));
-		transport_tearoff_hbox.pack_end (*img, false, false);
-	}
+	Gtk::VBox*   window_button_box = manage (new Gtk::VBox);
 
-	/* desensitize */
+	editor_visibility_button.signal_drag_failed().connect (sigc::bind (sigc::ptr_fun (drag_failed), editor));
+	mixer_visibility_button.signal_drag_failed().connect (sigc::bind (sigc::ptr_fun (drag_failed), mixer));
+	prefs_visibility_button.signal_drag_failed().connect (sigc::bind (sigc::ptr_fun (drag_failed), rc_option_editor));
 
-	set_transport_sensitivity (false);
+	/* catch context clicks so that we can show a menu on these buttons */
 
-	XMLNode* tnode = tearoff_settings ("transport");
-	if (tnode) {
-		transport_tearoff->set_state (*tnode);
-	}
-}
-#undef PX_SCALE
+	editor_visibility_button.signal_button_press_event().connect (sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::tabbable_visibility_button_press), X_("editor")), false);
+	mixer_visibility_button.signal_button_press_event().connect (sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::tabbable_visibility_button_press), X_("mixer")), false);
+	prefs_visibility_button.signal_button_press_event().connect (sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::tabbable_visibility_button_press), X_("preferences")), false);
 
-void
-ARDOUR_UI::detach_tearoff (Box* b, Widget* w)
-{
-//	editor->ensure_float (transport_tearoff->tearoff_window());
-	b->remove (*w);
-}
+	editor_visibility_button.set_related_action (ActionManager::get_action (X_("Common"), X_("change-editor-visibility")));
+	editor_visibility_button.set_name (X_("page switch button"));
+	mixer_visibility_button.set_related_action (ActionManager::get_action (X_("Common"), X_("change-mixer-visibility")));
+	mixer_visibility_button.set_name (X_("page switch button"));
+	prefs_visibility_button.set_related_action (ActionManager::get_action (X_("Common"), X_("change-preferences-visibility")));
+	prefs_visibility_button.set_name (X_("page switch button"));
 
-void
-ARDOUR_UI::reattach_tearoff (Box* b, Widget* w, int32_t n)
-{
-	b->pack_start (*w);
-	b->reorder_child (*w, n);
-}
+	Gtkmm2ext::UI::instance()->set_tip (editor_visibility_button,
+	                                    string_compose (_("Drag this tab to the desktop to show %1 in its own window\n\n"
+	                                                      "To put the window back, use the Window > %1 > Attach menu action"), editor->name()));
 
-void
-ARDOUR_UI::reattach_all_tearoffs ()
-{
-	if (transport_tearoff) transport_tearoff->put_it_back();
-	if (editor) editor->reattach_all_tearoffs ();
+	Gtkmm2ext::UI::instance()->set_tip (mixer_visibility_button,
+	                                    string_compose (_("Drag this tab to the desktop to show %1 in its own window\n\n"
+	                                                      "To put the window back, use the Window > %1 > Attach menu action"), mixer->name()));
+
+	Gtkmm2ext::UI::instance()->set_tip (prefs_visibility_button,
+	                                    string_compose (_("Drag this tab to the desktop to show %1 in its own window\n\n"
+	                                                      "To put the window back, use the Window > %1 > Attach menu action"), rc_option_editor->name()));
+
+	window_button_box->pack_start (editor_visibility_button, true, false);
+	window_button_box->pack_start (mixer_visibility_button, true, false);
+	window_button_box->pack_start (prefs_visibility_button, true, false);
+
+	transport_hbox.pack_end (*window_button_box, false, false);
+	transport_hbox.pack_end (action_script_table, false, false);
+
+	/* desensitize */
+
+	set_transport_sensitivity (false);
 }
+#undef PX_SCALE
 
 void
 ARDOUR_UI::soloing_changed (bool onoff)
@@ -670,14 +615,6 @@ ARDOUR_UI::editor_realized ()
 }
 
 void
-ARDOUR_UI::update_tearoff_visibility ()
-{
-	if (editor) {
-		editor->update_tearoff_visibility ();
-	}
-}
-
-void
 ARDOUR_UI::maximise_editing_space ()
 {
 	if (editor) {
@@ -696,15 +633,12 @@ ARDOUR_UI::restore_editing_space ()
 void
 ARDOUR_UI::show_ui_prefs ()
 {
-	RefPtr<Action> act = ActionManager::get_action (X_("Window"), X_("toggle-rc-options-editor"));
-	assert (act);
-
-	act->activate();
-
-	rc_option_editor->set_current_page (_("GUI"));
+	if (rc_option_editor) {
+		show_tabbable (rc_option_editor);
+		rc_option_editor->set_current_page (_("GUI"));
+	}
 }
 
-
 bool
 ARDOUR_UI::click_button_clicked (GdkEventButton* ev)
 {
@@ -713,12 +647,8 @@ ARDOUR_UI::click_button_clicked (GdkEventButton* ev)
 		return false;
 	}
 
-	RefPtr<Action> act = ActionManager::get_action (X_("Window"), X_("toggle-rc-options-editor"));
-	assert (act);
-
-	act->activate();
-
-	rc_option_editor->set_current_page (_("Misc"));
+	show_tabbable (rc_option_editor);
+	rc_option_editor->set_current_page (_("Misc/Click"));
 	return true;
 }
 
@@ -734,4 +664,30 @@ ARDOUR_UI::toggle_follow_edits ()
 	UIConfiguration::instance().set_follow_edits (tact->get_active ());
 }
 
+void
+ARDOUR_UI::update_title ()
+{
+	if (_session) {
+		bool dirty = _session->dirty();
 
+		string session_name;
+
+		if (_session->snap_name() != _session->name()) {
+			session_name = _session->snap_name();
+		} else {
+			session_name = _session->name();
+		}
+
+		if (dirty) {
+			session_name = "*" + session_name;
+		}
+
+		WindowTitle title (session_name);
+		title += Glib::get_application_name();
+		_main_window.set_title (title.get_string());
+	} else {
+		WindowTitle title (Glib::get_application_name());
+		_main_window.set_title (title.get_string());
+	}
+
+}
diff --git a/gtk2_ardour/ardour_ui_dependents.cc b/gtk2_ardour/ardour_ui_dependents.cc
index 7227d4f..8490643 100644
--- a/gtk2_ardour/ardour_ui_dependents.cc
+++ b/gtk2_ardour/ardour_ui_dependents.cc
@@ -31,16 +31,22 @@
 
 #include "ardour/session.h"
 
+#include "gtkmm2ext/bindings.h"
+
 #include "actions.h"
 #include "ardour_ui.h"
 #include "public_editor.h"
 #include "meterbridge.h"
+#include "luawindow.h"
 #include "mixer_ui.h"
 #include "keyboard.h"
 #include "splash.h"
+#include "rc_option_editor.h"
 #include "route_params_ui.h"
 #include "opts.h"
-#include "i18n.h"
+#include "utils.h"
+
+#include "pbd/i18n.h"
 
 using namespace Gtk;
 using namespace PBD;
@@ -56,18 +62,53 @@ void
 ARDOUR_UI::we_have_dependents ()
 {
 	install_actions ();
+	load_bindings ();
+
 	ProcessorBox::register_actions ();
-	keyboard->setup_keybindings ();
+
+	/* Global, editor, mixer, processor box actions are defined now. Link
+	   them with any bindings, so that GTK does not get a chance to define
+	   the GTK accel map entries first when we ask the GtkUIManager to
+	   create menus/widgets.
+
+	   If GTK adds the actions to its accel map before we do, we lose our
+	   freedom to use any keys. More precisely, we can use any keys, but
+	   ones that GTK considers illegal as accelerators will not show up in
+	   menus.
+
+	   There are other dynamic actions that can be created by a monitor
+	   section, by step entry dialogs. These need to be handled
+	   separately. They don't tend to use GTK-illegal bindings and more
+	   importantly they don't have menus showing the bindings, so it is
+	   less of an issue.
+	*/
+
+	Gtkmm2ext::Bindings::associate_all ();
+
 	editor->setup_tooltips ();
 	editor->UpdateAllTransportClocks.connect (sigc::mem_fun (*this, &ARDOUR_UI::update_transport_clocks));
 
+	/* catch up on tabbable state, in the right order to leave the editor
+	 * selected by default
+	 */
+
+	tabbable_state_change (*rc_option_editor);
+	tabbable_state_change (*mixer);
+	tabbable_state_change (*editor);
+
 	/* all actions are defined */
 
-	ActionManager::enable_accelerators ();
 	ActionManager::load_menus (ARDOUR_COMMAND_LINE::menus_file);
 
 	editor->track_mixer_selection ();
 	mixer->track_editor_selection ();
+
+	/* catch up on parameters */
+
+	boost::function<void (std::string)> pc (boost::bind (&ARDOUR_UI::parameter_changed, this, _1));
+	Config->map_parameters (pc);
+
+	UIConfiguration::instance().reset_dpi ();
 }
 
 void
@@ -79,6 +120,7 @@ ARDOUR_UI::connect_dependents_to_session (ARDOUR::Session *s)
 	BootMessage (_("Setup Mixer"));
 	mixer->set_session (s);
 	meterbridge->set_session (s);
+	luawindow->set_session (s);
 
 	/* its safe to do this now */
 
@@ -101,3 +143,258 @@ ARDOUR_UI::exit_on_main_window_close (GdkEventAny * /*ev*/)
 #endif
 }
 
+GtkNotebook*
+ARDOUR_UI::tab_window_root_drop (GtkNotebook* src,
+				 GtkWidget* w,
+				 gint x,
+				 gint y,
+				 gpointer)
+{
+	using namespace std;
+	Gtk::Notebook* nb = 0;
+	Gtk::Window* win = 0;
+	Gtkmm2ext::Tabbable* tabbable = 0;
+
+
+	if (w == GTK_WIDGET(editor->contents().gobj())) {
+		tabbable = editor;
+	} else if (w == GTK_WIDGET(mixer->contents().gobj())) {
+		tabbable = mixer;
+	} else if (w == GTK_WIDGET(rc_option_editor->contents().gobj())) {
+		tabbable = rc_option_editor;
+	} else {
+		return 0;
+	}
+
+	nb = tabbable->tab_root_drop ();
+	win = tabbable->own_window ();
+
+	if (nb) {
+		win->move (x, y);
+		win->show_all ();
+		win->present ();
+		return nb->gobj();
+	}
+
+	return 0; /* what was that? */
+}
+
+bool
+ARDOUR_UI::idle_ask_about_quit ()
+{
+	if (_session && _session->dirty()) {
+		finish ();
+	} else {
+		/* no session or session not dirty, but still ask anyway */
+
+		Gtk::MessageDialog msg (string_compose ("Quit %1?", PROGRAM_NAME),
+		                        false, /* no markup */
+		                        Gtk::MESSAGE_INFO,
+		                        Gtk::BUTTONS_YES_NO,
+		                        true); /* modal */
+		msg.set_default_response (Gtk::RESPONSE_YES);
+
+		if (msg.run() == Gtk::RESPONSE_YES) {
+			finish ();
+		}
+	}
+
+	/* not reached but keep the compiler happy */
+
+	return false;
+}
+
+bool
+ARDOUR_UI::main_window_delete_event (GdkEventAny* ev)
+{
+	/* quit the application as soon as we go idle. If we call this here,
+	 * the window manager/desktop can think we're taking too longer to
+	 * handle the "delete" event
+	 */
+
+	Glib::signal_idle().connect (sigc::mem_fun (*this, &ARDOUR_UI::idle_ask_about_quit));
+
+	return true;
+}
+
+static GtkNotebook*
+tab_window_root_drop (GtkNotebook* src,
+		      GtkWidget* w,
+		      gint x,
+		      gint y,
+		      gpointer user_data)
+{
+	return ARDOUR_UI::instance()->tab_window_root_drop (src, w, x, y, user_data);
+}
+
+int
+ARDOUR_UI::setup_windows ()
+{
+	/* actions do not need to be defined when we load keybindings. They
+	 * will be lazily discovered. But bindings do need to exist when we
+	 * create windows/tabs with their own binding sets.
+	 */
+
+	keyboard->setup_keybindings ();
+
+	_tabs.signal_switch_page().connect (sigc::mem_fun (*this, &ARDOUR_UI::tabs_switch));
+	_tabs.signal_page_added().connect (sigc::mem_fun (*this, &ARDOUR_UI::tabs_page_added));
+	_tabs.signal_page_removed().connect (sigc::mem_fun (*this, &ARDOUR_UI::tabs_page_removed));
+
+	rc_option_editor = new RCOptionEditor;
+	rc_option_editor->StateChange.connect (sigc::mem_fun (*this, &ARDOUR_UI::tabbable_state_change));
+
+	if (create_editor ()) {
+		error << _("UI: cannot setup editor") << endmsg;
+		return -1;
+	}
+
+	if (create_mixer ()) {
+		error << _("UI: cannot setup mixer") << endmsg;
+		return -1;
+	}
+
+	if (create_meterbridge ()) {
+		error << _("UI: cannot setup meterbridge") << endmsg;
+		return -1;
+	}
+
+	if (create_luawindow ()) {
+		error << _("UI: cannot setup luawindow") << endmsg;
+		return -1;
+	}
+
+	/* order of addition affects order seen in initial window display */
+
+	rc_option_editor->add_to_notebook (_tabs, _("Preferences"));
+	mixer->add_to_notebook (_tabs, _("Mixer"));
+	editor->add_to_notebook (_tabs, _("Editor"));
+
+	/* all other dialogs are created conditionally */
+
+	we_have_dependents ();
+
+#ifdef TOP_MENUBAR
+	EventBox* status_bar_event_box = manage (new EventBox);
+
+	status_bar_event_box->add (status_bar_label);
+	status_bar_event_box->add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK);
+	status_bar_label.set_size_request (300, -1);
+
+	status_bar_label.show ();
+	status_bar_event_box->show ();
+
+	status_bar_event_box->signal_button_press_event().connect (mem_fun (*this, &ARDOUR_UI::status_bar_button_press));
+
+	status_bar_hpacker.pack_start (*status_bar_event_box, true, true, 6);
+	status_bar_hpacker.pack_start (menu_bar_base, false, false, 2);
+#else
+	top_packer.pack_start (menu_bar_base, false, false);
+#endif
+
+	main_vpacker.pack_start (top_packer, false, false);
+
+	/* now add the transport frame to the top of main window */
+
+	main_vpacker.pack_start (transport_frame, false, false);
+	main_vpacker.pack_start (_tabs, true, true);
+
+#ifdef TOP_MENUBAR
+	main_vpacker.pack_start (status_bar_hpacker, false, false);
+#endif
+
+	for (int i = 0; i < 9; ++i) {
+		std::string const a = string_compose (X_("script-action-%1"), i + 1);
+		Glib::RefPtr<Action> act = ActionManager::get_action(X_("Editor"), a.c_str());
+		assert (act);
+		action_script_call_btn[i].set_text (string_compose ("%1", i+1));
+		action_script_call_btn[i].set_related_action (act);
+		if (act->get_sensitive ()) {
+			action_script_call_btn[i].set_visual_state (Gtkmm2ext::VisualState (action_script_call_btn[i].visual_state() & ~Gtkmm2ext::Insensitive));
+		} else {
+			action_script_call_btn[i].set_visual_state (Gtkmm2ext::VisualState (action_script_call_btn[i].visual_state() | Gtkmm2ext::Insensitive));
+		}
+		const int row = i % 3;
+		const int col = i / 3;
+		action_script_table.attach (action_script_call_btn[i], col, col + 1, row, row + 1, EXPAND, EXPAND, 1, 1);
+		action_script_call_btn[i].set_no_show_all ();
+	}
+	action_script_table.show ();
+
+	setup_transport();
+	build_menu_bar ();
+	setup_tooltips ();
+
+	_main_window.signal_delete_event().connect (sigc::mem_fun (*this, &ARDOUR_UI::main_window_delete_event));
+
+	/* pack the main vpacker into the main window and show everything
+	 */
+
+	_main_window.add (main_vpacker);
+	transport_frame.show_all ();
+
+	const XMLNode* mnode = main_window_settings ();
+
+	if (mnode) {
+		XMLProperty const * prop;
+		gint x = -1;
+		gint y = -1;
+		gint w = -1;
+		gint h = -1;
+
+		if ((prop = mnode->property (X_("x"))) != 0) {
+			x = atoi (prop->value());
+		}
+
+		if ((prop = mnode->property (X_("y"))) != 0) {
+			y = atoi (prop->value());
+		}
+
+		if ((prop = mnode->property (X_("w"))) != 0) {
+			w = atoi (prop->value());
+		}
+
+		if ((prop = mnode->property (X_("h"))) != 0) {
+			h = atoi (prop->value());
+		}
+
+		if (x >= 0 && y >= 0 && w >= 0 && h >= 0) {
+			_main_window.set_position (Gtk::WIN_POS_NONE);
+		}
+
+		if (x >= 0 && y >= 0) {
+			_main_window.move (x, y);
+		}
+
+		if (w > 0 && h > 0) {
+			_main_window.set_default_size (w, h);
+		}
+
+		std::string current_tab;
+
+		if ((prop = mnode->property (X_("current-tab"))) != 0) {
+			current_tab = prop->value();
+		} else {
+			current_tab = "editor";
+		}
+		if (mixer && current_tab == "mixer") {
+			_tabs.set_current_page (_tabs.page_num (mixer->contents()));
+		} else if (rc_option_editor && current_tab == "preferences") {
+			_tabs.set_current_page (_tabs.page_num (rc_option_editor->contents()));
+		} else if (editor) {
+			_tabs.set_current_page (_tabs.page_num (editor->contents()));
+		}
+	}
+
+	setup_toplevel_window (_main_window, "", this);
+	_main_window.show_all ();
+
+	_tabs.set_show_tabs (false);
+
+	/* It would be nice if Gtkmm had wrapped this rather than just
+	 * deprecating the old set_window_creation_hook() method, but oh well...
+	 */
+	g_signal_connect (_tabs.gobj(), "create-window", (GCallback) ::tab_window_root_drop, this);
+
+	return 0;
+}
diff --git a/gtk2_ardour/ardour_ui_dialogs.cc b/gtk2_ardour/ardour_ui_dialogs.cc
index 859a167..e372c1e 100644
--- a/gtk2_ardour/ardour_ui_dialogs.cc
+++ b/gtk2_ardour/ardour_ui_dialogs.cc
@@ -23,13 +23,21 @@
    This is to cut down on the compile times.  It also helps with my sanity.
 */
 
+#include <vector>
+
+#include "pbd/convert.h"
+
 #include "ardour/audioengine.h"
 #include "ardour/automation_watch.h"
 #include "ardour/control_protocol_manager.h"
 #include "ardour/profile.h"
 #include "ardour/session.h"
+
 #include "control_protocol/control_protocol.h"
 
+#include "gtkmm2ext/keyboard.h"
+#include "gtkmm2ext/utils.h"
+
 #include "actions.h"
 #include "add_route_dialog.h"
 #include "add_video_dialog.h"
@@ -41,12 +49,16 @@
 #include "gui_thread.h"
 #include "keyeditor.h"
 #include "location_ui.h"
+#include "lua_script_manager.h"
+#include "luawindow.h"
 #include "main_clock.h"
 #include "meterbridge.h"
 #include "meter_patterns.h"
+#include "monitor_section.h"
 #include "midi_tracer.h"
 #include "mixer_ui.h"
 #include "public_editor.h"
+#include "processor_box.h"
 #include "rc_option_editor.h"
 #include "route_params_ui.h"
 #include "shuttle_control.h"
@@ -58,9 +70,7 @@
 #include "time_info_box.h"
 #include "timers.h"
 
-#include <gtkmm2ext/keyboard.h>
-
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 using namespace PBD;
@@ -153,7 +163,7 @@ ARDOUR_UI::set_session (Session *s)
 	_session->RecordStateChanged.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::record_state_changed, this), gui_context());
 	_session->StepEditStatusChange.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::step_edit_status_change, this, _1), gui_context());
 	_session->TransportStateChange.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::map_transport_state, this), gui_context());
-	_session->DirtyChanged.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::update_autosave, this), gui_context());
+	_session->DirtyChanged.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::session_dirty_changed, this), gui_context());
 
 	_session->Xrun.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::xrun_handler, this, _1), gui_context());
 	_session->SoloActive.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::soloing_changed, this, _1), gui_context());
@@ -188,8 +198,8 @@ ARDOUR_UI::set_session (Session *s)
 	update_format ();
 
 	if (meter_box.get_parent()) {
-		transport_tearoff_hbox.remove (meter_box);
-		transport_tearoff_hbox.remove (editor_meter_peak_display);
+		transport_hbox.remove (meter_box);
+		transport_hbox.remove (editor_meter_peak_display);
 	}
 
 	if (editor_meter) {
@@ -200,8 +210,8 @@ ARDOUR_UI::set_session (Session *s)
 	}
 
 	if (meter_box.get_parent()) {
-		transport_tearoff_hbox.remove (meter_box);
-		transport_tearoff_hbox.remove (editor_meter_peak_display);
+		transport_hbox.remove (meter_box);
+		transport_hbox.remove (editor_meter_peak_display);
 	}
 
 	if (_session &&
@@ -231,12 +241,14 @@ ARDOUR_UI::set_session (Session *s)
 		editor_meter_peak_display.signal_button_release_event().connect (sigc::mem_fun(*this, &ARDOUR_UI::editor_meter_peak_button_release), false);
 
 		if (UIConfiguration::instance().get_show_editor_meter() && !ARDOUR::Profile->get_trx()) {
-			transport_tearoff_hbox.pack_start (meter_box, false, false);
-			transport_tearoff_hbox.pack_start (editor_meter_peak_display, false, false);
+			transport_hbox.pack_start (meter_box, false, false);
+			transport_hbox.pack_start (editor_meter_peak_display, false, false);
 			meter_box.show();
 			editor_meter_peak_display.show();
 		}
 	}
+
+	update_title ();
 }
 
 int
@@ -315,93 +327,430 @@ ARDOUR_UI::unload_session (bool hide_stuff)
 	session_loaded = false;
 
 	update_buffer_load ();
+	update_title ();
 
 	return 0;
 }
 
-static bool
-_hide_splash (gpointer arg)
+void
+ARDOUR_UI::toggle_editor_and_mixer ()
 {
-	((ARDOUR_UI*)arg)->hide_splash();
-	return false;
+	if (editor->tabbed() && mixer->tabbed()) {
+		/* both in the same window */
+		if (_tabs.get_current_page() == _tabs.page_num (editor->contents())) {
+			_tabs.set_current_page (_tabs.page_num (mixer->contents()));
+		} else if (_tabs.get_current_page() == _tabs.page_num (mixer->contents())) {
+			_tabs.set_current_page (_tabs.page_num (editor->contents()));
+		} else {
+			/* go to mixer */
+			_tabs.set_current_page (_tabs.page_num (mixer->contents()));
+		}
+		return;
+	}
+
+
+	if (editor->tabbed() && !mixer->tabbed()) {
+		/* editor is tabbed, mixer is not */
+
+		Gtk::Window* mwin = mixer->current_toplevel ();
+
+		if (!mwin) {
+			/* mixer's own window doesn't exist */
+			mixer->make_visible ();
+		} else if (!mwin->is_mapped ()) {
+			/* mixer's own window exists but isn't mapped */
+			mixer->make_visible ();
+		} else {
+			/* mixer window is mapped, editor is visible as tab */
+			Gtk::Widget* f = mwin->get_focus();
+			if (f && f->has_focus()) {
+				/* mixer has focus, switch to editor */
+				editor->make_visible ();
+			} else {
+				mixer->make_visible ();
+			}
+		}
+		return;
+	}
+
+	if (!editor->tabbed() && mixer->tabbed()) {
+		/* mixer is tabbed, editor is not */
+
+		Gtk::Window* ewin = editor->current_toplevel ();
+
+		if (!ewin) {
+			/* mixer's own window doesn't exist */
+			editor->make_visible ();
+		} else if (!ewin->is_mapped ()) {
+			/* editor's own window exists but isn't mapped */
+			editor->make_visible ();
+		} else {
+			/* editor window is mapped, mixer is visible as tab */
+			Gtk::Widget* f = ewin->get_focus();
+			if (f && f->has_focus()) {
+				/* editor has focus, switch to mixer */
+				mixer->make_visible ();
+			} else {
+				editor->make_visible ();
+			}
+		}
+		return;
+	}
 }
 
 void
-ARDOUR_UI::goto_editor_window ()
+ARDOUR_UI::step_up_through_tabs ()
 {
-	if (splash && splash->is_visible()) {
-		// in 2 seconds, hide the splash screen
-		Glib::signal_timeout().connect (sigc::bind (sigc::ptr_fun (_hide_splash), this), 2000);
+	std::vector<Tabbable*> candidates;
+
+	/* this list must match the order of visibility buttons */
+
+	if (!editor->window_visible()) {
+		candidates.push_back (editor);
+	}
+
+	if (!mixer->window_visible()) {
+		candidates.push_back (mixer);
+	}
+
+	if (!rc_option_editor->window_visible()) {
+		candidates.push_back (rc_option_editor);
 	}
 
-	editor->show_window ();
-	editor->present ();
-	/* mixer should now be on top */
-	if (UIConfiguration::instance().get_transients_follow_front()) {
-		WM::Manager::instance().set_transient_for (editor);
+	if (candidates.size() < 2) {
+		/* nothing to be done with zero or one visible in tabs */
+		return;
+	}
+
+	std::vector<Tabbable*>::iterator prev = candidates.end();
+	std::vector<Tabbable*>::iterator i;
+	Gtk::Widget* w = _tabs.get_nth_page (_tabs.get_current_page ());
+
+	for (i = candidates.begin(); i != candidates.end(); ++i) {
+		if (w == &(*i)->contents()) {
+			if (prev != candidates.end()) {
+				_tabs.set_current_page (_tabs.page_num ((*prev)->contents()));
+			} else {
+				_tabs.set_current_page (_tabs.page_num (candidates.back()->contents()));
+			}
+			return;
+		}
+		prev = i;
 	}
-	_mixer_on_top = false;
 }
 
 void
-ARDOUR_UI::goto_mixer_window ()
+ARDOUR_UI::step_down_through_tabs ()
 {
-	Glib::RefPtr<Gdk::Window> win;
-	Glib::RefPtr<Gdk::Screen> screen;
+	std::vector<Tabbable*> candidates;
+
+	/* this list must match the order of visibility buttons */
+
+	if (!editor->window_visible()) {
+		candidates.push_back (editor);
+	}
+
+	if (!mixer->window_visible()) {
+		candidates.push_back (mixer);
+	}
+
+	if (!rc_option_editor->window_visible()) {
+		candidates.push_back (rc_option_editor);
+	}
+
+	if (candidates.size() < 2) {
+		/* nothing to be done with zero or one visible in tabs */
+		return;
+	}
 
-	if (editor) {
-		win = editor->get_window ();
+	std::vector<Tabbable*>::reverse_iterator next = candidates.rend();
+	std::vector<Tabbable*>::reverse_iterator i;
+	Gtk::Widget* w = _tabs.get_nth_page (_tabs.get_current_page ());
+
+	for (i = candidates.rbegin(); i != candidates.rend(); ++i) {
+		if (w == &(*i)->contents()) {
+			if (next != candidates.rend()) {
+				_tabs.set_current_page (_tabs.page_num ((*next)->contents()));
+			} else {
+				_tabs.set_current_page (_tabs.page_num (candidates.front()->contents()));
+			}
+			break;
+		}
+		next = i;
 	}
+}
 
-	if (win) {
-		screen = win->get_screen();
+void
+ARDOUR_UI::key_change_tabbable_visibility (Tabbable* t)
+{
+	if (!t) {
+		return;
+	}
+
+	if (t->tabbed()) {
+		_tabs.set_current_page (_tabs.page_num (t->contents()));
+	} else if (!t->fully_visible()) {
+		t->make_visible ();
 	} else {
-		screen = Gdk::Screen::get_default();
+		_main_window.present ();
 	}
+}
 
-	if (g_getenv ("ARDOUR_LOVES_STUPID_TINY_SCREENS") == 0 && screen && screen->get_height() < 700) {
-		Gtk::MessageDialog msg (_("This screen is not tall enough to display the mixer window"));
-		msg.run ();
+void
+ARDOUR_UI::button_change_tabbable_visibility (Tabbable* t)
+{
+	/* For many/most users, clicking a button in the main window will make it
+	   the main/front/key window, which will change any stacking relationship they
+	   were trying to modify by clicking on the button in the first
+	   place. This button-aware method knows that click on
+	   a button designed to show/hide a Tabbable that has its own window
+	   will have made that window be obscured (as the main window comes to
+	   the front). We therefore *hide* the Tabbable's window if it is even
+	   partially visible, believing that this is likely because the
+	   Tabbable window used to be front, the user clicked to change that,
+	   and before we even get here, the main window has become front.
+	*/
+
+	if (!t) {
 		return;
 	}
 
-	mixer->show_window ();
-	mixer->present ();
-	/* mixer should now be on top */
-	if (UIConfiguration::instance().get_transients_follow_front()) {
-		WM::Manager::instance().set_transient_for (mixer);
+	if (t->tabbed()) {
+		_tabs.set_current_page (_tabs.page_num (t->contents()));
+	} else if (t->visible()) {
+		t->hide();
+	} else {
+		t->make_visible ();
 	}
-	_mixer_on_top = true;
 }
 
 void
-ARDOUR_UI::toggle_mixer_window ()
+ARDOUR_UI::show_tabbable (Tabbable* t)
 {
-	/* thse windows are created in ARDOUR_UI::setup_windows()
-	 * it should be impossible to get here with any of them being NULL
-	 */
-	assert (editor && mixer && meterbridge);
+	if (!t) {
+		return;
+	}
 
-	bool show = false;
-	bool obscuring = false;
+	t->make_visible ();
+}
 
-	if (mixer->not_visible ()) {
-		show = true;
+void
+ARDOUR_UI::hide_tabbable (Tabbable* t)
+{
+	if (!t) {
+		return;
 	}
-	else if (   (!editor->not_visible () && ARDOUR_UI_UTILS::windows_overlap (editor, mixer))
-	         || (!meterbridge->not_visible () && ARDOUR_UI_UTILS::windows_overlap (meterbridge, mixer))
-			) {
-		obscuring = true;
+	t->make_invisible ();
+}
+
+void
+ARDOUR_UI::attach_tabbable (Tabbable* t)
+{
+	if (!t) {
+		return;
 	}
 
-	if (obscuring && (editor->property_has_toplevel_focus() || meterbridge->property_has_toplevel_focus())) {
-		show = true;
+	t->attach ();
+}
+
+void
+ARDOUR_UI::detach_tabbable (Tabbable* t)
+{
+	if (!t) {
+		return;
 	}
+	t->detach ();
+}
+
+void
+ARDOUR_UI::tabs_page_added (Widget*,guint)
+{
+	if (_tabs.get_n_pages() > 1) {
+
+		std::vector<TargetEntry> drag_target_entries;
+		drag_target_entries.push_back (TargetEntry ("tabbable"));
+
+		editor_visibility_button.drag_source_set (drag_target_entries);
+		mixer_visibility_button.drag_source_set (drag_target_entries);
+		prefs_visibility_button.drag_source_set (drag_target_entries);
+
+		editor_visibility_button.drag_source_set_icon (Gtkmm2ext::pixbuf_from_string (editor->name(),
+		                                                                              Pango::FontDescription ("Sans 24"),
+		                                                                              0, 0,
+		                                                                              Gdk::Color ("red")));
+		mixer_visibility_button.drag_source_set_icon (Gtkmm2ext::pixbuf_from_string (mixer->name(),
+		                                                                             Pango::FontDescription ("Sans 24"),
+		                                                                             0, 0,
+		                                                                             Gdk::Color ("red")));
+		prefs_visibility_button.drag_source_set_icon (Gtkmm2ext::pixbuf_from_string (rc_option_editor->name(),
+		                                                                             Pango::FontDescription ("Sans 24"),
+		                                                                             0, 0,
+		                                                                             Gdk::Color ("red")));
+	}
+}
+
+void
+ARDOUR_UI::tabs_page_removed (Widget*, guint)
+{
+	if (_tabs.get_n_pages() < 2) {
+		editor_visibility_button.drag_source_unset ();
+		mixer_visibility_button.drag_source_unset ();
+		prefs_visibility_button.drag_source_unset ();
+	}
+}
+
+void
+ARDOUR_UI::tabs_switch (GtkNotebookPage*, guint page)
+{
+	if (editor && (page == (guint) _tabs.page_num (editor->contents()))) {
+		editor_visibility_button.set_active_state (Gtkmm2ext::ImplicitActive);
+
+		if (mixer && (mixer->tabbed() || mixer->tabbed_by_default())) {
+			mixer_visibility_button.set_active_state (Gtkmm2ext::Off);
+		}
+
+		if (rc_option_editor && (rc_option_editor->tabbed() || rc_option_editor->tabbed_by_default())) {
+			prefs_visibility_button.set_active_state (Gtkmm2ext::Off);
+		}
+	} else if (mixer && (page == (guint) _tabs.page_num (mixer->contents()))) {
+
+		if (editor && (editor->tabbed() || editor->tabbed_by_default())) {
+			editor_visibility_button.set_active_state (Gtkmm2ext::Off);
+		}
+
+		mixer_visibility_button.set_active_state (Gtkmm2ext::ImplicitActive);
+
+		if (rc_option_editor && (rc_option_editor->tabbed() || rc_option_editor->tabbed_by_default())) {
+			prefs_visibility_button.set_active_state (Gtkmm2ext::Off);
+		}
+
+	} else if (page == (guint) _tabs.page_num (rc_option_editor->contents())) {
+
+		if (editor && (editor->tabbed() || editor->tabbed_by_default())) {
+			editor_visibility_button.set_active_state (Gtkmm2ext::Off);
+		}
+
+		if (mixer && (mixer->tabbed() || mixer->tabbed_by_default())) {
+			mixer_visibility_button.set_active_state (Gtkmm2ext::Off);
+		}
+
+		prefs_visibility_button.set_active_state (Gtkmm2ext::ImplicitActive);
+	}
+
+}
+
+void
+ARDOUR_UI::tabbable_state_change (Tabbable& t)
+{
+	std::vector<std::string> insensitive_action_names;
+	std::vector<std::string> sensitive_action_names;
+	std::vector<std::string> active_action_names;
+	std::vector<std::string> inactive_action_names;
+	Glib::RefPtr<Action> action;
+	std::string downcased_name = downcase (t.name());
+	enum ViewState {
+		Tabbed,
+		Windowed,
+		Hidden
+	};
+	ViewState vs;
+
+	if (t.tabbed()) {
+
+		insensitive_action_names.push_back (string_compose ("attach-%1", downcased_name));
+		sensitive_action_names.push_back (string_compose ("show-%1", downcased_name));
+		sensitive_action_names.push_back (string_compose ("detach-%1", downcased_name));
+		sensitive_action_names.push_back (string_compose ("hide-%1", downcased_name));
+
+		vs = Tabbed;
+
+	} else if (t.tabbed_by_default ()) {
+
+		insensitive_action_names.push_back (string_compose ("attach-%1", downcased_name));
+		insensitive_action_names.push_back (string_compose ("hide-%1", downcased_name));
+		sensitive_action_names.push_back (string_compose ("show-%1", downcased_name));
+		sensitive_action_names.push_back (string_compose ("detach-%1", downcased_name));
+
+		vs = Hidden;
+
+	} else if (t.window_visible()) {
+
+		insensitive_action_names.push_back (string_compose ("detach-%1", downcased_name));
+		sensitive_action_names.push_back (string_compose ("show-%1", downcased_name));
+		sensitive_action_names.push_back (string_compose ("attach-%1", downcased_name));
+		sensitive_action_names.push_back (string_compose ("hide-%1", downcased_name));
+
+		active_action_names.push_back (string_compose ("show-%1", downcased_name));
+		inactive_action_names.push_back (string_compose ("hide-%1", downcased_name));
+
+		vs = Windowed;
 
-	if (show) {
-		goto_mixer_window ();
 	} else {
-		mixer->hide ();
+
+		/* not currently visible. allow user to retab it or just make
+		 * it visible.
+		 */
+
+		insensitive_action_names.push_back (string_compose ("detach-%1", downcased_name));
+		insensitive_action_names.push_back (string_compose ("hide-%1", downcased_name));
+		sensitive_action_names.push_back (string_compose ("show-%1", downcased_name));
+		sensitive_action_names.push_back (string_compose ("attach-%1", downcased_name));
+
+		active_action_names.push_back (string_compose ("hide-%1", downcased_name));
+		inactive_action_names.push_back (string_compose ("show-%1", downcased_name));
+
+		vs = Hidden;
+	}
+
+	for (std::vector<std::string>::iterator s = insensitive_action_names.begin(); s != insensitive_action_names.end(); ++s) {
+		action = ActionManager::get_action (X_("Common"), (*s).c_str());
+		if (action) {
+			action->set_sensitive (false);
+		}
+	}
+
+	for (std::vector<std::string>::iterator s = sensitive_action_names.begin(); s != sensitive_action_names.end(); ++s) {
+		action = ActionManager::get_action (X_("Common"), (*s).c_str());
+		if (action) {
+			action->set_sensitive (true);
+		}
+	}
+
+	ArdourButton* vis_button = 0;
+	std::vector<ArdourButton*> other_vis_buttons;
+
+	if (&t == editor) {
+		vis_button = &editor_visibility_button;
+		other_vis_buttons.push_back (&mixer_visibility_button);
+		other_vis_buttons.push_back (&prefs_visibility_button);
+	} else if (&t == mixer) {
+		vis_button = &mixer_visibility_button;
+		other_vis_buttons.push_back (&editor_visibility_button);
+		other_vis_buttons.push_back (&prefs_visibility_button);
+	} else if (&t == rc_option_editor) {
+		vis_button = &prefs_visibility_button;
+		other_vis_buttons.push_back (&editor_visibility_button);
+		other_vis_buttons.push_back (&mixer_visibility_button);
+	}
+
+	if (!vis_button) {
+		return;
+	}
+
+	switch (vs) {
+	case Tabbed:
+		vis_button->set_active_state (Gtkmm2ext::ImplicitActive);
+		break;
+	case Windowed:
+		vis_button->set_active_state (Gtkmm2ext::ExplicitActive);
+		break;
+	case Hidden:
+		vis_button->set_active_state (Gtkmm2ext::Off);
+		break;
+	}
+
+	for (std::vector<ArdourButton*>::iterator b = other_vis_buttons.begin(); b != other_vis_buttons.end(); ++b) {
+		(*b)->set_active_state (Gtkmm2ext::Off);
 	}
 }
 
@@ -415,14 +764,13 @@ ARDOUR_UI::toggle_meterbridge ()
 
 	if (meterbridge->not_visible ()) {
 		show = true;
-	}
-	else if (   (!editor->not_visible() && ARDOUR_UI_UTILS::windows_overlap (editor, meterbridge))
-	         || (!mixer->not_visible () && ARDOUR_UI_UTILS::windows_overlap (meterbridge, mixer))
-			) {
+	} else if ((editor->window_visible() && ARDOUR_UI_UTILS::windows_overlap (editor->own_window(), meterbridge)) ||
+	           (mixer->window_visible () && ARDOUR_UI_UTILS::windows_overlap (mixer->own_window(), meterbridge))) {
 		obscuring = true;
 	}
 
-	if (obscuring && (editor->property_has_toplevel_focus() || mixer->property_has_toplevel_focus())) {
+	if (obscuring && ((editor->own_window() && editor->own_window()->property_has_toplevel_focus()) ||
+	                  (mixer->own_window() && mixer->own_window()->property_has_toplevel_focus()))) {
 		show = true;
 	}
 
@@ -436,42 +784,27 @@ ARDOUR_UI::toggle_meterbridge ()
 }
 
 void
-ARDOUR_UI::toggle_editor_mixer ()
+ARDOUR_UI::toggle_luawindow ()
 {
-	bool obscuring = false;
+	assert (editor && luawindow);
 
-	if (editor && mixer) {
-		if (ARDOUR_UI_UTILS::windows_overlap (editor, mixer)) {
-			obscuring = true;
-		}
+	bool show = false;
+
+	if (luawindow->not_visible ()) {
+		show = true;
 	}
+	// TODO check overlap
 
-	if (mixer && !mixer->not_visible() && mixer->property_has_toplevel_focus()) {
-		if (obscuring) {
-			goto_editor_window();
-		}
-	} else if (editor && !editor->not_visible() && editor->property_has_toplevel_focus()) {
-		if (obscuring) {
-			goto_mixer_window();
-		}
-	} else if (mixer && mixer->not_visible()) {
-		if (obscuring) {
-			goto_mixer_window ();
-		}
-	} else if (editor && editor->not_visible()) {
-		if (obscuring) {
-			goto_editor_window ();
-		}
-	} else if (obscuring) {
-		//it's unclear what to do here, so just do the opposite of what we did last time  (old behavior)
-		if (_mixer_on_top) {
-			goto_editor_window ();
-		} else {
-			goto_mixer_window ();
-		}
+	if (show) {
+		luawindow->show_window ();
+		luawindow->present ();
+		luawindow->raise ();
+	} else {
+		luawindow->hide_window (NULL);
 	}
 }
 
+
 void
 ARDOUR_UI::new_midi_tracer_window ()
 {
@@ -496,6 +829,18 @@ ARDOUR_UI::new_midi_tracer_window ()
 	}
 }
 
+KeyEditor*
+ARDOUR_UI::create_key_editor ()
+{
+	KeyEditor* kedit = new KeyEditor;
+
+	for (std::list<Bindings*>::iterator b = Bindings::bindings.begin(); b != Bindings::bindings.end(); ++b) {
+		kedit->add_tab ((*b)->name(), **b);
+	}
+
+	return kedit;
+}
+
 BundleManager*
 ARDOUR_UI::create_bundle_manager ()
 {
@@ -533,23 +878,23 @@ ARDOUR_UI::handle_locations_change (Location *)
 }
 
 bool
-ARDOUR_UI::main_window_state_event_handler (GdkEventWindowState* ev, bool window_was_editor)
+ARDOUR_UI::tabbed_window_state_event_handler (GdkEventWindowState* ev, void* object)
 {
-	if (window_was_editor) {
+	if (object == editor) {
 
 		if ((ev->changed_mask & GDK_WINDOW_STATE_FULLSCREEN) &&
 		    (ev->new_window_state & GDK_WINDOW_STATE_FULLSCREEN)) {
 			if (big_clock_window) {
-				big_clock_window->set_transient_for (*editor);
+				big_clock_window->set_transient_for (*editor->own_window());
 			}
 		}
 
-	} else {
+	} else if (object == mixer) {
 
 		if ((ev->changed_mask & GDK_WINDOW_STATE_FULLSCREEN) &&
 		    (ev->new_window_state & GDK_WINDOW_STATE_FULLSCREEN)) {
 			if (big_clock_window) {
-				big_clock_window->set_transient_for (*mixer);
+				big_clock_window->set_transient_for (*mixer->own_window());
 			}
 		}
 	}
diff --git a/gtk2_ardour/ardour_ui_ed.cc b/gtk2_ardour/ardour_ui_ed.cc
index 06995f7..d10e673 100644
--- a/gtk2_ardour/ardour_ui_ed.cc
+++ b/gtk2_ardour/ardour_ui_ed.cc
@@ -30,12 +30,13 @@
 #include <cmath>
 
 #include <glibmm/miscutils.h>
+#include <gtkmm/accelmap.h>
 #include <gtk/gtk.h>
 
+#include "gtkmm2ext/cairo_packer.h"
+#include "gtkmm2ext/tearoff.h"
 #include "gtkmm2ext/utils.h"
 #include "gtkmm2ext/window_title.h"
-#include "gtkmm2ext/tearoff.h"
-#include "gtkmm2ext/cairo_packer.h"
 
 #include "pbd/file_utils.h"
 #include "pbd/fpu.h"
@@ -50,12 +51,14 @@
 #include "editor.h"
 #include "actions.h"
 #include "meterbridge.h"
+#include "luawindow.h"
 #include "mixer_ui.h"
 #include "startup.h"
 #include "window_manager.h"
 #include "global_port_matrix.h"
 #include "location_ui.h"
 #include "main_clock.h"
+#include "rc_option_editor.h"
 
 #include <gtkmm2ext/application.h>
 
@@ -65,7 +68,7 @@
 
 #include "control_protocol/control_protocol.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
@@ -79,209 +82,277 @@ ARDOUR_UI::create_editor ()
 {
 	try {
 		editor = new Editor ();
+		editor->StateChange.connect (sigc::mem_fun (*this, &ARDOUR_UI::tabbable_state_change));
 	}
 
 	catch (failed_constructor& err) {
 		return -1;
 	}
 
-	editor->Realized.connect (sigc::mem_fun (*this, &ARDOUR_UI::editor_realized));
-	editor->signal_window_state_event().connect (sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::main_window_state_event_handler), true));
+	// editor->signal_event().connect (sigc::bind (sigc::ptr_fun (&Keyboard::catch_user_event_for_pre_dialog_focus), editor));
+
+	return 0;
+}
+
+int
+ARDOUR_UI::create_luawindow ()
+
+{
+	try {
+		luawindow = LuaWindow::instance ();
+	}
+	catch (failed_constructor& err) {
+		return -1;
+	}
 
 	return 0;
 }
 
 void
+ARDOUR_UI::escape ()
+{
+	Escape (); /* EMIT SIGNAL */
+}
+
+void
 ARDOUR_UI::install_actions ()
 {
-	Glib::RefPtr<ActionGroup> main_actions = ActionGroup::create (X_("Main"));
-	Glib::RefPtr<ActionGroup> main_menu_actions = ActionGroup::create (X_("Main_menu"));
+	Glib::RefPtr<ActionGroup> main_actions = global_actions.create_action_group (X_("Main"));
+	Glib::RefPtr<ActionGroup> main_menu_actions = global_actions.create_action_group (X_("Main_menu"));
 	Glib::RefPtr<Action> act;
 
+	global_actions.register_action (main_actions, X_("Escape"), _("Escape"), sigc::mem_fun (*this, &ARDOUR_UI::escape));
+
 	/* menus + submenus that need action items */
 
-	ActionManager::register_action (main_menu_actions, X_("Session"), _("Session"));
-	act = ActionManager::register_action (main_menu_actions, X_("Cleanup"), _("Clean-up"));
+	global_actions.register_action (main_menu_actions, X_("Session"), _("Session"));
+	act = global_actions.register_action (main_menu_actions, X_("Cleanup"), _("Clean-up"));
 	ActionManager::write_sensitive_actions.push_back (act);
-	ActionManager::register_action (main_menu_actions, X_("Sync"), _("Sync"));
-	ActionManager::register_action (main_menu_actions, X_("TransportOptions"), _("Options"));
-	ActionManager::register_action (main_menu_actions, X_("WindowMenu"), _("Window"));
-	ActionManager::register_action (main_menu_actions, X_("Help"), _("Help"));
- 	ActionManager::register_action (main_menu_actions, X_("KeyMouseActions"), _("Misc. Shortcuts"));
-	ActionManager::register_action (main_menu_actions, X_("AudioFileFormat"), _("Audio File Format"));
-	ActionManager::register_action (main_menu_actions, X_("AudioFileFormatHeader"), _("File Type"));
-	ActionManager::register_action (main_menu_actions, X_("AudioFileFormatData"), _("Sample Format"));
-	ActionManager::register_action (main_menu_actions, X_("ControlSurfaces"), _("Control Surfaces"));
-	ActionManager::register_action (main_menu_actions, X_("Plugins"), _("Plugins"));
-	ActionManager::register_action (main_menu_actions, X_("Metering"), _("Metering"));
-	ActionManager::register_action (main_menu_actions, X_("MeteringFallOffRate"), _("Fall Off Rate"));
-	ActionManager::register_action (main_menu_actions, X_("MeteringHoldTime"), _("Hold Time"));
-	ActionManager::register_action (main_menu_actions, X_("Denormals"), _("Denormal Handling"));
+	global_actions.register_action (main_menu_actions, X_("Sync"), _("Sync"));
+	global_actions.register_action (main_menu_actions, X_("TransportOptions"), _("Options"));
+	global_actions.register_action (main_menu_actions, X_("WindowMenu"), _("Window"));
+	global_actions.register_action (main_menu_actions, X_("MixerMenu"), _("Mixer"));
+	global_actions.register_action (main_menu_actions, X_("EditorMenu"), _("Editor"));
+	global_actions.register_action (main_menu_actions, X_("PrefsMenu"), _("Preferences"));
+	global_actions.register_action (main_menu_actions, X_("DetachMenu"), _("Detach"));
+	global_actions.register_action (main_menu_actions, X_("Help"), _("Help"));
+	global_actions.register_action (main_menu_actions, X_("KeyMouseActions"), _("Misc. Shortcuts"));
+	global_actions.register_action (main_menu_actions, X_("AudioFileFormat"), _("Audio File Format"));
+	global_actions.register_action (main_menu_actions, X_("AudioFileFormatHeader"), _("File Type"));
+	global_actions.register_action (main_menu_actions, X_("AudioFileFormatData"), _("Sample Format"));
+	global_actions.register_action (main_menu_actions, X_("ControlSurfaces"), _("Control Surfaces"));
+	global_actions.register_action (main_menu_actions, X_("Plugins"), _("Plugins"));
+	global_actions.register_action (main_menu_actions, X_("Metering"), _("Metering"));
+	global_actions.register_action (main_menu_actions, X_("MeteringFallOffRate"), _("Fall Off Rate"));
+	global_actions.register_action (main_menu_actions, X_("MeteringHoldTime"), _("Hold Time"));
+	global_actions.register_action (main_menu_actions, X_("Denormals"), _("Denormal Handling"));
 
 	/* the real actions */
 
-	act = ActionManager::register_action (main_actions, X_("New"), _("New..."),  hide_return (sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::get_session_parameters), false, true, "")));
+	act = global_actions.register_action (main_actions, X_("New"), _("New..."),  hide_return (sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::get_session_parameters), false, true, "")));
 
-	ActionManager::register_action (main_actions, X_("Open"), _("Open..."),  sigc::mem_fun(*this, &ARDOUR_UI::open_session));
-	ActionManager::register_action (main_actions, X_("Recent"), _("Recent..."),  sigc::mem_fun(*this, &ARDOUR_UI::open_recent_session));
-	act = ActionManager::register_action (main_actions, X_("Close"), _("Close"),  sigc::mem_fun(*this, &ARDOUR_UI::close_session));
+	global_actions.register_action (main_actions, X_("Open"), _("Open..."),  sigc::mem_fun(*this, &ARDOUR_UI::open_session));
+	global_actions.register_action (main_actions, X_("Recent"), _("Recent..."),  sigc::mem_fun(*this, &ARDOUR_UI::open_recent_session));
+	act = global_actions.register_action (main_actions, X_("Close"), _("Close"),  sigc::mem_fun(*this, &ARDOUR_UI::close_session));
 	ActionManager::session_sensitive_actions.push_back (act);
 
-	act = ActionManager::register_action (main_actions, X_("AddTrackBus"), _("Add Track or Bus..."),
-					      sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::add_route), (Gtk::Window*) 0));
+	act = global_actions.register_action (main_actions, X_("AddTrackBus"), _("Add Track or Bus..."), sigc::mem_fun(*this, &ARDOUR_UI::add_route));
 	ActionManager::session_sensitive_actions.push_back (act);
 	ActionManager::write_sensitive_actions.push_back (act);
 
-	act = ActionManager::register_action (main_actions, X_("duplicate-routes"), _("Duplicate Tracks/Busses..."),
+	act = global_actions.register_action (main_actions, X_("duplicate-routes"), _("Duplicate Tracks/Busses..."),
 	                                      sigc::mem_fun(*this, &ARDOUR_UI::start_duplicate_routes));
 	ActionManager::session_sensitive_actions.push_back (act);
 	ActionManager::write_sensitive_actions.push_back (act);
 	ActionManager::track_selection_sensitive_actions.push_back (act);
 
-	act = ActionManager::register_action (main_actions, X_("cancel-solo"), _("Cancel Solo"), sigc::mem_fun(*this, &ARDOUR_UI::cancel_solo));
+	act = global_actions.register_action (main_actions, X_("cancel-solo"), _("Cancel Solo"), sigc::mem_fun(*this, &ARDOUR_UI::cancel_solo));
 	ActionManager::session_sensitive_actions.push_back (act);
 	ActionManager::write_sensitive_actions.push_back (act);
 
+	act = global_actions.register_action (main_actions, X_("Scripting"), S_("Session|Scripting"));
+	ActionManager::session_sensitive_actions.push_back (act);
+
+	act = global_actions.register_action (main_actions, X_("AddLuaScript"), _("Add Lua Script..."),
+	              sigc::mem_fun (*this, &ARDOUR_UI::add_lua_script));
+	ActionManager::session_sensitive_actions.push_back (act);
+
+	act = global_actions.register_action (main_actions, X_("RemoveLuaScript"), _("Remove Lua Script"),
+	              sigc::mem_fun (*this, &ARDOUR_UI::remove_lua_script));
+	ActionManager::session_sensitive_actions.push_back (act);
 
-	act = ActionManager::register_action (main_actions, X_("OpenVideo"), _("Open Video"),
+	act = global_actions.register_action (main_actions, X_("OpenVideo"), _("Open Video..."),
 					      sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::add_video), (Gtk::Window*) 0));
 	ActionManager::session_sensitive_actions.push_back (act);
-	act = ActionManager::register_action (main_actions, X_("CloseVideo"), _("Remove Video"),
+	act = global_actions.register_action (main_actions, X_("CloseVideo"), _("Remove Video"),
 					      sigc::mem_fun (*this, &ARDOUR_UI::remove_video));
 	act->set_sensitive (false);
-	act = ActionManager::register_action (main_actions, X_("ExportVideo"), _("Export to Video File"),
-			hide_return (sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::export_video), false)));
+	act = global_actions.register_action (main_actions, X_("ExportVideo"), _("Export to Video File..."),
+	                                      hide_return (sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::export_video), false)));
 	ActionManager::session_sensitive_actions.push_back (act);
 
-	act = ActionManager::register_action (main_actions, X_("SnapshotStay"), _("Snapshot (& keep working on current version) ..."), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::snapshot_session), false));
+	act = global_actions.register_action (main_actions, X_("SnapshotStay"), _("Snapshot (& keep working on current version) ..."), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::snapshot_session), false));
 	ActionManager::session_sensitive_actions.push_back (act);
-	ActionManager::write_sensitive_actions.push_back (act);
 
-	act = ActionManager::register_action (main_actions, X_("SnapshotSwitch"), _("Snapshot (& switch to new version) ..."), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::snapshot_session), true));
+	act = global_actions.register_action (main_actions, X_("SnapshotSwitch"), _("Snapshot (& switch to new version) ..."), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::snapshot_session), true));
 	ActionManager::session_sensitive_actions.push_back (act);
-	ActionManager::write_sensitive_actions.push_back (act);
 
-	act = ActionManager::register_action (main_actions, X_("QuickSnapshotStay"), _("Quick Snapshot (& keep working on current version) ..."), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::quick_snapshot_session), false));
+	act = global_actions.register_action (main_actions, X_("QuickSnapshotStay"), _("Quick Snapshot (& keep working on current version) ..."), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::quick_snapshot_session), false));
 	ActionManager::session_sensitive_actions.push_back (act);
-	ActionManager::write_sensitive_actions.push_back (act);
 
-	act = ActionManager::register_action (main_actions, X_("QuickSnapshotSwitch"), _("Quick Snapshot (& switch to new version) ..."), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::quick_snapshot_session), true));
+	act = global_actions.register_action (main_actions, X_("QuickSnapshotSwitch"), _("Quick Snapshot (& switch to new version) ..."), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::quick_snapshot_session), true));
 	ActionManager::session_sensitive_actions.push_back (act);
 	ActionManager::write_sensitive_actions.push_back (act);
 
-	act = ActionManager::register_action (main_actions, X_("SaveAs"), _("Save As..."), sigc::mem_fun(*this, &ARDOUR_UI::save_session_as));
+	act = global_actions.register_action (main_actions, X_("SaveAs"), _("Save As..."), sigc::mem_fun(*this, &ARDOUR_UI::save_session_as));
 	ActionManager::session_sensitive_actions.push_back (act);
-	ActionManager::write_sensitive_actions.push_back (act);
 
-	act = ActionManager::register_action (main_actions, X_("Rename"), _("Rename..."), sigc::mem_fun(*this, &ARDOUR_UI::rename_session));
+	act = global_actions.register_action (main_actions, X_("Rename"), _("Rename..."), sigc::mem_fun(*this, &ARDOUR_UI::rename_session));
 	ActionManager::session_sensitive_actions.push_back (act);
 	ActionManager::write_sensitive_actions.push_back (act);
 
-	act = ActionManager::register_action (main_actions, X_("SaveTemplate"), _("Save Template..."),  sigc::mem_fun(*this, &ARDOUR_UI::save_template));
+	act = global_actions.register_action (main_actions, X_("SaveTemplate"), _("Save Template..."),  sigc::mem_fun(*this, &ARDOUR_UI::save_template));
 	ActionManager::session_sensitive_actions.push_back (act);
 
-	act = ActionManager::register_action (main_actions, X_("Metadata"), _("Metadata"));
+	act = global_actions.register_action (main_actions, X_("Metadata"), _("Metadata"));
 	ActionManager::session_sensitive_actions.push_back (act);
 
-	act = ActionManager::register_action (main_actions, X_("EditMetadata"), _("Edit Metadata..."),  sigc::mem_fun(*this, &ARDOUR_UI::edit_metadata));
+	act = global_actions.register_action (main_actions, X_("EditMetadata"), _("Edit Metadata..."),  sigc::mem_fun(*this, &ARDOUR_UI::edit_metadata));
 	ActionManager::session_sensitive_actions.push_back (act);
 
-	act = ActionManager::register_action (main_actions, X_("ImportMetadata"), _("Import Metadata..."),  sigc::mem_fun(*this, &ARDOUR_UI::import_metadata));
+	act = global_actions.register_action (main_actions, X_("ImportMetadata"), _("Import Metadata..."),  sigc::mem_fun(*this, &ARDOUR_UI::import_metadata));
 	ActionManager::session_sensitive_actions.push_back (act);
 
-	act = ActionManager::register_action (main_actions, X_("ExportAudio"), _("Export to Audio File(s)..."),  sigc::mem_fun (*editor, &PublicEditor::export_audio));
+	act = global_actions.register_action (main_actions, X_("ExportAudio"), _("Export to Audio File(s)..."),  sigc::mem_fun (*editor, &PublicEditor::export_audio));
 	ActionManager::session_sensitive_actions.push_back (act);
 
-	act = ActionManager::register_action (main_actions, X_("StemExport"), _("Stem export..."),  sigc::mem_fun (*editor, &PublicEditor::stem_export));
+	act = global_actions.register_action (main_actions, X_("StemExport"), _("Stem export..."),  sigc::mem_fun (*editor, &PublicEditor::stem_export));
 	ActionManager::session_sensitive_actions.push_back (act);
 
-	act = ActionManager::register_action (main_actions, X_("Export"), _("Export"));
+	act = global_actions.register_action (main_actions, X_("Export"), _("Export"));
 	ActionManager::session_sensitive_actions.push_back (act);
 
-	act = ActionManager::register_action (main_actions, X_("CleanupUnused"), _("Clean-up Unused Sources..."),  sigc::mem_fun (*(ARDOUR_UI::instance()), &ARDOUR_UI::cleanup));
+	act = global_actions.register_action (main_actions, X_("CleanupUnused"), _("Clean-up Unused Sources..."),  sigc::mem_fun (*(ARDOUR_UI::instance()), &ARDOUR_UI::cleanup));
 	ActionManager::session_sensitive_actions.push_back (act);
 	ActionManager::write_sensitive_actions.push_back (act);
 
-	act = ActionManager::register_action (main_actions, X_("CleanupPeakFiles"), _("Reset Peak Files"),  sigc::mem_fun (*(ARDOUR_UI::instance()), &ARDOUR_UI::cleanup_peakfiles));
+	act = global_actions.register_action (main_actions, X_("CleanupPeakFiles"), _("Reset Peak Files"),  sigc::mem_fun (*(ARDOUR_UI::instance()), &ARDOUR_UI::cleanup_peakfiles));
 	ActionManager::session_sensitive_actions.push_back (act);
 	ActionManager::write_sensitive_actions.push_back (act);
 
-	act = ActionManager::register_action (main_actions, X_("FlushWastebasket"), _("Flush Wastebasket"),  sigc::mem_fun (*(ARDOUR_UI::instance()), &ARDOUR_UI::flush_trash));
+	act = global_actions.register_action (main_actions, X_("FlushWastebasket"), _("Flush Wastebasket"),  sigc::mem_fun (*(ARDOUR_UI::instance()), &ARDOUR_UI::flush_trash));
+
 	ActionManager::write_sensitive_actions.push_back (act);
 	ActionManager::session_sensitive_actions.push_back (act);
 
 	/* these actions are intended to be shared across all windows */
 
-	common_actions = ActionGroup::create (X_("Common"));
-	ActionManager::register_action (common_actions, X_("Quit"), _("Quit"), (hide_return (sigc::mem_fun(*this, &ARDOUR_UI::finish))));
-	ActionManager::register_action (common_actions, X_("Hide"), _("Hide"), sigc::mem_fun (*this, &ARDOUR_UI::hide_application));
+	common_actions = global_actions.create_action_group (X_("Common"));
+	global_actions.register_action (common_actions, X_("Quit"), _("Quit"), (hide_return (sigc::mem_fun(*this, &ARDOUR_UI::finish))));
+	global_actions.register_action (common_actions, X_("Hide"), _("Hide"), sigc::mem_fun (*this, &ARDOUR_UI::hide_application));
+
+	global_actions.register_action (common_actions, X_("show-editor"), _("Show"), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::show_tabbable), editor));
+	global_actions.register_action (common_actions, X_("show-mixer"), _("Show"), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::show_tabbable), mixer));
+	global_actions.register_action (common_actions, X_("show-preferences"), _("Show"), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::show_tabbable), rc_option_editor));
+	global_actions.register_action (common_actions, X_("menu-show-preferences"), _("Preferences"), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::show_tabbable), rc_option_editor));
+
+	global_actions.register_action (common_actions, X_("hide-editor"), _("Hide"), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::hide_tabbable), editor));
+	global_actions.register_action (common_actions, X_("hide-mixer"), _("Hide"), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::hide_tabbable), mixer));
+	global_actions.register_action (common_actions, X_("hide-preferences"), _("Hide"), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::hide_tabbable), rc_option_editor));
+
+	global_actions.register_action (common_actions, X_("attach-editor"), _("Attach"), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::attach_tabbable), editor));
+	global_actions.register_action (common_actions, X_("attach-mixer"), _("Attach"), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::attach_tabbable), mixer));
+	global_actions.register_action (common_actions, X_("attach-preferences"), _("Attach"), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::attach_tabbable), rc_option_editor));
+
+	global_actions.register_action (common_actions, X_("detach-editor"), _("Detach"), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::detach_tabbable), editor));
+	global_actions.register_action (common_actions, X_("detach-mixer"), _("Detach"), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::detach_tabbable), mixer));
+	global_actions.register_action (common_actions, X_("detach-preferences"), _("Detach"), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::detach_tabbable), rc_option_editor));
+
+	/* These "change" actions are not intended to be used inside menus, but
+	   are for the tab/window control buttons, which have somewhat odd
+	   semantics.
+	*/
+	global_actions.register_action (common_actions, X_("change-editor-visibility"), _("Change"), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::button_change_tabbable_visibility), editor));
+	global_actions.register_action (common_actions, X_("change-mixer-visibility"), _("Change"), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::button_change_tabbable_visibility), mixer));
+	global_actions.register_action (common_actions, X_("change-preferences-visibility"), _("Change"), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::button_change_tabbable_visibility), rc_option_editor));
+
+	/* These "change" actions are not intended to be used inside menus, but
+	   are for the tab/window control key bindings, which have somewhat odd
+	   semantics.
+	*/
+	global_actions.register_action (common_actions, X_("key-change-editor-visibility"), _("Change"), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::key_change_tabbable_visibility), editor));
+	global_actions.register_action (common_actions, X_("key-change-mixer-visibility"), _("Change"), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::key_change_tabbable_visibility), mixer));
+	global_actions.register_action (common_actions, X_("key-change-preferences-visibility"), _("Change"), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::key_change_tabbable_visibility), rc_option_editor));
+
+	global_actions.register_action (common_actions, X_("previous-tab"), _("Previous Tab"), sigc::mem_fun (*this, &ARDOUR_UI::step_up_through_tabs));
+	global_actions.register_action (common_actions, X_("next-tab"), _("Next Tab"), sigc::mem_fun (*this, &ARDOUR_UI::step_down_through_tabs));
+
+	global_actions.register_action (common_actions, X_("toggle-editor-and-mixer"), _("Toggle Editor & Mixer"), sigc::mem_fun (*this, &ARDOUR_UI::toggle_editor_and_mixer));
 
 	/* windows visibility actions */
 
-	ActionManager::register_toggle_action (common_actions, X_("ToggleMaximalEditor"), _("Maximise Editor Space"), sigc::mem_fun (*this, &ARDOUR_UI::toggle_editing_space));
-	ActionManager::register_toggle_action (common_actions, X_("ToggleMaximalMixer"), _("Maximise Mixer Space"), sigc::mem_fun (*this, &ARDOUR_UI::toggle_mixer_space));
-	act = ActionManager::register_toggle_action (common_actions, X_("KeepTearoffs"), _("Show Toolbars"), mem_fun (*this, &ARDOUR_UI::toggle_keep_tearoffs));
+	global_actions.register_toggle_action (common_actions, X_("ToggleMaximalEditor"), _("Maximise Editor Space"), sigc::mem_fun (*this, &ARDOUR_UI::toggle_editing_space));
+	global_actions.register_toggle_action (common_actions, X_("ToggleMaximalMixer"), _("Maximise Mixer Space"), sigc::mem_fun (*this, &ARDOUR_UI::toggle_mixer_space));
 	ActionManager::session_sensitive_actions.push_back (act);
 
-	act = ActionManager::register_toggle_action (common_actions, X_("ToggleMixerList"), _("Toggle Mixer List"), sigc::mem_fun (*this, &ARDOUR_UI::toggle_mixer_list));
+	act = global_actions.register_toggle_action (common_actions, X_("ToggleMixerList"), _("Toggle Mixer List"), sigc::mem_fun (*this, &ARDOUR_UI::toggle_mixer_list));
 	ActionManager::session_sensitive_actions.push_back (act);
 
-	act = ActionManager::register_toggle_action (common_actions, X_("ToggleMonitorSection"), _("Toggle Monitor Section Visibility"), sigc::mem_fun (*this, &ARDOUR_UI::toggle_monitor_section_visibility));
+	act = global_actions.register_toggle_action (common_actions, X_("ToggleMonitorSection"), _("Toggle Monitor Section Visibility"), sigc::mem_fun (*this, &ARDOUR_UI::toggle_monitor_section_visibility));
 	act->set_sensitive (false);
 
-if (Profile->get_mixbus())
-	ActionManager::register_action (common_actions, X_("show-ui-prefs"), _("Show more UI preferences"), sigc::mem_fun (*this, &ARDOUR_UI::show_ui_prefs));
-
-	ActionManager::register_action (common_actions, X_("toggle-mixer"), S_("Window|Mixer"),  sigc::mem_fun(*this, &ARDOUR_UI::toggle_mixer_window));
-	ActionManager::register_action (common_actions, X_("toggle-editor-mixer"), _("Toggle Editor+Mixer"),  sigc::mem_fun(*this, &ARDOUR_UI::toggle_editor_mixer));
-	ActionManager::register_action (common_actions, X_("toggle-meterbridge"), S_("Window|Meterbridge"),  sigc::mem_fun(*this, &ARDOUR_UI::toggle_meterbridge));
+	if (Profile->get_mixbus()) {
+		global_actions.register_action (common_actions, X_("show-ui-prefs"), _("Show more UI preferences"), sigc::mem_fun (*this, &ARDOUR_UI::show_ui_prefs));
+	}
 
-	ActionManager::register_action (common_actions, X_("reattach-all-tearoffs"), _("Reattach All Tearoffs"), sigc::mem_fun (*this, &ARDOUR_UI::reattach_all_tearoffs));
+	global_actions.register_action (common_actions, X_("toggle-luawindow"), S_("Window|Scripting"),  sigc::mem_fun(*this, &ARDOUR_UI::toggle_luawindow));
+	global_actions.register_action (common_actions, X_("toggle-meterbridge"), S_("Window|Meterbridge"),  sigc::mem_fun(*this, &ARDOUR_UI::toggle_meterbridge));
 
-	act = ActionManager::register_action (common_actions, X_("NewMIDITracer"), _("MIDI Tracer"), sigc::mem_fun(*this, &ARDOUR_UI::new_midi_tracer_window));
+	act = global_actions.register_action (common_actions, X_("NewMIDITracer"), _("MIDI Tracer"), sigc::mem_fun(*this, &ARDOUR_UI::new_midi_tracer_window));
 	ActionManager::session_sensitive_actions.push_back (act);
-	ActionManager::register_action (common_actions, X_("chat"), _("Chat"),  sigc::mem_fun(*this, &ARDOUR_UI::launch_chat));
+
+	global_actions.register_action (common_actions, X_("chat"), _("Chat"),  sigc::mem_fun(*this, &ARDOUR_UI::launch_chat));
 	/** TRANSLATORS: This is `Manual' in the sense of an instruction book that tells a user how to use Ardour */
-	ActionManager::register_action (common_actions, X_("manual"), S_("Help|Manual"),  mem_fun(*this, &ARDOUR_UI::launch_manual));
-	ActionManager::register_action (common_actions, X_("reference"), S_("Manual|Reference"),  mem_fun(*this, &ARDOUR_UI::launch_reference));
-	ActionManager::register_action (common_actions, X_("tracker"), _("Report a Bug"), mem_fun(*this, &ARDOUR_UI::launch_tracker));
-	ActionManager::register_action (common_actions, X_("cheat-sheet"), _("Cheat Sheet"), mem_fun(*this, &ARDOUR_UI::launch_cheat_sheet));
-	ActionManager::register_action (common_actions, X_("website"), _("Ardour Website"), mem_fun(*this, &ARDOUR_UI::launch_website));
-	ActionManager::register_action (common_actions, X_("website-dev"), _("Ardour Development"), mem_fun(*this, &ARDOUR_UI::launch_website_dev));
-	ActionManager::register_action (common_actions, X_("forums"), _("User Forums"), mem_fun(*this, &ARDOUR_UI::launch_forums));
-	ActionManager::register_action (common_actions, X_("howto-report"), _("How to Report a Bug"), mem_fun(*this, &ARDOUR_UI::launch_howto_report));
+	global_actions.register_action (common_actions, X_("manual"), S_("Help|Manual"),  mem_fun(*this, &ARDOUR_UI::launch_manual));
+	global_actions.register_action (common_actions, X_("reference"), S_("Manual|Reference"),  mem_fun(*this, &ARDOUR_UI::launch_reference));
+	global_actions.register_action (common_actions, X_("tracker"), _("Report a Bug"), mem_fun(*this, &ARDOUR_UI::launch_tracker));
+	global_actions.register_action (common_actions, X_("cheat-sheet"), _("Cheat Sheet"), mem_fun(*this, &ARDOUR_UI::launch_cheat_sheet));
+	global_actions.register_action (common_actions, X_("website"), _("Ardour Website"), mem_fun(*this, &ARDOUR_UI::launch_website));
+	global_actions.register_action (common_actions, X_("website-dev"), _("Ardour Development"), mem_fun(*this, &ARDOUR_UI::launch_website_dev));
+	global_actions.register_action (common_actions, X_("forums"), _("User Forums"), mem_fun(*this, &ARDOUR_UI::launch_forums));
+	global_actions.register_action (common_actions, X_("howto-report"), _("How to Report a Bug"), mem_fun(*this, &ARDOUR_UI::launch_howto_report));
 
-	act = ActionManager::register_action (common_actions, X_("Save"), _("Save"),  sigc::hide_return (sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::save_state), string(""), false)));
+	act = global_actions.register_action (common_actions, X_("Save"), _("Save"),  sigc::hide_return (sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::save_state), string(""), false)));
 	ActionManager::session_sensitive_actions.push_back (act);
 	ActionManager::write_sensitive_actions.push_back (act);
 
-	Glib::RefPtr<ActionGroup> transport_actions = ActionGroup::create (X_("Transport"));
+	Glib::RefPtr<ActionGroup> transport_actions = global_actions.create_action_group (X_("Transport"));
 
 	/* do-nothing action for the "transport" menu bar item */
 
-	ActionManager::register_action (transport_actions, X_("Transport"), _("Transport"));
+	global_actions.register_action (transport_actions, X_("Transport"), _("Transport"));
 
 	/* these two are not used by key bindings, instead use ToggleRoll for that. these two do show up in
 	   menus and via button proxies.
 	*/
 
-	act = ActionManager::register_action (transport_actions, X_("Stop"), _("Stop"), sigc::mem_fun(*this, &ARDOUR_UI::transport_stop));
+	act = global_actions.register_action (transport_actions, X_("Stop"), _("Stop"), sigc::mem_fun(*this, &ARDOUR_UI::transport_stop));
 	ActionManager::session_sensitive_actions.push_back (act);
 	ActionManager::transport_sensitive_actions.push_back (act);
-	act = ActionManager::register_action (transport_actions, X_("Roll"), _("Roll"), sigc::mem_fun(*this, &ARDOUR_UI::transport_roll));
+	act = global_actions.register_action (transport_actions, X_("Roll"), _("Roll"), sigc::mem_fun(*this, &ARDOUR_UI::transport_roll));
 	ActionManager::session_sensitive_actions.push_back (act);
 	ActionManager::transport_sensitive_actions.push_back (act);
 
-	act = ActionManager::register_action (transport_actions, X_("ToggleRoll"), _("Start/Stop"), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::toggle_roll), false, false));
+	act = global_actions.register_action (transport_actions, X_("ToggleRoll"), _("Start/Stop"), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::toggle_roll), false, false));
 	ActionManager::session_sensitive_actions.push_back (act);
 	ActionManager::transport_sensitive_actions.push_back (act);
-	act = ActionManager::register_action (transport_actions, X_("alternate-ToggleRoll"), _("Start/Stop"), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::toggle_roll), false, false));
+	act = global_actions.register_action (transport_actions, X_("alternate-ToggleRoll"), _("Start/Stop"), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::toggle_roll), false, false));
 	ActionManager::session_sensitive_actions.push_back (act);
 	ActionManager::transport_sensitive_actions.push_back (act);
-	act = ActionManager::register_action (transport_actions, X_("ToggleRollMaybe"), _("Start/Continue/Stop"), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::toggle_roll), false, true));
+	act = global_actions.register_action (transport_actions, X_("ToggleRollMaybe"), _("Start/Continue/Stop"), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::toggle_roll), false, true));
 	ActionManager::session_sensitive_actions.push_back (act);
 	ActionManager::transport_sensitive_actions.push_back (act);
-	act = ActionManager::register_action (transport_actions, X_("ToggleRollForgetCapture"), _("Stop and Forget Capture"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::toggle_roll), true, false));
+	act = global_actions.register_action (transport_actions, X_("ToggleRollForgetCapture"), _("Stop and Forget Capture"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::toggle_roll), true, false));
 	ActionManager::session_sensitive_actions.push_back (act);
 	ActionManager::transport_sensitive_actions.push_back (act);
 
@@ -291,202 +362,194 @@ if (Profile->get_mixbus())
 	   - otherwise do nothing
 	*/
 
-	act = ActionManager::register_action (transport_actions, X_("TransitionToRoll"), _("Transition to Roll"), sigc::bind (sigc::mem_fun (*editor, &PublicEditor::transition_to_rolling), true));
+	act = global_actions.register_action (transport_actions, X_("TransitionToRoll"), _("Transition to Roll"), sigc::bind (sigc::mem_fun (*editor, &PublicEditor::transition_to_rolling), true));
 	ActionManager::session_sensitive_actions.push_back (act);
 	ActionManager::transport_sensitive_actions.push_back (act);
 
-	act = ActionManager::register_action (transport_actions, X_("TransitionToReverse"), _("Transition to Reverse"), sigc::bind (sigc::mem_fun (*editor, &PublicEditor::transition_to_rolling), false));
+	act = global_actions.register_action (transport_actions, X_("TransitionToReverse"), _("Transition to Reverse"), sigc::bind (sigc::mem_fun (*editor, &PublicEditor::transition_to_rolling), false));
 	ActionManager::session_sensitive_actions.push_back (act);
 	ActionManager::transport_sensitive_actions.push_back (act);
 
-	act = ActionManager::register_action (transport_actions, X_("Loop"), _("Play Loop Range"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_session_auto_loop));
+	act = global_actions.register_action (transport_actions, X_("Loop"), _("Play Loop Range"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_session_auto_loop));
 	ActionManager::session_sensitive_actions.push_back (act);
 	ActionManager::transport_sensitive_actions.push_back (act);
-	act = ActionManager::register_action (transport_actions, X_("PlaySelection"), _("Play Selection"), sigc::mem_fun(*this, &ARDOUR_UI::transport_play_selection));
+	act = global_actions.register_action (transport_actions, X_("PlaySelection"), _("Play Selection"), sigc::mem_fun(*this, &ARDOUR_UI::transport_play_selection));
 	ActionManager::session_sensitive_actions.push_back (act);
 	ActionManager::transport_sensitive_actions.push_back (act);
-	act = ActionManager::register_action (transport_actions, X_("PlayPreroll"), _("Play Selection w/Preroll"), sigc::mem_fun(*this, &ARDOUR_UI::transport_play_preroll));
+	act = global_actions.register_action (transport_actions, X_("PlayPreroll"), _("Play Selection w/Preroll"), sigc::mem_fun(*this, &ARDOUR_UI::transport_play_preroll));
 	ActionManager::session_sensitive_actions.push_back (act);
 	ActionManager::transport_sensitive_actions.push_back (act);
 
-	act = ActionManager::register_action (transport_actions, X_("Record"), _("Enable Record"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::transport_record), false));
+	act = global_actions.register_action (transport_actions, X_("Record"), _("Enable Record"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::transport_record), false));
 	ActionManager::session_sensitive_actions.push_back (act);
 	ActionManager::write_sensitive_actions.push_back (act);
-	act = ActionManager::register_action (transport_actions, X_("record-roll"), _("Start Recording"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::transport_record), true));
+	act = global_actions.register_action (transport_actions, X_("record-roll"), _("Start Recording"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::transport_record), true));
 	ActionManager::session_sensitive_actions.push_back (act);
 	ActionManager::write_sensitive_actions.push_back (act);
 	ActionManager::transport_sensitive_actions.push_back (act);
-	act = ActionManager::register_action (transport_actions, X_("alternate-record-roll"), _("Start Recording"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::transport_record), true));
+	act = global_actions.register_action (transport_actions, X_("alternate-record-roll"), _("Start Recording"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::transport_record), true));
 	ActionManager::session_sensitive_actions.push_back (act);
 	ActionManager::write_sensitive_actions.push_back (act);
 	ActionManager::transport_sensitive_actions.push_back (act);
-	act = ActionManager::register_action (transport_actions, X_("Rewind"), _("Rewind"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::transport_rewind), 0));
+	act = global_actions.register_action (transport_actions, X_("Rewind"), _("Rewind"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::transport_rewind), 0));
 	ActionManager::session_sensitive_actions.push_back (act);
 	ActionManager::transport_sensitive_actions.push_back (act);
-	act = ActionManager::register_action (transport_actions, X_("RewindSlow"), _("Rewind (Slow)"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::transport_rewind), -1));
+	act = global_actions.register_action (transport_actions, X_("RewindSlow"), _("Rewind (Slow)"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::transport_rewind), -1));
 	ActionManager::session_sensitive_actions.push_back (act);
 	ActionManager::transport_sensitive_actions.push_back (act);
-	act = ActionManager::register_action (transport_actions, X_("RewindFast"), _("Rewind (Fast)"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::transport_rewind), 1));
+	act = global_actions.register_action (transport_actions, X_("RewindFast"), _("Rewind (Fast)"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::transport_rewind), 1));
 	ActionManager::session_sensitive_actions.push_back (act);
 	ActionManager::transport_sensitive_actions.push_back (act);
-	act = ActionManager::register_action (transport_actions, X_("Forward"), _("Forward"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::transport_forward), 0));
+	act = global_actions.register_action (transport_actions, X_("Forward"), _("Forward"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::transport_forward), 0));
 	ActionManager::session_sensitive_actions.push_back (act);
 	ActionManager::transport_sensitive_actions.push_back (act);
-	act = ActionManager::register_action (transport_actions, X_("ForwardSlow"), _("Forward (Slow)"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::transport_forward), -1));
+	act = global_actions.register_action (transport_actions, X_("ForwardSlow"), _("Forward (Slow)"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::transport_forward), -1));
 	ActionManager::session_sensitive_actions.push_back (act);
 	ActionManager::transport_sensitive_actions.push_back (act);
-	act = ActionManager::register_action (transport_actions, X_("ForwardFast"), _("Forward (Fast)"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::transport_forward), 1));
+	act = global_actions.register_action (transport_actions, X_("ForwardFast"), _("Forward (Fast)"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::transport_forward), 1));
 	ActionManager::session_sensitive_actions.push_back (act);
 	ActionManager::transport_sensitive_actions.push_back (act);
-	act = ActionManager::register_action (transport_actions, X_("GotoZero"), _("Go to Zero"), sigc::mem_fun(*this, &ARDOUR_UI::transport_goto_zero));
+	act = global_actions.register_action (transport_actions, X_("GotoZero"), _("Go to Zero"), sigc::mem_fun(*this, &ARDOUR_UI::transport_goto_zero));
 	ActionManager::session_sensitive_actions.push_back (act);
 	ActionManager::transport_sensitive_actions.push_back (act);
-	act = ActionManager::register_action (transport_actions, X_("GotoStart"), _("Go to Start"), sigc::mem_fun(*this, &ARDOUR_UI::transport_goto_start));
+	act = global_actions.register_action (transport_actions, X_("GotoStart"), _("Go to Start"), sigc::mem_fun(*this, &ARDOUR_UI::transport_goto_start));
 	ActionManager::session_sensitive_actions.push_back (act);
 	ActionManager::transport_sensitive_actions.push_back (act);
-	act = ActionManager::register_action (transport_actions, X_("alternate-GotoStart"), _("Go to Start"), sigc::mem_fun(*this, &ARDOUR_UI::transport_goto_start));
+	act = global_actions.register_action (transport_actions, X_("alternate-GotoStart"), _("Go to Start"), sigc::mem_fun(*this, &ARDOUR_UI::transport_goto_start));
 	ActionManager::session_sensitive_actions.push_back (act);
 	ActionManager::transport_sensitive_actions.push_back (act);
-	act = ActionManager::register_action (transport_actions, X_("GotoEnd"), _("Go to End"), sigc::mem_fun(*this, &ARDOUR_UI::transport_goto_end));
+	act = global_actions.register_action (transport_actions, X_("GotoEnd"), _("Go to End"), sigc::mem_fun(*this, &ARDOUR_UI::transport_goto_end));
 	ActionManager::session_sensitive_actions.push_back (act);
 	ActionManager::transport_sensitive_actions.push_back (act);
-	act = ActionManager::register_action (transport_actions, X_("GotoWallClock"), _("Go to Wall Clock"), sigc::mem_fun(*this, &ARDOUR_UI::transport_goto_wallclock));
+	act = global_actions.register_action (transport_actions, X_("GotoWallClock"), _("Go to Wall Clock"), sigc::mem_fun(*this, &ARDOUR_UI::transport_goto_wallclock));
 	ActionManager::session_sensitive_actions.push_back (act);
 	ActionManager::transport_sensitive_actions.push_back (act);
 
 	//these actions handle the numpad events, ProTools style
-	act = ActionManager::register_action (transport_actions, X_("numpad-decimal"), _("Numpad Decimal"), mem_fun(*this, &ARDOUR_UI::transport_numpad_decimal));
+	act = global_actions.register_action (transport_actions, X_("numpad-decimal"), _("Numpad Decimal"), mem_fun(*this, &ARDOUR_UI::transport_numpad_decimal));
 	ActionManager::session_sensitive_actions.push_back (act);
 	ActionManager::transport_sensitive_actions.push_back (act);
-	act = ActionManager::register_action (transport_actions, X_("alternate-numpad-decimal"), _("Numpad Decimal"), mem_fun(*this, &ARDOUR_UI::transport_numpad_decimal));
+	act = global_actions.register_action (transport_actions, X_("alternate-numpad-decimal"), _("Numpad Decimal"), mem_fun(*this, &ARDOUR_UI::transport_numpad_decimal));
 	ActionManager::session_sensitive_actions.push_back (act);
 	ActionManager::transport_sensitive_actions.push_back (act);
-	act = ActionManager::register_action (transport_actions, X_("numpad-0"), _("Numpad 0"), bind (mem_fun(*this, &ARDOUR_UI::transport_numpad_event), 0));
+	act = global_actions.register_action (transport_actions, X_("numpad-0"), _("Numpad 0"), bind (mem_fun(*this, &ARDOUR_UI::transport_numpad_event), 0));
 	ActionManager::session_sensitive_actions.push_back (act);
 	ActionManager::transport_sensitive_actions.push_back (act);
-	act = ActionManager::register_action (transport_actions, X_("numpad-1"), _("Numpad 1"), bind (mem_fun(*this, &ARDOUR_UI::transport_numpad_event), 1));
+	act = global_actions.register_action (transport_actions, X_("numpad-1"), _("Numpad 1"), bind (mem_fun(*this, &ARDOUR_UI::transport_numpad_event), 1));
 	ActionManager::session_sensitive_actions.push_back (act);
 	ActionManager::transport_sensitive_actions.push_back (act);
-	act = ActionManager::register_action (transport_actions, X_("numpad-2"), _("Numpad 2"), bind (mem_fun(*this, &ARDOUR_UI::transport_numpad_event), 2));
+	act = global_actions.register_action (transport_actions, X_("numpad-2"), _("Numpad 2"), bind (mem_fun(*this, &ARDOUR_UI::transport_numpad_event), 2));
 	ActionManager::session_sensitive_actions.push_back (act);
 	ActionManager::transport_sensitive_actions.push_back (act);
-	act = ActionManager::register_action (transport_actions, X_("numpad-3"), _("Numpad 3"), bind (mem_fun(*this, &ARDOUR_UI::transport_numpad_event), 3));
+	act = global_actions.register_action (transport_actions, X_("numpad-3"), _("Numpad 3"), bind (mem_fun(*this, &ARDOUR_UI::transport_numpad_event), 3));
 	ActionManager::session_sensitive_actions.push_back (act);
 	ActionManager::transport_sensitive_actions.push_back (act);
-	act = ActionManager::register_action (transport_actions, X_("numpad-4"), _("Numpad 4"), bind (mem_fun(*this, &ARDOUR_UI::transport_numpad_event), 4));
+	act = global_actions.register_action (transport_actions, X_("numpad-4"), _("Numpad 4"), bind (mem_fun(*this, &ARDOUR_UI::transport_numpad_event), 4));
 	ActionManager::session_sensitive_actions.push_back (act);
 	ActionManager::transport_sensitive_actions.push_back (act);
-	act = ActionManager::register_action (transport_actions, X_("numpad-5"), _("Numpad 5"), bind (mem_fun(*this, &ARDOUR_UI::transport_numpad_event), 5));
+	act = global_actions.register_action (transport_actions, X_("numpad-5"), _("Numpad 5"), bind (mem_fun(*this, &ARDOUR_UI::transport_numpad_event), 5));
 	ActionManager::session_sensitive_actions.push_back (act);
 	ActionManager::transport_sensitive_actions.push_back (act);
-	act = ActionManager::register_action (transport_actions, X_("numpad-6"), _("Numpad 6"), bind (mem_fun(*this, &ARDOUR_UI::transport_numpad_event), 6));
+	act = global_actions.register_action (transport_actions, X_("numpad-6"), _("Numpad 6"), bind (mem_fun(*this, &ARDOUR_UI::transport_numpad_event), 6));
 	ActionManager::session_sensitive_actions.push_back (act);
 	ActionManager::transport_sensitive_actions.push_back (act);
-	act = ActionManager::register_action (transport_actions, X_("numpad-7"), _("Numpad 7"), bind (mem_fun(*this, &ARDOUR_UI::transport_numpad_event), 7));
+	act = global_actions.register_action (transport_actions, X_("numpad-7"), _("Numpad 7"), bind (mem_fun(*this, &ARDOUR_UI::transport_numpad_event), 7));
 	ActionManager::session_sensitive_actions.push_back (act);
 	ActionManager::transport_sensitive_actions.push_back (act);
-	act = ActionManager::register_action (transport_actions, X_("numpad-8"), _("Numpad 8"), bind (mem_fun(*this, &ARDOUR_UI::transport_numpad_event), 8));
+	act = global_actions.register_action (transport_actions, X_("numpad-8"), _("Numpad 8"), bind (mem_fun(*this, &ARDOUR_UI::transport_numpad_event), 8));
 	ActionManager::session_sensitive_actions.push_back (act);
 	ActionManager::transport_sensitive_actions.push_back (act);
-	act = ActionManager::register_action (transport_actions, X_("numpad-9"), _("Numpad 9"), bind (mem_fun(*this, &ARDOUR_UI::transport_numpad_event), 9));
+	act = global_actions.register_action (transport_actions, X_("numpad-9"), _("Numpad 9"), bind (mem_fun(*this, &ARDOUR_UI::transport_numpad_event), 9));
 	ActionManager::session_sensitive_actions.push_back (act);
 	ActionManager::transport_sensitive_actions.push_back (act);
 
-	act = ActionManager::register_action (transport_actions, X_("focus-on-clock"), _("Focus On Clock"), sigc::mem_fun(*this, &ARDOUR_UI::focus_on_clock));
+	act = global_actions.register_action (transport_actions, X_("focus-on-clock"), _("Focus On Clock"), sigc::mem_fun(*this, &ARDOUR_UI::focus_on_clock));
 	ActionManager::session_sensitive_actions.push_back (act);
 	ActionManager::transport_sensitive_actions.push_back (act);
 
-	act = ActionManager::register_action (transport_actions, X_("primary-clock-timecode"), _("Timecode"), sigc::bind (sigc::mem_fun(primary_clock, &AudioClock::set_mode), AudioClock::Timecode));
+	act = global_actions.register_action (transport_actions, X_("primary-clock-timecode"), _("Timecode"), sigc::bind (sigc::mem_fun(primary_clock, &AudioClock::set_mode), AudioClock::Timecode, false));
 	ActionManager::session_sensitive_actions.push_back (act);
-	act = ActionManager::register_action (transport_actions, X_("primary-clock-bbt"), _("Bars & Beats"), sigc::bind (sigc::mem_fun(primary_clock, &AudioClock::set_mode), AudioClock::BBT));
+	act = global_actions.register_action (transport_actions, X_("primary-clock-bbt"), _("Bars & Beats"), sigc::bind (sigc::mem_fun(primary_clock, &AudioClock::set_mode), AudioClock::BBT, false));
 	ActionManager::session_sensitive_actions.push_back (act);
-	act = ActionManager::register_action (transport_actions, X_("primary-clock-minsec"), _("Minutes & Seconds"), sigc::bind (sigc::mem_fun(primary_clock, &AudioClock::set_mode), AudioClock::MinSec));
+	act = global_actions.register_action (transport_actions, X_("primary-clock-minsec"), _("Minutes & Seconds"), sigc::bind (sigc::mem_fun(primary_clock, &AudioClock::set_mode), AudioClock::MinSec, false));
 	ActionManager::session_sensitive_actions.push_back (act);
-	act = ActionManager::register_action (transport_actions, X_("primary-clock-samples"), _("Samples"), sigc::bind (sigc::mem_fun(primary_clock, &AudioClock::set_mode), AudioClock::Frames));
+	act = global_actions.register_action (transport_actions, X_("primary-clock-samples"), _("Samples"), sigc::bind (sigc::mem_fun(primary_clock, &AudioClock::set_mode), AudioClock::Frames, false));
 	ActionManager::session_sensitive_actions.push_back (act);
 
-	act = ActionManager::register_action (transport_actions, X_("secondary-clock-timecode"), _("Timecode"), sigc::bind (sigc::mem_fun(secondary_clock, &AudioClock::set_mode), AudioClock::Timecode));
+	act = global_actions.register_action (transport_actions, X_("secondary-clock-timecode"), _("Timecode"), sigc::bind (sigc::mem_fun(secondary_clock, &AudioClock::set_mode), AudioClock::Timecode, false));
 	ActionManager::session_sensitive_actions.push_back (act);
-	act = ActionManager::register_action (transport_actions, X_("secondary-clock-bbt"), _("Bars & Beats"), sigc::bind (sigc::mem_fun(secondary_clock, &AudioClock::set_mode), AudioClock::BBT));
+	act = global_actions.register_action (transport_actions, X_("secondary-clock-bbt"), _("Bars & Beats"), sigc::bind (sigc::mem_fun(secondary_clock, &AudioClock::set_mode), AudioClock::BBT, false));
 	ActionManager::session_sensitive_actions.push_back (act);
-	act = ActionManager::register_action (transport_actions, X_("secondary-clock-minsec"), _("Minutes & Seconds"), sigc::bind (sigc::mem_fun(secondary_clock, &AudioClock::set_mode), AudioClock::MinSec));
+	act = global_actions.register_action (transport_actions, X_("secondary-clock-minsec"), _("Minutes & Seconds"), sigc::bind (sigc::mem_fun(secondary_clock, &AudioClock::set_mode), AudioClock::MinSec, false));
 	ActionManager::session_sensitive_actions.push_back (act);
-	act = ActionManager::register_action (transport_actions, X_("secondary-clock-samples"), _("Samples"), sigc::bind (sigc::mem_fun(secondary_clock, &AudioClock::set_mode), AudioClock::Frames));
+	act = global_actions.register_action (transport_actions, X_("secondary-clock-samples"), _("Samples"), sigc::bind (sigc::mem_fun(secondary_clock, &AudioClock::set_mode), AudioClock::Frames, false));
 	ActionManager::session_sensitive_actions.push_back (act);
 
-	act = ActionManager::register_toggle_action (transport_actions, X_("TogglePunchIn"), _("Punch In"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_punch_in));
+	act = global_actions.register_toggle_action (transport_actions, X_("TogglePunchIn"), _("Punch In"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_punch_in));
 	act->set_short_label (_("In"));
 	ActionManager::session_sensitive_actions.push_back (act);
 	ActionManager::transport_sensitive_actions.push_back (act);
-	act = ActionManager::register_toggle_action (transport_actions, X_("TogglePunchOut"), _("Punch Out"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_punch_out));
+	act = global_actions.register_toggle_action (transport_actions, X_("TogglePunchOut"), _("Punch Out"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_punch_out));
 	act->set_short_label (_("Out"));
 	ActionManager::session_sensitive_actions.push_back (act);
 	ActionManager::transport_sensitive_actions.push_back (act);
-	act = ActionManager::register_toggle_action (transport_actions, X_("TogglePunch"), _("Punch In/Out"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_punch));
+	act = global_actions.register_toggle_action (transport_actions, X_("TogglePunch"), _("Punch In/Out"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_punch));
 	act->set_short_label (_("In/Out"));
 	ActionManager::session_sensitive_actions.push_back (act);
 	ActionManager::transport_sensitive_actions.push_back (act);
-	act = ActionManager::register_toggle_action (transport_actions, X_("ToggleClick"), _("Click"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_click));
+	act = global_actions.register_toggle_action (transport_actions, X_("ToggleClick"), _("Click"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_click));
 	ActionManager::session_sensitive_actions.push_back (act);
 	ActionManager::transport_sensitive_actions.push_back (act);
-	act = ActionManager::register_toggle_action (transport_actions, X_("ToggleAutoInput"), _("Auto Input"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_auto_input));
+	act = global_actions.register_toggle_action (transport_actions, X_("ToggleAutoInput"), _("Auto Input"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_auto_input));
 	ActionManager::session_sensitive_actions.push_back (act);
 	ActionManager::transport_sensitive_actions.push_back (act);
-	act = ActionManager::register_toggle_action (transport_actions, X_("ToggleAutoPlay"), _("Auto Play"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_auto_play));
+	act = global_actions.register_toggle_action (transport_actions, X_("ToggleAutoPlay"), _("Auto Play"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_auto_play));
 	ActionManager::session_sensitive_actions.push_back (act);
 	ActionManager::transport_sensitive_actions.push_back (act);
-	act = ActionManager::register_toggle_action (transport_actions, X_("ToggleAutoReturn"), _("Auto Return"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_auto_return));
+	act = global_actions.register_toggle_action (transport_actions, X_("ToggleAutoReturn"), _("Auto Return"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_auto_return));
 	ActionManager::session_sensitive_actions.push_back (act);
 	ActionManager::transport_sensitive_actions.push_back (act);
-	act = ActionManager::register_toggle_action (transport_actions, X_("ToggleFollowEdits"), _("Follow Edits"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_follow_edits));
+	act = global_actions.register_toggle_action (transport_actions, X_("ToggleFollowEdits"), _("Follow Edits"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_follow_edits));
 	ActionManager::session_sensitive_actions.push_back (act);
 	ActionManager::transport_sensitive_actions.push_back (act);
 
 
-	act = ActionManager::register_toggle_action (transport_actions, X_("ToggleVideoSync"), _("Sync Startup to Video"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_video_sync));
+	act = global_actions.register_toggle_action (transport_actions, X_("ToggleVideoSync"), _("Sync Startup to Video"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_video_sync));
 	ActionManager::session_sensitive_actions.push_back (act);
-	act = ActionManager::register_toggle_action (transport_actions, X_("ToggleTimeMaster"), _("Time Master"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_time_master));
+	act = global_actions.register_toggle_action (transport_actions, X_("ToggleTimeMaster"), _("Time Master"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_time_master));
 	ActionManager::session_sensitive_actions.push_back (act);
-	act = ActionManager::register_toggle_action (transport_actions, X_("ToggleExternalSync"), _("Use External Positional Sync Source"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_external_sync));
+	act = global_actions.register_toggle_action (transport_actions, X_("ToggleExternalSync"), _("Use External Positional Sync Source"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_external_sync));
 	ActionManager::session_sensitive_actions.push_back (act);
 
 	for (int i = 1; i <= 32; ++i) {
 		string const a = string_compose (X_("ToggleRecordEnableTrack%1"), i);
 		string const n = string_compose (_("Toggle Record Enable Track %1"), i);
-		act = ActionManager::register_action (common_actions, a.c_str(), n.c_str(), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::toggle_record_enable), i - 1));
+		act = global_actions.register_action (common_actions, a.c_str(), n.c_str(), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::toggle_record_enable), i - 1));
 		ActionManager::session_sensitive_actions.push_back (act);
 	}
 
-	Glib::RefPtr<ActionGroup> shuttle_actions = ActionGroup::create ("ShuttleActions");
+	Glib::RefPtr<ActionGroup> shuttle_actions = global_actions.create_action_group ("ShuttleActions");
 
 	shuttle_actions->add (Action::create (X_("SetShuttleUnitsPercentage"), _("Percentage")), hide_return (sigc::bind (sigc::mem_fun (*Config, &RCConfiguration::set_shuttle_units), Percentage)));
 	shuttle_actions->add (Action::create (X_("SetShuttleUnitsSemitones"), _("Semitones")), hide_return (sigc::bind (sigc::mem_fun (*Config, &RCConfiguration::set_shuttle_units), Semitones)));
 
-	Glib::RefPtr<ActionGroup> option_actions = ActionGroup::create ("options");
+	Glib::RefPtr<ActionGroup> option_actions = global_actions.create_action_group ("Options");
 
-	act = ActionManager::register_toggle_action (option_actions, X_("SendMTC"), _("Send MTC"), sigc::mem_fun (*this, &ARDOUR_UI::toggle_send_mtc));
+	act = global_actions.register_toggle_action (option_actions, X_("SendMTC"), _("Send MTC"), sigc::mem_fun (*this, &ARDOUR_UI::toggle_send_mtc));
 	ActionManager::session_sensitive_actions.push_back (act);
-	act = ActionManager::register_toggle_action (option_actions, X_("SendMMC"), _("Send MMC"), sigc::mem_fun (*this, &ARDOUR_UI::toggle_send_mmc));
+	act = global_actions.register_toggle_action (option_actions, X_("SendMMC"), _("Send MMC"), sigc::mem_fun (*this, &ARDOUR_UI::toggle_send_mmc));
 	ActionManager::session_sensitive_actions.push_back (act);
-	act = ActionManager::register_toggle_action (option_actions, X_("UseMMC"), _("Use MMC"), sigc::mem_fun (*this, &ARDOUR_UI::toggle_use_mmc));
+	act = global_actions.register_toggle_action (option_actions, X_("UseMMC"), _("Use MMC"), sigc::mem_fun (*this, &ARDOUR_UI::toggle_use_mmc));
 	ActionManager::session_sensitive_actions.push_back (act);
-	act = ActionManager::register_toggle_action (option_actions, X_("SendMidiClock"), _("Send MIDI Clock"), sigc::mem_fun (*this, &ARDOUR_UI::toggle_send_midi_clock));
+	act = global_actions.register_toggle_action (option_actions, X_("SendMidiClock"), _("Send MIDI Clock"), sigc::mem_fun (*this, &ARDOUR_UI::toggle_send_midi_clock));
 	ActionManager::session_sensitive_actions.push_back (act);
-	act = ActionManager::register_toggle_action (option_actions, X_("SendMIDIfeedback"), _("Send MIDI Feedback"), sigc::mem_fun (*this, &ARDOUR_UI::toggle_send_midi_feedback));
+	act = global_actions.register_toggle_action (option_actions, X_("SendMIDIfeedback"), _("Send MIDI Feedback"), sigc::mem_fun (*this, &ARDOUR_UI::toggle_send_midi_feedback));
 	ActionManager::session_sensitive_actions.push_back (act);
 
 	/* MIDI */
 
-	Glib::RefPtr<ActionGroup> midi_actions = ActionGroup::create (X_("MIDI"));
-	ActionManager::register_action (midi_actions, X_("panic"), _("Panic"), sigc::mem_fun(*this, &ARDOUR_UI::midi_panic));
-
-	ActionManager::add_action_group (shuttle_actions);
-	ActionManager::add_action_group (option_actions);
-	ActionManager::add_action_group (transport_actions);
-	ActionManager::add_action_group (main_actions);
-	ActionManager::add_action_group (main_menu_actions);
-	ActionManager::add_action_group (common_actions);
-	ActionManager::add_action_group (midi_actions);
+	Glib::RefPtr<ActionGroup> midi_actions = global_actions.create_action_group (X_("MIDI"));
+	global_actions.register_action (midi_actions, X_("panic"), _("Panic"), sigc::mem_fun(*this, &ARDOUR_UI::midi_panic));
 }
 
 void
@@ -495,16 +558,6 @@ ARDOUR_UI::build_menu_bar ()
 	menu_bar = dynamic_cast<MenuBar*> (ActionManager::get_widget (X_("/Main")));
 	menu_bar->set_name ("MainMenuBar");
 
-	/*
-	 * This is needed because this property does not get installed
-	 * until the Menu GObject class is registered, which happens
-	 * when the first menu instance is created.
-	 */
-	// XXX bug in gtkmm causes this to popup an error message
-	// Gtk::Settings::get_default()->property_gtk_can_change_accels() = true;
-	// so use this instead ...
-	gtk_settings_set_long_property (gtk_settings_get_default(), "gtk-can-change-accels", 1, "Ardour:designers");
-
 	EventBox* ev = manage (new EventBox);
 	ev->show ();
 	CairoHPacker* hbox = manage (new CairoHPacker);
@@ -538,22 +591,11 @@ ARDOUR_UI::build_menu_bar ()
 	format_label.set_use_markup ();
 
 #ifndef TOP_MENUBAR
- 	menu_hbox.pack_start (*menu_bar, false, false);
+	menu_hbox.pack_start (*menu_bar, false, false);
 #else
 	use_menubar_as_top_menubar ();
 #endif
 
-	bool wall_clock = false;
-	bool disk_space = false;
-
- 	if (!Profile->get_small_screen()) {
-#ifndef GTKOSX
-		// OSX provides its own wallclock, thank you very much
-		wall_clock = true;
-#endif
-		disk_space = true;
-	}
-
 	hbox->pack_end (error_alert_button, false, false, 2);
 
 	hbox->pack_end (wall_clock_label, false, false, 2);
@@ -571,10 +613,11 @@ ARDOUR_UI::build_menu_bar ()
 	menu_bar_base.set_name ("MainMenuBar");
 	menu_bar_base.add (menu_hbox);
 
-#ifndef GTKOSX
-	_status_bar_visibility.add (&wall_clock_label,      X_("WallClock"), _("Wall Clock"), wall_clock);
+#ifndef __APPLE__
+	// OSX provides its own wallclock, thank you very much
+	_status_bar_visibility.add (&wall_clock_label,      X_("WallClock"), _("Wall Clock"), true);
 #endif
-	_status_bar_visibility.add (&disk_space_label,      X_("Disk"),      _("Disk Space"), disk_space);
+	_status_bar_visibility.add (&disk_space_label,      X_("Disk"),      _("Disk Space"), !Profile->get_small_screen());
 	_status_bar_visibility.add (&cpu_load_label,        X_("DSP"),       _("DSP"), true);
 	_status_bar_visibility.add (&xrun_label,            X_("XRun"),      _("X-run"), false);
 	_status_bar_visibility.add (&peak_thread_work_label,X_("Peakfile"),  _("Active Peak-file Work"), false);
@@ -612,7 +655,7 @@ ARDOUR_UI::use_menubar_as_top_menubar ()
 		app->add_app_menu_item (group, dynamic_cast<MenuItem*>(widget));
         }
 
-	if ((widget = ActionManager::get_widget ("/ui/Main/Session/toggle-rc-options-editor"))) {
+	if ((widget = ActionManager::get_widget ("/ui/Main/Edit/menu-show-preferences"))) {
 		app->add_app_menu_item (group, dynamic_cast<MenuItem*>(widget));
         }
 
@@ -630,6 +673,7 @@ ARDOUR_UI::save_ardour_state ()
 	   a different lifetime model from add_instant_xml().
 	*/
 
+	LocaleGuard lg; // one guard to rule them all
 	XMLNode* node = new XMLNode (keyboard->get_state());
 	Config->add_extra_xml (*node);
 	Config->add_extra_xml (get_transport_controllable_state());
@@ -637,34 +681,49 @@ ARDOUR_UI::save_ardour_state ()
 	XMLNode* window_node = new XMLNode (X_("UI"));
 	window_node->add_property (_status_bar_visibility.get_state_name().c_str(), _status_bar_visibility.get_state_value ());
 
+	/* main window */
+
+	gint mx, my, mw, mh;
+	_main_window.get_position (mx, my);
+	_main_window.get_size (mw, mh);
+
+	XMLNode main_window_node (X_("Main"));
+	main_window_node.add_property (X_("x"), PBD::to_string (mx, std::dec));
+	main_window_node.add_property (X_("y"), PBD::to_string (my, std::dec));
+	main_window_node.add_property (X_("w"), PBD::to_string (mw, std::dec));
+	main_window_node.add_property (X_("h"), PBD::to_string (mh, std::dec));
+
+	string current_tab;
+	int current_page_number = _tabs.get_current_page ();
+	if (current_page_number == _tabs.page_num (editor->contents())) {
+		current_tab = "editor";
+	} else if (current_page_number == _tabs.page_num (mixer->contents())) {
+		current_tab = "mixer";
+	} else if (current_page_number == _tabs.page_num (rc_option_editor->contents())) {
+		current_tab = "preferences";
+	}
+
+	main_window_node.add_property (X_("current-tab"), current_tab);
+
 	/* Windows */
 
 	WM::Manager::instance().add_state (*window_node);
 
-	/* tearoffs */
-
 	XMLNode* tearoff_node = new XMLNode (X_("Tearoffs"));
 
-	if (transport_tearoff) {
-		XMLNode* t = new XMLNode (X_("transport"));
-		transport_tearoff->add_state (*t);
-		tearoff_node->add_child_nocopy (*t);
-	}
-
 	if (mixer->monitor_section()) {
 		XMLNode* t = new XMLNode (X_("monitor-section"));
 		mixer->monitor_section()->tearoff().add_state (*t);
 		tearoff_node->add_child_nocopy (*t);
 	}
 
-	if (editor->mouse_mode_tearoff()) {
-		XMLNode* t = new XMLNode (X_("mouse-mode"));
-		editor->mouse_mode_tearoff ()->add_state (*t);
-		tearoff_node->add_child_nocopy (*t);
-	}
-
 	window_node->add_child_nocopy (*tearoff_node);
 
+	XMLNode& enode (editor->get_state());
+	XMLNode& mnode (mixer->get_state());
+	XMLNode& bnode (meterbridge->get_state());
+	XMLNode& pnode (rc_option_editor->get_state());
+
 	Config->add_extra_xml (*window_node);
 	Config->add_extra_xml (audio_midi_setup->get_state());
 
@@ -672,25 +731,30 @@ ARDOUR_UI::save_ardour_state ()
 
 	UIConfiguration::instance().save_state ();
 
-	XMLNode& enode (static_cast<Stateful*>(editor)->get_state());
-	XMLNode& mnode (mixer->get_state());
-	XMLNode& bnode (meterbridge->get_state());
-
 	if (_session) {
+		_session->add_instant_xml (main_window_node);
 		_session->add_instant_xml (enode);
 		_session->add_instant_xml (mnode);
+		_session->add_instant_xml (pnode);
 		_session->add_instant_xml (bnode);
 		if (location_ui) {
 			_session->add_instant_xml (location_ui->ui().get_state ());
 		}
 	} else {
+		Config->add_instant_xml (main_window_node);
 		Config->add_instant_xml (enode);
 		Config->add_instant_xml (mnode);
+		Config->add_instant_xml (pnode);
+		Config->add_instant_xml (bnode);
 		if (location_ui) {
 			Config->add_instant_xml (location_ui->ui().get_state ());
 		}
 	}
+
 	delete &enode;
+	delete &mnode;
+	delete &bnode;
+	delete &pnode;
 
 	Keyboard::save_keybindings ();
 }
@@ -725,3 +789,27 @@ ARDOUR_UI::xrun_button_release (GdkEventButton* ev)
 	}
 	return true;
 }
+
+Gtk::Notebook&
+ARDOUR_UI::tabs()
+{
+	return _tabs;
+}
+
+bool
+ARDOUR_UI::tabbable_visibility_button_press (GdkEventButton* ev, string const& tabbable_name)
+{
+	if (ev->button != 3) {
+		return false;
+	}
+
+	/* context menu is defined in *.menus.in
+	 */
+
+	string menu_name = string ("/ui/") + tabbable_name + X_("TabbableButtonMenu");
+	Gtk::Menu* menu = dynamic_cast<Gtk::Menu*> (ActionManager::get_widget (menu_name.c_str()));
+	if (menu) {
+		menu->popup (3, ev->time);
+	}
+	return true;
+}
diff --git a/gtk2_ardour/ardour_ui_mixer.cc b/gtk2_ardour/ardour_ui_mixer.cc
index 56ecc05..4f5614e 100644
--- a/gtk2_ardour/ardour_ui_mixer.cc
+++ b/gtk2_ardour/ardour_ui_mixer.cc
@@ -23,12 +23,14 @@
    is to cut down on the nasty compile times for these classes.
 */
 
+#include "gtkmm2ext/keyboard.h"
+
 #include "actions.h"
 #include "ardour_ui.h"
 #include "mixer_ui.h"
 #include "meterbridge.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 using namespace PBD;
@@ -39,13 +41,14 @@ ARDOUR_UI::create_mixer ()
 {
 	try {
 		mixer = Mixer_UI::instance ();
+		mixer->StateChange.connect (sigc::mem_fun (*this, &ARDOUR_UI::tabbable_state_change));
 	}
 
 	catch (failed_constructor& err) {
 		return -1;
 	}
 
-	mixer->signal_window_state_event().connect (sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::main_window_state_event_handler), false));
+	// mixer->signal_event().connect (sigc::bind (sigc::ptr_fun (&Gtkmm2ext::Keyboard::catch_user_event_for_pre_dialog_focus), mixer));
 
 	return 0;
 }
@@ -63,8 +66,6 @@ ARDOUR_UI::create_meterbridge ()
 		return -1;
 	}
 
-	meterbridge->signal_window_state_event().connect (sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::main_window_state_event_handler), false));
-
 	return 0;
 }
 
diff --git a/gtk2_ardour/ardour_ui_options.cc b/gtk2_ardour/ardour_ui_options.cc
index 0284670..98ede1d 100644
--- a/gtk2_ardour/ardour_ui_options.cc
+++ b/gtk2_ardour/ardour_ui_options.cc
@@ -38,7 +38,7 @@
 #include "public_editor.h"
 #include "main_clock.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace Gtk;
 using namespace Gtkmm2ext;
@@ -46,14 +46,6 @@ using namespace ARDOUR;
 using namespace PBD;
 
 void
-ARDOUR_UI::toggle_keep_tearoffs ()
-{
-	ActionManager::toggle_config_state ("Common", "KeepTearoffs", &UIConfiguration::set_keep_tearoffs, &UIConfiguration::get_keep_tearoffs);
-
-	ARDOUR_UI::update_tearoff_visibility();
-}
-
-void
 ARDOUR_UI::toggle_external_sync()
 {
 	if (_session) {
@@ -91,31 +83,31 @@ ARDOUR_UI::toggle_time_master ()
 void
 ARDOUR_UI::toggle_send_mtc ()
 {
-	ActionManager::toggle_config_state ("options", "SendMTC", &RCConfiguration::set_send_mtc, &RCConfiguration::get_send_mtc);
+	ActionManager::toggle_config_state ("Options", "SendMTC", &RCConfiguration::set_send_mtc, &RCConfiguration::get_send_mtc);
 }
 
 void
 ARDOUR_UI::toggle_send_mmc ()
 {
-	ActionManager::toggle_config_state ("options", "SendMMC", &RCConfiguration::set_send_mmc, &RCConfiguration::get_send_mmc);
+	ActionManager::toggle_config_state ("Options", "SendMMC", &RCConfiguration::set_send_mmc, &RCConfiguration::get_send_mmc);
 }
 
 void
 ARDOUR_UI::toggle_send_midi_clock ()
 {
-	ActionManager::toggle_config_state ("options", "SendMidiClock", &RCConfiguration::set_send_midi_clock, &RCConfiguration::get_send_midi_clock);
+	ActionManager::toggle_config_state ("Options", "SendMidiClock", &RCConfiguration::set_send_midi_clock, &RCConfiguration::get_send_midi_clock);
 }
 
 void
 ARDOUR_UI::toggle_use_mmc ()
 {
-	ActionManager::toggle_config_state ("options", "UseMMC", &RCConfiguration::set_mmc_control, &RCConfiguration::get_mmc_control);
+	ActionManager::toggle_config_state ("Options", "UseMMC", &RCConfiguration::set_mmc_control, &RCConfiguration::get_mmc_control);
 }
 
 void
 ARDOUR_UI::toggle_send_midi_feedback ()
 {
-	ActionManager::toggle_config_state ("options", "SendMIDIfeedback", &RCConfiguration::set_midi_feedback, &RCConfiguration::get_midi_feedback);
+	ActionManager::toggle_config_state ("Options", "SendMIDIfeedback", &RCConfiguration::set_midi_feedback, &RCConfiguration::get_midi_feedback);
 }
 
 void
@@ -340,18 +332,16 @@ ARDOUR_UI::parameter_changed (std::string p)
 
 	} else if (p == "send-mtc") {
 
-		ActionManager::map_some_state ("options", "SendMTC", &RCConfiguration::get_send_mtc);
+		ActionManager::map_some_state ("Options", "SendMTC", &RCConfiguration::get_send_mtc);
 
 	} else if (p == "send-mmc") {
 
-		ActionManager::map_some_state ("options", "SendMMC", &RCConfiguration::get_send_mmc);
+		ActionManager::map_some_state ("Options", "SendMMC", &RCConfiguration::get_send_mmc);
 
-	} else if (p == "keep-tearoffs") {
-		ActionManager::map_some_state ("Common", "KeepTearoffs", &UIConfiguration::get_keep_tearoffs);
 	} else if (p == "mmc-control") {
-		ActionManager::map_some_state ("options", "UseMMC", &RCConfiguration::get_mmc_control);
+		ActionManager::map_some_state ("Options", "UseMMC", &RCConfiguration::get_mmc_control);
 	} else if (p == "midi-feedback") {
-		ActionManager::map_some_state ("options", "SendMIDIfeedback", &RCConfiguration::get_midi_feedback);
+		ActionManager::map_some_state ("Options", "SendMIDIfeedback", &RCConfiguration::get_midi_feedback);
 	} else if (p == "auto-play") {
 		ActionManager::map_some_state ("Transport", "ToggleAutoPlay", sigc::mem_fun (_session->config, &SessionConfiguration::get_auto_play));
 	} else if (p == "auto-return") {
@@ -404,6 +394,13 @@ ARDOUR_UI::parameter_changed (std::string p)
 			stop_clocking ();
 			start_clocking ();
 		}
+	} else if (p == "use-tooltips") {
+		/* this doesn't really belong here but it has to go somewhere */
+		if (UIConfiguration::instance().get_use_tooltips()) {
+			Gtkmm2ext::enable_tooltips ();
+		} else {
+			Gtkmm2ext::disable_tooltips ();
+		}
 	} else if (p == "waveform-gradient-depth") {
 		ArdourCanvas::WaveView::set_global_gradient_depth (UIConfiguration::instance().get_waveform_gradient_depth());
 	} else if (p == "show-editor-meter") {
@@ -411,13 +408,13 @@ ARDOUR_UI::parameter_changed (std::string p)
 
 		if (editor_meter) {
 			if (meter_box.get_parent()) {
-				transport_tearoff_hbox.remove (meter_box);
-				transport_tearoff_hbox.remove (editor_meter_peak_display);
+				transport_hbox.remove (meter_box);
+				transport_hbox.remove (editor_meter_peak_display);
 			}
 
 			if (show) {
-				transport_tearoff_hbox.pack_start (meter_box, false, false);
-				transport_tearoff_hbox.pack_start (editor_meter_peak_display, false, false);
+				transport_hbox.pack_start (meter_box, false, false);
+				transport_hbox.pack_start (editor_meter_peak_display, false, false);
 				meter_box.show();
 				editor_meter_peak_display.show();
 			}
@@ -434,6 +431,18 @@ ARDOUR_UI::parameter_changed (std::string p)
 	} else if (p == "waveform-cache-size") {
 		/* GUI option has units of megabytes; image cache uses units of bytes */
 		ArdourCanvas::WaveView::set_image_cache_size (UIConfiguration::instance().get_waveform_cache_size() * 1048576);
+	} else if (p == "use-wm-visibility") {
+		VisibilityTracker::set_use_window_manager_visibility (UIConfiguration::instance().get_use_wm_visibility());
+	} else if (p == "action-table-columns") {
+		const uint32_t cols = UIConfiguration::instance().get_action_table_columns ();
+		for (int i = 0; i < 9; ++i) {
+			const int col = i / 3;
+			if (cols & (1<<col)) {
+				action_script_call_btn[i].show();
+			} else {
+				action_script_call_btn[i].hide();
+			}
+		}
 	}
 }
 
diff --git a/gtk2_ardour/ardour_window.cc b/gtk2_ardour/ardour_window.cc
index 029f5f1..6289991 100644
--- a/gtk2_ardour/ardour_window.cc
+++ b/gtk2_ardour/ardour_window.cc
@@ -106,21 +106,33 @@ ArdourWindow::init ()
 	set_border_width (10);
 	add_events (Gdk::FOCUS_CHANGE_MASK);
 
-      /* ArdourWindows are not dialogs (they have no "OK" or "Close" button) but
+        /* ArdourWindows are not dialogs (they have no "OK" or "Close" button) but
            they should be considered part of the same "window level" as a dialog. This
-           works on X11 and Quartz, in that:
+           works on X11 in that: 
 
-           (a) utility & dialog windows are considered to be part of the same level
+           (a) there are no window "levels"
            (b) they will float above normal windows without any particular effort
 	   (c) present()-ing them will make a utility float over a dialog or
                vice versa.
+
+           Some X11 Window managers (e.g. KDE) get this wrong, and so we allow the user
+           to select what type of window hint is used.
+
+           GTK+ on OS X uses different levels for DIALOG and UTILITY, and Cocoa has a bug/design
+           issue that it will not transfer keyboard focus across levels when hiding a window.
+           So on OS X, we use DIALOG for all ArdourWindows to ensure that keyboard focus
+           will return to the main window(s) when this window is hidden.
         */
 
+#ifdef __APPLE__
+        set_type_hint (Gdk::WINDOW_TYPE_HINT_DIALOG);
+#else
 	if (UIConfiguration::instance().get_all_floating_windows_are_dialogs()) {
 		set_type_hint (Gdk::WINDOW_TYPE_HINT_DIALOG);
 	} else {
 		set_type_hint (Gdk::WINDOW_TYPE_HINT_UTILITY);
 	}
+#endif
 
 	Gtk::Window* parent = WM::Manager::instance().transient_parent();
 
diff --git a/gtk2_ardour/ardour_window.h b/gtk2_ardour/ardour_window.h
index 7ae9c3d..a4c5aaa 100644
--- a/gtk2_ardour/ardour_window.h
+++ b/gtk2_ardour/ardour_window.h
@@ -39,20 +39,21 @@ namespace WM {
  */
 class ArdourWindow : public Gtk::Window, public ARDOUR::SessionHandlePtr, public Gtkmm2ext::VisibilityTracker
 {
-  public:
+public:
 	ArdourWindow (std::string title);
 	ArdourWindow (Gtk::Window& parent, std::string title);
-	~ArdourWindow();
+	virtual ~ArdourWindow();
 
+protected:
 	bool on_focus_in_event (GdkEventFocus*);
 	bool on_focus_out_event (GdkEventFocus*);
-        bool on_delete_event (GdkEventAny *);
-        bool on_key_press_event (GdkEventKey*);
+	bool on_delete_event (GdkEventAny *);
+	bool on_key_press_event (GdkEventKey*);
 	void on_unmap ();
 
-  private:
-    WM::ProxyTemporary* proxy;
-    void init ();
+private:
+	WM::ProxyTemporary* proxy;
+	void init ();
 };
 
 #endif // __ardour_window_h__
diff --git a/gtk2_ardour/arlua b/gtk2_ardour/arlua
new file mode 100755
index 0000000..1286f79
--- /dev/null
+++ b/gtk2_ardour/arlua
@@ -0,0 +1,50 @@
+#!/bin/sh
+TOP=`dirname "$0"`/..
+. $TOP/build/gtk2_ardour/ardev_common_waf.sh
+export UBUNTU_MENUPROXY=""
+
+if [ $# -gt 0 ] ; then
+    case $1 in
+        -g|--gdb) DBG=gdb; shift ;;
+    esac
+    case $1 in
+        --valgrind) DBG=valgrind; shift ;;
+    esac
+    case $1 in
+        --callgrind) DBG=callgrind; shift ;;
+    esac
+fi
+
+
+if test -z "$DBG"; then
+	exec $TOP/build/tools/luadevel/luasession "$@"
+fi
+
+if test "$DBG" = "valgrind"; then
+	export ARDOUR_RUNNING_UNDER_VALGRIND=TRUE
+	exec valgrind \
+		--error-limit=no --num-callers=50 \
+		--tool=memcheck \
+		--track-origins=yes \
+		 --leak-check=full --show-leak-kinds=all \
+		--suppressions=${TOP}/tools/valgrind.supp \
+		$TOP/build/tools/luadevel/luasession "$@"
+fi
+
+if test "$DBG" = "callgrind"; then
+	exec valgrind \
+		--error-limit=no --num-callers=50 \
+		--tool=callgrind \
+		--separate-callers=3 \
+		--separate-threads=yes \
+		--collect-systime=yes \
+		--collect-jumps=yes \
+		$TOP/build/tools/luadevel/luasession "$@"
+fi
+
+if test -n "`which gdb`"; then
+	exec gdb --args $TOP/build/tools/luadevel/luasession "$@"
+fi
+if test -n "`which lldb`"; then
+	exec lldb -- $TOP/build/tools/luadevel/luasession "$@"
+fi
diff --git a/gtk2_ardour/arluadoc b/gtk2_ardour/arluadoc
new file mode 100755
index 0000000..2190958
--- /dev/null
+++ b/gtk2_ardour/arluadoc
@@ -0,0 +1,15 @@
+#!/bin/sh
+TOP=`dirname "$0"`/..
+. $TOP/build/gtk2_ardour/ardev_common_waf.sh
+export UBUNTU_MENUPROXY=""
+
+$TOP/build/gtk2_ardour/luadoc "$@" \
+	| sed 's/__cxx11:://g;' \
+	| sed 's/std::basic_string<char, std::char_traits<char>\, std::allocator<char> >/std::string/g;' \
+	| sed 's/, std::less<[^>]*<[^>]*>[ ]*>[ ]*>//g;' \
+	| sed 's/, std::less<[^>]*>//g;' \
+	| sed 's/, std::allocator<[^>]*<[^>]*>[ ]*>//g;' \
+	| sed 's/, std::allocator<[^>]*>//g;' \
+	| sed 's/ "/"/g;' \
+	| gzip -9 \
+	> $TOP/doc/luadoc.json.gz
diff --git a/gtk2_ardour/arscan b/gtk2_ardour/arscan
new file mode 100755
index 0000000..ab79995
--- /dev/null
+++ b/gtk2_ardour/arscan
@@ -0,0 +1,49 @@
+#!/bin/sh
+TOP=`dirname "$0"`/..
+. $TOP/build/gtk2_ardour/ardev_common_waf.sh
+export UBUNTU_MENUPROXY=""
+
+if [ $# -gt 0 ] ; then
+    case $1 in
+        -g|--gdb) DBG=gdb; shift ;;
+    esac
+    case $1 in
+        --valgrind) DBG=valgrind; shift ;;
+    esac
+    case $1 in
+        --callgrind) DBG=callgrind; shift ;;
+    esac
+fi
+
+if test -z "$DBG"; then
+	exec $TOP/build/libs/fst/ardour-vst-scanner "$@"
+fi
+
+if test "$DBG" = "valgrind"; then
+	export ARDOUR_RUNNING_UNDER_VALGRIND=TRUE
+	exec valgrind \
+		--error-limit=no --num-callers=50 \
+		--tool=memcheck \
+		--track-origins=yes \
+		 --leak-check=full --show-leak-kinds=all \
+		--suppressions=${TOP}/tools/valgrind.supp \
+		$TOP/build/libs/fst/ardour-vst-scanner "$@"
+fi
+
+if test "$DBG" = "callgrind"; then
+	exec valgrind \
+		--error-limit=no --num-callers=50 \
+		--tool=callgrind \
+		--separate-callers=3 \
+		--separate-threads=yes \
+		--collect-systime=yes \
+		--collect-jumps=yes \
+		$TOP/build/libs/fst/ardour-vst-scanner "$@"
+fi
+
+if test -n "`which gdb`"; then
+	exec gdb --args $TOP/build/libs/fst/ardour-vst-scanner "$@"
+fi
+if test -n "`which lldb`"; then
+	exec lldb -- $TOP/build/libs/fst/ardour-vst-scanner "$@"
+fi
diff --git a/gtk2_ardour/au_pluginui.h b/gtk2_ardour/au_pluginui.h
index 883e7e0..5e43bcb 100644
--- a/gtk2_ardour/au_pluginui.h
+++ b/gtk2_ardour/au_pluginui.h
@@ -23,6 +23,8 @@
 #include <vector>
 #include <string>
 
+#include <stdint.h>
+
 #include <AppKit/AppKit.h>
 #include <Carbon/Carbon.h>
 #include <AudioUnit/AudioUnitCarbonView.h>
@@ -65,6 +67,12 @@ class AUPluginUI;
 }
 @end
 
+ at interface LiveResizeNotificationObject : NSObject {
+	@private
+		AUPluginUI* plugin_ui;
+}
+ at end
+
 class AUPluginUI : public PlugUIBase, public Gtk::VBox
 {
   public:
@@ -88,7 +96,6 @@ class AUPluginUI : public PlugUIBase, public Gtk::VBox
 	void lower_box_unmap ();
 	void lower_box_size_request (GtkRequisition*);
 	void lower_box_size_allocate (Gtk::Allocation&);
-	gboolean lower_box_expose (GdkEventExpose*);
 
 	void cocoa_view_resized ();
 	void on_realize ();
@@ -100,6 +107,9 @@ class AUPluginUI : public PlugUIBase, public Gtk::VBox
 
 	OSStatus carbon_event (EventHandlerCallRef nextHandlerRef, EventRef event);
 
+	void start_live_resize ();
+	void end_live_resize ();
+
   private:
 	WindowRef wr;
 	boost::shared_ptr<ARDOUR::AUPlugin> au;
@@ -115,20 +125,17 @@ class AUPluginUI : public PlugUIBase, public Gtk::VBox
 
 	static std::vector<std::string> automation_mode_strings;
 
-	bool mapped;
 	bool resizable;
-	int  min_width;
-	int  min_height;
 	int  req_width;
 	int  req_height;
-	int  alo_width;
-	int  alo_height;
 
 	/* Cocoa */
 
 	NSWindow*           cocoa_window;
 	NSView*             au_view;
         NSRect              last_au_frame;
+	bool                in_live_resize;
+	uint32_t            plugin_requested_resize;
 
 	/* Carbon */
 
@@ -136,9 +143,13 @@ class AUPluginUI : public PlugUIBase, public Gtk::VBox
 	ComponentDescription carbon_descriptor;
 	AudioUnitCarbonView  editView;
 	WindowRef            carbon_window;
- 	EventHandlerRef      carbon_event_handler;
+	EventHandlerRef      carbon_event_handler;
 	bool                 _activating_from_app;
+
+	/* Generic */
+
 	NotificationObject* _notify;
+	LiveResizeNotificationObject* _resize_notify;
 
 	bool test_cocoa_view_support ();
 	bool test_carbon_view_support ();
@@ -152,6 +163,21 @@ class AUPluginUI : public PlugUIBase, public Gtk::VBox
 	void update_view_size ();
 
 	bool plugin_class_valid (Class pluginClass);
+
+	friend void au_cf_timer_callback (CFRunLoopTimerRef timer, void* info);
+	static CFRunLoopTimerRef   cf_timer;
+	static void cf_timer_callback ();
+	static int64_t last_timer;
+	static bool timer_needed;
+	static uint64_t timer_callbacks;
+	static uint64_t timer_out_of_range;
+
+	static bool timer_callback ();
+	static sigc::connection timer_connection;
+
+  public:
+	static void start_cf_timer ();
+	static void stop_cf_timer ();
 };
 
 #endif /* __gtk2_ardour_auplugin_ui_h__  */
diff --git a/gtk2_ardour/au_pluginui.mm b/gtk2_ardour/au_pluginui.mm
index af174f9..fc73b9b 100644
--- a/gtk2_ardour/au_pluginui.mm
+++ b/gtk2_ardour/au_pluginui.mm
@@ -1,6 +1,7 @@
 #undef  Marker
 #define Marker FuckYouAppleAndYourLackOfNameSpaces
 
+#include <sys/time.h>
 #include <gtkmm/button.h>
 #include <gdk/gdkquartz.h>
 
@@ -14,22 +15,41 @@
 #undef check // stupid gtk, stupid apple
 
 #include <gtkmm2ext/utils.h>
+#include <gtkmm2ext/window_proxy.h>
 
 #include "au_pluginui.h"
 #include "gui_thread.h"
+#include "processor_box.h"
+
+// yes, yes we know (see wscript for various available OSX compat modes)
+#if defined (__clang__)
+#	pragma clang diagnostic push
+#	pragma clang diagnostic ignored "-Wdeprecated-declarations"
+#endif
 
 #include "CAAudioUnit.h"
 #include "CAComponent.h"
 
+#if defined (__clang__)
+#	pragma clang diagnostic pop
+#endif
+
 #import <AudioUnit/AUCocoaUIView.h>
 #import <CoreAudioKit/AUGenericView.h>
+#import <objc/runtime.h>
+
+#ifndef __ppc__
+#include <dispatch/dispatch.h>
+#endif
 
 #undef Marker
 
 #include "keyboard.h"
 #include "utils.h"
 #include "public_editor.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
+
+#include "gtk2ardour-config.h"
 
 #ifdef COREAUDIO105
 #define ArdourCloseComponent CloseComponent
@@ -43,6 +63,10 @@ using namespace std;
 using namespace PBD;
 
 vector<string> AUPluginUI::automation_mode_strings;
+int64_t AUPluginUI::last_timer = 0;
+bool    AUPluginUI::timer_needed = true;
+CFRunLoopTimerRef AUPluginUI::cf_timer;
+sigc::connection AUPluginUI::timer_connection;
 
 static const gchar* _automation_mode_strings[] = {
 	X_("Manual"),
@@ -58,11 +82,21 @@ dump_view_tree (NSView* view, int depth, int maxdepth)
 	NSArray* subviews = [view subviews];
 	unsigned long cnt = [subviews count];
 
+	if (depth == 0) {
+		NSView* su = [view superview];
+		if (su) {
+			NSRect sf = [su frame];
+			cerr << " PARENT view " << su << " @ " <<  sf.origin.x << ", " << sf.origin.y
+			     << ' ' << sf.size.width << " x " << sf.size.height
+			     << endl;
+		}
+	}
+
 	for (int d = 0; d < depth; d++) {
 		cerr << '\t';
 	}
 	NSRect frame = [view frame];
-	cerr << " view @ " <<  frame.origin.x << ", " << frame.origin.y
+	cerr << " view " << view << " @ " <<  frame.origin.x << ", " << frame.origin.y
 		<< ' ' << frame.size.width << " x " << frame.size.height
 		<< endl;
 
@@ -75,6 +109,181 @@ dump_view_tree (NSView* view, int depth, int maxdepth)
 	}
 }
 
+/* This deeply hacky block of code exists for a rather convoluted reason.
+ *
+ * The proximal reason is that there are plugins (such as XLN's Addictive Drums
+ * 2) which redraw their GUI/editor windows using a timer, and use a drawing
+ * technique that on Retina displays ends up calling arg32_image_mark_RGB32, a
+ * function that for some reason (probably byte-swapping or pixel-doubling) is
+ * many times slower than the function used on non-Retina displays.
+ *
+ * We are not the first people to discover the problem with
+ * arg32_image_mark_RGB32.
+ *
+ * Justin Fraenkel, the lead author of Reaper, wrote a very detailed account of
+ * the performance issues with arg32_image_mark_RGB32 here:
+ * http://www.1014.org/?article=516
+ *
+ * The problem was also seen by Robert O'Callahan (lead developer of rr, the
+ * reverse debugger) as far back as 2010:
+ * http://robert.ocallahan.org/2010/05/cglayer-performance-trap-with-isflipped_03.html
+ *
+ * In fact, it is so slow that the drawing takes up close to 100% of a single
+ * core, and the event loop that the drawing occurs in never sleeps or "idles".
+ *
+ * In AU hosts built directly on top of Cocoa, or some other toolkits, this
+ * isn't inherently a major problem - it just makes the entire GUI of the
+ * application slow.
+ *
+ * However, there is an additional problem for Ardour because GTK+ is built on
+ * top of the GDK/Quartz event loop integration. This integration is rather
+ * baroque, mostly because it was written at a time when CFRunLoop did not
+ * offer a way to wait for "input" from file descriptors (which arrived in OS X
+ * 10.5). As a result, it uses a hair-raising design involving an additional
+ * thread. This design has a major problem, which is that it effectively
+ * creates two nested run loops.
+ *
+ * The GTK+/GDK/glib one runs until it has nothing to do, at which time it
+ * calls a function to wait until there is something to do. On Linux or Windows
+ * that would involve some variant or relative of poll(2), which puts the
+ * process to sleep until there is something to do.
+ *
+ * On OS X, glib ends up calling [CFRunLoop waitForNextEventMatchingMask] which
+ * will eventually put the process to sleep, but won't do so until the
+ * CFRunLoop also has nothing to do. This includes (at least) a complete redraw
+ * cycle. If redrawing takes too long, and there are timers expired for another
+ * redraw (e.g. Addictive Drums 2, again), then the CFRunLoop will just start
+ * another redraw cycle after processing any events and other stuff.
+ *
+ * If the CFRunLoop stays busy, then it will never return to the glib
+ * level at all, thus stopping any further GTK+ level activity (events,
+ * drawing) from taking place. In short, the current (spring 2016) design of
+ * the GDK/Quartz event loop integration relies on the idea that the internal
+ * CFRunLoop will go idle, and totally breaks if this does not happen.
+ *
+ * So take a fully functional Ardour, add in XLN's Addictive Drums 2, and a
+ * Retina display, and Apple's ridiculously slow blitting code, and the
+ * CFRunLoop never goes idle. As soon as Addictive Drums starts drawing (over
+ * and over again), the GTK+ event loop stops receiving events and stops
+ * drawing.
+ *
+ * One fix for this was to run a nested GTK+ event loop iteration (or two)
+ * whenever a plugin window was redrawn. This works in the sense that the
+ * immediate issue (no GTK+ events or drawing) is fixed. But the recursive GTK+
+ * event loop causes its own (very subtle) problems too.
+ *
+ * This code takes a rather radical approach. We use Objective C's ability to
+ * swizzle object methods. Specifically, we replace [NSView displayIfNeeded]
+ * with our own version which will skip redraws of plugin windows if we tell it
+ * too. If we haven't done that, or if the redraw is of a non-plugin window,
+ * then we invoke the original displayIfNeeded method.
+ *
+ * After every 10 redraws of a given plugin GUI/editor window, we queue up a
+ * GTK/glib idle callback to measure the interval between those idle
+ * callbacks. We do this globally across all plugin windows, so if the callback
+ * is already queued, we don't requeue it.
+ *
+ * If the interval is longer than 40msec (a 25fps redraw rate), we set
+ * block_plugin_redraws to some number. Each successive call to our interposed
+ * displayIfNeeded method will (a) check this value and if non-zero (b) check
+ * if the call is for a plugin-related NSView/NSWindow. If it is, then we will
+ * skip the redisplay entirely, hopefully avoiding any calls to
+ * argb32_image_mark_RGB32 or any other slow drawing code, and thus allowing
+ * the CFRunLoop to go idle. If the value is zero or the call is for a
+ * non-plugin window, then we just invoke the "original" displayIfNeeded
+ * method.
+ *
+ * This hack adds a tiny bit of overhead onto redrawing of the entire
+ * application. But in the common case this consists of 1 conditional (the
+ * check on block_plugin_redraws, which will find it to be zero) and the
+ * invocation of the original method. Given how much work is typically done
+ * during drawing, this seems acceptable.
+ *
+ * The correct fix for this is to redesign the relationship between
+ * GTK+/GDK/glib so that a glib run loop is actually a CFRunLoop, with all
+ * GSources represented as CFRunLoopSources, without any nesting and without
+ * any additional thread. This is not a task to be undertaken lightly, and is
+ * certainly substantially more work than this was. It may never be possible to
+ * do that work in a way that could be integrated back into glib, because of
+ * the rather specific semantics and types of GSources, but it would almost
+ * certainly be possible to make it work for Ardour.
+ */
+
+static uint32_t block_plugin_redraws = 0;
+static const uint32_t minimum_redraw_rate = 30; /* frames per second */
+static const uint32_t block_plugin_redraw_count = 15; /* number of combined plugin redraws to block, if blocking */
+
+#ifdef __ppc__
+
+/* PowerPC versions of OS X do not support libdispatch, which we use below when swizzling objective C. But they also don't have Retina
+ * which is the underlying reason for this code. So just skip it on those CPUs.
+ */
+
+
+static void add_plugin_view (id view) {}
+static void remove_plugin_view (id view) {}
+
+#else
+
+static IMP original_nsview_drawIfNeeded;
+static std::vector<id> plugin_views;
+
+static void add_plugin_view (id view)
+{
+	if (plugin_views.empty()) {
+		AUPluginUI::start_cf_timer ();
+	}
+
+	plugin_views.push_back (view);
+
+}
+
+static void remove_plugin_view (id view)
+{
+	std::vector<id>::iterator x = find (plugin_views.begin(), plugin_views.end(), view);
+	if (x != plugin_views.end()) {
+		plugin_views.erase (x);
+	}
+	if (plugin_views.empty()) {
+		AUPluginUI::stop_cf_timer ();
+	}
+}
+
+static void interposed_drawIfNeeded (id receiver, SEL selector, NSRect rect)
+{
+	if (block_plugin_redraws && (find (plugin_views.begin(), plugin_views.end(), receiver) != plugin_views.end())) {
+		block_plugin_redraws--;
+#ifdef AU_DEBUG_PRINT
+		std::cerr << "Plugin redraw blocked\n";
+#endif
+		/* YOU ... SHALL .... NOT ... DRAW!!!! */
+		return;
+	}
+	(void) ((int (*)(id,SEL,NSRect)) original_nsview_drawIfNeeded) (receiver, selector, rect);
+}
+
+ at implementation NSView (Tracking)
++ (void) load {
+	static dispatch_once_t once_token;
+
+	/* this swizzles NSView::displayIfNeeded and replaces it with
+	 * interposed_drawIfNeeded(), which allows us to interpose and block
+	 * the redrawing of plugin UIs when their redrawing behaviour
+	 * is interfering with event loop behaviour.
+	 */
+
+	dispatch_once (&once_token, ^{
+			Method target = class_getInstanceMethod ([NSView class], @selector(displayIfNeeded));
+			original_nsview_drawIfNeeded = method_setImplementation (target, (IMP) interposed_drawIfNeeded);
+		});
+}
+
+ at end
+
+#endif /* __ppc__ */
+
+/* END OF THE PLUGIN REDRAW HACK */
+
 @implementation NotificationObject
 
 - (NotificationObject*) initWithPluginUI: (AUPluginUI*) apluginui andCocoaParent: (NSWindow*) cp andTopLevelParent: (NSWindow*) tlp
@@ -139,19 +348,43 @@ dump_view_tree (NSView* view, int depth, int maxdepth)
 
 @end
 
+ at implementation LiveResizeNotificationObject
+
+- (LiveResizeNotificationObject*) initWithPluginUI: (AUPluginUI*) apluginui
+{
+	self = [ super init ];
+	if (self) {
+		plugin_ui = apluginui;
+	}
+
+	return self;
+}
+
+- (void)windowWillStartLiveResizeHandler:(NSNotification*)notification
+{
+	plugin_ui->start_live_resize ();
+}
+
+- (void)windowWillEndLiveResizeHandler:(NSNotification*)notification
+{
+	plugin_ui->end_live_resize ();
+}
+ at end
+
 AUPluginUI::AUPluginUI (boost::shared_ptr<PluginInsert> insert)
 	: PlugUIBase (insert)
 	, automation_mode_label (_("Automation"))
 	, preset_label (_("Presets"))
-	, mapped (false)
 	, resizable (false)
-	, min_width (0)
-	, min_height (0)
 	, req_width (0)
 	, req_height (0)
-	, alo_width (0)
-	, alo_height (0)
-
+	, cocoa_window (0)
+	, au_view (0)
+	, in_live_resize (false)
+	, plugin_requested_resize (0)
+	, cocoa_parent (0)
+	, _notify (0)
+	, _resize_notify (0)
 {
 	if (automation_mode_strings.empty()) {
 		automation_mode_strings = I18N (_automation_mode_strings);
@@ -170,6 +403,7 @@ AUPluginUI::AUPluginUI (boost::shared_ptr<PluginInsert> insert)
 	HBox* smaller_hbox = manage (new HBox);
 
 	smaller_hbox->set_spacing (6);
+	smaller_hbox->pack_start (pin_management_button, false, false, 4);
 	smaller_hbox->pack_start (preset_label, false, false, 4);
 	smaller_hbox->pack_start (_preset_modified, false, false);
 	smaller_hbox->pack_start (_preset_combo, false, false);
@@ -245,7 +479,6 @@ AUPluginUI::AUPluginUI (boost::shared_ptr<PluginInsert> insert)
 		low_box.signal_size_allocate ().connect (mem_fun (this, &AUPluginUI::lower_box_size_allocate));
 		low_box.signal_map ().connect (mem_fun (this, &AUPluginUI::lower_box_map));
 		low_box.signal_unmap ().connect (mem_fun (this, &AUPluginUI::lower_box_unmap));
-		low_box.signal_expose_event ().connect (mem_fun (this, &AUPluginUI::lower_box_expose));
 	}
 }
 
@@ -255,12 +488,20 @@ AUPluginUI::~AUPluginUI ()
 		[[NSNotificationCenter defaultCenter] removeObserver:_notify];
 	}
 
+	if (_resize_notify) {
+		[[NSNotificationCenter defaultCenter] removeObserver:_resize_notify];
+	}
+
+	NSWindow* win = get_nswindow();
+	if (au_view) {
+		remove_plugin_view ([[win contentView] superview]);
+	}
+
+#ifdef WITH_CARBON
 	if (cocoa_parent) {
-		NSWindow* win = get_nswindow();
 		[win removeChildWindow:cocoa_parent];
 	}
 
-#ifdef WITH_CARBON
 	if (carbon_window) {
 		/* not parented, just overlaid on top of our window */
 		DisposeWindow (carbon_window);
@@ -275,7 +516,6 @@ AUPluginUI::~AUPluginUI ()
 		/* remove whatever we packed into low_box so that GTK doesn't
 		   mess with it.
 		 */
-
 		[au_view removeFromSuperview];
 	}
 }
@@ -397,7 +637,7 @@ AUPluginUI::create_cocoa_view ()
 	// [A] Show custom UI if view has it
 
 	if (CocoaViewBundlePath && factoryClassName) {
-		NSBundle *viewBundle  	= [NSBundle bundleWithPath:[CocoaViewBundlePath path]];
+		NSBundle *viewBundle	= [NSBundle bundleWithPath:[CocoaViewBundlePath path]];
 
 		DEBUG_TRACE (DEBUG::AudioUnits, string_compose ("tried to create bundle, result = %1\n", viewBundle));
 
@@ -455,8 +695,9 @@ AUPluginUI::create_cocoa_view ()
 
 	// Get the initial size of the new AU View's frame
 	NSRect  frame = [au_view frame];
-	min_width  = req_width  = CGRectGetWidth(NSRectToCGRect(frame));
-	min_height = req_height = CGRectGetHeight(NSRectToCGRect(frame));
+	req_width  = frame.size.width;
+	req_height = frame.size.height;
+
 	resizable  = [au_view autoresizingMask];
 
 	low_box.queue_resize ();
@@ -465,25 +706,204 @@ AUPluginUI::create_cocoa_view ()
 }
 
 void
+AUPluginUI::update_view_size ()
+{
+	last_au_frame = [au_view frame];
+}
+
+bool
+AUPluginUI::timer_callback ()
+{
+	block_plugin_redraws = 0;
+#ifdef AU_DEBUG_PRINT
+	std::cerr << "Resume redraws after idle\n";
+#endif
+	return false;
+}
+
+void
+au_cf_timer_callback (CFRunLoopTimerRef timer, void* info)
+{
+	reinterpret_cast<AUPluginUI*> (info)->cf_timer_callback ();
+}
+
+void
+AUPluginUI::cf_timer_callback ()
+{
+	int64_t now = ARDOUR::get_microseconds ();
+
+	if (!last_timer || block_plugin_redraws) {
+		last_timer = now;
+		return;
+	}
+
+	const int64_t usecs_slop = (1400000 / minimum_redraw_rate); // 140%
+
+#ifdef AU_DEBUG_PRINT
+	std::cerr << "Timer elapsed : " << now - last_timer << std::endl;
+#endif
+
+	if ((now - last_timer) > (usecs_slop + (1000000/minimum_redraw_rate))) {
+		block_plugin_redraws = block_plugin_redraw_count;
+		timer_connection.disconnect ();
+		timer_connection = Glib::signal_timeout().connect (&AUPluginUI::timer_callback, 40);
+#ifdef AU_DEBUG_PRINT
+		std::cerr << "Timer too slow, block plugin redraws\n";
+#endif
+	}
+
+	last_timer = now;
+}
+
+void
+AUPluginUI::start_cf_timer ()
+{
+	if (!timer_needed) {
+		return;
+	}
+
+	CFTimeInterval interval = 1.0 / (float) minimum_redraw_rate;
+
+	cf_timer = CFRunLoopTimerCreate (kCFAllocatorDefault,
+	                                 CFAbsoluteTimeGetCurrent() + interval,
+	                                 interval, 0, 0,
+	                                 au_cf_timer_callback,
+	                                 0);
+
+	CFRunLoopAddTimer (CFRunLoopGetCurrent(), cf_timer, kCFRunLoopCommonModes);
+	timer_needed = false;
+}
+
+void
+AUPluginUI::stop_cf_timer ()
+{
+	if (timer_needed) {
+		return;
+	}
+
+	CFRunLoopRemoveTimer (CFRunLoopGetCurrent(), cf_timer, kCFRunLoopCommonModes);
+	timer_needed = true;
+	last_timer = 0;
+}
+
+void
 AUPluginUI::cocoa_view_resized ()
 {
-	if (!mapped || alo_width == 0 || alo_height == 0 || !resizable) {
+        /* we can get here for two reasons:
+
+           1) the plugin window was resized by the user, a new size was
+           allocated to the window, ::update_view_size() was called, and we
+           explicitly/manually resized the AU NSView.
+
+           2) the plugin decided to resize itself (probably in response to user
+           action, but not in response to an actual window resize)
+
+           We only want to proceed with a window resizing in the second case.
+        */
+
+	if (in_live_resize) {
+		/* ::update_view_size() will be called at the right times and
+		 * will update the view size. We don't need to anything while a
+		 * live resize in underway.
+		 */
 		return;
 	}
-	/* check for self-resizing plugins (e.g expand settings in AUSampler)
-	 * if the widget expands it moves its y-offset (cocoa y-axis points towards the top)
+
+	if (plugin_requested_resize) {
+		/* we tried to change the plugin frame from inside this method
+		 * (to adjust the origin), which changes the frame of the AU
+		 * NSView, resulting in a reentrant call to the FrameDidChange
+		 * handler (this method). Ignore this reentrant call.
+		 */
+#ifdef AU_DEBUG_PRINT
+		std::cerr << plugin->name() << " re-entrant call to cocoa_view_resized, ignored\n";
+#endif
+		return;
+	}
+
+	plugin_requested_resize = 1;
+
+	ProcessorWindowProxy* wp = insert->window_proxy();
+	if (wp) {
+		/* Once a plugin has requested a resize of its own window, do
+		 * NOT save the window. The user may save state with the plugin
+		 * editor expanded to show "extra detail" - the plugin will not
+		 * refill this space when the editor is first
+		 * instantiated. Leaving the window in the "too big" state
+		 * cannot be recovered from.
+		 *
+		 * The window will be sized to fit the plugin's own request. Done.
+		 */
+		wp->set_state_mask (WindowProxy::Position);
+	}
+
+        NSRect new_frame = [au_view frame];
+
+	/* from here on, we know that we've been called because the plugin
+	 * decided to change the NSView frame itself.
 	 */
-	NSRect new_au_frame = [au_view frame];
 
-	//float dx = last_au_frame.origin.x - new_au_frame.origin.x;
-	float dy = last_au_frame.origin.y - new_au_frame.origin.y;
-	//req_width += dx;
-	req_height += dy;
-	if (req_width < min_width) req_width = min_width;
-	if (req_height < min_height) req_height = min_height;
+	/* step one: compute the change in the frame size.
+	 */
 
-	last_au_frame = new_au_frame;
-	low_box.queue_resize ();
+	float dy = new_frame.size.height - last_au_frame.size.height;
+        float dx = new_frame.size.width - last_au_frame.size.width;
+
+        NSWindow* window = get_nswindow ();
+        NSRect windowFrame= [window frame];
+
+	/* we want the top edge of the window to remain in the same place,
+	   but the Cocoa/Quartz origin is at the lower left. So, when we make
+	   the window larger, we will move it down, which means shifting the
+	   origin toward (x,0). This will leave the top edge in the same place.
+	*/
+
+        windowFrame.origin.y    -= dy;
+        windowFrame.origin.x    -= dx;
+        windowFrame.size.height += dy;
+        windowFrame.size.width  += dx;
+
+        NSUInteger old_auto_resize = [au_view autoresizingMask];
+
+        /* Some stupid AU Views change the origin of the original AU View when
+           they are resized (I'm looking at you AUSampler). If the origin has
+           been moved, move it back.
+        */
+
+        if (last_au_frame.origin.x != new_frame.origin.x ||
+            last_au_frame.origin.y != new_frame.origin.y) {
+                new_frame.origin = last_au_frame.origin;
+                [au_view setFrame:new_frame];
+                /* also be sure to redraw the topbox because this can
+                   also go wrong.
+                 */
+                top_box.queue_draw ();
+	}
+
+	/* We resize the window using Cocoa. We can't use GTK mechanisms
+	 * because of this:
+	 *
+	 * http://www.lists.apple.com/archives/coreaudio-api/2005/Aug/msg00245.html
+	 *
+	 * "The host needs to be aware that changing the size of the window in
+	 * response to the NSViewFrameDidChangeNotification can cause the view
+	 * size to change depending on the autoresizing mask of the view. The
+	 * host may need to cache the autoresizing mask of the view, set it to
+	 * NSViewNotSizable, resize the window, and then reset the autoresizing
+	 * mask of the view once the window has been sized."
+	 *
+	 */
+
+        [au_view setAutoresizingMask:NSViewNotSizable];
+	[window setFrame:windowFrame display:1];
+        [au_view setAutoresizingMask:old_auto_resize];
+
+	/* keep a copy of the size of the AU NSView. We didn't set it - the plugin did */
+	last_au_frame = new_frame;
+	req_width  = new_frame.size.width;
+	req_height = new_frame.size.height;
+
+	plugin_requested_resize = 0;
 }
 
 int
@@ -651,6 +1071,20 @@ AUPluginUI::parent_cocoa_window ()
 
 	NSView* view = gdk_quartz_window_get_nsview (low_box.get_window()->gobj());
 	[view addSubview:au_view];
+	/* despite the fact that the documentation says that [NSWindow
+	   contentView] is the highest "accessible" NSView in an NSWindow, when
+	   the redraw cycle is executed, displayIfNeeded is actually executed
+	   on the parent of the contentView. To provide a marginal speedup when
+	   checking if a given redraw is for a plugin, use this "hidden" NSView
+	   to identify the plugin, so that we do not have to call [superview]
+	   every time in interposed_drawIfNeeded().
+	*/
+	add_plugin_view ([[win contentView] superview]);
+
+	/* this moves the AU NSView down and over to provide a left-hand margin
+	 * and to clear the Ardour "task bar" (with plugin preset mgmt buttons,
+	 * keyboard focus control, bypass etc).
+	 */
 
 	gint xx, yy;
 	gtk_widget_translate_coordinates(
@@ -667,6 +1101,38 @@ AUPluginUI::parent_cocoa_window ()
 		selector:@selector(auViewResized:) name:NSViewFrameDidChangeNotification
 		object:au_view];
 
+	// catch notifications that live resizing is about to start
+
+#if HAVE_COCOA_LIVE_RESIZING
+	_resize_notify = [ [ LiveResizeNotificationObject alloc] initWithPluginUI:this ];
+
+	[[NSNotificationCenter defaultCenter] addObserver:_resize_notify
+		selector:@selector(windowWillStartLiveResizeHandler:) name:NSWindowWillStartLiveResizeNotification
+		object:win];
+
+	[[NSNotificationCenter defaultCenter] addObserver:_resize_notify
+		selector:@selector(windowWillEndLiveResizeHandler:) name:NSWindowDidEndLiveResizeNotification
+		object:win];
+#else
+	/* No way before 10.6 to identify the start of a live resize (drag
+	 * resize) without subclassing NSView and overriding two of its
+	 * methods. Instead of that, we make the window non-resizable, thus
+	 * ending confusion about whether or not resizes are plugin or user
+	 * driven (they are always plugin-driven).
+	 */
+
+	Gtk::Container* toplevel = get_toplevel();
+	Requisition req;
+
+	resizable = false;
+
+	if (toplevel && toplevel->is_toplevel()) {
+		toplevel->size_request (req);
+		toplevel->set_size_request (req.width, req.height);
+		dynamic_cast<Gtk::Window*>(toplevel)->set_resizable (false);
+	}
+
+#endif
 	return 0;
 }
 
@@ -736,49 +1202,8 @@ AUPluginUI::lower_box_visibility_notify (GdkEventVisibility* ev)
 }
 
 void
-AUPluginUI::update_view_size ()
-{
-	if (!mapped || alo_width == 0 || alo_height == 0) {
-		return;
-	}
-	gint xx, yy;
-	gtk_widget_translate_coordinates(
-			GTK_WIDGET(low_box.gobj()),
-			GTK_WIDGET(low_box.get_parent()->gobj()),
-			8, 6, &xx, &yy);
-
-	[[NSNotificationCenter defaultCenter] removeObserver:_notify
-		name:NSViewFrameDidChangeNotification
-		object:au_view];
-
-	if (!resizable) {
-		xx += (alo_width - req_width) * .5;
-		[au_view setFrame:NSMakeRect(xx, yy, req_width, req_height)];
-	} else {
-		/* this mitigates issues with plugins that resize themselves
-		 * depending on visible options (e.g AUSampler)
-		 * since the OSX y-axis points upwards, the plugin adjusts its
-		 * own y-offset if the view expands to the bottom to accomodate
-		 * subviews inside the main view.
-		 */
-		[au_view setAutoresizesSubviews:0];
-		[au_view setFrame:NSMakeRect(xx, yy, alo_width, alo_height)];
-		[au_view setAutoresizesSubviews:1];
-		[au_view setNeedsDisplay:1];
-	}
-
-	last_au_frame = [au_view frame];
-
-	[[NSNotificationCenter defaultCenter]
-	     addObserver:_notify
-	        selector:@selector(auViewResized:) name:NSViewFrameDidChangeNotification
-	          object:au_view];
-}
-
-void
 AUPluginUI::lower_box_map ()
 {
-	mapped = true;
 	[au_view setHidden:0];
 	update_view_size ();
 }
@@ -786,7 +1211,6 @@ AUPluginUI::lower_box_map ()
 void
 AUPluginUI::lower_box_unmap ()
 {
-	mapped = false;
 	[au_view setHidden:1];
 }
 
@@ -800,28 +1224,9 @@ AUPluginUI::lower_box_size_request (GtkRequisition* requisition)
 void
 AUPluginUI::lower_box_size_allocate (Gtk::Allocation& allocation)
 {
-	alo_width  = allocation.get_width ();
-	alo_height = allocation.get_height ();
 	update_view_size ();
 }
 
-gboolean
-AUPluginUI::lower_box_expose (GdkEventExpose* event)
-{
-#if 0 // AU view magically redraws by itself
-	[au_view drawRect:NSMakeRect(event->area.x,
-			event->area.y,
-			event->area.width,
-			event->area.height)];
-#endif
-	/* hack to keep ardour responsive
-	 * some UIs (e.g Addictive Drums) completely hog the CPU
-	 */
-	ARDOUR::GUIIdle();
-
-	return true;
-}
-
 void
 AUPluginUI::on_window_hide ()
 {
@@ -880,4 +1285,14 @@ create_au_gui (boost::shared_ptr<PluginInsert> plugin_insert, VBox** box)
 	return aup;
 }
 
+void
+AUPluginUI::start_live_resize ()
+{
+	in_live_resize = true;
+}
 
+void
+AUPluginUI::end_live_resize ()
+{
+	in_live_resize = false;
+}
diff --git a/gtk2_ardour/audio_clock.cc b/gtk2_ardour/audio_clock.cc
index d7fb376..16b4151 100644
--- a/gtk2_ardour/audio_clock.cc
+++ b/gtk2_ardour/audio_clock.cc
@@ -42,7 +42,7 @@
 #include "keyboard.h"
 #include "gui_thread.h"
 #include "ui_config.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 using namespace ARDOUR_UI_UTILS;
@@ -924,6 +924,12 @@ AudioClock::session_property_changed (const PropertyChange&)
 }
 
 void
+AudioClock::metric_position_changed ()
+{
+	set (last_when, true);
+}
+
+void
 AudioClock::session_configuration_changed (std::string p)
 {
 	if (_negative_allowed) {
@@ -1252,12 +1258,12 @@ AudioClock::set_bbt (framepos_t when, bool /*force*/)
 			BBT.beats = 0;
 			BBT.ticks = 0;
 		} else {
-			_session->tempo_map().bbt_time (when, BBT);
+			BBT = _session->tempo_map().bbt_at_frame (when);
 			BBT.bars--;
 			BBT.beats--;
 		}
 	} else {
-		_session->tempo_map().bbt_time (when, BBT);
+		BBT = _session->tempo_map().bbt_at_frame (when);
 	}
 
 	if (negative) {
@@ -1281,7 +1287,7 @@ AudioClock::set_bbt (framepos_t when, bool /*force*/)
 
 		TempoMetric m (_session->tempo_map().metric_at (pos));
 
-		sprintf (buf, "%-5.1f", m.tempo().beats_per_minute());
+		sprintf (buf, "%-5.3f", _session->tempo_map().tempo_at_frame (pos).beats_per_minute());
 		_left_layout->set_markup (string_compose ("<span size=\"%1\">" TXTSPAN "%3</span> <span foreground=\"green\">%2</span></span>",
 							  INFO_FONT_SIZE, buf, _("Tempo")));
 
@@ -1300,8 +1306,9 @@ AudioClock::set_session (Session *s)
 
 		_session->config.ParameterChanged.connect (_session_connections, invalidator (*this), boost::bind (&AudioClock::session_configuration_changed, this, _1), gui_context());
 		_session->tempo_map().PropertyChanged.connect (_session_connections, invalidator (*this), boost::bind (&AudioClock::session_property_changed, this, _1), gui_context());
+		_session->tempo_map().MetricPositionChanged.connect (_session_connections, invalidator (*this), boost::bind (&AudioClock::metric_position_changed, this), gui_context());
 
-		const XMLProperty* prop;
+		XMLProperty const * prop;
 		XMLNode* node = _session->extra_xml (X_("ClockModes"));
 		AudioClock::Mode amode;
 
@@ -1311,7 +1318,7 @@ AudioClock::set_session (Session *s)
 
 					if ((prop = (*i)->property (X_("mode"))) != 0) {
 						amode = AudioClock::Mode (string_2_enum (prop->value(), amode));
-						set_mode (amode);
+						set_mode (amode, true);
 					}
 					if ((prop = (*i)->property (X_("on"))) != 0) {
 						set_off (!string_is_affirmative (prop->value()));
@@ -2112,12 +2119,10 @@ AudioClock::build_ops_menu ()
 	MenuList& ops_items = ops_menu->items();
 	ops_menu->set_name ("ArdourContextMenu");
 
-	if (!Profile->get_sae()) {
-		ops_items.push_back (MenuElem (_("Timecode"), sigc::bind (sigc::mem_fun(*this, &AudioClock::set_mode), Timecode)));
-	}
-	ops_items.push_back (MenuElem (_("Bars:Beats"), sigc::bind (sigc::mem_fun(*this, &AudioClock::set_mode), BBT)));
-	ops_items.push_back (MenuElem (_("Minutes:Seconds"), sigc::bind (sigc::mem_fun(*this, &AudioClock::set_mode), MinSec)));
-	ops_items.push_back (MenuElem (_("Samples"), sigc::bind (sigc::mem_fun(*this, &AudioClock::set_mode), Frames)));
+	ops_items.push_back (MenuElem (_("Timecode"), sigc::bind (sigc::mem_fun(*this, &AudioClock::set_mode), Timecode, false)));
+	ops_items.push_back (MenuElem (_("Bars:Beats"), sigc::bind (sigc::mem_fun(*this, &AudioClock::set_mode), BBT, false)));
+	ops_items.push_back (MenuElem (_("Minutes:Seconds"), sigc::bind (sigc::mem_fun(*this, &AudioClock::set_mode), MinSec, false)));
+	ops_items.push_back (MenuElem (_("Samples"), sigc::bind (sigc::mem_fun(*this, &AudioClock::set_mode), Frames, false)));
 
 	if (editable && !_off && !is_duration && !_follows_playhead) {
 		ops_items.push_back (SeparatorElem());
@@ -2150,7 +2155,7 @@ AudioClock::locate ()
 }
 
 void
-AudioClock::set_mode (Mode m)
+AudioClock::set_mode (Mode m, bool noemit)
 {
 	if (_mode == m) {
 		return;
@@ -2224,11 +2229,11 @@ AudioClock::set_mode (Mode m)
 
 	set (last_when, true);
 
-        if (!is_transient) {
-                ModeChanged (); /* EMIT SIGNAL (the static one)*/
-        }
+	if (!is_transient && !noemit) {
+		ModeChanged (); /* EMIT SIGNAL (the static one)*/
+	}
 
-        mode_changed (); /* EMIT SIGNAL (the member one) */
+	mode_changed (); /* EMIT SIGNAL (the member one) */
 }
 
 void
diff --git a/gtk2_ardour/audio_clock.h b/gtk2_ardour/audio_clock.h
index 3790fa8..51cac85 100644
--- a/gtk2_ardour/audio_clock.h
+++ b/gtk2_ardour/audio_clock.h
@@ -41,7 +41,7 @@ namespace ARDOUR {
 
 class AudioClock : public CairoWidget, public ARDOUR::SessionHandlePtr
 {
-  public:
+	public:
 	enum Mode {
 		Timecode,
 		BBT,
@@ -67,9 +67,9 @@ class AudioClock : public CairoWidget, public ARDOUR::SessionHandlePtr
 	void set (framepos_t, bool force = false, ARDOUR::framecnt_t offset = 0);
 	void set_from_playhead ();
 	void locate ();
-	void set_mode (Mode);
+	void set_mode (Mode, bool noemit = false);
 	void set_bbt_reference (framepos_t);
-        void set_is_duration (bool);
+	void set_is_duration (bool);
 
 	void copy_text_to_clipboard () const;
 
@@ -78,7 +78,7 @@ class AudioClock : public CairoWidget, public ARDOUR::SessionHandlePtr
 	framepos_t current_time (framepos_t position = 0) const;
 	framepos_t current_duration (framepos_t position = 0) const;
 	void set_session (ARDOUR::Session *s);
-        void set_negative_allowed (bool yn);
+	void set_negative_allowed (bool yn);
 
 	/** Alter cairo scaling during rendering.
 	 *
@@ -97,7 +97,7 @@ class AudioClock : public CairoWidget, public ARDOUR::SessionHandlePtr
 	static sigc::signal<void> ModeChanged;
 	static std::vector<AudioClock*> clocks;
 
-  protected:
+	protected:
 	void render (cairo_t*, cairo_rectangle_t*);
 	bool get_is_duration () const { return is_duration; } ;
 
@@ -115,7 +115,7 @@ class AudioClock : public CairoWidget, public ARDOUR::SessionHandlePtr
 	double get_left_rect_width() const {
 	       return round (((get_width() - separator_height) * mode_based_info_ratio) + 0.5);
 	}
-  private:
+	private:
 	Mode             _mode;
 	std::string      _name;
 	bool              is_transient;
@@ -127,8 +127,8 @@ class AudioClock : public CairoWidget, public ARDOUR::SessionHandlePtr
 	bool             _off;
 	int              em_width;
 	bool             _edit_by_click_field;
-        bool             _negative_allowed;
-        bool             edit_is_negative;
+	bool             _negative_allowed;
+	bool             edit_is_negative;
 
 	Glib::RefPtr<Pango::Layout> _layout;
 	Glib::RefPtr<Pango::Layout> _left_layout;
@@ -143,7 +143,7 @@ class AudioClock : public CairoWidget, public ARDOUR::SessionHandlePtr
 
 	int first_height;
 	int first_width;
-        bool style_resets_first;
+	bool style_resets_first;
 	int layout_height;
 	int layout_width;
 	int info_height;
@@ -213,7 +213,7 @@ class AudioClock : public CairoWidget, public ARDOUR::SessionHandlePtr
 	void set_minsec (framepos_t, bool);
 	void set_frames (framepos_t, bool);
 
-        void set_clock_dimensions (Gtk::Requisition&);
+	void set_clock_dimensions (Gtk::Requisition&);
 
 	framepos_t get_frame_step (Field, framepos_t pos = 0, int dir = 1);
 
@@ -221,7 +221,7 @@ class AudioClock : public CairoWidget, public ARDOUR::SessionHandlePtr
 	bool bbt_validate_edit (const std::string&);
 	bool minsec_validate_edit (const std::string&);
 
-        framepos_t frames_from_timecode_string (const std::string&) const;
+	framepos_t frames_from_timecode_string (const std::string&) const;
 	framepos_t frames_from_bbt_string (framepos_t, const std::string&) const;
 	framepos_t frame_duration_from_bbt_string (framepos_t, const std::string&) const;
 	framepos_t frames_from_minsec_string (const std::string&) const;
@@ -229,6 +229,7 @@ class AudioClock : public CairoWidget, public ARDOUR::SessionHandlePtr
 
 	void session_configuration_changed (std::string);
 	void session_property_changed (const PBD::PropertyChange&);
+	void metric_position_changed ();
 
 	Field index_to_field () const;
 
diff --git a/gtk2_ardour/audio_region_editor.cc b/gtk2_ardour/audio_region_editor.cc
index 3446f58..15186f2 100644
--- a/gtk2_ardour/audio_region_editor.cc
+++ b/gtk2_ardour/audio_region_editor.cc
@@ -33,7 +33,7 @@
 #include "audio_region_view.h"
 #include "gui_thread.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 using namespace PBD;
@@ -43,7 +43,6 @@ using namespace Gtkmm2ext;
 static void *
 _peak_amplitude_thread (void* arg)
 {
-	SessionEvent::create_per_thread_pool ("peak amplitude events", 64);
 	static_cast<AudioRegionEditor*>(arg)->peak_amplitude_thread ();
 	return 0;
 }
@@ -52,11 +51,7 @@ AudioRegionEditor::AudioRegionEditor (Session* s, boost::shared_ptr<AudioRegion>
 	: RegionEditor (s, r)
 	, _audio_region (r)
 	, gain_adjustment(accurate_coefficient_to_dB(_audio_region->scale_amplitude()), -40.0, +40.0, 0.1, 1.0, 0)
-#ifdef PLATFORM_WINDOWS
-	, m_peak_sem ("peak_semaphore", 0)
-#else
 	, _peak_channel (false)
-#endif
 {
 
 	Gtk::HBox* b = Gtk::manage (new Gtk::HBox);
@@ -92,14 +87,17 @@ AudioRegionEditor::AudioRegionEditor (Session* s, boost::shared_ptr<AudioRegion>
 	_peak_amplitude.set_text (_("Calculating..."));
 
 	PeakAmplitudeFound.connect (_peak_amplitude_connection, invalidator (*this), boost::bind (&AudioRegionEditor::peak_amplitude_found, this, _1), gui_context ());
-	pthread_create_and_store (X_("peak-amplitude"), &_peak_amplitude_thread_handle, _peak_amplitude_thread, this);
+
+	char name[64];
+	snprintf (name, 64, "peak amplitude-%p", this);
+	pthread_create_and_store (name, &_peak_amplitude_thread_handle, _peak_amplitude_thread, this);
 	signal_peak_thread ();
 }
 
 AudioRegionEditor::~AudioRegionEditor ()
 {
 	void* v;
-	pthread_cancel_one (_peak_amplitude_thread_handle);
+	_peak_channel.deliver ('t');
 	pthread_join (_peak_amplitude_thread_handle, &v);
 }
 
@@ -138,30 +136,20 @@ AudioRegionEditor::gain_adjustment_changed ()
 void
 AudioRegionEditor::signal_peak_thread ()
 {
-#ifdef PLATFORM_WINDOWS
-	m_peak_sem.signal ();
-#else
 	_peak_channel.deliver ('c');
-#endif
-}
-
-void
-AudioRegionEditor::wait_for_signal ()
-{
-#ifdef PLATFORM_WINDOWS
-	m_peak_sem.wait ();
-#else
-	char msg;
-	_peak_channel.receive (msg);
-#endif
 }
 
 void
 AudioRegionEditor::peak_amplitude_thread ()
 {
 	while (1) {
+		char msg;
 		/* await instructions to run */
-		wait_for_signal ();
+		_peak_channel.receive (msg);
+
+		if (msg == 't') {
+			break;
+		}
 
 		/* compute peak amplitude and signal the fact */
 		PeakAmplitudeFound (accurate_coefficient_to_dB (_audio_region->maximum_amplitude ())); /* EMIT SIGNAL */
diff --git a/gtk2_ardour/audio_region_editor.h b/gtk2_ardour/audio_region_editor.h
index dd726bd..083a39d 100644
--- a/gtk2_ardour/audio_region_editor.h
+++ b/gtk2_ardour/audio_region_editor.h
@@ -36,11 +36,7 @@
 
 
 #include "pbd/signals.h"
-#ifdef PLATFORM_WINDOWS
-#include "pbd/semutils.h"
-#else
 #include "pbd/crossthread.h"
-#endif
 
 #include "audio_clock.h"
 #include "ardour_dialog.h"
@@ -78,16 +74,11 @@ class AudioRegionEditor : public RegionEditor
 	Gtk::Entry _peak_amplitude;
 
 	void signal_peak_thread ();
-	void wait_for_signal ();
 	pthread_t _peak_amplitude_thread_handle;
 	void peak_amplitude_found (double);
 	PBD::Signal1<void, double> PeakAmplitudeFound;
 	PBD::ScopedConnection _peak_amplitude_connection;
-#ifdef PLATFORM_WINDOWS
-	PBD::Semaphore m_peak_sem;
-#else
 	CrossThreadChannel _peak_channel;
-#endif
 };
 
 #endif /* __gtk_ardour_audio_region_edit_h__ */
diff --git a/gtk2_ardour/audio_region_view.cc b/gtk2_ardour/audio_region_view.cc
index 148f99f..a70dcaa 100644
--- a/gtk2_ardour/audio_region_view.cc
+++ b/gtk2_ardour/audio_region_view.cc
@@ -62,7 +62,7 @@
 #include "gui_thread.h"
 #include "ui_config.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 #define MUTED_ALPHA 48
 
@@ -232,25 +232,23 @@ AudioRegionView::init (bool wfd)
 
 	const string line_name = _region->name() + ":gain";
 
-	if (!Profile->get_sae()) {
-		gain_line.reset (new AudioRegionGainLine (line_name, *this, *group, audio_region()->envelope()));
-	}
+	gain_line.reset (new AudioRegionGainLine (line_name, *this, *group, audio_region()->envelope()));
 
 	update_envelope_visibility ();
 	gain_line->reset ();
 
-	set_height (trackview.current_height()); // XXX not correct for Layered mode, but set_height() will fix later.
+	/* streamview will call set_height() */
+	//set_height (trackview.current_height()); // XXX not correct for Layered mode, but set_height() will fix later.
 
 	region_muted ();
 	region_sync_changed ();
 
 	region_resized (ARDOUR::bounds_change);
+	/* region_resized sets ghost region duration */
 
-	for (vector<GhostRegion*>::iterator i = ghosts.begin(); i != ghosts.end(); ++i) {
-		(*i)->set_duration (_region->length() / samples_per_pixel);
-	}
+	/* region_locked is a synonym for region_renamed () which is called in region_muted() above */
+	//region_locked ();
 
-	region_locked ();
 	envelope_active_changed ();
 	fade_in_active_changed ();
 	fade_out_active_changed ();
@@ -277,15 +275,14 @@ AudioRegionView::init (bool wfd)
 
 	setup_waveform_visibility ();
 
-	pending_peak_data->raise_to_top ();
-
+	/* reset_width_dependent_items() does this:
 	if (frame_handle_start) {
 		frame_handle_start->raise_to_top ();
 	}
 	if (frame_handle_end) {
 		frame_handle_end->raise_to_top ();
 	}
-
+	*/
 	/* XXX sync mark drag? */
 }
 
@@ -434,12 +431,13 @@ AudioRegionView::region_resized (const PropertyChange& what_changed)
 			}
 		}
 
-		/* hide transient lines that extend beyond the region end */
-
+		/* hide transient lines that extend beyond the region */
 		list<std::pair<framepos_t, ArdourCanvas::Line*> >::iterator l;
+		framepos_t first = _region->first_frame();
+		framepos_t last = _region->last_frame();
 
 		for (l = feature_lines.begin(); l != feature_lines.end(); ++l) {
-			if (l->first > _region->length() - 1) {
+			if (l->first < first || l->first >= last) {
 				l->second->hide();
 			} else {
 				l->second->show();
@@ -451,6 +449,10 @@ AudioRegionView::region_resized (const PropertyChange& what_changed)
 void
 AudioRegionView::reset_width_dependent_items (double pixel_width)
 {
+	if (pixel_width == _width) {
+		return;
+	}
+
 	RegionView::reset_width_dependent_items(pixel_width);
 	assert(_pixel_width == pixel_width);
 
@@ -465,25 +467,34 @@ AudioRegionView::reset_width_dependent_items (double pixel_width)
 		if (end_xfade_rect)       { end_xfade_rect->set_outline (false); }
 	}
 
-	AnalysisFeatureList analysis_features = _region->transients();
-	AnalysisFeatureList::const_iterator i;
-
-	list<std::pair<framepos_t, ArdourCanvas::Line*> >::iterator l;
+	reset_fade_shapes ();
 
-	for (i = analysis_features.begin(), l = feature_lines.begin(); i != analysis_features.end() && l != feature_lines.end(); ++i, ++l) {
+	/* Update feature lines */
+	AnalysisFeatureList analysis_features;
+	_region->transients (analysis_features);
 
-		float x_pos = trackview.editor().sample_to_pixel (*i);
+	if (feature_lines.size () != analysis_features.size ()) {
+		cerr << "postponed freature line update.\n"; // XXX
+		// AudioRegionView::transients_changed () will pick up on this
+		return;
+	}
 
-		(*l).second->set (ArdourCanvas::Duple (x_pos, 2.0),
-				  ArdourCanvas::Duple (x_pos, _height - TimeAxisViewItem::NAME_HIGHLIGHT_SIZE - 1));
+	framepos_t position = _region->position();
 
+	AnalysisFeatureList::const_iterator i;
+	list<std::pair<framepos_t, ArdourCanvas::Line*> >::iterator l;
+	double y1;
+	if (_height >= NAME_HIGHLIGHT_THRESH) {
+		y1 = _height - TimeAxisViewItem::NAME_HIGHLIGHT_SIZE - 1;
+	} else {
+		y1 = _height - 1;
+	}
+	for (i = analysis_features.begin(), l = feature_lines.begin(); i != analysis_features.end() && l != feature_lines.end(); ++i, ++l) {
+		float x_pos = trackview.editor().sample_to_pixel ((*i) - position);
 		(*l).first = *i;
-
 		(*l).second->set (ArdourCanvas::Duple (x_pos, 2.0),
-				  ArdourCanvas::Duple (x_pos, _height - TimeAxisViewItem::NAME_HIGHLIGHT_SIZE - 1));
+				  ArdourCanvas::Duple (x_pos, y1));
 	}
-
-	reset_fade_shapes ();
 }
 
 void
@@ -523,6 +534,10 @@ AudioRegionView::setup_fade_handle_positions()
 void
 AudioRegionView::set_height (gdouble height)
 {
+	if (height == _height) {
+		return;
+	}
+
 	RegionView::set_height (height);
 	pending_peak_data->set_y1 (height);
 
@@ -560,20 +575,19 @@ AudioRegionView::set_height (gdouble height)
 
 	reset_fade_shapes ();
 
-	/* Update hights for any active feature lines */
+	/* Update heights for any feature lines */
+	framepos_t position = _region->position();
 	list<std::pair<framepos_t, ArdourCanvas::Line*> >::iterator l;
-
+	double y1;
+	if (_height >= NAME_HIGHLIGHT_THRESH) {
+		y1 = _height - TimeAxisViewItem::NAME_HIGHLIGHT_SIZE - 1;
+	} else {
+		y1 = _height - 1;
+	}
 	for (l = feature_lines.begin(); l != feature_lines.end(); ++l) {
-
-		float pos_x = trackview.editor().sample_to_pixel((*l).first);
-
-		if (height >= NAME_HIGHLIGHT_THRESH) {
-			(*l).second->set (ArdourCanvas::Duple (pos_x, 2.0),
-					  ArdourCanvas::Duple (pos_x, _height - TimeAxisViewItem::NAME_HIGHLIGHT_SIZE - 1));
-		} else {
-			(*l).second->set (ArdourCanvas::Duple (pos_x, 2.0),
-					  ArdourCanvas::Duple (pos_x, _height - 1));
-		}
+		float pos_x = trackview.editor().sample_to_pixel((*l).first - position);
+		(*l).second->set (ArdourCanvas::Duple (pos_x, 2.0),
+				ArdourCanvas::Duple (pos_x, y1));
 	}
 
 	if (name_text) {
@@ -1395,7 +1409,10 @@ GhostRegion*
 AudioRegionView::add_ghost (TimeAxisView& tv)
 {
 	RouteTimeAxisView* rtv = dynamic_cast<RouteTimeAxisView*>(&trackview);
-	assert(rtv);
+
+	if (!rtv) {
+		return 0;
+	}
 
 	double unit_position = _region->position () / samples_per_pixel;
 	AudioGhostRegion* ghost = new AudioGhostRegion (*this, tv, trackview, unit_position);
@@ -1606,6 +1623,11 @@ AudioRegionView::set_fade_visibility (bool yn)
 void
 AudioRegionView::update_coverage_frames (LayerDisplay d)
 {
+	if (d != Stacked) {
+		/* don't do coverage frames unless we're in stacked mode */
+		return;
+	}
+
 	RegionView::update_coverage_frames (d);
 
 	if (fade_in_handle)       { fade_in_handle->raise_to_top (); }
@@ -1628,15 +1650,26 @@ AudioRegionView::show_region_editor ()
 void
 AudioRegionView::transients_changed ()
 {
-	AnalysisFeatureList analysis_features = _region->transients();
+	AnalysisFeatureList analysis_features;
+	_region->transients (analysis_features);
+	framepos_t position = _region->position();
+	framepos_t first = _region->first_frame();
+	framepos_t last = _region->last_frame();
 
-	while (feature_lines.size() < analysis_features.size()) {
+	double y1;
+	if (_height >= NAME_HIGHLIGHT_THRESH) {
+		y1 = _height - TimeAxisViewItem::NAME_HIGHLIGHT_SIZE - 1;
+	} else {
+		y1 = _height - 1;
+	}
 
+	while (feature_lines.size() < analysis_features.size()) {
 		ArdourCanvas::Line* canvas_item = new ArdourCanvas::Line(group);
 		CANVAS_DEBUG_NAME (canvas_item, string_compose ("transient group for %1", region()->name()));
+		canvas_item->set_outline_color (UIConfiguration::instance().color ("zero line")); // also in Editor::leave_handler()
 
 		canvas_item->set (ArdourCanvas::Duple (-1.0, 2.0),
-				  ArdourCanvas::Duple (1.0, _height - TimeAxisViewItem::NAME_HIGHLIGHT_SIZE - 1));
+				  ArdourCanvas::Duple (1.0, y1));
 
 		canvas_item->raise_to_top ();
 		canvas_item->show ();
@@ -1659,15 +1692,21 @@ AudioRegionView::transients_changed ()
 	for (i = analysis_features.begin(), l = feature_lines.begin(); i != analysis_features.end() && l != feature_lines.end(); ++i, ++l) {
 
 		float *pos = new float;
-		*pos = trackview.editor().sample_to_pixel (*i);
+		*pos = trackview.editor().sample_to_pixel (*i - position);
 
 		(*l).second->set (
 			ArdourCanvas::Duple (*pos, 2.0),
-			ArdourCanvas::Duple (*pos, _height - TimeAxisViewItem::NAME_HIGHLIGHT_SIZE - 1)
+			ArdourCanvas::Duple (*pos, y1)
 			);
 
-		(*l).second->set_data ("position", pos);
+		(*l).second->set_data ("position", pos); // is this *modified* (drag?), if not use *i
 		(*l).first = *i;
+
+		if (l->first < first || l->first >= last) {
+			l->second->hide();
+		} else {
+			l->second->show();
+		}
 	}
 }
 
@@ -1684,28 +1723,27 @@ AudioRegionView::update_transient(float /*old_pos*/, float new_pos)
 		float* pos = (float*) (*l).second->get_data ("position");
 
 		if (rint(new_pos) == rint(*pos)) {
-
+				framepos_t position = _region->position();
 		    framepos_t old_frame = (*l).first;
-		    framepos_t new_frame = trackview.editor().pixel_to_sample (new_pos);
-
+		    framepos_t new_frame = trackview.editor().pixel_to_sample (new_pos) + position;
 		    _region->update_transient (old_frame, new_frame);
-
 		    break;
 		}
 	}
 }
 
 void
-AudioRegionView::remove_transient(float pos)
+AudioRegionView::remove_transient (float pos)
 {
-	/* Find frame at old pos, calulate new frame then update region transients*/
+	/* this is called from Editor::remove_transient () with pos == get_data ("position")
+	 * which is the item's x-coordinate inside the ARV.
+	 *
+	 * Find frame at old pos, calulate new frame then update region transients
+	 */
 	list<std::pair<framepos_t, ArdourCanvas::Line*> >::iterator l;
 
 	for (l = feature_lines.begin(); l != feature_lines.end(); ++l) {
-
-		/* Line has been updated in drag so we compare to new_pos */
 		float *line_pos = (float*) (*l).second->get_data ("position");
-
 		if (rint(pos) == rint(*line_pos)) {
 		    _region->remove_transient ((*l).first);
 		    break;
diff --git a/gtk2_ardour/audio_streamview.cc b/gtk2_ardour/audio_streamview.cc
index d078de7..c7adcfc 100644
--- a/gtk2_ardour/audio_streamview.cc
+++ b/gtk2_ardour/audio_streamview.cc
@@ -29,6 +29,7 @@
 #include "ardour/audioregion.h"
 #include "ardour/audiofilesource.h"
 #include "ardour/audio_track.h"
+#include "ardour/record_enable_control.h"
 #include "ardour/region_factory.h"
 #include "ardour/profile.h"
 #include "ardour/rc_configuration.h"
@@ -48,7 +49,7 @@
 #include "gui_thread.h"
 #include "ui_config.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
@@ -186,7 +187,7 @@ AudioStreamView::setup_rec_box ()
 
 		if (!rec_active &&
 		    _trackview.session()->record_status() == Session::Recording &&
-		    _trackview.track()->record_enabled()) {
+		    _trackview.track()->rec_enable_control()->get_value()) {
 			if (_trackview.audio_track()->mode() == Normal && UIConfiguration::instance().get_show_waveforms_while_recording() && rec_regions.size() == rec_rects.size()) {
 
 				/* add a new region, but don't bother if they set show-waveforms-while-recording mid-record */
@@ -240,7 +241,7 @@ AudioStreamView::setup_rec_box ()
 
 		} else if (rec_active &&
 			   (_trackview.session()->record_status() != Session::Recording ||
-			    !_trackview.track()->record_enabled())) {
+			    !_trackview.track()->rec_enable_control()->get_value())) {
 			screen_update_connection.disconnect();
 			rec_active = false;
 			rec_updating = false;
@@ -352,8 +353,9 @@ AudioStreamView::update_rec_regions (framepos_t start, framecnt_t cnt)
 				if (nlen != region->length()) {
 
 					region->suspend_property_changes ();
+					/* set non-musical position / length */
 					region->set_position (_trackview.track()->get_capture_start_frame(n));
-					region->set_length (nlen);
+					region->set_length (nlen, 0);
 					region->resume_property_changes ();
 
 					if (origlen == 1) {
@@ -380,7 +382,7 @@ AudioStreamView::update_rec_regions (framepos_t start, framecnt_t cnt)
 
 						region->suspend_property_changes ();
 						region->set_position (_trackview.track()->get_capture_start_frame(n));
-						region->set_length (nlen);
+						region->set_length (nlen, 0);
 						region->resume_property_changes ();
 
 						if (origlen == 1) {
@@ -465,11 +467,7 @@ AudioStreamView::color_handler ()
 
 	//case cAudioBusBase:
 	if (!_trackview.is_track()) {
-		if (Profile->get_sae() && _trackview.route()->is_master()) {
-			canvas_rect->set_fill_color (UIConfiguration::instance().color ("audio master bus base"));
-		} else {
-			canvas_rect->set_fill_color (UIConfiguration::instance().color_mod ("audio bus base", "audio bus base"));
-		}
+		canvas_rect->set_fill_color (UIConfiguration::instance().color_mod ("audio bus base", "audio bus base"));
 	}
 }
 
diff --git a/gtk2_ardour/audio_time_axis.cc b/gtk2_ardour/audio_time_axis.cc
index f59c4bc..4459afa 100644
--- a/gtk2_ardour/audio_time_axis.cc
+++ b/gtk2_ardour/audio_time_axis.cc
@@ -55,7 +55,7 @@
 #include "audio_streamview.h"
 #include "utils.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
@@ -65,7 +65,7 @@ using namespace Gtk;
 using namespace Editing;
 
 AudioTimeAxisView::AudioTimeAxisView (PublicEditor& ed, Session* sess, ArdourCanvas::Canvas& canvas)
-	: AxisView(sess)
+	: SessionHandlePtr (sess)
 	, RouteTimeAxisView(ed, sess, canvas)
 {
 }
@@ -307,7 +307,7 @@ AudioTimeAxisView::update_control_names ()
 		}
 	}
 
-	if (get_selected()) {
+	if (selected()) {
 		controls_ebox.set_name (controls_base_selected_name);
 		time_axis_frame.set_name (controls_base_selected_name);
 	} else {
diff --git a/gtk2_ardour/automation_controller.cc b/gtk2_ardour/automation_controller.cc
index 3ae1b21..03054fa 100644
--- a/gtk2_ardour/automation_controller.cc
+++ b/gtk2_ardour/automation_controller.cc
@@ -30,12 +30,13 @@
 #include "ardour/tempo.h"
 
 #include "ardour_button.h"
+#include "ardour_knob.h"
 #include "automation_controller.h"
 #include "gui_thread.h"
 #include "note_select_dialog.h"
 #include "timers.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 using namespace Gtk;
@@ -65,7 +66,8 @@ AutomationBarController::~AutomationBarController()
 
 AutomationController::AutomationController(boost::shared_ptr<Automatable>       printer,
                                            boost::shared_ptr<AutomationControl> ac,
-                                           Adjustment*                          adj)
+                                           Adjustment*                          adj,
+                                           bool                                 use_knob)
 	: _widget(NULL)
 	, _printer (printer)
 	, _controllable(ac)
@@ -88,7 +90,16 @@ AutomationController::AutomationController(boost::shared_ptr<Automatable>
 		but->set_controllable(ac);
 		but->signal_clicked.connect(
 			sigc::mem_fun(*this, &AutomationController::toggled));
+		const bool active = _adjustment->get_value() >= 0.5;
+		if (but->get_active() != active) {
+			but->set_active(active);
+		}
 		_widget = but;
+	} else if (use_knob) {
+		ArdourKnob* knob = manage (new ArdourKnob (ArdourKnob::default_elements, ArdourKnob::Detent));
+		knob->set_controllable (ac);
+		knob->set_name("processor control knob");
+		_widget = knob;
 	} else {
 		AutomationBarController* bar = manage(new AutomationBarController(_printer, ac, adj));
 
@@ -123,7 +134,8 @@ boost::shared_ptr<AutomationController>
 AutomationController::create(boost::shared_ptr<Automatable>       printer,
                              const Evoral::Parameter&             param,
                              const ParameterDescriptor&           desc,
-                             boost::shared_ptr<AutomationControl> ac)
+                             boost::shared_ptr<AutomationControl> ac,
+                             bool use_knob)
 {
 	const double lo        = ac->internal_to_interface(desc.lower);
 	const double up        = ac->internal_to_interface(desc.upper);
@@ -136,7 +148,7 @@ AutomationController::create(boost::shared_ptr<Automatable>       printer,
 
 	assert (ac);
 	assert(ac->parameter() == param);
-	return boost::shared_ptr<AutomationController>(new AutomationController(printer, ac, adjustment));
+	return boost::shared_ptr<AutomationController>(new AutomationController(printer, ac, adjustment, use_knob));
 }
 
 void
@@ -173,7 +185,6 @@ void
 AutomationController::start_touch()
 {
 	_controllable->start_touch (_controllable->session().transport_frame());
-	StartGesture.emit();  /* EMIT SIGNAL */
 }
 
 void
@@ -190,8 +201,9 @@ AutomationController::end_touch ()
 		}
 
 		_controllable->stop_touch (mark, when);
+	} else {
+		_controllable->stop_touch (false, _controllable->session().transport_frame());
 	}
-	StopGesture.emit();  /* EMIT SIGNAL */
 }
 
 void
@@ -261,7 +273,7 @@ AutomationController::set_freq_beats(double beats)
 	const ARDOUR::ParameterDescriptor& desc    = _controllable->desc();
 	const ARDOUR::Session&             session = _controllable->session();
 	const framepos_t                   pos     = session.transport_frame();
-	const ARDOUR::Tempo&               tempo   = session.tempo_map().tempo_at(pos);
+	const ARDOUR::Tempo&               tempo   = session.tempo_map().tempo_at_frame (pos);
 	const double                       bpm     = tempo.beats_per_minute();
 	const double                       bps     = bpm / 60.0;
 	const double                       freq    = bps / beats;
diff --git a/gtk2_ardour/automation_controller.h b/gtk2_ardour/automation_controller.h
index c5d64c1..4d58260 100644
--- a/gtk2_ardour/automation_controller.h
+++ b/gtk2_ardour/automation_controller.h
@@ -61,7 +61,8 @@ public:
 		boost::shared_ptr<ARDOUR::Automatable>       parent,
 		const Evoral::Parameter&                     param,
 		const ARDOUR::ParameterDescriptor&           desc,
-		boost::shared_ptr<ARDOUR::AutomationControl> ac);
+		boost::shared_ptr<ARDOUR::AutomationControl> ac,
+		bool                                         use_knob = false);
 
 	~AutomationController();
 
@@ -77,13 +78,11 @@ public:
 
 	void stop_updating ();
 
-	sigc::signal<void> StartGesture;
-	sigc::signal<void> StopGesture;
-
 private:
 	AutomationController (boost::shared_ptr<ARDOUR::Automatable>       printer,
 	                      boost::shared_ptr<ARDOUR::AutomationControl> ac,
-	                      Gtk::Adjustment*                             adj);
+	                      Gtk::Adjustment*                             adj,
+	                      bool                                         use_knob);
 
 	void start_touch();
 	void end_touch();
diff --git a/gtk2_ardour/automation_line.cc b/gtk2_ardour/automation_line.cc
index 2094d43..a422bf9 100644
--- a/gtk2_ardour/automation_line.cc
+++ b/gtk2_ardour/automation_line.cc
@@ -63,7 +63,7 @@
 #include "ardour/session.h"
 #include "ardour/value_as_string.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
@@ -86,6 +86,7 @@ AutomationLine::AutomationLine (const string&                              name,
 	, _parent_group (parent)
 	, _offset (0)
 	, _maximum_time (max_framepos)
+	, _fill (false)
 	, _desc (desc)
 {
 	if (converter) {
@@ -171,7 +172,7 @@ AutomationLine::update_visibility ()
 			}
 		} else if (_visible & SelectedControlPoints) {
 			for (vector<ControlPoint*>::iterator i = control_points.begin(); i != control_points.end(); ++i) {
-				if ((*i)->get_selected()) {
+				if ((*i)->selected()) {
 					(*i)->show ();
 				} else {
 					(*i)->hide ();
@@ -229,6 +230,11 @@ AutomationLine::set_height (guint32 h)
 			(*i)->set_size (bsz);
 		}
 
+		if (_fill) {
+			line->set_fill_y1 (_height);
+		} else {
+			line->set_fill_y1 (0);
+		}
 		reset ();
 	}
 }
@@ -238,6 +244,7 @@ AutomationLine::set_line_color (uint32_t color)
 {
 	_line_color = color;
 	line->set_outline_color (color);
+	line->set_fill_color ((color & 0xffff00) + 80); // XXX TODO configurable transparency
 }
 
 void
@@ -470,9 +477,9 @@ AutomationLine::start_drag_single (ControlPoint* cp, double x, float fraction)
 	_drag_points.clear ();
 	_drag_points.push_back (cp);
 
-	if (cp->get_selected ()) {
+	if (cp->selected ()) {
 		for (vector<ControlPoint*>::iterator i = control_points.begin(); i != control_points.end(); ++i) {
-			if (*i != cp && (*i)->get_selected()) {
+			if (*i != cp && (*i)->selected()) {
 				_drag_points.push_back (*i);
 			}
 		}
@@ -546,8 +553,8 @@ AutomationLine::ContiguousControlPoints::compute_x_bounds (PublicEditor& e)
 			before_x = line.nth (front()->view_index() - 1)->get_x();
 
 			const framepos_t pos = e.pixel_to_sample(before_x);
-			const Meter& meter = map.meter_at (pos);
-			const framecnt_t len = ceil (meter.frames_per_bar (map.tempo_at (pos), e.session()->frame_rate())
+			const Meter& meter = map.meter_at_frame (pos);
+			const framecnt_t len = ceil (meter.frames_per_bar (map.tempo_at_frame (pos), e.session()->frame_rate())
 					/ (Timecode::BBT_Time::ticks_per_beat * meter.divisions_per_bar()) );
 			const double one_tick_in_pixels = e.sample_to_pixel_unrounded (len);
 
@@ -562,8 +569,8 @@ AutomationLine::ContiguousControlPoints::compute_x_bounds (PublicEditor& e)
 			after_x = line.nth (back()->view_index() + 1)->get_x();
 
 			const framepos_t pos = e.pixel_to_sample(after_x);
-			const Meter& meter = map.meter_at (pos);
-			const framecnt_t len = ceil (meter.frames_per_bar (map.tempo_at (pos), e.session()->frame_rate())
+			const Meter& meter = map.meter_at_frame (pos);
+			const framecnt_t len = ceil (meter.frames_per_bar (map.tempo_at_frame (pos), e.session()->frame_rate())
 					/ (Timecode::BBT_Time::ticks_per_beat * meter.divisions_per_bar()));
 			const double one_tick_in_pixels = e.sample_to_pixel_unrounded (len);
 
diff --git a/gtk2_ardour/automation_line.h b/gtk2_ardour/automation_line.h
index 816cefe..d51e437 100644
--- a/gtk2_ardour/automation_line.h
+++ b/gtk2_ardour/automation_line.h
@@ -73,6 +73,7 @@ public:
 	void queue_reset ();
 	void reset ();
 	void clear ();
+	void set_fill (bool f) { _fill = f; } // owner needs to call set_height
 
 	void set_selected_points (PointSelection const &);
 	void get_selectables (ARDOUR::framepos_t, ARDOUR::framepos_t, double, double, std::list<Selectable*>&);
@@ -236,6 +237,8 @@ private:
 	/** maximum time that a point on this line can be at, relative to the position of its region or start of its track */
 	ARDOUR::framecnt_t _maximum_time;
 
+	bool _fill;
+
 	const ARDOUR::ParameterDescriptor _desc;
 
 	friend class AudioRegionGainLine;
diff --git a/gtk2_ardour/automation_region_view.cc b/gtk2_ardour/automation_region_view.cc
index f1f9d68..963fe63 100644
--- a/gtk2_ardour/automation_region_view.cc
+++ b/gtk2_ardour/automation_region_view.cc
@@ -38,7 +38,7 @@
 #include "public_editor.h"
 #include "ui_config.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 AutomationRegionView::AutomationRegionView (ArdourCanvas::Container*                  parent,
                                             AutomationTimeAxisView&                   time_axis,
diff --git a/gtk2_ardour/automation_streamview.cc b/gtk2_ardour/automation_streamview.cc
index be72459..8cb19c2 100644
--- a/gtk2_ardour/automation_streamview.cc
+++ b/gtk2_ardour/automation_streamview.cc
@@ -41,7 +41,7 @@
 #include "selection.h"
 #include "ui_config.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
diff --git a/gtk2_ardour/automation_time_axis.cc b/gtk2_ardour/automation_time_axis.cc
index cb2a3b4..e2b74da 100644
--- a/gtk2_ardour/automation_time_axis.cc
+++ b/gtk2_ardour/automation_time_axis.cc
@@ -52,7 +52,7 @@
 #include "item_counts.h"
 #include "ui_config.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
@@ -84,7 +84,7 @@ AutomationTimeAxisView::AutomationTimeAxisView (
 	const string & nom,
 	const string & nomparent
 	)
-	: AxisView (s)
+	: SessionHandlePtr (s)
 	, TimeAxisView (s, e, &parent, canvas)
 	, _route (r)
 	, _control (c)
@@ -173,7 +173,9 @@ AutomationTimeAxisView::AutomationTimeAxisView (
 	//name label isn't editable on an automation track; remove the tooltip
 	set_tooltip (name_label, X_(""));
 
-	/* repack the name label */
+	/* repack the name label, which TimeAxisView has already attached to
+	 * the controls_table
+	 */
 
 	if (name_label.get_parent()) {
 		name_label.get_parent()->remove (name_label);
@@ -186,7 +188,6 @@ AutomationTimeAxisView::AutomationTimeAxisView (
 
 	/* add the buttons */
 	controls_table.set_border_width (1);
-	controls_table.remove (name_hbox);
 	controls_table.attach (hide_button, 1, 2, 0, 1, Gtk::SHRINK, Gtk::SHRINK, 0, 0);
 	controls_table.attach (name_label,  2, 3, 1, 3, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND, 2, 0);
 	controls_table.attach (auto_button, 3, 4, 2, 3, Gtk::SHRINK, Gtk::SHRINK, 0, 0);
@@ -199,12 +200,12 @@ AutomationTimeAxisView::AutomationTimeAxisView (
 	// subscribe to route_active_changed, ...
 	if (rtv && rtv->is_audio_track()) {
 		blank0->set_name ("AudioTrackControlsBaseUnselected");
-	}
-	else if (rtv && rtv->is_midi_track()) {
+	} else if (rtv && rtv->is_midi_track()) {
 		blank0->set_name ("MidiTrackControlsBaseUnselected");
-	}
-	else {
+	} else if (rtv) {
 		blank0->set_name ("AudioBusControlsBaseUnselected");
+	} else {
+		blank0->set_name ("UnknownControlsBaseUnselected");
 	}
 	blank0->set_size_request (-1, -1);
 	blank1->set_size_request (1, 0);
@@ -269,6 +270,7 @@ AutomationTimeAxisView::AutomationTimeAxisView (
 			);
 
 		line->set_line_color (UIConfiguration::instance().color ("processor automation line"));
+		line->set_fill (true);
 		line->queue_reset ();
 		add_line (line);
 	}
@@ -656,7 +658,7 @@ AutomationTimeAxisView::add_automation_event (GdkEvent* event, framepos_t when,
 }
 
 bool
-AutomationTimeAxisView::paste (framepos_t pos, const Selection& selection, PasteContext& ctx)
+AutomationTimeAxisView::paste (framepos_t pos, const Selection& selection, PasteContext& ctx, const int32_t sub_num)
 {
 	if (_line) {
 		return paste_one (pos, ctx.count, ctx.times, selection, ctx.counts, ctx.greedy);
@@ -873,7 +875,7 @@ AutomationTimeAxisView::what_has_visible_automation (const boost::shared_ptr<Aut
 			const XMLNode* gui_node = ac->extra_xml ("GUI");
 
 			if (gui_node) {
-				const XMLProperty* prop = gui_node->property ("shown");
+				XMLProperty const * prop = gui_node->property ("shown");
 				if (prop) {
 					if (string_is_affirmative (prop->value())) {
 						visible.insert (i->first);
@@ -1037,3 +1039,21 @@ AutomationTimeAxisView::cut_copy_clear_one (AutomationLine& line, Selection& sel
 		}
 	}
 }
+
+PresentationInfo const &
+AutomationTimeAxisView::presentation_info () const
+{
+	return _route->presentation_info();
+}
+
+boost::shared_ptr<Stripable>
+AutomationTimeAxisView::stripable () const
+{
+	return _route;
+}
+
+Gdk::Color
+AutomationTimeAxisView::color () const
+{
+	return gdk_color_from_rgb (_route->presentation_info().color());
+}
diff --git a/gtk2_ardour/automation_time_axis.h b/gtk2_ardour/automation_time_axis.h
index aef1300..7852e21 100644
--- a/gtk2_ardour/automation_time_axis.h
+++ b/gtk2_ardour/automation_time_axis.h
@@ -72,6 +72,10 @@ class AutomationTimeAxisView : public TimeAxisView {
 	virtual void set_height (uint32_t, TrackHeightMode m = OnlySelf);
 	void set_samples_per_pixel (double);
 	std::string name() const { return _name; }
+	Gdk::Color color () const;
+
+	boost::shared_ptr<ARDOUR::Stripable> stripable() const;
+	ARDOUR::PresentationInfo const & presentation_info () const;
 
         void add_automation_event (GdkEvent *, framepos_t, double, bool with_guard_points);
 
@@ -93,7 +97,7 @@ class AutomationTimeAxisView : public TimeAxisView {
 	/* editing operations */
 
 	void cut_copy_clear (Selection&, Editing::CutCopyOp);
-	bool paste (ARDOUR::framepos_t, const Selection&, PasteContext&);
+	bool paste (ARDOUR::framepos_t, const Selection&, PasteContext&, const int32_t sub_num);
 
 	int  set_state (const XMLNode&, int version);
 
diff --git a/gtk2_ardour/axis_view.cc b/gtk2_ardour/axis_view.cc
index de4202d..016e579 100644
--- a/gtk2_ardour/axis_view.cc
+++ b/gtk2_ardour/axis_view.cc
@@ -37,7 +37,7 @@
 #include "gui_object.h"
 #include "axis_view.h"
 #include "utils.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace Gtk;
@@ -47,10 +47,8 @@ using namespace ARDOUR_UI_UTILS;
 
 list<Gdk::Color> AxisView::used_colors;
 
-AxisView::AxisView (ARDOUR::Session* sess)
-	: SessionHandlePtr (sess)
+AxisView::AxisView ()
 {
-	_selected = false;
 }
 
 AxisView::~AxisView()
@@ -99,3 +97,19 @@ AxisView::gui_object_state()
 {
 	return *ARDOUR_UI::instance()->gui_object_state;
 }
+
+void
+AxisView::set_selected (bool yn)
+{
+	if (selected() == yn) {
+		return;
+	}
+
+	Selectable::set_selected (yn);
+
+	boost::shared_ptr<Stripable> s = stripable ();
+
+	if (s) {
+		s->presentation_info().set_selected (yn);
+	}
+}
diff --git a/gtk2_ardour/axis_view.h b/gtk2_ardour/axis_view.h
index b47ca98..2a7c378 100644
--- a/gtk2_ardour/axis_view.h
+++ b/gtk2_ardour/axis_view.h
@@ -37,26 +37,26 @@
 
 namespace ARDOUR {
 	class Session;
+	class Stripable;
+	class PresentationInfo;
 }
 
 /**
- * AxisView defines the abstract base class for time-axis trackviews and routes.
+ * AxisView defines the abstract base class for horizontal and vertical
+ * presentations of Stripables.
  *
  */
-class AxisView : public virtual Selectable, public PBD::ScopedConnectionList, public ARDOUR::SessionHandlePtr
+class AxisView : public virtual PBD::ScopedConnectionList, public virtual ARDOUR::SessionHandlePtr, public virtual Selectable
 {
   public:
-	/** @return the track's own color */
-	Gdk::Color color () const { return _color; }
-
 	ARDOUR::Session* session() const { return _session; }
 
 	virtual std::string name() const = 0;
+	virtual Gdk::Color color() const = 0;
 
 	sigc::signal<void> Hiding;
 
-	void set_old_order_key (uint32_t ok) { _old_order_key = ok; }
-	uint32_t old_order_key() const { return _old_order_key; }
+	virtual boost::shared_ptr<ARDOUR::Stripable> stripable() const = 0;
 
 	virtual std::string state_id() const = 0;
 	/* for now, we always return properties in string form.
@@ -77,17 +77,14 @@ class AxisView : public virtual Selectable, public PBD::ScopedConnectionList, pu
 		property_hashtable.clear ();
 	}
 
-	bool marked_for_display () const;
+	void set_selected (bool yn);
+
+	virtual bool marked_for_display () const;
 	virtual bool set_marked_for_display (bool);
 
 	static GUIObjectState& gui_object_state();
 	void clear_property_cache() { property_hashtable.clear(); }
 
-  protected:
-
-	AxisView (ARDOUR::Session* sess);
-	virtual ~AxisView();
-
 	/**
 	 * Generate a new random TrackView color, unique from those colors already used.
 	 *
@@ -95,15 +92,15 @@ class AxisView : public virtual Selectable, public PBD::ScopedConnectionList, pu
 	 */
 	static Gdk::Color unique_random_color();
 
-	Gdk::Color _color;
+  protected:
+	AxisView ();
+	virtual ~AxisView();
 
 	static std::list<Gdk::Color> used_colors;
 
 	Gtk::Label name_label;
 
 	mutable boost::unordered_map<std::string, std::string> property_hashtable;
-	uint32_t _old_order_key;
 }; /* class AxisView */
 
 #endif /* __ardour_gtk_axis_view_h__ */
-
diff --git a/gtk2_ardour/big_clock_window.cc b/gtk2_ardour/big_clock_window.cc
index e442c54..3d85e46 100644
--- a/gtk2_ardour/big_clock_window.cc
+++ b/gtk2_ardour/big_clock_window.cc
@@ -27,7 +27,7 @@
 #include "public_editor.h"
 #include "utils.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using std::min;
 using std::string;
@@ -55,8 +55,7 @@ void
 BigClockWindow::on_unmap ()
 {
 	ArdourWindow::on_unmap ();
-
-	PublicEditor::instance().reset_focus ();
+	PublicEditor::instance().reset_focus (&clock);
 }
 
 bool
diff --git a/gtk2_ardour/bundle_env_cocoa.cc b/gtk2_ardour/bundle_env_cocoa.cc
index df951b8..d630574 100644
--- a/gtk2_ardour/bundle_env_cocoa.cc
+++ b/gtk2_ardour/bundle_env_cocoa.cc
@@ -38,8 +38,9 @@
 
 #include "bundle_env.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
+#include <asl.h>
 #include <Carbon/Carbon.h>
 #include <mach-o/dyld.h>
 #include <sys/param.h>
@@ -50,8 +51,35 @@ using namespace std;
 
 extern void set_language_preference (); // cocoacarbon.mm
 
+static void
+setup_logging(void)
+{
+        /* The ASL API has evolved since it was introduced in 10.4. If ASL_LOG_DESCRIPTOR_WRITE is not available,
+           then we're not interested in doing any of this, since its only purpose is to get stderr/stdout to
+           appear in the Console.
+        */
+#ifdef ASL_LOG_DESCRIPTOR_WRITE
+        aslmsg msg;
+        aslclient c = asl_open (PROGRAM_NAME, "com.apple.console", 0);
+
+        msg = asl_new(ASL_TYPE_MSG);
+        asl_set(msg, ASL_KEY_FACILITY, "com.apple.console");
+        asl_set(msg, ASL_KEY_LEVEL, ASL_STRING_NOTICE);
+        asl_set(msg, ASL_KEY_READ_UID, "-1");
+
+        int fd = dup(2);
+        //asl_set_filter(c, ASL_FILTER_MASK_UPTO(ASL_LEVEL_DEBUG));
+        asl_add_log_file(c, fd);
+        asl_log(c, NULL, ASL_LEVEL_INFO, string_compose ("Hello world from %1", PROGRAM_NAME).c_str());
+        asl_log_descriptor(c, msg, ASL_LEVEL_INFO, 1,  ASL_LOG_DESCRIPTOR_WRITE);
+        asl_log_descriptor(c, msg, ASL_LEVEL_INFO, 2, ASL_LOG_DESCRIPTOR_WRITE);
+#else
+#warning This build host has an older ASL API, so no console logging in this build.
+#endif
+}
+
 void
-fixup_bundle_environment (int, char* [], string & localedir)
+fixup_bundle_environment (int argc, char* argv[], string & localedir)
 {
 	if (!g_getenv ("ARDOUR_BUNDLED")) {
 		return;
@@ -61,6 +89,8 @@ fixup_bundle_environment (int, char* [], string & localedir)
 
 	set_language_preference ();
 
+        setup_logging ();
+
 	char execpath[MAXPATHLEN+1];
 	uint32_t pathsz = sizeof (execpath);
 
diff --git a/gtk2_ardour/bundle_env_linux.cc b/gtk2_ardour/bundle_env_linux.cc
index 2586ad5..8083096 100644
--- a/gtk2_ardour/bundle_env_linux.cc
+++ b/gtk2_ardour/bundle_env_linux.cc
@@ -36,9 +36,10 @@
 #include "pbd/pathexpand.h"
 #include "pbd/file_utils.h"
 
+#include "ardour_http.h"
 #include "bundle_env.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace PBD;
 using namespace ARDOUR;
@@ -110,11 +111,12 @@ fixup_bundle_environment (int /*argc*/, char* argv[], string & localedir)
 		error << _("No fontconfig file found on your system. Things may looked very odd or ugly") << endmsg;
 	}
 
-        /* this doesn't do much but setting it should prevent various parts of the GTK/GNU stack
-           from looking outside the bundle to find the charset.alias file.
-        */
-        g_setenv ("CHARSETALIASDIR", dir_path.c_str(), 1);
+	/* this doesn't do much but setting it should prevent various parts of the GTK/GNU stack
+		 from looking outside the bundle to find the charset.alias file.
+		 */
+	g_setenv ("CHARSETALIASDIR", dir_path.c_str(), 1);
 
+	ArdourCurl::HttpGet::setup_certificate_paths ();
 }
 
 void
diff --git a/gtk2_ardour/bundle_env_mingw.cc b/gtk2_ardour/bundle_env_mingw.cc
index c2547be..6ee1e0f 100644
--- a/gtk2_ardour/bundle_env_mingw.cc
+++ b/gtk2_ardour/bundle_env_mingw.cc
@@ -20,7 +20,7 @@
 #include <stdlib.h>
 #include <string>
 #include "bundle_env.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 #include <glibmm.h>
 #include <fontconfig/fontconfig.h>
diff --git a/gtk2_ardour/bundle_env_msvc.cc b/gtk2_ardour/bundle_env_msvc.cc
index 864f9d8..9932a19 100644
--- a/gtk2_ardour/bundle_env_msvc.cc
+++ b/gtk2_ardour/bundle_env_msvc.cc
@@ -18,7 +18,7 @@
 */
 
 #include "bundle_env.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 #include <shlobj.h>
 #include <stdlib.h>
@@ -386,21 +386,6 @@ fixup_bundle_environment (int argc, char* argv[], string & localedir)
 	Glib::setenv ("ARDOUR_CONFIG_PATH", path, true);
 
 
-	// Next, set up 'ARDOUR_PATH'
-	path  = user_config_directory();
-	path  = Glib::path_get_dirname (path);
-	path += G_SEARCHPATH_SEPARATOR;
-	path += windows_search_path().to_string();
-	path += "\\icons;";
-	path += windows_search_path().to_string();
-	path += "\\pixmaps;";
-	path += ardour_data_search_path().to_string();  // In fact, adds both the 'data' search
-	path += G_SEARCHPATH_SEPARATOR;                 // path and our 'config' search path
-	path += dir_path;
-	path += "\\etc";
-	Glib::setenv ("ARDOUR_PATH", path, true);
-
-
 	// Next, set up 'ARDOUR_INSTANT_XML_PATH'
 	path = user_config_directory();
 	Glib::setenv ("ARDOUR_INSTANT_XML_PATH", path, true);
diff --git a/gtk2_ardour/bundle_manager.cc b/gtk2_ardour/bundle_manager.cc
index 8302e6d..234a603 100644
--- a/gtk2_ardour/bundle_manager.cc
+++ b/gtk2_ardour/bundle_manager.cc
@@ -29,7 +29,7 @@
 #include "ardour/user_bundle.h"
 #include "bundle_manager.h"
 #include "gui_thread.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
 #include "utils.h"
 
 using namespace std;
diff --git a/gtk2_ardour/clearlooks.rc.in b/gtk2_ardour/clearlooks.rc.in
index a8c94fb..4e598d5 100644
--- a/gtk2_ardour/clearlooks.rc.in
+++ b/gtk2_ardour/clearlooks.rc.in
@@ -11,7 +11,7 @@ style "default" = "medium_text"
   GtkTreeView         :: focus-line-width                 = 0
   GtkTreeView         :: tree-line-width                  = 1
   GtkTreeView         :: row-ending-details               = 0
-  
+
   GtkWidget           :: focus-line-pattern               = "\001\001"        #                              Dash pattern used to draw the focus indicator.
   GtkWidget           :: focus-line-width                 = 1                 # [               1 ] ( >= 0 ) Width, in pixels, of the focus indicator line.
   GtkWidget           :: focus-padding                    = 1                 # [               1 ] ( >= 0 ) Width, in pixels, between focus indicator and the widget box.
@@ -20,12 +20,12 @@ style "default" = "medium_text"
   GtkWidget           :: scroll-arrow-vlength             = 16                # [              16 ] ( >= 1 ) Length of vertical scroll arrows.
   GtkWidget           :: link-color                       = shade(1.25, @bright_color)
   GtkWidget           :: visited-link-color               = @bright_color
-  
+
   GtkDialog           :: action-area-border               = 4                 # [               5 ] ( >= 0 ) Width of border around the button area at the bottom of the dialog.
   GtkDialog           :: button-spacing                   = 4                 # [               6 ] ( >= 0 ) Spacing between buttons.
   GtkDialog           :: content-area-border              = 2                 # [               2 ] ( >= 0 ) Width of border around the main dialog area.
   GtkDialog           :: content-area-spacing             = 0                 # [               0 ] ( >= 0 ) The default spacing used between elements of the content area of the dialog.
-  
+
 
   GtkButton           :: default-border = { 0, 0, 0, 0 }
   GtkButton           :: default-outside_border = { 0, 0, 0, 0 }
@@ -50,7 +50,7 @@ style "default" = "medium_text"
   GtkPaned            :: handle-size                      = 4                 # [               5 ] ( >= 0 ) Width of handle.
 
   GtkScale            :: activate-slider                  = 1                 # [               0 ] ( bool ) With this option set to TRUE, sliders will be drawn ACTIVE and with shadow IN while they are dragged.
-  GtkScale            :: slider-length                    = 23                # [              31 ] ( >= 0 ) Length of scale's slider.	
+  GtkScale            :: slider-length                    = 23                # [              31 ] ( >= 0 ) Length of scale's slider.
   GtkScale            :: slider-width                     = 14                # [              14 ] ( >= 0 ) Width of scrollbar or scale thumb.
   GtkScale            :: trough-side-details              = 1                 # [               0 ] ( bool ) When TRUE, the parts of the trough on the two sides of the slider are drawn with different details.
 
@@ -58,10 +58,10 @@ style "default" = "medium_text"
   GtkScrollbar        :: arrow-scaling                    = 0.4               # [             0.5 ] ( 0.1  ) The arrow size proportion relative to the scroll button size.
   GtkScrollbar        :: fixed-slider-length              = 0                 # [               0 ] ( bool ) Don't change slider size, just lock it to the minimum length.
   GtkScrollbar        :: min-slider-length                = 50                # [              21 ] ( >= 0 ) Minimum length of scrollbar slider.
-  GtkScrollbar        :: slider-width                     = 15                # [              14 ] ( >= 0 ) Width of scrollbar or scale thumb.    
+  GtkScrollbar        :: slider-width                     = 15                # [              14 ] ( >= 0 ) Width of scrollbar or scale thumb.
   GtkScrollbar        :: stepper-spacing                  = 0                 # [               0 ] ( >= 0 ) The spacing between the stepper buttons and thumb. Note that setting this value to anything > 0 will automatically set the trough-under-steppers style property to TRUE as well. Also, stepper-spacing won't have any effect if there are no steppers.
   GtkScrollbar        :: trough-border                    = 0                 # [               1 ] ( >= 0 ) Spacing between thumb/steppers and outer trough bevel.
-  GtkScrollbar        :: trough-side-details              = 0                 # [               0 ] ( bool ) When TRUE, the parts of the trough on the two sides of the slider are drawn with different details.    
+  GtkScrollbar        :: trough-side-details              = 0                 # [               0 ] ( bool ) When TRUE, the parts of the trough on the two sides of the slider are drawn with different details.
   GtkScrollbar        :: trough-under-steppers            = 1                 # [               1 ] ( bool ) Whether to draw the trough across the full length of the range or to exclude the steppers and their spacing. Note that setting the "stepper-spacing" style property to any value > 0 will automatically enable trough-under-steppers too.
 
   GtkScrollbar        :: has-backward-stepper             = 1                 # [               1 ] ( bool ) Display the standard backward arrow button.
@@ -76,7 +76,7 @@ style "default" = "medium_text"
 
 #Menu Properties
   GtkMenuBar          :: internal-padding                 = 1                 # [               1 ] ( >= 0 ) Amount of border space between the menubar shadow and the menu items.
-  GtkMenuBar          :: shadow-type                      = GTK_SHADOW_OUT    # [  GTK_SHADOW_OUT ]          Style of bevel around the menubar. 
+  GtkMenuBar          :: shadow-type                      = GTK_SHADOW_OUT    # [  GTK_SHADOW_OUT ]          Style of bevel around the menubar.
 
   GtkMenu             :: arrow-placement                  = GTK_ARROWS_BOTH   # [ GTK_ARROWS_BOTH ]          Indicates where scroll arrows should be placed.
   GtkMenu             :: arrow-scaling                    = 0.5               # [             0.7 ] ( 0.1  ) Arbitrary constant to scale down the size of the scroll arrow.
@@ -103,15 +103,9 @@ style "default" = "medium_text"
   GtkTreeView         :: horizontal-separator             = 8                 # [               2 ] ( >= 0 ) Horizontal space between cells. Must be an even number.
   GtkTreeView         :: vertical-separator               = 2                 # [               2 ] ( >= 0 ) Vertical space between cells. Must be an even number.
 
-  GtkEntry            :: honors-transparent-bg-hint       = 1                 # [               0 ] ( bool ) (Clearlooks) Without this, gecko will fill in the background of the entry.
-  GtkEntry            :: cursor-color = @bg_selected
-
-  #GtkToolbar::shadow_type = GTK_SHADOW_ETCHED_IN
-
-  #xthickness = 0
-  #ythickness = 0
-
-#Base Colors
+  GtkEntry::cursor_color = @entry_cursor
+  GtkEntry::state-hint = 0
+  
   bg[NORMAL]          = @background
   bg[PRELIGHT]        = shade(1.1, @background)
   bg[ACTIVE]          = shade(0.9, @background)
@@ -124,33 +118,95 @@ style "default" = "medium_text"
   fg[INSENSITIVE]     = shade(0.7, @background)
   fg[SELECTED]        = @fg_selected
 
+  # These base and text colors will be used by treeviews and some other widgets.
+
   base[NORMAL]        = @bases
   base[PRELIGHT]      = @bases
   base[INSENSITIVE]   = shade(1.0, @background)
-  base[ACTIVE]        = shade(0.9, @bg_selected)
-  base[SELECTED]      = @bg_selected
+  base[ACTIVE]        = shade(0.9, @bg_selected) /* base for focused, selected text */
+  base[SELECTED]      = @bg_selected /* base for non-focused, selected text */
 
   text[NORMAL]        = @texts
   text[PRELIGHT]      = @texts
   text[ACTIVE]        = @fg_selected
-  text[INSENSITIVE]   = shade(0.7, @lightest)
-  text[SELECTED]      = @fg_selected
+  text[INSENSITIVE]   = shade(0.7, @lightest) /* text color for focused selected text */
+  text[SELECTED]      = @fg_selected          /* text color for non-focused selected text */
 
-#engine specific tweaks
+  #engine specific tweaks
 
-  engine "clearlooks" 
+  engine "clearlooks"
   {
-    #style              = GLOSSY
-    #colorize_scrollbar = TRUE
     menubarstyle       = 2 # 0 = flat, 1 = sunken, 2 = flat gradient
-    #toolbarstyle       = 0 # 0 = flat, 1 = enable effects
   }
 }
 
+style "entry"
+{
+  GtkEntry::cursor_color = @entry_cursor
+  GtkEntry::inner-border = { 2, 2, 2, 2 }
+
+  xthickness = 0
+  ythickness = 0
+
+  # special base + text for GtkEntry to aid with visibility during text entry
+
+  base[NORMAL]      = @bases
+  base[PRELIGHT]    = @bases
+  base[INSENSITIVE] = @bases
+  base[ACTIVE]      = @bases
+  base[SELECTED]    = @bg_selected
+
+  text[NORMAL]      = @texts
+  text[PRELIGHT]    = @texts
+  text[INSENSITIVE] = shade (0.92, @texts)
+  text[ACTIVE]      = @texts
+  text[SELECTED]    = @fg_selected
+}
+
+style "spin_button" = "entry"
+{
+  engine "clearlooks"
+  {
+	# without this empty declaration, SpinButtons draw their arrows oddly
+  }
+
+}
+
+style "mixer_strip_entry" = "small_text"
+{
+        xthickness = 3
+        ythickness = 3
+
+	bg[NORMAL] = @bases
+	bg[ACTIVE] = @bases
+	bg[SELECTED] = @bases
+
+	text[NORMAL] = @texts
+	text[ACTIVE] = @texts
+	text[SELECTED] = @texts
+
+	base[NORMAL] = @bases
+	base[ACTIVE] = @bases
+	base[SELECTED] = @bases
+}
+
+style "peak_display_peaked_entry" = "mixer_strip_entry"
+{
+	fg[ACTIVE] = @texts
+	fg[SELECTED] = @texts
+	text[SELECTED] = @texts
+
+	base[NORMAL] = @bright_indicator
+	base[ACTIVE] = @bright_indicator
+	base[PRELIGHT] = @bright_indicator
+	base[INSENSITIVE] = @bright_indicator
+	base[SELECTED] = @bright_indicator
+}
+
 style "treeview_parent_node"
 {
 	# specifies *just* the color used for whole file rows when not selected
-	
+
 	fg[NORMAL] = { 0.0, 0.6, 0.85 }
 }
 
@@ -159,7 +215,7 @@ style "treeview_display" = "small_bold_text"
 	GtkWidget::focus-line-width = 0
 
 	# expander arrow border and DnD "icon" text
-	fg[NORMAL] = { 0.8, 0.8, 0.8 } 
+	fg[NORMAL] = { 0.8, 0.8, 0.8 }
 
 	bg[NORMAL] = { 0.8, 0.8, 0.8 }
 
@@ -168,7 +224,7 @@ style "treeview_display" = "small_bold_text"
 	base[NORMAL] = { 0.20, 0.20, 0.25 }
 
 	# selected row bg when window does not have focus (including during DnD)
-	base[ACTIVE] = { 0.0, 0.75, 0.75 }    
+	base[ACTIVE] = { 0.0, 0.75, 0.75 }
 
 	# selected row bg when window has focus
 	base[SELECTED] = { 0, 0.75, 0.75 }
@@ -177,14 +233,14 @@ style "treeview_display" = "small_bold_text"
 	text[NORMAL] = { 0.80, 0.80, 0.80 }
 
 	# selected row text with window focus
-	text[SELECTED] = { 1.0, 1.0, 1.0 }  
+	text[SELECTED] = { 1.0, 1.0, 1.0 }
 
 	# selected row text without window focus (including during DnD)
-	text[ACTIVE] = { 1.0, 1.0, 1.0 }  
+	text[ACTIVE] = { 1.0, 1.0, 1.0 }
 }
 
 style "track_header_inactive"  = "larger_text"
-{     
+{
         bg[NORMAL] =      @track_header_inactive
 	bg[ACTIVE] =      @track_header_inactive
 	bg[INSENSITIVE] = @track_header_inactive
@@ -213,27 +269,27 @@ style "automation_track_header"
 
 style "inspector_processor_list" = "processor_list"
 {
- 	base[SELECTED] = { 0.3, 0.3, 0.3 }
+	base[SELECTED] = { 0.3, 0.3, 0.3 }
 }
 
-style "time_info_box" 
+style "time_info_box"
 {
         bg[NORMAL] = { 0.05, 0.05, 0.05 }
 }
 
-style "status_bar_box" 
+style "status_bar_box"
 {
         bg[NORMAL] = { 0.149, 0.149, 0.149 }
 }
 
 style "very_small_text"
 {
- 	font_name = "@FONT_SMALLER@"
+	font_name = "@FONT_SMALLER@"
 }
 
 style "small_text"
 {
- 	font_name = "@FONT_SMALL@"
+	font_name = "@FONT_SMALL@"
 }
 
 style "small_clock"
@@ -248,17 +304,17 @@ style "small_italic_text"
 
 style "small_bold_text"
 {
- 	font_name = "bold @FONT_SMALL@"
+	font_name = "bold @FONT_SMALL@"
 }
 
 style "medium_bold_text"
 {
- 	font_name = "bold @FONT_NORMAL@"
+	font_name = "bold @FONT_NORMAL@"
 }
 
 style "medium_text"
 {
- 	font_name = "@FONT_NORMAL@"
+	font_name = "@FONT_NORMAL@"
 }
 
 style "medium_monospace_text"
@@ -267,7 +323,7 @@ style "medium_monospace_text"
 }
 
 style "red_medium_text" = "medium_text"
-{	
+{
 	fg[NORMAL] = @bright_indicator
 	fg[ACTIVE] = @bright_indicator
 	fg[SELECTED] = @bright_indicator
@@ -275,7 +331,7 @@ style "red_medium_text" = "medium_text"
 
 style "large_bold_text"
 {
- 	font_name = "bold @FONT_LARGE@"
+	font_name = "bold @FONT_LARGE@"
 }
 
 style "big_text"
@@ -290,7 +346,7 @@ style "bigger_clock"
 
 style "larger_text"
 {
- 	font_name = "@FONT_LARGE@"
+	font_name = "@FONT_LARGE@"
 }
 
 style "massive_clock"
@@ -323,7 +379,7 @@ style "marker_text" = "small text"
 
 style "midi_tracer_textview" = "medium_monospace_text"
 {
-	
+
 }
 
 style "time_axis_view_item_name" = "very small text"
@@ -333,7 +389,7 @@ style "time_axis_view_item_name" = "very small text"
 
 style "midi_tracer_textview" = "medium_monospace_text"
 {
-	
+
 }
 
 style "time_axis_view_item_name" = "very small text"
@@ -624,7 +680,7 @@ style "medium_bold_entry"  = "medium_bold_text"
 	fg[NORMAL] = @texts
 	fg[ACTIVE] = @contrasting_indicator
 	fg[SELECTED] = @fg_selected
-	
+
 	text[NORMAL] = @texts
 	text[ACTIVE] = @texts
 	text[SELECTED] = @fg_selected
@@ -632,31 +688,10 @@ style "medium_bold_entry"  = "medium_bold_text"
 	bg[NORMAL] = @bases
 	bg[SELECTED] = @bases
 	bg[SELECTED] = @bases
-	
-	base[NORMAL] = @bases
-	base[ACTIVE] = @bases
-	base[SELECTED] = @bg_selected
-}
-
-style "small_entry" = "small_text"
-{
-	xthickness = 3
-	ythickness = 3
-	fg[NORMAL] = @texts
-	fg[ACTIVE] = @contrasting_indicator
-	fg[SELECTED] = @fg_selected
-
-	text[NORMAL] = @texts
-	text[ACTIVE] = @texts
-	text[SELECTED] = @texts
-
-	bg[NORMAL] = @bases
-	bg[ACTIVE] = @bases
-	bg[SELECTED] = @bases
 
 	base[NORMAL] = @bases
 	base[ACTIVE] = @bases
-	base[SELECTED] = @bases
+	base[SELECTED] = @bg_selected
 }
 
 style "small_spinner" = "small_text"
@@ -676,13 +711,6 @@ style "small_spinner" = "small_text"
 	base[SELECTED] = @background
 }
 
-style "red_active_small_entry" = "small_entry"
-{
-	fg[ACTIVE] = @texts
-	fg[SELECTED] = @texts
-	text[SELECTED] = @texts
-}
-
 style "small_red_on_black_entry"  = "small_bold_text"
 {
 	fg[NORMAL] = @bright_indicator
@@ -730,6 +758,21 @@ style "audio_track_base" = "default"
 	bg[SELECTED] = @background
 }
 
+style "control_master_base" = "default"
+{
+	font_name = " 8"
+	# NORMAL is used for single-data type labels, or Audio
+	# ACTIVE is used for MIDI in the presence of multiple data type
+	fg[NORMAL] = @foreground
+	fg[ACTIVE] = darker(@foreground)
+
+	bg[NORMAL] = @control_master
+	bg[ACTIVE] = @background
+	bg[PRELIGHT] = @background
+	bg[INSENSITIVE] = @background
+	bg[SELECTED] = @background
+}
+
 style "midi_track_base" = "default"
 {
 	font_name = " 8"
@@ -798,25 +841,10 @@ style "audio_bus_metrics_inactive" = "track_controls_inactive"
 	font_name = ""
 }
 
-style "track_name_display" = "medium_text"
+style "track_name_editor" = "medium_text"
 {
 	xthickness = 0
 	ythickness = 0
-	fg[NORMAL] = @foreground
-	fg[ACTIVE] = @foreground
-	fg[SELECTED] = @foreground
-
-	text[NORMAL] = @foreground
-	text[ACTIVE] = @foreground
-	text[SELECTED] = @foreground
-
-	base[NORMAL] = @bases
-	base[ACTIVE] = @bg_selected
-	base[SELECTED] = @bg_selected
-
-	bg[NORMAL] = lighter(@bases)
-	bg[ACTIVE] = lighter(@bases)
-	bg[SELECTED] = lighter(@bases)
 }
 
 style "track_separator"
@@ -914,19 +942,6 @@ style "paler_bright_when_active" = "medium_text"
 	bg[ACTIVE] = lighter(@bright_indicator)
 }
 
-style "peak_display_peaked_entry" = "small_entry"
-{
-	fg[ACTIVE] = @texts
-	fg[SELECTED] = @texts
-	text[SELECTED] = @texts
-
-	base[NORMAL] = @bright_indicator
-	base[ACTIVE] = @bright_indicator
-	base[PRELIGHT] = @bright_indicator
-	base[INSENSITIVE] = @bright_indicator
-	base[SELECTED] = @bright_indicator
-}
-
 style "selected_strip_frame"
 {
 	fg[NORMAL] = @bright_indicator
@@ -958,7 +973,7 @@ style "sync_alert"
 	bg[PRELIGHT] = @somewhat_bright_indicator
 	bg[SELECTED] = @somewhat_bright_indicator
 	bg[NORMAL] = @somewhat_bright_indicator
-	
+
 	fg[NORMAL] = @darkest
 	fg[PRELIGHT] = @darkest
 	fg[SELECTED] = @darkest
@@ -1019,7 +1034,23 @@ style "settings_notebook" = "big_text"
 {
 
 }
+
+style "pane"
+{
+      fg[NORMAL] = lighter(@background)
+      fg[SELECTED] = @foreground
+      fg[ACTIVE] = @somewhat_bright_indicator
+}
+
+style "vca_label_bar" = "medium_bold_text"
+{
+	bg[NORMAL] = @darkest
+	fg[NORMAL] = @lightest
+}
+
 class "GtkWidget" style:highest "default"
+class "GtkSpinButton" style:highest "spin_button"
+class "GtkEntry" style "entry"                          # not :highest to allow instances to override this
 class "GtkScrollbar" style:highest "ardour_adjusters"
 class "GtkLabel" style:highest "default_generic"
 class "GtkButton" style:highest "ardour_button"
@@ -1045,7 +1076,6 @@ widget "*MixerAutomationModeButton.*" style:highest "very_small_button"
 widget "*MixerAutomationPlaybackButton*" style:highest "very_small_button"
 widget "*MixerAutomationPlaybackButton.*" style:highest "very_small_button"
 widget "*ShuttleControl" style:highest "shuttle_control"
-#widget "*MainMenuBar" style:highest "menu_bar_base"
 widget "*ErrorMessage" style:highest "error_message"
 widget "*FatalMessage" style:highest "fatal_message"
 widget "*InfoMessage" style:highest "info_message"
@@ -1058,6 +1088,7 @@ widget "*transport clock" style:highest "bigger_clock"
 widget "*secondary clock" style:highest "bigger_clock"
 widget "*transport delta clock" style:highest "bigger_clock"
 widget "*secondary delta clock" style:highest "bigger_clock"
+widget "*stretch clock" style:highest "bigger_clock"
 widget "*silence duration clock" style:highest "medium_text"
 widget "*edit point clock" style:highest "medium_text"
 widget "*nudge clock" style:highest "small_clock"
@@ -1094,6 +1125,7 @@ widget "*AudioMidiTrackMetricsInactive" style:highest "midi_track_metrics_inacti
 widget "*TimeAxisViewControlsBaseUnselected" style:highest "audio_track_base"
 widget "*AudioTrackControlsBaseUnselected" style:highest "audio_track_base"
 widget "*MidiTrackControlsBaseUnselected" style:highest "midi_track_base"
+widget "*ControlMasterBaseUnselected" style:highest "control_master_base"
 
 widget "*SendUIFader" style:highest "plugin_slider"
 widget "*ReturnUIFader" style:highest "plugin_slider"
@@ -1104,8 +1136,8 @@ widget "*AudioBusFader" style:highest "audio_bus_fader"
 
 widget "*BusControlsBaseUnselected" style:highest "audio_bus_base"
 widget "*TrackSeparator" style:highest "track_separator"
-widget "*EditorTrackNameDisplay" style:highest "track_name_display"
-widget "*EditorTrackNameDisplay*" style:highest "track_name_display"
+widget "*TrackNameEditor" style:highest "track_name_editor"
+widget "*TrackNameEditor*" style:highest "track_name_editor"
 widget "*CrossfadeEditAuditionButton" style:highest "bright_when_active"
 widget "*CrossfadeEditAuditionButton*" style:highest "bright_when_active"
 widget "*CrossfadeEditCurveButton" style:highest "bright_when_active"
@@ -1121,8 +1153,6 @@ widget "*BusControlsBaseSelected" style:highest "track_header_selected"
 widget "*AutomationTrackControlsBase" style:highest "automation_track_header"
 widget "*AutomationTrackControlsBaseSelected" style:highest "track_header_selected"
 widget "*PluginParameterLabel" style:highest "medium_text"
-widget "*MotionControllerValue" style:highest "small_entry"
-widget "*MotionControllerValue*" style:highest "small_entry"
 widget "*ParameterValueDisplay" style:highest "medium_bold_entry"
 widget "*PluginUIClickBox" style:highest "medium_bold_entry"
 widget "*PluginUIClickBox*" style:highest "medium_bold_entry"
@@ -1134,11 +1164,9 @@ widget "*MixerTrackCommentArea" style:highest "option_entry"
 widget "*MixerPanZone" style:highest "pan_zone"
 widget "*RegionEditorLabel" style:highest "medium_text"
 widget "*RegionEditorEntry" style:highest "medium_entry"
-widget "*MixerStripGainDisplay" style:highest "small_entry"
-widget "*MixerStripGainDisplay*" style:highest "small_entry"
-widget "*MixerStripPeakDisplay" style:highest "red_active_small_entry"
-widget "*MixerStripPeakDisplay*" style:highest "red_active_small_entry"
-widget "*MixerStripPeakDisplayPeak*" style:highest "peak_display_peaked_entry"
+widget "*MixerStripGainDisplay" style:highest "mixer_strip_entry"
+widget "*MixerStripPeakDisplay" style:highest "mixer_strip_entry"
+widget "*MixerStripPeakDisplayPeak" style:highest "peak_display_peaked_entry"
 widget "*MixerStripSelectedFrame" style:highest "selected_strip_frame"
 widget "*MixerStripFrame" style:highest "base_frame"
 widget "*FadeCurve" style:highest "medium_bold_entry"
@@ -1152,6 +1180,7 @@ widget "*PluginSaveButton" style:highest "small_button"
 widget "*PluginSaveButton*" style:highest "small_button"
 widget "*PluginEditorButton*" style:highest "default_toggle_button"
 widget "*PluginEditorButton-active" style:highest "default_toggle_button_active"
+widget "*PluginAnalysisInfoLabel" style:highest "medium_monospace_text"
 
 widget "*BarControlSpinner" style:highest "small_spinner"
 widget "*BarControlSpinner*" style:highest "small_spinner"
@@ -1160,7 +1189,6 @@ widget "*BlackSeparator" style:highest "black_separator"
 
 widget "*MetricLabel" style:highest "medium_text"
 widget "*ChoiceWindow" style:highest "default_generic"
-widget "*TrackLabel" style:highest "medium_text"
 widget "*TrackParameterName" style:highest "small_italic_text"
 widget "*AddRouteDialog*" style:highest "medium_text"
 widget "*AddRouteDialogSpinner" style:highest "medium_bold_entry"
@@ -1169,6 +1197,7 @@ widget "*AddRouteDialogNameTemplateEntry" style:highest "medium_bold_entry"
 widget "*NewSessionSR1Label" style:highest "red_medium_text"
 widget "*NewSessionSR2Label" style:highest "medium_text"
 widget "*location edit row clock" style:highest "medium_text"
+widget "*ArdourLuaEntry" style:highest "medium_monospace_text"
 widget "*LocationEditNameLabel" style:highest "medium_text"
 widget "*LocationEditCdButton" style:highest "small_red_active_and_selected_button"
 widget "*LocationEditCdButton*" style:highest "small_red_active_and_selected_button"
@@ -1207,3 +1236,8 @@ widget "*processor fader" style:highest "processor"
 widget "*processor postfader" style:highest "processor"
 widget "*MonitorSectionLabel" style:highest "small_text"
 widget "*ooltip*" style:highest "tooltip"
+widget "*Pane" style:highest "pane"
+widget "*Pane.Divider" style:highest "pane"
+widget "*VCALabelBar" style:highest "vca_label_bar"
+widget "*VCALabelBar*" style:highest "vca_label_bar"
+
diff --git a/gtk2_ardour/cocoacarbon.mm b/gtk2_ardour/cocoacarbon.mm
index 6564843..592a55d 100644
--- a/gtk2_ardour/cocoacarbon.mm
+++ b/gtk2_ardour/cocoacarbon.mm
@@ -41,24 +41,6 @@
 using namespace std;
 using namespace PBD;
 
-void
-ARDOUR_UI::platform_specific ()
-{
-	gtk_application_ready ();
-
-	if (!ARDOUR_COMMAND_LINE::finder_invoked_ardour) {
-		
-		/* if invoked from the command line, make sure we're visible */
-		
-		[NSApp activateIgnoringOtherApps:1];
-	} 
-}
-
-void
-ARDOUR_UI::platform_setup ()
-{
-}
-
 bool
 cocoa_open_url (const char* uri)
 {
diff --git a/gtk2_ardour/color_theme_manager.cc b/gtk2_ardour/color_theme_manager.cc
new file mode 100644
index 0000000..be0278e
--- /dev/null
+++ b/gtk2_ardour/color_theme_manager.cc
@@ -0,0 +1,622 @@
+/*
+    Copyright (C) 2000-2016 Paul Davis
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#include <cmath>
+#include <errno.h>
+
+#include "fix_carbon.h"
+
+#include "pbd/gstdio_compat.h"
+
+#include "gtkmm2ext/cell_renderer_color_selector.h"
+#include "gtkmm2ext/utils.h"
+
+#include "pbd/compose.h"
+#include "pbd/file_utils.h"
+#include "pbd/replace_all.h"
+
+#include "ardour/filesystem_paths.h"
+#include "ardour/profile.h"
+
+#include "canvas/container.h"
+#include "canvas/rectangle.h"
+#include "canvas/scroll_group.h"
+#include "canvas/wave_view.h"
+
+#include "ardour_button.h"
+#include "ardour_dialog.h"
+#include "color_theme_manager.h"
+#include "rgb_macros.h"
+#include "ui_config.h"
+#include "utils.h"
+
+#include "pbd/i18n.h"
+
+using namespace std;
+using namespace Gtk;
+using namespace PBD;
+using namespace ARDOUR;
+using namespace ARDOUR_UI_UTILS;
+
+ColorThemeManager::ColorThemeManager ()
+	: reset_button (_("Restore Defaults"))
+	, palette_viewport (*palette_scroller.get_hadjustment(), *palette_scroller.get_vadjustment())
+	, palette_group (0)
+	, palette_window (0)
+	, color_theme_label (_("Color Theme"))
+{
+	set_spacing (12);
+
+	std::map<string,string> color_themes;
+
+	get_color_themes (color_themes);
+
+	if (color_themes.size() > 1) {
+		theme_list = TreeStore::create (color_theme_columns);
+
+		TreeModel::iterator selected_iter = theme_list->children().end();
+
+		for (std::map<string,string>::iterator c = color_themes.begin(); c != color_themes.end(); ++c) {
+			TreeModel::Row row;
+
+			row = *(theme_list->append());
+			row[color_theme_columns.name] = c->first;
+
+			string color_file_name = c->second;
+
+			row[color_theme_columns.path] = color_file_name;
+
+			/* match second (path; really basename) since that is
+			   what we store/restore.
+			*/
+
+			if (UIConfiguration::instance().get_color_file() == color_file_name) {
+				selected_iter = row;
+			}
+		}
+
+		color_theme_dropdown.set_model (theme_list);
+		color_theme_dropdown.pack_start (color_theme_columns.name);
+
+		if (selected_iter != theme_list->children().end()) {
+			color_theme_dropdown.set_active (selected_iter);
+		}
+
+		Gtk::HBox* hbox = Gtk::manage (new Gtk::HBox());
+		Gtk::Alignment* align = Gtk::manage (new Gtk::Alignment);
+		align->set (0, 0.5);
+		align->add (color_theme_dropdown);
+		hbox->set_spacing (6);
+		hbox->pack_start (color_theme_label, false, false);
+		hbox->pack_start (*align, true, true);
+		pack_start (*hbox, PACK_SHRINK);
+		hbox->show_all ();
+	}
+
+	reset_button.signal_clicked().connect (sigc::mem_fun (*this, &ColorThemeManager::reset_canvas_colors));
+
+	/* Now the alias list */
+
+	alias_list = TreeStore::create (alias_columns);
+	alias_display.set_model (alias_list);
+	alias_display.append_column (_("Object"), alias_columns.name);
+
+	Gtkmm2ext::CellRendererColorSelector* color_renderer = manage (new Gtkmm2ext::CellRendererColorSelector);
+	TreeViewColumn* color_column = manage (new TreeViewColumn (_("Color"), *color_renderer));
+	color_column->add_attribute (color_renderer->property_color(), alias_columns.color);
+	alias_display.append_column (*color_column);
+
+	alias_display.get_column (0)->set_data (X_("colnum"), GUINT_TO_POINTER(0));
+	alias_display.get_column (0)->set_expand (true);
+	alias_display.get_column (1)->set_data (X_("colnum"), GUINT_TO_POINTER(1));
+	alias_display.get_column (1)->set_expand (false);
+	alias_display.set_reorderable (false);
+	alias_display.set_headers_visible (true);
+
+	alias_display.signal_button_press_event().connect (sigc::mem_fun (*this, &ColorThemeManager::alias_button_press_event), false);
+
+	alias_scroller.add (alias_display);
+
+	palette_group = initialize_palette_canvas (*palette_viewport.canvas());
+	palette_viewport.signal_size_allocate().connect (sigc::bind (sigc::mem_fun (*this, &ColorThemeManager::palette_canvas_allocated), palette_group, palette_viewport.canvas(),
+	                                                             sigc::mem_fun (*this, &ColorThemeManager::palette_event)));
+	palette_scroller.add (palette_viewport);
+
+	modifier_scroller.add (modifier_vbox);
+
+	notebook.append_page (alias_scroller, _("Items"));
+	notebook.append_page (palette_scroller, _("Palette"));
+	notebook.append_page (modifier_scroller, _("Transparency"));
+
+	notebook.set_size_request (400, 400);
+
+	pack_start (notebook, true, true);
+	pack_start (reset_button, false, false);
+
+	color_dialog.get_colorsel()->set_has_opacity_control (true);
+	color_dialog.get_colorsel()->set_has_palette (true);
+	color_dialog.get_ok_button()->signal_clicked().connect (sigc::bind (sigc::mem_fun (color_dialog, &Gtk::Dialog::response), RESPONSE_ACCEPT));
+	color_dialog.get_cancel_button()->signal_clicked().connect (sigc::bind (sigc::mem_fun (color_dialog, &Gtk::Dialog::response), RESPONSE_CANCEL));
+
+	color_theme_dropdown.signal_changed().connect (sigc::mem_fun (*this, &ColorThemeManager::on_color_theme_changed));
+
+	/* no need to call setup_palette() here, it will be done when its size is allocated */
+	setup_aliases ();
+	setup_modifiers ();
+
+	UIConfiguration::instance().ColorsChanged.connect (sigc::mem_fun (*this, &ColorThemeManager::colors_changed));
+
+	show_all ();
+}
+
+void
+ColorThemeManager::setup_modifiers ()
+{
+	UIConfiguration* uic (&UIConfiguration::instance());
+	UIConfiguration::Modifiers& modifiers (uic->modifiers);
+	Gtk::HBox* mod_hbox;
+	Gtk::Label* mod_label;
+	Gtk::HScale* mod_scale;
+
+	Gtkmm2ext::container_clear (modifier_vbox);
+
+	for (UIConfiguration::Modifiers::const_iterator m = modifiers.begin(); m != modifiers.end(); ++m) {
+		mod_hbox = manage (new HBox);
+
+		mod_scale = manage (new HScale (0.0, 1.0, 0.01));
+		mod_scale->set_draw_value (false);
+		mod_scale->set_value (m->second.a());
+		mod_scale->set_update_policy (Gtk::UPDATE_DISCONTINUOUS);
+		mod_scale->signal_value_changed().connect (sigc::bind (sigc::mem_fun (*this, &ColorThemeManager::modifier_edited), mod_scale, m->first));
+
+		mod_label = manage (new Label (m->first));
+		mod_label->set_alignment (1.0, 0.5);
+		mod_label->set_size_request (150, -1); /* 150 pixels should be enough for anyone */
+
+		mod_hbox->pack_start (*mod_label, false, true, 12);
+		mod_hbox->pack_start (*mod_scale, true, true);
+
+		modifier_vbox.pack_start (*mod_hbox, false, false);
+	}
+
+	modifier_vbox.show_all ();
+
+}
+
+void
+ColorThemeManager::modifier_edited (Gtk::Range* range, string name)
+{
+	using namespace ArdourCanvas;
+
+	double alpha = range->get_value();
+	SVAModifier svam (SVAModifier::Assign, -1.0, -1.0, alpha);
+	UIConfiguration::instance().set_modifier (name, svam);
+}
+
+void
+ColorThemeManager::colors_changed ()
+{
+	setup_palette ();
+	setup_aliases ();
+	setup_modifiers ();
+}
+
+void
+ColorThemeManager::reset_canvas_colors()
+{
+	string cfile;
+	string basename;
+
+	/* look for a versioned user-owned color file, and try to rename it */
+
+	basename = UIConfiguration::instance().color_file_name (true, true);
+
+	if (find_file (ardour_config_search_path(), basename, cfile)) {
+		string backup = cfile + string (X_(".old"));
+		g_rename (cfile.c_str(), backup.c_str());
+		/* don't really care if it fails */
+	}
+
+	UIConfiguration::instance().load_color_theme (false);
+	UIConfiguration::instance().save_state ();
+}
+
+ArdourCanvas::Container*
+ColorThemeManager::initialize_palette_canvas (ArdourCanvas::Canvas& canvas)
+{
+	using namespace ArdourCanvas;
+
+	/* hide background */
+	canvas.set_background_color (rgba_to_color (0.0, 0.0, 1.0, 0.0));
+
+	/* bi-directional scroll group */
+
+	ScrollGroup* scroll_group = new ScrollGroup (canvas.root(), ScrollGroup::ScrollSensitivity (ScrollGroup::ScrollsVertically|ScrollGroup::ScrollsHorizontally));
+	canvas.add_scroller (*scroll_group);
+
+	/* new container to hold everything */
+
+	return new ArdourCanvas::Container (scroll_group);
+}
+
+void
+ColorThemeManager::palette_canvas_allocated (Gtk::Allocation& alloc, ArdourCanvas::Container* group, ArdourCanvas::Canvas* canvas, sigc::slot<bool,GdkEvent*,std::string> event_handler)
+{
+	build_palette_canvas (*canvas, *group, event_handler);
+}
+
+struct NamedColor {
+	string name;
+	ArdourCanvas::HSV    color;
+	NamedColor (string s, ArdourCanvas::HSV c) : name (s), color (c) {}
+};
+
+struct SortByHue {
+	bool operator() (NamedColor const & a, NamedColor const & b) {
+		using namespace ArdourCanvas;
+		const HSV black (0, 0, 0);
+		if (a.color.is_gray() || b.color.is_gray()) {
+			return black.distance (a.color) < black.distance (b.color);
+		} else {
+			return a.color.h < b.color.h;
+			// const HSV red (rgba_to_color (1.0, 0.0, 0.0, 1.0));
+			// return red.distance (a.color) < red.distance (b.color);
+		}
+	}
+};
+
+
+void
+ColorThemeManager::build_palette_canvas (ArdourCanvas::Canvas& canvas, ArdourCanvas::Container& group, sigc::slot<bool,GdkEvent*,std::string> event_handler)
+{
+	using namespace ArdourCanvas;
+
+	/* we want the colors sorted by hue, with their name */
+
+	UIConfiguration::Colors& colors (UIConfiguration::instance().colors);
+	vector<NamedColor> nc;
+	for (UIConfiguration::Colors::const_iterator x = colors.begin(); x != colors.end(); ++x) {
+		nc.push_back (NamedColor (x->first, HSV (x->second)));
+	}
+	SortByHue sorter;
+	sort (nc.begin(), nc.end(), sorter);
+
+	const uint32_t color_limit = nc.size();
+	const double box_size = 20.0;
+	const double width = canvas.width();
+	const double height = canvas.height();
+
+	uint32_t color_num = 0;
+
+	/* clear existing rects and delete them */
+
+	group.clear (true);
+
+	for (uint32_t y = 0; y < height - box_size && color_num < color_limit; y += box_size) {
+		for (uint32_t x = 0; x < width - box_size && color_num < color_limit; x += box_size) {
+			ArdourCanvas::Rectangle* r = new ArdourCanvas::Rectangle (&group, ArdourCanvas::Rect (x, y, x + box_size, y + box_size));
+
+			string name = nc[color_num++].name;
+
+			UIConfiguration::Colors::iterator c = colors.find (name);
+
+			if (c != colors.end()) {
+				Color color = c->second;
+				r->set_fill_color (color);
+				r->set_outline_color (rgba_to_color (0.0, 0.0, 0.0, 1.0));
+				r->set_tooltip (name);
+				r->Event.connect (sigc::bind (event_handler, name));
+			}
+		}
+	}
+}
+
+void
+ColorThemeManager::palette_size_request (Gtk::Requisition* req)
+{
+	uint32_t ncolors = UIConfiguration::instance().colors.size();
+	const int box_size = 20;
+
+	double c = sqrt ((double)ncolors);
+	req->width = (int) floor (c * box_size);
+	req->height = (int) floor (c * box_size);
+
+	/* add overflow row if necessary */
+
+	if (fmod (ncolors, c) != 0.0) {
+		req->height += box_size;
+	}
+}
+
+void
+ColorThemeManager::setup_palette ()
+{
+	build_palette_canvas (*palette_viewport.canvas(), *palette_group, sigc::mem_fun (*this, &ColorThemeManager::palette_event));
+}
+
+bool
+ColorThemeManager::palette_event (GdkEvent* ev, string name)
+{
+	switch (ev->type) {
+	case GDK_BUTTON_RELEASE:
+		edit_palette_color (name);
+		return true;
+	default:
+		break;
+	}
+	return true;
+}
+
+void
+ColorThemeManager::edit_palette_color (std::string name)
+{
+	using namespace ArdourCanvas;
+	double r,g, b, a;
+	UIConfiguration* uic (&UIConfiguration::instance());
+	ArdourCanvas::Color c = uic->color (name);
+	Gdk::Color gdkcolor;
+
+	color_to_rgba (c, r, g, b, a);
+
+	gdkcolor.set_rgb_p (r, g, b);
+	color_dialog.get_colorsel()->set_previous_color (gdkcolor);
+	color_dialog.get_colorsel()->set_current_color (gdkcolor);
+	color_dialog.get_colorsel()->set_previous_alpha ((guint16) (a * 65535));
+	color_dialog.get_colorsel()->set_current_alpha ((guint16) (a * 65535));
+
+	color_dialog_connection.disconnect ();
+	color_dialog_connection = color_dialog.signal_response().connect (sigc::bind (sigc::mem_fun (*this, &ColorThemeManager::palette_color_response), name));
+	color_dialog.present();
+}
+
+void
+ColorThemeManager::palette_color_response (int result, std::string name)
+{
+	using namespace ArdourCanvas;
+
+	color_dialog_connection.disconnect ();
+
+	UIConfiguration* uic (&UIConfiguration::instance());
+	Gdk::Color gdkcolor;
+	double r,g, b, a;
+
+	switch (result) {
+	case RESPONSE_ACCEPT:
+	case RESPONSE_OK:
+		gdkcolor = color_dialog.get_colorsel()->get_current_color();
+		a = color_dialog.get_colorsel()->get_current_alpha() / 65535.0;
+		r = gdkcolor.get_red_p();
+		g = gdkcolor.get_green_p();
+		b = gdkcolor.get_blue_p();
+
+		uic->set_color (name, rgba_to_color (r, g, b, a));
+		break;
+
+	default:
+		break;
+	}
+
+	color_dialog.hide ();
+}
+
+bool
+ColorThemeManager::alias_palette_event (GdkEvent* ev, string new_alias, string target_name)
+{
+	switch (ev->type) {
+	case GDK_BUTTON_RELEASE:
+		UIConfiguration::instance().set_alias (target_name, new_alias);
+		return true;
+		break;
+	default:
+		break;
+	}
+	return false;
+}
+
+void
+ColorThemeManager::alias_palette_response (int response, std::string target_name, std::string old_alias)
+{
+	switch (response) {
+	case GTK_RESPONSE_OK:
+	case GTK_RESPONSE_ACCEPT:
+		/* rebuild alias list with new color: inefficient but simple */
+		setup_aliases ();
+		break;
+
+	case GTK_RESPONSE_REJECT:
+		/* revert choice */
+		UIConfiguration::instance().set_alias (target_name, old_alias);
+		break;
+
+	default:
+		/* do nothing */
+		break;
+	}
+
+	palette_window->hide ();
+}
+
+void
+ColorThemeManager::choose_color_from_palette (string const & name)
+{
+	UIConfiguration* uic (&UIConfiguration::instance());
+	UIConfiguration::ColorAliases::iterator i = uic->color_aliases.find (name);
+
+	if (i == uic->color_aliases.end()) {
+		return;
+	}
+
+	delete palette_window;
+
+	palette_window = new ArdourDialog (_("Color Palette"));
+	palette_window->add_button (Stock::CANCEL, RESPONSE_REJECT); /* using CANCEL causes confusion if dialog is closed via CloseAllDialogs */
+	palette_window->add_button (Stock::OK, RESPONSE_OK);
+
+	ArdourCanvas::GtkCanvas* canvas = new ArdourCanvas::GtkCanvas ();
+	ArdourCanvas::Container* group = initialize_palette_canvas (*canvas);
+
+	canvas->signal_size_request().connect (sigc::mem_fun (*this, &ColorThemeManager::palette_size_request));
+	canvas->signal_size_allocate().connect (sigc::bind (sigc::mem_fun (*this, &ColorThemeManager::palette_canvas_allocated), group, canvas,
+							    sigc::bind (sigc::mem_fun (*this, &ColorThemeManager::alias_palette_event), name)));
+
+	palette_window->get_vbox()->pack_start (*canvas);
+	palette_window->show_all ();
+
+	palette_response_connection = palette_window->signal_response().connect (sigc::bind (sigc::mem_fun (*this, &ColorThemeManager::alias_palette_response), name, i->second));
+
+	palette_window->set_position (WIN_POS_MOUSE);
+	palette_window->present ();
+}
+
+void
+ColorThemeManager::setup_aliases ()
+{
+	using namespace ArdourCanvas;
+
+	UIConfiguration* uic (&UIConfiguration::instance());
+	UIConfiguration::ColorAliases& aliases (uic->color_aliases);
+
+	alias_list->clear ();
+
+	for (UIConfiguration::ColorAliases::iterator i = aliases.begin(); i != aliases.end(); ++i) {
+		TreeModel::Children rows = alias_list->children();
+		TreeModel::Row row;
+		string::size_type colon;
+
+		if ((colon = i->first.find (':')) != string::npos) {
+
+			/* this is supposed to be a child node, so find the
+			 * parent
+			 */
+
+			string parent = i->first.substr (0, colon);
+			TreeModel::iterator ri;
+
+			for (ri = rows.begin(); ri != rows.end(); ++ri) {
+				string s = (*ri)[alias_columns.name];
+				if (s == parent) {
+					break;
+				}
+			}
+
+			if (ri == rows.end()) {
+				/* not found, add the parent as new top level row */
+				row = *(alias_list->append());
+				row[alias_columns.name] = parent;
+				row[alias_columns.alias] = "";
+
+				/* now add the child as a child of this one */
+
+				row = *(alias_list->insert (row->children().end()));
+				row[alias_columns.name] = i->first.substr (colon+1);
+			} else {
+				row = *(alias_list->insert ((*ri)->children().end()));
+				row[alias_columns.name] = i->first.substr (colon+1);
+			}
+
+		} else {
+			/* add as a child */
+			row = *(alias_list->append());
+			row[alias_columns.name] = i->first;
+			row[alias_columns.key] = i->first;
+		}
+
+		row[alias_columns.key] = i->first;
+		row[alias_columns.alias] = i->second;
+
+		Gdk::Color col;
+		double r, g, b, a;
+		Color c (uic->color (i->second));
+		color_to_rgba (c, r, g, b, a);
+		col.set_rgb_p (r, g, b);
+
+		row[alias_columns.color] = col;
+	}
+}
+
+bool
+ColorThemeManager::alias_button_press_event (GdkEventButton* ev)
+{
+	TreeIter iter;
+	TreeModel::Path path;
+	TreeViewColumn* column;
+	int cellx;
+	int celly;
+
+	if (!alias_display.get_path_at_pos ((int)ev->x, (int)ev->y, path, column, cellx, celly)) {
+		return false;
+	}
+
+	guint32 colnum = GPOINTER_TO_UINT (column->get_data (X_("colnum")));
+
+	switch (colnum) {
+	case 0:
+		/* allow normal processing to occur */
+		return false;
+
+	case 1: /* color */
+		if ((iter = alias_list->get_iter (path))) {
+			string target_color_alias = (*iter)[alias_columns.key];
+			if (!target_color_alias.empty()) {
+				choose_color_from_palette (target_color_alias);
+			}
+		}
+		break;
+	}
+
+	return true;
+}
+
+void
+ColorThemeManager::parameter_changed (string const&)
+{
+}
+
+void
+ColorThemeManager::set_state_from_config ()
+{
+
+}
+
+void
+ColorThemeManager::add_to_page (OptionEditorPage* page)
+{
+	add_widget_to_page (page, this);
+}
+
+Gtk::Widget&
+ColorThemeManager::tip_widget()
+{
+	return reset_button; /* XXX need a better widget for this purpose */
+}
+
+void
+ColorThemeManager::on_color_theme_changed ()
+{
+	Gtk::TreeModel::iterator iter = color_theme_dropdown.get_active();
+
+	if (iter) {
+		Gtk::TreeModel::Row row = *iter;
+
+		if (row) {
+			string new_theme = row[color_theme_columns.path];
+			UIConfiguration::instance().set_color_file (new_theme);
+		}
+	}
+}
diff --git a/gtk2_ardour/color_theme_manager.h b/gtk2_ardour/color_theme_manager.h
new file mode 100644
index 0000000..f3e9132
--- /dev/null
+++ b/gtk2_ardour/color_theme_manager.h
@@ -0,0 +1,167 @@
+/*
+    Copyright (C) 2000-2016 Paul Davis
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#ifndef __ardour_gtk_color_manager_h__
+#define __ardour_gtk_color_manager_h__
+
+#include <gtkmm/treeview.h>
+#include <gtkmm/treestore.h>
+#include <gtkmm/scrolledwindow.h>
+#include <gtkmm/colorselection.h>
+#include <gtkmm/button.h>
+
+#include "canvas/types.h"
+#include "canvas/canvas.h"
+
+#include "option_editor.h"
+#include "ui_config.h"
+
+namespace ArdourCanvas {
+	class Container;
+	class ScrollGroup;
+}
+
+class ArdourDialog;
+
+class ColorThemeManager : public Gtk::VBox, public OptionEditorComponent
+{
+  public:
+	ColorThemeManager();
+
+	void reset_canvas_colors();
+	void on_color_theme_changed ();
+
+	/** Called when a configuration parameter's value has changed.
+	 *  @param p parameter name
+	 */
+	void parameter_changed (std::string const & p);
+
+	/** Called to instruct the object to set its UI state from the configuration */
+	void set_state_from_config ();
+
+	/** Called to instruct the object to add itself to an OptionEditorPage */
+	void add_to_page (OptionEditorPage *);
+
+	void set_note (std::string const &);
+
+	Gtk::Widget& tip_widget();
+
+  private:
+	Gtk::Button reset_button;
+	Gtk::Notebook notebook;
+
+	/* handls response from color dialog when it is used to
+	   edit a derived color.
+	*/
+	void palette_color_response (int, std::string);
+
+	Gtk::ScrolledWindow palette_scroller;
+	ArdourCanvas::GtkCanvasViewport palette_viewport;
+	ArdourCanvas::Container* palette_group;
+
+	/* these methods create and manage a canvas for use in either the
+	   palette tab or in a separate dialog. Different behaviour is
+	   accomplished by changing the event handler passed into the
+	   allocation handler. We do it there because we have to rebuild
+	   the canvas on allocation events, and during the rebuild, connect
+	   each rectangle to the event handler.
+
+	   the alternative is one event handler for the canvas and a map
+	   of where each color rectangle is. nothing wrong with this
+	   but the per-rect event setup is simpler and avoids building
+	   and looking up the map information.
+	*/
+	ArdourCanvas::Container* initialize_palette_canvas (ArdourCanvas::Canvas& canvas);
+	void build_palette_canvas (ArdourCanvas::Canvas&, ArdourCanvas::Container&, sigc::slot<bool,GdkEvent*,std::string> event_handler);
+	void palette_canvas_allocated (Gtk::Allocation& alloc, ArdourCanvas::Container* group, ArdourCanvas::Canvas* canvas, sigc::slot<bool,GdkEvent*,std::string> event_handler);
+	void palette_size_request (Gtk::Requisition*);
+
+	/* handles events from a palette canvas inside the palette (derived
+	   colors) tab
+	*/
+	bool palette_event (GdkEvent*, std::string name);
+	/* allows user to edit a named color (e.g. "color 3") after clicking
+	   on it inside the palette tab.
+	*/
+	void edit_palette_color (std::string);
+
+	struct ColorAliasModelColumns : public Gtk::TreeModel::ColumnRecord {
+		ColorAliasModelColumns() {
+			add (name);
+			add (alias);
+			add (color);
+			add (key);
+		}
+
+		Gtk::TreeModelColumn<std::string>  name;
+		Gtk::TreeModelColumn<std::string>  alias;
+		Gtk::TreeModelColumn<Gdk::Color>   color;
+		Gtk::TreeModelColumn<std::string>  key;
+	};
+
+	ColorAliasModelColumns       alias_columns;
+	Gtk::TreeView                alias_display;
+	Glib::RefPtr<Gtk::TreeStore> alias_list;
+	Gtk::ScrolledWindow          alias_scroller;
+
+	bool alias_button_press_event (GdkEventButton*);
+
+	ArdourDialog* palette_window;
+	sigc::connection palette_response_connection;
+
+	void choose_color_from_palette (std::string const &target_name);
+
+	bool alias_palette_event (GdkEvent*, std::string, std::string);
+	void alias_palette_response (int, std::string, std::string);
+
+	void setup_aliases ();
+	void setup_palette ();
+
+	Gtk::ScrolledWindow modifier_scroller;
+	Gtk::VBox modifier_vbox;
+
+	void setup_modifiers ();
+	void modifier_edited (Gtk::Range*, std::string);
+
+	Gtk::ColorSelectionDialog color_dialog;
+	sigc::connection color_dialog_connection;
+
+	void colors_changed ();
+	void set_ui_to_state ();
+
+
+	struct ColorThemeModelColumns : public Gtk::TreeModel::ColumnRecord {
+		ColorThemeModelColumns() {
+			add (name);
+			add (path);
+		}
+
+		Gtk::TreeModelColumn<std::string>  name;
+		Gtk::TreeModelColumn<std::string>  path;
+	};
+
+	ColorThemeModelColumns color_theme_columns;
+	Glib::RefPtr<Gtk::TreeStore> theme_list;
+
+	Gtk::Label color_theme_label;
+	Gtk::ComboBox color_theme_dropdown;
+
+};
+
+#endif /* __ardour_gtk_color_manager_h__ */
diff --git a/gtk2_ardour/configinfo.cc b/gtk2_ardour/configinfo.cc
index 67f13a1..f7a3211 100644
--- a/gtk2_ardour/configinfo.cc
+++ b/gtk2_ardour/configinfo.cc
@@ -22,7 +22,7 @@
 #include "ardour/ardour.h"
 
 #include "configinfo.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 ConfigInfoDialog::ConfigInfoDialog ()
 	: ArdourDialog (_("Build Configuration"))
diff --git a/gtk2_ardour/control_point.cc b/gtk2_ardour/control_point.cc
index b906e63..2a457c5 100644
--- a/gtk2_ardour/control_point.cc
+++ b/gtk2_ardour/control_point.cc
@@ -24,7 +24,7 @@
 
 #include "canvas/rectangle.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
diff --git a/gtk2_ardour/control_point_dialog.cc b/gtk2_ardour/control_point_dialog.cc
index 9cb71cb..06ef2ce 100644
--- a/gtk2_ardour/control_point_dialog.cc
+++ b/gtk2_ardour/control_point_dialog.cc
@@ -20,7 +20,7 @@
 #include "control_point_dialog.h"
 #include "control_point.h"
 #include "automation_line.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
 #include <gtkmm/stock.h>
 
 /**
diff --git a/gtk2_ardour/control_slave_ui.cc b/gtk2_ardour/control_slave_ui.cc
new file mode 100644
index 0000000..55705cf
--- /dev/null
+++ b/gtk2_ardour/control_slave_ui.cc
@@ -0,0 +1,243 @@
+/*
+  Copyright (C) 2016 Paul Davis
+
+  This program is free software; you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation; either version 2 of the License, or
+  (at your option) any later version.
+
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#include <string>
+
+#include <gtkmm/menu.h>
+
+#include "pbd/convert.h"
+
+#include "ardour/session.h"
+#include "ardour/stripable.h"
+#include "ardour/types.h"
+#include "ardour/vca.h"
+#include "ardour/vca_manager.h"
+
+#include "gtkmm2ext/gtk_ui.h"
+#include "gtkmm2ext/utils.h"
+
+#include "ardour_button.h"
+#include "control_slave_ui.h"
+#include "gui_thread.h"
+
+#include "pbd/i18n.h"
+
+using namespace ARDOUR;
+using namespace Gtk;
+using std::string;
+
+ControlSlaveUI::ControlSlaveUI (Session* s)
+	: SessionHandlePtr (s)
+	, initial_button (ArdourButton::default_elements)
+{
+	set_no_show_all (true);
+
+	Gtkmm2ext::UI::instance()->set_tip (*this, _("Control Masters"));
+
+	initial_button.set_no_show_all (true);
+	initial_button.set_name (X_("vca assign"));
+	initial_button.set_text (_("-vca-"));
+	initial_button.show ();
+	initial_button.add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK);
+	initial_button.signal_button_release_event().connect (sigc::bind (sigc::mem_fun (*this, &ControlSlaveUI::vca_button_release), 0), false);
+
+	pack_start (initial_button, true, true);
+}
+
+void
+ControlSlaveUI::set_stripable (boost::shared_ptr<Stripable> s)
+{
+	connections.drop_connections ();
+
+	stripable = s;
+
+	if (stripable) {
+		boost::shared_ptr<GainControl> ac = stripable->gain_control();
+		assert (ac);
+
+		ac->MasterStatusChange.connect (connections,
+		                                invalidator (*this),
+		                                boost::bind (&ControlSlaveUI::update_vca_display, this),
+		                                gui_context());
+
+		stripable->DropReferences.connect (connections, invalidator (*this), boost::bind (&ControlSlaveUI::set_stripable, this, boost::shared_ptr<Stripable>()), gui_context());
+	}
+
+	update_vca_display ();
+}
+
+void
+ControlSlaveUI::update_vca_display ()
+{
+	if (!_session || _session->deletion_in_progress()) {
+		return;
+	}
+
+	VCAList vcas (_session->vca_manager().vcas());
+	bool any = false;
+
+	Gtkmm2ext::container_clear (*this);
+	master_connections.drop_connections ();
+
+	if (stripable) {
+		for (VCAList::iterator v = vcas.begin(); v != vcas.end(); ++v) {
+			if (stripable->gain_control()->slaved_to ((*v)->gain_control())) {
+				add_vca_button (*v);
+				any = true;
+			}
+		}
+	}
+
+	if (!any) {
+		pack_start (initial_button, true, true);
+	}
+
+	show ();
+}
+
+void
+ControlSlaveUI::vca_menu_toggle (Gtk::CheckMenuItem* menuitem, uint32_t n)
+{
+	boost::shared_ptr<VCA> vca = _session->vca_manager().vca_by_number (n);
+
+	if (!vca) {
+		return;
+	}
+
+	boost::shared_ptr<Slavable> sl = boost::dynamic_pointer_cast<Slavable> (stripable);
+
+	if (!sl) {
+		return;
+	}
+
+	if (!menuitem->get_active()) {
+		sl->unassign (vca);
+	} else {
+		sl->assign (vca);
+	}
+}
+
+void
+ControlSlaveUI::unassign_all ()
+{
+	boost::shared_ptr<Slavable> sl = boost::dynamic_pointer_cast<Slavable> (stripable);
+
+	if (!sl) {
+		return;
+	}
+
+	sl->unassign (boost::shared_ptr<VCA>());
+}
+
+bool
+ControlSlaveUI::specific_vca_button_release (GdkEventButton* ev, uint32_t n)
+{
+	return vca_button_release  (ev, n);
+}
+
+bool
+ControlSlaveUI::vca_button_release (GdkEventButton* ev, uint32_t n)
+{
+	using namespace Gtk::Menu_Helpers;
+
+	if (!_session) {
+		return false;
+	}
+
+	/* primary click only */
+
+	if (ev->button != 1) {
+		return false;
+	}
+
+	if (!stripable) {
+		/* no route - nothing to do */
+		return false;
+	}
+
+	VCAList vcas (_session->vca_manager().vcas());
+
+	if (vcas.empty()) {
+		/* the button should not have been visible under these conditions */
+		return true;
+	}
+
+	Menu* menu = new Menu;
+	MenuList& items = menu->items();
+	bool slaved = false;
+
+	for (VCAList::iterator v = vcas.begin(); v != vcas.end(); ++v) {
+
+		boost::shared_ptr<GainControl> gcs = stripable->gain_control();
+		boost::shared_ptr<GainControl> gcm = (*v)->gain_control();
+
+		if (gcs == gcm) {
+			/* asked to slave to self. not ok */
+			continue;
+		}
+
+		if (gcm->slaved_to (gcs)) {
+			/* master is already slaved to slave */
+			continue;
+		}
+
+		items.push_back (CheckMenuElem ((*v)->name()));
+		Gtk::CheckMenuItem* item = dynamic_cast<Gtk::CheckMenuItem*> (&items.back());
+
+		if (gcs->slaved_to (gcm)) {
+			item->set_active (true);
+			slaved = true;
+		}
+
+		item->signal_activate().connect (sigc::bind (sigc::mem_fun (*this, &ControlSlaveUI::vca_menu_toggle), item, (*v)->number()));
+	}
+
+	if (slaved) {
+		items.push_back (MenuElem (_("Unassign All"), sigc::mem_fun (*this, &ControlSlaveUI::unassign_all)));
+	}
+
+	if (!items.empty()) {
+		menu->popup (1, ev->time);
+	}
+
+	return true;
+}
+
+void
+ControlSlaveUI::add_vca_button (boost::shared_ptr<VCA> vca)
+{
+	ArdourButton* vca_button = manage (new ArdourButton (ArdourButton::default_elements));
+
+	vca_button->set_no_show_all (true);
+	vca_button->set_name (X_("vca assign"));
+	vca_button->add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK);
+	vca_button->signal_button_release_event().connect (sigc::bind (sigc::mem_fun (*this, &ControlSlaveUI::specific_vca_button_release), vca->number()), false);
+	vca_button->set_text (PBD::to_string (vca->number(), std::dec));
+	vca_button->set_fixed_colors (vca->presentation_info().color(), vca->presentation_info().color ());
+
+	vca->presentation_info().PropertyChanged.connect (master_connections, invalidator (*this), boost::bind (&ControlSlaveUI::master_property_changed, this, _1), gui_context());
+
+	pack_start (*vca_button);
+	vca_button->show ();
+}
+
+void
+ControlSlaveUI::master_property_changed (PBD::PropertyChange const& /* what_changed */)
+{
+	update_vca_display ();
+}
diff --git a/gtk2_ardour/control_slave_ui.h b/gtk2_ardour/control_slave_ui.h
new file mode 100644
index 0000000..3443e1a
--- /dev/null
+++ b/gtk2_ardour/control_slave_ui.h
@@ -0,0 +1,64 @@
+/*
+  Copyright (C) 2016 Paul Davis
+
+  This program is free software; you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation; either version 2 of the License, or
+  (at your option) any later version.
+
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#ifndef __gtk2_ardour_control_slave_ui_h__
+#define __gtk2_ardour_control_slave_ui_h__
+
+#include <stdint.h>
+
+#include <boost/shared_ptr.hpp>
+
+#include <gtkmm/box.h>
+#include <gtkmm/checkmenuitem.h>
+
+#include "pbd/signals.h"
+#include "pbd/properties.h"
+
+#include "ardour/session_handle.h"
+
+#include "ardour_button.h"
+
+namespace ARDOUR {
+	class VCA;
+	class Stripable;
+	class Session;
+}
+
+class ControlSlaveUI : public Gtk::HBox, public ARDOUR::SessionHandlePtr
+{
+   public:
+	ControlSlaveUI (ARDOUR::Session*);
+	void set_stripable (boost::shared_ptr<ARDOUR::Stripable>);
+
+   private:
+	boost::shared_ptr<ARDOUR::Stripable> stripable;
+	PBD::ScopedConnectionList connections;
+	PBD::ScopedConnectionList master_connections;
+	ArdourButton  initial_button;
+
+	void master_property_changed (PBD::PropertyChange const &);
+	void update_vca_display ();
+	void vca_menu_toggle (Gtk::CheckMenuItem*, uint32_t n);
+	bool specific_vca_button_release (GdkEventButton* ev, uint32_t n);
+	bool vca_event_box_release (GdkEventButton* ev);
+	bool vca_button_release (GdkEventButton* ev, uint32_t n);
+	void add_vca_button (boost::shared_ptr<ARDOUR::VCA>);
+	void unassign_all ();
+};
+
+#endif /* __gtk2_ardour_control_slave_ui_h__ */
diff --git a/gtk2_ardour/crossfade_edit.cc b/gtk2_ardour/crossfade_edit.cc
deleted file mode 100644
index 367bece..0000000
--- a/gtk2_ardour/crossfade_edit.cc
+++ /dev/null
@@ -1,1455 +0,0 @@
-/*
-    Copyright (C) 2004 Paul Davis
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-*/
-
-#include <cmath>
-
-#include <sigc++/bind.h>
-
-#include <gtkmm/frame.h>
-#include <gtkmm/image.h>
-#include <gtkmm/scrolledwindow.h>
-
-
-#include "pbd/memento_command.h"
-#include "ardour/automation_list.h"
-#include "evoral/Curve.hpp"
-#include "ardour/crossfade.h"
-#include "ardour/dB.h"
-#include "ardour/session.h"
-#include "ardour/auditioner.h"
-#include "ardour/audioplaylist.h"
-#include "ardour/audiosource.h"
-#include "ardour/region_factory.h"
-#include "ardour/profile.h"
-#include "ardour/crossfade_binder.h"
-
-#include <gtkmm2ext/gtk_ui.h>
-
-#include "canvas/rectangle.h"
-#include "canvas/wave_view.h"
-#include "canvas/line.h"
-#include "canvas/polygon.h"
-
-#include "ardour_ui.h"
-#include "crossfade_edit.h"
-#include "rgb_macros.h"
-#include "keyboard.h"
-#include "gui_thread.h"
-#include "actions.h"
-
-using namespace std;
-using namespace ARDOUR;
-using namespace PBD;
-using namespace Gtk;
-using namespace Editing;
-
-using Gtkmm2ext::Keyboard;
-
-#include "i18n.h"
-
-const int32_t CrossfadeEditor::Point::size = 7;
-const double CrossfadeEditor::canvas_border = 10;
-CrossfadeEditor::Presets* CrossfadeEditor::fade_in_presets = 0;
-CrossfadeEditor::Presets* CrossfadeEditor::fade_out_presets = 0;
-
-CrossfadeEditor::Half::Half ()
-	: line (0)
-	, normative_curve (Evoral::Parameter(GainAutomation))
-	, gain_curve (Evoral::Parameter(GainAutomation))
-{
-}
-
-CrossfadeEditor::CrossfadeEditor (Session* s, boost::shared_ptr<Crossfade> xf, double my, double mxy)
-	: ArdourDialog (_("Edit Crossfade")),
-	  xfade (xf),
-	  clear_button (_("Clear")),
-	  revert_button (_("Reset")),
-	  audition_both_button (_("Fade")),
-	  audition_left_dry_button (_("Out (dry)")),
-	  audition_left_button (_("Out")),
-	  audition_right_dry_button (_("In (dry)")),
-	  audition_right_button (_("In")),
-
-	  preroll_button (_("With Pre-roll")),
-	  postroll_button (_("With Post-roll")),
-
-	  miny (my),
-	  maxy (mxy),
-
-	  fade_in_table (3, 3),
-	  fade_out_table (3, 3),
-
-	  select_in_button (_("Fade In")),
-	  select_out_button (_("Fade Out")),
-
-	  _peaks_ready_connection (0)
-
-{
-	set_session (s);
-
-	set_wmclass (X_("ardour_automationedit"), PROGRAM_NAME);
-	set_name ("CrossfadeEditWindow");
-
-	add_accel_group (ActionManager::ui_manager->get_accel_group());
-
-	add_events (Gdk::KEY_PRESS_MASK|Gdk::KEY_RELEASE_MASK|Gdk::POINTER_MOTION_MASK);
-
-	RadioButtonGroup sel_but_group = select_in_button.get_group();
-	select_out_button.set_group (sel_but_group);
-	select_out_button.set_mode (false);
-	select_in_button.set_mode (false);
-
-	get_action_area()->set_layout(BUTTONBOX_SPREAD);
-	get_action_area()->pack_start(clear_button);
-	get_action_area()->pack_start(revert_button);
-	cancel_button = add_button ("Cancel", RESPONSE_CANCEL);
-	ok_button = add_button ("OK", RESPONSE_ACCEPT);
-
-	if (fade_in_presets == 0) {
-		build_presets ();
-	}
-
-	point_grabbed = false;
-	toplevel = 0;
-
-	canvas = new ArdourCanvas::GtkCanvas ();
-	canvas->signal_size_allocate().connect (sigc::mem_fun(*this, &CrossfadeEditor::canvas_allocation));
-	canvas->set_size_request (425, 200);
-
-	toplevel = new ArdourCanvas::Rectangle (canvas->root());
-	toplevel->set (ArdourCanvas::Rect (0, 0, 10, 10));
-	toplevel->set_fill (true);
-	toplevel->set_fill_color (UIConfiguration::instance().get_CrossfadeEditorBase());
-	toplevel->set_outline (false);
-	toplevel->Event.connect (sigc::mem_fun (*this, &CrossfadeEditor::canvas_event));
-
-	fade[Out].line = new ArdourCanvas::PolyLine (canvas->root());
-	fade[Out].line->set_outline_color (UIConfiguration::instance().get_CrossfadeEditorLine());
-
-	fade[Out].shading = new ArdourCanvas::Polygon (canvas->root());
-	fade[Out].shading->set_fill_color (UIConfiguration::instance().get_CrossfadeEditorLineShading());
-
-	fade[In].line = new ArdourCanvas::PolyLine (canvas->root());
-	fade[In].line->set_outline_color (UIConfiguration::instance().get_CrossfadeEditorLine());
-
-	fade[In].shading = new ArdourCanvas::Polygon (canvas->root());
-	fade[In].shading->set_fill_color (UIConfiguration::instance().get_CrossfadeEditorLineShading());
-
-	fade[In].shading->Event.connect (sigc::mem_fun (*this, &CrossfadeEditor::canvas_event));
-	fade[In].line->Event.connect (sigc::mem_fun (*this, &CrossfadeEditor::curve_event));
-	fade[Out].shading->Event.connect (sigc::mem_fun (*this, &CrossfadeEditor::canvas_event));
-	fade[Out].line->Event.connect (sigc::mem_fun (*this, &CrossfadeEditor::curve_event));
-
-	select_in_button.set_name (X_("CrossfadeEditCurveButton"));
-	select_out_button.set_name (X_("CrossfadeEditCurveButton"));
-
-	select_in_button.signal_clicked().connect (sigc::bind (sigc::mem_fun (*this, &CrossfadeEditor::curve_select_clicked), In));
-	select_out_button.signal_clicked().connect (sigc::bind (sigc::mem_fun (*this, &CrossfadeEditor::curve_select_clicked), Out));
-
-	HBox* acbox = manage (new HBox);
-
-	audition_box.set_border_width (7);
-	audition_box.set_spacing (5);
-	audition_box.set_homogeneous (false);
-	audition_box.pack_start (audition_left_dry_button, false, false);
-	audition_box.pack_start (audition_left_button, false, false);
-	audition_box.pack_start (audition_both_button, false, false);
-	audition_box.pack_start (audition_right_button, false, false);
-	audition_box.pack_start (audition_right_dry_button, false, false);
-
-	Frame* audition_frame = manage (new Frame (_("Audition")));
-
-	audition_frame->set_name (X_("CrossfadeEditFrame"));
-	audition_frame->add (audition_box);
-
-	acbox->pack_start (*audition_frame, true, false);
-
-	Frame* canvas_frame = manage (new Frame);
-	canvas_frame->add (*canvas);
-	canvas_frame->set_shadow_type (Gtk::SHADOW_IN);
-
-	fade_in_table.attach (select_in_button, 0, 2, 0, 1, Gtk::FILL|Gtk::EXPAND);
-	fade_out_table.attach (select_out_button, 0, 2, 0, 1, Gtk::FILL|Gtk::EXPAND);
-
-	Image *pxmap;
-	Button* pbutton;
-	int row;
-	int col;
-
-	row = 1;
-	col = 0;
-
-	for (list<Preset*>::iterator i = fade_in_presets->begin(); i != fade_in_presets->end(); ++i) {
-
-		pxmap = manage (new Image (::get_icon ((*i)->image_name)));
-		pbutton = manage (new Button);
-		pbutton->add (*pxmap);
-		pbutton->set_name ("CrossfadeEditButton");
-		pbutton->signal_clicked().connect (sigc::bind (sigc::mem_fun(*this, &CrossfadeEditor::apply_preset), *i));
-		ARDOUR_UI::instance()->set_tip (pbutton, (*i)->name, "");
-		fade_in_table.attach (*pbutton, col, col+1, row, row+1);
-		fade_in_buttons.push_back (pbutton);
-
-		col++;
-
-		if (col == 2) {
-			col = 0;
-			row++;
-		}
-	}
-
-	row = 1;
-	col = 0;
-
-	for (list<Preset*>::iterator i = fade_out_presets->begin(); i != fade_out_presets->end(); ++i) {
-
-		pxmap = manage (new Image (::get_icon ((*i)->image_name)));
-		pbutton = manage (new Button);
-		pbutton->add (*pxmap);
-		pbutton->set_name ("CrossfadeEditButton");
-		pbutton->signal_clicked().connect (sigc::bind (sigc::mem_fun(*this, &CrossfadeEditor::apply_preset), *i));
-		ARDOUR_UI::instance()->set_tip (pbutton, (*i)->name, "");
-		fade_out_table.attach (*pbutton, col, col+1, row, row+1);
-		fade_out_buttons.push_back (pbutton);
-
-		col++;
-
-		if (col == 2) {
-			col = 0;
-			row++;
-		}
-	}
-
-	clear_button.set_name ("CrossfadeEditButton");
-	revert_button.set_name ("CrossfadeEditButton");
-	ok_button->set_name ("CrossfadeEditButton");
-	cancel_button->set_name ("CrossfadeEditButton");
-	preroll_button.set_name ("CrossfadeEditButton");
-	postroll_button.set_name ("CrossfadeEditButton");
-	audition_both_button.set_name ("CrossfadeEditAuditionButton");
-	audition_left_dry_button.set_name ("CrossfadeEditAuditionButton");
-	audition_left_button.set_name ("CrossfadeEditAuditionButton");
-	audition_right_dry_button.set_name ("CrossfadeEditAuditionButton");
-	audition_right_button.set_name ("CrossfadeEditAuditionButton");
-
-	clear_button.signal_clicked().connect (sigc::mem_fun(*this, &CrossfadeEditor::clear));
-	revert_button.signal_clicked().connect (sigc::mem_fun(*this, &CrossfadeEditor::reset));
-	audition_both_button.signal_toggled().connect (sigc::mem_fun(*this, &CrossfadeEditor::audition_toggled));
-	audition_right_button.signal_toggled().connect (sigc::mem_fun(*this, &CrossfadeEditor::audition_right_toggled));
-	audition_right_dry_button.signal_toggled().connect (sigc::mem_fun(*this, &CrossfadeEditor::audition_right_dry_toggled));
-	audition_left_button.signal_toggled().connect (sigc::mem_fun(*this, &CrossfadeEditor::audition_left_toggled));
-	audition_left_dry_button.signal_toggled().connect (sigc::mem_fun(*this, &CrossfadeEditor::audition_left_dry_toggled));
-
-	roll_box.pack_start (preroll_button, false, false);
-	roll_box.pack_start (postroll_button, false, false);
-
-	Gtk::HBox* rcenter_box = manage (new HBox);
-	rcenter_box->pack_start (roll_box, true, false);
-
-	VBox* vpacker2 = manage (new (VBox));
-
-	vpacker2->set_border_width (12);
-	vpacker2->set_spacing (7);
-	vpacker2->pack_start (*acbox, false, false);
-	vpacker2->pack_start (*rcenter_box, false, false);
-
-	curve_button_box.set_spacing (7);
-	curve_button_box.pack_start (fade_out_table, false, false, 12);
-	curve_button_box.pack_start (*vpacker2, false, false, 12);
-	curve_button_box.pack_start (fade_in_table, false, false, 12);
-
-	get_vbox()->pack_start (*canvas_frame, true, true);
-	get_vbox()->pack_start (curve_button_box, false, false);
-
-	/* button to allow hackers to check the actual curve values */
-
-//	Button* foobut = manage (new Button ("dump"));
-//	foobut-.signal_clicked().connect (sigc::mem_fun(*this, &CrossfadeEditor::dump));
-//	vpacker.pack_start (*foobut, false, false);
-
-	current = In;
-	set (xfade->fade_in(), In);
-
-	current = Out;
-	set (xfade->fade_out(), Out);
-
-	curve_select_clicked (In);
-
-	xfade->PropertyChanged.connect (state_connection, invalidator (*this), boost::bind (&CrossfadeEditor::xfade_changed, this, _1), gui_context());
-
-	_session->AuditionActive.connect (_session_connections, invalidator (*this), boost::bind (&CrossfadeEditor::audition_state_changed, this, _1), gui_context());
-	show_all_children();
-}
-
-CrossfadeEditor::~CrossfadeEditor()
-{
-	/* most objects will be destroyed when the toplevel window is. */
-
-	for (list<Point*>::iterator i = fade[In].points.begin(); i != fade[In].points.end(); ++i) {
-		delete *i;
-	}
-
-	for (list<Point*>::iterator i = fade[Out].points.begin(); i != fade[Out].points.end(); ++i) {
-		delete *i;
-	}
-
-	delete _peaks_ready_connection;
-}
-
-void
-CrossfadeEditor::dump ()
-{
-	for (AutomationList::iterator i = fade[Out].normative_curve.begin(); i != fade[Out].normative_curve.end(); ++i) {
-		cerr << (*i)->when << ' ' << (*i)->value << endl;
-	}
-}
-
-void
-CrossfadeEditor::audition_state_changed (bool yn)
-{
-	ENSURE_GUI_THREAD (*this, &CrossfadeEditor::audition_state_changed, yn)
-
-	if (!yn) {
-		audition_both_button.set_active (false);
-		audition_left_button.set_active (false);
-		audition_right_button.set_active (false);
-		audition_left_dry_button.set_active (false);
-		audition_right_dry_button.set_active (false);
-	}
-}
-
-void
-CrossfadeEditor::set (const ARDOUR::AutomationList& curve, WhichFade which)
-{
-	double firstx, endx;
-	ARDOUR::AutomationList::const_iterator the_end;
-
-	for (list<Point*>::iterator i = fade[which].points.begin(); i != fade[which].points.end(); ++i) {
-			delete *i;
-	}
-
-	fade[which].points.clear ();
-	fade[which].gain_curve.clear ();
-	fade[which].normative_curve.clear ();
-
-	if (curve.empty()) {
-		goto out;
-	}
-
-	the_end = curve.end();
-	--the_end;
-
-	firstx = (*curve.begin())->when;
-	endx = (*the_end)->when;
-
-	for (ARDOUR::AutomationList::const_iterator i = curve.begin(); i != curve.end(); ++i) {
-
-		double xfract = ((*i)->when - firstx) / (endx - firstx);
-		double yfract = ((*i)->value - miny) / (maxy - miny);
-
-		Point* p = make_point ();
-
-		p->move_to (x_coordinate (xfract), y_coordinate (yfract),
-			    xfract, yfract);
-
-		fade[which].points.push_back (p);
-	}
-
-	/* no need to sort because curve is already time-ordered */
-
-  out:
-
-	swap (which, current);
-	redraw ();
-	swap (which, current);
-}
-
-bool
-CrossfadeEditor::curve_event (GdkEvent* event)
-{
-	/* treat it like a toplevel event */
-
-	return canvas_event (event);
-}
-
-bool
-CrossfadeEditor::point_event (GdkEvent* event, Point* point)
-{
-
-	if (point->curve != fade[current].line) {
-		return FALSE;
-	}
-
-	switch (event->type) {
-	case GDK_BUTTON_PRESS:
-		point_grabbed = true;
-		break;
-	case GDK_BUTTON_RELEASE:
-		point_grabbed = false;
-
-		if (Keyboard::is_delete_event (&event->button)) {
-			fade[current].points.remove (point);
-			delete point;
-		}
-
-		redraw ();
-		break;
-
-	case GDK_MOTION_NOTIFY:
-		if (point_grabbed) {
-			double new_x, new_y;
-
-			/* can't drag first or last points horizontally or vertically */
-
-			if (point == fade[current].points.front() || point == fade[current].points.back()) {
-				new_x = point->x;
-				new_y = point->y;
-			} else {
-				new_x = (event->motion.x - canvas_border)/effective_width();
-				new_y = 1.0 - ((event->motion.y - canvas_border)/effective_height());
-			}
-
-			point->move_to (x_coordinate (new_x), y_coordinate (new_y),
-					new_x, new_y);
-			redraw ();
-		}
-		break;
-	default:
-		break;
-	}
-	return TRUE;
-}
-
-bool
-CrossfadeEditor::canvas_event (GdkEvent* event)
-{
-	switch (event->type) {
-	case GDK_BUTTON_PRESS:
-		add_control_point ((event->button.x - canvas_border)/effective_width(),
-				   1.0 - ((event->button.y - canvas_border)/effective_height()));
-		return true;
-		break;
-	default:
-		break;
-	}
-	return false;
-}
-
-CrossfadeEditor::Point::~Point()
-{
-	delete box;
-}
-
-CrossfadeEditor::Point*
-CrossfadeEditor::make_point ()
-{
-	Point* p = new Point;
-
-	p->box = new ArdourCanvas::Rectangle (canvas->root());
-	p->box->set_fill (true);
-	p->box->set_fill_color (UIConfiguration::instance().get_CrossfadeEditorPointFill());
-	p->box->set_outline_color (UIConfiguration::instance().get_CrossfadeEditorPointOutline());
-
-	p->curve = fade[current].line;
-
-	p->box->Event.connect (sigc::bind (sigc::mem_fun (*this, &CrossfadeEditor::point_event), p));
-
-	return p;
-}
-
-void
-CrossfadeEditor::add_control_point (double x, double y)
-{
-	PointSorter cmp;
-
-	/* enforce end point x location */
-
-	if (fade[current].points.empty()) {
-		x = 0.0;
-	} else if (fade[current].points.size() == 1) {
-		x = 1.0;
-	}
-
-	Point* p = make_point ();
-
-	p->move_to (x_coordinate (x), y_coordinate (y), x, y);
-
-	fade[current].points.push_back (p);
-	fade[current].points.sort (cmp);
-
-	redraw ();
-}
-
-void
-CrossfadeEditor::Point::move_to (double nx, double ny, double xfract, double yfract)
-{
-	if ( xfract < 0.0 ) {
-		xfract = 0.0;
-	} else if ( xfract > 1.0 ) {
-		xfract = 1.0;
-	}
-
-	if ( yfract < 0.0 ) {
-		yfract = 0.0;
-	} else if ( yfract > 1.0 ) {
-		yfract = 1.0;
-	}
-
-	const double half_size = rint(size/2.0);
-	double x1 = nx - half_size;
-	double x2 = nx + half_size;
-
-	box->set (ArdourCanvas::Rect (x1, ny - half_size, x2, ny + half_size));
-
-	x = xfract;
-	y = yfract;
-}
-
-void
-CrossfadeEditor::canvas_allocation (Gtk::Allocation& /*alloc*/)
-{
-	if (toplevel) {
-		toplevel->set (
-			ArdourCanvas::Rect (
-				0,
-				0,
-				canvas->get_allocation().get_width() + canvas_border,
-				canvas->get_allocation().get_height() + canvas_border
-				)
-			);
-	}
-
-	/* XXX: CANVAS */
-//	canvas->set_scroll_region (0.0, 0.0,
-//				   canvas->get_allocation().get_width(),
-//				   canvas->get_allocation().get_height());
-
-	Point* end = make_point ();
-	PointSorter cmp;
-
-	if (fade[In].points.size() > 1) {
-		Point* old_end = fade[In].points.back();
-		fade[In].points.pop_back ();
-		end->move_to (x_coordinate (old_end->x),
-			      y_coordinate (old_end->y),
-			      old_end->x, old_end->y);
-		delete old_end;
-	} else {
-		double x = 1.0;
-		double y = 0.5;
-		end->move_to (x_coordinate (x), y_coordinate (y), x, y);
-
-	}
-
-	fade[In].points.push_back (end);
-	fade[In].points.sort (cmp);
-
-	for (list<Point*>::iterator i = fade[In].points.begin(); i != fade[In].points.end(); ++i) {
-		(*i)->move_to (x_coordinate((*i)->x), y_coordinate((*i)->y),
-			       (*i)->x, (*i)->y);
-	}
-
-	end = make_point ();
-
-	if (fade[Out].points.size() > 1) {
-		Point* old_end = fade[Out].points.back();
-		fade[Out].points.pop_back ();
-		end->move_to (x_coordinate (old_end->x),
-			      y_coordinate (old_end->y),
-			      old_end->x, old_end->y);
-		delete old_end;
-	} else {
-		double x = 1.0;
-		double y = 0.5;
-		end->move_to (x_coordinate (x), y_coordinate (y), x, y);
-
-	}
-
-	fade[Out].points.push_back (end);
-	fade[Out].points.sort (cmp);
-
-	for (list<Point*>::iterator i = fade[Out].points.begin(); i != fade[Out].points.end(); ++i) {
-		(*i)->move_to (x_coordinate ((*i)->x),
-			       y_coordinate ((*i)->y),
-			       (*i)->x, (*i)->y);
-	}
-
-	WhichFade old_current = current;
-	current = In;
-	redraw ();
-	current = Out;
-	redraw ();
-	current = old_current;
-
-	double spu = xfade->length() / (double) effective_width();
-
-	if (fade[In].waves.empty()) {
-		make_waves (xfade->in(), In);
-	}
-
-	if (fade[Out].waves.empty()) {
-		make_waves (xfade->out(), Out);
-	}
-
-	double ht;
-	vector<ArdourCanvas::WaveView*>::iterator i;
-	uint32_t n;
-
-	ht = canvas->get_allocation().get_height() / xfade->in()->n_channels();
-
-	for (n = 0, i = fade[In].waves.begin(); i != fade[In].waves.end(); ++i, ++n) {
-		double yoff;
-
-		yoff = n * ht;
-
-		(*i)->set_y_position (yoff);
-		(*i)->set_height (ht);
-		(*i)->set_samples_per_pixel (spu);
-	}
-
-	ht = canvas->get_allocation().get_height() / xfade->out()->n_channels();
-
-	for (n = 0, i = fade[Out].waves.begin(); i != fade[Out].waves.end(); ++i, ++n) {
-		double yoff;
-
-		yoff = n * ht;
-
-		(*i)->set_y_position (yoff);
-		(*i)->set_height (ht);
-		(*i)->set_samples_per_pixel (spu);
-	}
-
-}
-
-
-void
-CrossfadeEditor::xfade_changed (const PropertyChange&)
-{
-	set (xfade->fade_in(), In);
-	set (xfade->fade_out(), Out);
-}
-
-void
-CrossfadeEditor::redraw ()
-{
-	if (canvas->get_allocation().get_width() < 2) {
-		return;
-	}
-
-	framecnt_t len = xfade->length ();
-
-	fade[current].normative_curve.clear ();
-	fade[current].gain_curve.clear ();
-
-	for (list<Point*>::iterator i = fade[current].points.begin(); i != fade[current].points.end(); ++i) {
-		fade[current].normative_curve.add ((*i)->x, (*i)->y);
-		double offset;
-		if (current==In)
-			offset = xfade->in()->start();
-		else
-			offset = xfade->out()->start()+xfade->out()->length()-xfade->length();
-		fade[current].gain_curve.add (((*i)->x * len) + offset, (*i)->y);
-	}
-
-
-	size_t npoints = (size_t) effective_width();
-	float vec[npoints];
-
-	fade[current].normative_curve.curve().get_vector (0, 1.0, vec, npoints);
-
-	ArdourCanvas::Points pts;
-	ArdourCanvas::Points spts;
-
-	while (pts.size() < npoints) {
-		pts.push_back (ArdourCanvas::Duple (0,0));
-	}
-
-	while (spts.size() < npoints + 3) {
-		spts.push_back (ArdourCanvas::Duple (0,0));
-	}
-
-	/* the shade coordinates *MUST* be in anti-clockwise order.
-	 */
-
-	if (current == In) {
-
-		/* lower left */
-
-		spts[0].x = canvas_border;
-		spts[0].y = effective_height() + canvas_border;
-
-		/* lower right */
-
-		spts[1].x = effective_width() + canvas_border;
-		spts[1].y = effective_height() + canvas_border;
-
-		/* upper right */
-
-		spts[2].x = effective_width() + canvas_border;
-		spts[2].y = canvas_border;
-
-
-	} else {
-
-		/*  upper left */
-
-		spts[0].x = canvas_border;
-		spts[0].y = canvas_border;
-
-		/* lower left */
-
-		spts[1].x = canvas_border;
-		spts[1].y = effective_height() + canvas_border;
-
-		/* lower right */
-
-		spts[2].x = effective_width() + canvas_border;
-		spts[2].y = effective_height() + canvas_border;
-
-	}
-
-	size_t last_spt = (npoints + 3) - 1;
-
-	for (size_t i = 0; i < npoints; ++i) {
-
-		double y = vec[i];
-
-		pts[i].x = canvas_border + i;
-		pts[i].y = y_coordinate (y);
-
-		spts[last_spt - i].x = canvas_border + i;
-		spts[last_spt - i].y = pts[i].y;
-	}
-
-	fade[current].line->set (pts);
-	fade[current].shading->set (pts);
-
-	for (vector<ArdourCanvas::WaveView*>::iterator i = fade[current].waves.begin(); i != fade[current].waves.end(); ++i) {
-		(*i)->property_gain_src() = static_cast<Evoral::Curve*>(&fade[current].gain_curve.curve());
-	}
-}
-
-void
-CrossfadeEditor::apply_preset (Preset *preset)
-{
-
-	WhichFade wf =  find(fade_in_presets->begin(), fade_in_presets->end(), preset) != fade_in_presets->end() ? In : Out;
-
-	if (current != wf) {
-
-	      	if (wf == In) {
-			select_in_button.clicked();
-		} else {
-			select_out_button.clicked();
-		}
-
-		curve_select_clicked (wf);
-	}
-
-	for (list<Point*>::iterator i = fade[current].points.begin(); i != fade[current].points.end(); ++i) {
-		delete *i;
-	}
-
-	fade[current].points.clear ();
-
-	for (Preset::iterator i = preset->begin(); i != preset->end(); ++i) {
-		Point* p = make_point ();
-		p->move_to (x_coordinate ((*i).x), y_coordinate ((*i).y),
-			    (*i).x, (*i).y);
-		fade[current].points.push_back (p);
-	}
-
-	redraw ();
-}
-
-void
-CrossfadeEditor::apply ()
-{
-	the_editor().begin_reversible_command (_("Edit crossfade"));
-
-	XMLNode& before = xfade->get_state ();
-
-	_apply_to (xfade);
-
-	_session->add_command (
-		new MementoCommand<Crossfade> (
-			new ARDOUR::CrossfadeBinder (_session->playlists, xfade->id ()),
-			&before, &xfade->get_state ()
-			)
-		);
-
-	the_editor().commit_reversible_command ();
-}
-
-void
-CrossfadeEditor::_apply_to (boost::shared_ptr<Crossfade> xf)
-{
-	ARDOUR::AutomationList& in (xf->fade_in());
-	ARDOUR::AutomationList& out (xf->fade_out());
-
-	/* IN */
-
-
-	ARDOUR::AutomationList::const_iterator the_end = in.end();
-	--the_end;
-
-	double firstx = (*in.begin())->when;
-	double endx = (*the_end)->when;
-
-	in.freeze ();
-	in.clear ();
-
-	for (list<Point*>::iterator i = fade[In].points.begin(); i != fade[In].points.end(); ++i) {
-
-		double when = firstx + ((*i)->x * (endx - firstx));
-		double value = (*i)->y;
-		in.add (when, value);
-	}
-
-	/* OUT */
-
-	the_end = out.end();
-	--the_end;
-
-	firstx = (*out.begin())->when;
-	endx = (*the_end)->when;
-
-	out.freeze ();
-	out.clear ();
-
-	for (list<Point*>::iterator i = fade[Out].points.begin(); i != fade[Out].points.end(); ++i) {
-
-		double when = firstx + ((*i)->x * (endx - firstx));
-		double value = (*i)->y;
-		out.add (when, value);
-	}
-
-	in.thaw ();
-	out.thaw ();
-}
-
-void
-CrossfadeEditor::setup (boost::shared_ptr<Crossfade> xfade)
-{
-	_apply_to (xfade);
-	xfade->set_active (true);
-	xfade->fade_in().curve().solve ();
-	xfade->fade_out().curve().solve ();
-}
-
-void
-CrossfadeEditor::clear ()
-{
-	for (list<Point*>::iterator i = fade[current].points.begin(); i != fade[current].points.end(); ++i) {
-		delete *i;
-	}
-
-	fade[current].points.clear ();
-
-	redraw ();
-}
-
-void
-CrossfadeEditor::reset ()
-{
-	set (xfade->fade_in(),  In);
-	set (xfade->fade_out(), Out);
-
-	curve_select_clicked (current);
-}
-
-void
-CrossfadeEditor::build_presets ()
-{
-	Preset* p;
-
-	fade_in_presets = new Presets;
-	fade_out_presets = new Presets;
-
-	/* FADE IN */
-
-	p = new Preset ("Linear (-6dB)", "fadein-linear");
-	p->push_back (PresetPoint (0.000000, GAIN_COEFF_SMALL));
-	p->push_back (PresetPoint (0.166667, 0.166366));
-	p->push_back (PresetPoint (0.333333, 0.332853));
-	p->push_back (PresetPoint (0.500000, 0.499459));
-	p->push_back (PresetPoint (0.666667, 0.666186));
-	p->push_back (PresetPoint (0.833333, 0.833033));
-	p->push_back (PresetPoint (1.000000, GAIN_COEFF_UNITY));
-	fade_in_presets->push_back (p);
-
-	p = new Preset ("S(1)-curve", "fadein-S1");
-	p->push_back (PresetPoint (0, GAIN_COEFF_SMALL));
-	p->push_back (PresetPoint (0.1, 0.01));
-	p->push_back (PresetPoint (0.2, 0.03));
-	p->push_back (PresetPoint (0.8, 0.97));
-	p->push_back (PresetPoint (0.9, 0.99));
-	p->push_back (PresetPoint (1, GAIN_COEFF_UNITY));
-	fade_in_presets->push_back (p);
-
-	p = new Preset ("S(2)-curve", "fadein-S2");
-	p->push_back (PresetPoint (0.0, GAIN_COEFF_SMALL));
-	p->push_back (PresetPoint (0.055, 0.222));
-	p->push_back (PresetPoint (0.163, 0.35));
-	p->push_back (PresetPoint (0.837, 0.678));
-	p->push_back (PresetPoint (0.945, 0.783));
-	p->push_back (PresetPoint (1.0, GAIN_COEFF_UNITY));
-	fade_in_presets->push_back (p);
-
-	p = new Preset ("Constant power (-3dB)", "fadein-constant-power");
-
-	p->push_back (PresetPoint (0.000000, GAIN_COEFF_SMALL));
-	p->push_back (PresetPoint (0.166667, 0.282192));
-	p->push_back (PresetPoint (0.333333, 0.518174));
-	p->push_back (PresetPoint (0.500000, 0.707946));
-	p->push_back (PresetPoint (0.666667, 0.851507));
-	p->push_back (PresetPoint (0.833333, 0.948859));
-	p->push_back (PresetPoint (1.000000, GAIN_COEFF_UNITY));
-
-	fade_in_presets->push_back (p);
-
-	if (!Profile->get_sae()) {
-
-	  	p = new Preset ("Short cut", "fadein-short-cut");
-		p->push_back (PresetPoint (0, GAIN_COEFF_SMALL));
-		p->push_back (PresetPoint (0.389401, 0.0333333));
-		p->push_back (PresetPoint (0.629032, 0.0861111));
-		p->push_back (PresetPoint (0.829493, 0.233333));
-		p->push_back (PresetPoint (0.9447, 0.483333));
-		p->push_back (PresetPoint (0.976959, 0.697222));
-		p->push_back (PresetPoint (1, GAIN_COEFF_UNITY));
-		fade_in_presets->push_back (p);
-
-		p = new Preset ("Slow cut", "fadein-slow-cut");
-		p->push_back (PresetPoint (0, GAIN_COEFF_SMALL));
-		p->push_back (PresetPoint (0.304147, 0.0694444));
-		p->push_back (PresetPoint (0.529954, 0.152778));
-		p->push_back (PresetPoint (0.725806, 0.333333));
-		p->push_back (PresetPoint (0.847926, 0.558333));
-		p->push_back (PresetPoint (0.919355, 0.730556));
-		p->push_back (PresetPoint (1, GAIN_COEFF_UNITY));
-		fade_in_presets->push_back (p);
-
-		p = new Preset ("Fast cut", "fadein-fast-cut");
-		p->push_back (PresetPoint (0, GAIN_COEFF_SMALL));
-		p->push_back (PresetPoint (0.0737327, 0.308333));
-		p->push_back (PresetPoint (0.246544, 0.658333));
-		p->push_back (PresetPoint (0.470046, 0.886111));
-		p->push_back (PresetPoint (0.652074, 0.972222));
-		p->push_back (PresetPoint (0.771889, 0.988889));
-		p->push_back (PresetPoint (1, GAIN_COEFF_UNITY));
-		fade_in_presets->push_back (p);
-
-		p = new Preset ("Long cut", "fadein-long-cut");
-		p->push_back (PresetPoint (0, GAIN_COEFF_SMALL));
-		p->push_back (PresetPoint (0.0207373, 0.197222));
-		p->push_back (PresetPoint (0.0645161, 0.525));
-		p->push_back (PresetPoint (0.152074, 0.802778));
-		p->push_back (PresetPoint (0.276498, 0.919444));
-		p->push_back (PresetPoint (0.481567, 0.980556));
-		p->push_back (PresetPoint (0.767281, 1));
-		p->push_back (PresetPoint (1, GAIN_COEFF_UNITY));
-		fade_in_presets->push_back (p);
-	}
-
-	/* FADE OUT */
-
-	// p = new Preset ("regout.xpm");
-	p = new Preset ("Linear (-6dB cut)", "fadeout-linear");
-	p->push_back (PresetPoint (0.000000, GAIN_COEFF_UNITY));
-	p->push_back (PresetPoint (0.166667, 0.833033));
-	p->push_back (PresetPoint (0.333333, 0.666186));
-	p->push_back (PresetPoint (0.500000, 0.499459));
-	p->push_back (PresetPoint (0.666667, 0.332853));
-	p->push_back (PresetPoint (0.833333, 0.166366));
-	p->push_back (PresetPoint (1.000000, GAIN_COEFF_SMALL));
-	fade_out_presets->push_back (p);
-
-	p = new Preset ("S(1)-Curve", "fadeout-S1");
-	p->push_back (PresetPoint (0, GAIN_COEFF_UNITY));
-	p->push_back (PresetPoint (0.1, 0.99));
-	p->push_back (PresetPoint (0.2, 0.97));
-	p->push_back (PresetPoint (0.8, 0.03));
-	p->push_back (PresetPoint (0.9, 0.01));
-	p->push_back (PresetPoint (1, GAIN_COEFF_SMALL));
-	fade_out_presets->push_back (p);
-
-	p = new Preset ("S(2)-Curve", "fadeout-S2");
-	p->push_back (PresetPoint (0.0, GAIN_COEFF_UNITY));
-	p->push_back (PresetPoint (0.163, 0.678));
-	p->push_back (PresetPoint (0.055, 0.783));
-	p->push_back (PresetPoint (0.837, 0.35));
-	p->push_back (PresetPoint (0.945, 0.222));
-	p->push_back (PresetPoint (1.0, GAIN_COEFF_SMALL));
-	fade_out_presets->push_back (p);
-
-	// p = new Preset ("linout.xpm");
-	p = new Preset ("Constant power (-3dB cut)", "fadeout-constant-power");
-	p->push_back (PresetPoint (0.000000, GAIN_COEFF_UNITY));
-	p->push_back (PresetPoint (0.166667, 0.948859));
-	p->push_back (PresetPoint (0.333333, 0.851507));
-	p->push_back (PresetPoint (0.500000, 0.707946));
-	p->push_back (PresetPoint (0.666667, 0.518174));
-	p->push_back (PresetPoint (0.833333, 0.282192));
-	p->push_back (PresetPoint (1.000000, GAIN_COEFF_SMALL));
-	fade_out_presets->push_back (p);
-
-	if (!Profile->get_sae()) {
-		// p = new Preset ("hiout.xpm");
-		p = new Preset ("Short cut", "fadeout-short-cut");
-		p->push_back (PresetPoint (0, GAIN_COEFF_UNITY));
-		p->push_back (PresetPoint (0.305556, GAIN_COEFF_UNITY));
-		p->push_back (PresetPoint (0.548611, 0.991736));
-		p->push_back (PresetPoint (0.759259, 0.931129));
-		p->push_back (PresetPoint (0.918981, 0.68595));
-		p->push_back (PresetPoint (0.976852, 0.22865));
-		p->push_back (PresetPoint (1, GAIN_COEFF_SMALL));
-		fade_out_presets->push_back (p);
-
-		p = new Preset ("Slow cut", "fadeout-slow-cut");
-		p->push_back (PresetPoint (0, GAIN_COEFF_UNITY));
-		p->push_back (PresetPoint (0.228111, 0.988889));
-		p->push_back (PresetPoint (0.347926, 0.972222));
-		p->push_back (PresetPoint (0.529954, 0.886111));
-		p->push_back (PresetPoint (0.753456, 0.658333));
-		p->push_back (PresetPoint (0.9262673, 0.308333));
-		p->push_back (PresetPoint (1, GAIN_COEFF_SMALL));
-		fade_out_presets->push_back (p);
-
-		p = new Preset ("Fast cut", "fadeout-fast-cut");
-		p->push_back (PresetPoint (0, GAIN_COEFF_UNITY));
-		p->push_back (PresetPoint (0.080645, 0.730556));
-		p->push_back (PresetPoint (0.277778, 0.289256));
-		p->push_back (PresetPoint (0.470046, 0.152778));
-		p->push_back (PresetPoint (0.695853, 0.0694444));
-		p->push_back (PresetPoint (1, GAIN_COEFF_SMALL));
-		fade_out_presets->push_back (p);
-
-		// p = new Preset ("loout.xpm");
-		p = new Preset ("Long cut", "fadeout-long-cut");
-		p->push_back (PresetPoint (0, GAIN_COEFF_UNITY));
-		p->push_back (PresetPoint (0.023041, 0.697222));
-		p->push_back (PresetPoint (0.0553,   0.483333));
-		p->push_back (PresetPoint (0.170507, 0.233333));
-		p->push_back (PresetPoint (0.370968, 0.0861111));
-		p->push_back (PresetPoint (0.610599, 0.0333333));
-		p->push_back (PresetPoint (1, GAIN_COEFF_SMALL));
-		fade_out_presets->push_back (p);
-
-	}
-}
-
-void
-CrossfadeEditor::curve_select_clicked (WhichFade wf)
-{
-	current = wf;
-
-	if (wf == In) {
-
-		for (vector<ArdourCanvas::WaveView*>::iterator i = fade[In].waves.begin(); i != fade[In].waves.end(); ++i) {
-			(*i)->set_outline_color (UIConfiguration::instance().get_SelectedCrossfadeEditorWave());
-			(*i)->set_fill_color (UIConfiguration::instance().get_SelectedCrossfadeEditorWave());
-		}
-
-		for (vector<ArdourCanvas::WaveView*>::iterator i = fade[Out].waves.begin(); i != fade[Out].waves.end(); ++i) {
-			(*i)->set_outline_color (UIConfiguration::instance().get_CrossfadeEditorWave());
-			(*i)->set_fill_color (UIConfiguration::instance().get_CrossfadeEditorWave());
-		}
-
-		fade[In].line->set_outline_color (UIConfiguration::instance().get_SelectedCrossfadeEditorLine());
-		fade[Out].line->set_outline_color (UIConfiguration::instance().get_CrossfadeEditorLine());
-		fade[Out].shading->hide();
-		fade[In].shading->show();
-
-		for (list<Point*>::iterator i = fade[Out].points.begin(); i != fade[Out].points.end(); ++i) {
-			(*i)->box->hide();
-		}
-
-		for (list<Point*>::iterator i = fade[In].points.begin(); i != fade[In].points.end(); ++i) {
-			(*i)->box->show ();
-		}
-
-	} else {
-
-		for (vector<ArdourCanvas::WaveView*>::iterator i = fade[In].waves.begin(); i != fade[In].waves.end(); ++i) {
-			(*i)->set_outline_color (UIConfiguration::instance().get_CrossfadeEditorWave());
-			(*i)->set_fill_color (UIConfiguration::instance().get_CrossfadeEditorWave());
-		}
-
-		for (vector<ArdourCanvas::WaveView*>::iterator i = fade[Out].waves.begin(); i != fade[Out].waves.end(); ++i) {
-			(*i)->set_outline_color (UIConfiguration::instance().get_SelectedCrossfadeEditorWave());
-			(*i)->set_fill_color (UIConfiguration::instance().get_SelectedCrossfadeEditorWave());
-		}
-
-		fade[Out].line->set_outline_color (UIConfiguration::instance().get_SelectedCrossfadeEditorLine());
-		fade[In].line->set_outline_color (UIConfiguration::instance().get_CrossfadeEditorLine());
-		fade[In].shading->hide();
-		fade[Out].shading->show();
-
-		for (list<Point*>::iterator i = fade[In].points.begin(); i != fade[In].points.end(); ++i) {
-			(*i)->box->hide();
-		}
-
-		for (list<Point*>::iterator i = fade[Out].points.begin(); i != fade[Out].points.end(); ++i) {
-			(*i)->box->show();
-		}
-
-	}
-}
-
-double
-CrossfadeEditor::x_coordinate (double& xfract) const
-{
-	xfract = min (1.0, xfract);
-	xfract = max (0.0, xfract);
-
-	return canvas_border + (xfract * effective_width());
-}
-
-double
-CrossfadeEditor::y_coordinate (double& yfract) const
-{
-	yfract = min (1.0, yfract);
-	yfract = max (0.0, yfract);
-
-	return (canvas->get_allocation().get_height() - (canvas_border)) - (yfract * effective_height());
-}
-
-void
-CrossfadeEditor::make_waves (boost::shared_ptr<AudioRegion> region, WhichFade which)
-{
-	gdouble ht;
-	uint32_t nchans = region->n_channels();
-	guint32 color;
-	double spu;
-
-	if (which == In) {
-		color = UIConfiguration::instance().get_SelectedCrossfadeEditorWave();
-	} else {
-		color = UIConfiguration::instance().get_CrossfadeEditorWave();
-	}
-
-	ht = canvas->get_allocation().get_height() / (double) nchans;
-	spu = xfade->length() / (double) effective_width();
-
-	delete _peaks_ready_connection;
-	_peaks_ready_connection = 0;
-
-	for (uint32_t n = 0; n < nchans; ++n) {
-
-		gdouble yoff = n * ht;
-
-		if (region->audio_source(n)->peaks_ready (boost::bind (&CrossfadeEditor::peaks_ready, this, boost::weak_ptr<AudioRegion>(region), which), &_peaks_ready_connection, gui_context())) {
-			ArdourCanvas::WaveView* waveview = new ArdourCanvas::WaveView (canvas->root(), region);
-
-			waveview->set_channel (n);
-			waveview->property_gain_function() = (void*) curve_get_vector_from_c;
-			waveview->property_gain_src() = static_cast<Evoral::Curve*>(&fade[which].gain_curve.curve());
-			waveview->set_x_position (canvas_border);
-			waveview->set_y_position (yoff);
-			waveview->set_height (ht);
-			waveview->set_samples_per_pixel (spu);
-			waveview->property_amplitude_above_axis() = 2.0;
-			waveview->set_outline_color (color);
-			waveview->set_fill_color (color);
-
-			if (which != In) {
-				waveview->set_region_start (region->start() + region->length() - xfade->length());
-			}
-
-			waveview->lower_to_bottom();
-			fade[which].waves.push_back (waveview);
-		}
-	}
-
-	toplevel->lower_to_bottom();
-}
-
-void
-CrossfadeEditor::peaks_ready (boost::weak_ptr<AudioRegion> wr, WhichFade which)
-{
-	boost::shared_ptr<AudioRegion> r (wr.lock());
-
-	if (!r) {
-		return;
-	}
-
-	/* this should never be called, because the peak files for an xfade
-	   will be ready by the time we want them. but our API forces us
-	   to provide this, so ..
-	*/
-	delete _peaks_ready_connection;
-	_peaks_ready_connection = 0;
-
-	make_waves (r, which);
-}
-
-void
-CrossfadeEditor::audition (Audition which)
-{
-	AudioPlaylist& pl (_session->the_auditioner()->prepare_playlist());
-	framecnt_t preroll;
-	framecnt_t postroll;
-	framecnt_t left_start_offset;
-	framecnt_t right_length;
-	framecnt_t left_length;
-
-	if (which != Right && preroll_button.get_active()) {
-		preroll = _session->frame_rate() * 2;  //2 second hardcoded preroll for now
-	} else {
-		preroll = 0;
-	}
-
-	if (which != Left && postroll_button.get_active()) {
-		postroll = _session->frame_rate() * 2;  //2 second hardcoded postroll for now
-	} else {
-		postroll = 0;
-	}
-
-	// Is there enough data for the whole preroll?
-	left_length = xfade->length();
-	if ((left_start_offset = xfade->out()->length() - xfade->length()) > preroll) {
-		left_start_offset -= preroll;
-	} else {
-		preroll = left_start_offset;
-		left_start_offset = 0;
-	}
-	left_length += preroll;
-
-	// Is there enough data for the whole postroll?
-	right_length = xfade->length();
-	if ((xfade->in()->length() - right_length) > postroll) {
-		right_length += postroll;
-	} else {
-		right_length = xfade->in()->length();
-	}
-
-	PropertyList left_plist;
-	PropertyList right_plist;
-
-
-	left_plist.add (ARDOUR::Properties::start, left_start_offset);
-	left_plist.add (ARDOUR::Properties::length, left_length);
-	left_plist.add (ARDOUR::Properties::name, string ("xfade out"));
-	left_plist.add (ARDOUR::Properties::layer, 0);
-	left_plist.add (ARDOUR::Properties::fade_in_active, true);
-
-	right_plist.add (ARDOUR::Properties::start, 0);
-	right_plist.add (ARDOUR::Properties::length, right_length);
-	right_plist.add (ARDOUR::Properties::name, string("xfade in"));
-	right_plist.add (ARDOUR::Properties::layer, 0);
-	right_plist.add (ARDOUR::Properties::fade_out_active, true);
-
-	if (which == Left) {
-		right_plist.add (ARDOUR::Properties::scale_amplitude, 0.0f);
-	} else if (which == Right) {
-		left_plist.add (ARDOUR::Properties::scale_amplitude, 0.0f);
-	}
-
-	boost::shared_ptr<AudioRegion> left (boost::dynamic_pointer_cast<AudioRegion>
-						     (RegionFactory::create (xfade->out(), left_plist, false)));
-	boost::shared_ptr<AudioRegion> right (boost::dynamic_pointer_cast<AudioRegion>
-					      (RegionFactory::create (xfade->in(), right_plist, false)));
-
-	// apply a 20ms declicking fade at the start and end of auditioning
-	// XXX this should really be a property
-
-	left->set_fade_in_length (_session->frame_rate() / 50);
-	right->set_fade_out_length (_session->frame_rate() / 50);
-
-	pl.add_region (left, 0);
-	pl.add_region (right, 1 + preroll);
-
-	/* there is only one ... */
-	pl.foreach_crossfade (sigc::mem_fun (*this, &CrossfadeEditor::setup));
-
-	_session->audition_playlist ();
-}
-
-void
-CrossfadeEditor::audition_both ()
-{
-	audition (Both);
-}
-
-void
-CrossfadeEditor::audition_left_dry ()
-{
-	PropertyList plist;
-
-	plist.add (ARDOUR::Properties::start, xfade->out()->length() - xfade->length());
-	plist.add (ARDOUR::Properties::length, xfade->length());
-	plist.add (ARDOUR::Properties::name, string("xfade left"));
-	plist.add (ARDOUR::Properties::layer, 0);
-
-	boost::shared_ptr<AudioRegion> left (boost::dynamic_pointer_cast<AudioRegion>
-					     (RegionFactory::create (xfade->out(), plist, false)));
-
-	_session->audition_region (left);
-}
-
-void
-CrossfadeEditor::audition_left ()
-{
-	audition (Left);
-}
-
-void
-CrossfadeEditor::audition_right_dry ()
-{
-	PropertyList plist;
-
-	plist.add (ARDOUR::Properties::start, 0);
-	plist.add (ARDOUR::Properties::length, xfade->length());
-	plist.add (ARDOUR::Properties::name, string ("xfade right"));
-	plist.add (ARDOUR::Properties::layer, 0);
-
-	boost::shared_ptr<AudioRegion> right (boost::dynamic_pointer_cast<AudioRegion>
-					      (RegionFactory::create (xfade->in(), plist, false)));
-
-	_session->audition_region (right);
-}
-
-void
-CrossfadeEditor::audition_right ()
-{
-	audition (Right);
-}
-
-void
-CrossfadeEditor::cancel_audition ()
-{
-	_session->cancel_audition ();
-}
-
-void
-CrossfadeEditor::audition_toggled ()
-{
-	bool x;
-
-	if ((x = audition_both_button.get_active ()) != _session->is_auditioning()) {
-
-		if (x) {
-			audition_both ();
-		} else {
-			cancel_audition ();
-		}
-	}
-}
-
-void
-CrossfadeEditor::audition_right_toggled ()
-{
-	bool x;
-
-	if ((x = audition_right_button.get_active ()) != _session->is_auditioning()) {
-
-		if (x) {
-			audition_right ();
-		} else {
-			cancel_audition ();
-		}
-	}
-}
-
-void
-CrossfadeEditor::audition_right_dry_toggled ()
-{
-	bool x;
-
-	if ((x = audition_right_dry_button.get_active ()) != _session->is_auditioning()) {
-
-		if (x) {
-			audition_right_dry ();
-		} else {
-			cancel_audition ();
-		}
-	}
-}
-
-void
-CrossfadeEditor::audition_left_toggled ()
-{
-	bool x;
-
-	if ((x = audition_left_button.get_active ()) != _session->is_auditioning()) {
-
-		if (x) {
-			audition_left ();
-		} else {
-			cancel_audition ();
-		}
-	}
-}
-
-void
-CrossfadeEditor::audition_left_dry_toggled ()
-{
-	bool x;
-
-	if ((x = audition_left_dry_button.get_active ()) != _session->is_auditioning()) {
-
-		if (x) {
-			audition_left_dry ();
-		} else {
-			cancel_audition ();
-		}
-	}
-}
-
-bool
-CrossfadeEditor::on_key_press_event (GdkEventKey */*ev*/)
-{
-	return true;
-}
-
-bool
-CrossfadeEditor::on_key_release_event (GdkEventKey* ev)
-{
-	switch (ev->keyval) {
-	case GDK_Right:
-		if (Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier)) {
-			audition_right_dry_button.set_active (!audition_right_dry_button.get_active());
-		} else {
-			audition_right_button.set_active (!audition_right_button.get_active());
-		}
-		break;
-
-	case GDK_Left:
-		if (Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier)) {
-			audition_left_dry_button.set_active (!audition_left_dry_button.get_active());
-		} else {
-			audition_left_button.set_active (!audition_left_button.get_active());
-		}
-		break;
-
-	case GDK_space:
-		if (_session->is_auditioning()) {
-			cancel_audition ();
-		} else {
-			audition_both_button.set_active (!audition_both_button.get_active());
-		}
-		break;
-
-	default:
-		break;
-	}
-
-	return true;
-}
diff --git a/gtk2_ardour/dark.colors b/gtk2_ardour/dark.colors
deleted file mode 100644
index 2cdc39d..0000000
--- a/gtk2_ardour/dark.colors
+++ /dev/null
@@ -1,512 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<Ardour>
-  <Colors>
-    <Color name="color 1" value="0x20b2b2ff"/>
-    <Color name="color 10" value="0xf0f0f0ff"/>
-    <Color name="color 100" value="0xe49c9cff"/>
-    <Color name="color 101" value="0xa06000ff"/>
-    <Color name="color 103" value="0x1e7727ff"/>
-    <Color name="color 104" value="0x7f7f7fff"/>
-    <Color name="color 11" value="0x9496a3ff"/>
-    <Color name="color 12" value="0x18ab27ff"/>
-    <Color name="color 13" value="0xffffffff"/>
-    <Color name="color 14" value="0x55ccccff"/>
-    <Color name="color 15" value="0x282b49ff"/>
-    <Color name="color 16" value="0x526d94ff"/>
-    <Color name="color 17" value="0x00ff1aff"/>
-    <Color name="color 18" value="0x001affff"/>
-    <Color name="color 19" value="0xdd6363ff"/>
-    <Color name="color 2" value="0x595959ff"/>
-    <Color name="color 20" value="0x684d4dff"/>
-    <Color name="color 21" value="0x969696ff"/>
-    <Color name="color 22" value="0xe5e5e5ff"/>
-    <Color name="color 23" value="0x8000ffff"/>
-    <Color name="color 24" value="0x9fbca2ff"/>
-    <Color name="color 25" value="0x4a4a4aff"/>
-    <Color name="color 26" value="0xc7c9d8ff"/>
-    <Color name="color 27" value="0x191919ff"/>
-    <Color name="color 28" value="0x5d3e7cff"/>
-    <Color name="color 29" value="0x202020ff"/>
-    <Color name="color 3" value="0x738299ff"/>
-    <Color name="color 30" value="0xe500cfff"/>
-    <Color name="color 31" value="0xddddd8ff"/>
-    <Color name="color 32" value="0xeddc3d77"/>
-    <Color name="color 33" value="0xbbbbbbff"/>
-    <Color name="color 34" value="0x3d3d3dff"/>
-    <Color name="color 35" value="0x4250d0ff"/>
-    <Color name="color 36" value="0x473212ff"/>
-    <Color name="color 37" value="0x67cb4eff"/>
-    <Color name="color 38" value="0x1ee8acff"/>
-    <Color name="color 39" value="0x35965cff"/>
-    <Color name="color 4" value="0x000000ff"/>
-    <Color name="color 40" value="0x7c3a3aff"/>
-    <Color name="color 41" value="0x497a5dff"/>
-    <Color name="color 42" value="0x404145ff"/>
-    <Color name="color 43" value="0x000424ff"/>
-    <Color name="color 44" value="0x004f08ff"/>
-    <Color name="color 45" value="0xa29e9eff"/>
-    <Color name="color 46" value="0x333333ff"/>
-    <Color name="color 47" value="0x00880eff"/>
-    <Color name="color 48" value="0x00aa11ff"/>
-    <Color name="color 49" value="0x00660aff"/>
-    <Color name="color 5" value="0x9dadc4ff"/>
-    <Color name="color 50" value="0xeeeeecff"/>
-    <Color name="color 51" value="0x383d37ff"/>
-    <Color name="color 52" value="0xe8faa1ff"/>
-    <Color name="color 53" value="0xf2c37dff"/>
-    <Color name="color 54" value="0xf48352ff"/>
-    <Color name="color 55" value="0xf85813ff"/>
-    <Color name="color 56" value="0x8ec794ff"/>
-    <Color name="color 57" value="0x7ea854ff"/>
-    <Color name="color 58" value="0x474f3fff"/>
-    <Color name="color 59" value="0xb2baffff"/>
-    <Color name="color 6" value="0x44bc50ff"/>
-    <Color name="color 60" value="0x50545aff"/>
-    <Color name="color 61" value="0x20242aff"/>
-    <Color name="color 62" value="0x8894ffff"/>
-    <Color name="color 63" value="0x5566ffff"/>
-    <Color name="color 64" value="0xa7acd4ff"/>
-    <Color name="color 65" value="0xb8cca3ff"/>
-    <Color name="color 66" value="0x4f2f00ff"/>
-    <Color name="color 67" value="0x121212ff"/>
-    <Color name="color 68" value="0xc57805ff"/>
-    <Color name="color 69" value="0x660000ff"/>
-    <Color name="color 7" value="0x282828ff"/>
-    <Color name="color 70" value="0x304057ff"/>
-    <Color name="color 71" value="0x5f5a58ff"/>
-    <Color name="color 72" value="0xe58b05ff"/>
-    <Color name="color 73" value="0x3240c0ff"/>
-    <Color name="color 74" value="0x7a9bccff"/>
-    <Color name="color 75" value="0xbba900ff"/>
-    <Color name="color 76" value="0x6c6e6aff"/>
-    <Color name="color 77" value="0x7aadf9ff"/>
-    <Color name="color 78" value="0x256f8fff"/>
-    <Color name="color 79" value="0x254528ff"/>
-    <Color name="color 8" value="0xff9900ff"/>
-    <Color name="color 80" value="0x603535ff"/>
-    <Color name="color 81" value="0xa5a5a5ff"/>
-    <Color name="color 82" value="0xd8d8d8ff"/>
-    <Color name="color 83" value="0xa80000ff"/>
-    <Color name="color 84" value="0x7b354aff"/>
-    <Color name="color 85" value="0xffa3bfff"/>
-    <Color name="color 86" value="0xcc2828ff"/>
-    <Color name="color 87" value="0x505050ff"/>
-    <Color name="color 88" value="0xc6c6c6ff"/>
-    <Color name="color 89" value="0xb6e8fdff"/>
-    <Color name="color 9" value="0xf10000ff"/>
-    <Color name="color 90" value="0x2c2121ff"/>
-    <Color name="color 91" value="0x8ef823ff"/>
-    <Color name="color 92" value="0x8cd8f8ff"/>
-    <Color name="color 93" value="0x51578aff"/>
-    <Color name="color 94" value="0x636363ff"/>
-    <Color name="color 95" value="0xe4f4d3ff"/>
-    <Color name="color 96" value="0x85e524ff"/>
-    <Color name="color 97" value="0xccccccff"/>
-    <Color name="color 98" value="0x9e00ffff"/>
-    <Color name="color 99" value="0x5da3c1ff"/>
-    <Color name="meter color0" value="0x008800ff"/>
-    <Color name="meter color1" value="0x00aa00ff"/>
-    <Color name="meter color2" value="0x00ff00ff"/>
-    <Color name="meter color3" value="0x00ff00ff"/>
-    <Color name="meter color4" value="0xfff000ff"/>
-    <Color name="meter color5" value="0xfff000ff"/>
-    <Color name="meter color6" value="0xff8800ff"/>
-    <Color name="meter color7" value="0xff8800ff"/>
-    <Color name="meter color8" value="0xff0000ff"/>
-    <Color name="meter color9" value="0xff0000ff"/>
-  </Colors>
-  <ColorAliases>
-    <ColorAlias name="active crossfade" alias="color 1"/>
-    <ColorAlias name="arrange base" alias="color 34"/>
-    <ColorAlias name="audio automation track fill" alias="color 70"/>
-    <ColorAlias name="audio bus base" alias="color 3"/>
-    <ColorAlias name="audio master bus base" alias="color 4"/>
-    <ColorAlias name="audio track base" alias="color 77"/>
-    <ColorAlias name="automation line" alias="color 6"/>
-    <ColorAlias name="automation track outline" alias="color 7"/>
-    <ColorAlias name="big clock active: background" alias="color 4"/>
-    <ColorAlias name="big clock active: cursor" alias="color 8"/>
-    <ColorAlias name="big clock active: edited text" alias="color 8"/>
-    <ColorAlias name="big clock active: text" alias="color 9"/>
-    <ColorAlias name="big clock: background" alias="color 67"/>
-    <ColorAlias name="big clock: cursor" alias="color 8"/>
-    <ColorAlias name="big clock: edited text" alias="color 8"/>
-    <ColorAlias name="big clock: text" alias="color 10"/>
-    <ColorAlias name="border color" alias="color 4"/>
-    <ColorAlias name="cd marker bar" alias="color 87"/>
-    <ColorAlias name="clipped waveform" alias="color 9"/>
-    <ColorAlias name="clock: background" alias="color 67"/>
-    <ColorAlias name="clock: cursor" alias="color 8"/>
-    <ColorAlias name="clock: edited text" alias="color 8"/>
-    <ColorAlias name="clock: text" alias="color 12"/>
-    <ColorAlias name="control point fill" alias="color 17"/>
-    <ColorAlias name="control point outline" alias="meter color3"/>
-    <ColorAlias name="control point selected fill" alias="color 72"/>
-    <ColorAlias name="control point selected outline" alias="color 9"/>
-    <ColorAlias name="covered region" alias="color 87"/>
-    <ColorAlias name="crossfade editor base" alias="color 15"/>
-    <ColorAlias name="crossfade editor line" alias="color 4"/>
-    <ColorAlias name="crossfade editor line shading" alias="color 16"/>
-    <ColorAlias name="crossfade editor point fill" alias="color 17"/>
-    <ColorAlias name="crossfade editor point outline" alias="color 18"/>
-    <ColorAlias name="crossfade editor wave" alias="color 13"/>
-    <ColorAlias name="crossfade line" alias="color 4"/>
-    <ColorAlias name="edit point" alias="color 18"/>
-    <ColorAlias name="entered automation line" alias="color 19"/>
-    <ColorAlias name="entered gain line" alias="color 19"/>
-    <ColorAlias name="entered marker" alias="color 19"/>
-    <ColorAlias name="feedback alert: fill" alias="color 20"/>
-    <ColorAlias name="feedback alert: fill active" alias="color 9"/>
-    <ColorAlias name="feedback alert: led active" alias="color 4"/>
-    <ColorAlias name="frame handle" alias="color 23"/>
-    <ColorAlias name="gain line" alias="color 6"/>
-    <ColorAlias name="gain line inactive" alias="color 24"/>
-    <ColorAlias name="generic button: fill" alias="color 25"/>
-    <ColorAlias name="generic button: fill active" alias="color 9"/>
-    <ColorAlias name="generic button: led active" alias="color 18"/>
-    <ColorAlias name="ghost track base" alias="color 46"/>
-    <ColorAlias name="ghost track midi outline" alias="color 4"/>
-    <ColorAlias name="ghost track wave" alias="color 29"/>
-    <ColorAlias name="ghost track wave clip" alias="color 29"/>
-    <ColorAlias name="ghost track wave fill" alias="color 29"/>
-    <ColorAlias name="ghost track zero line" alias="color 30"/>
-    <ColorAlias name="gtk_arm" alias="color 9"/>
-    <ColorAlias name="gtk_audio_bus" alias="color 61"/>
-    <ColorAlias name="gtk_audio_track" alias="color 70"/>
-    <ColorAlias name="gtk_automation_track_header" alias="color 42"/>
-    <ColorAlias name="gtk_background" alias="color 34"/>
-    <ColorAlias name="gtk_bases" alias="color 27"/>
-    <ColorAlias name="gtk_bg_selected" alias="color 99"/>
-    <ColorAlias name="gtk_bg_tooltip" alias="color 52"/>
-    <ColorAlias name="gtk_bright_color" alias="color 74"/>
-    <ColorAlias name="gtk_bright_indicator" alias="color 9"/>
-    <ColorAlias name="gtk_contrasting_indicator" alias="color 91"/>
-    <ColorAlias name="gtk_control_base" alias="color 61"/>
-    <ColorAlias name="gtk_control_text" alias="color 26"/>
-    <ColorAlias name="gtk_control_text2" alias="color 83"/>
-    <ColorAlias name="gtk_darkest" alias="color 67"/>
-    <ColorAlias name="gtk_fg_selected" alias="color 67"/>
-    <ColorAlias name="gtk_fg_tooltip" alias="color 29"/>
-    <ColorAlias name="gtk_foreground" alias="color 50"/>
-    <ColorAlias name="gtk_light_text_on_dark" alias="color 31"/>
-    <ColorAlias name="gtk_lightest" alias="color 13"/>
-    <ColorAlias name="gtk_midi_channel_selector" alias="color 44"/>
-    <ColorAlias name="gtk_midi_track" alias="color 58"/>
-    <ColorAlias name="gtk_monitor" alias="color 8"/>
-    <ColorAlias name="gtk_mono" alias="color 95"/>
-    <ColorAlias name="gtk_mute" alias="color 52"/>
-    <ColorAlias name="gtk_not_so_bright_indicator" alias="color 32"/>
-    <ColorAlias name="gtk_processor_fader" alias="color 94"/>
-    <ColorAlias name="gtk_processor_fader_frame" alias="color 104"/>
-    <ColorAlias name="gtk_processor_frame_selected" alias="color 32"/>
-    <ColorAlias name="gtk_processor_postfader" alias="color 79"/>
-    <ColorAlias name="gtk_processor_postfader_frame" alias="color 103"/>
-    <ColorAlias name="gtk_processor_prefader" alias="color 69"/>
-    <ColorAlias name="gtk_processor_prefader_frame" alias="color 69"/>
-    <ColorAlias name="gtk_send_bg" alias="color 38"/>
-    <ColorAlias name="gtk_send_fg" alias="color 24"/>
-    <ColorAlias name="gtk_solo" alias="color 91"/>
-    <ColorAlias name="gtk_somewhat_bright_indicator" alias="color 89"/>
-    <ColorAlias name="gtk_texts" alias="color 50"/>
-    <ColorAlias name="gtk_track_header_inactive" alias="color 34"/>
-    <ColorAlias name="gtk_track_header_selected" alias="color 40"/>
-    <ColorAlias name="image track" alias="color 31"/>
-    <ColorAlias name="inactive crossfade" alias="color 32"/>
-    <ColorAlias name="inactive fade handle" alias="color 33"/>
-    <ColorAlias name="inactive group tab" alias="color 34"/>
-    <ColorAlias name="invert button: fill active" alias="color 35"/>
-    <ColorAlias name="invert button: led active" alias="color 37"/>
-    <ColorAlias name="location cd marker" alias="color 38"/>
-    <ColorAlias name="location loop" alias="color 39"/>
-    <ColorAlias name="location marker" alias="color 32"/>
-    <ColorAlias name="location punch" alias="color 40"/>
-    <ColorAlias name="location range" alias="color 41"/>
-    <ColorAlias name="lock button: fill active" alias="color 42"/>
-    <ColorAlias name="lock button: led active" alias="color 4"/>
-    <ColorAlias name="marker bar" alias="color 2"/>
-    <ColorAlias name="marker bar separator" alias="color 27"/>
-    <ColorAlias name="marker drag line" alias="color 44"/>
-    <ColorAlias name="marker label" alias="color 4"/>
-    <ColorAlias name="marker track" alias="color 31"/>
-    <ColorAlias name="master monitor section button normal: fill active" alias="color 42"/>
-    <ColorAlias name="master monitor section button active: fill"        alias="color 40"/>
-    <ColorAlias name="master monitor section button active: fill active" alias="color 54"/>
-    <ColorAlias name="measure line bar" alias="color 13"/>
-    <ColorAlias name="measure line beat" alias="color 33"/>
-    <ColorAlias name="meter background bottom" alias="color 46"/>
-    <ColorAlias name="meter background top" alias="color 34"/>
-    <ColorAlias name="meter bar" alias="color 7"/>
-    <ColorAlias name="meter color BBC" alias="color 8"/>
-    <ColorAlias name="meter marker" alias="color 19"/>
-    <ColorAlias name="meterbridge label: fill" alias="color 34"/>
-    <ColorAlias name="meterbridge label: fill active" alias="color 46"/>
-    <ColorAlias name="meterbridge label: led" alias="color 9"/>
-    <ColorAlias name="meterbridge label: led active" alias="color 9"/>
-    <ColorAlias name="meterbridge peakindicator: fill" alias="color 34"/>
-    <ColorAlias name="meterbridge peakindicator: fill active" alias="color 9"/>
-    <ColorAlias name="meterbridge peakindicator: led" alias="color 9"/>
-    <ColorAlias name="meterbridge peakindicator: led active" alias="color 9"/>
-    <ColorAlias name="meterbridge peaklabel" alias="color 9"/>
-    <ColorAlias name="meterstrip dpm bg" alias="color 27"/>
-    <ColorAlias name="meterstrip dpm fg" alias="color 31"/>
-    <ColorAlias name="meterstrip ppm bg" alias="color 27"/>
-    <ColorAlias name="meterstrip ppm fg" alias="color 31"/>
-    <ColorAlias name="meterstrip vu bg" alias="color 32"/>
-    <ColorAlias name="meterstrip vu fg" alias="color 4"/>
-    <ColorAlias name="midi automation track fill" alias="color 58"/>
-    <ColorAlias name="midi bus base" alias="color 4"/>
-    <ColorAlias name="midi device: fill" alias="color 25"/>
-    <ColorAlias name="midi device: fill active" alias="color 42"/>
-    <ColorAlias name="midi device: led active" alias="color 17"/>
-    <ColorAlias name="midi frame base" alias="color 87"/>
-    <ColorAlias name="midi input button: fill active" alias="color 48"/>
-    <ColorAlias name="midi input button: led active" alias="color 4"/>
-    <ColorAlias name="midi meter color0" alias="color 52"/>
-    <ColorAlias name="midi meter color1" alias="color 53"/>
-    <ColorAlias name="midi meter color2" alias="color 53"/>
-    <ColorAlias name="midi meter color3" alias="color 54"/>
-    <ColorAlias name="midi meter color4" alias="color 54"/>
-    <ColorAlias name="midi meter color5" alias="color 55"/>
-    <ColorAlias name="midi meter color6" alias="color 55"/>
-    <ColorAlias name="midi meter color7" alias="color 56"/>
-    <ColorAlias name="midi meter color8" alias="color 56"/>
-    <ColorAlias name="midi meter color9" alias="color 17"/>
-    <ColorAlias name="midi note inactive channel" alias="color 4"/>
-    <ColorAlias name="midi note max" alias="color 8"/>
-    <ColorAlias name="midi note mid" alias="color 96"/>
-    <ColorAlias name="midi note min" alias="color 103"/>
-    <ColorAlias name="midi note selected" alias="color 40"/>
-    <ColorAlias name="midi note selected outline" alias="color 9"/>
-    <ColorAlias name="midi note velocity text" alias="color 32"/>
-    <ColorAlias name="midi patch change fill" alias="color 60"/>
-    <ColorAlias name="midi patch change outline" alias="color 26"/>
-    <ColorAlias name="midi select rect outline" alias="color 63"/>
-    <ColorAlias name="midi sysex fill" alias="color 32"/>
-    <ColorAlias name="midi sysex outline" alias="color 64"/>
-    <ColorAlias name="midi track base" alias="color 41"/>
-    <ColorAlias name="mixer strip button: fill active" alias="color 8"/>
-    <ColorAlias name="mixer strip button: led active" alias="color 8"/>
-    <ColorAlias name="mixer strip name button: fill active" alias="color 67"/>
-    <ColorAlias name="mixer strip name button: led active" alias="color 8"/>
-    <ColorAlias name="monitor button: fill active" alias="color 68"/>
-    <ColorAlias name="monitor button: led active" alias="color 9"/>
-    <ColorAlias name="monitor section knob" alias="color 60"/>
-    <ColorAlias name="monitor section knob: arc end" alias="color 70"/>
-    <ColorAlias name="monitor section knob: arc start" alias="color 16"/>
-    <ColorAlias name="monitor section mono: fill" alias="color 71"/>
-    <ColorAlias name="monitor section mono: fill active" alias="color 73"/>
-    <ColorAlias name="monitor section mono: led active" alias="color 37"/>
-    <ColorAlias name="monitor section dim: fill" alias="color 71"/>
-    <ColorAlias name="monitor section dim: fill active" alias="color 72"/>
-    <ColorAlias name="monitor section dim: led active" alias="color 37"/>
-    <ColorAlias name="monitor section solo model: fill" alias="color 71"/>
-    <ColorAlias name="monitor section solo model: fill active" alias="color 42"/>
-    <ColorAlias name="monitor section solo model: led active" alias="color 8"/>
-    <ColorAlias name="monitor section solo option: fill" alias="color 71"/>
-    <ColorAlias name="monitor section solo option: fill active" alias="color 42"/>
-    <ColorAlias name="monitor section solo option: led active" alias="color 8"/>
-    <ColorAlias name="monitor section processors toggle: fill active" alias="color 42"/>
-    <ColorAlias name="monitor section processors present: fill" alias="color 20"/>
-    <ColorAlias name="mono panner bg" alias="color 67"/>
-    <ColorAlias name="mono panner fill" alias="color 74"/>
-    <ColorAlias name="mono panner outline" alias="color 70"/>
-    <ColorAlias name="mono panner position fill" alias="color 11"/>
-    <ColorAlias name="mono panner position outline" alias="color 70"/>
-    <ColorAlias name="mono panner text" alias="color 4"/>
-    <ColorAlias name="mouse mode button: fill active" alias="color 12"/>
-    <ColorAlias name="mouse mode button: led active" alias="color 8"/>
-    <ColorAlias name="mute button: fill active" alias="color 75"/>
-    <ColorAlias name="mute button: led active" alias="color 4"/>
-    <ColorAlias name="name highlight fill" alias="color 18"/>
-    <ColorAlias name="name highlight outline" alias="color 23"/>
-    <ColorAlias name="nudge button: fill" alias="color 20"/>
-    <ColorAlias name="nudge button: fill active" alias="color 42"/>
-    <ColorAlias name="nudge button: led active" alias="color 8"/>
-    <ColorAlias name="nudge clock: background" alias="color 67"/>
-    <ColorAlias name="nudge clock: cursor" alias="color 8"/>
-    <ColorAlias name="nudge clock: edited text" alias="color 8"/>
-    <ColorAlias name="nudge clock: text" alias="color 12"/>
-    <ColorAlias name="piano roll black" alias="color 76"/>
-    <ColorAlias name="piano roll black outline" alias="color 33"/>
-    <ColorAlias name="piano roll white" alias="color 45"/>
-    <ColorAlias name="play head" alias="color 9"/>
-    <ColorAlias name="plugin bypass button: led active" alias="color 8"/>
-    <ColorAlias name="pluginlist hide button: led active" alias="color 14"/>
-    <ColorAlias name="pluginlist filter button: fill active" alias="color 14"/>
-    <ColorAlias name="processor automation line" alias="color 77"/>
-    <ColorAlias name="processor control button: fill" alias="color 29"/>
-    <ColorAlias name="processor control button: fill active" alias="color 46"/>
-    <ColorAlias name="processor control button: led active" alias="color 62"/>
-    <ColorAlias name="processor fader: fill" alias="color 16"/>
-    <ColorAlias name="processor fader: fill active" alias="color 78"/>
-    <ColorAlias name="processor fader: led active" alias="color 37"/>
-    <ColorAlias name="processor postfader: fill" alias="color 58"/>
-    <ColorAlias name="processor postfader: fill active" alias="color 79"/>
-    <ColorAlias name="processor postfader: led active" alias="color 37"/>
-    <ColorAlias name="processor prefader: fill" alias="color 40"/>
-    <ColorAlias name="processor prefader: fill active" alias="color 80"/>
-    <ColorAlias name="processor prefader: led active" alias="color 37"/>
-    <ColorAlias name="processor stub: fill" alias="color 46"/>
-    <ColorAlias name="processor stub: fill active" alias="color 46"/>
-    <ColorAlias name="punch button: fill" alias="color 20"/>
-    <ColorAlias name="punch button: fill active" alias="color 9"/>
-    <ColorAlias name="punch button: led active" alias="color 4"/>
-    <ColorAlias name="punch clock: background" alias="color 67"/>
-    <ColorAlias name="punch clock: cursor" alias="color 9"/>
-    <ColorAlias name="punch clock: edited text" alias="color 9"/>
-    <ColorAlias name="punch clock: text" alias="color 12"/>
-    <ColorAlias name="punch line" alias="color 83"/>
-    <ColorAlias name="range drag bar rect" alias="color 21"/>
-    <ColorAlias name="range drag rect" alias="color 56"/>
-    <ColorAlias name="range marker bar" alias="color 34"/>
-    <ColorAlias name="record enable button: fill active" alias="color 83"/>
-    <ColorAlias name="record enable button: led active" alias="color 85"/>
-    <ColorAlias name="recording rect" alias="color 86"/>
-    <ColorAlias name="recording waveform fill" alias="color 13"/>
-    <ColorAlias name="recording waveform outline" alias="color 43"/>
-    <ColorAlias name="region list automatic" alias="color 53"/>
-    <ColorAlias name="region list missing source" alias="color 9"/>
-    <ColorAlias name="region list whole file" alias="color 1"/>
-    <ColorAlias name="route button: fill active" alias="color 67"/>
-    <ColorAlias name="route button: led active" alias="color 8"/>
-    <ColorAlias name="rubber band rect" alias="color 88"/>
-    <ColorAlias name="rude audition: fill" alias="color 20"/>
-    <ColorAlias name="rude audition: fill active" alias="color 86"/>
-    <ColorAlias name="rude audition: led active" alias="color 4"/>
-    <ColorAlias name="rude isolate: fill" alias="color 42"/>
-    <ColorAlias name="rude isolate: fill active" alias="color 89"/>
-    <ColorAlias name="rude isolate: led active" alias="color 4"/>
-    <ColorAlias name="rude solo: fill" alias="color 20"/>
-    <ColorAlias name="rude solo: fill active" alias="color 86"/>
-    <ColorAlias name="rude solo: led active" alias="color 4"/>
-    <ColorAlias name="ruler base" alias="color 67"/>
-    <ColorAlias name="ruler text" alias="color 22"/>
-    <ColorAlias name="secondary clock: background" alias="color 67"/>
-    <ColorAlias name="secondary clock: cursor" alias="color 8"/>
-    <ColorAlias name="secondary clock: edited text" alias="color 8"/>
-    <ColorAlias name="secondary clock: text" alias="color 91"/>
-    <ColorAlias name="secondary delta clock: background" alias="color 67"/>
-    <ColorAlias name="secondary delta clock: cursor" alias="color 9"/>
-    <ColorAlias name="secondary delta clock: edited text" alias="color 9"/>
-    <ColorAlias name="secondary delta clock: text" alias="color 92"/>
-    <ColorAlias name="selected midi note frame" alias="color 86"/>
-    <ColorAlias name="selected region base" alias="color 25"/>
-    <ColorAlias name="selected time axis frame" alias="color 86"/>
-    <ColorAlias name="selected waveform fill" alias="color 8"/>
-    <ColorAlias name="selected waveform outline" alias="color 67"/>
-    <ColorAlias name="selection" alias="color 94"/>
-    <ColorAlias name="selection clock: background" alias="color 67"/>
-    <ColorAlias name="selection clock: cursor" alias="color 9"/>
-    <ColorAlias name="selection clock: edited text" alias="color 9"/>
-    <ColorAlias name="selection clock: text" alias="color 12"/>
-    <ColorAlias name="selection rect" alias="color 95"/>
-    <ColorAlias name="send alert button: fill" alias="color 71"/>
-    <ColorAlias name="send alert button: fill active" alias="color 38"/>
-    <ColorAlias name="send alert button: led active" alias="color 4"/>
-    <ColorAlias name="send bg" alias="color 38"/>
-    <ColorAlias name="shuttle" alias="color 12"/>
-    <ColorAlias name="silence" alias="color 98"/>
-    <ColorAlias name="silence text" alias="color 10"/>
-    <ColorAlias name="solo button: fill active" alias="color 12"/>
-    <ColorAlias name="solo button: led active" alias="color 4"/>
-    <ColorAlias name="solo isolate: fill" alias="color 25"/>
-    <ColorAlias name="solo isolate: fill active" alias="color 42"/>
-    <ColorAlias name="solo isolate: led active" alias="color 9"/>
-    <ColorAlias name="solo safe: fill" alias="color 25"/>
-    <ColorAlias name="solo safe: fill active" alias="color 42"/>
-    <ColorAlias name="solo safe: led active" alias="color 9"/>
-    <ColorAlias name="stereo panner bg" alias="color 67"/>
-    <ColorAlias name="stereo panner fill" alias="color 74"/>
-    <ColorAlias name="stereo panner inverted bg" alias="color 61"/>
-    <ColorAlias name="stereo panner inverted fill" alias="color 100"/>
-    <ColorAlias name="stereo panner inverted outline" alias="color 83"/>
-    <ColorAlias name="stereo panner inverted text" alias="color 4"/>
-    <ColorAlias name="stereo panner mono bg" alias="color 67"/>
-    <ColorAlias name="stereo panner mono fill" alias="color 54"/>
-    <ColorAlias name="stereo panner mono outline" alias="color 101"/>
-    <ColorAlias name="stereo panner mono text" alias="color 4"/>
-    <ColorAlias name="stereo panner outline" alias="color 70"/>
-    <ColorAlias name="stereo panner rule" alias="color 70"/>
-    <ColorAlias name="stereo panner text" alias="color 4"/>
-    <ColorAlias name="sync mark" alias="color 75"/>
-    <ColorAlias name="tempo bar" alias="color 46"/>
-    <ColorAlias name="tempo marker" alias="color 19"/>
-    <ColorAlias name="time axis frame" alias="color 4"/>
-    <ColorAlias name="time axis view item base" alias="color 94"/>
-    <ColorAlias name="time stretch fill" alias="color 100"/>
-    <ColorAlias name="time stretch outline" alias="color 94"/>
-    <ColorAlias name="tracknumber label: fill" alias="color 34"/>
-    <ColorAlias name="tracknumber label: fill active" alias="color 46"/>
-    <ColorAlias name="tracknumber label: led active" alias="color 9"/>
-    <ColorAlias name="transport active option button: fill active" alias="color 48"/>
-    <ColorAlias name="transport active option button: led active" alias="color 8"/>
-    <ColorAlias name="transport button: fill active" alias="color 48"/>
-    <ColorAlias name="transport button: led active" alias="color 4"/>
-    <ColorAlias name="transport clock: background" alias="color 67"/>
-    <ColorAlias name="transport clock: cursor" alias="color 8"/>
-    <ColorAlias name="transport clock: edited text" alias="color 8"/>
-    <ColorAlias name="transport clock: text" alias="color 91"/>
-    <ColorAlias name="transport delta clock: background" alias="color 67"/>
-    <ColorAlias name="transport delta clock: cursor" alias="color 9"/>
-    <ColorAlias name="transport delta clock: edited text" alias="color 9"/>
-    <ColorAlias name="transport delta clock: text" alias="color 92"/>
-    <ColorAlias name="transport drag rect" alias="color 21"/>
-    <ColorAlias name="transport loop rect" alias="color 103"/>
-    <ColorAlias name="transport marker bar" alias="color 25"/>
-    <ColorAlias name="transport option button: fill active" alias="color 42"/>
-    <ColorAlias name="transport option button: led active" alias="color 8"/>
-    <ColorAlias name="transport punch rect" alias="color 80"/>
-    <ColorAlias name="transport recenable button: fill" alias="color 20"/>
-    <ColorAlias name="transport recenable button: fill active" alias="color 83"/>
-    <ColorAlias name="transport recenable button: led active" alias="color 4"/>
-    <ColorAlias name="trim handle" alias="color 18"/>
-    <ColorAlias name="trim handle locked" alias="color 86"/>
-    <ColorAlias name="trim knob" alias="color 60"/>
-    <ColorAlias name="trim knob: arc end" alias="color 81"/>
-    <ColorAlias name="trim knob: arc start" alias="color 82"/>
-    <ColorAlias name="verbose canvas cursor" alias="color 32"/>
-    <ColorAlias name="video timeline bar" alias="color 46"/>
-    <ColorAlias name="waveform fill" alias="color 13"/>
-    <ColorAlias name="waveform outline" alias="color 4"/>
-    <ColorAlias name="zero line" alias="color 104"/>
-    <ColorAlias name="zoom button: fill active" alias="color 48"/>
-    <ColorAlias name="zoom button: led active" alias="color 8"/>
-  </ColorAliases>
-  <Modifiers>
-    <Modifier name="audio bus base" modifier="= alpha:0.3"/>
-    <Modifier name="audio track base" modifier="= alpha:0.3"/>
-    <Modifier name="automation track fill" modifier="= alpha:0.3"/>
-    <Modifier name="covered region base" modifier="= alpha:0.7"/>
-    <Modifier name="crossfade alpha" modifier="= alpha:0.1803"/>
-    <Modifier name="dragging region" modifier="= alpha:0.9"/>
-    <Modifier name="editable region" modifier="= alpha:0.25"/>
-    <Modifier name="gain line inactive" modifier="= alpha:0.7725"/>
-    <Modifier name="ghost track base" modifier="= alpha:0.640782"/>
-    <Modifier name="ghost track midi fill" modifier="= alpha:0.3"/>
-    <Modifier name="inactive crossfade" modifier="= alpha:0.4666"/>
-    <Modifier name="loop rectangle" modifier="= alpha:0.5"/>
-    <Modifier name="marker bar" modifier="= alpha:0.5"/>
-    <Modifier name="measure line beat" modifier="= alpha:1.0"/>
-    <Modifier name="midi frame base" modifier="= alpha:0.4"/>
-    <Modifier name="midi note" modifier="= alpha:0.8"/>
-    <Modifier name="midi note velocity text" modifier="= alpha:0.4666"/>
-    <Modifier name="midi patch change fill" modifier="= alpha:0.6274"/>
-    <Modifier name="midi sysex fill" modifier="= alpha:0.4666"/>
-    <Modifier name="midi track base" modifier="= alpha:0.3"/>
-    <Modifier name="mono panner position fill" modifier="= alpha:0.8"/>
-    <Modifier name="opaque region base" modifier="= alpha:0.75"/>
-    <Modifier name="panner fill" modifier="= alpha:0.7882"/>
-    <Modifier name="piano roll black" modifier="= alpha:0.2"/>
-    <Modifier name="piano roll white" modifier="= alpha:0.2"/>
-    <Modifier name="recording rect" modifier="= alpha:0.25"/>
-    <Modifier name="selected midi note" modifier="= alpha:0.7529"/>
-    <Modifier name="selection rect" modifier="= alpha:0.4666"/>
-    <Modifier name="silence" modifier="= alpha:0.4784"/>
-    <Modifier name="stereo panner inverted" modifier="= alpha:0.7882"/>
-    <Modifier name="stereo panner inverted bg" modifier="= alpha:0.7529"/>
-    <Modifier name="time axis view item base" modifier="= alpha:0.7"/>
-    <Modifier name="transparent region base" modifier="= alpha:0.6"/>
-   <Modifier name="time stretch fill" modifier="= alpha:0.5"/>
-    <Modifier name="verbose canvas cursor" modifier="= alpha:0.4666"/>
-  </Modifiers>
-</Ardour>
diff --git a/gtk2_ardour/default_ui_config.in b/gtk2_ardour/default_ui_config.in
index 9c815d6..f4c0c37 100644
--- a/gtk2_ardour/default_ui_config.in
+++ b/gtk2_ardour/default_ui_config.in
@@ -3,7 +3,7 @@
   <UI>
     <Option name="icon-set" value="default"/>
     <Option name="ui-rc-file" value="clearlooks.rc"/>
-    <Option name="color-file" value="dark"/>
+    <Option name="color-file" value="dark-ardour"/>
     <Option name="flat-buttons" value="0"/>
     <Option name="blink-rec-arm" value="0"/>
     <Option name="waveform-gradient-depth" value="0"/>
diff --git a/gtk2_ardour/duplicate_routes_dialog.cc b/gtk2_ardour/duplicate_routes_dialog.cc
index b69d17c..05bb878 100644
--- a/gtk2_ardour/duplicate_routes_dialog.cc
+++ b/gtk2_ardour/duplicate_routes_dialog.cc
@@ -26,7 +26,7 @@
 #include "duplicate_routes_dialog.h"
 #include "selection.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 using namespace Gtk;
diff --git a/gtk2_ardour/edit_note_dialog.cc b/gtk2_ardour/edit_note_dialog.cc
index ae15480..39a3fa4 100644
--- a/gtk2_ardour/edit_note_dialog.cc
+++ b/gtk2_ardour/edit_note_dialog.cc
@@ -26,7 +26,7 @@
 #include "midi_region_view.h"
 #include "note_base.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace Gtk;
@@ -93,7 +93,8 @@ EditNoteDialog::EditNoteDialog (MidiRegionView* rv, set<NoteBase*> n)
 
 	_time_clock.set_session (_region_view->get_time_axis_view().session ());
 	_time_clock.set_mode (AudioClock::BBT);
-	_time_clock.set (_region_view->source_relative_time_converter().to ((*_events.begin())->note()->time ()), true);
+	_time_clock.set (_region_view->source_relative_time_converter().to
+			 ((*_events.begin())->note()->time()) + (_region_view->region()->position() - _region_view->region()->start()), true);
 
 	l = manage (left_aligned_label (_("Length")));
 	table->attach (*l, 0, 1, r, r + 1);
@@ -193,7 +194,8 @@ EditNoteDialog::done (int r)
 		}
 	}
 
-	Evoral::Beats const t = _region_view->source_relative_time_converter().from (_time_clock.current_time ());
+	Evoral::Beats const t = _region_view->source_relative_time_converter().from
+		(_time_clock.current_time() - (_region_view->region()->position() - _region_view->region()->start()));
 
 	if (!_time_all.get_sensitive() || _time_all.get_active ()) {
 		for (set<NoteBase*>::iterator i = _events.begin(); i != _events.end(); ++i) {
diff --git a/gtk2_ardour/editing.cc b/gtk2_ardour/editing.cc
index 4868080..10181d5 100644
--- a/gtk2_ardour/editing.cc
+++ b/gtk2_ardour/editing.cc
@@ -22,7 +22,7 @@
 
 #include "editing.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 
diff --git a/gtk2_ardour/editor.bindings b/gtk2_ardour/editor.bindings
deleted file mode 100644
index 4ef4acb..0000000
--- a/gtk2_ardour/editor.bindings
+++ /dev/null
@@ -1,208 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<Bindings name="ardour-editor">
-  <Press>
-  <Binding action="Editor/temporal-zoom-in" key="equal"/>
-  <Binding action="Editor/temporal-zoom-out" key="minus"/>
-  <Binding action="Editor/edit-cursor-to-previous-region-sync" key="apostrophe"/>
-  <Binding action="Editor/edit-cursor-to-next-region-sync" key="semicolon"/>
-  <Binding action="Editor/cycle-edit-point" key="grave"/>
-  <Binding action="Editor/cycle-edit-point-with-marker" key="Primary-asciicircum"/>
-  <Binding action="Editor/move-range-start-to-previous-region-boundary" key="less"/>
-  <Binding action="Editor/move-range-start-to-next-region-boundary" key="Primary-less"/>
-  <Binding action="Editor/move-range-end-to-previous-region-boundary" key="Primary-greater"/>
-  <Binding action="Editor/move-range-end-to-next-region-boundary" key="greater"/>
-  <Binding action="Transport/ToggleRoll" key="space"/>
-  <Binding action="Editor/play-edit-range" key="Secondary-space"/>
-  <Binding action="Editor/play-from-edit-point-and-return" key="Level4-space"/>
-  <Binding action="Transport/ToggleRollMaybe" key="Primary-Secondary-space"/>
-  <Binding action="Transport/ToggleRollForgetCapture" key="Primary-space"/>
-  <Binding action="Transport/record-roll" key="Tertiary-space"/>
-  <Binding action="Region/set-fade-in-length" key="slash"/>
-  <Binding action="Region/toggle-region-fade-out" key="Primary-slash"/>
-  <Binding action="Region/set-fade-out-length" key="backslash"/>
-  <Binding action="Region/toggle-region-fade-out" key="Primary-backslash"/>
-  <Binding action="Region/trim-from-start" key="Tertiary-braceleft"/>
-  <Binding action="Region/trim-to-end" key="Tertiary-braceright"/>
-  <Binding action="Editor/trim-to-previous-region" key="Primary-j"/>
-  <Binding action="Editor/trim-to-next-region" key="Primary-k"/>
-  <Binding action="Editor/set-loop-from-edit-range" key="bracketright"/>
-  <Binding action="Region/set-loop-from-region" key="Secondary-bracketright"/>
-  <Binding action="Editor/set-punch-from-edit-range" key="bracketleft"/>
-  <Binding action="Region/set-punch-from-region" key="Secondary-bracketleft"/>
-  <Binding action="Region/boost-region-gain" key="asciicircum"/>
-  <Binding action="Region/cut-region-gain" key="ampersand"/>
-  <Binding action="Common/Quit" key="Primary-q"/>
-  <Binding action="Region/quantize-region" key="q"/>
-  <Binding action="Region/legatize-region" key="Primary-apostrophe"/>
-  <Binding action="Region/remove-overlap" key="Secondary-apostrophe"/>
-  <Binding action="MouseMode/set-mouse-mode-content" key="e"/>
-  <Binding action="Editor/select-all-before-edit-cursor" key="Primary-e"/>
-  <Binding action="Region/export-region" key="Primary-Level4-e"/>
-  <Binding action="Main/ExportSession" key="Level4-e"/>
-  <Binding action="Editor/select-all-after-edit-cursor" key="Primary-Tertiary-e"/>
-  <Binding action="Editor/show-editor-mixer" key="Tertiary-e"/>
-  <Binding action="Common/goto-editor" key="Secondary-e"/>
-  <Binding action="MouseMode/set-mouse-mode-range" key="r"/>
-  <Binding action="Editor/redo" key="Primary-r"/>
-  <Binding action="Region/reverse-region" key="Secondary-r"/>
-  <Binding action="Transport/Record" key="Tertiary-r"/>
-  <Binding action="MouseMode/set-mouse-mode-timefx" key="t"/>
-  <Binding action="Region/pitch-shift-region" key="Secondary-t"/>
-  <Binding action="Editor/insert-time" key="Primary-t"/>
-  <Binding action="MouseMode/set-mouse-mode-object-range" key="y"/>
-  <Binding action="Editor/select-all-between-cursors" key="Primary-u"/>
-  <Binding action="Editor/select-all-within-cursors" key="u"/>
-  <Binding action="Region/insert-region-from-region-list" key="i"/>
-  <Binding action="Editor/invert-selection" key="Tertiary-i"/>
-  <Binding action="Editor/addExistingAudioFiles" key="Secondary-i"/>
-  <Binding action="MouseMode/set-mouse-mode-object" key="o"/>
-  <Binding action="Main/Open" key="Primary-o"/>
-  <Binding action="Main/Recent" key="Primary-Tertiary-o"/>
-  <Binding action="Common/ToggleOptionsEditor" key="Secondary-o"/>
-  <Binding action="Region/naturalize-region" key="Secondary-o"/>
-  <Binding action="Editor/set-playhead" key="p"/>
-  <Binding action="Editor/select-all-before-playhead" key="Primary-p"/>
-  <Binding action="Common/toggle-audio-connection-manager" key="Secondary-p"/>
-  <Binding action="Common/toggle-midi-connection-manager" key="Secondary-Tertiary-p"/>
-  <Binding action="MIDI/panic" key="Primary-Secondary-p"/>
-  <Binding action="Editor/select-all-after-playhead" key="Tertiary-Primary-p"/>
-  <Binding action="Region/align-regions-sync-relative" key="a"/>
-  <Binding action="Editor/select-all" key="Primary-a"/>
-  <Binding action="Region/align-regions-end" key="Secondary-a"/>
-  <Binding action="Region/align-regions-sync" key="Tertiary-a"/>
-  <Binding action="Region/align-regions-start" key="Primary-Level4-a"/>
-  <Binding action="Region/align-regions-start-relative" key="Level4-a"/>
-  <Binding action="Region/split-region" key="s"/>
-  <Binding action="Common/Save" key="Primary-s"/>
-  <Binding action="Main/Snapshot" key="Primary-Tertiary-s"/>
-  <Binding action="Editor/track-solo-toggle" key="Secondary-s"/>
-  <Binding action="Region/duplicate-region" key="d"/>
-  <Binding action="Region/multi-duplicate-region" key="Tertiary-d"/>
-  <Binding action="Editor/select-all-in-punch-range" key="Primary-d"/>
-  <Binding action="Editor/fit-tracks" key="f"/>
-  <Binding action="Editor/toggle-follow-playhead" key="Primary-f"/>
-  <Binding action="Region/show-rhythm-ferret" key="Secondary-f"/>
-  <Binding action="MouseMode/set-mouse-mode-gain" key="g"/>
-  <Binding action="Region/play-selected-regions" key="h"/>
-  <Binding action="Region/trim-front" key="j"/>
-  <Binding action="Region/trim-back" key="k"/>
-  <Binding action="Common/ToggleKeyEditor" key="Secondary-k"/>
-  <Binding action="Transport/Loop" key="l"/>
-  <Binding action="Editor/select-all-in-loop-range" key="Primary-l"/>
-  <Binding action="Common/ToggleLocations" key="Secondary-l"/>
-  <Binding action="MouseMode/set-mouse-mode-zoom" key="z"/>
-  <Binding action="Editor/undo" key="Primary-z"/>
-  <Binding action="Editor/zoom-to-region" key="Primary-Secondary-z"/>
-  <Binding action="Editor/zoom-to-region-both-axes" key="Secondary-z"/>
-  <Binding action="Editor/toggle-zoom" key="Tertiary-z"/>
-  <Binding action="Editor/editor-cut" key="Primary-x"/>
-  <Binding action="Editor/editor-copy" key="Primary-c"/>
-  <Binding action="Common/ToggleColorManager" key="Secondary-c"/>
-  <Binding action="Region/set-region-sync-position" key="v"/>
-  <Binding action="Editor/editor-paste" key="Primary-v"/>
-  <Binding action="Editor/brush-at-mouse" key="Primary-b"/>
-  <Binding action="Editor/track-record-enable-toggle" key="Secondary-b"/>
-  <Binding action="Common/ToggleBigClock" key="Secondary-b"/>
-  <Binding action="Region/normalize-region" key="n"/>
-  <Binding action="Main/AddTrackBus" key="Primary-Tertiary-n"/>
-  <Binding action="Main/New" key="Primary-n"/>
-  <Binding action="Region/toggle-region-mute" key="Primary-m"/>
-  <Binding action="Common/toggle-mixer-on-top" key="Secondary-m"/>
-  <Binding action="Editor/step-tracks-up" key="uparrow"/>
-  <Binding action="Transport/TransitionToRoll" key="Tertiary-uparrow"/>
-  <Binding action="Editor/select-prev-route" key="Secondary-uparrow"/>
-  <Binding action="Editor/move-selected-tracks-up" key="Primary-uparrow"/>
-  <Binding action="Editor/step-tracks-down" key="downarrow"/>
-  <Binding action="Transport/TransitionToReverse" key="Tertiary-downarrow"/>
-  <Binding action="Editor/select-next-route" key="Secondary-downarrow"/>
-  <Binding action="Editor/move-selected-tracks-down" key="Primary-downarrow"/>
-  <Binding action="Editor/playhead-to-previous-region-boundary" key="leftarrow"/>
-  <Binding action="Editor/playhead-to-previous-region-boundary-noselection" key="Level4-leftarrow"/>
-  <Binding action="Editor/playhead-to-previous-region-sync" key="Primary-Secondary-leftarrow"/>
-  <Binding action="Editor/tab-to-transient-backwards" key="Primary-leftarrow"/>
-  <Binding action="Editor/nudge-playhead-backward" key="Secondary-leftarrow"/>
-  <Binding action="Editor/playhead-backward-to-grid" key="Tertiary-Level4-leftarrow"/>
-  <Binding action="Transport/Rewind" key="Tertiary-leftarrow"/>
-  <Binding action="Editor/selected-marker-to-previous-region-boundary" key="Primary-Tertiary-leftarrow"/>
-  <Binding action="Editor/playhead-to-next-region-boundary" key="rightarrow"/>
-  <Binding action="Editor/playhead-to-next-region-boundary-noselection" key="Level4-rightarrow"/>
-  <Binding action="Editor/playhead-to-next-region-sync" key="Primary-Secondary-rightarrow"/>
-  <Binding action="Editor/tab-to-transient-forwards" key="Primary-rightarrow"/>
-  <Binding action="Editor/nudge-playhead-forward" key="Secondary-rightarrow"/>
-  <Binding action="Editor/playhead-forward-to-grid" key="Tertiary-Level4-rightarrow"/>
-  <Binding action="Transport/Forward" key="Tertiary-rightarrow"/>
-  <Binding action="Editor/selected-marker-to-next-region-boundary" key="Primary-Tertiary-rightarrow"/>
-  <Binding action="Editor/scroll-tracks-down" key="Page_Down"/>
-  <Binding action="Editor/scroll-tracks-up" key="Page_Up"/>
-  <Binding action="Transport/GotoStart" key="Home"/>
-  <Binding action="Transport/GotoEnd" key="End"/>
-  <Binding action="Editor/editor-delete" key="Delete"/>
-  <Binding action="Editor/playhead-to-edit" key="Return"/>
-  <Binding action="Editor/edit-to-playhead" key="Secondary-Return"/>
-  <Binding action="Editor/remove-last-capture" key="Primary-Delete"/>
-  <Binding action="Editor/escape" key="Escape"/>
-  <Binding action="Region/nudge-backward" key="KP_Subtract"/>
-  <Binding action="Editor/nudge-next-backward" key="Primary-KP_Subtract"/>
-  <Binding action="Editor/jump-forward-to-mark" key="Primary-KP_Right"/>
-  <Binding action="Editor/jump-backward-to-mark" key="Primary-KP_Left"/>
-  <Binding action="Region/nudge-forward" key="KP_Add"/>
-  <Binding action="Editor/nudge-next-forward" key="Primary-KP_Add"/>
-  <Binding action="Editor/start-range" key="Primary-KP_Down"/>
-  <Binding action="Editor/finish-range" key="Primary-KP_Up"/>
-  <Binding action="Editor/finish-add-range" key="Tertiary-Primary-KP_Up"/>
-  <Binding action="Editor/add-location-from-playhead" key="KP_Enter"/>
-  <Binding action="Transport/focus-on-clock" key="KP_Divide"/>
-  <Binding action="Transport/GotoZero" key="KP_0"/>
-  <Binding action="Editor/goto-mark-1" key="KP_1"/>
-  <Binding action="Editor/goto-mark-2" key="KP_2"/>
-  <Binding action="Editor/goto-mark-3" key="KP_3"/>
-  <Binding action="Editor/goto-mark-4" key="KP_4"/>
-  <Binding action="Editor/goto-mark-5" key="KP_5"/>
-  <Binding action="Editor/goto-mark-6" key="KP_6"/>
-  <Binding action="Editor/goto-mark-7" key="KP_7"/>
-  <Binding action="Editor/goto-mark-8" key="KP_8"/>
-  <Binding action="Editor/goto-mark-9" key="KP_9"/>
-  <Binding action="Editor/edit-cursor-to-range-start" key="F1"/>
-  <Binding action="Editor/edit-cursor-to-range-end" key="F2"/>
-  <Binding action="Editor/crop" key="F3"/>
-  <Binding action="Editor/editor-separate" key="F4"/>
-  <Binding action="Editor/pitch-shift-region" key="F5"/>
-  <Binding action="Editor/select-range-between-cursors" key="F6"/>
-  <Binding action="Common/ToggleMaximalEditor" key="F11"/>
-  <Binding action="Common/ToggleMaximalMixer" key="F12"/>
-  <Binding action="Editor/save-visual-state-1" key="Primary-F1"/>
-  <Binding action="Editor/save-visual-state-2" key="Primary-F2"/>
-  <Binding action="Editor/save-visual-state-3" key="Primary-F3"/>
-  <Binding action="Editor/save-visual-state-4" key="Primary-F4"/>
-  <Binding action="Editor/save-visual-state-5" key="Primary-F5"/>
-  <Binding action="Editor/save-visual-state-6" key="Primary-F6"/>
-  <Binding action="Editor/save-visual-state-7" key="Primary-F7"/>
-  <Binding action="Editor/save-visual-state-8" key="Primary-F8"/>
-  <Binding action="Editor/save-visual-state-9" key="Primary-F9"/>
-  <Binding action="Editor/save-visual-state-10" key="Primary-F10"/>
-  <Binding action="Editor/save-visual-state-11" key="Primary-F11"/>
-  <Binding action="Editor/save-visual-state-12" key="Primary-F12"/>
-  <Binding action="Editor/cycle-snap-mode" key="2"/>
-  <Binding action="Editor/cycle-snap-choice" key="3"/>
-  <Binding action="Editor/step-mouse-mode" key="4"/>
-  <Binding action="Transport/ToggleAutoReturn" key="5"/>
-  <Binding action="Transport/ToggleClick" key="6"/>
-  <Binding action="Editor/set-tempo-from-region" key="9"/>
-  <Binding action="Editor/set-tempo-from-edit-range" key="0"/>
-  </Press>
-  <Release>
-  <Binding action="Editor/goto-visual-state-1" key="Primary-F1"/>
-  <Binding action="Editor/goto-visual-state-2" key="Primary-F2"/>
-  <Binding action="Editor/goto-visual-state-3" key="Primary-F3"/>
-  <Binding action="Editor/goto-visual-state-4" key="Primary-F4"/>
-  <Binding action="Editor/goto-visual-state-5" key="Primary-F5"/>
-  <Binding action="Editor/goto-visual-state-6" key="Primary-F6"/>
-  <Binding action="Editor/goto-visual-state-7" key="Primary-F7"/>
-  <Binding action="Editor/goto-visual-state-8" key="Primary-F8"/>
-  <Binding action="Editor/goto-visual-state-9" key="Primary-F9"/>
-  <Binding action="Editor/goto-visual-state-10" key="Primary-F10"/>
-  <Binding action="Editor/goto-visual-state-11" key="Primary-F11"/>
-  <Binding action="Editor/goto-visual-state-12" key="Primary-F12"/>
-  </Release>
-</Bindings>
-  
diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc
index f080ed2..757b767 100644
--- a/gtk2_ardour/editor.cc
+++ b/gtk2_ardour/editor.cc
@@ -59,22 +59,26 @@
 #include "gtkmm2ext/bindings.h"
 #include "gtkmm2ext/grouped_buttons.h"
 #include "gtkmm2ext/gtk_ui.h"
-#include "gtkmm2ext/tearoff.h"
+#include <gtkmm2ext/keyboard.h>
 #include "gtkmm2ext/utils.h"
 #include "gtkmm2ext/window_title.h"
 #include "gtkmm2ext/choice.h"
 #include "gtkmm2ext/cell_renderer_pixbuf_toggle.h"
 
+#include "ardour/analysis_graph.h"
 #include "ardour/audio_track.h"
 #include "ardour/audioengine.h"
 #include "ardour/audioregion.h"
 #include "ardour/lmath.h"
 #include "ardour/location.h"
 #include "ardour/profile.h"
+#include "ardour/route.h"
 #include "ardour/route_group.h"
 #include "ardour/session_playlists.h"
 #include "ardour/tempo.h"
 #include "ardour/utils.h"
+#include "ardour/vca_manager.h"
+#include "ardour/vca.h"
 
 #include "canvas/debug.h"
 #include "canvas/text.h"
@@ -102,10 +106,13 @@
 #include "editor_routes.h"
 #include "editor_snapshots.h"
 #include "editor_summary.h"
+#include "export_report.h"
 #include "global_port_matrix.h"
 #include "gui_object.h"
 #include "gui_thread.h"
 #include "keyboard.h"
+#include "keyeditor.h"
+#include "luainstance.h"
 #include "marker.h"
 #include "midi_region_view.h"
 #include "midi_time_axis.h"
@@ -119,7 +126,9 @@
 #include "region_layering_order_editor.h"
 #include "rgb_macros.h"
 #include "rhythm_ferret.h"
+#include "route_sorter.h"
 #include "selection.h"
+#include "simple_progress_dialog.h"
 #include "sfdb_ui.h"
 #include "tempo_lines.h"
 #include "time_axis_view.h"
@@ -127,9 +136,10 @@
 #include "tooltips.h"
 #include "ui_config.h"
 #include "utils.h"
+#include "vca_time_axis.h"
 #include "verbose_cursor.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
@@ -207,8 +217,8 @@ static const gchar *_zoom_focus_strings[] = {
 	N_("Right"),
 	N_("Center"),
 	N_("Playhead"),
- 	N_("Mouse"),
- 	N_("Edit point"),
+	N_("Mouse"),
+	N_("Edit point"),
 	0
 };
 
@@ -227,35 +237,85 @@ static const gchar *_rb_opt_strings[] = {
 
 #define COMBO_TRIANGLE_WIDTH 25 // ArdourButton _diameter (11) + 2 * arrow-padding (2*2) + 2 * text-padding (2*5)
 
-static void
-pane_size_watcher (Paned* pane)
-{
-	/* if the handle of a pane vanishes into (at least) the tabs of a notebook,
-	   it is:
-
-	      X: hard to access
-	      Quartz: impossible to access
-
-	   so stop that by preventing it from ever getting too narrow. 35
-	   pixels is basically a rough guess at the tab width.
-
-	   ugh.
-	*/
-
-	int max_width_of_lhs = GTK_WIDGET(pane->gobj())->allocation.width - 35;
-
-	gint pos = pane->get_position ();
-
-	if (pos > max_width_of_lhs) {
-		pane->set_position (max_width_of_lhs);
-	}
-}
-
 Editor::Editor ()
-	: _join_object_range_state (JOIN_OBJECT_RANGE_NONE)
-
+	: PublicEditor (global_hpacker)
+	, editor_mixer_strip_width (Wide)
+	, constructed (false)
+	, _playlist_selector (0)
+	, no_save_visual (false)
+	, leftmost_frame (0)
+	, samples_per_pixel (2048)
+	, zoom_focus (ZoomFocusPlayhead)
+	, mouse_mode (MouseObject)
+	, pre_internal_snap_type (SnapToBeat)
+	, pre_internal_snap_mode (SnapOff)
+	, internal_snap_type (SnapToBeat)
+	, internal_snap_mode (SnapOff)
+	, _join_object_range_state (JOIN_OBJECT_RANGE_NONE)
+	, _notebook_shrunk (false)
+	, location_marker_color (0)
+	, location_range_color (0)
+	, location_loop_color (0)
+	, location_punch_color (0)
+	, location_cd_marker_color (0)
+	, entered_marker (0)
+	, _show_marker_lines (false)
+	, clicked_axisview (0)
+	, clicked_routeview (0)
+	, clicked_regionview (0)
+	, clicked_selection (0)
+	, clicked_control_point (0)
+	, button_release_can_deselect (true)
 	, _mouse_changed_selection (false)
-	  /* time display buttons */
+	, region_edit_menu_split_item (0)
+	, region_edit_menu_split_multichannel_item (0)
+	, track_region_edit_playlist_menu (0)
+	, track_edit_playlist_submenu (0)
+	, track_selection_edit_playlist_submenu (0)
+	, _popup_region_menu_item (0)
+	, _track_canvas (0)
+	, _track_canvas_viewport (0)
+	, within_track_canvas (false)
+	, _verbose_cursor (0)
+	, tempo_group (0)
+	, meter_group (0)
+	, marker_group (0)
+	, range_marker_group (0)
+	, transport_marker_group (0)
+	, cd_marker_group (0)
+	, _time_markers_group (0)
+	, hv_scroll_group (0)
+	, h_scroll_group (0)
+	, cursor_scroll_group (0)
+	, no_scroll_group (0)
+	, _trackview_group (0)
+	, _drag_motion_group (0)
+	, _canvas_drop_zone (0)
+	, no_ruler_shown_update (false)
+	,  ruler_grabbed_widget (0)
+	, ruler_dialog (0)
+	, minsec_mark_interval (0)
+	, minsec_mark_modulo (0)
+	, minsec_nmarks (0)
+	, timecode_mark_modulo (0)
+	, timecode_nmarks (0)
+	, _samples_ruler_interval (0)
+	, bbt_bars (0)
+	, bbt_nmarks (0)
+	, bbt_bar_helper_on (0)
+	, bbt_accent_modulo (0)
+	, timecode_ruler (0)
+	, bbt_ruler (0)
+	, samples_ruler (0)
+	, minsec_ruler (0)
+	, visible_timebars (0)
+	, editor_ruler_menu (0)
+	, tempo_bar (0)
+	, meter_bar (0)
+	, marker_bar (0)
+	, range_marker_bar (0)
+	, transport_marker_bar (0)
+	, cd_marker_bar (0)
 	, minsec_label (_("Mins:Secs"))
 	, bbt_label (_("Bars:Beats"))
 	, timecode_label (_("Timecode"))
@@ -267,73 +327,142 @@ Editor::Editor ()
 	, transport_mark_label (_("Loop/Punch Ranges"))
 	, cd_mark_label (_("CD Markers"))
 	, videotl_label (_("Video Timeline"))
+	, videotl_group (0)
+	, playhead_cursor (0)
 	, edit_packer (4, 4, true)
-
-	  /* the values here don't matter: layout widgets
-	     reset them as needed.
-	  */
-
 	, vertical_adjustment (0.0, 0.0, 10.0, 400.0)
 	, horizontal_adjustment (0.0, 0.0, 1e16)
 	, unused_adjustment (0.0, 0.0, 10.0, 400.0)
-
 	, controls_layout (unused_adjustment, vertical_adjustment)
-
-	  /* tool bar related */
-
-	, toolbar_selection_clock_table (2,3)
-	, _mouse_mode_tearoff (0)
-	, automation_mode_button (_("mode"))
-	, _zoom_tearoff (0)
-	, _tools_tearoff (0)
-
-	, _toolbar_viewport (*manage (new Gtk::Adjustment (0, 0, 1e10)), *manage (new Gtk::Adjustment (0, 0, 1e10)))
+	, _scroll_callbacks (0)
+	, _visible_canvas_width (0)
+	, _visible_canvas_height (0)
+	, _full_canvas_height (0)
+	, edit_controls_left_menu (0)
+	, edit_controls_right_menu (0)
+	, last_update_frame (0)
+	, cut_buffer_start (0)
+	, cut_buffer_length (0)
+	, button_bindings (0)
+	, last_paste_pos (0)
+	, paste_count (0)
+	, sfbrowser (0)
+	, current_interthread_info (0)
+	, analysis_window (0)
+	, select_new_marker (false)
+	, last_scrub_x (0)
+	, scrubbing_direction (0)
+	, scrub_reversals (0)
+	, scrub_reverse_distance (0)
+	, have_pending_keyboard_selection (false)
+	, pending_keyboard_selection_start (0)
+	, _snap_type (SnapToBeat)
+	, _snap_mode (SnapOff)
+	, snap_threshold (5.0)
+	, ignore_gui_changes (false)
+	, _drags (new DragManager (this))
+	, lock_dialog (0)
+	  /* , last_event_time { 0, 0 } */ /* this initialization style requires C++11 */
+	, _dragging_playhead (false)
+	, _dragging_edit_point (false)
+	, _show_measures (true)
+	, _follow_playhead (true)
+	, _stationary_playhead (false)
+	, _maximised (false)
+	, tempo_lines (0)
+	, global_rect_group (0)
+	, time_line_group (0)
+	, tempo_marker_menu (0)
+	, meter_marker_menu (0)
+	, marker_menu (0)
+	, range_marker_menu (0)
+	, transport_marker_menu (0)
+	, new_transport_marker_menu (0)
+	, cd_marker_menu (0)
+	, marker_menu_item (0)
+	, bbt_beat_subdivision (4)
+	, _visible_track_count (-1)
+	,  toolbar_selection_clock_table (2,3)
+	,  automation_mode_button (_("mode"))
+	,  _toolbar_viewport (*manage (new Gtk::Adjustment (0, 0, 1e10)), *manage (new Gtk::Adjustment (0, 0, 1e10)))
+	, selection (new Selection (this))
+	, cut_buffer (new Selection (this))
+	, _selection_memento (new SelectionMemento())
+	, _all_region_actions_sensitized (false)
+	, _ignore_region_action (false)
+	, _last_region_menu_was_main (false)
+	, _ignore_follow_edits (false)
+	, cd_marker_bar_drag_rect (0)
+	, range_bar_drag_rect (0)
+	, transport_bar_drag_rect (0)
+	, transport_bar_range_rect (0)
+	, transport_bar_preroll_rect (0)
+	, transport_bar_postroll_rect (0)
+	, transport_loop_range_rect (0)
+	, transport_punch_range_rect (0)
+	, transport_punchin_line (0)
+	, transport_punchout_line (0)
+	, transport_preroll_rect (0)
+	, transport_postroll_rect (0)
+	, temp_location (0)
+	, rubberband_rect (0)
+	, _route_groups (0)
+	, _routes (0)
+	, _regions (0)
+	, _snapshots (0)
+	, _locations (0)
+	, autoscroll_horizontal_allowed (false)
+	, autoscroll_vertical_allowed (false)
+	, autoscroll_cnt (0)
+	, autoscroll_widget (0)
+	, show_gain_after_trim (false)
 	, selection_op_cmd_depth (0)
 	, selection_op_history_it (0)
-
-	  /* nudge */
-
-	, nudge_clock (new AudioClock (X_("nudge"), false, X_("nudge"), true, false, true))
-	, meters_running(false)
+	, no_save_instant (false)
+	, current_timefx (0)
+	, current_mixer_strip (0)
+	, show_editor_mixer_when_tracks_arrive (false)
+	,  nudge_clock (new AudioClock (X_("nudge"), false, X_("nudge"), true, false, true))
+	, current_stepping_trackview (0)
+	, last_track_height_step_timestamp (0)
+	, entered_track (0)
+	, entered_regionview (0)
+	, clear_entered_track (false)
+	, _edit_point (EditAtMouse)
+	, meters_running (false)
+	, rhythm_ferret (0)
+	, _have_idled (false)
+	, resize_idle_id (-1)
+	, _pending_resize_amount (0)
+	, _pending_resize_view (0)
 	, _pending_locate_request (false)
 	, _pending_initial_locate (false)
+	, _summary (0)
+	, _group_tabs (0)
+	, _last_motion_y (0)
+	, layering_order_editor (0)
 	, _last_cut_copy_source_track (0)
-
 	, _region_selection_change_updates_region_list (true)
+	, _cursors (0)
 	, _following_mixer_selection (false)
 	, _control_point_toggled_on_press (false)
 	, _stepping_axis_view (0)
 	, quantize_dialog (0)
 	, _main_menu_disabler (0)
+	, myactions (X_("editor"))
 {
-	constructed = false;
-
 	/* we are a singleton */
 
 	PublicEditor::_instance = this;
 
 	_have_idled = false;
 
-	selection = new Selection (this);
-	cut_buffer = new Selection (this);
-	_selection_memento = new SelectionMemento ();
+	last_event_time.tv_sec = 0;
+	last_event_time.tv_usec = 0;
+
 	selection_op_history.clear();
 	before.clear();
 
-	clicked_regionview = 0;
-	clicked_axisview = 0;
-	clicked_routeview = 0;
-	clicked_selection = 0;
-	clicked_control_point = 0;
-	last_update_frame = 0;
-	last_paste_pos = 0;
-	paste_count = 0;
-	_drags = new DragManager (this);
-	lock_dialog = 0;
-	ruler_dialog = 0;
-	current_mixer_strip = 0;
-	tempo_lines = 0;
-
 	snap_type_strings =  I18N (_snap_type_strings);
 	snap_mode_strings =  I18N (_snap_mode_strings);
 	zoom_focus_strings = I18N (_zoom_focus_strings);
@@ -351,77 +480,17 @@ Editor::Editor ()
 	build_snap_type_menu();
 	build_edit_point_menu();
 
-	snap_threshold = 5.0;
-	bbt_beat_subdivision = 4;
-	_visible_canvas_width = 0;
-	_visible_canvas_height = 0;
-	autoscroll_horizontal_allowed = false;
-	autoscroll_vertical_allowed = false;
-	logo_item = 0;
-
-	analysis_window = 0;
-
-	current_interthread_info = 0;
-	_show_measures = true;
-	_maximised = false;
-	show_gain_after_trim = false;
-
-	have_pending_keyboard_selection = false;
-	_follow_playhead = true;
-        _stationary_playhead = false;
-	editor_ruler_menu = 0;
-	no_ruler_shown_update = false;
-	marker_menu = 0;
-	range_marker_menu = 0;
-	marker_menu_item = 0;
-	tempo_or_meter_marker_menu = 0;
-	transport_marker_menu = 0;
-	new_transport_marker_menu = 0;
-	editor_mixer_strip_width = Wide;
-	show_editor_mixer_when_tracks_arrive = false;
-	region_edit_menu_split_multichannel_item = 0;
-	region_edit_menu_split_item = 0;
-	temp_location = 0;
-	leftmost_frame = 0;
-	mouse_mode = MouseObject;
-	current_stepping_trackview = 0;
-	entered_track = 0;
-	entered_regionview = 0;
-	entered_marker = 0;
-	clear_entered_track = false;
-	current_timefx = 0;
-	playhead_cursor = 0;
-	button_release_can_deselect = true;
-	_dragging_playhead = false;
-	_dragging_edit_point = false;
-	select_new_marker = false;
-	rhythm_ferret = 0;
-	layering_order_editor = 0;
-	no_save_visual = false;
-	resize_idle_id = -1;
-	within_track_canvas = false;
-
-	scrubbing_direction = 0;
-
-	sfbrowser = 0;
-
 	location_marker_color = UIConfiguration::instance().color ("location marker");
 	location_range_color = UIConfiguration::instance().color ("location range");
 	location_cd_marker_color = UIConfiguration::instance().color ("location cd marker");
 	location_loop_color = UIConfiguration::instance().color ("location loop");
 	location_punch_color = UIConfiguration::instance().color ("location punch");
 
-	zoom_focus = ZoomFocusPlayhead;
-	_edit_point = EditAtMouse;
-	_visible_track_count = -1;
-
-	samples_per_pixel = 2048; /* too early to use reset_zoom () */
+	timebar_height = std::max(12., ceil (15. * ARDOUR_UI::ui_scale));
 
-	timebar_height = std::max(12., ceil (15. * UIConfiguration::instance().get_ui_scale()));
 	TimeAxisView::setup_sizes ();
 	ArdourMarker::setup_sizes (timebar_height);
-
-	_scroll_callbacks = 0;
+	TempoCurve::setup_sizes (timebar_height);
 
 	bbt_label.set_name ("EditorRulerLabel");
 	bbt_label.set_size_request (-1, (int)timebar_height);
@@ -595,7 +664,18 @@ Editor::Editor ()
 
 	_notebook_shrunk = false;
 
-	editor_summary_pane.pack1(edit_packer);
+
+	/* Pick up some settings we need to cache, early */
+
+	XMLNode* settings = ARDOUR_UI::instance()->editor_settings();
+	XMLProperty* prop;
+
+	if (settings && (prop = settings->property ("notebook-shrunk"))) {
+		_notebook_shrunk = string_is_affirmative (prop->value ());
+	}
+
+	editor_summary_pane.set_check_divider_position (true);
+	editor_summary_pane.add (edit_packer);
 
 	Button* summary_arrows_left_left = manage (new Button);
 	summary_arrows_left_left->add (*manage (new Arrow (ARROW_LEFT, SHADOW_NONE)));
@@ -636,22 +716,39 @@ Editor::Editor ()
 	_summary_hbox.pack_start (*summary_arrows_right, false, false);
 
 	if (!ARDOUR::Profile->get_trx()) {
-		editor_summary_pane.pack2 (_summary_hbox);
+		editor_summary_pane.add (_summary_hbox);
 	}
 
-	edit_pane.pack1 (editor_summary_pane, true, true);
+	edit_pane.set_check_divider_position (true);
+	edit_pane.add (editor_summary_pane);
 	if (!ARDOUR::Profile->get_trx()) {
-		edit_pane.pack2 (_the_notebook, false, true);
+		edit_pane.add (_the_notebook);
 	}
 
-	editor_summary_pane.signal_size_allocate().connect (sigc::bind (sigc::mem_fun (*this, &Editor::pane_allocation_handler), static_cast<Paned*> (&editor_summary_pane)));
+	edit_pane.set_drag_cursor (*_cursors->expand_left_right);
+	edit_pane.set_child_minsize (_the_notebook, 30); /* rough guess at width of notebook tabs */
+	editor_summary_pane.set_drag_cursor (*_cursors->expand_up_down);
+
+	float fract;
 
-	/* XXX: editor_summary_pane might need similar to the edit_pane */
+	{
+		LocaleGuard lg;
+
+		if (!settings || ((prop = settings->property ("edit-horizontal-pane-pos")) == 0) || ((fract = atof (prop->value())) > 1.0)) {
+			/* initial allocation is 90% to canvas, 10% to notebook */
+			edit_pane.set_divider (0, 0.90);
+		} else {
+			edit_pane.set_divider (0, fract);
+		}
 
-	edit_pane.signal_size_allocate().connect (sigc::bind (sigc::mem_fun(*this, &Editor::pane_allocation_handler), static_cast<Paned*> (&edit_pane)));
+		if (!settings || ((prop = settings->property ("edit-vertical-pane-pos")) == 0) || ((fract = atof (prop->value())) > 1.0)) {
+			/* initial allocation is 90% to canvas, 10% to summary */
+			editor_summary_pane.set_divider (0, 0.90);
+		} else {
 
-	Glib::PropertyProxy<int> proxy = edit_pane.property_position();
-	proxy.signal_changed().connect (bind (sigc::ptr_fun (pane_size_watcher), static_cast<Paned*> (&edit_pane)));
+			editor_summary_pane.set_divider (0, fract);
+		}
+	}
 
 	top_hbox.pack_start (toolbar_frame);
 
@@ -660,40 +757,20 @@ Editor::Editor ()
 
 	global_vpacker.pack_start (top_hbox, false, false);
 	global_vpacker.pack_start (*hbox, true, true);
-
 	global_hpacker.pack_start (global_vpacker, true, true);
 
-	set_name ("EditorWindow");
-	add_accel_group (ActionManager::ui_manager->get_accel_group());
-
-	status_bar_hpacker.show ();
+	/* need to show the "contents" widget so that notebook will show if tab is switched to
+	 */
 
-	vpacker.pack_end (status_bar_hpacker, false, false);
-	vpacker.pack_end (global_hpacker, true, true);
+	global_hpacker.show ();
 
 	/* register actions now so that set_state() can find them and set toggles/checks etc */
 
 	register_actions ();
-	/* when we start using our own keybinding system for the editor, this
-	 * will be uncommented
-	 */
-	// load_bindings ();
+	load_bindings ();
 
 	setup_toolbar ();
 
-	set_zoom_focus (zoom_focus);
-	set_visible_track_count (_visible_track_count);
-	_snap_type = SnapToBeat;
-	set_snap_to (_snap_type);
-	_snap_mode = SnapOff;
-	set_snap_mode (_snap_mode);
-	set_mouse_mode (MouseObject, true);
-        pre_internal_snap_type = _snap_type;
-        pre_internal_snap_mode = _snap_mode;
-        internal_snap_type = _snap_type;
-        internal_snap_mode = _snap_mode;
-	set_edit_point_preference (EditAtMouse, true);
-
 	_playlist_selector = new PlaylistSelector();
 	_playlist_selector->signal_delete_event().connect (sigc::bind (sigc::ptr_fun (just_hide_it), static_cast<Window *> (_playlist_selector)));
 
@@ -709,39 +786,6 @@ Editor::Editor ()
 
 	fade_context_menu.set_name ("ArdourContextMenu");
 
-	/* icons, titles, WM stuff */
-
-	list<Glib::RefPtr<Gdk::Pixbuf> > window_icons;
-	Glib::RefPtr<Gdk::Pixbuf> icon;
-
-	if ((icon = ::get_icon ("ardour_icon_16px")) != 0) {
-		window_icons.push_back (icon);
-	}
-	if ((icon = ::get_icon ("ardour_icon_22px")) != 0) {
-		window_icons.push_back (icon);
-	}
-	if ((icon = ::get_icon ("ardour_icon_32px")) != 0) {
-		window_icons.push_back (icon);
-	}
-	if ((icon = ::get_icon ("ardour_icon_48px")) != 0) {
-		window_icons.push_back (icon);
-	}
-	if (!window_icons.empty()) {
-		// set_icon_list (window_icons);
-		set_default_icon_list (window_icons);
-	}
-
-	WindowTitle title(Glib::get_application_name());
-	title += _("Editor");
-	set_title (title.get_string());
-	set_wmclass (X_("ardour_editor"), PROGRAM_NAME);
-
-	add (vpacker);
-	add_events (Gdk::KEY_PRESS_MASK|Gdk::KEY_RELEASE_MASK);
-
-	signal_configure_event().connect (sigc::mem_fun (*ARDOUR_UI::instance(), &ARDOUR_UI::configure_handler));
-	signal_delete_event().connect (sigc::mem_fun (*ARDOUR_UI::instance(), &ARDOUR_UI::exit_on_main_window_close));
-
 	Gtkmm2ext::Keyboard::the_keyboard().ZoomVerticalModifierReleased.connect (sigc::mem_fun (*this, &Editor::zoom_vertical_modifier_released));
 
 	/* allow external control surfaces/protocols to do various things */
@@ -761,14 +805,18 @@ Editor::Editor ()
 	ControlProtocol::VerticalZoomInSelected.connect (*this, invalidator (*this), boost::bind (&Editor::control_vertical_zoom_in_selected, this), gui_context());
 	ControlProtocol::VerticalZoomOutSelected.connect (*this, invalidator (*this), boost::bind (&Editor::control_vertical_zoom_out_selected, this), gui_context());
 
-	ControlProtocol::AddRouteToSelection.connect (*this, invalidator (*this), boost::bind (&Editor::control_select, this, _1, Selection::Add), gui_context());
-	ControlProtocol::RemoveRouteFromSelection.connect (*this, invalidator (*this), boost::bind (&Editor::control_select, this, _1, Selection::Toggle), gui_context());
-	ControlProtocol::SetRouteSelection.connect (*this, invalidator (*this), boost::bind (&Editor::control_select, this, _1, Selection::Set), gui_context());
-	ControlProtocol::ToggleRouteSelection.connect (*this, invalidator (*this), boost::bind (&Editor::control_select, this, _1, Selection::Toggle), gui_context());
-	ControlProtocol::ClearRouteSelection.connect (*this, invalidator (*this), boost::bind (&Editor::control_unselect, this), gui_context());
+	ControlProtocol::AddStripableToSelection.connect (*this, invalidator (*this), boost::bind (&Editor::control_select, this, _1, Selection::Add), gui_context());
+	ControlProtocol::RemoveStripableFromSelection.connect (*this, invalidator (*this), boost::bind (&Editor::control_select, this, _1, Selection::Toggle), gui_context());
+	ControlProtocol::SetStripableSelection.connect (*this, invalidator (*this), boost::bind (&Editor::control_select, this, _1, Selection::Set), gui_context());
+	ControlProtocol::ToggleStripableSelection.connect (*this, invalidator (*this), boost::bind (&Editor::control_select, this, _1, Selection::Toggle), gui_context());
+	ControlProtocol::ClearStripableSelection.connect (*this, invalidator (*this), boost::bind (&Editor::control_unselect, this), gui_context());
 
 	BasicUI::AccessAction.connect (*this, invalidator (*this), boost::bind (&Editor::access_action, this, _1, _2), gui_context());
 
+	/* handle escape */
+
+	ARDOUR_UI::instance()->Escape.connect (*this, invalidator (*this), boost::bind (&Editor::escape, this), gui_context());
+
 	/* problematic: has to return a value and thus cannot be x-thread */
 
 	Session::AskAboutPlaylistDeletion.connect_same_thread (*this, boost::bind (&Editor::playlist_deletion_dialog, this, _1));
@@ -788,12 +836,12 @@ Editor::Editor ()
 
         /* Button bindings */
 
-        button_bindings = new Bindings;
+	button_bindings = new Bindings ("editor-mouse");
 
 	XMLNode* node = button_settings();
         if (node) {
                 for (XMLNodeList::const_iterator i = node->children().begin(); i != node->children().end(); ++i) {
-                        button_bindings->load (**i);
+                        button_bindings->load_operation (**i);
                 }
         }
 
@@ -805,17 +853,21 @@ Editor::Editor ()
 
 	setup_fade_images ();
 
+	LuaInstance::instance(); // instantiate
+	LuaInstance::instance()->ActionChanged.connect (sigc::mem_fun (*this, &Editor::set_script_action_name));
+
 	instant_save ();
 }
 
 Editor::~Editor()
 {
-        delete button_bindings;
+	delete button_bindings;
 	delete _routes;
 	delete _route_groups;
 	delete _track_canvas_viewport;
 	delete _drags;
 	delete nudge_clock;
+	delete _verbose_cursor;
 	delete quantize_dialog;
 	delete _summary;
 	delete _group_tabs;
@@ -842,25 +894,6 @@ Editor::button_settings () const
 	return node;
 }
 
-void
-Editor::add_toplevel_menu (Container& cont)
-{
-	vpacker.pack_start (cont, false, false);
-	cont.show_all ();
-}
-
-void
-Editor::add_transport_frame (Container& cont)
-{
-	if(ARDOUR::Profile->get_mixbus()) {
-		global_vpacker.pack_start (cont, false, false);
-		global_vpacker.reorder_child (cont, 0);
-		cont.show_all ();
-	} else {
-		vpacker.pack_start (cont, false, false);
-	}
-}
-
 bool
 Editor::get_smart_mode () const
 {
@@ -931,47 +964,9 @@ Editor::set_entered_track (TimeAxisView* tav)
 }
 
 void
-Editor::show_window ()
-{
-	if (!is_visible ()) {
-		DisplaySuspender ds;
-		show_all ();
-
-		/* XXX: this is a bit unfortunate; it would probably
-		   be nicer if we could just call show () above rather
-		   than needing the show_all ()
-		*/
-
-		/* re-hide stuff if necessary */
-		editor_list_button_toggled ();
-		parameter_changed ("show-summary");
-		parameter_changed ("show-group-tabs");
-		parameter_changed ("show-zoom-tools");
-
-		/* now reset all audio_time_axis heights, because widgets might need
-		   to be re-hidden
-		*/
-
-		TimeAxisView *tv;
-
-		for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) {
-			tv = (static_cast<TimeAxisView*>(*i));
-			tv->reset_height ();
-		}
-
-		if (current_mixer_strip) {
-			current_mixer_strip->hide_things ();
-			current_mixer_strip->parameter_changed ("mixer-element-visibility");
-		}
-	}
-
-	present ();
-}
-
-void
 Editor::instant_save ()
 {
-	if (!constructed || !ARDOUR_UI::instance()->session_loaded) {
+	if (!constructed || !ARDOUR_UI::instance()->session_loaded || no_save_instant) {
 		return;
 	}
 
@@ -1019,23 +1014,9 @@ Editor::control_unselect ()
 }
 
 void
-Editor::control_select (uint32_t rid, Selection::Operation op)
+Editor::control_select (boost::shared_ptr<Stripable> s, Selection::Operation op)
 {
-	/* handles the (static) signal from the ControlProtocol class that
-	 * requests setting the selected track to a given RID
-	 */
-
-	if (!_session) {
-		return;
-	}
-
-	boost::shared_ptr<Route> r = _session->route_by_remote_id (rid);
-
-	if (!r) {
-		return;
-	}
-
-	TimeAxisView* tav = axis_view_from_route (r);
+	TimeAxisView* tav = axis_view_from_stripable (s);
 
 	if (tav) {
 		switch (op) {
@@ -1160,14 +1141,11 @@ Editor::access_action (std::string action_group, std::string action_item)
 void
 Editor::on_realize ()
 {
-	Window::on_realize ();
 	Realized ();
 
 	if (UIConfiguration::instance().get_lock_gui_after_seconds()) {
 		start_lock_event_timing ();
 	}
-
-	signal_event().connect (sigc::mem_fun (*this, &Editor::generic_event_handler));
 }
 
 void
@@ -1187,7 +1165,9 @@ Editor::generic_event_handler (GdkEvent* ev)
 	case GDK_MOTION_NOTIFY:
 	case GDK_KEY_PRESS:
 	case GDK_KEY_RELEASE:
-		gettimeofday (&last_event_time, 0);
+		if (contents().is_mapped()) {
+			gettimeofday (&last_event_time, 0);
+		}
 		break;
 
 	case GDK_LEAVE_NOTIFY:
@@ -1202,7 +1182,7 @@ Editor::generic_event_handler (GdkEvent* ev)
 			/* leaving window, so reset focus, thus ending any and
 			   all text entry operations.
 			*/
-			reset_focus();
+			reset_focus (&contents());
 			break;
 		}
 		break;
@@ -1284,7 +1264,11 @@ Editor::center_screen_internal (framepos_t frame, float page)
 void
 Editor::update_title ()
 {
-	ENSURE_GUI_THREAD (*this, &Editor::update_title)
+	ENSURE_GUI_THREAD (*this, &Editor::update_title);
+
+	if (!own_window()) {
+		return;
+	}
 
 	if (_session) {
 		bool dirty = _session->dirty();
@@ -1302,8 +1286,9 @@ Editor::update_title ()
 		}
 
 		WindowTitle title(session_name);
+		title += S_("Window|Editor");
 		title += Glib::get_application_name();
-		set_title (title.get_string());
+		own_window()->set_title (title.get_string());
 	} else {
 		/* ::session_going_away() will have taken care of it */
 	}
@@ -1379,9 +1364,11 @@ Editor::set_session (Session *t)
 	_session->StepEditStatusChange.connect (_session_connections, invalidator (*this), boost::bind (&Editor::step_edit_status_change, this, _1), gui_context());
 	_session->TransportStateChange.connect (_session_connections, invalidator (*this), boost::bind (&Editor::map_transport_state, this), gui_context());
 	_session->PositionChanged.connect (_session_connections, invalidator (*this), boost::bind (&Editor::map_position_change, this, _1), gui_context());
+	_session->vca_manager().VCAAdded.connect (_session_connections, invalidator (*this), boost::bind (&Editor::add_vcas, this, _1), gui_context());
 	_session->RouteAdded.connect (_session_connections, invalidator (*this), boost::bind (&Editor::add_routes, this, _1), gui_context());
 	_session->DirtyChanged.connect (_session_connections, invalidator (*this), boost::bind (&Editor::update_title, this), gui_context());
 	_session->tempo_map().PropertyChanged.connect (_session_connections, invalidator (*this), boost::bind (&Editor::tempo_map_changed, this, _1), gui_context());
+	_session->tempo_map().MetricPositionChanged.connect (_session_connections, invalidator (*this), boost::bind (&Editor::marker_position_changed, this), gui_context());
 	_session->Located.connect (_session_connections, invalidator (*this), boost::bind (&Editor::located, this), gui_context());
 	_session->config.ParameterChanged.connect (_session_connections, invalidator (*this), boost::bind (&Editor::parameter_changed, this, _1), gui_context());
 	_session->StateSaved.connect (_session_connections, invalidator (*this), boost::bind (&Editor::session_state_saved, this, _1), gui_context());
@@ -1420,12 +1407,33 @@ Editor::set_session (Session *t)
 		break;
 	}
 
+	/* catch up on selection of stripables (other selection state is lost
+	 * when a session is closed
+	 */
+
+	StripableList sl;
+	TrackViewList tl;
+	_session->get_stripables (sl);
+	for (StripableList::const_iterator s = sl.begin(); s != sl.end(); ++s) {
+		if ((*s)->presentation_info().selected()) {
+			RouteTimeAxisView* rtav = get_route_view_by_route_id ((*s)->id());
+			if (rtav) {
+				tl.push_back (rtav);
+			}
+		}
+	}
+	if (!tl.empty()) {
+		selection->set (tl);
+	}
+
 	/* register for undo history */
 	_session->register_with_memento_command_factory(id(), this);
 	_session->register_with_memento_command_factory(_selection_memento->id(), _selection_memento);
 
 	ActionManager::ui_manager->signal_pre_activate().connect (sigc::mem_fun (*this, &Editor::action_pre_activated));
 
+	LuaInstance::instance()->set_session(_session);
+
 	start_updating_meters ();
 }
 
@@ -1685,7 +1693,7 @@ Editor::build_track_context_menu ()
 {
 	using namespace Menu_Helpers;
 
- 	MenuList& edit_items = track_context_menu.items();
+	MenuList& edit_items = track_context_menu.items();
 	edit_items.clear();
 
 	add_dstream_context_items (edit_items);
@@ -1697,7 +1705,7 @@ Editor::build_track_bus_context_menu ()
 {
 	using namespace Menu_Helpers;
 
- 	MenuList& edit_items = track_context_menu.items();
+	MenuList& edit_items = track_context_menu.items();
 	edit_items.clear();
 
 	add_bus_context_items (edit_items);
@@ -1734,7 +1742,103 @@ Editor::build_track_region_context_menu ()
 }
 
 void
-Editor::analyze_region_selection ()
+Editor::loudness_analyze_region_selection ()
+{
+	if (!_session) {
+		return;
+	}
+	Selection& s (PublicEditor::instance ().get_selection ());
+	RegionSelection ars = s.regions;
+	ARDOUR::AnalysisGraph ag (_session);
+	framecnt_t total_work = 0;
+
+	for (RegionSelection::iterator j = ars.begin (); j != ars.end (); ++j) {
+		AudioRegionView* arv = dynamic_cast<AudioRegionView*> (*j);
+		if (!arv) {
+			continue;
+		}
+		if (!boost::dynamic_pointer_cast<AudioRegion> (arv->region ())) {
+			continue;
+		}
+		assert (dynamic_cast<RouteTimeAxisView *> (&arv->get_time_axis_view ()));
+		total_work += arv->region ()->length ();
+	}
+
+	SimpleProgressDialog spd (_("Region Loudness Analysis"), sigc::mem_fun (ag, &AnalysisGraph::cancel));
+	ScopedConnection c;
+	ag.set_total_frames (total_work);
+	ag.Progress.connect_same_thread (c, boost::bind (&SimpleProgressDialog::update_progress, &spd, _1, _2));
+	spd.show();
+
+	for (RegionSelection::iterator j = ars.begin (); j != ars.end (); ++j) {
+		AudioRegionView* arv = dynamic_cast<AudioRegionView*> (*j);
+		if (!arv) {
+			continue;
+		}
+		boost::shared_ptr<AudioRegion> ar = boost::dynamic_pointer_cast<AudioRegion> (arv->region ());
+		if (!ar) {
+			continue;
+		}
+		ag.analyze_region (ar);
+	}
+	spd.hide();
+	if (!ag.canceled ()) {
+		ExportReport er (_("Audio Report/Analysis"), ag.results ());
+		er.run();
+	}
+}
+
+void
+Editor::loudness_analyze_range_selection ()
+{
+	if (!_session) {
+		return;
+	}
+	Selection& s (PublicEditor::instance ().get_selection ());
+	TimeSelection ts = s.time;
+	ARDOUR::AnalysisGraph ag (_session);
+	framecnt_t total_work = 0;
+
+	for (TrackSelection::iterator i = s.tracks.begin (); i != s.tracks.end (); ++i) {
+		boost::shared_ptr<AudioPlaylist> pl = boost::dynamic_pointer_cast<AudioPlaylist> ((*i)->playlist ());
+		if (!pl) {
+			continue;
+		}
+		RouteUI *rui = dynamic_cast<RouteUI *> (*i);
+		if (!pl || !rui) {
+			continue;
+		}
+		for (std::list<AudioRange>::iterator j = ts.begin (); j != ts.end (); ++j) {
+			total_work += j->length ();
+		}
+	}
+
+	SimpleProgressDialog spd (_("Range Loudness Analysis"), sigc::mem_fun (ag, &AnalysisGraph::cancel));
+	ScopedConnection c;
+	ag.set_total_frames (total_work);
+	ag.Progress.connect_same_thread (c, boost::bind (&SimpleProgressDialog::update_progress, &spd, _1, _2));
+	spd.show();
+
+	for (TrackSelection::iterator i = s.tracks.begin (); i != s.tracks.end (); ++i) {
+		boost::shared_ptr<AudioPlaylist> pl = boost::dynamic_pointer_cast<AudioPlaylist> ((*i)->playlist ());
+		if (!pl) {
+			continue;
+		}
+		RouteUI *rui = dynamic_cast<RouteUI *> (*i);
+		if (!pl || !rui) {
+			continue;
+		}
+		ag.analyze_range (rui->route (), pl, ts);
+	}
+	spd.hide();
+	if (!ag.canceled ()) {
+		ExportReport er (_("Audio Report/Analysis"), ag.results ());
+		er.run();
+	}
+}
+
+void
+Editor::spectral_analyze_region_selection ()
 {
 	if (analysis_window == 0) {
 		analysis_window = new AnalysisWindow();
@@ -1752,7 +1856,7 @@ Editor::analyze_region_selection ()
 }
 
 void
-Editor::analyze_range_selection()
+Editor::spectral_analyze_range_selection()
 {
 	if (analysis_window == 0) {
 		analysis_window = new AnalysisWindow();
@@ -1846,7 +1950,8 @@ Editor::add_selection_context_items (Menu_Helpers::MenuList& edit_items)
 	edit_items.push_back (MenuElem (_("Zoom to Range"), sigc::bind (sigc::mem_fun(*this, &Editor::temporal_zoom_selection), false)));
 
 	edit_items.push_back (SeparatorElem());
-	edit_items.push_back (MenuElem (_("Spectral Analysis"), sigc::mem_fun(*this, &Editor::analyze_range_selection)));
+	edit_items.push_back (MenuElem (_("Loudness Analysis"), sigc::mem_fun(*this, &Editor::loudness_analyze_range_selection)));
+	edit_items.push_back (MenuElem (_("Spectral Analysis"), sigc::mem_fun(*this, &Editor::spectral_analyze_range_selection)));
 
 	edit_items.push_back (SeparatorElem());
 
@@ -2053,6 +2158,37 @@ Editor::snap_type() const
 	return _snap_type;
 }
 
+bool
+Editor::snap_musical() const
+{
+	switch (_snap_type) {
+	case SnapToBeatDiv128:
+	case SnapToBeatDiv64:
+	case SnapToBeatDiv32:
+	case SnapToBeatDiv28:
+	case SnapToBeatDiv24:
+	case SnapToBeatDiv20:
+	case SnapToBeatDiv16:
+	case SnapToBeatDiv14:
+	case SnapToBeatDiv12:
+	case SnapToBeatDiv10:
+	case SnapToBeatDiv8:
+	case SnapToBeatDiv7:
+	case SnapToBeatDiv6:
+	case SnapToBeatDiv5:
+	case SnapToBeatDiv4:
+	case SnapToBeatDiv3:
+	case SnapToBeatDiv2:
+	case SnapToBeat:
+	case SnapToBar:
+		return true;
+	default:
+		break;
+	}
+
+	return false;
+}
+
 SnapMode
 Editor::snap_mode() const
 {
@@ -2103,14 +2239,10 @@ Editor::set_snap_to (SnapType st)
 	case SnapToBeatDiv4:
 	case SnapToBeatDiv3:
 	case SnapToBeatDiv2: {
-		ARDOUR::TempoMap::BBTPointList::const_iterator current_bbt_points_begin;
-		ARDOUR::TempoMap::BBTPointList::const_iterator current_bbt_points_end;
-
-		compute_current_bbt_points (leftmost_frame, leftmost_frame + current_page_samples(),
-					    current_bbt_points_begin, current_bbt_points_end);
-		compute_bbt_ruler_scale (leftmost_frame, leftmost_frame + current_page_samples(),
-					 current_bbt_points_begin, current_bbt_points_end);
-		update_tempo_based_rulers (current_bbt_points_begin, current_bbt_points_end);
+		std::vector<TempoMap::BBTPoint> grid;
+		compute_current_bbt_points (grid, leftmost_frame, leftmost_frame + current_page_samples());
+		compute_bbt_ruler_scale (grid, leftmost_frame, leftmost_frame + current_page_samples());
+		update_tempo_based_rulers (grid);
 		break;
 	}
 
@@ -2204,54 +2336,14 @@ Editor::set_edit_point_preference (EditPoint ep, bool force)
 }
 
 int
-Editor::set_state (const XMLNode& node, int /*version*/)
+Editor::set_state (const XMLNode& node, int version)
 {
-	const XMLProperty* prop;
-	XMLNode* geometry;
-	int x, y;
-	Gdk::Geometry g;
-
+	XMLProperty const * prop;
 	set_id (node);
+	PBD::Unwinder<bool> nsi (no_save_instant, true);
+	LocaleGuard lg;
 
-	g.base_width = default_width;
-	g.base_height = default_height;
-	x = 1;
-	y = 1;
-
-	if ((geometry = find_named_node (node, "geometry")) != 0) {
-
-		XMLProperty* prop;
-
-		if ((prop = geometry->property("x_size")) == 0) {
-			prop = geometry->property ("x-size");
-		}
-		if (prop) {
-			g.base_width = atoi(prop->value());
-		}
-		if ((prop = geometry->property("y_size")) == 0) {
-			prop = geometry->property ("y-size");
-		}
-		if (prop) {
-			g.base_height = atoi(prop->value());
-		}
-
-		if ((prop = geometry->property ("x_pos")) == 0) {
-			prop = geometry->property ("x-pos");
-		}
-		if (prop) {
-			x = atoi (prop->value());
-
-		}
-		if ((prop = geometry->property ("y_pos")) == 0) {
-			prop = geometry->property ("y-pos");
-		}
-		if (prop) {
-			y = atoi (prop->value());
-		}
-	}
-
-	set_default_size (g.base_width, g.base_height);
-	move (x, y);
+	Tabbable::set_state (node, version);
 
 	if (_session && (prop = node.property ("playhead"))) {
 		framepos_t pos;
@@ -2272,6 +2364,8 @@ Editor::set_state (const XMLNode& node, int /*version*/)
 
 	if ((prop = node.property ("zoom-focus"))) {
 		zoom_focus_selection_done ((ZoomFocus) string_2_enum (prop->value(), zoom_focus));
+	} else {
+		zoom_focus_selection_done (zoom_focus);
 	}
 
 	if ((prop = node.property ("zoom"))) {
@@ -2288,10 +2382,20 @@ Editor::set_state (const XMLNode& node, int /*version*/)
 
 	if ((prop = node.property ("snap-to"))) {
 		snap_type_selection_done ((SnapType) string_2_enum (prop->value(), _snap_type));
+		set_snap_to ((SnapType) string_2_enum (prop->value(), _snap_type));
+	} else {
+		set_snap_to (_snap_type);
 	}
 
 	if ((prop = node.property ("snap-mode"))) {
 		snap_mode_selection_done((SnapMode) string_2_enum (prop->value(), _snap_mode));
+		/* set text of Dropdown. in case _snap_mode == SnapOff (default)
+		 * snap_mode_selection_done() will only mark an already active item as active
+		 * which does not trigger set_text().
+		 */
+		set_snap_mode ((SnapMode) string_2_enum (prop->value(), _snap_mode));
+	} else {
+		set_snap_mode (_snap_mode);
 	}
 
 	if ((prop = node.property ("internal-snap-to"))) {
@@ -2344,6 +2448,8 @@ Editor::set_state (const XMLNode& node, int /*version*/)
 
 	if ((prop = node.property ("edit-point"))) {
 		set_edit_point_preference ((EditPoint) string_2_enum (prop->value(), _edit_point), true);
+	} else {
+		set_edit_point_preference (_edit_point);
 	}
 
 	if ((prop = node.property ("show-measures"))) {
@@ -2470,43 +2576,26 @@ Editor::set_state (const XMLNode& node, int /*version*/)
 		}
 	}
 
-	return 0;
+	return LuaInstance::instance()->set_state(node);
 }
 
 XMLNode&
 Editor::get_state ()
 {
-	XMLNode* node = new XMLNode ("Editor");
+	XMLNode* node = new XMLNode (X_("Editor"));
 	char buf[32];
+	LocaleGuard lg;
 
 	id().print (buf, sizeof (buf));
 	node->add_property ("id", buf);
 
-	if (is_realized()) {
-		Glib::RefPtr<Gdk::Window> win = get_window();
-
-		int x, y, width, height;
-		win->get_root_origin(x, y);
-		win->get_size(width, height);
+	node->add_child_nocopy (Tabbable::get_state());
 
-		XMLNode* geometry = new XMLNode ("geometry");
-
-		snprintf(buf, sizeof(buf), "%d", width);
-		geometry->add_property("x-size", string(buf));
-		snprintf(buf, sizeof(buf), "%d", height);
-		geometry->add_property("y-size", string(buf));
-		snprintf(buf, sizeof(buf), "%d", x);
-		geometry->add_property("x-pos", string(buf));
-		snprintf(buf, sizeof(buf), "%d", y);
-		geometry->add_property("y-pos", string(buf));
-		snprintf(buf,sizeof(buf), "%d",gtk_paned_get_position (static_cast<Paned*>(&edit_pane)->gobj()));
-		geometry->add_property("edit-horizontal-pane-pos", string(buf));
-		geometry->add_property("notebook-shrunk", _notebook_shrunk ? "1" : "0");
-		snprintf(buf,sizeof(buf), "%d",gtk_paned_get_position (static_cast<Paned*>(&editor_summary_pane)->gobj()));
-		geometry->add_property("edit-vertical-pane-pos", string(buf));
-
-		node->add_child_nocopy (*geometry);
-	}
+	snprintf(buf,sizeof(buf), "%f", edit_pane.get_divider ());
+	node->add_property("edit-horizontal-pane-pos", string(buf));
+	node->add_property("notebook-shrunk", _notebook_shrunk ? "1" : "0");
+	snprintf(buf,sizeof(buf), "%f", editor_summary_pane.get_divider());
+	node->add_property("edit-vertical-pane-pos", string(buf));
 
 	maybe_add_mixer_strip_width (*node);
 
@@ -2568,6 +2657,9 @@ Editor::get_state ()
 	snprintf (buf, sizeof (buf), "%" PRId64, nudge_clock->current_duration());
 	node->add_property ("nudge-clock-value", buf);
 
+	node->add_child_nocopy (LuaInstance::instance()->get_action_state());
+	node->add_child_nocopy (LuaInstance::instance()->get_hook_state());
+
 	return *node;
 }
 
@@ -2972,24 +3064,8 @@ Editor::setup_toolbar ()
 	if (!ARDOUR::Profile->get_trx()) {
 		mode_box->pack_start (edit_mode_selector, false, false);
 	}
-	mode_box->pack_start (*mouse_mode_box, false, false);
 
-	_mouse_mode_tearoff = manage (new TearOff (*mode_box));
-	_mouse_mode_tearoff->set_name ("MouseModeBase");
-	_mouse_mode_tearoff->tearoff_window().signal_key_press_event().connect (sigc::bind (sigc::ptr_fun (relay_key_press), &_mouse_mode_tearoff->tearoff_window()), false);
-
-	if (Profile->get_sae() || Profile->get_mixbus() ) {
-		_mouse_mode_tearoff->set_can_be_torn_off (false);
-	}
-
-	_mouse_mode_tearoff->Detach.connect (sigc::bind (sigc::mem_fun(*this, &Editor::detach_tearoff), static_cast<Box*>(&toolbar_hbox),
-	                                                 &_mouse_mode_tearoff->tearoff_window()));
-	_mouse_mode_tearoff->Attach.connect (sigc::bind (sigc::mem_fun(*this, &Editor::reattach_tearoff), static_cast<Box*> (&toolbar_hbox),
-	                                                 &_mouse_mode_tearoff->tearoff_window(), 1));
-	_mouse_mode_tearoff->Hidden.connect (sigc::bind (sigc::mem_fun(*this, &Editor::detach_tearoff), static_cast<Box*>(&toolbar_hbox),
-	                                                 &_mouse_mode_tearoff->tearoff_window()));
-	_mouse_mode_tearoff->Visible.connect (sigc::bind (sigc::mem_fun(*this, &Editor::reattach_tearoff), static_cast<Box*> (&toolbar_hbox),
-	                                                  &_mouse_mode_tearoff->tearoff_window(), 1));
+	mode_box->pack_start (*mouse_mode_box, false, false);
 
 	/* Zoom */
 
@@ -3061,23 +3137,6 @@ Editor::setup_toolbar ()
 		_zoom_box.pack_start (tav_expand_button);
 	}
 
-	if (!ARDOUR::Profile->get_trx()) {
-		_zoom_tearoff = manage (new TearOff (_zoom_box));
-
-		_zoom_tearoff->Detach.connect (sigc::bind (sigc::mem_fun(*this, &Editor::detach_tearoff), static_cast<Box*>(&toolbar_hbox),
-							   &_zoom_tearoff->tearoff_window()));
-		_zoom_tearoff->Attach.connect (sigc::bind (sigc::mem_fun(*this, &Editor::reattach_tearoff), static_cast<Box*> (&toolbar_hbox),
-							   &_zoom_tearoff->tearoff_window(), 0));
-		_zoom_tearoff->Hidden.connect (sigc::bind (sigc::mem_fun(*this, &Editor::detach_tearoff), static_cast<Box*>(&toolbar_hbox),
-							   &_zoom_tearoff->tearoff_window()));
-		_zoom_tearoff->Visible.connect (sigc::bind (sigc::mem_fun(*this, &Editor::reattach_tearoff), static_cast<Box*> (&toolbar_hbox),
-							    &_zoom_tearoff->tearoff_window(), 0));
-	}
-
-	if (Profile->get_sae() || Profile->get_mixbus() ) {
-		_zoom_tearoff->set_can_be_torn_off (false);
-	}
-
 	snap_box.set_spacing (2);
 	snap_box.set_border_width (2);
 
@@ -3110,37 +3169,19 @@ Editor::setup_toolbar ()
 	HBox* hbox = manage (new HBox);
 	hbox->set_spacing(2);
 
-	_tools_tearoff = manage (new TearOff (*hbox));
-	_tools_tearoff->set_name ("MouseModeBase");
-	_tools_tearoff->tearoff_window().signal_key_press_event().connect (sigc::bind (sigc::ptr_fun (relay_key_press), &_tools_tearoff->tearoff_window()), false);
-
-	if (Profile->get_sae() || Profile->get_mixbus()) {
-		_tools_tearoff->set_can_be_torn_off (false);
-	}
-
-	_tools_tearoff->Detach.connect (sigc::bind (sigc::mem_fun(*this, &Editor::detach_tearoff), static_cast<Box*>(&toolbar_hbox),
-	                                            &_tools_tearoff->tearoff_window()));
-	_tools_tearoff->Attach.connect (sigc::bind (sigc::mem_fun(*this, &Editor::reattach_tearoff), static_cast<Box*> (&toolbar_hbox),
-	                                            &_tools_tearoff->tearoff_window(), 0));
-	_tools_tearoff->Hidden.connect (sigc::bind (sigc::mem_fun(*this, &Editor::detach_tearoff), static_cast<Box*>(&toolbar_hbox),
-	                                            &_tools_tearoff->tearoff_window()));
-	_tools_tearoff->Visible.connect (sigc::bind (sigc::mem_fun(*this, &Editor::reattach_tearoff), static_cast<Box*> (&toolbar_hbox),
-	                                             &_tools_tearoff->tearoff_window(), 0));
-
 	toolbar_hbox.set_spacing (2);
 	toolbar_hbox.set_border_width (1);
 
-	toolbar_hbox.pack_start (*_mouse_mode_tearoff, false, false);
+	toolbar_hbox.pack_start (*mode_box, false, false);
 	if (!ARDOUR::Profile->get_trx()) {
-		toolbar_hbox.pack_start (*_zoom_tearoff, false, false);
-		toolbar_hbox.pack_start (*_tools_tearoff, false, false);
+		toolbar_hbox.pack_start (_zoom_box, false, false);
+		toolbar_hbox.pack_start (*hbox, false, false);
 	}
 
 	if (!ARDOUR::Profile->get_trx()) {
 		hbox->pack_start (snap_box, false, false);
 		hbox->pack_start (*nudge_box, false, false);
 	}
-	hbox->pack_start (panic_box, false, false);
 
 	hbox->show_all ();
 
@@ -3624,11 +3665,7 @@ Editor::cycle_edit_mode ()
 {
 	switch (Config->get_edit_mode()) {
 	case Slide:
-		if (Profile->get_sae()) {
-			Config->set_edit_mode (Lock);
-		} else {
-			Config->set_edit_mode (Ripple);
-		}
+		Config->set_edit_mode (Ripple);
 		break;
 	case Splice:
 	case Ripple:
@@ -3836,7 +3873,7 @@ bool
 Editor::edit_controls_button_release (GdkEventButton* ev)
 {
 	if (Keyboard::is_context_menu_event (ev)) {
-		ARDOUR_UI::instance()->add_route (this);
+		ARDOUR_UI::instance()->add_route ();
 	} else if (ev->button == 1) {
 		selection->clear_tracks ();
 	}
@@ -3897,98 +3934,6 @@ Editor::cycle_zoom_focus ()
 }
 
 void
-Editor::ensure_float (Window& win)
-{
-	win.set_transient_for (*this);
-}
-
-void
-Editor::pane_allocation_handler (Allocation &alloc, Paned* which)
-{
-	/* recover or initialize pane positions. do this here rather than earlier because
-	   we don't want the positions to change the child allocations, which they seem to do.
-	 */
-
-	int pos;
-	XMLProperty* prop;
-	char buf[32];
-	XMLNode* node = ARDOUR_UI::instance()->editor_settings();
-
-	enum Pane {
-		Horizontal = 0x1,
-		Vertical = 0x2
-	};
-
-	static Pane done;
-
-	XMLNode* geometry = find_named_node (*node, "geometry");
-
-	if (which == static_cast<Paned*> (&edit_pane)) {
-
-		if (done & Horizontal) {
-			return;
-		}
-
-		if (geometry && (prop = geometry->property ("notebook-shrunk"))) {
-			_notebook_shrunk = string_is_affirmative (prop->value ());
-		}
-
-		if (!geometry || (prop = geometry->property ("edit-horizontal-pane-pos")) == 0) {
-			/* initial allocation is 90% to canvas, 10% to notebook */
-			pos = (int) floor (alloc.get_width() * 0.90f);
-			snprintf (buf, sizeof(buf), "%d", pos);
-		} else {
-			pos = atoi (prop->value());
-		}
-
-		if (GTK_WIDGET(edit_pane.gobj())->allocation.width > pos) {
-			edit_pane.set_position (pos);
-		}
-
-		done = (Pane) (done | Horizontal);
-
-	} else if (which == static_cast<Paned*> (&editor_summary_pane)) {
-
-		if (done & Vertical) {
-			return;
-		}
-
-		if (!geometry || (prop = geometry->property ("edit-vertical-pane-pos")) == 0) {
-			/* initial allocation is 90% to canvas, 10% to summary */
-			pos = (int) floor (alloc.get_height() * 0.90f);
-			snprintf (buf, sizeof(buf), "%d", pos);
-		} else {
-
-			pos = atoi (prop->value());
-		}
-
-		if (GTK_WIDGET(editor_summary_pane.gobj())->allocation.height > pos) {
-			editor_summary_pane.set_position (pos);
-		}
-
-		done = (Pane) (done | Vertical);
-	}
-}
-
-void
-Editor::detach_tearoff (Box* /*b*/, Window* /*w*/)
-{
-	if ((_tools_tearoff->torn_off() || !_tools_tearoff->visible()) &&
-	    (_mouse_mode_tearoff->torn_off() || !_mouse_mode_tearoff->visible()) &&
-	    (_zoom_tearoff && (_zoom_tearoff->torn_off() || !_zoom_tearoff->visible()))) {
-		top_hbox.remove (toolbar_frame);
-	}
-}
-
-void
-Editor::reattach_tearoff (Box* /*b*/, Window* /*w*/, int32_t /*n*/)
-{
-	if (toolbar_frame.get_parent() == 0) {
-		top_hbox.pack_end (toolbar_frame);
-	}
-}
-
-void
 Editor::set_show_measures (bool yn)
 {
 	if (_show_measures != yn) {
@@ -3999,11 +3944,9 @@ Editor::set_show_measures (bool yn)
 				tempo_lines->show();
 			}
 
-			ARDOUR::TempoMap::BBTPointList::const_iterator begin;
-			ARDOUR::TempoMap::BBTPointList::const_iterator end;
-
-			compute_current_bbt_points (leftmost_frame, leftmost_frame + current_page_samples(), begin, end);
-			draw_measures (begin, end);
+			std::vector<TempoMap::BBTPoint> grid;
+			compute_current_bbt_points (grid, leftmost_frame, leftmost_frame + current_page_samples());
+			draw_measures (grid);
 		}
 
 		instant_save ();
@@ -4109,6 +4052,47 @@ Editor::get_grid_beat_divisions(framepos_t position)
 	return 0;
 }
 
+/** returns the current musical grid divisiions using the supplied modifier mask from a GtkEvent.
+    if the grid is non-musical, returns 0.
+    if the grid is snapped to bars, returns -1.
+    @param event_state the current keyboard modifier mask.
+*/
+unsigned
+Editor::get_grid_music_divisions (uint32_t event_state)
+{
+	if (snap_mode() == Editing::SnapOff && !ArdourKeyboard::indicates_snap (event_state)) {
+		return 0;
+	}
+
+	if (snap_mode() != Editing::SnapOff && ArdourKeyboard::indicates_snap (event_state)) {
+		return 0;
+	}
+
+	switch (_snap_type) {
+	case SnapToBeatDiv128: return 128;
+	case SnapToBeatDiv64:  return 64;
+	case SnapToBeatDiv32:  return 32;
+	case SnapToBeatDiv28:  return 28;
+	case SnapToBeatDiv24:  return 24;
+	case SnapToBeatDiv20:  return 20;
+	case SnapToBeatDiv16:  return 16;
+	case SnapToBeatDiv14:  return 14;
+	case SnapToBeatDiv12:  return 12;
+	case SnapToBeatDiv10:  return 10;
+	case SnapToBeatDiv8:   return 8;
+	case SnapToBeatDiv7:   return 7;
+	case SnapToBeatDiv6:   return 6;
+	case SnapToBeatDiv5:   return 5;
+	case SnapToBeatDiv4:   return 4;
+	case SnapToBeatDiv3:   return 3;
+	case SnapToBeatDiv2:   return 2;
+	case SnapToBeat:       return 1;
+	case SnapToBar :       return -1;
+	default:               return 0;
+	}
+	return 0;
+}
+
 Evoral::Beats
 Editor::get_grid_type_as_beats (bool& success, framepos_t position)
 {
@@ -4124,7 +4108,7 @@ Editor::get_grid_type_as_beats (bool& success, framepos_t position)
 		return Evoral::Beats(1.0);
 	case SnapToBar:
 		if (_session) {
-			return Evoral::Beats(_session->tempo_map().meter_at (position).divisions_per_bar());
+			return Evoral::Beats(_session->tempo_map().meter_at_frame (position).divisions_per_bar());
 		}
 		break;
 	default:
@@ -4268,34 +4252,18 @@ Editor::session_state_saved (string)
 }
 
 void
-Editor::update_tearoff_visibility()
-{
-	bool visible = UIConfiguration::instance().get_keep_tearoffs();
-	_mouse_mode_tearoff->set_visible (visible);
-	_tools_tearoff->set_visible (visible);
-	if (_zoom_tearoff) {
-		_zoom_tearoff->set_visible (visible);
-	}
-}
-
-void
-Editor::reattach_all_tearoffs ()
-{
-	if (_mouse_mode_tearoff) _mouse_mode_tearoff->put_it_back ();
-	if (_tools_tearoff) _tools_tearoff->put_it_back ();
-	if (_zoom_tearoff) _zoom_tearoff->put_it_back ();
-}
-
-void
 Editor::maximise_editing_space ()
 {
 	if (_maximised) {
 		return;
 	}
 
-	fullscreen ();
+	Gtk::Window* toplevel = current_toplevel();
 
-	_maximised = true;
+	if (toplevel) {
+		toplevel->fullscreen ();
+		_maximised = true;
+	}
 }
 
 void
@@ -4305,9 +4273,12 @@ Editor::restore_editing_space ()
 		return;
 	}
 
-	unfullscreen();
+	Gtk::Window* toplevel = current_toplevel();
 
-	_maximised = false;
+	if (toplevel) {
+		toplevel->unfullscreen();
+		_maximised = false;
+	}
 }
 
 /**
@@ -4322,7 +4293,7 @@ Editor::new_playlists (TimeAxisView* v)
 	begin_reversible_command (_("new playlists"));
 	vector<boost::shared_ptr<ARDOUR::Playlist> > playlists;
 	_session->playlists->get (playlists);
-	mapover_tracks (sigc::bind (sigc::mem_fun (*this, &Editor::mapped_use_new_playlist), playlists), v, ARDOUR::Properties::select.property_id);
+	mapover_tracks (sigc::bind (sigc::mem_fun (*this, &Editor::mapped_use_new_playlist), playlists), v, ARDOUR::Properties::group_select.property_id);
 	commit_reversible_command ();
 }
 
@@ -4338,7 +4309,7 @@ Editor::copy_playlists (TimeAxisView* v)
 	begin_reversible_command (_("copy playlists"));
 	vector<boost::shared_ptr<ARDOUR::Playlist> > playlists;
 	_session->playlists->get (playlists);
-	mapover_tracks (sigc::bind (sigc::mem_fun (*this, &Editor::mapped_use_copy_playlist), playlists), v, ARDOUR::Properties::select.property_id);
+	mapover_tracks (sigc::bind (sigc::mem_fun (*this, &Editor::mapped_use_copy_playlist), playlists), v, ARDOUR::Properties::group_select.property_id);
 	commit_reversible_command ();
 }
 
@@ -4353,7 +4324,7 @@ Editor::clear_playlists (TimeAxisView* v)
 	begin_reversible_command (_("clear playlists"));
 	vector<boost::shared_ptr<ARDOUR::Playlist> > playlists;
 	_session->playlists->get (playlists);
-	mapover_tracks (sigc::mem_fun (*this, &Editor::mapped_clear_playlist), v, ARDOUR::Properties::select.property_id);
+	mapover_tracks (sigc::mem_fun (*this, &Editor::mapped_clear_playlist), v, ARDOUR::Properties::group_select.property_id);
 	commit_reversible_command ();
 }
 
@@ -4375,19 +4346,6 @@ Editor::mapped_clear_playlist (RouteTimeAxisView& atv, uint32_t /*sz*/)
 	atv.clear_playlist ();
 }
 
-bool
-Editor::on_key_press_event (GdkEventKey* ev)
-{
-	return key_press_focus_accelerator_handler (*this, ev);
-}
-
-bool
-Editor::on_key_release_event (GdkEventKey* ev)
-{
-	return Gtk::Window::on_key_release_event (ev);
-	// return key_press_focus_accelerator_handler (*this, ev);
-}
-
 double
 Editor::get_y_origin () const
 {
@@ -4456,7 +4414,7 @@ Editor::current_visual_state (bool with_tracks)
 	vs->zoom_focus = zoom_focus;
 
 	if (with_tracks) {
-		*vs->gui_state = *ARDOUR_UI::instance()->gui_object_state;
+		vs->gui_state->set_state (ARDOUR_UI::instance()->gui_object_state->get_state());
 	}
 
 	return vs;
@@ -4521,7 +4479,7 @@ Editor::use_visual_state (VisualState& vs)
 	reposition_and_zoom (vs.leftmost_frame, vs.samples_per_pixel);
 
 	if (vs.gui_state) {
-		*ARDOUR_UI::instance()->gui_object_state = *vs.gui_state;
+		ARDOUR_UI::instance()->gui_object_state->set_state (vs.gui_state->get_state());
 
 		for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) {
 			(*i)->clear_property_cache();
@@ -4655,14 +4613,10 @@ Editor::visual_changer (const VisualChange& vc)
 
 		compute_fixed_ruler_scale ();
 
-		ARDOUR::TempoMap::BBTPointList::const_iterator current_bbt_points_begin;
-		ARDOUR::TempoMap::BBTPointList::const_iterator current_bbt_points_end;
-
-		compute_current_bbt_points (vc.time_origin, pending_visual_change.time_origin + current_page_samples(),
-					    current_bbt_points_begin, current_bbt_points_end);
-		compute_bbt_ruler_scale (vc.time_origin, pending_visual_change.time_origin + current_page_samples(),
-					 current_bbt_points_begin, current_bbt_points_end);
-		update_tempo_based_rulers (current_bbt_points_begin, current_bbt_points_end);
+		std::vector<TempoMap::BBTPoint> grid;
+		compute_current_bbt_points (grid, vc.time_origin, pending_visual_change.time_origin + current_page_samples());
+		compute_bbt_ruler_scale (grid, vc.time_origin, pending_visual_change.time_origin + current_page_samples());
+		update_tempo_based_rulers (grid);
 
 		update_video_timeline();
 	}
@@ -4980,7 +4934,7 @@ Editor::get_regions_from_selection_and_mouse (framepos_t pos)
  */
 
 RegionSelection
-Editor::get_regions_from_selection_and_entered ()
+Editor::get_regions_from_selection_and_entered () const
 {
 	RegionSelection regions = selection->regions;
 
@@ -5092,12 +5046,11 @@ Editor::first_idle ()
 	if (track_views.size() > 1) {
 		Timers::TimerSuspender t;
 		dialog = new MessageDialog (
-			*this,
 			string_compose (_("Please wait while %1 loads visual data."), PROGRAM_NAME),
 			true
 			);
 		dialog->present ();
-		ARDOUR_UI::instance()->flush_pending ();
+		ARDOUR_UI::instance()->flush_pending (60);
 	}
 
 	for (TrackViewList::iterator t = track_views.begin(); t != track_views.end(); ++t) {
@@ -5233,16 +5186,13 @@ Editor::region_view_removed ()
 	_summary->set_background_dirty ();
 }
 
-RouteTimeAxisView*
-Editor::axis_view_from_route (boost::shared_ptr<Route> r) const
+TimeAxisView*
+Editor::axis_view_from_stripable (boost::shared_ptr<Stripable> s) const
 {
-	TrackViewList::const_iterator j = track_views.begin ();
-	while (j != track_views.end()) {
-		RouteTimeAxisView* rtv = dynamic_cast<RouteTimeAxisView*> (*j);
-		if (rtv && rtv->route() == r) {
-			return rtv;
+	for (TrackViewList::const_iterator j = track_views.begin (); j != track_views.end(); ++j) {
+		if ((*j)->stripable() == s) {
+			return *j;
 		}
-		++j;
 	}
 
 	return 0;
@@ -5255,7 +5205,7 @@ Editor::axis_views_from_routes (boost::shared_ptr<RouteList> r) const
 	TrackViewList t;
 
 	for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
-		TimeAxisView* tv = axis_view_from_route (*i);
+		TimeAxisView* tv = axis_view_from_stripable (*i);
 		if (tv) {
 			t.push_back (tv);
 		}
@@ -5282,56 +5232,94 @@ Editor::resume_route_redisplay ()
 }
 
 void
-Editor::add_routes (RouteList& routes)
+Editor::add_vcas (VCAList& vlist)
+{
+	StripableList sl;
+
+	for (VCAList::iterator v = vlist.begin(); v != vlist.end(); ++v) {
+		sl.push_back (boost::dynamic_pointer_cast<Stripable> (*v));
+	}
+
+	add_stripables (sl);
+}
+
+void
+Editor::add_routes (RouteList& rlist)
 {
-	ENSURE_GUI_THREAD (*this, &Editor::handle_new_route, routes)
+	StripableList sl;
 
-	RouteTimeAxisView *rtv;
-	list<RouteTimeAxisView*> new_views;
+	for (RouteList::iterator r = rlist.begin(); r != rlist.end(); ++r) {
+		sl.push_back (*r);
+	}
+
+	add_stripables (sl);
+}
+
+void
+Editor::add_stripables (StripableList& sl)
+{
+	list<TimeAxisView*> new_views;
+	boost::shared_ptr<VCA> v;
+	boost::shared_ptr<Route> r;
 	TrackViewList new_selection;
 	bool from_scratch = (track_views.size() == 0);
 
-	for (RouteList::iterator x = routes.begin(); x != routes.end(); ++x) {
-		boost::shared_ptr<Route> route = (*x);
+	sl.sort (StripablePresentationInfoSorter());
 
-		if (route->is_auditioner() || route->is_monitor()) {
-			continue;
-		}
+	for (StripableList::iterator s = sl.begin(); s != sl.end(); ++s) {
 
-		DataType dt = route->input()->default_type();
+		if ((v = boost::dynamic_pointer_cast<VCA> (*s)) != 0) {
 
-		if (dt == ARDOUR::DataType::AUDIO) {
-			rtv = new AudioTimeAxisView (*this, _session, *_track_canvas);
-			rtv->set_route (route);
-		} else if (dt == ARDOUR::DataType::MIDI) {
-			rtv = new MidiTimeAxisView (*this, _session, *_track_canvas);
-			rtv->set_route (route);
-		} else {
-			throw unknown_type();
-		}
+			VCATimeAxisView* vtv = new VCATimeAxisView (*this, _session, *_track_canvas);
+			vtv->set_vca (v);
+			new_views.push_back (vtv);
 
-		new_views.push_back (rtv);
-		track_views.push_back (rtv);
-		new_selection.push_back (rtv);
+		} else if ((r = boost::dynamic_pointer_cast<Route> (*s)) != 0) {
 
-		rtv->effective_gain_display ();
+			if (r->is_auditioner() || r->is_monitor()) {
+				continue;
+			}
+
+			RouteTimeAxisView* rtv;
+			DataType dt = r->input()->default_type();
 
-		rtv->view()->RegionViewAdded.connect (sigc::mem_fun (*this, &Editor::region_view_added));
-		rtv->view()->RegionViewRemoved.connect (sigc::mem_fun (*this, &Editor::region_view_removed));
+			if (dt == ARDOUR::DataType::AUDIO) {
+				rtv = new AudioTimeAxisView (*this, _session, *_track_canvas);
+				rtv->set_route (r);
+			} else if (dt == ARDOUR::DataType::MIDI) {
+				rtv = new MidiTimeAxisView (*this, _session, *_track_canvas);
+				rtv->set_route (r);
+			} else {
+				throw unknown_type();
+			}
+
+			new_views.push_back (rtv);
+			track_views.push_back (rtv);
+			new_selection.push_back (rtv);
+
+			rtv->effective_gain_display ();
+
+			rtv->view()->RegionViewAdded.connect (sigc::mem_fun (*this, &Editor::region_view_added));
+			rtv->view()->RegionViewRemoved.connect (sigc::mem_fun (*this, &Editor::region_view_removed));
+		}
 	}
 
 	if (new_views.size() > 0) {
-		_routes->routes_added (new_views);
-		_summary->routes_added (new_views);
+		_routes->time_axis_views_added (new_views);
+		//_summary->routes_added (new_selection); /* XXX requires RouteTimeAxisViewList */
 	}
 
-	if (!from_scratch) {
+	/* note: !new_selection.empty() means that we got some routes rather
+	 * than just VCAs
+	 */
+
+	if (!from_scratch && !new_selection.empty()) {
 		selection->tracks.clear();
 		selection->add (new_selection);
 		begin_selection_op_history();
 	}
 
-	if (show_editor_mixer_when_tracks_arrive) {
+	if (show_editor_mixer_when_tracks_arrive && !new_selection.empty()) {
 		show_editor_mixer (true);
 	}
 
@@ -5665,7 +5653,7 @@ Editor::super_rapid_screen_update ()
 	/* METERING / MIXER STRIPS */
 
 	/* update track meters, if required */
-	if (is_mapped() && meters_running) {
+	if (contents().is_mapped() && meters_running) {
 		RouteTimeAxisView* rtv;
 		for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) {
 			if ((rtv = dynamic_cast<RouteTimeAxisView*>(*i)) != 0) {
@@ -5795,16 +5783,42 @@ Editor::session_going_away ()
 
 	stop_step_editing ();
 
-	/* get rid of any existing editor mixer strip */
+	if (own_window()) {
+
+		/* get rid of any existing editor mixer strip */
 
-	WindowTitle title(Glib::get_application_name());
-	title += _("Editor");
+		WindowTitle title(Glib::get_application_name());
+		title += _("Editor");
 
-	set_title (title.get_string());
+		own_window()->set_title (title.get_string());
+	}
 
 	SessionHandlePtr::session_going_away ();
 }
 
+void
+Editor::trigger_script (int i)
+{
+	LuaInstance::instance()-> call_action (i);
+}
+
+void
+Editor::set_script_action_name (int i, const std::string& n)
+{
+	string const a = string_compose (X_("script-action-%1"), i + 1);
+	Glib::RefPtr<Action> act = ActionManager::get_action(X_("Editor"), a.c_str());
+	assert (act);
+	if (n.empty ()) {
+		act->set_label (string_compose (_("Unset #%1"), i + 1));
+		act->set_tooltip (_("no action bound"));
+		act->set_sensitive (false);
+	} else {
+		act->set_label (n);
+		act->set_tooltip (n);
+		act->set_sensitive (true);
+	}
+	KeyEditor::UpdateBindings ();
+}
 
 void
 Editor::show_editor_list (bool yn)
@@ -5920,16 +5934,16 @@ Editor::notebook_tab_clicked (GdkEventButton* ev, Gtk::Widget* page)
 
 		if (_notebook_shrunk) {
 			if (pre_notebook_shrink_pane_width) {
-				edit_pane.set_position (*pre_notebook_shrink_pane_width);
+				edit_pane.set_divider (0, *pre_notebook_shrink_pane_width);
 			}
 			_notebook_shrunk = false;
 		} else {
-			pre_notebook_shrink_pane_width = edit_pane.get_position();
+			pre_notebook_shrink_pane_width = edit_pane.get_divider();
 
 			/* this expands the LHS of the edit pane to cover the notebook
 			   PAGE but leaves the tabs visible.
 			 */
-			edit_pane.set_position (edit_pane.get_position() + page->get_width());
+			edit_pane.set_divider (0, edit_pane.get_divider() + page->get_width());
 			_notebook_shrunk = true;
 		}
 	}
@@ -6026,9 +6040,65 @@ Editor::ui_parameter_changed (string parameter)
 		}
 		_cursors->set_cursor_set (UIConfiguration::instance().get_icon_set());
 		_cursor_stack.push_back(_cursors->grabber);
+		edit_pane.set_drag_cursor (*_cursors->expand_left_right);
+		editor_summary_pane.set_drag_cursor (*_cursors->expand_up_down);
+
 	} else if (parameter == "draggable-playhead") {
 		if (_verbose_cursor) {
 			playhead_cursor->set_sensitive (UIConfiguration::instance().get_draggable_playhead());
 		}
 	}
 }
+
+Gtk::Window*
+Editor::use_own_window (bool and_fill_it)
+{
+	bool new_window = !own_window();
+
+	Gtk::Window* win = Tabbable::use_own_window (and_fill_it);
+
+	if (win && new_window) {
+		win->set_name ("EditorWindow");
+
+		ARDOUR_UI::instance()->setup_toplevel_window (*win, _("Editor"), this);
+
+		// win->signal_realize().connect (*this, &Editor::on_realize);
+		win->signal_event().connect (sigc::bind (sigc::ptr_fun (&Keyboard::catch_user_event_for_pre_dialog_focus), win));
+		win->signal_event().connect (sigc::mem_fun (*this, &Editor::generic_event_handler));
+		win->set_data ("ardour-bindings", bindings);
+
+		update_title ();
+	}
+
+	DisplaySuspender ds;
+	contents().show_all ();
+
+	/* XXX: this is a bit unfortunate; it would probably
+	   be nicer if we could just call show () above rather
+	   than needing the show_all ()
+	*/
+
+	/* re-hide stuff if necessary */
+	editor_list_button_toggled ();
+	parameter_changed ("show-summary");
+	parameter_changed ("show-group-tabs");
+	parameter_changed ("show-zoom-tools");
+
+	/* now reset all audio_time_axis heights, because widgets might need
+	   to be re-hidden
+	*/
+
+	TimeAxisView *tv;
+
+	for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) {
+		tv = (static_cast<TimeAxisView*>(*i));
+		tv->reset_height ();
+	}
+
+	if (current_mixer_strip) {
+		current_mixer_strip->hide_things ();
+		current_mixer_strip->parameter_changed ("mixer-element-visibility");
+	}
+
+	return win;
+}
diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h
index fab6535..d45545b 100644
--- a/gtk2_ardour/editor.h
+++ b/gtk2_ardour/editor.h
@@ -34,11 +34,12 @@
 #include <gtkmm/comboboxtext.h>
 #include <gtkmm/layout.h>
 
-#include "gtkmm2ext/selector.h"
+#include "gtkmm2ext/bindings.h"
 #include "gtkmm2ext/click_box.h"
 #include "gtkmm2ext/dndtreeview.h"
+#include "gtkmm2ext/pane.h"
+#include "gtkmm2ext/selector.h"
 #include "gtkmm2ext/stateful_button.h"
-#include "gtkmm2ext/bindings.h"
 
 #include "pbd/stateful.h"
 #include "pbd/signals.h"
@@ -60,9 +61,9 @@
 #include "editor_items.h"
 #include "region_selection.h"
 #include "selection_memento.h"
+#include "tempo_curve.h"
 
 namespace Gtkmm2ext {
-	class TearOff;
 	class Bindings;
 }
 
@@ -143,6 +144,8 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
 	void             set_session (ARDOUR::Session *);
 	ARDOUR::Session* session() const { return _session; }
 
+	Gtk::Window* use_own_window (bool and_fill_it);
+
 	void             first_idle ();
 	virtual bool     have_idled () const { return _have_idled; }
 
@@ -170,6 +173,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
 
 	Editing::SnapMode  snap_mode () const;
 	Editing::SnapType  snap_type () const;
+	bool  snap_musical () const;
 
 	void undo (uint32_t n = 1);
 	void redo (uint32_t n = 1);
@@ -245,7 +249,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
 	/* selection */
 
 	Selection& get_selection() const { return *selection; }
-	bool get_selection_extents ( framepos_t &start, framepos_t &end );  // the time extents of the current selection, whether Range, Region(s), Control Points, or Notes
+	bool get_selection_extents (framepos_t &start, framepos_t &end) const;  // the time extents of the current selection, whether Range, Region(s), Control Points, or Notes
 	Selection& get_cut_buffer() const { return *cut_buffer; }
 	void track_mixer_selection ();
 
@@ -273,8 +277,11 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
 
 	/* analysis window */
 
-	void analyze_region_selection();
-	void analyze_range_selection();
+	void loudness_analyze_region_selection();
+	void loudness_analyze_range_selection();
+
+	void spectral_analyze_region_selection();
+	void spectral_analyze_range_selection();
 
 	/* export */
 
@@ -286,10 +293,6 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
 
 	bool process_midi_export_dialog (MidiExportDialog& dialog, boost::shared_ptr<ARDOUR::MidiRegion> midi_region);
 
-	void add_transport_frame (Gtk::Container&);
-	void add_toplevel_menu (Gtk::Container&);
-	Gtk::HBox& get_status_bar_packer()  { return status_bar_hpacker; }
-
 	void               set_zoom_focus (Editing::ZoomFocus);
 	Editing::ZoomFocus get_zoom_focus () const { return zoom_focus; }
 	framecnt_t         get_current_zoom () const { return samples_per_pixel; }
@@ -327,6 +330,8 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
 	unsigned get_grid_beat_divisions(framepos_t position);
 	Evoral::Beats get_grid_type_as_beats (bool& success, framepos_t position);
 
+	unsigned get_grid_music_divisions (uint32_t event_state);
+
 	void nudge_forward (bool next, bool force_playhead);
 	void nudge_backward (bool next, bool force_playhead);
 
@@ -352,7 +357,6 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
 	void set_summary ();
 	void set_group_tabs ();
 	void toggle_measure_visibility ();
-	void toggle_logo_visibility ();
 
 	/* fades */
 
@@ -367,8 +371,6 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
 
 	void ensure_float (Gtk::Window&);
 
-	void show_window ();
-
 	void scroll_tracks_down_line ();
 	void scroll_tracks_up_line ();
 
@@ -387,9 +389,6 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
 	void maximise_editing_space();
 	void restore_editing_space();
 
-	void update_tearoff_visibility();
-	void reattach_all_tearoffs ();
-
 	double get_y_origin () const;
 	void reset_x_origin (framepos_t);
 	void reset_x_origin_to_follow_playhead ();
@@ -445,9 +444,6 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
 
 	TrackViewList axis_views_from_routes (boost::shared_ptr<ARDOUR::RouteList>) const;
 
-	Gtkmm2ext::TearOff* mouse_mode_tearoff () const { return _mouse_mode_tearoff; }
-	Gtkmm2ext::TearOff* tools_tearoff () const { return _tools_tearoff; }
-
 	void snap_to (framepos_t&       first,
 	              ARDOUR::RoundMode direction = ARDOUR::RoundNearest,
 	              bool              for_mark  = false,
@@ -538,7 +534,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
 
 	/* editing operations that need to be public */
 	void mouse_add_new_marker (framepos_t where, bool is_cd=false);
-	void split_regions_at (framepos_t, RegionSelection&);
+	void split_regions_at (framepos_t, RegionSelection&, const int32_t sub_num);
 	void split_region_at_points (boost::shared_ptr<ARDOUR::Region>, ARDOUR::AnalysisFeatureList&, bool can_ferret, bool select_new = false);
 	RegionSelection get_regions_from_selection_and_mouse (framepos_t);
 
@@ -617,17 +613,15 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
 
 	void update_join_object_range_location (double);
 
-	boost::optional<int>  pre_notebook_shrink_pane_width;
-
-	void pane_allocation_handler (Gtk::Allocation&, Gtk::Paned*);
+	boost::optional<float>  pre_notebook_shrink_pane_width;
 
 	Gtk::Notebook _the_notebook;
 	bool _notebook_shrunk;
 	void add_notebook_page (std::string const &, Gtk::Widget &);
 	bool notebook_tab_clicked (GdkEventButton *, Gtk::Widget *);
 
-	Gtk::HPaned   edit_pane;
-	Gtk::VPaned   editor_summary_pane;
+	Gtkmm2ext::HPane   edit_pane;
+	Gtkmm2ext::VPane   editor_summary_pane;
 
 	Gtk::EventBox meter_base;
 	Gtk::HBox     meter_box;
@@ -645,6 +639,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
 	void remove_marker (ArdourCanvas::Item&, GdkEvent*);
 	gint really_remove_marker (ARDOUR::Location* loc);
 	void goto_nth_marker (int nth);
+	void trigger_script (int nth);
 	void toggle_marker_lines ();
 	void set_marker_line_visibility (bool);
 
@@ -779,12 +774,13 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
 	void popup_note_context_menu (ArdourCanvas::Item *, GdkEvent *);
 	Gtk::Menu _note_context_menu;
 
+	void add_stripables (ARDOUR::StripableList&);
 	void add_routes (ARDOUR::RouteList&);
 	void timeaxisview_deleted (TimeAxisView *);
+	void add_vcas (ARDOUR::VCAList&);
 
-	Gtk::HBox           global_hpacker;
-	Gtk::VBox           global_vpacker;
-	Gtk::VBox           vpacker;
+	Gtk::HBox global_hpacker;
+	Gtk::VBox global_vpacker;
 
 	/* Cursor stuff.  Do not use directly, use via CursorContext. */
 	friend class CursorContext;
@@ -819,15 +815,6 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
 	Gtk::EventBox             time_bars_event_box;
 	Gtk::VBox                 time_bars_vbox;
 
-	ArdourCanvas::Pixbuf     *logo_item;
-#if 0
-    /* these will be needed when we have canvas rulers */
-	ArdourCanvas::Container      *minsec_group;
-	ArdourCanvas::Container      *bbt_group;
-	ArdourCanvas::Container      *timecode_group;
-	ArdourCanvas::Container      *frame_group;
-#endif
-
 	ArdourCanvas::Container      *tempo_group;
 	ArdourCanvas::Container      *meter_group;
 	ArdourCanvas::Container      *marker_group;
@@ -903,8 +890,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
 	void update_just_timecode ();
 	void compute_fixed_ruler_scale (); //calculates the RulerScale of the fixed rulers
 	void update_fixed_rulers ();
-	void update_tempo_based_rulers (ARDOUR::TempoMap::BBTPointList::const_iterator& begin,
-					ARDOUR::TempoMap::BBTPointList::const_iterator& end);
+	void update_tempo_based_rulers (std::vector<ARDOUR::TempoMap::BBTPoint>& grid);
 	void popup_ruler_menu (framepos_t where = 0, ItemType type = RegionItem);
 	void update_ruler_visibility ();
 	void set_ruler_visible (RulerType, bool);
@@ -967,9 +953,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
 	gint bbt_nmarks;
 	uint32_t bbt_bar_helper_on;
 	uint32_t bbt_accent_modulo;
-	void compute_bbt_ruler_scale (framepos_t lower, framepos_t upper,
-				      ARDOUR::TempoMap::BBTPointList::const_iterator current_bbt_points_begin,
-				      ARDOUR::TempoMap::BBTPointList::const_iterator current_bbt_points_end);
+	void compute_bbt_ruler_scale (std::vector<ARDOUR::TempoMap::BBTPoint>& grid, framepos_t lower, framepos_t upper);
 
 	ArdourCanvas::Ruler* timecode_ruler;
 	ArdourCanvas::Ruler* bbt_ruler;
@@ -1107,7 +1091,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
 	void control_step_tracks_down ();
 	void control_view (uint32_t);
 	void control_scroll (float);
-	void control_select (uint32_t rid, Selection::Operation);
+	void control_select (boost::shared_ptr<ARDOUR::Stripable>, Selection::Operation);
 	void control_unselect ();
 	void access_action (std::string,std::string);
 	bool deferred_control_scroll (framepos_t);
@@ -1149,7 +1133,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
 	/* track views */
 	TrackViewList track_views;
 	std::pair<TimeAxisView*, double> trackview_by_y_position (double, bool trackview_relative_offset = true) const;
-	RouteTimeAxisView* axis_view_from_route (boost::shared_ptr<ARDOUR::Route>) const;
+	TimeAxisView* axis_view_from_stripable (boost::shared_ptr<ARDOUR::Stripable>) const;
 
 	TrackViewList get_tracks_for_range_action () const;
 
@@ -1192,8 +1176,6 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
 	void register_region_actions ();
 
 	void load_bindings ();
-	Gtkmm2ext::ActionMap editor_action_map;
-	Gtkmm2ext::Bindings  key_bindings;
 
 	/* CUT/COPY/PASTE */
 
@@ -1208,7 +1190,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
 	void cut_copy_midi (Editing::CutCopyOp);
 
 	void mouse_paste ();
-	void paste_internal (framepos_t position, float times);
+	void paste_internal (framepos_t position, float times, const int32_t sub_num);
 
 	/* EDITING OPERATIONS */
 
@@ -1294,14 +1276,14 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
 
 	void naturalize_region ();
 
-	void reset_focus ();
+	void reset_focus (Gtk::Widget*);
 
 	void split_region ();
 
 	void delete_ ();
 	void cut ();
 	void copy ();
-	void paste (float times, bool from_context_menu = false);
+	void paste (float times, bool from_context_menu);
 
 	void place_transient ();
 	void remove_transient (ArdourCanvas::Item* item);
@@ -1587,6 +1569,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
 	bool canvas_stream_view_event (GdkEvent* event,ArdourCanvas::Item*, RouteTimeAxisView*);
 	bool canvas_marker_event (GdkEvent* event,ArdourCanvas::Item*, ArdourMarker*);
 	bool canvas_tempo_marker_event (GdkEvent* event,ArdourCanvas::Item*, TempoMarker*);
+	bool canvas_tempo_curve_event (GdkEvent* event,ArdourCanvas::Item*, TempoCurve*);
 	bool canvas_meter_marker_event (GdkEvent* event,ArdourCanvas::Item*, MeterMarker*);
 	bool canvas_automation_track_event(GdkEvent* event, ArdourCanvas::Item*, AutomationTimeAxisView*);
 	bool canvas_note_event (GdkEvent* event, ArdourCanvas::Item *);
@@ -1638,6 +1621,8 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
 
 	void initialize_canvas ();
 
+	void set_script_action_name (int i, const std::string&);
+
 	/* display control */
 
 	bool _show_measures;
@@ -1654,8 +1639,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
 	ArdourCanvas::Container* time_line_group;
 
 	void hide_measures ();
-	void draw_measures (ARDOUR::TempoMap::BBTPointList::const_iterator& begin,
-			    ARDOUR::TempoMap::BBTPointList::const_iterator& end);
+	void draw_measures (std::vector<ARDOUR::TempoMap::BBTPoint>&);
 
 	void new_tempo_section ();
 
@@ -1674,6 +1658,8 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
 	void marker_menu_remove ();
 	void marker_menu_rename ();
 	void rename_marker (ArdourMarker *marker);
+	void toggle_marker_lock_style ();
+	void toggle_tempo_type ();
 	void toggle_marker_menu_lock ();
 	void toggle_marker_menu_glue ();
 	void marker_menu_hide ();
@@ -1698,11 +1684,13 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
 	void new_transport_marker_context_menu (GdkEventButton*, ArdourCanvas::Item*);
 	void build_range_marker_menu (bool, bool);
 	void build_marker_menu (ARDOUR::Location *);
-	void build_tempo_or_meter_marker_menu (bool);
+	void build_tempo_marker_menu (TempoMarker *, bool);
+	void build_meter_marker_menu (MeterMarker *, bool);
 	void build_new_transport_marker_menu ();
 	void dynamic_cast_marker_object (void*, MeterMarker**, TempoMarker**) const;
 
-	Gtk::Menu* tempo_or_meter_marker_menu;
+	Gtk::Menu* tempo_marker_menu;
+	Gtk::Menu* meter_marker_menu;
 	Gtk::Menu* marker_menu;
 	Gtk::Menu* range_marker_menu;
 	Gtk::Menu* transport_marker_menu;
@@ -1713,14 +1701,16 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
 	typedef std::list<ArdourMarker*> Marks;
 	Marks metric_marks;
 
+	typedef std::list<TempoCurve*> Curves;
+	Curves tempo_curves;
+
 	void remove_metric_marks ();
 	void draw_metric_marks (const ARDOUR::Metrics& metrics);
 
-	void compute_current_bbt_points (framepos_t left, framepos_t right,
-					 ARDOUR::TempoMap::BBTPointList::const_iterator& begin,
-					 ARDOUR::TempoMap::BBTPointList::const_iterator& end);
+	void compute_current_bbt_points (std::vector<ARDOUR::TempoMap::BBTPoint>& grid, framepos_t left, framepos_t right);
 
 	void tempo_map_changed (const PBD::PropertyChange&);
+	void marker_position_changed ();
 	void redisplay_tempo (bool immediate_redraw);
 
 	uint32_t bbt_beat_subdivision;
@@ -1752,7 +1742,6 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
 	Gtk::Table               toolbar_selection_clock_table;
 	Gtk::Label               toolbar_selection_cursor_label;
 
-	Gtkmm2ext::TearOff*      _mouse_mode_tearoff;
 	ArdourButton mouse_select_button;
 	ArdourButton mouse_draw_button;
 	ArdourButton mouse_move_button;
@@ -1811,23 +1800,17 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
 	Glib::RefPtr<Gtk::RadioAction> zoom_focus_action (Editing::ZoomFocus);
 
 	Gtk::HBox           _zoom_box;
-	Gtkmm2ext::TearOff* _zoom_tearoff;
 	void                zoom_adjustment_changed();
 
 	void setup_toolbar ();
 
 	void setup_tooltips ();
 
-	Gtkmm2ext::TearOff*     _tools_tearoff;
 	Gtk::HBox                toolbar_hbox;
 	Gtk::EventBox            toolbar_base;
 	Gtk::Frame               toolbar_frame;
 	Gtk::Viewport           _toolbar_viewport;
 
-	/* midi toolbar */
-
-	Gtk::HBox                panic_box;
-
 	void setup_midi_toolbar ();
 
 	/* selection process */
@@ -1867,10 +1850,6 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
 	ArdourCanvas::Rectangle*  cd_marker_bar_drag_rect;
 	ArdourCanvas::Rectangle*  range_bar_drag_rect;
 	ArdourCanvas::Rectangle*  transport_bar_drag_rect;
-
-#ifdef GTKOSX
-	ArdourCanvas::Rectangle     *bogus_background_rect;
-#endif
 	ArdourCanvas::Rectangle     *transport_bar_range_rect;
 	ArdourCanvas::Rectangle     *transport_bar_preroll_rect;
 	ArdourCanvas::Rectangle     *transport_bar_postroll_rect;
@@ -2004,6 +1983,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
 	void update_title_s (const std::string & snapshot_name);
 
 	void instant_save ();
+	bool no_save_instant;
 
 	boost::shared_ptr<ARDOUR::AudioRegion> last_audition_region;
 
@@ -2050,9 +2030,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
 	void cms_new (boost::shared_ptr<ARDOUR::Route>);
 	void current_mixer_strip_hidden ();
 
-	void detach_tearoff (Gtk::Box* b, Gtk::Window* w);
-	void reattach_tearoff (Gtk::Box* b, Gtk::Window* w, int32_t n);
-#ifdef GTKOSX
+#ifdef __APPLE__
 	void ensure_all_elements_drawn ();
 #endif
 	/* nudging tracks */
@@ -2114,9 +2092,6 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
 	void toggle_gain_envelope_active ();
 	void reset_region_gain_envelopes ();
 
-	bool on_key_press_event (GdkEventKey*);
-	bool on_key_release_event (GdkEventKey*);
-
 	void session_state_saved (std::string);
 
 	Glib::RefPtr<Gtk::Action>              undo_action;
@@ -2128,8 +2103,6 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
 
 	void history_changed ();
 
-	Gtk::HBox      status_bar_hpacker;
-
 	Editing::EditPoint _edit_point;
 
 	ArdourDropdown edit_point_selector;
@@ -2152,7 +2125,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
 	void get_regions_after (RegionSelection&, framepos_t where, const TrackViewList& ts) const;
 
 	RegionSelection get_regions_from_selection_and_edit_point ();
-	RegionSelection get_regions_from_selection_and_entered ();
+	RegionSelection get_regions_from_selection_and_entered () const;
 
 	void start_updating_meters ();
 	void stop_updating_meters ();
@@ -2270,12 +2243,21 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
 	QuantizeDialog* quantize_dialog;
 	MainMenuDisabler* _main_menu_disabler;
 
+	/* private helper functions to help with registering axis */
+
+	Glib::RefPtr<Gtk::Action> reg_sens (Glib::RefPtr<Gtk::ActionGroup> group, char const * name, char const * label, sigc::slot<void> slot);
+	void toggle_reg_sens (Glib::RefPtr<Gtk::ActionGroup> group, char const * name, char const * label, sigc::slot<void> slot);
+	void radio_reg_sens (Glib::RefPtr<Gtk::ActionGroup> action_group, Gtk::RadioAction::Group& radio_group, char const * name, char const * label, sigc::slot<void> slot);
+
+	Gtkmm2ext::ActionMap myactions;
+
 	friend class Drag;
 	friend class RegionDrag;
 	friend class RegionMoveDrag;
 	friend class RegionSpliceDrag;
 	friend class RegionRippleDrag;
 	friend class TrimDrag;
+	friend class BBTRulerDrag;
 	friend class MeterMarkerDrag;
 	friend class TempoMarkerDrag;
 	friend class CursorDrag;
diff --git a/gtk2_ardour/editor_actions.cc b/gtk2_ardour/editor_actions.cc
index 1010dad..79900b3 100644
--- a/gtk2_ardour/editor_actions.cc
+++ b/gtk2_ardour/editor_actions.cc
@@ -22,7 +22,7 @@
 
 #include "pbd/file_utils.h"
 
-#include "gtkmm2ext/tearoff.h"
+#include "gtkmm2ext/bindings.h"
 #include "gtkmm2ext/utils.h"
 
 #include "ardour/filesystem_paths.h"
@@ -41,7 +41,7 @@
 #include "time_axis_view.h"
 #include "ui_config.h"
 #include "utils.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
 #include "audio_time_axis.h"
 #include "editor_group_tabs.h"
 #include "editor_routes.h"
@@ -55,27 +55,29 @@ using namespace ARDOUR_UI_UTILS;
 using namespace PBD;
 using namespace Editing;
 
+using Gtkmm2ext::Bindings;
+
 /* Convenience functions to slightly reduce verbosity below */
 
-static RefPtr<Action>
-reg_sens (RefPtr<ActionGroup> group, char const * name, char const * label, sigc::slot<void> slot)
+RefPtr<Action>
+Editor::reg_sens (RefPtr<ActionGroup> group, char const * name, char const * label, sigc::slot<void> slot)
 {
-	RefPtr<Action> act = ActionManager::register_action (group, name, label, slot);
+	RefPtr<Action> act = myactions.register_action (group, name, label, slot);
 	ActionManager::session_sensitive_actions.push_back (act);
 	return act;
 }
 
-static void
-toggle_reg_sens (RefPtr<ActionGroup> group, char const * name, char const * label, sigc::slot<void> slot)
+void
+Editor::toggle_reg_sens (RefPtr<ActionGroup> group, char const * name, char const * label, sigc::slot<void> slot)
 {
-	RefPtr<Action> act = ActionManager::register_toggle_action (group, name, label, slot);
+	RefPtr<Action> act = myactions.register_toggle_action (group, name, label, slot);
 	ActionManager::session_sensitive_actions.push_back (act);
 }
 
-static void
-radio_reg_sens (RefPtr<ActionGroup> action_group, RadioAction::Group& radio_group, char const * name, char const * label, sigc::slot<void> slot)
+void
+Editor::radio_reg_sens (RefPtr<ActionGroup> action_group, RadioAction::Group& radio_group, char const * name, char const * label, sigc::slot<void> slot)
 {
-	RefPtr<Action> act = ActionManager::register_radio_action (action_group, radio_group, name, label, slot);
+	RefPtr<Action> act = myactions.register_radio_action (action_group, radio_group, name, label, slot);
 	ActionManager::session_sensitive_actions.push_back (act);
 }
 
@@ -84,78 +86,77 @@ Editor::register_actions ()
 {
 	RefPtr<Action> act;
 
-	editor_actions = ActionGroup::create (X_("Editor"));
-	editor_menu_actions = ActionGroup::create (X_("EditorMenu"));
+	editor_actions = myactions.create_action_group (X_("Editor"));
+	editor_menu_actions = myactions.create_action_group (X_("EditorMenu"));
 
 	/* non-operative menu items for menu bar */
 
-	ActionManager::register_action (editor_menu_actions, X_("AlignMenu"), _("Align"));
-	ActionManager::register_action (editor_menu_actions, X_("Autoconnect"), _("Autoconnect"));
-	ActionManager::register_action (editor_menu_actions, X_("Crossfades"), _("Crossfades"));
-	ActionManager::register_action (editor_menu_actions, X_("Edit"), _("Edit"));
-	ActionManager::register_action (editor_menu_actions, X_("EditCursorMovementOptions"), _("Move Selected Marker"));
-	ActionManager::register_action (editor_menu_actions, X_("EditSelectRangeOptions"), _("Select Range Operations"));
-	ActionManager::register_action (editor_menu_actions, X_("EditSelectRegionOptions"), _("Select Regions"));
-	ActionManager::register_action (editor_menu_actions, X_("EditPointMenu"), _("Edit Point"));
-	ActionManager::register_action (editor_menu_actions, X_("FadeMenu"), _("Fade"));
-	ActionManager::register_action (editor_menu_actions, X_("LatchMenu"), _("Latch"));
-	ActionManager::register_action (editor_menu_actions, X_("RegionMenu"), _("Region"));
-	ActionManager::register_action (editor_menu_actions, X_("RegionMenuLayering"), _("Layering"));
-	ActionManager::register_action (editor_menu_actions, X_("RegionMenuPosition"), _("Position"));
-	ActionManager::register_action (editor_menu_actions, X_("RegionMenuEdit"), _("Edit"));
-	ActionManager::register_action (editor_menu_actions, X_("RegionMenuTrim"), _("Trim"));
-	ActionManager::register_action (editor_menu_actions, X_("RegionMenuGain"), _("Gain"));
-	ActionManager::register_action (editor_menu_actions, X_("RegionMenuRanges"), _("Ranges"));
-	ActionManager::register_action (editor_menu_actions, X_("RegionMenuFades"), _("Fades"));
-	ActionManager::register_action (editor_menu_actions, X_("RegionMenuMIDI"), _("MIDI"));
-	ActionManager::register_action (editor_menu_actions, X_("RegionMenuDuplicate"), _("Duplicate"));
-	ActionManager::register_action (editor_menu_actions, X_("Link"), _("Link"));
-	ActionManager::register_action (editor_menu_actions, X_("ZoomFocusMenu"), _("Zoom Focus"));
-	ActionManager::register_action (editor_menu_actions, X_("LocateToMarker"), _("Locate to Markers"));
-	ActionManager::register_action (editor_menu_actions, X_("MarkerMenu"), _("Markers"));
-	ActionManager::register_action (editor_menu_actions, X_("MeterFalloff"), _("Meter falloff"));
-	ActionManager::register_action (editor_menu_actions, X_("MeterHold"), _("Meter hold"));
-	ActionManager::register_action (editor_menu_actions, X_("MIDI"), _("MIDI Options"));
-	ActionManager::register_action (editor_menu_actions, X_("MiscOptions"), _("Misc Options"));
-	ActionManager::register_action (editor_menu_actions, X_("Monitoring"), _("Monitoring"));
-	ActionManager::register_action (editor_menu_actions, X_("MoveActiveMarkMenu"), _("Active Mark"));
-	ActionManager::register_action (editor_menu_actions, X_("MovePlayHeadMenu"), _("Playhead"));
-	ActionManager::register_action (editor_menu_actions, X_("PlayMenu"), _("Play"));
-	ActionManager::register_action (editor_menu_actions, X_("PrimaryClockMenu"), _("Primary Clock"));
-	ActionManager::register_action (editor_menu_actions, X_("Pullup"), _("Pullup / Pulldown"));
-	ActionManager::register_action (editor_menu_actions, X_("RegionEditOps"), _("Region operations"));
-	ActionManager::register_action (editor_menu_actions, X_("RegionGainMenu"), _("Gain"));
-	ActionManager::register_action (editor_menu_actions, X_("RulerMenu"), _("Rulers"));
-	ActionManager::register_action (editor_menu_actions, X_("SavedViewMenu"), _("Views"));
-	ActionManager::register_action (editor_menu_actions, X_("ScrollMenu"), _("Scroll"));
-	ActionManager::register_action (editor_menu_actions, X_("SecondaryClockMenu"), _("Secondary Clock"));
-	ActionManager::register_action (editor_menu_actions, X_("Select"), _("Select"));
-	ActionManager::register_action (editor_menu_actions, X_("SelectMenu"), _("Select"));
-	ActionManager::register_action (editor_menu_actions, X_("SeparateMenu"), _("Separate"));
-	ActionManager::register_action (editor_menu_actions, X_("SetLoopMenu"), _("Loop"));
-	ActionManager::register_action (editor_menu_actions, X_("SetPunchMenu"), _("Punch"));
-	ActionManager::register_action (editor_menu_actions, X_("Solo"), _("Solo"));
-	ActionManager::register_action (editor_menu_actions, X_("Subframes"), _("Subframes"));
-	ActionManager::register_action (editor_menu_actions, X_("SyncMenu"), _("Sync"));
-	ActionManager::register_action (editor_menu_actions, X_("TempoMenu"), _("Tempo"));
-	ActionManager::register_action (editor_menu_actions, X_("Timecode"), _("Timecode fps"));
-	ActionManager::register_action (editor_menu_actions, X_("TrackHeightMenu"), _("Height"));
-	ActionManager::register_action (editor_menu_actions, X_("TrackMenu"), _("Track"));
-	ActionManager::register_action (editor_menu_actions, X_("Tools"), _("Tools"));
-	ActionManager::register_action (editor_menu_actions, X_("View"), _("View"));
-	ActionManager::register_action (editor_menu_actions, X_("ZoomFocus"), _("Zoom Focus"));
-	ActionManager::register_action (editor_menu_actions, X_("ZoomMenu"), _("Zoom"));
+	myactions.register_action (editor_menu_actions, X_("AlignMenu"), _("Align"));
+	myactions.register_action (editor_menu_actions, X_("Autoconnect"), _("Autoconnect"));
+	myactions.register_action (editor_menu_actions, X_("Crossfades"), _("Crossfades"));
+	myactions.register_action (editor_menu_actions, X_("Edit"), _("Edit"));
+	myactions.register_action (editor_menu_actions, X_("EditCursorMovementOptions"), _("Move Selected Marker"));
+	myactions.register_action (editor_menu_actions, X_("EditSelectRangeOptions"), _("Select Range Operations"));
+	myactions.register_action (editor_menu_actions, X_("EditSelectRegionOptions"), _("Select Regions"));
+	myactions.register_action (editor_menu_actions, X_("EditPointMenu"), _("Edit Point"));
+	myactions.register_action (editor_menu_actions, X_("FadeMenu"), _("Fade"));
+	myactions.register_action (editor_menu_actions, X_("LatchMenu"), _("Latch"));
+	myactions.register_action (editor_menu_actions, X_("RegionMenu"), _("Region"));
+	myactions.register_action (editor_menu_actions, X_("RegionMenuLayering"), _("Layering"));
+	myactions.register_action (editor_menu_actions, X_("RegionMenuPosition"), _("Position"));
+	myactions.register_action (editor_menu_actions, X_("RegionMenuEdit"), _("Edit"));
+	myactions.register_action (editor_menu_actions, X_("RegionMenuTrim"), _("Trim"));
+	myactions.register_action (editor_menu_actions, X_("RegionMenuGain"), _("Gain"));
+	myactions.register_action (editor_menu_actions, X_("RegionMenuRanges"), _("Ranges"));
+	myactions.register_action (editor_menu_actions, X_("RegionMenuFades"), _("Fades"));
+	myactions.register_action (editor_menu_actions, X_("RegionMenuMIDI"), _("MIDI"));
+	myactions.register_action (editor_menu_actions, X_("RegionMenuDuplicate"), _("Duplicate"));
+	myactions.register_action (editor_menu_actions, X_("Link"), _("Link"));
+	myactions.register_action (editor_menu_actions, X_("ZoomFocusMenu"), _("Zoom Focus"));
+	myactions.register_action (editor_menu_actions, X_("LocateToMarker"), _("Locate to Markers"));
+	myactions.register_action (editor_menu_actions, X_("MarkerMenu"), _("Markers"));
+	myactions.register_action (editor_menu_actions, X_("MeterFalloff"), _("Meter falloff"));
+	myactions.register_action (editor_menu_actions, X_("MeterHold"), _("Meter hold"));
+	myactions.register_action (editor_menu_actions, X_("MIDI"), _("MIDI Options"));
+	myactions.register_action (editor_menu_actions, X_("MiscOptions"), _("Misc Options"));
+	myactions.register_action (editor_menu_actions, X_("Monitoring"), _("Monitoring"));
+	myactions.register_action (editor_menu_actions, X_("MoveActiveMarkMenu"), _("Active Mark"));
+	myactions.register_action (editor_menu_actions, X_("MovePlayHeadMenu"), _("Playhead"));
+	myactions.register_action (editor_menu_actions, X_("PlayMenu"), _("Play"));
+	myactions.register_action (editor_menu_actions, X_("PrimaryClockMenu"), _("Primary Clock"));
+	myactions.register_action (editor_menu_actions, X_("Pullup"), _("Pullup / Pulldown"));
+	myactions.register_action (editor_menu_actions, X_("RegionEditOps"), _("Region operations"));
+	myactions.register_action (editor_menu_actions, X_("RegionGainMenu"), _("Gain"));
+	myactions.register_action (editor_menu_actions, X_("RulerMenu"), _("Rulers"));
+	myactions.register_action (editor_menu_actions, X_("SavedViewMenu"), _("Views"));
+	myactions.register_action (editor_menu_actions, X_("ScrollMenu"), _("Scroll"));
+	myactions.register_action (editor_menu_actions, X_("SecondaryClockMenu"), _("Secondary Clock"));
+	myactions.register_action (editor_menu_actions, X_("Select"), _("Select"));
+	myactions.register_action (editor_menu_actions, X_("SelectMenu"), _("Select"));
+	myactions.register_action (editor_menu_actions, X_("SeparateMenu"), _("Separate"));
+	myactions.register_action (editor_menu_actions, X_("SetLoopMenu"), _("Loop"));
+	myactions.register_action (editor_menu_actions, X_("SetPunchMenu"), _("Punch"));
+	myactions.register_action (editor_menu_actions, X_("Solo"), _("Solo"));
+	myactions.register_action (editor_menu_actions, X_("Subframes"), _("Subframes"));
+	myactions.register_action (editor_menu_actions, X_("SyncMenu"), _("Sync"));
+	myactions.register_action (editor_menu_actions, X_("TempoMenu"), _("Tempo"));
+	myactions.register_action (editor_menu_actions, X_("Timecode"), _("Timecode fps"));
+	myactions.register_action (editor_menu_actions, X_("TrackHeightMenu"), _("Height"));
+	myactions.register_action (editor_menu_actions, X_("TrackMenu"), _("Track"));
+	myactions.register_action (editor_menu_actions, X_("Tools"), _("Tools"));
+	myactions.register_action (editor_menu_actions, X_("View"), _("View"));
+	myactions.register_action (editor_menu_actions, X_("ZoomFocus"), _("Zoom Focus"));
+	myactions.register_action (editor_menu_actions, X_("ZoomMenu"), _("Zoom"));
+	myactions.register_action (editor_menu_actions, X_("ActionScripts"), _("Scripted Actions"));
 
 	register_region_actions ();
 
 	/* add named actions for the editor */
 
-	ActionManager::register_action (editor_actions, "escape", _("Break drag or deselect all"), sigc::mem_fun (*this, &Editor::escape));
-
 	/* We don't bother registering "unlock" because it would be insensitive
 	   when required. Editor::unlock() must be invoked directly.
 	*/
-	ActionManager::register_action (editor_actions, "lock", S_("Session|Lock"), sigc::mem_fun (*this, &Editor::lock));
+	myactions.register_action (editor_actions, "lock", S_("Session|Lock"), sigc::mem_fun (*this, &Editor::lock));
 
 	toggle_reg_sens (editor_actions, "show-editor-mixer", _("Show Editor Mixer"), sigc::mem_fun (*this, &Editor::editor_mixer_button_toggled));
 	toggle_reg_sens (editor_actions, "show-editor-list", _("Show Editor List"), sigc::mem_fun (*this, &Editor::editor_list_button_toggled));
@@ -244,6 +245,7 @@ Editor::register_actions ()
 		reg_sens (editor_actions, a.c_str(), n.c_str(), sigc::bind (sigc::mem_fun (*this, &Editor::goto_nth_marker), i - 1));
 	}
 
+
 	reg_sens (editor_actions, "jump-forward-to-mark", _("Jump to Next Mark"), sigc::mem_fun(*this, &Editor::jump_forward_to_mark));
 	reg_sens (editor_actions, "alternate-jump-forward-to-mark", _("Jump to Next Mark"), sigc::mem_fun(*this, &Editor::jump_forward_to_mark));
 	reg_sens (editor_actions, "jump-backward-to-mark", _("Jump to Previous Mark"), sigc::mem_fun(*this, &Editor::jump_backward_to_mark));
@@ -363,7 +365,8 @@ Editor::register_actions ()
 
 	reg_sens (editor_actions, "editor-fade-range", _("Fade Range Selection"), sigc::mem_fun(*this, &Editor::fade_range));
 
-	reg_sens (editor_actions, "set-tempo-from-edit-range", _("Set Tempo from Edit Range = Bar"), sigc::mem_fun(*this, &Editor::use_range_as_bar));
+	act = myactions.register_action (editor_actions, "set-tempo-from-edit-range", _("Set Tempo from Edit Range = Bar"), sigc::mem_fun(*this, &Editor::use_range_as_bar));
+	ActionManager::time_selection_sensitive_actions.push_back (act);
 
 	toggle_reg_sens (editor_actions, "toggle-log-window", _("Log"),
 			sigc::mem_fun (ARDOUR_UI::instance(), &ARDOUR_UI::toggle_errors));
@@ -423,11 +426,11 @@ Editor::register_actions ()
 	toggle_reg_sens (editor_actions, "toggle-follow-playhead", _("Follow Playhead"), (sigc::mem_fun(*this, &Editor::toggle_follow_playhead)));
 	act = reg_sens (editor_actions, "remove-last-capture", _("Remove Last Capture"), (sigc::mem_fun(*this, &Editor::remove_last_capture)));
 
-	ActionManager::register_toggle_action (editor_actions, "toggle-stationary-playhead", _("Stationary Playhead"), (mem_fun(*this, &Editor::toggle_stationary_playhead)));
+	myactions.register_toggle_action (editor_actions, "toggle-stationary-playhead", _("Stationary Playhead"), (mem_fun(*this, &Editor::toggle_stationary_playhead)));
 
 	act = reg_sens (editor_actions, "insert-time", _("Insert Time"), (sigc::mem_fun(*this, &Editor::do_insert_time)));
 	ActionManager::track_selection_sensitive_actions.push_back (act);
-	act = ActionManager::register_action (editor_actions, "remove-time", _("Remove Time"), (mem_fun(*this, &Editor::do_remove_time)));
+	act = myactions.register_action (editor_actions, "remove-time", _("Remove Time"), (mem_fun(*this, &Editor::do_remove_time)));
 	ActionManager::session_sensitive_actions.push_back (act);
 	ActionManager::track_selection_sensitive_actions.push_back (act);
 
@@ -459,7 +462,7 @@ Editor::register_actions ()
 
 	toggle_reg_sens (editor_actions, "sound-midi-notes", _("Sound Selected MIDI Notes"), sigc::mem_fun (*this, &Editor::toggle_sound_midi_notes));
 
-	Glib::RefPtr<ActionGroup> zoom_actions = ActionGroup::create (X_("Zoom"));
+	Glib::RefPtr<ActionGroup> zoom_actions = myactions.create_action_group (X_("Zoom"));
 	RadioAction::Group zoom_group;
 
 	radio_reg_sens (zoom_actions, zoom_group, "zoom-focus-left", _("Zoom Focus Left"), sigc::bind (sigc::mem_fun(*this, &Editor::zoom_focus_chosen), Editing::ZoomFocusLeft));
@@ -469,148 +472,155 @@ Editor::register_actions ()
 	radio_reg_sens (zoom_actions, zoom_group, "zoom-focus-mouse", _("Zoom Focus Mouse"), sigc::bind (sigc::mem_fun(*this, &Editor::zoom_focus_chosen), Editing::ZoomFocusMouse));
 	radio_reg_sens (zoom_actions, zoom_group, "zoom-focus-edit", _("Zoom Focus Edit Point"), sigc::bind (sigc::mem_fun(*this, &Editor::zoom_focus_chosen), Editing::ZoomFocusEdit));
 
-	ActionManager::register_action (editor_actions, X_("cycle-zoom-focus"), _("Next Zoom Focus"), sigc::mem_fun (*this, &Editor::cycle_zoom_focus));
+	myactions.register_action (editor_actions, X_("cycle-zoom-focus"), _("Next Zoom Focus"), sigc::mem_fun (*this, &Editor::cycle_zoom_focus));
 
+	for (int i = 1; i <= 9; ++i) {
+		string const a = string_compose (X_("script-action-%1"), i);
+		string const n = string_compose (_("Unset #%1"), i);
+		act = myactions.register_action (editor_actions, a.c_str(), n.c_str(), sigc::bind (sigc::mem_fun (*this, &Editor::trigger_script), i - 1));
+		act->set_tooltip (_("no action bound"));
+		act->set_sensitive (false);
+	}
 
-	Glib::RefPtr<ActionGroup> mouse_mode_actions = ActionGroup::create (X_("MouseMode"));
+	Glib::RefPtr<ActionGroup> mouse_mode_actions = myactions.create_action_group (X_("MouseMode"));
 	RadioAction::Group mouse_mode_group;
 
-	act = ActionManager::register_toggle_action (mouse_mode_actions, "set-mouse-mode-object-range", _("Smart Object Mode"), sigc::mem_fun (*this, &Editor::mouse_mode_object_range_toggled));
+	act = myactions.register_toggle_action (mouse_mode_actions, "set-mouse-mode-object-range", _("Smart Object Mode"), sigc::mem_fun (*this, &Editor::mouse_mode_object_range_toggled));
 	smart_mode_action = Glib::RefPtr<ToggleAction>::cast_static (act);
 	smart_mode_button.set_related_action (smart_mode_action);
 	smart_mode_button.set_text (_("Smart"));
 	smart_mode_button.set_name ("mouse mode button");
 
-	act = ActionManager::register_radio_action (mouse_mode_actions, mouse_mode_group, "set-mouse-mode-object", _("Object Tool"), sigc::bind (sigc::mem_fun(*this, &Editor::mouse_mode_toggled), Editing::MouseObject));
+	act = myactions.register_radio_action (mouse_mode_actions, mouse_mode_group, "set-mouse-mode-object", _("Object Tool"), sigc::bind (sigc::mem_fun(*this, &Editor::mouse_mode_toggled), Editing::MouseObject));
 	mouse_move_button.set_related_action (act);
 	mouse_move_button.set_icon (Gtkmm2ext::ArdourIcon::ToolGrab);
 	mouse_move_button.set_name ("mouse mode button");
 
-	act = ActionManager::register_radio_action (mouse_mode_actions, mouse_mode_group, "set-mouse-mode-range", _("Range Tool"), sigc::bind (sigc::mem_fun(*this, &Editor::mouse_mode_toggled), Editing::MouseRange));
+	act = myactions.register_radio_action (mouse_mode_actions, mouse_mode_group, "set-mouse-mode-range", _("Range Tool"), sigc::bind (sigc::mem_fun(*this, &Editor::mouse_mode_toggled), Editing::MouseRange));
 	mouse_select_button.set_related_action (act);
 	mouse_select_button.set_icon (Gtkmm2ext::ArdourIcon::ToolRange);
 	mouse_select_button.set_name ("mouse mode button");
 
-	act = ActionManager::register_radio_action (mouse_mode_actions, mouse_mode_group, "set-mouse-mode-draw", _("Note Drawing Tool"), sigc::bind (sigc::mem_fun(*this, &Editor::mouse_mode_toggled), Editing::MouseDraw));
+	act = myactions.register_radio_action (mouse_mode_actions, mouse_mode_group, "set-mouse-mode-draw", _("Note Drawing Tool"), sigc::bind (sigc::mem_fun(*this, &Editor::mouse_mode_toggled), Editing::MouseDraw));
 	mouse_draw_button.set_related_action (act);
 	mouse_draw_button.set_icon (Gtkmm2ext::ArdourIcon::ToolDraw);
 	mouse_draw_button.set_name ("mouse mode button");
 
-	act = ActionManager::register_radio_action (mouse_mode_actions, mouse_mode_group, "set-mouse-mode-audition", _("Audition Tool"), sigc::bind (sigc::mem_fun(*this, &Editor::mouse_mode_toggled), Editing::MouseAudition));
+	act = myactions.register_radio_action (mouse_mode_actions, mouse_mode_group, "set-mouse-mode-audition", _("Audition Tool"), sigc::bind (sigc::mem_fun(*this, &Editor::mouse_mode_toggled), Editing::MouseAudition));
 	mouse_audition_button.set_related_action (act);
 	mouse_audition_button.set_icon (Gtkmm2ext::ArdourIcon::ToolAudition);
 	mouse_audition_button.set_name ("mouse mode button");
 
-	act = ActionManager::register_radio_action (mouse_mode_actions, mouse_mode_group, "set-mouse-mode-timefx", _("Time FX Tool"), sigc::bind (sigc::mem_fun(*this, &Editor::mouse_mode_toggled), Editing::MouseTimeFX));
+	act = myactions.register_radio_action (mouse_mode_actions, mouse_mode_group, "set-mouse-mode-timefx", _("Time FX Tool"), sigc::bind (sigc::mem_fun(*this, &Editor::mouse_mode_toggled), Editing::MouseTimeFX));
 	mouse_timefx_button.set_related_action (act);
 	mouse_timefx_button.set_icon (Gtkmm2ext::ArdourIcon::ToolStretch);
 	mouse_timefx_button.set_name ("mouse mode button");
 
-	act = ActionManager::register_radio_action (mouse_mode_actions, mouse_mode_group, "set-mouse-mode-content", _("Content Tool"), sigc::bind (sigc::mem_fun(*this, &Editor::mouse_mode_toggled), Editing::MouseContent));
+	act = myactions.register_radio_action (mouse_mode_actions, mouse_mode_group, "set-mouse-mode-content", _("Content Tool"), sigc::bind (sigc::mem_fun(*this, &Editor::mouse_mode_toggled), Editing::MouseContent));
 	mouse_content_button.set_related_action (act);
 	mouse_content_button.set_icon (Gtkmm2ext::ArdourIcon::ToolContent);
 	mouse_content_button.set_name ("mouse mode button");
 
 	if(!Profile->get_mixbus()) {
-		act = ActionManager::register_radio_action (mouse_mode_actions, mouse_mode_group, "set-mouse-mode-cut", _("Cut Tool"), sigc::bind (sigc::mem_fun(*this, &Editor::mouse_mode_toggled), Editing::MouseCut));
+		act = myactions.register_radio_action (mouse_mode_actions, mouse_mode_group, "set-mouse-mode-cut", _("Cut Tool"), sigc::bind (sigc::mem_fun(*this, &Editor::mouse_mode_toggled), Editing::MouseCut));
 		mouse_cut_button.set_related_action (act);
 		mouse_cut_button.set_icon (Gtkmm2ext::ArdourIcon::ToolCut);
 		mouse_cut_button.set_name ("mouse mode button");
 	}
 
-	ActionManager::register_action (editor_actions, "step-mouse-mode", _("Step Mouse Mode"), sigc::bind (sigc::mem_fun(*this, &Editor::step_mouse_mode), true));
+	myactions.register_action (editor_actions, "step-mouse-mode", _("Step Mouse Mode"), sigc::bind (sigc::mem_fun(*this, &Editor::step_mouse_mode), true));
 
 	RadioAction::Group edit_point_group;
-	ActionManager::register_radio_action (editor_actions, edit_point_group, X_("edit-at-playhead"), _("Playhead"), (sigc::bind (sigc::mem_fun(*this, &Editor::edit_point_chosen), Editing::EditAtPlayhead)));
-	ActionManager::register_radio_action (editor_actions, edit_point_group, X_("edit-at-mouse"), _("Mouse"), (sigc::bind (sigc::mem_fun(*this, &Editor::edit_point_chosen), Editing::EditAtMouse)));
-	ActionManager::register_radio_action (editor_actions, edit_point_group, X_("edit-at-selected-marker"), _("Marker"), (sigc::bind (sigc::mem_fun(*this, &Editor::edit_point_chosen), Editing::EditAtSelectedMarker)));
+	myactions.register_radio_action (editor_actions, edit_point_group, X_("edit-at-playhead"), _("Playhead"), (sigc::bind (sigc::mem_fun(*this, &Editor::edit_point_chosen), Editing::EditAtPlayhead)));
+	myactions.register_radio_action (editor_actions, edit_point_group, X_("edit-at-mouse"), _("Mouse"), (sigc::bind (sigc::mem_fun(*this, &Editor::edit_point_chosen), Editing::EditAtMouse)));
+	myactions.register_radio_action (editor_actions, edit_point_group, X_("edit-at-selected-marker"), _("Marker"), (sigc::bind (sigc::mem_fun(*this, &Editor::edit_point_chosen), Editing::EditAtSelectedMarker)));
 
-	ActionManager::register_action (editor_actions, "cycle-edit-point", _("Change Edit Point"), sigc::bind (sigc::mem_fun (*this, &Editor::cycle_edit_point), false));
-	ActionManager::register_action (editor_actions, "cycle-edit-point-with-marker", _("Change Edit Point Including Marker"), sigc::bind (sigc::mem_fun (*this, &Editor::cycle_edit_point), true));
+	myactions.register_action (editor_actions, "cycle-edit-point", _("Change Edit Point"), sigc::bind (sigc::mem_fun (*this, &Editor::cycle_edit_point), false));
+	myactions.register_action (editor_actions, "cycle-edit-point-with-marker", _("Change Edit Point Including Marker"), sigc::bind (sigc::mem_fun (*this, &Editor::cycle_edit_point), true));
 
-//	ActionManager::register_action (editor_actions, "set-edit-splice", _("Splice"), sigc::bind (sigc::mem_fun (*this, &Editor::set_edit_mode), Splice));
-	ActionManager::register_action (editor_actions, "set-edit-ripple", _("Ripple"), bind (mem_fun (*this, &Editor::set_edit_mode), Ripple));
-	ActionManager::register_action (editor_actions, "set-edit-slide", _("Slide"), sigc::bind (sigc::mem_fun (*this, &Editor::set_edit_mode), Slide));
-	ActionManager::register_action (editor_actions, "set-edit-lock", S_("EditMode|Lock"), sigc::bind (sigc::mem_fun (*this, &Editor::set_edit_mode), Lock));
-	ActionManager::register_action (editor_actions, "cycle-edit-mode", _("Cycle Edit Mode"), sigc::mem_fun (*this, &Editor::cycle_edit_mode));
+//	myactions.register_action (editor_actions, "set-edit-splice", _("Splice"), sigc::bind (sigc::mem_fun (*this, &Editor::set_edit_mode), Splice));
+	myactions.register_action (editor_actions, "set-edit-ripple", _("Ripple"), bind (mem_fun (*this, &Editor::set_edit_mode), Ripple));
+	myactions.register_action (editor_actions, "set-edit-slide", _("Slide"), sigc::bind (sigc::mem_fun (*this, &Editor::set_edit_mode), Slide));
+	myactions.register_action (editor_actions, "set-edit-lock", S_("EditMode|Lock"), sigc::bind (sigc::mem_fun (*this, &Editor::set_edit_mode), Lock));
+	myactions.register_action (editor_actions, "cycle-edit-mode", _("Cycle Edit Mode"), sigc::mem_fun (*this, &Editor::cycle_edit_mode));
 
-	ActionManager::register_action (editor_actions, X_("SnapTo"), _("Snap to"));
-	ActionManager::register_action (editor_actions, X_("SnapMode"), _("Snap Mode"));
+	myactions.register_action (editor_actions, X_("SnapTo"), _("Snap to"));
+	myactions.register_action (editor_actions, X_("SnapMode"), _("Snap Mode"));
 
 	RadioAction::Group snap_mode_group;
-	ActionManager::register_radio_action (editor_actions, snap_mode_group, X_("snap-off"), _("No Grid"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_mode_chosen), Editing::SnapOff)));
-	ActionManager::register_radio_action (editor_actions, snap_mode_group, X_("snap-normal"), _("Grid"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_mode_chosen), Editing::SnapNormal)));
-	ActionManager::register_radio_action (editor_actions, snap_mode_group, X_("snap-magnetic"), _("Magnetic"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_mode_chosen), Editing::SnapMagnetic)));
+	myactions.register_radio_action (editor_actions, snap_mode_group, X_("snap-off"), _("No Grid"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_mode_chosen), Editing::SnapOff)));
+	myactions.register_radio_action (editor_actions, snap_mode_group, X_("snap-normal"), _("Grid"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_mode_chosen), Editing::SnapNormal)));
+	myactions.register_radio_action (editor_actions, snap_mode_group, X_("snap-magnetic"), _("Magnetic"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_mode_chosen), Editing::SnapMagnetic)));
 
-	ActionManager::register_action (editor_actions, X_("cycle-snap-mode"), _("Next Snap Mode"), sigc::mem_fun (*this, &Editor::cycle_snap_mode));
-	ActionManager::register_action (editor_actions, X_("next-snap-choice"), _("Next Snap Choice"), sigc::mem_fun (*this, &Editor::next_snap_choice));
-	ActionManager::register_action (editor_actions, X_("next-snap-choice-music-only"), _("Next Musical Snap Choice"), sigc::mem_fun (*this, &Editor::next_snap_choice_music_only));
-	ActionManager::register_action (editor_actions, X_("prev-snap-choice"), _("Previous Snap Choice"), sigc::mem_fun (*this, &Editor::prev_snap_choice));
-	ActionManager::register_action (editor_actions, X_("prev-snap-choice-music-only"), _("Previous Musical Snap Choice"), sigc::mem_fun (*this, &Editor::prev_snap_choice_music_only));
+	myactions.register_action (editor_actions, X_("cycle-snap-mode"), _("Next Snap Mode"), sigc::mem_fun (*this, &Editor::cycle_snap_mode));
+	myactions.register_action (editor_actions, X_("next-snap-choice"), _("Next Snap Choice"), sigc::mem_fun (*this, &Editor::next_snap_choice));
+	myactions.register_action (editor_actions, X_("next-snap-choice-music-only"), _("Next Musical Snap Choice"), sigc::mem_fun (*this, &Editor::next_snap_choice_music_only));
+	myactions.register_action (editor_actions, X_("prev-snap-choice"), _("Previous Snap Choice"), sigc::mem_fun (*this, &Editor::prev_snap_choice));
+	myactions.register_action (editor_actions, X_("prev-snap-choice-music-only"), _("Previous Musical Snap Choice"), sigc::mem_fun (*this, &Editor::prev_snap_choice_music_only));
 
-	Glib::RefPtr<ActionGroup> snap_actions = ActionGroup::create (X_("Snap"));
+	Glib::RefPtr<ActionGroup> snap_actions = myactions.create_action_group (X_("Snap"));
 	RadioAction::Group snap_choice_group;
 
-	ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-cd-frame"), _("Snap to CD Frame"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToCDFrame)));
-	ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-timecode-frame"), _("Snap to Timecode Frame"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToTimecodeFrame)));
-	ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-timecode-seconds"), _("Snap to Timecode Seconds"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToTimecodeSeconds)));
-	ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-timecode-minutes"), _("Snap to Timecode Minutes"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToTimecodeMinutes)));
-	ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-seconds"), _("Snap to Seconds"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToSeconds)));
-	ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-minutes"), _("Snap to Minutes"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToMinutes)));
-
-	ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-onetwentyeighths"), _("Snap to One Twenty Eighths"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToBeatDiv128)));
-	ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-sixtyfourths"), _("Snap to Sixty Fourths"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToBeatDiv64)));
-	ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-thirtyseconds"), _("Snap to Thirty Seconds"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToBeatDiv32)));
-	ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-twentyeighths"), _("Snap to Twenty Eighths"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToBeatDiv28)));
-	ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-twentyfourths"), _("Snap to Twenty Fourths"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToBeatDiv24)));
-	ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-twentieths"), _("Snap to Twentieths"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToBeatDiv20)));
-	ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-asixteenthbeat"), _("Snap to Sixteenths"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToBeatDiv16)));
-	ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-fourteenths"), _("Snap to Fourteenths"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToBeatDiv14)));
-	ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-twelfths"), _("Snap to Twelfths"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToBeatDiv12)));
-	ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-tenths"), _("Snap to Tenths"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToBeatDiv10)));
-	ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-eighths"), _("Snap to Eighths"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToBeatDiv8)));
-	ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-sevenths"), _("Snap to Sevenths"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToBeatDiv7)));
-	ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-sixths"), _("Snap to Sixths"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToBeatDiv6)));
-	ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-fifths"), _("Snap to Fifths"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToBeatDiv5)));
-	ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-quarters"), _("Snap to Quarters"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToBeatDiv4)));
-	ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-thirds"), _("Snap to Thirds"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToBeatDiv3)));
-	ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-halves"), _("Snap to Halves"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToBeatDiv2)));
-
-	ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-beat"), _("Snap to Beat"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToBeat)));
-	ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-bar"), _("Snap to Bar"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToBar)));
-	ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-mark"), _("Snap to Mark"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToMark)));
-	ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-region-start"), _("Snap to Region Start"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToRegionStart)));
-	ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-region-end"), _("Snap to Region End"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToRegionEnd)));
-	ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-region-sync"), _("Snap to Region Sync"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToRegionSync)));
-	ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-region-boundary"), _("Snap to Region Boundary"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToRegionBoundary)));
-
-	ActionManager::register_toggle_action (editor_actions, X_("show-marker-lines"), _("Show Marker Lines"), sigc::mem_fun (*this, &Editor::toggle_marker_lines));
+	myactions.register_radio_action (snap_actions, snap_choice_group, X_("snap-to-cd-frame"), _("Snap to CD Frame"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToCDFrame)));
+	myactions.register_radio_action (snap_actions, snap_choice_group, X_("snap-to-timecode-frame"), _("Snap to Timecode Frame"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToTimecodeFrame)));
+	myactions.register_radio_action (snap_actions, snap_choice_group, X_("snap-to-timecode-seconds"), _("Snap to Timecode Seconds"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToTimecodeSeconds)));
+	myactions.register_radio_action (snap_actions, snap_choice_group, X_("snap-to-timecode-minutes"), _("Snap to Timecode Minutes"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToTimecodeMinutes)));
+	myactions.register_radio_action (snap_actions, snap_choice_group, X_("snap-to-seconds"), _("Snap to Seconds"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToSeconds)));
+	myactions.register_radio_action (snap_actions, snap_choice_group, X_("snap-to-minutes"), _("Snap to Minutes"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToMinutes)));
+
+	myactions.register_radio_action (snap_actions, snap_choice_group, X_("snap-to-onetwentyeighths"), _("Snap to One Twenty Eighths"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToBeatDiv128)));
+	myactions.register_radio_action (snap_actions, snap_choice_group, X_("snap-to-sixtyfourths"), _("Snap to Sixty Fourths"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToBeatDiv64)));
+	myactions.register_radio_action (snap_actions, snap_choice_group, X_("snap-to-thirtyseconds"), _("Snap to Thirty Seconds"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToBeatDiv32)));
+	myactions.register_radio_action (snap_actions, snap_choice_group, X_("snap-to-twentyeighths"), _("Snap to Twenty Eighths"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToBeatDiv28)));
+	myactions.register_radio_action (snap_actions, snap_choice_group, X_("snap-to-twentyfourths"), _("Snap to Twenty Fourths"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToBeatDiv24)));
+	myactions.register_radio_action (snap_actions, snap_choice_group, X_("snap-to-twentieths"), _("Snap to Twentieths"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToBeatDiv20)));
+	myactions.register_radio_action (snap_actions, snap_choice_group, X_("snap-to-asixteenthbeat"), _("Snap to Sixteenths"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToBeatDiv16)));
+	myactions.register_radio_action (snap_actions, snap_choice_group, X_("snap-to-fourteenths"), _("Snap to Fourteenths"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToBeatDiv14)));
+	myactions.register_radio_action (snap_actions, snap_choice_group, X_("snap-to-twelfths"), _("Snap to Twelfths"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToBeatDiv12)));
+	myactions.register_radio_action (snap_actions, snap_choice_group, X_("snap-to-tenths"), _("Snap to Tenths"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToBeatDiv10)));
+	myactions.register_radio_action (snap_actions, snap_choice_group, X_("snap-to-eighths"), _("Snap to Eighths"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToBeatDiv8)));
+	myactions.register_radio_action (snap_actions, snap_choice_group, X_("snap-to-sevenths"), _("Snap to Sevenths"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToBeatDiv7)));
+	myactions.register_radio_action (snap_actions, snap_choice_group, X_("snap-to-sixths"), _("Snap to Sixths"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToBeatDiv6)));
+	myactions.register_radio_action (snap_actions, snap_choice_group, X_("snap-to-fifths"), _("Snap to Fifths"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToBeatDiv5)));
+	myactions.register_radio_action (snap_actions, snap_choice_group, X_("snap-to-quarters"), _("Snap to Quarters"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToBeatDiv4)));
+	myactions.register_radio_action (snap_actions, snap_choice_group, X_("snap-to-thirds"), _("Snap to Thirds"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToBeatDiv3)));
+	myactions.register_radio_action (snap_actions, snap_choice_group, X_("snap-to-halves"), _("Snap to Halves"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToBeatDiv2)));
+
+	myactions.register_radio_action (snap_actions, snap_choice_group, X_("snap-to-beat"), _("Snap to Beat"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToBeat)));
+	myactions.register_radio_action (snap_actions, snap_choice_group, X_("snap-to-bar"), _("Snap to Bar"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToBar)));
+	myactions.register_radio_action (snap_actions, snap_choice_group, X_("snap-to-mark"), _("Snap to Mark"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToMark)));
+	myactions.register_radio_action (snap_actions, snap_choice_group, X_("snap-to-region-start"), _("Snap to Region Start"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToRegionStart)));
+	myactions.register_radio_action (snap_actions, snap_choice_group, X_("snap-to-region-end"), _("Snap to Region End"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToRegionEnd)));
+	myactions.register_radio_action (snap_actions, snap_choice_group, X_("snap-to-region-sync"), _("Snap to Region Sync"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToRegionSync)));
+	myactions.register_radio_action (snap_actions, snap_choice_group, X_("snap-to-region-boundary"), _("Snap to Region Boundary"), (sigc::bind (sigc::mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToRegionBoundary)));
+
+	myactions.register_toggle_action (editor_actions, X_("show-marker-lines"), _("Show Marker Lines"), sigc::mem_fun (*this, &Editor::toggle_marker_lines));
 
 	/* RULERS */
 
-	Glib::RefPtr<ActionGroup> ruler_actions = ActionGroup::create (X_("Rulers"));
-	ruler_tempo_action = Glib::RefPtr<ToggleAction>::cast_static (ActionManager::register_toggle_action (ruler_actions, X_("toggle-tempo-ruler"), _("Tempo"), sigc::bind (sigc::mem_fun(*this, &Editor::toggle_ruler_visibility), ruler_time_tempo)));
-	ruler_meter_action = Glib::RefPtr<ToggleAction>::cast_static (ActionManager::register_toggle_action (ruler_actions, X_("toggle-meter-ruler"), _("Meter"), sigc::bind (sigc::mem_fun(*this, &Editor::toggle_ruler_visibility), ruler_time_meter)));
-	ruler_range_action = Glib::RefPtr<ToggleAction>::cast_static (ActionManager::register_toggle_action (ruler_actions, X_("toggle-range-ruler"), _("Ranges"), sigc::bind (sigc::mem_fun(*this, &Editor::toggle_ruler_visibility), ruler_time_range_marker)));
-	ruler_marker_action = Glib::RefPtr<ToggleAction>::cast_static (ActionManager::register_toggle_action (ruler_actions, X_("toggle-marker-ruler"), _("Markers"), sigc::bind (sigc::mem_fun(*this, &Editor::toggle_ruler_visibility), ruler_time_marker)));
-	ruler_cd_marker_action = Glib::RefPtr<ToggleAction>::cast_static (ActionManager::register_toggle_action (ruler_actions, X_("toggle-cd-marker-ruler"), _("CD Markers"), sigc::bind (sigc::mem_fun(*this, &Editor::toggle_ruler_visibility), ruler_time_cd_marker)));
-	ruler_loop_punch_action = Glib::RefPtr<ToggleAction>::cast_static (ActionManager::register_toggle_action (ruler_actions, X_("toggle-loop-punch-ruler"), _("Loop/Punch"), sigc::bind (sigc::mem_fun(*this, &Editor::toggle_ruler_visibility), ruler_time_transport_marker)));
-	ruler_bbt_action = Glib::RefPtr<ToggleAction>::cast_static (ActionManager::register_toggle_action (ruler_actions, X_("toggle-bbt-ruler"), _("Bars & Beats"), sigc::bind (sigc::mem_fun(*this, &Editor::toggle_ruler_visibility), ruler_metric_bbt)));
-	ruler_samples_action = Glib::RefPtr<ToggleAction>::cast_static (ActionManager::register_toggle_action (ruler_actions, X_("toggle-samples-ruler"), _("Samples"), sigc::bind (sigc::mem_fun(*this, &Editor::toggle_ruler_visibility), ruler_metric_samples)));
-	ruler_timecode_action = Glib::RefPtr<ToggleAction>::cast_static (ActionManager::register_toggle_action (ruler_actions, X_("toggle-timecode-ruler"), _("Timecode"), sigc::bind (sigc::mem_fun(*this, &Editor::toggle_ruler_visibility), ruler_metric_timecode)));
-	ruler_minsec_action = Glib::RefPtr<ToggleAction>::cast_static (ActionManager::register_toggle_action (ruler_actions, X_("toggle-minsec-ruler"), _("Min:Sec"), sigc::bind (sigc::mem_fun(*this, &Editor::toggle_ruler_visibility), ruler_metric_minsec)));
-
-	ActionManager::register_action (editor_menu_actions, X_("VideoMonitorMenu"), _("Video Monitor"));
-
-	ruler_video_action = Glib::RefPtr<ToggleAction>::cast_static (ActionManager::register_toggle_action (ruler_actions, X_("toggle-video-ruler"), _("Video"), sigc::bind (sigc::mem_fun(*this, &Editor::toggle_ruler_visibility), ruler_video_timeline)));
-	xjadeo_proc_action = Glib::RefPtr<ToggleAction>::cast_static (ActionManager::register_toggle_action (editor_actions, X_("ToggleJadeo"), _("Video Monitor"), sigc::mem_fun (*this, &Editor::set_xjadeo_proc)));
-
-	xjadeo_ontop_action = Glib::RefPtr<ToggleAction>::cast_static (ActionManager::register_toggle_action (editor_actions, X_("toggle-vmon-ontop"), _("Always on Top"), sigc::bind (sigc::mem_fun (*this, &Editor::set_xjadeo_viewoption), (int) 1)));
-	xjadeo_timecode_action = Glib::RefPtr<ToggleAction>::cast_static (ActionManager::register_toggle_action (editor_actions, X_("toggle-vmon-timecode"), _("Timecode"), sigc::bind (sigc::mem_fun (*this, &Editor::set_xjadeo_viewoption), (int) 2)));
-	xjadeo_frame_action = Glib::RefPtr<ToggleAction>::cast_static (ActionManager::register_toggle_action (editor_actions, X_("toggle-vmon-frame"), _("Frame number"), sigc::bind (sigc::mem_fun (*this, &Editor::set_xjadeo_viewoption), (int) 3)));
-	xjadeo_osdbg_action = Glib::RefPtr<ToggleAction>::cast_static (ActionManager::register_toggle_action (editor_actions, X_("toggle-vmon-osdbg"), _("Timecode Background"), sigc::bind (sigc::mem_fun (*this, &Editor::set_xjadeo_viewoption), (int) 4)));
-	xjadeo_fullscreen_action = Glib::RefPtr<ToggleAction>::cast_static (ActionManager::register_toggle_action (editor_actions, X_("toggle-vmon-fullscreen"), _("Fullscreen"), sigc::bind (sigc::mem_fun (*this, &Editor::set_xjadeo_viewoption), (int) 5)));
-	xjadeo_letterbox_action = Glib::RefPtr<ToggleAction>::cast_static (ActionManager::register_toggle_action (editor_actions, X_("toggle-vmon-letterbox"), _("Letterbox"), sigc::bind (sigc::mem_fun (*this, &Editor::set_xjadeo_viewoption), (int) 6)));
+	Glib::RefPtr<ActionGroup> ruler_actions = myactions.create_action_group (X_("Rulers"));
+	ruler_tempo_action = Glib::RefPtr<ToggleAction>::cast_static (myactions.register_toggle_action (ruler_actions, X_("toggle-tempo-ruler"), _("Tempo"), sigc::bind (sigc::mem_fun(*this, &Editor::toggle_ruler_visibility), ruler_time_tempo)));
+	ruler_meter_action = Glib::RefPtr<ToggleAction>::cast_static (myactions.register_toggle_action (ruler_actions, X_("toggle-meter-ruler"), _("Meter"), sigc::bind (sigc::mem_fun(*this, &Editor::toggle_ruler_visibility), ruler_time_meter)));
+	ruler_range_action = Glib::RefPtr<ToggleAction>::cast_static (myactions.register_toggle_action (ruler_actions, X_("toggle-range-ruler"), _("Ranges"), sigc::bind (sigc::mem_fun(*this, &Editor::toggle_ruler_visibility), ruler_time_range_marker)));
+	ruler_marker_action = Glib::RefPtr<ToggleAction>::cast_static (myactions.register_toggle_action (ruler_actions, X_("toggle-marker-ruler"), _("Markers"), sigc::bind (sigc::mem_fun(*this, &Editor::toggle_ruler_visibility), ruler_time_marker)));
+	ruler_cd_marker_action = Glib::RefPtr<ToggleAction>::cast_static (myactions.register_toggle_action (ruler_actions, X_("toggle-cd-marker-ruler"), _("CD Markers"), sigc::bind (sigc::mem_fun(*this, &Editor::toggle_ruler_visibility), ruler_time_cd_marker)));
+	ruler_loop_punch_action = Glib::RefPtr<ToggleAction>::cast_static (myactions.register_toggle_action (ruler_actions, X_("toggle-loop-punch-ruler"), _("Loop/Punch"), sigc::bind (sigc::mem_fun(*this, &Editor::toggle_ruler_visibility), ruler_time_transport_marker)));
+	ruler_bbt_action = Glib::RefPtr<ToggleAction>::cast_static (myactions.register_toggle_action (ruler_actions, X_("toggle-bbt-ruler"), _("Bars & Beats"), sigc::bind (sigc::mem_fun(*this, &Editor::toggle_ruler_visibility), ruler_metric_bbt)));
+	ruler_samples_action = Glib::RefPtr<ToggleAction>::cast_static (myactions.register_toggle_action (ruler_actions, X_("toggle-samples-ruler"), _("Samples"), sigc::bind (sigc::mem_fun(*this, &Editor::toggle_ruler_visibility), ruler_metric_samples)));
+	ruler_timecode_action = Glib::RefPtr<ToggleAction>::cast_static (myactions.register_toggle_action (ruler_actions, X_("toggle-timecode-ruler"), _("Timecode"), sigc::bind (sigc::mem_fun(*this, &Editor::toggle_ruler_visibility), ruler_metric_timecode)));
+	ruler_minsec_action = Glib::RefPtr<ToggleAction>::cast_static (myactions.register_toggle_action (ruler_actions, X_("toggle-minsec-ruler"), _("Min:Sec"), sigc::bind (sigc::mem_fun(*this, &Editor::toggle_ruler_visibility), ruler_metric_minsec)));
+
+	myactions.register_action (editor_menu_actions, X_("VideoMonitorMenu"), _("Video Monitor"));
+
+	ruler_video_action = Glib::RefPtr<ToggleAction>::cast_static (myactions.register_toggle_action (ruler_actions, X_("toggle-video-ruler"), _("Video"), sigc::bind (sigc::mem_fun(*this, &Editor::toggle_ruler_visibility), ruler_video_timeline)));
+	xjadeo_proc_action = Glib::RefPtr<ToggleAction>::cast_static (myactions.register_toggle_action (editor_actions, X_("ToggleJadeo"), _("Video Monitor"), sigc::mem_fun (*this, &Editor::set_xjadeo_proc)));
+
+	xjadeo_ontop_action = Glib::RefPtr<ToggleAction>::cast_static (myactions.register_toggle_action (editor_actions, X_("toggle-vmon-ontop"), _("Always on Top"), sigc::bind (sigc::mem_fun (*this, &Editor::set_xjadeo_viewoption), (int) 1)));
+	xjadeo_timecode_action = Glib::RefPtr<ToggleAction>::cast_static (myactions.register_toggle_action (editor_actions, X_("toggle-vmon-timecode"), _("Timecode"), sigc::bind (sigc::mem_fun (*this, &Editor::set_xjadeo_viewoption), (int) 2)));
+	xjadeo_frame_action = Glib::RefPtr<ToggleAction>::cast_static (myactions.register_toggle_action (editor_actions, X_("toggle-vmon-frame"), _("Frame number"), sigc::bind (sigc::mem_fun (*this, &Editor::set_xjadeo_viewoption), (int) 3)));
+	xjadeo_osdbg_action = Glib::RefPtr<ToggleAction>::cast_static (myactions.register_toggle_action (editor_actions, X_("toggle-vmon-osdbg"), _("Timecode Background"), sigc::bind (sigc::mem_fun (*this, &Editor::set_xjadeo_viewoption), (int) 4)));
+	xjadeo_fullscreen_action = Glib::RefPtr<ToggleAction>::cast_static (myactions.register_toggle_action (editor_actions, X_("toggle-vmon-fullscreen"), _("Fullscreen"), sigc::bind (sigc::mem_fun (*this, &Editor::set_xjadeo_viewoption), (int) 5)));
+	xjadeo_letterbox_action = Glib::RefPtr<ToggleAction>::cast_static (myactions.register_toggle_action (editor_actions, X_("toggle-vmon-letterbox"), _("Letterbox"), sigc::bind (sigc::mem_fun (*this, &Editor::set_xjadeo_viewoption), (int) 6)));
 	xjadeo_zoom_100 = reg_sens (editor_actions, "zoom-vmon-100", _("Original Size"), sigc::bind (sigc::mem_fun (*this, &Editor::set_xjadeo_viewoption), (int) 7));
 
 	/* set defaults here */
@@ -635,7 +645,7 @@ Editor::register_actions ()
 		ruler_range_action->set_active (true);
 		ruler_loop_punch_action->set_active (true);
 		ruler_loop_punch_action->set_active (true);
-		ruler_bbt_action->set_active (false);
+		ruler_bbt_action->set_active (true);
 		ruler_cd_marker_action->set_active (true);
 		ruler_timecode_action->set_active (true);
 		ruler_minsec_action->set_active (false);
@@ -663,52 +673,52 @@ Editor::register_actions ()
 
 	/* REGION LIST */
 
-	Glib::RefPtr<ActionGroup> rl_actions = ActionGroup::create (X_("RegionList"));
+	Glib::RefPtr<ActionGroup> rl_actions = myactions.create_action_group (X_("RegionList"));
 	RadioAction::Group sort_type_group;
 	RadioAction::Group sort_order_group;
 
 	/* the region list popup menu */
-	ActionManager::register_action (rl_actions, X_("RegionListSort"), _("Sort"));
+	myactions.register_action (rl_actions, X_("RegionListSort"), _("Sort"));
 
-	act = ActionManager::register_action (rl_actions, X_("rlAudition"), _("Audition"), sigc::mem_fun(*this, &Editor::audition_region_from_region_list));
+	act = myactions.register_action (rl_actions, X_("rlAudition"), _("Audition"), sigc::mem_fun(*this, &Editor::audition_region_from_region_list));
 	ActionManager::region_list_selection_sensitive_actions.push_back (act);
 
-	act = ActionManager::register_action (rl_actions, X_("rlHide"), _("Hide"), sigc::mem_fun(*this, &Editor::hide_region_from_region_list));
+	act = myactions.register_action (rl_actions, X_("rlHide"), _("Hide"), sigc::mem_fun(*this, &Editor::hide_region_from_region_list));
 	ActionManager::region_list_selection_sensitive_actions.push_back (act);
 
-	act = ActionManager::register_action (rl_actions, X_("rlShow"), _("Show"), sigc::mem_fun(*this, &Editor::show_region_in_region_list));
+	act = myactions.register_action (rl_actions, X_("rlShow"), _("Show"), sigc::mem_fun(*this, &Editor::show_region_in_region_list));
 	ActionManager::region_list_selection_sensitive_actions.push_back (act);
 
-	ActionManager::register_toggle_action (rl_actions, X_("rlShowAll"), _("Show All"), sigc::mem_fun(*_regions, &EditorRegions::toggle_full));
-	ActionManager::register_toggle_action (rl_actions, X_("rlShowAuto"), _("Show Automatic Regions"), sigc::mem_fun (*_regions, &EditorRegions::toggle_show_auto_regions));
+	myactions.register_toggle_action (rl_actions, X_("rlShowAll"), _("Show All"), sigc::mem_fun(*_regions, &EditorRegions::toggle_full));
+	myactions.register_toggle_action (rl_actions, X_("rlShowAuto"), _("Show Automatic Regions"), sigc::mem_fun (*_regions, &EditorRegions::toggle_show_auto_regions));
 
-	ActionManager::register_radio_action (rl_actions, sort_order_group, X_("SortAscending"),  _("Ascending"),
+	myactions.register_radio_action (rl_actions, sort_order_group, X_("SortAscending"),  _("Ascending"),
 			sigc::bind (sigc::mem_fun (*_regions, &EditorRegions::reset_sort_direction), true));
-	ActionManager::register_radio_action (rl_actions, sort_order_group, X_("SortDescending"),   _("Descending"),
+	myactions.register_radio_action (rl_actions, sort_order_group, X_("SortDescending"),   _("Descending"),
 			sigc::bind (sigc::mem_fun (*_regions, &EditorRegions::reset_sort_direction), false));
 
-	ActionManager::register_radio_action (rl_actions, sort_type_group, X_("SortByRegionName"),  _("By Region Name"),
+	myactions.register_radio_action (rl_actions, sort_type_group, X_("SortByRegionName"),  _("By Region Name"),
 			sigc::bind (sigc::mem_fun (*_regions, &EditorRegions::reset_sort_type), ByName, false));
-	ActionManager::register_radio_action (rl_actions, sort_type_group, X_("SortByRegionLength"),  _("By Region Length"),
+	myactions.register_radio_action (rl_actions, sort_type_group, X_("SortByRegionLength"),  _("By Region Length"),
 			sigc::bind (sigc::mem_fun (*_regions, &EditorRegions::reset_sort_type), ByLength, false));
-	ActionManager::register_radio_action (rl_actions, sort_type_group, X_("SortByRegionPosition"),  _("By Region Position"),
+	myactions.register_radio_action (rl_actions, sort_type_group, X_("SortByRegionPosition"),  _("By Region Position"),
 			sigc::bind (sigc::mem_fun (*_regions, &EditorRegions::reset_sort_type), ByPosition, false));
-	ActionManager::register_radio_action (rl_actions, sort_type_group, X_("SortByRegionTimestamp"),  _("By Region Timestamp"),
+	myactions.register_radio_action (rl_actions, sort_type_group, X_("SortByRegionTimestamp"),  _("By Region Timestamp"),
 			sigc::bind (sigc::mem_fun (*_regions, &EditorRegions::reset_sort_type), ByTimestamp, false));
-	ActionManager::register_radio_action (rl_actions, sort_type_group, X_("SortByRegionStartinFile"),  _("By Region Start in File"),
+	myactions.register_radio_action (rl_actions, sort_type_group, X_("SortByRegionStartinFile"),  _("By Region Start in File"),
 			sigc::bind (sigc::mem_fun (*_regions, &EditorRegions::reset_sort_type), ByStartInFile, false));
-	ActionManager::register_radio_action (rl_actions, sort_type_group, X_("SortByRegionEndinFile"),  _("By Region End in File"),
+	myactions.register_radio_action (rl_actions, sort_type_group, X_("SortByRegionEndinFile"),  _("By Region End in File"),
 			sigc::bind (sigc::mem_fun (*_regions, &EditorRegions::reset_sort_type), ByEndInFile, false));
-	ActionManager::register_radio_action (rl_actions, sort_type_group, X_("SortBySourceFileName"),  _("By Source File Name"),
+	myactions.register_radio_action (rl_actions, sort_type_group, X_("SortBySourceFileName"),  _("By Source File Name"),
 			sigc::bind (sigc::mem_fun (*_regions, &EditorRegions::reset_sort_type), BySourceFileName, false));
-	ActionManager::register_radio_action (rl_actions, sort_type_group, X_("SortBySourceFileLength"),  _("By Source File Length"),
+	myactions.register_radio_action (rl_actions, sort_type_group, X_("SortBySourceFileLength"),  _("By Source File Length"),
 			sigc::bind (sigc::mem_fun (*_regions, &EditorRegions::reset_sort_type), BySourceFileLength, false));
-	ActionManager::register_radio_action (rl_actions, sort_type_group, X_("SortBySourceFileCreationDate"),  _("By Source File Creation Date"),
+	myactions.register_radio_action (rl_actions, sort_type_group, X_("SortBySourceFileCreationDate"),  _("By Source File Creation Date"),
 			sigc::bind (sigc::mem_fun (*_regions, &EditorRegions::reset_sort_type), BySourceFileCreationDate, false));
-	ActionManager::register_radio_action (rl_actions, sort_type_group, X_("SortBySourceFilesystem"),  _("By Source Filesystem"),
+	myactions.register_radio_action (rl_actions, sort_type_group, X_("SortBySourceFilesystem"),  _("By Source Filesystem"),
 			sigc::bind (sigc::mem_fun (*_regions, &EditorRegions::reset_sort_type), BySourceFileFS, false));
 
-	ActionManager::register_action (rl_actions, X_("removeUnusedRegions"), _("Remove Unused"), sigc::mem_fun (*_regions, &EditorRegions::remove_unused_regions));
+	myactions.register_action (rl_actions, X_("removeUnusedRegions"), _("Remove Unused"), sigc::mem_fun (*_regions, &EditorRegions::remove_unused_regions));
 
 	act = reg_sens (editor_actions, X_("addExistingPTFiles"), _("Import PT session"), sigc::mem_fun (*this, &Editor::external_pt_dialog));
 	ActionManager::write_sensitive_actions.push_back (act);
@@ -721,52 +731,28 @@ Editor::register_actions ()
 	act = reg_sens (editor_actions, X_("addExternalAudioToRegionList"), _("Import to Region List..."), sigc::bind (sigc::mem_fun(*this, &Editor::add_external_audio_action), ImportAsRegion));
 	ActionManager::write_sensitive_actions.push_back (act);
 
-	act = ActionManager::register_action (editor_actions, X_("importFromSession"), _("Import from Session"), sigc::mem_fun(*this, &Editor::session_import_dialog));
+	act = myactions.register_action (editor_actions, X_("importFromSession"), _("Import from Session"), sigc::mem_fun(*this, &Editor::session_import_dialog));
 	ActionManager::write_sensitive_actions.push_back (act);
 
 
-	act = ActionManager::register_action (editor_actions, X_("bring-into-session"), _("Bring all media into session folder"), sigc::mem_fun(*this, &Editor::bring_all_sources_into_session));
+	act = myactions.register_action (editor_actions, X_("bring-into-session"), _("Bring all media into session folder"), sigc::mem_fun(*this, &Editor::bring_all_sources_into_session));
 	ActionManager::write_sensitive_actions.push_back (act);
 
-	ActionManager::register_toggle_action (editor_actions, X_("ToggleSummary"), _("Show Summary"), sigc::mem_fun (*this, &Editor::set_summary));
-
-	ActionManager::register_toggle_action (editor_actions, X_("ToggleGroupTabs"), _("Show Group Tabs"), sigc::mem_fun (*this, &Editor::set_group_tabs));
+	myactions.register_toggle_action (editor_actions, X_("ToggleSummary"), _("Show Summary"), sigc::mem_fun (*this, &Editor::set_summary));
 
-	ActionManager::register_toggle_action (editor_actions, X_("ToggleMeasureVisibility"), _("Show Measure Lines"), sigc::mem_fun (*this, &Editor::toggle_measure_visibility));
+	myactions.register_toggle_action (editor_actions, X_("ToggleGroupTabs"), _("Show Group Tabs"), sigc::mem_fun (*this, &Editor::set_group_tabs));
 
-	/* if there is a logo in the editor canvas, its always visible at startup */
+	myactions.register_toggle_action (editor_actions, X_("ToggleMeasureVisibility"), _("Show Measure Lines"), sigc::mem_fun (*this, &Editor::toggle_measure_visibility));
 
-	act = ActionManager::register_toggle_action (editor_actions, X_("ToggleLogoVisibility"), _("Show Logo"), sigc::mem_fun (*this, &Editor::toggle_logo_visibility));
-	Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act);
-	tact->set_active (true);
-
-	ActionManager::register_action (editor_actions, X_("toggle-midi-input-active"), _("Toggle MIDI Input Active for Editor-Selected Tracks/Busses"),
+	myactions.register_action (editor_actions, X_("toggle-midi-input-active"), _("Toggle MIDI Input Active for Editor-Selected Tracks/Busses"),
 				   sigc::bind (sigc::mem_fun (*this, &Editor::toggle_midi_input_active), false));
-
-	ActionManager::add_action_group (rl_actions);
-	ActionManager::add_action_group (ruler_actions);
-	ActionManager::add_action_group (zoom_actions);
-	ActionManager::add_action_group (mouse_mode_actions);
-	ActionManager::add_action_group (snap_actions);
-	ActionManager::add_action_group (editor_actions);
-	ActionManager::add_action_group (editor_menu_actions);
 }
 
 void
 Editor::load_bindings ()
 {
-        /* XXX move this to a better place */
-
-        key_bindings.set_action_map (editor_action_map);
-
-	std::string binding_file;
-
-	if (find_file (ardour_config_search_path(), "editor.bindings", binding_file)) {
-                key_bindings.load (binding_file);
-		info << string_compose (_("Loaded editor bindings from %1"), binding_file) << endmsg;
-        } else {
-		error << string_compose (_("Could not find editor.bindings in search path %1"), ardour_config_search_path().to_string()) << endmsg;
-	}
+	bindings = Bindings::get_bindings (X_("Editor"), myactions);
+	global_hpacker.set_data ("ardour-bindings", bindings);
 }
 
 void
@@ -994,23 +980,6 @@ Editor::toggle_measure_visibility ()
 	}
 }
 
-void
-Editor::toggle_logo_visibility ()
-{
-	Glib::RefPtr<Action> act = ActionManager::get_action (X_("Editor"), X_("ToggleLogoVisibility"));
-
-	if (act) {
-		Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act);
-		if (logo_item) {
-			if (tact->get_active()) {
-				logo_item->show ();
-			} else {
-				logo_item->hide ();
-			}
-		}
-	}
-}
-
 RefPtr<RadioAction>
 Editor::snap_type_action (SnapType type)
 {
@@ -1730,10 +1699,6 @@ Editor::parameter_changed (std::string p)
 		}
 	} else if (p == "timecode-offset" || p == "timecode-offset-negative") {
 		update_just_timecode ();
-	} else if (p == "show-zoom-tools") {
-		if (_zoom_tearoff) {
-			_zoom_tearoff->set_visible (UIConfiguration::instance().get_show_zoom_tools(), true);
-		}
 	} else if (p == "sound-midi-notes") {
 		Glib::RefPtr<Action> act = ActionManager::get_action (X_("Editor"), X_("sound-midi-notes"));
 
@@ -1746,19 +1711,6 @@ Editor::parameter_changed (std::string p)
 		}
 	} else if (p == "show-region-gain") {
 		set_gain_envelope_visibility ();
-	} else if (p == "remote-model") {
-		if (_routes) {
-			_routes->reset_remote_control_ids ();
-		}
-	} else if (p == "use-tooltips") {
-
-		/* this doesn't really belong here but it has to go somewhere */
-
-		if (UIConfiguration::instance().get_use_tooltips()) {
-			Gtkmm2ext::enable_tooltips ();
-		} else {
-			Gtkmm2ext::disable_tooltips ();
-		}
 	} else if (p == "skip-playback") {
 		Glib::RefPtr<Action> act = ActionManager::get_action (X_("Editor"), X_("toggle-skip-playback"));
 
@@ -1773,9 +1725,40 @@ Editor::parameter_changed (std::string p)
 }
 
 void
-Editor::reset_focus ()
+Editor::reset_focus (Gtk::Widget* w)
 {
-	_track_canvas->grab_focus();
+	/* this resets focus to the first focusable parent of the given widget,
+	 * or, if there is no focusable parent, cancels focus in the toplevel
+	 * window that the given widget is packed into (if there is one).
+	 */
+
+	if (!w) {
+		return;
+	}
+
+	Gtk::Widget* top = w->get_toplevel();
+
+	if (!top || !top->is_toplevel()) {
+		return;
+	}
+
+	w = w->get_parent ();
+
+	while (w) {
+		if (w->get_can_focus ()) {
+			Window* win = dynamic_cast<Window*> (top);
+			win->set_focus (*w);
+			return;
+		}
+		w = w->get_parent ();
+	}
+
+	/* no focusable parent found, cancel focus in top level window.
+	   C++ API cannot be used for this. Thanks, references.
+	 */
+
+	gtk_window_set_focus (GTK_WINDOW(top->gobj()), 0);
+
 }
 
 void
@@ -1794,7 +1777,7 @@ Editor::reset_canvas_action_sensitivity (bool onoff)
 void
 Editor::register_region_actions ()
 {
-	_region_actions = ActionGroup::create (X_("Region"));
+	_region_actions = myactions.create_action_group (X_("Region"));
 
 	/* PART 1: actions that operate on the selection, and for which the edit point type and location is irrelevant */
 
@@ -1958,7 +1941,8 @@ Editor::register_region_actions ()
 	reg_sens (_region_actions, "combine-regions", _("Combine"), sigc::mem_fun (*this, &Editor::combine_regions));
 	reg_sens (_region_actions, "uncombine-regions", _("Uncombine"), sigc::mem_fun (*this, &Editor::uncombine_regions));
 
-	reg_sens (_region_actions, "analyze-region", _("Spectral Analysis..."), sigc::mem_fun (*this, &Editor::analyze_region_selection));
+	reg_sens (_region_actions, "loudness-analyze-region", _("Loudness Analysis..."), sigc::mem_fun (*this, &Editor::loudness_analyze_region_selection));
+	reg_sens (_region_actions, "spectral-analyze-region", _("Spectral Analysis..."), sigc::mem_fun (*this, &Editor::spectral_analyze_region_selection));
 
 	reg_sens (_region_actions, "reset-region-gain-envelopes", _("Reset Envelope"), sigc::mem_fun (*this, &Editor::reset_region_gain_envelopes));
 
@@ -2062,13 +2046,9 @@ Editor::register_region_actions ()
 		sigc::bind (sigc::mem_fun (*this, &Editor::align_regions_relative), ARDOUR::SyncPoint)
 		);
 
-	Glib::RefPtr<Action> a = reg_sens (_region_actions, "choose-top-region", _("Choose Top..."), sigc::bind (sigc::mem_fun (*this, &Editor::change_region_layering_order), false));
-	a->set_accel_group (get_accel_group ());
-
-	a = reg_sens (_region_actions, "choose-top-region-context-menu", _("Choose Top..."), sigc::bind (sigc::mem_fun (*this, &Editor::change_region_layering_order), true));
-	a->set_accel_group (get_accel_group ());
-
-	_all_region_actions_sensitized = true;
+	reg_sens (_region_actions, "choose-top-region", _("Choose Top..."), sigc::bind (sigc::mem_fun (*this, &Editor::change_region_layering_order), false));
+	reg_sens (_region_actions, "choose-top-region-context-menu", _("Choose Top..."), sigc::bind (sigc::mem_fun (*this, &Editor::change_region_layering_order), true));
 
-	ActionManager::add_action_group (_region_actions);
+	/* desensitize them all by default. region selection will change this */
+	sensitize_all_region_actions (false);
 }
diff --git a/gtk2_ardour/editor_audio_import.cc b/gtk2_ardour/editor_audio_import.cc
index 4da1625..237fb67 100644
--- a/gtk2_ardour/editor_audio_import.cc
+++ b/gtk2_ardour/editor_audio_import.cc
@@ -58,7 +58,7 @@
 #include "mouse_cursors.h"
 #include "editor_cursors.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
@@ -507,7 +507,10 @@ Editor::import_sndfiles (vector<string>            paths,
 		gtk_main_iteration ();
 	}
 
-	import_status.done = true;
+	// wait for thread to terminate
+	while (!import_status.done) {
+		gtk_main_iteration ();
+	}
 
 	int result = -1;
 
@@ -934,24 +937,38 @@ Editor::finish_bringing_in_material (boost::shared_ptr<Region> region,
 	{
 		if (!existing_track) {
 			if (ar) {
-				list<boost::shared_ptr<AudioTrack> > at (_session->new_audio_track (in_chans, out_chans, Normal, 0, 1));
+				list<boost::shared_ptr<AudioTrack> > at (_session->new_audio_track (in_chans, out_chans, 0, 1, string(), PresentationInfo::max_order, Normal));
 
 				if (at.empty()) {
 					return -1;
 				}
+				if (Config->get_strict_io ()) {
+					for (list<boost::shared_ptr<AudioTrack> >::iterator i = at.begin(); i != at.end(); ++i) {
+						(*i)->set_strict_io (true);
+					}
+				}
 
 				existing_track = at.front();
 			} else if (mr) {
 				list<boost::shared_ptr<MidiTrack> > mt (
 					_session->new_midi_track (ChanCount (DataType::MIDI, 1),
 					                          ChanCount (DataType::MIDI, 1),
-					                          instrument,
-					                          Normal, 0, 1));
+					                          instrument, (Plugin::PresetRecord*) 0,
+					                          (RouteGroup*) 0,
+					                          1,
+					                          string(),
+					                          PresentationInfo::max_order));
 
 				if (mt.empty()) {
 					return -1;
 				}
+				if (Config->get_strict_io ()) {
+					for (list<boost::shared_ptr<MidiTrack> >::iterator i = mt.begin(); i != mt.end(); ++i) {
+						(*i)->set_strict_io (true);
+					}
+				}
 
+				// TODO set strict_io from preferences
 				existing_track = mt.front();
 			}
 
@@ -976,7 +993,7 @@ Editor::finish_bringing_in_material (boost::shared_ptr<Region> region,
 			return -1;
 		}
 
-		list<boost::shared_ptr<AudioTrack> > at (_session->new_audio_track (in_chans, out_chans, Destructive));
+		list<boost::shared_ptr<AudioTrack> > at (_session->new_audio_track (in_chans, out_chans, 0, 1, string(), PresentationInfo::max_order, Destructive));
 		if (!at.empty()) {
 			boost::shared_ptr<Playlist> playlist = at.front()->playlist();
 			boost::shared_ptr<Region> copy (RegionFactory::create (region, true));
@@ -984,6 +1001,11 @@ Editor::finish_bringing_in_material (boost::shared_ptr<Region> region,
 			playlist->add_region (copy, pos);
 			_session->add_command (new StatefulDiffCommand (playlist));
 		}
+		if (Config->get_strict_io ()) {
+			for (list<boost::shared_ptr<AudioTrack> >::iterator i = at.begin(); i != at.end(); ++i) {
+				(*i)->set_strict_io (true);
+			}
+		}
 		break;
 	}
 	}
diff --git a/gtk2_ardour/editor_audiotrack.cc b/gtk2_ardour/editor_audiotrack.cc
index b569037..4693ea8 100644
--- a/gtk2_ardour/editor_audiotrack.cc
+++ b/gtk2_ardour/editor_audiotrack.cc
@@ -29,7 +29,7 @@
 #include "selection.h"
 #include "ui_config.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 using namespace PBD;
@@ -39,7 +39,7 @@ Editor::start_updating_meters ()
 {
 	RouteTimeAxisView* rtv;
 
-	if (is_mapped() && _session) {
+	if (contents().is_mapped() && _session) {
 		for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) {
 			if ((rtv = dynamic_cast<RouteTimeAxisView*>(*i)) != 0) {
 				rtv->reset_meter ();
@@ -57,7 +57,7 @@ Editor::stop_updating_meters ()
 
 	meters_running = false;
 
-	if (is_mapped() && _session) {
+	if (contents().is_mapped() && _session) {
 		for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) {
 			if ((rtv = dynamic_cast<RouteTimeAxisView*>(*i)) != 0) {
 				rtv->hide_meter ();
diff --git a/gtk2_ardour/editor_canvas.cc b/gtk2_ardour/editor_canvas.cc
index 233a3fb..4fbe0d8 100644
--- a/gtk2_ardour/editor_canvas.cc
+++ b/gtk2_ardour/editor_canvas.cc
@@ -54,7 +54,7 @@
 #include "ui_config.h"
 #include "verbose_cursor.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
@@ -98,18 +98,6 @@ Editor::initialize_canvas ()
 
 	_verbose_cursor = new VerboseCursor (this);
 
-	/* on the bottom, an image */
-
-	if (Profile->get_sae()) {
-		Image img (::get_icon (X_("saelogo")));
-		// logo_item = new ArdourCanvas::Pixbuf (_track_canvas->root(), 0.0, 0.0, img.get_pixbuf());
-		// logo_item->property_height_in_pixels() = true;
-		// logo_item->property_width_in_pixels() = true;
-		// logo_item->property_height_set() = true;
-		// logo_item->property_width_set() = true;
-		// logo_item->show ();
-	}
-
 	/*a group to hold global rects like punch/loop indicators */
 	global_rect_group = new ArdourCanvas::Container (hv_scroll_group);
 	CANVAS_DEBUG_NAME (global_rect_group, "global rect group");
@@ -227,10 +215,6 @@ Editor::initialize_canvas ()
 
 	playhead_cursor = new EditorCursor (*this, &Editor::canvas_playhead_cursor_event);
 
-	if (logo_item) {
-		logo_item->lower_to_bottom ();
-	}
-
 	_canvas_drop_zone = new ArdourCanvas::Rectangle (hv_scroll_group, ArdourCanvas::Rect (0.0, 0.0, ArdourCanvas::COORD_MAX, 0.0));
 	/* this thing is transparent */
 	_canvas_drop_zone->set_fill (false);
@@ -329,7 +313,7 @@ Editor::reset_controls_layout_width ()
 	edit_controls_vbox.size_request (req);
 	w = req.width;
 
-        if (_group_tabs->is_mapped()) {
+        if (_group_tabs->is_visible()) {
 		_group_tabs->size_request (req);
                 w += req.width;
         }
@@ -428,7 +412,7 @@ Editor::drop_paths_part_two (const vector<string>& paths, framepos_t frame, doub
 		InstrumentSelector is; // instantiation builds instrument-list and sets default.
 		do_import (midi_paths, Editing::ImportDistinctFiles, ImportAsTrack, SrcBest, frame, is.selected_instrument());
 
-		if (Profile->get_sae() || UIConfiguration::instance().get_only_copy_imported_files() || copy) {
+		if (UIConfiguration::instance().get_only_copy_imported_files() || copy) {
 			do_import (audio_paths, Editing::ImportDistinctFiles, Editing::ImportAsTrack, SrcBest, frame);
 		} else {
 			do_embed (audio_paths, Editing::ImportDistinctFiles, ImportAsTrack, frame);
@@ -444,7 +428,7 @@ Editor::drop_paths_part_two (const vector<string>& paths, framepos_t frame, doub
 
 			do_import (midi_paths, Editing::ImportSerializeFiles, ImportToTrack, SrcBest, frame);
 
-			if (Profile->get_sae() || UIConfiguration::instance().get_only_copy_imported_files() || copy) {
+			if (UIConfiguration::instance().get_only_copy_imported_files() || copy) {
 				do_import (audio_paths, Editing::ImportSerializeFiles, Editing::ImportToTrack, SrcBest, frame);
 			} else {
 				do_embed (audio_paths, Editing::ImportSerializeFiles, ImportToTrack, frame);
@@ -478,7 +462,7 @@ Editor::drop_paths (const RefPtr<Gdk::DragContext>& context,
 		snap_to (frame);
 
 		bool copy = ((context->get_actions() & (Gdk::ACTION_COPY | Gdk::ACTION_LINK | Gdk::ACTION_MOVE)) == Gdk::ACTION_COPY);
-#ifdef GTKOSX
+#ifdef __APPLE__
 		/* We are not allowed to call recursive main event loops from within
 		   the main event loop with GTK/Quartz. Since import/embed wants
 		   to push up a progress dialog, defer all this till we go idle.
@@ -500,6 +484,12 @@ Editor::drop_paths (const RefPtr<Gdk::DragContext>& context,
 void
 Editor::maybe_autoscroll (bool allow_horiz, bool allow_vert, bool from_headers)
 {
+	Gtk::Window* toplevel = dynamic_cast<Gtk::Window*>(contents().get_toplevel());
+
+	if (!toplevel) {
+		return;
+	}
+
 	if (!UIConfiguration::instance().get_autoscroll_editor () || autoscroll_active ()) {
 		return;
 	}
@@ -557,7 +547,7 @@ Editor::maybe_autoscroll (bool allow_horiz, bool allow_vert, bool from_headers)
 	int x, y;
 	Gdk::ModifierType mask;
 
-	get_window()->get_pointer (x, y, mask);
+	toplevel->get_window()->get_pointer (x, y, mask);
 
 	if ((allow_horiz && ((x < scrolling_boundary.x0 && leftmost_frame > 0) || x >= scrolling_boundary.x1)) ||
 	    (allow_vert && ((y < scrolling_boundary.y0 && vertical_adjustment.get_value() > 0)|| y >= scrolling_boundary.y1))) {
@@ -578,8 +568,13 @@ Editor::autoscroll_canvas ()
 	Gdk::ModifierType mask;
 	frameoffset_t dx = 0;
 	bool no_stop = false;
+	Gtk::Window* toplevel = dynamic_cast<Gtk::Window*>(contents().get_toplevel());
+
+	if (!toplevel) {
+		return false;
+	}
 
-	get_window()->get_pointer (x, y, mask);
+	toplevel->get_window()->get_pointer (x, y, mask);
 
 	VisualChange vc;
 	bool vertical_motion = false;
@@ -643,6 +638,7 @@ Editor::autoscroll_canvas ()
 				scroll_up_one_track ();
 				vertical_motion = true;
 			}
+			no_stop = true;
 
 		} else if (y > autoscroll_boundary.y1) {
 
@@ -650,9 +646,9 @@ Editor::autoscroll_canvas ()
 				scroll_down_one_track ();
 				vertical_motion = true;
 			}
+			no_stop = true;
 		}
 
-		no_stop = true;
 	}
 
 	if (vc.pending || vertical_motion) {
@@ -682,7 +678,7 @@ Editor::autoscroll_canvas ()
 		int cx;
 		int cy;
 
-		translate_coordinates (*_track_canvas, x, y, cx, cy);
+		toplevel->translate_coordinates (*_track_canvas, x, y, cx, cy);
 
 		/* clamp x and y to remain within the autoscroll boundary,
 		 * which is defined in window coordinates
@@ -734,7 +730,7 @@ Editor::autoscroll_canvas ()
 		}
 		y = min (max ((ArdourCanvas::Coord) y, autoscroll_boundary.y0), autoscroll_boundary.y1);
 
-		translate_coordinates (*_track_canvas_viewport, x, y, cx, cy);
+		toplevel->translate_coordinates (*_track_canvas_viewport, x, y, cx, cy);
 
 		ArdourCanvas::Duple d = _track_canvas->window_to_canvas (ArdourCanvas::Duple (cx, cy));
 		ev.x = d.x;
@@ -762,7 +758,6 @@ Editor::start_canvas_autoscroll (bool allow_horiz, bool allow_vert, const Ardour
 
 	stop_canvas_autoscroll ();
 
-	autoscroll_cnt = 0;
 	autoscroll_horizontal_allowed = allow_horiz;
 	autoscroll_vertical_allowed = allow_vert;
 	autoscroll_boundary = boundary;
@@ -781,6 +776,7 @@ void
 Editor::stop_canvas_autoscroll ()
 {
 	autoscroll_connection.disconnect ();
+	autoscroll_cnt = 0;
 }
 
 Editor::EnterContext*
diff --git a/gtk2_ardour/editor_canvas_events.cc b/gtk2_ardour/editor_canvas_events.cc
index 25907fe..30e2504 100644
--- a/gtk2_ardour/editor_canvas_events.cc
+++ b/gtk2_ardour/editor_canvas_events.cc
@@ -51,7 +51,7 @@
 #include "ui_config.h"
 #include "verbose_cursor.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
@@ -677,10 +677,14 @@ Editor::canvas_line_event (GdkEvent *event, ArdourCanvas::Item* item, Automation
 	AudioRegionGainLine* gl;
 	if ((gl = dynamic_cast<AudioRegionGainLine*> (al)) != 0) {
 		type = GainLineItem;
-		clicked_regionview = &gl->region_view ();
+		if (event->type == GDK_BUTTON_PRESS) {
+			clicked_regionview = &gl->region_view ();
+		}
 	} else {
 		type = AutomationLineItem;
-		clicked_regionview = 0;
+		if (event->type == GDK_BUTTON_PRESS) {
+			clicked_regionview = 0;
+		}
 	}
 
 	clicked_control_point = 0;
@@ -1010,6 +1014,12 @@ Editor::canvas_tempo_marker_event (GdkEvent *event, ArdourCanvas::Item* item, Te
 }
 
 bool
+Editor::canvas_tempo_curve_event (GdkEvent *event, ArdourCanvas::Item* item, TempoCurve* /*marker*/)
+{
+	return typed_event (item, event, TempoCurveItem);
+}
+
+bool
 Editor::canvas_meter_marker_event (GdkEvent *event, ArdourCanvas::Item* item, MeterMarker* /*marker*/)
 {
 	return typed_event (item, event, MeterMarkerItem);
@@ -1219,7 +1229,7 @@ Editor::track_canvas_drag_motion (Glib::RefPtr<Gdk::DragContext> const& context,
 			 * TODO: check if file is audio/midi, allow drops on same track-type only,
 			 * currently: if audio is dropped on a midi-track, it is only added to the region-list
 			 */
-			if (Profile->get_sae() || UIConfiguration::instance().get_only_copy_imported_files()) {
+			if (UIConfiguration::instance().get_only_copy_imported_files()) {
 				context->drag_status(Gdk::ACTION_COPY, time);
 			} else {
 				if ((context->get_actions() & (Gdk::ACTION_COPY | Gdk::ACTION_LINK | Gdk::ACTION_MOVE)) == Gdk::ACTION_COPY) {
@@ -1270,13 +1280,15 @@ Editor::drop_regions (const Glib::RefPtr<Gdk::DragContext>& /*context*/,
 					output_chan =  session()->master_out()->n_inputs().n_audio();
 				}
 				list<boost::shared_ptr<AudioTrack> > audio_tracks;
-				audio_tracks = session()->new_audio_track (region->n_channels(), output_chan, ARDOUR::Normal, 0, 1, region->name());
-				rtav = axis_view_from_route (audio_tracks.front());
+				audio_tracks = session()->new_audio_track (region->n_channels(), output_chan, 0, 1, region->name(), PresentationInfo::max_order);
+				rtav = dynamic_cast<RouteTimeAxisView*> (axis_view_from_stripable (audio_tracks.front()));
 			} else if (boost::dynamic_pointer_cast<MidiRegion> (region)) {
 				ChanCount one_midi_port (DataType::MIDI, 1);
 				list<boost::shared_ptr<MidiTrack> > midi_tracks;
-				midi_tracks = session()->new_midi_track (one_midi_port, one_midi_port, boost::shared_ptr<ARDOUR::PluginInfo>(), ARDOUR::Normal, 0, 1, region->name());
-				rtav = axis_view_from_route (midi_tracks.front());
+				midi_tracks = session()->new_midi_track (one_midi_port, one_midi_port, boost::shared_ptr<ARDOUR::PluginInfo>(),
+				                                         (ARDOUR::Plugin::PresetRecord*) 0,
+				                                         (ARDOUR::RouteGroup*) 0, 1, region->name(), PresentationInfo::max_order);
+				rtav = dynamic_cast<RouteTimeAxisView*> (axis_view_from_stripable (midi_tracks.front()));
 			} else {
 				return;
 			}
diff --git a/gtk2_ardour/editor_drag.cc b/gtk2_ardour/editor_drag.cc
index 21cd043..6fa3cb0 100644
--- a/gtk2_ardour/editor_drag.cc
+++ b/gtk2_ardour/editor_drag.cc
@@ -44,7 +44,7 @@
 #include "canvas/scroll_group.h"
 
 #include "editor.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
 #include "keyboard.h"
 #include "audio_region_view.h"
 #include "automation_region_view.h"
@@ -510,28 +510,24 @@ Drag::show_verbose_cursor_text (string const & text)
 }
 
 boost::shared_ptr<Region>
-Drag::add_midi_region (MidiTimeAxisView* view, bool commit)
+Drag::add_midi_region (MidiTimeAxisView* view, bool commit, const int32_t sub_num)
 {
 	if (_editor->session()) {
 		const TempoMap& map (_editor->session()->tempo_map());
 		framecnt_t pos = grab_frame();
-		const Meter& m = map.meter_at (pos);
 		/* not that the frame rate used here can be affected by pull up/down which
 		   might be wrong.
 		*/
-		framecnt_t len = m.frames_per_bar (map.tempo_at (pos), _editor->session()->frame_rate());
-		return view->add_region (grab_frame(), len, commit);
+		framecnt_t len = map.frame_at_beat (map.beat_at_frame (pos) + 1.0) - pos;
+		return view->add_region (grab_frame(), len, commit, sub_num);
 	}
 
 	return boost::shared_ptr<Region>();
 }
 
-struct EditorOrderTimeAxisViewSorter {
+struct PresentationInfoTimeAxisViewSorter {
 	bool operator() (TimeAxisView* a, TimeAxisView* b) {
-		RouteTimeAxisView* ra = dynamic_cast<RouteTimeAxisView*> (a);
-		RouteTimeAxisView* rb = dynamic_cast<RouteTimeAxisView*> (b);
-		assert (ra && rb);
-		return ra->route()->order_key () < rb->route()->order_key ();
+		return a->stripable()->presentation_info().order() < b->stripable()->presentation_info().order();
 	}
 };
 
@@ -547,7 +543,7 @@ RegionDrag::RegionDrag (Editor* e, ArdourCanvas::Item* i, RegionView* p, list<Re
 	*/
 
 	TrackViewList track_views = _editor->track_views;
-	track_views.sort (EditorOrderTimeAxisViewSorter ());
+	track_views.sort (PresentationInfoTimeAxisViewSorter ());
 
 	for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) {
 		_time_axis_views.push_back (*i);
@@ -847,7 +843,7 @@ RegionMotionDrag::motion (GdkEvent* event, bool first_move)
 
 		RouteTimeAxisView* rtv = dynamic_cast<RouteTimeAxisView*> (tv);
 		if (!rtv || !rtv->is_track()) {
-			/* ignore busses early on. we can't move any regions on them */
+			/* ignore non-tracks early on. we can't move any regions on them */
 		} else if (_last_pointer_time_axis_view < 0) {
 			/* Was in the drop-zone, now over a track.
 			 * Hence it must be an upward move (from the bottom)
@@ -1260,8 +1256,8 @@ RegionMoveDrag::motion (GdkEvent* event, bool first_move)
 			MidiRegionView* mrv = dynamic_cast<MidiRegionView*>(rv);
 
 			const boost::shared_ptr<const Region> original = rv->region();
-			boost::shared_ptr<Region> region_copy = RegionFactory::create (original, true);
-			region_copy->set_position (original->position());
+			boost::shared_ptr<Region> region_copy = RegionFactory::create (original, true
+										       , _editor->get_grid_music_divisions (event->button.state));
 			/* need to set this so that the drop zone code can work. This doesn't
 			   actually put the region into the playlist, but just sets a weak pointer
 			   to it.
@@ -1368,7 +1364,8 @@ RegionMoveDrag::finished (GdkEvent* ev, bool movement_occurred)
 		finished_copy (
 			changed_position,
 			changed_tracks,
-			drag_delta
+			drag_delta,
+			ev->button.state
 			);
 
 	} else {
@@ -1376,7 +1373,8 @@ RegionMoveDrag::finished (GdkEvent* ev, bool movement_occurred)
 		finished_no_copy (
 			changed_position,
 			changed_tracks,
-			drag_delta
+			drag_delta,
+			ev->button.state
 			);
 
 	}
@@ -1398,21 +1396,23 @@ RegionMoveDrag::create_destination_time_axis (boost::shared_ptr<Region> region,
 			if ((Config->get_output_auto_connect() & AutoConnectMaster) && _editor->session()->master_out()) {
 				output_chan =  _editor->session()->master_out()->n_inputs().n_audio();
 			}
-			audio_tracks = _editor->session()->new_audio_track (region->n_channels(), output_chan, ARDOUR::Normal, 0, 1, region->name());
-			RouteTimeAxisView* rtav = _editor->axis_view_from_route (audio_tracks.front());
-			if (rtav) {
-				rtav->set_height (original->current_height());
+			audio_tracks = _editor->session()->new_audio_track (region->n_channels(), output_chan, 0, 1, region->name(), PresentationInfo::max_order);
+			TimeAxisView* tav =_editor->axis_view_from_stripable (audio_tracks.front());
+			if (tav) {
+				tav->set_height (original->current_height());
 			}
-			return rtav;
+			return dynamic_cast<RouteTimeAxisView*>(tav);
 		} else {
 			ChanCount one_midi_port (DataType::MIDI, 1);
 			list<boost::shared_ptr<MidiTrack> > midi_tracks;
-			midi_tracks = _editor->session()->new_midi_track (one_midi_port, one_midi_port, boost::shared_ptr<ARDOUR::PluginInfo>(), ARDOUR::Normal, 0, 1, region->name());
-			RouteTimeAxisView* rtav = _editor->axis_view_from_route (midi_tracks.front());
-			if (rtav) {
-				rtav->set_height (original->current_height());
+			midi_tracks = _editor->session()->new_midi_track (one_midi_port, one_midi_port, boost::shared_ptr<ARDOUR::PluginInfo>(),
+			                                                  (ARDOUR::Plugin::PresetRecord*) 0,
+			                                                  (ARDOUR::RouteGroup*) 0, 1, region->name(), PresentationInfo::max_order);
+			TimeAxisView* tav = _editor->axis_view_from_stripable (midi_tracks.front());
+			if (tav) {
+				tav->set_height (original->current_height());
 			}
-			return rtav;
+			return dynamic_cast<RouteTimeAxisView*> (tav);
 		}
 	} catch (...) {
 		error << _("Could not create new track after region placed in the drop zone") << endmsg;
@@ -1421,7 +1421,7 @@ RegionMoveDrag::create_destination_time_axis (boost::shared_ptr<Region> region,
 }
 
 void
-RegionMoveDrag::finished_copy (bool const changed_position, bool const /*changed_tracks*/, framecnt_t const drag_delta)
+RegionMoveDrag::finished_copy (bool const changed_position, bool const /*changed_tracks*/, framecnt_t const drag_delta, int32_t const ev_state)
 {
 	RegionSelection new_views;
 	PlaylistSet modified_playlists;
@@ -1478,7 +1478,9 @@ RegionMoveDrag::finished_copy (bool const changed_position, bool const /*changed
 		}
 
 		if (dest_rtv != 0) {
-			RegionView* new_view = insert_region_into_playlist (i->view->region(), dest_rtv, i->layer, where, modified_playlists);
+			RegionView* new_view = insert_region_into_playlist (i->view->region(), dest_rtv, i->layer, where,
+									    modified_playlists, _editor->get_grid_music_divisions (ev_state));
+
 			if (new_view != 0) {
 				new_views.push_back (new_view);
 			}
@@ -1512,7 +1514,8 @@ void
 RegionMoveDrag::finished_no_copy (
 	bool const changed_position,
 	bool const changed_tracks,
-	framecnt_t const drag_delta
+	framecnt_t const drag_delta,
+	int32_t const ev_state
 	)
 {
 	RegionSelection new_views;
@@ -1573,7 +1576,8 @@ RegionMoveDrag::finished_no_copy (
 			/* insert into new playlist */
 
 			RegionView* new_view = insert_region_into_playlist (
-				RegionFactory::create (rv->region (), true), dest_rtv, dest_layer, where, modified_playlists
+				RegionFactory::create (rv->region (), true), dest_rtv, dest_layer, where,
+				modified_playlists, _editor->get_grid_music_divisions (ev_state)
 				);
 
 			if (new_view == 0) {
@@ -1633,7 +1637,7 @@ RegionMoveDrag::finished_no_copy (
 				playlist->freeze ();
 			}
 
-			rv->region()->set_position (where);
+			rv->region()->set_position (where, _editor->get_grid_music_divisions (ev_state));
 			_editor->session()->add_command (new StatefulDiffCommand (rv->region()));
 		}
 
@@ -1736,7 +1740,8 @@ RegionMoveDrag::insert_region_into_playlist (
 	RouteTimeAxisView* dest_rtv,
 	layer_t dest_layer,
 	framecnt_t where,
-	PlaylistSet& modified_playlists
+	PlaylistSet& modified_playlists,
+	const int32_t sub_num
 	)
 {
 	boost::shared_ptr<Playlist> dest_playlist = dest_rtv->playlist ();
@@ -1753,8 +1758,7 @@ RegionMoveDrag::insert_region_into_playlist (
 	if (r.second) {
 		dest_playlist->clear_changes ();
 	}
-
-	dest_playlist->add_region (region, where);
+	dest_playlist->add_region (region, where, 1.0, false, sub_num);
 
 	if (dest_rtv->view()->layer_display() == Stacked || dest_rtv->view()->layer_display() == Expanded) {
 		dest_playlist->set_layer (region, dest_layer);
@@ -1878,7 +1882,7 @@ RegionInsertDrag::RegionInsertDrag (Editor* e, boost::shared_ptr<Region> r, Rout
 }
 
 void
-RegionInsertDrag::finished (GdkEvent *, bool)
+RegionInsertDrag::finished (GdkEvent * event, bool)
 {
 	int pos = _views.front().time_axis_view;
 	assert(pos >= 0 && pos < (int)_time_axis_views.size());
@@ -2305,7 +2309,7 @@ RegionCreateDrag::motion (GdkEvent* event, bool first_move)
 {
 	if (first_move) {
 		_editor->begin_reversible_command (_("create region"));
-		_region = add_midi_region (_view, false);
+		_region = add_midi_region (_view, false, _editor->get_grid_music_divisions (event->button.state));
 		_view->playlist()->freeze ();
 	} else {
 		if (_region) {
@@ -2322,16 +2326,16 @@ RegionCreateDrag::motion (GdkEvent* event, bool first_move)
 			*/
 
 			framecnt_t const len = (framecnt_t) fabs ((double)(f - grab_frame () - 1));
-			_region->set_length (len < 1 ? 1 : len);
+			_region->set_length (len < 1 ? 1 : len, _editor->get_grid_music_divisions (event->button.state));
 		}
 	}
 }
 
 void
-RegionCreateDrag::finished (GdkEvent*, bool movement_occurred)
+RegionCreateDrag::finished (GdkEvent* event, bool movement_occurred)
 {
 	if (!movement_occurred) {
-		add_midi_region (_view, true);
+		add_midi_region (_view, true, _editor->get_grid_music_divisions (event->button.state));
 	} else {
 		_view->playlist()->thaw ();
 		_editor->commit_reversible_command();
@@ -2852,7 +2856,6 @@ TrimDrag::motion (GdkEvent* event, bool first_move)
 
 		for (list<DraggingView>::const_iterator i = _views.begin(); i != _views.end(); ++i) {
 			RegionView* rv = i->view;
-			rv->enable_display (false);
 			rv->region()->playlist()->clear_owned_changes ();
 
 			if (_operation == StartTrim) {
@@ -2913,7 +2916,9 @@ TrimDrag::motion (GdkEvent* event, bool first_move)
 	switch (_operation) {
 	case StartTrim:
 		for (list<DraggingView>::iterator i = _views.begin(); i != _views.end(); ++i) {
-			bool changed = i->view->trim_front (i->initial_position + dt, non_overlap_trim);
+			bool changed = i->view->trim_front (i->initial_position + dt, non_overlap_trim
+							    , _editor->get_grid_music_divisions (event->button.state));
+
 			if (changed && _preserve_fade_anchor) {
 				AudioRegionView* arv = dynamic_cast<AudioRegionView*> (i->view);
 				if (arv) {
@@ -2931,7 +2936,7 @@ TrimDrag::motion (GdkEvent* event, bool first_move)
 
 	case EndTrim:
 		for (list<DraggingView>::iterator i = _views.begin(); i != _views.end(); ++i) {
-			bool changed = i->view->trim_end (i->initial_end + dt, non_overlap_trim);
+			bool changed = i->view->trim_end (i->initial_end + dt, non_overlap_trim, _editor->get_grid_music_divisions (event->button.state));
 			if (changed && _preserve_fade_anchor) {
 				AudioRegionView* arv = dynamic_cast<AudioRegionView*> (i->view);
 				if (arv) {
@@ -3116,13 +3121,17 @@ TrimDrag::setup_pointer_frame_offset ()
 }
 
 MeterMarkerDrag::MeterMarkerDrag (Editor* e, ArdourCanvas::Item* i, bool c)
-	: Drag (e, i),
-	  _copy (c)
+	: Drag (e, i)
+	, _copy (c)
+	, _old_snap_type (e->snap_type())
+	, _old_snap_mode (e->snap_mode())
 	, before_state (0)
 {
 	DEBUG_TRACE (DEBUG::Drags, "New MeterMarkerDrag\n");
 	_marker = reinterpret_cast<MeterMarker*> (_item->get_data ("marker"));
 	assert (_marker);
+	_real_section = &_marker->meter();
+
 }
 
 void
@@ -3141,22 +3150,8 @@ MeterMarkerDrag::setup_pointer_frame_offset ()
 void
 MeterMarkerDrag::motion (GdkEvent* event, bool first_move)
 {
-	if (!_marker->meter().movable()) {
-		return;
-	}
-
 	if (first_move) {
-
-		// create a dummy marker for visual representation of moving the
-		// section, because whether its a copy or not, we're going to
-		// leave or lose the original marker (leave if its a copy; lose if its
-		// not, because we'll remove it from the map).
-
-		MeterSection section (_marker->meter());
-
-		if (!section.movable()) {
-			return;
-		}
+		// create a dummy marker to catch events, then hide it.
 
 		char name[64];
 		snprintf (name, sizeof(name), "%g/%g", _marker->meter().divisions_per_bar(), _marker->meter().note_divisor ());
@@ -3171,20 +3166,54 @@ MeterMarkerDrag::motion (GdkEvent* event, bool first_move)
 
 		/* use the new marker for the grab */
 		swap_grab (&_marker->the_item(), 0, GDK_CURRENT_TIME);
+		_marker->hide();
+
+		TempoMap& map (_editor->session()->tempo_map());
+		/* get current state */
+		before_state = &map.get_state();
 
 		if (!_copy) {
-			TempoMap& map (_editor->session()->tempo_map());
-			/* get current state */
-			before_state = &map.get_state();
-			/* remove the section while we drag it */
-			map.remove_meter (section, true);
+			_editor->begin_reversible_command (_("move meter mark"));
+		} else {
+			_editor->begin_reversible_command (_("copy meter mark"));
+
+			Timecode::BBT_Time bbt = _real_section->bbt();
+
+			/* we can't add a meter where one currently exists */
+			if (_real_section->frame() < adjusted_current_frame (event, false)) {
+				++bbt.bars;
+			} else {
+				--bbt.bars;
+			}
+			const double beat = map.beat_at_bbt (bbt);
+			_real_section = map.add_meter (Meter (_marker->meter().divisions_per_bar(), _marker->meter().note_divisor())
+						       , beat, bbt, map.frame_at_bbt (bbt), _real_section->position_lock_style());
+			if (!_real_section) {
+				aborted (true);
+				return;
+			}
+
+		}
+		/* only snap to bars. leave snap mode alone for audio locked meters.*/
+		if (_real_section->position_lock_style() != AudioTime) {
+			_editor->set_snap_to (SnapToBar);
+			_editor->set_snap_mode (SnapNormal);
 		}
 	}
 
-	framepos_t const pf = adjusted_current_frame (event);
+	framepos_t pf = adjusted_current_frame (event);
 
-	_marker->set_position (pf);
-	show_verbose_cursor_time (pf);
+	if (_real_section->position_lock_style() == AudioTime && _editor->snap_musical()) {
+		/* never snap to music for audio locked */
+		pf = adjusted_current_frame (event, false);
+	}
+
+	_editor->session()->tempo_map().gui_move_meter (_real_section, pf);
+
+	/* fake marker meeds to stay under the mouse, unlike the real one. */
+	_marker->set_position (adjusted_current_frame (event, false));
+
+	show_verbose_cursor_time (_real_section->frame());
 }
 
 void
@@ -3197,35 +3226,15 @@ MeterMarkerDrag::finished (GdkEvent* event, bool movement_occurred)
 		return;
 	}
 
-	if (!_marker->meter().movable()) {
-		return;
-	}
-
-	motion (event, false);
-
-	Timecode::BBT_Time when;
+	/* reinstate old snap setting */
+	_editor->set_snap_to (_old_snap_type);
+	_editor->set_snap_mode (_old_snap_mode);
 
 	TempoMap& map (_editor->session()->tempo_map());
-	map.bbt_time (_marker->position(), when);
-
-	if (_copy == true) {
-		_editor->begin_reversible_command (_("copy meter mark"));
-		XMLNode &before = map.get_state();
-		map.add_meter (_marker->meter(), when);
-		XMLNode &after = map.get_state();
-		_editor->session()->add_command(new MementoCommand<TempoMap>(map, &before, &after));
-		_editor->commit_reversible_command ();
 
-	} else {
-		_editor->begin_reversible_command (_("move meter mark"));
-
-		/* we removed it before, so add it back now */
-
-		map.add_meter (_marker->meter(), when);
-		XMLNode &after = map.get_state();
-		_editor->session()->add_command(new MementoCommand<TempoMap>(map, before_state, &after));
-		_editor->commit_reversible_command ();
-	}
+	XMLNode &after = map.get_state();
+	_editor->session()->add_command(new MementoCommand<TempoMap>(map, before_state, &after));
+	_editor->commit_reversible_command ();
 
 	// delete the dummy marker we used for visual representation while moving.
 	// a new visual marker will show up automatically.
@@ -3236,11 +3245,12 @@ void
 MeterMarkerDrag::aborted (bool moved)
 {
 	_marker->set_position (_marker->meter().frame ());
-
 	if (moved) {
-		TempoMap& map (_editor->session()->tempo_map());
-		/* we removed it before, so add it back now */
-		map.add_meter (_marker->meter(), _marker->meter().frame());
+		/* reinstate old snap setting */
+		_editor->set_snap_to (_old_snap_type);
+		_editor->set_snap_mode (_old_snap_mode);
+
+		_editor->session()->tempo_map().set_state (*before_state, Stateful::current_state_version);
 		// delete the dummy marker we used for visual representation while moving.
 		// a new visual marker will show up automatically.
 		delete _marker;
@@ -3255,6 +3265,8 @@ TempoMarkerDrag::TempoMarkerDrag (Editor* e, ArdourCanvas::Item* i, bool c)
 	DEBUG_TRACE (DEBUG::Drags, "New TempoMarkerDrag\n");
 
 	_marker = reinterpret_cast<TempoMarker*> (_item->get_data ("marker"));
+	_real_section = &_marker->tempo();
+	_movable = _real_section->movable();
 	assert (_marker);
 }
 
@@ -3262,31 +3274,29 @@ void
 TempoMarkerDrag::start_grab (GdkEvent* event, Gdk::Cursor* cursor)
 {
 	Drag::start_grab (event, cursor);
-	show_verbose_cursor_time (adjusted_current_frame (event));
+	if (!_real_section->active()) {
+		show_verbose_cursor_text (_("inactive"));
+	} else {
+		show_verbose_cursor_time (adjusted_current_frame (event));
+	}
 }
 
 void
 TempoMarkerDrag::setup_pointer_frame_offset ()
 {
-	_pointer_frame_offset = raw_grab_frame() - _marker->tempo().frame();
+	_pointer_frame_offset = raw_grab_frame() - _real_section->frame();
 }
 
 void
 TempoMarkerDrag::motion (GdkEvent* event, bool first_move)
 {
-	if (!_marker->tempo().movable()) {
+	if (!_real_section->active()) {
 		return;
 	}
 
 	if (first_move) {
 
-		// create a dummy marker for visual representation of moving the
-		// section, because whether its a copy or not, we're going to
-		// leave or lose the original marker (leave if its a copy; lose if its
-		// not, because we'll remove it from the map).
-
-		// create a dummy marker for visual representation of moving the copy.
-		// The actual copying is not done before we reach the finish callback.
+		// mvc drag - create a dummy marker to catch events, hide it.
 
 		char name[64];
 		snprintf (name, sizeof (name), "%.2f", _marker->tempo().beats_per_minute());
@@ -3303,25 +3313,65 @@ TempoMarkerDrag::motion (GdkEvent* event, bool first_move)
 
 		/* use the new marker for the grab */
 		swap_grab (&_marker->the_item(), 0, GDK_CURRENT_TIME);
+		_marker->hide();
+
+		TempoMap& map (_editor->session()->tempo_map());
+		/* get current state */
+		before_state = &map.get_state();
 
 		if (!_copy) {
 			_editor->begin_reversible_command (_("move tempo mark"));
-			TempoMap& map (_editor->session()->tempo_map());
-			/* get current state */
-			before_state = &map.get_state();
-			/* remove the section while we drag it */
-			map.remove_tempo (section, true);
+
+		} else {
+			const Tempo tempo (_marker->tempo());
+			const framepos_t frame = adjusted_current_frame (event) + 1;
+			const TempoSection::Type type = _real_section->type();
+
+			_editor->begin_reversible_command (_("copy tempo mark"));
+
+			if (_real_section->position_lock_style() == MusicTime) {
+				_real_section = map.add_tempo (tempo, map.pulse_at_frame (frame), 0, type, MusicTime);
+			} else {
+				_real_section = map.add_tempo (tempo, 0.0, frame, type, AudioTime);
+			}
+
+			if (!_real_section) {
+				aborted (true);
+				return;
+			}
 		}
+
 	}
 
-	framepos_t const pf = adjusted_current_frame (event);
-	_marker->set_position (pf);
-	show_verbose_cursor_time (pf);
+	if (Keyboard::modifier_state_contains (event->button.state, ArdourKeyboard::constraint_modifier ())) {
+		/* use vertical movement to alter tempo .. should be log */
+		double new_bpm = _real_section->beats_per_minute() + ((last_pointer_y() - current_pointer_y()) / 5.0);
+		stringstream strs;
+
+		_editor->session()->tempo_map().gui_change_tempo (_real_section, Tempo (new_bpm, _real_section->note_type()));
+		strs << new_bpm;
+		show_verbose_cursor_text (strs.str());
+
+	} else if (_movable && !_real_section->locked_to_meter()) {
+		const framepos_t pf = adjusted_current_frame (event);
+		TempoMap& map (_editor->session()->tempo_map());
+
+		/* snap to beat is 1, snap to bar is -1 (sorry) */
+		int sub_num = _editor->get_grid_music_divisions (event->button.state);
+
+		map.gui_move_tempo (_real_section, pf, sub_num);
+
+		show_verbose_cursor_time (_real_section->frame());
+	}
+	_marker->set_position (adjusted_current_frame (event, false));
 }
 
 void
 TempoMarkerDrag::finished (GdkEvent* event, bool movement_occurred)
 {
+	if (!_real_section->active()) {
+		return;
+	}
 	if (!movement_occurred) {
 		if (was_double_click()) {
 			_editor->edit_tempo_marker (*_marker);
@@ -3329,33 +3379,11 @@ TempoMarkerDrag::finished (GdkEvent* event, bool movement_occurred)
 		return;
 	}
 
-	if (!_marker->tempo().movable()) {
-		return;
-	}
-
-	motion (event, false);
-
 	TempoMap& map (_editor->session()->tempo_map());
-	framepos_t beat_time = map.round_to_beat (_marker->position(), RoundNearest);
-	Timecode::BBT_Time when;
-
-	map.bbt_time (beat_time, when);
 
-	if (_copy == true) {
-		_editor->begin_reversible_command (_("copy tempo mark"));
-		XMLNode &before = map.get_state();
-		map.add_tempo (_marker->tempo(), when);
-		XMLNode &after = map.get_state();
-		_editor->session()->add_command (new MementoCommand<TempoMap>(map, &before, &after));
-		_editor->commit_reversible_command ();
-
-	} else {
-		/* we removed it before, so add it back now */
-		map.add_tempo (_marker->tempo(), when);
-		XMLNode &after = map.get_state();
-		_editor->session()->add_command (new MementoCommand<TempoMap>(map, before_state, &after));
-		_editor->commit_reversible_command ();
-	}
+	XMLNode &after = map.get_state();
+	_editor->session()->add_command (new MementoCommand<TempoMap>(map, before_state, &after));
+	_editor->commit_reversible_command ();
 
 	// delete the dummy marker we used for visual representation while moving.
 	// a new visual marker will show up automatically.
@@ -3368,14 +3396,112 @@ TempoMarkerDrag::aborted (bool moved)
 	_marker->set_position (_marker->tempo().frame());
 	if (moved) {
 		TempoMap& map (_editor->session()->tempo_map());
-		/* we removed it before, so add it back now */
-		map.add_tempo (_marker->tempo(), _marker->tempo().start());
-		// delete the dummy marker we used for visual representation while moving.
-		// a new visual marker will show up automatically.
+		map.set_state (*before_state, Stateful::current_state_version);
+		// delete the dummy (hidden) marker we used for events while moving.
 		delete _marker;
 	}
 }
 
+BBTRulerDrag::BBTRulerDrag (Editor* e, ArdourCanvas::Item* i)
+	: Drag (e, i)
+	, _pulse (0.0)
+	, _tempo (0)
+	, before_state (0)
+{
+	DEBUG_TRACE (DEBUG::Drags, "New BBTRulerDrag\n");
+
+}
+
+void
+BBTRulerDrag::start_grab (GdkEvent* event, Gdk::Cursor* cursor)
+{
+	Drag::start_grab (event, cursor);
+	TempoMap& map (_editor->session()->tempo_map());
+	_tempo = const_cast<TempoSection*> (&map.tempo_section_at_frame (raw_grab_frame()));
+	ostringstream sstr;
+
+	sstr << "^" << fixed << setprecision(3) << map.tempo_at_frame (adjusted_current_frame (event)).beats_per_minute() << "\n";
+	sstr << "<" << fixed << setprecision(3) << _tempo->beats_per_minute();
+	show_verbose_cursor_text (sstr.str());
+	finished (event, false);
+}
+
+void
+BBTRulerDrag::setup_pointer_frame_offset ()
+{
+	TempoMap& map (_editor->session()->tempo_map());
+	const double beat_at_frame = map.beat_at_frame (raw_grab_frame());
+	const uint32_t divisions = _editor->get_grid_beat_divisions (0);
+	double beat = 0.0;
+
+	if (divisions > 0) {
+		beat = floor (beat_at_frame) + (floor (((beat_at_frame - floor (beat_at_frame)) * divisions)) / divisions);
+	} else {
+		/* while it makes some sense for the user to determine the division to 'grab',
+		   grabbing a bar often leads to confusing results wrt the actual tempo section being altered
+		   and the result over steep tempo curves. Use sixteenths.
+		*/
+		beat = floor (beat_at_frame) + (floor (((beat_at_frame - floor (beat_at_frame)) * 4)) / 4);
+	}
+
+	_pulse = map.pulse_at_beat (beat);
+
+	_pointer_frame_offset = raw_grab_frame() - map.frame_at_pulse (_pulse);
+
+}
+
+void
+BBTRulerDrag::motion (GdkEvent* event, bool first_move)
+{
+	TempoMap& map (_editor->session()->tempo_map());
+
+	if (first_move) {
+		/* get current state */
+		before_state = &map.get_state();
+		_editor->begin_reversible_command (_("dilate tempo"));
+	}
+
+	framepos_t pf;
+
+	if (_editor->snap_musical()) {
+		pf = adjusted_current_frame (event, false);
+	} else {
+		pf = adjusted_current_frame (event);
+	}
+
+	if (Keyboard::modifier_state_contains (event->button.state, ArdourKeyboard::constraint_modifier())) {
+		/* adjust previous tempo to match pointer frame */
+		_editor->session()->tempo_map().gui_dilate_tempo (_tempo, map.frame_at_pulse (_pulse), pf, _pulse);
+	}
+	ostringstream sstr;
+	sstr << "^" << fixed << setprecision(3) << map.tempo_at_frame (pf).beats_per_minute() << "\n";
+	sstr << "<" << fixed << setprecision(3) << _tempo->beats_per_minute();
+	show_verbose_cursor_text (sstr.str());
+}
+
+void
+BBTRulerDrag::finished (GdkEvent* event, bool movement_occurred)
+{
+	if (!movement_occurred) {
+		return;
+	}
+
+	TempoMap& map (_editor->session()->tempo_map());
+
+	XMLNode &after = map.get_state();
+	_editor->session()->add_command(new MementoCommand<TempoMap>(map, before_state, &after));
+	_editor->commit_reversible_command ();
+}
+
+void
+BBTRulerDrag::aborted (bool moved)
+{
+	if (moved) {
+		_editor->session()->tempo_map().set_state (*before_state, Stateful::current_state_version);
+	}
+}
+
+
 CursorDrag::CursorDrag (Editor* e, EditorCursor& c, bool s)
 	: Drag (e, &c.track_canvas_item(), false)
 	, _cursor (c)
@@ -3762,12 +3888,14 @@ MarkerDrag::MarkerDrag (Editor* e, ArdourCanvas::Item* i)
 	, _selection_changed (false)
 {
 	DEBUG_TRACE (DEBUG::Drags, "New MarkerDrag\n");
-
+	Gtk::Window* toplevel = _editor->current_toplevel();
 	_marker = reinterpret_cast<ArdourMarker*> (_item->get_data ("marker"));
+
 	assert (_marker);
 
 	_points.push_back (ArdourCanvas::Duple (0, 0));
-	_points.push_back (ArdourCanvas::Duple (0, physical_screen_height (_editor->get_window())));
+
+	_points.push_back (ArdourCanvas::Duple (0, toplevel ? physical_screen_height (toplevel->get_window()) : 900));
 }
 
 MarkerDrag::~MarkerDrag ()
@@ -3998,7 +4126,7 @@ MarkerDrag::motion (GdkEvent* event, bool)
 				if (move_both || (*x).move_both) {
 					copy_location->set_start (new_start);
 					copy_location->set_end (new_end);
-				} else 	if (new_start < copy_location->end()) {
+				} else	if (new_start < copy_location->end()) {
 					copy_location->set_start (new_start);
 				} else if (newframe > 0) {
 					//_editor->snap_to (next, RoundUpAlways, true);
@@ -4115,6 +4243,10 @@ MarkerDrag::finished (GdkEvent* event, bool movement_occurred)
 			} else {
 				location->set (((*x).location)->start(), ((*x).location)->end());
 			}
+
+			if (location->is_session_range()) {
+				_editor->session()->set_end_is_free (false);
+			}
 		}
 	}
 
@@ -4126,9 +4258,9 @@ MarkerDrag::finished (GdkEvent* event, bool movement_occurred)
 }
 
 void
-MarkerDrag::aborted (bool movement_occured)
+MarkerDrag::aborted (bool movement_occurred)
 {
-	if (!movement_occured) {
+	if (!movement_occurred) {
 		return;
 	}
 
@@ -4382,9 +4514,9 @@ LineDrag::motion (GdkEvent* event, bool first_move)
 }
 
 void
-LineDrag::finished (GdkEvent* event, bool movement_occured)
+LineDrag::finished (GdkEvent* event, bool movement_occurred)
 {
-	if (movement_occured) {
+	if (movement_occurred) {
 		motion (event, false);
 		_line->end_drag (false, 0);
 		_editor->commit_reversible_command ();
@@ -4646,7 +4778,7 @@ RubberbandSelectDrag::finished (GdkEvent* event, bool movement_occurred)
 			/* MIDI track */
 			if (_editor->selection->empty() && _editor->mouse_mode == MouseDraw) {
 				/* nothing selected */
-				add_midi_region (mtv, true);
+				add_midi_region (mtv, true, _editor->get_grid_music_divisions(event->button.state));
 				do_deselect = false;
 			}
 		}
@@ -4714,31 +4846,37 @@ TimeFXDrag::motion (GdkEvent* event, bool)
 void
 TimeFXDrag::finished (GdkEvent* event, bool movement_occurred)
 {
-	if (!movement_occurred) {
-		return;
-	}
+	/* this may have been a single click, no drag. We still want the dialog
+	   to show up in that case, so that the user can manually edit the
+	   parameters for the timestretch.
+	*/
 
-	motion (event, false);
+	float fraction = 1.0;
 
-	_primary->get_time_axis_view().hide_timestretch ();
+	if (movement_occurred) {
 
-	framepos_t adjusted_frame_pos = adjusted_current_frame (event);
+		motion (event, false);
 
-	if (adjusted_frame_pos < _primary->region()->position()) {
-		/* backwards drag of the left edge - not usable */
-		return;
-	}
+		_primary->get_time_axis_view().hide_timestretch ();
 
-	framecnt_t newlen = adjusted_frame_pos - _primary->region()->position();
+		framepos_t adjusted_frame_pos = adjusted_current_frame (event);
 
-	float percentage = (double) newlen / (double) _primary->region()->length();
+		if (adjusted_frame_pos < _primary->region()->position()) {
+			/* backwards drag of the left edge - not usable */
+			return;
+		}
+
+		framecnt_t newlen = adjusted_frame_pos - _primary->region()->position();
+
+		fraction = (double) newlen / (double) _primary->region()->length();
 
 #ifndef USE_RUBBERBAND
-	// Soundtouch uses percentage / 100 instead of normal (/ 1)
-	if (_primary->region()->data_type() == DataType::AUDIO) {
-		percentage = (float) ((double) newlen - (double) _primary->region()->length()) / ((double) newlen) * 100.0f;
-	}
+		// Soundtouch uses fraction / 100 instead of normal (/ 1)
+		if (_primary->region()->data_type() == DataType::AUDIO) {
+			fraction = (float) ((double) newlen - (double) _primary->region()->length()) / ((double) newlen) * 100.0f;
+		}
 #endif
+	}
 
 	if (!_editor->get_selection().regions.empty()) {
 		/* primary will already be included in the selection, and edit
@@ -4747,7 +4885,7 @@ TimeFXDrag::finished (GdkEvent* event, bool movement_occurred)
 		   selection.
 		*/
 
-		if (_editor->time_stretch (_editor->get_selection().regions, percentage) == -1) {
+		if (_editor->time_stretch (_editor->get_selection().regions, fraction) == -1) {
 			error << _("An error occurred while executing time stretch operation") << endmsg;
 		}
 	}
@@ -4967,7 +5105,7 @@ SelectionDrag::motion (GdkEvent* event, bool first_move)
 			TrackViewList grouped_add = new_selection;
 			for (TrackViewList::const_iterator i = new_selection.begin(); i != new_selection.end(); ++i) {
 				RouteTimeAxisView *n = dynamic_cast<RouteTimeAxisView *>(*i);
-				if ( n && n->route()->route_group() && n->route()->route_group()->is_active() && n->route()->route_group()->enabled_property (ARDOUR::Properties::select.property_id) ) {
+				if ( n && n->route()->route_group() && n->route()->route_group()->is_active() && n->route()->route_group()->enabled_property (ARDOUR::Properties::group_select.property_id) ) {
 					for (TrackViewList::const_iterator j = all_tracks.begin(); j != all_tracks.end(); ++j) {
 						RouteTimeAxisView *check = dynamic_cast<RouteTimeAxisView *>(*j);
 						if ( check && (n != check) && (check->route()->route_group() == n->route()->route_group()) )
@@ -5139,7 +5277,7 @@ RangeMarkerBarDrag::RangeMarkerBarDrag (Editor* e, ArdourCanvas::Item* i, Operat
 
 	_drag_rect = new ArdourCanvas::Rectangle (_editor->time_line_group,
 						  ArdourCanvas::Rect (0.0, 0.0, 0.0,
-								      physical_screen_height (_editor->get_window())));
+						                      physical_screen_height (_editor->current_toplevel()->get_window())));
 	_drag_rect->hide ();
 
 	_drag_rect->set_fill_color (UIConfiguration::instance().color ("range drag rect"));
@@ -5361,9 +5499,9 @@ RangeMarkerBarDrag::finished (GdkEvent* event, bool movement_occurred)
 }
 
 void
-RangeMarkerBarDrag::aborted (bool movement_occured)
+RangeMarkerBarDrag::aborted (bool movement_occurred)
 {
-	if (movement_occured) {
+	if (movement_occurred) {
 		_drag_rect->hide ();
 	}
 }
@@ -5875,6 +6013,9 @@ void
 PatchChangeDrag::finished (GdkEvent* ev, bool movement_occurred)
 {
 	if (!movement_occurred) {
+		if (was_double_click()) {
+			_region_view->edit_patch_change (_patch_change);
+		}
 		return;
 	}
 
@@ -6209,7 +6350,7 @@ RegionCutDrag::motion (GdkEvent*, bool)
 }
 
 void
-RegionCutDrag::finished (GdkEvent*, bool)
+RegionCutDrag::finished (GdkEvent* event, bool)
 {
 	_editor->get_track_canvas()->canvas()->re_enter();
 
@@ -6223,7 +6364,7 @@ RegionCutDrag::finished (GdkEvent*, bool)
 		return;
 	}
 
-	_editor->split_regions_at (pos, rs);
+	_editor->split_regions_at (pos, rs, _editor->get_grid_music_divisions (event->button.state));
 }
 
 void
diff --git a/gtk2_ardour/editor_drag.h b/gtk2_ardour/editor_drag.h
index cd1b0c2..cc0e9d9 100644
--- a/gtk2_ardour/editor_drag.h
+++ b/gtk2_ardour/editor_drag.h
@@ -25,6 +25,7 @@
 #include <gdk/gdk.h>
 #include <stdint.h>
 
+#include "ardour/tempo.h"
 #include "ardour/types.h"
 
 #include "canvas/types.h"
@@ -36,6 +37,7 @@
 
 namespace ARDOUR {
 	class Location;
+	class TempoSection;
 }
 
 namespace ArdourCanvas {
@@ -246,7 +248,7 @@ protected:
 	/* sets snap delta from unsnapped pos */
 	void setup_snap_delta (framepos_t pos);
 
-	boost::shared_ptr<ARDOUR::Region> add_midi_region (MidiTimeAxisView*, bool commit);
+	boost::shared_ptr<ARDOUR::Region> add_midi_region (MidiTimeAxisView*, bool commit, const int32_t sub_num);
 
 	void show_verbose_cursor_time (framepos_t);
 	void show_verbose_cursor_duration (framepos_t, framepos_t, double xoffset = 0);
@@ -405,13 +407,15 @@ private:
 	void finished_no_copy (
 		bool const,
 		bool const,
-		ARDOUR::framecnt_t const
+		ARDOUR::framecnt_t const,
+		int32_t const ev_state
 		);
 
 	void finished_copy (
 		bool const,
 		bool const,
-		ARDOUR::framecnt_t const
+		ARDOUR::framecnt_t const,
+		int32_t const ev_state
 		);
 
 	RegionView* insert_region_into_playlist (
@@ -419,7 +423,8 @@ private:
 		RouteTimeAxisView*,
 		ARDOUR::layer_t,
 		ARDOUR::framecnt_t,
-		PlaylistSet&
+		PlaylistSet&,
+		const int32_t sub_num
 		);
 
 	void remove_region_from_playlist (
@@ -704,7 +709,11 @@ public:
 
 private:
 	MeterMarker* _marker;
+	ARDOUR::MeterSection* _real_section;
+
 	bool _copy;
+	Editing::SnapType _old_snap_type;
+	Editing::SnapMode _old_snap_mode;
 	XMLNode* before_state;
 };
 
@@ -724,17 +733,46 @@ public:
 	}
 
 	bool y_movement_matters () const {
-		return false;
+		return true;
 	}
 
 	void setup_pointer_frame_offset ();
 
 private:
 	TempoMarker* _marker;
+	ARDOUR::TempoSection* _real_section;
+
 	bool _copy;
+	bool _movable;
 	XMLNode* before_state;
 };
 
+/** BBT Ruler drag */
+class BBTRulerDrag : public Drag
+{
+public:
+	BBTRulerDrag (Editor *, ArdourCanvas::Item *);
+
+	void start_grab (GdkEvent *, Gdk::Cursor* c = 0);
+	void motion (GdkEvent *, bool);
+	void finished (GdkEvent *, bool);
+	void aborted (bool);
+
+	bool allow_vertical_autoscroll () const {
+		return false;
+	}
+
+	bool y_movement_matters () const {
+		return false;
+	}
+
+	void setup_pointer_frame_offset ();
+
+private:
+	double _pulse;
+	ARDOUR::TempoSection* _tempo;
+	XMLNode* before_state;
+};
 
 /** Drag of the playhead cursor */
 class CursorDrag : public Drag
diff --git a/gtk2_ardour/editor_export_audio.cc b/gtk2_ardour/editor_export_audio.cc
index 2bd607f..c1def2b 100644
--- a/gtk2_ardour/editor_export_audio.cc
+++ b/gtk2_ardour/editor_export_audio.cc
@@ -53,7 +53,7 @@
 #include "time_axis_view.h"
 #include "utils.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
@@ -125,9 +125,7 @@ Editor::process_midi_export_dialog (MidiExportDialog& dialog, boost::shared_ptr<
 		::g_unlink (path.c_str());
 	}
 
-	(void) midi_region->clone (path);
-
-	return true;
+	return midi_region->do_export (path);
 }
 
 /** Export the first selected region */
diff --git a/gtk2_ardour/editor_group_tabs.cc b/gtk2_ardour/editor_group_tabs.cc
index 48fe9e2..04f8854 100644
--- a/gtk2_ardour/editor_group_tabs.cc
+++ b/gtk2_ardour/editor_group_tabs.cc
@@ -32,7 +32,7 @@
 #include "ui_config.h"
 #include "utils.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
@@ -192,8 +192,3 @@ EditorGroupTabs::selected_routes () const
 	return rl;
 }
 
-void
-EditorGroupTabs::sync_order_keys ()
-{
-	_editor->_routes->sync_order_keys_from_treeview ();
-}
diff --git a/gtk2_ardour/editor_group_tabs.h b/gtk2_ardour/editor_group_tabs.h
index 7377911..61e0ecf 100644
--- a/gtk2_ardour/editor_group_tabs.h
+++ b/gtk2_ardour/editor_group_tabs.h
@@ -37,5 +37,4 @@ private:
 	}
 	void add_menu_items (Gtk::Menu *, ARDOUR::RouteGroup *);
 	ARDOUR::RouteList selected_routes () const;
-	void sync_order_keys ();
 };
diff --git a/gtk2_ardour/editor_items.h b/gtk2_ardour/editor_items.h
index 743a93b..79a94df 100644
--- a/gtk2_ardour/editor_items.h
+++ b/gtk2_ardour/editor_items.h
@@ -36,6 +36,7 @@ enum ItemType {
 	GainLineItem,
 	AutomationLineItem,
 	MeterMarkerItem,
+	TempoCurveItem,
 	TempoMarkerItem,
 	MeterBarItem,
 	TempoBarItem,
diff --git a/gtk2_ardour/editor_keys.cc b/gtk2_ardour/editor_keys.cc
index 8b1e46e..e1562db 100644
--- a/gtk2_ardour/editor_keys.cc
+++ b/gtk2_ardour/editor_keys.cc
@@ -32,7 +32,7 @@
 #include "selection.h"
 #include "time_axis_view.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 using namespace PBD;
@@ -105,5 +105,5 @@ Editor::keyboard_selection_begin (Editing::EditIgnoreOption ign)
 void
 Editor::keyboard_paste ()
 {
-	paste (1);
+	paste (1, false);
 }
diff --git a/gtk2_ardour/editor_locations.cc b/gtk2_ardour/editor_locations.cc
index 03509ac..0c0066c 100644
--- a/gtk2_ardour/editor_locations.cc
+++ b/gtk2_ardour/editor_locations.cc
@@ -20,7 +20,7 @@
 #include "editor_locations.h"
 #include "location_ui.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 using namespace Gtk;
diff --git a/gtk2_ardour/editor_markers.cc b/gtk2_ardour/editor_markers.cc
index 201631e..d204049 100644
--- a/gtk2_ardour/editor_markers.cc
+++ b/gtk2_ardour/editor_markers.cc
@@ -40,7 +40,7 @@
 #include "prompter.h"
 #include "editor_drag.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
@@ -808,15 +808,20 @@ Editor::tempo_or_meter_marker_context_menu (GdkEventButton* ev, ArdourCanvas::It
 
 	if (mm) {
 		can_remove = mm->meter().movable ();
+		delete meter_marker_menu;
+		build_meter_marker_menu (mm, can_remove);
+		meter_marker_menu->popup (1, ev->time);
 	} else if (tm) {
-		can_remove = tm->tempo().movable ();
+		if (!tm->tempo().active()) {
+			return;
+		}
+		can_remove = tm->tempo().movable() && !tm->tempo().locked_to_meter();
+		delete tempo_marker_menu;
+		build_tempo_marker_menu (tm, can_remove);
+		tempo_marker_menu->popup (1, ev->time);
 	} else {
 		return;
 	}
-
-	delete tempo_or_meter_marker_menu;
-	build_tempo_or_meter_marker_menu (can_remove);
-	tempo_or_meter_marker_menu->popup (1, ev->time);
 }
 
 void
@@ -943,9 +948,7 @@ Editor::build_range_marker_menu (bool loop_or_punch, bool session)
 	items.push_back (MenuElem (_("Loop Range"), sigc::mem_fun(*this, &Editor::marker_menu_loop_range)));
 
 	items.push_back (MenuElem (_("Set Marker from Playhead"), sigc::mem_fun(*this, &Editor::marker_menu_set_from_playhead)));
-	if (!Profile->get_sae()) {
-		items.push_back (MenuElem (_("Set Range from Selection"), sigc::bind (sigc::mem_fun(*this, &Editor::marker_menu_set_from_selection), false)));
-	}
+	items.push_back (MenuElem (_("Set Range from Selection"), sigc::bind (sigc::mem_fun(*this, &Editor::marker_menu_set_from_selection), false)));
 
 	items.push_back (MenuElem (_("Zoom to Range"), sigc::mem_fun (*this, &Editor::marker_menu_zoom_to_range)));
 
@@ -968,19 +971,49 @@ Editor::build_range_marker_menu (bool loop_or_punch, bool session)
 
 	items.push_back (MenuElem (_("Separate Regions in Range"), sigc::mem_fun(*this, &Editor::marker_menu_separate_regions_using_location)));
 	items.push_back (MenuElem (_("Select All in Range"), sigc::mem_fun(*this, &Editor::marker_menu_select_all_selectables_using_range)));
-	if (!Profile->get_sae()) {
-		items.push_back (MenuElem (_("Select Range"), sigc::mem_fun(*this, &Editor::marker_menu_select_using_range)));
+	items.push_back (MenuElem (_("Select Range"), sigc::mem_fun(*this, &Editor::marker_menu_select_using_range)));
+}
+
+void
+Editor::build_tempo_marker_menu (TempoMarker* loc, bool can_remove)
+{
+	using namespace Menu_Helpers;
+
+	tempo_marker_menu = new Menu;
+	MenuList& items = tempo_marker_menu->items();
+	tempo_marker_menu->set_name ("ArdourContextMenu");
+
+	if (loc->tempo().type() == TempoSection::Constant) {
+		items.push_back (MenuElem (_("Make Ramped"), sigc::mem_fun(*this, &Editor::toggle_tempo_type)));
+	} else {
+		items.push_back (MenuElem (_("Make Constant"), sigc::mem_fun(*this, &Editor::toggle_tempo_type)));
+	}
+
+	if (loc->tempo().position_lock_style() == AudioTime && can_remove) {
+		items.push_back (MenuElem (_("Lock to Music"), sigc::mem_fun(*this, &Editor::toggle_marker_lock_style)));
+	} else if (can_remove) {
+		items.push_back (MenuElem (_("Lock to Audio"), sigc::mem_fun(*this, &Editor::toggle_marker_lock_style)));
 	}
+
+	items.push_back (MenuElem (_("Edit..."), sigc::mem_fun(*this, &Editor::marker_menu_edit)));
+	items.push_back (MenuElem (_("Remove"), sigc::mem_fun(*this, &Editor::marker_menu_remove)));
+	items.back().set_sensitive (can_remove);
 }
 
 void
-Editor::build_tempo_or_meter_marker_menu (bool can_remove)
+Editor::build_meter_marker_menu (MeterMarker* loc, bool can_remove)
 {
 	using namespace Menu_Helpers;
 
-	tempo_or_meter_marker_menu = new Menu;
-	MenuList& items = tempo_or_meter_marker_menu->items();
-	tempo_or_meter_marker_menu->set_name ("ArdourContextMenu");
+	meter_marker_menu = new Menu;
+	MenuList& items = meter_marker_menu->items();
+	meter_marker_menu->set_name ("ArdourContextMenu");
+
+	if (loc->meter().position_lock_style() == AudioTime && can_remove) {
+		items.push_back (MenuElem (_("Lock to Music"), sigc::mem_fun(*this, &Editor::toggle_marker_lock_style)));
+	} else if (can_remove) {
+		items.push_back (MenuElem (_("Lock to Audio"), sigc::mem_fun(*this, &Editor::toggle_marker_lock_style)));
+	}
 
 	items.push_back (MenuElem (_("Edit..."), sigc::mem_fun(*this, &Editor::marker_menu_edit)));
 	items.push_back (MenuElem (_("Remove"), sigc::mem_fun(*this, &Editor::marker_menu_remove)));
@@ -1348,6 +1381,75 @@ Editor::marker_menu_remove ()
 }
 
 void
+Editor::toggle_marker_lock_style ()
+{
+	MeterMarker* mm;
+	TempoMarker* tm;
+	dynamic_cast_marker_object (marker_menu_item->get_data ("marker"), &mm, &tm);
+
+	if (mm) {
+		begin_reversible_command (_("change meter lock style"));
+		XMLNode &before = _session->tempo_map().get_state();
+		MeterSection* msp = &mm->meter();
+
+		const Meter meter (msp->divisions_per_bar(), msp->note_divisor());
+		const Timecode::BBT_Time bbt (msp->bbt());
+		const framepos_t frame = msp->frame();
+		const PositionLockStyle pls = (msp->position_lock_style() == AudioTime) ? MusicTime : AudioTime;
+
+		_session->tempo_map().replace_meter (*msp, meter, bbt, frame, pls);
+
+		XMLNode &after = _session->tempo_map().get_state();
+		_session->add_command(new MementoCommand<TempoMap>(_session->tempo_map(), &before, &after));
+		commit_reversible_command ();
+	} else if (tm) {
+		TempoSection* tsp = &tm->tempo();
+
+		const Tempo tempo (tsp->beats_per_minute());
+		const double pulse = tsp->pulse();
+		const framepos_t frame = tsp->frame();
+		const TempoSection::Type type = tsp->type();
+		const PositionLockStyle pls = (tsp->position_lock_style() == AudioTime) ? MusicTime : AudioTime;
+
+		begin_reversible_command (_("change tempo lock style"));
+		XMLNode &before = _session->tempo_map().get_state();
+
+		_session->tempo_map().replace_tempo (*tsp, tempo, pulse, frame, type, pls);
+
+		XMLNode &after = _session->tempo_map().get_state();
+		_session->add_command(new MementoCommand<TempoMap>(_session->tempo_map(), &before, &after));
+		commit_reversible_command ();
+	}
+}
+
+void
+Editor::toggle_tempo_type ()
+{
+	TempoMarker* tm;
+	MeterMarker* mm;
+	dynamic_cast_marker_object (marker_menu_item->get_data ("marker"), &mm, &tm);
+
+	if (tm) {
+		TempoSection* tsp = &tm->tempo();
+
+		const Tempo tempo (tsp->beats_per_minute(), tsp->note_type());
+		const double pulse = tsp->pulse();
+		const framepos_t frame = tsp->frame();
+		const TempoSection::Type type = (tsp->type() == TempoSection::Ramp) ? TempoSection::Constant : TempoSection::Ramp;
+		const PositionLockStyle pls = tsp->position_lock_style();
+
+		begin_reversible_command (_("change tempo type"));
+		XMLNode &before = _session->tempo_map().get_state();
+
+		_session->tempo_map().replace_tempo (*tsp, tempo, pulse, frame, type, pls);
+
+		XMLNode &after = _session->tempo_map().get_state();
+		_session->add_command(new MementoCommand<TempoMap>(_session->tempo_map(), &before, &after));
+		commit_reversible_command ();
+	}
+}
+
+void
 Editor::toggle_marker_menu_lock ()
 {
 	ArdourMarker* marker;
diff --git a/gtk2_ardour/editor_mixer.cc b/gtk2_ardour/editor_mixer.cc
index 9769d61..0c03483 100644
--- a/gtk2_ardour/editor_mixer.cc
+++ b/gtk2_ardour/editor_mixer.cc
@@ -30,6 +30,8 @@
 
 #include "ardour/rc_configuration.h"
 
+#include "control_protocol/control_protocol.h"
+
 #include "actions.h"
 #include "ardour_ui.h"
 #include "audio_time_axis.h"
@@ -44,7 +46,7 @@
 #include "selection.h"
 #include "ui_config.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace Gtkmm2ext;
@@ -78,11 +80,16 @@ Editor::show_editor_mixer (bool yn)
 	show_editor_mixer_when_tracks_arrive = false;
 
 	if (yn) {
-		Glib::RefPtr<Gdk::Window> win = get_window ();
+		Gtk::Window* toplevel = current_toplevel();
+		Glib::RefPtr<Gdk::Window> win;
 		Glib::RefPtr<Gdk::Screen> screen;
 
+		if (toplevel) {
+			win = toplevel->get_window();
+		}
+
 		if (win) {
-			 screen = win->get_screen();
+			screen = win->get_screen();
 		} else {
 			screen = Gdk::Screen::get_default();
 		}
@@ -156,13 +163,13 @@ Editor::show_editor_mixer (bool yn)
 		}
 	}
 
-#ifdef GTKOSX
+#ifdef __APPLE__
 	/* XXX gtk problem here */
 	ensure_all_elements_drawn();
 #endif
 }
 
-#ifdef GTKOSX
+#ifdef __APPLE__
 void
 Editor::ensure_all_elements_drawn ()
 {
@@ -174,13 +181,11 @@ Editor::ensure_all_elements_drawn ()
 void
 Editor::create_editor_mixer ()
 {
-	current_mixer_strip = new MixerStrip (*ARDOUR_UI::instance()->the_mixer(),
-					      _session,
-					      false);
+	current_mixer_strip = new MixerStrip (*ARDOUR_UI::instance()->the_mixer(), _session, false);
 	current_mixer_strip->Hiding.connect (sigc::mem_fun(*this, &Editor::current_mixer_strip_hidden));
 	current_mixer_strip->WidthChanged.connect (sigc::mem_fun (*this, &Editor::mixer_strip_width_changed));
 
-#ifdef GTKOSX
+#ifdef __APPLE__
 	current_mixer_strip->WidthChanged.connect (sigc::mem_fun(*this, &Editor::ensure_all_elements_drawn));
 #endif
 	current_mixer_strip->set_embedded (true);
@@ -194,21 +199,6 @@ Editor::set_selected_mixer_strip (TimeAxisView& view)
 		return;
 	}
 
-	Glib::RefPtr<Gtk::Action> act = ActionManager::get_action (X_("Editor"), X_("show-editor-mixer"));
-
-	if (act) {
-		Glib::RefPtr<Gtk::ToggleAction> tact = Glib::RefPtr<Gtk::ToggleAction>::cast_dynamic(act);
-		if (!tact || !tact->get_active()) {
-			/* not showing mixer strip presently */
-			return;
-		}
-	}
-
-	if (current_mixer_strip == 0) {
-		create_editor_mixer ();
-	}
-
-
 	// if this is an automation track, then we shold the mixer strip should
 	// show the parent
 
@@ -237,6 +227,26 @@ Editor::set_selected_mixer_strip (TimeAxisView& view)
 		}
 	}
 
+	/* Typically this is set by changing the TAV selection but if for any
+	   reason we decide to show a different strip for some reason, make
+	   sure that control surfaces can find it.
+	*/
+	ARDOUR::ControlProtocol::set_first_selected_stripable (route);
+
+	Glib::RefPtr<Gtk::Action> act = ActionManager::get_action (X_("Editor"), X_("show-editor-mixer"));
+
+	if (act) {
+		Glib::RefPtr<Gtk::ToggleAction> tact = Glib::RefPtr<Gtk::ToggleAction>::cast_dynamic(act);
+		if (!tact || !tact->get_active()) {
+			/* not showing mixer strip presently */
+			return;
+		}
+	}
+
+	if (current_mixer_strip == 0) {
+		create_editor_mixer ();
+	}
+
 	if (current_mixer_strip->route() == route) {
 		return;
 	}
@@ -268,7 +278,7 @@ Editor::maybe_add_mixer_strip_width (XMLNode& node)
 void
 Editor::mixer_strip_width_changed ()
 {
-#ifdef GTKOSX
+#ifdef __APPLE__
 	ensure_all_elements_drawn ();
 #endif
 
@@ -291,12 +301,12 @@ Editor::follow_mixer_selection ()
 	_following_mixer_selection = true;
 	selection->block_tracks_changed (true);
 
-	RouteUISelection& s (Mixer_UI::instance()->selection().routes);
+	AxisViewSelection& s (Mixer_UI::instance()->selection().axes);
 
 	selection->clear_tracks ();
 
-	for (RouteUISelection::iterator i = s.begin(); i != s.end(); ++i) {
-		TimeAxisView* tav = get_route_view_by_route_id ((*i)->route()->id());
+	for (AxisViewSelection::iterator i = s.begin(); i != s.end(); ++i) {
+		TimeAxisView* tav = axis_view_from_stripable ((*i)->stripable());
 		if (tav) {
 			selection->add (tav);
 		}
diff --git a/gtk2_ardour/editor_mouse.cc b/gtk2_ardour/editor_mouse.cc
index a7b7059..8a8a951 100644
--- a/gtk2_ardour/editor_mouse.cc
+++ b/gtk2_ardour/editor_mouse.cc
@@ -34,7 +34,6 @@
 
 #include "gtkmm2ext/bindings.h"
 #include "gtkmm2ext/utils.h"
-#include "gtkmm2ext/tearoff.h"
 
 #include "canvas/canvas.h"
 
@@ -72,7 +71,7 @@
 #include "verbose_cursor.h"
 #include "note.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
@@ -685,7 +684,7 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
 			new TempoMarkerDrag (
 				this,
 				item,
-				Keyboard::modifier_state_contains (event->button.state, Keyboard::CopyModifier)
+				Keyboard::modifier_state_equals (event->button.state, Keyboard::CopyModifier)
 				),
 			event
 			);
@@ -698,7 +697,7 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
 			new MeterMarkerDrag (
 				this,
 				item,
-				Keyboard::modifier_state_contains (event->button.state, Keyboard::CopyModifier)
+				Keyboard::modifier_state_equals (event->button.state, Keyboard::CopyModifier)
 				),
 			event
 			);
@@ -712,13 +711,17 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
 
 	case MarkerBarItem:
 	case TempoBarItem:
+	case TempoCurveItem:
 	case MeterBarItem:
 	case TimecodeRulerItem:
 	case SamplesRulerItem:
 	case MinsecRulerItem:
 	case BBTRulerItem:
-		if (!Keyboard::modifier_state_equals (event->button.state, Keyboard::PrimaryModifier)) {
+		if (!Keyboard::modifier_state_equals (event->button.state, Keyboard::PrimaryModifier)
+			&& !Keyboard::modifier_state_contains (event->button.state, ArdourKeyboard::constraint_modifier())) {
 			_drags->set (new CursorDrag (this, *playhead_cursor, false), event);
+		} else if (Keyboard::modifier_state_contains (event->button.state, ArdourKeyboard::constraint_modifier())) {
+			_drags->set (new BBTRulerDrag (this, item), event);
 		}
 		return true;
 		break;
@@ -1034,7 +1037,7 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
 						if (!prev) {
 							_drags->set (new RegionCreateDrag (this, item, parent), event);
 						} else {
-							prev->set_length (t - prev->position ());
+							prev->set_length (t - prev->position (), get_grid_music_divisions (event->button.state));
 						}
 					}
 				} else {
@@ -1334,7 +1337,6 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT
 		case RegionItem:
 			show_region_properties ();
 			break;
-
 		case TempoMarkerItem: {
 			ArdourMarker* marker;
 			TempoMarker* tempo_marker;
@@ -1439,6 +1441,7 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT
 			case TransportMarkerBarItem:
 			case CdMarkerBarItem:
 			case TempoBarItem:
+			case TempoCurveItem:
 			case MeterBarItem:
 			case VideoBarItem:
 			case TimecodeRulerItem:
@@ -1548,8 +1551,8 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT
 				mouse_add_new_marker (where, true);
 			}
 			return true;
-
 		case TempoBarItem:
+		case TempoCurveItem:
 			if (!_dragging_playhead) {
 				snap_to_with_modifier (where, event);
 				mouse_add_new_tempo_event (where);
@@ -2079,8 +2082,12 @@ Editor::edit_notes (MidiRegionView* mrv)
 void
 Editor::note_edit_done (int r, EditNoteDialog* d)
 {
+	begin_reversible_command (_("edit note(s)"));
+
 	d->done (r);
 	delete d;
+
+	commit_reversible_command();
 }
 
 void
@@ -2093,7 +2100,7 @@ Editor::visible_order_range (int* low, int* high) const
 
 		RouteTimeAxisView* rtv = dynamic_cast<RouteTimeAxisView*> (*i);
 
-		if (!rtv->hidden()) {
+		if (rtv && !rtv->hidden()) {
 
 			if (*high < rtv->order()) {
 				*high = rtv->order ();
@@ -2306,7 +2313,7 @@ Editor::mouse_brush_insert_region (RegionView* rv, framepos_t pos)
 
 	RouteTimeAxisView* rtv = dynamic_cast<RouteTimeAxisView*>(&rv->get_time_axis_view());
 
-	if (rtv == 0 || !rtv->is_track()) {
+	if (!rtv || !rtv->is_track()) {
 		return;
 	}
 
@@ -2457,7 +2464,7 @@ Editor::escape ()
 		selection->clear ();
 	}
 
-	reset_focus ();
+	reset_focus (&contents());
 }
 
 /** Update _join_object_range_state which indicate whether we are over the top
diff --git a/gtk2_ardour/editor_ops.cc b/gtk2_ardour/editor_ops.cc
index 115d37a..c208e55 100644
--- a/gtk2_ardour/editor_ops.cc
+++ b/gtk2_ardour/editor_ops.cc
@@ -42,6 +42,7 @@
 
 #include "ardour/audio_track.h"
 #include "ardour/audioregion.h"
+#include "ardour/boost_debug.h"
 #include "ardour/dB.h"
 #include "ardour/location.h"
 #include "ardour/midi_region.h"
@@ -101,7 +102,7 @@
 #include "transform_dialog.h"
 #include "ui_config.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
@@ -150,7 +151,7 @@ Editor::redo (uint32_t n)
 }
 
 void
-Editor::split_regions_at (framepos_t where, RegionSelection& regions)
+Editor::split_regions_at (framepos_t where, RegionSelection& regions, const int32_t sub_num)
 {
 	bool frozen = false;
 
@@ -225,7 +226,7 @@ Editor::split_regions_at (framepos_t where, RegionSelection& regions)
 
 		if (pl) {
 			pl->clear_changes ();
-			pl->split_region ((*a)->region(), where);
+			pl->split_region ((*a)->region(), where, sub_num);
 			_session->add_command (new StatefulDiffCommand (pl));
 		}
 
@@ -432,6 +433,9 @@ Editor::nudge_forward (bool next, bool force_playhead)
 					} else {
 						loc->set_end (max_framepos);
 					}
+					if (loc->is_session_range()) {
+						_session->set_end_is_free (false);
+					}
 				}
 				if (!in_command) {
 					begin_reversible_command (_("nudge location forward"));
@@ -523,6 +527,9 @@ Editor::nudge_backward (bool next, bool force_playhead)
 					} else {
 						loc->set_end (loc->length());
 					}
+					if (loc->is_session_range()) {
+						_session->set_end_is_free (false);
+					}
 				}
 				if (!in_command) {
 					begin_reversible_command (_("nudge location forward"));
@@ -1921,7 +1928,7 @@ Editor::temporal_zoom_region (bool both_axes)
 
 
 bool
-Editor::get_selection_extents ( framepos_t &start, framepos_t &end )
+Editor::get_selection_extents (framepos_t &start, framepos_t &end) const
 {
 	start = max_framepos;
 	end = 0;
@@ -2232,6 +2239,8 @@ Editor::set_session_end_from_playhead ()
 
 		commit_reversible_command ();
 	}
+
+	_session->set_end_is_free (false);
 }
 
 void
@@ -2573,7 +2582,7 @@ Editor::play_from_edit_point_and_return ()
 void
 Editor::play_selection ()
 {
- 	framepos_t start, end;
+	framepos_t start, end;
 	if (!get_selection_extents ( start, end))
 		return;
 
@@ -2782,7 +2791,7 @@ Editor::rename_region ()
 		return;
 	}
 
-	ArdourDialog d (*this, _("Rename Region"), true, false);
+	ArdourDialog d (_("Rename Region"), true, false);
 	Entry entry;
 	Label label (_("New name:"));
 	HBox hbox;
@@ -3042,62 +3051,63 @@ Editor::separate_regions_between (const TimeSelection& ts)
 
 	for (TrackSelection::iterator i = tmptracks.begin(); i != tmptracks.end(); ++i) {
 
-		RouteTimeAxisView* rtv;
-
-		if ((rtv = dynamic_cast<RouteTimeAxisView*> ((*i))) != 0) {
+		RouteTimeAxisView* rtv = dynamic_cast<RouteTimeAxisView*> ((*i));
 
-			if (rtv->is_track()) {
+		if (!rtv) {
+			continue;
+		}
 
-				/* no edits to destructive tracks */
+		if (!rtv->is_track()) {
+			continue;
+		}
 
-				if (rtv->track()->destructive()) {
-					continue;
-				}
+		/* no edits to destructive tracks */
 
-				if ((playlist = rtv->playlist()) != 0) {
+		if (rtv->track()->destructive()) {
+			continue;
+		}
 
-					playlist->clear_changes ();
+		if ((playlist = rtv->playlist()) != 0) {
 
-					/* XXX need to consider musical time selections here at some point */
+			playlist->clear_changes ();
 
-					double speed = rtv->track()->speed();
+			/* XXX need to consider musical time selections here at some point */
 
+			double speed = rtv->track()->speed();
 
-					for (list<AudioRange>::const_iterator t = ts.begin(); t != ts.end(); ++t) {
+			for (list<AudioRange>::const_iterator t = ts.begin(); t != ts.end(); ++t) {
 
-						sigc::connection c = rtv->view()->RegionViewAdded.connect (
-								sigc::mem_fun(*this, &Editor::collect_new_region_view));
+				sigc::connection c = rtv->view()->RegionViewAdded.connect (
+					sigc::mem_fun(*this, &Editor::collect_new_region_view));
 
-						latest_regionviews.clear ();
+				latest_regionviews.clear ();
 
-						playlist->partition ((framepos_t)((*t).start * speed),
-								(framepos_t)((*t).end * speed), false);
+				playlist->partition ((framepos_t)((*t).start * speed),
+				                     (framepos_t)((*t).end * speed), false);
 
-						c.disconnect ();
+				c.disconnect ();
 
-						if (!latest_regionviews.empty()) {
+				if (!latest_regionviews.empty()) {
 
-							rtv->view()->foreach_regionview (sigc::bind (
-										sigc::ptr_fun (add_if_covered),
-										&(*t), &new_selection));
+					rtv->view()->foreach_regionview (sigc::bind (
+						                                 sigc::ptr_fun (add_if_covered),
+						                                 &(*t), &new_selection));
 
-							if (!in_command) {
-								begin_reversible_command (_("separate"));
-								in_command = true;
-							}
+					if (!in_command) {
+						begin_reversible_command (_("separate"));
+						in_command = true;
+					}
 
-							/* pick up changes to existing regions */
+					/* pick up changes to existing regions */
 
-							vector<Command*> cmds;
-							playlist->rdiff (cmds);
-							_session->add_commands (cmds);
+					vector<Command*> cmds;
+					playlist->rdiff (cmds);
+					_session->add_commands (cmds);
 
-							/* pick up changes to the playlist itself (adds/removes)
-							 */
+					/* pick up changes to the playlist itself (adds/removes)
+					 */
 
-							_session->add_command(new StatefulDiffCommand (playlist));
-						}
-					}
+					_session->add_command(new StatefulDiffCommand (playlist));
 				}
 			}
 		}
@@ -3217,7 +3227,7 @@ Editor::separate_under_selected_regions ()
 
 	        if (!playlist) {
 			// is this check necessary?
-	        	continue;
+			continue;
 	        }
 
 		vector<PlaylistState>::iterator i;
@@ -3292,17 +3302,18 @@ Editor::crop_region_to (framepos_t start, framepos_t end)
 
 	for (TrackSelection::iterator i = ts.begin(); i != ts.end(); ++i) {
 
-		RouteTimeAxisView* rtv;
+		RouteTimeAxisView* rtv = dynamic_cast<RouteTimeAxisView*> ((*i));
 
-		if ((rtv = dynamic_cast<RouteTimeAxisView*> ((*i))) != 0) {
+		if (!rtv) {
+			continue;
+		}
 
-			boost::shared_ptr<Track> t = rtv->track();
+		boost::shared_ptr<Track> t = rtv->track();
 
-			if (t != 0 && ! t->destructive()) {
+		if (t != 0 && ! t->destructive()) {
 
-				if ((playlist = rtv->playlist()) != 0) {
-					playlists.push_back (playlist);
-				}
+			if ((playlist = rtv->playlist()) != 0) {
+				playlists.push_back (playlist);
 			}
 		}
 	}
@@ -3391,7 +3402,7 @@ Editor::region_fill_track ()
 		sigc::connection c = rtv->view()->RegionViewAdded.connect (sigc::mem_fun(*this, &Editor::collect_new_region_view));
 
 		framepos_t const position = end_frame + (r->first_frame() - start_frame + 1);
- 		playlist = (*i)->region()->playlist();
+		playlist = (*i)->region()->playlist();
 		playlist->clear_changes ();
 		playlist->duplicate_until (r, position, gap, end);
 		_session->add_command(new StatefulDiffCommand (playlist));
@@ -3917,6 +3928,7 @@ Editor::freeze_route ()
 		gtk_main_iteration ();
 	}
 
+	pthread_join (itt.thread, 0);
 	current_interthread_info = 0;
 }
 
@@ -3955,9 +3967,9 @@ Editor::bounce_range_selection (bool replace, bool enable_processing)
 
 	for (TrackViewList::iterator i = views.begin(); i != views.end(); ++i) {
 
-		RouteTimeAxisView* rtv;
+		RouteTimeAxisView* rtv = dynamic_cast<RouteTimeAxisView*> (*i);
 
-		if ((rtv = dynamic_cast<RouteTimeAxisView*> (*i)) == 0) {
+		if (!rtv) {
 			continue;
 		}
 
@@ -4166,6 +4178,7 @@ Editor::cut_copy (CutCopyOp op)
 	}
 }
 
+
 struct AutomationRecord {
 	AutomationRecord () : state (0) , line(NULL) {}
 	AutomationRecord (XMLNode* s, const AutomationLine* l) : state (s) , line (l) {}
@@ -4174,7 +4187,11 @@ struct AutomationRecord {
 	const AutomationLine* line; ///< line this came from
 	boost::shared_ptr<Evoral::ControlList> copy; ///< copied events for the cut buffer
 };
-
+struct PointsSelectionPositionSorter {
+	bool operator() (ControlPoint* a, ControlPoint* b) {
+		return (*(a->model()))->when < (*(b->model()))->when;
+	}
+};
 /** Cut, copy or clear selected automation points.
  *  @param op Operation (Cut, Copy or Clear)
  */
@@ -4192,9 +4209,12 @@ Editor::cut_copy_points (Editing::CutCopyOp op, Evoral::Beats earliest, bool mid
 	typedef std::map<boost::shared_ptr<AutomationList>, AutomationRecord> Lists;
 	Lists lists;
 
+	/* user could select points in any order */
+	selection->points.sort(PointsSelectionPositionSorter ());
+	
 	/* Go through all selected points, making an AutomationRecord for each distinct AutomationList */
-	for (PointSelection::iterator i = selection->points.begin(); i != selection->points.end(); ++i) {
-		const AutomationLine&                   line = (*i)->line();
+	for (PointSelection::iterator sel_point = selection->points.begin(); sel_point != selection->points.end(); ++sel_point) {
+		const AutomationLine&                   line = (*sel_point)->line();
 		const boost::shared_ptr<AutomationList> al   = line.the_list();
 		if (lists.find (al) == lists.end ()) {
 			/* We haven't seen this list yet, so make a record for it.  This includes
@@ -4214,17 +4234,17 @@ Editor::cut_copy_points (Editing::CutCopyOp op, Evoral::Beats earliest, bool mid
 
 		/* Add all selected points to the relevant copy ControlLists */
 		framepos_t start = std::numeric_limits<framepos_t>::max();
-		for (PointSelection::iterator i = selection->points.begin(); i != selection->points.end(); ++i) {
-			boost::shared_ptr<AutomationList> al = (*i)->line().the_list();
-			AutomationList::const_iterator    j  = (*i)->model();
+		for (PointSelection::iterator sel_point = selection->points.begin(); sel_point != selection->points.end(); ++sel_point) {
+			boost::shared_ptr<AutomationList>    al = (*sel_point)->line().the_list();
+			AutomationList::const_iterator ctrl_evt = (*sel_point)->model ();
 
-			lists[al].copy->fast_simple_add ((*j)->when, (*j)->value);
+			lists[al].copy->fast_simple_add ((*ctrl_evt)->when, (*ctrl_evt)->value);
 			if (midi) {
 				/* Update earliest MIDI start time in beats */
-				earliest = std::min(earliest, Evoral::Beats((*j)->when));
+				earliest = std::min(earliest, Evoral::Beats((*ctrl_evt)->when));
 			} else {
 				/* Update earliest session start time in frames */
-				start = std::min(start, (*i)->line().session_position(j));
+				start = std::min(start, (*sel_point)->line().session_position(ctrl_evt));
 			}
 		}
 
@@ -4247,12 +4267,13 @@ Editor::cut_copy_points (Editing::CutCopyOp op, Evoral::Beats earliest, bool mid
 			   start time, so relative ordering between points is preserved
 			   when copying from several lists and the paste starts at the
 			   earliest copied piece of data. */
-			for (AutomationList::iterator j = i->second.copy->begin(); j != i->second.copy->end(); ++j) {
-				(*j)->when -= line_offset;
+			boost::shared_ptr<Evoral::ControlList> &al_cpy = i->second.copy;
+			for (AutomationList::iterator ctrl_evt = al_cpy->begin(); ctrl_evt != al_cpy->end(); ++ctrl_evt) {
+				(*ctrl_evt)->when -= line_offset;
 			}
 
 			/* And add it to the cut buffer */
-			cut_buffer->add (i->second.copy);
+			cut_buffer->add (al_cpy);
 		}
 	}
 
@@ -4264,9 +4285,22 @@ Editor::cut_copy_points (Editing::CutCopyOp op, Evoral::Beats earliest, bool mid
 		}
 
 		/* Remove each selected point from its AutomationList */
-		for (PointSelection::iterator i = selection->points.begin(); i != selection->points.end(); ++i) {
-			boost::shared_ptr<AutomationList> al = (*i)->line().the_list();
-			al->erase ((*i)->model ());
+		for (PointSelection::iterator sel_point = selection->points.begin(); sel_point != selection->points.end(); ++sel_point) {
+			AutomationLine& line = (*sel_point)->line ();
+			boost::shared_ptr<AutomationList> al = line.the_list();
+
+			bool erase = true;
+			
+			if (dynamic_cast<AudioRegionGainLine*> (&line)) {
+				/* removing of first and last gain point in region gain lines is prohibited*/
+				if (line.is_last_point (*(*sel_point)) || line.is_first_point (*(*sel_point))) {
+					erase = false;
+				}
+			}
+
+			if(erase) {
+				al->erase ((*sel_point)->model ());
+			}
 		}
 
 		/* Thaw the lists and add undo records for them */
@@ -4382,7 +4416,7 @@ Editor::remove_selected_regions ()
 
 	        if (!playlist) {
 			// is this check necessary?
-	        	continue;
+			continue;
 	        }
 
 		/* get_regions_from_selection_and_entered() guarantees that
@@ -4567,7 +4601,7 @@ Editor::cut_copy_regions (CutCopyOp op, RegionSelection& rs)
 
 		list<boost::shared_ptr<Playlist> > foo;
 
-		/* the pmap is in the same order as the tracks in which selected regions occured */
+		/* the pmap is in the same order as the tracks in which selected regions occurred */
 
 		for (vector<PlaylistMapping>::iterator i = pmap.begin(); i != pmap.end(); ++i) {
 			if ((*i).pl) {
@@ -4631,7 +4665,7 @@ Editor::paste (float times, bool from_context)
 {
         DEBUG_TRACE (DEBUG::CutNPaste, "paste to preferred edit pos\n");
 
-	paste_internal (get_preferred_edit_position (EDIT_IGNORE_NONE, from_context), times);
+	paste_internal (get_preferred_edit_position (EDIT_IGNORE_NONE, from_context), times, get_grid_music_divisions (0));
 }
 
 void
@@ -4645,11 +4679,11 @@ Editor::mouse_paste ()
 	}
 
 	snap_to (where);
-	paste_internal (where, 1);
+	paste_internal (where, 1, get_grid_music_divisions (0));
 }
 
 void
-Editor::paste_internal (framepos_t position, float times)
+Editor::paste_internal (framepos_t position, float times, const int32_t sub_num)
 {
         DEBUG_TRACE (DEBUG::CutNPaste, string_compose ("apparent paste position is %1\n", position));
 
@@ -4742,7 +4776,7 @@ Editor::paste_internal (framepos_t position, float times)
 	       "greedy" paste from one automation type to another. */
 
 	    PasteContext ctx(paste_count, times, ItemCounts(), true);
-	    ts.front()->paste (position, *cut_buffer, ctx);
+	    ts.front()->paste (position, *cut_buffer, ctx, sub_num);
 
 	} else {
 
@@ -4750,7 +4784,7 @@ Editor::paste_internal (framepos_t position, float times)
 
 		PasteContext ctx(paste_count, times, ItemCounts(), false);
 		for (TrackViewList::iterator i = ts.begin(); i != ts.end(); ++i) {
-			(*i)->paste (position, *cut_buffer, ctx);
+			(*i)->paste (position, *cut_buffer, ctx, sub_num);
 		}
 	}
 
@@ -4786,7 +4820,7 @@ Editor::duplicate_some_regions (RegionSelection& regions, float times)
 		sigc::connection c = rtv->view()->RegionViewAdded.connect (sigc::mem_fun(*this, &Editor::collect_new_region_view));
 
 		framepos_t const position = end_frame + (r->first_frame() - start_frame + 1);
- 		playlist = (*i)->region()->playlist();
+		playlist = (*i)->region()->playlist();
 		playlist->clear_changes ();
 		playlist->duplicate (r, position, gap, times);
 		_session->add_command(new StatefulDiffCommand (playlist));
@@ -5160,12 +5194,13 @@ Editor::strip_region_silence ()
 	StripSilenceDialog d (_session, audio_only);
 	int const r = d.run ();
 
-        d.drop_rects ();
+	d.drop_rects ();
 
-        if (r == Gtk::RESPONSE_OK) {
-                ARDOUR::AudioIntervalMap silences;
-                d.silences (silences);
+	if (r == Gtk::RESPONSE_OK) {
+		ARDOUR::AudioIntervalMap silences;
+		d.silences (silences);
 		StripSilence s (*_session, silences, d.fade_length());
+
 		apply_filter (s, _("strip silence"), &d);
 	}
 }
@@ -5440,6 +5475,11 @@ Editor::apply_filter (Filter& filter, string command, ProgressReporter* progress
 				playlist->clear_changes ();
 				playlist->clear_owned_changes ();
 
+				if (!in_command) {
+					begin_reversible_command (command);
+					in_command = true;
+				}
+
 				if (filter.results.empty ()) {
 
 					/* no regions returned; remove the old one */
@@ -5460,14 +5500,10 @@ Editor::apply_filter (Filter& filter, string command, ProgressReporter* progress
 					}
 
 				}
+
 				/* We might have removed regions, which alters other regions' layering_index,
 				   so we need to do a recursive diff here.
 				*/
-
-				if (!in_command) {
-					begin_reversible_command (command);
-					in_command = true;
-				}
 				vector<Command*> cmds;
 				playlist->rdiff (cmds);
 				_session->add_commands (cmds);
@@ -5695,11 +5731,11 @@ Editor::toggle_record_enable ()
 			continue;
 
 		if (first) {
-			new_state = !rtav->track()->record_enabled();
+			new_state = !rtav->track()->rec_enable_control()->get_value();
 			first = false;
 		}
 
-		rtav->track()->set_record_enabled (new_state, Controllable::UseGroup);
+		rtav->track()->rec_enable_control()->set_value (new_state, Controllable::UseGroup);
 	}
 }
 
@@ -5708,7 +5744,7 @@ Editor::toggle_solo ()
 {
 	bool new_state = false;
 	bool first = true;
-	boost::shared_ptr<RouteList> rl (new RouteList);
+	boost::shared_ptr<ControlList> cl (new ControlList);
 
 	for (TrackSelection::iterator i = selection->tracks.begin(); i != selection->tracks.end(); ++i) {
 		RouteTimeAxisView *rtav = dynamic_cast<RouteTimeAxisView *>(*i);
@@ -5722,10 +5758,10 @@ Editor::toggle_solo ()
 			first = false;
 		}
 
-		rl->push_back (rtav->route());
+		cl->push_back (rtav->route()->solo_control());
 	}
 
-	_session->set_solo (rl, new_state, Session::rt_cleanup, Controllable::UseGroup);
+	_session->set_controls (cl, new_state ? 1.0 : 0.0, Controllable::UseGroup);
 }
 
 void
@@ -5750,7 +5786,7 @@ Editor::toggle_mute ()
 		rl->push_back (rtav->route());
 	}
 
-	_session->set_mute (rl, new_state, Session::rt_cleanup, Controllable::UseGroup);
+	_session->set_controls (route_list_to_control_list (rl, &Stripable::mute_control), new_state, Controllable::UseGroup);
 }
 
 void
@@ -6145,16 +6181,14 @@ Editor::split_region ()
 			return;
 		}
 
-		split_regions_at (where, rs);
+		if (snap_musical()) {
+			split_regions_at (where, rs, get_grid_music_divisions (0));
+		} else {
+			split_regions_at (where, rs, 0);
+		}
 	}
 }
 
-struct EditorOrderRouteSorter {
-    bool operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b) {
-	    return a->order_key () < b->order_key ();
-    }
-};
-
 void
 Editor::select_next_route()
 {
@@ -6168,6 +6202,7 @@ Editor::select_next_route()
 	RouteUI *rui;
 	do {
 		for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) {
+
 			if (*i == current) {
 				++i;
 				if (i != track_views.end()) {
@@ -6179,10 +6214,12 @@ Editor::select_next_route()
 				break;
 			}
 		}
+
 		rui = dynamic_cast<RouteUI *>(current);
-	} while ( current->hidden() || (rui != NULL && !rui->route()->active()));
 
-	selection->set(current);
+	} while (current->hidden() || (rui == NULL) || !rui->route()->active());
+
+	selection->set (current);
 
 	ensure_time_axis_view_is_visible (*current, false);
 }
@@ -6200,6 +6237,7 @@ Editor::select_prev_route()
 	RouteUI *rui;
 	do {
 		for (TrackViewList::reverse_iterator i = track_views.rbegin(); i != track_views.rend(); ++i) {
+
 			if (*i == current) {
 				++i;
 				if (i != track_views.rend()) {
@@ -6211,7 +6249,8 @@ Editor::select_prev_route()
 			}
 		}
 		rui = dynamic_cast<RouteUI *>(current);
-	} while ( current->hidden() || (rui != NULL && !rui->route()->active()));
+
+	} while (current->hidden() || (rui == NULL) || !rui->route()->active());
 
 	selection->set (current);
 
@@ -6278,11 +6317,11 @@ Editor::set_session_extents_from_selection ()
 
 	Location* loc;
 	if ((loc = _session->locations()->session_range_location()) == 0) {
-		_session->set_session_extents ( start, end );  // this will create a new session range;  no need for UNDO
+		_session->set_session_extents (start, end);  // this will create a new session range;  no need for UNDO
 	} else {
 		XMLNode &before = loc->get_state();
 
-		_session->set_session_extents ( start, end );
+		_session->set_session_extents (start, end);
 
 		XMLNode &after = loc->get_state();
 
@@ -6292,6 +6331,8 @@ Editor::set_session_extents_from_selection ()
 
 		commit_reversible_command ();
 	}
+
+	_session->set_end_is_free (false);
 }
 
 void
@@ -6472,11 +6513,13 @@ Editor::define_one_bar (framepos_t start, framepos_t end)
 {
 	framepos_t length = end - start;
 
-	const Meter& m (_session->tempo_map().meter_at (start));
+	const Meter& m (_session->tempo_map().meter_at_frame (start));
 
 	/* length = 1 bar */
 
-	/* now we want frames per beat.
+	/* We're going to deliver a constant tempo here,
+	   so we can use frames per beat to determine length.
+	   now we want frames per beat.
 	   we have frames per bar, and beats per bar, so ...
 	*/
 
@@ -6495,7 +6538,7 @@ Editor::define_one_bar (framepos_t start, framepos_t end)
 
 	*/
 
-	const TempoSection& t (_session->tempo_map().tempo_section_at (start));
+	const TempoSection& t (_session->tempo_map().tempo_section_at_frame (start));
 
 	bool do_global = false;
 
@@ -6546,9 +6589,8 @@ Editor::define_one_bar (framepos_t start, framepos_t end)
 	} else if (t.frame() == start) {
 		_session->tempo_map().change_existing_tempo_at (start, beats_per_minute, t.note_type());
 	} else {
-		Timecode::BBT_Time bbt;
-		_session->tempo_map().bbt_time (start, bbt);
-		_session->tempo_map().add_tempo (Tempo (beats_per_minute, t.note_type()), bbt);
+		const Tempo tempo (beats_per_minute, t.note_type());
+		_session->tempo_map().add_tempo (tempo, 0.0, start, TempoSection::Constant, AudioTime);
 	}
 
 	XMLNode& after (_session->tempo_map().get_state());
@@ -6579,7 +6621,8 @@ Editor::split_region_at_transients ()
 
 		boost::shared_ptr<AudioRegion> ar = boost::dynamic_pointer_cast<AudioRegion> ((*i)->region());
 
-		if (ar && (ar->get_transients (positions) == 0)) {
+		if (ar) {
+			ar->transients (positions);
 			split_region_at_points ((*i)->region(), positions, true);
 			positions.clear ();
 		}
@@ -6608,7 +6651,6 @@ Editor::split_region_at_points (boost::shared_ptr<Region> r, AnalysisFeatureList
 		return;
 	}
 
-
 	if (positions.size() > 20 && can_ferret) {
 		std::string msgstr = string_compose (_("You are about to split\n%1\ninto %2 pieces.\nThis could take a long time."), r->name(), positions.size() + 1);
 		MessageDialog msg (msgstr,
@@ -6661,27 +6703,28 @@ Editor::split_region_at_points (boost::shared_ptr<Region> r, AnalysisFeatureList
 
 	framepos_t pos = 0;
 
+	framepos_t rstart = r->first_frame ();
+	framepos_t rend = r->last_frame ();
+
 	while (x != positions.end()) {
 
 		/* deal with positons that are out of scope of present region bounds */
-		if (*x <= 0 || *x > r->length()) {
+		if (*x <= rstart || *x > rend) {
 			++x;
 			continue;
 		}
 
-		/* file start = original start + how far we from the initial position ?
-		 */
+		/* file start = original start + how far we from the initial position ?  */
 
 		framepos_t file_start = r->start() + pos;
 
-		/* length = next position - current position
-		 */
+		/* length = next position - current position */
 
-		framepos_t len = (*x) - pos;
+		framepos_t len = (*x) - pos - rstart;
 
 		/* XXX we do we really want to allow even single-sample regions?
-		   shouldn't we have some kind of lower limit on region size?
-		*/
+		 * shouldn't we have some kind of lower limit on region size?
+		 */
 
 		if (len <= 0) {
 			break;
@@ -6701,14 +6744,15 @@ Editor::split_region_at_points (boost::shared_ptr<Region> r, AnalysisFeatureList
 		plist.add (ARDOUR::Properties::length, len);
 		plist.add (ARDOUR::Properties::name, new_name);
 		plist.add (ARDOUR::Properties::layer, 0);
+		// TODO set transients_offset
 
 		boost::shared_ptr<Region> nr = RegionFactory::create (r->sources(), plist, false);
 		/* because we set annouce to false, manually add the new region to the
-		   RegionFactory map
-		*/
+		 * RegionFactory map
+		 */
 		RegionFactory::map_add (nr);
 
-		pl->add_region (nr, r->position() + pos);
+		pl->add_region (nr, rstart + pos);
 
 		if (select_new) {
 			new_regions.push_front(nr);
@@ -6778,8 +6822,7 @@ Editor::place_transient()
 	begin_reversible_command (_("place transient"));
 
 	for (RegionSelection::iterator r = rs.begin(); r != rs.end(); ++r) {
-		framepos_t position = (*r)->region()->position();
-		(*r)->region()->add_transient(where - position);
+		(*r)->region()->add_transient(where);
 	}
 
 	commit_reversible_command ();
@@ -7095,6 +7138,7 @@ Editor::remove_tracks ()
 bool
 Editor::idle_remove_tracks ()
 {
+	Session::StateProtector sp (_session);
 	_remove_tracks ();
 	return false; /* do not call again */
 }
@@ -7198,12 +7242,17 @@ edit your ardour.rc file to set the\n\
 	}
 
 	{
-		Session::StateProtector sp (_session);
 		DisplaySuspender ds;
+		boost::shared_ptr<RouteList> rl (new RouteList);
 		for (vector<boost::shared_ptr<Route> >::iterator x = routes.begin(); x != routes.end(); ++x) {
-			_session->remove_route (*x);
+			rl->push_back (*x);
 		}
+		_session->remove_routes (rl);
 	}
+	/* TrackSelection and RouteList leave scope,
+	 * destructors are called,
+	 * diskstream drops references, save_state is called (again for every track)
+	 */
 }
 
 void
@@ -7282,7 +7331,8 @@ Editor::insert_time (
 			(*i)->clear_owned_changes ();
 
 			if (opt == SplitIntersected) {
-				(*i)->split (pos);
+				/* non musical split */
+				(*i)->split (pos, 0);
 			}
 
 			(*i)->shift (pos, frames, (opt == MoveIntersected), ignore_music_glue);
@@ -7597,7 +7647,7 @@ Editor::fit_tracks (TrackViewList & tracks)
 	double first_y_pos = DBL_MAX;
 
 	if (h < TimeAxisView::preset_height (HeightSmall)) {
-		MessageDialog msg (*this, _("There are too many tracks to fit in the current window"));
+		MessageDialog msg (_("There are too many tracks to fit in the current window"));
 		/* too small to be displayed */
 		return;
 	}
@@ -7881,7 +7931,7 @@ Editor::update_bring_in_message (Gtk::Label* label, uint32_t n, uint32_t total,
 {
 	Timers::TimerSuspender t;
 	label->set_text (string_compose ("Copying %1, %2 of %3", name, n, total));
-	Gtkmm2ext::UI::instance()->flush_pending ();
+	Gtkmm2ext::UI::instance()->flush_pending (1);
 }
 
 void
@@ -7901,7 +7951,7 @@ Editor::bring_all_sources_into_session ()
 	 */
 
 	Timers::TimerSuspender t;
-	Gtkmm2ext::UI::instance()->flush_pending ();
+	Gtkmm2ext::UI::instance()->flush_pending (3);
 
 	cerr << " Do it\n";
 
diff --git a/gtk2_ardour/editor_pt_import.cc b/gtk2_ardour/editor_pt_import.cc
index 15723c3..2b659e0 100644
--- a/gtk2_ardour/editor_pt_import.cc
+++ b/gtk2_ardour/editor_pt_import.cc
@@ -60,7 +60,7 @@
 #include "mouse_cursors.h"
 #include "editor_cursors.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
@@ -121,6 +121,7 @@ Editor::do_ptimport (std::string ptpath,
 	vector<string> to_import;
 	string fullpath;
 	bool ok = false;
+	bool onefailed = false;
 	PTFFormat ptf;
 	framepos_t pos = -1;
 
@@ -165,9 +166,19 @@ Editor::do_ptimport (std::string ptpath,
 
 			ptfwavpair.push_back(p);
 			imported.push_back(import_status.sources.back());
+		} else {
+			onefailed = true;
 		}
 	}
 
+	if (onefailed) {
+		MessageDialog msg (_("Failed to load one or more of the audio files, but continuing to attempt import."));
+		msg.run ();
+	} else {
+		MessageDialog msg (_("Success! Import should complete soon."));
+		msg.run ();
+	}
+
 	for (vector<PTFFormat::region_t>::iterator a = ptf.regions.begin();
 			a != ptf.regions.end(); ++a) {
 		for (vector<ptflookup_t>::iterator p = ptfwavpair.begin();
@@ -233,12 +244,27 @@ Editor::do_ptimport (std::string ptpath,
 				} else {
 					// Put on a new track
 					DEBUG_TRACE (DEBUG::FileUtils, string_compose ("\twav(%1) reg(%2) new_tr(%3)\n", a->reg.wave.filename.c_str(), a->reg.index, nth));
-					list<boost::shared_ptr<AudioTrack> > at (_session->new_audio_track (1, 2, Normal, 0, 1));
+					list<boost::shared_ptr<AudioTrack> > at (_session->new_audio_track (1, 2, 0, 1, string(), PresentationInfo::max_order, Normal));
 					if (at.empty()) {
 						return;
 					}
 					existing_track = at.back();
-					existing_track->set_name (a->name);
+					std::string trackname;
+					try {
+						trackname = Glib::convert_with_fallback (a->name, "UTF-8", "UTF-8", "_");
+					} catch (Glib::ConvertError& err) {
+						trackname = string_compose ("Invalid %1", a->index);
+					}
+					// TODO legalize track name (no slashes, no colons)
+#if 0 // TODO --  "find_route_name" is currently private
+					/* generate a unique name by adding a number if needed */
+					uint32_t id = 0;
+					if (!_session->find_route_name (trackname.c_str (), id, trackname, false)) {
+						fatal << _("PTImport: UINT_MAX routes? impossible!") << endmsg;
+						abort(); /*NOTREACHED*/
+					}
+#endif
+					existing_track->set_name (trackname);
 					boost::shared_ptr<Playlist> playlist = existing_track->playlist();
 					boost::shared_ptr<Region> copy (RegionFactory::create (r, true));
 					playlist->clear_changes ();
diff --git a/gtk2_ardour/editor_regions.cc b/gtk2_ardour/editor_regions.cc
index d23648a..845e56f 100644
--- a/gtk2_ardour/editor_regions.cc
+++ b/gtk2_ardour/editor_regions.cc
@@ -52,7 +52,7 @@
 #include "tooltips.h"
 #include "ui_config.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
@@ -84,6 +84,7 @@ EditorRegions::EditorRegions (Editor* e)
 	_display.set_size_request (100, -1);
 	_display.set_rules_hint (true);
 	_display.set_name ("EditGroupList");
+	_display.set_fixed_height_mode (true);
 
 	/* Try to prevent single mouse presses from initiating edits.
 	   This relies on a hack in gtktreeview.c:gtk_treeview_button_press()
@@ -94,19 +95,62 @@ EditorRegions::EditorRegions (Editor* e)
 	_model->set_sort_func (0, sigc::mem_fun (*this, &EditorRegions::sorter));
 	_model->set_sort_column (0, SORT_ASCENDING);
 
-	_display.set_model (_model);
-
-	_display.append_column ("", _columns.name);
-	_display.append_column ("", _columns.position);
-	_display.append_column ("", _columns.end);
-	_display.append_column ("", _columns.length);
-	_display.append_column ("", _columns.sync);
-	_display.append_column ("", _columns.fadein);
-	_display.append_column ("", _columns.fadeout);
-	_display.append_column ("", _columns.locked);
-	_display.append_column ("", _columns.glued);
-	_display.append_column ("", _columns.muted);
-	_display.append_column ("", _columns.opaque);
+	/* column widths */
+	int bbt_width, sync_width, check_width, height;
+
+	Glib::RefPtr<Pango::Layout> layout = _display.create_pango_layout (X_("000|000|000"));
+	Gtkmm2ext::get_pixel_size (layout, bbt_width, height);
+
+	layout = _display.create_pango_layout (X_("Start "));
+	Gtkmm2ext::get_pixel_size (layout, sync_width, height);
+
+	check_width = 20;
+
+	TreeViewColumn* col_name = manage (new TreeViewColumn ("", _columns.name));
+	col_name->set_fixed_width (120);
+	col_name->set_sizing (TREE_VIEW_COLUMN_FIXED);
+	TreeViewColumn* col_position = manage (new TreeViewColumn ("", _columns.position));
+	col_position->set_fixed_width (bbt_width);
+	col_position->set_sizing (TREE_VIEW_COLUMN_FIXED);
+	TreeViewColumn* col_end = manage (new TreeViewColumn ("", _columns.end));
+	col_end->set_fixed_width (bbt_width);
+	col_end->set_sizing (TREE_VIEW_COLUMN_FIXED);
+	TreeViewColumn* col_length = manage (new TreeViewColumn ("", _columns.length));
+	col_length->set_fixed_width (bbt_width);
+	col_length->set_sizing (TREE_VIEW_COLUMN_FIXED);
+	TreeViewColumn* col_sync = manage (new TreeViewColumn ("", _columns.sync));
+	col_sync->set_fixed_width (sync_width);
+	col_sync->set_sizing (TREE_VIEW_COLUMN_FIXED);
+	TreeViewColumn* col_fadein = manage (new TreeViewColumn ("", _columns.fadein));
+	col_fadein->set_fixed_width (bbt_width);
+	col_fadein->set_sizing (TREE_VIEW_COLUMN_FIXED);
+	TreeViewColumn* col_fadeout = manage (new TreeViewColumn ("", _columns.fadeout));
+	col_fadeout->set_fixed_width (bbt_width);
+	col_fadeout->set_sizing (TREE_VIEW_COLUMN_FIXED);
+	TreeViewColumn* col_locked = manage (new TreeViewColumn ("", _columns.locked));
+	col_locked->set_fixed_width (check_width);
+	col_locked->set_sizing (TREE_VIEW_COLUMN_FIXED);
+	TreeViewColumn* col_glued = manage (new TreeViewColumn ("", _columns.glued));
+	col_glued->set_fixed_width (check_width);
+	col_glued->set_sizing (TREE_VIEW_COLUMN_FIXED);
+	TreeViewColumn* col_muted = manage (new TreeViewColumn ("", _columns.muted));
+	col_muted->set_fixed_width (check_width);
+	col_muted->set_sizing (TREE_VIEW_COLUMN_FIXED);
+	TreeViewColumn* col_opaque = manage (new TreeViewColumn ("", _columns.opaque));
+	col_opaque->set_fixed_width (check_width);
+	col_opaque->set_sizing (TREE_VIEW_COLUMN_FIXED);
+
+	_display.append_column (*col_name);
+	_display.append_column (*col_position);
+	_display.append_column (*col_end);
+	_display.append_column (*col_length);
+	_display.append_column (*col_sync);
+	_display.append_column (*col_fadein);
+	_display.append_column (*col_fadeout);
+	_display.append_column (*col_locked);
+	_display.append_column (*col_glued);
+	_display.append_column (*col_muted);
+	_display.append_column (*col_opaque);
 
 	TreeViewColumn* col;
 	Gtk::Label* l;
@@ -138,6 +182,7 @@ EditorRegions::EditorRegions (Editor* e)
 			col->set_alignment (ALIGN_CENTER);
 		}
 	}
+	_display.set_model (_model);
 
 	_display.set_headers_visible (true);
 	_display.set_rules_hint ();
@@ -379,15 +424,7 @@ EditorRegions::add_region (boost::shared_ptr<Region> region)
 			str = region->name();
 		}
 
-		if (region->n_channels() > 1) {
-			std::stringstream foo;
-			foo << region->n_channels ();
-			str += " [";
-			str += foo.str();
-			str += "]";
-		}
-
-		row[_columns.name] = str;
+		populate_row_name (region, row);
 		row[_columns.region] = region;
 		row[_columns.property_toggles_visible] = false;
 
@@ -446,8 +483,8 @@ EditorRegions::add_region (boost::shared_ptr<Region> region)
 	row[_columns.region] = region;
 
 	region_row_map.insert(pair<boost::shared_ptr<ARDOUR::Region>, Gtk::TreeModel::RowReference>(region, TreeRowReference(_model, TreePath (row))) );
-
-	populate_row(region, (*row));
+	PropertyChange pc;
+	populate_row(region, (*row), pc);
 }
 
 void
@@ -495,14 +532,13 @@ EditorRegions::region_changed (boost::shared_ptr<Region> r, const PropertyChange
 	our_interests.add (ARDOUR::Properties::fade_out_active);
 
 	if (what_changed.contains (our_interests)) {
-
 		if (last_row != 0) {
 
 			TreeModel::iterator j = _model->get_iter (last_row.get_path());
 			boost::shared_ptr<Region> c = (*j)[_columns.region];
 
 			if (c == r) {
-				populate_row (r, (*j));
+				populate_row (r, (*j), what_changed);
 
 				if (what_changed.contains (ARDOUR::Properties::hidden)) {
 					redisplay ();
@@ -522,7 +558,7 @@ EditorRegions::region_changed (boost::shared_ptr<Region> r, const PropertyChange
 			boost::shared_ptr<Region> c = (*j)[_columns.region];
 
 			if (c == r) {
-				populate_row (r, (*j));
+				populate_row (r, (*j), what_changed);
 
 				if (what_changed.contains (ARDOUR::Properties::hidden)) {
 					redisplay ();
@@ -661,9 +697,9 @@ EditorRegions::update_row (boost::shared_ptr<Region> region)
 	it = region_row_map.find (region);
 
 	if (it != region_row_map.end()){
-
+		PropertyChange c;
 		TreeModel::iterator j = _model->get_iter ((*it).second.get_path());
-		populate_row(region, (*j));
+		populate_row(region, (*j), c);
 	}
 }
 
@@ -683,7 +719,8 @@ EditorRegions::update_all_rows ()
 		boost::shared_ptr<Region> region = (*j)[_columns.region];
 
 		if (!region->automatic()) {
-			populate_row(region, (*j));
+			PropertyChange c;
+			populate_row(region, (*j), c);
 		}
 	}
 }
@@ -702,7 +739,7 @@ EditorRegions::format_position (framepos_t pos, char* buf, size_t bufsize, bool
 
 	switch (ARDOUR_UI::instance()->secondary_clock->mode ()) {
 	case AudioClock::BBT:
-		_session->tempo_map().bbt_time (pos, bbt);
+		bbt = _session->tempo_map().bbt_at_frame (pos);
 		if (onoff) {
 			snprintf (buf, bufsize, "%03d|%02d|%04d" , bbt.bars, bbt.beats, bbt.ticks);
 		} else {
@@ -750,26 +787,53 @@ EditorRegions::format_position (framepos_t pos, char* buf, size_t bufsize, bool
 }
 
 void
-EditorRegions::populate_row (boost::shared_ptr<Region> region, TreeModel::Row const &row)
+EditorRegions::populate_row (boost::shared_ptr<Region> region, TreeModel::Row const &row, PBD::PropertyChange const &what_changed)
 {
 	boost::shared_ptr<AudioRegion> audioregion = boost::dynamic_pointer_cast<AudioRegion>(region);
 	//uint32_t used = _session->playlists->region_use_count (region);
 	/* Presently a region is only used once so let's save on the sequential scan to determine use count */
 	uint32_t used = 1;
 
-	populate_row_position (region, row, used);
-	populate_row_end (region, row, used);
-	populate_row_sync (region, row, used);
-	populate_row_fade_in (region, row, used, audioregion);
-	populate_row_fade_out (region, row, used, audioregion);
-	populate_row_locked (region, row, used);
-	populate_row_glued (region, row, used);
-	populate_row_muted (region, row, used);
-	populate_row_opaque (region, row, used);
-	populate_row_length (region, row);
-	populate_row_source (region, row);
-	populate_row_name (region, row);
-	populate_row_used (region, row, used);
+	PropertyChange c;
+	const bool all = what_changed == c;
+
+	if (all || what_changed.contains (Properties::position)) {
+		populate_row_position (region, row, used);
+	}
+	if (all || what_changed.contains (Properties::start)) {
+		populate_row_sync (region, row, used);
+	}
+	if (all || what_changed.contains (Properties::fade_in)) {
+		populate_row_fade_in (region, row, used, audioregion);
+	}
+	if (all || what_changed.contains (Properties::fade_out)) {
+		populate_row_fade_out (region, row, used, audioregion);
+	}
+	if (all || what_changed.contains (Properties::locked)) {
+		populate_row_locked (region, row, used);
+	}
+	if (all || what_changed.contains (Properties::position_lock_style)) {
+		populate_row_glued (region, row, used);
+	}
+	if (all || what_changed.contains (Properties::muted)) {
+		populate_row_muted (region, row, used);
+	}
+	if (all || what_changed.contains (Properties::opaque)) {
+		populate_row_opaque (region, row, used);
+	}
+	if (all || what_changed.contains (Properties::length)) {
+		populate_row_end (region, row, used);
+		populate_row_length (region, row);
+	}
+	if (all) {
+		populate_row_source (region, row);
+	}
+	if (all || what_changed.contains (Properties::name)) {
+		populate_row_name (region, row);
+	}
+	if (all) {
+		populate_row_used (region, row, used);
+	}
 }
 
 #if 0
@@ -815,7 +879,15 @@ void
 EditorRegions::populate_row_length (boost::shared_ptr<Region> region, TreeModel::Row const &row)
 {
 	char buf[16];
-	format_position (region->length(), buf, sizeof (buf));
+
+	if (ARDOUR_UI::instance()->secondary_clock->mode () == AudioClock::BBT) {
+		TempoMap& map (_session->tempo_map());
+		Timecode::BBT_Time bbt = map.bbt_at_beat (map.beat_at_frame (region->last_frame()) - map.beat_at_frame (region->first_frame()));
+		snprintf (buf, sizeof (buf), "%03d|%02d|%04d" , bbt.bars, bbt.beats, bbt.ticks);
+	} else {
+		format_position (region->length(), buf, sizeof (buf));
+	}
+
 	row[_columns.length] = buf;
 }
 
@@ -1249,7 +1321,7 @@ EditorRegions::drag_data_received (const RefPtr<Gdk::DragContext>& context,
 		framepos_t pos = 0;
 		bool copy = ((context->get_actions() & (Gdk::ACTION_COPY | Gdk::ACTION_LINK | Gdk::ACTION_MOVE)) == Gdk::ACTION_COPY);
 
-		if (Profile->get_sae() || UIConfiguration::instance().get_only_copy_imported_files() || copy) {
+		if (UIConfiguration::instance().get_only_copy_imported_files() || copy) {
 			_editor->do_import (paths, Editing::ImportDistinctFiles, Editing::ImportAsRegion, SrcBest, pos);
 		} else {
 			_editor->do_embed (paths, Editing::ImportDistinctFiles, ImportAsRegion, pos);
@@ -1281,7 +1353,7 @@ EditorRegions::selection_filter (const RefPtr<TreeModel>& model, const TreeModel
 }
 
 void
-EditorRegions::name_editing_started (CellEditable* ce, const Glib::ustring&)
+EditorRegions::name_editing_started (CellEditable* ce, const Glib::ustring& path)
 {
 	name_editable = ce;
 
@@ -1291,6 +1363,15 @@ EditorRegions::name_editing_started (CellEditable* ce, const Glib::ustring&)
 
 	if (e) {
 		e->set_name (X_("RegionNameEditorEntry"));
+
+		TreeIter iter;
+		if ((iter = _model->get_iter (path))) {
+			boost::shared_ptr<Region> region = (*iter)[_columns.region];
+
+			if(region) {
+				e->set_text(region->name());
+			}
+		}
 	}
 }
 
@@ -1300,11 +1381,11 @@ EditorRegions::name_edit (const std::string& path, const std::string& new_text)
 	name_editable = 0;
 
 	boost::shared_ptr<Region> region;
-	TreeIter iter;
+	TreeIter row_iter;
 
-	if ((iter = _model->get_iter (path))) {
-		region = (*iter)[_columns.region];
-		(*iter)[_columns.name] = new_text;
+	if ((row_iter = _model->get_iter (path))) {
+		region = (*row_iter)[_columns.region];
+		(*row_iter)[_columns.name] = new_text;
 	}
 
 	/* now mapover everything */
@@ -1318,8 +1399,9 @@ EditorRegions::name_edit (const std::string& path, const std::string& new_text)
 				(*i)->region()->set_name (new_text);
 			}
 		}
-	}
 
+		populate_row_name (region, (*row_iter));
+	}
 }
 
 /** @return Region that has been dragged out of the list, or 0 */
diff --git a/gtk2_ardour/editor_regions.h b/gtk2_ardour/editor_regions.h
index 76c742a..ae830b0 100644
--- a/gtk2_ardour/editor_regions.h
+++ b/gtk2_ardour/editor_regions.h
@@ -153,7 +153,7 @@ private:
 
 	void add_region (boost::shared_ptr<ARDOUR::Region>);
 
-	void populate_row (boost::shared_ptr<ARDOUR::Region>, Gtk::TreeModel::Row const &);
+	void populate_row (boost::shared_ptr<ARDOUR::Region>, Gtk::TreeModel::Row const &, PBD::PropertyChange const &);
         void populate_row_used (boost::shared_ptr<ARDOUR::Region> region, Gtk::TreeModel::Row const& row, uint32_t used);
         void populate_row_position (boost::shared_ptr<ARDOUR::Region> region, Gtk::TreeModel::Row const& row, uint32_t used);
         void populate_row_end (boost::shared_ptr<ARDOUR::Region> region, Gtk::TreeModel::Row const& row, uint32_t used);
diff --git a/gtk2_ardour/editor_route_groups.cc b/gtk2_ardour/editor_route_groups.cc
index 8564435..3cfa1ee 100644
--- a/gtk2_ardour/editor_route_groups.cc
+++ b/gtk2_ardour/editor_route_groups.cc
@@ -48,7 +48,7 @@
 #include "tooltips.h"
 #include "utils.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
@@ -380,21 +380,22 @@ EditorRouteGroups::row_change (const Gtk::TreeModel::Path&, const Gtk::TreeModel
 	plist.add (Properties::name, string ((*iter)[_columns.text]));
 
 	bool val = (*iter)[_columns.gain];
-	plist.add (Properties::gain, val);
+	plist.add (Properties::group_gain, val);
 	val = (*iter)[_columns.gain_relative];
-	plist.add (Properties::relative, val);
+	plist.add (Properties::group_relative, val);
 	val = (*iter)[_columns.mute];
-	plist.add (Properties::mute, val);
+	plist.add (Properties::group_mute, val);
 	val = (*iter)[_columns.solo];
-	plist.add (Properties::solo, val);
+	plist.add (Properties::group_solo, val);
 	val = (*iter)[_columns.record];
-	plist.add (Properties::recenable, val);
+	plist.add (Properties::group_recenable, val);
 	val = (*iter)[_columns.monitoring];
-	plist.add (Properties::monitoring, val);
+	plist.add (Properties::group_monitoring, val);
 	val = (*iter)[_columns.select];
-	plist.add (Properties::select, val);
+	plist.add (Properties::group_select, val);
 	val = (*iter)[_columns.active_shared];
-	plist.add (Properties::route_active, val);
+	plist.add (Properties::group_route_active, val);
+
 	val = (*iter)[_columns.active_state];
 	plist.add (Properties::active, val);
 	val = (*iter)[_columns.is_visible];
@@ -517,7 +518,6 @@ EditorRouteGroups::property_changed (RouteGroup* group, const PropertyChange&)
 			}
 		}
 	}
-	_editor->_routes->reset_remote_control_ids ();
 }
 
 void
@@ -563,7 +563,7 @@ EditorRouteGroups::set_session (Session* s)
 	}
 
 	PBD::PropertyChange pc;
-	pc.add (Properties::select);
+	pc.add (Properties::group_select);
 	pc.add (Properties::active);
 
 	groups_changed ();
@@ -572,9 +572,7 @@ EditorRouteGroups::set_session (Session* s)
 void
 EditorRouteGroups::run_new_group_dialog ()
 {
-	RouteList rl;
-
-	return _editor->_group_tabs->run_new_group_dialog (rl);
+	return _editor->_group_tabs->run_new_group_dialog (0, false);
 }
 
 /** Called when a model row is deleted, but also when the model is
diff --git a/gtk2_ardour/editor_routes.cc b/gtk2_ardour/editor_routes.cc
index e4a48db..6ea6a1d 100644
--- a/gtk2_ardour/editor_routes.cc
+++ b/gtk2_ardour/editor_routes.cc
@@ -28,9 +28,14 @@
 #include "pbd/unwind.h"
 
 #include "ardour/debug.h"
+#include "ardour/audio_track.h"
 #include "ardour/midi_track.h"
 #include "ardour/route.h"
 #include "ardour/session.h"
+#include "ardour/solo_isolate_control.h"
+#include "ardour/utils.h"
+#include "ardour/vca.h"
+#include "ardour/vca_manager.h"
 
 #include "gtkmm2ext/cell_renderer_pixbuf_multi.h"
 #include "gtkmm2ext/cell_renderer_pixbuf_toggle.h"
@@ -46,11 +51,13 @@
 #include "keyboard.h"
 #include "midi_time_axis.h"
 #include "mixer_strip.h"
+#include "plugin_setup_dialog.h"
 #include "route_sorter.h"
 #include "tooltips.h"
+#include "vca_time_axis.h"
 #include "utils.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
@@ -108,6 +115,23 @@ EditorRoutes::EditorRoutes (Editor* e)
 	rec_state_column->set_expand(false);
 	rec_state_column->set_fixed_width(column_width);
 
+
+	// Record safe toggle
+	CellRendererPixbufMulti* rec_safe_renderer = manage (new CellRendererPixbufMulti ());
+
+	rec_safe_renderer->set_pixbuf (0, ::get_icon("rec-safe-disabled"));
+	rec_safe_renderer->set_pixbuf (1, ::get_icon("rec-safe-enabled"));
+	rec_safe_renderer->signal_changed().connect (sigc::mem_fun (*this, &EditorRoutes::on_tv_rec_safe_toggled));
+
+	TreeViewColumn* rec_safe_column = manage (new TreeViewColumn(_("RS"), *rec_safe_renderer));
+	rec_safe_column->add_attribute(rec_safe_renderer->property_state(), _columns.rec_safe);
+	rec_safe_column->add_attribute(rec_safe_renderer->property_visible(), _columns.is_track);
+	rec_safe_column->set_sizing(TREE_VIEW_COLUMN_FIXED);
+	rec_safe_column->set_alignment(ALIGN_CENTER);
+	rec_safe_column->set_expand(false);
+	rec_safe_column->set_fixed_width(column_width);
+
+
 	// MIDI Input Active
 
 	CellRendererPixbufMulti* input_active_col_renderer = manage (new CellRendererPixbufMulti());
@@ -195,6 +219,7 @@ EditorRoutes::EditorRoutes (Editor* e)
 
 	_display.append_column (*input_active_column);
 	_display.append_column (*rec_state_column);
+	_display.append_column (*rec_safe_column);
 	_display.append_column (*mute_state_column);
 	_display.append_column (*solo_state_column);
 	_display.append_column (*solo_isolate_state_column);
@@ -210,10 +235,11 @@ EditorRoutes::EditorRoutes (Editor* e)
 		{ 2, S_("Active|A"),    _("Track/Bus active ?") },
 		{ 3, S_("MidiInput|I"), _("MIDI input enabled") },
 		{ 4, S_("Rec|R"),       _("Record enabled") },
-		{ 5, S_("Mute|M"),      _("Muted") },
-		{ 6, S_("Solo|S"),      _("Soloed") },
-		{ 7, S_("SoloIso|SI"),  _("Solo Isolated") },
-		{ 8, S_("SoloLock|SS"), _("Solo Safe (Locked)") },
+		{ 5, S_("Rec|RS"),      _("Record Safe") },
+		{ 6, S_("Mute|M"),      _("Muted") },
+		{ 7, S_("Solo|S"),      _("Soloed") },
+		{ 8, S_("SoloIso|SI"),  _("Solo Isolated") },
+		{ 9, S_("SoloLock|SS"), _("Solo Safe (Locked)") },
 		{ -1, 0, 0 }
 	};
 
@@ -233,7 +259,7 @@ EditorRoutes::EditorRoutes (Editor* e)
 	_display.set_name (X_("EditGroupList"));
 	_display.set_rules_hint (true);
 	_display.set_size_request (100, -1);
-	_display.add_object_drag (_columns.route.index(), "routes");
+	_display.add_object_drag (_columns.stripable.index(), "routes");
 
 	CellRendererText* name_cell = dynamic_cast<CellRendererText*> (_display.get_column_cell_renderer (_name_column));
 
@@ -291,7 +317,8 @@ EditorRoutes::EditorRoutes (Editor* e)
 
 	_display.set_enable_search (false);
 
-	Route::SyncOrderKeys.connect (*this, MISSING_INVALIDATOR, boost::bind (&EditorRoutes::sync_treeview_from_order_keys, this), gui_context());
+	Route::PluginSetup.connect_same_thread (*this, boost::bind (&EditorRoutes::plugin_setup, this, _1, _2, _3));
+	PresentationInfo::Change.connect (*this, MISSING_INVALIDATOR, boost::bind (&EditorRoutes::sync_treeview_from_presentation_info, this), gui_context());
 }
 
 bool
@@ -393,17 +420,38 @@ EditorRoutes::on_input_active_changed (std::string const & path_string)
 void
 EditorRoutes::on_tv_rec_enable_changed (std::string const & path_string)
 {
-	DisplaySuspender ds;
 	// Get the model row that has been toggled.
 	Gtk::TreeModel::Row row = *_model->get_iter (Gtk::TreeModel::Path (path_string));
 
 	TimeAxisView* tv = row[_columns.tv];
 	RouteTimeAxisView *rtv = dynamic_cast<RouteTimeAxisView*> (tv);
 
-	if (rtv && rtv->track()) {
-		boost::shared_ptr<RouteList> rl (new RouteList);
-		rl->push_back (rtv->route());
-		_session->set_record_enabled (rl, !rtv->track()->record_enabled(), Session::rt_cleanup);
+	if (!rtv) {
+		return;
+	}
+
+	boost::shared_ptr<AutomationControl> ac = rtv->route()->rec_enable_control();
+
+	if (ac) {
+		ac->set_value (!ac->get_value(), Controllable::UseGroup);
+	}
+}
+
+void
+EditorRoutes::on_tv_rec_safe_toggled (std::string const & path_string)
+{
+	Gtk::TreeModel::Row row = *_model->get_iter (Gtk::TreeModel::Path (path_string));
+	TimeAxisView* tv = row[_columns.tv];
+	RouteTimeAxisView *rtv = dynamic_cast<RouteTimeAxisView*> (tv);
+
+	if (!rtv) {
+		return;
+	}
+
+	boost::shared_ptr<AutomationControl> ac (rtv->route()->rec_safe_control());
+
+	if (ac) {
+		ac->set_value (!ac->get_value(), Controllable::UseGroup);
 	}
 }
 
@@ -416,10 +464,14 @@ EditorRoutes::on_tv_mute_enable_toggled (std::string const & path_string)
 	TimeAxisView *tv = row[_columns.tv];
 	RouteTimeAxisView *rtv = dynamic_cast<RouteTimeAxisView*> (tv);
 
-	if (rtv != 0) {
-		boost::shared_ptr<RouteList> rl (new RouteList);
-		rl->push_back (rtv->route());
-		_session->set_mute (rl, !rtv->route()->muted(), Session::rt_cleanup);
+	if (!rtv) {
+		return;
+	}
+
+	boost::shared_ptr<AutomationControl> ac (rtv->route()->mute_control());
+
+	if (ac) {
+		ac->set_value (!ac->get_value(), Controllable::UseGroup);
 	}
 }
 
@@ -432,14 +484,14 @@ EditorRoutes::on_tv_solo_enable_toggled (std::string const & path_string)
 	TimeAxisView *tv = row[_columns.tv];
 	RouteTimeAxisView* rtv = dynamic_cast<RouteTimeAxisView*> (tv);
 
-	if (rtv != 0) {
-		boost::shared_ptr<RouteList> rl (new RouteList);
-		rl->push_back (rtv->route());
-		if (Config->get_solo_control_is_listen_control()) {
-			_session->set_listen (rl, !rtv->route()->listening_via_monitor(), Session::rt_cleanup);
-		} else {
-			_session->set_solo (rl, !rtv->route()->self_soloed(), Session::rt_cleanup);
-		}
+	if (!rtv) {
+		return;
+	}
+
+	boost::shared_ptr<AutomationControl> ac (rtv->route()->solo_control());
+
+	if (ac) {
+		ac->set_value (!ac->get_value(), Controllable::UseGroup);
 	}
 }
 
@@ -452,8 +504,14 @@ EditorRoutes::on_tv_solo_isolate_toggled (std::string const & path_string)
 	TimeAxisView *tv = row[_columns.tv];
 	RouteTimeAxisView* rtv = dynamic_cast<RouteTimeAxisView*> (tv);
 
-	if (rtv) {
-		rtv->route()->set_solo_isolated (!rtv->route()->solo_isolated(), Controllable::UseGroup);
+	if (!rtv) {
+		return;
+	}
+
+	boost::shared_ptr<AutomationControl> ac (rtv->route()->solo_isolate_control());
+
+	if (ac) {
+		ac->set_value (!ac->get_value(), Controllable::UseGroup);
 	}
 }
 
@@ -466,8 +524,14 @@ EditorRoutes::on_tv_solo_safe_toggled (std::string const & path_string)
 	TimeAxisView *tv = row[_columns.tv];
 	RouteTimeAxisView* rtv = dynamic_cast<RouteTimeAxisView*> (tv);
 
-	if (rtv) {
-		rtv->route()->set_solo_safe (!rtv->route()->solo_safe(), Controllable::UseGroup);
+	if (!rtv) {
+		return;
+	}
+
+	boost::shared_ptr<AutomationControl> ac (rtv->route()->solo_safe_control());
+
+	if (ac) {
+		ac->set_value (!ac->get_value(), Controllable::UseGroup);
 	}
 }
 
@@ -517,7 +581,6 @@ EditorRoutes::redisplay_real ()
 
 	for (n = 0, position = 0, i = rows.begin(); i != rows.end(); ++i) {
 		TimeAxisView *tv = (*i)[_columns.tv];
-		boost::shared_ptr<Route> route = (*i)[_columns.route];
 
 		if (tv == 0) {
 			// just a "title" row
@@ -568,15 +631,18 @@ EditorRoutes::redisplay ()
 	}
 
 	// model deprecated g_atomic_int_exchange_and_add(, 1)
-	g_atomic_int_inc(&_redisplay_active);
-	if (!g_atomic_int_compare_and_exchange (&_redisplay_active, 1, 1)) {
+	g_atomic_int_inc(const_cast<gint*>(&_redisplay_active));
+	if (!g_atomic_int_compare_and_exchange (const_cast<gint*>(&_redisplay_active), 1, 1)) {
+		/* recursive re-display can happen if redisplay shows/hides a TrackView
+		 * which has children and their display status changes as result.
+		 */
 		return;
 	}
 
 	redisplay_real ();
 
-	while (!g_atomic_int_compare_and_exchange (&_redisplay_active, 1, 0)) {
-		g_atomic_int_set(&_redisplay_active, 1);
+	while (!g_atomic_int_compare_and_exchange (const_cast<gint*>(&_redisplay_active), 1, 0)) {
+		g_atomic_int_set(const_cast<gint*>(&_redisplay_active), 1);
 		redisplay_real ();
 	}
 }
@@ -584,31 +650,35 @@ EditorRoutes::redisplay ()
 void
 EditorRoutes::row_deleted (Gtk::TreeModel::Path const &)
 {
+	if (!_session || _session->deletion_in_progress()) {
+		return;
+	}
 	/* this happens as the second step of a DnD within the treeview, and
 	 * when a route is actually removed. we don't differentiate between
 	 * the two cases.
 	 *
-	 * note that the sync_orders_keys() step may not actually change any
-	 * RID's (e.g. the last track may be removed, so all other tracks keep
-	 * the same RID), which means that no redisplay would happen. so we
-	 * have to force a redisplay.
+	 * note that the sync_presentation_info_from_treeview() step may not
+	 * actually change any presentation info (e.g. the last track may be
+	 * removed, so all other tracks keep the same presentation info), which
+	 * means that no redisplay would happen. so we have to force a
+	 * redisplay.
 	 */
 
 	DEBUG_TRACE (DEBUG::OrderKeys, "editor routes treeview row deleted\n");
 
 	DisplaySuspender ds;
-	sync_order_keys_from_treeview ();
+	sync_presentation_info_from_treeview ();
 }
 
 void
 EditorRoutes::reordered (TreeModel::Path const &, TreeModel::iterator const &, int* /*what*/)
 {
-	/* reordering implies that RID's will change, so sync_order_keys() will
-	   cause a redisplay.
+	/* reordering implies that RID's will change, so
+	   sync_presentation_info_from_treeview() will cause a redisplay.
 	*/
 
 	DEBUG_TRACE (DEBUG::OrderKeys, "editor routes treeview reordered\n");
-	sync_order_keys_from_treeview ();
+	sync_presentation_info_from_treeview ();
 }
 
 void
@@ -641,82 +711,126 @@ EditorRoutes::active_changed (std::string const & path)
 	}
 
 	Gtk::TreeModel::Row row = *_model->get_iter (path);
-	boost::shared_ptr<Route> route = row[_columns.route];
-	bool const active = row[_columns.active];
-	route->set_active (!active, this);
+	boost::shared_ptr<Stripable> stripable = row[_columns.stripable];
+	boost::shared_ptr<Route> route = boost::dynamic_pointer_cast<Route> (stripable);
+	if (route) {
+		bool const active = row[_columns.active];
+		route->set_active (!active, this);
+	}
 }
 
 void
-EditorRoutes::routes_added (list<RouteTimeAxisView*> routes)
+EditorRoutes::time_axis_views_added (list<TimeAxisView*> tavs)
 {
 	PBD::Unwinder<bool> at (_adding_routes, true);
 	bool from_scratch = (_model->children().size() == 0);
 	Gtk::TreeModel::Children::iterator insert_iter = _model->children().end();
 
 	for (Gtk::TreeModel::Children::iterator it = _model->children().begin(); it != _model->children().end(); ++it) {
-		boost::shared_ptr<Route> r = (*it)[_columns.route];
 
-		if (r->order_key() == (routes.front()->route()->order_key() + routes.size())) {
+		boost::shared_ptr<Stripable> r = (*it)[_columns.stripable];
+
+		if (r->presentation_info().order() == (tavs.front()->stripable()->presentation_info().order() + tavs.size())) {
 			insert_iter = it;
 			break;
 		}
 	}
 
-	DisplaySuspender ds;
-
 	_display.set_model (Glib::RefPtr<ListStore>());
 
-	for (list<RouteTimeAxisView*>::iterator x = routes.begin(); x != routes.end(); ++x) {
+	for (list<TimeAxisView*>::iterator x = tavs.begin(); x != tavs.end(); ++x) {
 
-		boost::shared_ptr<MidiTrack> midi_trk = boost::dynamic_pointer_cast<MidiTrack> ((*x)->route());
+		VCATimeAxisView* vtav = dynamic_cast<VCATimeAxisView*> (*x);
+		RouteTimeAxisView* rtav = dynamic_cast<RouteTimeAxisView*> (*x);
 
 		TreeModel::Row row = *(_model->insert (insert_iter));
 
-		row[_columns.text] = (*x)->route()->name();
-		row[_columns.visible] = (*x)->marked_for_display();
-		row[_columns.active] = (*x)->route()->active ();
-		row[_columns.tv] = *x;
-		row[_columns.route] = (*x)->route ();
-		row[_columns.is_track] = (boost::dynamic_pointer_cast<Track> ((*x)->route()) != 0);
+		boost::shared_ptr<Stripable> stripable;
+		boost::shared_ptr<MidiTrack> midi_trk;
 
-		if (midi_trk) {
-			row[_columns.is_input_active] = midi_trk->input_active ();
-			row[_columns.is_midi] = true;
-		} else {
+		if (vtav) {
+
+			stripable = vtav->vca();
+
+			row[_columns.is_track] = false;
 			row[_columns.is_input_active] = false;
 			row[_columns.is_midi] = false;
+
+		} else if (rtav) {
+
+			stripable = rtav->route ();
+			midi_trk= boost::dynamic_pointer_cast<MidiTrack> (stripable);
+
+			row[_columns.is_track] = (boost::dynamic_pointer_cast<Track> (stripable) != 0);
+
+
+			if (midi_trk) {
+				row[_columns.is_input_active] = midi_trk->input_active ();
+				row[_columns.is_midi] = true;
+			} else {
+				row[_columns.is_input_active] = false;
+				row[_columns.is_midi] = false;
+			}
 		}
 
-		row[_columns.mute_state] = (*x)->route()->muted() ? Gtkmm2ext::ExplicitActive : Gtkmm2ext::Off;
-		row[_columns.solo_state] = RouteUI::solo_active_state ((*x)->route());
-		row[_columns.solo_visible] = !(*x)->route()->is_master ();
-		row[_columns.solo_isolate_state] = (*x)->route()->solo_isolated();
-		row[_columns.solo_safe_state] = (*x)->route()->solo_safe();
+		if (!stripable) {
+			continue;
+		}
+
+		row[_columns.text] = stripable->name();
+		row[_columns.visible] = (*x)->marked_for_display();
+		row[_columns.active] = true;
+		row[_columns.tv] = *x;
+		row[_columns.stripable] = stripable;
+		row[_columns.mute_state] = RouteUI::mute_active_state (_session, stripable);
+		row[_columns.solo_state] = RouteUI::solo_active_state (stripable);
+		row[_columns.solo_visible] = true;
+		row[_columns.solo_isolate_state] = RouteUI::solo_isolate_active_state (stripable);
+		row[_columns.solo_safe_state] = RouteUI::solo_safe_active_state (stripable);
 		row[_columns.name_editable] = true;
 
-		boost::weak_ptr<Route> wr ((*x)->route());
+		boost::weak_ptr<Stripable> ws (stripable);
 
-		(*x)->route()->gui_changed.connect (*this, MISSING_INVALIDATOR, boost::bind (&EditorRoutes::handle_gui_changes, this, _1, _2), gui_context());
-		(*x)->route()->PropertyChanged.connect (*this, MISSING_INVALIDATOR, boost::bind (&EditorRoutes::route_property_changed, this, _1, wr), gui_context());
+		/* for now, we need both of these. PropertyChanged covers on
+		 * pre-defined, "global" things of interest to a
+		 * UI. gui_changed covers arbitrary, un-enumerated, un-typed
+		 * changes that may only be of interest to a particular
+		 * UI (e.g. track-height is not of any relevant to OSC)
+		 */
+
+		stripable->gui_changed.connect (*this, MISSING_INVALIDATOR, boost::bind (&EditorRoutes::handle_gui_changes, this, _1, _2), gui_context());
+		stripable->PropertyChanged.connect (*this, MISSING_INVALIDATOR, boost::bind (&EditorRoutes::route_property_changed, this, _1, ws), gui_context());
+		stripable->presentation_info().PropertyChanged.connect (*this, MISSING_INVALIDATOR, boost::bind (&EditorRoutes::route_property_changed, this, _1, ws), gui_context());
 
-		if ((*x)->is_track()) {
-			boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> ((*x)->route());
-			t->RecordEnableChanged.connect (*this, MISSING_INVALIDATOR, boost::bind (&EditorRoutes::update_rec_display, this), gui_context());
+		if (boost::dynamic_pointer_cast<Track> (stripable)) {
+			boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (stripable);
+			t->rec_enable_control()->Changed.connect (*this, MISSING_INVALIDATOR, boost::bind (&EditorRoutes::update_rec_display, this), gui_context());
+			t->rec_safe_control()->Changed.connect (*this, MISSING_INVALIDATOR, boost::bind (&EditorRoutes::update_rec_display, this), gui_context());
 		}
 
-		if ((*x)->is_midi_track()) {
-			boost::shared_ptr<MidiTrack> t = boost::dynamic_pointer_cast<MidiTrack> ((*x)->route());
-			t->StepEditStatusChange.connect (*this, MISSING_INVALIDATOR, boost::bind (&EditorRoutes::update_rec_display, this), gui_context());
-			t->InputActiveChanged.connect (*this, MISSING_INVALIDATOR, boost::bind (&EditorRoutes::update_input_active_display, this), gui_context());
+		if (midi_trk) {
+			midi_trk->StepEditStatusChange.connect (*this, MISSING_INVALIDATOR, boost::bind (&EditorRoutes::update_rec_display, this), gui_context());
+			midi_trk->InputActiveChanged.connect (*this, MISSING_INVALIDATOR, boost::bind (&EditorRoutes::update_input_active_display, this), gui_context());
 		}
 
-		(*x)->route()->mute_changed.connect (*this, MISSING_INVALIDATOR, boost::bind (&EditorRoutes::update_mute_display, this), gui_context());
-		(*x)->route()->solo_changed.connect (*this, MISSING_INVALIDATOR, boost::bind (&EditorRoutes::update_solo_display, this), gui_context());
-		(*x)->route()->listen_changed.connect (*this, MISSING_INVALIDATOR, boost::bind (&EditorRoutes::update_solo_display, this), gui_context());
-		(*x)->route()->solo_isolated_changed.connect (*this, MISSING_INVALIDATOR, boost::bind (&EditorRoutes::update_solo_isolate_display, this), gui_context());
-		(*x)->route()->solo_safe_changed.connect (*this, MISSING_INVALIDATOR, boost::bind (&EditorRoutes::update_solo_safe_display, this), gui_context());
-		(*x)->route()->active_changed.connect (*this, MISSING_INVALIDATOR, boost::bind (&EditorRoutes::update_active_display, this), gui_context ());
+		boost::shared_ptr<AutomationControl> ac;
 
+		if ((ac = stripable->mute_control()) != 0) {
+			ac->Changed.connect (*this, MISSING_INVALIDATOR, boost::bind (&EditorRoutes::update_mute_display, this), gui_context());
+		}
+		if ((ac = stripable->solo_control()) != 0) {
+			ac->Changed.connect (*this, MISSING_INVALIDATOR, boost::bind (&EditorRoutes::update_solo_display, this), gui_context());
+		}
+		if ((ac = stripable->solo_isolate_control()) != 0) {
+			ac->Changed.connect (*this, MISSING_INVALIDATOR, boost::bind (&EditorRoutes::update_solo_isolate_display, this), gui_context());
+		}
+		if ((ac = stripable->solo_safe_control()) != 0) {
+			ac->Changed.connect (*this, MISSING_INVALIDATOR, boost::bind (&EditorRoutes::update_solo_safe_display, this), gui_context());
+		}
+
+		if (rtav) {
+			rtav->route()->active_changed.connect (*this, MISSING_INVALIDATOR, boost::bind (&EditorRoutes::update_active_display, this), gui_context ());
+		}
 	}
 
 	update_rec_display ();
@@ -730,9 +844,12 @@ EditorRoutes::routes_added (list<RouteTimeAxisView*> routes)
 	_display.set_model (_model);
 
 	/* now update route order keys from the treeview/track display order */
+
 	if (!from_scratch) {
-		sync_order_keys_from_treeview ();
+		sync_presentation_info_from_treeview ();
 	}
+
+	redisplay ();
 }
 
 void
@@ -776,17 +893,19 @@ EditorRoutes::route_removed (TimeAxisView *tv)
 }
 
 void
-EditorRoutes::route_property_changed (const PropertyChange& what_changed, boost::weak_ptr<Route> r)
+EditorRoutes::route_property_changed (const PropertyChange& what_changed, boost::weak_ptr<Stripable> s)
 {
-	if (!what_changed.contains (ARDOUR::Properties::name)) {
+	if (!what_changed.contains (ARDOUR::Properties::hidden) && !what_changed.contains (ARDOUR::Properties::name)) {
 		return;
 	}
 
-	ENSURE_GUI_THREAD (*this, &EditorRoutes::route_name_changed, r)
+	if (_adding_routes) {
+		return;
+	}
 
-	boost::shared_ptr<Route> route = r.lock ();
+	boost::shared_ptr<Stripable> stripable = s.lock ();
 
-	if (!route) {
+	if (!stripable) {
 		return;
 	}
 
@@ -794,9 +913,23 @@ EditorRoutes::route_property_changed (const PropertyChange& what_changed, boost:
 	TreeModel::Children::iterator i;
 
 	for (i = rows.begin(); i != rows.end(); ++i) {
-		boost::shared_ptr<Route> t = (*i)[_columns.route];
-		if (t == route) {
-			(*i)[_columns.text] = route->name();
+
+		boost::shared_ptr<Stripable> ss = (*i)[_columns.stripable];
+
+		if (ss == stripable) {
+
+			if (what_changed.contains (ARDOUR::Properties::name)) {
+				(*i)[_columns.text] = stripable->name();
+				break;
+			}
+
+			if (what_changed.contains (ARDOUR::Properties::hidden)) {
+				(*i)[_columns.visible] = !stripable->presentation_info().hidden();
+				cerr << stripable->name() << " visibility changed, redisplay\n";
+				redisplay ();
+
+			}
+
 			break;
 		}
 	}
@@ -805,7 +938,7 @@ EditorRoutes::route_property_changed (const PropertyChange& what_changed, boost:
 void
 EditorRoutes::update_active_display ()
 {
-	if (g_atomic_int_compare_and_exchange (&_queue_tv_update, 0, 1)) {
+	if (g_atomic_int_compare_and_exchange (const_cast<gint*>(&_queue_tv_update), 0, 1)) {
 		Glib::signal_idle().connect (sigc::mem_fun (*this, &EditorRoutes::idle_update_mute_rec_solo_etc));
 	}
 }
@@ -826,7 +959,7 @@ EditorRoutes::update_visibility ()
 	/* force route order keys catch up with visibility changes
 	 */
 
-	sync_order_keys_from_treeview ();
+	sync_presentation_info_from_treeview ();
 }
 
 void
@@ -863,66 +996,7 @@ EditorRoutes::show_track_in_display (TimeAxisView& tv)
 }
 
 void
-EditorRoutes::reset_remote_control_ids ()
-{
-	if (Config->get_remote_model() == UserOrdered || !_session || _session->deletion_in_progress()) {
-		return;
-	}
-
-	TreeModel::Children rows = _model->children();
-
-	if (rows.empty()) {
-		return;
-	}
-
-
-	DEBUG_TRACE (DEBUG::OrderKeys, "editor reset remote control ids\n");
-
-	TreeModel::Children::iterator ri;
-	bool rid_change = false;
-	uint32_t rid = 1;
-	uint32_t invisible_key = UINT32_MAX;
-
-	for (ri = rows.begin(); ri != rows.end(); ++ri) {
-
-		/* skip two special values */
-
-		if (rid == Route::MasterBusRemoteControlID) {
-			rid++;
-		}
-
-		if (rid == Route::MonitorBusRemoteControlID) {
-			rid++;
-		}
-
-		boost::shared_ptr<Route> route = (*ri)[_columns.route];
-		bool visible = (*ri)[_columns.visible];
-
-		if (!route->is_master() && !route->is_monitor()) {
-
-			uint32_t new_rid = (visible ? rid : invisible_key--);
-
-			if (new_rid != route->remote_control_id()) {
-				route->set_remote_control_id_explicit (new_rid);
-				rid_change = true;
-			}
-
-			if (visible) {
-				rid++;
-			}
-
-		}
-	}
-
-	if (rid_change) {
-		/* tell the world that we changed the remote control IDs */
-		_session->notify_remote_id_change ();
-	}
-}
-
-
-void
-EditorRoutes::sync_order_keys_from_treeview ()
+EditorRoutes::sync_presentation_info_from_treeview ()
 {
 	if (_ignore_reorder || !_session || _session->deletion_in_progress()) {
 		return;
@@ -934,60 +1008,43 @@ EditorRoutes::sync_order_keys_from_treeview ()
 		return;
 	}
 
-
-	DEBUG_TRACE (DEBUG::OrderKeys, "editor sync order keys from treeview\n");
+	DEBUG_TRACE (DEBUG::OrderKeys, "editor sync presentation info from treeview\n");
 
 	TreeModel::Children::iterator ri;
-	bool changed = false;
-	bool rid_change = false;
-	uint32_t order = 0;
-	uint32_t rid = 1;
-	uint32_t invisible_key = UINT32_MAX;
+	bool change = false;
+	PresentationInfo::order_t order = 0;
 
 	for (ri = rows.begin(); ri != rows.end(); ++ri) {
 
-		boost::shared_ptr<Route> route = (*ri)[_columns.route];
+		boost::shared_ptr<Stripable> stripable = (*ri)[_columns.stripable];
 		bool visible = (*ri)[_columns.visible];
 
-		uint32_t old_key = route->order_key ();
-
-		if (order != old_key) {
-			route->set_order_key (order);
+		/* Monitor and Auditioner do not get their presentation
+		 * info reset here.
+		 */
 
-			changed = true;
+		if (stripable->is_monitor() || stripable->is_auditioner()) {
+			continue;
 		}
 
-		if ((Config->get_remote_model() == MixerOrdered) && !route->is_master() && !route->is_monitor()) {
-
-			uint32_t new_rid = (visible ? rid : invisible_key--);
-
-			if (new_rid != route->remote_control_id()) {
-				route->set_remote_control_id_explicit (new_rid);
-				rid_change = true;
-			}
-
-			if (visible) {
-				rid++;
-			}
+		stripable->presentation_info().set_hidden (!visible);
 
+		if (order != stripable->presentation_info().order()) {
+			stripable->set_presentation_order (order, false);
+			change = true;
 		}
 
 		++order;
 	}
 
-	if (changed) {
-		/* tell the world that we changed the editor sort keys */
-		_session->sync_order_keys ();
-	}
-
-	if (rid_change) {
-		/* tell the world that we changed the remote control IDs */
-		_session->notify_remote_id_change ();
+	if (change) {
+		DEBUG_TRACE (DEBUG::OrderKeys, "... notify PI change from editor GUI\n");
+		_session->notify_presentation_info_change ();
 	}
 }
 
 void
-EditorRoutes::sync_treeview_from_order_keys ()
+EditorRoutes::sync_treeview_from_presentation_info ()
 {
 	/* Some route order key(s) have been changed, make sure that
 	   we update out tree/list model and GUI to reflect the change.
@@ -997,12 +1054,7 @@ EditorRoutes::sync_treeview_from_order_keys ()
 		return;
 	}
 
-	DEBUG_TRACE (DEBUG::OrderKeys, "editor sync model from order keys.\n");
-
-	/* we could get here after either a change in the Mixer or Editor sort
-	 * order, but either way, the mixer order keys reflect the intended
-	 * order for the GUI, so reorder the treeview model to match it.
-	 */
+	DEBUG_TRACE (DEBUG::OrderKeys, "editor sync model from presentation info.\n");
 
 	vector<int> neworder;
 	TreeModel::Children rows = _model->children();
@@ -1013,30 +1065,28 @@ EditorRoutes::sync_treeview_from_order_keys ()
 		return;
 	}
 
-	OrderKeySortedRoutes sorted_routes;
+	OrderingKeys sorted;
 
 	for (TreeModel::Children::iterator ri = rows.begin(); ri != rows.end(); ++ri, ++old_order) {
-		boost::shared_ptr<Route> route = (*ri)[_columns.route];
-		sorted_routes.push_back (RoutePlusOrderKey (route, old_order, route->order_key ()));
+		boost::shared_ptr<Stripable> stripable = (*ri)[_columns.stripable];
+		/* use global order */
+		sorted.push_back (OrderKeys (old_order, stripable->presentation_info().order()));
 	}
 
 	SortByNewDisplayOrder cmp;
 
-	sort (sorted_routes.begin(), sorted_routes.end(), cmp);
-	neworder.assign (sorted_routes.size(), 0);
+	sort (sorted.begin(), sorted.end(), cmp);
+	neworder.assign (sorted.size(), 0);
 
 	uint32_t n = 0;
 
-	for (OrderKeySortedRoutes::iterator sr = sorted_routes.begin(); sr != sorted_routes.end(); ++sr, ++n) {
+	for (OrderingKeys::iterator sr = sorted.begin(); sr != sorted.end(); ++sr, ++n) {
 
 		neworder[n] = sr->old_display_order;
 
 		if (sr->old_display_order != n) {
 			changed = true;
 		}
-
-		DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("EDITOR change order for %1 from %2 to %3\n",
-							       sr->route->name(), sr->old_display_order, n));
 	}
 
 	if (changed) {
@@ -1092,7 +1142,7 @@ EditorRoutes::set_all_tracks_visibility (bool yn)
 	/* force route order keys catch up with visibility changes
 	 */
 
-	sync_order_keys_from_treeview ();
+	sync_presentation_info_from_treeview ();
 }
 
 void
@@ -1157,7 +1207,7 @@ EditorRoutes::set_all_audio_midi_visibility (int tracks, bool yn)
 	/* force route order keys catch up with visibility changes
 	 */
 
-	sync_order_keys_from_treeview ();
+	sync_presentation_info_from_treeview ();
 }
 
 void
@@ -1235,25 +1285,27 @@ EditorRoutes::key_press (GdkEventKey* ev)
 
 		case 'm':
 			if (get_relevant_routes (rl)) {
-				_session->set_mute (rl, !rl->front()->muted(), Session::rt_cleanup);
+				_session->set_controls (route_list_to_control_list (rl, &Stripable::mute_control), rl->front()->muted() ? 0.0 : 1.0, Controllable::NoGroup);
 			}
 			return true;
 			break;
 
 		case 's':
 			if (get_relevant_routes (rl)) {
-				if (Config->get_solo_control_is_listen_control()) {
-					_session->set_listen (rl, !rl->front()->listening_via_monitor(), Session::rt_cleanup);
-				} else {
-					_session->set_solo (rl, !rl->front()->self_soloed(), Session::rt_cleanup);
-				}
+				_session->set_controls (route_list_to_control_list (rl, &Stripable::solo_control), rl->front()->self_soloed() ? 0.0 : 1.0, Controllable::NoGroup);
 			}
 			return true;
 			break;
 
 		case 'r':
 			if (get_relevant_routes (rl)) {
-				_session->set_record_enabled (rl, !rl->front()->record_enabled(), Session::rt_cleanup);
+				for (RouteList::const_iterator r = rl->begin(); r != rl->end(); ++r) {
+					boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*r);
+					if (t) {
+						_session->set_controls (route_list_to_control_list (rl, &Stripable::rec_enable_control), !t->rec_enable_control()->get_value(), Controllable::NoGroup);
+						break;
+					}
+				}
 			}
 			break;
 
@@ -1389,7 +1441,7 @@ EditorRoutes::selection_filter (Glib::RefPtr<TreeModel> const &, TreeModel::Path
 	return true;
 }
 
-struct EditorOrderRouteSorter
+struct PresentationInfoRouteSorter
 {
 	bool operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b) {
 		if (a->is_master()) {
@@ -1399,7 +1451,14 @@ struct EditorOrderRouteSorter
 			/* everything else before master */
 			return false;
 		}
-		return a->order_key () < b->order_key ();
+		return a->presentation_info().order () < b->presentation_info().order ();
+	}
+};
+
+struct PresentationInfoVCASorter
+{
+	bool operator() (boost::shared_ptr<VCA> a, boost::shared_ptr<VCA> b) {
+		return a->presentation_info().order () < b->presentation_info().order ();
 	}
 };
 
@@ -1413,10 +1472,19 @@ EditorRoutes::initial_display ()
 		return;
 	}
 
+	StripableList s;
+
 	RouteList r (*_session->get_routes());
+	for (RouteList::iterator ri = r.begin(); ri != r.end(); ++ri) {
+		s.push_back (*ri);
+	}
 
-	r.sort (EditorOrderRouteSorter ());
-	_editor->add_routes (r);
+	VCAList v (_session->vca_manager().vcas());
+	for (VCAList::iterator vi = v.begin(); vi != v.end(); ++vi) {
+		s.push_back (*vi);
+	}
+
+	_editor->add_stripables (s);
 }
 
 void
@@ -1433,6 +1501,15 @@ EditorRoutes::display_drag_data_received (const RefPtr<Gdk::DragContext>& contex
 	context->drag_finish (true, false, time);
 }
 
+struct ViewStripable {
+	TimeAxisView* tav;
+	boost::shared_ptr<Stripable> stripable;
+	uint32_t old_order;
+
+	ViewStripable (TimeAxisView* t, boost::shared_ptr<Stripable> s, uint32_t n)
+		: tav (t), stripable (s), old_order (n) {}
+};
+
 void
 EditorRoutes::move_selected_tracks (bool up)
 {
@@ -1440,33 +1517,32 @@ EditorRoutes::move_selected_tracks (bool up)
 		return;
 	}
 
-	typedef std::pair<TimeAxisView*,boost::shared_ptr<Route> > ViewRoute;
-	std::list<ViewRoute> view_routes;
+	std::list<ViewStripable> view_stripables;
 	std::vector<int> neworder;
 	TreeModel::Children rows = _model->children();
 	TreeModel::Children::iterator ri;
+	TreeModel::Children::size_type n;
 
-	for (ri = rows.begin(); ri != rows.end(); ++ri) {
+	for (n = 0, ri = rows.begin(); ri != rows.end(); ++ri, ++n) {
 		TimeAxisView* tv = (*ri)[_columns.tv];
-		boost::shared_ptr<Route> route = (*ri)[_columns.route];
-
-		view_routes.push_back (ViewRoute (tv, route));
+		boost::shared_ptr<Stripable> stripable = (*ri)[_columns.stripable];
+		view_stripables.push_back (ViewStripable (tv, stripable, n));
 	}
 
-	list<ViewRoute>::iterator trailing;
-	list<ViewRoute>::iterator leading;
+	list<ViewStripable>::iterator trailing;
+	list<ViewStripable>::iterator leading;
 
 	if (up) {
 
-		trailing = view_routes.begin();
-		leading = view_routes.begin();
+		trailing = view_stripables.begin();
+		leading = view_stripables.begin();
 
 		++leading;
 
-		while (leading != view_routes.end()) {
-			if (_editor->selection->selected (leading->first)) {
-				view_routes.insert (trailing, ViewRoute (leading->first, leading->second));
-				leading = view_routes.erase (leading);
+		while (leading != view_stripables.end()) {
+			if (_editor->selection->selected (leading->tav)) {
+				view_stripables.insert (trailing, ViewStripable (*leading));
+				leading = view_stripables.erase (leading);
 			} else {
 				++leading;
 				++trailing;
@@ -1480,17 +1556,17 @@ EditorRoutes::move_selected_tracks (bool up)
 		   and so it looks like a bit of a mess.
 		*/
 
-		trailing = view_routes.end();
-		leading = view_routes.end();
+		trailing = view_stripables.end();
+		leading = view_stripables.end();
 
-		--leading; if (leading == view_routes.begin()) { return; }
+		--leading; if (leading == view_stripables.begin()) { return; }
 		--leading;
 		--trailing;
 
 		while (1) {
 
-			if (_editor->selection->selected (leading->first)) {
-				list<ViewRoute>::iterator tmp;
+			if (_editor->selection->selected (leading->tav)) {
+				list<ViewStripable>::iterator tmp;
 
 				/* need to insert *after* trailing, not *before* it,
 				   which is what insert (iter, val) normally does.
@@ -1499,7 +1575,7 @@ EditorRoutes::move_selected_tracks (bool up)
 				tmp = trailing;
 				tmp++;
 
-				view_routes.insert (tmp, ViewRoute (leading->first, leading->second));
+				view_stripables.insert (tmp, ViewStripable (*leading));
 
 				/* can't use iter = cont.erase (iter); form here, because
 				   we need iter to move backwards.
@@ -1510,7 +1586,7 @@ EditorRoutes::move_selected_tracks (bool up)
 
 				bool done = false;
 
-				if (leading == view_routes.begin()) {
+				if (leading == view_stripables.begin()) {
 					/* the one we've just inserted somewhere else
 					   was the first in the list. erase this copy,
 					   and then break, because we're done.
@@ -1518,7 +1594,7 @@ EditorRoutes::move_selected_tracks (bool up)
 					done = true;
 				}
 
-				view_routes.erase (leading);
+				view_stripables.erase (leading);
 
 				if (done) {
 					break;
@@ -1527,7 +1603,7 @@ EditorRoutes::move_selected_tracks (bool up)
 				leading = tmp;
 
 			} else {
-				if (leading == view_routes.begin()) {
+				if (leading == view_stripables.begin()) {
 					break;
 				}
 				--leading;
@@ -1536,26 +1612,24 @@ EditorRoutes::move_selected_tracks (bool up)
 		};
 	}
 
-	for (leading = view_routes.begin(); leading != view_routes.end(); ++leading) {
-		uint32_t order = leading->second->order_key ();
-		neworder.push_back (order);
-	}
+	for (leading = view_stripables.begin(); leading != view_stripables.end(); ++leading) {
+		neworder.push_back (leading->old_order);
+#ifndef NDEBUG
+		if (leading->old_order != neworder.size() - 1) {
+			DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("move %1 to %2\n", leading->old_order, neworder.size() - 1));
+		}
+#endif
 
+	}
 #ifndef NDEBUG
 	DEBUG_TRACE (DEBUG::OrderKeys, "New order after moving tracks:\n");
 	for (vector<int>::iterator i = neworder.begin(); i != neworder.end(); ++i) {
 		DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("\t%1\n", *i));
 	}
 	DEBUG_TRACE (DEBUG::OrderKeys, "-------\n");
-
-	for (vector<int>::iterator i = neworder.begin(); i != neworder.end(); ++i) {
-		if (*i >= (int) neworder.size()) {
-			cerr << "Trying to move something to " << *i << " of " << neworder.size() << endl;
-		}
-		assert (*i < (int) neworder.size ());
-	}
 #endif
 
+
 	_model->reorder (neworder);
 }
 
@@ -1566,10 +1640,10 @@ EditorRoutes::update_input_active_display ()
 	TreeModel::Children::iterator i;
 
 	for (i = rows.begin(); i != rows.end(); ++i) {
-		boost::shared_ptr<Route> route = (*i)[_columns.route];
+		boost::shared_ptr<Stripable> stripable = (*i)[_columns.stripable];
 
-		if (boost::dynamic_pointer_cast<Track> (route)) {
-			boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (route);
+		if (boost::dynamic_pointer_cast<Track> (stripable)) {
+			boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (stripable);
 
 			if (mt) {
 				(*i)[_columns.is_input_active] = mt->input_active();
@@ -1581,7 +1655,7 @@ EditorRoutes::update_input_active_display ()
 void
 EditorRoutes::update_rec_display ()
 {
-	if (g_atomic_int_compare_and_exchange (&_queue_tv_update, 0, 1)) {
+	if (g_atomic_int_compare_and_exchange (const_cast<gint*>(&_queue_tv_update), 0, 1)) {
 		Glib::signal_idle().connect (sigc::mem_fun (*this, &EditorRoutes::idle_update_mute_rec_solo_etc));
 	}
 }
@@ -1589,21 +1663,29 @@ EditorRoutes::update_rec_display ()
 bool
 EditorRoutes::idle_update_mute_rec_solo_etc()
 {
-	g_atomic_int_set (&_queue_tv_update, 0);
+	g_atomic_int_set (const_cast<gint*>(&_queue_tv_update), 0);
 	TreeModel::Children rows = _model->children();
 	TreeModel::Children::iterator i;
 
 	for (i = rows.begin(); i != rows.end(); ++i) {
-		boost::shared_ptr<Route> route = (*i)[_columns.route];
-		(*i)[_columns.mute_state] = RouteUI::mute_active_state (_session, route);
-		(*i)[_columns.solo_state] = RouteUI::solo_active_state (route);
-		(*i)[_columns.solo_isolate_state] = RouteUI::solo_isolate_active_state (route) ? 1 : 0;
-		(*i)[_columns.solo_safe_state] = RouteUI::solo_safe_active_state (route) ? 1 : 0;
-		(*i)[_columns.active] = route->active ();
-		if (boost::dynamic_pointer_cast<Track> (route)) {
+		boost::shared_ptr<Stripable> stripable = (*i)[_columns.stripable];
+		boost::shared_ptr<Route> route = boost::dynamic_pointer_cast<Route> (stripable);
+		(*i)[_columns.mute_state] = RouteUI::mute_active_state (_session, stripable);
+		(*i)[_columns.solo_state] = RouteUI::solo_active_state (stripable);
+		(*i)[_columns.solo_isolate_state] = RouteUI::solo_isolate_active_state (stripable) ? 1 : 0;
+		(*i)[_columns.solo_safe_state] = RouteUI::solo_safe_active_state (stripable) ? 1 : 0;
+		if (route) {
+			(*i)[_columns.active] = route->active ();
+		} else {
+			(*i)[_columns.active] = true;
+		}
+
+		boost::shared_ptr<Track> trk (boost::dynamic_pointer_cast<Track>(route));
+
+		if (trk) {
 			boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (route);
 
-			if (route->record_enabled()) {
+			if (trk->rec_enable_control()->get_value()) {
 				if (_session->record_status() == Session::Recording) {
 					(*i)[_columns.rec_state] = 1;
 				} else {
@@ -1615,7 +1697,8 @@ EditorRoutes::idle_update_mute_rec_solo_etc()
 				(*i)[_columns.rec_state] = 0;
 			}
 
-			(*i)[_columns.name_editable] = !route->record_enabled ();
+			(*i)[_columns.rec_safe] = trk->rec_safe_control()->get_value();
+			(*i)[_columns.name_editable] = !trk->rec_enable_control()->get_value();
 		}
 	}
 
@@ -1626,7 +1709,7 @@ EditorRoutes::idle_update_mute_rec_solo_etc()
 void
 EditorRoutes::update_mute_display ()
 {
-	if (g_atomic_int_compare_and_exchange (&_queue_tv_update, 0, 1)) {
+	if (g_atomic_int_compare_and_exchange (const_cast<gint*>(&_queue_tv_update), 0, 1)) {
 		Glib::signal_idle().connect (sigc::mem_fun (*this, &EditorRoutes::idle_update_mute_rec_solo_etc));
 	}
 }
@@ -1634,7 +1717,7 @@ EditorRoutes::update_mute_display ()
 void
 EditorRoutes::update_solo_display ()
 {
-	if (g_atomic_int_compare_and_exchange (&_queue_tv_update, 0, 1)) {
+	if (g_atomic_int_compare_and_exchange (const_cast<gint*>(&_queue_tv_update), 0, 1)) {
 		Glib::signal_idle().connect (sigc::mem_fun (*this, &EditorRoutes::idle_update_mute_rec_solo_etc));
 	}
 }
@@ -1642,7 +1725,7 @@ EditorRoutes::update_solo_display ()
 void
 EditorRoutes::update_solo_isolate_display ()
 {
-	if (g_atomic_int_compare_and_exchange (&_queue_tv_update, 0, 1)) {
+	if (g_atomic_int_compare_and_exchange (const_cast<gint*>(&_queue_tv_update), 0, 1)) {
 		Glib::signal_idle().connect (sigc::mem_fun (*this, &EditorRoutes::idle_update_mute_rec_solo_etc));
 	}
 }
@@ -1650,7 +1733,7 @@ EditorRoutes::update_solo_isolate_display ()
 void
 EditorRoutes::update_solo_safe_display ()
 {
-	if (g_atomic_int_compare_and_exchange (&_queue_tv_update, 0, 1)) {
+	if (g_atomic_int_compare_and_exchange (const_cast<gint*>(&_queue_tv_update), 0, 1)) {
 		Glib::signal_idle().connect (sigc::mem_fun (*this, &EditorRoutes::idle_update_mute_rec_solo_etc));
 	}
 }
@@ -1699,10 +1782,10 @@ EditorRoutes::name_edit (std::string const & path, std::string const & new_text)
 		return;
 	}
 
-	boost::shared_ptr<Route> route = (*iter)[_columns.route];
+	boost::shared_ptr<Stripable> stripable = (*iter)[_columns.stripable];
 
-	if (route && route->name() != new_text) {
-		route->set_name (new_text);
+	if (stripable && stripable->name() != new_text) {
+		stripable->set_name (new_text);
 	}
 }
 
@@ -1719,7 +1802,7 @@ EditorRoutes::show_tracks_with_regions_at_playhead ()
 
 	set<TimeAxisView*> show;
 	for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
-		TimeAxisView* tav = _editor->axis_view_from_route (*i);
+		TimeAxisView* tav = _editor->axis_view_from_stripable (*i);
 		if (tav) {
 			show.insert (tav);
 		}
@@ -1739,5 +1822,12 @@ EditorRoutes::show_tracks_with_regions_at_playhead ()
 	/* force route order keys catch up with visibility changes
 	 */
 
-	sync_order_keys_from_treeview ();
+	sync_presentation_info_from_treeview ();
+}
+
+int
+EditorRoutes::plugin_setup (boost::shared_ptr<Route> r, boost::shared_ptr<PluginInsert> pi, ARDOUR::Route::PluginSetupOptions flags)
+{
+	PluginSetupDialog psd (r, pi, flags);
+	return psd.run ();
 }
diff --git a/gtk2_ardour/editor_routes.h b/gtk2_ardour/editor_routes.h
index bee3737..29e8b45 100644
--- a/gtk2_ardour/editor_routes.h
+++ b/gtk2_ardour/editor_routes.h
@@ -22,8 +22,11 @@
 
 #include "pbd/signals.h"
 #include "gtkmm2ext/widget_state.h"
+
 #include "editor_component.h"
 
+class VCATimeAxisView;
+
 class EditorRoutes : public EditorComponent, public PBD::ScopedConnectionList, public ARDOUR::SessionHandlePtr
 {
 public:
@@ -55,33 +58,33 @@ public:
 
 	void redisplay ();
 	void update_visibility ();
-	void routes_added (std::list<RouteTimeAxisView*> routes);
+	void time_axis_views_added (std::list<TimeAxisView*>);
 	void route_removed (TimeAxisView *);
 	void hide_track_in_display (TimeAxisView &);
 	std::list<TimeAxisView*> views () const;
 	void hide_all_tracks (bool);
 	void clear ();
-	void sync_order_keys_from_treeview ();
-	void reset_remote_control_ids ();
+	void sync_presentation_info_from_treeview ();
 
 private:
 	void initial_display ();
 	void redisplay_real ();
 	void on_input_active_changed (std::string const &);
 	void on_tv_rec_enable_changed (std::string const &);
+	void on_tv_rec_safe_toggled (std::string const &);
 	void on_tv_mute_enable_toggled (std::string const &);
 	void on_tv_solo_enable_toggled (std::string const &);
 	void on_tv_solo_isolate_toggled (std::string const &);
 	void on_tv_solo_safe_toggled (std::string const &);
 	void build_menu ();
 	void show_menu ();
-	void sync_treeview_from_order_keys ();
+	void sync_treeview_from_presentation_info ();
 	void row_deleted (Gtk::TreeModel::Path const &);
 	void visible_changed (std::string const &);
 	void active_changed (std::string const &);
 	void reordered (Gtk::TreeModel::Path const &, Gtk::TreeModel::iterator const &, int *);
 	bool button_press (GdkEventButton *);
-	void route_property_changed (const PBD::PropertyChange&, boost::weak_ptr<ARDOUR::Route>);
+	void route_property_changed (const PBD::PropertyChange&, boost::weak_ptr<ARDOUR::Stripable>);
 	void handle_gui_changes (std::string const &, void *);
 	bool idle_update_mute_rec_solo_etc ();
 	void update_rec_display ();
@@ -104,6 +107,8 @@ private:
 	void show_tracks_with_regions_at_playhead ();
 	void selection_changed ();
 
+	int plugin_setup (boost::shared_ptr<ARDOUR::Route>, boost::shared_ptr<ARDOUR::PluginInsert>, ARDOUR::Route::PluginSetupOptions);
+
 	void display_drag_data_received (
 		Glib::RefPtr<Gdk::DragContext> const &, gint, gint, Gtk::SelectionData const &, guint, guint
 		);
@@ -117,6 +122,7 @@ private:
 			add (text);
 			add (visible);
 			add (rec_state);
+			add (rec_safe);
 			add (mute_state);
 			add (solo_state);
 			add (solo_visible);
@@ -124,7 +130,7 @@ private:
 			add (solo_safe_state);
 			add (is_track);
 			add (tv);
-			add (route);
+			add (stripable);
 			add (name_editable);
 			add (is_input_active);
 			add (is_midi);
@@ -134,6 +140,7 @@ private:
 		Gtk::TreeModelColumn<std::string>    text;
 		Gtk::TreeModelColumn<bool>           visible;
 		Gtk::TreeModelColumn<uint32_t>       rec_state;
+		Gtk::TreeModelColumn<uint32_t>       rec_safe;
 		Gtk::TreeModelColumn<uint32_t>       mute_state;
 		Gtk::TreeModelColumn<uint32_t>       solo_state;
 		/** true if the solo buttons are visible for this route, otherwise false */
@@ -142,7 +149,7 @@ private:
 		Gtk::TreeModelColumn<uint32_t>       solo_safe_state;
 		Gtk::TreeModelColumn<bool>           is_track;
 		Gtk::TreeModelColumn<TimeAxisView*>  tv;
-		Gtk::TreeModelColumn<boost::shared_ptr<ARDOUR::Route> >  route;
+		Gtk::TreeModelColumn<boost::shared_ptr<ARDOUR::Stripable> >  stripable;
 		Gtk::TreeModelColumn<bool>           name_editable;
 		Gtk::TreeModelColumn<bool>           is_input_active;
 		Gtk::TreeModelColumn<bool>           is_midi;
diff --git a/gtk2_ardour/editor_rulers.cc b/gtk2_ardour/editor_rulers.cc
index ae646a5..868b006 100644
--- a/gtk2_ardour/editor_rulers.cc
+++ b/gtk2_ardour/editor_rulers.cc
@@ -53,7 +53,7 @@
 #include "editor_cursors.h"
 #include "ui_config.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 using namespace PBD;
@@ -313,7 +313,7 @@ Editor::store_ruler_visibility ()
 void
 Editor::restore_ruler_visibility ()
 {
-	XMLProperty* prop;
+	XMLProperty const * prop;
 	XMLNode * node = _session->extra_xml (X_("RulerVisibility"));
 
 	no_ruler_shown_update = true;
@@ -439,7 +439,7 @@ Editor::update_ruler_visibility ()
 	double tbgpos = 0.0;
 	double old_unit_pos;
 
-#ifdef GTKOSX
+#ifdef __APPLE__
 	/* gtk update probs require this (damn) */
 	meter_label.hide();
 	tempo_label.hide();
@@ -540,7 +540,7 @@ Editor::update_ruler_visibility ()
 		tempo_label.hide();
 	}
 
-	if (!Profile->get_sae() && ruler_range_action->get_active()) {
+	if (ruler_range_action->get_active()) {
 		old_unit_pos = range_marker_group->position().y;
 		if (tbpos != old_unit_pos) {
 			range_marker_group->move (ArdourCanvas::Duple (0.0, tbpos - old_unit_pos));
@@ -710,15 +710,13 @@ Editor::update_fixed_rulers ()
 }
 
 void
-Editor::update_tempo_based_rulers (ARDOUR::TempoMap::BBTPointList::const_iterator& begin,
-				    ARDOUR::TempoMap::BBTPointList::const_iterator& end)
+Editor::update_tempo_based_rulers (std::vector<TempoMap::BBTPoint>& grid)
 {
 	if (_session == 0) {
 		return;
 	}
 
-	compute_bbt_ruler_scale (leftmost_frame, leftmost_frame+current_page_samples(),
-				 begin, end);
+	compute_bbt_ruler_scale (grid, leftmost_frame, leftmost_frame+current_page_samples());
 
 	_bbt_metric->units_per_pixel = samples_per_pixel;
 
@@ -1011,19 +1009,25 @@ Editor::metric_get_timecode (std::vector<ArdourCanvas::Ruler::Mark>& marks, gdou
 }
 
 void
-Editor::compute_bbt_ruler_scale (framepos_t lower, framepos_t upper,
-				 ARDOUR::TempoMap::BBTPointList::const_iterator begin,
-				 ARDOUR::TempoMap::BBTPointList::const_iterator end)
+Editor::compute_bbt_ruler_scale (std::vector<ARDOUR::TempoMap::BBTPoint>& grid, framepos_t lower, framepos_t upper)
 {
 	if (_session == 0) {
 		return;
 	}
 
-	TempoMap::BBTPointList::const_iterator i;
+	std::vector<TempoMap::BBTPoint>::const_iterator i;
 	Timecode::BBT_Time lower_beat, upper_beat; // the beats at each end of the ruler
+	double floor_lower_beat = floor(_session->tempo_map().beat_at_frame (lower));
 
-	_session->bbt_time (lower, lower_beat);
-	_session->bbt_time (upper, upper_beat);
+	if (floor_lower_beat < 0.0) {
+		floor_lower_beat = 0.0;
+	}
+
+	const framecnt_t beat_before_lower_pos = _session->tempo_map().frame_at_beat (floor_lower_beat);
+	const framecnt_t beat_after_upper_pos = _session->tempo_map().frame_at_beat (floor (_session->tempo_map().beat_at_frame (upper)) + 1.0);
+
+	_session->bbt_time (beat_before_lower_pos, lower_beat);
+	_session->bbt_time (beat_after_upper_pos, upper_beat);
 	uint32_t beats = 0;
 
 	bbt_accent_modulo = 1;
@@ -1103,44 +1107,46 @@ Editor::compute_bbt_ruler_scale (framepos_t lower, framepos_t upper,
                 bbt_beat_subdivision = 4;
 		break;
 	}
-
-	if (distance (begin, end) == 0) {
+	if (distance (grid.begin(), grid.end()) == 0) {
 		return;
 	}
 
-	i = end;
+	i = grid.end();
 	i--;
-	if ((*i).beat >= (*begin).beat) {
-		bbt_bars = (*i).bar - (*begin).bar;
+
+	/* XX ?? */
+	if ((*i).beat >= (*grid.begin()).beat) {
+		bbt_bars = (*i).bar - (*grid.begin()).bar;
 	} else {
-		bbt_bars = (*i).bar - (*begin).bar - 1;
+		bbt_bars = (*i).bar - (*grid.begin()).bar;
 	}
-	beats = distance (begin, end) - bbt_bars;
 
+	beats = distance (grid.begin(), grid.end()) - bbt_bars;
+	double beat_density = ((distance (grid.begin(), grid.end()) + 1) * ((double) (upper - lower) / (double) (1 + grid.back().frame - grid.front().frame))) / 5.0;
 	/* Only show the bar helper if there aren't many bars on the screen */
 	if ((bbt_bars < 2) || (beats < 5)) {
 	        bbt_bar_helper_on = true;
 	}
 
-	if (bbt_bars > 8192) {
-		bbt_ruler_scale =  bbt_show_many;
-	} else if (bbt_bars > 1024) {
+	if (beat_density > 8192) {
+		bbt_ruler_scale = bbt_show_many;
+	} else if (beat_density > 1024) {
 		bbt_ruler_scale = bbt_show_64;
-	} else if (bbt_bars > 256) {
+	} else if (beat_density > 512) {
 		bbt_ruler_scale = bbt_show_16;
-	} else if (bbt_bars > 64) {
+	} else if (beat_density > 128) {
 		bbt_ruler_scale = bbt_show_4;
-	} else if (bbt_bars > 10) {
+	} else if (beat_density > 16) {
 		bbt_ruler_scale =  bbt_show_1;
-	} else if (bbt_bars > 2) {
+	} else if (beat_density > 2) {
 		bbt_ruler_scale =  bbt_show_beats;
-	} else  if (bbt_bars > 0) {
+	} else  if (beat_density > 0.5) {
 		bbt_ruler_scale =  bbt_show_ticks;
 	} else {
 		bbt_ruler_scale =  bbt_show_ticks_detail;
 	}
 
-	if ((bbt_ruler_scale == bbt_show_ticks_detail) && (lower_beat.beats == upper_beat.beats) && (upper_beat.ticks - lower_beat.ticks <= Timecode::BBT_Time::ticks_per_beat / 4)) {
+	if ((bbt_ruler_scale == bbt_show_ticks_detail) && beats < 3) {
 		bbt_ruler_scale =  bbt_show_ticks_super_detail;
 	}
 }
@@ -1161,38 +1167,34 @@ Editor::metric_get_bbt (std::vector<ArdourCanvas::Ruler::Mark>& marks, gdouble l
 		return;
 	}
 
-	TempoMap::BBTPointList::const_iterator i;
+	std::vector<TempoMap::BBTPoint>::const_iterator i;
 
 	char buf[64];
 	gint  n = 0;
 	framepos_t pos;
 	Timecode::BBT_Time next_beat;
-	framepos_t next_beat_pos;
 	uint32_t beats = 0;
 	uint32_t tick = 0;
 	uint32_t skip;
 	uint32_t t;
-	framepos_t frame_skip;
-	double frame_skip_error;
 	double bbt_position_of_helper;
-	double accumulated_error;
 	bool i_am_accented = false;
 	bool helper_active = false;
 	ArdourCanvas::Ruler::Mark mark;
 
-	ARDOUR::TempoMap::BBTPointList::const_iterator begin;
-	ARDOUR::TempoMap::BBTPointList::const_iterator end;
+	std::vector<TempoMap::BBTPoint> grid;
 
-	compute_current_bbt_points (lower, upper, begin, end);
+	compute_current_bbt_points (grid, lower, upper);
 
-	if (distance (begin, end) == 0) {
+	if (distance (grid.begin(), grid.end()) == 0) {
 		return;
 	}
 
 	switch (bbt_ruler_scale) {
 
 	case bbt_show_beats:
-		beats = distance (begin, end);
+
+		beats = distance (grid.begin(), grid.end());
 		bbt_nmarks = beats + 2;
 
 		mark.label = "";
@@ -1200,7 +1202,7 @@ Editor::metric_get_bbt (std::vector<ArdourCanvas::Ruler::Mark>& marks, gdouble l
 		mark.style = ArdourCanvas::Ruler::Mark::Micro;
 		marks.push_back (mark);
 
-		for (n = 1, i = begin; n < bbt_nmarks && i != end; ++i) {
+		for (n = 1, i = grid.begin(); n < bbt_nmarks && i != grid.end(); ++i) {
 
 			if ((*i).frame < lower && (bbt_bar_helper_on)) {
 				snprintf (buf, sizeof(buf), "<%" PRIu32 "|%" PRIu32, (*i).bar, (*i).beat);
@@ -1228,7 +1230,7 @@ Editor::metric_get_bbt (std::vector<ArdourCanvas::Ruler::Mark>& marks, gdouble l
 
 	case bbt_show_ticks:
 
-		beats = distance (begin, end);
+		beats = distance (grid.begin(), grid.end());
 		bbt_nmarks = (beats + 2) * bbt_beat_subdivision;
 
 		bbt_position_of_helper = lower + (30 * Editor::get_current_zoom ());
@@ -1240,7 +1242,7 @@ Editor::metric_get_bbt (std::vector<ArdourCanvas::Ruler::Mark>& marks, gdouble l
 		mark.style = ArdourCanvas::Ruler::Mark::Micro;
 		marks.push_back (mark);
 
-		for (n = 1, i = begin; n < bbt_nmarks && i != end; ++i) {
+		for (n = 1, i = grid.begin(); n < bbt_nmarks && i != grid.end(); ++i) {
 
 			if ((*i).frame < lower && (bbt_bar_helper_on)) {
 				snprintf (buf, sizeof(buf), "<%" PRIu32 "|%" PRIu32, (*i).bar, (*i).beat);
@@ -1265,45 +1267,20 @@ Editor::metric_get_bbt (std::vector<ArdourCanvas::Ruler::Mark>& marks, gdouble l
 			}
 
 			/* Add the tick marks */
+			skip = Timecode::BBT_Time::ticks_per_beat / bbt_beat_subdivision;
+			tick = skip; // the first non-beat tick
+			t = 0;
+			while (tick < Timecode::BBT_Time::ticks_per_beat && (n < bbt_nmarks)) {
 
-			/* Find the next beat */
-			next_beat.beats = (*i).beat;
-			next_beat.bars = (*i).bar;
-			next_beat.ticks = 0;
-
-			if ((*i).meter->divisions_per_bar() > (next_beat.beats + 1)) {
-				  next_beat.beats += 1;
-			} else {
-				  next_beat.bars += 1;
-				  next_beat.beats = 1;
-			}
-
-			next_beat_pos = _session->tempo_map().frame_time(next_beat);
-
-			frame_skip = (framepos_t) floor (frame_skip_error = (_session->frame_rate() *  60) / (bbt_beat_subdivision * (*i).tempo->beats_per_minute()));
-			frame_skip_error -= frame_skip;
-			skip = (uint32_t) (Timecode::BBT_Time::ticks_per_beat / bbt_beat_subdivision);
-
-			pos = (*i).frame + frame_skip;
-			accumulated_error = frame_skip_error;
-
-			tick = skip;
+				next_beat.beats = (*i).beat;
+				next_beat.bars = (*i).bar;
+				next_beat.ticks = tick;
+				pos = _session->tempo_map().frame_at_bbt (next_beat);
 
-			for (t = 0; (tick < Timecode::BBT_Time::ticks_per_beat) && (n < bbt_nmarks) && (pos < next_beat_pos) ; pos += frame_skip, tick += skip, ++t) {
-
-			        if (t % bbt_accent_modulo == (bbt_accent_modulo - 1)) {
+				if (t % bbt_accent_modulo == (bbt_accent_modulo - 1)) {
 					i_am_accented = true;
 				}
-
 				mark.label = "";
-
-				/* Error compensation for float to framepos_t*/
-				accumulated_error += frame_skip_error;
-				if (accumulated_error > 1) {
-					pos += 1;
-					accumulated_error -= 1.0f;
-				}
-
 				mark.position = pos;
 
 				if ((bbt_beat_subdivision > 4) && i_am_accented) {
@@ -1313,7 +1290,10 @@ Editor::metric_get_bbt (std::vector<ArdourCanvas::Ruler::Mark>& marks, gdouble l
 				}
 				i_am_accented = false;
 				marks.push_back (mark);
-				n++;
+
+				tick += skip;
+				++t;
+				++n;
 			}
 		}
 
@@ -1321,17 +1301,17 @@ Editor::metric_get_bbt (std::vector<ArdourCanvas::Ruler::Mark>& marks, gdouble l
 
 	case bbt_show_ticks_detail:
 
-		beats = distance (begin, end);
+		beats = distance (grid.begin(), grid.end());
 		bbt_nmarks = (beats + 2) * bbt_beat_subdivision;
 
-		bbt_position_of_helper = lower + (30 * Editor::get_current_zoom ());
+		bbt_position_of_helper = lower + (3 * Editor::get_current_zoom ());
 
 		mark.label = "";
 		mark.position = lower;
 		mark.style = ArdourCanvas::Ruler::Mark::Micro;
 		marks.push_back (mark);
 
-		for (n = 1,   i = begin; n < bbt_nmarks && i != end; ++i) {
+		for (n = 1,   i = grid.begin(); n < bbt_nmarks && i != grid.end(); ++i) {
 
 			if ((*i).frame < lower && (bbt_bar_helper_on)) {
 			        snprintf (buf, sizeof(buf), "<%" PRIu32 "|%" PRIu32, (*i).bar, (*i).beat);
@@ -1356,36 +1336,20 @@ Editor::metric_get_bbt (std::vector<ArdourCanvas::Ruler::Mark>& marks, gdouble l
 			}
 
 			/* Add the tick marks */
+			skip = Timecode::BBT_Time::ticks_per_beat / bbt_beat_subdivision;
+			tick = skip; // the first non-beat tick
 
-			/* Find the next beat */
-
-			next_beat.beats = (*i).beat;
-			next_beat.bars = (*i).bar;
-
-			if ((*i).meter->divisions_per_bar() > (next_beat.beats + 1)) {
-				  next_beat.beats += 1;
-			} else {
-				  next_beat.bars += 1;
-				  next_beat.beats = 1;
-			}
-
-			next_beat_pos = _session->tempo_map().frame_time(next_beat);
-
-			frame_skip = (framepos_t) floor (frame_skip_error = (_session->frame_rate() *  60) / (bbt_beat_subdivision * (*i).tempo->beats_per_minute()));
-			frame_skip_error -= frame_skip;
-			skip = (uint32_t) (Timecode::BBT_Time::ticks_per_beat / bbt_beat_subdivision);
-
-			pos = (*i).frame + frame_skip;
-			accumulated_error = frame_skip_error;
+			t = 0;
+			while (tick < Timecode::BBT_Time::ticks_per_beat && (n < bbt_nmarks)) {
 
-			tick = skip;
+				next_beat.beats = (*i).beat;
+				next_beat.bars = (*i).bar;
+				next_beat.ticks = tick;
+				pos = _session->tempo_map().frame_at_bbt (next_beat);
 
-			for (t = 0; (tick < Timecode::BBT_Time::ticks_per_beat) && (n < bbt_nmarks) && (pos < next_beat_pos) ; pos += frame_skip, tick += skip, ++t) {
-
-			        if (t % bbt_accent_modulo == (bbt_accent_modulo - 1)) {
-				        i_am_accented = true;
+				if (t % bbt_accent_modulo == (bbt_accent_modulo - 1)) {
+					i_am_accented = true;
 				}
-
 				if (i_am_accented && (pos > bbt_position_of_helper)){
 				        snprintf (buf, sizeof(buf), "%" PRIu32, tick);
 				} else {
@@ -1393,14 +1357,6 @@ Editor::metric_get_bbt (std::vector<ArdourCanvas::Ruler::Mark>& marks, gdouble l
 				}
 
 				mark.label = buf;
-
-				/* Error compensation for float to framepos_t*/
-				accumulated_error += frame_skip_error;
-				if (accumulated_error > 1) {
-				        pos += 1;
-					accumulated_error -= 1.0f;
-				}
-
 				mark.position = pos;
 
 				if ((bbt_beat_subdivision > 4) && i_am_accented) {
@@ -1409,7 +1365,11 @@ Editor::metric_get_bbt (std::vector<ArdourCanvas::Ruler::Mark>& marks, gdouble l
 					mark.style = ArdourCanvas::Ruler::Mark::Micro;
 				}
 				i_am_accented = false;
-				n++;
+				marks.push_back (mark);
+
+				tick += skip;
+				++t;
+				++n;
 			}
 		}
 
@@ -1417,17 +1377,17 @@ Editor::metric_get_bbt (std::vector<ArdourCanvas::Ruler::Mark>& marks, gdouble l
 
 	case bbt_show_ticks_super_detail:
 
-		beats = distance (begin, end);
+		beats = distance (grid.begin(), grid.end());
 		bbt_nmarks = (beats + 2) * bbt_beat_subdivision;
 
-		bbt_position_of_helper = lower + (30 * Editor::get_current_zoom ());
+		bbt_position_of_helper = lower + (3 * Editor::get_current_zoom ());
 
 		mark.label = "";
 		mark.position = lower;
 		mark.style = ArdourCanvas::Ruler::Mark::Micro;
 		marks.push_back (mark);
 
-		for (n = 1,   i = begin; n < bbt_nmarks && i != end; ++i) {
+		for (n = 1,   i = grid.begin(); n < bbt_nmarks && i != grid.end(); ++i) {
 
 			if ((*i).frame < lower && (bbt_bar_helper_on)) {
 				  snprintf (buf, sizeof(buf), "<%" PRIu32 "|%" PRIu32, (*i).bar, (*i).beat);
@@ -1452,61 +1412,40 @@ Editor::metric_get_bbt (std::vector<ArdourCanvas::Ruler::Mark>& marks, gdouble l
 			}
 
 			/* Add the tick marks */
-
-			/* Find the next beat */
+			skip = Timecode::BBT_Time::ticks_per_beat / bbt_beat_subdivision;
 
 			next_beat.beats = (*i).beat;
 			next_beat.bars = (*i).bar;
+			tick = skip; // the first non-beat tick
+			t = 0;
+			while (tick < Timecode::BBT_Time::ticks_per_beat && (n < bbt_nmarks)) {
 
-			if ((*i).meter->divisions_per_bar() > (next_beat.beats + 1)) {
-				  next_beat.beats += 1;
-			} else {
-				  next_beat.bars += 1;
-				  next_beat.beats = 1;
-			}
-
-			next_beat_pos = _session->tempo_map().frame_time(next_beat);
-
-			frame_skip = (framepos_t) floor (frame_skip_error = (_session->frame_rate() *  60) / (bbt_beat_subdivision * (*i).tempo->beats_per_minute()));
-			frame_skip_error -= frame_skip;
-			skip = (uint32_t) (Timecode::BBT_Time::ticks_per_beat / bbt_beat_subdivision);
-
-			pos = (*i).frame + frame_skip;
-			accumulated_error = frame_skip_error;
-
-			tick = skip;
-
-			for (t = 0; (tick < Timecode::BBT_Time::ticks_per_beat) && (n < bbt_nmarks) && (pos < next_beat_pos) ; pos += frame_skip, tick += skip, ++t) {
-
-				  if (t % bbt_accent_modulo == (bbt_accent_modulo - 1)) {
-					  i_am_accented = true;
-				  }
-
-				  if (pos > bbt_position_of_helper) {
- 					  snprintf (buf, sizeof(buf), "%" PRIu32, tick);
-				  } else {
-					  buf[0] = '\0';
-				  }
+				next_beat.ticks = tick;
+				pos = _session->tempo_map().frame_at_bbt (next_beat);
+				if (t % bbt_accent_modulo == (bbt_accent_modulo - 1)) {
+					i_am_accented = true;
+				}
 
-				  mark.label = buf;
+				if (pos > bbt_position_of_helper) {
+					snprintf (buf, sizeof(buf), "%" PRIu32, tick);
+				} else {
+					buf[0] = '\0';
+				}
 
-				  /* Error compensation for float to framepos_t*/
-				  accumulated_error += frame_skip_error;
-				  if (accumulated_error > 1) {
-					  pos += 1;
-					  accumulated_error -= 1.0f;
-				  }
+				mark.label = buf;
+				mark.position = pos;
 
-				  mark.position = pos;
+				if ((bbt_beat_subdivision > 4) && i_am_accented) {
+					mark.style = ArdourCanvas::Ruler::Mark::Minor;
+				} else {
+					mark.style = ArdourCanvas::Ruler::Mark::Micro;
+				}
+				i_am_accented = false;
+				marks.push_back (mark);
 
-				  if ((bbt_beat_subdivision > 4) && i_am_accented) {
-					  mark.style = ArdourCanvas::Ruler::Mark::Minor;
-				  } else {
-					  mark.style = ArdourCanvas::Ruler::Mark::Micro;
-				  }
-				  i_am_accented = false;
-				  marks.push_back (mark);
-				  n++;
+				tick += skip;
+				++t;
+				++n;
 			}
 		}
 
@@ -1523,7 +1462,7 @@ Editor::metric_get_bbt (std::vector<ArdourCanvas::Ruler::Mark>& marks, gdouble l
 
 	case bbt_show_64:
         		bbt_nmarks = (gint) (bbt_bars / 64) + 1;
-			for (n = 0,   i = begin; i != end && n < bbt_nmarks; i++) {
+			for (n = 0,   i = grid.begin(); i != grid.end() && n < bbt_nmarks; i++) {
 				if ((*i).is_bar()) {
 					if ((*i).bar % 64 == 1) {
 						if ((*i).bar % 256 == 1) {
@@ -1548,7 +1487,7 @@ Editor::metric_get_bbt (std::vector<ArdourCanvas::Ruler::Mark>& marks, gdouble l
 
 	case bbt_show_16:
        		bbt_nmarks = (bbt_bars / 16) + 1;
-		for (n = 0,  i = begin; i != end && n < bbt_nmarks; i++) {
+		for (n = 0,  i = grid.begin(); i != grid.end() && n < bbt_nmarks; i++) {
 		        if ((*i).is_bar()) {
 			  if ((*i).bar % 16 == 1) {
 			        if ((*i).bar % 64 == 1) {
@@ -1573,7 +1512,7 @@ Editor::metric_get_bbt (std::vector<ArdourCanvas::Ruler::Mark>& marks, gdouble l
 
 	case bbt_show_4:
 		bbt_nmarks = (bbt_bars / 4) + 1;
-		for (n = 0,   i = begin; i != end && n < bbt_nmarks; ++i) {
+		for (n = 0,   i = grid.begin(); i != grid.end() && n < bbt_nmarks; ++i) {
 		        if ((*i).is_bar()) {
 			  if ((*i).bar % 4 == 1) {
 			        if ((*i).bar % 16 == 1) {
@@ -1599,7 +1538,7 @@ Editor::metric_get_bbt (std::vector<ArdourCanvas::Ruler::Mark>& marks, gdouble l
 	case bbt_show_1:
 //	default:
 	        bbt_nmarks = bbt_bars + 2;
-		for (n = 0,  i = begin; i != end && n < bbt_nmarks; ++i) {
+		for (n = 0,  i = grid.begin(); i != grid.end() && n < bbt_nmarks; ++i) {
 		        if ((*i).is_bar()) {
 			  if ((*i).bar % 4 == 1) {
 				        snprintf (buf, sizeof(buf), "%" PRIu32, (*i).bar);
diff --git a/gtk2_ardour/editor_selection.cc b/gtk2_ardour/editor_selection.cc
index afddfad..c5ba764 100644
--- a/gtk2_ardour/editor_selection.cc
+++ b/gtk2_ardour/editor_selection.cc
@@ -43,7 +43,7 @@
 #include "midi_region_view.h"
 #include "sfdb_ui.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
@@ -621,7 +621,7 @@ Editor::set_selected_regionview_from_click (bool press, Selection::Operation op)
 				if (press) {
 
 					if (selection->selected (clicked_routeview)) {
-						get_equivalent_regions (clicked_regionview, all_equivalent_regions, ARDOUR::Properties::select.property_id);
+						get_equivalent_regions (clicked_regionview, all_equivalent_regions, ARDOUR::Properties::group_select.property_id);
 					} else {
 						all_equivalent_regions.push_back (clicked_regionview);
 					}
@@ -639,7 +639,7 @@ Editor::set_selected_regionview_from_click (bool press, Selection::Operation op)
 
 		case Selection::Set:
 			if (!selection->selected (clicked_regionview)) {
-				get_equivalent_regions (clicked_regionview, all_equivalent_regions, ARDOUR::Properties::select.property_id);
+				get_equivalent_regions (clicked_regionview, all_equivalent_regions, ARDOUR::Properties::group_select.property_id);
 				selection->set (all_equivalent_regions);
 				commit = true;
 			} else {
@@ -649,7 +649,7 @@ Editor::set_selected_regionview_from_click (bool press, Selection::Operation op)
 				else {
 					if (selection->regions.size() > 1) {
 						/* collapse region selection down to just this one region (and its equivalents) */
-						get_equivalent_regions(clicked_regionview, all_equivalent_regions, ARDOUR::Properties::select.property_id);
+						get_equivalent_regions(clicked_regionview, all_equivalent_regions, ARDOUR::Properties::group_select.property_id);
 						selection->set(all_equivalent_regions);
 						commit = true;
 					}
@@ -791,7 +791,7 @@ Editor::set_selected_regionview_from_click (bool press, Selection::Operation op)
 
 					RouteTimeAxisView* closest = 0;
 					int distance = INT_MAX;
-					int key = rtv->route()->order_key ();
+					int key = rtv->route()->presentation_info().order ();
 
 					for (RegionSelection::iterator x = selection->regions.begin(); x != selection->regions.end(); ++x) {
 
@@ -806,7 +806,7 @@ Editor::set_selected_regionview_from_click (bool press, Selection::Operation op)
 							if (result.second) {
 								/* newly added to already_in_selection */
 
-								int d = artv->route()->order_key ();
+								int d = artv->route()->presentation_info().order ();
 
 								d -= key;
 
@@ -822,7 +822,7 @@ Editor::set_selected_regionview_from_click (bool press, Selection::Operation op)
 
 						/* now add all tracks between that one and this one */
 
-						int okey = closest->route()->order_key ();
+						int okey = closest->route()->presentation_info().order ();
 
 						if (okey > key) {
 							swap (okey, key);
@@ -832,7 +832,7 @@ Editor::set_selected_regionview_from_click (bool press, Selection::Operation op)
 							RouteTimeAxisView* artv = dynamic_cast<RouteTimeAxisView*>(*x);
 							if (artv && artv != rtv) {
 
-								int k = artv->route()->order_key ();
+								int k = artv->route()->presentation_info().order ();
 
 								if (k >= okey && k <= key) {
 
@@ -962,6 +962,7 @@ Editor::track_selection_changed ()
 	}
 
 	RouteNotificationListPtr routes (new RouteNotificationList);
+	StripableNotificationListPtr stripables (new StripableNotificationList);
 
 	for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) {
 
@@ -985,6 +986,7 @@ Editor::track_selection_changed ()
 			RouteTimeAxisView* rtav = dynamic_cast<RouteTimeAxisView*> (*i);
 			if (rtav) {
 				routes->push_back (rtav->route());
+				stripables->push_back (rtav->route());
 			}
 		}
 	}
@@ -993,7 +995,7 @@ Editor::track_selection_changed ()
 
 	/* notify control protocols */
 
-	ControlProtocol::TrackSelectionChanged (routes);
+	ControlProtocol::StripableSelectionChanged (stripables);
 
 	if (sfbrowser && _session && !_session->deletion_in_progress()) {
 		uint32_t audio_track_cnt = 0;
@@ -1025,10 +1027,6 @@ Editor::track_selection_changed ()
 void
 Editor::time_selection_changed ()
 {
-	if (Profile->get_sae()) {
-		return;
-	}
-
 	/* XXX this is superficially inefficient. Hide the selection in all
 	 * tracks, then show it in all selected tracks.
 	 *
@@ -1090,7 +1088,6 @@ Editor::sensitize_all_region_actions (bool s)
 void
 Editor::sensitize_the_right_region_actions ()
 {
-
 	RegionSelection rs = get_regions_from_selection_and_entered ();
 	sensitize_all_region_actions (!rs.empty ());
 
@@ -1120,6 +1117,7 @@ Editor::sensitize_the_right_region_actions ()
 	bool have_inactive_fade_out = false;
 	bool have_active_fade_in = false;
 	bool have_active_fade_out = false;
+	bool have_transients = false;
 
 	for (list<RegionView*>::const_iterator i = rs.begin(); i != rs.end(); ++i) {
 
@@ -1175,6 +1173,10 @@ Editor::sensitize_the_right_region_actions ()
 			have_not_at_natural_position = true;
 		}
 
+		if (r->has_transients ()){
+			have_transients = true;
+		}
+
 		if (ar) {
 			if (ar->envelope_active()) {
 				have_envelope_active = true;
@@ -1200,6 +1202,8 @@ Editor::sensitize_the_right_region_actions ()
 		}
 	}
 
+	_region_actions->get_action("split-region-at-transients")->set_sensitive (have_transients);
+
 	if (rs.size() > 1) {
 		_region_actions->get_action("show-region-list-editor")->set_sensitive (false);
 		_region_actions->get_action("show-region-properties")->set_sensitive (false);
@@ -1262,7 +1266,8 @@ Editor::sensitize_the_right_region_actions ()
 
 	} else {
 
-		_region_actions->get_action("analyze-region")->set_sensitive (false);
+		_region_actions->get_action("loudness-analyze-region")->set_sensitive (false);
+		_region_actions->get_action("spectral-analyze-region")->set_sensitive (false);
 		_region_actions->get_action("reset-region-gain-envelopes")->set_sensitive (false);
 		_region_actions->get_action("toggle-region-gain-envelope-active")->set_sensitive (false);
 		_region_actions->get_action("pitch-shift-region")->set_sensitive (false);
@@ -1367,11 +1372,15 @@ Editor::region_selection_changed ()
 	_regions->block_change_connection (false);
 	editor_regions_selection_changed_connection.block(false);
 
-	if (!_all_region_actions_sensitized) {
-		/* This selection change might have changed what region actions
-		   are allowed, so sensitize them all in case a key is pressed.
-		*/
-		sensitize_all_region_actions (true);
+	if (selection->regions.empty()) {
+		sensitize_all_region_actions (false);
+	} else {
+		if (!_all_region_actions_sensitized) {
+			/* This selection change might have changed what region actions
+			   are allowed, so sensitize them all in case a key is pressed.
+			*/
+			sensitize_all_region_actions (true);
+		}
 	}
 
 	if (_session && !_session->transport_rolling() && !selection->regions.empty()) {
@@ -1560,7 +1569,7 @@ Editor::select_all_within (framepos_t start, framepos_t end, double top, double
 
 	if (preserve_if_selected && op != Selection::Toggle) {
 		list<Selectable*>::iterator i = found.begin();
-		while (i != found.end() && (*i)->get_selected()) {
+		while (i != found.end() && (*i)->selected()) {
 			++i;
 		}
 
@@ -1614,9 +1623,7 @@ Editor::set_selection_from_region ()
 
 	selection->set (tvl);
 
-	if (!Profile->get_sae()) {
-		set_mouse_mode (Editing::MouseRange, false);
-	}
+	set_mouse_mode (Editing::MouseRange, false);
 }
 
 void
@@ -1649,9 +1656,7 @@ Editor::set_selection_from_range (Location& loc)
 	selection->set (loc.start(), loc.end());
 	commit_reversible_selection_op ();
 
-	if (!Profile->get_sae()) {
-		set_mouse_mode (Editing::MouseRange, false);
-	}
+	set_mouse_mode (Editing::MouseRange, false);
 }
 
 void
diff --git a/gtk2_ardour/editor_snapshots.cc b/gtk2_ardour/editor_snapshots.cc
index f79a442..b90737c 100644
--- a/gtk2_ardour/editor_snapshots.cc
+++ b/gtk2_ardour/editor_snapshots.cc
@@ -35,7 +35,7 @@
 
 #include "editor_snapshots.h"
 #include "ardour_ui.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
 #include "utils.h"
 #include "prompter.h"
 
diff --git a/gtk2_ardour/editor_summary.cc b/gtk2_ardour/editor_summary.cc
index ba03d91..a2882a2 100644
--- a/gtk2_ardour/editor_summary.cc
+++ b/gtk2_ardour/editor_summary.cc
@@ -107,7 +107,7 @@ EditorSummary::set_session (Session* s)
 
 	if (_session) {
 		Region::RegionPropertyChanged.connect (region_property_connection, invalidator (*this), boost::bind (&EditorSummary::set_background_dirty, this), gui_context());
-		Route::RemoteControlIDChange.connect (route_ctrl_id_connection, invalidator (*this), boost::bind (&EditorSummary::set_background_dirty, this), gui_context());
+		PresentationInfo::Change.connect (route_ctrl_id_connection, invalidator (*this), boost::bind (&EditorSummary::set_background_dirty, this), gui_context());
 		_editor->playhead_cursor->PositionChanged.connect (position_connection, invalidator (*this), boost::bind (&EditorSummary::playhead_position_changed, this, _1), gui_context());
 		_session->StartTimeChanged.connect (_session_connections, invalidator (*this), boost::bind (&EditorSummary::set_background_dirty, this), gui_context());
 		_session->EndTimeChanged.connect (_session_connections, invalidator (*this), boost::bind (&EditorSummary::set_background_dirty, this), gui_context());
@@ -293,8 +293,10 @@ EditorSummary::render_region (RegionView* r, cairo_t* cr, double y) const
 void
 EditorSummary::set_background_dirty ()
 {
-	_background_dirty = true;
-	set_dirty ();
+	if (!_background_dirty) {
+		_background_dirty = true;
+		set_dirty ();
+	}
 }
 
 /** Set the summary so that just the overlays (viewbox, playhead etc.) will be re-rendered */
@@ -1050,8 +1052,8 @@ void
 EditorSummary::routes_added (list<RouteTimeAxisView*> const & r)
 {
 	for (list<RouteTimeAxisView*>::const_iterator i = r.begin(); i != r.end(); ++i) {
-		/* Connect to gui_changed() on the route so that we know when their colour has changed */
-		(*i)->route()->gui_changed.connect (*this, invalidator (*this), boost::bind (&EditorSummary::route_gui_changed, this, _1), gui_context ());
+		/* Connect to the relevant signal for the route so that we know when its colour has changed */
+		(*i)->route()->presentation_info().PropertyChanged.connect (*this, invalidator (*this), boost::bind (&EditorSummary::route_gui_changed, this, _1), gui_context ());
 		boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> ((*i)->route ());
 		if (tr) {
 			tr->PlaylistChanged.connect (*this, invalidator (*this), boost::bind (&EditorSummary::set_background_dirty, this), gui_context ());
@@ -1062,9 +1064,9 @@ EditorSummary::routes_added (list<RouteTimeAxisView*> const & r)
 }
 
 void
-EditorSummary::route_gui_changed (string c)
+EditorSummary::route_gui_changed (PBD::PropertyChange const& what_changed)
 {
-	if (c == "color") {
+	if (what_changed.contains (Properties::color)) {
 		set_background_dirty ();
 	}
 }
diff --git a/gtk2_ardour/editor_summary.h b/gtk2_ardour/editor_summary.h
index e95406f..4fb406a 100644
--- a/gtk2_ardour/editor_summary.h
+++ b/gtk2_ardour/editor_summary.h
@@ -88,7 +88,7 @@ private:
 	double editor_y_to_summary (double) const;
 	Position get_position (double, double) const;
 	void set_cursor (Position);
-	void route_gui_changed (std::string);
+	void route_gui_changed (PBD::PropertyChange const&);
 	bool suspending_editor_updates () const;
 	double playhead_frame_to_position (framepos_t) const;
         framepos_t position_to_playhead_frame_to_position (double pos) const;
diff --git a/gtk2_ardour/editor_tempodisplay.cc b/gtk2_ardour/editor_tempodisplay.cc
index 38685e5..722490c 100644
--- a/gtk2_ardour/editor_tempodisplay.cc
+++ b/gtk2_ardour/editor_tempodisplay.cc
@@ -51,7 +51,7 @@
 #include "tempo_lines.h"
 #include "ui_config.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
@@ -69,19 +69,25 @@ Editor::remove_metric_marks ()
 		delete_when_idle (*x);
 	}
 	metric_marks.clear ();
+
+	for (Curves::iterator x = tempo_curves.begin(); x != tempo_curves.end(); ++x) {
+		delete (*x);
+	}
+	tempo_curves.clear ();
 }
 
 void
 Editor::draw_metric_marks (const Metrics& metrics)
 {
-
-	const MeterSection *ms;
-	const TempoSection *ts;
 	char buf[64];
+	double max_tempo = 0.0;
+	double min_tempo = DBL_MAX;
 
-	remove_metric_marks ();
+	remove_metric_marks (); // also clears tempo curves
 
 	for (Metrics::const_iterator i = metrics.begin(); i != metrics.end(); ++i) {
+		const MeterSection *ms;
+		const TempoSection *ts;
 
 		if ((ms = dynamic_cast<const MeterSection*>(*i)) != 0) {
 			snprintf (buf, sizeof(buf), "%g/%g", ms->divisions_per_bar(), ms->note_divisor ());
@@ -89,18 +95,59 @@ Editor::draw_metric_marks (const Metrics& metrics)
 								 *(const_cast<MeterSection*>(ms))));
 		} else if ((ts = dynamic_cast<const TempoSection*>(*i)) != 0) {
 			if (UIConfiguration::instance().get_allow_non_quarter_pulse()) {
-				snprintf (buf, sizeof (buf), "%.2f/%.0f", ts->beats_per_minute(), ts->note_type());
+				snprintf (buf, sizeof (buf), "%.3f/%.0f", ts->beats_per_minute(), ts->note_type());
 			} else {
-				snprintf (buf, sizeof (buf), "%.2f", ts->beats_per_minute());
+				snprintf (buf, sizeof (buf), "%.3f", ts->beats_per_minute());
 			}
-			metric_marks.push_back (new TempoMarker (*this, *tempo_group, UIConfiguration::instance().color ("tempo marker"), buf,
+
+			max_tempo = max (max_tempo, ts->beats_per_minute());
+			min_tempo = min (min_tempo, ts->beats_per_minute());
+
+			tempo_curves.push_back (new TempoCurve (*this, *tempo_group, UIConfiguration::instance().color ("tempo curve"),
+								*(const_cast<TempoSection*>(ts)), ts->frame(), false));
+			if (ts->position_lock_style() == MusicTime) {
+				metric_marks.push_back (new TempoMarker (*this, *tempo_group, UIConfiguration::instance().color ("tempo marker music"), buf,
+								 *(const_cast<TempoSection*>(ts))));
+			} else {
+				metric_marks.push_back (new TempoMarker (*this, *tempo_group, UIConfiguration::instance().color ("tempo marker"), buf,
 								 *(const_cast<TempoSection*>(ts))));
+			}
+
 		}
 
 	}
 
+	const double min_tempo_range = 5.0;
+	const double tempo_delta = fabs (max_tempo - min_tempo);
+
+	if (tempo_delta < min_tempo_range) {
+		max_tempo += min_tempo_range - tempo_delta;
+		min_tempo += tempo_delta - min_tempo_range;
+	}
+
+	for (Curves::iterator x = tempo_curves.begin(); x != tempo_curves.end(); ) {
+		Curves::iterator tmp = x;
+		(*x)->set_max_tempo (max_tempo);
+		(*x)->set_min_tempo (min_tempo);
+		++tmp;
+		if (tmp != tempo_curves.end()) {
+			(*x)->set_position ((*x)->tempo().frame(), (*tmp)->tempo().frame());
+		} else {
+			(*x)->set_position ((*x)->tempo().frame(), UINT32_MAX);
+		}
+		++x;
+	}
+
+	for (Marks::iterator x = metric_marks.begin(); x != metric_marks.end(); ++x) {
+		TempoMarker* tempo_marker;
+
+		if ((tempo_marker = dynamic_cast<TempoMarker*> (*x)) != 0) {
+			tempo_marker->update_height_mark ((tempo_marker->tempo().beats_per_minute() - min_tempo) / max (10.0, max_tempo - min_tempo));
+		}
+	}
 }
 
+
 void
 Editor::tempo_map_changed (const PropertyChange& /*ignored*/)
 {
@@ -114,13 +161,93 @@ Editor::tempo_map_changed (const PropertyChange& /*ignored*/)
 		tempo_lines->tempo_map_changed();
 	}
 
-	ARDOUR::TempoMap::BBTPointList::const_iterator begin;
-	ARDOUR::TempoMap::BBTPointList::const_iterator end;
-
-	compute_current_bbt_points (leftmost_frame, leftmost_frame + current_page_samples(), begin, end);
+	std::vector<TempoMap::BBTPoint> grid;
+	compute_current_bbt_points (grid, leftmost_frame, leftmost_frame + current_page_samples());
 	_session->tempo_map().apply_with_metrics (*this, &Editor::draw_metric_marks); // redraw metric markers
-	draw_measures (begin, end);
-	update_tempo_based_rulers (begin, end);
+	draw_measures (grid);
+	update_tempo_based_rulers (grid);
+}
+
+struct CurveComparator {
+	bool operator() (TempoCurve const * a, TempoCurve const * b) {
+		return a->position() < b->position();
+	}
+};
+
+void
+Editor::marker_position_changed ()
+{
+	if (!_session) {
+		return;
+	}
+
+	ENSURE_GUI_THREAD (*this, &Editor::tempo_map_changed);
+
+	if (tempo_lines) {
+		tempo_lines->tempo_map_changed();
+	}
+
+	double max_tempo = 0.0;
+	double min_tempo = DBL_MAX;
+
+	for (Marks::iterator x = metric_marks.begin(); x != metric_marks.end(); ++x) {
+		TempoMarker* tempo_marker;
+		MeterMarker* meter_marker;
+		const TempoSection *ts;
+		const MeterSection *ms;
+
+		if ((tempo_marker = dynamic_cast<TempoMarker*> (*x)) != 0) {
+			if ((ts = &tempo_marker->tempo()) != 0) {
+				tempo_marker->set_position (ts->frame ());
+				char buf[64];
+				snprintf (buf, sizeof (buf), "%.3f", ts->beats_per_minute());
+				tempo_marker->set_name (buf);
+
+				max_tempo = max (max_tempo, ts->beats_per_minute());
+				min_tempo = min (min_tempo, ts->beats_per_minute());
+			}
+		}
+		if ((meter_marker = dynamic_cast<MeterMarker*> (*x)) != 0) {
+			if ((ms = &meter_marker->meter()) != 0) {
+				meter_marker->set_position (ms->frame ());
+			}
+		}
+	}
+
+	tempo_curves.sort (CurveComparator());
+
+	const double min_tempo_range = 5.0;
+	const double tempo_delta = fabs (max_tempo - min_tempo);
+
+	if (tempo_delta < min_tempo_range) {
+		max_tempo += min_tempo_range - tempo_delta;
+		min_tempo += tempo_delta - min_tempo_range;
+	}
+
+	for (Curves::iterator x = tempo_curves.begin(); x != tempo_curves.end(); ) {
+		Curves::iterator tmp = x;
+		(*x)->set_max_tempo (max_tempo);
+		(*x)->set_min_tempo (min_tempo);
+		++tmp;
+		if (tmp != tempo_curves.end()) {
+			(*x)->set_position ((*x)->tempo().frame(), (*tmp)->tempo().frame());
+		} else {
+			(*x)->set_position ((*x)->tempo().frame(), UINT32_MAX);
+		}
+		++x;
+	}
+
+	for (Marks::iterator x = metric_marks.begin(); x != metric_marks.end(); ++x) {
+		TempoMarker* tempo_marker;
+		if ((tempo_marker = dynamic_cast<TempoMarker*> (*x)) != 0) {
+			tempo_marker->update_height_mark ((tempo_marker->tempo().beats_per_minute() - min_tempo) / max (max_tempo - min_tempo, 10.0));
+		}
+	}
+
+	std::vector<TempoMap::BBTPoint> grid;
+	compute_current_bbt_points (grid, leftmost_frame, leftmost_frame + current_page_samples());
+	draw_measures (grid);
+	update_tempo_based_rulers (grid);
 }
 
 void
@@ -131,23 +258,20 @@ Editor::redisplay_tempo (bool immediate_redraw)
 	}
 
 	if (immediate_redraw) {
-		ARDOUR::TempoMap::BBTPointList::const_iterator current_bbt_points_begin;
-		ARDOUR::TempoMap::BBTPointList::const_iterator current_bbt_points_end;
+		std::vector<TempoMap::BBTPoint> grid;
 
-		compute_current_bbt_points (leftmost_frame, leftmost_frame + current_page_samples(),
-					    current_bbt_points_begin, current_bbt_points_end);
-		draw_measures (current_bbt_points_begin, current_bbt_points_end);
-		update_tempo_based_rulers (current_bbt_points_begin, current_bbt_points_end); // redraw rulers and measures
+		compute_current_bbt_points (grid, leftmost_frame, leftmost_frame + current_page_samples());
+		draw_measures (grid);
+		update_tempo_based_rulers (grid); // redraw rulers and measure lines
 
 	} else {
 		Glib::signal_idle().connect (sigc::bind_return (sigc::bind (sigc::mem_fun (*this, &Editor::redisplay_tempo), true), false));
 	}
 }
 
+/* computes a grid starting a beat before and ending a beat after leftmost and rightmost respectively */
 void
-Editor::compute_current_bbt_points (framepos_t leftmost, framepos_t rightmost,
-				    ARDOUR::TempoMap::BBTPointList::const_iterator& begin,
-				    ARDOUR::TempoMap::BBTPointList::const_iterator& end)
+Editor::compute_current_bbt_points (std::vector<TempoMap::BBTPoint>& grid, framepos_t leftmost, framepos_t rightmost)
 {
 	if (!_session) {
 		return;
@@ -155,8 +279,8 @@ Editor::compute_current_bbt_points (framepos_t leftmost, framepos_t rightmost,
 
 	/* prevent negative values of leftmost from creeping into tempomap
 	 */
-
-	_session->tempo_map().get_grid (begin, end, max (leftmost, (framepos_t) 0), rightmost);
+	const double lower_beat = floor (_session->tempo_map().beat_at_frame (leftmost)) - 1.0;
+	_session->tempo_map().get_grid (grid, max (_session->tempo_map().frame_at_beat (lower_beat), (framepos_t) 0), rightmost);
 }
 
 void
@@ -168,10 +292,9 @@ Editor::hide_measures ()
 }
 
 void
-Editor::draw_measures (ARDOUR::TempoMap::BBTPointList::const_iterator& begin,
-		       ARDOUR::TempoMap::BBTPointList::const_iterator& end)
+Editor::draw_measures (std::vector<ARDOUR::TempoMap::BBTPoint>& grid)
 {
-	if (_session == 0 || _show_measures == false || distance (begin, end) == 0) {
+	if (_session == 0 || _show_measures == false || distance (grid.begin(), grid.end()) == 0) {
 		return;
 	}
 
@@ -180,7 +303,7 @@ Editor::draw_measures (ARDOUR::TempoMap::BBTPointList::const_iterator& begin,
 	}
 
 	const unsigned divisions = get_grid_beat_divisions(leftmost_frame);
-	tempo_lines->draw (begin, end, divisions, leftmost_frame, _session->frame_rate());
+	tempo_lines->draw (grid, divisions, leftmost_frame, _session->frame_rate());
 }
 
 void
@@ -191,33 +314,19 @@ Editor::mouse_add_new_tempo_event (framepos_t frame)
 	}
 
 	TempoMap& map(_session->tempo_map());
-	TempoDialog tempo_dialog (map, frame, _("add"));
 
-	//this causes compiz to display no border.
-	//tempo_dialog.signal_realize().connect (sigc::bind (sigc::ptr_fun (set_decoration), &tempo_dialog, Gdk::WMDecoration (Gdk::DECOR_BORDER|Gdk::DECOR_RESIZEH)));
-
-	switch (tempo_dialog.run()) {
-	case RESPONSE_ACCEPT:
-		break;
-	default:
-		return;
-	}
-
-	double bpm = 0;
-	Timecode::BBT_Time requested;
-
-	bpm = tempo_dialog.get_bpm ();
-	double nt = tempo_dialog.get_note_type();
-	bpm = max (0.01, bpm);
+	begin_reversible_command (_("add tempo mark"));
+	const double pulse = map.pulse_at_frame (frame);
 
-	tempo_dialog.get_bbt_time (requested);
+	if (pulse > 0.0) {
+		XMLNode &before = map.get_state();
+		/* add music-locked ramped (?) tempo using the bpm/note type at frame*/
+		map.add_tempo (map.tempo_at_frame (frame), pulse, 0, TempoSection::Ramp, MusicTime);
 
-	begin_reversible_command (_("add tempo mark"));
-        XMLNode &before = map.get_state();
-	map.add_tempo (Tempo (bpm,nt), requested);
-        XMLNode &after = map.get_state();
-	_session->add_command(new MementoCommand<TempoMap>(map, &before, &after));
-	commit_reversible_command ();
+		XMLNode &after = map.get_state();
+		_session->add_command(new MementoCommand<TempoMap>(map, &before, &after));
+		commit_reversible_command ();
+	}
 
 	//map.dump (cerr);
 }
@@ -233,9 +342,6 @@ Editor::mouse_add_new_meter_event (framepos_t frame)
 	TempoMap& map(_session->tempo_map());
 	MeterDialog meter_dialog (map, frame, _("add"));
 
-	//this causes compiz to display no border..
-	//meter_dialog.signal_realize().connect (sigc::bind (sigc::ptr_fun (set_decoration), &meter_dialog, Gdk::WMDecoration (Gdk::DECOR_BORDER|Gdk::DECOR_RESIZEH)));
-
 	switch (meter_dialog.run ()) {
 	case RESPONSE_ACCEPT:
 		break;
@@ -247,13 +353,21 @@ Editor::mouse_add_new_meter_event (framepos_t frame)
 	bpb = max (1.0, bpb); // XXX is this a reasonable limit?
 
 	double note_type = meter_dialog.get_note_type ();
-	Timecode::BBT_Time requested;
 
+	Timecode::BBT_Time requested;
 	meter_dialog.get_bbt_time (requested);
 
+	const double beat = map.beat_at_bbt (requested);
+
 	begin_reversible_command (_("add meter mark"));
         XMLNode &before = map.get_state();
-	map.add_meter (Meter (bpb, note_type), requested);
+
+	if (meter_dialog.get_lock_style() == MusicTime) {
+		map.add_meter (Meter (bpb, note_type), beat, requested,  map.frame_at_beat (beat), MusicTime);
+	} else {
+		map.add_meter (Meter (bpb, note_type), beat, requested, map.frame_at_beat (beat), AudioTime);
+	}
+
 	_session->add_command(new MementoCommand<TempoMap>(map, &before, &map.get_state()));
 	commit_reversible_command ();
 
@@ -284,7 +398,7 @@ Editor::remove_tempo_marker (ArdourCanvas::Item* item)
 void
 Editor::edit_meter_section (MeterSection* section)
 {
-	MeterDialog meter_dialog (*section, _("done"));
+	MeterDialog meter_dialog (_session->tempo_map(), *section, _("done"));
 
 	switch (meter_dialog.run()) {
 	case RESPONSE_ACCEPT:
@@ -296,15 +410,21 @@ Editor::edit_meter_section (MeterSection* section)
 	double bpb = meter_dialog.get_bpb ();
 	bpb = max (1.0, bpb); // XXX is this a reasonable limit?
 
-	double note_type = meter_dialog.get_note_type ();
+	double const note_type = meter_dialog.get_note_type ();
+	const Meter meter (bpb, note_type);
 
 	Timecode::BBT_Time when;
-	meter_dialog.get_bbt_time(when);
+	meter_dialog.get_bbt_time (when);
 
-	begin_reversible_command (_("replace tempo mark"));
+	framepos_t const frame = _session->tempo_map().frame_at_bbt (when);
+	const PositionLockStyle pls = (meter_dialog.get_lock_style() == AudioTime) ? AudioTime : MusicTime;
+
+	begin_reversible_command (_("replace meter mark"));
         XMLNode &before = _session->tempo_map().get_state();
-	_session->tempo_map().replace_meter (*section, Meter (bpb, note_type), when);
-        XMLNode &after = _session->tempo_map().get_state();
+
+	_session->tempo_map().replace_meter (*section, meter, when, frame, pls);
+
+	XMLNode &after = _session->tempo_map().get_state();
 	_session->add_command(new MementoCommand<TempoMap>(_session->tempo_map(), &before, &after));
 	commit_reversible_command ();
 }
@@ -312,7 +432,7 @@ Editor::edit_meter_section (MeterSection* section)
 void
 Editor::edit_tempo_section (TempoSection* section)
 {
-	TempoDialog tempo_dialog (*section, _("done"));
+	TempoDialog tempo_dialog (_session->tempo_map(), *section, _("done"));
 
 	switch (tempo_dialog.run ()) {
 	case RESPONSE_ACCEPT:
@@ -323,13 +443,25 @@ Editor::edit_tempo_section (TempoSection* section)
 
 	double bpm = tempo_dialog.get_bpm ();
 	double nt = tempo_dialog.get_note_type ();
-	Timecode::BBT_Time when;
-	tempo_dialog.get_bbt_time(when);
 	bpm = max (0.01, bpm);
+	const Tempo tempo (bpm, nt);
+
+	Timecode::BBT_Time when;
+	tempo_dialog.get_bbt_time (when);
+
+	const TempoSection::Type ttype (tempo_dialog.get_tempo_type());
 
 	begin_reversible_command (_("replace tempo mark"));
 	XMLNode &before = _session->tempo_map().get_state();
-	_session->tempo_map().replace_tempo (*section, Tempo (bpm, nt), when);
+
+	if (tempo_dialog.get_lock_style() == AudioTime) {
+		framepos_t const f = _session->tempo_map().predict_tempo_position (section, when).second;
+		_session->tempo_map().replace_tempo (*section, tempo, 0.0, f, ttype, AudioTime);
+	} else {
+		double const p = _session->tempo_map().predict_tempo_position (section, when).first;
+		_session->tempo_map().replace_tempo (*section, tempo, p, 0, ttype, MusicTime);
+	}
+
 	XMLNode &after = _session->tempo_map().get_state();
 	_session->add_command (new MementoCommand<TempoMap>(_session->tempo_map(), &before, &after));
 	commit_reversible_command ();
diff --git a/gtk2_ardour/editor_timefx.cc b/gtk2_ardour/editor_timefx.cc
index d78340d..067cfef 100644
--- a/gtk2_ardour/editor_timefx.cc
+++ b/gtk2_ardour/editor_timefx.cc
@@ -29,6 +29,13 @@
 #include "pbd/memento_command.h"
 #include "pbd/stateful_diff_command.h"
 
+#include "ardour/audioregion.h"
+#include "ardour/midi_stretch.h"
+#include "ardour/pitch.h"
+#include "ardour/region.h"
+#include "ardour/session.h"
+#include "ardour/stretch.h"
+
 #include <gtkmm2ext/utils.h>
 
 #include "audio_region_view.h"
@@ -37,19 +44,12 @@
 #include "region_selection.h"
 #include "time_fx_dialog.h"
 
-#include "ardour/audioregion.h"
-#include "ardour/midi_stretch.h"
-#include "ardour/pitch.h"
-#include "ardour/region.h"
-#include "ardour/session.h"
-#include "ardour/stretch.h"
-
 #ifdef USE_RUBBERBAND
 #include <rubberband/RubberBandStretcher.h>
 using namespace RubberBand;
 #endif
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
@@ -146,22 +146,18 @@ Editor::pitch_shift (RegionSelection& regions, float fraction)
 int
 Editor::time_fx (RegionList& regions, float val, bool pitching)
 {
-	delete current_timefx;
-	current_timefx = new TimeFXDialog (*this, pitching);
-	current_timefx->regions = regions;
-
-	/* See if we have any audio regions on our list */
-	RegionList::iterator i = regions.begin ();
-	while (i != regions.end() && boost::dynamic_pointer_cast<AudioRegion> (*i) == 0) {
-		++i;
-	}
-
-	if (i == regions.end ()) {
-		/* No audio regions; we can just do the timefx without a dialogue */
-		do_timefx ();
+	if (regions.empty()) {
 		return 0;
 	}
 
+	const framecnt_t oldlen = (framecnt_t) (regions.front()->length());
+	const framecnt_t newlen = (framecnt_t) (regions.front()->length() * val);
+	const framecnt_t pos = regions.front()->position ();
+
+	delete current_timefx;
+	current_timefx = new TimeFXDialog (*this, pitching, oldlen, newlen, pos);
+	current_timefx->regions = regions;
+
 	switch (current_timefx->run ()) {
 	case RESPONSE_ACCEPT:
 		break;
@@ -171,34 +167,14 @@ Editor::time_fx (RegionList& regions, float val, bool pitching)
 	}
 
 	current_timefx->status = 0;
+	current_timefx->request.time_fraction = current_timefx->get_time_fraction ();
+	current_timefx->request.pitch_fraction = current_timefx->get_pitch_fraction ();
 
-	if (pitching) {
-
-		float cents = current_timefx->pitch_octave_adjustment.get_value() * 1200.0;
-		float pitch_fraction;
-		cents += current_timefx->pitch_semitone_adjustment.get_value() * 100.0;
-		cents += current_timefx->pitch_cent_adjustment.get_value();
-
-		if (cents == 0.0) {
-			// user didn't change anything
-			current_timefx->hide ();
-			return 0;
-		}
-
-		// one octave == 1200 cents
-		// adding one octave doubles the frequency
-		// ratio is 2^^octaves
-
-		pitch_fraction = pow(2, cents/1200);
-
-		current_timefx->request.time_fraction = 1.0;
-		current_timefx->request.pitch_fraction = pitch_fraction;
-
-	} else {
-
-		current_timefx->request.time_fraction = val;
-		current_timefx->request.pitch_fraction = 1.0;
-
+	if (current_timefx->request.time_fraction == 1.0 &&
+	    current_timefx->request.pitch_fraction == 1.0) {
+		/* nothing to do */
+		current_timefx->hide ();
+		return 0;
 	}
 
 #ifdef USE_RUBBERBAND
@@ -299,6 +275,8 @@ Editor::time_fx (RegionList& regions, float val, bool pitching)
 	current_timefx->first_delete = current_timefx->signal_delete_event().connect
 		(sigc::mem_fun (current_timefx, &TimeFXDialog::delete_in_progress));
 
+	current_timefx->start_updates ();
+
 	if (pthread_create_and_store ("timefx", &current_timefx->request.thread, timefx_thread, current_timefx)) {
 		current_timefx->hide ();
 		error << _("timefx cannot be started - thread creation error") << endmsg;
@@ -413,4 +391,3 @@ Editor::timefx_thread (void *arg)
 #endif
 	return 0;
 }
-
diff --git a/gtk2_ardour/editor_videotimeline.cc b/gtk2_ardour/editor_videotimeline.cc
index 65c4fc7..e5f5db3 100644
--- a/gtk2_ardour/editor_videotimeline.cc
+++ b/gtk2_ardour/editor_videotimeline.cc
@@ -35,7 +35,7 @@
 #include "interthread_progress_window.h"
 
 #include "pbd/openuri.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 
diff --git a/gtk2_ardour/engine_dialog.cc b/gtk2_ardour/engine_dialog.cc
index 762d162..4f03e92 100644
--- a/gtk2_ardour/engine_dialog.cc
+++ b/gtk2_ardour/engine_dialog.cc
@@ -53,7 +53,7 @@
 #include "engine_dialog.h"
 #include "gui_thread.h"
 #include "utils.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace Gtk;
@@ -307,13 +307,18 @@ EngineControl::EngineControl ()
 		set_default_state ();
 	}
 
+	update_sensitivity ();
 	connect_changed_signals ();
 
 	notebook.signal_switch_page().connect (sigc::mem_fun (*this, &EngineControl::on_switch_page));
 
 	connect_disconnect_button.signal_clicked().connect (sigc::mem_fun (*this, &EngineControl::connect_disconnect_click));
-	connect_disconnect_button.set_no_show_all();
 
+	connect_disconnect_button.set_no_show_all();
+	use_buffered_io_button.set_no_show_all();
+	update_devices_button.set_no_show_all();
+	start_stop_button.set_no_show_all();
+	midi_devices_button.set_no_show_all();
 }
 
 void
@@ -419,6 +424,18 @@ EngineControl::on_show ()
 }
 
 bool
+EngineControl::try_autostart ()
+{
+	if (!start_stop_button.get_sensitive()) {
+		return false;
+	}
+	if (ARDOUR::AudioEngine::instance()->running()) {
+		return true;
+	}
+	return start_engine ();
+}
+
+bool
 EngineControl::start_engine ()
 {
 	if (push_state_to_backend(true) != 0) {
@@ -1579,12 +1596,7 @@ EngineControl::output_device_changed ()
 string
 EngineControl::bufsize_as_string (uint32_t sz)
 {
-	/* Translators: "samples" is always plural here, so no
-	   need for plural+singular forms.
-	 */
-	char buf[64];
-	snprintf (buf, sizeof (buf), "%u %s", sz, P_("sample", "samples", sz));
-	return buf;
+	return string_compose (P_("%1 sample", "%1 samples", sz), sz);
 }
 
 string
@@ -1883,7 +1895,7 @@ EngineControl::maybe_display_saved_state ()
 XMLNode&
 EngineControl::get_state ()
 {
-	LocaleGuard lg (X_("C"));
+	LocaleGuard lg;
 
 	XMLNode* root = new XMLNode ("AudioMIDISetup");
 	std::string path;
@@ -1953,11 +1965,9 @@ EngineControl::set_state (const XMLNode& root)
 {
 	XMLNodeList          clist, cclist;
 	XMLNodeConstIterator citer, cciter;
-	XMLNode* child;
-	XMLNode* grandchild;
-	XMLProperty* prop = NULL;
-
-	fprintf (stderr, "EngineControl::set_state\n");
+	XMLNode const * child;
+	XMLNode const * grandchild;
+	XMLProperty const * prop = NULL;
 
 	if (root.name() != "AudioMIDISetup") {
 		return false;
@@ -2225,7 +2235,9 @@ EngineControl::set_current_state (const State& state)
 	device_combo.set_active_text (state->device);
 	input_device_combo.set_active_text (state->input_device);
 	output_device_combo.set_active_text (state->output_device);
-	sample_rate_combo.set_active_text (rate_as_string (state->sample_rate));
+	if (!_desired_sample_rate) {
+		sample_rate_combo.set_active_text (rate_as_string (state->sample_rate));
+	}
 	set_active_text_if_present (buffer_size_combo, bufsize_as_string (state->buffer_size));
 	set_active_text_if_present (nperiods_combo, nperiods_as_string (state->n_periods));
 	input_latency.set_value (state->input_latency);
@@ -2350,6 +2362,8 @@ EngineControl::push_state_to_backend (bool start)
 			change_channels = true;
 			change_latency = true;
 			change_midi = true;
+			change_buffered_io = backend->can_use_buffered_io();
+			change_channels = true;
 			change_nperiods = backend->can_set_period_size() && get_popdown_string_count (nperiods_combo) > 0;
 		}
 
@@ -2411,7 +2425,7 @@ EngineControl::push_state_to_backend (bool start)
 	if (change_driver || change_device || change_channels || change_nperiods ||
 			(change_latency && !backend->can_change_systemic_latency_when_running ()) ||
 			(change_rate && !backend->can_change_sample_rate_when_running()) ||
-			change_midi ||
+			change_midi || change_buffered_io ||
 			(change_bufsize && !backend->can_change_buffer_size_when_running())) {
 		restart_required = true;
 	} else {
@@ -2754,6 +2768,10 @@ void
 EngineControl::set_desired_sample_rate (uint32_t sr)
 {
 	_desired_sample_rate = sr;
+	if (ARDOUR::AudioEngine::instance ()->running ()
+			&& ARDOUR::AudioEngine::instance ()->sample_rate () != sr) {
+		stop_engine ();
+	}
 	device_changed ();
 }
 
diff --git a/gtk2_ardour/engine_dialog.h b/gtk2_ardour/engine_dialog.h
index faf12d7..8f47f2b 100644
--- a/gtk2_ardour/engine_dialog.h
+++ b/gtk2_ardour/engine_dialog.h
@@ -49,6 +49,7 @@ class EngineControl : public ArdourDialog, public PBD::ScopedConnectionList {
     bool set_state (const XMLNode&);
 
     void set_desired_sample_rate (uint32_t);
+    bool try_autostart ();
 
   private:
     Gtk::Notebook notebook;
diff --git a/gtk2_ardour/enums.cc b/gtk2_ardour/enums.cc
index 4cae1f5..4f8a348 100644
--- a/gtk2_ardour/enums.cc
+++ b/gtk2_ardour/enums.cc
@@ -150,6 +150,7 @@ setup_gtk_ardour_enums ()
 	REGISTER_ENUM (GainLineItem);
 	REGISTER_ENUM (AutomationLineItem);
 	REGISTER_ENUM (MeterMarkerItem);
+	REGISTER_ENUM (TempoCurveItem);
 	REGISTER_ENUM (TempoMarkerItem);
 	REGISTER_ENUM (MeterBarItem);
 	REGISTER_ENUM (TempoBarItem);
diff --git a/gtk2_ardour/export/CD.format b/gtk2_ardour/export/CD.format
deleted file mode 100644
index 0253301..0000000
--- a/gtk2_ardour/export/CD.format
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ExportFormatSpecification name="CD" id="888228ba-4863-4906-a059-7bc01023c113">
-  <Encoding id="F_WAV" type="T_Sndfile" extension="wav" name="WAV" has-sample-format="true" channel-limit="256"/>
-  <SampleRate rate="44100"/>
-  <SRCQuality quality="SRC_SincBest"/>
-  <EncodingOptions>
-    <Option name="sample-format" value="SF_16"/>
-    <Option name="dithering" value="D_Shaped"/>
-    <Option name="tag-metadata" value="false"/>
-    <Option name="tag-support" value="false"/>
-    <Option name="broadcast-info" value="false"/>
-  </EncodingOptions>
-  <Processing>
-    <Normalize enabled="true" target="-0"/>
-    <Silence>
-      <Start>
-        <Trim enabled="false"/>
-        <Add enabled="false">
-          <Duration format="Timecode" hours="0" minutes="0" seconds="0" frames="0"/>
-        </Add>
-      </Start>
-      <End>
-        <Trim enabled="false"/>
-        <Add enabled="false">
-          <Duration format="Timecode" hours="0" minutes="0" seconds="0" frames="0"/>
-        </Add>
-      </End>
-    </Silence>
-  </Processing>
-</ExportFormatSpecification>
diff --git a/gtk2_ardour/export_channel_selector.cc b/gtk2_ardour/export_channel_selector.cc
index c868d69..acbed62 100644
--- a/gtk2_ardour/export_channel_selector.cc
+++ b/gtk2_ardour/export_channel_selector.cc
@@ -18,8 +18,6 @@
 
 */
 
-#include "export_channel_selector.h"
-
 #include <algorithm>
 
 #include "pbd/convert.h"
@@ -33,19 +31,16 @@
 
 #include <sstream>
 
-#include "i18n.h"
+#include "export_channel_selector.h"
+#include "route_sorter.h"
+
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace Glib;
 using namespace ARDOUR;
 using namespace PBD;
 
-struct EditorOrderRouteSorter {
-    bool operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b) {
-	    return a->order_key () < b->order_key ();
-    }
-};
-
 PortExportChannelSelector::PortExportChannelSelector (ARDOUR::Session * session, ProfileManagerPtr manager) :
   ExportChannelSelector (session, manager),
   channels_label (_("Channels:"), Gtk::ALIGN_LEFT),
@@ -104,6 +99,11 @@ PortExportChannelSelector::sync_with_manager ()
 	split_checkbox.set_active (state->config->get_split());
 	channels_spinbutton.set_value (state->config->get_n_chans());
 
+	/* when loading presets, config is ready set here (shared ptr)
+	 * fill_route_list () -> update_channel_count () -> set_channel_count () -> update_config()
+	 * will call config->clear_channels(); and clear the config
+	 */
+	channel_view.set_config (ChannelConfigPtr ());
 	fill_route_list ();
 	channel_view.set_config (state->config);
 }
@@ -121,7 +121,7 @@ PortExportChannelSelector::fill_route_list ()
 		channel_view.add_route (master);
 	}
 
-	routes.sort (EditorOrderRouteSorter ());
+	routes.sort (Stripable::PresentationOrderSorter ());
 
 	for (RouteList::iterator it = routes.begin(); it != routes.end(); ++it) {
 		if ((*it)->is_master () || (*it)->is_monitor ()) {
@@ -217,6 +217,7 @@ PortExportChannelSelector::ChannelTreeView::set_config (ChannelConfigPtr c)
 
 	if (config == c) { return; }
 	config = c;
+	if (!config) { return; }
 
 	uint32_t i = 1;
 	ExportChannelConfiguration::ChannelList chan_list = config->get_channels();
@@ -536,7 +537,8 @@ RegionExportChannelSelector::handle_selection ()
 	factory.reset (new RegionExportChannelFactory (_session, region, track, type));
 	state->config->set_region_processing_type (type);
 
-	for (size_t chan = 0; chan < region_chans; ++chan) {
+	const size_t cc = type == RegionExportChannelFactory::Processed ? track_chans : region_chans;
+	for (size_t chan = 0; chan < cc; ++chan) {
 		state->config->register_channel (factory->create (chan));
 	}
 
@@ -693,7 +695,7 @@ TrackExportChannelSelector::add_track (boost::shared_ptr<Route> route)
 	row[track_cols.selected] = false;
 	row[track_cols.label] = route->name();
 	row[track_cols.route] = route;
-	row[track_cols.order_key] = route->order_key();
+	row[track_cols.order_key] = route->presentation_info().order();
 }
 
 void
@@ -708,7 +710,7 @@ TrackExportChannelSelector::update_config()
 			continue;
 		}
 
-		ExportProfileManager::ChannelConfigStatePtr state = manager->add_channel_config();
+		ExportProfileManager::ChannelConfigStatePtr state;
 
 		boost::shared_ptr<Route> route = row[track_cols.route];
 
@@ -720,16 +722,25 @@ TrackExportChannelSelector::update_config()
 					ExportChannelPtr channel (new PortExportChannel ());
 					PortExportChannel * pec = static_cast<PortExportChannel *> (channel.get());
 					pec->add_port(port);
+					if (!state) {
+						state = manager->add_channel_config();
+					}
 					state->config->register_channel(channel);
 				}
 			}
 		} else {
 			std::list<ExportChannelPtr> list;
 			RouteExportChannel::create_from_route (list, route);
+			if (list.size () == 0) {
+				continue;
+			}
+			state = manager->add_channel_config();
 			state->config->register_channels (list);
 		}
 
-		state->config->set_name (route->name());
+		if (state) {
+			state->config->set_name (route->name());
+		}
 
 	}
 
diff --git a/gtk2_ardour/export_channel_selector.h b/gtk2_ardour/export_channel_selector.h
index 6dd770c..d5607ef 100644
--- a/gtk2_ardour/export_channel_selector.h
+++ b/gtk2_ardour/export_channel_selector.h
@@ -236,6 +236,8 @@ class TrackExportChannelSelector : public ExportChannelSelector
 
 	virtual void sync_with_manager ();
 
+	bool track_output () const { return track_output_button.get_active(); }
+
   private:
 
 	void fill_list();
diff --git a/gtk2_ardour/export_dialog.cc b/gtk2_ardour/export_dialog.cc
index e9f2559..6b9d74e 100644
--- a/gtk2_ardour/export_dialog.cc
+++ b/gtk2_ardour/export_dialog.cc
@@ -24,15 +24,17 @@
 #include <gtkmm/messagedialog.h>
 
 #include "ardour/audioregion.h"
+#include "ardour/export_channel_configuration.h"
 #include "ardour/export_status.h"
 #include "ardour/export_handler.h"
+#include "ardour/profile.h"
 
 #include "export_dialog.h"
 #include "export_report.h"
 #include "gui_thread.h"
 #include "nag.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 using namespace PBD;
@@ -95,9 +97,13 @@ ExportDialog::set_session (ARDOUR::Session* s)
 	preset_selector->CriticalSelectionChanged.connect (sigc::mem_fun (*this, &ExportDialog::sync_with_manager));
 	timespan_selector->CriticalSelectionChanged.connect (sigc::mem_fun (*this, &ExportDialog::update_warnings_and_example_filename));
 	channel_selector->CriticalSelectionChanged.connect (sigc::mem_fun (*this, &ExportDialog::update_warnings_and_example_filename));
+	channel_selector->CriticalSelectionChanged.connect (sigc::mem_fun (*this, &ExportDialog::update_realtime_selection));
 	file_notebook->CriticalSelectionChanged.connect (sigc::mem_fun (*this, &ExportDialog::update_warnings_and_example_filename));
 
 	update_warnings_and_example_filename ();
+	update_realtime_selection ();
+
+	_session->config.ParameterChanged.connect (*this, invalidator (*this), boost::bind (&ExportDialog::parameter_changed, this, _1), gui_context());
 }
 
 void
@@ -204,6 +210,7 @@ ExportDialog::sync_with_manager ()
 	file_notebook->sync_with_manager ();
 
 	update_warnings_and_example_filename ();
+	update_realtime_selection ();
 }
 
 void
@@ -245,6 +252,47 @@ ExportDialog::update_warnings_and_example_filename ()
 }
 
 void
+ExportDialog::update_realtime_selection ()
+{
+	bool rt_ok = true;
+	switch (profile_manager->type ()) {
+		case ExportProfileManager::RegularExport:
+			break;
+		case ExportProfileManager::RangeExport:
+			break;
+		case ExportProfileManager::SelectionExport:
+			break;
+		case ExportProfileManager::RegionExport:
+			if (!profile_manager->get_channel_configs().empty ()) {
+				switch (profile_manager->get_channel_configs().front()->config->region_processing_type ()) {
+					case RegionExportChannelFactory::Raw:
+					case RegionExportChannelFactory::Fades:
+						rt_ok = false;
+						break;
+					default:
+						break;
+				}
+			}
+			break;
+		case ExportProfileManager::StemExport:
+			if (! static_cast<TrackExportChannelSelector*>(channel_selector.get())->track_output ()) {
+				rt_ok = false;
+			}
+			break;
+	}
+
+	timespan_selector->allow_realtime_export (rt_ok);
+}
+
+void
+ExportDialog::parameter_changed (std::string const& p)
+{
+	if (p == "realtime-export") {
+		update_realtime_selection ();
+	}
+}
+
+void
 ExportDialog::show_conflicting_files ()
 {
 	ArdourDialog dialog (_("Files that will be overwritten"), true);
@@ -300,6 +348,8 @@ ExportDialog::do_export ()
 void
 ExportDialog::show_progress ()
 {
+	export_notebook.set_sensitive (false);
+
 	cancel_button->set_label (_("Stop Export"));
 	export_button->set_sensitive (false);
 
@@ -329,16 +379,17 @@ ExportDialog::show_progress ()
 
 	if (!status->aborted()) {
 		hide();
-
-		NagScreen* ns = NagScreen::maybe_nag (_("export"));
-
-		if (ns) {
-			ns->nag ();
-			delete ns;
+		if (!ARDOUR::Profile->get_mixbus()) {
+			NagScreen* ns = NagScreen::maybe_nag (_("export"));
+			if (ns) {
+				ns->nag ();
+				delete ns;
+			}
 		}
 	} else {
 		notify_errors ();
 	}
+	export_notebook.set_sensitive (true);
 }
 
 gint
@@ -355,7 +406,12 @@ ExportDialog::progress_timeout ()
 	case ExportStatus::Normalizing:
 		status_text = string_compose (_("Normalizing '%3' (timespan %1 of %2)"),
 		                              status->timespan, status->total_timespans, status->timespan_name);
-		progress = ((float) status->current_normalize_cycle) / status->total_normalize_cycles;
+		progress = ((float) status->current_postprocessing_cycle) / status->total_postprocessing_cycles;
+		break;
+	case ExportStatus::Encoding:
+		status_text = string_compose (_("Encoding '%3' (timespan %1 of %2)"),
+		                              status->timespan, status->total_timespans, status->timespan_name);
+		progress = ((float) status->current_postprocessing_cycle) / status->total_postprocessing_cycles;
 		break;
 	case ExportStatus::Tagging:
 		status_text = string_compose (_("Tagging '%3' (timespan %1 of %2)"),
diff --git a/gtk2_ardour/export_dialog.h b/gtk2_ardour/export_dialog.h
index 54446b7..fee7013 100644
--- a/gtk2_ardour/export_dialog.h
+++ b/gtk2_ardour/export_dialog.h
@@ -103,6 +103,9 @@ class ExportDialog : public ArdourDialog, public PBD::ScopedConnectionList
 
 	void do_export ();
 
+	void update_realtime_selection ();
+	void parameter_changed (std::string const&);
+
 	void show_progress ();
 	gint progress_timeout ();
 
diff --git a/gtk2_ardour/export_file_notebook.cc b/gtk2_ardour/export_file_notebook.cc
index 0ebee83..8e37356 100644
--- a/gtk2_ardour/export_file_notebook.cc
+++ b/gtk2_ardour/export_file_notebook.cc
@@ -24,7 +24,7 @@
 
 #include "gui_thread.h"
 #include "utils.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 using namespace ARDOUR_UI_UTILS;
diff --git a/gtk2_ardour/export_filename_selector.cc b/gtk2_ardour/export_filename_selector.cc
index fd41171..e16f527 100644
--- a/gtk2_ardour/export_filename_selector.cc
+++ b/gtk2_ardour/export_filename_selector.cc
@@ -20,9 +20,10 @@
 
 #include <gtkmm/messagedialog.h>
 
+#include "pbd/openuri.h"
 #include "export_filename_selector.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 
@@ -36,6 +37,7 @@ ExportFilenameSelector::ExportFilenameSelector () :
 
 	path_label (_("Folder:"), Gtk::ALIGN_LEFT),
 	browse_button (_("Browse")),
+	open_button (_("Open Folder")),
 
 	example_filename_label ("", Gtk::ALIGN_LEFT),
 	_require_timespan (false)
@@ -61,6 +63,7 @@ ExportFilenameSelector::ExportFilenameSelector () :
 	path_hbox.pack_start (path_label, false, false, 3);
 	path_hbox.pack_start (path_entry, true, true, 3);
 	path_hbox.pack_start (browse_button, false, false, 3);
+	path_hbox.pack_start (open_button, false, false, 3); // maybe Mixbus only ?
 
 	path_entry.set_activates_default ();
 
@@ -104,6 +107,7 @@ ExportFilenameSelector::ExportFilenameSelector () :
 	revision_spinbutton.signal_value_changed().connect (sigc::mem_fun (*this, &ExportFilenameSelector::change_revision_value));
 
 	browse_button.signal_clicked().connect (sigc::mem_fun (*this, &ExportFilenameSelector::open_browse_dialog));
+	open_button.signal_clicked().connect (sigc::mem_fun (*this, &ExportFilenameSelector::open_folder));
 }
 
 ExportFilenameSelector::~ExportFilenameSelector ()
@@ -367,6 +371,18 @@ ExportFilenameSelector::change_revision_value ()
 }
 
 void
+ExportFilenameSelector::open_folder ()
+{
+	const std::string& dir (path_entry.get_text());
+	if (!Glib::file_test (dir, Glib::FILE_TEST_IS_DIR|Glib::FILE_TEST_EXISTS)) {
+		Gtk::MessageDialog msg (string_compose (_("%1: this is not a valid directory/folder."), dir));
+		msg.run ();
+		return;
+	}
+	PBD::open_folder (dir);
+}
+
+void
 ExportFilenameSelector::open_browse_dialog ()
 {
 	Gtk::FileChooserDialog dialog(_("Choose export folder"), Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER);
diff --git a/gtk2_ardour/export_filename_selector.h b/gtk2_ardour/export_filename_selector.h
index 54ed296..a65e168 100644
--- a/gtk2_ardour/export_filename_selector.h
+++ b/gtk2_ardour/export_filename_selector.h
@@ -61,6 +61,7 @@ class ExportFilenameSelector : public Gtk::VBox, public ARDOUR::SessionHandlePtr
 	void change_revision_value ();
 
 	void open_browse_dialog ();
+	void open_folder ();
 
 	boost::shared_ptr<ARDOUR::ExportFilename> filename;
 
@@ -84,6 +85,7 @@ class ExportFilenameSelector : public Gtk::VBox, public ARDOUR::SessionHandlePtr
 	Gtk::Label        path_label;
 	Gtk::Entry        path_entry;
 	Gtk::Button       browse_button;
+	Gtk::Button       open_button;
 	Gtk::Label        example_filename_label;
 
 	/* Date combo */
diff --git a/gtk2_ardour/export_format_dialog.cc b/gtk2_ardour/export_format_dialog.cc
index f76effa..862401f 100644
--- a/gtk2_ardour/export_format_dialog.cc
+++ b/gtk2_ardour/export_format_dialog.cc
@@ -23,7 +23,8 @@
 
 #include "export_format_dialog.h"
 #include "gui_thread.h"
-#include "i18n.h"
+#include "tooltips.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 
@@ -38,9 +39,16 @@ ExportFormatDialog::ExportFormatDialog (FormatPtr format, bool new_dialog) :
   name_label (_("Label: "), Gtk::ALIGN_LEFT),
   name_generated_part ("", Gtk::ALIGN_LEFT),
 
-  normalize_checkbox (_("Normalize to:")),
-  normalize_adjustment (0.00, -90.00, 0.00, 0.1, 0.2),
-  normalize_db_label (_("dBFS"), Gtk::ALIGN_LEFT),
+  normalize_checkbox (_("Normalize:")),
+  normalize_peak_rb (_("Peak")),
+  normalize_loudness_rb (_("Loudness")),
+  normalize_dbfs_adjustment ( 0.00, -90.00, 0.00, 0.1, 0.2),
+  normalize_lufs_adjustment (-23.0, -90.00, 0.00, 0.1, 1.0),
+  normalize_dbtp_adjustment ( -1.0, -90.00, 0.00, 0.1, 0.2),
+
+  normalize_dbfs_label (_("dBFS"), Gtk::ALIGN_LEFT),
+  normalize_lufs_label (_("LUFS"), Gtk::ALIGN_LEFT),
+  normalize_dbtp_label (_("dBTP"), Gtk::ALIGN_LEFT),
 
   silence_table (2, 4),
   trim_start_checkbox (_("Trim silence at start")),
@@ -51,7 +59,7 @@ ExportFormatDialog::ExportFormatDialog (FormatPtr format, bool new_dialog) :
   silence_end_checkbox (_("Add silence at end:")),
   silence_end_clock ("silence_end", true, "", true, false, true),
 
-  command_label(_("Command to run post-export\n(%f=full path & filename, %d=directory, %b=basename):"), Gtk::ALIGN_LEFT),
+  command_label(_("Command to run post-export\n(%f=file path, %d=directory, %b=basename, see tooltip for more):"), Gtk::ALIGN_LEFT),
 
   format_table (3, 4),
   compatibility_label (_("Compatibility"), Gtk::ALIGN_LEFT),
@@ -95,11 +103,29 @@ ExportFormatDialog::ExportFormatDialog (FormatPtr format, bool new_dialog) :
 
 	/* Normalize */
 
-	normalize_hbox.pack_start (normalize_checkbox, false, false, 0);
-	normalize_hbox.pack_start (normalize_spinbutton, false, false, 6);
-	normalize_hbox.pack_start (normalize_db_label, false, false, 0);
+	Gtk::RadioButtonGroup normalize_group = normalize_loudness_rb.get_group();
+	normalize_peak_rb.set_group (normalize_group);
+
+	normalize_hbox.pack_start (normalize_checkbox, false, false, 2);
+	normalize_hbox.pack_start (normalize_peak_rb, false, false, 0);
+	normalize_hbox.pack_start (normalize_dbfs_spinbutton, false, false, 2);
+	normalize_hbox.pack_start (normalize_dbfs_label, false, false, 0);
+
+	normalize_hbox.pack_start (*Gtk::manage (new Gtk::Label ("")), false, false, 6); // separator
+
+	normalize_hbox.pack_start (normalize_loudness_rb, false, false, 0);
+	normalize_hbox.pack_start (normalize_lufs_spinbutton, false, false, 2);
+	normalize_hbox.pack_start (normalize_lufs_label, false, false, 0);
+	normalize_hbox.pack_start (*Gtk::manage (new Gtk::Label (_("\u2227"))), false, false, 4);
+	normalize_hbox.pack_start (normalize_dbtp_spinbutton, false, false, 2);
+	normalize_hbox.pack_start (normalize_dbtp_label, false, false, 0);
+
+	ARDOUR_UI_UTILS::set_tooltip (normalize_loudness_rb,
+			_("Normalize to EBU-R128 LUFS target loudness without exceeding the given true-peak limit. EBU-R128 normalization is only available for mono and stereo targets, true-peak works for any channel layout."));
 
-	normalize_spinbutton.configure (normalize_adjustment, 0.1, 2);
+	normalize_dbfs_spinbutton.configure (normalize_dbfs_adjustment, 0.1, 2);
+	normalize_lufs_spinbutton.configure (normalize_lufs_adjustment, 0.1, 2);
+	normalize_dbtp_spinbutton.configure (normalize_dbtp_adjustment, 0.1, 2);
 
 	/* Silence  */
 
@@ -121,6 +147,33 @@ ExportFormatDialog::ExportFormatDialog (FormatPtr format, bool new_dialog) :
 	get_vbox()->pack_start (command_label, false, false);
 	get_vbox()->pack_start (command_entry, false, false);
 
+	ARDOUR_UI_UTILS::set_tooltip (command_entry,
+			_(
+				"%a Artist name\n"
+				"%b File's base-name\n"
+				"%c Copyright\n"
+				"%d File's directory\n"
+				"%f File's full absolute path\n"
+				"%l Lyricist\n"
+				"%n Session name\n"
+				"%o Conductor\n"
+				"%t Title\n"
+				"%z Organization\n"
+				"%A Album\n"
+				"%C Comment\n"
+				"%E Engineer\n"
+				"%G Genre\n"
+				"%L Total track count\n"
+				"%M Mixer\n"
+				"%N Timespan name\n"
+				"%O Composer\n"
+				"%P Producer\n"
+				"%S Disc subtitle\n"
+				"%T Track number\n"
+				"%Y Year\n"
+				"%Z Country"
+			 ));
+
 	/* Format table */
 
 	init_format_table();
@@ -171,7 +224,11 @@ ExportFormatDialog::ExportFormatDialog (FormatPtr format, bool new_dialog) :
 	trim_end_checkbox.signal_toggled().connect (sigc::mem_fun (*this, &ExportFormatDialog::update_trim_end_selection));
 
 	normalize_checkbox.signal_toggled().connect (sigc::mem_fun (*this, &ExportFormatDialog::update_normalize_selection));
-	normalize_spinbutton.signal_value_changed().connect (sigc::mem_fun (*this, &ExportFormatDialog::update_normalize_selection));
+	normalize_peak_rb.signal_toggled().connect (sigc::mem_fun (*this, &ExportFormatDialog::update_normalize_selection));
+	normalize_loudness_rb.signal_toggled().connect (sigc::mem_fun (*this, &ExportFormatDialog::update_normalize_selection));
+	normalize_dbfs_spinbutton.signal_value_changed().connect (sigc::mem_fun (*this, &ExportFormatDialog::update_normalize_selection));
+	normalize_lufs_spinbutton.signal_value_changed().connect (sigc::mem_fun (*this, &ExportFormatDialog::update_normalize_selection));
+	normalize_dbtp_spinbutton.signal_value_changed().connect (sigc::mem_fun (*this, &ExportFormatDialog::update_normalize_selection));
 
 	silence_start_checkbox.signal_toggled().connect (sigc::mem_fun (*this, &ExportFormatDialog::update_silence_start_selection));
 	silence_start_clock.ValueChanged.connect (sigc::mem_fun (*this, &ExportFormatDialog::update_silence_start_selection));
@@ -201,6 +258,7 @@ ExportFormatDialog::ExportFormatDialog (FormatPtr format, bool new_dialog) :
 	/* Finalize */
 
 	show_all_children();
+	update_normalize_sensitivity ();
 }
 
 ExportFormatDialog::~ExportFormatDialog ()
@@ -252,7 +310,11 @@ ExportFormatDialog::load_state (FormatPtr spec)
 	name_entry.set_text (spec->name());
 
 	normalize_checkbox.set_active (spec->normalize());
-	normalize_spinbutton.set_value (spec->normalize_target());
+	normalize_peak_rb.set_active (!spec->normalize_loudness());
+	normalize_loudness_rb.set_active (spec->normalize_loudness());
+	normalize_dbfs_spinbutton.set_value (spec->normalize_dbfs());
+	normalize_lufs_spinbutton.set_value (spec->normalize_lufs());
+	normalize_dbtp_spinbutton.set_value (spec->normalize_dbtp());
 
 	trim_start_checkbox.set_active (spec->trim_beginning());
 	silence_start = spec->silence_beginning_time();
@@ -307,6 +369,7 @@ ExportFormatDialog::load_state (FormatPtr spec)
 		}
 	}
 
+	update_normalize_sensitivity ();
 	tag_checkbox.set_active (spec->tag());
 	command_entry.set_text (spec->command());
 }
@@ -768,10 +831,24 @@ ExportFormatDialog::update_trim_end_selection ()
 }
 
 void
+ExportFormatDialog::update_normalize_sensitivity ()
+{
+	bool en = normalize_checkbox.get_active();
+	bool loudness = normalize_loudness_rb.get_active();
+	normalize_dbfs_spinbutton.set_sensitive (!loudness && en);
+	normalize_lufs_spinbutton.set_sensitive (loudness && en);
+	normalize_dbtp_spinbutton.set_sensitive (loudness && en);
+}
+
+void
 ExportFormatDialog::update_normalize_selection ()
 {
 	manager.select_normalize (normalize_checkbox.get_active());
-	manager.select_normalize_target (normalize_spinbutton.get_value ());
+	manager.select_normalize_loudness (normalize_loudness_rb.get_active());
+	manager.select_normalize_dbfs (normalize_dbfs_spinbutton.get_value ());
+	manager.select_normalize_lufs (normalize_lufs_spinbutton.get_value ());
+	manager.select_normalize_dbtp (normalize_dbtp_spinbutton.get_value ());
+	update_normalize_sensitivity ();
 }
 
 void
diff --git a/gtk2_ardour/export_format_dialog.h b/gtk2_ardour/export_format_dialog.h
index 6197d0d..8709ff9 100644
--- a/gtk2_ardour/export_format_dialog.h
+++ b/gtk2_ardour/export_format_dialog.h
@@ -126,6 +126,7 @@ class ExportFormatDialog : public ArdourDialog, public PBD::ScopedConnectionList
 	void update_trim_end_selection ();
 
 	void update_normalize_selection ();
+	void update_normalize_sensitivity ();
 	void update_silence_start_selection ();
 	void update_silence_end_selection ();
 
@@ -163,9 +164,17 @@ class ExportFormatDialog : public ArdourDialog, public PBD::ScopedConnectionList
 
 	Gtk::HBox        normalize_hbox;
 	Gtk::CheckButton normalize_checkbox;
-	Gtk::SpinButton  normalize_spinbutton;
-	Gtk::Adjustment  normalize_adjustment;
-	Gtk::Label       normalize_db_label;
+	Gtk::RadioButton normalize_peak_rb;
+	Gtk::RadioButton normalize_loudness_rb;
+	Gtk::SpinButton  normalize_dbfs_spinbutton;
+	Gtk::Adjustment  normalize_dbfs_adjustment;
+	Gtk::SpinButton  normalize_lufs_spinbutton;
+	Gtk::Adjustment  normalize_lufs_adjustment;
+	Gtk::SpinButton  normalize_dbtp_spinbutton;
+	Gtk::Adjustment  normalize_dbtp_adjustment;
+	Gtk::Label       normalize_dbfs_label;
+	Gtk::Label       normalize_lufs_label;
+	Gtk::Label       normalize_dbtp_label;
 
 	/* Silence  */
 
diff --git a/gtk2_ardour/export_format_selector.cc b/gtk2_ardour/export_format_selector.cc
index 4074656..c77a09c 100644
--- a/gtk2_ardour/export_format_selector.cc
+++ b/gtk2_ardour/export_format_selector.cc
@@ -25,7 +25,7 @@
 #include "ardour/export_format_specification.h"
 #include "ardour/export_profile_manager.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 ExportFormatSelector::ExportFormatSelector () :
   edit_button (Gtk::Stock::EDIT),
diff --git a/gtk2_ardour/export_preset_selector.cc b/gtk2_ardour/export_preset_selector.cc
index 3e3b0d0..018beae 100644
--- a/gtk2_ardour/export_preset_selector.cc
+++ b/gtk2_ardour/export_preset_selector.cc
@@ -22,7 +22,7 @@
 
 #include "ardour/export_preset.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 ExportPresetSelector::ExportPresetSelector () :
   label (_("Preset"), Gtk::ALIGN_LEFT),
diff --git a/gtk2_ardour/export_report.cc b/gtk2_ardour/export_report.cc
index c03a8bb..942e1dd 100644
--- a/gtk2_ardour/export_report.cc
+++ b/gtk2_ardour/export_report.cc
@@ -24,6 +24,7 @@
 #include <gtkmm/stock.h>
 
 #include "pbd/openuri.h"
+#include "pbd/basename.h"
 #include "gtkmm2ext/utils.h"
 #include "gtkmm2ext/utils.h"
 #include "canvas/utils.h"
@@ -46,29 +47,45 @@
 #include "logmeter.h"
 #include "ui_config.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace Gtk;
 using namespace ARDOUR;
 
 ExportReport::ExportReport (Session* session, StatusPtr s)
 	: ArdourDialog (_("Export Report/Analysis"))
-	, status (s)
 	, _session (session)
+	, stop_btn (0)
+	, play_btn (0)
 	, _audition_num (-1)
 	, _page_num (0)
 {
+	init (s->result_map, true);
+}
+
+ExportReport::ExportReport (const std::string & title, const AnalysisResults & ar)
+	: ArdourDialog (title)
+	, _session (0)
+	, stop_btn (0)
+	, play_btn (0)
+	, _audition_num (-1)
+	, _page_num (0)
+{
+	init (ar, false);
+}
+
+void
+ExportReport::init (const AnalysisResults & ar, bool with_file)
+{
 	set_resizable (false);
 	pages.set_scrollable ();
 
-	AnalysisResults & ar = status->result_map;
-
 	std::vector<double> dashes;
 	dashes.push_back (3.0);
 	dashes.push_back (5.0);
 
 	int page = 0;
-	for (AnalysisResults::iterator i = ar.begin (); i != ar.end (); ++i, ++page) {
+	for (AnalysisResults::const_iterator i = ar.begin (); i != ar.end (); ++i, ++page) {
 		Label *l;
 		VBox *vb = manage (new VBox ());
 		Table *t = manage (new Table (4, 4));
@@ -87,19 +104,21 @@ ExportReport::ExportReport (Session* session, StatusPtr s)
 
 		std::list<CimgPlayheadArea*> playhead_widgets;
 
-		l = manage (new Label (_("File:"), ALIGN_END));
-		t->attach (*l, 0, 1, 0, 1);
-		l = manage (new Label ());
-		l->set_ellipsize (Pango::ELLIPSIZE_START);
-		l->set_width_chars (48);
-		l->set_max_width_chars (48);
-		l->set_text (path);
-		l->set_alignment (ALIGN_START, ALIGN_CENTER);
-		t->attach (*l, 1, 3, 0, 1, FILL, SHRINK);
+		if (with_file) {
+			l = manage (new Label (_("File:"), ALIGN_END));
+			t->attach (*l, 0, 1, 0, 1);
+			l = manage (new Label ());
+			l->set_ellipsize (Pango::ELLIPSIZE_START);
+			l->set_width_chars (48);
+			l->set_max_width_chars (48);
+			l->set_text (path);
+			l->set_alignment (ALIGN_START, ALIGN_CENTER);
+			t->attach (*l, 1, 3, 0, 1, FILL, SHRINK);
 
-		Button *b = manage (new Button (_("Open Folder")));
-		t->attach (*b, 3, 4, 0, 2, FILL, SHRINK);
-		b->signal_clicked ().connect (sigc::bind (sigc::mem_fun (*this, &ExportReport::open_folder), path));
+			Button *b = manage (new Button (_("Open Folder")));
+			t->attach (*b, 3, 4, 0, 2, FILL, SHRINK);
+			b->signal_clicked ().connect (sigc::bind (sigc::mem_fun (*this, &ExportReport::open_folder), path));
+		}
 
 		SoundFileInfo info;
 		std::string errmsg;
@@ -108,8 +127,9 @@ ExportReport::ExportReport (Session* session, StatusPtr s)
 		framecnt_t sample_rate = 0;
 		framecnt_t start_off = 0;
 		unsigned int channels = 0;
+		std::string file_fmt;
 
-		if (AudioFileSource::get_soundfile_info (path, info, errmsg)) {
+		if (with_file && AudioFileSource::get_soundfile_info (path, info, errmsg)) {
 			AudioClock * clock;
 
 			file_length = info.length;
@@ -126,13 +146,13 @@ ExportReport::ExportReport (Session* session, StatusPtr s)
 
 			l = manage (new Label (_("Format:"), ALIGN_END));
 			t->attach (*l, 0, 1, 1, 2);
-			std::string fmt = info.format_name;
-			std::replace (fmt.begin (), fmt.end (), '\n', ' ');
+			file_fmt = info.format_name;
+			std::replace (file_fmt.begin (), file_fmt.end (), '\n', ' ');
 			l = manage (new Label ());
 			l->set_ellipsize (Pango::ELLIPSIZE_START);
 			l->set_width_chars (48);
 			l->set_max_width_chars (48);
-			l->set_text (fmt);
+			l->set_text (file_fmt);
 			l->set_alignment (ALIGN_START, ALIGN_CENTER);
 			t->attach (*l, 1, 3, 1, 2, FILL, SHRINK);
 
@@ -161,7 +181,7 @@ ExportReport::ExportReport (Session* session, StatusPtr s)
 			clock->set_mode (AudioClock::Timecode);
 			clock->set (info.timecode * src_coef + 0.5, true);
 			t->attach (*clock, 3, 4, 3, 4);
-		} else {
+		} else if (with_file) {
 			l = manage (new Label (_("Error:"), ALIGN_END));
 			t->attach (*l, 0, 1, 1, 2);
 			l = manage (new Label (errmsg, ALIGN_START));
@@ -230,7 +250,7 @@ ExportReport::ExportReport (Session* session, StatusPtr s)
 		mnw = (m_l - /*hist-width*/ 540 - /*box spacing*/ 8 + /*peak-width*/ 800 + m_r) / 2;
 		const int nw2 = mnw / 2; // nums, horizontal center
 
-		int y0[4];
+		int y0[6];
 		if (p->normalized) {
 			y0[0] = (hh - ht) * .5;
 		} else {
@@ -242,6 +262,81 @@ ExportReport::ExportReport (Session* session, StatusPtr s)
 		y0[4] = y0[3] + lin[3] * 1.25;
 		y0[5] = y0[4] + lin[4] * 1.25;
 
+		/* calc heights & alignment of png-image */
+		const float specth = sizeof (p->spectrum[0]) / sizeof (float);
+		const float waveh2 = std::min (100, 8 * lin[0] / (int) p->n_channels);
+
+		Cairo::RefPtr<Cairo::ImageSurface> png_surface;
+		int png_w = 0;
+		int png_y0 = 0;
+
+		if (with_file && UIConfiguration::instance().get_save_export_analysis_image ()) { /*png image */
+			const int top_w = 540 + 2 * (mnw + 4); // 4px spacing
+			const int wav_w = m_l + m_r + 4 + sizeof (p->peaks) / sizeof (ARDOUR::PeakData::PeakDatum) / 4;
+			const int spc_w = m_l + m_r + 4 + sizeof (p->spectrum) / sizeof (float) / specth;
+			int ann_h = 0;
+			int linesp = 0;
+
+			if (channels > 0 && file_length > 0 && sample_rate > 0) {
+				layout->set_font_description (UIConfiguration::instance ().get_SmallMonospaceFont ());
+				layout->set_text (_("00:00:00.000"));
+				layout->get_pixel_size (w, h);
+				int height = h * 1.75;
+				ann_h = 4 + height /* Time Axis */;
+
+				layout->set_font_description (UIConfiguration::instance ().get_SmallFont ());
+				layout->set_text (_("0|A8"));
+				layout->get_pixel_size (w, h);
+				linesp = h * 1.5;
+				ann_h += 4 + 3 * linesp; /* File Info */;
+			}
+
+			const int png_h = hh + 4 + p->n_channels * (2 * waveh2 + 4) + ann_h + specth + 4;
+			png_w = std::max (std::max (top_w, wav_w), spc_w);
+
+			png_surface = Cairo::ImageSurface::create (Cairo::FORMAT_RGB24, png_w, png_h);
+			Cairo::RefPtr<Cairo::Context> pcx = Cairo::Context::create (png_surface);
+			pcx->set_source_rgb (.2, .2, .2);
+			pcx->paint ();
+
+			if (channels > 0 && file_length > 0 && sample_rate > 0) {
+				png_y0 += 4;
+				// Add file-name, format, duration, sample-rate & timecode
+				pcx->set_source_rgb (.7, .7, .7);
+				layout->set_font_description (UIConfiguration::instance ().get_SmallFont ());
+				layout->set_alignment (Pango::ALIGN_LEFT);
+
+#define IMGLABEL(X0, STR, VAL) {       \
+  layout->set_text (STR);              \
+  pcx->move_to (X0, png_y0);           \
+  layout->get_pixel_size (w, h);       \
+  layout->show_in_cairo_context (pcx); \
+  layout->set_text (VAL);              \
+  pcx->move_to (X0 + w + 2, png_y0);   \
+  layout->show_in_cairo_context (pcx); \
+}
+
+				// TODO get max width of labels per column, right-align labels,  x-align 1/3, 2/3 columns
+				const int lx0 = m_l;
+				const int lx1 = m_l + png_w / 2;
+
+				IMGLABEL (lx0, _("File:"), Glib::path_get_basename (path));
+				IMGLABEL (lx1, _("Channels:"), string_compose ("%1", channels));
+				png_y0 += linesp;
+
+				IMGLABEL (lx0, _("Format:"), file_fmt);
+				IMGLABEL (lx1, _("Sample rate:"), string_compose (_("%1 Hz"), sample_rate));
+				png_y0 += linesp;
+
+				if (_session) {
+					Timecode::Time tct;
+					_session->sample_to_timecode (start_off, tct, false, false);
+					IMGLABEL (lx0, _("Timecode:"), Timecode::timecode_format_time (tct));
+				}
+				IMGLABEL (lx1, _("Duration:"), Timecode::timecode_format_sampletime (file_length, sample_rate, 1000, false));
+				png_y0 += linesp;
+			}
+		}
 
 		{ /* peak, loudness and R128 histogram */
 			Cairo::RefPtr<Cairo::ImageSurface> nums = Cairo::ImageSurface::create (Cairo::FORMAT_ARGB32, mnw, hh);
@@ -463,6 +558,17 @@ ExportReport::ExportReport (Session* session, StatusPtr s)
 
 			hist->flush ();
 
+			if (png_surface) {
+				Cairo::RefPtr<Cairo::Context> pcx = Cairo::Context::create (png_surface);
+				pcx->set_source (nums, 0, png_y0);
+				pcx->paint ();
+				pcx->set_source (hist, (png_w - 540) / 2, png_y0);
+				pcx->paint ();
+				pcx->set_source (ebur, png_w - mnw, png_y0);
+				pcx->paint ();
+				png_y0 += hh + 4;
+			}
+
 			CimgArea *nu = manage (new CimgArea (nums));
 			CimgArea *eb = manage (new CimgArea (ebur));
 			CimgArea *hi = manage (new CimgArea (hist));
@@ -496,6 +602,9 @@ ExportReport::ExportReport (Session* session, StatusPtr s)
 			VBox *lrb = manage (new VBox());
 			ToggleButton *log = manage (new ToggleButton (S_("Logscale|Lg")));
 			ToggleButton *rec = manage (new ToggleButton (S_("Rectified|Rf")));
+			Gtkmm2ext::UI::instance()->set_tip (log, _("Logscale"));
+			Gtkmm2ext::UI::instance()->set_tip (rec, _("Rectified"));
+
 			lrb->pack_start (*log, false, false, 5);
 			lrb->pack_end (*rec, false, false, 5);
 			log->signal_toggled ().connect (sigc::bind (sigc::mem_fun (*this, &ExportReport::on_logscale_toggled), log));
@@ -512,10 +621,10 @@ ExportReport::ExportReport (Session* session, StatusPtr s)
 			Cairo::RefPtr<Cairo::ImageSurface> wave_log;
 			Cairo::RefPtr<Cairo::ImageSurface> wave_rect;
 			Cairo::RefPtr<Cairo::ImageSurface> wave_lr;
-			draw_waveform(wave, p, c, m_l, width, anw, lin[0], false, false);
-			draw_waveform(wave_log, p, c, m_l, width, anw, lin[0], true, false);
-			draw_waveform(wave_rect, p, c, m_l, width, anw, lin[0], false, true);
-			draw_waveform(wave_lr, p, c, m_l, width, anw, lin[0], true, true);
+			draw_waveform(wave, p, c, m_l, width, anw, waveh2, false, false);
+			draw_waveform(wave_log, p, c, m_l, width, anw, waveh2, true, false);
+			draw_waveform(wave_rect, p, c, m_l, width, anw, waveh2, false, true);
+			draw_waveform(wave_lr, p, c, m_l, width, anw, waveh2, true, true);
 
 			CimgWaveArea *wv = manage (new CimgWaveArea (wave, wave_log, wave_rect, wave_lr, m_l, width));
 
@@ -524,6 +633,13 @@ ExportReport::ExportReport (Session* session, StatusPtr s)
 			wv->seek_playhead.connect (sigc::bind<0> (sigc::mem_fun (*this, &ExportReport::audition_seek), page));
 			wtbl->attach (*wv, 0, 1, wrow, wrow + 1, SHRINK, SHRINK);
 			++wrow;
+
+			if (png_surface) {
+				Cairo::RefPtr<Cairo::Context> pcx = Cairo::Context::create (png_surface);
+				pcx->set_source (wave, 0, png_y0);
+				pcx->paint ();
+				png_y0 += 2 * waveh2 + 4;
+			}
 		}
 
 		if (channels > 0 && file_length > 0 && sample_rate > 0)
@@ -581,12 +697,19 @@ ExportReport::ExportReport (Session* session, StatusPtr s)
 			tm->seek_playhead.connect (sigc::bind<0> (sigc::mem_fun (*this, &ExportReport::audition_seek), page));
 			wtbl->attach (*tm, 0, 1, wrow, wrow + 1, SHRINK, SHRINK);
 			++wrow;
+
+			if (png_surface) {
+				Cairo::RefPtr<Cairo::Context> pcx = Cairo::Context::create (png_surface);
+				pcx->set_source (ytme, 0, png_y0);
+				pcx->paint ();
+				png_y0 += height + 4;
+			}
 		}
 
 		{
 			/* Draw Spectrum */
+			const size_t height = specth;
 			const size_t swh = sizeof (p->spectrum) / sizeof (float);
-			const size_t height = sizeof (p->spectrum[0]) / sizeof (float);
 			const size_t width = swh / height;
 
 			Cairo::RefPtr<Cairo::ImageSurface> spec = Cairo::ImageSurface::create (Cairo::FORMAT_ARGB32, m_l + width, height);
@@ -692,6 +815,14 @@ ExportReport::ExportReport (Session* session, StatusPtr s)
 			wtbl->attach (*sp, 0, 1, wrow, wrow + 1, SHRINK, SHRINK);
 			wtbl->attach (*an, 1, 2, wrow, wrow + 1, SHRINK, SHRINK);
 			++wrow;
+
+			if (png_surface) {
+				Cairo::RefPtr<Cairo::Context> pcx = Cairo::Context::create (png_surface);
+				pcx->set_source (spec, 0, png_y0);
+				pcx->paint ();
+				pcx->set_source (scale, png_w - m_r, png_y0);
+				pcx->paint ();
+			}
 		}
 
 		timeline[page] = playhead_widgets;
@@ -706,6 +837,13 @@ ExportReport::ExportReport (Session* session, StatusPtr s)
 		img->hide();
 		pages.pages ().push_back (Notebook_Helpers::TabElem (*vb, *tab));
 		pages.signal_switch_page().connect (sigc::mem_fun (*this, &ExportReport::on_switch_page));
+
+		if (png_surface) {
+			assert (with_file && !path.empty ());
+			std::string imgpath = Glib::build_filename (Glib::path_get_dirname (path), PBD::basename_nosuffix (path) + ".png");
+			PBD::info << string_compose(_("Writing Export Analysis Image: %1."), imgpath) << endmsg;
+			png_surface->write_to_png (imgpath);
+		}
 	}
 
 	pages.set_show_tabs (true);
@@ -721,14 +859,18 @@ ExportReport::ExportReport (Session* session, StatusPtr s)
 		_session->the_auditioner()->AuditionProgress.connect(auditioner_connections, invalidator (*this), boost::bind (&ExportReport::audition_progress, this, _1, _2), gui_context());
 	}
 
-	play_btn = add_button (Stock::MEDIA_PLAY, RESPONSE_ACCEPT);
-	stop_btn = add_button (Stock::MEDIA_STOP, RESPONSE_ACCEPT);
+	if (_session && with_file) {
+		play_btn = add_button (Stock::MEDIA_PLAY, RESPONSE_ACCEPT);
+		stop_btn = add_button (Stock::MEDIA_STOP, RESPONSE_ACCEPT);
+	}
 	add_button (Stock::CLOSE, RESPONSE_CLOSE);
 
 	set_default_response (RESPONSE_CLOSE);
-	stop_btn->signal_clicked().connect (sigc::mem_fun (*this, &ExportReport::stop_audition));
-	play_btn->signal_clicked().connect (sigc::mem_fun (*this, &ExportReport::play_audition));
-	stop_btn->set_sensitive (false);
+	if (_session && with_file) {
+		stop_btn->signal_clicked().connect (sigc::mem_fun (*this, &ExportReport::stop_audition));
+		play_btn->signal_clicked().connect (sigc::mem_fun (*this, &ExportReport::play_audition));
+		stop_btn->set_sensitive (false);
+	}
 	show_all ();
 }
 
@@ -757,6 +899,9 @@ ExportReport::open_folder (std::string p)
 void
 ExportReport::audition_active (bool active)
 {
+	if (!stop_btn || !play_btn) {
+		return;
+	}
 	stop_btn->set_sensitive (active);
 	play_btn->set_sensitive (!active);
 
@@ -924,11 +1069,10 @@ ExportReport::on_rectivied_toggled (Gtk::ToggleButton* b)
 }
 
 void
-ExportReport::draw_waveform (Cairo::RefPtr<Cairo::ImageSurface>& wave, ExportAnalysisPtr p, uint32_t c, int m_l, size_t width, int anw, int height, bool log, bool rect)
+ExportReport::draw_waveform (Cairo::RefPtr<Cairo::ImageSurface>& wave, ExportAnalysisPtr p, uint32_t c, int m_l, size_t width, int anw, int height_2, bool log, bool rect)
 {
 	int w, h;
 	Glib::RefPtr<Pango::Layout> layout = Pango::Layout::create (get_pango_context ());
-	const float height_2 = std::min (100, 8 * height / (int) p->n_channels); // TODO refine
 	const float ht = 2.f * height_2;
 
 	std::vector<double> dashes;
@@ -1005,7 +1149,7 @@ ExportReport::draw_waveform (Cairo::RefPtr<Cairo::ImageSurface>& wave, ExportAna
 		}
 	}
 
-	// > 0dBFS
+	// >= 0dBFS
 	cr->set_source_rgba (1.0, 0, 0, 1.0);
 	for (size_t x = 0 ; x < width; ++x) {
 		if (p->peaks[c][x].max >= 1.0) {
@@ -1019,7 +1163,7 @@ ExportReport::draw_waveform (Cairo::RefPtr<Cairo::ImageSurface>& wave, ExportAna
 	}
 	cr->stroke ();
 
-	// > -1dBTP
+	// >= -1dBTP (coeff >= .89125, libs/vamp-plugins/TruePeak.cpp)
 	cr->set_source_rgba (1.0, 0.7, 0, 0.7);
 	for (std::set<framepos_t>::const_iterator i = p->truepeakpos[c].begin (); i != p->truepeakpos[c].end (); ++i) {
 		cr->move_to (m_l + (*i) - .5, clip_top);
diff --git a/gtk2_ardour/export_report.h b/gtk2_ardour/export_report.h
index 019b2f7..65339be 100644
--- a/gtk2_ardour/export_report.h
+++ b/gtk2_ardour/export_report.h
@@ -186,9 +186,11 @@ class ExportReport : public ArdourDialog
 public:
 	typedef boost::shared_ptr<ARDOUR::ExportStatus> StatusPtr;
 	ExportReport (ARDOUR::Session*, StatusPtr);
+	ExportReport (const std::string & title, const ARDOUR::AnalysisResults & ar);
 	int run ();
 
 private:
+	void init (const ARDOUR::AnalysisResults &, bool);
 	void draw_waveform (Cairo::RefPtr<Cairo::ImageSurface>& wave,
 			ARDOUR::ExportAnalysisPtr, uint32_t, int, size_t, int, int, bool, bool);
 
@@ -203,7 +205,6 @@ private:
 	void on_logscale_toggled (Gtk::ToggleButton*);
 	void on_rectivied_toggled (Gtk::ToggleButton*);
 
-	StatusPtr        status;
 	Gtk::Notebook    pages;
 	ARDOUR::Session* _session;
 	Gtk::Button*     stop_btn;
diff --git a/gtk2_ardour/export_timespan_selector.cc b/gtk2_ardour/export_timespan_selector.cc
index 9a294af..c87d4ef 100644
--- a/gtk2_ardour/export_timespan_selector.cc
+++ b/gtk2_ardour/export_timespan_selector.cc
@@ -32,37 +32,47 @@
 #include <sstream>
 #include <iomanip>
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace Glib;
 using namespace ARDOUR;
 using namespace PBD;
 using std::string;
 
-ExportTimespanSelector::ExportTimespanSelector (ARDOUR::Session * session, ProfileManagerPtr manager) :
-	manager (manager),
-	time_format_label (_("Show Times as:"), Gtk::ALIGN_LEFT)
+ExportTimespanSelector::ExportTimespanSelector (ARDOUR::Session * session, ProfileManagerPtr manager, bool multi)
+	: manager (manager)
+	, _realtime_available (true)
+	, time_format_label (_("Show Times as:"), Gtk::ALIGN_LEFT)
+	, realtime_checkbutton (_("Realtime Export"))
 {
 	set_session (session);
 
 	option_hbox.pack_start (time_format_label, false, false, 0);
 	option_hbox.pack_start (time_format_combo, false, false, 6);
 
-	Gtk::Button* b = Gtk::manage (new Gtk::Button (_("Select All")));
-	b->signal_clicked().connect (
-		sigc::bind (
-			sigc::mem_fun (*this, &ExportTimespanSelector::set_selection_state_of_all_timespans), true
-			)
-		);
-	option_hbox.pack_start (*b, false, false, 6);
-
-	b = Gtk::manage (new Gtk::Button (_("Deselect All")));
-	b->signal_clicked().connect (
-		sigc::bind (
-			sigc::mem_fun (*this, &ExportTimespanSelector::set_selection_state_of_all_timespans), false
-			)
-		);
-	option_hbox.pack_start (*b, false, false, 6);
+	if (multi) {
+		Gtk::Button* b = Gtk::manage (new Gtk::Button (_("Select All")));
+		b->signal_clicked().connect (
+				sigc::bind (
+					sigc::mem_fun (*this, &ExportTimespanSelector::set_selection_state_of_all_timespans), true
+					)
+				);
+		option_hbox.pack_start (*b, false, false, 6);
+
+		b = Gtk::manage (new Gtk::Button (_("Deselect All")));
+		b->signal_clicked().connect (
+				sigc::bind (
+					sigc::mem_fun (*this, &ExportTimespanSelector::set_selection_state_of_all_timespans), false
+					)
+				);
+		option_hbox.pack_start (*b, false, false, 6);
+	}
+	option_hbox.pack_start (realtime_checkbutton, false, false, 6);
+	realtime_checkbutton.set_active (session->config.get_realtime_export ());
+
+	realtime_checkbutton.signal_toggled ().connect (
+			sigc::mem_fun (*this, &ExportTimespanSelector::toggle_realtime)
+			);
 
 	range_scroller.add (range_view);
 
@@ -131,7 +141,7 @@ ExportTimespanSelector::location_sorter(Gtk::TreeModel::iterator a, Gtk::TreeMod
 }
 
 void
-ExportTimespanSelector::add_range_to_selection (ARDOUR::Location const * loc)
+ExportTimespanSelector::add_range_to_selection (ARDOUR::Location const * loc, bool rt)
 {
 	ExportTimespanPtr span = _session->get_export_handler()->add_timespan();
 
@@ -145,6 +155,7 @@ ExportTimespanSelector::add_range_to_selection (ARDOUR::Location const * loc)
 	span->set_range (loc->start(), loc->end());
 	span->set_name (loc->name());
 	span->set_range_id (id);
+	span->set_realtime (rt);
 	state->timespans->push_back (span);
 }
 
@@ -168,6 +179,30 @@ ExportTimespanSelector::sync_with_manager ()
 }
 
 void
+ExportTimespanSelector::allow_realtime_export (bool yn)
+{
+	if (_realtime_available == yn) {
+		return;
+	}
+	_realtime_available = yn;
+	realtime_checkbutton.set_sensitive (_realtime_available);
+	update_timespans ();
+}
+
+void
+ExportTimespanSelector::toggle_realtime ()
+{
+	const bool realtime = !_session->config.get_realtime_export ();
+	_session->config.set_realtime_export (realtime);
+	realtime_checkbutton.set_inconsistent (false);
+	realtime_checkbutton.set_active (realtime);
+
+	for (Gtk::TreeStore::Children::iterator it = range_list->children().begin(); it != range_list->children().end(); ++it) {
+		it->set_value (range_cols.realtime, realtime);
+	}
+}
+
+void
 ExportTimespanSelector::change_time_format ()
 {
 	state->time_format = time_format_combo.get_active()->get_value (time_format_cols.format);
@@ -357,13 +392,18 @@ ExportTimespanSelector::set_selection_state_of_all_timespans (bool s)
 /*** ExportTimespanSelectorSingle ***/
 
 ExportTimespanSelectorSingle::ExportTimespanSelectorSingle (ARDOUR::Session * session, ProfileManagerPtr manager, std::string range_id) :
-	ExportTimespanSelector (session, manager),
+	ExportTimespanSelector (session, manager, false),
 	range_id (range_id)
 {
 	range_scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_NEVER);
+	range_view.append_column_editable (_("RT"), range_cols.realtime);
 	range_view.append_column_editable (_("Range"), range_cols.name);
 
-	if (Gtk::CellRendererText * renderer = dynamic_cast<Gtk::CellRendererText *> (range_view.get_column_cell_renderer (0))) {
+	if (Gtk::CellRendererToggle * renderer = dynamic_cast<Gtk::CellRendererToggle *> (range_view.get_column_cell_renderer (0))) {
+		renderer->signal_toggled().connect (sigc::hide (sigc::mem_fun (*this, &ExportTimespanSelectorSingle::update_timespans)));
+	}
+
+	if (Gtk::CellRendererText * renderer = dynamic_cast<Gtk::CellRendererText *> (range_view.get_column_cell_renderer (1))) {
 		renderer->signal_edited().connect (sigc::mem_fun (*this, &ExportTimespanSelectorSingle::update_range_name));
 	}
 
@@ -376,9 +416,17 @@ ExportTimespanSelectorSingle::ExportTimespanSelectorSingle (ARDOUR::Session * se
 }
 
 void
+ExportTimespanSelectorSingle::allow_realtime_export (bool yn)
+{
+	ExportTimespanSelector::allow_realtime_export (yn);
+	range_view.get_column (0)->set_visible (_realtime_available);
+}
+
+void
 ExportTimespanSelectorSingle::fill_range_list ()
 {
 	if (!state) { return; }
+	const bool realtime = _session->config.get_realtime_export ();
 
 	std::string id;
 	if (!range_id.compare (X_("selection"))) {
@@ -400,11 +448,12 @@ ExportTimespanSelectorSingle::fill_range_list ()
 
 			row[range_cols.location] = *it;
 			row[range_cols.selected] = true;
+			row[range_cols.realtime] = realtime;
 			row[range_cols.name] = (*it)->name();
 			row[range_cols.label] = construct_label (*it);
 			row[range_cols.length] = construct_length (*it);
 
-			add_range_to_selection (*it);
+			add_range_to_selection (*it, false);
 
 			break;
 		}
@@ -413,19 +462,39 @@ ExportTimespanSelectorSingle::fill_range_list ()
 	set_time_format_from_state();
 }
 
+void
+ExportTimespanSelectorSingle::update_timespans ()
+{
+	state->timespans->clear();
+	const bool realtime = _session->config.get_realtime_export ();
+	bool inconsistent = false;
+
+	for (Gtk::TreeStore::Children::iterator it = range_list->children().begin(); it != range_list->children().end(); ++it) {
+		add_range_to_selection (it->get_value (range_cols.location), it->get_value (range_cols.realtime) && _realtime_available);
+		if (it->get_value (range_cols.realtime) != realtime) {
+			inconsistent = true;
+		}
+	}
+	realtime_checkbutton.set_inconsistent (inconsistent);
+}
+
 /*** ExportTimespanSelectorMultiple ***/
 
 ExportTimespanSelectorMultiple::ExportTimespanSelectorMultiple (ARDOUR::Session * session, ProfileManagerPtr manager) :
-  ExportTimespanSelector (session, manager)
+  ExportTimespanSelector (session, manager, true)
 {
 	range_scroller.set_policy (Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC);
 	range_view.append_column_editable ("", range_cols.selected);
+	range_view.append_column_editable (_("RT"), range_cols.realtime);
 	range_view.append_column_editable (_("Range"), range_cols.name);
 
 	if (Gtk::CellRendererToggle * renderer = dynamic_cast<Gtk::CellRendererToggle *> (range_view.get_column_cell_renderer (0))) {
 		renderer->signal_toggled().connect (sigc::hide (sigc::mem_fun (*this, &ExportTimespanSelectorMultiple::update_selection)));
 	}
-	if (Gtk::CellRendererText * renderer = dynamic_cast<Gtk::CellRendererText *> (range_view.get_column_cell_renderer (1))) {
+	if (Gtk::CellRendererToggle * renderer = dynamic_cast<Gtk::CellRendererToggle *> (range_view.get_column_cell_renderer (1))) {
+		renderer->signal_toggled().connect (sigc::hide (sigc::mem_fun (*this, &ExportTimespanSelectorMultiple::update_selection)));
+	}
+	if (Gtk::CellRendererText * renderer = dynamic_cast<Gtk::CellRendererText *> (range_view.get_column_cell_renderer (2))) {
 		renderer->signal_edited().connect (sigc::mem_fun (*this, &ExportTimespanSelectorMultiple::update_range_name));
 	}
 
@@ -438,9 +507,17 @@ ExportTimespanSelectorMultiple::ExportTimespanSelectorMultiple (ARDOUR::Session
 }
 
 void
+ExportTimespanSelectorMultiple::allow_realtime_export (bool yn)
+{
+	ExportTimespanSelector::allow_realtime_export (yn);
+	range_view.get_column (1)->set_visible (_realtime_available);
+}
+
+void
 ExportTimespanSelectorMultiple::fill_range_list ()
 {
 	if (!state) { return; }
+	const bool realtime = _session->config.get_realtime_export ();
 
 	range_list->clear();
 
@@ -453,6 +530,7 @@ ExportTimespanSelectorMultiple::fill_range_list ()
 
 		row[range_cols.location] = *it;
 		row[range_cols.selected] = false;
+		row[range_cols.realtime] = realtime;
 		row[range_cols.name] = (*it)->name();
 		row[range_cols.label] = construct_label (*it);
 		row[range_cols.length] = construct_length (*it);
@@ -474,6 +552,7 @@ ExportTimespanSelectorMultiple::set_selection_from_state ()
 			if ((id == "selection" && loc == state->selection_range.get()) ||
 			    (id == loc->id().to_s())) {
 				tree_it->set_value (range_cols.selected, true);
+				tree_it->set_value (range_cols.realtime, (*it)->realtime ());
 			}
 		}
 	}
@@ -492,11 +571,17 @@ void
 ExportTimespanSelectorMultiple::update_timespans ()
 {
 	state->timespans->clear();
+	const bool realtime = _session->config.get_realtime_export ();
+	bool inconsistent = false;
 
 	for (Gtk::TreeStore::Children::iterator it = range_list->children().begin(); it != range_list->children().end(); ++it) {
 		if (it->get_value (range_cols.selected)) {
-			add_range_to_selection (it->get_value (range_cols.location));
+			add_range_to_selection (it->get_value (range_cols.location), it->get_value (range_cols.realtime) && _realtime_available);
+		}
+		if (it->get_value (range_cols.realtime) != realtime) {
+			inconsistent = true;
 		}
 	}
+	realtime_checkbutton.set_inconsistent (inconsistent);
 }
 
diff --git a/gtk2_ardour/export_timespan_selector.h b/gtk2_ardour/export_timespan_selector.h
index 1216670..91a53e5 100644
--- a/gtk2_ardour/export_timespan_selector.h
+++ b/gtk2_ardour/export_timespan_selector.h
@@ -60,11 +60,12 @@ class ExportTimespanSelector : public Gtk::VBox, public ARDOUR::SessionHandlePtr
 
   public:
 
-	ExportTimespanSelector (ARDOUR::Session * session, ProfileManagerPtr manager);
+	ExportTimespanSelector (ARDOUR::Session * session, ProfileManagerPtr manager, bool multi);
 
 	virtual ~ExportTimespanSelector ();
 
 	void sync_with_manager ();
+	virtual void allow_realtime_export (bool);
 
 	sigc::signal<void> CriticalSelectionChanged;
 
@@ -72,11 +73,14 @@ class ExportTimespanSelector : public Gtk::VBox, public ARDOUR::SessionHandlePtr
 
 	ProfileManagerPtr manager;
 	TimespanStatePtr  state;
+	bool _realtime_available;
 
 	virtual void fill_range_list () = 0;
+	virtual void update_timespans () = 0;
 
-	void add_range_to_selection (ARDOUR::Location const * loc);
+	void add_range_to_selection (ARDOUR::Location const * loc, bool rt);
 	void set_time_format_from_state ();
+	void toggle_realtime ();
 
 	void change_time_format ();
 
@@ -93,8 +97,9 @@ class ExportTimespanSelector : public Gtk::VBox, public ARDOUR::SessionHandlePtr
 
 	/*** GUI components ***/
 
-	Gtk::HBox      option_hbox;
-	Gtk::Label     time_format_label;
+	Gtk::HBox        option_hbox;
+	Gtk::Label       time_format_label;
+	Gtk::CheckButton realtime_checkbutton;
 
 	/* Time format */
 
@@ -120,10 +125,11 @@ class ExportTimespanSelector : public Gtk::VBox, public ARDOUR::SessionHandlePtr
 		Gtk::TreeModelColumn<ARDOUR::Location *>  location;
 		Gtk::TreeModelColumn<std::string>       label;
 		Gtk::TreeModelColumn<bool>              selected;
+		Gtk::TreeModelColumn<bool>              realtime;
 		Gtk::TreeModelColumn<std::string>       name;
 		Gtk::TreeModelColumn<std::string>       length;
 
-		RangeCols () { add (location); add(label); add(selected); add(name); add(length); }
+		RangeCols () { add (location); add(label); add(selected); add(realtime); add(name); add(length); }
 	};
 	RangeCols                    range_cols;
 
@@ -139,6 +145,8 @@ class ExportTimespanSelectorMultiple : public ExportTimespanSelector
   public:
 	ExportTimespanSelectorMultiple (ARDOUR::Session * session, ProfileManagerPtr manager);
 
+	void allow_realtime_export (bool);
+
   private:
 
 	virtual void fill_range_list ();
@@ -154,9 +162,12 @@ class ExportTimespanSelectorSingle : public ExportTimespanSelector
   public:
 	ExportTimespanSelectorSingle (ARDOUR::Session * session, ProfileManagerPtr manager, std::string range_id);
 
+	void allow_realtime_export (bool);
+
   private:
 
 	virtual void fill_range_list ();
+	void update_timespans ();
 
 	std::string range_id;
 
diff --git a/gtk2_ardour/export_video_dialog.cc b/gtk2_ardour/export_video_dialog.cc
index f09306d..fba09e9 100644
--- a/gtk2_ardour/export_video_dialog.cc
+++ b/gtk2_ardour/export_video_dialog.cc
@@ -55,7 +55,7 @@
 #include "opts.h"
 #include "export_video_dialog.h"
 #include "utils_videotl.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace Gtk;
 using namespace std;
@@ -366,7 +366,7 @@ ExportVideoDialog::apply_state (TimeSelection &tme, bool range)
 
 	float tcfps = _session->timecode_frames_per_second();
 
-	LocaleGuard lg (X_("C"));
+	LocaleGuard lg;
 
 	XMLNode* node = _session->extra_xml (X_("Videotimeline"));
 	bool filenameset = false;
@@ -402,7 +402,7 @@ ExportVideoDialog::apply_state (TimeSelection &tme, bool range)
 
 	node = _session->extra_xml (X_("Videoexport"));
 	if (node) {
-		const XMLProperty* prop;
+		XMLProperty const * prop;
 		prop = node->property (X_("ChangeGeometry"));
 		if (prop) { scale_checkbox.set_active(atoi(prop->value())?true:false); }
 		prop = node->property (X_("KeepAspect"));
@@ -482,7 +482,7 @@ ExportVideoDialog::apply_state (TimeSelection &tme, bool range)
 XMLNode&
 ExportVideoDialog::get_state ()
 {
-	LocaleGuard lg (X_("C"));
+	LocaleGuard lg;
 	XMLNode* node = new XMLNode (X_("Videoexport"));
 	node->add_property (X_("ChangeGeometry"), scale_checkbox.get_active() ? X_("1") : X_("0"));
 	node->add_property (X_("KeepAspect"), scale_aspect.get_active() ? X_("1") : X_("0"));
@@ -559,7 +559,7 @@ ExportVideoDialog::audio_progress_display ()
 	switch (status->active_job) {
 		case ExportStatus::Normalizing:
 			pbar.set_text (_("Normalizing audio"));
-			progress = ((float) status->current_normalize_cycle) / status->total_normalize_cycles;
+			progress = ((float) status->current_postprocessing_cycle) / status->total_postprocessing_cycles;
 			progress = progress / (_twopass ? 4.0 : 3.0) + (_twopass ? .25 : 1.0 / 3.0);
 			break;
 		case ExportStatus::Exporting:
diff --git a/gtk2_ardour/export_video_infobox.cc b/gtk2_ardour/export_video_infobox.cc
index 15ecc1a..f886bee 100644
--- a/gtk2_ardour/export_video_infobox.cc
+++ b/gtk2_ardour/export_video_infobox.cc
@@ -22,7 +22,7 @@
 #undef interface
 #endif
 #include "export_video_infobox.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace Gtk;
 using namespace std;
diff --git a/gtk2_ardour/fft_graph.cc b/gtk2_ardour/fft_graph.cc
index 1edd483..ec54acb 100644
--- a/gtk2_ardour/fft_graph.cc
+++ b/gtk2_ardour/fft_graph.cc
@@ -14,7 +14,6 @@
     You should have received a copy of the GNU General Public License
     along with this program; if not, write to the Free Software
     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
 */
 
 #ifdef COMPILER_MSVC
@@ -40,12 +39,15 @@ using std::min; using std::max;
 
 #include "fft_graph.h"
 #include "analysis_window.h"
+#include "public_editor.h"
+
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace Gtk;
 using namespace Gdk;
 
-FFTGraph::FFTGraph(int windowSize)
+FFTGraph::FFTGraph (int windowSize)
 {
 	_logScale = 0;
 
@@ -54,287 +56,488 @@ FFTGraph::FFTGraph(int windowSize)
 	_hanning  = 0;
 	_logScale = 0;
 
+	_surface  = 0;
 	_a_window = 0;
 
-	_show_minmax     = false;
-	_show_normalized = false;
+	_show_minmax       = false;
+	_show_normalized   = false;
+	_show_proportional = false;
 
-	setWindowSize(windowSize);
+	_ann_x = _ann_y = -1;
+	_yoff = v_margin;
+	_ann_area.width = 0;
+	_ann_area.height = 0;
+
+	setWindowSize (windowSize);
+	set_events (Gdk::POINTER_MOTION_MASK | Gdk::LEAVE_NOTIFY_MASK | Gdk::BUTTON_PRESS_MASK);
 }
 
 void
-FFTGraph::setWindowSize(int windowSize)
+FFTGraph::setWindowSize (int windowSize)
 {
 	if (_a_window) {
 		Glib::Threads::Mutex::Lock lm  (_a_window->track_list_lock);
-		setWindowSize_internal(windowSize);
+		setWindowSize_internal (windowSize);
 	} else {
-		setWindowSize_internal(windowSize);
+		setWindowSize_internal (windowSize);
 	}
 }
 
 void
-FFTGraph::setWindowSize_internal(int windowSize)
+FFTGraph::setWindowSize_internal (int windowSize)
 {
 	// remove old tracklist & graphs
 	if (_a_window) {
-		_a_window->clear_tracklist();
+		_a_window->clear_tracklist ();
 	}
 
 	_windowSize = windowSize;
 	_dataSize = windowSize / 2;
 	if (_in != 0) {
-		fftwf_destroy_plan(_plan);
-		free(_in);
+		fftwf_destroy_plan (_plan);
+		free (_in);
 		_in = 0;
 	}
 
 	if (_out != 0) {
-		free(_out);
+		free (_out);
 		_out = 0;
 	}
 
 	if (_hanning != 0) {
-		free(_hanning);
+		free (_hanning);
 		_hanning = 0;
 	}
 
 	if (_logScale != 0) {
-		free(_logScale);
+		free (_logScale);
 		_logScale = 0;
 	}
 
 	// When destroying, window size is set to zero to free up memory
-	if (windowSize == 0)
+	if (windowSize == 0) {
 		return;
+	}
 
 	// FFT input & output buffers
-	_in      = (float *) fftwf_malloc(sizeof(float) * _windowSize);
-	_out     = (float *) fftwf_malloc(sizeof(float) * _windowSize);
+	_in  = (float *) fftwf_malloc (sizeof (float) * _windowSize);
+	_out = (float *) fftwf_malloc (sizeof (float) * _windowSize);
 
 	// Hanning window
-	_hanning = (float *) malloc(sizeof(float) * _windowSize);
-
+	_hanning = (float *) malloc (sizeof (float) * _windowSize);
 
 	// normalize the window
 	double sum = 0.0;
 
-	for (int i=0; i < _windowSize; i++) {
-		_hanning[i]=0.81f * ( 0.5f - (0.5f * (float) cos(2.0f * M_PI * (float)i / (float)(_windowSize))));
+	for (unsigned int i = 0; i < _windowSize; ++i) {
+		_hanning[i] = 0.5f - (0.5f * (float) cos (2.0f * M_PI * (float)i / (float)(_windowSize)));
 		sum += _hanning[i];
 	}
 
-	double isum = 1.0 / sum;
+	double isum = 2.0 / sum;
 
-	for (int i=0; i < _windowSize; i++) {
+	for (unsigned int i = 0; i < _windowSize; i++) {
 		_hanning[i] *= isum;
 	}
 
-	_logScale = (int *) malloc(sizeof(int) * _dataSize);
-	//float count = 0;
-	for (int i = 0; i < _dataSize; i++) {
+	_logScale = (int *) malloc (sizeof (int) * _dataSize);
+
+	for (unsigned int i = 0; i < _dataSize; i++) {
 		_logScale[i] = 0;
 	}
-	_plan = fftwf_plan_r2r_1d(_windowSize, _in, _out, FFTW_R2HC, FFTW_ESTIMATE);
+	_plan = fftwf_plan_r2r_1d (_windowSize, _in, _out, FFTW_R2HC, FFTW_MEASURE);
 }
 
-FFTGraph::~FFTGraph()
+FFTGraph::~FFTGraph ()
 {
 	// This will free everything
-	setWindowSize(0);
+	setWindowSize (0);
+
+	if (_surface) {
+		cairo_surface_destroy (_surface);
+	}
 }
 
 bool
-FFTGraph::on_expose_event (GdkEventExpose* /*event*/)
+FFTGraph::on_expose_event (GdkEventExpose* event)
 {
-	redraw();
-	return true;
-}
+	cairo_t* cr = gdk_cairo_create (GDK_DRAWABLE (get_window ()->gobj ()));
+	cairo_rectangle (cr, event->area.x, event->area.y, event->area.width, event->area.height);
+	cairo_clip (cr);
 
-FFTResult *
-FFTGraph::prepareResult(Gdk::Color color, string trackname)
-{
-	FFTResult *res = new FFTResult(this, color, trackname);
+	cairo_set_source_surface(cr, _surface, 0, 0);
+	cairo_paint (cr);
 
-	return res;
-}
 
+	if (_ann_x > 0 && _ann_y > 0) {
+		const float x = _ann_x - hl_margin;
+		const float freq = expf(_fft_log_base * x / currentScaleWidth) * _fft_start;
 
-void
-FFTGraph::set_analysis_window(AnalysisWindow *a_window)
-{
-	_a_window = a_window;
-}
+		std::stringstream ss;
+		if (freq >= 10000) {
+			ss <<  std::setprecision (1) << std::fixed << freq / 1000 << " kHz";
+		} else if (freq >= 1000) {
+			ss <<  std::setprecision (2) << std::fixed << freq / 1000 << " kHz";
+		} else {
+			ss <<  std::setprecision (0) << std::fixed << freq << " Hz";
+		}
+		layout->set_text (ss.str ());
+		int lw, lh;
+		layout->get_pixel_size (lw, lh);
+		lw|=1; lh|=1;
 
-void
-FFTGraph::draw_scales(Glib::RefPtr<Gdk::Window> window)
-{
+		const float y0 = _ann_y - lh - 7;
 
-	Glib::RefPtr<Gtk::Style> style = get_style();
-	Glib::RefPtr<Gdk::GC> black = style->get_black_gc();
-	Glib::RefPtr<Gdk::GC> white = style->get_white_gc();
+		_ann_area.x = _ann_x - 1 - lw * .5;
+		_ann_area.y =  y0 - 1;
+		_ann_area.width = lw + 3;
+		_ann_area.height = lh + 8;
 
-	window->draw_rectangle(black, true, 0, 0, width, height);
+		cairo_set_source_rgba (cr, 1.0, 1.0, 1.0, 0.7);
+		cairo_rectangle (cr, _ann_x - 1 - lw * .5, y0 - 1, lw + 2, lh + 2);
+		cairo_fill (cr);
 
-	/**
-	 *  4          5
-	 *  _          _
-	 *   |        |
-	 * 1 |        | 2
-	 *   |________|
-	 *        3
-	 **/
+		cairo_move_to (cr, _ann_x , _ann_y - 0.5);
+		cairo_rel_line_to (cr, -3.0, -5.5);
+		cairo_rel_line_to (cr, 6, 0);
+		cairo_close_path (cr);
+		cairo_fill (cr);
 
-	// Line 1
-	window->draw_line(white, h_margin, v_margin, h_margin, height - v_margin );
+		cairo_set_source_rgba (cr, 0.0, 0.0, 0.0, 1.0);
+		cairo_move_to (cr, _ann_x - lw / 2, y0);
+		pango_cairo_update_layout (cr, layout->gobj ());
+		pango_cairo_show_layout (cr, layout->gobj ());
 
-	// Line 2
-	window->draw_line(white, width - h_margin + 1, v_margin, width - h_margin + 1, height - v_margin );
+	}
 
-	// Line 3
-	window->draw_line(white, h_margin, height - v_margin, width - h_margin, height - v_margin );
+#ifdef HARLEQUIN_DEBUGGING
+	cairo_rectangle (cr, 0, 0, width, height);
+	cairo_set_source_rgba (cr, (random() % 255) / 255.f, (random() % 255) / 255.f, 0.0, 0.5);
+	cairo_fill (cr);
+#endif
 
-#define DB_METRIC_LENGTH 8
-	// Line 4
-	window->draw_line(white, h_margin - DB_METRIC_LENGTH, v_margin, h_margin, v_margin );
+	cairo_destroy (cr);
+	return true;
+}
 
-	// Line 5
-	window->draw_line(white, width - h_margin + 1, v_margin, width - h_margin + DB_METRIC_LENGTH, v_margin );
+bool
+FFTGraph::on_motion_notify_event (GdkEventMotion* ev)
+{
+	gint x, y;
 
+	x = (int) floor (ev->x);
+	y = (int) floor (ev->y);
 
+	if (x <= hl_margin + 1 || x >= width  - hr_margin) {
+		x = -1;
+	}
+	if (y <= _yoff || y >= height - v_margin - 1) {
+		y = -1;
+	}
 
-	if (graph_gc == 0) {
-		graph_gc = GC::create( get_window() );
+	if (x == _ann_x && y == _ann_y) {
+		return true;
 	}
+	_ann_x = x;
+	_ann_y = y;
 
-	Color grey;
+	if (_ann_area.width == 0 || _ann_area.height == 0) {
+		queue_draw ();
+	} else {
+		queue_draw_area (_ann_area.x, _ann_area.y, _ann_area.width, _ann_area.height + 1);
+	}
 
-	grey.set_rgb_p(0.2, 0.2, 0.2);
+	if (_ann_x > 0 &&_ann_y > 0) {
+		queue_draw_area (_ann_x - _ann_area.width, _ann_y - _ann_area.height - 1, _ann_area.width * 2, _ann_area.height + 2);
+	}
 
-	graph_gc->set_rgb_fg_color( grey );
+	return true;
+}
 
-	if (layout == 0) {
-		layout = create_pango_layout ("");
-		layout->set_font_description (get_style()->get_font());
+bool
+FFTGraph::on_leave_notify_event (GdkEventCrossing *)
+{
+	if (_ann_x == -1 && _ann_y == -1) {
+		return true;
+	}
+	_ann_x = _ann_y = -1;
+	if (_ann_area.width == 0 || _ann_area.height == 0) {
+		queue_draw ();
+	} else {
+		queue_draw_area (_ann_area.x, _ann_area.y, _ann_area.width, _ann_area.height + 1);
 	}
+	_ann_area.width = _ann_area.height = 0;
+	return false;
+}
+
+FFTResult *
+FFTGraph::prepareResult (Gdk::Color color, string trackname)
+{
+	FFTResult *res = new FFTResult (this, color, trackname);
 
-	// Draw logscale
-	int logscale_pos = 0;
-	int position_on_scale;
+	return res;
+}
 
+void
+FFTGraph::set_analysis_window (AnalysisWindow *a_window)
+{
+	_a_window = a_window;
+}
 
-/* TODO, write better scales and change the log function so that octaves are of equal pixel length
-	float scale_points[10] = { 55.0, 110.0, 220.0, 440.0, 880.0, 1760.0, 3520.0, 7040.0, 14080.0, 28160.0 };
+int
+FFTGraph::draw_scales (cairo_t* cr)
+{
+	int label_height = v_margin;
 
-	for (int x = 0; x < 10; x++) {
+	cairo_set_source_rgba (cr, 0.0, 0.0, 0.0, 1.0);
+	cairo_rectangle (cr, 0, 0, width, height);
+	cairo_fill (cr);
 
-		// i = 0.. _dataSize-1
-		float freq_at_bin = (SR/2.0) * ((double)i / (double)_dataSize);
+	/*
+	 *  1          5
+	 *  _          _
+	 *   |        |
+	 * 2 |        | 4
+	 *   |________|
+	 *        3
+	 */
+
+	cairo_set_line_width (cr, 1.0);
+	cairo_set_source_rgba (cr, 1.0, 1.0, 1.0, 1.0);
+	cairo_move_to (cr, 3                      , .5 + v_margin);
+	cairo_line_to (cr, .5 + hl_margin         , .5 + v_margin);  // 1
+	cairo_line_to (cr, .5 + hl_margin         , .5 + height - v_margin); // 2
+	cairo_line_to (cr, 1.5 + width - hr_margin, .5 + height - v_margin); // 3
+	cairo_line_to (cr, 1.5 + width - hr_margin, .5 + v_margin); // 4
+	cairo_line_to (cr, width - 3              , .5 + v_margin); // 5
+	cairo_stroke (cr);
+
+	if (! layout) {
+		layout = create_pango_layout ("");
+		layout->set_font_description (get_style ()->get_font ());
+	}
 
+	// Draw x-axis scale 1/3 octaves centered around 1K
+	int overlap = 0;
 
+	// make sure 1K (x=0) is visible
+	for (int x = 0; x < 27; ++x) {
+		float freq = powf (2.f, x / 3.0) * 1000.f;
+		if (freq <= _fft_start) { continue; }
+		if (freq >= _fft_end) { break; }
 
-			freq_at_pixel = FFT_START * exp( FFT_RANGE * pixel / (double)(currentScaleWidth - 1) );
-	}
-	*/
+		const float pos = currentScaleWidth * logf (freq / _fft_start) / _fft_log_base;
+		const int coord = floor (hl_margin + pos);
 
-	for (int x = 1; x < 8; x++) {
-		position_on_scale = (int)floor( (double)currentScaleWidth*(double)x/8.0);
+		if (coord < overlap) {
+			continue;
+		}
+
+		std::stringstream ss;
+		if (freq >= 10000) {
+			ss <<  std::setprecision (1) << std::fixed << freq / 1000 << "k";
+		} else if (freq >= 1000) {
+			ss <<  std::setprecision (2) << std::fixed << freq / 1000 << "k";
+		} else {
+			ss <<  std::setprecision (0) << std::fixed << freq << "Hz";
+		}
+		layout->set_text (ss.str ());
+		int lw, lh;
+		layout->get_pixel_size (lw, lh);
+		overlap = coord + lw + 3;
 
-		while (_logScale[logscale_pos] < position_on_scale)
-			logscale_pos++;
+		if (coord + lw / 2 > width - hr_margin - 2) {
+			break;
+		}
+		if (v_margin / 2 + lh > label_height) {
+			label_height = v_margin / 2 + lh;
+		}
 
-		int coord = (int)(v_margin + 1.0 + position_on_scale);
+		cairo_set_source_rgba (cr, 0.2, 0.2, 0.2, 1.0);
+		cairo_move_to (cr, coord, v_margin);
+		cairo_line_to (cr, coord, height - v_margin - 1);
+		cairo_stroke (cr);
+
+		cairo_set_source_rgba (cr, 1.0, 1.0, 1.0, 1.0);
+		cairo_move_to (cr, coord - lw / 2, v_margin / 2);
+		pango_cairo_update_layout (cr, layout->gobj ());
+		pango_cairo_show_layout (cr, layout->gobj ());
+	}
 
-		int SR = 44100;
+	// now from 1K down to 4Hz
+	for (int x = 0; x > -24; --x) {
+		float freq = powf (2.f, x / 3.0) * 1000.f;
+		if (freq >= _fft_end) { continue; }
+		if (freq <= _fft_start) { break; }
 
-		int rate_at_pos = (int)((double)(SR/2) * (double)logscale_pos / (double)_dataSize);
+		const float pos = currentScaleWidth * logf (freq / _fft_start) / _fft_log_base;
+		const int coord = floor (hl_margin + pos);
 
-		char buf[32];
-		if (rate_at_pos < 1000)
-			snprintf(buf,32,"%dHz",rate_at_pos);
-		else
-			snprintf(buf,32,"%dk",(int)floor( (float)rate_at_pos/(float)1000) );
+		if (x != 0 && coord > overlap) {
+			continue;
+		}
 
-		std::string label = buf;
+		std::stringstream ss;
+		if (freq >= 10000) {
+			ss <<  std::setprecision (1) << std::fixed << freq / 1000 << "k";
+		} else if (freq >= 1000) {
+			ss <<  std::setprecision (2) << std::fixed << freq / 1000 << "k";
+		} else {
+			ss <<  std::setprecision (0) << std::fixed << freq << "Hz";
+		}
+		layout->set_text (ss.str ());
+		int lw, lh;
+		layout->get_pixel_size (lw, lh);
 
-		layout->set_text(label);
+		overlap = coord - lw - 3;
 
-		window->draw_line(graph_gc, coord, v_margin, coord, height - v_margin - 1);
+		if (coord - lw / 2 < hl_margin + 2) {
+			break;
+		}
+		if (x == 0) {
+			// just get overlap position
+			continue;
+		}
+		if (v_margin / 2 + lh > label_height) {
+			label_height = v_margin / 2 + lh;
+		}
 
-		int width, height;
-		layout->get_pixel_size (width, height);
 
-		window->draw_layout(white, coord - width / 2, v_margin / 2, layout);
+		cairo_set_source_rgba (cr, 0.2, 0.2, 0.2, 1.0);
+		cairo_move_to (cr, coord, v_margin);
+		cairo_line_to (cr, coord, height - v_margin - 1);
+		cairo_stroke (cr);
 
+		cairo_set_source_rgba (cr, 1.0, 1.0, 1.0, 1.0);
+		cairo_move_to (cr, coord - lw / 2, v_margin / 2);
+		pango_cairo_update_layout (cr, layout->gobj ());
+		pango_cairo_show_layout (cr, layout->gobj ());
 	}
 
+	return label_height;
 }
 
 void
-FFTGraph::redraw()
+FFTGraph::redraw ()
 {
 	Glib::Threads::Mutex::Lock lm  (_a_window->track_list_lock);
 
-	draw_scales(get_window());
+	assert (_surface);
+	cairo_t* cr = cairo_create (_surface);
 
+	_yoff = draw_scales (cr);
 
-	if (_a_window == 0)
+	if (_a_window == 0) {
+		cairo_destroy (cr);
+		queue_draw ();
 		return;
+	}
 
-	if (!_a_window->track_list_ready)
+	if (!_a_window->track_list_ready) {
+		cairo_destroy (cr);
+		queue_draw ();
 		return;
+	}
 
-	cairo_t *cr;
-	cr = gdk_cairo_create(GDK_DRAWABLE(get_window()->gobj()));
-	cairo_set_line_width(cr, 1.5);
-	cairo_translate(cr, (float)v_margin + 1.0, (float)h_margin);
-
-
-
-	// Find "session wide" min & max
-	float minf =  1000000000000.0;
-	float maxf = -1000000000000.0;
-
-	TreeNodeChildren track_rows = _a_window->track_list.get_model()->children();
+	float minf;
+	float maxf;
 
-	for (TreeIter i = track_rows.begin(); i != track_rows.end(); i++) {
+	TreeNodeChildren track_rows = _a_window->track_list.get_model ()->children ();
 
-		TreeModel::Row row = *i;
-		FFTResult *res = row[_a_window->tlcols.graph];
+	if (!_show_normalized) {
+		maxf =    0.0f;
+		minf = -108.0f;
+	} else  {
+		minf =  999.0f;
+		maxf = -999.0f;
+		for (TreeIter i = track_rows.begin (); i != track_rows.end (); i++) {
+			TreeModel::Row row = *i;
+			FFTResult *res = row[_a_window->tlcols.graph];
+
+			// disregard fft analysis from empty signals
+			if (res->minimum (_show_proportional) == res->maximum (_show_proportional)) {
+				continue;
+			}
+			// don't include invisible graphs
+			if (!row[_a_window->tlcols.visible]) {
+				continue;
+			}
 
-		// disregard fft analysis from empty signals
-		if (res->minimum() == res->maximum()) {
-			continue;
+			minf = std::min (minf, res->minimum (_show_proportional));
+			maxf = std::max (maxf, res->maximum (_show_proportional));
 		}
+	}
 
-		if ( res->minimum() < minf) {
-			minf = res->minimum();
-		}
+	// clamp range, > -200dBFS, at least 24dB (two y-axis labels) range
+	minf = std::max (-200.f, minf);
+	if (maxf <= minf) {
+		cairo_destroy (cr);
+		queue_draw ();
+		return;
+	}
 
-		if ( res->maximum() > maxf) {
-			maxf = res->maximum();
-		}
+	if (maxf - minf < 24) {
+		maxf += 6.f;
+		minf = maxf - 24.f;
 	}
 
-	if (!_show_normalized) {
-		minf = -150.0f;
-		maxf = 0.0f;
+	cairo_set_line_width (cr, 1.5);
+	cairo_translate (cr, hl_margin + 1, _yoff);
+
+	float fft_pane_size_w = width  - hl_margin - hr_margin;
+	float fft_pane_size_h = height - v_margin - 1 - _yoff;
+	double pixels_per_db = (double)fft_pane_size_h / (double)(maxf - minf);
+
+	// draw y-axis dB
+	cairo_set_source_rgba (cr, .8, .8, .8, 1.0);
+
+	int btm_lbl = fft_pane_size_h;
+	{
+		// y-axis legend
+		layout->set_text (_("dBFS"));
+		int lw, lh;
+		layout->get_pixel_size (lw, lh);
+		cairo_move_to (cr, -2 - lw, fft_pane_size_h - lh / 2);
+		pango_cairo_update_layout (cr, layout->gobj ());
+		pango_cairo_show_layout (cr, layout->gobj ());
+		btm_lbl = fft_pane_size_h - lh;
 	}
 
-	//int graph_height = height - 2 * h_margin;
+	for (int x = -6; x >= -200; x -= 12) {
+		float yp = 1.5 + fft_pane_size_h - rint ((x - minf) * pixels_per_db);
 
+		assert (layout);
+		std::stringstream ss;
+		ss << x;
+		layout->set_text (ss.str ());
+		int lw, lh;
+		layout->get_pixel_size (lw, lh);
 
+		if (yp + 2 + lh / 2 > btm_lbl) {
+			continue;
+		}
+		if (yp < 2 + lh / 2) {
+			continue;
+		}
 
-	float fft_pane_size_w = (float)(width  - 2*v_margin) - 1.0;
-	float fft_pane_size_h = (float)(height - 2*h_margin);
+		cairo_set_source_rgba (cr, .8, .8, .8, 1.0);
+		cairo_move_to (cr, -2 - lw, yp - lh / 2);
+		pango_cairo_update_layout (cr, layout->gobj ());
+		pango_cairo_show_layout (cr, layout->gobj ());
 
-	double pixels_per_db = (double)fft_pane_size_h / (double)(maxf - minf);
+		cairo_set_source_rgba (cr, .2, .2, .2, 1.0);
+		cairo_move_to (cr, 0, yp);
+		cairo_line_to (cr, fft_pane_size_w, yp);
+		cairo_stroke (cr);
+	}
 
-	cairo_rectangle(cr, 0.0, 0.0, fft_pane_size_w, fft_pane_size_h);
-	cairo_clip(cr);
+	cairo_rectangle (cr, 1, 1, fft_pane_size_w, fft_pane_size_h);
+	cairo_clip (cr);
 
-	for (TreeIter i = track_rows.begin(); i != track_rows.end(); i++) {
+	cairo_set_line_cap (cr, CAIRO_LINE_CAP_BUTT);
+	cairo_set_line_join (cr, CAIRO_LINE_JOIN_ROUND);
 
+	for (TreeIter i = track_rows.begin (); i != track_rows.end (); i++) {
 		TreeModel::Row row = *i;
 
 		// don't show graphs for tracks which are deselected
@@ -345,144 +548,121 @@ FFTGraph::redraw()
 		FFTResult *res = row[_a_window->tlcols.graph];
 
 		// don't show graphs for empty signals
-		if (res->minimum() == res->maximum()) {
+		if (res->minimum (_show_proportional) == res->maximum (_show_proportional)) {
 			continue;
 		}
 
 		float mpp;
+		float X,Y;
 
 		if (_show_minmax) {
-			mpp = -1000000.0;
 
-			cairo_set_source_rgba(cr, res->get_color().get_red_p(), res->get_color().get_green_p(), res->get_color().get_blue_p(), 0.30);
-			cairo_move_to(cr, 0.5f + (float)_logScale[0], 0.5f + (float)( fft_pane_size_h - (int)floor( (res->maxAt(0) - minf) * pixels_per_db) ));
+			X = 0.5f + _logScale[0];
+			Y = 1.5f + fft_pane_size_h - pixels_per_db * (res->maxAt (0, _show_proportional) - minf);
+			cairo_move_to (cr, X, Y);
 
 			// Draw the line of maximum values
-			for (int x = 1; x < res->length(); x++) {
-				if (res->maxAt(x) > mpp)
-					mpp = res->maxAt(x);
-				mpp = fmax(mpp, minf);
-				mpp = fmin(mpp, maxf);
-
-				// If the next point on the log scale is at the same location,
-				// don't draw yet
-				if (x + 1 < res->length() && _logScale[x] == _logScale[x + 1]) {
+			mpp = minf;
+			for (unsigned int x = 1; x < res->length () - 1; ++x) {
+				mpp = std::max (mpp, res->maxAt (x, _show_proportional));
+
+				if (_logScale[x] == _logScale[x + 1]) {
 					continue;
 				}
 
-				float X = 0.5f + (float)_logScale[x];
-				float Y = 0.5f + (float)( fft_pane_size_h - (int)floor( (mpp - minf) * pixels_per_db) );
-
-				cairo_line_to(cr, X, Y);
-
-				mpp = -1000000.0;
+				mpp = fmin (mpp, maxf);
+				X = 0.5f + _logScale[x];
+				Y = 1.5f + fft_pane_size_h - pixels_per_db * (mpp - minf);
+				cairo_line_to (cr, X, Y);
+				mpp = minf;
 			}
 
-			mpp = +10000000.0;
+			mpp = maxf;
 			// Draw back to the start using the minimum value
-			for (int x = res->length()-1; x >= 0; x--) {
-				if (res->minAt(x) < mpp)
-					mpp = res->minAt(x);
-				mpp = fmax(mpp, minf);
-				mpp = fmin(mpp, maxf);
-
-				// If the next point on the log scale is at the same location,
-				// don't draw yet
-				if (x - 1 > 0 && _logScale[x] == _logScale[x - 1]) {
+			for (int x = res->length () - 1; x >= 0; --x) {
+				mpp = std::min (mpp, res->minAt (x, _show_proportional));
+
+				if (_logScale[x] == _logScale[x + 1]) {
 					continue;
 				}
 
-				float X = 0.5f + (float)_logScale[x];
-				float Y = 0.5f + (float)( fft_pane_size_h - (int)floor( (mpp - minf) * pixels_per_db) );
-
-				cairo_line_to(cr, X, Y );
-
-				mpp = +10000000.0;
+				mpp = fmax (mpp, minf);
+				X = 0.5f + _logScale[x];
+				Y = 1.5f + fft_pane_size_h - pixels_per_db * (mpp - minf);
+				cairo_line_to (cr, X, Y);
+				mpp = maxf;
 			}
 
-			cairo_close_path(cr);
-
-			cairo_fill(cr);
+			cairo_set_source_rgba (cr, res->get_color ().get_red_p (), res->get_color ().get_green_p (), res->get_color ().get_blue_p (), 0.30);
+			cairo_close_path (cr);
+			cairo_fill (cr);
 		}
 
+		// draw max of averages
+		X = 0.5f + _logScale[0];
+		Y = 1.5f + fft_pane_size_h - pixels_per_db * (res->avgAt (0, _show_proportional) - minf);
+		cairo_move_to (cr, X, Y);
 
+		mpp = minf;
+		for (unsigned int x = 0; x < res->length () - 1; x++) {
+			mpp = std::max (mpp, res->avgAt (x, _show_proportional));
 
-		// Set color from track
-		cairo_set_source_rgb(cr, res->get_color().get_red_p(), res->get_color().get_green_p(), res->get_color().get_blue_p());
-
-		mpp = -1000000.0;
-
-		cairo_move_to(cr, 0.5, fft_pane_size_h-0.5);
-
-		for (int x = 0; x < res->length(); x++) {
-
-
-			if (res->avgAt(x) > mpp)
-				mpp = res->avgAt(x);
-			mpp = fmax(mpp, minf);
-			mpp = fmin(mpp, maxf);
-
-			// If the next point on the log scale is at the same location,
-			// don't draw yet
-			if (x + 1 < res->length() && _logScale[x] == _logScale[x + 1]) {
+			if (_logScale[x] == _logScale[x + 1]) {
 				continue;
 			}
 
-			cairo_line_to(cr, 0.5f + (float)_logScale[x], 0.5f + (float)( fft_pane_size_h - (int)floor( (mpp - minf) * pixels_per_db) ));
+			mpp = fmax (mpp, minf);
+			mpp = fmin (mpp, maxf);
 
-			mpp = -1000000.0;
+			X = 0.5f + _logScale[x];
+			Y = 1.5f + fft_pane_size_h - pixels_per_db * (mpp - minf);
+			cairo_line_to (cr, X, Y);
+			mpp = minf;
 		}
 
-		cairo_stroke(cr);
+		cairo_set_source_rgb (cr, res->get_color ().get_red_p (), res->get_color ().get_green_p (), res->get_color ().get_blue_p ());
+		cairo_stroke (cr);
 	}
-
-	cairo_destroy(cr);
+	cairo_destroy (cr);
+	queue_draw ();
 }
 
 void
-FFTGraph::on_size_request(Gtk::Requisition* requisition)
+FFTGraph::on_size_request (Gtk::Requisition* requisition)
 {
-	width  = max(requisition->width,  minScaleWidth  + h_margin * 2);
-	height = max(requisition->height, minScaleHeight + 2 + v_margin * 2);
-
-	update_size();
+	width  = max (requisition->width,  minScaleWidth  + hl_margin + hr_margin);
+	height = max (requisition->height, minScaleHeight + 2 + v_margin * 2);
 
 	requisition->width  = width;;
 	requisition->height = height;
 }
 
 void
-FFTGraph::on_size_allocate(Gtk::Allocation & alloc)
+FFTGraph::on_size_allocate (Gtk::Allocation & alloc)
 {
-	width = alloc.get_width();
-	height = alloc.get_height();
+	width = alloc.get_width ();
+	height = alloc.get_height ();
 
-	update_size();
+	update_size ();
 
 	DrawingArea::on_size_allocate (alloc);
 }
 
 void
-FFTGraph::update_size()
+FFTGraph::update_size ()
 {
-	currentScaleWidth  = width - h_margin*2;
-	currentScaleHeight = height - 2 - v_margin*2;
-
-	float SR = 44100;
-	float FFT_START = SR/(double)_dataSize;
-	float FFT_END = SR/2.0;
-	float FFT_RANGE = log( FFT_END / FFT_START);
-	float pixel = 0;
-	for (int i = 0; i < _dataSize; i++) {
-		float freq_at_bin = (SR/2.0) * ((double)i / (double)_dataSize);
-		float freq_at_pixel;
-		pixel--;
-		do {
-			pixel++;
-			freq_at_pixel = FFT_START * exp( FFT_RANGE * pixel / (double)(currentScaleWidth - 1) );
-		} while (freq_at_bin > freq_at_pixel);
-
-		_logScale[i] = (int)floor(pixel);
+	framecnt_t SR = PublicEditor::instance ().session ()->nominal_frame_rate ();
+	_fft_start = SR / (double)_dataSize;
+	_fft_end = .5 * SR;
+	_fft_log_base = logf (.5 * _dataSize);
+	currentScaleWidth  = width - hl_margin - hr_margin;
+	_logScale[0] = 0;
+	for (unsigned int i = 1; i < _dataSize; ++i) {
+		_logScale[i] = floor (currentScaleWidth * logf (.5 * i) / _fft_log_base);
+	}
+	if (_surface) {
+		cairo_surface_destroy (_surface);
 	}
+	_surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width, height);
+	redraw ();
 }
-
diff --git a/gtk2_ardour/fft_graph.h b/gtk2_ardour/fft_graph.h
index ab05da3..f5be5c6 100644
--- a/gtk2_ardour/fft_graph.h
+++ b/gtk2_ardour/fft_graph.h
@@ -38,62 +38,77 @@ class AnalysisWindow;
 
 class FFTGraph : public Gtk::DrawingArea
 {
-	public:
+public:
 
-		FFTGraph(int windowSize);
-		~FFTGraph();
+	FFTGraph (int windowSize);
+	~FFTGraph ();
 
-		void set_analysis_window(AnalysisWindow *a_window);
+	void set_analysis_window (AnalysisWindow *a_window);
 
-		int windowSize() const { return _windowSize; }
-		void setWindowSize(int windowSize);
+	int windowSize () const { return _windowSize; }
+	void setWindowSize (int windowSize);
 
-		void redraw();
-		bool on_expose_event (GdkEventExpose* event);
+	void redraw ();
+	bool on_expose_event (GdkEventExpose* event);
+	bool on_motion_notify_event (GdkEventMotion*);
+	bool on_leave_notify_event (GdkEventCrossing*);
+	bool on_button_press_event (GdkEventButton*) { return true; }
 
-		void on_size_request(Gtk::Requisition* requisition);
-		void on_size_allocate(Gtk::Allocation & alloc);
-		FFTResult *prepareResult(Gdk::Color color, std::string trackname);
+	void on_size_request (Gtk::Requisition* requisition);
+	void on_size_allocate (Gtk::Allocation & alloc);
+	FFTResult *prepareResult (Gdk::Color color, std::string trackname);
 
-		void set_show_minmax     (bool v) { _show_minmax     = v; redraw(); }
-		void set_show_normalized (bool v) { _show_normalized = v; redraw(); }
+	void set_show_minmax      (bool v) { _show_minmax       = v; redraw (); }
+	void set_show_normalized  (bool v) { _show_normalized   = v; redraw (); }
+	void set_show_proportioanl(bool v) { _show_proportional = v; redraw (); }
 
-	private:
+private:
 
-		void update_size();
+	void update_size ();
 
-		void setWindowSize_internal(int windowSize);
+	void setWindowSize_internal (int windowSize);
 
-		void draw_scales(Glib::RefPtr<Gdk::Window> window);
+	int draw_scales (cairo_t*);
 
-		static const int minScaleWidth = 512;
-		static const int minScaleHeight = 420;
+	static const int minScaleWidth = 512;
+	static const int minScaleHeight = 420;
 
-		int currentScaleWidth;
-		int currentScaleHeight;
+	static const int hl_margin = 40; // this should scale with font (dBFS labels)
+	static const int hr_margin = 12;
+	static const int v_margin  = 12;
 
-		static const int h_margin = 20;
-		static const int v_margin = 20;
-		Glib::RefPtr<Gdk::GC> graph_gc;
+	int currentScaleWidth;
 
-		int width;
-		int height;
+	int width;
+	int height;
 
-		int _windowSize;
-		int _dataSize;
+	int _yoff;
+	int _ann_x;
+	int _ann_y;
+	cairo_rectangle_t _ann_area;
 
-		Glib::RefPtr<Pango::Layout> layout;
-		AnalysisWindow *_a_window;
+	unsigned int _windowSize;
+	unsigned int _dataSize;
 
-		fftwf_plan _plan;
+	Glib::RefPtr<Pango::Layout> layout;
+	cairo_surface_t* _surface;
 
-		float *_out;
-		float *_in;
-		float *_hanning;
-		int *_logScale;
+	AnalysisWindow *_a_window;
 
-		bool _show_minmax;
-		bool _show_normalized;
+	fftwf_plan _plan;
+
+	float* _out;
+	float* _in;
+	float* _hanning;
+	int*   _logScale;
+
+	bool _show_minmax;
+	bool _show_normalized;
+	bool _show_proportional;
+
+	float _fft_start;
+	float _fft_end;
+	float _fft_log_base;
 
 	friend class FFTResult;
 };
diff --git a/gtk2_ardour/fft_result.cc b/gtk2_ardour/fft_result.cc
index a83b65e..b4a82c2 100644
--- a/gtk2_ardour/fft_result.cc
+++ b/gtk2_ardour/fft_result.cc
@@ -1,22 +1,21 @@
 /*
-    Copyright (C) 2006 Paul Davis
-	Written by Sampo Savolainen
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-*/
+ * Copyright (C) 2006, 2016 Paul Davis
+ * Written by Sampo Savolainen & Robin Gareus
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
 
 #include "fft_result.h"
 #include "fft_graph.h"
@@ -24,8 +23,7 @@
 #include <cstring>
 #include <string>
 #include <cmath>
-
-#include <iostream>
+#include <algorithm>
 
 using namespace std;
 
@@ -35,18 +33,24 @@ FFTResult::FFTResult(FFTGraph *graph, Gdk::Color color, string trackname)
 
 	_windowSize = _graph->windowSize();
 	_dataSize   = _windowSize / 2;
-
 	_averages = 0;
-
-	_data_avg = (float *) malloc(sizeof(float) * _dataSize);
-	memset(_data_avg,0,sizeof(float) * _dataSize);
-
-	_data_min = (float *) malloc(sizeof(float) * _dataSize);
-	_data_max = (float *) malloc(sizeof(float) * _dataSize);
-
-	for (int i = 0; i < _dataSize; i++) {
-		_data_min[i] = FLT_MAX;
-		_data_max[i] = FLT_MIN;
+	_min_flat = _max_flat = 0.0;
+	_min_prop = _max_prop = 0.0;
+
+	_data_flat_avg = (float *) malloc (sizeof(float) * _dataSize);
+	_data_flat_min = (float *) malloc (sizeof(float) * _dataSize);
+	_data_flat_max = (float *) malloc (sizeof(float) * _dataSize);
+	_data_prop_avg = (float *) malloc (sizeof(float) * _dataSize);
+	_data_prop_min = (float *) malloc (sizeof(float) * _dataSize);
+	_data_prop_max = (float *) malloc (sizeof(float) * _dataSize);
+
+	for (unsigned int i = 0; i < _dataSize; i++) {
+		_data_flat_min[i] = FLT_MAX;
+		_data_flat_max[i] = FLT_MIN;
+		_data_flat_avg[i] = 0;
+		_data_prop_min[i] = FLT_MAX;
+		_data_prop_max[i] = FLT_MIN;
+		_data_prop_avg[i] = 0;
 	}
 
 	_color     = color;
@@ -56,34 +60,31 @@ FFTResult::FFTResult(FFTGraph *graph, Gdk::Color color, string trackname)
 void
 FFTResult::analyzeWindow(float *window)
 {
-	float *_hanning = _graph->_hanning;
+	float const * const _hanning = _graph->_hanning;
 	float *_in = _graph->_in;
 	float *_out = _graph->_out;
 
-	int i;
 	// Copy the data and apply the hanning window
-	for (i = 0; i < _windowSize; i++) {
-		_in[i] = window[ i ] * _hanning[ i ];
+	for (unsigned int i = 0; i < _windowSize; ++i) {
+		_in[i] = window[i] * _hanning[i];
 	}
 
 	fftwf_execute(_graph->_plan);
 
+	// calculate signal power per bin
 	float b = _out[0] * _out[0];
 
-	_data_avg[0] += b;
-	if (b < _data_min[0]) _data_min[0] = b;
-	if (b > _data_max[0]) _data_max[0] = b;
-
-	for (i=1; i < _dataSize - 1; i++) { // TODO: check with Jesse whether this is really correct
-		b = (_out[i] * _out[i]);
-
-		_data_avg[i] += b;  // + (_out[_windowSize-i] * _out[_windowSize-i]);, TODO: thanks to Stefan Kost
+	_data_flat_avg[0] += b;
+	if (b < _data_flat_min[0]) _data_flat_min[0] = b;
+	if (b > _data_flat_max[0]) _data_flat_max[0] = b;
 
-		if (_data_min[i] > b)  _data_min[i] = b;
-		if (_data_max[i] < b ) _data_max[i] = b;
+	for (unsigned int i = 1; i < _dataSize - 1; ++i) {
+		b = (_out[i] * _out[i]) + (_out[_windowSize - i] * _out[_windowSize - i]);
+		_data_flat_avg[i] += b;
+		if (_data_flat_min[i] > b)  _data_flat_min[i] = b;
+		if (_data_flat_max[i] < b ) _data_flat_max[i] = b;
 	}
 
-
 	_averages++;
 }
 
@@ -91,32 +92,43 @@ void
 FFTResult::finalize()
 {
 	if (_averages == 0) {
-		_minimum = 0.0;
-		_maximum = 0.0;
+		_min_flat = _max_flat = 0.0;
+		_min_prop = _max_prop = 0.0;
 		return;
 	}
 
 	// Average & scale
-	for (int i = 0; i < _dataSize; i++) {
-		_data_avg[i] /= _averages;
-		_data_avg[i]  = 10.0f * log10f(_data_avg[i]);
-
-		_data_min[i]  = 10.0f * log10f(_data_min[i]);
-		if (_data_min[i] < -10000.0f) {
-			_data_min[i] = -10000.0f;
-		}
-		_data_max[i]  = 10.0f * log10f(_data_max[i]);
+	for (unsigned int i = 0; i < _dataSize - 1; ++i) {
+		_data_flat_avg[i] /= _averages;
+		// proportional, pink spectrum @ -18dB
+		_data_prop_avg[i] = _data_flat_avg [i] * i / 63.096f;
+		_data_prop_min[i] = _data_flat_min [i] * i / 63.096f;
+		_data_prop_max[i] = _data_flat_max [i] * i / 63.096f;
+	}
+
+	_data_prop_avg[0] = _data_flat_avg [0] / 63.096f;
+	_data_prop_min[0] = _data_flat_min [0] / 63.096f;
+	_data_prop_max[0] = _data_flat_max [0] / 63.096f;
+
+	// calculate power
+	for (unsigned int i = 0; i < _dataSize - 1; ++i) {
+		_data_flat_min[i] = power_to_db (_data_flat_min[i]);
+		_data_flat_max[i] = power_to_db (_data_flat_max[i]);
+		_data_flat_avg[i] = power_to_db (_data_flat_avg[i]);
+		_data_prop_min[i] = power_to_db (_data_prop_min[i]);
+		_data_prop_max[i] = power_to_db (_data_prop_max[i]);
+		_data_prop_avg[i] = power_to_db (_data_prop_avg[i]);
 	}
 
 	// find min & max
-	_minimum = _maximum = _data_avg[0];
-
-	for (int i = 1; i < _dataSize; i++) {
-		if (_data_avg[i] < _minimum        && !isinf(_data_avg[i])) {
-			_minimum = _data_avg[i];
-		} else if (_data_avg[i] > _maximum && !isinf(_data_avg[i])) {
-			_maximum = _data_avg[i];
-		}
+	_min_flat = _max_flat = _data_flat_avg[0];
+	_min_prop = _max_prop = _data_prop_avg[0];
+
+	for (unsigned int i = 1; i < _dataSize - 1; ++i) {
+		_min_flat = std::min (_min_flat, _data_flat_avg[i]);
+		_max_flat = std::max (_max_flat, _data_flat_avg[i]);
+		_min_prop = std::min (_min_prop, _data_prop_avg[i]);
+		_max_prop = std::max (_max_prop, _data_prop_avg[i]);
 	}
 
 	_averages = 0;
@@ -124,36 +136,10 @@ FFTResult::finalize()
 
 FFTResult::~FFTResult()
 {
-	free(_data_avg);
-	free(_data_min);
-	free(_data_max);
+	free(_data_flat_avg);
+	free(_data_flat_min);
+	free(_data_flat_max);
+	free(_data_prop_avg);
+	free(_data_prop_min);
+	free(_data_prop_max);
 }
-
-
-float
-FFTResult::avgAt(int x)
-{
-	if (x < 0 || x>= _dataSize)
-		return 0.0f;
-
-	return _data_avg[x];
-}
-
-float
-FFTResult::minAt(int x)
-{
-	if (x < 0 || x>= _dataSize)
-		return 0.0f;
-
-	return _data_min[x];
-}
-
-float
-FFTResult::maxAt(int x)
-{
-	if (x < 0 || x>= _dataSize)
-		return 0.0f;
-
-	return _data_max[x];
-}
-
diff --git a/gtk2_ardour/fft_result.h b/gtk2_ardour/fft_result.h
index ddf2bb1..d7895b0 100644
--- a/gtk2_ardour/fft_result.h
+++ b/gtk2_ardour/fft_result.h
@@ -1,26 +1,26 @@
 /*
-    Copyright (C) 2006 Paul Davis
-	Written by Sampo Savolainen
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-*/
+ * Copyright (C) 2006, 2016 Paul Davis
+ * Written by Sampo Savolainen & Robin Gareus
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
 
 #ifndef __ardour_fft_result_h
 #define __ardour_fft_result_h
 
+#include <math.h>
 #include <fftw3.h>
 
 #include <gdkmm/color.h>
@@ -31,47 +31,56 @@ class FFTGraph;
 
 class FFTResult
 {
-	public:
+public:
 
-		~FFTResult();
+	~FFTResult ();
 
-		void analyzeWindow(float *window);
-		void finalize();
+	void analyzeWindow (float *window);
+	void finalize ();
 
-		int length() const { return _dataSize; }
+	unsigned int length () const { return _dataSize; }
 
-		float avgAt(int x);
-		float maxAt(int x);
-		float minAt(int x);
+	float avgAt (unsigned int x, bool p) const
+	{ return p ? _data_prop_avg[x] : _data_flat_avg[x]; }
+	float maxAt (unsigned int x, bool p) const
+	{ return p ? _data_prop_max[x] : _data_flat_max[x]; }
+	float minAt (unsigned int x, bool p) const
+	{ return p ? _data_prop_min[x] : _data_flat_min[x]; }
 
-		float minimum() const { return _minimum; }
-		float maximum() const { return _maximum; }
+	float minimum (bool p) const
+	{ return p ? _min_prop : _min_flat; }
+	float maximum (bool p) const
+	{ return p ? _max_prop : _max_flat; }
 
-		Gdk::Color get_color() const { return _color; }
+	const Gdk::Color& get_color () const { return _color; }
 
-	private:
-		FFTResult(FFTGraph *graph, Gdk::Color color, std::string trackname);
-
-		int 	_averages;
+private:
+	FFTResult (FFTGraph *graph, Gdk::Color color, std::string trackname);
+	friend class FFTGraph;
 
-		float*	_data_avg;
-		float*  _data_max;
-		float*  _data_min;
+	int _averages;
 
-		float*	_work;
+	float* _data_flat_avg;
+	float* _data_flat_max;
+	float* _data_flat_min;
+	float* _data_prop_avg;
+	float* _data_prop_max;
+	float* _data_prop_min;
 
-		int	_windowSize;
-		int 	_dataSize;
+	unsigned int _windowSize;
+	unsigned int _dataSize;
 
-		float 	_minimum;
-		float 	_maximum;
+	float _min_flat;
+	float _max_flat;
+	float _min_prop;
+	float _max_prop;
 
-		FFTGraph *_graph;
+	FFTGraph *_graph;
 
-		Gdk::Color _color;
-		std::string _trackname;
+	Gdk::Color _color;
+	std::string _trackname;
 
-	friend class FFTGraph;
+	static float power_to_db (float v) { return v > 1e-20 ? 10.0f * log10f (v) : -200.0f; }
 };
 
 #endif /* __ardour_fft_result_h */
diff --git a/gtk2_ardour/floating_text_entry.cc b/gtk2_ardour/floating_text_entry.cc
index d264ee9..571969d 100644
--- a/gtk2_ardour/floating_text_entry.cc
+++ b/gtk2_ardour/floating_text_entry.cc
@@ -25,13 +25,14 @@
 #include "gtkmm2ext/doi.h"
 #include "gtkmm2ext/utils.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
-FloatingTextEntry::FloatingTextEntry (const std::string& initial_contents)
+FloatingTextEntry::FloatingTextEntry (Gtk::Window* parent, const std::string& initial_contents)
 	: Gtk::Window (Gtk::WINDOW_POPUP)
         , entry_changed (false)
+	, by_popup_menu (false)
 {
-	set_name (X_("FloatingTextEntry"));
+	//set_name (X_("FloatingTextEntry"));
 	set_position (Gtk::WIN_POS_MOUSE);
 	set_border_width (0);
 
@@ -42,14 +43,27 @@ FloatingTextEntry::FloatingTextEntry (const std::string& initial_contents)
 	entry.show ();
 	entry.signal_changed().connect (sigc::mem_fun (*this, &FloatingTextEntry::changed));
 	entry.signal_activate().connect (sigc::mem_fun (*this, &FloatingTextEntry::activated));
-	entry.signal_key_press_event().connect (sigc::mem_fun (*this, &FloatingTextEntry::key_press));
+	entry.signal_key_press_event().connect (sigc::mem_fun (*this, &FloatingTextEntry::key_press), false);
+	entry.signal_key_release_event().connect (sigc::mem_fun (*this, &FloatingTextEntry::key_release), false);
 	entry.signal_button_press_event().connect (sigc::mem_fun (*this, &FloatingTextEntry::button_press));
-	PublicEditor::instance ().signal_focus_out_event().connect (sigc::mem_fun (*this, &FloatingTextEntry::entry_focus_out));
+	entry.signal_populate_popup().connect (sigc::mem_fun (*this, &FloatingTextEntry::populate_popup));
+
+	entry.select_region (0, -1);
+
+	if (parent) {
+		parent->signal_focus_out_event().connect (sigc::mem_fun (*this, &FloatingTextEntry::entry_focus_out));
+	}
 
 	add (entry);
 }
 
 void
+FloatingTextEntry::populate_popup (Gtk::Menu *)
+{
+	by_popup_menu = true;
+}
+
+void
 FloatingTextEntry::changed ()
 {
 	entry_changed = true;
@@ -66,9 +80,14 @@ FloatingTextEntry::on_realize ()
 bool
 FloatingTextEntry::entry_focus_out (GdkEventFocus* ev)
 {
+	if (by_popup_menu) {
+		by_popup_menu = false;
+		return false;
+	}
+
 	entry.remove_modal_grab ();
 	if (entry_changed) {
-		use_text (entry.get_text ());
+		use_text (entry.get_text (), 0);
 	}
 
 	delete_when_idle ( this);
@@ -89,7 +108,7 @@ FloatingTextEntry::button_press (GdkEventButton* ev)
 	Glib::signal_idle().connect (sigc::bind_return (sigc::bind (sigc::ptr_fun (gtk_main_do_event), gdk_event_copy ((GdkEvent*) ev)), false));
 
 	if (entry_changed) {
-		use_text (entry.get_text ());
+		use_text (entry.get_text (), 0);
 	}
 
 	delete_when_idle ( this);
@@ -100,24 +119,54 @@ FloatingTextEntry::button_press (GdkEventButton* ev)
 void
 FloatingTextEntry::activated ()
 {
-	use_text (entry.get_text()); // EMIT SIGNAL
+	use_text (entry.get_text(), 0); // EMIT SIGNAL
 	delete_when_idle (this);
 }
 
 bool
 FloatingTextEntry::key_press (GdkEventKey* ev)
 {
+	/* steal escape, tabs from GTK */
+
+	switch (ev->keyval) {
+	case GDK_Escape:
+	case GDK_ISO_Left_Tab:
+	case GDK_Tab:
+		return true;
+	}
+	return false;
+}
+
+bool
+FloatingTextEntry::key_release (GdkEventKey* ev)
+{
 	switch (ev->keyval) {
 	case GDK_Escape:
+		/* cancel edit */
+		delete_when_idle (this);
+		return true;
+
+	case GDK_ISO_Left_Tab:
+		/* Shift+Tab Keys Pressed. Note that for Shift+Tab, GDK actually
+		 * generates a different ev->keyval, rather than setting
+		 * ev->state.
+		 */
+		use_text (entry.get_text(), -1); // EMIT SIGNAL, move to prev
+		delete_when_idle (this);
+		return true;
+
+	case GDK_Tab:
+		use_text (entry.get_text(), 1); // EMIT SIGNAL, move to next
 		delete_when_idle (this);
 		return true;
-		break;
 	default:
 		break;
 	}
+
 	return false;
 }
 
+
 void
 FloatingTextEntry::on_hide ()
 {
diff --git a/gtk2_ardour/floating_text_entry.h b/gtk2_ardour/floating_text_entry.h
index 72e5adc..596914c 100644
--- a/gtk2_ardour/floating_text_entry.h
+++ b/gtk2_ardour/floating_text_entry.h
@@ -26,20 +26,29 @@
 class FloatingTextEntry : public Gtk::Window
 {
   public:
-        FloatingTextEntry (const std::string& initial_contents);
+	FloatingTextEntry (Gtk::Window* parent, const std::string& initial_contents);
 
-        sigc::signal1<void,std::string> use_text;
+	/* 1st argument to handler is the new text
+	 * 2nd argument is 0, 1 or -1 to indicate:
+	 *  - do not move to next editable field
+	 *  - move to next editable field
+	 *  - move to previous editable field.
+	 */
+	sigc::signal2<void,std::string,int> use_text;
 
   private:
         Gtk::Entry entry;
         bool entry_changed;
+	bool by_popup_menu;
 
         /* handlers for Entry events */
-		bool entry_focus_out (GdkEventFocus*);
+	bool entry_focus_out (GdkEventFocus*);
         bool key_press (GdkEventKey*);
+        bool key_release (GdkEventKey*);
         void activated ();
         bool button_press (GdkEventButton*);
         void changed ();
+	void populate_popup (Gtk::Menu*);
 
         /* handlers for window events */
 
@@ -48,4 +57,3 @@ class FloatingTextEntry : public Gtk::Window
 };
 
 #endif // __ardour_window_h__
-
diff --git a/gtk2_ardour/gain_meter.cc b/gtk2_ardour/gain_meter.cc
index 2abd9d3..4b72a25 100644
--- a/gtk2_ardour/gain_meter.cc
+++ b/gtk2_ardour/gain_meter.cc
@@ -52,7 +52,7 @@
 #include "ardour/midi_track.h"
 #include "ardour/dB.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 using namespace ARDOUR_UI_UTILS;
@@ -82,6 +82,8 @@ reset_cursor_to_default_state (Gtk::StateType, Gtk::Entry* widget)
 	reset_cursor_to_default (widget);
 }
 
+sigc::signal<void, ARDOUR::AutoState> GainMeterBase::ChangeGainAutomationState;
+
 GainMeterBase::GainMeterBase (Session* s, bool horizontal, int fader_length, int fader_girth)
 	: gain_adjustment (gain_to_slider_position_with_max (1.0, Config->get_max_gain()),  // value
 	                   0.0,  // lower
@@ -90,6 +92,7 @@ GainMeterBase::GainMeterBase (Session* s, bool horizontal, int fader_length, int
 	                   dB_coeff_step(Config->get_max_gain()))  // page increment
 	, gain_automation_style_button ("")
 	, gain_automation_state_button ("")
+	, gain_astate_propagate (false)
 	, _data_type (DataType::AUDIO)
 {
 	using namespace Menu_Helpers;
@@ -126,13 +129,13 @@ GainMeterBase::GainMeterBase (Session* s, bool horizontal, int fader_length, int
 	gain_display.signal_activate().connect (sigc::mem_fun (*this, &GainMeter::gain_activated));
 	gain_display.signal_focus_in_event().connect (sigc::mem_fun (*this, &GainMeter::gain_focused), false);
 	gain_display.signal_focus_out_event().connect (sigc::mem_fun (*this, &GainMeter::gain_focused), false);
-	gain_display.set_alignment(0.5);
+	gain_display.set_alignment (0.5);
 
 	peak_display.set_name ("MixerStripPeakDisplay");
 	set_size_request_to_display_given_text (peak_display, "-80.g", 2, 6); /* note the descender */
 	max_peak = minus_infinity();
 	peak_display.set_text (_("-inf"));
-	peak_display.set_alignment(0.5);
+	peak_display.set_alignment (0.5);
 
 	/* stuff related to the fact that the peak display is not, in
 	   fact, supposed to be a text entry.
@@ -161,7 +164,7 @@ GainMeterBase::GainMeterBase (Session* s, bool horizontal, int fader_length, int
 	gain_astate_menu.set_name ("ArdourContextMenu");
 	gain_astyle_menu.set_name ("ArdourContextMenu");
 
-	gain_adjustment.signal_value_changed().connect (sigc::mem_fun(*this, &GainMeterBase::gain_adjusted));
+	gain_adjustment.signal_value_changed().connect (sigc::mem_fun(*this, &GainMeterBase::fader_moved));
 	peak_display.signal_button_release_event().connect (sigc::mem_fun(*this, &GainMeterBase::peak_button_release), false);
 	gain_display.signal_key_press_event().connect (sigc::mem_fun(*this, &GainMeterBase::gain_key_press), false);
 
@@ -190,12 +193,15 @@ GainMeterBase::set_controls (boost::shared_ptr<Route> r,
 	connections.clear ();
 	model_connections.drop_connections ();
 
-	if (!pm && !amp) {
+	/* no meter and no control? nothing to do ... */
+
+	if (!pm && !control) {
 		level_meter->set_meter (0);
 		gain_slider->set_controllable (boost::shared_ptr<PBD::Controllable>());
 		_meter.reset ();
 		_amp.reset ();
 		_route.reset ();
+		_control.reset ();
 		return;
 	}
 
@@ -204,8 +210,6 @@ GainMeterBase::set_controls (boost::shared_ptr<Route> r,
 	_route = r;
 	_control = control;
 
-	assert (_control);
-
 	level_meter->set_meter (pm.get());
 	gain_slider->set_controllable (_control);
 
@@ -224,20 +228,17 @@ GainMeterBase::set_controls (boost::shared_ptr<Route> r,
 		gain_astate_menu.items().clear ();
 
 		gain_astate_menu.items().push_back (MenuElem (S_("Automation|Manual"),
-							      sigc::bind (sigc::mem_fun (*(amp.get()), &Automatable::set_parameter_automation_state),
-									  Evoral::Parameter(GainAutomation), (AutoState) ARDOUR::Off)));
+							      sigc::bind (sigc::mem_fun (*this, &GainMeterBase::set_gain_astate), (AutoState) ARDOUR::Off)));
 		gain_astate_menu.items().push_back (MenuElem (_("Play"),
-							      sigc::bind (sigc::mem_fun (*(amp.get()), &Automatable::set_parameter_automation_state),
-								    Evoral::Parameter(GainAutomation), (AutoState) Play)));
+							      sigc::bind (sigc::mem_fun (*this, &GainMeterBase::set_gain_astate), (AutoState) ARDOUR::Play)));
 		gain_astate_menu.items().push_back (MenuElem (_("Write"),
-							      sigc::bind (sigc::mem_fun (*(amp.get()), &Automatable::set_parameter_automation_state),
-								    Evoral::Parameter(GainAutomation), (AutoState) Write)));
+							      sigc::bind (sigc::mem_fun (*this, &GainMeterBase::set_gain_astate), (AutoState) ARDOUR::Write)));
 		gain_astate_menu.items().push_back (MenuElem (_("Touch"),
-							      sigc::bind (sigc::mem_fun (*(amp.get()), &Automatable::set_parameter_automation_state),
-								    Evoral::Parameter(GainAutomation), (AutoState) Touch)));
+							      sigc::bind (sigc::mem_fun (*this, &GainMeterBase::set_gain_astate), (AutoState) ARDOUR::Touch)));
 
 		connections.push_back (gain_automation_style_button.signal_button_press_event().connect (sigc::mem_fun(*this, &GainMeterBase::gain_automation_style_button_event), false));
 		connections.push_back (gain_automation_state_button.signal_button_press_event().connect (sigc::mem_fun(*this, &GainMeterBase::gain_automation_state_button_event), false));
+		connections.push_back (ChangeGainAutomationState.connect (sigc::mem_fun(*this, &GainMeterBase::set_gain_astate)));
 
 		_control->alist()->automation_state_changed.connect (model_connections, invalidator (*this), boost::bind (&GainMeter::gain_automation_state_changed, this), gui_context());
 		_control->alist()->automation_style_changed.connect (model_connections, invalidator (*this), boost::bind (&GainMeter::gain_automation_style_changed, this), gui_context());
@@ -250,6 +251,23 @@ GainMeterBase::set_controls (boost::shared_ptr<Route> r,
 	gain_changed ();
 	show_gain ();
 	update_gain_sensitive ();
+
+	if (!_meter) {
+		peak_display.hide ();
+	} else {
+		peak_display.show ();
+	}
+}
+
+void
+GainMeterBase::set_gain_astate (AutoState as)
+{
+	if (gain_astate_propagate) {
+		gain_astate_propagate = false;
+		ChangeGainAutomationState (as);
+		return;
+	}
+	_amp->set_parameter_automation_state (Evoral::Parameter (GainAutomation), as);
 }
 
 void
@@ -400,7 +418,7 @@ GainMeterBase::reset_peak_display ()
 {
 	_meter->reset_max();
 	level_meter->clear_meters();
-	max_peak = -INFINITY;
+	max_peak = minus_infinity ();
 	peak_display.set_text (_("-inf"));
 	peak_display.set_name ("MixerStripPeakDisplay");
 }
@@ -463,7 +481,7 @@ GainMeterBase::gain_activated ()
 		// if they use different LC_NUMERIC conventions,
 		// we will honor them.
 
-		PBD::LocaleGuard lg ("");
+		PBD::LocaleGuard lg;
 		if (sscanf (gain_display.get_text().c_str(), "%f", &f) != 1) {
 			return;
 		}
@@ -472,10 +490,10 @@ GainMeterBase::gain_activated ()
 	/* clamp to displayable values */
 	if (_data_type == DataType::AUDIO) {
 		f = min (f, 6.0f);
-		_control->set_value (dB_to_coefficient(f), Controllable::NoGroup);
+		_control->set_value (dB_to_coefficient(f), Controllable::UseGroup);
 	} else {
 		f = min (fabs (f), 2.0f);
-		_control->set_value (f, Controllable::NoGroup);
+		_control->set_value (f, Controllable::UseGroup);
 	}
 
 	if (gain_display.has_focus()) {
@@ -520,24 +538,21 @@ GainMeterBase::show_gain ()
 }
 
 void
-GainMeterBase::gain_adjusted ()
+GainMeterBase::fader_moved ()
 {
-	gain_t value;
+	if (!ignore_toggle) {
 
-	/* convert from adjustment range (0..1) to gain coefficient */
+		gain_t value;
 
-	if (_data_type == DataType::AUDIO) {
-		value = slider_position_to_gain_with_max (gain_adjustment.get_value(), Config->get_max_gain());
-	} else {
-		value = gain_adjustment.get_value();
-	}
+		/* convert from adjustment range (0..1) to gain coefficient */
 
-	if (!ignore_toggle) {
-		if (_route && _route->amp() == _amp) {
-			_route->set_gain (value, Controllable::UseGroup);
+		if (_data_type == DataType::AUDIO) {
+			value = slider_position_to_gain_with_max (gain_adjustment.get_value(), Config->get_max_gain());
 		} else {
-			_control->set_value (value, Controllable::NoGroup);
+			value = gain_adjustment.get_value();
 		}
+
+		_control->set_value (value, Controllable::UseGroup);
 	}
 
 	show_gain ();
@@ -546,20 +561,23 @@ GainMeterBase::gain_adjusted ()
 void
 GainMeterBase::effective_gain_display ()
 {
-	float value = GAIN_COEFF_ZERO;
+	gain_t fader_position = 0;
 
 	switch (_data_type) {
 	case DataType::AUDIO:
-		value = gain_to_slider_position_with_max (_control->get_value(), Config->get_max_gain());
+		/* the position of the fader should reflect any master gain,
+		 * not just the control's own inherent value
+		 */
+		fader_position = gain_to_slider_position_with_max (_control->get_value(), Config->get_max_gain());
 		break;
 	case DataType::MIDI:
-		value = _control->get_value ();
+		fader_position = _control->get_value ();
 		break;
 	}
 
-	if (gain_adjustment.get_value() != value) {
+	if (gain_adjustment.get_value() != fader_position) {
 		ignore_toggle = true;
-		gain_adjustment.set_value (value);
+		gain_adjustment.set_value (fader_position);
 		ignore_toggle = false;
 	}
 }
@@ -731,13 +749,13 @@ GainMeterBase::meter_point_clicked ()
 void
 GainMeterBase::amp_start_touch ()
 {
-	_control->start_touch (_amp->session().transport_frame());
+	_control->start_touch (_control->session().transport_frame());
 }
 
 void
 GainMeterBase::amp_stop_touch ()
 {
-	_control->stop_touch (false, _amp->session().transport_frame());
+	_control->stop_touch (false, _control->session().transport_frame());
 }
 
 gint
@@ -749,6 +767,7 @@ GainMeterBase::gain_automation_state_button_event (GdkEventButton *ev)
 
 	switch (ev->button) {
 		case 1:
+			gain_astate_propagate = Keyboard::modifier_state_contains (ev->state, Keyboard::ModifierMask (Keyboard::PrimaryModifier | Keyboard::TertiaryModifier));
 			gain_astate_menu.popup (1, ev->time);
 			break;
 		default:
@@ -970,19 +989,18 @@ GainMeter::GainMeter (Session* s, int fader_length)
 	gain_automation_state_button.set_size_request (PX_SCALE(12, 15), PX_SCALE(12, 15));
 	gain_automation_style_button.set_size_request (PX_SCALE(12, 15), PX_SCALE(12, 15));
 
-	fader_vbox = manage (new Gtk::VBox());
-	fader_vbox->set_spacing (0);
-	fader_vbox->pack_start (*gain_slider, true, true);
+	fader_vbox.set_spacing (0);
+	fader_vbox.pack_start (*gain_slider, true, true);
 
 	fader_alignment.set (0.5, 0.5, 0.0, 1.0);
-	fader_alignment.add (*fader_vbox);
+	fader_alignment.add (fader_vbox);
 
 	hbox.pack_start (fader_alignment, true, true);
 
 	set_spacing (PX_SCALE(2, 2));
 
 	pack_start (gain_display_box, Gtk::PACK_SHRINK);
-	pack_start (hbox, Gtk::PACK_SHRINK);
+	pack_start (hbox, true, true);
 
 	meter_alignment.set (0.5, 0.5, 0.0, 1.0);
 	meter_alignment.add (*level_meter);
@@ -1037,20 +1055,20 @@ GainMeter::set_controls (boost::shared_ptr<Route> r,
 
 	if (_route) {
 		_route->active_changed.connect (model_connections, invalidator (*this), boost::bind (&GainMeter::route_active_changed, this), gui_context ());
+		hbox.pack_start (meter_hbox, true, true);
+		meter_hbox.show ();
 	}
 
-	/*
-	   if we have a non-hidden route (ie. we're not the click or the auditioner),
-	   pack some route-dependent stuff.
-	*/
-
-	hbox.pack_start (meter_hbox, true, true);
-
 //	if (r && !r->is_auditioner()) {
 //		fader_vbox->pack_start (gain_automation_state_button, false, false, 0);
 //	}
 
-	hbox.show_all ();
+	gain_display_box.show ();
+	gain_display.show ();
+	gain_slider->show ();
+	fader_vbox.show ();
+	fader_alignment.show ();
+	hbox.show ();
 	setup_meters ();
 }
 
diff --git a/gtk2_ardour/gain_meter.h b/gtk2_ardour/gain_meter.h
index 7cf3410..1594876 100644
--- a/gtk2_ardour/gain_meter.h
+++ b/gtk2_ardour/gain_meter.h
@@ -98,6 +98,14 @@ class GainMeterBase : virtual public sigc::trackable, ARDOUR::SessionHandlePtr
 	 */
 	PBD::Signal1<bool, GdkEventButton *> LevelMeterButtonPress;
 
+	static std::string astate_string (ARDOUR::AutoState);
+	static std::string short_astate_string (ARDOUR::AutoState);
+	static std::string _astate_string (ARDOUR::AutoState, bool);
+
+	static std::string astyle_string (ARDOUR::AutoStyle);
+	static std::string short_astyle_string (ARDOUR::AutoStyle);
+	static std::string _astyle_string (ARDOUR::AutoStyle, bool);
+
   protected:
 
 	friend class MixerStrip;
@@ -131,6 +139,10 @@ class GainMeterBase : virtual public sigc::trackable, ARDOUR::SessionHandlePtr
 	Gtk::Menu gain_astate_menu;
 	Gtk::Menu gain_astyle_menu;
 
+	void set_gain_astate (ARDOUR::AutoState);
+	bool gain_astate_propagate;
+	static sigc::signal<void, ARDOUR::AutoState> ChangeGainAutomationState;
+
 	gint gain_automation_style_button_event (GdkEventButton *);
 	gint gain_automation_state_button_event (GdkEventButton *);
 	gint pan_automation_style_button_event (GdkEventButton *);
@@ -140,15 +152,6 @@ class GainMeterBase : virtual public sigc::trackable, ARDOUR::SessionHandlePtr
 	void gain_automation_style_changed();
 
 	void setup_gain_adjustment ();
-
-	std::string astate_string (ARDOUR::AutoState);
-	std::string short_astate_string (ARDOUR::AutoState);
-	std::string _astate_string (ARDOUR::AutoState, bool);
-
-	std::string astyle_string (ARDOUR::AutoStyle);
-	std::string short_astyle_string (ARDOUR::AutoStyle);
-	std::string _astyle_string (ARDOUR::AutoStyle, bool);
-
 	Width _width;
 
 	void show_gain ();
@@ -157,7 +160,7 @@ class GainMeterBase : virtual public sigc::trackable, ARDOUR::SessionHandlePtr
 
 	float max_peak;
 
-	void gain_adjusted ();
+	void fader_moved ();
 	void gain_changed ();
 
 	void meter_point_clicked ();
@@ -232,7 +235,7 @@ class GainMeter : public GainMeterBase, public Gtk::VBox
 
 	Gtk::HBox  gain_display_box;
 	Gtk::HBox  fader_box;
-	Gtk::VBox* fader_vbox;
+	Gtk::VBox  fader_vbox;
 	Gtk::HBox  hbox;
 	Gtk::HBox  meter_hbox;
 	Gtk::Alignment fader_alignment;
diff --git a/gtk2_ardour/generic_pluginui.cc b/gtk2_ardour/generic_pluginui.cc
index ef2de43..7832dcf 100644
--- a/gtk2_ardour/generic_pluginui.cc
+++ b/gtk2_ardour/generic_pluginui.cc
@@ -28,6 +28,7 @@
 #include <vector>
 
 #include "pbd/stl_delete.h"
+#include "pbd/unwind.h"
 #include "pbd/xml++.h"
 #include "pbd/failed_constructor.h"
 
@@ -47,11 +48,13 @@
 #include "plugin_ui.h"
 #include "gui_thread.h"
 #include "automation_controller.h"
+#include "ardour_knob.h"
+#include "gain_meter.h"
 #include "timers.h"
 #include "tooltips.h"
 #include "ui_config.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
@@ -62,11 +65,6 @@ using namespace ARDOUR_UI_UTILS;
 
 GenericPluginUI::GenericPluginUI (boost::shared_ptr<PluginInsert> pi, bool scrollable)
 	: PlugUIBase (pi)
-	, button_table (initial_button_rows, initial_button_cols)
-	, output_table (initial_output_rows, initial_output_cols)
-	, hAdjustment(0.0, 0.0, 0.0)
-	, vAdjustment(0.0, 0.0, 0.0)
-	, scroller_view(hAdjustment, vAdjustment)
 	, automation_menu (0)
 	, is_scrollable(scrollable)
 {
@@ -89,6 +87,7 @@ GenericPluginUI::GenericPluginUI (boost::shared_ptr<PluginInsert> pi, bool scrol
 	set_latency_label ();
 
 	smaller_hbox->pack_start (latency_button, false, false, 4);
+	smaller_hbox->pack_start (pin_management_button, false, false, 4);
 	smaller_hbox->pack_start (_preset_combo, false, false);
 	smaller_hbox->pack_start (_preset_modified, false, false);
 	smaller_hbox->pack_start (add_button, false, false);
@@ -136,25 +135,31 @@ GenericPluginUI::GenericPluginUI (boost::shared_ptr<PluginInsert> pi, bool scrol
 
 	main_contents.pack_start (*constraint_hbox, false, false);
 
-	if (is_scrollable ) {
-		scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
-		scroller.set_name ("PluginEditor");
-		scroller_view.set_name("PluginEditor");
-		scroller_view.add (hpacker);
-		scroller.add (scroller_view);
-
-		main_contents.pack_start (scroller, true, true);
-
+	if (is_scrollable) {
+		Gtk::ScrolledWindow *scroller = manage (new Gtk::ScrolledWindow());
+		scroller->set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
+		scroller->set_name ("PluginEditor");
+		scroller->add (hpacker);
+		main_contents.pack_start (*scroller, true, true);
 	} else {
 		main_contents.pack_start (hpacker, false, false);
 	}
 
 	pi->ActiveChanged.connect (active_connection, invalidator (*this), boost::bind (&GenericPluginUI::processor_active_changed, this, boost::weak_ptr<Processor>(pi)), gui_context());
 
-	bypass_button.set_active (!pi->active());
+	bypass_button.set_active (!pi->enabled());
 
 	prefheight = 0;
 	build ();
+
+	/* Listen for property changes that are not notified normally because
+	 * AutomationControl has only support for numeric values currently.
+	 * The only case is Variant::PATH for now */
+	plugin->PropertyChanged.connect(*this, invalidator(*this),
+	                                boost::bind(&GenericPluginUI::path_property_changed, this, _1, _2),
+	                                gui_context());
+
+	main_contents.show ();
 }
 
 GenericPluginUI::~GenericPluginUI ()
@@ -216,58 +221,11 @@ static const float default_similarity_threshold = 0.3;
 void
 GenericPluginUI::build ()
 {
-	guint32 i = 0;
-	guint32 x = 0;
-	Frame* frame;
-	Frame* bt_frame;
-	VBox* box;
-	int output_row, output_col;
-	int button_row, button_col;
-	int output_rows, output_cols;
-	int button_rows, button_cols;
-
-	hpacker.set_spacing (10);
-
-	output_rows = initial_output_rows;
-	output_cols = initial_output_cols;
-	button_rows = initial_button_rows;
-	button_cols = initial_button_cols;
-	output_row = 0;
-	button_row = 0;
-	output_col = 0;
-	button_col = 0;
-
-	button_table.set_homogeneous (false);
-	button_table.set_row_spacings (2);
-	button_table.set_col_spacings (2);
-	output_table.set_homogeneous (true);
-	output_table.set_row_spacings (2);
-	output_table.set_col_spacings (2);
-	button_table.set_border_width (5);
-	output_table.set_border_width (5);
-
-	hpacker.set_border_width (10);
-
-	bt_frame = manage (new Frame);
-	bt_frame->set_name ("BaseFrame");
-	bt_frame->set_label (_("Switches"));
-	bt_frame->add (button_table);
-	hpacker.pack_start(*bt_frame, true, true);
-
-	box = manage (new VBox);
-	box->set_border_width (5);
-	box->set_spacing (1);
-
-	frame = manage (new Frame);
-	frame->set_name ("BaseFrame");
-	frame->set_label (_("Controls"));
-	frame->add (*box);
-	hpacker.pack_start(*frame, true, true);
-
 	std::vector<ControlUI *> control_uis;
+	bool grid = true;
 
 	// Build a ControlUI for each control port
-	for (i = 0; i < plugin->parameter_count(); ++i) {
+	for (size_t i = 0; i < plugin->parameter_count(); ++i) {
 
 		if (plugin->parameter_is_control (i)) {
 
@@ -285,6 +243,11 @@ GenericPluginUI::build ()
 			const float value = plugin->get_parameter(i);
 
 			ControlUI* cui;
+			Plugin::UILayoutHint hint;
+
+			if (!plugin->get_layout(i, hint)) {
+				grid = false;
+			}
 
 			boost::shared_ptr<ARDOUR::AutomationControl> c
 				= boost::dynamic_pointer_cast<ARDOUR::AutomationControl>(
@@ -292,18 +255,24 @@ GenericPluginUI::build ()
 
 			ParameterDescriptor desc;
 			plugin->get_parameter_descriptor(i, desc);
-			if ((cui = build_control_ui (param, desc, c, value, plugin->parameter_is_input(i))) == 0) {
+			if ((cui = build_control_ui (param, desc, c, value, plugin->parameter_is_input(i), hint.knob)) == 0) {
 				error << string_compose(_("Plugin Editor: could not build control element for port %1"), i) << endmsg;
 				continue;
 			}
 
+			if (grid) {
+				cui->x0 = hint.x0;
+				cui->x1 = hint.x1;
+				cui->y0 = hint.y0;
+				cui->y1 = hint.y1;
+			}
+
 			const std::string param_docs = plugin->get_parameter_docs(i);
 			if (!param_docs.empty()) {
 				set_tooltip(cui, param_docs.c_str());
 			}
 
 			control_uis.push_back(cui);
-			input_controls_with_automation.push_back (cui);
 		}
 	}
 
@@ -335,39 +304,117 @@ GenericPluginUI::build ()
 		plugin->announce_property_values();
 	}
 
+	if (grid) {
+		custom_layout (control_uis);
+	} else {
+		automatic_layout (control_uis);
+	}
+
+	output_update ();
+
+	automation_manual_all_button.signal_clicked.connect(sigc::bind (sigc::mem_fun (*this, &GenericPluginUI::set_all_automation), ARDOUR::Off));
+	automation_play_all_button.signal_clicked.connect(sigc::bind (sigc::mem_fun (*this, &GenericPluginUI::set_all_automation), ARDOUR::Play));
+	automation_write_all_button.signal_clicked.connect(sigc::bind (sigc::mem_fun (*this, &GenericPluginUI::set_all_automation), ARDOUR::Write));
+	automation_touch_all_button.signal_clicked.connect(sigc::bind (sigc::mem_fun (*this, &GenericPluginUI::set_all_automation), ARDOUR::Touch));
+
+	/* XXX This is a workaround for AutomationControl not knowing about preset loads */
+	plugin->PresetLoaded.connect (*this, invalidator (*this), boost::bind (&GenericPluginUI::update_input_displays, this), gui_context ());
+}
+
+
+void
+GenericPluginUI::automatic_layout (const std::vector<ControlUI*>& control_uis)
+{
+	guint32 x = 0;
+
+	static const int32_t initial_button_rows = 12;
+	static const int32_t initial_button_cols = 1;
+	static const int32_t initial_output_rows = 1;
+	static const int32_t initial_output_cols = 4;
+
+	Gtk::Table* button_table = manage (new Gtk::Table (initial_button_rows, initial_button_cols));
+	Gtk::Table* output_table = manage (new Gtk::Table (initial_output_rows, initial_output_cols));
+
+	Frame* frame;
+	Frame* bt_frame;
+	VBox* box;
+	int output_row, output_col;
+	int button_row, button_col;
+	int output_rows, output_cols;
+	int button_rows, button_cols;
+
+	hpacker.set_spacing (10);
+	hpacker.set_border_width (10);
+
+	output_rows = initial_output_rows;
+	output_cols = initial_output_cols;
+	button_rows = initial_button_rows;
+	button_cols = initial_button_cols;
+	output_row = 0;
+	button_row = 0;
+	output_col = 0;
+	button_col = 0;
+
+	button_table->set_homogeneous (false);
+	button_table->set_row_spacings (2);
+	button_table->set_col_spacings (2);
+	output_table->set_homogeneous (true);
+	output_table->set_row_spacings (2);
+	output_table->set_col_spacings (2);
+	button_table->set_border_width (5);
+	output_table->set_border_width (5);
+
+
+	bt_frame = manage (new Frame);
+	bt_frame->set_name ("BaseFrame");
+	bt_frame->set_label (_("Switches"));
+	bt_frame->add (*button_table);
+	hpacker.pack_start(*bt_frame, true, true);
+
+	box = manage (new VBox);
+	box->set_border_width (5);
+	box->set_spacing (1);
+
+	frame = manage (new Frame);
+	frame->set_name ("BaseFrame");
+	frame->set_label (_("Controls"));
+	frame->add (*box);
+	hpacker.pack_start(*frame, true, true);
+
 	// Add special controls to UI, and build list of normal controls to be layed out later
 	std::vector<ControlUI *> cui_controls_list;
-	for (i = 0; i < control_uis.size(); ++i) {
+	for (size_t i = 0; i < control_uis.size(); ++i) {
 		ControlUI* cui = control_uis[i];
 
-		if (cui->controller || cui->clickbox || cui->combo) {
-			// Get all of the controls into a list, so that
-			// we can lay them out a bit more nicely later.
-			cui_controls_list.push_back(cui);
-		} else if (cui->button || cui->file_button) {
+		if (cui->button || cui->file_button) {
 
 			if (!is_scrollable && button_row == button_rows) {
 				button_row = 0;
 				if (++button_col == button_cols) {
 					button_cols += 2;
-					button_table.resize (button_rows, button_cols);
+					button_table->resize (button_rows, button_cols);
 				}
 			}
 
-			button_table.attach (*cui, button_col, button_col + 1, button_row, button_row+1,
+			button_table->attach (*cui, button_col, button_col + 1, button_row, button_row+1,
 			                     FILL|EXPAND, FILL);
 			button_row++;
 
+		} else if (cui->controller || cui->clickbox || cui->combo) {
+			// Get all of the controls into a list, so that
+			// we can lay them out a bit more nicely later.
+			cui_controls_list.push_back(cui);
+
 		} else if (cui->display) {
 
-			output_table.attach (*cui, output_col, output_col + 1, output_row, output_row+1,
+			output_table->attach (*cui, output_col, output_col + 1, output_row, output_row+1,
 			                     FILL|EXPAND, FILL);
 
 			// TODO: The meters should be divided into multiple rows
 
 			if (++output_col == output_cols) {
 				output_cols ++;
-				output_table.resize (output_rows, output_cols);
+				output_table->resize (output_rows, output_cols);
 			}
 		}
 	}
@@ -381,7 +428,7 @@ GenericPluginUI::build ()
 	std::vector<float> similarity_scores(cui_controls_list.size());
 	float most_similar = 0.0, least_similar = 1.0;
 
-	i = 0;
+	size_t i = 0;
 	for (vector<ControlUI*>::iterator cuip = cui_controls_list.begin(); cuip != cui_controls_list.end(); ++cuip, ++i) {
 		label = (*cuip)->label.get_text();
 		numbers_in_labels[i] = get_number(label);
@@ -461,33 +508,52 @@ GenericPluginUI::build ()
 		hpacker.remove (*frame);
 	}
 
-	if (button_table.children().empty()) {
+	if (button_table->children().empty()) {
 		hpacker.remove (*bt_frame);
+		delete button_table;
+	} else {
+		button_table->show_all ();
 	}
 
-	if (!output_table.children().empty()) {
+	if (!output_table->children().empty()) {
 		frame = manage (new Frame);
 		frame->set_name ("BaseFrame");
 		frame->set_label(_("Meters"));
-		frame->add (output_table);
+		frame->add (*output_table);
 		hpacker.pack_end (*frame, true, true);
+		output_table->show_all ();
+	} else {
+		delete output_table;
 	}
+}
 
-	output_update ();
-
-	output_table.show_all ();
-	button_table.show_all ();
+void
+GenericPluginUI::custom_layout (const std::vector<ControlUI*>& control_uis)
+{
+	Gtk::Table* layout = manage (new Gtk::Table ());
 
-	automation_manual_all_button.signal_clicked.connect(sigc::bind (sigc::mem_fun (*this, &GenericPluginUI::set_all_automation), ARDOUR::Off));
-	automation_play_all_button.signal_clicked.connect(sigc::bind (sigc::mem_fun (*this, &GenericPluginUI::set_all_automation), ARDOUR::Play));
-	automation_write_all_button.signal_clicked.connect(sigc::bind (sigc::mem_fun (*this, &GenericPluginUI::set_all_automation), ARDOUR::Write));
-	automation_touch_all_button.signal_clicked.connect(sigc::bind (sigc::mem_fun (*this, &GenericPluginUI::set_all_automation), ARDOUR::Touch));
+	for (vector<ControlUI*>::const_iterator i = control_uis.begin(); i != control_uis.end(); ++i) {
+		ControlUI* cui = *i;
+		if (cui->x0 < 0 || cui->y0 < 0) {
+			continue;
+		}
+		layout->attach (*cui, cui->x0, cui->x1, cui->y0, cui->y1, FILL, SHRINK, 2, 2);
+	}
+	hpacker.pack_start (*layout, true, true);
 }
 
 GenericPluginUI::ControlUI::ControlUI (const Evoral::Parameter& p)
 	: param(p)
 	, automate_button (X_("")) // force creation of a label
-	, file_button(NULL)
+	, combo (0)
+	, clickbox (0)
+	, file_button (0)
+	, spin_box (0)
+	, display (0)
+	, hbox (0)
+	, vbox (0)
+	, meterinfo (0)
+	, knobtable (0)
 {
 	automate_button.set_name ("PluginAutomateButton");
 	set_tooltip (automate_button, _("Automation control"));
@@ -497,13 +563,13 @@ GenericPluginUI::ControlUI::ControlUI (const Evoral::Parameter& p)
 	   below). be sure to include a descender.
 	*/
 
-	set_size_request_to_display_given_text (automate_button, _("Mgnual"), 15, 10);
+	set_size_request_to_display_given_text (automate_button, _("Mgnual"), 12, 6);
+
+	ignore_change = false;
+	update_pending = false;
+	button = false;
 
-	ignore_change = 0;
-	display = 0;
-	button = 0;
-	clickbox = 0;
-	meterinfo = 0;
+	x0 = x1 = y0 = y1 = -1;
 }
 
 GenericPluginUI::ControlUI::~ControlUI()
@@ -521,21 +587,30 @@ GenericPluginUI::automation_state_changed (ControlUI* cui)
 
 	// don't lock to avoid deadlock because we're triggered by
 	// AutomationControl::Changed() while the automation lock is taken
+
+	if (cui->knobtable) {
+		cui->automate_button.set_text (
+				GainMeterBase::astate_string (
+					insert->get_parameter_automation_state (cui->parameter()))
+				);
+		return;
+	}
+
 	switch (insert->get_parameter_automation_state (cui->parameter()) & (ARDOUR::Off|Play|Touch|Write)) {
 	case ARDOUR::Off:
-		cui->automate_button.set_label (S_("Automation|Manual"));
+		cui->automate_button.set_text (S_("Automation|Manual"));
 		break;
 	case Play:
-		cui->automate_button.set_label (_("Play"));
+		cui->automate_button.set_text (_("Play"));
 		break;
 	case Write:
-		cui->automate_button.set_label (_("Write"));
+		cui->automate_button.set_text (_("Write"));
 		break;
 	case Touch:
-		cui->automate_button.set_label (_("Touch"));
+		cui->automate_button.set_text (_("Touch"));
 		break;
 	default:
-		cui->automate_button.set_label (_("???"));
+		cui->automate_button.set_text (_("???"));
 		break;
 	}
 }
@@ -574,24 +649,59 @@ GenericPluginUI::build_control_ui (const Evoral::Parameter&             param,
                                    const ParameterDescriptor&           desc,
                                    boost::shared_ptr<AutomationControl> mcontrol,
                                    float                                value,
-                                   bool                                 is_input)
+                                   bool                                 is_input,
+                                   bool                                 use_knob)
 {
 	ControlUI* control_ui = 0;
 
 	control_ui = manage (new ControlUI (param));
 	control_ui->combo = 0;
 	control_ui->control = mcontrol;
-	control_ui->update_pending = false;
 	control_ui->label.set_text (desc.label);
 	control_ui->label.set_alignment (0.0, 0.5);
 	control_ui->label.set_name ("PluginParameterLabel");
-
 	control_ui->set_spacing (5);
 
 	Gtk::Requisition req (control_ui->automate_button.size_request());
 
 	if (is_input) {
 
+		if (desc.datatype == Variant::PATH) {
+
+			/* We shouldn't get that type for input ports */
+			assert(param.type() == PluginPropertyAutomation);
+
+			/* Build a file selector button */
+
+			// Create/add controller
+			control_ui->file_button = manage(new Gtk::FileChooserButton(Gtk::FILE_CHOOSER_ACTION_OPEN));
+			control_ui->file_button->set_title(desc.label);
+
+			if (use_knob) {
+				control_ui->knobtable = manage (new Table());
+				control_ui->pack_start(*control_ui->knobtable, true, false);
+				control_ui->knobtable->attach (control_ui->label, 0, 1, 0, 1);
+				control_ui->knobtable->attach (*control_ui->file_button, 0, 1, 1, 2);
+			} else {
+				control_ui->pack_start (control_ui->label, false, true);
+				control_ui->pack_start (*control_ui->file_button, true, true);
+			}
+
+			// Monitor changes from the user.
+			control_ui->file_button->signal_file_set().connect(
+				sigc::bind(sigc::mem_fun(*this, &GenericPluginUI::set_path_property),
+				           desc, control_ui->file_button));
+
+			/* Add the filebutton control to a map so that we can update it when
+			 * the corresponding property changes. This doesn't go through the usual
+			 * AutomationControls, because they don't support non-numeric values. */
+			_filepath_controls.insert(std::make_pair(desc.key, control_ui->file_button));
+
+			return control_ui;
+		}
+
+		assert(mcontrol);
+
 		/* See if there any named values for our input value */
 		control_ui->scale_points = desc.scale_points;
 
@@ -607,137 +717,145 @@ GenericPluginUI::build_control_ui (const Evoral::Parameter&             param,
 			 *   b) This port is marked as being an enumeration.
 			 */
 
-			std::vector<std::string> labels;
-			for (
-				ARDOUR::ScalePoints::const_iterator i = control_ui->scale_points->begin();
-				i != control_ui->scale_points->end();
-				++i) {
-
-				labels.push_back(i->first);
+			control_ui->combo = new ArdourDropdown();
+			for (ARDOUR::ScalePoints::const_iterator i = control_ui->scale_points->begin();
+			     i != control_ui->scale_points->end();
+			     ++i) {
+				control_ui->combo->AddMenuElem(Menu_Helpers::MenuElem(
+						i->first,
+						sigc::bind(sigc::mem_fun(*this, &GenericPluginUI::control_combo_changed),
+						           control_ui,
+						           i->second)));
 			}
 
-			control_ui->combo = new Gtk::ComboBoxText();
-			set_popdown_strings(*control_ui->combo, labels);
-			control_ui->combo->signal_changed().connect(
-				sigc::bind (sigc::mem_fun(*this, &GenericPluginUI::control_combo_changed),
-				            control_ui));
-			mcontrol->Changed.connect(control_connections, invalidator(*this),
-			                          boost::bind(&GenericPluginUI::ui_parameter_changed,
-			                                      this, control_ui),
-			                          gui_context());
-			control_ui->pack_start(control_ui->label, true, true);
-			control_ui->pack_start(*control_ui->combo, false, true);
-
 			update_control_display(control_ui);
 
-			return control_ui;
-		}
-
-		if (desc.toggled) {
+		} else {
 
-			/* Build a button */
+			/* create the controller */
 
-			control_ui->button = manage (new ToggleButton ());
-			control_ui->button->set_name ("PluginEditorButton");
-			control_ui->button->set_size_request (20, 20);
+			/* XXX memory leak: SliderController not destroyed by ControlUI
+			 * destructor, and manage() reports object hierarchy
+			 * ambiguity.
+			 */
+			control_ui->controller = AutomationController::create(insert, mcontrol->parameter(), desc, mcontrol, use_knob);
 
-			control_ui->pack_start (control_ui->label, true, true);
-			control_ui->pack_start (*control_ui->button, false, true);
-			control_ui->pack_start (control_ui->automate_button, false, false);
+			/* Control UI's don't need the rapid timer workaround */
+			control_ui->controller->stop_updating ();
 
-			control_ui->button->signal_clicked().connect (sigc::bind (sigc::mem_fun(*this, &GenericPluginUI::control_port_toggled), control_ui));
-			control_ui->automate_button.signal_clicked().connect (bind (mem_fun(*this, &GenericPluginUI::astate_clicked), control_ui));
+			/* XXX this code is not right yet, because it doesn't handle
+			   the absence of bounds in any sensible fashion.
+			*/
 
-			mcontrol->Changed.connect (control_connections, invalidator (*this), boost::bind (&GenericPluginUI::toggle_parameter_changed, this, control_ui), gui_context());
-			mcontrol->alist()->automation_state_changed.connect (control_connections, invalidator (*this), boost::bind (&GenericPluginUI::automation_state_changed, this, control_ui), gui_context());
+			Adjustment* adj = control_ui->controller->adjustment();
 
-			if (value > 0.5){
-				control_ui->button->set_active(true);
+			if (desc.integer_step && !desc.toggled) {
+				control_ui->clickbox = new ClickBox (adj, "PluginUIClickBox", true);
+				Gtkmm2ext::set_size_request_to_display_given_text (*control_ui->clickbox, "g9999999", 2, 2);
+				if (desc.unit == ParameterDescriptor::MIDI_NOTE) {
+					control_ui->clickbox->set_printer (sigc::bind (sigc::mem_fun (*this, &GenericPluginUI::midinote_printer), control_ui));
+				} else {
+					control_ui->clickbox->set_printer (sigc::bind (sigc::mem_fun (*this, &GenericPluginUI::integer_printer), control_ui));
+				}
+			} else if (desc.toggled) {
+				control_ui->controller->set_size_request (req.height, req.height);
+			} else if (use_knob) {
+				control_ui->controller->set_size_request (req.height * 1.5, req.height * 1.5);
+			} else {
+				control_ui->controller->set_size_request (200, req.height);
+				control_ui->controller->set_name (X_("ProcessorControlSlider"));
 			}
 
-			automation_state_changed (control_ui);
-
-			return control_ui;
-		}
-
-		if (desc.datatype == Variant::PATH) {
-
-			/* Build a file selector button */
-
-			// Create/add controller
-			control_ui->file_button = manage(new Gtk::FileChooserButton(Gtk::FILE_CHOOSER_ACTION_OPEN));
-			control_ui->file_button->set_title(desc.label);
-
-			control_ui->pack_start (control_ui->label, false, true);
-			control_ui->pack_start (*control_ui->file_button, true, true);
-
-			// Connect signals (TODO: do this via the Control)
-			control_ui->file_button->signal_file_set().connect(
-				sigc::bind(sigc::mem_fun(*this, &GenericPluginUI::set_property),
-				           desc, control_ui->file_button));
-			plugin->PropertyChanged.connect(*this, invalidator(*this),
-			                                boost::bind(&GenericPluginUI::property_changed, this, _1, _2),
-			                                gui_context());
-
-			_property_controls.insert(std::make_pair(desc.key, control_ui->file_button));
-			control_ui->file_button = control_ui->file_button;
-
-			return control_ui;
-		}
+			if (!desc.integer_step && !desc.toggled && use_knob) {
+				control_ui->spin_box = manage (new ArdourSpinner (mcontrol, adj, insert));
+			}
 
-		/* create the controller */
+			adj->set_value (mcontrol->internal_to_interface(value));
 
-		if (mcontrol) {
-			control_ui->controller = AutomationController::create(insert, mcontrol->parameter(), desc, mcontrol);
 		}
 
-		/* XXX this code is not right yet, because it doesn't handle
-		   the absence of bounds in any sensible fashion.
-		*/
-
-		Adjustment* adj = control_ui->controller->adjustment();
-
-		if (desc.integer_step) {
-			control_ui->clickbox = new ClickBox (adj, "PluginUIClickBox", true);
-			Gtkmm2ext::set_size_request_to_display_given_text (*control_ui->clickbox, "g9999999", 2, 2);
-			if (desc.unit == ParameterDescriptor::MIDI_NOTE) {
-				control_ui->clickbox->set_printer (sigc::bind (sigc::mem_fun (*this, &GenericPluginUI::midinote_printer), control_ui));
+		if (use_knob) {
+			set_size_request_to_display_given_text (control_ui->automate_button, "M", 2, 2);
+
+			control_ui->label.set_alignment (0.5, 0.5);
+			control_ui->knobtable = manage (new Table());
+			control_ui->pack_start(*control_ui->knobtable, true, true);
+
+			if (control_ui->combo) {
+				control_ui->knobtable->attach (control_ui->label, 0, 1, 0, 1);
+				control_ui->knobtable->attach (*control_ui->combo, 0, 1, 1, 2);
+			} else if (control_ui->clickbox) {
+				control_ui->knobtable->attach (*control_ui->clickbox, 0, 2, 0, 1);
+				control_ui->knobtable->attach (control_ui->label, 0, 1, 1, 2, FILL, SHRINK);
+				control_ui->knobtable->attach (control_ui->automate_button, 1, 2, 1, 2, SHRINK, SHRINK, 2, 0);
+			} else if (control_ui->spin_box) {
+				ArdourKnob* knob = dynamic_cast<ArdourKnob*>(control_ui->controller->widget ());
+				knob->set_tooltip_prefix (desc.label + ": ");
+				knob->set_printer (insert);
+				Alignment *align = manage (new Alignment (.5, .5, 0, 0));
+				align->add (*control_ui->controller);
+				control_ui->knobtable->attach (*align, 0, 1, 0, 1, EXPAND, SHRINK, 1, 2);
+				control_ui->knobtable->attach (*control_ui->spin_box, 0, 2, 1, 2);
+				control_ui->knobtable->attach (control_ui->automate_button, 1, 2, 0, 1, SHRINK, SHRINK, 2, 0);
+			} else if (desc.toggled) {
+				Alignment *align = manage (new Alignment (.5, .5, 0, 0));
+				align->add (*control_ui->controller);
+				control_ui->knobtable->attach (*align, 0, 2, 0, 1, EXPAND, SHRINK, 2, 2);
+				control_ui->knobtable->attach (control_ui->label, 0, 1, 1, 2, FILL, SHRINK);
+				control_ui->knobtable->attach (control_ui->automate_button, 1, 2, 1, 2, SHRINK, SHRINK, 2, 0);
 			} else {
-				control_ui->clickbox->set_printer (sigc::bind (sigc::mem_fun (*this, &GenericPluginUI::integer_printer), control_ui));
+				control_ui->knobtable->attach (*control_ui->controller, 0, 2, 0, 1);
+				control_ui->knobtable->attach (control_ui->label, 0, 1, 1, 2, FILL, SHRINK);
+				control_ui->knobtable->attach (control_ui->automate_button, 1, 2, 1, 2, SHRINK, SHRINK, 2, 0);
 			}
-		} else {
-			//sigc::slot<void,char*,uint32_t> pslot = sigc::bind (sigc::mem_fun(*this, &GenericPluginUI::print_parameter), (uint32_t) port_index);
 
-			control_ui->controller->set_size_request (200, req.height);
-			control_ui->controller->set_name (X_("ProcessorControlSlider"));
+		} else {
 
+			control_ui->pack_start (control_ui->label, true, true);
+			if (control_ui->combo) {
+				control_ui->pack_start(*control_ui->combo, false, true);
+			} else if (control_ui->clickbox) {
+				control_ui->pack_start (*control_ui->clickbox, false, false);
+			} else if (control_ui->spin_box) {
+				control_ui->pack_start (*control_ui->spin_box, false, false);
+				control_ui->pack_start (*control_ui->controller, false, false);
+			} else {
+				control_ui->pack_start (*control_ui->controller, false, false);
+			}
+			control_ui->pack_start (control_ui->automate_button, false, false);
 		}
 
-		adj->set_value (mcontrol->internal_to_interface(value));
-
-		/* XXX memory leak: SliderController not destroyed by ControlUI
-		   destructor, and manage() reports object hierarchy
-		   ambiguity.
-		*/
 
-		control_ui->pack_start (control_ui->label, true, true);
-		if (desc.integer_step) {
-			control_ui->pack_start (*control_ui->clickbox, false, false);
+		if (mcontrol->flags () & Controllable::NotAutomatable) {
+			control_ui->automate_button.set_sensitive (false);
+			set_tooltip(control_ui->automate_button, _("This control cannot be automated"));
 		} else {
-			control_ui->pack_start (*control_ui->controller, false, false);
+			control_ui->automate_button.signal_clicked.connect (sigc::bind (
+						sigc::mem_fun(*this, &GenericPluginUI::astate_clicked),
+						control_ui));
+			mcontrol->alist()->automation_state_changed.connect (
+					control_connections,
+					invalidator (*this),
+					boost::bind (&GenericPluginUI::automation_state_changed, this, control_ui),
+					gui_context());
+			input_controls_with_automation.push_back (control_ui);
 		}
 
-		control_ui->pack_start (control_ui->automate_button, false, false);
-		control_ui->automate_button.signal_clicked().connect (sigc::bind (sigc::mem_fun(*this, &GenericPluginUI::astate_clicked), control_ui));
+		if (desc.toggled) {
+			control_ui->button = true;
+			ArdourButton* but = dynamic_cast<ArdourButton*>(control_ui->controller->widget ());
+			assert (but);
+			but->set_name ("pluginui toggle");
+			update_control_display(control_ui);
+		}
 
 		automation_state_changed (control_ui);
 
-		mcontrol->alist()->automation_state_changed.connect (control_connections, invalidator (*this), boost::bind (&GenericPluginUI::automation_state_changed, this, control_ui), gui_context());
-
+		/* Add to the list of CUIs that need manual update to workaround
+		 * AutomationControl not knowing about preset loads */
 		input_controls.push_back (control_ui);
-		input_controls_with_automation.push_back (control_ui);
 
-	} else if (!is_input) {
+	} else {
 
 		control_ui->display = manage (new EventBox);
 		control_ui->display->set_name ("ParameterValueDisplay");
@@ -751,54 +869,64 @@ GenericPluginUI::build_control_ui (const Evoral::Parameter&             param,
 
 		control_ui->display->show_all ();
 
-		/* set up a meter */
-		/* TODO: only make a meter if the port is Hinted for it */
-
-		MeterInfo * info = new MeterInfo();
- 		control_ui->meterinfo = info;
-
-		info->meter = new FastMeter (
-				5, 5, FastMeter::Vertical, 0,
-				0x0000aaff,
-				0x008800ff, 0x008800ff,
-				0x00ff00ff, 0x00ff00ff,
-				0xcccc00ff, 0xcccc00ff,
-				0xffaa00ff, 0xffaa00ff,
-				0xff0000ff,
-				UIConfiguration::instance().color ("meter background bottom"),
-				UIConfiguration::instance().color ("meter background top")
-				);
+		control_ui->vbox = manage (new VBox);
+		control_ui->vbox->set_spacing(3);
 
-		info->min_unbound = desc.min_unbound;
-		info->max_unbound = desc.max_unbound;
+		if (desc.integer_step || desc.enumeration) {
+			control_ui->vbox->pack_end (*control_ui->display, false, false);
+			control_ui->vbox->pack_end (control_ui->label, false, false);
+		} else {
+			/* set up a meter for float ports */
 
-		info->min = desc.lower;
-		info->max = desc.upper;
+			MeterInfo * info = new MeterInfo();
+			control_ui->meterinfo = info;
 
-		control_ui->vbox = manage (new VBox);
-		control_ui->hbox = manage (new HBox);
+			info->meter = new FastMeter (
+					5, 5, FastMeter::Vertical, 0,
+					0x0000aaff,
+					0x008800ff, 0x008800ff,
+					0x00ff00ff, 0x00ff00ff,
+					0xcccc00ff, 0xcccc00ff,
+					0xffaa00ff, 0xffaa00ff,
+					0xff0000ff,
+					UIConfiguration::instance().color ("meter background bottom"),
+					UIConfiguration::instance().color ("meter background top")
+					);
 
-		control_ui->hbox->set_spacing(1);
-		control_ui->vbox->set_spacing(3);
+			info->min_unbound = desc.min_unbound;
+			info->max_unbound = desc.max_unbound;
 
-		control_ui->label.set_angle(90);
-		control_ui->hbox->pack_start (control_ui->label, false, false);
- 		control_ui->hbox->pack_start (*info->meter, false, false);
+			info->min = desc.lower;
+			info->max = desc.upper;
 
- 		control_ui->vbox->pack_start (*control_ui->hbox, false, false);
+			control_ui->label.set_angle(90);
 
- 		control_ui->vbox->pack_start (*control_ui->display, false, false);
+			HBox* center =  manage (new HBox);
+			center->set_spacing(1);
+			center->pack_start (control_ui->label, false, false);
+			center->pack_start (*info->meter, false, false);
 
-		control_ui->pack_start (*control_ui->vbox);
+			control_ui->hbox = manage (new HBox);
+			control_ui->hbox->pack_start (*center, true, false);
+
+			// horizontally center this hbox in the vbox
+			control_ui->vbox->pack_start (*control_ui->hbox, false, false);
 
-		control_ui->meterinfo->meter->show_all();
-		control_ui->meterinfo->packed = true;
+			control_ui->meterinfo->meter->show_all();
+			control_ui->meterinfo->packed = true;
+			control_ui->vbox->pack_start (*control_ui->display, false, false);
+		}
+
+		control_ui->pack_start (*control_ui->vbox);
 
 		output_controls.push_back (control_ui);
 	}
 
 	if (mcontrol) {
-		mcontrol->Changed.connect (control_connections, invalidator (*this), boost::bind (&GenericPluginUI::ui_parameter_changed, this, control_ui), gui_context());
+		mcontrol->Changed.connect(control_connections, invalidator(*this),
+		                          boost::bind(&GenericPluginUI::ui_parameter_changed,
+		                                      this, control_ui),
+		                          gui_context());
 	}
 
 	return control_ui;
@@ -812,6 +940,7 @@ GenericPluginUI::astate_clicked (ControlUI* cui)
 	if (automation_menu == 0) {
 		automation_menu = manage (new Menu);
 		automation_menu->set_name ("ArdourContextMenu");
+		automation_menu->set_reserve_toggle_size(false);
 	}
 
 	MenuList& items (automation_menu->items());
@@ -826,7 +955,9 @@ GenericPluginUI::astate_clicked (ControlUI* cui)
 	items.push_back (MenuElem (_("Touch"),
 				   sigc::bind (sigc::mem_fun(*this, &GenericPluginUI::set_automation_state), (AutoState) Touch, cui)));
 
-	automation_menu->popup (1, gtk_get_current_event_time());
+	automation_menu->popup (
+		boost::bind (&Gtkmm2ext::position_menu_anchored, automation_menu, &cui->automate_button, "", _1, _2, _3),
+		1, gtk_get_current_event_time());
 }
 
 void
@@ -846,22 +977,6 @@ GenericPluginUI::set_automation_state (AutoState state, ControlUI* cui)
 }
 
 void
-GenericPluginUI::toggle_parameter_changed (ControlUI* cui)
-{
-	float val = cui->control->get_value();
-
-	if (!cui->ignore_change) {
-		if (val > 0.5) {
-			cui->button->set_active (true);
-			cui->button->set_name ("PluginEditorButton-active");
-		} else {
-			cui->button->set_active (false);
-			cui->button->set_name ("PluginEditorButton");
-		}
-	}
-}
-
-void
 GenericPluginUI::ui_parameter_changed (ControlUI* cui)
 {
 	if (!cui->update_pending) {
@@ -879,22 +994,17 @@ GenericPluginUI::update_control_display (ControlUI* cui)
 
 	float val = cui->control->get_value();
 
-	cui->ignore_change++;
+	PBD::Unwinder<bool> (cui->ignore_change, true);
 
 	if (cui->combo && cui->scale_points) {
 		for (ARDOUR::ScalePoints::iterator it = cui->scale_points->begin(); it != cui->scale_points->end(); ++it) {
 			if (it->second == val) {
-				cui->combo->set_active_text(it->first);
+				cui->combo->set_text(it->first);
 				break;
 			}
 		}
 	} else if (cui->button) {
-
-		if (val > 0.5) {
-			cui->button->set_active (true);
-		} else {
-			cui->button->set_active (false);
-		}
+		// AutomationController handles this
 	}
 
 	if( cui->controller ) {
@@ -910,29 +1020,25 @@ GenericPluginUI::update_control_display (ControlUI* cui)
 			cui->adjustment->set_value (val);
 		}
 	}*/
-	cui->ignore_change--;
 }
 
 void
-GenericPluginUI::control_port_toggled (ControlUI* cui)
+GenericPluginUI::update_input_displays ()
 {
-	cui->ignore_change++;
-	const bool active = cui->button->get_active();
-	if (active) {
-		cui->button->set_name ("PluginEditorButton-active");
-	} else {
-		cui->button->set_name ("PluginEditorButton");
+	/* XXX This is a workaround for AutomationControl not knowing about preset loads */
+	for (vector<ControlUI*>::iterator i = input_controls.begin();
+	     i != input_controls.end();
+	     ++i) {
+		update_control_display(*i);
 	}
-	insert->automation_control (cui->parameter())->set_value (active, Controllable::NoGroup);
-	cui->ignore_change--;
+	return;
 }
 
 void
-GenericPluginUI::control_combo_changed (ControlUI* cui)
+GenericPluginUI::control_combo_changed (ControlUI* cui, float value)
 {
-	if (!cui->ignore_change && cui->scale_points) {
-		string value = cui->combo->get_active_text();
-		insert->automation_control (cui->parameter())->set_value ((*cui->scale_points)[value], Controllable::NoGroup);
+	if (!cui->ignore_change) {
+		insert->automation_control (cui->parameter())->set_value (value, Controllable::NoGroup);
 	}
 }
 
@@ -949,14 +1055,9 @@ GenericPluginUI::start_updating (GdkEventAny*)
 bool
 GenericPluginUI::stop_updating (GdkEventAny*)
 {
-	for (vector<ControlUI*>::iterator i = input_controls.begin(); i != input_controls.end(); ++i) {
-		(*i)->controller->stop_updating ();
-	}
-
 	if (output_controls.size() > 0 ) {
 		screen_update_connection.disconnect();
 	}
-
 	return false;
 }
 
@@ -995,17 +1096,17 @@ GenericPluginUI::output_update ()
 }
 
 void
-GenericPluginUI::set_property (const ParameterDescriptor& desc,
-                               Gtk::FileChooserButton*    widget)
+GenericPluginUI::set_path_property (const ParameterDescriptor& desc,
+                                    Gtk::FileChooserButton*    widget)
 {
 	plugin->set_property(desc.key, Variant(Variant::PATH, widget->get_filename()));
 }
 
 void
-GenericPluginUI::property_changed (uint32_t key, const Variant& value)
+GenericPluginUI::path_property_changed (uint32_t key, const Variant& value)
 {
-	PropertyControls::iterator c = _property_controls.find(key);
-	if (c != _property_controls.end()) {
+	FilePathControls::iterator c = _filepath_controls.find(key);
+	if (c != _filepath_controls.end()) {
 		c->second->set_filename(value.get_path());
 	} else {
 		std::cerr << "warning: property change for property with no control" << std::endl;
diff --git a/gtk2_ardour/ghostregion.cc b/gtk2_ardour/ghostregion.cc
index 127ab64..ef0e020 100644
--- a/gtk2_ardour/ghostregion.cc
+++ b/gtk2_ardour/ghostregion.cc
@@ -267,8 +267,10 @@ MidiGhostRegion::set_colors()
 	GhostRegion::set_colors();
 
 	for (EventList::iterator it = events.begin(); it != events.end(); ++it) {
-		(*it)->item->set_fill_color (UIConfiguration::instance().color_mod((*it)->event->base_color(), "ghost track midi fill"));
-		(*it)->item->set_outline_color (UIConfiguration::instance().color ("ghost track midi outline"));
+		_fill = UIConfiguration::instance().color_mod((*it)->event->base_color(), "ghost track midi fill");
+		_outline = UIConfiguration::instance().color ("ghost track midi outline");
+		(*it)->item->set_fill_color (_fill);
+		(*it)->item->set_outline_color (_outline);
 	}
 }
 
@@ -331,8 +333,8 @@ MidiGhostRegion::add_note (NoteBase* n)
 	GhostEvent* event = new GhostEvent (n, group);
 	events.push_back (event);
 
-	event->item->set_fill_color (UIConfiguration::instance().color_mod(n->base_color(), "ghost track midi fill"));
-	event->item->set_outline_color (UIConfiguration::instance().color ("ghost track midi outline"));
+	event->item->set_fill_color (_fill);
+	event->item->set_outline_color (_outline);
 
 	MidiStreamView* mv = midi_view();
 
@@ -347,8 +349,7 @@ MidiGhostRegion::add_note (NoteBase* n)
 			ArdourCanvas::Rectangle* rect = NULL;
 			ArdourCanvas::Polygon*   poly = NULL;
 			if ((rect = dynamic_cast<ArdourCanvas::Rectangle*>(event->item))) {
-				rect->set_y0 (y);
-				rect->set_y1 (y + h);
+				rect->set (ArdourCanvas::Rect (rect->x0(), y, rect->x1(), y + h));
 			} else if ((poly = dynamic_cast<ArdourCanvas::Polygon*>(event->item))) {
 				Duple position = poly->position();
 				position.y = y;
@@ -387,10 +388,7 @@ MidiGhostRegion::update_note (NoteBase* parent)
 	ArdourCanvas::Polygon*   poly = NULL;
 	if ((note = dynamic_cast<Note*>(parent))) {
 		if ((rect = dynamic_cast<ArdourCanvas::Rectangle*>(ev->item))) {
-			double const x1 = parent->x0 ();
-			double const x2 = parent->x1 ();
-			rect->set_x0 (x1);
-			rect->set_x1 (x2);
+			rect->set (ArdourCanvas::Rect (parent->x0(), rect->y0(), parent->x1(), rect->y1()));
 		}
 	} else if ((hit = dynamic_cast<Hit*>(parent))) {
 		if ((poly = dynamic_cast<ArdourCanvas::Polygon*>(ev->item))) {
diff --git a/gtk2_ardour/ghostregion.h b/gtk2_ardour/ghostregion.h
index 8a4a828..152d34a 100644
--- a/gtk2_ardour/ghostregion.h
+++ b/gtk2_ardour/ghostregion.h
@@ -115,6 +115,8 @@ public:
 	void clear_events();
 
 private:
+	ArdourCanvas::Color _fill;
+	ArdourCanvas::Color _outline;
 
 	MidiGhostRegion::GhostEvent* find_event (NoteBase*);
 
diff --git a/gtk2_ardour/glade/new_session_dialog.glade b/gtk2_ardour/glade/new_session_dialog.glade
deleted file mode 100644
index 5ecee3b..0000000
--- a/gtk2_ardour/glade/new_session_dialog.glade
+++ /dev/null
@@ -1,1026 +0,0 @@
-<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
-<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd">
-
-<glade-interface>
-
-<widget class="GtkDialog" id="NewSessionDialog">
-  <property name="title">Create New Session</property>
-  <property name="type">GTK_WINDOW_TOPLEVEL</property>
-  <property name="window_position">GTK_WIN_POS_NONE</property>
-  <property name="modal">False</property>
-  <property name="resizable">True</property>
-  <property name="destroy_with_parent">False</property>
-  <property name="decorated">True</property>
-  <property name="skip_taskbar_hint">False</property>
-  <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
-  <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
-  <property name="focus_on_map">True</property>
-  <property name="urgency_hint">False</property>
-  <property name="has_separator">True</property>
-
-  <child internal-child="vbox">
-    <widget class="GtkVBox" id="vbox2">
-      <property name="homogeneous">False</property>
-      <property name="spacing">0</property>
-
-      <child internal-child="action_area">
-	<widget class="GtkHButtonBox" id="hbuttonbox2">
-	  <property name="layout_style">GTK_BUTTONBOX_DEFAULT_STYLE</property>
-
-	  <child>
-	    <widget class="GtkButton" id="QuitButton">
-	      <property name="visible">True</property>
-	      <property name="can_default">True</property>
-	      <property name="can_focus">True</property>
-	      <property name="label">gtk-quit</property>
-	      <property name="use_stock">True</property>
-	      <property name="relief">GTK_RELIEF_NORMAL</property>
-	      <property name="focus_on_click">True</property>
-	      <property name="response_id">-6</property>
-	    </widget>
-	  </child>
-
-	  <child>
-	    <widget class="GtkButton" id="ClearButton">
-	      <property name="visible">True</property>
-	      <property name="can_default">True</property>
-	      <property name="can_focus">True</property>
-	      <property name="label">gtk-clear</property>
-	      <property name="use_stock">True</property>
-	      <property name="relief">GTK_RELIEF_NORMAL</property>
-	      <property name="focus_on_click">True</property>
-	      <property name="response_id">0</property>
-	    </widget>
-	  </child>
-
-	  <child>
-	    <widget class="GtkButton" id="OkButton">
-	      <property name="visible">True</property>
-	      <property name="label">gtk-new</property>
-	      <property name="use_stock">True</property>
-	      <property name="relief">GTK_RELIEF_NORMAL</property>
-	      <property name="focus_on_click">True</property>
-	      <property name="response_id">-5</property>
-	    </widget>
-	  </child>
-	</widget>
-	<packing>
-	  <property name="padding">0</property>
-	  <property name="expand">False</property>
-	  <property name="fill">True</property>
-	  <property name="pack_type">GTK_PACK_END</property>
-	</packing>
-      </child>
-
-      <child>
-	<widget class="GtkNotebook" id="TheNotebook">
-	  <property name="visible">True</property>
-	  <property name="can_focus">True</property>
-	  <property name="show_tabs">True</property>
-	  <property name="show_border">True</property>
-	  <property name="tab_pos">GTK_POS_TOP</property>
-	  <property name="scrollable">False</property>
-	  <property name="enable_popup">False</property>
-
-	  <child>
-	    <widget class="GtkTable" id="table1">
-	      <property name="border_width">5</property>
-	      <property name="n_rows">4</property>
-	      <property name="n_columns">2</property>
-	      <property name="homogeneous">False</property>
-	      <property name="row_spacing">1</property>
-	      <property name="column_spacing">1</property>
-
-	      <child>
-		<widget class="GtkLabel" id="label2">
-		  <property name="label">Session Name</property>
-		  <property name="use_underline">False</property>
-		  <property name="use_markup">False</property>
-		  <property name="justify">GTK_JUSTIFY_LEFT</property>
-		  <property name="wrap">False</property>
-		  <property name="selectable">False</property>
-		  <property name="xalign">0.5</property>
-		  <property name="yalign">0.5</property>
-		  <property name="xpad">0</property>
-		  <property name="ypad">0</property>
-		  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
-		  <property name="width_chars">-1</property>
-		  <property name="single_line_mode">False</property>
-		  <property name="angle">0</property>
-		</widget>
-		<packing>
-		  <property name="left_attach">0</property>
-		  <property name="right_attach">1</property>
-		  <property name="top_attach">0</property>
-		  <property name="bottom_attach">1</property>
-		</packing>
-	      </child>
-
-	      <child>
-		<widget class="GtkEntry" id="SessionNameEntry">
-		  <property name="editable">True</property>
-		  <property name="visibility">True</property>
-		  <property name="max_length">0</property>
-		  <property name="text" translatable="yes"></property>
-		  <property name="has_frame">True</property>
-		  <property name="invisible_char">*</property>
-		  <property name="activates_default">False</property>
-		</widget>
-		<packing>
-		  <property name="left_attach">1</property>
-		  <property name="right_attach">2</property>
-		  <property name="top_attach">0</property>
-		  <property name="bottom_attach">1</property>
-		</packing>
-	      </child>
-
-	      <child>
-		<widget class="GtkLabel" id="label3">
-		  <property name="label">Session Location</property>
-		  <property name="use_underline">False</property>
-		  <property name="use_markup">False</property>
-		  <property name="justify">GTK_JUSTIFY_LEFT</property>
-		  <property name="wrap">False</property>
-		  <property name="selectable">False</property>
-		  <property name="xalign">0.5</property>
-		  <property name="yalign">0.5</property>
-		  <property name="xpad">0</property>
-		  <property name="ypad">0</property>
-		  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
-		  <property name="width_chars">-1</property>
-		  <property name="single_line_mode">False</property>
-		  <property name="angle">0</property>
-		</widget>
-		<packing>
-		  <property name="left_attach">0</property>
-		  <property name="right_attach">1</property>
-		  <property name="top_attach">1</property>
-		  <property name="bottom_attach">2</property>
-		</packing>
-	      </child>
-
-	      <child>
-		<widget class="GtkFileChooserButton" id="SessionFolderChooser">
-		  <property name="title">Select A Folder</property>
-		  <property name="action">GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER</property>
-		  <property name="local_only">True</property>
-		  <property name="show_hidden">False</property>
-		  <property name="do_overwrite_confirmation">False</property>
-		  <property name="width_chars">-1</property>
-		</widget>
-		<packing>
-		  <property name="left_attach">1</property>
-		  <property name="right_attach">2</property>
-		  <property name="top_attach">1</property>
-		  <property name="bottom_attach">2</property>
-		</packing>
-	      </child>
-
-	      <child>
-		<widget class="GtkLabel" id="label4">
-		  <property name="label">Session Template</property>
-		  <property name="use_underline">False</property>
-		  <property name="use_markup">False</property>
-		  <property name="justify">GTK_JUSTIFY_LEFT</property>
-		  <property name="wrap">False</property>
-		  <property name="selectable">False</property>
-		  <property name="xalign">0.5</property>
-		  <property name="yalign">0.5</property>
-		  <property name="xpad">0</property>
-		  <property name="ypad">0</property>
-		  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
-		  <property name="width_chars">-1</property>
-		  <property name="single_line_mode">False</property>
-		  <property name="angle">0</property>
-		</widget>
-		<packing>
-		  <property name="left_attach">0</property>
-		  <property name="right_attach">1</property>
-		  <property name="top_attach">2</property>
-		  <property name="bottom_attach">3</property>
-		</packing>
-	      </child>
-
-	      <child>
-		<widget class="GtkFileChooserButton" id="SessionTemplateChooser">
-		  <property name="title" translatable="yes">Select a File</property>
-		  <property name="action">GTK_FILE_CHOOSER_ACTION_OPEN</property>
-		  <property name="local_only">True</property>
-		  <property name="show_hidden">False</property>
-		  <property name="do_overwrite_confirmation">False</property>
-		  <property name="width_chars">-1</property>
-		</widget>
-		<packing>
-		  <property name="left_attach">1</property>
-		  <property name="right_attach">2</property>
-		  <property name="top_attach">2</property>
-		  <property name="bottom_attach">3</property>
-		</packing>
-	      </child>
-
-	      <child>
-		<widget class="GtkExpander" id="expander1">
-		  <property name="border_width">10</property>
-		  <property name="visible">True</property>
-		  <property name="can_focus">True</property>
-		  <property name="expanded">True</property>
-		  <property name="spacing">0</property>
-
-		  <child>
-		    <widget class="GtkVBox" id="vbox7">
-		      <property name="visible">True</property>
-		      <property name="homogeneous">False</property>
-		      <property name="spacing">0</property>
-
-		      <child>
-			<widget class="GtkTable" id="table4">
-			  <property name="visible">True</property>
-			  <property name="n_rows">3</property>
-			  <property name="n_columns">2</property>
-			  <property name="homogeneous">True</property>
-			  <property name="row_spacing">0</property>
-			  <property name="column_spacing">0</property>
-
-			  <child>
-			    <widget class="GtkLabel" id="label19">
-			      <property name="visible">True</property>
-			      <property name="label" translatable="yes">Channel Count</property>
-			      <property name="use_underline">False</property>
-			      <property name="use_markup">False</property>
-			      <property name="justify">GTK_JUSTIFY_LEFT</property>
-			      <property name="wrap">False</property>
-			      <property name="selectable">False</property>
-			      <property name="xalign">0</property>
-			      <property name="yalign">0.5</property>
-			      <property name="xpad">0</property>
-			      <property name="ypad">0</property>
-			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
-			      <property name="width_chars">-1</property>
-			      <property name="single_line_mode">False</property>
-			      <property name="angle">0</property>
-			    </widget>
-			    <packing>
-			      <property name="left_attach">1</property>
-			      <property name="right_attach">2</property>
-			      <property name="top_attach">0</property>
-			      <property name="bottom_attach">1</property>
-			      <property name="x_options"></property>
-			      <property name="y_options"></property>
-			    </packing>
-			  </child>
-
-			  <child>
-			    <widget class="GtkCheckButton" id="CreateControlBus">
-			      <property name="visible">True</property>
-			      <property name="can_focus">True</property>
-			      <property name="label" translatable="yes">Create Control Bus</property>
-			      <property name="use_underline">True</property>
-			      <property name="relief">GTK_RELIEF_NORMAL</property>
-			      <property name="focus_on_click">True</property>
-			      <property name="active">False</property>
-			      <property name="inconsistent">False</property>
-			      <property name="draw_indicator">True</property>
-			    </widget>
-			    <packing>
-			      <property name="left_attach">0</property>
-			      <property name="right_attach">1</property>
-			      <property name="top_attach">2</property>
-			      <property name="bottom_attach">3</property>
-			      <property name="x_options">fill</property>
-			      <property name="y_options"></property>
-			    </packing>
-			  </child>
-
-			  <child>
-			    <widget class="GtkSpinButton" id="ControlChannelCount">
-			      <property name="visible">True</property>
-			      <property name="can_focus">True</property>
-			      <property name="climb_rate">1</property>
-			      <property name="digits">0</property>
-			      <property name="numeric">True</property>
-			      <property name="update_policy">GTK_UPDATE_ALWAYS</property>
-			      <property name="snap_to_ticks">False</property>
-			      <property name="wrap">False</property>
-			      <property name="adjustment">2 0 100 1 10 10</property>
-			    </widget>
-			    <packing>
-			      <property name="left_attach">1</property>
-			      <property name="right_attach">2</property>
-			      <property name="top_attach">2</property>
-			      <property name="bottom_attach">3</property>
-			      <property name="x_options"></property>
-			      <property name="y_options"></property>
-			    </packing>
-			  </child>
-
-			  <child>
-			    <widget class="GtkSpinButton" id="MasterChannelCount">
-			      <property name="visible">True</property>
-			      <property name="can_focus">True</property>
-			      <property name="climb_rate">1</property>
-			      <property name="digits">0</property>
-			      <property name="numeric">True</property>
-			      <property name="update_policy">GTK_UPDATE_ALWAYS</property>
-			      <property name="snap_to_ticks">False</property>
-			      <property name="wrap">False</property>
-			      <property name="adjustment">2 0 100 1 10 10</property>
-			    </widget>
-			    <packing>
-			      <property name="left_attach">1</property>
-			      <property name="right_attach">2</property>
-			      <property name="top_attach">1</property>
-			      <property name="bottom_attach">2</property>
-			      <property name="x_options"></property>
-			      <property name="y_options"></property>
-			    </packing>
-			  </child>
-
-			  <child>
-			    <widget class="GtkCheckButton" id="CreateMasterBus">
-			      <property name="visible">True</property>
-			      <property name="can_focus">True</property>
-			      <property name="label" translatable="yes">Create Master Bus</property>
-			      <property name="use_underline">True</property>
-			      <property name="relief">GTK_RELIEF_NORMAL</property>
-			      <property name="focus_on_click">True</property>
-			      <property name="active">True</property>
-			      <property name="inconsistent">False</property>
-			      <property name="draw_indicator">True</property>
-			    </widget>
-			    <packing>
-			      <property name="left_attach">0</property>
-			      <property name="right_attach">1</property>
-			      <property name="top_attach">1</property>
-			      <property name="bottom_attach">2</property>
-			      <property name="x_options">fill</property>
-			      <property name="y_options"></property>
-			    </packing>
-			  </child>
-			</widget>
-			<packing>
-			  <property name="padding">0</property>
-			  <property name="expand">False</property>
-			  <property name="fill">False</property>
-			</packing>
-		      </child>
-
-		      <child>
-			<widget class="GtkLabel" id="label16">
-			  <property name="visible">True</property>
-			  <property name="label" translatable="yes">Track/Bus connection options</property>
-			  <property name="use_underline">False</property>
-			  <property name="use_markup">False</property>
-			  <property name="justify">GTK_JUSTIFY_LEFT</property>
-			  <property name="wrap">False</property>
-			  <property name="selectable">False</property>
-			  <property name="xalign">0.5</property>
-			  <property name="yalign">0.5</property>
-			  <property name="xpad">0</property>
-			  <property name="ypad">0</property>
-			  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
-			  <property name="width_chars">-1</property>
-			  <property name="single_line_mode">False</property>
-			  <property name="angle">0</property>
-			</widget>
-			<packing>
-			  <property name="padding">14</property>
-			  <property name="expand">False</property>
-			  <property name="fill">False</property>
-			</packing>
-		      </child>
-
-		      <child>
-			<widget class="GtkFrame" id="frame4">
-			  <property name="visible">True</property>
-			  <property name="label_xalign">0</property>
-			  <property name="label_yalign">0.5</property>
-			  <property name="shadow_type">GTK_SHADOW_NONE</property>
-
-			  <child>
-			    <widget class="GtkAlignment" id="alignment4">
-			      <property name="visible">True</property>
-			      <property name="xalign">0.5</property>
-			      <property name="yalign">0.5</property>
-			      <property name="xscale">1</property>
-			      <property name="yscale">1</property>
-			      <property name="top_padding">0</property>
-			      <property name="bottom_padding">0</property>
-			      <property name="left_padding">12</property>
-			      <property name="right_padding">0</property>
-
-			      <child>
-				<widget class="GtkTable" id="table3">
-				  <property name="visible">True</property>
-				  <property name="n_rows">1</property>
-				  <property name="n_columns">1</property>
-				  <property name="homogeneous">False</property>
-				  <property name="row_spacing">0</property>
-				  <property name="column_spacing">0</property>
-
-				  <child>
-				    <widget class="GtkHBox" id="hbox1">
-				      <property name="visible">True</property>
-				      <property name="homogeneous">False</property>
-				      <property name="spacing">0</property>
-
-				      <child>
-					<widget class="GtkCheckButton" id="ConnectInputs">
-					  <property name="visible">True</property>
-					  <property name="can_focus">True</property>
-					  <property name="label" translatable="yes">Automatically connect inputs</property>
-					  <property name="use_underline">True</property>
-					  <property name="relief">GTK_RELIEF_NORMAL</property>
-					  <property name="focus_on_click">True</property>
-					  <property name="active">False</property>
-					  <property name="inconsistent">False</property>
-					  <property name="draw_indicator">True</property>
-					</widget>
-					<packing>
-					  <property name="padding">0</property>
-					  <property name="expand">False</property>
-					  <property name="fill">False</property>
-					</packing>
-				      </child>
-
-				      <child>
-					<widget class="GtkHBox" id="hbox2">
-					  <property name="visible">True</property>
-					  <property name="homogeneous">False</property>
-					  <property name="spacing">0</property>
-
-					  <child>
-					    <widget class="GtkCheckButton" id="LimitInputPorts">
-					      <property name="visible">True</property>
-					      <property name="can_focus">True</property>
-					      <property name="label" translatable="yes">Port limit</property>
-					      <property name="use_underline">True</property>
-					      <property name="relief">GTK_RELIEF_NORMAL</property>
-					      <property name="focus_on_click">True</property>
-					      <property name="active">False</property>
-					      <property name="inconsistent">False</property>
-					      <property name="draw_indicator">True</property>
-					    </widget>
-					    <packing>
-					      <property name="padding">0</property>
-					      <property name="expand">False</property>
-					      <property name="fill">False</property>
-					    </packing>
-					  </child>
-
-					  <child>
-					    <widget class="GtkSpinButton" id="InputLimitCount">
-					      <property name="visible">True</property>
-					      <property name="can_focus">True</property>
-					      <property name="climb_rate">1</property>
-					      <property name="digits">0</property>
-					      <property name="numeric">True</property>
-					      <property name="update_policy">GTK_UPDATE_ALWAYS</property>
-					      <property name="snap_to_ticks">False</property>
-					      <property name="wrap">False</property>
-					      <property name="adjustment">1 0 100 1 10 10</property>
-					    </widget>
-					    <packing>
-					      <property name="padding">0</property>
-					      <property name="expand">True</property>
-					      <property name="fill">True</property>
-					    </packing>
-					  </child>
-					</widget>
-					<packing>
-					  <property name="padding">0</property>
-					  <property name="expand">True</property>
-					  <property name="fill">False</property>
-					</packing>
-				      </child>
-				    </widget>
-				    <packing>
-				      <property name="left_attach">0</property>
-				      <property name="right_attach">1</property>
-				      <property name="top_attach">0</property>
-				      <property name="bottom_attach">1</property>
-				    </packing>
-				  </child>
-				</widget>
-			      </child>
-			    </widget>
-			  </child>
-
-			  <child>
-			    <widget class="GtkLabel" id="label14">
-			      <property name="visible">True</property>
-			      <property name="label" translatable="yes"><b>Input</b></property>
-			      <property name="use_underline">False</property>
-			      <property name="use_markup">True</property>
-			      <property name="justify">GTK_JUSTIFY_LEFT</property>
-			      <property name="wrap">False</property>
-			      <property name="selectable">False</property>
-			      <property name="xalign">0.5</property>
-			      <property name="yalign">0.5</property>
-			      <property name="xpad">0</property>
-			      <property name="ypad">0</property>
-			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
-			      <property name="width_chars">-1</property>
-			      <property name="single_line_mode">False</property>
-			      <property name="angle">0</property>
-			    </widget>
-			    <packing>
-			      <property name="type">label_item</property>
-			    </packing>
-			  </child>
-			</widget>
-			<packing>
-			  <property name="padding">0</property>
-			  <property name="expand">True</property>
-			  <property name="fill">True</property>
-			</packing>
-		      </child>
-
-		      <child>
-			<widget class="GtkFrame" id="frame5">
-			  <property name="visible">True</property>
-			  <property name="label_xalign">0</property>
-			  <property name="label_yalign">0.5</property>
-			  <property name="shadow_type">GTK_SHADOW_NONE</property>
-
-			  <child>
-			    <widget class="GtkAlignment" id="alignment5">
-			      <property name="visible">True</property>
-			      <property name="xalign">0.5</property>
-			      <property name="yalign">0.5</property>
-			      <property name="xscale">1</property>
-			      <property name="yscale">1</property>
-			      <property name="top_padding">0</property>
-			      <property name="bottom_padding">0</property>
-			      <property name="left_padding">12</property>
-			      <property name="right_padding">0</property>
-
-			      <child>
-				<widget class="GtkVBox" id="vbox8">
-				  <property name="visible">True</property>
-				  <property name="homogeneous">False</property>
-				  <property name="spacing">0</property>
-
-				  <child>
-				    <widget class="GtkHBox" id="hbox3">
-				      <property name="visible">True</property>
-				      <property name="homogeneous">False</property>
-				      <property name="spacing">0</property>
-
-				      <child>
-					<widget class="GtkCheckButton" id="ConnectOutputs">
-					  <property name="visible">True</property>
-					  <property name="can_focus">True</property>
-					  <property name="label" translatable="yes">Automatically connect outputs</property>
-					  <property name="use_underline">True</property>
-					  <property name="relief">GTK_RELIEF_NORMAL</property>
-					  <property name="focus_on_click">True</property>
-					  <property name="active">False</property>
-					  <property name="inconsistent">False</property>
-					  <property name="draw_indicator">True</property>
-					</widget>
-					<packing>
-					  <property name="padding">0</property>
-					  <property name="expand">False</property>
-					  <property name="fill">False</property>
-					</packing>
-				      </child>
-
-				      <child>
-					<widget class="GtkHBox" id="hbox4">
-					  <property name="visible">True</property>
-					  <property name="homogeneous">False</property>
-					  <property name="spacing">0</property>
-
-					  <child>
-					    <widget class="GtkCheckButton" id="LimitOutputPorts">
-					      <property name="visible">True</property>
-					      <property name="can_focus">True</property>
-					      <property name="label" translatable="yes">Port limit</property>
-					      <property name="use_underline">True</property>
-					      <property name="relief">GTK_RELIEF_NORMAL</property>
-					      <property name="focus_on_click">True</property>
-					      <property name="active">False</property>
-					      <property name="inconsistent">False</property>
-					      <property name="draw_indicator">True</property>
-					    </widget>
-					    <packing>
-					      <property name="padding">0</property>
-					      <property name="expand">False</property>
-					      <property name="fill">False</property>
-					    </packing>
-					  </child>
-
-					  <child>
-					    <widget class="GtkSpinButton" id="OutputLimitCount">
-					      <property name="visible">True</property>
-					      <property name="can_focus">True</property>
-					      <property name="climb_rate">1</property>
-					      <property name="digits">0</property>
-					      <property name="numeric">False</property>
-					      <property name="update_policy">GTK_UPDATE_ALWAYS</property>
-					      <property name="snap_to_ticks">False</property>
-					      <property name="wrap">False</property>
-					      <property name="adjustment">1 0 100 1 10 10</property>
-					    </widget>
-					    <packing>
-					      <property name="padding">0</property>
-					      <property name="expand">True</property>
-					      <property name="fill">True</property>
-					    </packing>
-					  </child>
-					</widget>
-					<packing>
-					  <property name="padding">0</property>
-					  <property name="expand">True</property>
-					  <property name="fill">False</property>
-					</packing>
-				      </child>
-				    </widget>
-				    <packing>
-				      <property name="padding">0</property>
-				      <property name="expand">True</property>
-				      <property name="fill">True</property>
-				    </packing>
-				  </child>
-
-				  <child>
-				    <widget class="GtkVBox" id="vbox9">
-				      <property name="visible">True</property>
-				      <property name="homogeneous">False</property>
-				      <property name="spacing">0</property>
-
-				      <child>
-					<widget class="GtkRadioButton" id="ConnectOutsToMaster">
-					  <property name="visible">True</property>
-					  <property name="can_focus">True</property>
-					  <property name="label" translatable="yes">Connect to Master Bus</property>
-					  <property name="use_underline">True</property>
-					  <property name="relief">GTK_RELIEF_NORMAL</property>
-					  <property name="focus_on_click">True</property>
-					  <property name="active">False</property>
-					  <property name="inconsistent">False</property>
-					  <property name="draw_indicator">True</property>
-					</widget>
-					<packing>
-					  <property name="padding">0</property>
-					  <property name="expand">False</property>
-					  <property name="fill">False</property>
-					</packing>
-				      </child>
-
-				      <child>
-					<widget class="GtkRadioButton" id="ConnectOutsToPhysical">
-					  <property name="visible">True</property>
-					  <property name="can_focus">True</property>
-					  <property name="label" translatable="yes">Connect to physical outputs</property>
-					  <property name="use_underline">True</property>
-					  <property name="relief">GTK_RELIEF_NORMAL</property>
-					  <property name="focus_on_click">True</property>
-					  <property name="active">False</property>
-					  <property name="inconsistent">False</property>
-					  <property name="draw_indicator">True</property>
-					  <property name="group">ConnectOutsToMaster</property>
-					</widget>
-					<packing>
-					  <property name="padding">0</property>
-					  <property name="expand">False</property>
-					  <property name="fill">False</property>
-					</packing>
-				      </child>
-				    </widget>
-				    <packing>
-				      <property name="padding">0</property>
-				      <property name="expand">True</property>
-				      <property name="fill">True</property>
-				    </packing>
-				  </child>
-				</widget>
-			      </child>
-			    </widget>
-			  </child>
-
-			  <child>
-			    <widget class="GtkLabel" id="label15">
-			      <property name="visible">True</property>
-			      <property name="label" translatable="yes"><b>Output</b></property>
-			      <property name="use_underline">False</property>
-			      <property name="use_markup">True</property>
-			      <property name="justify">GTK_JUSTIFY_LEFT</property>
-			      <property name="wrap">False</property>
-			      <property name="selectable">False</property>
-			      <property name="xalign">0.5</property>
-			      <property name="yalign">0.5</property>
-			      <property name="xpad">0</property>
-			      <property name="ypad">0</property>
-			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
-			      <property name="width_chars">-1</property>
-			      <property name="single_line_mode">False</property>
-			      <property name="angle">0</property>
-			    </widget>
-			    <packing>
-			      <property name="type">label_item</property>
-			    </packing>
-			  </child>
-			</widget>
-			<packing>
-			  <property name="padding">0</property>
-			  <property name="expand">True</property>
-			  <property name="fill">True</property>
-			</packing>
-		      </child>
-		    </widget>
-		  </child>
-
-		  <child>
-		    <widget class="GtkLabel" id="label5">
-		      <property name="visible">True</property>
-		      <property name="label" translatable="yes"><b>Advanced</b></property>
-		      <property name="use_underline">False</property>
-		      <property name="use_markup">True</property>
-		      <property name="justify">GTK_JUSTIFY_LEFT</property>
-		      <property name="wrap">False</property>
-		      <property name="selectable">False</property>
-		      <property name="xalign">0.5</property>
-		      <property name="yalign">0.5</property>
-		      <property name="xpad">0</property>
-		      <property name="ypad">0</property>
-		      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
-		      <property name="width_chars">-1</property>
-		      <property name="single_line_mode">False</property>
-		      <property name="angle">0</property>
-		    </widget>
-		    <packing>
-		      <property name="type">label_item</property>
-		    </packing>
-		  </child>
-		</widget>
-		<packing>
-		  <property name="left_attach">0</property>
-		  <property name="right_attach">2</property>
-		  <property name="top_attach">3</property>
-		  <property name="bottom_attach">4</property>
-		  <property name="x_options">fill</property>
-		</packing>
-	      </child>
-	    </widget>
-	    <packing>
-	      <property name="tab_expand">False</property>
-	      <property name="tab_fill">True</property>
-	    </packing>
-	  </child>
-
-	  <child>
-	    <widget class="GtkLabel" id="label19">
-	      <property name="visible">True</property>
-	      <property name="label" translatable="yes">New Session</property>
-	      <property name="use_underline">False</property>
-	      <property name="use_markup">False</property>
-	      <property name="justify">GTK_JUSTIFY_LEFT</property>
-	      <property name="wrap">False</property>
-	      <property name="selectable">False</property>
-	      <property name="xalign">0.5</property>
-	      <property name="yalign">0.5</property>
-	      <property name="xpad">0</property>
-	      <property name="ypad">0</property>
-	      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
-	      <property name="width_chars">-1</property>
-	      <property name="single_line_mode">False</property>
-	      <property name="angle">0</property>
-	    </widget>
-	    <packing>
-	      <property name="type">tab</property>
-	    </packing>
-	  </child>
-
-	  <child>
-	    <widget class="GtkVBox" id="vbox10">
-	      <property name="visible">True</property>
-	      <property name="homogeneous">False</property>
-	      <property name="spacing">0</property>
-
-	      <child>
-		<widget class="GtkFrame" id="frame7">
-		  <property name="border_width">10</property>
-		  <property name="visible">True</property>
-		  <property name="label_xalign">0</property>
-		  <property name="label_yalign">0.5</property>
-		  <property name="shadow_type">GTK_SHADOW_IN</property>
-
-		  <child>
-		    <widget class="GtkAlignment" id="alignment7">
-		      <property name="visible">True</property>
-		      <property name="xalign">0.5</property>
-		      <property name="yalign">0.5</property>
-		      <property name="xscale">1</property>
-		      <property name="yscale">1</property>
-		      <property name="top_padding">0</property>
-		      <property name="bottom_padding">0</property>
-		      <property name="left_padding">12</property>
-		      <property name="right_padding">0</property>
-
-		      <child>
-			<widget class="GtkHBox" id="hbox5">
-			  <property name="visible">True</property>
-			  <property name="homogeneous">False</property>
-			  <property name="spacing">0</property>
-
-			  <child>
-			    <widget class="GtkLabel" id="label22">
-			      <property name="label">Open Session</property>
-			      <property name="use_underline">False</property>
-			      <property name="use_markup">False</property>
-			      <property name="justify">GTK_JUSTIFY_LEFT</property>
-			      <property name="wrap">False</property>
-			      <property name="selectable">False</property>
-			      <property name="xalign">0.5</property>
-			      <property name="yalign">0.5</property>
-			      <property name="xpad">0</property>
-			      <property name="ypad">0</property>
-			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
-			      <property name="width_chars">-1</property>
-			      <property name="single_line_mode">False</property>
-			      <property name="angle">0</property>
-			    </widget>
-			    <packing>
-			      <property name="padding">0</property>
-			      <property name="expand">False</property>
-			      <property name="fill">True</property>
-			    </packing>
-			  </child>
-
-			  <child>
-			    <placeholder/>
-			  </child>
-
-			  <child>
-			    <widget class="GtkFileChooserButton" id="OpenFilechooserButton">
-			      <property name="title" translatable="yes">Select a Session</property>
-			      <property name="action">GTK_FILE_CHOOSER_ACTION_OPEN</property>
-			      <property name="local_only">True</property>
-			      <property name="show_hidden">False</property>
-			      <property name="do_overwrite_confirmation">False</property>
-			      <property name="width_chars">-1</property>
-			    </widget>
-			    <packing>
-			      <property name="padding">0</property>
-			      <property name="expand">True</property>
-			      <property name="fill">True</property>
-			    </packing>
-			  </child>
-
-			  <child>
-			    <placeholder/>
-			  </child>
-			</widget>
-		      </child>
-		    </widget>
-		  </child>
-
-		  <child>
-		    <widget class="GtkLabel" id="label24">
-		      <property name="visible">True</property>
-		      <property name="label" translatable="yes">Open Session</property>
-		      <property name="use_underline">False</property>
-		      <property name="use_markup">False</property>
-		      <property name="justify">GTK_JUSTIFY_LEFT</property>
-		      <property name="wrap">False</property>
-		      <property name="selectable">False</property>
-		      <property name="xalign">0.5</property>
-		      <property name="yalign">0.5</property>
-		      <property name="xpad">0</property>
-		      <property name="ypad">0</property>
-		      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
-		      <property name="width_chars">-1</property>
-		      <property name="single_line_mode">False</property>
-		      <property name="angle">0</property>
-		    </widget>
-		    <packing>
-		      <property name="type">label_item</property>
-		    </packing>
-		  </child>
-		</widget>
-		<packing>
-		  <property name="padding">0</property>
-		  <property name="expand">False</property>
-		  <property name="fill">False</property>
-		</packing>
-	      </child>
-
-	      <child>
-		<widget class="GtkFrame" id="frame6">
-		  <property name="border_width">10</property>
-		  <property name="visible">True</property>
-		  <property name="label_xalign">0</property>
-		  <property name="label_yalign">0.5</property>
-		  <property name="shadow_type">GTK_SHADOW_IN</property>
-
-		  <child>
-		    <widget class="GtkAlignment" id="alignment6">
-		      <property name="visible">True</property>
-		      <property name="xalign">0.5</property>
-		      <property name="yalign">0.5</property>
-		      <property name="xscale">1</property>
-		      <property name="yscale">1</property>
-		      <property name="top_padding">0</property>
-		      <property name="bottom_padding">0</property>
-		      <property name="left_padding">12</property>
-		      <property name="right_padding">0</property>
-
-		      <child>
-			<widget class="GtkScrolledWindow" id="scrolledwindow1">
-			  <property name="border_width">10</property>
-			  <property name="visible">True</property>
-			  <property name="can_focus">True</property>
-			  <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
-			  <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
-			  <property name="shadow_type">GTK_SHADOW_IN</property>
-			  <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
-
-			  <child>
-			    <widget class="GtkTreeView" id="TheTreeview">
-			      <property name="visible">True</property>
-			      <property name="can_focus">True</property>
-			      <property name="headers_visible">True</property>
-			      <property name="rules_hint">False</property>
-			      <property name="reorderable">False</property>
-			      <property name="enable_search">True</property>
-			      <property name="fixed_height_mode">False</property>
-			      <property name="hover_selection">False</property>
-			      <property name="hover_expand">True</property>
-			    </widget>
-			  </child>
-			</widget>
-		      </child>
-		    </widget>
-		  </child>
-
-		  <child>
-		    <widget class="GtkLabel" id="label23">
-		      <property name="visible">True</property>
-		      <property name="label" translatable="yes">Open Recent Session</property>
-		      <property name="use_underline">False</property>
-		      <property name="use_markup">False</property>
-		      <property name="justify">GTK_JUSTIFY_LEFT</property>
-		      <property name="wrap">False</property>
-		      <property name="selectable">False</property>
-		      <property name="xalign">0.5</property>
-		      <property name="yalign">0.5</property>
-		      <property name="xpad">0</property>
-		      <property name="ypad">0</property>
-		      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
-		      <property name="width_chars">-1</property>
-		      <property name="single_line_mode">False</property>
-		      <property name="angle">0</property>
-		    </widget>
-		    <packing>
-		      <property name="type">label_item</property>
-		    </packing>
-		  </child>
-		</widget>
-		<packing>
-		  <property name="padding">5</property>
-		  <property name="expand">True</property>
-		  <property name="fill">True</property>
-		</packing>
-	      </child>
-	    </widget>
-	    <packing>
-	      <property name="tab_expand">False</property>
-	      <property name="tab_fill">True</property>
-	    </packing>
-	  </child>
-
-	  <child>
-	    <widget class="GtkLabel" id="label20">
-	      <property name="visible">True</property>
-	      <property name="label" translatable="yes">Open Session</property>
-	      <property name="use_underline">False</property>
-	      <property name="use_markup">False</property>
-	      <property name="justify">GTK_JUSTIFY_LEFT</property>
-	      <property name="wrap">False</property>
-	      <property name="selectable">False</property>
-	      <property name="xalign">0.5</property>
-	      <property name="yalign">0.5</property>
-	      <property name="xpad">0</property>
-	      <property name="ypad">0</property>
-	      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
-	      <property name="width_chars">-1</property>
-	      <property name="single_line_mode">False</property>
-	      <property name="angle">0</property>
-	    </widget>
-	    <packing>
-	      <property name="type">tab</property>
-	    </packing>
-	  </child>
-	</widget>
-	<packing>
-	  <property name="padding">0</property>
-	  <property name="expand">False</property>
-	  <property name="fill">True</property>
-	</packing>
-      </child>
-    </widget>
-  </child>
-</widget>
-
-</glade-interface>
diff --git a/gtk2_ardour/global_port_matrix.cc b/gtk2_ardour/global_port_matrix.cc
index 706b4b6..9a6db25 100644
--- a/gtk2_ardour/global_port_matrix.cc
+++ b/gtk2_ardour/global_port_matrix.cc
@@ -28,7 +28,7 @@
 #include "ardour/audioengine.h"
 #include "ardour/port.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
diff --git a/gtk2_ardour/group_tabs.cc b/gtk2_ardour/group_tabs.cc
index 6c3ce31..5b5d5d1 100644
--- a/gtk2_ardour/group_tabs.cc
+++ b/gtk2_ardour/group_tabs.cc
@@ -18,15 +18,20 @@
 */
 
 #include <gtkmm/stock.h>
+
 #include "ardour/session.h"
 #include "ardour/route_group.h"
 #include "ardour/route.h"
+#include "ardour/vca_manager.h"
+#include "ardour/vca.h"
+
+#include "gtkmm2ext/doi.h"
 
 #include "gui_thread.h"
 #include "route_group_dialog.h"
 #include "group_tabs.h"
 #include "keyboard.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
 #include "ardour_ui.h"
 #include "rgb_macros.h"
 #include "ui_config.h"
@@ -142,7 +147,7 @@ GroupTabs::on_button_press_event (GdkEventButton* ev)
 		if (Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier) && g) {
 			/* edit */
 			RouteGroupDialog d (g, false);
-			d.do_run ();
+			d.present ();
 		} else {
 			Menu* m = get_menu (g, true);
 			if (m) {
@@ -205,12 +210,7 @@ GroupTabs::on_button_release_event (GdkEventButton*)
 
 		if (!routes.empty()) {
 			if (_dragging_new_tab) {
-				RouteGroup* g = create_and_add_group ();
-				if (g) {
-					for (RouteList::iterator i = routes.begin(); i != routes.end(); ++i) {
-						g->add (*i);
-					}
-				}
+				run_new_group_dialog (&routes, false);
 			} else {
 				boost::shared_ptr<RouteList> r = _session->get_routes ();
 				for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
@@ -300,34 +300,73 @@ GroupTabs::click_to_tab (double c, list<Tab>::iterator* prev, list<Tab>::iterato
 	return under;
 }
 
+void
+GroupTabs::add_new_from_items (Menu_Helpers::MenuList& items)
+{
+	using namespace Menu_Helpers;
+	Menu *new_from;
+
+	new_from = new Menu;
+	{
+		MenuList& f = new_from->items ();
+		f.push_back (MenuElem (_("Selection..."), sigc::bind (sigc::mem_fun (*this, &GroupTabs::new_from_selection), false)));
+		f.push_back (MenuElem (_("Record Enabled..."), sigc::bind (sigc::mem_fun (*this, &GroupTabs::new_from_rec_enabled), false)));
+		f.push_back (MenuElem (_("Soloed..."), sigc::bind (sigc::mem_fun (*this, &GroupTabs::new_from_soloed), false)));
+	}
+	items.push_back (MenuElem (_("Create New Group From..."), *new_from));
+
+	new_from = new Menu;
+	{
+		MenuList& f = new_from->items ();
+		f.push_back (MenuElem (_("Selection..."), sigc::bind (sigc::mem_fun (*this, &GroupTabs::new_from_selection), true)));
+		f.push_back (MenuElem (_("Record Enabled..."), sigc::bind (sigc::mem_fun (*this, &GroupTabs::new_from_rec_enabled), true)));
+		f.push_back (MenuElem (_("Soloed..."), sigc::bind (sigc::mem_fun (*this, &GroupTabs::new_from_soloed), true)));
+	}
+	items.push_back (MenuElem (_("Create New Group with Master From..."), *new_from));
+}
+
 Gtk::Menu*
-GroupTabs::get_menu (RouteGroup* g, bool TabArea)
+GroupTabs::get_menu (RouteGroup* g, bool in_tab_area)
 {
 	using namespace Menu_Helpers;
 
 	delete _menu;
 
-	Menu* new_from = new Menu;
-	MenuList& f = new_from->items ();
-	f.push_back (MenuElem (_("Selection..."), sigc::mem_fun (*this, &GroupTabs::new_from_selection)));
-	f.push_back (MenuElem (_("Record Enabled..."), sigc::mem_fun (*this, &GroupTabs::new_from_rec_enabled)));
-	f.push_back (MenuElem (_("Soloed..."), sigc::mem_fun (*this, &GroupTabs::new_from_soloed)));
-
 	_menu = new Menu;
 	_menu->set_name ("ArdourContextMenu");
+
 	MenuList& items = _menu->items();
+	Menu* vca_menu;
 
-	if (!TabArea) {
-		items.push_back (MenuElem (_("Create New Group ..."), hide_return (sigc::mem_fun(*this, &GroupTabs::create_and_add_group))));
-	}
+	const VCAList vcas = _session->vca_manager().vcas ();
 
-	items.push_back (MenuElem (_("Create New Group From"), *new_from));
+	if (!in_tab_area) {
+		/* context menu is not for a group tab, show the "create new
+		   from" items here
+		*/
+		add_new_from_items (items);
+	}
 
 	if (g) {
+		items.push_back (SeparatorElem());
 		items.push_back (MenuElem (_("Edit Group..."), sigc::bind (sigc::mem_fun (*this, &GroupTabs::edit_group), g)));
 		items.push_back (MenuElem (_("Collect Group"), sigc::bind (sigc::mem_fun (*this, &GroupTabs::collect), g)));
 		items.push_back (MenuElem (_("Remove Group"), sigc::bind (sigc::mem_fun (*this, &GroupTabs::remove_group), g)));
+
 		items.push_back (SeparatorElem());
+
+		vca_menu = new Menu;
+		MenuList& f (vca_menu->items());
+		f.push_back (MenuElem ("New", sigc::bind (sigc::mem_fun (*this, &GroupTabs::assign_group_to_master), 0, g, true)));
+
+		for (VCAList::const_iterator v = vcas.begin(); v != vcas.end(); ++v) {
+			f.push_back (MenuElem (string_compose ("VCA %1", (*v)->number()), sigc::bind (sigc::mem_fun (*this, &GroupTabs::assign_group_to_master), (*v)->number(), g, true)));
+		}
+		items.push_back (MenuElem (_("Assign Group to Control Master..."), *vca_menu));
+
+
+		items.push_back (SeparatorElem());
+
 		if (g->has_subgroup()) {
 			items.push_back (MenuElem (_("Remove Subgroup Bus"), sigc::bind (sigc::mem_fun (*this, &GroupTabs::un_subgroup), g)));
 		} else {
@@ -335,51 +374,160 @@ GroupTabs::get_menu (RouteGroup* g, bool TabArea)
 		}
 		items.push_back (MenuElem (_("Add New Aux Bus (pre-fader)"), sigc::bind (sigc::mem_fun (*this, &GroupTabs::subgroup), g, true, PreFader)));
 		items.push_back (MenuElem (_("Add New Aux Bus (post-fader)"), sigc::bind (sigc::mem_fun (*this, &GroupTabs::subgroup), g, true, PostFader)));
+		items.push_back (SeparatorElem());
+
 	}
 
 	add_menu_items (_menu, g);
 
+	if (in_tab_area) {
+		/* context menu is for a group tab, show the "create new
+		   from" items here
+		*/
+		add_new_from_items (items);
+	}
+
+	items.push_back (SeparatorElem());
+
+	vca_menu = new Menu;
+	{
+		MenuList& f (vca_menu->items());
+		f.push_back (MenuElem ("New", sigc::bind (sigc::mem_fun (*this, &GroupTabs::assign_selection_to_master), 0)));
+		for (VCAList::const_iterator v = vcas.begin(); v != vcas.end(); ++v) {
+			f.push_back (MenuElem (string_compose ("VCA %1", (*v)->number()), sigc::bind (sigc::mem_fun (*this, &GroupTabs::assign_selection_to_master), (*v)->number())));
+		}
+	}
+
+	items.push_back (MenuElem (_("Assign Selection to Control Master..."), *vca_menu));
+
+	vca_menu = new Menu;
+	{
+		MenuList& f (vca_menu->items());
+		f.push_back (MenuElem ("New", sigc::bind (sigc::mem_fun (*this, &GroupTabs::assign_selection_to_master), 0)));
+		for (VCAList::const_iterator v = vcas.begin(); v != vcas.end(); ++v) {
+			f.push_back (MenuElem (string_compose ("VCA %1", (*v)->number()), sigc::bind (sigc::mem_fun (*this, &GroupTabs::assign_selection_to_master), (*v)->number())));
+		}
+
+	}
+	items.push_back (MenuElem (_("Assign Record Enabled to Control Master..."), *vca_menu));
+
+	vca_menu = new Menu;
+	{
+		MenuList& f (vca_menu->items());
+		f.push_back (MenuElem ("New", sigc::bind (sigc::mem_fun (*this, &GroupTabs::assign_selection_to_master), 0)));
+		for (VCAList::const_iterator v = vcas.begin(); v != vcas.end(); ++v) {
+			f.push_back (MenuElem (string_compose ("VCA %1", (*v)->number()), sigc::bind (sigc::mem_fun (*this, &GroupTabs::assign_selection_to_master), (*v)->number())));
+		}
+
+	}
+	items.push_back (MenuElem (_("Assign Soloed to Control Master...")));
+
 	items.push_back (SeparatorElem());
 	items.push_back (MenuElem (_("Enable All Groups"), sigc::mem_fun(*this, &GroupTabs::activate_all)));
 	items.push_back (MenuElem (_("Disable All Groups"), sigc::mem_fun(*this, &GroupTabs::disable_all)));
 
 	return _menu;
-
 }
 
 void
-GroupTabs::new_from_selection ()
+GroupTabs::assign_group_to_master (uint32_t which, RouteGroup* group, bool rename_master) const
 {
-	RouteList rl = selected_routes ();
-	if (rl.empty()) {
+	if (!_session || !group) {
 		return;
 	}
 
-	run_new_group_dialog (rl);
+	boost::shared_ptr<VCA> master;
+
+	if (which == 0) {
+		if (_session->vca_manager().create_vca (1)) {
+			/* error */
+			return;
+		}
+
+		/* VCAs use 1-based counting. Get most recently created VCA... */
+		which = _session->vca_manager().n_vcas();
+	}
+
+	master = _session->vca_manager().vca_by_number (which);
+
+	if (!master) {
+		/* should never happen; if it does, basically something deeply
+		   odd happened, no reason to tell user because there's no
+		   sensible explanation.
+		*/
+		return;
+	}
+
+	group->assign_master (master);
+
+	if (rename_master){
+		master->set_name (group->name());
+	}
 }
 
 void
-GroupTabs::new_from_rec_enabled ()
+GroupTabs::assign_some_to_master (uint32_t which, RouteList rl)
 {
-	boost::shared_ptr<RouteList> rl = _session->get_routes ();
+	if (!_session) {
+		return;
+	}
 
-	RouteList rec_enabled;
+	boost::shared_ptr<VCA> master;
 
-	for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
-		if ((*i)->record_enabled()) {
-			rec_enabled.push_back (*i);
+	if (which == 0) {
+		if (_session->vca_manager().create_vca (1)) {
+			/* error */
+			return;
 		}
+
+		/* VCAs use 1-based counting. Get most recently created VCA... */
+		which = _session->vca_manager().n_vcas();
+	}
+
+	master = _session->vca_manager().vca_by_number (which);
+
+	if (!master) {
+		/* should never happen; if it does, basically something deeply
+		   odd happened, no reason to tell user because there's no
+		   sensible explanation.
+		*/
+		return;
 	}
 
-	if (rec_enabled.empty()) {
+
+	if (rl.empty()) {
 		return;
 	}
 
-	run_new_group_dialog (rec_enabled);
+	for (RouteList::iterator r = rl.begin(); r != rl.end(); ++r) {
+		(*r)->assign (master);
+	}
 }
 
-void
-GroupTabs::new_from_soloed ()
+RouteList
+GroupTabs::get_rec_enabled ()
+{
+	RouteList rec_enabled;
+
+	if (!_session) {
+		return rec_enabled;
+	}
+
+	boost::shared_ptr<RouteList> rl = _session->get_routes ();
+
+	for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
+		boost::shared_ptr<Track> trk (boost::dynamic_pointer_cast<Track> (*i));
+		if (trk && trk->rec_enable_control()->get_value()) {
+			rec_enabled.push_back (*i);
+		}
+	}
+
+	return rec_enabled;
+}
+
+
+RouteList
+GroupTabs::get_soloed ()
 {
 	boost::shared_ptr<RouteList> rl = _session->get_routes ();
 
@@ -391,49 +539,102 @@ GroupTabs::new_from_soloed ()
 		}
 	}
 
-	if (soloed.empty()) {
-		return;
-	}
+	return soloed;
+}
 
-	run_new_group_dialog (soloed);
+void
+GroupTabs::assign_selection_to_master (uint32_t which)
+{
+	assign_some_to_master (which, selected_routes ());
 }
 
 void
-GroupTabs::run_new_group_dialog (RouteList const & rl)
+GroupTabs::assign_recenabled_to_master (uint32_t which)
 {
-	RouteGroup* g = new RouteGroup (*_session, "");
-	RouteGroupDialog d (g, true);
+	assign_some_to_master (which, get_rec_enabled());
+}
 
-	if (d.do_run ()) {
-		delete g;
-	} else {
-		_session->add_route_group (g);
-		for (RouteList::const_iterator i = rl.begin(); i != rl.end(); ++i) {
-			g->add (*i);
-		}
-	}
+void
+GroupTabs::assign_soloed_to_master (uint32_t which)
+{
+	assign_some_to_master (which, get_soloed());
+}
+
+void
+GroupTabs::new_from_selection (bool with_master)
+{
+	RouteList rl (selected_routes());
+	run_new_group_dialog (&rl, with_master);
 }
 
-RouteGroup *
-GroupTabs::create_and_add_group () const
+void
+GroupTabs::new_from_rec_enabled (bool with_master)
+{
+	RouteList rl (get_rec_enabled());
+	run_new_group_dialog (&rl, with_master);
+}
+
+void
+GroupTabs::new_from_soloed (bool with_master)
+{
+	RouteList rl (get_soloed());
+	run_new_group_dialog (&rl, with_master);
+}
+
+void
+GroupTabs::run_new_group_dialog (RouteList const * rl, bool with_master)
 {
+	if (rl && rl->empty()) {
+		return;
+	}
+
 	RouteGroup* g = new RouteGroup (*_session, "");
-	RouteGroupDialog d (g, true);
+	RouteGroupDialog* d = new RouteGroupDialog (g, true);
+
+	d->signal_response().connect (sigc::bind (sigc::mem_fun (*this, &GroupTabs::new_group_dialog_finished), d, rl ? new RouteList (*rl): 0, with_master));
+	d->present ();
+}
+
+void
+GroupTabs::new_group_dialog_finished (int r, RouteGroupDialog* d, RouteList const * rl, bool with_master) const
+{
+	if (r == RESPONSE_OK) {
 
-	if (d.do_run ()) {
-		delete g;
-		return 0;
+		if (!d->name_check()) {
+			return;
+		}
+
+		_session->add_route_group (d->group());
+
+		if (rl) {
+			for (RouteList::const_iterator i = rl->begin(); i != rl->end(); ++i) {
+				d->group()->add (*i);
+			}
+
+			if (with_master) {
+				assign_group_to_master (0, d->group(), true); /* zero => new master */
+			}
+		}
+	} else {
+		delete d->group ();
 	}
 
-	_session->add_route_group (g);
-	return g;
+	delete rl;
+	delete_when_idle (d);
 }
 
 void
 GroupTabs::edit_group (RouteGroup* g)
 {
-	RouteGroupDialog d (g, false);
-	d.do_run ();
+	RouteGroupDialog* d = new RouteGroupDialog (g, false);
+	d->signal_response().connect (sigc::bind (sigc::mem_fun (*this, &GroupTabs::edit_group_dialog_finished), d));
+	d->present ();
+}
+
+void
+GroupTabs::edit_group_dialog_finished (int r, RouteGroupDialog* d) const
+{
+	delete_when_idle (d);
 }
 
 void
@@ -448,18 +649,6 @@ GroupTabs::un_subgroup (RouteGroup* g)
 	g->destroy_subgroup ();
 }
 
-struct CollectSorter {
-	bool operator () (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b) {
-		return a->order_key () < b->order_key ();
-	}
-};
-
-struct OrderSorter {
-	bool operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b) {
-		return a->order_key () < b->order_key ();
-	}
-};
-
 /** Collect all members of a RouteGroup so that they are together in the Editor or Mixer.
  *  @param g Group to collect.
  */
@@ -467,19 +656,19 @@ void
 GroupTabs::collect (RouteGroup* g)
 {
 	boost::shared_ptr<RouteList> group_routes = g->route_list ();
-	group_routes->sort (CollectSorter ());
+	group_routes->sort (Stripable::PresentationOrderSorter());
 	int const N = group_routes->size ();
 
 	RouteList::iterator i = group_routes->begin ();
 	boost::shared_ptr<RouteList> routes = _session->get_routes ();
-	routes->sort (OrderSorter ());
+	routes->sort (Stripable::PresentationOrderSorter());
 	RouteList::const_iterator j = routes->begin ();
 
 	int diff = 0;
 	int coll = -1;
 	while (i != group_routes->end() && j != routes->end()) {
 
-		int const k = (*j)->order_key ();
+		PresentationInfo::order_t const k = (*j)->presentation_info ().order();
 
 		if (*i == *j) {
 
@@ -490,21 +679,21 @@ GroupTabs::collect (RouteGroup* g)
 				--diff;
 			}
 
-			(*j)->set_order_key (coll);
+			(*j)->set_presentation_order (coll, false);
 
 			++coll;
 			++i;
 
 		} else {
 
-			(*j)->set_order_key (k + diff);
+			(*j)->set_presentation_order (k + diff, false);
 
 		}
 
 		++j;
 	}
 
-	sync_order_keys ();
+	_session->notify_presentation_info_change ();
 }
 
 void
@@ -545,11 +734,12 @@ GroupTabs::set_group_color (RouteGroup* group, uint32_t color)
 	UINT_TO_RGBA (color, &r, &g, &b, &a);
 
 	/* Hack to disallow black route groups; force a dark grey instead */
+	const uint32_t dark_gray = 25;
 
-	if (r == 0 && g == 0 && b == 0) {
-		r = 25;
-		g = 25;
-		b = 25;
+	if (r < dark_gray && g < dark_gray && b < dark_gray) {
+		r = dark_gray;
+		g = dark_gray;
+		b = dark_gray;
 	}
 
 	GUIObjectState& gui_state = *ARDOUR_UI::instance()->gui_object_state;
@@ -644,7 +834,7 @@ GroupTabs::route_added_to_route_group (RouteGroup*, boost::weak_ptr<Route> w)
 		return;
 	}
 
-	r->gui_changed (X_("color"), 0);
+	r->presentation_info().PropertyChanged (Properties::color);
 
 	set_dirty ();
 }
@@ -659,7 +849,7 @@ GroupTabs::route_removed_from_route_group (RouteGroup*, boost::weak_ptr<Route> w
 		return;
 	}
 
-	r->gui_changed (X_("color"), 0);
+	r->presentation_info().PropertyChanged (Properties::color);
 
 	set_dirty ();
 }
diff --git a/gtk2_ardour/group_tabs.h b/gtk2_ardour/group_tabs.h
index e31ad96..39ea78d 100644
--- a/gtk2_ardour/group_tabs.h
+++ b/gtk2_ardour/group_tabs.h
@@ -27,6 +27,7 @@ namespace ARDOUR {
 }
 
 class Editor;
+class RouteGroupDialog;
 
 /** Parent class for tabs which represent route groups as colored tabs;
  *  Currently used on the left-hand side of the editor and at the top of the mixer.
@@ -48,7 +49,7 @@ public:
 	 */
 	Gtk::Menu* get_menu (ARDOUR::RouteGroup* g, bool tabArea = false);
 
-	void run_new_group_dialog (ARDOUR::RouteList const &);
+	void run_new_group_dialog (ARDOUR::RouteList const *, bool with_master);
 
 	static void set_group_color (ARDOUR::RouteGroup *, uint32_t);
 	static std::string group_gui_id (ARDOUR::RouteGroup *);
@@ -92,12 +93,16 @@ private:
 
 	virtual void add_menu_items (Gtk::Menu *, ARDOUR::RouteGroup *) {}
 	virtual ARDOUR::RouteList selected_routes () const = 0;
-	virtual void sync_order_keys () = 0;
 
-	void new_from_selection ();
-	void new_from_rec_enabled ();
-	void new_from_soloed ();
-	ARDOUR::RouteGroup* create_and_add_group () const;
+	void add_new_from_items (Gtk::Menu_Helpers::MenuList&);
+
+	void new_from_selection (bool with_master);
+	void new_from_rec_enabled (bool with_master);
+	void new_from_soloed (bool with_master);
+
+	void new_group_dialog_finished (int, RouteGroupDialog*, ARDOUR::RouteList const *, bool with_master) const;
+	void edit_group_dialog_finished (int, RouteGroupDialog*) const;
+
 	void collect (ARDOUR::RouteGroup *);
 	void set_activation (ARDOUR::RouteGroup *, bool);
 	void edit_group (ARDOUR::RouteGroup *);
@@ -119,6 +124,15 @@ private:
 	void route_added_to_route_group (ARDOUR::RouteGroup *, boost::weak_ptr<ARDOUR::Route>);
 	void route_removed_from_route_group (ARDOUR::RouteGroup *, boost::weak_ptr<ARDOUR::Route>);
 
+	void assign_group_to_master (uint32_t which, ARDOUR::RouteGroup*, bool rename_master) const;
+	void assign_selection_to_master (uint32_t which);
+	void assign_recenabled_to_master (uint32_t which);
+	void assign_soloed_to_master (uint32_t which);
+	void assign_some_to_master (uint32_t which, ARDOUR::RouteList);
+
+	ARDOUR::RouteList get_soloed ();
+	ARDOUR::RouteList get_rec_enabled ();
+
 	Gtk::Menu* _menu;
 	std::list<Tab> _tabs; ///< current list of tabs
 	Tab* _dragging; ///< tab being dragged, or 0
diff --git a/gtk2_ardour/gtk2_ardour5.pot b/gtk2_ardour/gtk2_ardour5.pot
new file mode 100644
index 0000000..87b0fe6
--- /dev/null
+++ b/gtk2_ardour/gtk2_ardour5.pot
@@ -0,0 +1,14894 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR "Paul Davis"
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2016-08-08 20:24-0400\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
+"Language-Team: LANGUAGE <LL at li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
+
+#: about.cc:127
+msgid "Fons Adriaensen"
+msgstr ""
+
+#: about.cc:128
+msgid "Brian Ahr"
+msgstr ""
+
+#: about.cc:129
+msgid "John Anderson"
+msgstr ""
+
+#: about.cc:130
+msgid "Marcus Andersson"
+msgstr ""
+
+#: about.cc:131
+msgid "Nedko Arnaudov"
+msgstr ""
+
+#: about.cc:132
+msgid "Hans Baier"
+msgstr ""
+
+#: about.cc:133
+msgid "Ben Bell"
+msgstr ""
+
+#: about.cc:134
+msgid "Sakari Bergen"
+msgstr ""
+
+#: about.cc:135
+msgid "Christian Borss"
+msgstr ""
+
+#: about.cc:136
+msgid "Chris Cannam"
+msgstr ""
+
+#: about.cc:137
+msgid "Jeremy Carter"
+msgstr ""
+
+#: about.cc:138
+msgid "Jesse Chappell"
+msgstr ""
+
+#: about.cc:139
+msgid "Thomas Charbonnel"
+msgstr ""
+
+#: about.cc:140
+msgid "Sam Chessman"
+msgstr ""
+
+#: about.cc:141
+msgid "André Colomb"
+msgstr ""
+
+#: about.cc:142
+msgid "Paul Davis"
+msgstr ""
+
+#: about.cc:143
+msgid "Gerard van Dongen"
+msgstr ""
+
+#: about.cc:144
+msgid "John Emmas"
+msgstr ""
+
+#: about.cc:145
+msgid "Colin Fletcher"
+msgstr ""
+
+#: about.cc:146
+msgid "Dave Flick"
+msgstr ""
+
+#: about.cc:147
+msgid "Hans Fugal"
+msgstr ""
+
+#: about.cc:148
+msgid "Robin Gareus"
+msgstr ""
+
+#: about.cc:149
+msgid "Nil Geisweiller"
+msgstr ""
+
+#: about.cc:150
+msgid "Christopher George"
+msgstr ""
+
+#: about.cc:151
+msgid "Chris Goddard"
+msgstr ""
+
+#: about.cc:152
+msgid "J. Abelardo Gutierrez"
+msgstr ""
+
+#: about.cc:153
+msgid "Jeremy Hall"
+msgstr ""
+
+#: about.cc:154
+msgid "Audun Halland"
+msgstr ""
+
+#: about.cc:155
+msgid "David Halter"
+msgstr ""
+
+#: about.cc:156
+msgid "Steve Harris"
+msgstr ""
+
+#: about.cc:157
+msgid "Melvin Ray Herr"
+msgstr ""
+
+#: about.cc:158
+msgid "Carl Hetherington"
+msgstr ""
+
+#: about.cc:159
+msgid "Rob Holland"
+msgstr ""
+
+#: about.cc:160
+msgid "Robert Jordens"
+msgstr ""
+
+#: about.cc:161
+msgid "Stefan Kersten"
+msgstr ""
+
+#: about.cc:162
+msgid "Armand Klenk"
+msgstr ""
+
+#: about.cc:163
+msgid "Julien de Kozak"
+msgstr ""
+
+#: about.cc:164
+msgid "Matt Krai"
+msgstr ""
+
+#: about.cc:165
+msgid "Georg Krause"
+msgstr ""
+
+#: about.cc:166
+msgid "Nick Lanham"
+msgstr ""
+
+#: about.cc:167
+msgid "Colin Law"
+msgstr ""
+
+#: about.cc:168
+msgid "Joshua Leach"
+msgstr ""
+
+#: about.cc:169
+msgid "Ben Loftis"
+msgstr ""
+
+#: about.cc:170
+msgid "Nick Mainsbridge"
+msgstr ""
+
+#: about.cc:171
+msgid "Tim Mayberry"
+msgstr ""
+
+#: about.cc:172
+msgid "Doug Mclain"
+msgstr ""
+
+#: about.cc:173
+msgid "Todd Naugle"
+msgstr ""
+
+#: about.cc:174
+msgid "André Nusser"
+msgstr ""
+
+#: about.cc:175
+msgid "Bent Bisballe Nyeng"
+msgstr ""
+
+#: about.cc:176
+msgid "Jack O'Quin"
+msgstr ""
+
+#: about.cc:177
+msgid "Pavel Potocek"
+msgstr ""
+
+#: about.cc:178
+msgid "Nimal Ratnayake"
+msgstr ""
+
+#: about.cc:179
+msgid "Julien Rivaud"
+msgstr ""
+
+#: about.cc:180
+msgid "David Robillard"
+msgstr ""
+
+#: about.cc:181
+msgid "Julien Roger"
+msgstr ""
+
+#: about.cc:182
+msgid "Taybin Rutkin"
+msgstr ""
+
+#: about.cc:183
+msgid "Andreas Ruge"
+msgstr ""
+
+#: about.cc:184
+msgid "Sampo Savolainen"
+msgstr ""
+
+#: about.cc:185
+msgid "Rodrigo Severo"
+msgstr ""
+
+#: about.cc:186
+msgid "Per Sigmond"
+msgstr ""
+
+#: about.cc:187
+msgid "Lincoln Spiteri"
+msgstr ""
+
+#: about.cc:188
+msgid "Mike Start"
+msgstr ""
+
+#: about.cc:189
+msgid "Mark Stewart"
+msgstr ""
+
+#: about.cc:190
+msgid "Roland Stigge"
+msgstr ""
+
+#: about.cc:191
+msgid "Petter Sundlöf"
+msgstr ""
+
+#: about.cc:192
+msgid "Mike Täht"
+msgstr ""
+
+#: about.cc:193
+msgid "Roy Vegard"
+msgstr ""
+
+#: about.cc:194
+msgid "Thorsten Wilms"
+msgstr ""
+
+#: about.cc:195
+msgid "Damien Zammit"
+msgstr ""
+
+#: about.cc:196
+msgid "Grygorii Zharun"
+msgstr ""
+
+#: about.cc:201
+msgid ""
+"French:\n"
+"\tAlain Fréhel <alain.frehel at free.fr>\n"
+"\tChristophe Combelles <ccomb at free.fr>\n"
+"\tMartin Blanchard\n"
+"\tRomain Arnaud <roming22 at gmail.com>\n"
+msgstr ""
+
+#: about.cc:202
+msgid ""
+"German:\n"
+"\tKarsten Petersen <kapet at kapet.de>\n"
+"\tSebastian Arnold <mail at sebastian-arnold.net>\n"
+"\tRobert Schwede <schwede at ironshark.com>\n"
+"\tBenjamin Scherrer <realhangman at web.de>\n"
+"\tEdgar Aichinger <edogawa at aon.at>\n"
+"\tRichard Oax <richard at pagliacciempire.de>\n"
+"\tRobin Gloster <robin at loc-com.de>\n"
+msgstr ""
+
+#: about.cc:209
+msgid ""
+"Italian:\n"
+"\tFilippo Pappalardo <filippo at email.it>\n"
+"\tRaffaele Morelli <raffaele.morelli at gmail.com>\n"
+msgstr ""
+
+#: about.cc:210
+msgid ""
+"Portuguese:\n"
+"\tRui Nuno Capela <rncbc at rncbc.org>\n"
+msgstr ""
+
+#: about.cc:211
+msgid ""
+"Brazilian Portuguese:\n"
+"\tAlexander da Franca Fernandes <alexander at nautae.eti.br>\n"
+"\tChris Ross <chris at tebibyte.org>\n"
+msgstr ""
+
+#: about.cc:213
+msgid ""
+"Spanish:\n"
+"\t Alex Krohn <alexkrohn at fastmail.fm>\n"
+"\tPablo Fernández <pablo.fbus at gmail.com>\n"
+msgstr ""
+
+#: about.cc:214
+msgid ""
+"Russian:\n"
+"\t Igor Blinov <pitstop at nm.ru>\n"
+"\tAlexandre Prokoudine <alexandre.prokoudine at gmail.com>\n"
+msgstr ""
+
+#: about.cc:216
+msgid ""
+"Greek:\n"
+"\t Klearchos Gourgourinis <muadib at in.gr>\n"
+msgstr ""
+
+#: about.cc:217
+msgid ""
+"Swedish:\n"
+"\t Petter Sundlöf <petter.sundlof at gmail.com>\n"
+msgstr ""
+
+#: about.cc:218
+msgid ""
+"Polish:\n"
+"\t Piotr Zaryk <pzaryk at gmail.com>\n"
+msgstr ""
+
+#: about.cc:219
+msgid ""
+"Czech:\n"
+"\t Pavel Fric <pavelfric at seznam.cz>\n"
+msgstr ""
+
+#: about.cc:220
+msgid ""
+"Norwegian:\n"
+"\t Eivind Ødegård\n"
+msgstr ""
+
+#: about.cc:221
+msgid ""
+"Chinese:\n"
+"\t Rui-huai Zhang <zrhzrh at mail.ustc.edu.cn>\n"
+msgstr ""
+
+#: about.cc:601
+msgid "Intel 64-bit"
+msgstr ""
+
+#: about.cc:603
+msgid "Intel 32-bit"
+msgstr ""
+
+#: about.cc:605
+msgid "PowerPC 64-bit"
+msgstr ""
+
+#: about.cc:607
+msgid "PowerPC 32-bit"
+msgstr ""
+
+#: about.cc:609
+msgid "64-bit"
+msgstr ""
+
+#: about.cc:611
+msgid "32-bit"
+msgstr ""
+
+#: about.cc:619
+msgid " - debug"
+msgstr ""
+
+#: about.cc:625
+msgid "Copyright (C) 1999-2015 Paul Davis\n"
+msgstr ""
+
+#: about.cc:629
+msgid "http://ardour.org/"
+msgstr ""
+
+#: about.cc:630
+msgid ""
+"%1%2\n"
+"(rev %3)\n"
+"%4%5"
+msgstr ""
+
+#: about.cc:635
+msgid "Config"
+msgstr ""
+
+#: actions.cc:83
+msgid "Loading menus from %1"
+msgstr ""
+
+#: actions.cc:86 actions.cc:87
+msgid "badly formatted menu definition file: %1"
+msgstr ""
+
+#: actions.cc:89
+msgid "%1 menu definition file not found"
+msgstr ""
+
+#: actions.cc:93 actions.cc:94
+msgid "%1 will not work without a valid menu definition file"
+msgstr ""
+
+#: add_route_dialog.cc:58
+msgid "Add Track/Bus/VCA"
+msgstr ""
+
+#: add_route_dialog.cc:61
+msgid "Configuration:"
+msgstr ""
+
+#: add_route_dialog.cc:62
+msgid "Record Mode:"
+msgstr ""
+
+#: add_route_dialog.cc:63
+msgid "Instrument:"
+msgstr ""
+
+#: add_route_dialog.cc:77 add_route_dialog.cc:228
+msgid "Audio Tracks"
+msgstr ""
+
+#: add_route_dialog.cc:78 add_route_dialog.cc:224
+msgid "MIDI Tracks"
+msgstr ""
+
+#: add_route_dialog.cc:79 add_route_dialog.cc:226
+msgid "Audio+MIDI Tracks"
+msgstr ""
+
+#: add_route_dialog.cc:80 add_route_dialog.cc:220
+msgid "Audio Busses"
+msgstr ""
+
+#: add_route_dialog.cc:81 add_route_dialog.cc:222
+msgid "MIDI Busses"
+msgstr ""
+
+#: add_route_dialog.cc:82
+msgid "VCA Masters"
+msgstr ""
+
+#: add_route_dialog.cc:85 add_route_dialog.cc:622
+msgid "First"
+msgstr ""
+
+#: add_route_dialog.cc:86 add_route_dialog.cc:626
+msgid "Before Selection"
+msgstr ""
+
+#: add_route_dialog.cc:87 add_route_dialog.cc:624
+msgid "After Selection"
+msgstr ""
+
+#: add_route_dialog.cc:88
+msgid "Last"
+msgstr ""
+
+#: add_route_dialog.cc:91
+msgid "Flexible-I/O"
+msgstr ""
+
+#: add_route_dialog.cc:92
+msgid "Strict-I/O"
+msgstr ""
+
+#: add_route_dialog.cc:108
+msgid "Add:"
+msgstr ""
+
+#: add_route_dialog.cc:121 time_fx_dialog.cc:101 add_video_dialog.cc:136
+#: video_server_dialog.cc:118
+msgid "<b>Options</b>"
+msgstr ""
+
+#: add_route_dialog.cc:131 bundle_manager.cc:193 region_editor.cc:52
+#: route_group_dialog.cc:70
+msgid "Name:"
+msgstr ""
+
+#: add_route_dialog.cc:155
+msgid "Group:"
+msgstr ""
+
+#: add_route_dialog.cc:161
+msgid "Insert:"
+msgstr ""
+
+#: add_route_dialog.cc:171
+msgid "Output Ports:"
+msgstr ""
+
+#: add_route_dialog.cc:176 rc_option_editor.cc:2474
+msgid ""
+"With strict-i/o enabled, Effect Processors will not modify the number of "
+"channels on a track. The number of output channels will always match the "
+"number of input channels."
+msgstr ""
+
+#: add_route_dialog.cc:240 add_route_dialog.cc:351 ardour_ui_ed.cc:625
+#: engine_dialog.cc:244 plugin_pin_dialog.cc:67 rc_option_editor.cc:2397
+#: rc_option_editor.cc:2399 rc_option_editor.cc:2401 rc_option_editor.cc:2419
+#: rc_option_editor.cc:2421 rc_option_editor.cc:2429 rc_option_editor.cc:2432
+#: rc_option_editor.cc:2450 rc_option_editor.cc:2463 rc_option_editor.cc:2472
+#: rc_option_editor.cc:2478 rc_option_editor.cc:2480 rc_option_editor.cc:2525
+#: rc_option_editor.cc:2527 rc_option_editor.cc:2529 rc_option_editor.cc:2537
+msgid "Audio"
+msgstr ""
+
+#: add_route_dialog.cc:243 add_route_dialog.cc:352 editor_actions.cc:112
+#: engine_dialog.cc:246 missing_file_dialog.cc:60 mixer_ui.cc:1895
+#: plugin_pin_dialog.cc:68 rc_option_editor.cc:2672 rc_option_editor.cc:2674
+#: rc_option_editor.cc:2684 rc_option_editor.cc:2693 rc_option_editor.cc:2701
+#: rc_option_editor.cc:2709 rc_option_editor.cc:2717 rc_option_editor.cc:2790
+#: rc_option_editor.cc:2813
+msgid "MIDI"
+msgstr ""
+
+#: add_route_dialog.cc:246 add_route_dialog.cc:353
+msgid "Audio+MIDI"
+msgstr ""
+
+#: add_route_dialog.cc:250 add_route_dialog.cc:354
+msgid "Bus"
+msgstr ""
+
+#: add_route_dialog.cc:286
+msgid ""
+"Audio+MIDI tracks are intended for use <b>ONLY</b> with plugins that use "
+"both audio and MIDI input data\n"
+"\n"
+"If you do not plan to use such a plugin, then use a normal audio or MIDI "
+"track instead."
+msgstr ""
+
+#: add_route_dialog.cc:373 add_route_dialog.cc:385 editor_actions.cc:456
+#: editor_rulers.cc:250 time_axis_view.cc:1294
+msgid "Normal"
+msgstr ""
+
+#: add_route_dialog.cc:374 add_route_dialog.cc:387
+msgid "Non Layered"
+msgstr ""
+
+#: add_route_dialog.cc:375 add_route_dialog.cc:389
+msgid "Tape"
+msgstr ""
+
+#: add_route_dialog.cc:476 monitor_section.cc:273 plugin_pin_dialog.cc:509
+#: plugin_setup_dialog.cc:202
+msgid "Mono"
+msgstr ""
+
+#: add_route_dialog.cc:480 plugin_pin_dialog.cc:512 plugin_setup_dialog.cc:205
+msgid "Stereo"
+msgstr ""
+
+#: add_route_dialog.cc:503
+msgid "3 Channel"
+msgstr ""
+
+#: add_route_dialog.cc:507
+msgid "4 Channel"
+msgstr ""
+
+#: add_route_dialog.cc:511
+msgid "5 Channel"
+msgstr ""
+
+#: add_route_dialog.cc:515
+msgid "6 Channel"
+msgstr ""
+
+#: add_route_dialog.cc:519
+msgid "8 Channel"
+msgstr ""
+
+#: add_route_dialog.cc:523
+msgid "12 Channel"
+msgstr ""
+
+#: add_route_dialog.cc:527 mixer_strip.cc:2017 mixer_strip.cc:2463
+msgid "Custom"
+msgstr ""
+
+#: add_route_dialog.cc:569 add_route_dialog.cc:585 route_group_menu.cc:85
+msgid "New Group..."
+msgstr ""
+
+#: add_route_dialog.cc:573 route_group_menu.cc:89
+msgid "No Group"
+msgstr ""
+
+#: ambiguous_file_dialog.cc:30
+msgid "Ambiguous File"
+msgstr ""
+
+#: ambiguous_file_dialog.cc:37
+msgid ""
+"%1 has found the file <i>%2</i> in the following places:\n"
+"\n"
+msgstr ""
+
+#: ambiguous_file_dialog.cc:46
+msgid ""
+"\n"
+"\n"
+"Please select the path that you want to get the file from."
+msgstr ""
+
+#: ambiguous_file_dialog.cc:48 missing_file_dialog.cc:50
+msgid "Done"
+msgstr ""
+
+#: analysis_window.cc:45
+msgid "Signal source"
+msgstr ""
+
+#: analysis_window.cc:46
+msgid "Selected ranges"
+msgstr ""
+
+#: analysis_window.cc:47
+msgid "Selected regions"
+msgstr ""
+
+#: analysis_window.cc:48
+msgid "Show frequency power range"
+msgstr ""
+
+#: analysis_window.cc:49
+msgid "Fit dB range"
+msgstr ""
+
+#: analysis_window.cc:50
+msgid "Proportional Spectrum, -18dB"
+msgstr ""
+
+#: analysis_window.cc:53
+msgid "FFT analysis window"
+msgstr ""
+
+#: analysis_window.cc:54 editor.cc:1954
+msgid "Spectral Analysis"
+msgstr ""
+
+#: analysis_window.cc:61 editor_actions.cc:145 session_metadata_dialog.cc:670
+msgid "Track"
+msgstr ""
+
+#: analysis_window.cc:62 ardour_ui_ed.cc:254 ardour_ui_ed.cc:255
+#: ardour_ui_ed.cc:256 editor_actions.cc:689 mixer_ui.cc:151 mixer_ui.cc:2134
+msgid "Show"
+msgstr ""
+
+#: analysis_window.cc:107
+msgid "Re-analyze data"
+msgstr ""
+
+#: ardour_button.cc:876
+msgid "button cannot watch state of non-existing Controllable\n"
+msgstr ""
+
+#: ardour_button.cc:1144
+msgid "ABCDEFGHIJLKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
+msgstr ""
+
+#: ardour_http.cc:165 ardour_http.cc:179
+msgid "HTTP request failed: (%1) %2"
+msgstr ""
+
+#: ardour_http.cc:169 ardour_http.cc:182
+msgid "HTTP request status: %1"
+msgstr ""
+
+#: ardour_ui.cc:198
+msgid ""
+"%1 %2.x has discovered configuration files from %1 %3.x.\n"
+"\n"
+"Would you like these files to be copied and used for %1 %2.x?\n"
+"\n"
+"(This will require you to restart %1.)"
+msgstr ""
+
+#: ardour_ui.cc:283 editor_actions.cc:683 region_editor.cc:53
+msgid "Audition"
+msgstr ""
+
+#: ardour_ui.cc:284 editor_actions.cc:139 mixer_strip.cc:2213
+#: monitor_section.cc:329 rc_option_editor.cc:2547 route_time_axis.cc:263
+#: route_time_axis.cc:2740 vca_master_strip.cc:212 vca_time_axis.cc:237
+msgid "Solo"
+msgstr ""
+
+#: ardour_ui.cc:285 rc_option_editor.cc:1357
+msgid "Feedback"
+msgstr ""
+
+#: ardour_ui.cc:296 speaker_dialog.cc:36
+msgid "Speaker Configuration"
+msgstr ""
+
+#: ardour_ui.cc:297
+msgid "Add Tracks/Busses"
+msgstr ""
+
+#: ardour_ui.cc:298
+msgid "About"
+msgstr ""
+
+#: ardour_ui.cc:299 location_ui.cc:1167
+msgid "Ranges|Locations"
+msgstr ""
+
+#: ardour_ui.cc:300 route_params_ui.cc:59 route_params_ui.cc:620
+msgid "Tracks and Busses"
+msgstr ""
+
+#: ardour_ui.cc:301 engine_dialog.cc:73
+msgid "Audio/MIDI Setup"
+msgstr ""
+
+#: ardour_ui.cc:302
+msgid "Video Export Dialog"
+msgstr ""
+
+#: ardour_ui.cc:303 lua_script_manager.cc:30
+msgid "Script Manager"
+msgstr ""
+
+#: ardour_ui.cc:304
+msgid "Properties"
+msgstr ""
+
+#: ardour_ui.cc:305
+msgid "Add Video"
+msgstr ""
+
+#: ardour_ui.cc:306 bundle_manager.cc:264
+msgid "Bundle Manager"
+msgstr ""
+
+#: ardour_ui.cc:307 big_clock_window.cc:37
+msgid "Big Clock"
+msgstr ""
+
+#: ardour_ui.cc:308
+msgid "Audio Connections"
+msgstr ""
+
+#: ardour_ui.cc:309
+msgid "MIDI Connections"
+msgstr ""
+
+#: ardour_ui.cc:310
+msgid "Bindings Editor"
+msgstr ""
+
+#: ardour_ui.cc:321 editor.cc:1289
+msgid "Window|Editor"
+msgstr ""
+
+#: ardour_ui.cc:322 mixer_ui.cc:2210 mixer_ui.cc:2216
+msgid "Window|Mixer"
+msgstr ""
+
+#: ardour_ui.cc:323
+msgid "Window|Preferences"
+msgstr ""
+
+#: ardour_ui.cc:330
+msgid "Your configuration files were copied. You can now restart %1."
+msgstr ""
+
+#: ardour_ui.cc:509
+msgid "Pre-Release Warning"
+msgstr ""
+
+#: ardour_ui.cc:513
+msgid ""
+"<b>Welcome to this pre-release build of %1 %2</b>\n"
+"\n"
+"There are still several issues and bugs to be worked on,\n"
+"as well as general workflow improvements, before this can be considered\n"
+"release software. So, a few guidelines:\n"
+"\n"
+"1) Please do <b>NOT</b> use this software with the expectation that it is "
+"stable or reliable\n"
+"   though it may be so, depending on your workflow.\n"
+"2) Please wait for a helpful writeup of new features.\n"
+"3) <b>Please do NOT use the forums at ardour.org to report issues</b>.\n"
+"4) Please <b>DO</b> use the bugtracker at http://tracker.ardour.org/ to "
+"report issues\n"
+"   making sure to note the product version number as 5.0-pre.\n"
+"5) Please <b>DO</b> use the ardour-users mailing list to discuss ideas and "
+"pass on comments.\n"
+"6) Please <b>DO</b> join us on IRC for real time discussions about %1 %2. "
+"You\n"
+"   can get there directly from within the program via the Help->Chat menu "
+"option.\n"
+"\n"
+"Full information on all the above can be found on the support page at\n"
+"\n"
+"                http://ardour.org/support\n"
+msgstr ""
+
+#: ardour_ui.cc:613
+msgid ""
+"The audio backend was shutdown because:\n"
+"\n"
+"%1"
+msgstr ""
+
+#: ardour_ui.cc:615
+msgid ""
+"The audio backend has either been shutdown or it\n"
+"disconnected %1 because %1\n"
+"was not fast enough. Try to restart\n"
+"the audio backend and save the session."
+msgstr ""
+
+#: ardour_ui.cc:639
+msgid ""
+"Audio Unit Plugin Scan Failed. Automatic AU scanning has been disabled. "
+"Please see the log window for further details."
+msgstr ""
+
+#: ardour_ui.cc:640
+msgid "Audio Unit Plugin Scan Failed:"
+msgstr ""
+
+#: ardour_ui.cc:1008
+msgid "NSM server did not announce itself"
+msgstr ""
+
+#: ardour_ui.cc:1021
+msgid "NSM: no client ID provided"
+msgstr ""
+
+#: ardour_ui.cc:1028
+msgid "NSM: no session created"
+msgstr ""
+
+#: ardour_ui.cc:1051
+msgid "NSM: initialization failed"
+msgstr ""
+
+#: ardour_ui.cc:1083
+msgid "Free/Demo Version Warning"
+msgstr ""
+
+#: ardour_ui.cc:1085
+msgid "Subscribe and support development of %1"
+msgstr ""
+
+#: ardour_ui.cc:1086
+msgid "Don't warn me about this again"
+msgstr ""
+
+#: ardour_ui.cc:1088
+msgid ""
+"<span weight=\"bold\" size=\"large\">%1</span>\n"
+"\n"
+"<b>%2</b>\n"
+"\n"
+"<i>%3</i>\n"
+"\n"
+"%4"
+msgstr ""
+
+#: ardour_ui.cc:1089
+msgid "This is a free/demo version of %1"
+msgstr ""
+
+#: ardour_ui.cc:1090
+msgid "It will not restore OR save any plugin settings"
+msgstr ""
+
+#: ardour_ui.cc:1091
+msgid ""
+"If you load an existing session with plugin settings\n"
+"they will not be used and will be lost."
+msgstr ""
+
+#: ardour_ui.cc:1093 plugin_ui.cc:586
+msgid ""
+"To get full access to updates without this limitation\n"
+"consider becoming a subscriber for a low cost every month."
+msgstr ""
+
+#: ardour_ui.cc:1103
+msgid "Quit now"
+msgstr ""
+
+#: ardour_ui.cc:1104
+msgid "Continue using %1"
+msgstr ""
+
+#: ardour_ui.cc:1135 startup.cc:349
+msgid "%1 is ready for use"
+msgstr ""
+
+#: ardour_ui.cc:1185
+msgid ""
+"WARNING: Your system has a limit for maximum amount of locked memory. This "
+"might cause %1 to run out of memory before your system runs out of memory. \n"
+"\n"
+"You can view the memory limit with 'ulimit -l', and it is normally "
+"controlled by %2"
+msgstr ""
+
+#: ardour_ui.cc:1202
+msgid "Do not show this window again"
+msgstr ""
+
+#: ardour_ui.cc:1245
+msgid "Don't quit"
+msgstr ""
+
+#: ardour_ui.cc:1246
+msgid "Just quit"
+msgstr ""
+
+#: ardour_ui.cc:1247 ardour_ui.cc:5362
+msgid "Save and quit"
+msgstr ""
+
+#: ardour_ui.cc:1257
+msgid ""
+"%1 was unable to save your session.\n"
+"\n"
+"If you still wish to quit, please use the\n"
+"\n"
+"\"Just quit\" option."
+msgstr ""
+
+#: ardour_ui.cc:1307
+msgid "Unsaved Session"
+msgstr ""
+
+#: ardour_ui.cc:1328
+msgid ""
+"The session \"%1\"\n"
+"has not been saved.\n"
+"\n"
+"Any changes made this time\n"
+"will be lost unless you save it.\n"
+"\n"
+"What do you want to do?"
+msgstr ""
+
+#: ardour_ui.cc:1331
+msgid ""
+"The snapshot \"%1\"\n"
+"has not been saved.\n"
+"\n"
+"Any changes made this time\n"
+"will be lost unless you save it.\n"
+"\n"
+"What do you want to do?"
+msgstr ""
+
+#: ardour_ui.cc:1345
+msgid "Prompter"
+msgstr ""
+
+#: ardour_ui.cc:1459 ardour_ui.cc:1467
+msgid "Audio: <span foreground=\"red\">none</span>"
+msgstr ""
+
+#: ardour_ui.cc:1471
+#, c-format
+msgid "Audio: <span foreground=\"green\">%.1f kHz / %4.1f ms</span>"
+msgstr ""
+
+#: ardour_ui.cc:1475
+#, c-format
+msgid "Audio: <span foreground=\"green\">%<PRId64> kHz / %4.1f ms</span>"
+msgstr ""
+
+#: ardour_ui.cc:1493 export_report.cc:108 export_report.cc:323
+#: export_video_dialog.cc:76
+msgid "File:"
+msgstr ""
+
+#: ardour_ui.cc:1497
+msgid "BWF"
+msgstr ""
+
+#: ardour_ui.cc:1500
+msgid "WAV"
+msgstr ""
+
+#: ardour_ui.cc:1503
+msgid "WAV64"
+msgstr ""
+
+#: ardour_ui.cc:1506 session_option_editor.cc:202
+msgid "CAF"
+msgstr ""
+
+#: ardour_ui.cc:1509
+msgid "AIFF"
+msgstr ""
+
+#: ardour_ui.cc:1512
+msgid "iXML"
+msgstr ""
+
+#: ardour_ui.cc:1515 session_option_editor.cc:203
+msgid "RF64"
+msgstr ""
+
+#: ardour_ui.cc:1518
+msgid "RF64/WAV"
+msgstr ""
+
+#: ardour_ui.cc:1521
+msgid "MBWF"
+msgstr ""
+
+#: ardour_ui.cc:1529
+msgid "32-float"
+msgstr ""
+
+#: ardour_ui.cc:1532
+msgid "24-int"
+msgstr ""
+
+#: ardour_ui.cc:1535
+msgid "16-int"
+msgstr ""
+
+#: ardour_ui.cc:1556
+#, c-format
+msgid "X: <span foreground=\"%s\">>10K</span>"
+msgstr ""
+
+#: ardour_ui.cc:1558
+#, c-format
+msgid "X: <span foreground=\"%s\">%u</span>"
+msgstr ""
+
+#: ardour_ui.cc:1561
+#, c-format
+msgid "X: <span foreground=\"%s\">?</span>"
+msgstr ""
+
+#: ardour_ui.cc:1564
+msgid "Audio dropouts. Shift+click to reset"
+msgstr ""
+
+#: ardour_ui.cc:1577
+#, c-format
+msgid "DSP: <span foreground=\"%s\">%5.1f%%</span>"
+msgstr ""
+
+#: ardour_ui.cc:1587
+#, c-format
+msgid "PkBld: <span foreground=\"%s\">%d</span>"
+msgstr ""
+
+#: ardour_ui.cc:1609
+#, c-format
+msgid ""
+"Buffers: <span foreground=\"green\">p:</span><span foreground=\"%s\">"
+"%<PRIu32>%%</span> <span foreground=\"green\">c:</span><span foreground=\"%s"
+"\">%<PRIu32>%%</span>"
+msgstr ""
+
+#: ardour_ui.cc:1650
+msgid "Disk: <span foreground=\"green\">Unknown</span>"
+msgstr ""
+
+#: ardour_ui.cc:1652
+msgid "Disk: <span foreground=\"green\">24hrs+</span>"
+msgstr ""
+
+#: ardour_ui.cc:1670
+msgid "Disk: <span foreground=\"green\">>24 hrs</span>"
+msgstr ""
+
+#: ardour_ui.cc:1681
+#, c-format
+msgid "Disk: <span foreground=\"%s\">%02dh:%02dm:%02ds</span>"
+msgstr ""
+
+#: ardour_ui.cc:1707
+#, c-format
+msgid "Timecode|TC: <span foreground=\"%s\">%s</span>"
+msgstr ""
+
+#: ardour_ui.cc:1789
+msgid ""
+"%1 is not connected to any audio backend.\n"
+"You cannot open or close sessions in this condition"
+msgstr ""
+
+#: ardour_ui.cc:1807
+msgid "Open Session"
+msgstr ""
+
+#: ardour_ui.cc:1831 session_dialog.cc:410 session_import_dialog.cc:170
+#: session_metadata_dialog.cc:861
+msgid "%1 sessions"
+msgstr ""
+
+#: ardour_ui.cc:1879 ardour_ui.cc:1916
+msgid "You cannot add a track without a session already loaded."
+msgstr ""
+
+#: ardour_ui.cc:1887
+msgid "could not create %1 new mixed track"
+msgid_plural "could not create %1 new mixed tracks"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ardour_ui.cc:1924
+msgid "could not create %1 new Midi Bus"
+msgid_plural "could not create %1 new Midi Busses"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ardour_ui.cc:1977
+msgid "You cannot add a track or bus without a session already loaded."
+msgstr ""
+
+#: ardour_ui.cc:1986
+msgid "could not create %1 new audio track"
+msgid_plural "could not create %1 new audio tracks"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ardour_ui.cc:1995
+msgid "could not create %1 new audio bus"
+msgid_plural "could not create %1 new audio busses"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ardour_ui.cc:2020
+msgid ""
+"There are insufficient ports available\n"
+"to create a new track or bus.\n"
+"You should save %1, exit and\n"
+"restart with more ports."
+msgstr ""
+
+#: ardour_ui.cc:2164
+msgid ""
+"Please create one or more tracks before trying to record.\n"
+"You can do this with the \"Add Track or Bus\" option in the Session menu."
+msgstr ""
+
+#: ardour_ui.cc:2565
+#, c-format
+msgid "Copied %<PRId64> of %<PRId64>"
+msgstr ""
+
+#: ardour_ui.cc:2619 save_as_dialog.cc:33
+msgid "Save As"
+msgstr ""
+
+#: ardour_ui.cc:2647
+msgid "Save As failed: %1"
+msgstr ""
+
+#: ardour_ui.cc:2684
+msgid ""
+"To ensure compatibility with various systems\n"
+"snapshot names may not contain a '%1' character"
+msgstr ""
+
+#: ardour_ui.cc:2698
+msgid "Confirm Snapshot Overwrite"
+msgstr ""
+
+#: ardour_ui.cc:2699
+msgid "A snapshot already exists with that name. Do you want to overwrite it?"
+msgstr ""
+
+#: ardour_ui.cc:2724
+msgid "Snapshot and switch"
+msgstr ""
+
+#: ardour_ui.cc:2725 ardour_ui.cc:2776
+msgid "New session name"
+msgstr ""
+
+#: ardour_ui.cc:2727
+msgid "Take Snapshot"
+msgstr ""
+
+#: ardour_ui.cc:2728
+msgid "Name of new snapshot"
+msgstr ""
+
+#: ardour_ui.cc:2775
+msgid "Rename Session"
+msgstr ""
+
+#: ardour_ui.cc:2790 ardour_ui.cc:3267 ardour_ui.cc:3305
+msgid ""
+"To ensure compatibility with various systems\n"
+"session names may not contain a '%1' character"
+msgstr ""
+
+#: ardour_ui.cc:2798
+msgid ""
+"That name is already in use by another directory/folder. Please try again."
+msgstr ""
+
+#: ardour_ui.cc:2807
+msgid ""
+"Renaming this session failed.\n"
+"Things could be seriously messed up at this point"
+msgstr ""
+
+#: ardour_ui.cc:2923 route_ui.cc:1871
+msgid "Confirm Template Overwrite"
+msgstr ""
+
+#: ardour_ui.cc:2924 route_ui.cc:1872
+msgid "A template already exists with that name. Do you want to overwrite it?"
+msgstr ""
+
+#: ardour_ui.cc:2948
+msgid "Save Template"
+msgstr ""
+
+#: ardour_ui.cc:2949
+msgid "Name for template:"
+msgstr ""
+
+#: ardour_ui.cc:2950
+msgid "-template"
+msgstr ""
+
+#: ardour_ui.cc:2987
+msgid ""
+"This session\n"
+"%1\n"
+"already exists. Do you want to open it?"
+msgstr ""
+
+#: ardour_ui.cc:2997
+msgid "Open Existing Session"
+msgstr ""
+
+#: ardour_ui.cc:3295
+msgid "There is no existing session at \"%1\""
+msgstr ""
+
+#: ardour_ui.cc:3391
+msgid "Please wait while %1 loads your session"
+msgstr ""
+
+#: ardour_ui.cc:3406
+msgid "Port Registration Error"
+msgstr ""
+
+#: ardour_ui.cc:3407
+msgid "Click the Close button to try again."
+msgstr ""
+
+#: ardour_ui.cc:3426
+msgid "Session \"%1 (snapshot %2)\" did not load successfully: %3"
+msgstr ""
+
+#: ardour_ui.cc:3432 ardour_ui.cc:3453 ardour_ui.cc:3548 ardour_ui.cc:3557
+msgid "Loading Error"
+msgstr ""
+
+#: ardour_ui.cc:3447
+msgid "Session \"%1 (snapshot %2)\" did not load successfully"
+msgstr ""
+
+#: ardour_ui.cc:3475
+msgid ""
+"This session has been opened in read-only mode.\n"
+"\n"
+"You will not be able to record or save."
+msgstr ""
+
+#: ardour_ui.cc:3480
+msgid "Read-only Session"
+msgstr ""
+
+#: ardour_ui.cc:3547
+msgid "Could not create session in \"%1\": %2"
+msgstr ""
+
+#: ardour_ui.cc:3556
+msgid "Could not create session in \"%1\""
+msgstr ""
+
+#: ardour_ui.cc:3601
+msgid ""
+"<b>Just ask and wait for an answer.\n"
+"It may take from minutes to hours.</b>"
+msgstr ""
+
+#: ardour_ui.cc:3603
+msgid "About the Chat"
+msgstr ""
+
+#: ardour_ui.cc:3604
+msgid ""
+"When you're inside the chat just ask your question and wait for an answer. "
+"The chat is occupied by real people with real lives so many of them are "
+"passively online and might not read your question before minutes or hours "
+"later.\n"
+"So please be patient and wait for an answer.\n"
+"\n"
+"You should just leave the chat window open and check back regularly until "
+"someone has answered your question."
+msgstr ""
+
+#: ardour_ui.cc:3723
+msgid "No files were ready for clean-up"
+msgstr ""
+
+#: ardour_ui.cc:3727 ardour_ui.cc:3737 ardour_ui.cc:3870 ardour_ui.cc:3877
+#: ardour_ui_ed.cc:129
+msgid "Clean-up"
+msgstr ""
+
+#: ardour_ui.cc:3728
+msgid ""
+"If this seems suprising, \n"
+"check for any existing snapshots.\n"
+"These may still include regions that\n"
+"require some unused files to continue to exist."
+msgstr ""
+
+#: ardour_ui.cc:3787
+msgid "kilo"
+msgstr ""
+
+#: ardour_ui.cc:3790
+msgid "mega"
+msgstr ""
+
+#: ardour_ui.cc:3793
+msgid "giga"
+msgstr ""
+
+#: ardour_ui.cc:3798
+msgid ""
+"The following file was deleted from %2,\n"
+"releasing %3 %4bytes of disk space"
+msgid_plural ""
+"The following %1 files were deleted from %2,\n"
+"releasing %3 %4bytes of disk space"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ardour_ui.cc:3805
+msgid ""
+"The following file was not in use and \n"
+"has been moved to: %2\n"
+"\n"
+"After a restart of %5\n"
+"\n"
+"<span face=\"mono\">Session -> Clean-up -> Flush Wastebasket</span>\n"
+"\n"
+"will release an additional %3 %4bytes of disk space.\n"
+msgid_plural ""
+"The following %1 files were not in use and \n"
+"have been moved to: %2\n"
+"\n"
+"After a restart of %5\n"
+"\n"
+"<span face=\"mono\">Session -> Clean-up -> Flush Wastebasket</span>\n"
+"\n"
+"will release an additional %3 %4bytes of disk space.\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ardour_ui.cc:3865
+msgid "Are you sure you want to clean-up?"
+msgstr ""
+
+#: ardour_ui.cc:3872
+msgid ""
+"Clean-up is a destructive operation.\n"
+"ALL undo/redo information will be lost if you clean-up.\n"
+"Clean-up will move all unused files to a \"dead\" location."
+msgstr ""
+
+#: ardour_ui.cc:3880
+msgid "CleanupDialog"
+msgstr ""
+
+#: ardour_ui.cc:3910
+msgid "Cleaned Files"
+msgstr ""
+
+#: ardour_ui.cc:3927
+msgid "deleted file"
+msgstr ""
+
+#: ardour_ui.cc:4133
+msgid "Cannot read session script '%1': %2"
+msgstr ""
+
+#: ardour_ui.cc:4142 luainstance.cc:1104
+msgid "Set Script Parameters"
+msgstr ""
+
+#: ardour_ui.cc:4153
+msgid "Session script '%1' instantiation failed: %2"
+msgstr ""
+
+#: ardour_ui.cc:4157
+msgid "Loading Session script '%1' failed: %2"
+msgstr ""
+
+#: ardour_ui.cc:4170
+msgid "There are no active Lua session scripts present in this session."
+msgstr ""
+
+#: ardour_ui.cc:4187
+msgid "Session script '%1' removal failed: %2"
+msgstr ""
+
+#: ardour_ui.cc:4197
+msgid "Video-Server was not launched by %1. The request to stop it is ignored."
+msgstr ""
+
+#: ardour_ui.cc:4201
+msgid "Stop Video-Server"
+msgstr ""
+
+#: ardour_ui.cc:4202
+msgid "Do you really want to stop the Video Server?"
+msgstr ""
+
+#: ardour_ui.cc:4205
+msgid "Yes, Stop It"
+msgstr ""
+
+#: ardour_ui.cc:4231
+msgid "The Video Server is already started."
+msgstr ""
+
+#: ardour_ui.cc:4233
+msgid ""
+"An external Video Server is configured and can be reached. Not starting a "
+"new instance."
+msgstr ""
+
+#: ardour_ui.cc:4241 ardour_ui.cc:4346
+msgid ""
+"Could not connect to the Video Server. Start it or configure its access URL "
+"in Preferences."
+msgstr ""
+
+#: ardour_ui.cc:4271
+msgid "Specified docroot is not an existing directory."
+msgstr ""
+
+#: ardour_ui.cc:4277 ardour_ui.cc:4283
+msgid "Given Video Server is not an executable file."
+msgstr ""
+
+#: ardour_ui.cc:4317
+msgid "Cannot launch the video-server"
+msgstr ""
+
+#: ardour_ui.cc:4327
+msgid "Video-server was started but does not respond to requests..."
+msgstr ""
+
+#: ardour_ui.cc:4372 editor_audio_import.cc:647
+msgid "could not open %1"
+msgstr ""
+
+#: ardour_ui.cc:4376
+msgid "no video-file selected"
+msgstr ""
+
+#: ardour_ui.cc:4472
+msgid "No LTC detected, video will not be aligned."
+msgstr ""
+
+#: ardour_ui.cc:4478
+msgid "Align video-start to %1 [samples]"
+msgstr ""
+
+#: ardour_ui.cc:4654
+msgid "xrun"
+msgstr ""
+
+#: ardour_ui.cc:4663
+msgid "Recording was stopped because your system could not keep up."
+msgstr ""
+
+#: ardour_ui.cc:4692
+msgid ""
+"The disk system on your computer\n"
+"was not able to keep up with %1.\n"
+"\n"
+"Specifically, it failed to write data to disk\n"
+"quickly enough to keep up with recording.\n"
+msgstr ""
+
+#: ardour_ui.cc:4765
+msgid "Scanning for plugins"
+msgstr ""
+
+#: ardour_ui.cc:4767
+msgid "Cancel plugin scan"
+msgstr ""
+
+#: ardour_ui.cc:4776
+msgid "Stop Timeout"
+msgstr ""
+
+#: ardour_ui.cc:4783
+msgid "Scan Timeout"
+msgstr ""
+
+#: ardour_ui.cc:4827
+msgid ""
+"The disk system on your computer\n"
+"was not able to keep up with %1.\n"
+"\n"
+"Specifically, it failed to read data from disk\n"
+"quickly enough to keep up with playback.\n"
+msgstr ""
+
+#: ardour_ui.cc:4862
+msgid "Crash Recovery"
+msgstr ""
+
+#: ardour_ui.cc:4863
+msgid ""
+"This session appears to have been in the\n"
+"middle of recording when %1 or\n"
+"the computer was shutdown.\n"
+"\n"
+"%1 can recover any captured audio for\n"
+"you, or it can ignore it. Please decide\n"
+"what you would like to do.\n"
+msgstr ""
+
+#: ardour_ui.cc:4875
+msgid "Ignore crash data"
+msgstr ""
+
+#: ardour_ui.cc:4876
+msgid "Recover from crash"
+msgstr ""
+
+#: ardour_ui.cc:4896
+msgid "Sample Rate Mismatch"
+msgstr ""
+
+#: ardour_ui.cc:4897
+msgid ""
+"This session was created with a sample rate of %1 Hz, but\n"
+"%2 is currently running at %3 Hz.  If you load this session,\n"
+"audio may be played at the wrong sample rate.\n"
+msgstr ""
+
+#: ardour_ui.cc:4906
+msgid "Do not load session"
+msgstr ""
+
+#: ardour_ui.cc:4907
+msgid "Load session anyway"
+msgstr ""
+
+#: ardour_ui.cc:4927
+msgid ""
+"This session was created with a sample rate of %1 Hz, but\n"
+"%2 is currently running at %3 Hz.\n"
+"Audio will be recorded and played at the wrong sample rate.\n"
+"Re-Configure the Audio Engine in\n"
+"Menu > Window > Audio/Midi Setup"
+msgstr ""
+
+#: ardour_ui.cc:5209
+msgid ""
+"%4This is a session from an older version of %3%5\n"
+"\n"
+"%3 has copied the old session file\n"
+"\n"
+"%6%1%7\n"
+"\n"
+"to\n"
+"\n"
+"%6%2%7\n"
+"\n"
+"From now on, use the backup copy with older versions of %3"
+msgstr ""
+
+#: ardour_ui.cc:5331
+msgid "This is a free/demo copy of %1. It has just switched to silent mode."
+msgstr ""
+
+#: ardour_ui.cc:5337
+msgid "%1 is now silent"
+msgstr ""
+
+#: ardour_ui.cc:5339
+msgid ""
+"Please consider paying for a copy of %1 - you can pay whatever you want."
+msgstr ""
+
+#: ardour_ui.cc:5340
+msgid "Better yet become a subscriber - subscriptions start at US$1 per month."
+msgstr ""
+
+#: ardour_ui.cc:5341
+msgid "Pay for a copy (via the web)"
+msgstr ""
+
+#: ardour_ui.cc:5342
+msgid "Become a subscriber (via the web)"
+msgstr ""
+
+#: ardour_ui.cc:5361
+msgid "Remain silent"
+msgstr ""
+
+#: ardour_ui.cc:5363
+msgid "Give me more time"
+msgstr ""
+
+#: ardour_ui.cc:5656
+msgid "Global keybindings are missing"
+msgstr ""
+
+#: ardour_ui2.cc:79
+msgid "Play from playhead"
+msgstr ""
+
+#: ardour_ui2.cc:80
+msgid "Stop playback"
+msgstr ""
+
+#: ardour_ui2.cc:81
+msgid "Toggle record"
+msgstr ""
+
+#: ardour_ui2.cc:82
+msgid "Play range/selection"
+msgstr ""
+
+#: ardour_ui2.cc:83
+msgid "Go to start of session"
+msgstr ""
+
+#: ardour_ui2.cc:84
+msgid "Go to end of session"
+msgstr ""
+
+#: ardour_ui2.cc:85
+msgid "Play loop range"
+msgstr ""
+
+#: ardour_ui2.cc:86
+msgid ""
+"MIDI Panic\n"
+"Send note off and reset controller messages on all MIDI channels"
+msgstr ""
+
+#: ardour_ui2.cc:87
+msgid "Return to last playback start when stopped"
+msgstr ""
+
+#: ardour_ui2.cc:88
+msgid "Playhead follows range selections and edits"
+msgstr ""
+
+#: ardour_ui2.cc:89
+msgid "Be sensible about input monitoring"
+msgstr ""
+
+#: ardour_ui2.cc:90
+msgid "Enable/Disable audio click"
+msgstr ""
+
+#: ardour_ui2.cc:91 monitor_section.cc:129
+msgid ""
+"When active, something is soloed.\n"
+"Click to de-solo everything"
+msgstr ""
+
+#: ardour_ui2.cc:92
+msgid ""
+"When active, auditioning is taking place.\n"
+"Click to stop the audition"
+msgstr ""
+
+#: ardour_ui2.cc:93
+msgid "When active, there is a feedback loop."
+msgstr ""
+
+#: ardour_ui2.cc:94
+msgid ""
+"<b>Primary Clock</b> right-click to set display mode. Click to edit, click"
+"+drag a digit or mouse-over+scroll wheel to modify.\n"
+"Text edits: right-to-left overwrite <tt>Esc</tt>: cancel; <tt>Enter</tt>: "
+"confirm; postfix the edit with '+' or '-' to enter delta times.\n"
+msgstr ""
+
+#: ardour_ui2.cc:95
+msgid ""
+"<b>Secondary Clock</b> right-click to set display mode. Click to edit, click"
+"+drag a digit or mouse-over+scroll wheel to modify.\n"
+"Text edits: right-to-left overwrite <tt>Esc</tt>: cancel; <tt>Enter</tt>: "
+"confirm; postfix the edit with '+' or '-' to enter delta times.\n"
+msgstr ""
+
+#: ardour_ui2.cc:96
+msgid "Reset All Peak Indicators"
+msgstr ""
+
+#: ardour_ui2.cc:97
+msgid "Show Error Log and acknowledge warnings"
+msgstr ""
+
+#: ardour_ui2.cc:130
+msgid "[ERROR]: "
+msgstr ""
+
+#: ardour_ui2.cc:133
+msgid "[WARNING]: "
+msgstr ""
+
+#: ardour_ui2.cc:136
+msgid "[INFO]: "
+msgstr ""
+
+#: ardour_ui2.cc:197 ardour_ui_ed.cc:509
+msgid "Auto Return"
+msgstr ""
+
+#: ardour_ui2.cc:199 ardour_ui_ed.cc:512
+msgid "Follow Edits"
+msgstr ""
+
+#: ardour_ui2.cc:422 ardour_ui2.cc:426 ardour_ui2.cc:430
+msgid ""
+"Drag this tab to the desktop to show %1 in its own window\n"
+"\n"
+"To put the window back, use the Window > %1 > Attach menu action"
+msgstr ""
+
+#: ardour_ui2.cc:638
+msgid "GUI"
+msgstr ""
+
+#: ardour_ui2.cc:651 rc_option_editor.cc:1941 rc_option_editor.cc:1943
+#: rc_option_editor.cc:1945
+msgid "Misc/Click"
+msgstr ""
+
+#: ardour_ui_dependents.cc:118
+msgid "Setup Editor"
+msgstr ""
+
+#: ardour_ui_dependents.cc:120
+msgid "Setup Mixer"
+msgstr ""
+
+#: ardour_ui_dependents.cc:127
+msgid "Reload Session History"
+msgstr ""
+
+#: ardour_ui_dependents.cc:248
+msgid "UI: cannot setup editor"
+msgstr ""
+
+#: ardour_ui_dependents.cc:253
+msgid "UI: cannot setup mixer"
+msgstr ""
+
+#: ardour_ui_dependents.cc:258
+msgid "UI: cannot setup meterbridge"
+msgstr ""
+
+#: ardour_ui_dependents.cc:263
+msgid "UI: cannot setup luawindow"
+msgstr ""
+
+#: ardour_ui_dependents.cc:269 ardour_ui_ed.cc:136 ardour_ui_ed.cc:257
+#: rc_option_editor.cc:1853 rc_option_editor.cc:3494
+msgid "Preferences"
+msgstr ""
+
+#: ardour_ui_dependents.cc:270 ardour_ui_ed.cc:134 mixer_ui.cc:100
+#: mixer_ui.cc:410
+msgid "Mixer"
+msgstr ""
+
+#: ardour_ui_dependents.cc:271 ardour_ui_ed.cc:135 editor.cc:5791
+#: editor.cc:6063 public_editor.cc:34 rc_option_editor.cc:2201
+#: rc_option_editor.cc:2215 rc_option_editor.cc:2219 rc_option_editor.cc:2227
+#: rc_option_editor.cc:2236 rc_option_editor.cc:2244 rc_option_editor.cc:2253
+#: rc_option_editor.cc:2261 rc_option_editor.cc:2269 rc_option_editor.cc:2279
+#: rc_option_editor.cc:2281 rc_option_editor.cc:2305 rc_option_editor.cc:2317
+#: rc_option_editor.cc:2328 rc_option_editor.cc:2346
+msgid "Editor"
+msgstr ""
+
+#: ardour_ui_dialogs.cc:263
+msgid "Don't close"
+msgstr ""
+
+#: ardour_ui_dialogs.cc:264
+msgid "Just close"
+msgstr ""
+
+#: ardour_ui_dialogs.cc:265
+msgid "Save and close"
+msgstr ""
+
+#: ardour_ui_ed.cc:124
+msgid "Escape"
+msgstr ""
+
+#: ardour_ui_ed.cc:128
+msgid "Session"
+msgstr ""
+
+#: ardour_ui_ed.cc:131 editor_actions.cc:141 editor_regions.cc:163
+#: port_group.cc:469 session_option_editor.cc:82 session_option_editor.cc:89
+msgid "Sync"
+msgstr ""
+
+#: ardour_ui_ed.cc:132
+msgid "Options"
+msgstr ""
+
+#: ardour_ui_ed.cc:133
+msgid "Window"
+msgstr ""
+
+#: ardour_ui_ed.cc:137 ardour_ui_ed.cc:267 ardour_ui_ed.cc:268
+#: ardour_ui_ed.cc:269
+msgid "Detach"
+msgstr ""
+
+#: ardour_ui_ed.cc:138
+msgid "Help"
+msgstr ""
+
+#: ardour_ui_ed.cc:139
+msgid "Misc. Shortcuts"
+msgstr ""
+
+#: ardour_ui_ed.cc:140
+msgid "Audio File Format"
+msgstr ""
+
+#: ardour_ui_ed.cc:141
+msgid "File Type"
+msgstr ""
+
+#: ardour_ui_ed.cc:142 export_format_dialog.cc:75
+msgid "Sample Format"
+msgstr ""
+
+#: ardour_ui_ed.cc:143 rc_option_editor.cc:2841
+msgid "Control Surfaces"
+msgstr ""
+
+#: ardour_ui_ed.cc:144 rc_option_editor.cc:2847 rc_option_editor.cc:2853
+#: rc_option_editor.cc:2862 rc_option_editor.cc:2873 rc_option_editor.cc:2883
+#: rc_option_editor.cc:2948 rc_option_editor.cc:2969 rc_option_editor.cc:2985
+#: rc_option_editor.cc:2986 rc_option_editor.cc:2995 rc_option_editor.cc:3009
+#: rc_option_editor.cc:3012 rc_option_editor.cc:3020 rc_option_editor.cc:3028
+msgid "Plugins"
+msgstr ""
+
+#: ardour_ui_ed.cc:145 rc_option_editor.cc:3176
+msgid "Metering"
+msgstr ""
+
+#: ardour_ui_ed.cc:146
+msgid "Fall Off Rate"
+msgstr ""
+
+#: ardour_ui_ed.cc:147
+msgid "Hold Time"
+msgstr ""
+
+#: ardour_ui_ed.cc:148
+msgid "Denormal Handling"
+msgstr ""
+
+#: ardour_ui_ed.cc:152 route_time_axis.cc:1683
+msgid "New..."
+msgstr ""
+
+#: ardour_ui_ed.cc:154
+msgid "Open..."
+msgstr ""
+
+#: ardour_ui_ed.cc:155
+msgid "Recent..."
+msgstr ""
+
+#: ardour_ui_ed.cc:156 panner_editor.cc:29 playlist_selector.cc:64
+msgid "Close"
+msgstr ""
+
+#: ardour_ui_ed.cc:159
+msgid "Add Track or Bus..."
+msgstr ""
+
+#: ardour_ui_ed.cc:163
+msgid "Duplicate Tracks/Busses..."
+msgstr ""
+
+#: ardour_ui_ed.cc:169
+msgid "Cancel Solo"
+msgstr ""
+
+#: ardour_ui_ed.cc:173
+msgid "Session|Scripting"
+msgstr ""
+
+#: ardour_ui_ed.cc:176
+msgid "Add Lua Script..."
+msgstr ""
+
+#: ardour_ui_ed.cc:180
+msgid "Remove Lua Script"
+msgstr ""
+
+#: ardour_ui_ed.cc:184
+msgid "Open Video..."
+msgstr ""
+
+#: ardour_ui_ed.cc:187
+msgid "Remove Video"
+msgstr ""
+
+#: ardour_ui_ed.cc:190
+msgid "Export to Video File..."
+msgstr ""
+
+#: ardour_ui_ed.cc:194
+msgid "Snapshot (& keep working on current version) ..."
+msgstr ""
+
+#: ardour_ui_ed.cc:197
+msgid "Snapshot (& switch to new version) ..."
+msgstr ""
+
+#: ardour_ui_ed.cc:200
+msgid "Quick Snapshot (& keep working on current version) ..."
+msgstr ""
+
+#: ardour_ui_ed.cc:203
+msgid "Quick Snapshot (& switch to new version) ..."
+msgstr ""
+
+#: ardour_ui_ed.cc:207
+msgid "Save As..."
+msgstr ""
+
+#: ardour_ui_ed.cc:210 editor_actions.cc:1788 editor_markers.cc:908
+#: editor_snapshots.cc:136 mixer_strip.cc:1661 route_time_axis.cc:1679
+msgid "Rename..."
+msgstr ""
+
+#: ardour_ui_ed.cc:214
+msgid "Save Template..."
+msgstr ""
+
+#: ardour_ui_ed.cc:217
+msgid "Metadata"
+msgstr ""
+
+#: ardour_ui_ed.cc:220
+msgid "Edit Metadata..."
+msgstr ""
+
+#: ardour_ui_ed.cc:223
+msgid "Import Metadata..."
+msgstr ""
+
+#: ardour_ui_ed.cc:226
+msgid "Export to Audio File(s)..."
+msgstr ""
+
+#: ardour_ui_ed.cc:229
+msgid "Stem export..."
+msgstr ""
+
+#: ardour_ui_ed.cc:232 editor_export_audio.cc:66
+#: export_channel_selector.cc:190 export_channel_selector.cc:578
+#: export_dialog.cc:136 export_video_dialog.cc:80
+msgid "Export"
+msgstr ""
+
+#: ardour_ui_ed.cc:235
+msgid "Clean-up Unused Sources..."
+msgstr ""
+
+#: ardour_ui_ed.cc:239
+msgid "Reset Peak Files"
+msgstr ""
+
+#: ardour_ui_ed.cc:243
+msgid "Flush Wastebasket"
+msgstr ""
+
+#: ardour_ui_ed.cc:251
+msgid "Quit"
+msgstr ""
+
+#: ardour_ui_ed.cc:252 ardour_ui_ed.cc:259 ardour_ui_ed.cc:260
+#: ardour_ui_ed.cc:261 automation_time_axis.cc:545 editor_actions.cc:686
+#: editor_markers.cc:907 location_ui.cc:61 plugin_selector.cc:97
+#: route_time_axis.cc:864
+msgid "Hide"
+msgstr ""
+
+#: ardour_ui_ed.cc:263 ardour_ui_ed.cc:264 ardour_ui_ed.cc:265
+msgid "Attach"
+msgstr ""
+
+#: ardour_ui_ed.cc:275 ardour_ui_ed.cc:276 ardour_ui_ed.cc:277
+#: ardour_ui_ed.cc:283 ardour_ui_ed.cc:284 ardour_ui_ed.cc:285
+msgid "Change"
+msgstr ""
+
+#: ardour_ui_ed.cc:287
+msgid "Previous Tab"
+msgstr ""
+
+#: ardour_ui_ed.cc:288
+msgid "Next Tab"
+msgstr ""
+
+#: ardour_ui_ed.cc:290
+msgid "Toggle Editor & Mixer"
+msgstr ""
+
+#: ardour_ui_ed.cc:294
+msgid "Maximise Editor Space"
+msgstr ""
+
+#: ardour_ui_ed.cc:295
+msgid "Maximise Mixer Space"
+msgstr ""
+
+#: ardour_ui_ed.cc:298
+msgid "Toggle Mixer List"
+msgstr ""
+
+#: ardour_ui_ed.cc:301
+msgid "Toggle Monitor Section Visibility"
+msgstr ""
+
+#: ardour_ui_ed.cc:305
+msgid "Show more UI preferences"
+msgstr ""
+
+#: ardour_ui_ed.cc:308
+msgid "Window|Scripting"
+msgstr ""
+
+#: ardour_ui_ed.cc:309 meterbridge.cc:214 meterbridge.cc:220
+msgid "Window|Meterbridge"
+msgstr ""
+
+#: ardour_ui_ed.cc:311 midi_tracer.cc:45
+msgid "MIDI Tracer"
+msgstr ""
+
+#: ardour_ui_ed.cc:314
+msgid "Chat"
+msgstr ""
+
+#: ardour_ui_ed.cc:316
+msgid "Help|Manual"
+msgstr ""
+
+#: ardour_ui_ed.cc:317
+msgid "Manual|Reference"
+msgstr ""
+
+#: ardour_ui_ed.cc:318
+msgid "Report a Bug"
+msgstr ""
+
+#: ardour_ui_ed.cc:319
+msgid "Cheat Sheet"
+msgstr ""
+
+#: ardour_ui_ed.cc:320
+msgid "Ardour Website"
+msgstr ""
+
+#: ardour_ui_ed.cc:321
+msgid "Ardour Development"
+msgstr ""
+
+#: ardour_ui_ed.cc:322
+msgid "User Forums"
+msgstr ""
+
+#: ardour_ui_ed.cc:323
+msgid "How to Report a Bug"
+msgstr ""
+
+#: ardour_ui_ed.cc:325 luawindow.cc:100 luawindow.cc:654 plugin_ui.cc:420
+msgid "Save"
+msgstr ""
+
+#: ardour_ui_ed.cc:333 rc_option_editor.cc:1975 rc_option_editor.cc:1986
+#: rc_option_editor.cc:1997 rc_option_editor.cc:2008 rc_option_editor.cc:2017
+#: rc_option_editor.cc:2030 rc_option_editor.cc:2043 rc_option_editor.cc:2052
+#: rc_option_editor.cc:2062 rc_option_editor.cc:2079 rc_option_editor.cc:2186
+msgid "Transport"
+msgstr ""
+
+#: ardour_ui_ed.cc:339 engine_dialog.cc:88
+msgid "Stop"
+msgstr ""
+
+#: ardour_ui_ed.cc:342
+msgid "Roll"
+msgstr ""
+
+#: ardour_ui_ed.cc:346 ardour_ui_ed.cc:349
+msgid "Start/Stop"
+msgstr ""
+
+#: ardour_ui_ed.cc:352
+msgid "Start/Continue/Stop"
+msgstr ""
+
+#: ardour_ui_ed.cc:355
+msgid "Stop and Forget Capture"
+msgstr ""
+
+#: ardour_ui_ed.cc:365
+msgid "Transition to Roll"
+msgstr ""
+
+#: ardour_ui_ed.cc:369
+msgid "Transition to Reverse"
+msgstr ""
+
+#: ardour_ui_ed.cc:373
+msgid "Play Loop Range"
+msgstr ""
+
+#: ardour_ui_ed.cc:376
+msgid "Play Selection"
+msgstr ""
+
+#: ardour_ui_ed.cc:379
+msgid "Play Selection w/Preroll"
+msgstr ""
+
+#: ardour_ui_ed.cc:383
+msgid "Enable Record"
+msgstr ""
+
+#: ardour_ui_ed.cc:386 ardour_ui_ed.cc:390
+msgid "Start Recording"
+msgstr ""
+
+#: ardour_ui_ed.cc:394
+msgid "Rewind"
+msgstr ""
+
+#: ardour_ui_ed.cc:397
+msgid "Rewind (Slow)"
+msgstr ""
+
+#: ardour_ui_ed.cc:400
+msgid "Rewind (Fast)"
+msgstr ""
+
+#: ardour_ui_ed.cc:403
+msgid "Forward"
+msgstr ""
+
+#: ardour_ui_ed.cc:406
+msgid "Forward (Slow)"
+msgstr ""
+
+#: ardour_ui_ed.cc:409
+msgid "Forward (Fast)"
+msgstr ""
+
+#: ardour_ui_ed.cc:412
+msgid "Go to Zero"
+msgstr ""
+
+#: ardour_ui_ed.cc:415 ardour_ui_ed.cc:418
+msgid "Go to Start"
+msgstr ""
+
+#: ardour_ui_ed.cc:421
+msgid "Go to End"
+msgstr ""
+
+#: ardour_ui_ed.cc:424
+msgid "Go to Wall Clock"
+msgstr ""
+
+#: ardour_ui_ed.cc:429 ardour_ui_ed.cc:432
+msgid "Numpad Decimal"
+msgstr ""
+
+#: ardour_ui_ed.cc:435
+msgid "Numpad 0"
+msgstr ""
+
+#: ardour_ui_ed.cc:438
+msgid "Numpad 1"
+msgstr ""
+
+#: ardour_ui_ed.cc:441
+msgid "Numpad 2"
+msgstr ""
+
+#: ardour_ui_ed.cc:444
+msgid "Numpad 3"
+msgstr ""
+
+#: ardour_ui_ed.cc:447
+msgid "Numpad 4"
+msgstr ""
+
+#: ardour_ui_ed.cc:450
+msgid "Numpad 5"
+msgstr ""
+
+#: ardour_ui_ed.cc:453
+msgid "Numpad 6"
+msgstr ""
+
+#: ardour_ui_ed.cc:456
+msgid "Numpad 7"
+msgstr ""
+
+#: ardour_ui_ed.cc:459
+msgid "Numpad 8"
+msgstr ""
+
+#: ardour_ui_ed.cc:462
+msgid "Numpad 9"
+msgstr ""
+
+#: ardour_ui_ed.cc:466
+msgid "Focus On Clock"
+msgstr ""
+
+#: ardour_ui_ed.cc:470 ardour_ui_ed.cc:479 audio_clock.cc:2122 editor.cc:321
+#: editor_actions.cc:610 editor_actions.cc:619 export_timespan_selector.cc:95
+#: session_option_editor.cc:41 session_option_editor.cc:61
+#: session_option_editor.cc:80 session_option_editor.cc:96
+#: session_option_editor.cc:109 session_option_editor.cc:122
+#: session_option_editor.cc:124 session_option_editor.cc:126
+msgid "Timecode"
+msgstr ""
+
+#: ardour_ui_ed.cc:472 ardour_ui_ed.cc:481 editor_actions.cc:608
+msgid "Bars & Beats"
+msgstr ""
+
+#: ardour_ui_ed.cc:474 ardour_ui_ed.cc:483
+msgid "Minutes & Seconds"
+msgstr ""
+
+#: ardour_ui_ed.cc:476 ardour_ui_ed.cc:485 audio_clock.cc:2125 editor.cc:322
+#: editor_actions.cc:609
+msgid "Samples"
+msgstr ""
+
+#: ardour_ui_ed.cc:488
+msgid "Punch In"
+msgstr ""
+
+#: ardour_ui_ed.cc:489 mixer_strip.cc:2000 mixer_strip.cc:2201 route_ui.cc:191
+#: time_info_box.cc:110
+msgid "In"
+msgstr ""
+
+#: ardour_ui_ed.cc:492
+msgid "Punch Out"
+msgstr ""
+
+#: ardour_ui_ed.cc:493 mixer_strip.cc:2012 time_info_box.cc:111
+msgid "Out"
+msgstr ""
+
+#: ardour_ui_ed.cc:496
+msgid "Punch In/Out"
+msgstr ""
+
+#: ardour_ui_ed.cc:497
+msgid "In/Out"
+msgstr ""
+
+#: ardour_ui_ed.cc:500 rc_option_editor.cc:1941
+msgid "Click"
+msgstr ""
+
+#: ardour_ui_ed.cc:503
+msgid "Auto Input"
+msgstr ""
+
+#: ardour_ui_ed.cc:506
+msgid "Auto Play"
+msgstr ""
+
+#: ardour_ui_ed.cc:517
+msgid "Sync Startup to Video"
+msgstr ""
+
+#: ardour_ui_ed.cc:519
+msgid "Time Master"
+msgstr ""
+
+#: ardour_ui_ed.cc:521
+msgid "Use External Positional Sync Source"
+msgstr ""
+
+#: ardour_ui_ed.cc:526
+msgid "Toggle Record Enable Track %1"
+msgstr ""
+
+#: ardour_ui_ed.cc:533
+msgid "Percentage"
+msgstr ""
+
+#: ardour_ui_ed.cc:534 shuttle_control.cc:206
+msgid "Semitones"
+msgstr ""
+
+#: ardour_ui_ed.cc:538
+msgid "Send MTC"
+msgstr ""
+
+#: ardour_ui_ed.cc:540
+msgid "Send MMC"
+msgstr ""
+
+#: ardour_ui_ed.cc:542
+msgid "Use MMC"
+msgstr ""
+
+#: ardour_ui_ed.cc:544 rc_option_editor.cc:2730
+msgid "Send MIDI Clock"
+msgstr ""
+
+#: ardour_ui_ed.cc:546
+msgid "Send MIDI Feedback"
+msgstr ""
+
+#: ardour_ui_ed.cc:552
+msgid "Panic"
+msgstr ""
+
+#: ardour_ui_ed.cc:618
+msgid "Wall Clock"
+msgstr ""
+
+#: ardour_ui_ed.cc:620
+msgid "Disk Space"
+msgstr ""
+
+#: ardour_ui_ed.cc:621
+msgid "DSP"
+msgstr ""
+
+#: ardour_ui_ed.cc:622
+msgid "X-run"
+msgstr ""
+
+#: ardour_ui_ed.cc:623
+msgid "Active Peak-file Work"
+msgstr ""
+
+#: ardour_ui_ed.cc:624
+msgid "Buffers"
+msgstr ""
+
+#: ardour_ui_ed.cc:626
+msgid "Timecode Format"
+msgstr ""
+
+#: ardour_ui_ed.cc:627
+msgid "File Format"
+msgstr ""
+
+#: ardour_ui_options.cc:55
+msgid ""
+"It is not possible to use JACK as the the sync source\n"
+"when the pull up/down setting is non-zero."
+msgstr ""
+
+#: ardour_ui_options.cc:309
+msgid "Internal"
+msgstr ""
+
+#: ardour_ui_options.cc:518
+msgid "Enable/Disable external positional sync"
+msgstr ""
+
+#: ardour_ui_options.cc:520
+msgid "Sync to JACK is not possible: video pull up/down is set"
+msgstr ""
+
+#: audio_clock.cc:1057 audio_clock.cc:1076
+msgid "--pending--"
+msgstr ""
+
+#: audio_clock.cc:1128
+msgid "SR"
+msgstr ""
+
+#: audio_clock.cc:1134 audio_clock.cc:1138
+msgid "Pull"
+msgstr ""
+
+#: audio_clock.cc:1136
+#, c-format
+msgid "%+.4f%%"
+msgstr ""
+
+#: audio_clock.cc:1292 editor.cc:323 editor_actions.cc:142
+#: editor_actions.cc:602
+msgid "Tempo"
+msgstr ""
+
+#: audio_clock.cc:1296 editor.cc:324 editor_actions.cc:603
+msgid "Meter"
+msgstr ""
+
+#: audio_clock.cc:1878 audio_streamview.cc:117 editor_actions.cc:1092
+#: luainstance.cc:967 luainstance.cc:1593 plugin_pin_dialog.cc:859
+#: plugin_selector.cc:995 plugin_selector.cc:1016
+#: session_metadata_dialog.cc:455 session_metadata_dialog.cc:503
+#: session_metadata_dialog.cc:559 session_metadata_dialog.cc:848
+#: streamview.cc:474
+msgid "programming error: %1"
+msgstr ""
+
+#: audio_clock.cc:2011 audio_clock.cc:2039
+msgid "programming error: %1 %2"
+msgstr ""
+
+#: audio_clock.cc:2123 editor.cc:320 export_timespan_selector.cc:105
+msgid "Bars:Beats"
+msgstr ""
+
+#: audio_clock.cc:2124 export_timespan_selector.cc:100
+msgid "Minutes:Seconds"
+msgstr ""
+
+#: audio_clock.cc:2129
+msgid "Set from Playhead"
+msgstr ""
+
+#: audio_clock.cc:2130
+msgid "Locate to This Time"
+msgstr ""
+
+#: audio_clock.cc:2133
+msgid "Copy to clipboard"
+msgstr ""
+
+#: audio_region_editor.cc:60 control_point_dialog.cc:49 rhythm_ferret.cc:137
+#: rhythm_ferret.cc:154
+msgid "dB"
+msgstr ""
+
+#: audio_region_editor.cc:63
+msgid "Region gain:"
+msgstr ""
+
+#: audio_region_editor.cc:73 export_format_dialog.cc:49 export_report.cc:772
+#: export_report.cc:1185 fft_graph.cc:497 normalize_dialog.cc:49
+#: strip_silence_dialog.cc:67
+msgid "dBFS"
+msgstr ""
+
+#: audio_region_editor.cc:76
+msgid "Peak amplitude:"
+msgstr ""
+
+#: audio_region_editor.cc:87
+msgid "Calculating..."
+msgstr ""
+
+#: audio_region_view.cc:1385
+msgid "add gain control point"
+msgstr ""
+
+#: automation_controller.cc:304 automation_controller.cc:320
+msgid "Select Note..."
+msgstr ""
+
+#: automation_controller.cc:311
+msgid "Halve"
+msgstr ""
+
+#: automation_controller.cc:314
+msgid "Double"
+msgstr ""
+
+#: automation_controller.cc:325
+msgid "Set to %1 beat"
+msgid_plural "Set to %1 beats"
+msgstr[0] ""
+msgstr[1] ""
+
+#: automation_line.cc:292 editor_drag.cc:4387
+msgid "automation event move"
+msgstr ""
+
+#: automation_line.cc:888 region_gain_line.cc:75
+msgid "remove control point"
+msgstr ""
+
+#: automation_line.cc:1013
+msgid "Ignoring illegal points on AutomationLine \"%1\""
+msgstr ""
+
+#: automation_region_view.cc:193 automation_time_axis.cc:649
+msgid "add automation event"
+msgstr ""
+
+#: automation_streamview.cc:94
+msgid "unable to display automation region for control without list"
+msgstr ""
+
+#: automation_time_axis.cc:163
+msgid "automation state"
+msgstr ""
+
+#: automation_time_axis.cc:164
+msgid "hide track"
+msgstr ""
+
+#: automation_time_axis.cc:310 automation_time_axis.cc:362
+#: automation_time_axis.cc:556 gain_meter.cc:230 generic_pluginui.cc:601
+#: generic_pluginui.cc:949 panner_ui.cc:151
+msgid "Automation|Manual"
+msgstr ""
+
+#: automation_time_axis.cc:312 automation_time_axis.cc:373
+#: automation_time_axis.cc:561 editor.cc:2034 editor.cc:2112
+#: editor_actions.cc:125 editor_actions.cc:1937 gain_meter.cc:232
+#: generic_pluginui.cc:101 generic_pluginui.cc:604 generic_pluginui.cc:951
+#: midi_time_axis.cc:1610 midi_time_axis.cc:1613 midi_time_axis.cc:1616
+#: panner_ui.cc:154
+msgid "Play"
+msgstr ""
+
+#: automation_time_axis.cc:314 automation_time_axis.cc:384
+#: automation_time_axis.cc:566 gain_meter.cc:234 generic_pluginui.cc:103
+#: generic_pluginui.cc:607 generic_pluginui.cc:953 panner_ui.cc:157
+msgid "Write"
+msgstr ""
+
+#: automation_time_axis.cc:316 automation_time_axis.cc:395
+#: automation_time_axis.cc:571 gain_meter.cc:236 generic_pluginui.cc:105
+#: generic_pluginui.cc:610 generic_pluginui.cc:955 panner_ui.cc:160
+msgid "Touch"
+msgstr ""
+
+#: automation_time_axis.cc:406 generic_pluginui.cc:613 meter_patterns.cc:118
+msgid "???"
+msgstr ""
+
+#: automation_time_axis.cc:447
+msgid "clear automation"
+msgstr ""
+
+#: automation_time_axis.cc:547 rc_option_editor.cc:2919
+#: rc_option_editor.cc:2924 rc_option_editor.cc:2974 rc_option_editor.cc:2979
+msgid "Clear"
+msgstr ""
+
+#: automation_time_axis.cc:578
+msgid "State"
+msgstr ""
+
+#: automation_time_axis.cc:594
+msgid "Discrete"
+msgstr ""
+
+#: automation_time_axis.cc:600 export_format_dialog.cc:552
+msgid "Linear"
+msgstr ""
+
+#: automation_time_axis.cc:606 rhythm_ferret.cc:118 shuttle_control.cc:225
+msgid "Mode"
+msgstr ""
+
+#: bundle_manager.cc:182
+msgid "Disassociate"
+msgstr ""
+
+#: bundle_manager.cc:186
+msgid "Edit Bundle"
+msgstr ""
+
+#: bundle_manager.cc:201
+msgid "Direction:"
+msgstr ""
+
+#: bundle_manager.cc:206 bundle_manager.cc:210 engine_dialog.cc:976
+#: mixer_strip.cc:175 mixer_strip.cc:392 mixer_strip.cc:2459
+#: rc_option_editor.cc:3142
+msgid "Input"
+msgstr ""
+
+#: bundle_manager.cc:207 bundle_manager.cc:212 bundle_manager.cc:246
+#: engine_dialog.cc:978 mixer_strip.cc:179 mixer_strip.cc:396
+#: mixer_strip.cc:2462 monitor_section.cc:296 monitor_section.cc:300
+#: rc_option_editor.cc:3146
+msgid "Output"
+msgstr ""
+
+#: bundle_manager.cc:265 editor.cc:2076 editor_actions.cc:97
+#: editor_actions.cc:107 lua_script_manager.cc:33 rc_option_editor.cc:2931
+#: rc_option_editor.cc:2945
+msgid "Edit"
+msgstr ""
+
+#: bundle_manager.cc:266 editor.cc:5963 editor.cc:5993 editor_actions.cc:360
+#: editor_actions.cc:361 luawindow.cc:101 plugin_ui.cc:421
+#: processor_box.cc:3681 processor_box.cc:3683
+msgid "Delete"
+msgstr ""
+
+#: bundle_manager.cc:272 bundle_manager.cc:439 editor_route_groups.cc:98
+#: editor_routes.cc:233 lua_script_manager.cc:42 lua_script_manager.cc:76
+#: midi_list_editor.cc:107 session_metadata_dialog.cc:649
+msgid "Name"
+msgstr ""
+
+#: bundle_manager.cc:283 luawindow.cc:566
+msgid "New"
+msgstr ""
+
+#: bundle_manager.cc:333
+msgid "Bundle"
+msgstr ""
+
+#: bundle_manager.cc:418
+msgid "Add Channel"
+msgstr ""
+
+#: bundle_manager.cc:425
+msgid "Rename Channel"
+msgstr ""
+
+#: color_theme_manager.cc:58
+msgid "Restore Defaults"
+msgstr ""
+
+#: color_theme_manager.cc:62
+msgid "Color Theme"
+msgstr ""
+
+#: color_theme_manager.cc:118
+msgid "Object"
+msgstr ""
+
+#: color_theme_manager.cc:121 route_group_dialog.cc:53
+#: route_group_dialog.cc:81
+msgid "Color"
+msgstr ""
+
+#: color_theme_manager.cc:143
+msgid "Items"
+msgstr ""
+
+#: color_theme_manager.cc:144
+msgid "Palette"
+msgstr ""
+
+#: color_theme_manager.cc:145
+msgid "Transparency"
+msgstr ""
+
+#: color_theme_manager.cc:467
+msgid "Color Palette"
+msgstr ""
+
+#: configinfo.cc:28
+msgid "Build Configuration"
+msgstr ""
+
+#: control_point_dialog.cc:33
+msgid "Control point"
+msgstr ""
+
+#: control_point_dialog.cc:45
+msgid "Value"
+msgstr ""
+
+#: control_slave_ui.cc:50 mixer_ui.cc:254
+msgid "Control Masters"
+msgstr ""
+
+#: control_slave_ui.cc:54
+msgid "-vca-"
+msgstr ""
+
+#: control_slave_ui.cc:211
+msgid "Unassign All"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:35
+msgid "Duplicate Tracks & Busses"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:36
+msgid "Copy playlists"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:37
+msgid "Create new (empty) playlists"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:38
+msgid "Share playlists"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:41
+msgid "Duplicate each track/bus this number of times:"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:176
+msgid "1 or more tracks/busses could not be duplicated"
+msgstr ""
+
+#: edit_note_dialog.cc:42
+msgid "Note"
+msgstr ""
+
+#: edit_note_dialog.cc:45
+msgid "Set selected notes to this channel"
+msgstr ""
+
+#: edit_note_dialog.cc:46
+msgid "Set selected notes to this pitch"
+msgstr ""
+
+#: edit_note_dialog.cc:47
+msgid "Set selected notes to this velocity"
+msgstr ""
+
+#: edit_note_dialog.cc:49
+msgid "Set selected notes to this time"
+msgstr ""
+
+#: edit_note_dialog.cc:51
+msgid "Set selected notes to this length"
+msgstr ""
+
+#: edit_note_dialog.cc:58 midi_list_editor.cc:105 patch_change_dialog.cc:90
+#: step_entry.cc:394
+msgid "Channel"
+msgstr ""
+
+#: edit_note_dialog.cc:68
+msgid "Pitch"
+msgstr ""
+
+#: edit_note_dialog.cc:78 step_entry.cc:408
+msgid "Velocity"
+msgstr ""
+
+#: edit_note_dialog.cc:88 export_report.cc:246 export_report.cc:688
+#: patch_change_dialog.cc:66
+msgid "Time"
+msgstr ""
+
+#: edit_note_dialog.cc:99 editor_regions.cc:162
+#: export_timespan_selector.cc:415 export_timespan_selector.cc:506
+#: location_ui.cc:322 midi_list_editor.cc:115 time_info_box.cc:102
+msgid "Length"
+msgstr ""
+
+#: edit_note_dialog.cc:166
+msgid "edit note"
+msgstr ""
+
+#: editor.cc:160
+msgid "CD Frames"
+msgstr ""
+
+#: editor.cc:161
+msgid "TC Frames"
+msgstr ""
+
+#: editor.cc:162
+msgid "TC Seconds"
+msgstr ""
+
+#: editor.cc:163
+msgid "TC Minutes"
+msgstr ""
+
+#: editor.cc:164
+msgid "Seconds"
+msgstr ""
+
+#: editor.cc:165
+msgid "Minutes"
+msgstr ""
+
+#: editor.cc:166 quantize_dialog.cc:37
+msgid "Beats/128"
+msgstr ""
+
+#: editor.cc:167 quantize_dialog.cc:38
+msgid "Beats/64"
+msgstr ""
+
+#: editor.cc:168 quantize_dialog.cc:39
+msgid "Beats/32"
+msgstr ""
+
+#: editor.cc:169 quantize_dialog.cc:40
+msgid "Beats/28"
+msgstr ""
+
+#: editor.cc:170 quantize_dialog.cc:41
+msgid "Beats/24"
+msgstr ""
+
+#: editor.cc:171 quantize_dialog.cc:42
+msgid "Beats/20"
+msgstr ""
+
+#: editor.cc:172 quantize_dialog.cc:43
+msgid "Beats/16"
+msgstr ""
+
+#: editor.cc:173 quantize_dialog.cc:44
+msgid "Beats/14"
+msgstr ""
+
+#: editor.cc:174 quantize_dialog.cc:45
+msgid "Beats/12"
+msgstr ""
+
+#: editor.cc:175 quantize_dialog.cc:46
+msgid "Beats/10"
+msgstr ""
+
+#: editor.cc:176 quantize_dialog.cc:47
+msgid "Beats/8"
+msgstr ""
+
+#: editor.cc:177 quantize_dialog.cc:48
+msgid "Beats/7"
+msgstr ""
+
+#: editor.cc:178 quantize_dialog.cc:49
+msgid "Beats/6"
+msgstr ""
+
+#: editor.cc:179 quantize_dialog.cc:50
+msgid "Beats/5"
+msgstr ""
+
+#: editor.cc:180 quantize_dialog.cc:51
+msgid "Beats/4"
+msgstr ""
+
+#: editor.cc:181 quantize_dialog.cc:52
+msgid "Beats/3"
+msgstr ""
+
+#: editor.cc:182 quantize_dialog.cc:53
+msgid "Beats/2"
+msgstr ""
+
+#: editor.cc:183 quantize_dialog.cc:54
+msgid "Beats"
+msgstr ""
+
+#: editor.cc:184
+msgid "Bars"
+msgstr ""
+
+#: editor.cc:185
+msgid "Marks"
+msgstr ""
+
+#: editor.cc:186
+msgid "Region starts"
+msgstr ""
+
+#: editor.cc:187
+msgid "Region ends"
+msgstr ""
+
+#: editor.cc:188
+msgid "Region syncs"
+msgstr ""
+
+#: editor.cc:189
+msgid "Region bounds"
+msgstr ""
+
+#: editor.cc:194 editor_actions.cc:551
+msgid "No Grid"
+msgstr ""
+
+#: editor.cc:195 editor_actions.cc:552
+msgid "Grid"
+msgstr ""
+
+#: editor.cc:196 editor_actions.cc:553
+msgid "Magnetic"
+msgstr ""
+
+#: editor.cc:201 editor.cc:219 editor_actions.cc:124 editor_actions.cc:534
+msgid "Playhead"
+msgstr ""
+
+#: editor.cc:202 editor_actions.cc:536
+msgid "Marker"
+msgstr ""
+
+#: editor.cc:203 editor.cc:220 editor_actions.cc:535
+msgid "Mouse"
+msgstr ""
+
+#: editor.cc:208 editor_actions.cc:543
+msgid "Slide"
+msgstr ""
+
+#: editor.cc:209
+msgid "Splice"
+msgstr ""
+
+#: editor.cc:210 editor_actions.cc:542
+msgid "Ripple"
+msgstr ""
+
+#: editor.cc:211 editor_actions.cc:1806 editor_markers.cc:910
+#: editor_rulers.cc:259 location_ui.cc:62
+msgid "Lock"
+msgstr ""
+
+#: editor.cc:216 mono_panner_editor.cc:44
+msgid "Left"
+msgstr ""
+
+#: editor.cc:217 mono_panner_editor.cc:49
+msgid "Right"
+msgstr ""
+
+#: editor.cc:218
+msgid "Center"
+msgstr ""
+
+#: editor.cc:221
+msgid "Edit point"
+msgstr ""
+
+#: editor.cc:227
+msgid "Mushy"
+msgstr ""
+
+#: editor.cc:228
+msgid "Smooth"
+msgstr ""
+
+#: editor.cc:229
+msgid "Balanced multitimbral mixture"
+msgstr ""
+
+#: editor.cc:230
+msgid "Unpitched percussion with stable notes"
+msgstr ""
+
+#: editor.cc:231
+msgid "Crisp monophonic instrumental"
+msgstr ""
+
+#: editor.cc:232
+msgid "Unpitched solo percussion"
+msgstr ""
+
+#: editor.cc:233
+msgid "Resample without preserving pitch"
+msgstr ""
+
+#: editor.cc:319
+msgid "Mins:Secs"
+msgstr ""
+
+#: editor.cc:325
+msgid "Location Markers"
+msgstr ""
+
+#: editor.cc:326
+msgid "Range Markers"
+msgstr ""
+
+#: editor.cc:327
+msgid "Loop/Punch Ranges"
+msgstr ""
+
+#: editor.cc:328 editor_actions.cc:606
+msgid "CD Markers"
+msgstr ""
+
+#: editor.cc:329
+msgid "Video Timeline"
+msgstr ""
+
+#: editor.cc:386
+msgid "mode"
+msgstr ""
+
+#: editor.cc:535 editor_actions.cc:117 editor_actions.cc:605
+msgid "Markers"
+msgstr ""
+
+#: editor.cc:653 rc_option_editor.cc:2527
+msgid "Regions"
+msgstr ""
+
+#: editor.cc:654
+msgid "Tracks & Busses"
+msgstr ""
+
+#: editor.cc:655
+msgid "Snapshots"
+msgstr ""
+
+#: editor.cc:656
+msgid "Track & Bus Groups"
+msgstr ""
+
+#: editor.cc:657
+msgid "Ranges & Marks"
+msgstr ""
+
+#: editor.cc:1334 editor.cc:4738 editor_actions.cc:137 editor_actions.cc:1882
+msgid "Loop"
+msgstr ""
+
+#: editor.cc:1340 editor.cc:4765 editor_actions.cc:138 time_info_box.cc:62
+msgid "Punch"
+msgstr ""
+
+#: editor.cc:1475 rc_option_editor.cc:2299
+msgid "Linear (for highly correlated material)"
+msgstr ""
+
+#: editor.cc:1485 rc_option_editor.cc:2300
+msgid "Constant power"
+msgstr ""
+
+#: editor.cc:1494 rc_option_editor.cc:2301
+msgid "Symmetric"
+msgstr ""
+
+#: editor.cc:1504 rc_option_editor.cc:2302
+msgid "Slow"
+msgstr ""
+
+#: editor.cc:1513 rc_option_editor.cc:2303 sfdb_ui.cc:1737 sfdb_ui.cc:1847
+msgid "Fast"
+msgstr ""
+
+#: editor.cc:1535 editor.cc:1560
+msgid "Deactivate"
+msgstr ""
+
+#: editor.cc:1537 editor.cc:1562
+msgid "Activate"
+msgstr ""
+
+#: editor.cc:1663 editor.cc:1671 editor_ops.cc:3921
+msgid "Freeze"
+msgstr ""
+
+#: editor.cc:1667
+msgid "Unfreeze"
+msgstr ""
+
+#: editor.cc:1767
+msgid "Region Loudness Analysis"
+msgstr ""
+
+#: editor.cc:1786 editor.cc:1835
+msgid "Audio Report/Analysis"
+msgstr ""
+
+#: editor.cc:1816
+msgid "Range Loudness Analysis"
+msgstr ""
+
+#: editor.cc:1902
+msgid "Selected Regions"
+msgstr ""
+
+#: editor.cc:1946 editor_markers.cc:945
+msgid "Play Range"
+msgstr ""
+
+#: editor.cc:1947 editor_markers.cc:948
+msgid "Loop Range"
+msgstr ""
+
+#: editor.cc:1950 editor_markers.cc:953
+msgid "Zoom to Range"
+msgstr ""
+
+#: editor.cc:1953
+msgid "Loudness Analysis"
+msgstr ""
+
+#: editor.cc:1960 editor_actions.cc:401
+msgid "Move Range Start to Previous Region Boundary"
+msgstr ""
+
+#: editor.cc:1967 editor_actions.cc:408
+msgid "Move Range Start to Next Region Boundary"
+msgstr ""
+
+#: editor.cc:1974 editor_actions.cc:415
+msgid "Move Range End to Previous Region Boundary"
+msgstr ""
+
+#: editor.cc:1981 editor_actions.cc:422
+msgid "Move Range End to Next Region Boundary"
+msgstr ""
+
+#: editor.cc:1987 editor_actions.cc:136 editor_actions.cc:347
+msgid "Separate"
+msgstr ""
+
+#: editor.cc:1988
+msgid "Convert to Region in Region List"
+msgstr ""
+
+#: editor.cc:1991 editor_markers.cc:973
+msgid "Select All in Range"
+msgstr ""
+
+#: editor.cc:1994 editor_actions.cc:319
+msgid "Set Loop from Selection"
+msgstr ""
+
+#: editor.cc:1995 editor_actions.cc:320
+msgid "Set Punch from Selection"
+msgstr ""
+
+#: editor.cc:1996 editor_actions.cc:321
+msgid "Set Session Start/End from Selection"
+msgstr ""
+
+#: editor.cc:1999
+msgid "Add Range Markers"
+msgstr ""
+
+#: editor.cc:2002
+msgid "Crop Region to Range"
+msgstr ""
+
+#: editor.cc:2003 editor_actions.cc:333
+msgid "Duplicate Range"
+msgstr ""
+
+#: editor.cc:2006
+msgid "Consolidate Range"
+msgstr ""
+
+#: editor.cc:2007
+msgid "Consolidate Range with Processing"
+msgstr ""
+
+#: editor.cc:2008
+msgid "Bounce Range to Region List"
+msgstr ""
+
+#: editor.cc:2009
+msgid "Bounce Range to Region List with Processing"
+msgstr ""
+
+#: editor.cc:2010 editor_markers.cc:956
+msgid "Export Range..."
+msgstr ""
+
+#: editor.cc:2012
+msgid "Export Video Range..."
+msgstr ""
+
+#: editor.cc:2028 editor.cc:2110 editor_actions.cc:325
+msgid "Play from Edit Point"
+msgstr ""
+
+#: editor.cc:2029 editor.cc:2111
+msgid "Play from Start"
+msgstr ""
+
+#: editor.cc:2030
+msgid "Play Region"
+msgstr ""
+
+#: editor.cc:2032
+msgid "Loop Region"
+msgstr ""
+
+#: editor.cc:2042 editor.cc:2120
+msgid "Select All in Track"
+msgstr ""
+
+#: editor.cc:2043 editor.cc:2121 editor_actions.cc:196
+msgid "Select All Objects"
+msgstr ""
+
+#: editor.cc:2044 editor.cc:2122
+msgid "Invert Selection in Track"
+msgstr ""
+
+#: editor.cc:2045 editor.cc:2123 editor_actions.cc:199
+msgid "Invert Selection"
+msgstr ""
+
+#: editor.cc:2047 editor_actions.cc:201
+msgid "Set Range to Loop Range"
+msgstr ""
+
+#: editor.cc:2048 editor_actions.cc:202
+msgid "Set Range to Punch Range"
+msgstr ""
+
+#: editor.cc:2049 editor_actions.cc:203
+msgid "Set Range to Selected Regions"
+msgstr ""
+
+#: editor.cc:2051 editor.cc:2125 editor_actions.cc:205 editor_actions.cc:206
+msgid "Select All After Edit Point"
+msgstr ""
+
+#: editor.cc:2052 editor.cc:2126 editor_actions.cc:207 editor_actions.cc:208
+msgid "Select All Before Edit Point"
+msgstr ""
+
+#: editor.cc:2053 editor.cc:2127
+msgid "Select All After Playhead"
+msgstr ""
+
+#: editor.cc:2054 editor.cc:2128
+msgid "Select All Before Playhead"
+msgstr ""
+
+#: editor.cc:2055
+msgid "Select All Between Playhead and Edit Point"
+msgstr ""
+
+#: editor.cc:2056
+msgid "Select All Within Playhead and Edit Point"
+msgstr ""
+
+#: editor.cc:2057
+msgid "Select Range Between Playhead and Edit Point"
+msgstr ""
+
+#: editor.cc:2059 editor.cc:2130 editor_actions.cc:134 editor_actions.cc:135
+msgid "Select"
+msgstr ""
+
+#: editor.cc:2067 editor.cc:2138 editor_actions.cc:359 processor_box.cc:3677
+msgid "Cut"
+msgstr ""
+
+#: editor.cc:2068 editor.cc:2139 editor_actions.cc:363 processor_box.cc:3679
+msgid "Copy"
+msgstr ""
+
+#: editor.cc:2069 editor.cc:2140 editor_actions.cc:364 processor_box.cc:3691
+msgid "Paste"
+msgstr ""
+
+#: editor.cc:2073 editor_actions.cc:94
+msgid "Align"
+msgstr ""
+
+#: editor.cc:2074
+msgid "Align Relative"
+msgstr ""
+
+#: editor.cc:2081
+msgid "Insert Selected Region"
+msgstr ""
+
+#: editor.cc:2082
+msgid "Insert Existing Media"
+msgstr ""
+
+#: editor.cc:2091 editor.cc:2147
+msgid "Nudge Entire Track Later"
+msgstr ""
+
+#: editor.cc:2092 editor.cc:2148
+msgid "Nudge Track After Edit Point Later"
+msgstr ""
+
+#: editor.cc:2093 editor.cc:2149
+msgid "Nudge Entire Track Earlier"
+msgstr ""
+
+#: editor.cc:2094 editor.cc:2150
+msgid "Nudge Track After Edit Point Earlier"
+msgstr ""
+
+#: editor.cc:2096 editor.cc:2152
+msgid "Nudge"
+msgstr ""
+
+#: editor.cc:2354
+msgid ""
+"Playhead position stored with a negative value - ignored (use zero instead)"
+msgstr ""
+
+#: editor.cc:3116 editor.cc:3776 editor.cc:3847 midi_channel_selector.cc:157
+#: midi_channel_selector.cc:395 midi_channel_selector.cc:431
+msgid "All"
+msgstr ""
+
+#: editor.cc:3281
+msgid "Smart Mode (add range functions to Grab Mode)"
+msgstr ""
+
+#: editor.cc:3282
+msgid "Grab Mode (select/move objects)"
+msgstr ""
+
+#: editor.cc:3283
+msgid "Cut Mode (split regions)"
+msgstr ""
+
+#: editor.cc:3284
+msgid "Range Mode (select time ranges)"
+msgstr ""
+
+#: editor.cc:3285
+msgid "Draw Mode (draw and edit gain/notes/automation)"
+msgstr ""
+
+#: editor.cc:3286
+msgid "Stretch Mode (time-stretch audio and midi regions, preserving pitch)"
+msgstr ""
+
+#: editor.cc:3287
+msgid "Audition Mode (listen to regions)"
+msgstr ""
+
+#: editor.cc:3288
+msgid "Internal Edit Mode (edit notes and automation points)"
+msgstr ""
+
+#: editor.cc:3289
+msgid ""
+"Groups: click to (de)activate\n"
+"Context-click for other operations"
+msgstr ""
+
+#: editor.cc:3290
+msgid "Nudge Region/Selection Later"
+msgstr ""
+
+#: editor.cc:3291
+msgid "Nudge Region/Selection Earlier"
+msgstr ""
+
+#: editor.cc:3292 editor_actions.cc:272
+msgid "Zoom In"
+msgstr ""
+
+#: editor.cc:3293 editor_actions.cc:271
+msgid "Zoom Out"
+msgstr ""
+
+#: editor.cc:3294
+msgid "Zoom to Time Scale"
+msgstr ""
+
+#: editor.cc:3295 editor.cc:3798 editor_actions.cc:273
+msgid "Zoom to Session"
+msgstr ""
+
+#: editor.cc:3296 editor_actions.cc:115 editor_actions.cc:148
+msgid "Zoom Focus"
+msgstr ""
+
+#: editor.cc:3297
+msgid "Expand Tracks"
+msgstr ""
+
+#: editor.cc:3298
+msgid "Shrink Tracks"
+msgstr ""
+
+#: editor.cc:3299
+msgid "Number of visible tracks"
+msgstr ""
+
+#: editor.cc:3300
+msgid "Snap/Grid Units"
+msgstr ""
+
+#: editor.cc:3301
+msgid "Snap/Grid Mode"
+msgstr ""
+
+#: editor.cc:3302 editor_actions.cc:101
+msgid "Edit Point"
+msgstr ""
+
+#: editor.cc:3303
+msgid "Edit Mode"
+msgstr ""
+
+#: editor.cc:3304
+msgid ""
+"Nudge Clock\n"
+"(controls distance used to nudge regions and selections)"
+msgstr ""
+
+#: editor.cc:3572 editor_actions.cc:335
+msgid "Command|Undo"
+msgstr ""
+
+#: editor.cc:3574
+msgid "Command|Undo (%1)"
+msgstr ""
+
+#: editor.cc:3581 editor_actions.cc:337 editor_actions.cc:338
+#: editor_actions.cc:339
+msgid "Redo"
+msgstr ""
+
+#: editor.cc:3584
+msgid "Redo (%1)"
+msgstr ""
+
+#: editor.cc:3604 editor.cc:3628 editor_actions.cc:113 editor_actions.cc:1863
+msgid "Duplicate"
+msgstr ""
+
+#: editor.cc:3605
+msgid "Number of duplications:"
+msgstr ""
+
+#: editor.cc:3775 route_group_dialog.cc:51 time_info_box.cc:61
+msgid "Selection"
+msgstr ""
+
+#: editor.cc:3778
+msgid "Fit 1 track"
+msgstr ""
+
+#: editor.cc:3779
+msgid "Fit 2 tracks"
+msgstr ""
+
+#: editor.cc:3780
+msgid "Fit 4 tracks"
+msgstr ""
+
+#: editor.cc:3781
+msgid "Fit 8 tracks"
+msgstr ""
+
+#: editor.cc:3782
+msgid "Fit 16 tracks"
+msgstr ""
+
+#: editor.cc:3783
+msgid "Fit 24 tracks"
+msgstr ""
+
+#: editor.cc:3784
+msgid "Fit 32 tracks"
+msgstr ""
+
+#: editor.cc:3785
+msgid "Fit 48 tracks"
+msgstr ""
+
+#: editor.cc:3786
+msgid "Fit All tracks"
+msgstr ""
+
+#: editor.cc:3787
+msgid "Fit Selection"
+msgstr ""
+
+#: editor.cc:3789 editor_actions.cc:288
+msgid "Zoom to 10 ms"
+msgstr ""
+
+#: editor.cc:3790 editor_actions.cc:289
+msgid "Zoom to 100 ms"
+msgstr ""
+
+#: editor.cc:3791 editor_actions.cc:290
+msgid "Zoom to 1 sec"
+msgstr ""
+
+#: editor.cc:3792 editor_actions.cc:291
+msgid "Zoom to 10 sec"
+msgstr ""
+
+#: editor.cc:3793 editor_actions.cc:292
+msgid "Zoom to 1 min"
+msgstr ""
+
+#: editor.cc:3794 editor_actions.cc:294
+msgid "Zoom to 10 min"
+msgstr ""
+
+#: editor.cc:3795
+msgid "Zoom to 1 hour"
+msgstr ""
+
+#: editor.cc:3796
+msgid "Zoom to 8 hours"
+msgstr ""
+
+#: editor.cc:3797
+msgid "Zoom to 24 hours"
+msgstr ""
+
+#: editor.cc:3799
+msgid "Zoom to Range/Region Selection"
+msgstr ""
+
+#: editor.cc:3869
+msgid "*"
+msgstr ""
+
+#: editor.cc:4136
+msgid "Playlist Deletion"
+msgstr ""
+
+#: editor.cc:4137
+msgid ""
+"Playlist %1 is currently unused.\n"
+"If it is kept, its audio files will not be cleaned.\n"
+"If it is deleted, audio files used by it alone will be cleaned."
+msgstr ""
+
+#: editor.cc:4147
+msgid "Delete All Unused"
+msgstr ""
+
+#: editor.cc:4148
+msgid "Delete Playlist"
+msgstr ""
+
+#: editor.cc:4149
+msgid "Keep Playlist"
+msgstr ""
+
+#: editor.cc:4150
+msgid "Keep Remaining"
+msgstr ""
+
+#: editor.cc:4151 editor_audio_import.cc:600 editor_ops.cc:6552
+#: engine_dialog.cc:2986 sfdb_freesound_mootcher.cc:69 processor_box.cc:3443
+#: processor_box.cc:3468
+msgid "Cancel"
+msgstr ""
+
+#: editor.cc:4293
+msgid "new playlists"
+msgstr ""
+
+#: editor.cc:4309
+msgid "copy playlists"
+msgstr ""
+
+#: editor.cc:4324
+msgid "clear playlists"
+msgstr ""
+
+#: editor.cc:5049
+msgid "Please wait while %1 loads visual data."
+msgstr ""
+
+#: editor.cc:5812 editor_actions.cc:479
+msgid "Unset #%1"
+msgstr ""
+
+#: editor.cc:5813 editor_actions.cc:481
+msgid "no action bound"
+msgstr ""
+
+#: editor.cc:5962 editor.cc:5997 editor_markers.cc:998 editor_markers.cc:1018
+#: panner_ui.cc:412 processor_box.cc:3715
+msgid "Edit..."
+msgstr ""
+
+#: editor.cc:6003 editor_actions.cc:1842
+msgid "Transpose..."
+msgstr ""
+
+#: editor.cc:6007 editor_actions.cc:1959
+msgid "Legatize"
+msgstr ""
+
+#: editor.cc:6013 editor_actions.cc:1958
+msgid "Quantize..."
+msgstr ""
+
+#: editor.cc:6016 editor_actions.cc:1961
+msgid "Remove Overlap"
+msgstr ""
+
+#: editor.cc:6022 editor_actions.cc:1960
+msgid "Transform..."
+msgstr ""
+
+#: editor_actions.cc:95
+msgid "Autoconnect"
+msgstr ""
+
+#: editor_actions.cc:96
+msgid "Crossfades"
+msgstr ""
+
+#: editor_actions.cc:98
+msgid "Move Selected Marker"
+msgstr ""
+
+#: editor_actions.cc:99
+msgid "Select Range Operations"
+msgstr ""
+
+#: editor_actions.cc:100
+msgid "Select Regions"
+msgstr ""
+
+#: editor_actions.cc:102
+msgid "Fade"
+msgstr ""
+
+#: editor_actions.cc:103
+msgid "Latch"
+msgstr ""
+
+#: editor_actions.cc:104 editor_regions.cc:159 region_editor.cc:48
+msgid "Region"
+msgstr ""
+
+#: editor_actions.cc:105
+msgid "Layering"
+msgstr ""
+
+#: editor_actions.cc:106 editor_regions.cc:160 stereo_panner_editor.cc:46
+msgid "Position"
+msgstr ""
+
+#: editor_actions.cc:108 gain_meter.cc:161 gain_meter.cc:848 panner_ui.cc:178
+#: panner_ui.cc:637 route_time_axis.cc:541
+msgid "Trim"
+msgstr ""
+
+#: editor_actions.cc:109 editor_actions.cc:129 route_group_dialog.cc:46
+msgid "Gain"
+msgstr ""
+
+#: editor_actions.cc:110 editor_actions.cc:604
+msgid "Ranges"
+msgstr ""
+
+#: editor_actions.cc:111 editor_actions.cc:1859 session_option_editor.cc:135
+#: session_option_editor.cc:144 session_option_editor.cc:151
+#: session_option_editor.cc:158 session_option_editor.cc:165
+msgid "Fades"
+msgstr ""
+
+#: editor_actions.cc:114
+msgid "Link"
+msgstr ""
+
+#: editor_actions.cc:116
+msgid "Locate to Markers"
+msgstr ""
+
+#: editor_actions.cc:118
+msgid "Meter falloff"
+msgstr ""
+
+#: editor_actions.cc:119
+msgid "Meter hold"
+msgstr ""
+
+#: editor_actions.cc:120 session_option_editor.cc:342
+msgid "MIDI Options"
+msgstr ""
+
+#: editor_actions.cc:121
+msgid "Misc Options"
+msgstr ""
+
+#: editor_actions.cc:122 rc_option_editor.cc:2401 route_group_dialog.cc:54
+#: session_option_editor.cc:264 session_option_editor.cc:271
+msgid "Monitoring"
+msgstr ""
+
+#: editor_actions.cc:123
+msgid "Active Mark"
+msgstr ""
+
+#: editor_actions.cc:126
+msgid "Primary Clock"
+msgstr ""
+
+#: editor_actions.cc:127
+msgid "Pullup / Pulldown"
+msgstr ""
+
+#: editor_actions.cc:128
+msgid "Region operations"
+msgstr ""
+
+#: editor_actions.cc:130 ruler_dialog.cc:28
+msgid "Rulers"
+msgstr ""
+
+#: editor_actions.cc:131
+msgid "Views"
+msgstr ""
+
+#: editor_actions.cc:132
+msgid "Scroll"
+msgstr ""
+
+#: editor_actions.cc:133
+msgid "Secondary Clock"
+msgstr ""
+
+#: editor_actions.cc:140
+msgid "Subframes"
+msgstr ""
+
+#: editor_actions.cc:143
+msgid "Timecode fps"
+msgstr ""
+
+#: editor_actions.cc:144 route_time_axis.cc:599
+msgid "Height"
+msgstr ""
+
+#: editor_actions.cc:146
+msgid "Tools"
+msgstr ""
+
+#: editor_actions.cc:147
+msgid "View"
+msgstr ""
+
+#: editor_actions.cc:149
+msgid "Zoom"
+msgstr ""
+
+#: editor_actions.cc:150
+msgid "Scripted Actions"
+msgstr ""
+
+#: editor_actions.cc:159
+msgid "Session|Lock"
+msgstr ""
+
+#: editor_actions.cc:161
+msgid "Show Editor Mixer"
+msgstr ""
+
+#: editor_actions.cc:162
+msgid "Show Editor List"
+msgstr ""
+
+#: editor_actions.cc:164
+msgid "Playhead to Next Region Boundary"
+msgstr ""
+
+#: editor_actions.cc:165
+msgid "Playhead to Next Region Boundary (No Track Selection)"
+msgstr ""
+
+#: editor_actions.cc:166
+msgid "Playhead to Previous Region Boundary"
+msgstr ""
+
+#: editor_actions.cc:167
+msgid "Playhead to Previous Region Boundary (No Track Selection)"
+msgstr ""
+
+#: editor_actions.cc:169
+msgid "Playhead to Next Region Start"
+msgstr ""
+
+#: editor_actions.cc:170
+msgid "Playhead to Next Region End"
+msgstr ""
+
+#: editor_actions.cc:171
+msgid "Playhead to Next Region Sync"
+msgstr ""
+
+#: editor_actions.cc:173
+msgid "Playhead to Previous Region Start"
+msgstr ""
+
+#: editor_actions.cc:174
+msgid "Playhead to Previous Region End"
+msgstr ""
+
+#: editor_actions.cc:175
+msgid "Playhead to Previous Region Sync"
+msgstr ""
+
+#: editor_actions.cc:177
+msgid "To Next Region Boundary"
+msgstr ""
+
+#: editor_actions.cc:178
+msgid "To Next Region Boundary (No Track Selection)"
+msgstr ""
+
+#: editor_actions.cc:179
+msgid "To Previous Region Boundary"
+msgstr ""
+
+#: editor_actions.cc:180
+msgid "To Previous Region Boundary (No Track Selection)"
+msgstr ""
+
+#: editor_actions.cc:182
+msgid "To Next Region Start"
+msgstr ""
+
+#: editor_actions.cc:183
+msgid "To Next Region End"
+msgstr ""
+
+#: editor_actions.cc:184
+msgid "To Next Region Sync"
+msgstr ""
+
+#: editor_actions.cc:186
+msgid "To Previous Region Start"
+msgstr ""
+
+#: editor_actions.cc:187
+msgid "To Previous Region End"
+msgstr ""
+
+#: editor_actions.cc:188
+msgid "To Previous Region Sync"
+msgstr ""
+
+#: editor_actions.cc:190
+msgid "To Range Start"
+msgstr ""
+
+#: editor_actions.cc:191
+msgid "To Range End"
+msgstr ""
+
+#: editor_actions.cc:193
+msgid "Playhead to Range Start"
+msgstr ""
+
+#: editor_actions.cc:194
+msgid "Playhead to Range End"
+msgstr ""
+
+#: editor_actions.cc:197
+msgid "Select All Tracks"
+msgstr ""
+
+#: editor_actions.cc:198 export_timespan_selector.cc:62 processor_box.cc:3697
+msgid "Deselect All"
+msgstr ""
+
+#: editor_actions.cc:210
+msgid "Select All Overlapping Edit Range"
+msgstr ""
+
+#: editor_actions.cc:211
+msgid "Select All Inside Edit Range"
+msgstr ""
+
+#: editor_actions.cc:213
+msgid "Select Edit Range"
+msgstr ""
+
+#: editor_actions.cc:215
+msgid "Select All in Punch Range"
+msgstr ""
+
+#: editor_actions.cc:216
+msgid "Select All in Loop Range"
+msgstr ""
+
+#: editor_actions.cc:218
+msgid "Select Next Track or Bus"
+msgstr ""
+
+#: editor_actions.cc:219
+msgid "Select Previous Track or Bus"
+msgstr ""
+
+#: editor_actions.cc:221
+msgid "Toggle Record Enable"
+msgstr ""
+
+#: editor_actions.cc:223
+msgid "Toggle Solo"
+msgstr ""
+
+#: editor_actions.cc:225
+msgid "Toggle Mute"
+msgstr ""
+
+#: editor_actions.cc:227
+msgid "Toggle Solo Isolate"
+msgstr ""
+
+#: editor_actions.cc:232
+msgid "Save View %1"
+msgstr ""
+
+#: editor_actions.cc:238
+msgid "Go to View %1"
+msgstr ""
+
+#: editor_actions.cc:244
+msgid "Locate to Mark %1"
+msgstr ""
+
+#: editor_actions.cc:249 editor_actions.cc:250
+msgid "Jump to Next Mark"
+msgstr ""
+
+#: editor_actions.cc:251 editor_actions.cc:252
+msgid "Jump to Previous Mark"
+msgstr ""
+
+#: editor_actions.cc:254
+msgid "Set Session Start from Playhead"
+msgstr ""
+
+#: editor_actions.cc:255
+msgid "Set Session End from Playhead"
+msgstr ""
+
+#: editor_actions.cc:257 editor_actions.cc:258
+msgid "Add Mark from Playhead"
+msgstr ""
+
+#: editor_actions.cc:260 editor_actions.cc:261
+msgid "Remove Mark at Playhead"
+msgstr ""
+
+#: editor_actions.cc:263
+msgid "Nudge Next Later"
+msgstr ""
+
+#: editor_actions.cc:264
+msgid "Nudge Next Earlier"
+msgstr ""
+
+#: editor_actions.cc:266
+msgid "Nudge Playhead Forward"
+msgstr ""
+
+#: editor_actions.cc:267
+msgid "Nudge Playhead Backward"
+msgstr ""
+
+#: editor_actions.cc:268
+msgid "Playhead to Next Grid"
+msgstr ""
+
+#: editor_actions.cc:269
+msgid "Playhead to Previous Grid"
+msgstr ""
+
+#: editor_actions.cc:274
+msgid "Zoom to Selection"
+msgstr ""
+
+#: editor_actions.cc:275
+msgid "Toggle Zoom State"
+msgstr ""
+
+#: editor_actions.cc:277
+msgid "Expand Track Height"
+msgstr ""
+
+#: editor_actions.cc:278
+msgid "Shrink Track Height"
+msgstr ""
+
+#: editor_actions.cc:280
+msgid "Fit 1 Track"
+msgstr ""
+
+#: editor_actions.cc:281
+msgid "Fit 2 Tracks"
+msgstr ""
+
+#: editor_actions.cc:282
+msgid "Fit 4 Tracks"
+msgstr ""
+
+#: editor_actions.cc:283
+msgid "Fit 8 Tracks"
+msgstr ""
+
+#: editor_actions.cc:284
+msgid "Fit 16 Tracks"
+msgstr ""
+
+#: editor_actions.cc:285
+msgid "Fit 32 Tracks"
+msgstr ""
+
+#: editor_actions.cc:286
+msgid "Fit All Tracks"
+msgstr ""
+
+#: editor_actions.cc:293
+msgid "Zoom to 5 min"
+msgstr ""
+
+#: editor_actions.cc:296
+msgid "Move Selected Tracks Up"
+msgstr ""
+
+#: editor_actions.cc:298
+msgid "Move Selected Tracks Down"
+msgstr ""
+
+#: editor_actions.cc:301
+msgid "Scroll Tracks Up"
+msgstr ""
+
+#: editor_actions.cc:302
+msgid "Scroll Tracks Down"
+msgstr ""
+
+#: editor_actions.cc:303
+msgid "Step Tracks Up"
+msgstr ""
+
+#: editor_actions.cc:304
+msgid "Step Tracks Down"
+msgstr ""
+
+#: editor_actions.cc:306
+msgid "Scroll Backward"
+msgstr ""
+
+#: editor_actions.cc:307
+msgid "Scroll Forward"
+msgstr ""
+
+#: editor_actions.cc:308
+msgid "Center Playhead"
+msgstr ""
+
+#: editor_actions.cc:309
+msgid "Center Edit Point"
+msgstr ""
+
+#: editor_actions.cc:311
+msgid "Playhead Forward"
+msgstr ""
+
+#: editor_actions.cc:312
+msgid "Playhead Backward"
+msgstr ""
+
+#: editor_actions.cc:314
+msgid "Playhead to Active Mark"
+msgstr ""
+
+#: editor_actions.cc:315
+msgid "Active Mark to Playhead"
+msgstr ""
+
+#: editor_actions.cc:317
+msgid "Use Skip Ranges"
+msgstr ""
+
+#: editor_actions.cc:324
+msgid "Play Selected Regions"
+msgstr ""
+
+#: editor_actions.cc:326
+msgid "Play from Edit Point and Return"
+msgstr ""
+
+#: editor_actions.cc:328
+msgid "Play Edit Range"
+msgstr ""
+
+#: editor_actions.cc:330
+msgid "Playhead to Mouse"
+msgstr ""
+
+#: editor_actions.cc:331
+msgid "Active Marker to Mouse"
+msgstr ""
+
+#: editor_actions.cc:341
+msgid "Undo Selection Change"
+msgstr ""
+
+#: editor_actions.cc:342
+msgid "Redo Selection Change"
+msgstr ""
+
+#: editor_actions.cc:344
+msgid "Export Audio"
+msgstr ""
+
+#: editor_actions.cc:345 export_dialog.cc:476
+msgid "Export Range"
+msgstr ""
+
+#: editor_actions.cc:350
+msgid "Separate Using Punch Range"
+msgstr ""
+
+#: editor_actions.cc:353
+msgid "Separate Using Loop Range"
+msgstr ""
+
+#: editor_actions.cc:356 editor_actions.cc:379
+msgid "Crop"
+msgstr ""
+
+#: editor_actions.cc:366
+msgid "Fade Range Selection"
+msgstr ""
+
+#: editor_actions.cc:368
+msgid "Set Tempo from Edit Range = Bar"
+msgstr ""
+
+#: editor_actions.cc:371
+msgid "Log"
+msgstr ""
+
+#: editor_actions.cc:374 editor_actions.cc:376
+msgid "Move to Next Transient"
+msgstr ""
+
+#: editor_actions.cc:375 editor_actions.cc:377
+msgid "Move to Previous Transient"
+msgstr ""
+
+#: editor_actions.cc:381
+msgid "Start Range from Playhead"
+msgstr ""
+
+#: editor_actions.cc:382
+msgid "Finish Range from Playhead"
+msgstr ""
+
+#: editor_actions.cc:384 editor_actions.cc:393
+msgid "Start Range"
+msgstr ""
+
+#: editor_actions.cc:385 editor_actions.cc:394
+msgid "Finish Range"
+msgstr ""
+
+#: editor_actions.cc:387
+msgid "Start Punch Range"
+msgstr ""
+
+#: editor_actions.cc:388
+msgid "Finish Punch Range"
+msgstr ""
+
+#: editor_actions.cc:390
+msgid "Start Loop Range"
+msgstr ""
+
+#: editor_actions.cc:391
+msgid "Finish Loop Range"
+msgstr ""
+
+#: editor_actions.cc:426
+msgid "Follow Playhead"
+msgstr ""
+
+#: editor_actions.cc:427
+msgid "Remove Last Capture"
+msgstr ""
+
+#: editor_actions.cc:429
+msgid "Stationary Playhead"
+msgstr ""
+
+#: editor_actions.cc:431 insert_remove_time_dialog.cc:32
+msgid "Insert Time"
+msgstr ""
+
+#: editor_actions.cc:433 insert_remove_time_dialog.cc:32
+msgid "Remove Time"
+msgstr ""
+
+#: editor_actions.cc:438
+msgid "Toggle Active"
+msgstr ""
+
+#: editor_actions.cc:440 editor_actions.cc:1785 editor_markers.cc:926
+#: editor_markers.cc:999 editor_markers.cc:1019 editor_snapshots.cc:134
+#: lua_script_manager.cc:32 lua_script_manager.cc:36 mixer_strip.cc:1713
+#: route_time_axis.cc:870 vca_master_strip.cc:400
+msgid "Remove"
+msgstr ""
+
+#: editor_actions.cc:445
+msgid "Fit Selection (Vertical)"
+msgstr ""
+
+#: editor_actions.cc:447 time_axis_view.cc:1291
+msgid "Largest"
+msgstr ""
+
+#: editor_actions.cc:450 time_axis_view.cc:1292
+msgid "Larger"
+msgstr ""
+
+#: editor_actions.cc:453 editor_rulers.cc:248 time_axis_view.cc:1293
+msgid "Large"
+msgstr ""
+
+#: editor_actions.cc:459 editor_rulers.cc:252 time_axis_view.cc:1295
+msgid "Small"
+msgstr ""
+
+#: editor_actions.cc:463
+msgid "Sound Selected MIDI Notes"
+msgstr ""
+
+#: editor_actions.cc:468
+msgid "Zoom Focus Left"
+msgstr ""
+
+#: editor_actions.cc:469
+msgid "Zoom Focus Right"
+msgstr ""
+
+#: editor_actions.cc:470
+msgid "Zoom Focus Center"
+msgstr ""
+
+#: editor_actions.cc:471
+msgid "Zoom Focus Playhead"
+msgstr ""
+
+#: editor_actions.cc:472
+msgid "Zoom Focus Mouse"
+msgstr ""
+
+#: editor_actions.cc:473
+msgid "Zoom Focus Edit Point"
+msgstr ""
+
+#: editor_actions.cc:475
+msgid "Next Zoom Focus"
+msgstr ""
+
+#: editor_actions.cc:488
+msgid "Smart Object Mode"
+msgstr ""
+
+#: editor_actions.cc:491
+msgid "Smart"
+msgstr ""
+
+#: editor_actions.cc:494
+msgid "Object Tool"
+msgstr ""
+
+#: editor_actions.cc:499
+msgid "Range Tool"
+msgstr ""
+
+#: editor_actions.cc:504
+msgid "Note Drawing Tool"
+msgstr ""
+
+#: editor_actions.cc:509
+msgid "Audition Tool"
+msgstr ""
+
+#: editor_actions.cc:514
+msgid "Time FX Tool"
+msgstr ""
+
+#: editor_actions.cc:519
+msgid "Content Tool"
+msgstr ""
+
+#: editor_actions.cc:525
+msgid "Cut Tool"
+msgstr ""
+
+#: editor_actions.cc:531
+msgid "Step Mouse Mode"
+msgstr ""
+
+#: editor_actions.cc:538
+msgid "Change Edit Point"
+msgstr ""
+
+#: editor_actions.cc:539
+msgid "Change Edit Point Including Marker"
+msgstr ""
+
+#: editor_actions.cc:544
+msgid "EditMode|Lock"
+msgstr ""
+
+#: editor_actions.cc:545
+msgid "Cycle Edit Mode"
+msgstr ""
+
+#: editor_actions.cc:547
+msgid "Snap to"
+msgstr ""
+
+#: editor_actions.cc:548
+msgid "Snap Mode"
+msgstr ""
+
+#: editor_actions.cc:555
+msgid "Next Snap Mode"
+msgstr ""
+
+#: editor_actions.cc:556
+msgid "Next Snap Choice"
+msgstr ""
+
+#: editor_actions.cc:557
+msgid "Next Musical Snap Choice"
+msgstr ""
+
+#: editor_actions.cc:558
+msgid "Previous Snap Choice"
+msgstr ""
+
+#: editor_actions.cc:559
+msgid "Previous Musical Snap Choice"
+msgstr ""
+
+#: editor_actions.cc:564
+msgid "Snap to CD Frame"
+msgstr ""
+
+#: editor_actions.cc:565
+msgid "Snap to Timecode Frame"
+msgstr ""
+
+#: editor_actions.cc:566
+msgid "Snap to Timecode Seconds"
+msgstr ""
+
+#: editor_actions.cc:567
+msgid "Snap to Timecode Minutes"
+msgstr ""
+
+#: editor_actions.cc:568
+msgid "Snap to Seconds"
+msgstr ""
+
+#: editor_actions.cc:569
+msgid "Snap to Minutes"
+msgstr ""
+
+#: editor_actions.cc:571
+msgid "Snap to One Twenty Eighths"
+msgstr ""
+
+#: editor_actions.cc:572
+msgid "Snap to Sixty Fourths"
+msgstr ""
+
+#: editor_actions.cc:573
+msgid "Snap to Thirty Seconds"
+msgstr ""
+
+#: editor_actions.cc:574
+msgid "Snap to Twenty Eighths"
+msgstr ""
+
+#: editor_actions.cc:575
+msgid "Snap to Twenty Fourths"
+msgstr ""
+
+#: editor_actions.cc:576
+msgid "Snap to Twentieths"
+msgstr ""
+
+#: editor_actions.cc:577
+msgid "Snap to Sixteenths"
+msgstr ""
+
+#: editor_actions.cc:578
+msgid "Snap to Fourteenths"
+msgstr ""
+
+#: editor_actions.cc:579
+msgid "Snap to Twelfths"
+msgstr ""
+
+#: editor_actions.cc:580
+msgid "Snap to Tenths"
+msgstr ""
+
+#: editor_actions.cc:581
+msgid "Snap to Eighths"
+msgstr ""
+
+#: editor_actions.cc:582
+msgid "Snap to Sevenths"
+msgstr ""
+
+#: editor_actions.cc:583
+msgid "Snap to Sixths"
+msgstr ""
+
+#: editor_actions.cc:584
+msgid "Snap to Fifths"
+msgstr ""
+
+#: editor_actions.cc:585
+msgid "Snap to Quarters"
+msgstr ""
+
+#: editor_actions.cc:586
+msgid "Snap to Thirds"
+msgstr ""
+
+#: editor_actions.cc:587
+msgid "Snap to Halves"
+msgstr ""
+
+#: editor_actions.cc:589
+msgid "Snap to Beat"
+msgstr ""
+
+#: editor_actions.cc:590
+msgid "Snap to Bar"
+msgstr ""
+
+#: editor_actions.cc:591
+msgid "Snap to Mark"
+msgstr ""
+
+#: editor_actions.cc:592
+msgid "Snap to Region Start"
+msgstr ""
+
+#: editor_actions.cc:593
+msgid "Snap to Region End"
+msgstr ""
+
+#: editor_actions.cc:594
+msgid "Snap to Region Sync"
+msgstr ""
+
+#: editor_actions.cc:595
+msgid "Snap to Region Boundary"
+msgstr ""
+
+#: editor_actions.cc:597
+msgid "Show Marker Lines"
+msgstr ""
+
+#: editor_actions.cc:607
+msgid "Loop/Punch"
+msgstr ""
+
+#: editor_actions.cc:611
+msgid "Min:Sec"
+msgstr ""
+
+#: editor_actions.cc:613 editor_actions.cc:616 editor_rulers.cc:270
+#: rc_option_editor.cc:1592
+msgid "Video Monitor"
+msgstr ""
+
+#: editor_actions.cc:615 rc_option_editor.cc:2844
+msgid "Video"
+msgstr ""
+
+#: editor_actions.cc:618
+msgid "Always on Top"
+msgstr ""
+
+#: editor_actions.cc:620
+msgid "Frame number"
+msgstr ""
+
+#: editor_actions.cc:621
+msgid "Timecode Background"
+msgstr ""
+
+#: editor_actions.cc:622
+msgid "Fullscreen"
+msgstr ""
+
+#: editor_actions.cc:623
+msgid "Letterbox"
+msgstr ""
+
+#: editor_actions.cc:624
+msgid "Original Size"
+msgstr ""
+
+#: editor_actions.cc:681
+msgid "Sort"
+msgstr ""
+
+#: editor_actions.cc:692 editor_routes.cc:549 mixer_ui.cc:1497
+msgid "Show All"
+msgstr ""
+
+#: editor_actions.cc:693
+msgid "Show Automatic Regions"
+msgstr ""
+
+#: editor_actions.cc:695
+msgid "Ascending"
+msgstr ""
+
+#: editor_actions.cc:697
+msgid "Descending"
+msgstr ""
+
+#: editor_actions.cc:700
+msgid "By Region Name"
+msgstr ""
+
+#: editor_actions.cc:702
+msgid "By Region Length"
+msgstr ""
+
+#: editor_actions.cc:704
+msgid "By Region Position"
+msgstr ""
+
+#: editor_actions.cc:706
+msgid "By Region Timestamp"
+msgstr ""
+
+#: editor_actions.cc:708
+msgid "By Region Start in File"
+msgstr ""
+
+#: editor_actions.cc:710
+msgid "By Region End in File"
+msgstr ""
+
+#: editor_actions.cc:712
+msgid "By Source File Name"
+msgstr ""
+
+#: editor_actions.cc:714
+msgid "By Source File Length"
+msgstr ""
+
+#: editor_actions.cc:716
+msgid "By Source File Creation Date"
+msgstr ""
+
+#: editor_actions.cc:718
+msgid "By Source Filesystem"
+msgstr ""
+
+#: editor_actions.cc:721
+msgid "Remove Unused"
+msgstr ""
+
+#: editor_actions.cc:723
+msgid "Import PT session"
+msgstr ""
+
+#: editor_actions.cc:728 editor_audio_import.cc:282 editor_pt_import.cc:149
+#: luawindow.cc:99 session_import_dialog.cc:75 session_import_dialog.cc:95
+#: session_metadata_dialog.cc:421 sfdb_ui.cc:558 editor_videotimeline.cc:91
+msgid "Import"
+msgstr ""
+
+#: editor_actions.cc:731
+msgid "Import to Region List..."
+msgstr ""
+
+#: editor_actions.cc:734 session_import_dialog.cc:44
+#: session_import_dialog.cc:65
+msgid "Import from Session"
+msgstr ""
+
+#: editor_actions.cc:738
+msgid "Bring all media into session folder"
+msgstr ""
+
+#: editor_actions.cc:741
+msgid "Show Summary"
+msgstr ""
+
+#: editor_actions.cc:743
+msgid "Show Group Tabs"
+msgstr ""
+
+#: editor_actions.cc:745
+msgid "Show Measure Lines"
+msgstr ""
+
+#: editor_actions.cc:747
+msgid "Toggle MIDI Input Active for Editor-Selected Tracks/Busses"
+msgstr ""
+
+#: editor_actions.cc:1081 editor_actions.cc:1477 editor_actions.cc:1488
+#: editor_actions.cc:1541 editor_actions.cc:1552 editor_actions.cc:1599
+#: editor_actions.cc:1609 editor_regions.cc:1657 luainstance.cc:330
+#: luainstance.cc:1714
+msgid "programming error: %1: %2"
+msgstr ""
+
+#: editor_actions.cc:1791
+msgid "Raise"
+msgstr ""
+
+#: editor_actions.cc:1794
+msgid "Raise to Top"
+msgstr ""
+
+#: editor_actions.cc:1797
+msgid "Lower"
+msgstr ""
+
+#: editor_actions.cc:1800
+msgid "Lower to Bottom"
+msgstr ""
+
+#: editor_actions.cc:1803
+msgid "Move to Original Position"
+msgstr ""
+
+#: editor_actions.cc:1808
+msgid "Lock to Video"
+msgstr ""
+
+#: editor_actions.cc:1813 editor_markers.cc:917
+msgid "Glue to Bars and Beats"
+msgstr ""
+
+#: editor_actions.cc:1818
+msgid "Remove Sync"
+msgstr ""
+
+#: editor_actions.cc:1821 mixer_strip.cc:2200 monitor_section.cc:253
+#: monitor_section.cc:321 route_time_axis.cc:264 route_time_axis.cc:550
+msgid "Mute"
+msgstr ""
+
+#: editor_actions.cc:1824
+msgid "Normalize..."
+msgstr ""
+
+#: editor_actions.cc:1827
+msgid "Reverse"
+msgstr ""
+
+#: editor_actions.cc:1830
+msgid "Make Mono Regions"
+msgstr ""
+
+#: editor_actions.cc:1833
+msgid "Boost Gain"
+msgstr ""
+
+#: editor_actions.cc:1836
+msgid "Cut Gain"
+msgstr ""
+
+#: editor_actions.cc:1839
+msgid "Pitch Shift..."
+msgstr ""
+
+#: editor_actions.cc:1845
+msgid "Opaque"
+msgstr ""
+
+#: editor_actions.cc:1849 editor_regions.cc:164
+msgid "Fade In"
+msgstr ""
+
+#: editor_actions.cc:1854 editor_regions.cc:165
+msgid "Fade Out"
+msgstr ""
+
+#: editor_actions.cc:1869
+msgid "Multi-Duplicate..."
+msgstr ""
+
+#: editor_actions.cc:1874
+msgid "Fill Track"
+msgstr ""
+
+#: editor_actions.cc:1878 editor_markers.cc:1033
+msgid "Set Loop Range"
+msgstr ""
+
+#: editor_actions.cc:1885
+msgid "Set Punch"
+msgstr ""
+
+#: editor_actions.cc:1889
+msgid "Add Single Range Marker"
+msgstr ""
+
+#: editor_actions.cc:1894
+msgid "Add Range Marker Per Region"
+msgstr ""
+
+#: editor_actions.cc:1898
+msgid "Snap Position to Grid"
+msgstr ""
+
+#: editor_actions.cc:1901
+msgid "Close Gaps"
+msgstr ""
+
+#: editor_actions.cc:1904
+msgid "Rhythm Ferret..."
+msgstr ""
+
+#: editor_actions.cc:1907
+msgid "Export..."
+msgstr ""
+
+#: editor_actions.cc:1913
+msgid "Separate Under"
+msgstr ""
+
+#: editor_actions.cc:1917 editor_actions.cc:1918
+msgid "Set Fade In Length"
+msgstr ""
+
+#: editor_actions.cc:1919 editor_actions.cc:1920
+msgid "Set Fade Out Length"
+msgstr ""
+
+#: editor_actions.cc:1922
+msgid "Set Tempo from Region = Bar"
+msgstr ""
+
+#: editor_actions.cc:1927
+msgid "Split at Percussion Onsets"
+msgstr ""
+
+#: editor_actions.cc:1932
+msgid "List Editor..."
+msgstr ""
+
+#: editor_actions.cc:1935
+msgid "Properties..."
+msgstr ""
+
+#: editor_actions.cc:1939
+msgid "Bounce (with processing)"
+msgstr ""
+
+#: editor_actions.cc:1940
+msgid "Bounce (without processing)"
+msgstr ""
+
+#: editor_actions.cc:1941
+msgid "Combine"
+msgstr ""
+
+#: editor_actions.cc:1942
+msgid "Uncombine"
+msgstr ""
+
+#: editor_actions.cc:1944
+msgid "Loudness Analysis..."
+msgstr ""
+
+#: editor_actions.cc:1945
+msgid "Spectral Analysis..."
+msgstr ""
+
+#: editor_actions.cc:1947
+msgid "Reset Envelope"
+msgstr ""
+
+#: editor_actions.cc:1949
+msgid "Reset Gain"
+msgstr ""
+
+#: editor_actions.cc:1954
+msgid "Envelope Active"
+msgstr ""
+
+#: editor_actions.cc:1962 editor_actions.cc:1963
+msgid "Insert Patch Change..."
+msgstr ""
+
+#: editor_actions.cc:1964
+msgid "Unlink from other copies"
+msgstr ""
+
+#: editor_actions.cc:1965
+msgid "Strip Silence..."
+msgstr ""
+
+#: editor_actions.cc:1966
+msgid "Set Range Selection"
+msgstr ""
+
+#: editor_actions.cc:1968 editor_actions.cc:1969
+msgid "Nudge Later"
+msgstr ""
+
+#: editor_actions.cc:1970 editor_actions.cc:1971
+msgid "Nudge Earlier"
+msgstr ""
+
+#: editor_actions.cc:1973
+msgid "Sequence Regions"
+msgstr ""
+
+#: editor_actions.cc:1978
+msgid "Nudge Later by Capture Offset"
+msgstr ""
+
+#: editor_actions.cc:1985
+msgid "Nudge Earlier by Capture Offset"
+msgstr ""
+
+#: editor_actions.cc:1989
+msgid "Trim to Loop"
+msgstr ""
+
+#: editor_actions.cc:1990
+msgid "Trim to Punch"
+msgstr ""
+
+#: editor_actions.cc:1992
+msgid "Trim to Previous"
+msgstr ""
+
+#: editor_actions.cc:1993
+msgid "Trim to Next"
+msgstr ""
+
+#: editor_actions.cc:2000
+msgid "Insert Region from Region List"
+msgstr ""
+
+#: editor_actions.cc:2006
+msgid "Set Sync Position"
+msgstr ""
+
+#: editor_actions.cc:2007
+msgid "Place Transient"
+msgstr ""
+
+#: editor_actions.cc:2008
+msgid "Split/Separate"
+msgstr ""
+
+#: editor_actions.cc:2009
+msgid "Trim Start at Edit Point"
+msgstr ""
+
+#: editor_actions.cc:2010
+msgid "Trim End at Edit Point"
+msgstr ""
+
+#: editor_actions.cc:2015
+msgid "Align Start"
+msgstr ""
+
+#: editor_actions.cc:2022
+msgid "Align Start Relative"
+msgstr ""
+
+#: editor_actions.cc:2026
+msgid "Align End"
+msgstr ""
+
+#: editor_actions.cc:2031
+msgid "Align End Relative"
+msgstr ""
+
+#: editor_actions.cc:2038
+msgid "Align Sync"
+msgstr ""
+
+#: editor_actions.cc:2045
+msgid "Align Sync Relative"
+msgstr ""
+
+#: editor_actions.cc:2049 editor_actions.cc:2050
+msgid "Choose Top..."
+msgstr ""
+
+#: editor_audio_import.cc:77 editor_audio_import.cc:99
+msgid "You can't import or embed an audiofile until you have a session loaded."
+msgstr ""
+
+#: editor_audio_import.cc:83 editor_audio_import.cc:127
+msgid "Add Existing Media"
+msgstr ""
+
+#: editor_audio_import.cc:175
+msgid ""
+"The session already contains a source file named %1.  Do you want to import "
+"%1 as a new file, or skip it?"
+msgstr ""
+
+#: editor_audio_import.cc:177
+msgid ""
+"The session already contains a source file named %1.  Do you want to import "
+"%2 as a new source, or skip it?"
+msgstr ""
+
+#: editor_audio_import.cc:282 editor_pt_import.cc:149
+#: editor_videotimeline.cc:91
+msgid "Cancel Import"
+msgstr ""
+
+#: editor_audio_import.cc:565
+msgid "Editor: cannot open file \"%1\", (%2)"
+msgstr ""
+
+#: editor_audio_import.cc:573
+msgid "Cancel entire import"
+msgstr ""
+
+#: editor_audio_import.cc:574
+msgid "Don't embed it"
+msgstr ""
+
+#: editor_audio_import.cc:575
+msgid "Embed all without questions"
+msgstr ""
+
+#: editor_audio_import.cc:578 editor_audio_import.cc:604
+#: export_format_dialog.cc:68
+msgid "Sample rate"
+msgstr ""
+
+#: editor_audio_import.cc:579 editor_audio_import.cc:605
+msgid ""
+"%1\n"
+"This audiofile's sample rate doesn't match the session sample rate!"
+msgstr ""
+
+#: editor_audio_import.cc:601
+msgid "Embed it anyway"
+msgstr ""
+
+#: editor_pt_import.cc:81
+msgid "You can't import a PT session until you have a session loaded."
+msgstr ""
+
+#: editor_pt_import.cc:86
+msgid "Import PT Session"
+msgstr ""
+
+#: editor_pt_import.cc:97
+msgid "%1: this is only the directory/folder name, not the filename.\n"
+msgstr ""
+
+#: editor_pt_import.cc:132
+msgid "Doesn't seem to be a valid PT session file"
+msgstr ""
+
+#: editor_pt_import.cc:136
+msgid ""
+"PT v%1 Session @ %2Hz\n"
+"\n"
+"%3 audio files\n"
+"%4 regions\n"
+"%5 active regions\n"
+"\n"
+"Continue..."
+msgstr ""
+
+#: editor_pt_import.cc:175
+msgid ""
+"Failed to load one or more of the audio files, but continuing to attempt "
+"import."
+msgstr ""
+
+#: editor_pt_import.cc:178
+msgid "Success! Import should complete soon."
+msgstr ""
+
+#: editor_pt_import.cc:263
+msgid "PTImport: UINT_MAX routes? impossible!"
+msgstr ""
+
+#: editor_canvas_events.cc:1296 editor_drag.cc:1418
+msgid "Could not create new track after region placed in the drop zone"
+msgstr ""
+
+#: editor_drag.cc:1306
+msgid "fixed time region drag"
+msgstr ""
+
+#: editor_drag.cc:2249
+msgid "Ripple drag"
+msgstr ""
+
+#: editor_drag.cc:2311
+msgid "create region"
+msgstr ""
+
+#: editor_drag.cc:2430 midi_region_view.cc:2857
+msgid "resize notes"
+msgstr ""
+
+#: editor_drag.cc:2613 editor_drag.cc:2648
+msgid ""
+"One or more Audio Regions\n"
+"are both Locked and\n"
+"Locked to Video.\n"
+"The video cannot me moved."
+msgstr ""
+
+#: editor_drag.cc:2683
+msgid "Video Start:"
+msgstr ""
+
+#: editor_drag.cc:2685
+msgid "Diff:"
+msgstr ""
+
+#: editor_drag.cc:2707
+msgid "Move Video"
+msgstr ""
+
+#: editor_drag.cc:3176
+msgid "move meter mark"
+msgstr ""
+
+#: editor_drag.cc:3178
+msgid "copy meter mark"
+msgstr ""
+
+#: editor_drag.cc:3278
+msgid "inactive"
+msgstr ""
+
+#: editor_drag.cc:3323
+msgid "move tempo mark"
+msgstr ""
+
+#: editor_drag.cc:3330
+msgid "copy tempo mark"
+msgstr ""
+
+#: editor_drag.cc:3461
+msgid "dilate tempo"
+msgstr ""
+
+#: editor_drag.cc:3735
+msgid "change fade in length"
+msgstr ""
+
+#: editor_drag.cc:3860
+msgid "change fade out length"
+msgstr ""
+
+#: editor_drag.cc:4238
+msgid "move marker"
+msgstr ""
+
+#: editor_drag.cc:4505 editor_drag.cc:5832
+msgid "automation range move"
+msgstr ""
+
+#: editor_drag.cc:4889
+msgid "An error occurred while executing time stretch operation"
+msgstr ""
+
+#: editor_drag.cc:5350
+msgid "programming_error: %1"
+msgstr ""
+
+#: editor_drag.cc:5419 editor_drag.cc:5429
+msgid "new skip marker"
+msgstr ""
+
+#: editor_drag.cc:5420
+msgid "skip"
+msgstr ""
+
+#: editor_drag.cc:5424 location_ui.cc:60
+msgid "CD"
+msgstr ""
+
+#: editor_drag.cc:5425
+msgid "new CD marker"
+msgstr ""
+
+#: editor_drag.cc:5430 editor_route_groups.cc:439 mixer_ui.cc:1840
+msgid "unnamed"
+msgstr ""
+
+#: editor_drag.cc:5739
+msgid "Automation range drag created for invalid region type"
+msgstr ""
+
+#: editor_route_groups.cc:97
+msgid "Col"
+msgstr ""
+
+#: editor_route_groups.cc:97
+msgid "Group Tab Color"
+msgstr ""
+
+#: editor_route_groups.cc:98
+msgid "Name of Group"
+msgstr ""
+
+#: editor_route_groups.cc:99 editor_routes.cc:234
+msgid "Visible|V"
+msgstr ""
+
+#: editor_route_groups.cc:99
+msgid "Group is visible?"
+msgstr ""
+
+#: editor_route_groups.cc:100
+msgid "On"
+msgstr ""
+
+#: editor_route_groups.cc:100
+msgid "Group is enabled?"
+msgstr ""
+
+#: editor_route_groups.cc:101
+msgid "Group|G"
+msgstr ""
+
+#: editor_route_groups.cc:101
+msgid "Sharing Gain?"
+msgstr ""
+
+#: editor_route_groups.cc:102
+msgid "Relative|Rel"
+msgstr ""
+
+#: editor_route_groups.cc:102
+msgid "Relative Gain Changes?"
+msgstr ""
+
+#: editor_route_groups.cc:103 editor_regions.cc:168 editor_routes.cc:239
+#: mixer_strip.cc:2229 meter_strip.cc:365 route_time_axis.cc:2742
+#: time_axis_view.cc:1110
+msgid "Mute|M"
+msgstr ""
+
+#: editor_route_groups.cc:103
+msgid "Sharing Mute?"
+msgstr ""
+
+#: editor_route_groups.cc:104 editor_routes.cc:240 mixer_strip.cc:2242
+#: meter_strip.cc:373 route_time_axis.cc:2739 vca_master_strip.cc:211
+#: vca_time_axis.cc:236
+msgid "Solo|S"
+msgstr ""
+
+#: editor_route_groups.cc:104
+msgid "Sharing Solo?"
+msgstr ""
+
+#: editor_route_groups.cc:105 midi_time_axis.cc:1626 midi_time_axis.cc:1629
+#: midi_time_axis.cc:1632
+msgid "Rec"
+msgstr ""
+
+#: editor_route_groups.cc:105
+msgid "Sharing Record-enable Status?"
+msgstr ""
+
+#: editor_route_groups.cc:106
+msgid "Monitoring|Mon"
+msgstr ""
+
+#: editor_route_groups.cc:106
+msgid "Sharing Monitoring Choice?"
+msgstr ""
+
+#: editor_route_groups.cc:107
+msgid "Selection|Sel"
+msgstr ""
+
+#: editor_route_groups.cc:107
+msgid "Sharing Selected/Editing Status?"
+msgstr ""
+
+#: editor_route_groups.cc:108 editor_routes.cc:235
+msgid "Active|A"
+msgstr ""
+
+#: editor_route_groups.cc:108
+msgid "Sharing Active Status?"
+msgstr ""
+
+#: editor_export_audio.cc:93 editor_markers.cc:733 editor_markers.cc:832
+#: editor_markers.cc:1045 editor_markers.cc:1063 editor_markers.cc:1081
+#: editor_markers.cc:1100 editor_markers.cc:1119 editor_markers.cc:1149
+#: editor_markers.cc:1180 editor_markers.cc:1210 editor_markers.cc:1238
+#: editor_markers.cc:1269 editor_markers.cc:1294 editor_markers.cc:1345
+#: editor_markers.cc:1458 editor_markers.cc:1484 editor_markers.cc:1678
+#: editor_mouse.cc:2255
+msgid "programming error: marker canvas item has no marker object pointer!"
+msgstr ""
+
+#: editor_export_audio.cc:114
+msgid "Confirm MIDI File Overwrite"
+msgstr ""
+
+#: editor_export_audio.cc:115 utils_videotl.cc:75
+msgid "A file with the same name already exists. Do you want to overwrite it?"
+msgstr ""
+
+#: editor_group_tabs.cc:176
+msgid "Fit to Window"
+msgstr ""
+
+#: editor_markers.cc:139
+msgid "start"
+msgstr ""
+
+#: editor_markers.cc:140
+msgid "end"
+msgstr ""
+
+#: editor_markers.cc:645
+msgid "mark"
+msgstr ""
+
+#: editor_markers.cc:650 editor_ops.cc:2164 editor_ops.cc:2186
+#: editor_ops.cc:2304 editor_ops.cc:2341 location_ui.cc:1049
+msgid "add marker"
+msgstr ""
+
+#: editor_markers.cc:682 editor_markers.cc:1558
+msgid "set loop range"
+msgstr ""
+
+#: editor_markers.cc:698 editor_markers.cc:1564
+msgid "set punch range"
+msgstr ""
+
+#: editor_markers.cc:715 editor_ops.cc:4159
+msgid "range"
+msgstr ""
+
+#: editor_markers.cc:718
+msgid "new range marker"
+msgstr ""
+
+#: editor_markers.cc:751 editor_ops.cc:2272 location_ui.cc:885
+msgid "remove marker"
+msgstr ""
+
+#: editor_markers.cc:899
+msgid "Locate to Here"
+msgstr ""
+
+#: editor_markers.cc:900
+msgid "Play from Here"
+msgstr ""
+
+#: editor_markers.cc:901
+msgid "Move Mark to Playhead"
+msgstr ""
+
+#: editor_markers.cc:905
+msgid "Create Range to Next Marker"
+msgstr ""
+
+#: editor_markers.cc:946
+msgid "Locate to Marker"
+msgstr ""
+
+#: editor_markers.cc:947
+msgid "Play from Marker"
+msgstr ""
+
+#: editor_markers.cc:950
+msgid "Set Marker from Playhead"
+msgstr ""
+
+#: editor_markers.cc:951
+msgid "Set Range from Selection"
+msgstr ""
+
+#: editor_markers.cc:960
+msgid "Hide Range"
+msgstr ""
+
+#: editor_markers.cc:961
+msgid "Rename Range..."
+msgstr ""
+
+#: editor_markers.cc:965
+msgid "Remove Range"
+msgstr ""
+
+#: editor_markers.cc:972
+msgid "Separate Regions in Range"
+msgstr ""
+
+#: editor_markers.cc:974
+msgid "Select Range"
+msgstr ""
+
+#: editor_markers.cc:987
+msgid "Make Ramped"
+msgstr ""
+
+#: editor_markers.cc:989
+msgid "Make Constant"
+msgstr ""
+
+#: editor_markers.cc:993 editor_markers.cc:1013
+msgid "Lock to Music"
+msgstr ""
+
+#: editor_markers.cc:995 editor_markers.cc:1015
+msgid "Lock to Audio"
+msgstr ""
+
+#: editor_markers.cc:1034
+msgid "Set Punch Range"
+msgstr ""
+
+#: editor_markers.cc:1391
+msgid "change meter lock style"
+msgstr ""
+
+#: editor_markers.cc:1414
+msgid "change tempo lock style"
+msgstr ""
+
+#: editor_markers.cc:1441
+msgid "change tempo type"
+msgstr ""
+
+#: editor_markers.cc:1509 editor_ops.cc:2119
+msgid "New Name:"
+msgstr ""
+
+#: editor_markers.cc:1512
+msgid "Rename Mark"
+msgstr ""
+
+#: editor_markers.cc:1514
+msgid "Rename Range"
+msgstr ""
+
+#: editor_markers.cc:1521 editor_mouse.cc:2272 processor_box.cc:3204
+#: processor_box.cc:3693 route_time_axis.cc:1110 route_ui.cc:1641
+#: vca_master_strip.cc:395
+msgid "Rename"
+msgstr ""
+
+#: editor_markers.cc:1534
+msgid "rename marker"
+msgstr ""
+
+#: editor_mixer.cc:98
+msgid "This screen is not tall enough to display the editor mixer"
+msgstr ""
+
+#: editor_mouse.cc:1345 editor_mouse.cc:1363 editor_tempodisplay.cc:384
+msgid ""
+"programming error: tempo marker canvas item has no marker object pointer!"
+msgstr ""
+
+#: editor_mouse.cc:1350 editor_tempodisplay.cc:389
+msgid "programming error: marker for tempo is not a tempo marker!"
+msgstr ""
+
+#: editor_mouse.cc:1368 editor_tempodisplay.cc:507
+msgid "programming error: marker for meter is not a meter marker!"
+msgstr ""
+
+#: editor_mouse.cc:2016 editor_mouse.cc:2041 editor_mouse.cc:2054
+msgid ""
+"programming error: control point canvas item has no control point object "
+"pointer!"
+msgstr ""
+
+#: editor_mouse.cc:2085
+msgid "edit note(s)"
+msgstr ""
+
+#: editor_mouse.cc:2193
+msgid "start point trim"
+msgstr ""
+
+#: editor_mouse.cc:2218
+msgid "end point trim"
+msgstr ""
+
+#: editor_mouse.cc:2270
+msgid "Name for region:"
+msgstr ""
+
+#: editor_ops.cc:168
+msgid "split"
+msgstr ""
+
+#: editor_ops.cc:342
+msgid "alter selection"
+msgstr ""
+
+#: editor_ops.cc:384
+msgid "nudge regions forward"
+msgstr ""
+
+#: editor_ops.cc:441 editor_ops.cc:535
+msgid "nudge location forward"
+msgstr ""
+
+#: editor_ops.cc:472
+msgid "nudge regions backward"
+msgstr ""
+
+#: editor_ops.cc:567
+msgid "nudge forward"
+msgstr ""
+
+#: editor_ops.cc:591
+msgid "nudge backward"
+msgstr ""
+
+#: editor_ops.cc:656
+msgid "sequence regions"
+msgstr ""
+
+#: editor_ops.cc:718
+msgid "build_region_boundary_cache called with snap_type = %1"
+msgstr ""
+
+#: editor_ops.cc:2121
+msgid "New Location Marker"
+msgstr ""
+
+#: editor_ops.cc:2212 editor_ops.cc:2236
+msgid "Set session start"
+msgstr ""
+
+#: editor_ops.cc:2304
+msgid "add markers"
+msgstr ""
+
+#: editor_ops.cc:2400
+msgid "clear markers"
+msgstr ""
+
+#: editor_ops.cc:2415
+msgid "clear ranges"
+msgstr ""
+
+#: editor_ops.cc:2431
+msgid "clear locations"
+msgstr ""
+
+#: editor_ops.cc:2494
+msgid "insert region"
+msgstr ""
+
+#: editor_ops.cc:2685
+msgid "raise regions"
+msgstr ""
+
+#: editor_ops.cc:2687
+msgid "raise region"
+msgstr ""
+
+#: editor_ops.cc:2693
+msgid "raise regions to top"
+msgstr ""
+
+#: editor_ops.cc:2695
+msgid "raise region to top"
+msgstr ""
+
+#: editor_ops.cc:2701
+msgid "lower regions"
+msgstr ""
+
+#: editor_ops.cc:2703 editor_ops.cc:2711
+msgid "lower region"
+msgstr ""
+
+#: editor_ops.cc:2709
+msgid "lower regions to bottom"
+msgstr ""
+
+#: editor_ops.cc:2794
+msgid "Rename Region"
+msgstr ""
+
+#: editor_ops.cc:2796 processor_box.cc:3202 route_ui.cc:1639
+msgid "New name:"
+msgstr ""
+
+#: editor_ops.cc:3097
+msgid "separate"
+msgstr ""
+
+#: editor_ops.cc:3207
+msgid "separate region under"
+msgstr ""
+
+#: editor_ops.cc:3360
+msgid "trim to selection"
+msgstr ""
+
+#: editor_ops.cc:3442
+msgid "set sync point"
+msgstr ""
+
+#: editor_ops.cc:3466
+msgid "remove region sync"
+msgstr ""
+
+#: editor_ops.cc:3488
+msgid "move regions to original position"
+msgstr ""
+
+#: editor_ops.cc:3490
+msgid "move region to original position"
+msgstr ""
+
+#: editor_ops.cc:3511
+msgid "align selection"
+msgstr ""
+
+#: editor_ops.cc:3585
+msgid "align selection (relative)"
+msgstr ""
+
+#: editor_ops.cc:3619
+msgid "align region"
+msgstr ""
+
+#: editor_ops.cc:3670
+msgid "trim front"
+msgstr ""
+
+#: editor_ops.cc:3670
+msgid "trim back"
+msgstr ""
+
+#: editor_ops.cc:3700
+msgid "trim to loop"
+msgstr ""
+
+#: editor_ops.cc:3710
+msgid "trim to punch"
+msgstr ""
+
+#: editor_ops.cc:3832
+msgid "trim to region"
+msgstr ""
+
+#: editor_ops.cc:3891
+msgid ""
+"This track/bus cannot be frozen because the signal adds or loses channels "
+"before reaching the outputs.\n"
+"This is typically caused by plugins that generate stereo output from mono "
+"input or vice versa."
+msgstr ""
+
+#: editor_ops.cc:3894
+msgid "Cannot freeze"
+msgstr ""
+
+#: editor_ops.cc:3900
+msgid ""
+"<b>%1</b>\n"
+"\n"
+"This track has at least one send/insert/return as part of its signal flow.\n"
+"\n"
+"Freezing will only process the signal as far as the first send/insert/return."
+msgstr ""
+
+#: editor_ops.cc:3904
+msgid "Freeze anyway"
+msgstr ""
+
+#: editor_ops.cc:3905
+msgid "Don't freeze"
+msgstr ""
+
+#: editor_ops.cc:3906
+msgid "Freeze Limits"
+msgstr ""
+
+#: editor_ops.cc:3921
+msgid "Cancel Freeze"
+msgstr ""
+
+#: editor_ops.cc:3952
+msgid ""
+"You can't perform this operation because the processing of the signal will "
+"cause one or more of the tracks to end up with a region with more channels "
+"than this track has inputs.\n"
+"\n"
+"You can do this without processing, which is a different operation."
+msgstr ""
+
+#: editor_ops.cc:3956
+msgid "Cannot bounce"
+msgstr ""
+
+#: editor_ops.cc:4007
+msgid "bounce range"
+msgstr ""
+
+#: editor_ops.cc:4074
+msgid "delete"
+msgstr ""
+
+#: editor_ops.cc:4077
+msgid "cut"
+msgstr ""
+
+#: editor_ops.cc:4080
+msgid "copy"
+msgstr ""
+
+#: editor_ops.cc:4083
+msgid "clear"
+msgstr ""
+
+#: editor_ops.cc:4132
+msgid "objects"
+msgstr ""
+
+#: editor_ops.cc:4364 editor_ops.cc:4449
+msgid "remove region"
+msgstr ""
+
+#: editor_ops.cc:4866
+msgid "duplicate range selection"
+msgstr ""
+
+#: editor_ops.cc:4960
+msgid "nudge track"
+msgstr ""
+
+#: editor_ops.cc:4987
+msgid ""
+"Do you really want to destroy the last capture?\n"
+"(This is destructive and cannot be undone)"
+msgstr ""
+
+#: editor_ops.cc:4990 editor_ops.cc:7224 editor_regions.cc:503
+#: editor_snapshots.cc:171
+msgid "No, do nothing."
+msgstr ""
+
+#: editor_ops.cc:4991
+msgid "Yes, destroy it."
+msgstr ""
+
+#: editor_ops.cc:4993
+msgid "Destroy last capture"
+msgstr ""
+
+#: editor_ops.cc:5069
+msgid "normalize"
+msgstr ""
+
+#: editor_ops.cc:5167
+msgid "reverse regions"
+msgstr ""
+
+#: editor_ops.cc:5204
+msgid "strip silence"
+msgstr ""
+
+#: editor_ops.cc:5285
+msgid "Fork Region(s)"
+msgstr ""
+
+#: editor_ops.cc:5292
+msgid "Could not unlink %1"
+msgstr ""
+
+#: editor_ops.cc:5554
+msgid "reset region gain"
+msgstr ""
+
+#: editor_ops.cc:5612
+msgid "region gain envelope active"
+msgstr ""
+
+#: editor_ops.cc:5637
+msgid "toggle region lock"
+msgstr ""
+
+#: editor_ops.cc:5661
+msgid "Toggle Video Lock"
+msgstr ""
+
+#: editor_ops.cc:5685
+msgid "region lock style"
+msgstr ""
+
+#: editor_ops.cc:5710
+msgid "change region opacity"
+msgstr ""
+
+#: editor_ops.cc:5803
+msgid "fade range"
+msgstr ""
+
+#: editor_ops.cc:5841
+msgid "set fade in length"
+msgstr ""
+
+#: editor_ops.cc:5848
+msgid "set fade out length"
+msgstr ""
+
+#: editor_ops.cc:5913
+msgid "set fade in shape"
+msgstr ""
+
+#: editor_ops.cc:5948
+msgid "set fade out shape"
+msgstr ""
+
+#: editor_ops.cc:5984
+msgid "set fade in active"
+msgstr ""
+
+#: editor_ops.cc:6018
+msgid "set fade out active"
+msgstr ""
+
+#: editor_ops.cc:6078
+msgid "toggle fade active"
+msgstr ""
+
+#: editor_ops.cc:6271
+msgid "set loop range from selection"
+msgstr ""
+
+#: editor_ops.cc:6285
+msgid "set loop range from region"
+msgstr ""
+
+#: editor_ops.cc:6304
+msgid "set punch range from selection"
+msgstr ""
+
+#: editor_ops.cc:6328
+msgid "set session start/end from selection"
+msgstr ""
+
+#: editor_ops.cc:6366
+msgid "set punch start from EP"
+msgstr ""
+
+#: editor_ops.cc:6394
+msgid "set punch end from EP"
+msgstr ""
+
+#: editor_ops.cc:6427
+msgid "set loop start from EP"
+msgstr ""
+
+#: editor_ops.cc:6455
+msgid "set loop end from EP"
+msgstr ""
+
+#: editor_ops.cc:6466
+msgid "set punch range from region"
+msgstr ""
+
+#: editor_ops.cc:6553
+msgid "Add new marker"
+msgstr ""
+
+#: editor_ops.cc:6554
+msgid "Set global tempo"
+msgstr ""
+
+#: editor_ops.cc:6557
+msgid "Define one bar"
+msgstr ""
+
+#: editor_ops.cc:6558
+msgid "Do you want to set the global tempo or add a new tempo marker?"
+msgstr ""
+
+#: editor_ops.cc:6584
+msgid "set tempo from region"
+msgstr ""
+
+#: editor_ops.cc:6613
+msgid "split regions"
+msgstr ""
+
+#: editor_ops.cc:6655
+msgid ""
+"You are about to split\n"
+"%1\n"
+"into %2 pieces.\n"
+"This could take a long time."
+msgstr ""
+
+#: editor_ops.cc:6662
+msgid "Call for the Ferret!"
+msgstr ""
+
+#: editor_ops.cc:6663
+msgid ""
+"Press OK to continue with this split operation\n"
+"or ask the Ferret dialog to tune the analysis"
+msgstr ""
+
+#: editor_ops.cc:6665
+msgid "Press OK to continue with this split operation"
+msgstr ""
+
+#: editor_ops.cc:6668
+msgid "Excessive split?"
+msgstr ""
+
+#: editor_ops.cc:6822
+msgid "place transient"
+msgstr ""
+
+#: editor_ops.cc:6856
+msgid "snap regions to grid"
+msgstr ""
+
+#: editor_ops.cc:6895
+msgid "Close Region Gaps"
+msgstr ""
+
+#: editor_ops.cc:6900
+msgid "Crossfade length"
+msgstr ""
+
+#: editor_ops.cc:6909 editor_ops.cc:6920 rhythm_ferret.cc:128
+#: rhythm_ferret.cc:143 session_option_editor.cc:141
+msgid "ms"
+msgstr ""
+
+#: editor_ops.cc:6911
+msgid "Pull-back length"
+msgstr ""
+
+#: editor_ops.cc:6924 keyeditor.cc:71
+msgid "Ok"
+msgstr ""
+
+#: editor_ops.cc:6939
+msgid "close region gaps"
+msgstr ""
+
+#: editor_ops.cc:7182
+msgid "That would be bad news ...."
+msgstr ""
+
+#: editor_ops.cc:7187
+msgid ""
+"Removing the master or monitor bus is such a bad idea\n"
+"that %1 is not going to allow it.\n"
+"\n"
+"If you really want to do this sort of thing\n"
+"edit your ardour.rc file to set the\n"
+"\"allow-special-bus-removal\" option to be \"yes\""
+msgstr ""
+
+#: editor_ops.cc:7203
+msgid "track"
+msgid_plural "tracks"
+msgstr[0] ""
+msgstr[1] ""
+
+#: editor_ops.cc:7204
+msgid "bus"
+msgid_plural "busses"
+msgstr[0] ""
+msgstr[1] ""
+
+#: editor_ops.cc:7208
+msgid ""
+"Do you really want to remove %1 %2 and %3 %4?\n"
+"(You may also lose the playlists associated with the %2)\n"
+"\n"
+"This action cannot be undone, and the session file will be overwritten!"
+msgstr ""
+
+#: editor_ops.cc:7213
+msgid ""
+"Do you really want to remove %1 %2?\n"
+"(You may also lose the playlists associated with the %2)\n"
+"\n"
+"This action cannot be undone, and the session file will be overwritten!"
+msgstr ""
+
+#: editor_ops.cc:7219
+msgid ""
+"Do you really want to remove %1 %2?\n"
+"\n"
+"This action cannot be undone, and the session file will be overwritten"
+msgstr ""
+
+#: editor_ops.cc:7226
+msgid "Yes, remove them."
+msgstr ""
+
+#: editor_ops.cc:7228 editor_snapshots.cc:172
+msgid "Yes, remove it."
+msgstr ""
+
+#: editor_ops.cc:7233 editor_ops.cc:7235
+msgid "Remove %1"
+msgstr ""
+
+#: editor_ops.cc:7341 editor_ops.cc:7355 editor_ops.cc:7395 editor_ops.cc:7405
+msgid "insert time"
+msgstr ""
+
+#: editor_ops.cc:7458
+msgid "Cannot insert or delete time when in Lock edit."
+msgstr ""
+
+#: editor_ops.cc:7478 editor_ops.cc:7490 editor_ops.cc:7563 editor_ops.cc:7576
+msgid "remove time"
+msgstr ""
+
+#: editor_ops.cc:7650
+msgid "There are too many tracks to fit in the current window"
+msgstr ""
+
+#: editor_ops.cc:7711
+msgid "Sel"
+msgstr ""
+
+#: editor_ops.cc:7750
+#, c-format
+msgid "Saved view %u"
+msgstr ""
+
+#: editor_ops.cc:7775
+msgid "mute regions"
+msgstr ""
+
+#: editor_ops.cc:7777
+msgid "mute region"
+msgstr ""
+
+#: editor_ops.cc:7814
+msgid "combine regions"
+msgstr ""
+
+#: editor_ops.cc:7852
+msgid "uncombine regions"
+msgstr ""
+
+#: editor_ops.cc:7889
+msgid "%1: Locked"
+msgstr ""
+
+#: editor_ops.cc:7896
+msgid "Click to unlock"
+msgstr ""
+
+#: editor_ops.cc:7945
+msgid "Moving embedded files into session folder"
+msgstr ""
+
+#: editor_regions.cc:159
+msgid "Region name, with number of channels in []'s"
+msgstr ""
+
+#: editor_regions.cc:160
+msgid "Position of start of region"
+msgstr ""
+
+#: editor_regions.cc:161 editor_regions.cc:935 time_info_box.cc:95
+msgid "End"
+msgstr ""
+
+#: editor_regions.cc:161
+msgid "Position of end of region"
+msgstr ""
+
+#: editor_regions.cc:162
+msgid "Length of the region"
+msgstr ""
+
+#: editor_regions.cc:163
+msgid "Position of region sync point, relative to start of the region"
+msgstr ""
+
+#: editor_regions.cc:164
+msgid "Length of region fade-in (units: secondary clock), () if disabled"
+msgstr ""
+
+#: editor_regions.cc:165
+msgid "Length of region fade-out (units: secondary clock), () if disabled"
+msgstr ""
+
+#: editor_regions.cc:166
+msgid "Lock|L"
+msgstr ""
+
+#: editor_regions.cc:166
+msgid "Region position locked?"
+msgstr ""
+
+#: editor_regions.cc:167
+msgid "Gain|G"
+msgstr ""
+
+#: editor_regions.cc:167
+msgid "Region position glued to Bars|Beats time?"
+msgstr ""
+
+#: editor_regions.cc:168
+msgid "Region muted?"
+msgstr ""
+
+#: editor_regions.cc:169
+msgid "Opaque|O"
+msgstr ""
+
+#: editor_regions.cc:169
+msgid "Region opaque (blocks regions below it from being heard)?"
+msgstr ""
+
+#: editor_regions.cc:360 editor_regions.cc:365 editor_regions.cc:367
+msgid "Hidden"
+msgstr ""
+
+#: editor_regions.cc:432
+msgid "(MISSING) "
+msgstr ""
+
+#: editor_regions.cc:500
+msgid ""
+"Do you really want to remove unused regions?\n"
+"(This is destructive and cannot be undone)"
+msgstr ""
+
+#: editor_regions.cc:504
+msgid "Yes, remove."
+msgstr ""
+
+#: editor_regions.cc:506
+msgid "Remove unused regions"
+msgstr ""
+
+#: editor_regions.cc:735
+msgid "EditorRegions::format_position: negative timecode position: %1"
+msgstr ""
+
+#: editor_regions.cc:900 editor_regions.cc:916 editor_regions.cc:930
+msgid "Mult."
+msgstr ""
+
+#: editor_regions.cc:933 midi_list_editor.cc:104 time_info_box.cc:88
+msgid "Start"
+msgstr ""
+
+#: editor_regions.cc:951 editor_regions.cc:967
+msgid "Multiple"
+msgstr ""
+
+#: editor_regions.cc:1036
+msgid "MISSING "
+msgstr ""
+
+#: editor_routes.cc:126
+msgid "RS"
+msgstr ""
+
+#: editor_routes.cc:208
+msgid "SS"
+msgstr ""
+
+#: editor_routes.cc:233
+msgid "Track/Bus Name"
+msgstr ""
+
+#: editor_routes.cc:234
+msgid "Track/Bus visible ?"
+msgstr ""
+
+#: editor_routes.cc:235
+msgid "Track/Bus active ?"
+msgstr ""
+
+#: editor_routes.cc:236
+msgid "MidiInput|I"
+msgstr ""
+
+#: editor_routes.cc:236
+msgid "MIDI input enabled"
+msgstr ""
+
+#: editor_routes.cc:237
+msgid "Rec|R"
+msgstr ""
+
+#: editor_routes.cc:237
+msgid "Record enabled"
+msgstr ""
+
+#: editor_routes.cc:238
+msgid "Rec|RS"
+msgstr ""
+
+#: editor_routes.cc:238
+msgid "Record Safe"
+msgstr ""
+
+#: editor_routes.cc:239
+msgid "Muted"
+msgstr ""
+
+#: editor_routes.cc:240
+msgid "Soloed"
+msgstr ""
+
+#: editor_routes.cc:241
+msgid "SoloIso|SI"
+msgstr ""
+
+#: editor_routes.cc:241
+msgid "Solo Isolated"
+msgstr ""
+
+#: editor_routes.cc:242
+msgid "SoloLock|SS"
+msgstr ""
+
+#: editor_routes.cc:242
+msgid "Solo Safe (Locked)"
+msgstr ""
+
+#: editor_routes.cc:550 mixer_ui.cc:1498
+msgid "Hide All"
+msgstr ""
+
+#: editor_routes.cc:551 mixer_ui.cc:1499
+msgid "Show All Audio Tracks"
+msgstr ""
+
+#: editor_routes.cc:552 mixer_ui.cc:1500
+msgid "Hide All Audio Tracks"
+msgstr ""
+
+#: editor_routes.cc:553 mixer_ui.cc:1501
+msgid "Show All Audio Busses"
+msgstr ""
+
+#: editor_routes.cc:554 mixer_ui.cc:1502
+msgid "Hide All Audio Busses"
+msgstr ""
+
+#: editor_routes.cc:555 mixer_ui.cc:1503
+msgid "Show All Midi Tracks"
+msgstr ""
+
+#: editor_routes.cc:556 mixer_ui.cc:1504
+msgid "Hide All Midi Tracks"
+msgstr ""
+
+#: editor_routes.cc:557
+msgid "Only Show Tracks with Regions Under Playhead"
+msgstr ""
+
+#: editor_rulers.cc:212
+msgid "New location marker"
+msgstr ""
+
+#: editor_rulers.cc:213
+msgid "Clear all locations"
+msgstr ""
+
+#: editor_rulers.cc:214
+msgid "Unhide locations"
+msgstr ""
+
+#: editor_rulers.cc:218
+msgid "New range"
+msgstr ""
+
+#: editor_rulers.cc:219
+msgid "Clear all ranges"
+msgstr ""
+
+#: editor_rulers.cc:220
+msgid "Unhide ranges"
+msgstr ""
+
+#: editor_rulers.cc:224
+msgid "New Loop range"
+msgstr ""
+
+#: editor_rulers.cc:225
+msgid "New Punch range"
+msgstr ""
+
+#: editor_rulers.cc:230
+msgid "New CD track marker"
+msgstr ""
+
+#: editor_rulers.cc:234 tempo_dialog.cc:38
+msgid "New Tempo"
+msgstr ""
+
+#: editor_rulers.cc:238 tempo_dialog.cc:419
+msgid "New Meter"
+msgstr ""
+
+#: editor_snapshots.cc:149
+msgid "Rename Snapshot"
+msgstr ""
+
+#: editor_snapshots.cc:151
+msgid "New name of snapshot"
+msgstr ""
+
+#: editor_snapshots.cc:169
+msgid ""
+"Do you really want to remove snapshot \"%1\" ?\n"
+"(which cannot be undone)"
+msgstr ""
+
+#: editor_snapshots.cc:174
+msgid "Remove snapshot"
+msgstr ""
+
+#: editor_tempodisplay.cc:318
+msgid "add tempo mark"
+msgstr ""
+
+#: editor_tempodisplay.cc:343
+msgid "add"
+msgstr ""
+
+#: editor_tempodisplay.cc:362
+msgid "add meter mark"
+msgstr ""
+
+#: editor_tempodisplay.cc:401 editor_tempodisplay.cc:435
+msgid "done"
+msgstr ""
+
+#: editor_tempodisplay.cc:422
+msgid "replace meter mark"
+msgstr ""
+
+#: editor_tempodisplay.cc:454
+msgid "replace tempo mark"
+msgstr ""
+
+#: editor_tempodisplay.cc:485 editor_tempodisplay.cc:519
+msgid "remove tempo mark"
+msgstr ""
+
+#: editor_tempodisplay.cc:502
+msgid ""
+"programming error: meter marker canvas item has no marker object pointer!"
+msgstr ""
+
+#: editor_timefx.cc:68
+msgid "stretch/shrink"
+msgstr ""
+
+#: editor_timefx.cc:130
+msgid "pitch shift"
+msgstr ""
+
+#: editor_timefx.cc:282
+msgid "timefx cannot be started - thread creation error"
+msgstr ""
+
+#: engine_dialog.cc:86
+msgid "Device Control Panel"
+msgstr ""
+
+#: engine_dialog.cc:87
+msgid "Midi Device Setup"
+msgstr ""
+
+#: engine_dialog.cc:89
+msgid "Refresh Devices"
+msgstr ""
+
+#: engine_dialog.cc:90
+msgid "Use Buffered I/O"
+msgstr ""
+
+#: engine_dialog.cc:91 engine_dialog.cc:3000
+msgid "Measure"
+msgstr ""
+
+#: engine_dialog.cc:92
+msgid "Use results"
+msgstr ""
+
+#: engine_dialog.cc:93
+msgid "Back to settings ... (ignore results)"
+msgstr ""
+
+#: engine_dialog.cc:94
+msgid "Calibrate Audio"
+msgstr ""
+
+#: engine_dialog.cc:98
+msgid "Back to settings"
+msgstr ""
+
+#: engine_dialog.cc:120
+msgid ""
+"No audio/MIDI backends detected. %1 cannot run\n"
+"\n"
+"(This is a build/packaging/system error. It should never happen.)"
+msgstr ""
+
+#: engine_dialog.cc:145
+msgid "Latency Measurement Tool"
+msgstr ""
+
+#: engine_dialog.cc:157
+msgid ""
+"<span weight=\"bold\">Turn down the volume on your audio equipment to a very "
+"low level.</span>"
+msgstr ""
+
+#: engine_dialog.cc:166
+msgid "Select two channels below and connect them using a cable."
+msgstr ""
+
+#: engine_dialog.cc:171
+msgid "Output channel"
+msgstr ""
+
+#: engine_dialog.cc:179
+msgid "Input channel"
+msgstr ""
+
+#: engine_dialog.cc:213
+msgid "Once the channels are connected, click the \"Measure\" button."
+msgstr ""
+
+#: engine_dialog.cc:220
+msgid "When satisfied with the results, click the \"Use results\" button."
+msgstr ""
+
+#: engine_dialog.cc:235 engine_dialog.cc:3138 engine_dialog.cc:3148
+msgid "No measurement results yet"
+msgstr ""
+
+#: engine_dialog.cc:245 route_params_ui.cc:106
+msgid "Latency"
+msgstr ""
+
+#: engine_dialog.cc:520
+msgid "Audio System:"
+msgstr ""
+
+#: engine_dialog.cc:564
+msgid "Driver:"
+msgstr ""
+
+#: engine_dialog.cc:571
+msgid "Input Device:"
+msgstr ""
+
+#: engine_dialog.cc:575
+msgid "Output Device:"
+msgstr ""
+
+#: engine_dialog.cc:582
+msgid "Device:"
+msgstr ""
+
+#: engine_dialog.cc:591 engine_dialog.cc:699 export_report.cc:164
+#: export_report.cc:328 sfdb_ui.cc:153 sfdb_ui.cc:348 sfdb_ui.cc:353
+msgid "Sample rate:"
+msgstr ""
+
+#: engine_dialog.cc:597 engine_dialog.cc:706
+msgid "Buffer size:"
+msgstr ""
+
+#: engine_dialog.cc:606
+msgid "Periods:"
+msgstr ""
+
+#: engine_dialog.cc:624
+msgid "Input Channels:"
+msgstr ""
+
+#: engine_dialog.cc:637
+msgid "Output Channels:"
+msgstr ""
+
+#: engine_dialog.cc:649
+msgid "Hardware input latency:"
+msgstr ""
+
+#: engine_dialog.cc:652 engine_dialog.cc:665
+msgid "samples"
+msgstr ""
+
+#: engine_dialog.cc:662
+msgid "Hardware output latency:"
+msgstr ""
+
+#: engine_dialog.cc:673
+msgid "MIDI System:"
+msgstr ""
+
+#: engine_dialog.cc:691
+msgid ""
+"%1 is already running. %2 will connect to it and use the existing settings."
+msgstr ""
+
+#: engine_dialog.cc:744
+msgid ""
+"Failed to start or connect to audio-engine.\n"
+"\n"
+"Latency calibration requires a working audio interface."
+msgstr ""
+
+#: engine_dialog.cc:750
+msgid ""
+"Your selected audio configuration is playback- or capture-only.\n"
+"\n"
+"Latency calibration requires playback and capture"
+msgstr ""
+
+#: engine_dialog.cc:965
+msgid "MIDI Devices"
+msgstr ""
+
+#: engine_dialog.cc:971
+msgid "Device"
+msgstr ""
+
+#: engine_dialog.cc:973
+msgid "Hardware Latencies"
+msgstr ""
+
+#: engine_dialog.cc:1014
+msgid "Calibrate"
+msgstr ""
+
+#: engine_dialog.cc:1117
+msgid "all available channels"
+msgstr ""
+
+#: engine_dialog.cc:1599 latency_gui.cc:55
+msgid "%1 sample"
+msgid_plural "%1 samples"
+msgstr[0] ""
+msgstr[1] ""
+
+#: engine_dialog.cc:1662
+#, c-format
+msgid "(%.1f ms)"
+msgstr ""
+
+#: engine_dialog.cc:2413
+msgid "Could not start backend engine %1"
+msgstr ""
+
+#: engine_dialog.cc:2445
+msgid "Cannot set driver to %1"
+msgstr ""
+
+#: engine_dialog.cc:2450
+msgid "Cannot set input device name to %1"
+msgstr ""
+
+#: engine_dialog.cc:2454
+msgid "Cannot set output device name to %1"
+msgstr ""
+
+#: engine_dialog.cc:2459
+msgid "Cannot set device name to %1"
+msgstr ""
+
+#: engine_dialog.cc:2464
+msgid "Cannot set sample rate to %1"
+msgstr ""
+
+#: engine_dialog.cc:2468
+msgid "Cannot set buffer size to %1"
+msgstr ""
+
+#: engine_dialog.cc:2472
+msgid "Cannot set periods to %1"
+msgstr ""
+
+#: engine_dialog.cc:2478
+msgid "Cannot set input channels to %1"
+msgstr ""
+
+#: engine_dialog.cc:2482
+msgid "Cannot set output channels to %1"
+msgstr ""
+
+#: engine_dialog.cc:2488
+msgid "Cannot set input latency to %1"
+msgstr ""
+
+#: engine_dialog.cc:2492
+msgid "Cannot set output latency to %1"
+msgstr ""
+
+#: engine_dialog.cc:2851 engine_dialog.cc:2917
+msgid "No signal detected "
+msgstr ""
+
+#: engine_dialog.cc:2858
+msgid ""
+"Input signal is > -3dBFS. Lower the signal level (output gain, input gain) "
+"on the audio-interface."
+msgstr ""
+
+#: engine_dialog.cc:2871 engine_dialog.cc:2925 port_insert_ui.cc:70
+#: port_insert_ui.cc:98
+msgid "Disconnected from audio engine"
+msgstr ""
+
+#: engine_dialog.cc:2880 engine_dialog.cc:2933
+msgid "Detected roundtrip latency: "
+msgstr ""
+
+#: engine_dialog.cc:2882 engine_dialog.cc:2935
+msgid "Systemic latency: "
+msgstr ""
+
+#: engine_dialog.cc:2889
+msgid "(signal detection error)"
+msgstr ""
+
+#: engine_dialog.cc:2895
+msgid "(inverted - bad wiring)"
+msgstr ""
+
+#: engine_dialog.cc:2942
+msgid "(averaging)"
+msgstr ""
+
+#: engine_dialog.cc:2948
+msgid "(too large jitter)"
+msgstr ""
+
+#: engine_dialog.cc:2952
+msgid "(large jitter)"
+msgstr ""
+
+#: engine_dialog.cc:2964
+msgid "Timeout - large MIDI jitter."
+msgstr ""
+
+#: engine_dialog.cc:2980 port_insert_ui.cc:134
+msgid "Detecting ..."
+msgstr ""
+
+#: engine_dialog.cc:3081
+msgid "Disconnect from %1"
+msgstr ""
+
+#: engine_dialog.cc:3086
+msgid "Running"
+msgstr ""
+
+#: engine_dialog.cc:3088
+msgid "Connected"
+msgstr ""
+
+#: engine_dialog.cc:3099
+msgid "Connect to %1"
+msgstr ""
+
+#: engine_dialog.cc:3103 shuttle_control.cc:663
+msgid "Stopped"
+msgstr ""
+
+#: export_channel_selector.cc:46 export_report.cc:159 export_report.cc:324
+#: sfdb_ui.cc:151
+msgid "Channels:"
+msgstr ""
+
+#: export_channel_selector.cc:47
+msgid "Split to mono files"
+msgstr ""
+
+#: export_channel_selector.cc:197
+msgid "Bus or Track"
+msgstr ""
+
+#: export_channel_selector.cc:474
+msgid "Region contents without fades nor region gain (channels: %1)"
+msgstr ""
+
+#: export_channel_selector.cc:478
+msgid "Region contents with fades and region gain (channels: %1)"
+msgstr ""
+
+#: export_channel_selector.cc:482
+msgid "Track output (channels: %1)"
+msgstr ""
+
+#: export_channel_selector.cc:552
+msgid "Apply track/bus processing"
+msgstr ""
+
+#: export_channel_selector.cc:553
+msgid "Select all tracks"
+msgstr ""
+
+#: export_channel_selector.cc:554
+msgid "Select all busses"
+msgstr ""
+
+#: export_channel_selector.cc:555
+msgid "Deselect all"
+msgstr ""
+
+#: export_channel_selector.cc:589
+msgid "Track name"
+msgstr ""
+
+#: export_dialog.cc:49
+msgid ""
+"<span color=\"#ffa755\">Some already existing files will be overwritten.</"
+"span>"
+msgstr ""
+
+#: export_dialog.cc:50
+msgid "List files"
+msgstr ""
+
+#: export_dialog.cc:163 export_format_dialog.cc:67
+msgid "File format"
+msgstr ""
+
+#: export_dialog.cc:164 export_timespan_selector.cc:411
+#: export_timespan_selector.cc:502
+msgid "Time Span"
+msgstr ""
+
+#: export_dialog.cc:165
+msgid "Channels"
+msgstr ""
+
+#: export_dialog.cc:187
+msgid ""
+"Export has been aborted due to an error!\n"
+"See the Log for details."
+msgstr ""
+
+#: export_dialog.cc:298
+msgid "Files that will be overwritten"
+msgstr ""
+
+#: export_dialog.cc:343
+msgid "Export initialization failed: %1"
+msgstr ""
+
+#: export_dialog.cc:353
+msgid "Stop Export"
+msgstr ""
+
+#: export_dialog.cc:383
+msgid "export"
+msgstr ""
+
+#: export_dialog.cc:402
+msgid "Exporting '%3' (timespan %1 of %2)"
+msgstr ""
+
+#: export_dialog.cc:407
+msgid "Normalizing '%3' (timespan %1 of %2)"
+msgstr ""
+
+#: export_dialog.cc:412
+msgid "Encoding '%3' (timespan %1 of %2)"
+msgstr ""
+
+#: export_dialog.cc:417
+msgid "Tagging '%3' (timespan %1 of %2)"
+msgstr ""
+
+#: export_dialog.cc:421
+msgid "Uploading '%3' (timespan %1 of %2)"
+msgstr ""
+
+#: export_dialog.cc:425
+msgid "Running Post Export Command for '%1'"
+msgstr ""
+
+#: export_dialog.cc:453 export_dialog.cc:455
+msgid "<span color=\"#ffa755\">Error: "
+msgstr ""
+
+#: export_dialog.cc:465
+msgid "<span color=\"#ffa755\">Warning: "
+msgstr ""
+
+#: export_dialog.cc:467
+msgid ""
+"\n"
+"<span color=\"#ffa755\">Warning: "
+msgstr ""
+
+#: export_dialog.cc:491
+msgid "Export Selection"
+msgstr ""
+
+#: export_dialog.cc:505
+msgid "Export Region"
+msgstr ""
+
+#: export_dialog.cc:514
+msgid "Source"
+msgstr ""
+
+#: export_dialog.cc:530
+msgid "Stem Export"
+msgstr ""
+
+#: export_file_notebook.cc:39
+msgid "Add another format"
+msgstr ""
+
+#: export_file_notebook.cc:198
+msgid "Format"
+msgstr ""
+
+#: export_file_notebook.cc:199
+msgid "Location"
+msgstr ""
+
+#: export_file_notebook.cc:200
+msgid "Upload to Soundcloud"
+msgstr ""
+
+#: export_file_notebook.cc:201
+msgid "Analyze Exported Audio"
+msgstr ""
+
+#: export_file_notebook.cc:286
+msgid "No format!"
+msgstr ""
+
+#: export_file_notebook.cc:304
+msgid "Format %1: %2"
+msgstr ""
+
+#: export_filename_selector.cc:33
+msgid "Label:"
+msgstr ""
+
+#: export_filename_selector.cc:34 session_dialog.cc:310
+msgid "Session Name"
+msgstr ""
+
+#: export_filename_selector.cc:35
+msgid "Timespan Name"
+msgstr ""
+
+#: export_filename_selector.cc:36
+msgid "Revision:"
+msgstr ""
+
+#: export_filename_selector.cc:38
+msgid "Folder:"
+msgstr ""
+
+#: export_filename_selector.cc:39 session_import_dialog.cc:45
+#: transcode_video_dialog.cc:59 video_server_dialog.cc:54
+#: video_server_dialog.cc:56 export_video_dialog.cc:77
+#: export_video_dialog.cc:79
+msgid "Browse"
+msgstr ""
+
+#: export_filename_selector.cc:40 export_report.cc:118
+msgid "Open Folder"
+msgstr ""
+
+#: export_filename_selector.cc:45
+msgid "Build filename(s) from these components:"
+msgstr ""
+
+#: export_filename_selector.cc:217
+msgid ""
+"<small><i>Sorry, no example filename can be shown at the moment</i></small>"
+msgstr ""
+
+#: export_filename_selector.cc:219
+msgid "<i>Current (approximate) filename</i>: \"%1\""
+msgstr ""
+
+#: export_filename_selector.cc:255 export_filename_selector.cc:402
+msgid ""
+"%1: this is only the directory/folder name, not the filename.\n"
+"The filename will be chosen from the information just above the folder "
+"selector."
+msgstr ""
+
+#: export_filename_selector.cc:378
+msgid "%1: this is not a valid directory/folder."
+msgstr ""
+
+#: export_filename_selector.cc:388
+msgid "Choose export folder"
+msgstr ""
+
+#: export_format_dialog.cc:32
+msgid "New Export Format Profile"
+msgstr ""
+
+#: export_format_dialog.cc:32
+msgid "Edit Export Format Profile"
+msgstr ""
+
+#: export_format_dialog.cc:39
+msgid "Label: "
+msgstr ""
+
+#: export_format_dialog.cc:42
+msgid "Normalize:"
+msgstr ""
+
+#: export_format_dialog.cc:43
+msgid "Peak"
+msgstr ""
+
+#: export_format_dialog.cc:44
+msgid "Loudness"
+msgstr ""
+
+#: export_format_dialog.cc:50
+msgid "LUFS"
+msgstr ""
+
+#: export_format_dialog.cc:51
+msgid "dBTP"
+msgstr ""
+
+#: export_format_dialog.cc:54
+msgid "Trim silence at start"
+msgstr ""
+
+#: export_format_dialog.cc:55
+msgid "Add silence at start:"
+msgstr ""
+
+#: export_format_dialog.cc:58
+msgid "Trim silence at end"
+msgstr ""
+
+#: export_format_dialog.cc:59
+msgid "Add silence at end:"
+msgstr ""
+
+#: export_format_dialog.cc:62
+msgid ""
+"Command to run post-export\n"
+"(%f=file path, %d=directory, %b=basename, see tooltip for more):"
+msgstr ""
+
+#: export_format_dialog.cc:65
+msgid "Compatibility"
+msgstr ""
+
+#: export_format_dialog.cc:66
+msgid "Quality"
+msgstr ""
+
+#: export_format_dialog.cc:69
+msgid "Sample rate conversion quality:"
+msgstr ""
+
+#: export_format_dialog.cc:76
+msgid "Dithering"
+msgstr ""
+
+#: export_format_dialog.cc:78
+msgid "Create CUE file for disk-at-once CD/DVD creation"
+msgstr ""
+
+#: export_format_dialog.cc:79
+msgid "Create TOC file for disk-at-once CD/DVD creation"
+msgstr ""
+
+#: export_format_dialog.cc:80
+msgid "Create chapter mark file for MP4 chapter marks"
+msgstr ""
+
+#: export_format_dialog.cc:82
+msgid "Tag file with session's metadata"
+msgstr ""
+
+#: export_format_dialog.cc:119
+msgid "∧"
+msgstr ""
+
+#: export_format_dialog.cc:124
+msgid ""
+"Normalize to EBU-R128 LUFS target loudness without exceeding the given true-"
+"peak limit. EBU-R128 normalization is only available for mono and stereo "
+"targets, true-peak works for any channel layout."
+msgstr ""
+
+#: export_format_dialog.cc:152
+msgid ""
+"%a Artist name\n"
+"%b File's base-name\n"
+"%c Copyright\n"
+"%d File's directory\n"
+"%f File's full absolute path\n"
+"%l Lyricist\n"
+"%n Session name\n"
+"%o Conductor\n"
+"%t Title\n"
+"%z Organization\n"
+"%A Album\n"
+"%C Comment\n"
+"%E Engineer\n"
+"%G Genre\n"
+"%L Total track count\n"
+"%M Mixer\n"
+"%N Timespan name\n"
+"%O Composer\n"
+"%P Producer\n"
+"%S Disc subtitle\n"
+"%T Track number\n"
+"%Y Year\n"
+"%Z Country"
+msgstr ""
+
+#: export_format_dialog.cc:537
+msgid "Best (sinc)"
+msgstr ""
+
+#: export_format_dialog.cc:542
+msgid "Medium (sinc)"
+msgstr ""
+
+#: export_format_dialog.cc:547
+msgid "Fast (sinc)"
+msgstr ""
+
+#: export_format_dialog.cc:557
+msgid "Zero order hold"
+msgstr ""
+
+#: export_format_dialog.cc:981
+msgid "Linear encoding options"
+msgstr ""
+
+#: export_format_dialog.cc:997
+msgid "Ogg Vorbis options"
+msgstr ""
+
+#: export_format_dialog.cc:1008
+msgid "FLAC options"
+msgstr ""
+
+#: export_format_dialog.cc:1025
+msgid "Broadcast Wave options"
+msgstr ""
+
+#: export_format_selector.cc:131
+msgid "Do you really want to remove the format?"
+msgstr ""
+
+#: export_preset_selector.cc:28
+msgid "Preset"
+msgstr ""
+
+#: export_preset_selector.cc:99
+msgid ""
+"The selected preset did not load successfully!\n"
+"Perhaps it references a format that has been removed?"
+msgstr ""
+
+#: export_preset_selector.cc:151
+msgid "Do you really want to remove this preset?"
+msgstr ""
+
+#: export_report.cc:56
+msgid "Export Report/Analysis"
+msgstr ""
+
+#: export_report.cc:147 export_report.cc:327 sfdb_ui.cc:149
+msgid "Format:"
+msgstr ""
+
+#: export_report.cc:166 export_report.cc:328
+msgid "%1 Hz"
+msgstr ""
+
+#: export_report.cc:169 export_report.cc:336 transcode_video_dialog.cc:139
+msgid "Duration:"
+msgstr ""
+
+#: export_report.cc:177 export_report.cc:334
+msgid "Timecode:"
+msgstr ""
+
+#: export_report.cc:185
+msgid "Error:"
+msgstr ""
+
+#: export_report.cc:220 export_report.cc:440
+msgid "(too short integration time)"
+msgstr ""
+
+#: export_report.cc:222
+msgid "-888"
+msgstr ""
+
+#: export_report.cc:227 export_report.cc:353
+msgid "Peak:"
+msgstr ""
+
+#: export_report.cc:228 export_report.cc:360
+msgid "%1 dBFS"
+msgstr ""
+
+#: export_report.cc:229 export_report.cc:369
+msgid "True Peak:"
+msgstr ""
+
+#: export_report.cc:230 export_report.cc:376
+msgid "%1 dBTP"
+msgstr ""
+
+#: export_report.cc:231 export_report.cc:387
+msgid "Normalization Gain:"
+msgstr ""
+
+#: export_report.cc:232
+msgid "+888.88 dB"
+msgstr ""
+
+#: export_report.cc:234 export_report.cc:448
+msgid "Integrated Loudness:"
+msgstr ""
+
+#: export_report.cc:235 export_report.cc:454
+msgid "%1 LUFS"
+msgstr ""
+
+#: export_report.cc:236 export_report.cc:460
+msgid "Loudness Range:"
+msgstr ""
+
+#: export_report.cc:237 export_report.cc:466
+msgid "%1 LU"
+msgstr ""
+
+#: export_report.cc:247 export_report.cc:754
+msgid "100"
+msgstr ""
+
+#: export_report.cc:282 export_report.cc:650
+msgid "00:00:00.000"
+msgstr ""
+
+#: export_report.cc:288
+msgid "0|A8"
+msgstr ""
+
+#: export_report.cc:394
+msgid "%1 dB"
+msgstr ""
+
+#: export_report.cc:425 export_report.cc:433 export_report.cc:553
+msgid ""
+"Not\n"
+"Available"
+msgstr ""
+
+#: export_report.cc:493
+msgid ""
+"LUFS\n"
+"(short)"
+msgstr ""
+
+#: export_report.cc:503
+msgid "Multiplicity"
+msgstr ""
+
+#: export_report.cc:603
+msgid "Logscale|Lg"
+msgstr ""
+
+#: export_report.cc:604
+msgid "Rectified|Rf"
+msgstr ""
+
+#: export_report.cc:605
+msgid "Logscale"
+msgstr ""
+
+#: export_report.cc:606
+msgid "Rectified"
+msgstr ""
+
+#: export_report.cc:738
+msgid "Hz"
+msgstr ""
+
+#: export_report.cc:755
+msgid "500"
+msgstr ""
+
+#: export_report.cc:756
+msgid "1K"
+msgstr ""
+
+#: export_report.cc:757
+msgid "5K"
+msgstr ""
+
+#: export_report.cc:758
+msgid "10K"
+msgstr ""
+
+#: export_report.cc:844
+msgid "Writing Export Analysis Image: %1."
+msgstr ""
+
+#: export_report.cc:941 sfdb_ui.cc:293 sfdb_ui.cc:409
+msgid "Could not read file: %1 (%2)."
+msgstr ""
+
+#: export_report.cc:967 sfdb_ui.cc:458
+msgid "Could not access soundfile: "
+msgstr ""
+
+#: export_report.cc:1203
+msgid "-36"
+msgstr ""
+
+#: export_report.cc:1204 export_report.cc:1208 export_report.cc:1214
+#: export_report.cc:1217
+msgid "-18"
+msgstr ""
+
+#: export_report.cc:1205 export_report.cc:1209 export_report.cc:1215
+#: export_report.cc:1218 export_report.cc:1221 export_report.cc:1222
+msgid "-9"
+msgstr ""
+
+#: export_report.cc:1206 export_report.cc:1210 export_report.cc:1216
+#: export_report.cc:1219 export_report.cc:1223 export_report.cc:1224
+msgid "-3"
+msgstr ""
+
+#: export_timespan_selector.cc:45
+msgid "Show Times as:"
+msgstr ""
+
+#: export_timespan_selector.cc:46
+msgid "Realtime Export"
+msgstr ""
+
+#: export_timespan_selector.cc:54 processor_box.cc:3695
+msgid "Select All"
+msgstr ""
+
+#: export_timespan_selector.cc:255 transform_dialog.cc:93
+msgid " to "
+msgstr ""
+
+#: export_timespan_selector.cc:399 export_timespan_selector.cc:488
+msgid "RT"
+msgstr ""
+
+#: export_timespan_selector.cc:400 export_timespan_selector.cc:489
+msgid "Range"
+msgstr ""
+
+#: sfdb_freesound_mootcher.cc:189 sfdb_freesound_mootcher.cc:324
+msgid "curl error %1 (%2)"
+msgstr ""
+
+#: sfdb_freesound_mootcher.cc:266
+msgid "getSoundResourceFile: There is no valid root in the xml file"
+msgstr ""
+
+#: sfdb_freesound_mootcher.cc:271
+msgid "getSoundResourceFile: root = %1, != response"
+msgstr ""
+
+#: sfdb_freesound_mootcher.cc:410 rc_option_editor.cc:2416
+msgid "%1"
+msgstr ""
+
+#: gain_meter.cc:137 gain_meter.cc:422 gain_meter.cc:527 gain_meter.cc:919
+msgid "-inf"
+msgstr ""
+
+#: gain_meter.cc:152 gain_meter.cc:983
+msgid "Fader automation mode"
+msgstr ""
+
+#: gain_meter.cc:153 gain_meter.cc:984
+msgid "Fader automation type"
+msgstr ""
+
+#: gain_meter.cc:162 gain_meter.cc:852 panner_ui.cc:179 panner_ui.cc:641
+msgid "Abs"
+msgstr ""
+
+#: gain_meter.cc:816 vca_master_strip.cc:78 vca_time_axis.cc:54
+msgid "M"
+msgstr ""
+
+#: gain_meter.cc:819 vca_master_strip.cc:296
+msgid "P"
+msgstr ""
+
+#: gain_meter.cc:822
+msgid "T"
+msgstr ""
+
+#: gain_meter.cc:825
+msgid "W"
+msgstr ""
+
+#: generic_pluginui.cc:83
+msgid "<span size=\"large\">Presets</span>"
+msgstr ""
+
+#: generic_pluginui.cc:99 plugin_pin_dialog.cc:333
+msgid "Manual"
+msgstr ""
+
+#: generic_pluginui.cc:108
+msgid "All Automation"
+msgstr ""
+
+#: generic_pluginui.cc:259
+msgid "Plugin Editor: could not build control element for port %1"
+msgstr ""
+
+#: generic_pluginui.cc:290
+msgid "Plugin Editor: no control for property %1"
+msgstr ""
+
+#: generic_pluginui.cc:296
+msgid "Plugin Editor: could not build control element for property %1"
+msgstr ""
+
+#: generic_pluginui.cc:370
+msgid "Switches"
+msgstr ""
+
+#: generic_pluginui.cc:380 generic_pluginui.cc:486 processor_box.cc:3665
+msgid "Controls"
+msgstr ""
+
+#: generic_pluginui.cc:521
+msgid "Meters"
+msgstr ""
+
+#: generic_pluginui.cc:559
+msgid "Automation control"
+msgstr ""
+
+#: generic_pluginui.cc:566
+msgid "Mgnual"
+msgstr ""
+
+#: generic_pluginui.cc:831
+msgid "This control cannot be automated"
+msgstr ""
+
+#: global_port_matrix.cc:158
+msgid "Audio Connection Manager"
+msgstr ""
+
+#: global_port_matrix.cc:161
+msgid "MIDI Connection Manager"
+msgstr ""
+
+#: global_port_matrix.cc:201 io_selector.cc:211 mixer_strip.cc:870
+#: mixer_strip.cc:973 monitor_section.cc:1430 monitor_selector.cc:189
+#: plugin_pin_dialog.cc:1757
+msgid "Disconnect"
+msgstr ""
+
+#: global_port_matrix.cc:207 io_selector.cc:217 monitor_selector.cc:195
+msgid "port"
+msgstr ""
+
+#: group_tabs.cc:312 group_tabs.cc:321
+msgid "Selection..."
+msgstr ""
+
+#: group_tabs.cc:313 group_tabs.cc:322
+msgid "Record Enabled..."
+msgstr ""
+
+#: group_tabs.cc:314 group_tabs.cc:323
+msgid "Soloed..."
+msgstr ""
+
+#: group_tabs.cc:316
+msgid "Create New Group From..."
+msgstr ""
+
+#: group_tabs.cc:325
+msgid "Create New Group with Master From..."
+msgstr ""
+
+#: group_tabs.cc:352
+msgid "Edit Group..."
+msgstr ""
+
+#: group_tabs.cc:353
+msgid "Collect Group"
+msgstr ""
+
+#: group_tabs.cc:354
+msgid "Remove Group"
+msgstr ""
+
+#: group_tabs.cc:365
+msgid "Assign Group to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:371
+msgid "Remove Subgroup Bus"
+msgstr ""
+
+#: group_tabs.cc:373
+msgid "Add New Subgroup Bus"
+msgstr ""
+
+#: group_tabs.cc:375
+msgid "Add New Aux Bus (pre-fader)"
+msgstr ""
+
+#: group_tabs.cc:376
+msgid "Add New Aux Bus (post-fader)"
+msgstr ""
+
+#: group_tabs.cc:401
+msgid "Assign Selection to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:412
+msgid "Assign Record Enabled to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:423
+msgid "Assign Soloed to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:426
+msgid "Enable All Groups"
+msgstr ""
+
+#: group_tabs.cc:427
+msgid "Disable All Groups"
+msgstr ""
+
+#: insert_remove_time_dialog.cc:52
+msgid "Time to remove"
+msgstr ""
+
+#: insert_remove_time_dialog.cc:52
+msgid "Time to insert:"
+msgstr ""
+
+#: insert_remove_time_dialog.cc:61
+msgid "Intersected regions should:"
+msgstr ""
+
+#: insert_remove_time_dialog.cc:64
+msgid "stay in position"
+msgstr ""
+
+#: insert_remove_time_dialog.cc:65
+msgid "move"
+msgstr ""
+
+#: insert_remove_time_dialog.cc:66
+msgid "be split"
+msgstr ""
+
+#: insert_remove_time_dialog.cc:73
+msgid "Apply to all the track's playlists"
+msgstr ""
+
+#: insert_remove_time_dialog.cc:76
+msgid "Move glued regions"
+msgstr ""
+
+#: insert_remove_time_dialog.cc:78
+msgid "Move markers"
+msgstr ""
+
+#: insert_remove_time_dialog.cc:81
+msgid "Move glued markers"
+msgstr ""
+
+#: insert_remove_time_dialog.cc:86
+msgid "Move locked markers"
+msgstr ""
+
+#: insert_remove_time_dialog.cc:91
+msgid ""
+"Move tempo and meter changes\n"
+"<i>(may cause oddities in the tempo map)</i>"
+msgstr ""
+
+#: insert_remove_time_dialog.cc:99
+msgid "Remove time"
+msgstr ""
+
+#: insert_remove_time_dialog.cc:99
+msgid "Insert time"
+msgstr ""
+
+#: insert_remove_time_dialog.cc:174
+msgid "Invalid or zero duration entered. Please enter a valid duration"
+msgstr ""
+
+#: instrument_selector.cc:92
+msgid "-none-"
+msgstr ""
+
+#: interthread_progress_window.cc:114
+msgid "Importing file: %1 of %2"
+msgstr ""
+
+#: io_selector.cc:221
+msgid "I/O selector"
+msgstr ""
+
+#: io_selector.cc:266 monitor_selector.cc:244
+msgid "%1 input"
+msgstr ""
+
+#: io_selector.cc:268 monitor_selector.cc:246
+msgid "%1 output"
+msgstr ""
+
+#: keyboard.cc:93
+msgid "your own"
+msgstr ""
+
+#: keyboard.cc:157 keyboard.cc:181
+msgid "Default keybindings not found - %1 will be hard to use!"
+msgstr ""
+
+#: keyboard.cc:160
+msgid "Key bindings file \"%1\" not found. Default bindings used instead"
+msgstr ""
+
+#: keyboard.cc:193
+msgid "Loading keybindings from %1"
+msgstr ""
+
+#: keyeditor.cc:67
+msgid "Colliding keybindings"
+msgstr ""
+
+#: keyeditor.cc:68
+msgid ""
+"The key sequence is already bound. Please remove the other binding first."
+msgstr ""
+
+#: keyeditor.cc:77
+msgid "Key Bindings"
+msgstr ""
+
+#: keyeditor.cc:78
+msgid "Remove shortcut"
+msgstr ""
+
+#: keyeditor.cc:80
+msgid "Search..."
+msgstr ""
+
+#: keyeditor.cc:82
+msgid "Print"
+msgstr ""
+
+#: keyeditor.cc:93
+msgid "Click to reset search string"
+msgstr ""
+
+#: keyeditor.cc:97
+msgid "To remove a shortcut select an action then press this: "
+msgstr ""
+
+#: keyeditor.cc:109
+msgid "Reset Bindings to Defaults"
+msgstr ""
+
+#: keyeditor.cc:227 lua_script_manager.cc:41
+msgid "Action"
+msgstr ""
+
+#: keyeditor.cc:228
+msgid "Shortcut"
+msgstr ""
+
+#: keyeditor.cc:370
+msgid "RegionList"
+msgstr ""
+
+#: keyeditor.cc:543
+msgid "Could not open temporary file to print bindings (%1)"
+msgstr ""
+
+#: keyeditor.cc:561
+msgid "Could not save bindings to file (%1)"
+msgstr ""
+
+#: latency_gui.cc:39
+msgid "sample"
+msgstr ""
+
+#: latency_gui.cc:40
+msgid "msec"
+msgstr ""
+
+#: latency_gui.cc:41
+msgid "period"
+msgstr ""
+
+#: latency_gui.cc:72 panner_ui.cc:411 plugin_pin_dialog.cc:109
+#: plugin_ui.cc:422
+msgid "Reset"
+msgstr ""
+
+#: latency_gui.cc:149 rhythm_ferret.cc:295 sfdb_ui.cc:1878
+msgid "programming error: %1 (%2)"
+msgstr ""
+
+#: location_ui.cc:54 location_ui.cc:57
+msgid "Use PH"
+msgstr ""
+
+#: location_ui.cc:55 location_ui.cc:58
+msgid "Goto"
+msgstr ""
+
+#: location_ui.cc:63
+msgid "Glue"
+msgstr ""
+
+#: location_ui.cc:88
+msgid "Performer:"
+msgstr ""
+
+#: location_ui.cc:89
+msgid "Composer:"
+msgstr ""
+
+#: location_ui.cc:91
+msgid "Pre-Emphasis"
+msgstr ""
+
+#: location_ui.cc:319
+msgid "Remove this range"
+msgstr ""
+
+#: location_ui.cc:320
+msgid "Start time - middle click to locate here"
+msgstr ""
+
+#: location_ui.cc:321
+msgid "End time - middle click to locate here"
+msgstr ""
+
+#: location_ui.cc:324
+msgid "Set range start from playhead location"
+msgstr ""
+
+#: location_ui.cc:325
+msgid "Set range end from playhead location"
+msgstr ""
+
+#: location_ui.cc:329
+msgid "Remove this marker"
+msgstr ""
+
+#: location_ui.cc:330
+msgid "Position - middle click to locate here"
+msgstr ""
+
+#: location_ui.cc:332
+msgid "Set marker time from playhead location"
+msgstr ""
+
+#: location_ui.cc:524
+msgid "You cannot put a CD marker at the start of the session"
+msgstr ""
+
+#: location_ui.cc:750
+msgid "New Marker"
+msgstr ""
+
+#: location_ui.cc:751
+msgid "New Range"
+msgstr ""
+
+#: location_ui.cc:764
+msgid "<b>Loop/Punch Ranges</b>"
+msgstr ""
+
+#: location_ui.cc:790
+msgid "<b>Markers (Including CD Index)</b>"
+msgstr ""
+
+#: location_ui.cc:825
+msgid "<b>Ranges (Including CD Track Ranges)</b>"
+msgstr ""
+
+#: location_ui.cc:1068
+msgid "add range marker"
+msgstr ""
+
+#: lua_script_manager.cc:31
+msgid "Add/Set"
+msgstr ""
+
+#: lua_script_manager.cc:34
+msgid "Call"
+msgstr ""
+
+#: lua_script_manager.cc:35
+msgid "New Hook"
+msgstr ""
+
+#: lua_script_manager.cc:77
+msgid "Signal(s)"
+msgstr ""
+
+#: lua_script_manager.cc:127
+msgid "Action %1"
+msgstr ""
+
+#: lua_script_manager.cc:132 lua_script_manager.cc:227
+msgid "Unset"
+msgstr ""
+
+#: luainstance.cc:1096
+msgid "Cannot read script '%1': %2"
+msgstr ""
+
+#: luawindow.cc:97
+msgid "Run"
+msgstr ""
+
+#: luawindow.cc:98
+msgid "Clear Output"
+msgstr ""
+
+#: luawindow.cc:102
+msgid "Revert"
+msgstr ""
+
+#: luawindow.cc:166
+msgid "Select Editor Buffer"
+msgstr ""
+
+#: luawindow.cc:253 luawindow.cc:258
+msgid "Window|Lua"
+msgstr ""
+
+#: luawindow.cc:286 luawindow.cc:304
+msgid "LuaException: %1"
+msgstr ""
+
+#: luawindow.cc:342
+msgid "Deleted %1"
+msgstr ""
+
+#: luawindow.cc:345
+msgid "Failed to delete %1"
+msgstr ""
+
+#: luawindow.cc:411
+msgid ""
+"Missing script header.\n"
+"The script requires an '{ardour}' info table and a 'factory' function."
+msgstr ""
+
+#: luawindow.cc:416
+msgid "Script fails to compile."
+msgstr ""
+
+#: luawindow.cc:423
+msgid "Invalid or missing script-name or script-type."
+msgstr ""
+
+#: luawindow.cc:428
+msgid ""
+"Invalid script-type.\n"
+"Valid types are 'EditorAction' and 'Snippet'."
+msgstr ""
+
+#: luawindow.cc:439 luawindow.cc:490
+msgid "Saved as %1"
+msgstr ""
+
+#: luawindow.cc:442 luawindow.cc:493
+msgid "Error saving file: %1"
+msgstr ""
+
+#: luawindow.cc:452
+msgid ""
+"Script with given name '%1' already exists.\n"
+"Use a different name in the descriptor."
+msgstr ""
+
+#: luawindow.cc:636
+msgid "Scratch Buffer %1"
+msgstr ""
+
+#: luawindow.cc:638
+msgid "Action: '%1'"
+msgstr ""
+
+#: luawindow.cc:640
+msgid "Snippet: %1"
+msgstr ""
+
+#: luawindow.cc:652
+msgid "Save as"
+msgstr ""
+
+#: main.cc:88
+msgid "%1 could not connect to the audio backend."
+msgstr ""
+
+#: main.cc:135 main.cc:151
+msgid "The audio backend (%1) has failed, or terminated"
+msgstr ""
+
+#: main.cc:138
+msgid ""
+"%2 exited unexpectedly, and without notifying %1.\n"
+"\n"
+"This could be due to misconfiguration or to an error inside %2.\n"
+"\n"
+"Click OK to exit %1."
+msgstr ""
+
+#: main.cc:152
+msgid "%2 exited unexpectedly, and without notifying %1."
+msgstr ""
+
+#: main.cc:247
+msgid ""
+"\n"
+"   %1 could not understand your command line      "
+msgstr ""
+
+#: main.cc:249
+msgid "An error was encountered while launching %1"
+msgstr ""
+
+#: main.cc:350
+msgid " (built using "
+msgstr ""
+
+#: main.cc:353
+msgid " and GCC version "
+msgstr ""
+
+#: main.cc:363
+msgid "Copyright (C) 1999-2015 Paul Davis"
+msgstr ""
+
+#: main.cc:364
+msgid ""
+"Some portions Copyright (C) Steve Harris, Ari Johnson, Brett Viren, Joel "
+"Baker, Robin Gareus"
+msgstr ""
+
+#: main.cc:366
+msgid "%1 comes with ABSOLUTELY NO WARRANTY"
+msgstr ""
+
+#: main.cc:367
+msgid "not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+msgstr ""
+
+#: main.cc:368
+msgid "This is free software, and you are welcome to redistribute it "
+msgstr ""
+
+#: main.cc:369
+msgid "under certain conditions; see the source for copying conditions."
+msgstr ""
+
+#: main.cc:374
+msgid "could not initialize %1."
+msgstr ""
+
+#: main.cc:384
+msgid "Cannot xinstall SIGPIPE error handler"
+msgstr ""
+
+#: main.cc:391
+msgid "Could not complete pre-GUI initialization"
+msgstr ""
+
+#: main.cc:398
+msgid "could not create %1 GUI"
+msgstr ""
+
+#: main_clock.cc:51
+msgid "Display delta to edit cursor"
+msgstr ""
+
+#: main_clock.cc:66 tempo_dialog.cc:55
+msgid "Edit Tempo"
+msgstr ""
+
+#: main_clock.cc:67 tempo_dialog.cc:429
+msgid "Edit Meter"
+msgstr ""
+
+#: main_clock.cc:68
+msgid "Insert Tempo Change"
+msgstr ""
+
+#: main_clock.cc:69
+msgid "Insert Meter Change"
+msgstr ""
+
+#: marker.cc:280
+msgid "MarkerText"
+msgstr ""
+
+#: midi_channel_selector.cc:161 midi_channel_selector.cc:400
+#: midi_channel_selector.cc:436 rc_option_editor.cc:2157
+#: rc_option_editor.cc:2799 sfdb_ui.cc:671
+msgid "None"
+msgstr ""
+
+#: midi_channel_selector.cc:165 midi_channel_selector.cc:405
+#: midi_channel_selector.cc:441
+msgid "Invert"
+msgstr ""
+
+#: midi_channel_selector.cc:169
+msgid "Force"
+msgstr ""
+
+#: midi_channel_selector.cc:328 midi_channel_selector.cc:370
+msgid "MIDI Channel Control"
+msgstr ""
+
+#: midi_channel_selector.cc:330
+msgid "Playback all channels"
+msgstr ""
+
+#: midi_channel_selector.cc:331
+msgid "Play only selected channels"
+msgstr ""
+
+#: midi_channel_selector.cc:332
+msgid "Use a single fixed channel for all playback"
+msgstr ""
+
+#: midi_channel_selector.cc:333
+msgid "Record all channels"
+msgstr ""
+
+#: midi_channel_selector.cc:334
+msgid "Record only selected channels"
+msgstr ""
+
+#: midi_channel_selector.cc:335
+msgid "Force all channels to 1 channel"
+msgstr ""
+
+#: midi_channel_selector.cc:376
+msgid "Inbound"
+msgstr ""
+
+#: midi_channel_selector.cc:396
+msgid "Click to enable recording all channels"
+msgstr ""
+
+#: midi_channel_selector.cc:401
+msgid "Click to disable recording all channels"
+msgstr ""
+
+#: midi_channel_selector.cc:406
+msgid "Click to invert currently selected recording channels"
+msgstr ""
+
+#: midi_channel_selector.cc:413
+msgid "Playback"
+msgstr ""
+
+#: midi_channel_selector.cc:432
+msgid "Click to enable playback of all channels"
+msgstr ""
+
+#: midi_channel_selector.cc:437
+msgid "Click to disable playback of all channels"
+msgstr ""
+
+#: midi_channel_selector.cc:442
+msgid "Click to invert current selected playback channels"
+msgstr ""
+
+#: midi_channel_selector.cc:620
+msgid "Click to toggle playback of channel %1"
+msgstr ""
+
+#: midi_channel_selector.cc:628
+msgid "Click to force all MIDI channel messages to channel %1"
+msgstr ""
+
+#: midi_channel_selector.cc:720
+msgid "Click to toggle recording of channel %1"
+msgstr ""
+
+#: midi_channel_selector.cc:728
+msgid "Click to force all recorded channels to %1"
+msgstr ""
+
+#: midi_export_dialog.cc:35
+msgid "Export MIDI: %1"
+msgstr ""
+
+#: midi_list_editor.cc:56
+msgid "Whole"
+msgstr ""
+
+#: midi_list_editor.cc:57
+msgid "Half"
+msgstr ""
+
+#: midi_list_editor.cc:58
+msgid "Triplet"
+msgstr ""
+
+#: midi_list_editor.cc:59
+msgid "Quarter"
+msgstr ""
+
+#: midi_list_editor.cc:60
+msgid "Eighth"
+msgstr ""
+
+#: midi_list_editor.cc:61
+msgid "Sixteenth"
+msgstr ""
+
+#: midi_list_editor.cc:62
+msgid "Thirty-second"
+msgstr ""
+
+#: midi_list_editor.cc:63
+msgid "Sixty-fourth"
+msgstr ""
+
+#: midi_list_editor.cc:106
+msgid "Num"
+msgstr ""
+
+#: midi_list_editor.cc:108
+msgid "Vel"
+msgstr ""
+
+#: midi_list_editor.cc:216
+msgid "edit note start"
+msgstr ""
+
+#: midi_list_editor.cc:225
+msgid "edit note channel"
+msgstr ""
+
+#: midi_list_editor.cc:235
+msgid "edit note number"
+msgstr ""
+
+#: midi_list_editor.cc:245
+msgid "edit note velocity"
+msgstr ""
+
+#: midi_list_editor.cc:259
+msgid "edit note length"
+msgstr ""
+
+#: midi_list_editor.cc:463
+msgid "insert new note"
+msgstr ""
+
+#: midi_list_editor.cc:527
+msgid "delete notes (from list)"
+msgstr ""
+
+#: midi_list_editor.cc:602
+msgid "change note channel"
+msgstr ""
+
+#: midi_list_editor.cc:610
+msgid "change note number"
+msgstr ""
+
+#: midi_list_editor.cc:620
+msgid "change note velocity"
+msgstr ""
+
+#: midi_list_editor.cc:690
+msgid "change note length"
+msgstr ""
+
+#: midi_port_dialog.cc:39
+msgid "Add MIDI Port"
+msgstr ""
+
+#: midi_port_dialog.cc:40
+msgid "Port name:"
+msgstr ""
+
+#: midi_port_dialog.cc:45
+msgid "MidiPortDialog"
+msgstr ""
+
+#: midi_region_view.cc:855
+msgid "channel edit"
+msgstr ""
+
+#: midi_region_view.cc:891
+msgid "velocity edit"
+msgstr ""
+
+#: midi_region_view.cc:958
+msgid "add note"
+msgstr ""
+
+#: midi_region_view.cc:1902
+msgid "step add"
+msgstr ""
+
+#: midi_region_view.cc:1996 midi_region_view.cc:2019
+msgid "alter patch change"
+msgstr ""
+
+#: midi_region_view.cc:2055
+msgid "add patch change"
+msgstr ""
+
+#: midi_region_view.cc:2077 midi_region_view.cc:2078
+msgid "move patch change"
+msgstr ""
+
+#: midi_region_view.cc:2090 midi_region_view.cc:2091
+msgid "delete patch change"
+msgstr ""
+
+#: midi_region_view.cc:2129
+msgid "delete selection"
+msgstr ""
+
+#: midi_region_view.cc:2146
+msgid "delete note"
+msgstr ""
+
+#: midi_region_view.cc:2587
+msgid "move notes"
+msgstr ""
+
+#: midi_region_view.cc:3137
+msgid "change velocities"
+msgstr ""
+
+#: midi_region_view.cc:3203
+msgid "transpose"
+msgstr ""
+
+#: midi_region_view.cc:3231
+msgid "change note lengths"
+msgstr ""
+
+#: midi_region_view.cc:3307
+msgid "nudge"
+msgstr ""
+
+#: midi_region_view.cc:3322
+msgid "change channel"
+msgstr ""
+
+#: midi_region_view.cc:3370
+msgid "Bank "
+msgstr ""
+
+#: midi_region_view.cc:3372
+msgid "Channel "
+msgstr ""
+
+#: midi_region_view.cc:3564
+msgid "paste"
+msgstr ""
+
+#: midi_streamview.cc:184
+msgid "attempt to display MIDI region with no source"
+msgstr ""
+
+#: midi_streamview.cc:194
+msgid "attempt to display MIDI region with no model"
+msgstr ""
+
+#: midi_streamview.cc:505
+msgid "failed to create MIDI region"
+msgstr ""
+
+#: midi_time_axis.cc:306
+msgid "External MIDI Device"
+msgstr ""
+
+#: midi_time_axis.cc:307
+msgid "External Device Mode"
+msgstr ""
+
+#: midi_time_axis.cc:315
+msgid "Chns"
+msgstr ""
+
+#: midi_time_axis.cc:317
+msgid "Click to edit channel settings"
+msgstr ""
+
+#: midi_time_axis.cc:516
+msgid "Show Full Range"
+msgstr ""
+
+#: midi_time_axis.cc:521
+msgid "Fit Contents"
+msgstr ""
+
+#: midi_time_axis.cc:525
+msgid "Note Range"
+msgstr ""
+
+#: midi_time_axis.cc:526
+msgid "Note Mode"
+msgstr ""
+
+#: midi_time_axis.cc:527
+msgid "Channel Selector"
+msgstr ""
+
+#: midi_time_axis.cc:532
+msgid "Color Mode"
+msgstr ""
+
+#: midi_time_axis.cc:591
+msgid "Bender"
+msgstr ""
+
+#: midi_time_axis.cc:595
+msgid "Pressure"
+msgstr ""
+
+#: midi_time_axis.cc:607
+msgid "Controllers"
+msgstr ""
+
+#: midi_time_axis.cc:612
+msgid "No MIDI Channels selected"
+msgstr ""
+
+#: midi_time_axis.cc:669 midi_time_axis.cc:798
+msgid "Hide all channels"
+msgstr ""
+
+#: midi_time_axis.cc:673 midi_time_axis.cc:802
+msgid "Show all channels"
+msgstr ""
+
+#: midi_time_axis.cc:684 midi_time_axis.cc:813
+msgid "Channel %1"
+msgstr ""
+
+#: midi_time_axis.cc:939 midi_time_axis.cc:971
+msgid "Controllers %1-%2"
+msgstr ""
+
+#: midi_time_axis.cc:962 midi_time_axis.cc:965
+msgid "Controller %1"
+msgstr ""
+
+#: midi_time_axis.cc:988
+msgid "Sustained"
+msgstr ""
+
+#: midi_time_axis.cc:995
+msgid "Percussive"
+msgstr ""
+
+#: midi_time_axis.cc:1015
+msgid "Meter Colors"
+msgstr ""
+
+#: midi_time_axis.cc:1022
+msgid "Channel Colors"
+msgstr ""
+
+#: midi_time_axis.cc:1029
+msgid "Track Color"
+msgstr ""
+
+#: midi_time_axis.cc:1610 midi_time_axis.cc:1616 midi_time_axis.cc:1626
+#: midi_time_axis.cc:1632
+msgid "all"
+msgstr ""
+
+#: midi_time_axis.cc:1613 midi_time_axis.cc:1629
+msgid "some"
+msgstr ""
+
+#: midi_tracer.cc:48
+msgid "Line history: "
+msgstr ""
+
+#: midi_tracer.cc:55
+msgid "Auto-Scroll"
+msgstr ""
+
+#: midi_tracer.cc:56
+msgid "Decimal"
+msgstr ""
+
+#: midi_tracer.cc:57 rc_option_editor.cc:1356
+msgid "Enabled"
+msgstr ""
+
+#: midi_tracer.cc:58
+msgid "Delta times"
+msgstr ""
+
+#: midi_tracer.cc:71
+msgid "Port:"
+msgstr ""
+
+#: midi_velocity_dialog.cc:31
+msgid "New velocity"
+msgstr ""
+
+#: missing_file_dialog.cc:36
+msgid "Missing File"
+msgstr ""
+
+#: missing_file_dialog.cc:38
+msgid "Select a folder to search"
+msgstr ""
+
+#: missing_file_dialog.cc:39
+msgid "Add chosen folder to search path, and try again"
+msgstr ""
+
+#: missing_file_dialog.cc:41
+msgid "Stop loading this session"
+msgstr ""
+
+#: missing_file_dialog.cc:42
+msgid "Skip all missing files"
+msgstr ""
+
+#: missing_file_dialog.cc:43
+msgid "Skip this file"
+msgstr ""
+
+#: missing_file_dialog.cc:57 tempo_dialog.cc:135 tempo_dialog.cc:136
+#: tempo_dialog.cc:484 tempo_dialog.cc:485
+msgid "audio"
+msgstr ""
+
+#: missing_file_dialog.cc:74
+msgid ""
+"%1 cannot find the %2 file\n"
+"\n"
+"<i>%3</i>\n"
+"\n"
+"in any of these folders:\n"
+"\n"
+"<tt>%4</tt>\n"
+"\n"
+msgstr ""
+
+#: missing_file_dialog.cc:108
+msgid "Click to choose an additional folder"
+msgstr ""
+
+#: missing_plugin_dialog.cc:29
+msgid "Missing Plugins"
+msgstr ""
+
+#: missing_plugin_dialog.cc:36 transcode_video_dialog.cc:60
+msgid "OK"
+msgstr ""
+
+#: missing_plugin_dialog.cc:42
+msgid ""
+"This session contains the following plugins that cannot be found on this "
+"system:\n"
+"\n"
+msgstr ""
+
+#: missing_plugin_dialog.cc:48
+msgid ""
+"\n"
+"Those plugins will be replaced with inactive stubs.\n"
+"It is recommended that you install the missing plugins and re-load the "
+"session.\n"
+"(also check the blacklist, Window > Log and Preferences > Plugins)"
+msgstr ""
+
+#: mixer_strip.cc:100 mixer_strip.cc:133
+msgid "pre"
+msgstr ""
+
+#: mixer_strip.cc:104 mixer_strip.cc:136 mixer_strip.cc:397
+#: mixer_strip.cc:1548 mixer_strip.cc:1559 rc_option_editor.cc:3147
+msgid "Comments"
+msgstr ""
+
+#: mixer_strip.cc:160
+msgid "Click to toggle the width of this mixer strip."
+msgstr ""
+
+#: mixer_strip.cc:162
+msgid ""
+"\n"
+"%1-%2-click to toggle the width of all strips."
+msgstr ""
+
+#: mixer_strip.cc:171
+msgid "Hide this mixer strip"
+msgstr ""
+
+#: mixer_strip.cc:182
+msgid "Click to select metering point"
+msgstr ""
+
+#: mixer_strip.cc:198
+msgid "Isolate Solo"
+msgstr ""
+
+#: mixer_strip.cc:206
+msgid "Lock Solo Status"
+msgstr ""
+
+#: mixer_strip.cc:208 mixer_strip.cc:2225
+msgid "SoloLock|Lock"
+msgstr ""
+
+#: mixer_strip.cc:209 mixer_strip.cc:2224
+msgid "Iso"
+msgstr ""
+
+#: mixer_strip.cc:263
+msgid "Mix group"
+msgstr ""
+
+#: mixer_strip.cc:275
+msgid "Trim: "
+msgstr ""
+
+#: mixer_strip.cc:393 rc_option_editor.cc:3143
+msgid "Phase Invert"
+msgstr ""
+
+#: mixer_strip.cc:394 rc_option_editor.cc:3144
+msgid "Record & Monitor"
+msgstr ""
+
+#: mixer_strip.cc:395 rc_option_editor.cc:3145
+msgid "Solo Iso / Lock"
+msgstr ""
+
+#: mixer_strip.cc:398 rc_option_editor.cc:3148
+msgid "VCA Assigns"
+msgstr ""
+
+#: mixer_strip.cc:545
+msgid "Show/Hide Monitoring Section"
+msgstr ""
+
+#: mixer_strip.cc:590
+msgid "Enable/Disable MIDI input"
+msgstr ""
+
+#: mixer_strip.cc:756
+msgid "Aux"
+msgstr ""
+
+#: mixer_strip.cc:782
+msgid "Snd"
+msgstr ""
+
+#: mixer_strip.cc:853 mixer_strip.cc:958 processor_box.cc:3606
+msgid "Not connected to audio engine - no I/O changes are possible"
+msgstr ""
+
+#: mixer_strip.cc:911 mixer_strip.cc:1014
+msgid "Add %1 port"
+msgstr ""
+
+#: mixer_strip.cc:919 mixer_strip.cc:1021 monitor_section.cc:1466
+#: plugin_pin_dialog.cc:1782
+msgid "Routing Grid"
+msgstr ""
+
+#: mixer_strip.cc:1298
+msgid "MIDI "
+msgstr ""
+
+#: mixer_strip.cc:1302
+msgid "<b>INPUT</b> to %1"
+msgstr ""
+
+#: mixer_strip.cc:1304 monitor_section.cc:1511
+msgid "<b>OUTPUT</b> from %1"
+msgstr ""
+
+#: mixer_strip.cc:1417 monitor_section.cc:1598
+msgid "Disconnected"
+msgstr ""
+
+#: mixer_strip.cc:1544
+msgid "Click to add/edit comments"
+msgstr ""
+
+#: mixer_strip.cc:1548 mixer_strip.cc:1559
+msgid "Cmt"
+msgstr ""
+
+#: mixer_strip.cc:1604
+msgid "Grp"
+msgstr ""
+
+#: mixer_strip.cc:1607
+msgid "~G"
+msgstr ""
+
+#: mixer_strip.cc:1648 route_time_axis.cc:585 vca_master_strip.cc:396
+msgid "Color..."
+msgstr ""
+
+#: mixer_strip.cc:1650 route_time_axis.cc:587
+msgid "Comments..."
+msgstr ""
+
+#: mixer_strip.cc:1652 route_time_axis.cc:589
+msgid "Inputs..."
+msgstr ""
+
+#: mixer_strip.cc:1654 route_time_axis.cc:591
+msgid "Outputs..."
+msgstr ""
+
+#: mixer_strip.cc:1659
+msgid "Save As Template..."
+msgstr ""
+
+#: mixer_strip.cc:1665 route_group_dialog.cc:45 route_time_axis.cc:851
+msgid "Active"
+msgstr ""
+
+#: mixer_strip.cc:1673 plugin_pin_dialog.cc:1011
+msgid "Strict I/O"
+msgstr ""
+
+#: mixer_strip.cc:1683 plugin_ui.cc:424 processor_box.cc:3710
+msgid "Pin Connections..."
+msgstr ""
+
+#: mixer_strip.cc:1687
+msgid "Adjust Latency..."
+msgstr ""
+
+#: mixer_strip.cc:1690
+msgid "Protect Against Denormals"
+msgstr ""
+
+#: mixer_strip.cc:1709 route_time_axis.cc:867
+msgid "Duplicate..."
+msgstr ""
+
+#: mixer_strip.cc:2004
+msgid "Pre"
+msgstr ""
+
+#: mixer_strip.cc:2008
+msgid "Post"
+msgstr ""
+
+#: mixer_strip.cc:2024
+msgid "Meter|In"
+msgstr ""
+
+#: mixer_strip.cc:2028
+msgid "Meter|Pr"
+msgstr ""
+
+#: mixer_strip.cc:2032
+msgid "Meter|Po"
+msgstr ""
+
+#: mixer_strip.cc:2036
+msgid "Meter|O"
+msgstr ""
+
+#: mixer_strip.cc:2041
+msgid "Meter|C"
+msgstr ""
+
+#: mixer_strip.cc:2202 route_ui.cc:197
+msgid "Disk"
+msgstr ""
+
+#: mixer_strip.cc:2204
+msgid "Mon"
+msgstr ""
+
+#: mixer_strip.cc:2217 monitor_section.cc:81
+msgid "AFL"
+msgstr ""
+
+#: mixer_strip.cc:2220 monitor_section.cc:82
+msgid "PFL"
+msgstr ""
+
+#: mixer_strip.cc:2230 meter_strip.cc:385
+msgid "MonitorInput|I"
+msgstr ""
+
+#: mixer_strip.cc:2231 meter_strip.cc:386
+msgid "MonitorDisk|D"
+msgstr ""
+
+#: mixer_strip.cc:2233
+msgid "Mon|O"
+msgstr ""
+
+#: mixer_strip.cc:2246 meter_strip.cc:377 route_time_axis.cc:2730
+#: vca_master_strip.cc:202 vca_time_axis.cc:227
+msgid "AfterFader|A"
+msgstr ""
+
+#: mixer_strip.cc:2249
+msgid "Prefader|P"
+msgstr ""
+
+#: mixer_strip.cc:2254
+msgid "SoloIso|I"
+msgstr ""
+
+#: mixer_strip.cc:2255
+msgid "SoloLock|L"
+msgstr ""
+
+#: mixer_strip.cc:2460
+msgid "Pre Fader"
+msgstr ""
+
+#: mixer_strip.cc:2461
+msgid "Post Fader"
+msgstr ""
+
+#: mixer_strip.cc:2506 meter_strip.cc:858
+msgid "Change all in Group to %1"
+msgstr ""
+
+#: mixer_strip.cc:2508 meter_strip.cc:860
+msgid "Change all to %1"
+msgstr ""
+
+#: mixer_strip.cc:2510 meter_strip.cc:862
+msgid "Change same track-type to %1"
+msgstr ""
+
+#: mixer_ui.cc:152 route_time_axis.cc:828
+msgid "Group"
+msgstr ""
+
+#: mixer_ui.cc:221
+msgid "Favorite Plugins"
+msgstr ""
+
+#: mixer_ui.cc:627
+msgid "Error adding GUI elements for new tracks/busses %1"
+msgstr ""
+
+#: mixer_ui.cc:1542
+msgid "track display list item for renamed strip not found!"
+msgstr ""
+
+#: mixer_ui.cc:1636
+msgid "-all-"
+msgstr ""
+
+#: mixer_ui.cc:2135
+msgid "Strips"
+msgstr ""
+
+#: mixer_ui.cc:2479
+msgid "No Track/Bus is selected."
+msgstr ""
+
+#: mixer_ui.cc:2481
+msgid "Add at the top"
+msgstr ""
+
+#: mixer_ui.cc:2483
+msgid "Add Pre-Fader"
+msgstr ""
+
+#: mixer_ui.cc:2485
+msgid "Add Post-Fader"
+msgstr ""
+
+#: mixer_ui.cc:2487
+msgid "Add at the end"
+msgstr ""
+
+#: mixer_ui.cc:2493
+msgid "Remove from favorites"
+msgstr ""
+
+#: mixer_ui.cc:2499
+msgid "Delete Preset"
+msgstr ""
+
+#: mixer_ui.cc:2739
+msgid "Toggle Solo on Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: mixer_ui.cc:2740
+msgid "Toggle Mute on Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: mixer_ui.cc:2741
+msgid "Toggle Rec-enable on Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: mixer_ui.cc:2742
+msgid "Decrease Gain on Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: mixer_ui.cc:2743
+msgid "Increase Gain on Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: mixer_ui.cc:2744
+msgid "Set Gain to 0dB on Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: mixer_ui.cc:2747
+msgid "Copy Selected Processors"
+msgstr ""
+
+#: mixer_ui.cc:2748
+msgid "Cut Selected Processors"
+msgstr ""
+
+#: mixer_ui.cc:2749
+msgid "Paste Selected Processors"
+msgstr ""
+
+#: mixer_ui.cc:2750
+msgid "Delete Selected Processors"
+msgstr ""
+
+#: mixer_ui.cc:2751
+msgid "Select All (visible) Processors"
+msgstr ""
+
+#: mixer_ui.cc:2752
+msgid "Toggle Selected Processors"
+msgstr ""
+
+#: mixer_ui.cc:2753
+msgid "Toggle Selected Plugins"
+msgstr ""
+
+#: mixer_ui.cc:2754
+msgid "Deselect all strips and processors"
+msgstr ""
+
+#: mixer_ui.cc:2756 mixer_ui.cc:2757
+msgid "Scroll Mixer Window to the left"
+msgstr ""
+
+#: mixer_ui.cc:2759
+msgid "Toggle MIDI Input Active for Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: meter_strip.cc:160
+msgid "Reset Peak"
+msgstr ""
+
+#: meter_strip.cc:380 route_time_axis.cc:2734 vca_master_strip.cc:206
+#: vca_time_axis.cc:231
+msgid "PreFader|P"
+msgstr ""
+
+#: meter_strip.cc:894
+msgid "Variable height"
+msgstr ""
+
+#: meter_strip.cc:895
+msgid "Short"
+msgstr ""
+
+#: meter_strip.cc:896
+msgid "Tall"
+msgstr ""
+
+#: meter_strip.cc:897
+msgid "Grande"
+msgstr ""
+
+#: meter_strip.cc:898
+msgid "Venti"
+msgstr ""
+
+#: meter_patterns.cc:84
+msgid "Peak (+6dBFS)"
+msgstr ""
+
+#: meter_patterns.cc:87
+msgid "Peak (0dBFS)"
+msgstr ""
+
+#: meter_patterns.cc:90
+msgid "RMS + Peak"
+msgstr ""
+
+#: meter_patterns.cc:93
+msgid "IEC1/DIN"
+msgstr ""
+
+#: meter_patterns.cc:96
+msgid "IEC1/Nordic"
+msgstr ""
+
+#: meter_patterns.cc:99
+msgid "IEC2/BBC"
+msgstr ""
+
+#: meter_patterns.cc:102
+msgid "IEC2/EBU"
+msgstr ""
+
+#: meter_patterns.cc:105
+msgid "K20/RMS"
+msgstr ""
+
+#: meter_patterns.cc:108
+msgid "K14/RMS"
+msgstr ""
+
+#: meter_patterns.cc:111
+msgid "K12/RMS"
+msgstr ""
+
+#: meter_patterns.cc:114
+msgid "VU"
+msgstr ""
+
+#: monitor_section.cc:80
+msgid "SiP"
+msgstr ""
+
+#: monitor_section.cc:113 route_group_dialog.cc:49
+msgid "Soloing"
+msgstr ""
+
+#: monitor_section.cc:117
+msgid "Isolated"
+msgstr ""
+
+#: monitor_section.cc:121
+msgid "Auditioning"
+msgstr ""
+
+#: monitor_section.cc:132
+msgid ""
+"When active, something is solo-isolated.\n"
+"Click to de-isolate everything"
+msgstr ""
+
+#: monitor_section.cc:135
+msgid ""
+"When active, auditioning is active.\n"
+"Click to stop the audition"
+msgstr ""
+
+#: monitor_section.cc:152
+msgid "Solo controls affect solo-in-place"
+msgstr ""
+
+#: monitor_section.cc:158
+msgid "Solo controls toggle after-fader-listen"
+msgstr ""
+
+#: monitor_section.cc:164
+msgid "Solo controls toggle pre-fader-listen"
+msgstr ""
+
+#: monitor_section.cc:170
+msgid "Excl. Solo"
+msgstr ""
+
+#: monitor_section.cc:172
+msgid "Exclusive solo means that only 1 solo is active at a time"
+msgstr ""
+
+#: monitor_section.cc:179
+msgid "Solo » Mute"
+msgstr ""
+
+#: monitor_section.cc:181
+msgid ""
+"If enabled, solo will override mute\n"
+"(a soloed & muted track or bus will be audible)"
+msgstr ""
+
+#: monitor_section.cc:189
+msgid "Processors"
+msgstr ""
+
+#: monitor_section.cc:191
+msgid "Allow one to add monitor effect processors"
+msgstr ""
+
+#: monitor_section.cc:206
+msgid "Gain increase for soloed signals (0dB is normal)"
+msgstr ""
+
+#: monitor_section.cc:210 monitor_section.cc:227 monitor_section.cc:244
+#: monitor_section.cc:289
+msgid "0 dB"
+msgstr ""
+
+#: monitor_section.cc:211
+msgid "3 dB"
+msgstr ""
+
+#: monitor_section.cc:212
+msgid "6 dB"
+msgstr ""
+
+#: monitor_section.cc:213
+msgid "10 dB"
+msgstr ""
+
+#: monitor_section.cc:215
+msgid "Solo Boost"
+msgstr ""
+
+#: monitor_section.cc:222
+msgid ""
+"Gain reduction non-soloed signals\n"
+"A value above -inf dB causes \"solo-in-front\""
+msgstr ""
+
+#: monitor_section.cc:228 monitor_section.cc:246 monitor_section.cc:291
+msgid "-6 dB"
+msgstr ""
+
+#: monitor_section.cc:229 monitor_section.cc:247 monitor_section.cc:292
+msgid "-12 dB"
+msgstr ""
+
+#: monitor_section.cc:230 monitor_section.cc:248 monitor_section.cc:293
+msgid "-20 dB"
+msgstr ""
+
+#: monitor_section.cc:231
+msgid "OFF"
+msgstr ""
+
+#: monitor_section.cc:233
+msgid "SiP Cut"
+msgstr ""
+
+#: monitor_section.cc:240
+msgid "Gain reduction to use when dimming monitor outputs"
+msgstr ""
+
+#: monitor_section.cc:245 monitor_section.cc:290
+msgid "-3 dB"
+msgstr ""
+
+#: monitor_section.cc:250 monitor_section.cc:264 monitor_section.cc:325
+msgid "Dim"
+msgstr ""
+
+#: monitor_section.cc:294
+msgid "-30 dB"
+msgstr ""
+
+#: monitor_section.cc:333
+msgid "Inv"
+msgstr ""
+
+#: monitor_section.cc:399 port_group.cc:552
+msgid "Monitor"
+msgstr ""
+
+#: monitor_section.cc:897
+msgid "Switch monitor to mono"
+msgstr ""
+
+#: monitor_section.cc:900
+msgid "Cut monitor"
+msgstr ""
+
+#: monitor_section.cc:903
+msgid "Dim monitor"
+msgstr ""
+
+#: monitor_section.cc:906
+msgid "Toggle exclusive solo mode"
+msgstr ""
+
+#: monitor_section.cc:912
+msgid "Toggle mute overrides solo mode"
+msgstr ""
+
+#: monitor_section.cc:921
+msgid "Cut monitor channel %1"
+msgstr ""
+
+#: monitor_section.cc:926
+msgid "Dim monitor channel %1"
+msgstr ""
+
+#: monitor_section.cc:931
+msgid "Solo monitor channel %1"
+msgstr ""
+
+#: monitor_section.cc:936
+msgid "Invert monitor channel %1"
+msgstr ""
+
+#: monitor_section.cc:946
+msgid "In-place solo"
+msgstr ""
+
+#: monitor_section.cc:948
+msgid "After Fade Listen (AFL) solo"
+msgstr ""
+
+#: monitor_section.cc:950
+msgid "Pre Fade Listen (PFL) solo"
+msgstr ""
+
+#: monitor_section.cc:953
+msgid "Toggle Monitor Section Processor Box"
+msgstr ""
+
+#: monitor_section.cc:1413
+msgid "No session - no I/O changes are possible"
+msgstr ""
+
+#: monitor_selector.cc:199
+msgid "Monitor output selector"
+msgstr ""
+
+#: mono_panner.cc:105 stereo_panner.cc:115
+msgid "bypassed"
+msgstr ""
+
+#: mono_panner.cc:119
+#, c-format
+msgid "L:%3d R:%3d"
+msgstr ""
+
+#: mono_panner.cc:203 panner2d.cc:276 stereo_panner.cc:252
+#: stereo_panner.cc:275
+msgid "Panner|L"
+msgstr ""
+
+#: mono_panner.cc:220 panner2d.cc:277 stereo_panner.cc:250
+#: stereo_panner.cc:277
+msgid "Panner|R"
+msgstr ""
+
+#: mono_panner_editor.cc:35
+msgid "Mono Panner"
+msgstr ""
+
+#: mono_panner_editor.cc:46 mono_panner_editor.cc:51
+#: stereo_panner_editor.cc:48 stereo_panner_editor.cc:53
+msgid "%"
+msgstr ""
+
+#: nag.cc:41
+msgid "Support %1 Development"
+msgstr ""
+
+#: nag.cc:42
+msgid "I'd like to make a one-time donation"
+msgstr ""
+
+#: nag.cc:43
+msgid "Tell me more about becoming a subscriber"
+msgstr ""
+
+#: nag.cc:44
+msgid "I'm already a subscriber!"
+msgstr ""
+
+#: nag.cc:45
+msgid "Ask about this the next time I export"
+msgstr ""
+
+#: nag.cc:46
+msgid "Never ever ask me about this again"
+msgstr ""
+
+#: nag.cc:49
+msgid ""
+"Congratulations on your session export.\n"
+"\n"
+"It looks as if you may already be a subscriber. If so, thanks, and sorry\n"
+"to bother you again about this - I'm working on improving our subscriber "
+"system\n"
+"so that I don't have to keep annoying you with this message.\n"
+"\n"
+"If you're not a subscriber, perhaps you might consider supporting my work\n"
+"on Ardour with either a one-time donation or subscription. Nothing will \n"
+"happen if you choose not to do so. However Ardour's continuing development\n"
+"relies on a stable, sustainable income stream. Thanks for using Ardour!"
+msgstr ""
+
+#: nag.cc:58
+msgid ""
+"Congratulations on your session export.\n"
+"\n"
+"I hope you find Ardour a useful tool. I'd like to ask you to consider "
+"supporting\n"
+"its development with either a one-time donation or subscription. Nothing\n"
+"will happen if you choose not to do so. However Ardour's continuing "
+"development\n"
+"relies on a stable, sustainable income stream. Thanks for using Ardour!"
+msgstr ""
+
+#: new_plugin_preset_dialog.cc:30
+msgid "Replace existing preset with this name"
+msgstr ""
+
+#: new_plugin_preset_dialog.cc:34
+msgid "Name of new preset"
+msgstr ""
+
+#: new_plugin_preset_dialog.cc:44
+msgid "New Favorite Only"
+msgstr ""
+
+#: normalize_dialog.cc:34
+msgid "Normalize regions"
+msgstr ""
+
+#: normalize_dialog.cc:34
+msgid "Normalize region"
+msgstr ""
+
+#: normalize_dialog.cc:42
+msgid "Normalize to:"
+msgstr ""
+
+#: normalize_dialog.cc:56
+msgid "Normalize each region using its own peak value"
+msgstr ""
+
+#: normalize_dialog.cc:58
+msgid "Normalize each region using the peak value of all regions"
+msgstr ""
+
+#: normalize_dialog.cc:73
+msgid "Normalize"
+msgstr ""
+
+#: note_select_dialog.cc:33
+msgid "Select Note"
+msgstr ""
+
+#: opts.cc:61
+msgid "Usage: "
+msgstr ""
+
+#: opts.cc:62
+msgid "  [SESSION_NAME]              Name of session to load\n"
+msgstr ""
+
+#: opts.cc:63
+msgid "  -v, --version               Show version information\n"
+msgstr ""
+
+#: opts.cc:64
+msgid "  -h, --help                  Print this message\n"
+msgstr ""
+
+#: opts.cc:65
+msgid ""
+"  -a, --no-announcements      Do not contact website for announcements\n"
+msgstr ""
+
+#: opts.cc:66
+msgid ""
+"  -b, --bindings              Print all possible keyboard binding names\n"
+msgstr ""
+
+#: opts.cc:67
+msgid ""
+"  -B, --bypass-plugins        Bypass all plugins in an existing session\n"
+msgstr ""
+
+#: opts.cc:68
+msgid ""
+"  -c, --name <name>           Use a specific backend client name, default is "
+"ardour\n"
+msgstr ""
+
+#: opts.cc:69
+msgid ""
+"  -d, --disable-plugins       Disable all plugins in an existing session\n"
+msgstr ""
+
+#: opts.cc:70
+msgid ""
+"  -D, --debug <options>       Set debug flags. Use \"-D list\" to see "
+"available options\n"
+msgstr ""
+
+#: opts.cc:71
+msgid "  -n, --no-splash             Do not show splash screen\n"
+msgstr ""
+
+#: opts.cc:72
+msgid "  -m, --menus file            Use \"file\" to define menus\n"
+msgstr ""
+
+#: opts.cc:73
+msgid ""
+"  -N, --new session-name      Create a new session from the command line\n"
+msgstr ""
+
+#: opts.cc:74
+msgid "  -O, --no-hw-optimizations   Disable h/w specific optimizations\n"
+msgstr ""
+
+#: opts.cc:75
+msgid "  -P, --no-connect-ports      Do not connect any ports at startup\n"
+msgstr ""
+
+#: opts.cc:76
+msgid "  -S, --sync                  Draw the gui synchronously \n"
+msgstr ""
+
+#: opts.cc:78
+msgid "  -V, --novst                 Do not use VST support\n"
+msgstr ""
+
+#: opts.cc:80
+msgid ""
+"  -E, --save <file>           Load the specified session, save it to <file> "
+"and then quit\n"
+msgstr ""
+
+#: opts.cc:81
+msgid "  -C, --curvetest filename    Curve algorithm debugger\n"
+msgstr ""
+
+#: opts.cc:82
+msgid "  -k, --keybindings filename  Name of key bindings to load\n"
+msgstr ""
+
+#: panner2d.cc:896
+msgid "Panner (2D)"
+msgstr ""
+
+#: panner2d.cc:898 panner_ui.cc:402 plugin_ui.cc:465
+msgid "Bypass"
+msgstr ""
+
+#: panner2d.cc:904
+msgid "Panner"
+msgstr ""
+
+#: panner_ui.cc:72
+msgid "Pan automation mode"
+msgstr ""
+
+#: panner_ui.cc:73
+msgid "Pan automation type"
+msgstr ""
+
+#: panner_ui.cc:605
+msgid "Manual|M"
+msgstr ""
+
+#: panner_ui.cc:608
+msgid "Play|P"
+msgstr ""
+
+#: panner_ui.cc:611
+msgid "Touch|T"
+msgstr ""
+
+#: panner_ui.cc:614
+msgid "Write|W"
+msgstr ""
+
+#: playlist_selector.cc:43
+msgid "Playlists"
+msgstr ""
+
+#: playlist_selector.cc:54
+msgid "Playlists grouped by track"
+msgstr ""
+
+#: playlist_selector.cc:101
+msgid "Playlist for %1"
+msgstr ""
+
+#: playlist_selector.cc:114
+msgid "Other tracks"
+msgstr ""
+
+#: playlist_selector.cc:139
+msgid "unassigned"
+msgstr ""
+
+#: playlist_selector.cc:194
+msgid "Imported"
+msgstr ""
+
+#: plugin_eq_gui.cc:93 plugin_eq_gui.cc:117
+msgid "dB scale"
+msgstr ""
+
+#: plugin_eq_gui.cc:124
+msgid "Show phase"
+msgstr ""
+
+#: plugin_pin_dialog.cc:55
+msgid "Manual Config"
+msgstr ""
+
+#: plugin_pin_dialog.cc:56
+msgid "Sidechain"
+msgstr ""
+
+#: plugin_pin_dialog.cc:57 plugin_pin_dialog.cc:59 plugin_pin_dialog.cc:61
+#: plugin_pin_dialog.cc:63 plugin_pin_dialog.cc:65 step_entry.cc:81
+#: step_entry.cc:84
+msgid "+"
+msgstr ""
+
+#: plugin_pin_dialog.cc:58 plugin_pin_dialog.cc:60 plugin_pin_dialog.cc:62
+#: plugin_pin_dialog.cc:64 plugin_pin_dialog.cc:66
+msgid "-"
+msgstr ""
+
+#: plugin_pin_dialog.cc:148
+msgid "Audio Input Pins"
+msgstr ""
+
+#: plugin_pin_dialog.cc:157
+msgid "MIDI Input Pins"
+msgstr ""
+
+#: plugin_pin_dialog.cc:166
+msgid "Instances"
+msgstr ""
+
+#: plugin_pin_dialog.cc:176
+msgid "Audio Out"
+msgstr ""
+
+#: plugin_pin_dialog.cc:185
+msgid "MIDI Out"
+msgstr ""
+
+#: plugin_pin_dialog.cc:192
+msgid "Output Presets"
+msgstr ""
+
+#: plugin_pin_dialog.cc:208
+msgid "Add Sidechain Input"
+msgstr ""
+
+#: plugin_pin_dialog.cc:478 plugin_pin_dialog.cc:482 plugin_pin_dialog.cc:486
+#: plugin_setup_dialog.cc:115 plugin_setup_dialog.cc:199
+msgid "Automatic"
+msgstr ""
+
+#: plugin_pin_dialog.cc:515 plugin_setup_dialog.cc:208
+msgid "%1 Channel"
+msgid_plural "%1 Channels"
+msgstr[0] ""
+msgstr[1] ""
+
+#: plugin_pin_dialog.cc:641 processor_box.cc:224
+msgid "Send"
+msgstr ""
+
+#: plugin_pin_dialog.cc:997
+msgid "Latency %1 spl%2 %3"
+msgstr ""
+
+#: plugin_pin_dialog.cc:997 plugin_pin_dialog.cc:1001
+msgid "no-inplace"
+msgstr ""
+
+#: plugin_pin_dialog.cc:999
+msgid "Latency %1 spl"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1055
+msgid "Instance #%1"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1700 processor_box.cc:2520
+msgid "Cannot set up new send: %1"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1707
+msgid "SC %1 (%2)"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1963 plugin_pin_dialog.cc:1971
+msgid "Pin Configuration: %1"
+msgstr ""
+
+#: plugin_setup_dialog.cc:30
+msgid "Plugin Setup"
+msgstr ""
+
+#: plugin_setup_dialog.cc:33
+msgid "Copy I/O Map"
+msgstr ""
+
+#: plugin_setup_dialog.cc:50
+msgid "An Instrument plugin is already present."
+msgstr ""
+
+#: plugin_setup_dialog.cc:54
+msgid "Replace"
+msgstr ""
+
+#: plugin_setup_dialog.cc:60
+msgid "with"
+msgstr ""
+
+#: plugin_setup_dialog.cc:70
+msgid "I/O Pin Mapping"
+msgstr ""
+
+#: plugin_setup_dialog.cc:79
+msgid "Configure Plugin '%1'"
+msgstr ""
+
+#: plugin_setup_dialog.cc:90
+msgid "Output Configuration"
+msgstr ""
+
+#: plugin_selector.cc:54 plugin_selector.cc:322
+msgid "Name contains"
+msgstr ""
+
+#: plugin_selector.cc:55 plugin_selector.cc:326
+msgid "Type contains"
+msgstr ""
+
+#: plugin_selector.cc:56 plugin_selector.cc:324
+msgid "Category contains"
+msgstr ""
+
+#: plugin_selector.cc:57 plugin_selector.cc:349
+msgid "Author contains"
+msgstr ""
+
+#: plugin_selector.cc:58 plugin_selector.cc:351
+msgid "Library contains"
+msgstr ""
+
+#: plugin_selector.cc:59 plugin_selector.cc:278 plugin_selector.cc:639
+msgid "Favorites only"
+msgstr ""
+
+#: plugin_selector.cc:60 plugin_selector.cc:282 plugin_selector.cc:639
+msgid "Hidden only"
+msgstr ""
+
+#: plugin_selector.cc:65
+msgid "Plugin Manager"
+msgstr ""
+
+#: plugin_selector.cc:96
+msgid "Fav"
+msgstr ""
+
+#: plugin_selector.cc:98
+msgid "Available Plugins"
+msgstr ""
+
+#: plugin_selector.cc:99
+msgid "Type"
+msgstr ""
+
+#: plugin_selector.cc:100
+msgid "Category"
+msgstr ""
+
+#: plugin_selector.cc:101
+msgid "Creator"
+msgstr ""
+
+#: plugin_selector.cc:102
+msgid "# Audio In"
+msgstr ""
+
+#: plugin_selector.cc:103
+msgid "# Audio Out"
+msgstr ""
+
+#: plugin_selector.cc:104
+msgid "# MIDI In"
+msgstr ""
+
+#: plugin_selector.cc:105
+msgid "# MIDI Out"
+msgstr ""
+
+#: plugin_selector.cc:132
+msgid "Plugins to be connected"
+msgstr ""
+
+#: plugin_selector.cc:145
+msgid "Add a plugin to the effect list"
+msgstr ""
+
+#: plugin_selector.cc:149
+msgid "Remove a plugin from the effect list"
+msgstr ""
+
+#: plugin_selector.cc:161
+msgid "Show Hidden"
+msgstr ""
+
+#: plugin_selector.cc:163
+msgid "Include hidden plugins in list."
+msgstr ""
+
+#: plugin_selector.cc:166
+msgid "Instruments"
+msgstr ""
+
+#: plugin_selector.cc:168
+msgid "Cycle display of instrument plugins (if any)."
+msgstr ""
+
+#: plugin_selector.cc:171
+msgid "Analyzers"
+msgstr ""
+
+#: plugin_selector.cc:173
+msgid "Cycle display of analysis plugins (if any)."
+msgstr ""
+
+#: plugin_selector.cc:176
+msgid "Utils"
+msgstr ""
+
+#: plugin_selector.cc:178
+msgid "Cycle display of utility plugins (if any)."
+msgstr ""
+
+#: plugin_selector.cc:208
+msgid "Filter"
+msgstr ""
+
+#: plugin_selector.cc:232
+msgid "Insert Plugin(s)"
+msgstr ""
+
+#: plugin_selector.cc:439 plugin_selector.cc:440 plugin_selector.cc:441
+#: plugin_selector.cc:442
+msgid "variable"
+msgstr ""
+
+#: plugin_selector.cc:598
+msgid ""
+"The plugin \"%1\" could not be loaded\n"
+"\n"
+"See the Log window for more details (maybe)"
+msgstr ""
+
+#: plugin_selector.cc:757
+msgid "Favorites"
+msgstr ""
+
+#: plugin_selector.cc:759
+msgid "Plugin Manager..."
+msgstr ""
+
+#: plugin_selector.cc:763
+msgid "By Creator"
+msgstr ""
+
+#: plugin_selector.cc:766
+msgid "By Category"
+msgstr ""
+
+#: plugin_ui.cc:115
+msgid "Eh? LADSPA plugins don't have editors!"
+msgstr ""
+
+#: plugin_ui.cc:124 plugin_ui.cc:229
+msgid ""
+"unknown type of editor-supplying plugin (note: no VST support in this "
+"version of %1)"
+msgstr ""
+
+#: plugin_ui.cc:127
+msgid "unknown type of editor-supplying plugin"
+msgstr ""
+
+#: plugin_ui.cc:259
+msgid ""
+"unknown type of editor-supplying plugin (note: no linuxVST support in this "
+"version of %1)"
+msgstr ""
+
+#: plugin_ui.cc:331
+msgid "create_lv2_editor called on non-LV2 plugin"
+msgstr ""
+
+#: plugin_ui.cc:419
+msgid "Add"
+msgstr ""
+
+#: plugin_ui.cc:425
+msgid "Description"
+msgstr ""
+
+#: plugin_ui.cc:426
+msgid "Plugin analysis"
+msgstr ""
+
+#: plugin_ui.cc:433
+msgid ""
+"Presets (if any) for this plugin\n"
+"(Both factory and user-created)"
+msgstr ""
+
+#: plugin_ui.cc:434
+msgid "Save a new preset"
+msgstr ""
+
+#: plugin_ui.cc:435
+msgid "Save the current preset"
+msgstr ""
+
+#: plugin_ui.cc:436
+msgid "Delete the current preset"
+msgstr ""
+
+#: plugin_ui.cc:437
+msgid ""
+"Reset parameters to default (if no parameters are in automation play mode)"
+msgstr ""
+
+#: plugin_ui.cc:439
+msgid "Show Plugin Pin Management Dialog"
+msgstr ""
+
+#: plugin_ui.cc:441
+msgid "Disable signal processing by the plugin"
+msgstr ""
+
+#: plugin_ui.cc:480 plugin_ui.cc:699
+msgid ""
+"Click to allow the plugin to receive keyboard events that %1 would normally "
+"use as a shortcut"
+msgstr ""
+
+#: plugin_ui.cc:481
+msgid "Click to enable/disable this plugin"
+msgstr ""
+
+#: plugin_ui.cc:524
+msgid "latency (%1 sample)"
+msgid_plural "latency (%1 samples)"
+msgstr[0] ""
+msgstr[1] ""
+
+#: plugin_ui.cc:526
+msgid "latency (%1 ms)"
+msgstr ""
+
+#: plugin_ui.cc:537
+msgid "Edit Latency"
+msgstr ""
+
+#: plugin_ui.cc:583
+msgid ""
+"Plugin presets are not supported in this build of %1. Consider paying for a "
+"full version"
+msgstr ""
+
+#: plugin_ui.cc:591
+msgid ""
+"Plugin presets are not supported in this build, see the Log window for more "
+"information."
+msgstr ""
+
+#: plugin_ui.cc:599
+msgid "New Preset"
+msgstr ""
+
+#: plugin_ui.cc:706
+msgid "Click to allow normal use of %1 keyboard shortcuts"
+msgstr ""
+
+#: plugin_ui.cc:813
+msgid "(none)"
+msgstr ""
+
+#: port_group.cc:338
+msgid "%1 Busses"
+msgstr ""
+
+#: port_group.cc:339
+msgid "%1 Tracks"
+msgstr ""
+
+#: port_group.cc:340
+msgid "Hardware"
+msgstr ""
+
+#: port_group.cc:341
+msgid "%1 Misc"
+msgstr ""
+
+#: port_group.cc:342
+msgid "Other"
+msgstr ""
+
+#: port_group.cc:435 port_group.cc:436
+msgid "LTC Out"
+msgstr ""
+
+#: port_group.cc:439 port_group.cc:440
+msgid "LTC In"
+msgstr ""
+
+#: port_group.cc:474
+msgid "MTC in"
+msgstr ""
+
+#: port_group.cc:477
+msgid "MIDI control in"
+msgstr ""
+
+#: port_group.cc:480
+msgid "MIDI clock in"
+msgstr ""
+
+#: port_group.cc:483
+msgid "MMC in"
+msgstr ""
+
+#: port_group.cc:487
+msgid "MTC out"
+msgstr ""
+
+#: port_group.cc:490
+msgid "MIDI control out"
+msgstr ""
+
+#: port_group.cc:493
+msgid "MIDI clock out"
+msgstr ""
+
+#: port_group.cc:496
+msgid "MMC out"
+msgstr ""
+
+#: port_group.cc:579
+msgid "Scene "
+msgstr ""
+
+#: port_insert_ui.cc:39
+msgid "Measure Latency"
+msgstr ""
+
+#: port_insert_ui.cc:50
+msgid "Send/Output"
+msgstr ""
+
+#: port_insert_ui.cc:51
+msgid "Return/Input"
+msgstr ""
+
+#: port_insert_ui.cc:85
+msgid "No signal detected"
+msgstr ""
+
+#: port_insert_ui.cc:165
+msgid "Port Insert "
+msgstr ""
+
+#: port_matrix.cc:341 port_matrix.cc:367
+msgid "<b>Sources</b>"
+msgstr ""
+
+#: port_matrix.cc:342 port_matrix.cc:368
+msgid "<b>Destinations</b>"
+msgstr ""
+
+#: port_matrix.cc:450 port_matrix.cc:458
+#, c-format
+msgid "Add %s %s"
+msgstr ""
+
+#: port_matrix.cc:466
+#, c-format
+msgid "Rename '%s'..."
+msgstr ""
+
+#: port_matrix.cc:482
+msgid "Remove all"
+msgstr ""
+
+#: port_matrix.cc:502 port_matrix.cc:514
+#, c-format
+msgid "%s all"
+msgstr ""
+
+#: port_matrix.cc:537
+msgid "Rescan"
+msgstr ""
+
+#: port_matrix.cc:539
+msgid "Show individual ports"
+msgstr ""
+
+#: port_matrix.cc:545
+msgid "Flip"
+msgstr ""
+
+#: port_matrix.cc:732
+msgid "It is not possible to add a port here."
+msgstr ""
+
+#: port_matrix.cc:733
+msgid "Cannot add port"
+msgstr ""
+
+#: port_matrix.cc:757
+msgid "The last port cannot be removed"
+msgstr ""
+
+#: port_matrix.cc:760
+msgid "This port cannot be removed."
+msgstr ""
+
+#: port_matrix.cc:765
+msgid "Port removal not allowed"
+msgstr ""
+
+#: port_matrix.cc:981
+#, c-format
+msgid "Remove '%s'"
+msgstr ""
+
+#: port_matrix.cc:996
+#, c-format
+msgid "%s all from '%s'"
+msgstr ""
+
+#: port_matrix.cc:1062 transform_dialog.cc:62
+msgid "channel"
+msgstr ""
+
+#: port_matrix_body.cc:82
+msgid "There are no ports to connect."
+msgstr ""
+
+#: port_matrix_body.cc:84
+msgid "There are no %1 ports to connect."
+msgstr ""
+
+#: processor_box.cc:226
+msgid "Return"
+msgstr ""
+
+#: processor_box.cc:323
+msgid "New Favorite Preset for \"%1\""
+msgstr ""
+
+#: processor_box.cc:501
+msgid ""
+"\n"
+"This mono plugin has been replicated %1 times."
+msgstr ""
+
+#: processor_box.cc:505 processor_box.cc:1528
+msgid ""
+"<b>%1</b>\n"
+"Double-click to show GUI.\n"
+"%2+double-click to show generic GUI.%3"
+msgstr ""
+
+#: processor_box.cc:508 processor_box.cc:1531
+msgid ""
+"<b>%1</b>\n"
+"Double-click to show generic GUI.%2"
+msgstr ""
+
+#: processor_box.cc:514
+msgid ""
+"<b>%1</b>\n"
+"The Plugin is not available on this system\n"
+"and has been replaced by a stub."
+msgstr ""
+
+#: processor_box.cc:600
+#, c-format
+msgid "(%1x1) "
+msgstr ""
+
+#: processor_box.cc:695
+msgid "Inline Display"
+msgstr ""
+
+#: processor_box.cc:703
+msgid "Show All Controls"
+msgstr ""
+
+#: processor_box.cc:707
+msgid "Hide All Controls"
+msgstr ""
+
+#: processor_box.cc:752
+msgid "Link panner controls"
+msgstr ""
+
+#: processor_box.cc:859
+msgid "on"
+msgstr ""
+
+#: processor_box.cc:859 rc_option_editor.cc:3185 rc_option_editor.cc:3199
+msgid "off"
+msgstr ""
+
+#: processor_box.cc:1819
+msgid ""
+"Right-click to add/remove/edit\n"
+"plugins,inserts,sends and more"
+msgstr ""
+
+#: processor_box.cc:1968
+msgid ""
+"Processor Drag/Drop failed. Probably because\n"
+"the I/O configuration of the plugins could\n"
+"not match the configuration of this track."
+msgstr ""
+
+#: processor_box.cc:2455 processor_box.cc:2998
+msgid "Plugin Incompatibility"
+msgstr ""
+
+#: processor_box.cc:2458
+msgid "You attempted to add the plugin \"%1\" in slot %2.\n"
+msgstr ""
+
+#: processor_box.cc:2464
+msgid ""
+"\n"
+"This plugin has:\n"
+msgstr ""
+
+#: processor_box.cc:2467
+msgid "\t%1 MIDI input\n"
+msgid_plural "\t%1 MIDI inputs\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: processor_box.cc:2471
+msgid "\t%1 audio input\n"
+msgid_plural "\t%1 audio inputs\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: processor_box.cc:2474
+msgid ""
+"\n"
+"but at the insertion point, there are:\n"
+msgstr ""
+
+#: processor_box.cc:2477
+msgid "\t%1 MIDI channel\n"
+msgid_plural "\t%1 MIDI channels\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: processor_box.cc:2481
+msgid "\t%1 audio channel\n"
+msgid_plural "\t%1 audio channels\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: processor_box.cc:2484
+msgid ""
+"\n"
+"%1 is unable to insert this plugin here.\n"
+msgstr ""
+
+#: processor_box.cc:3001
+msgid ""
+"You cannot reorder these plugins/sends/inserts\n"
+"in that way because the inputs and\n"
+"outputs will not work correctly."
+msgstr ""
+
+#: processor_box.cc:3201
+msgid "Rename Processor"
+msgstr ""
+
+#: processor_box.cc:3232
+msgid "At least 100 IO objects exist with a name like %1 - name not changed"
+msgstr ""
+
+#: processor_box.cc:3383
+msgid "plugin insert constructor failed"
+msgstr ""
+
+#: processor_box.cc:3394
+msgid ""
+"Copying the set of processors on the clipboard failed,\n"
+"probably because the I/O configuration of the plugins\n"
+"could not match the configuration of this track."
+msgstr ""
+
+#: processor_box.cc:3440
+msgid ""
+"Do you really want to remove all processors from %1?\n"
+"(this cannot be undone)"
+msgstr ""
+
+#: processor_box.cc:3444 processor_box.cc:3469
+msgid "Yes, remove them all"
+msgstr ""
+
+#: processor_box.cc:3446 processor_box.cc:3471
+msgid "Remove processors"
+msgstr ""
+
+#: processor_box.cc:3461
+msgid ""
+"Do you really want to remove all pre-fader processors from %1?\n"
+"(this cannot be undone)"
+msgstr ""
+
+#: processor_box.cc:3464
+msgid ""
+"Do you really want to remove all post-fader processors from %1?\n"
+"(this cannot be undone)"
+msgstr ""
+
+#: processor_box.cc:3653
+msgid "New Plugin"
+msgstr ""
+
+#: processor_box.cc:3656
+msgid "New Insert"
+msgstr ""
+
+#: processor_box.cc:3659
+msgid "New External Send ..."
+msgstr ""
+
+#: processor_box.cc:3663
+msgid "New Aux Send ..."
+msgstr ""
+
+#: processor_box.cc:3666
+msgid "Send Options"
+msgstr ""
+
+#: processor_box.cc:3668
+msgid "Clear (all)"
+msgstr ""
+
+#: processor_box.cc:3670
+msgid "Clear (pre-fader)"
+msgstr ""
+
+#: processor_box.cc:3672
+msgid "Clear (post-fader)"
+msgstr ""
+
+#: processor_box.cc:3702
+msgid "Activate All"
+msgstr ""
+
+#: processor_box.cc:3704
+msgid "Deactivate All"
+msgstr ""
+
+#: processor_box.cc:3706
+msgid "A/B Plugins"
+msgstr ""
+
+#: processor_box.cc:3719
+msgid "Edit with generic controls..."
+msgstr ""
+
+#: processor_box.cc:4051
+msgid "%1: %2 (by %3)"
+msgstr ""
+
+#: processor_box.cc:4053
+msgid "%1 (by %2)"
+msgstr ""
+
+#: patch_change_dialog.cc:50
+msgid "Patch Change"
+msgstr ""
+
+#: patch_change_dialog.cc:76
+msgid "Patch Bank"
+msgstr ""
+
+#: patch_change_dialog.cc:83
+msgid "Patch"
+msgstr ""
+
+#: patch_change_dialog.cc:98 step_entry.cc:430
+msgid "Program"
+msgstr ""
+
+#: patch_change_dialog.cc:106 step_entry.cc:422
+msgid "Bank"
+msgstr ""
+
+#: quantize_dialog.cc:36
+msgid "main grid"
+msgstr ""
+
+#: quantize_dialog.cc:61 quantize_dialog.cc:118
+msgid "Quantize"
+msgstr ""
+
+#: quantize_dialog.cc:65
+msgid "Strength"
+msgstr ""
+
+#: quantize_dialog.cc:68
+msgid "Swing"
+msgstr ""
+
+#: quantize_dialog.cc:71
+msgid "Threshold (ticks)"
+msgstr ""
+
+#: quantize_dialog.cc:72
+msgid "Snap note start"
+msgstr ""
+
+#: quantize_dialog.cc:73
+msgid "Snap note end"
+msgstr ""
+
+#: rc_option_editor.cc:83 rc_option_editor.cc:84 rc_option_editor.cc:1550
+msgid "Browse..."
+msgstr ""
+
+#: rc_option_editor.cc:89
+msgid "Emphasis on first beat:"
+msgstr ""
+
+#: rc_option_editor.cc:95
+msgid "Use default Click:"
+msgstr ""
+
+#: rc_option_editor.cc:101
+msgid "Click audio file:"
+msgstr ""
+
+#: rc_option_editor.cc:108
+msgid "Click emphasis audio file:"
+msgstr ""
+
+#: rc_option_editor.cc:154
+msgid "Choose Click"
+msgstr ""
+
+#: rc_option_editor.cc:177
+msgid "Choose Click Emphasis"
+msgstr ""
+
+#: rc_option_editor.cc:238
+msgid "Limit undo history to"
+msgstr ""
+
+#: rc_option_editor.cc:239
+msgid "Save undo history of"
+msgstr ""
+
+#: rc_option_editor.cc:248 rc_option_editor.cc:255
+msgid "commands"
+msgstr ""
+
+#: rc_option_editor.cc:378
+msgid ""
+"\n"
+"Changes to this setting will only persist after your project has been saved."
+msgstr ""
+
+#: rc_option_editor.cc:389 rc_option_editor.cc:451
+msgid "<b>Recommended Setting: %1 + button 3 (right mouse button)</b>%2"
+msgstr ""
+
+#: rc_option_editor.cc:403
+msgid "Select Keyboard layout:"
+msgstr ""
+
+#: rc_option_editor.cc:422
+msgid "When Clicking:"
+msgstr ""
+
+#: rc_option_editor.cc:429
+msgid "Edit using:"
+msgstr ""
+
+#: rc_option_editor.cc:435 rc_option_editor.cc:465 rc_option_editor.cc:495
+msgid "+ button"
+msgstr ""
+
+#: rc_option_editor.cc:459
+msgid "Delete using:"
+msgstr ""
+
+#: rc_option_editor.cc:481
+msgid "<b>Recommended Setting: %1 + button 1 (left mouse button)</b>%2"
+msgstr ""
+
+#: rc_option_editor.cc:489
+msgid "Insert note using:"
+msgstr ""
+
+#: rc_option_editor.cc:507
+msgid "When Beginning a Drag:"
+msgstr ""
+
+#: rc_option_editor.cc:518 rc_option_editor.cc:545 rc_option_editor.cc:578
+#: rc_option_editor.cc:599 rc_option_editor.cc:643 rc_option_editor.cc:676
+#: rc_option_editor.cc:702 rc_option_editor.cc:730 rc_option_editor.cc:759
+#: rc_option_editor.cc:781
+msgid "<b>Recommended Setting: %1</b>%2"
+msgstr ""
+
+#: rc_option_editor.cc:532
+msgid "Copy items using:"
+msgstr ""
+
+#: rc_option_editor.cc:559
+msgid "Constrain drag using:"
+msgstr ""
+
+#: rc_option_editor.cc:567
+msgid "When Beginning a Trim:"
+msgstr ""
+
+#: rc_option_editor.cc:586
+msgid "Trim contents using:"
+msgstr ""
+
+#: rc_option_editor.cc:607
+msgid "Anchored trim using:"
+msgstr ""
+
+#: rc_option_editor.cc:651
+msgid "Resize notes relatively using:"
+msgstr ""
+
+#: rc_option_editor.cc:660
+msgid "While Dragging:"
+msgstr ""
+
+#: rc_option_editor.cc:684
+msgid "Ignore snap using:"
+msgstr ""
+
+#: rc_option_editor.cc:710
+msgid "Snap relatively using:"
+msgstr ""
+
+#: rc_option_editor.cc:718
+msgid "While Trimming:"
+msgstr ""
+
+#: rc_option_editor.cc:738
+msgid "Resize overlapped regions using:"
+msgstr ""
+
+#: rc_option_editor.cc:746
+msgid "While Dragging Control Points:"
+msgstr ""
+
+#: rc_option_editor.cc:767
+msgid "Fine adjust using:"
+msgstr ""
+
+#: rc_option_editor.cc:789
+msgid "Push points using:"
+msgstr ""
+
+#: rc_option_editor.cc:1029
+msgid "GUI and Font scaling:"
+msgstr ""
+
+#: rc_option_editor.cc:1032
+msgid "Default"
+msgstr ""
+
+#: rc_option_editor.cc:1058
+msgid "Adjusting the scale requires an application restart to re-layout."
+msgstr ""
+
+#: rc_option_editor.cc:1100
+msgid "∞"
+msgstr ""
+
+#: rc_option_editor.cc:1101
+msgid "30 sec"
+msgstr ""
+
+#: rc_option_editor.cc:1102
+msgid "1 min"
+msgstr ""
+
+#: rc_option_editor.cc:1103
+msgid "2 mins"
+msgstr ""
+
+#: rc_option_editor.cc:1104
+msgid "3 mins"
+msgstr ""
+
+#: rc_option_editor.cc:1105
+msgid "4 mins"
+msgstr ""
+
+#: rc_option_editor.cc:1106
+msgid "5 mins"
+msgstr ""
+
+#: rc_option_editor.cc:1109
+msgid ""
+"Specify the default timeout for plugin instantiation. Plugins that require "
+"more time to load will be blacklisted. A value of 0 disables the timeout."
+msgstr ""
+
+#: rc_option_editor.cc:1111
+msgid "Scan Time Out:"
+msgstr ""
+
+#: rc_option_editor.cc:1159
+msgid "Waveform Clip Level (dBFS):"
+msgstr ""
+
+#: rc_option_editor.cc:1212
+msgid "Small sessions (4-16 tracks)"
+msgstr ""
+
+#: rc_option_editor.cc:1213
+msgid "Medium sessions (16-64 tracks)"
+msgstr ""
+
+#: rc_option_editor.cc:1214
+msgid "Large sessions (64+ tracks)"
+msgstr ""
+
+#: rc_option_editor.cc:1215
+msgid "Custom (set by sliders below)"
+msgstr ""
+
+#: rc_option_editor.cc:1219 export_video_dialog.cc:167
+msgid "Preset:"
+msgstr ""
+
+#: rc_option_editor.cc:1231
+msgid "Playback (seconds of buffering):"
+msgstr ""
+
+#: rc_option_editor.cc:1244
+msgid "Recording (seconds of buffering):"
+msgstr ""
+
+#: rc_option_editor.cc:1322
+msgid "programming error: unknown buffering preset string, index = %1"
+msgstr ""
+
+#: rc_option_editor.cc:1353
+msgid "Control Surface Protocol"
+msgstr ""
+
+#: rc_option_editor.cc:1367
+msgid ""
+"Click to edit the settings for selected protocol ( it must be ENABLED "
+"first ):"
+msgstr ""
+
+#: rc_option_editor.cc:1371
+msgid "Show Protocol Settings"
+msgstr ""
+
+#: rc_option_editor.cc:1494
+msgid "Configuration"
+msgstr ""
+
+#: rc_option_editor.cc:1547
+msgid "Show Video Export Info before export"
+msgstr ""
+
+#: rc_option_editor.cc:1548
+msgid "Show Video Server Startup Dialog"
+msgstr ""
+
+#: rc_option_editor.cc:1549
+msgid "Advanced Setup (remote video server)"
+msgstr ""
+
+#: rc_option_editor.cc:1556
+msgid "Video Server"
+msgstr ""
+
+#: rc_option_editor.cc:1565
+msgid ""
+"<b>When enabled</b> you can speficify a custom video-server URL and docroot. "
+"- Do not enable this option unless you know what you are doing."
+msgstr ""
+
+#: rc_option_editor.cc:1567
+msgid "Video Server URL:"
+msgstr ""
+
+#: rc_option_editor.cc:1572
+msgid ""
+"Base URL of the video-server including http prefix. This is usually 'http://"
+"hostname.example.org:1554/' and defaults to 'http://localhost:1554/' when "
+"the video-server is running locally"
+msgstr ""
+
+#: rc_option_editor.cc:1574
+msgid "Video Folder:"
+msgstr ""
+
+#: rc_option_editor.cc:1579
+msgid ""
+"Local path to the video-server document-root. Only files below this "
+"directory will be accessible by the video-server. If the server run on a "
+"remote host, it should point to a network mounted folder of the server's "
+"docroot or be left empty if it is unvailable. It is used for the local video-"
+"monitor and file-browsing when opening/adding a video file."
+msgstr ""
+
+#: rc_option_editor.cc:1584
+msgid ""
+"<b>When enabled</b> an information window with details is displayed before "
+"the video-export dialog."
+msgstr ""
+
+#: rc_option_editor.cc:1589
+msgid ""
+"<b>When enabled</b> the video server is never launched automatically without "
+"confirmation"
+msgstr ""
+
+#: rc_option_editor.cc:1598
+msgid "Custom Path to Video Monitor (%1) - leave empty for default:"
+msgstr ""
+
+#: rc_option_editor.cc:1610
+msgid ""
+"Set a custom path to the Video Monitor Executable, changing this requires a "
+"restart."
+msgstr ""
+
+#: rc_option_editor.cc:1661
+msgid "Set Video Monitor Executable"
+msgstr ""
+
+#: rc_option_editor.cc:1734
+msgid "Column %1"
+msgstr ""
+
+#: rc_option_editor.cc:1852
+msgid "%1 Preferences"
+msgstr ""
+
+#: rc_option_editor.cc:1874 rc_option_editor.cc:1892 rc_option_editor.cc:1895
+#: rc_option_editor.cc:1897 rc_option_editor.cc:1899 rc_option_editor.cc:1907
+#: rc_option_editor.cc:1909 rc_option_editor.cc:1917 rc_option_editor.cc:1925
+#: rc_option_editor.cc:1932 rc_option_editor.cc:1953 rc_option_editor.cc:1955
+#: rc_option_editor.cc:1964 session_option_editor.cc:342
+#: session_option_editor.cc:344 session_option_editor.cc:365
+#: session_option_editor.cc:367 session_option_editor.cc:369
+#: session_option_editor.cc:376 session_option_editor.cc:383
+#: session_option_editor.cc:387
+msgid "Misc"
+msgstr ""
+
+#: rc_option_editor.cc:1874
+msgid "DSP CPU Utilization"
+msgstr ""
+
+#: rc_option_editor.cc:1878
+msgid "Signal processing uses"
+msgstr ""
+
+#: rc_option_editor.cc:1883
+msgid "all but one processor"
+msgstr ""
+
+#: rc_option_editor.cc:1884
+msgid "all available processors"
+msgstr ""
+
+#: rc_option_editor.cc:1887
+msgid "%1 processors"
+msgstr ""
+
+#: rc_option_editor.cc:1890
+msgid "This setting will only take effect when %1 is restarted."
+msgstr ""
+
+#: rc_option_editor.cc:1895
+msgid "Options|Undo"
+msgstr ""
+
+#: rc_option_editor.cc:1902
+msgid "Verify removal of last capture"
+msgstr ""
+
+#: rc_option_editor.cc:1907
+msgid "Session Management"
+msgstr ""
+
+#: rc_option_editor.cc:1912
+msgid "Make periodic backups of the session file"
+msgstr ""
+
+#: rc_option_editor.cc:1920
+msgid "Always copy imported files"
+msgstr ""
+
+#: rc_option_editor.cc:1927
+msgid "Default folder for new sessions:"
+msgstr ""
+
+#: rc_option_editor.cc:1935
+msgid "Maximum number of recent sessions"
+msgstr ""
+
+#: rc_option_editor.cc:1948
+msgid "Click gain level"
+msgstr ""
+
+#: rc_option_editor.cc:1953 route_time_axis.cc:277 route_time_axis.cc:831
+msgid "Automation"
+msgstr ""
+
+#: rc_option_editor.cc:1958
+msgid "Thinning factor (larger value => less data)"
+msgstr ""
+
+#: rc_option_editor.cc:1967
+msgid "Automation sampling interval (milliseconds)"
+msgstr ""
+
+#: rc_option_editor.cc:1975
+msgid "Transport Options"
+msgstr ""
+
+#: rc_option_editor.cc:1981
+msgid "Keep record-enable engaged on stop"
+msgstr ""
+
+#: rc_option_editor.cc:1990
+msgid "Play loop is a transport mode"
+msgstr ""
+
+#: rc_option_editor.cc:1995
+msgid ""
+"<b>When enabled</b> the loop button does not start playback but forces "
+"playback to always play the loop\n"
+"\n"
+"<b>When disabled</b> the loop button starts playing the loop, but stop then "
+"cancels loop playback"
+msgstr ""
+
+#: rc_option_editor.cc:2001
+msgid "Stop recording when an xrun occurs"
+msgstr ""
+
+#: rc_option_editor.cc:2006
+msgid ""
+"<b>When enabled</b> %1 will stop recording if an over- or underrun is "
+"detected by the audio engine"
+msgstr ""
+
+#: rc_option_editor.cc:2012
+msgid "Create markers where xruns occur"
+msgstr ""
+
+#: rc_option_editor.cc:2021
+msgid "Stop at the end of the session"
+msgstr ""
+
+#: rc_option_editor.cc:2026
+msgid ""
+"<b>When enabled</b> if %1 is <b>not recording</b>, it will stop the "
+"transport when it reaches the current session end marker\n"
+"\n"
+"<b>When disabled</b> %1 will continue to roll past the session end marker at "
+"all times"
+msgstr ""
+
+#: rc_option_editor.cc:2034
+msgid "Do seamless looping (not possible when slaved to MTC, LTC etc)"
+msgstr ""
+
+#: rc_option_editor.cc:2039
+msgid ""
+"<b>When enabled</b> this will loop by reading ahead and wrapping around at "
+"the loop point, preventing any need to do a transport locate at the end of "
+"the loop\n"
+"\n"
+"<b>When disabled</b> looping is done by locating back to the start of the "
+"loop when %1 reaches the end which will often cause a small click or delay"
+msgstr ""
+
+#: rc_option_editor.cc:2047
+msgid "Disable per-track record disarm while rolling"
+msgstr ""
+
+#: rc_option_editor.cc:2051
+msgid ""
+"<b>When enabled</b> this will prevent you from accidentally stopping "
+"specific tracks recording during a take"
+msgstr ""
+
+#: rc_option_editor.cc:2056
+msgid "12dB gain reduction during fast-forward and fast-rewind"
+msgstr ""
+
+#: rc_option_editor.cc:2060
+msgid ""
+"This will reduce the unpleasant increase in perceived volume that occurs "
+"when fast-forwarding or rewinding through some kinds of audio"
+msgstr ""
+
+#: rc_option_editor.cc:2066
+msgid "Preroll"
+msgstr ""
+
+#: rc_option_editor.cc:2071
+msgid ""
+"The amount of preroll (in seconds) to apply when <b>Play with Preroll</b> is "
+"initiated.\n"
+"\n"
+"If <b>Follow Edits</b> is enabled, the preroll is applied to the playhead "
+"position when a region is selected or trimmed."
+msgstr ""
+
+#: rc_option_editor.cc:2073
+msgid "0 (no pre-roll)"
+msgstr ""
+
+#: rc_option_editor.cc:2074
+msgid "0.1 second"
+msgstr ""
+
+#: rc_option_editor.cc:2075
+msgid "0.25 second"
+msgstr ""
+
+#: rc_option_editor.cc:2076
+msgid "0.5 second"
+msgstr ""
+
+#: rc_option_editor.cc:2077
+msgid "1.0 second"
+msgstr ""
+
+#: rc_option_editor.cc:2078
+msgid "2.0 seconds"
+msgstr ""
+
+#: rc_option_editor.cc:2081 rc_option_editor.cc:2090 rc_option_editor.cc:2106
+#: rc_option_editor.cc:2127 rc_option_editor.cc:2145 rc_option_editor.cc:2147
+#: rc_option_editor.cc:2164 rc_option_editor.cc:2167 rc_option_editor.cc:2169
+#: rc_option_editor.cc:2197
+msgid "Transport/Sync"
+msgstr ""
+
+#: rc_option_editor.cc:2081
+msgid "Synchronization and Slave Options"
+msgstr ""
+
+#: rc_option_editor.cc:2085
+msgid "External timecode source"
+msgstr ""
+
+#: rc_option_editor.cc:2094
+msgid "Match session video frame rate to external timecode"
+msgstr ""
+
+#: rc_option_editor.cc:2100
+msgid ""
+"This option controls the value of the video frame rate <i>while chasing</i> "
+"an external timecode source.\n"
+"\n"
+"<b>When enabled</b> the session video frame rate will be changed to match "
+"that of the selected external timecode source.\n"
+"\n"
+"<b>When disabled</b> the session video frame rate will not be changed to "
+"match that of the selected external timecode source.Instead the frame rate "
+"indication in the main clock will flash red and %1 will convert between the "
+"external timecode standard and the session standard."
+msgstr ""
+
+#: rc_option_editor.cc:2110
+msgid "Sync-lock timecode to clock (disable drift compensation)"
+msgstr ""
+
+#: rc_option_editor.cc:2116
+msgid ""
+"<b>When enabled</b> %1 will never varispeed when slaved to external "
+"timecode. Sync Lock indicates that the selected external timecode source "
+"shares clock-sync (Black & Burst, Wordclock, etc) with the audio "
+"interface. This option disables drift compensation. The transport speed is "
+"fixed at 1.0. Vari-speed LTC will be ignored and cause drift.\n"
+"\n"
+"<b>When disabled</b> %1 will compensate for potential drift, regardless if "
+"the timecode sources shares clock sync."
+msgstr ""
+
+#: rc_option_editor.cc:2131
+msgid "Lock to 29.9700 fps instead of 30000/1001"
+msgstr ""
+
+#: rc_option_editor.cc:2137
+msgid ""
+"<b>When enabled</b> the external timecode source is assumed to use 29.97 fps "
+"instead of 30000/1001.\n"
+"SMPTE 12M-1999 specifies 29.97df as 30000/1001. The spec further mentions "
+"that drop-frame timecode has an accumulated error of -86ms over a 24-hour "
+"period.\n"
+"Drop-frame timecode would compensate exactly for a NTSC color frame rate of "
+"30 * 0.9990 (ie 29.970000). That is not the actual rate. However, some "
+"vendors use that rate - despite it being against the specs - because the "
+"variant of using exactly 29.97 fps has zero timecode drift.\n"
+msgstr ""
+
+#: rc_option_editor.cc:2147
+msgid "LTC Reader"
+msgstr ""
+
+#: rc_option_editor.cc:2151
+msgid "LTC incoming port"
+msgstr ""
+
+#: rc_option_editor.cc:2167
+msgid "LTC Generator"
+msgstr ""
+
+#: rc_option_editor.cc:2172
+msgid "Enable LTC generator"
+msgstr ""
+
+#: rc_option_editor.cc:2179
+msgid "Send LTC while stopped"
+msgstr ""
+
+#: rc_option_editor.cc:2185
+msgid ""
+"<b>When enabled</b> %1 will continue to send LTC information even when the "
+"transport (playhead) is not moving"
+msgstr ""
+
+#: rc_option_editor.cc:2191
+msgid "LTC generator level"
+msgstr ""
+
+#: rc_option_editor.cc:2195
+msgid ""
+"Specify the Peak Volume of the generated LTC signal in dBFS. A good value "
+"is  0dBu ^= -18dBFS in an EBU calibrated system"
+msgstr ""
+
+#: rc_option_editor.cc:2204
+msgid "Make rubberband selection rectangle snap to the grid"
+msgstr ""
+
+#: rc_option_editor.cc:2211
+msgid "Name new markers"
+msgstr ""
+
+#: rc_option_editor.cc:2216
+msgid ""
+"If enabled, popup a dialog when a new marker is created to allow its name to "
+"be set as it is created.\n"
+"\n"
+"You can always rename markers by right-clicking on them"
+msgstr ""
+
+#: rc_option_editor.cc:2222
+msgid "Allow dragging of playhead"
+msgstr ""
+
+#: rc_option_editor.cc:2230
+msgid "Display master-meter in the toolbar"
+msgstr ""
+
+#: rc_option_editor.cc:2239
+msgid "Show zoom toolbar (if torn off)"
+msgstr ""
+
+#: rc_option_editor.cc:2247
+msgid ""
+"Always use mouse cursor position as zoom focus when zooming using mouse "
+"scroll wheel"
+msgstr ""
+
+#: rc_option_editor.cc:2256
+msgid "Update editor window during drags of the summary"
+msgstr ""
+
+#: rc_option_editor.cc:2264
+msgid "Auto-scroll editor window when dragging near its edges"
+msgstr ""
+
+#: rc_option_editor.cc:2272
+msgid "Show gain envelopes in audio regions"
+msgstr ""
+
+#: rc_option_editor.cc:2273
+msgid "in all modes"
+msgstr ""
+
+#: rc_option_editor.cc:2274
+msgid "only in Draw and Internal Edit modes"
+msgstr ""
+
+#: rc_option_editor.cc:2279
+msgid "Editor Behavior"
+msgstr ""
+
+#: rc_option_editor.cc:2284
+msgid "Move relevant automation when audio regions are moved"
+msgstr ""
+
+#: rc_option_editor.cc:2291
+msgid "Default fade shape"
+msgstr ""
+
+#: rc_option_editor.cc:2310
+msgid "Regions in active edit groups are edited together"
+msgstr ""
+
+#: rc_option_editor.cc:2311
+msgid "whenever they overlap in time"
+msgstr ""
+
+#: rc_option_editor.cc:2312
+msgid "only if they have identical length, position and origin"
+msgstr ""
+
+#: rc_option_editor.cc:2321
+msgid "Layering model"
+msgstr ""
+
+#: rc_option_editor.cc:2326
+msgid "later is higher"
+msgstr ""
+
+#: rc_option_editor.cc:2327
+msgid "manual layering"
+msgstr ""
+
+#: rc_option_editor.cc:2332
+msgid "After splitting selected regions, select"
+msgstr ""
+
+#: rc_option_editor.cc:2337
+msgid "no regions"
+msgstr ""
+
+#: rc_option_editor.cc:2340
+msgid "newly-created regions"
+msgstr ""
+
+#: rc_option_editor.cc:2344
+msgid "existing selection and newly-created regions"
+msgstr ""
+
+#: rc_option_editor.cc:2348 rc_option_editor.cc:2351 rc_option_editor.cc:2360
+#: rc_option_editor.cc:2378 rc_option_editor.cc:2390 rc_option_editor.cc:2392
+msgid "Editor/Waveforms"
+msgstr ""
+
+#: rc_option_editor.cc:2348
+msgid "Waveforms"
+msgstr ""
+
+#: rc_option_editor.cc:2354
+msgid "Show waveforms in regions"
+msgstr ""
+
+#: rc_option_editor.cc:2363
+msgid "Show waveforms for audio while it is being recorded"
+msgstr ""
+
+#: rc_option_editor.cc:2370
+msgid "Waveform scale"
+msgstr ""
+
+#: rc_option_editor.cc:2375
+msgid "linear"
+msgstr ""
+
+#: rc_option_editor.cc:2376
+msgid "logarithmic"
+msgstr ""
+
+#: rc_option_editor.cc:2382
+msgid "Waveform shape"
+msgstr ""
+
+#: rc_option_editor.cc:2387
+msgid "traditional"
+msgstr ""
+
+#: rc_option_editor.cc:2388
+msgid "rectified"
+msgstr ""
+
+#: rc_option_editor.cc:2397
+msgid "Buffering"
+msgstr ""
+
+#: rc_option_editor.cc:2405
+msgid "Record monitoring handled by"
+msgstr ""
+
+#: rc_option_editor.cc:2411
+msgid "via Audio Driver"
+msgstr ""
+
+#: rc_option_editor.cc:2417
+msgid "audio hardware"
+msgstr ""
+
+#: rc_option_editor.cc:2424
+msgid "Tape machine mode"
+msgstr ""
+
+#: rc_option_editor.cc:2429
+msgid "Connection of tracks and busses"
+msgstr ""
+
+#: rc_option_editor.cc:2435
+msgid "Auto-connect master/monitor busses"
+msgstr ""
+
+#: rc_option_editor.cc:2442
+msgid "Connect track inputs"
+msgstr ""
+
+#: rc_option_editor.cc:2447
+msgid "automatically to physical inputs"
+msgstr ""
+
+#: rc_option_editor.cc:2448 rc_option_editor.cc:2461
+msgid "manually"
+msgstr ""
+
+#: rc_option_editor.cc:2454
+msgid "Connect track and bus outputs"
+msgstr ""
+
+#: rc_option_editor.cc:2459
+msgid "automatically to physical outputs"
+msgstr ""
+
+#: rc_option_editor.cc:2460
+msgid "automatically to master bus"
+msgstr ""
+
+#: rc_option_editor.cc:2467
+msgid "Use 'Strict-I/O' for new tracks or Busses"
+msgstr ""
+
+#: rc_option_editor.cc:2478
+msgid "Denormals"
+msgstr ""
+
+#: rc_option_editor.cc:2483
+msgid "Use DC bias to protect against denormals"
+msgstr ""
+
+#: rc_option_editor.cc:2490
+msgid "Processor handling"
+msgstr ""
+
+#: rc_option_editor.cc:2496
+msgid "no processor handling"
+msgstr ""
+
+#: rc_option_editor.cc:2502
+msgid "use FlushToZero"
+msgstr ""
+
+#: rc_option_editor.cc:2509
+msgid "use DenormalsAreZero"
+msgstr ""
+
+#: rc_option_editor.cc:2516
+msgid "use FlushToZero and DenormalsAreZero"
+msgstr ""
+
+#: rc_option_editor.cc:2532
+msgid "Enable automatic analysis of audio"
+msgstr ""
+
+#: rc_option_editor.cc:2540
+msgid "Replicate missing region channels"
+msgstr ""
+
+#: rc_option_editor.cc:2547 rc_option_editor.cc:2556 rc_option_editor.cc:2558
+#: rc_option_editor.cc:2566 rc_option_editor.cc:2574 rc_option_editor.cc:2582
+#: rc_option_editor.cc:2600 rc_option_editor.cc:2612 rc_option_editor.cc:2624
+#: rc_option_editor.cc:2626 rc_option_editor.cc:2628 rc_option_editor.cc:2636
+#: rc_option_editor.cc:2644 rc_option_editor.cc:2652 rc_option_editor.cc:2662
+#: rc_option_editor.cc:2663
+msgid "Solo & mute"
+msgstr ""
+
+#: rc_option_editor.cc:2551
+msgid "Solo controls are Listen controls"
+msgstr ""
+
+#: rc_option_editor.cc:2561
+msgid "Exclusive solo"
+msgstr ""
+
+#: rc_option_editor.cc:2569
+msgid "Show solo muting"
+msgstr ""
+
+#: rc_option_editor.cc:2577
+msgid "Soloing overrides muting"
+msgstr ""
+
+#: rc_option_editor.cc:2585
+msgid "Solo-in-place mute cut (dB)"
+msgstr ""
+
+#: rc_option_editor.cc:2592
+msgid "Listen Position"
+msgstr ""
+
+#: rc_option_editor.cc:2597
+msgid "after-fader (AFL)"
+msgstr ""
+
+#: rc_option_editor.cc:2598
+msgid "pre-fader (PFL)"
+msgstr ""
+
+#: rc_option_editor.cc:2604
+msgid "PFL signals come from"
+msgstr ""
+
+#: rc_option_editor.cc:2609
+msgid "before pre-fader processors"
+msgstr ""
+
+#: rc_option_editor.cc:2610
+msgid "pre-fader but after pre-fader processors"
+msgstr ""
+
+#: rc_option_editor.cc:2616
+msgid "AFL signals come from"
+msgstr ""
+
+#: rc_option_editor.cc:2621
+msgid "immediately post-fader"
+msgstr ""
+
+#: rc_option_editor.cc:2622
+msgid "after post-fader processors (before pan)"
+msgstr ""
+
+#: rc_option_editor.cc:2626
+msgid "Default track / bus muting options"
+msgstr ""
+
+#: rc_option_editor.cc:2631
+msgid "Mute affects pre-fader sends"
+msgstr ""
+
+#: rc_option_editor.cc:2639
+msgid "Mute affects post-fader sends"
+msgstr ""
+
+#: rc_option_editor.cc:2647
+msgid "Mute affects control outputs"
+msgstr ""
+
+#: rc_option_editor.cc:2655
+msgid "Mute affects main outputs"
+msgstr ""
+
+#: rc_option_editor.cc:2662
+msgid "Send Routing"
+msgstr ""
+
+#: rc_option_editor.cc:2666
+msgid "Link panners of Aux and External Sends with main panner by default"
+msgstr ""
+
+#: rc_option_editor.cc:2672
+msgid "MIDI Preferences"
+msgstr ""
+
+#: rc_option_editor.cc:2677
+msgid "MIDI read-ahead time (seconds)"
+msgstr ""
+
+#: rc_option_editor.cc:2687
+msgid "Initial program change"
+msgstr ""
+
+#: rc_option_editor.cc:2696
+msgid "Display first MIDI bank/program as 0"
+msgstr ""
+
+#: rc_option_editor.cc:2704
+msgid "Never display periodic MIDI messages (MTC, MIDI Clock)"
+msgstr ""
+
+#: rc_option_editor.cc:2712
+msgid "Sound MIDI notes as they are selected in the editor"
+msgstr ""
+
+#: rc_option_editor.cc:2720
+msgid "Send MIDI control feedback"
+msgstr ""
+
+#: rc_option_editor.cc:2725 rc_option_editor.cc:2727 rc_option_editor.cc:2735
+#: rc_option_editor.cc:2737 rc_option_editor.cc:2745 rc_option_editor.cc:2754
+#: rc_option_editor.cc:2756 rc_option_editor.cc:2764 rc_option_editor.cc:2772
+#: rc_option_editor.cc:2781
+msgid "MIDI/Sync"
+msgstr ""
+
+#: rc_option_editor.cc:2725
+msgid "MIDI Clock"
+msgstr ""
+
+#: rc_option_editor.cc:2735
+msgid "MIDI Time Code (MTC)"
+msgstr ""
+
+#: rc_option_editor.cc:2740
+msgid "Send MIDI Time Code"
+msgstr ""
+
+#: rc_option_editor.cc:2748
+msgid "Percentage either side of normal transport speed to transmit MTC"
+msgstr ""
+
+#: rc_option_editor.cc:2754
+msgid "Midi Machine Control (MMC)"
+msgstr ""
+
+#: rc_option_editor.cc:2759
+msgid "Obey MIDI Machine Control commands"
+msgstr ""
+
+#: rc_option_editor.cc:2767
+msgid "Send MIDI Machine Control commands"
+msgstr ""
+
+#: rc_option_editor.cc:2775
+msgid "Inbound MMC device ID"
+msgstr ""
+
+#: rc_option_editor.cc:2784
+msgid "Outbound MMC device ID"
+msgstr ""
+
+#: rc_option_editor.cc:2790
+msgid "Midi Audition"
+msgstr ""
+
+#: rc_option_editor.cc:2794
+msgid "Midi Audition Synth (LV2)"
+msgstr ""
+
+#: rc_option_editor.cc:2825 rc_option_editor.cc:2835 rc_option_editor.cc:2837
+msgid "User interaction"
+msgstr ""
+
+#: rc_option_editor.cc:2828
+msgid ""
+"Use translations of %1 messages\n"
+"   <i>(requires a restart of %1 to take effect)</i>\n"
+"   <i>(if available for your language preferences)</i>"
+msgstr ""
+
+#: rc_option_editor.cc:2835
+msgid "Keyboard"
+msgstr ""
+
+#: rc_option_editor.cc:2848 rc_option_editor.cc:2890 rc_option_editor.cc:2960
+#: startup.cc:352
+msgid "Scan for Plugins"
+msgstr ""
+
+#: rc_option_editor.cc:2853
+msgid "General"
+msgstr ""
+
+#: rc_option_editor.cc:2858
+msgid "Always Display Plugin Scan Progress"
+msgstr ""
+
+#: rc_option_editor.cc:2864
+msgid ""
+"<b>When enabled</b> a popup window showing plugin scan progress is displayed "
+"for indexing (cache load) and discovery (detect new plugins)"
+msgstr ""
+
+#: rc_option_editor.cc:2869
+msgid "Silence plugins when the transport is stopped"
+msgstr ""
+
+#: rc_option_editor.cc:2875
+msgid ""
+"<b>When enabled</b> plugins will be reset at transport stop. When disabled "
+"plugins will be left unchanged at transport stop.\n"
+"\n"
+"This mostly affects plugins with a \"tail\" like Reverbs."
+msgstr ""
+
+#: rc_option_editor.cc:2879
+msgid "Make new plugins active"
+msgstr ""
+
+#: rc_option_editor.cc:2885
+msgid ""
+"<b>When enabled</b> plugins will be activated when they are added to tracks/"
+"busses. When disabled plugins will be left inactive when they are added to "
+"tracks/busses"
+msgstr ""
+
+#: rc_option_editor.cc:2888 rc_option_editor.cc:2889 rc_option_editor.cc:2899
+#: rc_option_editor.cc:2911 rc_option_editor.cc:2916 rc_option_editor.cc:2918
+#: rc_option_editor.cc:2923 rc_option_editor.cc:2930 rc_option_editor.cc:2935
+#: rc_option_editor.cc:2944
+msgid "Plugins/VST"
+msgstr ""
+
+#: rc_option_editor.cc:2888
+msgid "VST"
+msgstr ""
+
+#: rc_option_editor.cc:2895
+msgid "Scan for [new] VST Plugins on Application Start"
+msgstr ""
+
+#: rc_option_editor.cc:2901
+msgid ""
+"<b>When enabled</b> new VST plugins are searched, tested and added to the "
+"cache index on application start. When disabled new plugins will only be "
+"available after triggering a 'Scan' manually"
+msgstr ""
+
+#: rc_option_editor.cc:2907
+msgid "Verbose Plugin Scan"
+msgstr ""
+
+#: rc_option_editor.cc:2913
+msgid ""
+"<b>When enabled</b> additional information for every plugin is added to the "
+"Log Window."
+msgstr ""
+
+#: rc_option_editor.cc:2921
+msgid "VST Cache:"
+msgstr ""
+
+#: rc_option_editor.cc:2926
+msgid "VST Blacklist:"
+msgstr ""
+
+#: rc_option_editor.cc:2933
+msgid "Linux VST Path:"
+msgstr ""
+
+#: rc_option_editor.cc:2938 rc_option_editor.cc:2951
+msgid "Path:"
+msgstr ""
+
+#: rc_option_editor.cc:2947
+msgid "Windows VST Path:"
+msgstr ""
+
+#: rc_option_editor.cc:2958 rc_option_editor.cc:2959 rc_option_editor.cc:2973
+#: rc_option_editor.cc:2978
+msgid "Plugins/Audio Unit"
+msgstr ""
+
+#: rc_option_editor.cc:2958
+msgid "Audio Unit"
+msgstr ""
+
+#: rc_option_editor.cc:2965
+msgid "Scan for AudioUnit Plugins on Application Start"
+msgstr ""
+
+#: rc_option_editor.cc:2971
+msgid ""
+"<b>When enabled</b> Audio Unit Plugins are discovered on application start. "
+"When disabled AU plugins will only be available after triggering a 'Scan' "
+"manually. The first successful scan will enable AU auto-scan, Any crash "
+"during plugin discovery will disable it."
+msgstr ""
+
+#: rc_option_editor.cc:2976
+msgid "AU Cache:"
+msgstr ""
+
+#: rc_option_editor.cc:2981
+msgid "AU Blacklist:"
+msgstr ""
+
+#: rc_option_editor.cc:2985
+msgid "Plugin GUI"
+msgstr ""
+
+#: rc_option_editor.cc:2989
+msgid "Automatically open the plugin GUI when adding a new plugin"
+msgstr ""
+
+#: rc_option_editor.cc:2998
+msgid "Show Plugin Inline Display on Mixerstrip by default"
+msgstr ""
+
+#: rc_option_editor.cc:3005
+msgid ""
+"Don't automatically open the plugin GUI when the plugin has an inline "
+"display mode"
+msgstr ""
+
+#: rc_option_editor.cc:3012
+msgid "Instrument"
+msgstr ""
+
+#: rc_option_editor.cc:3016
+msgid "Ask to replace existing instrument plugin"
+msgstr ""
+
+#: rc_option_editor.cc:3024
+msgid "Interactively configure instrument plugins on insert"
+msgstr ""
+
+#: rc_option_editor.cc:3030
+msgid ""
+"<b>When enabled</b> show a dialog to select instrument channel configuration "
+"before adding a multichannel plugin."
+msgstr ""
+
+#: rc_option_editor.cc:3039
+msgid "Disable Graphics Hardware Acceleration (requires restart)"
+msgstr ""
+
+#: rc_option_editor.cc:3045
+msgid ""
+"Render large parts of the application user-interface in software, instead of "
+"using 2D-graphics acceleration.\n"
+"This requires restarting %1 before having an effect"
+msgstr ""
+
+#: rc_option_editor.cc:3046 rc_option_editor.cc:3058 rc_option_editor.cc:3061
+#: rc_option_editor.cc:3069 rc_option_editor.cc:3077 rc_option_editor.cc:3085
+#: rc_option_editor.cc:3093 rc_option_editor.cc:3104 rc_option_editor.cc:3120
+#: rc_option_editor.cc:3136 rc_option_editor.cc:3151 rc_option_editor.cc:3160
+#: rc_option_editor.cc:3168
+msgid "Preferences|GUI"
+msgstr ""
+
+#: rc_option_editor.cc:3052
+msgid "Possibly improve slow graphical performance (requires restart)"
+msgstr ""
+
+#: rc_option_editor.cc:3057
+msgid ""
+"Disables hardware gradient rendering on buggy video drivers (\"buggy "
+"gradients patch\").\n"
+"This requires restarting %1 before having an effect"
+msgstr ""
+
+#: rc_option_editor.cc:3064
+msgid "Use Window Manager/Desktop visibility information"
+msgstr ""
+
+#: rc_option_editor.cc:3072
+msgid "Graphically indicate mouse pointer hovering over various widgets"
+msgstr ""
+
+#: rc_option_editor.cc:3080
+msgid "Show tooltips if mouse hovers over a control"
+msgstr ""
+
+#: rc_option_editor.cc:3088
+msgid "Use name highlight bars in region displays (requires a restart)"
+msgstr ""
+
+#: rc_option_editor.cc:3096
+msgid "Update transport clock display at FPS instead of every 100ms"
+msgstr ""
+
+#: rc_option_editor.cc:3111
+msgid "Waveform image cache size (megabytes)"
+msgstr ""
+
+#: rc_option_editor.cc:3119
+msgid ""
+"Increasing the cache size uses more memory to store waveform images, which "
+"can improve graphical performance."
+msgstr ""
+
+#: rc_option_editor.cc:3127
+msgid "Lock timeout (seconds)"
+msgstr ""
+
+#: rc_option_editor.cc:3135
+msgid "Lock GUI after this many idle seconds (zero to never lock)"
+msgstr ""
+
+#: rc_option_editor.cc:3153
+msgid "Mixer Strip"
+msgstr ""
+
+#: rc_option_editor.cc:3163
+msgid "Use narrow strips in the mixer by default"
+msgstr ""
+
+#: rc_option_editor.cc:3170
+msgid "Action Script Button Visibility"
+msgstr ""
+
+#: rc_option_editor.cc:3176 rc_option_editor.cc:3190 rc_option_editor.cc:3207
+#: rc_option_editor.cc:3223 rc_option_editor.cc:3239 rc_option_editor.cc:3253
+#: rc_option_editor.cc:3279 rc_option_editor.cc:3297 rc_option_editor.cc:3308
+#: rc_option_editor.cc:3315 rc_option_editor.cc:3317 rc_option_editor.cc:3325
+#: rc_option_editor.cc:3327 rc_option_editor.cc:3335 rc_option_editor.cc:3343
+#: rc_option_editor.cc:3345
+msgid "Preferences|Metering"
+msgstr ""
+
+#: rc_option_editor.cc:3180
+msgid "Peak hold time"
+msgstr ""
+
+#: rc_option_editor.cc:3186
+msgid "short"
+msgstr ""
+
+#: rc_option_editor.cc:3187
+msgid "medium"
+msgstr ""
+
+#: rc_option_editor.cc:3188
+msgid "long"
+msgstr ""
+
+#: rc_option_editor.cc:3194
+msgid "DPM fall-off"
+msgstr ""
+
+#: rc_option_editor.cc:3200
+msgid "slowest [6.6dB/sec]"
+msgstr ""
+
+#: rc_option_editor.cc:3201
+msgid "slow [8.6dB/sec] (BBC PPM, EBU PPM)"
+msgstr ""
+
+#: rc_option_editor.cc:3202
+msgid "moderate [12.0dB/sec] (DIN)"
+msgstr ""
+
+#: rc_option_editor.cc:3203
+msgid "medium [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"
+msgstr ""
+
+#: rc_option_editor.cc:3204
+msgid "fast [20dB/sec]"
+msgstr ""
+
+#: rc_option_editor.cc:3205
+msgid "very fast [32dB/sec]"
+msgstr ""
+
+#: rc_option_editor.cc:3211
+msgid "Meter line-up level; 0dBu"
+msgstr ""
+
+#: rc_option_editor.cc:3216 rc_option_editor.cc:3232
+msgid "-24dBFS (SMPTE US: 4dBu = -20dBFS)"
+msgstr ""
+
+#: rc_option_editor.cc:3217 rc_option_editor.cc:3233
+msgid "-20dBFS (SMPTE RP.0155)"
+msgstr ""
+
+#: rc_option_editor.cc:3218 rc_option_editor.cc:3234
+msgid "-18dBFS (EBU, BBC)"
+msgstr ""
+
+#: rc_option_editor.cc:3219 rc_option_editor.cc:3235
+msgid "-15dBFS (DIN)"
+msgstr ""
+
+#: rc_option_editor.cc:3221
+msgid ""
+"Configure meter-marks and color-knee point for dBFS scale DPM, set reference "
+"level for IEC1/Nordic, IEC2 PPM and VU meter."
+msgstr ""
+
+#: rc_option_editor.cc:3227
+msgid "IEC1/DIN Meter line-up level; 0dBu"
+msgstr ""
+
+#: rc_option_editor.cc:3237
+msgid "Reference level for IEC1/DIN meter."
+msgstr ""
+
+#: rc_option_editor.cc:3243
+msgid "VU Meter standard"
+msgstr ""
+
+#: rc_option_editor.cc:3248
+msgid "0VU = -2dBu (France)"
+msgstr ""
+
+#: rc_option_editor.cc:3249
+msgid "0VU = 0dBu (North America, Australia)"
+msgstr ""
+
+#: rc_option_editor.cc:3250
+msgid "0VU = +4dBu (standard)"
+msgstr ""
+
+#: rc_option_editor.cc:3251
+msgid "0VU = +8dBu"
+msgstr ""
+
+#: rc_option_editor.cc:3257
+msgid "Peak threshold [dBFS]"
+msgstr ""
+
+#: rc_option_editor.cc:3266
+msgid "Default Meter Type for Master Bus"
+msgstr ""
+
+#: rc_option_editor.cc:3284
+msgid "Default Meter Type for Busses"
+msgstr ""
+
+#: rc_option_editor.cc:3301
+msgid "Default Meter Type for Tracks"
+msgstr ""
+
+#: rc_option_editor.cc:3313
+msgid ""
+"Specify the audio signal level in dBFS at and above which the meter-peak "
+"indicator will flash red."
+msgstr ""
+
+#: rc_option_editor.cc:3320
+msgid "LED meter style"
+msgstr ""
+
+#: rc_option_editor.cc:3325
+msgid "Editor Meters"
+msgstr ""
+
+#: rc_option_editor.cc:3330
+msgid "Show meters on tracks in the editor"
+msgstr ""
+
+#: rc_option_editor.cc:3338
+msgid "Show at most stereo meters in the track-header"
+msgstr ""
+
+#: rc_option_editor.cc:3343
+msgid "Post Export Analysis"
+msgstr ""
+
+#: rc_option_editor.cc:3348
+msgid "Save loudness analysis as image file"
+msgstr ""
+
+#: rc_option_editor.cc:3356
+msgid "Theme"
+msgstr ""
+
+#: rc_option_editor.cc:3358
+msgid "Theme/Colors"
+msgstr ""
+
+#: rc_option_editor.cc:3436
+msgid "Set Linux VST Search Path"
+msgstr ""
+
+#: rc_option_editor.cc:3450
+msgid "Set Windows VST Search Path"
+msgstr ""
+
+#: region_editor.cc:81
+msgid "audition this region"
+msgstr ""
+
+#: region_editor.cc:90 region_layering_order_editor.cc:75
+msgid "Position:"
+msgstr ""
+
+#: region_editor.cc:92 add_video_dialog.cc:156
+msgid "End:"
+msgstr ""
+
+#: region_editor.cc:94 sfdb_ui.cc:145
+msgid "Length:"
+msgstr ""
+
+#: region_editor.cc:96
+msgid "Sync point (relative to region):"
+msgstr ""
+
+#: region_editor.cc:98
+msgid "Sync point (absolute):"
+msgstr ""
+
+#: region_editor.cc:100
+msgid "File start:"
+msgstr ""
+
+#: region_editor.cc:104
+msgid "Sources:"
+msgstr ""
+
+#: region_editor.cc:106
+msgid "Source:"
+msgstr ""
+
+#: region_editor.cc:168
+msgid "Region '%1'"
+msgstr ""
+
+#: region_editor.cc:279
+msgid "change region start position"
+msgstr ""
+
+#: region_editor.cc:299
+msgid "change region end position"
+msgstr ""
+
+#: region_editor.cc:322
+msgid "change region length"
+msgstr ""
+
+#: region_editor.cc:416 region_editor.cc:428
+msgid "change region sync point"
+msgstr ""
+
+#: region_layering_order_editor.cc:42
+msgid "RegionLayeringOrderEditor"
+msgstr ""
+
+#: region_layering_order_editor.cc:55
+msgid "Region Name"
+msgstr ""
+
+#: region_layering_order_editor.cc:72
+msgid "Track:"
+msgstr ""
+
+#: region_layering_order_editor.cc:104
+msgid "Choose Top Region"
+msgstr ""
+
+#: region_view.cc:271
+msgid "SilenceText"
+msgstr ""
+
+#: region_view.cc:286 region_view.cc:305
+msgid "minutes"
+msgstr ""
+
+#: region_view.cc:289 region_view.cc:308
+msgid "msecs"
+msgstr ""
+
+#: region_view.cc:292 region_view.cc:311
+msgid "secs"
+msgstr ""
+
+#: region_view.cc:295
+msgid "%1 silent segment"
+msgid_plural "%1 silent segments"
+msgstr[0] ""
+msgstr[1] ""
+
+#: region_view.cc:297
+msgid "shortest = %1 %2"
+msgstr ""
+
+#: region_view.cc:314
+msgid ""
+"\n"
+"  (shortest audible segment = %1 %2)"
+msgstr ""
+
+#: return_ui.cc:102
+msgid "Return "
+msgstr ""
+
+#: rhythm_ferret.cc:48
+msgid "Percussive Onset"
+msgstr ""
+
+#: rhythm_ferret.cc:49
+msgid "Note Onset"
+msgstr ""
+
+#: rhythm_ferret.cc:54
+msgid "Energy Based"
+msgstr ""
+
+#: rhythm_ferret.cc:55
+msgid "Spectral Difference"
+msgstr ""
+
+#: rhythm_ferret.cc:56
+msgid "High-Frequency Content"
+msgstr ""
+
+#: rhythm_ferret.cc:57
+msgid "Complex Domain"
+msgstr ""
+
+#: rhythm_ferret.cc:58
+msgid "Phase Deviation"
+msgstr ""
+
+#: rhythm_ferret.cc:59
+msgid "Kullback-Liebler"
+msgstr ""
+
+#: rhythm_ferret.cc:60
+msgid "Modified Kullback-Liebler"
+msgstr ""
+
+#: rhythm_ferret.cc:62
+msgid "Spectral Flux"
+msgstr ""
+
+#: rhythm_ferret.cc:68
+msgid "Split region"
+msgstr ""
+
+#: rhythm_ferret.cc:70
+msgid "Snap regions"
+msgstr ""
+
+#: rhythm_ferret.cc:71
+msgid "Conform regions"
+msgstr ""
+
+#: rhythm_ferret.cc:77
+msgid "Rhythm Ferret"
+msgstr ""
+
+#: rhythm_ferret.cc:83
+msgid "Analyze"
+msgstr ""
+
+#: rhythm_ferret.cc:122
+msgid "Detection function"
+msgstr ""
+
+#: rhythm_ferret.cc:126
+msgid "Trigger gap (postproc)"
+msgstr ""
+
+#: rhythm_ferret.cc:131
+msgid "Peak threshold"
+msgstr ""
+
+#: rhythm_ferret.cc:135
+msgid "Silence threshold"
+msgstr ""
+
+#: rhythm_ferret.cc:141
+msgid "Min Inter-Onset Time"
+msgstr ""
+
+#: rhythm_ferret.cc:148
+msgid "Sensitivity"
+msgstr ""
+
+#: rhythm_ferret.cc:152
+msgid "Cut Pos Threshold"
+msgstr ""
+
+#: rhythm_ferret.cc:157
+msgid "Operation"
+msgstr ""
+
+#: rhythm_ferret.cc:382
+msgid "split regions (rhythm ferret)"
+msgstr ""
+
+#: route_group_dialog.cc:42
+msgid "Track/bus Group"
+msgstr ""
+
+#: route_group_dialog.cc:47
+msgid "Relative"
+msgstr ""
+
+#: route_group_dialog.cc:48
+msgid "Muting"
+msgstr ""
+
+#: route_group_dialog.cc:50
+msgid "Record enable"
+msgstr ""
+
+#: route_group_dialog.cc:52
+msgid "Active state"
+msgstr ""
+
+#: route_group_dialog.cc:58
+msgid "RouteGroupDialog"
+msgstr ""
+
+#: route_group_dialog.cc:99
+msgid "<b>Sharing</b>"
+msgstr ""
+
+#: route_group_dialog.cc:192
+msgid "The group name is not unique. Please use a different name."
+msgstr ""
+
+#: route_params_ui.cc:84
+msgid "Tracks/Busses"
+msgstr ""
+
+#: route_params_ui.cc:103
+msgid "Inputs"
+msgstr ""
+
+#: route_params_ui.cc:104
+msgid "Outputs"
+msgstr ""
+
+#: route_params_ui.cc:105
+msgid "Plugins, Inserts & Sends"
+msgstr ""
+
+#: route_params_ui.cc:201
+msgid "route display list item for renamed route not found!"
+msgstr ""
+
+#: route_params_ui.cc:271 route_params_ui.cc:299
+#, c-format
+msgid "Playback delay: %<PRId64> samples"
+msgstr ""
+
+#: route_params_ui.cc:491
+msgid "NO TRACK"
+msgstr ""
+
+#: route_params_ui.cc:515
+msgid "Add Track or Bus"
+msgstr ""
+
+#: route_params_ui.cc:627 route_params_ui.cc:628
+msgid "No Track or Bus Selected"
+msgstr ""
+
+#: route_time_axis.cc:104
+msgid "RTAV|G"
+msgstr ""
+
+#: route_time_axis.cc:105
+msgid "RTAV|P"
+msgstr ""
+
+#: route_time_axis.cc:106
+msgid "RTAV|A"
+msgstr ""
+
+#: route_time_axis.cc:194
+msgid "Record (Right-click for Step Edit)"
+msgstr ""
+
+#: route_time_axis.cc:197
+msgid "Record"
+msgstr ""
+
+#: route_time_axis.cc:265
+msgid "Route Group"
+msgstr ""
+
+#: route_time_axis.cc:275
+msgid "MIDI Controllers and Automation"
+msgstr ""
+
+#: route_time_axis.cc:510
+msgid "Show All Automation"
+msgstr ""
+
+#: route_time_axis.cc:513
+msgid "Show Existing Automation"
+msgstr ""
+
+#: route_time_axis.cc:516
+msgid "Hide All Automation"
+msgstr ""
+
+#: route_time_axis.cc:525
+msgid "Processor automation"
+msgstr ""
+
+#: route_time_axis.cc:532
+msgid "Fader"
+msgstr ""
+
+#: route_time_axis.cc:559
+msgid "Pan"
+msgstr ""
+
+#: route_time_axis.cc:643
+msgid "Overlaid"
+msgstr ""
+
+#: route_time_axis.cc:649
+msgid "Stacked"
+msgstr ""
+
+#: route_time_axis.cc:657
+msgid "Layers"
+msgstr ""
+
+#: route_time_axis.cc:721
+msgid "Automatic (based on I/O connections)"
+msgstr ""
+
+#: route_time_axis.cc:730
+msgid "(Currently: Existing Material)"
+msgstr ""
+
+#: route_time_axis.cc:733
+msgid "(Currently: Capture Time)"
+msgstr ""
+
+#: route_time_axis.cc:741
+msgid "Align With Existing Material"
+msgstr ""
+
+#: route_time_axis.cc:746
+msgid "Align With Capture Time"
+msgstr ""
+
+#: route_time_axis.cc:751
+msgid "Alignment"
+msgstr ""
+
+#: route_time_axis.cc:786
+msgid "Normal Mode"
+msgstr ""
+
+#: route_time_axis.cc:792
+msgid "Tape Mode"
+msgstr ""
+
+#: route_time_axis.cc:798
+msgid "Non-Layered Mode"
+msgstr ""
+
+#: route_time_axis.cc:804
+msgid "Record Mode"
+msgstr ""
+
+#: route_time_axis.cc:809 route_time_axis.cc:1795
+msgid "Playlist"
+msgstr ""
+
+#: route_time_axis.cc:1107
+msgid "Rename Playlist"
+msgstr ""
+
+#: route_time_axis.cc:1108
+msgid "New name for playlist:"
+msgstr ""
+
+#: route_time_axis.cc:1193
+msgid "New Copy Playlist"
+msgstr ""
+
+#: route_time_axis.cc:1194 route_time_axis.cc:1247
+msgid "Name for new playlist:"
+msgstr ""
+
+#: route_time_axis.cc:1246
+msgid "New Playlist"
+msgstr ""
+
+#: route_time_axis.cc:1441
+msgid "The name \"%1\" is reserved for %2"
+msgstr ""
+
+#: route_time_axis.cc:1684
+msgid "New Copy..."
+msgstr ""
+
+#: route_time_axis.cc:1688
+msgid "New Take"
+msgstr ""
+
+#: route_time_axis.cc:1689
+msgid "Copy Take"
+msgstr ""
+
+#: route_time_axis.cc:1694
+msgid "Clear Current"
+msgstr ""
+
+#: route_time_axis.cc:1697
+msgid "Select from All..."
+msgstr ""
+
+#: route_time_axis.cc:1785
+msgid "Take: %1.%2"
+msgstr ""
+
+#: route_time_axis.cc:2190 selection.cc:1042 selection.cc:1096
+msgid "programming error: "
+msgstr ""
+
+#: route_time_axis.cc:2614
+msgid "Underlays"
+msgstr ""
+
+#: route_time_axis.cc:2617
+msgid "Remove \"%1\""
+msgstr ""
+
+#: route_time_axis.cc:2667 route_time_axis.cc:2704
+msgid "programming error: underlay reference pointer pairs are inconsistent!"
+msgstr ""
+
+#: route_time_axis.cc:2731 vca_master_strip.cc:203 vca_time_axis.cc:228
+msgid "After-fade listen (AFL)"
+msgstr ""
+
+#: route_time_axis.cc:2735 vca_master_strip.cc:207 vca_time_axis.cc:232
+msgid "Pre-fade listen (PFL)"
+msgstr ""
+
+#: route_ui.cc:169
+msgid "Mute this track"
+msgstr ""
+
+#: route_ui.cc:173
+msgid "Mute other (non-soloed) tracks"
+msgstr ""
+
+#: route_ui.cc:179
+msgid "Enable recording on this track"
+msgstr ""
+
+#: route_ui.cc:187
+msgid "make mixer strips show sends to this bus"
+msgstr ""
+
+#: route_ui.cc:192
+msgid "Monitor input"
+msgstr ""
+
+#: route_ui.cc:198
+msgid "Monitor playback"
+msgstr ""
+
+#: route_ui.cc:710
+msgid "Not connected to AudioEngine - cannot engage record"
+msgstr ""
+
+#: route_ui.cc:887
+msgid "Rec-Safe"
+msgstr ""
+
+#: route_ui.cc:892
+msgid "Step Entry"
+msgstr ""
+
+#: route_ui.cc:991
+msgid "Assign all tracks (prefader)"
+msgstr ""
+
+#: route_ui.cc:995
+msgid "Assign all tracks and buses (prefader)"
+msgstr ""
+
+#: route_ui.cc:999
+msgid "Assign all tracks (postfader)"
+msgstr ""
+
+#: route_ui.cc:1003
+msgid "Assign all tracks and buses (postfader)"
+msgstr ""
+
+#: route_ui.cc:1007
+msgid "Assign selected tracks (prefader)"
+msgstr ""
+
+#: route_ui.cc:1011
+msgid "Assign selected tracks and buses (prefader)"
+msgstr ""
+
+#: route_ui.cc:1014
+msgid "Assign selected tracks (postfader)"
+msgstr ""
+
+#: route_ui.cc:1018
+msgid "Assign selected tracks and buses (postfader)"
+msgstr ""
+
+#: route_ui.cc:1021
+msgid "Copy track/bus gains to sends"
+msgstr ""
+
+#: route_ui.cc:1022
+msgid "Set sends gain to -inf"
+msgstr ""
+
+#: route_ui.cc:1023
+msgid "Set sends gain to 0dB"
+msgstr ""
+
+#: route_ui.cc:1361
+msgid "Solo Isolate"
+msgstr ""
+
+#: route_ui.cc:1368
+msgid "Solo Safe"
+msgstr ""
+
+#: route_ui.cc:1390
+msgid "Pre Fader Sends"
+msgstr ""
+
+#: route_ui.cc:1396
+msgid "Post Fader Sends"
+msgstr ""
+
+#: route_ui.cc:1402
+msgid "Control Outs"
+msgstr ""
+
+#: route_ui.cc:1408
+msgid "Main Outs"
+msgstr ""
+
+#: route_ui.cc:1575
+msgid "Color Selection"
+msgstr ""
+
+#: route_ui.cc:1617
+msgid ""
+"The use of colons (':') is discouraged in track and bus names.\n"
+"Do you want to use this new name?"
+msgstr ""
+
+#: route_ui.cc:1621
+msgid "Use the new name"
+msgstr ""
+
+#: route_ui.cc:1622
+msgid "Re-edit the name"
+msgstr ""
+
+#: route_ui.cc:1635
+msgid "Rename Track"
+msgstr ""
+
+#: route_ui.cc:1637
+msgid "Rename Bus"
+msgstr ""
+
+#: route_ui.cc:1697
+msgid ": comment editor"
+msgstr ""
+
+#: route_ui.cc:1852
+msgid " latency"
+msgstr ""
+
+#: route_ui.cc:1892
+msgid "Cannot create route template directory %1"
+msgstr ""
+
+#: route_ui.cc:1898
+msgid "Save As Template"
+msgstr ""
+
+#: route_ui.cc:1899
+msgid "Template name:"
+msgstr ""
+
+#: route_ui.cc:2023
+msgid ""
+"Left-click to invert polarity of channel %1 of this track. Right-click to "
+"show menu."
+msgstr ""
+
+#: route_ui.cc:2025
+msgid "Click to show a menu of channels to invert polarity"
+msgstr ""
+
+#: save_as_dialog.cc:34
+msgid "Switch to newly-saved version"
+msgstr ""
+
+#: save_as_dialog.cc:35
+msgid "Copy media to new session"
+msgstr ""
+
+#: save_as_dialog.cc:36
+msgid "Copy external media into new session"
+msgstr ""
+
+#: save_as_dialog.cc:37
+msgid "Newly-saved session should be empty"
+msgstr ""
+
+#: save_as_dialog.cc:48
+msgid "Save as session name"
+msgstr ""
+
+#: save_as_dialog.cc:55
+msgid "Parent directory/folder"
+msgstr ""
+
+#: search_path_option.cc:35
+msgid "Select folder to search for media"
+msgstr ""
+
+#: search_path_option.cc:44
+msgid "Click to add a new location"
+msgstr ""
+
+#: search_path_option.cc:51
+msgid "the session folder"
+msgstr ""
+
+#: script_selector.cc:43
+msgid "<b>Type:</b>"
+msgstr ""
+
+#: script_selector.cc:49
+msgid "<b>Author:</b>"
+msgstr ""
+
+#: script_selector.cc:55
+msgid "<b>Description:</b>"
+msgstr ""
+
+#: script_selector.cc:131
+msgid "Select Script to unload"
+msgstr ""
+
+#: script_selector.cc:165
+msgid "<b>Name:</b>"
+msgstr ""
+
+#: script_selector.cc:172
+msgid "<b>Instance Parameters</b>"
+msgstr ""
+
+#: send_ui.cc:134
+msgid "Send "
+msgstr ""
+
+#: session_dialog.cc:71
+msgid "Session Setup"
+msgstr ""
+
+#: session_dialog.cc:76
+msgid "Advanced options ..."
+msgstr ""
+
+#: session_dialog.cc:163 session_dialog.cc:397
+msgid "Recent Sessions"
+msgstr ""
+
+#: session_dialog.cc:311
+msgid "Sample Rate"
+msgstr ""
+
+#: session_dialog.cc:312
+msgid "File Resolution"
+msgstr ""
+
+#: session_dialog.cc:313
+msgid "Last Modified"
+msgstr ""
+
+#: session_dialog.cc:338
+msgid "New Session"
+msgstr ""
+
+#: session_dialog.cc:379
+msgid "Check the website for more..."
+msgstr ""
+
+#: session_dialog.cc:382
+msgid "Click to open the program website in your web browser"
+msgstr ""
+
+#: session_dialog.cc:404
+msgid "Select session file"
+msgstr ""
+
+#: session_dialog.cc:417
+msgid "Other Sessions"
+msgstr ""
+
+#: session_dialog.cc:424
+msgid "Safe Mode: Disable all Plugins"
+msgstr ""
+
+#: session_dialog.cc:454
+msgid "Open"
+msgstr ""
+
+#: session_dialog.cc:521
+msgid "Session name:"
+msgstr ""
+
+#: session_dialog.cc:543
+msgid "Create session folder in:"
+msgstr ""
+
+#: session_dialog.cc:564
+msgid "Select folder for session"
+msgstr ""
+
+#: session_dialog.cc:591
+msgid "Use this template"
+msgstr ""
+
+#: session_dialog.cc:594
+msgid "no template"
+msgstr ""
+
+#: session_dialog.cc:746 session_dialog.cc:793
+msgid "32-bit float"
+msgstr ""
+
+#: session_dialog.cc:749 session_dialog.cc:796
+msgid "24-bit"
+msgstr ""
+
+#: session_dialog.cc:752 session_dialog.cc:799
+msgid "16-bit"
+msgstr ""
+
+#: session_dialog.cc:877 session_dialog.cc:878 session_dialog.cc:879
+msgid "channels"
+msgstr ""
+
+#: session_dialog.cc:893
+msgid "<b>Busses</b>"
+msgstr ""
+
+#: session_dialog.cc:894
+msgid "<b>Inputs</b>"
+msgstr ""
+
+#: session_dialog.cc:895
+msgid "<b>Outputs</b>"
+msgstr ""
+
+#: session_dialog.cc:903
+msgid "Create master bus"
+msgstr ""
+
+#: session_dialog.cc:913
+msgid "Automatically connect to physical inputs"
+msgstr ""
+
+#: session_dialog.cc:920 session_dialog.cc:979
+msgid "Use only"
+msgstr ""
+
+#: session_dialog.cc:973
+msgid "Automatically connect outputs"
+msgstr ""
+
+#: session_dialog.cc:995
+msgid "... to master bus"
+msgstr ""
+
+#: session_dialog.cc:1005
+msgid "... to physical outputs"
+msgstr ""
+
+#: session_import_dialog.cc:74
+msgid "Elements"
+msgstr ""
+
+#: session_import_dialog.cc:111
+msgid "Cannot load XML for session from %1"
+msgstr ""
+
+#: session_import_dialog.cc:128 session_import_dialog.cc:212
+msgid "Some elements had errors in them. Please see the log for details"
+msgstr ""
+
+#: session_import_dialog.cc:164
+msgid "Import from session"
+msgstr ""
+
+#: session_import_dialog.cc:228
+msgid "This will select all elements of this type!"
+msgstr ""
+
+#: session_metadata_dialog.cc:288
+msgid "EAN Check digit OK"
+msgstr ""
+
+#: session_metadata_dialog.cc:292
+msgid "EAN Check digit error"
+msgstr ""
+
+#: session_metadata_dialog.cc:292
+msgid "expected"
+msgstr ""
+
+#: session_metadata_dialog.cc:297
+msgid "EAN Length error"
+msgstr ""
+
+#: session_metadata_dialog.cc:426
+msgid "Field"
+msgstr ""
+
+#: session_metadata_dialog.cc:430
+msgid "Values (current value on top)"
+msgstr ""
+
+#: session_metadata_dialog.cc:644
+msgid "User"
+msgstr ""
+
+#: session_metadata_dialog.cc:652
+msgid "Email"
+msgstr ""
+
+#: session_metadata_dialog.cc:655
+msgid "Web"
+msgstr ""
+
+#: session_metadata_dialog.cc:658
+msgid "Organization"
+msgstr ""
+
+#: session_metadata_dialog.cc:661
+msgid "Country"
+msgstr ""
+
+#: session_metadata_dialog.cc:675
+msgid "Title"
+msgstr ""
+
+#: session_metadata_dialog.cc:678
+msgid "Track Number"
+msgstr ""
+
+#: session_metadata_dialog.cc:681
+msgid "Subtitle"
+msgstr ""
+
+#: session_metadata_dialog.cc:684
+msgid "Grouping"
+msgstr ""
+
+#: session_metadata_dialog.cc:687
+msgid "Artist"
+msgstr ""
+
+#: session_metadata_dialog.cc:690
+msgid "Genre"
+msgstr ""
+
+#: session_metadata_dialog.cc:693
+msgid "Comment"
+msgstr ""
+
+#: session_metadata_dialog.cc:696
+msgid "Copyright"
+msgstr ""
+
+#: session_metadata_dialog.cc:704 session_metadata_dialog.cc:709
+msgid "Album"
+msgstr ""
+
+#: session_metadata_dialog.cc:712
+msgid "Year"
+msgstr ""
+
+#: session_metadata_dialog.cc:715
+msgid "Album Artist"
+msgstr ""
+
+#: session_metadata_dialog.cc:718
+msgid "Total Tracks"
+msgstr ""
+
+#: session_metadata_dialog.cc:721
+msgid "Disc Subtitle"
+msgstr ""
+
+#: session_metadata_dialog.cc:724
+msgid "Disc Number"
+msgstr ""
+
+#: session_metadata_dialog.cc:727
+msgid "Total Discs"
+msgstr ""
+
+#: session_metadata_dialog.cc:730
+msgid "Compilation"
+msgstr ""
+
+#: session_metadata_dialog.cc:733
+msgid "ISRC"
+msgstr ""
+
+#: session_metadata_dialog.cc:736
+msgid "EAN barcode"
+msgstr ""
+
+#: session_metadata_dialog.cc:749
+msgid "People"
+msgstr ""
+
+#: session_metadata_dialog.cc:754
+msgid "Lyricist"
+msgstr ""
+
+#: session_metadata_dialog.cc:757
+msgid "Composer"
+msgstr ""
+
+#: session_metadata_dialog.cc:760
+msgid "Conductor"
+msgstr ""
+
+#: session_metadata_dialog.cc:763
+msgid "Remixer"
+msgstr ""
+
+#: session_metadata_dialog.cc:766
+msgid "Arranger"
+msgstr ""
+
+#: session_metadata_dialog.cc:769
+msgid "Engineer"
+msgstr ""
+
+#: session_metadata_dialog.cc:772
+msgid "Producer"
+msgstr ""
+
+#: session_metadata_dialog.cc:775
+msgid "DJ Mixer"
+msgstr ""
+
+#: session_metadata_dialog.cc:778
+msgid "Metadata|Mixer"
+msgstr ""
+
+#: session_metadata_dialog.cc:786
+msgid "School"
+msgstr ""
+
+#: session_metadata_dialog.cc:791
+msgid "Instructor"
+msgstr ""
+
+#: session_metadata_dialog.cc:794
+msgid "Course"
+msgstr ""
+
+#: session_metadata_dialog.cc:802
+msgid "Edit Session Metadata"
+msgstr ""
+
+#: session_metadata_dialog.cc:833
+msgid "Import session metadata"
+msgstr ""
+
+#: session_metadata_dialog.cc:854
+msgid "Choose session to import metadata from"
+msgstr ""
+
+#: session_metadata_dialog.cc:892
+msgid "This session file could not be read!"
+msgstr ""
+
+#: session_metadata_dialog.cc:902
+msgid ""
+"The session file didn't contain metadata!\n"
+"Maybe this is an old session format?"
+msgstr ""
+
+#: session_metadata_dialog.cc:921
+msgid "Import all from:"
+msgstr ""
+
+#: session_option_editor.cc:32
+msgid "Session Properties"
+msgstr ""
+
+#: session_option_editor.cc:41
+msgid "Timecode Settings"
+msgstr ""
+
+#: session_option_editor.cc:45
+msgid "Timecode frames-per-second"
+msgstr ""
+
+#: session_option_editor.cc:50
+msgid "23.976"
+msgstr ""
+
+#: session_option_editor.cc:51
+msgid "24"
+msgstr ""
+
+#: session_option_editor.cc:52
+msgid "24.975"
+msgstr ""
+
+#: session_option_editor.cc:53
+msgid "25"
+msgstr ""
+
+#: session_option_editor.cc:54
+msgid "29.97"
+msgstr ""
+
+#: session_option_editor.cc:55
+msgid "29.97 drop"
+msgstr ""
+
+#: session_option_editor.cc:56
+msgid "30"
+msgstr ""
+
+#: session_option_editor.cc:57
+msgid "30 drop"
+msgstr ""
+
+#: session_option_editor.cc:58
+msgid "59.94"
+msgstr ""
+
+#: session_option_editor.cc:59
+msgid "60"
+msgstr ""
+
+#: session_option_editor.cc:65
+msgid "Pull-up / pull-down"
+msgstr ""
+
+#: session_option_editor.cc:70
+msgid "4.1667 + 0.1%"
+msgstr ""
+
+#: session_option_editor.cc:71
+msgid "4.1667"
+msgstr ""
+
+#: session_option_editor.cc:72
+msgid "4.1667 - 0.1%"
+msgstr ""
+
+#: session_option_editor.cc:73
+msgid "0.1"
+msgstr ""
+
+#: session_option_editor.cc:74
+msgid "none"
+msgstr ""
+
+#: session_option_editor.cc:75
+msgid "-0.1"
+msgstr ""
+
+#: session_option_editor.cc:76
+msgid "-4.1667 + 0.1%"
+msgstr ""
+
+#: session_option_editor.cc:77
+msgid "-4.1667"
+msgstr ""
+
+#: session_option_editor.cc:78
+msgid "-4.1667 - 0.1%"
+msgstr ""
+
+#: session_option_editor.cc:84
+msgid ""
+"Use Video File's FPS Instead of Timecode Value for Timeline and Video "
+"Monitor."
+msgstr ""
+
+#: session_option_editor.cc:91
+msgid ""
+"Apply Pull-Up/Down to Video Timeline and Video Monitor (Unless using JACK-"
+"sync)."
+msgstr ""
+
+#: session_option_editor.cc:96
+msgid "Ext Timecode Offsets"
+msgstr ""
+
+#: session_option_editor.cc:100
+msgid "Slave Timecode offset"
+msgstr ""
+
+#: session_option_editor.cc:107
+msgid "The specified offset is added to the received timecode (MTC or LTC)."
+msgstr ""
+
+#: session_option_editor.cc:113
+msgid "Timecode Generator offset"
+msgstr ""
+
+#: session_option_editor.cc:120
+msgid ""
+"Specify an offset which is added to the generated timecode (so far only LTC)."
+msgstr ""
+
+#: session_option_editor.cc:124
+msgid "JACK Transport/Time Settings"
+msgstr ""
+
+#: session_option_editor.cc:128
+msgid ""
+"%1 is JACK Time Master (provides Bar|Beat|Tick and other information to JACK)"
+msgstr ""
+
+#: session_option_editor.cc:136
+msgid "destructive-xfade-seconds"
+msgstr ""
+
+#: session_option_editor.cc:137
+msgid "Destructive crossfade length"
+msgstr ""
+
+#: session_option_editor.cc:146
+msgid "Declick when transport starts and stops"
+msgstr ""
+
+#: session_option_editor.cc:153
+msgid "Declick when monitor state changes"
+msgstr ""
+
+#: session_option_editor.cc:160
+msgid "Region fades active"
+msgstr ""
+
+#: session_option_editor.cc:167
+msgid "Region fades visible"
+msgstr ""
+
+#: session_option_editor.cc:174 session_option_editor.cc:187
+#: session_option_editor.cc:208
+msgid "Media"
+msgstr ""
+
+#: session_option_editor.cc:174
+msgid "Audio file format"
+msgstr ""
+
+#: session_option_editor.cc:178
+msgid "Sample format"
+msgstr ""
+
+#: session_option_editor.cc:183
+msgid "32-bit floating point"
+msgstr ""
+
+#: session_option_editor.cc:184
+msgid "24-bit integer"
+msgstr ""
+
+#: session_option_editor.cc:185
+msgid "16-bit integer"
+msgstr ""
+
+#: session_option_editor.cc:191
+msgid "File type"
+msgstr ""
+
+#: session_option_editor.cc:196
+msgid "Broadcast WAVE (4GB size limit)"
+msgstr ""
+
+#: session_option_editor.cc:198
+msgid "Broadcast RF64"
+msgstr ""
+
+#: session_option_editor.cc:200
+msgid "WAVE (4GB size limit)"
+msgstr ""
+
+#: session_option_editor.cc:201
+msgid "WAVE-64"
+msgstr ""
+
+#: session_option_editor.cc:205
+msgid "RF64 (WAV compatible)"
+msgstr ""
+
+#: session_option_editor.cc:210 session_option_editor.cc:216
+#: session_option_editor.cc:223
+msgid "Files|Locations"
+msgstr ""
+
+#: session_option_editor.cc:210
+msgid "File locations"
+msgstr ""
+
+#: session_option_editor.cc:212
+msgid "Search for audio files in:"
+msgstr ""
+
+#: session_option_editor.cc:218
+msgid "Search for MIDI files in:"
+msgstr ""
+
+#: session_option_editor.cc:227 session_option_editor.cc:239
+#: session_option_editor.cc:249 session_option_editor.cc:260
+msgid "Filenames"
+msgstr ""
+
+#: session_option_editor.cc:227
+msgid "File Naming"
+msgstr ""
+
+#: session_option_editor.cc:233
+msgid "Prefix Track number"
+msgstr ""
+
+#: session_option_editor.cc:238
+msgid ""
+"Adds the current track number to the beginning of the recorded file name."
+msgstr ""
+
+#: session_option_editor.cc:243
+msgid "Prefix Take Name"
+msgstr ""
+
+#: session_option_editor.cc:248
+msgid "Adds the Take Name to the beginning of the recorded file name."
+msgstr ""
+
+#: session_option_editor.cc:253
+msgid "Take Name"
+msgstr ""
+
+#: session_option_editor.cc:266
+msgid ""
+"Track Input Monitoring automatically follows transport state (\"auto-input\")"
+msgstr ""
+
+#: session_option_editor.cc:273
+msgid "Use monitor section in this session"
+msgstr ""
+
+#: session_option_editor.cc:278 session_option_editor.cc:280
+#: session_option_editor.cc:287 session_option_editor.cc:294
+#: session_option_editor.cc:301 session_option_editor.cc:303
+#: session_option_editor.cc:310 session_option_editor.cc:317
+#: session_option_editor.cc:324 session_option_editor.cc:331
+#: session_option_editor.cc:333
+msgid "Meterbridge"
+msgstr ""
+
+#: session_option_editor.cc:278
+msgid "Route Display"
+msgstr ""
+
+#: session_option_editor.cc:282
+msgid "Show Midi Tracks"
+msgstr ""
+
+#: session_option_editor.cc:289
+msgid "Show Busses"
+msgstr ""
+
+#: session_option_editor.cc:296
+msgid "Include Master Bus"
+msgstr ""
+
+#: session_option_editor.cc:301
+msgid "Button Area"
+msgstr ""
+
+#: session_option_editor.cc:305
+msgid "Rec-enable Button"
+msgstr ""
+
+#: session_option_editor.cc:312
+msgid "Mute Button"
+msgstr ""
+
+#: session_option_editor.cc:319
+msgid "Solo Button"
+msgstr ""
+
+#: session_option_editor.cc:326
+msgid "Monitor Buttons"
+msgstr ""
+
+#: session_option_editor.cc:331
+msgid "Name Labels"
+msgstr ""
+
+#: session_option_editor.cc:335
+msgid "Track Name"
+msgstr ""
+
+#: session_option_editor.cc:346
+msgid "MIDI region copies are independent"
+msgstr ""
+
+#: session_option_editor.cc:353
+msgid ""
+"Policy for handling overlapping notes\n"
+" on the same MIDI channel"
+msgstr ""
+
+#: session_option_editor.cc:358
+msgid "never allow them"
+msgstr ""
+
+#: session_option_editor.cc:359
+msgid "don't do anything in particular"
+msgstr ""
+
+#: session_option_editor.cc:360
+msgid "replace any overlapped existing note"
+msgstr ""
+
+#: session_option_editor.cc:361
+msgid "shorten the overlapped existing note"
+msgstr ""
+
+#: session_option_editor.cc:362
+msgid "shorten the overlapping new note"
+msgstr ""
+
+#: session_option_editor.cc:363
+msgid "replace both overlapping notes with a single note"
+msgstr ""
+
+#: session_option_editor.cc:367
+msgid "Glue to bars and beats"
+msgstr ""
+
+#: session_option_editor.cc:371
+msgid "Glue new markers to bars and beats"
+msgstr ""
+
+#: session_option_editor.cc:378
+msgid "Glue new regions to bars and beats"
+msgstr ""
+
+#: session_option_editor.cc:383
+msgid "Defaults"
+msgstr ""
+
+#: session_option_editor.cc:385
+msgid "Use these settings as defaults"
+msgstr ""
+
+#: sfdb_ui.cc:90 sfdb_ui.cc:110 sfdb_ui.cc:119
+msgid "as new tracks"
+msgstr ""
+
+#: sfdb_ui.cc:92 sfdb_ui.cc:112
+msgid "to selected tracks"
+msgstr ""
+
+#: sfdb_ui.cc:94 sfdb_ui.cc:114
+msgid "to region list"
+msgstr ""
+
+#: sfdb_ui.cc:96 sfdb_ui.cc:116
+msgid "as new tape tracks"
+msgstr ""
+
+#: sfdb_ui.cc:100
+msgid "programming error: unknown import mode string %1"
+msgstr ""
+
+#: sfdb_ui.cc:127
+msgid "Auto-play"
+msgstr ""
+
+#: sfdb_ui.cc:135 sfdb_ui.cc:324
+msgid "<b>Sound File Information</b>"
+msgstr ""
+
+#: sfdb_ui.cc:147
+msgid "Timestamp:"
+msgstr ""
+
+#: sfdb_ui.cc:188 sfdb_ui.cc:659
+msgid "Tags:"
+msgstr ""
+
+#: sfdb_ui.cc:297
+msgid "<b>Midi File Information</b>"
+msgstr ""
+
+#: sfdb_ui.cc:530
+msgid "SoundFileBox: Could not tokenize string: "
+msgstr ""
+
+#: sfdb_ui.cc:550 sfdb_ui.cc:552
+msgid "Search"
+msgstr ""
+
+#: sfdb_ui.cc:581
+msgid "Audio and MIDI files"
+msgstr ""
+
+#: sfdb_ui.cc:584
+msgid "Audio files"
+msgstr ""
+
+#: sfdb_ui.cc:587
+msgid "MIDI files"
+msgstr ""
+
+#: sfdb_ui.cc:590 add_video_dialog.cc:124
+msgid "All files"
+msgstr ""
+
+#: sfdb_ui.cc:609 add_video_dialog.cc:247
+msgid "Browse Files"
+msgstr ""
+
+#: sfdb_ui.cc:638
+msgid "Paths"
+msgstr ""
+
+#: sfdb_ui.cc:647
+msgid "Search Tags"
+msgstr ""
+
+#: sfdb_ui.cc:664
+msgid "Sort:"
+msgstr ""
+
+#: sfdb_ui.cc:672
+msgid "Longest"
+msgstr ""
+
+#: sfdb_ui.cc:673
+msgid "Shortest"
+msgstr ""
+
+#: sfdb_ui.cc:674
+msgid "Newest"
+msgstr ""
+
+#: sfdb_ui.cc:675
+msgid "Oldest"
+msgstr ""
+
+#: sfdb_ui.cc:676
+msgid "Most downloaded"
+msgstr ""
+
+#: sfdb_ui.cc:677
+msgid "Least downloaded"
+msgstr ""
+
+#: sfdb_ui.cc:678
+msgid "Highest rated"
+msgstr ""
+
+#: sfdb_ui.cc:679
+msgid "Lowest rated"
+msgstr ""
+
+#: sfdb_ui.cc:684
+msgid "More"
+msgstr ""
+
+#: sfdb_ui.cc:688
+msgid "Similar"
+msgstr ""
+
+#: sfdb_ui.cc:700
+msgid "ID"
+msgstr ""
+
+#: sfdb_ui.cc:701 add_video_dialog.cc:84
+msgid "Filename"
+msgstr ""
+
+#: sfdb_ui.cc:703 time_fx_dialog.cc:154
+msgid "Duration"
+msgstr ""
+
+#: sfdb_ui.cc:704
+msgid "Size"
+msgstr ""
+
+#: sfdb_ui.cc:705
+msgid "Samplerate"
+msgstr ""
+
+#: sfdb_ui.cc:706
+msgid "License"
+msgstr ""
+
+#: sfdb_ui.cc:724
+msgid "Search Freesound"
+msgstr ""
+
+#: sfdb_ui.cc:741
+msgid "Press to import selected files"
+msgstr ""
+
+#: sfdb_ui.cc:742
+msgid "Press to close this window without importing any files"
+msgstr ""
+
+#: sfdb_ui.cc:937
+msgid "SoundFileBrowser: Could not tokenize string: "
+msgstr ""
+
+#: sfdb_ui.cc:1137
+msgid "%1 more page of 100 results available"
+msgid_plural "%1 more pages of 100 results available"
+msgstr[0] ""
+msgstr[1] ""
+
+#: sfdb_ui.cc:1142
+msgid "No more results available"
+msgstr ""
+
+#: sfdb_ui.cc:1206
+msgid "B"
+msgstr ""
+
+#: sfdb_ui.cc:1208
+msgid "kB"
+msgstr ""
+
+#: sfdb_ui.cc:1210 sfdb_ui.cc:1212
+msgid "MB"
+msgstr ""
+
+#: sfdb_ui.cc:1214
+msgid "GB"
+msgstr ""
+
+#: sfdb_ui.cc:1431 sfdb_ui.cc:1728 sfdb_ui.cc:1764 sfdb_ui.cc:1782
+msgid "one track per file"
+msgstr ""
+
+#: sfdb_ui.cc:1434 sfdb_ui.cc:1765 sfdb_ui.cc:1783
+msgid "one track per channel"
+msgstr ""
+
+#: sfdb_ui.cc:1442 sfdb_ui.cc:1767 sfdb_ui.cc:1784
+msgid "sequence files"
+msgstr ""
+
+#: sfdb_ui.cc:1445 sfdb_ui.cc:1772
+msgid "all files in one track"
+msgstr ""
+
+#: sfdb_ui.cc:1446 sfdb_ui.cc:1766
+msgid "merge files"
+msgstr ""
+
+#: sfdb_ui.cc:1452 sfdb_ui.cc:1769
+msgid "one region per file"
+msgstr ""
+
+#: sfdb_ui.cc:1455 sfdb_ui.cc:1770
+msgid "one region per channel"
+msgstr ""
+
+#: sfdb_ui.cc:1460 sfdb_ui.cc:1771 sfdb_ui.cc:1785
+msgid "all files in one region"
+msgstr ""
+
+#: sfdb_ui.cc:1527
+msgid ""
+"One or more of the selected files\n"
+"cannot be used by %1"
+msgstr ""
+
+#: sfdb_ui.cc:1671
+msgid "Copy files to session"
+msgstr ""
+
+#: sfdb_ui.cc:1686 sfdb_ui.cc:1825
+msgid "file timestamp"
+msgstr ""
+
+#: sfdb_ui.cc:1687 sfdb_ui.cc:1827
+msgid "edit point"
+msgstr ""
+
+#: sfdb_ui.cc:1688 sfdb_ui.cc:1829
+msgid "playhead"
+msgstr ""
+
+#: sfdb_ui.cc:1689
+msgid "session start"
+msgstr ""
+
+#: sfdb_ui.cc:1695
+msgid "<b>Add files ...</b>"
+msgstr ""
+
+#: sfdb_ui.cc:1700
+msgid "<b>Insert at</b>"
+msgstr ""
+
+#: sfdb_ui.cc:1705
+msgid "<b>Mapping</b>"
+msgstr ""
+
+#: sfdb_ui.cc:1710
+msgid "<b>Conversion quality</b>"
+msgstr ""
+
+#: sfdb_ui.cc:1715
+msgid "<b>Instrument</b>"
+msgstr ""
+
+#: sfdb_ui.cc:1734 sfdb_ui.cc:1841
+msgid "Best"
+msgstr ""
+
+#: sfdb_ui.cc:1735 sfdb_ui.cc:1843
+msgid "Good"
+msgstr ""
+
+#: sfdb_ui.cc:1736 sfdb_ui.cc:1845
+msgid "Quick"
+msgstr ""
+
+#: sfdb_ui.cc:1738
+msgid "Fastest"
+msgstr ""
+
+#: shuttle_control.cc:64
+msgid "Shuttle speed control (Context-click for options)"
+msgstr ""
+
+#: shuttle_control.cc:202 time_fx_dialog.cc:164
+msgid "Percent"
+msgstr ""
+
+#: shuttle_control.cc:210
+msgid "Units"
+msgstr ""
+
+#: shuttle_control.cc:216 shuttle_control.cc:679
+msgid "Sprung"
+msgstr ""
+
+#: shuttle_control.cc:220 shuttle_control.cc:682
+msgid "Wheel"
+msgstr ""
+
+#: shuttle_control.cc:254
+msgid "Maximum speed"
+msgstr ""
+
+#: shuttle_control.cc:257
+msgid "Reset to 100%"
+msgstr ""
+
+#: shuttle_control.cc:641
+msgid "Playing"
+msgstr ""
+
+#: shuttle_control.cc:656
+#, c-format
+msgid "<<< %+d semitones"
+msgstr ""
+
+#: shuttle_control.cc:658
+#, c-format
+msgid ">>> %+d semitones"
+msgstr ""
+
+#: soundcloud_export_selector.cc:44
+msgid "User Email"
+msgstr ""
+
+#: soundcloud_export_selector.cc:45
+msgid "Password"
+msgstr ""
+
+#: soundcloud_export_selector.cc:46
+msgid "Make files public"
+msgstr ""
+
+#: soundcloud_export_selector.cc:47
+msgid "Open uploaded files in browser"
+msgstr ""
+
+#: soundcloud_export_selector.cc:48
+msgid "Make files downloadable"
+msgstr ""
+
+#: soundcloud_export_selector.cc:107
+msgid "%1: %2 of %3 bytes uploaded"
+msgstr ""
+
+#: splash.cc:78
+msgid "%1 loading ..."
+msgstr ""
+
+#: speaker_dialog.cc:40
+msgid "Add Speaker"
+msgstr ""
+
+#: speaker_dialog.cc:41
+msgid "Remove Speaker"
+msgstr ""
+
+#: speaker_dialog.cc:63
+msgid "Azimuth:"
+msgstr ""
+
+#: startup.cc:71
+msgid ""
+"Use an external mixer or the hardware mixer of your audio interface.\n"
+"%1 will play NO role in monitoring"
+msgstr ""
+
+#: startup.cc:73
+msgid "Ask %1 to play back material as it is being recorded"
+msgstr ""
+
+#: startup.cc:146
+msgid ""
+"<span size=\"larger\">%1 is a digital audio workstation. You can use it to "
+"record, edit and mix multi-track audio. You can produce your own CDs, mix "
+"video soundtracks, or experiment with new ideas about music and sound. \n"
+"\n"
+"There are a few things that need to be configured before you start using the "
+"program.</span> "
+msgstr ""
+
+#: startup.cc:172
+msgid "Welcome to %1"
+msgstr ""
+
+#: startup.cc:195
+msgid "Default folder for %1 sessions"
+msgstr ""
+
+#: startup.cc:201
+msgid ""
+"Each project that you work on with %1 has its own folder.\n"
+"These can require a lot of disk space if you are recording audio.\n"
+"\n"
+"Where would you like new %1 sessions to be stored by default?\n"
+"\n"
+"<i>(You can put new sessions anywhere, this is just a default)</i>"
+msgstr ""
+
+#: startup.cc:224
+msgid "Default folder for new sessions"
+msgstr ""
+
+#: startup.cc:245
+msgid ""
+"While recording instruments or vocals, you probably want to listen to the\n"
+"signal as well as record it. This is called \"monitoring\". There are\n"
+"different ways to do this depending on the equipment you have and the\n"
+"configuration of that equipment. The two most common are presented here.\n"
+"Please choose whichever one is right for your setup.\n"
+"\n"
+"<i>(You can change this preference at any time, via the Preferences dialog)</"
+"i>\n"
+"\n"
+"<i>If you do not understand what this is about, just accept the default.</i>"
+msgstr ""
+
+#: startup.cc:266
+msgid "Monitoring Choices"
+msgstr ""
+
+#: startup.cc:289
+msgid "Use a Master bus directly"
+msgstr ""
+
+#: startup.cc:291
+msgid ""
+"Connect the Master bus directly to your hardware outputs. This is preferable "
+"for simple usage."
+msgstr ""
+
+#: startup.cc:300
+msgid "Use an additional Monitor bus"
+msgstr ""
+
+#: startup.cc:303
+msgid ""
+"Use a Monitor bus between Master bus and hardware outputs for \n"
+"greater control in monitoring without affecting the mix."
+msgstr ""
+
+#: startup.cc:325
+msgid ""
+"<i>You can change this preference at any time via the Preferences dialog.\n"
+"You can also add or remove the monitor section to/from any session.</i>\n"
+"\n"
+"<i>If you do not understand what this is about, just accept the default.</i>"
+msgstr ""
+
+#: startup.cc:336
+msgid "Monitor Section"
+msgstr ""
+
+#: step_entry.cc:59
+msgid "Step Entry: %1"
+msgstr ""
+
+#: step_entry.cc:64
+msgid ">beat"
+msgstr ""
+
+#: step_entry.cc:65
+msgid ">bar"
+msgstr ""
+
+#: step_entry.cc:66
+msgid ">EP"
+msgstr ""
+
+#: step_entry.cc:67
+msgid "sustain"
+msgstr ""
+
+#: step_entry.cc:68
+msgid "rest"
+msgstr ""
+
+#: step_entry.cc:69
+msgid "g-rest"
+msgstr ""
+
+#: step_entry.cc:70
+msgid "back"
+msgstr ""
+
+#: step_entry.cc:191
+msgid "Set note length to a whole note"
+msgstr ""
+
+#: step_entry.cc:192
+msgid "Set note length to a half note"
+msgstr ""
+
+#: step_entry.cc:193
+msgid "Set note length to a quarter note"
+msgstr ""
+
+#: step_entry.cc:194
+msgid "Set note length to a eighth note"
+msgstr ""
+
+#: step_entry.cc:195
+msgid "Set note length to a sixteenth note"
+msgstr ""
+
+#: step_entry.cc:196
+msgid "Set note length to a thirty-second note"
+msgstr ""
+
+#: step_entry.cc:197
+msgid "Set note length to a sixty-fourth note"
+msgstr ""
+
+#: step_entry.cc:276
+msgid "Set volume (velocity) to pianississimo"
+msgstr ""
+
+#: step_entry.cc:277
+msgid "Set volume (velocity) to pianissimo"
+msgstr ""
+
+#: step_entry.cc:278
+msgid "Set volume (velocity) to piano"
+msgstr ""
+
+#: step_entry.cc:279
+msgid "Set volume (velocity) to mezzo-piano"
+msgstr ""
+
+#: step_entry.cc:280
+msgid "Set volume (velocity) to mezzo-forte"
+msgstr ""
+
+#: step_entry.cc:281
+msgid "Set volume (velocity) to forte"
+msgstr ""
+
+#: step_entry.cc:282
+msgid "Set volume (velocity) to fortissimo"
+msgstr ""
+
+#: step_entry.cc:283
+msgid "Set volume (velocity) to fortississimo"
+msgstr ""
+
+#: step_entry.cc:331
+msgid "Stack inserted notes to form a chord"
+msgstr ""
+
+#: step_entry.cc:332
+msgid "Extend selected notes by note length"
+msgstr ""
+
+#: step_entry.cc:333
+msgid "Use undotted note lengths"
+msgstr ""
+
+#: step_entry.cc:334
+msgid "Use dotted (* 1.5) note lengths"
+msgstr ""
+
+#: step_entry.cc:335
+msgid "Use double-dotted (* 1.75) note lengths"
+msgstr ""
+
+#: step_entry.cc:336
+msgid "Use triple-dotted (* 1.875) note lengths"
+msgstr ""
+
+#: step_entry.cc:337
+msgid "Insert a note-length's rest"
+msgstr ""
+
+#: step_entry.cc:338
+msgid "Insert a grid-unit's rest"
+msgstr ""
+
+#: step_entry.cc:339
+msgid "Insert a rest until the next beat"
+msgstr ""
+
+#: step_entry.cc:340
+msgid "Insert a rest until the next bar"
+msgstr ""
+
+#: step_entry.cc:341
+msgid "Insert a bank change message"
+msgstr ""
+
+#: step_entry.cc:342
+msgid "Insert a program change message"
+msgstr ""
+
+#: step_entry.cc:343 step_entry.cc:645
+msgid "Move Insert Position Back by Note Length"
+msgstr ""
+
+#: step_entry.cc:344 step_entry.cc:643
+msgid "Move Insert Position to Edit Point"
+msgstr ""
+
+#: step_entry.cc:401
+msgid "1/Note"
+msgstr ""
+
+#: step_entry.cc:415
+msgid "Octave"
+msgstr ""
+
+#: step_entry.cc:592
+msgid "Insert Note A"
+msgstr ""
+
+#: step_entry.cc:593
+msgid "Insert Note A-sharp"
+msgstr ""
+
+#: step_entry.cc:594
+msgid "Insert Note B"
+msgstr ""
+
+#: step_entry.cc:595
+msgid "Insert Note C"
+msgstr ""
+
+#: step_entry.cc:596
+msgid "Insert Note C-sharp"
+msgstr ""
+
+#: step_entry.cc:597
+msgid "Insert Note D"
+msgstr ""
+
+#: step_entry.cc:598
+msgid "Insert Note D-sharp"
+msgstr ""
+
+#: step_entry.cc:599
+msgid "Insert Note E"
+msgstr ""
+
+#: step_entry.cc:600
+msgid "Insert Note F"
+msgstr ""
+
+#: step_entry.cc:601
+msgid "Insert Note F-sharp"
+msgstr ""
+
+#: step_entry.cc:602
+msgid "Insert Note G"
+msgstr ""
+
+#: step_entry.cc:603
+msgid "Insert Note G-sharp"
+msgstr ""
+
+#: step_entry.cc:605
+msgid "Insert a Note-length Rest"
+msgstr ""
+
+#: step_entry.cc:606
+msgid "Insert a Snap-length Rest"
+msgstr ""
+
+#: step_entry.cc:608 step_entry.cc:609
+msgid "Move to next octave"
+msgstr ""
+
+#: step_entry.cc:611
+msgid "Move to Next Note Length"
+msgstr ""
+
+#: step_entry.cc:612
+msgid "Move to Previous Note Length"
+msgstr ""
+
+#: step_entry.cc:614
+msgid "Increase Note Length"
+msgstr ""
+
+#: step_entry.cc:615
+msgid "Decrease Note Length"
+msgstr ""
+
+#: step_entry.cc:617
+msgid "Move to Next Note Velocity"
+msgstr ""
+
+#: step_entry.cc:618
+msgid "Move to Previous Note Velocity"
+msgstr ""
+
+#: step_entry.cc:620
+msgid "Increase Note Velocity"
+msgstr ""
+
+#: step_entry.cc:621
+msgid "Decrease Note Velocity"
+msgstr ""
+
+#: step_entry.cc:623
+msgid "Switch to the 1st octave"
+msgstr ""
+
+#: step_entry.cc:624
+msgid "Switch to the 2nd octave"
+msgstr ""
+
+#: step_entry.cc:625
+msgid "Switch to the 3rd octave"
+msgstr ""
+
+#: step_entry.cc:626
+msgid "Switch to the 4th octave"
+msgstr ""
+
+#: step_entry.cc:627
+msgid "Switch to the 5th octave"
+msgstr ""
+
+#: step_entry.cc:628
+msgid "Switch to the 6th octave"
+msgstr ""
+
+#: step_entry.cc:629
+msgid "Switch to the 7th octave"
+msgstr ""
+
+#: step_entry.cc:630
+msgid "Switch to the 8th octave"
+msgstr ""
+
+#: step_entry.cc:631
+msgid "Switch to the 9th octave"
+msgstr ""
+
+#: step_entry.cc:632
+msgid "Switch to the 10th octave"
+msgstr ""
+
+#: step_entry.cc:633
+msgid "Switch to the 11th octave"
+msgstr ""
+
+#: step_entry.cc:635
+msgid "Toggle Triple Notes"
+msgstr ""
+
+#: step_entry.cc:638
+msgid "Toggle Chord Entry"
+msgstr ""
+
+#: step_entry.cc:640
+msgid "Sustain Selected Notes by Note Length"
+msgstr ""
+
+#: step_entry.cc:650
+msgid "Set Note Length to Whole"
+msgstr ""
+
+#: step_entry.cc:652
+msgid "Set Note Length to 1/2"
+msgstr ""
+
+#: step_entry.cc:654
+msgid "Set Note Length to 1/3"
+msgstr ""
+
+#: step_entry.cc:656
+msgid "Set Note Length to 1/4"
+msgstr ""
+
+#: step_entry.cc:658
+msgid "Set Note Length to 1/8"
+msgstr ""
+
+#: step_entry.cc:660
+msgid "Set Note Length to 1/16"
+msgstr ""
+
+#: step_entry.cc:662
+msgid "Set Note Length to 1/32"
+msgstr ""
+
+#: step_entry.cc:664
+msgid "Set Note Length to 1/64"
+msgstr ""
+
+#: step_entry.cc:669
+msgid "Set Note Velocity to Pianississimo"
+msgstr ""
+
+#: step_entry.cc:671
+msgid "Set Note Velocity to Pianissimo"
+msgstr ""
+
+#: step_entry.cc:673
+msgid "Set Note Velocity to Piano"
+msgstr ""
+
+#: step_entry.cc:675
+msgid "Set Note Velocity to Mezzo-Piano"
+msgstr ""
+
+#: step_entry.cc:677
+msgid "Set Note Velocity to Mezzo-Forte"
+msgstr ""
+
+#: step_entry.cc:679
+msgid "Set Note Velocity to Forte"
+msgstr ""
+
+#: step_entry.cc:681 step_entry.cc:683
+msgid "Set Note Velocity to Fortississimo"
+msgstr ""
+
+#: step_entry.cc:688
+msgid "No Dotted Notes"
+msgstr ""
+
+#: step_entry.cc:689
+msgid "Toggled Dotted Notes"
+msgstr ""
+
+#: step_entry.cc:690
+msgid "Toggled Double-Dotted Notes"
+msgstr ""
+
+#: step_entry.cc:691
+msgid "Toggled Triple-Dotted Notes"
+msgstr ""
+
+#: stereo_panner.cc:129
+#, c-format
+msgid "L:%3d R:%3d Width:%d%%"
+msgstr ""
+
+#: stereo_panner.cc:272
+msgid "Panner|M"
+msgstr ""
+
+#: stereo_panner_editor.cc:37
+msgid "Stereo Panner"
+msgstr ""
+
+#: stereo_panner_editor.cc:51
+msgid "Width"
+msgstr ""
+
+#: strip_silence_dialog.cc:44
+msgid "Strip Silence"
+msgstr ""
+
+#: strip_silence_dialog.cc:65
+msgid "Threshold"
+msgstr ""
+
+#: strip_silence_dialog.cc:76
+msgid "Minimum length"
+msgstr ""
+
+#: strip_silence_dialog.cc:84
+msgid "Fade length"
+msgstr ""
+
+#: strip_silence_dialog.cc:111 strip_silence_dialog.cc:298
+msgid "Analyzing"
+msgstr ""
+
+#: tempo_dialog.cc:43 tempo_dialog.cc:60
+msgid "bar:"
+msgstr ""
+
+#: tempo_dialog.cc:44 tempo_dialog.cc:61
+msgid "beat:"
+msgstr ""
+
+#: tempo_dialog.cc:45 tempo_dialog.cc:62
+msgid "Pulse note"
+msgstr ""
+
+#: tempo_dialog.cc:46 tempo_dialog.cc:63
+msgid "Tap tempo"
+msgstr ""
+
+#: tempo_dialog.cc:81 tempo_dialog.cc:82 tempo_dialog.cc:448
+#: tempo_dialog.cc:449
+msgid "whole"
+msgstr ""
+
+#: tempo_dialog.cc:83 tempo_dialog.cc:84 tempo_dialog.cc:450
+#: tempo_dialog.cc:451
+msgid "second"
+msgstr ""
+
+#: tempo_dialog.cc:85 tempo_dialog.cc:86 tempo_dialog.cc:452
+#: tempo_dialog.cc:453
+msgid "third"
+msgstr ""
+
+#: tempo_dialog.cc:87 tempo_dialog.cc:88 tempo_dialog.cc:454
+#: tempo_dialog.cc:455
+msgid "quarter"
+msgstr ""
+
+#: tempo_dialog.cc:89 tempo_dialog.cc:90 tempo_dialog.cc:456
+#: tempo_dialog.cc:457
+msgid "eighth"
+msgstr ""
+
+#: tempo_dialog.cc:91 tempo_dialog.cc:92 tempo_dialog.cc:458
+#: tempo_dialog.cc:459
+msgid "sixteenth"
+msgstr ""
+
+#: tempo_dialog.cc:93 tempo_dialog.cc:94 tempo_dialog.cc:460
+#: tempo_dialog.cc:461
+msgid "thirty-second"
+msgstr ""
+
+#: tempo_dialog.cc:95 tempo_dialog.cc:96 tempo_dialog.cc:462
+#: tempo_dialog.cc:463
+msgid "sixty-fourth"
+msgstr ""
+
+#: tempo_dialog.cc:97 tempo_dialog.cc:98 tempo_dialog.cc:464
+#: tempo_dialog.cc:465
+msgid "one-hundred-twenty-eighth"
+msgstr ""
+
+#: tempo_dialog.cc:115 tempo_dialog.cc:116
+msgid "ramped"
+msgstr ""
+
+#: tempo_dialog.cc:117 tempo_dialog.cc:118
+msgid "constant"
+msgstr ""
+
+#: tempo_dialog.cc:133 tempo_dialog.cc:134 tempo_dialog.cc:482
+#: tempo_dialog.cc:483
+msgid "music"
+msgstr ""
+
+#: tempo_dialog.cc:161
+msgid "Beats per minute:"
+msgstr ""
+
+#: tempo_dialog.cc:195
+msgid "Tempo begins at"
+msgstr ""
+
+#: tempo_dialog.cc:201
+msgid "Lock Style:"
+msgstr ""
+
+#: tempo_dialog.cc:209
+msgid "Tempo Type:"
+msgstr ""
+
+#: tempo_dialog.cc:321
+msgid "incomprehensible pulse note type (%1)"
+msgstr ""
+
+#: tempo_dialog.cc:334
+msgid "incomprehensible tempo type (%1)"
+msgstr ""
+
+#: tempo_dialog.cc:347
+msgid "incomprehensible lock style (%1)"
+msgstr ""
+
+#: tempo_dialog.cc:498
+msgid "Note value:"
+msgstr ""
+
+#: tempo_dialog.cc:499
+msgid "Lock style:"
+msgstr ""
+
+#: tempo_dialog.cc:500
+msgid "Beats per bar:"
+msgstr ""
+
+#: tempo_dialog.cc:514
+msgid "Meter begins at bar:"
+msgstr ""
+
+#: tempo_dialog.cc:638
+msgid "incomprehensible meter note type (%1)"
+msgstr ""
+
+#: tempo_dialog.cc:651
+msgid "incomprehensible meter lock style (%1)"
+msgstr ""
+
+#: theme_manager.cc:53
+msgid "Draw \"flat\" buttons"
+msgstr ""
+
+#: theme_manager.cc:54
+msgid "Blink Rec-Arm buttons"
+msgstr ""
+
+#: theme_manager.cc:55
+msgid "Color regions using their track's color"
+msgstr ""
+
+#: theme_manager.cc:56
+msgid "Show waveform clipping"
+msgstr ""
+
+#: theme_manager.cc:58
+msgid "Waveforms color gradient depth"
+msgstr ""
+
+#: theme_manager.cc:60
+msgid "Timeline item gradient depth"
+msgstr ""
+
+#: theme_manager.cc:61
+msgid "All floating windows are dialogs"
+msgstr ""
+
+#: theme_manager.cc:62
+msgid "Transient windows follow front window."
+msgstr ""
+
+#: theme_manager.cc:63
+msgid "Float detached monitor-section window"
+msgstr ""
+
+#: theme_manager.cc:64
+msgid "Icon Set"
+msgstr ""
+
+#: theme_manager.cc:132
+msgid ""
+"Mark all floating windows to be type \"Dialog\" rather than using \"Utility"
+"\" for some.\n"
+"This may help with some window managers. This requires a restart of %1 to "
+"take effect"
+msgstr ""
+
+#: theme_manager.cc:136
+msgid ""
+"Make transient windows follow the front window when toggling between the "
+"editor and mixer.\n"
+"This requires a restart of %1 to take effect"
+msgstr ""
+
+#: theme_manager.cc:139
+msgid ""
+"When detaching the monitoring section, mark it as \"Utility\" window to stay "
+"in front.\n"
+"This requires a restart of %1 to take effect"
+msgstr ""
+
+#: time_axis_view.cc:148
+msgid "Track/Bus name (double click to edit)"
+msgstr ""
+
+#: time_axis_view_item.cc:326
+msgid "new duration %1 frame is out of bounds for %2"
+msgid_plural "new duration of %1 frames is out of bounds for %2"
+msgstr[0] ""
+msgstr[1] ""
+
+#: time_fx_dialog.cc:60
+msgid "Quick but Ugly"
+msgstr ""
+
+#: time_fx_dialog.cc:61
+msgid "Skip Anti-aliasing"
+msgstr ""
+
+#: time_fx_dialog.cc:62
+msgid "Contents"
+msgstr ""
+
+#: time_fx_dialog.cc:63
+msgid "Minimize time distortion"
+msgstr ""
+
+#: time_fx_dialog.cc:64
+msgid "Preserve Formants"
+msgstr ""
+
+#: time_fx_dialog.cc:81
+msgid "TimeFXDialog"
+msgstr ""
+
+#: time_fx_dialog.cc:84
+msgid "Pitch Shift Audio"
+msgstr ""
+
+#: time_fx_dialog.cc:86
+msgid "Time Stretch Audio"
+msgstr ""
+
+#: time_fx_dialog.cc:114 transpose_dialog.cc:41
+msgid "Octaves:"
+msgstr ""
+
+#: time_fx_dialog.cc:119 transpose_dialog.cc:46
+msgid "Semitones:"
+msgstr ""
+
+#: time_fx_dialog.cc:124
+msgid "Cents:"
+msgstr ""
+
+#: time_fx_dialog.cc:132
+msgid "Time|Shift"
+msgstr ""
+
+#: time_fx_dialog.cc:184 time_fx_dialog.cc:188
+msgid "TimeFXButton"
+msgstr ""
+
+#: time_fx_dialog.cc:193
+msgid "Stretch/Shrink"
+msgstr ""
+
+#: time_fx_dialog.cc:203
+msgid "<b>Progress</b>"
+msgstr ""
+
+#: time_info_box.cc:118
+msgid "Start recording at auto-punch start"
+msgstr ""
+
+#: time_info_box.cc:119
+msgid "Stop recording at auto-punch end"
+msgstr ""
+
+#: time_selection.cc:40
+msgid "programming error: request for non-existent audio range (%1)!"
+msgstr ""
+
+#: transform_dialog.cc:39
+msgid "this note's"
+msgstr ""
+
+#: transform_dialog.cc:40
+msgid "the previous note's"
+msgstr ""
+
+#: transform_dialog.cc:41
+msgid "this note's index"
+msgstr ""
+
+#: transform_dialog.cc:42
+msgid "the number of notes"
+msgstr ""
+
+#: transform_dialog.cc:43
+msgid "exactly"
+msgstr ""
+
+#: transform_dialog.cc:44
+msgid "a random number from"
+msgstr ""
+
+#: transform_dialog.cc:55
+msgid "equal steps from"
+msgstr ""
+
+#: transform_dialog.cc:58
+msgid "note number"
+msgstr ""
+
+#: transform_dialog.cc:59
+msgid "velocity"
+msgstr ""
+
+#: transform_dialog.cc:60
+msgid "start time"
+msgstr ""
+
+#: transform_dialog.cc:61
+msgid "length"
+msgstr ""
+
+#: transform_dialog.cc:82 transform_dialog.cc:113
+msgid "Transform"
+msgstr ""
+
+#: transform_dialog.cc:91
+msgid "Set "
+msgstr ""
+
+#: transpose_dialog.cc:30
+msgid "Transpose MIDI"
+msgstr ""
+
+#: transpose_dialog.cc:55
+msgid "Transpose"
+msgstr ""
+
+#: ui_config.cc:234 ui_config.cc:422
+msgid "Loading default ui configuration file %1"
+msgstr ""
+
+#: ui_config.cc:237 ui_config.cc:425
+msgid "cannot read default ui configuration file \"%1\""
+msgstr ""
+
+#: ui_config.cc:240 ui_config.cc:430
+msgid "default ui configuration file \"%1\" not loaded successfully."
+msgstr ""
+
+#: ui_config.cc:248
+msgid "Could not find default UI configuration file %1"
+msgstr ""
+
+#: ui_config.cc:289
+msgid "Loading color file %1"
+msgstr ""
+
+#: ui_config.cc:292
+msgid "cannot read color file \"%1\""
+msgstr ""
+
+#: ui_config.cc:297
+msgid "color file \"%1\" not loaded successfully."
+msgstr ""
+
+#: ui_config.cc:325
+msgid "Color file for %1 not found along %2"
+msgstr ""
+
+#: ui_config.cc:403 ui_config.cc:486
+msgid "Color file %1 not saved"
+msgstr ""
+
+#: ui_config.cc:439
+msgid "Loading user ui configuration file %1"
+msgstr ""
+
+#: ui_config.cc:442
+msgid "cannot read ui configuration file \"%1\""
+msgstr ""
+
+#: ui_config.cc:447
+msgid "user ui configuration file \"%1\" not loaded successfully."
+msgstr ""
+
+#: ui_config.cc:455
+msgid "could not find any ui configuration file, canvas will look broken."
+msgstr ""
+
+#: ui_config.cc:476
+msgid "Config file %1 not saved"
+msgstr ""
+
+#: ui_config.cc:720
+msgid "Color %1 not found"
+msgstr ""
+
+#: ui_config.cc:790
+msgid "Unable to find UI style file %1 in search path %2. %3 will look strange"
+msgstr ""
+
+#: utils.cc:118 utils.cc:161
+msgid "bad XPM header %1"
+msgstr ""
+
+#: utils.cc:365
+msgid "cannot find XPM file for %1"
+msgstr ""
+
+#: utils.cc:418 utils.cc:448 utils.cc:468
+msgid "default"
+msgstr ""
+
+#: utils.cc:469
+msgid "icon \"%1\" not found for icon set \"%2\", fallback to default"
+msgstr ""
+
+#: utils.cc:476
+msgid "cannot find icon image for %1 using %2"
+msgstr ""
+
+#: utils.cc:493 utils.cc:509
+msgid "Caught exception while loading icon named %1"
+msgstr ""
+
+#: utils.cc:759
+msgid "Overwrite"
+msgstr ""
+
+#: vca_master_strip.cc:74 vca_time_axis.cc:49
+msgid "Solo slaves"
+msgstr ""
+
+#: vca_master_strip.cc:79 vca_time_axis.cc:55
+msgid "Mute slaves"
+msgstr ""
+
+#: vca_master_strip.cc:83
+msgid "Hide this VCA strip"
+msgstr ""
+
+#: vca_master_strip.cc:108 vca_master_strip.cc:418
+msgid "Click to show slaves only"
+msgstr ""
+
+#: vca_master_strip.cc:293
+msgid "A"
+msgstr ""
+
+#: vca_master_strip.cc:300
+msgid "S"
+msgstr ""
+
+#: vca_master_strip.cc:398
+msgid "Drop All Slaves"
+msgstr ""
+
+#: vca_master_strip.cc:421
+msgid "Click to show normal mixer"
+msgstr ""
+
+#: add_video_dialog.cc:55
+msgid "Set Video Track"
+msgstr ""
+
+#: add_video_dialog.cc:63
+msgid "Open Video Monitor Window"
+msgstr ""
+
+#: add_video_dialog.cc:64
+msgid "Adjust Session Framerate to Match Video Framerate"
+msgstr ""
+
+#: add_video_dialog.cc:66
+msgid "Reload docroot"
+msgstr ""
+
+#: add_video_dialog.cc:121
+msgid "Video files"
+msgstr ""
+
+#: add_video_dialog.cc:150
+msgid "<b>Video Information</b>"
+msgstr ""
+
+#: add_video_dialog.cc:153
+msgid "Start:"
+msgstr ""
+
+#: add_video_dialog.cc:159
+msgid "Frame rate:"
+msgstr ""
+
+#: add_video_dialog.cc:162
+msgid "Aspect Ratio:"
+msgstr ""
+
+#: add_video_dialog.cc:245
+msgid "VideoServerIndex"
+msgstr ""
+
+#: add_video_dialog.cc:676
+msgid " %1 fps"
+msgstr ""
+
+#: vca_time_axis.cc:60
+msgid "D"
+msgstr ""
+
+#: vca_time_axis.cc:61
+msgid "Unassign all slaves"
+msgstr ""
+
+#: vca_time_axis.cc:65
+msgid "V"
+msgstr ""
+
+#: vca_time_axis.cc:66
+msgid "Show only slaves"
+msgstr ""
+
+#: video_timeline.cc:473
+msgid ""
+"Parsing video file info failed. Is the Video Server running? Is the file "
+"readable by the Video Server? Does the docroot match? Is it a video file?"
+msgstr ""
+
+#: video_timeline.cc:511
+msgid ""
+"Failed to set session-framerate: '%1' does not have a corresponding option "
+"setting in %2."
+msgstr ""
+
+#: video_timeline.cc:519
+msgid ""
+"Video file's framerate is not equal to %1 session timecode's framerate: '%2' "
+"vs '%3'"
+msgstr ""
+
+#: video_timeline.cc:592
+msgid ""
+"Video-server docroot mismatch. %1: '%2', video-server: '%3'. This usually "
+"means that the video server was not started by %1 and uses a different "
+"document-root."
+msgstr ""
+
+#: video_timeline.cc:729
+msgid ""
+"Video-monitor 'xjadeo' was not found. Please install http://xjadeo.sf.net/ "
+"(a custom path to xjadeo can be specified by setting the XJREMOTE "
+"environment variable. It should point to an application compatible with "
+"xjadeo's remote-control interface 'xjremote').\n"
+"\n"
+"see also http://manual.ardour.org/video-timeline/setup/"
+msgstr ""
+
+#: video_timeline.cc:744
+msgid "Video-monitor 'xjadeo' cannot be launched."
+msgstr ""
+
+#: video_timeline.cc:776
+msgid ""
+"Video-monitor 'xjadeo' is too old. Please install xjadeo version 0.7.7 or "
+"later. http://xjadeo.sf.net/"
+msgstr ""
+
+#: video_monitor.cc:283
+msgid "Video Monitor: File Not Found."
+msgstr ""
+
+#: transcode_ffmpeg.cc:56
+msgid ""
+"ffmpeg installation was not found on this system.\n"
+"%1 requires ffmpeg and ffprobe from ffmpeg.org - version 1.1 or newer.\n"
+"Video import and export is not possible until you install tools.\n"
+"\n"
+"The tools are included with the %1 releases from ardour.org and also "
+"available with the video-server at http://x42.github.com/harvid/\n"
+"\n"
+"Important: the files need to be installed in $PATH and named ffmpeg_harvid "
+"and ffprobe_harvid.\n"
+"If you already have a suitable ffmpeg installation on your system, we "
+"recommend creating symbolic links from ffmpeg to ffmpeg_harvid and from "
+"ffprobe to ffprobe_harvid.\n"
+"\n"
+"see also http://manual.ardour.org/video-timeline/setup/"
+msgstr ""
+
+#: transcode_video_dialog.cc:56
+msgid "Transcode/Import Video File "
+msgstr ""
+
+#: transcode_video_dialog.cc:58
+msgid "Output File:"
+msgstr ""
+
+#: transcode_video_dialog.cc:61 export_video_dialog.cc:81
+msgid "Abort"
+msgstr ""
+
+#: transcode_video_dialog.cc:63
+msgid "Height = "
+msgstr ""
+
+#: transcode_video_dialog.cc:66
+msgid "Extract LTC from audio and align video"
+msgstr ""
+
+#: transcode_video_dialog.cc:67
+msgid "Manual Override"
+msgstr ""
+
+#: transcode_video_dialog.cc:71 export_video_dialog.cc:99
+msgid "Debug Mode: Print ffmpeg command and output to stdout."
+msgstr ""
+
+#: transcode_video_dialog.cc:107
+msgid "<b>File Information</b>"
+msgstr ""
+
+#: transcode_video_dialog.cc:113
+msgid ""
+"ffmpeg installation was not found. Video Import is not possible. See the Log "
+"window for more information."
+msgstr ""
+
+#: transcode_video_dialog.cc:120
+msgid ""
+"File-info can not be read. Most likely '%1' is not a valid video-file or an "
+"unsupported video codec or format."
+msgstr ""
+
+#: transcode_video_dialog.cc:137
+msgid "FPS:"
+msgstr ""
+
+#: transcode_video_dialog.cc:141
+msgid "Codec:"
+msgstr ""
+
+#: transcode_video_dialog.cc:143
+msgid "Geometry:"
+msgstr ""
+
+#: transcode_video_dialog.cc:158
+msgid "??"
+msgstr ""
+
+#: transcode_video_dialog.cc:179
+msgid "<b>Import Settings</b>"
+msgstr ""
+
+#: transcode_video_dialog.cc:184
+msgid "Reference from Current Location (Previously Transcoded Files Only)"
+msgstr ""
+
+#: transcode_video_dialog.cc:185
+msgid "Import/Transcode Video to Session"
+msgstr ""
+
+#: transcode_video_dialog.cc:188 transcode_video_dialog.cc:198
+msgid "Do Not Import Video (Audio Import Only)"
+msgstr ""
+
+#: transcode_video_dialog.cc:208
+msgid "Do Not Import Video"
+msgstr ""
+
+#: transcode_video_dialog.cc:224
+msgid "Scale Video: Width = "
+msgstr ""
+
+#: transcode_video_dialog.cc:230
+msgid "Original Width"
+msgstr ""
+
+#: transcode_video_dialog.cc:245
+msgid "Bitrate (KBit/s):"
+msgstr ""
+
+#: transcode_video_dialog.cc:250
+msgid "Extract Audio:"
+msgstr ""
+
+#: transcode_video_dialog.cc:255
+msgid "No Audio Track Present"
+msgstr ""
+
+#: transcode_video_dialog.cc:258
+msgid "Do Not Extract Audio"
+msgstr ""
+
+#: transcode_video_dialog.cc:374
+msgid "Extracting Audio.."
+msgstr ""
+
+#: transcode_video_dialog.cc:377
+msgid "Audio Extraction Failed."
+msgstr ""
+
+#: transcode_video_dialog.cc:403
+msgid "Transcoding Video.."
+msgstr ""
+
+#: transcode_video_dialog.cc:437
+msgid "Transcoding Failed."
+msgstr ""
+
+#: transcode_video_dialog.cc:541
+msgid "Save Transcoded Video File"
+msgstr ""
+
+#: video_server_dialog.cc:52
+msgid "Launch Video Server"
+msgstr ""
+
+#: video_server_dialog.cc:53
+msgid "Server Executable:"
+msgstr ""
+
+#: video_server_dialog.cc:55
+msgid "Server Docroot:"
+msgstr ""
+
+#: video_server_dialog.cc:61
+msgid "Don't show this dialog again. (Reset in Edit->Preferences)."
+msgstr ""
+
+#: video_server_dialog.cc:94
+msgid ""
+"The external video server 'harvid' can not be found.\n"
+"The tool is included with the %1 releases from ardour.org, alternatively you "
+"can download it from http://x42.github.com/harvid/ or acquire it from your "
+"distribution.\n"
+"\n"
+"see also http://manual.ardour.org/video-timeline/setup/"
+msgstr ""
+
+#: video_server_dialog.cc:126
+msgid "Listen Address:"
+msgstr ""
+
+#: video_server_dialog.cc:131
+msgid "Listen Port:"
+msgstr ""
+
+#: video_server_dialog.cc:136
+msgid "Cache Size:"
+msgstr ""
+
+#: video_server_dialog.cc:142
+msgid ""
+"%1 relies on an external video server for the videotimeline.\n"
+"The server configured in Edit -> Preferences -> Video is not reachable.\n"
+"Do you want %1 to launch 'harvid' on this machine?"
+msgstr ""
+
+#: video_server_dialog.cc:186
+msgid "Set Video Server Executable"
+msgstr ""
+
+#: video_server_dialog.cc:206
+msgid "Server docroot"
+msgstr ""
+
+#: utils_videotl.cc:63
+msgid "Destination is outside Video Server's docroot. "
+msgstr ""
+
+#: utils_videotl.cc:64
+msgid ""
+"The destination file path is outside of the Video Server's docroot. The file "
+"will not be readable by the Video Server. Do you still want to continue?"
+msgstr ""
+
+#: utils_videotl.cc:67
+msgid "Continue"
+msgstr ""
+
+#: utils_videotl.cc:74
+msgid "Confirm Overwrite"
+msgstr ""
+
+#: utils_videotl.cc:84 utils_videotl.cc:100
+msgid "Cannot create video folder \"%1\" (%2)"
+msgstr ""
+
+#: export_video_dialog.cc:67
+msgid "Export Video File "
+msgstr ""
+
+#: export_video_dialog.cc:78
+msgid "Video:"
+msgstr ""
+
+#: export_video_dialog.cc:83
+msgid "Scale Video (W x H):"
+msgstr ""
+
+#: export_video_dialog.cc:84
+msgid "Retain Aspect"
+msgstr ""
+
+#: export_video_dialog.cc:89
+msgid "Set Aspect Ratio:"
+msgstr ""
+
+#: export_video_dialog.cc:90
+msgid "Normalize Audio"
+msgstr ""
+
+#: export_video_dialog.cc:91
+msgid "2 Pass Encoding"
+msgstr ""
+
+#: export_video_dialog.cc:92
+msgid "Codec Optimizations:"
+msgstr ""
+
+#: export_video_dialog.cc:94
+msgid "Deinterlace"
+msgstr ""
+
+#: export_video_dialog.cc:95
+msgid "Use [2] B-frames (MPEG 2 or 4 only)"
+msgstr ""
+
+#: export_video_dialog.cc:96
+msgid "Override FPS (Default is to retain FPS from the input video file):"
+msgstr ""
+
+#: export_video_dialog.cc:97
+msgid "Include Session Metadata"
+msgstr ""
+
+#: export_video_dialog.cc:115
+msgid ""
+"ffmpeg installation was not found. Video Export is not possible. See the Log "
+"window for more information."
+msgstr ""
+
+#: export_video_dialog.cc:126
+msgid "<b>Output:</b> (file extension defines format)"
+msgstr ""
+
+#: export_video_dialog.cc:136
+msgid "<b>Input Video:</b>"
+msgstr ""
+
+#: export_video_dialog.cc:147
+msgid "Audio:"
+msgstr ""
+
+#: export_video_dialog.cc:149
+msgid "Master Bus"
+msgstr ""
+
+#: export_video_dialog.cc:153
+msgid "from the %1 session's start to the session's end"
+msgstr ""
+
+#: export_video_dialog.cc:156
+msgid "<b>Settings:</b>"
+msgstr ""
+
+#: export_video_dialog.cc:164
+msgid "Range:"
+msgstr ""
+
+#: export_video_dialog.cc:170
+msgid "Video Codec:"
+msgstr ""
+
+#: export_video_dialog.cc:173
+msgid "Video KBit/s:"
+msgstr ""
+
+#: export_video_dialog.cc:176
+msgid "Audio Codec:"
+msgstr ""
+
+#: export_video_dialog.cc:179
+msgid "Audio KBit/s:"
+msgstr ""
+
+#: export_video_dialog.cc:182
+msgid "Audio Samplerate:"
+msgstr ""
+
+#: export_video_dialog.cc:215 export_video_dialog.cc:223
+#: export_video_dialog.cc:814 export_video_dialog.cc:817
+msgid "(default for format)"
+msgstr ""
+
+#: export_video_dialog.cc:233 export_video_dialog.cc:244
+#: export_video_dialog.cc:821 export_video_dialog.cc:830
+msgid "(default)"
+msgstr ""
+
+#: export_video_dialog.cc:245 export_video_dialog.cc:824
+msgid "(retain)"
+msgstr ""
+
+#: export_video_dialog.cc:335
+msgid "from 00:00:00:00 to the video's end"
+msgstr ""
+
+#: export_video_dialog.cc:337
+msgid "from the video's start to the video's end"
+msgstr ""
+
+#: export_video_dialog.cc:340
+msgid "Selected range"
+msgstr ""
+
+#: export_video_dialog.cc:561
+msgid "Normalizing audio"
+msgstr ""
+
+#: export_video_dialog.cc:566 export_video_dialog.cc:571
+msgid "Exporting audio"
+msgstr ""
+
+#: export_video_dialog.cc:632
+msgid "Exporting Audio..."
+msgstr ""
+
+#: export_video_dialog.cc:689
+msgid ""
+"Export Video: Cannot query duration of video-file, using duration from "
+"timeline instead."
+msgstr ""
+
+#: export_video_dialog.cc:719
+msgid "Export Video: export-range does not include video."
+msgstr ""
+
+#: export_video_dialog.cc:732
+msgid "Export Video: No Master Out Ports to Connect for Audio Export"
+msgstr ""
+
+#: export_video_dialog.cc:774
+msgid "Encoding Video..."
+msgstr ""
+
+#: export_video_dialog.cc:794
+msgid "Export Video: Video input file cannot be read."
+msgstr ""
+
+#: export_video_dialog.cc:900
+msgid "Encoding Video.. Pass 1/2"
+msgstr ""
+
+#: export_video_dialog.cc:912
+msgid "Encoding Video.. Pass 2/2"
+msgstr ""
+
+#: export_video_dialog.cc:1015
+msgid "Transcoding failed."
+msgstr ""
+
+#: export_video_dialog.cc:1251 export_video_dialog.cc:1271
+msgid "Save Exported Video File"
+msgstr ""
+
+#: export_video_infobox.cc:33
+msgid "Video Export Info"
+msgstr ""
+
+#: export_video_infobox.cc:34
+msgid "Do Not Show This Dialog Again (Reset in Edit > Preferences > Video)."
+msgstr ""
+
+#: export_video_infobox.cc:46
+msgid "<b>Video Export Info</b>"
+msgstr ""
+
+#: export_video_infobox.cc:51
+msgid ""
+"%1 does not include commercial licenses for encoding audio/video. Visit "
+"mpegla.com for information about licensing various audio/video codecs.\n"
+"\n"
+"Video encoding is a non-trivial task with many details.\n"
+"\n"
+"Please see the manual at %2/video-timeline/operations/#export.\n"
+"\n"
+"Open Manual in Browser? "
+msgstr ""
diff --git a/gtk2_ardour/gtk_pianokeyboard.c b/gtk2_ardour/gtk_pianokeyboard.c
index 8917017..2be8cdf 100644
--- a/gtk2_ardour/gtk_pianokeyboard.c
+++ b/gtk2_ardour/gtk_pianokeyboard.c
@@ -686,7 +686,9 @@ piano_keyboard_new(void)
 	pk->note_being_pressed_using_mouse = -1;
 	pk->last_key = 0;
 	pk->monophonic = FALSE;
+
 	memset((void *)pk->notes, 0, sizeof(struct PKNote) * NNOTES);
+
 	pk->key_bindings = g_hash_table_new(g_str_hash, g_str_equal);
 	bind_keys_qwerty(pk);
 
diff --git a/gtk2_ardour/gtk_pianokeyboard.h b/gtk2_ardour/gtk_pianokeyboard.h
index 4b188a9..3fd0fc2 100644
--- a/gtk2_ardour/gtk_pianokeyboard.h
+++ b/gtk2_ardour/gtk_pianokeyboard.h
@@ -61,7 +61,7 @@ struct _PianoKeyboard
 	int			note_being_pressed_using_mouse;
 	int         last_key;
 	gboolean    monophonic;
-	volatile struct PKNote 	notes[NNOTES];
+	struct PKNote 	notes[NNOTES];
 	/* Table used to translate from PC keyboard character to MIDI note number. */
 	GHashTable		*key_bindings;
 };
diff --git a/gtk2_ardour/gui_object.cc b/gtk2_ardour/gui_object.cc
index 3128e61..3f6b79c 100644
--- a/gtk2_ardour/gui_object.cc
+++ b/gtk2_ardour/gui_object.cc
@@ -21,38 +21,26 @@
 #include <sstream>
 
 #include "gui_object.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using std::string;
 
-const string GUIObjectState::xml_node_name (X_("GUIObjectState"));
-
-GUIObjectState::GUIObjectState ()
-	: _state (X_("GUIObjectState"))
-{
-
-}
-
-XMLNode *
+/*static*/ XMLNode *
 GUIObjectState::get_node (const XMLNode* parent, const string& id)
 {
 	XMLNodeList const & children = parent->children ();
 	for (XMLNodeList::const_iterator i = children.begin(); i != children.end(); ++i) {
-
 		if ((*i)->name() != X_("Object")) {
 			continue;
 		}
-
-		XMLProperty* p = (*i)->property (X_("id"));
-		if (p && p->value() == id) {
+		if ((*i)->has_property_with_value(X_("id"), id)) {
 			return *i;
 		}
 	}
-
 	return 0;
 }
 
-XMLNode *
+/*static*/ XMLNode *
 GUIObjectState::get_or_add_node (XMLNode* parent, const string& id)
 {
 	XMLNode* child = get_node (parent, id);
@@ -61,46 +49,53 @@ GUIObjectState::get_or_add_node (XMLNode* parent, const string& id)
 		child->add_property (X_("id"), id);
 		parent->add_child_nocopy (*child);
 	}
-
 	return child;
 }
 
+
+const string GUIObjectState::xml_node_name (X_("GUIObjectState"));
+
+GUIObjectState::GUIObjectState ()
+	: _state (X_("GUIObjectState"))
+{
+}
+
 XMLNode *
 GUIObjectState::get_or_add_node (const string& id)
 {
-	return get_or_add_node (&_state, id);
+	std::map <std::string, XMLNode*>::iterator i = object_map.find (id);
+	if (i != object_map.end()) {
+		return i->second;
+	}
+	//assert (get_node (&_state, id) == 0); // XXX performance penalty due to get_node()
+	XMLNode* child = new XMLNode (X_("Object"));
+	child->add_property (X_("id"), id);
+	_state.add_child_nocopy (*child);
+	object_map[id] = child;
+	return child;
 }
 
-/** Remove node with provided id.
- *  @param id property of Object node to look for.
- */
-
 void
 GUIObjectState::remove_node (const std::string& id)
 {
+	object_map.erase (id);
 	_state.remove_nodes_and_delete(X_("id"), id );
 }
 
-/** Get a string from our state.
- *  @param id property of Object node to look for.
- *  @param prop_name name of the Object property to return.
- *  @param empty if non-0, filled in with true if the property is currently non-existant, otherwise false.
- *  @return value of property `prop_name', or empty.
- */
-
 string
 GUIObjectState::get_string (const string& id, const string& prop_name, bool* empty)
 {
-	XMLNode* child = get_node (&_state, id);
-
-	if (!child) {
+	std::map <std::string, XMLNode*>::const_iterator i = object_map.find (id);
+	if (i == object_map.end()) {
+		//assert (get_node (&_state, id) == 0); // XXX performance penalty due to get_node()
 		if (empty) {
 			*empty = true;
 		}
 		return string ();
 	}
+	//assert (get_node (&_state, id) == i->second); // XXX performance penalty due to get_node()
 
-	XMLProperty* p = child->property (prop_name);
+	XMLProperty const * p (i->second->property (prop_name));
 	if (!p) {
 		if (empty) {
 			*empty = true;
@@ -128,7 +123,20 @@ GUIObjectState::set_state (const XMLNode& node)
 		return -1;
 	}
 
+	object_map.clear ();
 	_state = node;
+
+	XMLNodeList const & children (_state.children ());
+	for (XMLNodeList::const_iterator i = children.begin(); i != children.end(); ++i) {
+		if ((*i)->name() != X_("Object")) {
+			continue;
+		}
+		XMLProperty const * prop = (*i)->property (X_("id"));
+		if (!prop) {
+			continue;
+		}
+		object_map[prop->value ()] = *i;
+	}
 	return 0;
 }
 
@@ -142,19 +150,9 @@ std::list<string>
 GUIObjectState::all_ids () const
 {
 	std::list<string> ids;
-	XMLNodeList const & children = _state.children ();
-	for (XMLNodeList::const_iterator i = children.begin(); i != children.end(); ++i) {
-		if ((*i)->name() != X_("Object")) {
-			continue;
-		}
-
-		XMLProperty* p = (*i)->property (X_("id"));
-		if (p) {
-			ids.push_back (p->value ());
-		}
+	for (std::map <std::string, XMLNode*>::const_iterator i = object_map.begin ();
+			i != object_map.end (); ++i) {
+		ids.push_back (i->first);
 	}
-
 	return ids;
 }
-
-
diff --git a/gtk2_ardour/gui_object.h b/gtk2_ardour/gui_object.h
index 39cf579..62eeaa9 100644
--- a/gtk2_ardour/gui_object.h
+++ b/gtk2_ardour/gui_object.h
@@ -33,12 +33,18 @@ class GUIObjectState
 public:
 	GUIObjectState ();
 
-	XMLNode& get_state () const;
-	int set_state (const XMLNode&);
-
 	static const std::string xml_node_name;
 	void load (const XMLNode&);
 
+	int set_state (const XMLNode&);
+	XMLNode& get_state () const;
+
+	/** Get a string from our state.
+	 *  @param id property of Object node to look for.
+	 *  @param prop_name name of the Object property to return.
+	 *  @param empty if non-0, filled in with true if the property is currently non-existant, otherwise false.
+	 *  @return value of property `prop_name', or empty.
+	 */
 	std::string get_string (const std::string& id, const std::string& prop_name, bool* empty = 0);
 
 	template<typename T> void set_property (const std::string& id, const std::string& prop_name, const T& val) {
@@ -48,17 +54,26 @@ public:
 		child->add_property (prop_name.c_str(), s.str());
 	}
 
+	/** Remove node with provided id.
+	 *  @param id property of Object node to look for.
+	 */
+	void remove_node (const std::string& id);
 	std::list<std::string> all_ids () const;
 
-	static XMLNode* get_node (const XMLNode *, const std::string &);
 	XMLNode* get_or_add_node (const std::string &);
-	static XMLNode* get_or_add_node (XMLNode *, const std::string &);
 
-	void remove_node (const std::string& id);
+	static XMLNode* get_node (const XMLNode *, const std::string &);
+	static XMLNode* get_or_add_node (XMLNode *, const std::string &);
 
   private:
+	// no copy construction. object_map saves pointers to _state XMLNodes
+	// use set_state(get_state())
+	GUIObjectState (const GUIObjectState& other);
+
 	XMLNode _state;
+	// ideally we'd use a O(1) hash table here,
+	// but O(log(N)) is fine already.
+	std::map <std::string, XMLNode*> object_map;
 };
 
-
 #endif /* __gtk_ardour_gui_object_h__ */
diff --git a/gtk2_ardour/hit.cc b/gtk2_ardour/hit.cc
index cb9e479..e3a227d 100644
--- a/gtk2_ardour/hit.cc
+++ b/gtk2_ardour/hit.cc
@@ -17,6 +17,7 @@
     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */
 
+#include "evoral/Beats.hpp"
 #include "evoral/Note.hpp"
 
 #include "canvas/polygon.h"
diff --git a/gtk2_ardour/icons/ardour.ico b/gtk2_ardour/icons/ardour.ico
index b85a5e1..9cf40da 100644
Binary files a/gtk2_ardour/icons/ardour.ico and b/gtk2_ardour/icons/ardour.ico differ
diff --git a/gtk2_ardour/icons/cursor_z/hide.png b/gtk2_ardour/icons/cursor_z/hide.png
deleted file mode 100755
index 635f32f..0000000
Binary files a/gtk2_ardour/icons/cursor_z/hide.png and /dev/null differ
diff --git a/gtk2_ardour/icons/export_icons.sh b/gtk2_ardour/icons/export_icons.sh
deleted file mode 100755
index 11e5c40..0000000
--- a/gtk2_ardour/icons/export_icons.sh
+++ /dev/null
@@ -1,14 +0,0 @@
-#! /bin/bash
-
-# Export one PNG for every icon-size in app-icon_tango.svg. The "targets" layer in the SVG should be hidden.
-
-for s in \
-  "ardour-app-icon_tango_256px" \
-  "ardour-app-icon_tango_048px" \
-  "ardour-app-icon_tango_032px" \
-  "ardour-app-icon_tango_022px" \
-  "ardour-app-icon_tango_016px" \
-  "ardour-app-icon_osx" \
-  "ardour-app-icon_osx_mask";
-  do inkscape --export-id "$s" --export-png "$s.png" app-icon_tango.svg;
-done
diff --git a/gtk2_ardour/icons/fadein-S1.png b/gtk2_ardour/icons/fadein-S1.png
deleted file mode 100644
index 09d6279..0000000
Binary files a/gtk2_ardour/icons/fadein-S1.png and /dev/null differ
diff --git a/gtk2_ardour/icons/fadein-S2.png b/gtk2_ardour/icons/fadein-S2.png
deleted file mode 100644
index d7aaf5f..0000000
Binary files a/gtk2_ardour/icons/fadein-S2.png and /dev/null differ
diff --git a/gtk2_ardour/icons/fadein-long-cut.png b/gtk2_ardour/icons/fadein-long-cut.png
deleted file mode 100644
index 578346a..0000000
Binary files a/gtk2_ardour/icons/fadein-long-cut.png and /dev/null differ
diff --git a/gtk2_ardour/icons/fadein-short-cut.png b/gtk2_ardour/icons/fadein-short-cut.png
deleted file mode 100644
index 465698f..0000000
Binary files a/gtk2_ardour/icons/fadein-short-cut.png and /dev/null differ
diff --git a/gtk2_ardour/icons/fadeout-S1.png b/gtk2_ardour/icons/fadeout-S1.png
deleted file mode 100644
index 6313690..0000000
Binary files a/gtk2_ardour/icons/fadeout-S1.png and /dev/null differ
diff --git a/gtk2_ardour/icons/fadeout-S2.png b/gtk2_ardour/icons/fadeout-S2.png
deleted file mode 100644
index 35efbea..0000000
Binary files a/gtk2_ardour/icons/fadeout-S2.png and /dev/null differ
diff --git a/gtk2_ardour/icons/fadeout-long-cut.png b/gtk2_ardour/icons/fadeout-long-cut.png
deleted file mode 100644
index 66c9bb5..0000000
Binary files a/gtk2_ardour/icons/fadeout-long-cut.png and /dev/null differ
diff --git a/gtk2_ardour/icons/fadeout-short-cut.png b/gtk2_ardour/icons/fadeout-short-cut.png
deleted file mode 100644
index 43c6a57..0000000
Binary files a/gtk2_ardour/icons/fadeout-short-cut.png and /dev/null differ
diff --git a/gtk2_ardour/icons/fader_belt.png b/gtk2_ardour/icons/fader_belt.png
deleted file mode 100644
index eefed15..0000000
Binary files a/gtk2_ardour/icons/fader_belt.png and /dev/null differ
diff --git a/gtk2_ardour/icons/fader_belt_desensitised.png b/gtk2_ardour/icons/fader_belt_desensitised.png
deleted file mode 100644
index 9c7094e..0000000
Binary files a/gtk2_ardour/icons/fader_belt_desensitised.png and /dev/null differ
diff --git a/gtk2_ardour/icons/fader_belt_h.png b/gtk2_ardour/icons/fader_belt_h.png
deleted file mode 100644
index 3525767..0000000
Binary files a/gtk2_ardour/icons/fader_belt_h.png and /dev/null differ
diff --git a/gtk2_ardour/icons/fader_belt_h_desensitised.png b/gtk2_ardour/icons/fader_belt_h_desensitised.png
deleted file mode 100644
index d2952d0..0000000
Binary files a/gtk2_ardour/icons/fader_belt_h_desensitised.png and /dev/null differ
diff --git a/gtk2_ardour/icons/fader_belt_h_medium.png b/gtk2_ardour/icons/fader_belt_h_medium.png
deleted file mode 100644
index 25c1466..0000000
Binary files a/gtk2_ardour/icons/fader_belt_h_medium.png and /dev/null differ
diff --git a/gtk2_ardour/icons/fader_belt_h_medium_desensitised.png b/gtk2_ardour/icons/fader_belt_h_medium_desensitised.png
deleted file mode 100644
index ff920b7..0000000
Binary files a/gtk2_ardour/icons/fader_belt_h_medium_desensitised.png and /dev/null differ
diff --git a/gtk2_ardour/icons/fader_belt_h_thin.png b/gtk2_ardour/icons/fader_belt_h_thin.png
deleted file mode 100644
index b3dec4b..0000000
Binary files a/gtk2_ardour/icons/fader_belt_h_thin.png and /dev/null differ
diff --git a/gtk2_ardour/icons/fader_belt_h_thin_desensitised.png b/gtk2_ardour/icons/fader_belt_h_thin_desensitised.png
deleted file mode 100644
index c92f38f..0000000
Binary files a/gtk2_ardour/icons/fader_belt_h_thin_desensitised.png and /dev/null differ
diff --git a/gtk2_ardour/icons/hide.png b/gtk2_ardour/icons/hide.png
deleted file mode 100644
index 2db8173..0000000
Binary files a/gtk2_ardour/icons/hide.png and /dev/null differ
diff --git a/gtk2_ardour/icons/join_tools.png b/gtk2_ardour/icons/join_tools.png
deleted file mode 100644
index b5159c0..0000000
Binary files a/gtk2_ardour/icons/join_tools.png and /dev/null differ
diff --git a/gtk2_ardour/icons/knob.png b/gtk2_ardour/icons/knob.png
deleted file mode 100644
index 1047e49..0000000
Binary files a/gtk2_ardour/icons/knob.png and /dev/null differ
diff --git a/gtk2_ardour/icons/metronome.png b/gtk2_ardour/icons/metronome.png
deleted file mode 100644
index 656a3d4..0000000
Binary files a/gtk2_ardour/icons/metronome.png and /dev/null differ
diff --git a/gtk2_ardour/icons/midi_panic.png b/gtk2_ardour/icons/midi_panic.png
deleted file mode 100644
index 9163467..0000000
Binary files a/gtk2_ardour/icons/midi_panic.png and /dev/null differ
diff --git a/gtk2_ardour/icons/nudge_left.png b/gtk2_ardour/icons/nudge_left.png
deleted file mode 100644
index c885477..0000000
Binary files a/gtk2_ardour/icons/nudge_left.png and /dev/null differ
diff --git a/gtk2_ardour/icons/nudge_right.png b/gtk2_ardour/icons/nudge_right.png
deleted file mode 100644
index a6c1581..0000000
Binary files a/gtk2_ardour/icons/nudge_right.png and /dev/null differ
diff --git a/gtk2_ardour/icons/rec-safe-disabled.png b/gtk2_ardour/icons/rec-safe-disabled.png
new file mode 100644
index 0000000..10f76de
Binary files /dev/null and b/gtk2_ardour/icons/rec-safe-disabled.png differ
diff --git a/gtk2_ardour/icons/rec-safe-enabled.png b/gtk2_ardour/icons/rec-safe-enabled.png
new file mode 100644
index 0000000..44f2f7e
Binary files /dev/null and b/gtk2_ardour/icons/rec-safe-enabled.png differ
diff --git a/gtk2_ardour/icons/search.png b/gtk2_ardour/icons/search.png
new file mode 100644
index 0000000..0a0db84
Binary files /dev/null and b/gtk2_ardour/icons/search.png differ
diff --git a/gtk2_ardour/icons/step-editing.png b/gtk2_ardour/icons/step-editing.png
deleted file mode 100644
index 3d65495..0000000
Binary files a/gtk2_ardour/icons/step-editing.png and /dev/null differ
diff --git a/gtk2_ardour/icons/strip_width.png b/gtk2_ardour/icons/strip_width.png
deleted file mode 100644
index 99a0e72..0000000
Binary files a/gtk2_ardour/icons/strip_width.png and /dev/null differ
diff --git a/gtk2_ardour/icons/tav_exp.png b/gtk2_ardour/icons/tav_exp.png
deleted file mode 100644
index 0e8daf5..0000000
Binary files a/gtk2_ardour/icons/tav_exp.png and /dev/null differ
diff --git a/gtk2_ardour/icons/tav_shrink.png b/gtk2_ardour/icons/tav_shrink.png
deleted file mode 100644
index 44b4277..0000000
Binary files a/gtk2_ardour/icons/tav_shrink.png and /dev/null differ
diff --git a/gtk2_ardour/icons/tool_audition.png b/gtk2_ardour/icons/tool_audition.png
deleted file mode 100644
index 409771b..0000000
Binary files a/gtk2_ardour/icons/tool_audition.png and /dev/null differ
diff --git a/gtk2_ardour/icons/tool_content.png b/gtk2_ardour/icons/tool_content.png
deleted file mode 100644
index 6ab448c..0000000
Binary files a/gtk2_ardour/icons/tool_content.png and /dev/null differ
diff --git a/gtk2_ardour/icons/tool_cut.png b/gtk2_ardour/icons/tool_cut.png
deleted file mode 100644
index 6aa830f..0000000
Binary files a/gtk2_ardour/icons/tool_cut.png and /dev/null differ
diff --git a/gtk2_ardour/icons/tool_gain.png b/gtk2_ardour/icons/tool_gain.png
deleted file mode 100644
index f54be94..0000000
Binary files a/gtk2_ardour/icons/tool_gain.png and /dev/null differ
diff --git a/gtk2_ardour/icons/tool_note.png b/gtk2_ardour/icons/tool_note.png
deleted file mode 100644
index f0e5760..0000000
Binary files a/gtk2_ardour/icons/tool_note.png and /dev/null differ
diff --git a/gtk2_ardour/icons/tool_object.png b/gtk2_ardour/icons/tool_object.png
deleted file mode 100644
index 0b5739e..0000000
Binary files a/gtk2_ardour/icons/tool_object.png and /dev/null differ
diff --git a/gtk2_ardour/icons/tool_object.xpm b/gtk2_ardour/icons/tool_object.xpm
deleted file mode 100644
index b6b2fea..0000000
--- a/gtk2_ardour/icons/tool_object.xpm
+++ /dev/null
@@ -1,54 +0,0 @@
-/* XPM */
-static char * tool_object_xpm[] = {
-"16 12 39 1",
-" 	c None",
-".	c #000000",
-"+	c #0C0C0C",
-"@	c #151515",
-"#	c #D1D1D1",
-"$	c #121212",
-"%	c #161616",
-"&	c #DADADA",
-"*	c #131313",
-"=	c #D6D6D6",
-"-	c #0F0F0F",
-";	c #050505",
-">	c #D3D3D3",
-",	c #0A0A0A",
-"'	c #070707",
-")	c #E5E5E5",
-"!	c #292929",
-"~	c #B0B0B0",
-"{	c #262626",
-"]	c #5C5C5C",
-"^	c #333333",
-"/	c #0E0E0E",
-"(	c #111111",
-"_	c #3D3D3D",
-":	c #F4F4F4",
-"<	c #FFFFFF",
-"[	c #EBEBEB",
-"}	c #D0D0D0",
-"|	c #030303",
-"1	c #F1F1F1",
-"2	c #FDFDFD",
-"3	c #C3C3C3",
-"4	c #101010",
-"5	c #141414",
-"6	c #F2F2F2",
-"7	c #4E4E4E",
-"8	c #686868",
-"9	c #0B0B0B",
-"0	c #020202",
-"    .+.         ",
-"    @#$         ",
-"    %&*         ",
-"    +=-..       ",
-"    ;>.,,-..    ",
-"   .')!~{]^/    ",
-"   (_:<<<[}|    ",
-"   '12<<<<<|    ",
-"   -~<<<<<34    ",
-"   .56<<<<7|    ",
-"    /8<<<),.    ",
-"    .9|||0-     "};
diff --git a/gtk2_ardour/icons/tool_object_range.png b/gtk2_ardour/icons/tool_object_range.png
deleted file mode 100644
index cd3732e..0000000
Binary files a/gtk2_ardour/icons/tool_object_range.png and /dev/null differ
diff --git a/gtk2_ardour/icons/tool_range.png b/gtk2_ardour/icons/tool_range.png
deleted file mode 100644
index 10dd90a..0000000
Binary files a/gtk2_ardour/icons/tool_range.png and /dev/null differ
diff --git a/gtk2_ardour/icons/tool_stretch.png b/gtk2_ardour/icons/tool_stretch.png
deleted file mode 100644
index a599fbe..0000000
Binary files a/gtk2_ardour/icons/tool_stretch.png and /dev/null differ
diff --git a/gtk2_ardour/icons/tool_zoom.png b/gtk2_ardour/icons/tool_zoom.png
deleted file mode 100644
index f6b5e27..0000000
Binary files a/gtk2_ardour/icons/tool_zoom.png and /dev/null differ
diff --git a/gtk2_ardour/icons/transport_end.png b/gtk2_ardour/icons/transport_end.png
deleted file mode 100644
index ccba118..0000000
Binary files a/gtk2_ardour/icons/transport_end.png and /dev/null differ
diff --git a/gtk2_ardour/icons/transport_loop.png b/gtk2_ardour/icons/transport_loop.png
deleted file mode 100644
index c2831c1..0000000
Binary files a/gtk2_ardour/icons/transport_loop.png and /dev/null differ
diff --git a/gtk2_ardour/icons/transport_play.png b/gtk2_ardour/icons/transport_play.png
deleted file mode 100644
index 07e8969..0000000
Binary files a/gtk2_ardour/icons/transport_play.png and /dev/null differ
diff --git a/gtk2_ardour/icons/transport_range.png b/gtk2_ardour/icons/transport_range.png
deleted file mode 100644
index bf4473b..0000000
Binary files a/gtk2_ardour/icons/transport_range.png and /dev/null differ
diff --git a/gtk2_ardour/icons/transport_record.png b/gtk2_ardour/icons/transport_record.png
deleted file mode 100644
index f92b607..0000000
Binary files a/gtk2_ardour/icons/transport_record.png and /dev/null differ
diff --git a/gtk2_ardour/icons/transport_start.png b/gtk2_ardour/icons/transport_start.png
deleted file mode 100644
index fe05dc2..0000000
Binary files a/gtk2_ardour/icons/transport_start.png and /dev/null differ
diff --git a/gtk2_ardour/icons/transport_stop.png b/gtk2_ardour/icons/transport_stop.png
deleted file mode 100644
index 05562b1..0000000
Binary files a/gtk2_ardour/icons/transport_stop.png and /dev/null differ
diff --git a/gtk2_ardour/icons/zoom_full.png b/gtk2_ardour/icons/zoom_full.png
deleted file mode 100644
index f8a4eb7..0000000
Binary files a/gtk2_ardour/icons/zoom_full.png and /dev/null differ
diff --git a/gtk2_ardour/icons/zoom_in.png b/gtk2_ardour/icons/zoom_in.png
deleted file mode 100644
index a290fe2..0000000
Binary files a/gtk2_ardour/icons/zoom_in.png and /dev/null differ
diff --git a/gtk2_ardour/icons/zoom_out.png b/gtk2_ardour/icons/zoom_out.png
deleted file mode 100644
index e4fd222..0000000
Binary files a/gtk2_ardour/icons/zoom_out.png and /dev/null differ
diff --git a/gtk2_ardour/insert_remove_time_dialog.cc b/gtk2_ardour/insert_remove_time_dialog.cc
index 8620ba1..0aeca1e 100644
--- a/gtk2_ardour/insert_remove_time_dialog.cc
+++ b/gtk2_ardour/insert_remove_time_dialog.cc
@@ -23,7 +23,7 @@
 #include <gtkmm/alignment.h>
 #include "insert_remove_time_dialog.h"
 #include "audio_clock.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace Gtk;
 using namespace Editing;
diff --git a/gtk2_ardour/instrument_selector.cc b/gtk2_ardour/instrument_selector.cc
index 5dfa091..ffd11cc 100644
--- a/gtk2_ardour/instrument_selector.cc
+++ b/gtk2_ardour/instrument_selector.cc
@@ -17,10 +17,10 @@
 */
 
 #include "ardour/plugin_manager.h"
-
+#include "gtkmm2ext/gui_thread.h"
 #include "instrument_selector.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace Gtk;
 using namespace ARDOUR;
@@ -28,10 +28,39 @@ using namespace ARDOUR;
 InstrumentSelector::InstrumentSelector()
 	: _reasonable_synth_id(0)
 {
+	refill ();
+
+	PluginManager::instance ().PluginListChanged.connect (_update_connection, invalidator (*this), boost::bind (&InstrumentSelector::refill, this), gui_context());
+}
+
+void
+InstrumentSelector::refill()
+{
+	TreeModel::iterator iter = get_active();
+	std::string selected;
+	if (iter) {
+		const TreeModel::Row& row = (*iter);
+		selected = row[_instrument_list_columns.name];
+	}
+
+	unset_model ();
+	clear ();
 	build_instrument_list();
 	set_model(_instrument_list);
 	pack_start(_instrument_list_columns.name);
-	set_active(_reasonable_synth_id);
+	if (selected.empty ()) {
+		set_active(_reasonable_synth_id);
+	} else {
+		TreeModel::Children rows = _instrument_list->children();
+		TreeModel::Children::iterator i;
+		for (i = rows.begin(); i != rows.end(); ++i) {
+			std::string cn = (*i)[_instrument_list_columns.name];
+			if (cn == selected) {
+				set_active(*i);
+				break;
+			}
+		}
+	}
 	set_button_sensitivity(Gtk::SENSITIVITY_AUTO);
 }
 
@@ -42,6 +71,7 @@ InstrumentSelector::build_instrument_list()
 
 	PluginInfoList all_plugs;
 	all_plugs.insert(all_plugs.end(), manager.ladspa_plugin_info().begin(), manager.ladspa_plugin_info().end());
+	all_plugs.insert(all_plugs.end(), manager.lua_plugin_info().begin(), manager.lua_plugin_info().end());
 #ifdef WINDOWS_VST_SUPPORT
 	all_plugs.insert(all_plugs.end(), manager.windows_vst_plugin_info().begin(), manager.windows_vst_plugin_info().end());
 #endif
diff --git a/gtk2_ardour/instrument_selector.h b/gtk2_ardour/instrument_selector.h
index 81beff6..7fe6c8c 100644
--- a/gtk2_ardour/instrument_selector.h
+++ b/gtk2_ardour/instrument_selector.h
@@ -26,6 +26,8 @@
 #include <gtkmm/treemodel.h>
 #include <gtkmm/liststore.h>
 
+#include "pbd/signals.h"
+
 #include "ardour/plugin.h"
 #include "ardour/types.h"
 #include "ardour/template_utils.h"
@@ -52,10 +54,12 @@ private:
 	};
 
 	void build_instrument_list();
+	void refill();
 
 	Glib::RefPtr<Gtk::ListStore> _instrument_list;
 	InstrumentListColumns        _instrument_list_columns;
 	uint32_t                     _reasonable_synth_id;
+	PBD::ScopedConnection        _update_connection;
 };
 
 #endif /* __gtk_ardour_instrument_selector_h__ */
diff --git a/gtk2_ardour/interthread_progress_window.cc b/gtk2_ardour/interthread_progress_window.cc
index e63bf62..c74f129 100644
--- a/gtk2_ardour/interthread_progress_window.cc
+++ b/gtk2_ardour/interthread_progress_window.cc
@@ -22,7 +22,7 @@
 #include "gtkmm2ext/utils.h"
 #include "ardour/import_status.h"
 #include "interthread_progress_window.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace Gtk;
@@ -50,12 +50,22 @@ InterthreadProgressWindow::InterthreadProgressWindow (ARDOUR::InterThreadInfo* i
 
 	set_default_size (200, 100);
 	show_all ();
-        hide ();
+	hide ();
+	_interthread_info->cancel = false; // override on_hide
 
 	Glib::signal_timeout().connect (sigc::mem_fun (*this, &InterthreadProgressWindow::update), 100);
 }
 
 void
+InterthreadProgressWindow::on_hide ()
+{
+	if (_interthread_info && !_interthread_info->done) {
+		//catch user pressing 'esc' or WM close
+		_interthread_info->cancel = true;
+	}
+}
+
+void
 InterthreadProgressWindow::cancel_clicked ()
 {
 	_interthread_info->cancel = true;
diff --git a/gtk2_ardour/interthread_progress_window.h b/gtk2_ardour/interthread_progress_window.h
index 653ec46..ee7b58e 100644
--- a/gtk2_ardour/interthread_progress_window.h
+++ b/gtk2_ardour/interthread_progress_window.h
@@ -42,6 +42,7 @@ public:
 protected:
 
 	virtual bool update ();
+	virtual void on_hide ();
 
 	Gtk::Button _cancel_button;
 	Gtk::Label _cancel_label;
diff --git a/gtk2_ardour/io_selector.cc b/gtk2_ardour/io_selector.cc
index 574b3cd..6d0ede3 100644
--- a/gtk2_ardour/io_selector.cc
+++ b/gtk2_ardour/io_selector.cc
@@ -33,7 +33,7 @@
 #include "io_selector.h"
 #include "utils.h"
 #include "gui_thread.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 using namespace ARDOUR_UI_UTILS;
diff --git a/gtk2_ardour/keyboard.cc b/gtk2_ardour/keyboard.cc
index 79f83a4..6341071 100644
--- a/gtk2_ardour/keyboard.cc
+++ b/gtk2_ardour/keyboard.cc
@@ -20,6 +20,7 @@
 #include "pbd/convert.h"
 #include "pbd/error.h"
 #include "pbd/file_utils.h"
+#include "pbd/basename.h"
 
 #include "ardour/filesystem_paths.h"
 
@@ -27,8 +28,9 @@
 #include "public_editor.h"
 #include "keyboard.h"
 #include "opts.h"
+#include "ui_config.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace Gtk;
@@ -36,19 +38,7 @@ using namespace PBD;
 using namespace ARDOUR;
 using Gtkmm2ext::Keyboard;
 
-static void
-accel_map_changed (GtkAccelMap* /*map*/,
-		   gchar* /*path*/,
-		   guint /*key*/,
-		   GdkModifierType /*mod*/,
-		   gpointer keyboard)
-{
-	ArdourKeyboard* me = (ArdourKeyboard*)keyboard;
-	Keyboard::keybindings_changed ();
-	me->ui.setup_tooltips ();
-}
-
-#ifdef GTKOSX
+#ifdef __APPLE__
 guint ArdourKeyboard::constraint_mod = Keyboard::PrimaryModifier;
 #else
 guint ArdourKeyboard::constraint_mod = Keyboard::SecondaryModifier;
@@ -61,21 +51,42 @@ guint ArdourKeyboard::push_points_mod = Keyboard::PrimaryModifier;
 guint ArdourKeyboard::note_size_relative_mod = Keyboard::PrimaryModifier;
 
 void
+ArdourKeyboard::find_bindings_files (map<string,string>& files)
+{
+	vector<std::string> found;
+	Searchpath spath = ardour_config_search_path();
+
+	find_files_matching_pattern (found, spath, string_compose ("*%1", Keyboard::binding_filename_suffix));
+
+	if (found.empty()) {
+		return;
+	}
+
+	for (vector<std::string>::iterator x = found.begin(); x != found.end(); ++x) {
+		std::string path(*x);
+		pair<string,string> namepath;
+		namepath.second = path;
+		namepath.first = PBD::basename_nosuffix (path);
+		files.insert (namepath);
+	}
+}
+
+void
 ArdourKeyboard::setup_keybindings ()
 {
 	using namespace ARDOUR_COMMAND_LINE;
-	string default_bindings = "mnemonic-us.bindings";
+	string default_bindings = string_compose ("%1%2", UIConfiguration::instance().get_default_bindings(), Keyboard::binding_filename_suffix);
 	vector<string> strs;
 
 	binding_files.clear ();
 
-	ARDOUR::find_bindings_files (binding_files);
+	find_bindings_files (binding_files);
 
 	/* set up the per-user bindings path */
 
 	string lowercase_program_name = downcase (string(PROGRAM_NAME));
 
-	user_keybindings_path = Glib::build_filename (user_config_directory(), lowercase_program_name + ".bindings");
+	user_keybindings_path = Glib::build_filename (user_config_directory(), lowercase_program_name + binding_filename_suffix);
 
 	if (Glib::file_test (user_keybindings_path, Glib::FILE_TEST_EXISTS)) {
 		std::pair<string,string> newpair;
@@ -84,11 +95,10 @@ ArdourKeyboard::setup_keybindings ()
 		binding_files.insert (newpair);
 	}
 
-	/* check to see if they gave a style name ("SAE", "ergonomic") or
-	   an actual filename (*.bindings)
+	/* check to see if they gave a style name ("ergonomic") or an actual filename (*.bindings)
 	*/
 
-	if (!keybindings_path.empty() && keybindings_path.find (".bindings") == string::npos) {
+	if (!keybindings_path.empty() && keybindings_path.find (binding_filename_suffix) == string::npos) {
 
 		// just a style name - allow user to
 		// specify the layout type.
@@ -109,7 +119,7 @@ ArdourKeyboard::setup_keybindings ()
 			keybindings_path += "-us";
 		}
 
-		keybindings_path += ".bindings";
+		keybindings_path += binding_filename_suffix;
 	}
 
 	if (keybindings_path.empty()) {
@@ -132,6 +142,8 @@ ArdourKeyboard::setup_keybindings ()
 		keybindings_path = default_bindings;
 	}
 
+	cerr << "KP is " << keybindings_path << endl;
+
 	while (true) {
 
 		if (!Glib::path_is_absolute (keybindings_path)) {
@@ -139,7 +151,7 @@ ArdourKeyboard::setup_keybindings ()
 			/* not absolute - look in the usual places */
 			std::string keybindings_file;
 
-			if ( ! find_file (ardour_config_search_path(), keybindings_path, keybindings_file)) {
+			if (!find_file (ardour_config_search_path(), keybindings_path, keybindings_file)) {
 
 				if (keybindings_path == default_bindings) {
 					error << string_compose (_("Default keybindings not found - %1 will be hard to use!"), PROGRAM_NAME) << endmsg;
@@ -178,12 +190,14 @@ ArdourKeyboard::setup_keybindings ()
 		}
 	}
 
+	info << string_compose (_("Loading keybindings from %1"), keybindings_path) << endmsg;
+
 	load_keybindings (keybindings_path);
 
-	/* catch changes */
+	/* catch changes made via some GTK mechanism */
 
-	GtkAccelMap* accelmap = gtk_accel_map_get();
-	g_signal_connect (accelmap, "changed", (GCallback) accel_map_changed, this);
+	// GtkAccelMap* accelmap = gtk_accel_map_get();
+	// g_signal_connect (accelmap, "changed", (GCallback) accel_map_changed, this);
 }
 
 XMLNode&
@@ -213,7 +227,7 @@ ArdourKeyboard::get_state (void)
 int
 ArdourKeyboard::set_state (const XMLNode& node, int version)
 {
-	const XMLProperty* prop;
+	XMLProperty const * prop;
 
 	if ((prop = node.property ("constraint-modifier")) != 0) {
 		sscanf (prop->value().c_str(), "%d", &constraint_mod);
diff --git a/gtk2_ardour/keyboard.h b/gtk2_ardour/keyboard.h
index 9ca6095..c6a05ab 100644
--- a/gtk2_ardour/keyboard.h
+++ b/gtk2_ardour/keyboard.h
@@ -20,6 +20,9 @@
 #ifndef __ardour_keyboard_h__
 #define __ardour_keyboard_h__
 
+#include <map>
+#include <string>
+
 #include "ardour/types.h"
 #include "gtkmm2ext/keyboard.h"
 
@@ -93,6 +96,8 @@ private:
 	static guint     fine_adjust_mod;
 	static guint     push_points_mod;
 	static guint     note_size_relative_mod;
+
+	void find_bindings_files (std::map<std::string,std::string>& files);
 };
 
 #endif /* __ardour_keyboard_h__ */
diff --git a/gtk2_ardour/keyeditor.cc b/gtk2_ardour/keyeditor.cc
index cbbbfaf..b19b6d5 100644
--- a/gtk2_ardour/keyeditor.cc
+++ b/gtk2_ardour/keyeditor.cc
@@ -22,6 +22,13 @@
 #endif
 
 #include <map>
+#include <fstream>
+#include <sstream>
+
+#include <boost/algorithm/string.hpp>
+
+#include <glib.h>
+#include <glib/gstdio.h>
 
 #include <gtkmm/stock.h>
 #include <gtkmm/label.h>
@@ -29,8 +36,11 @@
 #include <gtkmm/accelmap.h>
 #include <gtkmm/uimanager.h>
 
+#include "gtkmm2ext/bindings.h"
 #include "gtkmm2ext/utils.h"
 
+#include "pbd/error.h"
+#include "pbd/openuri.h"
 #include "pbd/strsplit.h"
 
 #include "ardour/filesystem_paths.h"
@@ -40,7 +50,7 @@
 #include "keyboard.h"
 #include "keyeditor.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace Gtk;
@@ -48,272 +58,515 @@ using namespace Gdk;
 using namespace PBD;
 
 using Gtkmm2ext::Keyboard;
+using Gtkmm2ext::Bindings;
+
+sigc::signal<void> KeyEditor::UpdateBindings;
+
+void bindings_collision_dialog (Gtk::Window& parent)
+{
+	ArdourDialog dialog (parent, _("Colliding keybindings"), true);
+	Label label (_("The key sequence is already bound. Please remove the other binding first."));
+
+	dialog.get_vbox()->pack_start (label, true, true);
+	dialog.add_button (_("Ok"), Gtk::RESPONSE_ACCEPT);
+	dialog.show_all ();
+	dialog.run();
+}
 
 KeyEditor::KeyEditor ()
 	: ArdourWindow (_("Key Bindings"))
 	, unbind_button (_("Remove shortcut"))
 	, unbind_box (BUTTONBOX_END)
-
+	, filter_entry (_("Search..."), true)
+	, filter_string("")
+	, print_button (_("Print"))
+	, sort_column(0)
+	, sort_type(Gtk::SORT_ASCENDING)
 {
-	last_keyval = 0;
 
-	model = TreeStore::create(columns);
+	notebook.signal_switch_page ().connect (sigc::mem_fun (*this, &KeyEditor::page_change));
 
-	view.set_model (model);
-	view.append_column (_("Action"), columns.action);
-	view.append_column (_("Shortcut"), columns.binding);
-	view.set_headers_visible (true);
-	view.get_selection()->set_mode (SELECTION_SINGLE);
-	view.set_reorderable (false);
-	view.set_size_request (500,300);
-	view.set_enable_search (false);
-	view.set_rules_hint (true);
-	view.set_name (X_("KeyEditorTree"));
-
-	view.get_selection()->signal_changed().connect (sigc::mem_fun (*this, &KeyEditor::action_selected));
-
-	scroller.add (view);
-	scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
-
-	vpacker.set_spacing (6);
-	vpacker.set_border_width (12);
-	vpacker.pack_start (scroller);
+	vpacker.pack_start (notebook, true, true);
 
-	if (!ARDOUR::Profile->get_sae()) {
+	Glib::RefPtr<Gdk::Pixbuf> icon = ARDOUR_UI_UTILS::get_icon ("search");
+	filter_entry.set_icon_from_pixbuf (icon);
+	filter_entry.set_icon_tooltip_text (_("Click to reset search string"));
+	filter_entry.signal_search_string_updated ().connect (sigc::mem_fun (*this, &KeyEditor::search_string_updated));
+	vpacker.pack_start (filter_entry, false, false);
 
-		Label* hint = manage (new Label (_("Select an action, then press the key(s) to (re)set its shortcut")));
-		hint->show ();
-		unbind_box.set_spacing (6);
-		unbind_box.pack_start (*hint, false, true);
-		unbind_box.pack_start (unbind_button, false, false);
-		unbind_button.signal_clicked().connect (sigc::mem_fun (*this, &KeyEditor::unbind));
+	Label* hint = manage (new Label (_("To remove a shortcut select an action then press this: ")));
+	hint->show ();
+	unbind_box.set_spacing (6);
+	unbind_box.pack_start (*hint, false, true);
+	unbind_box.pack_start (unbind_button, false, false);
+	unbind_button.signal_clicked().connect (sigc::mem_fun (*this, &KeyEditor::unbind));
 
-		vpacker.pack_start (unbind_box, false, false);
-		unbind_box.show ();
-		unbind_button.show ();
-
-	}
+	vpacker.pack_start (unbind_box, false, false);
+	unbind_box.show ();
+	unbind_button.show ();
 
 	reset_button.add (reset_label);
 	reset_label.set_markup (string_compose ("<span size=\"large\" weight=\"bold\">%1</span>", _("Reset Bindings to Defaults")));
 
+	print_button.signal_clicked().connect (sigc::mem_fun (*this, &KeyEditor::print));
+
 	reset_box.pack_start (reset_button, true, false);
+	reset_box.pack_start (print_button, true, false);
 	reset_box.show ();
 	reset_button.show ();
 	reset_label.show ();
+	print_button.show ();
 	reset_button.signal_clicked().connect (sigc::mem_fun (*this, &KeyEditor::reset));
 	vpacker.pack_start (reset_box, false, false);
 
 	add (vpacker);
 
-	view.show ();
-	scroller.show ();
-	vpacker.show ();
-
 	unbind_button.set_sensitive (false);
+	UpdateBindings.connect (sigc::mem_fun (*this, &KeyEditor::refresh));
 }
 
 void
-KeyEditor::unbind ()
+KeyEditor::add_tab (string const & name, Bindings& bindings)
 {
-	TreeModel::iterator i = view.get_selection()->get_selected();
+	Tab* t = new Tab (*this, name, &bindings);
 
-	unbind_button.set_sensitive (false);
+	if (t->populate () == 0) {
+		/* no bindings */
+		delete t;
+		return;
+	}
 
-	if (i != model->children().end()) {
-		string path = (*i)[columns.path];
+	tabs.push_back (t);
+	t->show_all ();
+	notebook.append_page (*t, name);
+}
 
-		if (!(*i)[columns.bindable]) {
-			return;
-		}
 
-		bool result = AccelMap::change_entry (path,
-						      0,
-						      (ModifierType) 0,
-						      true);
-		if (result) {
-			(*i)[columns.binding] = string ();
+void
+KeyEditor::remove_tab (string const &name)
+{
+	guint npages = notebook.get_n_pages ();
+
+	for (guint n = 0; n < npages; ++n) {
+		Widget* w = notebook.get_nth_page (n);
+		Tab* tab = dynamic_cast<Tab*> (w);
+		if (tab) {
+			if (tab->name == name) {
+				notebook.remove_page (*w);
+				return;
+			}
 		}
 	}
+	cerr << "Removed " << name << endl;
 }
 
 void
-KeyEditor::on_show ()
+KeyEditor::unbind ()
 {
-	populate ();
-	view.get_selection()->unselect_all ();
-	ArdourWindow::on_show ();
+	current_tab()->unbind ();
 }
 
 void
-KeyEditor::on_unmap ()
+KeyEditor::page_change (GtkNotebookPage*, guint)
 {
-	ArdourWindow::on_unmap ();
+	current_tab()->view.get_selection()->unselect_all ();
+	unbind_button.set_sensitive (false);
 }
 
-void
-KeyEditor::action_selected ()
+bool
+KeyEditor::Tab::key_press_event (GdkEventKey* ev)
 {
-	if (view.get_selection()->count_selected_rows() == 0) {
-		return;
+	if (view.get_selection()->count_selected_rows() != 1) {
+		return false;
 	}
 
-	TreeModel::iterator i = view.get_selection()->get_selected();
+	if (!ev->is_modifier) {
+		last_keyval = ev->keyval;
+	}
 
-	unbind_button.set_sensitive (false);
+	/* Don't let anything else handle the key press, because navigation
+	 * keys will be used by GTK to change the selection/treeview cursor
+	 * position
+	 */
 
-	if (i != model->children().end()) {
+	return true;
+}
 
-		string path = (*i)[columns.path];
+bool
+KeyEditor::Tab::key_release_event (GdkEventKey* ev)
+{
+	if (view.get_selection()->count_selected_rows() != 1) {
+		return false;
+	}
 
-		if (!(*i)[columns.bindable]) {
-			return;
-		}
+	if (last_keyval == 0) {
+		return false;
+	}
 
-		string binding = (*i)[columns.binding];
+	owner.current_tab()->bind (ev, last_keyval);
 
-		if (!binding.empty()) {
-			unbind_button.set_sensitive (true);
-		}
-	}
+	last_keyval = 0;
+	return true;
 }
 
-bool
-KeyEditor::on_key_press_event (GdkEventKey* ev)
+KeyEditor::Tab::Tab (KeyEditor& ke, string const & str, Bindings* b)
+	: owner (ke)
+	, name (str)
+	, bindings (b)
+	, last_keyval (0)
 {
-	if (!ev->is_modifier) {
-		last_keyval = ev->keyval;
-	}
-	return ArdourWindow::on_key_press_event (ev);
+	data_model = TreeStore::create(columns);
+	populate ();
+
+	filter = TreeModelFilter::create(data_model);
+	filter->set_visible_func (sigc::mem_fun (*this, &Tab::visible_func));
+
+	sorted_filter = TreeModelSort::create(filter);
+
+	view.set_model (sorted_filter);
+	view.append_column (_("Action"), columns.name);
+	view.append_column (_("Shortcut"), columns.binding);
+	view.set_headers_visible (true);
+	view.set_headers_clickable (true);
+	view.get_selection()->set_mode (SELECTION_SINGLE);
+	view.set_reorderable (false);
+	view.set_size_request (500,300);
+	view.set_enable_search (false);
+	view.set_rules_hint (true);
+	view.set_name (X_("KeyEditorTree"));
+
+	view.signal_cursor_changed().connect (sigc::mem_fun (*this, &Tab::action_selected));
+	view.signal_key_press_event().connect (sigc::mem_fun (*this, &Tab::key_press_event), false);
+	view.signal_key_release_event().connect (sigc::mem_fun (*this, &Tab::key_release_event), false);
+
+	view.get_column(0)->set_sort_column (columns.name);
+	view.get_column(1)->set_sort_column (columns.binding);
+	data_model->set_sort_column (owner.sort_column,  owner.sort_type);
+	data_model->signal_sort_column_changed().connect (sigc::mem_fun (*this, &Tab::sort_column_changed));
+
+	signal_map().connect (sigc::mem_fun (*this, &Tab::tab_mapped));
+
+	scroller.add (view);
+	scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
+
+	set_spacing (6);
+	set_border_width (12);
+	pack_start (scroller);
 }
 
-bool
-KeyEditor::on_key_release_event (GdkEventKey* ev)
+void
+KeyEditor::Tab::action_selected ()
 {
-	if (ARDOUR::Profile->get_sae() || last_keyval == 0) {
-		return false;
+	if (view.get_selection()->count_selected_rows() == 0) {
+		return;
 	}
 
-	TreeModel::iterator i = view.get_selection()->get_selected();
+	TreeModel::const_iterator it = view.get_selection()->get_selected();
 
-	if (i != model->children().end()) {
-		string path = (*i)[columns.path];
+	if (!it) {
+		return;
+	}
 
-		if (!(*i)[columns.bindable]) {
-			goto out;
-		}
+	if (!(*it)[columns.bindable]) {
+		owner.unbind_button.set_sensitive (false);
+		return;
+	}
 
-		GdkModifierType mod = (GdkModifierType)(Keyboard::RelevantModifierKeyMask & ev->state);
+	const string& binding = (*it)[columns.binding];
 
-		Gtkmm2ext::possibly_translate_keyval_to_make_legal_accelerator (ev->keyval);
-		Gtkmm2ext::possibly_translate_mod_to_make_legal_accelerator (mod);
+	if (!binding.empty()) {
+		owner.unbind_button.set_sensitive (true);
+	}
+}
+
+void
+KeyEditor::Tab::unbind ()
+{
+	const std::string& action_path = (*view.get_selection()->get_selected())[columns.path];
 
-		bool result = AccelMap::change_entry (path,
-						      last_keyval,
-						      Gdk::ModifierType(mod),
-						      true);
+	TreeModel::iterator it = find_action_path (data_model->children().begin(), data_model->children().end(),  action_path);
 
-		if (result) {
-			AccelKey key;
-			(*i)[columns.binding] = ActionManager::get_key_representation (path, key);
-			unbind_button.set_sensitive (true);
-		}
+	if (!it || !(*it)[columns.bindable]) {
+		return;
 	}
 
-  out:
-    last_keyval = 0;
-	return true;
+	bindings->remove (Gtkmm2ext::Bindings::Press,  action_path , true);
+	(*it)[columns.binding] = string ();
+
+	owner.unbind_button.set_sensitive (false);
 }
 
 void
-KeyEditor::populate ()
+KeyEditor::Tab::bind (GdkEventKey* release_event, guint pressed_key)
+{
+	const std::string& action_path = (*view.get_selection()->get_selected())[columns.path];
+	TreeModel::iterator it = find_action_path (data_model->children().begin(), data_model->children().end(),  action_path);
+
+	/* pressed key could be upper case if Shift was used. We want all
+	   single keys stored as their lower-case version, so ensure this
+	*/
+
+	pressed_key = gdk_keyval_to_lower (pressed_key);
+
+	if (!it || !(*it)[columns.bindable]) {
+		return;
+	}
+
+	GdkModifierType mod = (GdkModifierType)(Keyboard::RelevantModifierKeyMask & release_event->state);
+	Gtkmm2ext::KeyboardKey new_binding (mod, pressed_key);
+
+	if (bindings->is_bound (new_binding, Gtkmm2ext::Bindings::Press)) {
+		bindings_collision_dialog (owner);
+		return;
+	}
+
+	bool result = bindings->replace (new_binding, Gtkmm2ext::Bindings::Press, action_path);
+
+	if (result) {
+		(*it)[columns.binding] = gtk_accelerator_get_label (new_binding.key(), (GdkModifierType) new_binding.state());
+		owner.unbind_button.set_sensitive (true);
+	}
+}
+
+uint32_t
+KeyEditor::Tab::populate ()
 {
 	vector<string> paths;
 	vector<string> labels;
 	vector<string> tooltips;
 	vector<string> keys;
-	vector<AccelKey> bindings;
+	vector<Glib::RefPtr<Action> > actions;
 	typedef std::map<string,TreeIter> NodeMap;
 	NodeMap nodes;
 	NodeMap::iterator r;
 
-	ActionManager::get_all_actions (labels, paths, tooltips, keys, bindings);
+	bindings->get_all_actions (paths, labels, tooltips, keys, actions);
 
 	vector<string>::iterator k;
 	vector<string>::iterator p;
 	vector<string>::iterator t;
 	vector<string>::iterator l;
+	vector<Glib::RefPtr<Action> >::iterator a;
 
-	model->clear ();
+	data_model->clear ();
 
-	for (l = labels.begin(), k = keys.begin(), p = paths.begin(), t = tooltips.begin(); l != labels.end(); ++k, ++p, ++t, ++l) {
+	for (a = actions.begin(), l = labels.begin(), k = keys.begin(), p = paths.begin(), t = tooltips.begin(); l != labels.end(); ++k, ++p, ++t, ++l, ++a) {
 
 		TreeModel::Row row;
 		vector<string> parts;
 
-		parts.clear ();
-
 		split (*p, parts, '/');
 
-		if (parts.empty()) {
+		string category = parts[1];
+		string action_name = parts[2];
+
+		if (action_name.empty()) {
 			continue;
 		}
 
 		//kinda kludgy way to avoid displaying menu items as mappable
-		if ( parts[1] == _("Main_menu") )
-			continue;
-		if ( parts[1] == _("redirectmenu") )
-			continue;
-		if ( parts[1] == _("Editor_menus") )
-			continue;
-		if ( parts[1] == _("RegionList") )
-			continue;
-		if ( parts[1] == _("ProcessorMenu") )
+		if ((action_name.find ("Menu") == action_name.length() - 4) ||
+		    (action_name.find ("menu") == action_name.length() - 4) ||
+		    (action_name == _("RegionList"))) {
 			continue;
+		}
 
-		if ((r = nodes.find (parts[1])) == nodes.end()) {
+		if ((r = nodes.find (category)) == nodes.end()) {
 
-			/* top level is missing */
+			/* category/group is missing, so add it first */
 
 			TreeIter rowp;
 			TreeModel::Row parent;
-			rowp = model->append();
-			nodes[parts[1]] = rowp;
+			rowp = data_model->append();
+			nodes[category] = rowp;
 			parent = *(rowp);
-			parent[columns.action] = parts[1];
+			parent[columns.name] = category;
 			parent[columns.bindable] = false;
+			parent[columns.action] = *a;
 
-			row = *(model->append (parent.children()));
+			/* now set up the child row that we're about to fill
+			 * out with information
+			 */
+
+			row = *(data_model->append (parent.children()));
 
 		} else {
 
-			row = *(model->append ((*r->second)->children()));
+			/* category/group is present, so just add the child row */
+
+			row = *(data_model->append ((*r->second)->children()));
 
 		}
 
 		/* add this action */
 
+		/* use the "visible label" as the action name */
+
 		if (l->empty ()) {
-			row[columns.action] = *t;
+			/* no label, try using the tooltip instead */
+			row[columns.name] = *t;
 		} else {
-			row[columns.action] = *l;
+			row[columns.name] = *l;
 		}
-		row[columns.path] = (*p);
+		row[columns.path] = string_compose ("%1/%2", category, action_name);
 		row[columns.bindable] = true;
 
 		if (*k == ActionManager::unbound_string) {
 			row[columns.binding] = string();
 		} else {
-			row[columns.binding] = (*k);
+			row[columns.binding] = *k;
+		}
+		row[columns.action] = *a;
+	}
+
+	return data_model->children().size();
+}
+
+void
+KeyEditor::Tab::sort_column_changed ()
+{
+	int column;
+	SortType type;
+	if (data_model->get_sort_column_id (column, type)) {
+		owner.sort_column = column;
+		owner.sort_type = type;
+	}
+}
+
+void
+KeyEditor::Tab::tab_mapped ()
+{
+	data_model->set_sort_column (owner.sort_column,  owner.sort_type);
+	filter->refilter ();
+}
+
+bool
+KeyEditor::Tab::visible_func(const Gtk::TreeModel::const_iterator& iter) const
+{
+	if (!iter) {
+		return false;
+	}
+
+	// never filter when search string is empty or item is a category
+	if (owner.filter_string.empty () || !(*iter)[columns.bindable]) {
+		return true;
+	}
+
+	// search name
+	std::string name = (*iter)[columns.name];
+	boost::to_lower (name);
+	if (name.find (owner.filter_string) != std::string::npos) {
+		return true;
+	}
+
+	// search binding
+	std::string binding = (*iter)[columns.binding];
+	boost::to_lower (binding);
+	if (binding.find (owner.filter_string) != std::string::npos) {
+		return true;
+	}
+
+	return false;
+}
+
+TreeModel::iterator
+KeyEditor::Tab::find_action_path (TreeModel::const_iterator begin, TreeModel::const_iterator end, const std::string& action_path) const
+{
+	if (!begin) {
+		return end;
+	}
+
+	for (TreeModel::iterator it = begin; it != end; ++it) {
+		if (it->children()) {
+			TreeModel::iterator jt = find_action_path (it->children().begin(), it->children().end(), action_path);
+			if (jt != it->children().end()) {
+				return jt;
+			}
+		}
+		const std::string& path = (*it)[columns.path];
+		if (action_path.compare(path) == 0) {
+			return it;
 		}
 	}
+	return end;
 }
 
 void
 KeyEditor::reset ()
 {
 	Keyboard::the_keyboard().reset_bindings ();
-	populate ();
-	view.get_selection()->unselect_all ();
-	populate ();
+	refresh ();
+}
+
+void
+KeyEditor::refresh ()
+{
+	for (Tabs::iterator t = tabs.begin(); t != tabs.end(); ++t) {
+		(*t)->view.get_selection()->unselect_all ();
+		(*t)->populate ();
+	}
+}
+
+KeyEditor::Tab*
+KeyEditor::current_tab ()
+{
+	return dynamic_cast<Tab*> (notebook.get_nth_page (notebook.get_current_page()));
+}
+
+void
+KeyEditor::search_string_updated (const std::string& filter)
+{
+	filter_string = boost::to_lower_copy(filter);
+	KeyEditor::Tab* tab = current_tab ();
+	if (tab) {
+		tab->filter->refilter ();
+	}
+}
+
+void
+KeyEditor::print () const
+{
+	stringstream sstr;
+	Bindings::save_all_bindings_as_html (sstr);
+
+	if (sstr.str().empty()) {
+		return;
+	}
+
+
+	gchar* file_name;
+	GError *err = NULL;
+	gint fd;
+
+	if ((fd = g_file_open_tmp ("akprintXXXXXX.html", &file_name, &err)) < 0) {
+		if (err) {
+			error << string_compose (_("Could not open temporary file to print bindings (%1)"), err->message) << endmsg;
+			g_error_free (err);
+		}
+		return;
+	}
+
+#ifdef PLATFORM_WINDOWS
+	::close (fd);
+#endif
+
+	err = NULL;
+
+	if (!g_file_set_contents (file_name, sstr.str().c_str(), sstr.str().size(), &err)) {
+#ifndef PLATFORM_WINDOWS
+		::close (fd);
+#endif
+		g_unlink (file_name);
+		if (err) {
+			error << string_compose (_("Could not save bindings to file (%1)"), err->message) << endmsg;
+			g_error_free (err);
+		}
+		return;
+	}
+
+#ifndef PLATFORM_WINDOWS
+	::close (fd);
+#endif
+
+	PBD::open_uri (string_compose ("file:///%1", file_name));
 }
diff --git a/gtk2_ardour/keyeditor.h b/gtk2_ardour/keyeditor.h
index 14ae2b9..a566233 100644
--- a/gtk2_ardour/keyeditor.h
+++ b/gtk2_ardour/keyeditor.h
@@ -23,56 +23,107 @@
 #include <string>
 
 #include <gtkmm/buttonbox.h>
+#include <gtkmm/notebook.h>
+#include <gtkmm/scrolledwindow.h>
 #include <gtkmm/treeview.h>
 #include <gtkmm/treestore.h>
-#include <gtkmm/scrolledwindow.h>
+#include "gtkmm2ext/searchbar.h"
 
 #include "ardour_window.h"
 
+namespace Gtkmm2ext {
+	class Bindings;
+}
+
 class KeyEditor : public ArdourWindow
 {
   public:
 	KeyEditor ();
 
-  protected:
-	void on_show ();
-	void on_unmap ();
-	bool on_key_press_event (GdkEventKey*);
-	bool on_key_release_event (GdkEventKey*);
-
-  private:
-	struct KeyEditorColumns : public Gtk::TreeModel::ColumnRecord {
-	    KeyEditorColumns () {
-		    add (action);
-		    add (binding);
-		    add (path);
-		    add (bindable);
-	    }
-	    Gtk::TreeModelColumn<std::string> action;
-	    Gtk::TreeModelColumn<std::string> binding;
-	    Gtk::TreeModelColumn<std::string> path;
-	    Gtk::TreeModelColumn<bool> bindable;
+	void add_tab (std::string const &name, Gtkmm2ext::Bindings&);
+	void remove_tab (std::string const &name);
+
+	static sigc::signal<void> UpdateBindings;
+
+	private:
+	class Tab : public Gtk::VBox
+	{
+		public:
+		Tab (KeyEditor&, std::string const &name, Gtkmm2ext::Bindings*);
+
+		uint32_t populate ();
+		void unbind ();
+		void bind (GdkEventKey* release_event, guint pressed_key);
+		void action_selected ();
+		void sort_column_changed ();
+		void tab_mapped ();
+		bool visible_func(const Gtk::TreeModel::const_iterator& iter) const;
+
+		struct KeyEditorColumns : public Gtk::TreeModel::ColumnRecord {
+			KeyEditorColumns () {
+				add (name);
+				add (binding);
+				add (path);
+				add (bindable);
+				add (action);
+			}
+			Gtk::TreeModelColumn<std::string> name;
+			Gtk::TreeModelColumn<std::string> binding;
+			Gtk::TreeModelColumn<std::string> path;
+			Gtk::TreeModelColumn<bool> bindable;
+			Gtk::TreeModelColumn<Glib::RefPtr<Gtk::Action> > action;
+		};
+
+		Gtk::VBox vpacker;
+		/* give KeyEditor full access to these. This is just a helper
+		   class with no special semantics
+		*/
+
+		KeyEditor& owner;
+		std::string name;
+		Gtkmm2ext::Bindings* bindings;
+		Gtk::ScrolledWindow scroller;
+		Gtk::TreeView view;
+		Glib::RefPtr<Gtk::TreeStore> data_model;
+		Glib::RefPtr<Gtk::TreeModelFilter> filter;
+		Glib::RefPtr<Gtk::TreeModelSort> sorted_filter;
+		KeyEditorColumns columns;
+		guint last_keyval;
+
+		protected:
+		bool key_press_event (GdkEventKey*);
+		bool key_release_event (GdkEventKey*);
+		Gtk::TreeModel::iterator find_action_path (Gtk::TreeModel::const_iterator begin, Gtk::TreeModel::const_iterator end, const std::string& path) const;
 	};
 
-        Gtk::VBox vpacker;
-	Gtk::ScrolledWindow scroller;
-	Gtk::TreeView view;
-	Glib::RefPtr<Gtk::TreeStore> model;
-	KeyEditorColumns columns;
+	friend class Tab;
+
+	Gtk::VBox vpacker;
+	Gtk::Notebook notebook;
 	Gtk::Button unbind_button;
 	Gtk::HButtonBox unbind_box;
 	Gtk::HBox reset_box;
 	Gtk::Button reset_button;
 	Gtk::Label reset_label;
+	Gtkmm2ext::SearchBar filter_entry;
+	std::string filter_string;
+	Gtk::Button print_button;
 
-	void unbind ();
-
-	guint last_keyval;
+	typedef std::vector<Tab*> Tabs;
 
-	void action_selected ();
-	void populate ();
+	Tabs tabs;
+	Tab* current_tab();
 
+	void unbind ();
 	void reset ();
+	void refresh ();
+	void page_change (GtkNotebookPage*, guint);
+
+	unsigned int sort_column;
+	Gtk::SortType sort_type;
+	void toggle_sort_type ();
+	void search_string_updated (const std::string&);
+	void print () const;
 };
 
 #endif /* __ardour_gtk_key_editor_h__ */
diff --git a/gtk2_ardour/latency_gui.cc b/gtk2_ardour/latency_gui.cc
index d21a055..dbb3e08 100644
--- a/gtk2_ardour/latency_gui.cc
+++ b/gtk2_ardour/latency_gui.cc
@@ -27,7 +27,7 @@
 
 #include "latency_gui.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace PBD;
 using namespace Gtk;
diff --git a/gtk2_ardour/level_meter.cc b/gtk2_ardour/level_meter.cc
index d9f3130..c8c2133 100644
--- a/gtk2_ardour/level_meter.cc
+++ b/gtk2_ardour/level_meter.cc
@@ -32,7 +32,7 @@
 #include "public_editor.h"
 #include "ui_config.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 using namespace ARDOUR_UI_UTILS;
@@ -51,7 +51,9 @@ LevelMeterBase::LevelMeterBase (Session* s, PBD::EventLoop::InvalidationRecord*
 	, max_peak (minus_infinity())
 	, meter_type (MeterPeak)
 	, visible_meter_type (MeterType(0))
-	, visible_meter_count (0)
+	, midi_count (0)
+	, meter_count (0)
+	, max_visible_meters (0)
 	, color_changed (false)
 {
 	set_session (s);
@@ -230,7 +232,18 @@ LevelMeterBase::hide_all_meters ()
 			(*i).packed = false;
 		}
 	}
-	visible_meter_count = 0;
+	meter_count = 0;
+}
+
+void
+LevelMeterBase::set_max_audio_meter_count (uint32_t cnt)
+{
+	if (cnt == max_visible_meters) {
+		return;
+	}
+	color_changed = true; // force re-setup
+	max_visible_meters = cnt;
+	setup_meters (meter_length, regular_meter_width, thin_meter_width);
 }
 
 void
@@ -242,7 +255,7 @@ LevelMeterBase::setup_meters (int len, int initial_width, int thin_width)
  		return; /* do it later or never */
  	}
 
-	int32_t nmidi = _meter->input_streams().n_midi();
+	uint32_t nmidi = _meter->input_streams().n_midi();
 	uint32_t nmeters = _meter->input_streams().n_total();
 	regular_meter_width = initial_width;
 	thin_meter_width = thin_width;
@@ -264,7 +277,8 @@ LevelMeterBase::setup_meters (int len, int initial_width, int thin_width)
 	width = rint (width * UIConfiguration::instance().get_ui_scale());
 
 	if (   meters.size() > 0
-	    && nmeters == visible_meter_count
+	    && nmidi == midi_count
+	    && nmeters == meter_count
 	    && meters[0].width == width
 	    && meters[0].length == len
 	    && !color_changed
@@ -277,7 +291,7 @@ LevelMeterBase::setup_meters (int len, int initial_width, int thin_width)
 			(meters.size() > 0) ? "yes" : "no",
 			(meters.size() > 0 &&  meters[0].width == width) ? "yes" : "no",
 			(meters.size() > 0 &&  meters[0].length == len) ? "yes" : "no",
-			(nmeters == visible_meter_count) ? "yes" : "no",
+			(nmeters == meter_count) ? "yes" : "no",
 			(meter_type == visible_meter_type) ? "yes" : "no",
 			!color_changed ? "yes" : "no"
 			);
@@ -438,7 +452,7 @@ LevelMeterBase::setup_meters (int len, int initial_width, int thin_width)
 				}
 			}
 		}
-		if (meters[n].width != width || meters[n].length != len || color_changed || meter_type != visible_meter_type) {
+		if (meters[n].width != width || meters[n].length != len || color_changed || meter_type != visible_meter_type || nmidi != midi_count) {
 			bool hl = meters[n].meter ? meters[n].meter->get_highlight() : false;
 			meters[n].packed = false;
 			delete meters[n].meter;
@@ -459,13 +473,18 @@ LevelMeterBase::setup_meters (int len, int initial_width, int thin_width)
 
 		//pack_end (*meters[n].meter, false, false);
 		mtr_pack (*meters[n].meter);
-		meters[n].meter->show_all ();
 		meters[n].packed = true;
+		if (max_visible_meters == 0 || (uint32_t) n < max_visible_meters + nmidi) {
+			meters[n].meter->show_all ();
+		} else {
+			meters[n].meter->hide ();
+		}
 	}
 	//show();
 	color_changed = false;
 	visible_meter_type = meter_type;
-	visible_meter_count = nmeters;
+	midi_count = nmidi;
+	meter_count = nmeters;
 }
 
 void
diff --git a/gtk2_ardour/level_meter.h b/gtk2_ardour/level_meter.h
index a7a64d7..d5fb62c 100644
--- a/gtk2_ardour/level_meter.h
+++ b/gtk2_ardour/level_meter.h
@@ -65,6 +65,7 @@ class LevelMeterBase : public ARDOUR::SessionHandlePtr, virtual public sigc::tra
 	void clear_meters (bool reset_highlight = true);
 	void hide_meters ();
 	void setup_meters (int len=0, int width=3, int thin=2);
+	void set_max_audio_meter_count (uint32_t cnt = 0);
 
 	void set_type (ARDOUR::MeterType);
 	ARDOUR::MeterType get_type () { return meter_type; }
@@ -108,7 +109,9 @@ class LevelMeterBase : public ARDOUR::SessionHandlePtr, virtual public sigc::tra
 	float                  max_peak;
 	ARDOUR::MeterType      meter_type;
 	ARDOUR::MeterType      visible_meter_type;
-	uint32_t               visible_meter_count;
+	uint32_t               midi_count;
+	uint32_t               meter_count;
+	uint32_t               max_visible_meters;
 
 	PBD::ScopedConnection _configuration_connection;
 	PBD::ScopedConnection _meter_type_connection;
diff --git a/gtk2_ardour/linux_vst_gui_support.cc b/gtk2_ardour/linux_vst_gui_support.cc
index 37f046e..a2f637a 100644
--- a/gtk2_ardour/linux_vst_gui_support.cc
+++ b/gtk2_ardour/linux_vst_gui_support.cc
@@ -56,7 +56,7 @@ static VSTState * vstfx_first = NULL;
 
 const char magic[] = "VSTFX Plugin State v002";
 
-static int gui_quit = 0;
+static volatile int gui_quit = 0;
 
 /*This will be our connection to X*/
 
@@ -471,7 +471,7 @@ again:
 			clock1 = g_get_monotonic_time();
 		}
 
-		if (may_sleep && elapsed_time_ms + 1 < LXVST_sched_timer_interval) {
+		if (!gui_quit && may_sleep && elapsed_time_ms + 1 < LXVST_sched_timer_interval) {
 			Glib::usleep(1000 * (LXVST_sched_timer_interval - elapsed_time_ms - 1));
 		}
 	}
@@ -487,6 +487,8 @@ normally started in globals.cc*/
 
 int vstfx_init (void* ptr)
 {
+	assert (gui_quit == 0);
+	pthread_mutex_init (&plugin_mutex, NULL);
 
 	int thread_create_result;
 
@@ -553,7 +555,11 @@ void vstfx_exit()
 	/*We need to pthread_join the gui_thread here so
 	we know when it has stopped*/
 
+	// BEWARE: some Plugin GUIs can crash if the thread local storage is free()d
+	// after the shared library containing the destructor is already dl-closed.
+	// (e.g u-he LXVST GUI, crash in __nptl_deallocate_tsd) :(
 	pthread_join(LXVST_gui_event_thread, NULL);
+	pthread_mutex_destroy (&plugin_mutex);
 }
 
 /*Adds a new plugin (VSTFX) instance to the linked list*/
@@ -689,7 +695,7 @@ vstfx_launch_editor (VSTState* vstfx)
 		return 0;
 
 	Window parent_window;
-	struct ERect* er;
+	struct ERect* er = NULL;
 
 	int x_size = 1;
 	int y_size = 1;
@@ -724,11 +730,15 @@ vstfx_launch_editor (VSTState* vstfx)
 
 	vstfx->plugin->dispatcher (vstfx->plugin, effEditGetRect, 0, 0, &er, 0 );
 
-	x_size = er->right - er->left;
-	y_size = er->bottom - er->top;
+	if (er) {
+		// Don't crash is plugin does not implement effEditGetRect
+		// it'll result in 1x1 px window but that's not our problem :)
+		x_size = er->right - er->left;
+		y_size = er->bottom - er->top;
+	}
 
-	vstfx->width =  x_size;
-	vstfx->height =  y_size;
+	vstfx->width = x_size;
+	vstfx->height = y_size;
 
 	XResizeWindow(LXVST_XDisplay, parent_window, x_size, y_size);
 
diff --git a/gtk2_ardour/location_ui.cc b/gtk2_ardour/location_ui.cc
index 4a2fc45..76111a4 100644
--- a/gtk2_ardour/location_ui.cc
+++ b/gtk2_ardour/location_ui.cc
@@ -37,7 +37,7 @@
 #include "tooltips.h"
 #include "ui_config.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
@@ -48,155 +48,155 @@ using namespace Gtkmm2ext;
 
 LocationEditRow::LocationEditRow(Session * sess, Location * loc, int32_t num)
 	: SessionHandlePtr (0) /* explicitly set below */
-        , location(0)
-        , item_table (1, 6, false)
-        , start_clock (X_("locationstart"), true, "", true, false)
+	, location(0)
+	, item_table (1, 6, false)
+	, start_clock (X_("locationstart"), true, "", true, false)
 	, start_to_playhead_button (_("Use PH"))
-        , end_clock (X_("locationend"), true, "", true, false)
+	, locate_to_start_button (_("Goto"))
+	, end_clock (X_("locationend"), true, "", true, false)
 	, end_to_playhead_button (_("Use PH"))
-        , length_clock (X_("locationlength"), true, "", true, false, true)
-        , cd_check_button (_("CD"))
-        , hide_check_button (_("Hide"))
-        , lock_check_button (_("Lock"))
-        , glue_check_button (_("Glue"))
-        , _clock_group (0)
+	, locate_to_end_button (_("Goto"))
+	, length_clock (X_("locationlength"), true, "", true, false, true)
+	, cd_check_button (_("CD"))
+	, hide_check_button (_("Hide"))
+	, lock_check_button (_("Lock"))
+	, glue_check_button (_("Glue"))
+	, _clock_group (0)
 {
-         i_am_the_modifier = 0;
-
-         remove_button.set_image (*manage (new Image (Stock::REMOVE, Gtk::ICON_SIZE_MENU)));
-
-	 start_to_playhead_button.set_name ("LocationEditCdButton");
-	 end_to_playhead_button.set_name ("LocationEditCdButton");
-
-         number_label.set_name ("LocationEditNumberLabel");
-         name_label.set_name ("LocationEditNameLabel");
-         name_entry.set_name ("LocationEditNameEntry");
-         cd_check_button.set_name ("LocationEditCdButton");
-         hide_check_button.set_name ("LocationEditHideButton");
-         lock_check_button.set_name ("LocationEditLockButton");
-         glue_check_button.set_name ("LocationEditGlueButton");
-         remove_button.set_name ("LocationEditRemoveButton");
-         isrc_label.set_name ("LocationEditNumberLabel");
-         isrc_entry.set_name ("LocationEditNameEntry");
-         scms_check_button.set_name ("LocationEditCdButton");
-         preemph_check_button.set_name ("LocationEditCdButton");
-         performer_label.set_name ("LocationEditNumberLabel");
-         performer_entry.set_name ("LocationEditNameEntry");
-         composer_label.set_name ("LocationEditNumberLabel");
-         composer_entry.set_name ("LocationEditNameEntry");
-
-         isrc_label.set_text (X_("ISRC:"));
-         performer_label.set_text (_("Performer:"));
-         composer_label.set_text (_("Composer:"));
-	 scms_label.set_text (X_("SCMS"));
-	 preemph_label.set_text (_("Pre-Emphasis"));
-
-         isrc_entry.set_size_request (112, -1);
-         isrc_entry.set_max_length(12);
-         isrc_entry.set_editable (true);
-
-         performer_entry.set_size_request (100, -1);
-         performer_entry.set_editable (true);
-
-         composer_entry.set_size_request (100, -1);
-         composer_entry.set_editable (true);
-
-         name_label.set_alignment (0, 0.5);
-
-	 Gtk::HBox* front_spacing = manage (new HBox);
-	 front_spacing->set_size_request (20, -1);
-	 Gtk::HBox* mid_spacing = manage (new HBox);
-	 mid_spacing->set_size_request (20, -1);
-
-	 cd_track_details_hbox.set_spacing (4);
-	 cd_track_details_hbox.pack_start (*front_spacing, false, false);
-         cd_track_details_hbox.pack_start (isrc_label, false, false);
-         cd_track_details_hbox.pack_start (isrc_entry, false, false);
-         cd_track_details_hbox.pack_start (performer_label, false, false);
-         cd_track_details_hbox.pack_start (performer_entry, true, true);
-         cd_track_details_hbox.pack_start (composer_label, false, false);
-         cd_track_details_hbox.pack_start (composer_entry, true, true);
-	 cd_track_details_hbox.pack_start (*mid_spacing, false, false);
-         cd_track_details_hbox.pack_start (scms_label, false, false);
-         cd_track_details_hbox.pack_start (scms_check_button, false, false);
-         cd_track_details_hbox.pack_start (preemph_label, false, false);
-         cd_track_details_hbox.pack_start (preemph_check_button, false, false);
-
-         isrc_entry.signal_changed().connect (sigc::mem_fun(*this, &LocationEditRow::isrc_entry_changed));
-         performer_entry.signal_changed().connect (sigc::mem_fun(*this, &LocationEditRow::performer_entry_changed));
-         composer_entry.signal_changed().connect (sigc::mem_fun(*this, &LocationEditRow::composer_entry_changed));
-         scms_check_button.signal_toggled().connect(sigc::mem_fun(*this, &LocationEditRow::scms_toggled));
-         preemph_check_button.signal_toggled().connect(sigc::mem_fun(*this, &LocationEditRow::preemph_toggled));
-
-         set_session (sess);
-
-	 start_hbox.set_spacing (2);
-         start_hbox.pack_start (start_clock, false, false);
-	 start_hbox.pack_start (start_to_playhead_button, false, false);
-
-         /* this is always in this location, no matter what the location is */
-
-	 VBox *rbox = manage (new VBox);
-	 rbox->pack_start (remove_button, false, false);
-
-	 item_table.attach (*rbox, 0, 1, 0, 1, FILL, Gtk::AttachOptions (0), 4, 0);
-         item_table.attach (start_hbox, 2, 3, 0, 1, FILL, Gtk::AttachOptions(0), 4, 0);
-
-	 start_to_playhead_button.signal_clicked().connect (sigc::bind (sigc::mem_fun (*this, &LocationEditRow::to_playhead_button_pressed), LocStart));
-         start_clock.ValueChanged.connect (sigc::bind (sigc::mem_fun (*this, &LocationEditRow::clock_changed), LocStart));
-	 start_clock.signal_button_press_event().connect (sigc::bind (sigc::mem_fun (*this, &LocationEditRow::locate_to_clock), &start_clock), false);
-
-	 end_hbox.set_spacing (2);
-         end_hbox.pack_start (end_clock, false, false);
-	 end_hbox.pack_start (end_to_playhead_button, false, false);
-
-	 end_to_playhead_button.signal_clicked().connect (sigc::bind (sigc::mem_fun (*this, &LocationEditRow::to_playhead_button_pressed), LocEnd));
-         end_clock.ValueChanged.connect (sigc::bind (sigc::mem_fun (*this, &LocationEditRow::clock_changed), LocEnd));
-	 end_clock.signal_button_press_event().connect (sigc::bind (sigc::mem_fun (*this, &LocationEditRow::locate_to_clock), &end_clock), false);
-
-         length_clock.ValueChanged.connect (sigc::bind ( sigc::mem_fun(*this, &LocationEditRow::clock_changed), LocLength));
-
-         cd_check_button.signal_toggled().connect(sigc::mem_fun(*this, &LocationEditRow::cd_toggled));
-         hide_check_button.signal_toggled().connect(sigc::mem_fun(*this, &LocationEditRow::hide_toggled));
-         lock_check_button.signal_toggled().connect(sigc::mem_fun(*this, &LocationEditRow::lock_toggled));
-         glue_check_button.signal_toggled().connect(sigc::mem_fun(*this, &LocationEditRow::glue_toggled));
-
-         remove_button.signal_clicked().connect(sigc::mem_fun(*this, &LocationEditRow::remove_button_pressed));
-
-         pack_start(item_table, true, true);
-
-         set_location (loc);
-         set_number (num);
-         cd_toggled(); // show/hide cd-track details
- }
-
- LocationEditRow::~LocationEditRow()
- {
-         if (location) {
-                 connections.drop_connections ();
-         }
-
-         if (_clock_group) {
-                 _clock_group->remove (start_clock);
-                 _clock_group->remove (end_clock);
-                 _clock_group->remove (length_clock);
-         }
- }
-
- void
- LocationEditRow::set_clock_group (ClockGroup& cg)
- {
-         if (_clock_group) {
-                 _clock_group->remove (start_clock);
-                 _clock_group->remove (end_clock);
-                 _clock_group->remove (length_clock);
-         }
-
-         _clock_group = &cg;
-
-         _clock_group->add (start_clock);
-         _clock_group->add (end_clock);
-         _clock_group->add (length_clock);
+	i_am_the_modifier = 0;
+
+	remove_button.set_icon (ArdourIcon::CloseCross);
+	remove_button.set_events (remove_button.get_events() & ~(Gdk::ENTER_NOTIFY_MASK|Gdk::LEAVE_NOTIFY_MASK));
+
+	number_label.set_name ("LocationEditNumberLabel");
+	name_label.set_name ("LocationEditNameLabel");
+	name_entry.set_name ("LocationEditNameEntry");
+	cd_check_button.set_name ("LocationEditCdButton");
+	hide_check_button.set_name ("LocationEditHideButton");
+	lock_check_button.set_name ("LocationEditLockButton");
+	glue_check_button.set_name ("LocationEditGlueButton");
+	isrc_label.set_name ("LocationEditNumberLabel");
+	isrc_entry.set_name ("LocationEditNameEntry");
+	scms_check_button.set_name ("LocationEditCdButton");
+	preemph_check_button.set_name ("LocationEditCdButton");
+	performer_label.set_name ("LocationEditNumberLabel");
+	performer_entry.set_name ("LocationEditNameEntry");
+	composer_label.set_name ("LocationEditNumberLabel");
+	composer_entry.set_name ("LocationEditNameEntry");
+
+	isrc_label.set_text (X_("ISRC:"));
+	performer_label.set_text (_("Performer:"));
+	composer_label.set_text (_("Composer:"));
+	scms_label.set_text (X_("SCMS"));
+	preemph_label.set_text (_("Pre-Emphasis"));
+
+	isrc_entry.set_size_request (112, -1);
+	isrc_entry.set_max_length(12);
+	isrc_entry.set_editable (true);
+
+	performer_entry.set_size_request (100, -1);
+	performer_entry.set_editable (true);
+
+	composer_entry.set_size_request (100, -1);
+	composer_entry.set_editable (true);
+
+	name_label.set_alignment (0, 0.5);
+
+	Gtk::HBox* front_spacing = manage (new HBox);
+	front_spacing->set_size_request (20, -1);
+	Gtk::HBox* mid_spacing = manage (new HBox);
+	mid_spacing->set_size_request (20, -1);
+
+	cd_track_details_hbox.set_spacing (4);
+	cd_track_details_hbox.pack_start (*front_spacing, false, false);
+	cd_track_details_hbox.pack_start (isrc_label, false, false);
+	cd_track_details_hbox.pack_start (isrc_entry, false, false);
+	cd_track_details_hbox.pack_start (performer_label, false, false);
+	cd_track_details_hbox.pack_start (performer_entry, true, true);
+	cd_track_details_hbox.pack_start (composer_label, false, false);
+	cd_track_details_hbox.pack_start (composer_entry, true, true);
+	cd_track_details_hbox.pack_start (*mid_spacing, false, false);
+	cd_track_details_hbox.pack_start (scms_label, false, false);
+	cd_track_details_hbox.pack_start (scms_check_button, false, false);
+	cd_track_details_hbox.pack_start (preemph_label, false, false);
+	cd_track_details_hbox.pack_start (preemph_check_button, false, false);
+
+	isrc_entry.signal_changed().connect (sigc::mem_fun(*this, &LocationEditRow::isrc_entry_changed));
+	performer_entry.signal_changed().connect (sigc::mem_fun(*this, &LocationEditRow::performer_entry_changed));
+	composer_entry.signal_changed().connect (sigc::mem_fun(*this, &LocationEditRow::composer_entry_changed));
+	scms_check_button.signal_toggled().connect(sigc::mem_fun(*this, &LocationEditRow::scms_toggled));
+	preemph_check_button.signal_toggled().connect(sigc::mem_fun(*this, &LocationEditRow::preemph_toggled));
+
+	set_session (sess);
+
+	start_hbox.set_spacing (2);
+	start_hbox.pack_start (locate_to_start_button, false, false);
+	start_hbox.pack_start (start_clock, false, false);
+	start_hbox.pack_start (start_to_playhead_button, false, false);
+
+	/* this is always in this location, no matter what the location is */
+
+	item_table.attach (remove_button, 8, 9, 0, 1, SHRINK, SHRINK, 4, 1);
+	item_table.attach (start_hbox, 0, 1, 0, 1, FILL, Gtk::AttachOptions(0), 4, 0);
+
+	start_to_playhead_button.signal_clicked.connect (sigc::bind (sigc::mem_fun (*this, &LocationEditRow::to_playhead_button_pressed), LocStart));
+	locate_to_start_button.signal_clicked.connect (sigc::bind (sigc::mem_fun (*this, &LocationEditRow::locate_button_pressed), LocStart));
+	start_clock.ValueChanged.connect (sigc::bind (sigc::mem_fun (*this, &LocationEditRow::clock_changed), LocStart));
+	start_clock.signal_button_press_event().connect (sigc::bind (sigc::mem_fun (*this, &LocationEditRow::locate_to_clock), &start_clock), false);
+
+	end_hbox.set_spacing (2);
+	end_hbox.pack_start (locate_to_end_button, false, false);
+	end_hbox.pack_start (end_clock, false, false);
+	end_hbox.pack_start (end_to_playhead_button, false, false);
+
+	end_to_playhead_button.signal_clicked.connect (sigc::bind (sigc::mem_fun (*this, &LocationEditRow::to_playhead_button_pressed), LocEnd));
+	locate_to_end_button.signal_clicked.connect (sigc::bind (sigc::mem_fun (*this, &LocationEditRow::locate_button_pressed), LocEnd));
+	end_clock.ValueChanged.connect (sigc::bind (sigc::mem_fun (*this, &LocationEditRow::clock_changed), LocEnd));
+	end_clock.signal_button_press_event().connect (sigc::bind (sigc::mem_fun (*this, &LocationEditRow::locate_to_clock), &end_clock), false);
+
+	length_clock.ValueChanged.connect (sigc::bind ( sigc::mem_fun(*this, &LocationEditRow::clock_changed), LocLength));
+
+	cd_check_button.signal_toggled().connect(sigc::mem_fun(*this, &LocationEditRow::cd_toggled));
+	hide_check_button.signal_toggled().connect(sigc::mem_fun(*this, &LocationEditRow::hide_toggled));
+	lock_check_button.signal_toggled().connect(sigc::mem_fun(*this, &LocationEditRow::lock_toggled));
+	glue_check_button.signal_toggled().connect(sigc::mem_fun(*this, &LocationEditRow::glue_toggled));
+
+	remove_button.signal_clicked.connect(sigc::mem_fun(*this, &LocationEditRow::remove_button_pressed));
+
+	pack_start(item_table, true, true);
+
+	set_location (loc);
+	set_number (num);
+	cd_toggled(); // show/hide cd-track details
+}
+
+LocationEditRow::~LocationEditRow()
+{
+	if (location) {
+		connections.drop_connections ();
+	}
+
+	if (_clock_group) {
+		_clock_group->remove (start_clock);
+		_clock_group->remove (end_clock);
+		_clock_group->remove (length_clock);
+	}
+}
+
+void
+LocationEditRow::set_clock_group (ClockGroup& cg)
+{
+	if (_clock_group) {
+		_clock_group->remove (start_clock);
+		_clock_group->remove (end_clock);
+		_clock_group->remove (length_clock);
+	}
+
+	_clock_group = &cg;
+
+	_clock_group->add (start_clock);
+	_clock_group->add (end_clock);
+	_clock_group->add (length_clock);
 }
 
 void
@@ -239,9 +239,9 @@ LocationEditRow::set_location (Location *loc)
 	++i_am_the_modifier;
 
 	if (!hide_check_button.get_parent()) {
-		item_table.attach (hide_check_button, 6, 7, 0, 1, FILL, Gtk::FILL, 4, 0);
-		item_table.attach (lock_check_button, 7, 8, 0, 1, FILL, Gtk::FILL, 4, 0);
-		item_table.attach (glue_check_button, 8, 9, 0, 1, FILL, Gtk::FILL, 4, 0);
+		item_table.attach (hide_check_button, 5, 6, 0, 1, FILL, Gtk::FILL, 4, 0);
+		item_table.attach (lock_check_button, 6, 7, 0, 1, FILL, Gtk::FILL, 4, 0);
+		item_table.attach (glue_check_button, 7, 8, 0, 1, FILL, Gtk::FILL, 4, 0);
 	}
 	hide_check_button.set_active (location->is_hidden());
 	lock_check_button.set_active (location->locked());
@@ -256,7 +256,7 @@ LocationEditRow::set_location (Location *loc)
 		remove_button.hide ();
 
 		if (!name_label.get_parent()) {
-			item_table.attach (name_label, 1, 2, 0, 1, FILL, FILL, 4, 0);
+			item_table.attach (name_label, 2, 3, 0, 1, EXPAND|FILL, FILL, 4, 0);
 		}
 
 		name_label.show();
@@ -269,12 +269,12 @@ LocationEditRow::set_location (Location *loc)
 		name_entry.signal_changed().connect (sigc::mem_fun(*this, &LocationEditRow::name_entry_changed));
 
 		if (!name_entry.get_parent()) {
-			item_table.attach (name_entry, 1, 2, 0, 1, FILL | EXPAND, FILL, 4, 0);
+			item_table.attach (name_entry, 2, 3, 0, 1, FILL | EXPAND, FILL, 4, 0);
 		}
 		name_entry.show();
 
 		if (!cd_check_button.get_parent()) {
-			item_table.attach (cd_check_button, 5, 6, 0, 1, FILL, Gtk::AttachOptions (0), 4, 0);
+			item_table.attach (cd_check_button, 4, 5, 0, 1, FILL, Gtk::AttachOptions (0), 4, 0);
 		}
 
 		if (location->is_session_range()) {
@@ -300,10 +300,10 @@ LocationEditRow::set_location (Location *loc)
 
 	if (!location->is_mark()) {
 		if (!end_hbox.get_parent()) {
-			item_table.attach (end_hbox, 3, 4, 0, 1, FILL, Gtk::AttachOptions (0), 4, 0);
+			item_table.attach (end_hbox, 1, 2, 0, 1, FILL, Gtk::AttachOptions (0), 4, 0);
 		}
 		if (!length_clock.get_parent()) {
-			end_hbox.pack_start (length_clock, false, false);
+			end_hbox.pack_start (length_clock, false, false, 4);
 		}
 
 		end_clock.set (location->end(), true);
@@ -316,20 +316,20 @@ LocationEditRow::set_location (Location *loc)
 			show_cd_track_details ();
 		}
 
-		set_tooltip (remove_button, _("Remove this range"));
+		set_tooltip (&remove_button, _("Remove this range"));
 		set_tooltip (start_clock, _("Start time - middle click to locate here"));
 		set_tooltip (end_clock, _("End time - middle click to locate here"));
 		set_tooltip (length_clock, _("Length"));
 
-		set_tooltip (start_to_playhead_button, _("Set range start from playhead location"));
-		set_tooltip (end_to_playhead_button, _("Set range end from playhead location"));
+		set_tooltip (&start_to_playhead_button, _("Set range start from playhead location"));
+		set_tooltip (&end_to_playhead_button, _("Set range end from playhead location"));
 
 	} else {
 
-		set_tooltip (remove_button, _("Remove this marker"));
+		set_tooltip (&remove_button, _("Remove this marker"));
 		set_tooltip (start_clock, _("Position - middle click to locate here"));
 
-		set_tooltip (start_to_playhead_button, _("Set marker time from playhead location"));
+		set_tooltip (&start_to_playhead_button, _("Set marker time from playhead location"));
 
 		end_clock.hide();
 		length_clock.hide();
@@ -339,21 +339,21 @@ LocationEditRow::set_location (Location *loc)
 
 	--i_am_the_modifier;
 
-        /* connect to per-location signals, since this row only cares about this location */
+	/* connect to per-location signals, since this row only cares about this location */
 
 	location->NameChanged.connect (connections, invalidator (*this), boost::bind (&LocationEditRow::name_changed, this), gui_context());
-        location->StartChanged.connect (connections, invalidator (*this), boost::bind (&LocationEditRow::start_changed, this), gui_context());
-        location->EndChanged.connect (connections, invalidator (*this), boost::bind (&LocationEditRow::end_changed, this), gui_context());
-        location->Changed.connect (connections, invalidator (*this), boost::bind (&LocationEditRow::location_changed, this), gui_context());
-        location->FlagsChanged.connect (connections, invalidator (*this), boost::bind (&LocationEditRow::flags_changed, this), gui_context());
-        location->LockChanged.connect (connections, invalidator (*this), boost::bind (&LocationEditRow::lock_changed, this), gui_context());
-        location->PositionLockStyleChanged.connect (connections, invalidator (*this), boost::bind (&LocationEditRow::position_lock_style_changed, this), gui_context());
+	location->StartChanged.connect (connections, invalidator (*this), boost::bind (&LocationEditRow::start_changed, this), gui_context());
+	location->EndChanged.connect (connections, invalidator (*this), boost::bind (&LocationEditRow::end_changed, this), gui_context());
+	location->Changed.connect (connections, invalidator (*this), boost::bind (&LocationEditRow::location_changed, this), gui_context());
+	location->FlagsChanged.connect (connections, invalidator (*this), boost::bind (&LocationEditRow::flags_changed, this), gui_context());
+	location->LockChanged.connect (connections, invalidator (*this), boost::bind (&LocationEditRow::lock_changed, this), gui_context());
+	location->PositionLockStyleChanged.connect (connections, invalidator (*this), boost::bind (&LocationEditRow::position_lock_style_changed, this), gui_context());
 }
 
 void
 LocationEditRow::name_entry_changed ()
 {
-	ENSURE_GUI_THREAD (*this, &LocationEditRow::name_entry_changed)
+	ENSURE_GUI_THREAD (*this, &LocationEditRow::name_entry_changed);
 
 	if (i_am_the_modifier || !location) {
 		return;
@@ -366,44 +366,44 @@ LocationEditRow::name_entry_changed ()
 void
 LocationEditRow::isrc_entry_changed ()
 {
-	ENSURE_GUI_THREAD (*this, &LocationEditRow::isrc_entry_changed)
+	ENSURE_GUI_THREAD (*this, &LocationEditRow::isrc_entry_changed);
 
 	if (i_am_the_modifier || !location) return;
 
 	if (isrc_entry.get_text() != "" ) {
 
-	  location->cd_info["isrc"] = isrc_entry.get_text();
+		location->cd_info["isrc"] = isrc_entry.get_text();
 
 	} else {
-	  location->cd_info.erase("isrc");
+		location->cd_info.erase("isrc");
 	}
 }
 
 void
 LocationEditRow::performer_entry_changed ()
 {
-	ENSURE_GUI_THREAD (*this, &LocationEditRow::performer_entry_changed)
+	ENSURE_GUI_THREAD (*this, &LocationEditRow::performer_entry_changed);
 
 	if (i_am_the_modifier || !location) return;
 
 	if (performer_entry.get_text() != "") {
-	  location->cd_info["performer"] = performer_entry.get_text();
+		location->cd_info["performer"] = performer_entry.get_text();
 	} else {
-	  location->cd_info.erase("performer");
+		location->cd_info.erase("performer");
 	}
 }
 
 void
 LocationEditRow::composer_entry_changed ()
 {
-	ENSURE_GUI_THREAD (*this, &LocationEditRow::composer_entry_changed)
+	ENSURE_GUI_THREAD (*this, &LocationEditRow::composer_entry_changed);
 
 	if (i_am_the_modifier || !location) return;
 
 	if (composer_entry.get_text() != "") {
-	location->cd_info["composer"] = composer_entry.get_text();
+		location->cd_info["composer"] = composer_entry.get_text();
 	} else {
-	  location->cd_info.erase("composer");
+		location->cd_info.erase("composer");
 	}
 }
 
@@ -415,14 +415,32 @@ LocationEditRow::to_playhead_button_pressed (LocationPart part)
 	}
 
 	switch (part) {
-	case LocStart:
-		location->set_start (_session->transport_frame ());
-		break;
-	case LocEnd:
-		location->set_end (_session->transport_frame ());
-		break;
-	default:
-		break;
+		case LocStart:
+			location->set_start (_session->transport_frame ());
+			break;
+		case LocEnd:
+			location->set_end (_session->transport_frame ());
+			if (location->is_session_range()) {
+				_session->set_end_is_free (false);
+			}
+			break;
+		default:
+			break;
+	}
+}
+
+void
+LocationEditRow::locate_button_pressed (LocationPart part)
+{
+	switch (part) {
+		case LocStart:
+			_session->request_locate (start_clock.current_time());
+			break;
+		case LocEnd:
+			_session->request_locate (end_clock.current_time());
+			break;
+		default:
+			break;
 	}
 }
 
@@ -444,23 +462,28 @@ LocationEditRow::clock_changed (LocationPart part)
 	}
 
 	switch (part) {
-	case LocStart:
-		location->set_start (start_clock.current_time());
-		break;
-	case LocEnd:
-		location->set_end (end_clock.current_time());
-		break;
-	case LocLength:
-		location->set_end (location->start() + length_clock.current_duration());
-	default:
-		break;
+		case LocStart:
+			location->set_start (start_clock.current_time());
+			break;
+		case LocEnd:
+			location->set_end (end_clock.current_time());
+			if (location->is_session_range()) {
+				_session->set_end_is_free (false);
+			}
+			break;
+		case LocLength:
+			location->set_end (location->start() + length_clock.current_duration());
+			if (location->is_session_range()) {
+				_session->set_end_is_free (false);
+			}
+		default:
+			break;
 	}
 }
 
 void
 LocationEditRow::show_cd_track_details ()
 {
-
 	if (location->cd_info.find("isrc") != location->cd_info.end()) {
 		isrc_entry.set_text(location->cd_info["isrc"]);
 	}
@@ -729,7 +752,7 @@ LocationUI::LocationUI ()
 {
 	i_am_the_modifier = 0;
 
-        _clock_group = new ClockGroup;
+	_clock_group = new ClockGroup;
 
 	VBox* vbox = manage (new VBox);
 
@@ -744,9 +767,10 @@ LocationUI::LocationUI ()
 	table->attach (*l, 0, 2, table_row, table_row + 1);
 	++table_row;
 
-        loop_edit_row.set_clock_group (*_clock_group);
-        punch_edit_row.set_clock_group (*_clock_group);
+	loop_edit_row.set_clock_group (*_clock_group);
+	punch_edit_row.set_clock_group (*_clock_group);
 
+	loop_punch_box.set_border_width (6); // 5 + 1 px framebox-border
 	loop_punch_box.pack_start (loop_edit_row, false, false);
 	loop_punch_box.pack_start (punch_edit_row, false, false);
 
@@ -755,7 +779,7 @@ LocationUI::LocationUI ()
 
 	vbox->pack_start (*table, false, false);
 
- 	table = manage (new Table (3, 2));
+	table = manage (new Table (3, 2));
 	table->set_spacings (2);
 	table->set_col_spacing (0, 32);
 	table_row = 0;
@@ -788,9 +812,9 @@ LocationUI::LocationUI ()
 	table->attach (loc_frame_box, 0, 2, table_row, table_row + 1);
 	++table_row;
 
-	loc_range_panes.pack1 (*table, true, false);
+	loc_range_panes.add (*table);
 
- 	table = manage (new Table (3, 2));
+	table = manage (new Table (3, 2));
 	table->set_spacings (2);
 	table->set_col_spacing (0, 32);
 	table_row = 0;
@@ -820,7 +844,7 @@ LocationUI::LocationUI ()
 	table->attach (range_frame_box, 0, 2, table_row, table_row + 1);
 	++table_row;
 
-	loc_range_panes.pack2 (*table, true, false);
+	loc_range_panes.add (*table);
 
 	HBox* add_button_box = manage (new HBox);
 	add_button_box->pack_start (add_location_button, true, true);
@@ -904,7 +928,7 @@ LocationUI::location_added (Location* location)
 
 		LocationEditRow* erow = manage (new LocationEditRow (_session, location));
 
-                erow->set_clock_group (*_clock_group);
+		erow->set_clock_group (*_clock_group);
 		erow->remove_requested.connect (sigc::mem_fun (*this, &LocationUI::location_remove_requested));
 
 		Box_Helpers::BoxList & children = location->is_range_marker() ? range_rows.children () : location_rows.children ();
@@ -985,7 +1009,7 @@ LocationUI::map_locations (const Locations::LocationList& locations)
 			erow->remove_requested.connect (sigc::mem_fun(*this, &LocationUI::location_remove_requested));
 			erow->redraw_ranges.connect (sigc::mem_fun(*this, &LocationUI::location_redraw_ranges));
 
-                        Box_Helpers::BoxList & loc_children = location_rows.children();
+			Box_Helpers::BoxList & loc_children = location_rows.children();
 			loc_children.push_back(Box_Helpers::Element(*erow, PACK_SHRINK, 1, PACK_START));
 		} else if (location->is_auto_punch()) {
 			punch_edit_row.set_session (_session);
@@ -998,7 +1022,7 @@ LocationUI::map_locations (const Locations::LocationList& locations)
 		} else {
 			LocationEditRow* erow = manage (new LocationEditRow(_session, location));
 
-                        erow->set_clock_group (*_clock_group);
+			erow->set_clock_group (*_clock_group);
 			erow->remove_requested.connect (sigc::mem_fun(*this, &LocationUI::location_remove_requested));
 
 			Box_Helpers::BoxList & range_children = range_rows.children();
@@ -1128,7 +1152,7 @@ LocationUI::clock_mode_from_session_instant_xml () const
 		return AudioClock::Frames;
 	}
 
-	XMLProperty* p = node->property (X_("clock-mode"));
+	XMLProperty const * p = node->property (X_("clock-mode"));
 	if (!p) {
 		return ARDOUR_UI::instance()->secondary_clock->mode();
 	}
@@ -1140,7 +1164,7 @@ LocationUI::clock_mode_from_session_instant_xml () const
 /*------------------------*/
 
 LocationUIWindow::LocationUIWindow ()
-	: ArdourWindow (_("Locations"))
+	: ArdourWindow (S_("Ranges|Locations"))
 {
 	set_wmclass(X_("ardour_locations"), PROGRAM_NAME);
 	set_name ("LocationWindow");
diff --git a/gtk2_ardour/location_ui.h b/gtk2_ardour/location_ui.h
index c9e7b49..cdbc952 100644
--- a/gtk2_ardour/location_ui.h
+++ b/gtk2_ardour/location_ui.h
@@ -26,7 +26,6 @@
 #include <gtkmm/table.h>
 #include <gtkmm/entry.h>
 #include <gtkmm/label.h>
-#include <gtkmm/paned.h>
 #include <gtkmm/scrolledwindow.h>
 
 #include "pbd/signals.h"
@@ -34,6 +33,9 @@
 #include "ardour/location.h"
 #include "ardour/session_handle.h"
 
+#include <gtkmm2ext/pane.h>
+
+#include "ardour_button.h"
 #include "ardour_window.h"
 #include "audio_clock.h"
 
@@ -80,11 +82,13 @@ class LocationEditRow  : public Gtk::HBox, public ARDOUR::SessionHandlePtr
 
 	Gtk::HBox     start_hbox;
 	AudioClock    start_clock;
-	Gtk::Button   start_to_playhead_button;
+	ArdourButton  start_to_playhead_button;
+	ArdourButton  locate_to_start_button;
 
 	Gtk::HBox     end_hbox;
 	AudioClock    end_clock;
-	Gtk::Button   end_to_playhead_button;
+	ArdourButton  end_to_playhead_button;
+	ArdourButton  locate_to_end_button;
 
 	AudioClock    length_clock;
 	Gtk::CheckButton cd_check_button;
@@ -92,7 +96,7 @@ class LocationEditRow  : public Gtk::HBox, public ARDOUR::SessionHandlePtr
 	Gtk::CheckButton lock_check_button;
 	Gtk::CheckButton glue_check_button;
 
-	Gtk::Button   remove_button;
+	ArdourButton   remove_button;
 
 	Gtk::HBox     cd_track_details_hbox;
 	Gtk::Entry    isrc_entry;
@@ -118,6 +122,7 @@ class LocationEditRow  : public Gtk::HBox, public ARDOUR::SessionHandlePtr
 	void composer_entry_changed ();
 
 	void to_playhead_button_pressed (LocationPart part);
+	void locate_button_pressed (LocationPart part);
 
 	void clock_changed (LocationPart part);
 	bool locate_to_clock (GdkEventButton*, AudioClock*);
@@ -174,7 +179,7 @@ class LocationUI : public Gtk::HBox, public ARDOUR::SessionHandlePtr
 	LocationEditRow      punch_edit_row;
 	Gtk::VBox loop_punch_box;
 
-	Gtk::VPaned loc_range_panes;
+	Gtkmm2ext::VPane loc_range_panes;
 
 	Gtk::VBox  loc_frame_box;
 	Gtk::Button add_location_button;
diff --git a/gtk2_ardour/lua_script_manager.cc b/gtk2_ardour/lua_script_manager.cc
new file mode 100644
index 0000000..c33dea3
--- /dev/null
+++ b/gtk2_ardour/lua_script_manager.cc
@@ -0,0 +1,312 @@
+/*
+ * Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+
+#include "gtkmm2ext/utils.h"
+
+#include "lua_script_manager.h"
+#include "script_selector.h"
+#include "pbd/i18n.h"
+
+using namespace std;
+using namespace Gtk;
+using namespace ARDOUR;
+
+LuaScriptManager::LuaScriptManager ()
+	: ArdourWindow (_("Script Manager"))
+	, _a_set_button (_("Add/Set"))
+	, _a_del_button (_("Remove"))
+	, _a_edit_button (_("Edit"))
+	, _a_call_button (_("Call"))
+	, _c_add_button (_("New Hook"))
+	, _c_del_button (_("Remove"))
+{
+	/* action script page */
+	_a_store = ListStore::create (_a_model);
+	_a_view.set_model (_a_store);
+	_a_view.append_column (_("Action"), _a_model.action);
+	_a_view.append_column (_("Name"), _a_model.name);
+	_a_view.get_column(0)->set_resizable (true);
+	_a_view.get_column(0)->set_expand (true);
+	_a_view.get_column(1)->set_resizable (true);
+	_a_view.get_column(1)->set_expand (true);
+
+	Gtk::HBox* edit_box = manage (new Gtk::HBox);
+	edit_box->set_spacing(3);
+
+	edit_box->pack_start (_a_set_button, true, true);
+	edit_box->pack_start (_a_del_button, true, true);
+	edit_box->pack_start (_a_edit_button, true, true);
+	edit_box->pack_start (_a_call_button, true, true);
+
+	_a_set_button.signal_clicked().connect (sigc::mem_fun(*this, &LuaScriptManager::set_action_btn_clicked));
+	_a_del_button.signal_clicked().connect (sigc::mem_fun(*this, &LuaScriptManager::del_action_btn_clicked));
+	_a_edit_button.signal_clicked().connect (sigc::mem_fun(*this, &LuaScriptManager::edit_action_btn_clicked));
+	_a_call_button.signal_clicked().connect (sigc::mem_fun(*this, &LuaScriptManager::call_action_btn_clicked));
+	_a_view.get_selection()->signal_changed().connect (sigc::mem_fun (*this, &LuaScriptManager::action_selection_changed));
+
+	LuaInstance::instance()->ActionChanged.connect (sigc::mem_fun (*this, &LuaScriptManager::set_action_script_name));
+	LuaInstance::instance()->SlotChanged.connect (sigc::mem_fun (*this, &LuaScriptManager::set_callback_script_name));
+
+	Gtk::VBox *vbox = manage (new VBox());
+	vbox->pack_start (_a_view, false, false);
+	vbox->pack_end (*edit_box, false, false);
+	vbox->show_all ();
+
+	pages.pages ().push_back (Notebook_Helpers::TabElem (*vbox, "Action Scripts"));
+
+	/* action hooks page */
+
+	_c_store = ListStore::create (_c_model);
+	_c_view.set_model (_c_store);
+	_c_view.append_column (_("Name"), _c_model.name);
+	_c_view.append_column (_("Signal(s)"), _c_model.signals);
+	_c_view.get_column(0)->set_resizable (true);
+	_c_view.get_column(0)->set_expand (true);
+	_c_view.get_column(1)->set_resizable (true);
+	_c_view.get_column(1)->set_expand (true);
+	Gtk::CellRendererText* r = dynamic_cast<Gtk::CellRendererText*>(_c_view.get_column_cell_renderer (1));
+	r->property_ellipsize () = Pango::ELLIPSIZE_MIDDLE;
+
+	edit_box = manage (new Gtk::HBox);
+	edit_box->set_spacing(3);
+	edit_box->pack_start (_c_add_button, true, true);
+	edit_box->pack_start (_c_del_button, true, true);
+
+	_c_add_button.signal_clicked().connect (sigc::mem_fun(*this, &LuaScriptManager::add_callback_btn_clicked));
+	_c_del_button.signal_clicked().connect (sigc::mem_fun(*this, &LuaScriptManager::del_callback_btn_clicked));
+	_c_view.get_selection()->signal_changed().connect (sigc::mem_fun (*this, &LuaScriptManager::callback_selection_changed));
+
+	vbox = manage (new VBox());
+	vbox->pack_start (_c_view, false, false);
+	vbox->pack_end (*edit_box, false, false);
+	vbox->show_all ();
+
+	pages.pages ().push_back (Notebook_Helpers::TabElem (*vbox, "Action Hooks"));
+
+
+	add (pages);
+	pages.show();
+
+	setup_actions ();
+	setup_callbacks ();
+
+	action_selection_changed ();
+	callback_selection_changed ();
+}
+
+void
+LuaScriptManager::session_going_away ()
+{
+	ArdourWindow::session_going_away ();
+	hide_all();
+}
+
+void
+LuaScriptManager::setup_actions ()
+{
+	LuaInstance *li = LuaInstance::instance();
+	for (int i = 0; i < 9; ++i) {
+		std::string name;
+		TreeModel::Row r = *_a_store->append ();
+		r[_a_model.id] = i;
+		r[_a_model.action] = string_compose (_("Action %1"), i + 1);
+		if (li->lua_action_name (i, name)) {
+			r[_a_model.name] = name;
+			r[_a_model.enabled] = true;
+		} else {
+			r[_a_model.name] = _("Unset");
+			r[_a_model.enabled] = false;
+		}
+	}
+}
+
+void
+LuaScriptManager::action_selection_changed ()
+{
+	TreeModel::Row row = *(_a_view.get_selection()->get_selected());
+	if (row) {
+		_a_set_button.set_sensitive (true);
+	}
+	else {
+		_a_set_button.set_sensitive (false);
+	}
+
+	if (row && row[_a_model.enabled]) {
+		_a_del_button.set_sensitive (true);
+		_a_edit_button.set_sensitive (false); // TODO
+		_a_call_button.set_sensitive (true);
+	} else {
+		_a_del_button.set_sensitive (false);
+		_a_edit_button.set_sensitive (false);
+		_a_call_button.set_sensitive (false);
+	}
+}
+
+void
+LuaScriptManager::set_action_btn_clicked ()
+{
+	TreeModel::Row row = *(_a_view.get_selection()->get_selected());
+	assert (row);
+	LuaInstance *li = LuaInstance::instance();
+	li->interactive_add (LuaScriptInfo::EditorAction, row[_a_model.id]);
+}
+
+void
+LuaScriptManager::del_action_btn_clicked ()
+{
+	TreeModel::Row row = *(_a_view.get_selection()->get_selected());
+	assert (row);
+	LuaInstance *li = LuaInstance::instance();
+	if (!li->remove_lua_action (row[_a_model.id])) {
+		// error
+	}
+}
+
+void
+LuaScriptManager::call_action_btn_clicked ()
+{
+	TreeModel::Row row = *(_a_view.get_selection()->get_selected());
+	assert (row && row[_a_model.enabled]);
+	LuaInstance *li = LuaInstance::instance();
+	li->call_action (row[_a_model.id]);
+}
+
+void
+LuaScriptManager::edit_action_btn_clicked ()
+{
+	TreeModel::Row row = *(_a_view.get_selection()->get_selected());
+	assert (row);
+	int id = row[_a_model.id];
+	LuaInstance *li = LuaInstance::instance();
+	std::string name, script;
+	LuaScriptParamList args;
+	if (!li->lua_action (id, name, script, args)) {
+		return;
+	}
+
+	// TODO text-editor window, update script directly
+
+	if (!LuaScripting::try_compile (script, args)) {
+		// compilation failed, keep editing
+		return;
+	}
+
+	if (li->set_lua_action (id, name, script, args)) {
+		// OK
+	} else {
+		// load failed,  keep editing..
+	}
+	action_selection_changed ();
+}
+
+void
+LuaScriptManager::set_action_script_name (int i, const std::string& name)
+{
+	typedef Gtk::TreeModel::Children type_children;
+	type_children children = _a_store->children();
+	for(type_children::iterator iter = children.begin(); iter != children.end(); ++iter) {
+		Gtk::TreeModel::Row row = *iter;
+		if (row[_a_model.id] == i) {
+			if (name.empty()) {
+				row[_a_model.enabled] = false;
+				row[_a_model.name] = _("Unset");
+			} else {
+				row[_a_model.enabled] = true;
+				row[_a_model.name] = name;
+			}
+			break;
+		}
+	}
+	action_selection_changed ();
+}
+
+
+void
+LuaScriptManager::setup_callbacks ()
+{
+	LuaInstance *li = LuaInstance::instance();
+	std::vector<PBD::ID> ids = li->lua_slots();
+	for (std::vector<PBD::ID>::const_iterator i = ids.begin(); i != ids.end(); ++i) {
+		std::string name;
+		std::string script;
+		ActionHook ah;
+		LuaScriptParamList lsp;
+		if (li->lua_slot (*i, name, script, ah, lsp)) {
+			set_callback_script_name (*i, name, ah);
+		}
+	}
+}
+
+void
+LuaScriptManager::callback_selection_changed ()
+{
+	TreeModel::Row row = *(_c_view.get_selection()->get_selected());
+	if (row) {
+		_c_del_button.set_sensitive (true);
+	} else {
+		_c_del_button.set_sensitive (false);
+	}
+}
+
+void
+LuaScriptManager::add_callback_btn_clicked ()
+{
+	LuaInstance *li = LuaInstance::instance();
+	li->interactive_add (LuaScriptInfo::EditorHook, -1);
+}
+
+void
+LuaScriptManager::del_callback_btn_clicked ()
+{
+	TreeModel::Row row = *(_c_view.get_selection()->get_selected());
+	assert (row);
+	LuaInstance *li = LuaInstance::instance();
+	if (!li->unregister_lua_slot (row[_c_model.id])) {
+		// error
+	}
+}
+
+void
+LuaScriptManager::set_callback_script_name (PBD::ID id, const std::string& name, const ActionHook& ah)
+{
+	if (name.empty()) {
+		typedef Gtk::TreeModel::Children type_children;
+		type_children children = _c_store->children();
+		for(type_children::iterator iter = children.begin(); iter != children.end(); ++iter) {
+			Gtk::TreeModel::Row row = *iter;
+			PBD::ID i = row[_c_model.id];
+			if (i == id) {
+				_c_store->erase (iter);
+				break;
+			}
+		}
+	} else {
+		TreeModel::Row r = *_c_store->append ();
+		r[_c_model.id] = id;
+		r[_c_model.name] = name;
+		string sig;
+		for (uint32_t i = 0; i < LuaSignal::LAST_SIGNAL; ++i) {
+			if (ah[i]) {
+				if (!sig.empty()) sig += ", ";
+				sig += enum2str (LuaSignal::LuaSignal (i));
+			}
+		}
+		r[_c_model.signals] = sig;
+	}
+	callback_selection_changed ();
+}
diff --git a/gtk2_ardour/lua_script_manager.h b/gtk2_ardour/lua_script_manager.h
new file mode 100644
index 0000000..03e2756
--- /dev/null
+++ b/gtk2_ardour/lua_script_manager.h
@@ -0,0 +1,106 @@
+/*
+ * Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+
+#ifndef _gtk2_ardour_lua_script_manager_h_
+#define _gtk2_ardour_lua_script_manager_h_
+
+#include <gtkmm.h>
+#include "ardour/luascripting.h"
+
+#include "ardour_window.h"
+#include "luainstance.h"
+
+class LuaScriptManager : public ArdourWindow
+{
+public:
+	LuaScriptManager ();
+
+protected:
+	void session_going_away();
+
+private:
+	Gtk::Notebook pages;
+
+	/* action scripts */
+	void setup_actions ();
+	void action_selection_changed ();
+	void set_action_script_name (int, const std::string&);
+
+	void set_action_btn_clicked ();
+	void del_action_btn_clicked ();
+	void edit_action_btn_clicked ();
+	void call_action_btn_clicked ();
+
+	class LuaActionScriptModelColumns : public Gtk::TreeModelColumnRecord
+	{
+		public:
+			LuaActionScriptModelColumns ()
+			{
+				add (id);
+				add (action);
+				add (name);
+				add (enabled);
+			}
+
+			Gtk::TreeModelColumn<int> id;
+			Gtk::TreeModelColumn<std::string> action;
+			Gtk::TreeModelColumn<std::string> name;
+			Gtk::TreeModelColumn<bool> enabled;
+	};
+
+	Gtk::Button _a_set_button;
+	Gtk::Button _a_del_button;
+	Gtk::Button _a_edit_button;
+	Gtk::Button _a_call_button;
+
+	Glib::RefPtr<Gtk::ListStore> _a_store;
+	LuaActionScriptModelColumns _a_model;
+	Gtk::TreeView _a_view;
+
+	/* action callback hooks */
+	void setup_callbacks ();
+	void callback_selection_changed ();
+	void set_callback_script_name (PBD::ID, const std::string&, const ActionHook& ah);
+
+	void add_callback_btn_clicked ();
+	void del_callback_btn_clicked ();
+
+	class LuaCallbackScriptModelColumns : public Gtk::TreeModelColumnRecord
+	{
+		public:
+			LuaCallbackScriptModelColumns ()
+			{
+				add (id);
+				add (name);
+				add (signals);
+			}
+
+			Gtk::TreeModelColumn<PBD::ID> id;
+			Gtk::TreeModelColumn<std::string> name;
+			Gtk::TreeModelColumn<std::string> signals;
+	};
+
+	Glib::RefPtr<Gtk::ListStore> _c_store;
+	LuaCallbackScriptModelColumns _c_model;
+	Gtk::TreeView _c_view;
+
+	Gtk::Button _c_add_button;
+	Gtk::Button _c_del_button;
+};
+
+#endif /* _gtk2_ardour_lua_script_manager_h_ */
diff --git a/gtk2_ardour/luadoc.cc b/gtk2_ardour/luadoc.cc
new file mode 100644
index 0000000..35aaeed
--- /dev/null
+++ b/gtk2_ardour/luadoc.cc
@@ -0,0 +1,38 @@
+#include <stdio.h>
+#include <string.h>
+#include <iostream>
+
+#include "ardour/luabindings.h"
+#include "ardour/revision.h"
+#include "luainstance.h"
+#include "LuaBridge/LuaBridge.h"
+
+#ifdef WAF_BUILD
+#include "gtk2ardour-version.h"
+#endif
+
+int main (int argc, char **argv)
+{
+#ifdef LUABINDINGDOC
+	luabridge::setPrintBindings (true);
+	LuaState lua;
+	lua_State* L = lua.getState ();
+#ifdef LUADOCOUT
+	printf ("-- %s\n", ARDOUR::revision);
+	printf ("doc = {\n");
+#else
+	printf ("[\n");
+	printf ("{\"version\" :  \"%s\"},\n\n", ARDOUR::revision);
+#endif
+	LuaInstance::register_classes (L);
+	ARDOUR::LuaBindings::dsp (L);
+#ifdef LUADOCOUT
+	printf ("}\n");
+#else
+	printf ("{} ]\n");
+#endif
+	return 0;
+#else
+	return 1;
+#endif
+}
diff --git a/gtk2_ardour/luainstance.cc b/gtk2_ardour/luainstance.cc
new file mode 100644
index 0000000..c813eee
--- /dev/null
+++ b/gtk2_ardour/luainstance.cc
@@ -0,0 +1,1789 @@
+/*
+ * Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+
+#include <cairomm/context.h>
+#include <cairomm/surface.h>
+#include <pango/pangocairo.h>
+
+#include "gtkmm2ext/gui_thread.h"
+
+#include "ardour/audioengine.h"
+#include "ardour/diskstream.h"
+#include "ardour/plugin_manager.h"
+#include "ardour/route.h"
+#include "ardour/session.h"
+
+#include "LuaBridge/LuaBridge.h"
+
+#include "ardour_http.h"
+#include "ardour_ui.h"
+#include "public_editor.h"
+#include "region_selection.h"
+#include "luainstance.h"
+#include "luasignal.h"
+#include "marker.h"
+#include "time_axis_view.h"
+#include "selection.h"
+#include "script_selector.h"
+#include "timers.h"
+#include "utils_videotl.h"
+
+#include "pbd/i18n.h"
+
+namespace LuaCairo {
+/** wrap RefPtr< Cairo::ImageSurface >
+ *
+ * Image surfaces provide the ability to render to memory buffers either
+ * allocated by cairo or by the calling code. The supported image formats are
+ * those defined in Cairo::Format.
+ */
+class ImageSurface {
+	public:
+		/**
+		 * Creates an image surface of the specified format and dimensions. Initially
+		 * the surface contents are all 0. (Specifically, within each pixel, each
+		 * color or alpha channel belonging to format will be 0. The contents of bits
+		 * within a pixel, but not belonging to the given format are undefined).
+		 *
+		 * @param format 	format of pixels in the surface to create
+		 * @param width 	width of the surface, in pixels
+		 * @param height 	height of the surface, in pixels
+		 */
+		ImageSurface (Cairo::Format format, int width, int height)
+			: _surface (Cairo::ImageSurface::create (format, width, height))
+			, _ctx (Cairo::Context::create (_surface))
+			, ctx (_ctx->cobj ()) {}
+
+		~ImageSurface () {}
+
+		/**
+		 * Set this surface as source for another context.
+		 * This allows to draw this surface
+		 */
+		void set_as_source (Cairo::Context* c, int x, int y) {
+			_surface->flush ();
+			c->set_source (_surface, x, y);
+		}
+
+		/**
+		 * Returns a context object to perform operations on the surface
+		 */
+		Cairo::Context* context () {
+			return (Cairo::Context *)&ctx;
+		}
+
+		/**
+		 * Returns the stride of the image surface in bytes (or 0 if surface is not
+		 * an image surface). The stride is the distance in bytes from the beginning
+		 * of one row of the image data to the beginning of the next row.
+		 */
+		int get_stride () const {
+			return _surface->get_stride ();
+		}
+
+		/** Gets the width of the ImageSurface in pixels */
+		int get_width () const {
+			return _surface->get_width ();
+		}
+
+		/** Gets the height of the ImageSurface in pixels */
+		int get_height () const {
+			return _surface->get_height ();
+		}
+
+		/**
+		 * Get a pointer to the data of the image surface, for direct
+		 * inspection or modification.
+		 *
+		 * Return value: a pointer to the image data of this surface or NULL
+		 * if @surface is not an image surface.
+		 *
+		 */
+		unsigned char* get_data () {
+			return _surface->get_data ();
+		}
+
+		/** Tells cairo to consider the data buffer dirty.
+		 *
+		 * In particular, if you've created an ImageSurface with a data buffer that
+		 * you've allocated yourself and you draw to that data buffer using means
+		 * other than cairo, you must call mark_dirty() before doing any additional
+		 * drawing to that surface with cairo.
+		 *
+		 * Note that if you do draw to the Surface outside of cairo, you must call
+		 * flush() before doing the drawing.
+		 */
+		void mark_dirty () {
+			_surface->mark_dirty ();
+		}
+
+		/** Marks a rectangular area of the given surface dirty.
+		 *
+		 * @param x 	 X coordinate of dirty rectangle
+		 * @param y 	Y coordinate of dirty rectangle
+		 * @param width 	width of dirty rectangle
+		 * @param height 	height of dirty rectangle
+		 */
+		void mark_dirty (int x, int y, int width, int height) {
+			_surface->mark_dirty (x, y, width, height);
+		}
+
+	private:
+		Cairo::RefPtr<Cairo::ImageSurface> _surface;
+		Cairo::RefPtr<Cairo::Context> _ctx;
+		Cairo::Context ctx;
+};
+
+class PangoLayout {
+	public:
+		/** Create a new PangoLayout Text Display
+		 * @param c CairoContext for the layout
+		 * @param font_name a font-description e.g. "Mono 8px"
+		 */
+		PangoLayout (Cairo::Context* c, std::string font_name) {
+			::PangoLayout* pl = pango_cairo_create_layout (c->cobj ());
+			_layout = Glib::wrap (pl);
+			Pango::FontDescription fd (font_name);
+			_layout->set_font_description (fd);
+		}
+
+		~PangoLayout () {}
+
+		/** Gets the text in the layout. The returned text should not
+		 * be freed or modified.
+		 *
+		 * @return The text in the @a layout.
+		 */
+		std::string get_text () const {
+			return _layout->get_text ();
+		}
+		/** Set the text of the layout.
+		 * @param text The text for the layout.
+		 */
+		void set_text (const std::string& text) {
+			_layout->set_text (text);
+		}
+
+		/** Sets the layout text and attribute list from marked-up text (see markup format).
+		 * Replaces the current text and attribute list.
+		 * @param markup Some marked-up text.
+		 */
+		void set_markup (const std::string& markup) {
+			_layout->set_markup (markup);
+		}
+
+		/** Sets the width to which the lines of the Pango::Layout should wrap or
+		 * ellipsized.  The default value is -1: no width set.
+		 *
+		 * @param width The desired width in Pango units, or -1 to indicate that no
+		 * wrapping or ellipsization should be performed.
+		 */
+		void set_width (int width) {
+			_layout->set_width (width * PANGO_SCALE);
+		}
+
+		/** Gets the width to which the lines of the Pango::Layout should wrap.
+		 *
+		 * @return The width in Pango units, or -1 if no width set.
+		 */
+		int get_width () const {
+			return _layout->get_width () / PANGO_SCALE;
+		}
+
+		/** Sets the type of ellipsization being performed for @a layout.
+		 * Depending on the ellipsization mode @a ellipsize text is
+		 * removed from the start, middle, or end of text so they
+		 * fit within the width and height of layout set with
+		 * set_width() and set_height().
+		 *
+		 * If the layout contains characters such as newlines that
+		 * force it to be layed out in multiple paragraphs, then whether
+		 * each paragraph is ellipsized separately or the entire layout
+		 * is ellipsized as a whole depends on the set height of the layout.
+		 * See set_height() for details.
+		 *
+		 * @param ellipsize The new ellipsization mode for @a layout.
+		 */
+		void set_ellipsize (Pango::EllipsizeMode ellipsize) {
+			_layout->set_ellipsize (ellipsize);
+		}
+
+		/** Gets the type of ellipsization being performed for @a layout.
+		 * See set_ellipsize()
+		 *
+		 * @return The current ellipsization mode for @a layout.
+		 *
+		 * Use is_ellipsized() to query whether any paragraphs
+		 * were actually ellipsized.
+		 */
+		Pango::EllipsizeMode get_ellipsize () const {
+			return _layout->get_ellipsize ();
+		}
+
+		/** Queries whether the layout had to ellipsize any paragraphs.
+		 *
+		 * This returns <tt>true</tt> if the ellipsization mode for @a layout
+		 * is not Pango::ELLIPSIZE_NONE, a positive width is set on @a layout,
+		 * and there are paragraphs exceeding that width that have to be
+		 * ellipsized.
+		 *
+		 * @return <tt>true</tt> if any paragraphs had to be ellipsized, <tt>false</tt>
+		 * otherwise.
+		 */
+		bool is_ellipsized () const {
+			return _layout->is_ellipsized ();
+		}
+
+		/** Sets the wrap mode; the wrap mode only has effect if a width
+		 * is set on the layout with set_width().
+		 * To turn off wrapping, set the width to -1.
+		 *
+		 * @param wrap The wrap mode.
+		 */
+		void set_wrap (Pango::WrapMode wrap) {
+			_layout->set_width (wrap);
+		}
+
+		/** Gets the wrap mode for the layout.
+		 *
+		 * Use is_wrapped() to query whether any paragraphs
+		 * were actually wrapped.
+		 *
+		 * @return Active wrap mode.
+		 */
+		Pango::WrapMode get_wrap () const {
+			return _layout->get_wrap ();
+		}
+
+		/** Queries whether the layout had to wrap any paragraphs.
+		 *
+		 * This returns <tt>true</tt> if a positive width is set on @a layout,
+		 * ellipsization mode of @a layout is set to Pango::ELLIPSIZE_NONE,
+		 * and there are paragraphs exceeding the layout width that have
+		 * to be wrapped.
+		 *
+		 * @return <tt>true</tt> if any paragraphs had to be wrapped, <tt>false</tt>
+		 * otherwise.
+		 */
+		bool is_wrapped () const {
+			return _layout->is_wrapped ();
+		}
+
+		/** Determines the logical width and height of a Pango::Layout
+		 * in device units.
+		 */
+		int get_pixel_size (lua_State *L) {
+			int width, height;
+			_layout->get_pixel_size (width, height);
+			luabridge::Stack<int>::push (L, width);
+			luabridge::Stack<int>::push (L, height);
+			return 2;
+		}
+
+
+		/** Draws a Layout in the specified Cairo @a context. The top-left
+		 *  corner of the Layout will be drawn at the current point of the
+		 *  cairo context.
+		 *
+		 * @param context A Cairo context.
+		 */
+		void show_in_cairo_context (Cairo::Context* c) {
+			pango_cairo_update_layout (c->cobj (), _layout->gobj());
+			pango_cairo_show_layout (c->cobj (), _layout->gobj());
+		}
+
+	private:
+		Glib::RefPtr<Pango::Layout> _layout;
+};
+
+}; // namespace
+
+////////////////////////////////////////////////////////////////////////////////
+
+namespace LuaSignal {
+
+#define STATIC(name,c,p) else if (!strcmp(type, #name)) {return name;}
+#define SESSION(name,c,p) else if (!strcmp(type, #name)) {return name;}
+#define ENGINE(name,c,p) else if (!strcmp(type, #name)) {return name;}
+
+LuaSignal
+str2luasignal (const std::string &str) {
+	const char* type = str.c_str();
+	if (0) { }
+#	include "luasignal_syms.h"
+	else {
+		PBD::fatal << string_compose (_("programming error: %1: %2"), "Impossible LuaSignal type", str) << endmsg;
+		abort(); /*NOTREACHED*/
+	}
+}
+#undef STATIC
+#undef SESSION
+#undef ENGINE
+
+#define STATIC(name,c,p) N_(#name),
+#define SESSION(name,c,p) N_(#name),
+#define ENGINE(name,c,p) N_(#name),
+const char *luasignalstr[] = {
+#	include "luasignal_syms.h"
+	0
+};
+
+#undef STATIC
+#undef SESSION
+#undef ENGINE
+}; // namespace
+
+
+////////////////////////////////////////////////////////////////////////////////
+
+#define xstr(s) stringify(s)
+#define stringify(s) #s
+
+using namespace ARDOUR;
+
+PBD::Signal0<void> LuaInstance::LuaTimerDS;
+
+void
+LuaInstance::register_hooks (lua_State* L)
+{
+
+#define ENGINE(name,c,p) .addConst (stringify(name), (LuaSignal::LuaSignal)LuaSignal::name)
+#define STATIC(name,c,p) .addConst (stringify(name), (LuaSignal::LuaSignal)LuaSignal::name)
+#define SESSION(name,c,p) .addConst (stringify(name), (LuaSignal::LuaSignal)LuaSignal::name)
+	luabridge::getGlobalNamespace (L)
+		.beginNamespace ("LuaSignal")
+#		include "luasignal_syms.h"
+		.endNamespace ();
+#undef ENGINE
+#undef SESSION
+#undef STATIC
+
+	luabridge::getGlobalNamespace (L)
+		.beginNamespace ("LuaSignal")
+		.beginStdBitSet <LuaSignal::LAST_SIGNAL> ("Set")
+		.endClass()
+		.endNamespace ();
+}
+
+void
+LuaInstance::bind_cairo (lua_State* L)
+{
+	/* std::vector<double> for set_dash()
+	 * for Windows (DLL, .exe) this needs to be bound in the same memory context as "Cairo".
+	 *
+	 * The std::vector<> argument in set_dash() has a fixed address in ardour.exe, while
+	 * the address of the one in libardour.dll is mapped when loading the .dll
+	 *
+	 * see LuaBindings::set_session() for a detailed explanation
+	 */
+	luabridge::getGlobalNamespace (L)
+		.beginNamespace ("C")
+		.beginStdVector <double> ("DoubleVector")
+		.endClass ()
+		.endNamespace ();
+
+	luabridge::getGlobalNamespace (L)
+		.beginNamespace ("Cairo")
+		.beginClass <Cairo::Context> ("Context")
+		.addFunction ("save", &Cairo::Context::save)
+		.addFunction ("restore", &Cairo::Context::restore)
+		.addFunction ("set_operator", &Cairo::Context::set_operator)
+		//.addFunction ("set_source", &Cairo::Context::set_operator) // needs RefPtr
+		.addFunction ("set_source_rgb", &Cairo::Context::set_source_rgb)
+		.addFunction ("set_source_rgba", &Cairo::Context::set_source_rgba)
+		.addFunction ("set_line_width", &Cairo::Context::set_line_width)
+		.addFunction ("set_line_cap", &Cairo::Context::set_line_cap)
+		.addFunction ("set_line_join", &Cairo::Context::set_line_join)
+		.addFunction ("set_dash", (void (Cairo::Context::*)(const std::vector<double>&, double))&Cairo::Context::set_dash)
+		.addFunction ("unset_dash", &Cairo::Context::unset_dash)
+		.addFunction ("translate", &Cairo::Context::translate)
+		.addFunction ("scale", &Cairo::Context::scale)
+		.addFunction ("rotate", &Cairo::Context::rotate)
+		.addFunction ("begin_new_path", &Cairo::Context::begin_new_path)
+		.addFunction ("begin_new_sub_path", &Cairo::Context::begin_new_sub_path)
+		.addFunction ("move_to", &Cairo::Context::move_to)
+		.addFunction ("line_to", &Cairo::Context::line_to)
+		.addFunction ("curve_to", &Cairo::Context::curve_to)
+		.addFunction ("arc", &Cairo::Context::arc)
+		.addFunction ("arc_negative", &Cairo::Context::arc_negative)
+		.addFunction ("rel_move_to", &Cairo::Context::rel_move_to)
+		.addFunction ("rel_line_to", &Cairo::Context::rel_line_to)
+		.addFunction ("rel_curve_to", &Cairo::Context::rel_curve_to)
+		.addFunction ("rectangle", (void (Cairo::Context::*)(double, double, double, double))&Cairo::Context::rectangle)
+		.addFunction ("close_path", &Cairo::Context::close_path)
+		.addFunction ("paint", &Cairo::Context::paint)
+		.addFunction ("paint_with_alpha", &Cairo::Context::paint_with_alpha)
+		.addFunction ("stroke", &Cairo::Context::stroke)
+		.addFunction ("stroke_preserve", &Cairo::Context::stroke_preserve)
+		.addFunction ("fill", &Cairo::Context::fill)
+		.addFunction ("fill_preserve", &Cairo::Context::fill_preserve)
+		.addFunction ("reset_clip", &Cairo::Context::reset_clip)
+		.addFunction ("clip", &Cairo::Context::clip)
+		.addFunction ("clip_preserve", &Cairo::Context::clip_preserve)
+		.addFunction ("set_font_size", &Cairo::Context::set_font_size)
+		.addFunction ("show_text", &Cairo::Context::show_text)
+		.endClass ()
+		/* enums */
+		// LineCap, LineJoin, Operator
+		.beginNamespace ("LineCap")
+		.addConst ("Butt", CAIRO_LINE_CAP_BUTT)
+		.addConst ("Round", CAIRO_LINE_CAP_ROUND)
+		.addConst ("Square", CAIRO_LINE_CAP_SQUARE)
+		.endNamespace ()
+
+		.beginNamespace ("LineJoin")
+		.addConst ("Miter", CAIRO_LINE_JOIN_MITER)
+		.addConst ("Round", CAIRO_LINE_JOIN_ROUND)
+		.addConst ("Bevel", CAIRO_LINE_JOIN_BEVEL)
+		.endNamespace ()
+
+		.beginNamespace ("Operator")
+		.addConst ("Clear", CAIRO_OPERATOR_CLEAR)
+		.addConst ("Source", CAIRO_OPERATOR_SOURCE)
+		.addConst ("Over", CAIRO_OPERATOR_OVER)
+		.addConst ("Add", CAIRO_OPERATOR_ADD)
+		.endNamespace ()
+
+		.beginNamespace ("Format")
+		.addConst ("ARGB32", CAIRO_FORMAT_ARGB32)
+		.addConst ("RGB24", CAIRO_FORMAT_RGB24)
+		.endNamespace ()
+
+		.beginClass <LuaCairo::ImageSurface> ("ImageSurface")
+		.addConstructor <void (*) (Cairo::Format, int, int)> ()
+		.addFunction ("set_as_source", &LuaCairo::ImageSurface::set_as_source)
+		.addFunction ("context", &LuaCairo::ImageSurface::context)
+		.addFunction ("get_stride", &LuaCairo::ImageSurface::get_stride)
+		.addFunction ("get_width", &LuaCairo::ImageSurface::get_width)
+		.addFunction ("get_height", &LuaCairo::ImageSurface::get_height)
+		//.addFunction ("get_data", &LuaCairo::ImageSurface::get_data) // uint8_t* array is n/a
+		.endClass ()
+
+		.beginClass <LuaCairo::PangoLayout> ("PangoLayout")
+		.addConstructor <void (*) (Cairo::Context*, std::string)> ()
+		.addCFunction ("get_pixel_size", &LuaCairo::PangoLayout::get_pixel_size)
+		.addFunction ("get_text", &LuaCairo::PangoLayout::get_text)
+		.addFunction ("set_text", &LuaCairo::PangoLayout::set_text)
+		.addFunction ("show_in_cairo_context", &LuaCairo::PangoLayout::show_in_cairo_context)
+		.addFunction ("set_markup", &LuaCairo::PangoLayout::set_markup)
+		.addFunction ("set_width", &LuaCairo::PangoLayout::set_width)
+		.addFunction ("set_ellipsize", &LuaCairo::PangoLayout::set_ellipsize)
+		.addFunction ("get_ellipsize", &LuaCairo::PangoLayout::get_ellipsize)
+		.addFunction ("is_ellipsized", &LuaCairo::PangoLayout::is_ellipsized)
+		.addFunction ("set_wrap", &LuaCairo::PangoLayout::set_wrap)
+		.addFunction ("get_wrap", &LuaCairo::PangoLayout::get_wrap)
+		.addFunction ("is_wrapped", &LuaCairo::PangoLayout::is_wrapped)
+		.endClass ()
+
+		/* enums */
+		.beginNamespace ("EllipsizeMode")
+		.addConst ("None", Pango::ELLIPSIZE_NONE)
+		.addConst ("Start", Pango::ELLIPSIZE_START)
+		.addConst ("Middle", Pango::ELLIPSIZE_MIDDLE)
+		.addConst ("End", Pango::ELLIPSIZE_END)
+		.endNamespace ()
+
+		.beginNamespace ("WrapMode")
+		.addConst ("Word", Pango::WRAP_WORD)
+		.addConst ("Char", Pango::WRAP_CHAR)
+		.addConst ("WordChar", Pango::WRAP_WORD_CHAR)
+		.endNamespace ()
+
+		.endNamespace ();
+
+/* Lua/cairo bindings operate on Cairo::Context, there is no Cairo::RefPtr wrapper [yet].
+  one can work around this as follows:
+
+  LuaState lua;
+  LuaInstance::register_classes (lua.getState());
+  lua.do_command (
+      "function render (ctx)"
+      "  ctx:rectangle (0, 0, 100, 100)"
+      "  ctx:set_source_rgba (0.1, 1.0, 0.1, 1.0)"
+      "  ctx:fill ()"
+      " end"
+      );
+  {
+		Cairo::RefPtr<Cairo::Context> context = get_window ()->create_cairo_context ();
+    Cairo::Context ctx (context->cobj ());
+
+    luabridge::LuaRef lua_render = luabridge::getGlobal (lua.getState(), "render");
+    lua_render ((Cairo::Context *)&ctx);
+  }
+*/
+
+}
+
+void
+LuaInstance::register_classes (lua_State* L)
+{
+	LuaBindings::stddef (L);
+	LuaBindings::common (L);
+	LuaBindings::session (L);
+	LuaBindings::osc (L);
+
+	bind_cairo (L);
+	register_hooks (L);
+
+	luabridge::getGlobalNamespace (L)
+		.beginNamespace ("ArdourUI")
+
+		.addFunction ("http_get", (std::string (*)(const std::string&))&ArdourCurl::http_get)
+
+		.beginStdList <ArdourMarker*> ("ArdourMarkerList")
+		.endClass ()
+
+		.beginClass <ArdourMarker> ("ArdourMarker")
+		.addFunction ("name", &ArdourMarker::name)
+		.addFunction ("position", &ArdourMarker::position)
+		.addFunction ("_type", &ArdourMarker::type)
+		.endClass ()
+
+#if 0
+		.beginClass <AxisView> ("AxisView")
+		.endClass ()
+		.deriveClass <TimeAxisView, AxisView> ("TimeAxisView")
+		.endClass ()
+		.deriveClass <RouteTimeAxisView, TimeAxisView> ("RouteTimeAxisView")
+		.endClass ()
+#endif
+
+		.beginClass <RegionSelection> ("RegionSelection")
+		.addFunction ("clear_all", &RegionSelection::clear_all)
+		.addFunction ("start", &RegionSelection::start)
+		.addFunction ("end_frame", &RegionSelection::end_frame)
+		.addFunction ("n_midi_regions", &RegionSelection::n_midi_regions)
+		.addFunction ("regionlist", &RegionSelection::regionlist) // XXX check windows binding (libardour)
+		.endClass ()
+
+		.deriveClass <TimeSelection, std::list<ARDOUR::AudioRange> > ("TimeSelection")
+		.addFunction ("start", &TimeSelection::start)
+		.addFunction ("end_frame", &TimeSelection::end_frame)
+		.addFunction ("length", &TimeSelection::length)
+		.endClass ()
+
+		.deriveClass <MarkerSelection, std::list<ArdourMarker*> > ("MarkerSelection")
+		.endClass ()
+
+		.beginClass <TrackViewList> ("TrackViewList")
+		.addFunction ("routelist", &TrackViewList::routelist) // XXX check windows binding (libardour)
+		.endClass ()
+
+		.deriveClass <TrackSelection, TrackViewList> ("TrackSelection")
+		.endClass ()
+
+		.beginClass <Selection> ("Selection")
+		.addFunction ("clear", &Selection::clear)
+		.addFunction ("clear_all", &Selection::clear_all)
+		.addFunction ("empty", &Selection::empty)
+		.addData ("tracks", &Selection::tracks)
+		.addData ("regions", &Selection::regions)
+		.addData ("time", &Selection::time)
+		.addData ("markers", &Selection::markers)
+#if 0
+		.addData ("lines", &Selection::lines)
+		.addData ("playlists", &Selection::playlists)
+		.addData ("points", &Selection::points)
+		.addData ("midi_regions", &Selection::midi_regions)
+		.addData ("midi_notes", &Selection::midi_notes) // cut buffer only
+#endif
+		.endClass ()
+
+		.beginClass <PublicEditor> ("Editor")
+		.addFunction ("snap_type", &PublicEditor::snap_type)
+		.addFunction ("snap_mode", &PublicEditor::snap_mode)
+		.addFunction ("set_snap_mode", &PublicEditor::set_snap_mode)
+		.addFunction ("set_snap_threshold", &PublicEditor::set_snap_threshold)
+
+		.addFunction ("undo", &PublicEditor::undo)
+		.addFunction ("redo", &PublicEditor::redo)
+
+		.addFunction ("set_mouse_mode", &PublicEditor::set_mouse_mode)
+		.addFunction ("current_mouse_mode", &PublicEditor::current_mouse_mode)
+
+		.addFunction ("consider_auditioning", &PublicEditor::consider_auditioning)
+
+		.addFunction ("new_region_from_selection", &PublicEditor::new_region_from_selection)
+		.addFunction ("separate_region_from_selection", &PublicEditor::separate_region_from_selection)
+		.addFunction ("pixel_to_sample", &PublicEditor::pixel_to_sample)
+		.addFunction ("sample_to_pixel", &PublicEditor::sample_to_pixel)
+
+		.addFunction ("get_selection", &PublicEditor::get_selection)
+		.addFunction ("get_cut_buffer", &PublicEditor::get_cut_buffer)
+		.addRefFunction ("get_selection_extents", &PublicEditor::get_selection_extents)
+
+		.addFunction ("play_selection", &PublicEditor::play_selection)
+		.addFunction ("play_with_preroll", &PublicEditor::play_with_preroll)
+		.addFunction ("maybe_locate_with_edit_preroll", &PublicEditor::maybe_locate_with_edit_preroll)
+		.addFunction ("goto_nth_marker", &PublicEditor::goto_nth_marker)
+
+		.addFunction ("add_location_from_playhead_cursor", &PublicEditor::add_location_from_playhead_cursor)
+		.addFunction ("remove_location_at_playhead_cursor", &PublicEditor::remove_location_at_playhead_cursor)
+
+		.addFunction ("set_show_measures", &PublicEditor::set_show_measures)
+		.addFunction ("show_measures", &PublicEditor::show_measures)
+		.addFunction ("remove_tracks", &PublicEditor::remove_tracks)
+
+		.addFunction ("set_loop_range", &PublicEditor::set_loop_range)
+		.addFunction ("set_punch_range", &PublicEditor::set_punch_range)
+
+		.addFunction ("effective_mouse_mode", &PublicEditor::effective_mouse_mode)
+
+		.addRefFunction ("do_import", &PublicEditor::do_import)
+		.addRefFunction ("do_embed", &PublicEditor::do_embed)
+
+		.addFunction ("export_audio", &PublicEditor::export_audio)
+		.addFunction ("stem_export", &PublicEditor::stem_export)
+		.addFunction ("export_selection", &PublicEditor::export_selection)
+		.addFunction ("export_range", &PublicEditor::export_range)
+
+		.addFunction ("set_zoom_focus", &PublicEditor::set_zoom_focus)
+		.addFunction ("get_zoom_focus", &PublicEditor::get_zoom_focus)
+		.addFunction ("get_current_zoom", &PublicEditor::get_current_zoom)
+		.addFunction ("reset_zoom", &PublicEditor::reset_zoom)
+
+#if 0 // These need TimeAxisView* which isn't exposed, yet
+		.addFunction ("playlist_selector", &PublicEditor::playlist_selector)
+		.addFunction ("clear_playlist", &PublicEditor::clear_playlist)
+		.addFunction ("new_playlists", &PublicEditor::new_playlists)
+		.addFunction ("copy_playlists", &PublicEditor::copy_playlists)
+		.addFunction ("clear_playlists", &PublicEditor::clear_playlists)
+#endif
+
+		.addFunction ("select_all_tracks", &PublicEditor::select_all_tracks)
+		.addFunction ("deselect_all", &PublicEditor::deselect_all)
+#if 0
+		.addFunction ("set_selected_track", &PublicEditor::set_selected_track)
+		.addFunction ("set_selected_mixer_strip", &PublicEditor::set_selected_mixer_strip)
+		.addFunction ("hide_track_in_display", &PublicEditor::hide_track_in_display)
+#endif
+		.addFunction ("set_stationary_playhead", &PublicEditor::set_stationary_playhead)
+		.addFunction ("stationary_playhead", &PublicEditor::stationary_playhead)
+		.addFunction ("set_follow_playhead", &PublicEditor::set_follow_playhead)
+		.addFunction ("follow_playhead", &PublicEditor::follow_playhead)
+
+		.addFunction ("dragging_playhead", &PublicEditor::dragging_playhead)
+		.addFunction ("leftmost_sample", &PublicEditor::leftmost_sample)
+		.addFunction ("current_page_samples", &PublicEditor::current_page_samples)
+		.addFunction ("visible_canvas_height", &PublicEditor::visible_canvas_height)
+		.addFunction ("temporal_zoom_step", &PublicEditor::temporal_zoom_step)
+		//.addFunction ("ensure_time_axis_view_is_visible", &PublicEditor::ensure_time_axis_view_is_visible)
+		.addFunction ("override_visible_track_count", &PublicEditor::override_visible_track_count)
+
+		.addFunction ("scroll_tracks_down_line", &PublicEditor::scroll_tracks_down_line)
+		.addFunction ("scroll_tracks_up_line", &PublicEditor::scroll_tracks_up_line)
+		.addFunction ("scroll_down_one_track", &PublicEditor::scroll_down_one_track)
+		.addFunction ("scroll_up_one_track", &PublicEditor::scroll_up_one_track)
+
+		.addFunction ("reset_x_origin", &PublicEditor::reset_x_origin)
+		.addFunction ("get_y_origin", &PublicEditor::get_y_origin)
+		.addFunction ("reset_y_origin", &PublicEditor::reset_y_origin)
+
+		.addFunction ("remove_last_capture", &PublicEditor::remove_last_capture)
+
+		.addFunction ("maximise_editing_space", &PublicEditor::maximise_editing_space)
+		.addFunction ("restore_editing_space", &PublicEditor::restore_editing_space)
+		.addFunction ("toggle_meter_updating", &PublicEditor::toggle_meter_updating)
+
+		//.addFunction ("get_preferred_edit_position", &PublicEditor::get_preferred_edit_position)
+		//.addFunction ("split_regions_at", &PublicEditor::split_regions_at)
+
+		.addRefFunction ("get_nudge_distance", &PublicEditor::get_nudge_distance)
+		.addFunction ("get_paste_offset", &PublicEditor::get_paste_offset)
+		.addFunction ("get_grid_beat_divisions", &PublicEditor::get_grid_beat_divisions)
+		.addRefFunction ("get_grid_type_as_beats", &PublicEditor::get_grid_type_as_beats)
+
+		.addFunction ("toggle_ruler_video", &PublicEditor::toggle_ruler_video)
+		.addFunction ("toggle_xjadeo_proc", &PublicEditor::toggle_xjadeo_proc)
+		.addFunction ("get_videotl_bar_height", &PublicEditor::get_videotl_bar_height)
+		.addFunction ("set_video_timeline_height", &PublicEditor::set_video_timeline_height)
+
+#if 0
+		.addFunction ("get_route_view_by_route_id", &PublicEditor::get_route_view_by_route_id)
+		.addFunction ("get_equivalent_regions", &PublicEditor::get_equivalent_regions)
+
+		.addFunction ("axis_view_from_route", &PublicEditor::axis_view_from_route)
+		.addFunction ("axis_views_from_routes", &PublicEditor::axis_views_from_routes)
+		.addFunction ("get_track_views", &PublicEditor::get_track_views)
+		.addFunction ("drags", &PublicEditor::drags)
+#endif
+
+		.addFunction ("center_screen", &PublicEditor::center_screen)
+
+		.addFunction ("get_smart_mode", &PublicEditor::get_smart_mode)
+		.addRefFunction ("get_pointer_position", &PublicEditor::get_pointer_position)
+
+		.addRefFunction ("find_location_from_marker", &PublicEditor::find_location_from_marker)
+		.addFunction ("find_marker_from_location_id", &PublicEditor::find_marker_from_location_id)
+		.addFunction ("mouse_add_new_marker", &PublicEditor::mouse_add_new_marker)
+#if 0
+		.addFunction ("get_regions_at", &PublicEditor::get_regions_at)
+		.addFunction ("get_regions_after", &PublicEditor::get_regions_after)
+		.addFunction ("get_regions_from_selection_and_mouse", &PublicEditor::get_regions_from_selection_and_mouse)
+		.addFunction ("get_regionviews_by_id", &PublicEditor::get_regionviews_by_id)
+		.addFunction ("get_per_region_note_selection", &PublicEditor::get_per_region_note_selection)
+#endif
+
+#if 0
+		.addFunction ("mouse_add_new_tempo_event", &PublicEditor::mouse_add_new_tempo_event)
+		.addFunction ("mouse_add_new_meter_event", &PublicEditor::mouse_add_new_meter_event)
+		.addFunction ("edit_tempo_section", &PublicEditor::edit_tempo_section)
+		.addFunction ("edit_meter_section", &PublicEditor::edit_meter_section)
+#endif
+
+		.addFunction ("access_action", &PublicEditor::access_action)
+		.endClass ()
+
+		/* ArdourUI enums */
+		.beginNamespace ("MarkerType")
+		.addConst ("Mark", ArdourMarker::Type(ArdourMarker::Mark))
+		.addConst ("Tempo", ArdourMarker::Type(ArdourMarker::Tempo))
+		.addConst ("Meter", ArdourMarker::Type(ArdourMarker::Meter))
+		.addConst ("SessionStart", ArdourMarker::Type(ArdourMarker::SessionStart))
+		.addConst ("SessionEnd", ArdourMarker::Type(ArdourMarker::SessionEnd))
+		.addConst ("RangeStart", ArdourMarker::Type(ArdourMarker::RangeStart))
+		.addConst ("RangeEnd", ArdourMarker::Type(ArdourMarker::RangeEnd))
+		.addConst ("LoopStart", ArdourMarker::Type(ArdourMarker::LoopStart))
+		.addConst ("LoopEnd", ArdourMarker::Type(ArdourMarker::LoopEnd))
+		.addConst ("PunchIn", ArdourMarker::Type(ArdourMarker::PunchIn))
+		.addConst ("PunchOut", ArdourMarker::Type(ArdourMarker::PunchOut))
+		.endNamespace ()
+
+		.endNamespace (); // end ArdourUI
+
+	// Editing Symbols
+
+#undef ZOOMFOCUS
+#undef SNAPTYPE
+#undef SNAPMODE
+#undef MOUSEMODE
+#undef DISPLAYCONTROL
+#undef IMPORTMODE
+#undef IMPORTPOSITION
+#undef IMPORTDISPOSITION
+
+#define ZOOMFOCUS(NAME) .addConst (stringify(NAME), (Editing::ZoomFocus)Editing::NAME)
+#define SNAPTYPE(NAME) .addConst (stringify(NAME), (Editing::SnapType)Editing::NAME)
+#define SNAPMODE(NAME) .addConst (stringify(NAME), (Editing::SnapMode)Editing::NAME)
+#define MOUSEMODE(NAME) .addConst (stringify(NAME), (Editing::MouseMode)Editing::NAME)
+#define DISPLAYCONTROL(NAME) .addConst (stringify(NAME), (Editing::DisplayControl)Editing::NAME)
+#define IMPORTMODE(NAME) .addConst (stringify(NAME), (Editing::ImportMode)Editing::NAME)
+#define IMPORTPOSITION(NAME) .addConst (stringify(NAME), (Editing::ImportPosition)Editing::NAME)
+#define IMPORTDISPOSITION(NAME) .addConst (stringify(NAME), (Editing::ImportDisposition)Editing::NAME)
+	luabridge::getGlobalNamespace (L)
+		.beginNamespace ("Editing")
+#		include "editing_syms.h"
+		.endNamespace ();
+}
+
+#undef xstr
+#undef stringify
+
+////////////////////////////////////////////////////////////////////////////////
+
+using namespace ARDOUR;
+using namespace ARDOUR_UI_UTILS;
+using namespace PBD;
+using namespace std;
+
+#ifndef NDEBUG
+static void _lua_print (std::string s) {
+	std::cout << "LuaInstance: " << s << "\n";
+}
+#endif
+
+LuaInstance* LuaInstance::_instance = 0;
+
+LuaInstance*
+LuaInstance::instance ()
+{
+	if (!_instance) {
+		_instance  = new LuaInstance;
+	}
+
+	return _instance;
+}
+
+LuaInstance::LuaInstance ()
+{
+#ifndef NDEBUG
+	lua.Print.connect (&_lua_print);
+#endif
+	init ();
+
+	LuaScriptParamList args;
+}
+
+LuaInstance::~LuaInstance ()
+{
+	delete _lua_call_action;
+	delete _lua_add_action;
+	delete _lua_del_action;
+	delete _lua_get_action;
+
+	delete _lua_load;
+	delete _lua_save;
+	delete _lua_clear;
+	_callbacks.clear();
+}
+
+void
+LuaInstance::init ()
+{
+	lua.do_command (
+			"function ScriptManager ()"
+			"  local self = { scripts = {}, instances = {} }"
+			""
+			"  local remove = function (id)"
+			"   self.scripts[id] = nil"
+			"   self.instances[id] = nil"
+			"  end"
+			""
+			"  local addinternal = function (i, n, s, f, a)"
+			"   assert(type(i) == 'number', 'id must be numeric')"
+			"   assert(type(n) == 'string', 'Name must be string')"
+			"   assert(type(s) == 'string', 'Script must be string')"
+			"   assert(type(f) == 'function', 'Factory is a not a function')"
+			"   assert(type(a) == 'table' or type(a) == 'nil', 'Given argument is invalid')"
+			"   self.scripts[i] = { ['n'] = n, ['s'] = s, ['f'] = f, ['a'] = a }"
+			"   local env = _ENV;  env.f = nil env.debug = nil os.exit = nil require = nil dofile = nil loadfile = nil package = nil"
+			"   self.instances[i] = load (string.dump(f, true), nil, nil, env)(a)"
+			"  end"
+			""
+			"  local call = function (id)"
+			"   if type(self.instances[id]) == 'function' then"
+			"     local status, err = pcall (self.instances[id])"
+			"     if not status then"
+			"       print ('action \"'.. id .. '\": ', err)" // error out
+			"       remove (id)"
+			"     end"
+			"   end"
+			"   collectgarbage()"
+			"  end"
+			""
+			"  local add = function (i, n, s, b, a)"
+			"   assert(type(b) == 'string', 'ByteCode must be string')"
+			"   load (b)()" // assigns f
+			"   assert(type(f) == 'string', 'Assigned ByteCode must be string')"
+			"   addinternal (i, n, s, load(f), a)"
+			"  end"
+			""
+			"  local get = function (id)"
+			"   if type(self.scripts[id]) == 'table' then"
+			"    return { ['name'] = self.scripts[id]['n'],"
+			"             ['script'] = self.scripts[id]['s'],"
+			"             ['args'] = self.scripts[id]['a'] }"
+			"   end"
+			"   return nil"
+			"  end"
+			""
+			"  local function basic_serialize (o)"
+			"    if type(o) == \"number\" then"
+			"     return tostring(o)"
+			"    else"
+			"     return string.format(\"%q\", o)"
+			"    end"
+			"  end"
+			""
+			"  local function serialize (name, value)"
+			"   local rv = name .. ' = '"
+			"   collectgarbage()"
+			"   if type(value) == \"number\" or type(value) == \"string\" or type(value) == \"nil\" then"
+			"    return rv .. basic_serialize(value) .. ' '"
+			"   elseif type(value) == \"table\" then"
+			"    rv = rv .. '{} '"
+			"    for k,v in pairs(value) do"
+			"     local fieldname = string.format(\"%s[%s]\", name, basic_serialize(k))"
+			"     rv = rv .. serialize(fieldname, v) .. ' '"
+			"     collectgarbage()" // string concatenation allocates a new string
+			"    end"
+			"    return rv;"
+			"   elseif type(value) == \"function\" then"
+			"     return rv .. string.format(\"%q\", string.dump(value, true))"
+			"   else"
+			"    error('cannot save a ' .. type(value))"
+			"   end"
+			"  end"
+			""
+			""
+			"  local save = function ()"
+			"   return (serialize('scripts', self.scripts))"
+			"  end"
+			""
+			"  local clear = function ()"
+			"   self.scripts = {}"
+			"   self.instances = {}"
+			"   collectgarbage()"
+			"  end"
+			""
+			"  local restore = function (state)"
+			"   clear()"
+			"   load (state)()"
+			"   for i, s in pairs (scripts) do"
+			"    addinternal (i, s['n'], s['s'], load(s['f']), s['a'])"
+			"   end"
+			"   collectgarbage()"
+			"  end"
+			""
+			" return { call = call, add = add, remove = remove, get = get,"
+			"          restore = restore, save = save, clear = clear}"
+			" end"
+			" "
+			" manager = ScriptManager ()"
+			" ScriptManager = nil"
+			);
+
+	lua_State* L = lua.getState();
+
+	try {
+		luabridge::LuaRef lua_mgr = luabridge::getGlobal (L, "manager");
+		lua.do_command ("manager = nil"); // hide it.
+		lua.do_command ("collectgarbage()");
+
+		_lua_add_action = new luabridge::LuaRef(lua_mgr["add"]);
+		_lua_del_action = new luabridge::LuaRef(lua_mgr["remove"]);
+		_lua_get_action = new luabridge::LuaRef(lua_mgr["get"]);
+		_lua_call_action = new luabridge::LuaRef(lua_mgr["call"]);
+		_lua_save = new luabridge::LuaRef(lua_mgr["save"]);
+		_lua_load = new luabridge::LuaRef(lua_mgr["restore"]);
+		_lua_clear = new luabridge::LuaRef(lua_mgr["clear"]);
+
+	} catch (luabridge::LuaException const& e) {
+		fatal << string_compose (_("programming error: %1"),
+				X_("Failed to setup Lua action interpreter"))
+			<< endmsg;
+		abort(); /*NOTREACHED*/
+	}
+
+	register_classes (L);
+
+	luabridge::push <PublicEditor *> (L, &PublicEditor::instance());
+	lua_setglobal (L, "Editor");
+}
+
+void LuaInstance::set_session (Session* s)
+{
+	SessionHandlePtr::set_session (s);
+	if (!_session) {
+		return;
+	}
+
+	lua_State* L = lua.getState();
+	LuaBindings::set_session (L, _session);
+
+	for (LuaCallbackMap::iterator i = _callbacks.begin(); i != _callbacks.end(); ++i) {
+		i->second->set_session (s);
+	}
+	point_one_second_connection = Timers::rapid_connect (sigc::mem_fun(*this, & LuaInstance::every_point_one_seconds));
+}
+
+void
+LuaInstance::session_going_away ()
+{
+	ENSURE_GUI_THREAD (*this, &LuaInstance::session_going_away);
+	point_one_second_connection.disconnect ();
+
+	(*_lua_clear)();
+	for (int i = 0; i < 9; ++i) {
+		ActionChanged (i, ""); /* EMIT SIGNAL */
+	}
+	SessionHandlePtr::session_going_away ();
+	_session = 0;
+
+	lua_State* L = lua.getState();
+	LuaBindings::set_session (L, _session);
+	lua.do_command ("collectgarbage();");
+}
+
+void
+LuaInstance::every_point_one_seconds ()
+{
+	LuaTimerDS (); // emit signal
+}
+
+int
+LuaInstance::set_state (const XMLNode& node)
+{
+	LocaleGuard lg;
+	XMLNode* child;
+
+	if ((child = find_named_node (node, "ActionScript"))) {
+		for (XMLNodeList::const_iterator n = child->children ().begin (); n != child->children ().end (); ++n) {
+			if (!(*n)->is_content ()) { continue; }
+			gsize size;
+			guchar* buf = g_base64_decode ((*n)->content ().c_str (), &size);
+			try {
+				(*_lua_load)(std::string ((const char*)buf, size));
+			} catch (luabridge::LuaException const& e) {
+				cerr << "LuaException:" << e.what () << endl;
+			}
+			for (int i = 0; i < 9; ++i) {
+				std::string name;
+				if (lua_action_name (i, name)) {
+					ActionChanged (i, name); /* EMIT SIGNAL */
+				}
+			}
+			g_free (buf);
+		}
+	}
+
+	if ((child = find_named_node (node, "ActionHooks"))) {
+		for (XMLNodeList::const_iterator n = child->children ().begin (); n != child->children ().end (); ++n) {
+			try {
+				LuaCallbackPtr p (new LuaCallback (_session, *(*n)));
+				_callbacks.insert (std::make_pair(p->id(), p));
+				p->drop_callback.connect (_slotcon, MISSING_INVALIDATOR, boost::bind (&LuaInstance::unregister_lua_slot, this, p->id()), gui_context());
+				SlotChanged (p->id(), p->name(), p->signals()); /* EMIT SIGNAL */
+			} catch (luabridge::LuaException const& e) {
+				cerr << "LuaException:" << e.what () << endl;
+			}
+		}
+	}
+
+	return 0;
+}
+
+bool
+LuaInstance::interactive_add (LuaScriptInfo::ScriptType type, int id)
+{
+	std::string title;
+	std::vector<std::string> reg;
+
+	switch (type) {
+		case LuaScriptInfo::EditorAction:
+			reg = lua_action_names ();
+			title = "Add Lua Action";
+			break;
+		case LuaScriptInfo::EditorHook:
+			reg = lua_slot_names ();
+			title = "Add Lua Callback Hook";
+			break;
+		default:
+			return false;
+	}
+
+	LuaScriptInfoPtr spi;
+	ScriptSelector ss (title, type);
+	switch (ss.run ()) {
+		case Gtk::RESPONSE_ACCEPT:
+			spi = ss.script();
+			break;
+		default:
+			return false;
+	}
+	ss.hide ();
+
+	std::string script = "";
+
+	try {
+		script = Glib::file_get_contents (spi->path);
+	} catch (Glib::FileError e) {
+		string msg = string_compose (_("Cannot read script '%1': %2"), spi->path, e.what());
+		Gtk::MessageDialog am (msg);
+		am.run ();
+		return false;
+	}
+
+	LuaScriptParamList lsp = LuaScriptParams::script_params (spi, "action_params");
+
+	ScriptParameterDialog spd (_("Set Script Parameters"), spi, reg, lsp);
+	switch (spd.run ()) {
+		case Gtk::RESPONSE_ACCEPT:
+			break;
+		default:
+			return false;
+	}
+
+	switch (type) {
+		case LuaScriptInfo::EditorAction:
+			return set_lua_action (id, spd.name(), script, lsp);
+			break;
+		case LuaScriptInfo::EditorHook:
+			return register_lua_slot (spd.name(), script, lsp);
+			break;
+		default:
+			break;
+	}
+	return false;
+}
+
+XMLNode&
+LuaInstance::get_action_state ()
+{
+	LocaleGuard lg;
+	std::string saved;
+	{
+		luabridge::LuaRef savedstate ((*_lua_save)());
+		saved = savedstate.cast<std::string>();
+	}
+	lua.collect_garbage ();
+
+	gchar* b64 = g_base64_encode ((const guchar*)saved.c_str (), saved.size ());
+	std::string b64s (b64);
+	g_free (b64);
+
+	XMLNode* script_node = new XMLNode (X_("ActionScript"));
+	script_node->add_property (X_("lua"), LUA_VERSION);
+	script_node->add_content (b64s);
+
+	return *script_node;
+}
+
+XMLNode&
+LuaInstance::get_hook_state ()
+{
+	XMLNode* script_node = new XMLNode (X_("ActionHooks"));
+	for (LuaCallbackMap::const_iterator i = _callbacks.begin(); i != _callbacks.end(); ++i) {
+		script_node->add_child_nocopy (i->second->get_state ());
+	}
+	return *script_node;
+}
+
+void
+LuaInstance::call_action (const int id)
+{
+	try {
+		(*_lua_call_action)(id + 1);
+		lua.collect_garbage_step ();
+	} catch (luabridge::LuaException const& e) {
+		cerr << "LuaException:" << e.what () << endl;
+	}
+}
+
+bool
+LuaInstance::set_lua_action (
+		const int id,
+		const std::string& name,
+		const std::string& script,
+		const LuaScriptParamList& args)
+{
+	try {
+		lua_State* L = lua.getState();
+		// get bytcode of factory-function in a sandbox
+		// (don't allow scripts to interfere)
+		const std::string& bytecode = LuaScripting::get_factory_bytecode (script);
+		luabridge::LuaRef tbl_arg (luabridge::newTable(L));
+		for (LuaScriptParamList::const_iterator i = args.begin(); i != args.end(); ++i) {
+			if ((*i)->optional && !(*i)->is_set) { continue; }
+			tbl_arg[(*i)->name] = (*i)->value;
+		}
+		(*_lua_add_action)(id + 1, name, script, bytecode, tbl_arg);
+		ActionChanged (id, name); /* EMIT SIGNAL */
+	} catch (luabridge::LuaException const& e) {
+		cerr << "LuaException:" << e.what () << endl;
+		return false;
+	}
+	return true;
+}
+
+bool
+LuaInstance::remove_lua_action (const int id)
+{
+	try {
+		(*_lua_del_action)(id + 1);
+	} catch (luabridge::LuaException const& e) {
+		cerr << "LuaException:" << e.what () << endl;
+		return false;
+	}
+	ActionChanged (id, ""); /* EMIT SIGNAL */
+	return true;
+}
+
+bool
+LuaInstance::lua_action_name (const int id, std::string& rv)
+{
+	try {
+		luabridge::LuaRef ref ((*_lua_get_action)(id + 1));
+		if (ref.isNil()) {
+			return false;
+		}
+		if (ref["name"].isString()) {
+			rv = ref["name"].cast<std::string>();
+			return true;
+		}
+		return true;
+	} catch (luabridge::LuaException const& e) {
+		cerr << "LuaException:" << e.what () << endl;
+		return false;
+	}
+	return false;
+}
+
+std::vector<std::string>
+LuaInstance::lua_action_names ()
+{
+	std::vector<std::string> rv;
+	for (int i = 0; i < 9; ++i) {
+		std::string name;
+		if (lua_action_name (i, name)) {
+			rv.push_back (name);
+		}
+	}
+	return rv;
+}
+
+bool
+LuaInstance::lua_action (const int id, std::string& name, std::string& script, LuaScriptParamList& args)
+{
+	try {
+		luabridge::LuaRef ref ((*_lua_get_action)(id + 1));
+		if (ref.isNil()) {
+			return false;
+		}
+		if (!ref["name"].isString()) {
+			return false;
+		}
+		if (!ref["script"].isString()) {
+			return false;
+		}
+		if (!ref["args"].isTable()) {
+			return false;
+		}
+		name = ref["name"].cast<std::string>();
+		script = ref["script"].cast<std::string>();
+
+		args.clear();
+		LuaScriptInfoPtr lsi = LuaScripting::script_info (script);
+		if (!lsi) {
+			return false;
+		}
+		args = LuaScriptParams::script_params (lsi, "action_params");
+		luabridge::LuaRef rargs (ref["args"]);
+		LuaScriptParams::ref_to_params (args, &rargs);
+		return true;
+	} catch (luabridge::LuaException const& e) {
+		cerr << "LuaException:" << e.what () << endl;
+		return false;
+	}
+	return false;
+}
+
+bool
+LuaInstance::register_lua_slot (const std::string& name, const std::string& script, const ARDOUR::LuaScriptParamList& args)
+{
+	/* parse script, get ActionHook(s) from script */
+	ActionHook ah;
+	try {
+		LuaState l;
+#ifndef NDEBUG
+		l.Print.connect (&_lua_print);
+#endif
+		lua_State* L = l.getState();
+		register_hooks (L);
+		l.do_command ("function ardour () end");
+		l.do_command (script);
+		luabridge::LuaRef signals = luabridge::getGlobal (L, "signals");
+		if (signals.isFunction()) {
+			ah = signals();
+		}
+	} catch (luabridge::LuaException const& e) {
+		cerr << "LuaException:" << e.what () << endl;
+	}
+
+	if (ah.none ()) {
+		cerr << "Script registered no hooks." << endl;
+		return false;
+	}
+
+	/* register script w/args, get entry-point / ID */
+
+	try {
+		LuaCallbackPtr p (new LuaCallback (_session, name, script, ah, args));
+		_callbacks.insert (std::make_pair(p->id(), p));
+		p->drop_callback.connect (_slotcon, MISSING_INVALIDATOR, boost::bind (&LuaInstance::unregister_lua_slot, this, p->id()), gui_context());
+		SlotChanged (p->id(), p->name(), p->signals()); /* EMIT SIGNAL */
+		return true;
+	} catch (luabridge::LuaException const& e) {
+		cerr << "LuaException:" << e.what () << endl;
+	}
+	return false;
+}
+
+bool
+LuaInstance::unregister_lua_slot (const PBD::ID& id)
+{
+	LuaCallbackMap::iterator i = _callbacks.find (id);
+	if (i != _callbacks.end()) {
+		SlotChanged (id, "", ActionHook()); /* EMIT SIGNAL */
+		_callbacks.erase (i);
+		return true;
+	}
+	return false;
+}
+
+std::vector<PBD::ID>
+LuaInstance::lua_slots () const
+{
+	std::vector<PBD::ID> rv;
+	for (LuaCallbackMap::const_iterator i = _callbacks.begin(); i != _callbacks.end(); ++i) {
+		rv.push_back (i->first);
+	}
+	return rv;
+}
+
+bool
+LuaInstance::lua_slot_name (const PBD::ID& id, std::string& name) const
+{
+	LuaCallbackMap::const_iterator i = _callbacks.find (id);
+	if (i != _callbacks.end()) {
+		name = i->second->name();
+		return true;
+	}
+	return false;
+}
+
+std::vector<std::string>
+LuaInstance::lua_slot_names () const
+{
+	std::vector<std::string> rv;
+	std::vector<PBD::ID> ids = lua_slots();
+	for (std::vector<PBD::ID>::const_iterator i = ids.begin(); i != ids.end(); ++i) {
+		std::string name;
+		if (lua_slot_name (*i, name)) {
+			rv.push_back (name);
+		}
+	}
+	return rv;
+}
+
+bool
+LuaInstance::lua_slot (const PBD::ID& id, std::string& name, std::string& script, ActionHook& ah, ARDOUR::LuaScriptParamList& args)
+{
+	LuaCallbackMap::const_iterator i = _callbacks.find (id);
+	if (i == _callbacks.end()) {
+		return false; // error
+	}
+	return i->second->lua_slot (name, script, ah, args);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+LuaCallback::LuaCallback (Session *s,
+		const std::string& name,
+		const std::string& script,
+		const ActionHook& ah,
+		const ARDOUR::LuaScriptParamList& args)
+	: SessionHandlePtr (s)
+	, _id ("0")
+	, _name (name)
+	, _signals (ah)
+{
+	// TODO: allow to reference object (e.g region)
+	init ();
+
+	lua_State* L = lua.getState();
+	luabridge::LuaRef tbl_arg (luabridge::newTable(L));
+	for (LuaScriptParamList::const_iterator i = args.begin(); i != args.end(); ++i) {
+		if ((*i)->optional && !(*i)->is_set) { continue; }
+		tbl_arg[(*i)->name] = (*i)->value;
+	}
+
+	try {
+	const std::string& bytecode = LuaScripting::get_factory_bytecode (script);
+	(*_lua_add)(name, script, bytecode, tbl_arg);
+	} catch (luabridge::LuaException const& e) {
+		cerr << "LuaException:" << e.what () << endl;
+		throw failed_constructor ();
+	}
+
+	_id.reset ();
+	set_session (s);
+}
+
+LuaCallback::LuaCallback (Session *s, XMLNode & node)
+	: SessionHandlePtr (s)
+{
+	XMLNode* child = NULL;
+	if (node.name() != X_("LuaCallback")
+			|| !node.property ("signals")
+			|| !node.property ("id")
+			|| !node.property ("name")) {
+		throw failed_constructor ();
+	}
+
+	for (XMLNodeList::const_iterator n = node.children ().begin (); n != node.children ().end (); ++n) {
+		if (!(*n)->is_content ()) { continue; }
+		child = *n;
+	}
+
+	if (!child) {
+		throw failed_constructor ();
+	}
+
+	init ();
+
+	_id = PBD::ID (node.property ("id")->value ());
+	_name = node.property ("name")->value ();
+	_signals = ActionHook (node.property ("signals")->value ());
+
+	gsize size;
+	guchar* buf = g_base64_decode (child->content ().c_str (), &size);
+	try {
+		(*_lua_load)(std::string ((const char*)buf, size));
+	} catch (luabridge::LuaException const& e) {
+		cerr << "LuaException:" << e.what () << endl;
+	}
+	g_free (buf);
+
+	set_session (s);
+}
+
+LuaCallback::~LuaCallback ()
+{
+	delete _lua_add;
+	delete _lua_get;
+	delete _lua_call;
+	delete _lua_load;
+	delete _lua_save;
+}
+
+XMLNode&
+LuaCallback::get_state (void)
+{
+	std::string saved;
+	{
+		luabridge::LuaRef savedstate ((*_lua_save)());
+		saved = savedstate.cast<std::string>();
+	}
+	lua.collect_garbage ();
+
+	gchar* b64 = g_base64_encode ((const guchar*)saved.c_str (), saved.size ());
+	std::string b64s (b64);
+	g_free (b64);
+
+	XMLNode* script_node = new XMLNode (X_("LuaCallback"));
+	script_node->add_property (X_("lua"), LUA_VERSION);
+	script_node->add_property (X_("id"), _id.to_s ());
+	script_node->add_property (X_("name"), _name);
+	script_node->add_property (X_("signals"), _signals.to_string ());
+	script_node->add_content (b64s);
+	return *script_node;
+}
+
+void
+LuaCallback::init (void)
+{
+#ifndef NDEBUG
+	lua.Print.connect (&_lua_print);
+#endif
+
+	lua.do_command (
+			"function ScriptManager ()"
+			"  local self = { script = {}, instance = {} }"
+			""
+			"  local addinternal = function (n, s, f, a)"
+			"   assert(type(n) == 'string', 'Name must be string')"
+			"   assert(type(s) == 'string', 'Script must be string')"
+			"   assert(type(f) == 'function', 'Factory is a not a function')"
+			"   assert(type(a) == 'table' or type(a) == 'nil', 'Given argument is invalid')"
+			"   self.script = { ['n'] = n, ['s'] = s, ['f'] = f, ['a'] = a }"
+			"   local env = _ENV;  env.f = nil env.debug = nil os.exit = nil require = nil dofile = nil loadfile = nil package = nil"
+			"   self.instance = load (string.dump(f, true), nil, nil, env)(a)"
+			"  end"
+			""
+			"  local call = function (...)"
+			"   if type(self.instance) == 'function' then"
+			"     local status, err = pcall (self.instance, ...)"
+			"     if not status then"
+			"       print ('callback \"'.. self.script['n'] .. '\": ', err)" // error out
+			"       self.script = nil"
+			"       self.instance = nil"
+			"       return false"
+			"     end"
+			"   end"
+			"   collectgarbage()"
+			"   return true"
+			"  end"
+			""
+			"  local add = function (n, s, b, a)"
+			"   assert(type(b) == 'string', 'ByteCode must be string')"
+			"   load (b)()" // assigns f
+			"   assert(type(f) == 'string', 'Assigned ByteCode must be string')"
+			"   addinternal (n, s, load(f), a)"
+			"  end"
+			""
+			"  local get = function ()"
+			"   if type(self.instance) == 'function' and type(self.script['n']) == 'string' then"
+			"    return { ['name'] = self.script['n'],"
+			"             ['script'] = self.script['s'],"
+			"             ['args'] = self.script['a'] }"
+			"   end"
+			"   return nil"
+			"  end"
+			""
+			// code dup
+			""
+			"  local function basic_serialize (o)"
+			"    if type(o) == \"number\" then"
+			"     return tostring(o)"
+			"    else"
+			"     return string.format(\"%q\", o)"
+			"    end"
+			"  end"
+			""
+			"  local function serialize (name, value)"
+			"   local rv = name .. ' = '"
+			"   collectgarbage()"
+			"   if type(value) == \"number\" or type(value) == \"string\" or type(value) == \"nil\" then"
+			"    return rv .. basic_serialize(value) .. ' '"
+			"   elseif type(value) == \"table\" then"
+			"    rv = rv .. '{} '"
+			"    for k,v in pairs(value) do"
+			"     local fieldname = string.format(\"%s[%s]\", name, basic_serialize(k))"
+			"     rv = rv .. serialize(fieldname, v) .. ' '"
+			"     collectgarbage()" // string concatenation allocates a new string
+			"    end"
+			"    return rv;"
+			"   elseif type(value) == \"function\" then"
+			"     return rv .. string.format(\"%q\", string.dump(value, true))"
+			"   else"
+			"    error('cannot save a ' .. type(value))"
+			"   end"
+			"  end"
+			""
+			// end code dup
+			""
+			"  local save = function ()"
+			"   return (serialize('s', self.script))"
+			"  end"
+			""
+			"  local restore = function (state)"
+			"   self.script = {}"
+			"   load (state)()"
+			"   addinternal (s['n'], s['s'], load(s['f']), s['a'])"
+			"  end"
+			""
+			" return { call = call, add = add, get = get,"
+			"          restore = restore, save = save}"
+			" end"
+			" "
+			" manager = ScriptManager ()"
+			" ScriptManager = nil"
+			);
+
+	lua_State* L = lua.getState();
+
+	try {
+		luabridge::LuaRef lua_mgr = luabridge::getGlobal (L, "manager");
+		lua.do_command ("manager = nil"); // hide it.
+		lua.do_command ("collectgarbage()");
+
+		_lua_add = new luabridge::LuaRef(lua_mgr["add"]);
+		_lua_get = new luabridge::LuaRef(lua_mgr["get"]);
+		_lua_call = new luabridge::LuaRef(lua_mgr["call"]);
+		_lua_save = new luabridge::LuaRef(lua_mgr["save"]);
+		_lua_load = new luabridge::LuaRef(lua_mgr["restore"]);
+
+	} catch (luabridge::LuaException const& e) {
+		fatal << string_compose (_("programming error: %1"),
+				X_("Failed to setup Lua callback interpreter"))
+			<< endmsg;
+		abort(); /*NOTREACHED*/
+	}
+
+	LuaInstance::register_classes (L);
+
+	luabridge::push <PublicEditor *> (L, &PublicEditor::instance());
+	lua_setglobal (L, "Editor");
+}
+
+bool
+LuaCallback::lua_slot (std::string& name, std::string& script, ActionHook& ah, ARDOUR::LuaScriptParamList& args)
+{
+	// TODO consolidate w/ LuaInstance::lua_action()
+	try {
+		luabridge::LuaRef ref = (*_lua_get)();
+		if (ref.isNil()) {
+			return false;
+		}
+		if (!ref["name"].isString()) {
+			return false;
+		}
+		if (!ref["script"].isString()) {
+			return false;
+		}
+		if (!ref["args"].isTable()) {
+			return false;
+		}
+
+		ah = _signals;
+		name = ref["name"].cast<std::string> ();
+		script = ref["script"].cast<std::string> ();
+
+		args.clear();
+		LuaScriptInfoPtr lsi = LuaScripting::script_info (script);
+		if (!lsi) {
+			return false;
+		}
+		args = LuaScriptParams::script_params (lsi, "action_params");
+		luabridge::LuaRef rargs (ref["args"]);
+		LuaScriptParams::ref_to_params (args, &rargs);
+		return true;
+	} catch (luabridge::LuaException const& e) {
+		cerr << "LuaException:" << e.what () << endl;
+		return false;
+	}
+	return false;
+}
+
+void
+LuaCallback::set_session (ARDOUR::Session *s)
+{
+	SessionHandlePtr::set_session (s);
+
+	if (!_session) {
+		return;
+	}
+
+	lua_State* L = lua.getState();
+	LuaBindings::set_session (L, _session);
+
+	reconnect();
+}
+
+void
+LuaCallback::session_going_away ()
+{
+	ENSURE_GUI_THREAD (*this, &LuaCallback::session_going_away);
+	lua.do_command ("collectgarbage();");
+
+	SessionHandlePtr::session_going_away ();
+	_session = 0;
+
+	drop_callback (); /* EMIT SIGNAL */
+
+	lua_State* L = lua.getState();
+	LuaBindings::set_session (L, 0);
+	lua.do_command ("collectgarbage();");
+}
+
+void
+LuaCallback::reconnect ()
+{
+	_connections.drop_connections ();
+	if ((*_lua_get) ().isNil ()) {
+		drop_callback (); /* EMIT SIGNAL */
+		return;
+	}
+
+	// TODO pass object which emits the signal (e.g region)
+	//
+	// save/load bound objects will be tricky.
+	// Best idea so far is to save/lookup the PBD::ID
+	// (either use boost::any indirection or templates for bindable
+	// object types or a switch statement..)
+	//
+	// _session->route_by_id ()
+	// _session->track_by_diskstream_id ()
+	// _session->source_by_id ()
+	// _session->controllable_by_id ()
+	// _session->processor_by_id ()
+	// RegionFactory::region_by_id ()
+	//
+	// TODO loop over objects (if any)
+
+	reconnect_object ((void*)0);
+}
+
+template <class T> void
+LuaCallback::reconnect_object (T obj)
+{
+	for (uint32_t i = 0; i < LuaSignal::LAST_SIGNAL; ++i) {
+		if (_signals[i]) {
+#define ENGINE(n,c,p) else if (i == LuaSignal::n) { connect_ ## p (LuaSignal::n, AudioEngine::instance(), &(AudioEngine::instance()->c)); }
+#define SESSION(n,c,p) else if (i == LuaSignal::n) { if (_session) { connect_ ## p (LuaSignal::n, _session, &(_session->c)); } }
+#define STATIC(n,c,p) else if (i == LuaSignal::n) { connect_ ## p (LuaSignal::n, obj, c); }
+			if (0) {}
+#			include "luasignal_syms.h"
+			else {
+				PBD::fatal << string_compose (_("programming error: %1: %2"), "Impossible LuaSignal type", i) << endmsg;
+				abort(); /*NOTREACHED*/
+			}
+#undef ENGINE
+#undef SESSION
+#undef STATIC
+		}
+	}
+}
+
+template <typename T, typename S> void
+LuaCallback::connect_0 (enum LuaSignal::LuaSignal ls, T ref, S *signal) {
+	signal->connect (
+			_connections, invalidator (*this),
+			boost::bind (&LuaCallback::proxy_0<T>, this, ls, ref),
+			gui_context());
+}
+
+template <typename T, typename C1> void
+LuaCallback::connect_1 (enum LuaSignal::LuaSignal ls, T ref, PBD::Signal1<void, C1> *signal) {
+	signal->connect (
+			_connections, invalidator (*this),
+			boost::bind (&LuaCallback::proxy_1<T, C1>, this, ls, ref, _1),
+			gui_context());
+}
+
+template <typename T, typename C1, typename C2> void
+LuaCallback::connect_2 (enum LuaSignal::LuaSignal ls, T ref, PBD::Signal2<void, C1, C2> *signal) {
+	signal->connect (
+			_connections, invalidator (*this),
+			boost::bind (&LuaCallback::proxy_2<T, C1, C2>, this, ls, ref, _1, _2),
+			gui_context());
+}
+
+template <typename T> void
+LuaCallback::proxy_0 (enum LuaSignal::LuaSignal ls, T ref) {
+	bool ok = true;
+	{
+		const luabridge::LuaRef& rv ((*_lua_call)((int)ls, ref));
+		if (! rv.cast<bool> ()) {
+			ok = false;
+		}
+	}
+	/* destroy LuaRef ^^ first before calling drop_callback() */
+	if (!ok) {
+		drop_callback (); /* EMIT SIGNAL */
+	}
+}
+
+template <typename T, typename C1> void
+LuaCallback::proxy_1 (enum LuaSignal::LuaSignal ls, T ref, C1 a1) {
+	bool ok = true;
+	{
+		const luabridge::LuaRef& rv ((*_lua_call)((int)ls, ref, a1));
+		if (! rv.cast<bool> ()) {
+			ok = false;
+		}
+	}
+	if (!ok) {
+		drop_callback (); /* EMIT SIGNAL */
+	}
+}
+
+template <typename T, typename C1, typename C2> void
+LuaCallback::proxy_2 (enum LuaSignal::LuaSignal ls, T ref, C1 a1, C2 a2) {
+	bool ok = true;
+	{
+		const luabridge::LuaRef& rv ((*_lua_call)((int)ls, ref, a1, a2));
+		if (! rv.cast<bool> ()) {
+			ok = false;
+		}
+	}
+	if (!ok) {
+		drop_callback (); /* EMIT SIGNAL */
+	}
+}
diff --git a/gtk2_ardour/luainstance.h b/gtk2_ardour/luainstance.h
new file mode 100644
index 0000000..4291732
--- /dev/null
+++ b/gtk2_ardour/luainstance.h
@@ -0,0 +1,142 @@
+#ifndef __gtkardour_luainstance_h__
+#define __gtkardour_luainstance_h__
+
+#include <bitset>
+
+#include "pbd/id.h"
+#include "pbd/signals.h"
+#include "pbd/xml++.h"
+
+#include "ardour/luascripting.h"
+#include "ardour/lua_script_params.h"
+#include "ardour/luabindings.h"
+#include "ardour/session_handle.h"
+
+#include "lua/luastate.h"
+
+#include "luasignal.h"
+
+namespace luabridge {
+	class LuaRef;
+}
+
+typedef std::bitset<LuaSignal::LAST_SIGNAL> ActionHook;
+
+class LuaCallback : public ARDOUR::SessionHandlePtr, public sigc::trackable
+{
+public:
+	LuaCallback (ARDOUR::Session*, const std::string&, const std::string&, const ActionHook&, const ARDOUR::LuaScriptParamList&);
+	LuaCallback (ARDOUR::Session*, XMLNode & node);
+	~LuaCallback ();
+
+	XMLNode& get_state (void);
+	void set_session (ARDOUR::Session *);
+
+	const PBD::ID& id () const { return _id; }
+	const std::string& name () const { return _name; }
+	ActionHook signals () const { return _signals; }
+	bool lua_slot (std::string&, std::string&, ActionHook&, ARDOUR::LuaScriptParamList&);
+	PBD::Signal0<void> drop_callback;
+
+protected:
+	void session_going_away ();
+
+private:
+	LuaState lua;
+
+	PBD::ID _id;
+	std::string _name;
+	ActionHook _signals;
+
+	void reconnect ();
+	template <class T> void reconnect_object (T);
+	void init ();
+
+	luabridge::LuaRef * _lua_add;
+	luabridge::LuaRef * _lua_get;
+	luabridge::LuaRef * _lua_call;
+	luabridge::LuaRef * _lua_save;
+	luabridge::LuaRef * _lua_load;
+
+	PBD::ScopedConnectionList _connections;
+
+	template <typename T, typename S> void connect_0 (enum LuaSignal::LuaSignal, T, S*);
+	template <typename T> void proxy_0 (enum LuaSignal::LuaSignal, T);
+
+	template <typename T, typename C1> void connect_1 (enum LuaSignal::LuaSignal, T, PBD::Signal1<void, C1>*);
+	template <typename T, typename C1> void proxy_1 (enum LuaSignal::LuaSignal, T, C1);
+
+	template <typename T, typename C1, typename C2> void connect_2 (enum LuaSignal::LuaSignal, T, PBD::Signal2<void, C1, C2>*);
+	template <typename T, typename C1, typename C2> void proxy_2 (enum LuaSignal::LuaSignal, T, C1, C2);
+};
+
+typedef boost::shared_ptr<LuaCallback> LuaCallbackPtr;
+typedef std::map<PBD::ID, LuaCallbackPtr> LuaCallbackMap;
+
+
+
+class LuaInstance : public PBD::ScopedConnectionList, public ARDOUR::SessionHandlePtr
+{
+public:
+	static LuaInstance* instance();
+	~LuaInstance();
+
+	static void register_classes (lua_State* L);
+	static void register_hooks (lua_State* L);
+	static void bind_cairo (lua_State* L);
+
+	void set_session (ARDOUR::Session* s);
+
+	int set_state (const XMLNode&);
+	XMLNode& get_action_state (void);
+	XMLNode& get_hook_state (void);
+
+	bool interactive_add (ARDOUR::LuaScriptInfo::ScriptType, int);
+
+	/* actions */
+	void call_action (const int);
+
+	bool set_lua_action (const int, const std::string&, const std::string&, const ARDOUR::LuaScriptParamList&);
+	bool remove_lua_action (const int);
+	bool lua_action_name (const int, std::string&);
+	std::vector<std::string> lua_action_names ();
+	bool lua_action (const int, std::string&, std::string&, ARDOUR::LuaScriptParamList&);
+	sigc::signal<void,int,std::string> ActionChanged;
+
+	/* callbacks */
+	bool register_lua_slot (const std::string&, const std::string&, const ARDOUR::LuaScriptParamList&);
+	bool unregister_lua_slot (const PBD::ID&);
+	std::vector<PBD::ID> lua_slots () const;
+	bool lua_slot_name (const PBD::ID&, std::string&) const;
+	std::vector<std::string> lua_slot_names () const;
+	bool lua_slot (const PBD::ID&, std::string&, std::string&, ActionHook&, ARDOUR::LuaScriptParamList&);
+	sigc::signal<void,PBD::ID,std::string,ActionHook> SlotChanged;
+
+	static PBD::Signal0<void> LuaTimerDS; // deci-seconds (Timer every .1s)
+
+private:
+	LuaInstance();
+	static LuaInstance* _instance;
+
+	void init ();
+	void session_going_away ();
+
+	LuaState lua;
+
+	luabridge::LuaRef * _lua_call_action;
+	luabridge::LuaRef * _lua_add_action;
+	luabridge::LuaRef * _lua_del_action;
+	luabridge::LuaRef * _lua_get_action;
+
+	luabridge::LuaRef * _lua_load;
+	luabridge::LuaRef * _lua_save;
+	luabridge::LuaRef * _lua_clear;
+
+	LuaCallbackMap _callbacks;
+	PBD::ScopedConnectionList _slotcon;
+
+	void every_point_one_seconds ();
+	sigc::connection point_one_second_connection;
+};
+
+#endif
diff --git a/gtk2_ardour/luasignal.h b/gtk2_ardour/luasignal.h
new file mode 100644
index 0000000..ef2de4f
--- /dev/null
+++ b/gtk2_ardour/luasignal.h
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+#ifndef _luasignal_h_
+#define _luasignal_h_
+namespace LuaSignal {
+
+#define ENGINE(name,c,p) name,
+#define STATIC(name,c,p) name,
+#define SESSION(name,c,p) name,
+
+	enum LuaSignal {
+#		include "luasignal_syms.h"
+		LAST_SIGNAL
+	};
+
+#undef ENGINE
+#undef SESSION
+#undef STATIC
+
+extern const char *luasignalstr[];
+inline const char* enum2str (LuaSignal i) { return luasignalstr[i]; }
+LuaSignal str2luasignal (const std::string &);
+
+} // namespace
+#endif
diff --git a/gtk2_ardour/luasignal_syms.h b/gtk2_ardour/luasignal_syms.h
new file mode 100644
index 0000000..9cd1af7
--- /dev/null
+++ b/gtk2_ardour/luasignal_syms.h
@@ -0,0 +1,94 @@
+/*
+ * Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+
+// editor
+#if 0
+STATIC(SessionLoad, &, 0)
+STATIC(SessionClose, &, 0)
+#endif
+//STATIC(EverySecond, get_timers().second, 0) // XXX
+STATIC(ConfigChanged, &ARDOUR::Config->ParameterChanged, 1)
+
+// engine instance
+ENGINE(EngineRunning, Running, 0)
+ENGINE(EngineStopped, Stopped, 0)
+ENGINE(EngineHalted, Halted, 1)
+ENGINE(EngineDeviceListChanged, DeviceListChanged, 0)
+ENGINE(BufferSizeChanged, BufferSizeChanged, 1)
+ENGINE(SampleRateChanged, SampleRateChanged, 1)
+
+// session static
+STATIC(FeedbackDetected, &ARDOUR::Session::FeedbackDetected, 0)
+STATIC(SuccessfulGraphSort, &ARDOUR::Session::SuccessfulGraphSort, 0)
+STATIC(StartTimeChanged, &ARDOUR::Session::StartTimeChanged, 1)
+STATIC(EndTimeChanged, &ARDOUR::Session::EndTimeChanged, 1)
+STATIC(Exported, &ARDOUR::Session::Exported, 2)
+
+// stripable static globals
+STATIC(Change, &PresentationInfo::Change, 0)
+
+// session specific (re-subscribe when session changes)
+SESSION(SessionConfigChanged, config.ParameterChanged, 1)
+SESSION(TransportStateChange, TransportStateChange, 0)
+SESSION(DirtyChanged, DirtyChanged, 0)
+SESSION(StateSaved, StateSaved, 1)
+SESSION(Xrun, Xrun, 1)
+SESSION(TransportLooped, TransportLooped, 0)
+SESSION(SoloActive, SoloActive, 1)
+SESSION(SoloChanged, SoloChanged, 0)
+SESSION(IsolatedChanged, IsolatedChanged, 0)
+SESSION(MonitorChanged, MonitorChanged, 0)
+SESSION(RecordStateChanged, RecordStateChanged, 0)
+SESSION(RecordArmStateChanged, RecordArmStateChanged, 0)
+SESSION(AudioLoopLocationChanged, auto_loop_location_changed, 1)
+SESSION(AudioPunchLocationChanged, auto_punch_location_changed, 1)
+SESSION(LocationsModified, locations_modified, 0)
+SESSION(AuditionActive, AuditionActive, 1)
+SESSION(BundleAddedOrRemoved, BundleAddedOrRemoved, 0)
+SESSION(PositionChanged, PositionChanged, 1)
+SESSION(Located, Located, 0)
+SESSION(RoutesReconnected, session_routes_reconnected, 0)
+SESSION(RouteAdded, RouteAdded, 1)
+SESSION(RouteGroupPropertyChanged, RouteGroupPropertyChanged, 1)
+SESSION(RouteAddedToRouteGroup, RouteAddedToRouteGroup, 2)
+SESSION(RouteRemovedFromRouteGroup, RouteRemovedFromRouteGroup, 2)
+SESSION(StepEditStatusChange, StepEditStatusChange, 1)
+SESSION(RouteGroupAdded, route_group_added, 1)
+SESSION(RouteGroupRemoved, route_group_removed, 0)
+SESSION(RouteGroupsReordered, route_groups_reordered, 0)
+
+// plugin manager instance
+STATIC(PluginListChanged, &(PluginManager::instance().PluginListChanged), 0)
+STATIC(PluginStatusesChanged, &(PluginManager::instance().PluginStatusesChanged), 0)
+
+// Diskstream static global
+STATIC(DiskOverrun, &ARDOUR::Diskstream::DiskOverrun, 0)
+STATIC(DiskUnderrun, &ARDOUR::Diskstream::DiskUnderrun, 0)
+
+// Region static
+STATIC(RegionPropertyChanged, &ARDOUR::Region::RegionPropertyChanged, 2)
+
+// Timers
+STATIC(LuaTimerDS, &LuaInstance::LuaTimerDS, 0)
+
+// TODO per track/route signals,
+// TODO per plugin actions / controllables
+// TODO per region actions
+//SESSIONOBJECT(PropertyChanged, &ARDOUR::Stateful::PropertyChanged, 1)
+
+// TODO any location action
diff --git a/gtk2_ardour/luawindow.cc b/gtk2_ardour/luawindow.cc
new file mode 100644
index 0000000..4733bcb
--- /dev/null
+++ b/gtk2_ardour/luawindow.cc
@@ -0,0 +1,723 @@
+/*
+    Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#ifdef PLATFORM_WINDOWS
+#define random() rand()
+#endif
+
+#ifdef WAF_BUILD
+#include "gtk2ardour-config.h"
+#endif
+
+#include "pbd/gstdio_compat.h"
+#include <glibmm/fileutils.h>
+#include <gtkmm/messagedialog.h>
+
+#include "pbd/basename.h"
+#include "pbd/file_utils.h"
+#include "pbd/md5.h"
+
+#include "gtkmm2ext/gtk_ui.h"
+#include "gtkmm2ext/pane.h"
+#include "gtkmm2ext/utils.h"
+#include "gtkmm2ext/window_title.h"
+
+#include "ardour/filesystem_paths.h"
+#include "ardour/luabindings.h"
+#include "LuaBridge/LuaBridge.h"
+
+#include "ardour_ui.h"
+#include "gui_thread.h"
+#include "luainstance.h"
+#include "luawindow.h"
+#include "public_editor.h"
+#include "tooltips.h"
+#include "utils.h"
+#include "utils_videotl.h"
+
+#include "pbd/i18n.h"
+
+using namespace ARDOUR;
+using namespace ARDOUR_UI_UTILS;
+using namespace PBD;
+using namespace Gtk;
+using namespace Glib;
+using namespace Gtkmm2ext;
+using namespace std;
+
+
+inline LuaWindow::BufferFlags operator| (const LuaWindow::BufferFlags& a, const LuaWindow::BufferFlags& b) {
+	return static_cast<LuaWindow::BufferFlags> (static_cast <int>(a) | static_cast<int> (b));
+}
+
+inline LuaWindow::BufferFlags operator|= (LuaWindow::BufferFlags& a, const LuaWindow::BufferFlags& b) {
+	return a = static_cast<LuaWindow::BufferFlags> (static_cast <int>(a) | static_cast<int> (b));
+}
+
+inline LuaWindow::BufferFlags operator&= (LuaWindow::BufferFlags& a, const LuaWindow::BufferFlags& b) {
+	return a = static_cast<LuaWindow::BufferFlags> (static_cast <int>(a) & static_cast<int> (b));
+}
+
+LuaWindow* LuaWindow::_instance = 0;
+
+LuaWindow*
+LuaWindow::instance ()
+{
+	if (!_instance) {
+		_instance  = new LuaWindow;
+	}
+
+	return _instance;
+}
+
+LuaWindow::LuaWindow ()
+	: Window (Gtk::WINDOW_TOPLEVEL)
+	, VisibilityTracker (*((Gtk::Window*) this))
+	, lua (0)
+	, _visible (false)
+	, _menu_scratch (0)
+	, _menu_snippet (0)
+	, _menu_actions (0)
+	, _btn_run (_("Run"))
+	, _btn_clear (_("Clear Output"))
+	, _btn_open (_("Import"))
+	, _btn_save (_("Save"))
+	, _btn_delete (_("Delete"))
+	, _btn_revert (_("Revert"))
+	, _current_buffer ()
+{
+	set_name ("Lua");
+
+	reinit_lua ();
+	update_title ();
+	set_wmclass (X_("ardour_mixer"), PROGRAM_NAME);
+
+	script_select.disable_scrolling ();
+
+	set_border_width (0);
+
+	outtext.set_editable (false);
+	outtext.set_wrap_mode (Gtk::WRAP_WORD);
+	outtext.set_cursor_visible (false);
+
+	signal_delete_event().connect (sigc::mem_fun (*this, &LuaWindow::hide_window));
+	signal_configure_event().connect (sigc::mem_fun (*ARDOUR_UI::instance(), &ARDOUR_UI::configure_handler));
+
+	_btn_run.signal_clicked.connect (sigc::mem_fun(*this, &LuaWindow::run_script));
+	_btn_clear.signal_clicked.connect (sigc::mem_fun(*this, &LuaWindow::clear_output));
+	_btn_open.signal_clicked.connect (sigc::mem_fun(*this, &LuaWindow::import_script));
+	_btn_save.signal_clicked.connect (sigc::mem_fun(*this, &LuaWindow::save_script));
+	_btn_delete.signal_clicked.connect (sigc::mem_fun(*this, &LuaWindow::delete_script));
+	_btn_revert.signal_clicked.connect (sigc::mem_fun(*this, &LuaWindow::revert_script));
+
+	_btn_open.set_sensitive (false); // TODO
+	_btn_save.set_sensitive (false);
+	_btn_delete.set_sensitive (false);
+	_btn_revert.set_sensitive (false);
+
+	// layout
+
+	Gtk::ScrolledWindow *scrollin = manage (new Gtk::ScrolledWindow);
+	scrollin->set_policy (Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC);
+	scrollin->add (entry);
+	scrollout.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_ALWAYS);
+	scrollout.add (outtext);
+
+	entry.set_name ("ArdourLuaEntry");
+	outtext.set_name ("ArdourLuaEntry");
+
+	Gtk::HBox *hbox = manage (new HBox());
+
+	hbox->pack_start (_btn_run, false, false, 2);
+	hbox->pack_start (_btn_clear, false, false, 2);
+	hbox->pack_start (_btn_open, false, false, 2);
+	hbox->pack_start (_btn_save, false, false, 2);
+	hbox->pack_start (_btn_delete, false, false, 2);
+	hbox->pack_start (_btn_revert, false, false, 2);
+	hbox->pack_start (script_select, false, false, 2);
+
+	Gtk::VBox *vbox = manage (new VBox());
+	vbox->pack_start (*scrollin, true, true, 0);
+	vbox->pack_start (*hbox, false, false, 2);
+
+	Gtkmm2ext::VPane *vpane = manage (new Gtkmm2ext::VPane ());
+	vpane->add (*vbox);
+	vpane->add (scrollout);
+
+	vpane->show_all ();
+	add (*vpane);
+	set_size_request (640, 480); // XXX
+	ARDOUR_UI_UTILS::set_tooltip (script_select, _("Select Editor Buffer"));
+
+	setup_buffers ();
+	LuaScripting::instance().scripts_changed.connect (*this, invalidator (*this), boost::bind (&LuaWindow::refresh_scriptlist, this), gui_context());
+
+	Glib::RefPtr<Gtk::TextBuffer> tb (entry.get_buffer());
+	_script_changed_connection = tb->signal_changed().connect (sigc::mem_fun(*this, &LuaWindow::script_changed));
+}
+
+LuaWindow::~LuaWindow ()
+{
+	delete lua;
+}
+
+void
+LuaWindow::show_window ()
+{
+	present();
+	_visible = true;
+}
+
+bool
+LuaWindow::hide_window (GdkEventAny *ev)
+{
+	if (!_visible) return 0;
+	_visible = false;
+	return just_hide_it (ev, static_cast<Gtk::Window *>(this));
+}
+
+void LuaWindow::reinit_lua ()
+{
+	ENSURE_GUI_THREAD (*this, &LuaWindow::session_going_away);
+	delete lua;
+	lua = new LuaState();
+	lua->Print.connect (sigc::mem_fun (*this, &LuaWindow::append_text));
+
+	lua_State* L = lua->getState();
+	LuaInstance::register_classes (L);
+	luabridge::push <PublicEditor *> (L, &PublicEditor::instance());
+	lua_setglobal (L, "Editor");
+}
+
+void LuaWindow::set_session (Session* s)
+{
+	SessionHandlePtr::set_session (s);
+	if (!_session) {
+		return;
+	}
+
+	update_title ();
+	_session->DirtyChanged.connect (_session_connections, invalidator (*this), boost::bind (&LuaWindow::update_title, this), gui_context());
+
+	lua_State* L = lua->getState();
+	LuaBindings::set_session (L, _session);
+}
+
+void
+LuaWindow::session_going_away ()
+{
+	ENSURE_GUI_THREAD (*this, &LuaWindow::session_going_away);
+	reinit_lua (); // drop state (all variables, session references)
+
+	SessionHandlePtr::session_going_away ();
+	_session = 0;
+	update_title ();
+
+	lua_State* L = lua->getState();
+	LuaBindings::set_session (L, _session);
+}
+
+void
+LuaWindow::update_title ()
+{
+	if (_session) {
+		string n;
+
+		if (_session->snap_name() != _session->name()) {
+			n = _session->snap_name ();
+		} else {
+			n = _session->name ();
+		}
+
+		if (_session->dirty ()) {
+			n = "*" + n;
+		}
+
+		WindowTitle title (n);
+		title += S_("Window|Lua");
+		title += Glib::get_application_name ();
+		set_title (title.get_string());
+
+	} else {
+		WindowTitle title (S_("Window|Lua"));
+		title += Glib::get_application_name ();
+		set_title (title.get_string());
+	}
+}
+
+void
+LuaWindow::scroll_to_bottom ()
+{
+	Gtk::Adjustment *adj;
+	adj = scrollout.get_vadjustment();
+	adj->set_value (MAX(0,(adj->get_upper() - adj->get_page_size())));
+}
+
+void
+LuaWindow::run_script ()
+{
+	Glib::RefPtr<Gtk::TextBuffer> tb (entry.get_buffer());
+	std::string script = tb->get_text();
+	const std::string& bytecode = LuaScripting::get_factory_bytecode (script);
+	if (bytecode.empty()) {
+		// plain script or faulty script -- run directly
+		try {
+			lua->do_command ("function ardour () end");
+			if (0 == lua->do_command (script)) {
+				append_text ("> OK");
+			}
+		} catch (luabridge::LuaException const& e) {
+			append_text (string_compose (_("LuaException: %1"), e.what()));
+		}
+	} else {
+		// script with factory method
+		try {
+			lua_State* L = lua->getState();
+			lua->do_command ("function ardour () end");
+
+			LuaScriptParamList args = LuaScriptParams::script_params (script, "action_param", false);
+			luabridge::LuaRef tbl_arg (luabridge::newTable(L));
+			LuaScriptParams::params_to_ref (&tbl_arg, args);
+			lua->do_command (script); // register "factory"
+			luabridge::LuaRef lua_factory = luabridge::getGlobal (L, "factory");
+			if (lua_factory.isFunction()) {
+				lua_factory(tbl_arg)();
+			}
+			lua->do_command ("factory = nil;");
+		} catch (luabridge::LuaException const& e) {
+			append_text (string_compose (_("LuaException: %1"), e.what()));
+		}
+	}
+}
+
+void
+LuaWindow::append_text (std::string s)
+{
+	Glib::RefPtr<Gtk::TextBuffer> tb (outtext.get_buffer());
+	tb->insert (tb->end(), s + "\n");
+	scroll_to_bottom ();
+}
+
+void
+LuaWindow::clear_output ()
+{
+	Glib::RefPtr<Gtk::TextBuffer> tb (outtext.get_buffer());
+	tb->set_text ("");
+}
+
+void
+LuaWindow::new_script ()
+{
+	char buf[32];
+	snprintf (buf, sizeof (buf), "#%d", count_scratch_buffers () + 1);
+	script_buffers.push_back (ScriptBufferPtr (new LuaWindow::ScriptBuffer (buf)));
+	script_selection_changed (script_buffers.back ());
+	refresh_scriptlist ();
+}
+
+void
+LuaWindow::delete_script ()
+{
+	assert ((_current_buffer->flags & Buffer_Scratch) || !(_current_buffer->flags & Buffer_ReadOnly));
+	bool refresh = false;
+	bool neednew = true;
+	if (_current_buffer->flags & Buffer_HasFile) {
+		if (0 == ::g_unlink (_current_buffer->path.c_str())) {
+			append_text (X_("> ") + string_compose (_("Deleted %1"), _current_buffer->path));
+			refresh = true;
+		} else {
+			append_text (X_("> ") + string_compose (_("Failed to delete %1"), _current_buffer->path));
+		}
+	}
+	for (ScriptBufferList::iterator i = script_buffers.begin (); i != script_buffers.end (); ++i) {
+		if ((*i) == _current_buffer) {
+			script_buffers.erase (i);
+			break;
+		}
+	}
+
+	for (ScriptBufferList::const_iterator i = script_buffers.begin (); i != script_buffers.end (); ++i) {
+		if ((*i)->flags & Buffer_Scratch) {
+			script_selection_changed (*i);
+			neednew = false;
+		}
+	}
+	if (neednew) {
+		new_script ();
+	}
+	if (refresh) {
+		LuaScripting::instance ().refresh (true);
+	}
+}
+
+void
+LuaWindow::revert_script ()
+{
+	_current_buffer->flags &= BufferFlags(~Buffer_Valid);
+	script_selection_changed (_current_buffer, true);
+}
+
+void
+LuaWindow::import_script ()
+{
+	// TODO: dialog to select file or enter URL
+	// TODO convert a few URL (eg. pastebin) to raw.
+#if 0
+	char *url = "http://pastebin.com/raw/3UMkZ6nV";
+	char *rv = ArdourCurl::http_get (url, 0);
+	if (rv) {
+		new_script ();
+		Glib::RefPtr<Gtk::TextBuffer> tb (entry.get_buffer());
+		tb->set_text (rv);
+		_current_buffer->flags &= BufferFlags(~Buffer_Dirty);
+		update_gui_state ();
+	}
+	free (rv);
+#endif
+}
+
+void
+LuaWindow::save_script ()
+{
+	Glib::RefPtr<Gtk::TextBuffer> tb (entry.get_buffer());
+	std::string script = tb->get_text();
+	std::string msg = "Unknown error";
+
+	std::string path;
+	LuaScriptInfoPtr lsi = LuaScripting::script_info (script);
+	ScriptBuffer & sb (*_current_buffer);
+
+	assert (sb.flags & Buffer_Dirty);
+
+	// 1) check if it has a valid header and factory
+	const std::string& bytecode = LuaScripting::get_factory_bytecode (script);
+	if (bytecode.empty()) {
+		msg = _("Missing script header.\nThe script requires an '{ardour}' info table and a 'factory' function.");
+		goto errorout;
+	}
+
+	if (!LuaScripting::try_compile (script, LuaScriptParams::script_params (script, "action_param", false))) {
+		msg = _("Script fails to compile.");
+		goto errorout;
+	}
+
+	// 2) check script name & type
+	lsi = LuaScripting::script_info (script);
+	if (!lsi) {
+		msg = _("Invalid or missing script-name or script-type.");
+		goto errorout;
+	}
+
+	if (lsi->type != LuaScriptInfo::Snippet && lsi->type != LuaScriptInfo::EditorAction) {
+		msg = _("Invalid script-type.\nValid types are 'EditorAction' and 'Snippet'.");
+		goto errorout;
+	}
+
+	// 3) if there's already a writable file,...
+	if ((sb.flags & Buffer_HasFile) && !(sb.flags & Buffer_ReadOnly)) {
+		try {
+			Glib::file_set_contents (sb.path, script);
+			sb.name = lsi->name;
+			sb.flags &= BufferFlags(~Buffer_Dirty);
+			update_gui_state (); // XXX here?
+			append_text (X_("> ") + string_compose (_("Saved as %1"), sb.path));
+			return; // OK
+		} catch (Glib::FileError e) {
+			msg = string_compose (_("Error saving file: %1"), e.what());
+			goto errorout;
+		}
+	}
+
+	// 4) check if the name is unique for the given type; locally at least
+	if (true /*sb.flags & Buffer_HasFile*/) {
+		LuaScriptList& lsl (LuaScripting::instance ().scripts (lsi->type));
+		for (LuaScriptList::const_iterator s = lsl.begin(); s != lsl.end(); ++s) {
+			if ((*s)->name == lsi->name) {
+				msg = string_compose (_("Script with given name '%1' already exists.\nUse a different name in the descriptor."), lsi->name);
+				goto errorout;
+			}
+		}
+	}
+
+	// 5) construct filename -- TODO ask user for name, ask to replace file.
+	do {
+		char buf[80];
+		time_t t = time(0);
+		struct tm * timeinfo = localtime (&t);
+		strftime (buf, sizeof(buf), "%s%d", timeinfo);
+		sprintf (buf, "%s%ld", buf, random ()); // is this valid?
+		MD5 md5;
+		std::string fn = md5.digestString (buf);
+
+		switch (lsi->type) {
+			case LuaScriptInfo::EditorAction:
+				fn = "a_" + fn;
+				break;
+			case LuaScriptInfo::Snippet:
+				fn = "s_" + fn;
+				break;
+			default:
+				break;
+		}
+		path = Glib::build_filename (LuaScripting::user_script_dir (), fn.substr(0, 11) + ".lua");
+	} while (Glib::file_test (path, Glib::FILE_TEST_EXISTS));
+
+	try {
+		Glib::file_set_contents (path, script);
+		sb.path = path;
+		sb.name = lsi->name;
+		sb.flags |= Buffer_HasFile;
+		sb.flags &= BufferFlags(~Buffer_Dirty);
+		sb.flags &= BufferFlags(~Buffer_ReadOnly);
+		update_gui_state (); // XXX here? .refresh (true) may trigger this, too
+		LuaScripting::instance().refresh (true);
+		append_text (X_("> ") + string_compose (_("Saved as %1"), path));
+		return; // OK
+	} catch (Glib::FileError e) {
+		msg = string_compose (_("Error saving file: %1"), e.what());
+		goto errorout;
+	}
+
+errorout:
+		MessageDialog am (msg);
+		am.run ();
+}
+
+void
+LuaWindow::setup_buffers ()
+{
+	if (script_buffers.size() > 0) {
+		return;
+	}
+	script_buffers.push_back (ScriptBufferPtr (new LuaWindow::ScriptBuffer("#1")));
+	_current_buffer = script_buffers.front();
+
+	Glib::RefPtr<Gtk::TextBuffer> tb (entry.get_buffer());
+	tb->set_text (_current_buffer->script);
+
+	refresh_scriptlist ();
+	update_gui_state ();
+}
+
+uint32_t
+LuaWindow::count_scratch_buffers () const
+{
+	uint32_t n = 0;
+	for (ScriptBufferList::const_iterator i = script_buffers.begin (); i != script_buffers.end (); ++i) {
+		if ((*i)->flags & Buffer_Scratch) {
+			++n;
+		}
+	}
+	return n;
+}
+
+void
+LuaWindow::refresh_scriptlist ()
+{
+	for (ScriptBufferList::iterator i = script_buffers.begin (); i != script_buffers.end ();) {
+		if ((*i)->flags & Buffer_Scratch) {
+			++i;
+			continue;
+		}
+		i = script_buffers.erase (i);
+	}
+	LuaScriptList& lsa (LuaScripting::instance ().scripts (LuaScriptInfo::EditorAction));
+	for (LuaScriptList::const_iterator s = lsa.begin(); s != lsa.end(); ++s) {
+		script_buffers.push_back (ScriptBufferPtr (new LuaWindow::ScriptBuffer(*s)));
+	}
+
+	LuaScriptList& lss (LuaScripting::instance ().scripts (LuaScriptInfo::Snippet));
+	for (LuaScriptList::const_iterator s = lss.begin(); s != lss.end(); ++s) {
+		script_buffers.push_back (ScriptBufferPtr (new LuaWindow::ScriptBuffer(*s)));
+	}
+	rebuild_menu ();
+}
+
+void
+LuaWindow::rebuild_menu ()
+{
+	using namespace Menu_Helpers;
+
+	_menu_scratch = manage (new Menu);
+	_menu_snippet = manage (new Menu);
+	_menu_actions = manage (new Menu);
+
+	MenuList& items_scratch (_menu_scratch->items());
+	MenuList& items_snippet (_menu_snippet->items());
+	MenuList& items_actions (_menu_actions->items());
+
+	{
+		Menu_Helpers::MenuElem elem = Gtk::Menu_Helpers::MenuElem(_("New"),
+				sigc::mem_fun(*this, &LuaWindow::new_script));
+		items_scratch.push_back(elem);
+	}
+
+	items_scratch.push_back(SeparatorElem());
+
+	for (ScriptBufferList::const_iterator i = script_buffers.begin (); i != script_buffers.end (); ++i) {
+		std::string name;
+		if ((*i)->flags & Buffer_ReadOnly) {
+			name = "[R] " + (*i)->name;
+		} else {
+			name = (*i)->name;
+		}
+		Menu_Helpers::MenuElem elem = Gtk::Menu_Helpers::MenuElem(name,
+				sigc::bind(sigc::mem_fun(*this, &LuaWindow::script_selection_changed), (*i), false));
+
+		if ((*i)->flags & Buffer_Scratch) {
+			items_scratch.push_back(elem);
+		}
+		else if ((*i)->type == LuaScriptInfo::EditorAction) {
+				items_actions.push_back(elem);
+		}
+		else if ((*i)->type == LuaScriptInfo::Snippet) {
+				items_snippet.push_back(elem);
+		}
+	}
+
+	script_select.clear_items ();
+	script_select.AddMenuElem (Menu_Helpers::MenuElem ("Scratch", *_menu_scratch));
+	script_select.AddMenuElem (Menu_Helpers::MenuElem ("Snippets", *_menu_snippet));
+	script_select.AddMenuElem (Menu_Helpers::MenuElem ("Actions", *_menu_actions));
+}
+
+void
+LuaWindow::script_selection_changed (ScriptBufferPtr n, bool force)
+{
+	if (n == _current_buffer && !force) {
+		return;
+	}
+
+	Glib::RefPtr<Gtk::TextBuffer> tb (entry.get_buffer());
+
+	if (_current_buffer->flags & Buffer_Valid) {
+		_current_buffer->script = tb->get_text();
+	}
+
+	if (!(n->flags & Buffer_Valid)) {
+		if (!n->load()) {
+			append_text ("! Failed to load buffer.");
+		}
+	}
+
+	if (n->flags & Buffer_Valid) {
+		_current_buffer = n;
+		_script_changed_connection.block ();
+		tb->set_text (n->script);
+		_script_changed_connection.unblock ();
+	} else {
+		append_text ("! Failed to switch buffer.");
+	}
+	update_gui_state ();
+}
+
+void
+LuaWindow::update_gui_state ()
+{
+	const ScriptBuffer & sb (*_current_buffer);
+	std::string name;
+	if (sb.flags & Buffer_Scratch) {
+		name = string_compose (_("Scratch Buffer %1"), sb.name);
+	} else if (sb.type == LuaScriptInfo::EditorAction) {
+		name = string_compose (_("Action: '%1'"), sb.name);
+	} else if (sb.type == LuaScriptInfo::Snippet) {
+		name = string_compose (_("Snippet: %1"), sb.name);
+	} else {
+		cerr << "Invalid Script type\n";
+		assert (0);
+		return;
+	}
+	if (sb.flags & Buffer_Dirty) {
+		name += " *";
+	}
+	script_select.set_text(name);
+
+	if (sb.flags & Buffer_ReadOnly) {
+		_btn_save.set_text (_("Save as"));
+	} else {
+		_btn_save.set_text (_("Save"));
+	}
+	_btn_save.set_sensitive (sb.flags & Buffer_Dirty);
+	_btn_delete.set_sensitive (sb.flags & Buffer_Scratch || ((sb.flags & (Buffer_ReadOnly | Buffer_HasFile)) == Buffer_HasFile));
+	_btn_revert.set_sensitive ((sb.flags & Buffer_Dirty) && (sb.flags & Buffer_HasFile));
+}
+
+void
+LuaWindow::script_changed () {
+	if (_current_buffer->flags & Buffer_Dirty) {
+		return;
+	}
+	_current_buffer->flags |= Buffer_Dirty;
+	update_gui_state ();
+}
+
+LuaWindow::ScriptBuffer::ScriptBuffer (const std::string& n)
+	: name (n)
+	, flags (Buffer_Scratch | Buffer_Valid)
+{
+	script =
+		"---- this header is (only) required to save the script\n"
+		"-- ardour { [\"type\"] = \"Snippet\", name = \"\" }\n"
+		"-- function factory () return function () -- -- end end\n";
+}
+
+LuaWindow::ScriptBuffer::ScriptBuffer (LuaScriptInfoPtr p)
+	: name (p->name)
+	, path (p->path)
+	, flags (Buffer_HasFile)
+	, type (p->type)
+{
+	if (!PBD::exists_and_writable (path)) {
+		flags |= Buffer_ReadOnly;
+	}
+	if (path.find (user_config_directory ()) != 0) {
+		// mark non-user scripts as read-only
+		flags |= Buffer_ReadOnly;
+	}
+}
+
+#if 0
+LuaWindow::ScriptBuffer::ScriptBuffer (const ScriptBuffer& other)
+	: script (other.script)
+	, name (other.name)
+	, path (other.path)
+	, flags (other.flags)
+	, type (other.type)
+{
+}
+#endif
+
+LuaWindow::ScriptBuffer::~ScriptBuffer ()
+{
+}
+
+bool
+LuaWindow::ScriptBuffer::load ()
+{
+	assert (!(flags & Buffer_Valid));
+	if (!(flags & Buffer_HasFile)) return false;
+	try {
+		script = Glib::file_get_contents (path);
+		flags |= Buffer_Valid;
+		flags &= BufferFlags(~Buffer_Dirty);
+	} catch (Glib::FileError e) {
+		return false;
+	}
+	return true;
+}
diff --git a/gtk2_ardour/luawindow.h b/gtk2_ardour/luawindow.h
new file mode 100644
index 0000000..38f688d
--- /dev/null
+++ b/gtk2_ardour/luawindow.h
@@ -0,0 +1,143 @@
+/*
+    Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+#ifndef __ardour_luawindow_h__
+#define __ardour_luawindow_h__
+
+#include <glibmm/thread.h>
+
+#include <gtkmm/box.h>
+#include <gtkmm/scrolledwindow.h>
+#include <gtkmm/label.h>
+#include <gtkmm/window.h>
+
+#include "pbd/signals.h"
+#include "pbd/stateful.h"
+
+#include "ardour/ardour.h"
+#include "ardour/luascripting.h"
+#include "ardour/session_handle.h"
+#include "ardour/types.h"
+
+#include "gtkmm2ext/visibility_tracker.h"
+
+#include "lua/luastate.h"
+
+#include "ardour_button.h"
+#include "ardour_dropdown.h"
+
+class LuaWindow :
+	public Gtk::Window,
+	public PBD::ScopedConnectionList,
+	public ARDOUR::SessionHandlePtr,
+	public Gtkmm2ext::VisibilityTracker
+{
+  public:
+	static LuaWindow* instance();
+	~LuaWindow();
+
+	void show_window ();
+	bool hide_window (GdkEventAny *ev);
+
+	void set_session (ARDOUR::Session* s);
+
+	typedef enum {
+		Buffer_NOFLAG     = 0x00,
+		Buffer_Valid      = 0x01, ///< script is loaded
+		Buffer_HasFile    = 0x02,
+		Buffer_ReadOnly   = 0x04,
+		Buffer_Dirty      = 0x08,
+		Buffer_Scratch    = 0x10,
+	} BufferFlags;
+
+	class ScriptBuffer {
+	public:
+		ScriptBuffer (const std::string&);
+		ScriptBuffer (ARDOUR::LuaScriptInfoPtr);
+		//ScriptBuffer (const ScriptBuffer& other);
+		~ScriptBuffer ();
+
+		bool load ();
+
+		std::string script;
+		std::string name;
+		std::string path;
+		BufferFlags flags;
+		ARDOUR::LuaScriptInfo::ScriptType type;
+	};
+
+  private:
+	LuaWindow ();
+	static LuaWindow* _instance;
+
+	LuaState *lua;
+	bool _visible;
+
+	Gtk::Menu* _menu_scratch;
+	Gtk::Menu* _menu_snippet;
+	Gtk::Menu* _menu_actions;
+
+	sigc::connection _script_changed_connection;
+
+	Gtk::TextView entry;
+	Gtk::TextView outtext;
+	Gtk::ScrolledWindow scrollout;
+
+	ArdourButton _btn_run;
+	ArdourButton _btn_clear;
+	ArdourButton _btn_open;
+	ArdourButton _btn_save;
+	ArdourButton _btn_delete;
+	ArdourButton _btn_revert;
+
+	ArdourDropdown script_select;
+
+	typedef boost::shared_ptr<ScriptBuffer> ScriptBufferPtr;
+	typedef std::vector<ScriptBufferPtr> ScriptBufferList;
+
+	ScriptBufferList script_buffers;
+	ScriptBufferPtr _current_buffer;
+
+	void session_going_away ();
+	void update_title ();
+	void reinit_lua ();
+
+	void setup_buffers ();
+	void refresh_scriptlist ();
+	void rebuild_menu ();
+	uint32_t count_scratch_buffers () const;
+
+	void script_changed ();
+	void script_selection_changed (ScriptBufferPtr n, bool force = false);
+	void update_gui_state ();
+
+	void append_text (std::string s);
+	void scroll_to_bottom ();
+	void clear_output ();
+
+	void run_script ();
+
+	void new_script ();
+	void delete_script ();
+	void revert_script ();
+	void import_script ();
+	void save_script ();
+};
+
+
+#endif
diff --git a/gtk2_ardour/lv2_plugin_ui.cc b/gtk2_ardour/lv2_plugin_ui.cc
index c9950fa..7f735df 100644
--- a/gtk2_ardour/lv2_plugin_ui.cc
+++ b/gtk2_ardour/lv2_plugin_ui.cc
@@ -31,7 +31,7 @@
 #include <lilv/lilv.h>
 #include <suil/suil.h>
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 using namespace Gtk;
@@ -241,6 +241,7 @@ LV2PluginUI::LV2PluginUI(boost::shared_ptr<PluginInsert> pi,
 	_ardour_buttons_box.pack_end (add_button, false, false);
 	_ardour_buttons_box.pack_end (_preset_combo, false, false);
 	_ardour_buttons_box.pack_end (_preset_modified, false, false);
+	_ardour_buttons_box.pack_end (pin_management_button, false, false);
 
 	plugin->PresetLoaded.connect (*this, invalidator (*this), boost::bind (&LV2PluginUI::queue_port_update, this), gui_context ());
 }
diff --git a/gtk2_ardour/main.cc b/gtk2_ardour/main.cc
index 6a8347f..a123631 100644
--- a/gtk2_ardour/main.cc
+++ b/gtk2_ardour/main.cc
@@ -18,10 +18,12 @@
 */
 
 #include <cstdlib>
-#include <signal.h>
 #include <cerrno>
 #include <vector>
 
+#include <signal.h>
+#include <locale.h>
+
 #include <sigc++/bind.h>
 #include <gtkmm/settings.h>
 
@@ -56,7 +58,7 @@
 #include "enums.h"
 #include "bundle_env.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 #ifdef PLATFORM_WINDOWS
 #include <fcntl.h> // Needed for '_fmode'
@@ -273,6 +275,8 @@ extern "C" {
 
 int ardour_main (int argc, char *argv[])
 
+#elif defined NOMAIN
+int nomain (int argc, char *argv[])
 #else
 int main (int argc, char *argv[])
 #endif
@@ -292,7 +296,13 @@ int main (int argc, char *argv[])
 #endif
 
 #ifdef ENABLE_NLS
-	gtk_set_locale ();
+	/* initialize C and C++ locales to user preference */
+	setlocale (LC_ALL, "");
+	try {
+		std::locale::global (std::locale (setlocale (LC_ALL, 0)));
+	} catch (...) {
+		std::cerr << "Cannot set C++ locale\n";
+	}
 #endif
 
 	console_madness_begin();
@@ -375,6 +385,8 @@ int main (int argc, char *argv[])
 	}
 #endif
 
+	DEBUG_TRACE (DEBUG::Locale, string_compose ("main() locale '%1'\n", setlocale (LC_NUMERIC, NULL)));
+
 	if (UIConfiguration::instance().pre_gui_init ()) {
 		error << _("Could not complete pre-GUI initialization") << endmsg;
 		exit (1);
diff --git a/gtk2_ardour/main_clock.cc b/gtk2_ardour/main_clock.cc
index 1f217ef..9a7360b 100644
--- a/gtk2_ardour/main_clock.cc
+++ b/gtk2_ardour/main_clock.cc
@@ -22,7 +22,7 @@
 
 #include "ui_config.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 #include "ardour/tempo.h"
 
@@ -94,16 +94,16 @@ void
 MainClock::edit_current_tempo ()
 {
 	if (!PublicEditor::instance().session()) return;
-	ARDOUR::TempoSection ts = PublicEditor::instance().session()->tempo_map().tempo_section_at (absolute_time());
-	PublicEditor::instance().edit_tempo_section (&ts);
+	ARDOUR::TempoSection* ts = const_cast<ARDOUR::TempoSection*>(&PublicEditor::instance().session()->tempo_map().tempo_section_at_frame (absolute_time()));
+	PublicEditor::instance().edit_tempo_section (ts);
 }
 
 void
 MainClock::edit_current_meter ()
 {
 	if (!PublicEditor::instance().session()) return;
-	ARDOUR::MeterSection ms = PublicEditor::instance().session()->tempo_map().meter_section_at (absolute_time());
-	PublicEditor::instance().edit_meter_section (&ms);
+	ARDOUR::MeterSection* ms = const_cast<ARDOUR::MeterSection*>(&PublicEditor::instance().session()->tempo_map().meter_section_at_frame (absolute_time()));
+	PublicEditor::instance().edit_meter_section (ms);
 }
 
 void
diff --git a/gtk2_ardour/marker.cc b/gtk2_ardour/marker.cc
index 2d9da96..87c0c06 100644
--- a/gtk2_ardour/marker.cc
+++ b/gtk2_ardour/marker.cc
@@ -47,7 +47,7 @@
 
 #include <gtkmm2ext/utils.h>
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
@@ -198,7 +198,7 @@ ArdourMarker::ArdourMarker (PublicEditor& ed, ArdourCanvas::Container& parent, g
 
 	case SessionEnd:
 	case RangeEnd:
-		points = new ArdourCanvas::Points ();
+		points = new ArdourCanvas::Points (); // leaks
 		points->push_back (ArdourCanvas::Duple ( M6, 0.0));
 		points->push_back (ArdourCanvas::Duple ( M6, MH));
 		points->push_back (ArdourCanvas::Duple (0.0, MH * .5));
@@ -316,6 +316,7 @@ ArdourMarker::~ArdourMarker ()
 	/* destroying the parent group destroys its contents, namely any polygons etc. that we added */
 	delete group;
 	delete _track_canvas_line;
+	delete points;
 }
 
 void ArdourMarker::reparent(ArdourCanvas::Container & parent)
@@ -535,6 +536,26 @@ TempoMarker::~TempoMarker ()
 {
 }
 
+void
+TempoMarker::update_height_mark (const double& ratio)
+{
+	const double MH = marker_height;
+	const double top = MH * (1 - ratio);
+	const double M3 = std::max(1.f, rintf(3.f * UIConfiguration::instance().get_ui_scale()));
+	const double M6 = std::max(2.f, rintf(6.f * UIConfiguration::instance().get_ui_scale()));
+
+	delete points;
+	points = new ArdourCanvas::Points ();
+	points->push_back (ArdourCanvas::Duple ( M3, top));
+	points->push_back (ArdourCanvas::Duple ( M6, min (top + (MH * .6), MH)));
+	points->push_back (ArdourCanvas::Duple ( M6, MH));
+	points->push_back (ArdourCanvas::Duple (0.0, MH));
+	points->push_back (ArdourCanvas::Duple (0.0, min (top + (MH * .6), MH)));
+	points->push_back (ArdourCanvas::Duple ( M3, top));
+
+	mark->set (*points);
+}
+
 /***********************************************************************/
 
 MeterMarker::MeterMarker (PublicEditor& editor, ArdourCanvas::Container& parent, guint32 rgba, const string& text,
diff --git a/gtk2_ardour/marker.h b/gtk2_ardour/marker.h
index b769f8d..becc809 100644
--- a/gtk2_ardour/marker.h
+++ b/gtk2_ardour/marker.h
@@ -38,6 +38,10 @@ namespace ARDOUR {
 
 class PublicEditor;
 
+/** Location Marker
+ *
+ * Editor ruler representation of a location marker or range on the timeline.
+ */
 class ArdourMarker : public sigc::trackable
 {
   public:
@@ -141,6 +145,7 @@ class TempoMarker : public ArdourMarker
 
 	ARDOUR::TempoSection& tempo() const { return _tempo; }
 
+	void update_height_mark (const double& ratio);
   private:
 	ARDOUR::TempoSection& _tempo;
 };
diff --git a/gtk2_ardour/marker_selection.h b/gtk2_ardour/marker_selection.h
index 6d4749f..1b322d0 100644
--- a/gtk2_ardour/marker_selection.h
+++ b/gtk2_ardour/marker_selection.h
@@ -24,9 +24,10 @@
 
 #include "marker.h"
 
-struct MarkerSelection : public std::list<ArdourMarker*>
+class MarkerSelection : public std::list<ArdourMarker*>
 {
-        void range (ARDOUR::framepos_t& start, ARDOUR::framepos_t& end);
+	public:
+		void range (ARDOUR::framepos_t& start, ARDOUR::framepos_t& end);
 };
 
 #endif /* __ardour_gtk_marker_selection_h__ */
diff --git a/gtk2_ardour/meter_patterns.cc b/gtk2_ardour/meter_patterns.cc
index 1b582a9..ab6b944 100644
--- a/gtk2_ardour/meter_patterns.cc
+++ b/gtk2_ardour/meter_patterns.cc
@@ -30,7 +30,7 @@
 #include "meter_patterns.h"
 #include "ui_config.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 using namespace ARDOUR_UI_UTILS;
@@ -1010,6 +1010,11 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector<DataType> types)
 				layout->set_text("mid");
 				layout->get_pixel_size(tw, th);
 				break;
+			default: // DataType::NIL;
+				layout->set_text("");
+				tw = th = 0;
+				assert (0); // not reached
+				break;
 		}
 		if (!background) {
 			c = w.get_style()->get_fg (Gtk::STATE_ACTIVE);
diff --git a/gtk2_ardour/meter_strip.cc b/gtk2_ardour/meter_strip.cc
index 82acd1d..db96a3c 100644
--- a/gtk2_ardour/meter_strip.cc
+++ b/gtk2_ardour/meter_strip.cc
@@ -45,7 +45,7 @@
 #include "meter_strip.h"
 #include "meter_patterns.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 using namespace ARDOUR_UI_UTILS;
@@ -62,8 +62,7 @@ PBD::Signal0<void> MeterStrip::ConfigurationChanged;
 #define PX_SCALE(pxmin, dflt) rint(std::max((double)pxmin, (double)dflt * UIConfiguration::instance().get_ui_scale()))
 
 MeterStrip::MeterStrip (int metricmode, MeterType mt)
-	: AxisView(0)
-	, RouteUI(0)
+	: RouteUI ((Session*) 0)
 {
 	level_meter = 0;
 	_strip_type = 0;
@@ -117,7 +116,7 @@ MeterStrip::MeterStrip (int metricmode, MeterType mt)
 }
 
 MeterStrip::MeterStrip (Session* sess, boost::shared_ptr<ARDOUR::Route> rt)
-	: AxisView(sess)
+	: SessionHandlePtr (sess)
 	, RouteUI(0)
 	, _route(rt)
 	, peak_display()
@@ -294,7 +293,6 @@ MeterStrip::MeterStrip (Session* sess, boost::shared_ptr<ARDOUR::Route> rt)
 	meter_ticks2_area.signal_expose_event().connect (sigc::mem_fun(*this, &MeterStrip::meter_ticks2_expose));
 
 	_route->DropReferences.connect (meter_route_connections, invalidator (*this), boost::bind (&MeterStrip::self_delete, this), gui_context());
-	_route->PropertyChanged.connect (meter_route_connections, invalidator (*this), boost::bind (&MeterStrip::strip_property_changed, this, _1), gui_context());
 
 	peak_display.signal_button_release_event().connect (sigc::mem_fun(*this, &MeterStrip::peak_button_release), false);
 	name_label.signal_button_release_event().connect (sigc::mem_fun(*this, &MeterStrip::name_label_button_release), false);
@@ -366,7 +364,7 @@ MeterStrip::set_button_names()
 {
 	mute_button->set_text (S_("Mute|M"));
 
-	if (_route && _route->solo_safe()) {
+	if (_route && _route->solo_safe_control()->solo_safe()) {
 		solo_button->set_visual_state (Gtkmm2ext::VisualState (solo_button->visual_state() | Gtkmm2ext::Insensitive));
 	} else {
 		solo_button->set_visual_state (Gtkmm2ext::VisualState (solo_button->visual_state() & ~Gtkmm2ext::Insensitive));
@@ -389,7 +387,7 @@ MeterStrip::set_button_names()
 }
 
 void
-MeterStrip::strip_property_changed (const PropertyChange& what_changed)
+MeterStrip::route_property_changed (const PropertyChange& what_changed)
 {
 	if (!what_changed.contains (ARDOUR::Properties::name)) {
 		return;
@@ -801,12 +799,12 @@ MeterStrip::name_changed () {
 	}
 	name_label.set_text(_route->name ());
 	if (_session && _session->config.get_track_name_number()) {
-		const int64_t track_number = _route->track_number ();
+		const uint64_t track_number = _route->track_number();
 		if (track_number == 0) {
 			number_label.set_text("-");
 			number_label.hide();
 		} else {
-			number_label.set_text (PBD::to_string (abs(_route->track_number ()), std::dec));
+			number_label.set_text (PBD::to_string (track_number, std::dec));
 			number_label.show();
 		}
 		const int tnh = 4 + std::max(2u, _session->track_number_decimals()) * 8; // TODO 8 = max_width_of_digit_0_to_9()
@@ -967,3 +965,16 @@ MeterStrip::set_meter_type_multi (int what, RouteGroup* group, MeterType type)
 			break;
 	}
 }
+
+string
+MeterStrip::name () const
+{
+	return _route->name();
+}
+
+Gdk::Color
+MeterStrip::color () const
+{
+	return RouteUI::route_color ();
+}
+
diff --git a/gtk2_ardour/meter_strip.h b/gtk2_ardour/meter_strip.h
index dfeb406..0e72325 100644
--- a/gtk2_ardour/meter_strip.h
+++ b/gtk2_ardour/meter_strip.h
@@ -43,13 +43,18 @@ namespace Gtk {
 	class Style;
 }
 
-class MeterStrip : public Gtk::VBox, public RouteUI
+class MeterStrip : public Gtk::VBox, public AxisView, public RouteUI
 {
   public:
 	MeterStrip (ARDOUR::Session*, boost::shared_ptr<ARDOUR::Route>);
 	MeterStrip (int, ARDOUR::MeterType);
 	~MeterStrip ();
 
+	std::string name() const;
+	Gdk::Color color () const;
+
+	boost::shared_ptr<ARDOUR::Stripable> stripable() const { return RouteUI::stripable(); }
+
 	void set_session (ARDOUR::Session* s);
 	void fast_update ();
 	boost::shared_ptr<ARDOUR::Route> route() { return _route; }
@@ -72,6 +77,8 @@ class MeterStrip : public Gtk::VBox, public RouteUI
 	bool is_metric_display() { return _strip_type == 0; }
 	ARDOUR::MeterType meter_type();
 
+	bool selected() const { return false; }
+
   protected:
 	boost::shared_ptr<ARDOUR::Route> _route;
 	PBD::ScopedConnectionList meter_route_connections;
@@ -130,7 +137,7 @@ class MeterStrip : public Gtk::VBox, public RouteUI
 
 	LevelMeterHBox *level_meter;
 
-	void strip_property_changed (const PBD::PropertyChange&);
+	void route_property_changed (const PBD::PropertyChange&);
 	void meter_configuration_changed (ARDOUR::ChanCount);
 	void meter_type_changed (ARDOUR::MeterType);
 	void update_background (ARDOUR::MeterType);
diff --git a/gtk2_ardour/meterbridge.cc b/gtk2_ardour/meterbridge.cc
index 1a320fa..02350c9 100644
--- a/gtk2_ardour/meterbridge.cc
+++ b/gtk2_ardour/meterbridge.cc
@@ -40,7 +40,6 @@
 
 #include "ardour/audio_track.h"
 #include "ardour/midi_track.h"
-#include "ardour/route_sorters.h"
 
 #include "meterbridge.h"
 
@@ -55,7 +54,7 @@
 #include "meter_patterns.h"
 #include "timers.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 using namespace ARDOUR_UI_UTILS;
@@ -124,7 +123,6 @@ Meterbridge::Meterbridge ()
 
 	signal_delete_event().connect (sigc::mem_fun (*this, &Meterbridge::hide_window));
 	signal_configure_event().connect (sigc::mem_fun (*ARDOUR_UI::instance(), &ARDOUR_UI::configure_handler));
-	Route::SyncOrderKeys.connect (*this, invalidator (*this), boost::bind (&Meterbridge::sync_order_keys, this), gui_context());
 	MeterStrip::CatchDeletion.connect (*this, invalidator (*this), boost::bind (&Meterbridge::remove_strip, this, _1), gui_context());
 	MeterStrip::MetricChanged.connect (*this, invalidator (*this), boost::bind(&Meterbridge::resync_order, this), gui_context());
 	MeterStrip::ConfigurationChanged.connect (*this, invalidator (*this), boost::bind(&Meterbridge::queue_resize, this), gui_context());
@@ -256,7 +254,7 @@ Meterbridge::on_key_press_event (GdkEventKey* ev)
 	if (gtk_window_propagate_key_event (GTK_WINDOW(gobj()), ev)) {
 		return true;
 	}
-	return forward_key_press (ev);
+	return relay_key_press (ev, this);
 }
 
 bool
@@ -400,6 +398,22 @@ Meterbridge::on_scroll()
 	metrics_right.set_metric_mode(mm_right, mt_right);
 }
 
+struct PresentationInfoRouteSorter
+{
+	bool operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b) {
+		if (a->is_master() || a->is_monitor()) {
+			/* "a" is a special route (master, monitor, etc), and comes
+			 * last in the mixer ordering
+			 */
+			return false;
+		} else if (b->is_master() || b->is_monitor()) {
+			/* everything comes before b */
+			return true;
+		}
+		return a->presentation_info().order() < b->presentation_info().order();
+	}
+};
+
 void
 Meterbridge::set_session (Session* s)
 {
@@ -422,12 +436,11 @@ Meterbridge::set_session (Session* s)
 	_show_master = _session->config.get_show_master_on_meterbridge();
 	_show_midi = _session->config.get_show_midi_on_meterbridge();
 
-	ARDOUR::SignalOrderRouteSorter sorter;
 	boost::shared_ptr<RouteList> routes = _session->get_routes();
 
-	RouteList copy(*routes);
-	copy.sort(sorter);
-	add_strips(copy);
+	RouteList copy (*routes);
+	copy.sort (PresentationInfoRouteSorter());
+	add_strips (copy);
 
 	_session->RouteAdded.connect (_session_connections, invalidator (*this), boost::bind (&Meterbridge::add_strips, this, _1), gui_context());
 	_session->DirtyChanged.connect (_session_connections, invalidator (*this), boost::bind (&Meterbridge::update_title, this), gui_context());
@@ -463,7 +476,7 @@ Meterbridge::session_going_away ()
 int
 Meterbridge::set_state (const XMLNode& node)
 {
-	const XMLProperty* prop;
+	XMLProperty const * prop;
 	XMLNode* geometry;
 
 	m_width = default_width;
@@ -473,7 +486,7 @@ Meterbridge::set_state (const XMLNode& node)
 
 	if ((geometry = find_named_node (node, "geometry")) != 0) {
 
-		XMLProperty* prop;
+		XMLProperty const * prop;
 
 		if ((prop = geometry->property("x_size")) == 0) {
 			prop = geometry->property ("x-size");
diff --git a/gtk2_ardour/meterbridge.h b/gtk2_ardour/meterbridge.h
index 1709455..a1715b2 100644
--- a/gtk2_ardour/meterbridge.h
+++ b/gtk2_ardour/meterbridge.h
@@ -107,7 +107,7 @@ class Meterbridge :
 				/* everything comes before b */
 				return true;
 			}
-			return a->order_key () < b->order_key ();
+			return a->presentation_info().order() < b->presentation_info().order();
 		}
 	};
 
diff --git a/gtk2_ardour/midi_automation_line.cc b/gtk2_ardour/midi_automation_line.cc
index c76a35a..9a40ebb 100644
--- a/gtk2_ardour/midi_automation_line.cc
+++ b/gtk2_ardour/midi_automation_line.cc
@@ -25,7 +25,7 @@
 #include "midi_automation_line.h"
 #include "midi_time_axis.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 
diff --git a/gtk2_ardour/midi_channel_dialog.cc b/gtk2_ardour/midi_channel_dialog.cc
index d39853e..6d79306 100644
--- a/gtk2_ardour/midi_channel_dialog.cc
+++ b/gtk2_ardour/midi_channel_dialog.cc
@@ -20,7 +20,7 @@
 
 #include "midi_channel_dialog.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace Gtk;
 
diff --git a/gtk2_ardour/midi_channel_selector.cc b/gtk2_ardour/midi_channel_selector.cc
index d76a5d5..1da8fd9 100644
--- a/gtk2_ardour/midi_channel_selector.cc
+++ b/gtk2_ardour/midi_channel_selector.cc
@@ -38,7 +38,7 @@
 #include "midi_channel_selector.h"
 #include "rgb_macros.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace Gtk;
diff --git a/gtk2_ardour/midi_cut_buffer.h b/gtk2_ardour/midi_cut_buffer.h
index 8c92b9a..da17c50 100644
--- a/gtk2_ardour/midi_cut_buffer.h
+++ b/gtk2_ardour/midi_cut_buffer.h
@@ -19,7 +19,7 @@
 #ifndef __gtk_ardour_midi_cut_buffer_h__
 #define __gtk_ardour_midi_cut_buffer_h__
 
-#include "evoral/types.hpp"
+#include "evoral/Beats.hpp"
 
 #include "ardour/automatable_sequence.h"
 
diff --git a/gtk2_ardour/midi_export_dialog.cc b/gtk2_ardour/midi_export_dialog.cc
index 3e91ca4..9fd0239 100644
--- a/gtk2_ardour/midi_export_dialog.cc
+++ b/gtk2_ardour/midi_export_dialog.cc
@@ -27,7 +27,7 @@
 
 #include "midi_export_dialog.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 
diff --git a/gtk2_ardour/midi_list_editor.cc b/gtk2_ardour/midi_list_editor.cc
index 6334c38..731f8b1 100644
--- a/gtk2_ardour/midi_list_editor.cc
+++ b/gtk2_ardour/midi_list_editor.cc
@@ -39,7 +39,7 @@
 #include "note_player.h"
 #include "ui_config.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace Gtk;
@@ -760,13 +760,11 @@ MidiListEditor::redisplay_model ()
 		for (MidiModel::Notes::iterator i = notes.begin(); i != notes.end(); ++i) {
 			row = *(model->append());
 			row[columns.channel] = (*i)->channel() + 1;
-			row[columns.note_name] = Evoral::midi_note_name ((*i)->note());
+			row[columns.note_name] = ParameterDescriptor::midi_note_name ((*i)->note());
 			row[columns.note] = (*i)->note();
 			row[columns.velocity] = (*i)->velocity();
 
-			Timecode::BBT_Time bbt;
-
-			_session->tempo_map().bbt_time (conv.to ((*i)->time()), bbt);
+			Timecode::BBT_Time bbt (_session->tempo_map().bbt_at_frame (conv.to ((*i)->time())));
 
 			ss.str ("");
 			ss << bbt;
diff --git a/gtk2_ardour/midi_list_editor.h b/gtk2_ardour/midi_list_editor.h
index 9ff4139..283a0da 100644
--- a/gtk2_ardour/midi_list_editor.h
+++ b/gtk2_ardour/midi_list_editor.h
@@ -25,14 +25,13 @@
 #include <gtkmm/liststore.h>
 #include <gtkmm/scrolledwindow.h>
 
-#include "evoral/types.hpp"
-
 #include "ardour/session_handle.h"
 
 #include "ardour_window.h"
 
 namespace Evoral {
 	template<typename Time> class Note;
+	class                         Beats;
 };
 
 namespace ARDOUR {
diff --git a/gtk2_ardour/midi_port_dialog.cc b/gtk2_ardour/midi_port_dialog.cc
index cbf2ca5..20904fa 100644
--- a/gtk2_ardour/midi_port_dialog.cc
+++ b/gtk2_ardour/midi_port_dialog.cc
@@ -26,7 +26,7 @@
 
 #include "midi_port_dialog.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace PBD;
diff --git a/gtk2_ardour/midi_region_view.cc b/gtk2_ardour/midi_region_view.cc
index 0b13c3f..6a4f08a 100644
--- a/gtk2_ardour/midi_region_view.cc
+++ b/gtk2_ardour/midi_region_view.cc
@@ -82,7 +82,7 @@
 #include "sys_ex.h"
 #include "ui_config.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 using namespace PBD;
@@ -111,7 +111,6 @@ MidiRegionView::MidiRegionView (ArdourCanvas::Container*      parent,
 	, _step_edit_cursor_width (1.0)
 	, _step_edit_cursor_position (0.0)
 	, _channel_selection_scoped_note (0)
-	, _temporary_note_group (0)
 	, _mouse_state(None)
 	, _pressed_button(0)
 	, _sort_needed (true)
@@ -155,7 +154,6 @@ MidiRegionView::MidiRegionView (ArdourCanvas::Container*      parent,
 	, _step_edit_cursor_width (1.0)
 	, _step_edit_cursor_position (0.0)
 	, _channel_selection_scoped_note (0)
-	, _temporary_note_group (0)
 	, _mouse_state(None)
 	, _pressed_button(0)
 	, _sort_needed (true)
@@ -204,7 +202,6 @@ MidiRegionView::MidiRegionView (const MidiRegionView& other)
 	, _step_edit_cursor_width (1.0)
 	, _step_edit_cursor_position (0.0)
 	, _channel_selection_scoped_note (0)
-	, _temporary_note_group (0)
 	, _mouse_state(None)
 	, _pressed_button(0)
 	, _sort_needed (true)
@@ -237,7 +234,6 @@ MidiRegionView::MidiRegionView (const MidiRegionView& other, boost::shared_ptr<M
 	, _step_edit_cursor_width (1.0)
 	, _step_edit_cursor_position (0.0)
 	, _channel_selection_scoped_note (0)
-	, _temporary_note_group (0)
 	, _mouse_state(None)
 	, _pressed_button(0)
 	, _sort_needed (true)
@@ -271,12 +267,12 @@ MidiRegionView::init (bool wfd)
 
 	RegionView::init (false);
 
-	set_height (trackview.current_height());
+	//set_height (trackview.current_height());
 
 	region_muted ();
 	region_sync_changed ();
 	region_resized (ARDOUR::bounds_change);
-	region_locked ();
+	//region_locked ();
 
 	set_colors ();
 
@@ -536,7 +532,7 @@ MidiRegionView::button_release (GdkEventButton* ev)
 
 		switch (editor.current_mouse_mode()) {
 		case MouseRange:
-			/* no motion occured - simple click */
+			/* no motion occurred - simple click */
 			clear_editor_note_selection ();
 			_mouse_changed_selection = true;
 			break;
@@ -928,16 +924,24 @@ MidiRegionView::create_note_at (framepos_t t, double y, Evoral::Beats length, bo
 
 	MidiTimeAxisView* const mtv  = dynamic_cast<MidiTimeAxisView*>(&trackview);
 	MidiStreamView* const   view = mtv->midi_view();
+	boost::shared_ptr<MidiRegion> mr  = boost::dynamic_pointer_cast<MidiRegion> (_region);
+
+	if (!mr) {
+		return;
+	}
 
 	// Start of note in frames relative to region start
+	uint32_t divisions = 0;
+
 	if (snap_t) {
 		framecnt_t grid_frames;
 		t = snap_frame_to_grid_underneath (t, grid_frames);
+		divisions = trackview.editor().get_grid_music_divisions (0);
 	}
 
-	const MidiModel::TimeType beat_time = region_frames_to_region_beats(
-		t + _region->start());
 
+	const MidiModel::TimeType beat_time = Evoral::Beats (trackview.session()->tempo_map().exact_beat_at_frame (_region->position() + t, divisions)
+							     - (mr->beat() - mr->start_beats().to_double()));
 	const double  note     = view->y_to_note(y);
 	const uint8_t chan     = mtv->get_channel_for_add();
 	const uint8_t velocity = get_velocity_for_add(beat_time);
@@ -1180,21 +1184,20 @@ MidiRegionView::redisplay_model()
 	_optimization_iterator = _events.begin();
 
 	bool empty_when_starting = _events.empty();
+	NoteBase* cne;
 
 	for (MidiModel::Notes::iterator n = notes.begin(); n != notes.end(); ++n) {
 
 		boost::shared_ptr<NoteType> note (*n);
-		NoteBase* cne;
 		bool visible;
 
 		if (note_in_region_range (note, visible)) {
 
 			if (!empty_when_starting && (cne = find_canvas_note (note)) != 0) {
 
-				cne->validate ();
-				update_note (cne);
-
 				if (visible) {
+					cne->validate ();
+					update_note (cne);
 					cne->show ();
 				} else {
 					cne->hide ();
@@ -1395,27 +1398,32 @@ MidiRegionView::~MidiRegionView ()
 	delete _note_group;
 	delete _note_diff_command;
 	delete _step_edit_cursor;
-	delete _temporary_note_group;
 }
 
 void
 MidiRegionView::region_resized (const PropertyChange& what_changed)
 {
-	RegionView::region_resized(what_changed);
+	RegionView::region_resized(what_changed); // calls RegionView::set_duration()
 
 	if (what_changed.contains (ARDOUR::Properties::position)) {
 		_region_relative_time_converter.set_origin_b(_region->position());
 		_region_relative_time_converter_double.set_origin_b(_region->position());
-		set_duration(_region->length(), 0);
-		if (_enable_display) {
-			redisplay_model();
-		}
+		/* reset_width dependent_items() redisplays model */
+
 	}
 
 	if (what_changed.contains (ARDOUR::Properties::start) ||
 	    what_changed.contains (ARDOUR::Properties::position)) {
 		_source_relative_time_converter.set_origin_b (_region->position() - _region->start());
 	}
+	/* catch end and start trim so we can update the view*/
+	if (!what_changed.contains (ARDOUR::Properties::start) &&
+	    what_changed.contains (ARDOUR::Properties::length)) {
+		enable_display (true);
+	} else if (what_changed.contains (ARDOUR::Properties::start) &&
+	    what_changed.contains (ARDOUR::Properties::length)) {
+		enable_display (true);
+	}
 }
 
 void
@@ -1670,12 +1678,9 @@ MidiRegionView::start_playing_midi_chord (vector<boost::shared_ptr<NoteType> > n
 bool
 MidiRegionView::note_in_region_range (const boost::shared_ptr<NoteType> note, bool& visible) const
 {
-	/* This is imprecise due to all the conversion conversion involved, so only
-	   hide notes if they seem to start more than one tick before the start. */
-	const framecnt_t tick_frames       = Evoral::Beats::tick().to_ticks(trackview.session()->frame_rate());
-	const framepos_t note_start_frames = source_beats_to_region_frames (note->time());
-	const bool       outside           = ((note_start_frames <= -tick_frames) ||
-	                                      (note_start_frames >= _region->length()));
+	const boost::shared_ptr<ARDOUR::MidiRegion> midi_reg = midi_region();
+	const bool outside = (note->time() < midi_reg->start_beats() ||
+			      note->time() > midi_reg->start_beats() + midi_reg->length_beats());
 
 	visible = (note->note() >= midi_stream_view()->lowest_note()) &&
 		(note->note() <= midi_stream_view()->highest_note());
@@ -1702,23 +1707,36 @@ MidiRegionView::update_note (NoteBase* note, bool update_ghost_regions)
 void
 MidiRegionView::update_sustained (Note* ev, bool update_ghost_regions)
 {
+	TempoMap& map (trackview.session()->tempo_map());
+	const boost::shared_ptr<ARDOUR::MidiRegion> mr = midi_region();
 	boost::shared_ptr<NoteType> note = ev->note();
-	const double x = trackview.editor().sample_to_pixel (source_beats_to_region_frames (note->time()));
+	const framepos_t note_start_frames = map.frame_at_beat (_region->beat() - mr->start_beats().to_double()
+								+ note->time().to_double()) - _region->position();
+
+	const double x0 = trackview.editor().sample_to_pixel (note_start_frames);
+	double x1;
 	const double y0 = 1 + floor(midi_stream_view()->note_to_y(note->note()));
+	double y1;/* trim note display to not overlap the end of its region */
+
+	if (note->length() > 0) {
+		Evoral::Beats note_end_time = note->end_time();
 
-	ev->set_x0 (x);
-	ev->set_y0 (y0);
+		if (note->end_time() > mr->start_beats() + mr->length_beats()) {
+			note_end_time = mr->start_beats() + mr->length_beats();
+		}
 
-	/* trim note display to not overlap the end of its region */
+		const framepos_t note_end_frames = map.frame_at_beat (_region->beat() - mr->start_beats().to_double()
+								      + note_end_time.to_double()) - _region->position();
 
-	if (note->length() > 0) {
-		const framepos_t note_end_frames = min (source_beats_to_region_frames (note->end_time()), _region->length());
-		ev->set_x1 (std::max(1., trackview.editor().sample_to_pixel (note_end_frames)) - 1);
+		x1 = std::max(1., trackview.editor().sample_to_pixel (note_end_frames)) - 1;
 	} else {
-		ev->set_x1 (std::max(1., trackview.editor().sample_to_pixel (_region->length())) - 1);
+		x1 = std::max(1., trackview.editor().sample_to_pixel (_region->length())) - 1;
 	}
 
-	ev->set_y1 (y0 + std::max(1., floor(midi_stream_view()->note_height()) - 1));
+	y1 = y0 + std::max(1., floor(midi_stream_view()->note_height()) - 1);
+
+	ArdourCanvas::Rect rect (x0, y0, x1, y1);
+	ev->set (rect);
 
 	if (!note->length()) {
 		if (_active_notes && note->note() < 128) {
@@ -1726,7 +1744,7 @@ MidiRegionView::update_sustained (Note* ev, bool update_ghost_regions)
 			if (old_rect) {
 				/* There is an active note on this key, so we have a stuck
 				   note.  Finish the old rectangle here. */
-				old_rect->set_x1 (x);
+				old_rect->set_x1 (x1);
 				old_rect->set_outline_all ();
 			}
 			_active_notes[note->note()] = ev;
@@ -1742,8 +1760,9 @@ MidiRegionView::update_sustained (Note* ev, bool update_ghost_regions)
 	}
 
 	// Update color in case velocity has changed
-	ev->set_fill_color(ev->base_color());
-	ev->set_outline_color(ev->calculate_outline(ev->base_color(), ev->selected()));
+	//const uint32_t base_col = ev->base_color();
+	//ev->set_fill_color(base_col);
+	//ev->set_outline_color(ev->calculate_outline(base_col, ev->selected()));
 
 	if (update_ghost_regions) {
 		for (std::vector<GhostRegion*>::iterator i = ghosts.begin(); i != ghosts.end(); ++i) {
@@ -1760,7 +1779,8 @@ MidiRegionView::update_hit (Hit* ev, bool update_ghost_regions)
 {
 	boost::shared_ptr<NoteType> note = ev->note();
 
-	const framepos_t note_start_frames = source_beats_to_region_frames(note->time());
+	const framepos_t note_start_frames = trackview.session()->tempo_map().frame_at_beat (_region->beat() - midi_region()->start_beats().to_double()
+												 + note->time().to_double()) - _region->position();
 	const double x = trackview.editor().sample_to_pixel(note_start_frames);
 	const double diamond_size = std::max(1., floor(midi_stream_view()->note_height()) - 2.);
 	const double y = 1.5 + floor(midi_stream_view()->note_to_y(note->note())) + diamond_size * .5;
@@ -1868,7 +1888,8 @@ MidiRegionView::step_add_note (uint8_t channel, uint8_t number, uint8_t velocity
 	framepos_t region_end = _region->last_frame();
 
 	if (end_frame > region_end) {
-		_region->set_length (end_frame - _region->position());
+		/* XX sets length in beats from audio space. make musical */
+		_region->set_length (end_frame - _region->position(), 0);
 	}
 
 	MidiTimeAxisView* const mtv = dynamic_cast<MidiTimeAxisView*>(&trackview);
@@ -2727,6 +2748,7 @@ MidiRegionView::begin_resizing (bool /*at_front*/)
 void
 MidiRegionView::update_resizing (NoteBase* primary, bool at_front, double delta_x, bool relative, double snap_delta, bool with_snap)
 {
+	TempoMap& tmap (trackview.session()->tempo_map());
 	bool cursor_set = false;
 	bool const ensure_snap = trackview.editor().snap_mode () != SnapMagnetic;
 
@@ -2788,9 +2810,19 @@ MidiRegionView::update_resizing (NoteBase* primary, bool at_front, double delta_
 				sign = -1;
 			}
 
-			const double  snapped_x = (with_snap ? snap_pixel_to_sample (current_x, ensure_snap) : trackview.editor ().pixel_to_sample (current_x));
-			Evoral::Beats beats     = region_frames_to_region_beats (snapped_x);
-			Evoral::Beats len       = Evoral::Beats();
+			double  snapped_x;
+			uint32_t divisions = 0;
+
+			if (with_snap) {
+				snapped_x = snap_pixel_to_sample (current_x, ensure_snap);
+				divisions = trackview.editor().get_grid_music_divisions (0);
+			} else {
+				snapped_x = trackview.editor ().pixel_to_sample (current_x);
+			}
+			const Evoral::Beats beats = Evoral::Beats (tmap.exact_beat_at_frame (snapped_x + midi_region()->position(), divisions)
+								     - midi_region()->beat()) + midi_region()->start_beats();
+
+			Evoral::Beats len         = Evoral::Beats();
 
 			if (at_front) {
 				if (beats < canvas_note->note()->end_time()) {
@@ -2823,6 +2855,7 @@ void
 MidiRegionView::commit_resizing (NoteBase* primary, bool at_front, double delta_x, bool relative, double snap_delta, bool with_snap)
 {
 	_note_diff_command = _model->new_note_diff_command (_("resize notes"));
+	TempoMap& tmap (trackview.session()->tempo_map());
 
 	/* XX why doesn't snap_pixel_to_sample() handle this properly? */
 	bool const ensure_snap = trackview.editor().snap_mode () != SnapMagnetic;
@@ -2870,16 +2903,19 @@ MidiRegionView::commit_resizing (NoteBase* primary, bool at_front, double delta_
 			sign = -1;
 		}
 
+		uint32_t divisions = 0;
 		/* Convert the new x position to a frame within the source */
 		framepos_t current_fr;
 		if (with_snap) {
-			current_fr = snap_pixel_to_sample (current_x, ensure_snap) + _region->start ();
+			current_fr = snap_pixel_to_sample (current_x, ensure_snap);
+			divisions = trackview.editor().get_grid_music_divisions (0);
 		} else {
-			current_fr = trackview.editor().pixel_to_sample (current_x) + _region->start ();
+			current_fr = trackview.editor().pixel_to_sample (current_x);
 		}
 
 		/* and then to beats */
-		const Evoral::Beats x_beats = region_frames_to_region_beats (current_fr);
+		const Evoral::Beats x_beats = Evoral::Beats (tmap.exact_beat_at_frame (current_fr + midi_region()->position(), divisions)
+							     - midi_region()->beat()) + midi_region()->start_beats();
 
 		if (at_front && x_beats < canvas_note->note()->end_time()) {
 			note_diff_add_change (canvas_note, MidiModel::NoteDiffCommand::StartTime, x_beats - (sign * snap_delta_beats));
@@ -3228,7 +3264,7 @@ MidiRegionView::nudge_notes (bool forward, bool fine)
 	if (!fine) {
 
 		/* non-fine, move by 1 bar regardless of snap */
-		delta = Evoral::Beats(trackview.session()->tempo_map().meter_at(ref_point).divisions_per_bar());
+		delta = Evoral::Beats(trackview.session()->tempo_map().meter_at_frame (ref_point).divisions_per_bar());
 
 	} else if (trackview.editor().snap_mode() == Editing::SnapOff) {
 
@@ -3331,9 +3367,8 @@ void
 MidiRegionView::patch_entered (PatchChange* p)
 {
 	ostringstream s;
-	/* XXX should get patch name if we can */
 	s << _("Bank ") << (p->patch()->bank() + MIDI_BP_ZERO) << '\n'
-	  << _("Program ") << ((int) p->patch()->program()) + MIDI_BP_ZERO << '\n'
+	  << instrument_info().get_patch_name_without (p->patch()->bank(), p->patch()->program(), p->patch()->channel()) << '\n'
 	  << _("Channel ") << ((int) p->patch()->channel() + 1);
 	show_verbose_cursor (s.str(), 10, 20);
 	p->item().grab_focus();
@@ -3487,14 +3522,16 @@ MidiRegionView::selection_as_cut_buffer () const
 
 /** This method handles undo */
 bool
-MidiRegionView::paste (framepos_t pos, const ::Selection& selection, PasteContext& ctx)
+MidiRegionView::paste (framepos_t pos, const ::Selection& selection, PasteContext& ctx, const int32_t sub_num)
 {
 	bool commit = false;
 	// Paste notes, if available
 	MidiNoteSelection::const_iterator m = selection.midi_notes.get_nth(ctx.counts.n_notes());
 	if (m != selection.midi_notes.end()) {
 		ctx.counts.increase_n_notes();
-		if (!(*m)->empty()) { commit = true; }
+		if (!(*m)->empty()) {
+			commit = true;
+		}
 		paste_internal(pos, ctx.count, ctx.times, **m);
 	}
 
@@ -3502,7 +3539,10 @@ MidiRegionView::paste (framepos_t pos, const ::Selection& selection, PasteContex
 	typedef RouteTimeAxisView::AutomationTracks ATracks;
 	const ATracks& atracks = midi_view()->automation_tracks();
 	for (ATracks::const_iterator a = atracks.begin(); a != atracks.end(); ++a) {
-		if (a->second->paste(pos, selection, ctx)) {
+		if (a->second->paste(pos, selection, ctx, sub_num)) {
+			if(!commit) {
+				trackview.editor().begin_reversible_command (Operations::paste);
+			}
 			commit = true;
 		}
 	}
@@ -3565,7 +3605,8 @@ MidiRegionView::paste_internal (framepos_t pos, unsigned paste_count, float time
 		DEBUG_TRACE (DEBUG::CutNPaste, string_compose ("Paste extended region from %1 to %2\n", region_end, end_frame));
 
 		_region->clear_changes ();
-		_region->set_length (end_frame - _region->position());
+		/* we probably need to get the snap modifier somehow to make this correct for non-musical use */
+		_region->set_length (end_frame - _region->position(), trackview.editor().get_grid_music_divisions (0));
 		trackview.session()->add_command (new StatefulDiffCommand (_region));
 	}
 
@@ -3827,9 +3868,6 @@ void
 MidiRegionView::enable_display (bool yn)
 {
 	RegionView::enable_display (yn);
-	if (yn) {
-		redisplay_model ();
-	}
 }
 
 void
@@ -3875,7 +3913,9 @@ MidiRegionView::set_step_edit_cursor_width (Evoral::Beats beats)
 	_step_edit_cursor_width = beats;
 
 	if (_step_edit_cursor) {
-		_step_edit_cursor->set_x1 (_step_edit_cursor->x0() + trackview.editor().sample_to_pixel (region_beats_to_region_frames (beats)));
+		_step_edit_cursor->set_x1 (_step_edit_cursor->x0() + trackview.editor().sample_to_pixel (
+						   region_beats_to_region_frames (_step_edit_cursor_position + beats)
+						   - region_beats_to_region_frames (_step_edit_cursor_position)));
 	}
 }
 
@@ -3943,21 +3983,14 @@ MidiRegionView::data_recorded (boost::weak_ptr<MidiSource> w)
 void
 MidiRegionView::trim_front_starting ()
 {
-	/* Reparent the note group to the region view's parent, so that it doesn't change
-	   when the region view is trimmed.
+	/* We used to eparent the note group to the region view's parent, so that it didn't change.
+	   now we update it.
 	*/
-	_temporary_note_group = new ArdourCanvas::Container (group->parent ());
-	_temporary_note_group->move (group->position ());
-	_note_group->reparent (_temporary_note_group);
 }
 
 void
 MidiRegionView::trim_front_ending ()
 {
-	_note_group->reparent (group);
-	delete _temporary_note_group;
-	_temporary_note_group = 0;
-
 	if (_region->start() < 0) {
 		/* Trim drag made start time -ve; fix this */
 		midi_region()->fix_negative_start ();
@@ -4020,7 +4053,7 @@ MidiRegionView::get_note_name (boost::shared_ptr<NoteType> n, uint8_t note_value
 	char buf[128];
 	snprintf (buf, sizeof (buf), "%d %s\nCh %d Vel %d",
 	          (int) note_value,
-	          name.empty() ? Evoral::midi_note_name (note_value).c_str() : name.c_str(),
+	          name.empty() ? ParameterDescriptor::midi_note_name (note_value).c_str() : name.c_str(),
 	          (int) n->channel() + 1,
 	          (int) n->velocity());
 
@@ -4088,10 +4121,10 @@ framepos_t
 MidiRegionView::snap_frame_to_grid_underneath (framepos_t p, framecnt_t& grid_frames) const
 {
 	PublicEditor& editor = trackview.editor ();
-
 	const Evoral::Beats grid_beats = get_grid_beats(p);
+	const Evoral::Beats p_beat = max (Evoral::Beats(), region_frames_to_region_beats (p));
 
-	grid_frames = region_beats_to_region_frames (grid_beats);
+	grid_frames = region_beats_to_region_frames (p_beat + grid_beats) - region_beats_to_region_frames (p_beat);
 
 	/* Hack so that we always snap to the note that we are over, instead of snapping
 	   to the next one if we're more than halfway through the one we're over.
@@ -4123,7 +4156,7 @@ MidiRegionView::get_grid_beats(framepos_t pos) const
 {
 	PublicEditor& editor  = trackview.editor();
 	bool          success = false;
-	Evoral::Beats beats   = editor.get_grid_type_as_beats(success, pos);
+	Evoral::Beats beats   = editor.get_grid_type_as_beats (success, pos);
 	if (!success) {
 		beats = Evoral::Beats(1);
 	}
diff --git a/gtk2_ardour/midi_region_view.h b/gtk2_ardour/midi_region_view.h
index b24b767..ac2cd4b 100644
--- a/gtk2_ardour/midi_region_view.h
+++ b/gtk2_ardour/midi_region_view.h
@@ -122,7 +122,7 @@ public:
 	void resolve_note(uint8_t note_num, Evoral::Beats end_time);
 
 	void cut_copy_clear (Editing::CutCopyOp);
-	bool paste (framepos_t pos, const ::Selection& selection, PasteContext& ctx);
+	bool paste (framepos_t pos, const ::Selection& selection, PasteContext& ctx, const int32_t sub_num);
 	void paste_internal (framepos_t pos, unsigned paste_count, float times, const MidiCutBuffer&);
 
 	void add_canvas_patch_change (ARDOUR::MidiModel::PatchChangePtr patch, const std::string& displaytext, bool);
@@ -427,11 +427,6 @@ private:
 	Evoral::Beats                        _step_edit_cursor_position;
 	NoteBase*                            _channel_selection_scoped_note;
 
-	/** A group used to temporarily reparent _note_group to during start trims, so
-	 *  that the notes don't move with the parent region view.
-	 */
-	ArdourCanvas::Container*                 _temporary_note_group;
-
 	MouseState _mouse_state;
 	int _pressed_button;
 
diff --git a/gtk2_ardour/midi_streamview.cc b/gtk2_ardour/midi_streamview.cc
index 9258cf0..301e9dd 100644
--- a/gtk2_ardour/midi_streamview.cc
+++ b/gtk2_ardour/midi_streamview.cc
@@ -47,7 +47,7 @@
 #include "ui_config.h"
 #include "utils.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
@@ -440,7 +440,7 @@ MidiStreamView::setup_rec_box ()
 
 		if (!rec_active &&
 		    _trackview.session()->record_status() == Session::Recording &&
-		    _trackview.track()->record_enabled()) {
+		    _trackview.track()->rec_enable_control()->get_value()) {
 
 			if (UIConfiguration::instance().get_show_waveforms_while_recording() && rec_regions.size() == rec_rects.size()) {
 
@@ -512,7 +512,7 @@ MidiStreamView::setup_rec_box ()
 
 		} else if (rec_active &&
 		           (_trackview.session()->record_status() != Session::Recording ||
-		            !_trackview.track()->record_enabled())) {
+		            !_trackview.track()->rec_enable_control()->get_value())) {
 			screen_update_connection.disconnect();
 			rec_active = false;
 			rec_updating = false;
@@ -610,7 +610,7 @@ MidiStreamView::update_rec_box ()
 
 	/* Update the region being recorded to reflect where we currently are */
 	boost::shared_ptr<ARDOUR::Region> region = rec_regions.back().first;
-	region->set_length (_trackview.track()->current_capture_end () - _trackview.track()->current_capture_start());
+	region->set_length (_trackview.track()->current_capture_end () - _trackview.track()->current_capture_start(), 0);
 
 	MidiRegionView* mrv = dynamic_cast<MidiRegionView*> (rec_regions.back().second);
 	mrv->extend_active_notes ();
@@ -662,7 +662,7 @@ struct RegionPositionSorter {
 };
 
 bool
-MidiStreamView::paste (ARDOUR::framepos_t pos, const Selection& selection, PasteContext& ctx)
+MidiStreamView::paste (ARDOUR::framepos_t pos, const Selection& selection, PasteContext& ctx, const int32_t sub_num)
 {
 	/* Paste into the first region which starts on or before pos.  Only called when
 	   using an internal editing tool. */
@@ -690,5 +690,5 @@ MidiStreamView::paste (ARDOUR::framepos_t pos, const Selection& selection, Paste
 	}
 
 	MidiRegionView* mrv = dynamic_cast<MidiRegionView*> (*prev);
-	return mrv ? mrv->paste(pos, selection, ctx) : false;
+	return mrv ? mrv->paste(pos, selection, ctx, sub_num) : false;
 }
diff --git a/gtk2_ardour/midi_streamview.h b/gtk2_ardour/midi_streamview.h
index 9be3b34..59cf2da 100644
--- a/gtk2_ardour/midi_streamview.h
+++ b/gtk2_ardour/midi_streamview.h
@@ -98,7 +98,7 @@ class MidiStreamView : public StreamView
 
 	RegionView* create_region_view (boost::shared_ptr<ARDOUR::Region>, bool, bool);
 
-	bool paste (ARDOUR::framepos_t pos, const Selection& selection, PasteContext& ctx);
+	bool paste (ARDOUR::framepos_t pos, const Selection& selection, PasteContext& ctx, const int32_t sub_num);
 
 	void apply_note_range(uint8_t lowest, uint8_t highest, bool to_region_views);
 
diff --git a/gtk2_ardour/midi_time_axis.cc b/gtk2_ardour/midi_time_axis.cc
index 7d01857..57cde4a 100644
--- a/gtk2_ardour/midi_time_axis.cc
+++ b/gtk2_ardour/midi_time_axis.cc
@@ -89,7 +89,7 @@
 
 #include "ardour/midi_track.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 using namespace ARDOUR_UI_UTILS;
@@ -104,8 +104,8 @@ static const uint32_t MIDI_CONTROLS_BOX_MIN_HEIGHT = 160;
 static const uint32_t KEYBOARD_MIN_HEIGHT = 130;
 
 MidiTimeAxisView::MidiTimeAxisView (PublicEditor& ed, Session* sess, ArdourCanvas::Canvas& canvas)
-	: AxisView(sess) // virtually inherited
-	, RouteTimeAxisView(ed, sess, canvas)
+	: SessionHandlePtr (sess)
+	, RouteTimeAxisView (ed, sess, canvas)
 	, _ignore_signals(false)
 	, _range_scroomer(0)
 	, _piano_roll_header(0)
@@ -1301,7 +1301,7 @@ MidiTimeAxisView::update_control_names ()
 		}
 	}
 
-	if (get_selected()) {
+	if (selected()) {
 		controls_ebox.set_name (controls_base_selected_name);
 		time_axis_frame.set_name (controls_base_selected_name);
 	} else {
@@ -1508,7 +1508,7 @@ MidiTimeAxisView::automation_child_menu_item (Evoral::Parameter param)
 }
 
 boost::shared_ptr<MidiRegion>
-MidiTimeAxisView::add_region (framepos_t pos, framecnt_t length, bool commit)
+MidiTimeAxisView::add_region (framepos_t pos, framecnt_t length, bool commit, const int32_t sub_num)
 {
 	Editor* real_editor = dynamic_cast<Editor*> (&_editor);
 	if (commit) {
@@ -1526,8 +1526,9 @@ MidiTimeAxisView::add_region (framepos_t pos, framecnt_t length, bool commit)
 	plist.add (ARDOUR::Properties::name, PBD::basename_nosuffix(src->name()));
 
 	boost::shared_ptr<Region> region = (RegionFactory::create (src, plist));
-
-	playlist()->add_region (region, pos);
+	/* sets beat position */
+	region->set_position (pos, sub_num);
+	playlist()->add_region (region, pos, 1.0, false, sub_num);
 	_session->add_command (new StatefulDiffCommand (playlist()));
 
 	if (commit) {
@@ -1634,12 +1635,12 @@ MidiTimeAxisView::capture_channel_mode_changed ()
 }
 
 bool
-MidiTimeAxisView::paste (framepos_t pos, const Selection& selection, PasteContext& ctx)
+MidiTimeAxisView::paste (framepos_t pos, const Selection& selection, PasteContext& ctx, const int32_t sub_num)
 {
 	if (!_editor.internal_editing()) {
 		// Non-internal paste, paste regions like any other route
-		return RouteTimeAxisView::paste(pos, selection, ctx);
+		return RouteTimeAxisView::paste(pos, selection, ctx, sub_num);
 	}
 
-	return midi_view()->paste(pos, selection, ctx);
+	return midi_view()->paste(pos, selection, ctx, sub_num);
 }
diff --git a/gtk2_ardour/midi_time_axis.h b/gtk2_ardour/midi_time_axis.h
index 6fe77dc..fa6102c 100644
--- a/gtk2_ardour/midi_time_axis.h
+++ b/gtk2_ardour/midi_time_axis.h
@@ -82,13 +82,13 @@ public:
 
 	void set_height (uint32_t, TrackHeightMode m = OnlySelf);
 
-	boost::shared_ptr<ARDOUR::MidiRegion> add_region (ARDOUR::framepos_t, ARDOUR::framecnt_t, bool);
+	boost::shared_ptr<ARDOUR::MidiRegion> add_region (ARDOUR::framepos_t, ARDOUR::framecnt_t, bool, const int32_t sub_num);
 
 	void show_all_automation (bool apply_to_selection = false);
 	void show_existing_automation (bool apply_to_selection = false);
 	void create_automation_child (const Evoral::Parameter& param, bool show);
 
-	bool paste (ARDOUR::framepos_t, const Selection&, PasteContext& ctx);
+	bool paste (ARDOUR::framepos_t, const Selection&, PasteContext& ctx, const int32_t sub_num);
 
 	ARDOUR::NoteMode  note_mode() const { return _note_mode; }
 	ARDOUR::ColorMode color_mode() const { return _color_mode; }
diff --git a/gtk2_ardour/midi_tracer.cc b/gtk2_ardour/midi_tracer.cc
index 3d5e6ac..2f97e5b 100644
--- a/gtk2_ardour/midi_tracer.cc
+++ b/gtk2_ardour/midi_tracer.cc
@@ -34,7 +34,7 @@
 
 #include "midi_tracer.h"
 #include "gui_thread.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace Gtk;
 using namespace std;
diff --git a/gtk2_ardour/midi_velocity_dialog.cc b/gtk2_ardour/midi_velocity_dialog.cc
index 5b21e56..4c0e42f 100644
--- a/gtk2_ardour/midi_velocity_dialog.cc
+++ b/gtk2_ardour/midi_velocity_dialog.cc
@@ -20,7 +20,7 @@
 
 #include "midi_velocity_dialog.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace Gtk;
 
diff --git a/gtk2_ardour/missing_file_dialog.cc b/gtk2_ardour/missing_file_dialog.cc
index 9fe1258..47e6948 100644
--- a/gtk2_ardour/missing_file_dialog.cc
+++ b/gtk2_ardour/missing_file_dialog.cc
@@ -25,7 +25,7 @@
 #include "gtkmm2ext/utils.h"
 
 #include "missing_file_dialog.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace Gtk;
 using namespace std;
diff --git a/gtk2_ardour/missing_plugin_dialog.cc b/gtk2_ardour/missing_plugin_dialog.cc
index 1e216c3..1f2a4f0 100644
--- a/gtk2_ardour/missing_plugin_dialog.cc
+++ b/gtk2_ardour/missing_plugin_dialog.cc
@@ -18,7 +18,7 @@
 
 #include <gtkmm/label.h>
 #include "missing_plugin_dialog.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace Gtk;
 using namespace std;
diff --git a/gtk2_ardour/mixer.bindings b/gtk2_ardour/mixer.bindings
index 62a19ba..f835655 100644
--- a/gtk2_ardour/mixer.bindings
+++ b/gtk2_ardour/mixer.bindings
@@ -1,23 +1,21 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<Bindings name="ardour-mixer">
+ <Bindings name="Mixer">
   <Press>
-     <Binding key="s" action="Mixer/solo"/>
-     <Binding key="m" action="Mixer/mute"/>
-     <Binding key="Secondary-i" action="Mixer/toggle-midi-input-active"/>
-     <Binding key="r" action="Mixer/recenable"/>
-     <Binding key="0" action="Mixer/unity-gain"/>
-     <Binding key="Up" action="Mixer/increment-gain"/>
-     <Binding key="Down" action="Mixer/decrement-gain"/>
-     <Binding key="Left" action="Mixer/scroll-left"/>
-     <Binding key="Right" action="Mixer/scroll-right"/>
-     <Binding key="Primary-x" action="Mixer/cut-processors"/>
-     <Binding key="Primary-c" action="Mixer/copy-processors"/>
-     <Binding key="Primary-v" action="Mixer/paste-processors"/>
-     <Binding key="Delete" action="Mixer/delete-processors"/>
-     <Binding key="BackSpace" action="Mixer/delete-processors"/>
-     <Binding key="Return" action="Mixer/toggle-processors"/>
-     <Binding key="Primary-a" action="Mixer/select-all-processors"/>
-     <Binding key="Slash" action="Mixer/ab-plugins"/>
-     <Binding key="Escape" action="Mixer/select-none"/>
+   <Binding key="s" action="Mixer/solo"/>
+   <Binding key="m" action="Mixer/mute"/>
+   <Binding key="Secondary-i" action="Mixer/toggle-midi-input-active"/>
+   <Binding key="r" action="Mixer/recenable"/>
+   <Binding key="0" action="Mixer/unity-gain"/>
+   <Binding key="Up" action="Mixer/increment-gain"/>
+   <Binding key="Down" action="Mixer/decrement-gain"/>
+   <Binding key="Left" action="Mixer/scroll-left"/>
+   <Binding key="Right" action="Mixer/scroll-right"/>
+   <Binding key="Primary-x" action="Mixer/cut-processors"/>
+   <Binding key="Primary-c" action="Mixer/copy-processors"/>
+   <Binding key="Primary-v" action="Mixer/paste-processors"/>
+   <Binding key="Delete" action="Mixer/delete-processors"/>
+   <Binding key="BackSpace" action="Mixer/delete-processors"/>
+   <Binding key="Return" action="Mixer/toggle-processors"/>
+   <Binding key="Primary-a" action="Mixer/select-all-processors"/>
+   <Binding key="slash" action="Mixer/ab-plugins"/>
   </Press>
-</Bindings>
+ </Bindings>
diff --git a/gtk2_ardour/mixer_actor.cc b/gtk2_ardour/mixer_actor.cc
deleted file mode 100644
index 87a4d01..0000000
--- a/gtk2_ardour/mixer_actor.cc
+++ /dev/null
@@ -1,256 +0,0 @@
-/*
-    Copyright (C) 2000-2004 Paul Davis
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-*/
-
-#ifdef WAF_BUILD
-#include "gtk2ardour-config.h"
-#endif
-
-#include <boost/foreach.hpp>
-
-#include "pbd/file_utils.h"
-#include "pbd/error.h"
-
-#include "ardour/filesystem_paths.h"
-
-#include "actions.h"
-#include "mixer_actor.h"
-#include "mixer_strip.h"
-#include "route_ui.h"
-
-#include "i18n.h"
-
-using namespace ARDOUR;
-using namespace Gtk;
-using namespace PBD;
-
-MixerActor::MixerActor ()
-{
-	register_actions ();
-	load_bindings ();
-}
-
-MixerActor::~MixerActor ()
-{
-}
-
-void
-MixerActor::register_actions ()
-{
-	myactions.register_action ("Mixer", "solo", _("Toggle Solo on Mixer-Selected Tracks/Busses"), sigc::mem_fun (*this, &MixerActor::solo_action));
-	myactions.register_action ("Mixer", "mute", _("Toggle Mute on Mixer-Selected Tracks/Busses"), sigc::mem_fun (*this, &MixerActor::mute_action));
-	myactions.register_action ("Mixer", "recenable", _("Toggle Rec-enable on Mixer-Selected Tracks/Busses"), sigc::mem_fun (*this, &MixerActor::rec_enable_action));
-	myactions.register_action ("Mixer", "increment-gain", _("Decrease Gain on Mixer-Selected Tracks/Busses"), sigc::mem_fun (*this, &MixerActor::step_gain_up_action));
-	myactions.register_action ("Mixer", "decrement-gain", _("Increase Gain on Mixer-Selected Tracks/Busses"), sigc::mem_fun (*this, &MixerActor::step_gain_down_action));
-	myactions.register_action ("Mixer", "unity-gain", _("Set Gain to 0dB on Mixer-Selected Tracks/Busses"), sigc::mem_fun (*this, &MixerActor::unity_gain_action));
-
-
-	myactions.register_action ("Mixer", "copy-processors", _("Copy Selected Processors"), sigc::mem_fun (*this, &MixerActor::copy_processors));
-	myactions.register_action ("Mixer", "cut-processors", _("Cut Selected Processors"), sigc::mem_fun (*this, &MixerActor::cut_processors));
-	myactions.register_action ("Mixer", "paste-processors", _("Paste Selected Processors"), sigc::mem_fun (*this, &MixerActor::paste_processors));
-	myactions.register_action ("Mixer", "delete-processors", _("Delete Selected Processors"), sigc::mem_fun (*this, &MixerActor::delete_processors));
-	myactions.register_action ("Mixer", "select-all-processors", _("Select All (visible) Processors"), sigc::mem_fun (*this, &MixerActor::select_all_processors));
-	myactions.register_action ("Mixer", "toggle-processors", _("Toggle Selected Processors"), sigc::mem_fun (*this, &MixerActor::toggle_processors));
-	myactions.register_action ("Mixer", "ab-plugins", _("Toggle Selected Plugins"), sigc::mem_fun (*this, &MixerActor::ab_plugins));
-	myactions.register_action ("Mixer", "select-none", _("Deselect all strips and processors"), sigc::mem_fun (*this, &MixerActor::select_none));
-
-	myactions.register_action ("Mixer", "scroll-left", _("Scroll Mixer Window to the left"), sigc::mem_fun (*this, &MixerActor::scroll_left));
-	myactions.register_action ("Mixer", "scroll-right", _("Scroll Mixer Window to the left"), sigc::mem_fun (*this, &MixerActor::scroll_right));
-
-	myactions.register_action ("Mixer", "toggle-midi-input-active", _("Toggle MIDI Input Active for Mixer-Selected Tracks/Busses"),
-				   sigc::bind (sigc::mem_fun (*this, &MixerActor::toggle_midi_input_active), false));
-}
-
-void
-MixerActor::load_bindings ()
-{
-        /* XXX move this to a better place */
-
-        bindings.set_action_map (myactions);
-
-	std::string binding_file;
-
-	if (find_file (ardour_config_search_path(), "mixer.bindings", binding_file)) {
-                bindings.load (binding_file);
-		info << string_compose (_("Loaded mixer bindings from %1"), binding_file) << endmsg;
-        } else {
-		error << string_compose (_("Could not find mixer.bindings in search path %1"), ardour_config_search_path().to_string()) << endmsg;
-	}
-}
-
-void
-MixerActor::solo_action ()
-{
-	GdkEventButton ev;
-
-	ev.type = GDK_BUTTON_PRESS;
-	ev.button = 1;
-	ev.state = 0;
-
-	set_route_targets_for_operation ();
-
-	BOOST_FOREACH(RouteUI* r, _route_targets) {
-		r->solo_press (&ev);
-	}
-}
-
-void
-MixerActor::mute_action ()
-{
-	GdkEventButton ev;
-
-	ev.type = GDK_BUTTON_PRESS;
-	ev.button = 1;
-	ev.state = 0;
-
-	set_route_targets_for_operation ();
-
-	BOOST_FOREACH(RouteUI* r, _route_targets) {
-		r->mute_press (&ev);
-	}
-}
-
-void
-MixerActor::rec_enable_action ()
-{
-	GdkEventButton ev;
-
-	ev.type = GDK_BUTTON_PRESS;
-	ev.button = 1;
-	ev.state = 0;
-
-	set_route_targets_for_operation ();
-
-	BOOST_FOREACH(RouteUI* r, _route_targets) {
-		r->rec_enable_press (&ev);
-	}
-}
-
-void
-MixerActor::step_gain_up_action ()
-{
-	set_route_targets_for_operation ();
-
-	BOOST_FOREACH(RouteUI* r, _route_targets) {
-		MixerStrip* ms = dynamic_cast<MixerStrip*> (r);
-		if (ms) {
-			ms->step_gain_up ();
-		}
-	}
-}
-
-void
-MixerActor::step_gain_down_action ()
-{
-	set_route_targets_for_operation ();
-
-	BOOST_FOREACH(RouteUI* r, _route_targets) {
-		MixerStrip* ms = dynamic_cast<MixerStrip*> (r);
-		if (ms) {
-			ms->step_gain_down ();
-		}
-	}
-}
-
-void
-MixerActor::unity_gain_action ()
-{
-	set_route_targets_for_operation ();
-
-printf("setting gain to unity (?)");
-	BOOST_FOREACH(RouteUI* r, _route_targets) {
-		boost::shared_ptr<Route> rp = r->route();
-		if (rp) {
-			rp->set_gain (1.0, Controllable::NoGroup);
-		}
-	}
-}
-
-void
-MixerActor::copy_processors ()
-{
-	set_route_targets_for_operation ();
-
-	BOOST_FOREACH(RouteUI* r, _route_targets) {
-		MixerStrip* ms = dynamic_cast<MixerStrip*> (r);
-		if (ms) {
-			ms->copy_processors ();
-		}
-	}
-}
-void
-MixerActor::cut_processors ()
-{
-	set_route_targets_for_operation ();
-
-	BOOST_FOREACH(RouteUI* r, _route_targets) {
-		MixerStrip* ms = dynamic_cast<MixerStrip*> (r);
-		if (ms) {
-			ms->cut_processors ();
-		}
-	}
-}
-void
-MixerActor::paste_processors ()
-{
-	set_route_targets_for_operation ();
-
-	BOOST_FOREACH(RouteUI* r, _route_targets) {
-		MixerStrip* ms = dynamic_cast<MixerStrip*> (r);
-		if (ms) {
-			ms->paste_processors ();
-		}
-	}
-}
-void
-MixerActor::select_all_processors ()
-{
-	set_route_targets_for_operation ();
-
-	BOOST_FOREACH(RouteUI* r, _route_targets) {
-		MixerStrip* ms = dynamic_cast<MixerStrip*> (r);
-		if (ms) {
-			ms->select_all_processors ();
-		}
-	}
-}
-void
-MixerActor::toggle_processors ()
-{
-	set_route_targets_for_operation ();
-
-	BOOST_FOREACH(RouteUI* r, _route_targets) {
-		MixerStrip* ms = dynamic_cast<MixerStrip*> (r);
-		if (ms) {
-			ms->toggle_processors ();
-		}
-	}
-}
-void
-MixerActor::ab_plugins ()
-{
-	set_route_targets_for_operation ();
-
-	BOOST_FOREACH(RouteUI* r, _route_targets) {
-		MixerStrip* ms = dynamic_cast<MixerStrip*> (r);
-		if (ms) {
-			ms->ab_plugins ();
-		}
-	}
-}
-
diff --git a/gtk2_ardour/mixer_actor.h b/gtk2_ardour/mixer_actor.h
deleted file mode 100644
index d3e861b..0000000
--- a/gtk2_ardour/mixer_actor.h
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
-    Copyright (C) 2000 Paul Davis
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-*/
-
-#ifndef __gtk2_ardour_mixer_actor_h__
-#define __gtk2_ardour_mixer_actor_h__
-
-#include <glibmm/refptr.h>
-#include <gtkmm2ext/bindings.h>
-
-#include "route_processor_selection.h"
-
-namespace Gtk {
-	class ActionGroup;
-}
-
-class MixerActor : virtual public sigc::trackable
-{
-  public:
-	MixerActor ();
-	virtual ~MixerActor ();
-
-	RouteProcessorSelection& selection() { return _selection; }
-	void register_actions ();
-
-        void load_bindings ();
-        Gtkmm2ext::Bindings  bindings;
-
-  protected:
-	RouteProcessorSelection _selection;
-	RouteUISelection _route_targets;
-        Gtkmm2ext::ActionMap myactions;
-
-	virtual void set_route_targets_for_operation () = 0;
-
-	void solo_action ();
-	void mute_action ();
-	void rec_enable_action ();
-	void step_gain_up_action ();
-	void step_gain_down_action ();
-	void unity_gain_action ();
-
-	void copy_processors ();
-	void cut_processors ();
-	void paste_processors ();
-	void select_all_processors ();
-	void toggle_processors ();
-	void ab_plugins ();
-
-	//this op is different because it checks _all_ mixer strips, and deletes selected plugins on any of them (ignores track selections)
-	//BUT... note that we have used mixerstrip's "Enter" to enforce the rule that only one strip will have an active selection
-	virtual void delete_processors () = 0;
-
-	virtual void select_none () = 0;
-
-
-        /* these actions need access to a Session, do defer to
-	   a derived class
-	*/
-        virtual void toggle_midi_input_active (bool flip_others) = 0;
-
-	/* these actions don't apply to the selection, so defer to
-	   a derived class.
-	*/
-	virtual void scroll_left () {}
-	virtual void scroll_right () {}
-};
-
-#endif /* __gtk2_ardour_mixer_actor_h__ */
diff --git a/gtk2_ardour/mixer_group_tabs.cc b/gtk2_ardour/mixer_group_tabs.cc
index f84c53b..63bb1a0 100644
--- a/gtk2_ardour/mixer_group_tabs.cc
+++ b/gtk2_ardour/mixer_group_tabs.cc
@@ -33,7 +33,7 @@
 #include "ui_config.h"
 #include "utils.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace Gtk;
@@ -61,7 +61,12 @@ MixerGroupTabs::compute_tabs () const
 	TreeModel::Children rows = _mixer->track_model->children ();
 	for (TreeModel::Children::iterator i = rows.begin(); i != rows.end(); ++i) {
 
-		MixerStrip* s = (*i)[_mixer->track_columns.strip];
+		AxisView* av = (*i)[_mixer->stripable_columns.strip];
+		MixerStrip* s = dynamic_cast<MixerStrip*> (av);
+
+		if (!s) {
+			continue;
+		}
 
 		if (s->route()->is_master() || s->route()->is_monitor() || !s->marked_for_display()) {
 			continue;
@@ -149,11 +154,16 @@ MixerGroupTabs::routes_for_tab (Tab const * t) const
 	TreeModel::Children rows = _mixer->track_model->children ();
 	for (TreeModel::Children::iterator i = rows.begin(); i != rows.end(); ++i) {
 
-		MixerStrip* s = (*i)[_mixer->track_columns.strip];
+		AxisView* av = (*i)[_mixer->stripable_columns.strip];
+		MixerStrip* s = dynamic_cast<MixerStrip*> (av);
+
+		if (!s) {
+			continue;
+		}
 
-	 	if (s->route()->is_master() || s->route()->is_monitor() || !s->marked_for_display()) {
-	 		continue;
-	 	}
+		if (s->route()->is_master() || s->route()->is_monitor() || !s->marked_for_display()) {
+			continue;
+		}
 
 		if (x >= t->to) {
 			/* tab finishes before this track starts */
@@ -176,8 +186,8 @@ RouteList
 MixerGroupTabs::selected_routes () const
 {
 	RouteList rl;
-	BOOST_FOREACH (RouteUI* r, _mixer->selection().routes) {
-		boost::shared_ptr<Route> rp = r->route();
+	BOOST_FOREACH (AxisView* r, _mixer->selection().axes) {
+		boost::shared_ptr<Route> rp = boost::dynamic_pointer_cast<Route> (r->stripable());
 		if (rp) {
 			rl.push_back (rp);
 		}
@@ -185,8 +195,3 @@ MixerGroupTabs::selected_routes () const
 	return rl;
 }
 
-void
-MixerGroupTabs::sync_order_keys ()
-{
-	_mixer->sync_order_keys_from_treeview ();
-}
diff --git a/gtk2_ardour/mixer_group_tabs.h b/gtk2_ardour/mixer_group_tabs.h
index 5f15255..8da5a1b 100644
--- a/gtk2_ardour/mixer_group_tabs.h
+++ b/gtk2_ardour/mixer_group_tabs.h
@@ -36,7 +36,6 @@ private:
 	}
 
 	ARDOUR::RouteList selected_routes () const;
-	void sync_order_keys ();
 
 	Mixer_UI* _mixer;
 };
diff --git a/gtk2_ardour/mixer_strip.cc b/gtk2_ardour/mixer_strip.cc
index 553f44a..1e8717d 100644
--- a/gtk2_ardour/mixer_strip.cc
+++ b/gtk2_ardour/mixer_strip.cc
@@ -38,6 +38,7 @@
 #include "ardour/audio_track.h"
 #include "ardour/audioengine.h"
 #include "ardour/internal_send.h"
+#include "ardour/io.h"
 #include "ardour/meter.h"
 #include "ardour/midi_track.h"
 #include "ardour/pannable.h"
@@ -52,6 +53,8 @@
 #include "ardour/session.h"
 #include "ardour/types.h"
 #include "ardour/user_bundle.h"
+#include "ardour/vca.h"
+#include "ardour/vca_manager.h"
 
 #include "ardour_window.h"
 #include "mixer_strip.h"
@@ -68,7 +71,7 @@
 #include "tooltips.h"
 #include "ui_config.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 using namespace ARDOUR_UI_UTILS;
@@ -79,11 +82,10 @@ using namespace std;
 using namespace ArdourMeter;
 
 MixerStrip* MixerStrip::_entered_mixer_strip;
-
 PBD::Signal1<void,MixerStrip*> MixerStrip::CatchDeletion;
 
 MixerStrip::MixerStrip (Mixer_UI& mx, Session* sess, bool in_mixer)
-	: AxisView(sess)
+	: SessionHandlePtr (sess)
 	, RouteUI (sess)
 	, _mixer(mx)
 	, _mixer_owned (in_mixer)
@@ -98,9 +100,11 @@ MixerStrip::MixerStrip (Mixer_UI& mx, Session* sess, bool in_mixer)
 	, meter_point_button (_("pre"))
 	, monitor_section_button (0)
 	, midi_input_enable_button (0)
+	, _plugin_insert_cnt (0)
 	, _comment_button (_("Comments"))
 	, trim_control (ArdourKnob::default_elements, ArdourKnob::Flags (ArdourKnob::Detent | ArdourKnob::ArcToZero))
 	, _visibility (X_("mixer-element-visibility"))
+	, control_slave_ui (sess)
 {
 	init ();
 
@@ -114,7 +118,7 @@ MixerStrip::MixerStrip (Mixer_UI& mx, Session* sess, bool in_mixer)
 }
 
 MixerStrip::MixerStrip (Mixer_UI& mx, Session* sess, boost::shared_ptr<Route> rt, bool in_mixer)
-	: AxisView(sess)
+	: SessionHandlePtr (sess)
 	, RouteUI (sess)
 	, _mixer(mx)
 	, _mixer_owned (in_mixer)
@@ -132,6 +136,7 @@ MixerStrip::MixerStrip (Mixer_UI& mx, Session* sess, boost::shared_ptr<Route> rt
 	, _comment_button (_("Comments"))
 	, trim_control (ArdourKnob::default_elements, ArdourKnob::Flags (ArdourKnob::Detent | ArdourKnob::ArcToZero))
 	, _visibility (X_("mixer-element-visibility"))
+	, control_slave_ui (sess)
 {
 	init ();
 	set_route (rt);
@@ -158,9 +163,11 @@ MixerStrip::init ()
 	}
 
 	width_button.set_icon (ArdourIcon::StripWidth);
+	hide_button.set_tweaks (ArdourButton::Square);
 	set_tooltip (width_button, t);
 
 	hide_button.set_icon (ArdourIcon::CloseCross);
+	hide_button.set_tweaks (ArdourButton::Square);
 	set_tooltip (&hide_button, _("Hide this mixer strip"));
 
 	input_button_box.set_spacing(2);
@@ -257,7 +264,9 @@ MixerStrip::init ()
 	group_button.set_name ("mixer strip button");
 
 	_comment_button.set_name (X_("mixer strip button"));
+	_comment_button.set_text_ellipsize (Pango::ELLIPSIZE_END);
 	_comment_button.signal_clicked.connect (sigc::mem_fun (*this, &RouteUI::toggle_comment_editor));
+	_comment_button.signal_size_allocate().connect (sigc::mem_fun (*this, &MixerStrip::comment_button_resized));
 
 	// TODO implement ArdourKnob::on_size_request properly
 #define PX_SCALE(px) std::max((float)px, rintf((float)px * UIConfiguration::instance().get_ui_scale()))
@@ -277,7 +286,6 @@ MixerStrip::init ()
 	width_button.signal_button_press_event().connect (sigc::mem_fun(*this, &MixerStrip::width_button_pressed), false);
 	hide_button.signal_clicked.connect (sigc::mem_fun(*this, &MixerStrip::hide_clicked));
 
-//	width_hide_box.set_border_width (1);
 	width_hide_box.set_spacing (2);
 	width_hide_box.pack_start (width_button, false, true);
 	width_hide_box.pack_start (number_label, true, true);
@@ -290,6 +298,7 @@ MixerStrip::init ()
 	number_label.set_fixed_colors (0x80808080, 0x80808080);
 	number_label.set_alignment (.5, .5);
 	number_label.set_fallthrough_to_parent (true);
+	number_label.set_tweaks (ArdourButton::OccasionalText);
 
 	global_vpacker.set_spacing (2);
 	if (!ARDOUR::Profile->get_trx()) {
@@ -304,6 +313,7 @@ MixerStrip::init ()
 	global_vpacker.pack_start (solo_iso_table, Gtk::PACK_SHRINK);
 	global_vpacker.pack_start (mute_solo_table, Gtk::PACK_SHRINK);
 	global_vpacker.pack_start (gpm, Gtk::PACK_SHRINK);
+	global_vpacker.pack_start (control_slave_ui, Gtk::PACK_SHRINK);
 	global_vpacker.pack_start (bottom_button_table, Gtk::PACK_SHRINK);
 	if (!ARDOUR::Profile->get_trx()) {
 		global_vpacker.pack_start (output_button, Gtk::PACK_SHRINK);
@@ -385,6 +395,7 @@ MixerStrip::init ()
 	_visibility.add (&solo_iso_table, X_("SoloIsoLock"), _("Solo Iso / Lock"), false);
 	_visibility.add (&output_button, X_("Output"), _("Output"), false);
 	_visibility.add (&_comment_button, X_("Comments"), _("Comments"), false);
+	_visibility.add (&control_slave_ui, X_("VCA"), _("VCA Assigns"), false);
 
 	parameter_changed (X_("mixer-element-visibility"));
 	UIConfiguration::instance().ParameterChanged.connect (sigc::mem_fun (*this, &MixerStrip::parameter_changed));
@@ -437,6 +448,29 @@ MixerStrip::mixer_strip_leave_event (GdkEventCrossing *ev)
 	return false;
 }
 
+string
+MixerStrip::name() const
+{
+	if (_route) {
+		return _route->name();
+	}
+	return string();
+}
+
+void
+MixerStrip::update_trim_control ()
+{
+	if (route()->trim() && route()->trim()->active() &&
+	    route()->n_inputs().n_audio() > 0) {
+		trim_control.show ();
+		trim_control.set_controllable (route()->trim()->gain_control());
+	} else {
+		trim_control.hide ();
+		boost::shared_ptr<Controllable> none;
+		trim_control.set_controllable (none);
+	}
+}
+
 void
 MixerStrip::set_route (boost::shared_ptr<Route> rt)
 {
@@ -461,6 +495,8 @@ MixerStrip::set_route (boost::shared_ptr<Route> rt)
 
 	RouteUI::set_route (rt);
 
+	control_slave_ui.set_stripable (boost::dynamic_pointer_cast<Stripable> (rt));
+
 	/* ProcessorBox needs access to _route so that it can read
 	   GUI object state.
 	*/
@@ -541,14 +577,7 @@ MixerStrip::set_route (boost::shared_ptr<Route> rt)
 		monitor_disk_button->hide ();
 	}
 
-	if (route()->trim() && route()->trim()->active()) {
-		trim_control.show ();
-		trim_control.set_controllable (route()->trim()->gain_control());
-	} else {
-		trim_control.hide ();
-		boost::shared_ptr<Controllable> none;
-		trim_control.set_controllable (none);
-	}
+	update_trim_control();
 
 	if (is_midi_track()) {
 		if (midi_input_enable_button == 0) {
@@ -583,7 +612,6 @@ MixerStrip::set_route (boost::shared_ptr<Route> rt)
 	if (is_track ()) {
 
 		rec_mon_table.attach (*rec_enable_button, 0, 1, 0, ARDOUR::Profile->get_mixbus() ? 1 : 2);
-		rec_enable_button->set_sensitive (_session->writable());
 		rec_enable_button->show();
 
 		if (ARDOUR::Profile->get_mixbus()) {
@@ -628,7 +656,6 @@ MixerStrip::set_route (boost::shared_ptr<Route> rt)
 	}
 
 	_route->comment_changed.connect (route_connections, invalidator (*this), boost::bind (&MixerStrip::setup_comment_button, this), gui_context());
-	_route->PropertyChanged.connect (route_connections, invalidator (*this), boost::bind (&MixerStrip::property_changed, this, _1), gui_context());
 
 	set_stuff_from_route ();
 
@@ -639,6 +666,7 @@ MixerStrip::set_route (boost::shared_ptr<Route> rt)
 	name_changed ();
 	comment_changed ();
 	route_group_changed ();
+	update_track_number_visibility ();
 
 	connect_to_pan ();
 	panners.setup_pan ();
@@ -874,15 +902,17 @@ MixerStrip::output_press (GdkEventButton *ev)
 			citems.pop_back ();
 		}
 
-		citems.push_back (SeparatorElem());
+		if (!ARDOUR::Profile->get_mixbus()) {
+			citems.push_back (SeparatorElem());
 
-		for (DataType::iterator i = DataType::begin(); i != DataType::end(); ++i) {
-			citems.push_back (
-				MenuElem (
-					string_compose (_("Add %1 port"), (*i).to_i18n_string()),
-					sigc::bind (sigc::mem_fun (*this, &MixerStrip::add_output_port), *i)
-					)
-				);
+			for (DataType::iterator i = DataType::begin(); i != DataType::end(); ++i) {
+				citems.push_back (
+						MenuElem (
+							string_compose (_("Add %1 port"), (*i).to_i18n_string()),
+							sigc::bind (sigc::mem_fun (*this, &MixerStrip::add_output_port), *i)
+							)
+						);
+			}
 		}
 
 		citems.push_back (SeparatorElem());
@@ -930,7 +960,7 @@ MixerStrip::input_press (GdkEventButton *ev)
 		return true;
 	}
 
-	if (_session->actively_recording() && _route->record_enabled())
+	if (_session->actively_recording() && is_track() && track()->rec_enable_control()->get_value())
 		return true;
 
 	switch (ev->button) {
@@ -1037,9 +1067,9 @@ MixerStrip::maybe_add_bundle_to_input_menu (boost::shared_ptr<Bundle> b, ARDOUR:
 {
 	using namespace Menu_Helpers;
 
- 	if (b->ports_are_outputs() == false || b->nchannels() != _route->n_inputs() || *b == *_route->output()->bundle()) {
- 		return;
- 	}
+	if (b->ports_are_outputs() == false || b->nchannels() != _route->n_inputs() || *b == *_route->output()->bundle()) {
+		return;
+	}
 
 	list<boost::shared_ptr<Bundle> >::iterator i = input_menu_bundles.begin ();
 	while (i != input_menu_bundles.end() && b->has_same_ports (*i) == false) {
@@ -1065,9 +1095,9 @@ MixerStrip::maybe_add_bundle_to_output_menu (boost::shared_ptr<Bundle> b, ARDOUR
 {
 	using namespace Menu_Helpers;
 
- 	if (b->ports_are_inputs() == false || b->nchannels() != _route->n_outputs() || *b == *_route->input()->bundle()) {
- 		return;
- 	}
+	if (b->ports_are_inputs() == false || b->nchannels() != _route->n_outputs() || *b == *_route->input()->bundle()) {
+		return;
+	}
 
 	list<boost::shared_ptr<Bundle> >::iterator i = output_menu_bundles.begin ();
 	while (i != output_menu_bundles.end() && b->has_same_ports (*i) == false) {
@@ -1187,6 +1217,7 @@ MixerStrip::update_io_button (boost::shared_ptr<ARDOUR::Route> route, Width widt
 {
 	uint32_t io_count;
 	uint32_t io_index;
+	boost::shared_ptr<IO> io;
 	boost::shared_ptr<Port> port;
 	vector<string> port_connections;
 
@@ -1211,30 +1242,70 @@ MixerStrip::update_io_button (boost::shared_ptr<ARDOUR::Route> route, Width widt
 	ostringstream tooltip;
 	char * tooltip_cstr;
 
-	//to avoid confusion, the button caption should only show connections that match the datatype of the track
+	/* To avoid confusion, the button caption only shows connections that match the expected datatype
+	 *
+	 * First of all, if the user made only connections to a given type, we should use that one since
+	 * it is very probably what the user expects. If there are several connections types, then show
+	 * audio ones as primary, which matches expectations for both audio tracks with midi control and
+	 * synthesisers. This first heuristic can be expressed with these two rules:
+	 * A) If there are connected audio ports, consider audio as primary type.
+	 * B) Else, if there are connected midi ports, consider midi as primary type.
+	 *
+	 * If there are no connected ports, then we choose the primary type based on the type of existing
+	 * but unconnected ports. Again:
+	 * C) If there are audio ports, consider audio as primary type.
+	 * D) Else, if there are midi ports, consider midi as primary type. */
+
 	DataType dt = DataType::AUDIO;
-	if ( boost::dynamic_pointer_cast<MidiTrack>(route) != 0 ) {
-		dt = DataType::MIDI;
-		// avoid further confusion with Midi-tracks that have a synth.
-		// Audio-ports may be connected, but button says "Disconnected"
+	bool match = false;
+
+	if (for_input) {
+		io = route->input();
+	} else {
+		io = route->output();
+	}
+
+	io_count = io->n_ports().n_total();
+	for (io_index = 0; io_index < io_count; ++io_index) {
+		port = io->nth (io_index);
+		if (port->connected()) {
+			match = true;
+			if (port->type() == DataType::AUDIO) {
+				/* Rule A) applies no matter the remaining ports */
+				dt = DataType::AUDIO;
+				break;
+			}
+			if (port->type() == DataType::MIDI) {
+				/* Rule B) is a good candidate... */
+				dt = DataType::MIDI;
+				/* ...but continue the loop to check remaining ports for rule A) */
+			}
+		}
+	}
+
+	if (!match) {
+		/* Neither rule A) nor rule B) matched */
+		if ( io->n_ports().n_audio() > 0 ) {
+			/* Rule C */
+			dt = DataType::AUDIO;
+		} else if ( io->n_ports().n_midi() > 0 ) {
+			/* Rule D */
+			dt = DataType::MIDI;
+		}
+	}
+
+	if ( dt == DataType::MIDI ) {
 		tooltip << _("MIDI ");
 	}
 
 	if (for_input) {
-		io_count = route->n_inputs().n_total();
 		tooltip << string_compose (_("<b>INPUT</b> to %1"), Gtkmm2ext::markup_escape_text (route->name()));
 	} else {
-		io_count = route->n_outputs().n_total();
 		tooltip << string_compose (_("<b>OUTPUT</b> from %1"), Gtkmm2ext::markup_escape_text (route->name()));
 	}
 
-
 	for (io_index = 0; io_index < io_count; ++io_index) {
-		if (for_input) {
-			port = route->input()->nth (io_index);
-		} else {
-			port = route->output()->nth (io_index);
-		}
+		port = io->nth (io_index);
 
 		port_connections.clear ();
 		port->get_connections(port_connections);
@@ -1351,17 +1422,20 @@ MixerStrip::update_io_button (boost::shared_ptr<ARDOUR::Route> route, Width widt
 
 	if (for_input) {
 		set_tooltip (&input_button, tooltip_cstr);
-  	} else {
+	} else {
 		set_tooltip (&output_button, tooltip_cstr);
 	}
 
+	delete [] tooltip_cstr;
+
 	if (each_io_has_one_connection) {
 		if (total_connection_count == ardour_connection_count) {
 			// all connections are to the same track in ardour
 			// "ardour:Master/" -> "Master"
 			string::size_type slash = ardour_track_name.find("/");
 			if (slash != string::npos) {
-				label << ardour_track_name.substr(7, slash - 7);
+				const size_t ppps = RouteUI::program_port_prefix.size (); // "ardour:"
+				label << ardour_track_name.substr (ppps, slash - ppps);
 				have_label = true;
 			}
 		}
@@ -1402,7 +1476,7 @@ void
 MixerStrip::update_input_display ()
 {
 	update_io_button (_route, _width, true);
-  	panners.setup_pan ();
+	panners.setup_pan ();
 
 	if (has_audio_outputs ()) {
 		panners.show_all ();
@@ -1416,8 +1490,8 @@ void
 MixerStrip::update_output_display ()
 {
 	update_io_button (_route, _width, false);
-  	gpm.setup_meters ();
-  	panners.setup_pan ();
+	gpm.setup_meters ();
+	panners.setup_pan ();
 
 	if (has_audio_outputs ()) {
 		panners.show_all ();
@@ -1442,6 +1516,7 @@ void
 MixerStrip::io_changed_proxy ()
 {
 	Glib::signal_idle().connect_once (sigc::mem_fun (*this, &MixerStrip::update_panner_choices));
+	Glib::signal_idle().connect_once (sigc::mem_fun (*this, &MixerStrip::update_trim_control));
 }
 
 void
@@ -1464,33 +1539,27 @@ MixerStrip::port_connected_or_disconnected (boost::weak_ptr<Port> wa, boost::wea
 void
 MixerStrip::setup_comment_button ()
 {
-	switch (_width) {
+	std::string comment = _route->comment();
 
-	case Wide:
-		if (_route->comment().empty ()) {
-			_comment_button.unset_bg (STATE_NORMAL);
-			_comment_button.set_text (_("Comments"));
-		} else {
-			_comment_button.modify_bg (STATE_NORMAL, color ());
-			_comment_button.set_text (_("*Comments*"));
-		}
-		break;
+	set_tooltip (_comment_button, comment.empty() ? _("Click to add/edit comments") : _route->comment());
 
-	case Narrow:
-		if (_route->comment().empty ()) {
-			_comment_button.unset_bg (STATE_NORMAL);
-			_comment_button.set_text (_("Cmt"));
-		} else {
-			_comment_button.modify_bg (STATE_NORMAL, color ());
-			_comment_button.set_text (_("*Cmt*"));
-		}
-		break;
+	if (comment.empty ()) {
+		_comment_button.set_name ("generic button");
+		_comment_button.set_text (_width  == Wide ? _("Comments") : _("Cmt"));
+		return;
 	}
 
-	set_tooltip (
-		_comment_button, _route->comment().empty() ? _("Click to add/edit comments") : _route->comment()
-		);
+	_comment_button.set_name ("comment button");
 
+	string::size_type pos = comment.find_first_of (" \t\n");
+	if (pos != string::npos) {
+		comment = comment.substr (0, pos);
+	}
+	if (comment.empty()) {
+		_comment_button.set_text (_width  == Wide ? _("Comments") : _("Cmt"));
+	} else {
+		_comment_button.set_text (comment);
+	}
 }
 
 bool
@@ -1504,9 +1573,9 @@ MixerStrip::select_route_group (GdkEventButton *ev)
 
 			PropertyList* plist = new PropertyList();
 
-			plist->add (Properties::gain, true);
-			plist->add (Properties::mute, true);
-			plist->add (Properties::solo, true);
+			plist->add (Properties::group_gain, true);
+			plist->add (Properties::group_mute, true);
+			plist->add (Properties::group_solo, true);
 
 			group_menu = new RouteGroupMenu (_session, plist);
 		}
@@ -1555,6 +1624,18 @@ MixerStrip::show_passthru_color ()
 	reset_strip_style ();
 }
 
+
+void
+MixerStrip::help_count_plugins (boost::weak_ptr<Processor> p)
+{
+	boost::shared_ptr<Processor> processor (p.lock ());
+	if (!processor || !processor->display_to_user()) {
+		return;
+	}
+	if (boost::dynamic_pointer_cast<PluginInsert> (processor)) {
+		++_plugin_insert_cnt;
+	}
+}
 void
 MixerStrip::build_route_ops_menu ()
 {
@@ -1587,8 +1668,22 @@ MixerStrip::build_route_ops_menu ()
 	i->set_sensitive(! _session->transport_rolling());
 	i->signal_activate().connect (sigc::bind (sigc::mem_fun (*this, &RouteUI::set_route_active), !_route->active(), false));
 
-	items.push_back (SeparatorElem());
+	if (!Profile->get_mixbus ()) {
+		items.push_back (SeparatorElem());
+		items.push_back (CheckMenuElem (_("Strict I/O")));
+		i = dynamic_cast<Gtk::CheckMenuItem *> (&items.back());
+		i->set_active (_route->strict_io());
+		i->signal_activate().connect (sigc::hide_return (sigc::bind (sigc::mem_fun (*_route, &Route::set_strict_io), !_route->strict_io())));
+	}
+
+	_plugin_insert_cnt = 0;
+	_route->foreach_processor (sigc::mem_fun (*this, &MixerStrip::help_count_plugins));
+	if (_plugin_insert_cnt > 0) {
+		items.push_back (SeparatorElem());
+		items.push_back (MenuElem (_("Pin Connections..."), sigc::mem_fun (*this, &RouteUI::manage_pins)));
+	}
 
+	items.push_back (SeparatorElem());
 	items.push_back (MenuElem (_("Adjust Latency..."), sigc::mem_fun (*this, &RouteUI::adjust_latency)));
 
 	items.push_back (SeparatorElem());
@@ -1596,11 +1691,6 @@ MixerStrip::build_route_ops_menu ()
 	denormal_menu_item = dynamic_cast<Gtk::CheckMenuItem *> (&items.back());
 	denormal_menu_item->set_active (_route->denormal_protection());
 
-	if (!Profile->get_sae()) {
-		items.push_back (SeparatorElem());
-		items.push_back (MenuElem (_("Remote Control ID..."), sigc::mem_fun (*this, &RouteUI::open_remote_control_id_dialog)));
-	}
-
 	if (_route) {
 		/* note that this relies on selection being shared across editor and
 		   mixer (or global to the backend, in the future), which is the only
@@ -1618,7 +1708,7 @@ MixerStrip::build_route_ops_menu ()
 				items.push_back (SeparatorElem());
 				items.push_back (MenuElem (_("Duplicate..."), sigc::mem_fun (*this, &RouteUI::duplicate_selected_routes)));
 			}
-	
+
 			items.push_back (SeparatorElem());
 			items.push_back (MenuElem (_("Remove"), sigc::mem_fun(PublicEditor::instance(), &PublicEditor::remove_tracks)));
 		}
@@ -1632,7 +1722,7 @@ MixerStrip::name_button_button_press (GdkEventButton* ev)
 		list_route_operations ();
 
 		/* do not allow rename if the track is record-enabled */
-		rename_menu_item->set_sensitive (!_route->record_enabled());
+		rename_menu_item->set_sensitive (!is_track() || !track()->rec_enable_control()->get_value());
 		route_ops_menu->popup (1, ev->time);
 
 		return true;
@@ -1648,7 +1738,7 @@ MixerStrip::name_button_button_release (GdkEventButton* ev)
 		list_route_operations ();
 
 		/* do not allow rename if the track is record-enabled */
-		rename_menu_item->set_sensitive (!_route->record_enabled());
+		rename_menu_item->set_sensitive (!is_track() || !track()->rec_enable_control()->get_value());
 		route_ops_menu->popup (1, ev->time);
 	}
 
@@ -1662,7 +1752,7 @@ MixerStrip::number_button_button_press (GdkEventButton* ev)
 		list_route_operations ();
 
 		/* do not allow rename if the track is record-enabled */
-		rename_menu_item->set_sensitive (!_route->record_enabled());
+		rename_menu_item->set_sensitive (!is_track() || !track()->rec_enable_control()->get_value());
 		route_ops_menu->popup (1, ev->time);
 
 		return true;
@@ -1682,13 +1772,15 @@ void
 MixerStrip::set_selected (bool yn)
 {
 	AxisView::set_selected (yn);
-	if (_selected) {
+
+	if (selected()) {
 		global_frame.set_shadow_type (Gtk::SHADOW_ETCHED_OUT);
 		global_frame.set_name ("MixerStripSelectedFrame");
 	} else {
 		global_frame.set_shadow_type (Gtk::SHADOW_IN);
 		global_frame.set_name ("MixerStripFrame");
 	}
+
 	global_frame.queue_draw ();
 
 //	if (!yn)
@@ -1696,10 +1788,8 @@ MixerStrip::set_selected (bool yn)
 }
 
 void
-MixerStrip::property_changed (const PropertyChange& what_changed)
+MixerStrip::route_property_changed (const PropertyChange& what_changed)
 {
-	RouteUI::property_changed (what_changed);
-
 	if (what_changed.contains (ARDOUR::Properties::name)) {
 		name_changed ();
 	}
@@ -1749,6 +1839,12 @@ MixerStrip::name_button_resized (Gtk::Allocation& alloc)
 	name_button.set_layout_ellipsize_width (alloc.get_width() * PANGO_SCALE);
 }
 
+void
+MixerStrip::comment_button_resized (Gtk::Allocation& alloc)
+{
+	_comment_button.set_layout_ellipsize_width (alloc.get_width() * PANGO_SCALE);
+}
+
 bool
 MixerStrip::width_button_pressed (GdkEventButton* ev)
 {
@@ -1823,6 +1919,7 @@ MixerStrip::map_frozen ()
 	} else {
 		processor_box.set_sensitive (true);
 	}
+	RouteUI::map_frozen ();
 }
 
 void
@@ -2010,12 +2107,13 @@ MixerStrip::drop_send ()
 	meter_point_button.set_sensitive (true);
 	mute_button->set_sensitive (true);
 	solo_button->set_sensitive (true);
-	rec_enable_button->set_sensitive (true);
 	solo_isolated_led->set_sensitive (true);
 	solo_safe_led->set_sensitive (true);
 	monitor_input_button->set_sensitive (true);
 	monitor_disk_button->set_sensitive (true);
 	_comment_button.set_sensitive (true);
+	RouteUI::check_rec_enable_sensitivity ();
+	set_button_names (); // update solo button visual state
 }
 
 void
@@ -2106,7 +2204,7 @@ MixerStrip::set_button_names ()
 			monitor_section_button->set_text (_("Mon"));
 		}
 
-		if (_route && _route->solo_safe()) {
+		if (_route && _route->solo_safe_control()->solo_safe()) {
 			solo_button->set_visual_state (Gtkmm2ext::VisualState (solo_button->visual_state() | Gtkmm2ext::Insensitive));
 		} else {
 			solo_button->set_visual_state (Gtkmm2ext::VisualState (solo_button->visual_state() & ~Gtkmm2ext::Insensitive));
@@ -2135,7 +2233,7 @@ MixerStrip::set_button_names ()
 			monitor_section_button->set_text (S_("Mon|O"));
 		}
 
-		if (_route && _route->solo_safe()) {
+		if (_route && _route->solo_safe_control()->solo_safe()) {
 			solo_button->set_visual_state (Gtkmm2ext::VisualState (solo_button->visual_state() | Gtkmm2ext::Insensitive));
 		} else {
 			solo_button->set_visual_state (Gtkmm2ext::VisualState (solo_button->visual_state() & ~Gtkmm2ext::Insensitive));
@@ -2227,11 +2325,9 @@ MixerStrip::parameter_changed (string p)
 		   our VisibilityGroup to reflect these changes in our widgets.
 		*/
 		_visibility.set_state (UIConfiguration::instance().get_mixer_strip_visibility ());
-	}
-	else if (p == "track-name-number") {
+	} else if (p == "track-name-number") {
 		name_changed ();
-	}
-	else if (p == "use-monitor-bus") {
+	} else if (p == "use-monitor-bus") {
 		if (monitor_section_button) {
 			if (mute_button->get_parent()) {
 				mute_button->get_parent()->remove(*mute_button);
@@ -2249,6 +2345,8 @@ MixerStrip::parameter_changed (string p)
 				mute_button->show();
 			}
 		}
+	} else if (p == "track-name-number") {
+		update_track_number_visibility();
 	}
 }
 
@@ -2451,3 +2549,45 @@ MixerStrip::set_meter_type (MeterType t)
 	if (_suspend_menu_callbacks) return;
 	gpm.set_type (t);
 }
+
+void
+MixerStrip::update_track_number_visibility ()
+{
+	DisplaySuspender ds;
+	bool show_label = _session->config.get_track_name_number();
+
+	if (_route && _route->is_master()) {
+		show_label = false;
+	}
+
+	if (show_label) {
+		number_label.show ();
+		// see ArdourButton::on_size_request(), we should probably use a global size-group here instead.
+		// except the width of the number label is subtracted from the name-hbox, so we
+		// need to explictly calculate it anyway until the name-label & entry become ArdourWidgets.
+		int tnw = (2 + std::max(2u, _session->track_number_decimals())) * number_label.char_pixel_width();
+		if (tnw & 1) --tnw;
+		number_label.set_size_request(tnw, -1);
+		number_label.show ();
+	} else {
+		number_label.hide ();
+	}
+}
+
+Gdk::Color
+MixerStrip::color () const
+{
+	return route_color ();
+}
+
+bool
+MixerStrip::marked_for_display () const
+{
+	return !_route->presentation_info().hidden();
+}
+
+bool
+MixerStrip::set_marked_for_display (bool yn)
+{
+	return RouteUI::mark_hidden (!yn);
+}
diff --git a/gtk2_ardour/mixer_strip.h b/gtk2_ardour/mixer_strip.h
index f0aebf0..eb6da17 100644
--- a/gtk2_ardour/mixer_strip.h
+++ b/gtk2_ardour/mixer_strip.h
@@ -47,6 +47,8 @@
 
 #include "pbd/fastlog.h"
 
+#include "axis_view.h"
+#include "control_slave_ui.h"
 #include "ardour_knob.h"
 #include "route_ui.h"
 #include "gain_meter.h"
@@ -74,13 +76,20 @@ class MotionController;
 class RouteGroupMenu;
 class ArdourWindow;
 
-class MixerStrip : public RouteUI, public Gtk::EventBox
+class MixerStrip : public AxisView, public RouteUI, public Gtk::EventBox
 {
   public:
 	MixerStrip (Mixer_UI&, ARDOUR::Session*, boost::shared_ptr<ARDOUR::Route>, bool in_mixer = true);
 	MixerStrip (Mixer_UI&, ARDOUR::Session*, bool in_mixer = true);
 	~MixerStrip ();
 
+	std::string name()  const;
+	Gdk::Color color () const;
+	bool marked_for_display () const;
+	bool set_marked_for_display (bool);
+
+	boost::shared_ptr<ARDOUR::Stripable> stripable() const { return RouteUI::stripable(); }
+
 	void set_width_enum (Width, void* owner);
 	Width get_width_enum () const { return _width; }
 	void* width_owner () const { return _width_owner; }
@@ -131,8 +140,7 @@ class MixerStrip : public RouteUI, public Gtk::EventBox
 	void toggle_processors ();
 	void ab_plugins ();
 
-	void set_selected(bool yn);
-	bool is_selected() {return _selected;}
+	void set_selected (bool yn);
 
 	static MixerStrip* entered_mixer_strip() { return _entered_mixer_strip; }
 
@@ -189,6 +197,7 @@ class MixerStrip : public RouteUI, public Gtk::EventBox
 
 	void input_button_resized (Gtk::Allocation&);
 	void output_button_resized (Gtk::Allocation&);
+	void comment_button_resized (Gtk::Allocation&);
 
 	ArdourButton* midi_input_enable_button;
 	Gtk::HBox   input_button_box;
@@ -199,6 +208,9 @@ class MixerStrip : public RouteUI, public Gtk::EventBox
 	bool input_active_button_press (GdkEventButton*);
 	bool input_active_button_release (GdkEventButton*);
 
+	void help_count_plugins (boost::weak_ptr<ARDOUR::Processor>);
+	uint32_t _plugin_insert_cnt;
+
 	gint    mark_update_safe ();
 	guint32 mode_switch_in_progress;
 
@@ -237,13 +249,11 @@ class MixerStrip : public RouteUI, public Gtk::EventBox
 	Gtk::MenuItem* rename_menu_item;
 	void build_send_action_menu ();
 
-	void new_send ();
-	void show_send_controls ();
-
 	PBD::ScopedConnection panstate_connection;
 	PBD::ScopedConnection panstyle_connection;
 	void connect_to_pan ();
 	void update_panner_choices ();
+	void update_trim_control ();
 
 	void update_diskstream_display ();
 	void update_input_display ();
@@ -266,7 +276,7 @@ class MixerStrip : public RouteUI, public Gtk::EventBox
 	void route_color_changed ();
 	void show_passthru_color ();
 
-	void property_changed (const PBD::PropertyChange&);
+	void route_property_changed (const PBD::PropertyChange&);
 	void name_button_resized (Gtk::Allocation&);
 	void name_changed ();
 	void update_speed_display ();
@@ -321,6 +331,10 @@ class MixerStrip : public RouteUI, public Gtk::EventBox
 	PBD::ScopedConnection _level_meter_connection;
 
 	std::string meter_point_string (ARDOUR::MeterPoint);
+
+	void update_track_number_visibility ();
+
+	ControlSlaveUI control_slave_ui;
 };
 
 #endif /* __ardour_mixer_strip__ */
diff --git a/gtk2_ardour/mixer_ui.cc b/gtk2_ardour/mixer_ui.cc
index 7200cfd..4c5317a 100644
--- a/gtk2_ardour/mixer_ui.cc
+++ b/gtk2_ardour/mixer_ui.cc
@@ -25,25 +25,32 @@
 #include <map>
 #include <sigc++/bind.h>
 
+#include <boost/foreach.hpp>
+
 #include <gtkmm/accelmap.h>
 
 #include "pbd/convert.h"
+#include "pbd/stacktrace.h"
 #include "pbd/unwind.h"
 
 #include <glibmm/threads.h>
 
 #include <gtkmm2ext/gtk_ui.h>
+#include <gtkmm2ext/keyboard.h>
 #include <gtkmm2ext/utils.h>
 #include <gtkmm2ext/tearoff.h>
 #include <gtkmm2ext/window_title.h>
+#include <gtkmm2ext/doi.h>
 
 #include "ardour/amp.h"
 #include "ardour/debug.h"
+#include "ardour/audio_track.h"
 #include "ardour/midi_track.h"
 #include "ardour/plugin_manager.h"
 #include "ardour/route_group.h"
-#include "ardour/route_sorters.h"
 #include "ardour/session.h"
+#include "ardour/vca.h"
+#include "ardour/vca_manager.h"
 
 #include "keyboard.h"
 #include "mixer_ui.h"
@@ -51,6 +58,7 @@
 #include "monitor_section.h"
 #include "plugin_selector.h"
 #include "public_editor.h"
+#include "mouse_cursors.h"
 #include "ardour_ui.h"
 #include "prompter.h"
 #include "utils.h"
@@ -58,10 +66,12 @@
 #include "actions.h"
 #include "gui_thread.h"
 #include "mixer_group_tabs.h"
+#include "route_sorter.h"
 #include "timers.h"
 #include "ui_config.h"
+#include "vca_master_strip.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 using namespace ARDOUR_UI_UTILS;
@@ -87,9 +97,7 @@ Mixer_UI::instance ()
 }
 
 Mixer_UI::Mixer_UI ()
-	: Window (Gtk::WINDOW_TOPLEVEL)
-	, VisibilityTracker (*((Gtk::Window*) this))
-	, _visible (false)
+	: Tabbable (_content, _("Mixer"))
 	, no_track_list_redisplay (false)
 	, in_group_row_change (false)
 	, track_menu (0)
@@ -102,19 +110,28 @@ Mixer_UI::Mixer_UI ()
 	, _following_editor_selection (false)
 	, _maximised (false)
 	, _show_mixer_list (true)
+	, myactions (X_("mixer"))
 {
-	/* allow this window to become the key focus window */
-	set_flags (CAN_FOCUS);
+	register_actions ();
+	load_bindings ();
+	_content.set_data ("ardour-bindings", bindings);
 
-	Route::SyncOrderKeys.connect (*this, invalidator (*this), boost::bind (&Mixer_UI::sync_treeview_from_order_keys, this), gui_context());
+	PresentationInfo::Change.connect (*this, invalidator (*this), boost::bind (&Mixer_UI::sync_treeview_from_presentation_info, this), gui_context());
 
 	scroller.set_can_default (true);
-	set_default (scroller);
+	// set_default (scroller);
 
 	scroller_base.set_flags (Gtk::CAN_FOCUS);
 	scroller_base.add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK);
 	scroller_base.set_name ("MixerWindow");
 	scroller_base.signal_button_release_event().connect (sigc::mem_fun(*this, &Mixer_UI::strip_scroller_button_release));
+
+	/* set up drag-n-drop */
+	vector<TargetEntry> target_table;
+	target_table.push_back (TargetEntry ("PluginFavoritePtr"));
+	scroller_base.drag_dest_set (target_table);
+	scroller_base.signal_drag_data_received().connect (sigc::mem_fun(*this, &Mixer_UI::scroller_drag_data_received));
+
 	// add as last item of strip packer
 	strip_packer.pack_end (scroller_base, true, true);
 
@@ -131,12 +148,13 @@ Mixer_UI::Mixer_UI ()
 
 	group_model = ListStore::create (group_columns);
 	group_display.set_model (group_model);
-	group_display.append_column (_("Group"), group_columns.text);
 	group_display.append_column (_("Show"), group_columns.visible);
+	group_display.append_column (_("Group"), group_columns.text);
 	group_display.get_column (0)->set_data (X_("colnum"), GUINT_TO_POINTER(0));
 	group_display.get_column (1)->set_data (X_("colnum"), GUINT_TO_POINTER(1));
-	group_display.get_column (0)->set_expand(true);
-	group_display.get_column (1)->set_expand(false);
+	group_display.get_column (0)->set_expand(false);
+	group_display.get_column (1)->set_expand(true);
+	group_display.get_column (1)->set_sizing (Gtk::TREE_VIEW_COLUMN_FIXED);
 	group_display.set_name ("EditGroupList");
 	group_display.get_selection()->set_mode (Gtk::SELECTION_SINGLE);
 	group_display.set_reorderable (true);
@@ -146,13 +164,13 @@ Mixer_UI::Mixer_UI ()
 
 	/* name is directly editable */
 
-	CellRendererText* name_cell = dynamic_cast<CellRendererText*>(group_display.get_column_cell_renderer (0));
+	CellRendererText* name_cell = dynamic_cast<CellRendererText*>(group_display.get_column_cell_renderer (1));
 	name_cell->property_editable() = true;
 	name_cell->signal_edited().connect (sigc::mem_fun (*this, &Mixer_UI::route_group_name_edit));
 
 	/* use checkbox for the active column */
 
-	CellRendererToggle* active_cell = dynamic_cast<CellRendererToggle*>(group_display.get_column_cell_renderer (1));
+	CellRendererToggle* active_cell = dynamic_cast<CellRendererToggle*>(group_display.get_column_cell_renderer (0));
 	active_cell->property_activatable() = true;
 	active_cell->property_radio() = false;
 
@@ -194,6 +212,10 @@ Mixer_UI::Mixer_UI ()
 	group_display_frame.set_shadow_type (Gtk::SHADOW_IN);
 	group_display_frame.add (group_display_vbox);
 
+
+	list<TargetEntry> target_list;
+	target_list.push_back (TargetEntry ("PluginPresetPtr"));
+
 	favorite_plugins_model = PluginTreeStore::create (favorite_plugins_columns);
 	favorite_plugins_display.set_model (favorite_plugins_model);
 	favorite_plugins_display.append_column (_("Favorite Plugins"), favorite_plugins_columns.name);
@@ -203,8 +225,10 @@ Mixer_UI::Mixer_UI ()
 	favorite_plugins_display.set_headers_visible (true);
 	favorite_plugins_display.set_rules_hint (true);
 	favorite_plugins_display.set_can_focus (false);
-	favorite_plugins_display.add_object_drag (favorite_plugins_columns.plugin.index(), "PluginPresetPtr");
+	favorite_plugins_display.set_tooltip_column (0);
+	favorite_plugins_display.add_object_drag (favorite_plugins_columns.plugin.index(), "PluginFavoritePtr");
 	favorite_plugins_display.set_drag_column (favorite_plugins_columns.name.index());
+	favorite_plugins_display.add_drop_targets (target_list);
 	favorite_plugins_display.signal_row_activated().connect (sigc::mem_fun (*this, &Mixer_UI::plugin_row_activated));
 	favorite_plugins_display.signal_button_press_event().connect (sigc::mem_fun (*this, &Mixer_UI::plugin_row_button_press), false);
 	favorite_plugins_display.signal_drop.connect (sigc::mem_fun (*this, &Mixer_UI::plugin_drop));
@@ -219,46 +243,95 @@ Mixer_UI::Mixer_UI ()
 	favorite_plugins_frame.set_shadow_type (Gtk::SHADOW_IN);
 	favorite_plugins_frame.add (favorite_plugins_scroller);
 
-	rhs_pane1.pack1 (favorite_plugins_frame, false, true);
-	rhs_pane1.pack2 (track_display_frame);
-	rhs_pane2.pack1 (rhs_pane1);
-	rhs_pane2.pack2 (group_display_frame);
+	rhs_pane1.add (favorite_plugins_frame);
+	rhs_pane1.add (track_display_frame);
+
+	rhs_pane2.add (rhs_pane1);
+	rhs_pane2.add (group_display_frame);
 
 	list_vpacker.pack_start (rhs_pane2, true, true);
 
-	global_hpacker.pack_start (scroller, true, true);
-	global_hpacker.pack_start (out_packer, false, false, 0);
+	string vca_text = _("Control Masters");
+	Gtk::HBox* vca_top_padding = manage (new Gtk::HBox);
+	vca_top_padding->set_size_request (-1, 2);
+	vca_vpacker.pack_start (*vca_top_padding, false, false);
 
-	list_hpane.pack1(list_vpacker, false, true);
-	list_hpane.pack2(global_hpacker, true, false);
+	vca_label.set_text (vca_text);
+	vca_label_bar.set_size_request (-1, 16); /* must match height in GroupTabs::set_size_request() */
 
-	rhs_pane1.signal_size_allocate().connect (sigc::bind (sigc::mem_fun(*this, &Mixer_UI::pane_allocation_handler),
-							static_cast<Gtk::Paned*> (&rhs_pane1)));
-	rhs_pane2.signal_size_allocate().connect (sigc::bind (sigc::mem_fun(*this, &Mixer_UI::pane_allocation_handler),
-							static_cast<Gtk::Paned*> (&rhs_pane2)));
-	list_hpane.signal_size_allocate().connect (sigc::bind (sigc::mem_fun(*this, &Mixer_UI::pane_allocation_handler),
-							 static_cast<Gtk::Paned*> (&list_hpane)));
+	vca_label_bar.set_name (X_("VCALabelBar"));
+	vca_label_bar.add (vca_label);
 
-	global_vpacker.pack_start (list_hpane, true, true);
+	vca_vpacker.pack_start (vca_label_bar, false, false);
 
-	add (global_vpacker);
-	set_name ("MixerWindow");
+	vca_scroller_base.add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK);
+	vca_scroller_base.set_name (X_("MixerWindow"));
+	vca_scroller_base.signal_button_release_event().connect (sigc::mem_fun(*this, &Mixer_UI::masters_scroller_button_release), false);
+	vca_hpacker.pack_end (vca_scroller_base, true, true);
 
-	update_title ();
+	vca_scroller.add (vca_hpacker);
+	vca_scroller.set_policy (Gtk::POLICY_ALWAYS, Gtk::POLICY_AUTOMATIC);
+	vca_scroller.signal_button_release_event().connect (sigc::mem_fun(*this, &Mixer_UI::strip_scroller_button_release));
+
+	vca_vpacker.pack_start (vca_scroller, true, true);
+
+	inner_pane.add (scroller);
+	inner_pane.add (vca_vpacker);
+
+	global_hpacker.pack_start (inner_pane, true, true);
+	global_hpacker.pack_start (out_packer, false, false);
+
+	list_hpane.set_check_divider_position (true);
+	list_hpane.add (list_vpacker);
+	list_hpane.add (global_hpacker);
+
+
+	XMLNode const * settings = ARDOUR_UI::instance()->mixer_settings();
+	XMLProperty const * prop;
+	float fract;
 
-	set_wmclass (X_("ardour_mixer"), PROGRAM_NAME);
+	{
+		LocaleGuard lg;
+
+		if (!settings || ((prop = settings->property ("mixer-rhs-pane1-pos")) == 0) || ((fract = atof (prop->value())) > 1.0)) {
+			rhs_pane1.set_divider (0, 0.6f);
+		} else {
+			rhs_pane1.set_divider (0, fract);
+		}
+		if (!settings || ((prop = settings->property ("mixer-rhs-pane2-pos")) == 0) || ((fract = atof (prop->value())) > 1.0)) {
+			rhs_pane2.set_divider (0, 0.7f);
+		} else {
+			rhs_pane2.set_divider (0, fract);
+		}
+		if (!settings || ((prop = settings->property ("mixer-list-hpane-pos")) == 0) || ((fract = atof (prop->value())) > 1.0)) {
+			list_hpane.set_divider (0, 0.2f);
+		} else {
+			list_hpane.set_divider (0, fract);
+		}
+		if (!settings || ((prop = settings->property ("mixer-inner-pane-pos")) == 0)  || ((fract = atof (prop->value())) > 1.0)) {
+			inner_pane.set_divider (0, 0.8f);
+		} else {
+			inner_pane.set_divider (0, atof (prop->value()));
+		}
+	}
+
+	rhs_pane1.set_drag_cursor (*PublicEditor::instance().cursors()->expand_up_down);
+	rhs_pane2.set_drag_cursor (*PublicEditor::instance().cursors()->expand_up_down);
+	list_hpane.set_drag_cursor (*PublicEditor::instance().cursors()->expand_left_right);
+	inner_pane.set_drag_cursor (*PublicEditor::instance().cursors()->expand_left_right);
 
-	signal_delete_event().connect (sigc::mem_fun (*this, &Mixer_UI::hide_window));
-	add_events (Gdk::KEY_PRESS_MASK|Gdk::KEY_RELEASE_MASK);
+	_content.pack_start (list_hpane, true, true);
 
-	signal_configure_event().connect (sigc::mem_fun (*ARDOUR_UI::instance(), &ARDOUR_UI::configure_handler));
+	update_title ();
 
 	route_group_display_button_box->show();
 	route_group_add_button->show();
 	route_group_remove_button->show();
 
+	_content.show ();
+	_content.set_name ("MixerWindow");
+
 	global_hpacker.show();
-	global_vpacker.show();
 	scroller.show();
 	scroller_base.show();
 	scroller_hpacker.show();
@@ -274,6 +347,14 @@ Mixer_UI::Mixer_UI ()
 	rhs_pane1.show();
 	rhs_pane2.show();
 	strip_packer.show();
+	inner_pane.show();
+	vca_top_padding->show ();
+	vca_scroller.show();
+	vca_vpacker.show();
+	vca_hpacker.show();
+	vca_label_bar.show();
+	vca_label.show();
+	vca_scroller_base.show();
 	out_packer.show();
 	list_hpane.show();
 	group_display.show();
@@ -281,6 +362,10 @@ Mixer_UI::Mixer_UI ()
 
 	MixerStrip::CatchDeletion.connect (*this, invalidator (*this), boost::bind (&Mixer_UI::remove_strip, this, _1), gui_context());
 
+	/* handle escape */
+
+	ARDOUR_UI::instance()->Escape.connect (*this, invalidator (*this), boost::bind (&Mixer_UI::escape, this), gui_context());
+
 #ifndef DEFER_PLUGIN_SELECTOR_LOAD
 	_plugin_selector = new PluginSelector (PluginManager::instance ());
 #else
@@ -301,151 +386,253 @@ Mixer_UI::~Mixer_UI ()
 }
 
 void
+Mixer_UI::escape ()
+{
+	select_none ();
+}
+
+void
 Mixer_UI::track_editor_selection ()
 {
 	PublicEditor::instance().get_selection().TracksChanged.connect (sigc::mem_fun (*this, &Mixer_UI::follow_editor_selection));
 }
 
-
-void
-Mixer_UI::ensure_float (Window& win)
+Gtk::Window*
+Mixer_UI::use_own_window (bool and_fill_it)
 {
-	win.set_transient_for (*this);
+	bool new_window = !own_window();
+
+	Gtk::Window* win = Tabbable::use_own_window (and_fill_it);
+
+
+	if (win && new_window) {
+		win->set_name ("MixerWindow");
+		ARDOUR_UI::instance()->setup_toplevel_window (*win, _("Mixer"), this);
+		win->signal_scroll_event().connect (sigc::mem_fun (*this, &Mixer_UI::on_scroll_event), false);
+		win->signal_event().connect (sigc::bind (sigc::ptr_fun (&Keyboard::catch_user_event_for_pre_dialog_focus), win));
+		win->set_data ("ardour-bindings", bindings);
+		update_title ();
+	}
+
+	return win;
 }
 
 void
 Mixer_UI::show_window ()
 {
-	present ();
-	if (!_visible) {
-		set_window_pos_and_size ();
+	Tabbable::show_window ();
 
-		/* show/hide group tabs as required */
-		parameter_changed ("show-group-tabs");
+	/* show/hide group tabs as required */
+	parameter_changed ("show-group-tabs");
 
-		/* now reset each strips width so the right widgets are shown */
-		MixerStrip* ms;
+	/* now reset each strips width so the right widgets are shown */
 
-		TreeModel::Children rows = track_model->children();
-		TreeModel::Children::iterator ri;
+	TreeModel::Children rows = track_model->children();
+	TreeModel::Children::iterator ri;
 
-		for (ri = rows.begin(); ri != rows.end(); ++ri) {
-			ms = (*ri)[track_columns.strip];
-			ms->set_width_enum (ms->get_width_enum (), ms->width_owner());
-			/* Fix visibility of mixer strip stuff */
-			ms->parameter_changed (X_("mixer-element-visibility"));
+	for (ri = rows.begin(); ri != rows.end(); ++ri) {
+		AxisView* av = (*ri)[stripable_columns.strip];
+		MixerStrip* ms = dynamic_cast<MixerStrip*> (av);
+		if (!ms) {
+			continue;
 		}
+		ms->set_width_enum (ms->get_width_enum (), ms->width_owner());
+		/* Fix visibility of mixer strip stuff */
+		ms->parameter_changed (X_("mixer-element-visibility"));
 	}
 
 	/* force focus into main area */
 	scroller_base.grab_focus ();
+}
 
-	_visible = true;
+void
+Mixer_UI::remove_master (VCAMasterStrip* vms)
+{
+	if (_session && _session->deletion_in_progress()) {
+		/* its all being taken care of */
+		return;
+	}
+
+	TreeModel::Children rows = track_model->children();
+	TreeModel::Children::iterator ri;
+
+	for (ri = rows.begin(); ri != rows.end(); ++ri) {
+		if ((*ri)[stripable_columns.strip] == vms) {
+                        PBD::Unwinder<bool> uw (_route_deletion_in_progress, true);
+			track_model->erase (ri);
+			break;
+		}
+	}
 }
 
 bool
-Mixer_UI::hide_window (GdkEventAny *ev)
+Mixer_UI::masters_scroller_button_release (GdkEventButton* ev)
 {
-	get_window_pos_and_size ();
+	using namespace Menu_Helpers;
+
+	if (Keyboard::is_context_menu_event (ev)) {
+		ARDOUR_UI::instance()->add_route ();
+		return true;
+	}
+
+	return false;
+}
 
-	_visible = false;
-	return just_hide_it(ev, static_cast<Gtk::Window *>(this));
+void
+Mixer_UI::add_masters (VCAList& vlist)
+{
+	StripableList sl;
+
+	for (VCAList::iterator v = vlist.begin(); v != vlist.end(); ++v) {
+		sl.push_back (boost::dynamic_pointer_cast<Stripable> (*v));
+	}
+
+	add_stripables (sl);
 }
 
+void
+Mixer_UI::add_routes (RouteList& rlist)
+{
+	StripableList sl;
+
+	for (RouteList::iterator r = rlist.begin(); r != rlist.end(); ++r) {
+		sl.push_back (*r);
+	}
+
+	add_stripables (sl);
+}
 
 void
-Mixer_UI::add_strips (RouteList& routes)
+Mixer_UI::add_stripables (StripableList& slist)
 {
-	bool from_scratch = track_model->children().size() == 0;
 	Gtk::TreeModel::Children::iterator insert_iter = track_model->children().end();
+	bool from_scratch = (track_model->children().size() == 0);
+	uint32_t nroutes = 0;
+
+	slist.sort (StripablePresentationInfoSorter());
 
 	for (Gtk::TreeModel::Children::iterator it = track_model->children().begin(); it != track_model->children().end(); ++it) {
-		boost::shared_ptr<Route> r = (*it)[track_columns.route];
+		boost::shared_ptr<Stripable> s = (*it)[stripable_columns.stripable];
+
+		if (!s) {
+			continue;
+		}
+
+		nroutes++;
 
-		if (r->order_key() == (routes.front()->order_key() + routes.size())) {
+		if (s->presentation_info().order() == (slist.front()->presentation_info().order() + slist.size())) {
 			insert_iter = it;
 			break;
 		}
 	}
 
-	if(!from_scratch) {
-		_selection.clear_routes ();
-	}
-
 	MixerStrip* strip;
 
+
 	try {
-		no_track_list_redisplay = true;
+		PBD::Unwinder<bool> uw (no_track_list_redisplay, true);
+
 		track_display.set_model (Glib::RefPtr<ListStore>());
 
-		for (RouteList::iterator x = routes.begin(); x != routes.end(); ++x) {
-			boost::shared_ptr<Route> route = (*x);
+		for (StripableList::iterator s = slist.begin(); s != slist.end(); ++s) {
 
-			if (route->is_auditioner()) {
-				continue;
-			}
+			boost::shared_ptr<Route> route;
+			boost::shared_ptr<VCA> vca;
 
-			if (route->is_monitor()) {
+			if ((vca  = boost::dynamic_pointer_cast<VCA> (*s))) {
 
-				if (!_monitor_section) {
-					_monitor_section = new MonitorSection (_session);
+				VCAMasterStrip* vms = new VCAMasterStrip (_session, vca);
 
-					XMLNode* mnode = ARDOUR_UI::instance()->tearoff_settings (X_("monitor-section"));
-					if (mnode) {
-						_monitor_section->tearoff().set_state (*mnode);
-					}
+				TreeModel::Row row = *(track_model->append());
+
+				row[stripable_columns.text] = vca->name();
+				row[stripable_columns.visible] = vms->marked_for_display ();
+				row[stripable_columns.strip] = vms;
+				row[stripable_columns.stripable] = vca;
+
+				vms->CatchDeletion.connect (*this, invalidator (*this), boost::bind (&Mixer_UI::remove_master, this, _1), gui_context());
+
+			} else if ((route = boost::dynamic_pointer_cast<Route> (*s))) {
+
+				if (route->is_auditioner()) {
+					continue;
 				}
 
-				out_packer.pack_end (_monitor_section->tearoff(), false, false);
-				_monitor_section->set_session (_session);
-				_monitor_section->tearoff().show_all ();
+				if (route->is_monitor()) {
 
-				_monitor_section->tearoff().Detach.connect (sigc::mem_fun(*this, &Mixer_UI::monitor_section_detached));
-				_monitor_section->tearoff().Attach.connect (sigc::mem_fun(*this, &Mixer_UI::monitor_section_attached));
+					if (!_monitor_section) {
+						_monitor_section = new MonitorSection (_session);
 
-				monitor_section_attached ();
+						XMLNode* mnode = ARDOUR_UI::instance()->tearoff_settings (X_("monitor-section"));
+						if (mnode) {
+							_monitor_section->tearoff().set_state (*mnode);
+						}
+					}
 
-				route->DropReferences.connect (*this, invalidator(*this), boost::bind (&Mixer_UI::monitor_section_going_away, this), gui_context());
+					out_packer.pack_end (_monitor_section->tearoff(), false, false);
+					_monitor_section->set_session (_session);
+					_monitor_section->tearoff().show_all ();
 
-				/* no regular strip shown for control out */
+					_monitor_section->tearoff().Detach.connect (sigc::mem_fun(*this, &Mixer_UI::monitor_section_detached));
+					_monitor_section->tearoff().Attach.connect (sigc::mem_fun(*this, &Mixer_UI::monitor_section_attached));
 
-				continue;
-			}
+					monitor_section_attached ();
 
-			strip = new MixerStrip (*this, _session, route);
-			strips.push_back (strip);
+					route->DropReferences.connect (*this, invalidator(*this), boost::bind (&Mixer_UI::monitor_section_going_away, this), gui_context());
 
-			UIConfiguration::instance().get_default_narrow_ms() ? _strip_width = Narrow : _strip_width = Wide;
+					/* no regular strip shown for control out */
 
-			if (strip->width_owner() != strip) {
-				strip->set_width_enum (_strip_width, this);
-			}
+					continue;
+				}
 
-			show_strip (strip);
+				strip = new MixerStrip (*this, _session, route);
+				strips.push_back (strip);
 
-			TreeModel::Row row = *(track_model->insert(insert_iter));
-			row[track_columns.text] = route->name();
-			row[track_columns.visible] = strip->route()->is_master() ? true : strip->marked_for_display();
-			row[track_columns.route] = route;
-			row[track_columns.strip] = strip;
+				UIConfiguration::instance().get_default_narrow_ms() ? _strip_width = Narrow : _strip_width = Wide;
 
-			if (!from_scratch) {
-				_selection.add (strip);
-			}
+				if (strip->width_owner() != strip) {
+					strip->set_width_enum (_strip_width, this);
+				}
 
-			route->PropertyChanged.connect (*this, invalidator (*this), boost::bind (&Mixer_UI::strip_property_changed, this, _1, strip), gui_context());
+				show_strip (strip);
 
-			strip->WidthChanged.connect (sigc::mem_fun(*this, &Mixer_UI::strip_width_changed));
-			strip->signal_button_release_event().connect (sigc::bind (sigc::mem_fun(*this, &Mixer_UI::strip_button_release_event), strip));
-		}
+				if (!route->is_master()) {
+
+					TreeModel::Row row = *(track_model->insert (insert_iter));
+
+					row[stripable_columns.text] = route->name();
+					row[stripable_columns.visible] = strip->marked_for_display();
+					row[stripable_columns.stripable] = route;
+					row[stripable_columns.strip] = strip;
+
+					if (nroutes != 0) {
+						_selection.add (strip);
+					}
+
+				} else {
+
+					out_packer.pack_start (*strip, false, false);
+					strip->set_packed (true);
+				}
+
+				strip->WidthChanged.connect (sigc::mem_fun(*this, &Mixer_UI::strip_width_changed));
+				strip->signal_button_release_event().connect (sigc::bind (sigc::mem_fun(*this, &Mixer_UI::strip_button_release_event), strip));
+			}
 
-	} catch (...) {
+			(*s)->presentation_info().PropertyChanged.connect (*this, invalidator(*this), boost::bind (&Mixer_UI::stripable_property_changed, this, _1, boost::weak_ptr<Stripable>(*s)), gui_context());
+			(*s)->PropertyChanged.connect (*this, invalidator(*this), boost::bind (&Mixer_UI::stripable_property_changed, this, _1, boost::weak_ptr<Stripable>(*s)), gui_context());
+						}
+
+	} catch (const std::exception& e) {
+		error << string_compose (_("Error adding GUI elements for new tracks/busses %1"), e.what()) << endmsg;
 	}
 
-	no_track_list_redisplay = false;
 	track_display.set_model (track_model);
 
-	sync_order_keys_from_treeview ();
+	if (!from_scratch) {
+		sync_presentation_info_from_treeview ();
+	}
+
 	redisplay_track_list ();
 }
 
@@ -458,6 +645,16 @@ Mixer_UI::deselect_all_strip_processors ()
 }
 
 void
+Mixer_UI::select_strip (MixerStrip& ms, bool add)
+{
+	if (add) {
+		_selection.add (&ms);
+	} else {
+		_selection.set (&ms);
+	}
+}
+
+void
 Mixer_UI::select_none ()
 {
 	_selection.clear_routes();
@@ -490,7 +687,7 @@ Mixer_UI::remove_strip (MixerStrip* strip)
 	}
 
 	for (ri = rows.begin(); ri != rows.end(); ++ri) {
-		if ((*ri)[track_columns.strip] == strip) {
+		if ((*ri)[stripable_columns.strip] == strip) {
                         PBD::Unwinder<bool> uw (_route_deletion_in_progress, true);
 			track_model->erase (ri);
 			break;
@@ -499,63 +696,7 @@ Mixer_UI::remove_strip (MixerStrip* strip)
 }
 
 void
-Mixer_UI::reset_remote_control_ids ()
-{
-	if (Config->get_remote_model() == UserOrdered || !_session || _session->deletion_in_progress()) {
-		return;
-	}
-
-	TreeModel::Children rows = track_model->children();
-
-	if (rows.empty()) {
-		return;
-	}
-
-	DEBUG_TRACE (DEBUG::OrderKeys, "mixer resets remote control ids after remote model change\n");
-
-	TreeModel::Children::iterator ri;
-	bool rid_change = false;
-	uint32_t rid = 1;
-	uint32_t invisible_key = UINT32_MAX;
-
-	for (ri = rows.begin(); ri != rows.end(); ++ri) {
-
-		/* skip two special values */
-
-		if (rid == Route::MasterBusRemoteControlID) {
-			rid++;
-		}
-
-		if (rid == Route::MonitorBusRemoteControlID) {
-			rid++;
-		}
-
-		boost::shared_ptr<Route> route = (*ri)[track_columns.route];
-		bool visible = (*ri)[track_columns.visible];
-
-		if (!route->is_master() && !route->is_monitor()) {
-
-			uint32_t new_rid = (visible ? rid : invisible_key--);
-
-			if (new_rid != route->remote_control_id()) {
-				route->set_remote_control_id_explicit (new_rid);
-				rid_change = true;
-			}
-
-			if (visible) {
-				rid++;
-			}
-		}
-	}
-
-	if (rid_change) {
-		/* tell the world that we changed the remote control IDs */
-		_session->notify_remote_id_change ();
-	}
-}
-
-void
-Mixer_UI::sync_order_keys_from_treeview ()
+Mixer_UI::sync_presentation_info_from_treeview ()
 {
 	if (ignore_reorder || !_session || _session->deletion_in_progress()) {
 		return;
@@ -567,63 +708,56 @@ Mixer_UI::sync_order_keys_from_treeview ()
 		return;
 	}
 
-	DEBUG_TRACE (DEBUG::OrderKeys, "mixer sync order keys from model\n");
+	DEBUG_TRACE (DEBUG::OrderKeys, "mixer sync presentation info from treeview\n");
 
 	TreeModel::Children::iterator ri;
-	bool changed = false;
-	bool rid_change = false;
+	bool change = false;
 	uint32_t order = 0;
-	uint32_t rid = 1;
-	uint32_t invisible_key = UINT32_MAX;
 
 	for (ri = rows.begin(); ri != rows.end(); ++ri) {
-		boost::shared_ptr<Route> route = (*ri)[track_columns.route];
-		bool visible = (*ri)[track_columns.visible];
-
-		uint32_t old_key = route->order_key ();
+		bool visible = (*ri)[stripable_columns.visible];
+		boost::shared_ptr<Stripable> stripable = (*ri)[stripable_columns.stripable];
 
-		if (order != old_key) {
-			route->set_order_key (order);
-			changed = true;
+		if (!stripable) {
+			continue;
 		}
 
-		if ((Config->get_remote_model() == MixerOrdered) && !route->is_master() && !route->is_monitor()) {
+		/* Monitor and Auditioner do not get their presentation
+		 * info reset here.
+		 */
 
-			uint32_t new_rid = (visible ? rid : invisible_key--);
+		if (stripable->is_monitor() || stripable->is_auditioner()) {
+			continue;
+		}
 
-			if (new_rid != route->remote_control_id()) {
-				route->set_remote_control_id_explicit (new_rid);
-				rid_change = true;
-			}
+		/* Master also doesn't get set here but since the editor allows
+		 * it to be reordered, we need to preserve its ordering.
+		 */
 
-			if (visible) {
-				rid++;
-			}
+		stripable->presentation_info().set_hidden (!visible);
 
+		if (order != stripable->presentation_info().order()) {
+			stripable->set_presentation_order (order, false);
+			change = true;
 		}
 
 		++order;
 	}
 
-	if (changed) {
-		/* tell everyone that we changed the mixer sort keys */
-		_session->sync_order_keys ();
-	}
-
-	if (rid_change) {
-		/* tell the world that we changed the remote control IDs */
-		_session->notify_remote_id_change ();
+	if (change) {
+		DEBUG_TRACE (DEBUG::OrderKeys, "... notify PI change from mixer GUI\n");
+		_session->notify_presentation_info_change ();
 	}
 }
 
 void
-Mixer_UI::sync_treeview_from_order_keys ()
+Mixer_UI::sync_treeview_from_presentation_info ()
 {
 	if (!_session || _session->deletion_in_progress()) {
 		return;
 	}
 
-	DEBUG_TRACE (DEBUG::OrderKeys, "mixer sync model from order keys.\n");
+	DEBUG_TRACE (DEBUG::OrderKeys, "mixer sync model from presentation info.\n");
 
 	/* we could get here after either a change in the Mixer or Editor sort
 	 * order, but either way, the mixer order keys reflect the intended
@@ -639,30 +773,27 @@ Mixer_UI::sync_treeview_from_order_keys ()
 		return;
 	}
 
-	OrderKeySortedRoutes sorted_routes;
+	OrderingKeys sorted;
 
 	for (TreeModel::Children::iterator ri = rows.begin(); ri != rows.end(); ++ri, ++old_order) {
-		boost::shared_ptr<Route> route = (*ri)[track_columns.route];
-		sorted_routes.push_back (RoutePlusOrderKey (route, old_order, route->order_key ()));
+		boost::shared_ptr<Stripable> stripable = (*ri)[stripable_columns.stripable];
+		sorted.push_back (OrderKeys (old_order, stripable->presentation_info().order()));
 	}
 
 	SortByNewDisplayOrder cmp;
 
-	sort (sorted_routes.begin(), sorted_routes.end(), cmp);
-	neworder.assign (sorted_routes.size(), 0);
+	sort (sorted.begin(), sorted.end(), cmp);
+	neworder.assign (sorted.size(), 0);
 
 	uint32_t n = 0;
 
-	for (OrderKeySortedRoutes::iterator sr = sorted_routes.begin(); sr != sorted_routes.end(); ++sr, ++n) {
+	for (OrderingKeys::iterator sr = sorted.begin(); sr != sorted.end(); ++sr, ++n) {
 
 		neworder[n] = sr->old_display_order;
 
 		if (sr->old_display_order != n) {
 			changed = true;
 		}
-
-		DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("MIXER change order for %1 from %2 to %3\n",
-							       sr->route->name(), sr->old_display_order, n));
 	}
 
 	if (changed) {
@@ -688,11 +819,11 @@ Mixer_UI::follow_editor_selection ()
 	_selection.clear_routes ();
 
 	for (TrackViewList::iterator i = s.begin(); i != s.end(); ++i) {
-		RouteTimeAxisView* rtav = dynamic_cast<RouteTimeAxisView*> (*i);
-		if (rtav) {
-			MixerStrip* ms = strip_by_route (rtav->route());
-			if (ms) {
-				_selection.add (ms);
+		TimeAxisView* tav = dynamic_cast<TimeAxisView*> (*i);
+		if (tav) {
+			AxisView* axis = axis_by_stripable (tav->stripable());
+			if (axis) {
+				_selection.add (axis);
 			}
 		}
 	}
@@ -703,9 +834,9 @@ Mixer_UI::follow_editor_selection ()
 
 
 MixerStrip*
-Mixer_UI::strip_by_route (boost::shared_ptr<Route> r)
+Mixer_UI::strip_by_route (boost::shared_ptr<Route> r) const
 {
-	for (list<MixerStrip *>::iterator i = strips.begin(); i != strips.end(); ++i) {
+	for (list<MixerStrip *>::const_iterator i = strips.begin(); i != strips.end(); ++i) {
 		if ((*i)->route() == r) {
 			return (*i);
 		}
@@ -714,6 +845,18 @@ Mixer_UI::strip_by_route (boost::shared_ptr<Route> r)
 	return 0;
 }
 
+AxisView*
+Mixer_UI::axis_by_stripable (boost::shared_ptr<Stripable> s) const
+{
+	for (list<MixerStrip *>::const_iterator i = strips.begin(); i != strips.end(); ++i) {
+		if ((*i)->stripable() == s) {
+			return (*i);
+		}
+	}
+
+	return 0;
+}
+
 bool
 Mixer_UI::strip_button_release_event (GdkEventButton *ev, MixerStrip *strip)
 {
@@ -722,7 +865,7 @@ Mixer_UI::strip_button_release_event (GdkEventButton *ev, MixerStrip *strip)
 			/* primary-click: toggle selection state of strip */
 			if (Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier)) {
 				_selection.remove (strip);
-			} else if (_selection.routes.size() > 1) {
+			} else if (_selection.axes.size() > 1) {
 				/* de-select others */
 				_selection.set (strip);
 			}
@@ -731,53 +874,49 @@ Mixer_UI::strip_button_release_event (GdkEventButton *ev, MixerStrip *strip)
 				_selection.add (strip);
 			} else if (Keyboard::modifier_state_equals (ev->state, Keyboard::RangeSelectModifier)) {
 
-				if (!_selection.selected(strip)) {
-
-					/* extend selection */
-
-					vector<MixerStrip*> tmp;
-					bool accumulate = false;
-					bool found_another = false;
-
-					tmp.push_back (strip);
-
-					for (list<MixerStrip*>::iterator i = strips.begin(); i != strips.end(); ++i) {
-						if ((*i) == strip) {
-							/* hit clicked strip, start accumulating till we hit the first
-							   selected strip
-							*/
-							if (accumulate) {
-								/* done */
-								break;
-							} else {
-								accumulate = true;
-							}
-						} else if (_selection.selected (*i)) {
-							/* hit selected strip. if currently accumulating others,
-							   we're done. if not accumulating others, start doing so.
-							*/
-							found_another = true;
-							if (accumulate) {
-								/* done */
-								break;
-							} else {
-								accumulate = true;
-							}
+				/* extend selection */
+
+				vector<MixerStrip*> tmp;
+				bool accumulate = false;
+				bool found_another = false;
+
+				tmp.push_back (strip);
+
+				for (list<MixerStrip*>::iterator i = strips.begin(); i != strips.end(); ++i) {
+					if ((*i) == strip) {
+						/* hit clicked strip, start accumulating till we hit the first
+						   selected strip
+						*/
+						if (accumulate) {
+							/* done */
+							break;
 						} else {
-							if (accumulate) {
-								tmp.push_back (*i);
-							}
+							accumulate = true;
 						}
-					}
-
-					if (found_another) {
-						for (vector<MixerStrip*>::iterator i = tmp.begin(); i != tmp.end(); ++i) {
-							_selection.add (*i);
+					} else if (_selection.selected (*i)) {
+						/* hit selected strip. if currently accumulating others,
+						   we're done. if not accumulating others, start doing so.
+						*/
+						found_another = true;
+						if (accumulate) {
+							/* done */
+							break;
+						} else {
+							accumulate = true;
 						}
-					} else
-						_selection.set (strip);  //user wants to start a range selection, but there aren't any others selected yet
+					} else {
+						if (accumulate) {
+							tmp.push_back (*i);
+						}
+					}
 				}
 
+				if (found_another) {
+					for (vector<MixerStrip*>::iterator i = tmp.begin(); i != tmp.end(); ++i) {
+						_selection.add (*i);
+					}
+				} else
+					_selection.set (strip);  //user wants to start a range selection, but there aren't any others selected yet
 			} else {
 				_selection.set (strip);
 			}
@@ -805,13 +944,13 @@ Mixer_UI::set_session (Session* sess)
 	refill_favorite_plugins();
 
 	XMLNode* node = ARDOUR_UI::instance()->mixer_settings();
-	set_state (*node);
+	set_state (*node, 0);
 
 	update_title ();
 
 	initial_track_display ();
 
-	_session->RouteAdded.connect (_session_connections, invalidator (*this), boost::bind (&Mixer_UI::add_strips, this, _1), gui_context());
+	_session->RouteAdded.connect (_session_connections, invalidator (*this), boost::bind (&Mixer_UI::add_routes, this, _1), gui_context());
 	_session->route_group_added.connect (_session_connections, invalidator (*this), boost::bind (&Mixer_UI::add_route_group, this, _1), gui_context());
 	_session->route_group_removed.connect (_session_connections, invalidator (*this), boost::bind (&Mixer_UI::route_groups_changed, this), gui_context());
 	_session->route_groups_reordered.connect (_session_connections, invalidator (*this), boost::bind (&Mixer_UI::route_groups_changed, this), gui_context());
@@ -819,6 +958,8 @@ Mixer_UI::set_session (Session* sess)
 	_session->DirtyChanged.connect (_session_connections, invalidator (*this), boost::bind (&Mixer_UI::update_title, this), gui_context());
 	_session->StateSaved.connect (_session_connections, invalidator (*this), boost::bind (&Mixer_UI::update_title, this), gui_context());
 
+	_session->vca_manager().VCAAdded.connect (_session_connections, invalidator (*this), boost::bind (&Mixer_UI::add_masters, this, _1), gui_context());
+
 	Config->ParameterChanged.connect (*this, invalidator (*this), boost::bind (&Mixer_UI::parameter_changed, this, _1), gui_context ());
 
 	route_groups_changed ();
@@ -871,13 +1012,12 @@ Mixer_UI::track_visibility_changed (std::string const & path)
 	TreeIter iter;
 
 	if ((iter = track_model->get_iter (path))) {
-		MixerStrip* strip = (*iter)[track_columns.strip];
-		if (strip) {
-			bool visible = (*iter)[track_columns.visible];
 
-			if (strip->set_marked_for_display (!visible)) {
-				update_track_visibility ();
-			}
+		AxisView* av = (*iter)[stripable_columns.strip];
+		bool visible = (*iter)[stripable_columns.visible];
+
+		if (av->set_marked_for_display (!visible)) {
+			update_track_visibility ();
 		}
 	}
 }
@@ -892,14 +1032,14 @@ Mixer_UI::update_track_visibility ()
 		Unwinder<bool> uw (no_track_list_redisplay, true);
 
 		for (i = rows.begin(); i != rows.end(); ++i) {
-			MixerStrip *strip = (*i)[track_columns.strip];
-			(*i)[track_columns.visible] = strip->marked_for_display ();
+			AxisView* av = (*i)[stripable_columns.strip];
+			(*i)[stripable_columns.visible] = av->marked_for_display ();
 		}
 
-		/* force route order keys catch up with visibility changes
+		/* force presentation catch up with visibility changes
 		 */
 
-		sync_order_keys_from_treeview ();
+		sync_presentation_info_from_treeview ();
 	}
 
 	redisplay_track_list ();
@@ -913,10 +1053,12 @@ Mixer_UI::show_strip (MixerStrip* ms)
 
 	for (i = rows.begin(); i != rows.end(); ++i) {
 
-		MixerStrip* strip = (*i)[track_columns.strip];
+		AxisView* av = (*i)[stripable_columns.strip];
+		MixerStrip* strip = dynamic_cast<MixerStrip*> (av);
 		if (strip == ms) {
-			(*i)[track_columns.visible] = true;
-			redisplay_track_list ();
+			(*i)[stripable_columns.visible] = true;
+			av->set_marked_for_display (true);
+			update_track_visibility ();
 			break;
 		}
 	}
@@ -930,10 +1072,12 @@ Mixer_UI::hide_strip (MixerStrip* ms)
 
 	for (i = rows.begin(); i != rows.end(); ++i) {
 
-		MixerStrip* strip = (*i)[track_columns.strip];
+		AxisView* av = (*i)[stripable_columns.strip];
+		MixerStrip* strip = dynamic_cast<MixerStrip*> (av);
 		if (strip == ms) {
-			(*i)[track_columns.visible] = false;
-			redisplay_track_list ();
+			(*i)[stripable_columns.visible] = false;
+			av->set_marked_for_display (false);
+			update_track_visibility ();
 			break;
 		}
 	}
@@ -956,7 +1100,7 @@ Mixer_UI::stop_updating ()
 void
 Mixer_UI::fast_update_strips ()
 {
-	if (is_mapped () && _session) {
+	if (_content.is_mapped () && _session) {
 		for (list<MixerStrip *>::iterator i = strips.begin(); i != strips.end(); ++i) {
 			(*i)->fast_update ();
 		}
@@ -974,10 +1118,10 @@ Mixer_UI::set_all_strips_visibility (bool yn)
 
 		for (i = rows.begin(); i != rows.end(); ++i) {
 
-			TreeModel::Row row = (*i);
-			MixerStrip* strip = row[track_columns.strip];
+			AxisView* av = (*i)[stripable_columns.strip];
+			MixerStrip* strip = dynamic_cast<MixerStrip*> (av);
 
-			if (strip == 0) {
+			if (!strip) {
 				continue;
 			}
 
@@ -985,7 +1129,7 @@ Mixer_UI::set_all_strips_visibility (bool yn)
 				continue;
 			}
 
-			(*i)[track_columns.visible] = yn;
+			(*i)[stripable_columns.visible] = yn;
 		}
 	}
 
@@ -1003,10 +1147,11 @@ Mixer_UI::set_all_audio_midi_visibility (int tracks, bool yn)
 		Unwinder<bool> uw (no_track_list_redisplay, true);
 
 		for (i = rows.begin(); i != rows.end(); ++i) {
-			TreeModel::Row row = (*i);
-			MixerStrip* strip = row[track_columns.strip];
 
-			if (strip == 0) {
+			AxisView* av = (*i)[stripable_columns.strip];
+			MixerStrip* strip = dynamic_cast<MixerStrip*> (av);
+
+			if (!strip) {
 				continue;
 			}
 
@@ -1019,24 +1164,24 @@ Mixer_UI::set_all_audio_midi_visibility (int tracks, bool yn)
 
 			switch (tracks) {
 			case 0:
-				(*i)[track_columns.visible] = yn;
+				(*i)[stripable_columns.visible] = yn;
 				break;
 
 			case 1:
 				if (at) { /* track */
-					(*i)[track_columns.visible] = yn;
+					(*i)[stripable_columns.visible] = yn;
 				}
 				break;
 
 			case 2:
 				if (!at && !mt) { /* bus */
-					(*i)[track_columns.visible] = yn;
+					(*i)[stripable_columns.visible] = yn;
 				}
 				break;
 
 			case 3:
 				if (mt) { /* midi-track */
-					(*i)[track_columns.visible] = yn;
+					(*i)[stripable_columns.visible] = yn;
 				}
 				break;
 			}
@@ -1091,12 +1236,11 @@ Mixer_UI::hide_all_miditracks ()
 	set_all_audio_midi_visibility (3, false);
 }
 
-
 void
 Mixer_UI::track_list_reorder (const TreeModel::Path&, const TreeModel::iterator&, int* /*new_order*/)
 {
 	DEBUG_TRACE (DEBUG::OrderKeys, "mixer UI treeview reordered\n");
-	sync_order_keys_from_treeview ();
+	sync_presentation_info_from_treeview ();
 }
 
 void
@@ -1110,7 +1254,7 @@ Mixer_UI::track_list_delete (const Gtk::TreeModel::Path&)
 	*/
 
 	DEBUG_TRACE (DEBUG::OrderKeys, "mixer UI treeview row deleted\n");
-	sync_order_keys_from_treeview ();
+	sync_presentation_info_from_treeview ();
 
         if (_route_deletion_in_progress) {
                 redisplay_track_list ();
@@ -1118,86 +1262,153 @@ Mixer_UI::track_list_delete (const Gtk::TreeModel::Path&)
 }
 
 void
-Mixer_UI::redisplay_track_list ()
+Mixer_UI::spill_redisplay (boost::shared_ptr<VCA> vca)
 {
 	TreeModel::Children rows = track_model->children();
-	TreeModel::Children::iterator i;
-
-	if (no_track_list_redisplay) {
-		return;
-	}
 
-	for (i = rows.begin(); i != rows.end(); ++i) {
+	for (TreeModel::Children::iterator i = rows.begin(); i != rows.end(); ++i) {
 
-		MixerStrip* strip = (*i)[track_columns.strip];
+		AxisView* av = (*i)[stripable_columns.strip];
+		MixerStrip* strip = dynamic_cast<MixerStrip*> (av);
 
-		if (strip == 0) {
+		if (!strip) {
 			/* we're in the middle of changing a row, don't worry */
 			continue;
 		}
 
-		bool const visible = (*i)[track_columns.visible];
-
-		if (visible) {
-			strip->set_gui_property ("visible", true);
-
-			if (strip->packed()) {
+		if (!strip->route()) {
+			/* non-route element */
+			continue;
+		}
 
-				if (strip->route()->is_master() || strip->route()->is_monitor()) {
-					out_packer.reorder_child (*strip, -1);
+		if (strip->route()->is_master() || strip->route()->is_monitor()) {
+			continue;
+		}
 
-				} else {
-					strip_packer.reorder_child (*strip, -1); /* put at end */
-				}
+		if (strip->route()->slaved_to (vca)) {
 
+			if (strip->packed()) {
+				strip_packer.reorder_child (*strip, -1); /* put at end */
 			} else {
-
-				if (strip->route()->is_master() || strip->route()->is_monitor()) {
-					out_packer.pack_start (*strip, false, false);
-				} else {
-					strip_packer.pack_start (*strip, false, false);
-				}
+				strip_packer.pack_start (*strip, false, false);
 				strip->set_packed (true);
 			}
 
 		} else {
 
-			strip->set_gui_property ("visible", false);
-
-			if (strip->route()->is_master() || strip->route()->is_monitor()) {
-				/* do nothing, these cannot be hidden */
-			} else {
-				if (strip->packed()) {
-					strip_packer.remove (*strip);
-					strip->set_packed (false);
-				}
+			if (strip->packed()) {
+				strip_packer.remove (*strip);
+				strip->set_packed (false);
 			}
 		}
 	}
-
-	_group_tabs->set_dirty ();
 }
 
 void
-Mixer_UI::strip_width_changed ()
+Mixer_UI::redisplay_track_list ()
 {
-	_group_tabs->set_dirty ();
+	if (no_track_list_redisplay) {
+		return;
+	}
+
+	boost::shared_ptr<VCA> sv = spilled_vca.lock ();
+
+	if (sv) {
+		spill_redisplay (sv);
+		return;
+	}
 
-#ifdef GTKOSX
 	TreeModel::Children rows = track_model->children();
 	TreeModel::Children::iterator i;
-	long order;
+	uint32_t n_masters = 0;
 
-	for (order = 0, i = rows.begin(); i != rows.end(); ++i, ++order) {
-		MixerStrip* strip = (*i)[track_columns.strip];
+	container_clear (vca_hpacker);
+	vca_hpacker.pack_end (vca_scroller_base, true, true);
 
-		if (strip == 0) {
+	for (i = rows.begin(); i != rows.end(); ++i) {
+
+		AxisView* s = (*i)[stripable_columns.strip];
+		bool const visible = (*i)[stripable_columns.visible];
+		boost::shared_ptr<Stripable> stripable = (*i)[stripable_columns.stripable];
+
+		if (!s) {
+			/* we're in the middle of changing a row, don't worry */
 			continue;
 		}
 
-		bool visible = (*i)[track_columns.visible];
+		VCAMasterStrip* vms;
 
-		if (visible) {
+		if ((vms = dynamic_cast<VCAMasterStrip*> (s))) {
+			if (visible) {
+				vca_hpacker.pack_start (*vms, false, false);
+				vms->show ();
+				n_masters++;
+			}
+			continue;
+		}
+
+		MixerStrip* strip = dynamic_cast<MixerStrip*> (s);
+
+		if (!strip) {
+			continue;
+		}
+
+		if (visible) {
+
+			if (strip->packed()) {
+				strip_packer.reorder_child (*strip, -1); /* put at end */
+			} else {
+				strip_packer.pack_start (*strip, false, false);
+				strip->set_packed (true);
+			}
+
+		} else {
+
+			if (stripable->is_master() || stripable->is_monitor()) {
+				/* do nothing, these cannot be hidden */
+			} else {
+				if (strip->packed()) {
+					strip_packer.remove (*strip);
+					strip->set_packed (false);
+				}
+			}
+		}
+	}
+
+	/* update visibility of VCA assign buttons */
+
+	if (n_masters == 0) {
+		UIConfiguration::instance().set_mixer_strip_visibility (VisibilityGroup::remove_element (UIConfiguration::instance().get_mixer_strip_visibility(), X_("VCA")));
+		vca_vpacker.hide ();
+	} else {
+		UIConfiguration::instance().set_mixer_strip_visibility (VisibilityGroup::add_element (UIConfiguration::instance().get_mixer_strip_visibility(), X_("VCA")));
+		vca_vpacker.show ();
+	}
+
+	_group_tabs->set_dirty ();
+}
+
+void
+Mixer_UI::strip_width_changed ()
+{
+	_group_tabs->set_dirty ();
+
+#ifdef __APPLE__
+	TreeModel::Children rows = track_model->children();
+	TreeModel::Children::iterator i;
+	long order;
+
+	for (order = 0, i = rows.begin(); i != rows.end(); ++i, ++order) {
+		AxisView* av = (*i)[stripable_columns.strip];
+		MixerStrip* strip = dynamic_cast<MixerStrip*> (av);
+
+		if (strip == 0) {
+			continue;
+		}
+
+		bool visible = (*i)[stripable_columns.visible];
+
+		if (visible) {
 			strip->queue_draw();
 		}
 	}
@@ -1205,25 +1416,50 @@ Mixer_UI::strip_width_changed ()
 
 }
 
+struct PresentationInfoMixerSorter
+{
+	bool operator() (boost::shared_ptr<Stripable> a, boost::shared_ptr<Stripable> b) {
+		if (a->is_master()) {
+			/* master after everything else */
+			return false;
+		} else if (b->is_master()) {
+			/* everything else before master */
+			return true;
+		}
+		return a->presentation_info().order () < b->presentation_info().order ();
+	}
+};
+
 void
 Mixer_UI::initial_track_display ()
 {
+	StripableList sl;
+
 	boost::shared_ptr<RouteList> routes = _session->get_routes();
-	RouteList copy (*routes);
-	ARDOUR::SignalOrderRouteSorter sorter;
 
-	copy.sort (sorter);
+	for (RouteList::iterator r = routes->begin(); r != routes->end(); ++r) {
+		sl.push_back (*r);
+	}
+
+	VCAList vcas = _session->vca_manager().vcas();
+
+	for (VCAList::iterator v = vcas.begin(); v != vcas.end(); ++v) {
+		sl.push_back (boost::dynamic_pointer_cast<Stripable> (*v));
+	}
+
+	sl.sort (PresentationInfoMixerSorter());
 
 	{
+		/* These are also used inside ::add_stripables() but we need
+		 *  them here because we're going to clear the track_model also.
+		 */
 		Unwinder<bool> uw1 (no_track_list_redisplay, true);
 		Unwinder<bool> uw2 (ignore_reorder, true);
 
 		track_model->clear ();
-		add_strips (copy);
+		add_stripables (sl);
 	}
 
-	_session->sync_order_keys ();
-
 	redisplay_track_list ();
 }
 
@@ -1270,20 +1506,35 @@ Mixer_UI::build_track_menu ()
 }
 
 void
-Mixer_UI::strip_property_changed (const PropertyChange& what_changed, MixerStrip* mx)
+Mixer_UI::stripable_property_changed (const PropertyChange& what_changed, boost::weak_ptr<Stripable> ws)
 {
-	if (!what_changed.contains (ARDOUR::Properties::name)) {
+	if (!what_changed.contains (ARDOUR::Properties::hidden) && !what_changed.contains (ARDOUR::Properties::name)) {
 		return;
 	}
 
-	ENSURE_GUI_THREAD (*this, &Mixer_UI::strip_name_changed, what_changed, mx)
+	boost::shared_ptr<Stripable> s = ws.lock ();
+
+	if (!s) {
+		return;
+	}
 
 	TreeModel::Children rows = track_model->children();
 	TreeModel::Children::iterator i;
 
 	for (i = rows.begin(); i != rows.end(); ++i) {
-		if ((*i)[track_columns.strip] == mx) {
-			(*i)[track_columns.text] = mx->route()->name();
+		boost::shared_ptr<Stripable> ss = (*i)[stripable_columns.stripable];
+
+		if (s == ss) {
+
+			if (what_changed.contains (ARDOUR::Properties::name)) {
+				(*i)[stripable_columns.text] = s->name();
+			}
+
+			if (what_changed.contains (ARDOUR::Properties::hidden)) {
+				(*i)[stripable_columns.visible] = !s->presentation_info().hidden();
+				redisplay_track_list ();
+			}
+
 			return;
 		}
 	}
@@ -1318,11 +1569,11 @@ Mixer_UI::group_display_button_press (GdkEventButton* ev)
 	}
 
 	switch (GPOINTER_TO_UINT (column->get_data (X_("colnum")))) {
-	case 0:
+	case 1:
 		if (Keyboard::is_edit_event (ev)) {
 			if (group) {
 				// edit_route_group (group);
-#ifdef GTKOSX
+#ifdef __APPLE__
 				group_display.queue_draw();
 #endif
 				return true;
@@ -1330,11 +1581,11 @@ Mixer_UI::group_display_button_press (GdkEventButton* ev)
 		}
 		break;
 
-	case 1:
+	case 0:
 	{
 		bool visible = (*iter)[group_columns.visible];
 		(*iter)[group_columns.visible] = !visible;
-#ifdef GTKOSX
+#ifdef __APPLE__
 		group_display.queue_draw();
 #endif
 		return true;
@@ -1396,9 +1647,7 @@ Mixer_UI::route_groups_changed ()
 void
 Mixer_UI::new_route_group ()
 {
-	RouteList rl;
-
-	_group_tabs->run_new_group_dialog (rl);
+	_group_tabs->run_new_group_dialog (0, false);
 }
 
 void
@@ -1479,15 +1728,10 @@ Mixer_UI::show_mixer_list (bool yn)
 {
 	if (yn) {
 		list_vpacker.show ();
-		
-		//if user wants to show the pane, we should make sure that it is wide enough to be visible 
-		int width = list_hpane.get_position();
-		if (width < 40)
-			list_hpane.set_position(40);
 	} else {
 		list_vpacker.hide ();
 	}
-	
+
 	_show_mixer_list = yn;
 }
 
@@ -1601,7 +1845,7 @@ Mixer_UI::add_route_group (RouteGroup* group)
 
 	if (focus) {
 		TreeViewColumn* col = group_display.get_column (0);
-		CellRendererText* name_cell = dynamic_cast<CellRendererText*>(group_display.get_column_cell_renderer (0));
+		CellRendererText* name_cell = dynamic_cast<CellRendererText*>(group_display.get_column_cell_renderer (1));
 		group_display.set_cursor (group_model->get_path (row), *col, *name_cell, true);
 	}
 
@@ -1616,7 +1860,7 @@ Mixer_UI::strip_scroller_button_release (GdkEventButton* ev)
 	using namespace Menu_Helpers;
 
 	if (Keyboard::is_context_menu_event (ev)) {
-		ARDOUR_UI::instance()->add_route (this);
+		ARDOUR_UI::instance()->add_route ();
 		return true;
 	}
 
@@ -1624,29 +1868,48 @@ Mixer_UI::strip_scroller_button_release (GdkEventButton* ev)
 }
 
 void
-Mixer_UI::set_strip_width (Width w, bool save)
+Mixer_UI::scroller_drag_data_received (const Glib::RefPtr<Gdk::DragContext>& context, int x, int y, const Gtk::SelectionData& data, guint info, guint time)
 {
-	_strip_width = w;
+	printf ("Mixer_UI::scroller_drag_data_received\n");
+	if (data.get_target() != "PluginFavoritePtr") {
+		context->drag_finish (false, false, time);
+		return;
+	}
 
-	for (list<MixerStrip*>::iterator i = strips.begin(); i != strips.end(); ++i) {
-		(*i)->set_width_enum (w, save ? (*i)->width_owner() : this);
+	const void * d = data.get_data();
+	const Gtkmm2ext::DnDTreeView<ARDOUR::PluginPresetPtr>* tv = reinterpret_cast<const Gtkmm2ext::DnDTreeView<ARDOUR::PluginPresetPtr>*>(d);
+
+	PluginPresetList nfos;
+	TreeView* source;
+	tv->get_object_drag_data (nfos, &source);
+
+	Route::ProcessorList pl;
+	bool ok = false;
+
+	for (list<PluginPresetPtr>::const_iterator i = nfos.begin(); i != nfos.end(); ++i) {
+		PluginPresetPtr ppp = (*i);
+		PluginInfoPtr pip = ppp->_pip;
+		if (!pip->is_instrument ()) {
+			continue;
+		}
+		ARDOUR_UI::instance()->session_add_midi_track ((RouteGroup*) 0, 1, _("MIDI"), Config->get_strict_io (), pip, ppp->_preset.valid ? &ppp->_preset : 0, PresentationInfo::max_order);
+		ok = true;
 	}
-}
 
-void
-Mixer_UI::set_window_pos_and_size ()
-{
-	resize (m_width, m_height);
-	move (m_root_x, m_root_y);
+	context->drag_finish (ok, false, time);
 }
 
 void
-Mixer_UI::get_window_pos_and_size ()
+Mixer_UI::set_strip_width (Width w, bool save)
 {
-	get_position(m_root_x, m_root_y);
-	get_size(m_width, m_height);
+	_strip_width = w;
+
+	for (list<MixerStrip*>::iterator i = strips.begin(); i != strips.end(); ++i) {
+		(*i)->set_width_enum (w, save ? (*i)->width_owner() : this);
+	}
 }
 
+
 struct PluginStateSorter {
 public:
 	bool operator() (PluginInfoPtr a, PluginInfoPtr b) const {
@@ -1670,49 +1933,12 @@ private:
 };
 
 int
-Mixer_UI::set_state (const XMLNode& node)
+Mixer_UI::set_state (const XMLNode& node, int version)
 {
-	const XMLProperty* prop;
-	XMLNode* geometry;
-
-	m_width = default_width;
-	m_height = default_height;
-	m_root_x = 1;
-	m_root_y = 1;
+	XMLProperty const * prop;
+	LocaleGuard lg;
 
-	if ((geometry = find_named_node (node, "geometry")) != 0) {
-
-		XMLProperty* prop;
-
-		if ((prop = geometry->property("x_size")) == 0) {
-			prop = geometry->property ("x-size");
-		}
-		if (prop) {
-			m_width = atoi(prop->value());
-		}
-		if ((prop = geometry->property("y_size")) == 0) {
-			prop = geometry->property ("y-size");
-		}
-		if (prop) {
-			m_height = atoi(prop->value());
-		}
-
-		if ((prop = geometry->property ("x_pos")) == 0) {
-			prop = geometry->property ("x-pos");
-		}
-		if (prop) {
-			m_root_x = atoi (prop->value());
-
-		}
-		if ((prop = geometry->property ("y_pos")) == 0) {
-			prop = geometry->property ("y-pos");
-		}
-		if (prop) {
-			m_root_y = atoi (prop->value());
-		}
-	}
-
-	set_window_pos_and_size ();
+	Tabbable::set_state (node, version);
 
 	if ((prop = node.property ("narrow-strips"))) {
 		if (string_is_affirmative (prop->value())) {
@@ -1735,8 +1961,7 @@ Mixer_UI::set_state (const XMLNode& node)
 		Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act);
 		bool fs = tact && tact->get_active();
 		if (yn ^ fs) {
-			ActionManager::do_action ("Common",
-					"ToggleMaximalMixer");
+			ActionManager::do_action ("Common", "ToggleMaximalMixer");
 		}
 	}
 
@@ -1771,142 +1996,49 @@ Mixer_UI::set_state (const XMLNode& node)
 		favorite_order.sort (cmp);
 		sync_treeview_from_favorite_order ();
 	}
-
 	return 0;
 }
 
 XMLNode&
-Mixer_UI::get_state (void)
+Mixer_UI::get_state ()
 {
-	XMLNode* node = new XMLNode ("Mixer");
-
-	if (is_realized()) {
-		Glib::RefPtr<Gdk::Window> win = get_window();
+	XMLNode* node = new XMLNode (X_("Mixer"));
+	char buf[128];
+	LocaleGuard lg;
 
-		get_window_pos_and_size ();
+	node->add_child_nocopy (Tabbable::get_state());
 
-		XMLNode* geometry = new XMLNode ("geometry");
-		char buf[32];
-		snprintf(buf, sizeof(buf), "%d", m_width);
-		geometry->add_property(X_("x_size"), string(buf));
-		snprintf(buf, sizeof(buf), "%d", m_height);
-		geometry->add_property(X_("y_size"), string(buf));
-		snprintf(buf, sizeof(buf), "%d", m_root_x);
-		geometry->add_property(X_("x_pos"), string(buf));
-		snprintf(buf, sizeof(buf), "%d", m_root_y);
-		geometry->add_property(X_("y_pos"), string(buf));
-
-		// written only for compatibility, they are not used.
-		snprintf(buf, sizeof(buf), "%d", 0);
-		geometry->add_property(X_("x_off"), string(buf));
-		snprintf(buf, sizeof(buf), "%d", 0);
-		geometry->add_property(X_("y_off"), string(buf));
-
-		snprintf(buf,sizeof(buf), "%d",gtk_paned_get_position (static_cast<Paned*>(&rhs_pane1)->gobj()));
-		geometry->add_property(X_("mixer_rhs_pane1_pos"), string(buf));
-		snprintf(buf,sizeof(buf), "%d",gtk_paned_get_position (static_cast<Paned*>(&rhs_pane2)->gobj()));
-		geometry->add_property(X_("mixer_rhs_pane2_pos"), string(buf));
-		snprintf(buf,sizeof(buf), "%d",gtk_paned_get_position (static_cast<Paned*>(&list_hpane)->gobj()));
-		geometry->add_property(X_("mixer_list_hpane_pos"), string(buf));
-
-		node->add_child_nocopy (*geometry);
-	}
+	snprintf(buf,sizeof(buf), "%f", rhs_pane1.get_divider());
+	node->add_property(X_("mixer-rhs-pane1-pos"), string(buf));
+	snprintf(buf,sizeof(buf), "%f", rhs_pane2.get_divider());
+	node->add_property(X_("mixer-rhs_pane2-pos"), string(buf));
+	snprintf(buf,sizeof(buf), "%f", list_hpane.get_divider());
+	node->add_property(X_("mixer-list-hpane-pos"), string(buf));
+	snprintf(buf,sizeof(buf), "%f", inner_pane.get_divider());
+	node->add_property(X_("mixer-inner-pane-pos"), string(buf));
 
 	node->add_property ("narrow-strips", _strip_width == Narrow ? "yes" : "no");
-
 	node->add_property ("show-mixer", _visible ? "yes" : "no");
-
 	node->add_property ("show-mixer-list", _show_mixer_list ? "yes" : "no");
-
 	node->add_property ("maximised", _maximised ? "yes" : "no");
 
 	store_current_favorite_order ();
 	XMLNode* plugin_order = new XMLNode ("PluginOrder");
 	int cnt = 0;
 	for (PluginInfoList::const_iterator i = favorite_order.begin(); i != favorite_order.end(); ++i, ++cnt) {
-			XMLNode* p = new XMLNode ("PluginInfo");
-			p->add_property ("sort", cnt);
-			p->add_property ("unique-id", (*i)->unique_id);
-			if (favorite_ui_state.find ((*i)->unique_id) != favorite_ui_state.end ()) {
-				p->add_property ("expanded", favorite_ui_state[(*i)->unique_id]);
-			}
-			plugin_order->add_child_nocopy (*p);
-		;
+		XMLNode* p = new XMLNode ("PluginInfo");
+		p->add_property ("sort", cnt);
+		p->add_property ("unique-id", (*i)->unique_id);
+		if (favorite_ui_state.find ((*i)->unique_id) != favorite_ui_state.end ()) {
+			p->add_property ("expanded", favorite_ui_state[(*i)->unique_id]);
+		}
+		plugin_order->add_child_nocopy (*p);
 	}
 	node->add_child_nocopy (*plugin_order);
+
 	return *node;
 }
 
-
-void
-Mixer_UI::pane_allocation_handler (Allocation&, Gtk::Paned* which)
-{
-	int pos;
-	XMLProperty* prop = 0;
-	XMLNode* node = ARDOUR_UI::instance()->mixer_settings();
-	XMLNode* geometry;
-	int height;
-	static int32_t done[3] = { 0, 0, 0 };
-
-	height = default_height;
-
-	if ((geometry = find_named_node (*node, "geometry")) != 0) {
-
-		if ((prop = geometry->property ("y_size")) == 0) {
-			prop = geometry->property ("y-size");
-		}
-		if (prop) {
-			height = atoi (prop->value());
-		}
-	}
-
-	if (which == static_cast<Gtk::Paned*> (&rhs_pane1)) {
-
-		if (done[0]) {
-			return;
-		}
-
-		if (!geometry || (prop = geometry->property("mixer-rhs-pane1-pos")) == 0) {
-			pos = height / 3;
-		} else {
-			pos = atoi (prop->value());
-		}
-
-		if ((done[0] = GTK_WIDGET(rhs_pane1.gobj())->allocation.height > pos)) {
-			rhs_pane1.set_position (pos);
-		}
-
-	} else if (which == static_cast<Gtk::Paned*> (&rhs_pane2)) {
-		if (done[1]) {
-			return;
-		}
-
-		if (!geometry || (prop = geometry->property("mixer-rhs-pane2-pos")) == 0) {
-			pos = 2 * height / 3;
-		} else {
-			pos = atoi (prop->value());
-		}
-
-		if ((done[1] = GTK_WIDGET(rhs_pane2.gobj())->allocation.height > pos)) {
-			rhs_pane2.set_position (pos);
-		}
-	} else if (which == static_cast<Gtk::Paned*> (&list_hpane)) {
-
-		if (done[2]) {
-			return;
-		}
-
-		if (!geometry || (prop = geometry->property("mixer-list-hpane-pos")) == 0) {
-			pos = std::max ((float)100, rintf ((float) 125 * UIConfiguration::instance().get_ui_scale()));
-		} else {
-			pos = max (36, atoi (prop->value ()));
-		}
-
-		if ((done[2] = GTK_WIDGET(list_hpane.gobj())->allocation.width > pos)) {
-			list_hpane.set_position (pos);
-		}
-	}
-}
 void
 Mixer_UI::scroll_left ()
 {
@@ -1926,44 +2058,6 @@ Mixer_UI::scroll_right ()
 }
 
 bool
-Mixer_UI::on_key_press_event (GdkEventKey* ev)
-{
-        /* focus widget gets first shot, then bindings, otherwise
-           forward to main window
-        */
-
-	if (gtk_window_propagate_key_event (GTK_WINDOW(gobj()), ev)) {
-		return true;
-	}
-
-	KeyboardKey k (ev->state, ev->keyval);
-
-	if (bindings.activate (k, Bindings::Press)) {
-		return true;
-	}
-
-        return forward_key_press (ev);
-}
-
-bool
-Mixer_UI::on_key_release_event (GdkEventKey* ev)
-{
-	if (gtk_window_propagate_key_event (GTK_WINDOW(gobj()), ev)) {
-		return true;
-	}
-
-	KeyboardKey k (ev->state, ev->keyval);
-
-	if (bindings.activate (k, Bindings::Release)) {
-		return true;
-	}
-
-        /* don't forward releases */
-
-        return true;
-}
-
-bool
 Mixer_UI::on_scroll_event (GdkEventScroll* ev)
 {
 	switch (ev->direction) {
@@ -2008,8 +2102,6 @@ Mixer_UI::parameter_changed (string const & p)
 		for (list<MixerStrip*>::iterator i = strips.begin(); i != strips.end(); ++i) {
 			(*i)->set_width_enum (s ? Narrow : Wide, this);
 		}
-	} else if (p == "remote-model") {
-		reset_remote_control_ids ();
 	} else if (p == "use-monitor-bus") {
 		if (_session && !_session->monitor_out()) {
 			monitor_section_detached ();
@@ -2037,15 +2129,15 @@ Mixer_UI::plugin_selector()
 void
 Mixer_UI::setup_track_display ()
 {
-	track_model = ListStore::create (track_columns);
+	track_model = ListStore::create (stripable_columns);
 	track_display.set_model (track_model);
-	track_display.append_column (_("Strips"), track_columns.text);
-	track_display.append_column (_("Show"), track_columns.visible);
+	track_display.append_column (_("Show"), stripable_columns.visible);
+	track_display.append_column (_("Strips"), stripable_columns.text);
 	track_display.get_column (0)->set_data (X_("colnum"), GUINT_TO_POINTER(0));
 	track_display.get_column (1)->set_data (X_("colnum"), GUINT_TO_POINTER(1));
-	track_display.get_column (0)->set_expand(true);
-	track_display.get_column (1)->set_expand(false);
-	track_display.get_column (0)->set_sizing (Gtk::TREE_VIEW_COLUMN_FIXED);
+	track_display.get_column (0)->set_expand(false);
+	track_display.get_column (1)->set_expand(true);
+	track_display.get_column (1)->set_sizing (Gtk::TREE_VIEW_COLUMN_FIXED);
 	track_display.set_name (X_("EditGroupList"));
 	track_display.get_selection()->set_mode (Gtk::SELECTION_NONE);
 	track_display.set_reorderable (true);
@@ -2055,7 +2147,7 @@ Mixer_UI::setup_track_display ()
 	track_model->signal_row_deleted().connect (sigc::mem_fun (*this, &Mixer_UI::track_list_delete));
 	track_model->signal_rows_reordered().connect (sigc::mem_fun (*this, &Mixer_UI::track_list_reorder));
 
-	CellRendererToggle* track_list_visible_cell = dynamic_cast<CellRendererToggle*>(track_display.get_column_cell_renderer (1));
+	CellRendererToggle* track_list_visible_cell = dynamic_cast<CellRendererToggle*>(track_display.get_column_cell_renderer (0));
 	track_list_visible_cell->property_activatable() = true;
 	track_list_visible_cell->property_radio() = false;
 	track_list_visible_cell->signal_toggled().connect (sigc::mem_fun (*this, &Mixer_UI::track_visibility_changed));
@@ -2091,13 +2183,16 @@ Mixer_UI::setup_track_display ()
 void
 Mixer_UI::new_track_or_bus ()
 {
-	ARDOUR_UI::instance()->add_route (this);
+	ARDOUR_UI::instance()->add_route ();
 }
 
-
 void
 Mixer_UI::update_title ()
 {
+	if (!own_window()) {
+		return;
+	}
+
 	if (_session) {
 		string n;
 
@@ -2114,13 +2209,13 @@ Mixer_UI::update_title ()
 		WindowTitle title (n);
 		title += S_("Window|Mixer");
 		title += Glib::get_application_name ();
-		set_title (title.get_string());
+		own_window()->set_title (title.get_string());
 
 	} else {
 
 		WindowTitle title (S_("Window|Mixer"));
 		title += Glib::get_application_name ();
-		set_title (title.get_string());
+		own_window()->set_title (title.get_string());
 	}
 }
 
@@ -2130,7 +2225,7 @@ Mixer_UI::strip_by_x (int x)
 	for (list<MixerStrip*>::iterator i = strips.begin(); i != strips.end(); ++i) {
 		int x1, x2, y;
 
-		(*i)->translate_coordinates (*this, 0, 0, x1, y);
+		(*i)->translate_coordinates (_content, 0, 0, x1, y);
 		x2 = x1 + (*i)->get_width();
 
 		if (x >= x1 && x <= x2) {
@@ -2142,12 +2237,12 @@ Mixer_UI::strip_by_x (int x)
 }
 
 void
-Mixer_UI::set_route_targets_for_operation ()
+Mixer_UI::set_axis_targets_for_operation ()
 {
-	_route_targets.clear ();
+	_axis_targets.clear ();
 
 	if (!_selection.empty()) {
-		_route_targets = _selection.routes;
+		_axis_targets = _selection.axes;
 		return;
 	}
 
@@ -2173,13 +2268,13 @@ Mixer_UI::toggle_midi_input_active (bool flip_others)
 	boost::shared_ptr<RouteList> rl (new RouteList);
 	bool onoff = false;
 
-	set_route_targets_for_operation ();
+	set_axis_targets_for_operation ();
 
-	for (RouteUISelection::iterator r = _route_targets.begin(); r != _route_targets.end(); ++r) {
-		boost::shared_ptr<MidiTrack> mt = (*r)->midi_track();
+	for (AxisViewSelection::iterator r = _axis_targets.begin(); r != _axis_targets.end(); ++r) {
+		boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> ((*r)->stripable());
 
 		if (mt) {
-			rl->push_back ((*r)->route());
+			rl->push_back (mt);
 			onoff = !mt->input_active();
 		}
 	}
@@ -2190,24 +2285,30 @@ Mixer_UI::toggle_midi_input_active (bool flip_others)
 void
 Mixer_UI::maximise_mixer_space ()
 {
-	if (_maximised) {
+	if (!own_window()) {
 		return;
 	}
 
-	fullscreen ();
+	if (_maximised) {
+		return;
+	}
 
+	_window->fullscreen ();
 	_maximised = true;
 }
 
 void
 Mixer_UI::restore_mixer_space ()
 {
-	if (!_maximised) {
+	if (!own_window()) {
 		return;
 	}
 
-	unfullscreen();
+	if (!_maximised) {
+		return;
+	}
 
+	own_window()->unfullscreen();
 	_maximised = false;
 }
 
@@ -2307,6 +2408,7 @@ Mixer_UI::refill_favorite_plugins ()
 	refiller (plugs, mgr.au_plugin_info ());
 #endif
 	refiller (plugs, mgr.ladspa_plugin_info ());
+	refiller (plugs, mgr.lua_plugin_info ());
 
 	store_current_favorite_order ();
 
@@ -2373,7 +2475,7 @@ Mixer_UI::popup_note_context_menu (GdkEventButton *ev)
 	Gtk::Menu* m = manage (new Menu);
 	MenuList& items = m->items ();
 
-	if (_selection.routes.empty()) {
+	if (_selection.axes.empty()) {
 		items.push_back (MenuElem (_("No Track/Bus is selected.")));
 	} else {
 		items.push_back (MenuElem (_("Add at the top"),
@@ -2490,17 +2592,23 @@ Mixer_UI::plugin_row_activated (const TreeModel::Path& path, TreeViewColumn* col
 void
 Mixer_UI::add_favorite_processor (ARDOUR::PluginPresetPtr ppp, ProcessorPosition pos)
 {
-	if (!_session || _selection.routes.empty()) {
+	if (!_session || _selection.axes.empty()) {
 		return;
 	}
 
 	PluginInfoPtr pip = ppp->_pip;
-	for (RouteUISelection::iterator i = _selection.routes.begin(); i != _selection.routes.end(); ++i) {
-		boost::shared_ptr<ARDOUR::Route> rt = (*i)->route();
-		if (!rt) { continue; }
+	for (AxisViewSelection::iterator i = _selection.axes.begin(); i != _selection.axes.end(); ++i) {
+		boost::shared_ptr<ARDOUR::Route> rt = boost::dynamic_pointer_cast<ARDOUR::Route> ((*i)->stripable());
+
+		if (!rt) {
+			continue;
+		}
 
 		PluginPtr p = pip->load (*_session);
-		if (!p) { continue; }
+
+		if (!p) {
+			continue;
+		}
 
 		if (ppp->_preset.valid) {
 			p->load_preset (ppp->_preset);
@@ -2519,13 +2627,22 @@ Mixer_UI::add_favorite_processor (ARDOUR::PluginPresetPtr ppp, ProcessorPosition
 			case AddPostFader:
 				{
 					int idx = 0;
+					int pos = 0;
 					for (;;++idx) {
 						boost::shared_ptr<Processor> np = rt->nth_processor (idx);
-						if (!np || boost::dynamic_pointer_cast<Amp> (np)) {
+						if (!np) {
+							break;
+						}
+						if (!np->display_to_user()) {
+							continue;
+						}
+						if (boost::dynamic_pointer_cast<Amp> (np) && // Fader, not Trim
+								boost::dynamic_pointer_cast<Amp> (np)->gain_control()->parameter().type() == GainAutomation) {
 							break;
 						}
+						++pos;
 					}
-					rt->add_processor_by_index (processor, ++idx, &err, Config->get_new_plugins_active ());
+					rt->add_processor_by_index (processor, ++pos, &err, Config->get_new_plugins_active ());
 				}
 				break;
 			case AddBottom:
@@ -2577,3 +2694,262 @@ Mixer_UI::plugin_drop (const Glib::RefPtr<Gdk::DragContext>&, const Gtk::Selecti
 	manager.set_status (ppp->_pip->type, ppp->_pip->unique_id, status);
 	manager.save_statuses ();
 }
+
+void
+Mixer_UI::do_vca_assign (boost::shared_ptr<VCA> vca)
+{
+	/* call protected MixerActor:: method */
+	vca_assign (vca);
+}
+
+void
+Mixer_UI::do_vca_unassign (boost::shared_ptr<VCA> vca)
+{
+	/* call protected MixerActor:: method */
+	vca_unassign (vca);
+}
+
+void
+Mixer_UI::show_vca_slaves (boost::shared_ptr<VCA> vca)
+{
+	boost::shared_ptr<VCA> v = spilled_vca.lock();
+	if (v != vca) {
+		spilled_vca = vca;
+		show_vca_change (vca); /* EMIT SIGNAL */
+		if (vca) {
+			_group_tabs->hide ();
+		} else {
+			_group_tabs->show ();
+		}
+		redisplay_track_list ();
+	}
+}
+
+bool
+Mixer_UI::showing_vca_slaves_for (boost::shared_ptr<VCA> vca) const
+{
+       return vca == spilled_vca.lock();
+}
+
+void
+Mixer_UI::register_actions ()
+{
+	Glib::RefPtr<ActionGroup> group = myactions.create_action_group (X_("Mixer"));
+
+	myactions.register_action (group, "solo", _("Toggle Solo on Mixer-Selected Tracks/Busses"), sigc::mem_fun (*this, &Mixer_UI::solo_action));
+	myactions.register_action (group, "mute", _("Toggle Mute on Mixer-Selected Tracks/Busses"), sigc::mem_fun (*this, &Mixer_UI::mute_action));
+	myactions.register_action (group, "recenable", _("Toggle Rec-enable on Mixer-Selected Tracks/Busses"), sigc::mem_fun (*this, &Mixer_UI::rec_enable_action));
+	myactions.register_action (group, "increment-gain", _("Decrease Gain on Mixer-Selected Tracks/Busses"), sigc::mem_fun (*this, &Mixer_UI::step_gain_up_action));
+	myactions.register_action (group, "decrement-gain", _("Increase Gain on Mixer-Selected Tracks/Busses"), sigc::mem_fun (*this, &Mixer_UI::step_gain_down_action));
+	myactions.register_action (group, "unity-gain", _("Set Gain to 0dB on Mixer-Selected Tracks/Busses"), sigc::mem_fun (*this, &Mixer_UI::unity_gain_action));
+
+
+	myactions.register_action (group, "copy-processors", _("Copy Selected Processors"), sigc::mem_fun (*this, &Mixer_UI::copy_processors));
+	myactions.register_action (group, "cut-processors", _("Cut Selected Processors"), sigc::mem_fun (*this, &Mixer_UI::cut_processors));
+	myactions.register_action (group, "paste-processors", _("Paste Selected Processors"), sigc::mem_fun (*this, &Mixer_UI::paste_processors));
+	myactions.register_action (group, "delete-processors", _("Delete Selected Processors"), sigc::mem_fun (*this, &Mixer_UI::delete_processors));
+	myactions.register_action (group, "select-all-processors", _("Select All (visible) Processors"), sigc::mem_fun (*this, &Mixer_UI::select_all_processors));
+	myactions.register_action (group, "toggle-processors", _("Toggle Selected Processors"), sigc::mem_fun (*this, &Mixer_UI::toggle_processors));
+	myactions.register_action (group, "ab-plugins", _("Toggle Selected Plugins"), sigc::mem_fun (*this, &Mixer_UI::ab_plugins));
+	myactions.register_action (group, "select-none", _("Deselect all strips and processors"), sigc::mem_fun (*this, &Mixer_UI::select_none));
+
+	myactions.register_action (group, "scroll-left", _("Scroll Mixer Window to the left"), sigc::mem_fun (*this, &Mixer_UI::scroll_left));
+	myactions.register_action (group, "scroll-right", _("Scroll Mixer Window to the left"), sigc::mem_fun (*this, &Mixer_UI::scroll_right));
+
+	myactions.register_action (group, "toggle-midi-input-active", _("Toggle MIDI Input Active for Mixer-Selected Tracks/Busses"),
+	                           sigc::bind (sigc::mem_fun (*this, &Mixer_UI::toggle_midi_input_active), false));
+}
+
+void
+Mixer_UI::load_bindings ()
+{
+	bindings = Bindings::get_bindings (X_("Mixer"), myactions);
+}
+
+template<class T> void
+Mixer_UI::control_action (boost::shared_ptr<T> (Stripable::*get_control)() const)
+{
+	boost::shared_ptr<ControlList> cl (new ControlList);
+	boost::shared_ptr<AutomationControl> ac;
+	bool val = false;
+	bool have_val = false;
+
+	set_axis_targets_for_operation ();
+
+	BOOST_FOREACH(AxisView* r, _axis_targets) {
+		boost::shared_ptr<Stripable> s = r->stripable();
+		if (s) {
+			ac = (s.get()->*get_control)();
+			if (ac) {
+				cl->push_back (ac);
+				if (!have_val) {
+					val = !ac->get_value();
+					have_val = true;
+				}
+			}
+		}
+	}
+
+	_session->set_controls (cl,  val, Controllable::UseGroup);
+}
+
+void
+Mixer_UI::solo_action ()
+{
+	control_action (&Stripable::solo_control);
+}
+
+void
+Mixer_UI::mute_action ()
+{
+	control_action (&Stripable::mute_control);
+}
+
+void
+Mixer_UI::rec_enable_action ()
+{
+	control_action (&Stripable::rec_enable_control);
+}
+
+void
+Mixer_UI::step_gain_up_action ()
+{
+	set_axis_targets_for_operation ();
+
+	BOOST_FOREACH(AxisView* r, _axis_targets) {
+		MixerStrip* ms = dynamic_cast<MixerStrip*> (r);
+		if (ms) {
+			ms->step_gain_up ();
+		}
+	}
+}
+
+void
+Mixer_UI::step_gain_down_action ()
+{
+	set_axis_targets_for_operation ();
+
+	BOOST_FOREACH(AxisView* r, _axis_targets) {
+		MixerStrip* ms = dynamic_cast<MixerStrip*> (r);
+		if (ms) {
+			ms->step_gain_down ();
+		}
+	}
+}
+
+void
+Mixer_UI::unity_gain_action ()
+{
+	set_axis_targets_for_operation ();
+
+	BOOST_FOREACH(AxisView* r, _axis_targets) {
+		boost::shared_ptr<Stripable> s = r->stripable();
+		if (s) {
+			boost::shared_ptr<AutomationControl> ac = s->gain_control();
+			if (ac) {
+				ac->set_value (1.0, Controllable::UseGroup);
+			}
+		}
+	}
+}
+
+void
+Mixer_UI::copy_processors ()
+{
+	set_axis_targets_for_operation ();
+
+	BOOST_FOREACH(AxisView* r, _axis_targets) {
+		MixerStrip* ms = dynamic_cast<MixerStrip*> (r);
+		if (ms) {
+			ms->copy_processors ();
+		}
+	}
+}
+void
+Mixer_UI::cut_processors ()
+{
+	set_axis_targets_for_operation ();
+
+	BOOST_FOREACH(AxisView* r, _axis_targets) {
+		MixerStrip* ms = dynamic_cast<MixerStrip*> (r);
+		if (ms) {
+			ms->cut_processors ();
+		}
+	}
+}
+void
+Mixer_UI::paste_processors ()
+{
+	set_axis_targets_for_operation ();
+
+	BOOST_FOREACH(AxisView* r, _axis_targets) {
+		MixerStrip* ms = dynamic_cast<MixerStrip*> (r);
+		if (ms) {
+			ms->paste_processors ();
+		}
+	}
+}
+void
+Mixer_UI::select_all_processors ()
+{
+	set_axis_targets_for_operation ();
+
+	BOOST_FOREACH(AxisView* r, _axis_targets) {
+		MixerStrip* ms = dynamic_cast<MixerStrip*> (r);
+		if (ms) {
+			ms->select_all_processors ();
+		}
+	}
+}
+void
+Mixer_UI::toggle_processors ()
+{
+	set_axis_targets_for_operation ();
+
+	BOOST_FOREACH(AxisView* r, _axis_targets) {
+		MixerStrip* ms = dynamic_cast<MixerStrip*> (r);
+		if (ms) {
+			ms->toggle_processors ();
+		}
+	}
+}
+void
+Mixer_UI::ab_plugins ()
+{
+	set_axis_targets_for_operation ();
+
+	BOOST_FOREACH(AxisView* r, _axis_targets) {
+		MixerStrip* ms = dynamic_cast<MixerStrip*> (r);
+		if (ms) {
+			ms->ab_plugins ();
+		}
+	}
+}
+
+void
+Mixer_UI::vca_assign (boost::shared_ptr<VCA> vca)
+{
+	set_axis_targets_for_operation ();
+#if 0
+	BOOST_FOREACH(AxisView* r, _axis_targets) {
+		MixerStrip* ms = dynamic_cast<MixerStrip*> (r);
+		if (ms) {
+			ms->vca_assign (vca);
+		}
+	}
+#endif
+}
+
+void
+Mixer_UI::vca_unassign (boost::shared_ptr<VCA> vca)
+{
+	set_axis_targets_for_operation ();
+#if 0
+	BOOST_FOREACH(AxisView* r, _axis_targets) {
+		MixerStrip* ms = dynamic_cast<MixerStrip*> (r);
+		if (ms) {
+			ms->vca_unassign (vca);
+		}
+	}
+#endif
+}
diff --git a/gtk2_ardour/mixer_ui.h b/gtk2_ardour/mixer_ui.h
index a909228..a85006a 100644
--- a/gtk2_ardour/mixer_ui.h
+++ b/gtk2_ardour/mixer_ui.h
@@ -28,7 +28,6 @@
 #include <gtkmm/label.h>
 #include <gtkmm/button.h>
 #include <gtkmm/frame.h>
-#include <gtkmm/paned.h>
 #include <gtkmm/menu.h>
 #include <gtkmm/treeview.h>
 #include <gtkmm/liststore.h>
@@ -42,22 +41,27 @@
 #include "ardour/plugin.h"
 #include "ardour/plugin_manager.h"
 
-#include "gtkmm2ext/visibility_tracker.h"
+#include <gtkmm2ext/bindings.h>
 #include "gtkmm2ext/dndtreeview.h"
+#include <gtkmm2ext/pane.h>
+#include "gtkmm2ext/tabbable.h"
 #include "gtkmm2ext/treeutils.h"
 
 #include "enums.h"
-#include "mixer_actor.h"
+#include "route_processor_selection.h"
 
 namespace ARDOUR {
 	class Route;
 	class RouteGroup;
+	class VCA;
 };
 
+class AxisView;
 class MixerStrip;
 class PluginSelector;
 class MixerGroupTabs;
 class MonitorSection;
+class VCAMasterStrip;
 
 class PluginTreeStore : public Gtk::TreeStore
 {
@@ -72,12 +76,15 @@ protected:
 	virtual bool row_drop_possible_vfunc (const Gtk::TreeModel::Path&, const Gtk::SelectionData&) const;
 };
 
-class Mixer_UI : public Gtk::Window, public PBD::ScopedConnectionList, public ARDOUR::SessionHandlePtr, public MixerActor, public Gtkmm2ext::VisibilityTracker
+class Mixer_UI : public Gtkmm2ext::Tabbable, public PBD::ScopedConnectionList, public ARDOUR::SessionHandlePtr
 {
   public:
 	static Mixer_UI* instance();
 	~Mixer_UI();
 
+	Gtk::Window* use_own_window (bool and_fill_it);
+	void show_window ();
+
 	void set_session (ARDOUR::Session *);
 	void track_editor_selection ();
 
@@ -86,88 +93,99 @@ class Mixer_UI : public Gtk::Window, public PBD::ScopedConnectionList, public AR
 	void  set_strip_width (Width, bool save = false);
 	Width get_strip_width () const { return _strip_width; }
 
-	void unselect_strip_in_display (MixerStrip*);
-	void select_strip_in_display (MixerStrip*);
-
-	XMLNode& get_state (void);
-	int set_state (const XMLNode& );
+	XMLNode& get_state ();
+	int set_state (const XMLNode&, int /* version */);
 
 	void show_mixer_list (bool yn);
 	void show_monitor_section (bool);
-	
-	void show_window ();
-	bool hide_window (GdkEventAny *ev);
+
 	void show_strip (MixerStrip *);
 	void hide_strip (MixerStrip *);
 
 	void maximise_mixer_space();
 	void restore_mixer_space();
 
-	void ensure_float (Gtk::Window&);
-
         MonitorSection* monitor_section() const { return _monitor_section; }
 
 	void deselect_all_strip_processors();
 	void delete_processors();
-
+	void select_strip (MixerStrip&, bool add=false);
 	void select_none ();
 
+	bool window_not_visible () const;
+
+	void do_vca_assign (boost::shared_ptr<ARDOUR::VCA>);
+	void do_vca_unassign (boost::shared_ptr<ARDOUR::VCA>);
+	void show_vca_slaves (boost::shared_ptr<ARDOUR::VCA>);
+	bool showing_vca_slaves_for (boost::shared_ptr<ARDOUR::VCA>) const;
+
+	sigc::signal1<void,boost::shared_ptr<ARDOUR::VCA> > show_vca_change;
+
+	RouteProcessorSelection& selection() { return _selection; }
+	void register_actions ();
+
+        void load_bindings ();
+        Gtkmm2ext::Bindings*  bindings;
+
   protected:
-	void set_route_targets_for_operation ();
+	void set_axis_targets_for_operation ();
 
   private:
 	Mixer_UI ();
-	static Mixer_UI* _instance;
-
-	bool					_visible;
-
-	Gtk::HBox				global_hpacker;
-	Gtk::VBox				global_vpacker;
-	Gtk::ScrolledWindow		scroller;
-	Gtk::EventBox			scroller_base;
-	Gtk::HBox				scroller_hpacker;
-	Gtk::VBox				mixer_scroller_vpacker;
-	Gtk::VBox				list_vpacker;
-	Gtk::Label				group_display_button_label;
-	Gtk::Button				group_display_button;
-	Gtk::ScrolledWindow		track_display_scroller;
-	Gtk::ScrolledWindow		group_display_scroller;
-	Gtk::ScrolledWindow		favorite_plugins_scroller;
-	Gtk::VBox				group_display_vbox;
-	Gtk::Frame				track_display_frame;
-	Gtk::Frame				group_display_frame;
-	Gtk::Frame				favorite_plugins_frame;
-	Gtk::VPaned				rhs_pane1;
-	Gtk::VPaned				rhs_pane2;
-	Gtk::HBox				strip_packer;
-	Gtk::HBox				out_packer;
-	Gtk::HPaned				list_hpane;
+	static Mixer_UI*     _instance;
+	Gtk::VBox            _content;
+	Gtk::HBox             global_hpacker;
+	Gtk::VBox             global_vpacker;
+	Gtk::ScrolledWindow   scroller;
+	Gtk::EventBox         scroller_base;
+	Gtk::HBox             scroller_hpacker;
+	Gtk::VBox             mixer_scroller_vpacker;
+	Gtk::VBox             list_vpacker;
+	Gtk::Label            group_display_button_label;
+	Gtk::Button           group_display_button;
+	Gtk::ScrolledWindow   track_display_scroller;
+	Gtk::ScrolledWindow   group_display_scroller;
+	Gtk::ScrolledWindow   favorite_plugins_scroller;
+	Gtk::VBox             group_display_vbox;
+	Gtk::Frame            track_display_frame;
+	Gtk::Frame            group_display_frame;
+	Gtk::Frame            favorite_plugins_frame;
+	Gtkmm2ext::VPane      rhs_pane1;
+	Gtkmm2ext::VPane      rhs_pane2;
+	Gtkmm2ext::HPane      inner_pane;
+	Gtk::HBox             strip_packer;
+	Gtk::ScrolledWindow   vca_scroller;
+	Gtk::HBox             vca_hpacker;
+	Gtk::VBox             vca_vpacker;
+	Gtk::EventBox         vca_label_bar;
+	Gtk::Label            vca_label;
+	Gtk::EventBox         vca_scroller_base;
+	Gtk::HBox             out_packer;
+	Gtkmm2ext::HPane      list_hpane;
 
 	MixerGroupTabs* _group_tabs;
 
-	// for restoring window geometry.
-	int m_root_x, m_root_y, m_width, m_height;
-
-	void set_window_pos_and_size ();
-	void get_window_pos_and_size ();
-
-	bool on_key_press_event (GdkEventKey*);
-	bool on_key_release_event (GdkEventKey*);
 	bool on_scroll_event (GdkEventScroll*);
 
-	void pane_allocation_handler (Gtk::Allocation&, Gtk::Paned*);
-
 	std::list<MixerStrip *> strips;
 
+	void scroller_drag_data_received (const Glib::RefPtr<Gdk::DragContext>&, int, int, const Gtk::SelectionData&, guint, guint);
 	bool strip_scroller_button_release (GdkEventButton*);
+	bool masters_scroller_button_release (GdkEventButton*);
 	void scroll_left ();
 	void scroll_right ();
         void toggle_midi_input_active (bool flip_others);
 
-	void add_strips (ARDOUR::RouteList&);
+	void add_stripables (ARDOUR::StripableList&);
+
+	void add_routes (ARDOUR::RouteList&);
 	void remove_strip (MixerStrip *);
 
-	MixerStrip* strip_by_route (boost::shared_ptr<ARDOUR::Route>);
+	void add_masters (ARDOUR::VCAList&);
+	void remove_master (VCAMasterStrip*);
+
+	MixerStrip* strip_by_route (boost::shared_ptr<ARDOUR::Route>) const;
+	AxisView* axis_by_stripable (boost::shared_ptr<ARDOUR::Stripable>) const;
 
 	void hide_all_strips (bool with_select);
 	void unselect_all_strips();
@@ -191,6 +209,7 @@ class Mixer_UI : public Gtk::Window, public PBD::ScopedConnectionList, public AR
 	void track_name_changed (MixerStrip *);
 
 	void redisplay_track_list ();
+	void spill_redisplay (boost::shared_ptr<ARDOUR::VCA>);
 	bool no_track_list_redisplay;
 	bool track_display_button_press (GdkEventButton*);
 	void strip_width_changed ();
@@ -255,50 +274,50 @@ class Mixer_UI : public Gtk::Window, public PBD::ScopedConnectionList, public AR
         MonitorSection* _monitor_section;
 	PluginSelector    *_plugin_selector;
 
-	void strip_property_changed (const PBD::PropertyChange&, MixerStrip *);
+	void stripable_property_changed (const PBD::PropertyChange& what_changed, boost::weak_ptr<ARDOUR::Stripable> ws);
 	void route_group_property_changed (ARDOUR::RouteGroup *, const PBD::PropertyChange &);
 
 	/* various treeviews */
 
-	struct TrackDisplayModelColumns : public Gtk::TreeModel::ColumnRecord {
-	    TrackDisplayModelColumns () {
-		    add (text);
-		    add (visible);
-		    add (route);
-		    add (strip);
-	    }
-	    Gtk::TreeModelColumn<bool>           visible;
-	    Gtk::TreeModelColumn<std::string>  text;
-	    Gtk::TreeModelColumn<boost::shared_ptr<ARDOUR::Route> > route;
-	    Gtk::TreeModelColumn<MixerStrip*>    strip;
+	struct StripableDisplayModelColumns : public Gtk::TreeModel::ColumnRecord {
+		StripableDisplayModelColumns () {
+			add (text);
+			add (visible);
+			add (stripable);
+			add (strip);
+		}
+		Gtk::TreeModelColumn<bool>         visible;
+		Gtk::TreeModelColumn<std::string>  text;
+		Gtk::TreeModelColumn<boost::shared_ptr<ARDOUR::Stripable> > stripable;
+		Gtk::TreeModelColumn<AxisView*>    strip;
 	};
 
 	struct GroupDisplayModelColumns : public Gtk::TreeModel::ColumnRecord {
-	    GroupDisplayModelColumns() {
-		    add (visible);
-		    add (text);
-		    add (group);
-	    }
-	    Gtk::TreeModelColumn<bool>					visible;
-	    Gtk::TreeModelColumn<std::string>			text;
-	    Gtk::TreeModelColumn<ARDOUR::RouteGroup*>	group;
+		GroupDisplayModelColumns() {
+			add (visible);
+			add (text);
+			add (group);
+		}
+		Gtk::TreeModelColumn<bool>            visible;
+		Gtk::TreeModelColumn<std::string>         text;
+		Gtk::TreeModelColumn<ARDOUR::RouteGroup*> group;
 	};
 
 	struct PluginsDisplayModelColumns : public Gtk::TreeModel::ColumnRecord {
-	    PluginsDisplayModelColumns() {
-		    add (name);
-		    add (plugin);
-	    }
-	    Gtk::TreeModelColumn<std::string> name;
-			Gtk::TreeModelColumn<ARDOUR::PluginPresetPtr> plugin;
+		PluginsDisplayModelColumns() {
+			add (name);
+			add (plugin);
+		}
+		Gtk::TreeModelColumn<std::string> name;
+		Gtk::TreeModelColumn<ARDOUR::PluginPresetPtr> plugin;
 	};
 
 	ARDOUR::PluginInfoList favorite_order;
 	std::map<std::string, bool> favorite_ui_state;
 
-	TrackDisplayModelColumns    track_columns;
-	GroupDisplayModelColumns    group_columns;
-	PluginsDisplayModelColumns  favorite_plugins_columns;
+	StripableDisplayModelColumns stripable_columns;
+	GroupDisplayModelColumns     group_columns;
+	PluginsDisplayModelColumns   favorite_plugins_columns;
 
 	Gtk::TreeView track_display;
 	Gtk::TreeView group_display;
@@ -315,10 +334,8 @@ class Mixer_UI : public Gtk::Window, public PBD::ScopedConnectionList, public AR
 
 	Width _strip_width;
 
-        void sync_order_keys_from_treeview ();
-        void sync_treeview_from_order_keys ();
-        void reset_remote_control_ids ();
-        void reset_order_keys ();
+        void sync_presentation_info_from_treeview ();
+        void sync_treeview_from_presentation_info ();
 
         bool ignore_reorder;
 
@@ -362,8 +379,32 @@ class Mixer_UI : public Gtk::Window, public PBD::ScopedConnectionList, public AR
 
 	// true if mixer list is visible
 	bool _show_mixer_list;
-};
 
-#endif /* __ardour_mixer_ui_h__ */
+	mutable boost::weak_ptr<ARDOUR::VCA> spilled_vca;
 
+	void escape ();
 
+	Gtkmm2ext::ActionMap myactions;
+	RouteProcessorSelection _selection;
+	AxisViewSelection _axis_targets;
+
+	void vca_assign (boost::shared_ptr<ARDOUR::VCA>);
+	void vca_unassign (boost::shared_ptr<ARDOUR::VCA>);
+
+	template<class T> void control_action (boost::shared_ptr<T> (ARDOUR::Stripable::*get_control)() const);
+	void solo_action ();
+	void mute_action ();
+	void rec_enable_action ();
+	void step_gain_up_action ();
+	void step_gain_down_action ();
+	void unity_gain_action ();
+
+	void copy_processors ();
+	void cut_processors ();
+	void paste_processors ();
+	void select_all_processors ();
+	void toggle_processors ();
+	void ab_plugins ();
+};
+
+#endif /* __ardour_mixer_ui_h__ */
diff --git a/gtk2_ardour/mnemonic-us.bindings.in b/gtk2_ardour/mnemonic-us.bindings.in
deleted file mode 100644
index df7dd6f..0000000
--- a/gtk2_ardour/mnemonic-us.bindings.in
+++ /dev/null
@@ -1,406 +0,0 @@
-; this is a template file processed by tools/fmt-bindings to generate either 
-; a gtk accelmap file or a LaTeX key binding cheat sheet.
-;
-; it is the reference for any bindings or cheatsheets
-;
-;
-; FORMAT:
-; $text -> defines cheatsheet title as "text", which may contain LaTeX markup
-;
-; %group text -> defines a binding group called "group" which will have the title "text" on the cheatsheet. 
-;                may be followed by zero or more lines of descriptive text, which may contain LaTeX markup
-;
-; @group|action|binding|description -> defines an action+binding with description, as a member of a binding group
-;                                       if group starts with '-' it will not be printed in the cheatsheet.
-;                                       if group starts with '+' it will be printed in the cheatsheet no matter what
-;                                       if the group is a mouse binding group, action should contain a ':', and
-;                                            have the binding before the colon, and the target area after it
-
-;; Title
-$ARDOUR Shortcuts \linebreak Mnemonic US-Keypad
-
-;; GROUP DEFINITIONS
-
-%trans Transport \& Recording Control
-
-%sess Session \& File Handling
-
-%edit Basic Editing
-
-%vis Changing What's Visible
-
-%wvis Window Visibility
-
-%eep Editing with Edit Point
-Most edit functions operate on a single "Edit Point". The edit point can be any of: playhead (default), the mouse or an active marker. The choice of Edit Point (by default) also sets the Zoom Focus.
-
-%aep Aligning with the Edit Point
-Align operations move regions so that their start/end/sync point is at the edit point. "Relative" operations
-just align the first region and moves other selected regions to maintain relative positioning.
-
-%epp Edit Point Playback
-
-%movp Moving the Playhead
-A left click in the rulers positions the playhead unless Ardour is recording. You can use {\tt KP$\_$n} to move the 
-playhead to the n-th marker.
-
-%rop Region Operations
-
-%edit Edit Range
-There are only a few functions that refer to an "Edit Range". The current edit range is defined using combinations of the possible edit points: Playhead, Marker or Mouse.\par
-\begin{tabular}{lll}
-{\bf Edit Point} & {\bf Active Mark?} & {\bf Edit Range} \\
-Playhead & no & from Playhead to Mouse \\
-Playhead & yes & from Playhead to Active Marker \\
- & & \\
-Mouse & no & from Mouse to Playhead \\
-Mouse & yes & from Mouse to Active Marker \\
- & & \\
-Marker & no & {\it No edit range defined} \\
-Marker & yes & from Active Marker to Mouse
-\end{tabular}
-
-%select Selecting
-
-%ranges Defining Loop, Punch Range and Tempo Changes
-
-%markers Markers \& Locations
-The "move" commands all move the active marker(s). Jump to the first 9 markers using
-the keypad digits 1-9 (requires numlock).
-
-%mmode Mouse Modes
-
-%mouse Mouse Usage
-Right click on most objects and controls displays a context menu
-Shift+Right click deletes most objects. 
-OS X users without a 3 button mouse can use {\tt Option+Ctrl+Left} to simulate "Middle" for some purposes.
-Use F1 to step through mouse modes.
-
-%mobject Mouse Object Mode
-This mode provides many different operations on both regions and control points, partially depending on where you click/drag with the mouse. The "body" of a region is the area where the waveform is displayed.
-
-%mzoom Mouse Zoom Mode
-%mops Mouse Ops on Solo/Mute/Rec-enable
-%mopsolo Mouse Ops on Solo Buttons only
-%mopsfader Mouse Ops on Faders \& Plugin Controls
-
-%midi MIDI specific commands
-
-;; END GROUP DEFINITIONS
-
-;; punctuation
-
- at vis|Editor/temporal-zoom-in|equal|zoom in
- at vis|Editor/temporal-zoom-out|minus|zoom out
- at vis|Editor/zoom-to-session|<@TERTIARY@>underscore|zoom to session
- at eep|Editor/edit-cursor-to-previous-region-sync|apostrophe|EP to prev region sync
- at eep|Editor/edit-cursor-to-next-region-sync|semicolon|EP to next region sync
- at eep|Editor/cycle-edit-point|grave|next EP w/o marker
- at eep|Editor/cycle-edit-point-with-marker|<@PRIMARY@>grave|next EP w/marker
-
- at trans|Transport/ToggleRoll|space|toggle roll
- at epp|Editor/PlaySelection|<@SECONDARY@>space|play edit range
- at epp|Editor/play-from-edit-point-and-return|<@PRIMARY@><@TERTIARY@>space|play from EP \& return
- at trans|Transport/ToggleRollMaybe|<@PRIMARY@><@SECONDARY@>space|stop (keep loop/range play)
- at trans|Transport/ToggleRollForgetCapture|<@PRIMARY@>space|stop and destroy
- at trans|Transport/record-roll|<@TERTIARY@>space|start recording
-
- at trans|Editor/add-location-from-playhead|nabla|add marker
- at trans|Editor/remove-location-from-playhead|<@PRIMARY@>nabla|add marker
- at movp|Transport/alternate-GotoStart|Return|to start marker
-
- at trans|Editor/editor-fade-range|slash|fade range selection
- at rop|Region/set-fade-in-length|<@PRIMARY@>slash|set fade in length
-;;@rop|Region/toggle-region-fade-out|<@PRIMARY@>slash|toggle fade in active
- at rop|Region/set-fade-out-length|<@PRIMARY@>backslash|set fade out length
-;;@rop|Region/toggle-region-fade-out|<@PRIMARY@>backslash|toggle fade out active
-
- at eep|Editor/trim-to-previous-region|<@PRIMARY@>j|trim region to end of prev region
- at eep|Editor/trim-to-next-region|<@PRIMARY@>k|trim region to start of next region
-
- at ranges|Editor/set-loop-from-edit-range|bracketright|set loop range from edit range
-
- at ranges|Editor/set-punch-from-edit-range|bracketleft|set punch range from edit range
-
-
-;; Alt+number row:  region operations
- at rop|Region/toggle-region-mute|<@SECONDARY@>1|mute/unmute
- at rop|Region/naturalize-region|<@SECONDARY@>2|move to original position
- at rop|Region/normalize-region|<@SECONDARY@>3|normalize
- at rop|Region/reverse-region|<@SECONDARY@>4|reverse
- at rop|Region/quantize-region|<@SECONDARY@>5|quantize MIDI notes \linebreak[4] in selected region(s)
- at rop|Region/boost-region-gain|<@SECONDARY@>6|increase region gain
- at rop|Region/cut-region-gain|<@SECONDARY@>7|reduce region gain
- at rop|Region/pitch-shift-region|<@SECONDARY@>8|transpose
- at rop|Region/lower-region|<@SECONDARY@>9|lower region layer
- at rop|Region/raise-region|<@SECONDARY@>0|raise region layer
-
-;; letters
-;; TOP ROW
-
- at sess|Common/Quit|<@PRIMARY@>q|quit
- at sess|Common/Hide|<@PRIMARY@>h|hide
- at movp|Editor/jump-forward-to-mark|w|to next mark
- at movp|Editor/jump-backward-to-mark|q|to previous mark
-
-;; note that ctrl-w is special and consumed by the keyboard snooper
-
- at select|Editor/select-all-before-edit-cursor|<@PRIMARY@>e|select all before EP
- at rop|Region/export-region|<@PRIMARY@><@SECONDARY@>e|export selected region(s)
- at sess|Main/ExportAudio|<@SECONDARY@>e|export session
- at select|Editor/select-all-after-edit-cursor|<@PRIMARY@><@TERTIARY@>e|select all after EP
- at vis|Editor/show-editor-mixer|<@TERTIARY@>e|toggle editor window mixer
- at wvis|Common/goto-editor|<@SECONDARY@>e|toggle editor window
- at mmode|MouseMode/set-mouse-mode-range|r|range mode
- at edit|Editor/redo|<@PRIMARY@>r|redo
- at trans|Transport/Record|<@TERTIARY@>r|engage record
- at mmode|MouseMode/set-mouse-mode-timefx|t|timefx mode
- at eep|Editor/select-all-tracks|<@PRIMARY@>t|select all tracks
- at mmode|MouseMode/set-mouse-mode-object-range|y|link object/range tools
- at edit|Editor/alternate-redo|<@PRIMARY@>y|redo
- at select|Editor/select-all-between-cursors|<@PRIMARY@>u|all enclosed by edit range
- at select|Editor/select-all-within-cursors|u|all present in edit range
- at eep|Region/insert-region-from-region-list|i|insert from region list
- at select|Editor/invert-selection|<@TERTIARY@>i|invert selection
- at sess|Editor/addExistingAudioFiles|<@PRIMARY@>i|import audio files
- at sess|Editor/toggle-midi-input-active|<@SECONDARY@>i|toggle sel. track MIDI input
- at mmode|MouseMode/set-mouse-mode-object|g|object mode
- at mmode|MouseMode/set-mouse-mode-content|e|content mode
- at sess|Main/Open|<@PRIMARY@>o|open an existing session
- at sess|Main/Recent|<@PRIMARY@><@TERTIARY@>o|open a recent session
- at wvis|Window/toggle-session-options-editor|<@SECONDARY@>o|toggle preferences dialog
- at trans|Editor/set-playhead|p|set playhead position
- at select|Editor/select-all-before-playhead|<@PRIMARY@>p|all before playhead
- at wvis|Window/toggle-rc-options-editor|<@SECONDARY@>p|toggle preferences dialog
- at midi|MIDI/panic|<@PRIMARY@><@SECONDARY@>p|MIDI panic (stop all notes etc)
- at select|Editor/select-all-after-playhead|<@PRIMARY@><@TERTIARY@>p|all after playhead
-
-;; MIDDLE ROW
-
- at aep|Region/align-regions-sync-relative|a|align sync points (relative)
- at select|Editor/select-all-objects|<@PRIMARY@>a|select all objects
- at aep|Region/align-regions-end|<@SECONDARY@>a|align end(s)
- at aep|Region/align-regions-sync|<@TERTIARY@>a|align sync points
- at aep|Region/align-regions-start|<@PRIMARY@><@SECONDARY@>a|align start(s)
- at aep|Region/align-regions-start-relative|<@PRIMARY@><@TERTIARY@>a|align start(s) relative
- at rop|Region/split-region|s|split
- at sess|Common/Save|<@PRIMARY@>s|save session
- at sess|Main/SnapshotStay|<@PRIMARY@><@TERTIARY@>s|snapshot session
- at trans|Editor/track-solo-toggle|<@SECONDARY@>s|toggle track solo status
- at mmode|MouseMode/set-mouse-mode-draw|d|note-draw mode
- at rop|Region/duplicate-region|<@SECONDARY@>d|duplicate region (once)
- at rop|Region/multi-duplicate-region|<@TERTIARY@>d|duplicate region (multi)
- at select|Editor/select-all-in-punch-range|<@PRIMARY@>d|select all in punch range
- at vis|Editor/fit-selection|f|fit selection vertically
- at trans|Editor/toggle-follow-playhead|<@PRIMARY@>f|toggle playhead tracking
- at wvis|Region/show-rhythm-ferret|<@SECONDARY@>f|show rhythm ferret window 
- at trans|Transport/ToggleFollowEdits|<@TERTIARY@>f|toggle playhead follows edits
- at wvis|Common/ToggleMaximalEditor|<@PRIMARY@><@SECONDARY@>f|maximise editor space
- at wvis|Common/ToggleMaximalMixer|<@PRIMARY@><@TERTIARY@>f|maximise mixer space
- at mmode|MouseMode/set-mouse-mode-gain|g|region gain mode
- at epp|Region/play-selected-regions|h|play selected region(s)
- at eep|Region/trim-front|j|trim front
- at eep|Region/trim-back|k|trim back
- at wvis|Window/toggle-key-editor|<@SECONDARY@>k|toggle key bindings editor
- at trans|Transport/Loop|l|loop play (the loop range)
- at select|Editor/select-all-in-loop-range|<@PRIMARY@>l|select all in loop range
- at wvis|Window/toggle-locations|<@SECONDARY@>l| toggle locations dialog
-
-;; BOTTOM ROW
-
- at mmode|Editor/zoom-to-selection|z|zoom to selection
- at vis|Editor/zoom-to-selection-both-axes|<@PRIMARY@><@SECONDARY@>z|zoom to selection, x and y
- at edit|Editor/undo|<@PRIMARY@>z|undo
- at edit|Editor/alternate-alternate-redo|<@PRIMARY@><@TERTIARY@>z|redo
- at vis|Editor/toggle-zoom|<@TERTIARY@>z|toggle last 2 zoom states
- at mmode|MouseMode/set-mouse-mode-cut|c|cut mode
- at edit|Editor/editor-cut|<@PRIMARY@>x|cut
- at edit|Editor/editor-copy|<@PRIMARY@>c|copy
- at wvis|Window/toggle-big-clock|<@SECONDARY@>c|toggle big clock
- at -group|Editor/crop<@PRIMARY@><@TERTIARY@>c|crop
- at rop|Region/set-region-sync-position|v|set region sync point
- at edit|Editor/editor-paste|<@PRIMARY@>v|paste
- at edit|Editor/ToggleJadeo|<@SECONDARY@>v|video window
- at -group|Editor/brush-at-mouse|<@PRIMARY@>b|some text
- at wvis|Common/toggle-meterbridge|<@SECONDARY@>b|show meter bridge
- at trans|Editor/track-record-enable-toggle|<@TERTIARY@>b|toggle track rec-enable 
- at sess|Main/AddTrackBus|<@PRIMARY@><@TERTIARY@>n|add track(s) or bus(ses)
- at wvis|Window/toggle-audio-connection-manager|<@SECONDARY@>n|toggle global audio patchbay
- at sess|Main/New|<@PRIMARY@>n|open a new session
- at wvis|Common/toggle-editor-mixer|<@SECONDARY@>m|rotate editor \& mixer window
- at wvis|Window/toggle-midi-connection-manager|<@SECONDARY@><@TERTIARY@>m|toggle global midi patchbay
-
-;; arrow keys, navigation etc.
-
- at vis|Editor/step-tracks-up|uparrow|scroll up (step)
- at trans|Transport/TransitionToRoll|<@TERTIARY@>uparrow|transition to roll
- at select|Editor/select-prev-route|<@SECONDARY@>uparrow|select previous track/bus
- at vis|Editor/move-selected-tracks-up|<@PRIMARY@>uparrow|move selected tracks up
-
- at vis|Editor/step-tracks-down|downarrow|scroll down (step)
- at trans|Transport/TransitionToReverse|<@TERTIARY@>downarrow|transition to reverse
- at select|Editor/select-next-route|<@SECONDARY@>downarrow|select next track/bus
- at vis|Editor/move-selected-tracks-down|<@PRIMARY@>downarrow|move selected tracks down
-
- at movp|Editor/playhead-to-previous-region-boundary|leftarrow|to previous region edge
-;@movp|Editor/playhead-to-previous-region-boundary-noselection|<@LEVEL4@>leftarrow|to previous edge \linebreak[4] (ignoring selection)
- at movp|Editor/playhead-to-previous-region-sync|<@PRIMARY@><@SECONDARY@>leftarrow|to previous region sync
- at movp|Editor/tab-to-transient-backwards|<@PRIMARY@>leftarrow|to previous transient
- at movp|Editor/nudge-playhead-backward|<@SECONDARY@>leftarrow|nudge backward
- at movp|Editor/playhead-backward-to-grid|<@SECONDARY@><@TERTIARY@>leftarrow|to previous grid point
- at trans|Transport/Rewind|<@TERTIARY@>leftarrow|rewind
- at markers|Editor/selected-marker-to-previous-region-boundary|<@PRIMARY@><@TERTIARY@>leftarrow|move to prev region edge
-
- at movp|Editor/playhead-to-next-region-boundary|rightarrow|to next region edge
-;@movp|Editor/playhead-to-next-region-boundary-noselection|<@LEVEL4@>rightarrow|to next region edge \linebreak[4] (ignoring selection)
- at movp|Editor/playhead-to-next-region-sync|<@PRIMARY@><@SECONDARY@>rightarrow|to next region sync
- at movp|Editor/tab-to-transient-forwards|<@PRIMARY@>rightarrow|to next transient
- at movp|Editor/nudge-playhead-forward|<@SECONDARY@>rightarrow|nudge forwards
- at movp|Editor/playhead-forward-to-grid|<@SECONDARY@><@TERTIARY@>rightarrow|to next grid point
- at trans|Transport/Forward|<@TERTIARY@>rightarrow|fast forward
- at markers|Editor/selected-marker-to-next-region-boundary|<@PRIMARY@><@TERTIARY@>rightarrow|move to next region edge
-
- at vis|Editor/scroll-tracks-down|Page_Down|scroll down (page)
- at vis|Editor/scroll-tracks-up|Page_Up|scroll up (page)
- at movp|Transport/GotoStart|Home|to start marker
- at movp|Transport/GotoEnd|End|to end marker
- at edit|Editor/editor-delete|Delete|delete
- at edit|Editor/alternate-editor-delete|BackSpace|backspace (delete)
-
- at select|Editor/escape|Escape|break drag or deselect all
-
-;; keypad
-
- at rop|Region/nudge-backward|KP_Subtract|nudge backward
- at -group|Editor/nudge-next-backward|<@PRIMARY@>KP_Subtract|some text
-
- at movp|Editor/alternate-jump-forward-to-mark|<@PRIMARY@>KP_Right|to next mark
- at movp|Editor/alternate-jump-backward-to-mark|<@PRIMARY@>KP_Left|to previous mark
-
- at rop|Region/nudge-forward|KP_Add|nudge forward
- at -group|Editor/nudge-next-forward|<@PRIMARY@>KP_Add|some text
-
- at -group|Editor/start-range|comma|some text
- at -group|Editor/finish-range|period|some text
- at -group|Editor/alt-start-range|<@PRIMARY@>KP_Down|set the start of the range selection
- at -group|Editor/alt-finish-range|<@PRIMARY@>KP_Up|set the end of the range selection
- at -group|Editor/start-punch-range|<@PRIMARY@>comma|set the start of the Punch range
- at -group|Editor/finish-punch-range|<@PRIMARY@>period|set the end of the Punch range
- at -group|Editor/start-loop-range|<@SECONDARY@>comma|set the start of the Loop range
- at -group|Editor/finish-loop-range|<@SECONDARY@>period|set the end of the Loop range
-
- at markers|Editor/alternate-add-location-from-playhead|KP_Enter|add mark at playhead
- at markers|Editor/alternate-remove-location-from-playhead|<@PRIMARY@>KP_Enter|add mark at playhead
- at wvis|Transport/focus-on-clock|KP_Divide|focus on main clock
-
- at movp|Transport/numpad-decimal|KP_Decimal|numpad decimal should initiate and finalize a locate-to-marker
- at movp|Transport/alternate-numpad-decimal|KP_Separator|(some keybd layouts have separator instead of decimal)
-
- at movp|Transport/numpad-0|KP_0|some text
- at -group|Transport/numpad-1|KP_1|some text
- at -group|Transport/numpad-2|KP_2|some text
- at -group|Transport/numpad-3|KP_3|some text
- at -group|Transport/numpad-4|KP_4|some text
- at -group|Transport/numpad-5|KP_5|some text
- at -group|Transport/numpad-6|KP_6|some text
- at -group|Transport/numpad-7|KP_7|some text
- at -group|Transport/numpad-8|KP_8|some text
- at -group|Transport/numpad-9|KP_9|some text
-
-;; F-N keys
-
- at -group|Editor/edit-cursor-to-range-start|F1|some text
- at -group|Editor/edit-cursor-to-range-end|F2|some text
- at -group|Editor/pitch-shift-region|F5|some text
-
- at -group|Editor/save-visual-state-1|<@PRIMARY@>F1|some text
- at -group|Editor/save-visual-state-2|<@PRIMARY@>F2|some text
- at -group|Editor/save-visual-state-3|<@PRIMARY@>F3|some text
- at -group|Editor/save-visual-state-4|<@PRIMARY@>F4|some text
- at -group|Editor/save-visual-state-5|<@PRIMARY@>F5|some text
- at -group|Editor/save-visual-state-6|<@PRIMARY@>F6|some text
- at -group|Editor/save-visual-state-7|<@PRIMARY@>F7|some text
- at -group|Editor/save-visual-state-8|<@PRIMARY@>F8|some text
- at -group|Editor/save-visual-state-9|<@PRIMARY@>F9|some text
- at -group|Editor/save-visual-state-10|<@PRIMARY@>F10|some text
- at -group|Editor/save-visual-state-11|<@PRIMARY@>F11|some text
- at -group|Editor/save-visual-state-12|<@PRIMARY@>F12|some text
-
- at -group|Editor/goto-visual-state-1|F1|some text
- at -group|Editor/goto-visual-state-2|F2|some text
- at -group|Editor/goto-visual-state-3|F3|some text
- at -group|Editor/goto-visual-state-4|F4|some text
- at -group|Editor/goto-visual-state-5|F5|some text
- at -group|Editor/goto-visual-state-6|F6|some text
- at -group|Editor/goto-visual-state-7|F7|some text
- at -group|Editor/goto-visual-state-8|F8|some text
- at -group|Editor/goto-visual-state-9|F9|some text
- at -group|Editor/goto-visual-state-10|F10|some text
- at -group|Editor/goto-visual-state-11|F11|some text
- at -group|Editor/goto-visual-state-12|F12|some text
-
-
-;; numbers
-
- at eep|Editor/cycle-zoom-focus|1|cycle to next zoom focus
- at eep|Editor/cycle-snap-mode|2|cycle to next grid snap mode
- at eep|Editor/prev-snap-choice|3|use next grid unit
- at eep|Editor/prev-snap-choice-music-only|<@PRIMARY@>3|use previous grid unit
- at eep|Editor/next-snap-choice|4|use next grid unit
- at eep|Editor/next-snap-choice-music-only|<@PRIMARY@>4|use next musical grid unit
- at trans|Transport/ToggleAutoPlay|5|toggle auto play
- at trans|Transport/ToggleAutoReturn|6|toggle auto return
- at trans|Transport/ToggleClick|7|toggle click (metronome)
- at ranges|Region/set-tempo-from-region|9|set tempo (1 bar) from region(s)
- at ranges|Editor/set-tempo-from-edit-range|0|set tempo (1 bar) from edit range
-
-; mouse stuff
-
- at +mobject|foo|left-click:on body|select
- at +mobject|foo|<@TERTIARY@>left-click:on body|extend selection
- at +mobject|foo|<@PRIMARY@>left-click:on body|add/remove selection
- at +mobject|foo|left-drag:on body|move region(s)
- at +mobject|foo|<@PRIMARY@>left-drag:on body|copy+move region(s)
- at +mobject|foo|<@PRIMARY@>middle-drag:on body|fixed time copy+move
- at +mobject|foo|middle-drag:on body|fixed time move
- at +mobject|foo|<@SECONDARY@><@TERTIARY@>midde:on body|lower region
- at +mobject|foo|<@TERTIARY@>middle:on body|raise region
- at +mobject|foo|<@PRIMARY@>left-drag:in trim bar|slip audio in region
- at +mobject|foo|left-click:in trim bar|set region start
- at +mobject|foo|middle:in trim bar|set region end
- at +mobject|foo|left-drag:near ends of trim bar|adjust region edges
- at +mobject|foo|left-click:in auto track|add control point
- at +mobject|foo|left-drag:on point|move control point
- at +mobject|foo|middle-drag:on point|fixed time adjust
- at +mobject|foo|<@PRIMARY@>left-drag:on point|move point+later points
- at +mobject|foo|<@PRIMARY@>middle-drag:on point|fixed time move
- at +mobject|foo|left-drag:on line|move line segment
- at +mobject|foo|<@PRIMARY@><@SECONDARY@>left-drag:on regions|rubber-band select
- at +mobject|foo|left-drag:in auto track|rubber-band select\linebreak control points
- at +mobject|foo|left-drag:empty space|rubber-band select
-
-; mouse zoom
- at +mzoom|foo|<@PRIMARY@>middle|zoom to session
- at +mzoom|foo|middle-click|zoom out
- at +mzoom|foo|left-click|zoom in
- at +mzoom|foo|left+drag |define the new visible area
-
-; mouse solo etc.
- at +mops|foo|<@PRIMARY@>middle-click|learn MIDI control
- at +mops|foo|<@PRIMARY@><@TERTIARY@>left-click|apply to all tracks/busses
- at +mops|foo|<@PRIMARY@>left-click|apply to group
- at +mops|foo|middle-click|momentary switch
- at +mops|foo|left-click|apply to track or active group
-
-; mouse solo
-
- at +mopsolo|foo|<@PRIMARY@><@SECONDARY@>left-click|exclusive solo
- at +mopsolo|foo|<@TERTIARY@>left-click|temporary latched solo
-
-; mouse fader etc.
-
- at +mopsfader|foo|<@PRIMARY@>middle-click|learn MIDI control
- at +mopsfader|foo|<@TERTIARY@>left-click|reset to default
- at +mopsfader|foo|<@PRIMARY@><@SECONDARY@>left-drag|finest-drag control
- at +mopsfader|foo|<@PRIMARY@>left-drag|fine-drag control
- at +mopsfader|foo|left-drag|adjust
diff --git a/gtk2_ardour/monitor.bindings b/gtk2_ardour/monitor.bindings
new file mode 100644
index 0000000..d7cafff
--- /dev/null
+++ b/gtk2_ardour/monitor.bindings
@@ -0,0 +1,24 @@
+<Bindings name="Monitor Section">
+  <Press>
+     <Binding key="m" action="Monitor/monitor-mono"/>
+     <Binding key="c" action="Monitor/monitor-cut-all"/>
+     <Binding key="d" action="Monitor/monitor-dim-all"/>
+     <Binding key="e" action="Monitor/toggle-exclusive-solo"/>
+     <Binding key="Shift-o" action="Monitor/toggle-mute-overrides-solo"/>
+     <Binding key="b" action="Monitor/toggle-monitor-processor-box"/>
+     
+     <Binding key="l" action="Monitor/monitor-cut-0"/>
+     <Binding key="Primary-l" action="Monitor/monitor-solo-0"/>
+     <Binding key="Secondary-l" action="Monitor/monitor-dim-0"/>
+     <Binding key="Tertiary-l" action="Monitor/monitor-invert-0"/>
+
+     <Binding key="r" action="Monitor/monitor-cut-1"/>
+     <Binding key="Primary-r" action="Monitor/monitor-solo-1"/>
+     <Binding key="Secondary-r" action="Monitor/monitor-dim-1"/>
+     <Binding key="Tertiary-r" action="Monitor/monitor-invert-1"/>
+
+     <Binding key="i" action="Solo/solo-use-in-place"/>
+     <Binding key="p" action="Solo/solo-use-pfl"/>
+     <Binding key="a" action="Solo/solo-use-afl"/>
+  </Press>
+</Bindings>
diff --git a/gtk2_ardour/monitor_section.cc b/gtk2_ardour/monitor_section.cc
index d940258..2fcc581 100644
--- a/gtk2_ardour/monitor_section.cc
+++ b/gtk2_ardour/monitor_section.cc
@@ -1,19 +1,19 @@
 /*
-    Copyright (C) 2012 Paul Davis
+  Copyright (C) 2012 Paul Davis
 
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
+  This program is free software; you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation; either version 2 of the License, or
+  (at your option) any later version.
 
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
 
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 
 */
 
@@ -36,9 +36,11 @@
 #include "ardour/monitor_processor.h"
 #include "ardour/port.h"
 #include "ardour/route.h"
+#include "ardour/solo_isolate_control.h"
 #include "ardour/user_bundle.h"
 #include "ardour/plugin_manager.h"
 
+#include "ardour_ui.h"
 #include "gui_thread.h"
 #include "monitor_section.h"
 #include "public_editor.h"
@@ -47,7 +49,7 @@
 #include "ui_config.h"
 #include "utils.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 using namespace ARDOUR_UI_UTILS;
@@ -61,11 +63,11 @@ Glib::RefPtr<ActionGroup> MonitorSection::monitor_actions;
 #define PX_SCALE(px) std::max((float)px, rintf((float)px * UIConfiguration::instance().get_ui_scale()))
 
 MonitorSection::MonitorSection (Session* s)
-	: AxisView (s)
+	: SessionHandlePtr (s)
 	, RouteUI (s)
 	, _tearoff (0)
 	, channel_table_viewport (*channel_table_scroller.get_hadjustment()
-	, *channel_table_scroller.get_vadjustment ())
+	                          , *channel_table_scroller.get_vadjustment ())
 	, gain_control (0)
 	, dim_control (0)
 	, solo_boost_control (0)
@@ -83,6 +85,8 @@ MonitorSection::MonitorSection (Session* s)
 	, toggle_processorbox_button (ArdourButton::default_elements)
 	, _inhibit_solo_model_update (false)
 	, _ui_initialized (false)
+	, myactions (X_("monitor section"))
+	, bindings (0)
 {
 
 	using namespace Menu_Helpers;
@@ -91,8 +95,10 @@ MonitorSection::MonitorSection (Session* s)
 
 	if (!monitor_actions) {
 		register_actions ();
-	} else {
-		connect_actions ();
+		load_bindings ();
+		if (bindings) {
+			set_data ("ardour-bindings", bindings);
+		}
 	}
 
 	_plugin_selector = new PluginSelector (PluginManager::instance());
@@ -182,11 +188,10 @@ MonitorSection::MonitorSection (Session* s)
 	/* Processor Box hide/shos */
 	toggle_processorbox_button.set_text (_("Processors"));
 	toggle_processorbox_button.set_name (X_("monitor section processors toggle"));
-	set_tooltip (&toggle_processorbox_button, _("Allow to add monitor effect processors"));
+	set_tooltip (&toggle_processorbox_button, _("Allow one to add monitor effect processors"));
 
-	proctoggle = ToggleAction::create ();
+	proctoggle = ActionManager::get_action (X_("Monitor"), X_("toggle-monitor-processor-box"));
 	toggle_processorbox_button.set_related_action (proctoggle);
-	proctoggle->signal_toggled().connect (sigc::mem_fun(*this, &MonitorSection::update_processor_box), false);
 
 	/* Knobs */
 	Label* solo_boost_label;
@@ -390,7 +395,7 @@ MonitorSection::MonitorSection (Session* s)
 	mono_dim_box->pack_start (mono_button, true, true);
 	mono_dim_box->pack_end (dim_all_button, true, true);
 
-	// master gain 
+	// master gain
 	Label* spin_label = manage (new Label (_("Monitor")));
 	VBox* spin_packer = manage (new VBox);
 	spin_packer->set_spacing (PX_SCALE(2));
@@ -407,7 +412,7 @@ MonitorSection::MonitorSection (Session* s)
 	lower_packer->pack_start (*mono_dim_box,        false, false, PX_SCALE(2));
 	lower_packer->pack_start (cut_all_button,       false, false, PX_SCALE(2));
 
-		// output port select
+	// output port select
 	VBox* out_packer = manage (new VBox);
 	out_packer->set_spacing (PX_SCALE(2));
 	out_packer->pack_start (*output_label, false, false);
@@ -429,6 +434,8 @@ MonitorSection::MonitorSection (Session* s)
 	hpacker.set_spacing (0);
 	hpacker.pack_start (vpacker, true, true);
 
+	add (hpacker);
+
 	gain_control->show_all ();
 	gain_display->show_all ();
 	dim_control->show_all ();
@@ -457,7 +464,11 @@ MonitorSection::MonitorSection (Session* s)
 	output_button->signal_button_press_event().connect (sigc::mem_fun(*this, &MonitorSection::output_press), false);
 	output_button->signal_button_release_event().connect (sigc::mem_fun(*this, &MonitorSection::output_release), false);
 
-	_tearoff = new TearOff (hpacker);
+	signal_enter_notify_event().connect (sigc::mem_fun (*this, &MonitorSection::enter_handler));
+	signal_leave_notify_event().connect (sigc::mem_fun (*this, &MonitorSection::leave_handler));
+	set_flags (CAN_FOCUS);
+
+	_tearoff = new TearOff (*this);
 
 	if (!UIConfiguration::instance().get_floating_monitor_section()) {
 		/* if torn off, make this a normal window
@@ -466,7 +477,7 @@ MonitorSection::MonitorSection (Session* s)
 		_tearoff->tearoff_window().set_type_hint (Gdk::WINDOW_TYPE_HINT_NORMAL);
 	}
 	_tearoff->tearoff_window().set_title (X_("Monitor"));
-	_tearoff->tearoff_window().signal_key_press_event().connect (sigc::ptr_fun (forward_key_press), false);
+	_tearoff->tearoff_window().signal_key_press_event().connect (sigc::bind (sigc::ptr_fun (relay_key_press), (Gtk::Window*) &_tearoff->tearoff_window()), false);
 
 	update_output_display ();
 	update_processor_box ();
@@ -488,26 +499,55 @@ MonitorSection::~MonitorSection ()
 	_channel_buttons.clear ();
 	_output_changed_connection.disconnect ();
 
-	delete insert_box;
-	delete output_button;
-	delete gain_control;
-	delete gain_display;
-	delete dim_control;
-	delete dim_display;
-	delete solo_boost_control;
-	delete solo_boost_display;
-	delete solo_cut_control;
-	delete solo_cut_display;
-	delete _tearoff;
-	delete _output_selector;
-	_output_selector = 0;
+	delete insert_box; insert_box = 0;
+	delete output_button; output_button = 0;
+	delete gain_control; gain_control = 0;
+	delete gain_display; gain_display = 0;
+	delete dim_control; dim_control = 0;
+	delete dim_display; dim_display = 0;
+	delete solo_boost_control; solo_boost_control = 0;
+	delete solo_boost_display; solo_boost_display = 0;
+	delete solo_cut_control; solo_cut_control = 0;
+	delete solo_cut_display; solo_cut_display = 0;
+	delete _tearoff; _tearoff = 0;
+	delete _output_selector; _output_selector = 0;
+}
+
+bool
+MonitorSection::enter_handler (GdkEventCrossing* ev)
+{
+	grab_focus ();
+	return false;
 }
 
+bool
+MonitorSection::leave_handler (GdkEventCrossing* ev)
+{
+	switch (ev->detail) {
+	case GDK_NOTIFY_INFERIOR:
+		return false;
+	default:
+		break;
+	}
+
+	/* cancel focus if we're not torn off. With X11 WM's that do
+	 * focus-follows-mouse, focus will be taken from us anyway.
+	 */
+
+	Widget* top = get_toplevel();
+
+	if (top->is_toplevel() && top != &_tearoff->tearoff_window()) {
+		Window* win = dynamic_cast<Window*> (top);
+		gtk_window_set_focus (win->gobj(), 0);
+	}
+
+	return false;
+}
 
 void
 MonitorSection::update_processor_box ()
 {
-	bool show_processor_box = proctoggle->get_active ();
+	bool show_processor_box = Glib::RefPtr<ToggleAction>::cast_dynamic (proctoggle)->get_active ();
 
 	if (count_processors () > 0 && !show_processor_box) {
 		toggle_processorbox_button.set_name (X_("monitor section processors present"));
@@ -537,7 +577,7 @@ MonitorSection::update_processor_box ()
 void
 MonitorSection::set_session (Session* s)
 {
-	AxisView::set_session (s);
+	RouteUI::set_session (s);
 	_plugin_selector->set_session (_session);
 
 	if (_session) {
@@ -852,67 +892,66 @@ MonitorSection::register_actions ()
 	string action_descr;
 	Glib::RefPtr<Action> act;
 
-	monitor_actions = ActionGroup::create (X_("Monitor"));
-	ActionManager::add_action_group (monitor_actions);
+	monitor_actions = myactions.create_action_group (X_("Monitor"));
 
-	ActionManager::register_toggle_action (monitor_actions, "monitor-mono", "", _("Switch monitor to mono"),
+	myactions.register_toggle_action (monitor_actions, "monitor-mono", _("Switch monitor to mono"),
 			sigc::mem_fun (*this, &MonitorSection::mono));
 
-	ActionManager::register_toggle_action (monitor_actions, "monitor-cut-all", "", _("Cut monitor"),
+	myactions.register_toggle_action (monitor_actions, "monitor-cut-all", _("Cut monitor"),
 			sigc::mem_fun (*this, &MonitorSection::cut_all));
 
-	ActionManager::register_toggle_action (monitor_actions, "monitor-dim-all", "", _("Dim monitor"),
+	myactions.register_toggle_action (monitor_actions, "monitor-dim-all", _("Dim monitor"),
 			sigc::mem_fun (*this, &MonitorSection::dim_all));
 
-	act = ActionManager::register_toggle_action (monitor_actions, "toggle-exclusive-solo", "", _("Toggle exclusive solo mode"),
+	act = myactions.register_toggle_action (monitor_actions, "toggle-exclusive-solo", _("Toggle exclusive solo mode"),
 			sigc::mem_fun (*this, &MonitorSection::toggle_exclusive_solo));
 
 	Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act);
 	tact->set_active (Config->get_exclusive_solo());
 
-	act = ActionManager::register_toggle_action (monitor_actions, "toggle-mute-overrides-solo", "", _("Toggle mute overrides solo mode"),
+	act = myactions.register_toggle_action (monitor_actions, "toggle-mute-overrides-solo", _("Toggle mute overrides solo mode"),
 			sigc::mem_fun (*this, &MonitorSection::toggle_mute_overrides_solo));
 
 	tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act);
 	tact->set_active (Config->get_solo_mute_override());
 
-
 	for (uint32_t chn = 0; chn < 16; ++chn) {
 
 		action_name = string_compose (X_("monitor-cut-%1"), chn);
 		action_descr = string_compose (_("Cut monitor channel %1"), chn);
-		ActionManager::register_toggle_action (monitor_actions, action_name.c_str(), "", action_descr.c_str(),
+		myactions.register_toggle_action (monitor_actions, action_name.c_str(), action_descr.c_str(),
 				sigc::bind (sigc::mem_fun (*this, &MonitorSection::cut_channel), chn));
 
 		action_name = string_compose (X_("monitor-dim-%1"), chn);
 		action_descr = string_compose (_("Dim monitor channel %1"), chn);
-		ActionManager::register_toggle_action (monitor_actions, action_name.c_str(), "", action_descr.c_str(),
+		myactions.register_toggle_action (monitor_actions, action_name.c_str(), action_descr.c_str(),
 				sigc::bind (sigc::mem_fun (*this, &MonitorSection::dim_channel), chn));
 
 		action_name = string_compose (X_("monitor-solo-%1"), chn);
 		action_descr = string_compose (_("Solo monitor channel %1"), chn);
-		ActionManager::register_toggle_action (monitor_actions, action_name.c_str(), "", action_descr.c_str(),
+		myactions.register_toggle_action (monitor_actions, action_name.c_str(), action_descr.c_str(),
 				sigc::bind (sigc::mem_fun (*this, &MonitorSection::solo_channel), chn));
 
 		action_name = string_compose (X_("monitor-invert-%1"), chn);
 		action_descr = string_compose (_("Invert monitor channel %1"), chn);
-		ActionManager::register_toggle_action (monitor_actions, action_name.c_str(), "", action_descr.c_str(),
+		myactions.register_toggle_action (monitor_actions, action_name.c_str(), action_descr.c_str(),
 				sigc::bind (sigc::mem_fun (*this, &MonitorSection::invert_channel), chn));
 
 	}
 
 
-	Glib::RefPtr<ActionGroup> solo_actions = ActionGroup::create (X_("Solo"));
+	Glib::RefPtr<ActionGroup> solo_actions = myactions.create_action_group (X_("Solo"));
 	RadioAction::Group solo_group;
 
-	ActionManager::register_radio_action (solo_actions, solo_group, "solo-use-in-place", "", _("In-place solo"),
+	myactions.register_radio_action (solo_actions, solo_group, "solo-use-in-place", _("In-place solo"),
 			sigc::mem_fun (*this, &MonitorSection::solo_use_in_place));
-	ActionManager::register_radio_action (solo_actions, solo_group, "solo-use-afl", "", _("After Fade Listen (AFL) solo"),
+	myactions.register_radio_action (solo_actions, solo_group, "solo-use-afl", _("After Fade Listen (AFL) solo"),
 			sigc::mem_fun (*this, &MonitorSection::solo_use_afl));
-	ActionManager::register_radio_action (solo_actions, solo_group, "solo-use-pfl", "", _("Pre Fade Listen (PFL) solo"),
+	myactions.register_radio_action (solo_actions, solo_group, "solo-use-pfl", _("Pre Fade Listen (PFL) solo"),
 			sigc::mem_fun (*this, &MonitorSection::solo_use_pfl));
 
-	ActionManager::add_action_group (solo_actions);
+	myactions.register_toggle_action (monitor_actions, "toggle-monitor-processor-box", _("Toggle Monitor Section Processor Box"),
+			sigc::mem_fun(*this, &MonitorSection::update_processor_box));
 }
 
 void
@@ -1208,7 +1247,7 @@ MonitorSection::cancel_isolate (GdkEventButton*)
 {
 	if (_session) {
 		boost::shared_ptr<RouteList> rl (_session->get_routes ());
-		_session->set_solo_isolated (rl, false, Session::rt_cleanup, Controllable::NoGroup);
+		_session->set_controls (route_list_to_control_list (rl, &Stripable::solo_isolate_control), 0.0, Controllable::NoGroup);
 	}
 
 	return true;
@@ -1629,6 +1668,12 @@ MonitorSection::port_connected_or_disconnected (boost::weak_ptr<Port> wa, boost:
 }
 
 void
+MonitorSection::load_bindings ()
+{
+	bindings = Bindings::get_bindings (X_("Monitor Section"), myactions);
+}
+
+void
 MonitorSection::help_count_processors (boost::weak_ptr<Processor> p, uint32_t* cnt) const
 {
 	boost::shared_ptr<Processor> processor (p.lock ());
@@ -1656,3 +1701,4 @@ MonitorSection::processors_changed (ARDOUR::RouteProcessorChange)
 {
 	update_processor_box ();
 }
+
diff --git a/gtk2_ardour/monitor_section.h b/gtk2_ardour/monitor_section.h
index a0339a7..8a3c23a 100644
--- a/gtk2_ardour/monitor_section.h
+++ b/gtk2_ardour/monitor_section.h
@@ -19,13 +19,14 @@
 
 #include <gtkmm/box.h>
 #include <gtkmm/table.h>
+#include <gtkmm/eventbox.h>
 
 #include "gtkmm2ext/bindable_button.h"
+#include "gtkmm2ext/bindings.h"
 
 #include "ardour_button.h"
 #include "ardour_knob.h"
 #include "ardour_display.h"
-#include "axis_view.h"
 #include "level_meter.h"
 #include "route_ui.h"
 #include "monitor_selector.h"
@@ -38,9 +39,9 @@ namespace Gtkmm2ext {
 	class TearOff;
 }
 
-class MonitorSection : public RouteUI
+class MonitorSection : public RouteUI, public Gtk::EventBox
 {
-	public:
+  public:
 	MonitorSection (ARDOUR::Session*);
 	~MonitorSection ();
 
@@ -166,6 +167,8 @@ class MonitorSection : public RouteUI
 
 	void update_processor_box ();
 
+	void route_property_changed (const PBD::PropertyChange&) {}
+
 	ProcessorBox* insert_box;
 	PluginSelector* _plugin_selector;
 	RouteProcessorSelection _rr_selection;
@@ -173,6 +176,14 @@ class MonitorSection : public RouteUI
 	uint32_t count_processors ();
 
 	void processors_changed (ARDOUR::RouteProcessorChange);
-	Glib::RefPtr<Gtk::ToggleAction> proctoggle;
+	Glib::RefPtr<Gtk::Action> proctoggle;
 	bool _ui_initialized;
+
+  private:
+	Gtkmm2ext::ActionMap myactions;
+	Gtkmm2ext::Bindings* bindings;
+
+	void load_bindings ();
+	bool enter_handler (GdkEventCrossing*);
+	bool leave_handler (GdkEventCrossing*);
 };
diff --git a/gtk2_ardour/monitor_selector.cc b/gtk2_ardour/monitor_selector.cc
index 5f71a79..0a6d731 100644
--- a/gtk2_ardour/monitor_selector.cc
+++ b/gtk2_ardour/monitor_selector.cc
@@ -33,7 +33,7 @@
 #include "monitor_selector.h"
 #include "utils.h"
 #include "gui_thread.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 using namespace ARDOUR_UI_UTILS;
diff --git a/gtk2_ardour/mono_panner.cc b/gtk2_ardour/mono_panner.cc
index 0dd54ef..da98fcb 100644
--- a/gtk2_ardour/mono_panner.cc
+++ b/gtk2_ardour/mono_panner.cc
@@ -44,7 +44,7 @@
 #include "ui_config.h"
 #include "utils.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace Gtk;
diff --git a/gtk2_ardour/mono_panner_editor.cc b/gtk2_ardour/mono_panner_editor.cc
index 5a9a092..5561a30 100644
--- a/gtk2_ardour/mono_panner_editor.cc
+++ b/gtk2_ardour/mono_panner_editor.cc
@@ -24,7 +24,7 @@
 #include "pbd/controllable.h"
 #include "mono_panner_editor.h"
 #include "mono_panner.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace Gtk;
 using namespace Gtkmm2ext;
diff --git a/gtk2_ardour/mtest.cc b/gtk2_ardour/mtest.cc
deleted file mode 100644
index 3103a83..0000000
--- a/gtk2_ardour/mtest.cc
+++ /dev/null
@@ -1,181 +0,0 @@
-/*
-    Copyright (C) 2000-2007 Paul Davis
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-*/
-
-#include <vector>
-#include <iostream>
-#include <gtkmm.h>
-#include <gtkmm/accelmap.h>
-#include <gdk/gdkkeysyms.h>
-#include <gtk/gtkaccelmap.h>
-
-using namespace Gtk;
-using namespace std;
-using namespace Glib;
-
-void
-printit (string txt)
-{
-	cout << "This is the " << txt << " item\n";
-}
-
-Glib::RefPtr<Action>
-make_action (Glib::RefPtr<ActionGroup> group, string name, string label, RefPtr<AccelGroup> accels, slot<void> sl, guint key, Gdk::ModifierType mods)
-{
-	Glib::RefPtr<Action> act;
-
-	act = Action::create (name, label);
-	group->add (act, sl);
-	AccelMap::add_entry (act->get_accel_path(), key, mods);
-
-	act->set_accel_group (accels);
-
-	cerr << "action " << name << " has path " << act->get_accel_path() << endl;
-
-	return act;
-}
-
-Glib::RefPtr<Action>
-make_action (Glib::RefPtr<ActionGroup> group, string name, string label)
-{
-	Glib::RefPtr<Action> act;
-
-	act = Action::create (name, label);
-	group->add (act);
-
-	cerr << "action " << name << " has path " << act->get_accel_path() << endl;
-
-	return act;
-}
-
-bool
-lookup_entry (const string accel_path, Gtk::AccelKey& key)
-{
-	GtkAccelKey gkey;
-	bool known = gtk_accel_map_lookup_entry (accel_path.c_str(), &gkey);
-
-	if (known) {
-		key = AccelKey (gkey.accel_key, Gdk::ModifierType (gkey.accel_mods));
-	} else {
-		key = AccelKey (GDK_VoidSymbol, Gdk::ModifierType (0));
-	}
-
-	return known;
-}
-
-RefPtr<ActionGroup>
-copy_actions (const RefPtr<ActionGroup> src)
-{
-	RefPtr<ActionGroup> grp = ActionGroup::create (src->get_name());
-
-	ListHandle<RefPtr<Action> > group_actions = src->get_actions();
-
-	for (ListHandle<RefPtr<Action> >::iterator a = group_actions.begin(); a != group_actions.end(); ++a) {
-		RefPtr<Action> act = Action::create ((*a)->get_name(), (*a)->property_label());
-		grp->add (act);
-	}
-
-	return grp;
-}
-
-int
-main (int argc, char* argv[])
-{
-	Main app (argc, argv);
-	Window hidden (WINDOW_TOPLEVEL);
-	Window window (WINDOW_TOPLEVEL);
-	Window other_window (WINDOW_TOPLEVEL);
-	Button button ("click me for baz");
-	Button other_button ("click me for baz");
-	VBox   vpacker;
-	VBox   other_vpacker;
-
-	Glib::RefPtr<ActionGroup> actions;
-	Glib::RefPtr<ActionGroup> other_actions;
-	Glib::RefPtr<ActionGroup> shared_actions;
-	Glib::RefPtr<UIManager> uimanager;
-	Glib::RefPtr<UIManager> other_uimanager;
-	Glib::RefPtr<UIManager> shared_uimanager;
-
-	window.set_name ("Editor");
-	window.set_title ("Editor");
-
-	other_window.set_name ("Other");
-	other_window.set_title ("Other");
-
-	uimanager = UIManager::create();
-	other_uimanager = UIManager::create();
-	shared_uimanager = UIManager::create();
-
-	actions = ActionGroup::create("MyActions");
-	other_actions = ActionGroup::create("OtherActions");
-	shared_actions = ActionGroup::create("SharedActions");
-
-	uimanager->add_ui_from_file ("mtest.menus");
-	other_uimanager->add_ui_from_file ("mtest_other.menus");
-
-	// AccelMap::load ("mtest.bindings");
-
-	RefPtr<AccelGroup> accels = hidden.get_accel_group();
-
-	make_action (actions, "TopMenu", "top");
-	make_action (actions, "Foo", "foo", accels, sigc::bind (sigc::ptr_fun (printit), "foo"), GDK_p, Gdk::ModifierType (0));
-
-	make_action (other_actions, "OTopMenu", "otop");
-	make_action (other_actions, "OFoo", "foo", accels, sigc::bind (sigc::ptr_fun (printit), "o-foo"), GDK_p, Gdk::ModifierType (0));
-
-	make_action (shared_actions, "Bar", "bar", accels, sigc::bind (sigc::ptr_fun (printit), "barshared"), GDK_p, Gdk::CONTROL_MASK);
-	RefPtr<Action> act = make_action (shared_actions, "Baz", "baz", accels, sigc::bind (sigc::ptr_fun (printit), "baz-shared"), GDK_p, Gdk::SHIFT_MASK);
-
-	act->connect_proxy (button);
-	act->connect_proxy (other_button);
-
-	uimanager->insert_action_group (copy_actions (actions));
-	uimanager->insert_action_group (copy_actions (shared_actions));
-	other_uimanager->insert_action_group (copy_actions (other_actions));
-	other_uimanager->insert_action_group (copy_actions (shared_actions));
-
-	other_window.add_accel_group (accels);
-	// window.add_accel_group (accels);
-
-	Gtk::MenuBar* m;
-
-	m = dynamic_cast<MenuBar*>(other_uimanager->get_widget ("/OTop"));
-
-	other_vpacker.pack_start (*m);
-	other_vpacker.pack_start (other_button);
-
-	other_window.add (other_vpacker);
-	other_window.show_all ();
-
-	m = dynamic_cast<MenuBar*>(uimanager->get_widget ("/Top"));
-
-	vpacker.pack_start (*m);
-	vpacker.pack_start (button);
-
-	window.add (vpacker);
-	window.show_all ();
-
-	Settings::get_default()->property_gtk_can_change_accels() = true;
-
-	AccelMap::save ("mtest.bindings");
-
-	app.run ();
-
-	return 0;
-}
diff --git a/gtk2_ardour/nag.cc b/gtk2_ardour/nag.cc
index 61a8e1a..d553efd 100644
--- a/gtk2_ardour/nag.cc
+++ b/gtk2_ardour/nag.cc
@@ -30,7 +30,7 @@
 #include "ardour/rc_configuration.h"
 
 #include "nag.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 using namespace std;
diff --git a/gtk2_ardour/new_plugin_preset_dialog.cc b/gtk2_ardour/new_plugin_preset_dialog.cc
index cc5c4b9..70926f5 100644
--- a/gtk2_ardour/new_plugin_preset_dialog.cc
+++ b/gtk2_ardour/new_plugin_preset_dialog.cc
@@ -20,7 +20,7 @@
 
 #include <gtkmm/stock.h>
 #include "new_plugin_preset_dialog.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace Gtk;
diff --git a/gtk2_ardour/normalize_dialog.cc b/gtk2_ardour/normalize_dialog.cc
index 9872bcb..85b7b0b 100644
--- a/gtk2_ardour/normalize_dialog.cc
+++ b/gtk2_ardour/normalize_dialog.cc
@@ -23,7 +23,7 @@
 #include <gtkmm/stock.h>
 #include <gtkmm/progressbar.h>
 #include "normalize_dialog.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace Gtk;
 
@@ -46,7 +46,7 @@ NormalizeDialog::NormalizeDialog (bool more_than_one)
 	_spin->set_value (_last_normalization_value);
 	_spin->set_activates_default ();
 	hbox->pack_start (*_spin, false, false);
-	hbox->pack_start (*manage (new Label (_("dbFS"))), false, false);
+	hbox->pack_start (*manage (new Label (_("dBFS"))), false, false);
 	get_vbox()->pack_start (*hbox);
 
 	if (more_than_one) {
@@ -95,6 +95,10 @@ NormalizeDialog::target () const
 void
 NormalizeDialog::update_progress_gui (float p)
 {
+	/* Normalization is run inside the GUI thread, so we can directly
+	 * update the progress bar when notified about progress.
+	 */
+
 	_progress_bar->set_fraction (p);
 }
 
diff --git a/gtk2_ardour/note.cc b/gtk2_ardour/note.cc
index ea12712..6e1878a 100644
--- a/gtk2_ardour/note.cc
+++ b/gtk2_ardour/note.cc
@@ -98,6 +98,12 @@ Note::hide ()
 }
 
 void
+Note::set (ArdourCanvas::Rect rect)
+{
+	_rectangle->set (rect);
+}
+
+void
 Note::set_x0 (Coord x0)
 {
 	_rectangle->set_x0 (x0);
diff --git a/gtk2_ardour/note.h b/gtk2_ardour/note.h
index 37d5573..c294962 100644
--- a/gtk2_ardour/note.h
+++ b/gtk2_ardour/note.h
@@ -46,6 +46,7 @@ public:
 	ArdourCanvas::Coord x1 () const;
 	ArdourCanvas::Coord y1 () const;
 
+	void set (ArdourCanvas::Rect);
 	void set_x0 (ArdourCanvas::Coord);
 	void set_y0 (ArdourCanvas::Coord);
 	void set_x1 (ArdourCanvas::Coord);
diff --git a/gtk2_ardour/note_base.cc b/gtk2_ardour/note_base.cc
index 9c47fa7..ff0ec34 100644
--- a/gtk2_ardour/note_base.cc
+++ b/gtk2_ardour/note_base.cc
@@ -119,9 +119,9 @@ NoteBase::on_channel_selection_change(uint16_t selection)
 {
 	// make note change its color if its channel is not marked active
 	if ( (selection & (1 << _note->channel())) == 0 ) {
-		set_fill_color(UIConfiguration::instance().color ("midi note inactive channel"));
-		set_outline_color(calculate_outline(UIConfiguration::instance().color ("midi note inactive channel"),
-		                                    _selected));
+		const ArdourCanvas::Color inactive_ch = UIConfiguration::instance().color ("midi note inactive channel");
+		set_fill_color(inactive_ch);
+		set_outline_color(calculate_outline(inactive_ch, _selected));
 	} else {
 		// set the color according to the notes selection state
 		set_selected(_selected);
@@ -146,9 +146,11 @@ NoteBase::set_selected(bool selected)
 	}
 
 	_selected = selected;
-	set_fill_color (base_color());
 
-	set_outline_color(calculate_outline(base_color(), _selected));
+	const uint32_t base_col = base_color();
+	set_fill_color (base_col);
+
+	set_outline_color(calculate_outline(base_col, _selected));
 }
 
 #define SCALE_USHORT_TO_UINT8_T(x) ((x) / 257)
@@ -166,8 +168,8 @@ NoteBase::base_color()
 	switch (mode) {
 	case TrackColor:
 	{
-		uint32_t color = _region.midi_stream_view()->get_region_color();
-		return UINT_INTERPOLATE (UINT_RGBA_CHANGE_A (color, opacity),
+		const uint32_t region_color = _region.midi_stream_view()->get_region_color();
+		return UINT_INTERPOLATE (UINT_RGBA_CHANGE_A (region_color, opacity),
 		                         UIConfiguration::instance().color ("midi note selected"),
 					 0.5);
 	}
diff --git a/gtk2_ardour/note_base.h b/gtk2_ardour/note_base.h
index 059aa9d..d55f87c 100644
--- a/gtk2_ardour/note_base.h
+++ b/gtk2_ardour/note_base.h
@@ -23,7 +23,6 @@
 #include <boost/shared_ptr.hpp>
 
 #include "canvas/types.h"
-#include "evoral/types.hpp"
 
 #include "rgb_macros.h"
 #include "ui_config.h"
@@ -33,6 +32,7 @@ class MidiRegionView;
 
 namespace Evoral {
 	template<typename T> class Note;
+	class Beats;
 }
 
 namespace ArdourCanvas {
diff --git a/gtk2_ardour/note_select_dialog.cc b/gtk2_ardour/note_select_dialog.cc
index 14d45cc..203213e 100644
--- a/gtk2_ardour/note_select_dialog.cc
+++ b/gtk2_ardour/note_select_dialog.cc
@@ -21,7 +21,7 @@
 
 #include "note_select_dialog.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 static void
 _note_on_event_handler(GtkWidget* /*widget*/, int note, gpointer arg)
diff --git a/gtk2_ardour/option_editor.cc b/gtk2_ardour/option_editor.cc
index e963726..9809b05 100644
--- a/gtk2_ardour/option_editor.cc
+++ b/gtk2_ardour/option_editor.cc
@@ -1,19 +1,19 @@
 /*
-    Copyright (C) 2001-2009 Paul Davis
+  Copyright (C) 2001-2009 Paul Davis
 
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
+  This program is free software; you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation; either version 2 of the License, or
+  (at your option) any later version.
 
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
 
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 
 */
 #include <algorithm>
@@ -30,12 +30,13 @@
 
 #include "pbd/configuration.h"
 #include "pbd/replace_all.h"
+#include "pbd/strsplit.h"
 
 #include "gui_thread.h"
 #include "option_editor.h"
 #include "public_editor.h"
 #include "utils.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace Gtk;
@@ -469,26 +470,25 @@ OptionEditorPage::OptionEditorPage (Gtk::Notebook& n, std::string const & t)
  *  @param o Configuration to edit.
  *  @param t Title for the dialog.
  */
-OptionEditor::OptionEditor (PBD::Configuration* c, std::string const & t)
-	: ArdourWindow (t), _config (c)
+OptionEditor::OptionEditor (PBD::Configuration* c)
+	: _config (c)
+	, option_tree (TreeStore::create (option_columns))
+	, option_treeview (option_tree)
 {
 	using namespace Notebook_Helpers;
 
-	set_default_size (300, 300);
-	// set_wmclass (X_("ardour_preferences"), PROGRAM_NAME);
-
-	set_name ("Preferences");
-	add_events (Gdk::KEY_PRESS_MASK | Gdk::KEY_RELEASE_MASK);
-
-	set_border_width (4);
-
-	add (_notebook);
-
-	_notebook.set_show_tabs (true);
+	_notebook.set_show_tabs (false);
 	_notebook.set_show_border (true);
 	_notebook.set_name ("OptionsNotebook");
 
-	show_all_children();
+	option_treeview.append_column ("", option_columns.name);
+	option_treeview.set_enable_search(true);
+	option_treeview.set_search_column(0);
+	option_treeview.set_name ("OptionsTreeView");
+	option_treeview.set_headers_visible (false);
+
+	option_treeview.get_selection()->set_mode (Gtk::SELECTION_SINGLE);
+	option_treeview.get_selection()->signal_changed().connect (sigc::mem_fun (*this, &OptionEditor::treeview_row_selected));
 
 	/* Watch out for changes to parameters */
 	_config->ParameterChanged.connect (config_connection, invalidator (*this), boost::bind (&OptionEditor::parameter_changed, this, _1), gui_context());
@@ -519,6 +519,82 @@ OptionEditor::parameter_changed (std::string const & p)
 	}
 }
 
+void
+OptionEditor::treeview_row_selected ()
+{
+	Glib::RefPtr<Gtk::TreeSelection> selection = option_treeview.get_selection();
+	TreeModel::iterator iter = selection->get_selected();
+	if(iter) {
+		TreeModel::Row row = *iter;
+		Gtk::Widget* w = row[option_columns.widget];
+		if (w) {
+			_notebook.set_current_page (_notebook.page_num (*w));
+		}
+	}
+}
+
+TreeModel::iterator
+OptionEditor::find_path_in_treemodel (std::string const & pn, bool create_missing)
+{
+	/* split page name, which is actually a path, into each component */
+
+	std::vector<std::string> components;
+	split (pn, components, '/');
+
+	/* start with top level children */
+
+	TreeModel::Children children = option_tree->children();
+	TreeModel::iterator iter;
+
+	/* foreach path component ... */
+
+	for (std::vector<std::string>::const_iterator s = components.begin(); s != components.end(); ++s) {
+
+		for (iter = children.begin(); iter != children.end(); ++iter) {
+			TreeModel::Row row = *iter;
+			const std::string row_name = row[option_columns.name];
+			if (row_name == (*s)) {
+				break;
+			}
+		}
+
+		if (iter == children.end()) {
+			/* the current component is missing; bail out or create it */
+			if (!create_missing) {
+				return option_tree->get_iter(TreeModel::Path(""));
+			} else {
+				iter = option_tree->append (children);
+				TreeModel::Row row = *iter;
+				row[option_columns.name] = *s;
+				row[option_columns.widget] = 0;
+			}
+		}
+
+		/* from now on, iter points to a valid row, either the one we found or a new one */
+		/* set children to the row's children to continue searching */
+		children = (*iter)->children ();
+
+	}
+
+	return iter;
+}
+
+void
+OptionEditor::add_path_to_treeview (std::string const & pn, Gtk::Widget& widget)
+{
+	option_treeview.set_model (Glib::RefPtr<TreeStore>());
+
+	TreeModel::iterator row_iter = find_path_in_treemodel(pn, true);
+
+	assert(row_iter);
+
+	TreeModel::Row row = *row_iter;
+	row[option_columns.widget] = &widget;
+
+	option_treeview.set_model (option_tree);
+	option_treeview.expand_all ();
+}
+
 /** Add a component to a given page.
  *  @param pn Page name (will be created if it doesn't already exist)
  *  @param o Component.
@@ -527,7 +603,10 @@ void
 OptionEditor::add_option (std::string const & pn, OptionEditorComponent* o)
 {
 	if (_pages.find (pn) == _pages.end()) {
-		_pages[pn] = new OptionEditorPage (_notebook, pn);
+		OptionEditorPage* oep = new OptionEditorPage (_notebook, pn);
+		_pages[pn] = oep;
+
+		add_path_to_treeview (pn, oep->box);
 	}
 
 	OptionEditorPage* p = _pages[pn];
@@ -545,7 +624,9 @@ void
 OptionEditor::add_page (std::string const & pn, Gtk::Widget& w)
 {
 	if (_pages.find (pn) == _pages.end()) {
-		_pages[pn] = new OptionEditorPage (_notebook, pn);
+		OptionEditorPage* oep = new OptionEditorPage (_notebook, pn);
+		_pages[pn] = oep;
+		add_path_to_treeview (pn, oep->box);
 	}
 
 	OptionEditorPage* p = _pages[pn];
@@ -555,15 +636,12 @@ OptionEditor::add_page (std::string const & pn, Gtk::Widget& w)
 void
 OptionEditor::set_current_page (string const & p)
 {
-	int i = 0;
-	while (i < _notebook.get_n_pages ()) {
-		if (_notebook.get_tab_label_text (*_notebook.get_nth_page (i)) == p) {
-			_notebook.set_current_page (i);
-			return;
-		}
+	TreeModel::iterator row_iter = find_path_in_treemodel(p);
 
-		++i;
+	if (row_iter) {
+		option_treeview.get_selection()->select(row_iter);
 	}
+
 }
 
 
@@ -597,3 +675,33 @@ DirectoryOption::selection_changed ()
 {
 	_set (poor_mans_glob(_file_chooser.get_filename ()));
 }
+
+/*--------------------------*/
+
+OptionEditorContainer::OptionEditorContainer (PBD::Configuration* c, string const& str)
+	: OptionEditor (c)
+{
+	set_border_width (4);
+	hpacker.pack_start (treeview(), false, false);
+	hpacker.pack_start (notebook(), true, true);
+	pack_start (hpacker, true, true);
+
+	hpacker.show_all ();
+	show ();
+}
+
+OptionEditorWindow::OptionEditorWindow (PBD::Configuration* c, string const& str)
+	: OptionEditor (c)
+	, ArdourWindow (str)
+{
+	container.set_border_width (4);
+	hpacker.pack_start (treeview(), false, false);
+	hpacker.pack_start (notebook(), true, true);
+
+	container.pack_start (hpacker, true, true);
+
+	hpacker.show_all ();
+	container.show ();
+
+	add (container);
+}
diff --git a/gtk2_ardour/option_editor.h b/gtk2_ardour/option_editor.h
index 7637061..b5d44d5 100644
--- a/gtk2_ardour/option_editor.h
+++ b/gtk2_ardour/option_editor.h
@@ -25,7 +25,10 @@
 #include <gtkmm/comboboxtext.h>
 #include <gtkmm/spinbutton.h>
 #include <gtkmm/table.h>
+#include <gtkmm/window.h>
+
 #include "gtkmm2ext/slider_controller.h"
+
 #include "ardour_window.h"
 #include "audio_clock.h"
 #include "ardour/types.h"
@@ -680,11 +683,11 @@ public:
 };
 
 /** The OptionEditor dialog base class */
-class OptionEditor : public ArdourWindow
+class OptionEditor : virtual public sigc::trackable
 {
 public:
-	OptionEditor (PBD::Configuration *, std::string const &);
-	~OptionEditor ();
+	OptionEditor (PBD::Configuration *);
+	virtual ~OptionEditor ();
 
 	void add_option (std::string const &, OptionEditorComponent *);
 	void add_page (std::string const &, Gtk::Widget& page_widget);
@@ -692,19 +695,58 @@ public:
 	void set_current_page (std::string const &);
 
 protected:
-
 	virtual void parameter_changed (std::string const &);
 
 	PBD::Configuration* _config;
+	Gtk::Notebook& notebook() { return _notebook; }
+	Gtk::TreeView& treeview() { return option_treeview; }
 
-private:
+	class OptionColumns : public Gtk::TreeModel::ColumnRecord
+	{
+          public:
+		Gtk::TreeModelColumn<std::string> name;
+		Gtk::TreeModelColumn<Gtk::Widget*> widget;
 
-	PBD::ScopedConnection config_connection;
+		OptionColumns() {
+			add (name);
+			add (widget);
+		}
+	};
+
+	OptionColumns option_columns;
+	Glib::RefPtr<Gtk::TreeStore> option_tree;
 
+private:
+	PBD::ScopedConnection config_connection;
 	Gtk::Notebook _notebook;
+	Gtk::TreeView option_treeview;
 	std::map<std::string, OptionEditorPage*> _pages;
+
+	void add_path_to_treeview (std::string const &, Gtk::Widget&);
+	Gtk::TreeModel::iterator find_path_in_treemodel (std::string const & pn,
+	                                                 bool create_missing = false);
+	void treeview_row_selected ();
 };
 
-#endif /* __gtk_ardour_option_editor_h__ */
+/** The OptionEditor dialog-as-container base class */
+class OptionEditorContainer : public OptionEditor, public Gtk::VBox
+{
+public:
+	OptionEditorContainer (PBD::Configuration *, std::string const &);
+	~OptionEditorContainer() {}
+private:
+	Gtk::HBox hpacker;
+};
 
+/** The OptionEditor dialog-as-container base class */
+class OptionEditorWindow : public OptionEditor, public ArdourWindow
+{
+public:
+	OptionEditorWindow (PBD::Configuration *, std::string const &);
+	~OptionEditorWindow() {}
+private:
+	Gtk::VBox container;
+	Gtk::HBox hpacker;
+};
 
+#endif /* __gtk_ardour_option_editor_h__ */
diff --git a/gtk2_ardour/opts.cc b/gtk2_ardour/opts.cc
index 4e03983..98e72de 100644
--- a/gtk2_ardour/opts.cc
+++ b/gtk2_ardour/opts.cc
@@ -31,7 +31,7 @@
 
 #include "opts.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 
@@ -91,11 +91,6 @@ ARDOUR_COMMAND_LINE::parse_opts (int argc, char *argv[])
 	const char *optstring = "abBc:C:dD:hHk:E:m:N:nOp:PST:U:vV";
 	const char *execname = strrchr (argv[0], '/');
 
-	if (getenv ("ARDOUR_SAE")) {
-		menus_file = "ardour-sae.menus";
-		keybindings_path = "SAE";
-	}
-
 	if (execname == 0) {
 		execname = argv[0];
 	} else {
diff --git a/gtk2_ardour/panner2d.cc b/gtk2_ardour/panner2d.cc
index 7b9918b..9697cb3 100644
--- a/gtk2_ardour/panner2d.cc
+++ b/gtk2_ardour/panner2d.cc
@@ -43,7 +43,7 @@
 #include "public_editor.h"
 #include "ui_config.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace Gtk;
@@ -1013,7 +1013,7 @@ Panner2dWindow::set_width ()
 bool
 Panner2dWindow::on_key_press_event (GdkEventKey* event)
 {
-	return relay_key_press (event, &PublicEditor::instance());
+	return relay_key_press (event, this);
 }
 
 bool
diff --git a/gtk2_ardour/panner_editor.cc b/gtk2_ardour/panner_editor.cc
index 0a1d9e8..6e04d9f 100644
--- a/gtk2_ardour/panner_editor.cc
+++ b/gtk2_ardour/panner_editor.cc
@@ -18,7 +18,7 @@
 */
 
 #include "panner_editor.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace Gtk;
diff --git a/gtk2_ardour/panner_interface.cc b/gtk2_ardour/panner_interface.cc
index 91c2d17..dcbb364 100644
--- a/gtk2_ardour/panner_interface.cc
+++ b/gtk2_ardour/panner_interface.cc
@@ -23,7 +23,7 @@
 #include "panner_interface.h"
 #include "panner_editor.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace Gtk;
diff --git a/gtk2_ardour/panner_ui.cc b/gtk2_ardour/panner_ui.cc
index 2df7a81..0818833 100644
--- a/gtk2_ardour/panner_ui.cc
+++ b/gtk2_ardour/panner_ui.cc
@@ -36,7 +36,7 @@
 #include "mono_panner.h"
 #include "ui_config.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
diff --git a/gtk2_ardour/patch_change.cc b/gtk2_ardour/patch_change.cc
index c8d003f..4006cbd 100644
--- a/gtk2_ardour/patch_change.cc
+++ b/gtk2_ardour/patch_change.cc
@@ -183,7 +183,7 @@ PatchChange::event_handler (GdkEvent* ev)
 			}
 		}
 
-		if (ev->button.button == 3) {
+		if (Gtkmm2ext::Keyboard::is_context_menu_event (&ev->button)) {
 			if (!_popup_initialized) {
 				initialize_popup_menus();
 				_popup_initialized = true;
diff --git a/gtk2_ardour/patch_change_dialog.cc b/gtk2_ardour/patch_change_dialog.cc
index 1c0d824..9bb339f 100644
--- a/gtk2_ardour/patch_change_dialog.cc
+++ b/gtk2_ardour/patch_change_dialog.cc
@@ -33,7 +33,7 @@
 #include "patch_change_dialog.h"
 #include "gui_thread.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace Gtk;
diff --git a/gtk2_ardour/pingback.cc b/gtk2_ardour/pingback.cc
index bbcd441..43594a6 100644
--- a/gtk2_ardour/pingback.cc
+++ b/gtk2_ardour/pingback.cc
@@ -28,8 +28,6 @@
 #include <sys/utsname.h>
 #endif
 
-#include <curl/curl.h>
-
 #include "pbd/gstdio_compat.h"
 #include <glibmm/miscutils.h>
 
@@ -39,31 +37,13 @@
 #include "ardour/filesystem_paths.h"
 #include "ardour/rc_configuration.h"
 
+#include "ardour_http.h"
 #include "pingback.h"
+#include "utils.h"
 
 using std::string;
 using namespace ARDOUR;
 
-static size_t
-curl_write_data (char *bufptr, size_t size, size_t nitems, void *ptr)
-{
-        /* we know its a string */
-
-        string* sptr = (string*) ptr;
-
-        for (size_t i = 0; i < nitems; ++i) {
-                for (size_t n = 0; n < size; ++n) {
-                        if (*bufptr == '\n') {
-                                break;
-                        }
-
-                        (*sptr) += *bufptr++;
-                }
-        }
-
-        return size * nitems;
-}
-
 struct ping_call {
     std::string version;
     std::string announce_path;
@@ -103,19 +83,12 @@ _query_registry (const char *regkey, const char *regval, std::string &rv) {
 static void*
 _pingback (void *arg)
 {
+	ArdourCurl::HttpGet h;
+
 	ping_call* cm = static_cast<ping_call*> (arg);
-	CURL* c;
 	string return_str;
 	//initialize curl
 
-	curl_global_init (CURL_GLOBAL_NOTHING);
-	c = curl_easy_init ();
-
-	curl_easy_setopt (c, CURLOPT_WRITEFUNCTION, curl_write_data);
-	curl_easy_setopt (c, CURLOPT_WRITEDATA, &return_str);
-	char errbuf[CURL_ERROR_SIZE];
-	curl_easy_setopt (c, CURLOPT_ERRORBUFFER, errbuf);
-
 	string url;
 
 #ifdef __APPLE__
@@ -131,10 +104,10 @@ _pingback (void *arg)
 		return 0;
 	}
 
-	char* v = curl_easy_escape (c, cm->version.c_str(), cm->version.length());
+	char* v = h.escape (cm->version.c_str(), cm->version.length());
 	url += v;
 	url += '?';
-	free (v);
+	h.free (v);
 
 #ifndef PLATFORM_WINDOWS
 	struct utsname utb;
@@ -148,30 +121,30 @@ _pingback (void *arg)
 	string s;
 	char* query;
 
-	query = curl_easy_escape (c, utb.sysname, strlen (utb.sysname));
+	query = h.escape (utb.sysname, strlen (utb.sysname));
 	s = string_compose ("s=%1", query);
 	url += s;
 	url += '&';
-	free (query);
+	h.free (query);
 
-	query = curl_easy_escape (c, utb.release, strlen (utb.release));
+	query = h.escape (utb.release, strlen (utb.release));
 	s = string_compose ("r=%1", query);
 	url += s;
 	url += '&';
-	free (query);
+	h.free (query);
 
-	query = curl_easy_escape (c, utb.machine, strlen (utb.machine));
+	query = h.escape (utb.machine, strlen (utb.machine));
 	s = string_compose ("m=%1", query);
 	url += s;
-	free (query);
+	h.free (query);
 #else
 	std::string val;
 	if (_query_registry("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", "ProductName", val)) {
-		char* query = curl_easy_escape (c, val.c_str(), strlen (val.c_str()));
+		char* query = h.escape (val.c_str(), strlen (val.c_str()));
 		url += "r=";
 		url += query;
 		url += '&';
-		free (query);
+		h.free (query);
 	} else {
 		url += "r=&";
 	}
@@ -182,11 +155,11 @@ _pingback (void *arg)
 		if (string::npos != cut) {
 			val = val.substr (0, cut);
 		}
-		char* query = curl_easy_escape (c, val.c_str(), strlen (val.c_str()));
+		char* query = h.escape (val.c_str(), strlen (val.c_str()));
 		url += "m=";
 		url += query;
 		url += '&';
-		free (query);
+		h.free (query);
 	} else {
 		url += "m=&";
 	}
@@ -199,20 +172,9 @@ _pingback (void *arg)
 
 #endif /* PLATFORM_WINDOWS */
 
-	curl_easy_setopt (c, CURLOPT_URL, url.c_str());
-
-	return_str = "";
-
-	if (curl_easy_perform (c) == 0) {
-		long http_status;
-
-		curl_easy_getinfo (c, CURLINFO_RESPONSE_CODE, &http_status);
-
-		if (http_status != 200) {
-			std::cerr << "Bad HTTP status" << std::endl;
-			return 0;
-		}
+	return_str = h.get (url);
 
+	if (!return_str.empty ()) {
 		if ( return_str.length() > 140 ) { // like a tweet :)
 			std::cerr << "Announcement string is too long (probably behind a proxy)." << std::endl;
 		} else {
@@ -229,10 +191,9 @@ _pingback (void *arg)
 			}
 		}
 	} else {
-		std::cerr << "curl failed: " << errbuf << std::endl;
+		std::cerr << "curl failed: " << h.error () << std::endl;
 	}
 
-	curl_easy_cleanup (c);
 	delete cm;
 	return 0;
 }
@@ -241,6 +202,13 @@ namespace ARDOUR {
 
 void pingback (const string& version, const string& announce_path)
 {
+	if (ARDOUR_UI_UTILS::running_from_source_tree ()) {
+		/* we don't ping under these conditions, because the user is
+		   probably just paul or robin :)
+		*/
+		return;
+	}
+
 	ping_call* cm = new ping_call (version, announce_path);
 	pthread_t thread;
 
diff --git a/gtk2_ardour/pixmaps/forwardblarrow.xpm b/gtk2_ardour/pixmaps/forwardblarrow.xpm
deleted file mode 100644
index 9088a9f..0000000
--- a/gtk2_ardour/pixmaps/forwardblarrow.xpm
+++ /dev/null
@@ -1,17 +0,0 @@
-/* XPM */
-static const gchar * forwdblarrow_xpm[] = {
-"20 11 3 1",
-" 	c None",
-".	c #000000",
-"+	c #FFFFFF",
-"              ..    ",
-"              .+.   ",
-"              .++.  ",
-" ..............+++. ",
-" .+++++++++++++++++.",
-" ...................",
-" .+++++++++++++++++.",
-" ..............+++. ",
-"              .++.  ",
-"              .+.   ",
-"              ..    "};
diff --git a/gtk2_ardour/pixmaps/h_meter_strip.xpm b/gtk2_ardour/pixmaps/h_meter_strip.xpm
deleted file mode 100644
index b112772..0000000
--- a/gtk2_ardour/pixmaps/h_meter_strip.xpm
+++ /dev/null
@@ -1,195 +0,0 @@
-/* XPM */
-static const gchar *h_meter_strip_xpm[] = {
-"186 5 187 2",
-"  	c None",
-". 	c #2BFE00",
-"+ 	c #2DFE00",
-"@ 	c #2FFE01",
-"# 	c #32FE01",
-"$ 	c #34FE02",
-"% 	c #36FE02",
-"& 	c #38FE03",
-"* 	c #3BFE03",
-"= 	c #3DFD04",
-"- 	c #3FFD04",
-"; 	c #41FD05",
-"> 	c #44FD05",
-", 	c #46FD06",
-"' 	c #48FD06",
-") 	c #4AFD07",
-"! 	c #4DFD07",
-"~ 	c #4FFD08",
-"{ 	c #51FC08",
-"] 	c #53FC09",
-"^ 	c #56FC09",
-"/ 	c #58FC09",
-"( 	c #5AFC0A",
-"_ 	c #5CFC0A",
-": 	c #5FFC0B",
-"< 	c #61FC0B",
-"[ 	c #63FB0C",
-"} 	c #65FB0C",
-"| 	c #68FB0D",
-"1 	c #6AFB0D",
-"2 	c #6CFB0E",
-"3 	c #6EFB0E",
-"4 	c #71FB0F",
-"5 	c #73FB0F",
-"6 	c #75FB10",
-"7 	c #77FA10",
-"8 	c #7AFA11",
-"9 	c #7CFA11",
-"0 	c #7EFA12",
-"a 	c #80FA12",
-"b 	c #83FA12",
-"c 	c #85FA13",
-"d 	c #87FA13",
-"e 	c #89FA14",
-"f 	c #8CF914",
-"g 	c #8EF915",
-"h 	c #90F915",
-"i 	c #92F916",
-"j 	c #95F916",
-"k 	c #97F917",
-"l 	c #99F917",
-"m 	c #9BF918",
-"n 	c #9EF818",
-"o 	c #A0F819",
-"p 	c #A2F819",
-"q 	c #A4F81A",
-"r 	c #A7F81A",
-"s 	c #A9F81A",
-"t 	c #ABF81B",
-"u 	c #ADF81B",
-"v 	c #B0F81C",
-"w 	c #B2F71C",
-"x 	c #B4F71D",
-"y 	c #B6F71D",
-"z 	c #B9F71E",
-"A 	c #BBF71E",
-"B 	c #BDF71F",
-"C 	c #BFF71F",
-"D 	c #C2F720",
-"E 	c #C4F720",
-"F 	c #C6F621",
-"G 	c #C8F621",
-"H 	c #CBF622",
-"I 	c #CDF622",
-"J 	c #CFF623",
-"K 	c #D1F623",
-"L 	c #D4F624",
-"M 	c #D6F624",
-"N 	c #D8F524",
-"O 	c #DAF525",
-"P 	c #DDF525",
-"Q 	c #DFF526",
-"R 	c #E1F526",
-"S 	c #E3F527",
-"T 	c #E6F527",
-"U 	c #E8F528",
-"V 	c #EAF528",
-"W 	c #ECF429",
-"X 	c #EFF429",
-"Y 	c #F1F42A",
-"Z 	c #F3F42A",
-"` 	c #F5F42B",
-" .	c #F8F42B",
-"..	c #FAF42C",
-"+.	c #FCF42C",
-"@.	c #FFF42D",
-"#.	c #FFF22C",
-"$.	c #FFF12B",
-"%.	c #FFF02A",
-"&.	c #FFEF2A",
-"*.	c #FFEE29",
-"=.	c #FFED28",
-"-.	c #FFEC28",
-";.	c #FFEB27",
-">.	c #FFE926",
-",.	c #FFE826",
-"'.	c #FFE725",
-").	c #FFE624",
-"!.	c #FFE524",
-"~.	c #FFE423",
-"{.	c #FFE322",
-"].	c #FFE222",
-"^.	c #FFE021",
-"/.	c #FFDF20",
-"(.	c #FFDE20",
-"_.	c #FFDD1F",
-":.	c #FFDC1E",
-"<.	c #FFDB1E",
-"[.	c #FFDA1D",
-"}.	c #FFD91C",
-"|.	c #FFD71B",
-"1.	c #FFD61B",
-"2.	c #FFD51A",
-"3.	c #FFD419",
-"4.	c #FFD319",
-"5.	c #FFD218",
-"6.	c #FFD117",
-"7.	c #FFD017",
-"8.	c #FFCF16",
-"9.	c #FFCD15",
-"0.	c #FFCC15",
-"a.	c #FFCB14",
-"b.	c #FFCA13",
-"c.	c #FFC913",
-"d.	c #FFC812",
-"e.	c #FFC711",
-"f.	c #FFC611",
-"g.	c #FFC410",
-"h.	c #FFC30F",
-"i.	c #FFC20F",
-"j.	c #FFC10E",
-"k.	c #FFC00D",
-"l.	c #FFBF0C",
-"m.	c #FFBE0C",
-"n.	c #FFBD0B",
-"o.	c #FFBB0A",
-"p.	c #FFBA0A",
-"q.	c #FFB909",
-"r.	c #FFB808",
-"s.	c #FFB708",
-"t.	c #FFB607",
-"u.	c #FFB506",
-"v.	c #FFB406",
-"w.	c #FFB205",
-"x.	c #FFB104",
-"y.	c #FFB004",
-"z.	c #FFAF03",
-"A.	c #FFAE02",
-"B.	c #FFAD02",
-"C.	c #FFAC01",
-"D.	c #FFAB00",
-"E.	c #FFA900",
-"F.	c #F11F00",
-"G.	c #F21E00",
-"H.	c #F21C00",
-"I.	c #F31B00",
-"J.	c #F31A00",
-"K.	c #F41800",
-"L.	c #F41700",
-"M.	c #F51600",
-"N.	c #F61400",
-"O.	c #F61300",
-"P.	c #F71100",
-"Q.	c #F71000",
-"R.	c #F80F00",
-"S.	c #F90D00",
-"T.	c #F90C00",
-"U.	c #FA0B00",
-"V.	c #FA0900",
-"W.	c #FB0800",
-"X.	c #FC0600",
-"Y.	c #FC0500",
-"Z.	c #FD0400",
-"`.	c #FD0200",
-" +	c #FE0100",
-".+	c #FE0000",
-"++	c #FF0000",
-". + @ # $ % & * = - ; > , ' ) ! ~ { ] ^ / ( _ : < [ } | 1 2 3 4 5 6 7 8 9 0 a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z `  ...+. at .@.#.$.%.&.*.=.-.;.>.,.'.).!.~.{.].^./.(._.:.<.[.}.|.1.2.3.4.5.6.7.8.9.0.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.`. +.+",
-". + @ # $ % & * = - ; > , ' ) ! ~ { ] ^ / ( _ : < [ } | 1 2 3 4 5 6 7 8 9 0 a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z `  ...+. at .@.#.$.%.&.*.=.-.;.>.,.'.).!.~.{.].^./.(._.:.<.[.}.|.1.2.3.4.5.6.7.8.9.0.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.`. +.+",
-". + @ # $ % & * = - ; > , ' ) ! ~ { ] ^ / ( _ : < [ } | 1 2 3 4 5 6 7 8 9 0 a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z `  ...+. at .@.#.$.%.&.*.=.-.;.>.,.'.).!.~.{.].^./.(._.:.<.[.}.|.1.2.3.4.5.6.7.8.9.0.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.`. +++",
-". + @ # $ % & * = - ; > , ' ) ! ~ { ] ^ / ( _ : < [ } | 1 2 3 4 5 6 7 8 9 0 a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z `  ...+. at .@.#.$.%.&.*.=.-.;.>.,.'.).!.~.{.].^./.(._.:.<.[.}.|.1.2.3.4.5.6.7.8.9.0.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.`. +++",
-". + @ # $ % & * = - ; > , ' ) ! ~ { ] ^ / ( _ : < [ } | 1 2 3 4 5 6 7 8 9 0 a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z `  ...+. at .@.#.$.%.&.*.=.-.;.>.,.'.).!.~.{.].^./.(._.:.<.[.}.|.1.2.3.4.5.6.7.8.9.0.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.`. +++"};
diff --git a/gtk2_ardour/pixmaps/hiin.xpm b/gtk2_ardour/pixmaps/hiin.xpm
deleted file mode 100644
index 24c248b..0000000
--- a/gtk2_ardour/pixmaps/hiin.xpm
+++ /dev/null
@@ -1,31 +0,0 @@
-/* XPM */
-static const gchar * hiin_xpm[] = {
-"25 25 3 1",
-" 	c None",
-".	c #F6FA2A",
-"+	c #F6F92A",
-"                         ",
-"                         ",
-"                         ",
-"                         ",
-"            .......+     ",
-"           ........+     ",
-"         ......          ",
-"        .....            ",
-"       ....              ",
-"       ...               ",
-"      ...                ",
-"      ...                ",
-"     ...                 ",
-"     ...                 ",
-"     ...                 ",
-"     ...                 ",
-"     ..                  ",
-"    ...                  ",
-"    ...                  ",
-"    ...                  ",
-"    ...                  ",
-"    +.+                  ",
-"                         ",
-"                         ",
-"                         "};
diff --git a/gtk2_ardour/pixmaps/hiout.xpm b/gtk2_ardour/pixmaps/hiout.xpm
deleted file mode 100644
index 7754594..0000000
--- a/gtk2_ardour/pixmaps/hiout.xpm
+++ /dev/null
@@ -1,31 +0,0 @@
-/* XPM */
-static const gchar * hiout_xpm[] = {
-"25 25 3 1",
-" 	c None",
-".	c #F6F92A",
-"+	c #F6FA2A",
-"                         ",
-"                         ",
-"                         ",
-"                         ",
-"     .+++++++            ",
-"     .++++++++           ",
-"          ++++++         ",
-"            +++++        ",
-"              ++++       ",
-"               +++       ",
-"                +++      ",
-"                +++      ",
-"                 +++     ",
-"                 +++     ",
-"                 +++     ",
-"                 +++     ",
-"                  ++     ",
-"                  +++    ",
-"                  +++    ",
-"                  +++    ",
-"                  +++    ",
-"                  .+.    ",
-"                         ",
-"                         ",
-"                         "};
diff --git a/gtk2_ardour/pixmaps/hslider00.xpm b/gtk2_ardour/pixmaps/hslider00.xpm
deleted file mode 100644
index 47d40e1..0000000
--- a/gtk2_ardour/pixmaps/hslider00.xpm
+++ /dev/null
@@ -1,179 +0,0 @@
-/* XPM */
-static char * hslider00_xpm[] = {
-"38 19 157 2",
-"  	c None",
-". 	c #8B8B8B",
-"+ 	c #8C8C8C",
-"@ 	c #949494",
-"# 	c #3C3C3C",
-"$ 	c #808080",
-"% 	c #858585",
-"& 	c #A7A7A7",
-"* 	c #B8B8B8",
-"= 	c #CCCCCC",
-"- 	c #DBDBDB",
-"; 	c #DEDEDE",
-"> 	c #FFFFFF",
-", 	c #E6E6E6",
-"' 	c #E5E5E5",
-") 	c #848484",
-"! 	c #2A2A2A",
-"~ 	c #383838",
-"{ 	c #DFDFDF",
-"] 	c #E2E2E2",
-"^ 	c #CBCBCB",
-"/ 	c #888888",
-"( 	c #626262",
-"_ 	c #090909",
-": 	c #6C6C6C",
-"< 	c #818181",
-"[ 	c #A1A1A1",
-"} 	c #ADADAD",
-"| 	c #C7C7C7",
-"1 	c #D4D4D4",
-"2 	c #D9D9D9",
-"3 	c #D7D7D7",
-"4 	c #D1D1D1",
-"5 	c #D2D2D2",
-"6 	c #CFCFCF",
-"7 	c #DCDCDC",
-"8 	c #BBBBBB",
-"9 	c #696969",
-"0 	c #000000",
-"a 	c #7C7C7C",
-"b 	c #D8D8D8",
-"c 	c #D5D5D5",
-"d 	c #DADADA",
-"e 	c #C5C5C5",
-"f 	c #B1B1B1",
-"g 	c #666666",
-"h 	c #515151",
-"i 	c #797979",
-"j 	c #A8A8A8",
-"k 	c #C8C8C8",
-"l 	c #DDDDDD",
-"m 	c #CACACA",
-"n 	c #B9B9B9",
-"o 	c #BDBDBD",
-"p 	c #646464",
-"q 	c #A2A2A2",
-"r 	c #D0D0D0",
-"s 	c #C2C2C2",
-"t 	c #D6D6D6",
-"u 	c #BEBEBE",
-"v 	c #A6A6A6",
-"w 	c #5D5D5D",
-"x 	c #4A4A4A",
-"y 	c #5C5C5C",
-"z 	c #6D6D6D",
-"A 	c #828282",
-"B 	c #A3A3A3",
-"C 	c #D3D3D3",
-"D 	c #AFAFAF",
-"E 	c #B6B6B6",
-"F 	c #CDCDCD",
-"G 	c #C0C0C0",
-"H 	c #9B9B9B",
-"I 	c #535353",
-"J 	c #3D3D3D",
-"K 	c #545454",
-"L 	c #7B7B7B",
-"M 	c #9E9E9E",
-"N 	c #E7E7E7",
-"O 	c #9F9F9F",
-"P 	c #636363",
-"Q 	c #BABABA",
-"R 	c #919191",
-"S 	c #4C4C4C",
-"T 	c #4E4E4E",
-"U 	c #787878",
-"V 	c #999999",
-"W 	c #BFBFBF",
-"X 	c #E8E8E8",
-"Y 	c #C3C3C3",
-"Z 	c #989898",
-"` 	c #C6C6C6",
-" .	c #ABABAB",
-"..	c #B5B5B5",
-"+.	c #8A8A8A",
-"@.	c #494949",
-"#.	c #595959",
-"$.	c #959595",
-"%.	c #C4C4C4",
-"&.	c #B4B4B4",
-"*.	c #616161",
-"=.	c #CECECE",
-"-.	c #B2B2B2",
-";.	c #555555",
-">.	c #929292",
-",.	c #8D8D8D",
-"'.	c #5E5E5E",
-").	c #C9C9C9",
-"!.	c #A5A5A5",
-"~.	c #8F8F8F",
-"{.	c #BCBCBC",
-"].	c #898989",
-"^.	c #B3B3B3",
-"/.	c #AEAEAE",
-"(.	c #B7B7B7",
-"_.	c #B0B0B0",
-":.	c #A9A9A9",
-"<.	c #AAAAAA",
-"[.	c #585858",
-"}.	c #7F7F7F",
-"|.	c #7D7D7D",
-"1.	c #565656",
-"2.	c #ACACAC",
-"3.	c #9C9C9C",
-"4.	c #878787",
-"5.	c #979797",
-"6.	c #505050",
-"7.	c #7A7A7A",
-"8.	c #8E8E8E",
-"9.	c #969696",
-"0.	c #6B6B6B",
-"a.	c #838383",
-"b.	c #A0A0A0",
-"c.	c #747474",
-"d.	c #757575",
-"e.	c #3F3F3F",
-"f.	c #727272",
-"g.	c #909090",
-"h.	c #717171",
-"i.	c #484848",
-"j.	c #4D4D4D",
-"k.	c #707070",
-"l.	c #686868",
-"m.	c #353535",
-"n.	c #656565",
-"o.	c #606060",
-"p.	c #5B5B5B",
-"q.	c #6A6A6A",
-"r.	c #5F5F5F",
-"s.	c #4B4B4B",
-"t.	c #373737",
-"u.	c #202020",
-"v.	c #131313",
-"w.	c #0B0B0B",
-"x.	c #060606",
-"y.	c #030303",
-"z.	c #010101",
-"  . + @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ + #   ",
-"$ % & * = - ; > > > > > > > , ' > ) ! ~ % > { ; ] > > > > > > > > > ^ / ( _ ",
-": < [ } | 1 - 2 3 3 4 4 5 5 6 7 8 9 0 0 a * b 7 c c 7 d c c - 2 4 e f g h 0 ",
-"g i + j k c l 3 1 1 ^ = m m n l o p 0 0 a n 1 q r r ; s r r t f | u v w x 0 ",
-"y z A B s t ' C l l m 6 ^ ^ & d D p 0 0 a E t q F F 7 q ^ ^ 5 f G 8 H I J 0 ",
-"K p L M G b N 3 - - e ^ | | O b o P 0 0 a * b q ^ ^ - q | | 4 f n Q R S ~ 0 ",
-"T w U V W d X b 2 2 G k Y Y Z b D ( 0 0 a * b q ^ ^ - q ` ` r  ...n +.S ~ 0 ",
-"@.#.U $.o - X b 3 3 8 %.W W R 3 &.*.0 0 a ..3 q m m d q ` ` =.& -...% S ~ 0 ",
-"@.;.z >.8 7 X d c c E G Q Q ,.b f '.0 0 a -.c q ).).2 q ` ` = !.D f A S ~ 0 ",
-"@.K z ~.n l X 2 C C f {.&.&.].2 &.w 0 0 a ^.C q k k b q m m = B /.} $ S ~ 0 ",
-"@.K z + (.l { ; 4 4 } .././.% 2 E #.0 0 a _.4 q k k 3 q ).).= B } :.$ S ~ 0 ",
-"@.I z +.E l l 7 r r <.D j j < 2 o [.0 0 a /.6 q | | c q ).).F q } & }.S ~ 0 ",
-"@.I z ].E 7 - 3 6 6 & j q q |.2 E 1.0 0 a 2.= q ` ` 5 q k k F q } & }.S ~ 0 ",
-"@.I z / E - b 5 = = !.[ 3.3.a 2 /.I 0 0 a :.| q s s =.q Y Y m q 2.& }.S ~ 0 ",
-"@.I z 4.E l 7 b k ).@ 5.$.$.L t !.6.0 0 a !.G q o o ).q Q Q e q  .j }.S ~ 0 ",
-"@.I z 4.^.5 k Y o ^.~.+.+.+.7./.5. at .0 0 a V [ 3.v v &.8.B B -.q 9.+.0.S ~ 0 ",
-"@.I ( a.3.b.~.a.|.|.7.7.c.% i c.d.e.0 0 a + ~.d.a a ].f.7.7.g.|.i h.P i.~ 0 ",
-"i.j.P ( 0.: : 0.k.: 9 ( w l.p 0.P m.0 0 i.n.g o.P w p.p p.q.'.r.p *.r.p.S 0 ",
-"  o.s.t.u.v.w.x.y.z.0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "};
diff --git a/gtk2_ardour/pixmaps/hslider01.xpm b/gtk2_ardour/pixmaps/hslider01.xpm
deleted file mode 100644
index 65b51b7..0000000
--- a/gtk2_ardour/pixmaps/hslider01.xpm
+++ /dev/null
@@ -1,25 +0,0 @@
-/* XPM */
-static char * hslider01_xpm[] = {
-"149 20 2 1",
-" 	c None",
-".	c #000000",
-"                                                                                                                                                     ",
-"                                                                                                                                                     ",
-"                                                                                                                                                     ",
-"                                                                                                                                                     ",
-"                                                                                                                                                     ",
-"                                                                                                                                                     ",
-"                                                                                                                                                     ",
-"                                                                                                                                                     ",
-"                                                                                                                                                     ",
-".....................................................................................................................................................",
-".....................................................................................................................................................",
-".....................................................................................................................................................",
-"                                                                                                                                                     ",
-"                                                                                                                                                     ",
-"                                                                                                                                                     ",
-"                                                                                                                                                     ",
-"                                                                                                                                                     ",
-"                                                                                                                                                     ",
-"                                                                                                                                                     ",
-"                                                                                                                                                     "};
diff --git a/gtk2_ardour/pixmaps/left_arrow.xpm b/gtk2_ardour/pixmaps/left_arrow.xpm
deleted file mode 100644
index 819f19b..0000000
--- a/gtk2_ardour/pixmaps/left_arrow.xpm
+++ /dev/null
@@ -1,22 +0,0 @@
-/* XPM */
-static char * left_arrow_xpm[] = {
-"12 12 7 1",
-" 	c None",
-".	c #000000",
-"+	c #FFFFFF",
-"@	c #020202",
-"#	c #0B0B0B",
-"$	c #131313",
-"%	c #121212",
-"      ....  ",
-"     ..++.  ",
-"    ..++..  ",
-"   ..++..   ",
-"  ..++..    ",
-" ..++..     ",
-" ..++ at .     ",
-"  ..++#.    ",
-"   ..++$.   ",
-"    ..++%.  ",
-"     ..++.  ",
-"      ....  "};
diff --git a/gtk2_ardour/pixmaps/linin.xpm b/gtk2_ardour/pixmaps/linin.xpm
deleted file mode 100644
index 01f7c3b..0000000
--- a/gtk2_ardour/pixmaps/linin.xpm
+++ /dev/null
@@ -1,31 +0,0 @@
-/* XPM */
-static const gchar * linin_xpm[] = {
-"25 25 3 1",
-" 	c None",
-".	c #FDFD00",
-"+	c #FEFE00",
-"                         ",
-"                         ",
-"                         ",
-"                         ",
-"                   .+.   ",
-"                  +++.   ",
-"                 ++++    ",
-"                ++++     ",
-"               ++++      ",
-"              ++++       ",
-"             +++.        ",
-"            +++          ",
-"           +++           ",
-"          +++            ",
-"        .+++             ",
-"       ++++              ",
-"      ++++               ",
-"     ++++                ",
-"    ++++                 ",
-"   .+++                  ",
-"   .++                   ",
-"    +                    ",
-"                         ",
-"                         ",
-"                         "};
diff --git a/gtk2_ardour/pixmaps/linout.xpm b/gtk2_ardour/pixmaps/linout.xpm
deleted file mode 100644
index f38a849..0000000
--- a/gtk2_ardour/pixmaps/linout.xpm
+++ /dev/null
@@ -1,31 +0,0 @@
-/* XPM */
-static const gchar * linout_xpm[] = {
-"25 25 3 1",
-" 	c None",
-".	c #FDFD00",
-"+	c #FEFE00",
-"                         ",
-"                         ",
-"                         ",
-"    ..                   ",
-"    +++                  ",
-"    .+++                 ",
-"     ++++                ",
-"      ++++               ",
-"       +++.              ",
-"        +++              ",
-"         +++             ",
-"          +++            ",
-"           +++           ",
-"            +++          ",
-"             +++         ",
-"              +++        ",
-"              .+++       ",
-"               ++++      ",
-"                ++++     ",
-"                 ++++    ",
-"                  ++++   ",
-"                   ..    ",
-"                         ",
-"                         ",
-"                         "};
diff --git a/gtk2_ardour/pixmaps/loin.xpm b/gtk2_ardour/pixmaps/loin.xpm
deleted file mode 100644
index 856cf2e..0000000
--- a/gtk2_ardour/pixmaps/loin.xpm
+++ /dev/null
@@ -1,31 +0,0 @@
-/* XPM */
-static const gchar * loin_xpm[] = {
-"25 25 3 1",
-" 	c None",
-".	c #F6F92A",
-"+	c #F6FA2A",
-"                         ",
-"                         ",
-"                 .+.     ",
-"                 +++     ",
-"                 +++     ",
-"                 +++     ",
-"                 +++     ",
-"                 ++      ",
-"                +++      ",
-"                +++      ",
-"                +++      ",
-"                +++      ",
-"               +++       ",
-"               +++       ",
-"              +++        ",
-"             ++++        ",
-"           +++++         ",
-"         ++++++          ",
-"    .++++++++            ",
-"    .+++++++             ",
-"                         ",
-"                         ",
-"                         ",
-"                         ",
-"                         "};
diff --git a/gtk2_ardour/pixmaps/loop.xpm b/gtk2_ardour/pixmaps/loop.xpm
deleted file mode 100644
index 936c2e8..0000000
--- a/gtk2_ardour/pixmaps/loop.xpm
+++ /dev/null
@@ -1,122 +0,0 @@
-/* XPM */
-static const gchar * loop_xpm[] = {
-"17 25 94 2",
-"  	c None",
-". 	c #4C4C4C",
-"+ 	c #555555",
-"@ 	c #454545",
-"# 	c #242424",
-"$ 	c #5E5E5E",
-"% 	c #000000",
-"& 	c #6B6B6B",
-"* 	c #484848",
-"= 	c #4E4E4E",
-"- 	c #6A6A6A",
-"; 	c #717171",
-"> 	c #686868",
-", 	c #838383",
-"' 	c #888888",
-") 	c #676767",
-"! 	c #4A4A4A",
-"~ 	c #474747",
-"{ 	c #939393",
-"] 	c #949494",
-"^ 	c #9E9E9E",
-"/ 	c #4B4B4B",
-"( 	c #A1A1A1",
-"_ 	c #A0A0A0",
-": 	c #A5A5A5",
-"< 	c #B2B2B2",
-"[ 	c #646464",
-"} 	c #ADADAD",
-"| 	c #AAAAAA",
-"1 	c #B1B1B1",
-"2 	c #494949",
-"3 	c #9A9A9A",
-"4 	c #A2A2A2",
-"5 	c #A7A7A7",
-"6 	c #A8A8A8",
-"7 	c #C1C1C1",
-"8 	c #696969",
-"9 	c #656565",
-"0 	c #B6B6B6",
-"a 	c #404040",
-"b 	c #989898",
-"c 	c #9D9D9D",
-"d 	c #999999",
-"e 	c #A3A3A3",
-"f 	c #C4C4C4",
-"g 	c #707070",
-"h 	c #C2C2C2",
-"i 	c #9C9C9C",
-"j 	c #969696",
-"k 	c #A4A4A4",
-"l 	c #777777",
-"m 	c #979797",
-"n 	c #2F2F2F",
-"o 	c #A9A9A9",
-"p 	c #7D7D7D",
-"q 	c #6D6D6D",
-"r 	c #959595",
-"s 	c #AFAFAF",
-"t 	c #848484",
-"u 	c #7F7F7F",
-"v 	c #3B3B3B",
-"w 	c #9B9B9B",
-"x 	c #2B2B2B",
-"y 	c #BFBFBF",
-"z 	c #B3B3B3",
-"A 	c #8A8A8A",
-"B 	c #858585",
-"C 	c #2E2E2E",
-"D 	c #C3C3C3",
-"E 	c #B8B8B8",
-"F 	c #464646",
-"G 	c #8E8E8E",
-"H 	c #898989",
-"I 	c #8D8D8D",
-"J 	c #797979",
-"K 	c #BCBCBC",
-"L 	c #909090",
-"M 	c #8C8C8C",
-"N 	c #2A2A2A",
-"O 	c #747474",
-"P 	c #818181",
-"Q 	c #808080",
-"R 	c #C6C6C6",
-"S 	c #C0C0C0",
-"T 	c #787878",
-"U 	c #868686",
-"V 	c #878787",
-"W 	c #8B8B8B",
-"X 	c #666666",
-"Y 	c #BDBDBD",
-"Z 	c #929292",
-"` 	c #6C6C6C",
-" .	c #505050",
-"..	c #C8C8C8",
-"      . +                         ",
-"      @ # $                       ",
-"      @ % @ &                     ",
-"      * % % = -                   ",
-"      * % ; % = >                 ",
-"      * % , ' % = )               ",
-"* ! ! ~ % { ] ^ % / . ! * ~ * +   ",
-"~ % % % % ( _ : < % % % % % % % ) ",
-"* % $ [ % } | 1 % 2 3 ^ 4 5 6 % 7 ",
-"* % 8 9 % 0 0 % a b c d c _ e % f ",
-"* % g 8 % h % a b i b j c 4 k % 7 ",
-"* % l g % % . m i j j 3 n o o % 7 ",
-"~ % p l % q d i j r b # % 0 s % 7 ",
-"~ % t u v b w j r d x % % y z % 7 ",
-"~ % A B A b j ] d C % [ % D E % 7 ",
-"F % G H I { ] b C % q J % f K % 7 ",
-"~ % L M G { b N % O P Q % R S % 7 ",
-"+ % % % % % % % T U V W % % % % D ",
-"  X 7 D 7 7 Y = % I Z b % 7 7 K 7 ",
-"              ` = % ( : % 7       ",
-"                8 = % z % 7       ",
-"                  X / % % 7       ",
-"                    X  .% ..      ",
-"                      - 9 ..      ",
-"                        q I       "};
diff --git a/gtk2_ardour/pixmaps/loout.xpm b/gtk2_ardour/pixmaps/loout.xpm
deleted file mode 100644
index 316de02..0000000
--- a/gtk2_ardour/pixmaps/loout.xpm
+++ /dev/null
@@ -1,31 +0,0 @@
-/* XPM */
-static const gchar * loout_xpm[] = {
-"25 25 3 1",
-" 	c None",
-".	c #F6F92A",
-"+	c #F6FA2A",
-"                         ",
-"                         ",
-"    ..                   ",
-"    ++                   ",
-"    ++                   ",
-"    ++                   ",
-"    ++                   ",
-"    ++                   ",
-"    +++                  ",
-"    +++                  ",
-"    +++                  ",
-"    ++++                 ",
-"     +++                 ",
-"     +++                 ",
-"      +++                ",
-"      ++++               ",
-"       +++++             ",
-"        ++++++           ",
-"         +++++++++.      ",
-"           ++++++++      ",
-"              ++++.      ",
-"                         ",
-"                         ",
-"                         ",
-"                         "};
diff --git a/gtk2_ardour/pixmaps/lr.xpm b/gtk2_ardour/pixmaps/lr.xpm
deleted file mode 100644
index b045c94..0000000
--- a/gtk2_ardour/pixmaps/lr.xpm
+++ /dev/null
@@ -1,16 +0,0 @@
-/* XPM */
-static const gchar * lr_xpm[] = {
-"11 11 2 1",
-" 	c None",
-".	c #cccccc",
-"           ",
-"           ",
-"   .   .   ",
-"  .     .  ",
-" .       . ",
-"...........",
-" .       . ",
-"  .     .  ",
-"   .   .   ",
-"           ",
-"           "};
diff --git a/gtk2_ardour/pixmaps/regin.xpm b/gtk2_ardour/pixmaps/regin.xpm
deleted file mode 100644
index f59730d..0000000
--- a/gtk2_ardour/pixmaps/regin.xpm
+++ /dev/null
@@ -1,31 +0,0 @@
-/* XPM */
-static const gchar * regin_xpm[] = {
-"25 25 3 1",
-" 	c None",
-".	c #FDFD00",
-"+	c #FEFE00",
-"                         ",
-"                         ",
-"                         ",
-"                         ",
-"               .++++.    ",
-"             .++++++.    ",
-"           .+++++.       ",
-"          +++++.         ",
-"         ++++            ",
-"        ++++             ",
-"       ++++              ",
-"      .+++               ",
-"      +++                ",
-"     .++                 ",
-"     +++                 ",
-"    .++.                 ",
-"    +++                  ",
-"    ++.                  ",
-"    ++                   ",
-"    ++                   ",
-"    ++                   ",
-"    ..                   ",
-"                         ",
-"                         ",
-"                         "};
diff --git a/gtk2_ardour/pixmaps/regin2.xpm b/gtk2_ardour/pixmaps/regin2.xpm
deleted file mode 100644
index 4d7f849..0000000
--- a/gtk2_ardour/pixmaps/regin2.xpm
+++ /dev/null
@@ -1,31 +0,0 @@
-/* XPM */
-static const gchar * regin2_xpm[] = {
-"25 25 3 1",
-" 	c None",
-".	c #FDFD00",
-"+	c #FEFE00",
-"                         ",
-"                         ",
-"                  .+.    ",
-"                  +++    ",
-"                  +++    ",
-"                  ++.    ",
-"                 .++     ",
-"                 +++     ",
-"                 ++.     ",
-"                .++      ",
-"                +++      ",
-"               .++.      ",
-"               +++       ",
-"              +++.       ",
-"             ++++        ",
-"           .++++         ",
-"         .+++++          ",
-"      .++++++.           ",
-"    .++++++.             ",
-"    ++++.                ",
-"    ..                   ",
-"                         ",
-"                         ",
-"                         ",
-"                         "};
diff --git a/gtk2_ardour/pixmaps/regout.xpm b/gtk2_ardour/pixmaps/regout.xpm
deleted file mode 100644
index 723a6ac..0000000
--- a/gtk2_ardour/pixmaps/regout.xpm
+++ /dev/null
@@ -1,31 +0,0 @@
-/* XPM */
-static const gchar * regout_xpm[] = {
-"25 25 3 1",
-" 	c None",
-".	c #FDFD00",
-"+	c #FEFE00",
-"                         ",
-"                         ",
-"                         ",
-"                         ",
-"    .++++.               ",
-"    .++++++.             ",
-"       .+++++.           ",
-"         .+++++          ",
-"            ++++         ",
-"             ++++        ",
-"              ++++       ",
-"               +++.      ",
-"                +++      ",
-"                 ++.     ",
-"                 +++     ",
-"                 .++.    ",
-"                  +++    ",
-"                  .++    ",
-"                   ++    ",
-"                   ++    ",
-"                   ++    ",
-"                   ..    ",
-"                         ",
-"                         ",
-"                         "};
diff --git a/gtk2_ardour/pixmaps/regout2.xpm b/gtk2_ardour/pixmaps/regout2.xpm
deleted file mode 100644
index ddb76df..0000000
--- a/gtk2_ardour/pixmaps/regout2.xpm
+++ /dev/null
@@ -1,31 +0,0 @@
-/* XPM */
-static const gchar * regout2_xpm[] = {
-"25 25 3 1",
-" 	c None",
-".	c #FDFD00",
-"+	c #FEFE00",
-"                         ",
-"                         ",
-"   .+.                   ",
-"   +++                   ",
-"   +++                   ",
-"   +++                   ",
-"   .++                   ",
-"    ++                   ",
-"    ++.                  ",
-"    +++                  ",
-"    .++                  ",
-"     +++                 ",
-"      +++                ",
-"      .+++               ",
-"       ++++              ",
-"        ++++             ",
-"         +++++.          ",
-"          .+++++.        ",
-"            .++++++.     ",
-"              .+++++     ",
-"                 .+.     ",
-"                         ",
-"                         ",
-"                         ",
-"                         "};
diff --git a/gtk2_ardour/pixmaps/revdblarrow.xpm b/gtk2_ardour/pixmaps/revdblarrow.xpm
deleted file mode 100644
index 35f8b4d..0000000
--- a/gtk2_ardour/pixmaps/revdblarrow.xpm
+++ /dev/null
@@ -1,17 +0,0 @@
-/* XPM */
-static const gchar * revdblarrow_xpm[] = {
-"20 11 3 1",
-" 	c None",
-".	c #000000",
-"+	c #FFFFFF",
-"              ..    ",
-"              .+.   ",
-"              .++.  ",
-" ..............+++. ",
-" .+++++++++++++++++.",
-" ...................",
-" .+++++++++++++++++.",
-"  .+++..............",
-"   .++.             ",
-"    .+.             ",
-"     ..             "};
diff --git a/gtk2_ardour/pixmaps/right_arrow.xpm b/gtk2_ardour/pixmaps/right_arrow.xpm
deleted file mode 100644
index 7c77303..0000000
--- a/gtk2_ardour/pixmaps/right_arrow.xpm
+++ /dev/null
@@ -1,22 +0,0 @@
-/* XPM */
-static char * right_arrow_xpm[] = {
-"12 12 7 1",
-" 	c None",
-".	c #000000",
-"+	c #FFFFFF",
-"@	c #020202",
-"#	c #0B0B0B",
-"$	c #131313",
-"%	c #121212",
-"  ....      ",
-"  .++..     ",
-"  ..++..    ",
-"   ..++..   ",
-"    ..++..  ",
-"     ..++.. ",
-"     . at ++.. ",
-"    .#++..  ",
-"   .$++..   ",
-"  .%++..    ",
-"  .++..     ",
-"  ....      "};
diff --git a/gtk2_ardour/pixmaps/set-next-button.xpm b/gtk2_ardour/pixmaps/set-next-button.xpm
deleted file mode 100644
index ab1a47b..0000000
--- a/gtk2_ardour/pixmaps/set-next-button.xpm
+++ /dev/null
@@ -1,1833 +0,0 @@
-/* XPM */
-static char * set_next_button_xpm[] = {
-"131 34 1796 2",
-"  	c None",
-". 	c #526770",
-"+ 	c #52666E",
-"@ 	c #4D5F67",
-"# 	c #495A62",
-"$ 	c #3C5159",
-"% 	c #384D56",
-"& 	c #344954",
-"* 	c #334853",
-"= 	c #334852",
-"- 	c #334750",
-"; 	c #33474F",
-"> 	c #33474C",
-", 	c #33484F",
-"' 	c #334950",
-") 	c #33484E",
-"! 	c #33484D",
-"~ 	c #33464C",
-"{ 	c #33464B",
-"] 	c #33454A",
-"^ 	c #334349",
-"/ 	c #334348",
-"( 	c #334445",
-"_ 	c #334244",
-": 	c #334144",
-"< 	c #304044",
-"[ 	c #2F4044",
-"} 	c #2F4145",
-"| 	c #2F4246",
-"1 	c #2F3E44",
-"2 	c #2F3F44",
-"3 	c #2D3F42",
-"4 	c #2C3E42",
-"5 	c #2A3C40",
-"6 	c #2A3D40",
-"7 	c #2B3F40",
-"8 	c #2E3E40",
-"9 	c #2F3E40",
-"0 	c #2C3E40",
-"a 	c #2B3E40",
-"b 	c #2A3E40",
-"c 	c #2A3B40",
-"d 	c #2A3A40",
-"e 	c #2A3A41",
-"f 	c #2A3B41",
-"g 	c #2A3B3F",
-"h 	c #2A3A3F",
-"i 	c #2A383B",
-"j 	c #2A393B",
-"k 	c #2A3B3E",
-"l 	c #2A393C",
-"m 	c #2A393A",
-"n 	c #2A383A",
-"o 	c #28383A",
-"p 	c #27383A",
-"q 	c #25393A",
-"r 	c #25383B",
-"s 	c #25363C",
-"t 	c #25343B",
-"u 	c #25333A",
-"v 	c #25343A",
-"w 	c #25353A",
-"x 	c #25363A",
-"y 	c #25373A",
-"z 	c #243538",
-"A 	c #213133",
-"B 	c #203032",
-"C 	c #203031",
-"D 	c #202E31",
-"E 	c #1F2D31",
-"F 	c #1D2D31",
-"G 	c #1E2E31",
-"H 	c #202F34",
-"I 	c #223036",
-"J 	c #2A3940",
-"K 	c #314048",
-"L 	c #48565E",
-"M 	c #4D5A62",
-"N 	c #485E63",
-"O 	c #40575C",
-"P 	c #2E4247",
-"Q 	c #26383D",
-"R 	c #1E3136",
-"S 	c #1E3036",
-"T 	c #1F3138",
-"U 	c #1E3138",
-"V 	c #1D3138",
-"W 	c #1F3139",
-"X 	c #203139",
-"Y 	c #203035",
-"Z 	c #202F32",
-"` 	c #1F2E31",
-" .	c #1F2E30",
-"..	c #1F2C30",
-"+.	c #1E2C30",
-"@.	c #1C2C30",
-"#.	c #1A2C30",
-"$.	c #192C30",
-"%.	c #1B2C30",
-"&.	c #1B2D2F",
-"*.	c #1C2D2E",
-"=.	c #1D2C2B",
-"-.	c #1B2C2A",
-";.	c #192C2A",
-">.	c #1A2C2A",
-",.	c #1D2C2A",
-"'.	c #1E2D2A",
-").	c #1B2C2B",
-"!.	c #192C2B",
-"~.	c #1B2D2A",
-"{.	c #1A2D2A",
-"].	c #1D2D2A",
-"^.	c #1B2C2C",
-"/.	c #1C2C2D",
-"(.	c #202E2F",
-"_.	c #1E2D2F",
-":.	c #1D2D2F",
-"<.	c #1B2B2D",
-"[.	c #1A2B2C",
-"}.	c #1E2D2D",
-"|.	c #1F2C2F",
-"1.	c #1E2B2D",
-"2.	c #1F2B2C",
-"3.	c #202C2A",
-"4.	c #202D2B",
-"5.	c #202B2B",
-"6.	c #202B2A",
-"7.	c #1E2B28",
-"8.	c #1E2B29",
-"9.	c #1D2B2B",
-"0.	c #1F2D2E",
-"a.	c #1B2A2B",
-"b.	c #1A2A2D",
-"c.	c #192B2F",
-"d.	c #1A2C2C",
-"e.	c #192C29",
-"f.	c #1C2C2A",
-"g.	c #1F2A2A",
-"h.	c #1E292A",
-"i.	c #1D292A",
-"j.	c #1C292A",
-"k.	c #1B292A",
-"l.	c #1B2A2A",
-"m.	c #1A2A2A",
-"n.	c #1A2A2B",
-"o.	c #19292E",
-"p.	c #19292D",
-"q.	c #1A292E",
-"r.	c #1B292F",
-"s.	c #1A2A2C",
-"t.	c #1A2B2A",
-"u.	c #192C28",
-"v.	c #1D2D2C",
-"w.	c #1E2E2F",
-"x.	c #202E32",
-"y.	c #203133",
-"z.	c #1F2F32",
-"A.	c #1E2E33",
-"B.	c #1F2F34",
-"C.	c #233338",
-"D.	c #35444A",
-"E.	c #39474E",
-"F.	c #3B4E51",
-"G.	c #2C3E41",
-"H.	c #203436",
-"I.	c #1C3031",
-"J.	c #1F3031",
-"K.	c #1F3032",
-"L.	c #1C3032",
-"M.	c #1A3032",
-"N.	c #1B3033",
-"O.	c #1D3033",
-"P.	c #1F2E34",
-"Q.	c #1D2C33",
-"R.	c #1C282E",
-"S.	c #1B262B",
-"T.	c #1A262A",
-"U.	c #192629",
-"V.	c #1A282A",
-"W.	c #1D2A2A",
-"X.	c #1E2B2A",
-"Y.	c #1C2A2A",
-"Z.	c #1D2B2A",
-"`.	c #1E2B2B",
-" +	c #1E2B2F",
-".+	c #1E2B2C",
-"++	c #202D2A",
-"@+	c #212D2A",
-"#+	c #1F2C2A",
-"$+	c #212C2A",
-"%+	c #212B2A",
-"&+	c #212B2B",
-"*+	c #212B2E",
-"=+	c #212B2F",
-"-+	c #202B2F",
-";+	c #202C2E",
-">+	c #212D2C",
-",+	c #212C2E",
-"'+	c #212D2F",
-")+	c #212F2D",
-"!+	c #212F2C",
-"~+	c #212F2B",
-"{+	c #212F29",
-"]+	c #202E29",
-"^+	c #1E2C28",
-"/+	c #1F2D2B",
-"(+	c #212F2E",
-"_+	c #212E2F",
-":+	c #212C2F",
-"<+	c #202C2F",
-"[+	c #1E2C2F",
-"}+	c #1F2E2F",
-"|+	c #202F2F",
-"1+	c #212F2F",
-"2+	c #1F2F2E",
-"3+	c #1E2E2D",
-"4+	c #222F2E",
-"5+	c #24302F",
-"6+	c #222E30",
-"7+	c #202D30",
-"8+	c #1E2D30",
-"9+	c #1E2E30",
-"0+	c #1E2F30",
-"a+	c #212F30",
-"b+	c #232F30",
-"c+	c #272F30",
-"d+	c #262F30",
-"e+	c #242F30",
-"f+	c #223030",
-"g+	c #213030",
-"h+	c #1F3230",
-"i+	c #203230",
-"j+	c #223230",
-"k+	c #23312E",
-"l+	c #24312D",
-"m+	c #25322E",
-"n+	c #26322F",
-"o+	c #23302C",
-"p+	c #1E2C27",
-"q+	c #1C2A28",
-"r+	c #1A2928",
-"s+	c #1A282B",
-"t+	c #1D292E",
-"u+	c #1F2C31",
-"v+	c #253237",
-"w+	c #263539",
-"x+	c #26373A",
-"y+	c #223639",
-"z+	c #213538",
-"A+	c #223338",
-"B+	c #233339",
-"C+	c #26343A",
-"D+	c #213337",
-"E+	c #223438",
-"F+	c #24363A",
-"G+	c #313F44",
-"H+	c #334146",
-"I+	c #314244",
-"J+	c #223435",
-"K+	c #213134",
-"L+	c #203034",
-"M+	c #223336",
-"N+	c #243439",
-"O+	c #243539",
-"P+	c #243639",
-"Q+	c #24353A",
-"R+	c #23343A",
-"S+	c #203136",
-"T+	c #182628",
-"U+	c #19252A",
-"V+	c #1A262B",
-"W+	c #212E33",
-"X+	c #263338",
-"Y+	c #2D3A40",
-"Z+	c #313E43",
-"`+	c #364346",
-" @	c #384548",
-".@	c #394749",
-"+@	c #394649",
-"@@	c #39494A",
-"#@	c #39484A",
-"$@	c #394849",
-"%@	c #39484C",
-"&@	c #39484D",
-"*@	c #39494D",
-"=@	c #394A4D",
-"-@	c #3B4A4D",
-";@	c #3C4A4D",
-">@	c #3D4A4D",
-",@	c #3E4A4D",
-"'@	c #3E4C4D",
-")@	c #3D4C4D",
-"!@	c #3D4B4D",
-"~@	c #3E4B4E",
-"{@	c #3F4B4F",
-"]@	c #414D51",
-"^@	c #414E52",
-"/@	c #414F50",
-"(@	c #415051",
-"_@	c #3F4D50",
-":@	c #3E4C4F",
-"<@	c #404E51",
-"[@	c #414F52",
-"}@	c #415155",
-"|@	c #415055",
-"1@	c #435055",
-"2@	c #455257",
-"3@	c #445257",
-"4@	c #425256",
-"5@	c #435255",
-"6@	c #455255",
-"7@	c #455256",
-"8@	c #455359",
-"9@	c #455259",
-"0@	c #455459",
-"a@	c #45555A",
-"b@	c #45545D",
-"c@	c #45545E",
-"d@	c #45555E",
-"e@	c #45555F",
-"f@	c #465661",
-"g@	c #485762",
-"h@	c #495862",
-"i@	c #4A5862",
-"j@	c #4B5862",
-"k@	c #4D5861",
-"l@	c #4C585E",
-"m@	c #4A585B",
-"n@	c #47585B",
-"o@	c #45585C",
-"p@	c #465960",
-"q@	c #475961",
-"r@	c #4B5A62",
-"s@	c #4C5A62",
-"t@	c #4D5962",
-"u@	c #4D5B62",
-"v@	c #4A595F",
-"w@	c #425356",
-"x@	c #3B4B4F",
-"y@	c #344347",
-"z@	c #273939",
-"A@	c #203332",
-"B@	c #1B2C2D",
-"C@	c #1F3033",
-"D@	c #2B3C42",
-"E@	c #304047",
-"F@	c #35444C",
-"G@	c #2F4347",
-"H@	c #2D4145",
-"I@	c #2E3E45",
-"J@	c #2E3D45",
-"K@	c #2F3D45",
-"L@	c #2E3B43",
-"M@	c #2D3A41",
-"N@	c #2C3B42",
-"O@	c #2D3C44",
-"P@	c #34434B",
-"Q@	c #36444D",
-"R@	c #324548",
-"S@	c #27393C",
-"T@	c #2A383F",
-"U@	c #2B3940",
-"V@	c #2E3D43",
-"W@	c #303F45",
-"X@	c #334149",
-"Y@	c #33424A",
-"Z@	c #33424B",
-"`@	c #29383C",
-" #	c #223232",
-".#	c #182824",
-"+#	c #22302F",
-"@#	c #2B3838",
-"##	c #434F57",
-"$#	c #515C67",
-"%#	c #606D7B",
-"&#	c #667583",
-"*#	c #6C7D8C",
-"=#	c #71818E",
-"-#	c #748390",
-";#	c #728290",
-">#	c #718290",
-",#	c #718391",
-"'#	c #718390",
-")#	c #718491",
-"!#	c #718592",
-"~#	c #718593",
-"{#	c #728693",
-"]#	c #728792",
-"^#	c #768791",
-"/#	c #788891",
-"(#	c #7A8C93",
-"_#	c #7A8B93",
-":#	c #7A8993",
-"<#	c #798894",
-"[#	c #788794",
-"}#	c #798996",
-"|#	c #798B98",
-"1#	c #7A8D9C",
-"2#	c #7A8C9C",
-"3#	c #7A8B9B",
-"4#	c #798997",
-"5#	c #788895",
-"6#	c #7A8C99",
-"7#	c #7B8D9B",
-"8#	c #7D8E9D",
-"9#	c #7C8D9D",
-"0#	c #7A8B9A",
-"a#	c #7B8C9D",
-"b#	c #7D8D9F",
-"c#	c #808FA2",
-"d#	c #8192A3",
-"e#	c #8193A4",
-"f#	c #8293A4",
-"g#	c #8292A4",
-"h#	c #8394A4",
-"i#	c #8395A4",
-"j#	c #8697A8",
-"k#	c #8393A4",
-"l#	c #8192A2",
-"m#	c #7F91A0",
-"n#	c #8294A3",
-"o#	c #8495A5",
-"p#	c #8496A7",
-"q#	c #8496A8",
-"r#	c #8596A8",
-"s#	c #8497AA",
-"t#	c #8597AA",
-"u#	c #8897A9",
-"v#	c #8997AA",
-"w#	c #8A98AC",
-"x#	c #8799AC",
-"y#	c #8699AC",
-"z#	c #8398AA",
-"A#	c #8297A8",
-"B#	c #8296A5",
-"C#	c #8497A8",
-"D#	c #8395A6",
-"E#	c #8496A5",
-"F#	c #8194A2",
-"G#	c #7B909C",
-"H#	c #738790",
-"I#	c #6B7D85",
-"J#	c #4F5F63",
-"K#	c #3D4E4E",
-"L#	c #203430",
-"M#	c #223533",
-"N#	c #364449",
-"O#	c #3B494F",
-"P#	c #404D54",
-"Q#	c #3C4D54",
-"R#	c #3A4C54",
-"S#	c #3A4852",
-"T#	c #3A4751",
-"U#	c #39464E",
-"V#	c #36434B",
-"W#	c #324049",
-"X#	c #32404A",
-"Y#	c #35464E",
-"Z#	c #36474F",
-"`#	c #3A4C51",
-" $	c #314348",
-".$	c #354249",
-"+$	c #38434B",
-"@$	c #3A474F",
-"#$	c #3D4952",
-"$$	c #404B56",
-"%$	c #404B57",
-"&$	c #404B58",
-"*$	c #3F4C57",
-"=$	c #3C4B52",
-"-$	c #304042",
-";$	c #273736",
-">$	c #192A24",
-",$	c #2E3C39",
-"'$	c #3E4A4A",
-")$	c #5F6974",
-"!$	c #717B8C",
-"~$	c #8795AC",
-"{$	c #8F9FB7",
-"]$	c #95A9C2",
-"^$	c #98AAC3",
-"/$	c #9AABC3",
-"($	c #9AABC2",
-"_$	c #9BACC3",
-":$	c #9DAFC5",
-"<$	c #9EAFC6",
-"[$	c #9EAEC6",
-"}$	c #9EADC6",
-"|$	c #9DADC6",
-"1$	c #9CADC6",
-"2$	c #9AADC5",
-"3$	c #99ADC4",
-"4$	c #99ACC4",
-"5$	c #99ACC3",
-"6$	c #9BAEC3",
-"7$	c #9BAFC4",
-"8$	c #9CB1C8",
-"9$	c #9CB0C8",
-"0$	c #9BAEC7",
-"a$	c #98ABC4",
-"b$	c #97AAC3",
-"c$	c #9BADC6",
-"d$	c #9DAEC8",
-"e$	c #9FB0CB",
-"f$	c #9EAFCB",
-"g$	c #9CADCA",
-"h$	c #9BADC9",
-"i$	c #A0B1CC",
-"j$	c #9EB1CE",
-"k$	c #9DAFCB",
-"l$	c #9BADC8",
-"m$	c #9BACC5",
-"n$	c #9BADC4",
-"o$	c #9BADC5",
-"p$	c #9BADCA",
-"q$	c #9CADC9",
-"r$	c #9DADC8",
-"s$	c #9EAFCA",
-"t$	c #9EB0CB",
-"u$	c #9EAFC9",
-"v$	c #9EAEC8",
-"w$	c #9DACC7",
-"x$	c #9DADC7",
-"y$	c #9EAFC8",
-"z$	c #9FB1C7",
-"A$	c #9FB2C7",
-"B$	c #9FB3C9",
-"C$	c #9EB2C9",
-"D$	c #9BAFC7",
-"E$	c #9AAFC5",
-"F$	c #99AEC3",
-"G$	c #9AB0C6",
-"H$	c #9AB1C8",
-"I$	c #9BB0CA",
-"J$	c #99AEC8",
-"K$	c #98ACC6",
-"L$	c #99AAC3",
-"M$	c #9AABC4",
-"N$	c #99ADC5",
-"O$	c #98ADC5",
-"P$	c #95ABC3",
-"Q$	c #94AAC3",
-"R$	c #94A9C3",
-"S$	c #95A9C3",
-"T$	c #96A9C3",
-"U$	c #98ACC5",
-"V$	c #99ADC6",
-"W$	c #99AEC7",
-"X$	c #9AAFC7",
-"Y$	c #9DB1C6",
-"Z$	c #95A8B9",
-"`$	c #8D9EAB",
-" %	c #6D7F85",
-".%	c #57696A",
-"+%	c #293E39",
-"@%	c #273B38",
-"#%	c #425259",
-"$%	c #485760",
-"%%	c #45575F",
-"&%	c #44565D",
-"*%	c #42515A",
-"=%	c #414F59",
-"-%	c #404D58",
-";%	c #3D4A54",
-">%	c #3A4750",
-",%	c #384550",
-"'%	c #384551",
-")%	c #3B4754",
-"!%	c #3C4855",
-"~%	c #3C4F56",
-"{%	c #34484F",
-"]%	c #3A4A53",
-"^%	c #3E4C56",
-"/%	c #425059",
-"(%	c #45525B",
-"_%	c #49545E",
-":%	c #4A555E",
-"<%	c #49565E",
-"[%	c #45535B",
-"}%	c #37454B",
-"|%	c #2E3C3E",
-"1%	c #202E2B",
-"2%	c #394344",
-"3%	c #4D5459",
-"4%	c #6C7484",
-"5%	c #7C869A",
-"6%	c #8D9AB2",
-"7%	c #909EB7",
-"8%	c #919FB9",
-"9%	c #8F9DB7",
-"0%	c #8E9BB6",
-"a%	c #8A9AB5",
-"b%	c #8899B4",
-"c%	c #8798B4",
-"d%	c #8797B4",
-"e%	c #8796B4",
-"f%	c #8696B4",
-"g%	c #8596B4",
-"h%	c #8395B4",
-"i%	c #8395B3",
-"j%	c #8395B1",
-"k%	c #8395B2",
-"l%	c #8596B0",
-"m%	c #8596B1",
-"n%	c #8696B2",
-"o%	c #8495B0",
-"p%	c #8394B0",
-"q%	c #8393B0",
-"r%	c #8495B4",
-"s%	c #8595B4",
-"t%	c #8695B4",
-"u%	c #8496B0",
-"v%	c #8395AB",
-"w%	c #8394AB",
-"x%	c #8393AB",
-"y%	c #8392AB",
-"z%	c #8494AC",
-"A%	c #8695AE",
-"B%	c #8796AF",
-"C%	c #8594AE",
-"D%	c #8593AD",
-"E%	c #8595AE",
-"F%	c #8594AC",
-"G%	c #8594AB",
-"H%	c #8396AB",
-"I%	c #8397AB",
-"J%	c #8395AD",
-"K%	c #8394AE",
-"L%	c #8395B0",
-"M%	c #8394AF",
-"N%	c #8393AD",
-"O%	c #8392AC",
-"P%	c #8193A9",
-"Q%	c #8293A9",
-"R%	c #8394A9",
-"S%	c #8495A7",
-"T%	c #76878E",
-"U%	c #68787B",
-"V%	c #374844",
-"W%	c #324340",
-"X%	c #405153",
-"Y%	c #45585D",
-"Z%	c #4A5D65",
-"`%	c #495C63",
-" &	c #485B62",
-".&	c #485962",
-"+&	c #465660",
-"@&	c #43535D",
-"#&	c #40505A",
-"$&	c #3E4D57",
-"%&	c #3A4953",
-"&&	c #3A4853",
-"*&	c #3D4B56",
-"=&	c #3E4C57",
-"-&	c #44545C",
-";&	c #3E4E57",
-">&	c #404F59",
-",&	c #42515B",
-"'&	c #49575E",
-")&	c #4A5960",
-"!&	c #4A5A62",
-"~&	c #4A5B62",
-"{&	c #47585E",
-"]&	c #303D41",
-"^&	c #252E31",
-"/&	c #3D464E",
-"(&	c #505964",
-"_&	c #6B7785",
-":&	c #778495",
-"<&	c #808EA4",
-"[&	c #8290A8",
-"}&	c #8390A9",
-"|&	c #838FA7",
-"1&	c #828EA6",
-"2&	c #808CA4",
-"3&	c #808DA4",
-"4&	c #808FA4",
-"5&	c #7D8DA3",
-"6&	c #7B8CA2",
-"7&	c #7B8DA4",
-"8&	c #7B8CA4",
-"9&	c #7B8CA3",
-"0&	c #7B8DA3",
-"a&	c #7C8DA4",
-"b&	c #8290A4",
-"c&	c #838FA4",
-"d&	c #838EA4",
-"e&	c #838DA4",
-"f&	c #818DA2",
-"g&	c #808DA1",
-"h&	c #828DA3",
-"i&	c #828FA3",
-"j&	c #818EA2",
-"k&	c #7F8CA0",
-"l&	c #7E8CA0",
-"m&	c #7F8DA1",
-"n&	c #7F8DA2",
-"o&	c #7F8EA3",
-"p&	c #8090A6",
-"q&	c #8090A7",
-"r&	c #8090A9",
-"s&	c #8090A8",
-"t&	c #808FA6",
-"u&	c #808FA5",
-"v&	c #808EA3",
-"w&	c #808DA2",
-"x&	c #808CA1",
-"y&	c #808EA0",
-"z&	c #7F8E9D",
-"A&	c #75848D",
-"B&	c #69777C",
-"C&	c #394647",
-"D&	c #344142",
-"E&	c #415053",
-"F&	c #46585E",
-"G&	c #4A5F67",
-"H&	c #4A5E67",
-"I&	c #4A5D66",
-"J&	c #475B61",
-"K&	c #42585F",
-"L&	c #41545B",
-"M&	c #415058",
-"N&	c #3D4C54",
-"O&	c #3D4B54",
-"P&	c #404D56",
-"Q&	c #414E57",
-"R&	c #45595E",
-"S&	c #41545A",
-"T&	c #42555B",
-"U&	c #43565C",
-"V&	c #4A5D64",
-"W&	c #4B6067",
-"X&	c #4D6068",
-"Y&	c #4E6068",
-"Z&	c #4E5F67",
-"`&	c #37484D",
-" *	c #2E3E42",
-".*	c #253035",
-"+*	c #3D464F",
-"@*	c #4F5863",
-"#*	c #677684",
-"$*	c #738494",
-"%*	c #818DA3",
-"&*	c #828CA4",
-"**	c #7C89A2",
-"=*	c #7B8AA2",
-"-*	c #7B8AA1",
-";*	c #7B8BA2",
-">*	c #7B89A1",
-",*	c #7B89A0",
-"'*	c #7B899F",
-")*	c #7B889C",
-"!*	c #7B889B",
-"~*	c #7B8799",
-"{*	c #7B879A",
-"]*	c #7C8AA2",
-"^*	c #7F8CA2",
-"/*	c #808CA2",
-"(*	c #818CA2",
-"_*	c #7E8C9F",
-":*	c #7D8C9E",
-"<*	c #7E8D9F",
-"[*	c #7D8D9E",
-"}*	c #7B8B9C",
-"|*	c #7B8C9C",
-"1*	c #7D8C9D",
-"2*	c #7F8C9F",
-"3*	c #808B9F",
-"4*	c #808A9F",
-"5*	c #7F8B9F",
-"6*	c #7C8C9D",
-"7*	c #7C8B9D",
-"8*	c #7C8A9C",
-"9*	c #7B889A",
-"0*	c #7B8697",
-"a*	c #7B8696",
-"b*	c #7B8797",
-"c*	c #7B8999",
-"d*	c #7B8C9E",
-"e*	c #7B8BA0",
-"f*	c #7B8BA1",
-"g*	c #7B8DA2",
-"h*	c #7B8B9F",
-"i*	c #7B8A9D",
-"j*	c #7B8A9C",
-"k*	c #7C8A9D",
-"l*	c #7B8B9B",
-"m*	c #7B8B99",
-"n*	c #74838B",
-"o*	c #3C4647",
-"p*	c #364142",
-"q*	c #3E5053",
-"r*	c #45575E",
-"s*	c #4A5D67",
-"t*	c #4A5D68",
-"u*	c #4A5C63",
-"v*	c #495962",
-"w*	c #45565E",
-"x*	c #41535B",
-"y*	c #3D4E56",
-"z*	c #404E57",
-"A*	c #475960",
-"B*	c #495E64",
-"C*	c #4C616A",
-"D*	c #4D616A",
-"E*	c #4B5B62",
-"F*	c #374849",
-"G*	c #2F3F3F",
-"H*	c #263336",
-"I*	c #39474B",
-"J*	c #48575D",
-"K*	c #667684",
-"L*	c #748495",
-"M*	c #7C8B9F",
-"N*	c #7D8CA0",
-"O*	c #7E8B9F",
-"P*	c #7D8B9E",
-"Q*	c #7B899C",
-"R*	c #7B8B9D",
-"S*	c #7B8A9E",
-"T*	c #7B8595",
-"U*	c #7B8594",
-"V*	c #7B8695",
-"W*	c #7B8798",
-"X*	c #7B8698",
-"Y*	c #7B8998",
-"Z*	c #7C8999",
-"`*	c #7E899A",
-" =	c #7C8A9A",
-".=	c #7B8B9A",
-"+=	c #7B899A",
-"@=	c #7B8A9A",
-"#=	c #7D8898",
-"$=	c #7C8797",
-"%=	c #7C8696",
-"&=	c #7B8897",
-"*=	c #7B899B",
-"==	c #7B8D9C",
-"-=	c #74828B",
-";=	c #3D4647",
-">=	c #4A5C67",
-",=	c #4A5E69",
-"'=	c #4A5F69",
-")=	c #4A5F65",
-"!=	c #4A5E63",
-"~=	c #475860",
-"{=	c #44555F",
-"]=	c #3E4F57",
-"^=	c #3D4D54",
-"/=	c #425962",
-"(=	c #3C535C",
-"_=	c #435760",
-":=	c #475A62",
-"<=	c #4A6065",
-"[=	c #4A6166",
-"}=	c #4A6066",
-"|=	c #4A5F66",
-"1=	c #37494C",
-"2=	c #304144",
-"3=	c #29383B",
-"4=	c #3A484D",
-"5=	c #48565C",
-"6=	c #647481",
-"7=	c #718291",
-"8=	c #798A9A",
-"9=	c #7A8B9C",
-"0=	c #7A899A",
-"a=	c #798998",
-"b=	c #73828B",
-"c=	c #4A5D69",
-"d=	c #4A5D62",
-"e=	c #485960",
-"f=	c #46555F",
-"g=	c #3F4F57",
-"h=	c #45595F",
-"i=	c #40555C",
-"j=	c #445960",
-"k=	c #475C62",
-"l=	c #4B5F65",
-"m=	c #4D6066",
-"n=	c #4F6169",
-"o=	c #4C6067",
-"p=	c #4A5D63",
-"q=	c #47595E",
-"r=	c #3B494E",
-"s=	c #344145",
-"t=	c #29383A",
-"u=	c #3A4A50",
-"v=	c #485861",
-"w=	c #64737F",
-"x=	c #71808D",
-"y=	c #7A889A",
-"z=	c #7B869C",
-"A=	c #7B879C",
-"B=	c #8190A2",
-"C=	c #8E9EB0",
-"D=	c #8E9DAF",
-"E=	c #8E9DAE",
-"F=	c #8E9DAD",
-"G=	c #8E9BAA",
-"H=	c #8793A2",
-"I=	c #818C9B",
-"J=	c #818E9F",
-"K=	c #8797A9",
-"L=	c #8E9DB0",
-"M=	c #8D9DAF",
-"N=	c #7B859C",
-"O=	c #7A8A98",
-"P=	c #69777D",
-"Q=	c #3D474D",
-"R=	c #364148",
-"S=	c #3C4D55",
-"T=	c #42555D",
-"U=	c #475C63",
-"V=	c #495F63",
-"W=	c #4A6063",
-"X=	c #4A5E62",
-"Y=	c #485A60",
-"Z=	c #46575F",
-"`=	c #3F5159",
-" -	c #3D4E57",
-".-	c #404E59",
-"+-	c #414E5A",
-"@-	c #455A5F",
-"#-	c #41565C",
-"$-	c #455A60",
-"%-	c #495E65",
-"&-	c #4A6067",
-"*-	c #4B616A",
-"=-	c #344245",
-"--	c #293A39",
-";-	c #3B4C4F",
-">-	c #495A61",
-",-	c #65727D",
-"'-	c #727D8B",
-")-	c #7A8598",
-"!-	c #7B879B",
-"~-	c #7B859B",
-"{-	c #A2B2C4",
-"]-	c #B6C9D8",
-"^-	c #7A899B",
-"/-	c #8E9EAF",
-"(-	c #A2B2C1",
-"_-	c #9BAAB9",
-":-	c #7C8796",
-"<-	c #7D8897",
-"[-	c #818C9C",
-"}-	c #7B8596",
-"|-	c #9BAABB",
-"1-	c #95A4B6",
-"2-	c #7B8896",
-"3-	c #74828C",
-"4-	c #6A777F",
-"5-	c #3F494E",
-"6-	c #374448",
-"7-	c #3D4F55",
-"8-	c #42565C",
-"9-	c #475B62",
-"0-	c #495F62",
-"a-	c #4A6163",
-"b-	c #4C5F65",
-"c-	c #42535B",
-"d-	c #40515A",
-"e-	c #41505A",
-"f-	c #455B5F",
-"g-	c #41575C",
-"h-	c #455860",
-"i-	c #4A616A",
-"j-	c #4A5C61",
-"k-	c #47585D",
-"l-	c #3B484E",
-"m-	c #344146",
-"n-	c #293A3B",
-"o-	c #3C4C50",
-"p-	c #4B5A61",
-"q-	c #66717D",
-"r-	c #727C8B",
-"s-	c #7A8397",
-"t-	c #7B859A",
-"u-	c #95A3B3",
-"v-	c #A2B2C3",
-"w-	c #8E9CAF",
-"x-	c #9BABBB",
-"y-	c #798797",
-"z-	c #778594",
-"A-	c #8D9BAC",
-"B-	c #A8B9C9",
-"C-	c #A8B9C8",
-"D-	c #AFC1D0",
-"E-	c #84909F",
-"F-	c #7C8695",
-"G-	c #9BAABA",
-"H-	c #818C9E",
-"I-	c #818EA1",
-"J-	c #8D9CAC",
-"K-	c #8E9CAC",
-"L-	c #8E9BAE",
-"M-	c #7B8598",
-"N-	c #74828E",
-"O-	c #6A7781",
-"P-	c #3F4A4E",
-"Q-	c #394548",
-"R-	c #405055",
-"S-	c #45565C",
-"T-	c #4A5F62",
-"U-	c #4C6066",
-"V-	c #4B5E65",
-"W-	c #41515A",
-"X-	c #3A494F",
-"Y-	c #485661",
-"Z-	c #656F7D",
-"`-	c #727B8B",
-" ;	c #7A8297",
-".;	c #7B849A",
-"+;	c #7B8597",
-"@;	c #8F9CAB",
-"#;	c #8E9BAB",
-"$;	c #8E9AAA",
-"%;	c #7B8294",
-"&;	c #7B8496",
-"*;	c #7B8A97",
-"=;	c #74828A",
-"-;	c #6A777D",
-";;	c #394448",
-">;	c #4A6062",
-",;	c #4A5E64",
-"';	c #41535A",
-");	c #4D6067",
-"!;	c #4F616A",
-"~;	c #4C6167",
-"{;	c #4A6165",
-"];	c #495D63",
-"^;	c #3A484E",
-"/;	c #334145",
-"(;	c #3A484C",
-"_;	c #48555B",
-":;	c #646F7B",
-"<;	c #717B8A",
-"[;	c #7A8396",
-"};	c #7B8499",
-"|;	c #7B8599",
-"1;	c #95A3B2",
-"2;	c #7B8494",
-"3;	c #8D99AA",
-"4;	c #788194",
-"5;	c #798694",
-"6;	c #73818C",
-"7;	c #6A7780",
-"8;	c #3F4B4E",
-"9;	c #384648",
-"0;	c #3F5155",
-"a;	c #4A5F63",
-"b;	c #485A61",
-"c;	c #46585F",
-"d;	c #445359",
-"e;	c #4A6167",
-"f;	c #465D63",
-"g;	c #42575E",
-"h;	c #36464E",
-"i;	c #303F47",
-"j;	c #29383E",
-"k;	c #38464D",
-"l;	c #636D79",
-"m;	c #707A88",
-"n;	c #798292",
-"o;	c #7B8495",
-"p;	c #7B8394",
-"q;	c #768394",
-"r;	c #798494",
-"s;	c #74828D",
-"t;	c #697881",
-"u;	c #3D4D4E",
-"v;	c #364748",
-"w;	c #3E5155",
-"x;	c #4A5E68",
-"y;	c #4A5F6A",
-"z;	c #4A5E6A",
-"A;	c #46595F",
-"B;	c #42545A",
-"C;	c #425258",
-"D;	c #455557",
-"E;	c #465557",
-"F;	c #37494E",
-"G;	c #304147",
-"H;	c #626D79",
-"I;	c #6F7A88",
-"J;	c #788192",
-"K;	c #7A8394",
-"L;	c #3D4D50",
-"M;	c #36474A",
-"N;	c #3E5156",
-"O;	c #45565D",
-"P;	c #4A5D6A",
-"Q;	c #465C5F",
-"R;	c #42595C",
-"S;	c #475A60",
-"T;	c #495C62",
-"U;	c #4A5E65",
-"V;	c #606D79",
-"W;	c #6D7988",
-"X;	c #748092",
-"Y;	c #778294",
-"Z;	c #7A8294",
-"`;	c #7B8194",
-" >	c #74818D",
-".>	c #697882",
-"+>	c #36474E",
-"@>	c #3E5157",
-"#>	c #4A5C65",
-"$>	c #465C63",
-"%>	c #435960",
-"&>	c #4A5C62",
-"*>	c #4A6169",
-"=>	c #475A5E",
-"->	c #455159",
-";>	c #5D6C79",
-">>	c #6A7888",
-",>	c #768092",
-"'>	c #798294",
-")>	c #788294",
-"!>	c #758194",
-"~>	c #778194",
-"{>	c #798194",
-"]>	c #7A8194",
-"^>	c #3D4D55",
-"/>	c #4A5C64",
-"(>	c #42595F",
-"_>	c #465A61",
-":>	c #485C62",
-"<>	c #4A6064",
-"[>	c #4A6168",
-"}>	c #47595F",
-"|>	c #37494F",
-"1>	c #304247",
-"2>	c #29393D",
-"3>	c #35464C",
-"4>	c #405159",
-"5>	c #5E6C79",
-"6>	c #6C7988",
-"7>	c #778292",
-"8>	c #7A8494",
-"9>	c #748194",
-"0>	c #748294",
-"a>	c #778394",
-"b>	c #A2B1C1",
-"c>	c #808B9B",
-"d>	c #9AAAB9",
-"e>	c #7A8594",
-"f>	c #A1B1C1",
-"g>	c #8B9AAA",
-"h>	c #758394",
-"i>	c #768494",
-"j>	c #778494",
-"k>	c #788494",
-"l>	c #798393",
-"m>	c #788293",
-"n>	c #727F8B",
-"o>	c #687680",
-"p>	c #3F4D55",
-"q>	c #39484F",
-"r>	c #3F515A",
-"s>	c #455761",
-"t>	c #4A5C66",
-"u>	c #415159",
-"v>	c #445458",
-"w>	c #41585C",
-"x>	c #496062",
-"y>	c #4A6164",
-"z>	c #47585F",
-"A>	c #374A50",
-"B>	c #304347",
-"C>	c #293C3C",
-"D>	c #35484C",
-"E>	c #405259",
-"F>	c #616D79",
-"G>	c #6F7988",
-"H>	c #788394",
-"I>	c #8391A2",
-"J>	c #7D8B9B",
-"K>	c #758294",
-"L>	c #A0B1C1",
-"M>	c #8999AA",
-"N>	c #738394",
-"O>	c #738294",
-"P>	c #758494",
-"Q>	c #798594",
-"R>	c #768393",
-"S>	c #748292",
-"T>	c #707E8A",
-"U>	c #68757E",
-"V>	c #424B52",
-"W>	c #3B464E",
-"X>	c #3F515C",
-"Y>	c #455864",
-"Z>	c #475A5F",
-"`>	c #374B50",
-" ,	c #304449",
-".,	c #293C40",
-"+,	c #36484E",
-"@,	c #415259",
-"#,	c #738194",
-"$,	c #788594",
-"%,	c #748393",
-"&,	c #748392",
-"*,	c #737E8A",
-"=,	c #6B757E",
-"-,	c #434B52",
-";,	c #455964",
-">,	c #4A6068",
-",,	c #455C5F",
-"',	c #41595C",
-"),	c #394C52",
-"!,	c #32454B",
-"~,	c #293C41",
-"{,	c #38484E",
-"],	c #636C76",
-"^,	c #707884",
-"/,	c #798192",
-"(,	c #768294",
-"_,	c #748394",
-":,	c #768594",
-"<,	c #768493",
-"[,	c #788492",
-"},	c #757E8A",
-"|,	c #6C757F",
-"1,	c #444F54",
-"2,	c #3C4950",
-"3,	c #40515C",
-"4,	c #455963",
-"5,	c #4A5F68",
-"6,	c #455C64",
-"7,	c #415962",
-"8,	c #455A62",
-"9,	c #3B4C54",
-"0,	c #34454C",
-"a,	c #778393",
-"b,	c #788393",
-"c,	c #788493",
-"d,	c #758392",
-"e,	c #727E8A",
-"f,	c #6A757F",
-"g,	c #444E54",
-"h,	c #3C494F",
-"i,	c #405157",
-"j,	c #455660",
-"k,	c #4A5B67",
-"l,	c #465E62",
-"m,	c #425A5E",
-"n,	c #475C61",
-"o,	c #495E62",
-"p,	c #4A5F64",
-"q,	c #394C55",
-"r,	c #33454B",
-"s,	c #2C3A3D",
-"t,	c #444E52",
-"u,	c #616C73",
-"v,	c #6E7983",
-"w,	c #768191",
-"x,	c #778293",
-"y,	c #778192",
-"z,	c #798293",
-"A,	c #7A8293",
-"B,	c #798493",
-"C,	c #748192",
-"D,	c #738192",
-"E,	c #738291",
-"F,	c #738392",
-"G,	c #748492",
-"H,	c #758492",
-"I,	c #748493",
-"J,	c #768293",
-"K,	c #758192",
-"L,	c #778092",
-"M,	c #788092",
-"N,	c #788093",
-"O,	c #778094",
-"P,	c #768094",
-"Q,	c #758094",
-"R,	c #7A8393",
-"S,	c #7A8492",
-"T,	c #7B828F",
-"U,	c #7A838E",
-"V,	c #77848D",
-"W,	c #76838E",
-"X,	c #75828E",
-"Y,	c #75828F",
-"Z,	c #75818F",
-"`,	c #73838D",
-" '	c #6F7D85",
-".'	c #66737C",
-"+'	c #394651",
-"@'	c #3E5057",
-"#'	c #45585E",
-"$'	c #4C6267",
-"%'	c #4D6269",
-"&'	c #465761",
-"*'	c #42535D",
-"='	c #41525B",
-"-'	c #41545E",
-";'	c #41555E",
-">'	c #465E63",
-",'	c #435A60",
-"''	c #485C61",
-")'	c #475B60",
-"!'	c #394B52",
-"~'	c #324348",
-"{'	c #354247",
-"]'	c #404B50",
-"^'	c #5C6971",
-"/'	c #697681",
-"('	c #737F8E",
-"_'	c #758191",
-":'	c #768194",
-"<'	c #798394",
-"['	c #768192",
-"}'	c #737F90",
-"|'	c #738190",
-"1'	c #758193",
-"2'	c #738290",
-"3'	c #738391",
-"4'	c #738191",
-"5'	c #73828F",
-"6'	c #73838E",
-"7'	c #73828E",
-"8'	c #73818E",
-"9'	c #738193",
-"0'	c #738091",
-"a'	c #737F8D",
-"b'	c #737F8B",
-"c'	c #74808C",
-"d'	c #74808E",
-"e'	c #768093",
-"f'	c #767F94",
-"g'	c #757E92",
-"h'	c #757E94",
-"i'	c #757F94",
-"j'	c #768292",
-"k'	c #768290",
-"l'	c #76818B",
-"m'	c #76828F",
-"n'	c #768392",
-"o'	c #768391",
-"p'	c #738094",
-"q'	c #73828D",
-"r'	c #6A7883",
-"s'	c #606D77",
-"t'	c #3B4651",
-"u'	c #36434C",
-"v'	c #45575D",
-"w'	c #485A63",
-"x'	c #465762",
-"y'	c #42535E",
-"z'	c #41535C",
-"A'	c #41565F",
-"B'	c #41575F",
-"C'	c #495C64",
-"D'	c #475962",
-"E'	c #485A62",
-"F'	c #496069",
-"G'	c #455B64",
-"H'	c #384A53",
-"I'	c #324249",
-"J'	c #29373C",
-"K'	c #344046",
-"L'	c #3D494F",
-"M'	c #54646B",
-"N'	c #607179",
-"O'	c #6F7D88",
-"P'	c #72808B",
-"Q'	c #73818B",
-"R'	c #73808B",
-"S'	c #737E8B",
-"T'	c #73808D",
-"U'	c #727F8A",
-"V'	c #707F88",
-"W'	c #6F7F88",
-"X'	c #6F808C",
-"Y'	c #6F818E",
-"Z'	c #6F8290",
-"`'	c #6F8190",
-" )	c #6F8090",
-".)	c #717F8E",
-"+)	c #737F8F",
-"@)	c #73808C",
-"#)	c #737F89",
-"$)	c #737F87",
-"%)	c #727F87",
-"&)	c #707F87",
-"*)	c #6F7F89",
-"=)	c #6F7F8A",
-"-)	c #717F8B",
-";)	c #74818C",
-">)	c #758091",
-",)	c #748091",
-"')	c #737E90",
-"))	c #717C90",
-"!)	c #727C90",
-"~)	c #737D91",
-"{)	c #737E91",
-"])	c #737F92",
-"^)	c #737F91",
-"/)	c #727F90",
-"()	c #727F8F",
-"_)	c #717F8D",
-":)	c #738092",
-"<)	c #6F7E8C",
-"[)	c #6C7C85",
-"})	c #616F77",
-"|)	c #57646B",
-"1)	c #35424A",
-"2)	c #4A6069",
-"3)	c #43565F",
-"4)	c #43575F",
-"5)	c #465D64",
-"6)	c #435961",
-"7)	c #50616A",
-"8)	c #4E616A",
-"9)	c #4B606A",
-"0)	c #485D67",
-"a)	c #3D4F58",
-"b)	c #35454D",
-"c)	c #2A373D",
-"d)	c #2E3A41",
-"e)	c #323E45",
-"f)	c #4A5760",
-"g)	c #57656E",
-"h)	c #667681",
-"i)	c #6A7A85",
-"j)	c #6C7C87",
-"k)	c #717E89",
-"l)	c #717D89",
-"m)	c #717C89",
-"n)	c #707C89",
-"o)	c #6E7C88",
-"p)	c #6E7B87",
-"q)	c #707C88",
-"r)	c #6D7C89",
-"s)	c #6C7C89",
-"t)	c #6B7C89",
-"u)	c #6B7C88",
-"v)	c #6A7C84",
-"w)	c #697C88",
-"x)	c #697C89",
-"y)	c #687C89",
-"z)	c #6A7B88",
-"A)	c #6B7B87",
-"B)	c #6B7B86",
-"C)	c #6B7C84",
-"D)	c #6B7C83",
-"E)	c #6B7C82",
-"F)	c #6B7B82",
-"G)	c #6B7A81",
-"H)	c #6A7B81",
-"I)	c #687B82",
-"J)	c #697B82",
-"K)	c #6C7E82",
-"L)	c #6E7F82",
-"M)	c #6E7E83",
-"N)	c #6A7B83",
-"O)	c #697A82",
-"P)	c #6A7A82",
-"Q)	c #6B7A82",
-"R)	c #697A84",
-"S)	c #6A7B86",
-"T)	c #6E7C89",
-"U)	c #6F7D87",
-"V)	c #6D7D86",
-"W)	c #6A7982",
-"X)	c #697680",
-"Y)	c #65747D",
-"Z)	c #617279",
-"`)	c #4D5D66",
-" !	c #42505A",
-".!	c #33414A",
-"+!	c #45555D",
-"@!	c #4B626A",
-"#!	c #42535C",
-"$!	c #475E62",
-"%!	c #435A5E",
-"&!	c #495E68",
-"*!	c #435660",
-"=!	c #334246",
-"-!	c #2E3B40",
-";!	c #2C373D",
-">!	c #35424B",
-",!	c #3D4B55",
-"'!	c #4F5F69",
-")!	c #56666F",
-"!!	c #5C6D74",
-"~!	c #5F6F77",
-"{!	c #617079",
-"]!	c #627179",
-"^!	c #627079",
-"/!	c #607079",
-"(!	c #5E7078",
-"_!	c #5B6E75",
-":!	c #5A6D74",
-"<!	c #5A6C72",
-"[!	c #5E6E76",
-"}!	c #5E7079",
-"|!	c #5D7078",
-"1!	c #5C6E76",
-"2!	c #5C6D75",
-"3!	c #5C6F76",
-"4!	c #5B6D74",
-"5!	c #596D74",
-"6!	c #596C74",
-"7!	c #5B6B72",
-"8!	c #5C6B70",
-"9!	c #5C696C",
-"0!	c #5C6A6C",
-"a!	c #5C6A6D",
-"b!	c #5B696F",
-"c!	c #5B6870",
-"d!	c #596870",
-"e!	c #586870",
-"f!	c #58696D",
-"g!	c #58696B",
-"h!	c #59696B",
-"i!	c #57696B",
-"j!	c #55696B",
-"k!	c #54696B",
-"l!	c #56696B",
-"m!	c #5A696B",
-"n!	c #5B696B",
-"o!	c #58686C",
-"p!	c #57686C",
-"q!	c #56696D",
-"r!	c #56696A",
-"s!	c #546767",
-"t!	c #556766",
-"u!	c #586766",
-"v!	c #576766",
-"w!	c #566766",
-"x!	c #556665",
-"y!	c #556465",
-"z!	c #536165",
-"A!	c #515E62",
-"B!	c #4C5A5C",
-"C!	c #3D4E54",
-"D!	c #37464E",
-"E!	c #3F4A54",
-"F!	c #434F5A",
-"G!	c #4A606A",
-"H!	c #455760",
-"I!	c #465861",
-"J!	c #455B62",
-"K!	c #4D6369",
-"L!	c #50656A",
-"M!	c #4D646A",
-"N!	c #4A646A",
-"O!	c #4C6069",
-"P!	c #47565D",
-"Q!	c #415056",
-"R!	c #3D4B50",
-"S!	c #39474A",
-"T!	c #313E41",
-"U!	c #2D3A3D",
-"V!	c #2A363A",
-"W!	c #2B373B",
-"X!	c #2E3A3F",
-"Y!	c #303E40",
-"Z!	c #314041",
-"`!	c #334141",
-" ~	c #334041",
-".~	c #303D3F",
-"+~	c #313E3F",
-"@~	c #334140",
-"#~	c #344041",
-"$~	c #333E41",
-"%~	c #323D40",
-"&~	c #303C3E",
-"*~	c #303B3D",
-"=~	c #303C3F",
-"-~	c #303D40",
-";~	c #30393D",
-">~	c #2F393D",
-",~	c #2E393D",
-"'~	c #2D383C",
-")~	c #2C383B",
-"!~	c #2C393C",
-"~~	c #2C3739",
-"{~	c #2C3639",
-"]~	c #2B3639",
-"^~	c #2A3639",
-"/~	c #293639",
-"(~	c #283639",
-"_~	c #283637",
-":~	c #283635",
-"<~	c #283538",
-"[~	c #283439",
-"}~	c #283437",
-"|~	c #283435",
-"1~	c #283431",
-"2~	c #283331",
-"3~	c #283131",
-"4~	c #283231",
-"5~	c #222D30",
-"6~	c #202B2E",
-"7~	c #263439",
-"8~	c #2D3B40",
-"9~	c #334147",
-"0~	c #394A4F",
-"a~	c #485961",
-"b~	c #4A5A63",
-"c~	c #4D5F69",
-"d~	c #4E606A",
-"e~	c #40575F",
-"f~	c #405760",
-"g~	c #455B63",
-"h~	c #465C64",
-"i~	c #4E646A",
-"j~	c #4A5E66",
-"k~	c #48575F",
-"l~	c #47545C",
-"m~	c #435258",
-"n~	c #404F55",
-"o~	c #3A474D",
-"p~	c #354248",
-"q~	c #26353B",
-"r~	c #223035",
-"s~	c #1D2E30",
-"t~	c #1A2C2D",
-"u~	c #19292B",
-"v~	c #19282A",
-"w~	c #192829",
-"x~	c #202A2B",
-"y~	c #20292B",
-"z~	c #1C282A",
-"A~	c #19292C",
-"B~	c #192A2C",
-"C~	c #1B2B2C",
-"D~	c #19282C",
-"E~	c #18292C",
-"F~	c #182A2B",
-"G~	c #192929",
-"H~	c #18292B",
-"I~	c #18282C",
-"J~	c #18282B",
-"K~	c #18292A",
-"L~	c #192A29",
-"M~	c #1D2A29",
-"N~	c #1C2A29",
-"O~	c #1A2A29",
-"P~	c #1A292A",
-"Q~	c #1B292B",
-"R~	c #1B292C",
-"S~	c #1D2B2F",
-"T~	c #223034",
-"U~	c #2C393E",
-"V~	c #36454A",
-"W~	c #3C4B53",
-"X~	c #3E4E58",
-"Y~	c #455862",
-"Z~	c #4B5D68",
-"`~	c #4F616C",
-" {	c #52646F",
-".{	c #546570",
-"+{	c #556570",
-"@{	c #556871",
-"#{	c #536770",
-"${	c #4E646E",
-"%{	c #4D636D",
-"&{	c #4D626D",
-"*{	c #4B606B",
-"={	c #4B616C",
-"-{	c #51676D",
-";{	c #51656B",
-">{	c #51646A",
-",{	c #51646B",
-"'{	c #526671",
-"){	c #526872",
-"!{	c #536972",
-"~{	c #506772",
-"{{	c #4E6672",
-"]{	c #4C6270",
-"^{	c #4B606D",
-"/{	c #485C65",
-"({	c #465961",
-"_{	c #43545C",
-":{	c #3F5057",
-"<{	c #3C4D53",
-"[{	c #37474F",
-"}{	c #34444C",
-"|{	c #2E3F47",
-"1{	c #2B3C43",
-"2{	c #27373D",
-"3{	c #203134",
-"4{	c #1C2D2F",
-"5{	c #192C2D",
-"6{	c #192C2C",
-"7{	c #192B2D",
-"8{	c #192A2E",
-"9{	c #1A2A30",
-"0{	c #1A2A31",
-"a{	c #1B2A31",
-"b{	c #1B2B31",
-"c{	c #1B2C31",
-"d{	c #192C32",
-"e{	c #192B32",
-"f{	c #192A32",
-"g{	c #192932",
-"h{	c #192D30",
-"i{	c #192D32",
-"j{	c #192D31",
-"k{	c #192C31",
-"l{	c #1B2D32",
-"m{	c #1C2D31",
-"n{	c #1D2D30",
-"o{	c #1B2D30",
-"p{	c #1A2D30",
-"q{	c #1D2E32",
-"r{	c #223237",
-"s{	c #24333A",
-"t{	c #28363E",
-"u{	c #2C3A43",
-"v{	c #35434D",
-"w{	c #394851",
-"x{	c #51666F",
-"y{	c #5F737E",
-"z{	c #657682",
-"A{	c #6A7985",
-"B{	c #6A7B89",
-"C{	c #697C8A",
-"D{	c #677988",
-"E{	c #637784",
-"F{	c #5B717D",
-"G{	c #5A6E7A",
-"H{	c #596C78",
-"I{	c #546874",
-"J{	c #526772",
-"K{	c #516572",
-"L{	c #536A74",
-"M{	c #546A74",
-"N{	c #5A6E77",
-"O{	c #5D6F79",
-"P{	c #5F727F",
-"Q{	c #5F7280",
-"R{	c #5F7380",
-"S{	c #5C7280",
-"T{	c #5A7280",
-"U{	c #586F7D",
-"V{	c #576D7B",
-"W{	c #566B75",
-"X{	c #546872",
-"Y{	c #51636D",
-"Z{	c #4C5E67",
-"`{	c #394952",
-" ]	c #304149",
-".]	c #2C3D44",
-"+]	c #293A3F",
-"@]	c #28393D",
-"#]	c #253638",
-"$]	c #253536",
-"%]	c #253537",
-"&]	c #253539",
-"*]	c #25353B",
-"=]	c #25373E",
-"-]	c #25373C",
-";]	c #25373B",
-">]	c #25393D",
-",]	c #25393E",
-"']	c #25383E",
-")]	c #253940",
-"!]	c #253941",
-"~]	c #253B43",
-"{]	c #263B43",
-"]]	c #283B43",
-"^]	c #293B43",
-"/]	c #2A3B43",
-"(]	c #2A3C43",
-"_]	c #2A3D43",
-":]	c #2B3D43",
-"<]	c #2C3D43",
-"[]	c #2F3F47",
-"}]	c #32414B",
-"|]	c #33434C",
-"1]	c #34454D",
-"2]	c #485862",
-"3]	c #50636B",
-"4]	c #536771",
-"5]	c #556A74",
-"6]	c #5A6E79",
-"7]	c #5B6F7B",
-"8]	c #5B6F7C",
-"9]	c #5C717D",
-"0]	c #5D727E",
-"a]	c #5D737F",
-"b]	c #5D7380",
-"c]	c #5C727F",
-"d]	c #5B6F7E",
-"e]	c #5C707D",
-"f]	c #596C7A",
-"g]	c #576978",
-"h]	c #536674",
-"i]	c #526573",
-". + @ # $ % & * = - ; > > > > > , ' ) ! > ~ ~ { ] ^ / ( _ : < [ [ [ [ } | [ [ 1 1 1 2 2 3 4 5 6 7 8 9 0 a b 6 5 c d c c e f 5 g h i j 5 5 5 5 5 5 5 6 k l j m m m m m m m m n n n n n n n o p q q q q q q r s t u v w w x y y y y y y z A B C D E F F G H I J K L M M ",
-"N O P Q R S T U U V V W X X Y Z `  ...+. at .#.$.#.%.&.*.=.-.;.;.>.,.,.'.).!.~.~.~.{.;.~.].^./.(.(.(._.:.<.[.>.>.-.}.(.|.|.1.2.3.4.4.5.6.7.8.9.0.(./.<.a.b.c.d.>.~.~.>.>.e.-.f.g.g.h.h.h.h.h.i.j.k.k.l.l.l.m.n.o.p.p.q.r.s.t.u.~.v.w. .x.Z B y.y.B Z z.z.A.B.H Y C.D.E.E.",
-"F.G.H.I.J.C K.L.M.N.O.B.P.Q.R.S.T.U.V.V.k.W.X.g.g.Y.Y.Z.X.X.X.X.`.1. +.+X.++++ at +3.X.#+#+$+$+%+%+&+*+=+-+-+|.;+>+>+>+,+'+)+!+~+~+~+{+]+^+/+(+_+_+:+:+:+<+[+}+|+1+1+|+2+3+4+5+6+7+8+8+9+0+0+a+b+c+d+e+f+g+h+i+j+k+l+m+n+m+o+p+q+r+V.s+t+u+v+w+x+y+z+A+B+C+C.D+E+F+G+H+H+",
-"I+J+K+L+M+C.N+O+P+Q+R+S+F T+U+V+W+X+Y+Z+`+ @. at +@.@@@@@#@$@$@$@#@%@%@&@*@=@=@=@-@;@>@,@,@'@'@)@!@>@~@{@]@^@/@/@(@_@:@<@[@}@}@|@|@|@1 at 1@2 at 3@4 at 5@5 at 6@6 at 7@2 at 8@8 at 8@9 at 9@8 at 8@0 at a@a at b@c at d@e at f@g at h@i at j@k at l@m at n@o at p@q at r@s at M t at t@u at v@w at x@y at z@A at B@C at D@E at F@G at H@I at J@K at L@M at N@O at P@Q at Q@",
-"R at S@T at U@V at W@X at Y@Z at Z@K `@ #.#+#@###$#%#&#*#=#-#;#>#,#,#'#>#>#'#'#)#)#)#!#~#~#~#~#~#{#]#]#^#/#(#_#:#<#[#}#|#1#2#3#4#5#6#7#8#9#2#3#0#3#3#a#b#c#d#e#f#f#g#g#f#h#i#j#j#k#l#m#n#o#p#p#p#p#q#r#r#s#t#u#v#w#x#y#z#A#B#C#t#p#D#E#F#G#H#I#J#K#L#M#N#O#P#Q#R#S#T#U#V#X at W#X#Y#Z#Z#",
-"`# $.$+$@$#$$$%$&$*$=$-$;$>$,$'$)$!$~${$]$^$/$($($($_$:$<$<$[$}$}$|$1$2$3$4$4$4$4$4$5$5$6$7$8$9$0$a$b$c$d$e$f$g$h$h$e$i$j$k$l$m$_$n$o$p$q$r$s$t$u$v$w$x$y$z$A$B$C$D$E$F$G$H$I$I$I$I$I$I$I$J$K$L$M$o$N$O$P$Q$R$S$T$U$V$W$X$Y$Z$`$ %.%+%@%x@#%$%%%&%*%=%-%;%>%,%'%)%!%!%",
-"~%{%]%^%/%(%_%:%:%<%[%}%|%1%2%3%4%5%6%7%8%9%0%a%b%c%c%c%d%d%e%e%e%e%e%f%g%h%h%h%i%j%k%k%l%m%e%n%o%p%q%i%h%r%s%e%e%e%t%t%g%u%v%w%x%y%y%y%x%z%A%B%C%D%x%z%E%F%G%v%v%v%H%I%H%H%v%v%v%v%v%v%v%J%K%q%q%p%L%L%L%M%N%O%y%x%w%P%Q%R%S%o#T%U%V%W%X%Y%Z%`% &.&+&@&#&$&%&&&*&=&=&",
-"-&;&>&,&'&)&!&~&~&~&{&&@]&^&/&(&_&:&<&[&}&}&}&|&1&2&3&4&4&4&4&4&4&4&4&5&6&7&7&8&9&6&0&7&7&a&3&3&<&4&4&4&4&3&3&3&<&<&4&4&b&b&c&d&e&e&e&e&e&e&e&e&f&g&h&h&e&e&e&e&e&c&c&i&j&j&k&l&m&n&o&4&4&p&q&r&s&t&u&4&4&v&w&x&x&f&h&e&e&h&y&z&A&B&C&D&E&F&G&H&I&`%J&K&L&M&N&O&P&Q&Q&",
-"R&S&T&U&# V&W&X&Y&Z&~&`& *.*+*@*#*$*l&%*e&e&e&e&&***=*6&6&6&6&6&6&6&6&6&6&7&7&0&6&-*;*9&=*=*=*=*>*,*'*)*!*~*{*)*'*>*=*]*^*/*(*k&_*:*_*f&f&f&<*[*}*}*|*1*2*3*4*3*5*6*7*8*9*~*0*a*b*c*}*a#d*e*f*=*;*g*g*g*7&9&h*i*j*6*9#[*:*k*l*m*n*B&o*p*q*r*s*t*t*V&u*v*w*x*y*N&z*Q&Q&",
-"R&S&r*A*B*W&C*D*D*Y&E*F*G*H*I*J*K*L*M*N*O*O*O*O*P*j*j*Q*Q*Q*Q*Q*Q*Q*Q*i*R*h*h*R*R*j*i*S*Q*Q*!*9*~*a*T*U*U*U*U*U*V*a*0*0*W*W*0*0*0*X*W*Y*Z*`* =.=+=+=@=Z*#=$=%=V*V*V*V*U*U*U*U*U*U*V*&=+=*=Q*Q*Q*Q*j*}*}*d*d*R*}*}*|*==}*j*Q**=c*-=B&;=p*q*r*>=,='=)=!=~&~={=]=^=z*Q&Q&",
-"/=(=_=:=B*<=[=}=|=)=J&1=2=3=4=5=6=7=8=9=}*j*j*Q*Q*Q*Q*Q*Q*Q*Q*Q*Q*Q*Q*Q*Q*j*j*j*j*Q*j*j*!*9*W*a*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*a*0*T*T*U*U*U*U*U*U*U*U*U*U*U*U*U*U*T*W*9*Q*Q*Q*Q*Q*Q*Q*Q*Q*Q*Q*Q*Q*Q*Q*Q*)*0=a=b=B&;=p*q*r*>=c=c=)=!=d=e=f=g=^=z*Q&Q&",
-"h=i=j=k=l=m=n=o=<=p=q=r=s=t=u=v=w=x=y=Q*j*Q*Q*Q*Q*Q*)*z=z=z=A=)*Q*B=C=C=C=C=Q*Q*B=C=D=D=E=F=G=H=I=G=G=G=G=G=G=G=G=G=G=U*U*U*U*U*U*H=G=H=U*U*U*U*G=G=U*U*I=G=G=G=G=G=G=H=U*G=G=G=I=U*T*J=E=C=K=C=C=C=C=C=C=L=M=L=L=)*)*z=z=N=y=O=-=P=Q=R=S=T=U=V=W=[=<=X=Y=Z=`= -.-+-+-",
-"@-#-$-k=%-&-*-&-)=u*{&r==---;->-,-'-)-!-Q*Q*Q*Q*Q*)*A=~-~-~-N=N={-]-]-]-]-]-Q*^-/-]-]-]-]-]-]-(-G=]-]-]-]-]-]-]-]-]-]-U*U*U*U*U*U*(-]-]-_-U*:-<-]-]-U*U*G=]-]-]-]-]-]-(-U*H=]-]-]-[-}-|-]-1-L=]-]-]-]-]-]-]-]-]-]-A=)*z=N=N=~*2-3-4-5-6-7-8-9-0-a-m=b-d=Y=Z=c-d-e-e-e-",
-"f-g-h-:=%-&-i-&-)=j-k-l-m-n-o-p-q-r-s-t-A=)*Q*Q*)*N=t-}-T*U*T*u-]-]-v-w-L=x-y-z-A-]-]-B-G=G=G=H=I=G=G=G=C-]-]-_-G=G=G=U*U*U*U*U*U*(-]-]-D-E-F-U*]-]-U*U*G=]-]-C-G=G=G=H=U*U*C-]-]-G-H-D-D-!-I-D=E=J-B-]-]-x-K-L-L-~-~-M-M-t-~*Y*N-O-P-Q-R-S-~&T-a-U-V-~&e=Z=c-W-e-e-e-",
-"@-#-$-k=%-W&C*W&)=u*{&r==---X-Y-Z-`- ;.;N=z=A=z=z=N=t-}-T*U*U*(-]-]-G-t-N=+;T*U*G=]-]-(-U*U*U*U*U*U*U*U*(-]-]-G=U*U*U*U*U*U*U*U*U*(-]-]-]-]-U*U*]-]-U*U*G=]-]-(-U*U*U*U*U*U*@;]-]-]-C-]-#;0*0*T*T*U*(-]-]-$;%;&;+;t-t-T*U*U*2-*;=;-;5-;;R-S-~&T->;<=,;~&e=Z=c-W-';';';",
-"@-#-$-k=l=);!;~;{;];F&^;/;t=(;_;:;<;[;};N=N=N=~-~-~-|;T*U*U*U*1;]-]-]-D-L-M-}-U*G=]-]-C-G=G=G=U*U*U*U*U*(-]-]-G=U*U*U*U*U*U*U*U*U*(-]-]-]-]-_-U*]-]-U*U*G=]-]-C-G=G=G=U*U*U*V*G-]-]-]-_-2;2;2;U*U*U*(-]-]-3;4;[;+;M-M-T*U*U*5;[#6;7;8;9;0;S-~&!=a;!=!=p=b;c;c-*%d;8 at 8@",
-"@-#-$-k=%-&-i-e;{;f;g;h;i;j;k;9 at l;m;n;o;+;M-|;T*U*2;2;p;2;2;U*U*_-]-]-]-]-_-U*U*G=]-]-]-]-]-]-U*U*U*U*U*(-]-]-G=U*U*U*U*U*U*U*U*U*(-]-(-]-]-]-H=]-]-U*U*G=]-]-]-]-]-]-U*U*U*U*U*]-]-]-G=U*U*U*U*U*U*(-]-]-G=q;r;U*U*U*U*U*U*U*U*s;t;u;v;w;S-~&x;y;z;x;Z% &A;B;C;D;E;E;",
-"@-#-$-k=%-&-i-e;{;p={&F;G;j;k;9 at H;I;J;K;2;U*U*U*U*U*2;%;%;%;2;U*U*G=C-]-]-]-C-U*G=]-]-C-G=G=G=U*U*U*U*U*(-]-]-G=U*U*U*U*U*U*U*U*U*(-]-G=1;]-]-D-]-]-U*U*G=]-]-C-G=G=G=U*U*U*U*I=]-]-]-C-I=U*U*U*U*U*(-]-]-G=q;r;U*U*U*U*U*U*U*U*s;t;L;M;N;O;~&t*z;P;t*Z% &A;B;C;D;E;E;",
-"Q;R;S;T;U;&-i-e;{;!=q=F;G;j;k;9 at V;W;X;Y;p;2;U*U*U*U*2;Z;`;`;%;p;U*U*I=_-]-]-]-U*G=]-]-(-U*U*U*U*U*U*U*U*(-]-]-G=U*U*U*U*U*U*U*U*U*(-]-G=I=D-]-]-]-]-U*U*G=]-]-(-U*U*U*U*U*U*U*_-]-]-]-]-1;U*U*U*U*U*(-]-]-G=q;r;U*U*U*U*U*U*2;2; >.>^=+>@>O;~&#>s*c=t*Z% &A;B;C;D;E;E;",
-"$>%>b;&>!=<=*>e;{;a;=>F;G;j;k;->;>>>,>'>2;U*U*U*2;Z;)>!>~>{>]>`;p;2;U*U*]-]-]-U*G=]-]-(-U*U*U*U*U*U*U*U*(-]-]-G=U*U*U*U*U*U*U*U*U*(-]-G=U*H=]-]-]-]-U*U*G=]-]-(-U*U*U*U*U*U*G=]-_-G=]-]-]-U*U*U*U*U*(-]-]-G=q;r;U*U*U*U*U*U*2;p; >.>^>Z#@>O;~&/>I&c=t*Z% &A;B;C;D;E;E;",
-"$>(>_>:>T-<>[>[>[>,;}>|>1>2>3>4>5>6>7>8>U*U*U*2;K;9>0>q;a>a>K;b>C-b>(-C-]-]-1;U*G=]-]-D-(-(-(-(-U*U*U*U*(-]-]-G=U*U*U*U*U*U*U*U*U*(-]-G=U*U*1;]-]-]-U*U*G=]-]-D-(-(-(-(-U*U*D-D-c>8>C-]-]-d>8>U*e>r;f>]-]-g>h>i>j>a>a>j>k>U*l>m>n>o>p>q>r>s>t>Z%,;I&Z%V&b;c;c-u>v>v>v>",
-"f-w>$-k=x>y>[>*>i-V&z>A>B>C>D>E>F>G>,>Y;a>r;U*U*U*e>e>U*U*U*U*(-]-]-]-]-C-1;U*U*G=]-]-]-]-]-]-]-U*U*U*U*(-]-]-G=U*U*U*U*U*U*U*U*U*(-]-G=U*U*U*C-]-]-U*U*G=]-]-]-]-]-]-]-U*_-]-d>H>a>I>]-]-]-J>U*k>K>L>]-]-M>N>O>O>O>O>$*P>Q>R>S>T>U>V>W>X>Y>P;U;a;X=X=d=Y=Z=c-W-';';';",
-"f-g-$-k=x>y>[>*>i-,;Z>`> ,.,+,@,F>m;n;K;8>U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*8>8>r;H>K>0>#,#,#,9>9>K>0>#,#,#,#,#,#,O>N>i>$,Q>z-$*%,&,*,=,-,W>X>;,y;>,}=!=X=d=Y=Z=c-W-';';';",
-",,',$-k=x>y>[>*>i-,;Z>),!,~,{,9@],^,/,2;U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*U*8>8>8>8>8>8>8>8>8>8>8>8>U*U*U*U*U*U*U*U*U*U*U*U*U*8>r;r;(,0>#,#,#,#,#,#,#,#,#,#,#,#,q;q;K>_,N>P>:,z-:,$*<,[,},|,1,2,3,4,5,&-[=!=X=d=Y=Z=c-W-';';';",
-"6,7,8,k=x>y>[>*>i-,;S;9,0,~,{,9@],^,J;'>H>r;e>U*U*U*U*U*U*U*r;H>r;8>U*U*U*U*U*U*U*U*U*U*U*e>H>H>a>(,(,a,a,b,l>8>U*U*r;r;H>H>H>r;r;H>H>H>H>r;8>8>8>8>8>8>8>8>8>8>8>8>r;H>(,K>#,#,#,#,#,#,#,#,#,#,#,#,K>a>e>e>:,_,O>#,#,N>P>U*c,d,e,f,g,h,i,j,k,H&|=p=d=d=Y=Z=c-W-';';';",
-"l,m,n,o,<=[=[>}=p,U;:=q,r,s,Q-t,u,v,w,x,y,z,A,2;U*U*2;%;%;%;]>{>Z;Z;p;A,/,n;n;A,A,p;2;2;B,b,C,D,D,D,D,E,E,F,F,G,H,H,H,H,I,I,N>O>O>#,#,#,#,O>K>(,a>a>x,J,K,L,M,M,M,J;J;J;N,N,{>{>{>{>{>{>{>O,P,Q,O,{>R,S,T,U,V,W,X,Y,Y,Y,Y,Z,N-`, '.'$$+'@'#'!=$'%'G&U;d=b;&'*'='-';';'",
-">','''d=<=}=*>}=<>a;)'!'~'`@{']'^'/'('_':'Y;Y;8>U*r;H>:':':'Y;<'U*U*U*['}'|'|'K,1':'!>!>D,D,2'2'3'3'3'|'|'4'4'4'4'4'4'4'5'5'6'6'6'7'7'8'|'9'#,#,#,9'0'0'}'a'b'b'b'b'b'b'c'd'e'P,f'f'f'f'f'g'g'h'i':'(,q;j'k'l'm'n'o'o'J,!>p'|'q'r's't'u'@'v'd=}=[>5,H&V&w'x'y'z'A'B'B'",
-"C'D'E':>U;W&D*C**-F'G'H'I'J'K'L'M'N'O'P'Q'Q'Q'Q'Q'Q'R'S'b'R'Q'Q'6;8'|'T'b'b'b'b'b'b'U'U'V'W'X'Y'Z'`' ).).)}'}'}'}'}'}'+)T'@)b'b'b'#)#)$)%)&)*)=)-)-)b'b'b'R'Q'Q'Q'Q'Q'Q';) >>),)}'}'}'')')))!)~){)])^)}'/)()_)()}'}'}'')^):)<)[)})|)+$1)i,Y%X=}=[>2)5,Z%w'x'y'z'3)4)4)",
-"5)6) &&>)=o=7)8)D*9)0)a)b)c)d)e)f)g)h)i)j)O'k)l)m)m)m)m)m)m)n)n)o)o)p)q)m)m)n)r)s)t)u)u)v)v)w)x)y)y)y)z)z)A)A)A)A)A)A)B)C)D)E)F)F)G)G)G)G)H)H)H)I)I)J)J)J)K)L)L)L)L)L)L)M)M)C)N)O)P)Q)Q)Q)R)S)s)T)m)U)V)N)J)P)Q)Q)F)F)W)O-X)Y)Z)`) !.!Q at +!E'G&*>@!D*X&Z%w'&'*'#!w*Z=Z=",
-"$!%!''X=<=~;7)8)D*9)&!*!y*=!-!;!>!,!'!)!!!~!{!]!]!{!{!^!^!^!/!(!_!:!<![!{!}!|!1!1!2!2!2!3!3!4!:!5!6!6!7!8!9!9!9!9!9!9!9!0!0!0!0!0!0!0!0!a!b!c!c!d!e!e!e!e!f!g!g!g!g!g!g!h!h!i!j!k!l!h!m!n!o!p!q!q!q!l!r!s!t!u!v!w!x!y!z!A!B!v>C!D!Q at E!F!# t>z;G!*-8)X&U;E'Z=#!#!H!I!I!",
-"B*J!T;p=~;K!L!M!N!@!O!!&P!Q!R!S!T!U!V!W!X!Y!Z!`! ~.~+~@~#~#~$~%~&~&~*~=~]&-~=~;~>~,~'~)~s,!~~~~~{~]~^~^~^~~~~~~~~~~~~~~~^~/~(~(~(~(~(~(~_~:~:~:~:~:~:~:~:~<~[~[~[~[~[~[~[~[~[~[~[~[~[~[~[~}~|~1~1~1~2~2~3~3~4~4~4~e+5~6~6+7~8~9~0~7-w*a~b~t>x;c~d~%'~;,;9-j=e~f~g~h~h~",
-"%')=!=!=%'i~L!M!N!>,j~E'k~l~m~n~o~p~J q~r~s~t~u~v~w~k.2.x~y~z~V.w~w~w~u~A~B~B~C~C~^.[.[.A~D~D~D~D~E~E~F~F~G~G~G~G~G~G~G~H~H~I~I~I~I~I~I~J~K~L~L~L~L~L~L~L~u~D~D~D~D~D~D~D~D~D~D~D~D~D~D~D~n.l.M~N~O~L~L~w~w~w~P~m.Q~R~S~T~U~G+V~W~X~;'Y~Z~`~ {.{+{@{#{${%{&{*{y;={={={",
-"-{;{>{,{'{){!{~{{{]{^{/{({_{:{<{[{}{|{1{2{C.3{G 4{5{t~^.).).-.-.!.!.6{7{8{9{0{a{a{a{b{c{d{d{d{e{f{g{g{e{e{h{h{h{h{h{h{h{i{i{d{d{d{d{d{d{d{j{h{h{h{h{h{h{h{k{d{d{d{d{d{d{d{d{d{d{d{d{d{d{d{l{m{8+n{o{p{h{h{h{#.q{L+r{s{t{u{v{w{S=*'s>x;x{y{z{A{B{C{D{E{F{G{H{I{J{K{K{K{",
-"L{M{N{O{P{Q{R{S{T{U{V{W{X{Y{Z{# c-]=`{Y# ].]f +]@]y #]$]$]$]%]&]*]s =]-]y y y y y y ;];]>],],]']=]=]=])]!]~]~]~]~]~]~]{]]]^]/]/]/]/]/]/](]_]_]_]_]_]_]_]_]_]_]_]_]_]_]_]_]_]_]_]_]_]_]_]_]_]_]_]_]_]_]_]_]:]<][]}]|]1]`{;&2]Z{3]4]5]6]7]8]9]0]a]b]a]c]d]e]9]f]g]h]i]i]"};
diff --git a/gtk2_ardour/pixmaps/small-round-button-01.xpm b/gtk2_ardour/pixmaps/small-round-button-01.xpm
deleted file mode 100644
index 871f90c..0000000
--- a/gtk2_ardour/pixmaps/small-round-button-01.xpm
+++ /dev/null
@@ -1,598 +0,0 @@
-/* XPM */
-static char * t_small_round_button_01_xpm[] = {
-"28 30 565 2",
-"  	c None",
-". 	c #3C4B52",
-"+ 	c #465960",
-"@ 	c #44575D",
-"# 	c #45565D",
-"$ 	c #4A5961",
-"% 	c #3A4B53",
-"& 	c #39464D",
-"* 	c #32424A",
-"= 	c #34464D",
-"- 	c #36454C",
-"; 	c #34434C",
-"> 	c #35464E",
-", 	c #34444C",
-"' 	c #34434D",
-") 	c #35454F",
-"! 	c #374750",
-"~ 	c #314248",
-"{ 	c #34444A",
-"] 	c #2A343A",
-"^ 	c #3A454C",
-"/ 	c #37464F",
-"( 	c #394850",
-"_ 	c #3E4F55",
-": 	c #405157",
-"< 	c #3E5259",
-"[ 	c #46585F",
-"} 	c #41545A",
-"| 	c #3E5057",
-"1 	c #3E4E57",
-"2 	c #3E4C56",
-"3 	c #39494F",
-"4 	c #36434A",
-"5 	c #273437",
-"6 	c #2F3A41",
-"7 	c #394952",
-"8 	c #3A4E58",
-"9 	c #40525C",
-"0 	c #41515A",
-"a 	c #45555B",
-"b 	c #42565B",
-"c 	c #41555A",
-"d 	c #45575E",
-"e 	c #43575C",
-"f 	c #45545E",
-"g 	c #45525A",
-"h 	c #42525A",
-"i 	c #415158",
-"j 	c #3D4E56",
-"k 	c #3C4D55",
-"l 	c #354750",
-"m 	c #2D3B45",
-"n 	c #2E3B43",
-"o 	c #404F58",
-"p 	c #42545D",
-"q 	c #43595D",
-"r 	c #42585B",
-"s 	c #45545B",
-"t 	c #414E54",
-"u 	c #35454E",
-"v 	c #2E3E44",
-"w 	c #2A3C42",
-"x 	c #2F4048",
-"y 	c #324249",
-"z 	c #39454B",
-"A 	c #404D51",
-"B 	c #425257",
-"C 	c #43565B",
-"D 	c #41555B",
-"E 	c #41505A",
-"F 	c #394955",
-"G 	c #2D3943",
-"H 	c #324147",
-"I 	c #405259",
-"J 	c #47565F",
-"K 	c #46585C",
-"L 	c #475A5A",
-"M 	c #3B4D4F",
-"N 	c #2C3B3D",
-"O 	c #293B3E",
-"P 	c #33434A",
-"Q 	c #394A52",
-"R 	c #44525B",
-"S 	c #49565D",
-"T 	c #364649",
-"U 	c #2C3D41",
-"V 	c #2D3E41",
-"W 	c #394B4F",
-"X 	c #425659",
-"Y 	c #465561",
-"Z 	c #44545F",
-"` 	c #40515C",
-" .	c #303D45",
-"..	c #232F33",
-"+.	c #43535B",
-"@.	c #4A5C62",
-"#.	c #4A5B62",
-"$.	c #485458",
-"%.	c #354144",
-"&.	c #223034",
-"*.	c #31404A",
-"=.	c #506069",
-"-.	c #617380",
-";.	c #738492",
-">.	c #7F8E9C",
-",.	c #7D8C9C",
-"'.	c #7E8D9C",
-").	c #71828E",
-"!.	c #5D6F79",
-"~.	c #44555B",
-"{.	c #2B3C41",
-"].	c #344548",
-"^.	c #43515C",
-"/.	c #4A5660",
-"(.	c #43555C",
-"_.	c #415058",
-":.	c #263035",
-"<.	c #40535A",
-"[.	c #4A5A62",
-"}.	c #46555E",
-"|.	c #2D393F",
-"1.	c #414F5A",
-"2.	c #687686",
-"3.	c #8293A5",
-"4.	c #93A5BC",
-"5.	c #9DB1C8",
-"6.	c #9CB1C8",
-"7.	c #96ABC2",
-"8.	c #95ABC3",
-"9.	c #98A9C0",
-"0.	c #93A5BA",
-"a.	c #818E9F",
-"b.	c #576570",
-"c.	c #35424A",
-"d.	c #314144",
-"e.	c #42535A",
-"f.	c #4A5A61",
-"g.	c #495A5F",
-"h.	c #405158",
-"i.	c #303D42",
-"j.	c #485A68",
-"k.	c #4A5B5F",
-"l.	c #4B5B5D",
-"m.	c #334345",
-"n.	c #233037",
-"o.	c #485660",
-"p.	c #6C7B8A",
-"q.	c #8A9AB1",
-"r.	c #92A1BB",
-"s.	c #91A3BB",
-"t.	c #8EA0B6",
-"u.	c #8799B2",
-"v.	c #8597B0",
-"w.	c #8598B0",
-"x.	c #8C9BB1",
-"y.	c #90A0B7",
-"z.	c #95A4B9",
-"A.	c #8090A4",
-"B.	c #5D6C7C",
-"C.	c #2D3F3E",
-"D.	c #35444C",
-"E.	c #4A5860",
-"F.	c #4E5D63",
-"G.	c #475A61",
-"H.	c #2C3A3D",
-"I.	c #3C4C52",
-"J.	c #4F6271",
-"K.	c #4A5E61",
-"L.	c #415051",
-"M.	c #263437",
-"N.	c #334149",
-"O.	c #687583",
-"P.	c #7F90A1",
-"Q.	c #899AAF",
-"R.	c #8393AC",
-"S.	c #8594AA",
-"T.	c #8393A7",
-"U.	c #8391A7",
-"V.	c #8394AA",
-"W.	c #8393A8",
-"X.	c #8696AC",
-"Y.	c #8496AB",
-"Z.	c #7A8DA0",
-"`.	c #526264",
-" +	c #2A3A3F",
-".+	c #424E53",
-"++	c #4F5D63",
-"@+	c #4D5E62",
-"#+	c #3A4B4D",
-"$+	c #4D5F66",
-"%+	c #4A616A",
-"&+	c #485D5D",
-"*+	c #2E3F3E",
-"=+	c #253238",
-"-+	c #7C8A9B",
-";+	c #8191A2",
-">+	c #8190A4",
-",+	c #8091A5",
-"'+	c #7E8EA3",
-")+	c #7B8DA2",
-"!+	c #7C8DA4",
-"~+	c #808DA4",
-"{+	c #808FA4",
-"]+	c #828EA4",
-"^+	c #8390A4",
-"/+	c #8392A8",
-"(+	c #8392A6",
-"_+	c #76858D",
-":+	c #404E51",
-"<+	c #314245",
-"[+	c #48595F",
-"}+	c #505F6A",
-"|+	c #4A5E64",
-"1+	c #2D363A",
-"2+	c #52626A",
-"3+	c #50646A",
-"4+	c #435656",
-"5+	c #253736",
-"6+	c #364148",
-"7+	c #6D7A8A",
-"8+	c #7C8B9D",
-"9+	c #7B8B9E",
-"0+	c #7C8EA2",
-"a+	c #7C8D9D",
-"b+	c #7B8B9C",
-"c+	c #7B8C9D",
-"d+	c #7B8B9D",
-"e+	c #808EA3",
-"f+	c #7B8AA1",
-"g+	c #7C8BA3",
-"h+	c #808EA4",
-"i+	c #818D9E",
-"j+	c #556668",
-"k+	c #2B3E3B",
-"l+	c #45565A",
-"m+	c #52616A",
-"n+	c #4C6065",
-"o+	c #283336",
-"p+	c #52636A",
-"q+	c #52656A",
-"r+	c #3A504F",
-"s+	c #253437",
-"t+	c #48545E",
-"u+	c #798496",
-"v+	c #7B899D",
-"w+	c #7B899E",
-"x+	c #7B8A9C",
-"y+	c #7A8C9B",
-"z+	c #7A899B",
-"A+	c #7B899C",
-"B+	c #7E8BA3",
-"C+	c #808BA3",
-"D+	c #7D8AA2",
-"E+	c #7E8A9F",
-"F+	c #7E8AA2",
-"G+	c #7C889D",
-"H+	c #6C7B7D",
-"I+	c #32443E",
-"J+	c #3A4C4F",
-"K+	c #4D626A",
-"L+	c #4C6068",
-"M+	c #4F636A",
-"N+	c #50656B",
-"O+	c #52666B",
-"P+	c #3B4B4A",
-"Q+	c #263536",
-"R+	c #516067",
-"S+	c #778698",
-"T+	c #7B889C",
-"U+	c #7B8898",
-"V+	c #73828B",
-"W+	c #394A4F",
-"X+	c #374A4F",
-"Y+	c #50656A",
-"Z+	c #4C6365",
-"`+	c #374844",
-" @	c #263537",
-".@	c #52636E",
-"+@	c #768596",
-"@@	c #7B8595",
-"#@	c #7B859A",
-"$@	c #7A879A",
-"%@	c #79889C",
-"&@	c #7A889C",
-"*@	c #79879C",
-"=@	c #75859A",
-"-@	c #7A8594",
-";@	c #75838C",
-">@	c #3E4E51",
-",@	c #3A4A4F",
-"'@	c #51646A",
-")@	c #4C626A",
-"!@	c #4F6468",
-"~@	c #3B4A48",
-"{@	c #253536",
-"]@	c #52626D",
-"^@	c #768398",
-"/@	c #768294",
-"(@	c #7A8294",
-"_@	c #7B8294",
-":@	c #7B8494",
-"<@	c #7B8696",
-"[@	c #7B8698",
-"}@	c #7B869C",
-"|@	c #78859B",
-"1@	c #7A859C",
-"2@	c #79859A",
-"3@	c #74838B",
-"4@	c #3E4F51",
-"5@	c #3B4C4F",
-"6@	c #52676A",
-"7@	c #52666A",
-"8@	c #3F4F4E",
-"9@	c #253436",
-"0@	c #495863",
-"a@	c #728091",
-"b@	c #778194",
-"c@	c #7B8194",
-"d@	c #7B8594",
-"e@	c #7B8596",
-"f@	c #7B859C",
-"g@	c #7A859B",
-"h@	c #788496",
-"i@	c #7B8499",
-"j@	c #798596",
-"k@	c #6B7B84",
-"l@	c #39484B",
-"m@	c #3F5052",
-"n@	c #52666D",
-"o@	c #52686D",
-"p@	c #54666D",
-"q@	c #435451",
-"r@	c #263736",
-"s@	c #394950",
-"t@	c #70798A",
-"u@	c #788092",
-"v@	c #788194",
-"w@	c #7B8396",
-"x@	c #7B8598",
-"y@	c #7B8599",
-"z@	c #7B849A",
-"A@	c #7A8399",
-"B@	c #7B8498",
-"C@	c #758194",
-"D@	c #758393",
-"E@	c #5E7076",
-"F@	c #334448",
-"G@	c #52656D",
-"H@	c #52676D",
-"I@	c #526973",
-"J@	c #536973",
-"K@	c #475C5B",
-"L@	c #304340",
-"M@	c #2D3B41",
-"N@	c #626D7C",
-"O@	c #717D8D",
-"P@	c #738194",
-"Q@	c #7A849A",
-"R@	c #7A8396",
-"S@	c #7B8394",
-"T@	c #7B859B",
-"U@	c #798194",
-"V@	c #7A8497",
-"W@	c #778191",
-"X@	c #737F88",
-"Y@	c #4C5A5D",
-"Z@	c #304346",
-"`@	c #4B5A62",
-" #	c #526673",
-".#	c #526972",
-"+#	c #2D393A",
-"@#	c #526A73",
-"##	c #4F6265",
-"$#	c #3B4C4D",
-"%#	c #2A383B",
-"&#	c #6B7787",
-"*#	c #737F8F",
-"=#	c #737F91",
-"-#	c #7A8394",
-";#	c #788497",
-">#	c #7A8495",
-",#	c #738191",
-"'#	c #75818F",
-")#	c #707D88",
-"!#	c #697579",
-"~#	c #394947",
-"{#	c #374B4A",
-"]#	c #4F6165",
-"^#	c #526670",
-"/#	c #43585D",
-"(#	c #536D73",
-"_#	c #526771",
-":#	c #485861",
-"<#	c #324142",
-"[#	c #334043",
-"}#	c #525F6A",
-"|#	c #6B7A84",
-"1#	c #737D8B",
-"2#	c #737F90",
-"3#	c #738090",
-"4#	c #738190",
-"5#	c #768390",
-"6#	c #788390",
-"7#	c #73808B",
-"8#	c #707E8A",
-"9#	c #657580",
-"0#	c #48575E",
-"a#	c #374647",
-"b#	c #4B5D5C",
-"c#	c #57696F",
-"d#	c #576975",
-"e#	c #44565D",
-"f#	c #37474E",
-"g#	c #536D7A",
-"h#	c #52697A",
-"i#	c #4F636F",
-"j#	c #425351",
-"k#	c #2F3E3C",
-"l#	c #344148",
-"m#	c #505E69",
-"n#	c #69747F",
-"o#	c #6B7784",
-"p#	c #6F7C88",
-"q#	c #717D89",
-"r#	c #717D8B",
-"s#	c #6C7D86",
-"t#	c #6C7D89",
-"u#	c #6B7C83",
-"v#	c #485961",
-"w#	c #334150",
-"x#	c #435258",
-"y#	c #54646A",
-"z#	c #596D78",
-"A#	c #5A6B7A",
-"B#	c #39474E",
-"C#	c #526B78",
-"D#	c #546C79",
-"E#	c #576B72",
-"F#	c #4D6062",
-"G#	c #384C4D",
-"H#	c #29383F",
-"I#	c #2E3C46",
-"J#	c #4C5960",
-"K#	c #636D73",
-"L#	c #65757D",
-"M#	c #677882",
-"N#	c #657982",
-"O#	c #687985",
-"P#	c #677983",
-"Q#	c #69777D",
-"R#	c #68757B",
-"S#	c #59686D",
-"T#	c #3C4E54",
-"U#	c #324348",
-"V#	c #3A4C59",
-"W#	c #52636F",
-"X#	c #5A707D",
-"Y#	c #586B78",
-"Z#	c #35434C",
-"`#	c #586E7B",
-" $	c #5A707A",
-".$	c #576A71",
-"+$	c #4E5F65",
-"@$	c #3E4C51",
-"#$	c #2E3C40",
-"$$	c #293637",
-"%$	c #334041",
-"&$	c #435156",
-"*$	c #505E65",
-"=$	c #56666B",
-"-$	c #576A6E",
-";$	c #556567",
-">$	c #4F5B5F",
-",$	c #3C4A4D",
-"'$	c #2D3C44",
-")$	c #314149",
-"!$	c #3E515A",
-"~$	c #4E626C",
-"{$	c #5B6F78",
-"]$	c #5D737B",
-"^$	c #5A727B",
-"/$	c #38464C",
-"($	c #4C5E66",
-"_$	c #5D727C",
-":$	c #5E717D",
-"<$	c #596D75",
-"[$	c #516569",
-"}$	c #455858",
-"|$	c #334343",
-"1$	c #273636",
-"2$	c #233132",
-"3$	c #273334",
-"4$	c #2B3536",
-"5$	c #273536",
-"6$	c #273333",
-"7$	c #273439",
-"8$	c #29373D",
-"9$	c #384550",
-"0$	c #495B66",
-"a$	c #576A73",
-"b$	c #5C717C",
-"c$	c #61737D",
-"d$	c #61757D",
-"e$	c #4B5F66",
-"f$	c #4F5C68",
-"g$	c #627183",
-"h$	c #61727F",
-"i$	c #5E7178",
-"j$	c #556970",
-"k$	c #506266",
-"l$	c #45585B",
-"m$	c #3D4E50",
-"n$	c #384648",
-"o$	c #364246",
-"p$	c #344347",
-"q$	c #3B484A",
-"r$	c #45555D",
-"s$	c #51616A",
-"t$	c #586976",
-"u$	c #5F7280",
-"v$	c #617582",
-"w$	c #637884",
-"x$	c #4F5F6A",
-"y$	c #4F5E6D",
-"z$	c #627787",
-"A$	c #637A87",
-"B$	c #617785",
-"C$	c #627683",
-"D$	c #64747F",
-"E$	c #5E7078",
-"F$	c #5C6D73",
-"G$	c #5F7077",
-"H$	c #5F7178",
-"I$	c #62747B",
-"J$	c #677784",
-"K$	c #6A7B87",
-"L$	c #687B87",
-"M$	c #6A7E8E",
-"N$	c #677B8B",
-"O$	c #6A798B",
-"P$	c #52606C",
-"Q$	c #3D4D52",
-"R$	c #5E7383",
-"S$	c #687A8B",
-"T$	c #6A7D8B",
-"U$	c #6A7C8B",
-"V$	c #677A8A",
-"W$	c #6A7A8A",
-"X$	c #6A7B8B",
-"Y$	c #6A7C8E",
-"Z$	c #6A808E",
-"`$	c #6A7F8B",
-" %	c #6A7E8C",
-".%	c #6A7E8B",
-"+%	c #637683",
-"@%	c #404E55",
-"#%	c #566672",
-"$%	c #60717E",
-"%%	c #6A7D8C",
-"&%	c #6A8092",
-"*%	c #6A8190",
-"=%	c #6E8191",
-"-%	c #637584",
-";%	c #576873",
-">%	c #566671",
-"                      . + @ # $ %                       ",
-"                & * = - ; > , ' ) ! ~ {                 ",
-"            ] ^ / ( _ : < [ } | 1 2 3 / 4 5             ",
-"          6 7 8 9 0 a b c d e f g h i j k l m           ",
-"        n o p q r s t u v w x y z A B C D E F G         ",
-"      H I J K L M N O P Q R S g T U V W X Y Z `  .      ",
-"    ..+. at .#.$.%.&.*.=.-.;.>.,.'.).!.~.{.].^./.(._.:.    ",
-"    <.#.[.}.n |.1.2.3.4.5.6.7.8.9.0.a.b.c.d.e.f.g.h.    ",
-"  i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.A.B.C.D.E.F.G.H.  ",
-"  I.J.K.L.M.N.O.P.Q.R.S.T.U.U.V.W.T.X.Y.Z.`. +.+++ at +#+  ",
-"  $+%+&+*+=+b.-+;+>+,+'+)+!+~+{+]+{+^+/+(+_+:+<+[+}+|+  ",
-"1+2+3+4+5+6+7+8+9+0+a+b+c+c+c+d+e+f+g+^+h+i+j+k+l+m+n+o+",
-"p+p+q+r+s+t+u+v+w+x+y+z+A+A+A+A+B+C+D+E+F+G+H+I+J+m+K+L+",
-"M+N+O+P+Q+R+S+A+A+A+A+A+A+A+A+A+A+A+A+x+T+U+V+W+X+2+3+%+",
-"q+Y+Z+`+ @. at +@@@@@#@#@$@A+A+A+A+A+%@&@*@=@-@;@>@, at 2+'@)@",
-"q+Y+!@~@{@]@^@/@(@_@:@-@<@[@}@}@}@|@1 at 1@2 at -@3 at 4@5 at 2+q+q+",
-"q+6 at 7@8 at 9@0 at a@b at b@c at c@:@d at e@f at f@g at h@f at f@i at j@k at l@m at 2+q+7@",
-"n at o@p at q@r at s@t at u@v at c@w@@@d at x@y at y@f at z@A at B@C at D@E at F@l+G at n@H@",
-"|.I at J@K at L@M at N@O at P@b at Q@R@(@S@:@d at T@i at U@V at W@X at Y@Z@`@ #.#+#",
-"  @#I@##$#%#/.&#*#=#U at C@C at -#:@d@;#>#,#'#)#!#~#{#]#^#I@  ",
-"  /#(#_#:#<#[#}#|#1#2#3#4#4#5#6#3#4#7#8#9#0#a#b#c#d#e#  ",
-"  f#g#h#i#j#k#l#m#n#o#p#q#r#r#r#s#t#u#E at v#w#x#y#z#A#B#  ",
-"    C#D#E#F#G#H#I#J#K#L#M#N#O#P#Q#R#S#T#U#V#W#z#X#Y#    ",
-"    Z#`# $.$+$@$#$$$%$&$*$=$-$;$>$,$'$)$!$~${$]$^$/$    ",
-"      ($_$:$<$[$}$|$1$2$3$4$5$6$7$8$9$0$a$b$c$d$e$      ",
-"        f$g$h$i$j$k$l$m$n$o$p$q$r$s$t$u$v$w$w$x$        ",
-"          y$z$A$B$C$D$E$F$G$H$I$J$K$L$M$N$O$P$          ",
-"            Q$R$S$T$U$V$W$W$X$Y$Z$`$ %.%+%@%            ",
-"                #%$%T$T$T$T$%%&%*%=%-%;%                ",
-"                      >%T$T$T$T$>%                      "};
diff --git a/gtk2_ardour/pixmaps/small_x.xpm b/gtk2_ardour/pixmaps/small_x.xpm
deleted file mode 100644
index ee8e930..0000000
--- a/gtk2_ardour/pixmaps/small_x.xpm
+++ /dev/null
@@ -1,16 +0,0 @@
-/* XPM */
-static const gchar * small_x_xpm[] = {
-"11 11 2 1",
-" 	c None",
-".	c #cccccc",
-"           ",
-"           ",
-"  .     .  ",
-"   .   .   ",
-"    . .    ",
-"     .     ",
-"    . .    ",
-"   .   .   ",
-"  .     .  ",
-"           ",
-"           "};
diff --git a/gtk2_ardour/pixmaps/toggle-button-00.xpm b/gtk2_ardour/pixmaps/toggle-button-00.xpm
deleted file mode 100644
index 7606152..0000000
--- a/gtk2_ardour/pixmaps/toggle-button-00.xpm
+++ /dev/null
@@ -1,354 +0,0 @@
-/* XPM */
-static char * toggle_button_00_xpm[] = {
-"21 22 329 2",
-"  	c None",
-". 	c #52646A",
-"+ 	c #56686E",
-"@ 	c #506268",
-"# 	c #4C5E66",
-"$ 	c #4E626A",
-"% 	c #52646C",
-"& 	c #52636A",
-"* 	c #52636C",
-"= 	c #52636E",
-"- 	c #50626C",
-"; 	c #4E6166",
-"> 	c #4E5F66",
-", 	c #4C5D66",
-"' 	c #4E5E66",
-") 	c #505F68",
-"! 	c #52656A",
-"~ 	c #52676C",
-"{ 	c #54676C",
-"] 	c #415156",
-"^ 	c #2B3A41",
-"/ 	c #24343D",
-"( 	c #28363D",
-"_ 	c #24363D",
-": 	c #24383D",
-"< 	c #29363D",
-"[ 	c #24363F",
-"} 	c #27363F",
-"| 	c #27343B",
-"1 	c #2D3944",
-"2 	c #37464E",
-"3 	c #485960",
-"4 	c #42545A",
-"5 	c #29383F",
-"6 	c #2F3C46",
-"7 	c #2F4143",
-"8 	c #334246",
-"9 	c #2F3F46",
-"0 	c #314046",
-"a 	c #354246",
-"b 	c #313F46",
-"c 	c #314048",
-"d 	c #333F48",
-"e 	c #313F48",
-"f 	c #33404A",
-"g 	c #2F3B46",
-"h 	c #2B393F",
-"i 	c #3B4A52",
-"j 	c #394C54",
-"k 	c #394752",
-"l 	c #415058",
-"m 	c #415252",
-"n 	c #29393F",
-"o 	c #28383F",
-"p 	c #28373D",
-"q 	c #2D383D",
-"r 	c #2D373D",
-"s 	c #2D3A3D",
-"t 	c #2D393D",
-"u 	c #2B373F",
-"v 	c #2A373D",
-"w 	c #283837",
-"x 	c #283A3D",
-"y 	c #3B4952",
-"z 	c #3D4D56",
-"A 	c #394750",
-"B 	c #3F5258",
-"C 	c #44565E",
-"D 	c #46585E",
-"E 	c #39474A",
-"F 	c #3B4B56",
-"G 	c #4E5A66",
-"H 	c #525C66",
-"I 	c #525E6A",
-"J 	c #52606A",
-"K 	c #56606A",
-"L 	c #525E68",
-"M 	c #48585E",
-"N 	c #2F3E3D",
-"O 	c #202F31",
-"P 	c #2A3B42",
-"Q 	c #46545E",
-"R 	c #435260",
-"S 	c #3D4D58",
-"T 	c #43575E",
-"U 	c #4A5A62",
-"V 	c #4E5B5E",
-"W 	c #37484E",
-"X 	c #62707F",
-"Y 	c #8190A8",
-"Z 	c #8C9AB4",
-"` 	c #8E9EB4",
-" .	c #8E9EB8",
-"..	c #8C9CB4",
-"+.	c #8C9EB4",
-"@.	c #90A0B8",
-"#.	c #90A2B6",
-"$.	c #90A0B4",
-"%.	c #90A2B0",
-"&.	c #627379",
-"*.	c #2B363D",
-"=.	c #2D3A46",
-"-.	c #465766",
-";.	c #465762",
-">.	c #3F4F5A",
-",.	c #465860",
-"'.	c #4A5D62",
-").	c #4E6164",
-"!.	c #6A7A8E",
-"~.	c #92A0BE",
-"{.	c #94A2C0",
-"].	c #94A6C4",
-"^.	c #94A6C9",
-"/.	c #94A4C3",
-"(.	c #94A4C0",
-"_.	c #96A6C2",
-":.	c #96A4C2",
-"<.	c #909EB8",
-"[.	c #8392A0",
-"}.	c #424C54",
-"|.	c #2F3F48",
-"1.	c #4A5B66",
-"2.	c #4A5962",
-"3.	c #3F515C",
-"4.	c #4A5F62",
-"5.	c #4C5F62",
-"6.	c #37414A",
-"7.	c #68748C",
-"8.	c #7F8EAA",
-"9.	c #7F8FA8",
-"0.	c #7F8EA8",
-"a.	c #7F8DA8",
-"b.	c #7F8BA6",
-"c.	c #7D88A2",
-"d.	c #7D8998",
-"e.	c #46565E",
-"f.	c #2D4048",
-"g.	c #3D505A",
-"h.	c #465B5E",
-"i.	c #4A5F66",
-"j.	c #313D4A",
-"k.	c #667184",
-"l.	c #7B87A2",
-"m.	c #7B89A4",
-"n.	c #7987A2",
-"o.	c #7785A0",
-"p.	c #7B879C",
-"q.	c #7B88A0",
-"r.	c #7B869E",
-"s.	c #7B8596",
-"t.	c #46565A",
-"u.	c #2D3D42",
-"v.	c #465B66",
-"w.	c #4A5E66",
-"x.	c #313C48",
-"y.	c #64707F",
-"z.	c #79859A",
-"A.	c #798598",
-"B.	c #738598",
-"C.	c #738398",
-"D.	c #73849A",
-"E.	c #73859C",
-"F.	c #75859A",
-"G.	c #778798",
-"H.	c #77859A",
-"I.	c #79849C",
-"J.	c #758490",
-"K.	c #46585A",
-"L.	c #2B3C42",
-"M.	c #465A62",
-"N.	c #465B62",
-"O.	c #4A5C66",
-"P.	c #2F3C43",
-"Q.	c #606C7D",
-"R.	c #778294",
-"S.	c #798394",
-"T.	c #758394",
-"U.	c #738394",
-"V.	c #738294",
-"W.	c #738194",
-"X.	c #738494",
-"Y.	c #738396",
-"Z.	c #738496",
-"`.	c #73818B",
-" +	c #263A40",
-".+	c #485B64",
-"++	c #4A5C62",
-"@+	c #3F505A",
-"#+	c #2D3D43",
-"$+	c #5E6C78",
-"%+	c #778094",
-"&+	c #778194",
-"*+	c #738192",
-"=+	c #737E8B",
-"-+	c #283A42",
-";+	c #41505A",
-">+	c #465A5E",
-",+	c #2D3D41",
-"'+	c #5E6B76",
-")+	c #738190",
-"!+	c #737D8B",
-"~+	c #465656",
-"{+	c #2D3B42",
-"]+	c #465A64",
-"^+	c #4A5B62",
-"/+	c #41515A",
-"(+	c #465B64",
-"_+	c #4A5D64",
-":+	c #2D3D3D",
-"<+	c #5C6A74",
-"[+	c #737F8B",
-"}+	c #73808B",
-"|+	c #73808D",
-"1+	c #737F90",
-"2+	c #737F92",
-"3+	c #737F8D",
-"4+	c #6E7D87",
-"5+	c #445256",
-"6+	c #2D3C42",
-"7+	c #465962",
-"8+	c #41525A",
-"9+	c #4A5E62",
-"0+	c #46595E",
-"a+	c #2B3B41",
-"b+	c #5A6A72",
-"c+	c #6C7B87",
-"d+	c #6E7C89",
-"e+	c #6E7B87",
-"f+	c #6C7C89",
-"g+	c #6A7B89",
-"h+	c #6A7987",
-"i+	c #6A7B87",
-"j+	c #687B87",
-"k+	c #6A7A83",
-"l+	c #404A4E",
-"m+	c #2F3D44",
-"n+	c #485A64",
-"o+	c #41545A",
-"p+	c #2D3D46",
-"q+	c #647581",
-"r+	c #647783",
-"s+	c #627583",
-"t+	c #647681",
-"u+	c #62757F",
-"v+	c #60757F",
-"w+	c #64757F",
-"x+	c #62737B",
-"y+	c #334248",
-"z+	c #2F3F44",
-"A+	c #4A5D66",
-"B+	c #485C66",
-"C+	c #2A3D44",
-"D+	c #31414A",
-"E+	c #526268",
-"F+	c #56676E",
-"G+	c #56696E",
-"H+	c #56656E",
-"I+	c #54666E",
-"J+	c #56666C",
-"K+	c #4E5C64",
-"L+	c #374A52",
-"M+	c #4C6068",
-"N+	c #3F525A",
-"O+	c #4A5D6A",
-"P+	c #3D5056",
-"Q+	c #2F3F41",
-"R+	c #273639",
-"S+	c #223133",
-"T+	c #203033",
-"U+	c #203437",
-"V+	c #203335",
-"W+	c #203235",
-"X+	c #223135",
-"Y+	c #2D393F",
-"Z+	c #394B52",
-"`+	c #445862",
-" @	c #4C6268",
-".@	c #41555A",
-"+@	c #465D66",
-"@@	c #485D66",
-"#@	c #4A5F6A",
-"$@	c #3B4D54",
-"%@	c #2D3A42",
-"&@	c #28373E",
-"*@	c #283840",
-"=@	c #26363E",
-"-@	c #24363E",
-";@	c #2B3840",
-">@	c #35454E",
-",@	c #48575E",
-"'@	c #4E606A",
-")@	c #4C606A",
-"!@	c #465C64",
-"~@	c #3D525C",
-"{@	c #4A606A",
-"]@	c #4A616A",
-"^@	c #485B62",
-"/@	c #435660",
-"(@	c #3D4E56",
-"_@	c #3D4C56",
-":@	c #4A5B64",
-"<@	c #4C5F68",
-"[@	c #4A5E68",
-"}@	c #485F68",
-"|@	c #506773",
-"1@	c #526875",
-"2@	c #566A77",
-"3@	c #566975",
-"4@	c #526570",
-"5@	c #4E636C",
-"6@	c #4A5F68",
-"7@	c #546670",
-"8@	c #566A72",
-"9@	c #566B75",
-"0@	c #546973",
-"a@	c #50656E",
-"b@	c #526971",
-"c@	c #526A75",
-"d@	c #546C77",
-"e@	c #566D7B",
-"f@	c #586D7B",
-"g@	c #586C79",
-"h@	c #546A73",
-"i@	c #566B73",
-"j@	c #566C77",
-"k@	c #566D77",
-"l@	c #566B77",
-"m@	c #546777",
-"n@	c #526673",
-". + @ # $ % & * = - ; > , # > > > ' ) ! ~ ",
-"{ ] ^ / ( _ : < [ } < < < < < < < | 1 2 3 ",
-"4 5 6 7 8 9 0 a b b 0 0 0 c d b e f g h i ",
-"j k l m n o ( p q r s s t u v w x y z A k ",
-"B C D E F G H H I I J K J L M N O P Q R S ",
-"T U V W X Y Z `  ...+. at .#.$.%.&.*.=.-.;.>.",
-",.'.).y !.~.{.].^./.(.(._.:.<.[.}.|.1.2.3.",
-";.4.5.6.7.8.9.9.9.0.a.a.9.b.c.d.e.f.1.2.g.",
-"h.i.'.j.k.l.m.m.m.n.o.p.p.q.r.s.t.u.v.2.g.",
-"h.w.1.x.y.z.A.B.C.D.E.F.G.H.I.J.K.L.M.U g.",
-"N.O.1.P.Q.R.S.T.U.V.W.U.X.Y.Z.`.t. +.+++ at +",
-"v.1.M.#+$+%+&+W.V.V.W.W.W.W.*+=+t.-+v.++;+",
-"v.O.>+,+'+%+&+W.W.W.W.W.W.W.)+!+~+{+]+^+/+",
-"(+_+h.:+<+=+[+}+`.|+1+1+1+2+3+4+5+6+7+^+8+",
-"N.9+0+a+b+c+d+e+f+g+h+i+i+d+j+k+l+m+n+++o+",
-"N.'.o+p+% q+r+s+s+t+u+u+u+v+w+x+y+z+A+++8+",
-"N.'.B+C+D+E+F++ G+F+H+H+H+I+J+K+D+L+M+'.N+",
-"N.A+O+P+Q+R+S+T+U+V+W+W+W+X+Y+Z+`+w. @'..@",
-"+@@@#@T $@y+%@&@*@&@=@-@=@;@>@,@'@)@M+!@~@",
-"{@]@]@#@^@/@@+z P+(@z _ at z g./@:@<@'@[@}@M.",
-"|@1 at 2@3 at 4@5@<@i.6 at i.i.i.i.<@'@7 at 8@9 at 3@0 at a@",
-"b at c@d at e@f at g@h at h@i at i@i at i@i at i@i at j@k at l@2 at m@n@"};
diff --git a/gtk2_ardour/pixmaps/toggle-button-01.xpm b/gtk2_ardour/pixmaps/toggle-button-01.xpm
deleted file mode 100644
index e105083..0000000
--- a/gtk2_ardour/pixmaps/toggle-button-01.xpm
+++ /dev/null
@@ -1,365 +0,0 @@
-/* XPM */
-static char * toggle_button_01_xpm[] = {
-"21 22 340 2",
-"  	c None",
-". 	c #52646A",
-"+ 	c #56686E",
-"@ 	c #506268",
-"# 	c #4C5E66",
-"$ 	c #4E626A",
-"% 	c #52646C",
-"& 	c #52636A",
-"* 	c #52636C",
-"= 	c #52636E",
-"- 	c #50626C",
-"; 	c #4E6166",
-"> 	c #4E5F66",
-", 	c #4C5D66",
-"' 	c #4E5E66",
-") 	c #505F68",
-"! 	c #52656A",
-"~ 	c #52676C",
-"{ 	c #54676C",
-"] 	c #415156",
-"^ 	c #2B3A41",
-"/ 	c #24343D",
-"( 	c #28363D",
-"_ 	c #24363D",
-": 	c #24383D",
-"< 	c #29363D",
-"[ 	c #24363F",
-"} 	c #27363F",
-"| 	c #27343B",
-"1 	c #2D3944",
-"2 	c #37464E",
-"3 	c #485960",
-"4 	c #42545A",
-"5 	c #29383F",
-"6 	c #2F3C46",
-"7 	c #2F4143",
-"8 	c #334246",
-"9 	c #2F3F46",
-"0 	c #314046",
-"a 	c #354246",
-"b 	c #313F46",
-"c 	c #314048",
-"d 	c #333F48",
-"e 	c #313F48",
-"f 	c #33404A",
-"g 	c #2F3B46",
-"h 	c #2B393F",
-"i 	c #3B4A52",
-"j 	c #394C54",
-"k 	c #394752",
-"l 	c #415058",
-"m 	c #415252",
-"n 	c #29393F",
-"o 	c #28383F",
-"p 	c #28373D",
-"q 	c #2D383D",
-"r 	c #2D373D",
-"s 	c #2D3A3D",
-"t 	c #2D393D",
-"u 	c #2B373F",
-"v 	c #2A373D",
-"w 	c #283837",
-"x 	c #283A3D",
-"y 	c #3B4952",
-"z 	c #3D4D56",
-"A 	c #394750",
-"B 	c #3F5258",
-"C 	c #44565E",
-"D 	c #46585E",
-"E 	c #39474A",
-"F 	c #3B4B56",
-"G 	c #4E5A66",
-"H 	c #525C66",
-"I 	c #525E6A",
-"J 	c #52606A",
-"K 	c #56606A",
-"L 	c #525E68",
-"M 	c #48585E",
-"N 	c #2F3E3D",
-"O 	c #202F31",
-"P 	c #2A3B42",
-"Q 	c #46545E",
-"R 	c #435260",
-"S 	c #3D4D58",
-"T 	c #43575E",
-"U 	c #4A5A62",
-"V 	c #4E5B5E",
-"W 	c #37484E",
-"X 	c #62707F",
-"Y 	c #8190A8",
-"Z 	c #8C9AB4",
-"` 	c #8E9EB4",
-" .	c #8E9EB8",
-"..	c #8C9CB4",
-"+.	c #8C9EB4",
-"@.	c #90A0B8",
-"#.	c #90A2B6",
-"$.	c #90A0B4",
-"%.	c #90A2B0",
-"&.	c #627379",
-"*.	c #2B363D",
-"=.	c #2D3A46",
-"-.	c #465766",
-";.	c #465762",
-">.	c #3F4F5A",
-",.	c #465860",
-"'.	c #4A5D62",
-").	c #4E6164",
-"!.	c #6A7A8E",
-"~.	c #92A0BE",
-"{.	c #94A2C0",
-"].	c #94A6C4",
-"^.	c #94A6C9",
-"/.	c #94A4C3",
-"(.	c #94A4C0",
-"_.	c #96A6C2",
-":.	c #96A4C2",
-"<.	c #909EB8",
-"[.	c #8392A0",
-"}.	c #424C54",
-"|.	c #2F3F48",
-"1.	c #4A5B66",
-"2.	c #4A5962",
-"3.	c #3F515C",
-"4.	c #4A5F62",
-"5.	c #4C5F62",
-"6.	c #37414A",
-"7.	c #68748C",
-"8.	c #7F8EAA",
-"9.	c #7F8FA8",
-"0.	c #7F8EA8",
-"a.	c #7F8DA8",
-"b.	c #7F8BA6",
-"c.	c #7D88A2",
-"d.	c #7D8998",
-"e.	c #46565E",
-"f.	c #2D4048",
-"g.	c #3D505A",
-"h.	c #465B5E",
-"i.	c #4A5F66",
-"j.	c #313D4A",
-"k.	c #667184",
-"l.	c #7B87A2",
-"m.	c #7B89A4",
-"n.	c #7B88A3",
-"o.	c #7B86A0",
-"p.	c #7A85A0",
-"q.	c #7B879C",
-"r.	c #7B88A0",
-"s.	c #7B869E",
-"t.	c #7B8596",
-"u.	c #46565A",
-"v.	c #2D3D42",
-"w.	c #465B66",
-"x.	c #4A5E66",
-"y.	c #313C48",
-"z.	c #64707F",
-"A.	c #79859A",
-"B.	c #798598",
-"C.	c #748599",
-"D.	c #A97E7F",
-"E.	c #E7765A",
-"F.	c #E67256",
-"G.	c #A97B7B",
-"H.	c #788799",
-"I.	c #77859A",
-"J.	c #79849C",
-"K.	c #758490",
-"L.	c #46585A",
-"M.	c #2B3C42",
-"N.	c #465A62",
-"O.	c #465B62",
-"P.	c #4A5C66",
-"Q.	c #2F3C43",
-"R.	c #606C7D",
-"S.	c #778294",
-"T.	c #798394",
-"U.	c #788498",
-"V.	c #E66141",
-"W.	c #E45A38",
-"X.	c #E46A4C",
-"Y.	c #768598",
-"Z.	c #738396",
-"`.	c #738496",
-" +	c #73818B",
-".+	c #263A40",
-"++	c #485B64",
-"@+	c #4A5C62",
-"#+	c #3F505A",
-"$+	c #2D3D43",
-"%+	c #5E6C78",
-"&+	c #778094",
-"*+	c #778194",
-"=+	c #768298",
-"-+	c #E24E2A",
-";+	c #E46547",
-">+	c #738194",
-",+	c #738192",
-"'+	c #737E8B",
-")+	c #283A42",
-"!+	c #41505A",
-"~+	c #465A5E",
-"{+	c #2D3D41",
-"]+	c #5E6B76",
-"^+	c #748195",
-"/+	c #A87A7A",
-"(+	c #A77675",
-"_+	c #738190",
-":+	c #737D8B",
-"<+	c #465656",
-"[+	c #2D3B42",
-"}+	c #465A64",
-"|+	c #4A5B62",
-"1+	c #41515A",
-"2+	c #465B64",
-"3+	c #4A5D64",
-"4+	c #2D3D3D",
-"5+	c #5C6A74",
-"6+	c #737F8B",
-"7+	c #73808B",
-"8+	c #74818D",
-"9+	c #768293",
-"0+	c #768093",
-"a+	c #747F90",
-"b+	c #737F90",
-"c+	c #737F92",
-"d+	c #737F8D",
-"e+	c #6E7D87",
-"f+	c #445256",
-"g+	c #2D3C42",
-"h+	c #465962",
-"i+	c #41525A",
-"j+	c #4A5E62",
-"k+	c #46595E",
-"l+	c #2B3B41",
-"m+	c #5A6A72",
-"n+	c #6C7B87",
-"o+	c #6E7C89",
-"p+	c #6E7B87",
-"q+	c #6C7C89",
-"r+	c #6A7B89",
-"s+	c #6A7987",
-"t+	c #6A7B87",
-"u+	c #687B87",
-"v+	c #6A7A83",
-"w+	c #404A4E",
-"x+	c #2F3D44",
-"y+	c #485A64",
-"z+	c #41545A",
-"A+	c #2D3D46",
-"B+	c #647581",
-"C+	c #647783",
-"D+	c #627583",
-"E+	c #647681",
-"F+	c #62757F",
-"G+	c #60757F",
-"H+	c #64757F",
-"I+	c #62737B",
-"J+	c #334248",
-"K+	c #2F3F44",
-"L+	c #4A5D66",
-"M+	c #485C66",
-"N+	c #2A3D44",
-"O+	c #31414A",
-"P+	c #526268",
-"Q+	c #56676E",
-"R+	c #56696E",
-"S+	c #56656E",
-"T+	c #54666E",
-"U+	c #56666C",
-"V+	c #4E5C64",
-"W+	c #374A52",
-"X+	c #4C6068",
-"Y+	c #3F525A",
-"Z+	c #4A5D6A",
-"`+	c #3D5056",
-" @	c #2F3F41",
-".@	c #273639",
-"+@	c #223133",
-"@@	c #203033",
-"#@	c #203437",
-"$@	c #203335",
-"%@	c #203235",
-"&@	c #223135",
-"*@	c #2D393F",
-"=@	c #394B52",
-"-@	c #445862",
-";@	c #4C6268",
-">@	c #41555A",
-",@	c #465D66",
-"'@	c #485D66",
-")@	c #4A5F6A",
-"!@	c #3B4D54",
-"~@	c #2D3A42",
-"{@	c #28373E",
-"]@	c #283840",
-"^@	c #26363E",
-"/@	c #24363E",
-"(@	c #2B3840",
-"_@	c #35454E",
-":@	c #48575E",
-"<@	c #4E606A",
-"[@	c #4C606A",
-"}@	c #465C64",
-"|@	c #3D525C",
-"1@	c #4A606A",
-"2@	c #4A616A",
-"3@	c #485B62",
-"4@	c #435660",
-"5@	c #3D4E56",
-"6@	c #3D4C56",
-"7@	c #4A5B64",
-"8@	c #4C5F68",
-"9@	c #4A5E68",
-"0@	c #485F68",
-"a@	c #506773",
-"b@	c #526875",
-"c@	c #566A77",
-"d@	c #566975",
-"e@	c #526570",
-"f@	c #4E636C",
-"g@	c #4A5F68",
-"h@	c #546670",
-"i@	c #566A72",
-"j@	c #566B75",
-"k@	c #546973",
-"l@	c #50656E",
-"m@	c #526971",
-"n@	c #526A75",
-"o@	c #546C77",
-"p@	c #566D7B",
-"q@	c #586D7B",
-"r@	c #586C79",
-"s@	c #546A73",
-"t@	c #566B73",
-"u@	c #566C77",
-"v@	c #566D77",
-"w@	c #566B77",
-"x@	c #546777",
-"y@	c #526673",
-". + @ # $ % & * = - ; > , # > > > ' ) ! ~ ",
-"{ ] ^ / ( _ : < [ } < < < < < < < | 1 2 3 ",
-"4 5 6 7 8 9 0 a b b 0 0 0 c d b e f g h i ",
-"j k l m n o ( p q r s s t u v w x y z A k ",
-"B C D E F G H H I I J K J L M N O P Q R S ",
-"T U V W X Y Z `  ...+. at .#.$.%.&.*.=.-.;.>.",
-",.'.).y !.~.{.].^./.(.(._.:.<.[.}.|.1.2.3.",
-";.4.5.6.7.8.9.9.9.0.a.a.9.b.c.d.e.f.1.2.g.",
-"h.i.'.j.k.l.m.m.n.o.p.q.q.r.s.t.u.v.w.2.g.",
-"h.x.1.y.z.A.B.C.D.E.F.G.H.I.J.K.L.M.N.U g.",
-"O.P.1.Q.R.S.T.U.E.V.W.X.Y.Z.`. +u..+++ at +#+",
-"w.1.N.$+%+&+*+=+F.W.-+;+=+>+,+'+u.)+w. at +!+",
-"w.P.~+{+]+&+*+^+/+X.;+(+^+>+_+:+<+[+}+|+1+",
-"2+3+h.4+5+'+6+7+8+9+0+a+b+c+d+e+f+g+h+|+i+",
-"O.j+k+l+m+n+o+p+q+r+s+t+t+o+u+v+w+x+y+ at +z+",
-"O.'.z+A+% B+C+D+D+E+F+F+F+G+H+I+J+K+L+ at +i+",
-"O.'.M+N+O+P+Q++ R+Q+S+S+S+T+U+V+O+W+X+'.Y+",
-"O.L+Z+`+ @. at +@@@#@$@%@%@%@&@*@=@- at x.;@'.>@",
-",@'@)@T !@J+~@{@]@{@^@/@^@(@_@:@<@[@X+}@|@",
-"1 at 2@2@)@3 at 4@#+z `+5 at z 6 at z g.4 at 7@8@<@9 at 0@N.",
-"a at b@c at d@e at f@8 at i.g@i.i.i.i.8@<@h at i@j at d@k at l@",
-"m at n@o at p@q at r@s at s@t at t@t at t@t at t@t at u@v at w@c at x@y@"};
diff --git a/gtk2_ardour/pixmaps/tool_audition.xpm b/gtk2_ardour/pixmaps/tool_audition.xpm
deleted file mode 100644
index d6f2ccd..0000000
--- a/gtk2_ardour/pixmaps/tool_audition.xpm
+++ /dev/null
@@ -1,19 +0,0 @@
-/* XPM */
-static char * tool_audition_xpm[] = {
-"16 12 4 1",
-" 	c None",
-".	c #000000",
-"+	c #ECECEC",
-"@	c #FFFFFF",
-"      ..        ",
-"     .+.    .   ",
-"    .++.   . at .  ",
-"....+ at +...  . at . ",
-".+++@@+.. at .  . at .",
-".+@@@@+. . at . . at .",
-".+@@@@+. . at . . at .",
-".+++@@+.. at .  . at .",
-"....+ at +...  . at . ",
-"    .++.   . at .  ",
-"     .+.    .   ",
-"      ..        "};
diff --git a/gtk2_ardour/pixmaps/tool_gain.xpm b/gtk2_ardour/pixmaps/tool_gain.xpm
deleted file mode 100644
index 480426f..0000000
--- a/gtk2_ardour/pixmaps/tool_gain.xpm
+++ /dev/null
@@ -1,18 +0,0 @@
-/* XPM */
-static char * tool_gain_xpm[] = {
-"16 12 3 1",
-" 	c None",
-".	c #000000",
-"+	c #FFFFFF",
-"...             ",
-".++..           ",
-"...++.          ",
-"   ..+.         ",
-"     .+.        ",
-"     .+.        ",
-"      .+.       ",
-"      .+.       ",
-"       .+..     ",
-"        .++.....",
-"         ..++++.",
-"           ....."};
diff --git a/gtk2_ardour/pixmaps/tool_object.xpm b/gtk2_ardour/pixmaps/tool_object.xpm
deleted file mode 100644
index 3d18ab8..0000000
--- a/gtk2_ardour/pixmaps/tool_object.xpm
+++ /dev/null
@@ -1,18 +0,0 @@
-/* XPM */
-static char * tool_object_xpm[] = {
-"16 12 3 1",
-" 	c None",
-".	c #000000",
-"+	c #FFFFFF",
-"     ...        ",
-"     .+.        ",
-"     .+.        ",
-"     .+.        ",
-"     .+.....    ",
-"     .+.+.+...  ",
-"   ...+.+.+.+.  ",
-"   .+.+++++++.  ",
-"   .+++++++++.  ",
-"   ..+++++++..  ",
-"    ...+++++.   ",
-"      .+++++.   "};
diff --git a/gtk2_ardour/pixmaps/tool_range.xpm b/gtk2_ardour/pixmaps/tool_range.xpm
deleted file mode 100644
index 75ee865..0000000
--- a/gtk2_ardour/pixmaps/tool_range.xpm
+++ /dev/null
@@ -1,18 +0,0 @@
-/* XPM */
-static char * tool_range_xpm[] = {
-"16 12 3 1",
-" 	c None",
-".	c #000000",
-"+	c #FFFFFF",
-"...          ...",
-".+.  ..  ..  .+.",
-".+. .+.  .+. .+.",
-".+..+.    .+..+.",
-".+.++......++.+.",
-".++++++++++++++.",
-".+.++......++.+.",
-".+..+.    .+..+.",
-".+. .+.  .+. .+.",
-".+.  ..  ..  .+.",
-".+.          .+.",
-"...          ..."};
diff --git a/gtk2_ardour/pixmaps/tool_stretch.xpm b/gtk2_ardour/pixmaps/tool_stretch.xpm
deleted file mode 100644
index 77943cd..0000000
--- a/gtk2_ardour/pixmaps/tool_stretch.xpm
+++ /dev/null
@@ -1,18 +0,0 @@
-/* XPM */
-static char * tool_stretch_xpm[] = {
-"16 12 3 1",
-" 	c None",
-".	c #000000",
-"+	c #FFFFFF",
-"  ..        ..  ",
-" .+.        .+. ",
-".++..........++.",
-"++++++++++++++++",
-".++..........++.",
-" .+.        .+. ",
-"  ..        ..  ",
-" +  +   +    +  ",
-" ++ +++ + + +++ ",
-"++++++++++++++++",
-"  ++  +  ++ + + ",
-"  +   +   +   + "};
diff --git a/gtk2_ardour/pixmaps/tool_zoom.xpm b/gtk2_ardour/pixmaps/tool_zoom.xpm
deleted file mode 100644
index 581363f..0000000
--- a/gtk2_ardour/pixmaps/tool_zoom.xpm
+++ /dev/null
@@ -1,29 +0,0 @@
-/* XPM */
-static char * tool_zoom_xpm[] = {
-"16 12 14 1",
-" 	c None",
-".	c #000000",
-"+	c #474747",
-"@	c #E7E7E7",
-"#	c #F6F6F6",
-"$	c #DCDCDC",
-"%	c #FFFFFF",
-"&	c #DFDFDF",
-"*	c #D7D7D7",
-"=	c #D6D6D6",
-"-	c #040404",
-";	c #070707",
-">	c #060606",
-",	c #050505",
-"     ...        ",
-"   +.@#$.+      ",
-"   .%%%%%.      ",
-"  .&%%%%%*.     ",
-"  .#%%%%%#.     ",
-"  .$%%%%%&.     ",
-"   .%%%%%.+     ",
-"   +.*#=...     ",
-"     ...+...    ",
-"          -.;   ",
-"           >.-  ",
-"            ,.  "};
diff --git a/gtk2_ardour/pixmaps/v_meter_strip.xpm b/gtk2_ardour/pixmaps/v_meter_strip.xpm
deleted file mode 100644
index d673c1d..0000000
--- a/gtk2_ardour/pixmaps/v_meter_strip.xpm
+++ /dev/null
@@ -1,483 +0,0 @@
-/* XPM */
-static const gchar * v_meter_strip_xpm[] = {
-"5 250 230 2",
-"  	c None",
-". 	c #FE0000",
-"+ 	c #FF0000",
-"@ 	c #FE0100",
-"# 	c #FD0200",
-"$ 	c #FD0300",
-"% 	c #FD0400",
-"& 	c #FC0500",
-"* 	c #FC0600",
-"= 	c #FC0700",
-"- 	c #FB0800",
-"; 	c #FA0900",
-"> 	c #FA0A00",
-", 	c #FA0B00",
-"' 	c #F90C00",
-") 	c #F90D00",
-"! 	c #F80E00",
-"~ 	c #F80F00",
-"{ 	c #F71000",
-"] 	c #F71100",
-"^ 	c #F61200",
-"/ 	c #F61300",
-"( 	c #F61400",
-"_ 	c #F51600",
-": 	c #F41700",
-"< 	c #F41800",
-"[ 	c #F31A00",
-"} 	c #F31B00",
-"| 	c #F21C00",
-"1 	c #F21E00",
-"2 	c #F11F00",
-"3 	c #F54A00",
-"4 	c #FFA900",
-"5 	c #FFAB00",
-"6 	c #FFAC01",
-"7 	c #FFAD02",
-"8 	c #FFAE02",
-"9 	c #FFAF03",
-"0 	c #FFB004",
-"a 	c #FFB104",
-"b 	c #FFB205",
-"c 	c #FFB406",
-"d 	c #FFB506",
-"e 	c #FFB607",
-"f 	c #FFB708",
-"g 	c #FFB808",
-"h 	c #FFB909",
-"i 	c #FFBA0A",
-"j 	c #FFBB0A",
-"k 	c #FFBC0A",
-"l 	c #FFBD0B",
-"m 	c #FFBE0C",
-"n 	c #FFBF0C",
-"o 	c #FFC00D",
-"p 	c #FFC10E",
-"q 	c #FFC20F",
-"r 	c #FFC30F",
-"s 	c #FFC410",
-"t 	c #FFC511",
-"u 	c #FFC611",
-"v 	c #FFC711",
-"w 	c #FFC812",
-"x 	c #FFC913",
-"y 	c #FFCA13",
-"z 	c #FFCB14",
-"A 	c #FFCC15",
-"B 	c #FFCD15",
-"C 	c #FFCF16",
-"D 	c #FFD017",
-"E 	c #FFD117",
-"F 	c #FFD218",
-"G 	c #FFD319",
-"H 	c #FFD419",
-"I 	c #FFD51A",
-"J 	c #FFD61B",
-"K 	c #FFD71B",
-"L 	c #FFD81C",
-"M 	c #FFD91C",
-"N 	c #FFDA1D",
-"O 	c #FFDB1E",
-"P 	c #FFDC1E",
-"Q 	c #FFDD1F",
-"R 	c #FFDE20",
-"S 	c #FFDF20",
-"T 	c #FFE021",
-"U 	c #FFE222",
-"V 	c #FFE322",
-"W 	c #FFE423",
-"X 	c #FFE524",
-"Y 	c #FFE624",
-"Z 	c #FFE725",
-"` 	c #FFE826",
-" .	c #FFE926",
-"..	c #FFEA26",
-"+.	c #FFEB27",
-"@.	c #FFEC28",
-"#.	c #FFED28",
-"$.	c #FFEE29",
-"%.	c #FFEF2A",
-"&.	c #FFF02A",
-"*.	c #FFF12B",
-"=.	c #FFF22C",
-"-.	c #FFF32D",
-";.	c #FFF42D",
-">.	c #FDF42C",
-",.	c #FBF42C",
-"'.	c #FAF42C",
-").	c #F8F42B",
-"!.	c #F6F42B",
-"~.	c #F4F42B",
-"{.	c #F3F42A",
-"].	c #F1F42A",
-"^.	c #F0F429",
-"/.	c #EEF429",
-"(.	c #ECF429",
-"_.	c #EAF528",
-":.	c #E9F528",
-"<.	c #E7F528",
-"[.	c #E5F527",
-"}.	c #E3F527",
-"|.	c #E2F526",
-"1.	c #E0F526",
-"2.	c #DFF526",
-"3.	c #DDF525",
-"4.	c #DBF525",
-"5.	c #D9F525",
-"6.	c #D8F524",
-"7.	c #D6F624",
-"8.	c #D5F624",
-"9.	c #D3F624",
-"0.	c #D1F623",
-"a.	c #CFF623",
-"b.	c #CEF622",
-"c.	c #CCF622",
-"d.	c #CBF622",
-"e.	c #C9F621",
-"f.	c #C7F621",
-"g.	c #C5F621",
-"h.	c #C4F720",
-"i.	c #C2F720",
-"j.	c #C0F71F",
-"k.	c #BEF71F",
-"l.	c #BDF71F",
-"m.	c #BBF71E",
-"n.	c #BAF71E",
-"o.	c #B8F71E",
-"p.	c #B6F71D",
-"q.	c #B5F71D",
-"r.	c #B3F71D",
-"s.	c #B2F71C",
-"t.	c #B0F81C",
-"u.	c #AEF81B",
-"v.	c #ACF81B",
-"w.	c #ABF81B",
-"x.	c #A9F81A",
-"y.	c #A8F81A",
-"z.	c #A6F81A",
-"A.	c #A4F81A",
-"B.	c #A2F819",
-"C.	c #A1F819",
-"D.	c #9FF819",
-"E.	c #9EF818",
-"F.	c #9BF918",
-"G.	c #9AF917",
-"H.	c #98F917",
-"I.	c #97F917",
-"J.	c #95F916",
-"K.	c #93F916",
-"L.	c #91F916",
-"M.	c #90F915",
-"N.	c #8EF915",
-"O.	c #8DF914",
-"P.	c #8BF914",
-"Q.	c #89FA14",
-"R.	c #87FA13",
-"S.	c #86FA13",
-"T.	c #84FA13",
-"U.	c #83FA12",
-"V.	c #81FA12",
-"W.	c #7FFA12",
-"X.	c #7DFA12",
-"Y.	c #7CFA11",
-"Z.	c #7AFA11",
-"`.	c #78FA10",
-" +	c #76FA10",
-".+	c #75FB10",
-"++	c #73FB0F",
-"@+	c #72FB0F",
-"#+	c #70FB0F",
-"$+	c #6EFB0E",
-"%+	c #6DFB0E",
-"&+	c #6BFB0E",
-"*+	c #6AFB0D",
-"=+	c #68FB0D",
-"-+	c #66FB0C",
-";+	c #64FB0C",
-">+	c #63FB0C",
-",+	c #61FC0B",
-"'+	c #60FC0B",
-")+	c #5EFC0B",
-"!+	c #5CFC0A",
-"~+	c #5AFC0A",
-"{+	c #59FC09",
-"]+	c #57FC09",
-"^+	c #56FC09",
-"/+	c #53FC09",
-"(+	c #52FC08",
-"_+	c #50FC08",
-":+	c #4FFD08",
-"<+	c #4DFD07",
-"[+	c #4BFD07",
-"}+	c #49FD07",
-"|+	c #48FD06",
-"1+	c #46FD06",
-"2+	c #45FD05",
-"3+	c #43FD05",
-"4+	c #41FD05",
-"5+	c #3FFD04",
-"6+	c #3EFD04",
-"7+	c #3CFD04",
-"8+	c #3BFE03",
-"9+	c #39FE03",
-"0+	c #37FE02",
-"a+	c #35FE02",
-"b+	c #34FE02",
-"c+	c #32FE01",
-"d+	c #30FE01",
-"e+	c #2EFE01",
-"f+	c #2DFE00",
-"g+	c #2BFE00",
-". . + + + ",
-". . + + + ",
-"@ @ @ @ @ ",
-"# # # # # ",
-"$ $ $ $ $ ",
-"% % % % % ",
-"& & & & & ",
-"* * * * * ",
-"= = = = = ",
-"- - - - - ",
-"; ; ; ; ; ",
-"> > > > > ",
-", , , , , ",
-"' ' ' ' ' ",
-") ) ) ) ) ",
-"! ! ! ! ! ",
-"~ ~ ~ ~ ~ ",
-"{ { { { { ",
-"] ] ] ] ] ",
-"^ ^ ^ ^ ^ ",
-"/ / / / / ",
-"( ( ( ( ( ",
-"_ _ _ _ _ ",
-": : : : : ",
-": : : : : ",
-"< < < < < ",
-"[ [ [ [ [ ",
-"} } } } } ",
-"} } } } } ",
-"| | | | | ",
-"1 1 1 1 1 ",
-"2 2 2 2 2 ",
-"3 3 3 3 3 ",
-"4 4 4 4 4 ",
-"5 5 5 5 5 ",
-"6 6 6 6 6 ",
-"6 6 6 6 6 ",
-"7 7 7 7 7 ",
-"8 8 8 8 8 ",
-"9 9 9 9 9 ",
-"9 9 9 9 9 ",
-"0 0 0 0 0 ",
-"a a a a a ",
-"a a a a a ",
-"b b b b b ",
-"c c c c c ",
-"d d d d d ",
-"d d d d d ",
-"e e e e e ",
-"f f f f f ",
-"g g g g g ",
-"g g g g g ",
-"h h h h h ",
-"i i i i i ",
-"j j j j j ",
-"k k k k k ",
-"l l l l l ",
-"m m m m m ",
-"n n n n n ",
-"n n n n n ",
-"o o o o o ",
-"p p p p p ",
-"q q q q q ",
-"q q q q q ",
-"r r r r r ",
-"s s s s s ",
-"t t t t t ",
-"u u u u u ",
-"v v v v v ",
-"w w w w w ",
-"x x x x x ",
-"x x x x x ",
-"y y y y y ",
-"z z z z z ",
-"A A A A A ",
-"A A A A A ",
-"B B B B B ",
-"C C C C C ",
-"D D D D D ",
-"D D D D D ",
-"E E E E E ",
-"F F F F F ",
-"G G G G G ",
-"G G G G G ",
-"H H H H H ",
-"I I I I I ",
-"I I I I I ",
-"J J J J J ",
-"K K K K K ",
-"L L L L L ",
-"M M M M M ",
-"N N N N N ",
-"O O O O O ",
-"P P P P P ",
-"P P P P P ",
-"Q Q Q Q Q ",
-"R R R R R ",
-"S S S S S ",
-"S S S S S ",
-"T T T T T ",
-"U U U U U ",
-"V V V V V ",
-"V V V V V ",
-"W W W W W ",
-"X X X X X ",
-"Y Y Y Y Y ",
-"Y Y Y Y Y ",
-"Z Z Z Z Z ",
-"` ` ` ` ` ",
-" . . . . .",
-"..........",
-"+.+.+.+.+.",
-"@. at .@. at .@.",
-"#.#.#.#.#.",
-"#.#.#.#.#.",
-"$.$.$.$.$.",
-"%.%.%.%.%.",
-"&.&.&.&.&.",
-"&.&.&.&.&.",
-"*.*.*.*.*.",
-"=.=.=.=.=.",
-"-.-.-.-.-.",
-";.;.;.;.;.",
-";.;.;.;.;.",
-">.>.>.>.>.",
-",.,.,.,.,.",
-"'.'.'.'.'.",
-").).).).).",
-"!.!.!.!.!.",
-"~.~.~.~.~.",
-"{.{.{.{.{.",
-"].].].].].",
-"^.^.^.^.^.",
-"/././././.",
-"(.(.(.(.(.",
-"_._._._._.",
-":.:.:.:.:.",
-"<.<.<.<.<.",
-"[.[.[.[.[.",
-"}.}.}.}.}.",
-"|.|.|.|.|.",
-"1.1.1.1.1.",
-"2.2.2.2.2.",
-"3.3.3.3.3.",
-"4.4.4.4.4.",
-"5.5.5.5.5.",
-"6.6.6.6.6.",
-"7.7.7.7.7.",
-"8.8.8.8.8.",
-"9.9.9.9.9.",
-"0.0.0.0.0.",
-"a.a.a.a.a.",
-"b.b.b.b.b.",
-"c.c.c.c.c.",
-"d.d.d.d.d.",
-"e.e.e.e.e.",
-"f.f.f.f.f.",
-"g.g.g.g.g.",
-"h.h.h.h.h.",
-"i.i.i.i.i.",
-"j.j.j.j.j.",
-"k.k.k.k.k.",
-"l.l.l.l.l.",
-"m.m.m.m.m.",
-"n.n.n.n.n.",
-"o.o.o.o.o.",
-"p.p.p.p.p.",
-"q.q.q.q.q.",
-"r.r.r.r.r.",
-"s.s.s.s.s.",
-"t.t.t.t.t.",
-"u.u.u.u.u.",
-"v.v.v.v.v.",
-"w.w.w.w.w.",
-"x.x.x.x.x.",
-"y.y.y.y.y.",
-"z.z.z.z.z.",
-"A.A.A.A.A.",
-"B.B.B.B.B.",
-"C.C.C.C.C.",
-"D.D.D.D.D.",
-"E.E.E.E.E.",
-"F.F.F.F.F.",
-"G.G.G.G.G.",
-"H.H.H.H.H.",
-"I.I.I.I.I.",
-"J.J.J.J.J.",
-"K.K.K.K.K.",
-"L.L.L.L.L.",
-"M.M.M.M.M.",
-"N.N.N.N.N.",
-"O.O.O.O.O.",
-"P.P.P.P.P.",
-"Q.Q.Q.Q.Q.",
-"R.R.R.R.R.",
-"S.S.S.S.S.",
-"T.T.T.T.T.",
-"U.U.U.U.U.",
-"V.V.V.V.V.",
-"W.W.W.W.W.",
-"X.X.X.X.X.",
-"Y.Y.Y.Y.Y.",
-"Z.Z.Z.Z.Z.",
-"`.`.`.`.`.",
-" + + + + +",
-".+.+.+.+.+",
-"++++++++++",
-"@+ at +@+ at +@+",
-"#+#+#+#+#+",
-"$+$+$+$+$+",
-"%+%+%+%+%+",
-"&+&+&+&+&+",
-"*+*+*+*+*+",
-"=+=+=+=+=+",
-"-+-+-+-+-+",
-";+;+;+;+;+",
-">+>+>+>+>+",
-",+,+,+,+,+",
-"'+'+'+'+'+",
-")+)+)+)+)+",
-"!+!+!+!+!+",
-"~+~+~+~+~+",
-"{+{+{+{+{+",
-"]+]+]+]+]+",
-"^+^+^+^+^+",
-"/+/+/+/+/+",
-"(+(+(+(+(+",
-"_+_+_+_+_+",
-":+:+:+:+:+",
-"<+<+<+<+<+",
-"[+[+[+[+[+",
-"}+}+}+}+}+",
-"|+|+|+|+|+",
-"1+1+1+1+1+",
-"2+2+2+2+2+",
-"3+3+3+3+3+",
-"4+4+4+4+4+",
-"5+5+5+5+5+",
-"6+6+6+6+6+",
-"7+7+7+7+7+",
-"8+8+8+8+8+",
-"9+9+9+9+9+",
-"0+0+0+0+0+",
-"a+a+a+a+a+",
-"b+b+b+b+b+",
-"c+c+c+c+c+",
-"d+d+d+d+d+",
-"e+e+e+e+e+",
-"f+f+f+f+f+",
-"g+g+g+g+g+"};
diff --git a/gtk2_ardour/pixmaps/vslider00.xpm b/gtk2_ardour/pixmaps/vslider00.xpm
deleted file mode 100644
index 2a3687b..0000000
--- a/gtk2_ardour/pixmaps/vslider00.xpm
+++ /dev/null
@@ -1,197 +0,0 @@
-/* XPM */
-static char * vslider00_xpm[] = {
-"16 32 162 2",
-"  	c None",
-". 	c #7B7B7B",
-"+ 	c #6C6C6C",
-"@ 	c #626262",
-"# 	c #585858",
-"$ 	c #505050",
-"% 	c #4B4B4B",
-"& 	c #494949",
-"* 	c #8C8C8C",
-"= 	c #8E8E8E",
-"- 	c #858585",
-"; 	c #787878",
-"> 	c #6D6D6D",
-", 	c #666666",
-"' 	c #616161",
-") 	c #5C5C5C",
-"! 	c #5B5B5B",
-"~ 	c #595959",
-"{ 	c #555555",
-"] 	c #959595",
-"^ 	c #ACACAC",
-"/ 	c #A0A0A0",
-"( 	c #949494",
-"_ 	c #8D8D8D",
-": 	c #888888",
-"< 	c #848484",
-"[ 	c #7E7E7E",
-"} 	c #7C7C7C",
-"| 	c #7A7A7A",
-"1 	c #797979",
-"2 	c #757575",
-"3 	c #676767",
-"4 	c #474747",
-"5 	c #9C9C9C",
-"6 	c #C2C2C2",
-"7 	c #BDBDBD",
-"8 	c #B9B9B9",
-"9 	c #B4B4B4",
-"0 	c #B1B1B1",
-"a 	c #AEAEAE",
-"b 	c #ABABAB",
-"c 	c #A8A8A8",
-"d 	c #A6A6A6",
-"e 	c #A5A5A5",
-"f 	c #A4A4A4",
-"g 	c #9A9A9A",
-"h 	c #323232",
-"i 	c #9F9F9F",
-"j 	c #D6D6D6",
-"k 	c #D2D2D2",
-"l 	c #D3D3D3",
-"m 	c #D4D4D4",
-"n 	c #D5D5D5",
-"o 	c #D1D1D1",
-"p 	c #232323",
-"q 	c #DFDFDF",
-"r 	c #DBDBDB",
-"s 	c #E0E0E0",
-"t 	c #E4E4E4",
-"u 	c #E6E6E6",
-"v 	c #E2E2E2",
-"w 	c #DDDDDD",
-"x 	c #D8D8D8",
-"y 	c #AAAAAA",
-"z 	c #777777",
-"A 	c #1A1A1A",
-"B 	c #F3F3F3",
-"C 	c #D7D7D7",
-"D 	c #D9D9D9",
-"E 	c #CDCDCD",
-"F 	c #737373",
-"G 	c #151515",
-"H 	c #F2F2F2",
-"I 	c #DADADA",
-"J 	c #D0D0D0",
-"K 	c #CFCFCF",
-"L 	c #CBCBCB",
-"M 	c #C3C3C3",
-"N 	c #999999",
-"O 	c #131313",
-"P 	c #F1F1F1",
-"Q 	c #CACACA",
-"R 	c #C6C6C6",
-"S 	c #C1C1C1",
-"T 	c #BBBBBB",
-"U 	c #B8B8B8",
-"V 	c #B3B3B3",
-"W 	c #707070",
-"X 	c #111111",
-"Y 	c #F0F0F0",
-"Z 	c #BCBCBC",
-"` 	c #B6B6B6",
-" .	c #AFAFAF",
-"..	c #929292",
-"+.	c #828282",
-"@.	c #6B6B6B",
-"#.	c #101010",
-"$.	c #CECECE",
-"%.	c #C8C8C8",
-"&.	c #BEBEBE",
-"*.	c #A3A3A3",
-"=.	c #9B9B9B",
-"-.	c #919191",
-";.	c #7F7F7F",
-">.	c #0F0F0F",
-",.	c #EDEDED",
-"'.	c #CCCCCC",
-").	c #C5C5C5",
-"!.	c #C0C0C0",
-"~.	c #BABABA",
-"{.	c #A1A1A1",
-"].	c #B5B5B5",
-"^.	c #A2A2A2",
-"/.	c #9E9E9E",
-"(.	c #979797",
-"_.	c #C7C7C7",
-":.	c #C4C4C4",
-"<.	c #C9C9C9",
-"[.	c #8A8A8A",
-"}.	c #989898",
-"|.	c #7D7D7D",
-"1.	c #747474",
-"2.	c #6F6F6F",
-"3.	c #0B0B0B",
-"4.	c #868686",
-"5.	c #2C2C2C",
-"6.	c #0E0E0E",
-"7.	c #0D0D0D",
-"8.	c #0C0C0C",
-"9.	c #090909",
-"0.	c #010101",
-"a.	c #878787",
-"b.	c #353535",
-"c.	c #141414",
-"d.	c #020202",
-"e.	c #8F8F8F",
-"f.	c #8B8B8B",
-"g.	c #838383",
-"h.	c #606060",
-"i.	c #E3E3E3",
-"j.	c #727272",
-"k.	c #A7A7A7",
-"l.	c #DEDEDE",
-"m.	c #BFBFBF",
-"n.	c #B0B0B0",
-"o.	c #6A6A6A",
-"p.	c #F4F4F4",
-"q.	c #B7B7B7",
-"r.	c #696969",
-"s.	c #B2B2B2",
-"t.	c #6E6E6E",
-"u.	c #A9A9A9",
-"v.	c #909090",
-"w.	c #ADADAD",
-"x.	c #646464",
-"y.	c #656565",
-"z.	c #5A5A5A",
-"A.	c #545454",
-"B.	c #484848",
-"C.	c #404040",
-"D.	c #3E3E3E",
-"E.	c #0A0A0A",
-"  . + @ # $ % % % % % % % % &   ",
-"* = - ; > , ' ) ) ! ! ! ! ~ { ~ ",
-"] ^ / ( _ : < [ } . | | 1 2 3 4 ",
-"5 6 7 8 9 0 a b c d e e f g 2 h ",
-"i j k k l m n n n n m m o 9 } p ",
-"/ q r s t u u u v w r x m y z A ",
-"e B C j x x x x D D n o E / F G ",
-"e H j I r D j m k J K L M N F O ",
-"e P o o K Q R S 7 T U V d * W X ",
-"e Y K E Q R S Z `  .c / ..+. at .#.",
-"e P $.L %.M &.U 0 y *.=.-.;., >.",
-"f ,.'.).!.~.9 a c {.=.( * < W #.",
-"{.s E &.]. .y c e ^.i /.(.+.+ #.",
-"*.u L _.%.M :.:.R <._.S V [. at .#.",
-"}./.+.|.;.. | ; z z 1.2.3 # 4 3.",
-"4.5.#.#.#.>.>.>.6.6.6.7.8.3.9.0.",
-"a.b.c.c.c.c.c.c.c.c.c.c.c.c.6.d.",
-"}.*.e.e.e.e.= _ _ * f.[.: g.h.7.",
-"*.i._.)._._.:.6 S &.T ` y ] j.#.",
-"/ w %.].` ` ].9 9 V 0  .k._ @.#.",
-"/ l.K ).M 6 S !.!.m.&.~.n.= o.#.",
-"e P m J E E L Q Q <._.6 ` -.3 >.",
-"e p.D J '.'.L Q <.%.).6 q.] r.>.",
-"e B J T s.0 0 s.V s.s. .f - 3 >.",
-"e H l E %.R R %.<.<.%.S s._ @.#.",
-"e B C k K E '.L L '.'._.T =.t.>.",
-"e B %.` ]. .b u.c k.k.k.e v.r.>.",
-"e Y Q S ~.` s. .w.^ ^ b ^.- o.#.",
-"^.w ~.0 ^ k.^./.=.N }.}.e.2 x.>.",
-"( /.- 1 t.r.3 y.y.x.x.x.' # z.>.",
-"~ 3 A.B.C.D.D.D.D.D.D.D.D.D.% 7.",
-"  c.8.E.9.9.9.9.9.9.9.9.9.9.3.d."};
diff --git a/gtk2_ardour/pixmaps/vslider01.xpm b/gtk2_ardour/pixmaps/vslider01.xpm
deleted file mode 100644
index 4afc6d1..0000000
--- a/gtk2_ardour/pixmaps/vslider01.xpm
+++ /dev/null
@@ -1,206 +0,0 @@
-/* XPM */
-static char * vslider01_xpm[] = {
-"3 200 3 1",
-" 	c None",
-".	c #000000",
-"+	c #969393",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+",
-"..+"};
diff --git a/gtk2_ardour/pixmaps/vslider02_rail.xpm b/gtk2_ardour/pixmaps/vslider02_rail.xpm
deleted file mode 100644
index 6a55001..0000000
--- a/gtk2_ardour/pixmaps/vslider02_rail.xpm
+++ /dev/null
@@ -1,207 +0,0 @@
-/* XPM */
-static char * vslider_rail_xpm[] = {
-"3 200 4 1",
-" 	c None",
-".	c #000000",
-",  c #424242",
-"+	c #969393",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+",
-".,+"};
diff --git a/gtk2_ardour/pixmaps/vslider02_slider.xpm b/gtk2_ardour/pixmaps/vslider02_slider.xpm
deleted file mode 100644
index b84b00d..0000000
--- a/gtk2_ardour/pixmaps/vslider02_slider.xpm
+++ /dev/null
@@ -1,211 +0,0 @@
-/* XPM */
-static char * vslider02_slider_xpm[] = {
-"15 32 176 2",
-"  	c None",
-". 	c #999991",
-"+ 	c #A1A198",
-"@ 	c #A0A097",
-"# 	c #9E9E95",
-"$ 	c #9D9D94",
-"% 	c #9C9C93",
-"& 	c #9A9A92",
-"* 	c #999990",
-"= 	c #98988F",
-"- 	c #96968E",
-"; 	c #95958D",
-"> 	c #94948B",
-", 	c #93938A",
-"' 	c #919189",
-") 	c #575751",
-"! 	c #97978F",
-"~ 	c #A3A39A",
-"{ 	c #A0A098",
-"] 	c #9F9F96",
-"^ 	c #989890",
-"/ 	c #81817A",
-"( 	c #3D3D39",
-"_ 	c #94948C",
-": 	c #B0B0A8",
-"< 	c #C8C8C1",
-"[ 	c #C7C7C1",
-"} 	c #C7C7C0",
-"| 	c #C6C6C0",
-"1 	c #C6C6BF",
-"2 	c #C5C5BF",
-"3 	c #C5C5BE",
-"4 	c #C4C4BD",
-"5 	c #71716C",
-"6 	c #3C3C38",
-"7 	c #93938B",
-"8 	c #8F8F87",
-"9 	c #858580",
-"0 	c #85857F",
-"a 	c #84847F",
-"b 	c #5C5C58",
-"c 	c #3C3C39",
-"d 	c #878781",
-"e 	c #878782",
-"f 	c #5A5A56",
-"g 	c #3D3D3A",
-"h 	c #94948F",
-"i 	c #5B5B57",
-"j 	c #3E3E3A",
-"k 	c #9F9F9A",
-"l 	c #A0A09A",
-"m 	c #5C5C57",
-"n 	c #3E3E3B",
-"o 	c #92928A",
-"p 	c #9B9B93",
-"q 	c #AAAAA4",
-"r 	c #AAAAA5",
-"s 	c #3F3F3B",
-"t 	c #B3B3AD",
-"u 	c #B2B2AD",
-"v 	c #B2B2AC",
-"w 	c #3F3F3C",
-"x 	c #929289",
-"y 	c #9D9D95",
-"z 	c #BABAB3",
-"A 	c #BABAB4",
-"B 	c #B9B9B3",
-"C 	c #B8B8B2",
-"D 	c #40403C",
-"E 	c #9E9E96",
-"F 	c #C0C0BA",
-"G 	c #C0C0B9",
-"H 	c #BFBFB9",
-"I 	c #BFBFB8",
-"J 	c #BEBEB8",
-"K 	c #40403D",
-"L 	c #909088",
-"M 	c #C4C4BE",
-"N 	c #C3C3BD",
-"O 	c #C3C3BC",
-"P 	c #C2C2BC",
-"Q 	c #5B5B56",
-"R 	c #41413D",
-"S 	c #878780",
-"T 	c #A1A19C",
-"U 	c #A1A19D",
-"V 	c #A0A09B",
-"W 	c #4B4B47",
-"X 	c #8E8E86",
-"Y 	c #434340",
-"Z 	c #323232",
-"` 	c #333333",
-" .	c #1D1D1C",
-"..	c #8D8D85",
-"+.	c #8C8C84",
-"@.	c #A7A7A2",
-"#.	c #A6A6A1",
-"$.	c #A6A6A0",
-"%.	c #A5A5A0",
-"&.	c #8B8B83",
-"*.	c #D1D1CA",
-"=.	c #D0D0C9",
-"-.	c #CFCFC9",
-";.	c #CFCFC8",
-">.	c #CECEC7",
-",.	c #8A8A82",
-"'.	c #D2D2CB",
-").	c #D2D2CA",
-"!.	c #898981",
-"~.	c #9F9F97",
-"{.	c #D0D0C8",
-"].	c #5D5D59",
-"^.	c #D1D1C9",
-"/.	c #CFCFC7",
-"(.	c #5F5F5A",
-"_.	c #86867F",
-":.	c #CECEC6",
-"<.	c #CDCDC6",
-"[.	c #CDCDC5",
-"}.	c #60605B",
-"|.	c #85857D",
-"1.	c #A1A199",
-"2.	c #CCCCC5",
-"3.	c #CCCCC4",
-"4.	c #CBCBC4",
-"5.	c #CBCBC3",
-"6.	c #CACAC3",
-"7.	c #62625D",
-"8.	c #83837C",
-"9.	c #CACAC2",
-"0.	c #C9C9C1",
-"a.	c #C8C8C0",
-"b.	c #C7C7BF",
-"c.	c #64645F",
-"d.	c #82827B",
-"e.	c #A4A49B",
-"f.	c #C5C5BD",
-"g.	c #C4C4BC",
-"h.	c #C3C3BB",
-"i.	c #C2C2BA",
-"j.	c #C1C1B9",
-"k.	c #C0C0B8",
-"l.	c #656560",
-"m.	c #818179",
-"n.	c #A5A59D",
-"o.	c #BDBDB5",
-"p.	c #BDBDB4",
-"q.	c #BCBCB4",
-"r.	c #BBBBB3",
-"s.	c #BABAB2",
-"t.	c #B9B9B1",
-"u.	c #B8B8B0",
-"v.	c #666661",
-"w.	c #7F7F78",
-"x.	c #B6B6AE",
-"y.	c #B6B6AD",
-"z.	c #B5B5AD",
-"A.	c #B5B5AC",
-"B.	c #B4B4AC",
-"C.	c #B3B3AB",
-"D.	c #B2B2AB",
-"E.	c #B2B2AA",
-"F.	c #B1B1A9",
-"G.	c #696964",
-"H.	c #7D7D76",
-"I.	c #BEBEB7",
-"J.	c #BDBDB7",
-"K.	c #6E6E6A",
-"L.	c #7B7B74",
-"M.	c #60605A",
-"N.	c #50504B",
-"O.	c #4D4D49",
-"P.	c #6B6B65",
-"Q.	c #484844",
-"R.	c #454541",
-"S.	c #42423E",
-". + @ # $ % & * = - ; > , ' ) ",
-"! ~ { ] # $ % & . ^ ! - ; / ( ",
-"_ : < < [ } } | 1 1 2 3 4 5 6 ",
-"7 8 9 9 9 9 9 9 9 0 0 0 a b c ",
-"7 8 d e e e e e e e e e d f g ",
-"7 ; h h h h h h h h h h h i j ",
-"7 ^ k k l l l l l l k k k m n ",
-"o p q r r r r r r r q q q m s ",
-"o $ t t t t t t t u v v v m w ",
-"x y z A A A A B B B B C C i D ",
-"' E F F F F F F G H H I J i K ",
-"L E M M M M M 4 4 N N O P Q R ",
-"8 E [ [ [ [ [ } } | | 1 2 f R ",
-"8 S T U U U T T T T V V V W R ",
-"X Y Z Z Z Z ` ` Z Z Z Z Z  .R ",
-"..Y Z ` ` ` ` ` ` ` ` Z Z  .R ",
-"+.S @. at .@. at .#.#.#.#.$.%.%.W R ",
-"&.E *.*.*.*.=.=.=.-.;.;.>.i R ",
-",.] '.'.'.).*.*.*.=.=.;.;.b R ",
-"!.~.'.'.'.'.).*.*.=.=.{.;.].K ",
-"S @ ).*.*.*.*.^.=.{.;./.>.(.D ",
-"_.+ {.{.{.{.;././.>.:.<.[.}.w ",
-"|.1.:.:.:.<.[.[.2.3.4.5.6.7.s ",
-"8.~ 6.9.9.9.0.0.< a.} b.1 c.n ",
-"d.e.f.g.g.g.h.h.i.i.j.j.k.l.j ",
-"m.n.o.p.q.q.r.r.s.s.t.t.u.v.g ",
-"w.e.x.x.y.z.A.B.C.C.D.E.F.G.c ",
-"H.. J J J J J J J J I.J.J.K.6 ",
-"L.M.N.N.N.N.N.N.N.N.N.N.N.O.6 ",
-"P.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.D ",
-"O.R.R.R.R.R.R.R.R.R.R.R.R.R.S.",
-"O.R.R.R.R.R.R.R.R.R.R.R.R.R.S."};
diff --git a/gtk2_ardour/pixmaps/vslider_slider_16wide.xpm b/gtk2_ardour/pixmaps/vslider_slider_16wide.xpm
deleted file mode 100644
index 6562442..0000000
--- a/gtk2_ardour/pixmaps/vslider_slider_16wide.xpm
+++ /dev/null
@@ -1,211 +0,0 @@
-/* XPM */
-static const char * vslider_slider_xpm_16wide[] = {
-"16 32 176 2",
-"  	c None",
-". 	c #999991",
-"+ 	c #A1A198",
-"@ 	c #A0A097",
-"# 	c #9E9E95",
-"$ 	c #9D9D94",
-"% 	c #9C9C93",
-"& 	c #9A9A92",
-"* 	c #999990",
-"= 	c #98988F",
-"- 	c #96968E",
-"; 	c #95958D",
-"> 	c #94948B",
-", 	c #93938A",
-"' 	c #919189",
-") 	c #575751",
-"! 	c #97978F",
-"~ 	c #A3A39A",
-"{ 	c #A0A098",
-"] 	c #9F9F96",
-"^ 	c #989890",
-"/ 	c #81817A",
-"( 	c #3D3D39",
-"_ 	c #94948C",
-": 	c #B0B0A8",
-"< 	c #C8C8C1",
-"[ 	c #C7C7C1",
-"} 	c #C7C7C0",
-"| 	c #C6C6C0",
-"1 	c #C6C6BF",
-"2 	c #C5C5BF",
-"3 	c #C5C5BE",
-"4 	c #C4C4BD",
-"5 	c #71716C",
-"6 	c #3C3C38",
-"7 	c #93938B",
-"8 	c #8F8F87",
-"9 	c #858580",
-"0 	c #85857F",
-"a 	c #84847F",
-"b 	c #5C5C58",
-"c 	c #3C3C39",
-"d 	c #878781",
-"e 	c #878782",
-"f 	c #5A5A56",
-"g 	c #3D3D3A",
-"h 	c #94948F",
-"i 	c #5B5B57",
-"j 	c #3E3E3A",
-"k 	c #9F9F9A",
-"l 	c #A0A09A",
-"m 	c #5C5C57",
-"n 	c #3E3E3B",
-"o 	c #92928A",
-"p 	c #9B9B93",
-"q 	c #AAAAA4",
-"r 	c #AAAAA5",
-"s 	c #3F3F3B",
-"t 	c #B3B3AD",
-"u 	c #B2B2AD",
-"v 	c #B2B2AC",
-"w 	c #3F3F3C",
-"x 	c #929289",
-"y 	c #9D9D95",
-"z 	c #BABAB3",
-"A 	c #BABAB4",
-"B 	c #B9B9B3",
-"C 	c #B8B8B2",
-"D 	c #40403C",
-"E 	c #9E9E96",
-"F 	c #C0C0BA",
-"G 	c #C0C0B9",
-"H 	c #BFBFB9",
-"I 	c #BFBFB8",
-"J 	c #BEBEB8",
-"K 	c #40403D",
-"L 	c #909088",
-"M 	c #C4C4BE",
-"N 	c #C3C3BD",
-"O 	c #C3C3BC",
-"P 	c #C2C2BC",
-"Q 	c #5B5B56",
-"R 	c #41413D",
-"S 	c #878780",
-"T 	c #A1A19C",
-"U 	c #A1A19D",
-"V 	c #A0A09B",
-"W 	c #4B4B47",
-"X 	c #8E8E86",
-"Y 	c #434340",
-"Z 	c #323232",
-"` 	c #333333",
-" .	c #1D1D1C",
-"..	c #8D8D85",
-"+.	c #8C8C84",
-"@.	c #A7A7A2",
-"#.	c #A6A6A1",
-"$.	c #A6A6A0",
-"%.	c #A5A5A0",
-"&.	c #8B8B83",
-"*.	c #D1D1CA",
-"=.	c #D0D0C9",
-"-.	c #CFCFC9",
-";.	c #CFCFC8",
-">.	c #CECEC7",
-",.	c #8A8A82",
-"'.	c #D2D2CB",
-").	c #D2D2CA",
-"!.	c #898981",
-"~.	c #9F9F97",
-"{.	c #D0D0C8",
-"].	c #5D5D59",
-"^.	c #D1D1C9",
-"/.	c #CFCFC7",
-"(.	c #5F5F5A",
-"_.	c #86867F",
-":.	c #CECEC6",
-"<.	c #CDCDC6",
-"[.	c #CDCDC5",
-"}.	c #60605B",
-"|.	c #85857D",
-"1.	c #A1A199",
-"2.	c #CCCCC5",
-"3.	c #CCCCC4",
-"4.	c #CBCBC4",
-"5.	c #CBCBC3",
-"6.	c #CACAC3",
-"7.	c #62625D",
-"8.	c #83837C",
-"9.	c #CACAC2",
-"0.	c #C9C9C1",
-"a.	c #C8C8C0",
-"b.	c #C7C7BF",
-"c.	c #64645F",
-"d.	c #82827B",
-"e.	c #A4A49B",
-"f.	c #C5C5BD",
-"g.	c #C4C4BC",
-"h.	c #C3C3BB",
-"i.	c #C2C2BA",
-"j.	c #C1C1B9",
-"k.	c #C0C0B8",
-"l.	c #656560",
-"m.	c #818179",
-"n.	c #A5A59D",
-"o.	c #BDBDB5",
-"p.	c #BDBDB4",
-"q.	c #BCBCB4",
-"r.	c #BBBBB3",
-"s.	c #BABAB2",
-"t.	c #B9B9B1",
-"u.	c #B8B8B0",
-"v.	c #666661",
-"w.	c #7F7F78",
-"x.	c #B6B6AE",
-"y.	c #B6B6AD",
-"z.	c #B5B5AD",
-"A.	c #B5B5AC",
-"B.	c #B4B4AC",
-"C.	c #B3B3AB",
-"D.	c #B2B2AB",
-"E.	c #B2B2AA",
-"F.	c #B1B1A9",
-"G.	c #696964",
-"H.	c #7D7D76",
-"I.	c #BEBEB7",
-"J.	c #BDBDB7",
-"K.	c #6E6E6A",
-"L.	c #7B7B74",
-"M.	c #60605A",
-"N.	c #50504B",
-"O.	c #4D4D49",
-"P.	c #6B6B65",
-"Q.	c #484844",
-"R.	c #454541",
-"S.	c #42423E",
-". + @ # $ % & * * = - ; > , ' ) ",
-"! ~ { ] # $ % & & . ^ ! - ; / ( ",
-"_ : < < [ } } | | 1 1 2 3 4 5 6 ",
-"7 8 9 9 9 9 9 9 9 9 0 0 0 a b c ",
-"7 8 d e e e e e e e e e e d f g ",
-"7 ; h h h h h h h h h h h h i j ",
-"7 ^ k k l l l l l l l k k k m n ",
-"o p q r r r r r r r r q q q m s ",
-"o $ t t t t t t t t u v v v m w ",
-"x y z A A A A B B B B B C C i D ",
-"' E F F F F F F F G H H I J i K ",
-"L E M M M M M 4 4 4 N N O P Q R ",
-"8 E [ [ [ [ [ } } } | | 1 2 f R ",
-"8 S T U U U T T T T T V V V W R ",
-"X Y Z Z Z Z ` ` ` Z Z Z Z Z  .R ",
-"..Y Z ` ` ` ` ` ` ` ` ` Z Z  .R ",
-"+.S @. at .@. at .#.#.#.#.#.$.%.%.W R ",
-"&.E *.*.*.*.=.=.=.=.-.;.;.>.i R ",
-",.] '.'.'.).*.*.*.*.=.=.;.;.b R ",
-"!.~.'.'.'.'.).*.*.*.=.=.{.;.].K ",
-"S @ ).*.*.*.*.^.^.=.{.;./.>.(.D ",
-"_.+ {.{.{.{.;./././.>.:.<.[.}.w ",
-"|.1.:.:.:.<.[.[.[.2.3.4.5.6.7.s ",
-"8.~ 6.9.9.9.0.0.0.< a.} b.1 c.n ",
-"d.e.f.g.g.g.h.h.h.i.i.j.j.k.l.j ",
-"m.n.o.p.q.q.r.r.r.s.s.t.t.u.v.g ",
-"w.e.x.x.y.z.A.B.B.C.C.D.E.F.G.c ",
-"H.. J J J J J J J J J I.J.J.K.6 ",
-"L.M.N.N.N.N.N.N.N.N.N.N.N.N.O.6 ",
-"P.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.D ",
-"O.R.R.R.R.R.R.R.R.R.R.R.R.R.R.S.",
-"O.R.R.R.R.R.R.R.R.R.R.R.R.R.R.S."};
diff --git a/gtk2_ardour/pixmaps/zoom_full.xpm b/gtk2_ardour/pixmaps/zoom_full.xpm
deleted file mode 100644
index 5564074..0000000
--- a/gtk2_ardour/pixmaps/zoom_full.xpm
+++ /dev/null
@@ -1,30 +0,0 @@
-/* XPM */
-static char * zoom_full_xpm[] = {
-"12 12 15 1",
-" 	c None",
-".	c #000000",
-"+	c #474747",
-"@	c #E7E7E7",
-"#	c #F6F6F6",
-"$	c #DCDCDC",
-"%	c #ACACAC",
-"&	c #FFFFFF",
-"*	c #DFDFDF",
-"=	c #D7D7D7",
-"-	c #D6D6D6",
-";	c #040404",
-">	c #070707",
-",	c #060606",
-"'	c #050505",
-"   ...      ",
-" +.@#$.+    ",
-" .%&&&%.    ",
-".*..&..=.   ",
-".#.&&&.#.   ",
-".$..&..*.   ",
-" .%&&&%.+   ",
-" +.=#-...   ",
-"   ...+...  ",
-"        ;.> ",
-"         ,.;",
-"          '."};
diff --git a/gtk2_ardour/pixmaps/zoom_in.xpm b/gtk2_ardour/pixmaps/zoom_in.xpm
deleted file mode 100644
index 1f8d4e8..0000000
--- a/gtk2_ardour/pixmaps/zoom_in.xpm
+++ /dev/null
@@ -1,29 +0,0 @@
-/* XPM */
-static char * zoom_in_xpm[] = {
-"12 12 14 1",
-" 	c None",
-".	c #000000",
-"+	c #474747",
-"@	c #E7E7E7",
-"#	c #F6F6F6",
-"$	c #DCDCDC",
-"%	c #FFFFFF",
-"&	c #DFDFDF",
-"*	c #D7D7D7",
-"=	c #D6D6D6",
-"-	c #040404",
-";	c #070707",
-">	c #060606",
-",	c #050505",
-"   ...      ",
-" +.@#$.+    ",
-" .%%.%%.    ",
-".&%%.%%*.   ",
-".#.....#.   ",
-".$%%.%%&.   ",
-" .%%.%%.+   ",
-" +.*#=...   ",
-"   ...+...  ",
-"        -.; ",
-"         >.-",
-"          ,."};
diff --git a/gtk2_ardour/pixmaps/zoom_out.xpm b/gtk2_ardour/pixmaps/zoom_out.xpm
deleted file mode 100644
index ea50d14..0000000
--- a/gtk2_ardour/pixmaps/zoom_out.xpm
+++ /dev/null
@@ -1,29 +0,0 @@
-/* XPM */
-static char * zoom_out_xpm[] = {
-"12 12 14 1",
-" 	c None",
-".	c #000000",
-"+	c #474747",
-"@	c #E7E7E7",
-"#	c #F6F6F6",
-"$	c #DCDCDC",
-"%	c #FFFFFF",
-"&	c #DFDFDF",
-"*	c #D7D7D7",
-"=	c #D6D6D6",
-"-	c #040404",
-";	c #070707",
-">	c #060606",
-",	c #050505",
-"   ...      ",
-" +.@#$.+    ",
-" .%%%%%.    ",
-".&%%%%%*.   ",
-".#.....#.   ",
-".$%%%%%&.   ",
-" .%%%%%.+   ",
-" +.*#=...   ",
-"   ...+...  ",
-"        -.; ",
-"         >.-",
-"          ,."};
diff --git a/gtk2_ardour/playlist_selector.cc b/gtk2_ardour/playlist_selector.cc
index 35a64f3..cc92d5d 100644
--- a/gtk2_ardour/playlist_selector.cc
+++ b/gtk2_ardour/playlist_selector.cc
@@ -31,7 +31,7 @@
 #include "route_ui.h"
 #include "gui_thread.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace Gtk;
diff --git a/gtk2_ardour/plugin_eq_gui.cc b/gtk2_ardour/plugin_eq_gui.cc
index 1fa5d2d..069f373 100644
--- a/gtk2_ardour/plugin_eq_gui.cc
+++ b/gtk2_ardour/plugin_eq_gui.cc
@@ -18,8 +18,11 @@
 
 */
 
+#include <algorithm>
 #include <math.h>
+#include <iomanip>
 #include <iostream>
+#include <sstream>
 
 #ifdef COMPILER_MSVC
 #include <float.h>
@@ -46,7 +49,7 @@
 #include "ardour_ui.h"
 #include "gui_thread.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 
@@ -54,6 +57,8 @@ PluginEqGui::PluginEqGui(boost::shared_ptr<ARDOUR::PluginInsert> pluginInsert)
 	: _min_dB(-12.0)
 	, _max_dB(+12.0)
 	, _step_dB(3.0)
+	, _buffer_size(0)
+	, _signal_buffer_size(0)
 	, _impulse_fft(0)
 	, _signal_input_fft(0)
 	, _signal_output_fft(0)
@@ -73,8 +78,13 @@ PluginEqGui::PluginEqGui(boost::shared_ptr<ARDOUR::PluginInsert> pluginInsert)
 	_analysis_height = 256.0;
 	_analysis_area->set_size_request(_analysis_width, _analysis_height);
 
+	_analysis_area->add_events(Gdk::POINTER_MOTION_MASK | Gdk::LEAVE_NOTIFY_MASK | Gdk::BUTTON_PRESS_MASK);
+
 	_analysis_area->signal_expose_event().connect( sigc::mem_fun (*this, &PluginEqGui::expose_analysis_area));
 	_analysis_area->signal_size_allocate().connect( sigc::mem_fun (*this, &PluginEqGui::resize_analysis_area));
+	_analysis_area->signal_motion_notify_event().connect( sigc::mem_fun (*this, &PluginEqGui::analysis_area_mouseover));
+	_analysis_area->signal_leave_notify_event().connect( sigc::mem_fun (*this, &PluginEqGui::analysis_area_mouseexit));
+	_analysis_area->signal_button_press_event().connect( sigc::mem_fun (*this, &PluginEqGui::analysis_area_mousedown));
 
 	// dB selection
 	dBScaleModel = Gtk::ListStore::create(dBColumns);
@@ -115,10 +125,16 @@ PluginEqGui::PluginEqGui(boost::shared_ptr<ARDOUR::PluginInsert> pluginInsert)
 	_phase_button->set_active(true);
 	_phase_button->signal_toggled().connect( sigc::mem_fun(*this, &PluginEqGui::redraw_scales));
 
+	// Freq/dB info for mouse over
+	_pointer_info = new Gtk::Label ("", 1, 0.5);
+	_pointer_info->set_size_request(_analysis_width / 4, -1);
+	_pointer_info->set_name("PluginAnalysisInfoLabel");
+
 	// populate table
-	attach( *manage(_analysis_area), 1, 3, 1, 2);
+	attach( *manage(_analysis_area), 1, 4, 1, 2);
 	attach( *manage(dBSelectBin),    1, 2, 2, 3, Gtk::SHRINK, Gtk::SHRINK);
-	attach( *manage(_phase_button),	 2, 3, 2, 3, Gtk::SHRINK, Gtk::SHRINK);
+	attach( *manage(_phase_button),  2, 3, 2, 3, Gtk::SHRINK, Gtk::SHRINK);
+	attach( *manage(_pointer_info),  3, 4, 2, 3, Gtk::FILL, Gtk::SHRINK);
 }
 
 PluginEqGui::~PluginEqGui()
@@ -239,9 +255,9 @@ PluginEqGui::set_buffer_size(uint32_t size, uint32_t signal_size)
 		return;
 	}
 
-        GTKArdour::FFT *tmp1 = _impulse_fft;
-        GTKArdour::FFT *tmp2 = _signal_input_fft;
-        GTKArdour::FFT *tmp3 = _signal_output_fft;
+	GTKArdour::FFT *tmp1 = _impulse_fft;
+	GTKArdour::FFT *tmp2 = _signal_input_fft;
+	GTKArdour::FFT *tmp3 = _signal_output_fft;
 
 	try {
 		_impulse_fft       = new GTKArdour::FFT(size);
@@ -262,15 +278,17 @@ PluginEqGui::set_buffer_size(uint32_t size, uint32_t signal_size)
 	_buffer_size = size;
 	_signal_buffer_size = signal_size;
 
-	ARDOUR::ChanCount count = ARDOUR::ChanCount::max (_plugin->get_info()->n_inputs, _plugin->get_info()->n_outputs);
+	// allocate separate in+out buffers, VST cannot process in-place
+	ARDOUR::ChanCount acount (_plugin->get_info()->n_inputs + _plugin->get_info()->n_outputs);
+	ARDOUR::ChanCount ccount = ARDOUR::ChanCount::max (_plugin->get_info()->n_inputs, _plugin->get_info()->n_outputs);
 
 	for (ARDOUR::DataType::iterator i = ARDOUR::DataType::begin(); i != ARDOUR::DataType::end(); ++i) {
-		_bufferset.ensure_buffers (*i, count.get (*i), _buffer_size);
-		_collect_bufferset.ensure_buffers (*i, count.get (*i), _buffer_size);
+		_bufferset.ensure_buffers (*i, acount.get (*i), _buffer_size);
+		_collect_bufferset.ensure_buffers (*i, ccount.get (*i), _buffer_size);
 	}
 
-	_bufferset.set_count (count);
-	_collect_bufferset.set_count (count);
+	_bufferset.set_count (acount);
+	_collect_bufferset.set_count (ccount);
 }
 
 void
@@ -283,6 +301,8 @@ PluginEqGui::resize_analysis_area (Gtk::Allocation& size)
 		cairo_surface_destroy (_analysis_scale_surface);
 		_analysis_scale_surface = 0;
 	}
+
+	_pointer_info->set_size_request(_analysis_width / 4, -1);
 }
 
 bool
@@ -300,7 +320,7 @@ PluginEqGui::timeout_callback()
 void
 PluginEqGui::signal_collect_callback(ARDOUR::BufferSet *in, ARDOUR::BufferSet *out)
 {
-	ENSURE_GUI_THREAD (*this, &PluginEqGui::signal_collect_callback, in, out)
+	ENSURE_GUI_THREAD (*this, &PluginEqGui::signal_collect_callback, in, out);
 
 	_signal_input_fft ->reset();
 	_signal_output_fft->reset();
@@ -341,9 +361,11 @@ PluginEqGui::run_impulse_analysis()
 
 	ARDOUR::ChanMapping in_map(_plugin->get_info()->n_inputs);
 	ARDOUR::ChanMapping out_map(_plugin->get_info()->n_outputs);
+	// map output buffers after input buffers (no inplace for VST)
+	out_map.offset_to (DataType::AUDIO, inputs);
 
 	_plugin->set_block_size (_buffer_size);
-	_plugin->connect_and_run(_bufferset, in_map, out_map, _buffer_size, 0);
+	_plugin->connect_and_run(_bufferset, 0, _buffer_size, 1.0, in_map, out_map, _buffer_size, 0);
 	framecnt_t f = _plugin->signal_latency ();
 	// Adding user_latency() could be interesting
 
@@ -361,7 +383,7 @@ PluginEqGui::run_impulse_analysis()
 		//std::cerr << "0: no latency, copying full buffer, trivial.." << std::endl;
 		for (uint32_t i = 0; i < outputs; ++i) {
 			memcpy(_collect_bufferset.get_audio(i).data(),
-			       _bufferset.get_audio(i).data(), _buffer_size * sizeof(float));
+			       _bufferset.get_audio(inputs + i).data(), _buffer_size * sizeof(float));
 		}
 	} else {
 		//int C = 0;
@@ -384,8 +406,8 @@ PluginEqGui::run_impulse_analysis()
 				//std::cerr << (++C) << ": copying " << length << " frames to _collect_bufferset.get_audio(i)+" << target_offset << " from bufferset at offset " << f << std::endl;
 				for (uint32_t i = 0; i < outputs; ++i) {
 					memcpy(_collect_bufferset.get_audio(i).data(target_offset),
-                                       		_bufferset.get_audio(i).data() + f,
-                                       		length * sizeof(float));
+							_bufferset.get_audio(inputs + i).data() + f,
+							length * sizeof(float));
 				}
 
 				target_offset += length;
@@ -400,9 +422,7 @@ PluginEqGui::run_impulse_analysis()
 					memset(d, 0, sizeof(ARDOUR::Sample)*_buffer_size);
 				}
 
-				in_map  = ARDOUR::ChanMapping(_plugin->get_info()->n_inputs);
-				out_map = ARDOUR::ChanMapping(_plugin->get_info()->n_outputs);
-				_plugin->connect_and_run(_bufferset, in_map, out_map, _buffer_size, 0);
+				_plugin->connect_and_run (_bufferset, target_offset, target_offset + _buffer_size, 1.0, in_map, out_map, _buffer_size, 0);
 			}
 		} while ( frames_left > 0);
 
@@ -422,6 +442,47 @@ PluginEqGui::run_impulse_analysis()
 	ARDOUR_UI::instance()->drop_process_buffers ();
 }
 
+void
+PluginEqGui::update_pointer_info(float x, float y)
+{
+	const int freq = std::max(1, (int) roundf((powf(10, x / _analysis_width * _log_max) - 1) * _samplerate / 2.0 / _log_coeff));
+	const float dB = _max_dB - y / _analysis_height * ( _max_dB - _min_dB );
+	std::stringstream ss;
+	ss << std::fixed;
+	if (freq >= 10000) {
+		ss <<  std::setprecision (1) << freq / 1000.0 << "kHz";
+	} else if (freq >= 1000) {
+		ss <<  std::setprecision (2) << freq / 1000.0 << "kHz";
+	} else {
+		ss <<  std::setprecision (0) << freq << "Hz";
+	}
+	ss << "  " << std::setw(5) << std::setprecision (1) << std::showpos << dB;
+	ss << std::setw(0) << "dB";
+	_pointer_info->set_text(ss.str());
+}
+
+bool
+PluginEqGui::analysis_area_mouseover(GdkEventMotion *event)
+{
+	update_pointer_info(event->x, event->y);
+	return true;
+}
+
+bool
+PluginEqGui::analysis_area_mouseexit(GdkEventCrossing *)
+{
+	_pointer_info->set_text("");
+	return true;
+}
+
+bool
+PluginEqGui::analysis_area_mousedown(GdkEventButton *event)
+{
+	update_pointer_info(event->x, event->y);
+	return true;
+}
+
+
 bool
 PluginEqGui::expose_analysis_area(GdkEventExpose *)
 {
@@ -433,16 +494,16 @@ void
 PluginEqGui::draw_analysis_scales(cairo_t *ref_cr)
 {
 	// TODO: check whether we need rounding
-	_analysis_scale_surface = cairo_surface_create_similar(cairo_get_target(ref_cr),
-							     CAIRO_CONTENT_COLOR,
-							     _analysis_width,
-							     _analysis_height);
+	_analysis_scale_surface = cairo_surface_create_similar (cairo_get_target(ref_cr),
+			CAIRO_CONTENT_COLOR,
+			_analysis_width,
+			_analysis_height);
 
 	cairo_t *cr = cairo_create (_analysis_scale_surface);
 
-        cairo_set_source_rgb(cr, 0.0, 0.0, 0.0);
-        cairo_rectangle(cr, 0.0, 0.0, _analysis_width, _analysis_height);
-        cairo_fill(cr);
+	cairo_set_source_rgb(cr, 0.0, 0.0, 0.0);
+	cairo_rectangle(cr, 0.0, 0.0, _analysis_width, _analysis_height);
+	cairo_fill(cr);
 
 
 	draw_scales_power(_analysis_area, cr);
@@ -450,8 +511,7 @@ PluginEqGui::draw_analysis_scales(cairo_t *ref_cr)
 		draw_scales_phase(_analysis_area, cr);
 	}
 
-        cairo_destroy(cr);
-
+	cairo_destroy(cr);
 }
 
 void
@@ -459,13 +519,12 @@ PluginEqGui::redraw_analysis_area()
 {
 	cairo_t *cr;
 
-        cr = gdk_cairo_create(GDK_DRAWABLE(_analysis_area->get_window()->gobj()));
+	cr = gdk_cairo_create(GDK_DRAWABLE(_analysis_area->get_window()->gobj()));
 
 	if (_analysis_scale_surface == 0) {
 		draw_analysis_scales(cr);
 	}
 
-
 	cairo_copy_page(cr);
 
 	cairo_set_source_surface(cr, _analysis_scale_surface, 0.0, 0.0);
@@ -479,9 +538,7 @@ PluginEqGui::redraw_analysis_area()
 	// TODO: make this optional
 	plot_signal_amplitude_difference(_analysis_area, cr);
 
-        cairo_destroy(cr);
-
-
+	cairo_destroy(cr);
 }
 
 #define PHASE_PROPORTION 0.5
@@ -500,7 +557,7 @@ PluginEqGui::draw_scales_phase(Gtk::Widget */*w*/, cairo_t *cr)
 
 		y = _analysis_height/2.0 - (float)i*(_analysis_height/8.0)*PHASE_PROPORTION;
 
-        	cairo_set_source_rgb(cr, .8, .9, 0.2);
+		cairo_set_source_rgb(cr, .8, .9, 0.2);
 		if (i == 0) {
 			snprintf(buf,256, "0\u00b0");
 		} else {
@@ -514,7 +571,7 @@ PluginEqGui::draw_scales_phase(Gtk::Widget */*w*/, cairo_t *cr)
 			continue;
 
 
-        	cairo_set_source_rgba(cr, .8, .9, 0.2, 0.6/(float)i);
+		cairo_set_source_rgba(cr, .8, .9, 0.2, 0.6/(float)i);
 		cairo_move_to(cr, 0.0,            y);
 		cairo_line_to(cr, _analysis_width, y);
 
@@ -523,13 +580,13 @@ PluginEqGui::draw_scales_phase(Gtk::Widget */*w*/, cairo_t *cr)
 
 		// label
 		snprintf(buf,256, "-%d\u00b0", (i * 45));
-        	cairo_set_source_rgb(cr, .8, .9, 0.2);
+		cairo_set_source_rgb(cr, .8, .9, 0.2);
 		cairo_text_extents(cr, buf, &t_ext);
 		cairo_move_to(cr, _analysis_width - t_ext.width - t_ext.x_bearing - 2.0, y - extents.descent);
 		cairo_show_text(cr, buf);
 
 		// line
-        	cairo_set_source_rgba(cr, .8, .9, 0.2, 0.6/(float)i);
+		cairo_set_source_rgba(cr, .8, .9, 0.2, 0.6/(float)i);
 		cairo_move_to(cr, 0.0,            y);
 		cairo_line_to(cr, _analysis_width, y);
 
@@ -550,7 +607,7 @@ PluginEqGui::plot_impulse_phase(Gtk::Widget *w, cairo_t *cr)
 	// float width  = w->get_width();
 	float height = w->get_height();
 
-        cairo_set_source_rgba(cr, 0.95, 0.3, 0.2, 1.0);
+	cairo_set_source_rgba(cr, 0.95, 0.3, 0.2, 1.0);
 	for (uint32_t i = 0; i < _impulse_fft->bins()-1; i++) {
 		// x coordinate of bin i
 		x  = log10f(1.0 + (float)i / (float)_impulse_fft->bins() * _log_coeff) / _log_max;
@@ -750,39 +807,20 @@ PluginEqGui::plot_signal_amplitude_difference(Gtk::Widget *w, cairo_t *cr)
 	// float width  = w->get_width();
 	float height = w->get_height();
 
-        cairo_set_source_rgb(cr, 0.0, 1.0, 0.0);
-	cairo_set_line_width (cr, 2.5);
+	cairo_set_source_rgb(cr, 0.0, 1.0, 0.0);
+	cairo_set_line_width (cr, 1.5);
 
 	for (uint32_t i = 0; i < _signal_input_fft->bins()-1; i++) {
 		// x coordinate of bin i
 		x  = log10f(1.0 + (float)i / (float)_signal_input_fft->bins() * _log_coeff) / _log_max;
 		x *= _analysis_width;
 
-		float power_out = power_to_dB(_signal_output_fft->power_at_bin(i));
-		float power_in  = power_to_dB(_signal_input_fft ->power_at_bin(i));
-		float power = power_out - power_in;
-
-		// for SaBer
-		/*
-		double p = 10.0 * log10( 1.0 + (double)_signal_output_fft->power_at_bin(i) - (double)
- - _signal_input_fft ->power_at_bin(i));
-		//p *= 1000000.0;
-		float power = (float)p;
+		float power_out = _signal_output_fft->power_at_bin (i) + 1e-30;
+		float power_in  = _signal_input_fft ->power_at_bin (i) + 1e-30;
+		float power = power_to_dB (power_out / power_in);
 
-		if ( (i % 1000) == 0) {
-			std::cerr << i << ": " << power << std::endl;
-		}
-		*/
-
-		if (ISINF(power)) {
-			if (power < 0) {
-				power = _min_dB - 1.0;
-			} else {
-				power = _max_dB - 1.0;
-			}
-		} else if (ISNAN(power)) {
-			power = _min_dB - 1.0;
-		}
+		assert (!ISINF(power));
+		assert (!ISNAN(power));
 
 		float yCoeff = ( power - _min_dB) / (_max_dB - _min_dB);
 
@@ -810,6 +848,4 @@ PluginEqGui::plot_signal_amplitude_difference(Gtk::Widget *w, cairo_t *cr)
 	}
 
 	cairo_stroke(cr);
-
-
 }
diff --git a/gtk2_ardour/plugin_eq_gui.h b/gtk2_ardour/plugin_eq_gui.h
index 5743152..384359b 100644
--- a/gtk2_ardour/plugin_eq_gui.h
+++ b/gtk2_ardour/plugin_eq_gui.h
@@ -79,6 +79,11 @@ private:
 
 	void plot_signal_amplitude_difference (Gtk::Widget *,cairo_t *);
 
+	void update_pointer_info(float, float);
+	bool analysis_area_mouseover(GdkEventMotion *);
+	bool analysis_area_mouseexit(GdkEventCrossing *);
+	bool analysis_area_mousedown(GdkEventButton *);
+
 	// Helpers
 	bool timeout_callback ();
 	void redraw_scales ();
@@ -117,6 +122,7 @@ private:
 	// gui objects
 	Gtk::DrawingArea *_analysis_area;
 	cairo_surface_t *_analysis_scale_surface;
+	Gtk::Label *_pointer_info;
 
 	// dB scale selection:
 	class dBSelectionColumns : public Gtk::TreeModel::ColumnRecord
diff --git a/gtk2_ardour/plugin_pin_dialog.cc b/gtk2_ardour/plugin_pin_dialog.cc
new file mode 100644
index 0000000..24a4fec
--- /dev/null
+++ b/gtk2_ardour/plugin_pin_dialog.cc
@@ -0,0 +1,2035 @@
+/*
+ * Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+ * Copyright (C) 2011 Paul Davis
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+
+#include <boost/algorithm/string.hpp>
+
+#include <gtkmm/table.h>
+#include <gtkmm/frame.h>
+#include <gtkmm/label.h>
+
+#include "pbd/replace_all.h"
+
+#include "gtkmm2ext/utils.h"
+#include "gtkmm2ext/rgb_macros.h"
+
+#include "ardour/amp.h"
+#include "ardour/audioengine.h"
+#include "ardour/pannable.h"
+#include "ardour/plugin.h"
+#include "ardour/port.h"
+#include "ardour/profile.h"
+#include "ardour/send.h"
+#include "ardour/session.h"
+
+#include "plugin_pin_dialog.h"
+#include "gui_thread.h"
+#include "timers.h"
+#include "tooltips.h"
+#include "ui_config.h"
+
+#include "pbd/i18n.h"
+
+using namespace ARDOUR;
+using namespace PBD;
+using namespace std;
+using namespace Gtk;
+using namespace Gtkmm2ext;
+
+PluginPinWidget::PluginPinWidget (boost::shared_ptr<ARDOUR::PluginInsert> pi)
+	: _set_config (_("Manual Config"), ArdourButton::led_default_elements)
+	, _tgl_sidechain (_("Sidechain"), ArdourButton::led_default_elements)
+	, _add_plugin (_("+"))
+	, _del_plugin (_("-"))
+	, _add_input_audio (_("+"))
+	, _del_input_audio (_("-"))
+	, _add_input_midi (_("+"))
+	, _del_input_midi (_("-"))
+	, _add_output_audio (_("+"))
+	, _del_output_audio (_("-"))
+	, _add_output_midi (_("+"))
+	, _del_output_midi (_("-"))
+	, _add_sc_audio (_("Audio"))
+	, _add_sc_midi (_("MIDI"))
+	, _pi (pi)
+	, _pin_box_size (10)
+	, _width (0)
+	, _height (0)
+	, _innerwidth (0)
+	, _margin_x (28)
+	, _margin_y (40)
+	, _min_width (300)
+	, _min_height (200)
+	, _n_inputs (0)
+	, _n_sidechains (0)
+	, _position_valid (false)
+	, _ignore_updates (false)
+	, _sidechain_selector (0)
+	, _dragging (false)
+{
+	assert (pi->owner ()); // Route
+
+	_pi->PluginIoReConfigure.connect (
+			_plugin_connections, invalidator (*this), boost::bind (&PluginPinWidget::queue_idle_update, this), gui_context ()
+			);
+
+	_pi->PluginMapChanged.connect (
+			_plugin_connections, invalidator (*this), boost::bind (&PluginPinWidget::queue_idle_update, this), gui_context ()
+			);
+
+	_pi->PluginConfigChanged.connect (
+			_plugin_connections, invalidator (*this), boost::bind (&PluginPinWidget::queue_idle_update, this), gui_context ()
+			);
+
+	_pin_box_size = 2 * ceil (max (8., 10. * UIConfiguration::instance ().get_ui_scale ()) * .5);
+	_margin_x = 2 * ceil (max (24., 28. * UIConfiguration::instance ().get_ui_scale ()) * .5);
+	_margin_y = 2 * ceil (max (36., 40. * UIConfiguration::instance ().get_ui_scale ()) * .5);
+
+	_tgl_sidechain.set_name ("pinrouting sidechain");
+	_set_config.set_name ("pinrouting custom");
+
+	Menu_Helpers::MenuList& citems = reset_menu.items ();
+	reset_menu.set_name ("ArdourContextMenu");
+	citems.clear ();
+	citems.push_back (Menu_Helpers::MenuElem (_("Reset"), sigc::mem_fun (*this, &PluginPinWidget::reset_mapping)));
+
+	_pm_size_group  = SizeGroup::create (SIZE_GROUP_BOTH);
+	_add_plugin.set_tweaks (ArdourButton::Square);
+	_del_plugin.set_tweaks (ArdourButton::Square);
+	if (_pi->plugin (0)->get_info()->reconfigurable_io ()) {
+		_pm_size_group->add_widget (_add_input_audio);
+		_pm_size_group->add_widget (_del_input_audio);
+		_pm_size_group->add_widget (_add_input_midi);
+		_pm_size_group->add_widget (_del_input_midi);
+	} else {
+		_pm_size_group->add_widget (_add_plugin);
+		_pm_size_group->add_widget (_del_plugin);
+	}
+	_pm_size_group->add_widget (_add_output_audio);
+	_pm_size_group->add_widget (_del_output_audio);
+	_pm_size_group->add_widget (_add_output_midi);
+	_pm_size_group->add_widget (_del_output_midi);
+
+	Box* box;
+	Frame *f;
+
+	VBox* tl = manage (new VBox ());
+	tl->set_border_width (2);
+	tl->set_spacing (2);
+
+	VBox* tr = manage (new VBox ());
+	tr->set_border_width (2);
+	tr->set_spacing (2);
+
+	/* left side */
+	tl->pack_start (_set_config, false, false);
+
+	if (_pi->plugin (0)->get_info()->reconfigurable_io ()) {
+		box = manage (new HBox ());
+		box->set_border_width (2);
+		box->pack_start (_add_input_audio, true, false);
+		box->pack_start (_del_input_audio, true, false);
+		f = manage (new Frame ());
+		f->set_label (_("Audio Input Pins"));
+		f->add (*box);
+		tl->pack_start (*f, false, false);
+
+		box = manage (new HBox ());
+		box->set_border_width (2);
+		box->pack_start (_add_input_midi, true, false);
+		box->pack_start (_del_input_midi, true, false);
+		f = manage (new Frame ());
+		f->set_label (_("MIDI Input Pins"));
+		f->add (*box);
+		tl->pack_start (*f, false, false);
+	} else {
+		box = manage (new HBox ());
+		box->set_border_width (2);
+		box->pack_start (_add_plugin, true, false);
+		box->pack_start (_del_plugin, true, false);
+		f = manage (new Frame ());
+		f->set_label (_("Instances"));
+		f->add (*box);
+		tl->pack_start (*f, false, false);
+	}
+
+	box = manage (new HBox ());
+	box->set_border_width (2);
+	box->pack_start (_add_output_audio, true, false);
+	box->pack_start (_del_output_audio, true, false);
+	f = manage (new Frame ());
+	f->set_label (_("Audio Out"));
+	f->add (*box);
+	tl->pack_start (*f, false, false);
+
+	box = manage (new HBox ());
+	box->set_border_width (2);
+	box->pack_start (_add_output_midi, true, false);
+	box->pack_start (_del_output_midi, true, false);
+	f = manage (new Frame ());
+	f->set_label (_("MIDI Out"));
+	f->add (*box);
+	tl->pack_start (*f, false, false);
+
+	tl->pack_start (*manage (new Label ("")), true, true); // invisible separator
+	tl->pack_start (*manage (new HSeparator ()), false, false, 4);
+	_out_presets.disable_scrolling ();
+	ARDOUR_UI_UTILS::set_tooltip (_out_presets, _("Output Presets"));
+	tl->pack_start (_out_presets, false, false);
+
+	/* right side */
+	_sidechain_tbl = manage (new Gtk::Table ());
+	_sidechain_tbl->set_spacings (2);
+
+	tr->pack_start (_tgl_sidechain, false, false);
+	tr->pack_start (*_sidechain_tbl, true, true);
+
+	box = manage (new VBox ());
+	box->set_border_width (2);
+	box->set_spacing (2);
+	box->pack_start (_add_sc_audio, false, false);
+	box->pack_start (_add_sc_midi , false, false);
+	f = manage (new Frame ());
+	f->set_label (_("Add Sidechain Input"));
+	f->add (*box);
+
+	tr->pack_start (*f, false, false);
+
+	/* global packing */
+	HBox* hbox = manage (new HBox ());
+	hbox->set_spacing (4);
+	hbox->pack_start (*tl, false, false);
+	hbox->pack_start (darea, true, true);
+	hbox->pack_start (*tr, false, false);
+
+	pack_start (*hbox, true, true);
+	set_border_width (4);
+	show_all ();
+
+	plugin_reconfigured ();
+
+	darea.add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::POINTER_MOTION_MASK);
+	darea.signal_size_request ().connect (sigc::mem_fun (*this, &PluginPinWidget::darea_size_request));
+	darea.signal_size_allocate ().connect (sigc::mem_fun (*this, &PluginPinWidget::darea_size_allocate));
+	darea.signal_expose_event ().connect (sigc::mem_fun (*this, &PluginPinWidget::darea_expose_event));
+	darea.signal_button_press_event ().connect (sigc::mem_fun (*this, &PluginPinWidget::darea_button_press_event));
+	darea.signal_button_release_event ().connect (sigc::mem_fun (*this, &PluginPinWidget::darea_button_release_event));
+	darea.signal_motion_notify_event ().connect (sigc::mem_fun (*this, &PluginPinWidget::darea_motion_notify_event));
+
+	_tgl_sidechain.signal_clicked.connect (sigc::mem_fun (*this, &PluginPinWidget::toggle_sidechain));
+
+	_set_config.signal_clicked.connect (sigc::mem_fun (*this, &PluginPinWidget::reset_configuration));
+	_add_plugin.signal_clicked.connect (sigc::bind (sigc::mem_fun (*this, &PluginPinWidget::add_remove_plugin_clicked), true));
+	_del_plugin.signal_clicked.connect (sigc::bind (sigc::mem_fun (*this, &PluginPinWidget::add_remove_plugin_clicked), false));
+
+	_add_input_audio.signal_clicked.connect (sigc::bind (sigc::mem_fun (*this, &PluginPinWidget::add_remove_inpin_clicked), true, DataType::AUDIO));
+	_del_input_audio.signal_clicked.connect (sigc::bind (sigc::mem_fun (*this, &PluginPinWidget::add_remove_inpin_clicked), false, DataType::AUDIO));
+	_add_input_midi.signal_clicked.connect (sigc::bind (sigc::mem_fun (*this, &PluginPinWidget::add_remove_inpin_clicked), true, DataType::MIDI));
+	_del_input_midi.signal_clicked.connect (sigc::bind (sigc::mem_fun (*this, &PluginPinWidget::add_remove_inpin_clicked), false, DataType::MIDI));
+
+	_add_output_audio.signal_clicked.connect (sigc::bind (sigc::mem_fun (*this, &PluginPinWidget::add_remove_port_clicked), true, DataType::AUDIO));
+	_del_output_audio.signal_clicked.connect (sigc::bind (sigc::mem_fun (*this, &PluginPinWidget::add_remove_port_clicked), false, DataType::AUDIO));
+	_add_output_midi.signal_clicked.connect (sigc::bind (sigc::mem_fun (*this, &PluginPinWidget::add_remove_port_clicked), true, DataType::MIDI));
+	_del_output_midi.signal_clicked.connect (sigc::bind (sigc::mem_fun (*this, &PluginPinWidget::add_remove_port_clicked), false, DataType::MIDI));
+
+	_add_sc_audio.signal_clicked.connect (sigc::bind (sigc::mem_fun (*this, &PluginPinWidget::add_sidechain_port), DataType::AUDIO));
+	_add_sc_midi.signal_clicked.connect (sigc::bind (sigc::mem_fun (*this, &PluginPinWidget::add_sidechain_port), DataType::MIDI));
+
+	AudioEngine::instance ()->PortConnectedOrDisconnected.connect (
+			_io_connection, invalidator (*this), boost::bind (&PluginPinWidget::port_connected_or_disconnected, this, _1, _3), gui_context ()
+			);
+}
+
+PluginPinWidget::~PluginPinWidget ()
+{
+	delete _sidechain_selector;
+}
+
+void
+PluginPinWidget::set_session (ARDOUR::Session *s)
+{
+	SessionHandlePtr::set_session (s);
+	plugin_reconfigured ();
+}
+
+void
+PluginPinWidget::queue_idle_update ()
+{
+	/* various actions here are directly executed, in the GUI thread,
+	 * with the GUI-thread eventually taking the process and processor lock.
+	 * "connect gui_context()" will call back immediately and this
+	 * signal-handler will run with the locks held.
+	 *
+	 * This will lead to a crash with calling nth_send() which takes
+	 * a processor read-lock while holding a write lock in the same thread.
+	 *
+	 * decouple update to GUI idle.
+	 *
+	 * BUT, do delete existing controls here (in case they're affected by
+	 * the change and hit by the Timer before idle comes around)
+	 */
+	for (list<Control*>::iterator i = _controls.begin (); i != _controls.end (); ++i) {
+		_sidechain_tbl->remove ((*i)->box);
+		delete *i;
+	}
+	_controls.clear ();
+	Glib::signal_idle().connect (sigc::mem_fun(*this, &PluginPinWidget::idle_update));
+}
+
+bool
+PluginPinWidget::idle_update ()
+{
+	plugin_reconfigured ();
+	return false;
+}
+
+
+void
+PluginPinWidget::plugin_reconfigured ()
+{
+	ENSURE_GUI_THREAD (*this, &PluginPinWidget::plugin_reconfigured);
+	if (_ignore_updates) {
+		return;
+	}
+	_n_plugins = _pi->get_count ();
+	_pi->configured_io (_in, _out);
+	_ins = _pi->internal_streams (); // with sidechain
+	_sinks = _pi->natural_input_streams ();
+	_sources = _pi->natural_output_streams ();
+
+
+	_tgl_sidechain.set_active (_pi->has_sidechain ());
+	_add_sc_audio.set_sensitive (_pi->has_sidechain ());
+	_add_sc_midi.set_sensitive (_pi->has_sidechain ());
+
+	if (_pi->custom_cfg ()) {
+		_set_config.set_active (true);
+		_add_plugin.set_sensitive (true);
+		_del_plugin.set_sensitive (_n_plugins > 1);
+		_add_output_audio.set_sensitive (true);
+		_add_output_midi.set_sensitive (true);
+		_del_output_audio.set_sensitive (_out.n_audio () > 0 && _out.n_total () > 1);
+		_del_output_midi.set_sensitive (_out.n_midi () > 0 && _out.n_total () > 1);
+		_add_input_audio.set_sensitive (true);
+		_add_input_midi.set_sensitive (true);
+		_del_input_audio.set_sensitive (_sinks.n_audio () > 0 && _sinks.n_total () > 1);
+		_del_input_midi.set_sensitive (_sinks.n_midi () > 0 && _sinks.n_total () > 1);
+		_out_presets.set_sensitive (false);
+		_out_presets.set_text (_("Manual"));
+	} else {
+		_set_config.set_active (false);
+		_add_plugin.set_sensitive (false);
+		_del_plugin.set_sensitive (false);
+		_add_input_audio.set_sensitive (false);
+		_add_input_midi.set_sensitive (false);
+		_del_input_audio.set_sensitive (false);
+		_del_input_midi.set_sensitive (false);
+		_add_output_audio.set_sensitive (false);
+		_add_output_midi.set_sensitive (false);
+		_del_output_audio.set_sensitive (false);
+		_del_output_midi.set_sensitive (false);
+		_out_presets.set_sensitive (true);
+		refill_output_presets ();
+	}
+
+	if (!_pi->has_sidechain () && _sidechain_selector) {
+		delete _sidechain_selector;
+		_sidechain_selector = 0;
+	}
+
+	refill_sidechain_table ();
+
+	/* update elements */
+
+	_elements.clear ();
+	_hover.reset ();
+	_actor.reset ();
+	_selection.reset ();
+	_drag_dst.reset ();
+	_dragging = false;
+
+	_n_inputs = _n_sidechains = 0;
+
+	for (uint32_t i = 0; i < _ins.n_total (); ++i) {
+		DataType dt = i < _ins.n_midi () ? DataType::MIDI : DataType::AUDIO;
+		uint32_t id = dt == DataType::MIDI ? i : i - _ins.n_midi ();
+		bool sidechain = id >= _in.get (dt) ? true : false;
+		if (sidechain) {
+			++_n_sidechains;
+		} else {
+			++_n_inputs;
+		}
+
+		CtrlWidget cw (CtrlWidget ("", Input, dt, id, 0, sidechain));
+		_elements.push_back (cw);
+	}
+
+	for (uint32_t i = 0; i < _out.n_total (); ++i) {
+		int id = (i < _out.n_midi ()) ? i : i - _out.n_midi ();
+		_elements.push_back (CtrlWidget ("", Output, (i < _out.n_midi () ? DataType::MIDI : DataType::AUDIO), id));
+	}
+
+	_in_map.clear ();
+	_out_map.clear ();
+
+	for (uint32_t n = 0; n < _n_plugins; ++n) {
+		boost::shared_ptr<Plugin> plugin = _pi->plugin (n);
+		for (uint32_t i = 0; i < _sinks.n_total (); ++i) {
+			DataType dt (i < _sinks.n_midi () ? DataType::MIDI : DataType::AUDIO);
+			int idx = (dt == DataType::MIDI) ? i : i - _sinks.n_midi ();
+			const Plugin::IOPortDescription& iod (plugin->describe_io_port (dt, true, idx));
+			CtrlWidget cw (CtrlWidget (iod.name, Sink, dt, idx, n, iod.is_sidechain));
+			_elements.push_back (cw);
+		}
+		for (uint32_t i = 0; i < _sources.n_total (); ++i) {
+			DataType dt (i < _sources.n_midi () ? DataType::MIDI : DataType::AUDIO);
+			int idx = (dt == DataType::MIDI) ? i : i - _sources.n_midi ();
+			const Plugin::IOPortDescription& iod (plugin->describe_io_port (dt, false, idx));
+			_elements.push_back (CtrlWidget (iod.name, Source, dt, idx, n));
+		}
+		_in_map[n] = _pi->input_map (n);
+		_out_map[n] = _pi->output_map (n);
+	}
+	_has_midi_bypass = _pi->has_midi_bypass ();
+	_thru_map = _pi->thru_map ();
+
+	/* cache maps */
+
+	/* calc minimum size */
+	const uint32_t max_ports = std::max (_ins.n_total (), _out.n_total ());
+	const uint32_t max_pins = std::max ((_sinks * _n_plugins).n_total (), (_sources * _n_plugins).n_total ());
+	uint32_t min_width = std::max (25 * max_ports, (uint32_t)(20 + _pin_box_size) * max_pins);
+	min_width = std::max (min_width, (uint32_t)ceilf (_margin_y * .45 * _n_plugins * 16. / 9.)); // 16 : 9 aspect
+	min_width = std::max ((uint32_t)300, min_width);
+
+	min_width = 50 + 10 * ceilf (min_width / 10.f);
+
+	uint32_t min_height = 3.5 * _margin_y + 2 * (_n_sidechains + 1) * _pin_box_size;
+	min_height = std::max ((uint32_t)200, min_height);
+	min_height = 4 * ceilf (min_height / 4.f);
+
+	if (min_width != _min_width || min_height != _min_height) {
+		_min_width = min_width;
+		_min_height = min_height;
+		darea.queue_resize ();
+	}
+
+	_position_valid = false;
+	darea.queue_draw ();
+}
+
+void
+PluginPinWidget::refill_sidechain_table ()
+{
+	Table_Helpers::TableList& kids = _sidechain_tbl->children ();
+	for (Table_Helpers::TableList::iterator i = kids.begin (); i != kids.end ();) {
+		i = kids.erase (i);
+	}
+	_sidechain_tbl->resize (1, 1);
+	for (list<Control*>::iterator i = _controls.begin (); i != _controls.end (); ++i) {
+		delete *i;
+	}
+	_controls.clear ();
+	if (!_pi->has_sidechain () && _sidechain_selector) {
+		return;
+	}
+	boost::shared_ptr<IO> io = _pi->sidechain_input ();
+	if (!io) {
+		return;
+	}
+
+	uint32_t r = 0;
+	PortSet& p (io->ports ());
+	bool can_remove = p.num_ports () > 1;
+	for (PortSet::iterator i = p.begin (DataType::MIDI); i != p.end (DataType::MIDI); ++i) {
+		r += add_port_to_table (*i, r, can_remove);
+	}
+	for (PortSet::iterator i = p.begin (DataType::AUDIO); i != p.end (DataType::AUDIO); ++i) {
+		r += add_port_to_table (*i, r, can_remove);
+	}
+	_sidechain_tbl->show_all ();
+}
+
+void
+PluginPinWidget::refill_output_presets ()
+{
+	using namespace Menu_Helpers;
+	_out_presets.clear_items ();
+
+	bool need_dropdown = _pi->has_output_presets ();
+
+	if (!need_dropdown) {
+		_out_presets.set_sensitive (false);
+		_out_presets.set_text (_("Automatic"));
+		return;
+	}
+
+	_out_presets.AddMenuElem (MenuElem (_("Automatic"), sigc::bind (sigc::mem_fun (*this, &PluginPinWidget::select_output_preset), 0)));
+
+	const uint32_t n_audio = _pi->preset_out ().n_audio ();
+	if (n_audio == 0) {
+		_out_presets.set_text (_("Automatic"));
+	}
+
+	PluginOutputConfiguration ppc (_pi->plugin (0)->possible_output ());
+	if (ppc.find (0) != ppc.end ()) {
+		// anyting goes
+		ppc.clear ();
+		if (n_audio != 0) {
+			ppc.insert (n_audio);
+		}
+		ppc.insert (1);
+		ppc.insert (2);
+		ppc.insert (8);
+		ppc.insert (16);
+		ppc.insert (24);
+		ppc.insert (32);
+	}
+
+	for (PluginOutputConfiguration::const_iterator i = ppc.begin () ; i != ppc.end (); ++i) {
+		assert (*i > 0);
+		std::string tmp;
+		switch (*i) {
+			case 1:
+				tmp = _("Mono");
+				break;
+			case 2:
+				tmp = _("Stereo");
+				break;
+			default:
+				tmp = string_compose (P_("%1 Channel", "%1 Channels", *i), *i);
+				break;
+		}
+		_out_presets.AddMenuElem (MenuElem (tmp, sigc::bind (sigc::mem_fun (*this, &PluginPinWidget::select_output_preset), *i)));
+		if (n_audio == *i) {
+			_out_presets.set_text (tmp);
+		}
+	}
+}
+
+std::string
+PluginPinWidget::port_label (const std::string& portname, bool strip)
+{
+	// compare to MixerStrip::update_io_button()
+	string lpn (PROGRAM_NAME);
+	boost::to_lower (lpn);
+	std::string program_port_prefix = lpn + ":"; // e.g. "ardour:"
+
+	std::string pn = AudioEngine::instance ()->get_pretty_name_by_name (portname);
+	if (!pn.empty ()) {
+		string::size_type slash = pn.find ("/");
+		if (slash != string::npos) {
+			pn = pn.substr (0, slash);
+		}
+		return pn;
+	}
+	std::string label (portname);
+	if (label.find ("system:capture_") == 0) {
+		if (label.empty ()) {
+			label = portname.substr (15);
+		}
+	} else if (label.find ("system:midi_capture_") == 0) {
+		if (label.empty ()) {
+			// "system:midi_capture_123" -> "123"
+			label = "M " + portname.substr (20);
+		}
+	} else if (label.find (program_port_prefix) == 0) {
+		label = label.substr (program_port_prefix.size ());
+		if (strip) {
+			string::size_type slash = label.find ("/");
+			if (slash != string::npos) {
+				label = label.substr (0, slash);
+			}
+		}
+	}
+	return label;
+}
+
+uint32_t
+PluginPinWidget::add_port_to_table (boost::shared_ptr<Port> p, uint32_t r, bool can_remove)
+{
+	std::string lbl;
+	std::string tip = p->name ();
+	std::vector<std::string> cns;
+	bool single_source = true;
+	p->get_connections (cns);
+
+	for (std::vector<std::string>::const_iterator i = cns.begin (); i != cns.end (); ++i) {
+		if (lbl.empty ()) {
+			lbl = port_label (*i, true);
+			continue;
+		}
+		if (port_label (*i, true) != lbl) {
+			lbl = "...";
+			single_source = false;
+			break;
+		}
+	}
+
+	if (cns.size () == 0) {
+		lbl = "-";
+		single_source = false;
+	} else if (cns.size () == 1) {
+		tip += " <- ";
+		lbl = port_label (cns[0], false);
+	} else {
+		tip += " <- ";
+	}
+	replace_all (lbl, "_", " ");
+
+	for (std::vector<std::string>::const_iterator i = cns.begin (); i != cns.end (); ++i) {
+		tip += *i;
+		tip += " ";
+	}
+
+	ArdourButton *pb = manage (new ArdourButton (lbl));
+	pb->set_text_ellipsize (Pango::ELLIPSIZE_MIDDLE);
+	pb->set_layout_ellipsize_width (108 * PANGO_SCALE);
+	ARDOUR_UI_UTILS::set_tooltip (*pb, tip);
+	_sidechain_tbl->attach (*pb, 0, 1, r, r +1 , EXPAND|FILL, SHRINK);
+
+	pb->signal_button_press_event ().connect (sigc::bind (sigc::mem_fun (*this, &PluginPinWidget::sc_input_press), boost::weak_ptr<Port> (p)), false);
+	pb->signal_button_release_event ().connect (sigc::mem_fun (*this, &PluginPinWidget::sc_input_release), false);
+
+	pb = manage (new ArdourButton ("-"));
+	_sidechain_tbl->attach (*pb, 1, 2, r, r + 1, FILL, SHRINK);
+	if (can_remove) {
+		pb->signal_clicked.connect (sigc::bind (sigc::mem_fun (*this, &PluginPinWidget::remove_port), boost::weak_ptr<Port> (p)));
+	} else {
+		pb->set_sensitive (false);
+	}
+
+	uint32_t rv = 1;
+
+	if (single_source && _session) {
+		/* check if it's an Ardour Send feeding.. */
+		boost::shared_ptr<ARDOUR::RouteList> routes = _session->get_routes ();
+		for (ARDOUR::RouteList::const_iterator i = routes->begin (); i != routes->end (); ++i) {
+			uint32_t nth = 0;
+			boost::shared_ptr<Processor> proc;
+			/* nth_send () takes a processor read-lock */
+			while ((proc = (*i)->nth_send (nth))) {
+				boost::shared_ptr<IOProcessor> send = boost::dynamic_pointer_cast<IOProcessor> (proc);
+				if (!send || !send->output ()) {
+					++nth;
+					continue;
+				}
+				if (!send->output ()->connected_to (p->name ())) {
+					++nth;
+					continue;
+				}
+				/* if processor goes away, we're notified by the port disconnect,
+				 * there should be no need to explicily connect to proc->DropReferences
+				 */
+				set<Evoral::Parameter> p = proc->what_can_be_automated ();
+				for (set<Evoral::Parameter>::iterator i = p.begin (); i != p.end (); ++i) {
+					Control* c = new Control (proc->automation_control (*i), _("Send"));
+					_controls.push_back (c);
+					++r; ++rv;
+					_sidechain_tbl->attach (c->box, 0, 2, r, r + 1, EXPAND|FILL, SHRINK);
+				}
+				break;
+			}
+		}
+	}
+	return rv;
+}
+
+void
+PluginPinWidget::update_element_pos ()
+{
+	/* layout sizes */
+	_innerwidth = _width - 2. * _margin_x;
+
+	const double yc   = rint (_height * .5);
+	const double bxh2 = rint (_margin_y * .45); // TODO grow?
+	const double bxw  = rint ((_innerwidth * .95) / ((_n_plugins) + .2 * (_n_plugins - 1)));
+	const double bxw2 = rint (bxw * .5);
+	const double y_in = _margin_y;
+	const double y_out = _height - _margin_y;
+
+	_bxw2 = bxw2;
+	_bxh2 = bxh2;
+
+	const double dx = _pin_box_size * .5;
+
+	uint32_t sc_cnt = 0;
+	for (CtrlElemList::iterator i = _elements.begin (); i != _elements.end (); ++i) {
+		switch (i->e->ct) {
+			case Input:
+				if (i->e->sc) {
+					i->x = _innerwidth + _margin_x - dx;
+					i->y = y_in + (sc_cnt + .5) * _pin_box_size;
+					i->h = _pin_box_size;
+					i->w = 1.5 * _pin_box_size;
+					++ sc_cnt;
+				} else {
+					uint32_t idx = i->e->id;
+					if (i->e->dt == DataType::AUDIO) { idx += _in.n_midi (); }
+					i->x = rint ((idx + 1) * _width / (1. + _n_inputs)) - 0.5 - dx;
+					i->w = _pin_box_size;
+					i->h = 1.5 * _pin_box_size;
+					i->y = y_in - i->h;
+				}
+				break;
+			case Output:
+				{
+					uint32_t idx = i->e->id;
+					if (i->e->dt == DataType::AUDIO) { idx += _out.n_midi (); }
+					i->x = rint ((idx + 1) * _width / (1. + _out.n_total ())) - 0.5 - dx;
+					i->y = y_out;
+					i->w = _pin_box_size;
+					i->h = 1.5 * _pin_box_size;
+				}
+				break;
+			case Sink:
+				{
+					uint32_t idx = i->e->id;
+					if (i->e->dt == DataType::AUDIO) { idx += _sinks.n_midi (); }
+					const double x0 = rint ((i->e->ip + .5) * _innerwidth / (double)(_n_plugins)) - .5 - bxw2;
+					i->x = _margin_x + rint (x0 + (idx + 1) * bxw / (1. + _sinks.n_total ())) - .5 - dx;
+					i->y = yc - bxh2 - dx;
+					i->w = _pin_box_size;
+					i->h = _pin_box_size;
+				}
+				break;
+			case Source:
+				{
+					uint32_t idx = i->e->id;
+					if (i->e->dt == DataType::AUDIO) { idx += _sources.n_midi (); }
+					const double x0 = rint ((i->e->ip + .5) * _innerwidth / (double)(_n_plugins)) - .5 - bxw2;
+					i->x = _margin_x + rint (x0 + (idx + 1) * bxw / (1. + _sources.n_total ())) - .5 - dx;
+					i->y = yc + bxh2 - dx;
+					i->w = _pin_box_size;
+					i->h = _pin_box_size;
+				}
+				break;
+		}
+	}
+}
+
+void
+PluginPinWidget::set_color (cairo_t* cr, bool midi)
+{
+	// see also gtk2_ardour/processor_box.cc
+	static const uint32_t audio_port_color = 0x4A8A0EFF; // Green
+	static const uint32_t midi_port_color = 0x960909FF; //Red
+
+	if (midi) {
+		cairo_set_source_rgb (cr,
+				UINT_RGBA_R_FLT (midi_port_color),
+				UINT_RGBA_G_FLT (midi_port_color),
+				UINT_RGBA_B_FLT (midi_port_color));
+	} else {
+		cairo_set_source_rgb (cr,
+				UINT_RGBA_R_FLT (audio_port_color),
+				UINT_RGBA_G_FLT (audio_port_color),
+				UINT_RGBA_B_FLT (audio_port_color));
+	}
+}
+
+void
+PluginPinWidget::draw_io_pin (cairo_t* cr, const CtrlWidget& w)
+{
+	if (w.e->sc) {
+		const double dy = w.h * .5;
+		const double dx = w.w - dy;
+		cairo_move_to (cr, w.x, w.y + dy);
+		cairo_rel_line_to (cr,  dy, -dy);
+		cairo_rel_line_to (cr,  dx,  0);
+		cairo_rel_line_to (cr,   0,  w.h);
+		cairo_rel_line_to (cr, -dx,  0);
+	} else {
+		const double dir = (w.e->ct == Input) ? 1 : -1;
+		const double dx = w.w * .5;
+		const double dy = w.h - dx;
+
+		cairo_move_to (cr, w.x + dx, w.y + ((w.e->ct == Input) ? w.h : 0));
+		cairo_rel_line_to (cr,     -dx, -dx * dir);
+		cairo_rel_line_to (cr,      0., -dy * dir);
+		cairo_rel_line_to (cr, 2. * dx,        0.);
+		cairo_rel_line_to (cr,      0.,  dy * dir);
+	}
+	cairo_close_path  (cr);
+
+	cairo_set_line_width (cr, 1.0);
+	cairo_set_source_rgb (cr, 0, 0, 0);
+	cairo_stroke_preserve (cr);
+
+	set_color (cr, w.e->dt == DataType::MIDI);
+
+	if (w.e->sc) {
+		assert (w.e->ct == Input);
+		cairo_fill_preserve (cr);
+		cairo_set_source_rgba (cr, 0.0, 0.0, 1.0, 0.4);
+	}
+
+	if (w.e == _selection || w.e == _actor) {
+		cairo_fill_preserve (cr);
+		cairo_set_source_rgba (cr, 0.9, 0.9, 1.0, 0.6);
+	} else if (w.prelight) {
+		cairo_fill_preserve (cr);
+		cairo_set_source_rgba (cr, 0.9, 0.9, 0.9, 0.3);
+	}
+	cairo_fill (cr);
+}
+
+void
+PluginPinWidget::draw_plugin_pin (cairo_t* cr, const CtrlWidget& w)
+{
+	const double dx = w.w * .5;
+	const double dy = w.h * .5;
+
+	cairo_move_to (cr, w.x + dx, w.y);
+	cairo_rel_line_to (cr, -dx,  dy);
+	cairo_rel_line_to (cr,  dx,  dy);
+	cairo_rel_line_to (cr,  dx, -dy);
+	cairo_close_path  (cr);
+
+	cairo_set_line_width (cr, 1.0);
+	cairo_set_source_rgb (cr, 0, 0, 0);
+	cairo_stroke_preserve (cr);
+
+	set_color (cr, w.e->dt == DataType::MIDI);
+
+	if (w.e->sc) {
+		assert (w.e->ct == Sink);
+		cairo_fill_preserve (cr);
+		cairo_set_source_rgba (cr, 0.0, 0.0, 1.0, 0.4);
+	}
+
+	if (w.e == _selection || w.e == _actor) {
+		cairo_fill_preserve (cr);
+		cairo_set_source_rgba (cr, 0.9, 0.9, 1.0, 0.6);
+	} else if (w.prelight) {
+		cairo_fill_preserve (cr);
+		cairo_set_source_rgba (cr, 0.9, 0.9, 0.9, 0.3);
+	}
+	cairo_fill (cr);
+
+	if ((w.prelight || w.e == _selection) && !w.name.empty ()) {
+		int text_width;
+		int text_height;
+		Glib::RefPtr<Pango::Layout> layout;
+		layout = Pango::Layout::create (get_pango_context ());
+		layout->set_text (w.name);
+		layout->get_pixel_size (text_width, text_height);
+
+		rounded_rectangle (cr, w.x + dx - .5 * text_width - 2, w.y - text_height - 2,  text_width + 4, text_height + 2, 7);
+		cairo_set_source_rgba (cr, 0, 0, 0, .5);
+		cairo_fill (cr);
+
+		cairo_move_to (cr, w.x + dx - .5 * text_width, w.y - text_height - 1);
+		cairo_set_source_rgba (cr, 1., 1., 1., 1.);
+		pango_cairo_show_layout (cr, layout->gobj ());
+	}
+}
+
+double
+PluginPinWidget::pin_x_pos (uint32_t i, double x0, double width, uint32_t n_total, uint32_t n_midi, bool midi)
+{
+	if (!midi) { i += n_midi; }
+	return rint (x0 + (i + 1) * width / (1. + n_total)) - .5;
+}
+
+const PluginPinWidget::CtrlWidget&
+PluginPinWidget::get_io_ctrl (CtrlType ct, DataType dt, uint32_t id, uint32_t ip) const
+{
+	for (CtrlElemList::const_iterator i = _elements.begin (); i != _elements.end (); ++i) {
+		if (i->e->ct == ct && i->e->dt == dt && i->e->id == id && i->e->ip == ip) {
+			return *i;
+		}
+	}
+	assert (0);
+	fatal << string_compose (_("programming error: %1"),
+			X_("Invalid Plugin I/O Port."))
+		<< endmsg;
+	abort (); /*NOTREACHED*/
+	static CtrlWidget screw_old_compilers ("", Input, DataType::NIL, 0);
+	return screw_old_compilers;
+}
+
+void
+PluginPinWidget::edge_coordinates (const CtrlWidget& w, double &x, double &y)
+{
+	switch (w.e->ct) {
+		case Input:
+			if (w.e->sc) {
+				x = w.x;
+				y = w.y + w.h * .5;
+			} else {
+				x = w.x + w.w * .5;
+				y = w.y + w.h;
+			}
+			break;
+		case Output:
+			x = w.x + w.w * .5;
+			y = w.y;
+			break;
+		case Sink:
+			x = w.x + w.w * .5;
+			y = w.y;
+			break;
+		case Source:
+			x = w.x + w.w * .5;
+			y = w.y + w.h;
+			break;
+	}
+}
+
+void
+PluginPinWidget::draw_connection (cairo_t* cr, double x0, double x1, double y0, double y1, bool midi, bool horiz, bool dashed)
+{
+	const double bz = 2 * _pin_box_size;
+	double bc = (dashed && x0 == x1) ? 1.25 * _pin_box_size : 0;
+	if (x0 > _width * .5) { bc *= -1; }
+
+	cairo_move_to (cr, x0, y0);
+	if (horiz) {
+		cairo_curve_to (cr, x0 - bz, y0 + bc, x1 - bc, y1 - bz, x1, y1);
+	} else {
+		cairo_curve_to (cr, x0 - bc, y0 + bz, x1 - bc, y1 - bz, x1, y1);
+	}
+	cairo_set_line_width (cr, 3.0);
+	cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND);
+	cairo_set_source_rgb (cr, 1, 0, 0);
+	if (dashed) {
+		const double dashes[] = { 5, 7 };
+		cairo_set_dash (cr, dashes, 2, 0);
+	}
+	set_color (cr, midi);
+	cairo_stroke (cr);
+	if (dashed) {
+		cairo_set_dash (cr, 0, 0, 0);
+	}
+}
+
+void
+PluginPinWidget::draw_connection (cairo_t* cr, const CtrlWidget& w0, const CtrlWidget& w1, bool dashed)
+{
+	double x0, x1, y0, y1;
+	edge_coordinates (w0, x0, y0);
+	edge_coordinates (w1, x1, y1);
+	assert (w0.e->dt == w1.e->dt);
+	draw_connection (cr, x0, x1, y0, y1, w0.e->dt == DataType::MIDI, w0.e->sc, dashed);
+}
+
+
+bool
+PluginPinWidget::darea_expose_event (GdkEventExpose* ev)
+{
+	Gtk::Allocation a = darea.get_allocation ();
+	double const width = a.get_width ();
+	double const height = a.get_height ();
+
+	if (!_position_valid) {
+		_width = width;
+		_height = height;
+		update_element_pos ();
+		_position_valid = true;
+	}
+
+	cairo_t* cr = gdk_cairo_create (darea.get_window ()->gobj ());
+	cairo_rectangle (cr, ev->area.x, ev->area.y, ev->area.width, ev->area.height);
+	cairo_clip (cr);
+
+	Gdk::Color const bg = get_style ()->get_bg (STATE_NORMAL);
+	cairo_set_source_rgb (cr, bg.get_red_p (), bg.get_green_p (), bg.get_blue_p ());
+	cairo_rectangle (cr, 0, 0, width, height);
+	cairo_fill (cr);
+
+	const double yc = rint (_height * .5);
+
+	/* processor box */
+	rounded_rectangle (cr, _margin_x, _margin_y - _pin_box_size * .5, _innerwidth, _height - 2 * _margin_y + _pin_box_size, 7);
+	cairo_set_line_width (cr, 1.0);
+	cairo_set_source_rgb (cr, .1, .1, .3);
+	cairo_stroke_preserve (cr);
+	cairo_set_source_rgb (cr, .3, .3, .3);
+	cairo_fill (cr);
+
+	/* labels */
+	Glib::RefPtr<Pango::Layout> layout;
+	layout = Pango::Layout::create (get_pango_context ());
+
+	layout->set_ellipsize (Pango::ELLIPSIZE_MIDDLE);
+	layout->set_width (_height * PANGO_SCALE);
+
+	int text_width;
+	int text_height;
+
+	layout->set_text (_route ()->name ());
+	layout->get_pixel_size (text_width, text_height);
+	cairo_save (cr);
+	cairo_move_to (cr, .5 * (_margin_x - text_height), .5 * (_height + text_width));
+	cairo_rotate (cr, M_PI * -.5);
+	cairo_set_source_rgba (cr, 1., 1., 1., 1.);
+	pango_cairo_show_layout (cr, layout->gobj ());
+	cairo_new_path (cr);
+	cairo_restore (cr);
+
+	layout->set_width ((_innerwidth - 2 * _pin_box_size) * PANGO_SCALE);
+	layout->set_text (_pi->name ());
+	layout->get_pixel_size (text_width, text_height);
+	cairo_move_to (cr, _margin_x + _innerwidth - text_width - _pin_box_size * .5, _height - _margin_y - text_height);
+	cairo_set_source_rgba (cr, 1., 1., 1., 1.);
+	pango_cairo_show_layout (cr, layout->gobj ());
+
+#ifndef NDEBUG
+	if (_pi->signal_latency () > 0 || !_pi->inplace()) {
+		layout->set_width ((_innerwidth - 2 * _pin_box_size) * PANGO_SCALE);
+		if (_pi->signal_latency () > 0 && !_pi->inplace()) {
+			layout->set_text (string_compose (_("Latency %1 spl%2 %3"), _pi->signal_latency (), ", ", _("no-inplace")));
+		} else if (_pi->signal_latency () > 0) {
+			layout->set_text (string_compose (_("Latency %1 spl"), _pi->signal_latency ()));
+		} else {
+			layout->set_text (_("no-inplace"));
+		}
+		layout->get_pixel_size (text_width, text_height);
+		cairo_move_to (cr, _margin_x + _pin_box_size * .5, _margin_y + 2);
+		cairo_set_source_rgba (cr, 1., 1., 1., 1.);
+		pango_cairo_show_layout (cr, layout->gobj ());
+	}
+#endif
+
+	if (_pi->strict_io () && !Profile->get_mixbus ()) {
+		layout->set_text (_("Strict I/O"));
+		layout->get_pixel_size (text_width, text_height);
+		const double sx0 = _margin_x + .5 * (_innerwidth - text_width);
+		const double sy0 = _height - 3 - text_height;
+
+		rounded_rectangle (cr, sx0 - 2, sy0 - 1, text_width + 4, text_height + 2, 7);
+		cairo_set_source_rgba (cr, .4, .3, .1, 1.);
+		cairo_fill (cr);
+
+		cairo_set_source_rgba (cr, 1., 1., 1., 1.);
+		cairo_move_to (cr, sx0, sy0);
+		cairo_set_source_rgba (cr, 1., 1., 1., 1.);
+		pango_cairo_show_layout (cr, layout->gobj ());
+	}
+
+	/* draw midi-bypass (behind) */
+	if (_has_midi_bypass) {
+		const CtrlWidget& cw0 = get_io_ctrl (Input, DataType::MIDI, 0);
+		const CtrlWidget& cw1 = get_io_ctrl (Output, DataType::MIDI, 0);
+		draw_connection (cr, cw0, cw1, true);
+	}
+
+	/* thru connections */
+	const ChanMapping::Mappings thru_map (_thru_map.mappings ());
+	for (ChanMapping::Mappings::const_iterator t = thru_map.begin (); t != thru_map.end (); ++t) {
+		for (ChanMapping::TypeMapping::const_iterator c = (*t).second.begin (); c != (*t).second.end () ; ++c) {
+			const CtrlWidget& cw0 = get_io_ctrl (Output, t->first, c->first);
+			const CtrlWidget& cw1 = get_io_ctrl (Input, t->first, c->second);
+			if (!(_dragging && cw1.e == _selection && cw0.e == _drag_dst)) {
+				draw_connection (cr, cw1, cw0, true);
+			}
+		}
+	}
+
+	/* plugins & connection wires */
+	for (uint32_t i = 0; i < _n_plugins; ++i) {
+		double x0 = _margin_x + rint ((i + .5) * _innerwidth / (double)(_n_plugins)) - .5;
+
+		/* plugin box */
+		cairo_set_source_rgb (cr, .5, .5, .5);
+		rounded_rectangle (cr, x0 - _bxw2, yc - _bxh2, 2 * _bxw2, 2 * _bxh2, 7);
+		cairo_fill (cr);
+
+		layout->set_width (1.9 * _bxw2 * PANGO_SCALE);
+		layout->set_text (string_compose (_("Instance #%1"), i + 1));
+		layout->get_pixel_size (text_width, text_height);
+		cairo_move_to (cr, x0 - text_width * .5, yc - text_height * .5);
+		cairo_set_source_rgba (cr, 1., 1., 1., 1.);
+		pango_cairo_show_layout (cr, layout->gobj ());
+
+		const ChanMapping::Mappings in_map = _in_map[i].mappings ();
+		const ChanMapping::Mappings out_map = _out_map[i].mappings ();
+
+		for (ChanMapping::Mappings::const_iterator t = in_map.begin (); t != in_map.end (); ++t) {
+			for (ChanMapping::TypeMapping::const_iterator c = (*t).second.begin (); c != (*t).second.end () ; ++c) {
+				const CtrlWidget& cw0 = get_io_ctrl (Input, t->first, c->second);
+				const CtrlWidget& cw1 = get_io_ctrl (Sink, t->first, c->first, i);
+				if (!(_dragging && cw0.e == _selection && cw1.e == _drag_dst)) {
+					draw_connection (cr, cw0, cw1);
+				}
+			}
+		}
+
+		for (ChanMapping::Mappings::const_iterator t = out_map.begin (); t != out_map.end (); ++t) {
+			for (ChanMapping::TypeMapping::const_iterator c = (*t).second.begin (); c != (*t).second.end () ; ++c) {
+				const CtrlWidget& cw0 = get_io_ctrl (Source, t->first, c->first, i);
+				const CtrlWidget& cw1 = get_io_ctrl (Output, t->first, c->second);
+				if (!(_dragging && cw0.e == _selection && cw1.e == _drag_dst)) {
+					draw_connection (cr, cw0, cw1);
+				}
+			}
+		}
+	}
+
+	/* pins and ports */
+	for (CtrlElemList::const_iterator i = _elements.begin (); i != _elements.end (); ++i) {
+		switch (i->e->ct) {
+			case Input:
+			case Output:
+				draw_io_pin (cr, *i);
+				break;
+			case Sink:
+			case Source:
+				draw_plugin_pin (cr, *i);
+				break;
+		}
+	}
+
+	/* DnD wire */
+	CtrlWidget *drag_src = NULL;
+	if (_dragging) {
+		for (CtrlElemList::iterator i = _elements.begin (); i != _elements.end (); ++i) {
+			if (i->e  == _selection ) {
+				drag_src = &(*i);
+			}
+		}
+	}
+
+	if (drag_src) {
+		double x0, y0;
+		if (_selection->ct == Input || _selection->ct == Source) {
+			edge_coordinates (*drag_src, x0, y0);
+			draw_connection (cr, x0, _drag_x, y0, _drag_y,
+					_selection->dt == DataType::MIDI, _selection->sc);
+		} else {
+			edge_coordinates (*drag_src, x0, y0);
+			draw_connection (cr, _drag_x, x0, _drag_y, y0,
+					_selection->dt == DataType::MIDI, _selection->sc);
+		}
+	}
+
+	cairo_destroy (cr);
+	return true;
+}
+
+void
+PluginPinWidget::darea_size_request (Gtk::Requisition* req)
+{
+	req->width = _min_width;
+	req->height = _min_height;
+}
+
+void
+PluginPinWidget::darea_size_allocate (Gtk::Allocation&)
+{
+	_position_valid = false;
+}
+
+bool
+PluginPinWidget::drag_type_matches (const CtrlElem& e)
+{
+	if (!_dragging || !_selection) {
+		return true;
+	}
+	if (_selection->dt != e->dt) {
+		return false;
+	}
+	if (_selection->ct == Input  && e->ct == Sink)   { return true; }
+	if (_selection->ct == Sink   && e->ct == Input)  { return true; }
+	if (_selection->ct == Output && e->ct == Source) { return true; }
+	if (_selection->ct == Source && e->ct == Output) { return true; }
+	if (_selection->ct == Input  && e->ct == Output) { return true; }
+	if (_selection->ct == Output && e->ct == Input)  { return true; }
+	return false;
+}
+
+void
+PluginPinWidget::start_drag (const CtrlElem& e, double x, double y)
+{
+	assert (_selection == e);
+	_drag_dst.reset ();
+	if (e->ct == Sink) {
+		bool valid;
+		const ChanMapping& map (_in_map[e->ip]);
+		uint32_t idx = map.get (e->dt, e->id, &valid);
+		if (valid) {
+			const CtrlWidget& cw = get_io_ctrl (Input, e->dt, idx, 0);
+			_drag_dst = e;
+			_selection = cw.e;
+		}
+	}
+	else if (e->ct == Output) {
+		for (uint32_t i = 0; i < _n_plugins; ++i) {
+			bool valid;
+			const ChanMapping& map (_out_map[i]);
+			uint32_t idx = map.get_src (e->dt, e->id, &valid);
+			if (valid) {
+				const CtrlWidget& cw = get_io_ctrl (Source, e->dt, idx, i);
+				_drag_dst = e;
+				_selection = cw.e;
+				break;
+			}
+		}
+		if (!_drag_dst) {
+			bool valid;
+			const ChanMapping& map (_thru_map);
+			uint32_t idx = map.get (e->dt, e->id, &valid);
+			if (valid) {
+				const CtrlWidget& cw = get_io_ctrl (Input, e->dt, idx, 0);
+				_drag_dst = e;
+				_selection = cw.e;
+			}
+		}
+	}
+	_dragging = true;
+	_drag_x = x;
+	_drag_y = y;
+}
+
+bool
+PluginPinWidget::darea_motion_notify_event (GdkEventMotion* ev)
+{
+	bool changed = false;
+	_hover.reset ();
+	for (CtrlElemList::iterator i = _elements.begin (); i != _elements.end (); ++i) {
+		if (ev->x >= i->x && ev->x <= i->x + i->w
+				&& ev->y >= i->y && ev->y <= i->y + i->h
+				&& drag_type_matches (i->e))
+		{
+			if (!i->prelight) changed = true;
+			i->prelight = true;
+			_hover = i->e;
+		} else {
+			if (i->prelight) changed = true;
+			i->prelight = false;
+		}
+	}
+	if (_dragging) {
+		_drag_x = ev->x;
+		_drag_y = ev->y;
+	}
+	if (changed || _dragging) {
+		darea.queue_draw ();
+	}
+	return true;
+}
+
+bool
+PluginPinWidget::darea_button_press_event (GdkEventButton* ev)
+{
+	if (ev->type != GDK_BUTTON_PRESS) {
+		return false;
+	}
+
+	switch (ev->button) {
+		case 1:
+			_drag_dst.reset ();
+			if (!_selection || (_selection && !_hover)) {
+				_selection = _hover;
+				_actor.reset ();
+				if (_selection) {
+					start_drag (_selection, ev->x, ev->y);
+				} else {
+					darea.queue_draw ();
+				}
+			} else if (_selection && _hover && _selection != _hover) {
+				if (_selection->dt != _hover->dt) { _actor.reset (); }
+				else if (_selection->ct == Input  && _hover->ct == Sink)   { _actor = _hover; }
+				else if (_selection->ct == Sink   && _hover->ct == Input)  { _actor = _hover; }
+				else if (_selection->ct == Output && _hover->ct == Source) { _actor = _hover; }
+				else if (_selection->ct == Source && _hover->ct == Output) { _actor = _hover; }
+				else if (_selection->ct == Input  && _hover->ct == Output) { _actor = _hover; }
+				else if (_selection->ct == Output && _hover->ct == Input)  { _actor = _hover; }
+				if (!_actor) {
+					_selection = _hover;
+					start_drag (_selection, ev->x, ev->y);
+				} else {
+					darea.queue_draw ();
+				}
+			} else if (_hover) {
+				_selection = _hover;
+				_actor.reset ();
+				start_drag (_selection, ev->x, ev->y);
+			}
+			break;
+		case 3:
+			_drag_dst.reset ();
+			if (_selection != _hover) {
+				_selection = _hover;
+				darea.queue_draw ();
+			}
+			_actor.reset ();
+			break;
+		default:
+			break;
+	}
+
+	return true;
+}
+
+bool
+PluginPinWidget::darea_button_release_event (GdkEventButton* ev)
+{
+	if (_dragging && _selection && _drag_dst && _drag_dst == _hover) {
+		// select click. (or re-connect same)
+		assert (_selection != _hover);
+		_actor.reset ();
+		_dragging = false;
+		_drag_dst.reset ();
+		_selection =_hover;
+		darea.queue_draw ();
+		return true;
+	}
+
+	if (_dragging && _hover && _hover != _selection) {
+		_actor = _hover;
+	}
+
+	if (_hover == _actor && _actor && ev->button == 1) {
+		assert (_selection);
+		assert (_selection->dt == _actor->dt);
+		if (_drag_dst) {
+			assert (_dragging && _selection != _drag_dst);
+			handle_disconnect (_drag_dst, true);
+		}
+		if      (_selection->ct == Input && _actor->ct == Sink) {
+			handle_input_action (_actor, _selection);
+		}
+		else if (_selection->ct == Sink && _actor->ct == Input) {
+			handle_input_action (_selection, _actor);
+		}
+		else if (_selection->ct == Output && _actor->ct == Source) {
+			handle_output_action (_actor, _selection);
+		}
+		else if (_selection->ct == Source && _actor->ct == Output) {
+			handle_output_action (_selection, _actor);
+		}
+		else if (_selection->ct == Input && _actor->ct == Output) {
+			handle_thru_action (_actor, _selection);
+		}
+		else if (_selection->ct == Output && _actor->ct == Input) {
+			handle_thru_action (_selection, _actor);
+		}
+		_selection.reset ();
+	} else if (_hover == _selection && _selection && ev->button == 3) {
+		handle_disconnect (_selection);
+	} else if (!_hover && ev->button == 3) {
+		reset_menu.popup (1, ev->time);
+	}
+
+	if (_dragging && _hover != _selection) {
+		_selection.reset ();
+	}
+	_actor.reset ();
+	_dragging = false;
+	_drag_dst.reset ();
+	darea.queue_draw ();
+	return true;
+}
+
+void
+PluginPinWidget::handle_input_action (const CtrlElem &s, const CtrlElem &i)
+{
+	const int pc = s->ip;
+	bool valid;
+	ChanMapping in_map (_pi->input_map (pc));
+	uint32_t idx = in_map.get (s->dt, s->id, &valid);
+
+	if (valid && idx == i->id) {
+		// disconnect
+		if (!_dragging) {
+			in_map.unset (s->dt, s->id);
+			_pi->set_input_map (pc, in_map);
+		} else {
+			plugin_reconfigured ();
+		}
+	}
+	else if (!valid) {
+		// connect
+		in_map.set (s->dt, s->id, i->id);
+		_pi->set_input_map (pc, in_map);
+	}
+	else {
+		// reconnect
+		in_map.unset (s->dt, s->id);
+		in_map.set (s->dt, s->id, i->id);
+		_pi->set_input_map (pc, in_map);
+	}
+}
+
+void
+PluginPinWidget::disconnect_other_outputs (uint32_t skip_pc, DataType dt, uint32_t id)
+{
+	_ignore_updates = true;
+	for (uint32_t n = 0; n < _n_plugins; ++n) {
+		if (n == skip_pc) {
+			continue;
+		}
+		bool valid;
+		ChanMapping n_out_map (_pi->output_map (n));
+		uint32_t idx = n_out_map.get_src (dt, id, &valid);
+		if (valid) {
+			n_out_map.unset (dt, idx);
+			_pi->set_output_map (n, n_out_map);
+		}
+	}
+	_ignore_updates = false;
+}
+
+void
+PluginPinWidget::disconnect_other_thru (DataType dt, uint32_t id)
+{
+	_ignore_updates = true;
+	bool valid;
+	ChanMapping n_thru_map (_pi->thru_map ());
+	n_thru_map.get (dt, id, &valid);
+	if (valid) {
+		n_thru_map.unset (dt, id);
+		_pi->set_thru_map (n_thru_map);
+	}
+	_ignore_updates = false;
+}
+
+void
+PluginPinWidget::handle_output_action (const CtrlElem &s, const CtrlElem &o)
+{
+	const uint32_t pc = s->ip;
+	bool valid;
+	ChanMapping out_map (_pi->output_map (pc));
+	uint32_t idx = out_map.get (s->dt, s->id, &valid);
+
+	if (valid && idx == o->id) {
+		// disconnect
+		if (!_dragging) {
+			out_map.unset (s->dt, s->id);
+			_pi->set_output_map (pc, out_map);
+		} else {
+			plugin_reconfigured ();
+		}
+	}
+	else {
+		// disconnect source
+		disconnect_other_outputs (pc, s->dt, o->id);
+		disconnect_other_thru (s->dt, o->id);
+		out_map = _pi->output_map (pc); // re-read map
+		if (valid) {
+			out_map.unset (s->dt, s->id);
+		}
+		idx = out_map.get_src (s->dt, o->id, &valid);
+		if (valid) {
+			out_map.unset (s->dt, idx);
+		}
+		// connect
+		out_map.set (s->dt, s->id, o->id);
+		_pi->set_output_map (pc, out_map);
+	}
+}
+
+void
+PluginPinWidget::handle_thru_action (const CtrlElem &o, const CtrlElem &i)
+{
+	bool valid;
+	ChanMapping thru_map (_pi->thru_map ());
+	uint32_t idx = thru_map.get (o->dt, o->id, &valid);
+
+	if (valid && idx == i->id) {
+		if (!_dragging) {
+			thru_map.unset (o->dt, o->id);
+		}
+	} else {
+		// disconnect other outputs first
+		disconnect_other_outputs (UINT32_MAX, o->dt, o->id);
+		disconnect_other_thru (o->dt, o->id);
+		thru_map = _pi->thru_map (); // re-read map
+
+		thru_map.set (o->dt, o->id, i->id);
+	}
+	_pi->set_thru_map (thru_map);
+}
+
+bool
+PluginPinWidget::handle_disconnect (const CtrlElem &e, bool no_signal)
+{
+	_ignore_updates = true;
+	bool changed = false;
+	bool valid;
+
+	switch (e->ct) {
+		case Input:
+			{
+				ChanMapping n_thru_map (_pi->thru_map ());
+				for (uint32_t i = 0; i < _sources.n_total (); ++i) {
+					uint32_t idx = n_thru_map.get (e->dt, i, &valid);
+					if (valid && idx == e->id) {
+						n_thru_map.unset (e->dt, i);
+						changed = true;
+					}
+				}
+				if (changed) {
+					_pi->set_thru_map (n_thru_map);
+				}
+			}
+			for (uint32_t n = 0; n < _n_plugins; ++n) {
+				ChanMapping map (_pi->input_map (n));
+				for (uint32_t i = 0; i < _sinks.n_total (); ++i) {
+					uint32_t idx = map.get (e->dt, i, &valid);
+					if (valid && idx == e->id) {
+						map.unset (e->dt, i);
+						changed = true;
+					}
+				}
+				_pi->set_input_map (n, map);
+			}
+			break;
+		case Sink:
+			{
+				ChanMapping map (_pi->input_map (e->ip));
+				map.get (e->dt, e->id, &valid);
+				if (valid) {
+					map.unset (e->dt, e->id);
+					_pi->set_input_map (e->ip, map);
+					changed = true;
+				}
+			}
+			break;
+		case Source:
+			{
+				ChanMapping map (_pi->output_map (e->ip));
+				map.get (e->dt, e->id, &valid);
+				if (valid) {
+					map.unset (e->dt, e->id);
+					_pi->set_output_map (e->ip, map);
+					changed = true;
+				}
+			}
+			break;
+		case Output:
+			for (uint32_t n = 0; n < _n_plugins; ++n) {
+				ChanMapping map (_pi->output_map (n));
+				for (uint32_t i = 0; i < _sources.n_total (); ++i) {
+					uint32_t idx = map.get (e->dt, i, &valid);
+					if (valid && idx == e->id) {
+						map.unset (e->dt, i);
+						changed = true;
+					}
+				}
+				if (changed) {
+					_pi->set_output_map (n, map);
+				}
+			}
+			{
+				ChanMapping n_thru_map (_pi->thru_map ());
+				n_thru_map.get (e->dt, e->id, &valid);
+				if (valid) {
+					n_thru_map.unset (e->dt, e->id);
+					changed = true;
+					_pi->set_thru_map (n_thru_map);
+				}
+			}
+			break;
+	}
+	_ignore_updates = false;
+	if (changed && !no_signal) {
+		plugin_reconfigured ();
+	}
+	return changed;
+}
+
+void
+PluginPinWidget::toggle_sidechain ()
+{
+	if (_session && _session->actively_recording ()) { return; }
+	_route ()->add_remove_sidechain (_pi, !_pi->has_sidechain ());
+}
+
+void
+PluginPinWidget::connect_sidechain ()
+{
+	if (!_session) { return; }
+
+	if (_sidechain_selector == 0) {
+		_sidechain_selector = new IOSelectorWindow (_session, _pi->sidechain_input ());
+	}
+
+	if (_sidechain_selector->is_visible ()) {
+		_sidechain_selector->get_toplevel ()->get_window ()->raise ();
+	} else {
+		_sidechain_selector->present ();
+	}
+}
+
+void
+PluginPinWidget::reset_configuration ()
+{
+	if (_set_config.get_active ()) {
+		_route ()->reset_plugin_insert (_pi);
+	} else {
+		_route ()->customize_plugin_insert (_pi, _n_plugins, _out, _sinks);
+	}
+}
+
+void
+PluginPinWidget::reset_mapping ()
+{
+	_pi->reset_map ();
+}
+
+void
+PluginPinWidget::select_output_preset (uint32_t n_audio)
+{
+	if (_session && _session->actively_recording ()) { return; }
+	ChanCount out (DataType::AUDIO, n_audio);
+	_route ()->plugin_preset_output (_pi, out);
+}
+
+void
+PluginPinWidget::add_remove_plugin_clicked (bool add)
+{
+	if (_session && _session->actively_recording ()) { return; }
+	ChanCount out = _out;
+	ChanCount sinks = _sinks;
+	assert (add || _n_plugins > 0);
+	_route ()->customize_plugin_insert (_pi, _n_plugins + (add ? 1 : -1), out, sinks);
+}
+
+void
+PluginPinWidget::add_remove_port_clicked (bool add, ARDOUR::DataType dt)
+{
+	if (_session && _session->actively_recording ()) { return; }
+	ChanCount out = _out;
+	ChanCount sinks = _sinks;
+	assert (add || out.get (dt) > 0);
+	out.set (dt, out.get (dt) + (add ? 1 : -1));
+	_route ()->customize_plugin_insert (_pi, _n_plugins, out, sinks);
+}
+
+void
+PluginPinWidget::add_remove_inpin_clicked (bool add, ARDOUR::DataType dt)
+{
+	if (_session && _session->actively_recording ()) { return; }
+	ChanCount out = _out;
+	ChanCount sinks = _sinks;
+	assert (add || sinks.get (dt) > 0);
+	sinks.set (dt, sinks.get (dt) + (add ? 1 : -1));
+	_route ()->customize_plugin_insert (_pi, _n_plugins, out, sinks);
+}
+
+void
+PluginPinWidget::add_sidechain_port (DataType dt)
+{
+	if (_session && _session->actively_recording ()) { return; }
+	boost::shared_ptr<IO> io = _pi->sidechain_input ();
+	if (!io) {
+		return;
+	}
+
+	// this triggers a PluginIoReConfigure with process and processor write lock held
+	// from /this/ thread.
+	io->add_port ("", this, dt);
+}
+
+void
+PluginPinWidget::remove_port (boost::weak_ptr<ARDOUR::Port> wp)
+{
+	if (_session && _session->actively_recording ()) { return; }
+	boost::shared_ptr<ARDOUR::Port> p = wp.lock ();
+	boost::shared_ptr<IO> io = _pi->sidechain_input ();
+	if (!io || !p) {
+		return;
+	}
+	io->remove_port (p, this);
+}
+
+void
+PluginPinWidget::disconnect_port (boost::weak_ptr<ARDOUR::Port> wp)
+{
+	if (_session && _session->actively_recording ()) { return; }
+	boost::shared_ptr<ARDOUR::Port> p = wp.lock ();
+	boost::shared_ptr<IO> io = _pi->sidechain_input ();
+	if (!io || !p) {
+		return;
+	}
+	p->disconnect_all ();
+}
+
+void
+PluginPinWidget::connect_port (boost::weak_ptr<ARDOUR::Port> wp0, boost::weak_ptr<ARDOUR::Port> wp1)
+{
+	if (_session && _session->actively_recording ()) { return; }
+	boost::shared_ptr<ARDOUR::Port> p0 = wp0.lock ();
+	boost::shared_ptr<ARDOUR::Port> p1 = wp1.lock ();
+	boost::shared_ptr<IO> io = _pi->sidechain_input ();
+	if (!io || !p0 || !p1) {
+		return;
+	}
+	_ignore_updates = true;
+	p0->disconnect_all ();
+	_ignore_updates = false;
+	p0->connect (p1->name ());
+}
+
+void
+PluginPinWidget::add_send_from (boost::weak_ptr<ARDOUR::Port> wp, boost::weak_ptr<ARDOUR::Route> wr)
+{
+	if (_session && _session->actively_recording ()) { return; }
+	boost::shared_ptr<Port> p = wp.lock ();
+	boost::shared_ptr<Route> r = wr.lock ();
+	boost::shared_ptr<IO> io = _pi->sidechain_input ();
+	if (!p || !r || !io || !_session) {
+		return;
+	}
+
+	boost::shared_ptr<Pannable> sendpan (new Pannable (*_session));
+	boost::shared_ptr<Send> send (new Send (*_session, r->pannable (), r->mute_master ()));
+	const ChanCount& outs (r->amp ()->input_streams ());
+	try {
+		Glib::Threads::Mutex::Lock lm (AudioEngine::instance ()->process_lock ());
+		send->output()->ensure_io (outs, false, this);
+	} catch (AudioEngine::PortRegistrationFailure& err) {
+		error << string_compose (_("Cannot set up new send: %1"), err.what ()) << endmsg;
+		return;
+	}
+
+	std::string sendname = send->name ();
+	string::size_type last_letter = sendname.find_last_not_of ("0123456789");
+	if (last_letter != string::npos) {
+		send->output ()->set_pretty_name (string_compose (_("SC %1 (%2)"),
+				r->name (),
+				sendname.substr (last_letter + 1)));
+	}
+
+	_ignore_updates = true;
+	p->disconnect_all ();
+
+	DataType dt = p->type ();
+	PortSet& ps (send->output ()->ports ());
+	for (PortSet::iterator i = ps.begin (dt); i != ps.end (dt); ++i) {
+		p->connect (&(**i));
+	}
+
+	send->set_remove_on_disconnect (true);
+	r->add_processor (send, PreFader);
+	_ignore_updates = false;
+	queue_idle_update ();
+}
+
+bool
+PluginPinWidget::sc_input_release (GdkEventButton *ev)
+{
+	if (_session && _session->actively_recording ()) { return false; }
+	if (ev->button == 3) {
+		connect_sidechain ();
+	}
+	return false;
+}
+
+struct RouteCompareByName {
+	bool operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b) {
+		return a->name ().compare (b->name ()) < 0;
+	}
+};
+
+bool
+PluginPinWidget::sc_input_press (GdkEventButton *ev, boost::weak_ptr<ARDOUR::Port> wp)
+{
+	using namespace Menu_Helpers;
+	if (!_session || _session->actively_recording ()) { return false; }
+	if (!_session->engine ().connected ()) { return false; }
+
+	if (ev->button == 1) {
+		MenuList& citems = input_menu.items ();
+		input_menu.set_name ("ArdourContextMenu");
+		citems.clear ();
+
+		boost::shared_ptr<Port> p = wp.lock ();
+		if (p && p->connected ()) {
+			citems.push_back (MenuElem (_("Disconnect"), sigc::bind (sigc::mem_fun (*this, &PluginPinWidget::disconnect_port), wp)));
+			citems.push_back (SeparatorElem ());
+		}
+
+#if 0
+		// TODO add system inputs, too ?!
+		boost::shared_ptr<ARDOUR::BundleList> b = _session->bundles ();
+		for (ARDOUR::BundleList::iterator i = b->begin(); i != b->end(); ++i) {
+			for (uint32_t j = 0; j < i->nchannels ().n_total (); ++j) {
+			}
+			//maybe_add_bundle_to_input_menu (*i, current);
+		}
+#endif
+
+		boost::shared_ptr<ARDOUR::RouteList> routes = _session->get_routes ();
+		RouteList copy = *routes;
+		copy.sort (RouteCompareByName ());
+		uint32_t added = 0;
+		for (ARDOUR::RouteList::const_iterator i = copy.begin (); i != copy.end (); ++i) {
+			added += maybe_add_route_to_input_menu (*i, p->type (), wp);
+		}
+
+		if (added > 0) {
+			citems.push_back (SeparatorElem ());
+		}
+		citems.push_back (MenuElem (_("Routing Grid"), sigc::mem_fun (*this, &PluginPinWidget::connect_sidechain)));
+		input_menu.popup (1, ev->time);
+	}
+	return false;
+}
+
+uint32_t
+PluginPinWidget::maybe_add_route_to_input_menu (boost::shared_ptr<Route> r, DataType dt, boost::weak_ptr<Port> wp)
+{
+	uint32_t added = 0;
+	using namespace Menu_Helpers;
+	if (r->output () == _route ()->output ()) {
+		return added;
+	}
+
+	if (_route ()->feeds_according_to_graph (r)) {
+		return added;
+	}
+
+	MenuList& citems = input_menu.items ();
+
+	/*check if there's already a send.. */
+	bool already_present = false;
+	uint32_t nth = 0;
+	boost::shared_ptr<Processor> proc;
+	/* Note: nth_send () takes a processor read-lock */
+	while ((proc = r->nth_send (nth))) {
+		boost::shared_ptr<IOProcessor> send = boost::dynamic_pointer_cast<IOProcessor> (proc);
+		if (!send || !send->output ()) {
+			++nth;
+			continue;
+		}
+		if (send->output ()->connected_to (_pi->sidechain_input ())) {
+			// only if (send->remove_on_disconnect ()) ??
+			already_present = true;
+			break;
+		}
+		++nth;
+	}
+	/* we're going to create the new send pre-fader, so check the route amp's data type.  */
+	const ChanCount& rc (r->amp ()->input_streams ());
+	if (!already_present && rc.get (dt) > 0) {
+		citems.push_back (MenuElem (r->name (), sigc::bind (sigc::mem_fun (*this, &PluginPinWidget::add_send_from), wp, boost::weak_ptr<Route> (r))));
+		++added;
+	}
+	return added;
+}
+
+void
+PluginPinWidget::port_connected_or_disconnected (boost::weak_ptr<ARDOUR::Port> w0, boost::weak_ptr<ARDOUR::Port> w1)
+{
+	boost::shared_ptr<Port> p0 = w0.lock ();
+	boost::shared_ptr<Port> p1 = w1.lock ();
+
+	boost::shared_ptr<IO> io = _pi->sidechain_input ();
+	if (!io) { return; }
+
+	if (p0 && io->has_port (p0)) {
+		queue_idle_update ();
+	}
+	else if (p1 && io->has_port (p1)) {
+		queue_idle_update ();
+	}
+}
+
+/* lifted from ProcessorEntry::Control */
+PluginPinWidget::Control::Control (boost::shared_ptr<AutomationControl> c, string const & n)
+	: _control (c)
+	, _adjustment (gain_to_slider_position_with_max (1.0, Config->get_max_gain ()), 0, 1, 0.01, 0.1)
+	, _slider (&_adjustment, boost::shared_ptr<PBD::Controllable> (), 0, max (13.f, rintf (13.f * UIConfiguration::instance ().get_ui_scale ())))
+	, _slider_persistant_tooltip (&_slider)
+	, _ignore_ui_adjustment (false)
+	, _name (n)
+{
+	_slider.set_controllable (c);
+	box.set_padding (0, 0, 4, 4);
+
+	_slider.set_name ("ProcessorControlSlider");
+	_slider.set_text (_name);
+
+	box.add (_slider);
+	_slider.show ();
+
+	const ARDOUR::ParameterDescriptor& desc = c->desc ();
+	double const lo = c->internal_to_interface (desc.lower);
+	double const up = c->internal_to_interface (desc.upper);
+	double const normal = c->internal_to_interface (desc.normal);
+	double smallstep = desc.smallstep;
+	double largestep = desc.largestep;
+
+	if (smallstep == 0.0) {
+		smallstep = up / 1000.;
+	} else {
+		smallstep = c->internal_to_interface (desc.lower + smallstep);
+	}
+
+	if (largestep == 0.0) {
+		largestep = up / 40.;
+	} else {
+		largestep = c->internal_to_interface (desc.lower + largestep);
+	}
+
+	_adjustment.set_lower (lo);
+	_adjustment.set_upper (up);
+	_adjustment.set_step_increment (smallstep);
+	_adjustment.set_page_increment (largestep);
+	_slider.set_default_value (normal);
+
+	_adjustment.signal_value_changed ().connect (sigc::mem_fun (*this, &Control::slider_adjusted));
+	// dup. currently timers are used :(
+	//c->Changed.connect (_connection, MISSING_INVALIDATOR, boost::bind (&Control::control_changed, this), gui_context ());
+
+	// yuck, do we really need to do this?
+	// according to c404374 this is only needed for send automation
+	timer_connection = Timers::rapid_connect (sigc::mem_fun (*this, &Control::control_changed));
+
+	control_changed ();
+	set_tooltip ();
+
+	/* We're providing our own PersistentTooltip */
+	set_no_tooltip_whatsoever (_slider);
+}
+
+PluginPinWidget::Control::~Control ()
+{
+	timer_connection.disconnect ();
+}
+
+void
+PluginPinWidget::Control::set_tooltip ()
+{
+	boost::shared_ptr<AutomationControl> c = _control.lock ();
+	if (!c) {
+		return;
+	}
+	char tmp[256];
+	snprintf (tmp, sizeof (tmp), "%s: %.2f", _name.c_str (), c->internal_to_user (c->get_value ()));
+
+	string sm = Gtkmm2ext::markup_escape_text (tmp);
+	_slider_persistant_tooltip.set_tip (sm);
+}
+
+void
+PluginPinWidget::Control::slider_adjusted ()
+{
+	if (_ignore_ui_adjustment) {
+		return;
+	}
+	boost::shared_ptr<AutomationControl> c = _control.lock ();
+	if (!c) {
+		return;
+	}
+	c->set_value ( c->interface_to_internal (_adjustment.get_value ()) , Controllable::NoGroup);
+	set_tooltip ();
+}
+
+
+void
+PluginPinWidget::Control::control_changed ()
+{
+	boost::shared_ptr<AutomationControl> c = _control.lock ();
+	if (!c) {
+		return;
+	}
+
+	_ignore_ui_adjustment = true;
+
+	// as long as rapid timers are used, only update the tooltip
+	// if the value has changed.
+	const double nval = c->internal_to_interface (c->get_value ());
+	if (_adjustment.get_value () != nval) {
+		_adjustment.set_value (nval);
+		set_tooltip ();
+	}
+
+	_ignore_ui_adjustment = false;
+}
+
+
+
+PluginPinDialog::PluginPinDialog (boost::shared_ptr<ARDOUR::PluginInsert> pi)
+	: ArdourWindow (string_compose (_("Pin Configuration: %1"), pi->name ()))
+{
+	ppw.push_back (PluginPinWidgetPtr(new PluginPinWidget (pi)));
+	add (*ppw.back());
+}
+
+
+PluginPinDialog::PluginPinDialog (boost::shared_ptr<ARDOUR::Route> r)
+	: ArdourWindow (string_compose (_("Pin Configuration: %1"), r->name ()))
+	, _route (r)
+{
+	vbox = manage (new VBox ());
+	add (*vbox);
+	vbox->show ();
+
+	_route->foreach_processor (sigc::mem_fun (*this, &PluginPinDialog::add_processor));
+
+	_route->processors_changed.connect (
+		_route_connections, invalidator (*this), boost::bind (&PluginPinDialog::route_processors_changed, this, _1), gui_context()
+		);
+
+	_route->DropReferences.connect (
+		_route_connections, invalidator (*this), boost::bind (&PluginPinDialog::route_going_away, this), gui_context()
+		);
+}
+void
+PluginPinDialog::set_session (ARDOUR::Session *s)
+{
+	SessionHandlePtr::set_session (s);
+	for (PluginPinWidgetList::iterator i = ppw.begin(); i != ppw.end(); ++i) {
+		(*i)->set_session (s);
+	}
+}
+
+void
+PluginPinDialog::route_processors_changed (ARDOUR::RouteProcessorChange)
+{
+	ppw.clear ();
+	remove ();
+	vbox = manage (new VBox ());
+	add (*vbox);
+	vbox->show ();
+	_route->foreach_processor (sigc::mem_fun (*this, &PluginPinDialog::add_processor));
+}
+
+void
+PluginPinDialog::route_going_away ()
+{
+	ppw.clear ();
+	_route.reset ();
+	remove ();
+}
+
+void
+PluginPinDialog::add_processor (boost::weak_ptr<Processor> p)
+{
+	boost::shared_ptr<Processor> proc = p.lock ();
+	if (!proc || !proc->display_to_user ()) {
+		return;
+	}
+	boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert> (proc);
+	if (pi) {
+		ppw.push_back (PluginPinWidgetPtr(new PluginPinWidget (pi)));
+		vbox->pack_start (*ppw.back());
+	} else {
+		HBox* hbox = manage (new HBox ());
+		hbox->pack_start (*manage (new HSeparator ()));
+		hbox->pack_start (*manage (new Label (proc->display_name ())));
+		hbox->pack_start (*manage (new HSeparator ()));
+		vbox->pack_start (*hbox);
+		hbox->show_all ();
+	}
+}
diff --git a/gtk2_ardour/plugin_pin_dialog.h b/gtk2_ardour/plugin_pin_dialog.h
new file mode 100644
index 0000000..4028607
--- /dev/null
+++ b/gtk2_ardour/plugin_pin_dialog.h
@@ -0,0 +1,243 @@
+/*
+ * Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+
+#ifndef __gtkardour_plugin_pin_dialog_h__
+#define __gtkardour_plugin_pin_dialog_h__
+
+#include <gtkmm/drawingarea.h>
+
+#include "pbd/stateful.h"
+#include "pbd/signals.h"
+
+#include "ardour/plugin_insert.h"
+#include "ardour/route.h"
+
+#include <gtkmm/box.h>
+
+#include "gtkmm2ext/pixfader.h"
+#include "gtkmm2ext/persistent_tooltip.h"
+#include "gtkmm2ext/slider_controller.h"
+
+#include "ardour_button.h"
+#include "ardour_dropdown.h"
+#include "ardour_window.h"
+#include "io_selector.h"
+
+class PluginPinWidget : public ARDOUR::SessionHandlePtr, public Gtk::VBox
+{
+public:
+	PluginPinWidget (boost::shared_ptr<ARDOUR::PluginInsert>);
+	~PluginPinWidget ();
+	void set_session (ARDOUR::Session *);
+private:
+	typedef enum {
+		Input,
+		Sink,
+		Source,
+		Output
+	} CtrlType;
+
+	struct _CtrlElem {
+		_CtrlElem (CtrlType c, ARDOUR::DataType d, uint32_t i, uint32_t p, bool s)
+			: ct (c), dt (d), id (i), ip (p), sc (s) {}
+		CtrlType ct;
+		ARDOUR::DataType dt;
+		uint32_t id; // port/pin ID
+		uint32_t ip; // plugin ID (for Sink, Source only);
+		bool sc; // sidechain
+	};
+
+	typedef boost::shared_ptr<_CtrlElem> CtrlElem;
+
+	struct CtrlWidget {
+		CtrlWidget (const std::string& n, CtrlType ct, ARDOUR::DataType dt, uint32_t id, uint32_t ip = 0, bool sc = false)
+			: name (n), x(0), y(0), w (0), h (0), prelight (false)
+		{
+			e = CtrlElem (new _CtrlElem (ct, dt, id, ip, sc));
+		}
+		std::string name;
+		double x,y;
+		double w,h;
+		bool prelight;
+		CtrlElem e;
+	};
+
+	typedef std::vector<CtrlWidget> CtrlElemList;
+
+	CtrlElem _selection;
+	CtrlElem _actor;
+	CtrlElem _hover;
+	CtrlElemList _elements;
+	CtrlElem _drag_dst;
+
+	/* cache settings for expose */
+	typedef std::map <uint32_t, ARDOUR::ChanMapping> Mappings;
+	Mappings _in_map;
+	Mappings _out_map;
+	ARDOUR::ChanMapping _thru_map;
+	bool _has_midi_bypass;
+
+
+	Gtk::DrawingArea darea;
+	ArdourButton _set_config;
+	ArdourButton _tgl_sidechain;
+	ArdourButton _add_plugin;
+	ArdourButton _del_plugin;
+	ArdourButton _add_input_audio;
+	ArdourButton _del_input_audio;
+	ArdourButton _add_input_midi;
+	ArdourButton _del_input_midi;
+	ArdourButton _add_output_audio;
+	ArdourButton _del_output_audio;
+	ArdourButton _add_output_midi;
+	ArdourButton _del_output_midi;
+	ArdourButton _add_sc_audio;
+	ArdourButton _add_sc_midi;
+
+	ArdourDropdown _out_presets;
+
+	Gtk::Menu reset_menu;
+	Gtk::Menu input_menu;
+	Gtk::Table* _sidechain_tbl;
+	Glib::RefPtr<Gtk::SizeGroup> _pm_size_group;
+
+	void plugin_reconfigured ();
+	void update_element_pos ();
+	void refill_sidechain_table ();
+	void refill_output_presets ();
+
+	void darea_size_request (Gtk::Requisition*);
+	void darea_size_allocate (Gtk::Allocation&);
+	bool darea_expose_event (GdkEventExpose*);
+	bool darea_motion_notify_event (GdkEventMotion*);
+	bool darea_button_press_event (GdkEventButton*);
+	bool darea_button_release_event (GdkEventButton*);
+	bool drag_type_matches (const CtrlElem& ct);
+
+	void start_drag (const CtrlElem&, double, double);
+
+	void draw_io_pin (cairo_t*, const CtrlWidget&);
+	void draw_plugin_pin (cairo_t*, const CtrlWidget&);
+
+	void set_color (cairo_t*, bool);
+	double pin_x_pos (uint32_t, double, double, uint32_t, uint32_t, bool);
+	void draw_connection (cairo_t*, double, double, double, double, bool, bool, bool dashed = false);
+	void draw_connection (cairo_t*, const CtrlWidget&, const CtrlWidget&, bool dashed = false);
+	const CtrlWidget& get_io_ctrl (CtrlType ct, ARDOUR::DataType dt, uint32_t id, uint32_t ip = 0) const;
+
+	static void edge_coordinates (const CtrlWidget& w, double &x, double &y);
+	static std::string port_label (const std::string&, bool);
+
+	void reset_mapping ();
+	void reset_configuration ();
+	void toggle_sidechain ();
+	void connect_sidechain ();
+	void add_remove_plugin_clicked (bool);
+	void add_remove_port_clicked (bool, ARDOUR::DataType);
+	void add_remove_inpin_clicked (bool, ARDOUR::DataType);
+	void add_sidechain_port (ARDOUR::DataType);
+	void select_output_preset (uint32_t n_audio);
+	void handle_input_action (const CtrlElem &, const CtrlElem &);
+	void handle_output_action (const CtrlElem &, const CtrlElem &);
+	void handle_thru_action (const CtrlElem &, const CtrlElem &);
+	bool handle_disconnect (const CtrlElem &, bool no_signal = false);
+	void disconnect_other_outputs (uint32_t skip_pc, ARDOUR::DataType dt, uint32_t id);
+	void disconnect_other_thru (ARDOUR::DataType dt, uint32_t id);
+	void remove_port (boost::weak_ptr<ARDOUR::Port>);
+	void disconnect_port (boost::weak_ptr<ARDOUR::Port>);
+	void connect_port (boost::weak_ptr<ARDOUR::Port>, boost::weak_ptr<ARDOUR::Port>);
+	void add_send_from (boost::weak_ptr<ARDOUR::Port>, boost::weak_ptr<ARDOUR::Route>);
+	uint32_t add_port_to_table (boost::shared_ptr<ARDOUR::Port>, uint32_t, bool);
+	uint32_t maybe_add_route_to_input_menu (boost::shared_ptr<ARDOUR::Route>, ARDOUR::DataType, boost::weak_ptr<ARDOUR::Port>);
+	void port_connected_or_disconnected (boost::weak_ptr<ARDOUR::Port>, boost::weak_ptr<ARDOUR::Port>);
+
+	bool sc_input_press (GdkEventButton *, boost::weak_ptr<ARDOUR::Port>);
+	bool sc_input_release (GdkEventButton *);
+
+	PBD::ScopedConnectionList _plugin_connections;
+	PBD::ScopedConnection _io_connection;
+	boost::shared_ptr<ARDOUR::PluginInsert> _pi;
+
+	void queue_idle_update ();
+	bool idle_update ();
+
+	uint32_t _n_plugins;
+	ARDOUR::ChanCount _in, _ins, _out;
+	ARDOUR::ChanCount _sinks, _sources;
+
+	double _bxw2, _bxh2;
+	double _pin_box_size;
+	double _width, _height;
+	double _innerwidth, _margin_x, _margin_y;
+	double _min_width;
+	double _min_height;
+	uint32_t _n_inputs;
+	uint32_t _n_sidechains;
+	bool _position_valid;
+	bool _ignore_updates;
+	ARDOUR::Route* _route () { return static_cast<ARDOUR::Route*> (_pi->owner ()); }
+	IOSelectorWindow *_sidechain_selector;
+
+	bool   _dragging;
+	double _drag_x, _drag_y;
+
+	class Control: public sigc::trackable {
+	public:
+		Control (boost::shared_ptr<ARDOUR::AutomationControl>, std::string const &);
+		~Control ();
+		Gtk::Alignment box;
+	private:
+		void slider_adjusted ();
+		void control_changed ();
+		void set_tooltip ();
+
+		boost::weak_ptr<ARDOUR::AutomationControl> _control;
+		Gtk::Adjustment _adjustment;
+		Gtkmm2ext::HSliderController _slider;
+		Gtkmm2ext::PersistentTooltip _slider_persistant_tooltip;
+
+		bool _ignore_ui_adjustment;
+		sigc::connection timer_connection;
+		std::string _name;
+	};
+	std::list<Control*> _controls;
+};
+
+
+class PluginPinDialog : public ArdourWindow
+{
+public:
+	PluginPinDialog (boost::shared_ptr<ARDOUR::PluginInsert>);
+	PluginPinDialog (boost::shared_ptr<ARDOUR::Route>);
+
+	void set_session (ARDOUR::Session *);
+private:
+	Gtk::VBox *vbox;
+	typedef boost::shared_ptr<PluginPinWidget> PluginPinWidgetPtr;
+	typedef std::vector<PluginPinWidgetPtr> PluginPinWidgetList;
+
+	void route_going_away ();
+	void route_processors_changed (ARDOUR::RouteProcessorChange);
+	void add_processor (boost::weak_ptr<ARDOUR::Processor>);
+
+	boost::shared_ptr<ARDOUR::Route> _route;
+	PluginPinWidgetList ppw;
+	PBD::ScopedConnectionList _route_connections;
+};
+
+#endif
diff --git a/gtk2_ardour/plugin_selector.cc b/gtk2_ardour/plugin_selector.cc
index 144e17d..3a0fed0 100644
--- a/gtk2_ardour/plugin_selector.cc
+++ b/gtk2_ardour/plugin_selector.cc
@@ -42,7 +42,7 @@
 #include "gui_thread.h"
 #include "tooltips.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 using namespace PBD;
@@ -210,18 +210,29 @@ PluginSelector::PluginSelector (PluginManager& mgr)
 
 	filter_frame->show_all ();
 
+	HBox* side_by_side = manage (new HBox);
+	VBox* right_side = manage (new VBox);
+
 	table->attach (scroller, 0, 7, 0, 5);
 	table->attach (*filter_frame, 0, 7, 6, 7, FILL|EXPAND, FILL, 5, 5);
-	table->attach(*btn_add, 1, 2, 7, 8, FILL, FILL, 5, 5);
-	table->attach(*btn_remove, 5, 6, 7, 8, FILL, FILL, 5, 5);
 
-	table->attach(ascroller, 0, 7, 8, 10);
+	right_side->pack_start (ascroller);
+
+	HBox* add_remove = manage (new HBox);
+	add_remove->pack_start (*btn_add, true, true);
+	add_remove->pack_start (*btn_remove, true, true);
+
+	right_side->pack_start (*add_remove, false, false);
+	right_side->set_size_request (200, -1);
+
+	side_by_side->pack_start (*table);
+	side_by_side->pack_start (*right_side);
 
 	add_button (Stock::CLOSE, RESPONSE_CLOSE);
 	add_button (_("Insert Plugin(s)"), RESPONSE_APPLY);
 	set_default_response (RESPONSE_APPLY);
 	set_response_sensitive (RESPONSE_APPLY, false);
-	get_vbox()->pack_start (*table);
+	get_vbox()->pack_start (*side_by_side);
 
 	table->set_name("PluginSelectorTable");
 	plugin_display.set_name("PluginSelectorDisplay");
@@ -330,6 +341,9 @@ PluginSelector::show_this_plugin (const PluginInfoPtr& info, const std::string&
 			case LXVST:
 				compstr = X_("LXVST");
 				break;
+			case Lua:
+				compstr = X_("Lua");
+				break;
 			}
 
 		} else if (mode == _("Author contains")) {
@@ -377,6 +391,7 @@ PluginSelector::refill ()
 	vst_refiller (filterstr);
 	lxvst_refiller (filterstr);
 	au_refiller (filterstr);
+	lua_refiller (filterstr);
 
 	in_row_change = false;
 }
@@ -400,18 +415,23 @@ PluginSelector::refiller (const PluginInfoList& plugs, const::std::string& filte
 			string creator = (*i)->creator;
 			string::size_type pos = 0;
 
-			/* stupid LADSPA creator strings */
+			if ((*i)->type == ARDOUR::LADSPA) {
+				/* stupid LADSPA creator strings */
 #ifdef PLATFORM_WINDOWS
-			while (pos < creator.length() && creator[pos] > -2 && creator[pos] < 256 && (isalnum (creator[pos]) || isspace (creator[pos]))) ++pos;
+				while (pos < creator.length() && creator[pos] > -2 && creator[pos] < 256 && (isalnum (creator[pos]) || isspace (creator[pos]))) ++pos;
 #else
-			while (pos < creator.length() && (isalnum (creator[pos]) || isspace (creator[pos]))) ++pos;
+				while (pos < creator.length() && (isalnum (creator[pos]) || isspace (creator[pos]))) ++pos;
 #endif
+			} else {
+				pos = creator.length ();
+			}
 			// If there were too few characters to create a
 			// meaningful name, mark this creator as 'Unknown'
-			if (creator.length()<2 || pos<3)
+			if (creator.length() < 2 || pos < 3) {
 				creator = "Unknown";
-			else
+			} else{
 				creator = creator.substr (0, pos);
+			}
 
 			newrow[plugin_columns.creator] = creator;
 
@@ -444,6 +464,12 @@ PluginSelector::ladspa_refiller (const std::string& filterstr)
 }
 
 void
+PluginSelector::lua_refiller (const std::string& filterstr)
+{
+	refiller (manager.lua_plugin_info(), filterstr, "Lua");
+}
+
+void
 PluginSelector::lv2_refiller (const std::string& filterstr)
 {
 #ifdef LV2_SUPPORT
@@ -703,6 +729,7 @@ PluginSelector::build_plugin_menu ()
 	PluginInfoList all_plugs;
 
 	all_plugs.insert (all_plugs.end(), manager.ladspa_plugin_info().begin(), manager.ladspa_plugin_info().end());
+	all_plugs.insert (all_plugs.end(), manager.lua_plugin_info().begin(), manager.lua_plugin_info().end());
 #ifdef WINDOWS_VST_SUPPORT
 	all_plugs.insert (all_plugs.end(), manager.windows_vst_plugin_info().begin(), manager.windows_vst_plugin_info().end());
 #endif
@@ -780,23 +807,25 @@ PluginSelector::create_by_creator_menu (ARDOUR::PluginInfoList& all_plugs)
 		if (manager.get_status (*i) == PluginManager::Hidden) continue;
 
 		string creator = (*i)->creator;
-
-		/* stupid LADSPA creator strings */
 		string::size_type pos = 0;
+
+		if ((*i)->type == ARDOUR::LADSPA) {
+			/* stupid LADSPA creator strings */
 #ifdef PLATFORM_WINDOWS
-		while (pos < creator.length() && creator[pos]>(-2) && creator[pos]<256 && (isprint (creator[pos]))) ++pos;
+			while (pos < creator.length() && creator[pos] > -2 && creator[pos] < 256 && (isalnum (creator[pos]) || isspace (creator[pos]))) ++pos;
 #else
-		while (pos < creator.length() && (isalnum (creator[pos]) || isspace (creator[pos]))) ++pos;
+			while (pos < creator.length() && (isalnum (creator[pos]) || isspace (creator[pos]))) ++pos;
 #endif
+		} else {
+			pos = creator.length ();
+		}
 
-		// Check to see if we found any invalid characters.
-		if (creator.length() != pos) {
-			// If there were too few characters to create a
-			// meaningful name, mark this creator as 'Unknown'
-			if (pos<3)
-				creator = "Unknown?";
-			else
-				creator = creator.substr (0, pos);
+		// If there were too few characters to create a
+		// meaningful name, mark this creator as 'Unknown'
+		if (creator.length() < 2 || pos < 3) {
+			creator = "Unknown";
+		} else{
+			creator = creator.substr (0, pos);
 		}
 
 		SubmenuMap::iterator x;
diff --git a/gtk2_ardour/plugin_selector.h b/gtk2_ardour/plugin_selector.h
index a377d5b..1a7e11b 100644
--- a/gtk2_ardour/plugin_selector.h
+++ b/gtk2_ardour/plugin_selector.h
@@ -123,6 +123,7 @@ class PluginSelector : public ArdourDialog
 	void vst_refiller (const std::string&);
 	void lxvst_refiller (const std::string&);
 	void au_refiller (const std::string&);
+	void lua_refiller (const std::string&);
 
 	Gtk::Menu* _plugin_menu;
 	ARDOUR::PluginManager& manager;
diff --git a/gtk2_ardour/plugin_setup_dialog.cc b/gtk2_ardour/plugin_setup_dialog.cc
new file mode 100644
index 0000000..5feb76a
--- /dev/null
+++ b/gtk2_ardour/plugin_setup_dialog.cc
@@ -0,0 +1,212 @@
+/*
+ * Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+ * Copyright (C) 2011 Paul Davis
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+
+#include <gtkmm/frame.h>
+#include <gtkmm/label.h>
+
+#include "plugin_setup_dialog.h"
+#include "pbd/i18n.h"
+
+using namespace ARDOUR;
+using namespace Gtk;
+
+PluginSetupDialog::PluginSetupDialog (boost::shared_ptr<ARDOUR::Route> r, boost::shared_ptr<ARDOUR::PluginInsert> pi, ARDOUR::Route::PluginSetupOptions flags)
+	: ArdourDialog (_("Plugin Setup"), true, false)
+	, _route (r)
+	, _pi (pi)
+	, _keep_mapping (_("Copy I/O Map"), ArdourButton::led_default_elements)
+{
+	assert (flags != Route::None);
+
+	Gtk::Table *tbl = manage (new Gtk::Table ());
+	tbl->set_spacings (6);
+	get_vbox()->pack_start (*tbl);
+	int row = 0;
+
+	if (flags & Route::CanReplace) {
+		boost::shared_ptr<Processor> old = _route->the_instrument ();
+		boost::shared_ptr<PluginInsert> opi = boost::dynamic_pointer_cast<PluginInsert> (old);
+		assert (opi);
+
+		opi->configured_io (_cur_inputs, _cur_outputs);
+
+		Gtk::Label* l = manage (new Label (
+						_("An Instrument plugin is already present.")
+						));
+		tbl->attach (*l, 0, 2, row, row + 1, EXPAND|FILL, SHRINK); ++row;
+
+		l = manage (new Label (_("Replace"), ALIGN_END));
+		tbl->attach (*l, 0, 1, row, row + 1, EXPAND|FILL, SHRINK);
+
+		l = manage (new Label (string_compose ("'%1'", old->name ()), ALIGN_START));
+		tbl->attach (*l, 1, 2, row, row + 1, EXPAND|FILL, SHRINK); ++row;
+
+		l = manage (new Label (_("with"), ALIGN_END));
+		tbl->attach (*l, 0, 1, row, row + 1, EXPAND|FILL, SHRINK);
+
+		l = manage (new Label (string_compose ("'%1'", pi->name ()), ALIGN_START));
+		tbl->attach (*l, 1, 2, row, row + 1, EXPAND|FILL, SHRINK); ++row;
+
+		Box* box = manage (new HBox ());
+		box->set_border_width (2);
+		box->pack_start (_keep_mapping, true, true);
+		Frame* f = manage (new Frame ());
+		f->set_label (_("I/O Pin Mapping"));
+		f->add (*box);
+		tbl->attach (*f, 0, 1, row, row + 1, EXPAND|FILL, SHRINK, 0, 8);
+
+		_keep_mapping.signal_clicked.connect (sigc::mem_fun (*this, &PluginSetupDialog::apply_mapping)); 
+		add_button ("Replace", 2);
+	} else {
+
+		Gtk::Label *l = manage (new Label (string_compose (
+						_("Configure Plugin '%1'"), pi->name ()
+						)));
+		tbl->attach (*l, 0, 2, row, row + 1, EXPAND|FILL, SHRINK); ++row;
+	}
+
+	if (flags & Route::MultiOut) {
+		setup_output_presets ();
+		Box* box = manage (new HBox ());
+		box->set_border_width (2);
+		box->pack_start (_out_presets, true, true);
+		Frame* f = manage (new Frame ());
+		f->set_label (_("Output Configuration"));
+		f->add (*box);
+		tbl->attach (*f, 1, 2, row, row + 1, EXPAND|FILL, SHRINK, 0, 8);
+	} else {
+		_pi->set_preset_out (_pi->natural_output_streams ());
+		update_sensitivity (_pi->natural_output_streams ().n_audio ());
+	}
+
+	_keep_mapping.set_active (false);
+	apply_mapping ();
+
+	add_button (Stock::ADD, 0);
+	add_button (Stock::CANCEL, 1);
+	set_default_response (0);
+	show_all ();
+}
+
+
+void
+PluginSetupDialog::setup_output_presets ()
+{
+	// compare to PluginPinDialog::refill_output_presets ()
+	using namespace Menu_Helpers;
+	PluginOutputConfiguration ppc (_pi->plugin (0)->possible_output ());
+
+	_out_presets.AddMenuElem (MenuElem (_("Automatic"), sigc::bind (sigc::mem_fun (*this, &PluginSetupDialog::select_output_preset), 0)));
+
+	if (ppc.find (0) != ppc.end ()) {
+		// anyting goes
+		ppc.clear ();
+		ppc.insert (1);
+		ppc.insert (2);
+		ppc.insert (8);
+		ppc.insert (16);
+		ppc.insert (24);
+		ppc.insert (32);
+		if (ppc.find (_cur_outputs.n_audio ()) == ppc.end ()) {
+			ppc.insert (_cur_outputs.n_audio ());
+		}
+	}
+
+	bool have_matching_io = false;
+
+	for (PluginOutputConfiguration::const_iterator i = ppc.begin () ; i != ppc.end (); ++i) {
+		assert (*i > 0);
+		_out_presets.AddMenuElem (MenuElem (preset_label (*i), sigc::bind (sigc::mem_fun (*this, &PluginSetupDialog::select_output_preset), *i)));
+		if (*i == _cur_outputs.n_audio ()) {
+			have_matching_io = true;
+		}
+	}
+
+	if (have_matching_io) {
+		select_output_preset (_cur_outputs.n_audio ());
+	} else {
+		select_output_preset (0);
+	}
+}
+
+void
+PluginSetupDialog::select_output_preset (uint32_t n_audio)
+{
+	_pi->set_preset_out (ChanCount (DataType::AUDIO, n_audio));
+	_out_presets.set_text (preset_label (n_audio));
+	update_sensitivity (n_audio);
+}
+
+void
+PluginSetupDialog::update_sensitivity (uint32_t n_audio)
+{
+	if (_cur_outputs.n_audio () > 0 && _cur_outputs.n_audio () == n_audio) {
+		// TODO check _cur_inputs if not reconfigurable?
+		_keep_mapping.set_sensitive (true);
+	} else {
+		_keep_mapping.set_sensitive (false);
+	}
+}
+
+bool
+PluginSetupDialog::io_match () const
+{
+	if (_cur_outputs.n_audio () > 0 && _cur_outputs.n_audio () == _pi->preset_out ().n_audio ()) {
+		return true;
+	} else {
+		return false;
+	}
+}
+
+void
+PluginSetupDialog::apply_mapping ()
+{
+	// toggle button
+	_keep_mapping.set_active (!_keep_mapping.get_active ());
+
+	boost::shared_ptr<Processor> old = _route->the_instrument ();
+	boost::shared_ptr<PluginInsert> opi = boost::dynamic_pointer_cast<PluginInsert> (old);
+
+	if (_keep_mapping.get_active () && opi && io_match ()) {
+		_pi->pre_seed (_cur_inputs, _cur_outputs, opi->input_map (0), opi->output_map (0), opi->thru_map ());
+	} else {
+		_pi->pre_seed (ChanCount (), ChanCount (), ChanMapping (), ChanMapping (), ChanMapping());
+	}
+}
+
+std::string
+PluginSetupDialog::preset_label (uint32_t n_audio) const
+{
+		std::string rv;
+		switch (n_audio) {
+			case 0:
+				rv = _("Automatic");
+				break;
+			case 1:
+				rv = _("Mono");
+				break;
+			case 2:
+				rv = _("Stereo");
+				break;
+			default:
+				rv = string_compose (P_("%1 Channel", "%1 Channels", n_audio), n_audio);
+				break;
+		}
+		return rv;
+}
diff --git a/gtk2_ardour/plugin_setup_dialog.h b/gtk2_ardour/plugin_setup_dialog.h
new file mode 100644
index 0000000..b2fc3e7
--- /dev/null
+++ b/gtk2_ardour/plugin_setup_dialog.h
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+
+#ifndef __gtkardour_plugin_setup_dialog_h__
+#define __gtkardour_plugin_setup_dialog_h__
+
+#include "ardour/plugin_insert.h"
+#include "ardour/route.h"
+
+#include "ardour_dropdown.h"
+#include "ardour_dialog.h"
+
+class PluginSetupDialog : public ArdourDialog
+{
+public:
+	PluginSetupDialog (boost::shared_ptr<ARDOUR::Route>, boost::shared_ptr<ARDOUR::PluginInsert>, ARDOUR::Route::PluginSetupOptions);
+
+private:
+	void setup_output_presets ();
+	void update_sensitivity (uint32_t);
+	bool io_match () const;
+
+	void select_output_preset (uint32_t n_audio);
+	void apply_mapping ();
+
+	std::string preset_label (uint32_t) const;
+
+	boost::shared_ptr<ARDOUR::Route> _route;
+	boost::shared_ptr<ARDOUR::PluginInsert> _pi;
+
+	ArdourDropdown _out_presets;
+	ArdourButton _keep_mapping;
+	ARDOUR::ChanCount _cur_inputs;
+	ARDOUR::ChanCount _cur_outputs;
+};
+
+#endif
diff --git a/gtk2_ardour/plugin_ui.cc b/gtk2_ardour/plugin_ui.cc
index 256a90d..19ea8eb 100644
--- a/gtk2_ardour/plugin_ui.cc
+++ b/gtk2_ardour/plugin_ui.cc
@@ -58,18 +58,20 @@
 #endif
 
 #include "ardour_window.h"
+#include "ardour_ui.h"
 #include "prompter.h"
 #include "plugin_ui.h"
 #include "utils.h"
 #include "gui_thread.h"
 #include "public_editor.h"
+#include "processor_box.h"
 #include "keyboard.h"
 #include "latency_gui.h"
 #include "plugin_eq_gui.h"
 #include "new_plugin_preset_dialog.h"
 #include "tooltips.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
@@ -177,7 +179,7 @@ PluginUIWindow::on_show ()
 	}
 
 	if (_pluginui) {
-#if defined (HAVE_AUDIOUNITS) && defined(GTKOSX)
+#if defined (HAVE_AUDIOUNITS) && defined(__APPLE__)
                 if (pre_deactivate_x >= 0) {
                         move (pre_deactivate_x, pre_deactivate_y);
                 }
@@ -192,7 +194,7 @@ PluginUIWindow::on_show ()
 void
 PluginUIWindow::on_hide ()
 {
-#if defined (HAVE_AUDIOUNITS) && defined(GTKOSX)
+#if defined (HAVE_AUDIOUNITS) && defined(__APPLE__)
         get_position (pre_deactivate_x, pre_deactivate_y);
 #endif
 
@@ -292,7 +294,7 @@ PluginUIWindow::create_audiounit_editor (boost::shared_ptr<PluginInsert>)
 }
 
 void
-#ifdef GTKOSX
+#ifdef __APPLE__
 PluginUIWindow::app_activated (bool yn)
 #else
 PluginUIWindow::app_activated (bool)
@@ -361,27 +363,26 @@ PluginUIWindow::on_key_press_event (GdkEventKey* event)
 			}
 		}
 		return true;
-	} else {
-		/* for us to be getting key press events, there really
-		   MUST be a _pluginui, but just to be safe, check ...
-		*/
+	}
+	/* for us to be getting key press events, there really
+	   MUST be a _pluginui, but just to be safe, check ...
+	*/
 
-		if (_pluginui) {
-			_pluginui->grab_focus();
-			if (_pluginui->non_gtk_gui()) {
-				/* pass editor window as the window for the event
-				   to be handled in, not this one, because there are
-				   no widgets in this window that we want to have
-				   key focus.
-				*/
-				return relay_key_press (event, &PublicEditor::instance());
-			} else {
-				return relay_key_press (event, this);
-			}
+	if (_pluginui) {
+		_pluginui->grab_focus();
+		if (_pluginui->non_gtk_gui()) {
+			/* pass main window as the window for the event
+			   to be handled in, not this one, because there are
+			   no widgets in this window that we want to have
+			   key focus.
+			*/
+			return relay_key_press (event, &ARDOUR_UI::instance()->main_window());
 		} else {
-			return false;
+			return relay_key_press (event, this);
 		}
 	}
+
+	return false;
 }
 
 bool
@@ -420,6 +421,7 @@ PlugUIBase::PlugUIBase (boost::shared_ptr<PluginInsert> pi)
 	, delete_button (_("Delete"))
 	, reset_button (_("Reset"))
 	, bypass_button (ArdourButton::led_default_elements)
+	, pin_management_button (_("Pin Connections...")) // TODO use a shorter label once the string-freeze is over.
 	, description_expander (_("Description"))
 	, plugin_analysis_expander (_("Plugin analysis"))
 	, latency_gui (0)
@@ -433,6 +435,9 @@ PlugUIBase::PlugUIBase (boost::shared_ptr<PluginInsert> pi)
 	set_tooltip (save_button, _("Save the current preset"));
 	set_tooltip (delete_button, _("Delete the current preset"));
 	set_tooltip (reset_button, _("Reset parameters to default (if no parameters are in automation play mode)"));
+#if 0 // string freeze is over
+	set_tooltip (pin_management_button, _("Show Plugin Pin Management Dialog"));
+#endif
 	set_tooltip (bypass_button, _("Disable signal processing by the plugin"));
 	_no_load_preset = 0;
 
@@ -451,12 +456,14 @@ PlugUIBase::PlugUIBase (boost::shared_ptr<PluginInsert> pi)
 	reset_button.set_name ("generic button");
 	reset_button.signal_clicked.connect (sigc::mem_fun (*this, &PlugUIBase::reset_plugin_parameters));
 
+	pin_management_button.set_name ("generic button");
+	pin_management_button.signal_clicked.connect (sigc::mem_fun (*this, &PlugUIBase::manage_pins));
 
 	insert->ActiveChanged.connect (active_connection, invalidator (*this), boost::bind (&PlugUIBase::processor_active_changed, this,  boost::weak_ptr<Processor>(insert)), gui_context());
 
 	bypass_button.set_name ("plugin bypass button");
 	bypass_button.set_text (_("Bypass"));
-	bypass_button.set_active (!pi->active());
+	bypass_button.set_active (!pi->enabled ());
 	bypass_button.signal_button_release_event().connect (sigc::mem_fun(*this, &PlugUIBase::bypass_button_release), false);
 	focus_button.add_events (Gdk::ENTER_NOTIFY_MASK|Gdk::LEAVE_NOTIFY_MASK);
 
@@ -550,7 +557,7 @@ PlugUIBase::processor_active_changed (boost::weak_ptr<Processor> weak_p)
 	boost::shared_ptr<Processor> p (weak_p.lock());
 
 	if (p) {
-		bypass_button.set_active (!p->active());
+		bypass_button.set_active (!p->enabled ());
 	}
 }
 
@@ -561,7 +568,7 @@ PlugUIBase::preset_selected (Plugin::PresetRecord preset)
 		return;
 	}
 	if (!preset.label.empty()) {
-		plugin->load_preset (preset);
+		insert->load_preset (preset);
 	} else {
 		// blank selected = no preset
 		plugin->clear_preset();
@@ -658,17 +665,24 @@ PlugUIBase::reset_plugin_parameters ()
 	insert->reset_parameters_to_default ();
 }
 
+void
+PlugUIBase::manage_pins ()
+{
+	PluginPinWindowProxy* proxy = insert->pinmgr_proxy ();
+	if (proxy) {
+		proxy->get (true);
+		proxy->present ();
+		proxy->get ()->raise();
+	}
+}
+
 bool
 PlugUIBase::bypass_button_release (GdkEventButton*)
 {
 	bool view_says_bypassed = (bypass_button.active_state() != 0);
 
-	if (view_says_bypassed != insert->active()) {
-		if (view_says_bypassed) {
-			insert->activate ();
-		} else {
-			insert->deactivate ();
-		}
+	if (view_says_bypassed != insert->enabled ()) {
+		insert->enable (view_says_bypassed);
 	}
 
 	return false;
@@ -714,7 +728,19 @@ PlugUIBase::toggle_description()
 	}
 
 	if (!description_expander.get_expanded()) {
+		const int child_height = description_expander.get_child ()->get_height ();
+
 		description_expander.remove();
+
+		Gtk::Window *toplevel = (Gtk::Window*) description_expander.get_ancestor (GTK_TYPE_WINDOW);
+
+		if (toplevel) {
+			Gtk::Requisition wr;
+			toplevel->get_size (wr.width, wr.height);
+			wr.height -= child_height;
+			toplevel->resize (wr.width, wr.height);
+		}
+
 	}
 }
 
@@ -729,12 +755,6 @@ PlugUIBase::toggle_plugin_analysis()
 			eqgui = new PluginEqGui (insert);
 		}
 
-		Gtk::Window *toplevel = (Gtk::Window*) plugin_analysis_expander.get_ancestor (GTK_TYPE_WINDOW);
-
-		if (toplevel) {
-			toplevel->get_size (pre_eq_size.width, pre_eq_size.height);
-		}
-
 		plugin_analysis_expander.add (*eqgui);
 		plugin_analysis_expander.show_all ();
 		eqgui->start_listening ();
@@ -742,6 +762,7 @@ PlugUIBase::toggle_plugin_analysis()
 
 	if (!plugin_analysis_expander.get_expanded()) {
 		// Hide & remove from expander
+		const int child_height = plugin_analysis_expander.get_child ()->get_height ();
 
 		eqgui->hide ();
 		eqgui->stop_listening ();
@@ -750,7 +771,10 @@ PlugUIBase::toggle_plugin_analysis()
 		Gtk::Window *toplevel = (Gtk::Window*) plugin_analysis_expander.get_ancestor (GTK_TYPE_WINDOW);
 
 		if (toplevel) {
-			toplevel->resize (pre_eq_size.width, pre_eq_size.height);
+			Gtk::Requisition wr;
+			toplevel->get_size (wr.width, wr.height);
+			wr.height -= child_height;
+			toplevel->resize (wr.width, wr.height);
 		}
 	}
 }
diff --git a/gtk2_ardour/plugin_ui.h b/gtk2_ardour/plugin_ui.h
index d2e5e21..046890a 100644
--- a/gtk2_ardour/plugin_ui.h
+++ b/gtk2_ardour/plugin_ui.h
@@ -42,7 +42,6 @@
 #include <gtkmm/adjustment.h>
 #include <gtkmm/togglebutton.h>
 #include <gtkmm/socket.h>
-#include <gtkmm/comboboxtext.h>
 #include <gtkmm/socket.h>
 
 #include "ardour/types.h"
@@ -51,6 +50,7 @@
 
 #include "ardour_button.h"
 #include "ardour_dropdown.h"
+#include "ardour_spinner.h"
 #include "ardour_window.h"
 #include "automation_controller.h"
 
@@ -129,6 +129,8 @@ class PlugUIBase : public virtual sigc::trackable, public PBD::ScopedConnectionL
 	ArdourButton reset_button;
 	/** a button to bypass the plugin */
 	ArdourButton bypass_button;
+	/** and self-explaining button :) */
+	ArdourButton pin_management_button;
 	/** a button to acquire keyboard focus */
 	Gtk::EventBox focus_button;
 	/** an expander containing the plugin description */
@@ -152,7 +154,6 @@ class PlugUIBase : public virtual sigc::trackable, public PBD::ScopedConnectionL
 	ArdourWindow* latency_dialog;
 
 	PluginEqGui* eqgui;
-	Gtk::Requisition pre_eq_size;
 
 	Gtk::Image* focus_out_image;
 	Gtk::Image* focus_in_image;
@@ -163,6 +164,7 @@ class PlugUIBase : public virtual sigc::trackable, public PBD::ScopedConnectionL
 	void save_plugin_setting ();
 	void delete_plugin_setting ();
 	void reset_plugin_parameters ();
+	void manage_pins ();
 	bool focus_toggled(GdkEventButton*);
 	bool bypass_button_release(GdkEventButton*);
 	void toggle_description ();
@@ -194,17 +196,8 @@ class GenericPluginUI : public PlugUIBase, public Gtk::VBox
 
   private:
 	Gtk::VBox main_contents;
-
 	Gtk::HBox settings_box;
 	Gtk::HBox hpacker;
-
-	Gtk::Table button_table;
-	Gtk::Table output_table;
-
-	Gtk::ScrolledWindow scroller;
-	Gtk::Adjustment hAdjustment;
-	Gtk::Adjustment vAdjustment;
-	Gtk::Viewport scroller_view;
 	Gtk::Menu* automation_menu;
 
 	gint prefheight;
@@ -229,11 +222,6 @@ class GenericPluginUI : public PlugUIBase, public Gtk::VBox
 		}
 	};
 
-	static const int32_t initial_button_rows = 12;
-	static const int32_t initial_button_cols = 1;
-	static const int32_t initial_output_rows = 1;
-	static const int32_t initial_output_cols = 4;
-
 	/* FIXME: Unify with AutomationController */
 	struct ControlUI : public Gtk::HBox {
 
@@ -244,16 +232,19 @@ class GenericPluginUI : public PlugUIBase, public Gtk::VBox
 
 		/* input */
 
-		Gtk::ComboBoxText*                      combo;
 		boost::shared_ptr<ARDOUR::ScalePoints>  scale_points;
-		Gtk::ToggleButton*                      button;
 		boost::shared_ptr<AutomationController> controller;
-		Gtkmm2ext::ClickBox*                    clickbox;
+
+		ArdourButton                            automate_button;
 		Gtk::Label                              label;
-		bool                                    update_pending;
-		char                                    ignore_change;
-		Gtk::Button                             automate_button;
+		ArdourDropdown*                         combo;
+		Gtkmm2ext::ClickBox*                    clickbox;
 		Gtk::FileChooserButton*                 file_button;
+		ArdourSpinner*                          spin_box;
+
+		bool                                    button;
+		bool                                    update_pending;
+		bool                                    ignore_change;
 
 		/* output */
 
@@ -266,26 +257,35 @@ class GenericPluginUI : public PlugUIBase, public Gtk::VBox
 
 		ControlUI (const Evoral::Parameter& param);
 		~ControlUI ();
+
+		/* layout */
+		Gtk::Table* knobtable;
+		int x0, x1, y0, y1;
 	};
 
-	std::vector<ControlUI*>   input_controls;
+	std::vector<ControlUI*>   input_controls; // workaround for preset load
 	std::vector<ControlUI*>   input_controls_with_automation;
 	std::vector<ControlUI*>   output_controls;
+
 	sigc::connection screen_update_connection;
+
 	void output_update();
 
 	void build ();
+	void automatic_layout (const std::vector<ControlUI *>& control_uis);
+	void custom_layout (const std::vector<ControlUI *>& control_uis);
+
 	ControlUI* build_control_ui (const Evoral::Parameter&                     param,
 	                             const ARDOUR::ParameterDescriptor&           desc,
 	                             boost::shared_ptr<ARDOUR::AutomationControl> mcontrol,
 	                             float                                        value,
-	                             bool                                         is_input);
+	                             bool                                         is_input,
+	                             bool                                         use_knob = false);
 
 	void ui_parameter_changed (ControlUI* cui);
-	void toggle_parameter_changed (ControlUI* cui);
 	void update_control_display (ControlUI* cui);
-	void control_port_toggled (ControlUI* cui);
-	void control_combo_changed (ControlUI* cui);
+	void update_input_displays (); // workaround for preset load
+	void control_combo_changed (ControlUI* cui, float value);
 
 	void astate_clicked (ControlUI*);
 	void automation_state_changed (ControlUI*);
@@ -297,12 +297,12 @@ class GenericPluginUI : public PlugUIBase, public Gtk::VBox
 	bool integer_printer (char* buf, Gtk::Adjustment &, ControlUI *);
 	bool midinote_printer(char* buf, Gtk::Adjustment &, ControlUI *);
 
-	void set_property (const ARDOUR::ParameterDescriptor& desc,
-	                   Gtk::FileChooserButton*            widget);
-	void property_changed (uint32_t key, const ARDOUR::Variant& value);
+	typedef std::map<uint32_t, Gtk::FileChooserButton*> FilePathControls;
+	FilePathControls _filepath_controls;
+	void set_path_property (const ARDOUR::ParameterDescriptor& desc,
+	                        Gtk::FileChooserButton*            widget);
+	void path_property_changed (uint32_t key, const ARDOUR::Variant& value);
 
-	typedef std::map<uint32_t, Gtk::FileChooserButton*> PropertyControls;
-	PropertyControls _property_controls;
 };
 
 class PluginUIWindow : public ArdourWindow
diff --git a/gtk2_ardour/po/cs.mo b/gtk2_ardour/po/cs.mo
new file mode 100644
index 0000000..02ba552
Binary files /dev/null and b/gtk2_ardour/po/cs.mo differ
diff --git a/gtk2_ardour/po/cs.po b/gtk2_ardour/po/cs.po
index a4cebb1..be1c21d 100644
--- a/gtk2_ardour/po/cs.po
+++ b/gtk2_ardour/po/cs.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: gtk-ardour 0.347.2\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-01-09 21:58+0100\n"
+"POT-Creation-Date: 2016-07-14 06:20-0400\n"
 "PO-Revision-Date: 2016-01-17 20:46+0100\n"
 "Last-Translator: Pavel Fric <pavelfric at seznam.cz>\n"
 "Language-Team: Czech <kde-i18n-doc at kde.org>\n"
@@ -23,270 +23,286 @@ msgstr ""
 "X-Poedit-SearchPath-0: gtk2_ardour\n"
 
 #: about.cc:127
+msgid "Fons Adriaensen"
+msgstr ""
+
+#: about.cc:128
 msgid "Brian Ahr"
 msgstr "Brian Ahr"
 
-#: about.cc:128
+#: about.cc:129
 msgid "John Anderson"
 msgstr "John Anderson"
 
-#: about.cc:129
+#: about.cc:130
 msgid "Marcus Andersson"
 msgstr "Marcus Andersson"
 
-#: about.cc:130
+#: about.cc:131
 msgid "Nedko Arnaudov"
 msgstr "Nedko Arnaudov"
 
-#: about.cc:131
+#: about.cc:132
 msgid "Hans Baier"
 msgstr "Hans Baier"
 
-#: about.cc:132
+#: about.cc:133
 msgid "Ben Bell"
 msgstr "Ben Bell"
 
-#: about.cc:133
+#: about.cc:134
 msgid "Sakari Bergen"
 msgstr "Sakari Bergen"
 
-#: about.cc:134
+#: about.cc:135
 msgid "Christian Borss"
 msgstr "Christian Borss"
 
-#: about.cc:135
+#: about.cc:136
 msgid "Chris Cannam"
 msgstr "Chris Cannam"
 
-#: about.cc:136
+#: about.cc:137
 msgid "Jeremy Carter"
 msgstr "Jeremy Carter"
 
-#: about.cc:137
+#: about.cc:138
 msgid "Jesse Chappell"
 msgstr "Jesse Chappell"
 
-#: about.cc:138
+#: about.cc:139
 msgid "Thomas Charbonnel"
 msgstr "Thomas Charbonnel"
 
-#: about.cc:139
+#: about.cc:140
 msgid "Sam Chessman"
 msgstr "Sam Chessman"
 
-#: about.cc:140
+#: about.cc:141
 msgid "André Colomb"
 msgstr "André Colomb"
 
-#: about.cc:141
+#: about.cc:142
 msgid "Paul Davis"
 msgstr "Paul Davis"
 
-#: about.cc:142
+#: about.cc:143
 msgid "Gerard van Dongen"
 msgstr "Gerard van Dongen"
 
-#: about.cc:143
+#: about.cc:144
 msgid "John Emmas"
 msgstr "John Emmas"
 
-#: about.cc:144
+#: about.cc:145
 msgid "Colin Fletcher"
 msgstr "Colin Fletcher"
 
-#: about.cc:145
+#: about.cc:146
 msgid "Dave Flick"
 msgstr "Dave Flick"
 
-#: about.cc:146
+#: about.cc:147
 msgid "Hans Fugal"
 msgstr "Hans Fugal"
 
-#: about.cc:147
+#: about.cc:148
 msgid "Robin Gareus"
 msgstr "Robin Gareus"
 
-#: about.cc:148
+#: about.cc:149
 msgid "Nil Geisweiller"
 msgstr "Nil Geisweiller"
 
-#: about.cc:149
+#: about.cc:150
 msgid "Christopher George"
 msgstr "Christopher George"
 
-#: about.cc:150
+#: about.cc:151
 msgid "Chris Goddard"
 msgstr "Chris Goddard"
 
-#: about.cc:151
+#: about.cc:152
 msgid "J. Abelardo Gutierrez"
 msgstr "J. Abelardo Gutierrez"
 
-#: about.cc:152
+#: about.cc:153
 msgid "Jeremy Hall"
 msgstr "Jeremy Hall"
 
-#: about.cc:153
+#: about.cc:154
 msgid "Audun Halland"
 msgstr "Audun Halland"
 
-#: about.cc:154
+#: about.cc:155
 msgid "David Halter"
 msgstr "David Halter"
 
-#: about.cc:155
+#: about.cc:156
 msgid "Steve Harris"
 msgstr "Steve Harris"
 
-#: about.cc:156
+#: about.cc:157
 msgid "Melvin Ray Herr"
 msgstr "Melvin Ray Herr"
 
-#: about.cc:157
+#: about.cc:158
 msgid "Carl Hetherington"
 msgstr "Carl Hetherington"
 
-#: about.cc:158
+#: about.cc:159
 msgid "Rob Holland"
 msgstr "Rob Holland"
 
-#: about.cc:159
+#: about.cc:160
 msgid "Robert Jordens"
 msgstr "Robert Jordens"
 
-#: about.cc:160
+#: about.cc:161
 msgid "Stefan Kersten"
 msgstr "Stefan Kersten"
 
-#: about.cc:161
+#: about.cc:162
 msgid "Armand Klenk"
 msgstr "Armand Klenk"
 
-#: about.cc:162
+#: about.cc:163
 msgid "Julien de Kozak"
 msgstr "Julien de Kozak"
 
-#: about.cc:163
+#: about.cc:164
 msgid "Matt Krai"
 msgstr "Matt Krai"
 
-#: about.cc:164
+#: about.cc:165
 msgid "Georg Krause"
 msgstr "Georg Krause"
 
-#: about.cc:165
+#: about.cc:166
 msgid "Nick Lanham"
 msgstr "Nick Lanham"
 
-#: about.cc:166
+#: about.cc:167
 msgid "Colin Law"
 msgstr "Colin Law"
 
-#: about.cc:167
+#: about.cc:168
 msgid "Joshua Leach"
 msgstr "Joshua Leach"
 
-#: about.cc:168
+#: about.cc:169
 msgid "Ben Loftis"
 msgstr "Ben Loftis"
 
-#: about.cc:169
+#: about.cc:170
 msgid "Nick Mainsbridge"
 msgstr "Nick Mainsbridge"
 
-#: about.cc:170
+#: about.cc:171
 msgid "Tim Mayberry"
 msgstr "Tim Mayberry"
 
-#: about.cc:171
+#: about.cc:172
 msgid "Doug Mclain"
 msgstr "Doug Mclain"
 
-#: about.cc:172
+#: about.cc:173
 msgid "Todd Naugle"
 msgstr "Todd Naugle"
 
-#: about.cc:173
+#: about.cc:174
 msgid "André Nusser"
 msgstr "André Nusser"
 
-#: about.cc:174
+#: about.cc:175
 msgid "Bent Bisballe Nyeng"
 msgstr "Bent Bisballe Nyeng"
 
-#: about.cc:175
+#: about.cc:176
 msgid "Jack O'Quin"
 msgstr "Jack O'Quin"
 
-#: about.cc:176
+#: about.cc:177
+msgid "Pavel Potocek"
+msgstr ""
+
+#: about.cc:178
 msgid "Nimal Ratnayake"
 msgstr "Nimal Ratnayake"
 
-#: about.cc:177
+#: about.cc:179
+msgid "Julien Rivaud"
+msgstr ""
+
+#: about.cc:180
 msgid "David Robillard"
 msgstr "David Robillard"
 
-#: about.cc:178
+#: about.cc:181
+msgid "Julien Roger"
+msgstr ""
+
+#: about.cc:182
 msgid "Taybin Rutkin"
 msgstr "Taybin Rutkin"
 
-#: about.cc:179
+#: about.cc:183
 msgid "Andreas Ruge"
 msgstr "Andreas Ruge"
 
-#: about.cc:180
+#: about.cc:184
 msgid "Sampo Savolainen"
 msgstr "Sampo Savolainen"
 
-#: about.cc:181
+#: about.cc:185
 msgid "Rodrigo Severo"
 msgstr "Rodrigo Severo"
 
-#: about.cc:182
+#: about.cc:186
 msgid "Per Sigmond"
 msgstr "Per Sigmond"
 
-#: about.cc:183
+#: about.cc:187
 msgid "Lincoln Spiteri"
 msgstr "Lincoln Spiteri"
 
-#: about.cc:184
+#: about.cc:188
 msgid "Mike Start"
 msgstr "Mike Start"
 
-#: about.cc:185
+#: about.cc:189
 msgid "Mark Stewart"
 msgstr "Mark Stewart"
 
-#: about.cc:186
+#: about.cc:190
 msgid "Roland Stigge"
 msgstr "Roland Stigge"
 
-#: about.cc:187
+#: about.cc:191
 msgid "Petter Sundlöf"
 msgstr "Petter Sundlöf"
 
-#: about.cc:188
+#: about.cc:192
 msgid "Mike Täht"
 msgstr "Mike Täht"
 
-#: about.cc:189
+#: about.cc:193
 msgid "Roy Vegard"
 msgstr "Roy Vegard"
 
-#: about.cc:190
+#: about.cc:194
 msgid "Thorsten Wilms"
 msgstr "Thorsten Wilms"
 
-#: about.cc:191
+#: about.cc:195
 msgid "Damien Zammit"
 msgstr "Damien Zammit"
 
-#: about.cc:192
+#: about.cc:196
 msgid "Grygorii Zharun"
 msgstr "Grygorii Zharun"
 
-#: about.cc:197
+#: about.cc:201
 msgid ""
 "French:\n"
 "\tAlain Fréhel <alain.frehel at free.fr>\n"
@@ -300,7 +316,7 @@ msgstr ""
 "\tMartin Blanchard\n"
 "\tRomain Arnaud <roming22 at gmail.com>\n"
 
-#: about.cc:198
+#: about.cc:202
 msgid ""
 "German:\n"
 "\tKarsten Petersen <kapet at kapet.de>\n"
@@ -320,7 +336,7 @@ msgstr ""
 "\tRichard Oax <richard at pagliacciempire.de>\n"
 "\tRobin Gloster <robin at loc-com.de>\n"
 
-#: about.cc:205
+#: about.cc:209
 msgid ""
 "Italian:\n"
 "\tFilippo Pappalardo <filippo at email.it>\n"
@@ -330,7 +346,7 @@ msgstr ""
 "\tFilippo Pappalardo <filippo at email.it>\n"
 "\tRaffaele Morelli <raffaele.morelli at gmail.com>\n"
 
-#: about.cc:206
+#: about.cc:210
 msgid ""
 "Portuguese:\n"
 "\tRui Nuno Capela <rncbc at rncbc.org>\n"
@@ -338,7 +354,7 @@ msgstr ""
 "Portugalština:\n"
 "\tRui Nuno Capela <rncbc at rncbc.org>\n"
 
-#: about.cc:207
+#: about.cc:211
 msgid ""
 "Brazilian Portuguese:\n"
 "\tAlexander da Franca Fernandes <alexander at nautae.eti.br>\n"
@@ -348,7 +364,7 @@ msgstr ""
 "\tAlexander da Franca Fernandes <alexander at nautae.eti.br>\n"
 "\tChris Ross <chris at tebibyte.org>\n"
 
-#: about.cc:209
+#: about.cc:213
 msgid ""
 "Spanish:\n"
 "\t Alex Krohn <alexkrohn at fastmail.fm>\n"
@@ -358,7 +374,7 @@ msgstr ""
 "\t Alex Krohn <alexkrohn at fastmail.fm>\n"
 "\tPablo Fernández <pablo.fbus at gmail.com>\n"
 
-#: about.cc:210
+#: about.cc:214
 msgid ""
 "Russian:\n"
 "\t Igor Blinov <pitstop at nm.ru>\n"
@@ -368,7 +384,7 @@ msgstr ""
 "\t Igor Blinov <pitstop at nm.ru>\n"
 "\tAlexandre Prokoudine <alexandre.prokoudine at gmail.com>\n"
 
-#: about.cc:212
+#: about.cc:216
 msgid ""
 "Greek:\n"
 "\t Klearchos Gourgourinis <muadib at in.gr>\n"
@@ -376,7 +392,7 @@ msgstr ""
 "Řečtina:\n"
 "\t Klearchos Gourgourinis <muadib at in.gr>\n"
 
-#: about.cc:213
+#: about.cc:217
 msgid ""
 "Swedish:\n"
 "\t Petter Sundlöf <petter.sundlof at gmail.com>\n"
@@ -384,7 +400,7 @@ msgstr ""
 "Švédština:\n"
 "\t Petter Sundlöf <petter.sundlof at gmail.com>\n"
 
-#: about.cc:214
+#: about.cc:218
 msgid ""
 "Polish:\n"
 "\t Piotr Zaryk <pzaryk at gmail.com>\n"
@@ -392,7 +408,7 @@ msgstr ""
 "Polština:\n"
 "\t Piotr Zaryk <pzaryk at gmail.com>\n"
 
-#: about.cc:215
+#: about.cc:219
 msgid ""
 "Czech:\n"
 "\t Pavel Fric <pavelfric at seznam.cz>\n"
@@ -400,7 +416,7 @@ msgstr ""
 "Čeština:\n"
 "\t Pavel Fric <pavelfric at seznam.cz>\n"
 
-#: about.cc:216
+#: about.cc:220
 msgid ""
 "Norwegian:\n"
 "\t Eivind Ødegård\n"
@@ -408,7 +424,7 @@ msgstr ""
 "Norština:\n"
 "\t Eivind Ødegård\n"
 
-#: about.cc:217
+#: about.cc:221
 msgid ""
 "Chinese:\n"
 "\t Rui-huai Zhang <zrhzrh at mail.ustc.edu.cn>\n"
@@ -416,49 +432,50 @@ msgstr ""
 "Čínština:\n"
 "\t Rui-huai Zhang <zrhzrh at mail.ustc.edu.cn>\n"
 
-#: about.cc:597
+#: about.cc:601
 msgid "Intel 64-bit"
 msgstr "Intel 64-bitů"
 
-#: about.cc:599
+#: about.cc:603
 msgid "Intel 32-bit"
 msgstr "Intel 32-bitů"
 
-#: about.cc:601
+#: about.cc:605
 msgid "PowerPC 64-bit"
 msgstr "PowerPC 64-bitů"
 
-#: about.cc:603
+#: about.cc:607
 msgid "PowerPC 32-bit"
 msgstr "PowerPC 32-bitů"
 
-#: about.cc:605
+#: about.cc:609
 msgid "64-bit"
 msgstr "64-bitů"
 
-#: about.cc:607
+#: about.cc:611
 msgid "32-bit"
 msgstr "32-bitů"
 
-#: about.cc:615
+#: about.cc:619
+msgid " - debug"
+msgstr ""
+
+#: about.cc:625
 msgid "Copyright (C) 1999-2015 Paul Davis\n"
 msgstr "Autorské právo (C) 1999-2015 Paul Davis\n"
 
-#: about.cc:619
+#: about.cc:629
 msgid "http://ardour.org/"
 msgstr "http://www.ardour.org"
 
-#: about.cc:620
+#: about.cc:630
 msgid ""
 "%1%2\n"
-"(built from revision %3)\n"
-"%4"
+"(rev %3)\n"
+"%4%5"
 msgstr ""
-"%1%2\n"
-"(Sestaveno na základě revize %3)"
-"%4"
 
-#: about.cc:625
+#: about.cc:635
 msgid "Config"
 msgstr "Nastavení"
 
@@ -478,108 +495,131 @@ msgstr "%1 soubor s vymezením nabídky nenalezen"
 msgid "%1 will not work without a valid menu definition file"
 msgstr "%1 nebude pracovat bez platného souboru vymezujícího nabídku"
 
-#: add_route_dialog.cc:54 route_params_ui.cc:524
-msgid "Add Track or Bus"
-msgstr "Přidat stopu nebo sběrnici"
+#: add_route_dialog.cc:58
+msgid "Add Track/Bus/VCA"
+msgstr ""
 
-#: add_route_dialog.cc:57
+#: add_route_dialog.cc:61
 msgid "Configuration:"
 msgstr "Nastavení:"
 
-#: add_route_dialog.cc:58
+#: add_route_dialog.cc:62
 msgid "Record Mode:"
 msgstr "Režim nahrávání:"
 
-#: add_route_dialog.cc:59
+#: add_route_dialog.cc:63
 msgid "Instrument:"
 msgstr "Nástroj:"
 
-#: add_route_dialog.cc:77
+#: add_route_dialog.cc:77 add_route_dialog.cc:228
 msgid "Audio Tracks"
 msgstr "Zvukové stopy"
 
-#: add_route_dialog.cc:78 add_route_dialog.cc:209
+#: add_route_dialog.cc:78 add_route_dialog.cc:224
 msgid "MIDI Tracks"
 msgstr "Stopy MIDI"
 
-#: add_route_dialog.cc:79 add_route_dialog.cc:211
+#: add_route_dialog.cc:79 add_route_dialog.cc:226
 msgid "Audio+MIDI Tracks"
 msgstr "Zvukové a MIDI stopy"
 
-#: add_route_dialog.cc:80 add_route_dialog.cc:207
-msgid "Busses"
-msgstr "Sběrnice"
+#: add_route_dialog.cc:80 add_route_dialog.cc:220
+msgid "Audio Busses"
+msgstr ""
+
+#: add_route_dialog.cc:81 add_route_dialog.cc:222
+msgid "MIDI Busses"
+msgstr ""
+
+#: add_route_dialog.cc:82
+msgid "VCA Masters"
+msgstr ""
 
-#: add_route_dialog.cc:83 add_route_dialog.cc:554
+#: add_route_dialog.cc:85 add_route_dialog.cc:622
 msgid "First"
 msgstr "První"
 
-#: add_route_dialog.cc:84 add_route_dialog.cc:558
+#: add_route_dialog.cc:86 add_route_dialog.cc:626
 msgid "Before Selection"
 msgstr "Před výběrem"
 
-#: add_route_dialog.cc:85 add_route_dialog.cc:556
+#: add_route_dialog.cc:87 add_route_dialog.cc:624
 msgid "After Selection"
 msgstr "Po výběru"
 
-#: add_route_dialog.cc:86
+#: add_route_dialog.cc:88
 msgid "Last"
 msgstr "Poslední"
 
-#: add_route_dialog.cc:103
+#: add_route_dialog.cc:91
+msgid "Flexible-I/O"
+msgstr ""
+
+#: add_route_dialog.cc:92
+msgid "Strict-I/O"
+msgstr ""
+
+#: add_route_dialog.cc:108
 msgid "Add:"
 msgstr "Přidat:"
 
-#: add_route_dialog.cc:116 time_fx_dialog.cc:91 add_video_dialog.cc:135
+#: add_route_dialog.cc:121 time_fx_dialog.cc:101 add_video_dialog.cc:135
 #: video_server_dialog.cc:118
 msgid "<b>Options</b>"
 msgstr "<b>Volby</b>"
 
-#: add_route_dialog.cc:126 bundle_manager.cc:193 region_editor.cc:52
-#: route_group_dialog.cc:71
+#: add_route_dialog.cc:131 bundle_manager.cc:193 region_editor.cc:52
+#: route_group_dialog.cc:70
 msgid "Name:"
 msgstr "Název:"
 
-#: add_route_dialog.cc:156
+#: add_route_dialog.cc:155
 msgid "Group:"
 msgstr "Skupina:"
 
-#: add_route_dialog.cc:162
+#: add_route_dialog.cc:161
 msgid "Insert:"
 msgstr "Vložit:"
 
-#: add_route_dialog.cc:223 add_route_dialog.cc:232 add_route_dialog.cc:306
-#: ardour_ui_ed.cc:574 engine_dialog.cc:242 rc_option_editor.cc:2257
-#: rc_option_editor.cc:2259 rc_option_editor.cc:2261 rc_option_editor.cc:2279
-#: rc_option_editor.cc:2281 rc_option_editor.cc:2290 rc_option_editor.cc:2292
-#: rc_option_editor.cc:2310 rc_option_editor.cc:2323 rc_option_editor.cc:2326
-#: rc_option_editor.cc:2328 rc_option_editor.cc:2373 rc_option_editor.cc:2375
-#: rc_option_editor.cc:2377 rc_option_editor.cc:2385 rc_option_editor.cc:2393
-#: rc_option_editor.cc:2395 rc_option_editor.cc:2403
+#: add_route_dialog.cc:171
+msgid "Output Ports:"
+msgstr ""
+
+#: add_route_dialog.cc:176 rc_option_editor.cc:2474
+msgid ""
+"With strict-i/o enabled, Effect Processors will not modify the number of "
+"channels on a track. The number of output channels will always match the "
+"number of input channels."
+msgstr ""
+
+#: add_route_dialog.cc:240 add_route_dialog.cc:351 ardour_ui_ed.cc:636
+#: engine_dialog.cc:244 plugin_pin_dialog.cc:67 rc_option_editor.cc:2397
+#: rc_option_editor.cc:2399 rc_option_editor.cc:2401 rc_option_editor.cc:2419
+#: rc_option_editor.cc:2421 rc_option_editor.cc:2429 rc_option_editor.cc:2432
+#: rc_option_editor.cc:2450 rc_option_editor.cc:2463 rc_option_editor.cc:2472
+#: rc_option_editor.cc:2478 rc_option_editor.cc:2480 rc_option_editor.cc:2525
+#: rc_option_editor.cc:2527 rc_option_editor.cc:2529 rc_option_editor.cc:2537
 msgid "Audio"
 msgstr "Zvuk"
 
-#: add_route_dialog.cc:224 add_route_dialog.cc:235 add_route_dialog.cc:307
-#: editor_actions.cc:110 engine_dialog.cc:244 missing_file_dialog.cc:60
-#: rc_option_editor.cc:2536 rc_option_editor.cc:2538 rc_option_editor.cc:2548
-#: rc_option_editor.cc:2557 rc_option_editor.cc:2565 rc_option_editor.cc:2573
-#: rc_option_editor.cc:2581 rc_option_editor.cc:2589 rc_option_editor.cc:2591
-#: rc_option_editor.cc:2599 rc_option_editor.cc:2601 rc_option_editor.cc:2609
-#: rc_option_editor.cc:2618 rc_option_editor.cc:2620 rc_option_editor.cc:2628
-#: rc_option_editor.cc:2636 rc_option_editor.cc:2645 rc_option_editor.cc:2654
-#: rc_option_editor.cc:2677
+#: add_route_dialog.cc:243 add_route_dialog.cc:352 editor_actions.cc:112
+#: engine_dialog.cc:246 missing_file_dialog.cc:60 mixer_ui.cc:1895
+#: plugin_pin_dialog.cc:68 rc_option_editor.cc:2672 rc_option_editor.cc:2674
+#: rc_option_editor.cc:2684 rc_option_editor.cc:2693 rc_option_editor.cc:2701
+#: rc_option_editor.cc:2709 rc_option_editor.cc:2717 rc_option_editor.cc:2790
+#: rc_option_editor.cc:2813
 msgid "MIDI"
 msgstr "MIDI"
 
-#: add_route_dialog.cc:225 add_route_dialog.cc:238 add_route_dialog.cc:308
+#: add_route_dialog.cc:246 add_route_dialog.cc:353
 msgid "Audio+MIDI"
 msgstr "Zvuk + MIDI"
 
-#: add_route_dialog.cc:226 add_route_dialog.cc:241 add_route_dialog.cc:309
+#: add_route_dialog.cc:250 add_route_dialog.cc:354
 msgid "Bus"
 msgstr "Sběrnice"
 
-#: add_route_dialog.cc:268
+#: add_route_dialog.cc:286
 msgid ""
 "Audio+MIDI tracks are intended for use <b>ONLY</b> with plugins that use "
 "both audio and MIDI input data\n"
@@ -593,60 +633,61 @@ msgstr ""
 "Pokud takový přídavný modul nemáte v úmyslu používat, potom namísto toho "
 "použijte normální zvukovou nebo MIDI stopu."
 
-#: add_route_dialog.cc:327 add_route_dialog.cc:346 editor_actions.cc:438
-#: editor_rulers.cc:250 time_axis_view.cc:1383
+#: add_route_dialog.cc:373 add_route_dialog.cc:385 editor_actions.cc:456
+#: editor_rulers.cc:250 time_axis_view.cc:1290
 msgid "Normal"
 msgstr "Obvyklá"
 
-#: add_route_dialog.cc:330 add_route_dialog.cc:348
+#: add_route_dialog.cc:374 add_route_dialog.cc:387
 msgid "Non Layered"
 msgstr "Nevrstvená"
 
-#: add_route_dialog.cc:331 add_route_dialog.cc:350
+#: add_route_dialog.cc:375 add_route_dialog.cc:389
 msgid "Tape"
 msgstr "Pásek"
 
-#: add_route_dialog.cc:431 monitor_section.cc:270
+#: add_route_dialog.cc:476 monitor_section.cc:273 plugin_pin_dialog.cc:509
+#: plugin_setup_dialog.cc:202
 msgid "Mono"
 msgstr "Mono"
 
-#: add_route_dialog.cc:435
+#: add_route_dialog.cc:480 plugin_pin_dialog.cc:512 plugin_setup_dialog.cc:205
 msgid "Stereo"
 msgstr "Stereo"
 
-#: add_route_dialog.cc:459
+#: add_route_dialog.cc:503
 msgid "3 Channel"
 msgstr "3 kanály"
 
-#: add_route_dialog.cc:463
+#: add_route_dialog.cc:507
 msgid "4 Channel"
 msgstr "4 kanály"
 
-#: add_route_dialog.cc:467
+#: add_route_dialog.cc:511
 msgid "5 Channel"
 msgstr "5 kanálů"
 
-#: add_route_dialog.cc:471
+#: add_route_dialog.cc:515
 msgid "6 Channel"
 msgstr "6 kanálů"
 
-#: add_route_dialog.cc:475
+#: add_route_dialog.cc:519
 msgid "8 Channel"
 msgstr "8 kanálů"
 
-#: add_route_dialog.cc:479
+#: add_route_dialog.cc:523
 msgid "12 Channel"
 msgstr "12 kanálů"
 
-#: add_route_dialog.cc:483 mixer_strip.cc:1920 mixer_strip.cc:2365
+#: add_route_dialog.cc:527 mixer_strip.cc:2009 mixer_strip.cc:2455
 msgid "Custom"
 msgstr "Vlastní"
 
-#: add_route_dialog.cc:516 add_route_dialog.cc:532 route_group_menu.cc:81
+#: add_route_dialog.cc:569 add_route_dialog.cc:585 route_group_menu.cc:85
 msgid "New Group..."
 msgstr "Nová skupina..."
 
-#: add_route_dialog.cc:520 route_group_menu.cc:85
+#: add_route_dialog.cc:573 route_group_menu.cc:89
 msgid "No Group"
 msgstr "Žádná skupina"
 
@@ -676,68 +717,60 @@ msgstr ""
 msgid "Done"
 msgstr "Hotovo"
 
-#: analysis_window.cc:46
+#: analysis_window.cc:45
 msgid "Signal source"
 msgstr "Zdroj signálu"
 
-#: analysis_window.cc:47
+#: analysis_window.cc:46
 msgid "Selected ranges"
 msgstr "Vybrané rozsahy"
 
-#: analysis_window.cc:48
+#: analysis_window.cc:47
 msgid "Selected regions"
 msgstr "Vybrané oblasti"
 
-#: analysis_window.cc:50
-msgid "Display model"
-msgstr "Typ zobrazení"
-
-#: analysis_window.cc:51
-msgid "Composite graphs for each track"
-msgstr "Sloučené grafy pro každou stopu"
-
-#: analysis_window.cc:52
-msgid "Composite graph of all tracks"
-msgstr "Sloučený grafy všech stop"
-
-#: analysis_window.cc:54
+#: analysis_window.cc:48
 msgid "Show frequency power range"
 msgstr "Ukázat kmitočtový výkonnostní rozsah"
 
-#: analysis_window.cc:55
-msgid "Normalize values"
-msgstr "Normalizovat hodnoty"
+#: analysis_window.cc:49
+msgid "Fit dB range"
+msgstr ""
 
-#: analysis_window.cc:59
+#: analysis_window.cc:50
+msgid "Proportional Spectrum, -18dB"
+msgstr ""
+
+#: analysis_window.cc:53
 msgid "FFT analysis window"
 msgstr "Okno pro rozbor FFT"
 
-#: analysis_window.cc:60 editor.cc:1848
+#: analysis_window.cc:54 editor.cc:1953
 msgid "Spectral Analysis"
 msgstr "Spektrální analýza (FFT rozbor)"
 
-#: analysis_window.cc:67 editor_actions.cc:143 session_metadata_dialog.cc:667
+#: analysis_window.cc:61 editor_actions.cc:145 session_metadata_dialog.cc:670
 msgid "Track"
 msgstr "Stopa"
 
-#: analysis_window.cc:68 editor_actions.cc:664 mixer_ui.cc:135
-#: mixer_ui.cc:2040
+#: analysis_window.cc:62 ardour_ui_ed.cc:254 ardour_ui_ed.cc:255
+#: ardour_ui_ed.cc:256 editor_actions.cc:689 mixer_ui.cc:151 mixer_ui.cc:2134
 msgid "Show"
 msgstr "Ukázat"
 
-#: analysis_window.cc:135
+#: analysis_window.cc:107
 msgid "Re-analyze data"
 msgstr "Znovu zpracovat data"
 
-#: ardour_button.cc:820
+#: ardour_button.cc:876
 msgid "button cannot watch state of non-existing Controllable\n"
 msgstr "Tlačítko nemůže sledovat stav neexistujícího ovladatelného prvku\n"
 
-#: ardour_button.cc:1088
+#: ardour_button.cc:1144
 msgid "ABCDEFGHIJLKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
 msgstr "ABCDEFGHIJLKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
 
-#: ardour_ui.cc:174
+#: ardour_ui.cc:198
 msgid ""
 "%1 %2.x has discovered configuration files from %1 %3.x.\n"
 "\n"
@@ -751,83 +784,130 @@ msgstr ""
 "\n"
 "(To bude vyžadovat opětovné spuštění %1.)"
 
-#: ardour_ui.cc:253 editor_actions.cc:658 region_editor.cc:53
+#: ardour_ui.cc:283 editor_actions.cc:683 region_editor.cc:53
 msgid "Audition"
 msgstr "Poslech"
 
-#: ardour_ui.cc:254 editor_actions.cc:137 mixer_strip.cc:2115
-#: monitor_section.cc:326 rc_option_editor.cc:2413 route_time_axis.cc:255
-#: route_time_axis.cc:2748
+#: ardour_ui.cc:284 editor_actions.cc:139 mixer_strip.cc:2205
+#: monitor_section.cc:329 rc_option_editor.cc:2547 route_time_axis.cc:263
+#: route_time_axis.cc:2740 vca_master_strip.cc:212 vca_time_axis.cc:237
 msgid "Solo"
 msgstr "Sólo"
 
-#: ardour_ui.cc:255 rc_option_editor.cc:1356
+#: ardour_ui.cc:285 rc_option_editor.cc:1357
 msgid "Feedback"
 msgstr "Zpětná vazba"
 
-#: ardour_ui.cc:264 speaker_dialog.cc:36
+#: ardour_ui.cc:296 speaker_dialog.cc:36
 msgid "Speaker Configuration"
 msgstr "Nastavení reproduktoru"
 
-#: ardour_ui.cc:265 keyeditor.cc:53
-msgid "Key Bindings"
-msgstr "Klávesové zkratky"
-
-#: ardour_ui.cc:266
-msgid "Preferences"
-msgstr "Nastavení"
-
-#: ardour_ui.cc:267 ardour_ui.cc:274
+#: ardour_ui.cc:297
 msgid "Add Tracks/Busses"
 msgstr "Přidat stopy/sběrnice"
 
-#: ardour_ui.cc:268
+#: ardour_ui.cc:298
 msgid "About"
 msgstr "O programu"
 
-#: ardour_ui.cc:269 location_ui.cc:1143 session_option_editor.cc:210
-#: session_option_editor.cc:216 session_option_editor.cc:223
-msgid "Locations"
-msgstr "Místa"
+#: ardour_ui.cc:299 location_ui.cc:1167
+msgid "Ranges|Locations"
+msgstr ""
 
-#: ardour_ui.cc:270 route_params_ui.cc:59 route_params_ui.cc:630
+#: ardour_ui.cc:300 route_params_ui.cc:59 route_params_ui.cc:620
 msgid "Tracks and Busses"
 msgstr "Stopy a sběrnice"
 
-#: ardour_ui.cc:271 engine_dialog.cc:73
+#: ardour_ui.cc:301 engine_dialog.cc:73
 msgid "Audio/MIDI Setup"
 msgstr "Nastavení zvuku/MIDI"
 
-#: ardour_ui.cc:272
+#: ardour_ui.cc:302
 msgid "Video Export Dialog"
 msgstr "Dialog pro vyvedení obrazového záznamu"
 
-#: ardour_ui.cc:273
+#: ardour_ui.cc:303 lua_script_manager.cc:30
+msgid "Script Manager"
+msgstr ""
+
+#: ardour_ui.cc:304
 msgid "Properties"
 msgstr "Vlastnosti"
 
-#: ardour_ui.cc:275 bundle_manager.cc:264
+#: ardour_ui.cc:305
+msgid "Add Video"
+msgstr ""
+
+#: ardour_ui.cc:306 bundle_manager.cc:264
 msgid "Bundle Manager"
 msgstr "Správce balíků"
 
-#: ardour_ui.cc:276 big_clock_window.cc:37
+#: ardour_ui.cc:307 big_clock_window.cc:37
 msgid "Big Clock"
 msgstr "Velký ukazatel času"
 
-#: ardour_ui.cc:277
+#: ardour_ui.cc:308
 msgid "Audio Connections"
 msgstr "Zvuková spojení"
 
-#: ardour_ui.cc:278
+#: ardour_ui.cc:309
 msgid "MIDI Connections"
 msgstr "Spojení MIDI"
 
-#: ardour_ui.cc:295
+#: ardour_ui.cc:310
+msgid "Bindings Editor"
+msgstr ""
+
+#: ardour_ui.cc:321 editor.cc:1288
+msgid "Window|Editor"
+msgstr ""
+
+#: ardour_ui.cc:322 mixer_ui.cc:2210 mixer_ui.cc:2216
+msgid "Window|Mixer"
+msgstr "Okno/Směšovač"
+
+#: ardour_ui.cc:323
+msgid "Window|Preferences"
+msgstr ""
+
+#: ardour_ui.cc:330
 msgid "Your configuration files were copied. You can now restart %1."
 msgstr ""
 "Soubory s vaším nastavením byly zkopírovány. Nyní můžete %1 spustit znovu."
 
-#: ardour_ui.cc:527
+#: ardour_ui.cc:509
+msgid "Pre-Release Warning"
+msgstr ""
+
+#: ardour_ui.cc:513
+msgid ""
+"<b>Welcome to this pre-release build of %1 %2</b>\n"
+"\n"
+"There are still several issues and bugs to be worked on,\n"
+"as well as general workflow improvements, before this can be considered\n"
+"release software. So, a few guidelines:\n"
+"\n"
+"1) Please do <b>NOT</b> use this software with the expectation that it is "
+"stable or reliable\n"
+"   though it may be so, depending on your workflow.\n"
+"2) Please wait for a helpful writeup of new features.\n"
+"3) <b>Please do NOT use the forums at ardour.org to report issues</b>.\n"
+"4) Please <b>DO</b> use the bugtracker at http://tracker.ardour.org/ to "
+"report issues\n"
+"   making sure to note the product version number as 5.0-pre.\n"
+"5) Please <b>DO</b> use the ardour-users mailing list to discuss ideas and "
+"pass on comments.\n"
+"6) Please <b>DO</b> join us on IRC for real time discussions about %1 %2. "
+"You\n"
+"   can get there directly from within the program via the Help->Chat menu "
+"option.\n"
+"\n"
+"Full information on all the above can be found on the support page at\n"
+"\n"
+"                http://ardour.org/support\n"
+msgstr ""
+
+#: ardour_ui.cc:613
 msgid ""
 "The audio backend was shutdown because:\n"
 "\n"
@@ -837,7 +917,7 @@ msgstr ""
 "\n"
 "%1"
 
-#: ardour_ui.cc:529
+#: ardour_ui.cc:615
 msgid ""
 "The audio backend has either been shutdown or it\n"
 "disconnected %1 because %1\n"
@@ -848,7 +928,7 @@ msgstr ""
 "protože %1 nebyl dostatečně rychlý. Zkuste zvukovou podpůrnou vrstvu\n"
 "spustit znovu a sezení uložte."
 
-#: ardour_ui.cc:553
+#: ardour_ui.cc:639
 msgid ""
 "Audio Unit Plugin Scan Failed. Automatic AU scanning has been disabled. "
 "Please see the log window for further details."
@@ -856,39 +936,39 @@ msgstr ""
 "Vyhledání přídavného modulu Audio Unit se nezdařilo. Automatické hledání AU "
 "bylo vypnuto. Na další podrobnosti se, prosím, podívejte v okně se zápisem."
 
-#: ardour_ui.cc:554
+#: ardour_ui.cc:640
 msgid "Audio Unit Plugin Scan Failed:"
 msgstr "Vyhledání přídavného modulu Audio Unit se nezdařilo."
 
-#: ardour_ui.cc:903
+#: ardour_ui.cc:1008
 msgid "NSM server did not announce itself"
 msgstr "Server NSM se neohlásil"
 
-#: ardour_ui.cc:916
+#: ardour_ui.cc:1021
 msgid "NSM: no client ID provided"
 msgstr "NSM: Neposkytnuto žádné ID klienta"
 
-#: ardour_ui.cc:923
+#: ardour_ui.cc:1028
 msgid "NSM: no session created"
 msgstr "NSM: Nevytvořeno žádné sezení"
 
-#: ardour_ui.cc:946
+#: ardour_ui.cc:1051
 msgid "NSM: initialization failed"
 msgstr "NSM: Inicializace selhala"
 
-#: ardour_ui.cc:978
+#: ardour_ui.cc:1083
 msgid "Free/Demo Version Warning"
 msgstr "Varování: volná zkušební verze"
 
-#: ardour_ui.cc:980
+#: ardour_ui.cc:1085
 msgid "Subscribe and support development of %1"
 msgstr "Pravidelně dávejte peníze a podpořte vývoj %1"
 
-#: ardour_ui.cc:981
+#: ardour_ui.cc:1086
 msgid "Don't warn me about this again"
 msgstr "O tomto mi už víckrát neříkat"
 
-#: ardour_ui.cc:983
+#: ardour_ui.cc:1088
 msgid ""
 "<span weight=\"bold\" size=\"large\">%1</span>\n"
 "\n"
@@ -906,15 +986,15 @@ msgstr ""
 "\n"
 "%4"
 
-#: ardour_ui.cc:984
+#: ardour_ui.cc:1089
 msgid "This is a free/demo version of %1"
 msgstr "Toto je volná zkušební verze %1"
 
-#: ardour_ui.cc:985
+#: ardour_ui.cc:1090
 msgid "It will not restore OR save any plugin settings"
 msgstr "Nelze v ní uložit nebo nahrát žádné nastavení přídavných modulů"
 
-#: ardour_ui.cc:986
+#: ardour_ui.cc:1091
 msgid ""
 "If you load an existing session with plugin settings\n"
 "they will not be used and will be lost."
@@ -922,7 +1002,7 @@ msgstr ""
 "Pokud nahrajete stávající sezení s nastavením přídavných modulů,\n"
 "nepoužijí se a budou ztraceny."
 
-#: ardour_ui.cc:988 plugin_ui.cc:579
+#: ardour_ui.cc:1093 plugin_ui.cc:579
 msgid ""
 "To get full access to updates without this limitation\n"
 "consider becoming a subscriber for a low cost every month."
@@ -930,19 +1010,19 @@ msgstr ""
 "Pro získání plného přístupu k aktualizacím bez těchto omezení\n"
 "zvažte, že nás podpoříte pravidelným přispíváním malou částkou každý měsíc."
 
-#: ardour_ui.cc:998
+#: ardour_ui.cc:1103
 msgid "Quit now"
 msgstr "Ukončit nyní"
 
-#: ardour_ui.cc:999
+#: ardour_ui.cc:1104
 msgid "Continue using %1"
 msgstr "Pokračovat pomocí %1"
 
-#: ardour_ui.cc:1032 startup.cc:348
+#: ardour_ui.cc:1135 startup.cc:349
 msgid "%1 is ready for use"
 msgstr "%1 je připraven pro použití"
 
-#: ardour_ui.cc:1074
+#: ardour_ui.cc:1185
 msgid ""
 "WARNING: Your system has a limit for maximum amount of locked memory. This "
 "might cause %1 to run out of memory before your system runs out of memory. \n"
@@ -957,23 +1037,23 @@ msgstr ""
 "Můžete se podívat na omezení pro paměť pomocí příkazu 'ulimit -l', a obvykle "
 "můžete toto nastavení změnit %2."
 
-#: ardour_ui.cc:1091
+#: ardour_ui.cc:1202
 msgid "Do not show this window again"
 msgstr "Neukazovat toto okno s hlášením znovu"
 
-#: ardour_ui.cc:1135
+#: ardour_ui.cc:1245
 msgid "Don't quit"
 msgstr "Neukončit"
 
-#: ardour_ui.cc:1136
+#: ardour_ui.cc:1246
 msgid "Just quit"
 msgstr "Pouze ukončit"
 
-#: ardour_ui.cc:1137 ardour_ui.cc:5009
+#: ardour_ui.cc:1247 ardour_ui.cc:5362
 msgid "Save and quit"
 msgstr "Uložit a ukončit"
 
-#: ardour_ui.cc:1147
+#: ardour_ui.cc:1257
 msgid ""
 "%1 was unable to save your session.\n"
 "\n"
@@ -987,11 +1067,11 @@ msgstr ""
 "\n"
 "\"Pouze ukončit\"."
 
-#: ardour_ui.cc:1197
+#: ardour_ui.cc:1307
 msgid "Unsaved Session"
 msgstr "Neuložené sezení"
 
-#: ardour_ui.cc:1218
+#: ardour_ui.cc:1328
 msgid ""
 "The session \"%1\"\n"
 "has not been saved.\n"
@@ -1009,7 +1089,7 @@ msgstr ""
 "\n"
 "Co chcete dělat?"
 
-#: ardour_ui.cc:1221
+#: ardour_ui.cc:1331
 msgid ""
 "The snapshot \"%1\"\n"
 "has not been saved.\n"
@@ -1027,107 +1107,108 @@ msgstr ""
 "\n"
 "Co chcete dělat?"
 
-#: ardour_ui.cc:1235
+#: ardour_ui.cc:1345
 msgid "Prompter"
 msgstr "Otázka"
 
-#: ardour_ui.cc:1349 ardour_ui.cc:1357
+#: ardour_ui.cc:1459 ardour_ui.cc:1467
 msgid "Audio: <span foreground=\"red\">none</span>"
 msgstr "Zvuk: <span foreground=\"red\">žádný</span>"
 
-#: ardour_ui.cc:1361
+#: ardour_ui.cc:1471
 #, c-format
 msgid "Audio: <span foreground=\"green\">%.1f kHz / %4.1f ms</span>"
 msgstr "Zvuk: <span foreground=\"green\">%.1f kHz / %4.1f ms</span>"
 
-#: ardour_ui.cc:1365
+#: ardour_ui.cc:1475
 #, c-format
 msgid "Audio: <span foreground=\"green\">%<PRId64> kHz / %4.1f ms</span>"
 msgstr "Zvuk: <span foreground=\"green\">%<PRId64> kHz / %4.1f ms</span>"
 
-#: ardour_ui.cc:1383 export_video_dialog.cc:76
+#: ardour_ui.cc:1493 export_report.cc:108 export_report.cc:323
+#: export_video_dialog.cc:76
 msgid "File:"
 msgstr "Soubor:"
 
-#: ardour_ui.cc:1387
+#: ardour_ui.cc:1497
 msgid "BWF"
 msgstr "BWF"
 
-#: ardour_ui.cc:1390
+#: ardour_ui.cc:1500
 msgid "WAV"
 msgstr "WAV"
 
-#: ardour_ui.cc:1393
+#: ardour_ui.cc:1503
 msgid "WAV64"
 msgstr "WAV64"
 
-#: ardour_ui.cc:1396 session_option_editor.cc:202
+#: ardour_ui.cc:1506 session_option_editor.cc:202
 msgid "CAF"
 msgstr "CAF"
 
-#: ardour_ui.cc:1399
+#: ardour_ui.cc:1509
 msgid "AIFF"
 msgstr "AIFF"
 
-#: ardour_ui.cc:1402
+#: ardour_ui.cc:1512
 msgid "iXML"
 msgstr "iXML"
 
-#: ardour_ui.cc:1405 session_option_editor.cc:203
+#: ardour_ui.cc:1515 session_option_editor.cc:203
 msgid "RF64"
 msgstr "RF64"
 
-#: ardour_ui.cc:1408
+#: ardour_ui.cc:1518
 msgid "RF64/WAV"
 msgstr "RF64/WAV"
 
-#: ardour_ui.cc:1411
+#: ardour_ui.cc:1521
 msgid "MBWF"
 msgstr "MBWF"
 
-#: ardour_ui.cc:1419
+#: ardour_ui.cc:1529
 msgid "32-float"
 msgstr "32-float"
 
-#: ardour_ui.cc:1422
+#: ardour_ui.cc:1532
 msgid "24-int"
 msgstr "24-int"
 
-#: ardour_ui.cc:1425
+#: ardour_ui.cc:1535
 msgid "16-int"
 msgstr "16-int"
 
-#: ardour_ui.cc:1446
+#: ardour_ui.cc:1556
 #, c-format
 msgid "X: <span foreground=\"%s\">>10K</span>"
 msgstr "X: <span foreground=\"%s\">>10K</span>"
 
-#: ardour_ui.cc:1448
+#: ardour_ui.cc:1558
 #, c-format
 msgid "X: <span foreground=\"%s\">%u</span>"
 msgstr "X: <span foreground=\"%s\">%u</span>"
 
-#: ardour_ui.cc:1451
+#: ardour_ui.cc:1561
 #, c-format
 msgid "X: <span foreground=\"%s\">?</span>"
 msgstr "X: <span foreground=\"%s\">?</span>"
 
-#: ardour_ui.cc:1454
+#: ardour_ui.cc:1564
 msgid "Audio dropouts. Shift+click to reset"
 msgstr "Přerušení záznamu zvuku. Shift-klepnutí pro vynulování"
 
-#: ardour_ui.cc:1467
+#: ardour_ui.cc:1577
 #, c-format
 msgid "DSP: <span foreground=\"%s\">%5.1f%%</span>"
 msgstr ""
 "Digitální zpracování signálu (DSP): <span foreground=\"%s\">%5.1f%%</span>"
 
-#: ardour_ui.cc:1477
+#: ardour_ui.cc:1587
 #, c-format
 msgid "PkBld: <span foreground=\"%s\">%d</span>"
 msgstr "PkBld: <span foreground=\"%s\">%d</span>"
 
-#: ardour_ui.cc:1499
+#: ardour_ui.cc:1609
 #, c-format
 msgid ""
 "Buffers: <span foreground=\"green\">p:</span><span foreground=\"%s\">"
@@ -1138,29 +1219,29 @@ msgstr ""
 "\">%<PRIu32>%%</span> <span foreground=\"green\">c:</span><span foreground="
 "\"%s\">%<PRIu32>%%</span>"
 
-#: ardour_ui.cc:1540
+#: ardour_ui.cc:1650
 msgid "Disk: <span foreground=\"green\">Unknown</span>"
 msgstr "Disk: <span foreground=\"green\">Neznámý</span>"
 
-#: ardour_ui.cc:1542
+#: ardour_ui.cc:1652
 msgid "Disk: <span foreground=\"green\">24hrs+</span>"
 msgstr "Disk: <span foreground=\"green\">24 hodin +</span>"
 
-#: ardour_ui.cc:1560
+#: ardour_ui.cc:1670
 msgid "Disk: <span foreground=\"green\">>24 hrs</span>"
 msgstr "Disk: <span foreground=\"green\">>24 hodin</span>"
 
-#: ardour_ui.cc:1571
+#: ardour_ui.cc:1681
 #, c-format
 msgid "Disk: <span foreground=\"%s\">%02dh:%02dm:%02ds</span>"
 msgstr "Disk: <span foreground=\"%s\">%02dh:%02dm:%02ds</span>"
 
-#: ardour_ui.cc:1597
+#: ardour_ui.cc:1707
 #, c-format
 msgid "Timecode|TC: <span foreground=\"%s\">%s</span>"
 msgstr "Časový kód|ČK: <span foreground=\"%s\">%s</span>"
 
-#: ardour_ui.cc:1675
+#: ardour_ui.cc:1789
 msgid ""
 "%1 is not connected to any audio backend.\n"
 "You cannot open or close sessions in this condition"
@@ -1168,55 +1249,61 @@ msgstr ""
 "%1 není spojen s žádnou podpůrnou vrstvou.\n"
 "Za tohoto stavu není možné otevřít nebo zavřít sezení."
 
-#: ardour_ui.cc:1693
+#: ardour_ui.cc:1807
 msgid "Open Session"
 msgstr "Otevřít sezení"
 
-#: ardour_ui.cc:1717 session_dialog.cc:407 session_import_dialog.cc:170
-#: session_metadata_dialog.cc:858
+#: ardour_ui.cc:1831 session_dialog.cc:410 session_import_dialog.cc:170
+#: session_metadata_dialog.cc:861
 msgid "%1 sessions"
 msgstr "%1 sezení"
 
-#: ardour_ui.cc:1748
+#: ardour_ui.cc:1879 ardour_ui.cc:1916
 msgid "You cannot add a track without a session already loaded."
 msgstr "Stopy můžete přidat až teprve tehdy, když bylo sezení nahráno."
 
-#: ardour_ui.cc:1756
+#: ardour_ui.cc:1887
 msgid "could not create %1 new mixed track"
 msgid_plural "could not create %1 new mixed tracks"
 msgstr[0] "Nepodařilo se vytvořit %1 novou smíchanou stopu"
 msgstr[1] "Nepodařilo se vytvořit %1 nové smíchané stopy"
 
-#: ardour_ui.cc:1762 ardour_ui.cc:1823
-msgid ""
-"There are insufficient ports available\n"
-"to create a new track or bus.\n"
-"You should save %1, exit and\n"
-"restart with more ports."
-msgstr ""
-"Je zde nedostatečný počet dostupných přípojek na to,\n"
-"aby se dala vytvořit nová stopa nebo sběrnice.\n"
-"Měl byste uložit %1, ukončit Ardour\n"
-"a spustit znovu s větším počtem přípojek."
+#: ardour_ui.cc:1924
+msgid "could not create %1 new Midi Bus"
+msgid_plural "could not create %1 new Midi Busses"
+msgstr[0] ""
+msgstr[1] ""
 
-#: ardour_ui.cc:1797
+#: ardour_ui.cc:1977
 msgid "You cannot add a track or bus without a session already loaded."
 msgstr ""
 "Stopy nebo sběrnice můžete přidat až teprve tehdy, když bylo sezení nahráno."
 
-#: ardour_ui.cc:1806
+#: ardour_ui.cc:1986
 msgid "could not create %1 new audio track"
 msgid_plural "could not create %1 new audio tracks"
 msgstr[0] "Nelze vytvořit %1 novou zvukovou stopu"
 msgstr[1] "Nelze vytvořit %1 nové zvukové stopy"
 
-#: ardour_ui.cc:1815
+#: ardour_ui.cc:1995
 msgid "could not create %1 new audio bus"
 msgid_plural "could not create %1 new audio busses"
 msgstr[0] "Nepodařilo se vytvořit %1 novou zvukovou sběrnici"
 msgstr[1] "Nepodařilo se vytvořit %1 nové zvukové sběrnice"
 
-#: ardour_ui.cc:1968
+#: ardour_ui.cc:2020
+msgid ""
+"There are insufficient ports available\n"
+"to create a new track or bus.\n"
+"You should save %1, exit and\n"
+"restart with more ports."
+msgstr ""
+"Je zde nedostatečný počet dostupných přípojek na to,\n"
+"aby se dala vytvořit nová stopa nebo sběrnice.\n"
+"Měl byste uložit %1, ukončit Ardour\n"
+"a spustit znovu s větším počtem přípojek."
+
+#: ardour_ui.cc:2164
 msgid ""
 "Please create one or more tracks before trying to record.\n"
 "You can do this with the \"Add Track or Bus\" option in the Session menu."
@@ -1224,20 +1311,20 @@ msgstr ""
 "Vytvořte, prosím, jednu nebo i více stop, předtím než se pokusíte nahrávat.\n"
 "Můžete to udělat volbou \"Přidat stopu nebo sběrnici\" v nabídce pro sezení."
 
-#: ardour_ui.cc:2359
+#: ardour_ui.cc:2565
 #, c-format
 msgid "Copied %<PRId64> of %<PRId64>"
 msgstr "Zkopírováno %<PRId64> z %<PRId64>"
 
-#: ardour_ui.cc:2413 save_as_dialog.cc:33
+#: ardour_ui.cc:2619 save_as_dialog.cc:33
 msgid "Save As"
 msgstr "Uložit jako"
 
-#: ardour_ui.cc:2441
+#: ardour_ui.cc:2647
 msgid "Save As failed: %1"
 msgstr "Nepodařilo se uložit jako: %1"
 
-#: ardour_ui.cc:2463
+#: ardour_ui.cc:2684
 msgid ""
 "To ensure compatibility with various systems\n"
 "snapshot names may not contain a '%1' character"
@@ -1245,35 +1332,35 @@ msgstr ""
 "Pro zajištění slučitelnosti s různými systémy\n"
 "nesmí názvy snímků obrazovky obsahovat znak '%1'"
 
-#: ardour_ui.cc:2477
+#: ardour_ui.cc:2698
 msgid "Confirm Snapshot Overwrite"
 msgstr "Potvrdit přepsání snímku obrazovky"
 
-#: ardour_ui.cc:2478
+#: ardour_ui.cc:2699
 msgid "A snapshot already exists with that name. Do you want to overwrite it?"
 msgstr "Snímek obrazovky s tímto názvem již existuje. Chcete jej přepsat?"
 
-#: ardour_ui.cc:2503
-msgid "Save as..."
-msgstr "Uložit jako..."
+#: ardour_ui.cc:2724
+msgid "Snapshot and switch"
+msgstr ""
 
-#: ardour_ui.cc:2504 ardour_ui.cc:2555
+#: ardour_ui.cc:2725 ardour_ui.cc:2776
 msgid "New session name"
 msgstr "Nový název sezení:"
 
-#: ardour_ui.cc:2506
+#: ardour_ui.cc:2727
 msgid "Take Snapshot"
 msgstr "Udělat snímek"
 
-#: ardour_ui.cc:2507
+#: ardour_ui.cc:2728
 msgid "Name of new snapshot"
 msgstr "Název pro nový snímek"
 
-#: ardour_ui.cc:2554
+#: ardour_ui.cc:2775
 msgid "Rename Session"
 msgstr "Přejmenovat sezení"
 
-#: ardour_ui.cc:2569 ardour_ui.cc:3048 ardour_ui.cc:3086
+#: ardour_ui.cc:2790 ardour_ui.cc:3267 ardour_ui.cc:3305
 msgid ""
 "To ensure compatibility with various systems\n"
 "session names may not contain a '%1' character"
@@ -1281,13 +1368,13 @@ msgstr ""
 "Pro zajištění slučitelnosti s různými systémy\n"
 "nesmí názvy sezení obsahovat znak '%1'"
 
-#: ardour_ui.cc:2577
+#: ardour_ui.cc:2798
 msgid ""
 "That name is already in use by another directory/folder. Please try again."
 msgstr ""
 "Tento název se již používá jiným adresářem/složkou. Zkuste to, prosím, znovu."
 
-#: ardour_ui.cc:2586
+#: ardour_ui.cc:2807
 msgid ""
 "Renaming this session failed.\n"
 "Things could be seriously messed up at this point"
@@ -1295,27 +1382,27 @@ msgstr ""
 "Přejmenování tohoto sezení se nezdařilo.\n"
 "Věci by v tuto chvíli mohly být vážně zvorané"
 
-#: ardour_ui.cc:2702 route_ui.cc:1871
+#: ardour_ui.cc:2923 route_ui.cc:1867
 msgid "Confirm Template Overwrite"
 msgstr "Potvrdit přepsání předlohy"
 
-#: ardour_ui.cc:2703 route_ui.cc:1872
+#: ardour_ui.cc:2924 route_ui.cc:1868
 msgid "A template already exists with that name. Do you want to overwrite it?"
 msgstr "Předloha s tímto názvem již existuje. Chcete ji přepsat?"
 
-#: ardour_ui.cc:2727
+#: ardour_ui.cc:2948
 msgid "Save Template"
 msgstr "Uložit předlohu"
 
-#: ardour_ui.cc:2728
+#: ardour_ui.cc:2949
 msgid "Name for template:"
 msgstr "Název pro předlohu:"
 
-#: ardour_ui.cc:2729
+#: ardour_ui.cc:2950
 msgid "-template"
 msgstr "-předloha"
 
-#: ardour_ui.cc:2766
+#: ardour_ui.cc:2987
 msgid ""
 "This session\n"
 "%1\n"
@@ -1325,39 +1412,39 @@ msgstr ""
 "%1\n"
 "již existuje. Chcete jej otevřít?"
 
-#: ardour_ui.cc:2776
+#: ardour_ui.cc:2997
 msgid "Open Existing Session"
 msgstr "Otevřít stávající sezení"
 
-#: ardour_ui.cc:3076
+#: ardour_ui.cc:3295
 msgid "There is no existing session at \"%1\""
 msgstr "V \"%1\" není žádné sezení"
 
-#: ardour_ui.cc:3170
+#: ardour_ui.cc:3391
 msgid "Please wait while %1 loads your session"
 msgstr "Počkejte, prosím, dokud %1 nenahraje vaše sezení"
 
-#: ardour_ui.cc:3185
+#: ardour_ui.cc:3406
 msgid "Port Registration Error"
 msgstr "Chyba v zápisu přípojky"
 
-#: ardour_ui.cc:3186
+#: ardour_ui.cc:3407
 msgid "Click the Close button to try again."
 msgstr "Klepněte na tlačítko Zavřít, abyste to mohli zkusit znovu."
 
-#: ardour_ui.cc:3205
+#: ardour_ui.cc:3426
 msgid "Session \"%1 (snapshot %2)\" did not load successfully: %3"
 msgstr "Projekt  \"%1 (snímek %2)\" nebyl úspěšně nahrán.: %3"
 
-#: ardour_ui.cc:3211 ardour_ui.cc:3232 ardour_ui.cc:3329 ardour_ui.cc:3338
+#: ardour_ui.cc:3432 ardour_ui.cc:3453 ardour_ui.cc:3548 ardour_ui.cc:3557
 msgid "Loading Error"
 msgstr "Chyba při nahrávání"
 
-#: ardour_ui.cc:3226
+#: ardour_ui.cc:3447
 msgid "Session \"%1 (snapshot %2)\" did not load successfully"
 msgstr "Projekt  \"%1 (snímek %2)\" nebyl úspěšně nahrán."
 
-#: ardour_ui.cc:3254
+#: ardour_ui.cc:3475
 msgid ""
 "This session has been opened in read-only mode.\n"
 "\n"
@@ -1367,19 +1454,19 @@ msgstr ""
 "\n"
 "Nebudete moci nahrávat nebo ukládat."
 
-#: ardour_ui.cc:3259
+#: ardour_ui.cc:3480
 msgid "Read-only Session"
 msgstr "Sezení pouze pro čtení"
 
-#: ardour_ui.cc:3328
+#: ardour_ui.cc:3547
 msgid "Could not create session in \"%1\": %2"
 msgstr "Nepodařilo se vytvořit sezení v \"%1\": %2"
 
-#: ardour_ui.cc:3337
+#: ardour_ui.cc:3556
 msgid "Could not create session in \"%1\""
 msgstr "Nepodařilo se vytvořit sezení v \"%1\""
 
-#: ardour_ui.cc:3377
+#: ardour_ui.cc:3601
 msgid ""
 "<b>Just ask and wait for an answer.\n"
 "It may take from minutes to hours.</b>"
@@ -1387,12 +1474,11 @@ msgstr ""
 "<b>Prostě se zeptejte a počkejte na odpověď.\n"
 "Může to zabrat minuty ale také hodiny.</b>"
 
-#: ardour_ui.cc:3379
+#: ardour_ui.cc:3603
 msgid "About the Chat"
 msgstr "O vedení rozhovoru"
 
-#: ardour_ui.cc:3380
-#, fuzzy
+#: ardour_ui.cc:3604
 msgid ""
 "When you're inside the chat just ask your question and wait for an answer. "
 "The chat is occupied by real people with real lives so many of them are "
@@ -1404,16 +1490,16 @@ msgid ""
 "someone has answered your question."
 msgstr ""
 
-#: ardour_ui.cc:3499
+#: ardour_ui.cc:3723
 msgid "No files were ready for clean-up"
 msgstr "Pro udělání pořádku nebyly připraveny žádné soubory"
 
-#: ardour_ui.cc:3503 ardour_ui.cc:3513 ardour_ui.cc:3646 ardour_ui.cc:3653
-#: ardour_ui_ed.cc:104
+#: ardour_ui.cc:3727 ardour_ui.cc:3737 ardour_ui.cc:3870 ardour_ui.cc:3877
+#: ardour_ui_ed.cc:129
 msgid "Clean-up"
 msgstr "Udělat pořádek"
 
-#: ardour_ui.cc:3504
+#: ardour_ui.cc:3728
 msgid ""
 "If this seems suprising, \n"
 "check for any existing snapshots.\n"
@@ -1425,19 +1511,19 @@ msgstr ""
 "jsou pravděpodobně začleněny ještě v nějakém\n"
 "starším snímku obrazovky jako oblasti."
 
-#: ardour_ui.cc:3563
+#: ardour_ui.cc:3787
 msgid "kilo"
 msgstr "kilo"
 
-#: ardour_ui.cc:3566
+#: ardour_ui.cc:3790
 msgid "mega"
 msgstr "mega"
 
-#: ardour_ui.cc:3569
+#: ardour_ui.cc:3793
 msgid "giga"
 msgstr "giga"
 
-#: ardour_ui.cc:3574
+#: ardour_ui.cc:3798
 msgid ""
 "The following file was deleted from %2,\n"
 "releasing %3 %4bytes of disk space"
@@ -1451,7 +1537,7 @@ msgstr[1] ""
 "Následující soubor byl smazán z %2,\n"
 "a tím se na disku uvolnilo %3 %4 bajtů ukládacího prostoru"
 
-#: ardour_ui.cc:3581
+#: ardour_ui.cc:3805
 msgid ""
 "The following file was not in use and \n"
 "has been moved to: %2\n"
@@ -1489,11 +1575,11 @@ msgstr[1] ""
 "\n"
 "uvolní se na disku dalších %3 %4 bajtů ukládacího prostoru.\n"
 
-#: ardour_ui.cc:3641
+#: ardour_ui.cc:3865
 msgid "Are you sure you want to clean-up?"
 msgstr "Jste si jistý, že chcete udělat pořádek?"
 
-#: ardour_ui.cc:3648
+#: ardour_ui.cc:3872
 msgid ""
 "Clean-up is a destructive operation.\n"
 "ALL undo/redo information will be lost if you clean-up.\n"
@@ -1505,46 +1591,70 @@ msgstr ""
 "Po udělání pořádku budou všechny nepoužívané a tudíž nepotřebné zvukové "
 "soubory přesunuty do \"mrtvého\" umístění."
 
-#: ardour_ui.cc:3656
+#: ardour_ui.cc:3880
 msgid "CleanupDialog"
 msgstr "Dialog věnovaný dělání pořádku"
 
-#: ardour_ui.cc:3686
+#: ardour_ui.cc:3910
 msgid "Cleaned Files"
 msgstr "Uklizené soubory"
 
-#: ardour_ui.cc:3703
+#: ardour_ui.cc:3927
 msgid "deleted file"
 msgstr "smazané soubory"
 
-#: ardour_ui.cc:3896
+#: ardour_ui.cc:4133
+msgid "Cannot read session script '%1': %2"
+msgstr ""
+
+#: ardour_ui.cc:4142 luainstance.cc:1087
+msgid "Set Script Parameters"
+msgstr ""
+
+#: ardour_ui.cc:4153
+msgid "Session script '%1' instantiation failed: %2"
+msgstr ""
+
+#: ardour_ui.cc:4157
+msgid "Loading Session script '%1' failed: %2"
+msgstr ""
+
+#: ardour_ui.cc:4170
+msgid "There are no active Lua session scripts present in this session."
+msgstr ""
+
+#: ardour_ui.cc:4187
+msgid "Session script '%1' removal failed: %2"
+msgstr ""
+
+#: ardour_ui.cc:4197
 msgid "Video-Server was not launched by %1. The request to stop it is ignored."
 msgstr "Videoserver nebyl spuštěn %1. Požadavek na jeho zastavení se přehlíží."
 
-#: ardour_ui.cc:3900
+#: ardour_ui.cc:4201
 msgid "Stop Video-Server"
 msgstr "Zastavit videoserver"
 
-#: ardour_ui.cc:3901
+#: ardour_ui.cc:4202
 msgid "Do you really want to stop the Video Server?"
 msgstr "Opravdu chcete zastavit videoserver?"
 
-#: ardour_ui.cc:3904
+#: ardour_ui.cc:4205
 msgid "Yes, Stop It"
 msgstr "Ano, zastavit"
 
-#: ardour_ui.cc:3930
+#: ardour_ui.cc:4231
 msgid "The Video Server is already started."
 msgstr "Videoserver je již spuštěn."
 
-#: ardour_ui.cc:3932
+#: ardour_ui.cc:4233
 msgid ""
 "An external Video Server is configured and can be reached. Not starting a "
 "new instance."
 msgstr ""
 "Vnější videoserver je nastaven a je dosažitelný. Nespouští se nová instance."
 
-#: ardour_ui.cc:3940 ardour_ui.cc:4045
+#: ardour_ui.cc:4241 ardour_ui.cc:4346
 msgid ""
 "Could not connect to the Video Server. Start it or configure its access URL "
 "in Preferences."
@@ -1552,48 +1662,48 @@ msgstr ""
 "Nepodařilo se připojit k videoserveru. Spusťte jej nebo nastavte adresu pro "
 "přístup k němu v Nastavení."
 
-#: ardour_ui.cc:3970
+#: ardour_ui.cc:4271
 msgid "Specified docroot is not an existing directory."
 msgstr "Zadaný kořen dokumentu (docroot) není existujícím adresářem."
 
-#: ardour_ui.cc:3976 ardour_ui.cc:3982
+#: ardour_ui.cc:4277 ardour_ui.cc:4283
 msgid "Given Video Server is not an executable file."
 msgstr "Daný videoserver není spustitelným souborem."
 
-#: ardour_ui.cc:4016
+#: ardour_ui.cc:4317
 msgid "Cannot launch the video-server"
 msgstr "Nelze spustit videoserver"
 
-#: ardour_ui.cc:4026
+#: ardour_ui.cc:4327
 msgid "Video-server was started but does not respond to requests..."
 msgstr "Videoserver byl spuštěn, ale neodpovídá na požadavky..."
 
-#: ardour_ui.cc:4071 editor_audio_import.cc:644
+#: ardour_ui.cc:4372 editor_audio_import.cc:647
 msgid "could not open %1"
 msgstr "\"%\" nelze otevřít"
 
-#: ardour_ui.cc:4075
+#: ardour_ui.cc:4376
 msgid "no video-file selected"
 msgstr "Nebyl vybrán žádný videosoubor"
 
-#: ardour_ui.cc:4171
+#: ardour_ui.cc:4472
 msgid "No LTC detected, video will not be aligned."
 msgstr "Nebyl zjištěn žádný LTC. Obrazový záznam nebude zarovnán."
 
-#: ardour_ui.cc:4177
+#: ardour_ui.cc:4478
 msgid "Align video-start to %1 [samples]"
 msgstr "Zarovnat začátek obrazového záznamu na %1 [samples]"
 
-#: ardour_ui.cc:4311
+#: ardour_ui.cc:4654
 msgid "xrun"
 msgstr "xrun"
 
-#: ardour_ui.cc:4320
+#: ardour_ui.cc:4663
 msgid "Recording was stopped because your system could not keep up."
 msgstr ""
 "Nahrávání bylo zastaveno, protože tomu nedostačovala rychlost vašeho systému."
 
-#: ardour_ui.cc:4349
+#: ardour_ui.cc:4692
 msgid ""
 "The disk system on your computer\n"
 "was not able to keep up with %1.\n"
@@ -1607,23 +1717,23 @@ msgstr ""
 "Přesněji řečeno nebylo možné dostatečně rychle zapisovat data\n"
 "tak, aby se podařilo udržet krok s nahráváním.\n"
 
-#: ardour_ui.cc:4422
+#: ardour_ui.cc:4765
 msgid "Scanning for plugins"
 msgstr "Hledají se přídavné moduly"
 
-#: ardour_ui.cc:4424
+#: ardour_ui.cc:4767
 msgid "Cancel plugin scan"
 msgstr "Zrušit hledání přídavných modulů"
 
-#: ardour_ui.cc:4433
+#: ardour_ui.cc:4776
 msgid "Stop Timeout"
 msgstr "Časový limit pro zastavení"
 
-#: ardour_ui.cc:4440
+#: ardour_ui.cc:4783
 msgid "Scan Timeout"
 msgstr "Časový limit pro hledání"
 
-#: ardour_ui.cc:4484
+#: ardour_ui.cc:4827
 msgid ""
 "The disk system on your computer\n"
 "was not able to keep up with %1.\n"
@@ -1637,11 +1747,11 @@ msgstr ""
 "Přesněji řečeno nebylo možné dostatečně rychle číst data\n"
 "tak, aby se podařilo udržet krok s přehráváním.\n"
 
-#: ardour_ui.cc:4524
+#: ardour_ui.cc:4862
 msgid "Crash Recovery"
 msgstr "Obnovení po havárii"
 
-#: ardour_ui.cc:4525
+#: ardour_ui.cc:4863
 msgid ""
 "This session appears to have been in the\n"
 "middle of recording when %1 or\n"
@@ -1659,19 +1769,19 @@ msgstr ""
 "zvuková data, nebo je odmítnout.\n"
 "Rozhodněte se, prosím, jak chcete dále pokračovat.\n"
 
-#: ardour_ui.cc:4537
+#: ardour_ui.cc:4875
 msgid "Ignore crash data"
 msgstr "Odmítnout data"
 
-#: ardour_ui.cc:4538
+#: ardour_ui.cc:4876
 msgid "Recover from crash"
 msgstr "Obnovit data"
 
-#: ardour_ui.cc:4558
+#: ardour_ui.cc:4896
 msgid "Sample Rate Mismatch"
 msgstr "Vzorkovací kmitočet neodpovídá"
 
-#: ardour_ui.cc:4559
+#: ardour_ui.cc:4897
 msgid ""
 "This session was created with a sample rate of %1 Hz, but\n"
 "%2 is currently running at %3 Hz.  If you load this session,\n"
@@ -1681,15 +1791,24 @@ msgstr ""
 "%2 nyní běží na %3 Hz. Pokud toto sezení nahrajete,\n"
 "je možné, že zvuk bude přehráván při nesprávném vzorkovacím kmitočtu.\n"
 
-#: ardour_ui.cc:4568
+#: ardour_ui.cc:4906
 msgid "Do not load session"
 msgstr "Projekt nenahrávat"
 
-#: ardour_ui.cc:4569
+#: ardour_ui.cc:4907
 msgid "Load session anyway"
 msgstr "Projekt přesto nahrát"
 
-#: ardour_ui.cc:4861
+#: ardour_ui.cc:4927
+msgid ""
+"This session was created with a sample rate of %1 Hz, but\n"
+"%2 is currently running at %3 Hz.\n"
+"Audio will be recorded and played at the wrong sample rate.\n"
+"Re-Configure the Audio Engine in\n"
+"Menu > Window > Audio/Midi Setup"
+msgstr ""
+
+#: ardour_ui.cc:5209
 msgid ""
 "%4This is a session from an older version of %3%5\n"
 "\n"
@@ -1701,99 +1820,79 @@ msgid ""
 "\n"
 "%6%2%7\n"
 "\n"
-"From now on, use the -2000 version with older versions of %3"
+"From now on, use the backup copy with older versions of %3"
 msgstr ""
-"%4 Toto je sezení ze starší verze %3%5\n"
-"\n"
-"%3 zkopíroval soubor se starým sezením\n"
-"\n"
-"%6%1%7\n"
-"\n"
-"do\n"
-"\n"
-"%6%2%7\n"
-"\n"
-"Od nynějška používejte verzi -2000 staršími verzemif %3"
 
-#: ardour_ui.cc:4978
+#: ardour_ui.cc:5331
 msgid "This is a free/demo copy of %1. It has just switched to silent mode."
 msgstr "Toto je volná/ukázková verze %1. Právě se přepnula do tichého režimu."
 
-#: ardour_ui.cc:4984
+#: ardour_ui.cc:5337
 msgid "%1 is now silent"
 msgstr "%1 je nyní němá"
 
-#: ardour_ui.cc:4986
+#: ardour_ui.cc:5339
 msgid ""
 "Please consider paying for a copy of %1 - you can pay whatever you want."
 msgstr ""
 "Zvažte, prosím, že za kopii poskytnete peněžitý příspěvek %1 - v libovolné "
 "výši."
 
-#: ardour_ui.cc:4987
+#: ardour_ui.cc:5340
 msgid "Better yet become a subscriber - subscriptions start at US$1 per month."
 msgstr ""
 "Ještě lepší by bylo, kdybyste se stal pravidelným přispěvatelem - "
-"podporovatelem. "
-"Předplatné začíná na US$1 na měsíc."
+"podporovatelem. Předplatné začíná na US$1 na měsíc."
 
-#: ardour_ui.cc:4988
+#: ardour_ui.cc:5341
 msgid "Pay for a copy (via the web)"
 msgstr "Zaplatit za kopii (přes internet)"
 
-#: ardour_ui.cc:4989
+#: ardour_ui.cc:5342
 msgid "Become a subscriber (via the web)"
 msgstr "Stát se pravidelným přispěvatelem (přes internet)"
 
-#: ardour_ui.cc:5008
+#: ardour_ui.cc:5361
 msgid "Remain silent"
 msgstr "Zůstat v tichosti"
 
-#: ardour_ui.cc:5010
+#: ardour_ui.cc:5363
 msgid "Give me more time"
 msgstr "Chtěl bych mít víc času"
 
-#: ardour_ui2.cc:73
-msgid "UI: cannot setup editor"
-msgstr "Uživatelské rozhraní: Nelze nastavit editor"
-
-#: ardour_ui2.cc:78
-msgid "UI: cannot setup mixer"
-msgstr "Uživatelské rozhraní: Nelze nastavit směšovač"
-
-#: ardour_ui2.cc:83
-msgid "UI: cannot setup meterbridge"
-msgstr "Uživatelské rozhraní: Nelze nastavit měřící můstek"
+#: ardour_ui.cc:5656
+msgid "Global keybindings are missing"
+msgstr ""
 
-#: ardour_ui2.cc:128
+#: ardour_ui2.cc:79
 msgid "Play from playhead"
 msgstr "Přehrávat od ukazatele polohy přehrávání"
 
-#: ardour_ui2.cc:129
+#: ardour_ui2.cc:80
 msgid "Stop playback"
 msgstr "Zastavit přehrávání"
 
-#: ardour_ui2.cc:130
+#: ardour_ui2.cc:81
 msgid "Toggle record"
 msgstr "Spustit nahrávání"
 
-#: ardour_ui2.cc:131
+#: ardour_ui2.cc:82
 msgid "Play range/selection"
 msgstr "Přehrávat rozsah/výběr"
 
-#: ardour_ui2.cc:132
+#: ardour_ui2.cc:83
 msgid "Go to start of session"
 msgstr "Přejít na začátek sezení"
 
-#: ardour_ui2.cc:133
+#: ardour_ui2.cc:84
 msgid "Go to end of session"
 msgstr "Přejít na konec sezení"
 
-#: ardour_ui2.cc:134
+#: ardour_ui2.cc:85
 msgid "Play loop range"
 msgstr "Přehrávat rozsah smyčky"
 
-#: ardour_ui2.cc:135
+#: ardour_ui2.cc:86
 msgid ""
 "MIDI Panic\n"
 "Send note off and reset controller messages on all MIDI channels"
@@ -1801,23 +1900,23 @@ msgstr ""
 "Nouzové zastavení MIDI\n"
 "Poslat nota vypnuta a nastavit znovu zprávy ovladače na všech kanálech MIDI"
 
-#: ardour_ui2.cc:136
+#: ardour_ui2.cc:87
 msgid "Return to last playback start when stopped"
 msgstr "Při zastavení se vrátit na začátek posledního přehrávání"
 
-#: ardour_ui2.cc:137
+#: ardour_ui2.cc:88
 msgid "Playhead follows range selections and edits"
 msgstr "Ukazatel polohy následuje výběry rozsahu a úpravy"
 
-#: ardour_ui2.cc:138
+#: ardour_ui2.cc:89
 msgid "Be sensible about input monitoring"
 msgstr "Spustit automatické sledování vstupu"
 
-#: ardour_ui2.cc:139
+#: ardour_ui2.cc:90
 msgid "Enable/Disable audio click"
 msgstr "Povolit/Zakázat slyšitelné klapnutí"
 
-#: ardour_ui2.cc:140 monitor_section.cc:125
+#: ardour_ui2.cc:91 monitor_section.cc:129
 msgid ""
 "When active, something is soloed.\n"
 "Click to de-solo everything"
@@ -1825,7 +1924,7 @@ msgstr ""
 "Když je zapnuto, je některá ze stop přehrávána sólově.\n"
 "Pro vypnutí sóla klepněte."
 
-#: ardour_ui2.cc:141
+#: ardour_ui2.cc:92
 msgid ""
 "When active, auditioning is taking place.\n"
 "Click to stop the audition"
@@ -1833,11 +1932,11 @@ msgstr ""
 "Když je zapnuto, koná se zkušební výstup.\n"
 "Klepnutím se zkušební výstup zastaví."
 
-#: ardour_ui2.cc:142
+#: ardour_ui2.cc:93
 msgid "When active, there is a feedback loop."
 msgstr "Když je zapnuto, hraje se ve smyčce se zpětnou vazbou."
 
-#: ardour_ui2.cc:143
+#: ardour_ui2.cc:94
 msgid ""
 "<b>Primary Clock</b> right-click to set display mode. Click to edit, click"
 "+drag a digit or mouse-over+scroll wheel to modify.\n"
@@ -1851,7 +1950,7 @@ msgstr ""
 "potvrdit; úpravy připojit '+' nebo '-' pro zadání časů delta (nárůst "
 "proměnné).\n"
 
-#: ardour_ui2.cc:144
+#: ardour_ui2.cc:95
 msgid ""
 "<b>Secondary Clock</b> right-click to set display mode. Click to edit, click"
 "+drag a digit or mouse-over+scroll wheel to modify.\n"
@@ -1865,44 +1964,50 @@ msgstr ""
 "potvrdit; úpravy připojit '+' nebo '-' pro zadání časů delta (nárůst "
 "proměnné).\n"
 
-#: ardour_ui2.cc:145
+#: ardour_ui2.cc:96
 msgid "Reset All Peak Indicators"
 msgstr "Nastavit všechny ukazatele nejvyšších hodnot znovu"
 
-#: ardour_ui2.cc:146
+#: ardour_ui2.cc:97
 msgid "Show Error Log and acknowledge warnings"
 msgstr "Ukázat zápis chyb a potvrdit varování"
 
-#: ardour_ui2.cc:179
+#: ardour_ui2.cc:130
 msgid "[ERROR]: "
 msgstr "[CHYBA]:"
 
-#: ardour_ui2.cc:182
+#: ardour_ui2.cc:133
 msgid "[WARNING]: "
 msgstr "[VAROVÁNÍ]:"
 
-#: ardour_ui2.cc:185
+#: ardour_ui2.cc:136
 msgid "[INFO]: "
 msgstr "[INFORMACE]: "
 
-#: ardour_ui2.cc:255 ardour_ui_ed.cc:430
+#: ardour_ui2.cc:197 ardour_ui_ed.cc:509
 msgid "Auto Return"
 msgstr "Automatický návrat"
 
-#: ardour_ui2.cc:257 ardour_ui_ed.cc:433
+#: ardour_ui2.cc:199 ardour_ui_ed.cc:512
 msgid "Follow Edits"
 msgstr "Následovat úpravy"
 
-#: ardour_ui2.cc:704 rc_option_editor.cc:2895
+#: ardour_ui2.cc:422 ardour_ui2.cc:426 ardour_ui2.cc:430
+msgid ""
+"Drag this tab to the desktop to show %1 in its own window\n"
+"\n"
+"To put the window back, use the Window > %1 > Attach menu action"
+msgstr ""
+
+#: ardour_ui2.cc:638
 msgid "GUI"
 msgstr "Rozhraní"
 
-#: ardour_ui2.cc:721 rc_option_editor.cc:1734 rc_option_editor.cc:1752
-#: rc_option_editor.cc:1755 rc_option_editor.cc:1757 rc_option_editor.cc:1759
-#: rc_option_editor.cc:1767 rc_option_editor.cc:1769 rc_option_editor.cc:1777
-#: rc_option_editor.cc:1785 rc_option_editor.cc:1792 rc_option_editor.cc:1801
-#: rc_option_editor.cc:1803 rc_option_editor.cc:1805 rc_option_editor.cc:1813
-#: rc_option_editor.cc:1815 rc_option_editor.cc:1824
+#: ardour_ui2.cc:651 rc_option_editor.cc:1874 rc_option_editor.cc:1892
+#: rc_option_editor.cc:1895 rc_option_editor.cc:1897 rc_option_editor.cc:1899
+#: rc_option_editor.cc:1907 rc_option_editor.cc:1909 rc_option_editor.cc:1917
+#: rc_option_editor.cc:1925 rc_option_editor.cc:1932 rc_option_editor.cc:1953
+#: rc_option_editor.cc:1955 rc_option_editor.cc:1964
 #: session_option_editor.cc:342 session_option_editor.cc:344
 #: session_option_editor.cc:365 session_option_editor.cc:367
 #: session_option_editor.cc:369 session_option_editor.cc:376
@@ -1910,444 +2015,508 @@ msgstr "Rozhraní"
 msgid "Misc"
 msgstr "Různé"
 
-#: ardour_ui_dependents.cc:77
+#: ardour_ui_dependents.cc:118
 msgid "Setup Editor"
 msgstr "Nachystat editor"
 
-#: ardour_ui_dependents.cc:79
+#: ardour_ui_dependents.cc:120
 msgid "Setup Mixer"
 msgstr "Nachystat směšovač"
 
-#: ardour_ui_dependents.cc:85
+#: ardour_ui_dependents.cc:127
 msgid "Reload Session History"
 msgstr "Znovu nahrát průběh sezení"
 
-#: ardour_ui_dialogs.cc:251
+#: ardour_ui_dependents.cc:248
+msgid "UI: cannot setup editor"
+msgstr "Uživatelské rozhraní: Nelze nastavit editor"
+
+#: ardour_ui_dependents.cc:253
+msgid "UI: cannot setup mixer"
+msgstr "Uživatelské rozhraní: Nelze nastavit směšovač"
+
+#: ardour_ui_dependents.cc:258
+msgid "UI: cannot setup meterbridge"
+msgstr "Uživatelské rozhraní: Nelze nastavit měřící můstek"
+
+#: ardour_ui_dependents.cc:263
+msgid "UI: cannot setup luawindow"
+msgstr ""
+
+#: ardour_ui_dependents.cc:269 ardour_ui_ed.cc:136 ardour_ui_ed.cc:257
+#: rc_option_editor.cc:1853 rc_option_editor.cc:3487
+msgid "Preferences"
+msgstr "Nastavení"
+
+#: ardour_ui_dependents.cc:270 ardour_ui_ed.cc:134 mixer_ui.cc:100
+#: mixer_ui.cc:410
+msgid "Mixer"
+msgstr "Směšovač"
+
+#: ardour_ui_dependents.cc:271 ardour_ui_ed.cc:135 editor.cc:5790
+#: editor.cc:6062 public_editor.cc:34 rc_option_editor.cc:2201
+#: rc_option_editor.cc:2215 rc_option_editor.cc:2219 rc_option_editor.cc:2227
+#: rc_option_editor.cc:2236 rc_option_editor.cc:2244 rc_option_editor.cc:2253
+#: rc_option_editor.cc:2261 rc_option_editor.cc:2269 rc_option_editor.cc:2279
+#: rc_option_editor.cc:2281 rc_option_editor.cc:2305 rc_option_editor.cc:2317
+#: rc_option_editor.cc:2328 rc_option_editor.cc:2346
+msgid "Editor"
+msgstr "Editor"
+
+#: ardour_ui_dialogs.cc:263
 msgid "Don't close"
 msgstr "Nezavírat"
 
-#: ardour_ui_dialogs.cc:252
+#: ardour_ui_dialogs.cc:264
 msgid "Just close"
 msgstr "Pouze zavřít"
 
-#: ardour_ui_dialogs.cc:253
+#: ardour_ui_dialogs.cc:265
 msgid "Save and close"
 msgstr "Uložit a zavřít"
 
-#: ardour_ui_dialogs.cc:363
-msgid "This screen is not tall enough to display the mixer window"
+#: ardour_ui_ed.cc:124
+msgid "Escape"
 msgstr ""
-"Tato obrazovka není dostatečně velká na to, aby zobrazila okno směšovače"
 
-#: ardour_ui_ed.cc:103
+#: ardour_ui_ed.cc:128
 msgid "Session"
 msgstr "Projekt"
 
-#: ardour_ui_ed.cc:106 editor_actions.cc:139 editor_regions.cc:119
+#: ardour_ui_ed.cc:131 editor_actions.cc:141 editor_regions.cc:163
 #: port_group.cc:468 session_option_editor.cc:82 session_option_editor.cc:89
 msgid "Sync"
 msgstr "Seřídit"
 
-#: ardour_ui_ed.cc:107
+#: ardour_ui_ed.cc:132
 msgid "Options"
 msgstr "Volby"
 
-#: ardour_ui_ed.cc:108
+#: ardour_ui_ed.cc:133
 msgid "Window"
 msgstr "Okno"
 
-#: ardour_ui_ed.cc:109
+#: ardour_ui_ed.cc:137 ardour_ui_ed.cc:267 ardour_ui_ed.cc:268
+#: ardour_ui_ed.cc:269
+msgid "Detach"
+msgstr ""
+
+#: ardour_ui_ed.cc:138
 msgid "Help"
 msgstr "Nápověda"
 
-#: ardour_ui_ed.cc:110
+#: ardour_ui_ed.cc:139
 msgid "Misc. Shortcuts"
 msgstr "Různé klávesové zkratky"
 
-#: ardour_ui_ed.cc:111
+#: ardour_ui_ed.cc:140
 msgid "Audio File Format"
 msgstr "Formát zvukových souborů"
 
-#: ardour_ui_ed.cc:112
+#: ardour_ui_ed.cc:141
 msgid "File Type"
 msgstr "Typ souboru"
 
-#: ardour_ui_ed.cc:113 export_format_dialog.cc:67
+#: ardour_ui_ed.cc:142 export_format_dialog.cc:75
 msgid "Sample Format"
 msgstr "Vzorkovací formát"
 
-#: ardour_ui_ed.cc:114 rc_option_editor.cc:2705 rc_option_editor.cc:2717
+#: ardour_ui_ed.cc:143 rc_option_editor.cc:2841
 msgid "Control Surfaces"
 msgstr "Ovládací prvky"
 
-#: ardour_ui_ed.cc:115 rc_option_editor.cc:2375 rc_option_editor.cc:2723
-#: rc_option_editor.cc:2725 rc_option_editor.cc:2735 rc_option_editor.cc:2742
-#: rc_option_editor.cc:2750 rc_option_editor.cc:2762 rc_option_editor.cc:2767
-#: rc_option_editor.cc:2769 rc_option_editor.cc:2774 rc_option_editor.cc:2781
-#: rc_option_editor.cc:2786 rc_option_editor.cc:2795 rc_option_editor.cc:2799
-#: rc_option_editor.cc:2808 rc_option_editor.cc:2816 rc_option_editor.cc:2820
-#: rc_option_editor.cc:2825 rc_option_editor.cc:2832 rc_option_editor.cc:2833
+#: ardour_ui_ed.cc:144 rc_option_editor.cc:2847 rc_option_editor.cc:2853
+#: rc_option_editor.cc:2862 rc_option_editor.cc:2873 rc_option_editor.cc:2883
+#: rc_option_editor.cc:2945 rc_option_editor.cc:2962 rc_option_editor.cc:2978
+#: rc_option_editor.cc:2979 rc_option_editor.cc:2988 rc_option_editor.cc:3002
+#: rc_option_editor.cc:3005 rc_option_editor.cc:3013 rc_option_editor.cc:3021
 msgid "Plugins"
 msgstr "Přídavné moduly"
 
-#: ardour_ui_ed.cc:116 rc_option_editor.cc:2969
+#: ardour_ui_ed.cc:145 rc_option_editor.cc:3169
 msgid "Metering"
 msgstr "Ukazatel hladiny"
 
-#: ardour_ui_ed.cc:117
+#: ardour_ui_ed.cc:146
 msgid "Fall Off Rate"
 msgstr "Míra poklesu"
 
-#: ardour_ui_ed.cc:118
+#: ardour_ui_ed.cc:147
 msgid "Hold Time"
 msgstr "Čas udržení"
 
-#: ardour_ui_ed.cc:119
+#: ardour_ui_ed.cc:148
 msgid "Denormal Handling"
 msgstr "Zacházení s neobvyklými vzorky "
 
-#: ardour_ui_ed.cc:123 route_time_axis.cc:1694
+#: ardour_ui_ed.cc:152 route_time_axis.cc:1683
 msgid "New..."
 msgstr "Nový..."
 
-#: ardour_ui_ed.cc:125
+#: ardour_ui_ed.cc:154
 msgid "Open..."
 msgstr "Otevřít..."
 
-#: ardour_ui_ed.cc:126
+#: ardour_ui_ed.cc:155
 msgid "Recent..."
 msgstr "Naposledy použité..."
 
-#: ardour_ui_ed.cc:127 panner_editor.cc:29 playlist_selector.cc:64
+#: ardour_ui_ed.cc:156 panner_editor.cc:29 playlist_selector.cc:64
 msgid "Close"
 msgstr "Zavřít"
 
-#: ardour_ui_ed.cc:130
+#: ardour_ui_ed.cc:159
 msgid "Add Track or Bus..."
 msgstr "Přidat stopu nebo sběrnici..."
 
-#: ardour_ui_ed.cc:135
+#: ardour_ui_ed.cc:163
 msgid "Duplicate Tracks/Busses..."
 msgstr "Zdvojit stopy/sběrnice..."
 
-#: ardour_ui_ed.cc:141
+#: ardour_ui_ed.cc:169
 msgid "Cancel Solo"
 msgstr "Zrušit sólo"
 
-#: ardour_ui_ed.cc:146
-msgid "Open Video"
-msgstr "Otevřít obrazový záznam"
+#: ardour_ui_ed.cc:173
+msgid "Session|Scripting"
+msgstr ""
 
-#: ardour_ui_ed.cc:149
+#: ardour_ui_ed.cc:176
+msgid "Add Lua Script..."
+msgstr ""
+
+#: ardour_ui_ed.cc:180
+msgid "Remove Lua Script"
+msgstr ""
+
+#: ardour_ui_ed.cc:184
+msgid "Open Video..."
+msgstr ""
+
+#: ardour_ui_ed.cc:187
 msgid "Remove Video"
 msgstr "Odstranit obrazový záznam"
 
-#: ardour_ui_ed.cc:152
-msgid "Export to Video File"
-msgstr "Vyvést jako soubor s obrazovým záznamem"
+#: ardour_ui_ed.cc:190
+msgid "Export to Video File..."
+msgstr ""
 
-#: ardour_ui_ed.cc:156
+#: ardour_ui_ed.cc:194
 msgid "Snapshot (& keep working on current version) ..."
 msgstr "Snímek (&pracovat dál na nynější verzi)..."
 
-#: ardour_ui_ed.cc:160
+#: ardour_ui_ed.cc:197
 msgid "Snapshot (& switch to new version) ..."
 msgstr "Snímek (&přepnout na novou verzi)..."
 
-#: ardour_ui_ed.cc:164
+#: ardour_ui_ed.cc:200
+msgid "Quick Snapshot (& keep working on current version) ..."
+msgstr ""
+
+#: ardour_ui_ed.cc:203
+msgid "Quick Snapshot (& switch to new version) ..."
+msgstr ""
+
+#: ardour_ui_ed.cc:207
 msgid "Save As..."
 msgstr "Uložit jako..."
 
-#: ardour_ui_ed.cc:168 editor_actions.cc:1790 editor_markers.cc:903
-#: editor_snapshots.cc:136 mixer_strip.cc:1580 route_time_axis.cc:1690
+#: ardour_ui_ed.cc:210 editor_actions.cc:1788 editor_markers.cc:908
+#: editor_snapshots.cc:136 mixer_strip.cc:1653 route_time_axis.cc:1679
 msgid "Rename..."
 msgstr "Přejmenovat..."
 
-#: ardour_ui_ed.cc:172
+#: ardour_ui_ed.cc:214
 msgid "Save Template..."
 msgstr "Uložit jako předlohu..."
 
-#: ardour_ui_ed.cc:175
+#: ardour_ui_ed.cc:217
 msgid "Metadata"
 msgstr "Popisná data"
 
-#: ardour_ui_ed.cc:178
+#: ardour_ui_ed.cc:220
 msgid "Edit Metadata..."
 msgstr "Upravit popisná data..."
 
-#: ardour_ui_ed.cc:181
+#: ardour_ui_ed.cc:223
 msgid "Import Metadata..."
 msgstr "Zavést popisná data..."
 
-#: ardour_ui_ed.cc:184
+#: ardour_ui_ed.cc:226
 msgid "Export to Audio File(s)..."
 msgstr "Vyvést jako zvukový soubor(y)..."
 
-#: ardour_ui_ed.cc:187
+#: ardour_ui_ed.cc:229
 msgid "Stem export..."
 msgstr "Vyvést vybranou stopu jako jeden soubor..."
 
-#: ardour_ui_ed.cc:190 editor_export_audio.cc:66
-#: export_channel_selector.cc:190 export_channel_selector.cc:576
-#: export_dialog.cc:129 export_video_dialog.cc:80
+#: ardour_ui_ed.cc:232 editor_export_audio.cc:66
+#: export_channel_selector.cc:190 export_channel_selector.cc:578
+#: export_dialog.cc:131 export_video_dialog.cc:80
 msgid "Export"
 msgstr "Vyvést"
 
-#: ardour_ui_ed.cc:193
+#: ardour_ui_ed.cc:235
 msgid "Clean-up Unused Sources..."
 msgstr "Odstranit nepoužívané zdroje..."
 
-#: ardour_ui_ed.cc:197
+#: ardour_ui_ed.cc:239
 msgid "Reset Peak Files"
 msgstr "Vynulovat soubory s nejvyššími hodnotami"
 
-#: ardour_ui_ed.cc:201
+#: ardour_ui_ed.cc:243
 msgid "Flush Wastebasket"
 msgstr "Vyprázdnit koš"
 
-#: ardour_ui_ed.cc:208
+#: ardour_ui_ed.cc:251
 msgid "Quit"
 msgstr "Ukončit"
 
-#: ardour_ui_ed.cc:209 automation_time_axis.cc:543 editor_actions.cc:661
-#: editor_markers.cc:902 location_ui.cc:59 plugin_selector.cc:97
-#: route_time_axis.cc:866
+#: ardour_ui_ed.cc:252 ardour_ui_ed.cc:259 ardour_ui_ed.cc:260
+#: ardour_ui_ed.cc:261 automation_time_axis.cc:545 editor_actions.cc:686
+#: editor_markers.cc:907 location_ui.cc:61 plugin_selector.cc:97
+#: route_time_axis.cc:864
 msgid "Hide"
 msgstr "Skrýt"
 
-#: ardour_ui_ed.cc:213
+#: ardour_ui_ed.cc:263 ardour_ui_ed.cc:264 ardour_ui_ed.cc:265
+msgid "Attach"
+msgstr ""
+
+#: ardour_ui_ed.cc:275 ardour_ui_ed.cc:276 ardour_ui_ed.cc:277
+#: ardour_ui_ed.cc:283 ardour_ui_ed.cc:284 ardour_ui_ed.cc:285
+msgid "Change"
+msgstr ""
+
+#: ardour_ui_ed.cc:287
+msgid "Previous Tab"
+msgstr ""
+
+#: ardour_ui_ed.cc:288
+msgid "Next Tab"
+msgstr ""
+
+#: ardour_ui_ed.cc:290
+msgid "Toggle Editor & Mixer"
+msgstr ""
+
+#: ardour_ui_ed.cc:294
 msgid "Maximise Editor Space"
 msgstr "Zvětšit okno editoru"
 
-#: ardour_ui_ed.cc:214
+#: ardour_ui_ed.cc:295
 msgid "Maximise Mixer Space"
 msgstr "Zvětšit prostor směšovače"
 
-#: ardour_ui_ed.cc:215
-msgid "Show Toolbars"
-msgstr "Ukázat nástrojové panely"
-
-#: ardour_ui_ed.cc:218
+#: ardour_ui_ed.cc:298
 msgid "Toggle Mixer List"
 msgstr "Přepnout seznam směšovačů"
 
-#: ardour_ui_ed.cc:221
+#: ardour_ui_ed.cc:301
 msgid "Toggle Monitor Section Visibility"
 msgstr "Přepnout viditelnost sledovacího úseku"
 
-#: ardour_ui_ed.cc:225
+#: ardour_ui_ed.cc:305
 msgid "Show more UI preferences"
 msgstr "Ukázat více nastavení rozhraní"
 
-#: ardour_ui_ed.cc:227 mixer_ui.cc:2112 mixer_ui.cc:2118
-msgid "Window|Mixer"
-msgstr "Okno/Směšovač"
-
-#: ardour_ui_ed.cc:228
-msgid "Toggle Editor+Mixer"
-msgstr "Přepnout editor a směšovač"
+#: ardour_ui_ed.cc:308
+msgid "Window|Scripting"
+msgstr ""
 
-#: ardour_ui_ed.cc:229 meterbridge.cc:216 meterbridge.cc:222
+#: ardour_ui_ed.cc:309 meterbridge.cc:214 meterbridge.cc:220
 msgid "Window|Meterbridge"
 msgstr "Okno|Měřicí můstek"
 
-#: ardour_ui_ed.cc:231
-msgid "Reattach All Tearoffs"
-msgstr "Připojit znovu všechna odtržení"
-
-#: ardour_ui_ed.cc:233 midi_tracer.cc:45
+#: ardour_ui_ed.cc:311 midi_tracer.cc:45
 msgid "MIDI Tracer"
 msgstr "Sledovač MIDI"
 
-#: ardour_ui_ed.cc:235
+#: ardour_ui_ed.cc:314
 msgid "Chat"
 msgstr "Povídání"
 
-#: ardour_ui_ed.cc:237
+#: ardour_ui_ed.cc:316
 msgid "Help|Manual"
 msgstr "Nápověda|Příručka"
 
-#: ardour_ui_ed.cc:238
+#: ardour_ui_ed.cc:317
 msgid "Manual|Reference"
 msgstr "Příručka|Odkaz"
 
-#: ardour_ui_ed.cc:239
+#: ardour_ui_ed.cc:318
 msgid "Report a Bug"
 msgstr "Nahlásit chybu"
 
-#: ardour_ui_ed.cc:240
+#: ardour_ui_ed.cc:319
 msgid "Cheat Sheet"
 msgstr "Přehled podvodů"
 
-#: ardour_ui_ed.cc:241
+#: ardour_ui_ed.cc:320
 msgid "Ardour Website"
 msgstr "Stránky Ardouru"
 
-#: ardour_ui_ed.cc:242
+#: ardour_ui_ed.cc:321
 msgid "Ardour Development"
 msgstr "Vývoj Ardouru"
 
-#: ardour_ui_ed.cc:243
+#: ardour_ui_ed.cc:322
 msgid "User Forums"
 msgstr "Uživatelská fóra"
 
-#: ardour_ui_ed.cc:244
+#: ardour_ui_ed.cc:323
 msgid "How to Report a Bug"
 msgstr "Jak nahlásit chybu"
 
-#: ardour_ui_ed.cc:246 plugin_ui.cc:419
+#: ardour_ui_ed.cc:325 luawindow.cc:100 luawindow.cc:654 plugin_ui.cc:419
 msgid "Save"
 msgstr "Uložit"
 
-#: ardour_ui_ed.cc:254 rc_option_editor.cc:1835 rc_option_editor.cc:1846
-#: rc_option_editor.cc:1857 rc_option_editor.cc:1868 rc_option_editor.cc:1877
-#: rc_option_editor.cc:1890 rc_option_editor.cc:1903 rc_option_editor.cc:1912
-#: rc_option_editor.cc:1922 rc_option_editor.cc:1939 rc_option_editor.cc:1941
-#: rc_option_editor.cc:1950 rc_option_editor.cc:1966 rc_option_editor.cc:1987
-#: rc_option_editor.cc:2005 rc_option_editor.cc:2007 rc_option_editor.cc:2024
-#: rc_option_editor.cc:2027 rc_option_editor.cc:2029 rc_option_editor.cc:2046
-#: rc_option_editor.cc:2057
+#: ardour_ui_ed.cc:333 rc_option_editor.cc:1975 rc_option_editor.cc:1986
+#: rc_option_editor.cc:1997 rc_option_editor.cc:2008 rc_option_editor.cc:2017
+#: rc_option_editor.cc:2030 rc_option_editor.cc:2043 rc_option_editor.cc:2052
+#: rc_option_editor.cc:2062 rc_option_editor.cc:2079 rc_option_editor.cc:2186
 msgid "Transport"
 msgstr "Přehrávání"
 
-#: ardour_ui_ed.cc:260 engine_dialog.cc:88
+#: ardour_ui_ed.cc:339 engine_dialog.cc:88
 msgid "Stop"
 msgstr "Zastavit"
 
-#: ardour_ui_ed.cc:263
+#: ardour_ui_ed.cc:342
 msgid "Roll"
 msgstr "Projíždět"
 
-#: ardour_ui_ed.cc:267 ardour_ui_ed.cc:270
+#: ardour_ui_ed.cc:346 ardour_ui_ed.cc:349
 msgid "Start/Stop"
 msgstr "Spustit/Zastavit"
 
-#: ardour_ui_ed.cc:273
+#: ardour_ui_ed.cc:352
 msgid "Start/Continue/Stop"
 msgstr "Spustit/Pokračovat/Zastavit"
 
-#: ardour_ui_ed.cc:276
+#: ardour_ui_ed.cc:355
 msgid "Stop and Forget Capture"
 msgstr "Zastavit a odmítnout zvukový záznam"
 
-#: ardour_ui_ed.cc:286
+#: ardour_ui_ed.cc:365
 msgid "Transition to Roll"
 msgstr "Přechod k přehrávání dopředu"
 
-#: ardour_ui_ed.cc:290
+#: ardour_ui_ed.cc:369
 msgid "Transition to Reverse"
 msgstr "Přechod k přehrávání dozadu"
 
-#: ardour_ui_ed.cc:294
+#: ardour_ui_ed.cc:373
 msgid "Play Loop Range"
 msgstr "Přehrávat rozsah smyčky"
 
-#: ardour_ui_ed.cc:297
+#: ardour_ui_ed.cc:376
 msgid "Play Selection"
 msgstr "Přehrát výběr"
 
-#: ardour_ui_ed.cc:300
+#: ardour_ui_ed.cc:379
 msgid "Play Selection w/Preroll"
 msgstr "Přehrávat vybranou oblast s přetáčením vpřed"
 
-#: ardour_ui_ed.cc:304
+#: ardour_ui_ed.cc:383
 msgid "Enable Record"
 msgstr "Povolit nahrávání"
 
-#: ardour_ui_ed.cc:307 ardour_ui_ed.cc:311
+#: ardour_ui_ed.cc:386 ardour_ui_ed.cc:390
 msgid "Start Recording"
 msgstr "Začít s nahráváním"
 
-#: ardour_ui_ed.cc:315
+#: ardour_ui_ed.cc:394
 msgid "Rewind"
 msgstr "Přetočit zpět"
 
-#: ardour_ui_ed.cc:318
+#: ardour_ui_ed.cc:397
 msgid "Rewind (Slow)"
 msgstr "Přetočit zpět (pomalu)"
 
-#: ardour_ui_ed.cc:321
+#: ardour_ui_ed.cc:400
 msgid "Rewind (Fast)"
 msgstr "Přetočit zpět (rychle)"
 
-#: ardour_ui_ed.cc:324
+#: ardour_ui_ed.cc:403
 msgid "Forward"
 msgstr "Přetočit vpřed"
 
-#: ardour_ui_ed.cc:327
+#: ardour_ui_ed.cc:406
 msgid "Forward (Slow)"
 msgstr "Přetočit vpřed (pomalu)"
 
-#: ardour_ui_ed.cc:330
+#: ardour_ui_ed.cc:409
 msgid "Forward (Fast)"
 msgstr "Přetočit vpřed (rychle)"
 
-#: ardour_ui_ed.cc:333
+#: ardour_ui_ed.cc:412
 msgid "Go to Zero"
 msgstr "Skočit na bod nula"
 
-#: ardour_ui_ed.cc:336 ardour_ui_ed.cc:339
+#: ardour_ui_ed.cc:415 ardour_ui_ed.cc:418
 msgid "Go to Start"
 msgstr "Skočit na začátek"
 
-#: ardour_ui_ed.cc:342
+#: ardour_ui_ed.cc:421
 msgid "Go to End"
 msgstr "Skočit na konec"
 
-#: ardour_ui_ed.cc:345
+#: ardour_ui_ed.cc:424
 msgid "Go to Wall Clock"
 msgstr "Skočit na přesný místní čas"
 
-#: ardour_ui_ed.cc:350 ardour_ui_ed.cc:353
+#: ardour_ui_ed.cc:429 ardour_ui_ed.cc:432
 msgid "Numpad Decimal"
 msgstr "Číselná klávesnice Desetinná tečka"
 
-#: ardour_ui_ed.cc:356
+#: ardour_ui_ed.cc:435
 msgid "Numpad 0"
 msgstr "Číselná klávesnice 0"
 
-#: ardour_ui_ed.cc:359
+#: ardour_ui_ed.cc:438
 msgid "Numpad 1"
 msgstr "Číselná klávesnice 1"
 
-#: ardour_ui_ed.cc:362
+#: ardour_ui_ed.cc:441
 msgid "Numpad 2"
 msgstr "Číselná klávesnice 2"
 
-#: ardour_ui_ed.cc:365
+#: ardour_ui_ed.cc:444
 msgid "Numpad 3"
 msgstr "Číselná klávesnice 3"
 
-#: ardour_ui_ed.cc:368
+#: ardour_ui_ed.cc:447
 msgid "Numpad 4"
 msgstr "Číselná klávesnice 4"
 
-#: ardour_ui_ed.cc:371
+#: ardour_ui_ed.cc:450
 msgid "Numpad 5"
 msgstr "Číselná klávesnice 5"
 
-#: ardour_ui_ed.cc:374
+#: ardour_ui_ed.cc:453
 msgid "Numpad 6"
 msgstr "Číselná klávesnice 6"
 
-#: ardour_ui_ed.cc:377
+#: ardour_ui_ed.cc:456
 msgid "Numpad 7"
 msgstr "Číselná klávesnice 7"
 
-#: ardour_ui_ed.cc:380
+#: ardour_ui_ed.cc:459
 msgid "Numpad 8"
 msgstr "Číselná klávesnice 8"
 
-#: ardour_ui_ed.cc:383
+#: ardour_ui_ed.cc:462
 msgid "Numpad 9"
 msgstr "Číselná klávesnice 9"
 
-#: ardour_ui_ed.cc:387
+#: ardour_ui_ed.cc:466
 msgid "Focus On Clock"
 msgstr "Zaostřit na ukazatel času"
 
-#: ardour_ui_ed.cc:391 ardour_ui_ed.cc:400 audio_clock.cc:2116 editor.cc:261
-#: editor_actions.cc:585 editor_actions.cc:594 export_timespan_selector.cc:85
+#: ardour_ui_ed.cc:470 ardour_ui_ed.cc:479 audio_clock.cc:2122 editor.cc:321
+#: editor_actions.cc:610 editor_actions.cc:619 export_timespan_selector.cc:85
 #: session_option_editor.cc:41 session_option_editor.cc:61
 #: session_option_editor.cc:80 session_option_editor.cc:96
 #: session_option_editor.cc:109 session_option_editor.cc:122
@@ -2355,137 +2524,137 @@ msgstr "Zaostřit na ukazatel času"
 msgid "Timecode"
 msgstr "Časový kód"
 
-#: ardour_ui_ed.cc:393 ardour_ui_ed.cc:402 editor_actions.cc:583
+#: ardour_ui_ed.cc:472 ardour_ui_ed.cc:481 editor_actions.cc:608
 msgid "Bars & Beats"
 msgstr "Takty a doby"
 
-#: ardour_ui_ed.cc:395 ardour_ui_ed.cc:404
+#: ardour_ui_ed.cc:474 ardour_ui_ed.cc:483
 msgid "Minutes & Seconds"
 msgstr "Minuty a sekundy"
 
-#: ardour_ui_ed.cc:397 ardour_ui_ed.cc:406 audio_clock.cc:2120 editor.cc:262
-#: editor_actions.cc:584
+#: ardour_ui_ed.cc:476 ardour_ui_ed.cc:485 audio_clock.cc:2125 editor.cc:322
+#: editor_actions.cc:609
 msgid "Samples"
 msgstr "Vzorky"
 
-#: ardour_ui_ed.cc:409
+#: ardour_ui_ed.cc:488
 msgid "Punch In"
 msgstr "Začít přepis oblasti"
 
-#: ardour_ui_ed.cc:410 mixer_strip.cc:1903 mixer_strip.cc:2103 route_ui.cc:175
-#: time_info_box.cc:116
+#: ardour_ui_ed.cc:489 mixer_strip.cc:1992 mixer_strip.cc:2193 route_ui.cc:187
+#: time_info_box.cc:110
 msgid "In"
 msgstr "Vstup"
 
-#: ardour_ui_ed.cc:413
+#: ardour_ui_ed.cc:492
 msgid "Punch Out"
 msgstr "Ukončit přepis oblasti"
 
-#: ardour_ui_ed.cc:414 mixer_strip.cc:1915 time_info_box.cc:117
+#: ardour_ui_ed.cc:493 mixer_strip.cc:2004 time_info_box.cc:111
 msgid "Out"
 msgstr "Výstup"
 
-#: ardour_ui_ed.cc:417
+#: ardour_ui_ed.cc:496
 msgid "Punch In/Out"
 msgstr "Přepsat oblast"
 
-#: ardour_ui_ed.cc:418
+#: ardour_ui_ed.cc:497
 msgid "In/Out"
 msgstr "Vstup/Výstup"
 
-#: ardour_ui_ed.cc:421 rc_option_editor.cc:1801
+#: ardour_ui_ed.cc:500 rc_option_editor.cc:1941
 msgid "Click"
 msgstr "Klepnout"
 
-#: ardour_ui_ed.cc:424
+#: ardour_ui_ed.cc:503
 msgid "Auto Input"
 msgstr "Automatický vstup"
 
-#: ardour_ui_ed.cc:427
+#: ardour_ui_ed.cc:506
 msgid "Auto Play"
 msgstr "Automatické přehrávání"
 
-#: ardour_ui_ed.cc:438
+#: ardour_ui_ed.cc:517
 msgid "Sync Startup to Video"
 msgstr "Seřídit spuštění s obrazovým záznamem"
 
-#: ardour_ui_ed.cc:440
+#: ardour_ui_ed.cc:519
 msgid "Time Master"
 msgstr "Řízení času"
 
-#: ardour_ui_ed.cc:442
+#: ardour_ui_ed.cc:521
 msgid "Use External Positional Sync Source"
 msgstr "Použít vnější zdroj seřízení podle polohy"
 
-#: ardour_ui_ed.cc:447
+#: ardour_ui_ed.cc:526
 msgid "Toggle Record Enable Track %1"
 msgstr "Spustit nahrávání stopy %1"
 
-#: ardour_ui_ed.cc:454
+#: ardour_ui_ed.cc:533
 msgid "Percentage"
 msgstr "Procentní podíl"
 
-#: ardour_ui_ed.cc:455 shuttle_control.cc:188
+#: ardour_ui_ed.cc:534 shuttle_control.cc:205
 msgid "Semitones"
 msgstr "Polotóny"
 
-#: ardour_ui_ed.cc:459
+#: ardour_ui_ed.cc:538
 msgid "Send MTC"
 msgstr "Poslat MTC"
 
-#: ardour_ui_ed.cc:461
+#: ardour_ui_ed.cc:540
 msgid "Send MMC"
 msgstr "Poslat MMC"
 
-#: ardour_ui_ed.cc:463
+#: ardour_ui_ed.cc:542
 msgid "Use MMC"
 msgstr "Použít MMC"
 
-#: ardour_ui_ed.cc:465 rc_option_editor.cc:2594
+#: ardour_ui_ed.cc:544 rc_option_editor.cc:2730
 msgid "Send MIDI Clock"
 msgstr "Poslat čas MIDI"
 
-#: ardour_ui_ed.cc:467
+#: ardour_ui_ed.cc:546
 msgid "Send MIDI Feedback"
 msgstr "Poslat zpětnou vazbu MIDI"
 
-#: ardour_ui_ed.cc:473
+#: ardour_ui_ed.cc:552
 msgid "Panic"
 msgstr "Nouzové zastavení"
 
-#: ardour_ui_ed.cc:567
+#: ardour_ui_ed.cc:629
 msgid "Wall Clock"
 msgstr "Nástěnné hodiny"
 
-#: ardour_ui_ed.cc:569
+#: ardour_ui_ed.cc:631
 msgid "Disk Space"
 msgstr "Místo na disku"
 
-#: ardour_ui_ed.cc:570
+#: ardour_ui_ed.cc:632
 msgid "DSP"
 msgstr "Digitální zpracování signálu (DSP)"
 
-#: ardour_ui_ed.cc:571
+#: ardour_ui_ed.cc:633
 msgid "X-run"
 msgstr "X-run"
 
-#: ardour_ui_ed.cc:572
+#: ardour_ui_ed.cc:634
 msgid "Active Peak-file Work"
 msgstr "Vytvoření souboru s nejvyššími hodnotami v činnosti"
 
-#: ardour_ui_ed.cc:573
+#: ardour_ui_ed.cc:635
 msgid "Buffers"
 msgstr "Vyrovnávací paměti"
 
-#: ardour_ui_ed.cc:575
+#: ardour_ui_ed.cc:637
 msgid "Timecode Format"
 msgstr "Formát časového kódu"
 
-#: ardour_ui_ed.cc:576
+#: ardour_ui_ed.cc:638
 msgid "File Format"
 msgstr "Souborový formát"
 
-#: ardour_ui_options.cc:63
+#: ardour_ui_options.cc:55
 msgid ""
 "It is not possible to use JACK as the the sync source\n"
 "when the pull up/down setting is non-zero."
@@ -2493,133 +2662,136 @@ msgstr ""
 "Není možné, aby byl JACK používán jako zdroj pro seřízení\n"
 "když nastavení vytáhnutí/stáhnutí není nula."
 
-#: ardour_ui_options.cc:317
+#: ardour_ui_options.cc:309
 msgid "Internal"
 msgstr "Vnitřní"
 
-#: ardour_ui_options.cc:509
+#: ardour_ui_options.cc:518
 msgid "Enable/Disable external positional sync"
 msgstr "Povolit/Zakázat vnější seřízení podle polohy"
 
-#: ardour_ui_options.cc:511
+#: ardour_ui_options.cc:520
 msgid "Sync to JACK is not possible: video pull up/down is set"
 msgstr ""
 "Seřízení k JACKovi není možné: Je nastaveno vytáhnutí/stáhnutí obrazového "
 "záznamu"
 
-#: audio_clock.cc:1051 audio_clock.cc:1070
+#: audio_clock.cc:1057 audio_clock.cc:1076
 msgid "--pending--"
 msgstr "--čekající na vyřízení--"
 
-#: audio_clock.cc:1122
+#: audio_clock.cc:1128
 msgid "SR"
 msgstr "SR"
 
-#: audio_clock.cc:1128 audio_clock.cc:1132
+#: audio_clock.cc:1134 audio_clock.cc:1138
 msgid "Pull"
 msgstr "Táhnout"
 
-#: audio_clock.cc:1130
+#: audio_clock.cc:1136
 #, c-format
 msgid "%+.4f%%"
 msgstr "%+.4f%%"
 
-#: audio_clock.cc:1286 editor.cc:263 editor_actions.cc:140
-#: editor_actions.cc:577
+#: audio_clock.cc:1292 editor.cc:323 editor_actions.cc:142
+#: editor_actions.cc:602
 msgid "Tempo"
 msgstr "Tempo"
 
-#: audio_clock.cc:1290 editor.cc:264 editor_actions.cc:578
+#: audio_clock.cc:1296 editor.cc:324 editor_actions.cc:603
 msgid "Meter"
 msgstr "Druh taktu"
 
-#: audio_clock.cc:1871 audio_streamview.cc:116 editor_actions.cc:1108
-#: session_metadata_dialog.cc:452 session_metadata_dialog.cc:500
-#: session_metadata_dialog.cc:556 session_metadata_dialog.cc:845
-#: streamview.cc:469
+#: audio_clock.cc:1878 audio_streamview.cc:117 editor_actions.cc:1092
+#: luainstance.cc:959 luainstance.cc:1575 plugin_pin_dialog.cc:859
+#: plugin_selector.cc:995 plugin_selector.cc:1016
+#: session_metadata_dialog.cc:455 session_metadata_dialog.cc:503
+#: session_metadata_dialog.cc:559 session_metadata_dialog.cc:848
+#: streamview.cc:474
 msgid "programming error: %1"
 msgstr "Chyba v programování: %1"
 
-#: audio_clock.cc:2004 audio_clock.cc:2032
+#: audio_clock.cc:2011 audio_clock.cc:2039
 msgid "programming error: %1 %2"
 msgstr "Chyba v programování: %1 %2"
 
-#: audio_clock.cc:2118 editor.cc:260 export_timespan_selector.cc:95
+#: audio_clock.cc:2123 editor.cc:320 export_timespan_selector.cc:95
 msgid "Bars:Beats"
 msgstr "Takty:Doby"
 
-#: audio_clock.cc:2119 export_timespan_selector.cc:90
+#: audio_clock.cc:2124 export_timespan_selector.cc:90
 msgid "Minutes:Seconds"
 msgstr "Minuty:Sekundy"
 
-#: audio_clock.cc:2124
+#: audio_clock.cc:2129
 msgid "Set from Playhead"
 msgstr "Převzít z ukazatele polohy přehrávání"
 
-#: audio_clock.cc:2125
+#: audio_clock.cc:2130
 msgid "Locate to This Time"
 msgstr "Ukazatele polohy postavit na tento čas"
 
-#: audio_clock.cc:2128
+#: audio_clock.cc:2133
 msgid "Copy to clipboard"
 msgstr "Kopírovat do schránky"
 
-#: audio_region_editor.cc:65 control_point_dialog.cc:49 rhythm_ferret.cc:124
-#: rhythm_ferret.cc:129 rhythm_ferret.cc:134
+#: audio_region_editor.cc:60 control_point_dialog.cc:49 rhythm_ferret.cc:137
+#: rhythm_ferret.cc:154
 msgid "dB"
 msgstr "dB"
 
-#: audio_region_editor.cc:68
+#: audio_region_editor.cc:63
 msgid "Region gain:"
 msgstr "Síla hlasitosti v oblasti:"
 
-#: audio_region_editor.cc:78 export_format_dialog.cc:43
+#: audio_region_editor.cc:73 export_format_dialog.cc:49 export_report.cc:772
+#: export_report.cc:1185 fft_graph.cc:370
 msgid "dBFS"
 msgstr "dBFS"
 
-#: audio_region_editor.cc:81
+#: audio_region_editor.cc:76
 msgid "Peak amplitude:"
 msgstr "Nejvyšší hodnota rozkmitu:"
 
-#: audio_region_editor.cc:92
+#: audio_region_editor.cc:87
 msgid "Calculating..."
 msgstr "Počítá se..."
 
-#: audio_region_view.cc:1371
+#: audio_region_view.cc:1385
 msgid "add gain control point"
 msgstr "Upravit křivku hlasitosti (přidat bod ovládání zesílení)"
 
-#: automation_controller.cc:292 automation_controller.cc:308
+#: automation_controller.cc:304 automation_controller.cc:320
 msgid "Select Note..."
 msgstr "Vybrat notu..."
 
-#: automation_controller.cc:299
+#: automation_controller.cc:311
 msgid "Halve"
 msgstr "Zmenšit na polovinu"
 
-#: automation_controller.cc:302
+#: automation_controller.cc:314
 msgid "Double"
 msgstr "Zdvojnásobit"
 
-#: automation_controller.cc:313
+#: automation_controller.cc:325
 msgid "Set to %1 beat"
 msgid_plural "Set to %1 beats"
 msgstr[0] "Nastavit na %1 dobu"
 msgstr[1] "Nastavit na %1 doby"
 
-#: automation_line.cc:285 editor_drag.cc:4255
+#: automation_line.cc:292 editor_drag.cc:4388
 msgid "automation event move"
 msgstr "Pohybovat bodem automatizace"
 
-#: automation_line.cc:881 region_gain_line.cc:75
+#: automation_line.cc:888 region_gain_line.cc:75
 msgid "remove control point"
 msgstr "Odstranit bod automatizace"
 
-#: automation_line.cc:1006
+#: automation_line.cc:1013
 msgid "Ignoring illegal points on AutomationLine \"%1\""
 msgstr "Nepřípustné automatizační body budou ponechány stranou: \"%1\""
 
-#: automation_region_view.cc:193 automation_time_axis.cc:647
+#: automation_region_view.cc:193 automation_time_axis.cc:649
 msgid "add automation event"
 msgstr "Vložit bod automatizace"
 
@@ -2635,59 +2807,59 @@ msgstr "Režim automatizace"
 msgid "hide track"
 msgstr "Skrýt tuto stopu"
 
-#: automation_time_axis.cc:308 automation_time_axis.cc:360
-#: automation_time_axis.cc:554 gain_meter.cc:222 generic_pluginui.cc:526
-#: generic_pluginui.cc:820 panner_ui.cc:151
+#: automation_time_axis.cc:310 automation_time_axis.cc:362
+#: automation_time_axis.cc:556 gain_meter.cc:230 generic_pluginui.cc:590
+#: generic_pluginui.cc:934 panner_ui.cc:151
 msgid "Automation|Manual"
 msgstr "Automatizace|Příručka"
 
-#: automation_time_axis.cc:310 automation_time_axis.cc:371
-#: automation_time_axis.cc:559 editor.cc:1928 editor.cc:2006
-#: editor_actions.cc:123 editor_actions.cc:1939 gain_meter.cc:225
-#: generic_pluginui.cc:102 generic_pluginui.cc:529 generic_pluginui.cc:822
-#: midi_time_axis.cc:1614 midi_time_axis.cc:1617 midi_time_axis.cc:1620
+#: automation_time_axis.cc:312 automation_time_axis.cc:373
+#: automation_time_axis.cc:561 editor.cc:2033 editor.cc:2111
+#: editor_actions.cc:125 editor_actions.cc:1937 gain_meter.cc:232
+#: generic_pluginui.cc:100 generic_pluginui.cc:593 generic_pluginui.cc:936
+#: midi_time_axis.cc:1610 midi_time_axis.cc:1613 midi_time_axis.cc:1616
 #: panner_ui.cc:154
 msgid "Play"
 msgstr "Přehrát"
 
-#: automation_time_axis.cc:312 automation_time_axis.cc:382
-#: automation_time_axis.cc:564 gain_meter.cc:228 generic_pluginui.cc:104
-#: generic_pluginui.cc:532 generic_pluginui.cc:824 panner_ui.cc:157
+#: automation_time_axis.cc:314 automation_time_axis.cc:384
+#: automation_time_axis.cc:566 gain_meter.cc:234 generic_pluginui.cc:102
+#: generic_pluginui.cc:596 generic_pluginui.cc:938 panner_ui.cc:157
 msgid "Write"
 msgstr "Zapsat"
 
-#: automation_time_axis.cc:314 automation_time_axis.cc:393
-#: automation_time_axis.cc:569 gain_meter.cc:231 generic_pluginui.cc:106
-#: generic_pluginui.cc:535 generic_pluginui.cc:826 panner_ui.cc:160
+#: automation_time_axis.cc:316 automation_time_axis.cc:395
+#: automation_time_axis.cc:571 gain_meter.cc:236 generic_pluginui.cc:104
+#: generic_pluginui.cc:599 generic_pluginui.cc:940 panner_ui.cc:160
 msgid "Touch"
 msgstr "Dotknout se"
 
-#: automation_time_axis.cc:404 generic_pluginui.cc:538 meter_patterns.cc:118
+#: automation_time_axis.cc:406 generic_pluginui.cc:602 meter_patterns.cc:118
 msgid "???"
 msgstr "???"
 
-#: automation_time_axis.cc:445
+#: automation_time_axis.cc:447
 msgid "clear automation"
 msgstr "Vyprázdnit automatizaci"
 
-#: automation_time_axis.cc:545 rc_option_editor.cc:2770
-#: rc_option_editor.cc:2775 rc_option_editor.cc:2821 rc_option_editor.cc:2826
+#: automation_time_axis.cc:547 rc_option_editor.cc:2916
+#: rc_option_editor.cc:2921 rc_option_editor.cc:2967 rc_option_editor.cc:2972
 msgid "Clear"
 msgstr "Vyprázdnit"
 
-#: automation_time_axis.cc:576
+#: automation_time_axis.cc:578
 msgid "State"
 msgstr "Stav"
 
-#: automation_time_axis.cc:592
+#: automation_time_axis.cc:594
 msgid "Discrete"
 msgstr "Samostatný"
 
-#: automation_time_axis.cc:598 export_format_dialog.cc:489
+#: automation_time_axis.cc:600 export_format_dialog.cc:552
 msgid "Linear"
 msgstr "Čárový"
 
-#: automation_time_axis.cc:604 rhythm_ferret.cc:109 shuttle_control.cc:207
+#: automation_time_axis.cc:606 rhythm_ferret.cc:118 shuttle_control.cc:224
 msgid "Mode"
 msgstr "Režim"
 
@@ -2703,35 +2875,38 @@ msgstr "Upravit balík"
 msgid "Direction:"
 msgstr "Směr:"
 
-#: bundle_manager.cc:206 bundle_manager.cc:210 engine_dialog.cc:949
-#: mixer_strip.cc:168 mixer_strip.cc:382 mixer_strip.cc:2361
-#: rc_option_editor.cc:2944
+#: bundle_manager.cc:206 bundle_manager.cc:210 engine_dialog.cc:976
+#: mixer_strip.cc:175 mixer_strip.cc:392 mixer_strip.cc:2451
+#: rc_option_editor.cc:3135
 msgid "Input"
 msgstr "Vstup"
 
 #: bundle_manager.cc:207 bundle_manager.cc:212 bundle_manager.cc:246
-#: engine_dialog.cc:951 mixer_strip.cc:172 mixer_strip.cc:386
-#: mixer_strip.cc:2364 monitor_section.cc:293 monitor_section.cc:297
-#: rc_option_editor.cc:2948
+#: engine_dialog.cc:978 mixer_strip.cc:179 mixer_strip.cc:396
+#: mixer_strip.cc:2454 monitor_section.cc:296 monitor_section.cc:300
+#: rc_option_editor.cc:3139
 msgid "Output"
 msgstr "Výstup"
 
-#: bundle_manager.cc:265 editor.cc:1970 editor_actions.cc:95
-#: editor_actions.cc:105 rc_option_editor.cc:2782 rc_option_editor.cc:2796
+#: bundle_manager.cc:265 editor.cc:2075 editor_actions.cc:97
+#: editor_actions.cc:107 lua_script_manager.cc:33 rc_option_editor.cc:2928
+#: rc_option_editor.cc:2942
 msgid "Edit"
 msgstr "Úpravy"
 
-#: bundle_manager.cc:266 editor.cc:5951 editor.cc:5981 editor_actions.cc:346
-#: editor_actions.cc:347 plugin_ui.cc:420 processor_box.cc:2832
+#: bundle_manager.cc:266 editor.cc:5962 editor.cc:5992 editor_actions.cc:360
+#: editor_actions.cc:361 luawindow.cc:101 plugin_ui.cc:420
+#: processor_box.cc:3669 processor_box.cc:3671
 msgid "Delete"
 msgstr "Smazat"
 
 #: bundle_manager.cc:272 bundle_manager.cc:439 editor_route_groups.cc:98
-#: editor_routes.cc:208 midi_list_editor.cc:107 session_metadata_dialog.cc:646
+#: editor_routes.cc:233 lua_script_manager.cc:42 lua_script_manager.cc:76
+#: midi_list_editor.cc:107 session_metadata_dialog.cc:649
 msgid "Name"
 msgstr "Název"
 
-#: bundle_manager.cc:283
+#: bundle_manager.cc:283 luawindow.cc:566
 msgid "New"
 msgstr "Nový"
 
@@ -2747,6 +2922,39 @@ msgstr "Přidat kanál"
 msgid "Rename Channel"
 msgstr "Přejmenovat kanál"
 
+#: color_theme_manager.cc:58
+msgid "Restore Defaults"
+msgstr "Obnovit výchozí"
+
+#: color_theme_manager.cc:62
+msgid "Color Theme"
+msgstr ""
+
+#: color_theme_manager.cc:126
+msgid "Object"
+msgstr "Předmět"
+
+#: color_theme_manager.cc:129 route_group_dialog.cc:53
+#: route_group_dialog.cc:81
+msgid "Color"
+msgstr "Barva"
+
+#: color_theme_manager.cc:151
+msgid "Items"
+msgstr "Předměty"
+
+#: color_theme_manager.cc:152
+msgid "Palette"
+msgstr "Paleta"
+
+#: color_theme_manager.cc:153
+msgid "Transparency"
+msgstr "Průhlednost"
+
+#: color_theme_manager.cc:475
+msgid "Color Palette"
+msgstr "Paleta barev"
+
 #: configinfo.cc:28
 msgid "Build Configuration"
 msgstr "Vytvořit nastavení"
@@ -2759,6 +2967,18 @@ msgstr "Ovládací bod"
 msgid "Value"
 msgstr "Hodnota"
 
+#: control_slave_ui.cc:50 mixer_ui.cc:254
+msgid "Control Masters"
+msgstr ""
+
+#: control_slave_ui.cc:54
+msgid "-vca-"
+msgstr ""
+
+#: control_slave_ui.cc:211
+msgid "Unassign All"
+msgstr ""
+
 #: duplicate_routes_dialog.cc:35
 msgid "Duplicate Tracks & Busses"
 msgstr "Zdvojit stopy a sběrnice"
@@ -2820,595 +3040,601 @@ msgstr "Výška tónu"
 msgid "Velocity"
 msgstr "Síla tónu"
 
-#: edit_note_dialog.cc:88 patch_change_dialog.cc:66
+#: edit_note_dialog.cc:88 export_report.cc:246 export_report.cc:688
+#: patch_change_dialog.cc:66
 msgid "Time"
 msgstr "ÄŒas"
 
-#: edit_note_dialog.cc:98 editor_regions.cc:118
+#: edit_note_dialog.cc:99 editor_regions.cc:162
 #: export_timespan_selector.cc:375 export_timespan_selector.cc:437
-#: location_ui.cc:322 midi_list_editor.cc:115 time_info_box.cc:108
+#: location_ui.cc:322 midi_list_editor.cc:115 time_info_box.cc:102
 msgid "Length"
 msgstr "Délka"
 
-#: edit_note_dialog.cc:165
+#: edit_note_dialog.cc:166
 msgid "edit note"
 msgstr "Upravit notu"
 
-#: editor.cc:150
+#: editor.cc:160
 msgid "CD Frames"
 msgstr "Snímky CD"
 
-#: editor.cc:151
+#: editor.cc:161
 msgid "TC Frames"
 msgstr "Snímky TC"
 
-#: editor.cc:152
+#: editor.cc:162
 msgid "TC Seconds"
 msgstr "Sekundy TC"
 
-#: editor.cc:153
+#: editor.cc:163
 msgid "TC Minutes"
 msgstr "Minuty TC"
 
-#: editor.cc:154
+#: editor.cc:164
 msgid "Seconds"
 msgstr "Sekundy"
 
-#: editor.cc:155
+#: editor.cc:165
 msgid "Minutes"
 msgstr "Minuty"
 
-#: editor.cc:156 quantize_dialog.cc:37 quantize_dialog.cc:141
+#: editor.cc:166 quantize_dialog.cc:37
 msgid "Beats/128"
 msgstr "Doby/128"
 
-#: editor.cc:157 quantize_dialog.cc:38 quantize_dialog.cc:143
+#: editor.cc:167 quantize_dialog.cc:38
 msgid "Beats/64"
 msgstr "Doby/64"
 
-#: editor.cc:158 quantize_dialog.cc:39 quantize_dialog.cc:145
+#: editor.cc:168 quantize_dialog.cc:39
 msgid "Beats/32"
 msgstr "Doby/32"
 
-#: editor.cc:159
+#: editor.cc:169 quantize_dialog.cc:40
 msgid "Beats/28"
 msgstr "Doby/28"
 
-#: editor.cc:160
+#: editor.cc:170 quantize_dialog.cc:41
 msgid "Beats/24"
 msgstr "Doby/24"
 
-#: editor.cc:161
+#: editor.cc:171 quantize_dialog.cc:42
 msgid "Beats/20"
 msgstr "Doby/20"
 
-#: editor.cc:162 quantize_dialog.cc:40 quantize_dialog.cc:147
+#: editor.cc:172 quantize_dialog.cc:43
 msgid "Beats/16"
 msgstr "Doby/16"
 
-#: editor.cc:163
+#: editor.cc:173 quantize_dialog.cc:44
 msgid "Beats/14"
 msgstr "Doby/14"
 
-#: editor.cc:164
+#: editor.cc:174 quantize_dialog.cc:45
 msgid "Beats/12"
 msgstr "Doby/12"
 
-#: editor.cc:165
+#: editor.cc:175 quantize_dialog.cc:46
 msgid "Beats/10"
 msgstr "Doby/10"
 
-#: editor.cc:166 quantize_dialog.cc:41 quantize_dialog.cc:149
+#: editor.cc:176 quantize_dialog.cc:47
 msgid "Beats/8"
 msgstr "Doby/8"
 
-#: editor.cc:167
+#: editor.cc:177 quantize_dialog.cc:48
 msgid "Beats/7"
 msgstr "Doby/7"
 
-#: editor.cc:168
+#: editor.cc:178 quantize_dialog.cc:49
 msgid "Beats/6"
 msgstr "Doby/6"
 
-#: editor.cc:169
+#: editor.cc:179 quantize_dialog.cc:50
 msgid "Beats/5"
 msgstr "Doby/5"
 
-#: editor.cc:170 quantize_dialog.cc:42 quantize_dialog.cc:151
+#: editor.cc:180 quantize_dialog.cc:51
 msgid "Beats/4"
 msgstr "Doby/4"
 
-#: editor.cc:171 quantize_dialog.cc:43 quantize_dialog.cc:153
+#: editor.cc:181 quantize_dialog.cc:52
 msgid "Beats/3"
 msgstr "Doby/3"
 
-#: editor.cc:172 quantize_dialog.cc:44 quantize_dialog.cc:155
+#: editor.cc:182 quantize_dialog.cc:53
 msgid "Beats/2"
 msgstr "Doby/2"
 
-#: editor.cc:173 quantize_dialog.cc:45 quantize_dialog.cc:157
+#: editor.cc:183 quantize_dialog.cc:54
 msgid "Beats"
 msgstr "Doby"
 
-#: editor.cc:174
+#: editor.cc:184
 msgid "Bars"
 msgstr "Takty"
 
-#: editor.cc:175
+#: editor.cc:185
 msgid "Marks"
 msgstr "Značky"
 
-#: editor.cc:176
+#: editor.cc:186
 msgid "Region starts"
 msgstr "Začátek oblasti"
 
-#: editor.cc:177
+#: editor.cc:187
 msgid "Region ends"
 msgstr "Konec oblasti"
 
-#: editor.cc:178
+#: editor.cc:188
 msgid "Region syncs"
 msgstr "Seřízení oblasti"
 
-#: editor.cc:179
+#: editor.cc:189
 msgid "Region bounds"
 msgstr "Hranice oblasti"
 
-#: editor.cc:184 editor_actions.cc:526
+#: editor.cc:194 editor_actions.cc:551
 msgid "No Grid"
 msgstr "Mřížka vypnuta"
 
-#: editor.cc:185 editor_actions.cc:527
+#: editor.cc:195 editor_actions.cc:552
 msgid "Grid"
 msgstr "Mřížka zapnuta"
 
-#: editor.cc:186 editor_actions.cc:528
+#: editor.cc:196 editor_actions.cc:553
 msgid "Magnetic"
 msgstr "Magnetická"
 
-#: editor.cc:191 editor.cc:209 editor_actions.cc:122 editor_actions.cc:509
+#: editor.cc:201 editor.cc:219 editor_actions.cc:124 editor_actions.cc:534
 msgid "Playhead"
 msgstr "Ukazatel polohy"
 
-#: editor.cc:192 editor_actions.cc:511
+#: editor.cc:202 editor_actions.cc:536
 msgid "Marker"
 msgstr "Značka"
 
-#: editor.cc:193 editor.cc:210 editor_actions.cc:510
+#: editor.cc:203 editor.cc:220 editor_actions.cc:535
 msgid "Mouse"
 msgstr "Myš"
 
-#: editor.cc:198 editor_actions.cc:518
+#: editor.cc:208 editor_actions.cc:543
 msgid "Slide"
 msgstr "Vsunout"
 
-#: editor.cc:199
+#: editor.cc:209
 msgid "Splice"
 msgstr "Slepit"
 
-#: editor.cc:200 editor_actions.cc:517
+#: editor.cc:210 editor_actions.cc:542
 msgid "Ripple"
 msgstr "Vlnit"
 
-#: editor.cc:201 editor_actions.cc:1808 editor_markers.cc:905
-#: editor_rulers.cc:259 location_ui.cc:60
+#: editor.cc:211 editor_actions.cc:1806 editor_markers.cc:910
+#: editor_rulers.cc:259 location_ui.cc:62
 msgid "Lock"
 msgstr "Zamknout"
 
-#: editor.cc:206 mono_panner_editor.cc:44
+#: editor.cc:216 mono_panner_editor.cc:44
 msgid "Left"
 msgstr "Vlevo"
 
-#: editor.cc:207 mono_panner_editor.cc:49
+#: editor.cc:217 mono_panner_editor.cc:49
 msgid "Right"
 msgstr "Vpravo"
 
-#: editor.cc:208
+#: editor.cc:218
 msgid "Center"
 msgstr "Na střed"
 
-#: editor.cc:211
+#: editor.cc:221
 msgid "Edit point"
 msgstr "Pracovní bod"
 
-#: editor.cc:217
+#: editor.cc:227
 msgid "Mushy"
 msgstr "Rušený"
 
-#: editor.cc:218
+#: editor.cc:228
 msgid "Smooth"
 msgstr "Plynulý"
 
-#: editor.cc:219
+#: editor.cc:229
 msgid "Balanced multitimbral mixture"
 msgstr "Vyvážená vícehlasá směs"
 
-#: editor.cc:220
+#: editor.cc:230
 msgid "Unpitched percussion with stable notes"
 msgstr "Atonální nárazy se stálými tóny"
 
-#: editor.cc:221
+#: editor.cc:231
 msgid "Crisp monophonic instrumental"
 msgstr "Jemná jednokanálová nástrojová hudba"
 
-#: editor.cc:222
+#: editor.cc:232
 msgid "Unpitched solo percussion"
 msgstr "Atonální samostatné nárazy"
 
-#: editor.cc:223
+#: editor.cc:233
 msgid "Resample without preserving pitch"
 msgstr "Převzorkovat bez zachování výšky tónu"
 
-#: editor.cc:259
+#: editor.cc:319
 msgid "Mins:Secs"
 msgstr "Min:Sec"
 
-#: editor.cc:265
+#: editor.cc:325
 msgid "Location Markers"
 msgstr "Značky polohy"
 
-#: editor.cc:266
+#: editor.cc:326
 msgid "Range Markers"
 msgstr "Značky rozsahů"
 
-#: editor.cc:267
+#: editor.cc:327
 msgid "Loop/Punch Ranges"
 msgstr "Rozsahy smyčky/přepsání"
 
-#: editor.cc:268 editor_actions.cc:581
+#: editor.cc:328 editor_actions.cc:606
 msgid "CD Markers"
 msgstr "Značky na CD"
 
-#: editor.cc:269
+#: editor.cc:329
 msgid "Video Timeline"
 msgstr "Časová osa obrazového záznamu"
 
-#: editor.cc:286
+#: editor.cc:386
 msgid "mode"
 msgstr "Režim"
 
-#: editor.cc:465 editor_actions.cc:115 editor_actions.cc:580
+#: editor.cc:535 editor_actions.cc:117 editor_actions.cc:605
 msgid "Markers"
 msgstr "Značky"
 
-#: editor.cc:583 rc_option_editor.cc:2393
+#: editor.cc:653 rc_option_editor.cc:2527
 msgid "Regions"
 msgstr "Oblasti"
 
-#: editor.cc:584
+#: editor.cc:654
 msgid "Tracks & Busses"
 msgstr "Stopy & Sběrnice"
 
-#: editor.cc:585
+#: editor.cc:655
 msgid "Snapshots"
 msgstr "Snímky obrazovky"
 
-#: editor.cc:586
+#: editor.cc:656
 msgid "Track & Bus Groups"
 msgstr "Skupiny stopy a sběrnice"
 
-#: editor.cc:587
+#: editor.cc:657
 msgid "Ranges & Marks"
 msgstr "Rozsahy a značky"
 
-#: editor.cc:734 editor.cc:5803 rc_option_editor.cc:2061
-#: rc_option_editor.cc:2075 rc_option_editor.cc:2079 rc_option_editor.cc:2087
-#: rc_option_editor.cc:2095 rc_option_editor.cc:2104 rc_option_editor.cc:2113
-#: rc_option_editor.cc:2121 rc_option_editor.cc:2129 rc_option_editor.cc:2139
-#: rc_option_editor.cc:2141 rc_option_editor.cc:2165 rc_option_editor.cc:2177
-#: rc_option_editor.cc:2188 rc_option_editor.cc:2206 rc_option_editor.cc:2208
-#: rc_option_editor.cc:2211 rc_option_editor.cc:2220 rc_option_editor.cc:2238
-#: rc_option_editor.cc:2250 rc_option_editor.cc:2252
-msgid "Editor"
-msgstr "Editor"
-
-#: editor.cc:1348 editor.cc:4786 editor_actions.cc:135 editor_actions.cc:1884
+#: editor.cc:1333 editor.cc:4737 editor_actions.cc:137 editor_actions.cc:1882
 msgid "Loop"
 msgstr "Smyčka"
 
-#: editor.cc:1354 editor.cc:4813 editor_actions.cc:136 time_info_box.cc:68
+#: editor.cc:1339 editor.cc:4764 editor_actions.cc:138 time_info_box.cc:62
 msgid "Punch"
 msgstr "Přepsání"
 
-#: editor.cc:1466 rc_option_editor.cc:2159
+#: editor.cc:1474 rc_option_editor.cc:2299
 msgid "Linear (for highly correlated material)"
 msgstr "Lineární (pro vysoce souvztažný materiál)"
 
-#: editor.cc:1476 rc_option_editor.cc:2160
+#: editor.cc:1484 rc_option_editor.cc:2300
 msgid "Constant power"
 msgstr "Neměnná síla"
 
-#: editor.cc:1485 rc_option_editor.cc:2161
+#: editor.cc:1493 rc_option_editor.cc:2301
 msgid "Symmetric"
 msgstr "Souměrný"
 
-#: editor.cc:1495 rc_option_editor.cc:2162
+#: editor.cc:1503 rc_option_editor.cc:2302
 msgid "Slow"
 msgstr "Pomalu"
 
-#: editor.cc:1504 rc_option_editor.cc:2163 sfdb_ui.cc:1767 sfdb_ui.cc:1878
+#: editor.cc:1512 rc_option_editor.cc:2303 sfdb_ui.cc:1737 sfdb_ui.cc:1847
 msgid "Fast"
 msgstr "Rychle"
 
-#: editor.cc:1526 editor.cc:1551
+#: editor.cc:1534 editor.cc:1559
 msgid "Deactivate"
 msgstr "Zastavit"
 
-#: editor.cc:1528 editor.cc:1553
+#: editor.cc:1536 editor.cc:1561
 msgid "Activate"
 msgstr "Spustit"
 
-#: editor.cc:1654 editor.cc:1662 editor_ops.cc:3855
+#: editor.cc:1662 editor.cc:1670 editor_ops.cc:3921
 msgid "Freeze"
 msgstr "Zmrazit"
 
-#: editor.cc:1658
+#: editor.cc:1666
 msgid "Unfreeze"
 msgstr "Rozmrazit"
 
-#: editor.cc:1797
+#: editor.cc:1766
+msgid "Region Loudness Analysis"
+msgstr ""
+
+#: editor.cc:1785 editor.cc:1834
+msgid "Audio Report/Analysis"
+msgstr ""
+
+#: editor.cc:1815
+msgid "Range Loudness Analysis"
+msgstr ""
+
+#: editor.cc:1901
 msgid "Selected Regions"
 msgstr "Vybrané oblasti"
 
-#: editor.cc:1841 editor_markers.cc:940
+#: editor.cc:1945 editor_markers.cc:945
 msgid "Play Range"
 msgstr "Přehrávat rozsah"
 
-#: editor.cc:1842 editor_markers.cc:943
+#: editor.cc:1946 editor_markers.cc:948
 msgid "Loop Range"
 msgstr "Přehrávat rozsah smyčky"
 
-#: editor.cc:1845 editor_markers.cc:950
+#: editor.cc:1949 editor_markers.cc:953
 msgid "Zoom to Range"
 msgstr "Najet na rozsah"
 
-#: editor.cc:1854 editor_actions.cc:383
+#: editor.cc:1952
+msgid "Loudness Analysis"
+msgstr ""
+
+#: editor.cc:1959 editor_actions.cc:401
 msgid "Move Range Start to Previous Region Boundary"
 msgstr "Přesunout začátek rozsahu na předchozí hranici oblasti"
 
-#: editor.cc:1861 editor_actions.cc:390
+#: editor.cc:1966 editor_actions.cc:408
 msgid "Move Range Start to Next Region Boundary"
 msgstr "Přesunout začátek rozsahu na další hranici oblasti"
 
-#: editor.cc:1868 editor_actions.cc:397
+#: editor.cc:1973 editor_actions.cc:415
 msgid "Move Range End to Previous Region Boundary"
 msgstr "Přesunout konec rozsahu na předchozí hranici oblasti"
 
-#: editor.cc:1875 editor_actions.cc:404
+#: editor.cc:1980 editor_actions.cc:422
 msgid "Move Range End to Next Region Boundary"
 msgstr "Přesunout konec rozsahu na další hranici oblasti"
 
-#: editor.cc:1881 editor_actions.cc:134 editor_actions.cc:333
+#: editor.cc:1986 editor_actions.cc:136 editor_actions.cc:347
 msgid "Separate"
 msgstr "Rozdělit"
 
-#: editor.cc:1882
+#: editor.cc:1987
 msgid "Convert to Region in Region List"
 msgstr "Převést na oblast v seznamu oblastí"
 
-#: editor.cc:1885 editor_markers.cc:970
+#: editor.cc:1990 editor_markers.cc:973
 msgid "Select All in Range"
 msgstr "Vybrat vše v rozsahu"
 
-#: editor.cc:1888 editor_actions.cc:305
+#: editor.cc:1993 editor_actions.cc:319
 msgid "Set Loop from Selection"
 msgstr "Nastavit smyčku z výběru"
 
-#: editor.cc:1889 editor_actions.cc:306
+#: editor.cc:1994 editor_actions.cc:320
 msgid "Set Punch from Selection"
 msgstr "Nastavit rozsah přepsání z výběru"
 
-#: editor.cc:1890 editor_actions.cc:307
+#: editor.cc:1995 editor_actions.cc:321
 msgid "Set Session Start/End from Selection"
 msgstr "Nastavit začátek/konec sezení z výběru"
 
-#: editor.cc:1893
+#: editor.cc:1998
 msgid "Add Range Markers"
 msgstr "Vložit značky rozsahu"
 
-#: editor.cc:1896
+#: editor.cc:2001
 msgid "Crop Region to Range"
 msgstr "Zkrátit oblast na rozsah"
 
-#: editor.cc:1897 editor_actions.cc:319
+#: editor.cc:2002 editor_actions.cc:333
 msgid "Duplicate Range"
 msgstr "Zdvojit rozsah"
 
-#: editor.cc:1900
+#: editor.cc:2005
 msgid "Consolidate Range"
 msgstr "Sjednotit rozsah"
 
-#: editor.cc:1901
+#: editor.cc:2006
 msgid "Consolidate Range with Processing"
 msgstr "Sjednotit rozsah se zpracováním"
 
-#: editor.cc:1902
+#: editor.cc:2007
 msgid "Bounce Range to Region List"
 msgstr "Vrazit rozsah do seznamu oblastí"
 
-#: editor.cc:1903
+#: editor.cc:2008
 msgid "Bounce Range to Region List with Processing"
 msgstr "Vrazit rozsah do seznamu oblastí se zpracováním"
 
-#: editor.cc:1904 editor_markers.cc:953
+#: editor.cc:2009 editor_markers.cc:956
 msgid "Export Range..."
 msgstr "Vyvést rozsah..."
 
-#: editor.cc:1906
+#: editor.cc:2011
 msgid "Export Video Range..."
 msgstr "Vyvést rozsah obrazového záznamu..."
 
-#: editor.cc:1922 editor.cc:2004 editor_actions.cc:311
+#: editor.cc:2027 editor.cc:2109 editor_actions.cc:325
 msgid "Play from Edit Point"
 msgstr "Přehrávat od pracovního bodu"
 
-#: editor.cc:1923 editor.cc:2005
+#: editor.cc:2028 editor.cc:2110
 msgid "Play from Start"
 msgstr "Přehrávat od začátku"
 
-#: editor.cc:1924
+#: editor.cc:2029
 msgid "Play Region"
 msgstr "Přehrávat oblast"
 
-#: editor.cc:1926
+#: editor.cc:2031
 msgid "Loop Region"
 msgstr "Přehrávat oblast ve smyčce"
 
-#: editor.cc:1936 editor.cc:2014
+#: editor.cc:2041 editor.cc:2119
 msgid "Select All in Track"
 msgstr "Vybrat vše ve stopě"
 
-#: editor.cc:1937 editor.cc:2015 editor_actions.cc:195
+#: editor.cc:2042 editor.cc:2120 editor_actions.cc:196
 msgid "Select All Objects"
 msgstr "Vybrat všechny předměty"
 
-#: editor.cc:1938 editor.cc:2016
+#: editor.cc:2043 editor.cc:2121
 msgid "Invert Selection in Track"
 msgstr "Obrátit výběr ve stopě"
 
-#: editor.cc:1939 editor.cc:2017 editor_actions.cc:198
+#: editor.cc:2044 editor.cc:2122 editor_actions.cc:199
 msgid "Invert Selection"
 msgstr "Obrátit výběr"
 
-#: editor.cc:1941 editor_actions.cc:200
+#: editor.cc:2046 editor_actions.cc:201
 msgid "Set Range to Loop Range"
 msgstr "Nastavit vybraný rozsah jako rozsah smyčky"
 
-#: editor.cc:1942 editor_actions.cc:201
+#: editor.cc:2047 editor_actions.cc:202
 msgid "Set Range to Punch Range"
 msgstr "Nastavit vybraný rozsah jako rozsah přepsání"
 
-#: editor.cc:1943 editor_actions.cc:202
+#: editor.cc:2048 editor_actions.cc:203
 msgid "Set Range to Selected Regions"
 msgstr "Nastavit rozsah na vybrané oblasti"
 
-#: editor.cc:1945 editor.cc:2019 editor_actions.cc:204 editor_actions.cc:205
+#: editor.cc:2050 editor.cc:2124 editor_actions.cc:205 editor_actions.cc:206
 msgid "Select All After Edit Point"
 msgstr "Vybrat všechny oblasti po pracovním bodě"
 
-#: editor.cc:1946 editor.cc:2020 editor_actions.cc:206 editor_actions.cc:207
+#: editor.cc:2051 editor.cc:2125 editor_actions.cc:207 editor_actions.cc:208
 msgid "Select All Before Edit Point"
 msgstr "Vybrat všechny oblasti před pracovním bodem"
 
-#: editor.cc:1947 editor.cc:2021
+#: editor.cc:2052 editor.cc:2126
 msgid "Select All After Playhead"
 msgstr "Vybrat všechny oblasti po ukazateli polohy"
 
-#: editor.cc:1948 editor.cc:2022
+#: editor.cc:2053 editor.cc:2127
 msgid "Select All Before Playhead"
 msgstr "Vybrat všechny oblasti před ukazatelem polohy"
 
-#: editor.cc:1949
+#: editor.cc:2054
 msgid "Select All Between Playhead and Edit Point"
 msgstr "Vybrat všechny oblasti mezi ukazatelem polohy a pracovním bodem"
 
-#: editor.cc:1950
+#: editor.cc:2055
 msgid "Select All Within Playhead and Edit Point"
 msgstr "Vybrat všechny oblasti v rámci ukazatele polohy a pracovním bodem"
 
-#: editor.cc:1951
+#: editor.cc:2056
 msgid "Select Range Between Playhead and Edit Point"
 msgstr "Vybrat rozsah mezi ukazatelem polohy a pracovním bodem"
 
-#: editor.cc:1953 editor.cc:2024 editor_actions.cc:132 editor_actions.cc:133
+#: editor.cc:2058 editor.cc:2129 editor_actions.cc:134 editor_actions.cc:135
 msgid "Select"
 msgstr "Vybrat"
 
-#: editor.cc:1961 editor.cc:2032 editor_actions.cc:345 processor_box.cc:2828
+#: editor.cc:2066 editor.cc:2137 editor_actions.cc:359 processor_box.cc:3665
 msgid "Cut"
 msgstr "Vyjmout"
 
-#: editor.cc:1962 editor.cc:2033 editor_actions.cc:349 processor_box.cc:2830
+#: editor.cc:2067 editor.cc:2138 editor_actions.cc:363 processor_box.cc:3667
 msgid "Copy"
 msgstr "Kopírovat"
 
-#: editor.cc:1963 editor.cc:2034 editor_actions.cc:350 processor_box.cc:2835
+#: editor.cc:2068 editor.cc:2139 editor_actions.cc:364 processor_box.cc:3679
 msgid "Paste"
 msgstr "Vložit"
 
-#: editor.cc:1967 editor_actions.cc:92
+#: editor.cc:2072 editor_actions.cc:94
 msgid "Align"
 msgstr "Zarovnat"
 
-#: editor.cc:1968
+#: editor.cc:2073
 msgid "Align Relative"
 msgstr "Zarovnat poměrně"
 
-#: editor.cc:1975
+#: editor.cc:2080
 msgid "Insert Selected Region"
 msgstr "Vložit vybranou oblast"
 
-#: editor.cc:1976
+#: editor.cc:2081
 msgid "Insert Existing Media"
 msgstr "Vložit stávající materiál"
 
-#: editor.cc:1985 editor.cc:2041
+#: editor.cc:2090 editor.cc:2146
 msgid "Nudge Entire Track Later"
 msgstr "Postrčit celou stopu o krok později"
 
-#: editor.cc:1986 editor.cc:2042
+#: editor.cc:2091 editor.cc:2147
 msgid "Nudge Track After Edit Point Later"
 msgstr "Postrčit stopu po pracovním bodu o krok později"
 
-#: editor.cc:1987 editor.cc:2043
+#: editor.cc:2092 editor.cc:2148
 msgid "Nudge Entire Track Earlier"
 msgstr "Postrčit celou stopu o krok dříve"
 
-#: editor.cc:1988 editor.cc:2044
+#: editor.cc:2093 editor.cc:2149
 msgid "Nudge Track After Edit Point Earlier"
 msgstr "Postrčit stopu po pracovním bodu o krok dříve"
 
-#: editor.cc:1990 editor.cc:2046
+#: editor.cc:2095 editor.cc:2151
 msgid "Nudge"
 msgstr "Postrčit"
 
-#: editor.cc:2261
+#: editor.cc:2353
 msgid ""
 "Playhead position stored with a negative value - ignored (use zero instead)"
 msgstr ""
 "Ukazatel polohy přehrávání se zápornou hodnotou polohy - přehlíží se (místo "
 "toho se používá nula)"
 
-#: editor.cc:3039 editor.cc:3738 editor.cc:3809 midi_channel_selector.cc:157
+#: editor.cc:3115 editor.cc:3775 editor.cc:3846 midi_channel_selector.cc:157
 #: midi_channel_selector.cc:395 midi_channel_selector.cc:431
 msgid "All"
 msgstr "VÅ¡e"
 
-#: editor.cc:3239
+#: editor.cc:3280
 msgid "Smart Mode (add range functions to Grab Mode)"
 msgstr "Chytrý režim (přidat dodatečné funkce rozsahu do režimu chňapnutí)"
 
-#: editor.cc:3240
+#: editor.cc:3281
 msgid "Grab Mode (select/move objects)"
 msgstr "Režim chňapnutí (vybrat/přesunout předměty)"
 
-#: editor.cc:3241
+#: editor.cc:3282
 msgid "Cut Mode (split regions)"
 msgstr "Režim vyjmutí (rozdělit oblasti)"
 
-#: editor.cc:3242
+#: editor.cc:3283
 msgid "Range Mode (select time ranges)"
 msgstr "Režim rozsahu (vybrat časové rozsahy)"
 
-#: editor.cc:3243
+#: editor.cc:3284
 msgid "Draw Mode (draw and edit gain/notes/automation)"
 msgstr "Režim kreslení (kreslit a upravovat zesílení/noty/automatizaci)"
 
-#: editor.cc:3244
+#: editor.cc:3285
 msgid "Stretch Mode (time-stretch audio and midi regions, preserving pitch)"
 msgstr ""
 "Režim protažení (protáhnutí času zvuku a oblastí MIDI při zachování výšky "
 "tónu)"
 
-#: editor.cc:3245
+#: editor.cc:3286
 msgid "Audition Mode (listen to regions)"
 msgstr "Režim poslechu (poslouchat oblasti"
 
-#: editor.cc:3246
+#: editor.cc:3287
 msgid "Internal Edit Mode (edit notes and automation points)"
 msgstr "Režim vnitřních úprav (upravovat noty a body automatizace)"
 
-#: editor.cc:3247
+#: editor.cc:3288
 msgid ""
 "Groups: click to (de)activate\n"
 "Context-click for other operations"
@@ -3416,63 +3642,63 @@ msgstr ""
 "Skupiny: klepnout pro zapnutí/vypnutí\n"
 "Klepnutí na související nabídku pro jiné operace"
 
-#: editor.cc:3248
+#: editor.cc:3289
 msgid "Nudge Region/Selection Later"
 msgstr "Postrčit oblast/výběr o krok později"
 
-#: editor.cc:3249
+#: editor.cc:3290
 msgid "Nudge Region/Selection Earlier"
 msgstr "Postrčit oblast/výběr o krok dříve"
 
-#: editor.cc:3250 editor_actions.cc:270
+#: editor.cc:3291 editor_actions.cc:272
 msgid "Zoom In"
 msgstr "Přiblížit"
 
-#: editor.cc:3251 editor_actions.cc:269
+#: editor.cc:3292 editor_actions.cc:271
 msgid "Zoom Out"
 msgstr "Oddálit"
 
-#: editor.cc:3252
+#: editor.cc:3293
 msgid "Zoom to Time Scale"
 msgstr "Pohled na časový úsek"
 
-#: editor.cc:3253 editor.cc:3760 editor_actions.cc:271
+#: editor.cc:3294 editor.cc:3797 editor_actions.cc:273
 msgid "Zoom to Session"
 msgstr "Pohled na celé sezení"
 
-#: editor.cc:3254 editor_actions.cc:113 editor_actions.cc:146
+#: editor.cc:3295 editor_actions.cc:115 editor_actions.cc:148
 msgid "Zoom Focus"
 msgstr "Pohled na střed"
 
-#: editor.cc:3255
+#: editor.cc:3296
 msgid "Expand Tracks"
 msgstr "Rozbalit stopy"
 
-#: editor.cc:3256
+#: editor.cc:3297
 msgid "Shrink Tracks"
 msgstr "Zmenšit stopy"
 
-#: editor.cc:3257
+#: editor.cc:3298
 msgid "Number of visible tracks"
 msgstr "Počet viditelných stop"
 
-#: editor.cc:3258
+#: editor.cc:3299
 msgid "Snap/Grid Units"
 msgstr "Jednotky zapadnutí/mřížky"
 
-#: editor.cc:3259
+#: editor.cc:3300
 msgid "Snap/Grid Mode"
 msgstr "Režim zapadnutí/mřížky"
 
-#: editor.cc:3260 editor_actions.cc:99
+#: editor.cc:3301 editor_actions.cc:101
 msgid "Edit Point"
 msgstr "Pracovní bod"
 
-#: editor.cc:3261
+#: editor.cc:3302
 msgid "Edit Mode"
 msgstr "Režim úprav"
 
-#: editor.cc:3262
+#: editor.cc:3303
 msgid ""
 "Nudge Clock\n"
 "(controls distance used to nudge regions and selections)"
@@ -3480,124 +3706,124 @@ msgstr ""
 "Hodiny postrčení\n"
 "(řídí vzdálenost použitou k postrčení oblastí a výběrů)"
 
-#: editor.cc:3530 editor_actions.cc:321
+#: editor.cc:3571 editor_actions.cc:335
 msgid "Command|Undo"
 msgstr "Příkaz|Zpět"
 
-#: editor.cc:3532
+#: editor.cc:3573
 msgid "Command|Undo (%1)"
 msgstr "Příkaz|Zpět (%1)"
 
-#: editor.cc:3539 editor_actions.cc:323 editor_actions.cc:324
-#: editor_actions.cc:325
+#: editor.cc:3580 editor_actions.cc:337 editor_actions.cc:338
+#: editor_actions.cc:339
 msgid "Redo"
 msgstr "Znovu"
 
-#: editor.cc:3542
+#: editor.cc:3583
 msgid "Redo (%1)"
 msgstr "Znovu (%1)"
 
-#: editor.cc:3562 editor.cc:3586 editor_actions.cc:111 editor_actions.cc:1865
+#: editor.cc:3603 editor.cc:3627 editor_actions.cc:113 editor_actions.cc:1863
 msgid "Duplicate"
 msgstr "Zdvojit"
 
-#: editor.cc:3563
+#: editor.cc:3604
 msgid "Number of duplications:"
 msgstr "Počet zdvojení:"
 
-#: editor.cc:3737 route_group_dialog.cc:51 time_info_box.cc:67
+#: editor.cc:3774 route_group_dialog.cc:51 time_info_box.cc:61
 msgid "Selection"
 msgstr "Výběr"
 
-#: editor.cc:3740
+#: editor.cc:3777
 msgid "Fit 1 track"
 msgstr "Přizpůsobit 1 stopu"
 
-#: editor.cc:3741
+#: editor.cc:3778
 msgid "Fit 2 tracks"
 msgstr "Přizpůsobit 2 stopy"
 
-#: editor.cc:3742
+#: editor.cc:3779
 msgid "Fit 4 tracks"
 msgstr "Přizpůsobit 4 stopy"
 
-#: editor.cc:3743
+#: editor.cc:3780
 msgid "Fit 8 tracks"
 msgstr "Přizpůsobit 8 stop"
 
-#: editor.cc:3744
+#: editor.cc:3781
 msgid "Fit 16 tracks"
 msgstr "Přizpůsobit 16 stop"
 
-#: editor.cc:3745
+#: editor.cc:3782
 msgid "Fit 24 tracks"
 msgstr "Přizpůsobit 24 stop"
 
-#: editor.cc:3746
+#: editor.cc:3783
 msgid "Fit 32 tracks"
 msgstr "Přizpůsobit 32 stop"
 
-#: editor.cc:3747
+#: editor.cc:3784
 msgid "Fit 48 tracks"
 msgstr "Přizpůsobit 48 stop"
 
-#: editor.cc:3748
+#: editor.cc:3785
 msgid "Fit All tracks"
 msgstr "Přizpůsobit všechny stopy"
 
-#: editor.cc:3749
+#: editor.cc:3786
 msgid "Fit Selection"
 msgstr "Přizpůsobit výběr"
 
-#: editor.cc:3751
+#: editor.cc:3788 editor_actions.cc:288
 msgid "Zoom to 10 ms"
 msgstr "Přiblížit na 10 ms"
 
-#: editor.cc:3752
+#: editor.cc:3789 editor_actions.cc:289
 msgid "Zoom to 100 ms"
 msgstr "Přiblížit na 100 ms"
 
-#: editor.cc:3753
+#: editor.cc:3790 editor_actions.cc:290
 msgid "Zoom to 1 sec"
 msgstr "Přiblížit na 1 s"
 
-#: editor.cc:3754
+#: editor.cc:3791 editor_actions.cc:291
 msgid "Zoom to 10 sec"
 msgstr "Přiblížit na 10 s"
 
-#: editor.cc:3755
+#: editor.cc:3792 editor_actions.cc:292
 msgid "Zoom to 1 min"
 msgstr "Přiblížit na 1 minutu"
 
-#: editor.cc:3756
+#: editor.cc:3793 editor_actions.cc:294
 msgid "Zoom to 10 min"
 msgstr "Přiblížit na 10 minut"
 
-#: editor.cc:3757
+#: editor.cc:3794
 msgid "Zoom to 1 hour"
 msgstr "Přiblížit na 1 hodinu"
 
-#: editor.cc:3758
+#: editor.cc:3795
 msgid "Zoom to 8 hours"
 msgstr "Přiblížit na 8 hodin"
 
-#: editor.cc:3759
+#: editor.cc:3796
 msgid "Zoom to 24 hours"
 msgstr "Přiblížit na 24 hodin"
 
-#: editor.cc:3761
+#: editor.cc:3798
 msgid "Zoom to Range/Region Selection"
 msgstr "Přiblížit na výběr rozsahu/oblasti"
 
-#: editor.cc:3831
+#: editor.cc:3868
 msgid "*"
 msgstr "*"
 
-#: editor.cc:4151
+#: editor.cc:4135
 msgid "Playlist Deletion"
 msgstr "Smazání seznamu skladeb"
 
-#: editor.cc:4152
+#: editor.cc:4136
 msgid ""
 "Playlist %1 is currently unused.\n"
 "If it is kept, its audio files will not be cleaned.\n"
@@ -3608,1330 +3834,1373 @@ msgstr ""
 "používány.\n"
 "Jestliže se smaže, budou jím používané zvukové soubory smazány."
 
-#: editor.cc:4162
+#: editor.cc:4146
 msgid "Delete All Unused"
 msgstr "Smazat vše nepoužívané"
 
-#: editor.cc:4163
+#: editor.cc:4147
 msgid "Delete Playlist"
 msgstr "Smazat seznam skladeb"
 
-#: editor.cc:4164
+#: editor.cc:4148
 msgid "Keep Playlist"
 msgstr "Ponechat seznam skladeb"
 
-#: editor.cc:4165
+#: editor.cc:4149
 msgid "Keep Remaining"
 msgstr "Zachovat zbývající"
 
-#: editor.cc:4166 editor_audio_import.cc:597 editor_ops.cc:6456
-#: engine_dialog.cc:2909 sfdb_freesound_mootcher.cc:69 processor_box.cc:2596
-#: processor_box.cc:2621
+#: editor.cc:4150 editor_audio_import.cc:600 editor_ops.cc:6530
+#: engine_dialog.cc:2986 sfdb_freesound_mootcher.cc:69 processor_box.cc:3431
+#: processor_box.cc:3456
 msgid "Cancel"
 msgstr "Zrušit"
 
-#: editor.cc:4321
+#: editor.cc:4292
 msgid "new playlists"
 msgstr "Nový seznam skladeb"
 
-#: editor.cc:4337
+#: editor.cc:4308
 msgid "copy playlists"
 msgstr "Kopírovat seznam skladeb"
 
-#: editor.cc:4352
+#: editor.cc:4323
 msgid "clear playlists"
 msgstr "Vyprázdnit seznam skladeb"
 
-#: editor.cc:5098
+#: editor.cc:5048
 msgid "Please wait while %1 loads visual data."
 msgstr "Počkejte, prosím, zatímco %1 nahrává vizuální data."
 
-#: editor.cc:5950 editor.cc:5985 editor_markers.cc:985 panner_ui.cc:412
-#: processor_box.cc:2855
+#: editor.cc:5811 editor_actions.cc:479
+msgid "Unset #%1"
+msgstr ""
+
+#: editor.cc:5812 editor_actions.cc:481
+msgid "no action bound"
+msgstr ""
+
+#: editor.cc:5961 editor.cc:5996 editor_markers.cc:998 editor_markers.cc:1018
+#: panner_ui.cc:412 processor_box.cc:3703
 msgid "Edit..."
 msgstr "Upravit..."
 
-#: editor.cc:5991 editor_actions.cc:1844
+#: editor.cc:6002 editor_actions.cc:1842
 msgid "Transpose..."
 msgstr "Převést..."
 
-#: editor.cc:5995 editor_actions.cc:1960
+#: editor.cc:6006 editor_actions.cc:1959
 msgid "Legatize"
 msgstr "Převázat (legato)"
 
-#: editor.cc:6001 editor_actions.cc:1959
+#: editor.cc:6012 editor_actions.cc:1958
 msgid "Quantize..."
 msgstr "Kvantovat..."
 
-#: editor.cc:6004 editor_actions.cc:1962
+#: editor.cc:6015 editor_actions.cc:1961
 msgid "Remove Overlap"
 msgstr "Odstranit překrytí (legato)"
 
-#: editor.cc:6010 editor_actions.cc:1961
+#: editor.cc:6021 editor_actions.cc:1960
 msgid "Transform..."
 msgstr "Proměnit..."
 
-#: editor_actions.cc:93
+#: editor_actions.cc:95
 msgid "Autoconnect"
 msgstr "Automaticky spojit"
 
-#: editor_actions.cc:94
+#: editor_actions.cc:96
 msgid "Crossfades"
 msgstr "Prolínání"
 
-#: editor_actions.cc:96
+#: editor_actions.cc:98
 msgid "Move Selected Marker"
 msgstr "Posunout vybranou značku polohy"
 
-#: editor_actions.cc:97
+#: editor_actions.cc:99
 msgid "Select Range Operations"
 msgstr "Vybrat operace s rozsahy"
 
-#: editor_actions.cc:98
+#: editor_actions.cc:100
 msgid "Select Regions"
 msgstr "Vybrat oblasti"
 
-#: editor_actions.cc:100
+#: editor_actions.cc:102
 msgid "Fade"
 msgstr "Zesílit/Zeslabit"
 
-#: editor_actions.cc:101
+#: editor_actions.cc:103
 msgid "Latch"
 msgstr "Zaklapnout"
 
-#: editor_actions.cc:102 editor_regions.cc:115 region_editor.cc:48
+#: editor_actions.cc:104 editor_regions.cc:159 region_editor.cc:48
 msgid "Region"
 msgstr "Oblast"
 
-#: editor_actions.cc:103
+#: editor_actions.cc:105
 msgid "Layering"
 msgstr "Vrstvení"
 
-#: editor_actions.cc:104 editor_regions.cc:116 stereo_panner_editor.cc:46
+#: editor_actions.cc:106 editor_regions.cc:160 stereo_panner_editor.cc:46
 msgid "Position"
 msgstr "Poloha"
 
-#: editor_actions.cc:106 gain_meter.cc:158 gain_meter.cc:827 panner_ui.cc:178
-#: panner_ui.cc:637 route_time_axis.cc:529
+#: editor_actions.cc:108 gain_meter.cc:161 gain_meter.cc:848 panner_ui.cc:178
+#: panner_ui.cc:637 route_time_axis.cc:541
 msgid "Trim"
 msgstr "Ustřihnout"
 
-#: editor_actions.cc:107 editor_actions.cc:127 route_group_dialog.cc:46
+#: editor_actions.cc:109 editor_actions.cc:129 route_group_dialog.cc:46
 msgid "Gain"
 msgstr "Zesílení signálu"
 
-#: editor_actions.cc:108 editor_actions.cc:579
+#: editor_actions.cc:110 editor_actions.cc:604
 msgid "Ranges"
 msgstr "Rozsahy"
 
-#: editor_actions.cc:109 editor_actions.cc:1861 session_option_editor.cc:135
+#: editor_actions.cc:111 editor_actions.cc:1859 session_option_editor.cc:135
 #: session_option_editor.cc:144 session_option_editor.cc:151
 #: session_option_editor.cc:158 session_option_editor.cc:165
 msgid "Fades"
 msgstr "Prolínání"
 
-#: editor_actions.cc:112
+#: editor_actions.cc:114
 msgid "Link"
 msgstr "Propojení"
 
-#: editor_actions.cc:114
+#: editor_actions.cc:116
 msgid "Locate to Markers"
 msgstr "Ukazatele polohy postavit na značky"
 
-#: editor_actions.cc:116
+#: editor_actions.cc:118
 msgid "Meter falloff"
 msgstr "Klesání ukazatele hladiny"
 
-#: editor_actions.cc:117
+#: editor_actions.cc:119
 msgid "Meter hold"
 msgstr "Držení ukazatele hladiny"
 
-#: editor_actions.cc:118 session_option_editor.cc:342
+#: editor_actions.cc:120 session_option_editor.cc:342
 msgid "MIDI Options"
 msgstr "Volby pro MIDI"
 
-#: editor_actions.cc:119
+#: editor_actions.cc:121
 msgid "Misc Options"
 msgstr "Různé volby"
 
-#: editor_actions.cc:120 rc_option_editor.cc:2261 route_group_dialog.cc:54
+#: editor_actions.cc:122 rc_option_editor.cc:2401 route_group_dialog.cc:54
 #: session_option_editor.cc:264 session_option_editor.cc:271
 msgid "Monitoring"
 msgstr "Sledování"
 
-#: editor_actions.cc:121
+#: editor_actions.cc:123
 msgid "Active Mark"
 msgstr "Současná značka"
 
-#: editor_actions.cc:124
+#: editor_actions.cc:126
 msgid "Primary Clock"
 msgstr "Hlavní údaj o čase"
 
-#: editor_actions.cc:125
+#: editor_actions.cc:127
 msgid "Pullup / Pulldown"
 msgstr "Vytáhnout nahoru/Stáhnout dolů"
 
-#: editor_actions.cc:126
+#: editor_actions.cc:128
 msgid "Region operations"
 msgstr "Operace s oblastmi"
 
-#: editor_actions.cc:128 ruler_dialog.cc:28
+#: editor_actions.cc:130 ruler_dialog.cc:28
 msgid "Rulers"
 msgstr "Pravítka se značkami"
 
-#: editor_actions.cc:129
+#: editor_actions.cc:131
 msgid "Views"
 msgstr "Pohledy"
 
-#: editor_actions.cc:130
+#: editor_actions.cc:132
 msgid "Scroll"
 msgstr "Projíždět"
 
-#: editor_actions.cc:131
+#: editor_actions.cc:133
 msgid "Secondary Clock"
 msgstr "Vedlejší údaj o čase"
 
-#: editor_actions.cc:138
+#: editor_actions.cc:140
 msgid "Subframes"
 msgstr "Podřízené snímky"
 
-#: editor_actions.cc:141
+#: editor_actions.cc:143
 msgid "Timecode fps"
 msgstr "Časový kód FPS"
 
-#: editor_actions.cc:142 route_time_axis.cc:587
+#: editor_actions.cc:144 route_time_axis.cc:599
 msgid "Height"
 msgstr "Výška"
 
-#: editor_actions.cc:144
+#: editor_actions.cc:146
 msgid "Tools"
 msgstr "Nástroje"
 
-#: editor_actions.cc:145
+#: editor_actions.cc:147
 msgid "View"
 msgstr "Pohled"
 
-#: editor_actions.cc:147
+#: editor_actions.cc:149
 msgid "Zoom"
 msgstr "Zvětšení"
 
-#: editor_actions.cc:153
-msgid "Break drag or deselect all"
-msgstr "Přerušit tažení nebo odznačit vše"
+#: editor_actions.cc:150
+msgid "Scripted Actions"
+msgstr ""
 
-#: editor_actions.cc:158
+#: editor_actions.cc:159
 msgid "Session|Lock"
 msgstr "Zámek"
 
-#: editor_actions.cc:160
+#: editor_actions.cc:161
 msgid "Show Editor Mixer"
 msgstr "Ukázat panel směšovače"
 
-#: editor_actions.cc:161
+#: editor_actions.cc:162
 msgid "Show Editor List"
 msgstr "Ukázat seznam editoru"
 
-#: editor_actions.cc:163
+#: editor_actions.cc:164
 msgid "Playhead to Next Region Boundary"
 msgstr "Ukazatele polohy na další hranici oblasti"
 
-#: editor_actions.cc:164
+#: editor_actions.cc:165
 msgid "Playhead to Next Region Boundary (No Track Selection)"
 msgstr "Ukazatele polohy na další hranici oblasti (žádný výběr stopy)"
 
-#: editor_actions.cc:165
+#: editor_actions.cc:166
 msgid "Playhead to Previous Region Boundary"
 msgstr "Ukazatele polohy na předchozí hranici oblasti"
 
-#: editor_actions.cc:166
+#: editor_actions.cc:167
 msgid "Playhead to Previous Region Boundary (No Track Selection)"
 msgstr "Ukazatele polohy na předchozí hranici oblasti (žádný výběr stopy)"
 
-#: editor_actions.cc:168
+#: editor_actions.cc:169
 msgid "Playhead to Next Region Start"
 msgstr "Ukazatele polohy na začátek další oblasti"
 
-#: editor_actions.cc:169
+#: editor_actions.cc:170
 msgid "Playhead to Next Region End"
 msgstr "Ukazatele polohy na konec další oblasti"
 
-#: editor_actions.cc:170
+#: editor_actions.cc:171
 msgid "Playhead to Next Region Sync"
 msgstr "Ukazatele polohy na bod zapadnutí další oblasti"
 
-#: editor_actions.cc:172
+#: editor_actions.cc:173
 msgid "Playhead to Previous Region Start"
 msgstr "Ukazatele polohy na začátek předchozí oblasti"
 
-#: editor_actions.cc:173
+#: editor_actions.cc:174
 msgid "Playhead to Previous Region End"
 msgstr "Ukazatele polohy na konec předchozí oblasti"
 
-#: editor_actions.cc:174
+#: editor_actions.cc:175
 msgid "Playhead to Previous Region Sync"
 msgstr "Ukazatele polohy na bod zapadnutí předchozí oblasti"
 
-#: editor_actions.cc:176
+#: editor_actions.cc:177
 msgid "To Next Region Boundary"
 msgstr "Na další hranici oblasti"
 
-#: editor_actions.cc:177
+#: editor_actions.cc:178
 msgid "To Next Region Boundary (No Track Selection)"
 msgstr "Na další hranici oblasti (žádný výběr stopy)"
 
-#: editor_actions.cc:178
+#: editor_actions.cc:179
 msgid "To Previous Region Boundary"
 msgstr "Na předchozí hranici oblasti"
 
-#: editor_actions.cc:179
+#: editor_actions.cc:180
 msgid "To Previous Region Boundary (No Track Selection)"
 msgstr "Na předchozí hranici oblasti (žádný výběr stopy)"
 
-#: editor_actions.cc:181
+#: editor_actions.cc:182
 msgid "To Next Region Start"
 msgstr "Na začátek další oblasti"
 
-#: editor_actions.cc:182
+#: editor_actions.cc:183
 msgid "To Next Region End"
 msgstr "Na konec další oblasti"
 
-#: editor_actions.cc:183
+#: editor_actions.cc:184
 msgid "To Next Region Sync"
 msgstr "Na bod zapadnutí další oblasti"
 
-#: editor_actions.cc:185
+#: editor_actions.cc:186
 msgid "To Previous Region Start"
 msgstr "Na začátek předchozí oblasti"
 
-#: editor_actions.cc:186
+#: editor_actions.cc:187
 msgid "To Previous Region End"
 msgstr "Na konec předchozí oblasti"
 
-#: editor_actions.cc:187
+#: editor_actions.cc:188
 msgid "To Previous Region Sync"
 msgstr "Na bod zapadnutí předchozí oblasti"
 
-#: editor_actions.cc:189
+#: editor_actions.cc:190
 msgid "To Range Start"
 msgstr "Na začátek rozsahu výběru"
 
-#: editor_actions.cc:190
+#: editor_actions.cc:191
 msgid "To Range End"
 msgstr "Na konec rozsahu výběru"
 
-#: editor_actions.cc:192
+#: editor_actions.cc:193
 msgid "Playhead to Range Start"
 msgstr "Ukazatele polohy na začátek rozsahu výběru"
 
-#: editor_actions.cc:193
+#: editor_actions.cc:194
 msgid "Playhead to Range End"
 msgstr "Ukazatele polohy na konec rozsahu výběru"
 
-#: editor_actions.cc:196
+#: editor_actions.cc:197
 msgid "Select All Tracks"
 msgstr "Vybrat všechny stopy"
 
-#: editor_actions.cc:197 export_timespan_selector.cc:59 processor_box.cc:2841
+#: editor_actions.cc:198 export_timespan_selector.cc:59 processor_box.cc:3685
 msgid "Deselect All"
 msgstr "Odznačit vše"
 
-#: editor_actions.cc:209
+#: editor_actions.cc:210
 msgid "Select All Overlapping Edit Range"
 msgstr "Vybrat všechny překrývající se oblasti v rozsahu úprav"
 
-#: editor_actions.cc:210
+#: editor_actions.cc:211
 msgid "Select All Inside Edit Range"
 msgstr "Vybrat vše uvnitř rozsahu úprav"
 
-#: editor_actions.cc:212
+#: editor_actions.cc:213
 msgid "Select Edit Range"
 msgstr "Vybrat rozsah úprav"
 
-#: editor_actions.cc:214
+#: editor_actions.cc:215
 msgid "Select All in Punch Range"
 msgstr "Vybrat všechny oblasti v rozsahu přepsání"
 
-#: editor_actions.cc:215
+#: editor_actions.cc:216
 msgid "Select All in Loop Range"
 msgstr "Vybrat všechny oblasti uvnitř rozsahu smyčky"
 
-#: editor_actions.cc:217
+#: editor_actions.cc:218
 msgid "Select Next Track or Bus"
 msgstr "Vybrat další stopu nebo sběrnici"
 
-#: editor_actions.cc:218
+#: editor_actions.cc:219
 msgid "Select Previous Track or Bus"
 msgstr "Vybrat předchozí stopu nebo sběrnici"
 
-#: editor_actions.cc:220
+#: editor_actions.cc:221
 msgid "Toggle Record Enable"
 msgstr "Spustit nahrávání"
 
-#: editor_actions.cc:222
+#: editor_actions.cc:223
 msgid "Toggle Solo"
 msgstr "Přepnout sólo"
 
-#: editor_actions.cc:224
+#: editor_actions.cc:225
 msgid "Toggle Mute"
 msgstr "Přepnout ztlumení"
 
-#: editor_actions.cc:226
+#: editor_actions.cc:227
 msgid "Toggle Solo Isolate"
 msgstr "Přepnout samostatné sólo"
 
-#: editor_actions.cc:231
+#: editor_actions.cc:232
 msgid "Save View %1"
 msgstr "Uložit pohled %1"
 
-#: editor_actions.cc:237
+#: editor_actions.cc:238
 msgid "Go to View %1"
 msgstr "Vyvolat pohled %1"
 
-#: editor_actions.cc:243
+#: editor_actions.cc:244
 msgid "Locate to Mark %1"
 msgstr "Ukazatele polohy postavit na značku %1"
 
-#: editor_actions.cc:247 editor_actions.cc:248
+#: editor_actions.cc:249 editor_actions.cc:250
 msgid "Jump to Next Mark"
 msgstr "Skočit na další značku"
 
-#: editor_actions.cc:249 editor_actions.cc:250
+#: editor_actions.cc:251 editor_actions.cc:252
 msgid "Jump to Previous Mark"
 msgstr "Skočit na předchozí značku"
 
-#: editor_actions.cc:252
+#: editor_actions.cc:254
 msgid "Set Session Start from Playhead"
 msgstr "Nastavit začátek sezení z polohy ukazatele přehrávání"
 
-#: editor_actions.cc:253
+#: editor_actions.cc:255
 msgid "Set Session End from Playhead"
 msgstr "Nastavit konec sezení na ukazatel polohy"
 
-#: editor_actions.cc:255 editor_actions.cc:256
+#: editor_actions.cc:257 editor_actions.cc:258
 msgid "Add Mark from Playhead"
 msgstr "Zřídit značku na ukazateli polohy"
 
-#: editor_actions.cc:258 editor_actions.cc:259
+#: editor_actions.cc:260 editor_actions.cc:261
 msgid "Remove Mark at Playhead"
 msgstr "Odstranit značku při ukazateli polohy"
 
-#: editor_actions.cc:261
+#: editor_actions.cc:263
 msgid "Nudge Next Later"
 msgstr "Postrčit další oblast o krok později"
 
-#: editor_actions.cc:262
+#: editor_actions.cc:264
 msgid "Nudge Next Earlier"
 msgstr "Postrčit další oblast o krok dříve"
 
-#: editor_actions.cc:264
+#: editor_actions.cc:266
 msgid "Nudge Playhead Forward"
 msgstr "Postrčit ukazatele polohy o krok vpřed"
 
-#: editor_actions.cc:265
+#: editor_actions.cc:267
 msgid "Nudge Playhead Backward"
 msgstr "Postrčit ukazatele polohy o krok zpět"
 
-#: editor_actions.cc:266
+#: editor_actions.cc:268
 msgid "Playhead to Next Grid"
 msgstr "Ukazatele polohy k další mřížce"
 
-#: editor_actions.cc:267
+#: editor_actions.cc:269
 msgid "Playhead to Previous Grid"
 msgstr "Ukazatele polohy k předchozí mřížce"
 
-#: editor_actions.cc:272
+#: editor_actions.cc:274
 msgid "Zoom to Selection"
 msgstr "Přiblížit výběr"
 
-#: editor_actions.cc:273
+#: editor_actions.cc:275
 msgid "Toggle Zoom State"
 msgstr "Přepnout na poslední přiblížení/oddálení"
 
-#: editor_actions.cc:275
+#: editor_actions.cc:277
 msgid "Expand Track Height"
 msgstr "Zvětšit výšku stopy"
 
-#: editor_actions.cc:276
+#: editor_actions.cc:278
 msgid "Shrink Track Height"
 msgstr "Zmenšit výšku stopy"
 
-#: editor_actions.cc:278
+#: editor_actions.cc:280
+msgid "Fit 1 Track"
+msgstr ""
+
+#: editor_actions.cc:281
+msgid "Fit 2 Tracks"
+msgstr ""
+
+#: editor_actions.cc:282
+msgid "Fit 4 Tracks"
+msgstr ""
+
+#: editor_actions.cc:283
+msgid "Fit 8 Tracks"
+msgstr ""
+
+#: editor_actions.cc:284
+msgid "Fit 16 Tracks"
+msgstr ""
+
+#: editor_actions.cc:285
+msgid "Fit 32 Tracks"
+msgstr ""
+
+#: editor_actions.cc:286
+msgid "Fit All Tracks"
+msgstr ""
+
+#: editor_actions.cc:293
+msgid "Zoom to 5 min"
+msgstr ""
+
+#: editor_actions.cc:296
 msgid "Move Selected Tracks Up"
 msgstr "Vybrané stopy posunout nahoru"
 
-#: editor_actions.cc:280
+#: editor_actions.cc:298
 msgid "Move Selected Tracks Down"
 msgstr "Vybrané stopy posunout dolů"
 
-#: editor_actions.cc:283
+#: editor_actions.cc:301
 msgid "Scroll Tracks Up"
 msgstr "Projíždět stopami nahoru"
 
-#: editor_actions.cc:285
+#: editor_actions.cc:302
 msgid "Scroll Tracks Down"
 msgstr "Projíždět stopami dolů"
 
-#: editor_actions.cc:287
+#: editor_actions.cc:303
 msgid "Step Tracks Up"
 msgstr "Projíždět stopami pomalu nahoru"
 
-#: editor_actions.cc:289
+#: editor_actions.cc:304
 msgid "Step Tracks Down"
 msgstr "Projíždět stopami pomalu dolů"
 
-#: editor_actions.cc:292
+#: editor_actions.cc:306
 msgid "Scroll Backward"
 msgstr "Projíždět doprava (dozadu)"
 
-#: editor_actions.cc:293
+#: editor_actions.cc:307
 msgid "Scroll Forward"
 msgstr "Projíždět doleva (dopředu)"
 
-#: editor_actions.cc:294
+#: editor_actions.cc:308
 msgid "Center Playhead"
 msgstr "Vystředit ukazatele polohy"
 
-#: editor_actions.cc:295
+#: editor_actions.cc:309
 msgid "Center Edit Point"
 msgstr "Pracovní bod umístit do středu"
 
-#: editor_actions.cc:297
+#: editor_actions.cc:311
 msgid "Playhead Forward"
 msgstr "Ukazatele polohy dopředu"
 
-#: editor_actions.cc:298
+#: editor_actions.cc:312
 msgid "Playhead Backward"
 msgstr "Ukazatele polohy dozadu"
 
-#: editor_actions.cc:300
+#: editor_actions.cc:314
 msgid "Playhead to Active Mark"
 msgstr "Ukazatele polohy k činné značce"
 
-#: editor_actions.cc:301
+#: editor_actions.cc:315
 msgid "Active Mark to Playhead"
 msgstr "Posunout činnou značku k ukazateli polohy"
 
-#: editor_actions.cc:303
+#: editor_actions.cc:317
 msgid "Use Skip Ranges"
 msgstr "Použít oblasti skoků"
 
-#: editor_actions.cc:310
+#: editor_actions.cc:324
 msgid "Play Selected Regions"
 msgstr "Přehrát vybrané oblasti"
 
-#: editor_actions.cc:312
+#: editor_actions.cc:326
 msgid "Play from Edit Point and Return"
 msgstr "Přehrávat od pracovního bodu a znovu"
 
-#: editor_actions.cc:314
+#: editor_actions.cc:328
 msgid "Play Edit Range"
 msgstr "Přehrávat rozsah úprav"
 
-#: editor_actions.cc:316
+#: editor_actions.cc:330
 msgid "Playhead to Mouse"
 msgstr "Ukazatele polohy na polohu myši"
 
-#: editor_actions.cc:317
+#: editor_actions.cc:331
 msgid "Active Marker to Mouse"
 msgstr "Činnou značku na polohu myši"
 
-#: editor_actions.cc:327
+#: editor_actions.cc:341
 msgid "Undo Selection Change"
 msgstr "Zpět změnu výběru"
 
-#: editor_actions.cc:328
+#: editor_actions.cc:342
 msgid "Redo Selection Change"
 msgstr "Znovu změnu výběru"
 
-#: editor_actions.cc:330
+#: editor_actions.cc:344
 msgid "Export Audio"
 msgstr "Vyvést zvuk"
 
-#: editor_actions.cc:331 export_dialog.cc:394
+#: editor_actions.cc:345 export_dialog.cc:424
 msgid "Export Range"
 msgstr "Vyvést rozsah"
 
-#: editor_actions.cc:336
+#: editor_actions.cc:350
 msgid "Separate Using Punch Range"
 msgstr "Rozdělit na hranicích rozsahu přepsání"
 
-#: editor_actions.cc:339
+#: editor_actions.cc:353
 msgid "Separate Using Loop Range"
 msgstr "Rozdělit na koncích smyček"
 
-#: editor_actions.cc:342 editor_actions.cc:364
+#: editor_actions.cc:356 editor_actions.cc:379
 msgid "Crop"
 msgstr "Oříznout"
 
-#: editor_actions.cc:352
+#: editor_actions.cc:366
 msgid "Fade Range Selection"
 msgstr "Prolínat výběr oblasti"
 
-#: editor_actions.cc:354
+#: editor_actions.cc:368
 msgid "Set Tempo from Edit Range = Bar"
 msgstr "Stanovit tempo z rozsah úprav = takt"
 
-#: editor_actions.cc:356
+#: editor_actions.cc:371
 msgid "Log"
 msgstr "Zápis"
 
-#: editor_actions.cc:359 editor_actions.cc:361
+#: editor_actions.cc:374 editor_actions.cc:376
 msgid "Move to Next Transient"
 msgstr "Přesunout k dalšímu přechodu"
 
-#: editor_actions.cc:360 editor_actions.cc:362
+#: editor_actions.cc:375 editor_actions.cc:377
 msgid "Move to Previous Transient"
 msgstr "Přesunout k předchozímu přechodu"
 
-#: editor_actions.cc:366 editor_actions.cc:375
+#: editor_actions.cc:381
+msgid "Start Range from Playhead"
+msgstr ""
+
+#: editor_actions.cc:382
+msgid "Finish Range from Playhead"
+msgstr ""
+
+#: editor_actions.cc:384 editor_actions.cc:393
 msgid "Start Range"
 msgstr "Začít rozsah"
 
-#: editor_actions.cc:367 editor_actions.cc:376
+#: editor_actions.cc:385 editor_actions.cc:394
 msgid "Finish Range"
 msgstr "Ukončit rozsah"
 
-#: editor_actions.cc:369
+#: editor_actions.cc:387
 msgid "Start Punch Range"
 msgstr "Začít rozsah přepsání"
 
-#: editor_actions.cc:370
+#: editor_actions.cc:388
 msgid "Finish Punch Range"
 msgstr "Ukončit rozsah přepsání"
 
-#: editor_actions.cc:372
+#: editor_actions.cc:390
 msgid "Start Loop Range"
 msgstr "Začít rozsah smyčky"
 
-#: editor_actions.cc:373
+#: editor_actions.cc:391
 msgid "Finish Loop Range"
 msgstr "Ukončit rozsah smyčky"
 
-#: editor_actions.cc:408
+#: editor_actions.cc:426
 msgid "Follow Playhead"
 msgstr "Následovat ukazatele polohy"
 
-#: editor_actions.cc:409
+#: editor_actions.cc:427
 msgid "Remove Last Capture"
 msgstr "Odstranit poslední nahrávku"
 
-#: editor_actions.cc:411
+#: editor_actions.cc:429
 msgid "Stationary Playhead"
 msgstr "Pevný ukazatel polohy"
 
-#: editor_actions.cc:413 insert_remove_time_dialog.cc:32
+#: editor_actions.cc:431 insert_remove_time_dialog.cc:32
 msgid "Insert Time"
 msgstr "Vložit ticho"
 
-#: editor_actions.cc:415 insert_remove_time_dialog.cc:32
+#: editor_actions.cc:433 insert_remove_time_dialog.cc:32
 msgid "Remove Time"
 msgstr "Odstranit čas"
 
-#: editor_actions.cc:420
+#: editor_actions.cc:438
 msgid "Toggle Active"
 msgstr "Zapnout/Vypnout stopu"
 
-#: editor_actions.cc:422 editor_actions.cc:1787 editor_markers.cc:921
-#: editor_markers.cc:986 editor_snapshots.cc:134 mixer_strip.cc:1623
-#: route_time_axis.cc:872
+#: editor_actions.cc:440 editor_actions.cc:1785 editor_markers.cc:926
+#: editor_markers.cc:999 editor_markers.cc:1019 editor_snapshots.cc:134
+#: lua_script_manager.cc:32 lua_script_manager.cc:36 mixer_strip.cc:1705
+#: route_time_axis.cc:870 vca_master_strip.cc:400
 msgid "Remove"
 msgstr "Odstranit"
 
-#: editor_actions.cc:427
+#: editor_actions.cc:445
 msgid "Fit Selection (Vertical)"
 msgstr "Přizpůsobit výběr (svisle)"
 
-#: editor_actions.cc:429 time_axis_view.cc:1380
+#: editor_actions.cc:447 time_axis_view.cc:1287
 msgid "Largest"
 msgstr "Největší"
 
-#: editor_actions.cc:432 time_axis_view.cc:1381
+#: editor_actions.cc:450 time_axis_view.cc:1288
 msgid "Larger"
 msgstr "Větší"
 
-#: editor_actions.cc:435 editor_rulers.cc:248 time_axis_view.cc:1382
+#: editor_actions.cc:453 editor_rulers.cc:248 time_axis_view.cc:1289
 msgid "Large"
 msgstr "Velká"
 
-#: editor_actions.cc:441 editor_rulers.cc:252 time_axis_view.cc:1384
+#: editor_actions.cc:459 editor_rulers.cc:252 time_axis_view.cc:1291
 msgid "Small"
 msgstr "Malá"
 
-#: editor_actions.cc:445
+#: editor_actions.cc:463
 msgid "Sound Selected MIDI Notes"
 msgstr "Zahrát vybrané noty MIDI"
 
-#: editor_actions.cc:450
+#: editor_actions.cc:468
 msgid "Zoom Focus Left"
 msgstr "Srovnat pohled na levý okraj"
 
-#: editor_actions.cc:451
+#: editor_actions.cc:469
 msgid "Zoom Focus Right"
 msgstr "Srovnat pohled na pravý okraj"
 
-#: editor_actions.cc:452
+#: editor_actions.cc:470
 msgid "Zoom Focus Center"
 msgstr "Srovnat pohled na střed"
 
-#: editor_actions.cc:453
+#: editor_actions.cc:471
 msgid "Zoom Focus Playhead"
 msgstr "Srovnat pohled na ukazatele polohy"
 
-#: editor_actions.cc:454
+#: editor_actions.cc:472
 msgid "Zoom Focus Mouse"
 msgstr "Srovnat pohled na myš"
 
-#: editor_actions.cc:455
+#: editor_actions.cc:473
 msgid "Zoom Focus Edit Point"
 msgstr "Srovnat pohled na bod úprav"
 
-#: editor_actions.cc:457
+#: editor_actions.cc:475
 msgid "Next Zoom Focus"
 msgstr "Další srovnání pohledu"
 
-#: editor_actions.cc:463
+#: editor_actions.cc:488
 msgid "Smart Object Mode"
 msgstr "Chytrý předmětový režim"
 
-#: editor_actions.cc:466
+#: editor_actions.cc:491
 msgid "Smart"
 msgstr "Chytrý"
 
-#: editor_actions.cc:469
+#: editor_actions.cc:494
 msgid "Object Tool"
 msgstr "Nástroj pro předměty"
 
-#: editor_actions.cc:474
+#: editor_actions.cc:499
 msgid "Range Tool"
 msgstr "Nástroj pro rozsahy"
 
-#: editor_actions.cc:479
+#: editor_actions.cc:504
 msgid "Note Drawing Tool"
 msgstr "Nástroj pro kreslení not"
 
-#: editor_actions.cc:484
+#: editor_actions.cc:509
 msgid "Audition Tool"
 msgstr "Nástroj pro poslech"
 
-#: editor_actions.cc:489
+#: editor_actions.cc:514
 msgid "Time FX Tool"
 msgstr "Nástroj pro časové účinky"
 
-#: editor_actions.cc:494
+#: editor_actions.cc:519
 msgid "Content Tool"
 msgstr "Nástroj pro obsah"
 
-#: editor_actions.cc:500
+#: editor_actions.cc:525
 msgid "Cut Tool"
 msgstr "Nástroj pro vyjímání"
 
-#: editor_actions.cc:506
+#: editor_actions.cc:531
 msgid "Step Mouse Mode"
 msgstr "Udělat krok v režimu myši"
 
-#: editor_actions.cc:513
+#: editor_actions.cc:538
 msgid "Change Edit Point"
 msgstr "Změnit pracovní bod"
 
-#: editor_actions.cc:514
+#: editor_actions.cc:539
 msgid "Change Edit Point Including Marker"
 msgstr "Stanovit pracovní bod (včetně značky polohy)"
 
-#: editor_actions.cc:519
+#: editor_actions.cc:544
 msgid "EditMode|Lock"
 msgstr "Zamknout"
 
-#: editor_actions.cc:520
+#: editor_actions.cc:545
 msgid "Cycle Edit Mode"
 msgstr "Přepínat režim úprav"
 
-#: editor_actions.cc:522
+#: editor_actions.cc:547
 msgid "Snap to"
 msgstr "Zapadnout"
 
-#: editor_actions.cc:523
+#: editor_actions.cc:548
 msgid "Snap Mode"
 msgstr "Režim zapadnutí"
 
-#: editor_actions.cc:530
+#: editor_actions.cc:555
 msgid "Next Snap Mode"
 msgstr "Režim dalšího zapadnutí"
 
-#: editor_actions.cc:531
+#: editor_actions.cc:556
 msgid "Next Snap Choice"
 msgstr "Výběr dalšího zapadnutí"
 
-#: editor_actions.cc:532
+#: editor_actions.cc:557
 msgid "Next Musical Snap Choice"
 msgstr "Výběr dalšího hudebního zapadnutí"
 
-#: editor_actions.cc:533
+#: editor_actions.cc:558
 msgid "Previous Snap Choice"
 msgstr "Výběr předchozího zapadnutí"
 
-#: editor_actions.cc:534
+#: editor_actions.cc:559
 msgid "Previous Musical Snap Choice"
 msgstr "Výběr předchozího hudebního zapadnutí"
 
-#: editor_actions.cc:539
+#: editor_actions.cc:564
 msgid "Snap to CD Frame"
 msgstr "Zapadnout do snímku CD"
 
-#: editor_actions.cc:540
+#: editor_actions.cc:565
 msgid "Snap to Timecode Frame"
 msgstr "Zapadnout do snímku časového kódu"
 
-#: editor_actions.cc:541
+#: editor_actions.cc:566
 msgid "Snap to Timecode Seconds"
 msgstr "Zapadnout do sekund časového kódu"
 
-#: editor_actions.cc:542
+#: editor_actions.cc:567
 msgid "Snap to Timecode Minutes"
 msgstr "Zapadnout do minut časového kódu"
 
-#: editor_actions.cc:543
+#: editor_actions.cc:568
 msgid "Snap to Seconds"
 msgstr "Zapadnout do sekund"
 
-#: editor_actions.cc:544
+#: editor_actions.cc:569
 msgid "Snap to Minutes"
 msgstr "Zapadnout do minut"
 
-#: editor_actions.cc:546
+#: editor_actions.cc:571
 msgid "Snap to One Twenty Eighths"
 msgstr "Zapadnout do stoosmadvacetin"
 
-#: editor_actions.cc:547
+#: editor_actions.cc:572
 msgid "Snap to Sixty Fourths"
 msgstr "Zapadnout do čtyřiašedesátin"
 
-#: editor_actions.cc:548
+#: editor_actions.cc:573
 msgid "Snap to Thirty Seconds"
 msgstr "Zapadnout do třiceti sekund"
 
-#: editor_actions.cc:549
+#: editor_actions.cc:574
 msgid "Snap to Twenty Eighths"
 msgstr "Zapadnout do osmadvacetin"
 
-#: editor_actions.cc:550
+#: editor_actions.cc:575
 msgid "Snap to Twenty Fourths"
 msgstr "Zapadnout do čtyřiadvacetin"
 
-#: editor_actions.cc:551
+#: editor_actions.cc:576
 msgid "Snap to Twentieths"
 msgstr "Zapadnout do dvacetin"
 
-#: editor_actions.cc:552
+#: editor_actions.cc:577
 msgid "Snap to Sixteenths"
 msgstr "Zapadnout do šestnáctin"
 
-#: editor_actions.cc:553
+#: editor_actions.cc:578
 msgid "Snap to Fourteenths"
 msgstr "Zapadnout do čtrnáctin"
 
-#: editor_actions.cc:554
+#: editor_actions.cc:579
 msgid "Snap to Twelfths"
 msgstr "Zapadnout do dvanáctin"
 
-#: editor_actions.cc:555
+#: editor_actions.cc:580
 msgid "Snap to Tenths"
 msgstr "Zapadnout do desetin"
 
-#: editor_actions.cc:556
+#: editor_actions.cc:581
 msgid "Snap to Eighths"
 msgstr "Zapadnout do osmin"
 
-#: editor_actions.cc:557
+#: editor_actions.cc:582
 msgid "Snap to Sevenths"
 msgstr "Zapadnout do sedmin"
 
-#: editor_actions.cc:558
+#: editor_actions.cc:583
 msgid "Snap to Sixths"
 msgstr "Zapadnout do Å¡estin"
 
-#: editor_actions.cc:559
+#: editor_actions.cc:584
 msgid "Snap to Fifths"
 msgstr "Zapadnout do pětin"
 
-#: editor_actions.cc:560
+#: editor_actions.cc:585
 msgid "Snap to Quarters"
 msgstr "Zapadnout do čtvrtin"
 
-#: editor_actions.cc:561
+#: editor_actions.cc:586
 msgid "Snap to Thirds"
 msgstr "Zapadnout do třetin"
 
-#: editor_actions.cc:562
+#: editor_actions.cc:587
 msgid "Snap to Halves"
 msgstr "Zapadnout do polovin"
 
-#: editor_actions.cc:564
+#: editor_actions.cc:589
 msgid "Snap to Beat"
 msgstr "Zapadnout do doby"
 
-#: editor_actions.cc:565
+#: editor_actions.cc:590
 msgid "Snap to Bar"
 msgstr "Zapadnout do taktu"
 
-#: editor_actions.cc:566
+#: editor_actions.cc:591
 msgid "Snap to Mark"
 msgstr "Zapadnout do značky"
 
-#: editor_actions.cc:567
+#: editor_actions.cc:592
 msgid "Snap to Region Start"
 msgstr "Zapadnout do začátku oblasti"
 
-#: editor_actions.cc:568
+#: editor_actions.cc:593
 msgid "Snap to Region End"
 msgstr "Zapadnout do konce oblasti"
 
-#: editor_actions.cc:569
+#: editor_actions.cc:594
 msgid "Snap to Region Sync"
 msgstr "Zapadnout do bodu zapadnutí oblasti"
 
-#: editor_actions.cc:570
+#: editor_actions.cc:595
 msgid "Snap to Region Boundary"
 msgstr "Zapadnout do hranice oblasti"
 
-#: editor_actions.cc:572
+#: editor_actions.cc:597
 msgid "Show Marker Lines"
 msgstr "Ukázat čáry značek"
 
-#: editor_actions.cc:582
+#: editor_actions.cc:607
 msgid "Loop/Punch"
 msgstr "Oblasti smyčky/přepsání"
 
-#: editor_actions.cc:586
+#: editor_actions.cc:611
 msgid "Min:Sec"
 msgstr "Min:Sek"
 
-#: editor_actions.cc:588 editor_actions.cc:591 editor_rulers.cc:270
+#: editor_actions.cc:613 editor_actions.cc:616 editor_rulers.cc:270
+#: rc_option_editor.cc:1592
 msgid "Video Monitor"
 msgstr "Sledování obrazového záznamu"
 
-#: editor_actions.cc:590 rc_option_editor.cc:2720
+#: editor_actions.cc:615 rc_option_editor.cc:2844
 msgid "Video"
 msgstr "Obraz"
 
-#: editor_actions.cc:593
+#: editor_actions.cc:618
 msgid "Always on Top"
 msgstr "Vždy nahoře"
 
-#: editor_actions.cc:595
+#: editor_actions.cc:620
 msgid "Frame number"
 msgstr "Číslo snímku"
 
-#: editor_actions.cc:596
+#: editor_actions.cc:621
 msgid "Timecode Background"
 msgstr "Pozadí časového kódu"
 
-#: editor_actions.cc:597
+#: editor_actions.cc:622
 msgid "Fullscreen"
 msgstr "Celá obrazovka"
 
-#: editor_actions.cc:598
+#: editor_actions.cc:623
 msgid "Letterbox"
 msgstr "Širokoúhlý formát"
 
-#: editor_actions.cc:599
+#: editor_actions.cc:624
 msgid "Original Size"
 msgstr "Původní velikost"
 
-#: editor_actions.cc:656
+#: editor_actions.cc:681
 msgid "Sort"
 msgstr "Třídit"
 
-#: editor_actions.cc:667 editor_routes.cc:485 mixer_ui.cc:1258
+#: editor_actions.cc:692 editor_routes.cc:549 mixer_ui.cc:1497
 msgid "Show All"
 msgstr "Ukázat vše"
 
-#: editor_actions.cc:668
+#: editor_actions.cc:693
 msgid "Show Automatic Regions"
 msgstr "Ukázat automatické oblasti"
 
-#: editor_actions.cc:670
+#: editor_actions.cc:695
 msgid "Ascending"
 msgstr "Vzestupný"
 
-#: editor_actions.cc:672
+#: editor_actions.cc:697
 msgid "Descending"
 msgstr "Sestupný"
 
-#: editor_actions.cc:675
+#: editor_actions.cc:700
 msgid "By Region Name"
 msgstr "Podle názvu oblasti"
 
-#: editor_actions.cc:677
+#: editor_actions.cc:702
 msgid "By Region Length"
 msgstr "Podle délky oblasti"
 
-#: editor_actions.cc:679
+#: editor_actions.cc:704
 msgid "By Region Position"
 msgstr "Podle polohy oblasti"
 
-#: editor_actions.cc:681
+#: editor_actions.cc:706
 msgid "By Region Timestamp"
 msgstr "Podle časové razítka oblasti"
 
-#: editor_actions.cc:683
+#: editor_actions.cc:708
 msgid "By Region Start in File"
 msgstr "Podle začátku oblasti v souboru"
 
-#: editor_actions.cc:685
+#: editor_actions.cc:710
 msgid "By Region End in File"
 msgstr "Podle konce oblasti v souboru"
 
-#: editor_actions.cc:687
+#: editor_actions.cc:712
 msgid "By Source File Name"
 msgstr "Podle názvu zdrojového souboru"
 
-#: editor_actions.cc:689
+#: editor_actions.cc:714
 msgid "By Source File Length"
 msgstr "Podle délky zdrojového souboru"
 
-#: editor_actions.cc:691
+#: editor_actions.cc:716
 msgid "By Source File Creation Date"
 msgstr "Podle data vytvoření zdrojového souboru"
 
-#: editor_actions.cc:693
+#: editor_actions.cc:718
 msgid "By Source Filesystem"
 msgstr "Podle souborového systému zdroje"
 
-#: editor_actions.cc:696
+#: editor_actions.cc:721
 msgid "Remove Unused"
 msgstr "Odstranit nepoužívané"
 
-#: editor_actions.cc:698
+#: editor_actions.cc:723
 msgid "Import PT session"
 msgstr "Zavést sezení PT"
 
-#: editor_actions.cc:703 editor_audio_import.cc:282 editor_pt_import.cc:148
-#: session_import_dialog.cc:75 session_import_dialog.cc:95
-#: session_metadata_dialog.cc:418 sfdb_ui.cc:558 editor_videotimeline.cc:91
+#: editor_actions.cc:728 editor_audio_import.cc:282 editor_pt_import.cc:149
+#: luawindow.cc:99 session_import_dialog.cc:75 session_import_dialog.cc:95
+#: session_metadata_dialog.cc:421 sfdb_ui.cc:558 editor_videotimeline.cc:91
 msgid "Import"
 msgstr "Zavést"
 
-#: editor_actions.cc:706
+#: editor_actions.cc:731
 msgid "Import to Region List..."
 msgstr "Zavést do seznamu oblastí..."
 
-#: editor_actions.cc:709 session_import_dialog.cc:44
+#: editor_actions.cc:734 session_import_dialog.cc:44
 #: session_import_dialog.cc:65
 msgid "Import from Session"
 msgstr "Zavést ze sezení"
 
-#: editor_actions.cc:713
+#: editor_actions.cc:738
 msgid "Bring all media into session folder"
 msgstr "Všechen materiál zkopírovat do složky se sezením"
 
-#: editor_actions.cc:716
+#: editor_actions.cc:741
 msgid "Show Summary"
 msgstr "Ukázat shrnutí"
 
-#: editor_actions.cc:718
+#: editor_actions.cc:743
 msgid "Show Group Tabs"
 msgstr "Ukázat karty se skupinami"
 
-#: editor_actions.cc:720
+#: editor_actions.cc:745
 msgid "Show Measure Lines"
 msgstr "Ukázat taktové čáry"
 
-#: editor_actions.cc:724
-msgid "Show Logo"
-msgstr "Ukázat logo"
-
-#: editor_actions.cc:728
+#: editor_actions.cc:747
 msgid "Toggle MIDI Input Active for Editor-Selected Tracks/Busses"
 msgstr "Přepnout vstup MIDI pro v editoru vybrané stopy/sběrnice"
 
-#: editor_actions.cc:751
-msgid "Loaded editor bindings from %1"
-msgstr "Nahrané vazby editoru z %1"
-
-#: editor_actions.cc:753
-msgid "Could not find editor.bindings in search path %1"
-msgstr "V prohledávané cestě %1 se editor.bindings nalézt nepodařilo"
-
-#: editor_actions.cc:1097 editor_actions.cc:1493 editor_actions.cc:1504
-#: editor_actions.cc:1557 editor_actions.cc:1568 editor_actions.cc:1615
-#: editor_actions.cc:1625 editor_regions.cc:1575
+#: editor_actions.cc:1081 editor_actions.cc:1477 editor_actions.cc:1488
+#: editor_actions.cc:1541 editor_actions.cc:1552 editor_actions.cc:1599
+#: editor_actions.cc:1609 editor_regions.cc:1657 luainstance.cc:327
+#: luainstance.cc:1690
 msgid "programming error: %1: %2"
 msgstr "Chyba v programování: %1: %2"
 
-#: editor_actions.cc:1793
+#: editor_actions.cc:1791
 msgid "Raise"
 msgstr "Pozvednout"
 
-#: editor_actions.cc:1796
+#: editor_actions.cc:1794
 msgid "Raise to Top"
 msgstr "Pozvednout zcela nahoru"
 
-#: editor_actions.cc:1799
+#: editor_actions.cc:1797
 msgid "Lower"
 msgstr "Dát dolů"
 
-#: editor_actions.cc:1802
+#: editor_actions.cc:1800
 msgid "Lower to Bottom"
 msgstr "Dát zcela dolů"
 
-#: editor_actions.cc:1805
+#: editor_actions.cc:1803
 msgid "Move to Original Position"
 msgstr "Posunout na původní polohu"
 
-#: editor_actions.cc:1810
+#: editor_actions.cc:1808
 msgid "Lock to Video"
 msgstr "Uzamknout k obrazovému záznamu"
 
-#: editor_actions.cc:1815 editor_markers.cc:912
+#: editor_actions.cc:1813 editor_markers.cc:917
 msgid "Glue to Bars and Beats"
 msgstr "Přilepit k taktům a dobám"
 
-#: editor_actions.cc:1820
+#: editor_actions.cc:1818
 msgid "Remove Sync"
 msgstr "Odstranit bod zapadnutí"
 
-#: editor_actions.cc:1823 mixer_strip.cc:2102 monitor_section.cc:250
-#: monitor_section.cc:318 route_time_axis.cc:256 route_time_axis.cc:538
+#: editor_actions.cc:1821 mixer_strip.cc:2192 monitor_section.cc:253
+#: monitor_section.cc:321 route_time_axis.cc:264 route_time_axis.cc:550
 msgid "Mute"
 msgstr "Ztlumit"
 
-#: editor_actions.cc:1826
+#: editor_actions.cc:1824
 msgid "Normalize..."
 msgstr "Normalizovat..."
 
-#: editor_actions.cc:1829
+#: editor_actions.cc:1827
 msgid "Reverse"
 msgstr "Obrátit"
 
-#: editor_actions.cc:1832
+#: editor_actions.cc:1830
 msgid "Make Mono Regions"
 msgstr "Přeměnit na monofonní oblasti"
 
-#: editor_actions.cc:1835
+#: editor_actions.cc:1833
 msgid "Boost Gain"
 msgstr "Zvýšit sílu hlasitosti"
 
-#: editor_actions.cc:1838
+#: editor_actions.cc:1836
 msgid "Cut Gain"
 msgstr "Snížit sílu hlasitosti"
 
-#: editor_actions.cc:1841
+#: editor_actions.cc:1839
 msgid "Pitch Shift..."
 msgstr "Posun výšky tónu..."
 
-#: editor_actions.cc:1847
+#: editor_actions.cc:1845
 msgid "Opaque"
 msgstr "Neprůhledný"
 
-#: editor_actions.cc:1851 editor_regions.cc:120
+#: editor_actions.cc:1849 editor_regions.cc:164
 msgid "Fade In"
 msgstr "Postupné zesílení signálu"
 
-#: editor_actions.cc:1856 editor_regions.cc:121
+#: editor_actions.cc:1854 editor_regions.cc:165
 msgid "Fade Out"
 msgstr "Postupné zeslabení signálu"
 
-#: editor_actions.cc:1871
+#: editor_actions.cc:1869
 msgid "Multi-Duplicate..."
 msgstr "Vícekrát zdvojit..."
 
-#: editor_actions.cc:1876
+#: editor_actions.cc:1874
 msgid "Fill Track"
 msgstr "Doplnit stopu"
 
-#: editor_actions.cc:1880 editor_markers.cc:1000
+#: editor_actions.cc:1878 editor_markers.cc:1033
 msgid "Set Loop Range"
 msgstr "Zřídit oblast smyčky"
 
-#: editor_actions.cc:1887
+#: editor_actions.cc:1885
 msgid "Set Punch"
 msgstr "Zřídit oblast přepsání"
 
-#: editor_actions.cc:1891
+#: editor_actions.cc:1889
 msgid "Add Single Range Marker"
 msgstr "Přidat značku jednoho rozsahu"
 
-#: editor_actions.cc:1896
+#: editor_actions.cc:1894
 msgid "Add Range Marker Per Region"
 msgstr "Vložit značku rozsahu na oblast"
 
-#: editor_actions.cc:1900
+#: editor_actions.cc:1898
 msgid "Snap Position to Grid"
 msgstr "Zapadnout ukazatele polohy do mřížky"
 
-#: editor_actions.cc:1903
+#: editor_actions.cc:1901
 msgid "Close Gaps"
 msgstr "Zavřít mezery"
 
-#: editor_actions.cc:1906
+#: editor_actions.cc:1904
 msgid "Rhythm Ferret..."
 msgstr "Rytmická páska..."
 
-#: editor_actions.cc:1909
+#: editor_actions.cc:1907
 msgid "Export..."
 msgstr "Vyvést..."
 
-#: editor_actions.cc:1915
+#: editor_actions.cc:1913
 msgid "Separate Under"
 msgstr "Rozdělit pod"
 
-#: editor_actions.cc:1919 editor_actions.cc:1920
+#: editor_actions.cc:1917 editor_actions.cc:1918
 msgid "Set Fade In Length"
 msgstr "Změnit délku postupného zesílení signálu"
 
-#: editor_actions.cc:1921 editor_actions.cc:1922
+#: editor_actions.cc:1919 editor_actions.cc:1920
 msgid "Set Fade Out Length"
 msgstr "Změnit délku postupného zeslabení signálu"
 
-#: editor_actions.cc:1924
+#: editor_actions.cc:1922
 msgid "Set Tempo from Region = Bar"
 msgstr "Stanovit tempo z \"oblast = takt\""
 
-#: editor_actions.cc:1929
+#: editor_actions.cc:1927
 msgid "Split at Percussion Onsets"
 msgstr "Rozdělit oblasti na začátcích úderů bicích"
 
-#: editor_actions.cc:1934
+#: editor_actions.cc:1932
 msgid "List Editor..."
 msgstr "Editor seznamu..."
 
-#: editor_actions.cc:1937
+#: editor_actions.cc:1935
 msgid "Properties..."
 msgstr "Vlastnosti..."
 
-#: editor_actions.cc:1941
+#: editor_actions.cc:1939
 msgid "Bounce (with processing)"
 msgstr "Vrazit (se zpracováním)"
 
-#: editor_actions.cc:1942
+#: editor_actions.cc:1940
 msgid "Bounce (without processing)"
 msgstr "Vrazit (bez zpracování)"
 
-#: editor_actions.cc:1943
+#: editor_actions.cc:1941
 msgid "Combine"
 msgstr "Spojit"
 
-#: editor_actions.cc:1944
+#: editor_actions.cc:1942
 msgid "Uncombine"
 msgstr "Zrušit spojení"
 
-#: editor_actions.cc:1946
+#: editor_actions.cc:1944
+msgid "Loudness Analysis..."
+msgstr ""
+
+#: editor_actions.cc:1945
 msgid "Spectral Analysis..."
 msgstr "Spektrální analýza..."
 
-#: editor_actions.cc:1948
+#: editor_actions.cc:1947
 msgid "Reset Envelope"
 msgstr "Nastavit křivku síly zvuku znovu"
 
-#: editor_actions.cc:1950
+#: editor_actions.cc:1949
 msgid "Reset Gain"
 msgstr "Nastavit sílu hlasitosti znovu"
 
-#: editor_actions.cc:1955
+#: editor_actions.cc:1954
 msgid "Envelope Active"
 msgstr "Činná křivka síly zvuku"
 
-#: editor_actions.cc:1963 editor_actions.cc:1964
+#: editor_actions.cc:1962 editor_actions.cc:1963
 msgid "Insert Patch Change..."
 msgstr "Vložit změnu zapojení..."
 
-#: editor_actions.cc:1965
+#: editor_actions.cc:1964
 msgid "Unlink from other copies"
 msgstr "Odpojit od jiných kopií"
 
-#: editor_actions.cc:1966
+#: editor_actions.cc:1965
 msgid "Strip Silence..."
 msgstr "Odstranit ticho..."
 
-#: editor_actions.cc:1967
+#: editor_actions.cc:1966
 msgid "Set Range Selection"
 msgstr "Vybrat rozsah oblasti"
 
-#: editor_actions.cc:1969 editor_actions.cc:1970
+#: editor_actions.cc:1968 editor_actions.cc:1969
 msgid "Nudge Later"
 msgstr "Postrčit o krok později"
 
-#: editor_actions.cc:1971 editor_actions.cc:1972
+#: editor_actions.cc:1970 editor_actions.cc:1971
 msgid "Nudge Earlier"
 msgstr "Postrčit o krok dříve"
 
-#: editor_actions.cc:1974
+#: editor_actions.cc:1973
 msgid "Sequence Regions"
 msgstr "Řadit oblasti vedle sebe"
 
-#: editor_actions.cc:1979
+#: editor_actions.cc:1978
 msgid "Nudge Later by Capture Offset"
 msgstr "Postrčit o krok později podle odsazení nahrávání"
 
-#: editor_actions.cc:1986
+#: editor_actions.cc:1985
 msgid "Nudge Earlier by Capture Offset"
 msgstr "Postrčit o krok dříve podle odsazení nahrávání"
 
-#: editor_actions.cc:1990
+#: editor_actions.cc:1989
 msgid "Trim to Loop"
 msgstr "Zkrátit na oblast smyčky"
 
-#: editor_actions.cc:1991
+#: editor_actions.cc:1990
 msgid "Trim to Punch"
 msgstr "Zkrátit na oblast přepsání"
 
-#: editor_actions.cc:1993
+#: editor_actions.cc:1992
 msgid "Trim to Previous"
 msgstr "Zkrátit na předchozí"
 
-#: editor_actions.cc:1994
+#: editor_actions.cc:1993
 msgid "Trim to Next"
 msgstr "Zkrátit na další"
 
-#: editor_actions.cc:2001
+#: editor_actions.cc:2000
 msgid "Insert Region from Region List"
 msgstr "Vložit oblast ze seznamu oblastí"
 
-#: editor_actions.cc:2007
+#: editor_actions.cc:2006
 msgid "Set Sync Position"
 msgstr "Nastavit polohu bodu zapadnutí oblasti"
 
-#: editor_actions.cc:2008
+#: editor_actions.cc:2007
 msgid "Place Transient"
 msgstr "Umístit přechod"
 
-#: editor_actions.cc:2009
+#: editor_actions.cc:2008
 msgid "Split/Separate"
 msgstr "Rozdělit/Oddělit"
 
-#: editor_actions.cc:2010
+#: editor_actions.cc:2009
 msgid "Trim Start at Edit Point"
 msgstr "Zastřihnout začátek oblasti na pracovním bodu"
 
-#: editor_actions.cc:2011
+#: editor_actions.cc:2010
 msgid "Trim End at Edit Point"
 msgstr "Zastřihnout konec oblasti na pracovním bodu"
 
-#: editor_actions.cc:2016
+#: editor_actions.cc:2015
 msgid "Align Start"
 msgstr "Zarovnat začátek"
 
-#: editor_actions.cc:2023
+#: editor_actions.cc:2022
 msgid "Align Start Relative"
 msgstr "Zarovnat začátek poměrně"
 
-#: editor_actions.cc:2027
+#: editor_actions.cc:2026
 msgid "Align End"
 msgstr "Zarovnat konec"
 
-#: editor_actions.cc:2032
+#: editor_actions.cc:2031
 msgid "Align End Relative"
 msgstr "Zarovnat konec poměrně"
 
-#: editor_actions.cc:2039
+#: editor_actions.cc:2038
 msgid "Align Sync"
 msgstr "Zarovnat bod zapadnutí"
 
-#: editor_actions.cc:2046
+#: editor_actions.cc:2045
 msgid "Align Sync Relative"
 msgstr "Zarovnat bod zapadnutí poměrně"
 
-#: editor_actions.cc:2050 editor_actions.cc:2053
+#: editor_actions.cc:2049 editor_actions.cc:2050
 msgid "Choose Top..."
 msgstr "Vybrat vrchní..."
 
@@ -4960,33 +5229,33 @@ msgstr ""
 "Projekt již obsahuje zdrojový soubor nazvaný %1. Chcete zavést %2 jako nový "
 "soubor nebo jej přeskočit?"
 
-#: editor_audio_import.cc:282 editor_pt_import.cc:148
+#: editor_audio_import.cc:282 editor_pt_import.cc:149
 #: editor_videotimeline.cc:91
 msgid "Cancel Import"
 msgstr "Zrušit zavedení"
 
-#: editor_audio_import.cc:562
+#: editor_audio_import.cc:565
 msgid "Editor: cannot open file \"%1\", (%2)"
 msgstr "Editor: Soubor \"%1\" nelze otevřít (%2)"
 
-#: editor_audio_import.cc:570
+#: editor_audio_import.cc:573
 msgid "Cancel entire import"
 msgstr "Zrušit celé zavedení"
 
-#: editor_audio_import.cc:571
+#: editor_audio_import.cc:574
 msgid "Don't embed it"
 msgstr "Toto nevložit"
 
-#: editor_audio_import.cc:572
+#: editor_audio_import.cc:575
 msgid "Embed all without questions"
 msgstr "Vložit vše bez ptaní"
 
-#: editor_audio_import.cc:575 editor_audio_import.cc:601
-#: export_format_dialog.cc:60
+#: editor_audio_import.cc:578 editor_audio_import.cc:604
+#: export_format_dialog.cc:68
 msgid "Sample rate"
 msgstr "Vzorkovací kmitočet"
 
-#: editor_audio_import.cc:576 editor_audio_import.cc:602
+#: editor_audio_import.cc:579 editor_audio_import.cc:605
 msgid ""
 "%1\n"
 "This audiofile's sample rate doesn't match the session sample rate!"
@@ -4995,7 +5264,7 @@ msgstr ""
 "Vzorkovací kmitočet tohoto souboru se neshoduje se vzorkovacím kmitočtem "
 "sezení!"
 
-#: editor_audio_import.cc:598
+#: editor_audio_import.cc:601
 msgid "Embed it anyway"
 msgstr "Přesto vložit"
 
@@ -5011,11 +5280,11 @@ msgstr "Zavést sezení PT"
 msgid "%1: this is only the directory/folder name, not the filename.\n"
 msgstr "%1: Toto je jen název adresáře/složky, ne název souboru.\n"
 
-#: editor_pt_import.cc:131
+#: editor_pt_import.cc:132
 msgid "Doesn't seem to be a valid PT session file"
 msgstr "Zdá se, že toto není platný soubor se sezením PT"
 
-#: editor_pt_import.cc:135
+#: editor_pt_import.cc:136
 msgid ""
 "PT v%1 Session @ %2Hz\n"
 "\n"
@@ -5033,29 +5302,43 @@ msgstr ""
 "\n"
 "Pokračovat..."
 
-#: editor_canvas_events.cc:1308 editor_drag.cc:1418
+#: editor_pt_import.cc:175
+msgid ""
+"Failed to load one or more of the audio files, but continuing to attempt "
+"import."
+msgstr ""
+
+#: editor_pt_import.cc:178
+msgid "Success! Import should complete soon."
+msgstr ""
+
+#: editor_pt_import.cc:263
+msgid "PTImport: UINT_MAX routes? impossible!"
+msgstr ""
+
+#: editor_canvas_events.cc:1296 editor_drag.cc:1418
 msgid "Could not create new track after region placed in the drop zone"
 msgstr ""
 "Nepodařilo se vytvořit žádnou novou stopu, poté co byla oblast umístěna v "
 "oblasti pro upuštění"
 
-#: editor_drag.cc:1310
+#: editor_drag.cc:1306
 msgid "fixed time region drag"
 msgstr "Posunout oblast ve stejném čase"
 
-#: editor_drag.cc:2245
+#: editor_drag.cc:2249
 msgid "Ripple drag"
 msgstr "Režim vlnění při tažení"
 
-#: editor_drag.cc:2307
+#: editor_drag.cc:2311
 msgid "create region"
 msgstr "Vytvořit oblast"
 
-#: editor_drag.cc:2426 midi_region_view.cc:2834
+#: editor_drag.cc:2430 midi_region_view.cc:2859
 msgid "resize notes"
 msgstr "Změnit velikost not"
 
-#: editor_drag.cc:2609 editor_drag.cc:2644
+#: editor_drag.cc:2613 editor_drag.cc:2648
 msgid ""
 "One or more Audio Regions\n"
 "are both Locked and\n"
@@ -5067,79 +5350,87 @@ msgstr ""
 "k obrazovému záznamu.\n"
 "Obrazový záznam nelze přesunout."
 
-#: editor_drag.cc:2679
+#: editor_drag.cc:2683
 msgid "Video Start:"
 msgstr "Začátek obrazového záznamu:"
 
-#: editor_drag.cc:2681
+#: editor_drag.cc:2685
 msgid "Diff:"
 msgstr "Rozdíly:"
 
-#: editor_drag.cc:2703
+#: editor_drag.cc:2707
 msgid "Move Video"
 msgstr "Posunout obrazový záznam"
 
-#: editor_drag.cc:3212
+#: editor_drag.cc:3177
+msgid "move meter mark"
+msgstr "Pohnout značkou druhu taktu"
+
+#: editor_drag.cc:3179
 msgid "copy meter mark"
 msgstr "Kopírovat značku druhu taktu"
 
-#: editor_drag.cc:3220
-msgid "move meter mark"
-msgstr "Pohnout značkou druhu taktu"
+#: editor_drag.cc:3279
+msgid "inactive"
+msgstr ""
 
-#: editor_drag.cc:3308
+#: editor_drag.cc:3324
 msgid "move tempo mark"
 msgstr "Posunout značku tempa"
 
-#: editor_drag.cc:3345
+#: editor_drag.cc:3331
 msgid "copy tempo mark"
 msgstr "Kopírovat značku tempa"
 
-#: editor_drag.cc:3609
+#: editor_drag.cc:3462
+msgid "dilate tempo"
+msgstr ""
+
+#: editor_drag.cc:3736
 msgid "change fade in length"
 msgstr "Změnit délku postupného zesílení signálu"
 
-#: editor_drag.cc:3734
+#: editor_drag.cc:3861
 msgid "change fade out length"
 msgstr "Změnit délku postupného slábnutí signálu"
 
-#: editor_drag.cc:4110
+#: editor_drag.cc:4239
 msgid "move marker"
 msgstr "Pohnout značkou"
 
-#: editor_drag.cc:4373 editor_drag.cc:5694
+#: editor_drag.cc:4506 editor_drag.cc:5833
 msgid "automation range move"
 msgstr "Pohybovat rozsahem automatizace"
 
-#: editor_drag.cc:4747
+#: editor_drag.cc:4890
 msgid "An error occurred while executing time stretch operation"
 msgstr "Při provádění operace protáhnutí času se vyskytla chyba"
 
-#: editor_drag.cc:5208
+#: editor_drag.cc:5351
 msgid "programming_error: %1"
 msgstr "Chyba v programování: %1"
 
-#: editor_drag.cc:5277 editor_drag.cc:5287
+#: editor_drag.cc:5420 editor_drag.cc:5430
 msgid "new skip marker"
 msgstr "Nová značka skoku"
 
-#: editor_drag.cc:5278
+#: editor_drag.cc:5421
 msgid "skip"
 msgstr "Přeskočit"
 
-#: editor_drag.cc:5282 location_ui.cc:58
+#: editor_drag.cc:5425 location_ui.cc:60
 msgid "CD"
 msgstr "CD"
 
-#: editor_drag.cc:5283
+#: editor_drag.cc:5426
 msgid "new CD marker"
 msgstr "Nová značka na CD"
 
-#: editor_drag.cc:5288 editor_route_groups.cc:438 mixer_ui.cc:1593
+#: editor_drag.cc:5431 editor_route_groups.cc:439 mixer_ui.cc:1840
 msgid "unnamed"
 msgstr "Bez názvu"
 
-#: editor_drag.cc:5601
+#: editor_drag.cc:5740
 msgid "Automation range drag created for invalid region type"
 msgstr "Tažení rozsahem automatizace vytvořeno pro neplatný typ oblasti"
 
@@ -5155,7 +5446,7 @@ msgstr "Barva karty skupiny"
 msgid "Name of Group"
 msgstr "Název skupiny"
 
-#: editor_route_groups.cc:99 editor_routes.cc:209
+#: editor_route_groups.cc:99 editor_routes.cc:234
 msgid "Visible|V"
 msgstr "V"
 
@@ -5187,9 +5478,9 @@ msgstr "Pom"
 msgid "Relative Gain Changes?"
 msgstr "Změny poměrného zesílení?"
 
-#: editor_route_groups.cc:103 editor_regions.cc:124 editor_routes.cc:213
-#: mixer_strip.cc:2131 meter_strip.cc:367 route_time_axis.cc:2750
-#: time_axis_view.cc:1199
+#: editor_route_groups.cc:103 editor_regions.cc:168 editor_routes.cc:239
+#: mixer_strip.cc:2221 meter_strip.cc:365 route_time_axis.cc:2742
+#: time_axis_view.cc:1106
 msgid "Mute|M"
 msgstr "Z"
 
@@ -5197,8 +5488,9 @@ msgstr "Z"
 msgid "Sharing Mute?"
 msgstr "Sdílení ztlumení?"
 
-#: editor_route_groups.cc:104 editor_routes.cc:214 mixer_strip.cc:2144
-#: meter_strip.cc:375 route_time_axis.cc:2747
+#: editor_route_groups.cc:104 editor_routes.cc:240 mixer_strip.cc:2234
+#: meter_strip.cc:373 route_time_axis.cc:2739 vca_master_strip.cc:211
+#: vca_time_axis.cc:236
 msgid "Solo|S"
 msgstr "S"
 
@@ -5206,8 +5498,8 @@ msgstr "S"
 msgid "Sharing Solo?"
 msgstr "Sdílení sóla?"
 
-#: editor_route_groups.cc:105 midi_time_axis.cc:1630 midi_time_axis.cc:1633
-#: midi_time_axis.cc:1636
+#: editor_route_groups.cc:105 midi_time_axis.cc:1626 midi_time_axis.cc:1629
+#: midi_time_axis.cc:1632
 msgid "Rec"
 msgstr "Nahr"
 
@@ -5231,7 +5523,7 @@ msgstr "Výb"
 msgid "Sharing Selected/Editing Status?"
 msgstr "Sdílení stavu vybráno/úpravy?"
 
-#: editor_route_groups.cc:108 editor_routes.cc:210
+#: editor_route_groups.cc:108 editor_routes.cc:235
 msgid "Active|A"
 msgstr "Č"
 
@@ -5239,13 +5531,13 @@ msgstr "Č"
 msgid "Sharing Active Status?"
 msgstr "Sdílení činného stavu?"
 
-#: editor_export_audio.cc:93 editor_markers.cc:733 editor_markers.cc:827
-#: editor_markers.cc:1012 editor_markers.cc:1030 editor_markers.cc:1048
-#: editor_markers.cc:1067 editor_markers.cc:1086 editor_markers.cc:1116
-#: editor_markers.cc:1147 editor_markers.cc:1177 editor_markers.cc:1205
-#: editor_markers.cc:1236 editor_markers.cc:1261 editor_markers.cc:1312
-#: editor_markers.cc:1356 editor_markers.cc:1382 editor_markers.cc:1576
-#: editor_mouse.cc:2248
+#: editor_export_audio.cc:93 editor_markers.cc:733 editor_markers.cc:832
+#: editor_markers.cc:1045 editor_markers.cc:1063 editor_markers.cc:1081
+#: editor_markers.cc:1100 editor_markers.cc:1119 editor_markers.cc:1149
+#: editor_markers.cc:1180 editor_markers.cc:1210 editor_markers.cc:1238
+#: editor_markers.cc:1269 editor_markers.cc:1294 editor_markers.cc:1345
+#: editor_markers.cc:1458 editor_markers.cc:1484 editor_markers.cc:1678
+#: editor_mouse.cc:2255
 msgid "programming error: marker canvas item has no marker object pointer!"
 msgstr ""
 "Chyba v programování: položka plátna značka nemá žádný ukazatel objektu "
@@ -5275,20 +5567,20 @@ msgstr "Konec"
 msgid "mark"
 msgstr "Značka"
 
-#: editor_markers.cc:650 editor_ops.cc:2102 editor_ops.cc:2124
-#: editor_ops.cc:2240 editor_ops.cc:2277 location_ui.cc:1025
+#: editor_markers.cc:650 editor_ops.cc:2164 editor_ops.cc:2186
+#: editor_ops.cc:2304 editor_ops.cc:2341 location_ui.cc:1049
 msgid "add marker"
 msgstr "Přidat značku"
 
-#: editor_markers.cc:682 editor_markers.cc:1456
+#: editor_markers.cc:682 editor_markers.cc:1558
 msgid "set loop range"
 msgstr "Nastavit rozsah smyčky"
 
-#: editor_markers.cc:698 editor_markers.cc:1462
+#: editor_markers.cc:698 editor_markers.cc:1564
 msgid "set punch range"
 msgstr "Nastavit rozsah přepsání"
 
-#: editor_markers.cc:715 editor_ops.cc:4092
+#: editor_markers.cc:715 editor_ops.cc:4159
 msgid "range"
 msgstr "Rozsah"
 
@@ -5296,108 +5588,137 @@ msgstr "Rozsah"
 msgid "new range marker"
 msgstr "Nová značka rozsahu"
 
-#: editor_markers.cc:751 editor_ops.cc:2208 location_ui.cc:861
+#: editor_markers.cc:751 editor_ops.cc:2272 location_ui.cc:885
 msgid "remove marker"
 msgstr "Odstranit značky"
 
-#: editor_markers.cc:894
+#: editor_markers.cc:899
 msgid "Locate to Here"
 msgstr "Ukazatele polohy postavit sem"
 
-#: editor_markers.cc:895
+#: editor_markers.cc:900
 msgid "Play from Here"
 msgstr "Přehrávat od tohoto bodu"
 
-#: editor_markers.cc:896
+#: editor_markers.cc:901
 msgid "Move Mark to Playhead"
 msgstr "Posunout značku k ukazateli polohy"
 
-#: editor_markers.cc:900
+#: editor_markers.cc:905
 msgid "Create Range to Next Marker"
 msgstr "Vytvořit rozsah až k další značce"
 
-#: editor_markers.cc:941
+#: editor_markers.cc:946
 msgid "Locate to Marker"
 msgstr "Umístit ke značce"
 
-#: editor_markers.cc:942
+#: editor_markers.cc:947
 msgid "Play from Marker"
 msgstr "Přehrávat od značky"
 
-#: editor_markers.cc:945
+#: editor_markers.cc:950
 msgid "Set Marker from Playhead"
 msgstr "Nastavit značku od ukazatele polohy"
 
-#: editor_markers.cc:947
+#: editor_markers.cc:951
 msgid "Set Range from Selection"
 msgstr "Nastavit rozsah z výběru"
 
-#: editor_markers.cc:957
+#: editor_markers.cc:960
 msgid "Hide Range"
 msgstr "Skrýt rozsah"
 
-#: editor_markers.cc:958
+#: editor_markers.cc:961
 msgid "Rename Range..."
 msgstr "Přejmenovat rozsah..."
 
-#: editor_markers.cc:962
+#: editor_markers.cc:965
 msgid "Remove Range"
 msgstr "Odstranit rozsah"
 
-#: editor_markers.cc:969
+#: editor_markers.cc:972
 msgid "Separate Regions in Range"
 msgstr "Rozdělit oblasti na hranicích rozsahů"
 
-#: editor_markers.cc:972
+#: editor_markers.cc:974
 msgid "Select Range"
 msgstr "Vybrat rozsah"
 
-#: editor_markers.cc:1001
+#: editor_markers.cc:987
+msgid "Make Ramped"
+msgstr ""
+
+#: editor_markers.cc:989
+msgid "Make Constant"
+msgstr ""
+
+#: editor_markers.cc:993 editor_markers.cc:1013
+msgid "Lock to Music"
+msgstr ""
+
+#: editor_markers.cc:995 editor_markers.cc:1015
+msgid "Lock to Audio"
+msgstr ""
+
+#: editor_markers.cc:1034
 msgid "Set Punch Range"
 msgstr "Nastavit rozsah přepsání"
 
-#: editor_markers.cc:1407 editor_ops.cc:2057
+#: editor_markers.cc:1391
+msgid "change meter lock style"
+msgstr ""
+
+#: editor_markers.cc:1414
+msgid "change tempo lock style"
+msgstr ""
+
+#: editor_markers.cc:1441
+msgid "change tempo type"
+msgstr ""
+
+#: editor_markers.cc:1509 editor_ops.cc:2119
 msgid "New Name:"
 msgstr "Nový název:"
 
-#: editor_markers.cc:1410
+#: editor_markers.cc:1512
 msgid "Rename Mark"
 msgstr "Přejmenovat značku"
 
-#: editor_markers.cc:1412
+#: editor_markers.cc:1514
 msgid "Rename Range"
 msgstr "Přejmenovat rozsah"
 
-#: editor_markers.cc:1419 editor_mouse.cc:2265 processor_box.cc:2370
-#: processor_box.cc:2837 route_time_axis.cc:1112 route_ui.cc:1616
+#: editor_markers.cc:1521 editor_mouse.cc:2272 processor_box.cc:3192
+#: processor_box.cc:3681 route_time_axis.cc:1110 route_ui.cc:1637
+#: vca_master_strip.cc:395
 msgid "Rename"
 msgstr "Přejmenovat"
 
-#: editor_markers.cc:1432
+#: editor_markers.cc:1534
 msgid "rename marker"
 msgstr "Přejmenovat značku"
 
-#: editor_mixer.cc:91
+#: editor_mixer.cc:98
 msgid "This screen is not tall enough to display the editor mixer"
 msgstr ""
 "Tato obrazovka není dostatečně velká na to, aby zobrazila směšovač editoru"
 
-#: editor_mouse.cc:1343 editor_mouse.cc:1361 editor_tempodisplay.cc:270
+#: editor_mouse.cc:1345 editor_mouse.cc:1363 editor_tempodisplay.cc:384
 msgid ""
 "programming error: tempo marker canvas item has no marker object pointer!"
 msgstr ""
 "Chyba v programování: položka plátna značka tempa nemá žádný ukazatel "
 "objektu značky!"
 
-#: editor_mouse.cc:1348 editor_tempodisplay.cc:275
+#: editor_mouse.cc:1350 editor_tempodisplay.cc:389
 msgid "programming error: marker for tempo is not a tempo marker!"
 msgstr "Chyba v programování: značka pro tempo není značkou tempa!"
 
-#: editor_mouse.cc:1366 editor_tempodisplay.cc:375
+#: editor_mouse.cc:1368 editor_tempodisplay.cc:507
 msgid "programming error: marker for meter is not a meter marker!"
 msgstr "Chyba v programování: značka druhu taktu není značkou druhu taktu!"
 
-#: editor_mouse.cc:2013 editor_mouse.cc:2038 editor_mouse.cc:2051
+#: editor_mouse.cc:2016 editor_mouse.cc:2041 editor_mouse.cc:2054
 msgid ""
 "programming error: control point canvas item has no control point object "
 "pointer!"
@@ -5405,179 +5726,183 @@ msgstr ""
 "Chyba v programování: položka plátna místo ovládání nemá žádný ukazatel "
 "objektu místa ovládání!"
 
-#: editor_mouse.cc:2186
+#: editor_mouse.cc:2085
+msgid "edit note(s)"
+msgstr ""
+
+#: editor_mouse.cc:2193
 msgid "start point trim"
 msgstr "Ustřihnout počáteční bod"
 
-#: editor_mouse.cc:2211
+#: editor_mouse.cc:2218
 msgid "end point trim"
 msgstr "Ustřihnout koncový bod"
 
-#: editor_mouse.cc:2263
+#: editor_mouse.cc:2270
 msgid "Name for region:"
 msgstr "Název oblasti:"
 
-#: editor_ops.cc:167
+#: editor_ops.cc:168
 msgid "split"
 msgstr "Rozdělit"
 
-#: editor_ops.cc:341
+#: editor_ops.cc:342
 msgid "alter selection"
 msgstr "Změnit výběr"
 
-#: editor_ops.cc:383
+#: editor_ops.cc:384
 msgid "nudge regions forward"
 msgstr "Postrčit oblasti o krok dopředu"
 
-#: editor_ops.cc:437 editor_ops.cc:528
+#: editor_ops.cc:441 editor_ops.cc:535
 msgid "nudge location forward"
 msgstr "Postrčit polohu o krok dopředu"
 
-#: editor_ops.cc:468
+#: editor_ops.cc:472
 msgid "nudge regions backward"
 msgstr "Postrčit oblasti o krok dozadu"
 
-#: editor_ops.cc:560
+#: editor_ops.cc:567
 msgid "nudge forward"
 msgstr "Postrčit o krok dopředu"
 
-#: editor_ops.cc:584
+#: editor_ops.cc:591
 msgid "nudge backward"
 msgstr "Postrčit o krok dozadu"
 
-#: editor_ops.cc:649
+#: editor_ops.cc:656
 msgid "sequence regions"
 msgstr "Řadit oblasti vedle sebe"
 
-#: editor_ops.cc:711
+#: editor_ops.cc:718
 msgid "build_region_boundary_cache called with snap_type = %1"
 msgstr "build_region_boundary_cache byla volána snap_type = %1"
 
-#: editor_ops.cc:2059
+#: editor_ops.cc:2121
 msgid "New Location Marker"
 msgstr "Nová značka polohy"
 
-#: editor_ops.cc:2150 editor_ops.cc:2174
+#: editor_ops.cc:2212 editor_ops.cc:2236
 msgid "Set session start"
 msgstr "Nastavit začátek sezení"
 
-#: editor_ops.cc:2240
+#: editor_ops.cc:2304
 msgid "add markers"
 msgstr "Přidat značky"
 
-#: editor_ops.cc:2336
+#: editor_ops.cc:2400
 msgid "clear markers"
 msgstr "Smazat značky"
 
-#: editor_ops.cc:2351
+#: editor_ops.cc:2415
 msgid "clear ranges"
 msgstr "Smazat rozsahy"
 
-#: editor_ops.cc:2367
+#: editor_ops.cc:2431
 msgid "clear locations"
 msgstr "Smazat polohy"
 
-#: editor_ops.cc:2430
+#: editor_ops.cc:2494
 msgid "insert region"
 msgstr "Vložit oblast"
 
-#: editor_ops.cc:2621
+#: editor_ops.cc:2685
 msgid "raise regions"
 msgstr "Pozvednout oblasti nahoru"
 
-#: editor_ops.cc:2623
+#: editor_ops.cc:2687
 msgid "raise region"
 msgstr "Pozvednout oblast nahoru"
 
-#: editor_ops.cc:2629
+#: editor_ops.cc:2693
 msgid "raise regions to top"
 msgstr "Pozvednout oblasti úplně nahoru"
 
-#: editor_ops.cc:2631
+#: editor_ops.cc:2695
 msgid "raise region to top"
 msgstr "Pozvednout oblast úplně nahoru"
 
-#: editor_ops.cc:2637
+#: editor_ops.cc:2701
 msgid "lower regions"
 msgstr "Dát oblasti dolů"
 
-#: editor_ops.cc:2639 editor_ops.cc:2647
+#: editor_ops.cc:2703 editor_ops.cc:2711
 msgid "lower region"
 msgstr "Dát oblast dolů"
 
-#: editor_ops.cc:2645
+#: editor_ops.cc:2709
 msgid "lower regions to bottom"
 msgstr "Dát oblasti zcela dolů"
 
-#: editor_ops.cc:2730
+#: editor_ops.cc:2794
 msgid "Rename Region"
 msgstr "Přejmenovat oblast"
 
-#: editor_ops.cc:2732 processor_box.cc:2368 route_ui.cc:1614
+#: editor_ops.cc:2796 processor_box.cc:3190 route_ui.cc:1635
 msgid "New name:"
 msgstr "Nový název:"
 
-#: editor_ops.cc:3030
+#: editor_ops.cc:3097
 msgid "separate"
 msgstr "Rozdělit"
 
-#: editor_ops.cc:3142
+#: editor_ops.cc:3207
 msgid "separate region under"
 msgstr "Rozdělit oblast pod"
 
-#: editor_ops.cc:3294
+#: editor_ops.cc:3360
 msgid "trim to selection"
 msgstr "Ustřihnout na výběru"
 
-#: editor_ops.cc:3376
+#: editor_ops.cc:3442
 msgid "set sync point"
 msgstr "Určit bod zapadnutí"
 
-#: editor_ops.cc:3400
+#: editor_ops.cc:3466
 msgid "remove region sync"
 msgstr "Odstranit bod zapadnutí oblasti"
 
-#: editor_ops.cc:3422
+#: editor_ops.cc:3488
 msgid "move regions to original position"
 msgstr "Posunout oblasti na původní polohu"
 
-#: editor_ops.cc:3424
+#: editor_ops.cc:3490
 msgid "move region to original position"
 msgstr "Posunout oblast na původní polohu"
 
-#: editor_ops.cc:3445
+#: editor_ops.cc:3511
 msgid "align selection"
 msgstr "Zarovnat výběr"
 
-#: editor_ops.cc:3519
+#: editor_ops.cc:3585
 msgid "align selection (relative)"
 msgstr "Zarovnat výběr poměrně"
 
-#: editor_ops.cc:3553
+#: editor_ops.cc:3619
 msgid "align region"
 msgstr "Zarovnat oblast"
 
-#: editor_ops.cc:3604
+#: editor_ops.cc:3670
 msgid "trim front"
 msgstr "Ustřihnout vpředu"
 
-#: editor_ops.cc:3604
+#: editor_ops.cc:3670
 msgid "trim back"
 msgstr "Ustřihnout vzadu"
 
-#: editor_ops.cc:3634
+#: editor_ops.cc:3700
 msgid "trim to loop"
 msgstr "Zkrátit na oblast smyčky"
 
-#: editor_ops.cc:3644
+#: editor_ops.cc:3710
 msgid "trim to punch"
 msgstr "Zkrátit na oblast přepsání"
 
-#: editor_ops.cc:3766
+#: editor_ops.cc:3832
 msgid "trim to region"
 msgstr "Zkrátit na oblast"
 
-#: editor_ops.cc:3825
+#: editor_ops.cc:3891
 msgid ""
 "This track/bus cannot be frozen because the signal adds or loses channels "
 "before reaching the outputs.\n"
@@ -5589,11 +5914,11 @@ msgstr ""
 "Obvykle je to způsobeno přídavnými moduly, jež vytvářejí stereo výstup z "
 "monofonního vstupu nebo naopak."
 
-#: editor_ops.cc:3828
+#: editor_ops.cc:3894
 msgid "Cannot freeze"
 msgstr "Nelze zmrazit"
 
-#: editor_ops.cc:3834
+#: editor_ops.cc:3900
 msgid ""
 "<b>%1</b>\n"
 "\n"
@@ -5608,23 +5933,23 @@ msgstr ""
 "\n"
 "Zmrazení jen zpracuje signál až k prvnímu poslání/vložení/vrácení."
 
-#: editor_ops.cc:3838
+#: editor_ops.cc:3904
 msgid "Freeze anyway"
 msgstr "Přesto zmrazit"
 
-#: editor_ops.cc:3839
+#: editor_ops.cc:3905
 msgid "Don't freeze"
 msgstr "Nemrazit"
 
-#: editor_ops.cc:3840
+#: editor_ops.cc:3906
 msgid "Freeze Limits"
 msgstr "Omezení zmražení"
 
-#: editor_ops.cc:3855
+#: editor_ops.cc:3921
 msgid "Cancel Freeze"
 msgstr "Zrušit zmrazení"
 
-#: editor_ops.cc:3885
+#: editor_ops.cc:3952
 msgid ""
 "You can't perform this operation because the processing of the signal will "
 "cause one or more of the tracks to end up with a region with more channels "
@@ -5637,47 +5962,47 @@ msgstr ""
 "\n"
 "Můžete to udělat bez zpracování, což je odlišná operace."
 
-#: editor_ops.cc:3889
+#: editor_ops.cc:3956
 msgid "Cannot bounce"
 msgstr "Nelze vyhodit"
 
-#: editor_ops.cc:3940
+#: editor_ops.cc:4007
 msgid "bounce range"
 msgstr "Vrazit rozsah"
 
-#: editor_ops.cc:4007
+#: editor_ops.cc:4074
 msgid "delete"
 msgstr "Smazat"
 
-#: editor_ops.cc:4010
+#: editor_ops.cc:4077
 msgid "cut"
 msgstr "Vyjmout"
 
-#: editor_ops.cc:4013
+#: editor_ops.cc:4080
 msgid "copy"
 msgstr "Kopírovat"
 
-#: editor_ops.cc:4016
+#: editor_ops.cc:4083
 msgid "clear"
 msgstr "Vyprázdnit"
 
-#: editor_ops.cc:4065
+#: editor_ops.cc:4132
 msgid "objects"
 msgstr "Předměty"
 
-#: editor_ops.cc:4275 editor_ops.cc:4360
+#: editor_ops.cc:4342 editor_ops.cc:4427
 msgid "remove region"
 msgstr "Odstranit oblast"
 
-#: editor_ops.cc:4787
-msgid "duplicate selection"
-msgstr "Zdvojit výběr"
+#: editor_ops.cc:4844
+msgid "duplicate range selection"
+msgstr ""
 
-#: editor_ops.cc:4873
+#: editor_ops.cc:4938
 msgid "nudge track"
 msgstr "Postrčit stopu"
 
-#: editor_ops.cc:4900
+#: editor_ops.cc:4965
 msgid ""
 "Do you really want to destroy the last capture?\n"
 "(This is destructive and cannot be undone)"
@@ -5685,156 +6010,156 @@ msgstr ""
 "Opravdu chcete zrušit poslední nahrávku?\n"
 "(Toto nelze vrátit zpět!)"
 
-#: editor_ops.cc:4903 editor_ops.cc:7127 editor_regions.cc:466
+#: editor_ops.cc:4968 editor_ops.cc:7202 editor_regions.cc:503
 #: editor_snapshots.cc:171
 msgid "No, do nothing."
 msgstr "Ne, nedělat nic."
 
-#: editor_ops.cc:4904
+#: editor_ops.cc:4969
 msgid "Yes, destroy it."
 msgstr "Ano, odstranit."
 
-#: editor_ops.cc:4906
+#: editor_ops.cc:4971
 msgid "Destroy last capture"
 msgstr "Zničit poslední nahrávku"
 
-#: editor_ops.cc:4982
+#: editor_ops.cc:5047
 msgid "normalize"
 msgstr "Normalizovat"
 
-#: editor_ops.cc:5080
+#: editor_ops.cc:5145
 msgid "reverse regions"
 msgstr "Obrátit oblasti"
 
-#: editor_ops.cc:5116
+#: editor_ops.cc:5182
 msgid "strip silence"
 msgstr "Odstranit ticho"
 
-#: editor_ops.cc:5197
+#: editor_ops.cc:5263
 msgid "Fork Region(s)"
 msgstr "Rozdvojit oblast(i)"
 
-#: editor_ops.cc:5204
+#: editor_ops.cc:5270
 msgid "Could not unlink %1"
 msgstr "Nepodařilo se zrušit odkaz %1"
 
-#: editor_ops.cc:5465
+#: editor_ops.cc:5532
 msgid "reset region gain"
 msgstr "Nastavit sílu hlasitosti v oblasti znovu"
 
-#: editor_ops.cc:5523
+#: editor_ops.cc:5590
 msgid "region gain envelope active"
 msgstr "Křivka síly zvuku v oblasti činná"
 
-#: editor_ops.cc:5548
+#: editor_ops.cc:5615
 msgid "toggle region lock"
 msgstr "Přepnout zámek oblasti"
 
-#: editor_ops.cc:5572
+#: editor_ops.cc:5639
 msgid "Toggle Video Lock"
 msgstr "Přepnout zámek obrazového záznamu"
 
-#: editor_ops.cc:5596
+#: editor_ops.cc:5663
 msgid "region lock style"
 msgstr "Styl zámku oblasti"
 
-#: editor_ops.cc:5621
+#: editor_ops.cc:5688
 msgid "change region opacity"
 msgstr "Změnit neprůhlednost oblasti"
 
-#: editor_ops.cc:5714
+#: editor_ops.cc:5781
 msgid "fade range"
 msgstr "Prolínat oblast"
 
-#: editor_ops.cc:5752
+#: editor_ops.cc:5819
 msgid "set fade in length"
 msgstr "Změnit délku postupného zesílení signálu"
 
-#: editor_ops.cc:5759
+#: editor_ops.cc:5826
 msgid "set fade out length"
 msgstr "Změnit délku postupného zeslabení signálu"
 
-#: editor_ops.cc:5824
+#: editor_ops.cc:5891
 msgid "set fade in shape"
 msgstr "Upravit tvar křivky postupného zesílení signálu"
 
-#: editor_ops.cc:5859
+#: editor_ops.cc:5926
 msgid "set fade out shape"
 msgstr "Upravit tvar křivky postupného zeslabení signálu"
 
-#: editor_ops.cc:5895
+#: editor_ops.cc:5962
 msgid "set fade in active"
 msgstr "Spustit postupné zesílení signálu"
 
-#: editor_ops.cc:5929
+#: editor_ops.cc:5996
 msgid "set fade out active"
 msgstr "Spustit postupné zeslabení signálu"
 
-#: editor_ops.cc:5989
+#: editor_ops.cc:6056
 msgid "toggle fade active"
 msgstr "Zapnout prolínání"
 
-#: editor_ops.cc:6179
+#: editor_ops.cc:6249
 msgid "set loop range from selection"
 msgstr "Nastavit rozsah smyčky z výběru"
 
-#: editor_ops.cc:6193
+#: editor_ops.cc:6263
 msgid "set loop range from region"
 msgstr "Nastavit rozsah smyčky z oblasti"
 
-#: editor_ops.cc:6212
+#: editor_ops.cc:6282
 msgid "set punch range from selection"
 msgstr "Nastavit rozsah přepsání z výběru"
 
-#: editor_ops.cc:6236
+#: editor_ops.cc:6306
 msgid "set session start/end from selection"
 msgstr "Nastavit začátek/konec sezení z výběru"
 
-#: editor_ops.cc:6272
+#: editor_ops.cc:6344
 msgid "set punch start from EP"
 msgstr "Nastavit začátek přepsání z pracovního bodu"
 
-#: editor_ops.cc:6300
+#: editor_ops.cc:6372
 msgid "set punch end from EP"
 msgstr "Nastavit konec přepsání z pracovního bodu"
 
-#: editor_ops.cc:6333
+#: editor_ops.cc:6405
 msgid "set loop start from EP"
 msgstr "Nastavit začátek smyčky z pracovního bodu"
 
-#: editor_ops.cc:6361
+#: editor_ops.cc:6433
 msgid "set loop end from EP"
 msgstr "Nastavit konec smyčky z pracovního bodu"
 
-#: editor_ops.cc:6372
+#: editor_ops.cc:6444
 msgid "set punch range from region"
 msgstr "Nastavit rozsah přepsání z oblasti"
 
-#: editor_ops.cc:6457
+#: editor_ops.cc:6531
 msgid "Add new marker"
 msgstr "Přidat novou značku"
 
-#: editor_ops.cc:6458
+#: editor_ops.cc:6532
 msgid "Set global tempo"
 msgstr "Nastavit celkové tempo"
 
-#: editor_ops.cc:6461
+#: editor_ops.cc:6535
 msgid "Define one bar"
 msgstr "Vymezit jeden takt"
 
-#: editor_ops.cc:6462
+#: editor_ops.cc:6536
 msgid "Do you want to set the global tempo or add a new tempo marker?"
 msgstr "Chcete stanovit celkové tempo, nebo přidat novou značku tempa?"
 
-#: editor_ops.cc:6488
+#: editor_ops.cc:6562
 msgid "set tempo from region"
 msgstr "Nastavit tempo podle oblasti"
 
-#: editor_ops.cc:6518
+#: editor_ops.cc:6591
 msgid "split regions"
 msgstr "Rozdělit oblasti"
 
-#: editor_ops.cc:6560
+#: editor_ops.cc:6633
 msgid ""
 "You are about to split\n"
 "%1\n"
@@ -5846,11 +6171,11 @@ msgstr ""
 "do %2 kusů.\n"
 "Toto by mohlo trvat velmi dlouho."
 
-#: editor_ops.cc:6567
+#: editor_ops.cc:6640
 msgid "Call for the Ferret!"
 msgstr "Volání po slídilovi!"
 
-#: editor_ops.cc:6568
+#: editor_ops.cc:6641
 msgid ""
 "Press OK to continue with this split operation\n"
 "or ask the Ferret dialog to tune the analysis"
@@ -5858,52 +6183,52 @@ msgstr ""
 "Stiskněte OK kvůli pokračování v této operaci rozdělení\n"
 "nebo se pokuste v okně slídilově vyladit rozbor."
 
-#: editor_ops.cc:6570
+#: editor_ops.cc:6643
 msgid "Press OK to continue with this split operation"
 msgstr "Stiskněte OK kvůli pokračování v této operaci rozdělení"
 
-#: editor_ops.cc:6573
+#: editor_ops.cc:6646
 msgid "Excessive split?"
 msgstr "Nadměrné rozdělení?"
 
-#: editor_ops.cc:6725
+#: editor_ops.cc:6800
 msgid "place transient"
 msgstr "Umístit přechod"
 
-#: editor_ops.cc:6760
+#: editor_ops.cc:6834
 msgid "snap regions to grid"
 msgstr "Zapadnout oblasti do mřížky"
 
-#: editor_ops.cc:6799
+#: editor_ops.cc:6873
 msgid "Close Region Gaps"
 msgstr "Zavřít mezery oblastí"
 
-#: editor_ops.cc:6804
+#: editor_ops.cc:6878
 msgid "Crossfade length"
 msgstr "Délka prolínání"
 
-#: editor_ops.cc:6813 editor_ops.cc:6824 rhythm_ferret.cc:119
-#: session_option_editor.cc:141
+#: editor_ops.cc:6887 editor_ops.cc:6898 rhythm_ferret.cc:128
+#: rhythm_ferret.cc:143 session_option_editor.cc:141
 msgid "ms"
 msgstr "ms"
 
-#: editor_ops.cc:6815
+#: editor_ops.cc:6889
 msgid "Pull-back length"
 msgstr "Délka ustoupení"
 
-#: editor_ops.cc:6828
+#: editor_ops.cc:6902 keyeditor.cc:71
 msgid "Ok"
 msgstr "OK"
 
-#: editor_ops.cc:6843
+#: editor_ops.cc:6917
 msgid "close region gaps"
 msgstr "Zavřít mezery oblastí"
 
-#: editor_ops.cc:7085
+#: editor_ops.cc:7160
 msgid "That would be bad news ...."
 msgstr "To by byly nepříjemné zprávy..."
 
-#: editor_ops.cc:7090
+#: editor_ops.cc:7165
 msgid ""
 "Removing the master or monitor bus is such a bad idea\n"
 "that %1 is not going to allow it.\n"
@@ -5919,19 +6244,19 @@ msgstr ""
 "upravte svůj soubor ardour.rc, kde nastavte volbu\n"
 "\"allow-special-bus-removal\" na \"yes\""
 
-#: editor_ops.cc:7106 route_ui.cc:2009
+#: editor_ops.cc:7181
 msgid "track"
 msgid_plural "tracks"
 msgstr[0] "Stopa"
 msgstr[1] "%1 skladby"
 
-#: editor_ops.cc:7107 route_ui.cc:2009
+#: editor_ops.cc:7182
 msgid "bus"
 msgid_plural "busses"
 msgstr[0] "Sběrnice"
 msgstr[1] "Busse"
 
-#: editor_ops.cc:7111
+#: editor_ops.cc:7186
 msgid ""
 "Do you really want to remove %1 %2 and %3 %4?\n"
 "(You may also lose the playlists associated with the %2)\n"
@@ -5943,7 +6268,7 @@ msgstr ""
 "\n"
 "Tento krok nelze vrátit zpět, a soubor se sezením bude přepsán!"
 
-#: editor_ops.cc:7116
+#: editor_ops.cc:7191
 msgid ""
 "Do you really want to remove %1 %2?\n"
 "(You may also lose the playlists associated with the %2)\n"
@@ -5955,7 +6280,7 @@ msgstr ""
 "\n"
 "Tento krok nelze vrátit zpět, a soubor se sezením bude přepsán!"
 
-#: editor_ops.cc:7122
+#: editor_ops.cc:7197
 msgid ""
 "Do you really want to remove %1 %2?\n"
 "\n"
@@ -5965,149 +6290,145 @@ msgstr ""
 "\n"
 "Tento krok nelze vrátit zpět, a soubor se sezením bude přepsán"
 
-#: editor_ops.cc:7129
+#: editor_ops.cc:7204
 msgid "Yes, remove them."
 msgstr "Ano, odstranit."
 
-#: editor_ops.cc:7131 editor_snapshots.cc:172
+#: editor_ops.cc:7206 editor_snapshots.cc:172
 msgid "Yes, remove it."
 msgstr "Ano, odstranit."
 
-#: editor_ops.cc:7136 editor_ops.cc:7138
+#: editor_ops.cc:7211 editor_ops.cc:7213
 msgid "Remove %1"
 msgstr "Odstranit %1"
 
-#: editor_ops.cc:7240 editor_ops.cc:7254 editor_ops.cc:7294 editor_ops.cc:7304
+#: editor_ops.cc:7319 editor_ops.cc:7333 editor_ops.cc:7373 editor_ops.cc:7383
 msgid "insert time"
 msgstr "Vložit ticho"
 
-#: editor_ops.cc:7357
+#: editor_ops.cc:7436
 msgid "Cannot insert or delete time when in Lock edit."
 msgstr "Nelze vložit nebo smazat čas v režimu zámku úprav."
 
-#: editor_ops.cc:7377 editor_ops.cc:7389 editor_ops.cc:7462
-msgid "cut time"
-msgstr "Vyjmout čas"
-
-#: editor_ops.cc:7475
+#: editor_ops.cc:7456 editor_ops.cc:7468 editor_ops.cc:7541 editor_ops.cc:7554
 msgid "remove time"
 msgstr "Odstranit čas"
 
-#: editor_ops.cc:7549
+#: editor_ops.cc:7628
 msgid "There are too many tracks to fit in the current window"
 msgstr ""
 "Bylo vybráno příliš mnoho stop, než aby se všechny vešly do nynějšího okna"
 
-#: editor_ops.cc:7610
+#: editor_ops.cc:7689
 msgid "Sel"
 msgstr "Výb"
 
-#: editor_ops.cc:7649
+#: editor_ops.cc:7728
 #, c-format
 msgid "Saved view %u"
 msgstr "Uložen pohled %u"
 
-#: editor_ops.cc:7674
+#: editor_ops.cc:7753
 msgid "mute regions"
 msgstr "Ztišit oblasti"
 
-#: editor_ops.cc:7676
+#: editor_ops.cc:7755
 msgid "mute region"
 msgstr "Ztišit oblast"
 
-#: editor_ops.cc:7713
+#: editor_ops.cc:7792
 msgid "combine regions"
 msgstr "Spojit oblasti"
 
-#: editor_ops.cc:7751
+#: editor_ops.cc:7830
 msgid "uncombine regions"
 msgstr "Zrušit spojení oblastí"
 
-#: editor_ops.cc:7788
+#: editor_ops.cc:7867
 msgid "%1: Locked"
 msgstr "%1: Uzamknuto"
 
-#: editor_ops.cc:7795
+#: editor_ops.cc:7874
 msgid "Click to unlock"
 msgstr "Klepněte pro odemknutí"
 
-#: editor_ops.cc:7844
+#: editor_ops.cc:7923
 msgid "Moving embedded files into session folder"
 msgstr "Přesunují se vložené soubory do složky se sezením"
 
-#: editor_regions.cc:115
+#: editor_regions.cc:159
 msgid "Region name, with number of channels in []'s"
 msgstr "Název oblasti s počtem kanálů v hranatých závorkách []"
 
-#: editor_regions.cc:116
+#: editor_regions.cc:160
 msgid "Position of start of region"
 msgstr "Poloha začátku oblasti"
 
-#: editor_regions.cc:117 editor_regions.cc:863 time_info_box.cc:101
+#: editor_regions.cc:161 editor_regions.cc:935 time_info_box.cc:95
 msgid "End"
 msgstr "Konec"
 
-#: editor_regions.cc:117
+#: editor_regions.cc:161
 msgid "Position of end of region"
 msgstr "Poloha konce oblasti"
 
-#: editor_regions.cc:118
+#: editor_regions.cc:162
 msgid "Length of the region"
 msgstr "Délka oblasti"
 
-#: editor_regions.cc:119
+#: editor_regions.cc:163
 msgid "Position of region sync point, relative to start of the region"
 msgstr "Poloha seřizovacího bodu oblasti, poměrná k začátku oblasti"
 
-#: editor_regions.cc:120
+#: editor_regions.cc:164
 msgid "Length of region fade-in (units: secondary clock), () if disabled"
 msgstr ""
 "Délka postupného zesílení signálu oblasti (jednotky: vedlejší hodiny), (), "
 "pokud je zakázáno"
 
-#: editor_regions.cc:121
+#: editor_regions.cc:165
 msgid "Length of region fade-out (units: secondary clock), () if disabled"
 msgstr ""
 "Délka postupného zeslabení signálu oblasti (jednotky: vedlejší hodiny), (), "
 "pokud je zakázáno"
 
-#: editor_regions.cc:122
+#: editor_regions.cc:166
 msgid "Lock|L"
 msgstr "Zám"
 
-#: editor_regions.cc:122
+#: editor_regions.cc:166
 msgid "Region position locked?"
 msgstr "Poloha oblasti zamknuta?"
 
-#: editor_regions.cc:123
+#: editor_regions.cc:167
 msgid "Gain|G"
 msgstr "Zes"
 
-#: editor_regions.cc:123
+#: editor_regions.cc:167
 msgid "Region position glued to Bars|Beats time?"
 msgstr "Poloha oblasti přilepena k taktům|dobám?"
 
-#: editor_regions.cc:124
+#: editor_regions.cc:168
 msgid "Region muted?"
 msgstr "Oblast ztlumena?"
 
-#: editor_regions.cc:125
+#: editor_regions.cc:169
 msgid "Opaque|O"
 msgstr "Nepr"
 
-#: editor_regions.cc:125
+#: editor_regions.cc:169
 msgid "Region opaque (blocks regions below it from being heard)?"
 msgstr "Oblast neprůhledná (blokuje oblasti pod sebou, aby byly slyšeny)?"
 
-#: editor_regions.cc:315 editor_regions.cc:320 editor_regions.cc:322
+#: editor_regions.cc:360 editor_regions.cc:365 editor_regions.cc:367
 msgid "Hidden"
 msgstr "Skrytý"
 
-#: editor_regions.cc:395
+#: editor_regions.cc:432
 msgid "(MISSING) "
 msgstr "(CHYBÍ) "
 
-#: editor_regions.cc:463
+#: editor_regions.cc:500
 msgid ""
 "Do you really want to remove unused regions?\n"
 "(This is destructive and cannot be undone)"
@@ -6115,119 +6436,131 @@ msgstr ""
 "Opravdu chcete odstranit nepoužívané oblasti?\n"
 "(Toto je ničivé a nelze to vrátit zpět)"
 
-#: editor_regions.cc:467
+#: editor_regions.cc:504
 msgid "Yes, remove."
 msgstr "Ano, odstranit."
 
-#: editor_regions.cc:469
+#: editor_regions.cc:506
 msgid "Remove unused regions"
 msgstr "Odstranit nepoužívané oblasti"
 
-#: editor_regions.cc:698
+#: editor_regions.cc:735
 msgid "EditorRegions::format_position: negative timecode position: %1"
 msgstr "EditorRegions::format_position: Záporná poloha časového kódu: %1"
 
-#: editor_regions.cc:828 editor_regions.cc:844 editor_regions.cc:858
+#: editor_regions.cc:900 editor_regions.cc:916 editor_regions.cc:930
 msgid "Mult."
 msgstr "Více"
 
-#: editor_regions.cc:861 midi_list_editor.cc:104 time_info_box.cc:94
+#: editor_regions.cc:933 midi_list_editor.cc:104 time_info_box.cc:88
 msgid "Start"
 msgstr "Spustit"
 
-#: editor_regions.cc:879 editor_regions.cc:895
+#: editor_regions.cc:951 editor_regions.cc:967
 msgid "Multiple"
 msgstr "Více"
 
-#: editor_regions.cc:964
+#: editor_regions.cc:1036
 msgid "MISSING "
 msgstr "(CHYBÍ) "
 
-#: editor_routes.cc:184
+#: editor_routes.cc:126
+msgid "RS"
+msgstr ""
+
+#: editor_routes.cc:208
 msgid "SS"
 msgstr "SS"
 
-#: editor_routes.cc:208
+#: editor_routes.cc:233
 msgid "Track/Bus Name"
 msgstr "Název stopy/sběrnice"
 
-#: editor_routes.cc:209
+#: editor_routes.cc:234
 msgid "Track/Bus visible ?"
 msgstr "Stopa/Sběrnice viditelná?"
 
-#: editor_routes.cc:210
+#: editor_routes.cc:235
 msgid "Track/Bus active ?"
 msgstr "Stopa/Sběrnice činná?"
 
-#: editor_routes.cc:211
+#: editor_routes.cc:236
 msgid "MidiInput|I"
 msgstr "MidiInput|I"
 
-#: editor_routes.cc:211
+#: editor_routes.cc:236
 msgid "MIDI input enabled"
 msgstr "Vstup MIDI povolen"
 
-#: editor_routes.cc:212
+#: editor_routes.cc:237
 msgid "Rec|R"
 msgstr "Rec|Nahr"
 
-#: editor_routes.cc:212
+#: editor_routes.cc:237
 msgid "Record enabled"
 msgstr "Nahrávání povoleno"
 
-#: editor_routes.cc:213
+#: editor_routes.cc:238
+msgid "Rec|RS"
+msgstr ""
+
+#: editor_routes.cc:238
+msgid "Record Safe"
+msgstr ""
+
+#: editor_routes.cc:239
 msgid "Muted"
 msgstr "Ztlumeno"
 
-#: editor_routes.cc:214
+#: editor_routes.cc:240
 msgid "Soloed"
 msgstr "Sólo"
 
-#: editor_routes.cc:215
+#: editor_routes.cc:241
 msgid "SoloIso|SI"
 msgstr "SoloIso|SamS"
 
-#: editor_routes.cc:215
+#: editor_routes.cc:241
 msgid "Solo Isolated"
 msgstr "Samostatné sólo"
 
-#: editor_routes.cc:216
+#: editor_routes.cc:242
 msgid "SoloLock|SS"
 msgstr "SoloLock|ZamS"
 
-#: editor_routes.cc:216
+#: editor_routes.cc:242
 msgid "Solo Safe (Locked)"
 msgstr "Zajištěné sólo (zamknuto)"
 
-#: editor_routes.cc:486 mixer_ui.cc:1259
+#: editor_routes.cc:550 mixer_ui.cc:1498
 msgid "Hide All"
 msgstr "Skrýt vše"
 
-#: editor_routes.cc:487 mixer_ui.cc:1260
+#: editor_routes.cc:551 mixer_ui.cc:1499
 msgid "Show All Audio Tracks"
 msgstr "Ukázat všechny zvukové stopy"
 
-#: editor_routes.cc:488 mixer_ui.cc:1261
+#: editor_routes.cc:552 mixer_ui.cc:1500
 msgid "Hide All Audio Tracks"
 msgstr "Skrýt všechny zvukové stopy"
 
-#: editor_routes.cc:489 mixer_ui.cc:1262
+#: editor_routes.cc:553 mixer_ui.cc:1501
 msgid "Show All Audio Busses"
 msgstr "Ukázat všechny zvukové sběrnice"
 
-#: editor_routes.cc:490 mixer_ui.cc:1263
+#: editor_routes.cc:554 mixer_ui.cc:1502
 msgid "Hide All Audio Busses"
 msgstr "Skrýt všechny zvukové sběrnice"
 
-#: editor_routes.cc:491 mixer_ui.cc:1264
+#: editor_routes.cc:555 mixer_ui.cc:1503
 msgid "Show All Midi Tracks"
 msgstr "Ukázat všechny MIDI stopy"
 
-#: editor_routes.cc:492 mixer_ui.cc:1265
+#: editor_routes.cc:556 mixer_ui.cc:1504
 msgid "Hide All Midi Tracks"
 msgstr "Skrýt všechny MIDI stopy"
 
-#: editor_routes.cc:493
+#: editor_routes.cc:557
 msgid "Only Show Tracks with Regions Under Playhead"
 msgstr "Ukázat jen stopy s oblastmi pod ukazatelem polohy přehrávání"
 
@@ -6271,7 +6604,7 @@ msgstr "Nová značka stopy na CD"
 msgid "New Tempo"
 msgstr "Vložit změnu rychlosti/tempa..."
 
-#: editor_rulers.cc:238 tempo_dialog.cc:315
+#: editor_rulers.cc:238 tempo_dialog.cc:419
 msgid "New Meter"
 msgstr "Nový druh taktu"
 
@@ -6295,31 +6628,35 @@ msgstr ""
 msgid "Remove snapshot"
 msgstr "Odstranit snímek"
 
-#: editor_tempodisplay.cc:194 editor_tempodisplay.cc:234
-msgid "add"
-msgstr "Přidat"
-
-#: editor_tempodisplay.cc:215
+#: editor_tempodisplay.cc:318
 msgid "add tempo mark"
 msgstr "Přidat značku změny tempa"
 
-#: editor_tempodisplay.cc:254
+#: editor_tempodisplay.cc:343
+msgid "add"
+msgstr "Přidat"
+
+#: editor_tempodisplay.cc:362
 msgid "add meter mark"
 msgstr "Přidat značku změny taktu"
 
-#: editor_tempodisplay.cc:287 editor_tempodisplay.cc:315
+#: editor_tempodisplay.cc:401 editor_tempodisplay.cc:435
 msgid "done"
 msgstr "Hotovo"
 
-#: editor_tempodisplay.cc:304 editor_tempodisplay.cc:330
+#: editor_tempodisplay.cc:422
+msgid "replace meter mark"
+msgstr ""
+
+#: editor_tempodisplay.cc:454
 msgid "replace tempo mark"
 msgstr "Nahradit značku změny tempa"
 
-#: editor_tempodisplay.cc:353 editor_tempodisplay.cc:387
+#: editor_tempodisplay.cc:485 editor_tempodisplay.cc:519
 msgid "remove tempo mark"
 msgstr "Odstranit značku změny tempa"
 
-#: editor_tempodisplay.cc:370
+#: editor_tempodisplay.cc:502
 msgid ""
 "programming error: meter marker canvas item has no marker object pointer!"
 msgstr ""
@@ -6334,7 +6671,7 @@ msgstr "Protáhnout/Zmenšit"
 msgid "pitch shift"
 msgstr "Posun výšky tónu"
 
-#: editor_timefx.cc:304
+#: editor_timefx.cc:282
 msgid "timefx cannot be started - thread creation error"
 msgstr ""
 "Protáhnutí času (timefx) nemohlo být provedeno - Při vytváření vlákna došlo "
@@ -6352,27 +6689,31 @@ msgstr "Nastavení zařízení MIDI"
 msgid "Refresh Devices"
 msgstr "Obnovit seznam zařízení"
 
-#: engine_dialog.cc:90 engine_dialog.cc:2923
+#: engine_dialog.cc:90
+msgid "Use Buffered I/O"
+msgstr ""
+
+#: engine_dialog.cc:91 engine_dialog.cc:3000
 msgid "Measure"
 msgstr "Změřit"
 
-#: engine_dialog.cc:91
+#: engine_dialog.cc:92
 msgid "Use results"
 msgstr "Použít výsledky"
 
-#: engine_dialog.cc:92
+#: engine_dialog.cc:93
 msgid "Back to settings ... (ignore results)"
 msgstr "Zpět na nastavení... (přehlížet výsledky)"
 
-#: engine_dialog.cc:93
+#: engine_dialog.cc:94
 msgid "Calibrate Audio"
 msgstr "Přesně nastavit zvuk"
 
-#: engine_dialog.cc:97
+#: engine_dialog.cc:98
 msgid "Back to settings"
 msgstr "Zpět na nastavení"
 
-#: engine_dialog.cc:118
+#: engine_dialog.cc:120
 msgid ""
 "No audio/MIDI backends detected. %1 cannot run\n"
 "\n"
@@ -6382,11 +6723,11 @@ msgstr ""
 "\n"
 "(Jde tu o chybu překladače/balíčkování/systému a nemělo k tomu nikdy dojít.)"
 
-#: engine_dialog.cc:143
+#: engine_dialog.cc:145
 msgid "Latency Measurement Tool"
 msgstr "Nástroj pro měření prodlevy"
 
-#: engine_dialog.cc:155
+#: engine_dialog.cc:157
 msgid ""
 "<span weight=\"bold\">Turn down the volume on your audio equipment to a very "
 "low level.</span>"
@@ -6394,97 +6735,97 @@ msgstr ""
 "<span weight=\"bold\">Stáhněte hlasitost svého zvukového zařízení na velmi "
 "nízkou úroveň.</span>"
 
-#: engine_dialog.cc:164
+#: engine_dialog.cc:166
 msgid "Select two channels below and connect them using a cable."
 msgstr "Vyberte níže dva kanály a propojte je pomocí kabelu."
 
-#: engine_dialog.cc:169
+#: engine_dialog.cc:171
 msgid "Output channel"
 msgstr "Výstupní kanál"
 
-#: engine_dialog.cc:177
+#: engine_dialog.cc:179
 msgid "Input channel"
 msgstr "Vstupní kanál"
 
-#: engine_dialog.cc:211
+#: engine_dialog.cc:213
 msgid "Once the channels are connected, click the \"Measure\" button."
 msgstr "Jakmile budou kanály propojeny, klepněte na tlačítko Změřit."
 
-#: engine_dialog.cc:218
+#: engine_dialog.cc:220
 msgid "When satisfied with the results, click the \"Use results\" button."
 msgstr "Až budete spokojeni s výsledky, klepněte na tlačítko Použít výsledky."
 
-#: engine_dialog.cc:233 engine_dialog.cc:3058 engine_dialog.cc:3068
+#: engine_dialog.cc:235 engine_dialog.cc:3138 engine_dialog.cc:3148
 msgid "No measurement results yet"
 msgstr "Zatím žádné výsledky měření"
 
-#: engine_dialog.cc:243 route_params_ui.cc:106
+#: engine_dialog.cc:245 route_params_ui.cc:106
 msgid "Latency"
 msgstr "Prodleva"
 
-#: engine_dialog.cc:497
+#: engine_dialog.cc:520
 msgid "Audio System:"
 msgstr "Zvukový systém:"
 
-#: engine_dialog.cc:540
+#: engine_dialog.cc:564
 msgid "Driver:"
 msgstr "Ovladač:"
 
-#: engine_dialog.cc:547
+#: engine_dialog.cc:571
 msgid "Input Device:"
 msgstr "Vstupní zařízení:"
 
-#: engine_dialog.cc:551
+#: engine_dialog.cc:575
 msgid "Output Device:"
 msgstr "Výstupní zařízení:"
 
-#: engine_dialog.cc:558
+#: engine_dialog.cc:582
 msgid "Device:"
 msgstr "Zařízení:"
 
-#: engine_dialog.cc:567 engine_dialog.cc:681 sfdb_ui.cc:153 sfdb_ui.cc:348
-#: sfdb_ui.cc:353
+#: engine_dialog.cc:591 engine_dialog.cc:699 export_report.cc:164
+#: export_report.cc:328 sfdb_ui.cc:153 sfdb_ui.cc:348 sfdb_ui.cc:353
 msgid "Sample rate:"
 msgstr "Vzorkovací kmitočet:"
 
-#: engine_dialog.cc:573 engine_dialog.cc:688
+#: engine_dialog.cc:597 engine_dialog.cc:706
 msgid "Buffer size:"
 msgstr "Velikost vyrovnávací paměti:"
 
-#: engine_dialog.cc:582
+#: engine_dialog.cc:606
 msgid "Periods:"
 msgstr "Periody:"
 
-#: engine_dialog.cc:600
+#: engine_dialog.cc:624
 msgid "Input Channels:"
 msgstr "Vstupní kanály:"
 
-#: engine_dialog.cc:613
+#: engine_dialog.cc:637
 msgid "Output Channels:"
 msgstr "Výstupní kanály:"
 
-#: engine_dialog.cc:625
+#: engine_dialog.cc:649
 msgid "Hardware input latency:"
 msgstr "Vstupní prodleva technického vybavení počítače:"
 
-#: engine_dialog.cc:628 engine_dialog.cc:641
+#: engine_dialog.cc:652 engine_dialog.cc:665
 msgid "samples"
 msgstr "Vzorky"
 
-#: engine_dialog.cc:638
+#: engine_dialog.cc:662
 msgid "Hardware output latency:"
 msgstr "Výstupní prodleva technického vybavení počítače:"
 
-#: engine_dialog.cc:649
+#: engine_dialog.cc:673
 msgid "MIDI System:"
 msgstr "Systém MIDI:"
 
-#: engine_dialog.cc:673
+#: engine_dialog.cc:691
 msgid ""
 "%1 is already running. %2 will connect to it and use the existing settings."
 msgstr "%1 již běží. %2 se k němu připojí a použije stávající nastavení."
 
-#: engine_dialog.cc:726
+#: engine_dialog.cc:744
 msgid ""
 "Failed to start or connect to audio-engine.\n"
 "\n"
@@ -6494,7 +6835,7 @@ msgstr ""
 "\n"
 "Přesné změření prodlevy vyžaduje pracující rozhraní pro zvuk."
 
-#: engine_dialog.cc:732
+#: engine_dialog.cc:750
 msgid ""
 "Your selected audio configuration is playback- or capture-only.\n"
 "\n"
@@ -6505,155 +6846,162 @@ msgstr ""
 "Přesné změření prodlevy vyžaduje obousměrný provoz - souběžné přehrávání a "
 "zachytávání"
 
-#: engine_dialog.cc:938
+#: engine_dialog.cc:965
 msgid "MIDI Devices"
 msgstr "Zařízení MIDI"
 
-#: engine_dialog.cc:944
+#: engine_dialog.cc:971
 msgid "Device"
 msgstr "Zařízení"
 
-#: engine_dialog.cc:946
+#: engine_dialog.cc:973
 msgid "Hardware Latencies"
 msgstr "Prodlevy technického vybavení"
 
-#: engine_dialog.cc:987
+#: engine_dialog.cc:1014
 msgid "Calibrate"
 msgstr "Přesně nastavit"
 
-#: engine_dialog.cc:1090
+#: engine_dialog.cc:1117
 msgid "all available channels"
 msgstr "všechny dostupné kanály"
 
-#: engine_dialog.cc:1576 latency_gui.cc:39
-msgid "sample"
-msgid_plural "samples"
-msgstr[0] "Vzorek"
-msgstr[1] "vzorky"
+#: engine_dialog.cc:1599 latency_gui.cc:55
+msgid "%1 sample"
+msgid_plural "%1 samples"
+msgstr[0] "%1 vzorek"
+msgstr[1] "%1 vzorků"
 
-#: engine_dialog.cc:1640
+#: engine_dialog.cc:1662
 #, c-format
 msgid "(%.1f ms)"
 msgstr "(%.1f ms)"
 
-#: engine_dialog.cc:2371
+#: engine_dialog.cc:2413
 msgid "Could not start backend engine %1"
 msgstr "Nepodařilo se spustit stroj podpůrné vrstvy %1"
 
-#: engine_dialog.cc:2403
+#: engine_dialog.cc:2445
 msgid "Cannot set driver to %1"
 msgstr "Nelze nastavit ovladač na %1"
 
-#: engine_dialog.cc:2408
+#: engine_dialog.cc:2450
 msgid "Cannot set input device name to %1"
 msgstr "Nelze nastavit název vstupního zařízení na %1"
 
-#: engine_dialog.cc:2412
+#: engine_dialog.cc:2454
 msgid "Cannot set output device name to %1"
 msgstr "Nelze nastavit název výstupního zařízení na %1"
 
-#: engine_dialog.cc:2417
+#: engine_dialog.cc:2459
 msgid "Cannot set device name to %1"
 msgstr "Nelze nastavit název zařízení na %1"
 
-#: engine_dialog.cc:2422
+#: engine_dialog.cc:2464
 msgid "Cannot set sample rate to %1"
 msgstr "Nelze nastavit vzorkovací kmitočet na %1"
 
-#: engine_dialog.cc:2426
+#: engine_dialog.cc:2468
 msgid "Cannot set buffer size to %1"
 msgstr "Nelze nastavit velikost vyrovnávací paměti na %1"
 
-#: engine_dialog.cc:2430
+#: engine_dialog.cc:2472
 msgid "Cannot set periods to %1"
 msgstr "Nelze nastavit periody na %1"
 
-#: engine_dialog.cc:2436
+#: engine_dialog.cc:2478
 msgid "Cannot set input channels to %1"
 msgstr "Nelze nastavit vstupní kanály na %1"
 
-#: engine_dialog.cc:2440
+#: engine_dialog.cc:2482
 msgid "Cannot set output channels to %1"
 msgstr "Nelze nastavit výstupní kanály na %1"
 
-#: engine_dialog.cc:2446
+#: engine_dialog.cc:2488
 msgid "Cannot set input latency to %1"
 msgstr "Nelze nastavit vstupní prodlevu na %1"
 
-#: engine_dialog.cc:2450
+#: engine_dialog.cc:2492
 msgid "Cannot set output latency to %1"
 msgstr "Nelze nastavit výstupní prodlevu na %1"
 
-#: engine_dialog.cc:2781 engine_dialog.cc:2840
+#: engine_dialog.cc:2851 engine_dialog.cc:2917
 msgid "No signal detected "
 msgstr "Nezjištěn žádný signál"
 
-#: engine_dialog.cc:2794 engine_dialog.cc:2848 port_insert_ui.cc:70
+#: engine_dialog.cc:2858
+msgid ""
+"Input signal is > -3dBFS. Lower the signal level (output gain, input gain) "
+"on the audio-interface."
+msgstr ""
+
+#: engine_dialog.cc:2871 engine_dialog.cc:2925 port_insert_ui.cc:70
 #: port_insert_ui.cc:98
 msgid "Disconnected from audio engine"
 msgstr "Odpojeno od zvukového stroje"
 
-#: engine_dialog.cc:2803 engine_dialog.cc:2856
+#: engine_dialog.cc:2880 engine_dialog.cc:2933
 msgid "Detected roundtrip latency: "
 msgstr "Objevena zpáteční prodleva: "
 
-#: engine_dialog.cc:2805 engine_dialog.cc:2858
+#: engine_dialog.cc:2882 engine_dialog.cc:2935
 msgid "Systemic latency: "
 msgstr "Systémová prodleva: "
 
-#: engine_dialog.cc:2812
+#: engine_dialog.cc:2889
 msgid "(signal detection error)"
 msgstr "(Chyba při rozpoznávání signálu)"
 
-#: engine_dialog.cc:2818
+#: engine_dialog.cc:2895
 msgid "(inverted - bad wiring)"
 msgstr "(obráceno - špatné kabelování)"
 
-#: engine_dialog.cc:2865
+#: engine_dialog.cc:2942
 msgid "(averaging)"
 msgstr "(průměrný)"
 
-#: engine_dialog.cc:2871
+#: engine_dialog.cc:2948
 msgid "(too large jitter)"
 msgstr "(příliš velké chvění)"
 
-#: engine_dialog.cc:2875
+#: engine_dialog.cc:2952
 msgid "(large jitter)"
 msgstr "(velké chvění)"
 
-#: engine_dialog.cc:2887
+#: engine_dialog.cc:2964
 msgid "Timeout - large MIDI jitter."
 msgstr "Překročení času - velký neklid MIDI"
 
-#: engine_dialog.cc:2903 port_insert_ui.cc:134
+#: engine_dialog.cc:2980 port_insert_ui.cc:134
 msgid "Detecting ..."
 msgstr "Zjišťuje se..."
 
-#: engine_dialog.cc:3004
+#: engine_dialog.cc:3081
 msgid "Disconnect from %1"
 msgstr "Odpojit od %1"
 
-#: engine_dialog.cc:3009
+#: engine_dialog.cc:3086
 msgid "Running"
 msgstr "Běží"
 
-#: engine_dialog.cc:3011
+#: engine_dialog.cc:3088
 msgid "Connected"
 msgstr "Připojeno"
 
-#: engine_dialog.cc:3022
+#: engine_dialog.cc:3099
 msgid "Connect to %1"
 msgstr "Připojit k %1"
 
-#: engine_dialog.cc:3026 shuttle_control.cc:614
+#: engine_dialog.cc:3103 shuttle_control.cc:655
 msgid "Stopped"
 msgstr "Zastaveno"
 
-#: export_channel_selector.cc:51 sfdb_ui.cc:151
+#: export_channel_selector.cc:46 export_report.cc:159 export_report.cc:324
+#: sfdb_ui.cc:151
 msgid "Channels:"
 msgstr "Kanály:"
 
-#: export_channel_selector.cc:52
+#: export_channel_selector.cc:47
 msgid "Split to mono files"
 msgstr "Rozdělit na monofonní soubory"
 
@@ -6661,63 +7009,63 @@ msgstr "Rozdělit na monofonní soubory"
 msgid "Bus or Track"
 msgstr "Sběrnice nebo stopa"
 
-#: export_channel_selector.cc:473
+#: export_channel_selector.cc:474
 msgid "Region contents without fades nor region gain (channels: %1)"
 msgstr "Obsah oblasti bez slábnutí ani síla hlasitost oblasti (kanály: %1)"
 
-#: export_channel_selector.cc:477
+#: export_channel_selector.cc:478
 msgid "Region contents with fades and region gain (channels: %1)"
 msgstr "Obsah oblasti se slábnutím a síla hlasitost oblasti (kanály: %1)"
 
-#: export_channel_selector.cc:481
+#: export_channel_selector.cc:482
 msgid "Track output (channels: %1)"
 msgstr "Výstup stopy (kanály: %1)"
 
-#: export_channel_selector.cc:550
+#: export_channel_selector.cc:552
 msgid "Apply track/bus processing"
 msgstr "Použít zpracování stopy/sběrnice"
 
-#: export_channel_selector.cc:551
+#: export_channel_selector.cc:553
 msgid "Select all tracks"
 msgstr "Vybrat všechny stopy"
 
-#: export_channel_selector.cc:552
+#: export_channel_selector.cc:554
 msgid "Select all busses"
 msgstr "Vybrat všechny sběrnice"
 
-#: export_channel_selector.cc:553
+#: export_channel_selector.cc:555
 msgid "Deselect all"
 msgstr "Odznačit vše"
 
-#: export_channel_selector.cc:587
+#: export_channel_selector.cc:589
 msgid "Track name"
 msgstr "Název stopy"
 
-#: export_dialog.cc:46
+#: export_dialog.cc:48
 msgid ""
 "<span color=\"#ffa755\">Some already existing files will be overwritten.</"
 "span>"
 msgstr ""
 "<span color=\"#ffa755\">Některé již jsoucí soubory budou přepsány.</span>"
 
-#: export_dialog.cc:47
+#: export_dialog.cc:49
 msgid "List files"
 msgstr "Vypsat soubory"
 
-#: export_dialog.cc:156 export_format_dialog.cc:59
+#: export_dialog.cc:158 export_format_dialog.cc:67
 msgid "File format"
 msgstr "Souborový formát"
 
-#: export_dialog.cc:157 export_timespan_selector.cc:371
+#: export_dialog.cc:159 export_timespan_selector.cc:371
 #: export_timespan_selector.cc:433
 msgid "Time Span"
 msgstr "Časové rozpětí"
 
-#: export_dialog.cc:158
+#: export_dialog.cc:160
 msgid "Channels"
 msgstr "Kanály"
 
-#: export_dialog.cc:180
+#: export_dialog.cc:182
 msgid ""
 "Export has been aborted due to an error!\n"
 "See the Log for details."
@@ -6725,39 +7073,51 @@ msgstr ""
 "Vyvedení bylo přerušeno kvůli chybě!\n"
 "Na podrobnosti se podívejte do zápisu."
 
-#: export_dialog.cc:249
+#: export_dialog.cc:251
 msgid "Files that will be overwritten"
 msgstr "Soubory, které budou přepsány"
 
-#: export_dialog.cc:294
+#: export_dialog.cc:296
 msgid "Export initialization failed: %1"
 msgstr "Inicializace vyvedení se nezdařila: %1"
 
-#: export_dialog.cc:304
+#: export_dialog.cc:306
 msgid "Stop Export"
 msgstr "Zastavit vyvedení"
 
-#: export_dialog.cc:325
+#: export_dialog.cc:336
 msgid "export"
 msgstr "Vyvést"
 
-#: export_dialog.cc:344
+#: export_dialog.cc:355
+msgid "Exporting '%3' (timespan %1 of %2)"
+msgstr "Vyvádí se '%3' (časové rozpětí %1 z %2)"
+
+#: export_dialog.cc:360
 msgid "Normalizing '%3' (timespan %1 of %2)"
 msgstr "Normalizuje se  '%3' (časové rozpětí %1 z %2)"
 
-#: export_dialog.cc:348
-msgid "Exporting '%3' (timespan %1 of %2)"
-msgstr "Vyvádí se '%3' (časové rozpětí %1 z %2)"
+#: export_dialog.cc:365
+msgid "Tagging '%3' (timespan %1 of %2)"
+msgstr ""
+
+#: export_dialog.cc:369
+msgid "Uploading '%3' (timespan %1 of %2)"
+msgstr ""
+
+#: export_dialog.cc:373
+msgid "Running Post Export Command for '%1'"
+msgstr ""
 
-#: export_dialog.cc:371 export_dialog.cc:373
+#: export_dialog.cc:401 export_dialog.cc:403
 msgid "<span color=\"#ffa755\">Error: "
 msgstr "<span color=\"#ffa755\">Chyba: "
 
-#: export_dialog.cc:383
+#: export_dialog.cc:413
 msgid "<span color=\"#ffa755\">Warning: "
 msgstr "<span color=\"#ffa755\">Varování: "
 
-#: export_dialog.cc:385
+#: export_dialog.cc:415
 msgid ""
 "\n"
 "<span color=\"#ffa755\">Warning: "
@@ -6765,19 +7125,19 @@ msgstr ""
 "\n"
 "<span color=\"#ffa755\">Varování: "
 
-#: export_dialog.cc:409
+#: export_dialog.cc:439
 msgid "Export Selection"
 msgstr "Vyvést výběr"
 
-#: export_dialog.cc:423
+#: export_dialog.cc:453
 msgid "Export Region"
 msgstr "Vyvést oblast"
 
-#: export_dialog.cc:432
+#: export_dialog.cc:462
 msgid "Source"
 msgstr "Zdroj"
 
-#: export_dialog.cc:448
+#: export_dialog.cc:478
 msgid "Stem Export"
 msgstr "Zastavit vyvedení"
 
@@ -6785,65 +7145,77 @@ msgstr "Zastavit vyvedení"
 msgid "Add another format"
 msgstr "Přidat další formát"
 
-#: export_file_notebook.cc:193
+#: export_file_notebook.cc:198
 msgid "Format"
 msgstr "Formát"
 
-#: export_file_notebook.cc:194
+#: export_file_notebook.cc:199
 msgid "Location"
 msgstr "Poloha"
 
-#: export_file_notebook.cc:195
+#: export_file_notebook.cc:200
 msgid "Upload to Soundcloud"
 msgstr "Nahrát na Soundcloud"
 
-#: export_file_notebook.cc:273
+#: export_file_notebook.cc:201
+msgid "Analyze Exported Audio"
+msgstr ""
+
+#: export_file_notebook.cc:286
 msgid "No format!"
 msgstr "Žádný formát"
 
-#: export_file_notebook.cc:291
+#: export_file_notebook.cc:304
 msgid "Format %1: %2"
 msgstr "Formát %1: %2"
 
-#: export_filename_selector.cc:32
+#: export_filename_selector.cc:33
 msgid "Label:"
 msgstr "Štítek:"
 
-#: export_filename_selector.cc:33 session_dialog.cc:310
+#: export_filename_selector.cc:34 session_dialog.cc:310
 msgid "Session Name"
 msgstr "Název sezení"
 
-#: export_filename_selector.cc:34
+#: export_filename_selector.cc:35
+msgid "Timespan Name"
+msgstr ""
+
+#: export_filename_selector.cc:36
 msgid "Revision:"
 msgstr "Změna:"
 
-#: export_filename_selector.cc:36
+#: export_filename_selector.cc:38
 msgid "Folder:"
 msgstr "Složka:"
 
-#: export_filename_selector.cc:37 session_import_dialog.cc:45
+#: export_filename_selector.cc:39 session_import_dialog.cc:45
 #: transcode_video_dialog.cc:59 video_server_dialog.cc:54
 #: video_server_dialog.cc:56 export_video_dialog.cc:77
 #: export_video_dialog.cc:79
 msgid "Browse"
 msgstr "Procházet"
 
-#: export_filename_selector.cc:41
-msgid "<i>Build filename(s) from these components:</i>"
-msgstr "<i>Názvy souborů sestavit z těchto součástí:</i>"
+#: export_filename_selector.cc:40 export_report.cc:118
+msgid "Open Folder"
+msgstr ""
+
+#: export_filename_selector.cc:45
+msgid "Build filename(s) from these components:"
+msgstr ""
 
-#: export_filename_selector.cc:208
+#: export_filename_selector.cc:217
 msgid ""
 "<small><i>Sorry, no example filename can be shown at the moment</i></small>"
 msgstr ""
 "<small><i>Promiňte. Právě teď nelze ukázat žádný příklad názvu souboru</i></"
 "small>"
 
-#: export_filename_selector.cc:210
-msgid "<small><i>Current (approximate) filename: \"%1\"</i></small>"
-msgstr "<small><i>Nynější (přibližný) název souboru: \"%1\"</i></small>"
+#: export_filename_selector.cc:219
+msgid "<i>Current (approximate) filename</i>: \"%1\""
+msgstr ""
 
-#: export_filename_selector.cc:246 export_filename_selector.cc:332
+#: export_filename_selector.cc:255 export_filename_selector.cc:402
 msgid ""
 "%1: this is only the directory/folder name, not the filename.\n"
 "The filename will be chosen from the information just above the folder "
@@ -6852,111 +7224,167 @@ msgstr ""
 "%1: Toto je jen název adresáře/složky, ne název souboru.\n"
 "Název souboru bude vybrán z informací nad voličem složky."
 
-#: export_filename_selector.cc:318
+#: export_filename_selector.cc:378
+msgid "%1: this is not a valid directory/folder."
+msgstr ""
+
+#: export_filename_selector.cc:388
 msgid "Choose export folder"
 msgstr "Vybrat složku pro vyvedení"
 
-#: export_format_dialog.cc:31
+#: export_format_dialog.cc:32
 msgid "New Export Format Profile"
 msgstr "Nový vyváděcí profil formátu"
 
-#: export_format_dialog.cc:31
+#: export_format_dialog.cc:32
 msgid "Edit Export Format Profile"
 msgstr "Upravit vyváděcí profil formátu"
 
-#: export_format_dialog.cc:38
+#: export_format_dialog.cc:39
 msgid "Label: "
 msgstr "Štítek: "
 
-#: export_format_dialog.cc:41 normalize_dialog.cc:42
-msgid "Normalize to:"
-msgstr "Normalizovat:"
+#: export_format_dialog.cc:42
+msgid "Normalize:"
+msgstr ""
+
+#: export_format_dialog.cc:43
+msgid "Peak"
+msgstr "Vrchol"
 
-#: export_format_dialog.cc:46
+#: export_format_dialog.cc:44
+msgid "Loudness"
+msgstr ""
+
+#: export_format_dialog.cc:50
+msgid "LUFS"
+msgstr ""
+
+#: export_format_dialog.cc:51
+msgid "dBTP"
+msgstr ""
+
+#: export_format_dialog.cc:54
 msgid "Trim silence at start"
 msgstr "Ustřihnout ticho na začátku"
 
-#: export_format_dialog.cc:47
+#: export_format_dialog.cc:55
 msgid "Add silence at start:"
 msgstr "Přidat ticho na začátku:"
 
-#: export_format_dialog.cc:50
+#: export_format_dialog.cc:58
 msgid "Trim silence at end"
 msgstr "Ustřihnout ticho na konci"
 
-#: export_format_dialog.cc:51
+#: export_format_dialog.cc:59
 msgid "Add silence at end:"
 msgstr "Přidat ticho na konci:"
 
-#: export_format_dialog.cc:54
+#: export_format_dialog.cc:62
 msgid ""
 "Command to run post-export\n"
-"(%f=full path & filename, %d=directory, %b=basename):"
+"(%f=file path, %d=directory, %b=basename, see tooltip for more):"
 msgstr ""
-"Příkaz, který se má provést po vyvedení\n"
-"(%f=full path & filename, %d=directory, %b=basename):"
 
-#: export_format_dialog.cc:57
+#: export_format_dialog.cc:65
 msgid "Compatibility"
 msgstr "Slučitelnost"
 
-#: export_format_dialog.cc:58
+#: export_format_dialog.cc:66
 msgid "Quality"
 msgstr "Kvalita"
 
-#: export_format_dialog.cc:61
+#: export_format_dialog.cc:69
 msgid "Sample rate conversion quality:"
 msgstr "Kvalita převodu vzorkovacího kmitočtu:"
 
-#: export_format_dialog.cc:68
+#: export_format_dialog.cc:76
 msgid "Dithering"
 msgstr "Vložení šumu do signálu"
 
-#: export_format_dialog.cc:70
+#: export_format_dialog.cc:78
 msgid "Create CUE file for disk-at-once CD/DVD creation"
 msgstr "Vytvořit soubor CUE pro okamžité vytvoření disku CD/DVD"
 
-#: export_format_dialog.cc:71
+#: export_format_dialog.cc:79
 msgid "Create TOC file for disk-at-once CD/DVD creation"
 msgstr "Vytvořit soubor TOC pro okamžité vytvoření disku CD/DVD"
 
-#: export_format_dialog.cc:72
+#: export_format_dialog.cc:80
 msgid "Create chapter mark file for MP4 chapter marks"
 msgstr "Vytvořit soubor se značkou kapitoly pro značky kapitol MP4"
 
-#: export_format_dialog.cc:74
+#: export_format_dialog.cc:82
 msgid "Tag file with session's metadata"
 msgstr "Označit soubor popisnými daty k sezení"
 
-#: export_format_dialog.cc:474
+#: export_format_dialog.cc:119
+msgid "∧"
+msgstr ""
+
+#: export_format_dialog.cc:124
+msgid ""
+"Normalize to EBU-R128 LUFS target loudness without exceeding the given true-"
+"peak limit. EBU-R128 normalization is only available for mono and stereo "
+"targets, true-peak works for any channel layout."
+msgstr ""
+
+#: export_format_dialog.cc:152
+msgid ""
+"%a Artist name\n"
+"%b File's base-name\n"
+"%c Copyright\n"
+"%d File's directory\n"
+"%f File's full absolute path\n"
+"%l Lyricist\n"
+"%n Session name\n"
+"%o Conductor\n"
+"%t Title\n"
+"%z Organization\n"
+"%A Album\n"
+"%C Comment\n"
+"%E Engineer\n"
+"%G Genre\n"
+"%L Total track count\n"
+"%M Mixer\n"
+"%N Timespan name\n"
+"%O Composer\n"
+"%P Producer\n"
+"%S Disc subtitle\n"
+"%T Track number\n"
+"%Y Year\n"
+"%Z Country"
+msgstr ""
+
+#: export_format_dialog.cc:537
 msgid "Best (sinc)"
 msgstr "Nejlepší (sinc)"
 
-#: export_format_dialog.cc:479
+#: export_format_dialog.cc:542
 msgid "Medium (sinc)"
 msgstr "Střední (sinc)"
 
-#: export_format_dialog.cc:484
+#: export_format_dialog.cc:547
 msgid "Fast (sinc)"
 msgstr "Rychlé (sinc)"
 
-#: export_format_dialog.cc:494
+#: export_format_dialog.cc:557
 msgid "Zero order hold"
 msgstr "Držení řádu nuly"
 
-#: export_format_dialog.cc:904
+#: export_format_dialog.cc:981
 msgid "Linear encoding options"
 msgstr "Přímé volby kódování"
 
-#: export_format_dialog.cc:920
+#: export_format_dialog.cc:997
 msgid "Ogg Vorbis options"
 msgstr "Volby pro Ogg Vorbis"
 
-#: export_format_dialog.cc:931
+#: export_format_dialog.cc:1008
 msgid "FLAC options"
 msgstr "Volby pro FLAC"
 
-#: export_format_dialog.cc:948
+#: export_format_dialog.cc:1025
 msgid "Broadcast Wave options"
 msgstr "Volby pro Broadcast Wave"
 
@@ -6973,18 +7401,189 @@ msgid ""
 "The selected preset did not load successfully!\n"
 "Perhaps it references a format that has been removed?"
 msgstr ""
-"Vybrané přednastavení nebylo nahráno úspěšně!\n"
-"Možná zmiňuje formát, který byl odstraněn?"
+"Vybrané přednastavení nebylo nahráno úspěšně!\n"
+"Možná zmiňuje formát, který byl odstraněn?"
+
+#: export_preset_selector.cc:151
+msgid "Do you really want to remove this preset?"
+msgstr "Opravdu chcete odstranit toto přednastavení?"
+
+#: export_report.cc:56
+msgid "Export Report/Analysis"
+msgstr ""
+
+#: export_report.cc:147 export_report.cc:327 sfdb_ui.cc:149
+msgid "Format:"
+msgstr "Formát:"
+
+#: export_report.cc:166 export_report.cc:328
+msgid "%1 Hz"
+msgstr ""
+
+#: export_report.cc:169 export_report.cc:336 transcode_video_dialog.cc:139
+msgid "Duration:"
+msgstr "Doba trvání"
+
+#: export_report.cc:177 export_report.cc:334
+msgid "Timecode:"
+msgstr ""
+
+#: export_report.cc:185
+msgid "Error:"
+msgstr ""
+
+#: export_report.cc:220 export_report.cc:440
+msgid "(too short integration time)"
+msgstr ""
+
+#: export_report.cc:222
+msgid "-888"
+msgstr ""
+
+#: export_report.cc:227 export_report.cc:353
+msgid "Peak:"
+msgstr ""
+
+#: export_report.cc:228 export_report.cc:360
+msgid "%1 dBFS"
+msgstr ""
+
+#: export_report.cc:229 export_report.cc:369
+msgid "True Peak:"
+msgstr ""
+
+#: export_report.cc:230 export_report.cc:376
+msgid "%1 dBTP"
+msgstr ""
+
+#: export_report.cc:231 export_report.cc:387
+msgid "Normalization Gain:"
+msgstr ""
+
+#: export_report.cc:232
+msgid "+888.88 dB"
+msgstr ""
+
+#: export_report.cc:234 export_report.cc:448
+msgid "Integrated Loudness:"
+msgstr ""
+
+#: export_report.cc:235 export_report.cc:454
+msgid "%1 LUFS"
+msgstr ""
+
+#: export_report.cc:236 export_report.cc:460
+msgid "Loudness Range:"
+msgstr ""
+
+#: export_report.cc:237 export_report.cc:466
+msgid "%1 LU"
+msgstr ""
+
+#: export_report.cc:247 export_report.cc:754
+msgid "100"
+msgstr "100"
+
+#: export_report.cc:282 export_report.cc:650
+msgid "00:00:00.000"
+msgstr ""
+
+#: export_report.cc:288
+msgid "0|A8"
+msgstr ""
+
+#: export_report.cc:394
+msgid "%1 dB"
+msgstr ""
+
+#: export_report.cc:425 export_report.cc:433 export_report.cc:553
+msgid ""
+"Not\n"
+"Available"
+msgstr ""
+
+#: export_report.cc:493
+msgid ""
+"LUFS\n"
+"(short)"
+msgstr ""
+
+#: export_report.cc:503
+msgid "Multiplicity"
+msgstr ""
+
+#: export_report.cc:603
+msgid "Logscale|Lg"
+msgstr ""
+
+#: export_report.cc:604
+msgid "Rectified|Rf"
+msgstr ""
+
+#: export_report.cc:605
+msgid "Logscale"
+msgstr ""
+
+#: export_report.cc:606
+msgid "Rectified"
+msgstr ""
+
+#: export_report.cc:738
+msgid "Hz"
+msgstr ""
+
+#: export_report.cc:755
+msgid "500"
+msgstr ""
+
+#: export_report.cc:756
+msgid "1K"
+msgstr ""
+
+#: export_report.cc:757
+msgid "5K"
+msgstr ""
+
+#: export_report.cc:758
+msgid "10K"
+msgstr ""
+
+#: export_report.cc:844
+msgid "Writing Export Analysis Image: %1."
+msgstr ""
+
+#: export_report.cc:941 sfdb_ui.cc:293 sfdb_ui.cc:409
+msgid "Could not read file: %1 (%2)."
+msgstr "Soubor nelze přečíst: %1 (%2)."
+
+#: export_report.cc:967 sfdb_ui.cc:458
+msgid "Could not access soundfile: "
+msgstr "Nelze přistupovat ke zvukovému souboru: "
+
+#: export_report.cc:1203
+msgid "-36"
+msgstr ""
+
+#: export_report.cc:1204 export_report.cc:1208 export_report.cc:1214
+#: export_report.cc:1217
+msgid "-18"
+msgstr ""
+
+#: export_report.cc:1205 export_report.cc:1209 export_report.cc:1215
+#: export_report.cc:1218 export_report.cc:1221 export_report.cc:1222
+msgid "-9"
+msgstr ""
 
-#: export_preset_selector.cc:151
-msgid "Do you really want to remove this preset?"
-msgstr "Opravdu chcete odstranit toto přednastavení?"
+#: export_report.cc:1206 export_report.cc:1210 export_report.cc:1216
+#: export_report.cc:1219 export_report.cc:1223 export_report.cc:1224
+msgid "-3"
+msgstr ""
 
 #: export_timespan_selector.cc:44
 msgid "Show Times as:"
 msgstr "Ukázat časy jako:"
 
-#: export_timespan_selector.cc:51 processor_box.cc:2839
+#: export_timespan_selector.cc:51 processor_box.cc:3683
 msgid "Select All"
 msgstr "Vybrat vše"
 
@@ -7008,90 +7607,94 @@ msgstr "getSoundResourceFile: V souboru XML není platný kořen"
 msgid "getSoundResourceFile: root = %1, != response"
 msgstr "getSoundResourceFile: kořen = %1, != odezva"
 
-#: sfdb_freesound_mootcher.cc:410 rc_option_editor.cc:2276
+#: sfdb_freesound_mootcher.cc:410 rc_option_editor.cc:2416
 msgid "%1"
 msgstr "%1"
 
-#: gain_meter.cc:134 gain_meter.cc:402 gain_meter.cc:507 gain_meter.cc:898
+#: gain_meter.cc:137 gain_meter.cc:422 gain_meter.cc:527 gain_meter.cc:919
 msgid "-inf"
 msgstr "-inf"
 
-#: gain_meter.cc:149 gain_meter.cc:962
+#: gain_meter.cc:152 gain_meter.cc:983
 msgid "Fader automation mode"
 msgstr "Režim automatizace prolínače"
 
-#: gain_meter.cc:150 gain_meter.cc:963
+#: gain_meter.cc:153 gain_meter.cc:984
 msgid "Fader automation type"
 msgstr "Druh automatizace prolínače"
 
-#: gain_meter.cc:159 gain_meter.cc:831 panner_ui.cc:179 panner_ui.cc:641
+#: gain_meter.cc:162 gain_meter.cc:852 panner_ui.cc:179 panner_ui.cc:641
 msgid "Abs"
 msgstr "Abs"
 
-#: gain_meter.cc:795
+#: gain_meter.cc:816 vca_master_strip.cc:78 vca_time_axis.cc:54
 msgid "M"
 msgstr "Z"
 
-#: gain_meter.cc:798
+#: gain_meter.cc:819 vca_master_strip.cc:296
 msgid "P"
 msgstr "P"
 
-#: gain_meter.cc:801
+#: gain_meter.cc:822
 msgid "T"
 msgstr "D"
 
-#: gain_meter.cc:804
+#: gain_meter.cc:825
 msgid "W"
 msgstr "Z"
 
-#: generic_pluginui.cc:85
+#: generic_pluginui.cc:83
 msgid "<span size=\"large\">Presets</span>"
 msgstr "<span size=\"large\">Předvolby</span>"
 
-#: generic_pluginui.cc:100
+#: generic_pluginui.cc:98 plugin_pin_dialog.cc:333
 msgid "Manual"
 msgstr "Ruční"
 
-#: generic_pluginui.cc:109
+#: generic_pluginui.cc:107
 msgid "All Automation"
 msgstr "VÅ¡e automatizace"
 
-#: generic_pluginui.cc:253
-msgid "Switches"
-msgstr "Přepínače"
-
-#: generic_pluginui.cc:263 generic_pluginui.cc:439 processor_box.cc:2817
-msgid "Controls"
-msgstr "Ovládání"
-
-#: generic_pluginui.cc:296
+#: generic_pluginui.cc:250
 msgid "Plugin Editor: could not build control element for port %1"
 msgstr ""
 "Editor přídavných modulů: Nepodařilo se vytvořit prvek ovládání pro přípojku "
 "%1"
 
-#: generic_pluginui.cc:321
+#: generic_pluginui.cc:282
 msgid "Plugin Editor: no control for property %1"
 msgstr "Editor přídavných modulů: Žádné ovládání pro vlastnost %1"
 
-#: generic_pluginui.cc:327
+#: generic_pluginui.cc:288
 msgid "Plugin Editor: could not build control element for property %1"
 msgstr ""
 "Editor přídavných modulů: Nepodařilo se vytvořit prvek ovládání pro "
 "vlastnost %1"
 
-#: generic_pluginui.cc:471
+#: generic_pluginui.cc:359
+msgid "Switches"
+msgstr "Přepínače"
+
+#: generic_pluginui.cc:369 generic_pluginui.cc:475 processor_box.cc:3653
+msgid "Controls"
+msgstr "Ovládání"
+
+#: generic_pluginui.cc:510
 msgid "Meters"
 msgstr "Měřiče"
 
-#: generic_pluginui.cc:493
+#: generic_pluginui.cc:548
 msgid "Automation control"
 msgstr "Ovládání automatického systému"
 
-#: generic_pluginui.cc:500
+#: generic_pluginui.cc:555
 msgid "Mgnual"
 msgstr "Ručně prováděné"
 
+#: generic_pluginui.cc:828
+msgid "This control cannot be automated"
+msgstr ""
+
 #: global_port_matrix.cc:158
 msgid "Audio Connection Manager"
 msgstr "Správce zvukových spojení"
@@ -7100,8 +7703,9 @@ msgstr "Správce zvukových spojení"
 msgid "MIDI Connection Manager"
 msgstr "Správce MIDI spojení"
 
-#: global_port_matrix.cc:201 io_selector.cc:211 mixer_strip.cc:842
-#: mixer_strip.cc:943 monitor_section.cc:1393 monitor_selector.cc:189
+#: global_port_matrix.cc:201 io_selector.cc:211 mixer_strip.cc:863
+#: mixer_strip.cc:966 monitor_section.cc:1430 monitor_selector.cc:189
+#: plugin_pin_dialog.cc:1757
 msgid "Disconnect"
 msgstr "Odpojit"
 
@@ -7109,59 +7713,83 @@ msgstr "Odpojit"
 msgid "port"
 msgstr "Přípojka"
 
-#: group_tabs.cc:312
+#: group_tabs.cc:312 group_tabs.cc:321
 msgid "Selection..."
 msgstr "Výběr..."
 
-#: group_tabs.cc:313
+#: group_tabs.cc:313 group_tabs.cc:322
 msgid "Record Enabled..."
 msgstr "Nahrávání povoleno..."
 
-#: group_tabs.cc:314
+#: group_tabs.cc:314 group_tabs.cc:323
 msgid "Soloed..."
 msgstr "Sólo..."
 
-#: group_tabs.cc:321
+#: group_tabs.cc:316
+msgid "Create New Group From..."
+msgstr ""
+
+#: group_tabs.cc:325
+msgid "Create New Group with Master From..."
+msgstr ""
+
+#: group_tabs.cc:344
 msgid "Create New Group ..."
 msgstr "Vytvořit novou skupinu..."
 
-#: group_tabs.cc:324
-msgid "Create New Group From"
-msgstr "Vytvořit novou skupinu z"
+#: group_tabs.cc:345
+msgid "Create New Group with Control Master ..."
+msgstr ""
 
-#: group_tabs.cc:327
+#: group_tabs.cc:355
 msgid "Edit Group..."
 msgstr "Upravit skupinu..."
 
-#: group_tabs.cc:328
+#: group_tabs.cc:356
 msgid "Collect Group"
 msgstr "Sebrat skupinu"
 
-#: group_tabs.cc:329
+#: group_tabs.cc:357
 msgid "Remove Group"
 msgstr "Odstranit skupinu"
 
-#: group_tabs.cc:332
+#: group_tabs.cc:368
+msgid "Assign Group to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:374
 msgid "Remove Subgroup Bus"
 msgstr "Odstranit sběrnici podskupiny"
 
-#: group_tabs.cc:334
+#: group_tabs.cc:376
 msgid "Add New Subgroup Bus"
 msgstr "Přidat novou sběrnici podskupiny"
 
-#: group_tabs.cc:336
+#: group_tabs.cc:378
 msgid "Add New Aux Bus (pre-fader)"
 msgstr "Přidat novou pomocnou sběrnici (před-prolínač)"
 
-#: group_tabs.cc:337
+#: group_tabs.cc:379
 msgid "Add New Aux Bus (post-fader)"
 msgstr "Přidat novou pomocnou sběrnici (po-prolínač)"
 
-#: group_tabs.cc:343
+#: group_tabs.cc:404
+msgid "Assign Selection to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:415
+msgid "Assign Record Enabled to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:426
+msgid "Assign Soloed to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:429
 msgid "Enable All Groups"
 msgstr "Povolit všechny skupiny"
 
-#: group_tabs.cc:344
+#: group_tabs.cc:430
 msgid "Disable All Groups"
 msgstr "Zakázat všechny skupiny"
 
@@ -7225,11 +7853,15 @@ msgstr "Odstranit čas"
 msgid "Insert time"
 msgstr "Vložit čas"
 
-#: instrument_selector.cc:62
+#: insert_remove_time_dialog.cc:174
+msgid "Invalid or zero duration entered. Please enter a valid duration"
+msgstr ""
+
+#: instrument_selector.cc:92
 msgid "-none-"
 msgstr "-žádná-"
 
-#: interthread_progress_window.cc:104
+#: interthread_progress_window.cc:114
 msgid "Importing file: %1 of %2"
 msgstr "Zavádí se soubor: %1 z %2"
 
@@ -7245,62 +7877,86 @@ msgstr "%1 vstup"
 msgid "%1 output"
 msgstr "%1 výstup"
 
-#: keyboard.cc:82
+#: keyboard.cc:93
 msgid "your own"
 msgstr "Vaše vlastní"
 
-#: keyboard.cc:145 keyboard.cc:169
+#: keyboard.cc:157 keyboard.cc:181
 msgid "Default keybindings not found - %1 will be hard to use!"
 msgstr ""
 "Nebylo nalezeno obvyklé rozložení klávesnice. Bude složité %1 používat!"
 
-#: keyboard.cc:148
+#: keyboard.cc:160
 msgid "Key bindings file \"%1\" not found. Default bindings used instead"
 msgstr ""
 "Soubor \"%1\" pro klávesové zkratky nebyl nalezen. Místo toho se bude "
 "používat obvyklé rozložení klávesnice."
 
-#: keyeditor.cc:54
+#: keyboard.cc:193
+msgid "Loading keybindings from %1"
+msgstr ""
+
+#: keyeditor.cc:67
+msgid "Colliding keybindings"
+msgstr ""
+
+#: keyeditor.cc:68
+msgid ""
+"The key sequence is already bound. Please remove the other binding first."
+msgstr ""
+
+#: keyeditor.cc:77
+msgid "Key Bindings"
+msgstr "Klávesové zkratky"
+
+#: keyeditor.cc:78
 msgid "Remove shortcut"
 msgstr "Odstranit klávesovou zkratku"
 
-#: keyeditor.cc:63
-msgid "Action"
-msgstr "Krok"
+#: keyeditor.cc:80
+msgid "Search..."
+msgstr ""
 
-#: keyeditor.cc:64
-msgid "Shortcut"
-msgstr "Klávesová zkratka"
+#: keyeditor.cc:82
+msgid "Print"
+msgstr ""
+
+#: keyeditor.cc:93
+msgid "Click to reset search string"
+msgstr ""
 
-#: keyeditor.cc:84
-msgid "Select an action, then press the key(s) to (re)set its shortcut"
+#: keyeditor.cc:97
+msgid "To remove a shortcut select an action then press this: "
 msgstr ""
-"Vyberte nějaký krok a následně stiskněte klávesu(y) \n"
-"kvůli (pře)nastavení klávesové zkratky"
 
-#: keyeditor.cc:98
+#: keyeditor.cc:109
 msgid "Reset Bindings to Defaults"
 msgstr "Nastavit zkratky zpět na výchozí"
 
-#: keyeditor.cc:263
-msgid "Main_menu"
-msgstr "Hlavní nabídka"
-
-#: keyeditor.cc:265
-msgid "redirectmenu"
-msgstr "Přesměrování nabídky"
+#: keyeditor.cc:227 lua_script_manager.cc:41
+msgid "Action"
+msgstr "Krok"
 
-#: keyeditor.cc:267
-msgid "Editor_menus"
-msgstr "Editor nabídek"
+#: keyeditor.cc:228
+msgid "Shortcut"
+msgstr "Klávesová zkratka"
 
-#: keyeditor.cc:269
+#: keyeditor.cc:370
 msgid "RegionList"
 msgstr "Seznam oblasti"
 
-#: keyeditor.cc:271
-msgid "ProcessorMenu"
-msgstr "Nabídka zpracování"
+#: keyeditor.cc:543
+msgid "Could not open temporary file to print bindings (%1)"
+msgstr ""
+
+#: keyeditor.cc:561
+msgid "Could not save bindings to file (%1)"
+msgstr ""
+
+#: latency_gui.cc:39
+#, fuzzy
+msgid "sample"
+msgstr "Vzorek"
 
 #: latency_gui.cc:40
 msgid "msec"
@@ -7310,37 +7966,36 @@ msgstr "ms"
 msgid "period"
 msgstr "Údobí"
 
-#: latency_gui.cc:55
-msgid "%1 sample"
-msgid_plural "%1 samples"
-msgstr[0] "%1 vzorek"
-msgstr[1] "%1 vzorků"
-
-#: latency_gui.cc:72 panner_ui.cc:411 plugin_ui.cc:421
+#: latency_gui.cc:72 panner_ui.cc:411 plugin_pin_dialog.cc:109
+#: plugin_ui.cc:421
 msgid "Reset"
 msgstr "Nastavit znovu"
 
-#: latency_gui.cc:149 rhythm_ferret.cc:273 sfdb_ui.cc:1909
+#: latency_gui.cc:149 rhythm_ferret.cc:295 sfdb_ui.cc:1878
 msgid "programming error: %1 (%2)"
 msgstr "Chyba v programování: %1 (%2)"
 
-#: location_ui.cc:54 location_ui.cc:56
+#: location_ui.cc:54 location_ui.cc:57
 msgid "Use PH"
 msgstr "Použít PH"
 
-#: location_ui.cc:61
+#: location_ui.cc:55 location_ui.cc:58
+msgid "Goto"
+msgstr ""
+
+#: location_ui.cc:63
 msgid "Glue"
 msgstr "Přilepit"
 
-#: location_ui.cc:89
+#: location_ui.cc:88
 msgid "Performer:"
 msgstr "Účinkující:"
 
-#: location_ui.cc:90
+#: location_ui.cc:89
 msgid "Composer:"
 msgstr "Skladatel:"
 
-#: location_ui.cc:92
+#: location_ui.cc:91
 msgid "Pre-Emphasis"
 msgstr "Předzdůraznění"
 
@@ -7376,43 +8031,153 @@ msgstr "Poloha - klepnutí prostředním tlačítkem myši pro postavení se sem
 msgid "Set marker time from playhead location"
 msgstr "Nastavit čas značky z místa ukazatele polohy"
 
-#: location_ui.cc:501
+#: location_ui.cc:524
 msgid "You cannot put a CD marker at the start of the session"
 msgstr "Na začátku sezení nemůžete zřídit žádnou značku na CD"
 
-#: location_ui.cc:727
+#: location_ui.cc:750
 msgid "New Marker"
 msgstr "Nová značka"
 
-#: location_ui.cc:728
+#: location_ui.cc:751
 msgid "New Range"
 msgstr "Nový rozsah"
 
-#: location_ui.cc:741
+#: location_ui.cc:764
 msgid "<b>Loop/Punch Ranges</b>"
 msgstr "<b>Rozsahy smyčky/přepsání</b>"
 
-#: location_ui.cc:766
+#: location_ui.cc:790
 msgid "<b>Markers (Including CD Index)</b>"
 msgstr "<b>Značky (včetně rejstříku CD)</b>"
 
-#: location_ui.cc:801
+#: location_ui.cc:825
 msgid "<b>Ranges (Including CD Track Ranges)</b>"
 msgstr "<b>Značky (včetně rozsahů stop CD)</b>"
 
-#: location_ui.cc:1044
+#: location_ui.cc:1068
 msgid "add range marker"
 msgstr "Přidat značku rozsahu"
 
-#: main.cc:86
+#: lua_script_manager.cc:31
+msgid "Add/Set"
+msgstr ""
+
+#: lua_script_manager.cc:34
+msgid "Call"
+msgstr ""
+
+#: lua_script_manager.cc:35
+msgid "New Hook"
+msgstr ""
+
+#: lua_script_manager.cc:77
+msgid "Signal(s)"
+msgstr ""
+
+#: lua_script_manager.cc:127
+msgid "Action %1"
+msgstr ""
+
+#: lua_script_manager.cc:132 lua_script_manager.cc:227
+msgid "Unset"
+msgstr ""
+
+#: luainstance.cc:1079
+msgid "Cannot read script '%1': %2"
+msgstr ""
+
+#: luawindow.cc:97
+msgid "Run"
+msgstr ""
+
+#: luawindow.cc:98
+msgid "Clear Output"
+msgstr ""
+
+#: luawindow.cc:102
+msgid "Revert"
+msgstr ""
+
+#: luawindow.cc:166
+msgid "Select Editor Buffer"
+msgstr ""
+
+#: luawindow.cc:253 luawindow.cc:258
+msgid "Window|Lua"
+msgstr ""
+
+#: luawindow.cc:286 luawindow.cc:304
+msgid "LuaException: %1"
+msgstr ""
+
+#: luawindow.cc:342
+msgid "Deleted %1"
+msgstr ""
+
+#: luawindow.cc:345
+msgid "Failed to delete %1"
+msgstr ""
+
+#: luawindow.cc:411
+msgid ""
+"Missing script header.\n"
+"The script requires an '{ardour}' info table and a 'factory' function."
+msgstr ""
+
+#: luawindow.cc:416
+msgid "Script fails to compile."
+msgstr ""
+
+#: luawindow.cc:423
+msgid "Invalid or missing script-name or script-type."
+msgstr ""
+
+#: luawindow.cc:428
+msgid ""
+"Invalid script-type.\n"
+"Valid types are 'EditorAction' and 'Snippet'."
+msgstr ""
+
+#: luawindow.cc:439 luawindow.cc:490
+msgid "Saved as %1"
+msgstr ""
+
+#: luawindow.cc:442 luawindow.cc:493
+msgid "Error saving file: %1"
+msgstr ""
+
+#: luawindow.cc:452
+msgid ""
+"Script with given name '%1' already exists.\n"
+"Use a different name in the descriptor."
+msgstr ""
+
+#: luawindow.cc:636
+msgid "Scratch Buffer %1"
+msgstr ""
+
+#: luawindow.cc:638
+msgid "Action: '%1'"
+msgstr ""
+
+#: luawindow.cc:640
+msgid "Snippet: %1"
+msgstr ""
+
+#: luawindow.cc:652
+msgid "Save as"
+msgstr ""
+
+#: main.cc:88
 msgid "%1 could not connect to the audio backend."
 msgstr "%1 se nepodařilo se spojit s podpůrnou vrstvou zvuku.."
 
-#: main.cc:133 main.cc:149
+#: main.cc:135 main.cc:151
 msgid "The audio backend (%1) has failed, or terminated"
 msgstr "Podpůrná vrstva zvuku (%1) selhala, nebo byla ukončena"
 
-#: main.cc:136
+#: main.cc:138
 msgid ""
 "%2 exited unexpectedly, and without notifying %1.\n"
 "\n"
@@ -7426,11 +8191,11 @@ msgstr ""
 "\n"
 "Klepněte na OK pro ukončení %1."
 
-#: main.cc:150
+#: main.cc:152
 msgid "%2 exited unexpectedly, and without notifying %1."
 msgstr "%2 byla neočekávaně a bez oznámení %1 ukončena."
 
-#: main.cc:245
+#: main.cc:247
 msgid ""
 "\n"
 "   %1 could not understand your command line      "
@@ -7438,23 +8203,23 @@ msgstr ""
 "\n"
 "   %1 se nepodařilo porozumět vašemu příkazovému řádku "
 
-#: main.cc:247
+#: main.cc:249
 msgid "An error was encountered while launching %1"
 msgstr "Při spouštění %1 nastala chyba"
 
-#: main.cc:340
+#: main.cc:344
 msgid " (built using "
 msgstr " (sestaveno s verzí "
 
-#: main.cc:343
+#: main.cc:347
 msgid " and GCC version "
 msgstr " a GCC verze "
 
-#: main.cc:353
+#: main.cc:357
 msgid "Copyright (C) 1999-2015 Paul Davis"
 msgstr "Autorské právo (C) 1999-2015 Paul Davis"
 
-#: main.cc:354
+#: main.cc:358
 msgid ""
 "Some portions Copyright (C) Steve Harris, Ari Johnson, Brett Viren, Joel "
 "Baker, Robin Gareus"
@@ -7462,35 +8227,35 @@ msgstr ""
 "Některé části: autorské právo (C) Steve Harris, Ari Johnson, Brett Viren, "
 "Joel Baker, Robin Gareus"
 
-#: main.cc:356
+#: main.cc:360
 msgid "%1 comes with ABSOLUTELY NO WARRANTY"
 msgstr "%1 je poskytován bez NAPROSTO ŽÁDNÉ ZÁRUKY"
 
-#: main.cc:357
+#: main.cc:361
 msgid "not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
 msgstr "ani pro vhodnost pro OBCHOD nebo způsobilost pro ZVLÁŠTNÍ POUŽÍVÁNÍ."
 
-#: main.cc:358
+#: main.cc:362
 msgid "This is free software, and you are welcome to redistribute it "
 msgstr "Je to svobodný program a vaše pomoc s jeho dalším šířením je vítána"
 
-#: main.cc:359
+#: main.cc:363
 msgid "under certain conditions; see the source for copying conditions."
 msgstr "dokud dbáte na určité podmínky, které jsou uvedeny v souboru COPYING."
 
-#: main.cc:364
+#: main.cc:368
 msgid "could not initialize %1."
 msgstr "Nepodařilo se zapnout %1."
 
-#: main.cc:374
+#: main.cc:378
 msgid "Cannot xinstall SIGPIPE error handler"
 msgstr "Nelze nainstalovat SIGPIPE, který má na starosti chyby"
 
-#: main.cc:379
+#: main.cc:385
 msgid "Could not complete pre-GUI initialization"
 msgstr "Nepodařilo se dokončit zapnutí (pre-GUI)"
 
-#: main.cc:386
+#: main.cc:392
 msgid "could not create %1 GUI"
 msgstr "Nepodařilo se vytvořit obrazové uživatelské rozhraní k %1"
 
@@ -7498,11 +8263,11 @@ msgstr "Nepodařilo se vytvořit obrazové uživatelské rozhraní k %1"
 msgid "Display delta to edit cursor"
 msgstr "Zobrazit deltu pro úpravu ukazovátka"
 
-#: main_clock.cc:66 tempo_dialog.cc:54
+#: main_clock.cc:66 tempo_dialog.cc:55
 msgid "Edit Tempo"
 msgstr "Upravit tempo"
 
-#: main_clock.cc:67 tempo_dialog.cc:326
+#: main_clock.cc:67 tempo_dialog.cc:429
 msgid "Edit Meter"
 msgstr "Upravit metrum"
 
@@ -7519,8 +8284,8 @@ msgid "MarkerText"
 msgstr "Text u značky"
 
 #: midi_channel_selector.cc:161 midi_channel_selector.cc:400
-#: midi_channel_selector.cc:436 rc_option_editor.cc:2017
-#: rc_option_editor.cc:2663 sfdb_ui.cc:670
+#: midi_channel_selector.cc:436 rc_option_editor.cc:2157
+#: rc_option_editor.cc:2799 sfdb_ui.cc:671
 msgid "None"
 msgstr "Žádný"
 
@@ -7709,83 +8474,79 @@ msgstr "Název přípojky:"
 msgid "MidiPortDialog"
 msgstr "Dialog pro přípojku MIDI"
 
-#: midi_region_view.cc:849
+#: midi_region_view.cc:859
 msgid "channel edit"
 msgstr "Úprava kanálu"
 
-#: midi_region_view.cc:885
+#: midi_region_view.cc:895
 msgid "velocity edit"
 msgstr "Úprava síly tónu"
 
-#: midi_region_view.cc:944
+#: midi_region_view.cc:962
 msgid "add note"
 msgstr "Přidat notu"
 
-#: midi_region_view.cc:1872
+#: midi_region_view.cc:1904
 msgid "step add"
 msgstr "Přidání kroku"
 
-#: midi_region_view.cc:1966 midi_region_view.cc:1989
+#: midi_region_view.cc:1998 midi_region_view.cc:2021
 msgid "alter patch change"
 msgstr "Změnit změnu zapojení"
 
-#: midi_region_view.cc:2025
+#: midi_region_view.cc:2057
 msgid "add patch change"
 msgstr "Přidat změnu zapojení"
 
-#: midi_region_view.cc:2047 midi_region_view.cc:2048
+#: midi_region_view.cc:2079 midi_region_view.cc:2080
 msgid "move patch change"
 msgstr "Přesunout změnu zapojení"
 
-#: midi_region_view.cc:2060 midi_region_view.cc:2061
+#: midi_region_view.cc:2092 midi_region_view.cc:2093
 msgid "delete patch change"
 msgstr "Smazat změnu zapojení"
 
-#: midi_region_view.cc:2099
+#: midi_region_view.cc:2131
 msgid "delete selection"
 msgstr "Smazat výběr"
 
-#: midi_region_view.cc:2116
+#: midi_region_view.cc:2148
 msgid "delete note"
 msgstr "Smazat notu"
 
-#: midi_region_view.cc:2575
+#: midi_region_view.cc:2589
 msgid "move notes"
 msgstr "Přesunout noty"
 
-#: midi_region_view.cc:3110
+#: midi_region_view.cc:3139
 msgid "change velocities"
 msgstr "Změnit síly tónů"
 
-#: midi_region_view.cc:3176
+#: midi_region_view.cc:3205
 msgid "transpose"
 msgstr "Převést"
 
-#: midi_region_view.cc:3204
+#: midi_region_view.cc:3233
 msgid "change note lengths"
 msgstr "Změnit délky not"
 
-#: midi_region_view.cc:3280
+#: midi_region_view.cc:3309
 msgid "nudge"
 msgstr "Postrčit"
 
-#: midi_region_view.cc:3295
+#: midi_region_view.cc:3324
 msgid "change channel"
 msgstr "Změnit kanál"
 
-#: midi_region_view.cc:3333
+#: midi_region_view.cc:3372
 msgid "Bank "
 msgstr "Banka "
 
-#: midi_region_view.cc:3334
-msgid "Program "
-msgstr "Program "
-
-#: midi_region_view.cc:3335
+#: midi_region_view.cc:3374
 msgid "Channel "
 msgstr "Kanál "
 
-#: midi_region_view.cc:3522
+#: midi_region_view.cc:3561
 msgid "paste"
 msgstr "Vložit"
 
@@ -7801,108 +8562,108 @@ msgstr "Pokus o zobrazení oblasti MIDI bez datového modelu"
 msgid "failed to create MIDI region"
 msgstr "Nepodařilo se vytvořit oblast MIDI"
 
-#: midi_time_axis.cc:316
+#: midi_time_axis.cc:306
 msgid "External MIDI Device"
 msgstr "Vnější zařízení MIDI"
 
-#: midi_time_axis.cc:317
+#: midi_time_axis.cc:307
 msgid "External Device Mode"
 msgstr "Režim vnějšího zařízení "
 
-#: midi_time_axis.cc:325
+#: midi_time_axis.cc:315
 msgid "Chns"
 msgstr "Kan"
 
-#: midi_time_axis.cc:327
+#: midi_time_axis.cc:317
 msgid "Click to edit channel settings"
 msgstr "Klepněte pro úpravu nastavení kanálu"
 
-#: midi_time_axis.cc:526
+#: midi_time_axis.cc:516
 msgid "Show Full Range"
 msgstr "Ukázat celý rozsah"
 
-#: midi_time_axis.cc:531
+#: midi_time_axis.cc:521
 msgid "Fit Contents"
 msgstr "Umístit obsah"
 
-#: midi_time_axis.cc:535
+#: midi_time_axis.cc:525
 msgid "Note Range"
 msgstr "Rozsah noty"
 
-#: midi_time_axis.cc:536
+#: midi_time_axis.cc:526
 msgid "Note Mode"
 msgstr "Režim noty"
 
-#: midi_time_axis.cc:537
+#: midi_time_axis.cc:527
 msgid "Channel Selector"
 msgstr "Volič kanálů"
 
-#: midi_time_axis.cc:542
+#: midi_time_axis.cc:532
 msgid "Color Mode"
 msgstr "Barevný režim"
 
-#: midi_time_axis.cc:601
+#: midi_time_axis.cc:591
 msgid "Bender"
 msgstr "Ohýbač"
 
-#: midi_time_axis.cc:605
+#: midi_time_axis.cc:595
 msgid "Pressure"
 msgstr "Tlak"
 
-#: midi_time_axis.cc:617
+#: midi_time_axis.cc:607
 msgid "Controllers"
 msgstr "Ovládací prvky"
 
-#: midi_time_axis.cc:622
+#: midi_time_axis.cc:612
 msgid "No MIDI Channels selected"
 msgstr "Nejsou vybrány žádné kanály MIDI"
 
-#: midi_time_axis.cc:679 midi_time_axis.cc:808
+#: midi_time_axis.cc:669 midi_time_axis.cc:798
 msgid "Hide all channels"
 msgstr "Skrýt všechny kanály"
 
-#: midi_time_axis.cc:683 midi_time_axis.cc:812
+#: midi_time_axis.cc:673 midi_time_axis.cc:802
 msgid "Show all channels"
 msgstr "Ukázat všechny kanály"
 
-#: midi_time_axis.cc:694 midi_time_axis.cc:823
+#: midi_time_axis.cc:684 midi_time_axis.cc:813
 msgid "Channel %1"
 msgstr "Kanál %1"
 
-#: midi_time_axis.cc:949 midi_time_axis.cc:981
+#: midi_time_axis.cc:939 midi_time_axis.cc:971
 msgid "Controllers %1-%2"
 msgstr "Ovládací prvky %1-%2"
 
-#: midi_time_axis.cc:972 midi_time_axis.cc:975
+#: midi_time_axis.cc:962 midi_time_axis.cc:965
 msgid "Controller %1"
 msgstr "Ovládací prvek %1"
 
-#: midi_time_axis.cc:998
+#: midi_time_axis.cc:988
 msgid "Sustained"
 msgstr "Držený tón"
 
-#: midi_time_axis.cc:1005
+#: midi_time_axis.cc:995
 msgid "Percussive"
 msgstr "Bicí"
 
-#: midi_time_axis.cc:1025
+#: midi_time_axis.cc:1015
 msgid "Meter Colors"
 msgstr "Barvy měřidel"
 
-#: midi_time_axis.cc:1032
+#: midi_time_axis.cc:1022
 msgid "Channel Colors"
 msgstr "Barvy kanálů"
 
-#: midi_time_axis.cc:1039
+#: midi_time_axis.cc:1029
 msgid "Track Color"
 msgstr "Barva stopy"
 
-#: midi_time_axis.cc:1614 midi_time_axis.cc:1620 midi_time_axis.cc:1630
-#: midi_time_axis.cc:1636
+#: midi_time_axis.cc:1610 midi_time_axis.cc:1616 midi_time_axis.cc:1626
+#: midi_time_axis.cc:1632
 msgid "all"
 msgstr "vše"
 
-#: midi_time_axis.cc:1617 midi_time_axis.cc:1633
+#: midi_time_axis.cc:1613 midi_time_axis.cc:1629
 msgid "some"
 msgstr "některá"
 
@@ -7918,7 +8679,7 @@ msgstr "Automaticky projíždět"
 msgid "Decimal"
 msgstr "Desetinný"
 
-#: midi_tracer.cc:57 rc_option_editor.cc:1355
+#: midi_tracer.cc:57 rc_option_editor.cc:1356
 msgid "Enabled"
 msgstr "Povoleno"
 
@@ -7958,7 +8719,8 @@ msgstr "Přeskočit všechny chybějící soubory"
 msgid "Skip this file"
 msgstr "Přeskočit tento soubor"
 
-#: missing_file_dialog.cc:57
+#: missing_file_dialog.cc:57 tempo_dialog.cc:135 tempo_dialog.cc:136
+#: tempo_dialog.cc:484 tempo_dialog.cc:485
 msgid "audio"
 msgstr "Zvuk"
 
@@ -7994,92 +8756,36 @@ msgstr "Chybějící přídavné moduly"
 msgid "OK"
 msgstr "OK"
 
-#: mixer_actor.cc:55
-msgid "Toggle Solo on Mixer-Selected Tracks/Busses"
-msgstr "Přepnout sólo u ve směšovači vybraných stop/sběrnic"
-
-#: mixer_actor.cc:56
-msgid "Toggle Mute on Mixer-Selected Tracks/Busses"
-msgstr "Přepnout ztlumení u ve směšovači vybraných stop/sběrnic"
-
-#: mixer_actor.cc:57
-msgid "Toggle Rec-enable on Mixer-Selected Tracks/Busses"
-msgstr "Přepnout povolení nahrávání u ve směšovači vybraných stop/sběrnic"
-
-#: mixer_actor.cc:58
-msgid "Decrease Gain on Mixer-Selected Tracks/Busses"
-msgstr "Zmenšit zesílení u ve směšovači vybraných stop/sběrnic"
-
-#: mixer_actor.cc:59
-msgid "Increase Gain on Mixer-Selected Tracks/Busses"
-msgstr "Zvětšit zesílení u ve směšovači vybraných stop/sběrnic"
-
-#: mixer_actor.cc:60
-msgid "Set Gain to 0dB on Mixer-Selected Tracks/Busses"
-msgstr "Nastavit zesílení na 0 dB u ve směšovači vybraných stop/sběrnic"
-
-#: mixer_actor.cc:63
-msgid "Copy Selected Processors"
-msgstr "Kopírovat vybrané zpracovatele"
-
-#: mixer_actor.cc:64
-msgid "Cut Selected Processors"
-msgstr "Vyjmout vybrané zpracovatele"
-
-#: mixer_actor.cc:65
-msgid "Paste Selected Processors"
-msgstr "Vložit vybrané zpracovatele"
-
-#: mixer_actor.cc:66
-msgid "Delete Selected Processors"
-msgstr "Smazat vybrané zpracovatele"
-
-#: mixer_actor.cc:67
-msgid "Select All (visible) Processors"
-msgstr "Vybrat všechny viditelné zpracovatele"
-
-#: mixer_actor.cc:68
-msgid "Toggle Selected Processors"
-msgstr "Přepnout vybrané zpracovatele"
-
-#: mixer_actor.cc:69
-msgid "Toggle Selected Plugins"
-msgstr "Přepnout vybrané přídavné moduly"
-
-#: mixer_actor.cc:70
-msgid "Deselect all strips and processors"
-msgstr "Odznačit všechny proužky a zpracovatele"
-
-#: mixer_actor.cc:72 mixer_actor.cc:73
-msgid "Scroll Mixer Window to the left"
-msgstr "Projíždět okno se směšovačem doleva"
-
-#: mixer_actor.cc:75
-msgid "Toggle MIDI Input Active for Mixer-Selected Tracks/Busses"
-msgstr "Přepnout vstup MIDI pro ve směšovači vybrané stopy/sběrnice"
-
-#: mixer_actor.cc:90
-msgid "Loaded mixer bindings from %1"
-msgstr "Nahrané vazby směšovače z %1"
+#: missing_plugin_dialog.cc:42
+msgid ""
+"This session contains the following plugins that cannot be found on this "
+"system:\n"
+"\n"
+msgstr ""
 
-#: mixer_actor.cc:92
-msgid "Could not find mixer.bindings in search path %1"
-msgstr "V prohledávané cestě %1 se nepodařilo nalézt vazby směšovače"
+#: missing_plugin_dialog.cc:48
+msgid ""
+"\n"
+"Those plugins will be replaced with inactive stubs.\n"
+"It is recommended that you install the missing plugins and re-load the "
+"session.\n"
+"(also check the blacklist, Window > Log and Preferences > Plugins)"
+msgstr ""
 
-#: mixer_strip.cc:98 mixer_strip.cc:129
+#: mixer_strip.cc:100 mixer_strip.cc:133
 msgid "pre"
 msgstr "Před"
 
-#: mixer_strip.cc:101 mixer_strip.cc:132 mixer_strip.cc:387
-#: mixer_strip.cc:1472 rc_option_editor.cc:2949
+#: mixer_strip.cc:104 mixer_strip.cc:136 mixer_strip.cc:397
+#: mixer_strip.cc:1540 mixer_strip.cc:1551 rc_option_editor.cc:3140
 msgid "Comments"
 msgstr "Poznámka"
 
-#: mixer_strip.cc:155
+#: mixer_strip.cc:160
 msgid "Click to toggle the width of this mixer strip."
 msgstr "Klepněte pro přepnutí šířky proužku tohoto směšovače."
 
-#: mixer_strip.cc:157
+#: mixer_strip.cc:162
 msgid ""
 "\n"
 "%1-%2-click to toggle the width of all strips."
@@ -8087,327 +8793,398 @@ msgstr ""
 "\n"
 "%1-%2 klepnutí pro přepnutí šířky všech proužků."
 
-#: mixer_strip.cc:164
+#: mixer_strip.cc:171
 msgid "Hide this mixer strip"
 msgstr "Skrýt tento proužek směšovače"
 
-#: mixer_strip.cc:175
+#: mixer_strip.cc:182
 msgid "Click to select metering point"
 msgstr "Vybrat měřicí bod ukazatele hladin"
 
-#: mixer_strip.cc:191
+#: mixer_strip.cc:198
 msgid "Isolate Solo"
 msgstr "Samostatné sólo"
 
-#: mixer_strip.cc:199
+#: mixer_strip.cc:206
 msgid "Lock Solo Status"
 msgstr "Zamknout stav sóla"
 
-#: mixer_strip.cc:201 mixer_strip.cc:2127
+#: mixer_strip.cc:208 mixer_strip.cc:2217
 msgid "SoloLock|Lock"
 msgstr "Zámek"
 
-#: mixer_strip.cc:202 mixer_strip.cc:2126
+#: mixer_strip.cc:209 mixer_strip.cc:2216
 msgid "Iso"
 msgstr "Sam"
 
-#: mixer_strip.cc:256
+#: mixer_strip.cc:263
 msgid "Mix group"
 msgstr "Skupina zpracování"
 
-#: mixer_strip.cc:266
+#: mixer_strip.cc:275
 msgid "Trim: "
 msgstr "Zastřižení:"
 
-#: mixer_strip.cc:383 rc_option_editor.cc:2945
+#: mixer_strip.cc:393 rc_option_editor.cc:3136
 msgid "Phase Invert"
 msgstr "Obrácení fáze"
 
-#: mixer_strip.cc:384 rc_option_editor.cc:2946
+#: mixer_strip.cc:394 rc_option_editor.cc:3137
 msgid "Record & Monitor"
 msgstr "Nahrávání a sledování"
 
-#: mixer_strip.cc:385 rc_option_editor.cc:2947
+#: mixer_strip.cc:395 rc_option_editor.cc:3138
 msgid "Solo Iso / Lock"
 msgstr "Sólo sam/Zámek"
 
-#: mixer_strip.cc:509
+#: mixer_strip.cc:398 rc_option_editor.cc:3141
+msgid "VCA Assigns"
+msgstr ""
+
+#: mixer_strip.cc:531
 msgid "Show/Hide Monitoring Section"
 msgstr "Ukázat/Skrýt sledovací úsek"
 
-#: mixer_strip.cc:561
+#: mixer_strip.cc:583
 msgid "Enable/Disable MIDI input"
 msgstr "Povolit/Zakázat vstup MIDI"
 
-#: mixer_strip.cc:728
+#: mixer_strip.cc:749
 msgid "Aux"
 msgstr "Aux"
 
-#: mixer_strip.cc:754
+#: mixer_strip.cc:775
 msgid "Snd"
 msgstr "Posl"
 
-#: mixer_strip.cc:825 mixer_strip.cc:928 processor_box.cc:2759
+#: mixer_strip.cc:846 mixer_strip.cc:951 processor_box.cc:3594
 msgid "Not connected to audio engine - no I/O changes are possible"
 msgstr ""
 "Nespojeno se zvukovým strojem - na vstupech/výstupech (I/O) nejsou možné "
 "žádné změny"
 
-#: mixer_strip.cc:882 mixer_strip.cc:984
+#: mixer_strip.cc:904 mixer_strip.cc:1007
 msgid "Add %1 port"
 msgstr "Přidat %1 přípojku"
 
-#: mixer_strip.cc:889 mixer_strip.cc:991 monitor_section.cc:1429
+#: mixer_strip.cc:912 mixer_strip.cc:1014 monitor_section.cc:1466
+#: plugin_pin_dialog.cc:1782
 msgid "Routing Grid"
 msgstr "Spojovací mřížka"
 
-#: mixer_strip.cc:1220
+#: mixer_strip.cc:1291
 msgid "MIDI "
 msgstr "MIDI"
 
-#: mixer_strip.cc:1225
+#: mixer_strip.cc:1295
 msgid "<b>INPUT</b> to %1"
 msgstr "<b>VSTUP</b> do %1"
 
-#: mixer_strip.cc:1228 monitor_section.cc:1474
+#: mixer_strip.cc:1297 monitor_section.cc:1511
 msgid "<b>OUTPUT</b> from %1"
 msgstr "<b>VÝSTUP</b> z %1"
 
-#: mixer_strip.cc:1346 monitor_section.cc:1561
+#: mixer_strip.cc:1410 monitor_section.cc:1598
 msgid "Disconnected"
 msgstr "Odpojeno"
 
-#: mixer_strip.cc:1475
-msgid "*Comments*"
-msgstr "*Poznámky*"
+#: mixer_strip.cc:1536
+msgid "Click to add/edit comments"
+msgstr "Klepnout pro přidání/upravení poznámek"
 
-#: mixer_strip.cc:1482
+#: mixer_strip.cc:1540 mixer_strip.cc:1551
 msgid "Cmt"
 msgstr "Pozn"
 
-#: mixer_strip.cc:1485
-msgid "*Cmt*"
-msgstr "*Pozn*"
-
-#: mixer_strip.cc:1491
-msgid "Click to add/edit comments"
-msgstr "Klepnout pro přidání/upravení poznámek"
-
-#: mixer_strip.cc:1535
+#: mixer_strip.cc:1596
 msgid "Grp"
 msgstr "Skup"
 
-#: mixer_strip.cc:1538
+#: mixer_strip.cc:1599
 msgid "~G"
 msgstr "~S"
 
-#: mixer_strip.cc:1567 route_time_axis.cc:573
+#: mixer_strip.cc:1640 route_time_axis.cc:585 vca_master_strip.cc:396
 msgid "Color..."
 msgstr "Barva..."
 
-#: mixer_strip.cc:1569 route_time_axis.cc:575
+#: mixer_strip.cc:1642 route_time_axis.cc:587
 msgid "Comments..."
 msgstr "Poznámky..."
 
-#: mixer_strip.cc:1571 route_time_axis.cc:577
+#: mixer_strip.cc:1644 route_time_axis.cc:589
 msgid "Inputs..."
 msgstr "Vstupy..."
 
-#: mixer_strip.cc:1573 route_time_axis.cc:579
+#: mixer_strip.cc:1646 route_time_axis.cc:591
 msgid "Outputs..."
 msgstr "Výstupy..."
 
-#: mixer_strip.cc:1578
+#: mixer_strip.cc:1651
 msgid "Save As Template..."
 msgstr "Uložit jako předlohu..."
 
-#: mixer_strip.cc:1584 route_group_dialog.cc:45 route_time_axis.cc:853
+#: mixer_strip.cc:1657 route_group_dialog.cc:45 route_time_axis.cc:851
 msgid "Active"
 msgstr "Činné"
 
-#: mixer_strip.cc:1592
+#: mixer_strip.cc:1665 plugin_pin_dialog.cc:1011
+msgid "Strict I/O"
+msgstr ""
+
+#: mixer_strip.cc:1675 processor_box.cc:3698
+msgid "Pin Connections..."
+msgstr ""
+
+#: mixer_strip.cc:1679
 msgid "Adjust Latency..."
 msgstr "Upravit prodlevu..."
 
-#: mixer_strip.cc:1595
+#: mixer_strip.cc:1682
 msgid "Protect Against Denormals"
 msgstr "Chránit proti neobvyklým hodnotám"
 
-#: mixer_strip.cc:1601 route_time_axis.cc:592
-msgid "Remote Control ID..."
-msgstr "ID dálkového ovládání..."
-
-#: mixer_strip.cc:1619 route_time_axis.cc:869
+#: mixer_strip.cc:1701 route_time_axis.cc:867
 msgid "Duplicate..."
 msgstr "Zdvojit"
 
-#: mixer_strip.cc:1907
+#: mixer_strip.cc:1996
 msgid "Pre"
 msgstr "Před"
 
-#: mixer_strip.cc:1911
+#: mixer_strip.cc:2000
 msgid "Post"
 msgstr "Po"
 
-#: mixer_strip.cc:1927
+#: mixer_strip.cc:2016
 msgid "Meter|In"
 msgstr "Vstup"
 
-#: mixer_strip.cc:1931
+#: mixer_strip.cc:2020
 msgid "Meter|Pr"
 msgstr "PÅ™"
 
-#: mixer_strip.cc:1935
+#: mixer_strip.cc:2024
 msgid "Meter|Po"
 msgstr "Po"
 
-#: mixer_strip.cc:1939
+#: mixer_strip.cc:2028
 msgid "Meter|O"
 msgstr "Výstup"
 
-#: mixer_strip.cc:1944
+#: mixer_strip.cc:2033
 msgid "Meter|C"
 msgstr "Z"
 
-#: mixer_strip.cc:2104 route_ui.cc:181
+#: mixer_strip.cc:2194 route_ui.cc:193
 msgid "Disk"
 msgstr "Disk"
 
-#: mixer_strip.cc:2106
+#: mixer_strip.cc:2196
 msgid "Mon"
 msgstr "Sled"
 
-#: mixer_strip.cc:2119 monitor_section.cc:81
+#: mixer_strip.cc:2209 monitor_section.cc:81
 msgid "AFL"
 msgstr "AFL"
 
-#: mixer_strip.cc:2122 monitor_section.cc:82
+#: mixer_strip.cc:2212 monitor_section.cc:82
 msgid "PFL"
 msgstr "PFL"
 
-#: mixer_strip.cc:2132 meter_strip.cc:387
+#: mixer_strip.cc:2222 meter_strip.cc:385
 msgid "MonitorInput|I"
 msgstr "Vst"
 
-#: mixer_strip.cc:2133 meter_strip.cc:388
+#: mixer_strip.cc:2223 meter_strip.cc:386
 msgid "MonitorDisk|D"
 msgstr "D"
 
-#: mixer_strip.cc:2135
+#: mixer_strip.cc:2225
 msgid "Mon|O"
 msgstr "Výst"
 
-#: mixer_strip.cc:2148 meter_strip.cc:379 route_time_axis.cc:2738
+#: mixer_strip.cc:2238 meter_strip.cc:377 route_time_axis.cc:2730
+#: vca_master_strip.cc:202 vca_time_axis.cc:227
 msgid "AfterFader|A"
 msgstr "Po"
 
-#: mixer_strip.cc:2151
+#: mixer_strip.cc:2241
 msgid "Prefader|P"
 msgstr "PÅ™"
 
-#: mixer_strip.cc:2156
+#: mixer_strip.cc:2246
 msgid "SoloIso|I"
 msgstr "Sam"
 
-#: mixer_strip.cc:2157
+#: mixer_strip.cc:2247
 msgid "SoloLock|L"
 msgstr "Zám"
 
-#: mixer_strip.cc:2362
+#: mixer_strip.cc:2452
 msgid "Pre Fader"
 msgstr "Před-prolínač"
 
-#: mixer_strip.cc:2363
+#: mixer_strip.cc:2453
 msgid "Post Fader"
 msgstr "Po-prolínač"
 
-#: mixer_strip.cc:2408 meter_strip.cc:860
+#: mixer_strip.cc:2498 meter_strip.cc:858
 msgid "Change all in Group to %1"
 msgstr "Změnit vše ve skupině na %1"
 
-#: mixer_strip.cc:2410 meter_strip.cc:862
+#: mixer_strip.cc:2500 meter_strip.cc:860
 msgid "Change all to %1"
 msgstr "Změnit vše na %1"
 
-#: mixer_strip.cc:2412 meter_strip.cc:864
+#: mixer_strip.cc:2502 meter_strip.cc:862
 msgid "Change same track-type to %1"
 msgstr "Změnit stejný typ stopy na %1"
 
-#: mixer_ui.cc:134 route_time_axis.cc:830
+#: mixer_ui.cc:152 route_time_axis.cc:828
 msgid "Group"
 msgstr "Skupina"
 
-#: mixer_ui.cc:199
+#: mixer_ui.cc:221
 msgid "Favorite Plugins"
 msgstr "Oblíbené přídavné moduly"
 
-#: mixer_ui.cc:1288
+#: mixer_ui.cc:627
+msgid "Error adding GUI elements for new tracks/busses %1"
+msgstr ""
+
+#: mixer_ui.cc:1542
 msgid "track display list item for renamed strip not found!"
 msgstr ""
 "Označení pro přejmenovaný proužek (mixážní kanál) v seznamu pro zobrazení "
 "stop nelze najít!"
 
-#: mixer_ui.cc:1382
+#: mixer_ui.cc:1636
 msgid "-all-"
 msgstr "-vše-"
 
-#: mixer_ui.cc:2039
+#: mixer_ui.cc:2135
 msgid "Strips"
 msgstr "Proužky kanálů"
 
-#: mixer_ui.cc:2346
+#: mixer_ui.cc:2479
 msgid "No Track/Bus is selected."
 msgstr "Nebyla vybrána žádná stopa nebo sběrnice."
 
-#: mixer_ui.cc:2348
+#: mixer_ui.cc:2481
 msgid "Add at the top"
 msgstr "Přidat nahoře"
 
-#: mixer_ui.cc:2350
+#: mixer_ui.cc:2483
 msgid "Add Pre-Fader"
 msgstr "Přidat před-prolínač"
 
-#: mixer_ui.cc:2352
-msgid "Add Post-Fader"
-msgstr "Přidat po-prolínač"
+#: mixer_ui.cc:2485
+msgid "Add Post-Fader"
+msgstr "Přidat po-prolínač"
+
+#: mixer_ui.cc:2487
+msgid "Add at the end"
+msgstr "Přidat na konci"
+
+#: mixer_ui.cc:2493
+msgid "Remove from favorites"
+msgstr "Odstranit z oblíbených"
+
+#: mixer_ui.cc:2499
+msgid "Delete Preset"
+msgstr "Smazat přednastavení"
+
+#: mixer_ui.cc:2739
+msgid "Toggle Solo on Mixer-Selected Tracks/Busses"
+msgstr "Přepnout sólo u ve směšovači vybraných stop/sběrnic"
+
+#: mixer_ui.cc:2740
+msgid "Toggle Mute on Mixer-Selected Tracks/Busses"
+msgstr "Přepnout ztlumení u ve směšovači vybraných stop/sběrnic"
+
+#: mixer_ui.cc:2741
+msgid "Toggle Rec-enable on Mixer-Selected Tracks/Busses"
+msgstr "Přepnout povolení nahrávání u ve směšovači vybraných stop/sběrnic"
+
+#: mixer_ui.cc:2742
+msgid "Decrease Gain on Mixer-Selected Tracks/Busses"
+msgstr "Zmenšit zesílení u ve směšovači vybraných stop/sběrnic"
+
+#: mixer_ui.cc:2743
+msgid "Increase Gain on Mixer-Selected Tracks/Busses"
+msgstr "Zvětšit zesílení u ve směšovači vybraných stop/sběrnic"
+
+#: mixer_ui.cc:2744
+msgid "Set Gain to 0dB on Mixer-Selected Tracks/Busses"
+msgstr "Nastavit zesílení na 0 dB u ve směšovači vybraných stop/sběrnic"
+
+#: mixer_ui.cc:2747
+msgid "Copy Selected Processors"
+msgstr "Kopírovat vybrané zpracovatele"
+
+#: mixer_ui.cc:2748
+msgid "Cut Selected Processors"
+msgstr "Vyjmout vybrané zpracovatele"
+
+#: mixer_ui.cc:2749
+msgid "Paste Selected Processors"
+msgstr "Vložit vybrané zpracovatele"
+
+#: mixer_ui.cc:2750
+msgid "Delete Selected Processors"
+msgstr "Smazat vybrané zpracovatele"
+
+#: mixer_ui.cc:2751
+msgid "Select All (visible) Processors"
+msgstr "Vybrat všechny viditelné zpracovatele"
+
+#: mixer_ui.cc:2752
+msgid "Toggle Selected Processors"
+msgstr "Přepnout vybrané zpracovatele"
+
+#: mixer_ui.cc:2753
+msgid "Toggle Selected Plugins"
+msgstr "Přepnout vybrané přídavné moduly"
 
-#: mixer_ui.cc:2354
-msgid "Add at the end"
-msgstr "Přidat na konci"
+#: mixer_ui.cc:2754
+msgid "Deselect all strips and processors"
+msgstr "Odznačit všechny proužky a zpracovatele"
 
-#: mixer_ui.cc:2360
-msgid "Remove from favorites"
-msgstr "Odstranit z oblíbených"
+#: mixer_ui.cc:2756 mixer_ui.cc:2757
+msgid "Scroll Mixer Window to the left"
+msgstr "Projíždět okno se směšovačem doleva"
 
-#: mixer_ui.cc:2364
-msgid "Delete Preset"
-msgstr "Smazat přednastavení"
+#: mixer_ui.cc:2759
+msgid "Toggle MIDI Input Active for Mixer-Selected Tracks/Busses"
+msgstr "Přepnout vstup MIDI pro ve směšovači vybrané stopy/sběrnice"
 
-#: meter_strip.cc:161
+#: meter_strip.cc:160
 msgid "Reset Peak"
 msgstr "Nastavit znovu nejvyšší hodnoty"
 
-#: meter_strip.cc:382 route_time_axis.cc:2742
+#: meter_strip.cc:380 route_time_axis.cc:2734 vca_master_strip.cc:206
+#: vca_time_axis.cc:231
 msgid "PreFader|P"
 msgstr "PÅ™"
 
-#: meter_strip.cc:896
+#: meter_strip.cc:894
 msgid "Variable height"
 msgstr "Proměnlivá výška"
 
-#: meter_strip.cc:897
+#: meter_strip.cc:895
 msgid "Short"
 msgstr "Krátká"
 
-#: meter_strip.cc:898
+#: meter_strip.cc:896
 msgid "Tall"
 msgstr "Vysoká"
 
-#: meter_strip.cc:899
+#: meter_strip.cc:897
 msgid "Grande"
 msgstr "Grande"
 
-#: meter_strip.cc:900
+#: meter_strip.cc:898
 msgid "Venti"
 msgstr "Venti"
 
@@ -8459,19 +9236,19 @@ msgstr "VU"
 msgid "SiP"
 msgstr "SiP"
 
-#: monitor_section.cc:109 route_group_dialog.cc:49
+#: monitor_section.cc:113 route_group_dialog.cc:49
 msgid "Soloing"
 msgstr "Sólo"
 
-#: monitor_section.cc:113
+#: monitor_section.cc:117
 msgid "Isolated"
 msgstr "Samostatné"
 
-#: monitor_section.cc:117
+#: monitor_section.cc:121
 msgid "Auditioning"
 msgstr "Zkušební výstup"
 
-#: monitor_section.cc:128
+#: monitor_section.cc:132
 msgid ""
 "When active, something is solo-isolated.\n"
 "Click to de-isolate everything"
@@ -8479,7 +9256,7 @@ msgstr ""
 "Je-li v činnosti, něco je sólo-samostatně.\n"
 "Pro vypnutí osamostatnění klepněte na cokoli."
 
-#: monitor_section.cc:131
+#: monitor_section.cc:135
 msgid ""
 "When active, auditioning is active.\n"
 "Click to stop the audition"
@@ -8487,32 +9264,32 @@ msgstr ""
 "Je-li v činnosti, běží poslechu.\n"
 "Klepnutím se poslech zkušebního výstupu zastaví."
 
-#: monitor_section.cc:148
+#: monitor_section.cc:152
 msgid "Solo controls affect solo-in-place"
 msgstr "Ovládací prvky pro sólo ovlivní sólo v místě"
 
-#: monitor_section.cc:154
+#: monitor_section.cc:158
 msgid "Solo controls toggle after-fader-listen"
 msgstr "Ovládací prvky pro sólo přepnou poslech po prolínači"
 
-#: monitor_section.cc:160
+#: monitor_section.cc:164
 msgid "Solo controls toggle pre-fader-listen"
 msgstr "Ovládací prvky pro sólo přepnou poslech před prolínačem"
 
-#: monitor_section.cc:166
+#: monitor_section.cc:170
 msgid "Excl. Solo"
 msgstr "Výhr. sólo"
 
-#: monitor_section.cc:168
+#: monitor_section.cc:172
 msgid "Exclusive solo means that only 1 solo is active at a time"
 msgstr ""
 "Výhradní sólo znamená, že v jednu chvíli je v činnosti pouze jedno sólo"
 
-#: monitor_section.cc:175
+#: monitor_section.cc:179
 msgid "Solo » Mute"
 msgstr "Sólo » Ztlumit"
 
-#: monitor_section.cc:177
+#: monitor_section.cc:181
 msgid ""
 "If enabled, solo will override mute\n"
 "(a soloed & muted track or bus will be audible)"
@@ -8520,40 +9297,40 @@ msgstr ""
 "Je-li povoleno, sólo dostane přednost před ztlumením\n"
 "(bude slyšitelná samostatná a ztlumená stopa nebo sběrnice)"
 
-#: monitor_section.cc:185
+#: monitor_section.cc:189
 msgid "Processors"
 msgstr "Zpracovatelé"
 
-#: monitor_section.cc:187
-msgid "Allow to add monitor effect processors"
-msgstr "Povolit přidání zpracovatele efektů sledování"
+#: monitor_section.cc:191
+msgid "Allow one to add monitor effect processors"
+msgstr ""
 
-#: monitor_section.cc:203
+#: monitor_section.cc:206
 msgid "Gain increase for soloed signals (0dB is normal)"
 msgstr "Zvětšení zesílení pro samostatné signály (0 dB je normální)"
 
-#: monitor_section.cc:207 monitor_section.cc:224 monitor_section.cc:241
-#: monitor_section.cc:286
+#: monitor_section.cc:210 monitor_section.cc:227 monitor_section.cc:244
+#: monitor_section.cc:289
 msgid "0 dB"
 msgstr "0 dB"
 
-#: monitor_section.cc:208
+#: monitor_section.cc:211
 msgid "3 dB"
 msgstr "3 dB"
 
-#: monitor_section.cc:209
+#: monitor_section.cc:212
 msgid "6 dB"
 msgstr "6 dB"
 
-#: monitor_section.cc:210
+#: monitor_section.cc:213
 msgid "10 dB"
 msgstr "10 dB"
 
-#: monitor_section.cc:212
+#: monitor_section.cc:215
 msgid "Solo Boost"
 msgstr "Povzbuzení sóla"
 
-#: monitor_section.cc:219
+#: monitor_section.cc:222
 msgid ""
 "Gain reduction non-soloed signals\n"
 "A value above -inf dB causes \"solo-in-front\""
@@ -8561,99 +9338,103 @@ msgstr ""
 "Zmenšení zesílení pro nesamostatné signály\n"
 "Hodnota nad -inf dB způsobí \"sólo v čele\""
 
-#: monitor_section.cc:225 monitor_section.cc:243 monitor_section.cc:288
+#: monitor_section.cc:228 monitor_section.cc:246 monitor_section.cc:291
 msgid "-6 dB"
 msgstr "-6 dB"
 
-#: monitor_section.cc:226 monitor_section.cc:244 monitor_section.cc:289
+#: monitor_section.cc:229 monitor_section.cc:247 monitor_section.cc:292
 msgid "-12 dB"
 msgstr "-12 dB"
 
-#: monitor_section.cc:227 monitor_section.cc:245 monitor_section.cc:290
+#: monitor_section.cc:230 monitor_section.cc:248 monitor_section.cc:293
 msgid "-20 dB"
 msgstr "-20 dB"
 
-#: monitor_section.cc:228
+#: monitor_section.cc:231
 msgid "OFF"
 msgstr "VYP"
 
-#: monitor_section.cc:230
+#: monitor_section.cc:233
 msgid "SiP Cut"
 msgstr "Vyjmutí Sip"
 
-#: monitor_section.cc:237
+#: monitor_section.cc:240
 msgid "Gain reduction to use when dimming monitor outputs"
 msgstr "Zmenšení zesílení k použití při tlumení výstupů sledování"
 
-#: monitor_section.cc:242 monitor_section.cc:287
+#: monitor_section.cc:245 monitor_section.cc:290
 msgid "-3 dB"
 msgstr "-3 dB"
 
-#: monitor_section.cc:247 monitor_section.cc:261 monitor_section.cc:322
+#: monitor_section.cc:250 monitor_section.cc:264 monitor_section.cc:325
 msgid "Dim"
 msgstr "Tlumený"
 
-#: monitor_section.cc:291
+#: monitor_section.cc:294
 msgid "-30 dB"
 msgstr "-30 dB"
 
-#: monitor_section.cc:330
+#: monitor_section.cc:333
 msgid "Inv"
 msgstr "Inv"
 
-#: monitor_section.cc:396
+#: monitor_section.cc:399
 msgid "Monitor"
 msgstr "Sledování"
 
-#: monitor_section.cc:860
+#: monitor_section.cc:897
 msgid "Switch monitor to mono"
 msgstr "Přepnout sledování na mono"
 
-#: monitor_section.cc:863
+#: monitor_section.cc:900
 msgid "Cut monitor"
 msgstr "Vyjmout sledování"
 
-#: monitor_section.cc:866
+#: monitor_section.cc:903
 msgid "Dim monitor"
 msgstr "Zeslabit sledování"
 
-#: monitor_section.cc:869
+#: monitor_section.cc:906
 msgid "Toggle exclusive solo mode"
 msgstr "Přepnout režim výhradní sólo"
 
-#: monitor_section.cc:875
+#: monitor_section.cc:912
 msgid "Toggle mute overrides solo mode"
 msgstr "Přepnout režim ztlumení potlačí sólo"
 
-#: monitor_section.cc:885
+#: monitor_section.cc:921
 msgid "Cut monitor channel %1"
 msgstr "Vyjmout kanál pro sledování %1"
 
-#: monitor_section.cc:890
+#: monitor_section.cc:926
 msgid "Dim monitor channel %1"
 msgstr "Ztlumit kanál pro sledování %1"
 
-#: monitor_section.cc:895
+#: monitor_section.cc:931
 msgid "Solo monitor channel %1"
 msgstr "Sólo pro kanál pro sledování %1"
 
-#: monitor_section.cc:900
+#: monitor_section.cc:936
 msgid "Invert monitor channel %1"
 msgstr "Obrátit kanál pro sledování %1"
 
-#: monitor_section.cc:910
+#: monitor_section.cc:946
 msgid "In-place solo"
 msgstr "Sólo přímo na místě"
 
-#: monitor_section.cc:912
+#: monitor_section.cc:948
 msgid "After Fade Listen (AFL) solo"
 msgstr "Sólo poslech po prolínání (AFL)"
 
-#: monitor_section.cc:914
+#: monitor_section.cc:950
 msgid "Pre Fade Listen (PFL) solo"
 msgstr "Sólo poslech před prolínáním (PFL)"
 
-#: monitor_section.cc:1376
+#: monitor_section.cc:953
+msgid "Toggle Monitor Section Processor Box"
+msgstr ""
+
+#: monitor_section.cc:1413
 msgid "No session - no I/O changes are possible"
 msgstr "Žádné sezení - na vstupech/výstupech (I/O) nejsou možné žádné změny"
 
@@ -8779,6 +9560,10 @@ msgstr "Normalizovat oblasti"
 msgid "Normalize region"
 msgstr "Normalizovat oblast"
 
+#: normalize_dialog.cc:42
+msgid "Normalize to:"
+msgstr "Normalizovat:"
+
 #: normalize_dialog.cc:49 strip_silence_dialog.cc:67
 msgid "dbFS"
 msgstr "dbFS"
@@ -8835,8 +9620,8 @@ msgstr ""
 msgid ""
 "  -B, --bypass-plugins        Bypass all plugins in an existing session\n"
 msgstr ""
-"  -B, --bypass-plugins        Přemostit všechny přídavné moduly ve stávajícím "
-"sezení\n"
+"  -B, --bypass-plugins        Přemostit všechny přídavné moduly ve "
+"stávajícím sezení\n"
 
 #: opts.cc:68
 msgid ""
@@ -8975,39 +9760,161 @@ msgstr "Nepřidělené"
 msgid "Imported"
 msgstr "Zavedeno"
 
-#: plugin_eq_gui.cc:83 plugin_eq_gui.cc:107
+#: plugin_eq_gui.cc:85 plugin_eq_gui.cc:109
 msgid "dB scale"
 msgstr "Stupnice dB"
 
-#: plugin_eq_gui.cc:114
+#: plugin_eq_gui.cc:116
 msgid "Show phase"
 msgstr "Ukázat fázi"
 
-#: plugin_selector.cc:54 plugin_selector.cc:311
+#: plugin_pin_dialog.cc:55
+msgid "Manual Config"
+msgstr ""
+
+#: plugin_pin_dialog.cc:56
+msgid "Sidechain"
+msgstr ""
+
+#: plugin_pin_dialog.cc:57 plugin_pin_dialog.cc:59 plugin_pin_dialog.cc:61
+#: plugin_pin_dialog.cc:63 plugin_pin_dialog.cc:65 step_entry.cc:81
+#: step_entry.cc:84
+msgid "+"
+msgstr "+"
+
+#: plugin_pin_dialog.cc:58 plugin_pin_dialog.cc:60 plugin_pin_dialog.cc:62
+#: plugin_pin_dialog.cc:64 plugin_pin_dialog.cc:66
+msgid "-"
+msgstr ""
+
+#: plugin_pin_dialog.cc:148
+msgid "Audio Input Pins"
+msgstr ""
+
+#: plugin_pin_dialog.cc:157
+msgid "MIDI Input Pins"
+msgstr ""
+
+#: plugin_pin_dialog.cc:166
+msgid "Instances"
+msgstr ""
+
+#: plugin_pin_dialog.cc:176
+msgid "Audio Out"
+msgstr ""
+
+#: plugin_pin_dialog.cc:185
+msgid "MIDI Out"
+msgstr ""
+
+#: plugin_pin_dialog.cc:192
+msgid "Output Presets"
+msgstr ""
+
+#: plugin_pin_dialog.cc:208
+msgid "Add Sidechain Input"
+msgstr ""
+
+#: plugin_pin_dialog.cc:478 plugin_pin_dialog.cc:482 plugin_pin_dialog.cc:486
+#: plugin_setup_dialog.cc:115 plugin_setup_dialog.cc:199
+msgid "Automatic"
+msgstr ""
+
+#: plugin_pin_dialog.cc:515 plugin_setup_dialog.cc:208
+msgid "%1 Channel"
+msgid_plural "%1 Channels"
+msgstr[0] ""
+msgstr[1] ""
+
+#: plugin_pin_dialog.cc:641 processor_box.cc:224
+msgid "Send"
+msgstr "Poslat"
+
+#: plugin_pin_dialog.cc:997
+msgid "Latency %1 spl%2 %3"
+msgstr ""
+
+#: plugin_pin_dialog.cc:997 plugin_pin_dialog.cc:1001
+msgid "no-inplace"
+msgstr ""
+
+#: plugin_pin_dialog.cc:999
+msgid "Latency %1 spl"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1055
+msgid "Instance #%1"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1700 processor_box.cc:2508
+msgid "Cannot set up new send: %1"
+msgstr "Nelze nastavit nové odeslání: %1"
+
+#: plugin_pin_dialog.cc:1707
+msgid "SC %1 (%2)"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1963 plugin_pin_dialog.cc:1971
+msgid "Pin Configuration: %1"
+msgstr ""
+
+#: plugin_setup_dialog.cc:30
+msgid "Plugin Setup"
+msgstr ""
+
+#: plugin_setup_dialog.cc:33
+msgid "Copy I/O Map"
+msgstr ""
+
+#: plugin_setup_dialog.cc:50
+msgid "An Instrument plugin is already present."
+msgstr ""
+
+#: plugin_setup_dialog.cc:54
+msgid "Replace"
+msgstr ""
+
+#: plugin_setup_dialog.cc:60
+msgid "with"
+msgstr ""
+
+#: plugin_setup_dialog.cc:70
+msgid "I/O Pin Mapping"
+msgstr ""
+
+#: plugin_setup_dialog.cc:79
+msgid "Configure Plugin '%1'"
+msgstr ""
+
+#: plugin_setup_dialog.cc:90
+msgid "Output Configuration"
+msgstr ""
+
+#: plugin_selector.cc:54 plugin_selector.cc:322
 msgid "Name contains"
 msgstr "Název obsahuje"
 
-#: plugin_selector.cc:55 plugin_selector.cc:315
+#: plugin_selector.cc:55 plugin_selector.cc:326
 msgid "Type contains"
 msgstr "Druh obsahuje"
 
-#: plugin_selector.cc:56 plugin_selector.cc:313
+#: plugin_selector.cc:56 plugin_selector.cc:324
 msgid "Category contains"
 msgstr "Skupina obsahuje"
 
-#: plugin_selector.cc:57 plugin_selector.cc:335
+#: plugin_selector.cc:57 plugin_selector.cc:349
 msgid "Author contains"
 msgstr "Autor obsahuje"
 
-#: plugin_selector.cc:58 plugin_selector.cc:337
+#: plugin_selector.cc:58 plugin_selector.cc:351
 msgid "Library contains"
 msgstr "Sbírka obsahuje"
 
-#: plugin_selector.cc:59 plugin_selector.cc:267 plugin_selector.cc:613
+#: plugin_selector.cc:59 plugin_selector.cc:278 plugin_selector.cc:639
 msgid "Favorites only"
 msgstr "Pouze oblíbené"
 
-#: plugin_selector.cc:60 plugin_selector.cc:271 plugin_selector.cc:613
+#: plugin_selector.cc:60 plugin_selector.cc:282 plugin_selector.cc:639
 msgid "Hidden only"
 msgstr "Pouze skryté"
 
@@ -9099,16 +10006,16 @@ msgstr "Přepnout zobrazení přídavných modulů s pomocnými prostředky (jso
 msgid "Filter"
 msgstr "Filtr"
 
-#: plugin_selector.cc:221
+#: plugin_selector.cc:232
 msgid "Insert Plugin(s)"
 msgstr "Vložit přídavný(é) modul(y)"
 
-#: plugin_selector.cc:419 plugin_selector.cc:420 plugin_selector.cc:421
-#: plugin_selector.cc:422
+#: plugin_selector.cc:439 plugin_selector.cc:440 plugin_selector.cc:441
+#: plugin_selector.cc:442
 msgid "variable"
 msgstr "Proměnná"
 
-#: plugin_selector.cc:572
+#: plugin_selector.cc:598
 msgid ""
 "The plugin \"%1\" could not be loaded\n"
 "\n"
@@ -9118,29 +10025,29 @@ msgstr ""
 "\n"
 "Více podrobností hledejte a možná najdete v okně se zápisem"
 
-#: plugin_selector.cc:730
+#: plugin_selector.cc:757
 msgid "Favorites"
 msgstr "Oblíbené"
 
-#: plugin_selector.cc:732
+#: plugin_selector.cc:759
 msgid "Plugin Manager..."
 msgstr "Správce přídavných modulů..."
 
-#: plugin_selector.cc:736
+#: plugin_selector.cc:763
 msgid "By Creator"
 msgstr "Podle tvůrce"
 
-#: plugin_selector.cc:739
+#: plugin_selector.cc:766
 msgid "By Category"
 msgstr "Podle skupiny"
 
-#: plugin_ui.cc:113
+#: plugin_ui.cc:114
 msgid "Eh? LADSPA plugins don't have editors!"
 msgstr ""
 "Pozoruhodné... Přídavné moduly LADSPA nemají žádné grafické uživatelské "
 "rozhraní!"
 
-#: plugin_ui.cc:122 plugin_ui.cc:227
+#: plugin_ui.cc:123 plugin_ui.cc:228
 msgid ""
 "unknown type of editor-supplying plugin (note: no VST support in this "
 "version of %1)"
@@ -9148,11 +10055,11 @@ msgstr ""
 "Neznámý druh přídavného modulu (Upozornění: tato verze %1 nepodporuje žádné "
 "přídavné moduly VST)"
 
-#: plugin_ui.cc:125
+#: plugin_ui.cc:126
 msgid "unknown type of editor-supplying plugin"
 msgstr "Neznámý druh přídavného modulu"
 
-#: plugin_ui.cc:257
+#: plugin_ui.cc:258
 msgid ""
 "unknown type of editor-supplying plugin (note: no linuxVST support in this "
 "version of %1)"
@@ -9160,7 +10067,7 @@ msgstr ""
 "Neznámý druh přídavného modulu pro editor (Upozornění: tato verze %1 "
 "nepodporuje linuxové VST)"
 
-#: plugin_ui.cc:329
+#: plugin_ui.cc:330
 msgid "create_lv2_editor called on non-LV2 plugin"
 msgstr "create_lv2_editor používaný na ne-LV2 přídavný modul"
 
@@ -9207,7 +10114,7 @@ msgstr ""
 msgid "Disable signal processing by the plugin"
 msgstr "Zakázat zpracování signálu přídavným modulem"
 
-#: plugin_ui.cc:473 plugin_ui.cc:685
+#: plugin_ui.cc:473 plugin_ui.cc:681
 msgid ""
 "Click to allow the plugin to receive keyboard events that %1 would normally "
 "use as a shortcut"
@@ -9253,11 +10160,11 @@ msgstr ""
 msgid "New Preset"
 msgstr "Nové přednastavení"
 
-#: plugin_ui.cc:692
+#: plugin_ui.cc:688
 msgid "Click to allow normal use of %1 keyboard shortcuts"
 msgstr "Klepněte pro povolení obvyklého používání klávesových zkratek v %1"
 
-#: plugin_ui.cc:789
+#: plugin_ui.cc:785
 msgid "(none)"
 msgstr "(žádný)"
 
@@ -9321,23 +10228,23 @@ msgstr "Výstup hodin MIDI"
 msgid "MMC out"
 msgstr "Výstup MMC"
 
-#: port_group.cc:543
+#: port_group.cc:554
 msgid ":monitor"
 msgstr ":sledování"
 
-#: port_group.cc:559
+#: port_group.cc:570
 msgid "system:"
 msgstr "Systém:"
 
-#: port_group.cc:560
+#: port_group.cc:571
 msgid "alsa_pcm:"
 msgstr "alsa_pcm:"
 
-#: port_group.cc:561
+#: port_group.cc:572
 msgid "alsa_midi:"
 msgstr "alsa_midi:"
 
-#: port_group.cc:566
+#: port_group.cc:577
 msgid "Scene "
 msgstr "Scéna"
 
@@ -9401,43 +10308,36 @@ msgid "Flip"
 msgstr "Přepnout"
 
 #: port_matrix.cc:732
-msgid ""
-"It is not possible to add a port here, as the first processor in the track "
-"or buss cannot support the new configuration."
+msgid "It is not possible to add a port here."
 msgstr ""
-"Přípojku zde nelze přidat, protože první procesor ve stopě nebo sběrnici "
-"nedokáže podporovat nové nastavení."
 
-#: port_matrix.cc:735
+#: port_matrix.cc:733
 msgid "Cannot add port"
 msgstr "Nelze přidat přípojku"
 
 #: port_matrix.cc:757
-msgid "Port removal not allowed"
-msgstr "Odstranění přípojky nepovoleno"
+msgid "The last port cannot be removed"
+msgstr ""
 
-#: port_matrix.cc:758
-msgid ""
-"This port cannot be removed.\n"
-"Either the first plugin in the track or buss cannot accept\n"
-"the new number of inputs or the last plugin has more outputs."
+#: port_matrix.cc:760
+msgid "This port cannot be removed."
 msgstr ""
-"Tuto přípojku nelze odstranit, protože\n"
-"první přídavný modul ve stopě nebo\n"
-"sběrnici nemůže přijmout nový počet vstupů,\n"
-"nebo má poslední přídavný modul více výstupů."
 
-#: port_matrix.cc:975
+#: port_matrix.cc:765
+msgid "Port removal not allowed"
+msgstr "Odstranění přípojky nepovoleno"
+
+#: port_matrix.cc:981
 #, c-format
 msgid "Remove '%s'"
 msgstr "Odstranit '%s'"
 
-#: port_matrix.cc:990
+#: port_matrix.cc:996
 #, c-format
 msgid "%s all from '%s'"
 msgstr "%s vše z '%s'"
 
-#: port_matrix.cc:1056 transform_dialog.cc:62
+#: port_matrix.cc:1062 transform_dialog.cc:62
 msgid "channel"
 msgstr "Kanál"
 
@@ -9449,19 +10349,15 @@ msgstr "Nejsou zde žádné přípojky k připojení."
 msgid "There are no %1 ports to connect."
 msgstr "Nejsou zde žádné %1 přípojky k připojení."
 
-#: processor_box.cc:169
-msgid "Send"
-msgstr "Poslat"
-
-#: processor_box.cc:171
+#: processor_box.cc:226
 msgid "Return"
 msgstr "Enter"
 
-#: processor_box.cc:239
+#: processor_box.cc:323
 msgid "New Favorite Preset for \"%1\""
 msgstr "Nové oblíbené přednastavení \"%1\""
 
-#: processor_box.cc:414
+#: processor_box.cc:501
 msgid ""
 "\n"
 "This mono plugin has been replicated %1 times."
@@ -9469,7 +10365,7 @@ msgstr ""
 "\n"
 "Tento mono přídavný modul byl zkopírován %1 krát"
 
-#: processor_box.cc:418
+#: processor_box.cc:505 processor_box.cc:1527
 msgid ""
 "<b>%1</b>\n"
 "Double-click to show GUI.\n"
@@ -9479,7 +10375,7 @@ msgstr ""
 "Klepnout dvakrát pro ukázání uživatelského rozhraní.\n"
 "Alt+klepnout dvakrát pro ukázání jednoduchého uživatelského rozhraní.%3"
 
-#: processor_box.cc:421
+#: processor_box.cc:508 processor_box.cc:1530
 msgid ""
 "<b>%1</b>\n"
 "Double-click to show generic GUI.%2"
@@ -9487,7 +10383,7 @@ msgstr ""
 "<b>%1</b>\n"
 "Klepnout dvakrát pro ukázání jednoduchého uživatelského rozhraní.%2"
 
-#: processor_box.cc:427
+#: processor_box.cc:514
 msgid ""
 "<b>%1</b>\n"
 "The Plugin is not available on this system\n"
@@ -9497,32 +10393,36 @@ msgstr ""
 "Přídavný modul není v tomto systému dostupný\n"
 "a byl nahrazen zástupným."
 
-#: processor_box.cc:470
+#: processor_box.cc:600
 #, c-format
 msgid "(%1x1) "
 msgstr "(%1x1) "
 
-#: processor_box.cc:546
+#: processor_box.cc:695
+msgid "Inline Display"
+msgstr ""
+
+#: processor_box.cc:703
 msgid "Show All Controls"
 msgstr "Ukázat všechny ovládací prvky"
 
-#: processor_box.cc:550
+#: processor_box.cc:707
 msgid "Hide All Controls"
 msgstr "Skrýt všechny ovládací prvky"
 
-#: processor_box.cc:584
+#: processor_box.cc:752
 msgid "Link panner controls"
 msgstr "Spojit ovládání vyvažovače"
 
-#: processor_box.cc:691
+#: processor_box.cc:859
 msgid "on"
 msgstr "Zapnuto"
 
-#: processor_box.cc:691 rc_option_editor.cc:2978 rc_option_editor.cc:2992
+#: processor_box.cc:859 rc_option_editor.cc:3178 rc_option_editor.cc:3192
 msgid "off"
 msgstr "Vypnuto"
 
-#: processor_box.cc:1177
+#: processor_box.cc:1817
 msgid ""
 "Right-click to add/remove/edit\n"
 "plugins,inserts,sends and more"
@@ -9530,7 +10430,7 @@ msgstr ""
 "Klepnutí pravým tlačítkem myši pro přidání/odstranění/upravení\n"
 "přídavných modulů, vložení, poslání a další"
 
-#: processor_box.cc:1326
+#: processor_box.cc:1966
 msgid ""
 "Processor Drag/Drop failed. Probably because\n"
 "the I/O configuration of the plugins could\n"
@@ -9540,15 +10440,15 @@ msgstr ""
 "Pravděpodobně se neshoduje vstupní/výstupní nastavení (I/O)\n"
 "přídavných modulů s nastavením pro tuto stopu."
 
-#: processor_box.cc:1769 processor_box.cc:2164
+#: processor_box.cc:2443 processor_box.cc:2986
 msgid "Plugin Incompatibility"
 msgstr "Neslučitelnost přídavného modulu"
 
-#: processor_box.cc:1772
+#: processor_box.cc:2446
 msgid "You attempted to add the plugin \"%1\" in slot %2.\n"
 msgstr "Pokusil jste se přidat přídavný modul \"%1\" do místa %2.\n"
 
-#: processor_box.cc:1778
+#: processor_box.cc:2452
 msgid ""
 "\n"
 "This plugin has:\n"
@@ -9556,19 +10456,19 @@ msgstr ""
 "\n"
 "Tento přídavný modul má:\n"
 
-#: processor_box.cc:1781
+#: processor_box.cc:2455
 msgid "\t%1 MIDI input\n"
 msgid_plural "\t%1 MIDI inputs\n"
 msgstr[0] "\t%1 vstup MIDI\n"
-msgstr[1] "\t%1 vstupů MIDI"
+msgstr[1] "\t%1 vstupů MIDI\n"
 
-#: processor_box.cc:1785
+#: processor_box.cc:2459
 msgid "\t%1 audio input\n"
 msgid_plural "\t%1 audio inputs\n"
 msgstr[0] "\t%1 vstup pro zvuk\n"
-msgstr[1] "\t%1 vstupů pro zvuk"
+msgstr[1] "\t%1 vstupů pro zvuk\n"
 
-#: processor_box.cc:1788
+#: processor_box.cc:2462
 msgid ""
 "\n"
 "but at the insertion point, there are:\n"
@@ -9576,31 +10476,27 @@ msgstr ""
 "\n"
 "Ale v bodě vložení jsou:\n"
 
-#: processor_box.cc:1791
+#: processor_box.cc:2465
 msgid "\t%1 MIDI channel\n"
 msgid_plural "\t%1 MIDI channels\n"
 msgstr[0] "\t%1 kanál MIDI\n"
 msgstr[1] "\t%1 kanálů MIDI\n"
 
-#: processor_box.cc:1795
+#: processor_box.cc:2469
 msgid "\t%1 audio channel\n"
 msgid_plural "\t%1 audio channels\n"
 msgstr[0] "\t%1 kanál pro zvuk\n"
 msgstr[1] "\t%1 kanálů pro zvuk\n"
 
-#: processor_box.cc:1798
+#: processor_box.cc:2472
 msgid ""
 "\n"
 "%1 is unable to insert this plugin here.\n"
 msgstr ""
 "\n"
-"%1 není schopen vložit tento přídavný modul zde."
-
-#: processor_box.cc:1835
-msgid "Cannot set up new send: %1"
-msgstr "Nelze nastavit nové odeslání: %1"
+"%1 není schopen vložit tento přídavný modul zde.\n"
 
-#: processor_box.cc:2167
+#: processor_box.cc:2989
 msgid ""
 "You cannot reorder these plugins/sends/inserts\n"
 "in that way because the inputs and\n"
@@ -9610,21 +10506,21 @@ msgstr ""
 "přeuspořádat tímto způsobem, protože vstupy a\n"
 "výstupy nebudou nepracovat správně."
 
-#: processor_box.cc:2367
+#: processor_box.cc:3189
 msgid "Rename Processor"
 msgstr "Přejmenovat procesor"
 
-#: processor_box.cc:2398
+#: processor_box.cc:3220
 msgid "At least 100 IO objects exist with a name like %1 - name not changed"
 msgstr ""
 "Je nejméně 100 I/O (vstupních/výstupních) objektů, které nesou název %1 - "
 "název nezměněn"
 
-#: processor_box.cc:2536
+#: processor_box.cc:3371
 msgid "plugin insert constructor failed"
 msgstr "Vložení přídavného modulu se nezdařilo"
 
-#: processor_box.cc:2547
+#: processor_box.cc:3382
 msgid ""
 "Copying the set of processors on the clipboard failed,\n"
 "probably because the I/O configuration of the plugins\n"
@@ -9634,7 +10530,7 @@ msgstr ""
 "Pravděpodobně se neshoduje vstupní/výstupní nastavení (I/O)\n"
 "přídavných modulů s nastavením pro tuto stopu."
 
-#: processor_box.cc:2593
+#: processor_box.cc:3428
 msgid ""
 "Do you really want to remove all processors from %1?\n"
 "(this cannot be undone)"
@@ -9642,15 +10538,15 @@ msgstr ""
 "Doopravdy chcete odstranit všechny zpracovatele z %1?\n"
 "(Toto se pak nedá vrátit zpátky)"
 
-#: processor_box.cc:2597 processor_box.cc:2622
+#: processor_box.cc:3432 processor_box.cc:3457
 msgid "Yes, remove them all"
 msgstr "Ano, všechny odstranit"
 
-#: processor_box.cc:2599 processor_box.cc:2624
+#: processor_box.cc:3434 processor_box.cc:3459
 msgid "Remove processors"
 msgstr "Přejmenovat zpracovatele"
 
-#: processor_box.cc:2614
+#: processor_box.cc:3449
 msgid ""
 "Do you really want to remove all pre-fader processors from %1?\n"
 "(this cannot be undone)"
@@ -9658,7 +10554,7 @@ msgstr ""
 "Opravdu chcete odstranit všechny zpracovatele před-prolínače z %1?\n"
 "(Toto se pak nedá vrátit zpátky)"
 
-#: processor_box.cc:2617
+#: processor_box.cc:3452
 msgid ""
 "Do you really want to remove all post-fader processors from %1?\n"
 "(this cannot be undone)"
@@ -9666,59 +10562,59 @@ msgstr ""
 "Opravdu chcete odstranit všechny zpracovatele po-prolínače z %1?\n"
 "(Toto se pak nedá vrátit zpátky)"
 
-#: processor_box.cc:2805
+#: processor_box.cc:3641
 msgid "New Plugin"
 msgstr "Vložit nový přídavný modul"
 
-#: processor_box.cc:2808
+#: processor_box.cc:3644
 msgid "New Insert"
 msgstr "Vložit novou vložku"
 
-#: processor_box.cc:2811
+#: processor_box.cc:3647
 msgid "New External Send ..."
 msgstr "Nové vnější odeslání..."
 
-#: processor_box.cc:2815
+#: processor_box.cc:3651
 msgid "New Aux Send ..."
 msgstr "Vložit nové pomocné odeslání (Aux)..."
 
-#: processor_box.cc:2818
+#: processor_box.cc:3654
 msgid "Send Options"
 msgstr "Volby pro odeslání"
 
-#: processor_box.cc:2820
+#: processor_box.cc:3656
 msgid "Clear (all)"
 msgstr "Smazat (vše)"
 
-#: processor_box.cc:2822
+#: processor_box.cc:3658
 msgid "Clear (pre-fader)"
 msgstr "Smazat (před-prolínač)"
 
-#: processor_box.cc:2824
+#: processor_box.cc:3660
 msgid "Clear (post-fader)"
 msgstr "Smazat (po-prolínač)"
 
-#: processor_box.cc:2846
+#: processor_box.cc:3690
 msgid "Activate All"
 msgstr "Zapnout vše"
 
-#: processor_box.cc:2848
+#: processor_box.cc:3692
 msgid "Deactivate All"
 msgstr "Vypnout vše"
 
-#: processor_box.cc:2850
+#: processor_box.cc:3694
 msgid "A/B Plugins"
 msgstr "Přídavné moduly A/B"
 
-#: processor_box.cc:2859
+#: processor_box.cc:3707
 msgid "Edit with generic controls..."
 msgstr "Upravit pomocí generických ovládacích prvků..."
 
-#: processor_box.cc:3162
+#: processor_box.cc:4039
 msgid "%1: %2 (by %3)"
 msgstr "%1: %2 (podle %3)"
 
-#: processor_box.cc:3164
+#: processor_box.cc:4041
 msgid "%1 (by %2)"
 msgstr "%1 (od %2)"
 
@@ -9746,71 +10642,71 @@ msgstr "Banka"
 msgid "main grid"
 msgstr "Hlavní mřížka"
 
-#: quantize_dialog.cc:52 quantize_dialog.cc:109
+#: quantize_dialog.cc:61 quantize_dialog.cc:118
 msgid "Quantize"
 msgstr "Kvantovat"
 
-#: quantize_dialog.cc:56
+#: quantize_dialog.cc:65
 msgid "Strength"
 msgstr "Síla"
 
-#: quantize_dialog.cc:59
+#: quantize_dialog.cc:68
 msgid "Swing"
 msgstr "Swing"
 
-#: quantize_dialog.cc:62
+#: quantize_dialog.cc:71
 msgid "Threshold (ticks)"
 msgstr "Práh (tiknutí)"
 
-#: quantize_dialog.cc:63
+#: quantize_dialog.cc:72
 msgid "Snap note start"
 msgstr "Zapadnout do začátku noty"
 
-#: quantize_dialog.cc:64
+#: quantize_dialog.cc:73
 msgid "Snap note end"
 msgstr "Zapadnout do konce noty"
 
-#: rc_option_editor.cc:81 rc_option_editor.cc:82
+#: rc_option_editor.cc:83 rc_option_editor.cc:84 rc_option_editor.cc:1550
 msgid "Browse..."
 msgstr "Procházet..."
 
-#: rc_option_editor.cc:87
+#: rc_option_editor.cc:89
 msgid "Emphasis on first beat:"
 msgstr "Důraz na první době:"
 
-#: rc_option_editor.cc:93
+#: rc_option_editor.cc:95
 msgid "Use default Click:"
 msgstr "Použít výchozí zvuk pro klepnutí metronomu:"
 
-#: rc_option_editor.cc:99
+#: rc_option_editor.cc:101
 msgid "Click audio file:"
 msgstr "Zvukový soubor pro klepnutí metronomu:"
 
-#: rc_option_editor.cc:106
+#: rc_option_editor.cc:108
 msgid "Click emphasis audio file:"
 msgstr "Zvukový soubor pro zdůraznění klepnutí metronomu:"
 
-#: rc_option_editor.cc:152
+#: rc_option_editor.cc:154
 msgid "Choose Click"
 msgstr "Vybrat zvuk klepnutí"
 
-#: rc_option_editor.cc:175
+#: rc_option_editor.cc:177
 msgid "Choose Click Emphasis"
 msgstr "Vybrat zvuk pro zdůraznění klepnutí"
 
-#: rc_option_editor.cc:236
+#: rc_option_editor.cc:238
 msgid "Limit undo history to"
 msgstr "Omezit historii kroků zpět na"
 
-#: rc_option_editor.cc:237
+#: rc_option_editor.cc:239
 msgid "Save undo history of"
 msgstr "Uložit historii kroků zpět"
 
-#: rc_option_editor.cc:246 rc_option_editor.cc:253
+#: rc_option_editor.cc:248 rc_option_editor.cc:255
 msgid "commands"
 msgstr "Příkazy"
 
-#: rc_option_editor.cc:376
+#: rc_option_editor.cc:378
 msgid ""
 "\n"
 "Changes to this setting will only persist after your project has been saved."
@@ -9818,232 +10714,237 @@ msgstr ""
 "\n"
 "Změny tohoto nastavení budou trvalé jen v případě uložení projektu."
 
-#: rc_option_editor.cc:387 rc_option_editor.cc:449
+#: rc_option_editor.cc:389 rc_option_editor.cc:451
 msgid "<b>Recommended Setting: %1 + button 3 (right mouse button)</b>%2"
 msgstr "<b>Doporučené nastavení: %1 + tlačítko 3 (pravé tlačítko myši)</b>%2"
 
-#: rc_option_editor.cc:401
+#: rc_option_editor.cc:403
 msgid "Select Keyboard layout:"
 msgstr "Vybrat rozvržení klávesnice:"
 
-#: rc_option_editor.cc:420
+#: rc_option_editor.cc:422
 msgid "When Clicking:"
 msgstr "Při klepnutí:"
 
-#: rc_option_editor.cc:427
+#: rc_option_editor.cc:429
 msgid "Edit using:"
 msgstr "Upravit pomocí:"
 
-#: rc_option_editor.cc:433 rc_option_editor.cc:463 rc_option_editor.cc:493
+#: rc_option_editor.cc:435 rc_option_editor.cc:465 rc_option_editor.cc:495
 msgid "+ button"
 msgstr "s tlačítkem myši"
 
-#: rc_option_editor.cc:457
+#: rc_option_editor.cc:459
 msgid "Delete using:"
 msgstr "Odstranit pomocí:"
 
-#: rc_option_editor.cc:479
+#: rc_option_editor.cc:481
 msgid "<b>Recommended Setting: %1 + button 1 (left mouse button)</b>%2"
 msgstr "<b>Doporučené nastavení: %1 + tlačítko 1 (levé tlačítko myši)</b>%2"
 
-#: rc_option_editor.cc:487
+#: rc_option_editor.cc:489
 msgid "Insert note using:"
 msgstr "Vložit notu pomocí:"
 
-#: rc_option_editor.cc:505
+#: rc_option_editor.cc:507
 msgid "When Beginning a Drag:"
 msgstr "Na začátku tažení myši:"
 
-#: rc_option_editor.cc:516 rc_option_editor.cc:543 rc_option_editor.cc:576
-#: rc_option_editor.cc:597 rc_option_editor.cc:641 rc_option_editor.cc:674
-#: rc_option_editor.cc:700 rc_option_editor.cc:728 rc_option_editor.cc:757
-#: rc_option_editor.cc:779
+#: rc_option_editor.cc:518 rc_option_editor.cc:545 rc_option_editor.cc:578
+#: rc_option_editor.cc:599 rc_option_editor.cc:643 rc_option_editor.cc:676
+#: rc_option_editor.cc:702 rc_option_editor.cc:730 rc_option_editor.cc:759
+#: rc_option_editor.cc:781
 msgid "<b>Recommended Setting: %1</b>%2"
 msgstr "<b>Doporučené nastavení: %1</b>%2"
 
-#: rc_option_editor.cc:530
+#: rc_option_editor.cc:532
 msgid "Copy items using:"
 msgstr "Kopírovat položky pomocí:"
 
-#: rc_option_editor.cc:557
+#: rc_option_editor.cc:559
 msgid "Constrain drag using:"
 msgstr "Omezit tažení myši pomocí:"
 
-#: rc_option_editor.cc:565
+#: rc_option_editor.cc:567
 msgid "When Beginning a Trim:"
 msgstr "Na začátku přizpůsobení (zastřihnutí):"
 
-#: rc_option_editor.cc:584
+#: rc_option_editor.cc:586
 msgid "Trim contents using:"
 msgstr "Přizpůsobit obsah pomocí:"
 
-#: rc_option_editor.cc:605
+#: rc_option_editor.cc:607
 msgid "Anchored trim using:"
 msgstr "Ukotvené přizpůsobení pomocí:"
 
-#: rc_option_editor.cc:649
+#: rc_option_editor.cc:651
 msgid "Resize notes relatively using:"
 msgstr "Poměrná změna notových délek pomocí:"
 
-#: rc_option_editor.cc:658
+#: rc_option_editor.cc:660
 msgid "While Dragging:"
 msgstr "Při tažení myši:"
 
-#: rc_option_editor.cc:682
+#: rc_option_editor.cc:684
 msgid "Ignore snap using:"
 msgstr "Přehlížet zapadnutí pomocí:"
 
-#: rc_option_editor.cc:708
+#: rc_option_editor.cc:710
 msgid "Snap relatively using:"
 msgstr "Poměrné zapadnutí pomocí:"
 
-#: rc_option_editor.cc:716
+#: rc_option_editor.cc:718
 msgid "While Trimming:"
 msgstr "Během přizpůsobení:"
 
-#: rc_option_editor.cc:736
+#: rc_option_editor.cc:738
 msgid "Resize overlapped regions using:"
 msgstr "Změna délek překrývajících se oblastí pomocí:"
 
-#: rc_option_editor.cc:744
+#: rc_option_editor.cc:746
 msgid "While Dragging Control Points:"
 msgstr "Při tažení ovládacích bodů myší:"
 
-#: rc_option_editor.cc:765
+#: rc_option_editor.cc:767
 msgid "Fine adjust using:"
 msgstr "Jemné přizpůsobení pomocí:"
 
-#: rc_option_editor.cc:787
+#: rc_option_editor.cc:789
 msgid "Push points using:"
 msgstr "Narazit body pomocí:"
 
-#: rc_option_editor.cc:1027
+#: rc_option_editor.cc:1029
 msgid "GUI and Font scaling:"
 msgstr "Změna velikosti rozhraní a písma:"
 
-#: rc_option_editor.cc:1030
+#: rc_option_editor.cc:1032
 msgid "Default"
 msgstr "Výchozí"
 
-#: rc_option_editor.cc:1056
+#: rc_option_editor.cc:1058
 msgid "Adjusting the scale requires an application restart to re-layout."
 msgstr ""
-"Přizpůsobení velikosti vyžaduje opětovné spuštění programu kvůli přizpůsobení "
-"rozvržení."
+"Přizpůsobení velikosti vyžaduje opětovné spuštění programu kvůli "
+"přizpůsobení rozvržení."
 
-#: rc_option_editor.cc:1098
+#: rc_option_editor.cc:1100
 msgid "∞"
 msgstr "∞"
 
-#: rc_option_editor.cc:1099
+#: rc_option_editor.cc:1101
 msgid "30 sec"
 msgstr "30 s"
 
-#: rc_option_editor.cc:1100
+#: rc_option_editor.cc:1102
 msgid "1 min"
 msgstr "1 min"
 
-#: rc_option_editor.cc:1101
+#: rc_option_editor.cc:1103
 msgid "2 mins"
 msgstr "2 minuty"
 
-#: rc_option_editor.cc:1102
+#: rc_option_editor.cc:1104
 msgid "3 mins"
 msgstr "3 minuty"
 
-#: rc_option_editor.cc:1103
+#: rc_option_editor.cc:1105
 msgid "4 mins"
 msgstr "4 minuty"
 
-#: rc_option_editor.cc:1104
+#: rc_option_editor.cc:1106
 msgid "5 mins"
 msgstr "5 minut"
 
-#: rc_option_editor.cc:1107
+#: rc_option_editor.cc:1109
 msgid ""
 "Specify the default timeout for plugin instantiation. Plugins that require "
 "more time to load will be blacklisted. A value of 0 disables the timeout."
 msgstr ""
 "Zadejte přednastavení pro překročení času pro doložení přídavného modulu. "
-"Přídavné moduly, které k nahrání potřebují více času, budou "
-"umístěny na černou listinu. Hodnota 0 překročení času vypne."
+"Přídavné moduly, které k nahrání potřebují více času, budou umístěny na "
+"černou listinu. Hodnota 0 překročení času vypne."
 
-#: rc_option_editor.cc:1109
+#: rc_option_editor.cc:1111
 msgid "Scan Time Out:"
 msgstr "jak rychle zastavit hledání, pokud nejsou výsledky:"
 
-#: rc_option_editor.cc:1157
+#: rc_option_editor.cc:1159
 msgid "Waveform Clip Level (dBFS):"
 msgstr "Úroveň přebuzení průběhové křivky (dBFS):"
 
-#: rc_option_editor.cc:1210
+#: rc_option_editor.cc:1212
 msgid "Small sessions (4-16 tracks)"
 msgstr "Malá sezení (4-16 stop)"
 
-#: rc_option_editor.cc:1211
+#: rc_option_editor.cc:1213
 msgid "Medium sessions (16-64 tracks)"
 msgstr "Střední sezení (16-64 stop)"
 
-#: rc_option_editor.cc:1212
+#: rc_option_editor.cc:1214
 msgid "Large sessions (64+ tracks)"
 msgstr "Velká sezení (64 a více stop)"
 
-#: rc_option_editor.cc:1213
+#: rc_option_editor.cc:1215
 msgid "Custom (set by sliders below)"
 msgstr "Vlastní (nastaveno pomocí posuvníků níže)"
 
-#: rc_option_editor.cc:1217 export_video_dialog.cc:167
+#: rc_option_editor.cc:1219 export_video_dialog.cc:167
 msgid "Preset:"
 msgstr "Přednastavení:"
 
-#: rc_option_editor.cc:1229
+#: rc_option_editor.cc:1231
 msgid "Playback (seconds of buffering):"
 msgstr "Přehrávání (sekundy ukládání do vyrovnávací paměti):"
 
-#: rc_option_editor.cc:1242
+#: rc_option_editor.cc:1244
 msgid "Recording (seconds of buffering):"
 msgstr "Nahrávání (sekundy ukládání do vyrovnávací paměti):"
 
-#: rc_option_editor.cc:1320
+#: rc_option_editor.cc:1322
 msgid "programming error: unknown buffering preset string, index = %1"
 msgstr ""
 "Chyba v programování: neznámé přednastavení (řetězec znaků) pro ukládání do "
 "vyrovnávací paměti, index = %1"
 
-#: rc_option_editor.cc:1352
+#: rc_option_editor.cc:1353
 msgid "Control Surface Protocol"
 msgstr "Protokol pro ovládací prvky"
 
-#: rc_option_editor.cc:1366
+#: rc_option_editor.cc:1367
 msgid ""
 "Click to edit the settings for selected protocol ( it must be ENABLED "
 "first ):"
 msgstr ""
-"Klepněte pro úpravu nastavení pro vybraný protokol (nejprve musí být POVOLEN):"
+"Klepněte pro úpravu nastavení pro vybraný protokol (nejprve musí být "
+"POVOLEN):"
 
-#: rc_option_editor.cc:1370
+#: rc_option_editor.cc:1371
 msgid "Show Protocol Settings"
 msgstr "Ukázat nastavení protokolu"
 
-#: rc_option_editor.cc:1493
+#: rc_option_editor.cc:1494
 msgid "Configuration"
 msgstr "Nastavení"
 
-#: rc_option_editor.cc:1546
+#: rc_option_editor.cc:1547
 msgid "Show Video Export Info before export"
 msgstr ""
 "Ukázat před uložením do souboru informace o způsobu vyvedení obrazového "
 "záznamu"
 
-#: rc_option_editor.cc:1547
+#: rc_option_editor.cc:1548
 msgid "Show Video Server Startup Dialog"
 msgstr "Ukázat spouštěcí dialog videoserveru"
 
-#: rc_option_editor.cc:1548
+#: rc_option_editor.cc:1549
 msgid "Advanced Setup (remote video server)"
 msgstr "Pokročilé nastavení (vzdálený videoserver)"
 
 #: rc_option_editor.cc:1556
+msgid "Video Server"
+msgstr ""
+
+#: rc_option_editor.cc:1565
 msgid ""
 "<b>When enabled</b> you can speficify a custom video-server URL and docroot. "
 "- Do not enable this option unless you know what you are doing."
@@ -10051,11 +10952,11 @@ msgstr ""
 "<b>Je-li povoleno</b>, můžete určit adresu vlastního videoserveru (URL) a "
 "kořen dokumentu (docroot). - Nepovolujte tuto volbu, pokud nevíte, co děláte."
 
-#: rc_option_editor.cc:1558
+#: rc_option_editor.cc:1567
 msgid "Video Server URL:"
 msgstr "Adresa videoserveru (URL):"
 
-#: rc_option_editor.cc:1563
+#: rc_option_editor.cc:1572
 msgid ""
 "Base URL of the video-server including http prefix. This is usually 'http://"
 "hostname.example.org:1554/' and defaults to 'http://localhost:1554/' when "
@@ -10065,11 +10966,11 @@ msgstr ""
 "je 'http://hostname.example.org:1554/' a výchozí 'http://localhost:1554/', "
 "když běží videoserver místně"
 
-#: rc_option_editor.cc:1565
+#: rc_option_editor.cc:1574
 msgid "Video Folder:"
 msgstr "Složka s obrazovým záznamem:"
 
-#: rc_option_editor.cc:1570
+#: rc_option_editor.cc:1579
 msgid ""
 "Local path to the video-server document-root. Only files below this "
 "directory will be accessible by the video-server. If the server run on a "
@@ -10084,7 +10985,7 @@ msgstr ""
 "nedostupný. Používá se pro místní sledování videa a procházení souborů, když "
 "je soubor s videem otevírán/přidáván."
 
-#: rc_option_editor.cc:1577
+#: rc_option_editor.cc:1584
 msgid ""
 "<b>When enabled</b> an information window with details is displayed before "
 "the video-export dialog."
@@ -10092,7 +10993,7 @@ msgstr ""
 "<b>Je-li povoleno</b>, je před dialogem pro ukládání obrazového záznamu "
 "zobrazeno informační okno s podrobnostmi."
 
-#: rc_option_editor.cc:1582
+#: rc_option_editor.cc:1589
 msgid ""
 "<b>When enabled</b> the video server is never launched automatically without "
 "confirmation"
@@ -10100,91 +11001,113 @@ msgstr ""
 "<b>Je-li povoleno</b>, videoserver není nikdy spuštěn automaticky bez "
 "potvrzení"
 
-#: rc_option_editor.cc:1723
+#: rc_option_editor.cc:1598
+msgid "Custom Path to Video Monitor (%1) - leave empty for default:"
+msgstr ""
+
+#: rc_option_editor.cc:1610
+msgid ""
+"Set a custom path to the Video Monitor Executable, changing this requires a "
+"restart."
+msgstr ""
+
+#: rc_option_editor.cc:1661
+msgid "Set Video Monitor Executable"
+msgstr ""
+
+#: rc_option_editor.cc:1734
+msgid "Column %1"
+msgstr ""
+
+#: rc_option_editor.cc:1852
 msgid "%1 Preferences"
 msgstr "%1 nastavení"
 
-#: rc_option_editor.cc:1734
+#: rc_option_editor.cc:1874
 msgid "DSP CPU Utilization"
 msgstr "Používání CPU pro DSP"
 
-#: rc_option_editor.cc:1738
+#: rc_option_editor.cc:1878
 msgid "Signal processing uses"
 msgstr "Zpracovávání signálu používá"
 
-#: rc_option_editor.cc:1743
+#: rc_option_editor.cc:1883
 msgid "all but one processor"
 msgstr "VÅ¡ichni kromÄ› jednoho zpracovatele"
 
-#: rc_option_editor.cc:1744
+#: rc_option_editor.cc:1884
 msgid "all available processors"
 msgstr "Všichni dostupní zpracovatelé"
 
-#: rc_option_editor.cc:1747
+#: rc_option_editor.cc:1887
 msgid "%1 processors"
 msgstr "%1 zpracovatelé"
 
-#: rc_option_editor.cc:1750
+#: rc_option_editor.cc:1890
 msgid "This setting will only take effect when %1 is restarted."
 msgstr "Toto nastavení se neprojeví, dokud %1 nespustíte znovu."
 
-#: rc_option_editor.cc:1755
+#: rc_option_editor.cc:1895
 msgid "Options|Undo"
 msgstr "Volby|Zpět"
 
-#: rc_option_editor.cc:1762
+#: rc_option_editor.cc:1902
 msgid "Verify removal of last capture"
 msgstr "Potvrdit odstranění poslední nahrávky"
 
-#: rc_option_editor.cc:1767
+#: rc_option_editor.cc:1907
 msgid "Session Management"
 msgstr "Správa sezení"
 
-#: rc_option_editor.cc:1772
+#: rc_option_editor.cc:1912
 msgid "Make periodic backups of the session file"
 msgstr "Dělat pravidelné zálohy souboru se sezením"
 
-#: rc_option_editor.cc:1780
+#: rc_option_editor.cc:1920
 msgid "Always copy imported files"
 msgstr "Vždy kopírovat zavedené soubory"
 
-#: rc_option_editor.cc:1787
+#: rc_option_editor.cc:1927
 msgid "Default folder for new sessions:"
 msgstr "Výchozí složka pro nová sezení:"
 
-#: rc_option_editor.cc:1795
+#: rc_option_editor.cc:1935
 msgid "Maximum number of recent sessions"
 msgstr "Nejvyšší počet nedávných sezení"
 
-#: rc_option_editor.cc:1808
+#: rc_option_editor.cc:1941 rc_option_editor.cc:1943 rc_option_editor.cc:1945
+msgid "Misc/Click"
+msgstr ""
+
+#: rc_option_editor.cc:1948
 msgid "Click gain level"
 msgstr "Úroveň hlasitosti klepnutí"
 
-#: rc_option_editor.cc:1813 route_time_axis.cc:269 route_time_axis.cc:833
+#: rc_option_editor.cc:1953 route_time_axis.cc:277 route_time_axis.cc:831
 msgid "Automation"
 msgstr "Automatizace"
 
-#: rc_option_editor.cc:1818
+#: rc_option_editor.cc:1958
 msgid "Thinning factor (larger value => less data)"
 msgstr "Násobek ztenčování (větší hodnota => méně dat)"
 
-#: rc_option_editor.cc:1827
+#: rc_option_editor.cc:1967
 msgid "Automation sampling interval (milliseconds)"
 msgstr "Interval pro automatizaci (v milisekundách)"
 
-#: rc_option_editor.cc:1835
+#: rc_option_editor.cc:1975
 msgid "Transport Options"
 msgstr "Volby pro přehrávání"
 
-#: rc_option_editor.cc:1841
+#: rc_option_editor.cc:1981
 msgid "Keep record-enable engaged on stop"
 msgstr "Udržovat zapnuté nahrávání po zastavení zapojeno"
 
-#: rc_option_editor.cc:1850
+#: rc_option_editor.cc:1990
 msgid "Play loop is a transport mode"
 msgstr "Přehrávání smyčky je přehrávací režim"
 
-#: rc_option_editor.cc:1855
+#: rc_option_editor.cc:1995
 msgid ""
 "<b>When enabled</b> the loop button does not start playback but forces "
 "playback to always play the loop\n"
@@ -10198,11 +11121,11 @@ msgstr ""
 "<b>Když je zakázáno</b>, tlačítko pro smyčku spustí přehrávání ve smyčce, "
 "ale po stisknutí tlačítka Zastavit dojde ke zrušení přehrávání ve smyčce"
 
-#: rc_option_editor.cc:1861
+#: rc_option_editor.cc:2001
 msgid "Stop recording when an xrun occurs"
 msgstr "Zastavit nahrávání v případě xrun (časového rozdílu)"
 
-#: rc_option_editor.cc:1866
+#: rc_option_editor.cc:2006
 msgid ""
 "<b>When enabled</b> %1 will stop recording if an over- or underrun is "
 "detected by the audio engine"
@@ -10210,15 +11133,15 @@ msgstr ""
 "<b>Když je povoleno</b>, %1 zastaví nahrávání, pokud je zjištěno přetečení "
 "nebo podtečení"
 
-#: rc_option_editor.cc:1872
+#: rc_option_editor.cc:2012
 msgid "Create markers where xruns occur"
 msgstr "Vytvořit značky tam, kde se xrun (časový rozdíl) objeví"
 
-#: rc_option_editor.cc:1881
+#: rc_option_editor.cc:2021
 msgid "Stop at the end of the session"
 msgstr "Zastavit na konci sezení"
 
-#: rc_option_editor.cc:1886
+#: rc_option_editor.cc:2026
 msgid ""
 "<b>When enabled</b> if %1 is <b>not recording</b>, it will stop the "
 "transport when it reaches the current session end marker\n"
@@ -10231,11 +11154,11 @@ msgstr ""
 "\n"
 "<b>Když je zakázáno</b> %1 bude pokračovat vždy až na konec sezení"
 
-#: rc_option_editor.cc:1894
+#: rc_option_editor.cc:2034
 msgid "Do seamless looping (not possible when slaved to MTC, LTC etc)"
 msgstr "Dělat souvislou smyčku (není možné, když MTC, LTC atd. jsou hlavní)"
 
-#: rc_option_editor.cc:1899
+#: rc_option_editor.cc:2039
 msgid ""
 "<b>When enabled</b> this will loop by reading ahead and wrapping around at "
 "the loop point, preventing any need to do a transport locate at the end of "
@@ -10245,18 +11168,18 @@ msgid ""
 "loop when %1 reaches the end which will often cause a small click or delay"
 msgstr ""
 "<b>Když je povoleno</b>, bude se přehrávat ve smyčce čtením vpřed a na "
-"koncovém bodu "
-"smyčky se skočí zpět, čímž se vyhne novému umístění na konci smyčky.\n"
+"koncovém bodu smyčky se skočí zpět, čímž se vyhne novému umístění na konci "
+"smyčky.\n"
 "\n"
 "<b>Když je zakázáno</b>, skočí se při dosažení konce smyčky na začátek "
 "smyčky, když  %1 dosáhne konce, což často způsobí slyšitelné prasknutí nebo "
 "zpoždění"
 
-#: rc_option_editor.cc:1907
+#: rc_option_editor.cc:2047
 msgid "Disable per-track record disarm while rolling"
 msgstr "Zakázat při nahrávání stav nahrávání jednotlivé stopy"
 
-#: rc_option_editor.cc:1911
+#: rc_option_editor.cc:2051
 msgid ""
 "<b>When enabled</b> this will prevent you from accidentally stopping "
 "specific tracks recording during a take"
@@ -10264,12 +11187,12 @@ msgstr ""
 "<b>Když je povoleno</b>, zabrání vám to v nechtěném zastavení nahrávání "
 "určitých stop"
 
-#: rc_option_editor.cc:1916
+#: rc_option_editor.cc:2056
 msgid "12dB gain reduction during fast-forward and fast-rewind"
 msgstr ""
 "Při přetáčení rychle dopředu a rychle dozadu snížit hladinu zvuku o 12dB"
 
-#: rc_option_editor.cc:1920
+#: rc_option_editor.cc:2060
 msgid ""
 "This will reduce the unpleasant increase in perceived volume that occurs "
 "when fast-forwarding or rewinding through some kinds of audio"
@@ -10277,11 +11200,11 @@ msgstr ""
 "Toto omezí nepříjemné zvýšení vnímané hlasitosti, které se vyskytuje u "
 "některého materiálu při přetáčení vpřed/zpětném chodu"
 
-#: rc_option_editor.cc:1926
+#: rc_option_editor.cc:2066
 msgid "Preroll"
 msgstr "Přetáčení vpřed"
 
-#: rc_option_editor.cc:1931
+#: rc_option_editor.cc:2071
 msgid ""
 "The amount of preroll (in seconds) to apply when <b>Play with Preroll</b> is "
 "initiated.\n"
@@ -10293,45 +11216,53 @@ msgstr ""
 "<b>přehrávání s přetáčením vpřed</b>.\n"
 "\n"
 "Pokud je povoleno <b>Následovat úpravy</b>, přetáčení vpřed se používá na "
-"polohu ukazatele přehrávání, když je vybrána nebo v délce přizpůsobena oblast."
+"polohu ukazatele přehrávání, když je vybrána nebo v délce přizpůsobena "
+"oblast."
 
-#: rc_option_editor.cc:1933
+#: rc_option_editor.cc:2073
 msgid "0 (no pre-roll)"
 msgstr "0 (žádné přetáčení)"
 
-#: rc_option_editor.cc:1934
+#: rc_option_editor.cc:2074
 msgid "0.1 second"
 msgstr "0,1 sekunda"
 
-#: rc_option_editor.cc:1935
+#: rc_option_editor.cc:2075
 msgid "0.25 second"
 msgstr "0,25 sekunda"
 
-#: rc_option_editor.cc:1936
+#: rc_option_editor.cc:2076
 msgid "0.5 second"
 msgstr "0,5 sekunda"
 
-#: rc_option_editor.cc:1937
+#: rc_option_editor.cc:2077
 msgid "1.0 second"
 msgstr "1,0 sekunda"
 
-#: rc_option_editor.cc:1938
+#: rc_option_editor.cc:2078
 msgid "2.0 seconds"
 msgstr "2,0 sekundy"
 
-#: rc_option_editor.cc:1941
-msgid "Sync/Slave"
-msgstr "Sync/Slave"
+#: rc_option_editor.cc:2081 rc_option_editor.cc:2090 rc_option_editor.cc:2106
+#: rc_option_editor.cc:2127 rc_option_editor.cc:2145 rc_option_editor.cc:2147
+#: rc_option_editor.cc:2164 rc_option_editor.cc:2167 rc_option_editor.cc:2169
+#: rc_option_editor.cc:2197
+msgid "Transport/Sync"
+msgstr ""
+
+#: rc_option_editor.cc:2081
+msgid "Synchronization and Slave Options"
+msgstr ""
 
-#: rc_option_editor.cc:1945
+#: rc_option_editor.cc:2085
 msgid "External timecode source"
 msgstr "Vnější zdroj časového kódu"
 
-#: rc_option_editor.cc:1954
+#: rc_option_editor.cc:2094
 msgid "Match session video frame rate to external timecode"
 msgstr "Přizpůsobit rychlost snímkování obrazu vnějšímu časovému kódu"
 
-#: rc_option_editor.cc:1960
+#: rc_option_editor.cc:2100
 msgid ""
 "This option controls the value of the video frame rate <i>while chasing</i> "
 "an external timecode source.\n"
@@ -10355,11 +11286,11 @@ msgstr ""
 "ukazatel rychlosti snímkování v hlavních hodinách zčervená a %1 bude "
 "převádět mezi standardem vnějšího časového kódu a standardem sezení."
 
-#: rc_option_editor.cc:1970
+#: rc_option_editor.cc:2110
 msgid "Sync-lock timecode to clock (disable drift compensation)"
 msgstr "Uzamknout seřizování časového kódu a hodin (zamezit vyrovnání posunu))"
 
-#: rc_option_editor.cc:1976
+#: rc_option_editor.cc:2116
 msgid ""
 "<b>When enabled</b> %1 will never varispeed when slaved to external "
 "timecode. Sync Lock indicates that the selected external timecode source "
@@ -10371,21 +11302,20 @@ msgid ""
 "the timecode sources shares clock sync."
 msgstr ""
 "<b>Když je povoleno</b>, %1 nikdy nebude přehrávat s proměnlivou rychlostí, "
-"když je seřizován k vnějšímu časovému kódu. Uzamknutí seřizování "
-"ukazuje, že vybraný vnější zdroj časového kódu se zvukovým rozhraním "
-"sdílí seřizování hodin (Black & Burst, Wordclock atd.) "
-"Tato volba vypíná vyrovnávání posunu. Rychlost přehrávání je pevně stanovena "
-"na "
-"1,0. Varispeed LTC se přehlíží a zapříčiňuje posun.\n"
+"když je seřizován k vnějšímu časovému kódu. Uzamknutí seřizování ukazuje, že "
+"vybraný vnější zdroj časového kódu se zvukovým rozhraním sdílí seřizování "
+"hodin (Black & Burst, Wordclock atd.) Tato volba vypíná vyrovnávání "
+"posunu. Rychlost přehrávání je pevně stanovena na 1,0. Varispeed LTC se "
+"přehlíží a zapříčiňuje posun.\n"
 "\n"
-"<b>Když je zakázáno</b>, %1 bude vyrovnávat možný posun, nehledě na to, "
-"zda zdroje časového kódu sdílejí seřizování hodin."
+"<b>Když je zakázáno</b>, %1 bude vyrovnávat možný posun, nehledě na to, zda "
+"zdroje časového kódu sdílejí seřizování hodin."
 
-#: rc_option_editor.cc:1991
+#: rc_option_editor.cc:2131
 msgid "Lock to 29.9700 fps instead of 30000/1001"
 msgstr "Pevně na 29,9700 snímků za sekundu (FPS) namísto 30000/1001"
 
-#: rc_option_editor.cc:1997
+#: rc_option_editor.cc:2137
 msgid ""
 "<b>When enabled</b> the external timecode source is assumed to use 29.97 fps "
 "instead of 30000/1001.\n"
@@ -10407,27 +11337,27 @@ msgstr ""
 "někteří výrobci tuto rychlost používají - i když je to proti specifikaci - "
 "protože při variantě s 29.97 fps se nevyskytuje žádný posuv časového kódu.\n"
 
-#: rc_option_editor.cc:2007
+#: rc_option_editor.cc:2147
 msgid "LTC Reader"
 msgstr "Čtečka LTC"
 
-#: rc_option_editor.cc:2011
+#: rc_option_editor.cc:2151
 msgid "LTC incoming port"
 msgstr "Vstupní přípojka LTC"
 
-#: rc_option_editor.cc:2027
+#: rc_option_editor.cc:2167
 msgid "LTC Generator"
 msgstr "Generátor LTC"
 
-#: rc_option_editor.cc:2032
+#: rc_option_editor.cc:2172
 msgid "Enable LTC generator"
 msgstr "Povolit generátor LTC"
 
-#: rc_option_editor.cc:2039
+#: rc_option_editor.cc:2179
 msgid "Send LTC while stopped"
 msgstr "Poslat LTC, když přehrávání stojí"
 
-#: rc_option_editor.cc:2045
+#: rc_option_editor.cc:2185
 msgid ""
 "<b>When enabled</b> %1 will continue to send LTC information even when the "
 "transport (playhead) is not moving"
@@ -10435,28 +11365,27 @@ msgstr ""
 "<b>Když je povoleno</b>, %1 bude pokračovat v posílání informací LTC, i když "
 "se ukazatel polohy přehrávání nepohybuje"
 
-#: rc_option_editor.cc:2051
+#: rc_option_editor.cc:2191
 msgid "LTC generator level"
 msgstr "Hlasitost generátoru LTC"
 
-#: rc_option_editor.cc:2055
+#: rc_option_editor.cc:2195
 msgid ""
 "Specify the Peak Volume of the generated LTC signal in dbFS. A good value "
 "is  0dBu ^= -18dbFS in an EBU calibrated system"
 msgstr ""
 "Zadejte nejvyšší hodnotu hlasitosti vytvořeného signálu LTC v dbFS. Dobrou "
-"hodnotou pro "
-"kalibrovaný systém EBU je 0dBu ^= -18dbFS"
+"hodnotou pro kalibrovaný systém EBU je 0dBu ^= -18dbFS"
 
-#: rc_option_editor.cc:2064
+#: rc_option_editor.cc:2204
 msgid "Make rubberband selection rectangle snap to the grid"
 msgstr "Udělat z pružného výběru oblasti obdélníkové zapadnutí do mřížky"
 
-#: rc_option_editor.cc:2071
+#: rc_option_editor.cc:2211
 msgid "Name new markers"
 msgstr "Pojmenovat nové značky"
 
-#: rc_option_editor.cc:2076
+#: rc_option_editor.cc:2216
 msgid ""
 "If enabled, popup a dialog when a new marker is created to allow its name to "
 "be set as it is created.\n"
@@ -10468,401 +11397,411 @@ msgstr ""
 "\n"
 "Značky můžete vždy klepnutím pravým tlačítkem myši na ně přejmenovat"
 
-#: rc_option_editor.cc:2082
+#: rc_option_editor.cc:2222
 msgid "Allow dragging of playhead"
 msgstr "Povolit tažení ukazatele polohy"
 
-#: rc_option_editor.cc:2090
-msgid "Show meters on tracks in the editor"
-msgstr "Ukázat měřidla na stopách v editoru"
-
-#: rc_option_editor.cc:2098
+#: rc_option_editor.cc:2230
 msgid "Display master-meter in the toolbar"
 msgstr "Zobrazit hlavní měřič v nástrojovém pruhu"
 
-#: rc_option_editor.cc:2107
+#: rc_option_editor.cc:2239
 msgid "Show zoom toolbar (if torn off)"
 msgstr "Ukázat nástrojový pruh pro zvětšení (pokud je spuštěn)"
 
-#: rc_option_editor.cc:2116
+#: rc_option_editor.cc:2247
+msgid ""
+"Always use mouse cursor position as zoom focus when zooming using mouse "
+"scroll wheel"
+msgstr ""
+
+#: rc_option_editor.cc:2256
 msgid "Update editor window during drags of the summary"
 msgstr "Obnovit okno editoru během tažení shrnutí"
 
-#: rc_option_editor.cc:2124
+#: rc_option_editor.cc:2264
 msgid "Auto-scroll editor window when dragging near its edges"
 msgstr "Automaticky projíždět okno editoru při tažení blízko jeho okrajů"
 
-#: rc_option_editor.cc:2132
+#: rc_option_editor.cc:2272
 msgid "Show gain envelopes in audio regions"
 msgstr "Ukázat obálky zesílení v oblastech zvuku"
 
-#: rc_option_editor.cc:2133
+#: rc_option_editor.cc:2273
 msgid "in all modes"
 msgstr "Ve všech režimech"
 
-#: rc_option_editor.cc:2134
+#: rc_option_editor.cc:2274
 msgid "only in Draw and Internal Edit modes"
 msgstr "Pouze v režimu kreslení a vnitřních úprav"
 
-#: rc_option_editor.cc:2139
+#: rc_option_editor.cc:2279
 msgid "Editor Behavior"
 msgstr "Chování editoru"
 
-#: rc_option_editor.cc:2144
+#: rc_option_editor.cc:2284
 msgid "Move relevant automation when audio regions are moved"
 msgstr ""
 "Přesunout související automatizaci, když jsou zvukové oblasti přesunuty"
 
-#: rc_option_editor.cc:2151
+#: rc_option_editor.cc:2291
 msgid "Default fade shape"
 msgstr "Výchozí tvar prolínání"
 
-#: rc_option_editor.cc:2170
+#: rc_option_editor.cc:2310
 msgid "Regions in active edit groups are edited together"
 msgstr "Oblasti ve skupinách, které se upravují, jsou upravovány společně"
 
-#: rc_option_editor.cc:2171
+#: rc_option_editor.cc:2311
 msgid "whenever they overlap in time"
 msgstr "Vždycky když se časově překrývají"
 
-#: rc_option_editor.cc:2172
+#: rc_option_editor.cc:2312
 msgid "only if they have identical length, position and origin"
 msgstr "Jen když mají stejnou délku, polohu a původ"
 
-#: rc_option_editor.cc:2181
+#: rc_option_editor.cc:2321
 msgid "Layering model"
 msgstr "Model vrstvení"
 
-#: rc_option_editor.cc:2186
+#: rc_option_editor.cc:2326
 msgid "later is higher"
 msgstr "Pozdější je výše"
 
-#: rc_option_editor.cc:2187
+#: rc_option_editor.cc:2327
 msgid "manual layering"
 msgstr "Ruční vrstvení"
 
-#: rc_option_editor.cc:2192
+#: rc_option_editor.cc:2332
 msgid "After splitting selected regions, select"
 msgstr "Po rozdělení vybraných oblastí"
 
-#: rc_option_editor.cc:2197
+#: rc_option_editor.cc:2337
 msgid "no regions"
 msgstr "nevybrat žádné oblasti"
 
-#: rc_option_editor.cc:2200
+#: rc_option_editor.cc:2340
 msgid "newly-created regions"
 msgstr "vybrat nově vytvořené oblasti"
 
-#: rc_option_editor.cc:2204
+#: rc_option_editor.cc:2344
 msgid "existing selection and newly-created regions"
 msgstr "vybrat stávající oblast a nově vytvořené oblasti"
 
-#: rc_option_editor.cc:2208
+#: rc_option_editor.cc:2348 rc_option_editor.cc:2351 rc_option_editor.cc:2360
+#: rc_option_editor.cc:2378 rc_option_editor.cc:2390 rc_option_editor.cc:2392
+msgid "Editor/Waveforms"
+msgstr ""
+
+#: rc_option_editor.cc:2348
 msgid "Waveforms"
 msgstr "Tvary vln"
 
-#: rc_option_editor.cc:2214
+#: rc_option_editor.cc:2354
 msgid "Show waveforms in regions"
 msgstr "Ukázat průběhovou křivku v oblastech"
 
-#: rc_option_editor.cc:2223
+#: rc_option_editor.cc:2363
 msgid "Show waveforms for audio while it is being recorded"
 msgstr "Ukázat průběhové křivky zvuku, když je nahráván"
 
-#: rc_option_editor.cc:2230
+#: rc_option_editor.cc:2370
 msgid "Waveform scale"
 msgstr "Velikost průběhové křivky"
 
-#: rc_option_editor.cc:2235
+#: rc_option_editor.cc:2375
 msgid "linear"
 msgstr "Přímý"
 
-#: rc_option_editor.cc:2236
+#: rc_option_editor.cc:2376
 msgid "logarithmic"
 msgstr "Logaritmický"
 
-#: rc_option_editor.cc:2242
+#: rc_option_editor.cc:2382
 msgid "Waveform shape"
 msgstr "Podoba průběhové křivky"
 
-#: rc_option_editor.cc:2247
+#: rc_option_editor.cc:2387
 msgid "traditional"
 msgstr "Tradiční"
 
-#: rc_option_editor.cc:2248
+#: rc_option_editor.cc:2388
 msgid "rectified"
 msgstr "Narovnaná"
 
-#: rc_option_editor.cc:2257
+#: rc_option_editor.cc:2397
 msgid "Buffering"
 msgstr "Ukládání do vyrovnávací paměti"
 
-#: rc_option_editor.cc:2265
+#: rc_option_editor.cc:2405
 msgid "Record monitoring handled by"
 msgstr "Sledování nahrávání je spravováno"
 
-#: rc_option_editor.cc:2271
+#: rc_option_editor.cc:2411
 msgid "via Audio Driver"
 msgstr "přes ovladač zvuku"
 
-#: rc_option_editor.cc:2277
+#: rc_option_editor.cc:2417
 msgid "audio hardware"
 msgstr "zvukové technické vybavení"
 
-#: rc_option_editor.cc:2284
+#: rc_option_editor.cc:2424
 msgid "Tape machine mode"
 msgstr "Režim páskového stroje"
 
-#: rc_option_editor.cc:2290
+#: rc_option_editor.cc:2429
 msgid "Connection of tracks and busses"
 msgstr "Spojení stop a sběrnic"
 
-#: rc_option_editor.cc:2295
+#: rc_option_editor.cc:2435
 msgid "Auto-connect master/monitor busses"
 msgstr "Automaticky spojit hlavní/sledovací sběrnice"
 
-#: rc_option_editor.cc:2302
+#: rc_option_editor.cc:2442
 msgid "Connect track inputs"
 msgstr "Spojit vstupy stop"
 
-#: rc_option_editor.cc:2307
+#: rc_option_editor.cc:2447
 msgid "automatically to physical inputs"
 msgstr "Automaticky s fyzickými vstupy"
 
-#: rc_option_editor.cc:2308 rc_option_editor.cc:2321
+#: rc_option_editor.cc:2448 rc_option_editor.cc:2461
 msgid "manually"
 msgstr "Ručně"
 
-#: rc_option_editor.cc:2314
+#: rc_option_editor.cc:2454
 msgid "Connect track and bus outputs"
 msgstr "Spojit výstupy stop a sběrnic"
 
-#: rc_option_editor.cc:2319
+#: rc_option_editor.cc:2459
 msgid "automatically to physical outputs"
 msgstr "automaticky s fyzickými výstupy"
 
-#: rc_option_editor.cc:2320
+#: rc_option_editor.cc:2460
 msgid "automatically to master bus"
 msgstr "automaticky s hlavní sběrnicí"
 
-#: rc_option_editor.cc:2326
+#: rc_option_editor.cc:2467
+msgid "Use 'Strict-I/O' for new tracks or Busses"
+msgstr ""
+
+#: rc_option_editor.cc:2478
 msgid "Denormals"
 msgstr "Neobvyklé hodnoty"
 
-#: rc_option_editor.cc:2331
+#: rc_option_editor.cc:2483
 msgid "Use DC bias to protect against denormals"
 msgstr ""
 "Použít předpětí přímého proudu (DC bias) pro ochranu proti neobvyklým "
 "hodnotám"
 
-#: rc_option_editor.cc:2338
+#: rc_option_editor.cc:2490
 msgid "Processor handling"
 msgstr "Řízení zpracování"
 
-#: rc_option_editor.cc:2344
+#: rc_option_editor.cc:2496
 msgid "no processor handling"
 msgstr "Žádné řízení zpracování"
 
-#: rc_option_editor.cc:2350
+#: rc_option_editor.cc:2502
 msgid "use FlushToZero"
 msgstr "Použít ZrudnoutKNule"
 
-#: rc_option_editor.cc:2357
+#: rc_option_editor.cc:2509
 msgid "use DenormalsAreZero"
 msgstr "Použít NeobvykléHodnotyJsouNula"
 
-#: rc_option_editor.cc:2364
+#: rc_option_editor.cc:2516
 msgid "use FlushToZero and DenormalsAreZero"
 msgstr "Použít ZrudnoutKNule a NeobvykléHodnotyJsouNula"
 
-#: rc_option_editor.cc:2380
-msgid "Silence plugins when the transport is stopped"
-msgstr "Ztišit přídavné moduly, když je pohyb zastaven "
-
-#: rc_option_editor.cc:2388
-msgid "Make new plugins active"
-msgstr "Uvést nové přídavné moduly do činnosti"
-
-#: rc_option_editor.cc:2398
+#: rc_option_editor.cc:2532
 msgid "Enable automatic analysis of audio"
 msgstr "Povolit automatický rozbor zvuku"
 
-#: rc_option_editor.cc:2406
+#: rc_option_editor.cc:2540
 msgid "Replicate missing region channels"
 msgstr "Zreprodukovat chybějící kanály oblasti"
 
-#: rc_option_editor.cc:2413 rc_option_editor.cc:2422 rc_option_editor.cc:2424
-#: rc_option_editor.cc:2432 rc_option_editor.cc:2440 rc_option_editor.cc:2448
-#: rc_option_editor.cc:2466 rc_option_editor.cc:2478 rc_option_editor.cc:2490
-#: rc_option_editor.cc:2492 rc_option_editor.cc:2494 rc_option_editor.cc:2502
-#: rc_option_editor.cc:2510 rc_option_editor.cc:2518 rc_option_editor.cc:2526
-#: rc_option_editor.cc:2528
-msgid "Solo / mute"
-msgstr "Sólo/Ztlumit"
+#: rc_option_editor.cc:2547 rc_option_editor.cc:2556 rc_option_editor.cc:2558
+#: rc_option_editor.cc:2566 rc_option_editor.cc:2574 rc_option_editor.cc:2582
+#: rc_option_editor.cc:2600 rc_option_editor.cc:2612 rc_option_editor.cc:2624
+#: rc_option_editor.cc:2626 rc_option_editor.cc:2628 rc_option_editor.cc:2636
+#: rc_option_editor.cc:2644 rc_option_editor.cc:2652 rc_option_editor.cc:2662
+#: rc_option_editor.cc:2663
+msgid "Solo & mute"
+msgstr ""
 
-#: rc_option_editor.cc:2417
+#: rc_option_editor.cc:2551
 msgid "Solo controls are Listen controls"
 msgstr "Ovládací prvky pro sólo jsou ovládacími prvky pro poslech"
 
-#: rc_option_editor.cc:2427
+#: rc_option_editor.cc:2561
 msgid "Exclusive solo"
 msgstr "Výhradní sólo"
 
-#: rc_option_editor.cc:2435
+#: rc_option_editor.cc:2569
 msgid "Show solo muting"
 msgstr "Sólo ukázat jako oněmělé"
 
-#: rc_option_editor.cc:2443
+#: rc_option_editor.cc:2577
 msgid "Soloing overrides muting"
 msgstr "Sólo má přednost před ztlumením"
 
-#: rc_option_editor.cc:2451
+#: rc_option_editor.cc:2585
 msgid "Solo-in-place mute cut (dB)"
 msgstr "Vyjmutí ztlumení sóla (dB)"
 
-#: rc_option_editor.cc:2458
+#: rc_option_editor.cc:2592
 msgid "Listen Position"
 msgstr "Poloha poslechu"
 
-#: rc_option_editor.cc:2463
+#: rc_option_editor.cc:2597
 msgid "after-fader (AFL)"
 msgstr "Po-prolínač (AFL)"
 
-#: rc_option_editor.cc:2464
+#: rc_option_editor.cc:2598
 msgid "pre-fader (PFL)"
 msgstr "Před-prolínač (PFL)"
 
-#: rc_option_editor.cc:2470
+#: rc_option_editor.cc:2604
 msgid "PFL signals come from"
 msgstr "PFL signály přicházejí z"
 
-#: rc_option_editor.cc:2475
+#: rc_option_editor.cc:2609
 msgid "before pre-fader processors"
 msgstr "Zpracovatelé před před-prolínače"
 
-#: rc_option_editor.cc:2476
+#: rc_option_editor.cc:2610
 msgid "pre-fader but after pre-fader processors"
 msgstr "Zpracovatelé před-prolínače ale po před-prolínače"
 
-#: rc_option_editor.cc:2482
+#: rc_option_editor.cc:2616
 msgid "AFL signals come from"
 msgstr "AFL signály přicházejí z"
 
-#: rc_option_editor.cc:2487
+#: rc_option_editor.cc:2621
 msgid "immediately post-fader"
 msgstr "Okamžitě po-prolínači"
 
-#: rc_option_editor.cc:2488
+#: rc_option_editor.cc:2622
 msgid "after post-fader processors (before pan)"
 msgstr "Zpracovatelé po po-prolínače (před vyvážením)"
 
-#: rc_option_editor.cc:2492
+#: rc_option_editor.cc:2626
 msgid "Default track / bus muting options"
 msgstr "Výchozí volby pro ztlumení stopy/sběrnice"
 
-#: rc_option_editor.cc:2497
+#: rc_option_editor.cc:2631
 msgid "Mute affects pre-fader sends"
 msgstr "Ztlumení ovlivní odeslání před-prolínače"
 
-#: rc_option_editor.cc:2505
+#: rc_option_editor.cc:2639
 msgid "Mute affects post-fader sends"
 msgstr "Ztlumení ovlivní odeslání po-prolínače"
 
-#: rc_option_editor.cc:2513
+#: rc_option_editor.cc:2647
 msgid "Mute affects control outputs"
 msgstr "Ztlumení ovlivní ovládací výstupy"
 
-#: rc_option_editor.cc:2521
+#: rc_option_editor.cc:2655
 msgid "Mute affects main outputs"
 msgstr "Ztlumení ovlivní hlavní výstupy"
 
-#: rc_option_editor.cc:2526
+#: rc_option_editor.cc:2662
 msgid "Send Routing"
 msgstr "Vedení odeslání"
 
-#: rc_option_editor.cc:2531
+#: rc_option_editor.cc:2666
 msgid "Link panners of Aux and External Sends with main panner by default"
 msgstr "Spojí vyvažovače AUX a vnějšího odeslání s hlavním vyvažovačem"
 
-#: rc_option_editor.cc:2536
+#: rc_option_editor.cc:2672
 msgid "MIDI Preferences"
 msgstr "Nastavení MIDI"
 
-#: rc_option_editor.cc:2541
+#: rc_option_editor.cc:2677
 msgid "MIDI read-ahead time (seconds)"
 msgstr "Čas čtení v předstihu MIDI (sekundy)"
 
-#: rc_option_editor.cc:2551
+#: rc_option_editor.cc:2687
 msgid "Initial program change"
 msgstr "Počáteční změna programu"
 
-#: rc_option_editor.cc:2560
+#: rc_option_editor.cc:2696
 msgid "Display first MIDI bank/program as 0"
 msgstr "Zobrazit první banku/program MIDI jako 0"
 
-#: rc_option_editor.cc:2568
+#: rc_option_editor.cc:2704
 msgid "Never display periodic MIDI messages (MTC, MIDI Clock)"
 msgstr "Nikdy nezobrazovat periodické zprávy MIDI (MTC, hodiny MIDI)"
 
-#: rc_option_editor.cc:2576
+#: rc_option_editor.cc:2712
 msgid "Sound MIDI notes as they are selected in the editor"
 msgstr "Noty MIDI zaznívají při výběru v editoru"
 
-#: rc_option_editor.cc:2584
+#: rc_option_editor.cc:2720
 msgid "Send MIDI control feedback"
 msgstr "Poslat zpětnou vazbu k ovládání MIDI"
 
-#: rc_option_editor.cc:2589
+#: rc_option_editor.cc:2725 rc_option_editor.cc:2727 rc_option_editor.cc:2735
+#: rc_option_editor.cc:2737 rc_option_editor.cc:2745 rc_option_editor.cc:2754
+#: rc_option_editor.cc:2756 rc_option_editor.cc:2764 rc_option_editor.cc:2772
+#: rc_option_editor.cc:2781
+msgid "MIDI/Sync"
+msgstr ""
+
+#: rc_option_editor.cc:2725
 msgid "MIDI Clock"
 msgstr "Hodiny MIDI"
 
-#: rc_option_editor.cc:2599
+#: rc_option_editor.cc:2735
 msgid "MIDI Time Code (MTC)"
 msgstr "Časový kód MIDI (MTC)"
 
-#: rc_option_editor.cc:2604
+#: rc_option_editor.cc:2740
 msgid "Send MIDI Time Code"
 msgstr "Poslat časový kód MIDI"
 
-#: rc_option_editor.cc:2612
+#: rc_option_editor.cc:2748
 msgid "Percentage either side of normal transport speed to transmit MTC"
 msgstr ""
 "Procento kterékoli strany běžné rychlosti pohybu k odeslání časového kódu "
 "MIDI (MTC)"
 
-#: rc_option_editor.cc:2618
+#: rc_option_editor.cc:2754
 msgid "Midi Machine Control (MMC)"
 msgstr "Ovládání stroje MIDI (MMC)"
 
-#: rc_option_editor.cc:2623
+#: rc_option_editor.cc:2759
 msgid "Obey MIDI Machine Control commands"
 msgstr "Přijímat příkazy pro ovládání stroje MIDI"
 
-#: rc_option_editor.cc:2631
+#: rc_option_editor.cc:2767
 msgid "Send MIDI Machine Control commands"
 msgstr "Poslat příkazy pro ovládání stroje MIDI"
 
-#: rc_option_editor.cc:2639
+#: rc_option_editor.cc:2775
 msgid "Inbound MMC device ID"
 msgstr "ID zařízení MMC (ovládání stroje MIDI) na vstupu"
 
-#: rc_option_editor.cc:2648
+#: rc_option_editor.cc:2784
 msgid "Outbound MMC device ID"
 msgstr "ID zařízení MMC (ovládání stroje MIDI) na výstupu"
 
-#: rc_option_editor.cc:2654
+#: rc_option_editor.cc:2790
 msgid "Midi Audition"
 msgstr "Poslech MIDI"
 
-#: rc_option_editor.cc:2658
+#: rc_option_editor.cc:2794
 msgid "Midi Audition Synth (LV2)"
 msgstr "Syntetizátor pro poslech MIDI (LV2)"
 
-#: rc_option_editor.cc:2689 rc_option_editor.cc:2699 rc_option_editor.cc:2701
+#: rc_option_editor.cc:2825 rc_option_editor.cc:2835 rc_option_editor.cc:2837
 msgid "User interaction"
 msgstr "Uživatelská interakce"
 
-#: rc_option_editor.cc:2692
+#: rc_option_editor.cc:2828
 msgid ""
 "Use translations of %1 messages\n"
 "   <i>(requires a restart of %1 to take effect)</i>\n"
@@ -10872,35 +11811,23 @@ msgstr ""
 "   <i>(aby se projevilo, vyžaduje opětovné spuštění %1)</i>\n"
 "   <i>(je-li dostupné pro vaše jazykové nastavení)</i>"
 
-#: rc_option_editor.cc:2699
+#: rc_option_editor.cc:2835
 msgid "Keyboard"
 msgstr "Klávesnice"
 
-#: rc_option_editor.cc:2709
-msgid "Control surface remote ID"
-msgstr "Vzdálené ID pro ovládací prvky"
-
-#: rc_option_editor.cc:2714
-msgid "assigned by user"
-msgstr "určeno uživatelem"
-
-#: rc_option_editor.cc:2715
-msgid "follows order of mixer"
-msgstr "následuje pořadí ve směšovači"
+#: rc_option_editor.cc:2848 startup.cc:352
+msgid "Scan for Plugins"
+msgstr "Hledat přídavné moduly"
 
-#: rc_option_editor.cc:2723
+#: rc_option_editor.cc:2853
 msgid "General"
 msgstr "Obecné"
 
-#: rc_option_editor.cc:2726 startup.cc:351
-msgid "Scan for Plugins"
-msgstr "Hledat přídavné moduly"
-
-#: rc_option_editor.cc:2731
+#: rc_option_editor.cc:2858
 msgid "Always Display Plugin Scan Progress"
 msgstr "Vždy ukázat postup hledání přídavného modulu"
 
-#: rc_option_editor.cc:2737
+#: rc_option_editor.cc:2864
 msgid ""
 "<b>When enabled</b> a popup window showing plugin scan progress is displayed "
 "for indexing (cache load) and discovery (detect new plugins)"
@@ -10909,15 +11836,44 @@ msgstr ""
 "hledání přídavného modulu pro rejstříkování (nahrání vyrovnávací paměti) a "
 "zjišťování (zjištění nových přídavných modulů)"
 
-#: rc_option_editor.cc:2742
+#: rc_option_editor.cc:2869
+msgid "Silence plugins when the transport is stopped"
+msgstr "Ztišit přídavné moduly, když je pohyb zastaven "
+
+#: rc_option_editor.cc:2875
+msgid ""
+"<b>When enabled</b> plugins will be reset at transport stop. When disabled "
+"plugins will be left unchanged at transport stop.\n"
+"\n"
+"This mostly affects plugins with a \"tail\" like Reverbs."
+msgstr ""
+
+#: rc_option_editor.cc:2879
+msgid "Make new plugins active"
+msgstr "Uvést nové přídavné moduly do činnosti"
+
+#: rc_option_editor.cc:2885
+msgid ""
+"<b>When enabled</b> plugins will be activated when they are added to tracks/"
+"busses. When disabled plugins will be left inactive when they are added to "
+"tracks/busses"
+msgstr ""
+
+#: rc_option_editor.cc:2888 rc_option_editor.cc:2896 rc_option_editor.cc:2908
+#: rc_option_editor.cc:2913 rc_option_editor.cc:2915 rc_option_editor.cc:2920
+#: rc_option_editor.cc:2927 rc_option_editor.cc:2932 rc_option_editor.cc:2941
+msgid "Plugins/VST"
+msgstr ""
+
+#: rc_option_editor.cc:2888
 msgid "VST"
 msgstr "VST"
 
-#: rc_option_editor.cc:2746
+#: rc_option_editor.cc:2892
 msgid "Scan for [new] VST Plugins on Application Start"
 msgstr "Při spuštění programu hledat [nové] přídavné moduly VST"
 
-#: rc_option_editor.cc:2752
+#: rc_option_editor.cc:2898
 msgid ""
 "<b>When enabled</b> new VST plugins are searched, tested and added to the "
 "cache index on application start. When disabled new plugins will only be "
@@ -10927,11 +11883,11 @@ msgstr ""
 "moduly, jsou vyzkoušeny a přidány do rejstříku vyrovnávací paměti. Když je "
 "zakázáno, nové přídavné moduly jsou dostupné jen po ručně provedeném hledání."
 
-#: rc_option_editor.cc:2758
+#: rc_option_editor.cc:2904
 msgid "Verbose Plugin Scan"
 msgstr "Podrobné hledání přídavných modulů"
 
-#: rc_option_editor.cc:2764
+#: rc_option_editor.cc:2910
 msgid ""
 "<b>When enabled</b> additional information for every plugin is added to the "
 "Log Window."
@@ -10939,35 +11895,39 @@ msgstr ""
 "<b>Když je povoleno</b>, jsou do okna se zápisem pro každý přídavný modul "
 "přidány dodatečné informace."
 
-#: rc_option_editor.cc:2772
+#: rc_option_editor.cc:2918
 msgid "VST Cache:"
 msgstr "Vyrovnávací paměť VST:"
 
-#: rc_option_editor.cc:2777
+#: rc_option_editor.cc:2923
 msgid "VST Blacklist:"
 msgstr "Černá listina VST:"
 
-#: rc_option_editor.cc:2784
+#: rc_option_editor.cc:2930
 msgid "Linux VST Path:"
 msgstr "Cesta k VST v Linuxu:"
 
-#: rc_option_editor.cc:2789 rc_option_editor.cc:2802
+#: rc_option_editor.cc:2935 rc_option_editor.cc:2948
 msgid "Path:"
 msgstr "Cesta:"
 
-#: rc_option_editor.cc:2798
+#: rc_option_editor.cc:2944
 msgid "Windows VST Path:"
 msgstr "Cesta k VST ve Windows:"
 
-#: rc_option_editor.cc:2808
+#: rc_option_editor.cc:2954 rc_option_editor.cc:2966 rc_option_editor.cc:2971
+msgid "Plugins/Audio Unit"
+msgstr ""
+
+#: rc_option_editor.cc:2954
 msgid "Audio Unit"
 msgstr "Audio Unit"
 
-#: rc_option_editor.cc:2812
+#: rc_option_editor.cc:2958
 msgid "Scan for AudioUnit Plugins on Application Start"
 msgstr "Při spuštění programu hledat přídavné moduly Audio Unit"
 
-#: rc_option_editor.cc:2818
+#: rc_option_editor.cc:2964
 msgid ""
 "<b>When enabled</b> Audio Unit Plugins are discovered on application start. "
 "When disabled AU plugins will only be available after triggering a 'Scan' "
@@ -10980,79 +11940,112 @@ msgstr ""
 "automatické hledání Audio Unit. Jakýkoli pád během zjišťování přídavného "
 "modulu je hledání zakáže."
 
-#: rc_option_editor.cc:2823
+#: rc_option_editor.cc:2969
 msgid "AU Cache:"
 msgstr "Vyrovnávací paměť AU:"
 
-#: rc_option_editor.cc:2828
+#: rc_option_editor.cc:2974
 msgid "AU Blacklist:"
 msgstr "Černá listina AU:"
 
-#: rc_option_editor.cc:2832
+#: rc_option_editor.cc:2978
 msgid "Plugin GUI"
 msgstr "Rozhraní pro přídavný modul"
 
-#: rc_option_editor.cc:2836
+#: rc_option_editor.cc:2982
 msgid "Automatically open the plugin GUI when adding a new plugin"
 msgstr ""
 "Automaticky otevřít rozhraní přídavného modulu při přidání nového přídavného "
 "modulu"
 
-#: rc_option_editor.cc:2847
+#: rc_option_editor.cc:2991
+msgid "Show Plugin Inline Display on Mixerstrip by default"
+msgstr ""
+
+#: rc_option_editor.cc:2998
+msgid ""
+"Don't automatically open the plugin GUI when the plugin has an inline "
+"display mode"
+msgstr ""
+
+#: rc_option_editor.cc:3005
+msgid "Instrument"
+msgstr ""
+
+#: rc_option_editor.cc:3009
+msgid "Ask to replace existing instrument plugin"
+msgstr ""
+
+#: rc_option_editor.cc:3017
+msgid "Interactively configure instrument plugins on insert"
+msgstr ""
+
+#: rc_option_editor.cc:3023
+msgid ""
+"<b>When enabled</b> show a dialog to select instrument channel configuration "
+"before adding a multichannel plugin."
+msgstr ""
+
+#: rc_option_editor.cc:3032
 msgid "Disable Graphics Hardware Acceleration (requires restart)"
 msgstr "Zakázat hardwarové zrychlení (vyžaduje opětovné spuštění)"
 
-#: rc_option_editor.cc:2853
+#: rc_option_editor.cc:3038
 msgid ""
 "Render large parts of the application user-interface in software, instead of "
 "using 2D-graphics acceleration.\n"
 "This requires restarting %1 before having an effect"
 msgstr ""
 
-#: rc_option_editor.cc:2854 rc_option_editor.cc:2866 rc_option_editor.cc:2869
-#: rc_option_editor.cc:2878 rc_option_editor.cc:2887 rc_option_editor.cc:2906
-#: rc_option_editor.cc:2922 rc_option_editor.cc:2938 rc_option_editor.cc:2952
-#: rc_option_editor.cc:2961
+#: rc_option_editor.cc:3039 rc_option_editor.cc:3051 rc_option_editor.cc:3054
+#: rc_option_editor.cc:3062 rc_option_editor.cc:3070 rc_option_editor.cc:3078
+#: rc_option_editor.cc:3086 rc_option_editor.cc:3097 rc_option_editor.cc:3113
+#: rc_option_editor.cc:3129 rc_option_editor.cc:3144 rc_option_editor.cc:3153
+#: rc_option_editor.cc:3161
 msgid "Preferences|GUI"
 msgstr "Rozhraní"
 
-#: rc_option_editor.cc:2860
+#: rc_option_editor.cc:3045
 msgid "Possibly improve slow graphical performance (requires restart)"
 msgstr ""
-"Pokusit se v případě pomalého obrazového výkonu o zlepšení (vyžaduje opětovné "
-"spuštění)"
+"Pokusit se v případě pomalého obrazového výkonu o zlepšení (vyžaduje "
+"opětovné spuštění)"
 
-#: rc_option_editor.cc:2865
+#: rc_option_editor.cc:3050
 msgid ""
 "Disables hardware gradient rendering on buggy video drivers (\"buggy "
 "gradients patch\").\n"
 "This requires restarting %1 before having an effect"
 msgstr ""
 
-#: rc_option_editor.cc:2872
+#: rc_option_editor.cc:3057
+msgid "Use Window Manager/Desktop visibility information"
+msgstr ""
+
+#: rc_option_editor.cc:3065
 msgid "Graphically indicate mouse pointer hovering over various widgets"
 msgstr "Obrazově naznačovat přejetí ukazovátka myši nad různými prvky"
 
-#: rc_option_editor.cc:2881
+#: rc_option_editor.cc:3073
 msgid "Show tooltips if mouse hovers over a control"
 msgstr "Ukázat nástrojové rady, když myš přejede nad prvkem"
 
-#: rc_option_editor.cc:2890
+#: rc_option_editor.cc:3081
 msgid "Use name highlight bars in region displays (requires a restart)"
 msgstr ""
 "Používat v zobrazení oblastí barevné proužky na zvýraznění názvu (vyžaduje "
 "opětovné spuštění)"
 
-#: rc_option_editor.cc:2898
+#: rc_option_editor.cc:3089
 msgid "Update transport clock display at FPS instead of every 100ms"
 msgstr ""
 "Obnovit zobrazení hodin pohybu v snímcích za sekundu (FPS) každých 100 ms"
 
-#: rc_option_editor.cc:2913
+#: rc_option_editor.cc:3104
 msgid "Waveform image cache size (megabytes)"
 msgstr "Velikost vyrovnávací paměti obrázku tvaru vlny (MB)"
 
-#: rc_option_editor.cc:2921
+#: rc_option_editor.cc:3112
 msgid ""
 "Increasing the cache size uses more memory to store waveform images, which "
 "can improve graphical performance."
@@ -11060,96 +12053,102 @@ msgstr ""
 "Větší vyrovnávací paměť používá na ukládání obrázků tvaru vlny více paměti, "
 "což může vést ke zlepšení obrazového výkonu."
 
-#: rc_option_editor.cc:2929
+#: rc_option_editor.cc:3120
 msgid "Lock timeout (seconds)"
 msgstr "Překročení času uzamknutí (sekundy)"
 
-#: rc_option_editor.cc:2937
+#: rc_option_editor.cc:3128
 msgid "Lock GUI after this many idle seconds (zero to never lock)"
 msgstr ""
 "Uzamknout rozhraní po tolika sekundách nečinnosti (nula, aby nikdy nedošlo k "
 "zamknutí)"
 
-#: rc_option_editor.cc:2954
+#: rc_option_editor.cc:3146
 msgid "Mixer Strip"
 msgstr "Proužek směšovače"
 
-#: rc_option_editor.cc:2964
+#: rc_option_editor.cc:3156
 msgid "Use narrow strips in the mixer by default"
 msgstr "Použít úzké proužky ve směšovači jako výchozí"
 
-#: rc_option_editor.cc:2969 rc_option_editor.cc:2983 rc_option_editor.cc:3000
-#: rc_option_editor.cc:3016 rc_option_editor.cc:3032 rc_option_editor.cc:3046
-#: rc_option_editor.cc:3072 rc_option_editor.cc:3090 rc_option_editor.cc:3101
-#: rc_option_editor.cc:3108 rc_option_editor.cc:3110
+#: rc_option_editor.cc:3163
+msgid "Action Script Button Visibility"
+msgstr ""
+
+#: rc_option_editor.cc:3169 rc_option_editor.cc:3183 rc_option_editor.cc:3200
+#: rc_option_editor.cc:3216 rc_option_editor.cc:3232 rc_option_editor.cc:3246
+#: rc_option_editor.cc:3272 rc_option_editor.cc:3290 rc_option_editor.cc:3301
+#: rc_option_editor.cc:3308 rc_option_editor.cc:3310 rc_option_editor.cc:3318
+#: rc_option_editor.cc:3320 rc_option_editor.cc:3328 rc_option_editor.cc:3336
+#: rc_option_editor.cc:3338
 msgid "Preferences|Metering"
 msgstr "Nastavení|Ukazatel hladiny"
 
-#: rc_option_editor.cc:2973
+#: rc_option_editor.cc:3173
 msgid "Peak hold time"
 msgstr "Čas držení nejvyšší hodnoty"
 
-#: rc_option_editor.cc:2979
+#: rc_option_editor.cc:3179
 msgid "short"
 msgstr "Krátký"
 
-#: rc_option_editor.cc:2980
+#: rc_option_editor.cc:3180
 msgid "medium"
 msgstr "Střední"
 
-#: rc_option_editor.cc:2981
+#: rc_option_editor.cc:3181
 msgid "long"
 msgstr "Dlouhý"
 
-#: rc_option_editor.cc:2987
+#: rc_option_editor.cc:3187
 msgid "DPM fall-off"
 msgstr "Klesání DPM"
 
-#: rc_option_editor.cc:2993
+#: rc_option_editor.cc:3193
 msgid "slowest [6.6dB/sec]"
 msgstr "Velmi pomalé [6,6 dB/s]"
 
-#: rc_option_editor.cc:2994
+#: rc_option_editor.cc:3194
 msgid "slow [8.6dB/sec] (BBC PPM, EBU PPM)"
 msgstr "Pomalé [8,6 dB/s] (BBC PPM, EBU PPM)"
 
-#: rc_option_editor.cc:2995
+#: rc_option_editor.cc:3195
 msgid "moderate [12.0dB/sec] (DIN)"
 msgstr "Mírné [12.0dB/s] (DIN)"
 
-#: rc_option_editor.cc:2996
+#: rc_option_editor.cc:3196
 msgid "medium [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"
 msgstr "Střední [13,3 dB/s] (EBU Digi PPM, IRT Digi PPM)"
 
-#: rc_option_editor.cc:2997
+#: rc_option_editor.cc:3197
 msgid "fast [20dB/sec]"
 msgstr "Rychlé [20 dB/s]"
 
-#: rc_option_editor.cc:2998
+#: rc_option_editor.cc:3198
 msgid "very fast [32dB/sec]"
 msgstr "Velice rychlé [32 dB/s]"
 
-#: rc_option_editor.cc:3004
+#: rc_option_editor.cc:3204
 msgid "Meter line-up level; 0dBu"
 msgstr "Úroveň vyrovnání měřidla; 0dBu"
 
-#: rc_option_editor.cc:3009 rc_option_editor.cc:3025
+#: rc_option_editor.cc:3209 rc_option_editor.cc:3225
 msgid "-24dBFS (SMPTE US: 4dBu = -20dBFS)"
 msgstr "-24 dBFS (SMPTE US: 4dBu = -20dBFS)"
 
-#: rc_option_editor.cc:3010 rc_option_editor.cc:3026
+#: rc_option_editor.cc:3210 rc_option_editor.cc:3226
 msgid "-20dBFS (SMPTE RP.0155)"
 msgstr "-20 dBFS (SMPTE RP.0155)"
 
-#: rc_option_editor.cc:3011 rc_option_editor.cc:3027
+#: rc_option_editor.cc:3211 rc_option_editor.cc:3227
 msgid "-18dBFS (EBU, BBC)"
 msgstr "-18 dBFS (EBU, BBC)"
 
-#: rc_option_editor.cc:3012 rc_option_editor.cc:3028
+#: rc_option_editor.cc:3212 rc_option_editor.cc:3228
 msgid "-15dBFS (DIN)"
 msgstr "-15 dBFS (DIN)"
 
-#: rc_option_editor.cc:3014
+#: rc_option_editor.cc:3214
 msgid ""
 "Configure meter-marks and color-knee point for dBFS scale DPM, set reference "
 "level for IEC1/Nordic, IEC2 PPM and VU meter."
@@ -11157,72 +12156,95 @@ msgstr ""
 "Nastavit značky měřidla a bod barevného kolena pro dBFS scale DPM, nastavit "
 "srovnávací úroveň pro IEC1/Nordic, IEC2 PPM a VU měřidlo."
 
-#: rc_option_editor.cc:3020
+#: rc_option_editor.cc:3220
 msgid "IEC1/DIN Meter line-up level; 0dBu"
 msgstr "Úroveň vyrovnání měřidla IEC1/DIN; 0dBu"
 
-#: rc_option_editor.cc:3030
+#: rc_option_editor.cc:3230
 msgid "Reference level for IEC1/DIN meter."
 msgstr "Srovnávací úroveň pro IEC1/DIN měřidlo."
 
-#: rc_option_editor.cc:3036
+#: rc_option_editor.cc:3236
 msgid "VU Meter standard"
 msgstr "Standardní měřidlo VU"
 
-#: rc_option_editor.cc:3041
+#: rc_option_editor.cc:3241
 msgid "0VU = -2dBu (France)"
 msgstr "0VU = -2 dBu (Francie)"
 
-#: rc_option_editor.cc:3042
+#: rc_option_editor.cc:3242
 msgid "0VU = 0dBu (North America, Australia)"
 msgstr "0VU = 0 dBu (Severní Amerika, Austrálie)"
 
-#: rc_option_editor.cc:3043
+#: rc_option_editor.cc:3243
 msgid "0VU = +4dBu (standard)"
 msgstr "0VU = +4 dBu (standardní)"
 
-#: rc_option_editor.cc:3044
+#: rc_option_editor.cc:3244
 msgid "0VU = +8dBu"
 msgstr "0VU = +8 dBu"
 
-#: rc_option_editor.cc:3050
+#: rc_option_editor.cc:3250
 msgid "Peak threshold [dBFS]"
 msgstr "Práh pro nejvyšší hodnotu zvuku [dBFS]"
 
-#: rc_option_editor.cc:3059
+#: rc_option_editor.cc:3259
 msgid "Default Meter Type for Master Bus"
 msgstr "Výchozí typ měřicího ukazatele pro hlavní sběrnici"
 
-#: rc_option_editor.cc:3077
+#: rc_option_editor.cc:3277
 msgid "Default Meter Type for Busses"
 msgstr "Výchozí typ měřicího ukazatele pro sběrnice"
 
-#: rc_option_editor.cc:3094
+#: rc_option_editor.cc:3294
 msgid "Default Meter Type for Tracks"
 msgstr "Výchozí typ měřicího ukazatele pro stopy"
 
-#: rc_option_editor.cc:3106
+#: rc_option_editor.cc:3306
 msgid ""
 "Specify the audio signal level in dbFS at and above which the meter-peak "
 "indicator will flash red."
 msgstr ""
 "Stanovte úroveň zvukového signálu v dbFS, na níž a nad níž ukazatel nejvyšší "
-"hodnoty "
-"měřidla zčervená."
+"hodnoty měřidla zčervená."
 
-#: rc_option_editor.cc:3113
+#: rc_option_editor.cc:3313
 msgid "LED meter style"
 msgstr "Styl měřidla LED"
 
-#: rc_option_editor.cc:3121
+#: rc_option_editor.cc:3318
+msgid "Editor Meters"
+msgstr ""
+
+#: rc_option_editor.cc:3323
+msgid "Show meters on tracks in the editor"
+msgstr "Ukázat měřidla na stopách v editoru"
+
+#: rc_option_editor.cc:3331
+msgid "Show at most stereo meters in the track-header"
+msgstr ""
+
+#: rc_option_editor.cc:3336
+msgid "Post Export Analysis"
+msgstr ""
+
+#: rc_option_editor.cc:3341
+msgid "Save loudness analysis as image file"
+msgstr ""
+
+#: rc_option_editor.cc:3349
 msgid "Theme"
 msgstr "Vzhled"
 
-#: rc_option_editor.cc:3194
+#: rc_option_editor.cc:3351
+msgid "Theme/Colors"
+msgstr ""
+
+#: rc_option_editor.cc:3429
 msgid "Set Linux VST Search Path"
 msgstr "Nastavit cestu k hledání VST v Linuxu"
 
-#: rc_option_editor.cc:3208
+#: rc_option_editor.cc:3443
 msgid "Set Windows VST Search Path"
 msgstr "Nastavit cestu k hledání VST ve Windows"
 
@@ -11298,33 +12320,33 @@ msgstr "Stopa:"
 msgid "Choose Top Region"
 msgstr "Vybrat horní oblast"
 
-#: region_view.cc:270
+#: region_view.cc:271
 msgid "SilenceText"
 msgstr "Text pro ticho"
 
-#: region_view.cc:285 region_view.cc:304
+#: region_view.cc:286 region_view.cc:305
 msgid "minutes"
 msgstr "minut"
 
-#: region_view.cc:288 region_view.cc:307
+#: region_view.cc:289 region_view.cc:308
 msgid "msecs"
 msgstr "milisekund"
 
-#: region_view.cc:291 region_view.cc:310
+#: region_view.cc:292 region_view.cc:311
 msgid "secs"
 msgstr "sekund"
 
-#: region_view.cc:294
+#: region_view.cc:295
 msgid "%1 silent segment"
 msgid_plural "%1 silent segments"
 msgstr[0] "%1 část ticha"
 msgstr[1] "%1 části ticha"
 
-#: region_view.cc:296
+#: region_view.cc:297
 msgid "shortest = %1 %2"
 msgstr "nejkratší = %1 %2"
 
-#: region_view.cc:313
+#: region_view.cc:314
 msgid ""
 "\n"
 "  (shortest audible segment = %1 %2)"
@@ -11372,55 +12394,63 @@ msgstr "Kullback-Liebler"
 msgid "Modified Kullback-Liebler"
 msgstr "Upravený Kullback-Liebler"
 
-#: rhythm_ferret.cc:65
+#: rhythm_ferret.cc:62
+msgid "Spectral Flux"
+msgstr ""
+
+#: rhythm_ferret.cc:68
 msgid "Split region"
 msgstr "Rozdělit oblast"
 
-#: rhythm_ferret.cc:66
+#: rhythm_ferret.cc:70
 msgid "Snap regions"
 msgstr "Zapadnout oblasti"
 
-#: rhythm_ferret.cc:67
+#: rhythm_ferret.cc:71
 msgid "Conform regions"
 msgstr "Přizpůsobit oblasti"
 
-#: rhythm_ferret.cc:72
+#: rhythm_ferret.cc:77
 msgid "Rhythm Ferret"
 msgstr "Rytmická páska"
 
-#: rhythm_ferret.cc:78
+#: rhythm_ferret.cc:83
 msgid "Analyze"
 msgstr "Rozbor dat"
 
-#: rhythm_ferret.cc:113
+#: rhythm_ferret.cc:122
 msgid "Detection function"
 msgstr "Funkce rozpoznání"
 
-#: rhythm_ferret.cc:117
-msgid "Trigger gap"
-msgstr "Mezera spuštění (ms)"
-
-#: rhythm_ferret.cc:122 strip_silence_dialog.cc:65
-msgid "Threshold"
-msgstr "Práh"
+#: rhythm_ferret.cc:126
+msgid "Trigger gap (postproc)"
+msgstr ""
 
-#: rhythm_ferret.cc:127
+#: rhythm_ferret.cc:131
 msgid "Peak threshold"
 msgstr "Prahová hodnota zvuku (dB)"
 
-#: rhythm_ferret.cc:132
+#: rhythm_ferret.cc:135
 msgid "Silence threshold"
 msgstr "Prahová hodnota ticha (dB)"
 
-#: rhythm_ferret.cc:137
+#: rhythm_ferret.cc:141
+msgid "Min Inter-Onset Time"
+msgstr ""
+
+#: rhythm_ferret.cc:148
 msgid "Sensitivity"
 msgstr "Citlivost"
 
-#: rhythm_ferret.cc:141
+#: rhythm_ferret.cc:152
+msgid "Cut Pos Threshold"
+msgstr ""
+
+#: rhythm_ferret.cc:157
 msgid "Operation"
 msgstr "Operace"
 
-#: rhythm_ferret.cc:355
+#: rhythm_ferret.cc:382
 msgid "split regions (rhythm ferret)"
 msgstr "Rozdělit oblasti (rytmická páska)"
 
@@ -11444,19 +12474,15 @@ msgstr "Povolení nahrávání"
 msgid "Active state"
 msgstr "Zapnuto"
 
-#: route_group_dialog.cc:53 route_group_dialog.cc:82 theme_manager.cc:87
-msgid "Color"
-msgstr "Barva"
-
-#: route_group_dialog.cc:59
+#: route_group_dialog.cc:58
 msgid "RouteGroupDialog"
 msgstr "DialogProSkupinuCest"
 
-#: route_group_dialog.cc:100
+#: route_group_dialog.cc:99
 msgid "<b>Sharing</b>"
 msgstr "<b>Sdílení</b>"
 
-#: route_group_dialog.cc:200
+#: route_group_dialog.cc:192
 msgid "The group name is not unique. Please use a different name."
 msgstr "Název skupiny není jedinečný. Použijte, prosím, jiný název."
 
@@ -11476,84 +12502,88 @@ msgstr "Výstupy"
 msgid "Plugins, Inserts & Sends"
 msgstr "Přídavné moduly, vložky & odeslání"
 
-#: route_params_ui.cc:209
+#: route_params_ui.cc:201
 msgid "route display list item for renamed route not found!"
 msgstr "Položka v seznamu s cestami pro přejmenovanou cestu nebyla nalezena!"
 
-#: route_params_ui.cc:279 route_params_ui.cc:307
+#: route_params_ui.cc:271 route_params_ui.cc:299
 #, c-format
 msgid "Playback delay: %<PRId64> samples"
 msgstr "Zpoždění přehrávání: %<PRId64> vzorků"
 
-#: route_params_ui.cc:499
+#: route_params_ui.cc:491
 msgid "NO TRACK"
 msgstr "ŽÁDNÁ STOPA"
 
-#: route_params_ui.cc:637 route_params_ui.cc:638
+#: route_params_ui.cc:515
+msgid "Add Track or Bus"
+msgstr "Přidat stopu nebo sběrnici"
+
+#: route_params_ui.cc:627 route_params_ui.cc:628
 msgid "No Track or Bus Selected"
 msgstr "Nebyla vybrána žádná stopa nebo sběrnice"
 
-#: route_time_axis.cc:105
+#: route_time_axis.cc:104
 msgid "RTAV|G"
 msgstr "G"
 
-#: route_time_axis.cc:106
+#: route_time_axis.cc:105
 msgid "RTAV|P"
 msgstr "P"
 
-#: route_time_axis.cc:107
+#: route_time_axis.cc:106
 msgid "RTAV|A"
 msgstr "A"
 
-#: route_time_axis.cc:184
+#: route_time_axis.cc:194
 msgid "Record (Right-click for Step Edit)"
 msgstr "Nahrávat (klepnutí pravým tlačítkem myši pro Úpravu kroku)"
 
-#: route_time_axis.cc:187
+#: route_time_axis.cc:197
 msgid "Record"
 msgstr "Nahrávat"
 
-#: route_time_axis.cc:257
+#: route_time_axis.cc:265
 msgid "Route Group"
 msgstr "Skupina zpracování"
 
-#: route_time_axis.cc:267
+#: route_time_axis.cc:275
 msgid "MIDI Controllers and Automation"
 msgstr "Ovládací prvky MIDI a automatizace"
 
-#: route_time_axis.cc:498
+#: route_time_axis.cc:510
 msgid "Show All Automation"
 msgstr "Ukázat všechny automatizace"
 
-#: route_time_axis.cc:501
+#: route_time_axis.cc:513
 msgid "Show Existing Automation"
 msgstr "Ukázat stávající automatizace"
 
-#: route_time_axis.cc:504
+#: route_time_axis.cc:516
 msgid "Hide All Automation"
 msgstr "Skrýt všechny automatizace"
 
-#: route_time_axis.cc:513
+#: route_time_axis.cc:525
 msgid "Processor automation"
 msgstr "Automatizace procesoru"
 
-#: route_time_axis.cc:520
+#: route_time_axis.cc:532
 msgid "Fader"
 msgstr "Prolínač"
 
-#: route_time_axis.cc:547
+#: route_time_axis.cc:559
 msgid "Pan"
 msgstr "Vyvážení"
 
-#: route_time_axis.cc:638
+#: route_time_axis.cc:643
 msgid "Overlaid"
 msgstr "Překryto"
 
-#: route_time_axis.cc:644
+#: route_time_axis.cc:649
 msgid "Stacked"
 msgstr "Naskládáno"
 
-#: route_time_axis.cc:652
+#: route_time_axis.cc:657
 msgid "Layers"
 msgstr "Vrstvy"
 
@@ -11570,11 +12600,11 @@ msgid "(Currently: Capture Time)"
 msgstr "(Nyní: čas zachycení)"
 
 #: route_time_axis.cc:741
-msgid "Align with Existing Material"
+msgid "Align With Existing Material"
 msgstr "Zarovnat se stávajícím materiálem"
 
 #: route_time_axis.cc:746
-msgid "Align with Capture Time"
+msgid "Align With Capture Time"
 msgstr "Zarovnat s časem nahrávky"
 
 #: route_time_axis.cc:751
@@ -11597,189 +12627,193 @@ msgstr "Nevrstvený režim"
 msgid "Record Mode"
 msgstr "Režim nahrávání"
 
-#: route_time_axis.cc:811 route_time_axis.cc:1806
+#: route_time_axis.cc:809 route_time_axis.cc:1795
 msgid "Playlist"
 msgstr "Seznam skladeb"
 
-#: route_time_axis.cc:1109
+#: route_time_axis.cc:1107
 msgid "Rename Playlist"
 msgstr "Přejmenovat seznam skladeb"
 
-#: route_time_axis.cc:1110
+#: route_time_axis.cc:1108
 msgid "New name for playlist:"
 msgstr "Nový název pro seznam skladeb:"
 
-#: route_time_axis.cc:1195
+#: route_time_axis.cc:1193
 msgid "New Copy Playlist"
 msgstr "Seznam skladeb nové kopie"
 
-#: route_time_axis.cc:1196 route_time_axis.cc:1249
+#: route_time_axis.cc:1194 route_time_axis.cc:1247
 msgid "Name for new playlist:"
 msgstr "Název pro nový seznam skladeb:"
 
-#: route_time_axis.cc:1248
+#: route_time_axis.cc:1246
 msgid "New Playlist"
 msgstr "Nový seznam skladeb"
 
-#: route_time_axis.cc:1452
-msgid "You cannot create a track with that name as it is reserved for %1"
-msgstr "Nemůžete vytvořit stopu s tímto názvem, protože je zamluvený pro %1"
+#: route_time_axis.cc:1441
+msgid "The name \"%1\" is reserved for %2"
+msgstr ""
 
-#: route_time_axis.cc:1695
+#: route_time_axis.cc:1684
 msgid "New Copy..."
 msgstr "Nová kopie..."
 
-#: route_time_axis.cc:1699
+#: route_time_axis.cc:1688
 msgid "New Take"
 msgstr "Nový záběr"
 
-#: route_time_axis.cc:1700
+#: route_time_axis.cc:1689
 msgid "Copy Take"
 msgstr "Kopírovat záběr"
 
-#: route_time_axis.cc:1705
+#: route_time_axis.cc:1694
 msgid "Clear Current"
 msgstr "Smazat vybrané"
 
-#: route_time_axis.cc:1708
+#: route_time_axis.cc:1697
 msgid "Select from All..."
 msgstr "Vybrat ze všeho..."
 
-#: route_time_axis.cc:1796
+#: route_time_axis.cc:1785
 msgid "Take: %1.%2"
 msgstr "Vzít: %1.%2"
 
-#: route_time_axis.cc:2202 selection.cc:1009 selection.cc:1063
+#: route_time_axis.cc:2190 selection.cc:1042 selection.cc:1096
 msgid "programming error: "
 msgstr "Chyba v programování:"
 
-#: route_time_axis.cc:2622
+#: route_time_axis.cc:2614
 msgid "Underlays"
 msgstr "Podložky"
 
-#: route_time_axis.cc:2625
+#: route_time_axis.cc:2617
 msgid "Remove \"%1\""
 msgstr "Odstranit \"%1\""
 
-#: route_time_axis.cc:2675 route_time_axis.cc:2712
+#: route_time_axis.cc:2667 route_time_axis.cc:2704
 msgid "programming error: underlay reference pointer pairs are inconsistent!"
 msgstr ""
 "Chyba v programování: dvojice vodítek odkazující na podložku jsou "
 "neslučitelné!"
 
-#: route_time_axis.cc:2739
+#: route_time_axis.cc:2731 vca_master_strip.cc:203 vca_time_axis.cc:228
 msgid "After-fade listen (AFL)"
 msgstr "Poslech po-prolínači (AFL)"
 
-#: route_time_axis.cc:2743
+#: route_time_axis.cc:2735 vca_master_strip.cc:207 vca_time_axis.cc:232
 msgid "Pre-fade listen (PFL)"
 msgstr "Poslech před-prolínačem (PFL)"
 
-#: route_ui.cc:153
+#: route_ui.cc:165
 msgid "Mute this track"
 msgstr "Ztlumit tuto stopu"
 
-#: route_ui.cc:157
+#: route_ui.cc:169
 msgid "Mute other (non-soloed) tracks"
 msgstr "Ztlumit ostatní stopy (nesólové)"
 
-#: route_ui.cc:163
+#: route_ui.cc:175
 msgid "Enable recording on this track"
 msgstr "Spustit nahrávání do této stopy"
 
-#: route_ui.cc:171
+#: route_ui.cc:183
 msgid "make mixer strips show sends to this bus"
 msgstr "Proužky směšovače ukazují odeslání do této sběrnice"
 
-#: route_ui.cc:176
+#: route_ui.cc:188
 msgid "Monitor input"
 msgstr "Sledovat vstup"
 
-#: route_ui.cc:182
+#: route_ui.cc:194
 msgid "Monitor playback"
 msgstr "Sledovat přehrávání"
 
-#: route_ui.cc:691
+#: route_ui.cc:706
 msgid "Not connected to AudioEngine - cannot engage record"
 msgstr "Nespojeno se zvukovým strojem - nelze začít s nahráváním"
 
-#: route_ui.cc:890
+#: route_ui.cc:883
+msgid "Rec-Safe"
+msgstr ""
+
+#: route_ui.cc:888
 msgid "Step Entry"
 msgstr "Zápis kroku"
 
-#: route_ui.cc:963
+#: route_ui.cc:987
 msgid "Assign all tracks (prefader)"
 msgstr "Přiřadit všechny stopy (před-prolínač)"
 
-#: route_ui.cc:967
+#: route_ui.cc:991
 msgid "Assign all tracks and buses (prefader)"
 msgstr "Přiřadit všechny stopy a sběrnice (před-prolínač)"
 
-#: route_ui.cc:971
+#: route_ui.cc:995
 msgid "Assign all tracks (postfader)"
 msgstr "Přiřadit všechny stopy (po-prolínač)"
 
-#: route_ui.cc:975
+#: route_ui.cc:999
 msgid "Assign all tracks and buses (postfader)"
 msgstr "Přiřadit všechny stopy a sběrnice (po-prolínač)"
 
-#: route_ui.cc:979
+#: route_ui.cc:1003
 msgid "Assign selected tracks (prefader)"
 msgstr "Přiřadit vybrané stopy (před-prolínač)"
 
-#: route_ui.cc:983
+#: route_ui.cc:1007
 msgid "Assign selected tracks and buses (prefader)"
 msgstr "Přiřadit vybrané stopy a sběrnice (před-prolínač)"
 
-#: route_ui.cc:986
+#: route_ui.cc:1010
 msgid "Assign selected tracks (postfader)"
 msgstr "Přiřadit vybrané stopy (po-prolínač)"
 
-#: route_ui.cc:990
+#: route_ui.cc:1014
 msgid "Assign selected tracks and buses (postfader)"
 msgstr "Přiřadit vybrané stopy a sběrnice (po-prolínač)"
 
-#: route_ui.cc:993
+#: route_ui.cc:1017
 msgid "Copy track/bus gains to sends"
 msgstr "Kopírovat zesílení stop/sběrnic do odeslání"
 
-#: route_ui.cc:994
+#: route_ui.cc:1018
 msgid "Set sends gain to -inf"
 msgstr "Nastavit zesílení odeslání na -inf."
 
-#: route_ui.cc:995
+#: route_ui.cc:1019
 msgid "Set sends gain to 0dB"
 msgstr "Nastavit zesílení odeslání na 0dB"
 
-#: route_ui.cc:1314
+#: route_ui.cc:1357
 msgid "Solo Isolate"
 msgstr "Samostatné sólo"
 
-#: route_ui.cc:1321
+#: route_ui.cc:1364
 msgid "Solo Safe"
 msgstr "Zajištěné sólo"
 
-#: route_ui.cc:1343
+#: route_ui.cc:1386
 msgid "Pre Fader Sends"
 msgstr "Odeslání před-prolínače"
 
-#: route_ui.cc:1349
+#: route_ui.cc:1392
 msgid "Post Fader Sends"
 msgstr "Odeslání po-prolínače"
 
-#: route_ui.cc:1355
+#: route_ui.cc:1398
 msgid "Control Outs"
 msgstr "Ovládací výstupy"
 
-#: route_ui.cc:1361
+#: route_ui.cc:1404
 msgid "Main Outs"
 msgstr "Hlavní výstupy"
 
-#: route_ui.cc:1527
+#: route_ui.cc:1571
 msgid "Color Selection"
 msgstr "Výběr barvy"
 
-#: route_ui.cc:1592
+#: route_ui.cc:1613
 msgid ""
 "The use of colons (':') is discouraged in track and bus names.\n"
 "Do you want to use this new name?"
@@ -11787,100 +12821,51 @@ msgstr ""
 "Od použití dvojtečky (':') se odrazuje v názvech stop a sběrnic.\n"
 "Chcete použít tento nový název?"
 
-#: route_ui.cc:1596
+#: route_ui.cc:1617
 msgid "Use the new name"
 msgstr "Použít nový název"
 
-#: route_ui.cc:1597
+#: route_ui.cc:1618
 msgid "Re-edit the name"
 msgstr "Upravit název znovu"
 
-#: route_ui.cc:1610
+#: route_ui.cc:1631
 msgid "Rename Track"
 msgstr "Přejmenovat stopu"
 
-#: route_ui.cc:1612
+#: route_ui.cc:1633
 msgid "Rename Bus"
 msgstr "Přejmenovat sběrnici"
 
-#: route_ui.cc:1680
+#: route_ui.cc:1693
 msgid ": comment editor"
 msgstr ": editor poznámek"
 
-#: route_ui.cc:1852
+#: route_ui.cc:1848
 msgid " latency"
 msgstr " Prodleva"
 
-#: route_ui.cc:1892
+#: route_ui.cc:1888
 msgid "Cannot create route template directory %1"
 msgstr "Nelze vytvořit adresář %1 pro předlohu cesty"
 
-#: route_ui.cc:1898
+#: route_ui.cc:1894
 msgid "Save As Template"
 msgstr "Uložit jako předlohu"
 
-#: route_ui.cc:1899
+#: route_ui.cc:1895
 msgid "Template name:"
 msgstr "Název předlohy:"
 
-#: route_ui.cc:1976
-msgid "Remote Control ID"
-msgstr "ID dálkového ovládání"
-
-#: route_ui.cc:1986
-msgid "Remote control ID:"
-msgstr "ID dálkového ovládání:"
-
-#: route_ui.cc:2000
-msgid ""
-"The remote control ID of %1 is: %2\n"
-"\n"
-"\n"
-"The remote control ID of %3 cannot be changed."
-msgstr ""
-"ID dálkového ovládání %1 je: %2\n"
-"\n"
-"\n"
-"ID dálkového ovládání %3 nelze změnit."
-
-#: route_ui.cc:2004
-msgid "the master bus"
-msgstr "Hlavní sběrnice"
-
-#: route_ui.cc:2004
-msgid "the monitor bus"
-msgstr "Sledovací sběrnice"
-
-#: route_ui.cc:2006
+#: route_ui.cc:2019
 msgid ""
-"The remote control ID of %5 is: %2\n"
-"\n"
-"\n"
-"Remote Control IDs are currently determined by track/bus ordering in %6.\n"
-"\n"
-"%3Use the User Interaction tab of the Preferences window if you want to "
-"change this%4"
+"Left-click to invert polarity of channel %1 of this track. Right-click to "
+"show menu."
 msgstr ""
-"ID dálkového ovládání %5 je: %2\n"
-"\n"
-"\n"
-"ID dálkového ovládání jsou v současnosti určeny pořadím stopy/sběrnice v %6\n"
-"\n"
-"\n"
-"%3Použijte kartu Uživatelská interakce v okně pro nastavení, pokud to chcete "
-"změnit%4"
 
-#: route_ui.cc:2063
-msgid ""
-"Left-click to invert (phase reverse) channel %1 of this track.  Right-click "
-"to show menu."
+#: route_ui.cc:2021
+msgid "Click to show a menu of channels to invert polarity"
 msgstr ""
-"Klepnutí levým tlačítkem myši pro obrácení (otočení fáze) kanálu %1 této "
-"stopy. Klepnutí pravým tlačítkem myši pro ukázání nabídky."
-
-#: route_ui.cc:2065
-msgid "Click to show a menu of channels for inversion (phase reverse)"
-msgstr "Klepněte pro ukázání kanálů pro obrácení (otočení fáze)"
 
 #: save_as_dialog.cc:34
 msgid "Switch to newly-saved version"
@@ -11918,6 +12903,30 @@ msgstr "Klepněte pro přidání nového umístění"
 msgid "the session folder"
 msgstr "Složka se sezením"
 
+#: script_selector.cc:43
+msgid "<b>Type:</b>"
+msgstr ""
+
+#: script_selector.cc:49
+msgid "<b>Author:</b>"
+msgstr ""
+
+#: script_selector.cc:55
+msgid "<b>Description:</b>"
+msgstr ""
+
+#: script_selector.cc:131
+msgid "Select Script to unload"
+msgstr ""
+
+#: script_selector.cc:165
+msgid "<b>Name:</b>"
+msgstr ""
+
+#: script_selector.cc:172
+msgid "<b>Instance Parameters</b>"
+msgstr ""
+
 #: send_ui.cc:134
 msgid "Send "
 msgstr "Poslat "
@@ -11930,7 +12939,7 @@ msgstr "Zřízení sezení"
 msgid "Advanced options ..."
 msgstr "Pokročilé volby..."
 
-#: session_dialog.cc:163 session_dialog.cc:394
+#: session_dialog.cc:163 session_dialog.cc:397
 msgid "Recent Sessions"
 msgstr "Naposledy otevřená sezení"
 
@@ -11950,99 +12959,99 @@ msgstr "Naposledy změněno"
 msgid "New Session"
 msgstr "Nové sezení"
 
-#: session_dialog.cc:376
+#: session_dialog.cc:379
 msgid "Check the website for more..."
 msgstr "Najít více na internetových stránkách..."
 
-#: session_dialog.cc:379
+#: session_dialog.cc:382
 msgid "Click to open the program website in your web browser"
 msgstr "Klepnout pro otevření stránek programu v prohlížeči"
 
-#: session_dialog.cc:401
+#: session_dialog.cc:404
 msgid "Select session file"
 msgstr "Vybrat soubor se sezením"
 
-#: session_dialog.cc:414
+#: session_dialog.cc:417
 msgid "Other Sessions"
 msgstr "Jiná sezení"
 
-#: session_dialog.cc:421
+#: session_dialog.cc:424
 msgid "Safe Mode: Disable all Plugins"
 msgstr "Bezpečný režim: Zakázat všechny přídavné moduly"
 
-#: session_dialog.cc:451
+#: session_dialog.cc:454
 msgid "Open"
 msgstr "Otevřít"
 
-#: session_dialog.cc:518
+#: session_dialog.cc:521
 msgid "Session name:"
 msgstr "Název sezení:"
 
-#: session_dialog.cc:540
+#: session_dialog.cc:543
 msgid "Create session folder in:"
 msgstr "Složku se sezením vytvořit v:"
 
-#: session_dialog.cc:561
+#: session_dialog.cc:564
 msgid "Select folder for session"
 msgstr "Vybrat složku pro sezení"
 
-#: session_dialog.cc:588
+#: session_dialog.cc:591
 msgid "Use this template"
 msgstr "Použít tuto předlohu"
 
-#: session_dialog.cc:591
+#: session_dialog.cc:594
 msgid "no template"
 msgstr "Žádná předloha"
 
-#: session_dialog.cc:743 session_dialog.cc:790
+#: session_dialog.cc:746 session_dialog.cc:793
 msgid "32-bit float"
 msgstr "32 bitů float"
 
-#: session_dialog.cc:746 session_dialog.cc:793
+#: session_dialog.cc:749 session_dialog.cc:796
 msgid "24-bit"
 msgstr "24 bitů"
 
-#: session_dialog.cc:749 session_dialog.cc:796
+#: session_dialog.cc:752 session_dialog.cc:799
 msgid "16-bit"
 msgstr "16 bitů"
 
-#: session_dialog.cc:874 session_dialog.cc:875 session_dialog.cc:876
+#: session_dialog.cc:877 session_dialog.cc:878 session_dialog.cc:879
 msgid "channels"
 msgstr "kanály"
 
-#: session_dialog.cc:890
+#: session_dialog.cc:893
 msgid "<b>Busses</b>"
 msgstr "<b>Sběrnice</b>"
 
-#: session_dialog.cc:891
+#: session_dialog.cc:894
 msgid "<b>Inputs</b>"
 msgstr "<b>Vstupy</b>"
 
-#: session_dialog.cc:892
+#: session_dialog.cc:895
 msgid "<b>Outputs</b>"
 msgstr "<b>Výstupy</b>"
 
-#: session_dialog.cc:900
+#: session_dialog.cc:903
 msgid "Create master bus"
 msgstr "Vytvořit hlavní sběrnici"
 
-#: session_dialog.cc:910
+#: session_dialog.cc:913
 msgid "Automatically connect to physical inputs"
 msgstr "Automaticky spojit s fyzickými vstupy"
 
-#: session_dialog.cc:917 session_dialog.cc:976
+#: session_dialog.cc:920 session_dialog.cc:979
 msgid "Use only"
 msgstr "Použít pouze"
 
-#: session_dialog.cc:970
+#: session_dialog.cc:973
 msgid "Automatically connect outputs"
 msgstr "Automaticky spojit výstupy"
 
-#: session_dialog.cc:992
+#: session_dialog.cc:995
 msgid "... to master bus"
 msgstr "s hlavní sběrnicí"
 
-#: session_dialog.cc:1002
+#: session_dialog.cc:1005
 msgid "... to physical outputs"
 msgstr "s fyzickými výstupy"
 
@@ -12068,191 +13077,191 @@ msgstr "Zavést ze sezení"
 msgid "This will select all elements of this type!"
 msgstr "Tímto dojde k výběru všech prvků tohoto typu!"
 
-#: session_metadata_dialog.cc:285
+#: session_metadata_dialog.cc:288
 msgid "EAN Check digit OK"
 msgstr "Kontrolní číslice EAN OK"
 
-#: session_metadata_dialog.cc:289
+#: session_metadata_dialog.cc:292
 msgid "EAN Check digit error"
 msgstr "Chyba kontrolní číslice EAN"
 
-#: session_metadata_dialog.cc:289
+#: session_metadata_dialog.cc:292
 msgid "expected"
 msgstr "očekáváno"
 
-#: session_metadata_dialog.cc:294
+#: session_metadata_dialog.cc:297
 msgid "EAN Length error"
 msgstr "Chyba v délce EAN"
 
-#: session_metadata_dialog.cc:423
+#: session_metadata_dialog.cc:426
 msgid "Field"
 msgstr "Pole"
 
-#: session_metadata_dialog.cc:427
+#: session_metadata_dialog.cc:430
 msgid "Values (current value on top)"
 msgstr "Hodnoty (nynější hodnota nahoře)"
 
-#: session_metadata_dialog.cc:641
+#: session_metadata_dialog.cc:644
 msgid "User"
 msgstr "Uživatel"
 
-#: session_metadata_dialog.cc:649
+#: session_metadata_dialog.cc:652
 msgid "Email"
 msgstr "E-mail"
 
-#: session_metadata_dialog.cc:652
+#: session_metadata_dialog.cc:655
 msgid "Web"
 msgstr "Stránky"
 
-#: session_metadata_dialog.cc:655
+#: session_metadata_dialog.cc:658
 msgid "Organization"
 msgstr "Organizace"
 
-#: session_metadata_dialog.cc:658
+#: session_metadata_dialog.cc:661
 msgid "Country"
 msgstr "ZemÄ›"
 
-#: session_metadata_dialog.cc:672
+#: session_metadata_dialog.cc:675
 msgid "Title"
 msgstr "Název"
 
-#: session_metadata_dialog.cc:675
+#: session_metadata_dialog.cc:678
 msgid "Track Number"
 msgstr "Režim stopy"
 
-#: session_metadata_dialog.cc:678
+#: session_metadata_dialog.cc:681
 msgid "Subtitle"
 msgstr "Podnázev"
 
-#: session_metadata_dialog.cc:681
+#: session_metadata_dialog.cc:684
 msgid "Grouping"
 msgstr "Seskupení"
 
-#: session_metadata_dialog.cc:684
+#: session_metadata_dialog.cc:687
 msgid "Artist"
 msgstr "Umělec"
 
-#: session_metadata_dialog.cc:687
+#: session_metadata_dialog.cc:690
 msgid "Genre"
 msgstr "Žánr"
 
-#: session_metadata_dialog.cc:690
+#: session_metadata_dialog.cc:693
 msgid "Comment"
 msgstr "Poznámka"
 
-#: session_metadata_dialog.cc:693
+#: session_metadata_dialog.cc:696
 msgid "Copyright"
 msgstr "Autorské právo"
 
-#: session_metadata_dialog.cc:701 session_metadata_dialog.cc:706
+#: session_metadata_dialog.cc:704 session_metadata_dialog.cc:709
 msgid "Album"
 msgstr "Album"
 
-#: session_metadata_dialog.cc:709
+#: session_metadata_dialog.cc:712
 msgid "Year"
 msgstr "Rok"
 
-#: session_metadata_dialog.cc:712
+#: session_metadata_dialog.cc:715
 msgid "Album Artist"
 msgstr "Výtvarník alba"
 
-#: session_metadata_dialog.cc:715
+#: session_metadata_dialog.cc:718
 msgid "Total Tracks"
 msgstr "Celkový počet stop"
 
-#: session_metadata_dialog.cc:718
+#: session_metadata_dialog.cc:721
 msgid "Disc Subtitle"
 msgstr "Podnázev disku"
 
-#: session_metadata_dialog.cc:721
+#: session_metadata_dialog.cc:724
 msgid "Disc Number"
 msgstr "Číslo disku"
 
-#: session_metadata_dialog.cc:724
+#: session_metadata_dialog.cc:727
 msgid "Total Discs"
 msgstr "Celkový počet disků"
 
-#: session_metadata_dialog.cc:727
+#: session_metadata_dialog.cc:730
 msgid "Compilation"
 msgstr "Sbírka"
 
-#: session_metadata_dialog.cc:730
+#: session_metadata_dialog.cc:733
 msgid "ISRC"
 msgstr "ISRC"
 
-#: session_metadata_dialog.cc:733
+#: session_metadata_dialog.cc:736
 msgid "EAN barcode"
 msgstr "Čárový kód EAN"
 
-#: session_metadata_dialog.cc:746
+#: session_metadata_dialog.cc:749
 msgid "People"
 msgstr "Lidé"
 
-#: session_metadata_dialog.cc:751
+#: session_metadata_dialog.cc:754
 msgid "Lyricist"
 msgstr "TextaÅ™"
 
-#: session_metadata_dialog.cc:754
+#: session_metadata_dialog.cc:757
 msgid "Composer"
 msgstr "Skladatel"
 
-#: session_metadata_dialog.cc:757
+#: session_metadata_dialog.cc:760
 msgid "Conductor"
 msgstr "Dirigent"
 
-#: session_metadata_dialog.cc:760
+#: session_metadata_dialog.cc:763
 msgid "Remixer"
 msgstr "Remixer"
 
-#: session_metadata_dialog.cc:763
+#: session_metadata_dialog.cc:766
 msgid "Arranger"
 msgstr "Aranžér"
 
-#: session_metadata_dialog.cc:766
+#: session_metadata_dialog.cc:769
 msgid "Engineer"
 msgstr "Inženýr"
 
-#: session_metadata_dialog.cc:769
+#: session_metadata_dialog.cc:772
 msgid "Producer"
 msgstr "Výrobce"
 
-#: session_metadata_dialog.cc:772
+#: session_metadata_dialog.cc:775
 msgid "DJ Mixer"
 msgstr "Směšovač DJ"
 
-#: session_metadata_dialog.cc:775
+#: session_metadata_dialog.cc:778
 msgid "Metadata|Mixer"
 msgstr "Popisná data|Směšovač"
 
-#: session_metadata_dialog.cc:783
+#: session_metadata_dialog.cc:786
 msgid "School"
 msgstr "Å kola"
 
-#: session_metadata_dialog.cc:788
+#: session_metadata_dialog.cc:791
 msgid "Instructor"
 msgstr "Učitel"
 
-#: session_metadata_dialog.cc:791
+#: session_metadata_dialog.cc:794
 msgid "Course"
 msgstr "Přednáška"
 
-#: session_metadata_dialog.cc:799
+#: session_metadata_dialog.cc:802
 msgid "Edit Session Metadata"
 msgstr "Upravit popisná data k sezení"
 
-#: session_metadata_dialog.cc:830
+#: session_metadata_dialog.cc:833
 msgid "Import session metadata"
 msgstr "Zavést popisná data k sezení"
 
-#: session_metadata_dialog.cc:851
+#: session_metadata_dialog.cc:854
 msgid "Choose session to import metadata from"
 msgstr "Vybrat sezení, z něhož se popisná data mají zavést"
 
-#: session_metadata_dialog.cc:889
+#: session_metadata_dialog.cc:892
 msgid "This session file could not be read!"
 msgstr "Tento soubor se sezením se nepodařilo přečíst!"
 
-#: session_metadata_dialog.cc:899
+#: session_metadata_dialog.cc:902
 msgid ""
 "The session file didn't contain metadata!\n"
 "Maybe this is an old session format?"
@@ -12260,7 +13269,7 @@ msgstr ""
 "Soubor se sezením neobsahoval popisná data!\n"
 "Je možné, že je to starý formát sezení?"
 
-#: session_metadata_dialog.cc:918
+#: session_metadata_dialog.cc:921
 msgid "Import all from:"
 msgstr "Zavést vše z:"
 
@@ -12478,6 +13487,11 @@ msgstr "WAVE-64"
 msgid "RF64 (WAV compatible)"
 msgstr "RF64 (kompatibilní s WAV)"
 
+#: session_option_editor.cc:210 session_option_editor.cc:216
+#: session_option_editor.cc:223
+msgid "Files|Locations"
+msgstr ""
+
 #: session_option_editor.cc:210
 msgid "File locations"
 msgstr "Umístění souborů"
@@ -12671,26 +13685,14 @@ msgstr "<b>Informace o zvukovém souboru</b>"
 msgid "Timestamp:"
 msgstr "Časové razítko:"
 
-#: sfdb_ui.cc:149
-msgid "Format:"
-msgstr "Formát:"
-
-#: sfdb_ui.cc:188 sfdb_ui.cc:658
+#: sfdb_ui.cc:188 sfdb_ui.cc:659
 msgid "Tags:"
 msgstr "Značky:"
 
-#: sfdb_ui.cc:293 sfdb_ui.cc:409
-msgid "Could not read file: %1 (%2)."
-msgstr "Soubor nelze přečíst: %1 (%2)."
-
 #: sfdb_ui.cc:297
 msgid "<b>Midi File Information</b>"
 msgstr "<b>Informace o souboru MIDI</b>"
 
-#: sfdb_ui.cc:458
-msgid "Could not access soundfile: "
-msgstr "Nelze přistupovat ke zvukovému souboru: "
-
 #: sfdb_ui.cc:530
 msgid "SoundFileBox: Could not tokenize string: "
 msgstr "Okno zvukových souborů: Nelze rozebrat řetězec znaků: "
@@ -12727,149 +13729,149 @@ msgstr "Cesty"
 msgid "Search Tags"
 msgstr "Hledat značky"
 
-#: sfdb_ui.cc:663
+#: sfdb_ui.cc:664
 msgid "Sort:"
 msgstr "Třídit:"
 
-#: sfdb_ui.cc:671
+#: sfdb_ui.cc:672
 msgid "Longest"
 msgstr "Nejdelší"
 
-#: sfdb_ui.cc:672
+#: sfdb_ui.cc:673
 msgid "Shortest"
 msgstr "Nejkratší"
 
-#: sfdb_ui.cc:673
+#: sfdb_ui.cc:674
 msgid "Newest"
 msgstr "Nejnovější"
 
-#: sfdb_ui.cc:674
+#: sfdb_ui.cc:675
 msgid "Oldest"
 msgstr "Nejstarší"
 
-#: sfdb_ui.cc:675
+#: sfdb_ui.cc:676
 msgid "Most downloaded"
 msgstr "Nejvíce stahované"
 
-#: sfdb_ui.cc:676
+#: sfdb_ui.cc:677
 msgid "Least downloaded"
 msgstr "Nejméně stahované"
 
-#: sfdb_ui.cc:677
+#: sfdb_ui.cc:678
 msgid "Highest rated"
 msgstr "Nejvýše hodnocené"
 
-#: sfdb_ui.cc:678
+#: sfdb_ui.cc:679
 msgid "Lowest rated"
 msgstr "Nejníže hodnocené"
 
-#: sfdb_ui.cc:683
+#: sfdb_ui.cc:684
 msgid "More"
 msgstr "Více"
 
-#: sfdb_ui.cc:687
+#: sfdb_ui.cc:688
 msgid "Similar"
 msgstr "Podobné"
 
-#: sfdb_ui.cc:699
+#: sfdb_ui.cc:700
 msgid "ID"
 msgstr "ID"
 
-#: sfdb_ui.cc:700 add_video_dialog.cc:83
+#: sfdb_ui.cc:701 add_video_dialog.cc:83
 msgid "Filename"
 msgstr "Souborový název"
 
-#: sfdb_ui.cc:702
+#: sfdb_ui.cc:703 time_fx_dialog.cc:154
 msgid "Duration"
 msgstr "Doba trvání"
 
-#: sfdb_ui.cc:703
+#: sfdb_ui.cc:704
 msgid "Size"
 msgstr "Velikost"
 
-#: sfdb_ui.cc:704
+#: sfdb_ui.cc:705
 msgid "Samplerate"
 msgstr "Vzorkovací kmitočet"
 
-#: sfdb_ui.cc:705
+#: sfdb_ui.cc:706
 msgid "License"
 msgstr "Licence"
 
-#: sfdb_ui.cc:723
+#: sfdb_ui.cc:724
 msgid "Search Freesound"
 msgstr "Hledat volné zvuky"
 
-#: sfdb_ui.cc:739
+#: sfdb_ui.cc:741
 msgid "Press to import selected files"
 msgstr "Stiskněte pro zavedení vybraných souborů"
 
-#: sfdb_ui.cc:740
+#: sfdb_ui.cc:742
 msgid "Press to close this window without importing any files"
 msgstr "Stiskněte pro zavření tohoto okna bez zavedení jakýchkoli souborů"
 
-#: sfdb_ui.cc:935
+#: sfdb_ui.cc:937
 msgid "SoundFileBrowser: Could not tokenize string: "
 msgstr "Prohlížeč zvukových souborů: Nelze rozebrat řetězec znaků:"
 
-#: sfdb_ui.cc:1135
+#: sfdb_ui.cc:1137
 msgid "%1 more page of 100 results available"
 msgid_plural "%1 more pages of 100 results available"
 msgstr[0] "Dostupná %1 další strana ze sta výsledků"
 msgstr[1] "Dostupné %1 další strany ze sta výsledků"
 
-#: sfdb_ui.cc:1140
+#: sfdb_ui.cc:1142
 msgid "No more results available"
 msgstr "Nejsou dostupné žádné další výsledky"
 
-#: sfdb_ui.cc:1204
+#: sfdb_ui.cc:1206
 msgid "B"
 msgstr "B"
 
-#: sfdb_ui.cc:1206
+#: sfdb_ui.cc:1208
 msgid "kB"
 msgstr "kB "
 
-#: sfdb_ui.cc:1208 sfdb_ui.cc:1210
+#: sfdb_ui.cc:1210 sfdb_ui.cc:1212
 msgid "MB"
 msgstr "MB"
 
-#: sfdb_ui.cc:1212
+#: sfdb_ui.cc:1214
 msgid "GB"
 msgstr "GB"
 
-#: sfdb_ui.cc:1429 sfdb_ui.cc:1734 sfdb_ui.cc:1795 sfdb_ui.cc:1813
+#: sfdb_ui.cc:1431 sfdb_ui.cc:1728 sfdb_ui.cc:1764 sfdb_ui.cc:1782
 msgid "one track per file"
 msgstr "Jedna stopa na soubor"
 
-#: sfdb_ui.cc:1432 sfdb_ui.cc:1796 sfdb_ui.cc:1814
+#: sfdb_ui.cc:1434 sfdb_ui.cc:1765 sfdb_ui.cc:1783
 msgid "one track per channel"
 msgstr "Jedna stopa na kanál"
 
-#: sfdb_ui.cc:1440 sfdb_ui.cc:1798 sfdb_ui.cc:1815
+#: sfdb_ui.cc:1442 sfdb_ui.cc:1767 sfdb_ui.cc:1784
 msgid "sequence files"
 msgstr "Soubory seřadit vedle sebe"
 
-#: sfdb_ui.cc:1443 sfdb_ui.cc:1803
+#: sfdb_ui.cc:1445 sfdb_ui.cc:1772
 msgid "all files in one track"
 msgstr "Všechny soubory do jedné stopy"
 
-#: sfdb_ui.cc:1444 sfdb_ui.cc:1797
+#: sfdb_ui.cc:1446 sfdb_ui.cc:1766
 msgid "merge files"
 msgstr "Sloučit soubory"
 
-#: sfdb_ui.cc:1450 sfdb_ui.cc:1800
+#: sfdb_ui.cc:1452 sfdb_ui.cc:1769
 msgid "one region per file"
 msgstr "Jedna oblast na soubor"
 
-#: sfdb_ui.cc:1453 sfdb_ui.cc:1801
+#: sfdb_ui.cc:1455 sfdb_ui.cc:1770
 msgid "one region per channel"
 msgstr "Jedna oblast na kanál"
 
-#: sfdb_ui.cc:1458 sfdb_ui.cc:1802 sfdb_ui.cc:1816
+#: sfdb_ui.cc:1460 sfdb_ui.cc:1771 sfdb_ui.cc:1785
 msgid "all files in one region"
 msgstr "Všechny soubory v jedné oblasti"
 
-#: sfdb_ui.cc:1525
+#: sfdb_ui.cc:1527
 msgid ""
 "One or more of the selected files\n"
 "cannot be used by %1"
@@ -12877,102 +13879,102 @@ msgstr ""
 "Jeden nebo více vybraných souborů\n"
 "nemůže být použito %1"
 
-#: sfdb_ui.cc:1669
+#: sfdb_ui.cc:1671
 msgid "Copy files to session"
 msgstr "Zkopírovat soubory do sezení"
 
-#: sfdb_ui.cc:1688 sfdb_ui.cc:1856
+#: sfdb_ui.cc:1686 sfdb_ui.cc:1825
 msgid "file timestamp"
 msgstr "Časové razítko souboru"
 
-#: sfdb_ui.cc:1689 sfdb_ui.cc:1858
+#: sfdb_ui.cc:1687 sfdb_ui.cc:1827
 msgid "edit point"
 msgstr "Pracovní bod"
 
-#: sfdb_ui.cc:1690 sfdb_ui.cc:1860
+#: sfdb_ui.cc:1688 sfdb_ui.cc:1829
 msgid "playhead"
 msgstr "Ukazatel polohy"
 
-#: sfdb_ui.cc:1691
+#: sfdb_ui.cc:1689
 msgid "session start"
 msgstr "Začátek sezení"
 
-#: sfdb_ui.cc:1697
+#: sfdb_ui.cc:1695
 msgid "<b>Add files ...</b>"
 msgstr "<b>Přidat soubory...</b>"
 
-#: sfdb_ui.cc:1709
+#: sfdb_ui.cc:1700
 msgid "<b>Insert at</b>"
 msgstr "<b>Vložit v</b>"
 
-#: sfdb_ui.cc:1722
+#: sfdb_ui.cc:1705
 msgid "<b>Mapping</b>"
 msgstr "<b>Přiřazení</b>"
 
-#: sfdb_ui.cc:1740
+#: sfdb_ui.cc:1710
 msgid "<b>Conversion quality</b>"
 msgstr "<b>Kvalita převodu</b>"
 
-#: sfdb_ui.cc:1752
+#: sfdb_ui.cc:1715
 msgid "<b>Instrument</b>"
 msgstr "<b>Nástroj</b>"
 
-#: sfdb_ui.cc:1764 sfdb_ui.cc:1872
+#: sfdb_ui.cc:1734 sfdb_ui.cc:1841
 msgid "Best"
 msgstr "Nejlepší"
 
-#: sfdb_ui.cc:1765 sfdb_ui.cc:1874
+#: sfdb_ui.cc:1735 sfdb_ui.cc:1843
 msgid "Good"
 msgstr "Dobrá"
 
-#: sfdb_ui.cc:1766 sfdb_ui.cc:1876
+#: sfdb_ui.cc:1736 sfdb_ui.cc:1845
 msgid "Quick"
 msgstr "Rychlý převod"
 
-#: sfdb_ui.cc:1768
+#: sfdb_ui.cc:1738
 msgid "Fastest"
 msgstr "Co nejrychleji"
 
-#: shuttle_control.cc:57
+#: shuttle_control.cc:64
 msgid "Shuttle speed control (Context-click for options)"
 msgstr ""
 "Rychlost přehrávání (klepnutí pravým tlačítkem myši pro vyvolání nabídky "
 "voleb)"
 
-#: shuttle_control.cc:184
+#: shuttle_control.cc:201 time_fx_dialog.cc:164
 msgid "Percent"
 msgstr "Procento"
 
-#: shuttle_control.cc:192
+#: shuttle_control.cc:209
 msgid "Units"
 msgstr "Jednotky"
 
-#: shuttle_control.cc:198 shuttle_control.cc:633
+#: shuttle_control.cc:215 shuttle_control.cc:671
 msgid "Sprung"
 msgstr "Pero"
 
-#: shuttle_control.cc:202 shuttle_control.cc:636
+#: shuttle_control.cc:219 shuttle_control.cc:674
 msgid "Wheel"
 msgstr "Kolo"
 
-#: shuttle_control.cc:236
+#: shuttle_control.cc:253
 msgid "Maximum speed"
 msgstr "Nejvyšší rychlost"
 
-#: shuttle_control.cc:239
+#: shuttle_control.cc:256
 msgid "Reset to 100%"
 msgstr "Nastavit znovu na 100 %"
 
-#: shuttle_control.cc:592
+#: shuttle_control.cc:633
 msgid "Playing"
 msgstr "Přehrává se"
 
-#: shuttle_control.cc:607
+#: shuttle_control.cc:648
 #, c-format
 msgid "<<< %+d semitones"
 msgstr "<<< %+d půltóny"
 
-#: shuttle_control.cc:609
+#: shuttle_control.cc:650
 #, c-format
 msgid ">>> %+d semitones"
 msgstr ">>> %+d půltóny"
@@ -13001,7 +14003,7 @@ msgstr "Udělat soubory stahovatelné"
 msgid "%1: %2 of %3 bytes uploaded"
 msgstr "%1: Nahráno %2 z %3 bytů"
 
-#: splash.cc:75
+#: splash.cc:78
 msgid "%1 loading ..."
 msgstr "Nahrává se %1..."
 
@@ -13017,7 +14019,7 @@ msgstr "Odstranit reproduktor"
 msgid "Azimuth:"
 msgstr "Azimut:"
 
-#: startup.cc:70
+#: startup.cc:71
 msgid ""
 "Use an external mixer or the hardware mixer of your audio interface.\n"
 "%1 will play NO role in monitoring"
@@ -13026,11 +14028,11 @@ msgstr ""
 "pro zvuk.\n"
 "%1 ve sledování NEBUDE hrát žádnou úlohu"
 
-#: startup.cc:72
+#: startup.cc:73
 msgid "Ask %1 to play back material as it is being recorded"
 msgstr "Požádat %1 o přehrávání materiálu, už když je nahráván"
 
-#: startup.cc:145
+#: startup.cc:146
 msgid ""
 "<span size=\"larger\">%1 is a digital audio workstation. You can use it to "
 "record, edit and mix multi-track audio. You can produce your own CDs, mix "
@@ -13047,15 +14049,15 @@ msgstr ""
 "Předtím než program začnete používat, je tu jen několik věcí, které je třeba "
 "nastavit.</span>"
 
-#: startup.cc:171
+#: startup.cc:172
 msgid "Welcome to %1"
 msgstr "Vítejte v %1u"
 
-#: startup.cc:194
+#: startup.cc:195
 msgid "Default folder for %1 sessions"
 msgstr "Výchozí složka pro sezení programu %1"
 
-#: startup.cc:200
+#: startup.cc:201
 msgid ""
 "Each project that you work on with %1 has its own folder.\n"
 "These can require a lot of disk space if you are recording audio.\n"
@@ -13071,11 +14073,11 @@ msgstr ""
 "\n"
 "<i>(Nová sezení můžete dát kamkoli. Toto je jen výchozí nastavení)</i>"
 
-#: startup.cc:223
+#: startup.cc:224
 msgid "Default folder for new sessions"
 msgstr "Výchozí složka pro nová sezení"
 
-#: startup.cc:244
+#: startup.cc:245
 msgid ""
 "While recording instruments or vocals, you probably want to listen to the\n"
 "signal as well as record it. This is called \"monitoring\". There are\n"
@@ -13090,26 +14092,24 @@ msgid ""
 msgstr ""
 "Při nahrávání nástrojů nebo hlasů pravděpodobně chcete poslouchat\n"
 "signál, a také jej nahrávat. Tomu se říká sledování. Jsou různé způsoby,\n"
-"jak to dělat v závislosti na tom, jaké máte vybavení, a na nastavení "
-"tohoto\n"
+"jak to dělat v závislosti na tom, jaké máte vybavení, a na nastavení tohoto\n"
 "vybavení. Dva nejběžnější jsou představeny zde.\n"
 "Zvolte, prosím, který z nich je pro vaše nastavení správný.\n"
 "\n"
 "<i>(Toto nastavení můžete kdykoli prostřednictvím dialogu pro nastavení "
-"změnit)</"
-"i>\n"
+"změnit)</i>\n"
 "\n"
 "<i>Pokud nevíte, o čem to je, prostě přijměte výchozí nastavení.</i>"
 
-#: startup.cc:265
+#: startup.cc:266
 msgid "Monitoring Choices"
 msgstr "Volby pro sledování"
 
-#: startup.cc:288
+#: startup.cc:289
 msgid "Use a Master bus directly"
 msgstr "Použít hlavní sběrnici přímo"
 
-#: startup.cc:290
+#: startup.cc:291
 msgid ""
 "Connect the Master bus directly to your hardware outputs. This is preferable "
 "for simple usage."
@@ -13117,11 +14117,11 @@ msgstr ""
 "Spojit hlavní sběrnici přímo s výstupy vašeho technického vybavení. To je "
 "vhodnější pro jednoduché použití."
 
-#: startup.cc:299
+#: startup.cc:300
 msgid "Use an additional Monitor bus"
 msgstr "Použít dodatečnou sběrnici pro sledování"
 
-#: startup.cc:302
+#: startup.cc:303
 msgid ""
 "Use a Monitor bus between Master bus and hardware outputs for \n"
 "greater control in monitoring without affecting the mix."
@@ -13130,7 +14130,7 @@ msgstr ""
 "vybavení\n"
 "pro větší dohled nad sledováním bez ovlivnění míchání."
 
-#: startup.cc:324
+#: startup.cc:325
 msgid ""
 "<i>You can change this preference at any time via the Preferences dialog.\n"
 "You can also add or remove the monitor section to/from any session.</i>\n"
@@ -13143,46 +14143,42 @@ msgstr ""
 "\n"
 "<i>Pokud nevíte, o čem to je, prostě přijměte výchozí nastavení.</i>"
 
-#: startup.cc:335
+#: startup.cc:336
 msgid "Monitor Section"
 msgstr "Část pro sledování"
 
-#: step_entry.cc:60
+#: step_entry.cc:59
 msgid "Step Entry: %1"
 msgstr "Zápis kroku: %1"
 
-#: step_entry.cc:65
+#: step_entry.cc:64
 msgid ">beat"
 msgstr ">doba"
 
-#: step_entry.cc:66
+#: step_entry.cc:65
 msgid ">bar"
 msgstr ">takt"
 
-#: step_entry.cc:67
+#: step_entry.cc:66
 msgid ">EP"
 msgstr ">EP"
 
-#: step_entry.cc:68
+#: step_entry.cc:67
 msgid "sustain"
 msgstr "Držet"
 
-#: step_entry.cc:69
+#: step_entry.cc:68
 msgid "rest"
 msgstr "Pomlka"
 
-#: step_entry.cc:70
+#: step_entry.cc:69
 msgid "g-rest"
 msgstr "g-pomlka"
 
-#: step_entry.cc:71
+#: step_entry.cc:70
 msgid "back"
 msgstr "Zpět"
 
-#: step_entry.cc:82 step_entry.cc:85
-msgid "+"
-msgstr "+"
-
 #: step_entry.cc:191
 msgid "Set note length to a whole note"
 msgstr "Nastavit délku noty na celou notu"
@@ -13291,11 +14287,11 @@ msgstr "Vložit zprávu o změně banky"
 msgid "Insert a program change message"
 msgstr "Vložit zprávu o změně programu"
 
-#: step_entry.cc:343 step_entry.cc:700
+#: step_entry.cc:343 step_entry.cc:645
 msgid "Move Insert Position Back by Note Length"
 msgstr "Přesunout polohu vložení zpět podle délky noty"
 
-#: step_entry.cc:344 step_entry.cc:698
+#: step_entry.cc:344 step_entry.cc:643
 msgid "Move Insert Position to Edit Point"
 msgstr "Přesunout polohu vložení k pracovnímu bodu"
 
@@ -13307,230 +14303,230 @@ msgstr "1/Nota"
 msgid "Octave"
 msgstr "Oktáva"
 
-#: step_entry.cc:598
+#: step_entry.cc:592
 msgid "Insert Note A"
 msgstr "Vložit notu A"
 
-#: step_entry.cc:599
+#: step_entry.cc:593
 msgid "Insert Note A-sharp"
 msgstr "Vložit notu Ais"
 
-#: step_entry.cc:600
+#: step_entry.cc:594
 msgid "Insert Note B"
 msgstr "Vložit notu H"
 
-#: step_entry.cc:601
+#: step_entry.cc:595
 msgid "Insert Note C"
 msgstr "Vložit notu C"
 
-#: step_entry.cc:602
+#: step_entry.cc:596
 msgid "Insert Note C-sharp"
 msgstr "Vložit notu Cis"
 
-#: step_entry.cc:603
+#: step_entry.cc:597
 msgid "Insert Note D"
 msgstr "Vložit notu D"
 
-#: step_entry.cc:604
+#: step_entry.cc:598
 msgid "Insert Note D-sharp"
 msgstr "Vložit notu Dis"
 
-#: step_entry.cc:605
+#: step_entry.cc:599
 msgid "Insert Note E"
 msgstr "Vložit notu E"
 
-#: step_entry.cc:606
+#: step_entry.cc:600
 msgid "Insert Note F"
 msgstr "Vložit notu F"
 
-#: step_entry.cc:607
+#: step_entry.cc:601
 msgid "Insert Note F-sharp"
 msgstr "Vložit notu Fis"
 
-#: step_entry.cc:608
+#: step_entry.cc:602
 msgid "Insert Note G"
 msgstr "Vložit notu G"
 
-#: step_entry.cc:609
+#: step_entry.cc:603
 msgid "Insert Note G-sharp"
 msgstr "Vložit notu Gis"
 
-#: step_entry.cc:611
+#: step_entry.cc:605
 msgid "Insert a Note-length Rest"
 msgstr "Vložit pomlku o délce noty"
 
-#: step_entry.cc:612
+#: step_entry.cc:606
 msgid "Insert a Snap-length Rest"
 msgstr "Vložit pomlku o délce zapadnutí"
 
-#: step_entry.cc:614 step_entry.cc:615
+#: step_entry.cc:608 step_entry.cc:609
 msgid "Move to next octave"
 msgstr "Přesunout se k další oktávě"
 
-#: step_entry.cc:617
+#: step_entry.cc:611
 msgid "Move to Next Note Length"
 msgstr "Přesunout se k délce další noty"
 
-#: step_entry.cc:618
+#: step_entry.cc:612
 msgid "Move to Previous Note Length"
 msgstr "Přesunout se k délce předchozí noty"
 
-#: step_entry.cc:620
+#: step_entry.cc:614
 msgid "Increase Note Length"
 msgstr "Zvětšit délku noty"
 
-#: step_entry.cc:621
+#: step_entry.cc:615
 msgid "Decrease Note Length"
 msgstr "Zmenšit délku noty"
 
-#: step_entry.cc:623
+#: step_entry.cc:617
 msgid "Move to Next Note Velocity"
 msgstr "Přesunout se k síle tónu další noty"
 
-#: step_entry.cc:624
+#: step_entry.cc:618
 msgid "Move to Previous Note Velocity"
 msgstr "Přesunout se k síle tónu předchozí noty"
 
-#: step_entry.cc:626
+#: step_entry.cc:620
 msgid "Increase Note Velocity"
 msgstr "Zvětšit sílu tónu noty"
 
-#: step_entry.cc:627
+#: step_entry.cc:621
 msgid "Decrease Note Velocity"
 msgstr "Zmenšit sílu tónu noty"
 
-#: step_entry.cc:629
+#: step_entry.cc:623
 msgid "Switch to the 1st octave"
 msgstr "Přejít na první oktávu"
 
-#: step_entry.cc:630
+#: step_entry.cc:624
 msgid "Switch to the 2nd octave"
 msgstr "Přejít na druhou oktávu"
 
-#: step_entry.cc:631
+#: step_entry.cc:625
 msgid "Switch to the 3rd octave"
 msgstr "Přejít na třetí oktávu"
 
-#: step_entry.cc:632
+#: step_entry.cc:626
 msgid "Switch to the 4th octave"
 msgstr "Přejít na čtvrtou oktávu"
 
-#: step_entry.cc:633
+#: step_entry.cc:627
 msgid "Switch to the 5th octave"
 msgstr "Přejít na pátou oktávu"
 
-#: step_entry.cc:634
+#: step_entry.cc:628
 msgid "Switch to the 6th octave"
 msgstr "Přejít na šestou oktávu"
 
-#: step_entry.cc:635
+#: step_entry.cc:629
 msgid "Switch to the 7th octave"
 msgstr "Přejít na sedmou oktávu"
 
-#: step_entry.cc:636
+#: step_entry.cc:630
 msgid "Switch to the 8th octave"
 msgstr "Přejít na osmou oktávu"
 
-#: step_entry.cc:637
+#: step_entry.cc:631
 msgid "Switch to the 9th octave"
 msgstr "Přejít na devátou oktávu"
 
-#: step_entry.cc:638
+#: step_entry.cc:632
 msgid "Switch to the 10th octave"
 msgstr "Přejít na desátou oktávu"
 
-#: step_entry.cc:639
+#: step_entry.cc:633
 msgid "Switch to the 11th octave"
 msgstr "Přejít na jedenáctou oktávu"
 
-#: step_entry.cc:644
+#: step_entry.cc:635
+msgid "Toggle Triple Notes"
+msgstr "Přepnout trojité noty"
+
+#: step_entry.cc:638
+msgid "Toggle Chord Entry"
+msgstr "Přepnout zápis akordu"
+
+#: step_entry.cc:640
+msgid "Sustain Selected Notes by Note Length"
+msgstr "Držet vybrané noty podle délky noty"
+
+#: step_entry.cc:650
 msgid "Set Note Length to Whole"
 msgstr "Nastavit délku noty na celou"
 
-#: step_entry.cc:646
+#: step_entry.cc:652
 msgid "Set Note Length to 1/2"
 msgstr "Nastavit délku noty na 1/2"
 
-#: step_entry.cc:648
+#: step_entry.cc:654
 msgid "Set Note Length to 1/3"
 msgstr "Nastavit délku noty na 1/3"
 
-#: step_entry.cc:650
+#: step_entry.cc:656
 msgid "Set Note Length to 1/4"
 msgstr "Nastavit délku noty na 1/4"
 
-#: step_entry.cc:652
+#: step_entry.cc:658
 msgid "Set Note Length to 1/8"
 msgstr "Nastavit délku noty na 1/8"
 
-#: step_entry.cc:654
+#: step_entry.cc:660
 msgid "Set Note Length to 1/16"
 msgstr "Nastavit délku noty na 1/16"
 
-#: step_entry.cc:656
+#: step_entry.cc:662
 msgid "Set Note Length to 1/32"
 msgstr "Nastavit délku noty na 1/32"
 
-#: step_entry.cc:658
+#: step_entry.cc:664
 msgid "Set Note Length to 1/64"
 msgstr "Nastavit délku noty na 1/64"
 
-#: step_entry.cc:663
+#: step_entry.cc:669
 msgid "Set Note Velocity to Pianississimo"
 msgstr "Nastavit sílu tónu noty na pianississimo"
 
-#: step_entry.cc:665
+#: step_entry.cc:671
 msgid "Set Note Velocity to Pianissimo"
 msgstr "Nastavit sílu tónu noty na pianissimo"
 
-#: step_entry.cc:667
+#: step_entry.cc:673
 msgid "Set Note Velocity to Piano"
 msgstr "Nastavit sílu tónu noty na piano"
 
-#: step_entry.cc:669
+#: step_entry.cc:675
 msgid "Set Note Velocity to Mezzo-Piano"
 msgstr "Nastavit sílu tónu noty na mezzo piano"
 
-#: step_entry.cc:671
+#: step_entry.cc:677
 msgid "Set Note Velocity to Mezzo-Forte"
 msgstr "Nastavit sílu tónu noty na mezzo forte"
 
-#: step_entry.cc:673
+#: step_entry.cc:679
 msgid "Set Note Velocity to Forte"
 msgstr "Nastavit sílu tónu noty na forte"
 
-#: step_entry.cc:675 step_entry.cc:677
+#: step_entry.cc:681 step_entry.cc:683
 msgid "Set Note Velocity to Fortississimo"
 msgstr "Nastavit sílu tónu noty na fortississimo"
 
-#: step_entry.cc:679
-msgid "Toggle Triple Notes"
-msgstr "Přepnout trojité noty"
-
-#: step_entry.cc:684
+#: step_entry.cc:688
 msgid "No Dotted Notes"
 msgstr "Žádné tečkované noty"
 
-#: step_entry.cc:686
+#: step_entry.cc:689
 msgid "Toggled Dotted Notes"
 msgstr "Přepnuté tečkované noty"
 
-#: step_entry.cc:688
+#: step_entry.cc:690
 msgid "Toggled Double-Dotted Notes"
 msgstr "Přepnuté dvojitě tečkované noty"
 
-#: step_entry.cc:690
+#: step_entry.cc:691
 msgid "Toggled Triple-Dotted Notes"
 msgstr "Přepnuté trojitě tečkované noty"
 
-#: step_entry.cc:693
-msgid "Toggle Chord Entry"
-msgstr "Přepnout zápis akordu"
-
-#: step_entry.cc:695
-msgid "Sustain Selected Notes by Note Length"
-msgstr "Držet vybrané noty podle délky noty"
-
 #: stereo_panner.cc:129
 #, c-format
 msgid "L:%3d R:%3d Width:%d%%"
@@ -13552,6 +14548,10 @@ msgstr "Šířka"
 msgid "Strip Silence"
 msgstr "Odstranit ticho"
 
+#: strip_silence_dialog.cc:65
+msgid "Threshold"
+msgstr "Práh"
+
 #: strip_silence_dialog.cc:76
 msgid "Minimum length"
 msgstr "Nejmenší délka"
@@ -13564,164 +14564,173 @@ msgstr "Délka postupného zesílení signálu"
 msgid "Analyzing"
 msgstr "Rozbor"
 
-#: tempo_dialog.cc:41 tempo_dialog.cc:57
+#: tempo_dialog.cc:43 tempo_dialog.cc:60
 msgid "bar:"
 msgstr "Takt:"
 
-#: tempo_dialog.cc:42 tempo_dialog.cc:58
+#: tempo_dialog.cc:44 tempo_dialog.cc:61
 msgid "beat:"
 msgstr "Doba:"
 
-#: tempo_dialog.cc:43 tempo_dialog.cc:59
+#: tempo_dialog.cc:45 tempo_dialog.cc:62
 msgid "Pulse note"
 msgstr "Nota rytmu"
 
-#: tempo_dialog.cc:44 tempo_dialog.cc:60
+#: tempo_dialog.cc:46 tempo_dialog.cc:63
 msgid "Tap tempo"
 msgstr "Vypleskat tempo"
 
-#: tempo_dialog.cc:77 tempo_dialog.cc:78 tempo_dialog.cc:343
-#: tempo_dialog.cc:344
+#: tempo_dialog.cc:81 tempo_dialog.cc:82 tempo_dialog.cc:448
+#: tempo_dialog.cc:449
 msgid "whole"
 msgstr "Celá"
 
-#: tempo_dialog.cc:79 tempo_dialog.cc:80 tempo_dialog.cc:345
-#: tempo_dialog.cc:346
+#: tempo_dialog.cc:83 tempo_dialog.cc:84 tempo_dialog.cc:450
+#: tempo_dialog.cc:451
 msgid "second"
 msgstr "Sekunda"
 
-#: tempo_dialog.cc:81 tempo_dialog.cc:82 tempo_dialog.cc:347
-#: tempo_dialog.cc:348
+#: tempo_dialog.cc:85 tempo_dialog.cc:86 tempo_dialog.cc:452
+#: tempo_dialog.cc:453
 msgid "third"
 msgstr "Třetina"
 
-#: tempo_dialog.cc:83 tempo_dialog.cc:84 tempo_dialog.cc:349
-#: tempo_dialog.cc:350
+#: tempo_dialog.cc:87 tempo_dialog.cc:88 tempo_dialog.cc:454
+#: tempo_dialog.cc:455
 msgid "quarter"
 msgstr "ÄŒtvrtina"
 
-#: tempo_dialog.cc:85 tempo_dialog.cc:86 tempo_dialog.cc:351
-#: tempo_dialog.cc:352
+#: tempo_dialog.cc:89 tempo_dialog.cc:90 tempo_dialog.cc:456
+#: tempo_dialog.cc:457
 msgid "eighth"
 msgstr "Osmina"
 
-#: tempo_dialog.cc:87 tempo_dialog.cc:88 tempo_dialog.cc:353
-#: tempo_dialog.cc:354
+#: tempo_dialog.cc:91 tempo_dialog.cc:92 tempo_dialog.cc:458
+#: tempo_dialog.cc:459
 msgid "sixteenth"
 msgstr "Šestnáctina"
 
-#: tempo_dialog.cc:89 tempo_dialog.cc:90 tempo_dialog.cc:355
-#: tempo_dialog.cc:356
+#: tempo_dialog.cc:93 tempo_dialog.cc:94 tempo_dialog.cc:460
+#: tempo_dialog.cc:461
 msgid "thirty-second"
 msgstr "Dvaatřicetina"
 
-#: tempo_dialog.cc:91 tempo_dialog.cc:92 tempo_dialog.cc:357
-#: tempo_dialog.cc:358
+#: tempo_dialog.cc:95 tempo_dialog.cc:96 tempo_dialog.cc:462
+#: tempo_dialog.cc:463
 msgid "sixty-fourth"
 msgstr "Čtyřiašedesátina"
 
-#: tempo_dialog.cc:93 tempo_dialog.cc:94 tempo_dialog.cc:359
-#: tempo_dialog.cc:360
+#: tempo_dialog.cc:97 tempo_dialog.cc:98 tempo_dialog.cc:464
+#: tempo_dialog.cc:465
 msgid "one-hundred-twenty-eighth"
 msgstr "Stoosmadvacetina"
 
-#: tempo_dialog.cc:121
+#: tempo_dialog.cc:115 tempo_dialog.cc:116
+msgid "ramped"
+msgstr ""
+
+#: tempo_dialog.cc:117 tempo_dialog.cc:118
+msgid "constant"
+msgstr ""
+
+#: tempo_dialog.cc:133 tempo_dialog.cc:134 tempo_dialog.cc:482
+#: tempo_dialog.cc:483
+msgid "music"
+msgstr ""
+
+#: tempo_dialog.cc:161
 msgid "Beats per minute:"
 msgstr "Dob za minutu:"
 
-#: tempo_dialog.cc:155
+#: tempo_dialog.cc:195
 msgid "Tempo begins at"
 msgstr "Tempo začíná na"
 
-#: tempo_dialog.cc:254
+#: tempo_dialog.cc:201
+msgid "Lock Style:"
+msgstr ""
+
+#: tempo_dialog.cc:209
+msgid "Tempo Type:"
+msgstr ""
+
+#: tempo_dialog.cc:321
 msgid "incomprehensible pulse note type (%1)"
 msgstr "Nesrozumitelný typ noty rytmu (%1)"
 
-#: tempo_dialog.cc:375
+#: tempo_dialog.cc:334
+msgid "incomprehensible tempo type (%1)"
+msgstr ""
+
+#: tempo_dialog.cc:347
+msgid "incomprehensible lock style (%1)"
+msgstr ""
+
+#: tempo_dialog.cc:498
 msgid "Note value:"
 msgstr "Hodnota noty:"
 
-#: tempo_dialog.cc:376
+#: tempo_dialog.cc:499
+msgid "Lock style:"
+msgstr ""
+
+#: tempo_dialog.cc:500
 msgid "Beats per bar:"
 msgstr "Dob na takt:"
 
-#: tempo_dialog.cc:390
+#: tempo_dialog.cc:514
 msgid "Meter begins at bar:"
 msgstr "Metrum začíná na taktu:"
 
-#: tempo_dialog.cc:503
+#: tempo_dialog.cc:638
 msgid "incomprehensible meter note type (%1)"
 msgstr "Nesrozumitelný typ noty metra (%1)"
 
-#: theme_manager.cc:61
-msgid "Dark Theme"
-msgstr "Tmavý motiv"
-
-#: theme_manager.cc:62
-msgid "Light Theme"
-msgstr "Světlý motiv"
-
-#: theme_manager.cc:63
-msgid "Restore Defaults"
-msgstr "Obnovit výchozí"
+#: tempo_dialog.cc:651
+msgid "incomprehensible meter lock style (%1)"
+msgstr ""
 
-#: theme_manager.cc:64
+#: theme_manager.cc:53
 msgid "Draw \"flat\" buttons"
 msgstr "Kreslit plochá tlačítka"
 
-#: theme_manager.cc:65
+#: theme_manager.cc:54
 msgid "Blink Rec-Arm buttons"
 msgstr "Tlačítko hlásící připravenost k nahrávání bliká"
 
-#: theme_manager.cc:66
+#: theme_manager.cc:55
 msgid "Color regions using their track's color"
 msgstr "Obarvit oblasti barvou jejich stopy"
 
-#: theme_manager.cc:67
+#: theme_manager.cc:56
 msgid "Show waveform clipping"
 msgstr "Ukázat přebuzení průběhové křivky"
 
-#: theme_manager.cc:69
+#: theme_manager.cc:58
 msgid "Waveforms color gradient depth"
 msgstr "Hloubka barevného přechodu průběhové křivky"
 
-#: theme_manager.cc:71
+#: theme_manager.cc:60
 msgid "Timeline item gradient depth"
 msgstr "Hloubka barevného přechodu prvku časové osy"
 
-#: theme_manager.cc:72
+#: theme_manager.cc:61
 msgid "All floating windows are dialogs"
 msgstr "Všechna plovoucí okna jsou dialogy"
 
-#: theme_manager.cc:73
+#: theme_manager.cc:62
 msgid "Transient windows follow front window."
 msgstr "Krátkodobá okna sledují hlavní okno."
 
-#: theme_manager.cc:74
+#: theme_manager.cc:63
 msgid "Float detached monitor-section window"
 msgstr "Plovoucí spuštěné okno sledovacího úseku"
 
-#: theme_manager.cc:75
+#: theme_manager.cc:64
 msgid "Icon Set"
 msgstr "Sada ikon"
 
-#: theme_manager.cc:84
-msgid "Object"
-msgstr "Předmět"
-
-#: theme_manager.cc:162
-msgid "Items"
-msgstr "Předměty"
-
-#: theme_manager.cc:163
-msgid "Palette"
-msgstr "Paleta"
-
-#: theme_manager.cc:164
-msgid "Transparency"
-msgstr "Průhlednost"
-
-#: theme_manager.cc:195
+#: theme_manager.cc:132
 msgid ""
 "Mark all floating windows to be type \"Dialog\" rather than using \"Utility"
 "\" for some.\n"
@@ -13733,7 +14742,7 @@ msgstr ""
 "To může u některých správců oken pomoci. Aby se to projevilo, je potřeba %1 "
 "spustit znovu"
 
-#: theme_manager.cc:199
+#: theme_manager.cc:136
 msgid ""
 "Make transient windows follow the front window when toggling between the "
 "editor and mixer.\n"
@@ -13742,21 +14751,17 @@ msgstr ""
 "Krátkodobá okna sledují při změně mezi editorem a směšovačem hlavní okno.\n"
 "Aby se toto nastavení projevilo, je potřeba opětovné spuštění %1"
 
-#: theme_manager.cc:202
+#: theme_manager.cc:139
 msgid ""
 "When detaching the monitoring section, mark it as \"Utility\" window to stay "
 "in front.\n"
 "This requires a restart of %1 to take effect"
 msgstr ""
-"Při odpojení sledovacího úseku jej, aby zůstalo v popředí, "
-"označit jako okno pomocných prostředků."
-"Změna této volby vyžaduje k projevení se opětovné spuštění"
-
-#: theme_manager.cc:643
-msgid "Color Palette"
-msgstr "Paleta barev"
+"Při odpojení sledovacího úseku jej, aby zůstalo v popředí, označit jako okno "
+"pomocných prostředků.Změna této volby vyžaduje k projevení se opětovné "
+"spuštění"
 
-#: time_axis_view.cc:150
+#: time_axis_view.cc:148
 msgid "Track/Bus name (double click to edit)"
 msgstr "Název stopy/sběrnice (pro úpravy dvakrát klepnout)"
 
@@ -13766,71 +14771,71 @@ msgid_plural "new duration of %1 frames is out of bounds for %2"
 msgstr[0] "Nová doba trvání %1 snímků je mimo dovolenou oblast %2"
 msgstr[1] "Nová doba trvání %1 snímků je mimo dovolenou oblast pro %2"
 
-#: time_fx_dialog.cc:62
+#: time_fx_dialog.cc:60
 msgid "Quick but Ugly"
 msgstr "Rychlé ale ošklivé"
 
-#: time_fx_dialog.cc:63
+#: time_fx_dialog.cc:61
 msgid "Skip Anti-aliasing"
 msgstr "Přeskočit vyhlazování"
 
-#: time_fx_dialog.cc:64
-msgid "Contents:"
-msgstr "Obsah:"
+#: time_fx_dialog.cc:62
+msgid "Contents"
+msgstr ""
 
-#: time_fx_dialog.cc:65
+#: time_fx_dialog.cc:63
 msgid "Minimize time distortion"
 msgstr "Zmenšit časové zkreslení"
 
-#: time_fx_dialog.cc:66
+#: time_fx_dialog.cc:64
 msgid "Preserve Formants"
 msgstr "Zachovat složky rozhodující o barvě zvuku (formanty)"
 
-#: time_fx_dialog.cc:71
+#: time_fx_dialog.cc:81
 msgid "TimeFXDialog"
 msgstr "Okno TimeFX"
 
-#: time_fx_dialog.cc:74
+#: time_fx_dialog.cc:84
 msgid "Pitch Shift Audio"
 msgstr "Posun výšky tónu zvuku"
 
-#: time_fx_dialog.cc:76
+#: time_fx_dialog.cc:86
 msgid "Time Stretch Audio"
 msgstr "Protáhnutí času zvuku"
 
-#: time_fx_dialog.cc:104 transpose_dialog.cc:41
+#: time_fx_dialog.cc:114 transpose_dialog.cc:41
 msgid "Octaves:"
 msgstr "Oktávy:"
 
-#: time_fx_dialog.cc:109 transpose_dialog.cc:46
+#: time_fx_dialog.cc:119 transpose_dialog.cc:46
 msgid "Semitones:"
 msgstr "Půltóny:"
 
-#: time_fx_dialog.cc:114
+#: time_fx_dialog.cc:124
 msgid "Cents:"
 msgstr "Centy:"
 
-#: time_fx_dialog.cc:122
+#: time_fx_dialog.cc:132
 msgid "Time|Shift"
 msgstr "ÄŒas|Posun"
 
-#: time_fx_dialog.cc:146 time_fx_dialog.cc:149
+#: time_fx_dialog.cc:184 time_fx_dialog.cc:188
 msgid "TimeFXButton"
 msgstr "Tlačítko TimeFX"
 
-#: time_fx_dialog.cc:154
+#: time_fx_dialog.cc:193
 msgid "Stretch/Shrink"
 msgstr "Protáhnout/Zmenšit"
 
-#: time_fx_dialog.cc:164
+#: time_fx_dialog.cc:203
 msgid "<b>Progress</b>"
 msgstr "<b>Postup</b>"
 
-#: time_info_box.cc:124
+#: time_info_box.cc:118
 msgid "Start recording at auto-punch start"
 msgstr "Začít s nahráváním na začátku oblasti přepsání"
 
-#: time_info_box.cc:125
+#: time_info_box.cc:119
 msgid "Stop recording at auto-punch end"
 msgstr "Zastavit nahrávání na konci oblasti přepsání"
 
@@ -13898,108 +14903,140 @@ msgstr "Převést MIDI"
 msgid "Transpose"
 msgstr "Převést"
 
-#: ui_config.cc:230 ui_config.cc:368
+#: ui_config.cc:233 ui_config.cc:416
 msgid "Loading default ui configuration file %1"
 msgstr "Nahrává se soubor s nastavením výchozího uživatelského rozhraní %1"
 
-#: ui_config.cc:233 ui_config.cc:371
+#: ui_config.cc:236 ui_config.cc:419
 msgid "cannot read default ui configuration file \"%1\""
 msgstr ""
 "Nelze přečíst soubor s nastavením výchozího uživatelského rozhraní \"%1\""
 
-#: ui_config.cc:236 ui_config.cc:376
+#: ui_config.cc:239 ui_config.cc:424
 msgid "default ui configuration file \"%1\" not loaded successfully."
 msgstr ""
 "Soubor s nastavením výchozího uživatelského rozhraní \"%1\" nemohl být "
 "nahrán."
 
-#: ui_config.cc:244
+#: ui_config.cc:247
 msgid "Could not find default UI configuration file %1"
 msgstr "Nepodařilo se najít výchozí soubor s nastavením rozhraní %1"
 
-#: ui_config.cc:287
+#: ui_config.cc:330
+msgid "Color file for %1 not found along %2"
+msgstr ""
+
+#: ui_config.cc:337
 msgid "Loading color file %1"
 msgstr "Nahrává se soubor s barvou '%1"
 
-#: ui_config.cc:290
+#: ui_config.cc:340
 msgid "cannot read color file \"%1\""
 msgstr "Nelze přečíst soubor s barvou \"%1\""
 
-#: ui_config.cc:295
+#: ui_config.cc:345
 msgid "color file \"%1\" not loaded successfully."
 msgstr "Soubor s barvou \"%1\" se nepodařilo nahrát."
 
-#: ui_config.cc:301
-msgid "Color file %1 not found"
-msgstr "Soubor s barvou \"%1\" nebyl nalezen"
-
-#: ui_config.cc:350 ui_config.cc:429
+#: ui_config.cc:397 ui_config.cc:480
 msgid "Color file %1 not saved"
 msgstr "Soubor s barvou \"%1\" nebyl neuložen"
 
-#: ui_config.cc:385
+#: ui_config.cc:433
 msgid "Loading user ui configuration file %1"
 msgstr "Nahrává se soubor s nastavením výchozího uživatelského rozhraní %1"
 
-#: ui_config.cc:388
+#: ui_config.cc:436
 msgid "cannot read ui configuration file \"%1\""
 msgstr ""
 "Nelze přečíst soubor s nastavením výchozího uživatelského rozhraní \"%1\""
 
-#: ui_config.cc:393
+#: ui_config.cc:441
 msgid "user ui configuration file \"%1\" not loaded successfully."
 msgstr ""
 "Soubor s nastavením výchozího uživatelského rozhraní \"%1\" nemohl být "
 "nahrán."
 
-#: ui_config.cc:401
+#: ui_config.cc:449
 msgid "could not find any ui configuration file, canvas will look broken."
 msgstr ""
 "Nepodařilo se najít žádný soubor s nastavením výchozího uživatelského "
 "rozhraní, plátno bude vypadat rozbitě."
 
-#: ui_config.cc:419
+#: ui_config.cc:470
 msgid "Config file %1 not saved"
 msgstr "Soubor s nastavením %1 nebyl uložen"
 
-#: ui_config.cc:660
+#: ui_config.cc:715
 msgid "Color %1 not found"
 msgstr "Barva %1 nenalezena"
 
-#: ui_config.cc:730
+#: ui_config.cc:785
 msgid "Unable to find UI style file %1 in search path %2. %3 will look strange"
 msgstr ""
 "Soubor se stylem uživatelského rozhraní %1 nelze ve vyhledávací cestě najít "
 "%2. %3 bude vypadat divnÄ›."
 
-#: utils.cc:114 utils.cc:157
+#: utils.cc:118 utils.cc:161
 msgid "bad XPM header %1"
 msgstr "Chybná XPM hlavička %1"
 
-#: utils.cc:574
+#: utils.cc:424
 msgid "cannot find XPM file for %1"
 msgstr "Nelze najít soubor XPM pro %1"
 
-#: utils.cc:594 utils.cc:624 utils.cc:638
+#: utils.cc:477 utils.cc:507 utils.cc:527
 msgid "default"
 msgstr "Výchozí"
 
-#: utils.cc:639
+#: utils.cc:528
 msgid "icon \"%1\" not found for icon set \"%2\", fallback to default"
 msgstr "Ikona \"%1\" nenalezena pro sadu ikon \"%2\", návrat na výchozí"
 
-#: utils.cc:646
+#: utils.cc:535
 msgid "cannot find icon image for %1 using %2"
 msgstr "Nelze najít obrázek s ikonou pro %1 pomocí %2"
 
-#: utils.cc:663 utils.cc:679
+#: utils.cc:552 utils.cc:568
 msgid "Caught exception while loading icon named %1"
 msgstr "během nahrávání ikony s názvem %1 byla zachycena výjimka"
 
-#: utils.cc:939
+#: utils.cc:818
 msgid "Overwrite"
 msgstr "Přepsat"
 
+#: vca_master_strip.cc:74 vca_time_axis.cc:49
+msgid "Solo slaves"
+msgstr ""
+
+#: vca_master_strip.cc:79 vca_time_axis.cc:55
+msgid "Mute slaves"
+msgstr ""
+
+#: vca_master_strip.cc:83
+msgid "Hide this VCA strip"
+msgstr ""
+
+#: vca_master_strip.cc:108 vca_master_strip.cc:418
+msgid "Click to show slaves only"
+msgstr ""
+
+#: vca_master_strip.cc:293
+msgid "A"
+msgstr "Č"
+
+#: vca_master_strip.cc:300
+msgid "S"
+msgstr "S"
+
+#: vca_master_strip.cc:398
+msgid "Drop All Slaves"
+msgstr ""
+
+#: vca_master_strip.cc:421
+msgid "Click to show normal mixer"
+msgstr ""
+
 #: add_video_dialog.cc:54
 msgid "Set Video Track"
 msgstr "Nastavit stopu s obrazovým záznamem"
@@ -14046,6 +15083,22 @@ msgstr "Rejstřík videoserveru"
 msgid " %1 fps"
 msgstr " %1 FPS"
 
+#: vca_time_axis.cc:60
+msgid "D"
+msgstr "D"
+
+#: vca_time_axis.cc:61
+msgid "Unassign all slaves"
+msgstr ""
+
+#: vca_time_axis.cc:65
+msgid "V"
+msgstr "V"
+
+#: vca_time_axis.cc:66
+msgid "Show only slaves"
+msgstr ""
+
 #: video_timeline.cc:472
 msgid ""
 "Parsing video file info failed. Is the Video Server running? Is the file "
@@ -14101,7 +15154,7 @@ msgstr ""
 msgid "Video-monitor 'xjadeo' cannot be launched."
 msgstr "Program pro sledování obrazu 'xjadeo' nelze spustit"
 
-#: video_timeline.cc:770
+#: video_timeline.cc:775
 msgid ""
 "Video-monitor 'xjadeo' is too old. Please install xjadeo version 0.7.7 or "
 "later. http://xjadeo.sf.net/"
@@ -14109,7 +15162,7 @@ msgstr ""
 "Program pro sledování obrazu 'xjadeo' je příliš starý. Nainstalujte, prosím, "
 "xjadeo ve verzi 0.7.7 nebo novější. http://xjadeo.sf.net/"
 
-#: video_monitor.cc:285
+#: video_monitor.cc:283
 msgid "Video Monitor: File Not Found."
 msgstr "Sledování obrazového záznamu: Soubor nenalezen."
 
@@ -14168,8 +15221,8 @@ msgid ""
 "ffmpeg installation was not found. Video Import is not possible. See the Log "
 "window for more information."
 msgstr ""
-"V tomto systému se nepodařilo najít žádnou instalaci ffmpeg. "
-"Zavádění obrazových záznamů není, dokud tyto nástroje nenainstalujete, možné. "
+"V tomto systému se nepodařilo najít žádnou instalaci ffmpeg. Zavádění "
+"obrazových záznamů není, dokud tyto nástroje nenainstalujete, možné. "
 "Podívejte se na okno se zápisem na další informace."
 
 #: transcode_video_dialog.cc:120
@@ -14184,10 +15237,6 @@ msgstr ""
 msgid "FPS:"
 msgstr "Snímků za sekundu (FPS):"
 
-#: transcode_video_dialog.cc:139
-msgid "Duration:"
-msgstr "Doba trvání"
-
 #: transcode_video_dialog.cc:141
 msgid "Codec:"
 msgstr "Kodek:"
@@ -14405,8 +15454,8 @@ msgid ""
 "ffmpeg installation was not found. Video Export is not possible. See the Log "
 "window for more information."
 msgstr ""
-"V tomto systému se nepodařilo najít žádnou instalaci ffmpeg. "
-"Vyvádění obrazových záznamů není, dokud tyto nástroje nenainstalujete, možné. "
+"V tomto systému se nepodařilo najít žádnou instalaci ffmpeg. Vyvádění "
+"obrazových záznamů není, dokud tyto nástroje nenainstalujete, možné. "
 "Podívejte se na okno se zápisem na další informace."
 
 #: export_video_dialog.cc:126
@@ -14458,16 +15507,16 @@ msgid "Audio Samplerate:"
 msgstr "Vzorkovací kmitočet zvuku:"
 
 #: export_video_dialog.cc:215 export_video_dialog.cc:223
-#: export_video_dialog.cc:801 export_video_dialog.cc:804
+#: export_video_dialog.cc:814 export_video_dialog.cc:817
 msgid "(default for format)"
 msgstr "(výchozí pro formát)"
 
 #: export_video_dialog.cc:233 export_video_dialog.cc:244
-#: export_video_dialog.cc:808 export_video_dialog.cc:817
+#: export_video_dialog.cc:821 export_video_dialog.cc:830
 msgid "(default)"
 msgstr "(výchozí)"
 
-#: export_video_dialog.cc:245 export_video_dialog.cc:811
+#: export_video_dialog.cc:245 export_video_dialog.cc:824
 msgid "(retain)"
 msgstr "(zachovat)"
 
@@ -14483,19 +15532,19 @@ msgstr "od začátku obrazového záznamu po konec obrazového záznamu"
 msgid "Selected range"
 msgstr "Vybraný rozsah"
 
-#: export_video_dialog.cc:560
+#: export_video_dialog.cc:561
 msgid "Normalizing audio"
 msgstr "Normalizovámí zvuku"
 
-#: export_video_dialog.cc:564
+#: export_video_dialog.cc:566 export_video_dialog.cc:571
 msgid "Exporting audio"
 msgstr "Vyvádění zvuku"
 
-#: export_video_dialog.cc:619
+#: export_video_dialog.cc:632
 msgid "Exporting Audio..."
 msgstr "Vyvádí se zvuk..."
 
-#: export_video_dialog.cc:676
+#: export_video_dialog.cc:689
 msgid ""
 "Export Video: Cannot query duration of video-file, using duration from "
 "timeline instead."
@@ -14503,39 +15552,39 @@ msgstr ""
 "Vyvedení obrazového záznamu: Nelze se dotázat na dobu trvání souboru s "
 "obrazovým záznamem. Místo toho se používá doba trvání z časové osy"
 
-#: export_video_dialog.cc:706
+#: export_video_dialog.cc:719
 msgid "Export Video: export-range does not include video."
 msgstr "Vyvést obrazový záznam: Rozsah k vyvedení nezahrnuje obrazový záznam."
 
-#: export_video_dialog.cc:719
+#: export_video_dialog.cc:732
 msgid "Export Video: No Master Out Ports to Connect for Audio Export"
 msgstr ""
 "Vyvedení obrazového záznamu: Žádné hlavní výstupní přípojky k připojení pro "
 "vyvedení zvuku"
 
-#: export_video_dialog.cc:761
+#: export_video_dialog.cc:774
 msgid "Encoding Video..."
 msgstr "Kóduje se obrazový záznam..."
 
-#: export_video_dialog.cc:781
+#: export_video_dialog.cc:794
 msgid "Export Video: Video input file cannot be read."
 msgstr ""
 "Vyvedení obrazového záznamu: Vstupní soubor s obrazovým záznamem nelze "
 "přečíst."
 
-#: export_video_dialog.cc:887
+#: export_video_dialog.cc:900
 msgid "Encoding Video.. Pass 1/2"
 msgstr "Překódovává se obrazový záznam... Průchod 1/2"
 
-#: export_video_dialog.cc:899
+#: export_video_dialog.cc:912
 msgid "Encoding Video.. Pass 2/2"
 msgstr "Překódovává se obrazový záznam... Průchod 2/2"
 
-#: export_video_dialog.cc:1002
+#: export_video_dialog.cc:1015
 msgid "Transcoding failed."
 msgstr "Překódování se nezdařilo."
 
-#: export_video_dialog.cc:1238 export_video_dialog.cc:1258
+#: export_video_dialog.cc:1251 export_video_dialog.cc:1271
 msgid "Save Exported Video File"
 msgstr "Uložit vyvedený soubor s obrazovým záznamem"
 
@@ -14567,6 +15616,259 @@ msgstr ""
 
 #~ msgid ""
 #~ "%1%2\n"
+#~ "(built from revision %3)\n"
+#~ "%4"
+#~ msgstr ""
+#~ "%1%2\n"
+#~ "(Sestaveno na základě revize %3)%4"
+
+#~ msgid "Busses"
+#~ msgstr "Sběrnice"
+
+#~ msgid "Display model"
+#~ msgstr "Typ zobrazení"
+
+#~ msgid "Composite graphs for each track"
+#~ msgstr "Sloučené grafy pro každou stopu"
+
+#~ msgid "Composite graph of all tracks"
+#~ msgstr "Sloučený grafy všech stop"
+
+#~ msgid "Normalize values"
+#~ msgstr "Normalizovat hodnoty"
+
+#~ msgid "Locations"
+#~ msgstr "Místa"
+
+#~ msgid "Save as..."
+#~ msgstr "Uložit jako..."
+
+#~ msgid ""
+#~ "%4This is a session from an older version of %3%5\n"
+#~ "\n"
+#~ "%3 has copied the old session file\n"
+#~ "\n"
+#~ "%6%1%7\n"
+#~ "\n"
+#~ "to\n"
+#~ "\n"
+#~ "%6%2%7\n"
+#~ "\n"
+#~ "From now on, use the -2000 version with older versions of %3"
+#~ msgstr ""
+#~ "%4 Toto je sezení ze starší verze %3%5\n"
+#~ "\n"
+#~ "%3 zkopíroval soubor se starým sezením\n"
+#~ "\n"
+#~ "%6%1%7\n"
+#~ "\n"
+#~ "do\n"
+#~ "\n"
+#~ "%6%2%7\n"
+#~ "\n"
+#~ "Od nynějška používejte verzi -2000 staršími verzemif %3"
+
+#~ msgid "This screen is not tall enough to display the mixer window"
+#~ msgstr ""
+#~ "Tato obrazovka není dostatečně velká na to, aby zobrazila okno směšovače"
+
+#~ msgid "Open Video"
+#~ msgstr "Otevřít obrazový záznam"
+
+#~ msgid "Export to Video File"
+#~ msgstr "Vyvést jako soubor s obrazovým záznamem"
+
+#~ msgid "Show Toolbars"
+#~ msgstr "Ukázat nástrojové panely"
+
+#~ msgid "Toggle Editor+Mixer"
+#~ msgstr "Přepnout editor a směšovač"
+
+#~ msgid "Reattach All Tearoffs"
+#~ msgstr "Připojit znovu všechna odtržení"
+
+#~ msgid "Break drag or deselect all"
+#~ msgstr "Přerušit tažení nebo odznačit vše"
+
+#~ msgid "Show Logo"
+#~ msgstr "Ukázat logo"
+
+#~ msgid "Loaded editor bindings from %1"
+#~ msgstr "Nahrané vazby editoru z %1"
+
+#~ msgid "Could not find editor.bindings in search path %1"
+#~ msgstr "V prohledávané cestě %1 se editor.bindings nalézt nepodařilo"
+
+#~ msgid "duplicate selection"
+#~ msgstr "Zdvojit výběr"
+
+#~ msgid "cut time"
+#~ msgstr "Vyjmout čas"
+
+#~ msgid "<i>Build filename(s) from these components:</i>"
+#~ msgstr "<i>Názvy souborů sestavit z těchto součástí:</i>"
+
+#~ msgid "<small><i>Current (approximate) filename: \"%1\"</i></small>"
+#~ msgstr "<small><i>Nynější (přibližný) název souboru: \"%1\"</i></small>"
+
+#~ msgid ""
+#~ "Command to run post-export\n"
+#~ "(%f=full path & filename, %d=directory, %b=basename):"
+#~ msgstr ""
+#~ "Příkaz, který se má provést po vyvedení\n"
+#~ "(%f=full path & filename, %d=directory, %b=basename):"
+
+#~ msgid "Create New Group From"
+#~ msgstr "Vytvořit novou skupinu z"
+
+#~ msgid "Select an action, then press the key(s) to (re)set its shortcut"
+#~ msgstr ""
+#~ "Vyberte nějaký krok a následně stiskněte klávesu(y) \n"
+#~ "kvůli (pře)nastavení klávesové zkratky"
+
+#~ msgid "Main_menu"
+#~ msgstr "Hlavní nabídka"
+
+#~ msgid "redirectmenu"
+#~ msgstr "Přesměrování nabídky"
+
+#~ msgid "Editor_menus"
+#~ msgstr "Editor nabídek"
+
+#~ msgid "ProcessorMenu"
+#~ msgstr "Nabídka zpracování"
+
+#~ msgid "Program "
+#~ msgstr "Program "
+
+#~ msgid "Loaded mixer bindings from %1"
+#~ msgstr "Nahrané vazby směšovače z %1"
+
+#~ msgid "Could not find mixer.bindings in search path %1"
+#~ msgstr "V prohledávané cestě %1 se nepodařilo nalézt vazby směšovače"
+
+#~ msgid "*Comments*"
+#~ msgstr "*Poznámky*"
+
+#~ msgid "*Cmt*"
+#~ msgstr "*Pozn*"
+
+#~ msgid "Remote Control ID..."
+#~ msgstr "ID dálkového ovládání..."
+
+#~ msgid "Allow to add monitor effect processors"
+#~ msgstr "Povolit přidání zpracovatele efektů sledování"
+
+#~ msgid ""
+#~ "It is not possible to add a port here, as the first processor in the "
+#~ "track or buss cannot support the new configuration."
+#~ msgstr ""
+#~ "Přípojku zde nelze přidat, protože první procesor ve stopě nebo sběrnici "
+#~ "nedokáže podporovat nové nastavení."
+
+#~ msgid ""
+#~ "This port cannot be removed.\n"
+#~ "Either the first plugin in the track or buss cannot accept\n"
+#~ "the new number of inputs or the last plugin has more outputs."
+#~ msgstr ""
+#~ "Tuto přípojku nelze odstranit, protože\n"
+#~ "první přídavný modul ve stopě nebo\n"
+#~ "sběrnici nemůže přijmout nový počet vstupů,\n"
+#~ "nebo má poslední přídavný modul více výstupů."
+
+#~ msgid "Sync/Slave"
+#~ msgstr "Sync/Slave"
+
+#~ msgid "Solo / mute"
+#~ msgstr "Sólo/Ztlumit"
+
+#~ msgid "Control surface remote ID"
+#~ msgstr "Vzdálené ID pro ovládací prvky"
+
+#~ msgid "assigned by user"
+#~ msgstr "určeno uživatelem"
+
+#~ msgid "follows order of mixer"
+#~ msgstr "následuje pořadí ve směšovači"
+
+#~ msgid "Trigger gap"
+#~ msgstr "Mezera spuštění (ms)"
+
+#~ msgid "Align with Existing Material"
+#~ msgstr "Zarovnat se stávajícím materiálem"
+
+#~ msgid "Align with Capture Time"
+#~ msgstr "Zarovnat s časem nahrávky"
+
+#~ msgid "You cannot create a track with that name as it is reserved for %1"
+#~ msgstr "Nemůžete vytvořit stopu s tímto názvem, protože je zamluvený pro %1"
+
+#~ msgid "Remote Control ID"
+#~ msgstr "ID dálkového ovládání"
+
+#~ msgid "Remote control ID:"
+#~ msgstr "ID dálkového ovládání:"
+
+#~ msgid ""
+#~ "The remote control ID of %1 is: %2\n"
+#~ "\n"
+#~ "\n"
+#~ "The remote control ID of %3 cannot be changed."
+#~ msgstr ""
+#~ "ID dálkového ovládání %1 je: %2\n"
+#~ "\n"
+#~ "\n"
+#~ "ID dálkového ovládání %3 nelze změnit."
+
+#~ msgid "the master bus"
+#~ msgstr "Hlavní sběrnice"
+
+#~ msgid "the monitor bus"
+#~ msgstr "Sledovací sběrnice"
+
+#~ msgid ""
+#~ "The remote control ID of %5 is: %2\n"
+#~ "\n"
+#~ "\n"
+#~ "Remote Control IDs are currently determined by track/bus ordering in %6.\n"
+#~ "\n"
+#~ "%3Use the User Interaction tab of the Preferences window if you want to "
+#~ "change this%4"
+#~ msgstr ""
+#~ "ID dálkového ovládání %5 je: %2\n"
+#~ "\n"
+#~ "\n"
+#~ "ID dálkového ovládání jsou v současnosti určeny pořadím stopy/sběrnice v "
+#~ "%6\n"
+#~ "\n"
+#~ "\n"
+#~ "%3Použijte kartu Uživatelská interakce v okně pro nastavení, pokud to "
+#~ "chcete změnit%4"
+
+#~ msgid ""
+#~ "Left-click to invert (phase reverse) channel %1 of this track.  Right-"
+#~ "click to show menu."
+#~ msgstr ""
+#~ "Klepnutí levým tlačítkem myši pro obrácení (otočení fáze) kanálu %1 této "
+#~ "stopy. Klepnutí pravým tlačítkem myši pro ukázání nabídky."
+
+#~ msgid "Click to show a menu of channels for inversion (phase reverse)"
+#~ msgstr "Klepněte pro ukázání kanálů pro obrácení (otočení fáze)"
+
+#~ msgid "Dark Theme"
+#~ msgstr "Tmavý motiv"
+
+#~ msgid "Light Theme"
+#~ msgstr "Světlý motiv"
+
+#~ msgid "Contents:"
+#~ msgstr "Obsah:"
+
+#~ msgid "Color file %1 not found"
+#~ msgstr "Soubor s barvou \"%1\" nebyl nalezen"
+
+#~ msgid ""
+#~ "%1%2\n"
 #~ "(built from revision %3)"
 #~ msgstr ""
 #~ "%1%2\n"
@@ -14683,9 +15985,6 @@ msgstr ""
 #~ msgid "Insert Region From Region List"
 #~ msgstr "Vložit oblast ze seznamu oblastí"
 
-#~ msgid "V"
-#~ msgstr "V"
-
 #~ msgid "group|G"
 #~ msgstr "Skupina|Sk"
 
@@ -14731,18 +16030,12 @@ msgstr ""
 #~ msgid "O"
 #~ msgstr "Nep"
 
-#~ msgid "A"
-#~ msgstr "Č"
-
 #~ msgid "I"
 #~ msgstr "Vst"
 
 #~ msgid "R"
 #~ msgstr "N"
 
-#~ msgid "S"
-#~ msgstr "S"
-
 #~ msgid "SI"
 #~ msgstr "SamS"
 
@@ -14789,12 +16082,6 @@ msgstr ""
 #~ msgid "C"
 #~ msgstr "C"
 
-#~ msgid "D"
-#~ msgstr "D"
-
-#~ msgid "Peak"
-#~ msgstr "Vrchol"
-
 #~ msgid "K20"
 #~ msgstr "K20"
 
@@ -14924,12 +16211,6 @@ msgstr ""
 #~ msgid "fastest [70dB/sec]"
 #~ msgstr "Nejrychlejší [70 dB/s]"
 
-#~ msgid "Align With Existing Material"
-#~ msgstr "Zarovnat se stávajícím materiálem"
-
-#~ msgid "Align With Capture Time"
-#~ msgstr "Zarovnat s časem nahrávky"
-
 #~ msgid "Select From All..."
 #~ msgstr "Vybrat ze všeho..."
 
@@ -16130,9 +17411,6 @@ msgstr ""
 #~ msgid "80"
 #~ msgstr "80"
 
-#~ msgid "100"
-#~ msgstr "100"
-
 #~ msgid "gTortnam"
 #~ msgstr "gTortnam"
 
@@ -16317,9 +17595,6 @@ msgstr ""
 #~ msgid "Toolbars when Maximised"
 #~ msgstr "Nástrojové pruhy při zvětšení"
 
-#~ msgid "Mixer"
-#~ msgstr "Směšovač"
-
 #~ msgid "Show All Crossfades"
 #~ msgstr "Ukázat všechna prolínání"
 
diff --git a/gtk2_ardour/po/de.mo b/gtk2_ardour/po/de.mo
new file mode 100644
index 0000000..d6071f9
Binary files /dev/null and b/gtk2_ardour/po/de.mo differ
diff --git a/gtk2_ardour/po/de.po b/gtk2_ardour/po/de.po
index eb333b0..1239503 100644
--- a/gtk2_ardour/po/de.po
+++ b/gtk2_ardour/po/de.po
@@ -4,290 +4,306 @@
 #
 #
 # Karsten Petersen <kapet at kapet.de>, 2003.
-# Edgar Aichinger <edgar.aichinger at aon.at>, 2008, 2012, 2013, 2014, 2015.
+# Edgar Aichinger <edgar.aichinger at aon.at>, 2008, 2012, 2013, 2014, 2015, 2016.
 # Benjamin Scherrer <benjamin at wagnerbrutal.de>, 2015.
 msgid ""
 msgstr ""
 "Project-Id-Version: gtk-ardour 0.347.2\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-12-23 09:42+0100\n"
-"PO-Revision-Date: 2015-12-23 12:23+0100\n"
-"Last-Translator: Edgar Aichinger <edogawa at aon.at>\n"
+"POT-Creation-Date: 2016-08-06 14:10+0200\n"
+"PO-Revision-Date: 2016-08-06 15:26+0100\n"
+"Last-Translator: Edgar Aichinger <edgar.aichinger at aon.at>\n"
 "Language-Team: German <ardour-dev at lists.ardour.org>\n"
 "Language: de\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-Generator: Lokalize 1.5\n"
+"X-Generator: Lokalize 2.0\n"
 "X-Poedit-Basepath: ../../\n"
 "X-Poedit-SearchPath-0: gtk2_ardour\n"
 
 #: about.cc:127
+msgid "Fons Adriaensen"
+msgstr "Fons Adriaensen"
+
+#: about.cc:128
 msgid "Brian Ahr"
 msgstr "Brian Ahr"
 
-#: about.cc:128
+#: about.cc:129
 msgid "John Anderson"
 msgstr "John Anderson"
 
-#: about.cc:129
+#: about.cc:130
 msgid "Marcus Andersson"
 msgstr "Marcus Andersson"
 
-#: about.cc:130
+#: about.cc:131
 msgid "Nedko Arnaudov"
 msgstr "Nedko Arnaudov"
 
-#: about.cc:131
+#: about.cc:132
 msgid "Hans Baier"
 msgstr "Hans Baier"
 
-#: about.cc:132
+#: about.cc:133
 msgid "Ben Bell"
 msgstr "Ben Bell"
 
-#: about.cc:133
+#: about.cc:134
 msgid "Sakari Bergen"
 msgstr "Sakari Bergen"
 
-#: about.cc:134
+#: about.cc:135
 msgid "Christian Borss"
 msgstr "Christian Borss"
 
-#: about.cc:135
+#: about.cc:136
 msgid "Chris Cannam"
 msgstr "Chris Cannam"
 
-#: about.cc:136
+#: about.cc:137
 msgid "Jeremy Carter"
 msgstr "Jeremy Carter"
 
-#: about.cc:137
+#: about.cc:138
 msgid "Jesse Chappell"
 msgstr "Jesse Chappell"
 
-#: about.cc:138
+#: about.cc:139
 msgid "Thomas Charbonnel"
 msgstr "Thomas Charbonnel"
 
-#: about.cc:139
+#: about.cc:140
 msgid "Sam Chessman"
 msgstr "Sam Chessman"
 
-#: about.cc:140
+#: about.cc:141
 msgid "André Colomb"
 msgstr "André Colomb"
 
-#: about.cc:141
+#: about.cc:142
 msgid "Paul Davis"
 msgstr "Paul Davis"
 
-#: about.cc:142
+#: about.cc:143
 msgid "Gerard van Dongen"
 msgstr "Gerard van Dongen"
 
-#: about.cc:143
+#: about.cc:144
 msgid "John Emmas"
 msgstr "John Emmas"
 
-#: about.cc:144
+#: about.cc:145
 msgid "Colin Fletcher"
 msgstr "Colin Fletcher"
 
-#: about.cc:145
+#: about.cc:146
 msgid "Dave Flick"
 msgstr "Dave Flick"
 
-#: about.cc:146
+#: about.cc:147
 msgid "Hans Fugal"
 msgstr "Hans Fugal"
 
-#: about.cc:147
+#: about.cc:148
 msgid "Robin Gareus"
 msgstr "Robin Gareus"
 
-#: about.cc:148
+#: about.cc:149
 msgid "Nil Geisweiller"
 msgstr "Nil Geisweiller"
 
-#: about.cc:149
+#: about.cc:150
 msgid "Christopher George"
 msgstr "Christopher George"
 
-#: about.cc:150
+#: about.cc:151
 msgid "Chris Goddard"
 msgstr "Chris Goddard"
 
-#: about.cc:151
+#: about.cc:152
 msgid "J. Abelardo Gutierrez"
 msgstr "J. Abelardo Gutierrez"
 
-#: about.cc:152
+#: about.cc:153
 msgid "Jeremy Hall"
 msgstr "Jeremy Hall"
 
-#: about.cc:153
+#: about.cc:154
 msgid "Audun Halland"
 msgstr "Audun Halland"
 
-#: about.cc:154
+#: about.cc:155
 msgid "David Halter"
 msgstr "David Halter"
 
-#: about.cc:155
+#: about.cc:156
 msgid "Steve Harris"
 msgstr "Steve Harris"
 
-#: about.cc:156
+#: about.cc:157
 msgid "Melvin Ray Herr"
 msgstr "Melvin Ray Herr"
 
-#: about.cc:157
+#: about.cc:158
 msgid "Carl Hetherington"
 msgstr "Carl Hetherington"
 
-#: about.cc:158
+#: about.cc:159
 msgid "Rob Holland"
 msgstr "Rob Holland"
 
-#: about.cc:159
+#: about.cc:160
 msgid "Robert Jordens"
 msgstr "Robert Jordens"
 
-#: about.cc:160
+#: about.cc:161
 msgid "Stefan Kersten"
 msgstr "Stefan Kersten"
 
-#: about.cc:161
+#: about.cc:162
 msgid "Armand Klenk"
 msgstr "Armand Klenk"
 
-#: about.cc:162
+#: about.cc:163
 msgid "Julien de Kozak"
 msgstr "Julien de Kozak"
 
-#: about.cc:163
+#: about.cc:164
 msgid "Matt Krai"
 msgstr "Matt Krai"
 
-#: about.cc:164
+#: about.cc:165
 msgid "Georg Krause"
 msgstr "Georg Krause"
 
-#: about.cc:165
+#: about.cc:166
 msgid "Nick Lanham"
 msgstr "Nick Lanham"
 
-#: about.cc:166
+#: about.cc:167
 msgid "Colin Law"
 msgstr "Colin Law"
 
-#: about.cc:167
+#: about.cc:168
 msgid "Joshua Leach"
 msgstr "Joshua Leach"
 
-#: about.cc:168
+#: about.cc:169
 msgid "Ben Loftis"
 msgstr "Ben Loftis"
 
-#: about.cc:169
+#: about.cc:170
 msgid "Nick Mainsbridge"
 msgstr "Nick Mainsbridge"
 
-#: about.cc:170
+#: about.cc:171
 msgid "Tim Mayberry"
 msgstr "Tim Mayberry"
 
-#: about.cc:171
+#: about.cc:172
 msgid "Doug Mclain"
 msgstr "Doug Mclain"
 
-#: about.cc:172
+#: about.cc:173
 msgid "Todd Naugle"
 msgstr "Todd Naugle"
 
-#: about.cc:173
+#: about.cc:174
 msgid "André Nusser"
 msgstr "André Nusser"
 
-#: about.cc:174
+#: about.cc:175
 msgid "Bent Bisballe Nyeng"
 msgstr "Bent Bisballe Nyeng"
 
-#: about.cc:175
+#: about.cc:176
 msgid "Jack O'Quin"
 msgstr "Jack O'Quin"
 
-#: about.cc:176
+#: about.cc:177
+msgid "Pavel Potocek"
+msgstr "Pavel Potocek"
+
+#: about.cc:178
 msgid "Nimal Ratnayake"
 msgstr "Nimal Ratnayake"
 
-#: about.cc:177
+#: about.cc:179
+msgid "Julien Rivaud"
+msgstr "Julien Rivaud"
+
+#: about.cc:180
 msgid "David Robillard"
 msgstr "David Robillard"
 
-#: about.cc:178
+#: about.cc:181
+msgid "Julien Roger"
+msgstr "Julien Roger"
+
+#: about.cc:182
 msgid "Taybin Rutkin"
 msgstr "Taybin Rutkin"
 
-#: about.cc:179
+#: about.cc:183
 msgid "Andreas Ruge"
 msgstr "Andreas Ruge"
 
-#: about.cc:180
+#: about.cc:184
 msgid "Sampo Savolainen"
 msgstr "Sampo Savolainen"
 
-#: about.cc:181
+#: about.cc:185
 msgid "Rodrigo Severo"
 msgstr "Rodrigo Severo"
 
-#: about.cc:182
+#: about.cc:186
 msgid "Per Sigmond"
 msgstr "Per Sigmond"
 
-#: about.cc:183
+#: about.cc:187
 msgid "Lincoln Spiteri"
 msgstr "Lincoln Spiteri"
 
-#: about.cc:184
+#: about.cc:188
 msgid "Mike Start"
 msgstr "Mike Start"
 
-#: about.cc:185
+#: about.cc:189
 msgid "Mark Stewart"
 msgstr "Mark Stewart"
 
-#: about.cc:186
+#: about.cc:190
 msgid "Roland Stigge"
 msgstr "Roland Stigge"
 
-#: about.cc:187
+#: about.cc:191
 msgid "Petter Sundlöf"
 msgstr "Petter Sundlöf"
 
-#: about.cc:188
+#: about.cc:192
 msgid "Mike Täht"
 msgstr "Mike Täht"
 
-#: about.cc:189
+#: about.cc:193
 msgid "Roy Vegard"
 msgstr "Roy Vegard"
 
-#: about.cc:190
+#: about.cc:194
 msgid "Thorsten Wilms"
 msgstr "Thorsten Wilms"
 
-#: about.cc:191
+#: about.cc:195
 msgid "Damien Zammit"
 msgstr "Damien Zammit"
 
-#: about.cc:192
+#: about.cc:196
 msgid "Grygorii Zharun"
 msgstr "Grygorii Zharun"
 
-#: about.cc:197
+#: about.cc:201
 msgid ""
 "French:\n"
 "\tAlain Fréhel <alain.frehel at free.fr>\n"
@@ -301,7 +317,7 @@ msgstr ""
 "\tMartin Blanchard\n"
 "\tRomain Arnaud <roming22 at gmail.com>\n"
 
-#: about.cc:198
+#: about.cc:202
 msgid ""
 "German:\n"
 "\tKarsten Petersen <kapet at kapet.de>\n"
@@ -321,7 +337,7 @@ msgstr ""
 "\tRichard Oax <richard at pagliacciempire.de>\n"
 "\tRobin Gloster <robin at loc-com.de>\n"
 
-#: about.cc:205
+#: about.cc:209
 msgid ""
 "Italian:\n"
 "\tFilippo Pappalardo <filippo at email.it>\n"
@@ -331,7 +347,7 @@ msgstr ""
 "\tFilippo Pappalardo <filippo at email.it>\n"
 "\tRaffaele Morelli <raffaele.morelli at gmail.com>\n"
 
-#: about.cc:206
+#: about.cc:210
 msgid ""
 "Portuguese:\n"
 "\tRui Nuno Capela <rncbc at rncbc.org>\n"
@@ -339,7 +355,7 @@ msgstr ""
 "Portugiesisch:\n"
 "\tRui Nuno Capela <rncbc at rncbc.org>\n"
 
-#: about.cc:207
+#: about.cc:211
 msgid ""
 "Brazilian Portuguese:\n"
 "\tAlexander da Franca Fernandes <alexander at nautae.eti.br>\n"
@@ -349,7 +365,7 @@ msgstr ""
 "\tAlexander da Franca Fernandes <alexander at nautae.eti.br>\n"
 "\tChris Ross <chris at tebibyte.org>\n"
 
-#: about.cc:209
+#: about.cc:213
 msgid ""
 "Spanish:\n"
 "\t Alex Krohn <alexkrohn at fastmail.fm>\n"
@@ -359,7 +375,7 @@ msgstr ""
 "\t Alex Krohn <alexkrohn at fastmail.fm>\n"
 "\tPablo Fernández <pablo.fbus at gmail.com>\n"
 
-#: about.cc:210
+#: about.cc:214
 msgid ""
 "Russian:\n"
 "\t Igor Blinov <pitstop at nm.ru>\n"
@@ -369,7 +385,7 @@ msgstr ""
 "\t Igor Blinov <pitstop at nm.ru>\n"
 "\tAlexandre Prokoudine <alexandre.prokoudine at gmail.com>\n"
 
-#: about.cc:212
+#: about.cc:216
 msgid ""
 "Greek:\n"
 "\t Klearchos Gourgourinis <muadib at in.gr>\n"
@@ -377,7 +393,7 @@ msgstr ""
 "Griechisch:\n"
 "\t Klearchos Gourgourinis <muadib at in.gr>\n"
 
-#: about.cc:213
+#: about.cc:217
 msgid ""
 "Swedish:\n"
 "\t Petter Sundlöf <petter.sundlof at gmail.com>\n"
@@ -385,7 +401,7 @@ msgstr ""
 "Schwedisch:\n"
 "\t Petter Sundlöf <petter.sundlof at gmail.com>\n"
 
-#: about.cc:214
+#: about.cc:218
 msgid ""
 "Polish:\n"
 "\t Piotr Zaryk <pzaryk at gmail.com>\n"
@@ -393,7 +409,7 @@ msgstr ""
 "Polnisch:\n"
 "\t Piotr Zaryk <pzaryk at gmail.com>\n"
 
-#: about.cc:215
+#: about.cc:219
 msgid ""
 "Czech:\n"
 "\t Pavel Fric <pavelfric at seznam.cz>\n"
@@ -401,7 +417,7 @@ msgstr ""
 "Tschechisch:\n"
 "\t Pavel Fric <pavelfric at seznam.cz>\n"
 
-#: about.cc:216
+#: about.cc:220
 msgid ""
 "Norwegian:\n"
 "\t Eivind Ødegård\n"
@@ -409,7 +425,7 @@ msgstr ""
 "Norwegisch:\n"
 "\t Eivind Ødegård\n"
 
-#: about.cc:217
+#: about.cc:221
 msgid ""
 "Chinese:\n"
 "\t Rui-huai Zhang <zrhzrh at mail.ustc.edu.cn>\n"
@@ -417,49 +433,53 @@ msgstr ""
 "Chinesisch:\n"
 "\t Rui-huai Zhang <zrhzrh at mail.ustc.edu.cn>\n"
 
-#: about.cc:597
+#: about.cc:601
 msgid "Intel 64-bit"
 msgstr "Intel 64-bit"
 
-#: about.cc:599
+#: about.cc:603
 msgid "Intel 32-bit"
 msgstr "Intel 32-bit"
 
-#: about.cc:601
+#: about.cc:605
 msgid "PowerPC 64-bit"
 msgstr "PowerPC 64-bit"
 
-#: about.cc:603
+#: about.cc:607
 msgid "PowerPC 32-bit"
 msgstr "PowerPC 32-bit"
 
-#: about.cc:605
+#: about.cc:609
 msgid "64-bit"
 msgstr "64-bit"
 
-#: about.cc:607
+#: about.cc:611
 msgid "32-bit"
 msgstr "32-bit"
 
-#: about.cc:615
+#: about.cc:619
+msgid " - debug"
+msgstr " - debug"
+
+#: about.cc:625
 msgid "Copyright (C) 1999-2015 Paul Davis\n"
 msgstr "Copyright (C) 1999-2015 Paul Davis\n"
 
-#: about.cc:619
+#: about.cc:629
 msgid "http://ardour.org/"
 msgstr "http://ardour.org/"
 
-#: about.cc:620
+#: about.cc:630
 msgid ""
 "%1%2\n"
-"(built from revision %3)\n"
-"%4"
+"(rev %3)\n"
+"%4%5"
 msgstr ""
 "%1%2\n"
-"(erzeugt aus Revision %3)\n"
-"%4"
+"(rev %3)\n"
+"%4%5"
 
-#: about.cc:625
+#: about.cc:635
 msgid "Config"
 msgstr "Konfiguration"
 
@@ -479,108 +499,134 @@ msgstr "Konnte die %1 Menü-Definitionsdatei nicht finden"
 msgid "%1 will not work without a valid menu definition file"
 msgstr "%1 wird ohne gültige Menüdefinitions-Datei nicht funktionieren"
 
-#: add_route_dialog.cc:54 route_params_ui.cc:524
-msgid "Add Track or Bus"
-msgstr "Spur/Bus hinzufügen"
+#: add_route_dialog.cc:58
+msgid "Add Track/Bus/VCA"
+msgstr "Füge Spur/Bus/VCA hinzu"
 
-#: add_route_dialog.cc:57
+#: add_route_dialog.cc:61
 msgid "Configuration:"
 msgstr "Kanaleinstellungen:"
 
-#: add_route_dialog.cc:58
+#: add_route_dialog.cc:62
 msgid "Record Mode:"
 msgstr "Aufnahmemodus:"
 
-#: add_route_dialog.cc:59
+#: add_route_dialog.cc:63
 msgid "Instrument:"
 msgstr "Instrument:"
 
-#: add_route_dialog.cc:77
+#: add_route_dialog.cc:77 add_route_dialog.cc:228
 msgid "Audio Tracks"
 msgstr "Audiospuren"
 
-#: add_route_dialog.cc:78 add_route_dialog.cc:209
+#: add_route_dialog.cc:78 add_route_dialog.cc:224
 msgid "MIDI Tracks"
 msgstr "Midispuren"
 
-#: add_route_dialog.cc:79 add_route_dialog.cc:211
+#: add_route_dialog.cc:79 add_route_dialog.cc:226
 msgid "Audio+MIDI Tracks"
 msgstr "Audio+MIDI-Spuren"
 
-#: add_route_dialog.cc:80 add_route_dialog.cc:207
-msgid "Busses"
-msgstr "Audiobusse"
+#: add_route_dialog.cc:80 add_route_dialog.cc:220
+msgid "Audio Busses"
+msgstr "Audio Busse"
+
+#: add_route_dialog.cc:81 add_route_dialog.cc:222
+msgid "MIDI Busses"
+msgstr "MIDI Busse"
 
-#: add_route_dialog.cc:83 add_route_dialog.cc:554
+#: add_route_dialog.cc:82
+msgid "VCA Masters"
+msgstr "VCA Masters"
+
+#: add_route_dialog.cc:85 add_route_dialog.cc:622
 msgid "First"
 msgstr "Zuerst"
 
-#: add_route_dialog.cc:84 add_route_dialog.cc:558
+#: add_route_dialog.cc:86 add_route_dialog.cc:626
 msgid "Before Selection"
 msgstr "Vor Auswahl"
 
-#: add_route_dialog.cc:85 add_route_dialog.cc:556
+#: add_route_dialog.cc:87 add_route_dialog.cc:624
 msgid "After Selection"
 msgstr "Nach Auswahl"
 
-#: add_route_dialog.cc:86
+#: add_route_dialog.cc:88
 msgid "Last"
 msgstr "Zuletzt"
 
-#: add_route_dialog.cc:103
+#: add_route_dialog.cc:91
+msgid "Flexible-I/O"
+msgstr "Flexibles E/A"
+
+#: add_route_dialog.cc:92
+msgid "Strict-I/O"
+msgstr "Striktes E/A"
+
+#: add_route_dialog.cc:108
 msgid "Add:"
 msgstr "Erstelle:"
 
-#: add_route_dialog.cc:116 time_fx_dialog.cc:91 add_video_dialog.cc:135
+#: add_route_dialog.cc:121 time_fx_dialog.cc:101 add_video_dialog.cc:136
 #: video_server_dialog.cc:118
 msgid "<b>Options</b>"
 msgstr "<b>Optionen</b>"
 
-#: add_route_dialog.cc:126 bundle_manager.cc:193 region_editor.cc:52
-#: route_group_dialog.cc:71
+#: add_route_dialog.cc:131 bundle_manager.cc:193 region_editor.cc:52
+#: route_group_dialog.cc:70
 msgid "Name:"
 msgstr "Name:"
 
-#: add_route_dialog.cc:156
+#: add_route_dialog.cc:155
 msgid "Group:"
 msgstr "Gruppe:"
 
-#: add_route_dialog.cc:162
+#: add_route_dialog.cc:161
 msgid "Insert:"
 msgstr "Insert:"
 
-#: add_route_dialog.cc:223 add_route_dialog.cc:232 add_route_dialog.cc:306
-#: ardour_ui_ed.cc:574 engine_dialog.cc:242 rc_option_editor.cc:2257
-#: rc_option_editor.cc:2259 rc_option_editor.cc:2261 rc_option_editor.cc:2279
-#: rc_option_editor.cc:2281 rc_option_editor.cc:2290 rc_option_editor.cc:2292
-#: rc_option_editor.cc:2310 rc_option_editor.cc:2323 rc_option_editor.cc:2326
-#: rc_option_editor.cc:2328 rc_option_editor.cc:2373 rc_option_editor.cc:2375
-#: rc_option_editor.cc:2377 rc_option_editor.cc:2385 rc_option_editor.cc:2393
-#: rc_option_editor.cc:2395 rc_option_editor.cc:2403
+#: add_route_dialog.cc:171
+msgid "Output Ports:"
+msgstr "Ausgangsports:"
+
+#: add_route_dialog.cc:176 rc_option_editor.cc:2474
+msgid ""
+"With strict-i/o enabled, Effect Processors will not modify the number of "
+"channels on a track. The number of output channels will always match the "
+"number of input channels."
+msgstr ""
+"Wenn striktes E/A aktiviert ist, werden Effektprozessoren die Kanalzahl "
+"einer Spur nicht verändern. Die Anzahl an Ausgängen wird immer der Anzahl an "
+"Eingängen entsprechen."
+
+#: add_route_dialog.cc:240 add_route_dialog.cc:351 ardour_ui_ed.cc:625
+#: engine_dialog.cc:244 plugin_pin_dialog.cc:67 rc_option_editor.cc:2397
+#: rc_option_editor.cc:2399 rc_option_editor.cc:2401 rc_option_editor.cc:2419
+#: rc_option_editor.cc:2421 rc_option_editor.cc:2429 rc_option_editor.cc:2432
+#: rc_option_editor.cc:2450 rc_option_editor.cc:2463 rc_option_editor.cc:2472
+#: rc_option_editor.cc:2478 rc_option_editor.cc:2480 rc_option_editor.cc:2525
+#: rc_option_editor.cc:2527 rc_option_editor.cc:2529 rc_option_editor.cc:2537
 msgid "Audio"
 msgstr "Audio"
 
-#: add_route_dialog.cc:224 add_route_dialog.cc:235 add_route_dialog.cc:307
-#: editor_actions.cc:110 engine_dialog.cc:244 missing_file_dialog.cc:60
-#: rc_option_editor.cc:2536 rc_option_editor.cc:2538 rc_option_editor.cc:2548
-#: rc_option_editor.cc:2557 rc_option_editor.cc:2565 rc_option_editor.cc:2573
-#: rc_option_editor.cc:2581 rc_option_editor.cc:2589 rc_option_editor.cc:2591
-#: rc_option_editor.cc:2599 rc_option_editor.cc:2601 rc_option_editor.cc:2609
-#: rc_option_editor.cc:2618 rc_option_editor.cc:2620 rc_option_editor.cc:2628
-#: rc_option_editor.cc:2636 rc_option_editor.cc:2645 rc_option_editor.cc:2654
-#: rc_option_editor.cc:2677
+#: add_route_dialog.cc:243 add_route_dialog.cc:352 editor_actions.cc:112
+#: engine_dialog.cc:246 missing_file_dialog.cc:60 mixer_ui.cc:1895
+#: plugin_pin_dialog.cc:68 rc_option_editor.cc:2672 rc_option_editor.cc:2674
+#: rc_option_editor.cc:2684 rc_option_editor.cc:2693 rc_option_editor.cc:2701
+#: rc_option_editor.cc:2709 rc_option_editor.cc:2717 rc_option_editor.cc:2790
+#: rc_option_editor.cc:2813
 msgid "MIDI"
 msgstr "MIDI"
 
-#: add_route_dialog.cc:225 add_route_dialog.cc:238 add_route_dialog.cc:308
+#: add_route_dialog.cc:246 add_route_dialog.cc:353
 msgid "Audio+MIDI"
 msgstr "Audio+MIDI"
 
-#: add_route_dialog.cc:226 add_route_dialog.cc:241 add_route_dialog.cc:309
+#: add_route_dialog.cc:250 add_route_dialog.cc:354
 msgid "Bus"
 msgstr "Bus"
 
-#: add_route_dialog.cc:268
+#: add_route_dialog.cc:286
 msgid ""
 "Audio+MIDI tracks are intended for use <b>ONLY</b> with plugins that use "
 "both audio and MIDI input data\n"
@@ -594,60 +640,61 @@ msgstr ""
 "Falls Sie nicht vorhaben, so ein Plugin zu benutzen, verwenden Sie "
 "stattdessen eine normale Audio- oder MIDI-Spur"
 
-#: add_route_dialog.cc:327 add_route_dialog.cc:346 editor_actions.cc:438
-#: editor_rulers.cc:250 time_axis_view.cc:1383
+#: add_route_dialog.cc:373 add_route_dialog.cc:385 editor_actions.cc:456
+#: editor_rulers.cc:250 time_axis_view.cc:1294
 msgid "Normal"
 msgstr "Normal"
 
-#: add_route_dialog.cc:330 add_route_dialog.cc:348
+#: add_route_dialog.cc:374 add_route_dialog.cc:387
 msgid "Non Layered"
 msgstr "Non Layered"
 
-#: add_route_dialog.cc:331 add_route_dialog.cc:350
+#: add_route_dialog.cc:375 add_route_dialog.cc:389
 msgid "Tape"
 msgstr "Band"
 
-#: add_route_dialog.cc:431 monitor_section.cc:264
+#: add_route_dialog.cc:476 monitor_section.cc:273 plugin_pin_dialog.cc:509
+#: plugin_setup_dialog.cc:202
 msgid "Mono"
 msgstr "Mono"
 
-#: add_route_dialog.cc:435
+#: add_route_dialog.cc:480 plugin_pin_dialog.cc:512 plugin_setup_dialog.cc:205
 msgid "Stereo"
 msgstr "Stereo"
 
-#: add_route_dialog.cc:459
+#: add_route_dialog.cc:503
 msgid "3 Channel"
 msgstr "3 Kanäle"
 
-#: add_route_dialog.cc:463
+#: add_route_dialog.cc:507
 msgid "4 Channel"
 msgstr "4 Kanäle"
 
-#: add_route_dialog.cc:467
+#: add_route_dialog.cc:511
 msgid "5 Channel"
 msgstr "5 Kanäle"
 
-#: add_route_dialog.cc:471
+#: add_route_dialog.cc:515
 msgid "6 Channel"
 msgstr "6 Kanäle"
 
-#: add_route_dialog.cc:475
+#: add_route_dialog.cc:519
 msgid "8 Channel"
 msgstr "8 Kanäle"
 
-#: add_route_dialog.cc:479
+#: add_route_dialog.cc:523
 msgid "12 Channel"
 msgstr "12 Kanäle"
 
-#: add_route_dialog.cc:483 mixer_strip.cc:1918 mixer_strip.cc:2351
+#: add_route_dialog.cc:527 mixer_strip.cc:2017 mixer_strip.cc:2463
 msgid "Custom"
 msgstr "Benutzerdefiniert"
 
-#: add_route_dialog.cc:516 add_route_dialog.cc:532 route_group_menu.cc:81
+#: add_route_dialog.cc:569 add_route_dialog.cc:585 route_group_menu.cc:85
 msgid "New Group..."
 msgstr "Neue Gruppe..."
 
-#: add_route_dialog.cc:520 route_group_menu.cc:85
+#: add_route_dialog.cc:573 route_group_menu.cc:89
 msgid "No Group"
 msgstr "Keine Gruppe"
 
@@ -677,70 +724,70 @@ msgstr ""
 msgid "Done"
 msgstr "Fertig"
 
-#: analysis_window.cc:46
+#: analysis_window.cc:45
 msgid "Signal source"
 msgstr "Signalquelle"
 
-#: analysis_window.cc:47
+#: analysis_window.cc:46
 msgid "Selected ranges"
 msgstr "Ausgewählte Bereiche"
 
-#: analysis_window.cc:48
+#: analysis_window.cc:47
 msgid "Selected regions"
 msgstr "Ausgewählte Regionen"
 
-#: analysis_window.cc:50
-msgid "Display model"
-msgstr "Anzeigetyp"
-
-#: analysis_window.cc:51
-msgid "Composite graphs for each track"
-msgstr "Graphen für jede Spur einzeln"
-
-#: analysis_window.cc:52
-msgid "Composite graph of all tracks"
-msgstr "Graphen aller Spuren zusammenfassen"
-
-#: analysis_window.cc:54
+#: analysis_window.cc:48
 msgid "Show frequency power range"
 msgstr "Leistungsspektrum anzeigen"
 
-#: analysis_window.cc:55
-msgid "Normalize values"
-msgstr "Normalisieren"
+#: analysis_window.cc:49
+msgid "Fit dB range"
+msgstr "Passe dB-Bereich ein"
+
+#: analysis_window.cc:50
+msgid "Proportional Spectrum, -18dB"
+msgstr "Proportionales Spektrum, -18dB"
 
-#: analysis_window.cc:59
+#: analysis_window.cc:53
 msgid "FFT analysis window"
 msgstr "FFT-Analysefenster"
 
-#: analysis_window.cc:60 editor.cc:1848
+#: analysis_window.cc:54 editor.cc:1954
 msgid "Spectral Analysis"
 msgstr "FFT-Analyse"
 
-#: analysis_window.cc:67 editor_actions.cc:143 session_metadata_dialog.cc:667
+#: analysis_window.cc:61 editor_actions.cc:145 session_metadata_dialog.cc:670
 msgid "Track"
 msgstr "Spur"
 
-#: analysis_window.cc:68 editor_actions.cc:664 mixer_ui.cc:135
-#: mixer_ui.cc:2035
+#: analysis_window.cc:62 ardour_ui_ed.cc:254 ardour_ui_ed.cc:255
+#: ardour_ui_ed.cc:256 editor_actions.cc:689 mixer_ui.cc:151 mixer_ui.cc:2134
 msgid "Show"
 msgstr "Anzeigen"
 
-#: analysis_window.cc:135
+#: analysis_window.cc:107
 msgid "Re-analyze data"
 msgstr "Daten erneut analysieren"
 
-#: ardour_button.cc:820
+#: ardour_button.cc:876
 msgid "button cannot watch state of non-existing Controllable\n"
 msgstr ""
 "Schaltfläche kann den Status des nichtexistenten Kontrollzieles nicht "
 "verfolgen\n"
 
-#: ardour_button.cc:1088
+#: ardour_button.cc:1144
 msgid "ABCDEFGHIJLKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
 msgstr "ABCDEFGHIJLKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
 
-#: ardour_ui.cc:174
+#: ardour_http.cc:165 ardour_http.cc:179
+msgid "HTTP request failed: (%1) %2"
+msgstr "HTTP Anforderung fehlgeschlagen: (%1) %2"
+
+#: ardour_http.cc:169 ardour_http.cc:182
+msgid "HTTP request status: %1"
+msgstr "HTTP Anforderungsstatus: %1"
+
+#: ardour_ui.cc:198
 msgid ""
 "%1 %2.x has discovered configuration files from %1 %3.x.\n"
 "\n"
@@ -754,83 +801,155 @@ msgstr ""
 "\n"
 "(Dies erfordert einen Neustart von %1.)"
 
-#: ardour_ui.cc:253 editor_actions.cc:658 region_editor.cc:53
+#: ardour_ui.cc:283 editor_actions.cc:683 region_editor.cc:53
 msgid "Audition"
 msgstr "Vorhören"
 
-#: ardour_ui.cc:254 editor_actions.cc:137 mixer_strip.cc:2101
-#: monitor_section.cc:321 rc_option_editor.cc:2413 route_time_axis.cc:255
-#: route_time_axis.cc:2748
+#: ardour_ui.cc:284 editor_actions.cc:139 mixer_strip.cc:2213
+#: monitor_section.cc:329 rc_option_editor.cc:2547 route_time_axis.cc:263
+#: route_time_axis.cc:2740 vca_master_strip.cc:212 vca_time_axis.cc:237
 msgid "Solo"
 msgstr "Solo"
 
-#: ardour_ui.cc:255 rc_option_editor.cc:1356
+#: ardour_ui.cc:285 rc_option_editor.cc:1357
 msgid "Feedback"
 msgstr "Feedback"
 
-#: ardour_ui.cc:264 speaker_dialog.cc:36
+#: ardour_ui.cc:296 speaker_dialog.cc:36
 msgid "Speaker Configuration"
 msgstr "Lautsprechereinstellung"
 
-#: ardour_ui.cc:265 keyeditor.cc:53
-msgid "Key Bindings"
-msgstr "Tastaturkürzel"
-
-#: ardour_ui.cc:266
-msgid "Preferences"
-msgstr "Globale Einstellungen"
-
-#: ardour_ui.cc:267 ardour_ui.cc:274
+#: ardour_ui.cc:297
 msgid "Add Tracks/Busses"
 msgstr "Spuren/Busse hinzufügen"
 
-#: ardour_ui.cc:268
+#: ardour_ui.cc:298
 msgid "About"
 msgstr "Ãœber..."
 
-#: ardour_ui.cc:269 location_ui.cc:1143 session_option_editor.cc:210
-#: session_option_editor.cc:216 session_option_editor.cc:223
-msgid "Locations"
-msgstr "Dateiorte"
+#: ardour_ui.cc:299 location_ui.cc:1167
+msgid "Ranges|Locations"
+msgstr "Positionen"
 
-#: ardour_ui.cc:270 route_params_ui.cc:59 route_params_ui.cc:630
+#: ardour_ui.cc:300 route_params_ui.cc:59 route_params_ui.cc:620
 msgid "Tracks and Busses"
 msgstr "Spuren/Busse"
 
-#: ardour_ui.cc:271 engine_dialog.cc:73
+#: ardour_ui.cc:301 engine_dialog.cc:73
 msgid "Audio/MIDI Setup"
 msgstr "Audio/MIDI Einstellungen"
 
-#: ardour_ui.cc:272
+#: ardour_ui.cc:302
 msgid "Video Export Dialog"
 msgstr "Videoexport-Dialog"
 
-#: ardour_ui.cc:273
+#: ardour_ui.cc:303 lua_script_manager.cc:30
+msgid "Script Manager"
+msgstr "Skript Manager"
+
+#: ardour_ui.cc:304
 msgid "Properties"
 msgstr "Projekteinstellungen"
 
-#: ardour_ui.cc:275 bundle_manager.cc:264
+#: ardour_ui.cc:305
+msgid "Add Video"
+msgstr "Video hinzufügen"
+
+#: ardour_ui.cc:306 bundle_manager.cc:264
 msgid "Bundle Manager"
 msgstr "Bundle Manager"
 
-#: ardour_ui.cc:276 big_clock_window.cc:37
+#: ardour_ui.cc:307 big_clock_window.cc:37
 msgid "Big Clock"
 msgstr "Große Zeitanzeige"
 
-#: ardour_ui.cc:277
+#: ardour_ui.cc:308
 msgid "Audio Connections"
 msgstr "Audio-Verbindungen"
 
-#: ardour_ui.cc:278
+#: ardour_ui.cc:309
 msgid "MIDI Connections"
 msgstr "MIDI-Verbindungen"
 
-#: ardour_ui.cc:295
+#: ardour_ui.cc:310
+msgid "Bindings Editor"
+msgstr "Kürzel-Verwaltung"
+
+#: ardour_ui.cc:321 editor.cc:1289
+msgid "Window|Editor"
+msgstr "Editor"
+
+#: ardour_ui.cc:322 mixer_ui.cc:2210 mixer_ui.cc:2216
+msgid "Window|Mixer"
+msgstr "Mixer"
+
+#: ardour_ui.cc:323
+msgid "Window|Preferences"
+msgstr "Einstellungen"
+
+#: ardour_ui.cc:330
 msgid "Your configuration files were copied. You can now restart %1."
 msgstr ""
 "Ihre Konfigurationsdateien wurden kopiert. Sie können jetzt %1 neu starten."
 
-#: ardour_ui.cc:527
+#: ardour_ui.cc:509
+msgid "Pre-Release Warning"
+msgstr "Pre-Release Warnung"
+
+#: ardour_ui.cc:513
+msgid ""
+"<b>Welcome to this pre-release build of %1 %2</b>\n"
+"\n"
+"There are still several issues and bugs to be worked on,\n"
+"as well as general workflow improvements, before this can be considered\n"
+"release software. So, a few guidelines:\n"
+"\n"
+"1) Please do <b>NOT</b> use this software with the expectation that it is "
+"stable or reliable\n"
+"   though it may be so, depending on your workflow.\n"
+"2) Please wait for a helpful writeup of new features.\n"
+"3) <b>Please do NOT use the forums at ardour.org to report issues</b>.\n"
+"4) Please <b>DO</b> use the bugtracker at http://tracker.ardour.org/ to "
+"report issues\n"
+"   making sure to note the product version number as 5.0-pre.\n"
+"5) Please <b>DO</b> use the ardour-users mailing list to discuss ideas and "
+"pass on comments.\n"
+"6) Please <b>DO</b> join us on IRC for real time discussions about %1 %2. "
+"You\n"
+"   can get there directly from within the program via the Help->Chat menu "
+"option.\n"
+"\n"
+"Full information on all the above can be found on the support page at\n"
+"\n"
+"                http://ardour.org/support\n"
+msgstr ""
+"<b>Willkommen zu diesem Pre-Release Build von %1 %2</b>\n"
+"\n"
+"Bis diese Version als zur Veröffentlichung geeignet angesehen werden kann,\n"
+"wird weiter an etlichen Problemen, Bugs sowie allgemeinen Verbesserungen\n"
+"des Arbeitsflusses gearbeitet. Daher an dieser Stelle ein paar Richtlinien:\n"
+"\n"
+"1) Bitte benutzen Sie diese Software <b>NICHT</b> in der Erwartung, dass sie "
+"stabil oder zuverlässig ist\n"
+"   obwohl sie das (abhängig von Ihrer Arbeitsweeise) sein mag.\n"
+"2) Bitte warten Sie auf hilfreiche Dokumentation der neuen Features.\n"
+"3) <b>Bitte nutzen Sie NICHT das Forum, um Probleme zu melden</b>.\n"
+"4) Bitte <b>NUTZEN</b> Sie den Bugtracker auf http://tracker.ardour.org/, um "
+"Probleme zu melden\n"
+"   wobei Sie unbedingt die Produktversionsnummer 5.0-pre eintragen sollten.\n"
+"5) Bitte <b>NUTZEN</b> Sie die ardour-users Mailingliste, um Ideen zu "
+"diskutieren und Kommentare abzugeben.\n"
+"6) Bitte <b>NUTZEN</b> Sie unseren IRC-Kanal für Live-Diskussionen zu %1 %2. "
+"Sie\n"
+"   können direkt aus dem Programm über den Menüpunkt Hilfe->Chat dorthin "
+"gelangen.\n"
+"\n"
+"Vollständige Information zu allen oben genannten Punkten finden Sie auf "
+"der Supportseite unter\n"
+"\n"
+"                http://ardour.org/support\n"
+
+#: ardour_ui.cc:613
 msgid ""
 "The audio backend was shutdown because:\n"
 "\n"
@@ -840,7 +959,7 @@ msgstr ""
 "\n"
 "%1"
 
-#: ardour_ui.cc:529
+#: ardour_ui.cc:615
 msgid ""
 "The audio backend has either been shutdown or it\n"
 "disconnected %1 because %1\n"
@@ -852,7 +971,7 @@ msgstr ""
 "war. Sie sollten versuchen, das Audiobackend \n"
 "neu zu starten und das Projekt zu speichern."
 
-#: ardour_ui.cc:553
+#: ardour_ui.cc:639
 msgid ""
 "Audio Unit Plugin Scan Failed. Automatic AU scanning has been disabled. "
 "Please see the log window for further details."
@@ -860,39 +979,39 @@ msgstr ""
 "Audio Unit Plugin Scan fehlgeschlagen. Automatische AU Scans wurden "
 "deaktiviert. Weitere Einzelheiten finden Sie im Logfenster."
 
-#: ardour_ui.cc:554
+#: ardour_ui.cc:640
 msgid "Audio Unit Plugin Scan Failed:"
 msgstr "Audio Unit Plugin Scan fehlgeschlagen:"
 
-#: ardour_ui.cc:903
+#: ardour_ui.cc:1008
 msgid "NSM server did not announce itself"
 msgstr "Der NSM Server hat sich nicht angemeldet"
 
-#: ardour_ui.cc:916
+#: ardour_ui.cc:1021
 msgid "NSM: no client ID provided"
 msgstr "NSM: keine Client-ID verfügbar"
 
-#: ardour_ui.cc:923
+#: ardour_ui.cc:1028
 msgid "NSM: no session created"
 msgstr "NSM: kein Projekt erzeugt"
 
-#: ardour_ui.cc:946
+#: ardour_ui.cc:1051
 msgid "NSM: initialization failed"
-msgstr "NSM: Initialisierung gescheitert"
+msgstr "NSM: Initialisierung fehlgeschlagen"
 
-#: ardour_ui.cc:978
+#: ardour_ui.cc:1083
 msgid "Free/Demo Version Warning"
 msgstr "Demoversionswarnung"
 
-#: ardour_ui.cc:980
+#: ardour_ui.cc:1085
 msgid "Subscribe and support development of %1"
 msgstr "%1 abonnieren und die Entwicklung unterstützen"
 
-#: ardour_ui.cc:981
+#: ardour_ui.cc:1086
 msgid "Don't warn me about this again"
 msgstr "Nicht noch einmal warnen"
 
-#: ardour_ui.cc:983
+#: ardour_ui.cc:1088
 msgid ""
 "<span weight=\"bold\" size=\"large\">%1</span>\n"
 "\n"
@@ -910,15 +1029,15 @@ msgstr ""
 "\n"
 "%4"
 
-#: ardour_ui.cc:984
+#: ardour_ui.cc:1089
 msgid "This is a free/demo version of %1"
 msgstr "Dies ist eine freie Demoversion von %1"
 
-#: ardour_ui.cc:985
+#: ardour_ui.cc:1090
 msgid "It will not restore OR save any plugin settings"
 msgstr "Sie kann keine Plugin-Einstellungen speichern oder laden"
 
-#: ardour_ui.cc:986
+#: ardour_ui.cc:1091
 msgid ""
 "If you load an existing session with plugin settings\n"
 "they will not be used and will be lost."
@@ -926,7 +1045,7 @@ msgstr ""
 "Wenn Sie ein existierendes Projekt mit Plugin-Einstellungen laden, werden "
 "diese nicht benutzt und beim Speichern verloren gehen."
 
-#: ardour_ui.cc:988 plugin_ui.cc:579
+#: ardour_ui.cc:1093 plugin_ui.cc:586
 msgid ""
 "To get full access to updates without this limitation\n"
 "consider becoming a subscriber for a low cost every month."
@@ -935,19 +1054,19 @@ msgstr ""
 "Sie, uns durch ein Abonnement mit einem geringen monatlichen Betrag zu "
 "unterstützen."
 
-#: ardour_ui.cc:998
+#: ardour_ui.cc:1103
 msgid "Quit now"
 msgstr "Jetzt beenden"
 
-#: ardour_ui.cc:999
+#: ardour_ui.cc:1104
 msgid "Continue using %1"
 msgstr "%1 weiterhin benutzen"
 
-#: ardour_ui.cc:1032 startup.cc:348
+#: ardour_ui.cc:1135 startup.cc:349
 msgid "%1 is ready for use"
 msgstr "%1 ist nun bereit"
 
-#: ardour_ui.cc:1074
+#: ardour_ui.cc:1185
 msgid ""
 "WARNING: Your system has a limit for maximum amount of locked memory. This "
 "might cause %1 to run out of memory before your system runs out of memory. \n"
@@ -962,23 +1081,23 @@ msgstr ""
 "Sie können die Speicherbegrenzung mit 'ulimit -l' einsehen und normalerweise "
 "in %2 verändern."
 
-#: ardour_ui.cc:1091
+#: ardour_ui.cc:1202
 msgid "Do not show this window again"
 msgstr "Diese Meldung nicht erneut anzeigen"
 
-#: ardour_ui.cc:1135
+#: ardour_ui.cc:1245
 msgid "Don't quit"
 msgstr "Abbrechen"
 
-#: ardour_ui.cc:1136
+#: ardour_ui.cc:1246
 msgid "Just quit"
 msgstr "Beenden ohne zu speichern"
 
-#: ardour_ui.cc:1137 ardour_ui.cc:5008
+#: ardour_ui.cc:1247 ardour_ui.cc:5362
 msgid "Save and quit"
 msgstr "Speichern und beenden"
 
-#: ardour_ui.cc:1147
+#: ardour_ui.cc:1257
 msgid ""
 "%1 was unable to save your session.\n"
 "\n"
@@ -992,11 +1111,11 @@ msgstr ""
 "\n"
 "\"Trotzdem beenden\"."
 
-#: ardour_ui.cc:1197
+#: ardour_ui.cc:1307
 msgid "Unsaved Session"
 msgstr "Nicht gespeichertes Projekt"
 
-#: ardour_ui.cc:1218
+#: ardour_ui.cc:1328
 msgid ""
 "The session \"%1\"\n"
 "has not been saved.\n"
@@ -1014,7 +1133,7 @@ msgstr ""
 "\n"
 "Wie wollen Sie vorgehen?"
 
-#: ardour_ui.cc:1221
+#: ardour_ui.cc:1331
 msgid ""
 "The snapshot \"%1\"\n"
 "has not been saved.\n"
@@ -1032,106 +1151,107 @@ msgstr ""
 "\n"
 "Wie wollen Sie vorgehen?"
 
-#: ardour_ui.cc:1235
+#: ardour_ui.cc:1345
 msgid "Prompter"
 msgstr "Frage"
 
-#: ardour_ui.cc:1349 ardour_ui.cc:1357
+#: ardour_ui.cc:1459 ardour_ui.cc:1467
 msgid "Audio: <span foreground=\"red\">none</span>"
 msgstr "Audio: <span foreground=\"red\">Kein</span>"
 
-#: ardour_ui.cc:1361
+#: ardour_ui.cc:1471
 #, c-format
 msgid "Audio: <span foreground=\"green\">%.1f kHz / %4.1f ms</span>"
 msgstr "Audio: <span foreground=\"green\">%.1f kHz / %4.1f ms</span>"
 
-#: ardour_ui.cc:1365
+#: ardour_ui.cc:1475
 #, c-format
 msgid "Audio: <span foreground=\"green\">%<PRId64> kHz / %4.1f ms</span>"
 msgstr "Audio: <span foreground=\"green\">%<PRId64> kHz / %4.1f ms</span>"
 
-#: ardour_ui.cc:1383 export_video_dialog.cc:76
+#: ardour_ui.cc:1493 export_report.cc:108 export_report.cc:323
+#: export_video_dialog.cc:76
 msgid "File:"
 msgstr "Datei:"
 
-#: ardour_ui.cc:1387
+#: ardour_ui.cc:1497
 msgid "BWF"
 msgstr "BWF"
 
-#: ardour_ui.cc:1390
+#: ardour_ui.cc:1500
 msgid "WAV"
 msgstr "WAV"
 
-#: ardour_ui.cc:1393
+#: ardour_ui.cc:1503
 msgid "WAV64"
 msgstr "WAV64"
 
-#: ardour_ui.cc:1396 session_option_editor.cc:202
+#: ardour_ui.cc:1506 session_option_editor.cc:202
 msgid "CAF"
 msgstr "CAF"
 
-#: ardour_ui.cc:1399
+#: ardour_ui.cc:1509
 msgid "AIFF"
 msgstr "AIFF"
 
-#: ardour_ui.cc:1402
+#: ardour_ui.cc:1512
 msgid "iXML"
 msgstr "iXML"
 
-#: ardour_ui.cc:1405 session_option_editor.cc:203
+#: ardour_ui.cc:1515 session_option_editor.cc:203
 msgid "RF64"
 msgstr "RF64"
 
-#: ardour_ui.cc:1408
+#: ardour_ui.cc:1518
 msgid "RF64/WAV"
 msgstr "RF64/WAV"
 
-#: ardour_ui.cc:1411
+#: ardour_ui.cc:1521
 msgid "MBWF"
 msgstr "MBWF"
 
-#: ardour_ui.cc:1419
+#: ardour_ui.cc:1529
 msgid "32-float"
 msgstr "32-float"
 
-#: ardour_ui.cc:1422
+#: ardour_ui.cc:1532
 msgid "24-int"
 msgstr "24-int"
 
-#: ardour_ui.cc:1425
+#: ardour_ui.cc:1535
 msgid "16-int"
 msgstr "16-int"
 
-#: ardour_ui.cc:1446
+#: ardour_ui.cc:1556
 #, c-format
 msgid "X: <span foreground=\"%s\">>10K</span>"
 msgstr "X: <span foreground=\"%s\">>10K</span>"
 
-#: ardour_ui.cc:1448
+#: ardour_ui.cc:1558
 #, c-format
 msgid "X: <span foreground=\"%s\">%u</span>"
 msgstr "X: <span foreground=\"%s\">%u</span>"
 
-#: ardour_ui.cc:1451
+#: ardour_ui.cc:1561
 #, c-format
 msgid "X: <span foreground=\"%s\">?</span>"
 msgstr "X: <span foreground=\"%s\">?</span>"
 
-#: ardour_ui.cc:1454
+#: ardour_ui.cc:1564
 msgid "Audio dropouts. Shift+click to reset"
 msgstr "Audio Dropouts. Zum Zurücksetzen Shift+Klick"
 
-#: ardour_ui.cc:1467
+#: ardour_ui.cc:1577
 #, c-format
 msgid "DSP: <span foreground=\"%s\">%5.1f%%</span>"
 msgstr "DSP: <span foreground=\"%s\">%5.1f%%</span>"
 
-#: ardour_ui.cc:1477
+#: ardour_ui.cc:1587
 #, c-format
 msgid "PkBld: <span foreground=\"%s\">%d</span>"
 msgstr "PkBld: <span foreground=\"%s\">%d</span>"
 
-#: ardour_ui.cc:1499
+#: ardour_ui.cc:1609
 #, c-format
 msgid ""
 "Buffers: <span foreground=\"green\">p:</span><span foreground=\"%s\">"
@@ -1142,29 +1262,29 @@ msgstr ""
 "%%</span> <span foreground=\"green\">c:</span><span foreground=\"%s\">"
 "%<PRIu32>%%</span>"
 
-#: ardour_ui.cc:1540
+#: ardour_ui.cc:1650
 msgid "Disk: <span foreground=\"green\">Unknown</span>"
 msgstr "Disk: <span foreground=\"green\">Unbekannt</span>"
 
-#: ardour_ui.cc:1542
+#: ardour_ui.cc:1652
 msgid "Disk: <span foreground=\"green\">24hrs+</span>"
 msgstr "Disk: <span foreground=\"green\">24h+</span>"
 
-#: ardour_ui.cc:1560
+#: ardour_ui.cc:1670
 msgid "Disk: <span foreground=\"green\">>24 hrs</span>"
 msgstr "Disk: <span foreground=\"green\">>24 h</span>"
 
-#: ardour_ui.cc:1571
+#: ardour_ui.cc:1681
 #, c-format
 msgid "Disk: <span foreground=\"%s\">%02dh:%02dm:%02ds</span>"
 msgstr "Disk: <span foreground=\"%s\">%02dh:%02dm:%02ds</span>"
 
-#: ardour_ui.cc:1597
+#: ardour_ui.cc:1707
 #, c-format
 msgid "Timecode|TC: <span foreground=\"%s\">%s</span>"
 msgstr "TC: <span foreground=\"%s\">%s</span>"
 
-#: ardour_ui.cc:1675
+#: ardour_ui.cc:1789
 msgid ""
 "%1 is not connected to any audio backend.\n"
 "You cannot open or close sessions in this condition"
@@ -1172,56 +1292,62 @@ msgstr ""
 "%1 ist derzeit mit keinem Audiobackend verbunden.\n"
 "Daher können keine Projekte geöffnet oder geschlossen werden."
 
-#: ardour_ui.cc:1693
+#: ardour_ui.cc:1807
 msgid "Open Session"
 msgstr "Projekt öffnen"
 
-#: ardour_ui.cc:1717 session_dialog.cc:407 session_import_dialog.cc:170
-#: session_metadata_dialog.cc:858
+#: ardour_ui.cc:1831 session_dialog.cc:410 session_import_dialog.cc:170
+#: session_metadata_dialog.cc:861
 msgid "%1 sessions"
 msgstr "%1 Projekte"
 
-#: ardour_ui.cc:1748
+#: ardour_ui.cc:1879 ardour_ui.cc:1916
 msgid "You cannot add a track without a session already loaded."
 msgstr ""
 "Sie können erst Spuren oder Busse hinzufügen, wenn ein Projekt geladen wurde."
 
-#: ardour_ui.cc:1756
+#: ardour_ui.cc:1887
 msgid "could not create %1 new mixed track"
 msgid_plural "could not create %1 new mixed tracks"
 msgstr[0] "konnte %1 neue Audio+MIDI-Spur nicht erstellen"
 msgstr[1] "konnte %1 neue Audio+MIDI-Spuren nicht erstellen"
 
-#: ardour_ui.cc:1762 ardour_ui.cc:1823
-msgid ""
-"There are insufficient ports available\n"
-"to create a new track or bus.\n"
-"You should save %1, exit and\n"
-"restart with more ports."
-msgstr ""
-"Es sind nicht genügend Ports verfügbar,\n"
-"um neue Spuren oder Busse zu erzeugen.\n"
-"Sie sollten %1 sichern, beenden und\n"
-" mit mehr Ports neustarten."
+#: ardour_ui.cc:1924
+msgid "could not create %1 new Midi Bus"
+msgid_plural "could not create %1 new Midi Busses"
+msgstr[0] "konnte %1 MIDI-Bus nicht erzeugen"
+msgstr[1] "konnte %1 MIDI-Busse nicht erzeugen"
 
-#: ardour_ui.cc:1797
+#: ardour_ui.cc:1977
 msgid "You cannot add a track or bus without a session already loaded."
 msgstr ""
 "Sie können erst Spuren oder Busse hinzufügen, wenn ein Projekt geladen wurde."
 
-#: ardour_ui.cc:1806
+#: ardour_ui.cc:1986
 msgid "could not create %1 new audio track"
 msgid_plural "could not create %1 new audio tracks"
 msgstr[0] "konnte %1 neue Audiospur nicht erstellen."
 msgstr[1] "konnte %1 neue Audiospuren nicht erstellen."
 
-#: ardour_ui.cc:1815
+#: ardour_ui.cc:1995
 msgid "could not create %1 new audio bus"
 msgid_plural "could not create %1 new audio busses"
 msgstr[0] "konnte %1 neuen Audiobus nicht erstellen"
 msgstr[1] "konnte %1 neue Audiobusse nicht erstellen"
 
-#: ardour_ui.cc:1968
+#: ardour_ui.cc:2020
+msgid ""
+"There are insufficient ports available\n"
+"to create a new track or bus.\n"
+"You should save %1, exit and\n"
+"restart with more ports."
+msgstr ""
+"Es sind nicht genügend Ports verfügbar,\n"
+"um neue Spuren oder Busse zu erzeugen.\n"
+"Sie sollten %1 sichern, beenden und\n"
+" mit mehr Ports neustarten."
+
+#: ardour_ui.cc:2164
 msgid ""
 "Please create one or more tracks before trying to record.\n"
 "You can do this with the \"Add Track or Bus\" option in the Session menu."
@@ -1230,20 +1356,20 @@ msgstr ""
 "eine oder mehrere Spur hinzu. Die geht über \"Spur/Bus hinzufügen\"\n"
 "im Menüpunkt Projekt."
 
-#: ardour_ui.cc:2359
+#: ardour_ui.cc:2565
 #, c-format
 msgid "Copied %<PRId64> of %<PRId64>"
 msgstr "%<PRId64> von %<PRId64> kopiert"
 
-#: ardour_ui.cc:2413 save_as_dialog.cc:33
+#: ardour_ui.cc:2619 save_as_dialog.cc:33
 msgid "Save As"
 msgstr "Speichern unter"
 
-#: ardour_ui.cc:2441
+#: ardour_ui.cc:2647
 msgid "Save As failed: %1"
 msgstr "Sichern unter fehlgeschlagen: %1"
 
-#: ardour_ui.cc:2463
+#: ardour_ui.cc:2684
 msgid ""
 "To ensure compatibility with various systems\n"
 "snapshot names may not contain a '%1' character"
@@ -1251,37 +1377,37 @@ msgstr ""
 "Um die Kompatibilität mit verschiedenen Systemen sicher zu stellen,\n"
 "dürfen Namen von Schnappschüssen kein '%1'-Zeichen enthalten"
 
-#: ardour_ui.cc:2477
+#: ardour_ui.cc:2698
 msgid "Confirm Snapshot Overwrite"
 msgstr "Überschreiben des Schnappschusses bestätigen"
 
-#: ardour_ui.cc:2478
+#: ardour_ui.cc:2699
 msgid "A snapshot already exists with that name. Do you want to overwrite it?"
 msgstr ""
 "Ein Schnappschuss mit diesem Namen existiert bereits Wollen Sie sie "
 "überschreiben?"
 
-#: ardour_ui.cc:2503
-msgid "Save as..."
-msgstr "Speichern unter..."
+#: ardour_ui.cc:2724
+msgid "Snapshot and switch"
+msgstr "Schnappschuss und umschalten"
 
-#: ardour_ui.cc:2504 ardour_ui.cc:2553
+#: ardour_ui.cc:2725 ardour_ui.cc:2776
 msgid "New session name"
 msgstr "Neuer Projektname"
 
-#: ardour_ui.cc:2506
+#: ardour_ui.cc:2727
 msgid "Take Snapshot"
 msgstr "Schnappschuss machen"
 
-#: ardour_ui.cc:2507
+#: ardour_ui.cc:2728
 msgid "Name of new snapshot"
 msgstr "Name für neuen Schnappschuss"
 
-#: ardour_ui.cc:2552
+#: ardour_ui.cc:2775
 msgid "Rename Session"
 msgstr "Projekt umbenennen"
 
-#: ardour_ui.cc:2567 ardour_ui.cc:3047 ardour_ui.cc:3085
+#: ardour_ui.cc:2790 ardour_ui.cc:3267 ardour_ui.cc:3305
 msgid ""
 "To ensure compatibility with various systems\n"
 "session names may not contain a '%1' character"
@@ -1289,14 +1415,14 @@ msgstr ""
 "Um die Kompatibilität mit verschiedenen Systemen sicher zu stellen,\n"
 "dürfen Projektnamen kein '%1'-Zeichen enthalten"
 
-#: ardour_ui.cc:2575
+#: ardour_ui.cc:2798
 msgid ""
 "That name is already in use by another directory/folder. Please try again."
 msgstr ""
 "Dieser Name wird schon von einem anderen Verzeichnis/Ordner benutzt. Bitte "
 "versuchen Sie einen anderen Namen."
 
-#: ardour_ui.cc:2584
+#: ardour_ui.cc:2807
 msgid ""
 "Renaming this session failed.\n"
 "Things could be seriously messed up at this point"
@@ -1304,28 +1430,28 @@ msgstr ""
 "Das Umbenennen des Projekts ist fehlgeschlagen.\n"
 "Dies könnte auf schwerwiegende Probleme hinweisen."
 
-#: ardour_ui.cc:2700 route_ui.cc:1871
+#: ardour_ui.cc:2923 route_ui.cc:1871
 msgid "Confirm Template Overwrite"
 msgstr "Bestätige Überschreiben der Vorlage"
 
-#: ardour_ui.cc:2701 route_ui.cc:1872
+#: ardour_ui.cc:2924 route_ui.cc:1872
 msgid "A template already exists with that name. Do you want to overwrite it?"
 msgstr ""
 "Eine Vorlage mit diesem Namen existiert bereits Wollen Sie sie überschreiben?"
 
-#: ardour_ui.cc:2725
+#: ardour_ui.cc:2948
 msgid "Save Template"
 msgstr "Als Vorlage Speichern"
 
-#: ardour_ui.cc:2726
+#: ardour_ui.cc:2949
 msgid "Name for template:"
 msgstr "Name für Vorlage"
 
-#: ardour_ui.cc:2727
+#: ardour_ui.cc:2950
 msgid "-template"
 msgstr "-Vorlage"
 
-#: ardour_ui.cc:2764
+#: ardour_ui.cc:2987
 msgid ""
 "This session\n"
 "%1\n"
@@ -1335,39 +1461,39 @@ msgstr ""
 "%1\n"
 "existiert bereits. Wollen Sie es öffnen?"
 
-#: ardour_ui.cc:2774
+#: ardour_ui.cc:2997
 msgid "Open Existing Session"
 msgstr "Vorhandenes Projekt öffnen"
 
-#: ardour_ui.cc:3075
+#: ardour_ui.cc:3295
 msgid "There is no existing session at \"%1\""
 msgstr "Es gibt kein Projekt in: \"%1\""
 
-#: ardour_ui.cc:3169
+#: ardour_ui.cc:3391
 msgid "Please wait while %1 loads your session"
 msgstr "Bitte warten Sie, während %1 das Projekt lädt"
 
-#: ardour_ui.cc:3184
+#: ardour_ui.cc:3406
 msgid "Port Registration Error"
 msgstr "Fehler bei der Registrierung von Ports"
 
-#: ardour_ui.cc:3185
+#: ardour_ui.cc:3407
 msgid "Click the Close button to try again."
 msgstr "Klicken Sie auf Schließen, um es erneut zu versuchen."
 
-#: ardour_ui.cc:3204
+#: ardour_ui.cc:3426
 msgid "Session \"%1 (snapshot %2)\" did not load successfully: %3"
 msgstr "Projekt \"%1 (Schnappschuss %2)\" konnte nicht geladen werden: %3"
 
-#: ardour_ui.cc:3210 ardour_ui.cc:3231 ardour_ui.cc:3328 ardour_ui.cc:3337
+#: ardour_ui.cc:3432 ardour_ui.cc:3453 ardour_ui.cc:3548 ardour_ui.cc:3557
 msgid "Loading Error"
 msgstr "Fehler beim Laden"
 
-#: ardour_ui.cc:3225
+#: ardour_ui.cc:3447
 msgid "Session \"%1 (snapshot %2)\" did not load successfully"
 msgstr "Projekt  \"%1 (Schnappschuss %2)\" konnte nicht geladen werden."
 
-#: ardour_ui.cc:3253
+#: ardour_ui.cc:3475
 msgid ""
 "This session has been opened in read-only mode.\n"
 "\n"
@@ -1377,19 +1503,19 @@ msgstr ""
 "\n"
 "Aufnehmen oder Speichern wird nicht möglich sein."
 
-#: ardour_ui.cc:3258
+#: ardour_ui.cc:3480
 msgid "Read-only Session"
 msgstr "Schreibgeschütztes Projekt"
 
-#: ardour_ui.cc:3327
+#: ardour_ui.cc:3547
 msgid "Could not create session in \"%1\": %2"
 msgstr "Konnte Projekt in \"%1\" nicht erstellen: %2"
 
-#: ardour_ui.cc:3336
+#: ardour_ui.cc:3556
 msgid "Could not create session in \"%1\""
 msgstr "Konnte kein Projekt in \"%1\" anlegen"
 
-#: ardour_ui.cc:3376
+#: ardour_ui.cc:3601
 msgid ""
 "<b>Just ask and wait for an answer.\n"
 "It may take from minutes to hours.</b>"
@@ -1397,11 +1523,11 @@ msgstr ""
 "<b>Stellen Sie Ihre Frage und warten auf Antwort.\n"
 "Es kann ein paar Minuten, aber vielleicht auch Stunden dauern.</b>"
 
-#: ardour_ui.cc:3378
+#: ardour_ui.cc:3603
 msgid "About the Chat"
 msgstr "Ãœber den Chat"
 
-#: ardour_ui.cc:3379
+#: ardour_ui.cc:3604
 msgid ""
 "When you're inside the chat just ask your question and wait for an answer. "
 "The chat is occupied by real people with real lives so many of them are "
@@ -1421,16 +1547,16 @@ msgstr ""
 "Lassen Sie einfach Ihr Chatfenster geöffnet und schauen gelegentlich nach, "
 "bis jemand auf Ihre Fragen geantwortet hat."
 
-#: ardour_ui.cc:3498
+#: ardour_ui.cc:3723
 msgid "No files were ready for clean-up"
 msgstr "Keine Audiodateien zum Aufräumen vorhanden"
 
-#: ardour_ui.cc:3502 ardour_ui.cc:3512 ardour_ui.cc:3645 ardour_ui.cc:3652
-#: ardour_ui_ed.cc:104
+#: ardour_ui.cc:3727 ardour_ui.cc:3737 ardour_ui.cc:3870 ardour_ui.cc:3877
+#: ardour_ui_ed.cc:129
 msgid "Clean-up"
 msgstr "Aufräumen"
 
-#: ardour_ui.cc:3503
+#: ardour_ui.cc:3728
 msgid ""
 "If this seems suprising, \n"
 "check for any existing snapshots.\n"
@@ -1442,19 +1568,19 @@ msgstr ""
 "sind sie wahrscheinlich noch in einem\n"
 "älteren Schnappschuss als Region eingebunden."
 
-#: ardour_ui.cc:3562
+#: ardour_ui.cc:3787
 msgid "kilo"
 msgstr "kilo"
 
-#: ardour_ui.cc:3565
+#: ardour_ui.cc:3790
 msgid "mega"
 msgstr "mega"
 
-#: ardour_ui.cc:3568
+#: ardour_ui.cc:3793
 msgid "giga"
 msgstr "giga"
 
-#: ardour_ui.cc:3573
+#: ardour_ui.cc:3798
 msgid ""
 "The following file was deleted from %2,\n"
 "releasing %3 %4bytes of disk space"
@@ -1468,7 +1594,7 @@ msgstr[1] ""
 "Die folgenden %1 Dateien wurden von %2\n"
 "gelöscht und gaben %3 %4bytes Speicherplatz frei"
 
-#: ardour_ui.cc:3580
+#: ardour_ui.cc:3805
 msgid ""
 "The following file was not in use and \n"
 "has been moved to: %2\n"
@@ -1506,11 +1632,11 @@ msgstr[1] ""
 "\n"
 "%3 %4bytes Speicherplatz freigegeben werden.\n"
 
-#: ardour_ui.cc:3640
+#: ardour_ui.cc:3865
 msgid "Are you sure you want to clean-up?"
 msgstr "Wollen Sie wirklich aufräumen?"
 
-#: ardour_ui.cc:3647
+#: ardour_ui.cc:3872
 msgid ""
 "Clean-up is a destructive operation.\n"
 "ALL undo/redo information will be lost if you clean-up.\n"
@@ -1522,41 +1648,65 @@ msgstr ""
 "Nach dem Aufräumen werden alle nicht benötigten Audiodateien in den \"dead "
 "sounds\" Ordner verschoben."
 
-#: ardour_ui.cc:3655
+#: ardour_ui.cc:3880
 msgid "CleanupDialog"
 msgstr "Aufräumdialog"
 
-#: ardour_ui.cc:3685
+#: ardour_ui.cc:3910
 msgid "Cleaned Files"
 msgstr "Aufgeräumte Dateien"
 
-#: ardour_ui.cc:3702
+#: ardour_ui.cc:3927
 msgid "deleted file"
 msgstr "gelöschte Datei"
 
-#: ardour_ui.cc:3895
+#: ardour_ui.cc:4133
+msgid "Cannot read session script '%1': %2"
+msgstr "Kann Projektskript '%1' nicht lesen: %2"
+
+#: ardour_ui.cc:4142 luainstance.cc:1104
+msgid "Set Script Parameters"
+msgstr "Skript-Parameter setzen"
+
+#: ardour_ui.cc:4153
+msgid "Session script '%1' instantiation failed: %2"
+msgstr "Projektskript '%1' - Instantiierung fehlgeschlagen: %2"
+
+#: ardour_ui.cc:4157
+msgid "Loading Session script '%1' failed: %2"
+msgstr "Laden des Projektskripts '%1' fehlgeschlagen: %2"
+
+#: ardour_ui.cc:4170
+msgid "There are no active Lua session scripts present in this session."
+msgstr "In diesem Projekt sind keine aktiven Luaskripte vorhanden."
+
+#: ardour_ui.cc:4187
+msgid "Session script '%1' removal failed: %2"
+msgstr "Entfernen des Projektskripts '%1' fehlgeschlagen: %2"
+
+#: ardour_ui.cc:4197
 msgid "Video-Server was not launched by %1. The request to stop it is ignored."
 msgstr ""
 "Der Video-Server wurde nicht von %1 gestartet. Die Aufforderung ihn zu "
 "beenden wird ignoriert."
 
-#: ardour_ui.cc:3899
+#: ardour_ui.cc:4201
 msgid "Stop Video-Server"
 msgstr "Video-Server anhalten"
 
-#: ardour_ui.cc:3900
+#: ardour_ui.cc:4202
 msgid "Do you really want to stop the Video Server?"
 msgstr "Wollen Sie den Video-Server wirklich anhalten?"
 
-#: ardour_ui.cc:3903
+#: ardour_ui.cc:4205
 msgid "Yes, Stop It"
 msgstr "Ja, anhalten."
 
-#: ardour_ui.cc:3929
+#: ardour_ui.cc:4231
 msgid "The Video Server is already started."
 msgstr "Der Video-Server läuft bereits"
 
-#: ardour_ui.cc:3931
+#: ardour_ui.cc:4233
 msgid ""
 "An external Video Server is configured and can be reached. Not starting a "
 "new instance."
@@ -1564,7 +1714,7 @@ msgstr ""
 "Ein externer Video-Server wurde konfiguriert, ist aber nicht erreichbar. Es "
 "wird keine neue Instanz gestartet."
 
-#: ardour_ui.cc:3939 ardour_ui.cc:4044
+#: ardour_ui.cc:4241 ardour_ui.cc:4346
 msgid ""
 "Could not connect to the Video Server. Start it or configure its access URL "
 "in Preferences."
@@ -1573,48 +1723,48 @@ msgstr ""
 "ihn vorher starten oder die URL für den Zugriff in den Einstellungen "
 "anpassen."
 
-#: ardour_ui.cc:3969
+#: ardour_ui.cc:4271
 msgid "Specified docroot is not an existing directory."
 msgstr "Das eingestellte Dokumentenverzeichnis existiert nicht."
 
-#: ardour_ui.cc:3975 ardour_ui.cc:3981
+#: ardour_ui.cc:4277 ardour_ui.cc:4283
 msgid "Given Video Server is not an executable file."
 msgstr "Der eingestellte Video-Server ist keine ausführbare Datei."
 
-#: ardour_ui.cc:4015
+#: ardour_ui.cc:4317
 msgid "Cannot launch the video-server"
 msgstr "Kann den Videoserver nicht starten "
 
-#: ardour_ui.cc:4025
+#: ardour_ui.cc:4327
 msgid "Video-server was started but does not respond to requests..."
 msgstr "Viideoserver wurde gestartet, reagiert aber nicht auf Anfragen..."
 
-#: ardour_ui.cc:4070 editor_audio_import.cc:644
+#: ardour_ui.cc:4372 editor_audio_import.cc:647
 msgid "could not open %1"
 msgstr "Konnte %1 nicht öffnen"
 
-#: ardour_ui.cc:4074
+#: ardour_ui.cc:4376
 msgid "no video-file selected"
 msgstr "Es wurde keine Videodatei ausgewählt."
 
-#: ardour_ui.cc:4170
+#: ardour_ui.cc:4472
 msgid "No LTC detected, video will not be aligned."
 msgstr "Kein LTC entdeckt, Video wird nicht ausgerichtet."
 
-#: ardour_ui.cc:4176
+#: ardour_ui.cc:4478
 msgid "Align video-start to %1 [samples]"
 msgstr "Richte Video auf %1 [samples] aus"
 
-#: ardour_ui.cc:4310
+#: ardour_ui.cc:4654
 msgid "xrun"
 msgstr "xrun"
 
-#: ardour_ui.cc:4319
+#: ardour_ui.cc:4663
 msgid "Recording was stopped because your system could not keep up."
 msgstr ""
 "Die Aufnahme wurde gestoppt, da Ihr System nicht schnell genug folgen konnte."
 
-#: ardour_ui.cc:4348
+#: ardour_ui.cc:4692
 msgid ""
 "The disk system on your computer\n"
 "was not able to keep up with %1.\n"
@@ -1628,23 +1778,23 @@ msgstr ""
 "Die Daten konnten nicht schnell genug geschrieben\n"
 "werden, um die Aufnahme fortzuführen.\n"
 
-#: ardour_ui.cc:4421
+#: ardour_ui.cc:4765
 msgid "Scanning for plugins"
 msgstr "Suche nach Plugins"
 
-#: ardour_ui.cc:4423
+#: ardour_ui.cc:4767
 msgid "Cancel plugin scan"
 msgstr "Plugin-Suche abbrechen"
 
-#: ardour_ui.cc:4432
+#: ardour_ui.cc:4776
 msgid "Stop Timeout"
 msgstr "Stopp-Timeout"
 
-#: ardour_ui.cc:4439
+#: ardour_ui.cc:4783
 msgid "Scan Timeout"
 msgstr "Such-Timeout"
 
-#: ardour_ui.cc:4483
+#: ardour_ui.cc:4827
 msgid ""
 "The disk system on your computer\n"
 "was not able to keep up with %1.\n"
@@ -1658,11 +1808,11 @@ msgstr ""
 "Die Daten konnten nicht schnell genug gelesen\n"
 "werden, um die Wiedergabe aufrechtzuerhalten.\n"
 
-#: ardour_ui.cc:4523
+#: ardour_ui.cc:4862
 msgid "Crash Recovery"
 msgstr "Absturz-Wiederherstellung"
 
-#: ardour_ui.cc:4524
+#: ardour_ui.cc:4863
 msgid ""
 "This session appears to have been in the\n"
 "middle of recording when %1 or\n"
@@ -1680,19 +1830,19 @@ msgstr ""
 "für Sie wiederherstellen oder sie verwerfen.\n"
 "Bitte entscheiden Sie, wie Sie vorgehen möchten.\n"
 
-#: ardour_ui.cc:4536
+#: ardour_ui.cc:4875
 msgid "Ignore crash data"
 msgstr "Daten verwerfen"
 
-#: ardour_ui.cc:4537
+#: ardour_ui.cc:4876
 msgid "Recover from crash"
 msgstr "Daten wiederherstellen"
 
-#: ardour_ui.cc:4557
+#: ardour_ui.cc:4896
 msgid "Sample Rate Mismatch"
 msgstr "Samplerate passt nicht"
 
-#: ardour_ui.cc:4558
+#: ardour_ui.cc:4897
 msgid ""
 "This session was created with a sample rate of %1 Hz, but\n"
 "%2 is currently running at %3 Hz.  If you load this session,\n"
@@ -1703,15 +1853,29 @@ msgstr ""
 "%2 läuft derzeit mit %3 Hz. Wenn Sie dieses Projekt laden, \n"
 "wird Ihr Audiomaterial mit der falschen Samplerate abgespielt.\n"
 
-#: ardour_ui.cc:4567
+#: ardour_ui.cc:4906
 msgid "Do not load session"
 msgstr "Projekt nicht laden"
 
-#: ardour_ui.cc:4568
+#: ardour_ui.cc:4907
 msgid "Load session anyway"
 msgstr "Projekt trotzdem laden"
 
-#: ardour_ui.cc:4860
+#: ardour_ui.cc:4927
+msgid ""
+"This session was created with a sample rate of %1 Hz, but\n"
+"%2 is currently running at %3 Hz.\n"
+"Audio will be recorded and played at the wrong sample rate.\n"
+"Re-Configure the Audio Engine in\n"
+"Menu > Window > Audio/Midi Setup"
+msgstr ""
+"Dieses Projekt wurde mit einer Samplerate von %1 Hz erzeugt,\n"
+"aber %2 läuft momentan mit %3 Hz. \n"
+"Audio wird mit der falschen Samplerate aufgenommen und abgespielt.\n"
+"Konfigurieren Sie die Audioengine in\n"
+"Menü > Fenster > Audio/MIDI-Setup neu."
+
+#: ardour_ui.cc:5209
 msgid ""
 "%4This is a session from an older version of %3%5\n"
 "\n"
@@ -1723,100 +1887,91 @@ msgid ""
 "\n"
 "%6%2%7\n"
 "\n"
-"From now on, use the -2000 version with older versions of %3"
+"From now on, use the backup copy with older versions of %3"
 msgstr ""
-"%4Dies ist ein Projekt, das mit einer älteren Version von %3 erstellt wurde"
-"%5\n"
+"%4Dieses Projekt wurde mit einer älteren Version von %3%5 erstellt\n"
 "\n"
-"%3 hat die alte Projektdatei\n"
+"%3 hat die Projektdatei\n"
 "\n"
 "%6%1%7\n"
 "\n"
 "nach\n"
 "\n"
-"%6%2%7 kopiert.\n"
+"%6%2%7 kopiert\n"
 "\n"
-"Benutzen Sie von nun an die -2000 Version mit älteren Versionen von %3"
+"Benutzen Sie ab jetzt die Backup-Kopie mit älteren %3 Versionen"
 
-#: ardour_ui.cc:4977
+#: ardour_ui.cc:5331
 msgid "This is a free/demo copy of %1. It has just switched to silent mode."
 msgstr ""
 "Dies ist eine freie Demoversion von %1. Sie hat sich gerade stummgeschaltet."
 
-#: ardour_ui.cc:4983
+#: ardour_ui.cc:5337
 msgid "%1 is now silent"
 msgstr "%1 ist nun stumm"
 
-#: ardour_ui.cc:4985
+#: ardour_ui.cc:5339
 msgid ""
 "Please consider paying for a copy of %1 - you can pay whatever you want."
 msgstr ""
 "Bitte ziehen Sie in Erwägung, für eine Kopie von %1 einen Geldbetrag - in "
 "beliebiger Höhe - zu zahlen."
 
-#: ardour_ui.cc:4986
+#: ardour_ui.cc:5340
 msgid "Better yet become a subscriber - subscriptions start at US$1 per month."
 msgstr ""
 "Besser noch, werden Sie ein Abonnent - Abonnements beginnen bei US$1 pro "
 "Monat."
 
-#: ardour_ui.cc:4987
+#: ardour_ui.cc:5341
 msgid "Pay for a copy (via the web)"
 msgstr "Für eine Kopie zahlen (über das WWW)"
 
-#: ardour_ui.cc:4988
+#: ardour_ui.cc:5342
 msgid "Become a subscriber (via the web)"
 msgstr "Abonnent werden (über das Web)"
 
-#: ardour_ui.cc:5007
+#: ardour_ui.cc:5361
 msgid "Remain silent"
 msgstr "Stumm bleiben"
 
-#: ardour_ui.cc:5009
+#: ardour_ui.cc:5363
 msgid "Give me more time"
 msgstr "Ich möchte mehr Zeit haben"
 
-#: ardour_ui2.cc:73
-msgid "UI: cannot setup editor"
-msgstr "Der Editor konnte nicht initialisiert werden."
-
-#: ardour_ui2.cc:78
-msgid "UI: cannot setup mixer"
-msgstr "Der Mixer konnte nicht initialisiert werden."
-
-#: ardour_ui2.cc:83
-msgid "UI: cannot setup meterbridge"
-msgstr "UI: konnte Meterbridge nicht einrichten."
+#: ardour_ui.cc:5656
+msgid "Global keybindings are missing"
+msgstr "Globale Tastenzuordnungen fehlen"
 
-#: ardour_ui2.cc:128
+#: ardour_ui2.cc:79
 msgid "Play from playhead"
 msgstr "Wiedergabe ab Positionszeiger"
 
-#: ardour_ui2.cc:129
+#: ardour_ui2.cc:80
 msgid "Stop playback"
 msgstr "Wiedergabe anhalten"
 
-#: ardour_ui2.cc:130
+#: ardour_ui2.cc:81
 msgid "Toggle record"
 msgstr "Aufnahmestatus umschalten"
 
-#: ardour_ui2.cc:131
+#: ardour_ui2.cc:82
 msgid "Play range/selection"
 msgstr "Bereich/Auswahl wiedergeben"
 
-#: ardour_ui2.cc:132
+#: ardour_ui2.cc:83
 msgid "Go to start of session"
 msgstr "Zum Anfang des Projekts springen"
 
-#: ardour_ui2.cc:133
+#: ardour_ui2.cc:84
 msgid "Go to end of session"
 msgstr "Zum Ende des Projekts springen"
 
-#: ardour_ui2.cc:134
+#: ardour_ui2.cc:85
 msgid "Play loop range"
 msgstr "Schleife wiedergeben"
 
-#: ardour_ui2.cc:135
+#: ardour_ui2.cc:86
 msgid ""
 "MIDI Panic\n"
 "Send note off and reset controller messages on all MIDI channels"
@@ -1825,23 +1980,23 @@ msgstr ""
 "Schalte auf allen Midikanälen die Notensignale aus und setzte alle MIDI-"
 "Controller zurück"
 
-#: ardour_ui2.cc:136
+#: ardour_ui2.cc:87
 msgid "Return to last playback start when stopped"
 msgstr "Bei Stopp zum letzten Wiedergabepunkt springen"
 
-#: ardour_ui2.cc:137
+#: ardour_ui2.cc:88
 msgid "Playhead follows range selections and edits"
 msgstr "Positionszeiger folgt Auswahl und Bearbeitungen"
 
-#: ardour_ui2.cc:138
+#: ardour_ui2.cc:89
 msgid "Be sensible about input monitoring"
 msgstr "Automatisches Input Monitoring aktivieren"
 
-#: ardour_ui2.cc:139
+#: ardour_ui2.cc:90
 msgid "Enable/Disable audio click"
 msgstr "Aktiviert/Deaktiviert Klick"
 
-#: ardour_ui2.cc:140 monitor_section.cc:124
+#: ardour_ui2.cc:91 monitor_section.cc:129
 msgid ""
 "When active, something is soloed.\n"
 "Click to de-solo everything"
@@ -1849,7 +2004,7 @@ msgstr ""
 "Wenn aktiv, ist etwas auf Solo geschalten.\n"
 "Klick schaltet Solo überall aus."
 
-#: ardour_ui2.cc:141
+#: ardour_ui2.cc:92
 msgid ""
 "When active, auditioning is taking place.\n"
 "Click to stop the audition"
@@ -1857,11 +2012,11 @@ msgstr ""
 "Wenn aktiv, wird vorgehört.\n"
 "Klicken, um das Vorhören zu beenden"
 
-#: ardour_ui2.cc:142
+#: ardour_ui2.cc:93
 msgid "When active, there is a feedback loop."
 msgstr "Wenn aktiv, gibt es eine Rückkopplungsschleife."
 
-#: ardour_ui2.cc:143
+#: ardour_ui2.cc:94
 msgid ""
 "<b>Primary Clock</b> right-click to set display mode. Click to edit, click"
 "+drag a digit or mouse-over+scroll wheel to modify.\n"
@@ -1875,7 +2030,7 @@ msgstr ""
 "<tt>Eingabe</tt>: Bestätige; hänge '+' or '-' an, um Deltazeiten "
 "einzugeben.\n"
 
-#: ardour_ui2.cc:144
+#: ardour_ui2.cc:95
 msgid ""
 "<b>Secondary Clock</b> right-click to set display mode. Click to edit, click"
 "+drag a digit or mouse-over+scroll wheel to modify.\n"
@@ -1889,489 +2044,557 @@ msgstr ""
 "<tt>Eingabe</tt>: Bestätige; hänge '+' or '-' an, um Deltazeiten "
 "einzugeben.\n"
 
-#: ardour_ui2.cc:145
+#: ardour_ui2.cc:96
 msgid "Reset All Peak Indicators"
 msgstr "Alle Spitzenwertanzeigen zurücksetzen"
 
-#: ardour_ui2.cc:146
+#: ardour_ui2.cc:97
 msgid "Show Error Log and acknowledge warnings"
 msgstr "Zeige Fehlermeldungen und bestätige Warnungen"
 
-#: ardour_ui2.cc:179
+#: ardour_ui2.cc:130
 msgid "[ERROR]: "
 msgstr "[FEHLER]:"
 
-#: ardour_ui2.cc:182
+#: ardour_ui2.cc:133
 msgid "[WARNING]: "
 msgstr "[WARNUNG]:"
 
-#: ardour_ui2.cc:185
+#: ardour_ui2.cc:136
 msgid "[INFO]: "
 msgstr "[INFO]: "
 
-#: ardour_ui2.cc:255 ardour_ui_ed.cc:430
+#: ardour_ui2.cc:197 ardour_ui_ed.cc:509
 msgid "Auto Return"
 msgstr "Auto Return"
 
-#: ardour_ui2.cc:257 ardour_ui_ed.cc:433
+#: ardour_ui2.cc:199 ardour_ui_ed.cc:512
 msgid "Follow Edits"
 msgstr "Folge Bearbeitungen"
 
-#: ardour_ui2.cc:704 rc_option_editor.cc:2895
+#: ardour_ui2.cc:422 ardour_ui2.cc:426 ardour_ui2.cc:430
+msgid ""
+"Drag this tab to the desktop to show %1 in its own window\n"
+"\n"
+"To put the window back, use the Window > %1 > Attach menu action"
+msgstr ""
+"Ziehen Sie diesen Tab auf die Arbeitsfläche, um %1 in einem eigenen Fenster "
+"anzuzeigen\n"
+"\n"
+"Um das Fenster wieder anzuheften, benutzen Sie die den Menüeintrag Fenster > "
+"Anheften"
+
+#: ardour_ui2.cc:638
 msgid "GUI"
 msgstr "GUI"
 
-#: ardour_ui2.cc:721 rc_option_editor.cc:1734 rc_option_editor.cc:1752
-#: rc_option_editor.cc:1755 rc_option_editor.cc:1757 rc_option_editor.cc:1759
-#: rc_option_editor.cc:1767 rc_option_editor.cc:1769 rc_option_editor.cc:1777
-#: rc_option_editor.cc:1785 rc_option_editor.cc:1792 rc_option_editor.cc:1801
-#: rc_option_editor.cc:1803 rc_option_editor.cc:1805 rc_option_editor.cc:1813
-#: rc_option_editor.cc:1815 rc_option_editor.cc:1824
-#: session_option_editor.cc:342 session_option_editor.cc:344
-#: session_option_editor.cc:365 session_option_editor.cc:367
-#: session_option_editor.cc:369 session_option_editor.cc:376
-#: session_option_editor.cc:383 session_option_editor.cc:387
-msgid "Misc"
-msgstr "Allgemein"
+#: ardour_ui2.cc:651 rc_option_editor.cc:1941 rc_option_editor.cc:1943
+#: rc_option_editor.cc:1945
+msgid "Misc/Click"
+msgstr "Allgemein/Klick"
 
-#: ardour_ui_dependents.cc:77
+#: ardour_ui_dependents.cc:118
 msgid "Setup Editor"
 msgstr "Editor laden"
 
-#: ardour_ui_dependents.cc:79
+#: ardour_ui_dependents.cc:120
 msgid "Setup Mixer"
 msgstr "Mixer laden"
 
-#: ardour_ui_dependents.cc:85
+#: ardour_ui_dependents.cc:127
 msgid "Reload Session History"
 msgstr "Projekt-Aktionsverlauf laden"
 
-#: ardour_ui_dialogs.cc:251
+#: ardour_ui_dependents.cc:248
+msgid "UI: cannot setup editor"
+msgstr "Der Editor konnte nicht initialisiert werden."
+
+#: ardour_ui_dependents.cc:253
+msgid "UI: cannot setup mixer"
+msgstr "Der Mixer konnte nicht initialisiert werden."
+
+#: ardour_ui_dependents.cc:258
+msgid "UI: cannot setup meterbridge"
+msgstr "UI: konnte Meterbridge nicht einrichten."
+
+#: ardour_ui_dependents.cc:263
+msgid "UI: cannot setup luawindow"
+msgstr "UI: kann Luafenster nicht einrichten"
+
+#: ardour_ui_dependents.cc:269 ardour_ui_ed.cc:136 ardour_ui_ed.cc:257
+#: rc_option_editor.cc:1853 rc_option_editor.cc:3494
+msgid "Preferences"
+msgstr "Globale Einstellungen"
+
+#: ardour_ui_dependents.cc:270 ardour_ui_ed.cc:134 mixer_ui.cc:100
+#: mixer_ui.cc:410
+msgid "Mixer"
+msgstr "Mixer"
+
+#: ardour_ui_dependents.cc:271 ardour_ui_ed.cc:135 editor.cc:5791
+#: editor.cc:6063 public_editor.cc:34 rc_option_editor.cc:2201
+#: rc_option_editor.cc:2215 rc_option_editor.cc:2219 rc_option_editor.cc:2227
+#: rc_option_editor.cc:2236 rc_option_editor.cc:2244 rc_option_editor.cc:2253
+#: rc_option_editor.cc:2261 rc_option_editor.cc:2269 rc_option_editor.cc:2279
+#: rc_option_editor.cc:2281 rc_option_editor.cc:2305 rc_option_editor.cc:2317
+#: rc_option_editor.cc:2328 rc_option_editor.cc:2346
+msgid "Editor"
+msgstr "Editor"
+
+#: ardour_ui_dialogs.cc:263
 msgid "Don't close"
 msgstr "Abbrechen"
 
-#: ardour_ui_dialogs.cc:252
+#: ardour_ui_dialogs.cc:264
 msgid "Just close"
 msgstr "Ohne speichern schließen"
 
-#: ardour_ui_dialogs.cc:253
+#: ardour_ui_dialogs.cc:265
 msgid "Save and close"
 msgstr "Speichern und schließen"
 
-#: ardour_ui_dialogs.cc:363
-msgid "This screen is not tall enough to display the mixer window"
-msgstr ""
-"Dieser Bildschirm ist nicht hoch genug, um das Mixerfenster darzustellen"
+#: ardour_ui_ed.cc:124
+msgid "Escape"
+msgstr "Escape"
 
-#: ardour_ui_ed.cc:103
+#: ardour_ui_ed.cc:128
 msgid "Session"
 msgstr "Projekt"
 
-#: ardour_ui_ed.cc:106 editor_actions.cc:139 editor_regions.cc:119
-#: port_group.cc:468 session_option_editor.cc:82 session_option_editor.cc:89
+#: ardour_ui_ed.cc:131 editor_actions.cc:141 editor_regions.cc:163
+#: port_group.cc:469 session_option_editor.cc:82 session_option_editor.cc:89
 msgid "Sync"
 msgstr "Sync"
 
-#: ardour_ui_ed.cc:107
+#: ardour_ui_ed.cc:132
 msgid "Options"
 msgstr "Optionen"
 
-#: ardour_ui_ed.cc:108
+#: ardour_ui_ed.cc:133
 msgid "Window"
 msgstr "Fenster"
 
-#: ardour_ui_ed.cc:109
+#: ardour_ui_ed.cc:137 ardour_ui_ed.cc:267 ardour_ui_ed.cc:268
+#: ardour_ui_ed.cc:269
+msgid "Detach"
+msgstr "Ablösen"
+
+#: ardour_ui_ed.cc:138
 msgid "Help"
 msgstr "Hilfe"
 
-#: ardour_ui_ed.cc:110
+#: ardour_ui_ed.cc:139
 msgid "Misc. Shortcuts"
 msgstr "Verschiedenes"
 
-#: ardour_ui_ed.cc:111
+#: ardour_ui_ed.cc:140
 msgid "Audio File Format"
 msgstr "Audio-Dateiformat"
 
-#: ardour_ui_ed.cc:112
+#: ardour_ui_ed.cc:141
 msgid "File Type"
 msgstr "Dateiformat"
 
-#: ardour_ui_ed.cc:113 export_format_dialog.cc:67
+#: ardour_ui_ed.cc:142 export_format_dialog.cc:75
 msgid "Sample Format"
 msgstr "Sampleformat"
 
-#: ardour_ui_ed.cc:114 rc_option_editor.cc:2705 rc_option_editor.cc:2717
+#: ardour_ui_ed.cc:143 rc_option_editor.cc:2841
 msgid "Control Surfaces"
 msgstr "Eingabegeräte / Controller"
 
-#: ardour_ui_ed.cc:115 rc_option_editor.cc:2375 rc_option_editor.cc:2723
-#: rc_option_editor.cc:2725 rc_option_editor.cc:2735 rc_option_editor.cc:2742
-#: rc_option_editor.cc:2750 rc_option_editor.cc:2762 rc_option_editor.cc:2767
-#: rc_option_editor.cc:2769 rc_option_editor.cc:2774 rc_option_editor.cc:2781
-#: rc_option_editor.cc:2786 rc_option_editor.cc:2795 rc_option_editor.cc:2799
-#: rc_option_editor.cc:2808 rc_option_editor.cc:2816 rc_option_editor.cc:2820
-#: rc_option_editor.cc:2825 rc_option_editor.cc:2832 rc_option_editor.cc:2833
+#: ardour_ui_ed.cc:144 rc_option_editor.cc:2847 rc_option_editor.cc:2853
+#: rc_option_editor.cc:2862 rc_option_editor.cc:2873 rc_option_editor.cc:2883
+#: rc_option_editor.cc:2948 rc_option_editor.cc:2969 rc_option_editor.cc:2985
+#: rc_option_editor.cc:2986 rc_option_editor.cc:2995 rc_option_editor.cc:3009
+#: rc_option_editor.cc:3012 rc_option_editor.cc:3020 rc_option_editor.cc:3028
 msgid "Plugins"
 msgstr "Plugins"
 
-#: ardour_ui_ed.cc:116 rc_option_editor.cc:2969
+#: ardour_ui_ed.cc:145 rc_option_editor.cc:3176
 msgid "Metering"
 msgstr "Pegelanzeige"
 
-#: ardour_ui_ed.cc:117
+#: ardour_ui_ed.cc:146
 msgid "Fall Off Rate"
 msgstr "Abfall der Pegelanzeige"
 
-#: ardour_ui_ed.cc:118
+#: ardour_ui_ed.cc:147
 msgid "Hold Time"
 msgstr "Pegelanzeige halten"
 
-#: ardour_ui_ed.cc:119
+#: ardour_ui_ed.cc:148
 msgid "Denormal Handling"
 msgstr "Umgang mit Denormals"
 
-#: ardour_ui_ed.cc:123 route_time_axis.cc:1694
+#: ardour_ui_ed.cc:152 route_time_axis.cc:1683
 msgid "New..."
 msgstr "Neu..."
 
-#: ardour_ui_ed.cc:125
+#: ardour_ui_ed.cc:154
 msgid "Open..."
 msgstr "Öffnen..."
 
-#: ardour_ui_ed.cc:126
+#: ardour_ui_ed.cc:155
 msgid "Recent..."
 msgstr "Zuletzt verwendet..."
 
-#: ardour_ui_ed.cc:127 panner_editor.cc:29 playlist_selector.cc:64
+#: ardour_ui_ed.cc:156 panner_editor.cc:29 playlist_selector.cc:64
 msgid "Close"
 msgstr "Schließen"
 
-#: ardour_ui_ed.cc:130
+#: ardour_ui_ed.cc:159
 msgid "Add Track or Bus..."
 msgstr "Spur/Bus hinzufügen..."
 
-#: ardour_ui_ed.cc:135
+#: ardour_ui_ed.cc:163
 msgid "Duplicate Tracks/Busses..."
 msgstr "Spuren/Busse duplizieren..."
 
-#: ardour_ui_ed.cc:141
+#: ardour_ui_ed.cc:169
 msgid "Cancel Solo"
 msgstr "Solo abbrechen"
 
-#: ardour_ui_ed.cc:146
-msgid "Open Video"
-msgstr "Video öffnen"
+#: ardour_ui_ed.cc:173
+msgid "Session|Scripting"
+msgstr "Skripte "
+
+#: ardour_ui_ed.cc:176
+msgid "Add Lua Script..."
+msgstr "Lua-Skript hinzufügen..."
+
+#: ardour_ui_ed.cc:180
+msgid "Remove Lua Script"
+msgstr "Lua-Skript entfernen"
+
+#: ardour_ui_ed.cc:184
+msgid "Open Video..."
+msgstr "Video öffnen..."
 
-#: ardour_ui_ed.cc:149
+#: ardour_ui_ed.cc:187
 msgid "Remove Video"
 msgstr "Video entfernen"
 
-#: ardour_ui_ed.cc:152
-msgid "Export to Video File"
-msgstr "Exportiere Video-Datei"
+#: ardour_ui_ed.cc:190
+msgid "Export to Video File..."
+msgstr "Videodatei exportieren"
 
-#: ardour_ui_ed.cc:156
+#: ardour_ui_ed.cc:194
 msgid "Snapshot (& keep working on current version) ..."
 msgstr "Schnappschuss (& an dieser Version weiterarbeiten)..."
 
-#: ardour_ui_ed.cc:160
+#: ardour_ui_ed.cc:197
 msgid "Snapshot (& switch to new version) ..."
 msgstr "Schnappschuss (& zur neuen Version wechseln) ..."
 
-#: ardour_ui_ed.cc:164
+#: ardour_ui_ed.cc:200
+msgid "Quick Snapshot (& keep working on current version) ..."
+msgstr "Schneller Schnappschuss (& an aktueller Version weiterarbeiten) ..."
+
+#: ardour_ui_ed.cc:203
+msgid "Quick Snapshot (& switch to new version) ..."
+msgstr "Schneller Schnappschuss (& zu neuer Version wechseln) ..."
+
+#: ardour_ui_ed.cc:207
 msgid "Save As..."
 msgstr "Speichern unter..."
 
-#: ardour_ui_ed.cc:168 editor_actions.cc:1790 editor_markers.cc:903
-#: editor_snapshots.cc:136 mixer_strip.cc:1578 route_time_axis.cc:1690
+#: ardour_ui_ed.cc:210 editor_actions.cc:1788 editor_markers.cc:908
+#: editor_snapshots.cc:136 mixer_strip.cc:1661 route_time_axis.cc:1679
 msgid "Rename..."
 msgstr "Umbenennen..."
 
-#: ardour_ui_ed.cc:172
+#: ardour_ui_ed.cc:214
 msgid "Save Template..."
 msgstr "Als Vorlage Speichern..."
 
-#: ardour_ui_ed.cc:175
+#: ardour_ui_ed.cc:217
 msgid "Metadata"
 msgstr "Metadaten"
 
-#: ardour_ui_ed.cc:178
+#: ardour_ui_ed.cc:220
 msgid "Edit Metadata..."
 msgstr "Metadaten bearbeiten..."
 
-#: ardour_ui_ed.cc:181
+#: ardour_ui_ed.cc:223
 msgid "Import Metadata..."
 msgstr "Metadaten importieren..."
 
-#: ardour_ui_ed.cc:184
+#: ardour_ui_ed.cc:226
 msgid "Export to Audio File(s)..."
 msgstr "Exportiere Audio-Datei(en)..."
 
-#: ardour_ui_ed.cc:187
+#: ardour_ui_ed.cc:229
 msgid "Stem export..."
 msgstr "Stems exportieren..."
 
-#: ardour_ui_ed.cc:190 editor_export_audio.cc:66
-#: export_channel_selector.cc:190 export_channel_selector.cc:576
-#: export_dialog.cc:129 export_video_dialog.cc:80
+#: ardour_ui_ed.cc:232 editor_export_audio.cc:66 export_channel_selector.cc:190
+#: export_channel_selector.cc:578 export_dialog.cc:136
+#: export_video_dialog.cc:80
 msgid "Export"
 msgstr "Exportieren"
 
-#: ardour_ui_ed.cc:193
+#: ardour_ui_ed.cc:235
 msgid "Clean-up Unused Sources..."
 msgstr "Nicht benutzte Dateien entfernen..."
 
-#: ardour_ui_ed.cc:197
+#: ardour_ui_ed.cc:239
 msgid "Reset Peak Files"
 msgstr "Peakdateien zurücksetzen"
 
-#: ardour_ui_ed.cc:201
+#: ardour_ui_ed.cc:243
 msgid "Flush Wastebasket"
 msgstr "Müll leeren"
 
-#: ardour_ui_ed.cc:208
+#: ardour_ui_ed.cc:251
 msgid "Quit"
 msgstr "Beenden"
 
-#: ardour_ui_ed.cc:209 automation_time_axis.cc:543 editor_actions.cc:661
-#: editor_markers.cc:902 location_ui.cc:59 plugin_selector.cc:95
-#: route_time_axis.cc:866
+#: ardour_ui_ed.cc:252 ardour_ui_ed.cc:259 ardour_ui_ed.cc:260
+#: ardour_ui_ed.cc:261 automation_time_axis.cc:545 editor_actions.cc:686
+#: editor_markers.cc:907 location_ui.cc:61 plugin_selector.cc:97
+#: route_time_axis.cc:864
 msgid "Hide"
 msgstr "Verbergen"
 
-#: ardour_ui_ed.cc:213
+#: ardour_ui_ed.cc:263 ardour_ui_ed.cc:264 ardour_ui_ed.cc:265
+msgid "Attach"
+msgstr "Anheften"
+
+#: ardour_ui_ed.cc:275 ardour_ui_ed.cc:276 ardour_ui_ed.cc:277
+#: ardour_ui_ed.cc:283 ardour_ui_ed.cc:284 ardour_ui_ed.cc:285
+msgid "Change"
+msgstr "Ändern"
+
+#: ardour_ui_ed.cc:287
+msgid "Previous Tab"
+msgstr "Voriger Tab"
+
+#: ardour_ui_ed.cc:288
+msgid "Next Tab"
+msgstr "Nächster Tab"
+
+#: ardour_ui_ed.cc:290
+msgid "Toggle Editor & Mixer"
+msgstr "Editor & Mixer umschalten"
+
+#: ardour_ui_ed.cc:294
 msgid "Maximise Editor Space"
 msgstr "Editor maximieren"
 
-#: ardour_ui_ed.cc:214
+#: ardour_ui_ed.cc:295
 msgid "Maximise Mixer Space"
 msgstr "Mixerfenster maximieren"
 
-#: ardour_ui_ed.cc:215
-msgid "Show Toolbars"
-msgstr "Zeige Werkzeugleisten"
-
-#: ardour_ui_ed.cc:218
+#: ardour_ui_ed.cc:298
 msgid "Toggle Mixer List"
 msgstr "Mixerliste umschalten"
 
-#: ardour_ui_ed.cc:221
+#: ardour_ui_ed.cc:301
 msgid "Toggle Monitor Section Visibility"
 msgstr "Sichtbarkeit der Monitorsektion umschalten"
 
-#: ardour_ui_ed.cc:225
+#: ardour_ui_ed.cc:305
 msgid "Show more UI preferences"
 msgstr "Mehr UI-Einstellungen anzeigen"
 
-#: ardour_ui_ed.cc:227 mixer_ui.cc:2107 mixer_ui.cc:2113
-msgid "Window|Mixer"
-msgstr "Mixer"
-
-#: ardour_ui_ed.cc:228
-msgid "Toggle Editor+Mixer"
-msgstr "Editor+Mixer umschalten"
+#: ardour_ui_ed.cc:308
+msgid "Window|Scripting"
+msgstr "Skripte"
 
-#: ardour_ui_ed.cc:229 meterbridge.cc:216 meterbridge.cc:222
+#: ardour_ui_ed.cc:309 meterbridge.cc:214 meterbridge.cc:220
 msgid "Window|Meterbridge"
 msgstr "Meterbridge"
 
-#: ardour_ui_ed.cc:231
-msgid "Reattach All Tearoffs"
-msgstr "Alle Abreißmenüs wieder anheften"
-
-#: ardour_ui_ed.cc:233 midi_tracer.cc:45
+#: ardour_ui_ed.cc:311 midi_tracer.cc:45
 msgid "MIDI Tracer"
 msgstr "Midisignale verfolgen"
 
-#: ardour_ui_ed.cc:235
+#: ardour_ui_ed.cc:314
 msgid "Chat"
 msgstr "Chat"
 
-#: ardour_ui_ed.cc:237
+#: ardour_ui_ed.cc:316
 msgid "Help|Manual"
 msgstr "Handbuch"
 
-#: ardour_ui_ed.cc:238
+#: ardour_ui_ed.cc:317
 msgid "Manual|Reference"
 msgstr "Handbuch|Referenz"
 
-#: ardour_ui_ed.cc:239
+#: ardour_ui_ed.cc:318
 msgid "Report a Bug"
 msgstr "Einen Fehler melden"
 
-#: ardour_ui_ed.cc:240
+#: ardour_ui_ed.cc:319
 msgid "Cheat Sheet"
 msgstr "Cheat Sheet"
 
-#: ardour_ui_ed.cc:241
+#: ardour_ui_ed.cc:320
 msgid "Ardour Website"
 msgstr "Ardour Website"
 
-#: ardour_ui_ed.cc:242
+#: ardour_ui_ed.cc:321
 msgid "Ardour Development"
 msgstr "Ardour Entwicklung"
 
-#: ardour_ui_ed.cc:243
+#: ardour_ui_ed.cc:322
 msgid "User Forums"
 msgstr "Userforen"
 
-#: ardour_ui_ed.cc:244
+#: ardour_ui_ed.cc:323
 msgid "How to Report a Bug"
 msgstr "Wie man einen Fehler meldet"
 
-#: ardour_ui_ed.cc:246 plugin_ui.cc:419
+#: ardour_ui_ed.cc:325 luawindow.cc:100 luawindow.cc:654 plugin_ui.cc:420
 msgid "Save"
 msgstr "Speichern"
 
-#: ardour_ui_ed.cc:254 rc_option_editor.cc:1835 rc_option_editor.cc:1846
-#: rc_option_editor.cc:1857 rc_option_editor.cc:1868 rc_option_editor.cc:1877
-#: rc_option_editor.cc:1890 rc_option_editor.cc:1903 rc_option_editor.cc:1912
-#: rc_option_editor.cc:1922 rc_option_editor.cc:1939 rc_option_editor.cc:1941
-#: rc_option_editor.cc:1950 rc_option_editor.cc:1966 rc_option_editor.cc:1987
-#: rc_option_editor.cc:2005 rc_option_editor.cc:2007 rc_option_editor.cc:2024
-#: rc_option_editor.cc:2027 rc_option_editor.cc:2029 rc_option_editor.cc:2046
-#: rc_option_editor.cc:2057
+#: ardour_ui_ed.cc:333 rc_option_editor.cc:1975 rc_option_editor.cc:1986
+#: rc_option_editor.cc:1997 rc_option_editor.cc:2008 rc_option_editor.cc:2017
+#: rc_option_editor.cc:2030 rc_option_editor.cc:2043 rc_option_editor.cc:2052
+#: rc_option_editor.cc:2062 rc_option_editor.cc:2079 rc_option_editor.cc:2186
 msgid "Transport"
 msgstr "Transport"
 
-#: ardour_ui_ed.cc:260 engine_dialog.cc:88
+#: ardour_ui_ed.cc:339 engine_dialog.cc:88
 msgid "Stop"
 msgstr "Stopp"
 
-#: ardour_ui_ed.cc:263
+#: ardour_ui_ed.cc:342
 msgid "Roll"
 msgstr "Wiedergabe"
 
-#: ardour_ui_ed.cc:267 ardour_ui_ed.cc:270
+#: ardour_ui_ed.cc:346 ardour_ui_ed.cc:349
 msgid "Start/Stop"
 msgstr "Start/Stopp"
 
-#: ardour_ui_ed.cc:273
+#: ardour_ui_ed.cc:352
 msgid "Start/Continue/Stop"
 msgstr "Start/Stopp"
 
-#: ardour_ui_ed.cc:276
+#: ardour_ui_ed.cc:355
 msgid "Stop and Forget Capture"
 msgstr "Stopp + Aufnahme verwerfen"
 
-#: ardour_ui_ed.cc:286
+#: ardour_ui_ed.cc:365
 msgid "Transition to Roll"
 msgstr "Ãœbergang zu Wiedergabe"
 
-#: ardour_ui_ed.cc:290
+#: ardour_ui_ed.cc:369
 msgid "Transition to Reverse"
 msgstr "Übergang zu rückwärtiger Wiedergabe"
 
-#: ardour_ui_ed.cc:294
+#: ardour_ui_ed.cc:373
 msgid "Play Loop Range"
 msgstr "Schleife wiedergeben"
 
-#: ardour_ui_ed.cc:297
+#: ardour_ui_ed.cc:376
 msgid "Play Selection"
 msgstr "Auswahl abspielen"
 
-#: ardour_ui_ed.cc:300
+#: ardour_ui_ed.cc:379
 msgid "Play Selection w/Preroll"
 msgstr "Ausgewählten Bereich mit Vorlauf wiedergeben"
 
-#: ardour_ui_ed.cc:304
+#: ardour_ui_ed.cc:383
 msgid "Enable Record"
 msgstr "Aufnahme aktivieren"
 
-#: ardour_ui_ed.cc:307 ardour_ui_ed.cc:311
+#: ardour_ui_ed.cc:386 ardour_ui_ed.cc:390
 msgid "Start Recording"
 msgstr "Aufnahme starten"
 
-#: ardour_ui_ed.cc:315
+#: ardour_ui_ed.cc:394
 msgid "Rewind"
 msgstr "Rückwärts (beschleunigen)"
 
-#: ardour_ui_ed.cc:318
+#: ardour_ui_ed.cc:397
 msgid "Rewind (Slow)"
 msgstr "Rückwärts (langsam)"
 
-#: ardour_ui_ed.cc:321
+#: ardour_ui_ed.cc:400
 msgid "Rewind (Fast)"
 msgstr "Rückwärts (schnell)"
 
-#: ardour_ui_ed.cc:324
+#: ardour_ui_ed.cc:403
 msgid "Forward"
 msgstr "Vorwärts (beschleunigen)"
 
-#: ardour_ui_ed.cc:327
+#: ardour_ui_ed.cc:406
 msgid "Forward (Slow)"
 msgstr "Vorwärts (langsam)"
 
-#: ardour_ui_ed.cc:330
+#: ardour_ui_ed.cc:409
 msgid "Forward (Fast)"
 msgstr "Vorwärts (schnell)"
 
-#: ardour_ui_ed.cc:333
+#: ardour_ui_ed.cc:412
 msgid "Go to Zero"
 msgstr "Zum Nullpunkt springen"
 
-#: ardour_ui_ed.cc:336 ardour_ui_ed.cc:339
+#: ardour_ui_ed.cc:415 ardour_ui_ed.cc:418
 msgid "Go to Start"
 msgstr "Zum Anfang springen"
 
-#: ardour_ui_ed.cc:342
+#: ardour_ui_ed.cc:421
 msgid "Go to End"
 msgstr "Zum Ende springen"
 
-#: ardour_ui_ed.cc:345
+#: ardour_ui_ed.cc:424
 msgid "Go to Wall Clock"
 msgstr "Zur lokalen Uhrzeit springen"
 
-#: ardour_ui_ed.cc:350 ardour_ui_ed.cc:353
+#: ardour_ui_ed.cc:429 ardour_ui_ed.cc:432
 msgid "Numpad Decimal"
 msgstr "Nummernblock Dezimalpunkt"
 
-#: ardour_ui_ed.cc:356
+#: ardour_ui_ed.cc:435
 msgid "Numpad 0"
 msgstr "Nummernblock 0"
 
-#: ardour_ui_ed.cc:359
+#: ardour_ui_ed.cc:438
 msgid "Numpad 1"
 msgstr "Nummernblock 1"
 
-#: ardour_ui_ed.cc:362
+#: ardour_ui_ed.cc:441
 msgid "Numpad 2"
 msgstr "Nummernblock 2"
 
-#: ardour_ui_ed.cc:365
+#: ardour_ui_ed.cc:444
 msgid "Numpad 3"
 msgstr "Nummernblock 3"
 
-#: ardour_ui_ed.cc:368
+#: ardour_ui_ed.cc:447
 msgid "Numpad 4"
 msgstr "Nummernblock 4"
 
-#: ardour_ui_ed.cc:371
+#: ardour_ui_ed.cc:450
 msgid "Numpad 5"
 msgstr "Nummernblock 5"
 
-#: ardour_ui_ed.cc:374
+#: ardour_ui_ed.cc:453
 msgid "Numpad 6"
 msgstr "Nummernblock 6"
 
-#: ardour_ui_ed.cc:377
+#: ardour_ui_ed.cc:456
 msgid "Numpad 7"
 msgstr "Nummernblock 7"
 
-#: ardour_ui_ed.cc:380
+#: ardour_ui_ed.cc:459
 msgid "Numpad 8"
 msgstr "Nummernblock 8"
 
-#: ardour_ui_ed.cc:383
+#: ardour_ui_ed.cc:462
 msgid "Numpad 9"
 msgstr "Nummernblock 9"
 
-#: ardour_ui_ed.cc:387
+#: ardour_ui_ed.cc:466
 msgid "Focus On Clock"
 msgstr "Fokus auf Zeitanzeige setzen"
 
-#: ardour_ui_ed.cc:391 ardour_ui_ed.cc:400 audio_clock.cc:2116 editor.cc:261
-#: editor_actions.cc:585 editor_actions.cc:594 export_timespan_selector.cc:85
+#: ardour_ui_ed.cc:470 ardour_ui_ed.cc:479 audio_clock.cc:2122 editor.cc:321
+#: editor_actions.cc:610 editor_actions.cc:619 export_timespan_selector.cc:95
 #: session_option_editor.cc:41 session_option_editor.cc:61
 #: session_option_editor.cc:80 session_option_editor.cc:96
 #: session_option_editor.cc:109 session_option_editor.cc:122
@@ -2379,137 +2602,137 @@ msgstr "Fokus auf Zeitanzeige setzen"
 msgid "Timecode"
 msgstr "Timecode"
 
-#: ardour_ui_ed.cc:393 ardour_ui_ed.cc:402 editor_actions.cc:583
+#: ardour_ui_ed.cc:472 ardour_ui_ed.cc:481 editor_actions.cc:608
 msgid "Bars & Beats"
 msgstr "Takte & Schläge"
 
-#: ardour_ui_ed.cc:395 ardour_ui_ed.cc:404
+#: ardour_ui_ed.cc:474 ardour_ui_ed.cc:483
 msgid "Minutes & Seconds"
 msgstr "Minuten & Sekunden"
 
-#: ardour_ui_ed.cc:397 ardour_ui_ed.cc:406 audio_clock.cc:2120 editor.cc:262
-#: editor_actions.cc:584
+#: ardour_ui_ed.cc:476 ardour_ui_ed.cc:485 audio_clock.cc:2125 editor.cc:322
+#: editor_actions.cc:609
 msgid "Samples"
 msgstr "Samples"
 
-#: ardour_ui_ed.cc:409
+#: ardour_ui_ed.cc:488
 msgid "Punch In"
 msgstr "Punch In"
 
-#: ardour_ui_ed.cc:410 mixer_strip.cc:1901 mixer_strip.cc:2089 route_ui.cc:175
-#: time_info_box.cc:116
+#: ardour_ui_ed.cc:489 mixer_strip.cc:2000 mixer_strip.cc:2201 route_ui.cc:191
+#: time_info_box.cc:110
 msgid "In"
 msgstr "In"
 
-#: ardour_ui_ed.cc:413
+#: ardour_ui_ed.cc:492
 msgid "Punch Out"
 msgstr "Punch Out"
 
-#: ardour_ui_ed.cc:414 mixer_strip.cc:1913 time_info_box.cc:117
+#: ardour_ui_ed.cc:493 mixer_strip.cc:2012 time_info_box.cc:111
 msgid "Out"
 msgstr "Out"
 
-#: ardour_ui_ed.cc:417
+#: ardour_ui_ed.cc:496
 msgid "Punch In/Out"
 msgstr "Punch In/Out"
 
-#: ardour_ui_ed.cc:418
+#: ardour_ui_ed.cc:497
 msgid "In/Out"
 msgstr "In/Out"
 
-#: ardour_ui_ed.cc:421 rc_option_editor.cc:1801
+#: ardour_ui_ed.cc:500 rc_option_editor.cc:1941
 msgid "Click"
 msgstr "Klick"
 
-#: ardour_ui_ed.cc:424
+#: ardour_ui_ed.cc:503
 msgid "Auto Input"
 msgstr "Auto Input"
 
-#: ardour_ui_ed.cc:427
+#: ardour_ui_ed.cc:506
 msgid "Auto Play"
 msgstr "Auto Play"
 
-#: ardour_ui_ed.cc:438
+#: ardour_ui_ed.cc:517
 msgid "Sync Startup to Video"
 msgstr "Start mit Video synchronisieren"
 
-#: ardour_ui_ed.cc:440
+#: ardour_ui_ed.cc:519
 msgid "Time Master"
 msgstr "Time Master"
 
-#: ardour_ui_ed.cc:442
+#: ardour_ui_ed.cc:521
 msgid "Use External Positional Sync Source"
 msgstr "Benutze Externe Synchronisationsquelle"
 
-#: ardour_ui_ed.cc:447
+#: ardour_ui_ed.cc:526
 msgid "Toggle Record Enable Track %1"
 msgstr "Aufnahmebereitschaft auf Spur %1 umschalten"
 
-#: ardour_ui_ed.cc:454
+#: ardour_ui_ed.cc:533
 msgid "Percentage"
 msgstr "Prozent"
 
-#: ardour_ui_ed.cc:455 shuttle_control.cc:188
+#: ardour_ui_ed.cc:534 shuttle_control.cc:206
 msgid "Semitones"
 msgstr "Halbtöne"
 
-#: ardour_ui_ed.cc:459
+#: ardour_ui_ed.cc:538
 msgid "Send MTC"
 msgstr "MTC senden"
 
-#: ardour_ui_ed.cc:461
+#: ardour_ui_ed.cc:540
 msgid "Send MMC"
 msgstr "MMC senden"
 
-#: ardour_ui_ed.cc:463
+#: ardour_ui_ed.cc:542
 msgid "Use MMC"
 msgstr "Benutze MMC"
 
-#: ardour_ui_ed.cc:465 rc_option_editor.cc:2594
+#: ardour_ui_ed.cc:544 rc_option_editor.cc:2730
 msgid "Send MIDI Clock"
 msgstr "MIDI Clock senden"
 
-#: ardour_ui_ed.cc:467
+#: ardour_ui_ed.cc:546
 msgid "Send MIDI Feedback"
 msgstr "MIDI Feedback senden"
 
-#: ardour_ui_ed.cc:473
+#: ardour_ui_ed.cc:552
 msgid "Panic"
 msgstr "Panic"
 
-#: ardour_ui_ed.cc:567
+#: ardour_ui_ed.cc:618
 msgid "Wall Clock"
 msgstr "Uhrzeit"
 
-#: ardour_ui_ed.cc:569
+#: ardour_ui_ed.cc:620
 msgid "Disk Space"
 msgstr "Speicherplatz"
 
-#: ardour_ui_ed.cc:570
+#: ardour_ui_ed.cc:621
 msgid "DSP"
 msgstr "DSP"
 
-#: ardour_ui_ed.cc:571
+#: ardour_ui_ed.cc:622
 msgid "X-run"
 msgstr "X-run"
 
-#: ardour_ui_ed.cc:572
+#: ardour_ui_ed.cc:623
 msgid "Active Peak-file Work"
 msgstr "Peakdatei-Erstellung aktiv"
 
-#: ardour_ui_ed.cc:573
+#: ardour_ui_ed.cc:624
 msgid "Buffers"
 msgstr "Puffer"
 
-#: ardour_ui_ed.cc:575
+#: ardour_ui_ed.cc:626
 msgid "Timecode Format"
 msgstr "Timecode-Format"
 
-#: ardour_ui_ed.cc:576
+#: ardour_ui_ed.cc:627
 msgid "File Format"
 msgstr "Dateiformat"
 
-#: ardour_ui_options.cc:63
+#: ardour_ui_options.cc:55
 msgid ""
 "It is not possible to use JACK as the the sync source\n"
 "when the pull up/down setting is non-zero."
@@ -2517,131 +2740,135 @@ msgstr ""
 "Es ist nicht möglich, JACK als Synchronisationsquelle zu verwenden,\n"
 "wenn die Pull-up/down Einstellung nicht 0 ist."
 
-#: ardour_ui_options.cc:317
+#: ardour_ui_options.cc:309
 msgid "Internal"
 msgstr "Intern"
 
-#: ardour_ui_options.cc:509
+#: ardour_ui_options.cc:518
 msgid "Enable/Disable external positional sync"
 msgstr "Aktiviere/Deaktiviere externe Positionssynchronisierung"
 
-#: ardour_ui_options.cc:511
+#: ardour_ui_options.cc:520
 msgid "Sync to JACK is not possible: video pull up/down is set"
 msgstr "Synchronisation ist nicht möglich: Video pull-up/down ist aktiviert"
 
-#: audio_clock.cc:1051 audio_clock.cc:1070
+#: audio_clock.cc:1057 audio_clock.cc:1076
 msgid "--pending--"
 msgstr "--wartend--"
 
-#: audio_clock.cc:1122
+#: audio_clock.cc:1128
 msgid "SR"
 msgstr "SR"
 
-#: audio_clock.cc:1128 audio_clock.cc:1132
+#: audio_clock.cc:1134 audio_clock.cc:1138
 msgid "Pull"
 msgstr "Ziehen"
 
-#: audio_clock.cc:1130
+#: audio_clock.cc:1136
 #, c-format
 msgid "%+.4f%%"
 msgstr "%+.4f%%"
 
-#: audio_clock.cc:1286 editor.cc:263 editor_actions.cc:140
-#: editor_actions.cc:577
+#: audio_clock.cc:1292 editor.cc:323 editor_actions.cc:142
+#: editor_actions.cc:602
 msgid "Tempo"
 msgstr "Tempo"
 
-#: audio_clock.cc:1290 editor.cc:264 editor_actions.cc:578
+#: audio_clock.cc:1296 editor.cc:324 editor_actions.cc:603
 msgid "Meter"
 msgstr "Taktart"
 
-#: audio_clock.cc:1871 audio_streamview.cc:116 editor_actions.cc:1108
-#: session_metadata_dialog.cc:452 session_metadata_dialog.cc:500
-#: session_metadata_dialog.cc:556 session_metadata_dialog.cc:845
-#: streamview.cc:469
+#: audio_clock.cc:1878 audio_streamview.cc:117 editor_actions.cc:1092
+#: luainstance.cc:967 luainstance.cc:1593 plugin_pin_dialog.cc:859
+#: plugin_selector.cc:995 plugin_selector.cc:1016
+#: session_metadata_dialog.cc:455 session_metadata_dialog.cc:503
+#: session_metadata_dialog.cc:559 session_metadata_dialog.cc:848
+#: streamview.cc:474
 msgid "programming error: %1"
 msgstr "Programmierfehler: %1"
 
-#: audio_clock.cc:2004 audio_clock.cc:2032
+#: audio_clock.cc:2011 audio_clock.cc:2039
 msgid "programming error: %1 %2"
 msgstr "Programmierfehler: %1 %2"
 
-#: audio_clock.cc:2118 editor.cc:260 export_timespan_selector.cc:95
+#: audio_clock.cc:2123 editor.cc:320 export_timespan_selector.cc:105
 msgid "Bars:Beats"
 msgstr "Takte:Schläge"
 
-#: audio_clock.cc:2119 export_timespan_selector.cc:90
+#: audio_clock.cc:2124 export_timespan_selector.cc:100
 msgid "Minutes:Seconds"
 msgstr "Minuten:Sekunden"
 
-#: audio_clock.cc:2124
+#: audio_clock.cc:2129
 msgid "Set from Playhead"
 msgstr "Vom Wiedergabezeiger übernehmen"
 
-#: audio_clock.cc:2125
+#: audio_clock.cc:2130
 msgid "Locate to This Time"
 msgstr "Positionszeiger hierhin setzen"
 
-#: audio_clock.cc:2128
+#: audio_clock.cc:2133
 msgid "Copy to clipboard"
 msgstr "In die Zwischenablage kopieren"
 
-#: audio_region_editor.cc:65 control_point_dialog.cc:49 rhythm_ferret.cc:124
-#: rhythm_ferret.cc:129 rhythm_ferret.cc:134
+#: audio_region_editor.cc:60 control_point_dialog.cc:49 rhythm_ferret.cc:137
+#: rhythm_ferret.cc:154
 msgid "dB"
 msgstr "dB"
 
-#: audio_region_editor.cc:68
+#: audio_region_editor.cc:63
 msgid "Region gain:"
 msgstr "Regionen-Lautstärke:"
 
-#: audio_region_editor.cc:78 export_format_dialog.cc:43
+#: audio_region_editor.cc:73 export_format_dialog.cc:49 export_report.cc:772
+#: export_report.cc:1185 fft_graph.cc:497 normalize_dialog.cc:49
+#: strip_silence_dialog.cc:67
 msgid "dBFS"
 msgstr "dBFS"
 
-#: audio_region_editor.cc:81
+#: audio_region_editor.cc:76
 msgid "Peak amplitude:"
 msgstr "Spitzenamplitude"
 
-#: audio_region_editor.cc:92
+#: audio_region_editor.cc:87
 msgid "Calculating..."
 msgstr "Berechne..."
 
-#: audio_region_view.cc:1371
+#: audio_region_view.cc:1385
 msgid "add gain control point"
 msgstr "Lautstärkekurve bearbeiten"
 
-#: automation_controller.cc:290 automation_controller.cc:306
+#: automation_controller.cc:304 automation_controller.cc:320
 msgid "Select Note..."
 msgstr "Note selektieren..."
 
-#: automation_controller.cc:297
+#: automation_controller.cc:311
 msgid "Halve"
 msgstr "Halbiere"
 
-#: automation_controller.cc:300
+#: automation_controller.cc:314
 msgid "Double"
 msgstr "Verdopple"
 
-#: automation_controller.cc:311
+#: automation_controller.cc:325
 msgid "Set to %1 beat"
 msgid_plural "Set to %1 beats"
 msgstr[0] "Setze auf %1 Schlag"
 msgstr[1] "Setze auf %1 Schläge"
 
-#: automation_line.cc:285 editor_drag.cc:4255
+#: automation_line.cc:292 editor_drag.cc:4387
 msgid "automation event move"
 msgstr "Automationspunkt bewegen"
 
-#: automation_line.cc:881 region_gain_line.cc:75
+#: automation_line.cc:888 region_gain_line.cc:75
 msgid "remove control point"
 msgstr "Automationspunkt entfernen"
 
-#: automation_line.cc:1006
+#: automation_line.cc:1013
 msgid "Ignoring illegal points on AutomationLine \"%1\""
 msgstr "Unzulässige Automationspunkte werden ignoriert: \"%1\""
 
-#: automation_region_view.cc:193 automation_time_axis.cc:647
+#: automation_region_view.cc:193 automation_time_axis.cc:649
 msgid "add automation event"
 msgstr "Automationspunkt einfügen"
 
@@ -2659,59 +2886,59 @@ msgstr "Automationsmodus"
 msgid "hide track"
 msgstr "Diese Spur verbergen"
 
-#: automation_time_axis.cc:308 automation_time_axis.cc:360
-#: automation_time_axis.cc:554 gain_meter.cc:222 generic_pluginui.cc:526
-#: generic_pluginui.cc:820 panner_ui.cc:151
+#: automation_time_axis.cc:310 automation_time_axis.cc:362
+#: automation_time_axis.cc:556 gain_meter.cc:230 generic_pluginui.cc:601
+#: generic_pluginui.cc:948 panner_ui.cc:151
 msgid "Automation|Manual"
 msgstr "Manuell"
 
-#: automation_time_axis.cc:310 automation_time_axis.cc:371
-#: automation_time_axis.cc:559 editor.cc:1928 editor.cc:2006
-#: editor_actions.cc:123 editor_actions.cc:1939 gain_meter.cc:225
-#: generic_pluginui.cc:102 generic_pluginui.cc:529 generic_pluginui.cc:822
-#: midi_time_axis.cc:1614 midi_time_axis.cc:1617 midi_time_axis.cc:1620
+#: automation_time_axis.cc:312 automation_time_axis.cc:373
+#: automation_time_axis.cc:561 editor.cc:2034 editor.cc:2112
+#: editor_actions.cc:125 editor_actions.cc:1937 gain_meter.cc:232
+#: generic_pluginui.cc:101 generic_pluginui.cc:604 generic_pluginui.cc:950
+#: midi_time_axis.cc:1610 midi_time_axis.cc:1613 midi_time_axis.cc:1616
 #: panner_ui.cc:154
 msgid "Play"
 msgstr "Wiedergabe"
 
-#: automation_time_axis.cc:312 automation_time_axis.cc:382
-#: automation_time_axis.cc:564 gain_meter.cc:228 generic_pluginui.cc:104
-#: generic_pluginui.cc:532 generic_pluginui.cc:824 panner_ui.cc:157
+#: automation_time_axis.cc:314 automation_time_axis.cc:384
+#: automation_time_axis.cc:566 gain_meter.cc:234 generic_pluginui.cc:103
+#: generic_pluginui.cc:607 generic_pluginui.cc:952 panner_ui.cc:157
 msgid "Write"
 msgstr "Schreiben"
 
-#: automation_time_axis.cc:314 automation_time_axis.cc:393
-#: automation_time_axis.cc:569 gain_meter.cc:231 generic_pluginui.cc:106
-#: generic_pluginui.cc:535 generic_pluginui.cc:826 panner_ui.cc:160
+#: automation_time_axis.cc:316 automation_time_axis.cc:395
+#: automation_time_axis.cc:571 gain_meter.cc:236 generic_pluginui.cc:105
+#: generic_pluginui.cc:610 generic_pluginui.cc:954 panner_ui.cc:160
 msgid "Touch"
 msgstr "Ändern"
 
-#: automation_time_axis.cc:404 generic_pluginui.cc:538 meter_patterns.cc:118
+#: automation_time_axis.cc:406 generic_pluginui.cc:613 meter_patterns.cc:118
 msgid "???"
 msgstr "???"
 
-#: automation_time_axis.cc:445
+#: automation_time_axis.cc:447
 msgid "clear automation"
 msgstr "Automation zurücksetzen"
 
-#: automation_time_axis.cc:545 rc_option_editor.cc:2770
-#: rc_option_editor.cc:2775 rc_option_editor.cc:2821 rc_option_editor.cc:2826
+#: automation_time_axis.cc:547 rc_option_editor.cc:2919
+#: rc_option_editor.cc:2924 rc_option_editor.cc:2974 rc_option_editor.cc:2979
 msgid "Clear"
 msgstr "Leeren"
 
-#: automation_time_axis.cc:576
+#: automation_time_axis.cc:578
 msgid "State"
 msgstr "Automationssmodus"
 
-#: automation_time_axis.cc:592
+#: automation_time_axis.cc:594
 msgid "Discrete"
 msgstr "Diskret"
 
-#: automation_time_axis.cc:598 export_format_dialog.cc:489
+#: automation_time_axis.cc:600 export_format_dialog.cc:552
 msgid "Linear"
 msgstr "Linear"
 
-#: automation_time_axis.cc:604 rhythm_ferret.cc:109 shuttle_control.cc:207
+#: automation_time_axis.cc:606 rhythm_ferret.cc:118 shuttle_control.cc:225
 msgid "Mode"
 msgstr "Modus"
 
@@ -2727,35 +2954,38 @@ msgstr "Bundle editieren"
 msgid "Direction:"
 msgstr "Richtung:"
 
-#: bundle_manager.cc:206 bundle_manager.cc:210 engine_dialog.cc:949
-#: mixer_strip.cc:168 mixer_strip.cc:382 mixer_strip.cc:2347
-#: rc_option_editor.cc:2944
+#: bundle_manager.cc:206 bundle_manager.cc:210 engine_dialog.cc:976
+#: mixer_strip.cc:175 mixer_strip.cc:392 mixer_strip.cc:2459
+#: rc_option_editor.cc:3142
 msgid "Input"
 msgstr "Eingang"
 
 #: bundle_manager.cc:207 bundle_manager.cc:212 bundle_manager.cc:246
-#: engine_dialog.cc:951 mixer_strip.cc:172 mixer_strip.cc:386
-#: mixer_strip.cc:2350 monitor_section.cc:288 monitor_section.cc:292
-#: rc_option_editor.cc:2948
+#: engine_dialog.cc:978 mixer_strip.cc:179 mixer_strip.cc:396
+#: mixer_strip.cc:2462 monitor_section.cc:296 monitor_section.cc:300
+#: rc_option_editor.cc:3146
 msgid "Output"
 msgstr "Ausgang"
 
-#: bundle_manager.cc:265 editor.cc:1970 editor_actions.cc:95
-#: editor_actions.cc:105 rc_option_editor.cc:2782 rc_option_editor.cc:2796
+#: bundle_manager.cc:265 editor.cc:2076 editor_actions.cc:97
+#: editor_actions.cc:107 lua_script_manager.cc:33 rc_option_editor.cc:2931
+#: rc_option_editor.cc:2945
 msgid "Edit"
 msgstr "Bearbeiten"
 
-#: bundle_manager.cc:266 editor.cc:5948 editor.cc:5978 editor_actions.cc:346
-#: editor_actions.cc:347 plugin_ui.cc:420 processor_box.cc:2723
+#: bundle_manager.cc:266 editor.cc:5963 editor.cc:5993 editor_actions.cc:360
+#: editor_actions.cc:361 luawindow.cc:101 plugin_ui.cc:421
+#: processor_box.cc:3681 processor_box.cc:3683
 msgid "Delete"
 msgstr "Löschen"
 
 #: bundle_manager.cc:272 bundle_manager.cc:439 editor_route_groups.cc:98
-#: editor_routes.cc:208 midi_list_editor.cc:107 session_metadata_dialog.cc:646
+#: editor_routes.cc:233 lua_script_manager.cc:42 lua_script_manager.cc:76
+#: midi_list_editor.cc:107 session_metadata_dialog.cc:649
 msgid "Name"
 msgstr "Name"
 
-#: bundle_manager.cc:283
+#: bundle_manager.cc:283 luawindow.cc:566
 msgid "New"
 msgstr "Neu"
 
@@ -2771,6 +3001,38 @@ msgstr "Kanal hinzufügen"
 msgid "Rename Channel"
 msgstr "Kanal umbenennen"
 
+#: color_theme_manager.cc:58
+msgid "Restore Defaults"
+msgstr "Standards wiederherstellen"
+
+#: color_theme_manager.cc:62
+msgid "Color Theme"
+msgstr "Farbthema"
+
+#: color_theme_manager.cc:118
+msgid "Object"
+msgstr "Objekt"
+
+#: color_theme_manager.cc:121 route_group_dialog.cc:53 route_group_dialog.cc:81
+msgid "Color"
+msgstr "Farbe"
+
+#: color_theme_manager.cc:143
+msgid "Items"
+msgstr "Objekte"
+
+#: color_theme_manager.cc:144
+msgid "Palette"
+msgstr "Palette"
+
+#: color_theme_manager.cc:145
+msgid "Transparency"
+msgstr "Transparenz"
+
+#: color_theme_manager.cc:467
+msgid "Color Palette"
+msgstr "Farbpalette"
+
 #: configinfo.cc:28
 msgid "Build Configuration"
 msgstr "Build Configuration"
@@ -2783,6 +3045,18 @@ msgstr "Automationspunkt"
 msgid "Value"
 msgstr "Wert"
 
+#: control_slave_ui.cc:50 mixer_ui.cc:254
+msgid "Control Masters"
+msgstr "Kontroll-Master"
+
+#: control_slave_ui.cc:54
+msgid "-vca-"
+msgstr "-vca-"
+
+#: control_slave_ui.cc:211
+msgid "Unassign All"
+msgstr "Alle Zuweisungen aufheben"
+
 #: duplicate_routes_dialog.cc:35
 msgid "Duplicate Tracks & Busses"
 msgstr "Spuren und Busse duplizieren"
@@ -2844,596 +3118,602 @@ msgstr "Tonhöhe"
 msgid "Velocity"
 msgstr "Velocity"
 
-#: edit_note_dialog.cc:88 patch_change_dialog.cc:66
+#: edit_note_dialog.cc:88 export_report.cc:246 export_report.cc:688
+#: patch_change_dialog.cc:66
 msgid "Time"
 msgstr "Zeitpunkt"
 
-#: edit_note_dialog.cc:98 editor_regions.cc:118
-#: export_timespan_selector.cc:375 export_timespan_selector.cc:437
-#: location_ui.cc:322 midi_list_editor.cc:115 time_info_box.cc:108
+#: edit_note_dialog.cc:99 editor_regions.cc:162 export_timespan_selector.cc:415
+#: export_timespan_selector.cc:506 location_ui.cc:322 midi_list_editor.cc:115
+#: time_info_box.cc:102
 msgid "Length"
 msgstr "Länge"
 
-#: edit_note_dialog.cc:165
+#: edit_note_dialog.cc:166
 msgid "edit note"
 msgstr "Note bearbeiten"
 
-#: editor.cc:150
+#: editor.cc:160
 msgid "CD Frames"
 msgstr "CD-Frames"
 
-#: editor.cc:151
+#: editor.cc:161
 msgid "TC Frames"
 msgstr "TC Frames"
 
-#: editor.cc:152
+#: editor.cc:162
 msgid "TC Seconds"
 msgstr "TC Sekunden"
 
-#: editor.cc:153
+#: editor.cc:163
 msgid "TC Minutes"
 msgstr "TC Minuten"
 
-#: editor.cc:154
+#: editor.cc:164
 msgid "Seconds"
 msgstr "Sekunden"
 
-#: editor.cc:155
+#: editor.cc:165
 msgid "Minutes"
 msgstr "Minuten"
 
-#: editor.cc:156 quantize_dialog.cc:37 quantize_dialog.cc:141
+#: editor.cc:166 quantize_dialog.cc:37
 msgid "Beats/128"
 msgstr "Schläge/128"
 
-#: editor.cc:157 quantize_dialog.cc:38 quantize_dialog.cc:143
+#: editor.cc:167 quantize_dialog.cc:38
 msgid "Beats/64"
 msgstr "Schläge/64"
 
-#: editor.cc:158 quantize_dialog.cc:39 quantize_dialog.cc:145
+#: editor.cc:168 quantize_dialog.cc:39
 msgid "Beats/32"
 msgstr "Schläge/32"
 
-#: editor.cc:159
+#: editor.cc:169 quantize_dialog.cc:40
 msgid "Beats/28"
 msgstr "Schläge/28"
 
-#: editor.cc:160
+#: editor.cc:170 quantize_dialog.cc:41
 msgid "Beats/24"
 msgstr "Schläge/24"
 
-#: editor.cc:161
+#: editor.cc:171 quantize_dialog.cc:42
 msgid "Beats/20"
 msgstr "Schläge/20"
 
-#: editor.cc:162 quantize_dialog.cc:40 quantize_dialog.cc:147
+#: editor.cc:172 quantize_dialog.cc:43
 msgid "Beats/16"
 msgstr "Schläge/16"
 
-#: editor.cc:163
+#: editor.cc:173 quantize_dialog.cc:44
 msgid "Beats/14"
 msgstr "Schläge/14"
 
-#: editor.cc:164
+#: editor.cc:174 quantize_dialog.cc:45
 msgid "Beats/12"
 msgstr "Schläge/12"
 
-#: editor.cc:165
+#: editor.cc:175 quantize_dialog.cc:46
 msgid "Beats/10"
 msgstr "Schläge/10"
 
-#: editor.cc:166 quantize_dialog.cc:41 quantize_dialog.cc:149
+#: editor.cc:176 quantize_dialog.cc:47
 msgid "Beats/8"
 msgstr "Schläge/8"
 
-#: editor.cc:167
+#: editor.cc:177 quantize_dialog.cc:48
 msgid "Beats/7"
 msgstr "Schläge/7"
 
-#: editor.cc:168
+#: editor.cc:178 quantize_dialog.cc:49
 msgid "Beats/6"
 msgstr "Schläge/6"
 
-#: editor.cc:169
+#: editor.cc:179 quantize_dialog.cc:50
 msgid "Beats/5"
 msgstr "Schläge/5"
 
-#: editor.cc:170 quantize_dialog.cc:42 quantize_dialog.cc:151
+#: editor.cc:180 quantize_dialog.cc:51
 msgid "Beats/4"
 msgstr "Schläge/4"
 
-#: editor.cc:171 quantize_dialog.cc:43 quantize_dialog.cc:153
+#: editor.cc:181 quantize_dialog.cc:52
 msgid "Beats/3"
 msgstr "Schläge/3"
 
-#: editor.cc:172 quantize_dialog.cc:44 quantize_dialog.cc:155
+#: editor.cc:182 quantize_dialog.cc:53
 msgid "Beats/2"
 msgstr "Schläge/2"
 
-#: editor.cc:173 quantize_dialog.cc:45 quantize_dialog.cc:157
+#: editor.cc:183 quantize_dialog.cc:54
 msgid "Beats"
 msgstr "Schläge"
 
-#: editor.cc:174
+#: editor.cc:184
 msgid "Bars"
 msgstr "Takte"
 
-#: editor.cc:175
+#: editor.cc:185
 msgid "Marks"
 msgstr "Marker"
 
-#: editor.cc:176
+#: editor.cc:186
 msgid "Region starts"
 msgstr "Regionen-Anfang"
 
-#: editor.cc:177
+#: editor.cc:187
 msgid "Region ends"
 msgstr "Regionen-Ende"
 
-#: editor.cc:178
+#: editor.cc:188
 msgid "Region syncs"
 msgstr "Regionen-Sync"
 
-#: editor.cc:179
+#: editor.cc:189
 msgid "Region bounds"
 msgstr "Regionengrenzen"
 
-#: editor.cc:184 editor_actions.cc:526
+#: editor.cc:194 editor_actions.cc:551
 msgid "No Grid"
 msgstr "Raster aus"
 
-#: editor.cc:185 editor_actions.cc:527
+#: editor.cc:195 editor_actions.cc:552
 msgid "Grid"
 msgstr "Einrasten"
 
-#: editor.cc:186 editor_actions.cc:528
+#: editor.cc:196 editor_actions.cc:553
 msgid "Magnetic"
 msgstr "Magnetisch"
 
-#: editor.cc:191 editor.cc:209 editor_actions.cc:122 editor_actions.cc:509
+#: editor.cc:201 editor.cc:219 editor_actions.cc:124 editor_actions.cc:534
 msgid "Playhead"
 msgstr "Positionszeiger"
 
-#: editor.cc:192 editor_actions.cc:511
+#: editor.cc:202 editor_actions.cc:536
 msgid "Marker"
 msgstr "Marker"
 
-#: editor.cc:193 editor.cc:210 editor_actions.cc:510
+#: editor.cc:203 editor.cc:220 editor_actions.cc:535
 msgid "Mouse"
 msgstr "Maus"
 
-#: editor.cc:198 editor_actions.cc:518
+#: editor.cc:208 editor_actions.cc:543
 msgid "Slide"
 msgstr "Slide"
 
-#: editor.cc:199
+#: editor.cc:209
 msgid "Splice"
 msgstr "Splice"
 
-#: editor.cc:200 editor_actions.cc:517
+#: editor.cc:210 editor_actions.cc:542
 msgid "Ripple"
 msgstr "Ripple"
 
-#: editor.cc:201 editor_actions.cc:1808 editor_markers.cc:905
-#: editor_rulers.cc:259 location_ui.cc:60
+#: editor.cc:211 editor_actions.cc:1806 editor_markers.cc:910
+#: editor_rulers.cc:259 location_ui.cc:62
 msgid "Lock"
 msgstr "Lock"
 
-#: editor.cc:206 mono_panner_editor.cc:42
+#: editor.cc:216 mono_panner_editor.cc:44
 msgid "Left"
 msgstr "Links"
 
-#: editor.cc:207 mono_panner_editor.cc:47
+#: editor.cc:217 mono_panner_editor.cc:49
 msgid "Right"
 msgstr "Rechts"
 
-#: editor.cc:208
+#: editor.cc:218
 msgid "Center"
 msgstr "Mitte"
 
-#: editor.cc:211
+#: editor.cc:221
 msgid "Edit point"
 msgstr "Arbeitspunkt"
 
-#: editor.cc:217
+#: editor.cc:227
 msgid "Mushy"
 msgstr "Matschig"
 
-#: editor.cc:218
+#: editor.cc:228
 msgid "Smooth"
 msgstr "Klar"
 
-#: editor.cc:219
+#: editor.cc:229
 msgid "Balanced multitimbral mixture"
 msgstr "Ausgewogene multitimbrale Mischung"
 
-#: editor.cc:220
+#: editor.cc:230
 msgid "Unpitched percussion with stable notes"
 msgstr "Ungestimmte Perkussion mit stabilen Tönen"
 
-#: editor.cc:221
+#: editor.cc:231
 msgid "Crisp monophonic instrumental"
 msgstr "Klare monophone Instrumentalmusik"
 
-#: editor.cc:222
+#: editor.cc:232
 msgid "Unpitched solo percussion"
 msgstr "Ungestimmte Perkussion (solo)"
 
-#: editor.cc:223
+#: editor.cc:233
 msgid "Resample without preserving pitch"
 msgstr "Resampeln, ohne die Tonhöhe zu erhalten"
 
-#: editor.cc:259
+#: editor.cc:319
 msgid "Mins:Secs"
 msgstr "Min:Sek"
 
-#: editor.cc:265
+#: editor.cc:325
 msgid "Location Markers"
 msgstr "Positionsmarker"
 
-#: editor.cc:266
+#: editor.cc:326
 msgid "Range Markers"
 msgstr "Bereiche"
 
-#: editor.cc:267
+#: editor.cc:327
 msgid "Loop/Punch Ranges"
 msgstr "Schleifen/Punchbereiche"
 
-#: editor.cc:268 editor_actions.cc:581
+#: editor.cc:328 editor_actions.cc:606
 msgid "CD Markers"
 msgstr "CD-Marker"
 
-#: editor.cc:269
+#: editor.cc:329
 msgid "Video Timeline"
 msgstr "Video Zeitleiste"
 
-#: editor.cc:286
+#: editor.cc:386
 msgid "mode"
 msgstr "Modus"
 
-#: editor.cc:465 editor_actions.cc:115 editor_actions.cc:580
+#: editor.cc:535 editor_actions.cc:117 editor_actions.cc:605
 msgid "Markers"
 msgstr "Marker"
 
-#: editor.cc:583 rc_option_editor.cc:2393
+#: editor.cc:653 rc_option_editor.cc:2527
 msgid "Regions"
 msgstr "Regionen"
 
-#: editor.cc:584
+#: editor.cc:654
 msgid "Tracks & Busses"
 msgstr "Spuren & Busse"
 
-#: editor.cc:585
+#: editor.cc:655
 msgid "Snapshots"
 msgstr "Schnappschüsse"
 
-#: editor.cc:586
+#: editor.cc:656
 msgid "Track & Bus Groups"
 msgstr "Spuren & Bus-Gruppen"
 
-#: editor.cc:587
+#: editor.cc:657
 msgid "Ranges & Marks"
 msgstr "Bereiche & Marker"
 
-#: editor.cc:734 editor.cc:5800 rc_option_editor.cc:2061
-#: rc_option_editor.cc:2075 rc_option_editor.cc:2079 rc_option_editor.cc:2087
-#: rc_option_editor.cc:2095 rc_option_editor.cc:2104 rc_option_editor.cc:2113
-#: rc_option_editor.cc:2121 rc_option_editor.cc:2129 rc_option_editor.cc:2139
-#: rc_option_editor.cc:2141 rc_option_editor.cc:2165 rc_option_editor.cc:2177
-#: rc_option_editor.cc:2188 rc_option_editor.cc:2206 rc_option_editor.cc:2208
-#: rc_option_editor.cc:2211 rc_option_editor.cc:2220 rc_option_editor.cc:2238
-#: rc_option_editor.cc:2250 rc_option_editor.cc:2252
-msgid "Editor"
-msgstr "Editor"
-
-#: editor.cc:1348 editor.cc:4783 editor_actions.cc:135 editor_actions.cc:1884
+#: editor.cc:1334 editor.cc:4738 editor_actions.cc:137 editor_actions.cc:1882
 msgid "Loop"
 msgstr "Schleife"
 
-#: editor.cc:1354 editor.cc:4810 editor_actions.cc:136 time_info_box.cc:68
+#: editor.cc:1340 editor.cc:4765 editor_actions.cc:138 time_info_box.cc:62
 msgid "Punch"
 msgstr "Punch"
 
-#: editor.cc:1466 rc_option_editor.cc:2159
+#: editor.cc:1475 rc_option_editor.cc:2299
 msgid "Linear (for highly correlated material)"
 msgstr "Linear (für stark korreliertes Material)"
 
-#: editor.cc:1476 rc_option_editor.cc:2160
+#: editor.cc:1485 rc_option_editor.cc:2300
 msgid "Constant power"
 msgstr "Konstante Energie"
 
-#: editor.cc:1485 rc_option_editor.cc:2161
+#: editor.cc:1494 rc_option_editor.cc:2301
 msgid "Symmetric"
 msgstr "Symmetrisch"
 
-#: editor.cc:1495 rc_option_editor.cc:2162
+#: editor.cc:1504 rc_option_editor.cc:2302
 msgid "Slow"
 msgstr "Langsam"
 
-#: editor.cc:1504 rc_option_editor.cc:2163 sfdb_ui.cc:1767 sfdb_ui.cc:1878
+#: editor.cc:1513 rc_option_editor.cc:2303 sfdb_ui.cc:1737 sfdb_ui.cc:1847
 msgid "Fast"
 msgstr "Schnell"
 
-#: editor.cc:1526 editor.cc:1551
+#: editor.cc:1535 editor.cc:1560
 msgid "Deactivate"
 msgstr "Deaktivieren"
 
-#: editor.cc:1528 editor.cc:1553
+#: editor.cc:1537 editor.cc:1562
 msgid "Activate"
 msgstr "Aktivieren"
 
-#: editor.cc:1654 editor.cc:1662 editor_ops.cc:3855
+#: editor.cc:1663 editor.cc:1671 editor_ops.cc:3921
 msgid "Freeze"
 msgstr "Einfrieren"
 
-#: editor.cc:1658
+#: editor.cc:1667
 msgid "Unfreeze"
 msgstr "Auftauen"
 
-#: editor.cc:1797
+#: editor.cc:1767
+msgid "Region Loudness Analysis"
+msgstr "Loudness-Analyse der Region"
+
+#: editor.cc:1786 editor.cc:1835
+msgid "Audio Report/Analysis"
+msgstr "Audio Report/Analyse"
+
+#: editor.cc:1816
+msgid "Range Loudness Analysis"
+msgstr "Loudness-Analyse des Bereiches"
+
+#: editor.cc:1902
 msgid "Selected Regions"
 msgstr "Ausgewählte Regionen"
 
-#: editor.cc:1841 editor_markers.cc:940
+#: editor.cc:1946 editor_markers.cc:945
 msgid "Play Range"
 msgstr "Bereich wiedergeben"
 
-#: editor.cc:1842 editor_markers.cc:943
+#: editor.cc:1947 editor_markers.cc:948
 msgid "Loop Range"
 msgstr "Bereich in Schleife wiedergeben"
 
-#: editor.cc:1845 editor_markers.cc:950
+#: editor.cc:1950 editor_markers.cc:953
 msgid "Zoom to Range"
 msgstr "Auf Bereich zoomen"
 
-#: editor.cc:1854 editor_actions.cc:383
+#: editor.cc:1953
+msgid "Loudness Analysis"
+msgstr "Loudness-Analyse"
+
+#: editor.cc:1960 editor_actions.cc:401
 msgid "Move Range Start to Previous Region Boundary"
 msgstr "Anfang des Bereiches zur vorherigen Regiongrenze verschieben"
 
-#: editor.cc:1861 editor_actions.cc:390
+#: editor.cc:1967 editor_actions.cc:408
 msgid "Move Range Start to Next Region Boundary"
 msgstr "Anfang des Bereiches zur nächsten Regiongrenze verschieben"
 
-#: editor.cc:1868 editor_actions.cc:397
+#: editor.cc:1974 editor_actions.cc:415
 msgid "Move Range End to Previous Region Boundary"
 msgstr "Ende des Bereiches zur vorherigen Regiongrenze verschieben"
 
-#: editor.cc:1875 editor_actions.cc:404
+#: editor.cc:1981 editor_actions.cc:422
 msgid "Move Range End to Next Region Boundary"
 msgstr "Ende des Bereiches zur nächsten Regiongrenze verschieben"
 
-#: editor.cc:1881 editor_actions.cc:134 editor_actions.cc:333
+#: editor.cc:1987 editor_actions.cc:136 editor_actions.cc:347
 msgid "Separate"
 msgstr "Teilen"
 
-#: editor.cc:1882
+#: editor.cc:1988
 msgid "Convert to Region in Region List"
 msgstr "In Region umwanden (in Regionenliste hinzufügen)"
 
-#: editor.cc:1885 editor_markers.cc:970
+#: editor.cc:1991 editor_markers.cc:973
 msgid "Select All in Range"
 msgstr "Alles im Bereich auswählen"
 
-#: editor.cc:1888 editor_actions.cc:305
+#: editor.cc:1994 editor_actions.cc:319
 msgid "Set Loop from Selection"
 msgstr "Schleife aus Auswahl bilden"
 
-#: editor.cc:1889 editor_actions.cc:306
+#: editor.cc:1995 editor_actions.cc:320
 msgid "Set Punch from Selection"
 msgstr "Punch aus Auswahl bilden"
 
-#: editor.cc:1890 editor_actions.cc:307
+#: editor.cc:1996 editor_actions.cc:321
 msgid "Set Session Start/End from Selection"
 msgstr "Projektstart/ende auf Auswahl setzen"
 
-#: editor.cc:1893
+#: editor.cc:1999
 msgid "Add Range Markers"
 msgstr "Bereichsmarker einfügen"
 
-#: editor.cc:1896
+#: editor.cc:2002
 msgid "Crop Region to Range"
 msgstr "Region auf Bereich kürzen"
 
-#: editor.cc:1897 editor_actions.cc:319
+#: editor.cc:2003 editor_actions.cc:333
 msgid "Duplicate Range"
 msgstr "Bereich duplizieren"
 
-#: editor.cc:1900
+#: editor.cc:2006
 msgid "Consolidate Range"
 msgstr "Bereich als neue Region pre-Mixer"
 
-#: editor.cc:1901
+#: editor.cc:2007
 msgid "Consolidate Range with Processing"
 msgstr "Bereich zu neuer Region (mit Signalverarbeitung)"
 
-#: editor.cc:1902
+#: editor.cc:2008
 msgid "Bounce Range to Region List"
 msgstr "Auswahl zur Regionenliste bouncen"
 
-#: editor.cc:1903
+#: editor.cc:2009
 msgid "Bounce Range to Region List with Processing"
 msgstr "Bereich zur Regionenliste bouncen (mit Signalverarbeitung)"
 
-#: editor.cc:1904 editor_markers.cc:953
+#: editor.cc:2010 editor_markers.cc:956
 msgid "Export Range..."
 msgstr "Bereich exportieren..."
 
-#: editor.cc:1906
+#: editor.cc:2012
 msgid "Export Video Range..."
 msgstr "Videobereich exportieren..."
 
-#: editor.cc:1922 editor.cc:2004 editor_actions.cc:311
+#: editor.cc:2028 editor.cc:2110 editor_actions.cc:325
 msgid "Play from Edit Point"
 msgstr "Wiedergabe ab Arbeitspunkt"
 
-#: editor.cc:1923 editor.cc:2005
+#: editor.cc:2029 editor.cc:2111
 msgid "Play from Start"
 msgstr "Wiedergabe ab Beginn"
 
-#: editor.cc:1924
+#: editor.cc:2030
 msgid "Play Region"
 msgstr "Region wiedergeben"
 
-#: editor.cc:1926
+#: editor.cc:2032
 msgid "Loop Region"
 msgstr "Region in Schleife wiedergeben"
 
-#: editor.cc:1936 editor.cc:2014
+#: editor.cc:2042 editor.cc:2120
 msgid "Select All in Track"
 msgstr "Alles in der Spur auswählen"
 
-#: editor.cc:1937 editor.cc:2015 editor_actions.cc:195
+#: editor.cc:2043 editor.cc:2121 editor_actions.cc:196
 msgid "Select All Objects"
 msgstr "Alle Objekte auswählen"
 
-#: editor.cc:1938 editor.cc:2016
+#: editor.cc:2044 editor.cc:2122
 msgid "Invert Selection in Track"
 msgstr "Auswahl in der Spur umkehren"
 
-#: editor.cc:1939 editor.cc:2017 editor_actions.cc:198
+#: editor.cc:2045 editor.cc:2123 editor_actions.cc:199
 msgid "Invert Selection"
 msgstr "Auswahl umkehren"
 
-#: editor.cc:1941 editor_actions.cc:200
+#: editor.cc:2047 editor_actions.cc:201
 msgid "Set Range to Loop Range"
 msgstr "Bereich als Schleife auswählen"
 
-#: editor.cc:1942 editor_actions.cc:201
+#: editor.cc:2048 editor_actions.cc:202
 msgid "Set Range to Punch Range"
 msgstr "Bereich als Punchbereich"
 
-#: editor.cc:1943 editor_actions.cc:202
+#: editor.cc:2049 editor_actions.cc:203
 msgid "Set Range to Selected Regions"
 msgstr "Bereich auf ausgewählte Regionen setzen"
 
-#: editor.cc:1945 editor.cc:2019 editor_actions.cc:204 editor_actions.cc:205
+#: editor.cc:2051 editor.cc:2125 editor_actions.cc:205 editor_actions.cc:206
 msgid "Select All After Edit Point"
 msgstr "Alle Regionen nach dem Arbeitspunkt auswählen"
 
-#: editor.cc:1946 editor.cc:2020 editor_actions.cc:206 editor_actions.cc:207
+#: editor.cc:2052 editor.cc:2126 editor_actions.cc:207 editor_actions.cc:208
 msgid "Select All Before Edit Point"
 msgstr "Alle Regionen vor dem Arbeitspunkt auswählen"
 
-#: editor.cc:1947 editor.cc:2021
+#: editor.cc:2053 editor.cc:2127
 msgid "Select All After Playhead"
 msgstr "Alle Regionen nach dem Positionszeiger auswählen"
 
-#: editor.cc:1948 editor.cc:2022
+#: editor.cc:2054 editor.cc:2128
 msgid "Select All Before Playhead"
 msgstr "Alle Regionen vor dem Positionszeiger auswählen"
 
-#: editor.cc:1949
+#: editor.cc:2055
 msgid "Select All Between Playhead and Edit Point"
 msgstr "Alle zwischen Positionszeiger und Arbeitspunkt auswählen"
 
-#: editor.cc:1950
+#: editor.cc:2056
 msgid "Select All Within Playhead and Edit Point"
 msgstr "Alles zwischen Positionszeiger und Arbeitspunkt auswählen"
 
-#: editor.cc:1951
+#: editor.cc:2057
 msgid "Select Range Between Playhead and Edit Point"
 msgstr "Wähle Bereich zwischen Positionszeiger und Arbeitspunkt aus"
 
-#: editor.cc:1953 editor.cc:2024 editor_actions.cc:132 editor_actions.cc:133
+#: editor.cc:2059 editor.cc:2130 editor_actions.cc:134 editor_actions.cc:135
 msgid "Select"
 msgstr "Auswahl"
 
-#: editor.cc:1961 editor.cc:2032 editor_actions.cc:345 processor_box.cc:2719
+#: editor.cc:2067 editor.cc:2138 editor_actions.cc:359 processor_box.cc:3677
 msgid "Cut"
 msgstr "Ausschneiden"
 
-#: editor.cc:1962 editor.cc:2033 editor_actions.cc:349 processor_box.cc:2721
+#: editor.cc:2068 editor.cc:2139 editor_actions.cc:363 processor_box.cc:3679
 msgid "Copy"
 msgstr "Kopieren"
 
-#: editor.cc:1963 editor.cc:2034 editor_actions.cc:350 processor_box.cc:2726
+#: editor.cc:2069 editor.cc:2140 editor_actions.cc:364 processor_box.cc:3691
 msgid "Paste"
 msgstr "Einfügen"
 
-#: editor.cc:1967 editor_actions.cc:92
+#: editor.cc:2073 editor_actions.cc:94
 msgid "Align"
 msgstr "Ausrichten"
 
-#: editor.cc:1968
+#: editor.cc:2074
 msgid "Align Relative"
 msgstr "Relativ ausrichten"
 
-#: editor.cc:1975
+#: editor.cc:2081
 msgid "Insert Selected Region"
 msgstr "Ausgewählte Region einfügen"
 
-#: editor.cc:1976
+#: editor.cc:2082
 msgid "Insert Existing Media"
 msgstr "Vorhandenes Material importieren"
 
-#: editor.cc:1985 editor.cc:2041
+#: editor.cc:2091 editor.cc:2147
 msgid "Nudge Entire Track Later"
 msgstr "Gesamte Spur schrittweise nach hinten"
 
-#: editor.cc:1986 editor.cc:2042
+#: editor.cc:2092 editor.cc:2148
 msgid "Nudge Track After Edit Point Later"
 msgstr "Spur nach Arbeitspunkt schrittweise nach hinten"
 
-#: editor.cc:1987 editor.cc:2043
+#: editor.cc:2093 editor.cc:2149
 msgid "Nudge Entire Track Earlier"
 msgstr "Gesamte Spur schrittweise nach vorne"
 
-#: editor.cc:1988 editor.cc:2044
+#: editor.cc:2094 editor.cc:2150
 msgid "Nudge Track After Edit Point Earlier"
 msgstr "Spur nach Arbeitspunkt schrittweise nach vorne"
 
-#: editor.cc:1990 editor.cc:2046
+#: editor.cc:2096 editor.cc:2152
 msgid "Nudge"
 msgstr "Verschieben"
 
-#: editor.cc:2261
+#: editor.cc:2354
 msgid ""
 "Playhead position stored with a negative value - ignored (use zero instead)"
 msgstr ""
 "Positionzeiger mit negativer Position - ignoriert (benutze stattdessen Null)"
 
-#: editor.cc:3039 editor.cc:3738 editor.cc:3809 midi_channel_selector.cc:157
+#: editor.cc:3116 editor.cc:3776 editor.cc:3847 midi_channel_selector.cc:157
 #: midi_channel_selector.cc:395 midi_channel_selector.cc:431
 msgid "All"
 msgstr "Alle"
 
-#: editor.cc:3239
+#: editor.cc:3281
 msgid "Smart Mode (add range functions to Grab Mode)"
 msgstr "Smart-Modus (zusätzliche Bereichsfunktionen im Greifmodus)"
 
-#: editor.cc:3240
+#: editor.cc:3282
 msgid "Grab Mode (select/move objects)"
 msgstr "Greifmodus (Objekte auswählen/bewegen)"
 
-#: editor.cc:3241
+#: editor.cc:3283
 msgid "Cut Mode (split regions)"
 msgstr "Schneidemodus (Regionen teilen)"
 
-#: editor.cc:3242
+#: editor.cc:3284
 msgid "Range Mode (select time ranges)"
 msgstr "Bereichsmodus (Zeitbereiche auswählen)"
 
-#: editor.cc:3243
+#: editor.cc:3285
 msgid "Draw Mode (draw and edit gain/notes/automation)"
 msgstr "Zeichenmodus (zeichne und editiere Lautstärken/Noten/Automationen)"
 
-#: editor.cc:3244
+#: editor.cc:3286
 msgid "Stretch Mode (time-stretch audio and midi regions, preserving pitch)"
 msgstr ""
 "Streckmodus (Audio- und MIDI-Regionen zeitstrecken, ohne die Tonhöhe zu "
 "ändern)"
 
-#: editor.cc:3245
+#: editor.cc:3287
 msgid "Audition Mode (listen to regions)"
 msgstr "Vorhörmodus (Regionen anhören)"
 
-#: editor.cc:3246
+#: editor.cc:3288
 msgid "Internal Edit Mode (edit notes and automation points)"
 msgstr ""
 "Interner Bearbeitungsmodus (Noten und Automationspunkte innerhalb der "
 "Regionen editieren)"
 
-#: editor.cc:3247
+#: editor.cc:3289
 msgid ""
 "Groups: click to (de)activate\n"
 "Context-click for other operations"
@@ -3441,63 +3721,63 @@ msgstr ""
 "Gruppen: Klicken zum (De)aktivieren\n"
 "Rechtsklick für Optionen"
 
-#: editor.cc:3248
+#: editor.cc:3290
 msgid "Nudge Region/Selection Later"
 msgstr "Region/Auswahl schrittweise nach hinten"
 
-#: editor.cc:3249
+#: editor.cc:3291
 msgid "Nudge Region/Selection Earlier"
 msgstr "Region/Auswahl schrittweise nach vorne"
 
-#: editor.cc:3250 editor_actions.cc:270
+#: editor.cc:3292 editor_actions.cc:272
 msgid "Zoom In"
 msgstr "Vergrößern"
 
-#: editor.cc:3251 editor_actions.cc:269
+#: editor.cc:3293 editor_actions.cc:271
 msgid "Zoom Out"
 msgstr "Verkleinern"
 
-#: editor.cc:3252
+#: editor.cc:3294
 msgid "Zoom to Time Scale"
 msgstr "Zu einer Zeitspanne zoomen"
 
-#: editor.cc:3253 editor.cc:3760 editor_actions.cc:271
+#: editor.cc:3295 editor.cc:3798 editor_actions.cc:273
 msgid "Zoom to Session"
 msgstr "Auf ganzes Projekt zoomen"
 
-#: editor.cc:3254 editor_actions.cc:113 editor_actions.cc:146
+#: editor.cc:3296 editor_actions.cc:115 editor_actions.cc:148
 msgid "Zoom Focus"
 msgstr "Zoom Fokus"
 
-#: editor.cc:3255
+#: editor.cc:3297
 msgid "Expand Tracks"
 msgstr "Spuren vergrößern"
 
-#: editor.cc:3256
+#: editor.cc:3298
 msgid "Shrink Tracks"
 msgstr "Spuren verkleinern"
 
-#: editor.cc:3257
+#: editor.cc:3299
 msgid "Number of visible tracks"
 msgstr "Anzahl der sichtbaren Spuren"
 
-#: editor.cc:3258
+#: editor.cc:3300
 msgid "Snap/Grid Units"
 msgstr "Rastereinheiten"
 
-#: editor.cc:3259
+#: editor.cc:3301
 msgid "Snap/Grid Mode"
 msgstr "Einrastmodus"
 
-#: editor.cc:3260 editor_actions.cc:99
+#: editor.cc:3302 editor_actions.cc:101
 msgid "Edit Point"
 msgstr "Arbeitspunkt"
 
-#: editor.cc:3261
+#: editor.cc:3303
 msgid "Edit Mode"
 msgstr "Bearbeitungsmodus"
 
-#: editor.cc:3262
+#: editor.cc:3304
 msgid ""
 "Nudge Clock\n"
 "(controls distance used to nudge regions and selections)"
@@ -3506,124 +3786,124 @@ msgstr ""
 "(bestimmt den Abstand für das schrittweise Verschieben von Regionen und "
 "Bereichen)"
 
-#: editor.cc:3530 editor_actions.cc:321
+#: editor.cc:3572 editor_actions.cc:335
 msgid "Command|Undo"
 msgstr "Rückgängig"
 
-#: editor.cc:3532
+#: editor.cc:3574
 msgid "Command|Undo (%1)"
 msgstr "Rückgängig (%1)"
 
-#: editor.cc:3539 editor_actions.cc:323 editor_actions.cc:324
-#: editor_actions.cc:325
+#: editor.cc:3581 editor_actions.cc:337 editor_actions.cc:338
+#: editor_actions.cc:339
 msgid "Redo"
 msgstr "Wiederherstellen"
 
-#: editor.cc:3542
+#: editor.cc:3584
 msgid "Redo (%1)"
 msgstr "Wiederherstellen (%1)"
 
-#: editor.cc:3562 editor.cc:3586 editor_actions.cc:111 editor_actions.cc:1865
+#: editor.cc:3604 editor.cc:3628 editor_actions.cc:113 editor_actions.cc:1863
 msgid "Duplicate"
 msgstr "Duplizieren"
 
-#: editor.cc:3563
+#: editor.cc:3605
 msgid "Number of duplications:"
 msgstr "Anzahl der Duplikate:"
 
-#: editor.cc:3737 route_group_dialog.cc:51 time_info_box.cc:67
+#: editor.cc:3775 route_group_dialog.cc:51 time_info_box.cc:61
 msgid "Selection"
 msgstr "Auswahl"
 
-#: editor.cc:3740
+#: editor.cc:3778
 msgid "Fit 1 track"
 msgstr "1 Spur einpassen"
 
-#: editor.cc:3741
+#: editor.cc:3779
 msgid "Fit 2 tracks"
 msgstr "2 Spuren einpassen"
 
-#: editor.cc:3742
+#: editor.cc:3780
 msgid "Fit 4 tracks"
 msgstr "4 Spuren einpassen"
 
-#: editor.cc:3743
+#: editor.cc:3781
 msgid "Fit 8 tracks"
 msgstr "8 Spuren einpassen"
 
-#: editor.cc:3744
+#: editor.cc:3782
 msgid "Fit 16 tracks"
 msgstr "16 Spuren einpassen"
 
-#: editor.cc:3745
+#: editor.cc:3783
 msgid "Fit 24 tracks"
 msgstr "24 Spuren einpassen"
 
-#: editor.cc:3746
+#: editor.cc:3784
 msgid "Fit 32 tracks"
 msgstr "32 Spuren einpassen"
 
-#: editor.cc:3747
+#: editor.cc:3785
 msgid "Fit 48 tracks"
 msgstr "48 Spuren einpassen"
 
-#: editor.cc:3748
+#: editor.cc:3786
 msgid "Fit All tracks"
 msgstr "Alle Spuren einpassen"
 
-#: editor.cc:3749
+#: editor.cc:3787
 msgid "Fit Selection"
 msgstr "Passe Auswahl ein"
 
-#: editor.cc:3751
+#: editor.cc:3789 editor_actions.cc:288
 msgid "Zoom to 10 ms"
 msgstr "Zoome auf 10 ms"
 
-#: editor.cc:3752
+#: editor.cc:3790 editor_actions.cc:289
 msgid "Zoom to 100 ms"
 msgstr "Zoome auf 100 ms"
 
-#: editor.cc:3753
+#: editor.cc:3791 editor_actions.cc:290
 msgid "Zoom to 1 sec"
 msgstr "Zoome auf 1 Sek."
 
-#: editor.cc:3754
+#: editor.cc:3792 editor_actions.cc:291
 msgid "Zoom to 10 sec"
 msgstr "Zoome auf 10 Sek."
 
-#: editor.cc:3755
+#: editor.cc:3793 editor_actions.cc:292
 msgid "Zoom to 1 min"
 msgstr "Zoome auf 1 Min."
 
-#: editor.cc:3756
+#: editor.cc:3794 editor_actions.cc:294
 msgid "Zoom to 10 min"
 msgstr "Zoome auf 10 Min."
 
-#: editor.cc:3757
+#: editor.cc:3795
 msgid "Zoom to 1 hour"
 msgstr "Zoome auf 1 Stunde"
 
-#: editor.cc:3758
+#: editor.cc:3796
 msgid "Zoom to 8 hours"
 msgstr "Zoome auf 8 Stunden"
 
-#: editor.cc:3759
+#: editor.cc:3797
 msgid "Zoom to 24 hours"
 msgstr "Zoome auf 24 Stunden"
 
-#: editor.cc:3761
+#: editor.cc:3799
 msgid "Zoom to Range/Region Selection"
 msgstr "Zoome auf Bereichs-/Regionenauswahl"
 
-#: editor.cc:3831
+#: editor.cc:3869
 msgid "*"
 msgstr "*"
 
-#: editor.cc:4151
+#: editor.cc:4136
 msgid "Playlist Deletion"
 msgstr "Löschen von Wiedergabelisten"
 
-#: editor.cc:4152
+#: editor.cc:4137
 msgid ""
 "Playlist %1 is currently unused.\n"
 "If it is kept, its audio files will not be cleaned.\n"
@@ -3635,1330 +3915,1373 @@ msgstr ""
 "Falls sie gelöscht wird, werden die ausschließlich von ihr verwendeten "
 "Audiodateien gelöscht."
 
-#: editor.cc:4162
+#: editor.cc:4147
 msgid "Delete All Unused"
 msgstr "Alle unbenutzten löschen"
 
-#: editor.cc:4163
+#: editor.cc:4148
 msgid "Delete Playlist"
 msgstr "Wiedergabeliste löschen"
 
-#: editor.cc:4164
+#: editor.cc:4149
 msgid "Keep Playlist"
 msgstr "Wiedergabeliste behalten"
 
-#: editor.cc:4165
+#: editor.cc:4150
 msgid "Keep Remaining"
 msgstr "Ãœbrige behalten"
 
-#: editor.cc:4166 editor_audio_import.cc:597 editor_ops.cc:6456
-#: engine_dialog.cc:2909 sfdb_freesound_mootcher.cc:69 processor_box.cc:2487
-#: processor_box.cc:2512
+#: editor.cc:4151 editor_audio_import.cc:600 editor_ops.cc:6530
+#: engine_dialog.cc:2986 sfdb_freesound_mootcher.cc:69 processor_box.cc:3443
+#: processor_box.cc:3468
 msgid "Cancel"
 msgstr "Abbrechen"
 
-#: editor.cc:4318
+#: editor.cc:4293
 msgid "new playlists"
 msgstr "Neue Wiedergabelisten"
 
-#: editor.cc:4334
+#: editor.cc:4309
 msgid "copy playlists"
 msgstr "Wiedergabelisten kopieren"
 
-#: editor.cc:4349
+#: editor.cc:4324
 msgid "clear playlists"
 msgstr "Wiedergabelisten zurücksetzen"
 
-#: editor.cc:5095
+#: editor.cc:5049
 msgid "Please wait while %1 loads visual data."
 msgstr "Bitte warten Sie, während %1 die Daten zur Anzeige des Projekts lädt."
 
-#: editor.cc:5947 editor.cc:5982 editor_markers.cc:985 panner_ui.cc:412
-#: processor_box.cc:2746
+#: editor.cc:5812 editor_actions.cc:479
+msgid "Unset #%1"
+msgstr "Die Zuordnung von #%1 aufheben"
+
+#: editor.cc:5813 editor_actions.cc:481
+msgid "no action bound"
+msgstr "keine Aktion zugeordnet"
+
+#: editor.cc:5962 editor.cc:5997 editor_markers.cc:998 editor_markers.cc:1018
+#: panner_ui.cc:412 processor_box.cc:3715
 msgid "Edit..."
 msgstr "Bearbeiten..."
 
-#: editor.cc:5988 editor_actions.cc:1844
+#: editor.cc:6003 editor_actions.cc:1842
 msgid "Transpose..."
 msgstr "Transponieren..."
 
-#: editor.cc:5992 editor_actions.cc:1960
+#: editor.cc:6007 editor_actions.cc:1959
 msgid "Legatize"
 msgstr "überbinden (Legato)"
 
-#: editor.cc:5998 editor_actions.cc:1959
+#: editor.cc:6013 editor_actions.cc:1958
 msgid "Quantize..."
 msgstr "Quantisieren.."
 
-#: editor.cc:6001 editor_actions.cc:1962
+#: editor.cc:6016 editor_actions.cc:1961
 msgid "Remove Overlap"
 msgstr "Ãœberlappung entfernen (Legato)"
 
-#: editor.cc:6007 editor_actions.cc:1961
+#: editor.cc:6022 editor_actions.cc:1960
 msgid "Transform..."
 msgstr "Transformiere..."
 
-#: editor_actions.cc:93
+#: editor_actions.cc:95
 msgid "Autoconnect"
 msgstr "Automatisch verbinden"
 
-#: editor_actions.cc:94
+#: editor_actions.cc:96
 msgid "Crossfades"
 msgstr "Crossfades"
 
-#: editor_actions.cc:96
+#: editor_actions.cc:98
 msgid "Move Selected Marker"
 msgstr "Ausgewählten Positionsmarker verschieben"
 
-#: editor_actions.cc:97
+#: editor_actions.cc:99
 msgid "Select Range Operations"
 msgstr "Bereichs"
 
-#: editor_actions.cc:98
+#: editor_actions.cc:100
 msgid "Select Regions"
 msgstr "Region auswählen"
 
-#: editor_actions.cc:100
+#: editor_actions.cc:102
 msgid "Fade"
 msgstr "Fade"
 
-#: editor_actions.cc:101
+#: editor_actions.cc:103
 msgid "Latch"
 msgstr "Latch"
 
-#: editor_actions.cc:102 editor_regions.cc:115 region_editor.cc:48
+#: editor_actions.cc:104 editor_regions.cc:159 region_editor.cc:48
 msgid "Region"
 msgstr "Region"
 
-#: editor_actions.cc:103
+#: editor_actions.cc:105
 msgid "Layering"
 msgstr "Layering"
 
-#: editor_actions.cc:104 editor_regions.cc:116 stereo_panner_editor.cc:44
+#: editor_actions.cc:106 editor_regions.cc:160 stereo_panner_editor.cc:46
 msgid "Position"
 msgstr "Position"
 
-#: editor_actions.cc:106 gain_meter.cc:158 gain_meter.cc:827 panner_ui.cc:178
-#: panner_ui.cc:637 route_time_axis.cc:529
+#: editor_actions.cc:108 gain_meter.cc:161 gain_meter.cc:848 panner_ui.cc:178
+#: panner_ui.cc:637 route_time_axis.cc:541
 msgid "Trim"
 msgstr "Anpassen"
 
-#: editor_actions.cc:107 editor_actions.cc:127 route_group_dialog.cc:46
+#: editor_actions.cc:109 editor_actions.cc:129 route_group_dialog.cc:46
 msgid "Gain"
 msgstr "Lautstärke"
 
-#: editor_actions.cc:108 editor_actions.cc:579
+#: editor_actions.cc:110 editor_actions.cc:604
 msgid "Ranges"
 msgstr "Bereiche"
 
-#: editor_actions.cc:109 editor_actions.cc:1861 session_option_editor.cc:135
+#: editor_actions.cc:111 editor_actions.cc:1859 session_option_editor.cc:135
 #: session_option_editor.cc:144 session_option_editor.cc:151
 #: session_option_editor.cc:158 session_option_editor.cc:165
 msgid "Fades"
 msgstr "Fades"
 
-#: editor_actions.cc:112
+#: editor_actions.cc:114
 msgid "Link"
 msgstr "Verknüpfen"
 
-#: editor_actions.cc:114
+#: editor_actions.cc:116
 msgid "Locate to Markers"
 msgstr "Positionszeiger zu Marker setzen"
 
-#: editor_actions.cc:116
+#: editor_actions.cc:118
 msgid "Meter falloff"
 msgstr "Abfall der Pegelanzeigen"
 
-#: editor_actions.cc:117
+#: editor_actions.cc:119
 msgid "Meter hold"
 msgstr "Pegelanzeige halten"
 
-#: editor_actions.cc:118 session_option_editor.cc:342
+#: editor_actions.cc:120 session_option_editor.cc:342
 msgid "MIDI Options"
 msgstr "MIDI Optionen"
 
-#: editor_actions.cc:119
+#: editor_actions.cc:121
 msgid "Misc Options"
 msgstr "Sonstiges"
 
-#: editor_actions.cc:120 rc_option_editor.cc:2261 route_group_dialog.cc:54
+#: editor_actions.cc:122 rc_option_editor.cc:2401 route_group_dialog.cc:54
 #: session_option_editor.cc:264 session_option_editor.cc:271
 msgid "Monitoring"
 msgstr "Monitoring"
 
-#: editor_actions.cc:121
+#: editor_actions.cc:123
 msgid "Active Mark"
 msgstr "Aktiver Marker"
 
-#: editor_actions.cc:124
+#: editor_actions.cc:126
 msgid "Primary Clock"
 msgstr "Erste Zeitanzeige"
 
-#: editor_actions.cc:125
+#: editor_actions.cc:127
 msgid "Pullup / Pulldown"
 msgstr "Pull-Up / Pull-Down"
 
-#: editor_actions.cc:126
+#: editor_actions.cc:128
 msgid "Region operations"
 msgstr "Region(en)"
 
-#: editor_actions.cc:128 ruler_dialog.cc:28
+#: editor_actions.cc:130 ruler_dialog.cc:28
 msgid "Rulers"
 msgstr "Markierungsleisten"
 
-#: editor_actions.cc:129
+#: editor_actions.cc:131
 msgid "Views"
 msgstr "Ansichten"
 
-#: editor_actions.cc:130
+#: editor_actions.cc:132
 msgid "Scroll"
 msgstr "Scrollen"
 
-#: editor_actions.cc:131
+#: editor_actions.cc:133
 msgid "Secondary Clock"
 msgstr "Zweite Zeitanzeige"
 
-#: editor_actions.cc:138
+#: editor_actions.cc:140
 msgid "Subframes"
 msgstr "Subframes"
 
-#: editor_actions.cc:141
+#: editor_actions.cc:143
 msgid "Timecode fps"
 msgstr "Timecode FPS"
 
-#: editor_actions.cc:142 route_time_axis.cc:587
+#: editor_actions.cc:144 route_time_axis.cc:599
 msgid "Height"
 msgstr "Höhe"
 
-#: editor_actions.cc:144
+#: editor_actions.cc:146
 msgid "Tools"
 msgstr "Werkzeuge"
 
-#: editor_actions.cc:145
+#: editor_actions.cc:147
 msgid "View"
 msgstr "Ansicht"
 
-#: editor_actions.cc:147
+#: editor_actions.cc:149
 msgid "Zoom"
 msgstr "Zoom"
 
-#: editor_actions.cc:153
-msgid "Break drag or deselect all"
-msgstr "Ziehen abbrechen oder alles deselektieren"
+#: editor_actions.cc:150
+msgid "Scripted Actions"
+msgstr "geskriptete Aktionen"
 
-#: editor_actions.cc:158
+#: editor_actions.cc:159
 msgid "Session|Lock"
 msgstr "Sperren"
 
-#: editor_actions.cc:160
+#: editor_actions.cc:161
 msgid "Show Editor Mixer"
 msgstr "Mixer-Panel zeigen"
 
-#: editor_actions.cc:161
+#: editor_actions.cc:162
 msgid "Show Editor List"
 msgstr "Seitenleiste anzeigen"
 
-#: editor_actions.cc:163
+#: editor_actions.cc:164
 msgid "Playhead to Next Region Boundary"
 msgstr "Positionszeiger zur nächsten Regiongrenze"
 
-#: editor_actions.cc:164
+#: editor_actions.cc:165
 msgid "Playhead to Next Region Boundary (No Track Selection)"
 msgstr "Positionszeiger zur nächsten Regiongrenze (ohne Spurauswahl)"
 
-#: editor_actions.cc:165
+#: editor_actions.cc:166
 msgid "Playhead to Previous Region Boundary"
 msgstr "Positionszeiger zur vorherigen Regiongrenze"
 
-#: editor_actions.cc:166
+#: editor_actions.cc:167
 msgid "Playhead to Previous Region Boundary (No Track Selection)"
 msgstr "Positionszeiger zur vorherigen Regiongrenze (ohne Spurauswahl)"
 
-#: editor_actions.cc:168
+#: editor_actions.cc:169
 msgid "Playhead to Next Region Start"
 msgstr "Positionszeiger zum Anfang der nächsten Region"
 
-#: editor_actions.cc:169
+#: editor_actions.cc:170
 msgid "Playhead to Next Region End"
 msgstr "Positionszeiger zum Ende der nächsten Region"
 
-#: editor_actions.cc:170
+#: editor_actions.cc:171
 msgid "Playhead to Next Region Sync"
 msgstr "Positionszeiger zum Einrastpunkt der nächsten Region"
 
-#: editor_actions.cc:172
+#: editor_actions.cc:173
 msgid "Playhead to Previous Region Start"
 msgstr "Positionszeiger zum Anfang der vorherigen Region"
 
-#: editor_actions.cc:173
+#: editor_actions.cc:174
 msgid "Playhead to Previous Region End"
 msgstr "Positionszeiger zum Ende der vorherigen Region"
 
-#: editor_actions.cc:174
+#: editor_actions.cc:175
 msgid "Playhead to Previous Region Sync"
 msgstr "Positionszeiger zum Einrastpunkt der vorherigen Region"
 
-#: editor_actions.cc:176
+#: editor_actions.cc:177
 msgid "To Next Region Boundary"
 msgstr "Zur nächsten Regiongrenze"
 
-#: editor_actions.cc:177
+#: editor_actions.cc:178
 msgid "To Next Region Boundary (No Track Selection)"
 msgstr "Zur nächsten Regiongrenze (ohne Spurauswahl)"
 
-#: editor_actions.cc:178
+#: editor_actions.cc:179
 msgid "To Previous Region Boundary"
 msgstr "Zur vorherigen Regiongrenze"
 
-#: editor_actions.cc:179
+#: editor_actions.cc:180
 msgid "To Previous Region Boundary (No Track Selection)"
 msgstr "Zur vorherigen Regiongrenze  (ohne Spurauswahl)"
 
-#: editor_actions.cc:181
+#: editor_actions.cc:182
 msgid "To Next Region Start"
 msgstr "Zum nächsten Regionen-Anfang"
 
-#: editor_actions.cc:182
+#: editor_actions.cc:183
 msgid "To Next Region End"
 msgstr "Zum nächsten Regionen-Ende"
 
-#: editor_actions.cc:183
+#: editor_actions.cc:184
 msgid "To Next Region Sync"
 msgstr "Zum nächsten Regionen-Synchronisationspunkt"
 
-#: editor_actions.cc:185
+#: editor_actions.cc:186
 msgid "To Previous Region Start"
 msgstr "Zum vorherigen Anfang einer Region"
 
-#: editor_actions.cc:186
+#: editor_actions.cc:187
 msgid "To Previous Region End"
 msgstr "Zum vorherigen Ende einer Region"
 
-#: editor_actions.cc:187
+#: editor_actions.cc:188
 msgid "To Previous Region Sync"
 msgstr "Zum vorherigen Synchronisationspunkt einer Region"
 
-#: editor_actions.cc:189
+#: editor_actions.cc:190
 msgid "To Range Start"
 msgstr "Zum Anfang des Auswahlbereichs"
 
-#: editor_actions.cc:190
+#: editor_actions.cc:191
 msgid "To Range End"
 msgstr "Zum Ende des Auswahlbereichs"
 
-#: editor_actions.cc:192
+#: editor_actions.cc:193
 msgid "Playhead to Range Start"
 msgstr "Positionszeiger zum Anfang des Auswahlbereichs"
 
-#: editor_actions.cc:193
+#: editor_actions.cc:194
 msgid "Playhead to Range End"
 msgstr "Positionszeiger zum Ende des Auswahlbereichs"
 
-#: editor_actions.cc:196
+#: editor_actions.cc:197
 msgid "Select All Tracks"
 msgstr "Alle Spuren auswählen"
 
-#: editor_actions.cc:197 export_timespan_selector.cc:59 processor_box.cc:2732
+#: editor_actions.cc:198 export_timespan_selector.cc:62 processor_box.cc:3697
 msgid "Deselect All"
 msgstr "Nichts auswählen"
 
-#: editor_actions.cc:209
+#: editor_actions.cc:210
 msgid "Select All Overlapping Edit Range"
 msgstr "Alle Regionen des Bearbeitungsbereichs auswählen "
 
-#: editor_actions.cc:210
+#: editor_actions.cc:211
 msgid "Select All Inside Edit Range"
 msgstr "Alles inerhalb des Bearbeitungsbereichs auswählen"
 
-#: editor_actions.cc:212
+#: editor_actions.cc:213
 msgid "Select Edit Range"
 msgstr "Editierbereich auswählen"
 
-#: editor_actions.cc:214
+#: editor_actions.cc:215
 msgid "Select All in Punch Range"
 msgstr "Alle Regionen im Punchbereich auswählen"
 
-#: editor_actions.cc:215
+#: editor_actions.cc:216
 msgid "Select All in Loop Range"
 msgstr "Alle Regionen innerhalb der Schleife auswählen"
 
-#: editor_actions.cc:217
+#: editor_actions.cc:218
 msgid "Select Next Track or Bus"
 msgstr "Nächste Spur/Bus auswählen"
 
-#: editor_actions.cc:218
+#: editor_actions.cc:219
 msgid "Select Previous Track or Bus"
 msgstr "Vorherige Spur/Bus auswählen"
 
-#: editor_actions.cc:220
+#: editor_actions.cc:221
 msgid "Toggle Record Enable"
 msgstr "Aufnahmebereitschaft umschalten"
 
-#: editor_actions.cc:222
+#: editor_actions.cc:223
 msgid "Toggle Solo"
 msgstr "Solo umschalten"
 
-#: editor_actions.cc:224
+#: editor_actions.cc:225
 msgid "Toggle Mute"
 msgstr "Mute umschalten"
 
-#: editor_actions.cc:226
+#: editor_actions.cc:227
 msgid "Toggle Solo Isolate"
 msgstr "Isoliertes Solo umschalten"
 
-#: editor_actions.cc:231
+#: editor_actions.cc:232
 msgid "Save View %1"
 msgstr "Ansicht %1 speichern"
 
-#: editor_actions.cc:237
+#: editor_actions.cc:238
 msgid "Go to View %1"
 msgstr "Ansicht %1 aufrufen"
 
-#: editor_actions.cc:243
+#: editor_actions.cc:244
 msgid "Locate to Mark %1"
 msgstr "Positionszeiger zu Marker %1 setzen"
 
-#: editor_actions.cc:247 editor_actions.cc:248
+#: editor_actions.cc:249 editor_actions.cc:250
 msgid "Jump to Next Mark"
 msgstr "Zu nächstem Marker springen"
 
-#: editor_actions.cc:249 editor_actions.cc:250
+#: editor_actions.cc:251 editor_actions.cc:252
 msgid "Jump to Previous Mark"
 msgstr "Zur vorherigen Marker springen"
 
-#: editor_actions.cc:252
+#: editor_actions.cc:254
 msgid "Set Session Start from Playhead"
 msgstr "Projektbeginn auf Positionszeiger setzen"
 
-#: editor_actions.cc:253
+#: editor_actions.cc:255
 msgid "Set Session End from Playhead"
 msgstr "Projektende auf Positionszeiger setzen"
 
-#: editor_actions.cc:255 editor_actions.cc:256
+#: editor_actions.cc:257 editor_actions.cc:258
 msgid "Add Mark from Playhead"
 msgstr "Marker am Positionszeiger setzen"
 
-#: editor_actions.cc:258 editor_actions.cc:259
+#: editor_actions.cc:260 editor_actions.cc:261
 msgid "Remove Mark at Playhead"
 msgstr "Marker beim Positionszeiger entfernen"
 
-#: editor_actions.cc:261
+#: editor_actions.cc:263
 msgid "Nudge Next Later"
 msgstr "Nächste Region schrittweise nach hinten"
 
-#: editor_actions.cc:262
+#: editor_actions.cc:264
 msgid "Nudge Next Earlier"
 msgstr "Nächste Region schrittweise nach vorne"
 
-#: editor_actions.cc:264
+#: editor_actions.cc:266
 msgid "Nudge Playhead Forward"
 msgstr "Positionszeiger vorwärts"
 
-#: editor_actions.cc:265
+#: editor_actions.cc:267
 msgid "Nudge Playhead Backward"
 msgstr "Positionszeiger rückwärts"
 
-#: editor_actions.cc:266
+#: editor_actions.cc:268
 msgid "Playhead to Next Grid"
 msgstr "Positionszeiger zum nächsten Rasterpunkt"
 
-#: editor_actions.cc:267
+#: editor_actions.cc:269
 msgid "Playhead to Previous Grid"
 msgstr "Positionszeiger zum vorherigen Rasterpunkt"
 
-#: editor_actions.cc:272
+#: editor_actions.cc:274
 msgid "Zoom to Selection"
 msgstr "Zoome zu Auswahl"
 
-#: editor_actions.cc:273
+#: editor_actions.cc:275
 msgid "Toggle Zoom State"
 msgstr "Zoomstatus umschalten"
 
-#: editor_actions.cc:275
+#: editor_actions.cc:277
 msgid "Expand Track Height"
 msgstr "Spurhöhe vergrößern"
 
-#: editor_actions.cc:276
+#: editor_actions.cc:278
 msgid "Shrink Track Height"
 msgstr "Spurhöhe verkleinern"
 
-#: editor_actions.cc:278
+#: editor_actions.cc:280
+msgid "Fit 1 Track"
+msgstr "Passe 1 Spur ein"
+
+#: editor_actions.cc:281
+msgid "Fit 2 Tracks"
+msgstr "Passe 2 Spuren ein"
+
+#: editor_actions.cc:282
+msgid "Fit 4 Tracks"
+msgstr "Passe 4 Spuren ein"
+
+#: editor_actions.cc:283
+msgid "Fit 8 Tracks"
+msgstr "Passe 8 Spuren ein"
+
+#: editor_actions.cc:284
+msgid "Fit 16 Tracks"
+msgstr "Passe 16 Spuren ein"
+
+#: editor_actions.cc:285
+msgid "Fit 32 Tracks"
+msgstr "Passe 32 Spuren ein"
+
+#: editor_actions.cc:286
+msgid "Fit All Tracks"
+msgstr "Passe alle Spuren ein"
+
+#: editor_actions.cc:293
+msgid "Zoom to 5 min"
+msgstr "Zoome auf 5 Minuten"
+
+#: editor_actions.cc:296
 msgid "Move Selected Tracks Up"
 msgstr "Ausgewählte Spuren nach oben verschieben"
 
-#: editor_actions.cc:280
+#: editor_actions.cc:298
 msgid "Move Selected Tracks Down"
 msgstr "Ausgewählte Spuren nach unten verschieben"
 
-#: editor_actions.cc:283
+#: editor_actions.cc:301
 msgid "Scroll Tracks Up"
 msgstr "Spuren nach oben scrollen"
 
-#: editor_actions.cc:285
+#: editor_actions.cc:302
 msgid "Scroll Tracks Down"
 msgstr "Spuren nach unten scrollen"
 
-#: editor_actions.cc:287
+#: editor_actions.cc:303
 msgid "Step Tracks Up"
 msgstr "Spuren langsam nach oben scrollen"
 
-#: editor_actions.cc:289
+#: editor_actions.cc:304
 msgid "Step Tracks Down"
 msgstr "Spuren langsam nach unten scrollen"
 
-#: editor_actions.cc:292
+#: editor_actions.cc:306
 msgid "Scroll Backward"
 msgstr "Nach rechts scrollen"
 
-#: editor_actions.cc:293
+#: editor_actions.cc:307
 msgid "Scroll Forward"
 msgstr "Nach links scrollen"
 
-#: editor_actions.cc:294
+#: editor_actions.cc:308
 msgid "Center Playhead"
 msgstr "Positionszeiger zentrieren"
 
-#: editor_actions.cc:295
+#: editor_actions.cc:309
 msgid "Center Edit Point"
 msgstr "Arbeitspunkt zentrieren"
 
-#: editor_actions.cc:297
+#: editor_actions.cc:311
 msgid "Playhead Forward"
 msgstr "Positionszeiger vorwärts"
 
-#: editor_actions.cc:298
+#: editor_actions.cc:312
 msgid "Playhead Backward"
 msgstr "Positionszeiger rückwärts"
 
-#: editor_actions.cc:300
+#: editor_actions.cc:314
 msgid "Playhead to Active Mark"
 msgstr "Positionszeiger zur aktiven Markierung"
 
-#: editor_actions.cc:301
+#: editor_actions.cc:315
 msgid "Active Mark to Playhead"
 msgstr "Aktiven Marker zum Positionszeiger verschieben"
 
-#: editor_actions.cc:303
+#: editor_actions.cc:317
 msgid "Use Skip Ranges"
 msgstr "Benutze Sprungbereiche"
 
-#: editor_actions.cc:310
+#: editor_actions.cc:324
 msgid "Play Selected Regions"
 msgstr "Ausgewählte Regionen wiedergeben"
 
-#: editor_actions.cc:312
+#: editor_actions.cc:326
 msgid "Play from Edit Point and Return"
 msgstr "Wiedergabe ab Arbeitspunkt & Zurück"
 
-#: editor_actions.cc:314
+#: editor_actions.cc:328
 msgid "Play Edit Range"
 msgstr "Editierbereich wiedergeben"
 
-#: editor_actions.cc:316
+#: editor_actions.cc:330
 msgid "Playhead to Mouse"
 msgstr "Positionszeiger zur Mausposition"
 
-#: editor_actions.cc:317
+#: editor_actions.cc:331
 msgid "Active Marker to Mouse"
 msgstr "Aktiven Marker zur Mausposition"
 
-#: editor_actions.cc:327
+#: editor_actions.cc:341
 msgid "Undo Selection Change"
 msgstr "Auswahländerung rückgängig machen"
 
-#: editor_actions.cc:328
+#: editor_actions.cc:342
 msgid "Redo Selection Change"
 msgstr "Auswahländerung wiederherstellen"
 
-#: editor_actions.cc:330
+#: editor_actions.cc:344
 msgid "Export Audio"
 msgstr "Audio exportieren"
 
-#: editor_actions.cc:331 export_dialog.cc:394
+#: editor_actions.cc:345 export_dialog.cc:476
 msgid "Export Range"
 msgstr "Bereich exportieren"
 
-#: editor_actions.cc:336
+#: editor_actions.cc:350
 msgid "Separate Using Punch Range"
 msgstr "an Punch-Bereichsgrenzen teilen"
 
-#: editor_actions.cc:339
+#: editor_actions.cc:353
 msgid "Separate Using Loop Range"
 msgstr "an Schleifengrenzen teilen"
 
-#: editor_actions.cc:342 editor_actions.cc:364
+#: editor_actions.cc:356 editor_actions.cc:379
 msgid "Crop"
 msgstr "Auf Bereich zuschneiden"
 
-#: editor_actions.cc:352
+#: editor_actions.cc:366
 msgid "Fade Range Selection"
 msgstr "Bereichsauswahl faden"
 
-#: editor_actions.cc:354
+#: editor_actions.cc:368
 msgid "Set Tempo from Edit Range = Bar"
 msgstr "Editierbereich = Taktlänge setzen"
 
-#: editor_actions.cc:356
+#: editor_actions.cc:371
 msgid "Log"
 msgstr "Log"
 
-#: editor_actions.cc:359 editor_actions.cc:361
+#: editor_actions.cc:374 editor_actions.cc:376
 msgid "Move to Next Transient"
 msgstr "Zum nächsten Transienten bewegen"
 
-#: editor_actions.cc:360 editor_actions.cc:362
+#: editor_actions.cc:375 editor_actions.cc:377
 msgid "Move to Previous Transient"
 msgstr "Zum vorigen Transienten bewegen"
 
-#: editor_actions.cc:366 editor_actions.cc:375
+#: editor_actions.cc:381
+msgid "Start Range from Playhead"
+msgstr "Bereich bei Wiedergabezeiger beginnen lassen"
+
+#: editor_actions.cc:382
+msgid "Finish Range from Playhead"
+msgstr "Bereich bei Wiedergabezeiger enden lassen"
+
+#: editor_actions.cc:384 editor_actions.cc:393
 msgid "Start Range"
 msgstr "Bereich beginnen"
 
-#: editor_actions.cc:367 editor_actions.cc:376
+#: editor_actions.cc:385 editor_actions.cc:394
 msgid "Finish Range"
 msgstr "Bereich beenden"
 
-#: editor_actions.cc:369
+#: editor_actions.cc:387
 msgid "Start Punch Range"
 msgstr "Beginne Punchbereich"
 
-#: editor_actions.cc:370
+#: editor_actions.cc:388
 msgid "Finish Punch Range"
 msgstr "Beende Punchbereich"
 
-#: editor_actions.cc:372
+#: editor_actions.cc:390
 msgid "Start Loop Range"
 msgstr "Beginne Schleifenbereich"
 
-#: editor_actions.cc:373
+#: editor_actions.cc:391
 msgid "Finish Loop Range"
 msgstr "Beende Schleifenbereich"
 
-#: editor_actions.cc:408
+#: editor_actions.cc:426
 msgid "Follow Playhead"
 msgstr "Positionszeiger folgen"
 
-#: editor_actions.cc:409
+#: editor_actions.cc:427
 msgid "Remove Last Capture"
 msgstr "Letzte Aufnahme entfernen"
 
-#: editor_actions.cc:411
+#: editor_actions.cc:429
 msgid "Stationary Playhead"
 msgstr "stehender Positionszeiger"
 
-#: editor_actions.cc:413 insert_remove_time_dialog.cc:32
+#: editor_actions.cc:431 insert_remove_time_dialog.cc:32
 msgid "Insert Time"
 msgstr "Stille Einfügen"
 
-#: editor_actions.cc:415 insert_remove_time_dialog.cc:32
+#: editor_actions.cc:433 insert_remove_time_dialog.cc:32
 msgid "Remove Time"
 msgstr "Zeit entfernen"
 
-#: editor_actions.cc:420
+#: editor_actions.cc:438
 msgid "Toggle Active"
 msgstr "Spur De/Aktivieren"
 
-#: editor_actions.cc:422 editor_actions.cc:1787 editor_markers.cc:921
-#: editor_markers.cc:986 editor_snapshots.cc:134 mixer_strip.cc:1621
-#: route_time_axis.cc:872
+#: editor_actions.cc:440 editor_actions.cc:1785 editor_markers.cc:926
+#: editor_markers.cc:999 editor_markers.cc:1019 editor_snapshots.cc:134
+#: lua_script_manager.cc:32 lua_script_manager.cc:36 mixer_strip.cc:1713
+#: route_time_axis.cc:870 vca_master_strip.cc:400
 msgid "Remove"
 msgstr "Löschen"
 
-#: editor_actions.cc:427
+#: editor_actions.cc:445
 msgid "Fit Selection (Vertical)"
 msgstr "Auswahl einpassen (vertikal)"
 
-#: editor_actions.cc:429 time_axis_view.cc:1380
+#: editor_actions.cc:447 time_axis_view.cc:1291
 msgid "Largest"
 msgstr "Am größten"
 
-#: editor_actions.cc:432 time_axis_view.cc:1381
+#: editor_actions.cc:450 time_axis_view.cc:1292
 msgid "Larger"
 msgstr "Größer"
 
-#: editor_actions.cc:435 editor_rulers.cc:248 time_axis_view.cc:1382
+#: editor_actions.cc:453 editor_rulers.cc:248 time_axis_view.cc:1293
 msgid "Large"
 msgstr "Groß"
 
-#: editor_actions.cc:441 editor_rulers.cc:252 time_axis_view.cc:1384
+#: editor_actions.cc:459 editor_rulers.cc:252 time_axis_view.cc:1295
 msgid "Small"
 msgstr "Klein"
 
-#: editor_actions.cc:445
+#: editor_actions.cc:463
 msgid "Sound Selected MIDI Notes"
 msgstr "ausgewählte Noten abspielen"
 
-#: editor_actions.cc:450
+#: editor_actions.cc:468
 msgid "Zoom Focus Left"
 msgstr "Am linken Rand ausrichten"
 
-#: editor_actions.cc:451
+#: editor_actions.cc:469
 msgid "Zoom Focus Right"
 msgstr "Am rechten Rand ausrichten"
 
-#: editor_actions.cc:452
+#: editor_actions.cc:470
 msgid "Zoom Focus Center"
 msgstr "Zentriert ausrichten"
 
-#: editor_actions.cc:453
+#: editor_actions.cc:471
 msgid "Zoom Focus Playhead"
 msgstr "Am Positionszeiger ausrichten"
 
-#: editor_actions.cc:454
+#: editor_actions.cc:472
 msgid "Zoom Focus Mouse"
 msgstr "Zoom Fokus zur Maus"
 
-#: editor_actions.cc:455
+#: editor_actions.cc:473
 msgid "Zoom Focus Edit Point"
 msgstr "Zoom Fokus zu Arbeitspunkt"
 
-#: editor_actions.cc:457
+#: editor_actions.cc:475
 msgid "Next Zoom Focus"
 msgstr "Zoom FokusNächster "
 
-#: editor_actions.cc:463
+#: editor_actions.cc:488
 msgid "Smart Object Mode"
 msgstr "Smarter Objektmodus"
 
-#: editor_actions.cc:466
+#: editor_actions.cc:491
 msgid "Smart"
 msgstr "Smart"
 
-#: editor_actions.cc:469
+#: editor_actions.cc:494
 msgid "Object Tool"
 msgstr "Objektwerkzeug"
 
-#: editor_actions.cc:474
+#: editor_actions.cc:499
 msgid "Range Tool"
 msgstr "Bereich-Werkzeug (Range)"
 
-#: editor_actions.cc:479
+#: editor_actions.cc:504
 msgid "Note Drawing Tool"
 msgstr "Noten-Malwerkzeug"
 
-#: editor_actions.cc:484
+#: editor_actions.cc:509
 msgid "Audition Tool"
 msgstr "Vorhör-Werkzeug"
 
-#: editor_actions.cc:489
+#: editor_actions.cc:514
 msgid "Time FX Tool"
 msgstr "TimeFX-Werkzeug"
 
-#: editor_actions.cc:494
+#: editor_actions.cc:519
 msgid "Content Tool"
 msgstr "Inhaltswerkzeug"
 
-#: editor_actions.cc:500
+#: editor_actions.cc:525
 msgid "Cut Tool"
 msgstr "Schneidewerkzeug"
 
-#: editor_actions.cc:506
+#: editor_actions.cc:531
 msgid "Step Mouse Mode"
 msgstr "Schritt-Mausmodus"
 
-#: editor_actions.cc:513
+#: editor_actions.cc:538
 msgid "Change Edit Point"
 msgstr "Arbeitspunkt ändern"
 
-#: editor_actions.cc:514
+#: editor_actions.cc:539
 msgid "Change Edit Point Including Marker"
 msgstr "Arbeitspunkt ändern (auch auf Marker wechseln)"
 
-#: editor_actions.cc:519
+#: editor_actions.cc:544
 msgid "EditMode|Lock"
 msgstr "Sperren"
 
-#: editor_actions.cc:520
+#: editor_actions.cc:545
 msgid "Cycle Edit Mode"
 msgstr "Bearbeitungsmodus weiterschalten"
 
-#: editor_actions.cc:522
+#: editor_actions.cc:547
 msgid "Snap to"
 msgstr "Einrasten"
 
-#: editor_actions.cc:523
+#: editor_actions.cc:548
 msgid "Snap Mode"
 msgstr "Einrastmodus"
 
-#: editor_actions.cc:530
+#: editor_actions.cc:555
 msgid "Next Snap Mode"
 msgstr "Nächster Einrastmodus"
 
-#: editor_actions.cc:531
+#: editor_actions.cc:556
 msgid "Next Snap Choice"
 msgstr "Nächste Einrastmöglichkeit"
 
-#: editor_actions.cc:532
+#: editor_actions.cc:557
 msgid "Next Musical Snap Choice"
 msgstr "Nächster Einrastmöglichkeit (musikalisch)"
 
-#: editor_actions.cc:533
+#: editor_actions.cc:558
 msgid "Previous Snap Choice"
 msgstr "Vorige Einrastmöglichkeit"
 
-#: editor_actions.cc:534
+#: editor_actions.cc:559
 msgid "Previous Musical Snap Choice"
 msgstr " Vorige Einrastmöglichkeit (musikalisch)"
 
-#: editor_actions.cc:539
+#: editor_actions.cc:564
 msgid "Snap to CD Frame"
 msgstr "An CD-Frames einrasten"
 
-#: editor_actions.cc:540
+#: editor_actions.cc:565
 msgid "Snap to Timecode Frame"
 msgstr "An Timecode-Frames einrasten"
 
-#: editor_actions.cc:541
+#: editor_actions.cc:566
 msgid "Snap to Timecode Seconds"
 msgstr "An Timecode-Sekunden einrasten"
 
-#: editor_actions.cc:542
+#: editor_actions.cc:567
 msgid "Snap to Timecode Minutes"
 msgstr "An Timecode-Minuten einrasten"
 
-#: editor_actions.cc:543
+#: editor_actions.cc:568
 msgid "Snap to Seconds"
 msgstr "An Sekunden einrasten"
 
-#: editor_actions.cc:544
+#: editor_actions.cc:569
 msgid "Snap to Minutes"
 msgstr "An Minuten einrasten"
 
-#: editor_actions.cc:546
+#: editor_actions.cc:571
 msgid "Snap to One Twenty Eighths"
 msgstr "An Schläge/28 einrasten"
 
-#: editor_actions.cc:547
+#: editor_actions.cc:572
 msgid "Snap to Sixty Fourths"
 msgstr "An Schläge/128 einrasten"
 
-#: editor_actions.cc:548
+#: editor_actions.cc:573
 msgid "Snap to Thirty Seconds"
 msgstr "An Schläge/32 einrasten"
 
-#: editor_actions.cc:549
+#: editor_actions.cc:574
 msgid "Snap to Twenty Eighths"
 msgstr "An Schläge/28 einrasten"
 
-#: editor_actions.cc:550
+#: editor_actions.cc:575
 msgid "Snap to Twenty Fourths"
 msgstr "An Schläge/24 einrasten"
 
-#: editor_actions.cc:551
+#: editor_actions.cc:576
 msgid "Snap to Twentieths"
 msgstr "An Schläge/20 einrasten"
 
-#: editor_actions.cc:552
+#: editor_actions.cc:577
 msgid "Snap to Sixteenths"
 msgstr "An Schläge/16 einrasten"
 
-#: editor_actions.cc:553
+#: editor_actions.cc:578
 msgid "Snap to Fourteenths"
 msgstr "An Schläge/14 einrasten"
 
-#: editor_actions.cc:554
+#: editor_actions.cc:579
 msgid "Snap to Twelfths"
 msgstr "An Schläge/12 einrasten"
 
-#: editor_actions.cc:555
+#: editor_actions.cc:580
 msgid "Snap to Tenths"
 msgstr "An Schläge/10 einrasten"
 
-#: editor_actions.cc:556
+#: editor_actions.cc:581
 msgid "Snap to Eighths"
 msgstr "An Schläge/8 einrasten"
 
-#: editor_actions.cc:557
+#: editor_actions.cc:582
 msgid "Snap to Sevenths"
 msgstr "An Schläge/7 einrasten"
 
-#: editor_actions.cc:558
+#: editor_actions.cc:583
 msgid "Snap to Sixths"
 msgstr "An Schläge/6 einrasten"
 
-#: editor_actions.cc:559
+#: editor_actions.cc:584
 msgid "Snap to Fifths"
 msgstr "An Schläge/5 einrasten"
 
-#: editor_actions.cc:560
+#: editor_actions.cc:585
 msgid "Snap to Quarters"
 msgstr "An Schläge/4 einrasten"
 
-#: editor_actions.cc:561
+#: editor_actions.cc:586
 msgid "Snap to Thirds"
 msgstr "An Triolen einrasten"
 
-#: editor_actions.cc:562
+#: editor_actions.cc:587
 msgid "Snap to Halves"
 msgstr "An Schläge/2 einrasten"
 
-#: editor_actions.cc:564
+#: editor_actions.cc:589
 msgid "Snap to Beat"
 msgstr "An Schlägen einrasten"
 
-#: editor_actions.cc:565
+#: editor_actions.cc:590
 msgid "Snap to Bar"
 msgstr "An Takten einrasten"
 
-#: editor_actions.cc:566
+#: editor_actions.cc:591
 msgid "Snap to Mark"
 msgstr "An Markern einrasten"
 
-#: editor_actions.cc:567
+#: editor_actions.cc:592
 msgid "Snap to Region Start"
 msgstr "An Regionenanfang einrasten"
 
-#: editor_actions.cc:568
+#: editor_actions.cc:593
 msgid "Snap to Region End"
 msgstr "An Regionenende einrasten"
 
-#: editor_actions.cc:569
+#: editor_actions.cc:594
 msgid "Snap to Region Sync"
 msgstr "An Regionen-Synchronisationspunkt einrasten"
 
-#: editor_actions.cc:570
+#: editor_actions.cc:595
 msgid "Snap to Region Boundary"
 msgstr "An Regionengrenzen einrasten"
 
-#: editor_actions.cc:572
+#: editor_actions.cc:597
 msgid "Show Marker Lines"
 msgstr "Markerlinien anzeigen"
 
-#: editor_actions.cc:582
+#: editor_actions.cc:607
 msgid "Loop/Punch"
 msgstr "Schleifen/Punchbereiche"
 
-#: editor_actions.cc:586
+#: editor_actions.cc:611
 msgid "Min:Sec"
 msgstr "Min:Sek"
 
-#: editor_actions.cc:588 editor_actions.cc:591 editor_rulers.cc:270
+#: editor_actions.cc:613 editor_actions.cc:616 editor_rulers.cc:270
+#: rc_option_editor.cc:1592
 msgid "Video Monitor"
 msgstr "Videomonitor"
 
-#: editor_actions.cc:590 rc_option_editor.cc:2720
+#: editor_actions.cc:615 rc_option_editor.cc:2844
 msgid "Video"
 msgstr "Video"
 
-#: editor_actions.cc:593
+#: editor_actions.cc:618
 msgid "Always on Top"
 msgstr "Immer oben"
 
-#: editor_actions.cc:595
+#: editor_actions.cc:620
 msgid "Frame number"
 msgstr "Framenummer"
 
-#: editor_actions.cc:596
+#: editor_actions.cc:621
 msgid "Timecode Background"
 msgstr "Timecode-Hintergrund"
 
-#: editor_actions.cc:597
+#: editor_actions.cc:622
 msgid "Fullscreen"
 msgstr "Vollbild"
 
-#: editor_actions.cc:598
+#: editor_actions.cc:623
 msgid "Letterbox"
 msgstr "Letterbox"
 
-#: editor_actions.cc:599
+#: editor_actions.cc:624
 msgid "Original Size"
 msgstr "Originalgröße"
 
-#: editor_actions.cc:656
+#: editor_actions.cc:681
 msgid "Sort"
 msgstr "Sortieren"
 
-#: editor_actions.cc:667 editor_routes.cc:485 mixer_ui.cc:1259
+#: editor_actions.cc:692 editor_routes.cc:549 mixer_ui.cc:1497
 msgid "Show All"
 msgstr "Alles anzeigen"
 
-#: editor_actions.cc:668
+#: editor_actions.cc:693
 msgid "Show Automatic Regions"
 msgstr "Automatische Regionen anzeigen"
 
-#: editor_actions.cc:670
+#: editor_actions.cc:695
 msgid "Ascending"
 msgstr "aufsteigend"
 
-#: editor_actions.cc:672
+#: editor_actions.cc:697
 msgid "Descending"
 msgstr "absteigend"
 
-#: editor_actions.cc:675
+#: editor_actions.cc:700
 msgid "By Region Name"
 msgstr "nach Name der Region"
 
-#: editor_actions.cc:677
+#: editor_actions.cc:702
 msgid "By Region Length"
 msgstr "nach Länge der Region"
 
-#: editor_actions.cc:679
+#: editor_actions.cc:704
 msgid "By Region Position"
 msgstr "nach Position der Region"
 
-#: editor_actions.cc:681
+#: editor_actions.cc:706
 msgid "By Region Timestamp"
 msgstr "nach Zeitstempel der Region"
 
-#: editor_actions.cc:683
+#: editor_actions.cc:708
 msgid "By Region Start in File"
 msgstr "nach Anfang der Region in der Datei"
 
-#: editor_actions.cc:685
+#: editor_actions.cc:710
 msgid "By Region End in File"
 msgstr "nach Ende der Region in der Datei"
 
-#: editor_actions.cc:687
+#: editor_actions.cc:712
 msgid "By Source File Name"
 msgstr "nach Namen der Quelldatei"
 
-#: editor_actions.cc:689
+#: editor_actions.cc:714
 msgid "By Source File Length"
 msgstr "nach Länge der Quelldatei"
 
-#: editor_actions.cc:691
+#: editor_actions.cc:716
 msgid "By Source File Creation Date"
 msgstr "nach Erstellungsdatum der Quelldatei"
 
-#: editor_actions.cc:693
+#: editor_actions.cc:718
 msgid "By Source Filesystem"
 msgstr "nach Dateisystem der Quelle"
 
-#: editor_actions.cc:696
+#: editor_actions.cc:721
 msgid "Remove Unused"
 msgstr "Ungenutzte entfernen"
 
-#: editor_actions.cc:698
+#: editor_actions.cc:723
 msgid "Import PT session"
 msgstr "PT Projekt importieren"
 
-#: editor_actions.cc:703 editor_audio_import.cc:282 editor_pt_import.cc:148
-#: session_import_dialog.cc:75 session_import_dialog.cc:95
-#: session_metadata_dialog.cc:418 sfdb_ui.cc:558 editor_videotimeline.cc:91
+#: editor_actions.cc:728 editor_audio_import.cc:282 editor_pt_import.cc:149
+#: luawindow.cc:99 session_import_dialog.cc:75 session_import_dialog.cc:95
+#: session_metadata_dialog.cc:421 sfdb_ui.cc:558 editor_videotimeline.cc:91
 msgid "Import"
 msgstr "Importieren"
 
-#: editor_actions.cc:706
+#: editor_actions.cc:731
 msgid "Import to Region List..."
 msgstr "In Regionenliste importieren"
 
-#: editor_actions.cc:709 session_import_dialog.cc:44
+#: editor_actions.cc:734 session_import_dialog.cc:44
 #: session_import_dialog.cc:65
 msgid "Import from Session"
 msgstr "Aus Projekt importieren"
 
-#: editor_actions.cc:713
+#: editor_actions.cc:738
 msgid "Bring all media into session folder"
 msgstr "Alle Medien in Projektordner kopieren"
 
-#: editor_actions.cc:716
+#: editor_actions.cc:741
 msgid "Show Summary"
 msgstr "Projektübersicht anzeigen"
 
-#: editor_actions.cc:718
+#: editor_actions.cc:743
 msgid "Show Group Tabs"
 msgstr "Gruppierungsleiste anzeigen"
 
-#: editor_actions.cc:720
+#: editor_actions.cc:745
 msgid "Show Measure Lines"
 msgstr "Zeige Taktlinien"
 
-#: editor_actions.cc:724
-msgid "Show Logo"
-msgstr "Zeige Logo"
-
-#: editor_actions.cc:728
+#: editor_actions.cc:747
 msgid "Toggle MIDI Input Active for Editor-Selected Tracks/Busses"
 msgstr "MIDI Eingang für im Editor ausgewählte Spuren/Busse de/aktivieren"
 
-#: editor_actions.cc:751
-msgid "Loaded editor bindings from %1"
-msgstr "Editor-Tastenkürzel aus %1 geladen"
-
-#: editor_actions.cc:753
-msgid "Could not find editor.bindings in search path %1"
-msgstr "Konnte editor.bindings im Suchpfad %1 nicht finden"
-
-#: editor_actions.cc:1097 editor_actions.cc:1493 editor_actions.cc:1504
-#: editor_actions.cc:1557 editor_actions.cc:1568 editor_actions.cc:1615
-#: editor_actions.cc:1625 editor_regions.cc:1574
+#: editor_actions.cc:1081 editor_actions.cc:1477 editor_actions.cc:1488
+#: editor_actions.cc:1541 editor_actions.cc:1552 editor_actions.cc:1599
+#: editor_actions.cc:1609 editor_regions.cc:1657 luainstance.cc:330
+#: luainstance.cc:1714
 msgid "programming error: %1: %2"
 msgstr "Programmierfehler: %1: %2"
 
-#: editor_actions.cc:1793
+#: editor_actions.cc:1791
 msgid "Raise"
 msgstr "Nach oben"
 
-#: editor_actions.cc:1796
+#: editor_actions.cc:1794
 msgid "Raise to Top"
 msgstr "Ganz nach oben"
 
-#: editor_actions.cc:1799
+#: editor_actions.cc:1797
 msgid "Lower"
 msgstr "Nach unten"
 
-#: editor_actions.cc:1802
+#: editor_actions.cc:1800
 msgid "Lower to Bottom"
 msgstr "Ganz nach unten"
 
-#: editor_actions.cc:1805
+#: editor_actions.cc:1803
 msgid "Move to Original Position"
 msgstr "Zur Ursprungsposition verschieben"
 
-#: editor_actions.cc:1810
+#: editor_actions.cc:1808
 msgid "Lock to Video"
 msgstr "an Video koppeln"
 
-#: editor_actions.cc:1815 editor_markers.cc:912
+#: editor_actions.cc:1813 editor_markers.cc:917
 msgid "Glue to Bars and Beats"
 msgstr "An Takte und Schläge binden"
 
-#: editor_actions.cc:1820
+#: editor_actions.cc:1818
 msgid "Remove Sync"
 msgstr "Synchronisationspunkt entfernen"
 
-#: editor_actions.cc:1823 mixer_strip.cc:2088 monitor_section.cc:243
-#: monitor_section.cc:313 route_time_axis.cc:256 route_time_axis.cc:538
+#: editor_actions.cc:1821 mixer_strip.cc:2200 monitor_section.cc:253
+#: monitor_section.cc:321 route_time_axis.cc:264 route_time_axis.cc:550
 msgid "Mute"
 msgstr "Mute"
 
-#: editor_actions.cc:1826
+#: editor_actions.cc:1824
 msgid "Normalize..."
 msgstr "Normalisieren..."
 
-#: editor_actions.cc:1829
+#: editor_actions.cc:1827
 msgid "Reverse"
 msgstr "Umkehren"
 
-#: editor_actions.cc:1832
+#: editor_actions.cc:1830
 msgid "Make Mono Regions"
 msgstr "In Mono-Regionen umwandeln"
 
-#: editor_actions.cc:1835
+#: editor_actions.cc:1833
 msgid "Boost Gain"
 msgstr "Lautstärke erhöhen"
 
-#: editor_actions.cc:1838
+#: editor_actions.cc:1836
 msgid "Cut Gain"
 msgstr "Lautstärke reduzieren"
 
-#: editor_actions.cc:1841
+#: editor_actions.cc:1839
 msgid "Pitch Shift..."
 msgstr "Tonhöhe ändern..."
 
-#: editor_actions.cc:1847
+#: editor_actions.cc:1845
 msgid "Opaque"
 msgstr "Deckend"
 
-#: editor_actions.cc:1851 editor_regions.cc:120
+#: editor_actions.cc:1849 editor_regions.cc:164
 msgid "Fade In"
 msgstr "Fade In"
 
-#: editor_actions.cc:1856 editor_regions.cc:121
+#: editor_actions.cc:1854 editor_regions.cc:165
 msgid "Fade Out"
 msgstr "Fade Out"
 
-#: editor_actions.cc:1871
+#: editor_actions.cc:1869
 msgid "Multi-Duplicate..."
 msgstr "Mehrfach duplizieren..."
 
-#: editor_actions.cc:1876
+#: editor_actions.cc:1874
 msgid "Fill Track"
 msgstr "Spur auffüllen"
 
-#: editor_actions.cc:1880 editor_markers.cc:1000
+#: editor_actions.cc:1878 editor_markers.cc:1033
 msgid "Set Loop Range"
 msgstr "Schleife erstellen"
 
-#: editor_actions.cc:1887
+#: editor_actions.cc:1885
 msgid "Set Punch"
 msgstr "Punchbereich erstellen"
 
-#: editor_actions.cc:1891
+#: editor_actions.cc:1889
 msgid "Add Single Range Marker"
 msgstr "Einzelnen Bereichsmarker einfügen"
 
-#: editor_actions.cc:1896
+#: editor_actions.cc:1894
 msgid "Add Range Marker Per Region"
 msgstr "Einen Bereichsmarker pro Region einfügen"
 
-#: editor_actions.cc:1900
+#: editor_actions.cc:1898
 msgid "Snap Position to Grid"
 msgstr "Positionszeiger einrasten"
 
-#: editor_actions.cc:1903
+#: editor_actions.cc:1901
 msgid "Close Gaps"
 msgstr "Lücken schließen"
 
-#: editor_actions.cc:1906
+#: editor_actions.cc:1904
 msgid "Rhythm Ferret..."
 msgstr "Rhythm Ferret..."
 
-#: editor_actions.cc:1909
+#: editor_actions.cc:1907
 msgid "Export..."
 msgstr "Exportieren..."
 
-#: editor_actions.cc:1915
+#: editor_actions.cc:1913
 msgid "Separate Under"
 msgstr "Bereich unter aktueller Region entfernen"
 
-#: editor_actions.cc:1919 editor_actions.cc:1920
+#: editor_actions.cc:1917 editor_actions.cc:1918
 msgid "Set Fade In Length"
 msgstr "Fade-In bis Positionszeiger"
 
-#: editor_actions.cc:1921 editor_actions.cc:1922
+#: editor_actions.cc:1919 editor_actions.cc:1920
 msgid "Set Fade Out Length"
 msgstr "Fade-Out ab Positionszeiger"
 
-#: editor_actions.cc:1924
+#: editor_actions.cc:1922
 msgid "Set Tempo from Region = Bar"
 msgstr "Regionlänge = Taktlänge setzen"
 
-#: editor_actions.cc:1929
+#: editor_actions.cc:1927
 msgid "Split at Percussion Onsets"
 msgstr "Regionen an perkussiven Schlägen teilen"
 
-#: editor_actions.cc:1934
+#: editor_actions.cc:1932
 msgid "List Editor..."
 msgstr "Eventlisteneditor..."
 
-#: editor_actions.cc:1937
+#: editor_actions.cc:1935
 msgid "Properties..."
 msgstr "Eigenschaften..."
 
-#: editor_actions.cc:1941
+#: editor_actions.cc:1939
 msgid "Bounce (with processing)"
 msgstr "Bounce (mit Signalverarbeitung)"
 
-#: editor_actions.cc:1942
+#: editor_actions.cc:1940
 msgid "Bounce (without processing)"
 msgstr "Bounce (ohne Signalverarbeitung)"
 
-#: editor_actions.cc:1943
+#: editor_actions.cc:1941
 msgid "Combine"
 msgstr "Verbinden (combine)"
 
-#: editor_actions.cc:1944
+#: editor_actions.cc:1942
 msgid "Uncombine"
 msgstr "Trennen (uncombine)"
 
-#: editor_actions.cc:1946
+#: editor_actions.cc:1944
+msgid "Loudness Analysis..."
+msgstr "Lautheitsanalyse..."
+
+#: editor_actions.cc:1945
 msgid "Spectral Analysis..."
 msgstr "FFT-Analyse"
 
-#: editor_actions.cc:1948
+#: editor_actions.cc:1947
 msgid "Reset Envelope"
 msgstr "Lautstärkekurve zurücksetzen"
 
-#: editor_actions.cc:1950
+#: editor_actions.cc:1949
 msgid "Reset Gain"
 msgstr "Lautstärke zurücksetzen"
 
-#: editor_actions.cc:1955
+#: editor_actions.cc:1954
 msgid "Envelope Active"
 msgstr "Lautstärkekurve ist aktiv"
 
-#: editor_actions.cc:1963 editor_actions.cc:1964
+#: editor_actions.cc:1962 editor_actions.cc:1963
 msgid "Insert Patch Change..."
 msgstr "Patch Change einfügen..."
 
-#: editor_actions.cc:1965
+#: editor_actions.cc:1964
 msgid "Unlink from other copies"
 msgstr "Von anderen Kopien entkoppeln"
 
-#: editor_actions.cc:1966
+#: editor_actions.cc:1965
 msgid "Strip Silence..."
 msgstr "Stille entfernen..."
 
-#: editor_actions.cc:1967
+#: editor_actions.cc:1966
 msgid "Set Range Selection"
 msgstr "Bereich auswählen"
 
-#: editor_actions.cc:1969 editor_actions.cc:1970
+#: editor_actions.cc:1968 editor_actions.cc:1969
 msgid "Nudge Later"
 msgstr "Schritt nach hinten"
 
-#: editor_actions.cc:1971 editor_actions.cc:1972
+#: editor_actions.cc:1970 editor_actions.cc:1971
 msgid "Nudge Earlier"
 msgstr "Schritt nach vorne"
 
-#: editor_actions.cc:1974
+#: editor_actions.cc:1973
 msgid "Sequence Regions"
 msgstr "Regionen aneinanderreihen"
 
-#: editor_actions.cc:1979
+#: editor_actions.cc:1978
 msgid "Nudge Later by Capture Offset"
 msgstr "Schritt nach hinten um Aufnahme-Offset"
 
-#: editor_actions.cc:1986
+#: editor_actions.cc:1985
 msgid "Nudge Earlier by Capture Offset"
 msgstr "Schritt nach vorne um Aufnahme-Offset"
 
-#: editor_actions.cc:1990
+#: editor_actions.cc:1989
 msgid "Trim to Loop"
 msgstr "Auf Schleife kürzen"
 
-#: editor_actions.cc:1991
+#: editor_actions.cc:1990
 msgid "Trim to Punch"
 msgstr "Auf Punchbereich kürzen"
 
-#: editor_actions.cc:1993
+#: editor_actions.cc:1992
 msgid "Trim to Previous"
 msgstr "Zur vorherigen Region aufschließen"
 
-#: editor_actions.cc:1994
+#: editor_actions.cc:1993
 msgid "Trim to Next"
 msgstr "Zur nächsten Region aufschließen"
 
-#: editor_actions.cc:2001
+#: editor_actions.cc:2000
 msgid "Insert Region from Region List"
 msgstr "Region aus Regionenliste einfügen"
 
-#: editor_actions.cc:2007
+#: editor_actions.cc:2006
 msgid "Set Sync Position"
 msgstr "Synchronisationspunkt setzen"
 
-#: editor_actions.cc:2008
+#: editor_actions.cc:2007
 msgid "Place Transient"
 msgstr "Transienten setzen"
 
-#: editor_actions.cc:2009
+#: editor_actions.cc:2008
 msgid "Split/Separate"
 msgstr "Teilen/Auftrennen"
 
-#: editor_actions.cc:2010
+#: editor_actions.cc:2009
 msgid "Trim Start at Edit Point"
 msgstr "Anfang der Region am Arbeitspunkt abschneiden"
 
-#: editor_actions.cc:2011
+#: editor_actions.cc:2010
 msgid "Trim End at Edit Point"
 msgstr "Ende der Region am Arbeitspunkt abschneiden"
 
-#: editor_actions.cc:2016
+#: editor_actions.cc:2015
 msgid "Align Start"
 msgstr "Anfang ausrichten"
 
-#: editor_actions.cc:2023
+#: editor_actions.cc:2022
 msgid "Align Start Relative"
 msgstr "Anfang relativ ausrichten"
 
-#: editor_actions.cc:2027
+#: editor_actions.cc:2026
 msgid "Align End"
 msgstr "Ende ausrichten"
 
-#: editor_actions.cc:2032
+#: editor_actions.cc:2031
 msgid "Align End Relative"
 msgstr "Ende relativ ausrichten"
 
-#: editor_actions.cc:2039
+#: editor_actions.cc:2038
 msgid "Align Sync"
 msgstr "Synchronisationspunkt ausrichten"
 
-#: editor_actions.cc:2046
+#: editor_actions.cc:2045
 msgid "Align Sync Relative"
 msgstr "Synchronisationspunkt relativ ausrichten"
 
-#: editor_actions.cc:2050 editor_actions.cc:2053
+#: editor_actions.cc:2049 editor_actions.cc:2050
 msgid "Choose Top..."
 msgstr "Oberste Region auswählen..."
 
@@ -4987,33 +5310,33 @@ msgstr ""
 "Das Projekt enthält bereits eine Datei namens %1. Wollen Sie %2 als neue "
 "Quelle importieren, oder überspringen?"
 
-#: editor_audio_import.cc:282 editor_pt_import.cc:148
+#: editor_audio_import.cc:282 editor_pt_import.cc:149
 #: editor_videotimeline.cc:91
 msgid "Cancel Import"
 msgstr "Importieren Abbrechen"
 
-#: editor_audio_import.cc:562
+#: editor_audio_import.cc:565
 msgid "Editor: cannot open file \"%1\", (%2)"
 msgstr "Editor: kann die Datei \"%1\" nicht öffnen (%2)"
 
-#: editor_audio_import.cc:570
+#: editor_audio_import.cc:573
 msgid "Cancel entire import"
 msgstr "Importieren Abbrechen"
 
-#: editor_audio_import.cc:571
+#: editor_audio_import.cc:574
 msgid "Don't embed it"
 msgstr "Nicht einbetten"
 
-#: editor_audio_import.cc:572
+#: editor_audio_import.cc:575
 msgid "Embed all without questions"
 msgstr "Alle Importieren ohne nachzufragen"
 
-#: editor_audio_import.cc:575 editor_audio_import.cc:601
-#: export_format_dialog.cc:60
+#: editor_audio_import.cc:578 editor_audio_import.cc:604
+#: export_format_dialog.cc:68
 msgid "Sample rate"
 msgstr "Samplerate"
 
-#: editor_audio_import.cc:576 editor_audio_import.cc:602
+#: editor_audio_import.cc:579 editor_audio_import.cc:605
 msgid ""
 "%1\n"
 "This audiofile's sample rate doesn't match the session sample rate!"
@@ -5022,7 +5345,7 @@ msgstr ""
 "Die Samplerate dieser Audiodatei unterscheidet sich von der Samplerate "
 "dieses Projekts."
 
-#: editor_audio_import.cc:598
+#: editor_audio_import.cc:601
 msgid "Embed it anyway"
 msgstr "Trotzdem importieren"
 
@@ -5037,13 +5360,13 @@ msgstr "PT Projekt importieren"
 
 #: editor_pt_import.cc:97
 msgid "%1: this is only the directory/folder name, not the filename.\n"
-msgstr "%1: dies ist nur der Verzeichnisname, nicht der Dateiname."
+msgstr "%1: dies ist nur der Verzeichnisname, nicht der Dateiname.\n"
 
-#: editor_pt_import.cc:131
+#: editor_pt_import.cc:132
 msgid "Doesn't seem to be a valid PT session file"
 msgstr "Scheint keine gültige PT Projektdatei zu sein"
 
-#: editor_pt_import.cc:135
+#: editor_pt_import.cc:136
 msgid ""
 "PT v%1 Session @ %2Hz\n"
 "\n"
@@ -5061,29 +5384,45 @@ msgstr ""
 "\n"
 "Fortfahren..."
 
-#: editor_canvas_events.cc:1308 editor_drag.cc:1418
+#: editor_pt_import.cc:175
+msgid ""
+"Failed to load one or more of the audio files, but continuing to attempt "
+"import."
+msgstr ""
+"Konnte eine oder mehrere Audiodateien nicht laden, versuche aber weiterhin "
+"den Import."
+
+#: editor_pt_import.cc:178
+msgid "Success! Import should complete soon."
+msgstr "Erfolg! Import sollte bald abgeschlossen sein."
+
+#: editor_pt_import.cc:263
+msgid "PTImport: UINT_MAX routes? impossible!"
+msgstr "PTImport: UINT_MAX Routen? unmöglich!"
+
+#: editor_canvas_events.cc:1296 editor_drag.cc:1418
 msgid "Could not create new track after region placed in the drop zone"
 msgstr ""
 "Konnte keine neue Spur erzeugen, nachdem die Region in der Drop Zone "
 "platziert wurde"
 
-#: editor_drag.cc:1310
+#: editor_drag.cc:1306
 msgid "fixed time region drag"
 msgstr "Region zeitgleich verschieben"
 
-#: editor_drag.cc:2245
+#: editor_drag.cc:2249
 msgid "Ripple drag"
 msgstr "Wellenmodus-Ziehen"
 
-#: editor_drag.cc:2307
+#: editor_drag.cc:2311
 msgid "create region"
 msgstr "Region erzeugen"
 
-#: editor_drag.cc:2426 midi_region_view.cc:2834
+#: editor_drag.cc:2430 midi_region_view.cc:2857
 msgid "resize notes"
 msgstr "Notenlänge ändern"
 
-#: editor_drag.cc:2609 editor_drag.cc:2644
+#: editor_drag.cc:2613 editor_drag.cc:2648
 msgid ""
 "One or more Audio Regions\n"
 "are both Locked and\n"
@@ -5095,79 +5434,87 @@ msgstr ""
 "an das Video gekoppelt.\n"
 "Das Video kann nicht bewegt werden."
 
-#: editor_drag.cc:2679
+#: editor_drag.cc:2683
 msgid "Video Start:"
 msgstr "Videostart"
 
-#: editor_drag.cc:2681
+#: editor_drag.cc:2685
 msgid "Diff:"
 msgstr "Diff:"
 
-#: editor_drag.cc:2703
+#: editor_drag.cc:2707
 msgid "Move Video"
 msgstr "Bewege Video"
 
-#: editor_drag.cc:3212
+#: editor_drag.cc:3176
+msgid "move meter mark"
+msgstr "Taktwechsel bewegen"
+
+#: editor_drag.cc:3178
 msgid "copy meter mark"
 msgstr "Taktmarker kopieren"
 
-#: editor_drag.cc:3220
-msgid "move meter mark"
-msgstr "Taktwechsel bewegen"
+#: editor_drag.cc:3278
+msgid "inactive"
+msgstr "inaktiv"
 
-#: editor_drag.cc:3308
+#: editor_drag.cc:3323
 msgid "move tempo mark"
 msgstr "Tempowechsel bewegen"
 
-#: editor_drag.cc:3345
+#: editor_drag.cc:3330
 msgid "copy tempo mark"
 msgstr "Tempomarker kopieren"
 
-#: editor_drag.cc:3609
+#: editor_drag.cc:3461
+msgid "dilate tempo"
+msgstr "Tempo dehnen"
+
+#: editor_drag.cc:3735
 msgid "change fade in length"
 msgstr "Ändere Fade-In Länge"
 
-#: editor_drag.cc:3734
+#: editor_drag.cc:3860
 msgid "change fade out length"
 msgstr "Fade-Out verändern"
 
-#: editor_drag.cc:4110
+#: editor_drag.cc:4238
 msgid "move marker"
 msgstr "Marker bewegen"
 
-#: editor_drag.cc:4373 editor_drag.cc:5694
+#: editor_drag.cc:4505 editor_drag.cc:5832
 msgid "automation range move"
 msgstr "Automationsbereich bewegen"
 
-#: editor_drag.cc:4747
+#: editor_drag.cc:4889
 msgid "An error occurred while executing time stretch operation"
 msgstr "Beim Ausführen der Timestretch-Operation trat ein Fehler auf"
 
-#: editor_drag.cc:5208
+#: editor_drag.cc:5350
 msgid "programming_error: %1"
 msgstr "Programmierfehler: %1"
 
-#: editor_drag.cc:5277 editor_drag.cc:5287
+#: editor_drag.cc:5419 editor_drag.cc:5429
 msgid "new skip marker"
 msgstr "neuer Sprungmarker"
 
-#: editor_drag.cc:5278
+#: editor_drag.cc:5420
 msgid "skip"
 msgstr "Sprung"
 
-#: editor_drag.cc:5282 location_ui.cc:58
+#: editor_drag.cc:5424 location_ui.cc:60
 msgid "CD"
 msgstr "CD"
 
-#: editor_drag.cc:5283
+#: editor_drag.cc:5425
 msgid "new CD marker"
 msgstr "neuer CD Marker"
 
-#: editor_drag.cc:5288 editor_route_groups.cc:438 mixer_ui.cc:1594
+#: editor_drag.cc:5430 editor_route_groups.cc:439 mixer_ui.cc:1840
 msgid "unnamed"
 msgstr "unbenannt"
 
-#: editor_drag.cc:5601
+#: editor_drag.cc:5739
 msgid "Automation range drag created for invalid region type"
 msgstr "Automationsbereichs-Ziehen für ungültigen Regionstyp erzeugt"
 
@@ -5183,7 +5530,7 @@ msgstr "Farbe des Gruppen-Reiters"
 msgid "Name of Group"
 msgstr "Gruppenname"
 
-#: editor_route_groups.cc:99 editor_routes.cc:209
+#: editor_route_groups.cc:99 editor_routes.cc:234
 msgid "Visible|V"
 msgstr "V"
 
@@ -5215,9 +5562,9 @@ msgstr "Rel"
 msgid "Relative Gain Changes?"
 msgstr "Relative Lautstärke-Änderungen"
 
-#: editor_route_groups.cc:103 editor_regions.cc:124 editor_routes.cc:213
-#: mixer_strip.cc:2117 meter_strip.cc:367 route_time_axis.cc:2750
-#: time_axis_view.cc:1199
+#: editor_route_groups.cc:103 editor_regions.cc:168 editor_routes.cc:239
+#: mixer_strip.cc:2229 meter_strip.cc:365 route_time_axis.cc:2742
+#: time_axis_view.cc:1110
 msgid "Mute|M"
 msgstr "M"
 
@@ -5225,8 +5572,9 @@ msgstr "M"
 msgid "Sharing Mute?"
 msgstr "Stummschaltung teilen?"
 
-#: editor_route_groups.cc:104 editor_routes.cc:214 mixer_strip.cc:2130
-#: meter_strip.cc:375 route_time_axis.cc:2747
+#: editor_route_groups.cc:104 editor_routes.cc:240 mixer_strip.cc:2242
+#: meter_strip.cc:373 route_time_axis.cc:2739 vca_master_strip.cc:211
+#: vca_time_axis.cc:236
 msgid "Solo|S"
 msgstr "S"
 
@@ -5234,8 +5582,8 @@ msgstr "S"
 msgid "Sharing Solo?"
 msgstr "Solo teilen?"
 
-#: editor_route_groups.cc:105 midi_time_axis.cc:1630 midi_time_axis.cc:1633
-#: midi_time_axis.cc:1636
+#: editor_route_groups.cc:105 midi_time_axis.cc:1626 midi_time_axis.cc:1629
+#: midi_time_axis.cc:1632
 msgid "Rec"
 msgstr "Rec"
 
@@ -5259,7 +5607,7 @@ msgstr "Sel"
 msgid "Sharing Selected/Editing Status?"
 msgstr "Auswahl-/Editierzustand teilen?"
 
-#: editor_route_groups.cc:108 editor_routes.cc:210
+#: editor_route_groups.cc:108 editor_routes.cc:235
 msgid "Active|A"
 msgstr "A"
 
@@ -5267,13 +5615,13 @@ msgstr "A"
 msgid "Sharing Active Status?"
 msgstr "Einschaltzustand teilen?"
 
-#: editor_export_audio.cc:93 editor_markers.cc:733 editor_markers.cc:827
-#: editor_markers.cc:1012 editor_markers.cc:1030 editor_markers.cc:1048
-#: editor_markers.cc:1067 editor_markers.cc:1086 editor_markers.cc:1116
-#: editor_markers.cc:1147 editor_markers.cc:1177 editor_markers.cc:1205
-#: editor_markers.cc:1236 editor_markers.cc:1261 editor_markers.cc:1312
-#: editor_markers.cc:1356 editor_markers.cc:1382 editor_markers.cc:1576
-#: editor_mouse.cc:2248
+#: editor_export_audio.cc:93 editor_markers.cc:733 editor_markers.cc:832
+#: editor_markers.cc:1045 editor_markers.cc:1063 editor_markers.cc:1081
+#: editor_markers.cc:1100 editor_markers.cc:1119 editor_markers.cc:1149
+#: editor_markers.cc:1180 editor_markers.cc:1210 editor_markers.cc:1238
+#: editor_markers.cc:1269 editor_markers.cc:1294 editor_markers.cc:1345
+#: editor_markers.cc:1458 editor_markers.cc:1484 editor_markers.cc:1678
+#: editor_mouse.cc:2255
 msgid "programming error: marker canvas item has no marker object pointer!"
 msgstr "Programmierfehler: marker canvas item has no marker object pointer!"
 
@@ -5281,7 +5629,7 @@ msgstr "Programmierfehler: marker canvas item has no marker object pointer!"
 msgid "Confirm MIDI File Overwrite"
 msgstr "Bestätige das Überschreiben der MIDI-Datei"
 
-#: editor_export_audio.cc:115 utils_videotl.cc:73
+#: editor_export_audio.cc:115 utils_videotl.cc:75
 msgid "A file with the same name already exists. Do you want to overwrite it?"
 msgstr ""
 "Eine Datei mit diesem Namen existiert bereits. Wollen Sie sie überschreiben?"
@@ -5302,20 +5650,20 @@ msgstr "Ende"
 msgid "mark"
 msgstr "Marker"
 
-#: editor_markers.cc:650 editor_ops.cc:2102 editor_ops.cc:2124
-#: editor_ops.cc:2240 editor_ops.cc:2277 location_ui.cc:1025
+#: editor_markers.cc:650 editor_ops.cc:2164 editor_ops.cc:2186
+#: editor_ops.cc:2304 editor_ops.cc:2341 location_ui.cc:1049
 msgid "add marker"
 msgstr "Marker hinzufügen"
 
-#: editor_markers.cc:682 editor_markers.cc:1456
+#: editor_markers.cc:682 editor_markers.cc:1558
 msgid "set loop range"
 msgstr "Loopbereich festlegen"
 
-#: editor_markers.cc:698 editor_markers.cc:1462
+#: editor_markers.cc:698 editor_markers.cc:1564
 msgid "set punch range"
 msgstr "Punchbereich festlegen"
 
-#: editor_markers.cc:715 editor_ops.cc:4092
+#: editor_markers.cc:715 editor_ops.cc:4159
 msgid "range"
 msgstr "Bereich"
 
@@ -5323,107 +5671,136 @@ msgstr "Bereich"
 msgid "new range marker"
 msgstr "Neuer Bereich"
 
-#: editor_markers.cc:751 editor_ops.cc:2208 location_ui.cc:861
+#: editor_markers.cc:751 editor_ops.cc:2272 location_ui.cc:885
 msgid "remove marker"
 msgstr "Marker entfernen"
 
-#: editor_markers.cc:894
+#: editor_markers.cc:899
 msgid "Locate to Here"
 msgstr "Hierhin setzen"
 
-#: editor_markers.cc:895
+#: editor_markers.cc:900
 msgid "Play from Here"
 msgstr "Wiedergabe ab hier"
 
-#: editor_markers.cc:896
+#: editor_markers.cc:901
 msgid "Move Mark to Playhead"
 msgstr "Marker zum Positionszeiger verschieben"
 
-#: editor_markers.cc:900
+#: editor_markers.cc:905
 msgid "Create Range to Next Marker"
 msgstr "Bereich bis zum nächsten Marker erstellen"
 
-#: editor_markers.cc:941
+#: editor_markers.cc:946
 msgid "Locate to Marker"
 msgstr "Positionszeiger zu Marker setzen"
 
-#: editor_markers.cc:942
+#: editor_markers.cc:947
 msgid "Play from Marker"
 msgstr "Wiedergabe ab Marker"
 
-#: editor_markers.cc:945
+#: editor_markers.cc:950
 msgid "Set Marker from Playhead"
 msgstr "Marker beim Positionszeiger erzeugen"
 
-#: editor_markers.cc:947
+#: editor_markers.cc:951
 msgid "Set Range from Selection"
 msgstr "Bereich aus Auswahl bilden"
 
-#: editor_markers.cc:957
+#: editor_markers.cc:960
 msgid "Hide Range"
 msgstr "Bereich verbergen"
 
-#: editor_markers.cc:958
+#: editor_markers.cc:961
 msgid "Rename Range..."
 msgstr "Bereich umbenennen..."
 
-#: editor_markers.cc:962
+#: editor_markers.cc:965
 msgid "Remove Range"
 msgstr "Bereich entfernen"
 
-#: editor_markers.cc:969
+#: editor_markers.cc:972
 msgid "Separate Regions in Range"
 msgstr "Regionen an Bereichsgrenzen teilen"
 
-#: editor_markers.cc:972
+#: editor_markers.cc:974
 msgid "Select Range"
 msgstr "Bereich auswählen"
 
-#: editor_markers.cc:1001
+#: editor_markers.cc:987
+msgid "Make Ramped"
+msgstr "Ändere zu Verlaufend"
+
+#: editor_markers.cc:989
+msgid "Make Constant"
+msgstr "Ändere zu Konstant"
+
+#: editor_markers.cc:993 editor_markers.cc:1013
+msgid "Lock to Music"
+msgstr "Binde an Musik"
+
+#: editor_markers.cc:995 editor_markers.cc:1015
+msgid "Lock to Audio"
+msgstr "Binde an Audio"
+
+#: editor_markers.cc:1034
 msgid "Set Punch Range"
 msgstr "Punchbereich erstellen"
 
-#: editor_markers.cc:1407 editor_ops.cc:2057
+#: editor_markers.cc:1391
+msgid "change meter lock style"
+msgstr "ändere Bindungsart des Metrums"
+
+#: editor_markers.cc:1414
+msgid "change tempo lock style"
+msgstr "ändere Bindungsart des Tempos"
+
+#: editor_markers.cc:1441
+msgid "change tempo type"
+msgstr "ändere Tempo-Typ"
+
+#: editor_markers.cc:1509 editor_ops.cc:2119
 msgid "New Name:"
 msgstr "Neuer Name: "
 
-#: editor_markers.cc:1410
+#: editor_markers.cc:1512
 msgid "Rename Mark"
 msgstr "Marker umbenennen"
 
-#: editor_markers.cc:1412
+#: editor_markers.cc:1514
 msgid "Rename Range"
 msgstr "Bereich umbenennen"
 
-#: editor_markers.cc:1419 editor_mouse.cc:2265 processor_box.cc:2261
-#: processor_box.cc:2728 route_time_axis.cc:1112 route_ui.cc:1616
+#: editor_markers.cc:1521 editor_mouse.cc:2272 processor_box.cc:3204
+#: processor_box.cc:3693 route_time_axis.cc:1110 route_ui.cc:1641
+#: vca_master_strip.cc:395
 msgid "Rename"
 msgstr "Umbenennen"
 
-#: editor_markers.cc:1432
+#: editor_markers.cc:1534
 msgid "rename marker"
 msgstr "Marker umbenennen"
 
-#: editor_mixer.cc:91
+#: editor_mixer.cc:98
 msgid "This screen is not tall enough to display the editor mixer"
 msgstr ""
 "Dieser Bildschirm ist nicht hoch genug, um den Editor-Mixer darzustellen"
 
-#: editor_mouse.cc:1343 editor_mouse.cc:1361 editor_tempodisplay.cc:270
+#: editor_mouse.cc:1345 editor_mouse.cc:1363 editor_tempodisplay.cc:384
 msgid ""
 "programming error: tempo marker canvas item has no marker object pointer!"
 msgstr ""
 "Programmierfehler: tempo marker canvas item has no marker object pointer!"
 
-#: editor_mouse.cc:1348 editor_tempodisplay.cc:275
+#: editor_mouse.cc:1350 editor_tempodisplay.cc:389
 msgid "programming error: marker for tempo is not a tempo marker!"
 msgstr "Programmierfehler: marker for tempo is not a tempo marker!"
 
-#: editor_mouse.cc:1366 editor_tempodisplay.cc:375
+#: editor_mouse.cc:1368 editor_tempodisplay.cc:507
 msgid "programming error: marker for meter is not a meter marker!"
 msgstr "Programmierfehler: marker for meter is not a meter marker!"
 
-#: editor_mouse.cc:2013 editor_mouse.cc:2038 editor_mouse.cc:2051
+#: editor_mouse.cc:2016 editor_mouse.cc:2041 editor_mouse.cc:2054
 msgid ""
 "programming error: control point canvas item has no control point object "
 "pointer!"
@@ -5431,179 +5808,183 @@ msgstr ""
 "Programmierfehler: control point canvas item has no control point object "
 "pointer!"
 
-#: editor_mouse.cc:2186
+#: editor_mouse.cc:2085
+msgid "edit note(s)"
+msgstr "Note(n) bearbeiten"
+
+#: editor_mouse.cc:2193
 msgid "start point trim"
 msgstr "Startpunkt ändern"
 
-#: editor_mouse.cc:2211
+#: editor_mouse.cc:2218
 msgid "end point trim"
 msgstr "Endpunkt ändern"
 
-#: editor_mouse.cc:2263
+#: editor_mouse.cc:2270
 msgid "Name for region:"
 msgstr "Name für Region:"
 
-#: editor_ops.cc:167
+#: editor_ops.cc:168
 msgid "split"
 msgstr "teile"
 
-#: editor_ops.cc:341
+#: editor_ops.cc:342
 msgid "alter selection"
 msgstr "Auswahl ändern"
 
-#: editor_ops.cc:383
+#: editor_ops.cc:384
 msgid "nudge regions forward"
 msgstr "Regionen Schritt vorwärts"
 
-#: editor_ops.cc:437 editor_ops.cc:528
+#: editor_ops.cc:441 editor_ops.cc:535
 msgid "nudge location forward"
 msgstr "Position Schritt vorwärts"
 
-#: editor_ops.cc:468
+#: editor_ops.cc:472
 msgid "nudge regions backward"
 msgstr "Regionen Schritt nach hinten"
 
-#: editor_ops.cc:560
+#: editor_ops.cc:567
 msgid "nudge forward"
 msgstr "Schritt vorwärts"
 
-#: editor_ops.cc:584
+#: editor_ops.cc:591
 msgid "nudge backward"
 msgstr "Schritt nach hinten"
 
-#: editor_ops.cc:649
+#: editor_ops.cc:656
 msgid "sequence regions"
 msgstr "Regionen aneinanderreihen"
 
-#: editor_ops.cc:711
+#: editor_ops.cc:718
 msgid "build_region_boundary_cache called with snap_type = %1"
 msgstr "build_region_boundary_cache wurde mit snap_type = %1 aufgerufen"
 
-#: editor_ops.cc:2059
+#: editor_ops.cc:2121
 msgid "New Location Marker"
 msgstr "Neuer Positionsmarker"
 
-#: editor_ops.cc:2150 editor_ops.cc:2174
+#: editor_ops.cc:2212 editor_ops.cc:2236
 msgid "Set session start"
 msgstr "Projektstart setzen"
 
-#: editor_ops.cc:2240
+#: editor_ops.cc:2304
 msgid "add markers"
 msgstr "Marker hinzufügen"
 
-#: editor_ops.cc:2336
+#: editor_ops.cc:2400
 msgid "clear markers"
 msgstr "Marker zurücksetzen"
 
-#: editor_ops.cc:2351
+#: editor_ops.cc:2415
 msgid "clear ranges"
 msgstr "Bereiche zurücksetzen"
 
-#: editor_ops.cc:2367
+#: editor_ops.cc:2431
 msgid "clear locations"
 msgstr "Positionen zurücksetzen"
 
-#: editor_ops.cc:2430
+#: editor_ops.cc:2494
 msgid "insert region"
 msgstr "Region einfügen"
 
-#: editor_ops.cc:2621
+#: editor_ops.cc:2685
 msgid "raise regions"
 msgstr "Regionen weiter nach oben"
 
-#: editor_ops.cc:2623
+#: editor_ops.cc:2687
 msgid "raise region"
 msgstr "Region weiter nach oben"
 
-#: editor_ops.cc:2629
+#: editor_ops.cc:2693
 msgid "raise regions to top"
 msgstr "Regionen ganz nach oben"
 
-#: editor_ops.cc:2631
+#: editor_ops.cc:2695
 msgid "raise region to top"
 msgstr "Region ganz nach oben"
 
-#: editor_ops.cc:2637
+#: editor_ops.cc:2701
 msgid "lower regions"
 msgstr "Regionen weiter nach unten"
 
-#: editor_ops.cc:2639 editor_ops.cc:2647
+#: editor_ops.cc:2703 editor_ops.cc:2711
 msgid "lower region"
 msgstr "Region weiter nach unten"
 
-#: editor_ops.cc:2645
+#: editor_ops.cc:2709
 msgid "lower regions to bottom"
 msgstr "Regionen ganz nach unten"
 
-#: editor_ops.cc:2730
+#: editor_ops.cc:2794
 msgid "Rename Region"
 msgstr "Region umbenennen"
 
-#: editor_ops.cc:2732 processor_box.cc:2259 route_ui.cc:1614
+#: editor_ops.cc:2796 processor_box.cc:3202 route_ui.cc:1639
 msgid "New name:"
 msgstr "Neuer Name: "
 
-#: editor_ops.cc:3030
+#: editor_ops.cc:3097
 msgid "separate"
 msgstr "Teilen"
 
-#: editor_ops.cc:3142
+#: editor_ops.cc:3207
 msgid "separate region under"
 msgstr "Bereich unter aktueller Region entfernen"
 
-#: editor_ops.cc:3294
+#: editor_ops.cc:3360
 msgid "trim to selection"
 msgstr "Auf Auswahl kürzen"
 
-#: editor_ops.cc:3376
+#: editor_ops.cc:3442
 msgid "set sync point"
 msgstr "Einrastpunkt definieren"
 
-#: editor_ops.cc:3400
+#: editor_ops.cc:3466
 msgid "remove region sync"
 msgstr "Synchronisationspunkt löschen"
 
-#: editor_ops.cc:3422
+#: editor_ops.cc:3488
 msgid "move regions to original position"
 msgstr "Regionen zu ihrer Ursprungsposition verschieben"
 
-#: editor_ops.cc:3424
+#: editor_ops.cc:3490
 msgid "move region to original position"
 msgstr "Region zu ihrer Ursprungsposition verschieben"
 
-#: editor_ops.cc:3445
+#: editor_ops.cc:3511
 msgid "align selection"
 msgstr "Auswahl ausrichten"
 
-#: editor_ops.cc:3519
+#: editor_ops.cc:3585
 msgid "align selection (relative)"
 msgstr "Auswahl relativ ausrichten"
 
-#: editor_ops.cc:3553
+#: editor_ops.cc:3619
 msgid "align region"
 msgstr "Region ausrichten"
 
-#: editor_ops.cc:3604
+#: editor_ops.cc:3670
 msgid "trim front"
 msgstr "vorne abschneiden"
 
-#: editor_ops.cc:3604
+#: editor_ops.cc:3670
 msgid "trim back"
 msgstr "hinten Abschneiden"
 
-#: editor_ops.cc:3634
+#: editor_ops.cc:3700
 msgid "trim to loop"
 msgstr "Auf Schleife kürzen"
 
-#: editor_ops.cc:3644
+#: editor_ops.cc:3710
 msgid "trim to punch"
 msgstr "Auf Punchbereich kürzen"
 
-#: editor_ops.cc:3766
+#: editor_ops.cc:3832
 msgid "trim to region"
 msgstr "Auf Region kürzen"
 
-#: editor_ops.cc:3825
+#: editor_ops.cc:3891
 msgid ""
 "This track/bus cannot be frozen because the signal adds or loses channels "
 "before reaching the outputs.\n"
@@ -5615,11 +5996,11 @@ msgstr ""
 "Typischerweise wird dies durch ein Plugin verursacht, das Stereo aus einer "
 "Monoquelle oder umgekehrt erzeugt."
 
-#: editor_ops.cc:3828
+#: editor_ops.cc:3894
 msgid "Cannot freeze"
 msgstr "Einfrieren nicht möglich"
 
-#: editor_ops.cc:3834
+#: editor_ops.cc:3900
 msgid ""
 "<b>%1</b>\n"
 "\n"
@@ -5633,23 +6014,23 @@ msgstr ""
 "\n"
 "Einfrieren wird das Signal nur bis zum ersten Send/Insert/Return verarbeiten."
 
-#: editor_ops.cc:3838
+#: editor_ops.cc:3904
 msgid "Freeze anyway"
 msgstr "Trotzdem einfrieren"
 
-#: editor_ops.cc:3839
+#: editor_ops.cc:3905
 msgid "Don't freeze"
 msgstr "Nicht einfrieren"
 
-#: editor_ops.cc:3840
+#: editor_ops.cc:3906
 msgid "Freeze Limits"
 msgstr "Einfrier-Grenzen"
 
-#: editor_ops.cc:3855
+#: editor_ops.cc:3921
 msgid "Cancel Freeze"
 msgstr "Einfrieren abbrechen"
 
-#: editor_ops.cc:3885
+#: editor_ops.cc:3952
 msgid ""
 "You can't perform this operation because the processing of the signal will "
 "cause one or more of the tracks to end up with a region with more channels "
@@ -5664,47 +6045,47 @@ msgstr ""
 "Sie können dies ohne Signalverarbeitung tun, das ist aber eine andere "
 "Operation."
 
-#: editor_ops.cc:3889
+#: editor_ops.cc:3956
 msgid "Cannot bounce"
 msgstr "Kann nicht bouncen"
 
-#: editor_ops.cc:3940
+#: editor_ops.cc:4007
 msgid "bounce range"
 msgstr "Bereich bouncen"
 
-#: editor_ops.cc:4007
+#: editor_ops.cc:4074
 msgid "delete"
 msgstr "Löschen"
 
-#: editor_ops.cc:4010
+#: editor_ops.cc:4077
 msgid "cut"
 msgstr "Ausschneiden"
 
-#: editor_ops.cc:4013
+#: editor_ops.cc:4080
 msgid "copy"
 msgstr "Kopieren"
 
-#: editor_ops.cc:4016
+#: editor_ops.cc:4083
 msgid "clear"
 msgstr "Leeren"
 
-#: editor_ops.cc:4065
+#: editor_ops.cc:4132
 msgid "objects"
 msgstr "Objekte"
 
-#: editor_ops.cc:4275 editor_ops.cc:4360
+#: editor_ops.cc:4342 editor_ops.cc:4427
 msgid "remove region"
 msgstr "Region(en) löschen"
 
-#: editor_ops.cc:4787
-msgid "duplicate selection"
-msgstr "Auswahl duplizieren"
+#: editor_ops.cc:4844
+msgid "duplicate range selection"
+msgstr "Bereichsauswahl duplizieren"
 
-#: editor_ops.cc:4873
+#: editor_ops.cc:4938
 msgid "nudge track"
 msgstr "Spur verschieben"
 
-#: editor_ops.cc:4900
+#: editor_ops.cc:4965
 msgid ""
 "Do you really want to destroy the last capture?\n"
 "(This is destructive and cannot be undone)"
@@ -5712,157 +6093,157 @@ msgstr ""
 "Wollen Sie wirklich die letzte Aufnahme rückgängig machen?\n"
 "(Dies ist destruktiv und kann nicht rückgängig gemacht werden!)"
 
-#: editor_ops.cc:4903 editor_ops.cc:7127 editor_regions.cc:465
+#: editor_ops.cc:4968 editor_ops.cc:7202 editor_regions.cc:503
 #: editor_snapshots.cc:171
 msgid "No, do nothing."
 msgstr "Nein, nichts machen."
 
-#: editor_ops.cc:4904
+#: editor_ops.cc:4969
 msgid "Yes, destroy it."
 msgstr "Ja, entfernen."
 
-#: editor_ops.cc:4906
+#: editor_ops.cc:4971
 msgid "Destroy last capture"
 msgstr "Lösche letzte Aufnahme"
 
-#: editor_ops.cc:4982
+#: editor_ops.cc:5047
 msgid "normalize"
 msgstr "Normalisieren"
 
-#: editor_ops.cc:5080
+#: editor_ops.cc:5145
 msgid "reverse regions"
 msgstr "Regionen umkehren"
 
-#: editor_ops.cc:5116
+#: editor_ops.cc:5182
 msgid "strip silence"
 msgstr "Stille entfernen"
 
-#: editor_ops.cc:5197
+#: editor_ops.cc:5263
 msgid "Fork Region(s)"
 msgstr "Region(en) abzweigen"
 
-#: editor_ops.cc:5204
+#: editor_ops.cc:5270
 msgid "Could not unlink %1"
 msgstr "Konnte die Bindung von %1 nicht lösen"
 
-#: editor_ops.cc:5465
+#: editor_ops.cc:5532
 msgid "reset region gain"
 msgstr "Lautstärkekurve zurücksetzen"
 
-#: editor_ops.cc:5523
+#: editor_ops.cc:5590
 msgid "region gain envelope active"
 msgstr "Lautstärkekurve aktiv"
 
-#: editor_ops.cc:5548
+#: editor_ops.cc:5615
 msgid "toggle region lock"
 msgstr "Regionensperre umschalten"
 
-#: editor_ops.cc:5572
+#: editor_ops.cc:5639
 msgid "Toggle Video Lock"
 msgstr "Videosperre umschalten"
 
-#: editor_ops.cc:5596
+#: editor_ops.cc:5663
 msgid "region lock style"
 msgstr "Art der Regionensperre"
 
-#: editor_ops.cc:5621
+#: editor_ops.cc:5688
 msgid "change region opacity"
 msgstr "Regionen-Deckkraft ändern"
 
-#: editor_ops.cc:5714
+#: editor_ops.cc:5781
 msgid "fade range"
 msgstr "Bereich faden"
 
-#: editor_ops.cc:5752
+#: editor_ops.cc:5819
 msgid "set fade in length"
 msgstr "Ändere Fade-In Länge"
 
-#: editor_ops.cc:5759
+#: editor_ops.cc:5826
 msgid "set fade out length"
 msgstr "Ändere Fade-Out Länge"
 
-#: editor_ops.cc:5824
+#: editor_ops.cc:5891
 msgid "set fade in shape"
 msgstr "Fade-In Kurve bearbeiten"
 
-#: editor_ops.cc:5859
+#: editor_ops.cc:5926
 msgid "set fade out shape"
 msgstr "Fade-Out Kurve ändern"
 
-#: editor_ops.cc:5895
+#: editor_ops.cc:5962
 msgid "set fade in active"
 msgstr "Fade-In aktivieren"
 
-#: editor_ops.cc:5929
+#: editor_ops.cc:5996
 msgid "set fade out active"
 msgstr "Fade-Out aktivieren"
 
-#: editor_ops.cc:5989
+#: editor_ops.cc:6056
 msgid "toggle fade active"
 msgstr "Fade umschalten"
 
-#: editor_ops.cc:6179
+#: editor_ops.cc:6249
 msgid "set loop range from selection"
 msgstr "Schleife aus Auswahl erstellen"
 
-#: editor_ops.cc:6193
+#: editor_ops.cc:6263
 msgid "set loop range from region"
 msgstr "Schleife aus Region erstellen"
 
-#: editor_ops.cc:6212
+#: editor_ops.cc:6282
 msgid "set punch range from selection"
 msgstr "Punchbereich aus Auswahl erstellen"
 
-#: editor_ops.cc:6236
+#: editor_ops.cc:6306
 msgid "set session start/end from selection"
 msgstr "Projektstart/ende auf Auswahl setzen"
 
-#: editor_ops.cc:6272
+#: editor_ops.cc:6344
 msgid "set punch start from EP"
 msgstr "Punchbeginn von Arbeitspunkt"
 
-#: editor_ops.cc:6300
+#: editor_ops.cc:6372
 msgid "set punch end from EP"
 msgstr "Punchende von Arbeitspunkt"
 
-#: editor_ops.cc:6333
+#: editor_ops.cc:6405
 msgid "set loop start from EP"
 msgstr "Schleifenbeginn von Arbeitspunkt"
 
-#: editor_ops.cc:6361
+#: editor_ops.cc:6433
 msgid "set loop end from EP"
 msgstr "Schleifenende von Arbeitspunkt"
 
-#: editor_ops.cc:6372
+#: editor_ops.cc:6444
 msgid "set punch range from region"
 msgstr "Punchbereich aus Region erstellen"
 
-#: editor_ops.cc:6457
+#: editor_ops.cc:6531
 msgid "Add new marker"
 msgstr "Marker hinzufügen"
 
-#: editor_ops.cc:6458
+#: editor_ops.cc:6532
 msgid "Set global tempo"
 msgstr "Globales tempo setzen"
 
-#: editor_ops.cc:6461
+#: editor_ops.cc:6535
 msgid "Define one bar"
 msgstr "Einen Takt definieren"
 
-#: editor_ops.cc:6462
+#: editor_ops.cc:6536
 msgid "Do you want to set the global tempo or add a new tempo marker?"
 msgstr ""
 "Möchten Sie das globale Tempo ändern oder einen neuen Tempo-Marker setzen?"
 
-#: editor_ops.cc:6488
+#: editor_ops.cc:6562
 msgid "set tempo from region"
 msgstr "Tempo anhand von Region setzen"
 
-#: editor_ops.cc:6518
+#: editor_ops.cc:6591
 msgid "split regions"
 msgstr "Region teilen (Split)"
 
-#: editor_ops.cc:6560
+#: editor_ops.cc:6633
 msgid ""
 "You are about to split\n"
 "%1\n"
@@ -5872,11 +6253,11 @@ msgstr ""
 "Sie versuchen %1 in %2 Teile zu teilen.\n"
 "Das könnte sehr lange dauern."
 
-#: editor_ops.cc:6567
+#: editor_ops.cc:6640
 msgid "Call for the Ferret!"
 msgstr "Call for the Ferret!"
 
-#: editor_ops.cc:6568
+#: editor_ops.cc:6641
 msgid ""
 "Press OK to continue with this split operation\n"
 "or ask the Ferret dialog to tune the analysis"
@@ -5884,52 +6265,52 @@ msgstr ""
 "Drücken Sie OK um mit der aufteiloperation (Split) fortzufahren\n"
 "oder versuchen sie im Ferret-Fenster die Analyse zu verbessern."
 
-#: editor_ops.cc:6570
+#: editor_ops.cc:6643
 msgid "Press OK to continue with this split operation"
 msgstr "Drücken Sie OK um mit der aufteiloperation (Split) fortzufahren"
 
-#: editor_ops.cc:6573
+#: editor_ops.cc:6646
 msgid "Excessive split?"
 msgstr "Übermäßige Aufteilung?"
 
-#: editor_ops.cc:6725
+#: editor_ops.cc:6800
 msgid "place transient"
 msgstr "Transienten platzieren"
 
-#: editor_ops.cc:6760
+#: editor_ops.cc:6834
 msgid "snap regions to grid"
 msgstr "Regionen an Raster einrasten"
 
-#: editor_ops.cc:6799
+#: editor_ops.cc:6873
 msgid "Close Region Gaps"
 msgstr "Regionenlücken schließen"
 
-#: editor_ops.cc:6804
+#: editor_ops.cc:6878
 msgid "Crossfade length"
 msgstr "Länge des Crossfades"
 
-#: editor_ops.cc:6813 editor_ops.cc:6824 rhythm_ferret.cc:119
-#: session_option_editor.cc:141
+#: editor_ops.cc:6887 editor_ops.cc:6898 rhythm_ferret.cc:128
+#: rhythm_ferret.cc:143 session_option_editor.cc:141
 msgid "ms"
 msgstr "ms"
 
-#: editor_ops.cc:6815
+#: editor_ops.cc:6889
 msgid "Pull-back length"
 msgstr "Öffnungslänge vorne"
 
-#: editor_ops.cc:6828
+#: editor_ops.cc:6902 keyeditor.cc:71
 msgid "Ok"
 msgstr "Ok"
 
-#: editor_ops.cc:6843
+#: editor_ops.cc:6917
 msgid "close region gaps"
 msgstr "Schließe Lücken zwischen Regionen"
 
-#: editor_ops.cc:7085
+#: editor_ops.cc:7160
 msgid "That would be bad news ...."
 msgstr "Lieber nicht!"
 
-#: editor_ops.cc:7090
+#: editor_ops.cc:7165
 msgid ""
 "Removing the master or monitor bus is such a bad idea\n"
 "that %1 is not going to allow it.\n"
@@ -5945,19 +6326,19 @@ msgstr ""
 "bearbeitet werden. \"allow-special-bus-removal\" muss\n"
 "dazu auf \"yes\" gesetzt werden."
 
-#: editor_ops.cc:7106 route_ui.cc:2009
+#: editor_ops.cc:7181
 msgid "track"
 msgid_plural "tracks"
 msgstr[0] "Spur"
 msgstr[1] "Spuren"
 
-#: editor_ops.cc:7107 route_ui.cc:2009
+#: editor_ops.cc:7182
 msgid "bus"
 msgid_plural "busses"
 msgstr[0] "Bus"
 msgstr[1] "Busse"
 
-#: editor_ops.cc:7111
+#: editor_ops.cc:7186
 msgid ""
 "Do you really want to remove %1 %2 and %3 %4?\n"
 "(You may also lose the playlists associated with the %2)\n"
@@ -5970,7 +6351,7 @@ msgstr ""
 "Dies kann nicht rückgängig gemacht werden, und die Projektdatei wird "
 "überschrieben werden!"
 
-#: editor_ops.cc:7116
+#: editor_ops.cc:7191
 msgid ""
 "Do you really want to remove %1 %2?\n"
 "(You may also lose the playlists associated with the %2)\n"
@@ -5983,7 +6364,7 @@ msgstr ""
 "Dies kann nicht rückgängig gemacht werden, und die Projektdatei wird "
 "überschrieben werden!"
 
-#: editor_ops.cc:7122
+#: editor_ops.cc:7197
 msgid ""
 "Do you really want to remove %1 %2?\n"
 "\n"
@@ -5994,145 +6375,141 @@ msgstr ""
 "Diese Aktion kann nicht rückgängig gemacht werden, und die Projektdatei wird "
 "überschrieben werden"
 
-#: editor_ops.cc:7129
+#: editor_ops.cc:7204
 msgid "Yes, remove them."
 msgstr "Ja, entfernen."
 
-#: editor_ops.cc:7131 editor_snapshots.cc:172
+#: editor_ops.cc:7206 editor_snapshots.cc:172
 msgid "Yes, remove it."
 msgstr "Ja, entfernen."
 
-#: editor_ops.cc:7136 editor_ops.cc:7138
+#: editor_ops.cc:7211 editor_ops.cc:7213
 msgid "Remove %1"
 msgstr "Entferne %1"
 
-#: editor_ops.cc:7240 editor_ops.cc:7254 editor_ops.cc:7294 editor_ops.cc:7304
+#: editor_ops.cc:7319 editor_ops.cc:7333 editor_ops.cc:7373 editor_ops.cc:7383
 msgid "insert time"
 msgstr "Stille einfügen"
 
-#: editor_ops.cc:7357
+#: editor_ops.cc:7436
 msgid "Cannot insert or delete time when in Lock edit."
 msgstr "Kann im Sperr-Bearbeitungsmodus keine Zeit einfügen oder löschen"
 
-#: editor_ops.cc:7377 editor_ops.cc:7389 editor_ops.cc:7462
-msgid "cut time"
-msgstr "Zeit ausschneiden"
-
-#: editor_ops.cc:7475
+#: editor_ops.cc:7456 editor_ops.cc:7468 editor_ops.cc:7541 editor_ops.cc:7554
 msgid "remove time"
 msgstr "Zeit entfernen"
 
-#: editor_ops.cc:7549
+#: editor_ops.cc:7628
 msgid "There are too many tracks to fit in the current window"
 msgstr "Es gibt zu viele Spuren, sie in das aktuelle Fenster zu einzupassen"
 
-#: editor_ops.cc:7610
+#: editor_ops.cc:7689
 msgid "Sel"
 msgstr "Sel"
 
-#: editor_ops.cc:7649
+#: editor_ops.cc:7728
 #, c-format
 msgid "Saved view %u"
 msgstr "Ansicht %u gespeichert"
 
-#: editor_ops.cc:7674
+#: editor_ops.cc:7753
 msgid "mute regions"
 msgstr "Regionen stummschalten"
 
-#: editor_ops.cc:7676
+#: editor_ops.cc:7755
 msgid "mute region"
 msgstr "Region stummschalten"
 
-#: editor_ops.cc:7713
+#: editor_ops.cc:7792
 msgid "combine regions"
 msgstr "Regionen verbinden (combine)"
 
-#: editor_ops.cc:7751
+#: editor_ops.cc:7830
 msgid "uncombine regions"
 msgstr "Regionen trennen (uncombine)"
 
-#: editor_ops.cc:7788
+#: editor_ops.cc:7867
 msgid "%1: Locked"
 msgstr "%1: Gesperrt"
 
-#: editor_ops.cc:7795
+#: editor_ops.cc:7874
 msgid "Click to unlock"
 msgstr "Klicken, um Sperre aufzuheben"
 
-#: editor_ops.cc:7844
+#: editor_ops.cc:7923
 msgid "Moving embedded files into session folder"
 msgstr "Verschiebe eingebettete Dateien in den Projektordner"
 
-#: editor_regions.cc:115
+#: editor_regions.cc:159
 msgid "Region name, with number of channels in []'s"
 msgstr "Name der Region, mit Kanalzahl in []"
 
-#: editor_regions.cc:116
+#: editor_regions.cc:160
 msgid "Position of start of region"
 msgstr "Position des Regionen-Anfangs"
 
-#: editor_regions.cc:117 editor_regions.cc:862 time_info_box.cc:101
+#: editor_regions.cc:161 editor_regions.cc:935 time_info_box.cc:95
 msgid "End"
 msgstr "Ende"
 
-#: editor_regions.cc:117
+#: editor_regions.cc:161
 msgid "Position of end of region"
 msgstr "Position des Regionen-Endes"
 
-#: editor_regions.cc:118
+#: editor_regions.cc:162
 msgid "Length of the region"
 msgstr "Länge der Region"
 
-#: editor_regions.cc:119
+#: editor_regions.cc:163
 msgid "Position of region sync point, relative to start of the region"
 msgstr ""
 "Position des Regionen-Synchronisationspunktes, relativ zu Regionenanfang"
 
-#: editor_regions.cc:120
+#: editor_regions.cc:164
 msgid "Length of region fade-in (units: secondary clock), () if disabled"
 msgstr "Länge des Einblendens (Einheiten: sekundäre Uhr), () falls inaktiv"
 
-#: editor_regions.cc:121
+#: editor_regions.cc:165
 msgid "Length of region fade-out (units: secondary clock), () if disabled"
 msgstr "Länge des Ausblendens (Einheiten: sekundäre Uhr), () falls inaktiv"
 
-#: editor_regions.cc:122
+#: editor_regions.cc:166
 msgid "Lock|L"
 msgstr "L"
 
-#: editor_regions.cc:122
+#: editor_regions.cc:166
 msgid "Region position locked?"
 msgstr "Position der Region gesperrt?"
 
-#: editor_regions.cc:123
+#: editor_regions.cc:167
 msgid "Gain|G"
 msgstr "G"
 
-#: editor_regions.cc:123
+#: editor_regions.cc:167
 msgid "Region position glued to Bars|Beats time?"
 msgstr "Regionenposition an Takt und Schäge gebunden?"
 
-#: editor_regions.cc:124
+#: editor_regions.cc:168
 msgid "Region muted?"
 msgstr "Region stummgeschaltet?"
 
-#: editor_regions.cc:125
+#: editor_regions.cc:169
 msgid "Opaque|O"
 msgstr "O"
 
-#: editor_regions.cc:125
+#: editor_regions.cc:169
 msgid "Region opaque (blocks regions below it from being heard)?"
 msgstr "Region deckend (hindert darunterliegende Regionen, gehört zu werden)?"
 
-#: editor_regions.cc:314 editor_regions.cc:319 editor_regions.cc:321
+#: editor_regions.cc:360 editor_regions.cc:365 editor_regions.cc:367
 msgid "Hidden"
 msgstr "Versteckt"
 
-#: editor_regions.cc:394
+#: editor_regions.cc:432
 msgid "(MISSING) "
 msgstr "(FEHLT)"
 
-#: editor_regions.cc:462
+#: editor_regions.cc:500
 msgid ""
 "Do you really want to remove unused regions?\n"
 "(This is destructive and cannot be undone)"
@@ -6140,119 +6517,131 @@ msgstr ""
 "Wollen Sie ungenutzte Regionen wirklich entfernen?\n"
 "(Dies ist destruktiv und kann nicht rückgängig gemacht werden)"
 
-#: editor_regions.cc:466
+#: editor_regions.cc:504
 msgid "Yes, remove."
 msgstr "Ja, entfernen."
 
-#: editor_regions.cc:468
+#: editor_regions.cc:506
 msgid "Remove unused regions"
 msgstr "Ungenutzte Regionen entfernen"
 
-#: editor_regions.cc:697
+#: editor_regions.cc:735
 msgid "EditorRegions::format_position: negative timecode position: %1"
 msgstr "EditorRegions::format_position: Negative Timecode Position: %1"
 
-#: editor_regions.cc:827 editor_regions.cc:843 editor_regions.cc:857
+#: editor_regions.cc:900 editor_regions.cc:916 editor_regions.cc:930
 msgid "Mult."
 msgstr "Viele"
 
-#: editor_regions.cc:860 midi_list_editor.cc:104 time_info_box.cc:94
+#: editor_regions.cc:933 midi_list_editor.cc:104 time_info_box.cc:88
 msgid "Start"
 msgstr "Start"
 
-#: editor_regions.cc:878 editor_regions.cc:894
+#: editor_regions.cc:951 editor_regions.cc:967
 msgid "Multiple"
 msgstr "Viele"
 
-#: editor_regions.cc:963
+#: editor_regions.cc:1036
 msgid "MISSING "
 msgstr "FEHLT"
 
-#: editor_routes.cc:184
+#: editor_routes.cc:126
+msgid "RS"
+msgstr "RS"
+
+#: editor_routes.cc:208
 msgid "SS"
 msgstr "SS"
 
-#: editor_routes.cc:208
+#: editor_routes.cc:233
 msgid "Track/Bus Name"
 msgstr "Spur/Busname"
 
-#: editor_routes.cc:209
+#: editor_routes.cc:234
 msgid "Track/Bus visible ?"
 msgstr "Spuren/Busse sichtbar?"
 
-#: editor_routes.cc:210
+#: editor_routes.cc:235
 msgid "Track/Bus active ?"
 msgstr "Spur/Bus aktiv?"
 
-#: editor_routes.cc:211
+#: editor_routes.cc:236
 msgid "MidiInput|I"
 msgstr "I"
 
-#: editor_routes.cc:211
+#: editor_routes.cc:236
 msgid "MIDI input enabled"
 msgstr "MIDI Eingänge aktiv"
 
-#: editor_routes.cc:212
+#: editor_routes.cc:237
 msgid "Rec|R"
 msgstr "R"
 
-#: editor_routes.cc:212
+#: editor_routes.cc:237
 msgid "Record enabled"
 msgstr "Aufnahme bereit"
 
-#: editor_routes.cc:213
+#: editor_routes.cc:238
+msgid "Rec|RS"
+msgstr "RS"
+
+#: editor_routes.cc:238
+msgid "Record Safe"
+msgstr "Record Safe"
+
+#: editor_routes.cc:239
 msgid "Muted"
 msgstr "Stumm"
 
-#: editor_routes.cc:214
+#: editor_routes.cc:240
 msgid "Soloed"
 msgstr "Solo ein"
 
-#: editor_routes.cc:215
+#: editor_routes.cc:241
 msgid "SoloIso|SI"
 msgstr "SI"
 
-#: editor_routes.cc:215
+#: editor_routes.cc:241
 msgid "Solo Isolated"
 msgstr "Isoliertes Solo"
 
-#: editor_routes.cc:216
+#: editor_routes.cc:242
 msgid "SoloLock|SS"
 msgstr "SS"
 
-#: editor_routes.cc:216
+#: editor_routes.cc:242
 msgid "Solo Safe (Locked)"
 msgstr "Solo Safe (gesperrt)"
 
-#: editor_routes.cc:486 mixer_ui.cc:1260
+#: editor_routes.cc:550 mixer_ui.cc:1498
 msgid "Hide All"
 msgstr "Alle verbergen"
 
-#: editor_routes.cc:487 mixer_ui.cc:1261
+#: editor_routes.cc:551 mixer_ui.cc:1499
 msgid "Show All Audio Tracks"
 msgstr "Zeige alle Audiospuren"
 
-#: editor_routes.cc:488 mixer_ui.cc:1262
+#: editor_routes.cc:552 mixer_ui.cc:1500
 msgid "Hide All Audio Tracks"
 msgstr "Verberge alle Audiospuren"
 
-#: editor_routes.cc:489 mixer_ui.cc:1263
+#: editor_routes.cc:553 mixer_ui.cc:1501
 msgid "Show All Audio Busses"
 msgstr "Zeige alle Audiobusse"
 
-#: editor_routes.cc:490 mixer_ui.cc:1264
+#: editor_routes.cc:554 mixer_ui.cc:1502
 msgid "Hide All Audio Busses"
 msgstr "Verberge alle Audiobusse"
 
-#: editor_routes.cc:491 mixer_ui.cc:1265
+#: editor_routes.cc:555 mixer_ui.cc:1503
 msgid "Show All Midi Tracks"
 msgstr "Zeige alle MIDI-Spuren"
 
-#: editor_routes.cc:492 mixer_ui.cc:1266
+#: editor_routes.cc:556 mixer_ui.cc:1504
 msgid "Hide All Midi Tracks"
 msgstr "Verberge alle MIDI-Spuren"
 
-#: editor_routes.cc:493
+#: editor_routes.cc:557
 msgid "Only Show Tracks with Regions Under Playhead"
 msgstr "Nur Spuren mit Regionen unter dem Positionszeiger anzeigen"
 
@@ -6296,7 +6685,7 @@ msgstr "Neuer CD-Track Marker"
 msgid "New Tempo"
 msgstr "Tempowechsel einfügen..."
 
-#: editor_rulers.cc:238 tempo_dialog.cc:315
+#: editor_rulers.cc:238 tempo_dialog.cc:419
 msgid "New Meter"
 msgstr "Taktwechsel einfügen..."
 
@@ -6320,31 +6709,35 @@ msgstr ""
 msgid "Remove snapshot"
 msgstr "Schnappschuss entfernen"
 
-#: editor_tempodisplay.cc:194 editor_tempodisplay.cc:234
-msgid "add"
-msgstr "Hinzufügen"
-
-#: editor_tempodisplay.cc:215
+#: editor_tempodisplay.cc:318
 msgid "add tempo mark"
 msgstr "Tempowechsel einfügen"
 
-#: editor_tempodisplay.cc:254
+#: editor_tempodisplay.cc:343
+msgid "add"
+msgstr "Hinzufügen"
+
+#: editor_tempodisplay.cc:362
 msgid "add meter mark"
 msgstr "Taktwechsel einfügen"
 
-#: editor_tempodisplay.cc:287 editor_tempodisplay.cc:315
+#: editor_tempodisplay.cc:401 editor_tempodisplay.cc:435
 msgid "done"
 msgstr "Fertig"
 
-#: editor_tempodisplay.cc:304 editor_tempodisplay.cc:330
+#: editor_tempodisplay.cc:422
+msgid "replace meter mark"
+msgstr "ersetze Metrum-Marker"
+
+#: editor_tempodisplay.cc:454
 msgid "replace tempo mark"
 msgstr "Tempowechsel ersetzen"
 
-#: editor_tempodisplay.cc:353 editor_tempodisplay.cc:387
+#: editor_tempodisplay.cc:485 editor_tempodisplay.cc:519
 msgid "remove tempo mark"
 msgstr "Tempowechsel entfernen"
 
-#: editor_tempodisplay.cc:370
+#: editor_tempodisplay.cc:502
 msgid ""
 "programming error: meter marker canvas item has no marker object pointer!"
 msgstr ""
@@ -6358,7 +6751,7 @@ msgstr "strecken/stauchen"
 msgid "pitch shift"
 msgstr "pitch-shift"
 
-#: editor_timefx.cc:304
+#: editor_timefx.cc:282
 msgid "timefx cannot be started - thread creation error"
 msgstr ""
 "Time-Stretch konnte nicht gestartet werden - Fehler beim erstellen des "
@@ -6376,27 +6769,31 @@ msgstr "MIDI Geräteeinstellungen"
 msgid "Refresh Devices"
 msgstr "Geräteliste auffrischen"
 
-#: engine_dialog.cc:90 engine_dialog.cc:2923
+#: engine_dialog.cc:90
+msgid "Use Buffered I/O"
+msgstr "Gepuffertes E/A benutzen"
+
+#: engine_dialog.cc:91 engine_dialog.cc:3000
 msgid "Measure"
 msgstr "Messen"
 
-#: engine_dialog.cc:91
+#: engine_dialog.cc:92
 msgid "Use results"
 msgstr "Benutze Ergebnisse"
 
-#: engine_dialog.cc:92
+#: engine_dialog.cc:93
 msgid "Back to settings ... (ignore results)"
 msgstr "Zurücksetzen ... (Resultate ignorieren)"
 
-#: engine_dialog.cc:93
+#: engine_dialog.cc:94
 msgid "Calibrate Audio"
-msgstr "AUdio kalibrieren"
+msgstr "Audio kalibrieren"
 
-#: engine_dialog.cc:97
+#: engine_dialog.cc:98
 msgid "Back to settings"
 msgstr "Zurück zu Einstellungen"
 
-#: engine_dialog.cc:118
+#: engine_dialog.cc:120
 msgid ""
 "No audio/MIDI backends detected. %1 cannot run\n"
 "\n"
@@ -6406,11 +6803,11 @@ msgstr ""
 "\n"
 "(Das ist ein Kompilier-/Paket-/Systemfehler und sollte nie passieren.)"
 
-#: engine_dialog.cc:143
+#: engine_dialog.cc:145
 msgid "Latency Measurement Tool"
-msgstr "Latenzmeßwerkzeug"
+msgstr "Latenzmesswerkzeug"
 
-#: engine_dialog.cc:155
+#: engine_dialog.cc:157
 msgid ""
 "<span weight=\"bold\">Turn down the volume on your audio equipment to a very "
 "low level.</span>"
@@ -6418,111 +6815,111 @@ msgstr ""
 "<span weight=\"bold\">Drehen Sie die Lautstärke Ihrer Audioanlage sehr leise."
 "</span>"
 
-#: engine_dialog.cc:164
+#: engine_dialog.cc:166
 msgid "Select two channels below and connect them using a cable."
 msgstr "Wählen Sie unten zwei Kanäle aus und verbinden sie mit einem Kabel."
 
-#: engine_dialog.cc:169
+#: engine_dialog.cc:171
 msgid "Output channel"
 msgstr "Ausgangskanal"
 
-#: engine_dialog.cc:177
+#: engine_dialog.cc:179
 msgid "Input channel"
 msgstr "Eingangskanal"
 
-#: engine_dialog.cc:211
+#: engine_dialog.cc:213
 msgid "Once the channels are connected, click the \"Measure\" button."
 msgstr "Wenn die Kanäle verbunden sind, klicken Sie den \"Messen\"-Knopf."
 
-#: engine_dialog.cc:218
+#: engine_dialog.cc:220
 msgid "When satisfied with the results, click the \"Use results\" button."
 msgstr ""
 "Wenn Sie mit dem Resultat zufrieden sind, klicken Sie den Knopf \"Benutze "
 "Ergebnisse\"."
 
-#: engine_dialog.cc:233 engine_dialog.cc:3058 engine_dialog.cc:3068
+#: engine_dialog.cc:235 engine_dialog.cc:3138 engine_dialog.cc:3148
 msgid "No measurement results yet"
 msgstr "Noch keine Messergebnisse"
 
-#: engine_dialog.cc:243 route_params_ui.cc:106
+#: engine_dialog.cc:245 route_params_ui.cc:106
 msgid "Latency"
 msgstr "Latenz"
 
-#: engine_dialog.cc:497
+#: engine_dialog.cc:520
 msgid "Audio System:"
 msgstr "Audiosystem:"
 
-#: engine_dialog.cc:540
+#: engine_dialog.cc:564
 msgid "Driver:"
 msgstr "Treiber:"
 
-#: engine_dialog.cc:547
+#: engine_dialog.cc:571
 msgid "Input Device:"
 msgstr "Eingangsgerät:"
 
-#: engine_dialog.cc:551
+#: engine_dialog.cc:575
 msgid "Output Device:"
 msgstr "Ausgangsgerät:"
 
-#: engine_dialog.cc:558
+#: engine_dialog.cc:582
 msgid "Device:"
 msgstr "Gerät:"
 
-#: engine_dialog.cc:567 engine_dialog.cc:681 sfdb_ui.cc:153 sfdb_ui.cc:348
-#: sfdb_ui.cc:353
+#: engine_dialog.cc:591 engine_dialog.cc:699 export_report.cc:164
+#: export_report.cc:328 sfdb_ui.cc:153 sfdb_ui.cc:348 sfdb_ui.cc:353
 msgid "Sample rate:"
 msgstr "Samplerate:"
 
-#: engine_dialog.cc:573 engine_dialog.cc:688
+#: engine_dialog.cc:597 engine_dialog.cc:706
 msgid "Buffer size:"
 msgstr "Puffergröße"
 
-#: engine_dialog.cc:582
+#: engine_dialog.cc:606
 msgid "Periods:"
 msgstr "Perioden:"
 
-#: engine_dialog.cc:600
+#: engine_dialog.cc:624
 msgid "Input Channels:"
 msgstr "Eingangskanäle:"
 
-#: engine_dialog.cc:613
+#: engine_dialog.cc:637
 msgid "Output Channels:"
 msgstr "Ausgangskanäle:"
 
-#: engine_dialog.cc:625
+#: engine_dialog.cc:649
 msgid "Hardware input latency:"
 msgstr "Hardware Eingangslatenz (Samples)"
 
-#: engine_dialog.cc:628 engine_dialog.cc:641
+#: engine_dialog.cc:652 engine_dialog.cc:665
 msgid "samples"
 msgstr "Samples"
 
-#: engine_dialog.cc:638
+#: engine_dialog.cc:662
 msgid "Hardware output latency:"
 msgstr "Hardware Ausgangslatenz (Samples)"
 
-#: engine_dialog.cc:649
+#: engine_dialog.cc:673
 msgid "MIDI System:"
 msgstr "MIDI System:"
 
-#: engine_dialog.cc:673
+#: engine_dialog.cc:691
 msgid ""
 "%1 is already running. %2 will connect to it and use the existing settings."
 msgstr ""
 "%1 läuft bereits. %2 wird zu ihm verbinden und die existierenden "
 "Einstellungen übernehmen."
 
-#: engine_dialog.cc:726
+#: engine_dialog.cc:744
 msgid ""
 "Failed to start or connect to audio-engine.\n"
 "\n"
 "Latency calibration requires a working audio interface."
 msgstr ""
-"Das Starten oder Verbinden mit der Audio-Engine ist fehlgeschlagen.\n"
+"Das Starten oder Verbinden mit der Audioengine ist fehlgeschlagen.\n"
 "\n"
 "Latenzkalibrierung erfordert ein funktionierendes Audio-Interface."
 
-#: engine_dialog.cc:732
+#: engine_dialog.cc:750
 msgid ""
 "Your selected audio configuration is playback- or capture-only.\n"
 "\n"
@@ -6534,155 +6931,164 @@ msgstr ""
 "Latenzkalibrierung verlangt Duplexbetrieb (gleichzeitig Aufnahme und "
 "Wiedergabe)"
 
-#: engine_dialog.cc:938
+#: engine_dialog.cc:965
 msgid "MIDI Devices"
 msgstr "MIDI Geräte"
 
-#: engine_dialog.cc:944
+#: engine_dialog.cc:971
 msgid "Device"
 msgstr "Gerät"
 
-#: engine_dialog.cc:946
+#: engine_dialog.cc:973
 msgid "Hardware Latencies"
 msgstr "Hardware-Latenzen"
 
-#: engine_dialog.cc:987
+#: engine_dialog.cc:1014
 msgid "Calibrate"
 msgstr "Kalibrieren"
 
-#: engine_dialog.cc:1090
+#: engine_dialog.cc:1117
 msgid "all available channels"
 msgstr "alle verfügbaren Kanäle"
 
-#: engine_dialog.cc:1576 latency_gui.cc:39
-msgid "sample"
-msgid_plural "samples"
-msgstr[0] "Sample"
-msgstr[1] "Samples"
+#: engine_dialog.cc:1599 latency_gui.cc:55
+msgid "%1 sample"
+msgid_plural "%1 samples"
+msgstr[0] "%1 Sample"
+msgstr[1] "%1 Samples"
 
-#: engine_dialog.cc:1640
+#: engine_dialog.cc:1662
 #, c-format
 msgid "(%.1f ms)"
 msgstr "(%.1f ms)"
 
-#: engine_dialog.cc:2371
+#: engine_dialog.cc:2413
 msgid "Could not start backend engine %1"
-msgstr "Konnte Backend Engine %1 nicht starten"
+msgstr "Konnte Backend-Engine %1 nicht starten"
 
-#: engine_dialog.cc:2403
+#: engine_dialog.cc:2445
 msgid "Cannot set driver to %1"
 msgstr "Kann Treiber nicht auf %1 setzen"
 
-#: engine_dialog.cc:2408
+#: engine_dialog.cc:2450
 msgid "Cannot set input device name to %1"
 msgstr "Kann Namen des Eingangsgeräts nicht auf %1 setzen"
 
-#: engine_dialog.cc:2412
+#: engine_dialog.cc:2454
 msgid "Cannot set output device name to %1"
 msgstr "Kann Namen des Ausgangsgeräts nicht auf %1 setzen"
 
-#: engine_dialog.cc:2417
+#: engine_dialog.cc:2459
 msgid "Cannot set device name to %1"
 msgstr "Kann Gerät nicht auf %1 setzen"
 
-#: engine_dialog.cc:2422
+#: engine_dialog.cc:2464
 msgid "Cannot set sample rate to %1"
 msgstr "Kann Samplerate nicht auf %1 setzen"
 
-#: engine_dialog.cc:2426
+#: engine_dialog.cc:2468
 msgid "Cannot set buffer size to %1"
 msgstr "Kann Buffergröße nicht auf %1 setzen"
 
-#: engine_dialog.cc:2430
+#: engine_dialog.cc:2472
 msgid "Cannot set periods to %1"
 msgstr "Kann Perioden nicht auf %1 setzen"
 
-#: engine_dialog.cc:2436
+#: engine_dialog.cc:2478
 msgid "Cannot set input channels to %1"
 msgstr "Kann Eingangskanäle nicht auf %1 setzen"
 
-#: engine_dialog.cc:2440
+#: engine_dialog.cc:2482
 msgid "Cannot set output channels to %1"
 msgstr "Kann Ausgangskanäle nicht auf %1 setzen"
 
-#: engine_dialog.cc:2446
+#: engine_dialog.cc:2488
 msgid "Cannot set input latency to %1"
 msgstr "Kann Eingangslatenz nicht auf %1 setzen"
 
-#: engine_dialog.cc:2450
+#: engine_dialog.cc:2492
 msgid "Cannot set output latency to %1"
 msgstr "Kann Ausgangslatenz nicht auf %1 setzen"
 
-#: engine_dialog.cc:2781 engine_dialog.cc:2840
+#: engine_dialog.cc:2851 engine_dialog.cc:2917
 msgid "No signal detected "
 msgstr "Kein Signal erkannt"
 
-#: engine_dialog.cc:2794 engine_dialog.cc:2848 port_insert_ui.cc:70
+#: engine_dialog.cc:2858
+msgid ""
+"Input signal is > -3dBFS. Lower the signal level (output gain, input gain) "
+"on the audio-interface."
+msgstr ""
+"Eingangssignal is > -3dBFS. Verringern Sie den Signalpegel (E/A-Lautstärken) "
+"am Audio Interface."
+
+#: engine_dialog.cc:2871 engine_dialog.cc:2925 port_insert_ui.cc:70
 #: port_insert_ui.cc:98
 msgid "Disconnected from audio engine"
-msgstr "Von Audio-Engine getrennt"
+msgstr "Von Audioengine getrennt"
 
-#: engine_dialog.cc:2803 engine_dialog.cc:2856
+#: engine_dialog.cc:2880 engine_dialog.cc:2933
 msgid "Detected roundtrip latency: "
 msgstr "Entdeckte Roundtrip-Latenz:"
 
-#: engine_dialog.cc:2805 engine_dialog.cc:2858
+#: engine_dialog.cc:2882 engine_dialog.cc:2935
 msgid "Systemic latency: "
 msgstr "Systemische Latenz:"
 
-#: engine_dialog.cc:2812
+#: engine_dialog.cc:2889
 msgid "(signal detection error)"
 msgstr "(Fehler bei der Signalerkennung)"
 
-#: engine_dialog.cc:2818
+#: engine_dialog.cc:2895
 msgid "(inverted - bad wiring)"
 msgstr "(invertiert - schlechte Verkabelung)"
 
-#: engine_dialog.cc:2865
+#: engine_dialog.cc:2942
 msgid "(averaging)"
 msgstr "(durchschnittlich)"
 
-#: engine_dialog.cc:2871
+#: engine_dialog.cc:2948
 msgid "(too large jitter)"
 msgstr "(zu viel Jitter)"
 
-#: engine_dialog.cc:2875
+#: engine_dialog.cc:2952
 msgid "(large jitter)"
 msgstr "(viel Jitter)"
 
-#: engine_dialog.cc:2887
+#: engine_dialog.cc:2964
 msgid "Timeout - large MIDI jitter."
 msgstr "Timeout - viel MIDI Jitter."
 
-#: engine_dialog.cc:2903 port_insert_ui.cc:134
+#: engine_dialog.cc:2980 port_insert_ui.cc:134
 msgid "Detecting ..."
 msgstr "Messe..."
 
-#: engine_dialog.cc:3004
+#: engine_dialog.cc:3081
 msgid "Disconnect from %1"
 msgstr "Trenne von %1"
 
-#: engine_dialog.cc:3009
+#: engine_dialog.cc:3086
 msgid "Running"
 msgstr "Läuft"
 
-#: engine_dialog.cc:3011
+#: engine_dialog.cc:3088
 msgid "Connected"
 msgstr "Verbunden"
 
-#: engine_dialog.cc:3022
+#: engine_dialog.cc:3099
 msgid "Connect to %1"
 msgstr "Verbinde zu %1"
 
-#: engine_dialog.cc:3026 shuttle_control.cc:614
+#: engine_dialog.cc:3103 shuttle_control.cc:663
 msgid "Stopped"
 msgstr "Gestoppt"
 
-#: export_channel_selector.cc:51 sfdb_ui.cc:151
+#: export_channel_selector.cc:46 export_report.cc:159 export_report.cc:324
+#: sfdb_ui.cc:151
 msgid "Channels:"
 msgstr "Kanäle:"
 
-#: export_channel_selector.cc:52
+#: export_channel_selector.cc:47
 msgid "Split to mono files"
 msgstr "In Monodateien aufteilen"
 
@@ -6690,39 +7096,39 @@ msgstr "In Monodateien aufteilen"
 msgid "Bus or Track"
 msgstr "Bus oder Spur"
 
-#: export_channel_selector.cc:473
+#: export_channel_selector.cc:474
 msgid "Region contents without fades nor region gain (channels: %1)"
 msgstr "Regioneninhalt ohne Fades und Regionenlautstärke (Kanäle: %1)"
 
-#: export_channel_selector.cc:477
+#: export_channel_selector.cc:478
 msgid "Region contents with fades and region gain (channels: %1)"
 msgstr "Regioneninhalt mit Fades und Regionenlautstärke (Kanäle: %1)"
 
-#: export_channel_selector.cc:481
+#: export_channel_selector.cc:482
 msgid "Track output (channels: %1)"
 msgstr "Spurausgang (%1 Kanäle)"
 
-#: export_channel_selector.cc:550
+#: export_channel_selector.cc:552
 msgid "Apply track/bus processing"
 msgstr "Signalverarbeitung der Spur/des Busses anwenden"
 
-#: export_channel_selector.cc:551
+#: export_channel_selector.cc:553
 msgid "Select all tracks"
 msgstr "Alle Spuren auswählen"
 
-#: export_channel_selector.cc:552
+#: export_channel_selector.cc:554
 msgid "Select all busses"
 msgstr "Alle Busse auswählen"
 
-#: export_channel_selector.cc:553
+#: export_channel_selector.cc:555
 msgid "Deselect all"
 msgstr "Alles deselektieren"
 
-#: export_channel_selector.cc:587
+#: export_channel_selector.cc:589
 msgid "Track name"
 msgstr "Spurname"
 
-#: export_dialog.cc:46
+#: export_dialog.cc:49
 msgid ""
 "<span color=\"#ffa755\">Some already existing files will be overwritten.</"
 "span>"
@@ -6730,24 +7136,24 @@ msgstr ""
 "<span color=\"#ffa755\">Einige existierende Dateien werden überschrieben "
 "werden.</span>"
 
-#: export_dialog.cc:47
+#: export_dialog.cc:50
 msgid "List files"
 msgstr "Dateien auflisten"
 
-#: export_dialog.cc:156 export_format_dialog.cc:59
+#: export_dialog.cc:163 export_format_dialog.cc:67
 msgid "File format"
 msgstr "Dateiformat"
 
-#: export_dialog.cc:157 export_timespan_selector.cc:371
-#: export_timespan_selector.cc:433
+#: export_dialog.cc:164 export_timespan_selector.cc:411
+#: export_timespan_selector.cc:502
 msgid "Time Span"
 msgstr "Zeitspanne"
 
-#: export_dialog.cc:158
+#: export_dialog.cc:165
 msgid "Channels"
 msgstr "Kanäle"
 
-#: export_dialog.cc:180
+#: export_dialog.cc:187
 msgid ""
 "Export has been aborted due to an error!\n"
 "See the Log for details."
@@ -6755,39 +7161,55 @@ msgstr ""
 "Das Exportieren wurde aufgrund eines Fehlers abgebrochen!\n"
 "Details dazu stehen in der Log."
 
-#: export_dialog.cc:249
+#: export_dialog.cc:298
 msgid "Files that will be overwritten"
 msgstr "Dateien, die überschrieben werden"
 
-#: export_dialog.cc:294
+#: export_dialog.cc:343
 msgid "Export initialization failed: %1"
-msgstr "Exportinitialisierung gescheitert: %1"
+msgstr "Exportinitialisierung fehlgeschlagen: %1"
 
-#: export_dialog.cc:304
+#: export_dialog.cc:353
 msgid "Stop Export"
 msgstr "Export Abbrechen"
 
-#: export_dialog.cc:325
+#: export_dialog.cc:383
 msgid "export"
 msgstr "Exportieren"
 
-#: export_dialog.cc:344
+#: export_dialog.cc:402
+msgid "Exporting '%3' (timespan %1 of %2)"
+msgstr "Exportiere '%3' (Zeitspanne %1 von %2)"
+
+#: export_dialog.cc:407
 msgid "Normalizing '%3' (timespan %1 of %2)"
 msgstr "Normalisiere '%3' (Zeitspanne %1 von %2)"
 
-#: export_dialog.cc:348
-msgid "Exporting '%3' (timespan %1 of %2)"
-msgstr "Exportiere '%3' (Zeitspanne %1 von %2)"
+#: export_dialog.cc:412
+msgid "Encoding '%3' (timespan %1 of %2)"
+msgstr "Kodiere '%3' (Zeitspanne %1 von %2)"
+
+#: export_dialog.cc:417
+msgid "Tagging '%3' (timespan %1 of %2)"
+msgstr "Tagge '%3' (Zeitspanne %1 von %2)"
+
+#: export_dialog.cc:421
+msgid "Uploading '%3' (timespan %1 of %2)"
+msgstr "Lade  '%3' (Zeitspanne %1 von %2) hoch"
+
+#: export_dialog.cc:425
+msgid "Running Post Export Command for '%1'"
+msgstr "Führe Post-Export Befehl für '%1' aus"
 
-#: export_dialog.cc:371 export_dialog.cc:373
+#: export_dialog.cc:453 export_dialog.cc:455
 msgid "<span color=\"#ffa755\">Error: "
 msgstr "<span color=\"#ffa755\">Fehler: "
 
-#: export_dialog.cc:383
+#: export_dialog.cc:465
 msgid "<span color=\"#ffa755\">Warning: "
 msgstr "<span color=\"#ffa755\">Warnung: "
 
-#: export_dialog.cc:385
+#: export_dialog.cc:467
 msgid ""
 "\n"
 "<span color=\"#ffa755\">Warning: "
@@ -6795,19 +7217,19 @@ msgstr ""
 "\n"
 "<span color=\"#ffa755\">Warnung: "
 
-#: export_dialog.cc:409
+#: export_dialog.cc:491
 msgid "Export Selection"
 msgstr "Auswahl exportieren"
 
-#: export_dialog.cc:423
+#: export_dialog.cc:505
 msgid "Export Region"
 msgstr "Region exportieren"
 
-#: export_dialog.cc:432
+#: export_dialog.cc:514
 msgid "Source"
 msgstr "Quelle"
 
-#: export_dialog.cc:448
+#: export_dialog.cc:530
 msgid "Stem Export"
 msgstr "Stem Export"
 
@@ -6815,65 +7237,77 @@ msgstr "Stem Export"
 msgid "Add another format"
 msgstr "Ein weiteres Format hinzuzufügen"
 
-#: export_file_notebook.cc:193
+#: export_file_notebook.cc:198
 msgid "Format"
 msgstr "Format"
 
-#: export_file_notebook.cc:194
+#: export_file_notebook.cc:199
 msgid "Location"
 msgstr "Ort"
 
-#: export_file_notebook.cc:195
+#: export_file_notebook.cc:200
 msgid "Upload to Soundcloud"
 msgstr "Zu Soundcloud hochladen"
 
-#: export_file_notebook.cc:273
+#: export_file_notebook.cc:201
+msgid "Analyze Exported Audio"
+msgstr "Analysiere exportiertes Audio"
+
+#: export_file_notebook.cc:286
 msgid "No format!"
 msgstr "Kein Format!"
 
-#: export_file_notebook.cc:291
+#: export_file_notebook.cc:304
 msgid "Format %1: %2"
 msgstr "Format: %1: %2"
 
-#: export_filename_selector.cc:32
+#: export_filename_selector.cc:33
 msgid "Label:"
 msgstr "Name:"
 
-#: export_filename_selector.cc:33 session_dialog.cc:310
+#: export_filename_selector.cc:34 session_dialog.cc:310
 msgid "Session Name"
 msgstr "Projektname"
 
-#: export_filename_selector.cc:34
+#: export_filename_selector.cc:35
+msgid "Timespan Name"
+msgstr "Name der Zeitspanne"
+
+#: export_filename_selector.cc:36
 msgid "Revision:"
 msgstr "Revision:"
 
-#: export_filename_selector.cc:36
+#: export_filename_selector.cc:38
 msgid "Folder:"
 msgstr "Ordner:"
 
-#: export_filename_selector.cc:37 session_import_dialog.cc:45
+#: export_filename_selector.cc:39 session_import_dialog.cc:45
 #: transcode_video_dialog.cc:59 video_server_dialog.cc:54
 #: video_server_dialog.cc:56 export_video_dialog.cc:77
 #: export_video_dialog.cc:79
 msgid "Browse"
 msgstr "Durchsuchen"
 
-#: export_filename_selector.cc:41
-msgid "<i>Build filename(s) from these components:</i>"
-msgstr "<i>Dateiname(n) aus diesen Bestandteilen erzeugen:</i>"
+#: export_filename_selector.cc:40 export_report.cc:118
+msgid "Open Folder"
+msgstr "Verzeichnis öffnen"
+
+#: export_filename_selector.cc:45
+msgid "Build filename(s) from these components:"
+msgstr "Baue Dateinamen aus diesen Komponenten:"
 
-#: export_filename_selector.cc:208
+#: export_filename_selector.cc:217
 msgid ""
 "<small><i>Sorry, no example filename can be shown at the moment</i></small>"
 msgstr ""
 "<small><i>Leider kann zur Zeit kein Dateinamen-Beispiel gezeigt werden</i></"
 "small>"
 
-#: export_filename_selector.cc:210
-msgid "<small><i>Current (approximate) filename: \"%1\"</i></small>"
-msgstr "<small><i>Momentaner (ungefährer) Dateiname: \"%1\"</i></small>"
+#: export_filename_selector.cc:219
+msgid "<i>Current (approximate) filename</i>: \"%1\""
+msgstr "<i>Derzeitiger (ungefährer) Dateiname</i>: \"%1\""
 
-#: export_filename_selector.cc:246 export_filename_selector.cc:332
+#: export_filename_selector.cc:255 export_filename_selector.cc:402
 msgid ""
 "%1: this is only the directory/folder name, not the filename.\n"
 "The filename will be chosen from the information just above the folder "
@@ -6883,111 +7317,196 @@ msgstr ""
 "Der Dateiname wird aus den Informationen über der "
 "Verzeichnisauswahlgeneriert."
 
-#: export_filename_selector.cc:318
+#: export_filename_selector.cc:378
+msgid "%1: this is not a valid directory/folder."
+msgstr "%1: Dies ist kein gültiges Verzeichnis."
+
+#: export_filename_selector.cc:388
 msgid "Choose export folder"
 msgstr "Wähle den Exportordner"
 
-#: export_format_dialog.cc:31
+#: export_format_dialog.cc:32
 msgid "New Export Format Profile"
 msgstr "Neues Exportformat-Profil"
 
-#: export_format_dialog.cc:31
+#: export_format_dialog.cc:32
 msgid "Edit Export Format Profile"
 msgstr "Exportformat-Profil bearbeiten"
 
-#: export_format_dialog.cc:38
+#: export_format_dialog.cc:39
 msgid "Label: "
 msgstr "Name:"
 
-#: export_format_dialog.cc:41 normalize_dialog.cc:42
-msgid "Normalize to:"
-msgstr "Normalisieren auf:"
+#: export_format_dialog.cc:42
+msgid "Normalize:"
+msgstr "Normalisiere:"
+
+#: export_format_dialog.cc:43
+msgid "Peak"
+msgstr "Peak"
+
+#: export_format_dialog.cc:44
+msgid "Loudness"
+msgstr "Loudness"
+
+#: export_format_dialog.cc:50
+msgid "LUFS"
+msgstr "Loudness"
+
+#: export_format_dialog.cc:51
+msgid "dBTP"
+msgstr "dBTP"
 
-#: export_format_dialog.cc:46
+#: export_format_dialog.cc:54
 msgid "Trim silence at start"
 msgstr "Stille am Anfang abschneiden"
 
-#: export_format_dialog.cc:47
+#: export_format_dialog.cc:55
 msgid "Add silence at start:"
 msgstr "Füge Stille am Anfang hinzu:"
 
-#: export_format_dialog.cc:50
+#: export_format_dialog.cc:58
 msgid "Trim silence at end"
 msgstr "Stille am Ende abschneiden"
 
-#: export_format_dialog.cc:51
+#: export_format_dialog.cc:59
 msgid "Add silence at end:"
 msgstr "Füge Stille am Ende hinzu:"
 
-#: export_format_dialog.cc:54
+#: export_format_dialog.cc:62
 msgid ""
 "Command to run post-export\n"
-"(%f=full path & filename, %d=directory, %b=basename):"
+"(%f=file path, %d=directory, %b=basename, see tooltip for more):"
 msgstr ""
 "Kommando, das nach dem Export ausgeführt werden soll\n"
-"(%f=full path & filename, %d=directory, %b=basename):"
+"(%f=Dateipfad, %d=Verzeichnis, %b=basename, siehe auch den Tooltip für "
+"weitere):"
 
-#: export_format_dialog.cc:57
+#: export_format_dialog.cc:65
 msgid "Compatibility"
 msgstr "Kompatibilität"
 
-#: export_format_dialog.cc:58
+#: export_format_dialog.cc:66
 msgid "Quality"
 msgstr "Qualität"
 
-#: export_format_dialog.cc:61
+#: export_format_dialog.cc:69
 msgid "Sample rate conversion quality:"
 msgstr "Qualität bei Konvertierung der Samplerate:"
 
-#: export_format_dialog.cc:68
+#: export_format_dialog.cc:76
 msgid "Dithering"
 msgstr "Dithering"
 
-#: export_format_dialog.cc:70
+#: export_format_dialog.cc:78
 msgid "Create CUE file for disk-at-once CD/DVD creation"
 msgstr "Schreibe CUE-Datei für Disk-at-once CD/DVD Erzeugung"
 
-#: export_format_dialog.cc:71
+#: export_format_dialog.cc:79
 msgid "Create TOC file for disk-at-once CD/DVD creation"
 msgstr "Schreibe TOC-Datei für Disk-at-once CD/DVD Erzeugung"
 
-#: export_format_dialog.cc:72
+#: export_format_dialog.cc:80
 msgid "Create chapter mark file for MP4 chapter marks"
 msgstr "Erzeuge Kapitelmarkierungsdatei für MP4 Kapitelmarkierungen"
 
-#: export_format_dialog.cc:74
+#: export_format_dialog.cc:82
 msgid "Tag file with session's metadata"
 msgstr "Datei mit den Metadaten des Projekt taggen"
 
-#: export_format_dialog.cc:474
+#: export_format_dialog.cc:119
+msgid "∧"
+msgstr "^"
+
+#: export_format_dialog.cc:124
+msgid ""
+"Normalize to EBU-R128 LUFS target loudness without exceeding the given true-"
+"peak limit. EBU-R128 normalization is only available for mono and stereo "
+"targets, true-peak works for any channel layout."
+msgstr ""
+"Normalisiere auf EBU-R128 LUFS Ziellautheit, ohne das angegebene True-Peak "
+"Limit zu überschreiten. EBU-R128 Normalisierung ist nur für Mono- und "
+"Stereoziele verfügbar, True-Peak funktioniert für jede Kanalanzahl."
+
+#: export_format_dialog.cc:152
+msgid ""
+"%a Artist name\n"
+"%b File's base-name\n"
+"%c Copyright\n"
+"%d File's directory\n"
+"%f File's full absolute path\n"
+"%l Lyricist\n"
+"%n Session name\n"
+"%o Conductor\n"
+"%t Title\n"
+"%z Organization\n"
+"%A Album\n"
+"%C Comment\n"
+"%E Engineer\n"
+"%G Genre\n"
+"%L Total track count\n"
+"%M Mixer\n"
+"%N Timespan name\n"
+"%O Composer\n"
+"%P Producer\n"
+"%S Disc subtitle\n"
+"%T Track number\n"
+"%Y Year\n"
+"%Z Country"
+msgstr ""
+"%a Künstlername\n"
+"%b Basename der Datei\n"
+"%c Copyright\n"
+"%d Datei-Verzeichnis\n"
+"%f Voller absoluter Pfad der Datei\n"
+"%l Texter\n"
+"%n Projektname\n"
+"%o Dirigent\n"
+"%t Titel\n"
+"%z Organisation\n"
+"%A Album\n"
+"%C Kommentar\n"
+"%E Ingenieur\n"
+"%G Genre\n"
+"%L Gesamtspurzahl\n"
+"%M Mischer\n"
+"%N Name der Zeitspanne\n"
+"%O Komponist\n"
+"%P Produzent\n"
+"%S Disc-Untertitel\n"
+"%T Spurnummer\n"
+"%Y Jahr\n"
+"%Z Land"
+
+#: export_format_dialog.cc:537
 msgid "Best (sinc)"
 msgstr "Beste (sinc)"
 
-#: export_format_dialog.cc:479
+#: export_format_dialog.cc:542
 msgid "Medium (sinc)"
 msgstr "Mittel (sinc)"
 
-#: export_format_dialog.cc:484
+#: export_format_dialog.cc:547
 msgid "Fast (sinc)"
 msgstr "Schnellste (sinc)"
 
-#: export_format_dialog.cc:494
+#: export_format_dialog.cc:557
 msgid "Zero order hold"
 msgstr "Halteglied nullter Ordnung (ZOH)"
 
-#: export_format_dialog.cc:904
+#: export_format_dialog.cc:981
 msgid "Linear encoding options"
 msgstr "Optionen für lineare Codierung"
 
-#: export_format_dialog.cc:920
+#: export_format_dialog.cc:997
 msgid "Ogg Vorbis options"
 msgstr "Ogg Vorbis Optionen"
 
-#: export_format_dialog.cc:931
+#: export_format_dialog.cc:1008
 msgid "FLAC options"
 msgstr "FLAC Optionen"
 
-#: export_format_dialog.cc:948
+#: export_format_dialog.cc:1025
 msgid "Broadcast Wave options"
 msgstr "Broadcast Wave Optionen"
 
@@ -7011,19 +7530,202 @@ msgstr ""
 msgid "Do you really want to remove this preset?"
 msgstr "Wollen Sie dieses Preset wirklich entfernen?"
 
-#: export_timespan_selector.cc:44
+#: export_report.cc:56
+msgid "Export Report/Analysis"
+msgstr "Export-Report/Analyse"
+
+#: export_report.cc:147 export_report.cc:327 sfdb_ui.cc:149
+msgid "Format:"
+msgstr "Format:"
+
+#: export_report.cc:166 export_report.cc:328
+msgid "%1 Hz"
+msgstr "%1 Hz"
+
+#: export_report.cc:169 export_report.cc:336 transcode_video_dialog.cc:139
+msgid "Duration:"
+msgstr "Dauer:"
+
+#: export_report.cc:177 export_report.cc:334
+msgid "Timecode:"
+msgstr "Timecode:"
+
+#: export_report.cc:185
+msgid "Error:"
+msgstr "Fehler:"
+
+#: export_report.cc:220 export_report.cc:440
+msgid "(too short integration time)"
+msgstr "(zu kurze Zeitspanne zum Integrieren)"
+
+#: export_report.cc:222
+msgid "-888"
+msgstr "-888"
+
+#: export_report.cc:227 export_report.cc:353
+msgid "Peak:"
+msgstr "Peak:"
+
+#: export_report.cc:228 export_report.cc:360
+msgid "%1 dBFS"
+msgstr "%1 dBFS"
+
+#: export_report.cc:229 export_report.cc:369
+msgid "True Peak:"
+msgstr "True Peak:"
+
+#: export_report.cc:230 export_report.cc:376
+msgid "%1 dBTP"
+msgstr "%1 dBTP"
+
+#: export_report.cc:231 export_report.cc:387
+msgid "Normalization Gain:"
+msgstr "Normalisierungsverstärkung:"
+
+#: export_report.cc:232
+msgid "+888.88 dB"
+msgstr "+888.88 dB"
+
+#: export_report.cc:234 export_report.cc:448
+msgid "Integrated Loudness:"
+msgstr "Integrierte Lautheit:"
+
+#: export_report.cc:235 export_report.cc:454
+msgid "%1 LUFS"
+msgstr "%1 LUFS"
+
+#: export_report.cc:236 export_report.cc:460
+msgid "Loudness Range:"
+msgstr "Lautheitsbereich:"
+
+#: export_report.cc:237 export_report.cc:466
+msgid "%1 LU"
+msgstr "%1 LU"
+
+#: export_report.cc:247 export_report.cc:754
+msgid "100"
+msgstr "100"
+
+#: export_report.cc:282 export_report.cc:650
+msgid "00:00:00.000"
+msgstr "00:00:00.000"
+
+#: export_report.cc:288
+msgid "0|A8"
+msgstr "0|A8"
+
+#: export_report.cc:394
+msgid "%1 dB"
+msgstr "%1 dB"
+
+#: export_report.cc:425 export_report.cc:433 export_report.cc:553
+msgid ""
+"Not\n"
+"Available"
+msgstr ""
+"Nicht\n"
+"Verfügbar"
+
+#: export_report.cc:493
+msgid ""
+"LUFS\n"
+"(short)"
+msgstr ""
+"LUFS\n"
+"(kurz)"
+
+#: export_report.cc:503
+msgid "Multiplicity"
+msgstr "Multiplizität"
+
+#: export_report.cc:603
+msgid "Logscale|Lg"
+msgstr "Logarithmisch|Lg"
+
+#: export_report.cc:604
+msgid "Rectified|Rf"
+msgstr "Rektifiziert|Rf"
+
+#: export_report.cc:605
+msgid "Logscale"
+msgstr "Logarithmisch"
+
+#: export_report.cc:606
+msgid "Rectified"
+msgstr "Rektifiziert"
+
+#: export_report.cc:738
+msgid "Hz"
+msgstr "Hz"
+
+#: export_report.cc:755
+msgid "500"
+msgstr "500"
+
+#: export_report.cc:756
+msgid "1K"
+msgstr "1K"
+
+#: export_report.cc:757
+msgid "5K"
+msgstr "5K"
+
+#: export_report.cc:758
+msgid "10K"
+msgstr "10K"
+
+#: export_report.cc:844
+msgid "Writing Export Analysis Image: %1."
+msgstr "Schreibe Bild der Exportanalyse: %1"
+
+#: export_report.cc:941 sfdb_ui.cc:293 sfdb_ui.cc:409
+msgid "Could not read file: %1 (%2)."
+msgstr "Konnte Datei nicht lesen: %1 (%2)."
+
+#: export_report.cc:967 sfdb_ui.cc:458
+msgid "Could not access soundfile: "
+msgstr "Konnte auf Audiodatei nicht zugreifen: "
+
+#: export_report.cc:1203
+msgid "-36"
+msgstr "-36"
+
+#: export_report.cc:1204 export_report.cc:1208 export_report.cc:1214
+#: export_report.cc:1217
+msgid "-18"
+msgstr "-18"
+
+#: export_report.cc:1205 export_report.cc:1209 export_report.cc:1215
+#: export_report.cc:1218 export_report.cc:1221 export_report.cc:1222
+msgid "-9"
+msgstr "-9"
+
+#: export_report.cc:1206 export_report.cc:1210 export_report.cc:1216
+#: export_report.cc:1219 export_report.cc:1223 export_report.cc:1224
+msgid "-3"
+msgstr "-3"
+
+#: export_timespan_selector.cc:45
 msgid "Show Times as:"
 msgstr "Zeitanzeige:"
 
-#: export_timespan_selector.cc:51 processor_box.cc:2730
+#: export_timespan_selector.cc:46
+msgid "Realtime Export"
+msgstr "Echtzeit-Export"
+
+#: export_timespan_selector.cc:54 processor_box.cc:3695
 msgid "Select All"
 msgstr "Alles auswählen"
 
-#: export_timespan_selector.cc:220 transform_dialog.cc:93
+#: export_timespan_selector.cc:255 transform_dialog.cc:93
 msgid " to "
 msgstr " bis"
 
-#: export_timespan_selector.cc:364 export_timespan_selector.cc:423
+#: export_timespan_selector.cc:399 export_timespan_selector.cc:488
+msgid "RT"
+msgstr "RT"
+
+#: export_timespan_selector.cc:400 export_timespan_selector.cc:489
 msgid "Range"
 msgstr "Bereiche"
 
@@ -7039,86 +7741,90 @@ msgstr "getSoundResourceFile: Keine gültige Wurzel in der XML-Datei"
 msgid "getSoundResourceFile: root = %1, != response"
 msgstr "getSoundResourceFile: Wurzel = %1, != Antwort"
 
-#: sfdb_freesound_mootcher.cc:410 rc_option_editor.cc:2276
+#: sfdb_freesound_mootcher.cc:410 rc_option_editor.cc:2416
 msgid "%1"
 msgstr "%1"
 
-#: gain_meter.cc:134 gain_meter.cc:402 gain_meter.cc:507 gain_meter.cc:898
+#: gain_meter.cc:137 gain_meter.cc:422 gain_meter.cc:527 gain_meter.cc:919
 msgid "-inf"
 msgstr "-inf"
 
-#: gain_meter.cc:149 gain_meter.cc:962
+#: gain_meter.cc:152 gain_meter.cc:983
 msgid "Fader automation mode"
 msgstr "Fader Automationsmodus"
 
-#: gain_meter.cc:150 gain_meter.cc:963
+#: gain_meter.cc:153 gain_meter.cc:984
 msgid "Fader automation type"
 msgstr "Fader-Automationstyp"
 
-#: gain_meter.cc:159 gain_meter.cc:831 panner_ui.cc:179 panner_ui.cc:641
+#: gain_meter.cc:162 gain_meter.cc:852 panner_ui.cc:179 panner_ui.cc:641
 msgid "Abs"
 msgstr "Abs"
 
-#: gain_meter.cc:795
+#: gain_meter.cc:816 vca_master_strip.cc:78 vca_time_axis.cc:54
 msgid "M"
 msgstr "M"
 
-#: gain_meter.cc:798
+#: gain_meter.cc:819 vca_master_strip.cc:296
 msgid "P"
 msgstr "P"
 
-#: gain_meter.cc:801
+#: gain_meter.cc:822
 msgid "T"
 msgstr "T"
 
-#: gain_meter.cc:804
+#: gain_meter.cc:825
 msgid "W"
 msgstr "W"
 
-#: generic_pluginui.cc:85
+#: generic_pluginui.cc:83
 msgid "<span size=\"large\">Presets</span>"
 msgstr "<span size=\"large\">Voreinstellungen</span>"
 
-#: generic_pluginui.cc:100
+#: generic_pluginui.cc:99 plugin_pin_dialog.cc:333
 msgid "Manual"
 msgstr "Manuell"
 
-#: generic_pluginui.cc:109
+#: generic_pluginui.cc:108
 msgid "All Automation"
 msgstr "Alle Automation"
 
-#: generic_pluginui.cc:253
-msgid "Switches"
-msgstr "Schalter"
-
-#: generic_pluginui.cc:263 generic_pluginui.cc:439 processor_box.cc:2708
-msgid "Controls"
-msgstr "Steuerelemente"
-
-#: generic_pluginui.cc:296
+#: generic_pluginui.cc:259
 msgid "Plugin Editor: could not build control element for port %1"
 msgstr "Plugin Editor: konnte kein Steuerelement für Port %1 erzeugen"
 
-#: generic_pluginui.cc:321
+#: generic_pluginui.cc:290
 msgid "Plugin Editor: no control for property %1"
 msgstr "Plugin Editor: kein Regler für Eigenschaft %1"
 
-#: generic_pluginui.cc:327
+#: generic_pluginui.cc:296
 msgid "Plugin Editor: could not build control element for property %1"
 msgstr "Plugin Editor: konnte kein Kontrollelement für Eigenschaft %1 erzeugen"
 
-#: generic_pluginui.cc:471
+#: generic_pluginui.cc:370
+msgid "Switches"
+msgstr "Schalter"
+
+#: generic_pluginui.cc:380 generic_pluginui.cc:486 processor_box.cc:3665
+msgid "Controls"
+msgstr "Steuerelemente"
+
+#: generic_pluginui.cc:521
 msgid "Meters"
 msgstr "Pegelanzeigen"
 
-#: generic_pluginui.cc:493
+#: generic_pluginui.cc:559
 msgid "Automation control"
 msgstr "Automation"
 
-#: generic_pluginui.cc:500
+#: generic_pluginui.cc:566
 msgid "Mgnual"
 msgstr "Mgnuell"
 
+#: generic_pluginui.cc:831
+msgid "This control cannot be automated"
+msgstr "Dieses Kontrollelement kann nicht automatisiert werden"
+
 #: global_port_matrix.cc:158
 msgid "Audio Connection Manager"
 msgstr "Audio Verbindungsmanager"
@@ -7127,8 +7833,9 @@ msgstr "Audio Verbindungsmanager"
 msgid "MIDI Connection Manager"
 msgstr "Midi Verbindungsmanager"
 
-#: global_port_matrix.cc:201 io_selector.cc:211 mixer_strip.cc:840
-#: mixer_strip.cc:941 monitor_section.cc:1306 monitor_selector.cc:189
+#: global_port_matrix.cc:201 io_selector.cc:211 mixer_strip.cc:870
+#: mixer_strip.cc:973 monitor_section.cc:1430 monitor_selector.cc:189
+#: plugin_pin_dialog.cc:1757
 msgid "Disconnect"
 msgstr "Trenne"
 
@@ -7136,59 +7843,83 @@ msgstr "Trenne"
 msgid "port"
 msgstr "Port"
 
-#: group_tabs.cc:312
+#: group_tabs.cc:312 group_tabs.cc:321
 msgid "Selection..."
 msgstr "Ausgewählten Spuren"
 
-#: group_tabs.cc:313
+#: group_tabs.cc:313 group_tabs.cc:322
 msgid "Record Enabled..."
 msgstr "Spuren, deren Aufnahme aktiviert ist"
 
-#: group_tabs.cc:314
+#: group_tabs.cc:314 group_tabs.cc:323
 msgid "Soloed..."
 msgstr "Solo-Spuren/Busse"
 
-#: group_tabs.cc:321
+#: group_tabs.cc:316
+msgid "Create New Group From..."
+msgstr "Erzeuge neue Gruppe aus..."
+
+#: group_tabs.cc:325
+msgid "Create New Group with Master From..."
+msgstr "Erzeuge neue Gruppe mit Master aus..."
+
+#: group_tabs.cc:344
 msgid "Create New Group ..."
 msgstr "Neue Gruppe erzeugen ..."
 
-#: group_tabs.cc:324
-msgid "Create New Group From"
-msgstr "Neue Gruppe erzeugen aus"
+#: group_tabs.cc:345
+msgid "Create New Group with Control Master ..."
+msgstr "Erzeuge neue Gruppe mit Kontroll-Master..."
 
-#: group_tabs.cc:327
+#: group_tabs.cc:355
 msgid "Edit Group..."
 msgstr "Gruppe bearbeiten..."
 
-#: group_tabs.cc:328
+#: group_tabs.cc:356
 msgid "Collect Group"
 msgstr "Gruppe sammeln"
 
-#: group_tabs.cc:329
+#: group_tabs.cc:357
 msgid "Remove Group"
 msgstr "Gruppe entfernen"
 
-#: group_tabs.cc:332
+#: group_tabs.cc:368
+msgid "Assign Group to Control Master..."
+msgstr "Weise Gruppe an Kontroll-Master zu..."
+
+#: group_tabs.cc:374
 msgid "Remove Subgroup Bus"
 msgstr "Subgruppen-Bus entfernen"
 
-#: group_tabs.cc:334
+#: group_tabs.cc:376
 msgid "Add New Subgroup Bus"
 msgstr "Subgruppen-Bus hinzufügen"
 
-#: group_tabs.cc:336
+#: group_tabs.cc:378
 msgid "Add New Aux Bus (pre-fader)"
 msgstr "Aux-Send zur Subgruppe hinzufügen (Pre-Fader)"
 
-#: group_tabs.cc:337
+#: group_tabs.cc:379
 msgid "Add New Aux Bus (post-fader)"
 msgstr "Aux-Send zur Subgruppe hinzufügen (Post-Fader)"
 
-#: group_tabs.cc:343
+#: group_tabs.cc:404
+msgid "Assign Selection to Control Master..."
+msgstr "Weise Auswahl an Kontroll-Master zu..."
+
+#: group_tabs.cc:415
+msgid "Assign Record Enabled to Control Master..."
+msgstr "Weise Aufnahmebereitschaft an Kontroll-Master zu..."
+
+#: group_tabs.cc:426
+msgid "Assign Soloed to Control Master..."
+msgstr "Weise Solostatus an Kontroll-Master zu..."
+
+#: group_tabs.cc:429
 msgid "Enable All Groups"
 msgstr "Alle Gruppen aktivieren"
 
-#: group_tabs.cc:344
+#: group_tabs.cc:430
 msgid "Disable All Groups"
 msgstr "Alle Gruppen deaktivieren"
 
@@ -7252,11 +7983,17 @@ msgstr "Zeit entfernen"
 msgid "Insert time"
 msgstr "Stille einfügen"
 
-#: instrument_selector.cc:62
+#: insert_remove_time_dialog.cc:174
+msgid "Invalid or zero duration entered. Please enter a valid duration"
+msgstr ""
+"Ungültige oder Null-Zeitdauer eingegeben. Bitte geben Sie eine gültige Dauer "
+"an."
+
+#: instrument_selector.cc:92
 msgid "-none-"
 msgstr "-keine-"
 
-#: interthread_progress_window.cc:104
+#: interthread_progress_window.cc:114
 msgid "Importing file: %1 of %2"
 msgstr "Importiere Datei: %1 von %2"
 
@@ -7272,63 +8009,90 @@ msgstr "%1 Eingang"
 msgid "%1 output"
 msgstr "%1 Ausgang"
 
-#: keyboard.cc:82
+#: keyboard.cc:93
 msgid "your own"
 msgstr "Eigenes"
 
-#: keyboard.cc:145 keyboard.cc:169
+#: keyboard.cc:157 keyboard.cc:181
 msgid "Default keybindings not found - %1 will be hard to use!"
 msgstr ""
 "Keine Tastatur-Standardbelegung gefunden - %1 wird sich schwer bedienen "
 "lassen!"
 
-#: keyboard.cc:148
+#: keyboard.cc:160
 msgid "Key bindings file \"%1\" not found. Default bindings used instead"
 msgstr ""
 "Die Datei  \"%1\" für Tastaturkürzel  wurde nicht gefunden. Stattdessen wird "
 "die Standard-Belegung verwendet."
 
-#: keyeditor.cc:54
+#: keyboard.cc:193
+msgid "Loading keybindings from %1"
+msgstr "Lade Tastenzuordnungen vin %1"
+
+#: keyeditor.cc:67
+msgid "Colliding keybindings"
+msgstr "Kollision bei Tastenzuordnung"
+
+#: keyeditor.cc:68
+msgid ""
+"The key sequence is already bound. Please remove the other binding first."
+msgstr ""
+"Diese Tastenfolge ist schon in Verwendung. Bitte entfernen Sie erst die "
+"andere Zuordnung."
+
+#: keyeditor.cc:77
+msgid "Key Bindings"
+msgstr "Tastaturkürzel"
+
+#: keyeditor.cc:78
 msgid "Remove shortcut"
 msgstr "Tastenkürzel entfernen"
 
-#: keyeditor.cc:63
-msgid "Action"
-msgstr "Aktion"
+#: keyeditor.cc:80
+msgid "Search..."
+msgstr "Suche..."
 
-#: keyeditor.cc:64
-msgid "Shortcut"
-msgstr "Tastenkürzel"
+#: keyeditor.cc:82
+msgid "Print"
+msgstr "Drucken"
+
+#: keyeditor.cc:93
+msgid "Click to reset search string"
+msgstr "Klicke, um Suchstring zurückzusetzen"
 
-#: keyeditor.cc:84
-msgid "Select an action, then press the key(s) to (re)set its shortcut"
+#: keyeditor.cc:97
+msgid "To remove a shortcut select an action then press this: "
 msgstr ""
-"Wählen Sie eine Aktion und drücken Sie dann die Taste(n) \n"
-"um das Tastaturkürzel zu setzen"
+"Um ein Tastenkürzel zu löschen, wählen Sie eine Aktion aus und klicken dann "
+"hier:"
 
-#: keyeditor.cc:98
+#: keyeditor.cc:109
 msgid "Reset Bindings to Defaults"
 msgstr "Setze Kürzel auf Vorgabewerte zurück"
 
-#: keyeditor.cc:263
-msgid "Main_menu"
-msgstr "Hauptmenü"
-
-#: keyeditor.cc:265
-msgid "redirectmenu"
-msgstr "Umleitungsmenü"
+#: keyeditor.cc:227 lua_script_manager.cc:41
+msgid "Action"
+msgstr "Aktion"
 
-#: keyeditor.cc:267
-msgid "Editor_menus"
-msgstr "Editor-Menü"
+#: keyeditor.cc:228
+msgid "Shortcut"
+msgstr "Tastenkürzel"
 
-#: keyeditor.cc:269
+#: keyeditor.cc:370
 msgid "RegionList"
 msgstr "Regionenliste"
 
-#: keyeditor.cc:271
-msgid "ProcessorMenu"
-msgstr "Prozessor-Menü"
+#: keyeditor.cc:543
+msgid "Could not open temporary file to print bindings (%1)"
+msgstr "Konnte temporäre Datei zum Drucken der Kürzel nicht öffnen (%1)"
+
+#: keyeditor.cc:561
+msgid "Could not save bindings to file (%1)"
+msgstr "Konnte Kürzel nicht in Datei (%1) speichern"
+
+#: latency_gui.cc:39
+msgid "sample"
+msgstr "Sample"
 
 #: latency_gui.cc:40
 msgid "msec"
@@ -7338,37 +8102,35 @@ msgstr "ms"
 msgid "period"
 msgstr "Periode"
 
-#: latency_gui.cc:55
-msgid "%1 sample"
-msgid_plural "%1 samples"
-msgstr[0] "%1 Sample"
-msgstr[1] "%1 Samples"
-
-#: latency_gui.cc:72 panner_ui.cc:411 plugin_ui.cc:421
+#: latency_gui.cc:72 panner_ui.cc:411 plugin_pin_dialog.cc:109 plugin_ui.cc:422
 msgid "Reset"
 msgstr "Reset"
 
-#: latency_gui.cc:149 rhythm_ferret.cc:273 sfdb_ui.cc:1909
+#: latency_gui.cc:149 rhythm_ferret.cc:295 sfdb_ui.cc:1878
 msgid "programming error: %1 (%2)"
 msgstr "Programmierfehler: %1 (%2)"
 
-#: location_ui.cc:54 location_ui.cc:56
+#: location_ui.cc:54 location_ui.cc:57
 msgid "Use PH"
 msgstr "zu PZ"
 
-#: location_ui.cc:61
+#: location_ui.cc:55 location_ui.cc:58
+msgid "Goto"
+msgstr "Gehe zu"
+
+#: location_ui.cc:63
 msgid "Glue"
 msgstr "Bindung"
 
-#: location_ui.cc:89
+#: location_ui.cc:88
 msgid "Performer:"
 msgstr "Performer:"
 
-#: location_ui.cc:90
+#: location_ui.cc:89
 msgid "Composer:"
 msgstr "Komponist:"
 
-#: location_ui.cc:92
+#: location_ui.cc:91
 msgid "Pre-Emphasis"
 msgstr "Präemphase"
 
@@ -7404,43 +8166,160 @@ msgstr "Position - Mittelklick, um hierher zu positionieren"
 msgid "Set marker time from playhead location"
 msgstr "Markerposition auf Positionszeiger setzen"
 
-#: location_ui.cc:501
+#: location_ui.cc:524
 msgid "You cannot put a CD marker at the start of the session"
 msgstr "Sie können keinen CD-Marker am Anfang des Projekts erstellen"
 
-#: location_ui.cc:727
+#: location_ui.cc:750
 msgid "New Marker"
 msgstr "Neuer Marker"
 
-#: location_ui.cc:728
+#: location_ui.cc:751
 msgid "New Range"
 msgstr "Neuer Bereich"
 
-#: location_ui.cc:741
+#: location_ui.cc:764
 msgid "<b>Loop/Punch Ranges</b>"
 msgstr "<b>Schleifen/Punchbereiche</b>"
 
-#: location_ui.cc:766
+#: location_ui.cc:790
 msgid "<b>Markers (Including CD Index)</b>"
 msgstr "<b>Marker (auch CD-Index)</b>"
 
-#: location_ui.cc:801
+#: location_ui.cc:825
 msgid "<b>Ranges (Including CD Track Ranges)</b>"
 msgstr "<b>Bereiche (auch CD-Track-Bereichen)</b>"
 
-#: location_ui.cc:1044
+#: location_ui.cc:1068
 msgid "add range marker"
 msgstr "Bereich hinzufügen"
 
-#: main.cc:86
+#: lua_script_manager.cc:31
+msgid "Add/Set"
+msgstr "Hinzufügen/Setzen"
+
+#: lua_script_manager.cc:34
+msgid "Call"
+msgstr "Aufruf"
+
+#: lua_script_manager.cc:35
+msgid "New Hook"
+msgstr "Neuer Haken"
+
+#: lua_script_manager.cc:77
+msgid "Signal(s)"
+msgstr "Signal(e)"
+
+#: lua_script_manager.cc:127
+msgid "Action %1"
+msgstr "Aktion %1"
+
+#: lua_script_manager.cc:132 lua_script_manager.cc:227
+msgid "Unset"
+msgstr "Zuordnung aufheben"
+
+#: luainstance.cc:1096
+msgid "Cannot read script '%1': %2"
+msgstr "Kann Skript '%1' nicht lesen: %2"
+
+#: luawindow.cc:97
+msgid "Run"
+msgstr "Starten"
+
+#: luawindow.cc:98
+msgid "Clear Output"
+msgstr "Ausgabe löschen"
+
+#: luawindow.cc:102
+msgid "Revert"
+msgstr "Rückgängig machen"
+
+#: luawindow.cc:166
+msgid "Select Editor Buffer"
+msgstr "Editor-Puffer auswählen"
+
+#: luawindow.cc:253 luawindow.cc:258
+msgid "Window|Lua"
+msgstr "Lua"
+
+#: luawindow.cc:286 luawindow.cc:304
+msgid "LuaException: %1"
+msgstr "LuaException: %1"
+
+#: luawindow.cc:342
+msgid "Deleted %1"
+msgstr "Gelöscht %1"
+
+#: luawindow.cc:345
+msgid "Failed to delete %1"
+msgstr "Konnte %1 nicht löschen"
+
+#: luawindow.cc:411
+msgid ""
+"Missing script header.\n"
+"The script requires an '{ardour}' info table and a 'factory' function."
+msgstr ""
+"Fehlender Skript-Kopfbereich. \n"
+"Das Skript benötigt eine '{ardour}'  Informationstabelle und eine `factory` "
+"Funktion."
+
+#: luawindow.cc:416
+msgid "Script fails to compile."
+msgstr "Skript lässt sich nicht kompilieren."
+
+#: luawindow.cc:423
+msgid "Invalid or missing script-name or script-type."
+msgstr "Ungültiger oder"
+
+#: luawindow.cc:428
+msgid ""
+"Invalid script-type.\n"
+"Valid types are 'EditorAction' and 'Snippet'."
+msgstr ""
+"Ungültiger Skripttyp.\n"
+"Gültige Typen sind 'EditorAction' und 'Snippet'."
+
+#: luawindow.cc:439 luawindow.cc:490
+msgid "Saved as %1"
+msgstr "Als %1 gespeichert"
+
+#: luawindow.cc:442 luawindow.cc:493
+msgid "Error saving file: %1"
+msgstr "Fehler beim Speichern der Datei: %1"
+
+#: luawindow.cc:452
+msgid ""
+"Script with given name '%1' already exists.\n"
+"Use a different name in the descriptor."
+msgstr ""
+"Ein Skript mit diesem Namen existiert bereits.\n"
+"Verwenden Sie einen anderen Namen im Deskriptor."
+
+#: luawindow.cc:636
+msgid "Scratch Buffer %1"
+msgstr "Zwischenspeicher %1"
+
+#: luawindow.cc:638
+msgid "Action: '%1'"
+msgstr "Aktion: '%1'"
+
+#: luawindow.cc:640
+msgid "Snippet: %1"
+msgstr "Schnipsel: %1"
+
+#: luawindow.cc:652
+msgid "Save as"
+msgstr "Speichern unter"
+
+#: main.cc:88
 msgid "%1 could not connect to the audio backend."
 msgstr "%1 konnte nicht zum Audiobackend verbinden."
 
-#: main.cc:133 main.cc:149
+#: main.cc:135 main.cc:151
 msgid "The audio backend (%1) has failed, or terminated"
 msgstr "Das Audiobackend (%1) funktioniert nicht oder wurde beendet"
 
-#: main.cc:136
+#: main.cc:138
 msgid ""
 "%2 exited unexpectedly, and without notifying %1.\n"
 "\n"
@@ -7455,11 +8334,11 @@ msgstr ""
 "\n"
 "Klicke OK, um %1 zu verlassen."
 
-#: main.cc:150
+#: main.cc:152
 msgid "%2 exited unexpectedly, and without notifying %1."
 msgstr "%2 wurde unerwartet und ohne %1 zu benachrichtigen beendet "
 
-#: main.cc:245
+#: main.cc:247
 msgid ""
 "\n"
 "   %1 could not understand your command line      "
@@ -7467,23 +8346,23 @@ msgstr ""
 "\n"
 "   %1 konnte Ihre Kommandozeile nicht verstehen      "
 
-#: main.cc:247
+#: main.cc:249
 msgid "An error was encountered while launching %1"
 msgstr "Während des Programmstarts von %1 ist ein Fehler aufgetreten"
 
-#: main.cc:340
+#: main.cc:350
 msgid " (built using "
 msgstr " (kompiliert mit Version "
 
-#: main.cc:343
+#: main.cc:353
 msgid " and GCC version "
 msgstr " und GCC Version"
 
-#: main.cc:353
+#: main.cc:363
 msgid "Copyright (C) 1999-2015 Paul Davis"
 msgstr "Copyright (C) 1999-2015 Paul Davis"
 
-#: main.cc:354
+#: main.cc:364
 msgid ""
 "Some portions Copyright (C) Steve Harris, Ari Johnson, Brett Viren, Joel "
 "Baker, Robin Gareus"
@@ -7491,38 +8370,38 @@ msgstr ""
 "Einige Teile Copyright (C) Steve Harris, Ari Johnson, Brett Viren, Joel "
 "Baker, Robin Gareus"
 
-#: main.cc:356
+#: main.cc:366
 msgid "%1 comes with ABSOLUTELY NO WARRANTY"
 msgstr "%1 wird Ihnen ohne jegliche Gewährleistung"
 
-#: main.cc:357
+#: main.cc:367
 msgid "not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
 msgstr ""
 "für allgemeine oder spezielle Gebrauchstauglichkeit zur Verfügung gestellt."
 
-#: main.cc:358
+#: main.cc:368
 msgid "This is free software, and you are welcome to redistribute it "
 msgstr "Dies ist freie Software, die Sie gerne weitergeben dürfen,"
 
-#: main.cc:359
+#: main.cc:369
 msgid "under certain conditions; see the source for copying conditions."
 msgstr ""
 "solange Sie sich an die Bedingungen, die in der Datei COPYING aufgeführt "
 "sind, halten."
 
-#: main.cc:364
+#: main.cc:374
 msgid "could not initialize %1."
 msgstr "Konnte %1 nicht initialisieren."
 
-#: main.cc:374
+#: main.cc:384
 msgid "Cannot xinstall SIGPIPE error handler"
 msgstr "Kann die SIGPIPE Fehlerbehandlung nicht installieren"
 
-#: main.cc:379
+#: main.cc:391
 msgid "Could not complete pre-GUI initialization"
 msgstr "Konnte Initialisierung (pre-GUI) nicht abschließen"
 
-#: main.cc:386
+#: main.cc:398
 msgid "could not create %1 GUI"
 msgstr "konnte das %1 GUI nicht erstellen"
 
@@ -7530,11 +8409,11 @@ msgstr "konnte das %1 GUI nicht erstellen"
 msgid "Display delta to edit cursor"
 msgstr "Zeige Abstand zu Arbeitspunkt"
 
-#: main_clock.cc:66 tempo_dialog.cc:54
+#: main_clock.cc:66 tempo_dialog.cc:55
 msgid "Edit Tempo"
 msgstr "Tempo bearbeiten"
 
-#: main_clock.cc:67 tempo_dialog.cc:326
+#: main_clock.cc:67 tempo_dialog.cc:429
 msgid "Edit Meter"
 msgstr "Taktart bearbeiten"
 
@@ -7551,8 +8430,8 @@ msgid "MarkerText"
 msgstr "MarkerText"
 
 #: midi_channel_selector.cc:161 midi_channel_selector.cc:400
-#: midi_channel_selector.cc:436 rc_option_editor.cc:2017
-#: rc_option_editor.cc:2663 sfdb_ui.cc:670
+#: midi_channel_selector.cc:436 rc_option_editor.cc:2157
+#: rc_option_editor.cc:2799 sfdb_ui.cc:671
 msgid "None"
 msgstr "Kein"
 
@@ -7743,83 +8622,79 @@ msgstr "Portname:"
 msgid "MidiPortDialog"
 msgstr "MidiPortDialog"
 
-#: midi_region_view.cc:849
+#: midi_region_view.cc:855
 msgid "channel edit"
 msgstr "Kanal editieren"
 
-#: midi_region_view.cc:885
+#: midi_region_view.cc:891
 msgid "velocity edit"
 msgstr "Velocity bearbeiten"
 
-#: midi_region_view.cc:944
+#: midi_region_view.cc:958
 msgid "add note"
 msgstr "Note hinzufügen"
 
-#: midi_region_view.cc:1872
+#: midi_region_view.cc:1902
 msgid "step add"
 msgstr "Schritt hinzufügen"
 
-#: midi_region_view.cc:1966 midi_region_view.cc:1989
+#: midi_region_view.cc:1996 midi_region_view.cc:2019
 msgid "alter patch change"
 msgstr "Patch Change ändern"
 
-#: midi_region_view.cc:2025
+#: midi_region_view.cc:2055
 msgid "add patch change"
 msgstr "Patch Change hinzufügen"
 
-#: midi_region_view.cc:2047 midi_region_view.cc:2048
+#: midi_region_view.cc:2077 midi_region_view.cc:2078
 msgid "move patch change"
 msgstr "Patch Change verschieben"
 
-#: midi_region_view.cc:2060 midi_region_view.cc:2061
+#: midi_region_view.cc:2090 midi_region_view.cc:2091
 msgid "delete patch change"
 msgstr "Patch Change löschen"
 
-#: midi_region_view.cc:2099
+#: midi_region_view.cc:2129
 msgid "delete selection"
 msgstr "Auswahl löschen"
 
-#: midi_region_view.cc:2116
+#: midi_region_view.cc:2146
 msgid "delete note"
 msgstr "Note löschen"
 
-#: midi_region_view.cc:2575
+#: midi_region_view.cc:2587
 msgid "move notes"
 msgstr "Noten verschieben"
 
-#: midi_region_view.cc:3110
+#: midi_region_view.cc:3137
 msgid "change velocities"
 msgstr "Velocity ändern"
 
-#: midi_region_view.cc:3176
+#: midi_region_view.cc:3203
 msgid "transpose"
 msgstr "Transponieren"
 
-#: midi_region_view.cc:3204
+#: midi_region_view.cc:3231
 msgid "change note lengths"
 msgstr "Notenlänge ändern"
 
-#: midi_region_view.cc:3280
+#: midi_region_view.cc:3307
 msgid "nudge"
 msgstr "Verschieben"
 
-#: midi_region_view.cc:3295
+#: midi_region_view.cc:3322
 msgid "change channel"
 msgstr "Kanal ändern"
 
-#: midi_region_view.cc:3333
+#: midi_region_view.cc:3370
 msgid "Bank "
 msgstr "Bank"
 
-#: midi_region_view.cc:3334
-msgid "Program "
-msgstr "Programm"
-
-#: midi_region_view.cc:3335
+#: midi_region_view.cc:3372
 msgid "Channel "
 msgstr "Kanal"
 
-#: midi_region_view.cc:3522
+#: midi_region_view.cc:3559
 msgid "paste"
 msgstr "Einfügen"
 
@@ -7835,108 +8710,108 @@ msgstr "versuche, eine MIDI Region ohne Datenmodell darzustellen"
 msgid "failed to create MIDI region"
 msgstr "konnte MIDI-Region nicht erzeugen"
 
-#: midi_time_axis.cc:316
+#: midi_time_axis.cc:306
 msgid "External MIDI Device"
 msgstr "Externes MIDI-Gerät"
 
-#: midi_time_axis.cc:317
+#: midi_time_axis.cc:307
 msgid "External Device Mode"
 msgstr "Modus Externes Gerät"
 
-#: midi_time_axis.cc:325
+#: midi_time_axis.cc:315
 msgid "Chns"
 msgstr "Chns"
 
-#: midi_time_axis.cc:327
+#: midi_time_axis.cc:317
 msgid "Click to edit channel settings"
 msgstr "Klicke, um Kanaleinstellungen zu bearbeiten"
 
-#: midi_time_axis.cc:526
+#: midi_time_axis.cc:516
 msgid "Show Full Range"
 msgstr "Ganzen Bereich anzeigen"
 
-#: midi_time_axis.cc:531
+#: midi_time_axis.cc:521
 msgid "Fit Contents"
 msgstr "Auf Inhalt anpassen"
 
-#: midi_time_axis.cc:535
+#: midi_time_axis.cc:525
 msgid "Note Range"
 msgstr "Notenbereich"
 
-#: midi_time_axis.cc:536
+#: midi_time_axis.cc:526
 msgid "Note Mode"
 msgstr "Noten-Modus"
 
-#: midi_time_axis.cc:537
+#: midi_time_axis.cc:527
 msgid "Channel Selector"
 msgstr "Kanalauswahl"
 
-#: midi_time_axis.cc:542
+#: midi_time_axis.cc:532
 msgid "Color Mode"
 msgstr "Farbmodus"
 
-#: midi_time_axis.cc:601
+#: midi_time_axis.cc:591
 msgid "Bender"
 msgstr "Bender"
 
-#: midi_time_axis.cc:605
+#: midi_time_axis.cc:595
 msgid "Pressure"
 msgstr "Druckdaten"
 
-#: midi_time_axis.cc:617
+#: midi_time_axis.cc:607
 msgid "Controllers"
 msgstr "Controller"
 
-#: midi_time_axis.cc:622
+#: midi_time_axis.cc:612
 msgid "No MIDI Channels selected"
 msgstr "Keine MIDI-Kanäle ausgewählt"
 
-#: midi_time_axis.cc:679 midi_time_axis.cc:808
+#: midi_time_axis.cc:669 midi_time_axis.cc:798
 msgid "Hide all channels"
 msgstr "Alle Kanäle verbergen"
 
-#: midi_time_axis.cc:683 midi_time_axis.cc:812
+#: midi_time_axis.cc:673 midi_time_axis.cc:802
 msgid "Show all channels"
 msgstr "Alle Kanäle anzeigen"
 
-#: midi_time_axis.cc:694 midi_time_axis.cc:823
+#: midi_time_axis.cc:684 midi_time_axis.cc:813
 msgid "Channel %1"
 msgstr "Kanal %1"
 
-#: midi_time_axis.cc:949 midi_time_axis.cc:981
+#: midi_time_axis.cc:939 midi_time_axis.cc:971
 msgid "Controllers %1-%2"
 msgstr "Controller %1-%2"
 
-#: midi_time_axis.cc:972 midi_time_axis.cc:975
+#: midi_time_axis.cc:962 midi_time_axis.cc:965
 msgid "Controller %1"
 msgstr "Controller %1"
 
-#: midi_time_axis.cc:998
+#: midi_time_axis.cc:988
 msgid "Sustained"
 msgstr "Sustain"
 
-#: midi_time_axis.cc:1005
+#: midi_time_axis.cc:995
 msgid "Percussive"
 msgstr "Perkussiv"
 
-#: midi_time_axis.cc:1025
+#: midi_time_axis.cc:1015
 msgid "Meter Colors"
 msgstr "Nach Lautstärke"
 
-#: midi_time_axis.cc:1032
+#: midi_time_axis.cc:1022
 msgid "Channel Colors"
 msgstr "Kanalfarben"
 
-#: midi_time_axis.cc:1039
+#: midi_time_axis.cc:1029
 msgid "Track Color"
 msgstr "Spurfarbe"
 
-#: midi_time_axis.cc:1614 midi_time_axis.cc:1620 midi_time_axis.cc:1630
-#: midi_time_axis.cc:1636
+#: midi_time_axis.cc:1610 midi_time_axis.cc:1616 midi_time_axis.cc:1626
+#: midi_time_axis.cc:1632
 msgid "all"
 msgstr "alle"
 
-#: midi_time_axis.cc:1617 midi_time_axis.cc:1633
+#: midi_time_axis.cc:1613 midi_time_axis.cc:1629
 msgid "some"
 msgstr "einige"
 
@@ -7952,7 +8827,7 @@ msgstr "Auto-Scroll"
 msgid "Decimal"
 msgstr "Dezimal"
 
-#: midi_tracer.cc:57 rc_option_editor.cc:1355
+#: midi_tracer.cc:57 rc_option_editor.cc:1356
 msgid "Enabled"
 msgstr "Aktiviert"
 
@@ -7992,7 +8867,8 @@ msgstr "Alle fehlenden Dateien überspringen"
 msgid "Skip this file"
 msgstr "Diese Datei überspringen"
 
-#: missing_file_dialog.cc:57
+#: missing_file_dialog.cc:57 tempo_dialog.cc:135 tempo_dialog.cc:136
+#: tempo_dialog.cc:484 tempo_dialog.cc:485
 msgid "audio"
 msgstr "Audio"
 
@@ -8028,92 +8904,45 @@ msgstr "Fehlende Plugins"
 msgid "OK"
 msgstr "OK"
 
-#: mixer_actor.cc:55
-msgid "Toggle Solo on Mixer-Selected Tracks/Busses"
-msgstr "Im Mixer ausgewählte Spuren/Busse auf Solo schalten"
-
-#: mixer_actor.cc:56
-msgid "Toggle Mute on Mixer-Selected Tracks/Busses"
-msgstr "Stummschaltung der im Mixer ausgewählten Spuren/Busse ändern"
-
-#: mixer_actor.cc:57
-msgid "Toggle Rec-enable on Mixer-Selected Tracks/Busses"
-msgstr "Aufnahmebereitschaft auf im Mixer ausgewählten Spuren ändern"
-
-#: mixer_actor.cc:58
-msgid "Decrease Gain on Mixer-Selected Tracks/Busses"
-msgstr "Lautstärke im Mixer ausgewählter Spuren/Busse reduzieren"
-
-#: mixer_actor.cc:59
-msgid "Increase Gain on Mixer-Selected Tracks/Busses"
-msgstr "Lautstärke im Mixer ausgewählter Spuren/Busse erhöhen"
-
-#: mixer_actor.cc:60
-msgid "Set Gain to 0dB on Mixer-Selected Tracks/Busses"
-msgstr "Lautstärke im Mixer ausgewählter Spuren/Busse auf 0dB setzen"
-
-#: mixer_actor.cc:63
-msgid "Copy Selected Processors"
-msgstr "Ausgewählte Prozessoren kopieren"
-
-#: mixer_actor.cc:64
-msgid "Cut Selected Processors"
-msgstr "Ausgewählte Prozessoren ausschneiden"
-
-#: mixer_actor.cc:65
-msgid "Paste Selected Processors"
-msgstr "Ausgewählte Prozessoren einfügen"
-
-#: mixer_actor.cc:66
-msgid "Delete Selected Processors"
-msgstr "Ausgewählte Prozessoren löschen"
-
-#: mixer_actor.cc:67
-msgid "Select All (visible) Processors"
-msgstr "Alle (sichtbaren) Prozessoren auswählen"
-
-#: mixer_actor.cc:68
-msgid "Toggle Selected Processors"
-msgstr "Ausgewählte Prozessoren umschalten"
-
-#: mixer_actor.cc:69
-msgid "Toggle Selected Plugins"
-msgstr "Ausgewählte Plugins umschalten "
-
-#: mixer_actor.cc:70
-msgid "Deselect all strips and processors"
-msgstr "Alle Kanalzüge und Prozessoren deselektieren"
-
-#: mixer_actor.cc:72 mixer_actor.cc:73
-msgid "Scroll Mixer Window to the left"
-msgstr "Mixerfenster nach links scrollen"
-
-#: mixer_actor.cc:75
-msgid "Toggle MIDI Input Active for Mixer-Selected Tracks/Busses"
-msgstr "MIDI Eingang für im Mixer ausgewählte Spuren/Busse de/aktivieren"
-
-#: mixer_actor.cc:90
-msgid "Loaded mixer bindings from %1"
-msgstr "Mixer-Tastenkürzel aus %1 geladen"
+#: missing_plugin_dialog.cc:42
+msgid ""
+"This session contains the following plugins that cannot be found on this "
+"system:\n"
+"\n"
+msgstr ""
+"Folgende Plugins dieses Projekts können auf diesem System nicht gefunden "
+"werden:\n"
+"\n"
 
-#: mixer_actor.cc:92
-msgid "Could not find mixer.bindings in search path %1"
-msgstr "Konnte mixer.bindings im Suchpfad %1 nicht finden"
+#: missing_plugin_dialog.cc:48
+msgid ""
+"\n"
+"Those plugins will be replaced with inactive stubs.\n"
+"It is recommended that you install the missing plugins and re-load the "
+"session.\n"
+"(also check the blacklist, Window > Log and Preferences > Plugins)"
+msgstr ""
+"\n"
+"Diese Plugins werden durch inaktive Platzhalter ersetzt.\n"
+"Es wird empfohlen, die fehlenden Plugins zu installieren und das Projekt neu "
+"zu laden.\n"
+"(Überprüfen Sie auch die Blacklist, Fenster > Log und Globale Einstellungen "
+"> Plugins)"
 
-#: mixer_strip.cc:98 mixer_strip.cc:129
+#: mixer_strip.cc:100 mixer_strip.cc:133
 msgid "pre"
 msgstr "Pre"
 
-#: mixer_strip.cc:101 mixer_strip.cc:132 mixer_strip.cc:387
-#: mixer_strip.cc:1470 rc_option_editor.cc:2949
+#: mixer_strip.cc:104 mixer_strip.cc:136 mixer_strip.cc:397 mixer_strip.cc:1548
+#: mixer_strip.cc:1559 rc_option_editor.cc:3147
 msgid "Comments"
 msgstr "Kommentare"
 
-#: mixer_strip.cc:155
+#: mixer_strip.cc:160
 msgid "Click to toggle the width of this mixer strip."
 msgstr "Klicken Sie, um die Breite dieses Kanalzuges umzuschalten"
 
-#: mixer_strip.cc:157
+#: mixer_strip.cc:162
 msgid ""
 "\n"
 "%1-%2-click to toggle the width of all strips."
@@ -8121,298 +8950,397 @@ msgstr ""
 "\n"
 "%1-%2-Klicken Sie, um die Breite aller Kanalzüge umzuschalten."
 
-#: mixer_strip.cc:164
+#: mixer_strip.cc:171
 msgid "Hide this mixer strip"
 msgstr "Diesen Kanalzug verbergen"
 
-#: mixer_strip.cc:175
+#: mixer_strip.cc:182
 msgid "Click to select metering point"
 msgstr "Abgreifpunkt der Pegelanzeige auswählen"
 
-#: mixer_strip.cc:191
+#: mixer_strip.cc:198
 msgid "Isolate Solo"
 msgstr "Solo isolieren"
 
-#: mixer_strip.cc:199
+#: mixer_strip.cc:206
 msgid "Lock Solo Status"
 msgstr "Solostatus sperren"
 
-#: mixer_strip.cc:201 mixer_strip.cc:2113
+#: mixer_strip.cc:208 mixer_strip.cc:2225
 msgid "SoloLock|Lock"
 msgstr "Lock"
 
-#: mixer_strip.cc:202 mixer_strip.cc:2112
+#: mixer_strip.cc:209 mixer_strip.cc:2224
 msgid "Iso"
 msgstr "Iso"
 
-#: mixer_strip.cc:256
+#: mixer_strip.cc:263
 msgid "Mix group"
 msgstr "Bearbeitungsgruppe"
 
-#: mixer_strip.cc:266
+#: mixer_strip.cc:275
 msgid "Trim: "
 msgstr "Anpassen: "
 
-#: mixer_strip.cc:383 rc_option_editor.cc:2945
+#: mixer_strip.cc:393 rc_option_editor.cc:3143
 msgid "Phase Invert"
 msgstr "Phaseninvertierung"
 
-#: mixer_strip.cc:384 rc_option_editor.cc:2946
+#: mixer_strip.cc:394 rc_option_editor.cc:3144
 msgid "Record & Monitor"
 msgstr "Aufnahme & Monitor..."
 
-#: mixer_strip.cc:385 rc_option_editor.cc:2947
+#: mixer_strip.cc:395 rc_option_editor.cc:3145
 msgid "Solo Iso / Lock"
 msgstr "Solo Iso / Sperre"
 
-#: mixer_strip.cc:507
+#: mixer_strip.cc:398 rc_option_editor.cc:3148
+msgid "VCA Assigns"
+msgstr "VCA Zuweisungen"
+
+#: mixer_strip.cc:545
 msgid "Show/Hide Monitoring Section"
 msgstr "Zeige/Verstecke Monitorsektion"
 
-#: mixer_strip.cc:559
+#: mixer_strip.cc:590
 msgid "Enable/Disable MIDI input"
 msgstr "Aktiviert/Deaktiviert MIDI Input"
 
-#: mixer_strip.cc:726
+#: mixer_strip.cc:756
 msgid "Aux"
 msgstr "Aux"
 
-#: mixer_strip.cc:752
+#: mixer_strip.cc:782
 msgid "Snd"
 msgstr "Snd"
 
-#: mixer_strip.cc:823 mixer_strip.cc:926 processor_box.cc:2650
+#: mixer_strip.cc:853 mixer_strip.cc:958 processor_box.cc:3606
 msgid "Not connected to audio engine - no I/O changes are possible"
 msgstr ""
 "Nicht mit Audioengine verbunden - es sind keine Änderungen an Ein-/Ausgängen "
 "möglich"
 
-#: mixer_strip.cc:880 mixer_strip.cc:982
+#: mixer_strip.cc:911 mixer_strip.cc:1014
 msgid "Add %1 port"
 msgstr "%1-Port hinzufügen"
 
-#: mixer_strip.cc:887 mixer_strip.cc:989 monitor_section.cc:1342
+#: mixer_strip.cc:919 mixer_strip.cc:1021 monitor_section.cc:1466
+#: plugin_pin_dialog.cc:1782
 msgid "Routing Grid"
 msgstr "Verbindungsraster"
 
-#: mixer_strip.cc:1218
+#: mixer_strip.cc:1298
 msgid "MIDI "
 msgstr "MIDI"
 
-#: mixer_strip.cc:1223
+#: mixer_strip.cc:1302
 msgid "<b>INPUT</b> to %1"
 msgstr "<b>EINGANG</b> zu %1"
 
-#: mixer_strip.cc:1226 monitor_section.cc:1387
+#: mixer_strip.cc:1304 monitor_section.cc:1511
 msgid "<b>OUTPUT</b> from %1"
 msgstr "<b>AUSGANG</b> von %1"
 
-#: mixer_strip.cc:1344 monitor_section.cc:1474
+#: mixer_strip.cc:1417 monitor_section.cc:1598
 msgid "Disconnected"
 msgstr "Getrennt"
 
-#: mixer_strip.cc:1473
-msgid "*Comments*"
-msgstr "*Kommentare*"
+#: mixer_strip.cc:1544
+msgid "Click to add/edit comments"
+msgstr "Hier klicken, um einen Kommentar hinzuzufügen"
 
-#: mixer_strip.cc:1480
+#: mixer_strip.cc:1548 mixer_strip.cc:1559
 msgid "Cmt"
 msgstr "Kmt"
 
-#: mixer_strip.cc:1483
-msgid "*Cmt*"
-msgstr "*Kmt*"
-
-#: mixer_strip.cc:1489
-msgid "Click to add/edit comments"
-msgstr "Hier klicken, um einen Kommentar hinzuzufügen"
-
-#: mixer_strip.cc:1533
+#: mixer_strip.cc:1604
 msgid "Grp"
 msgstr "Grp"
 
-#: mixer_strip.cc:1536
+#: mixer_strip.cc:1607
 msgid "~G"
 msgstr "~G"
 
-#: mixer_strip.cc:1565 route_time_axis.cc:573
+#: mixer_strip.cc:1648 route_time_axis.cc:585 vca_master_strip.cc:396
 msgid "Color..."
 msgstr "Farbe..."
 
-#: mixer_strip.cc:1567 route_time_axis.cc:575
+#: mixer_strip.cc:1650 route_time_axis.cc:587
 msgid "Comments..."
 msgstr "Kommentare"
 
-#: mixer_strip.cc:1569 route_time_axis.cc:577
+#: mixer_strip.cc:1652 route_time_axis.cc:589
 msgid "Inputs..."
 msgstr "Eingänge..."
 
-#: mixer_strip.cc:1571 route_time_axis.cc:579
+#: mixer_strip.cc:1654 route_time_axis.cc:591
 msgid "Outputs..."
 msgstr "Ausgänge..."
 
-#: mixer_strip.cc:1576
+#: mixer_strip.cc:1659
 msgid "Save As Template..."
 msgstr "Als Vorlage Speichern..."
 
-#: mixer_strip.cc:1582 route_group_dialog.cc:45 route_time_axis.cc:853
+#: mixer_strip.cc:1665 route_group_dialog.cc:45 route_time_axis.cc:851
 msgid "Active"
 msgstr "Aktiv"
 
-#: mixer_strip.cc:1590
+#: mixer_strip.cc:1673 plugin_pin_dialog.cc:1011
+msgid "Strict I/O"
+msgstr "Striktes E/A"
+
+#: mixer_strip.cc:1683 plugin_ui.cc:424 processor_box.cc:3710
+msgid "Pin Connections..."
+msgstr "Pin-Verbindungen..."
+
+#: mixer_strip.cc:1687
 msgid "Adjust Latency..."
 msgstr "Latenz einstellen..."
 
-#: mixer_strip.cc:1593
+#: mixer_strip.cc:1690
 msgid "Protect Against Denormals"
 msgstr "Schütze vor Denormals"
 
-#: mixer_strip.cc:1599 route_time_axis.cc:592
-msgid "Remote Control ID..."
-msgstr "ID für Fernsteuerung..."
-
-#: mixer_strip.cc:1617 route_time_axis.cc:869
+#: mixer_strip.cc:1709 route_time_axis.cc:867
 msgid "Duplicate..."
 msgstr "Duplizieren..."
 
-#: mixer_strip.cc:1905
+#: mixer_strip.cc:2004
 msgid "Pre"
 msgstr "Pre"
 
-#: mixer_strip.cc:1909
+#: mixer_strip.cc:2008
 msgid "Post"
 msgstr "Post"
 
-#: mixer_strip.cc:1925
+#: mixer_strip.cc:2024
 msgid "Meter|In"
 msgstr "In"
 
-#: mixer_strip.cc:1929
+#: mixer_strip.cc:2028
 msgid "Meter|Pr"
 msgstr "Pr"
 
-#: mixer_strip.cc:1933
+#: mixer_strip.cc:2032
 msgid "Meter|Po"
 msgstr "Po"
 
-#: mixer_strip.cc:1937
+#: mixer_strip.cc:2036
 msgid "Meter|O"
 msgstr "O"
 
-#: mixer_strip.cc:1942
+#: mixer_strip.cc:2041
 msgid "Meter|C"
 msgstr "C"
 
-#: mixer_strip.cc:2090 route_ui.cc:181
+#: mixer_strip.cc:2202 route_ui.cc:197
 msgid "Disk"
 msgstr "Disk"
 
-#: mixer_strip.cc:2092
+#: mixer_strip.cc:2204
 msgid "Mon"
 msgstr "Mon"
 
-#: mixer_strip.cc:2105 monitor_section.cc:80
+#: mixer_strip.cc:2217 monitor_section.cc:81
 msgid "AFL"
 msgstr "AFL"
 
-#: mixer_strip.cc:2108 monitor_section.cc:81
+#: mixer_strip.cc:2220 monitor_section.cc:82
 msgid "PFL"
 msgstr "PFL"
 
-#: mixer_strip.cc:2118 meter_strip.cc:387
+#: mixer_strip.cc:2230 meter_strip.cc:385
 msgid "MonitorInput|I"
 msgstr "I"
 
-#: mixer_strip.cc:2119 meter_strip.cc:388
+#: mixer_strip.cc:2231 meter_strip.cc:386
 msgid "MonitorDisk|D"
 msgstr "D"
 
-#: mixer_strip.cc:2121
+#: mixer_strip.cc:2233
 msgid "Mon|O"
 msgstr "O"
 
-#: mixer_strip.cc:2134 meter_strip.cc:379 route_time_axis.cc:2738
+#: mixer_strip.cc:2246 meter_strip.cc:377 route_time_axis.cc:2730
+#: vca_master_strip.cc:202 vca_time_axis.cc:227
 msgid "AfterFader|A"
 msgstr "A"
 
-#: mixer_strip.cc:2137
+#: mixer_strip.cc:2249
 msgid "Prefader|P"
 msgstr "P"
 
-#: mixer_strip.cc:2142
+#: mixer_strip.cc:2254
 msgid "SoloIso|I"
 msgstr "I"
 
-#: mixer_strip.cc:2143
+#: mixer_strip.cc:2255
 msgid "SoloLock|L"
 msgstr "L"
 
-#: mixer_strip.cc:2348
+#: mixer_strip.cc:2460
 msgid "Pre Fader"
 msgstr "Pre Fader"
 
-#: mixer_strip.cc:2349
+#: mixer_strip.cc:2461
 msgid "Post Fader"
 msgstr "Post Fader"
 
-#: mixer_strip.cc:2394 meter_strip.cc:860
+#: mixer_strip.cc:2506 meter_strip.cc:858
 msgid "Change all in Group to %1"
 msgstr "Alle in Gruppe zu %1 ändern"
 
-#: mixer_strip.cc:2396 meter_strip.cc:862
+#: mixer_strip.cc:2508 meter_strip.cc:860
 msgid "Change all to %1"
 msgstr "Alle zu %1 ändern"
 
-#: mixer_strip.cc:2398 meter_strip.cc:864
+#: mixer_strip.cc:2510 meter_strip.cc:862
 msgid "Change same track-type to %1"
 msgstr "Gleichen Spurtyp zu %1 ändern"
 
-#: mixer_ui.cc:134 route_time_axis.cc:830
+#: mixer_ui.cc:152 route_time_axis.cc:828
 msgid "Group"
 msgstr "Gruppe"
 
-#: mixer_ui.cc:199
+#: mixer_ui.cc:221
 msgid "Favorite Plugins"
 msgstr "Plugin-Favoriten"
 
-#: mixer_ui.cc:1289
+#: mixer_ui.cc:627
+msgid "Error adding GUI elements for new tracks/busses %1"
+msgstr "Fehler beim Hinzufügen von GUI-Elementen für neue Spuren/Busse %1"
+
+#: mixer_ui.cc:1542
 msgid "track display list item for renamed strip not found!"
 msgstr ""
 "Konnte Bezeichnung für umbenannten Kanalzug nicht in der Spurliste finden!"
 
-#: mixer_ui.cc:1383
+#: mixer_ui.cc:1636
 msgid "-all-"
 msgstr "-alle-"
 
-#: mixer_ui.cc:2034
+#: mixer_ui.cc:2135
 msgid "Strips"
 msgstr "Kanalzüge"
 
-#: meter_strip.cc:161
+#: mixer_ui.cc:2479
+msgid "No Track/Bus is selected."
+msgstr "Kein(e) Spur/Bus selektiert"
+
+#: mixer_ui.cc:2481
+msgid "Add at the top"
+msgstr "Am Anfang hinzufügen"
+
+#: mixer_ui.cc:2483
+msgid "Add Pre-Fader"
+msgstr "Vor dem Fader hinzufügen"
+
+#: mixer_ui.cc:2485
+msgid "Add Post-Fader"
+msgstr "Nach dem Fader hinzufügen"
+
+#: mixer_ui.cc:2487
+msgid "Add at the end"
+msgstr "Am Ende hinzufügen"
+
+#: mixer_ui.cc:2493
+msgid "Remove from favorites"
+msgstr "Von Favoriten entfernen"
+
+#: mixer_ui.cc:2499
+msgid "Delete Preset"
+msgstr "Preset löschen"
+
+#: mixer_ui.cc:2739
+msgid "Toggle Solo on Mixer-Selected Tracks/Busses"
+msgstr "Im Mixer ausgewählte Spuren/Busse auf Solo schalten"
+
+#: mixer_ui.cc:2740
+msgid "Toggle Mute on Mixer-Selected Tracks/Busses"
+msgstr "Stummschaltung der im Mixer ausgewählten Spuren/Busse ändern"
+
+#: mixer_ui.cc:2741
+msgid "Toggle Rec-enable on Mixer-Selected Tracks/Busses"
+msgstr "Aufnahmebereitschaft auf im Mixer ausgewählten Spuren ändern"
+
+#: mixer_ui.cc:2742
+msgid "Decrease Gain on Mixer-Selected Tracks/Busses"
+msgstr "Lautstärke im Mixer ausgewählter Spuren/Busse reduzieren"
+
+#: mixer_ui.cc:2743
+msgid "Increase Gain on Mixer-Selected Tracks/Busses"
+msgstr "Lautstärke im Mixer ausgewählter Spuren/Busse erhöhen"
+
+#: mixer_ui.cc:2744
+msgid "Set Gain to 0dB on Mixer-Selected Tracks/Busses"
+msgstr "Lautstärke im Mixer ausgewählter Spuren/Busse auf 0dB setzen"
+
+#: mixer_ui.cc:2747
+msgid "Copy Selected Processors"
+msgstr "Ausgewählte Prozessoren kopieren"
+
+#: mixer_ui.cc:2748
+msgid "Cut Selected Processors"
+msgstr "Ausgewählte Prozessoren ausschneiden"
+
+#: mixer_ui.cc:2749
+msgid "Paste Selected Processors"
+msgstr "Ausgewählte Prozessoren einfügen"
+
+#: mixer_ui.cc:2750
+msgid "Delete Selected Processors"
+msgstr "Ausgewählte Prozessoren löschen"
+
+#: mixer_ui.cc:2751
+msgid "Select All (visible) Processors"
+msgstr "Alle (sichtbaren) Prozessoren auswählen"
+
+#: mixer_ui.cc:2752
+msgid "Toggle Selected Processors"
+msgstr "Ausgewählte Prozessoren umschalten"
+
+#: mixer_ui.cc:2753
+msgid "Toggle Selected Plugins"
+msgstr "Ausgewählte Plugins umschalten "
+
+#: mixer_ui.cc:2754
+msgid "Deselect all strips and processors"
+msgstr "Alle Kanalzüge und Prozessoren deselektieren"
+
+#: mixer_ui.cc:2756 mixer_ui.cc:2757
+msgid "Scroll Mixer Window to the left"
+msgstr "Mixerfenster nach links scrollen"
+
+#: mixer_ui.cc:2759
+msgid "Toggle MIDI Input Active for Mixer-Selected Tracks/Busses"
+msgstr "MIDI Eingang für im Mixer ausgewählte Spuren/Busse de/aktivieren"
+
+#: meter_strip.cc:160
 msgid "Reset Peak"
 msgstr "Peaks zurücksetzen"
 
-#: meter_strip.cc:382 route_time_axis.cc:2742
+#: meter_strip.cc:380 route_time_axis.cc:2734 vca_master_strip.cc:206
+#: vca_time_axis.cc:231
 msgid "PreFader|P"
 msgstr "P"
 
-#: meter_strip.cc:896
+#: meter_strip.cc:894
 msgid "Variable height"
 msgstr "Variable Höhe"
 
-#: meter_strip.cc:897
+#: meter_strip.cc:895
 msgid "Short"
 msgstr "Short"
 
-#: meter_strip.cc:898
+#: meter_strip.cc:896
 msgid "Tall"
 msgstr "Tall"
 
-#: meter_strip.cc:899
+#: meter_strip.cc:897
 msgid "Grande"
 msgstr "Grande"
 
-#: meter_strip.cc:900
+#: meter_strip.cc:898
 msgid "Venti"
 msgstr "Venti"
 
@@ -8460,23 +9388,23 @@ msgstr "K12/RMS"
 msgid "VU"
 msgstr "VU"
 
-#: monitor_section.cc:79
+#: monitor_section.cc:80
 msgid "SiP"
 msgstr "SiP"
 
-#: monitor_section.cc:108 route_group_dialog.cc:49
+#: monitor_section.cc:113 route_group_dialog.cc:49
 msgid "Soloing"
 msgstr "Soloing"
 
-#: monitor_section.cc:112
+#: monitor_section.cc:117
 msgid "Isolated"
 msgstr "Isoliert"
 
-#: monitor_section.cc:116
+#: monitor_section.cc:121
 msgid "Auditioning"
 msgstr "Vorhören"
 
-#: monitor_section.cc:127
+#: monitor_section.cc:132
 msgid ""
 "When active, something is solo-isolated.\n"
 "Click to de-isolate everything"
@@ -8484,7 +9412,7 @@ msgstr ""
 "Wenn aktiv, ist etwas auf isoliertes Solo geschalten.\n"
 "Klick, schaltet isoliertes Solo überall aus."
 
-#: monitor_section.cc:130
+#: monitor_section.cc:135
 msgid ""
 "When active, auditioning is active.\n"
 "Click to stop the audition"
@@ -8492,32 +9420,32 @@ msgstr ""
 "Wird beim Vorhören aktiv.\n"
 "Klicken stoppt das Vorhören."
 
-#: monitor_section.cc:147
+#: monitor_section.cc:152
 msgid "Solo controls affect solo-in-place"
 msgstr "Solo-Kontrollelemente beeinflussen solo-in-place"
 
-#: monitor_section.cc:153
+#: monitor_section.cc:158
 msgid "Solo controls toggle after-fader-listen"
 msgstr "Solo-Kontrollelemente schalten AFL um"
 
-#: monitor_section.cc:159
+#: monitor_section.cc:164
 msgid "Solo controls toggle pre-fader-listen"
 msgstr "Solo-Kontrollelemente schalten PFL um"
 
-#: monitor_section.cc:165
+#: monitor_section.cc:170
 msgid "Excl. Solo"
 msgstr "Exkl. Solo"
 
-#: monitor_section.cc:167
+#: monitor_section.cc:172
 msgid "Exclusive solo means that only 1 solo is active at a time"
 msgstr ""
 "Exklusives Solo bedeutet, daß nur ein Solo zu einem Zeitpunkt aktiv ist"
 
-#: monitor_section.cc:174
+#: monitor_section.cc:179
 msgid "Solo » Mute"
 msgstr "Solo » Mute"
 
-#: monitor_section.cc:176
+#: monitor_section.cc:181
 msgid ""
 "If enabled, solo will override mute\n"
 "(a soloed & muted track or bus will be audible)"
@@ -8525,32 +9453,40 @@ msgstr ""
 "Wenn aktiviert, hat Solo Priorität über Mute\n"
 "(eine Spur mit aktiviertem Mute & Solo ist hörbar)"
 
-#: monitor_section.cc:194
+#: monitor_section.cc:189
+msgid "Processors"
+msgstr "Prozessoren"
+
+#: monitor_section.cc:191
+msgid "Allow one to add monitor effect processors"
+msgstr "Effektprozessoren in der Monitorsektion erlauben"
+
+#: monitor_section.cc:206
 msgid "Gain increase for soloed signals (0dB is normal)"
 msgstr "Erhöhung der Lautstärke für Solosignale (0dB ist üblich)"
 
-#: monitor_section.cc:199 monitor_section.cc:216 monitor_section.cc:234
-#: monitor_section.cc:281
+#: monitor_section.cc:210 monitor_section.cc:227 monitor_section.cc:244
+#: monitor_section.cc:289
 msgid "0 dB"
 msgstr "0 dB"
 
-#: monitor_section.cc:200
+#: monitor_section.cc:211
 msgid "3 dB"
 msgstr "3 dB"
 
-#: monitor_section.cc:201
+#: monitor_section.cc:212
 msgid "6 dB"
 msgstr "6 dB"
 
-#: monitor_section.cc:202
+#: monitor_section.cc:213
 msgid "10 dB"
 msgstr "10 dB"
 
-#: monitor_section.cc:204
+#: monitor_section.cc:215
 msgid "Solo Boost"
 msgstr "Solo Boost"
 
-#: monitor_section.cc:211
+#: monitor_section.cc:222
 msgid ""
 "Gain reduction non-soloed signals\n"
 "A value above -inf dB causes \"solo-in-front\""
@@ -8558,99 +9494,103 @@ msgstr ""
 "Reduzierung der Lautstärke für Signale, die nicht Solo geschalten sind.\n"
 "Ein Wert über -inf dB bedeutet \"solo-in-front\""
 
-#: monitor_section.cc:217 monitor_section.cc:236 monitor_section.cc:283
+#: monitor_section.cc:228 monitor_section.cc:246 monitor_section.cc:291
 msgid "-6 dB"
 msgstr "-6 dB"
 
-#: monitor_section.cc:218 monitor_section.cc:237 monitor_section.cc:284
+#: monitor_section.cc:229 monitor_section.cc:247 monitor_section.cc:292
 msgid "-12 dB"
 msgstr "-12 dB"
 
-#: monitor_section.cc:219 monitor_section.cc:238 monitor_section.cc:285
+#: monitor_section.cc:230 monitor_section.cc:248 monitor_section.cc:293
 msgid "-20 dB"
 msgstr "-20 dB"
 
-#: monitor_section.cc:220
+#: monitor_section.cc:231
 msgid "OFF"
 msgstr "OFF"
 
-#: monitor_section.cc:222
+#: monitor_section.cc:233
 msgid "SiP Cut"
 msgstr "SiP Cut"
 
-#: monitor_section.cc:229
+#: monitor_section.cc:240
 msgid "Gain reduction to use when dimming monitor outputs"
 msgstr "Lautstärkereduzierung beim Abschwächen der Monitorausgänge"
 
-#: monitor_section.cc:235 monitor_section.cc:282
+#: monitor_section.cc:245 monitor_section.cc:290
 msgid "-3 dB"
 msgstr "-3 dB"
 
-#: monitor_section.cc:240 monitor_section.cc:255 monitor_section.cc:317
+#: monitor_section.cc:250 monitor_section.cc:264 monitor_section.cc:325
 msgid "Dim"
 msgstr "Dim"
 
-#: monitor_section.cc:286
+#: monitor_section.cc:294
 msgid "-30 dB"
 msgstr "-30 dB"
 
-#: monitor_section.cc:325
+#: monitor_section.cc:333
 msgid "Inv"
 msgstr "Inv"
 
-#: monitor_section.cc:387
+#: monitor_section.cc:399 port_group.cc:552
 msgid "Monitor"
 msgstr "Monitor"
 
-#: monitor_section.cc:825
+#: monitor_section.cc:897
 msgid "Switch monitor to mono"
 msgstr "Monitor auf Mono schalten"
 
-#: monitor_section.cc:828
+#: monitor_section.cc:900
 msgid "Cut monitor"
 msgstr "Monitor stummschalten"
 
-#: monitor_section.cc:831
+#: monitor_section.cc:903
 msgid "Dim monitor"
 msgstr "Monitor abschwächen"
 
-#: monitor_section.cc:834
+#: monitor_section.cc:906
 msgid "Toggle exclusive solo mode"
 msgstr "Exklusives Solo umschalten"
 
-#: monitor_section.cc:840
+#: monitor_section.cc:912
 msgid "Toggle mute overrides solo mode"
 msgstr "Mute-Status hat höhere Priorität als Solo-Modus"
 
-#: monitor_section.cc:852
+#: monitor_section.cc:921
 msgid "Cut monitor channel %1"
 msgstr "Monitorkanal %1 stummschalten"
 
-#: monitor_section.cc:857
+#: monitor_section.cc:926
 msgid "Dim monitor channel %1"
 msgstr "Monitorkanal %1 abschwächen"
 
-#: monitor_section.cc:862
+#: monitor_section.cc:931
 msgid "Solo monitor channel %1"
 msgstr "Monitorkanal %1 Solo"
 
-#: monitor_section.cc:867
+#: monitor_section.cc:936
 msgid "Invert monitor channel %1"
 msgstr "Invertiere Monitorkanal %1"
 
-#: monitor_section.cc:877
+#: monitor_section.cc:946
 msgid "In-place solo"
 msgstr "In-Place Solo"
 
-#: monitor_section.cc:879
+#: monitor_section.cc:948
 msgid "After Fade Listen (AFL) solo"
 msgstr "Solo nach Fader (AFL) abhören"
 
-#: monitor_section.cc:881
+#: monitor_section.cc:950
 msgid "Pre Fade Listen (PFL) solo"
 msgstr "Solo vor Fader (PFL) abhören"
 
-#: monitor_section.cc:1289
+#: monitor_section.cc:953
+msgid "Toggle Monitor Section Processor Box"
+msgstr "Prozessorbox der Monitorsektion de/aktivieren"
+
+#: monitor_section.cc:1413
 msgid "No session - no I/O changes are possible"
 msgstr "Kein Projekt - es sind keine Änderungen an Ein-/Ausgängen möglich"
 
@@ -8658,31 +9598,29 @@ msgstr "Kein Projekt - es sind keine Änderungen an Ein-/Ausgängen möglich"
 msgid "Monitor output selector"
 msgstr "Auswahl des Monitorausgangs"
 
-#: mono_panner.cc:103 stereo_panner.cc:113
+#: mono_panner.cc:105 stereo_panner.cc:115
 msgid "bypassed"
 msgstr "überbrückt"
 
-#: mono_panner.cc:117
+#: mono_panner.cc:119
 #, c-format
 msgid "L:%3d R:%3d"
 msgstr "L:%3d R:%3d"
 
-#: mono_panner.cc:201 panner2d.cc:276 stereo_panner.cc:250
-#: stereo_panner.cc:273
+#: mono_panner.cc:203 panner2d.cc:276 stereo_panner.cc:252 stereo_panner.cc:275
 msgid "Panner|L"
 msgstr "L"
 
-#: mono_panner.cc:218 panner2d.cc:277 stereo_panner.cc:248
-#: stereo_panner.cc:275
+#: mono_panner.cc:220 panner2d.cc:277 stereo_panner.cc:250 stereo_panner.cc:277
 msgid "Panner|R"
 msgstr "R"
 
-#: mono_panner_editor.cc:33
+#: mono_panner_editor.cc:35
 msgid "Mono Panner"
 msgstr "Mono Panner"
 
-#: mono_panner_editor.cc:44 mono_panner_editor.cc:49
-#: stereo_panner_editor.cc:46 stereo_panner_editor.cc:51
+#: mono_panner_editor.cc:46 mono_panner_editor.cc:51 stereo_panner_editor.cc:48
+#: stereo_panner_editor.cc:53
 msgid "%"
 msgstr "%"
 
@@ -8760,10 +9698,6 @@ msgstr ""
 "passieren. Die weitere Entwicklung hängt allerdings von einem stabilen\n"
 "und verlässlichen Einkommen ab. Danke, dass Sie Ardour verwenden!"
 
-#: new_plugin_preset_dialog.cc:29
-msgid "New Preset"
-msgstr "Neues Preset"
-
 #: new_plugin_preset_dialog.cc:30
 msgid "Replace existing preset with this name"
 msgstr "Ersetze vorhandenes Preset mit diesem Namen"
@@ -8772,6 +9706,10 @@ msgstr "Ersetze vorhandenes Preset mit diesem Namen"
 msgid "Name of new preset"
 msgstr "Name für neues Preset"
 
+#: new_plugin_preset_dialog.cc:44
+msgid "New Favorite Only"
+msgstr "Nur neuer Favorit"
+
 #: normalize_dialog.cc:34
 msgid "Normalize regions"
 msgstr "Regionen normalisieren"
@@ -8780,9 +9718,9 @@ msgstr "Regionen normalisieren"
 msgid "Normalize region"
 msgstr "Region normalisieren"
 
-#: normalize_dialog.cc:49 strip_silence_dialog.cc:67
-msgid "dbFS"
-msgstr "dbFS"
+#: normalize_dialog.cc:42
+msgid "Normalize to:"
+msgstr "Normalisieren auf:"
 
 #: normalize_dialog.cc:56
 msgid "Normalize each region using its own peak value"
@@ -8908,13 +9846,13 @@ msgstr "  -C, --curvetest filename    Curve algorithm debugger\n"
 #: opts.cc:82
 msgid "  -k, --keybindings filename  Name of key bindings to load\n"
 msgstr ""
-"  -k, --keybindings dateiname       Dateiname für die Tastaturbelegungen"
+"  -k, --keybindings dateiname       Dateiname für die Tastaturbelegungen\n"
 
 #: panner2d.cc:896
 msgid "Panner (2D)"
 msgstr "Panner (2D)"
 
-#: panner2d.cc:898 panner_ui.cc:402 plugin_ui.cc:458
+#: panner2d.cc:898 panner_ui.cc:402 plugin_ui.cc:465
 msgid "Bypass"
 msgstr "Bypass"
 
@@ -8970,39 +9908,161 @@ msgstr "nicht zugewiesen"
 msgid "Imported"
 msgstr "Importierte"
 
-#: plugin_eq_gui.cc:83 plugin_eq_gui.cc:107
+#: plugin_eq_gui.cc:93 plugin_eq_gui.cc:117
 msgid "dB scale"
 msgstr "dB Skala"
 
-#: plugin_eq_gui.cc:114
+#: plugin_eq_gui.cc:124
 msgid "Show phase"
 msgstr "Zeige Phase"
 
-#: plugin_selector.cc:54 plugin_selector.cc:304
+#: plugin_pin_dialog.cc:55
+msgid "Manual Config"
+msgstr "Manuelle Konfiguration"
+
+#: plugin_pin_dialog.cc:56
+msgid "Sidechain"
+msgstr "Sidechain"
+
+#: plugin_pin_dialog.cc:57 plugin_pin_dialog.cc:59 plugin_pin_dialog.cc:61
+#: plugin_pin_dialog.cc:63 plugin_pin_dialog.cc:65 step_entry.cc:81
+#: step_entry.cc:84
+msgid "+"
+msgstr "+"
+
+#: plugin_pin_dialog.cc:58 plugin_pin_dialog.cc:60 plugin_pin_dialog.cc:62
+#: plugin_pin_dialog.cc:64 plugin_pin_dialog.cc:66
+msgid "-"
+msgstr "-"
+
+#: plugin_pin_dialog.cc:148
+msgid "Audio Input Pins"
+msgstr "Audio-Eingangspins"
+
+#: plugin_pin_dialog.cc:157
+msgid "MIDI Input Pins"
+msgstr "MIDI Eingangspins"
+
+#: plugin_pin_dialog.cc:166
+msgid "Instances"
+msgstr "zences"
+
+#: plugin_pin_dialog.cc:176
+msgid "Audio Out"
+msgstr "Audio Ausgang"
+
+#: plugin_pin_dialog.cc:185
+msgid "MIDI Out"
+msgstr "MIDI Ausgang"
+
+#: plugin_pin_dialog.cc:192
+msgid "Output Presets"
+msgstr "Ausgangspresets"
+
+#: plugin_pin_dialog.cc:208
+msgid "Add Sidechain Input"
+msgstr "Sidechain-Eingang hinzufügen"
+
+#: plugin_pin_dialog.cc:478 plugin_pin_dialog.cc:482 plugin_pin_dialog.cc:486
+#: plugin_setup_dialog.cc:115 plugin_setup_dialog.cc:199
+msgid "Automatic"
+msgstr "Automatisch"
+
+#: plugin_pin_dialog.cc:515 plugin_setup_dialog.cc:208
+msgid "%1 Channel"
+msgid_plural "%1 Channels"
+msgstr[0] "%1 Kanal"
+msgstr[1] "%1 Kanäle"
+
+#: plugin_pin_dialog.cc:641 processor_box.cc:224
+msgid "Send"
+msgstr "Send"
+
+#: plugin_pin_dialog.cc:997
+msgid "Latency %1 spl%2 %3"
+msgstr "Latenz %1 spl%2 %3"
+
+#: plugin_pin_dialog.cc:997 plugin_pin_dialog.cc:1001
+msgid "no-inplace"
+msgstr "kein-inplace"
+
+#: plugin_pin_dialog.cc:999
+msgid "Latency %1 spl"
+msgstr "Latenz %1 spl"
+
+#: plugin_pin_dialog.cc:1055
+msgid "Instance #%1"
+msgstr "Instanz #%1"
+
+#: plugin_pin_dialog.cc:1700 processor_box.cc:2520
+msgid "Cannot set up new send: %1"
+msgstr "Kann keinen neuen Send erstellen: %1"
+
+#: plugin_pin_dialog.cc:1707
+msgid "SC %1 (%2)"
+msgstr "SC %1 (%2)"
+
+#: plugin_pin_dialog.cc:1963 plugin_pin_dialog.cc:1971
+msgid "Pin Configuration: %1"
+msgstr "Pin Konfiguration: %1"
+
+#: plugin_setup_dialog.cc:30
+msgid "Plugin Setup"
+msgstr "Plugin-Einrichtung"
+
+#: plugin_setup_dialog.cc:33
+msgid "Copy I/O Map"
+msgstr "Kopiere E/A-Zuordnung"
+
+#: plugin_setup_dialog.cc:50
+msgid "An Instrument plugin is already present."
+msgstr "Es ist bereits ein Instrumentenplugin vorhanden."
+
+#: plugin_setup_dialog.cc:54
+msgid "Replace"
+msgstr "Ersetzen"
+
+#: plugin_setup_dialog.cc:60
+msgid "with"
+msgstr "mit"
+
+#: plugin_setup_dialog.cc:70
+msgid "I/O Pin Mapping"
+msgstr "E/A-Pin Zuordnung"
+
+#: plugin_setup_dialog.cc:79
+msgid "Configure Plugin '%1'"
+msgstr "Konfiguriere Plugin '%1'"
+
+#: plugin_setup_dialog.cc:90
+msgid "Output Configuration"
+msgstr "Ausgangskonfiguration"
+
+#: plugin_selector.cc:54 plugin_selector.cc:322
 msgid "Name contains"
 msgstr "Name enthält"
 
-#: plugin_selector.cc:55 plugin_selector.cc:308
+#: plugin_selector.cc:55 plugin_selector.cc:326
 msgid "Type contains"
 msgstr "Typ enthält"
 
-#: plugin_selector.cc:56 plugin_selector.cc:306
+#: plugin_selector.cc:56 plugin_selector.cc:324
 msgid "Category contains"
 msgstr "Kategorie enthält"
 
-#: plugin_selector.cc:57 plugin_selector.cc:328
+#: plugin_selector.cc:57 plugin_selector.cc:349
 msgid "Author contains"
 msgstr "Autor enthält"
 
-#: plugin_selector.cc:58 plugin_selector.cc:330
+#: plugin_selector.cc:58 plugin_selector.cc:351
 msgid "Library contains"
 msgstr "Katalog enthält"
 
-#: plugin_selector.cc:59 plugin_selector.cc:260 plugin_selector.cc:606
+#: plugin_selector.cc:59 plugin_selector.cc:278 plugin_selector.cc:639
 msgid "Favorites only"
 msgstr "nur Favoriten"
 
-#: plugin_selector.cc:60 plugin_selector.cc:264 plugin_selector.cc:606
+#: plugin_selector.cc:60 plugin_selector.cc:282 plugin_selector.cc:639
 msgid "Hidden only"
 msgstr "Nur versteckte"
 
@@ -9010,100 +10070,100 @@ msgstr "Nur versteckte"
 msgid "Plugin Manager"
 msgstr "Alle Plugins ..."
 
-#: plugin_selector.cc:94
+#: plugin_selector.cc:96
 msgid "Fav"
 msgstr "Fav"
 
-#: plugin_selector.cc:96
+#: plugin_selector.cc:98
 msgid "Available Plugins"
 msgstr "Verfügbare Plugins"
 
-#: plugin_selector.cc:97
+#: plugin_selector.cc:99
 msgid "Type"
 msgstr "Typ"
 
-#: plugin_selector.cc:98
+#: plugin_selector.cc:100
 msgid "Category"
 msgstr "Kategorie"
 
-#: plugin_selector.cc:99
+#: plugin_selector.cc:101
 msgid "Creator"
 msgstr "Ersteller"
 
-#: plugin_selector.cc:100
+#: plugin_selector.cc:102
 msgid "# Audio In"
 msgstr "# Audio In"
 
-#: plugin_selector.cc:101
+#: plugin_selector.cc:103
 msgid "# Audio Out"
 msgstr "# Audio Out"
 
-#: plugin_selector.cc:102
+#: plugin_selector.cc:104
 msgid "# MIDI In"
 msgstr "# MIDI In"
 
-#: plugin_selector.cc:103
+#: plugin_selector.cc:105
 msgid "# MIDI Out"
 msgstr "# MIDI Out"
 
-#: plugin_selector.cc:125
+#: plugin_selector.cc:132
 msgid "Plugins to be connected"
 msgstr "Plugins, die verbunden werden"
 
-#: plugin_selector.cc:138
+#: plugin_selector.cc:145
 msgid "Add a plugin to the effect list"
 msgstr "Plugin zur Effektliste hinzufügen"
 
-#: plugin_selector.cc:142
+#: plugin_selector.cc:149
 msgid "Remove a plugin from the effect list"
 msgstr "Plugin aus der Effektliste entfernen"
 
-#: plugin_selector.cc:154
+#: plugin_selector.cc:161
 msgid "Show Hidden"
 msgstr "Verborgene anzeigen"
 
-#: plugin_selector.cc:156
+#: plugin_selector.cc:163
 msgid "Include hidden plugins in list."
 msgstr "Verborhene Plugins in Liste einbeziehen."
 
-#: plugin_selector.cc:159
+#: plugin_selector.cc:166
 msgid "Instruments"
 msgstr "Instrumente"
 
-#: plugin_selector.cc:161
+#: plugin_selector.cc:168
 msgid "Cycle display of instrument plugins (if any)."
 msgstr "Anzeige von Instrumenten-Plugins umschalten (falls vorhanden)."
 
-#: plugin_selector.cc:164
+#: plugin_selector.cc:171
 msgid "Analyzers"
 msgstr "Analyzer"
 
-#: plugin_selector.cc:166
+#: plugin_selector.cc:173
 msgid "Cycle display of analysis plugins (if any)."
 msgstr "Anzeige von Analyse-Plugins umschalten (falls vorhanden)."
 
-#: plugin_selector.cc:169
+#: plugin_selector.cc:176
 msgid "Utils"
 msgstr "Hilfsmittel"
 
-#: plugin_selector.cc:171
+#: plugin_selector.cc:178
 msgid "Cycle display of utility plugins (if any)."
 msgstr "Anzeige von Utility-Plugins umschalten (falls vorhanden)."
 
-#: plugin_selector.cc:201
+#: plugin_selector.cc:208
 msgid "Filter"
 msgstr "Filter"
 
-#: plugin_selector.cc:214
+#: plugin_selector.cc:232
 msgid "Insert Plugin(s)"
 msgstr "Plugin(s) einfügen"
 
-#: plugin_selector.cc:412 plugin_selector.cc:413 plugin_selector.cc:414
-#: plugin_selector.cc:415
+#: plugin_selector.cc:439 plugin_selector.cc:440 plugin_selector.cc:441
+#: plugin_selector.cc:442
 msgid "variable"
 msgstr "variabel"
 
-#: plugin_selector.cc:565
+#: plugin_selector.cc:598
 msgid ""
 "The plugin \"%1\" could not be loaded\n"
 "\n"
@@ -9113,27 +10173,27 @@ msgstr ""
 "\n"
 "Im Logfenster befinden sich möglicherweise mehr Informationen"
 
-#: plugin_selector.cc:723
+#: plugin_selector.cc:757
 msgid "Favorites"
 msgstr "Favoriten"
 
-#: plugin_selector.cc:725
+#: plugin_selector.cc:759
 msgid "Plugin Manager..."
 msgstr "Plugin Manager..."
 
-#: plugin_selector.cc:729
+#: plugin_selector.cc:763
 msgid "By Creator"
 msgstr "Nach Urheber"
 
-#: plugin_selector.cc:732
+#: plugin_selector.cc:766
 msgid "By Category"
 msgstr "Nach Kategorie"
 
-#: plugin_ui.cc:113
+#: plugin_ui.cc:115
 msgid "Eh? LADSPA plugins don't have editors!"
 msgstr "Merkwürdig... LADSPA-Plugins sollten kein GUI haben!"
 
-#: plugin_ui.cc:122 plugin_ui.cc:227
+#: plugin_ui.cc:124 plugin_ui.cc:229
 msgid ""
 "unknown type of editor-supplying plugin (note: no VST support in this "
 "version of %1)"
@@ -9141,11 +10201,11 @@ msgstr ""
 "Unbekannter Plugintyp mit eigenem Editor (Hinweis: diese %1-Version "
 "unterstützt keine VST-Plugins)"
 
-#: plugin_ui.cc:125
+#: plugin_ui.cc:127
 msgid "unknown type of editor-supplying plugin"
 msgstr "Unbekannter Plugintyp"
 
-#: plugin_ui.cc:257
+#: plugin_ui.cc:259
 msgid ""
 "unknown type of editor-supplying plugin (note: no linuxVST support in this "
 "version of %1)"
@@ -9153,23 +10213,23 @@ msgstr ""
 "Unbekannter Plugintyp mit eigenem Editor (Hinweis: diese %1-Version "
 "unterstützt keine linuxVST-Plugins)"
 
-#: plugin_ui.cc:329
+#: plugin_ui.cc:331
 msgid "create_lv2_editor called on non-LV2 plugin"
 msgstr "create_lv2_editor auf nicht-LV2-Plugin angewandt"
 
-#: plugin_ui.cc:418
+#: plugin_ui.cc:419
 msgid "Add"
 msgstr "Hinzufügen"
 
-#: plugin_ui.cc:423
+#: plugin_ui.cc:425
 msgid "Description"
 msgstr "Beschreibung"
 
-#: plugin_ui.cc:424
+#: plugin_ui.cc:426
 msgid "Plugin analysis"
 msgstr "Pluginanalyse"
 
-#: plugin_ui.cc:431
+#: plugin_ui.cc:433
 msgid ""
 "Presets (if any) for this plugin\n"
 "(Both factory and user-created)"
@@ -9177,30 +10237,34 @@ msgstr ""
 "Presets (falls existent) für dieses Plugin\n"
 "(Hersteller- und Benutzerpresets)"
 
-#: plugin_ui.cc:432
+#: plugin_ui.cc:434
 msgid "Save a new preset"
 msgstr "Neues Preset speichern"
 
-#: plugin_ui.cc:433
+#: plugin_ui.cc:435
 msgid "Save the current preset"
 msgstr "Momentanes Preset speichern"
 
-#: plugin_ui.cc:434
+#: plugin_ui.cc:436
 msgid "Delete the current preset"
 msgstr "Lösche das aktuelle Preset"
 
-#: plugin_ui.cc:435
+#: plugin_ui.cc:437
 msgid ""
 "Reset parameters to default (if no parameters are in automation play mode)"
 msgstr ""
 "Parameter auf Vorgabewert zurücksetzen (falls keine Parameter im Automations-"
 "Wiedergabemodus sind)"
 
-#: plugin_ui.cc:436
+#: plugin_ui.cc:439
+msgid "Show Plugin Pin Management Dialog"
+msgstr "Plugin Pin-Management Dialog anzeigen"
+
+#: plugin_ui.cc:441
 msgid "Disable signal processing by the plugin"
 msgstr "Deaktiviere die Signalverarbeitung des Plugins"
 
-#: plugin_ui.cc:473 plugin_ui.cc:685
+#: plugin_ui.cc:480 plugin_ui.cc:699
 msgid ""
 "Click to allow the plugin to receive keyboard events that %1 would normally "
 "use as a shortcut"
@@ -9208,25 +10272,25 @@ msgstr ""
 "Klicke, damit das Plugin Tastaturbefehle erhält, die %1 sonst als "
 "Tastenkürzel verwenden würde"
 
-#: plugin_ui.cc:474
+#: plugin_ui.cc:481
 msgid "Click to enable/disable this plugin"
 msgstr "Klicke, um dieses Plugin zu ein/auszuschalten"
 
-#: plugin_ui.cc:517
+#: plugin_ui.cc:524
 msgid "latency (%1 sample)"
 msgid_plural "latency (%1 samples)"
 msgstr[0] "Latenz (%1 Sample)"
 msgstr[1] "Latenz (%1 Samples)"
 
-#: plugin_ui.cc:519
+#: plugin_ui.cc:526
 msgid "latency (%1 ms)"
 msgstr "Latenz (%1 ms)"
 
-#: plugin_ui.cc:530
+#: plugin_ui.cc:537
 msgid "Edit Latency"
 msgstr "Latenz bearbeiten"
 
-#: plugin_ui.cc:576
+#: plugin_ui.cc:583
 msgid ""
 "Plugin presets are not supported in this build of %1. Consider paying for a "
 "full version"
@@ -9234,7 +10298,7 @@ msgstr ""
 "Pluginpresets werden in diesem Version von %1 nicht unterstützt. Erwägen "
 "Sie, für eine Vollversion zu zahlen"
 
-#: plugin_ui.cc:584
+#: plugin_ui.cc:591
 msgid ""
 "Plugin presets are not supported in this build, see the Log window for more "
 "information."
@@ -9242,11 +10306,15 @@ msgstr ""
 "Pluginpresets werden von dieser Ausgabe des Programms nicht unterstützt, "
 "weitere Informationen sind im Logfenster zu finden."
 
-#: plugin_ui.cc:692
+#: plugin_ui.cc:599
+msgid "New Preset"
+msgstr "Neues Preset"
+
+#: plugin_ui.cc:706
 msgid "Click to allow normal use of %1 keyboard shortcuts"
 msgstr "Klicke, um die normale Verwendung von %1 Tastaturkürzeln zu aktivieren"
 
-#: plugin_ui.cc:789
+#: plugin_ui.cc:813
 msgid "(none)"
 msgstr "(kein)"
 
@@ -9270,63 +10338,47 @@ msgstr "%1 Sonstige"
 msgid "Other"
 msgstr "Andere"
 
-#: port_group.cc:434 port_group.cc:435
+#: port_group.cc:435 port_group.cc:436
 msgid "LTC Out"
 msgstr "LTC Out"
 
-#: port_group.cc:438 port_group.cc:439
+#: port_group.cc:439 port_group.cc:440
 msgid "LTC In"
 msgstr "LTC In"
 
-#: port_group.cc:473
+#: port_group.cc:474
 msgid "MTC in"
 msgstr "MTC in"
 
-#: port_group.cc:476
+#: port_group.cc:477
 msgid "MIDI control in"
 msgstr "MIDI control in"
 
-#: port_group.cc:479
+#: port_group.cc:480
 msgid "MIDI clock in"
 msgstr "MIDI clock in"
 
-#: port_group.cc:482
+#: port_group.cc:483
 msgid "MMC in"
 msgstr "MMC in"
 
-#: port_group.cc:486
+#: port_group.cc:487
 msgid "MTC out"
 msgstr "MTC out"
 
-#: port_group.cc:489
+#: port_group.cc:490
 msgid "MIDI control out"
 msgstr "MIDI control out"
 
-#: port_group.cc:492
+#: port_group.cc:493
 msgid "MIDI clock out"
 msgstr "MIDI clock out"
 
-#: port_group.cc:495
+#: port_group.cc:496
 msgid "MMC out"
 msgstr "MMC out"
 
-#: port_group.cc:543
-msgid ":monitor"
-msgstr ":monitor"
-
-#: port_group.cc:559
-msgid "system:"
-msgstr "system:"
-
-#: port_group.cc:560
-msgid "alsa_pcm:"
-msgstr "alsa_pcm:"
-
-#: port_group.cc:561
-msgid "alsa_midi:"
-msgstr "alsa_midi:"
-
-#: port_group.cc:566
+#: port_group.cc:579
 msgid "Scene "
 msgstr "Szene"
 
@@ -9390,43 +10442,36 @@ msgid "Flip"
 msgstr "Drehen"
 
 #: port_matrix.cc:732
-msgid ""
-"It is not possible to add a port here, as the first processor in the track "
-"or buss cannot support the new configuration."
-msgstr ""
-"Hier kann kein Port hinzugefügt werden, da der erste Prozessor der Spur/des "
-"Busses die neue Portanzahl nicht unterstützt."
+msgid "It is not possible to add a port here."
+msgstr "Hier kann kein Port hinzugefügt werden."
 
-#: port_matrix.cc:735
+#: port_matrix.cc:733
 msgid "Cannot add port"
 msgstr "Kann Port nicht hinzufügen"
 
 #: port_matrix.cc:757
+msgid "The last port cannot be removed"
+msgstr "Der letzte Port kann nicht entfernt werden"
+
+#: port_matrix.cc:760
+msgid "This port cannot be removed."
+msgstr "Dieser Port kann nicht entfernt werden."
+
+#: port_matrix.cc:765
 msgid "Port removal not allowed"
 msgstr "Entfernen des Ports nicht erlaubt"
 
-#: port_matrix.cc:758
-msgid ""
-"This port cannot be removed.\n"
-"Either the first plugin in the track or buss cannot accept\n"
-"the new number of inputs or the last plugin has more outputs."
-msgstr ""
-"Dieser Port kann nicht entfernt werden.\n"
-"Entweder kann das erste Plugin auf der Spur oder dem Bus \n"
-"die neue Anzahl an Eingängen nicht verarbeiten, oder das \n"
-"letzte Plugin hat mehr Ausgänge."
-
-#: port_matrix.cc:975
+#: port_matrix.cc:981
 #, c-format
 msgid "Remove '%s'"
 msgstr "Lösche '%s'"
 
-#: port_matrix.cc:990
+#: port_matrix.cc:996
 #, c-format
 msgid "%s all from '%s'"
 msgstr "%s alle von '%s'"
 
-#: port_matrix.cc:1056 transform_dialog.cc:62
+#: port_matrix.cc:1062 transform_dialog.cc:62
 msgid "channel"
 msgstr "Kanal"
 
@@ -9438,15 +10483,15 @@ msgstr "Es gibt keine Ports, zu denen verbunden werden kann."
 msgid "There are no %1 ports to connect."
 msgstr "Es gibt keine %1 Ports, zu denen verbunden werden kann."
 
-#: processor_box.cc:162
-msgid "Send"
-msgstr "Send"
-
-#: processor_box.cc:164
+#: processor_box.cc:226
 msgid "Return"
 msgstr "Return"
 
-#: processor_box.cc:353
+#: processor_box.cc:323
+msgid "New Favorite Preset for \"%1\""
+msgstr "Neuer Vorzugspreset für \"%1\""
+
+#: processor_box.cc:501
 msgid ""
 "\n"
 "This mono plugin has been replicated %1 times."
@@ -9454,7 +10499,7 @@ msgstr ""
 "\n"
 "Dieses Mono-Plugin wurde %1 mal repliziert."
 
-#: processor_box.cc:357
+#: processor_box.cc:505 processor_box.cc:1528
 msgid ""
 "<b>%1</b>\n"
 "Double-click to show GUI.\n"
@@ -9464,7 +10509,7 @@ msgstr ""
 "Doppelklick, um GUI zu zeigen.\n"
 "%2+Doppelklick , um einfaches GUI zu zeigen.%3"
 
-#: processor_box.cc:360
+#: processor_box.cc:508 processor_box.cc:1531
 msgid ""
 "<b>%1</b>\n"
 "Double-click to show generic GUI.%2"
@@ -9472,7 +10517,7 @@ msgstr ""
 "<b>%1</b>\n"
 "Doppelklick, um einfaches GUI zu zeigen.%2"
 
-#: processor_box.cc:366
+#: processor_box.cc:514
 msgid ""
 "<b>%1</b>\n"
 "The Plugin is not available on this system\n"
@@ -9482,32 +10527,36 @@ msgstr ""
 "Das Plugin ist auf diesem System nicht verfügbar\n"
 "und wurde durch einen Platzhalter ersetzt."
 
-#: processor_box.cc:409
+#: processor_box.cc:600
 #, c-format
 msgid "(%1x1) "
 msgstr "(%1x1) "
 
-#: processor_box.cc:485
+#: processor_box.cc:695
+msgid "Inline Display"
+msgstr "Inline Anzeige"
+
+#: processor_box.cc:703
 msgid "Show All Controls"
 msgstr "Alle Regler zeigen"
 
-#: processor_box.cc:489
+#: processor_box.cc:707
 msgid "Hide All Controls"
 msgstr "Alle Regler verbergen"
 
-#: processor_box.cc:523
+#: processor_box.cc:752
 msgid "Link panner controls"
 msgstr "Panner-Elemente verknüpfen"
 
-#: processor_box.cc:630
+#: processor_box.cc:859
 msgid "on"
 msgstr "an"
 
-#: processor_box.cc:630 rc_option_editor.cc:2978 rc_option_editor.cc:2992
+#: processor_box.cc:859 rc_option_editor.cc:3185 rc_option_editor.cc:3199
 msgid "off"
 msgstr "Aus"
 
-#: processor_box.cc:1100
+#: processor_box.cc:1819
 msgid ""
 "Right-click to add/remove/edit\n"
 "plugins,inserts,sends and more"
@@ -9515,25 +10564,25 @@ msgstr ""
 "Rechtsklick, um Plugins, Inserts, Sends etc.\n"
 "hinzuzufügen/zu editieren/zu löschen"
 
-#: processor_box.cc:1202
+#: processor_box.cc:1968
 msgid ""
-"Adding the given processor(s) failed probably,\n"
-"because the I/O configuration of the plugins could\n"
+"Processor Drag/Drop failed. Probably because\n"
+"the I/O configuration of the plugins could\n"
 "not match the configuration of this track."
 msgstr ""
-"Das Hinzufügen des gegebenen Prozessors ist vermutlich misslungen,\n"
-"da die E/A-Konfiguration der Plugins nicht der Konfiguration dieser \n"
-"Spur angepasst werden konnte."
+"Drag/drop des Prozessors gescheitert. Vermutlich\n"
+"weil die E/A Konfiguration der Plugins nicht mit der\n"
+"dieser Spur übereinstimmt."
 
-#: processor_box.cc:1669 processor_box.cc:2055
+#: processor_box.cc:2455 processor_box.cc:2998
 msgid "Plugin Incompatibility"
 msgstr "Plugin-Inkompatibilität"
 
-#: processor_box.cc:1672
+#: processor_box.cc:2458
 msgid "You attempted to add the plugin \"%1\" in slot %2.\n"
 msgstr "Sie haben versucht, das Plugin \"%1\" im Einschub %2 hinzuzufügen.\n"
 
-#: processor_box.cc:1678
+#: processor_box.cc:2464
 msgid ""
 "\n"
 "This plugin has:\n"
@@ -9541,19 +10590,19 @@ msgstr ""
 "\n"
 "Dieses Plugin hat:\n"
 
-#: processor_box.cc:1681
+#: processor_box.cc:2467
 msgid "\t%1 MIDI input\n"
 msgid_plural "\t%1 MIDI inputs\n"
 msgstr[0] "\t%1 MIDI Eingang\n"
 msgstr[1] "\t%1 MIDI Eingänge\n"
 
-#: processor_box.cc:1685
+#: processor_box.cc:2471
 msgid "\t%1 audio input\n"
 msgid_plural "\t%1 audio inputs\n"
 msgstr[0] "\t%1 Audio-Eingang\n"
 msgstr[1] "\t%1 Audio-Eingänge\n"
 
-#: processor_box.cc:1688
+#: processor_box.cc:2474
 msgid ""
 "\n"
 "but at the insertion point, there are:\n"
@@ -9561,19 +10610,19 @@ msgstr ""
 "\n"
 "aber am Einfügepunkt gibt es:\n"
 
-#: processor_box.cc:1691
+#: processor_box.cc:2477
 msgid "\t%1 MIDI channel\n"
 msgid_plural "\t%1 MIDI channels\n"
 msgstr[0] "\t%1 MIDI-Kanal\n"
 msgstr[1] "\t%1 MIDI-Kanäle\n"
 
-#: processor_box.cc:1695
+#: processor_box.cc:2481
 msgid "\t%1 audio channel\n"
 msgid_plural "\t%1 audio channels\n"
 msgstr[0] "\t%1 Audio-Kanal\n"
 msgstr[1] "\t%1 Audio-Kanäle\n"
 
-#: processor_box.cc:1698
+#: processor_box.cc:2484
 msgid ""
 "\n"
 "%1 is unable to insert this plugin here.\n"
@@ -9581,11 +10630,7 @@ msgstr ""
 "\n"
 "%1 kann dieses Plugin hier nicht einfügen.\n"
 
-#: processor_box.cc:1735
-msgid "Cannot set up new send: %1"
-msgstr "Kann keinen neuen Send erstellen: %1"
-
-#: processor_box.cc:2058
+#: processor_box.cc:3001
 msgid ""
 "You cannot reorder these plugins/sends/inserts\n"
 "in that way because the inputs and\n"
@@ -9595,21 +10640,21 @@ msgstr ""
 "nicht auf diese Weise verändern, sonst würden\n"
 "die Ein-/Ausgänge nicht mehr richtig funktionieren."
 
-#: processor_box.cc:2258
+#: processor_box.cc:3201
 msgid "Rename Processor"
 msgstr "Prozessor umbenennen"
 
-#: processor_box.cc:2289
+#: processor_box.cc:3232
 msgid "At least 100 IO objects exist with a name like %1 - name not changed"
 msgstr ""
 "Es gibt mindestens 100 E/A-Objekte mit einem Namen wie %1 - Name nicht "
 "geändert"
 
-#: processor_box.cc:2427
+#: processor_box.cc:3383
 msgid "plugin insert constructor failed"
-msgstr "Einfügen des Plugins gescheitert"
+msgstr "Einfügen des Plugins fehlgeschlagen"
 
-#: processor_box.cc:2438
+#: processor_box.cc:3394
 msgid ""
 "Copying the set of processors on the clipboard failed,\n"
 "probably because the I/O configuration of the plugins\n"
@@ -9619,7 +10664,7 @@ msgstr ""
 "kopieren, vermutlich weil die E/A Konfiguration der Plugins\n"
 "nicht mit der dieser Spur übereinstimmt."
 
-#: processor_box.cc:2484
+#: processor_box.cc:3440
 msgid ""
 "Do you really want to remove all processors from %1?\n"
 "(this cannot be undone)"
@@ -9627,15 +10672,15 @@ msgstr ""
 "Wollen Sie wirklich alle Prozessoren von %1 entfernen?\n"
 "(Dies kann nicht rückgängig gemacht werden)"
 
-#: processor_box.cc:2488 processor_box.cc:2513
+#: processor_box.cc:3444 processor_box.cc:3469
 msgid "Yes, remove them all"
 msgstr "Ja, alle löschen"
 
-#: processor_box.cc:2490 processor_box.cc:2515
+#: processor_box.cc:3446 processor_box.cc:3471
 msgid "Remove processors"
 msgstr "Prozessoren entfernen"
 
-#: processor_box.cc:2505
+#: processor_box.cc:3461
 msgid ""
 "Do you really want to remove all pre-fader processors from %1?\n"
 "(this cannot be undone)"
@@ -9643,7 +10688,7 @@ msgstr ""
 "Wollen Sie wirklich alle Pre-Fader-Prozessoren von %1 entfernen?\n"
 "(Dies kann nicht rückgängig gemacht werden)"
 
-#: processor_box.cc:2508
+#: processor_box.cc:3464
 msgid ""
 "Do you really want to remove all post-fader processors from %1?\n"
 "(this cannot be undone)"
@@ -9651,59 +10696,59 @@ msgstr ""
 "Wollen Sie wirklich alle Post-Fader-Prozessoren von %1 entfernen?\n"
 "(Dies kann nicht rückgängig gemacht werden)"
 
-#: processor_box.cc:2696
+#: processor_box.cc:3653
 msgid "New Plugin"
 msgstr "Plugin einfügen"
 
-#: processor_box.cc:2699
+#: processor_box.cc:3656
 msgid "New Insert"
 msgstr "Insert einfügen"
 
-#: processor_box.cc:2702
+#: processor_box.cc:3659
 msgid "New External Send ..."
 msgstr "Neuer externer Send..."
 
-#: processor_box.cc:2706
+#: processor_box.cc:3663
 msgid "New Aux Send ..."
 msgstr "Neuer Aux-Send..."
 
-#: processor_box.cc:2709
+#: processor_box.cc:3666
 msgid "Send Options"
 msgstr "Send Optionen"
 
-#: processor_box.cc:2711
+#: processor_box.cc:3668
 msgid "Clear (all)"
 msgstr "Leeren (alle)"
 
-#: processor_box.cc:2713
+#: processor_box.cc:3670
 msgid "Clear (pre-fader)"
 msgstr "Leeren (Pre-Fader)"
 
-#: processor_box.cc:2715
+#: processor_box.cc:3672
 msgid "Clear (post-fader)"
 msgstr "Leeren (Post-Fader)"
 
-#: processor_box.cc:2737
+#: processor_box.cc:3702
 msgid "Activate All"
 msgstr "Alle aktivieren"
 
-#: processor_box.cc:2739
+#: processor_box.cc:3704
 msgid "Deactivate All"
 msgstr "Alle deaktivieren"
 
-#: processor_box.cc:2741
+#: processor_box.cc:3706
 msgid "A/B Plugins"
 msgstr "A/B Plugins"
 
-#: processor_box.cc:2750
+#: processor_box.cc:3719
 msgid "Edit with generic controls..."
 msgstr "Mit einfachen Kontrollelementen editieren..."
 
-#: processor_box.cc:3053
+#: processor_box.cc:4051
 msgid "%1: %2 (by %3)"
 msgstr "%1: %2 (von %3)"
 
-#: processor_box.cc:3055
+#: processor_box.cc:4053
 msgid "%1 (by %2)"
 msgstr "%1 (von %2)"
 
@@ -9731,71 +10776,71 @@ msgstr "Bank"
 msgid "main grid"
 msgstr "Hauptraster"
 
-#: quantize_dialog.cc:52 quantize_dialog.cc:109
+#: quantize_dialog.cc:61 quantize_dialog.cc:118
 msgid "Quantize"
 msgstr "Quantisieren"
 
-#: quantize_dialog.cc:56
+#: quantize_dialog.cc:65
 msgid "Strength"
 msgstr "Stärke"
 
-#: quantize_dialog.cc:59
+#: quantize_dialog.cc:68
 msgid "Swing"
 msgstr "Swing"
 
-#: quantize_dialog.cc:62
+#: quantize_dialog.cc:71
 msgid "Threshold (ticks)"
 msgstr "Threshold (ticks)"
 
-#: quantize_dialog.cc:63
+#: quantize_dialog.cc:72
 msgid "Snap note start"
 msgstr "Notenanfang einrasten an"
 
-#: quantize_dialog.cc:64
+#: quantize_dialog.cc:73
 msgid "Snap note end"
 msgstr "Notenende einrasten an"
 
-#: rc_option_editor.cc:81 rc_option_editor.cc:82
+#: rc_option_editor.cc:83 rc_option_editor.cc:84 rc_option_editor.cc:1550
 msgid "Browse..."
 msgstr "Durchsuchen..."
 
-#: rc_option_editor.cc:87
+#: rc_option_editor.cc:89
 msgid "Emphasis on first beat:"
 msgstr "Betonung auf erstem Schlag:"
 
-#: rc_option_editor.cc:93
+#: rc_option_editor.cc:95
 msgid "Use default Click:"
 msgstr "Benutze voreingestellten Klick:"
 
-#: rc_option_editor.cc:99
+#: rc_option_editor.cc:101
 msgid "Click audio file:"
 msgstr "Audiodatei für Klick"
 
-#: rc_option_editor.cc:106
+#: rc_option_editor.cc:108
 msgid "Click emphasis audio file:"
 msgstr "Audiodatei für Klick-Betonung"
 
-#: rc_option_editor.cc:152
+#: rc_option_editor.cc:154
 msgid "Choose Click"
 msgstr "Click auswählen"
 
-#: rc_option_editor.cc:175
+#: rc_option_editor.cc:177
 msgid "Choose Click Emphasis"
 msgstr "Click-Betonung auswählen"
 
-#: rc_option_editor.cc:236
+#: rc_option_editor.cc:238
 msgid "Limit undo history to"
 msgstr "Limitiere Aktionsliste auf"
 
-#: rc_option_editor.cc:237
+#: rc_option_editor.cc:239
 msgid "Save undo history of"
 msgstr "Speichere Aktionsliste von"
 
-#: rc_option_editor.cc:246 rc_option_editor.cc:253
+#: rc_option_editor.cc:248 rc_option_editor.cc:255
 msgid "commands"
 msgstr "Aktionen"
 
-#: rc_option_editor.cc:376
+#: rc_option_editor.cc:378
 msgid ""
 "\n"
 "Changes to this setting will only persist after your project has been saved."
@@ -9804,148 +10849,148 @@ msgstr ""
 "Änderungen dieser Einstellung werden nur durch Speichern des Projekts "
 "dauerhaft übernommen."
 
-#: rc_option_editor.cc:387 rc_option_editor.cc:449
+#: rc_option_editor.cc:389 rc_option_editor.cc:451
 msgid "<b>Recommended Setting: %1 + button 3 (right mouse button)</b>%2"
 msgstr "<b>Empfohlene Einstellung: %1 + Taste 3 (rechte Maustaste)</b>%2"
 
-#: rc_option_editor.cc:401
+#: rc_option_editor.cc:403
 msgid "Select Keyboard layout:"
 msgstr "Tastaturlayout wählen:"
 
-#: rc_option_editor.cc:420
+#: rc_option_editor.cc:422
 msgid "When Clicking:"
 msgstr "Bei Klick:"
 
-#: rc_option_editor.cc:427
+#: rc_option_editor.cc:429
 msgid "Edit using:"
 msgstr "Bearbeiten mit:"
 
-#: rc_option_editor.cc:433 rc_option_editor.cc:463 rc_option_editor.cc:493
+#: rc_option_editor.cc:435 rc_option_editor.cc:465 rc_option_editor.cc:495
 msgid "+ button"
 msgstr "+ Maustaste"
 
-#: rc_option_editor.cc:457
+#: rc_option_editor.cc:459
 msgid "Delete using:"
 msgstr "Entfernen mit:"
 
-#: rc_option_editor.cc:479
+#: rc_option_editor.cc:481
 msgid "<b>Recommended Setting: %1 + button 1 (left mouse button)</b>%2"
 msgstr "<b>Empfohlene Einstellung: %1 + Taste 1 (linke Maustaste)</b>%2"
 
-#: rc_option_editor.cc:487
+#: rc_option_editor.cc:489
 msgid "Insert note using:"
 msgstr "Note einfügen:"
 
-#: rc_option_editor.cc:505
+#: rc_option_editor.cc:507
 msgid "When Beginning a Drag:"
 msgstr "Bei Mauszieh-Beginn:"
 
-#: rc_option_editor.cc:516 rc_option_editor.cc:543 rc_option_editor.cc:576
-#: rc_option_editor.cc:597 rc_option_editor.cc:641 rc_option_editor.cc:674
-#: rc_option_editor.cc:700 rc_option_editor.cc:728 rc_option_editor.cc:757
-#: rc_option_editor.cc:779
+#: rc_option_editor.cc:518 rc_option_editor.cc:545 rc_option_editor.cc:578
+#: rc_option_editor.cc:599 rc_option_editor.cc:643 rc_option_editor.cc:676
+#: rc_option_editor.cc:702 rc_option_editor.cc:730 rc_option_editor.cc:759
+#: rc_option_editor.cc:781
 msgid "<b>Recommended Setting: %1</b>%2"
 msgstr "<b>Empfohlene Einstellung: %1</b>%2"
 
-#: rc_option_editor.cc:530
+#: rc_option_editor.cc:532
 msgid "Copy items using:"
 msgstr "Kopiere Objekte mittels:"
 
-#: rc_option_editor.cc:557
+#: rc_option_editor.cc:559
 msgid "Constrain drag using:"
 msgstr "Beschränke Mausziehen mittels:"
 
-#: rc_option_editor.cc:565
+#: rc_option_editor.cc:567
 msgid "When Beginning a Trim:"
 msgstr "Bei Beginn einer Anpassung (Trim):"
 
-#: rc_option_editor.cc:584
+#: rc_option_editor.cc:586
 msgid "Trim contents using:"
 msgstr "Inhalte anpassen mittels:"
 
-#: rc_option_editor.cc:605
+#: rc_option_editor.cc:607
 msgid "Anchored trim using:"
 msgstr "Verankertes Anpassen mittels:"
 
-#: rc_option_editor.cc:649
+#: rc_option_editor.cc:651
 msgid "Resize notes relatively using:"
 msgstr "Relative Notenlängenänderung mittels:"
 
-#: rc_option_editor.cc:658
+#: rc_option_editor.cc:660
 msgid "While Dragging:"
 msgstr "Währens Mausziehens:"
 
-#: rc_option_editor.cc:682
+#: rc_option_editor.cc:684
 msgid "Ignore snap using:"
 msgstr "Einrasten ignorieren mittels:"
 
-#: rc_option_editor.cc:708
+#: rc_option_editor.cc:710
 msgid "Snap relatively using:"
 msgstr "Relativ Einrasten mittels:"
 
-#: rc_option_editor.cc:716
+#: rc_option_editor.cc:718
 msgid "While Trimming:"
 msgstr "Während des Anpassens:"
 
-#: rc_option_editor.cc:736
+#: rc_option_editor.cc:738
 msgid "Resize overlapped regions using:"
 msgstr "Längenänderung überlappender Regionen mittels:"
 
-#: rc_option_editor.cc:744
+#: rc_option_editor.cc:746
 msgid "While Dragging Control Points:"
 msgstr "Beim Mausziehen von Kontrollpunkten:"
 
-#: rc_option_editor.cc:765
+#: rc_option_editor.cc:767
 msgid "Fine adjust using:"
 msgstr "Feinjustierung mittels:"
 
-#: rc_option_editor.cc:787
+#: rc_option_editor.cc:789
 msgid "Push points using:"
 msgstr "Punkte \"stoßen\" mittels:"
 
-#: rc_option_editor.cc:1027
+#: rc_option_editor.cc:1029
 msgid "GUI and Font scaling:"
 msgstr "GUI- und Zeichensatzskalierung:"
 
-#: rc_option_editor.cc:1030
+#: rc_option_editor.cc:1032
 msgid "Default"
 msgstr "Voreinstellung"
 
-#: rc_option_editor.cc:1056
-msgid "Adjusting the scale require an application restart to re-layout."
+#: rc_option_editor.cc:1058
+msgid "Adjusting the scale requires an application restart to re-layout."
 msgstr ""
-"Änderungen an der Skalierung verlangen einen Neustart des Programms, um das "
-"Layout anzupassen."
+"Ein Verändern der Skalierung erfordert einen Neustart der Applikation, um "
+"das Layout neu auszurichten."
 
-#: rc_option_editor.cc:1098
+#: rc_option_editor.cc:1100
 msgid "∞"
 msgstr "∞"
 
-#: rc_option_editor.cc:1099
+#: rc_option_editor.cc:1101
 msgid "30 sec"
 msgstr "30 sec"
 
-#: rc_option_editor.cc:1100
+#: rc_option_editor.cc:1102
 msgid "1 min"
 msgstr "1 min"
 
-#: rc_option_editor.cc:1101
+#: rc_option_editor.cc:1103
 msgid "2 mins"
 msgstr "2 mins"
 
-#: rc_option_editor.cc:1102
+#: rc_option_editor.cc:1104
 msgid "3 mins"
 msgstr "3 mins"
 
-#: rc_option_editor.cc:1103
+#: rc_option_editor.cc:1105
 msgid "4 mins"
 msgstr "4 mins"
 
-#: rc_option_editor.cc:1104
+#: rc_option_editor.cc:1106
 msgid "5 mins"
 msgstr "5 mins"
 
-#: rc_option_editor.cc:1107
+#: rc_option_editor.cc:1109
 msgid ""
 "Specify the default timeout for plugin instantiation. Plugins that require "
 "more time to load will be blacklisted. A value of 0 disables the timeout."
@@ -9954,53 +10999,53 @@ msgstr ""
 "an. Plugins, die mehr Zeit benötigen, um zu laden, werden auf die schwarze "
 "Liste gesetzt. Ein Wert von 0 deaktiviert das Timeout."
 
-#: rc_option_editor.cc:1109
+#: rc_option_editor.cc:1111
 msgid "Scan Time Out:"
 msgstr "Scan-Timeout:"
 
-#: rc_option_editor.cc:1157
+#: rc_option_editor.cc:1159
 msgid "Waveform Clip Level (dBFS):"
 msgstr "Wellenform Clipping-Wert (dBFS):"
 
-#: rc_option_editor.cc:1210
+#: rc_option_editor.cc:1212
 msgid "Small sessions (4-16 tracks)"
 msgstr "Kleine Projekte (4-16 Spuren)"
 
-#: rc_option_editor.cc:1211
+#: rc_option_editor.cc:1213
 msgid "Medium sessions (16-64 tracks)"
 msgstr "Mittlere Projekte (16 - 64 Spuren)"
 
-#: rc_option_editor.cc:1212
+#: rc_option_editor.cc:1214
 msgid "Large sessions (64+ tracks)"
 msgstr "Große Projekte (64+ Spuren)"
 
-#: rc_option_editor.cc:1213
+#: rc_option_editor.cc:1215
 msgid "Custom (set by sliders below)"
 msgstr "Benutzerdefiniert (setze über untere Schieberegler)"
 
-#: rc_option_editor.cc:1217 export_video_dialog.cc:167
+#: rc_option_editor.cc:1219 export_video_dialog.cc:167
 msgid "Preset:"
 msgstr "Preset:"
 
-#: rc_option_editor.cc:1229
+#: rc_option_editor.cc:1231
 msgid "Playback (seconds of buffering):"
 msgstr "Wiedergabe (gepufferte Sekunden):"
 
-#: rc_option_editor.cc:1242
+#: rc_option_editor.cc:1244
 msgid "Recording (seconds of buffering):"
 msgstr "Aufnahme (gepufferte Sekunden):"
 
-#: rc_option_editor.cc:1320
+#: rc_option_editor.cc:1322
 msgid "programming error: unknown buffering preset string, index = %1"
 msgstr ""
 "Programmierfehler: unbekannte Zeichenkette für Puffer-Voreinstellung, index  "
 "= %1"
 
-#: rc_option_editor.cc:1352
+#: rc_option_editor.cc:1353
 msgid "Control Surface Protocol"
 msgstr "Eingabegeräteprotokoll"
 
-#: rc_option_editor.cc:1366
+#: rc_option_editor.cc:1367
 msgid ""
 "Click to edit the settings for selected protocol ( it must be ENABLED "
 "first ):"
@@ -10008,27 +11053,31 @@ msgstr ""
 "Klicken, um die Einstellungen für das gewählte Protokoll zu bearbeiten (erst "
 "muss es AKTIVIERT werden):"
 
-#: rc_option_editor.cc:1370
+#: rc_option_editor.cc:1371
 msgid "Show Protocol Settings"
 msgstr "Protokolleinstellungen anzeigen"
 
-#: rc_option_editor.cc:1493
+#: rc_option_editor.cc:1494
 msgid "Configuration"
 msgstr "Konfiguration"
 
-#: rc_option_editor.cc:1546
+#: rc_option_editor.cc:1547
 msgid "Show Video Export Info before export"
 msgstr "Zeige Video-Exportinformationen vor dem Exportieren"
 
-#: rc_option_editor.cc:1547
+#: rc_option_editor.cc:1548
 msgid "Show Video Server Startup Dialog"
 msgstr "Zeige den Videoserver-Startdialog"
 
-#: rc_option_editor.cc:1548
+#: rc_option_editor.cc:1549
 msgid "Advanced Setup (remote video server)"
 msgstr "Ausführliche Einrichtung (entfernter Videoserver)"
 
 #: rc_option_editor.cc:1556
+msgid "Video Server"
+msgstr "Video Server"
+
+#: rc_option_editor.cc:1565
 msgid ""
 "<b>When enabled</b> you can speficify a custom video-server URL and docroot. "
 "- Do not enable this option unless you know what you are doing."
@@ -10037,11 +11086,11 @@ msgstr ""
 "für den Videoserver eingeben. - Aktivieren Sie diese Option nur, wenn Sie "
 "wissen, was Sie tun."
 
-#: rc_option_editor.cc:1558
+#: rc_option_editor.cc:1567
 msgid "Video Server URL:"
 msgstr "Videoserver URL:"
 
-#: rc_option_editor.cc:1563
+#: rc_option_editor.cc:1572
 msgid ""
 "Base URL of the video-server including http prefix. This is usually 'http://"
 "hostname.example.org:1554/' and defaults to 'http://localhost:1554/' when "
@@ -10051,11 +11100,11 @@ msgstr ""
 "hostname.example.org:1554/' und ist auf 'http://localhost:1554/' "
 "voreingestellt, wenn der Videoserver lokal läuft"
 
-#: rc_option_editor.cc:1565
+#: rc_option_editor.cc:1574
 msgid "Video Folder:"
 msgstr "Videoordner:"
 
-#: rc_option_editor.cc:1570
+#: rc_option_editor.cc:1579
 msgid ""
 "Local path to the video-server document-root. Only files below this "
 "directory will be accessible by the video-server. If the server run on a "
@@ -10070,7 +11119,7 @@ msgstr ""
 "werden, falls es nicht zugänglich ist. Wird für den lokalen Videomonitor und "
 "die Dateisuche beim Öffnen/Hinzufügen einer Videodatei benutzt."
 
-#: rc_option_editor.cc:1577
+#: rc_option_editor.cc:1584
 msgid ""
 "<b>When enabled</b> an information window with details is displayed before "
 "the video-export dialog."
@@ -10078,98 +11127,131 @@ msgstr ""
 "<b>Wenn aktiviert</b> , wird vor dem Videoexport-Dialog ein "
 "Informationsfenster mit Details angezeigt."
 
-#: rc_option_editor.cc:1582
+#: rc_option_editor.cc:1589
 msgid ""
 "<b>When enabled</b> the video server is never launched automatically without "
 "confirmation"
 msgstr ""
 "<b>Wenn aktiviert</b>, wird der Videoserver nie ohne Bestätigung gestartet"
 
-#: rc_option_editor.cc:1723
+#: rc_option_editor.cc:1598
+msgid "Custom Path to Video Monitor (%1) - leave empty for default:"
+msgstr ""
+"Benutzerdefinierter Pfad zum Videomonitor (%1) - für Vorgabewert leer lassen:"
+
+#: rc_option_editor.cc:1610
+msgid ""
+"Set a custom path to the Video Monitor Executable, changing this requires a "
+"restart."
+msgstr ""
+"Benutzerdefinierter Pfad für das Videomonitor-Programm, Anderung erfordert "
+"einen Neustart."
+
+#: rc_option_editor.cc:1661
+msgid "Set Video Monitor Executable"
+msgstr "Videomonitor-Programm festlegen"
+
+#: rc_option_editor.cc:1734
+msgid "Column %1"
+msgstr "Spalte %1"
+
+#: rc_option_editor.cc:1852
 msgid "%1 Preferences"
 msgstr "%1 Einstellungen"
 
-#: rc_option_editor.cc:1734
+#: rc_option_editor.cc:1874 rc_option_editor.cc:1892 rc_option_editor.cc:1895
+#: rc_option_editor.cc:1897 rc_option_editor.cc:1899 rc_option_editor.cc:1907
+#: rc_option_editor.cc:1909 rc_option_editor.cc:1917 rc_option_editor.cc:1925
+#: rc_option_editor.cc:1932 rc_option_editor.cc:1953 rc_option_editor.cc:1955
+#: rc_option_editor.cc:1964 session_option_editor.cc:342
+#: session_option_editor.cc:344 session_option_editor.cc:365
+#: session_option_editor.cc:367 session_option_editor.cc:369
+#: session_option_editor.cc:376 session_option_editor.cc:383
+#: session_option_editor.cc:387
+msgid "Misc"
+msgstr "Allgemein"
+
+#: rc_option_editor.cc:1874
 msgid "DSP CPU Utilization"
 msgstr "DSP CPU Nutzung"
 
-#: rc_option_editor.cc:1738
+#: rc_option_editor.cc:1878
 msgid "Signal processing uses"
 msgstr "Die Signalverarbeitung verwendet"
 
-#: rc_option_editor.cc:1743
+#: rc_option_editor.cc:1883
 msgid "all but one processor"
 msgstr "Alle außer einem Prozessor"
 
-#: rc_option_editor.cc:1744
+#: rc_option_editor.cc:1884
 msgid "all available processors"
 msgstr "Alle verfügbaren Prozessoren"
 
-#: rc_option_editor.cc:1747
+#: rc_option_editor.cc:1887
 msgid "%1 processors"
 msgstr "%1 Prozessoren"
 
-#: rc_option_editor.cc:1750
+#: rc_option_editor.cc:1890
 msgid "This setting will only take effect when %1 is restarted."
 msgstr "Diese Einstellung wird erst nach einem Neustart von %1 wirksam."
 
-#: rc_option_editor.cc:1755
+#: rc_option_editor.cc:1895
 msgid "Options|Undo"
 msgstr "Undo"
 
-#: rc_option_editor.cc:1762
+#: rc_option_editor.cc:1902
 msgid "Verify removal of last capture"
 msgstr "Verwerfen der letzten Aufnahme bestätigen"
 
-#: rc_option_editor.cc:1767
+#: rc_option_editor.cc:1907
 msgid "Session Management"
 msgstr "Projektmanagement:"
 
-#: rc_option_editor.cc:1772
+#: rc_option_editor.cc:1912
 msgid "Make periodic backups of the session file"
 msgstr "Erstelle regelmäßig Backups der Projektdatei"
 
-#: rc_option_editor.cc:1780
+#: rc_option_editor.cc:1920
 msgid "Always copy imported files"
 msgstr "Importierte Dateien immer kopieren"
 
-#: rc_option_editor.cc:1787
+#: rc_option_editor.cc:1927
 msgid "Default folder for new sessions:"
 msgstr "Standardordner für neue Projekte"
 
-#: rc_option_editor.cc:1795
+#: rc_option_editor.cc:1935
 msgid "Maximum number of recent sessions"
 msgstr "Maximale Anzahl kürzlich geöffneter Projekte"
 
-#: rc_option_editor.cc:1808
+#: rc_option_editor.cc:1948
 msgid "Click gain level"
 msgstr "Lautstärke für Klick"
 
-#: rc_option_editor.cc:1813 route_time_axis.cc:269 route_time_axis.cc:833
+#: rc_option_editor.cc:1953 route_time_axis.cc:277 route_time_axis.cc:831
 msgid "Automation"
 msgstr "Automationen"
 
-#: rc_option_editor.cc:1818
+#: rc_option_editor.cc:1958
 msgid "Thinning factor (larger value => less data)"
 msgstr "Ausdünnungsfaktor (größerer Wert => weniger Daten)"
 
-#: rc_option_editor.cc:1827
+#: rc_option_editor.cc:1967
 msgid "Automation sampling interval (milliseconds)"
 msgstr "Meßintervall für Automation (Millisekunden)"
 
-#: rc_option_editor.cc:1835
+#: rc_option_editor.cc:1975
 msgid "Transport Options"
 msgstr "Transport Optionen"
 
-#: rc_option_editor.cc:1841
+#: rc_option_editor.cc:1981
 msgid "Keep record-enable engaged on stop"
 msgstr "Aufnahme bleibt nach Stopp aktiviert"
 
-#: rc_option_editor.cc:1850
+#: rc_option_editor.cc:1990
 msgid "Play loop is a transport mode"
 msgstr "Schleifenwiedergabe ist ein Transportmodus"
 
-#: rc_option_editor.cc:1855
+#: rc_option_editor.cc:1995
 msgid ""
 "<b>When enabled</b> the loop button does not start playback but forces "
 "playback to always play the loop\n"
@@ -10183,11 +11265,11 @@ msgstr ""
 "<b>Wenn deaktiviert</b>, startet die Schleifen-Schaltfläche die Wiedergabe, "
 "ein späteres \"Stop\" beendet aber die Wiedergabe als Schleife"
 
-#: rc_option_editor.cc:1861
+#: rc_option_editor.cc:2001
 msgid "Stop recording when an xrun occurs"
 msgstr "Aufnahme bei xrun stoppen"
 
-#: rc_option_editor.cc:1866
+#: rc_option_editor.cc:2006
 msgid ""
 "<b>When enabled</b> %1 will stop recording if an over- or underrun is "
 "detected by the audio engine"
@@ -10195,15 +11277,15 @@ msgstr ""
 "<b>Wenn aktiviert</b>, wird %1 Aufnahmen bei Auftreten von Over- oder "
 "Underruns  abbrechen"
 
-#: rc_option_editor.cc:1872
+#: rc_option_editor.cc:2012
 msgid "Create markers where xruns occur"
 msgstr "Bei xrun Marker erzeugen"
 
-#: rc_option_editor.cc:1881
+#: rc_option_editor.cc:2021
 msgid "Stop at the end of the session"
 msgstr "Am Ende des Projektes anhalten"
 
-#: rc_option_editor.cc:1886
+#: rc_option_editor.cc:2026
 msgid ""
 "<b>When enabled</b> if %1 is <b>not recording</b>, it will stop the "
 "transport when it reaches the current session end marker\n"
@@ -10216,11 +11298,11 @@ msgstr ""
 "\n"
 "<b>Wenn deaktiviert</b> , wird %1 am Ende des Projektes immer weiterlaufen"
 
-#: rc_option_editor.cc:1894
+#: rc_option_editor.cc:2034
 msgid "Do seamless looping (not possible when slaved to MTC, LTC etc)"
 msgstr "Nahtlose Schleifen (nicht möglich, wenn an MTC, LTC o.ä. gekoppelt)"
 
-#: rc_option_editor.cc:1899
+#: rc_option_editor.cc:2039
 msgid ""
 "<b>When enabled</b> this will loop by reading ahead and wrapping around at "
 "the loop point, preventing any need to do a transport locate at the end of "
@@ -10237,11 +11319,11 @@ msgstr ""
 "der Schleife springen, was oft einen hörbaren Klick oder kurze Verzögerung "
 "verursacht"
 
-#: rc_option_editor.cc:1907
+#: rc_option_editor.cc:2047
 msgid "Disable per-track record disarm while rolling"
 msgstr "Während der Aufnahme Aufnahmestatus einzelner Spuren sperren"
 
-#: rc_option_editor.cc:1911
+#: rc_option_editor.cc:2051
 msgid ""
 "<b>When enabled</b> this will prevent you from accidentally stopping "
 "specific tracks recording during a take"
@@ -10249,11 +11331,11 @@ msgstr ""
 "<b>Wenn aktiviert</b> , hindert Sie dies daran, während eines "
 "Aufnahmevorgangs unabsichtlich bei einzelnen Spuren die Aufnahme zu beenden"
 
-#: rc_option_editor.cc:1916
+#: rc_option_editor.cc:2056
 msgid "12dB gain reduction during fast-forward and fast-rewind"
 msgstr "Beim Spulen Pegel um 12dB absenken"
 
-#: rc_option_editor.cc:1920
+#: rc_option_editor.cc:2060
 msgid ""
 "This will reduce the unpleasant increase in perceived volume that occurs "
 "when fast-forwarding or rewinding through some kinds of audio"
@@ -10261,11 +11343,11 @@ msgstr ""
 "Dies wird die unangenehme Steigerung der wahrgenommenen Lautstärke "
 "verringern, die bei manchem Material bei Vor/Rücklauf auftritt"
 
-#: rc_option_editor.cc:1926
+#: rc_option_editor.cc:2066
 msgid "Preroll"
 msgstr "Vorlauf"
 
-#: rc_option_editor.cc:1931
+#: rc_option_editor.cc:2071
 msgid ""
 "The amount of preroll (in seconds) to apply when <b>Play with Preroll</b> is "
 "initiated.\n"
@@ -10280,43 +11362,50 @@ msgstr ""
 "Wiedergabeposition angewandt, wenn eine Region ausgewählt oder in der Länge "
 "angepasst wird."
 
-#: rc_option_editor.cc:1933
+#: rc_option_editor.cc:2073
 msgid "0 (no pre-roll)"
 msgstr "0 (kein Vorlauf)"
 
-#: rc_option_editor.cc:1934
+#: rc_option_editor.cc:2074
 msgid "0.1 second"
 msgstr "0.1 Sekunden"
 
-#: rc_option_editor.cc:1935
+#: rc_option_editor.cc:2075
 msgid "0.25 second"
 msgstr "0.25 Sekunden"
 
-#: rc_option_editor.cc:1936
+#: rc_option_editor.cc:2076
 msgid "0.5 second"
 msgstr "0.5 Sekunden"
 
-#: rc_option_editor.cc:1937
+#: rc_option_editor.cc:2077
 msgid "1.0 second"
 msgstr "1.25 Sekunden"
 
-#: rc_option_editor.cc:1938
+#: rc_option_editor.cc:2078
 msgid "2.0 seconds"
 msgstr "2.0 Sekunden"
 
-#: rc_option_editor.cc:1941
-msgid "Sync/Slave"
-msgstr "Sync/Slave"
+#: rc_option_editor.cc:2081 rc_option_editor.cc:2090 rc_option_editor.cc:2106
+#: rc_option_editor.cc:2127 rc_option_editor.cc:2145 rc_option_editor.cc:2147
+#: rc_option_editor.cc:2164 rc_option_editor.cc:2167 rc_option_editor.cc:2169
+#: rc_option_editor.cc:2197
+msgid "Transport/Sync"
+msgstr "Transport/Sync"
+
+#: rc_option_editor.cc:2081
+msgid "Synchronization and Slave Options"
+msgstr "Synchronisations- und Slave-Optionen"
 
-#: rc_option_editor.cc:1945
+#: rc_option_editor.cc:2085
 msgid "External timecode source"
 msgstr "Externe Timecode-Quelle"
 
-#: rc_option_editor.cc:1954
+#: rc_option_editor.cc:2094
 msgid "Match session video frame rate to external timecode"
 msgstr "Videoframerate des Projekts an externen Timecode anpassen"
 
-#: rc_option_editor.cc:1960
+#: rc_option_editor.cc:2100
 msgid ""
 "This option controls the value of the video frame rate <i>while chasing</i> "
 "an external timecode source.\n"
@@ -10340,12 +11429,12 @@ msgstr ""
 "und %1 wird zwischen den Standards der externen Quelle und des Projektes "
 "konvertieren."
 
-#: rc_option_editor.cc:1970
+#: rc_option_editor.cc:2110
 msgid "Sync-lock timecode to clock (disable drift compensation)"
 msgstr ""
 "Starre Synchronisation von Timecode und Uhr (unterbinde Driftkompensation)"
 
-#: rc_option_editor.cc:1976
+#: rc_option_editor.cc:2116
 msgid ""
 "<b>When enabled</b> %1 will never varispeed when slaved to external "
 "timecode. Sync Lock indicates that the selected external timecode source "
@@ -10366,11 +11455,11 @@ msgstr ""
 "<b>Wenn deaktiviert</b>, wird  %1 potentiellen Drift kompensieren, "
 "ungeachtet, ob die Timecodequellen Clock Sync teilen."
 
-#: rc_option_editor.cc:1991
+#: rc_option_editor.cc:2131
 msgid "Lock to 29.9700 fps instead of 30000/1001"
 msgstr "Fest auf 29.9700 fps statt 30000/1001"
 
-#: rc_option_editor.cc:1997
+#: rc_option_editor.cc:2137
 msgid ""
 "<b>When enabled</b> the external timecode source is assumed to use 29.97 fps "
 "instead of 30000/1001.\n"
@@ -10393,27 +11482,27 @@ msgstr ""
 "widersprechend -, da bei der Variante mit exakt 29.97 fps kein Timecode-"
 "Drift auftritt.\n"
 
-#: rc_option_editor.cc:2007
+#: rc_option_editor.cc:2147
 msgid "LTC Reader"
 msgstr "LTC-Leser"
 
-#: rc_option_editor.cc:2011
+#: rc_option_editor.cc:2151
 msgid "LTC incoming port"
 msgstr "LTC Eingangsport"
 
-#: rc_option_editor.cc:2027
+#: rc_option_editor.cc:2167
 msgid "LTC Generator"
 msgstr "LTC-Generator"
 
-#: rc_option_editor.cc:2032
+#: rc_option_editor.cc:2172
 msgid "Enable LTC generator"
 msgstr "LTC-Generator aktivieren"
 
-#: rc_option_editor.cc:2039
+#: rc_option_editor.cc:2179
 msgid "Send LTC while stopped"
 msgstr "LTC senden, während Transport stillsteht"
 
-#: rc_option_editor.cc:2045
+#: rc_option_editor.cc:2185
 msgid ""
 "<b>When enabled</b> %1 will continue to send LTC information even when the "
 "transport (playhead) is not moving"
@@ -10421,27 +11510,27 @@ msgstr ""
 "<b>Wenn aktiviert</b>, wird %1 weiterhin LTC-Information senden, sogar wenn "
 "der Transport (Positionszeiger) stillsteht"
 
-#: rc_option_editor.cc:2051
+#: rc_option_editor.cc:2191
 msgid "LTC generator level"
 msgstr "LTC-Generator-Lautstärke"
 
-#: rc_option_editor.cc:2055
+#: rc_option_editor.cc:2195
 msgid ""
-"Specify the Peak Volume of the generated LTC signal in dbFS. A good value "
-"is  0dBu ^= -18dbFS in an EBU calibrated system"
+"Specify the Peak Volume of the generated LTC signal in dBFS. A good value "
+"is  0dBu ^= -18dBFS in an EBU calibrated system"
 msgstr ""
 "Geben Sie den Spitzenwert des erzeugten LTC-Signals in dbFS an. Ein guter "
 "Wert für ein EBU-kalibriertes System ist 0dBu ^= -18dbFS"
 
-#: rc_option_editor.cc:2064
+#: rc_option_editor.cc:2204
 msgid "Make rubberband selection rectangle snap to the grid"
 msgstr "Gummiband-Auswahl an Raster ausrichten"
 
-#: rc_option_editor.cc:2071
+#: rc_option_editor.cc:2211
 msgid "Name new markers"
 msgstr "Neue Marker benennen"
 
-#: rc_option_editor.cc:2076
+#: rc_option_editor.cc:2216
 msgid ""
 "If enabled, popup a dialog when a new marker is created to allow its name to "
 "be set as it is created.\n"
@@ -10453,399 +11542,411 @@ msgstr ""
 "\n"
 "Marker können jederzeit per Rechtsklick umbenannt werden"
 
-#: rc_option_editor.cc:2082
+#: rc_option_editor.cc:2222
 msgid "Allow dragging of playhead"
 msgstr "Erlaube Ziehen des Positionszeigers"
 
-#: rc_option_editor.cc:2090
-msgid "Show meters on tracks in the editor"
-msgstr "Aktiviere Pegelanzeigen im Editor"
-
-#: rc_option_editor.cc:2098
+#: rc_option_editor.cc:2230
 msgid "Display master-meter in the toolbar"
 msgstr "Master-Pegelanzeige in der Werkzeugleiste anzeigen"
 
-#: rc_option_editor.cc:2107
+#: rc_option_editor.cc:2239
 msgid "Show zoom toolbar (if torn off)"
 msgstr "Zoom-Toolbar zeigen (falls abgelöst)"
 
-#: rc_option_editor.cc:2116
+#: rc_option_editor.cc:2247
+msgid ""
+"Always use mouse cursor position as zoom focus when zooming using mouse "
+"scroll wheel"
+msgstr ""
+"Mauszeigerposition immer als Zoom-Fokus benutzen, wenn per Mausrad gezoomt "
+"wird"
+
+#: rc_option_editor.cc:2256
 msgid "Update editor window during drags of the summary"
 msgstr ""
 "Aktualisiere das Editorfenster, während die Projektübersicht verändert wird"
 
-#: rc_option_editor.cc:2124
+#: rc_option_editor.cc:2264
 msgid "Auto-scroll editor window when dragging near its edges"
 msgstr "Bei Mausziehen nahe den Rändern das Editorfenster automatisch scrollen"
 
-#: rc_option_editor.cc:2132
+#: rc_option_editor.cc:2272
 msgid "Show gain envelopes in audio regions"
 msgstr "Zeige Lautstärkekurven in Regionen an"
 
-#: rc_option_editor.cc:2133
+#: rc_option_editor.cc:2273
 msgid "in all modes"
 msgstr "in allen Modi"
 
-#: rc_option_editor.cc:2134
+#: rc_option_editor.cc:2274
 msgid "only in Draw and Internal Edit modes"
 msgstr "nur in Zeichen- und internem Bearbeitungsmodus"
 
-#: rc_option_editor.cc:2139
+#: rc_option_editor.cc:2279
 msgid "Editor Behavior"
 msgstr "Editor-Verhalten"
 
-#: rc_option_editor.cc:2144
+#: rc_option_editor.cc:2284
 msgid "Move relevant automation when audio regions are moved"
 msgstr "Verschiebe relevante Automationen mit Region"
 
-#: rc_option_editor.cc:2151
+#: rc_option_editor.cc:2291
 msgid "Default fade shape"
 msgstr "Voreingestellte Fade-Art"
 
-#: rc_option_editor.cc:2170
+#: rc_option_editor.cc:2310
 msgid "Regions in active edit groups are edited together"
 msgstr "Regionen der aktiven Bearbeitungsgruppen werden gemeinsam bearbeitet"
 
-#: rc_option_editor.cc:2171
+#: rc_option_editor.cc:2311
 msgid "whenever they overlap in time"
 msgstr "immer, wenn sie sich auf der Zeitachse überlappen"
 
-#: rc_option_editor.cc:2172
+#: rc_option_editor.cc:2312
 msgid "only if they have identical length, position and origin"
 msgstr "nur bei identischer Länge, Position und Herkunft"
 
-#: rc_option_editor.cc:2181
+#: rc_option_editor.cc:2321
 msgid "Layering model"
 msgstr "Layering-Modell"
 
-#: rc_option_editor.cc:2186
+#: rc_option_editor.cc:2326
 msgid "later is higher"
 msgstr "später ist höher"
 
-#: rc_option_editor.cc:2187
+#: rc_option_editor.cc:2327
 msgid "manual layering"
 msgstr "manuelles Layering"
 
-#: rc_option_editor.cc:2192
+#: rc_option_editor.cc:2332
 msgid "After splitting selected regions, select"
 msgstr "Nach dem Teilen"
 
-#: rc_option_editor.cc:2197
+#: rc_option_editor.cc:2337
 msgid "no regions"
 msgstr "keine Regionen"
 
-#: rc_option_editor.cc:2200
+#: rc_option_editor.cc:2340
 msgid "newly-created regions"
 msgstr "neu erzeugte Regionen"
 
-#: rc_option_editor.cc:2204
+#: rc_option_editor.cc:2344
 msgid "existing selection and newly-created regions"
 msgstr "existierende Auswahl und neu erzeugte Regionen"
 
-#: rc_option_editor.cc:2208
+#: rc_option_editor.cc:2348 rc_option_editor.cc:2351 rc_option_editor.cc:2360
+#: rc_option_editor.cc:2378 rc_option_editor.cc:2390 rc_option_editor.cc:2392
+msgid "Editor/Waveforms"
+msgstr "Editor/Wellenformen"
+
+#: rc_option_editor.cc:2348
 msgid "Waveforms"
 msgstr "Wellenformen"
 
-#: rc_option_editor.cc:2214
+#: rc_option_editor.cc:2354
 msgid "Show waveforms in regions"
 msgstr "Zeige Wellenformen in Regionen"
 
-#: rc_option_editor.cc:2223
+#: rc_option_editor.cc:2363
 msgid "Show waveforms for audio while it is being recorded"
 msgstr "Zeige bei Aufnahmen die Wellenformen des aufgenommenen Audiomaterials"
 
-#: rc_option_editor.cc:2230
+#: rc_option_editor.cc:2370
 msgid "Waveform scale"
 msgstr "Wellenformskalierung"
 
-#: rc_option_editor.cc:2235
+#: rc_option_editor.cc:2375
 msgid "linear"
 msgstr "Linear"
 
-#: rc_option_editor.cc:2236
+#: rc_option_editor.cc:2376
 msgid "logarithmic"
 msgstr "Logarithmisch"
 
-#: rc_option_editor.cc:2242
+#: rc_option_editor.cc:2382
 msgid "Waveform shape"
 msgstr "Wellenform Anzeigeart"
 
-#: rc_option_editor.cc:2247
+#: rc_option_editor.cc:2387
 msgid "traditional"
 msgstr "Traditionell"
 
-#: rc_option_editor.cc:2248
+#: rc_option_editor.cc:2388
 msgid "rectified"
-msgstr "Rectified"
+msgstr "Rektifiziert"
 
-#: rc_option_editor.cc:2257
+#: rc_option_editor.cc:2397
 msgid "Buffering"
 msgstr "Pufferung"
 
-#: rc_option_editor.cc:2265
+#: rc_option_editor.cc:2405
 msgid "Record monitoring handled by"
 msgstr "Aufnahmemonitoring wird verwaltet von"
 
-#: rc_option_editor.cc:2271
+#: rc_option_editor.cc:2411
 msgid "via Audio Driver"
 msgstr "via Audiotreiber"
 
-#: rc_option_editor.cc:2277
+#: rc_option_editor.cc:2417
 msgid "audio hardware"
 msgstr "Audiohardware"
 
-#: rc_option_editor.cc:2284
+#: rc_option_editor.cc:2424
 msgid "Tape machine mode"
 msgstr "Bandmaschinen-Modus"
 
-#: rc_option_editor.cc:2290
+#: rc_option_editor.cc:2429
 msgid "Connection of tracks and busses"
 msgstr "Verbindung von Spuren und Bussen"
 
-#: rc_option_editor.cc:2295
+#: rc_option_editor.cc:2435
 msgid "Auto-connect master/monitor busses"
 msgstr "Master/Monitor-Busse automatisch verbinden"
 
-#: rc_option_editor.cc:2302
+#: rc_option_editor.cc:2442
 msgid "Connect track inputs"
 msgstr "Verbinde Spureingänge"
 
-#: rc_option_editor.cc:2307
+#: rc_option_editor.cc:2447
 msgid "automatically to physical inputs"
 msgstr "automatisch mit Audioeingängen"
 
-#: rc_option_editor.cc:2308 rc_option_editor.cc:2321
+#: rc_option_editor.cc:2448 rc_option_editor.cc:2461
 msgid "manually"
 msgstr "manuell"
 
-#: rc_option_editor.cc:2314
+#: rc_option_editor.cc:2454
 msgid "Connect track and bus outputs"
 msgstr "Verbinde Spur- und Busausgänge"
 
-#: rc_option_editor.cc:2319
+#: rc_option_editor.cc:2459
 msgid "automatically to physical outputs"
 msgstr "automatisch mit Audioausgängen"
 
-#: rc_option_editor.cc:2320
+#: rc_option_editor.cc:2460
 msgid "automatically to master bus"
 msgstr "automatisch mit dem Master-Bus"
 
-#: rc_option_editor.cc:2326
+#: rc_option_editor.cc:2467
+msgid "Use 'Strict-I/O' for new tracks or Busses"
+msgstr "Benutze 'striktes E/A' für neue Spuren oder Busse"
+
+#: rc_option_editor.cc:2478
 msgid "Denormals"
 msgstr "Denormals"
 
-#: rc_option_editor.cc:2331
+#: rc_option_editor.cc:2483
 msgid "Use DC bias to protect against denormals"
 msgstr "Nutze DC bias als Schutz vor Denormals"
 
-#: rc_option_editor.cc:2338
+#: rc_option_editor.cc:2490
 msgid "Processor handling"
 msgstr "Umgang des Prozessors mit Denormals"
 
-#: rc_option_editor.cc:2344
+#: rc_option_editor.cc:2496
 msgid "no processor handling"
 msgstr "nicht behandeln"
 
-#: rc_option_editor.cc:2350
+#: rc_option_editor.cc:2502
 msgid "use FlushToZero"
 msgstr "Benutze FlushToZero"
 
-#: rc_option_editor.cc:2357
+#: rc_option_editor.cc:2509
 msgid "use DenormalsAreZero"
 msgstr "Benutze DenormalsAreZero"
 
-#: rc_option_editor.cc:2364
+#: rc_option_editor.cc:2516
 msgid "use FlushToZero and DenormalsAreZero"
 msgstr "Benutze FlushToZero & DenormalsAreZero"
 
-#: rc_option_editor.cc:2380
-msgid "Silence plugins when the transport is stopped"
-msgstr "Deaktiviere Plugins, wenn der Transport gestoppt ist."
-
-#: rc_option_editor.cc:2388
-msgid "Make new plugins active"
-msgstr "Neue Plugins sind aktiv"
-
-#: rc_option_editor.cc:2398
+#: rc_option_editor.cc:2532
 msgid "Enable automatic analysis of audio"
 msgstr "Audiodaten automatisch analysieren"
 
-#: rc_option_editor.cc:2406
+#: rc_option_editor.cc:2540
 msgid "Replicate missing region channels"
 msgstr "Fehlende Kanäle in Regionen durch Kopien ersetzen"
 
-#: rc_option_editor.cc:2413 rc_option_editor.cc:2422 rc_option_editor.cc:2424
-#: rc_option_editor.cc:2432 rc_option_editor.cc:2440 rc_option_editor.cc:2448
-#: rc_option_editor.cc:2466 rc_option_editor.cc:2478 rc_option_editor.cc:2490
-#: rc_option_editor.cc:2492 rc_option_editor.cc:2494 rc_option_editor.cc:2502
-#: rc_option_editor.cc:2510 rc_option_editor.cc:2518 rc_option_editor.cc:2526
-#: rc_option_editor.cc:2528
-msgid "Solo / mute"
-msgstr "Solo / Mute"
+#: rc_option_editor.cc:2547 rc_option_editor.cc:2556 rc_option_editor.cc:2558
+#: rc_option_editor.cc:2566 rc_option_editor.cc:2574 rc_option_editor.cc:2582
+#: rc_option_editor.cc:2600 rc_option_editor.cc:2612 rc_option_editor.cc:2624
+#: rc_option_editor.cc:2626 rc_option_editor.cc:2628 rc_option_editor.cc:2636
+#: rc_option_editor.cc:2644 rc_option_editor.cc:2652 rc_option_editor.cc:2662
+#: rc_option_editor.cc:2663
+msgid "Solo & mute"
+msgstr "Solo & Mute"
 
-#: rc_option_editor.cc:2417
+#: rc_option_editor.cc:2551
 msgid "Solo controls are Listen controls"
 msgstr "Solo-Schalter arbeiten als AFL/PFL"
 
-#: rc_option_editor.cc:2427
+#: rc_option_editor.cc:2561
 msgid "Exclusive solo"
 msgstr "Exclusives Solo"
 
-#: rc_option_editor.cc:2435
+#: rc_option_editor.cc:2569
 msgid "Show solo muting"
 msgstr "Solo auf anderen Kanälen als Mute anzeigen"
 
-#: rc_option_editor.cc:2443
+#: rc_option_editor.cc:2577
 msgid "Soloing overrides muting"
 msgstr "Solo ist trotz Mute hörbar"
 
-#: rc_option_editor.cc:2451
+#: rc_option_editor.cc:2585
 msgid "Solo-in-place mute cut (dB)"
 msgstr "Solo-in-Place Mute Dämpfung (dB)"
 
-#: rc_option_editor.cc:2458
+#: rc_option_editor.cc:2592
 msgid "Listen Position"
 msgstr "Abhörpunkt"
 
-#: rc_option_editor.cc:2463
+#: rc_option_editor.cc:2597
 msgid "after-fader (AFL)"
 msgstr "After-Fader (AFL)"
 
-#: rc_option_editor.cc:2464
+#: rc_option_editor.cc:2598
 msgid "pre-fader (PFL)"
 msgstr "Pre-Fader (PFL)"
 
-#: rc_option_editor.cc:2470
+#: rc_option_editor.cc:2604
 msgid "PFL signals come from"
 msgstr "Abgreifpunkt der PFL Signale"
 
-#: rc_option_editor.cc:2475
+#: rc_option_editor.cc:2609
 msgid "before pre-fader processors"
 msgstr "Vor den Pre-Fader Prozessoren"
 
-#: rc_option_editor.cc:2476
+#: rc_option_editor.cc:2610
 msgid "pre-fader but after pre-fader processors"
 msgstr "Pre-Fader, aber nach den Prozessoren"
 
-#: rc_option_editor.cc:2482
+#: rc_option_editor.cc:2616
 msgid "AFL signals come from"
 msgstr "Abgreifpunkt der AFL Signale"
 
-#: rc_option_editor.cc:2487
+#: rc_option_editor.cc:2621
 msgid "immediately post-fader"
 msgstr "Direkt nach dem Fader"
 
-#: rc_option_editor.cc:2488
+#: rc_option_editor.cc:2622
 msgid "after post-fader processors (before pan)"
 msgstr "Nach den Post-Fader Prozessoren (vor Pan)"
 
-#: rc_option_editor.cc:2492
+#: rc_option_editor.cc:2626
 msgid "Default track / bus muting options"
 msgstr "Standardeinstellungen für Mute von Spuren / Bussen"
 
-#: rc_option_editor.cc:2497
+#: rc_option_editor.cc:2631
 msgid "Mute affects pre-fader sends"
 msgstr "Mute schaltet Pre-Fader Sends stumm"
 
-#: rc_option_editor.cc:2505
+#: rc_option_editor.cc:2639
 msgid "Mute affects post-fader sends"
 msgstr "Mute schaltet Post-Fader Sends stumm"
 
-#: rc_option_editor.cc:2513
+#: rc_option_editor.cc:2647
 msgid "Mute affects control outputs"
 msgstr "Mute schaltet Abhörausgänge stumm"
 
-#: rc_option_editor.cc:2521
+#: rc_option_editor.cc:2655
 msgid "Mute affects main outputs"
 msgstr "Mute schaltet Hauptausgänge stumm"
 
-#: rc_option_editor.cc:2526
+#: rc_option_editor.cc:2662
 msgid "Send Routing"
 msgstr "Send Routing"
 
-#: rc_option_editor.cc:2531
+#: rc_option_editor.cc:2666
 msgid "Link panners of Aux and External Sends with main panner by default"
-msgstr "Verknüpfe Aux- und External-Send-Panner mit Hauptpanner"
+msgstr "Verknüpfe standardmäßig Aux- und External-Send-Panner mit Hauptpanner"
 
-#: rc_option_editor.cc:2536
+#: rc_option_editor.cc:2672
 msgid "MIDI Preferences"
 msgstr "MIDI Einstellungen"
 
-#: rc_option_editor.cc:2541
+#: rc_option_editor.cc:2677
 msgid "MIDI read-ahead time (seconds)"
 msgstr "MIDI read-ahead Zeit (Sekunden)"
 
-#: rc_option_editor.cc:2551
+#: rc_option_editor.cc:2687
 msgid "Initial program change"
 msgstr "Erstmaliger Programmwechsel"
 
-#: rc_option_editor.cc:2560
+#: rc_option_editor.cc:2696
 msgid "Display first MIDI bank/program as 0"
 msgstr "Erste(s) MIDI Bank/Programm als 0 anzeigen"
 
-#: rc_option_editor.cc:2568
+#: rc_option_editor.cc:2704
 msgid "Never display periodic MIDI messages (MTC, MIDI Clock)"
 msgstr "Periodische MIDI Nachrichten nie anzeigen (MTC, MIDI Clock)"
 
-#: rc_option_editor.cc:2576
+#: rc_option_editor.cc:2712
 msgid "Sound MIDI notes as they are selected in the editor"
 msgstr "MIDI Noten ertönen bei Auswahl im Editor"
 
-#: rc_option_editor.cc:2584
+#: rc_option_editor.cc:2720
 msgid "Send MIDI control feedback"
 msgstr "MIDI Control Feedback senden"
 
-#: rc_option_editor.cc:2589
+#: rc_option_editor.cc:2725 rc_option_editor.cc:2727 rc_option_editor.cc:2735
+#: rc_option_editor.cc:2737 rc_option_editor.cc:2745 rc_option_editor.cc:2754
+#: rc_option_editor.cc:2756 rc_option_editor.cc:2764 rc_option_editor.cc:2772
+#: rc_option_editor.cc:2781
+msgid "MIDI/Sync"
+msgstr "MIDI/Sync"
+
+#: rc_option_editor.cc:2725
 msgid "MIDI Clock"
 msgstr "MIDI Clock"
 
-#: rc_option_editor.cc:2599
+#: rc_option_editor.cc:2735
 msgid "MIDI Time Code (MTC)"
 msgstr "MIDI Time Code (MTC)"
 
-#: rc_option_editor.cc:2604
+#: rc_option_editor.cc:2740
 msgid "Send MIDI Time Code"
 msgstr "Sende MIDI Time Code"
 
-#: rc_option_editor.cc:2612
+#: rc_option_editor.cc:2748
 msgid "Percentage either side of normal transport speed to transmit MTC"
 msgstr ""
 "Prozentzahl beiderseits der normalen Transportgeschwindigkeit, bis zu der "
 "MTC übertragen wird"
 
-#: rc_option_editor.cc:2618
+#: rc_option_editor.cc:2754
 msgid "Midi Machine Control (MMC)"
 msgstr "Midi Machine Control (MMC)"
 
-#: rc_option_editor.cc:2623
+#: rc_option_editor.cc:2759
 msgid "Obey MIDI Machine Control commands"
 msgstr "MIDI Machine Control Commands empfangen"
 
-#: rc_option_editor.cc:2631
+#: rc_option_editor.cc:2767
 msgid "Send MIDI Machine Control commands"
 msgstr "MIDI Machine Control Commands senden"
 
-#: rc_option_editor.cc:2639
+#: rc_option_editor.cc:2775
 msgid "Inbound MMC device ID"
 msgstr "ID des eingehenden MMC-Geräts"
 
-#: rc_option_editor.cc:2648
+#: rc_option_editor.cc:2784
 msgid "Outbound MMC device ID"
 msgstr "ID des ausgehenden MMC-Geräts"
 
-#: rc_option_editor.cc:2654
+#: rc_option_editor.cc:2790
 msgid "Midi Audition"
 msgstr "Midi vorhören"
 
-#: rc_option_editor.cc:2658
+#: rc_option_editor.cc:2794
 msgid "Midi Audition Synth (LV2)"
 msgstr "Midi Vorhör-Synth (LV2)"
 
-#: rc_option_editor.cc:2689 rc_option_editor.cc:2699 rc_option_editor.cc:2701
+#: rc_option_editor.cc:2825 rc_option_editor.cc:2835 rc_option_editor.cc:2837
 msgid "User interaction"
 msgstr "Benutzerinteraktion"
 
-#: rc_option_editor.cc:2692
+#: rc_option_editor.cc:2828
 msgid ""
 "Use translations of %1 messages\n"
 "   <i>(requires a restart of %1 to take effect)</i>\n"
@@ -10855,35 +11956,24 @@ msgstr ""
 "   <i>(erfordert Neustart von %1)</i>\n"
 "   <i>(falls für Ihre gewünschte Sprache verfügbar)</i>"
 
-#: rc_option_editor.cc:2699
+#: rc_option_editor.cc:2835
 msgid "Keyboard"
 msgstr "Tastatur"
 
-#: rc_option_editor.cc:2709
-msgid "Control surface remote ID"
-msgstr "Remote ID des Eingabegeräts"
-
-#: rc_option_editor.cc:2714
-msgid "assigned by user"
-msgstr "vom Benutzer festgelegt"
-
-#: rc_option_editor.cc:2715
-msgid "follows order of mixer"
-msgstr "folgt Reihenfolge im Mixer"
+#: rc_option_editor.cc:2848 rc_option_editor.cc:2890 rc_option_editor.cc:2960
+#: startup.cc:352
+msgid "Scan for Plugins"
+msgstr "Scanne nach Plugins"
 
-#: rc_option_editor.cc:2723
+#: rc_option_editor.cc:2853
 msgid "General"
 msgstr "Allgemein"
 
-#: rc_option_editor.cc:2726 startup.cc:351
-msgid "Scan for Plugins"
-msgstr "Scanne nach Plugins"
-
-#: rc_option_editor.cc:2731
+#: rc_option_editor.cc:2858
 msgid "Always Display Plugin Scan Progress"
 msgstr "Plugin Scan-Fortschritt immer anzeigen"
 
-#: rc_option_editor.cc:2737
+#: rc_option_editor.cc:2864
 msgid ""
 "<b>When enabled</b> a popup window showing plugin scan progress is displayed "
 "for indexing (cache load) and discovery (detect new plugins)"
@@ -10892,15 +11982,52 @@ msgstr ""
 "Fortschritt, Indizierung(Laden des Cache) und Entdeckung (neue Plugins "
 "finden) anzuzeigen"
 
-#: rc_option_editor.cc:2742
+#: rc_option_editor.cc:2869
+msgid "Silence plugins when the transport is stopped"
+msgstr "Deaktiviere Plugins, wenn der Transport gestoppt ist."
+
+#: rc_option_editor.cc:2875
+msgid ""
+"<b>When enabled</b> plugins will be reset at transport stop. When disabled "
+"plugins will be left unchanged at transport stop.\n"
+"\n"
+"This mostly affects plugins with a \"tail\" like Reverbs."
+msgstr ""
+"<b>Wenn aktiviert</b>, werden Plugins bei Transportstopp zurückgesetzt. Wenn "
+"nicht aktiviert, bleiben Plugins bei Transportstopp unverändert.\n"
+"\n"
+"Dies betrifft hauptsächlich Plugins mit einer \"Fahne\" wie z. B. Hall."
+
+#: rc_option_editor.cc:2879
+msgid "Make new plugins active"
+msgstr "Neue Plugins sind aktiv"
+
+#: rc_option_editor.cc:2885
+msgid ""
+"<b>When enabled</b> plugins will be activated when they are added to tracks/"
+"busses. When disabled plugins will be left inactive when they are added to "
+"tracks/busses"
+msgstr ""
+"<b>Wenn aktiviert</b>, werden Plugins beim Hinzufügen zu Spuren/ Bussen "
+"aktiv geschalten. Wenn nicht aktiviert, bleiben Plugins beim Hinzufügen zu "
+"Spuren/Bussen inaktiv"
+
+#: rc_option_editor.cc:2888 rc_option_editor.cc:2889 rc_option_editor.cc:2899
+#: rc_option_editor.cc:2911 rc_option_editor.cc:2916 rc_option_editor.cc:2918
+#: rc_option_editor.cc:2923 rc_option_editor.cc:2930 rc_option_editor.cc:2935
+#: rc_option_editor.cc:2944
+msgid "Plugins/VST"
+msgstr "Plugins/VST"
+
+#: rc_option_editor.cc:2888
 msgid "VST"
 msgstr "VST"
 
-#: rc_option_editor.cc:2746
+#: rc_option_editor.cc:2895
 msgid "Scan for [new] VST Plugins on Application Start"
 msgstr "Bei Programmstart nach [neuen] VST Plugins scannen"
 
-#: rc_option_editor.cc:2752
+#: rc_option_editor.cc:2901
 msgid ""
 "<b>When enabled</b> new VST plugins are searched, tested and added to the "
 "cache index on application start. When disabled new plugins will only be "
@@ -10910,11 +12037,11 @@ msgstr ""
 "getestet und dem Cache-Index hinzugefügt. Wenn deaktiviert, werden neue "
 "Plugins nur nach einem manuellen Scan verfügbar sein"
 
-#: rc_option_editor.cc:2758
+#: rc_option_editor.cc:2907
 msgid "Verbose Plugin Scan"
 msgstr "Gesprächiger Plugin-Scan"
 
-#: rc_option_editor.cc:2764
+#: rc_option_editor.cc:2913
 msgid ""
 "<b>When enabled</b> additional information for every plugin is added to the "
 "Log Window."
@@ -10922,35 +12049,40 @@ msgstr ""
 "<b>Wenn aktiviert</b>, wird zusätzliche Information für jedes Plugin ins "
 "Logfenster geschrieben."
 
-#: rc_option_editor.cc:2772
+#: rc_option_editor.cc:2921
 msgid "VST Cache:"
 msgstr "VST Cache:"
 
-#: rc_option_editor.cc:2777
+#: rc_option_editor.cc:2926
 msgid "VST Blacklist:"
 msgstr "VST Schwarzliste:"
 
-#: rc_option_editor.cc:2784
+#: rc_option_editor.cc:2933
 msgid "Linux VST Path:"
 msgstr "Linux VST Pfad:"
 
-#: rc_option_editor.cc:2789 rc_option_editor.cc:2802
+#: rc_option_editor.cc:2938 rc_option_editor.cc:2951
 msgid "Path:"
 msgstr "Pfad:"
 
-#: rc_option_editor.cc:2798
+#: rc_option_editor.cc:2947
 msgid "Windows VST Path:"
 msgstr "Windows VST Pfad:"
 
-#: rc_option_editor.cc:2808
+#: rc_option_editor.cc:2958 rc_option_editor.cc:2959 rc_option_editor.cc:2973
+#: rc_option_editor.cc:2978
+msgid "Plugins/Audio Unit"
+msgstr "Plugins/Audio Unit"
+
+#: rc_option_editor.cc:2958
 msgid "Audio Unit"
 msgstr "Audio Unit"
 
-#: rc_option_editor.cc:2812
+#: rc_option_editor.cc:2965
 msgid "Scan for AudioUnit Plugins on Application Start"
 msgstr "Bei Programmstart nach AudioUnit Plugins scannen"
 
-#: rc_option_editor.cc:2818
+#: rc_option_editor.cc:2971
 msgid ""
 "<b>When enabled</b> Audio Unit Plugins are discovered on application start. "
 "When disabled AU plugins will only be available after triggering a 'Scan' "
@@ -10963,27 +12095,59 @@ msgstr ""
 "Scans aktivieren, ein Crash während der Pluginentdeckung wird sie "
 "deaktivieren."
 
-#: rc_option_editor.cc:2823
+#: rc_option_editor.cc:2976
 msgid "AU Cache:"
 msgstr "AU Cache:"
 
-#: rc_option_editor.cc:2828
+#: rc_option_editor.cc:2981
 msgid "AU Blacklist:"
 msgstr "AU Schwarzliste:"
 
-#: rc_option_editor.cc:2832
+#: rc_option_editor.cc:2985
 msgid "Plugin GUI"
 msgstr "Plugin GUI"
 
-#: rc_option_editor.cc:2836
+#: rc_option_editor.cc:2989
 msgid "Automatically open the plugin GUI when adding a new plugin"
 msgstr "Bei Hinzufügen eines neuen Plugins dessen GUI automatisch öffnen"
 
-#: rc_option_editor.cc:2847
+#: rc_option_editor.cc:2998
+msgid "Show Plugin Inline Display on Mixerstrip by default"
+msgstr "Standardmäßig Plugin-Inline-Display in Mixerstrip anzeigen"
+
+#: rc_option_editor.cc:3005
+msgid ""
+"Don't automatically open the plugin GUI when the plugin has an inline "
+"display mode"
+msgstr ""
+"Das Plugin-GUI nicht automatisch öffnen, wenn das Plugin einen Inline-"
+"Display-Modus bietet"
+
+#: rc_option_editor.cc:3012
+msgid "Instrument"
+msgstr "Instrument"
+
+#: rc_option_editor.cc:3016
+msgid "Ask to replace existing instrument plugin"
+msgstr "Nachfragen, ob ein vorhandenes Instrumentenplugin ersetzt werden soll"
+
+#: rc_option_editor.cc:3024
+msgid "Interactively configure instrument plugins on insert"
+msgstr "Instrumentenplugins beim Einfügen interaktiv konfigurieren"
+
+#: rc_option_editor.cc:3030
+msgid ""
+"<b>When enabled</b> show a dialog to select instrument channel configuration "
+"before adding a multichannel plugin."
+msgstr ""
+"<b>Wenn aktiviert</b>, erscheint ein Dialog zur Auswahl einer Instrumenten-"
+"Kanalkonfiguration, bevor ein Mehrkanalplugin hinzugefügt wird."
+
+#: rc_option_editor.cc:3039
 msgid "Disable Graphics Hardware Acceleration (requires restart)"
 msgstr "Deaktiviere Grafik-Hardwarebeschleunigung (benötigt Neustart)"
 
-#: rc_option_editor.cc:2853
+#: rc_option_editor.cc:3045
 msgid ""
 "Render large parts of the application user-interface in software, instead of "
 "using 2D-graphics acceleration.\n"
@@ -10993,19 +12157,20 @@ msgstr ""
 "2D-Grafik-Beschleunigung zu verwenden.\n"
 "Dies erfordert einen Neustart von %1, um Auswirkung zu zeigen"
 
-#: rc_option_editor.cc:2854 rc_option_editor.cc:2866 rc_option_editor.cc:2869
-#: rc_option_editor.cc:2878 rc_option_editor.cc:2887 rc_option_editor.cc:2906
-#: rc_option_editor.cc:2922 rc_option_editor.cc:2938 rc_option_editor.cc:2952
-#: rc_option_editor.cc:2961
+#: rc_option_editor.cc:3046 rc_option_editor.cc:3058 rc_option_editor.cc:3061
+#: rc_option_editor.cc:3069 rc_option_editor.cc:3077 rc_option_editor.cc:3085
+#: rc_option_editor.cc:3093 rc_option_editor.cc:3104 rc_option_editor.cc:3120
+#: rc_option_editor.cc:3136 rc_option_editor.cc:3151 rc_option_editor.cc:3160
+#: rc_option_editor.cc:3168
 msgid "Preferences|GUI"
 msgstr "GUI"
 
-#: rc_option_editor.cc:2860
+#: rc_option_editor.cc:3052
 msgid "Possibly improve slow graphical performance (requires restart)"
 msgstr ""
 "Versuche, langsame Grafikperformance zu verbessern (erfordert Neustart)"
 
-#: rc_option_editor.cc:2865
+#: rc_option_editor.cc:3057
 msgid ""
 "Disables hardware gradient rendering on buggy video drivers (\"buggy "
 "gradients patch\").\n"
@@ -11015,29 +12180,33 @@ msgstr ""
 "Videotreibern (\"buggy gradients patch\").\n"
 "Diese Einstellung wird erst nach einem Neustart von %1 wirksam"
 
-#: rc_option_editor.cc:2872
+#: rc_option_editor.cc:3064
+msgid "Use Window Manager/Desktop visibility information"
+msgstr "Benutze Ansichtsinformationen des Fenstermanagers/Desktops"
+
+#: rc_option_editor.cc:3072
 msgid "Graphically indicate mouse pointer hovering over various widgets"
 msgstr "Mouseover-Effekt über verschiedenen Anzeigen"
 
-#: rc_option_editor.cc:2881
+#: rc_option_editor.cc:3080
 msgid "Show tooltips if mouse hovers over a control"
 msgstr "Zeige Tooltips, wenn die Maus über einem Element schwebt"
 
-#: rc_option_editor.cc:2890
+#: rc_option_editor.cc:3088
 msgid "Use name highlight bars in region displays (requires a restart)"
 msgstr ""
 "Verwende Farbbalken zur Namenshervorhebung in der Regionendarstellung "
 "(erfordert Neustart)"
 
-#: rc_option_editor.cc:2898
+#: rc_option_editor.cc:3096
 msgid "Update transport clock display at FPS instead of every 100ms"
 msgstr "Auffrischen der Transport-Uhranzeige in FPS statt alle 100 ms"
 
-#: rc_option_editor.cc:2913
+#: rc_option_editor.cc:3111
 msgid "Waveform image cache size (megabytes)"
 msgstr "Wellenformbild Cachegröße (Megabyte)"
 
-#: rc_option_editor.cc:2921
+#: rc_option_editor.cc:3119
 msgid ""
 "Increasing the cache size uses more memory to store waveform images, which "
 "can improve graphical performance."
@@ -11045,94 +12214,100 @@ msgstr ""
 "Ein größerer Cache benutzt mehr RAM-Speicher, was die Grafikperformance "
 "verbessern kann."
 
-#: rc_option_editor.cc:2929
+#: rc_option_editor.cc:3127
 msgid "Lock timeout (seconds)"
 msgstr "Sperr-Timeout (Sekunden)"
 
-#: rc_option_editor.cc:2937
+#: rc_option_editor.cc:3135
 msgid "Lock GUI after this many idle seconds (zero to never lock)"
 msgstr "Sperre GUI nach so vielen untätigen Sekunden (null, um nie zu sperren)"
 
-#: rc_option_editor.cc:2954
+#: rc_option_editor.cc:3153
 msgid "Mixer Strip"
 msgstr "Anzeige im Kanalzug"
 
-#: rc_option_editor.cc:2964
+#: rc_option_editor.cc:3163
 msgid "Use narrow strips in the mixer by default"
 msgstr "Standardmäßig schmale Kanalzüge verwenden"
 
-#: rc_option_editor.cc:2969 rc_option_editor.cc:2983 rc_option_editor.cc:3000
-#: rc_option_editor.cc:3016 rc_option_editor.cc:3032 rc_option_editor.cc:3046
-#: rc_option_editor.cc:3072 rc_option_editor.cc:3090 rc_option_editor.cc:3101
-#: rc_option_editor.cc:3108 rc_option_editor.cc:3110
+#: rc_option_editor.cc:3170
+msgid "Action Script Button Visibility"
+msgstr "Sichtbarkeit der Action Script-Schaltfläche"
+
+#: rc_option_editor.cc:3176 rc_option_editor.cc:3190 rc_option_editor.cc:3207
+#: rc_option_editor.cc:3223 rc_option_editor.cc:3239 rc_option_editor.cc:3253
+#: rc_option_editor.cc:3279 rc_option_editor.cc:3297 rc_option_editor.cc:3308
+#: rc_option_editor.cc:3315 rc_option_editor.cc:3317 rc_option_editor.cc:3325
+#: rc_option_editor.cc:3327 rc_option_editor.cc:3335 rc_option_editor.cc:3343
+#: rc_option_editor.cc:3345
 msgid "Preferences|Metering"
 msgstr "Pegelanzeige"
 
-#: rc_option_editor.cc:2973
+#: rc_option_editor.cc:3180
 msgid "Peak hold time"
 msgstr "Haltezeit für Spitzenwert"
 
-#: rc_option_editor.cc:2979
+#: rc_option_editor.cc:3186
 msgid "short"
 msgstr "Kurz"
 
-#: rc_option_editor.cc:2980
+#: rc_option_editor.cc:3187
 msgid "medium"
 msgstr "Mittel"
 
-#: rc_option_editor.cc:2981
+#: rc_option_editor.cc:3188
 msgid "long"
 msgstr "Lange"
 
-#: rc_option_editor.cc:2987
+#: rc_option_editor.cc:3194
 msgid "DPM fall-off"
 msgstr "Abfall der digitalen Pegelanzeige"
 
-#: rc_option_editor.cc:2993
+#: rc_option_editor.cc:3200
 msgid "slowest [6.6dB/sec]"
 msgstr "am langsamsten [6.6dB/sec]"
 
-#: rc_option_editor.cc:2994
+#: rc_option_editor.cc:3201
 msgid "slow [8.6dB/sec] (BBC PPM, EBU PPM)"
 msgstr "langsam [8.6dB/sec] (BBC PPM, EBU PPM)"
 
-#: rc_option_editor.cc:2995
+#: rc_option_editor.cc:3202
 msgid "moderate [12.0dB/sec] (DIN)"
 msgstr "moderat [12.0dB/sec] (DIN)"
 
-#: rc_option_editor.cc:2996
+#: rc_option_editor.cc:3203
 msgid "medium [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"
 msgstr "mittel [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"
 
-#: rc_option_editor.cc:2997
+#: rc_option_editor.cc:3204
 msgid "fast [20dB/sec]"
 msgstr "schnell [20dB/sec]"
 
-#: rc_option_editor.cc:2998
+#: rc_option_editor.cc:3205
 msgid "very fast [32dB/sec]"
 msgstr "sehr schnell [32dB/sec]"
 
-#: rc_option_editor.cc:3004
+#: rc_option_editor.cc:3211
 msgid "Meter line-up level; 0dBu"
 msgstr "Ausrichtung der Pegelanzeige; 0dBu"
 
-#: rc_option_editor.cc:3009 rc_option_editor.cc:3025
+#: rc_option_editor.cc:3216 rc_option_editor.cc:3232
 msgid "-24dBFS (SMPTE US: 4dBu = -20dBFS)"
 msgstr "-24dBFS (SMPTE US: 4dBu = -20dBFS)"
 
-#: rc_option_editor.cc:3010 rc_option_editor.cc:3026
+#: rc_option_editor.cc:3217 rc_option_editor.cc:3233
 msgid "-20dBFS (SMPTE RP.0155)"
 msgstr "-20dBFS (SMPTE RP.0155)"
 
-#: rc_option_editor.cc:3011 rc_option_editor.cc:3027
+#: rc_option_editor.cc:3218 rc_option_editor.cc:3234
 msgid "-18dBFS (EBU, BBC)"
 msgstr "-18dBFS (EBU, BBC)"
 
-#: rc_option_editor.cc:3012 rc_option_editor.cc:3028
+#: rc_option_editor.cc:3219 rc_option_editor.cc:3235
 msgid "-15dBFS (DIN)"
 msgstr "-15dBFS (DIN)"
 
-#: rc_option_editor.cc:3014
+#: rc_option_editor.cc:3221
 msgid ""
 "Configure meter-marks and color-knee point for dBFS scale DPM, set reference "
 "level for IEC1/Nordic, IEC2 PPM and VU meter."
@@ -11140,71 +12315,95 @@ msgstr ""
 "Konfiguriere Skalierung und Farbschwellwert für DPM mit dBFS-Skala, "
 "setzeReferenzpegel  für IEC1/Nordisch, IEC2 PPM und VU Pegelanzeigen."
 
-#: rc_option_editor.cc:3020
+#: rc_option_editor.cc:3227
 msgid "IEC1/DIN Meter line-up level; 0dBu"
 msgstr "Ausrichtung der IEC1/DIN Pegelanzeige; 0dBu"
 
-#: rc_option_editor.cc:3030
+#: rc_option_editor.cc:3237
 msgid "Reference level for IEC1/DIN meter."
 msgstr "Referenzpegel  für IEC1/DIN Pegelanzeige."
 
-#: rc_option_editor.cc:3036
+#: rc_option_editor.cc:3243
 msgid "VU Meter standard"
 msgstr "Standard für VU-Pegelanzeige"
 
-#: rc_option_editor.cc:3041
+#: rc_option_editor.cc:3248
 msgid "0VU = -2dBu (France)"
 msgstr "0VU = -2dBu (Frankreich)"
 
-#: rc_option_editor.cc:3042
+#: rc_option_editor.cc:3249
 msgid "0VU = 0dBu (North America, Australia)"
 msgstr "0VU = 0dBu (Nordamerika, Australien)"
 
-#: rc_option_editor.cc:3043
+#: rc_option_editor.cc:3250
 msgid "0VU = +4dBu (standard)"
 msgstr "0VU = +4dBu (Standard)"
 
-#: rc_option_editor.cc:3044
+#: rc_option_editor.cc:3251
 msgid "0VU = +8dBu"
 msgstr "0VU = +8dBu"
 
-#: rc_option_editor.cc:3050
+#: rc_option_editor.cc:3257
 msgid "Peak threshold [dBFS]"
 msgstr "Schwelle für Spitzenwert [dBFS]"
 
-#: rc_option_editor.cc:3059
+#: rc_option_editor.cc:3266
 msgid "Default Meter Type for Master Bus"
 msgstr "Voreingestellter Metertyp für Masterbus"
 
-#: rc_option_editor.cc:3077
+#: rc_option_editor.cc:3284
 msgid "Default Meter Type for Busses"
 msgstr "Voreingestellter Metertyp für Busse"
 
-#: rc_option_editor.cc:3094
+#: rc_option_editor.cc:3301
 msgid "Default Meter Type for Tracks"
 msgstr "Voreingestellter Metertyp für Spuren"
 
-#: rc_option_editor.cc:3106
+#: rc_option_editor.cc:3313
 msgid ""
-"Specify the audio signal level in dbFS at and above which the meter-peak "
+"Specify the audio signal level in dBFS at and above which the meter-peak "
 "indicator will flash red."
 msgstr ""
 "Geben Sie den Signalpegel in dbFS an, bei dessen Erreichen oder "
-"Ãœberschreitung die Spitzenwertanzeige in der Pegelanzeige rot blinkt"
+"Ãœberschreitung die Spitzenwertanzeige in der Pegelanzeige rot blinkt."
 
-#: rc_option_editor.cc:3113
+#: rc_option_editor.cc:3320
 msgid "LED meter style"
 msgstr "Pegelanzeigen im LED-Stil"
 
-#: rc_option_editor.cc:3121
+#: rc_option_editor.cc:3325
+msgid "Editor Meters"
+msgstr "Editor-Pegelanzeige"
+
+#: rc_option_editor.cc:3330
+msgid "Show meters on tracks in the editor"
+msgstr "Aktiviere Pegelanzeigen im Editor"
+
+#: rc_option_editor.cc:3338
+msgid "Show at most stereo meters in the track-header"
+msgstr "Im Spurkopf Pegelanzeige auf höchstens Stereo beschränken"
+
+#: rc_option_editor.cc:3343
+msgid "Post Export Analysis"
+msgstr "Post-Export Analyse"
+
+#: rc_option_editor.cc:3348
+msgid "Save loudness analysis as image file"
+msgstr "Loudness-Analyse als Bilddatei sichern"
+
+#: rc_option_editor.cc:3356
 msgid "Theme"
 msgstr "Thema"
 
-#: rc_option_editor.cc:3193
+#: rc_option_editor.cc:3358
+msgid "Theme/Colors"
+msgstr "Thema/Farben"
+
+#: rc_option_editor.cc:3436
 msgid "Set Linux VST Search Path"
 msgstr "Linux VST Suchpfad setzen"
 
-#: rc_option_editor.cc:3207
+#: rc_option_editor.cc:3450
 msgid "Set Windows VST Search Path"
 msgstr "Windows VST Suchpfad setzen"
 
@@ -11216,7 +12415,7 @@ msgstr "Diese Region vorhören"
 msgid "Position:"
 msgstr "Position:"
 
-#: region_editor.cc:92 add_video_dialog.cc:155
+#: region_editor.cc:92 add_video_dialog.cc:156
 msgid "End:"
 msgstr "Ende:"
 
@@ -11280,33 +12479,33 @@ msgstr "Spur:"
 msgid "Choose Top Region"
 msgstr "Oberste Region auswählen"
 
-#: region_view.cc:270
+#: region_view.cc:271
 msgid "SilenceText"
 msgstr "StilleText"
 
-#: region_view.cc:285 region_view.cc:304
+#: region_view.cc:286 region_view.cc:305
 msgid "minutes"
 msgstr "Minuten"
 
-#: region_view.cc:288 region_view.cc:307
+#: region_view.cc:289 region_view.cc:308
 msgid "msecs"
 msgstr "ms"
 
-#: region_view.cc:291 region_view.cc:310
+#: region_view.cc:292 region_view.cc:311
 msgid "secs"
 msgstr "s"
 
-#: region_view.cc:294
+#: region_view.cc:295
 msgid "%1 silent segment"
 msgid_plural "%1 silent segments"
 msgstr[0] "%1 stilles Segment"
 msgstr[1] "%1 stille Segmente"
 
-#: region_view.cc:296
+#: region_view.cc:297
 msgid "shortest = %1 %2"
 msgstr "kürzestes = %1 %2"
 
-#: region_view.cc:313
+#: region_view.cc:314
 msgid ""
 "\n"
 "  (shortest audible segment = %1 %2)"
@@ -11354,55 +12553,63 @@ msgstr "Kullback-Liebler"
 msgid "Modified Kullback-Liebler"
 msgstr "Modified Kullback-Liebler"
 
-#: rhythm_ferret.cc:65
+#: rhythm_ferret.cc:62
+msgid "Spectral Flux"
+msgstr "Spektraler Fluss"
+
+#: rhythm_ferret.cc:68
 msgid "Split region"
 msgstr "Region teilen"
 
-#: rhythm_ferret.cc:66
+#: rhythm_ferret.cc:70
 msgid "Snap regions"
 msgstr "Regionen einrasten"
 
-#: rhythm_ferret.cc:67
+#: rhythm_ferret.cc:71
 msgid "Conform regions"
 msgstr "Region angleichen"
 
-#: rhythm_ferret.cc:72
+#: rhythm_ferret.cc:77
 msgid "Rhythm Ferret"
 msgstr "Rhythm Ferret"
 
-#: rhythm_ferret.cc:78
+#: rhythm_ferret.cc:83
 msgid "Analyze"
 msgstr "Daten analysieren"
 
-#: rhythm_ferret.cc:113
+#: rhythm_ferret.cc:122
 msgid "Detection function"
 msgstr "Erkennungsfunktion"
 
-#: rhythm_ferret.cc:117
-msgid "Trigger gap"
-msgstr "Mindestauslöseabstand"
-
-#: rhythm_ferret.cc:122 strip_silence_dialog.cc:65
-msgid "Threshold"
-msgstr "Threshold"
+#: rhythm_ferret.cc:126
+msgid "Trigger gap (postproc)"
+msgstr "Auslöseabstand (postproc)"
 
-#: rhythm_ferret.cc:127
+#: rhythm_ferret.cc:131
 msgid "Peak threshold"
 msgstr "Schwelle für Spitzenwert"
 
-#: rhythm_ferret.cc:132
+#: rhythm_ferret.cc:135
 msgid "Silence threshold"
 msgstr "Silence threshold"
 
-#: rhythm_ferret.cc:137
+#: rhythm_ferret.cc:141
+msgid "Min Inter-Onset Time"
+msgstr "Min. Zeit zwischen Onsets"
+
+#: rhythm_ferret.cc:148
 msgid "Sensitivity"
 msgstr "Empfindlichkeit"
 
-#: rhythm_ferret.cc:141
+#: rhythm_ferret.cc:152
+msgid "Cut Pos Threshold"
+msgstr "Schwellwert für Schnittposition"
+
+#: rhythm_ferret.cc:157
 msgid "Operation"
 msgstr "Aktionen"
 
-#: rhythm_ferret.cc:355
+#: rhythm_ferret.cc:382
 msgid "split regions (rhythm ferret)"
 msgstr "Regionen teilen (rhythm ferret)"
 
@@ -11426,19 +12633,15 @@ msgstr "Aufnahmestatus"
 msgid "Active state"
 msgstr "Aktiv-Status"
 
-#: route_group_dialog.cc:53 route_group_dialog.cc:82 theme_manager.cc:87
-msgid "Color"
-msgstr "Farbe"
-
-#: route_group_dialog.cc:59
+#: route_group_dialog.cc:58
 msgid "RouteGroupDialog"
 msgstr "Bearbeitungsgruppendialog"
 
-#: route_group_dialog.cc:100
+#: route_group_dialog.cc:99
 msgid "<b>Sharing</b>"
 msgstr "<b>Geteilte Funktionen</b>"
 
-#: route_group_dialog.cc:200
+#: route_group_dialog.cc:192
 msgid "The group name is not unique. Please use a different name."
 msgstr ""
 "Der Gruppenname ist nicht einzigartig. Bitte benutzen Sie einen anderen "
@@ -11460,92 +12663,96 @@ msgstr "Ausgänge"
 msgid "Plugins, Inserts & Sends"
 msgstr "Plugins, Inserts & Sends"
 
-#: route_params_ui.cc:209
+#: route_params_ui.cc:201
 msgid "route display list item for renamed route not found!"
 msgstr ""
 "Konnte Bezeichnung für umbenannten Verbindung nicht in der Liste der "
 "Verbindungen finden!"
 
-#: route_params_ui.cc:279 route_params_ui.cc:307
+#: route_params_ui.cc:271 route_params_ui.cc:299
 #, c-format
 msgid "Playback delay: %<PRId64> samples"
 msgstr "Wiedergabeverzögerung: %<PRId64> Samples"
 
-#: route_params_ui.cc:499
+#: route_params_ui.cc:491
 msgid "NO TRACK"
 msgstr "KEINE SPUR"
 
-#: route_params_ui.cc:637 route_params_ui.cc:638
+#: route_params_ui.cc:515
+msgid "Add Track or Bus"
+msgstr "Spur/Bus hinzufügen"
+
+#: route_params_ui.cc:627 route_params_ui.cc:628
 msgid "No Track or Bus Selected"
 msgstr "Keine Spuren oder Busse ausgewählt"
 
-#: route_time_axis.cc:105
+#: route_time_axis.cc:104
 msgid "RTAV|G"
 msgstr "G"
 
-#: route_time_axis.cc:106
+#: route_time_axis.cc:105
 msgid "RTAV|P"
 msgstr "P"
 
-#: route_time_axis.cc:107
+#: route_time_axis.cc:106
 msgid "RTAV|A"
 msgstr "A"
 
-#: route_time_axis.cc:184
+#: route_time_axis.cc:194
 msgid "Record (Right-click for Step Edit)"
 msgstr "Aufnahme (Rechtsklick für Step Entry)"
 
-#: route_time_axis.cc:187
+#: route_time_axis.cc:197
 msgid "Record"
 msgstr "Aufnahme"
 
-#: route_time_axis.cc:257
+#: route_time_axis.cc:265
 msgid "Route Group"
 msgstr "Bearbeitungsgruppe"
 
-#: route_time_axis.cc:267
+#: route_time_axis.cc:275
 msgid "MIDI Controllers and Automation"
 msgstr "MIDI-Controller und Automation"
 
-#: route_time_axis.cc:498
+#: route_time_axis.cc:510
 msgid "Show All Automation"
 msgstr "Alle Automationen anzeigen"
 
-#: route_time_axis.cc:501
+#: route_time_axis.cc:513
 msgid "Show Existing Automation"
 msgstr "Genutzte Automationen zeigen"
 
-#: route_time_axis.cc:504
+#: route_time_axis.cc:516
 msgid "Hide All Automation"
 msgstr "Alle Automationen verbergen"
 
-#: route_time_axis.cc:513
+#: route_time_axis.cc:525
 msgid "Processor automation"
 msgstr "Prozessorautomation"
 
-#: route_time_axis.cc:520
+#: route_time_axis.cc:532
 msgid "Fader"
 msgstr "Fader"
 
-#: route_time_axis.cc:547
+#: route_time_axis.cc:559
 msgid "Pan"
 msgstr "Pan"
 
-#: route_time_axis.cc:638
+#: route_time_axis.cc:643
 msgid "Overlaid"
 msgstr "Overlaid"
 
-#: route_time_axis.cc:644
+#: route_time_axis.cc:649
 msgid "Stacked"
 msgstr "Stacked"
 
-#: route_time_axis.cc:652
+#: route_time_axis.cc:657
 msgid "Layers"
 msgstr "Layers"
 
 #: route_time_axis.cc:721
 msgid "Automatic (based on I/O connections)"
-msgstr "Automatisch (auf den I/O Verbindungen basierend)"
+msgstr "Automatisch (auf den E/A Verbindungen basierend)"
 
 #: route_time_axis.cc:730
 msgid "(Currently: Existing Material)"
@@ -11556,11 +12763,11 @@ msgid "(Currently: Capture Time)"
 msgstr "(Momentan: An Aufnahmezeit ausrichten)"
 
 #: route_time_axis.cc:741
-msgid "Align with Existing Material"
+msgid "Align With Existing Material"
 msgstr "An existierendem Material ausrichten"
 
 #: route_time_axis.cc:746
-msgid "Align with Capture Time"
+msgid "Align With Capture Time"
 msgstr "An Aufnahmezeit ausrichten"
 
 #: route_time_axis.cc:751
@@ -11583,188 +12790,191 @@ msgstr "Non-Layered Mode"
 msgid "Record Mode"
 msgstr "Aufnahmemodus"
 
-#: route_time_axis.cc:811 route_time_axis.cc:1806
+#: route_time_axis.cc:809 route_time_axis.cc:1795
 msgid "Playlist"
 msgstr "Wiedergabeliste"
 
-#: route_time_axis.cc:1109
+#: route_time_axis.cc:1107
 msgid "Rename Playlist"
 msgstr "Wiedergabeliste umbenennen"
 
-#: route_time_axis.cc:1110
+#: route_time_axis.cc:1108
 msgid "New name for playlist:"
 msgstr "Neuer Name für Wiedergabeliste:"
 
-#: route_time_axis.cc:1195
+#: route_time_axis.cc:1193
 msgid "New Copy Playlist"
 msgstr "Neue Kopie der Wiedergabeliste"
 
-#: route_time_axis.cc:1196 route_time_axis.cc:1249
+#: route_time_axis.cc:1194 route_time_axis.cc:1247
 msgid "Name for new playlist:"
 msgstr "Name für die neue Wiedergabeliste:"
 
-#: route_time_axis.cc:1248
+#: route_time_axis.cc:1246
 msgid "New Playlist"
 msgstr "Neue Wiedergabeliste"
 
-#: route_time_axis.cc:1452
-msgid "You cannot create a track with that name as it is reserved for %1"
-msgstr ""
-"Sie können keine Spur mit einem Namen erstellen, der für %1 reserviert ist."
+#: route_time_axis.cc:1441
+msgid "The name \"%1\" is reserved for %2"
+msgstr "Der Name \"%1\" ist für %2 reserviert"
 
-#: route_time_axis.cc:1695
+#: route_time_axis.cc:1684
 msgid "New Copy..."
 msgstr "Neue Kopie..."
 
-#: route_time_axis.cc:1699
+#: route_time_axis.cc:1688
 msgid "New Take"
 msgstr "Neuer Take"
 
-#: route_time_axis.cc:1700
+#: route_time_axis.cc:1689
 msgid "Copy Take"
 msgstr "Take kopieren"
 
-#: route_time_axis.cc:1705
+#: route_time_axis.cc:1694
 msgid "Clear Current"
 msgstr "Aktuelle leeren"
 
-#: route_time_axis.cc:1708
+#: route_time_axis.cc:1697
 msgid "Select from All..."
 msgstr "Aus allen auswählen..."
 
-#: route_time_axis.cc:1796
+#: route_time_axis.cc:1785
 msgid "Take: %1.%2"
 msgstr "Take: %1.%2"
 
-#: route_time_axis.cc:2202 selection.cc:1009 selection.cc:1063
+#: route_time_axis.cc:2190 selection.cc:1042 selection.cc:1096
 msgid "programming error: "
 msgstr "Programmierfehler:"
 
-#: route_time_axis.cc:2622
+#: route_time_axis.cc:2614
 msgid "Underlays"
 msgstr "Darunterliegende"
 
-#: route_time_axis.cc:2625
+#: route_time_axis.cc:2617
 msgid "Remove \"%1\""
 msgstr "Lösche \"%1\""
 
-#: route_time_axis.cc:2675 route_time_axis.cc:2712
+#: route_time_axis.cc:2667 route_time_axis.cc:2704
 msgid "programming error: underlay reference pointer pairs are inconsistent!"
 msgstr "programming error: underlay reference pointer pairs are inconsistent!"
 
-#: route_time_axis.cc:2739
+#: route_time_axis.cc:2731 vca_master_strip.cc:203 vca_time_axis.cc:228
 msgid "After-fade listen (AFL)"
 msgstr "After-Fader (AFL)"
 
-#: route_time_axis.cc:2743
+#: route_time_axis.cc:2735 vca_master_strip.cc:207 vca_time_axis.cc:232
 msgid "Pre-fade listen (PFL)"
 msgstr "Pre-Fader (PFL)"
 
-#: route_ui.cc:153
+#: route_ui.cc:169
 msgid "Mute this track"
 msgstr "Diese Spur stummschalten"
 
-#: route_ui.cc:157
+#: route_ui.cc:173
 msgid "Mute other (non-soloed) tracks"
 msgstr "Andere (nicht Solo-)Spuren stummschalten"
 
-#: route_ui.cc:163
+#: route_ui.cc:179
 msgid "Enable recording on this track"
 msgstr "Aktiviere die Aufnahme auf dieser Spur"
 
-#: route_ui.cc:171
+#: route_ui.cc:187
 msgid "make mixer strips show sends to this bus"
 msgstr "Kanalzüge zeigen Sends zu diesem Bus"
 
-#: route_ui.cc:176
+#: route_ui.cc:192
 msgid "Monitor input"
 msgstr "Eingang abhören"
 
-#: route_ui.cc:182
+#: route_ui.cc:198
 msgid "Monitor playback"
 msgstr "Vorhandenes Material abhören"
 
-#: route_ui.cc:691
+#: route_ui.cc:710
 msgid "Not connected to AudioEngine - cannot engage record"
-msgstr "Nicht mit Audio-Engine verbunden - Aufnahme nicht möglich"
+msgstr "Nicht mit Audioengine verbunden - Aufnahme nicht möglich"
 
-#: route_ui.cc:890
+#: route_ui.cc:887
+msgid "Rec-Safe"
+msgstr "Rec-Safe"
+
+#: route_ui.cc:892
 msgid "Step Entry"
 msgstr "Eingabemodus (Step Entry)"
 
-#: route_ui.cc:963
+#: route_ui.cc:991
 msgid "Assign all tracks (prefader)"
 msgstr "Alle Audiospuren zuweisen (Pre-Fader)"
 
-#: route_ui.cc:967
+#: route_ui.cc:995
 msgid "Assign all tracks and buses (prefader)"
 msgstr "Alle Audiospuren und Busse zuweisen (Pre-Fader)"
 
-#: route_ui.cc:971
+#: route_ui.cc:999
 msgid "Assign all tracks (postfader)"
 msgstr "Alle Audiospuren zuweisen (Post-Fader)"
 
-#: route_ui.cc:975
+#: route_ui.cc:1003
 msgid "Assign all tracks and buses (postfader)"
 msgstr "Alle Audiospuren und Busse zuweisen (Post-Fader)"
 
-#: route_ui.cc:979
+#: route_ui.cc:1007
 msgid "Assign selected tracks (prefader)"
 msgstr "Ausgewählte Audiospuren zuweisen (Pre-Fader)"
 
-#: route_ui.cc:983
+#: route_ui.cc:1011
 msgid "Assign selected tracks and buses (prefader)"
 msgstr "Ausgewählte Audiospuren und Busse zuweisen (Pre-Fader)"
 
-#: route_ui.cc:986
+#: route_ui.cc:1014
 msgid "Assign selected tracks (postfader)"
 msgstr "Ausgewählte Audiospuren zuweisen (Post-Fader)"
 
-#: route_ui.cc:990
+#: route_ui.cc:1018
 msgid "Assign selected tracks and buses (postfader)"
 msgstr "Ausgewählte Audiospuren und Busse zuweisen (Post-Fader)"
 
-#: route_ui.cc:993
+#: route_ui.cc:1021
 msgid "Copy track/bus gains to sends"
 msgstr "Lautstärken der Spuren/Busse auf ihre Sends kopieren"
 
-#: route_ui.cc:994
+#: route_ui.cc:1022
 msgid "Set sends gain to -inf"
 msgstr "Setze Sends-Lautstärken to -inf"
 
-#: route_ui.cc:995
+#: route_ui.cc:1023
 msgid "Set sends gain to 0dB"
 msgstr "Setze Sends-Lautstärken to 0dB"
 
-#: route_ui.cc:1314
+#: route_ui.cc:1361
 msgid "Solo Isolate"
 msgstr "Isoliertes Solo"
 
-#: route_ui.cc:1321
+#: route_ui.cc:1368
 msgid "Solo Safe"
 msgstr "Solo sperren"
 
-#: route_ui.cc:1343
+#: route_ui.cc:1390
 msgid "Pre Fader Sends"
 msgstr "Pre-Fader Sends"
 
-#: route_ui.cc:1349
+#: route_ui.cc:1396
 msgid "Post Fader Sends"
 msgstr "Post-Fader Sends"
 
-#: route_ui.cc:1355
+#: route_ui.cc:1402
 msgid "Control Outs"
 msgstr "Vorhörausgang"
 
-#: route_ui.cc:1361
+#: route_ui.cc:1408
 msgid "Main Outs"
 msgstr "Hauptausgänge"
 
-#: route_ui.cc:1527
+#: route_ui.cc:1575
 msgid "Color Selection"
 msgstr "Farbauswahl"
 
-#: route_ui.cc:1592
+#: route_ui.cc:1617
 msgid ""
 "The use of colons (':') is discouraged in track and bus names.\n"
 "Do you want to use this new name?"
@@ -11773,23 +12983,23 @@ msgstr ""
 "wird nicht empfohlen.\n"
 "Wollen Sie diesen neuen Namen verwenden?"
 
-#: route_ui.cc:1596
+#: route_ui.cc:1621
 msgid "Use the new name"
 msgstr "Neuen Namen verwenden"
 
-#: route_ui.cc:1597
+#: route_ui.cc:1622
 msgid "Re-edit the name"
 msgstr "Namen bearbeiten"
 
-#: route_ui.cc:1610
+#: route_ui.cc:1635
 msgid "Rename Track"
 msgstr "Spur umbenennen"
 
-#: route_ui.cc:1612
+#: route_ui.cc:1637
 msgid "Rename Bus"
 msgstr "Bus umbenennen"
 
-#: route_ui.cc:1680
+#: route_ui.cc:1697
 msgid ": comment editor"
 msgstr ": Kommentare bearbeiten"
 
@@ -11809,65 +13019,18 @@ msgstr "Als Vorlage speichern"
 msgid "Template name:"
 msgstr "Name der Vorlage:"
 
-#: route_ui.cc:1976
-msgid "Remote Control ID"
-msgstr "ID für Fernsteuerung"
-
-#: route_ui.cc:1986
-msgid "Remote control ID:"
-msgstr "ID für Fernsteuerung:"
-
-#: route_ui.cc:2000
-msgid ""
-"The remote control ID of %1 is: %2\n"
-"\n"
-"\n"
-"The remote control ID of %3 cannot be changed."
-msgstr ""
-"Die Fernbedienungs-ID von %1 ist: %2\n"
-"\n"
-"\n"
-"Die Fernbedienungs-ID von %3 kann nicht geändert werden."
-
-#: route_ui.cc:2004
-msgid "the master bus"
-msgstr "der Master-Bus"
-
-#: route_ui.cc:2004
-msgid "the monitor bus"
-msgstr "der Monitor-Bus"
-
-#: route_ui.cc:2006
-msgid ""
-"The remote control ID of %5 is: %2\n"
-"\n"
-"\n"
-"Remote Control IDs are currently determined by track/bus ordering in %6.\n"
-"\n"
-"%3Use the User Interaction tab of the Preferences window if you want to "
-"change this%4"
-msgstr ""
-"Die Fernbedienungs-ID von %5 ist: %2\n"
-"\n"
-"\n"
-"Fernbedienungs-IDs werden zur Zeit durch die Reihenfolge der Spuren/Busse in "
-"%6 bestimmt.\n"
-"\n"
-"%3Benutzen Sie den Reiter GUI im Fenster \"Einstellungen\", um dies zu ändern"
-"%4"
-
-#: route_ui.cc:2063
+#: route_ui.cc:2023
 msgid ""
-"Left-click to invert (phase reverse) channel %1 of this track.  Right-click "
-"to show menu."
+"Left-click to invert polarity of channel %1 of this track. Right-click to "
+"show menu."
 msgstr ""
-"Linksklick, um die Phase von Kanal %1 zu invertieren. Rechtsklick zeigt das "
-"Menü."
+"Linksklick, um die Polarität von Kanal %1 dieser Spur zu invertieren. "
+"Rechtsklick zeigt das Menü."
 
-#: route_ui.cc:2065
-msgid "Click to show a menu of channels for inversion (phase reverse)"
+#: route_ui.cc:2025
+msgid "Click to show a menu of channels to invert polarity"
 msgstr ""
-"Klicken, um ein Menü zum Invertieren der Kanäle (Phasendrehung) anzuzeigen"
+"Klicken, um ein Menü zum Invertieren der Polarität von Kanälen anzuzeigen"
 
 #: save_as_dialog.cc:34
 msgid "Switch to newly-saved version"
@@ -11905,6 +13068,30 @@ msgstr "Hier klicken, um einen Pfad hinzuzufügen"
 msgid "the session folder"
 msgstr "Projektordner"
 
+#: script_selector.cc:43
+msgid "<b>Type:</b>"
+msgstr "<b>Type :</b>"
+
+#: script_selector.cc:49
+msgid "<b>Author:</b>"
+msgstr "<b>Autor:</b>"
+
+#: script_selector.cc:55
+msgid "<b>Description:</b>"
+msgstr "<b>Beschreibung:</b>"
+
+#: script_selector.cc:131
+msgid "Select Script to unload"
+msgstr "Wähle zu entfernendes Skript aus"
+
+#: script_selector.cc:165
+msgid "<b>Name:</b>"
+msgstr "<b>Name:</b>"
+
+#: script_selector.cc:172
+msgid "<b>Instance Parameters</b>"
+msgstr "<b>Instanz-Parameter</b>"
+
 #: send_ui.cc:134
 msgid "Send "
 msgstr "Send "
@@ -11917,7 +13104,7 @@ msgstr "Projekteinrichtung"
 msgid "Advanced options ..."
 msgstr "Erweiterte Einstellungen..."
 
-#: session_dialog.cc:163 session_dialog.cc:394
+#: session_dialog.cc:163 session_dialog.cc:397
 msgid "Recent Sessions"
 msgstr "Zuletzt verwendete Projekte"
 
@@ -11937,99 +13124,99 @@ msgstr "Zuletzt geändert"
 msgid "New Session"
 msgstr "Neues Projekt"
 
-#: session_dialog.cc:376
+#: session_dialog.cc:379
 msgid "Check the website for more..."
 msgstr "Informieren Sie sich auf der Webseite weiter..."
 
-#: session_dialog.cc:379
+#: session_dialog.cc:382
 msgid "Click to open the program website in your web browser"
 msgstr "Klicken Sie, um die Webseite in Ihrem Web-Browse zu öffnen"
 
-#: session_dialog.cc:401
+#: session_dialog.cc:404
 msgid "Select session file"
 msgstr "Projektdatei auswählen"
 
-#: session_dialog.cc:414
+#: session_dialog.cc:417
 msgid "Other Sessions"
 msgstr "Andere Projekte"
 
-#: session_dialog.cc:421
+#: session_dialog.cc:424
 msgid "Safe Mode: Disable all Plugins"
 msgstr "Abgesicherter Modus: Alle Plugins abschalten"
 
-#: session_dialog.cc:451
+#: session_dialog.cc:454
 msgid "Open"
 msgstr "Öffnen"
 
-#: session_dialog.cc:518
+#: session_dialog.cc:521
 msgid "Session name:"
 msgstr "Projektname:"
 
-#: session_dialog.cc:540
+#: session_dialog.cc:543
 msgid "Create session folder in:"
 msgstr "Ort des Projektverzeichnisses:"
 
-#: session_dialog.cc:561
+#: session_dialog.cc:564
 msgid "Select folder for session"
 msgstr "Ordner für Projekt wählen"
 
-#: session_dialog.cc:588
+#: session_dialog.cc:591
 msgid "Use this template"
 msgstr "Diese Vorlage verwenden"
 
-#: session_dialog.cc:591
+#: session_dialog.cc:594
 msgid "no template"
 msgstr "keine Vorlage"
 
-#: session_dialog.cc:743 session_dialog.cc:790
+#: session_dialog.cc:746 session_dialog.cc:793
 msgid "32-bit float"
 msgstr "32-bit float"
 
-#: session_dialog.cc:746 session_dialog.cc:793
+#: session_dialog.cc:749 session_dialog.cc:796
 msgid "24-bit"
 msgstr "24-bit"
 
-#: session_dialog.cc:749 session_dialog.cc:796
+#: session_dialog.cc:752 session_dialog.cc:799
 msgid "16-bit"
 msgstr "16-bit"
 
-#: session_dialog.cc:874 session_dialog.cc:875 session_dialog.cc:876
+#: session_dialog.cc:877 session_dialog.cc:878 session_dialog.cc:879
 msgid "channels"
 msgstr "Kanäle"
 
-#: session_dialog.cc:890
+#: session_dialog.cc:893
 msgid "<b>Busses</b>"
 msgstr "<b>Busse</b>"
 
-#: session_dialog.cc:891
+#: session_dialog.cc:894
 msgid "<b>Inputs</b>"
 msgstr "<b>Eingänge</b>"
 
-#: session_dialog.cc:892
+#: session_dialog.cc:895
 msgid "<b>Outputs</b>"
 msgstr "<b>Ausgänge</b>"
 
-#: session_dialog.cc:900
+#: session_dialog.cc:903
 msgid "Create master bus"
 msgstr "Master-Bus erstellen"
 
-#: session_dialog.cc:910
+#: session_dialog.cc:913
 msgid "Automatically connect to physical inputs"
 msgstr "Automatisch mit Audioeingängen verbinden"
 
-#: session_dialog.cc:917 session_dialog.cc:976
+#: session_dialog.cc:920 session_dialog.cc:979
 msgid "Use only"
 msgstr "Benutze nur"
 
-#: session_dialog.cc:970
+#: session_dialog.cc:973
 msgid "Automatically connect outputs"
 msgstr "Ausgänge automatisch verbinden"
 
-#: session_dialog.cc:992
+#: session_dialog.cc:995
 msgid "... to master bus"
 msgstr "... mit dem Master-Bus"
 
-#: session_dialog.cc:1002
+#: session_dialog.cc:1005
 msgid "... to physical outputs"
 msgstr "... mit den Audioausgängen"
 
@@ -12054,191 +13241,191 @@ msgstr "Aus Projekt importieren"
 msgid "This will select all elements of this type!"
 msgstr "Dies wird alle Elemente dieses Typs auswählen!"
 
-#: session_metadata_dialog.cc:285
+#: session_metadata_dialog.cc:288
 msgid "EAN Check digit OK"
 msgstr "EAN Prüfziffer OK"
 
-#: session_metadata_dialog.cc:289
+#: session_metadata_dialog.cc:292
 msgid "EAN Check digit error"
 msgstr "EAN Prüfziffernfehler"
 
-#: session_metadata_dialog.cc:289
+#: session_metadata_dialog.cc:292
 msgid "expected"
 msgstr "erwartet"
 
-#: session_metadata_dialog.cc:294
+#: session_metadata_dialog.cc:297
 msgid "EAN Length error"
 msgstr "EAN Längenfehler"
 
-#: session_metadata_dialog.cc:423
+#: session_metadata_dialog.cc:426
 msgid "Field"
 msgstr "Feld"
 
-#: session_metadata_dialog.cc:427
+#: session_metadata_dialog.cc:430
 msgid "Values (current value on top)"
 msgstr "Werte (aktueller oben)"
 
-#: session_metadata_dialog.cc:641
+#: session_metadata_dialog.cc:644
 msgid "User"
 msgstr "Benutzer"
 
-#: session_metadata_dialog.cc:649
+#: session_metadata_dialog.cc:652
 msgid "Email"
 msgstr "E-Mail"
 
-#: session_metadata_dialog.cc:652
+#: session_metadata_dialog.cc:655
 msgid "Web"
 msgstr "Web"
 
-#: session_metadata_dialog.cc:655
+#: session_metadata_dialog.cc:658
 msgid "Organization"
 msgstr "Organisation"
 
-#: session_metadata_dialog.cc:658
+#: session_metadata_dialog.cc:661
 msgid "Country"
 msgstr "Land"
 
-#: session_metadata_dialog.cc:672
+#: session_metadata_dialog.cc:675
 msgid "Title"
 msgstr "Titel"
 
-#: session_metadata_dialog.cc:675
+#: session_metadata_dialog.cc:678
 msgid "Track Number"
 msgstr "Liednummer"
 
-#: session_metadata_dialog.cc:678
+#: session_metadata_dialog.cc:681
 msgid "Subtitle"
 msgstr "Untertitel"
 
-#: session_metadata_dialog.cc:681
+#: session_metadata_dialog.cc:684
 msgid "Grouping"
 msgstr "Gruppierung"
 
-#: session_metadata_dialog.cc:684
+#: session_metadata_dialog.cc:687
 msgid "Artist"
 msgstr "Künstler"
 
-#: session_metadata_dialog.cc:687
+#: session_metadata_dialog.cc:690
 msgid "Genre"
 msgstr "Genre"
 
-#: session_metadata_dialog.cc:690
+#: session_metadata_dialog.cc:693
 msgid "Comment"
 msgstr "Kommentar"
 
-#: session_metadata_dialog.cc:693
+#: session_metadata_dialog.cc:696
 msgid "Copyright"
 msgstr "Copyright"
 
-#: session_metadata_dialog.cc:701 session_metadata_dialog.cc:706
+#: session_metadata_dialog.cc:704 session_metadata_dialog.cc:709
 msgid "Album"
 msgstr "Album"
 
-#: session_metadata_dialog.cc:709
+#: session_metadata_dialog.cc:712
 msgid "Year"
 msgstr "Jahr"
 
-#: session_metadata_dialog.cc:712
+#: session_metadata_dialog.cc:715
 msgid "Album Artist"
 msgstr "Albumkünstler"
 
-#: session_metadata_dialog.cc:715
+#: session_metadata_dialog.cc:718
 msgid "Total Tracks"
 msgstr "Spuranzahl"
 
-#: session_metadata_dialog.cc:718
+#: session_metadata_dialog.cc:721
 msgid "Disc Subtitle"
 msgstr "CD-Untertitel"
 
-#: session_metadata_dialog.cc:721
+#: session_metadata_dialog.cc:724
 msgid "Disc Number"
 msgstr "CD-Nummer"
 
-#: session_metadata_dialog.cc:724
+#: session_metadata_dialog.cc:727
 msgid "Total Discs"
 msgstr "CDs insgesamt"
 
-#: session_metadata_dialog.cc:727
+#: session_metadata_dialog.cc:730
 msgid "Compilation"
 msgstr "Compilation"
 
-#: session_metadata_dialog.cc:730
+#: session_metadata_dialog.cc:733
 msgid "ISRC"
 msgstr "ISRC"
 
-#: session_metadata_dialog.cc:733
+#: session_metadata_dialog.cc:736
 msgid "EAN barcode"
 msgstr "EAN Strichcode"
 
-#: session_metadata_dialog.cc:746
+#: session_metadata_dialog.cc:749
 msgid "People"
 msgstr "Mitwirkenden"
 
-#: session_metadata_dialog.cc:751
+#: session_metadata_dialog.cc:754
 msgid "Lyricist"
 msgstr "Texter"
 
-#: session_metadata_dialog.cc:754
+#: session_metadata_dialog.cc:757
 msgid "Composer"
 msgstr "Komponist"
 
-#: session_metadata_dialog.cc:757
+#: session_metadata_dialog.cc:760
 msgid "Conductor"
 msgstr "Leiter"
 
-#: session_metadata_dialog.cc:760
+#: session_metadata_dialog.cc:763
 msgid "Remixer"
 msgstr "Remixer"
 
-#: session_metadata_dialog.cc:763
+#: session_metadata_dialog.cc:766
 msgid "Arranger"
 msgstr "Arranger"
 
-#: session_metadata_dialog.cc:766
+#: session_metadata_dialog.cc:769
 msgid "Engineer"
 msgstr "Bearbeiter"
 
-#: session_metadata_dialog.cc:769
+#: session_metadata_dialog.cc:772
 msgid "Producer"
 msgstr "Produzent"
 
-#: session_metadata_dialog.cc:772
+#: session_metadata_dialog.cc:775
 msgid "DJ Mixer"
 msgstr "DJ Mixer"
 
-#: session_metadata_dialog.cc:775
+#: session_metadata_dialog.cc:778
 msgid "Metadata|Mixer"
 msgstr "Mixer"
 
-#: session_metadata_dialog.cc:783
+#: session_metadata_dialog.cc:786
 msgid "School"
 msgstr "Schule"
 
-#: session_metadata_dialog.cc:788
+#: session_metadata_dialog.cc:791
 msgid "Instructor"
 msgstr "Lehrender"
 
-#: session_metadata_dialog.cc:791
+#: session_metadata_dialog.cc:794
 msgid "Course"
 msgstr "Kurs"
 
-#: session_metadata_dialog.cc:799
+#: session_metadata_dialog.cc:802
 msgid "Edit Session Metadata"
 msgstr "Projekt-Metadaten bearbeiten"
 
-#: session_metadata_dialog.cc:830
+#: session_metadata_dialog.cc:833
 msgid "Import session metadata"
 msgstr "Projekt-Metadaten importieren"
 
-#: session_metadata_dialog.cc:851
+#: session_metadata_dialog.cc:854
 msgid "Choose session to import metadata from"
 msgstr "Wählen Sie das Projekt, aus dem Metadaten importiert werden sollen"
 
-#: session_metadata_dialog.cc:889
+#: session_metadata_dialog.cc:892
 msgid "This session file could not be read!"
 msgstr "Diese Projektdatei konnte nicht gelesen werden!"
 
-#: session_metadata_dialog.cc:899
+#: session_metadata_dialog.cc:902
 msgid ""
 "The session file didn't contain metadata!\n"
 "Maybe this is an old session format?"
@@ -12246,7 +13433,7 @@ msgstr ""
 "Das Projekt enthält keine Metadaten!\n"
 "Eventuell ein altes Projektformat?"
 
-#: session_metadata_dialog.cc:918
+#: session_metadata_dialog.cc:921
 msgid "Import all from:"
 msgstr "Alles importieren von:"
 
@@ -12467,6 +13654,11 @@ msgstr "WAVE-64"
 msgid "RF64 (WAV compatible)"
 msgstr "RF64 (WAV kompatibel)"
 
+#: session_option_editor.cc:210 session_option_editor.cc:216
+#: session_option_editor.cc:223
+msgid "Files|Locations"
+msgstr "Dateiorte"
+
 #: session_option_editor.cc:210
 msgid "File locations"
 msgstr "Dateipfade"
@@ -12662,26 +13854,14 @@ msgstr "<b>Eigenschaften der Audiodatei</b>"
 msgid "Timestamp:"
 msgstr "Zeitstempel:"
 
-#: sfdb_ui.cc:149
-msgid "Format:"
-msgstr "Format:"
-
-#: sfdb_ui.cc:188 sfdb_ui.cc:658
+#: sfdb_ui.cc:188 sfdb_ui.cc:659
 msgid "Tags:"
 msgstr "Stichworte:"
 
-#: sfdb_ui.cc:293 sfdb_ui.cc:409
-msgid "Could not read file: %1 (%2)."
-msgstr "Konnte Datei nicht lesen: %1 (%2)."
-
 #: sfdb_ui.cc:297
 msgid "<b>Midi File Information</b>"
 msgstr "<b>Midi Datei Information</b>"
 
-#: sfdb_ui.cc:458
-msgid "Could not access soundfile: "
-msgstr "Konnte auf Audiodatei nicht zugreifen: "
-
 #: sfdb_ui.cc:530
 msgid "SoundFileBox: Could not tokenize string: "
 msgstr "SoundFileBox: Konnte Zeichenkette nicht zerlegen: "
@@ -12702,11 +13882,11 @@ msgstr "Audiodateien"
 msgid "MIDI files"
 msgstr "MIDI-Dateien"
 
-#: sfdb_ui.cc:590 add_video_dialog.cc:123
+#: sfdb_ui.cc:590 add_video_dialog.cc:124
 msgid "All files"
 msgstr "Alle Dateien"
 
-#: sfdb_ui.cc:609 add_video_dialog.cc:246
+#: sfdb_ui.cc:609 add_video_dialog.cc:247
 msgid "Browse Files"
 msgstr "Durchsuchen"
 
@@ -12718,150 +13898,150 @@ msgstr "Pfade"
 msgid "Search Tags"
 msgstr "Stichwortsuche"
 
-#: sfdb_ui.cc:663
+#: sfdb_ui.cc:664
 msgid "Sort:"
 msgstr "Sortierung:"
 
-#: sfdb_ui.cc:671
+#: sfdb_ui.cc:672
 msgid "Longest"
 msgstr "Längste"
 
-#: sfdb_ui.cc:672
+#: sfdb_ui.cc:673
 msgid "Shortest"
 msgstr "Kürzeste"
 
-#: sfdb_ui.cc:673
+#: sfdb_ui.cc:674
 msgid "Newest"
 msgstr "Neueste"
 
-#: sfdb_ui.cc:674
+#: sfdb_ui.cc:675
 msgid "Oldest"
 msgstr "Ältestes"
 
-#: sfdb_ui.cc:675
+#: sfdb_ui.cc:676
 msgid "Most downloaded"
 msgstr "Am häufigsten heruntergeladen"
 
-#: sfdb_ui.cc:676
+#: sfdb_ui.cc:677
 msgid "Least downloaded"
 msgstr "Am seltensten heruntergeladen"
 
-#: sfdb_ui.cc:677
+#: sfdb_ui.cc:678
 msgid "Highest rated"
 msgstr "Bestbewertetes"
 
-#: sfdb_ui.cc:678
+#: sfdb_ui.cc:679
 msgid "Lowest rated"
 msgstr "Am schlechtesten bewertetes"
 
-#: sfdb_ui.cc:683
+#: sfdb_ui.cc:684
 msgid "More"
 msgstr "Mehr"
 
-#: sfdb_ui.cc:687
+#: sfdb_ui.cc:688
 msgid "Similar"
 msgstr "Ähnlich"
 
-#: sfdb_ui.cc:699
+#: sfdb_ui.cc:700
 msgid "ID"
 msgstr "ID"
 
-#: sfdb_ui.cc:700 add_video_dialog.cc:83
+#: sfdb_ui.cc:701 add_video_dialog.cc:84
 msgid "Filename"
 msgstr "Dateiname"
 
-#: sfdb_ui.cc:702
+#: sfdb_ui.cc:703 time_fx_dialog.cc:154
 msgid "Duration"
 msgstr "Dauer"
 
-#: sfdb_ui.cc:703
+#: sfdb_ui.cc:704
 msgid "Size"
 msgstr "Größe"
 
-#: sfdb_ui.cc:704
+#: sfdb_ui.cc:705
 msgid "Samplerate"
 msgstr "Samplerate"
 
-#: sfdb_ui.cc:705
+#: sfdb_ui.cc:706
 msgid "License"
 msgstr "Lizenz"
 
-#: sfdb_ui.cc:723
+#: sfdb_ui.cc:724
 msgid "Search Freesound"
 msgstr "Freesound durchsuchen"
 
-#: sfdb_ui.cc:739
+#: sfdb_ui.cc:741
 msgid "Press to import selected files"
 msgstr "Drücken Sie, um die gewählten Dateien zu importieren"
 
-#: sfdb_ui.cc:740
+#: sfdb_ui.cc:742
 msgid "Press to close this window without importing any files"
 msgstr ""
 "Drücken Sie hier, um dieses Fenster zu schließen, ohne Dateien zu importieren"
 
-#: sfdb_ui.cc:935
+#: sfdb_ui.cc:937
 msgid "SoundFileBrowser: Could not tokenize string: "
 msgstr "SoundFileBrowser: Konnte Zeichenkete nicht zerlegen:"
 
-#: sfdb_ui.cc:1135
+#: sfdb_ui.cc:1137
 msgid "%1 more page of 100 results available"
 msgid_plural "%1 more pages of 100 results available"
 msgstr[0] "%1 weitere Seite von 100 Ergebnissen verfügbar"
 msgstr[1] "%1 weitere Seiten von 100 Ergebnissen verfügbar"
 
-#: sfdb_ui.cc:1140
+#: sfdb_ui.cc:1142
 msgid "No more results available"
 msgstr "Keine weiteren Ergebnisse verfügbar"
 
-#: sfdb_ui.cc:1204
+#: sfdb_ui.cc:1206
 msgid "B"
 msgstr "B"
 
-#: sfdb_ui.cc:1206
+#: sfdb_ui.cc:1208
 msgid "kB"
 msgstr "kB"
 
-#: sfdb_ui.cc:1208 sfdb_ui.cc:1210
+#: sfdb_ui.cc:1210 sfdb_ui.cc:1212
 msgid "MB"
 msgstr "MB"
 
-#: sfdb_ui.cc:1212
+#: sfdb_ui.cc:1214
 msgid "GB"
 msgstr "GB"
 
-#: sfdb_ui.cc:1429 sfdb_ui.cc:1734 sfdb_ui.cc:1795 sfdb_ui.cc:1813
+#: sfdb_ui.cc:1431 sfdb_ui.cc:1728 sfdb_ui.cc:1764 sfdb_ui.cc:1782
 msgid "one track per file"
 msgstr "eine Spur pro Datei"
 
-#: sfdb_ui.cc:1432 sfdb_ui.cc:1796 sfdb_ui.cc:1814
+#: sfdb_ui.cc:1434 sfdb_ui.cc:1765 sfdb_ui.cc:1783
 msgid "one track per channel"
 msgstr "eine Spur pro Kanal"
 
-#: sfdb_ui.cc:1440 sfdb_ui.cc:1798 sfdb_ui.cc:1815
+#: sfdb_ui.cc:1442 sfdb_ui.cc:1767 sfdb_ui.cc:1784
 msgid "sequence files"
 msgstr "Dateien aneinanderreihen"
 
-#: sfdb_ui.cc:1443 sfdb_ui.cc:1803
+#: sfdb_ui.cc:1445 sfdb_ui.cc:1772
 msgid "all files in one track"
 msgstr "Alle Dateien in eine Spur"
 
-#: sfdb_ui.cc:1444 sfdb_ui.cc:1797
+#: sfdb_ui.cc:1446 sfdb_ui.cc:1766
 msgid "merge files"
 msgstr "Dateien zusammenfügen"
 
-#: sfdb_ui.cc:1450 sfdb_ui.cc:1800
+#: sfdb_ui.cc:1452 sfdb_ui.cc:1769
 msgid "one region per file"
 msgstr "eine Region pro Datei"
 
-#: sfdb_ui.cc:1453 sfdb_ui.cc:1801
+#: sfdb_ui.cc:1455 sfdb_ui.cc:1770
 msgid "one region per channel"
 msgstr "eine Region pro Kanal"
 
-#: sfdb_ui.cc:1458 sfdb_ui.cc:1802 sfdb_ui.cc:1816
+#: sfdb_ui.cc:1460 sfdb_ui.cc:1771 sfdb_ui.cc:1785
 msgid "all files in one region"
 msgstr "alle Dateien in einer Region"
 
-#: sfdb_ui.cc:1525
+#: sfdb_ui.cc:1527
 msgid ""
 "One or more of the selected files\n"
 "cannot be used by %1"
@@ -12869,100 +14049,100 @@ msgstr ""
 "Eine oder mehrere der ausgewählten Dateien\n"
 "können von %1 nicht verwendet werden"
 
-#: sfdb_ui.cc:1669
+#: sfdb_ui.cc:1671
 msgid "Copy files to session"
 msgstr "Kopiere Dateien in Projekt"
 
-#: sfdb_ui.cc:1688 sfdb_ui.cc:1856
+#: sfdb_ui.cc:1686 sfdb_ui.cc:1825
 msgid "file timestamp"
 msgstr "Zeitstempel"
 
-#: sfdb_ui.cc:1689 sfdb_ui.cc:1858
+#: sfdb_ui.cc:1687 sfdb_ui.cc:1827
 msgid "edit point"
 msgstr "Arbeitspunkt"
 
-#: sfdb_ui.cc:1690 sfdb_ui.cc:1860
+#: sfdb_ui.cc:1688 sfdb_ui.cc:1829
 msgid "playhead"
 msgstr "Positionszeiger"
 
-#: sfdb_ui.cc:1691
+#: sfdb_ui.cc:1689
 msgid "session start"
 msgstr "Projektanfang"
 
-#: sfdb_ui.cc:1697
+#: sfdb_ui.cc:1695
 msgid "<b>Add files ...</b>"
 msgstr "<b>Dateien hinzufügen ...</b>"
 
-#: sfdb_ui.cc:1709
+#: sfdb_ui.cc:1700
 msgid "<b>Insert at</b>"
 msgstr "<b>Einfügen bei</b>"
 
-#: sfdb_ui.cc:1722
+#: sfdb_ui.cc:1705
 msgid "<b>Mapping</b>"
 msgstr "<b>Zuordnung</b>"
 
-#: sfdb_ui.cc:1740
+#: sfdb_ui.cc:1710
 msgid "<b>Conversion quality</b>"
 msgstr "<b>Konvertierungsqualität:</b>"
 
-#: sfdb_ui.cc:1752
+#: sfdb_ui.cc:1715
 msgid "<b>Instrument</b>"
 msgstr "<b>Instrument</b>"
 
-#: sfdb_ui.cc:1764 sfdb_ui.cc:1872
+#: sfdb_ui.cc:1734 sfdb_ui.cc:1841
 msgid "Best"
 msgstr "bestmöglich"
 
-#: sfdb_ui.cc:1765 sfdb_ui.cc:1874
+#: sfdb_ui.cc:1735 sfdb_ui.cc:1843
 msgid "Good"
 msgstr "gut"
 
-#: sfdb_ui.cc:1766 sfdb_ui.cc:1876
+#: sfdb_ui.cc:1736 sfdb_ui.cc:1845
 msgid "Quick"
 msgstr "schnell"
 
-#: sfdb_ui.cc:1768
+#: sfdb_ui.cc:1738
 msgid "Fastest"
 msgstr "Schnellstmöglich"
 
-#: shuttle_control.cc:57
+#: shuttle_control.cc:64
 msgid "Shuttle speed control (Context-click for options)"
 msgstr "Abspielgeschwindigkeit (Rechtsklick für Optionen)"
 
-#: shuttle_control.cc:184
+#: shuttle_control.cc:202 time_fx_dialog.cc:164
 msgid "Percent"
 msgstr "Prozent"
 
-#: shuttle_control.cc:192
+#: shuttle_control.cc:210
 msgid "Units"
 msgstr "Einheiten"
 
-#: shuttle_control.cc:198 shuttle_control.cc:633
+#: shuttle_control.cc:216 shuttle_control.cc:679
 msgid "Sprung"
 msgstr "Feder"
 
-#: shuttle_control.cc:202 shuttle_control.cc:636
+#: shuttle_control.cc:220 shuttle_control.cc:682
 msgid "Wheel"
 msgstr "Drehrad"
 
-#: shuttle_control.cc:236
+#: shuttle_control.cc:254
 msgid "Maximum speed"
 msgstr "Max. Geschwindigkeit"
 
-#: shuttle_control.cc:239
+#: shuttle_control.cc:257
 msgid "Reset to 100%"
 msgstr "Auf 100% zurücksetzen"
 
-#: shuttle_control.cc:592
+#: shuttle_control.cc:641
 msgid "Playing"
 msgstr "Wiedergabe"
 
-#: shuttle_control.cc:607
+#: shuttle_control.cc:656
 #, c-format
 msgid "<<< %+d semitones"
 msgstr "<<< %+d Halbtöne"
 
-#: shuttle_control.cc:609
+#: shuttle_control.cc:658
 #, c-format
 msgid ">>> %+d semitones"
 msgstr ">>> %+d Halbtöne"
@@ -12991,7 +14171,7 @@ msgstr "Dateien herunterladbar machen"
 msgid "%1: %2 of %3 bytes uploaded"
 msgstr "%1: %2 von %3 bytes hochgeladen"
 
-#: splash.cc:75
+#: splash.cc:78
 msgid "%1 loading ..."
 msgstr "%1 startet ..."
 
@@ -13007,7 +14187,7 @@ msgstr "Lautsprecher entfernen"
 msgid "Azimuth:"
 msgstr "Azimut:"
 
-#: startup.cc:70
+#: startup.cc:71
 msgid ""
 "Use an external mixer or the hardware mixer of your audio interface.\n"
 "%1 will play NO role in monitoring"
@@ -13015,11 +14195,11 @@ msgstr ""
 "Verwende einen externen Mixer oder den Hardwaremixer der Audiohardware.\n"
 "%1 wird das Monitoring NICHT übernehmen."
 
-#: startup.cc:72
+#: startup.cc:73
 msgid "Ask %1 to play back material as it is being recorded"
 msgstr "%1 soll laufende Aufnahmen wiedergeben"
 
-#: startup.cc:145
+#: startup.cc:146
 msgid ""
 "<span size=\"larger\">%1 is a digital audio workstation. You can use it to "
 "record, edit and mix multi-track audio. You can produce your own CDs, mix "
@@ -13036,15 +14216,15 @@ msgstr ""
 "Es gibt ein paar Dinge, die vor dem ersten Programmstart konfiguriert werden "
 "müssen.</span>"
 
-#: startup.cc:171
+#: startup.cc:172
 msgid "Welcome to %1"
 msgstr "Willkommen bei %1"
 
-#: startup.cc:194
+#: startup.cc:195
 msgid "Default folder for %1 sessions"
 msgstr "Standardordner für %1 Projekte"
 
-#: startup.cc:200
+#: startup.cc:201
 msgid ""
 "Each project that you work on with %1 has its own folder.\n"
 "These can require a lot of disk space if you are recording audio.\n"
@@ -13061,11 +14241,11 @@ msgstr ""
 "<i>(Neue Projekte können überall abgespeichert werden, dies ist nur die "
 "Vorgabe)</i>"
 
-#: startup.cc:223
+#: startup.cc:224
 msgid "Default folder for new sessions"
 msgstr "Standardordner für neue Projekte"
 
-#: startup.cc:244
+#: startup.cc:245
 msgid ""
 "While recording instruments or vocals, you probably want to listen to the\n"
 "signal as well as record it. This is called \"monitoring\". There are\n"
@@ -13090,15 +14270,15 @@ msgstr ""
 "\n"
 "<i>Im Zweifelsfall akzeptieren Sie einfach die Voreinstellung.</i>"
 
-#: startup.cc:265
+#: startup.cc:266
 msgid "Monitoring Choices"
 msgstr "Auswahl des Monitoring"
 
-#: startup.cc:288
+#: startup.cc:289
 msgid "Use a Master bus directly"
 msgstr "Nutze den Master-Bus direkt"
 
-#: startup.cc:290
+#: startup.cc:291
 msgid ""
 "Connect the Master bus directly to your hardware outputs. This is preferable "
 "for simple usage."
@@ -13106,11 +14286,11 @@ msgstr ""
 "Verbinde den Master-Bus direkt mit den Audioausgängen. Wird für einfache "
 "Anwendungen empfohlen."
 
-#: startup.cc:299
+#: startup.cc:300
 msgid "Use an additional Monitor bus"
 msgstr "Nutze einen zusätzlichen Monitor-Bus"
 
-#: startup.cc:302
+#: startup.cc:303
 msgid ""
 "Use a Monitor bus between Master bus and hardware outputs for \n"
 "greater control in monitoring without affecting the mix."
@@ -13118,7 +14298,7 @@ msgstr ""
 "Nutze einen Monitor-Bus zwischen Master-Bus und Audioausgängen, um mehr\n"
 "Möglichkeiten für das Monitoring zu bekommen, ohne den Mix zu beeinflussen."
 
-#: startup.cc:324
+#: startup.cc:325
 msgid ""
 "<i>You can change this preference at any time via the Preferences dialog.\n"
 "You can also add or remove the monitor section to/from any session.</i>\n"
@@ -13132,46 +14312,42 @@ msgstr ""
 "\n"
 "</i>Im Zweifelsfall akzeptieren Sie einfach die Voreinstellung.</i>"
 
-#: startup.cc:335
+#: startup.cc:336
 msgid "Monitor Section"
 msgstr "Monitorsektion"
 
-#: step_entry.cc:60
+#: step_entry.cc:59
 msgid "Step Entry: %1"
 msgstr "Eingabemodus (Step Entry): %1"
 
-#: step_entry.cc:65
+#: step_entry.cc:64
 msgid ">beat"
 msgstr ">Schlag"
 
-#: step_entry.cc:66
+#: step_entry.cc:65
 msgid ">bar"
 msgstr ">Takt"
 
-#: step_entry.cc:67
+#: step_entry.cc:66
 msgid ">EP"
 msgstr ">AP"
 
-#: step_entry.cc:68
+#: step_entry.cc:67
 msgid "sustain"
 msgstr "Sustain"
 
-#: step_entry.cc:69
+#: step_entry.cc:68
 msgid "rest"
 msgstr "Pause"
 
-#: step_entry.cc:70
+#: step_entry.cc:69
 msgid "g-rest"
 msgstr "R-Pause"
 
-#: step_entry.cc:71
+#: step_entry.cc:70
 msgid "back"
 msgstr "zurück"
 
-#: step_entry.cc:82 step_entry.cc:85
-msgid "+"
-msgstr "+"
-
 #: step_entry.cc:191
 msgid "Set note length to a whole note"
 msgstr "Notenwert auf ganze Note setzen"
@@ -13280,11 +14456,11 @@ msgstr "MIDI Bank Change einfügen"
 msgid "Insert a program change message"
 msgstr "MIDI Program Change einfügen"
 
-#: step_entry.cc:343 step_entry.cc:700
+#: step_entry.cc:343 step_entry.cc:645
 msgid "Move Insert Position Back by Note Length"
 msgstr "Um einen Notenwert zurück gehen"
 
-#: step_entry.cc:344 step_entry.cc:698
+#: step_entry.cc:344 step_entry.cc:643
 msgid "Move Insert Position to Edit Point"
 msgstr "Eingabepunkt zum Arbeitspunkt verschieben"
 
@@ -13296,244 +14472,244 @@ msgstr "1/Note"
 msgid "Octave"
 msgstr "Oktave"
 
-#: step_entry.cc:598
+#: step_entry.cc:592
 msgid "Insert Note A"
 msgstr "Note A Einfügen"
 
-#: step_entry.cc:599
+#: step_entry.cc:593
 msgid "Insert Note A-sharp"
 msgstr "Ais einfügen"
 
-#: step_entry.cc:600
+#: step_entry.cc:594
 msgid "Insert Note B"
 msgstr "Note H Einfügen"
 
-#: step_entry.cc:601
+#: step_entry.cc:595
 msgid "Insert Note C"
 msgstr "Note C Einfügen"
 
-#: step_entry.cc:602
+#: step_entry.cc:596
 msgid "Insert Note C-sharp"
 msgstr "Cis einfügen"
 
-#: step_entry.cc:603
+#: step_entry.cc:597
 msgid "Insert Note D"
 msgstr "Note D Einfügen"
 
-#: step_entry.cc:604
+#: step_entry.cc:598
 msgid "Insert Note D-sharp"
 msgstr "Dis einfügen"
 
-#: step_entry.cc:605
+#: step_entry.cc:599
 msgid "Insert Note E"
 msgstr "Note E Einfügen"
 
-#: step_entry.cc:606
+#: step_entry.cc:600
 msgid "Insert Note F"
 msgstr "Note F Einfügen"
 
-#: step_entry.cc:607
+#: step_entry.cc:601
 msgid "Insert Note F-sharp"
 msgstr "Fis einfügen"
 
-#: step_entry.cc:608
+#: step_entry.cc:602
 msgid "Insert Note G"
 msgstr "Note G Einfügen"
 
-#: step_entry.cc:609
+#: step_entry.cc:603
 msgid "Insert Note G-sharp"
 msgstr "Gis einfügen"
 
-#: step_entry.cc:611
+#: step_entry.cc:605
 msgid "Insert a Note-length Rest"
 msgstr "Eine Pause einfügen"
 
-#: step_entry.cc:612
+#: step_entry.cc:606
 msgid "Insert a Snap-length Rest"
 msgstr "Eine Pause in der Länge einer Rastereinheit einfügen"
 
-#: step_entry.cc:614 step_entry.cc:615
+#: step_entry.cc:608 step_entry.cc:609
 msgid "Move to next octave"
 msgstr "Zu nächster Oktave gehen"
 
-#: step_entry.cc:617
+#: step_entry.cc:611
 msgid "Move to Next Note Length"
 msgstr "Zu nächster Notenlänge gehen"
 
-#: step_entry.cc:618
+#: step_entry.cc:612
 msgid "Move to Previous Note Length"
 msgstr "Zu voriger Notenlänge gehen"
 
-#: step_entry.cc:620
+#: step_entry.cc:614
 msgid "Increase Note Length"
 msgstr "Notenwert verlängern"
 
-#: step_entry.cc:621
+#: step_entry.cc:615
 msgid "Decrease Note Length"
 msgstr "Notenwert kürzen"
 
-#: step_entry.cc:623
+#: step_entry.cc:617
 msgid "Move to Next Note Velocity"
 msgstr "Zu nächster Velocity gehen"
 
-#: step_entry.cc:624
+#: step_entry.cc:618
 msgid "Move to Previous Note Velocity"
 msgstr "Zu voriger Velocity gehen"
 
-#: step_entry.cc:626
+#: step_entry.cc:620
 msgid "Increase Note Velocity"
 msgstr "Velocity erhöhen"
 
-#: step_entry.cc:627
+#: step_entry.cc:621
 msgid "Decrease Note Velocity"
 msgstr "Velocity verringern"
 
-#: step_entry.cc:629
+#: step_entry.cc:623
 msgid "Switch to the 1st octave"
 msgstr "Zur 1. Oktave wechseln"
 
-#: step_entry.cc:630
+#: step_entry.cc:624
 msgid "Switch to the 2nd octave"
 msgstr "Zur 2. Oktave wechseln"
 
-#: step_entry.cc:631
+#: step_entry.cc:625
 msgid "Switch to the 3rd octave"
 msgstr "Zur 3. Oktave wechseln"
 
-#: step_entry.cc:632
+#: step_entry.cc:626
 msgid "Switch to the 4th octave"
 msgstr "Zur 4. Oktave wechseln"
 
-#: step_entry.cc:633
+#: step_entry.cc:627
 msgid "Switch to the 5th octave"
 msgstr "Zur 5. Oktave wechseln"
 
-#: step_entry.cc:634
+#: step_entry.cc:628
 msgid "Switch to the 6th octave"
 msgstr "Zur 6. Oktave wechseln"
 
-#: step_entry.cc:635
+#: step_entry.cc:629
 msgid "Switch to the 7th octave"
 msgstr "Zur 7. Oktave wechseln"
 
-#: step_entry.cc:636
+#: step_entry.cc:630
 msgid "Switch to the 8th octave"
 msgstr "Zur 8. Oktave wechseln"
 
-#: step_entry.cc:637
+#: step_entry.cc:631
 msgid "Switch to the 9th octave"
 msgstr "Zur 9. Oktave wechseln"
 
-#: step_entry.cc:638
+#: step_entry.cc:632
 msgid "Switch to the 10th octave"
 msgstr "Zur 10. Oktave wechseln"
 
-#: step_entry.cc:639
+#: step_entry.cc:633
 msgid "Switch to the 11th octave"
 msgstr "Zur 11. Oktave wechseln"
 
-#: step_entry.cc:644
+#: step_entry.cc:635
+msgid "Toggle Triple Notes"
+msgstr "Triolen an/aus"
+
+#: step_entry.cc:638
+msgid "Toggle Chord Entry"
+msgstr "Akkordeingabe umschalten"
+
+#: step_entry.cc:640
+msgid "Sustain Selected Notes by Note Length"
+msgstr "Ausgewählte Noten ertönen über Notenlänge"
+
+#: step_entry.cc:650
 msgid "Set Note Length to Whole"
 msgstr "Notenwert auf ganze Note setzen"
 
-#: step_entry.cc:646
+#: step_entry.cc:652
 msgid "Set Note Length to 1/2"
 msgstr "Notenwert auf halbe Note setzen"
 
-#: step_entry.cc:648
+#: step_entry.cc:654
 msgid "Set Note Length to 1/3"
 msgstr "Notenwert auf drittel Note setzen"
 
-#: step_entry.cc:650
+#: step_entry.cc:656
 msgid "Set Note Length to 1/4"
 msgstr "Notenwert auf Viertelnote setzen"
 
-#: step_entry.cc:652
+#: step_entry.cc:658
 msgid "Set Note Length to 1/8"
 msgstr "Notenwert auf Achtelnote setzen"
 
-#: step_entry.cc:654
+#: step_entry.cc:660
 msgid "Set Note Length to 1/16"
 msgstr "Notenwert auf Sechzehntelnote setzen"
 
-#: step_entry.cc:656
+#: step_entry.cc:662
 msgid "Set Note Length to 1/32"
 msgstr "Notenwert auf Zweiunddreißigstelnote setzen"
 
-#: step_entry.cc:658
+#: step_entry.cc:664
 msgid "Set Note Length to 1/64"
 msgstr "Notenwert auf Vierundsechzigstelnote setzen"
 
-#: step_entry.cc:663
+#: step_entry.cc:669
 msgid "Set Note Velocity to Pianississimo"
 msgstr "Lautstärke (velocity) auf pianississimo setzen"
 
-#: step_entry.cc:665
+#: step_entry.cc:671
 msgid "Set Note Velocity to Pianissimo"
 msgstr "Lautstärke (velocity) auf pianissimo setzen"
 
-#: step_entry.cc:667
+#: step_entry.cc:673
 msgid "Set Note Velocity to Piano"
 msgstr "Lautstärke (velocity) auf piano setzen"
 
-#: step_entry.cc:669
+#: step_entry.cc:675
 msgid "Set Note Velocity to Mezzo-Piano"
 msgstr "Lautstärke (velocity) auf mezzo-piano setzen"
 
-#: step_entry.cc:671
+#: step_entry.cc:677
 msgid "Set Note Velocity to Mezzo-Forte"
 msgstr "Lautstärke (velocity) auf mezzo-forte setzen"
 
-#: step_entry.cc:673
+#: step_entry.cc:679
 msgid "Set Note Velocity to Forte"
 msgstr "Lautstärke (velocity) auf forte setzen"
 
-#: step_entry.cc:675 step_entry.cc:677
+#: step_entry.cc:681 step_entry.cc:683
 msgid "Set Note Velocity to Fortississimo"
 msgstr "Lautstärke (velocity) auf fortississimo setzen"
 
-#: step_entry.cc:679
-msgid "Toggle Triple Notes"
-msgstr "Triolen an/aus"
-
-#: step_entry.cc:684
+#: step_entry.cc:688
 msgid "No Dotted Notes"
 msgstr "Keine punktierten Noten"
 
-#: step_entry.cc:686
+#: step_entry.cc:689
 msgid "Toggled Dotted Notes"
 msgstr "Punktierte Noten an/aus"
 
-#: step_entry.cc:688
+#: step_entry.cc:690
 msgid "Toggled Double-Dotted Notes"
 msgstr "Doppelt punktierte Noten an/aus"
 
-#: step_entry.cc:690
+#: step_entry.cc:691
 msgid "Toggled Triple-Dotted Notes"
 msgstr "Punktierte Triolen an/aus"
 
-#: step_entry.cc:693
-msgid "Toggle Chord Entry"
-msgstr "Akkordeingabe umschalten"
-
-#: step_entry.cc:695
-msgid "Sustain Selected Notes by Note Length"
-msgstr "Ausgewählte Noten ertönen über Notenlänge"
-
-#: stereo_panner.cc:127
+#: stereo_panner.cc:129
 #, c-format
 msgid "L:%3d R:%3d Width:%d%%"
 msgstr "L:%3d R:%3d Breite:%d%%"
 
-#: stereo_panner.cc:270
+#: stereo_panner.cc:272
 msgid "Panner|M"
 msgstr "M"
 
-#: stereo_panner_editor.cc:35
+#: stereo_panner_editor.cc:37
 msgid "Stereo Panner"
 msgstr "Stereo Panner"
 
-#: stereo_panner_editor.cc:49
+#: stereo_panner_editor.cc:51
 msgid "Width"
 msgstr "Breite"
 
@@ -13541,6 +14717,10 @@ msgstr "Breite"
 msgid "Strip Silence"
 msgstr "Stille entfernen"
 
+#: strip_silence_dialog.cc:65
+msgid "Threshold"
+msgstr "Threshold"
+
 #: strip_silence_dialog.cc:76
 msgid "Minimum length"
 msgstr "Mindestlänge"
@@ -13549,168 +14729,177 @@ msgstr "Mindestlänge"
 msgid "Fade length"
 msgstr "Fade-Länge"
 
-#: strip_silence_dialog.cc:111 strip_silence_dialog.cc:295
+#: strip_silence_dialog.cc:111 strip_silence_dialog.cc:298
 msgid "Analyzing"
 msgstr "Analysiere"
 
-#: tempo_dialog.cc:41 tempo_dialog.cc:57
+#: tempo_dialog.cc:43 tempo_dialog.cc:60
 msgid "bar:"
 msgstr "Takt:"
 
-#: tempo_dialog.cc:42 tempo_dialog.cc:58
+#: tempo_dialog.cc:44 tempo_dialog.cc:61
 msgid "beat:"
 msgstr "Schlag:"
 
-#: tempo_dialog.cc:43 tempo_dialog.cc:59
+#: tempo_dialog.cc:45 tempo_dialog.cc:62
 msgid "Pulse note"
 msgstr "Pulsnote"
 
-#: tempo_dialog.cc:44 tempo_dialog.cc:60
+#: tempo_dialog.cc:46 tempo_dialog.cc:63
 msgid "Tap tempo"
 msgstr "Tempo tappen"
 
-#: tempo_dialog.cc:77 tempo_dialog.cc:78 tempo_dialog.cc:343
-#: tempo_dialog.cc:344
+#: tempo_dialog.cc:81 tempo_dialog.cc:82 tempo_dialog.cc:448
+#: tempo_dialog.cc:449
 msgid "whole"
 msgstr "Ganze"
 
-#: tempo_dialog.cc:79 tempo_dialog.cc:80 tempo_dialog.cc:345
-#: tempo_dialog.cc:346
+#: tempo_dialog.cc:83 tempo_dialog.cc:84 tempo_dialog.cc:450
+#: tempo_dialog.cc:451
 msgid "second"
 msgstr "Halbe"
 
-#: tempo_dialog.cc:81 tempo_dialog.cc:82 tempo_dialog.cc:347
-#: tempo_dialog.cc:348
+#: tempo_dialog.cc:85 tempo_dialog.cc:86 tempo_dialog.cc:452
+#: tempo_dialog.cc:453
 msgid "third"
 msgstr "Drittel"
 
-#: tempo_dialog.cc:83 tempo_dialog.cc:84 tempo_dialog.cc:349
-#: tempo_dialog.cc:350
+#: tempo_dialog.cc:87 tempo_dialog.cc:88 tempo_dialog.cc:454
+#: tempo_dialog.cc:455
 msgid "quarter"
 msgstr "Viertel"
 
-#: tempo_dialog.cc:85 tempo_dialog.cc:86 tempo_dialog.cc:351
-#: tempo_dialog.cc:352
+#: tempo_dialog.cc:89 tempo_dialog.cc:90 tempo_dialog.cc:456
+#: tempo_dialog.cc:457
 msgid "eighth"
 msgstr "Achtel"
 
-#: tempo_dialog.cc:87 tempo_dialog.cc:88 tempo_dialog.cc:353
-#: tempo_dialog.cc:354
+#: tempo_dialog.cc:91 tempo_dialog.cc:92 tempo_dialog.cc:458
+#: tempo_dialog.cc:459
 msgid "sixteenth"
 msgstr "Sechzehntel"
 
-#: tempo_dialog.cc:89 tempo_dialog.cc:90 tempo_dialog.cc:355
-#: tempo_dialog.cc:356
+#: tempo_dialog.cc:93 tempo_dialog.cc:94 tempo_dialog.cc:460
+#: tempo_dialog.cc:461
 msgid "thirty-second"
 msgstr "Zweiunddreissigstel"
 
-#: tempo_dialog.cc:91 tempo_dialog.cc:92 tempo_dialog.cc:357
-#: tempo_dialog.cc:358
+#: tempo_dialog.cc:95 tempo_dialog.cc:96 tempo_dialog.cc:462
+#: tempo_dialog.cc:463
 msgid "sixty-fourth"
 msgstr "Vierundsechzigstelnote"
 
-#: tempo_dialog.cc:93 tempo_dialog.cc:94 tempo_dialog.cc:359
-#: tempo_dialog.cc:360
+#: tempo_dialog.cc:97 tempo_dialog.cc:98 tempo_dialog.cc:464
+#: tempo_dialog.cc:465
 msgid "one-hundred-twenty-eighth"
 msgstr "Hundertachtundzwanzigstelnote"
 
-#: tempo_dialog.cc:121
+#: tempo_dialog.cc:115 tempo_dialog.cc:116
+msgid "ramped"
+msgstr "verlaufend"
+
+#: tempo_dialog.cc:117 tempo_dialog.cc:118
+msgid "constant"
+msgstr "konstant"
+
+#: tempo_dialog.cc:133 tempo_dialog.cc:134 tempo_dialog.cc:482
+#: tempo_dialog.cc:483
+msgid "music"
+msgstr "Musik"
+
+#: tempo_dialog.cc:161
 msgid "Beats per minute:"
 msgstr "Schläge pro Minute:"
 
-#: tempo_dialog.cc:155
+#: tempo_dialog.cc:195
 msgid "Tempo begins at"
 msgstr "Tempo beginnt bei"
 
-#: tempo_dialog.cc:254
+#: tempo_dialog.cc:201
+msgid "Lock Style:"
+msgstr "Sperrstil:"
+
+#: tempo_dialog.cc:209
+msgid "Tempo Type:"
+msgstr "Tempotyp:"
+
+#: tempo_dialog.cc:321
 msgid "incomprehensible pulse note type (%1)"
 msgstr "Unverständlicher Puls-Notentyp (%1)"
 
-#: tempo_dialog.cc:375
+#: tempo_dialog.cc:334
+msgid "incomprehensible tempo type (%1)"
+msgstr "unverständlicher Tempotyp (%1)"
+
+#: tempo_dialog.cc:347
+msgid "incomprehensible lock style (%1)"
+msgstr "unverständlicher Sperrstil (%1)"
+
+#: tempo_dialog.cc:498
 msgid "Note value:"
 msgstr "Notenwert:"
 
-#: tempo_dialog.cc:376
+#: tempo_dialog.cc:499
+msgid "Lock style:"
+msgstr "Sperrstil:"
+
+#: tempo_dialog.cc:500
 msgid "Beats per bar:"
 msgstr "Schläge pro Takt:"
 
-#: tempo_dialog.cc:390
+#: tempo_dialog.cc:514
 msgid "Meter begins at bar:"
 msgstr "Taktart beginnt bei Takt:"
 
-#: tempo_dialog.cc:503
+#: tempo_dialog.cc:638
 msgid "incomprehensible meter note type (%1)"
 msgstr "Unverständlicher Signatur-Notentyp (%1)"
 
-#: theme_manager.cc:61
-msgid "Dark Theme"
-msgstr "Dunkles Thema"
-
-#: theme_manager.cc:62
-msgid "Light Theme"
-msgstr "Helles Thema"
-
-#: theme_manager.cc:63
-msgid "Restore Defaults"
-msgstr "Standards wiederherstellen"
+#: tempo_dialog.cc:651
+msgid "incomprehensible meter lock style (%1)"
+msgstr "unverständlicher Sperrstil für Metrum (%1)"
 
-#: theme_manager.cc:64
+#: theme_manager.cc:53
 msgid "Draw \"flat\" buttons"
 msgstr "Zeichne \"flache\" Schaltflächen"
 
-#: theme_manager.cc:65
+#: theme_manager.cc:54
 msgid "Blink Rec-Arm buttons"
 msgstr "Aufnahmebereitschaftsknopf blinkt"
 
-#: theme_manager.cc:66
+#: theme_manager.cc:55
 msgid "Color regions using their track's color"
 msgstr "Färbe Regionen in der Spurfarbe ein"
 
-#: theme_manager.cc:67
+#: theme_manager.cc:56
 msgid "Show waveform clipping"
 msgstr "Clipping der Wellenform anzeigen"
 
-#: theme_manager.cc:69
+#: theme_manager.cc:58
 msgid "Waveforms color gradient depth"
 msgstr "Farbverlaufs-Intensität der Wellenform"
 
-#: theme_manager.cc:71
+#: theme_manager.cc:60
 msgid "Timeline item gradient depth"
 msgstr "Farbverlaufs-Intensität von Zeitleisten-Objekten "
 
-#: theme_manager.cc:72
+#: theme_manager.cc:61
 msgid "All floating windows are dialogs"
 msgstr "Alle schwebenden Fenster sind Dialoge"
 
-#: theme_manager.cc:73
+#: theme_manager.cc:62
 msgid "Transient windows follow front window."
 msgstr "Transientenfenster folgt Hauptfenster"
 
-#: theme_manager.cc:74
+#: theme_manager.cc:63
 msgid "Float detached monitor-section window"
 msgstr "Abgelöstes Monitorsektionfenster schwebend"
 
-#: theme_manager.cc:75
+#: theme_manager.cc:64
 msgid "Icon Set"
 msgstr "Icon-Satz"
 
-#: theme_manager.cc:84
-msgid "Object"
-msgstr "Objekt"
-
-#: theme_manager.cc:162
-msgid "Items"
-msgstr "Objekte"
-
-#: theme_manager.cc:163
-msgid "Palette"
-msgstr "Palette"
-
-#: theme_manager.cc:164
-msgid "Transparency"
-msgstr "Transparenz"
-
-#: theme_manager.cc:195
+#: theme_manager.cc:132
 msgid ""
 "Mark all floating windows to be type \"Dialog\" rather than using \"Utility"
 "\" for some.\n"
@@ -13722,7 +14911,7 @@ msgstr ""
 "Dies kann bei einigen Fenstermanagern helfen. Sie müssen %1 starten, um "
 "diese Option zu aktivieren"
 
-#: theme_manager.cc:199
+#: theme_manager.cc:136
 msgid ""
 "Make transient windows follow the front window when toggling between the "
 "editor and mixer.\n"
@@ -13732,21 +14921,17 @@ msgstr ""
 "Vordergrund-Fenster.\n"
 "Dies erfordert einen Neustart von %1."
 
-#: theme_manager.cc:202
+#: theme_manager.cc:139
 msgid ""
 "When detaching the monitoring section, mark it as \"Utility\" window to stay "
 "in front.\n"
 "This requires a restart of %1 to take effect"
 msgstr ""
-"Beim Ablösen der Monitorsektion als \"Utility\"fenster markieren, damit es im "
-"Vordergrund bleibt.\n"
+"Beim Ablösen der Monitorsektion als \"Utility\"fenster markieren, damit es "
+"im Vordergrund bleibt.\n"
 "Dies erfordert einen Neustart von %1"
 
-#: theme_manager.cc:643
-msgid "Color Palette"
-msgstr "Farbpalette"
-
-#: time_axis_view.cc:150
+#: time_axis_view.cc:148
 msgid "Track/Bus name (double click to edit)"
 msgstr "Spur-/Busname (Doppelklick zum Bearbeiten)"
 
@@ -13756,71 +14941,71 @@ msgid_plural "new duration of %1 frames is out of bounds for %2"
 msgstr[0] "neue Dauer %1 Frame ist außerhalb des erlaubten Bereichs für %2"
 msgstr[1] "neue Dauer %1 Frames ist außerhalb des erlaubten Bereichs für %2"
 
-#: time_fx_dialog.cc:62
+#: time_fx_dialog.cc:60
 msgid "Quick but Ugly"
 msgstr "Schnell, aber hässlich"
 
-#: time_fx_dialog.cc:63
+#: time_fx_dialog.cc:61
 msgid "Skip Anti-aliasing"
 msgstr "Ãœberspringe Anti-Aliasing"
 
-#: time_fx_dialog.cc:64
-msgid "Contents:"
-msgstr "Inhalt:"
+#: time_fx_dialog.cc:62
+msgid "Contents"
+msgstr "Inhalt"
 
-#: time_fx_dialog.cc:65
+#: time_fx_dialog.cc:63
 msgid "Minimize time distortion"
 msgstr "zeitliche Verzerrung minimieren"
 
-#: time_fx_dialog.cc:66
+#: time_fx_dialog.cc:64
 msgid "Preserve Formants"
 msgstr "Formanten beibehalten"
 
-#: time_fx_dialog.cc:71
+#: time_fx_dialog.cc:81
 msgid "TimeFXDialog"
 msgstr "TimeFXDialog"
 
-#: time_fx_dialog.cc:74
+#: time_fx_dialog.cc:84
 msgid "Pitch Shift Audio"
 msgstr "Tonhöhe ändern"
 
-#: time_fx_dialog.cc:76
+#: time_fx_dialog.cc:86
 msgid "Time Stretch Audio"
 msgstr "Time Stretch Audio"
 
-#: time_fx_dialog.cc:104 transpose_dialog.cc:41
+#: time_fx_dialog.cc:114 transpose_dialog.cc:41
 msgid "Octaves:"
 msgstr "Oktaven:"
 
-#: time_fx_dialog.cc:109 transpose_dialog.cc:46
+#: time_fx_dialog.cc:119 transpose_dialog.cc:46
 msgid "Semitones:"
 msgstr "Halbtöne:"
 
-#: time_fx_dialog.cc:114
+#: time_fx_dialog.cc:124
 msgid "Cents:"
 msgstr "Cents:"
 
-#: time_fx_dialog.cc:122
+#: time_fx_dialog.cc:132
 msgid "Time|Shift"
 msgstr "Tonhöhe ändern"
 
-#: time_fx_dialog.cc:146 time_fx_dialog.cc:149
+#: time_fx_dialog.cc:184 time_fx_dialog.cc:188
 msgid "TimeFXButton"
 msgstr "TimeFXButton"
 
-#: time_fx_dialog.cc:154
+#: time_fx_dialog.cc:193
 msgid "Stretch/Shrink"
 msgstr "Strecken/Stauchen"
 
-#: time_fx_dialog.cc:164
+#: time_fx_dialog.cc:203
 msgid "<b>Progress</b>"
 msgstr "<b>Fortschritt</b>"
 
-#: time_info_box.cc:124
+#: time_info_box.cc:118
 msgid "Start recording at auto-punch start"
 msgstr "Aufnahme am Anfang des Punchbereichs starten"
 
-#: time_info_box.cc:125
+#: time_info_box.cc:119
 msgid "Stop recording at auto-punch end"
 msgstr "Aufnahme am Ende des Punchbereichs beenden"
 
@@ -13889,154 +15074,202 @@ msgstr "MIDI Transponieren"
 msgid "Transpose"
 msgstr "Transponieren"
 
-#: ui_config.cc:230 ui_config.cc:368
+#: ui_config.cc:234 ui_config.cc:422
 msgid "Loading default ui configuration file %1"
 msgstr "lade voreingestellte UI-Konfigurationsdatei %1"
 
-#: ui_config.cc:233 ui_config.cc:371
+#: ui_config.cc:237 ui_config.cc:425
 msgid "cannot read default ui configuration file \"%1\""
 msgstr "Kann die voreingestellte UI-Konfigurationsdatei \"%1\" nicht lesen"
 
-#: ui_config.cc:236 ui_config.cc:376
+#: ui_config.cc:240 ui_config.cc:430
 msgid "default ui configuration file \"%1\" not loaded successfully."
 msgstr ""
 "Die voreingestellte UI-Konfigurationsdatei \"%1\" konnte nicht geladen "
 "werden."
 
-#: ui_config.cc:244
+#: ui_config.cc:248
 msgid "Could not find default UI configuration file %1"
 msgstr "Konnte UI-Konfigurationsdatei für Voreinstellungen %1 nicht finden"
 
-#: ui_config.cc:287
+#: ui_config.cc:289
 msgid "Loading color file %1"
 msgstr "Lade Farbdatei %1"
 
-#: ui_config.cc:290
+#: ui_config.cc:292
 msgid "cannot read color file \"%1\""
 msgstr "kann Farbdatei \"%1\" nicht lesen"
 
-#: ui_config.cc:295
+#: ui_config.cc:297
 msgid "color file \"%1\" not loaded successfully."
 msgstr "Farbdatei \"%1\" konnte nicht geladen werden."
 
-#: ui_config.cc:301
-msgid "Color file %1 not found"
-msgstr "Farbdatei %1 nicht gefunden"
+#: ui_config.cc:325
+msgid "Color file for %1 not found along %2"
+msgstr "Farbdatei für %1 unter %2 nicht gefunden"
 
-#: ui_config.cc:350 ui_config.cc:429
+#: ui_config.cc:403 ui_config.cc:486
 msgid "Color file %1 not saved"
 msgstr "Farbdatei %1 nicght gespeichert"
 
-#: ui_config.cc:385
+#: ui_config.cc:439
 msgid "Loading user ui configuration file %1"
 msgstr "Lade benutzerdefinierte UI-Konfigurationsdatei %1"
 
-#: ui_config.cc:388
+#: ui_config.cc:442
 msgid "cannot read ui configuration file \"%1\""
 msgstr "kann die UI-Konfigurationsdatei \"%1\" nicht lesen"
 
-#: ui_config.cc:393
+#: ui_config.cc:447
 msgid "user ui configuration file \"%1\" not loaded successfully."
 msgstr ""
 "Die benutzerdefinierte UI-Konfigurationsdatei \"%1\" konnte nicht geladen "
 "werden."
 
-#: ui_config.cc:401
+#: ui_config.cc:455
 msgid "could not find any ui configuration file, canvas will look broken."
 msgstr ""
 "Konnte keine UI-Konfigurationsdatei finden, die Arbeitsfläche wird nicht "
 "korrekt dargestellt werden."
 
-#: ui_config.cc:419
+#: ui_config.cc:476
 msgid "Config file %1 not saved"
 msgstr "Konfigurationsdatei %1 nicht gespeichert"
 
-#: ui_config.cc:660
+#: ui_config.cc:720
 msgid "Color %1 not found"
 msgstr "Farbe %1 nicht gefunden"
 
-#: ui_config.cc:730
+#: ui_config.cc:790
 msgid "Unable to find UI style file %1 in search path %2. %3 will look strange"
 msgstr ""
 "Kann den UI-Stil Datei %1 im Suchpfad %2 nicht finden. %3 wird merkwürdig "
 "aussehen"
 
-#: utils.cc:114 utils.cc:157
+#: utils.cc:118 utils.cc:161
 msgid "bad XPM header %1"
 msgstr "Fehlerhafter XPM Header %1"
 
-#: utils.cc:574
+#: utils.cc:365
 msgid "cannot find XPM file for %1"
 msgstr "Konnte XPM-Datei für %1 nicht finden"
 
-#: utils.cc:594 utils.cc:624 utils.cc:638
+#: utils.cc:418 utils.cc:448 utils.cc:468
 msgid "default"
 msgstr "voreingestellt"
 
-#: utils.cc:639
+#: utils.cc:469
 msgid "icon \"%1\" not found for icon set \"%2\", fallback to default"
 msgstr ""
 "Icon \"%1\" wurde im Icon-Satz \"%2\" nicht gefunden, greife auf "
 "Voreinstellung zurück"
 
-#: utils.cc:646
+#: utils.cc:476
 msgid "cannot find icon image for %1 using %2"
 msgstr "Konnte Icon-Bild für %1 unter %2 nicht finden"
 
-#: utils.cc:663 utils.cc:679
+#: utils.cc:493 utils.cc:509
 msgid "Caught exception while loading icon named %1"
 msgstr ""
 "Während des Ladens des Icons mit dem Namen %1 trat ein Ausnahmefehler auf"
 
-#: utils.cc:939
+#: utils.cc:759
 msgid "Overwrite"
 msgstr "Ãœberschreiben"
 
-#: add_video_dialog.cc:54
+#: vca_master_strip.cc:74 vca_time_axis.cc:49
+msgid "Solo slaves"
+msgstr "Solo Slaves"
+
+#: vca_master_strip.cc:79 vca_time_axis.cc:55
+msgid "Mute slaves"
+msgstr "Mute Slaves"
+
+#: vca_master_strip.cc:83
+msgid "Hide this VCA strip"
+msgstr "diesen VCA-Kanalzug verstecken"
+
+#: vca_master_strip.cc:108 vca_master_strip.cc:418
+msgid "Click to show slaves only"
+msgstr "Klicken, um nur Slaves anzuzeigen"
+
+#: vca_master_strip.cc:293
+msgid "A"
+msgstr "A"
+
+#: vca_master_strip.cc:300
+msgid "S"
+msgstr "S"
+
+#: vca_master_strip.cc:398
+msgid "Drop All Slaves"
+msgstr "Alle Slaves lösen"
+
+#: vca_master_strip.cc:421
+msgid "Click to show normal mixer"
+msgstr "Klicken, um normalen Mixer anzuzeigen"
+
+#: add_video_dialog.cc:55
 msgid "Set Video Track"
 msgstr "Videospur-Einstellungen"
 
-#: add_video_dialog.cc:62
+#: add_video_dialog.cc:63
 msgid "Open Video Monitor Window"
 msgstr "Videomonitorfenster öffnen"
 
-#: add_video_dialog.cc:63
+#: add_video_dialog.cc:64
 msgid "Adjust Session Framerate to Match Video Framerate"
 msgstr "Projekt-Framerate an Video-Framerate anpassen"
 
-#: add_video_dialog.cc:65
+#: add_video_dialog.cc:66
 msgid "Reload docroot"
 msgstr "docroot neu laden"
 
-#: add_video_dialog.cc:120
+#: add_video_dialog.cc:121
 msgid "Video files"
 msgstr "Videodateien"
 
-#: add_video_dialog.cc:149
+#: add_video_dialog.cc:150
 msgid "<b>Video Information</b>"
 msgstr "<b>Videoinformationen</b>"
 
-#: add_video_dialog.cc:152
+#: add_video_dialog.cc:153
 msgid "Start:"
 msgstr "Start:"
 
-#: add_video_dialog.cc:158
+#: add_video_dialog.cc:159
 msgid "Frame rate:"
 msgstr "Framerate:"
 
-#: add_video_dialog.cc:161
+#: add_video_dialog.cc:162
 msgid "Aspect Ratio:"
 msgstr "Seitenverhältnis:"
 
-#: add_video_dialog.cc:244
+#: add_video_dialog.cc:245
 msgid "VideoServerIndex"
 msgstr "VideoServerIndex"
 
-#: add_video_dialog.cc:675
+#: add_video_dialog.cc:676
 msgid " %1 fps"
 msgstr " %1 fps"
 
-#: video_timeline.cc:472
+#: vca_time_axis.cc:60
+msgid "D"
+msgstr "D"
+
+#: vca_time_axis.cc:61
+msgid "Unassign all slaves"
+msgstr "Alle Slave-Zuweisungen aufheben"
+
+#: vca_time_axis.cc:65
+msgid "V"
+msgstr "V"
+
+#: vca_time_axis.cc:66
+msgid "Show only slaves"
+msgstr "Nur Slaves anzeigen"
+
+#: video_timeline.cc:473
 msgid ""
 "Parsing video file info failed. Is the Video Server running? Is the file "
 "readable by the Video Server? Does the docroot match? Is it a video file?"
@@ -14045,7 +15278,7 @@ msgstr ""
 "den Videoserver lesbar? Ist die docroot passend eingestellt? Ist die Datei "
 "tatsächlich eine Videodatei?"
 
-#: video_timeline.cc:510
+#: video_timeline.cc:511
 msgid ""
 "Failed to set session-framerate: '%1' does not have a corresponding option "
 "setting in %2."
@@ -14053,7 +15286,7 @@ msgstr ""
 "Setzen der Projektframerate fehlgeschlagen: '%1' hat keine entsprechende "
 "Einstellungsoption in %2."
 
-#: video_timeline.cc:518
+#: video_timeline.cc:519
 msgid ""
 "Video file's framerate is not equal to %1 session timecode's framerate: '%2' "
 "vs '%3'"
@@ -14061,7 +15294,7 @@ msgstr ""
 "Framerate der Videodatei entspricht nicht der Framerate des Timecodes im %1-"
 "Projekt: '%2' vs. '%3'"
 
-#: video_timeline.cc:591
+#: video_timeline.cc:592
 msgid ""
 "Video-server docroot mismatch. %1: '%2', video-server: '%3'. This usually "
 "means that the video server was not started by %1 and uses a different "
@@ -14071,7 +15304,7 @@ msgstr ""
 "Das bedeutet üblicherweise, dass der Videoserver nicht von %1 gestartet "
 "wurde und einen anderen Dokumenten-Wurzelpfad verwendet."
 
-#: video_timeline.cc:728
+#: video_timeline.cc:729
 msgid ""
 "Video-monitor 'xjadeo' was not found. Please install http://xjadeo.sf.net/ "
 "(a custom path to xjadeo can be specified by setting the XJREMOTE "
@@ -14088,11 +15321,11 @@ msgstr ""
 "\n"
 "Siehe auch http://manual.ardour.org/video-timeline/setup/"
 
-#: video_timeline.cc:743
+#: video_timeline.cc:744
 msgid "Video-monitor 'xjadeo' cannot be launched."
 msgstr "Videomonitor 'xjadeo' kann nicht gestartet werden."
 
-#: video_timeline.cc:770
+#: video_timeline.cc:776
 msgid ""
 "Video-monitor 'xjadeo' is too old. Please install xjadeo version 0.7.7 or "
 "later. http://xjadeo.sf.net/"
@@ -14100,7 +15333,7 @@ msgstr ""
 "Videomonitor 'xjadeo' ist zu alt. Bitte installieren Sie xjadeo in Version "
 "0.7.7 oder höher. http://xjadeo.sf.net/"
 
-#: video_monitor.cc:285
+#: video_monitor.cc:283
 msgid "Video Monitor: File Not Found."
 msgstr "Videomonitor: Datei nicht gefunden."
 
@@ -14129,11 +15362,10 @@ msgstr ""
 "ebenfalls mit dem Videoserver auf http://x42.github.com/harvid/ erhältlich.\n"
 "\n"
 "Wichtig: Die Dateien müssen in $PATH installiert werden und nach "
-"ffmpeg_harvid "
-"und ffprobe_harvid umbenannt werden.\n"
+"ffmpeg_harvid und ffprobe_harvid umbenannt werden.\n"
 "Falls Sie eine geeignete ffmpeg-Installation auf Ihrem System haben, "
-"empfehlen wir, symbolische Verknüpfungen von ffmpeg auf ffmpeg_harvid und von "
-"ffprobe auf ffprobe_harvid zu erzeugen.\n"
+"empfehlen wir, symbolische Verknüpfungen von ffmpeg auf ffmpeg_harvid und "
+"von ffprobe auf ffprobe_harvid zu erzeugen.\n"
 "\n"
 "Sehen Sie auch  http://manual.ardour.org/video-timeline/setup/"
 
@@ -14175,8 +15407,7 @@ msgid ""
 "window for more information."
 msgstr ""
 "Keine ffmpeg-Installation gefunden. Videoimport ist nicht möglich. Sehen Sie "
-"im "
-"Logfenster nach weiteren Informationen."
+"im Logfenster nach weiteren Informationen."
 
 #: transcode_video_dialog.cc:120
 msgid ""
@@ -14191,10 +15422,6 @@ msgstr ""
 msgid "FPS:"
 msgstr "FPS:"
 
-#: transcode_video_dialog.cc:139
-msgid "Duration:"
-msgstr "Dauer:"
-
 #: transcode_video_dialog.cc:141
 msgid "Codec:"
 msgstr "Codec:"
@@ -14258,7 +15485,7 @@ msgstr "Extrahiere Audio..."
 
 #: transcode_video_dialog.cc:377
 msgid "Audio Extraction Failed."
-msgstr "Extrahieren des Audio gescheitert."
+msgstr "Extrahieren des Audio fehlgeschlagen."
 
 #: transcode_video_dialog.cc:403
 msgid "Transcoding Video.."
@@ -14266,7 +15493,7 @@ msgstr "Transkodiere Video.."
 
 #: transcode_video_dialog.cc:437
 msgid "Transcoding Failed."
-msgstr "Transkodieren gescheitert"
+msgstr "Transkodieren fehlgeschlagen."
 
 #: transcode_video_dialog.cc:541
 msgid "Save Transcoded Video File"
@@ -14331,11 +15558,11 @@ msgstr "Setze Video-Serverpfad"
 msgid "Server docroot"
 msgstr "Server-docroot"
 
-#: utils_videotl.cc:61
+#: utils_videotl.cc:63
 msgid "Destination is outside Video Server's docroot. "
 msgstr "Ziel ist ausserhalb der docroot des Videoservers."
 
-#: utils_videotl.cc:62
+#: utils_videotl.cc:64
 msgid ""
 "The destination file path is outside of the Video Server's docroot. The file "
 "will not be readable by the Video Server. Do you still want to continue?"
@@ -14344,15 +15571,15 @@ msgstr ""
 "Videoservers. Die Datei wird für den Videoserver nicht lesbar sein. Wollen "
 "Sie wirklich fortfahren?"
 
-#: utils_videotl.cc:65
+#: utils_videotl.cc:67
 msgid "Continue"
 msgstr "Fortfahren"
 
-#: utils_videotl.cc:72
+#: utils_videotl.cc:74
 msgid "Confirm Overwrite"
 msgstr "Bestätige das Überschreiben"
 
-#: utils_videotl.cc:82 utils_videotl.cc:98
+#: utils_videotl.cc:84 utils_videotl.cc:100
 msgid "Cannot create video folder \"%1\" (%2)"
 msgstr "Kann Videoordner \"%1\" nicht erstellen (%2)"
 
@@ -14410,8 +15637,7 @@ msgid ""
 "window for more information."
 msgstr ""
 "Keine ffmpeg-Installation gefunden. Videoexport ist nicht möglich. Sehen Sie "
-"im "
-"Logfenster nach weiteren Informationen."
+"im Logfenster nach weiteren Informationen."
 
 #: export_video_dialog.cc:126
 msgid "<b>Output:</b> (file extension defines format)"
@@ -14462,16 +15688,16 @@ msgid "Audio Samplerate:"
 msgstr "Audiosamplerate:"
 
 #: export_video_dialog.cc:215 export_video_dialog.cc:223
-#: export_video_dialog.cc:801 export_video_dialog.cc:804
+#: export_video_dialog.cc:814 export_video_dialog.cc:817
 msgid "(default for format)"
 msgstr "(Voreinstellung für Format)"
 
 #: export_video_dialog.cc:233 export_video_dialog.cc:244
-#: export_video_dialog.cc:808 export_video_dialog.cc:817
+#: export_video_dialog.cc:821 export_video_dialog.cc:830
 msgid "(default)"
 msgstr "(Voreinstellung)"
 
-#: export_video_dialog.cc:245 export_video_dialog.cc:811
+#: export_video_dialog.cc:245 export_video_dialog.cc:824
 msgid "(retain)"
 msgstr "(beibehalten)"
 
@@ -14487,19 +15713,19 @@ msgstr "von Videostart bis Videoende"
 msgid "Selected range"
 msgstr "Ausgewählter Bereich"
 
-#: export_video_dialog.cc:560
+#: export_video_dialog.cc:561
 msgid "Normalizing audio"
 msgstr "Audio normalisieren"
 
-#: export_video_dialog.cc:564
+#: export_video_dialog.cc:566 export_video_dialog.cc:571
 msgid "Exporting audio"
 msgstr "Exportiere Audio"
 
-#: export_video_dialog.cc:619
+#: export_video_dialog.cc:632
 msgid "Exporting Audio..."
 msgstr "Exportiere Audio..."
 
-#: export_video_dialog.cc:676
+#: export_video_dialog.cc:689
 msgid ""
 "Export Video: Cannot query duration of video-file, using duration from "
 "timeline instead."
@@ -14507,37 +15733,37 @@ msgstr ""
 "Exportiere Video: Kann die Dauer der Videodatei nicht eruieren, verwende "
 "statt dessen die Dauer aus der Zeitleiste."
 
-#: export_video_dialog.cc:706
+#: export_video_dialog.cc:719
 msgid "Export Video: export-range does not include video."
 msgstr "Video Export: Exportbereich enthält kein Video."
 
-#: export_video_dialog.cc:719
+#: export_video_dialog.cc:732
 msgid "Export Video: No Master Out Ports to Connect for Audio Export"
 msgstr ""
 "Exportiere Video: Keine Master-Ausgangsports zum Verbinden für den "
 "Audioexport"
 
-#: export_video_dialog.cc:761
+#: export_video_dialog.cc:774
 msgid "Encoding Video..."
 msgstr "Enkodiere Video..."
 
-#: export_video_dialog.cc:781
+#: export_video_dialog.cc:794
 msgid "Export Video: Video input file cannot be read."
 msgstr "Exportiere Video: Die Videoquelldatei kann nicht gelesen werden."
 
-#: export_video_dialog.cc:887
+#: export_video_dialog.cc:900
 msgid "Encoding Video.. Pass 1/2"
 msgstr "Kodiere Video.. Durchgang 1/2"
 
-#: export_video_dialog.cc:899
+#: export_video_dialog.cc:912
 msgid "Encoding Video.. Pass 2/2"
 msgstr "Kodiere Video.. Durchgang 2/2"
 
-#: export_video_dialog.cc:1002
+#: export_video_dialog.cc:1015
 msgid "Transcoding failed."
 msgstr "Transkodieren fehlgeschlagen."
 
-#: export_video_dialog.cc:1238 export_video_dialog.cc:1258
+#: export_video_dialog.cc:1251 export_video_dialog.cc:1271
 msgid "Save Exported Video File"
 msgstr "Sichere exportierte Videodatei"
 
@@ -14577,3 +15803,177 @@ msgstr ""
 "\n"
 "Handbuch im Browser öffnen? "
 
+#~ msgid "dbFS"
+#~ msgstr "dbFS"
+
+#~ msgid ":monitor"
+#~ msgstr ":monitor"
+
+#~ msgid "system:"
+#~ msgstr "system:"
+
+#~ msgid "alsa_pcm:"
+#~ msgstr "alsa_pcm:"
+
+#~ msgid "alsa_midi:"
+#~ msgstr "alsa_midi:"
+
+#~ msgid ""
+#~ "Specify the Peak Volume of the generated LTC signal in dbFS. A good value "
+#~ "is  0dBu ^= -18dbFS in an EBU calibrated system"
+#~ msgstr ""
+#~ "Geben Sie den Spitzenwert des erzeugten LTC-Signals in dbFS an. Ein guter "
+#~ "Wert für ein EBU-kalibriertes System ist 0dBu ^= -18dbFS"
+
+#~ msgid ""
+#~ "Specify the audio signal level in dbFS at and above which the meter-peak "
+#~ "indicator will flash red."
+#~ msgstr ""
+#~ "Geben Sie den Signalpegel in dbFS an, bei dessen Erreichen oder "
+#~ "Ãœberschreitung die Spitzenwertanzeige in der Pegelanzeige rot blinkt"
+
+#~ msgid "Display model"
+#~ msgstr "Anzeigetyp"
+
+#~ msgid "Composite graphs for each track"
+#~ msgstr "Graphen für jede Spur einzeln"
+
+#~ msgid "Composite graph of all tracks"
+#~ msgstr "Graphen aller Spuren zusammenfassen"
+
+#~ msgid "Normalize values"
+#~ msgstr "Normalisieren"
+
+#~ msgid "Locations"
+#~ msgstr "Dateiorte"
+
+#~ msgid ""
+#~ "%4This is a session from an older version of %3%5\n"
+#~ "\n"
+#~ "%3 has copied the old session file\n"
+#~ "\n"
+#~ "%6%1%7\n"
+#~ "\n"
+#~ "to\n"
+#~ "\n"
+#~ "%6%2%7\n"
+#~ "\n"
+#~ "From now on, use the -2000 version with older versions of %3"
+#~ msgstr ""
+#~ "%4Dies ist ein Projekt, das mit einer älteren Version von %3 erstellt "
+#~ "wurde%5\n"
+#~ "\n"
+#~ "%3 hat die alte Projektdatei\n"
+#~ "\n"
+#~ "%6%1%7\n"
+#~ "\n"
+#~ "nach\n"
+#~ "\n"
+#~ "%6%2%7 kopiert.\n"
+#~ "\n"
+#~ "Benutzen Sie von nun an die -2000 Version mit älteren Versionen von %3"
+
+#~ msgid "Break drag or deselect all"
+#~ msgstr "Ziehen abbrechen oder alles deselektieren"
+
+#~ msgid ""
+#~ "Command to run post-export\n"
+#~ "(%f=full path & filename, %d=directory, %b=basename):"
+#~ msgstr ""
+#~ "Kommando, das nach dem Export ausgeführt werden soll\n"
+#~ "(%f=full path & filename, %d=directory, %b=basename):"
+
+#~ msgid "Create New Group From"
+#~ msgstr "Neue Gruppe erzeugen aus"
+
+#~ msgid "Select an action, then press the key(s) to (re)set its shortcut"
+#~ msgstr ""
+#~ "Wählen Sie eine Aktion und drücken Sie dann die Taste(n) \n"
+#~ "um das Tastaturkürzel zu setzen"
+
+#~ msgid "Program "
+#~ msgstr "Programm"
+
+#~ msgid "*Comments*"
+#~ msgstr "*Kommentare*"
+
+#~ msgid "*Cmt*"
+#~ msgstr "*Kmt*"
+
+#~ msgid "Remote Control ID..."
+#~ msgstr "ID für Fernsteuerung..."
+
+#~ msgid "Control surface remote ID"
+#~ msgstr "Remote ID des Eingabegeräts"
+
+#~ msgid "assigned by user"
+#~ msgstr "vom Benutzer festgelegt"
+
+#~ msgid "follows order of mixer"
+#~ msgstr "folgt Reihenfolge im Mixer"
+
+#~ msgid "You cannot create a track with that name as it is reserved for %1"
+#~ msgstr ""
+#~ "Sie können keine Spur mit einem Namen erstellen, der für %1 reserviert "
+#~ "ist."
+
+#~ msgid "Remote Control ID"
+#~ msgstr "ID für Fernsteuerung"
+
+#~ msgid "Remote control ID:"
+#~ msgstr "ID für Fernsteuerung:"
+
+#~ msgid ""
+#~ "The remote control ID of %1 is: %2\n"
+#~ "\n"
+#~ "\n"
+#~ "The remote control ID of %3 cannot be changed."
+#~ msgstr ""
+#~ "Die Fernbedienungs-ID von %1 ist: %2\n"
+#~ "\n"
+#~ "\n"
+#~ "Die Fernbedienungs-ID von %3 kann nicht geändert werden."
+
+#~ msgid "the master bus"
+#~ msgstr "der Master-Bus"
+
+#~ msgid "the monitor bus"
+#~ msgstr "der Monitor-Bus"
+
+#~ msgid ""
+#~ "The remote control ID of %5 is: %2\n"
+#~ "\n"
+#~ "\n"
+#~ "Remote Control IDs are currently determined by track/bus ordering in %6.\n"
+#~ "\n"
+#~ "%3Use the User Interaction tab of the Preferences window if you want to "
+#~ "change this%4"
+#~ msgstr ""
+#~ "Die Fernbedienungs-ID von %5 ist: %2\n"
+#~ "\n"
+#~ "\n"
+#~ "Fernbedienungs-IDs werden zur Zeit durch die Reihenfolge der Spuren/Busse "
+#~ "in %6 bestimmt.\n"
+#~ "\n"
+#~ "%3Benutzen Sie den Reiter GUI im Fenster \"Einstellungen\", um dies zu "
+#~ "ändern%4"
+
+#~ msgid ""
+#~ "Left-click to invert (phase reverse) channel %1 of this track.  Right-"
+#~ "click to show menu."
+#~ msgstr ""
+#~ "Linksklick, um die Phase von Kanal %1 zu invertieren. Rechtsklick zeigt "
+#~ "das Menü."
+
+#~ msgid "Click to show a menu of channels for inversion (phase reverse)"
+#~ msgstr ""
+#~ "Klicken, um ein Menü zum Invertieren der Kanäle (Phasendrehung) anzuzeigen"
+
+#~ msgid "Dark Theme"
+#~ msgstr "Dunkles Thema"
+
+#~ msgid "Light Theme"
+#~ msgstr "Helles Thema"
+
+#~ msgid "Color file %1 not found"
+#~ msgstr "Farbdatei %1 nicht gefunden"
diff --git a/gtk2_ardour/po/el.mo b/gtk2_ardour/po/el.mo
new file mode 100644
index 0000000..bd41b8f
Binary files /dev/null and b/gtk2_ardour/po/el.mo differ
diff --git a/gtk2_ardour/po/el.po b/gtk2_ardour/po/el.po
index 329a1e0..af4cb5c 100644
--- a/gtk2_ardour/po/el.po
+++ b/gtk2_ardour/po/el.po
@@ -7,264 +7,296 @@ msgid ""
 msgstr ""
 "Project-Id-Version: gtk-ardour 0.347.2\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-03-31 20:13-0400\n"
+"POT-Creation-Date: 2016-07-14 06:20-0400\n"
 "PO-Revision-Date: 2007-04-11 02:27+0200\n"
 "Last-Translator: Klearchos Gourgourinis <muadib at in.gr>\n"
 "Language-Team: Hellenic\n"
-"Language: \n"
+"Language: Greek\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: about.cc:125
+#: about.cc:127
+msgid "Fons Adriaensen"
+msgstr ""
+
+#: about.cc:128
 msgid "Brian Ahr"
 msgstr ""
 
-#: about.cc:126
+#: about.cc:129
 msgid "John Anderson"
 msgstr ""
 
-#: about.cc:127
+#: about.cc:130
 msgid "Marcus Andersson"
 msgstr ""
 
-#: about.cc:128
+#: about.cc:131
 msgid "Nedko Arnaudov"
 msgstr ""
 
-#: about.cc:129
+#: about.cc:132
 msgid "Hans Baier"
 msgstr ""
 
-#: about.cc:130
+#: about.cc:133
 msgid "Ben Bell"
 msgstr ""
 
-#: about.cc:131
+#: about.cc:134
 msgid "Sakari Bergen"
 msgstr ""
 
-#: about.cc:132
+#: about.cc:135
 msgid "Christian Borss"
 msgstr ""
 
-#: about.cc:133
+#: about.cc:136
 msgid "Chris Cannam"
 msgstr ""
 
-#: about.cc:134
+#: about.cc:137
 msgid "Jeremy Carter"
 msgstr ""
 
-#: about.cc:135
+#: about.cc:138
 msgid "Jesse Chappell"
 msgstr ""
 
-#: about.cc:136
+#: about.cc:139
 msgid "Thomas Charbonnel"
 msgstr ""
 
-#: about.cc:137
+#: about.cc:140
 msgid "Sam Chessman"
 msgstr ""
 
-#: about.cc:138
+#: about.cc:141
 msgid "André Colomb"
 msgstr ""
 
-#: about.cc:139
+#: about.cc:142
 msgid "Paul Davis"
 msgstr ""
 
-#: about.cc:140
+#: about.cc:143
 msgid "Gerard van Dongen"
 msgstr ""
 
-#: about.cc:141
+#: about.cc:144
 msgid "John Emmas"
 msgstr ""
 
-#: about.cc:142
+#: about.cc:145
 msgid "Colin Fletcher"
 msgstr ""
 
-#: about.cc:143
+#: about.cc:146
 msgid "Dave Flick"
 msgstr ""
 
-#: about.cc:144
+#: about.cc:147
 msgid "Hans Fugal"
 msgstr ""
 
-#: about.cc:145
+#: about.cc:148
 msgid "Robin Gareus"
 msgstr ""
 
-#: about.cc:146
+#: about.cc:149
+msgid "Nil Geisweiller"
+msgstr ""
+
+#: about.cc:150
 msgid "Christopher George"
 msgstr ""
 
-#: about.cc:147
+#: about.cc:151
 msgid "Chris Goddard"
 msgstr ""
 
-#: about.cc:148
+#: about.cc:152
 msgid "J. Abelardo Gutierrez"
 msgstr ""
 
-#: about.cc:149
+#: about.cc:153
 msgid "Jeremy Hall"
 msgstr ""
 
-#: about.cc:150
+#: about.cc:154
 msgid "Audun Halland"
 msgstr ""
 
-#: about.cc:151
+#: about.cc:155
 msgid "David Halter"
 msgstr ""
 
-#: about.cc:152
+#: about.cc:156
 msgid "Steve Harris"
 msgstr ""
 
-#: about.cc:153
+#: about.cc:157
 msgid "Melvin Ray Herr"
 msgstr ""
 
-#: about.cc:154
+#: about.cc:158
 msgid "Carl Hetherington"
 msgstr ""
 
-#: about.cc:155
+#: about.cc:159
 msgid "Rob Holland"
 msgstr ""
 
-#: about.cc:156
+#: about.cc:160
 msgid "Robert Jordens"
 msgstr ""
 
-#: about.cc:157
+#: about.cc:161
 msgid "Stefan Kersten"
 msgstr ""
 
-#: about.cc:158
+#: about.cc:162
 msgid "Armand Klenk"
 msgstr ""
 
-#: about.cc:159
+#: about.cc:163
 msgid "Julien de Kozak"
 msgstr ""
 
-#: about.cc:160
+#: about.cc:164
 msgid "Matt Krai"
 msgstr ""
 
-#: about.cc:161
+#: about.cc:165
 msgid "Georg Krause"
 msgstr ""
 
-#: about.cc:162
+#: about.cc:166
 msgid "Nick Lanham"
 msgstr ""
 
-#: about.cc:163
+#: about.cc:167
 msgid "Colin Law"
 msgstr ""
 
-#: about.cc:164
+#: about.cc:168
 msgid "Joshua Leach"
 msgstr ""
 
-#: about.cc:165
+#: about.cc:169
 msgid "Ben Loftis"
 msgstr ""
 
-#: about.cc:166
+#: about.cc:170
 msgid "Nick Mainsbridge"
 msgstr ""
 
-#: about.cc:167
+#: about.cc:171
 msgid "Tim Mayberry"
 msgstr ""
 
-#: about.cc:168
+#: about.cc:172
 msgid "Doug Mclain"
 msgstr ""
 
-#: about.cc:169
+#: about.cc:173
 msgid "Todd Naugle"
 msgstr ""
 
-#: about.cc:170
+#: about.cc:174
+msgid "André Nusser"
+msgstr ""
+
+#: about.cc:175
+msgid "Bent Bisballe Nyeng"
+msgstr ""
+
+#: about.cc:176
 msgid "Jack O'Quin"
 msgstr ""
 
-#: about.cc:171
+#: about.cc:177
+msgid "Pavel Potocek"
+msgstr ""
+
+#: about.cc:178
 msgid "Nimal Ratnayake"
 msgstr ""
 
-#: about.cc:172
+#: about.cc:179
+msgid "Julien Rivaud"
+msgstr ""
+
+#: about.cc:180
 msgid "David Robillard"
 msgstr ""
 
-#: about.cc:173
+#: about.cc:181
+msgid "Julien Roger"
+msgstr ""
+
+#: about.cc:182
 msgid "Taybin Rutkin"
 msgstr ""
 
-#: about.cc:174
+#: about.cc:183
 msgid "Andreas Ruge"
 msgstr ""
 
-#: about.cc:175
+#: about.cc:184
 msgid "Sampo Savolainen"
 msgstr ""
 
-#: about.cc:176
+#: about.cc:185
 msgid "Rodrigo Severo"
 msgstr ""
 
-#: about.cc:177
+#: about.cc:186
 msgid "Per Sigmond"
 msgstr ""
 
-#: about.cc:178
+#: about.cc:187
 msgid "Lincoln Spiteri"
 msgstr ""
 
-#: about.cc:179
+#: about.cc:188
 msgid "Mike Start"
 msgstr ""
 
-#: about.cc:180
+#: about.cc:189
 msgid "Mark Stewart"
 msgstr ""
 
-#: about.cc:181
+#: about.cc:190
 msgid "Roland Stigge"
 msgstr ""
 
-#: about.cc:182
+#: about.cc:191
 msgid "Petter Sundlöf"
 msgstr ""
 
-#: about.cc:183
+#: about.cc:192
 msgid "Mike Täht"
 msgstr ""
 
-#: about.cc:184
+#: about.cc:193
 msgid "Roy Vegard"
 msgstr ""
 
-#: about.cc:185
+#: about.cc:194
 msgid "Thorsten Wilms"
 msgstr ""
 
-#: about.cc:186
+#: about.cc:195
+msgid "Damien Zammit"
+msgstr ""
+
+#: about.cc:196
 msgid "Grygorii Zharun"
 msgstr ""
 
-#: about.cc:191
+#: about.cc:201
 msgid ""
 "French:\n"
 "\tAlain Fréhel <alain.frehel at free.fr>\n"
@@ -273,7 +305,7 @@ msgid ""
 "\tRomain Arnaud <roming22 at gmail.com>\n"
 msgstr ""
 
-#: about.cc:192
+#: about.cc:202
 msgid ""
 "German:\n"
 "\tKarsten Petersen <kapet at kapet.de>\n"
@@ -285,210 +317,264 @@ msgid ""
 "\tRobin Gloster <robin at loc-com.de>\n"
 msgstr ""
 
-#: about.cc:199
+#: about.cc:209
 msgid ""
 "Italian:\n"
 "\tFilippo Pappalardo <filippo at email.it>\n"
 "\tRaffaele Morelli <raffaele.morelli at gmail.com>\n"
 msgstr ""
 
-#: about.cc:200
+#: about.cc:210
 msgid ""
 "Portuguese:\n"
 "\tRui Nuno Capela <rncbc at rncbc.org>\n"
 msgstr ""
 
-#: about.cc:201
+#: about.cc:211
 msgid ""
 "Brazilian Portuguese:\n"
 "\tAlexander da Franca Fernandes <alexander at nautae.eti.br>\n"
 "\tChris Ross <chris at tebibyte.org>\n"
 msgstr ""
 
-#: about.cc:203
+#: about.cc:213
 msgid ""
 "Spanish:\n"
 "\t Alex Krohn <alexkrohn at fastmail.fm>\n"
 "\tPablo Fernández <pablo.fbus at gmail.com>\n"
 msgstr ""
 
-#: about.cc:204
+#: about.cc:214
 msgid ""
 "Russian:\n"
 "\t Igor Blinov <pitstop at nm.ru>\n"
 "\tAlexandre Prokoudine <alexandre.prokoudine at gmail.com>\n"
 msgstr ""
 
-#: about.cc:206
+#: about.cc:216
 msgid ""
 "Greek:\n"
 "\t Klearchos Gourgourinis <muadib at in.gr>\n"
 msgstr ""
 
-#: about.cc:207
+#: about.cc:217
 msgid ""
 "Swedish:\n"
 "\t Petter Sundlöf <petter.sundlof at gmail.com>\n"
 msgstr ""
 
-#: about.cc:208
+#: about.cc:218
 msgid ""
 "Polish:\n"
 "\t Piotr Zaryk <pzaryk at gmail.com>\n"
 msgstr ""
 
-#: about.cc:209
+#: about.cc:219
 msgid ""
 "Czech:\n"
 "\t Pavel Fric <pavelfric at seznam.cz>\n"
 msgstr ""
 
-#: about.cc:210
+#: about.cc:220
 msgid ""
 "Norwegian:\n"
 "\t Eivind Ødegård\n"
 msgstr ""
 
-#: about.cc:211
+#: about.cc:221
 msgid ""
 "Chinese:\n"
 "\t Rui-huai Zhang <zrhzrh at mail.ustc.edu.cn>\n"
 msgstr ""
 
-#: about.cc:591
+#: about.cc:601
+msgid "Intel 64-bit"
+msgstr ""
+
+#: about.cc:603
+msgid "Intel 32-bit"
+msgstr ""
+
+#: about.cc:605
+msgid "PowerPC 64-bit"
+msgstr ""
+
+#: about.cc:607
+msgid "PowerPC 32-bit"
+msgstr ""
+
+#: about.cc:609
+msgid "64-bit"
+msgstr ""
+
+#: about.cc:611
+msgid "32-bit"
+msgstr ""
+
+#: about.cc:619
+msgid " - debug"
+msgstr ""
+
+#: about.cc:625
 msgid "Copyright (C) 1999-2015 Paul Davis\n"
 msgstr ""
 
-#: about.cc:595
+#: about.cc:629
 msgid "http://ardour.org/"
 msgstr ""
 
-#: about.cc:596
+#: about.cc:630
 msgid ""
 "%1%2\n"
-"(built from revision %3)"
+"(rev %3)\n"
+"%4%5"
 msgstr ""
 
-#: about.cc:600
+#: about.cc:635
 msgid "Config"
 msgstr ""
 
-#: actions.cc:85
+#: actions.cc:83
 msgid "Loading menus from %1"
 msgstr ""
 
-#: actions.cc:88 actions.cc:89
+#: actions.cc:86 actions.cc:87
 msgid "badly formatted menu definition file: %1"
 msgstr ""
 
-#: actions.cc:91
+#: actions.cc:89
 msgid "%1 menu definition file not found"
 msgstr ""
 
-#: actions.cc:95 actions.cc:96
+#: actions.cc:93 actions.cc:94
 msgid "%1 will not work without a valid menu definition file"
 msgstr ""
 
-#: add_route_dialog.cc:54 route_params_ui.cc:524
-msgid "Add Track or Bus"
+#: add_route_dialog.cc:58
+msgid "Add Track/Bus/VCA"
 msgstr ""
 
-#: add_route_dialog.cc:57
+#: add_route_dialog.cc:61
 msgid "Configuration:"
 msgstr ""
 
-#: add_route_dialog.cc:58
+#: add_route_dialog.cc:62
 msgid "Record Mode:"
 msgstr ""
 
-#: add_route_dialog.cc:59
+#: add_route_dialog.cc:63
 msgid "Instrument:"
 msgstr ""
 
-#: add_route_dialog.cc:77
+#: add_route_dialog.cc:77 add_route_dialog.cc:228
 msgid "Audio Tracks"
 msgstr ""
 
-#: add_route_dialog.cc:78 add_route_dialog.cc:209
+#: add_route_dialog.cc:78 add_route_dialog.cc:224
 msgid "MIDI Tracks"
 msgstr ""
 
-#: add_route_dialog.cc:79 add_route_dialog.cc:211
+#: add_route_dialog.cc:79 add_route_dialog.cc:226
 msgid "Audio+MIDI Tracks"
 msgstr ""
 
-#: add_route_dialog.cc:80 add_route_dialog.cc:207
-msgid "Busses"
+#: add_route_dialog.cc:80 add_route_dialog.cc:220
+msgid "Audio Busses"
+msgstr ""
+
+#: add_route_dialog.cc:81 add_route_dialog.cc:222
+msgid "MIDI Busses"
+msgstr ""
+
+#: add_route_dialog.cc:82
+msgid "VCA Masters"
 msgstr ""
 
-#: add_route_dialog.cc:83 add_route_dialog.cc:559
+#: add_route_dialog.cc:85 add_route_dialog.cc:622
 msgid "First"
 msgstr ""
 
-#: add_route_dialog.cc:84 add_route_dialog.cc:561
-msgid "After Editor Selection"
+#: add_route_dialog.cc:86 add_route_dialog.cc:626
+msgid "Before Selection"
 msgstr ""
 
-#: add_route_dialog.cc:85 add_route_dialog.cc:563
-msgid "After Mixer Selection"
+#: add_route_dialog.cc:87 add_route_dialog.cc:624
+msgid "After Selection"
 msgstr ""
 
-#: add_route_dialog.cc:86
+#: add_route_dialog.cc:88
 msgid "Last"
 msgstr ""
 
-#: add_route_dialog.cc:103
+#: add_route_dialog.cc:91
+msgid "Flexible-I/O"
+msgstr ""
+
+#: add_route_dialog.cc:92
+msgid "Strict-I/O"
+msgstr ""
+
+#: add_route_dialog.cc:108
 msgid "Add:"
 msgstr ""
 
-#: add_route_dialog.cc:116 time_fx_dialog.cc:91 add_video_dialog.cc:135
-#: video_server_dialog.cc:121
+#: add_route_dialog.cc:121 time_fx_dialog.cc:101 add_video_dialog.cc:135
+#: video_server_dialog.cc:118
 msgid "<b>Options</b>"
 msgstr ""
 
-#: add_route_dialog.cc:126 bundle_manager.cc:193 region_editor.cc:50
-#: route_group_dialog.cc:71
+#: add_route_dialog.cc:131 bundle_manager.cc:193 region_editor.cc:52
+#: route_group_dialog.cc:70
 msgid "Name:"
 msgstr ""
 
-#: add_route_dialog.cc:156
+#: add_route_dialog.cc:155
 msgid "Group:"
 msgstr ""
 
-#: add_route_dialog.cc:162
+#: add_route_dialog.cc:161
 msgid "Insert:"
 msgstr ""
 
-#: add_route_dialog.cc:223 add_route_dialog.cc:232 add_route_dialog.cc:306
-#: ardour_ui_ed.cc:539 engine_dialog.cc:237 rc_option_editor.cc:1805
-#: rc_option_editor.cc:1807 rc_option_editor.cc:1809 rc_option_editor.cc:1827
-#: rc_option_editor.cc:1829 rc_option_editor.cc:1837 rc_option_editor.cc:1839
-#: rc_option_editor.cc:1857 rc_option_editor.cc:1870 rc_option_editor.cc:1872
-#: rc_option_editor.cc:1874 rc_option_editor.cc:1919 rc_option_editor.cc:1921
-#: rc_option_editor.cc:1923 rc_option_editor.cc:1931 rc_option_editor.cc:1939
-#: rc_option_editor.cc:1941 rc_option_editor.cc:1949
+#: add_route_dialog.cc:171
+msgid "Output Ports:"
+msgstr ""
+
+#: add_route_dialog.cc:176 rc_option_editor.cc:2474
+msgid ""
+"With strict-i/o enabled, Effect Processors will not modify the number of "
+"channels on a track. The number of output channels will always match the "
+"number of input channels."
+msgstr ""
+
+#: add_route_dialog.cc:240 add_route_dialog.cc:351 ardour_ui_ed.cc:636
+#: engine_dialog.cc:244 plugin_pin_dialog.cc:67 rc_option_editor.cc:2397
+#: rc_option_editor.cc:2399 rc_option_editor.cc:2401 rc_option_editor.cc:2419
+#: rc_option_editor.cc:2421 rc_option_editor.cc:2429 rc_option_editor.cc:2432
+#: rc_option_editor.cc:2450 rc_option_editor.cc:2463 rc_option_editor.cc:2472
+#: rc_option_editor.cc:2478 rc_option_editor.cc:2480 rc_option_editor.cc:2525
+#: rc_option_editor.cc:2527 rc_option_editor.cc:2529 rc_option_editor.cc:2537
 msgid "Audio"
 msgstr ""
 
-#: add_route_dialog.cc:224 add_route_dialog.cc:235 add_route_dialog.cc:307
-#: editor_actions.cc:109 engine_dialog.cc:239 missing_file_dialog.cc:56
-#: rc_option_editor.cc:2084 rc_option_editor.cc:2094 rc_option_editor.cc:2102
-#: rc_option_editor.cc:2110 rc_option_editor.cc:2119 rc_option_editor.cc:2127
-#: rc_option_editor.cc:2135 rc_option_editor.cc:2143 rc_option_editor.cc:2152
-#: rc_option_editor.cc:2161 rc_option_editor.cc:2170 rc_option_editor.cc:2178
-#: rc_option_editor.cc:2186 rc_option_editor.cc:2194 rc_option_editor.cc:2217
+#: add_route_dialog.cc:243 add_route_dialog.cc:352 editor_actions.cc:112
+#: engine_dialog.cc:246 missing_file_dialog.cc:60 mixer_ui.cc:1895
+#: plugin_pin_dialog.cc:68 rc_option_editor.cc:2672 rc_option_editor.cc:2674
+#: rc_option_editor.cc:2684 rc_option_editor.cc:2693 rc_option_editor.cc:2701
+#: rc_option_editor.cc:2709 rc_option_editor.cc:2717 rc_option_editor.cc:2790
+#: rc_option_editor.cc:2813
 msgid "MIDI"
 msgstr "MIDI"
 
-#: add_route_dialog.cc:225 add_route_dialog.cc:238 add_route_dialog.cc:308
+#: add_route_dialog.cc:246 add_route_dialog.cc:353
 msgid "Audio+MIDI"
 msgstr ""
 
-#: add_route_dialog.cc:226 add_route_dialog.cc:241 add_route_dialog.cc:309
+#: add_route_dialog.cc:250 add_route_dialog.cc:354
 msgid "Bus"
 msgstr ""
 
-#: add_route_dialog.cc:268
+#: add_route_dialog.cc:286
 msgid ""
 "Audio+MIDI tracks are intended for use <b>ONLY</b> with plugins that use "
 "both audio and MIDI input data\n"
@@ -497,60 +583,61 @@ msgid ""
 "track instead."
 msgstr ""
 
-#: add_route_dialog.cc:327 add_route_dialog.cc:346 editor_actions.cc:422
-#: editor_rulers.cc:251 time_axis_view.cc:1374
+#: add_route_dialog.cc:373 add_route_dialog.cc:385 editor_actions.cc:456
+#: editor_rulers.cc:250 time_axis_view.cc:1290
 msgid "Normal"
 msgstr "Κανονικό"
 
-#: add_route_dialog.cc:330 add_route_dialog.cc:348
+#: add_route_dialog.cc:374 add_route_dialog.cc:387
 msgid "Non Layered"
 msgstr ""
 
-#: add_route_dialog.cc:331 add_route_dialog.cc:350
+#: add_route_dialog.cc:375 add_route_dialog.cc:389
 msgid "Tape"
 msgstr ""
 
-#: add_route_dialog.cc:431 monitor_section.cc:290
+#: add_route_dialog.cc:476 monitor_section.cc:273 plugin_pin_dialog.cc:509
+#: plugin_setup_dialog.cc:202
 msgid "Mono"
 msgstr ""
 
-#: add_route_dialog.cc:435
+#: add_route_dialog.cc:480 plugin_pin_dialog.cc:512 plugin_setup_dialog.cc:205
 msgid "Stereo"
 msgstr ""
 
-#: add_route_dialog.cc:459
+#: add_route_dialog.cc:503
 msgid "3 Channel"
 msgstr ""
 
-#: add_route_dialog.cc:463
+#: add_route_dialog.cc:507
 msgid "4 Channel"
 msgstr ""
 
-#: add_route_dialog.cc:467
+#: add_route_dialog.cc:511
 msgid "5 Channel"
 msgstr ""
 
-#: add_route_dialog.cc:471
+#: add_route_dialog.cc:515
 msgid "6 Channel"
 msgstr ""
 
-#: add_route_dialog.cc:475
+#: add_route_dialog.cc:519
 msgid "8 Channel"
 msgstr ""
 
-#: add_route_dialog.cc:479
+#: add_route_dialog.cc:523
 msgid "12 Channel"
 msgstr ""
 
-#: add_route_dialog.cc:483 mixer_strip.cc:1836 mixer_strip.cc:2244
+#: add_route_dialog.cc:527 mixer_strip.cc:2009 mixer_strip.cc:2455
 msgid "Custom"
 msgstr ""
 
-#: add_route_dialog.cc:516 add_route_dialog.cc:532 route_group_menu.cc:81
+#: add_route_dialog.cc:569 add_route_dialog.cc:585 route_group_menu.cc:85
 msgid "New Group..."
 msgstr ""
 
-#: add_route_dialog.cc:520 route_group_menu.cc:85
+#: add_route_dialog.cc:573 route_group_menu.cc:89
 msgid "No Group"
 msgstr ""
 
@@ -558,177 +645,215 @@ msgstr ""
 msgid "Ambiguous File"
 msgstr ""
 
-#: ambiguous_file_dialog.cc:35
+#: ambiguous_file_dialog.cc:37
 msgid ""
 "%1 has found the file <i>%2</i> in the following places:\n"
 "\n"
 msgstr ""
 
-#: ambiguous_file_dialog.cc:44
+#: ambiguous_file_dialog.cc:46
 msgid ""
 "\n"
 "\n"
 "Please select the path that you want to get the file from."
 msgstr ""
 
-#: ambiguous_file_dialog.cc:46 missing_file_dialog.cc:46
+#: ambiguous_file_dialog.cc:48 missing_file_dialog.cc:50
 msgid "Done"
 msgstr ""
 
-#: analysis_window.cc:46
+#: analysis_window.cc:45
 msgid "Signal source"
 msgstr ""
 
-#: analysis_window.cc:47
+#: analysis_window.cc:46
 msgid "Selected ranges"
 msgstr ""
 
-#: analysis_window.cc:48
+#: analysis_window.cc:47
 msgid "Selected regions"
 msgstr ""
 
-#: analysis_window.cc:50
-msgid "Display model"
-msgstr ""
-
-#: analysis_window.cc:51
-msgid "Composite graphs for each track"
-msgstr ""
-
-#: analysis_window.cc:52
-msgid "Composite graph of all tracks"
+#: analysis_window.cc:48
+msgid "Show frequency power range"
 msgstr ""
 
-#: analysis_window.cc:54
-msgid "Show frequency power range"
+#: analysis_window.cc:49
+msgid "Fit dB range"
 msgstr ""
 
-#: analysis_window.cc:55
-msgid "Normalize values"
+#: analysis_window.cc:50
+msgid "Proportional Spectrum, -18dB"
 msgstr ""
 
-#: analysis_window.cc:59
+#: analysis_window.cc:53
 msgid "FFT analysis window"
 msgstr ""
 
-#: analysis_window.cc:60 editor.cc:1823
+#: analysis_window.cc:54 editor.cc:1953
 msgid "Spectral Analysis"
 msgstr ""
 
-#: analysis_window.cc:67 editor_actions.cc:142 export_channel_selector.cc:557
-#: session_metadata_dialog.cc:667
+#: analysis_window.cc:61 editor_actions.cc:145 session_metadata_dialog.cc:670
 msgid "Track"
 msgstr "Κανάλι"
 
-#: analysis_window.cc:68 editor_actions.cc:648 mixer_ui.cc:131
-#: mixer_ui.cc:1854
+#: analysis_window.cc:62 ardour_ui_ed.cc:254 ardour_ui_ed.cc:255
+#: ardour_ui_ed.cc:256 editor_actions.cc:689 mixer_ui.cc:151 mixer_ui.cc:2134
 msgid "Show"
 msgstr ""
 
-#: analysis_window.cc:135
+#: analysis_window.cc:107
 msgid "Re-analyze data"
 msgstr ""
 
-#: ardour_button.cc:887
+#: ardour_button.cc:876
 msgid "button cannot watch state of non-existing Controllable\n"
 msgstr ""
 
-#: ardour_button.cc:1155
+#: ardour_button.cc:1144
 msgid "ABCDEFGHIJLKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
 msgstr ""
 
-#: ardour_ui.cc:164
+#: ardour_ui.cc:198
 msgid ""
 "%1 %2.x has discovered configuration files from %1 %3.x.\n"
 "\n"
-"Would you like to copy the relevant files before starting to use the "
-"program?\n"
+"Would you like these files to be copied and used for %1 %2.x?\n"
 "\n"
 "(This will require you to restart %1.)"
 msgstr ""
 
-#: ardour_ui.cc:211 editor_actions.cc:642 region_editor.cc:51
+#: ardour_ui.cc:283 editor_actions.cc:683 region_editor.cc:53
 msgid "Audition"
 msgstr "Ακρόαση"
 
-#: ardour_ui.cc:212 editor_actions.cc:136 mixer_strip.cc:2016
-#: rc_option_editor.cc:1959 route_time_axis.cc:252 route_time_axis.cc:2711
+#: ardour_ui.cc:284 editor_actions.cc:139 mixer_strip.cc:2205
+#: monitor_section.cc:329 rc_option_editor.cc:2547 route_time_axis.cc:263
+#: route_time_axis.cc:2740 vca_master_strip.cc:212 vca_time_axis.cc:237
 msgid "Solo"
 msgstr "Σόλο"
 
-#: ardour_ui.cc:213 rc_option_editor.cc:741
+#: ardour_ui.cc:285 rc_option_editor.cc:1357
 msgid "Feedback"
 msgstr ""
 
-#: ardour_ui.cc:219 speaker_dialog.cc:36
+#: ardour_ui.cc:296 speaker_dialog.cc:36
 msgid "Speaker Configuration"
 msgstr ""
 
-#: ardour_ui.cc:220 keyeditor.cc:53
-msgid "Key Bindings"
-msgstr ""
-
-#: ardour_ui.cc:221
-msgid "Preferences"
-msgstr ""
-
-#: ardour_ui.cc:222 ardour_ui.cc:229
+#: ardour_ui.cc:297
 msgid "Add Tracks/Busses"
 msgstr ""
 
-#: ardour_ui.cc:223
+#: ardour_ui.cc:298
 msgid "About"
 msgstr "Πληροφορίες"
 
-#: ardour_ui.cc:224 location_ui.cc:1141 session_option_editor.cc:189
-#: session_option_editor.cc:195 session_option_editor.cc:202
-msgid "Locations"
-msgstr "Τοποθεσίες"
+#: ardour_ui.cc:299 location_ui.cc:1167
+msgid "Ranges|Locations"
+msgstr ""
 
-#: ardour_ui.cc:225 route_params_ui.cc:59 route_params_ui.cc:630
+#: ardour_ui.cc:300 route_params_ui.cc:59 route_params_ui.cc:620
 msgid "Tracks and Busses"
 msgstr ""
 
-#: ardour_ui.cc:226 engine_dialog.cc:70
+#: ardour_ui.cc:301 engine_dialog.cc:73
 msgid "Audio/MIDI Setup"
 msgstr ""
 
-#: ardour_ui.cc:227
+#: ardour_ui.cc:302
 msgid "Video Export Dialog"
 msgstr ""
 
-#: ardour_ui.cc:228
+#: ardour_ui.cc:303 lua_script_manager.cc:30
+msgid "Script Manager"
+msgstr ""
+
+#: ardour_ui.cc:304
 msgid "Properties"
 msgstr ""
 
-#: ardour_ui.cc:230 bundle_manager.cc:264
+#: ardour_ui.cc:305
+msgid "Add Video"
+msgstr ""
+
+#: ardour_ui.cc:306 bundle_manager.cc:264
 msgid "Bundle Manager"
 msgstr ""
 
-#: ardour_ui.cc:231 big_clock_window.cc:37
+#: ardour_ui.cc:307 big_clock_window.cc:37
 msgid "Big Clock"
 msgstr "Μεγάλο ωρολόγιον"
 
-#: ardour_ui.cc:232
+#: ardour_ui.cc:308
 msgid "Audio Connections"
 msgstr ""
 
-#: ardour_ui.cc:233
+#: ardour_ui.cc:309
 msgid "MIDI Connections"
 msgstr ""
 
-#: ardour_ui.cc:242
+#: ardour_ui.cc:310
+msgid "Bindings Editor"
+msgstr ""
+
+#: ardour_ui.cc:321 editor.cc:1288
+msgid "Window|Editor"
+msgstr ""
+
+#: ardour_ui.cc:322 mixer_ui.cc:2210 mixer_ui.cc:2216
+msgid "Window|Mixer"
+msgstr ""
+
+#: ardour_ui.cc:323
+msgid "Window|Preferences"
+msgstr ""
+
+#: ardour_ui.cc:330
 msgid "Your configuration files were copied. You can now restart %1."
 msgstr ""
 
-#: ardour_ui.cc:481
+#: ardour_ui.cc:509
+msgid "Pre-Release Warning"
+msgstr ""
+
+#: ardour_ui.cc:513
+msgid ""
+"<b>Welcome to this pre-release build of %1 %2</b>\n"
+"\n"
+"There are still several issues and bugs to be worked on,\n"
+"as well as general workflow improvements, before this can be considered\n"
+"release software. So, a few guidelines:\n"
+"\n"
+"1) Please do <b>NOT</b> use this software with the expectation that it is "
+"stable or reliable\n"
+"   though it may be so, depending on your workflow.\n"
+"2) Please wait for a helpful writeup of new features.\n"
+"3) <b>Please do NOT use the forums at ardour.org to report issues</b>.\n"
+"4) Please <b>DO</b> use the bugtracker at http://tracker.ardour.org/ to "
+"report issues\n"
+"   making sure to note the product version number as 5.0-pre.\n"
+"5) Please <b>DO</b> use the ardour-users mailing list to discuss ideas and "
+"pass on comments.\n"
+"6) Please <b>DO</b> join us on IRC for real time discussions about %1 %2. "
+"You\n"
+"   can get there directly from within the program via the Help->Chat menu "
+"option.\n"
+"\n"
+"Full information on all the above can be found on the support page at\n"
+"\n"
+"                http://ardour.org/support\n"
+msgstr ""
+
+#: ardour_ui.cc:613
 msgid ""
 "The audio backend was shutdown because:\n"
 "\n"
 "%1"
 msgstr ""
 
-#: ardour_ui.cc:483
+#: ardour_ui.cc:615
 msgid ""
 "The audio backend has either been shutdown or it\n"
 "disconnected %1 because %1\n"
@@ -736,45 +861,45 @@ msgid ""
 "the audio backend and save the session."
 msgstr ""
 
-#: ardour_ui.cc:507
+#: ardour_ui.cc:639
 msgid ""
 "Audio Unit Plugin Scan Failed. Automatic AU scanning has been disabled. "
 "Please see the log window for further details."
 msgstr ""
 
-#: ardour_ui.cc:508
+#: ardour_ui.cc:640
 msgid "Audio Unit Plugin Scan Failed:"
 msgstr ""
 
-#: ardour_ui.cc:827
+#: ardour_ui.cc:1008
 msgid "NSM server did not announce itself"
 msgstr ""
 
-#: ardour_ui.cc:840
+#: ardour_ui.cc:1021
 msgid "NSM: no client ID provided"
 msgstr ""
 
-#: ardour_ui.cc:847
+#: ardour_ui.cc:1028
 msgid "NSM: no session created"
 msgstr ""
 
-#: ardour_ui.cc:870
+#: ardour_ui.cc:1051
 msgid "NSM: initialization failed"
 msgstr ""
 
-#: ardour_ui.cc:900
+#: ardour_ui.cc:1083
 msgid "Free/Demo Version Warning"
 msgstr ""
 
-#: ardour_ui.cc:902
+#: ardour_ui.cc:1085
 msgid "Subscribe and support development of %1"
 msgstr ""
 
-#: ardour_ui.cc:903
+#: ardour_ui.cc:1086
 msgid "Don't warn me about this again"
 msgstr ""
 
-#: ardour_ui.cc:905
+#: ardour_ui.cc:1088
 msgid ""
 "<span weight=\"bold\" size=\"large\">%1</span>\n"
 "\n"
@@ -785,39 +910,39 @@ msgid ""
 "%4"
 msgstr ""
 
-#: ardour_ui.cc:906
+#: ardour_ui.cc:1089
 msgid "This is a free/demo version of %1"
 msgstr ""
 
-#: ardour_ui.cc:907
+#: ardour_ui.cc:1090
 msgid "It will not restore OR save any plugin settings"
 msgstr ""
 
-#: ardour_ui.cc:908
+#: ardour_ui.cc:1091
 msgid ""
 "If you load an existing session with plugin settings\n"
 "they will not be used and will be lost."
 msgstr ""
 
-#: ardour_ui.cc:910 plugin_ui.cc:569
+#: ardour_ui.cc:1093 plugin_ui.cc:579
 msgid ""
 "To get full access to updates without this limitation\n"
 "consider becoming a subscriber for a low cost every month."
 msgstr ""
 
-#: ardour_ui.cc:920
+#: ardour_ui.cc:1103
 msgid "Quit now"
 msgstr ""
 
-#: ardour_ui.cc:921
+#: ardour_ui.cc:1104
 msgid "Continue using %1"
 msgstr ""
 
-#: ardour_ui.cc:954 startup.cc:345
+#: ardour_ui.cc:1135 startup.cc:349
 msgid "%1 is ready for use"
 msgstr ""
 
-#: ardour_ui.cc:996
+#: ardour_ui.cc:1185
 msgid ""
 "WARNING: Your system has a limit for maximum amount of locked memory. This "
 "might cause %1 to run out of memory before your system runs out of memory. \n"
@@ -826,23 +951,23 @@ msgid ""
 "controlled by %2"
 msgstr ""
 
-#: ardour_ui.cc:1013
+#: ardour_ui.cc:1202
 msgid "Do not show this window again"
 msgstr ""
 
-#: ardour_ui.cc:1057
+#: ardour_ui.cc:1245
 msgid "Don't quit"
 msgstr ""
 
-#: ardour_ui.cc:1058
+#: ardour_ui.cc:1246
 msgid "Just quit"
 msgstr ""
 
-#: ardour_ui.cc:1059
+#: ardour_ui.cc:1247 ardour_ui.cc:5362
 msgid "Save and quit"
 msgstr ""
 
-#: ardour_ui.cc:1069
+#: ardour_ui.cc:1257
 msgid ""
 "%1 was unable to save your session.\n"
 "\n"
@@ -851,11 +976,11 @@ msgid ""
 "\"Just quit\" option."
 msgstr ""
 
-#: ardour_ui.cc:1119
+#: ardour_ui.cc:1307
 msgid "Unsaved Session"
 msgstr ""
 
-#: ardour_ui.cc:1140
+#: ardour_ui.cc:1328
 msgid ""
 "The session \"%1\"\n"
 "has not been saved.\n"
@@ -866,7 +991,7 @@ msgid ""
 "What do you want to do?"
 msgstr ""
 
-#: ardour_ui.cc:1143
+#: ardour_ui.cc:1331
 msgid ""
 "The snapshot \"%1\"\n"
 "has not been saved.\n"
@@ -877,74 +1002,107 @@ msgid ""
 "What do you want to do?"
 msgstr ""
 
-#: ardour_ui.cc:1157
+#: ardour_ui.cc:1345
 msgid "Prompter"
 msgstr "Υποβολέας"
 
-#: ardour_ui.cc:1269 ardour_ui.cc:1277
+#: ardour_ui.cc:1459 ardour_ui.cc:1467
 msgid "Audio: <span foreground=\"red\">none</span>"
 msgstr ""
 
-#: ardour_ui.cc:1281
+#: ardour_ui.cc:1471
 #, c-format
 msgid "Audio: <span foreground=\"green\">%.1f kHz / %4.1f ms</span>"
 msgstr ""
 
-#: ardour_ui.cc:1285
+#: ardour_ui.cc:1475
 #, c-format
 msgid "Audio: <span foreground=\"green\">%<PRId64> kHz / %4.1f ms</span>"
 msgstr ""
 
-#: ardour_ui.cc:1303 export_video_dialog.cc:80
+#: ardour_ui.cc:1493 export_report.cc:108 export_report.cc:323
+#: export_video_dialog.cc:76
 msgid "File:"
 msgstr ""
 
-#: ardour_ui.cc:1307
+#: ardour_ui.cc:1497
 msgid "BWF"
 msgstr ""
 
-#: ardour_ui.cc:1310
+#: ardour_ui.cc:1500
 msgid "WAV"
 msgstr ""
 
-#: ardour_ui.cc:1313
+#: ardour_ui.cc:1503
 msgid "WAV64"
 msgstr ""
 
-#: ardour_ui.cc:1316 session_option_editor.cc:185
+#: ardour_ui.cc:1506 session_option_editor.cc:202
 msgid "CAF"
 msgstr ""
 
-#: ardour_ui.cc:1319
+#: ardour_ui.cc:1509
 msgid "AIFF"
 msgstr ""
 
-#: ardour_ui.cc:1322
+#: ardour_ui.cc:1512
 msgid "iXML"
 msgstr ""
 
-#: ardour_ui.cc:1325
+#: ardour_ui.cc:1515 session_option_editor.cc:203
 msgid "RF64"
 msgstr ""
 
-#: ardour_ui.cc:1333
+#: ardour_ui.cc:1518
+msgid "RF64/WAV"
+msgstr ""
+
+#: ardour_ui.cc:1521
+msgid "MBWF"
+msgstr ""
+
+#: ardour_ui.cc:1529
 msgid "32-float"
 msgstr ""
 
-#: ardour_ui.cc:1336
+#: ardour_ui.cc:1532
 msgid "24-int"
 msgstr ""
 
-#: ardour_ui.cc:1339
+#: ardour_ui.cc:1535
 msgid "16-int"
 msgstr ""
 
-#: ardour_ui.cc:1358
+#: ardour_ui.cc:1556
+#, c-format
+msgid "X: <span foreground=\"%s\">>10K</span>"
+msgstr ""
+
+#: ardour_ui.cc:1558
+#, c-format
+msgid "X: <span foreground=\"%s\">%u</span>"
+msgstr ""
+
+#: ardour_ui.cc:1561
+#, c-format
+msgid "X: <span foreground=\"%s\">?</span>"
+msgstr ""
+
+#: ardour_ui.cc:1564
+msgid "Audio dropouts. Shift+click to reset"
+msgstr ""
+
+#: ardour_ui.cc:1577
 #, c-format
 msgid "DSP: <span foreground=\"%s\">%5.1f%%</span>"
 msgstr ""
 
-#: ardour_ui.cc:1377
+#: ardour_ui.cc:1587
+#, c-format
+msgid "PkBld: <span foreground=\"%s\">%d</span>"
+msgstr ""
+
+#: ardour_ui.cc:1609
 #, c-format
 msgid ""
 "Buffers: <span foreground=\"green\">p:</span><span foreground=\"%s\">"
@@ -952,215 +1110,263 @@ msgid ""
 "\">%<PRIu32>%%</span>"
 msgstr ""
 
-#: ardour_ui.cc:1418
+#: ardour_ui.cc:1650
 msgid "Disk: <span foreground=\"green\">Unknown</span>"
 msgstr ""
 
-#: ardour_ui.cc:1420
+#: ardour_ui.cc:1652
 msgid "Disk: <span foreground=\"green\">24hrs+</span>"
 msgstr ""
 
-#: ardour_ui.cc:1438
+#: ardour_ui.cc:1670
 msgid "Disk: <span foreground=\"green\">>24 hrs</span>"
 msgstr ""
 
-#: ardour_ui.cc:1449
+#: ardour_ui.cc:1681
 #, c-format
 msgid "Disk: <span foreground=\"%s\">%02dh:%02dm:%02ds</span>"
 msgstr ""
 
-#: ardour_ui.cc:1475
+#: ardour_ui.cc:1707
 #, c-format
 msgid "Timecode|TC: <span foreground=\"%s\">%s</span>"
 msgstr ""
 
-#: ardour_ui.cc:1596 ardour_ui.cc:1605 session_dialog.cc:318
-#: session_dialog.cc:323
-msgid "Recent Sessions"
-msgstr "Πρόσφατες συνεδρίες"
-
-#: ardour_ui.cc:1684
+#: ardour_ui.cc:1789
 msgid ""
 "%1 is not connected to any audio backend.\n"
 "You cannot open or close sessions in this condition"
 msgstr ""
 
-#: ardour_ui.cc:1708
+#: ardour_ui.cc:1807
 msgid "Open Session"
 msgstr "Άνοιγμα Συνεδρίας"
 
-#: ardour_ui.cc:1733 session_dialog.cc:349 session_import_dialog.cc:170
-#: session_metadata_dialog.cc:858
+#: ardour_ui.cc:1831 session_dialog.cc:410 session_import_dialog.cc:170
+#: session_metadata_dialog.cc:861
 msgid "%1 sessions"
 msgstr ""
 
-#: ardour_ui.cc:1770
+#: ardour_ui.cc:1879 ardour_ui.cc:1916
 msgid "You cannot add a track without a session already loaded."
 msgstr "Δεν γίνεται να προστεθεί κανάλι χωρίς ήδη φορτωμένη συνεδρία."
 
-#: ardour_ui.cc:1778
+#: ardour_ui.cc:1887
 msgid "could not create %1 new mixed track"
 msgid_plural "could not create %1 new mixed tracks"
 msgstr[0] ""
 msgstr[1] ""
 
-#: ardour_ui.cc:1784 ardour_ui.cc:1845
-msgid ""
-"There are insufficient ports available\n"
-"to create a new track or bus.\n"
-"You should save %1, exit and\n"
-"restart with more ports."
-msgstr ""
+#: ardour_ui.cc:1924
+msgid "could not create %1 new Midi Bus"
+msgid_plural "could not create %1 new Midi Busses"
+msgstr[0] ""
+msgstr[1] ""
 
-#: ardour_ui.cc:1819
+#: ardour_ui.cc:1977
 msgid "You cannot add a track or bus without a session already loaded."
 msgstr ""
 
-#: ardour_ui.cc:1828
+#: ardour_ui.cc:1986
 msgid "could not create %1 new audio track"
 msgid_plural "could not create %1 new audio tracks"
 msgstr[0] ""
 msgstr[1] ""
 
-#: ardour_ui.cc:1837
+#: ardour_ui.cc:1995
 msgid "could not create %1 new audio bus"
 msgid_plural "could not create %1 new audio busses"
 msgstr[0] ""
 msgstr[1] ""
 
-#: ardour_ui.cc:1990
+#: ardour_ui.cc:2020
 msgid ""
-"Please create one or more tracks before trying to record.\n"
-"You can do this with the \"Add Track or Bus\" option in the Session menu."
+"There are insufficient ports available\n"
+"to create a new track or bus.\n"
+"You should save %1, exit and\n"
+"restart with more ports."
 msgstr ""
 
-#: ardour_ui.cc:2376
-msgid "Save as..."
+#: ardour_ui.cc:2164
+msgid ""
+"Please create one or more tracks before trying to record.\n"
+"You can do this with the \"Add Track or Bus\" option in the Session menu."
 msgstr ""
 
-#: ardour_ui.cc:2377 ardour_ui.cc:2456
-msgid "New session name"
+#: ardour_ui.cc:2565
+#, c-format
+msgid "Copied %<PRId64> of %<PRId64>"
 msgstr ""
 
-#: ardour_ui.cc:2379
-msgid "Take Snapshot"
+#: ardour_ui.cc:2619 save_as_dialog.cc:33
+msgid "Save As"
 msgstr ""
 
-#: ardour_ui.cc:2380
-msgid "Name of new snapshot"
+#: ardour_ui.cc:2647
+msgid "Save As failed: %1"
 msgstr ""
 
-#: ardour_ui.cc:2405
+#: ardour_ui.cc:2684
 msgid ""
 "To ensure compatibility with various systems\n"
 "snapshot names may not contain a '%1' character"
 msgstr ""
 
-#: ardour_ui.cc:2417
+#: ardour_ui.cc:2698
 msgid "Confirm Snapshot Overwrite"
 msgstr ""
 
-#: ardour_ui.cc:2418
-msgid "A snapshot already exists with that name.  Do you want to overwrite it?"
+#: ardour_ui.cc:2699
+msgid "A snapshot already exists with that name. Do you want to overwrite it?"
 msgstr ""
 
-#: ardour_ui.cc:2421 utils_videotl.cc:74
-msgid "Overwrite"
+#: ardour_ui.cc:2724
+msgid "Snapshot and switch"
+msgstr ""
+
+#: ardour_ui.cc:2725 ardour_ui.cc:2776
+msgid "New session name"
+msgstr ""
+
+#: ardour_ui.cc:2727
+msgid "Take Snapshot"
+msgstr ""
+
+#: ardour_ui.cc:2728
+msgid "Name of new snapshot"
 msgstr ""
 
-#: ardour_ui.cc:2455
+#: ardour_ui.cc:2775
 msgid "Rename Session"
 msgstr ""
 
-#: ardour_ui.cc:2470 ardour_ui.cc:2886 ardour_ui.cc:2924
+#: ardour_ui.cc:2790 ardour_ui.cc:3267 ardour_ui.cc:3305
 msgid ""
 "To ensure compatibility with various systems\n"
 "session names may not contain a '%1' character"
 msgstr ""
 
-#: ardour_ui.cc:2478
+#: ardour_ui.cc:2798
 msgid ""
 "That name is already in use by another directory/folder. Please try again."
 msgstr ""
 
-#: ardour_ui.cc:2487
+#: ardour_ui.cc:2807
 msgid ""
 "Renaming this session failed.\n"
 "Things could be seriously messed up at this point"
 msgstr ""
 
-#: ardour_ui.cc:2602
+#: ardour_ui.cc:2923 route_ui.cc:1867
+msgid "Confirm Template Overwrite"
+msgstr ""
+
+#: ardour_ui.cc:2924 route_ui.cc:1868
+msgid "A template already exists with that name. Do you want to overwrite it?"
+msgstr ""
+
+#: ardour_ui.cc:2948
 msgid "Save Template"
 msgstr ""
 
-#: ardour_ui.cc:2603
+#: ardour_ui.cc:2949
 msgid "Name for template:"
 msgstr ""
 
-#: ardour_ui.cc:2604
+#: ardour_ui.cc:2950
 msgid "-template"
 msgstr "-προσχέδιο"
 
-#: ardour_ui.cc:2643
+#: ardour_ui.cc:2987
 msgid ""
 "This session\n"
 "%1\n"
 "already exists. Do you want to open it?"
 msgstr ""
 
-#: ardour_ui.cc:2653
+#: ardour_ui.cc:2997
 msgid "Open Existing Session"
 msgstr ""
 
-#: ardour_ui.cc:2914
+#: ardour_ui.cc:3295
 msgid "There is no existing session at \"%1\""
 msgstr ""
 
-#: ardour_ui.cc:3006
+#: ardour_ui.cc:3391
 msgid "Please wait while %1 loads your session"
 msgstr ""
 
-#: ardour_ui.cc:3021
+#: ardour_ui.cc:3406
 msgid "Port Registration Error"
 msgstr ""
 
-#: ardour_ui.cc:3022
+#: ardour_ui.cc:3407
 msgid "Click the Close button to try again."
 msgstr ""
 
-#: ardour_ui.cc:3043
-msgid "Session \"%1 (snapshot %2)\" did not load successfully"
-msgstr "Η Συνεδρία \"%1 (στιγμιότυπο %2)\" δεν φορτώθηκε επιτυχώς"
+#: ardour_ui.cc:3426
+msgid "Session \"%1 (snapshot %2)\" did not load successfully: %3"
+msgstr ""
 
-#: ardour_ui.cc:3049
+#: ardour_ui.cc:3432 ardour_ui.cc:3453 ardour_ui.cc:3548 ardour_ui.cc:3557
 msgid "Loading Error"
 msgstr ""
 
-#: ardour_ui.cc:3068
+#: ardour_ui.cc:3447
+msgid "Session \"%1 (snapshot %2)\" did not load successfully"
+msgstr "Η Συνεδρία \"%1 (στιγμιότυπο %2)\" δεν φορτώθηκε επιτυχώς"
+
+#: ardour_ui.cc:3475
 msgid ""
 "This session has been opened in read-only mode.\n"
 "\n"
 "You will not be able to record or save."
 msgstr ""
 
-#: ardour_ui.cc:3073
+#: ardour_ui.cc:3480
 msgid "Read-only Session"
 msgstr ""
 
-#: ardour_ui.cc:3139
+#: ardour_ui.cc:3547
+msgid "Could not create session in \"%1\": %2"
+msgstr ""
+
+#: ardour_ui.cc:3556
 msgid "Could not create session in \"%1\""
 msgstr ""
 
-#: ardour_ui.cc:3288
+#: ardour_ui.cc:3601
+msgid ""
+"<b>Just ask and wait for an answer.\n"
+"It may take from minutes to hours.</b>"
+msgstr ""
+
+#: ardour_ui.cc:3603
+msgid "About the Chat"
+msgstr ""
+
+#: ardour_ui.cc:3604
+msgid ""
+"When you're inside the chat just ask your question and wait for an answer. "
+"The chat is occupied by real people with real lives so many of them are "
+"passively online and might not read your question before minutes or hours "
+"later.\n"
+"So please be patient and wait for an answer.\n"
+"\n"
+"You should just leave the chat window open and check back regularly until "
+"someone has answered your question."
+msgstr ""
+
+#: ardour_ui.cc:3723
 msgid "No files were ready for clean-up"
 msgstr ""
 
-#: ardour_ui.cc:3292 ardour_ui.cc:3302 ardour_ui.cc:3435 ardour_ui.cc:3442
-#: ardour_ui_ed.cc:103
+#: ardour_ui.cc:3727 ardour_ui.cc:3737 ardour_ui.cc:3870 ardour_ui.cc:3877
+#: ardour_ui_ed.cc:129
 msgid "Clean-up"
 msgstr ""
 
-#: ardour_ui.cc:3293
+#: ardour_ui.cc:3728
 msgid ""
 "If this seems suprising, \n"
 "check for any existing snapshots.\n"
@@ -1173,19 +1379,19 @@ msgstr ""
 "χρειάζονται κάποια αρχεία που δεν\n"
 "χρησιμοποιούνται αλλού."
 
-#: ardour_ui.cc:3352
+#: ardour_ui.cc:3787
 msgid "kilo"
 msgstr ""
 
-#: ardour_ui.cc:3355
+#: ardour_ui.cc:3790
 msgid "mega"
 msgstr ""
 
-#: ardour_ui.cc:3358
+#: ardour_ui.cc:3793
 msgid "giga"
 msgstr ""
 
-#: ardour_ui.cc:3363
+#: ardour_ui.cc:3798
 msgid ""
 "The following file was deleted from %2,\n"
 "releasing %3 %4bytes of disk space"
@@ -1195,7 +1401,7 @@ msgid_plural ""
 msgstr[0] ""
 msgstr[1] ""
 
-#: ardour_ui.cc:3370
+#: ardour_ui.cc:3805
 msgid ""
 "The following file was not in use and \n"
 "has been moved to: %2\n"
@@ -1217,90 +1423,126 @@ msgid_plural ""
 msgstr[0] ""
 msgstr[1] ""
 
-#: ardour_ui.cc:3430
+#: ardour_ui.cc:3865
 msgid "Are you sure you want to clean-up?"
 msgstr ""
 
-#: ardour_ui.cc:3437
+#: ardour_ui.cc:3872
 msgid ""
 "Clean-up is a destructive operation.\n"
 "ALL undo/redo information will be lost if you clean-up.\n"
 "Clean-up will move all unused files to a \"dead\" location."
 msgstr ""
 
-#: ardour_ui.cc:3445
+#: ardour_ui.cc:3880
 msgid "CleanupDialog"
 msgstr ""
 
-#: ardour_ui.cc:3475
+#: ardour_ui.cc:3910
 msgid "Cleaned Files"
 msgstr ""
 
-#: ardour_ui.cc:3492
+#: ardour_ui.cc:3927
 msgid "deleted file"
 msgstr "διαγραμμένα αρχεία"
 
-#: ardour_ui.cc:3637
+#: ardour_ui.cc:4133
+msgid "Cannot read session script '%1': %2"
+msgstr ""
+
+#: ardour_ui.cc:4142 luainstance.cc:1087
+msgid "Set Script Parameters"
+msgstr ""
+
+#: ardour_ui.cc:4153
+msgid "Session script '%1' instantiation failed: %2"
+msgstr ""
+
+#: ardour_ui.cc:4157
+msgid "Loading Session script '%1' failed: %2"
+msgstr ""
+
+#: ardour_ui.cc:4170
+msgid "There are no active Lua session scripts present in this session."
+msgstr ""
+
+#: ardour_ui.cc:4187
+msgid "Session script '%1' removal failed: %2"
+msgstr ""
+
+#: ardour_ui.cc:4197
 msgid "Video-Server was not launched by %1. The request to stop it is ignored."
 msgstr ""
 
-#: ardour_ui.cc:3641
+#: ardour_ui.cc:4201
 msgid "Stop Video-Server"
 msgstr ""
 
-#: ardour_ui.cc:3642
+#: ardour_ui.cc:4202
 msgid "Do you really want to stop the Video Server?"
 msgstr ""
 
-#: ardour_ui.cc:3645
+#: ardour_ui.cc:4205
 msgid "Yes, Stop It"
 msgstr ""
 
-#: ardour_ui.cc:3671
+#: ardour_ui.cc:4231
 msgid "The Video Server is already started."
 msgstr ""
 
-#: ardour_ui.cc:3673
+#: ardour_ui.cc:4233
 msgid ""
 "An external Video Server is configured and can be reached. Not starting a "
 "new instance."
 msgstr ""
 
-#: ardour_ui.cc:3681 ardour_ui.cc:3786
+#: ardour_ui.cc:4241 ardour_ui.cc:4346
 msgid ""
 "Could not connect to the Video Server. Start it or configure its access URL "
 "in Preferences."
 msgstr ""
 
-#: ardour_ui.cc:3711
+#: ardour_ui.cc:4271
 msgid "Specified docroot is not an existing directory."
 msgstr ""
 
-#: ardour_ui.cc:3717 ardour_ui.cc:3723
+#: ardour_ui.cc:4277 ardour_ui.cc:4283
 msgid "Given Video Server is not an executable file."
 msgstr ""
 
-#: ardour_ui.cc:3757
+#: ardour_ui.cc:4317
 msgid "Cannot launch the video-server"
 msgstr ""
 
-#: ardour_ui.cc:3767
+#: ardour_ui.cc:4327
 msgid "Video-server was started but does not respond to requests..."
 msgstr ""
 
-#: ardour_ui.cc:3812 editor_audio_import.cc:641
+#: ardour_ui.cc:4372 editor_audio_import.cc:647
 msgid "could not open %1"
 msgstr "δεν μπόρεσα να ανοίξω το %1"
 
-#: ardour_ui.cc:3816
+#: ardour_ui.cc:4376
 msgid "no video-file selected"
 msgstr ""
 
-#: ardour_ui.cc:4014
+#: ardour_ui.cc:4472
+msgid "No LTC detected, video will not be aligned."
+msgstr ""
+
+#: ardour_ui.cc:4478
+msgid "Align video-start to %1 [samples]"
+msgstr ""
+
+#: ardour_ui.cc:4654
+msgid "xrun"
+msgstr ""
+
+#: ardour_ui.cc:4663
 msgid "Recording was stopped because your system could not keep up."
 msgstr "η Εγγραφή διεκόπη διότι το σύστημά δεν μπορούσε να ανταπεξέλθει."
 
-#: ardour_ui.cc:4043
+#: ardour_ui.cc:4692
 msgid ""
 "The disk system on your computer\n"
 "was not able to keep up with %1.\n"
@@ -1309,23 +1551,23 @@ msgid ""
 "quickly enough to keep up with recording.\n"
 msgstr ""
 
-#: ardour_ui.cc:4113
+#: ardour_ui.cc:4765
 msgid "Scanning for plugins"
 msgstr ""
 
-#: ardour_ui.cc:4115
+#: ardour_ui.cc:4767
 msgid "Cancel plugin scan"
 msgstr ""
 
-#: ardour_ui.cc:4124
+#: ardour_ui.cc:4776
 msgid "Stop Timeout"
 msgstr ""
 
-#: ardour_ui.cc:4131
+#: ardour_ui.cc:4783
 msgid "Scan Timeout"
 msgstr ""
 
-#: ardour_ui.cc:4174
+#: ardour_ui.cc:4827
 msgid ""
 "The disk system on your computer\n"
 "was not able to keep up with %1.\n"
@@ -1334,11 +1576,11 @@ msgid ""
 "quickly enough to keep up with playback.\n"
 msgstr ""
 
-#: ardour_ui.cc:4214
+#: ardour_ui.cc:4862
 msgid "Crash Recovery"
 msgstr ""
 
-#: ardour_ui.cc:4215
+#: ardour_ui.cc:4863
 msgid ""
 "This session appears to have been in the\n"
 "middle of recording when %1 or\n"
@@ -1349,42 +1591,43 @@ msgid ""
 "what you would like to do.\n"
 msgstr ""
 
-#: ardour_ui.cc:4227
+#: ardour_ui.cc:4875
 msgid "Ignore crash data"
 msgstr "Διαγραφή τυχόν δεδομένων"
 
-#: ardour_ui.cc:4228
+#: ardour_ui.cc:4876
 msgid "Recover from crash"
 msgstr "Ανάκληση από 'κρασάρισμα'"
 
-#: ardour_ui.cc:4248
+#: ardour_ui.cc:4896
 msgid "Sample Rate Mismatch"
 msgstr ""
 
-#: ardour_ui.cc:4249
+#: ardour_ui.cc:4897
 msgid ""
 "This session was created with a sample rate of %1 Hz, but\n"
 "%2 is currently running at %3 Hz.  If you load this session,\n"
 "audio may be played at the wrong sample rate.\n"
 msgstr ""
 
-#: ardour_ui.cc:4258
+#: ardour_ui.cc:4906
 msgid "Do not load session"
 msgstr ""
 
-#: ardour_ui.cc:4259
+#: ardour_ui.cc:4907
 msgid "Load session anyway"
 msgstr ""
 
-#: ardour_ui.cc:4286
-msgid "Could not disconnect from Audio/MIDI engine"
-msgstr ""
-
-#: ardour_ui.cc:4303 ardour_ui.cc:4306
-msgid "Could not reconnect to the Audio/MIDI engine"
+#: ardour_ui.cc:4927
+msgid ""
+"This session was created with a sample rate of %1 Hz, but\n"
+"%2 is currently running at %3 Hz.\n"
+"Audio will be recorded and played at the wrong sample rate.\n"
+"Re-Configure the Audio Engine in\n"
+"Menu > Window > Audio/Midi Setup"
 msgstr ""
 
-#: ardour_ui.cc:4590
+#: ardour_ui.cc:5209
 msgid ""
 "%4This is a session from an older version of %3%5\n"
 "\n"
@@ -1396,88 +1639,113 @@ msgid ""
 "\n"
 "%6%2%7\n"
 "\n"
-"From now on, use the -2000 version with older versions of %3"
+"From now on, use the backup copy with older versions of %3"
 msgstr ""
 
-#: ardour_ui2.cc:73
-msgid "UI: cannot setup editor"
-msgstr "UI: Ο 'editor' δεν μπορεί να εγερθεί"
+#: ardour_ui.cc:5331
+msgid "This is a free/demo copy of %1. It has just switched to silent mode."
+msgstr ""
 
-#: ardour_ui2.cc:78
-msgid "UI: cannot setup mixer"
-msgstr "UI: ο μίκτης δεν μπορεί να εγερθεί"
+#: ardour_ui.cc:5337
+msgid "%1 is now silent"
+msgstr ""
 
-#: ardour_ui2.cc:83
-msgid "UI: cannot setup meterbridge"
+#: ardour_ui.cc:5339
+msgid ""
+"Please consider paying for a copy of %1 - you can pay whatever you want."
+msgstr ""
+
+#: ardour_ui.cc:5340
+msgid "Better yet become a subscriber - subscriptions start at US$1 per month."
+msgstr ""
+
+#: ardour_ui.cc:5341
+msgid "Pay for a copy (via the web)"
 msgstr ""
 
-#: ardour_ui2.cc:128
+#: ardour_ui.cc:5342
+msgid "Become a subscriber (via the web)"
+msgstr ""
+
+#: ardour_ui.cc:5361
+msgid "Remain silent"
+msgstr ""
+
+#: ardour_ui.cc:5363
+msgid "Give me more time"
+msgstr ""
+
+#: ardour_ui.cc:5656
+msgid "Global keybindings are missing"
+msgstr ""
+
+#: ardour_ui2.cc:79
 msgid "Play from playhead"
 msgstr "Αναπαρ/γή από τον Αναπαραγωγέα"
 
-#: ardour_ui2.cc:129
+#: ardour_ui2.cc:80
 msgid "Stop playback"
 msgstr "Διακοπή Αναπαρ/γής"
 
-#: ardour_ui2.cc:130
+#: ardour_ui2.cc:81
 msgid "Toggle record"
 msgstr ""
 
-#: ardour_ui2.cc:131
+#: ardour_ui2.cc:82
 msgid "Play range/selection"
 msgstr "Αναπαρ/γή διαστήματος/επιλογής"
 
-#: ardour_ui2.cc:132
+#: ardour_ui2.cc:83
 msgid "Go to start of session"
 msgstr "Αρχή της συνεδρίας"
 
-#: ardour_ui2.cc:133
+#: ardour_ui2.cc:84
 msgid "Go to end of session"
 msgstr "Τέλος του συνεδρίας"
 
-#: ardour_ui2.cc:134
+#: ardour_ui2.cc:85
 msgid "Play loop range"
 msgstr "Επαναληπτική αναπαρ/γή διαστήματος"
 
-#: ardour_ui2.cc:135
+#: ardour_ui2.cc:86
 msgid ""
 "MIDI Panic\n"
 "Send note off and reset controller messages on all MIDI channels"
 msgstr ""
 
-#: ardour_ui2.cc:136
+#: ardour_ui2.cc:87
 msgid "Return to last playback start when stopped"
 msgstr "Επιστροφή στην τελευταία θεση μετα απο παύση"
 
-#: ardour_ui2.cc:137
-msgid "Playhead follows Range Selections and Edits"
+#: ardour_ui2.cc:88
+msgid "Playhead follows range selections and edits"
 msgstr ""
 
-#: ardour_ui2.cc:138
+#: ardour_ui2.cc:89
 msgid "Be sensible about input monitoring"
 msgstr "Προσοχή στο input monitoring"
 
-#: ardour_ui2.cc:139
+#: ardour_ui2.cc:90
 msgid "Enable/Disable audio click"
 msgstr "Άρση/Παύση μετρονόμου"
 
-#: ardour_ui2.cc:140 monitor_section.cc:111
+#: ardour_ui2.cc:91 monitor_section.cc:129
 msgid ""
 "When active, something is soloed.\n"
 "Click to de-solo everything"
 msgstr ""
 
-#: ardour_ui2.cc:141
+#: ardour_ui2.cc:92
 msgid ""
-"When active, auditioning is taking place\n"
+"When active, auditioning is taking place.\n"
 "Click to stop the audition"
 msgstr ""
 
-#: ardour_ui2.cc:142
+#: ardour_ui2.cc:93
 msgid "When active, there is a feedback loop."
 msgstr ""
 
-#: ardour_ui2.cc:143
+#: ardour_ui2.cc:94
 msgid ""
 "<b>Primary Clock</b> right-click to set display mode. Click to edit, click"
 "+drag a digit or mouse-over+scroll wheel to modify.\n"
@@ -1485,7 +1753,7 @@ msgid ""
 "confirm; postfix the edit with '+' or '-' to enter delta times.\n"
 msgstr ""
 
-#: ardour_ui2.cc:144
+#: ardour_ui2.cc:95
 msgid ""
 "<b>Secondary Clock</b> right-click to set display mode. Click to edit, click"
 "+drag a digit or mouse-over+scroll wheel to modify.\n"
@@ -1493,450 +1761,559 @@ msgid ""
 "confirm; postfix the edit with '+' or '-' to enter delta times.\n"
 msgstr ""
 
-#: ardour_ui2.cc:145
+#: ardour_ui2.cc:96
 msgid "Reset All Peak Indicators"
 msgstr ""
 
-#: ardour_ui2.cc:146
+#: ardour_ui2.cc:97
 msgid "Show Error Log and acknowledge warnings"
 msgstr ""
 
-#: ardour_ui2.cc:179
+#: ardour_ui2.cc:130
 msgid "[ERROR]: "
 msgstr ""
 
-#: ardour_ui2.cc:182
+#: ardour_ui2.cc:133
 msgid "[WARNING]: "
 msgstr ""
 
-#: ardour_ui2.cc:185
+#: ardour_ui2.cc:136
 msgid "[INFO]: "
 msgstr ""
 
-#: ardour_ui2.cc:253 ardour_ui_ed.cc:403
+#: ardour_ui2.cc:197 ardour_ui_ed.cc:509
 msgid "Auto Return"
 msgstr ""
 
-#: ardour_ui2.cc:255 ardour_ui_ed.cc:406
+#: ardour_ui2.cc:199 ardour_ui_ed.cc:512
 msgid "Follow Edits"
 msgstr ""
 
-#: ardour_ui2.cc:716 rc_option_editor.cc:2300
+#: ardour_ui2.cc:422 ardour_ui2.cc:426 ardour_ui2.cc:430
+msgid ""
+"Drag this tab to the desktop to show %1 in its own window\n"
+"\n"
+"To put the window back, use the Window > %1 > Attach menu action"
+msgstr ""
+
+#: ardour_ui2.cc:638
 msgid "GUI"
 msgstr ""
 
-#: ardour_ui2.cc:733 rc_option_editor.cc:1309 rc_option_editor.cc:1327
-#: rc_option_editor.cc:1330 rc_option_editor.cc:1332 rc_option_editor.cc:1334
-#: rc_option_editor.cc:1342 rc_option_editor.cc:1350 rc_option_editor.cc:1352
-#: rc_option_editor.cc:1360 rc_option_editor.cc:1367 rc_option_editor.cc:1376
-#: rc_option_editor.cc:1378 rc_option_editor.cc:1380 rc_option_editor.cc:1388
-#: rc_option_editor.cc:1390 rc_option_editor.cc:1399
-#: session_option_editor.cc:321 session_option_editor.cc:323
-#: session_option_editor.cc:344 session_option_editor.cc:346
-#: session_option_editor.cc:348 session_option_editor.cc:355
-#: session_option_editor.cc:362 session_option_editor.cc:366
+#: ardour_ui2.cc:651 rc_option_editor.cc:1874 rc_option_editor.cc:1892
+#: rc_option_editor.cc:1895 rc_option_editor.cc:1897 rc_option_editor.cc:1899
+#: rc_option_editor.cc:1907 rc_option_editor.cc:1909 rc_option_editor.cc:1917
+#: rc_option_editor.cc:1925 rc_option_editor.cc:1932 rc_option_editor.cc:1953
+#: rc_option_editor.cc:1955 rc_option_editor.cc:1964
+#: session_option_editor.cc:342 session_option_editor.cc:344
+#: session_option_editor.cc:365 session_option_editor.cc:367
+#: session_option_editor.cc:369 session_option_editor.cc:376
+#: session_option_editor.cc:383 session_option_editor.cc:387
 msgid "Misc"
 msgstr "Διάφορα"
 
-#: ardour_ui_dependents.cc:76
+#: ardour_ui_dependents.cc:118
 msgid "Setup Editor"
 msgstr ""
 
-#: ardour_ui_dependents.cc:78
+#: ardour_ui_dependents.cc:120
 msgid "Setup Mixer"
 msgstr ""
 
-#: ardour_ui_dependents.cc:84
+#: ardour_ui_dependents.cc:127
 msgid "Reload Session History"
 msgstr ""
 
-#: ardour_ui_dialogs.cc:250
+#: ardour_ui_dependents.cc:248
+msgid "UI: cannot setup editor"
+msgstr "UI: Ο 'editor' δεν μπορεί να εγερθεί"
+
+#: ardour_ui_dependents.cc:253
+msgid "UI: cannot setup mixer"
+msgstr "UI: ο μίκτης δεν μπορεί να εγερθεί"
+
+#: ardour_ui_dependents.cc:258
+msgid "UI: cannot setup meterbridge"
+msgstr ""
+
+#: ardour_ui_dependents.cc:263
+msgid "UI: cannot setup luawindow"
+msgstr ""
+
+#: ardour_ui_dependents.cc:269 ardour_ui_ed.cc:136 ardour_ui_ed.cc:257
+#: rc_option_editor.cc:1853 rc_option_editor.cc:3487
+msgid "Preferences"
+msgstr ""
+
+#: ardour_ui_dependents.cc:270 ardour_ui_ed.cc:134 mixer_ui.cc:100
+#: mixer_ui.cc:410
+msgid "Mixer"
+msgstr ""
+
+#: ardour_ui_dependents.cc:271 ardour_ui_ed.cc:135 editor.cc:5790
+#: editor.cc:6062 public_editor.cc:34 rc_option_editor.cc:2201
+#: rc_option_editor.cc:2215 rc_option_editor.cc:2219 rc_option_editor.cc:2227
+#: rc_option_editor.cc:2236 rc_option_editor.cc:2244 rc_option_editor.cc:2253
+#: rc_option_editor.cc:2261 rc_option_editor.cc:2269 rc_option_editor.cc:2279
+#: rc_option_editor.cc:2281 rc_option_editor.cc:2305 rc_option_editor.cc:2317
+#: rc_option_editor.cc:2328 rc_option_editor.cc:2346
+msgid "Editor"
+msgstr ""
+
+#: ardour_ui_dialogs.cc:263
 msgid "Don't close"
 msgstr ""
 
-#: ardour_ui_dialogs.cc:251
+#: ardour_ui_dialogs.cc:264
 msgid "Just close"
 msgstr ""
 
-#: ardour_ui_dialogs.cc:252
+#: ardour_ui_dialogs.cc:265
 msgid "Save and close"
 msgstr ""
 
-#: ardour_ui_dialogs.cc:362
-msgid "This screen is not tall enough to display the mixer window"
+#: ardour_ui_ed.cc:124
+msgid "Escape"
 msgstr ""
 
-#: ardour_ui_ed.cc:102
+#: ardour_ui_ed.cc:128
 msgid "Session"
 msgstr "Συνεδρία"
 
-#: ardour_ui_ed.cc:105 editor_actions.cc:138 editor_regions.cc:116
-#: port_group.cc:458 session_option_editor.cc:82 session_option_editor.cc:89
+#: ardour_ui_ed.cc:131 editor_actions.cc:141 editor_regions.cc:163
+#: port_group.cc:468 session_option_editor.cc:82 session_option_editor.cc:89
 msgid "Sync"
 msgstr "Sync"
 
-#: ardour_ui_ed.cc:106
+#: ardour_ui_ed.cc:132
 msgid "Options"
 msgstr "Επιλογές"
 
-#: ardour_ui_ed.cc:107
+#: ardour_ui_ed.cc:133
 msgid "Window"
 msgstr ""
 
-#: ardour_ui_ed.cc:108
+#: ardour_ui_ed.cc:137 ardour_ui_ed.cc:267 ardour_ui_ed.cc:268
+#: ardour_ui_ed.cc:269
+msgid "Detach"
+msgstr ""
+
+#: ardour_ui_ed.cc:138
 msgid "Help"
 msgstr "Βοήθεια!"
 
-#: ardour_ui_ed.cc:109
+#: ardour_ui_ed.cc:139
 msgid "Misc. Shortcuts"
 msgstr ""
 
-#: ardour_ui_ed.cc:110
+#: ardour_ui_ed.cc:140
 msgid "Audio File Format"
 msgstr ""
 
-#: ardour_ui_ed.cc:111
+#: ardour_ui_ed.cc:141
 msgid "File Type"
 msgstr ""
 
-#: ardour_ui_ed.cc:112 export_format_dialog.cc:67
+#: ardour_ui_ed.cc:142 export_format_dialog.cc:75
 msgid "Sample Format"
 msgstr ""
 
-#: ardour_ui_ed.cc:113 rc_option_editor.cc:2245 rc_option_editor.cc:2257
+#: ardour_ui_ed.cc:143 rc_option_editor.cc:2841
 msgid "Control Surfaces"
 msgstr "Επιφάνειες ελέγχου"
 
-#: ardour_ui_ed.cc:114 rc_option_editor.cc:1921 rc_option_editor.cc:2264
+#: ardour_ui_ed.cc:144 rc_option_editor.cc:2847 rc_option_editor.cc:2853
+#: rc_option_editor.cc:2862 rc_option_editor.cc:2873 rc_option_editor.cc:2883
+#: rc_option_editor.cc:2945 rc_option_editor.cc:2962 rc_option_editor.cc:2978
+#: rc_option_editor.cc:2979 rc_option_editor.cc:2988 rc_option_editor.cc:3002
+#: rc_option_editor.cc:3005 rc_option_editor.cc:3013 rc_option_editor.cc:3021
 msgid "Plugins"
 msgstr "Plugins"
 
-#: ardour_ui_ed.cc:115 rc_option_editor.cc:2351
+#: ardour_ui_ed.cc:145 rc_option_editor.cc:3169
 msgid "Metering"
 msgstr "Μέτρηση"
 
-#: ardour_ui_ed.cc:116
+#: ardour_ui_ed.cc:146
 msgid "Fall Off Rate"
 msgstr ""
 
-#: ardour_ui_ed.cc:117
+#: ardour_ui_ed.cc:147
 msgid "Hold Time"
 msgstr ""
 
-#: ardour_ui_ed.cc:118
+#: ardour_ui_ed.cc:148
 msgid "Denormal Handling"
 msgstr ""
 
-#: ardour_ui_ed.cc:122 route_time_axis.cc:1677
+#: ardour_ui_ed.cc:152 route_time_axis.cc:1683
 msgid "New..."
 msgstr ""
 
-#: ardour_ui_ed.cc:124
+#: ardour_ui_ed.cc:154
 msgid "Open..."
 msgstr ""
 
-#: ardour_ui_ed.cc:125
+#: ardour_ui_ed.cc:155
 msgid "Recent..."
 msgstr ""
 
-#: ardour_ui_ed.cc:126 panner_editor.cc:29 playlist_selector.cc:64
+#: ardour_ui_ed.cc:156 panner_editor.cc:29 playlist_selector.cc:64
 msgid "Close"
 msgstr "Κλείσιμο"
 
-#: ardour_ui_ed.cc:129
+#: ardour_ui_ed.cc:159
 msgid "Add Track or Bus..."
 msgstr ""
 
-#: ardour_ui_ed.cc:134
-msgid "Open Video"
+#: ardour_ui_ed.cc:163
+msgid "Duplicate Tracks/Busses..."
+msgstr ""
+
+#: ardour_ui_ed.cc:169
+msgid "Cancel Solo"
 msgstr ""
 
-#: ardour_ui_ed.cc:137
+#: ardour_ui_ed.cc:173
+msgid "Session|Scripting"
+msgstr ""
+
+#: ardour_ui_ed.cc:176
+msgid "Add Lua Script..."
+msgstr ""
+
+#: ardour_ui_ed.cc:180
+msgid "Remove Lua Script"
+msgstr ""
+
+#: ardour_ui_ed.cc:184
+msgid "Open Video..."
+msgstr ""
+
+#: ardour_ui_ed.cc:187
 msgid "Remove Video"
 msgstr ""
 
-#: ardour_ui_ed.cc:140
-msgid "Export To Video File"
+#: ardour_ui_ed.cc:190
+msgid "Export to Video File..."
 msgstr ""
 
-#: ardour_ui_ed.cc:144
-msgid "Snapshot..."
+#: ardour_ui_ed.cc:194
+msgid "Snapshot (& keep working on current version) ..."
 msgstr ""
 
-#: ardour_ui_ed.cc:148
+#: ardour_ui_ed.cc:197
+msgid "Snapshot (& switch to new version) ..."
+msgstr ""
+
+#: ardour_ui_ed.cc:200
+msgid "Quick Snapshot (& keep working on current version) ..."
+msgstr ""
+
+#: ardour_ui_ed.cc:203
+msgid "Quick Snapshot (& switch to new version) ..."
+msgstr ""
+
+#: ardour_ui_ed.cc:207
 msgid "Save As..."
 msgstr ""
 
-#: ardour_ui_ed.cc:152 editor_actions.cc:1771 editor_markers.cc:903
-#: editor_snapshots.cc:124 mixer_strip.cc:1518 route_time_axis.cc:1673
+#: ardour_ui_ed.cc:210 editor_actions.cc:1788 editor_markers.cc:908
+#: editor_snapshots.cc:136 mixer_strip.cc:1653 route_time_axis.cc:1679
 msgid "Rename..."
 msgstr ""
 
-#: ardour_ui_ed.cc:156
+#: ardour_ui_ed.cc:214
 msgid "Save Template..."
 msgstr "Αποθήκευση προσχεδίου..."
 
-#: ardour_ui_ed.cc:159
+#: ardour_ui_ed.cc:217
 msgid "Metadata"
 msgstr ""
 
-#: ardour_ui_ed.cc:162
+#: ardour_ui_ed.cc:220
 msgid "Edit Metadata..."
 msgstr ""
 
-#: ardour_ui_ed.cc:165
+#: ardour_ui_ed.cc:223
 msgid "Import Metadata..."
 msgstr ""
 
-#: ardour_ui_ed.cc:168
-msgid "Export To Audio File(s)..."
+#: ardour_ui_ed.cc:226
+msgid "Export to Audio File(s)..."
 msgstr ""
 
-#: ardour_ui_ed.cc:171
+#: ardour_ui_ed.cc:229
 msgid "Stem export..."
 msgstr ""
 
-#: ardour_ui_ed.cc:174 editor_export_audio.cc:65 export_dialog.cc:129
-#: export_video_dialog.cc:84
+#: ardour_ui_ed.cc:232 editor_export_audio.cc:66
+#: export_channel_selector.cc:190 export_channel_selector.cc:578
+#: export_dialog.cc:131 export_video_dialog.cc:80
 msgid "Export"
 msgstr "Εξαγωγή"
 
-#: ardour_ui_ed.cc:177
+#: ardour_ui_ed.cc:235
 msgid "Clean-up Unused Sources..."
 msgstr ""
 
-#: ardour_ui_ed.cc:181
+#: ardour_ui_ed.cc:239
+msgid "Reset Peak Files"
+msgstr ""
+
+#: ardour_ui_ed.cc:243
 msgid "Flush Wastebasket"
 msgstr ""
 
-#: ardour_ui_ed.cc:188
+#: ardour_ui_ed.cc:251
 msgid "Quit"
 msgstr "Έξοδος"
 
-#: ardour_ui_ed.cc:192
+#: ardour_ui_ed.cc:252 ardour_ui_ed.cc:259 ardour_ui_ed.cc:260
+#: ardour_ui_ed.cc:261 automation_time_axis.cc:545 editor_actions.cc:686
+#: editor_markers.cc:907 location_ui.cc:61 plugin_selector.cc:97
+#: route_time_axis.cc:864
+msgid "Hide"
+msgstr "Κρύψιμο"
+
+#: ardour_ui_ed.cc:263 ardour_ui_ed.cc:264 ardour_ui_ed.cc:265
+msgid "Attach"
+msgstr ""
+
+#: ardour_ui_ed.cc:275 ardour_ui_ed.cc:276 ardour_ui_ed.cc:277
+#: ardour_ui_ed.cc:283 ardour_ui_ed.cc:284 ardour_ui_ed.cc:285
+msgid "Change"
+msgstr ""
+
+#: ardour_ui_ed.cc:287
+msgid "Previous Tab"
+msgstr ""
+
+#: ardour_ui_ed.cc:288
+msgid "Next Tab"
+msgstr ""
+
+#: ardour_ui_ed.cc:290
+msgid "Toggle Editor & Mixer"
+msgstr ""
+
+#: ardour_ui_ed.cc:294
 msgid "Maximise Editor Space"
 msgstr "Μεγιστοποίηση χώρου για τον Editor"
 
-#: ardour_ui_ed.cc:193
+#: ardour_ui_ed.cc:295
 msgid "Maximise Mixer Space"
 msgstr ""
 
-#: ardour_ui_ed.cc:194
-msgid "Show Toolbars"
+#: ardour_ui_ed.cc:298
+msgid "Toggle Mixer List"
 msgstr ""
 
-#: ardour_ui_ed.cc:198
-msgid "Show more UI preferences"
+#: ardour_ui_ed.cc:301
+msgid "Toggle Monitor Section Visibility"
 msgstr ""
 
-#: ardour_ui_ed.cc:200 mixer_ui.cc:1924 mixer_ui.cc:1930
-msgid "Window|Mixer"
+#: ardour_ui_ed.cc:305
+msgid "Show more UI preferences"
 msgstr ""
 
-#: ardour_ui_ed.cc:201
-msgid "Toggle Editor+Mixer"
+#: ardour_ui_ed.cc:308
+msgid "Window|Scripting"
 msgstr ""
 
-#: ardour_ui_ed.cc:202 meterbridge.cc:218 meterbridge.cc:224
+#: ardour_ui_ed.cc:309 meterbridge.cc:214 meterbridge.cc:220
 msgid "Window|Meterbridge"
 msgstr ""
 
-#: ardour_ui_ed.cc:204
-msgid "Reattach All Tearoffs"
-msgstr ""
-
-#: ardour_ui_ed.cc:206 midi_tracer.cc:45
+#: ardour_ui_ed.cc:311 midi_tracer.cc:45
 msgid "MIDI Tracer"
 msgstr ""
 
-#: ardour_ui_ed.cc:208
+#: ardour_ui_ed.cc:314
 msgid "Chat"
 msgstr ""
 
-#: ardour_ui_ed.cc:210
+#: ardour_ui_ed.cc:316
 msgid "Help|Manual"
 msgstr ""
 
-#: ardour_ui_ed.cc:211
-msgid "Reference"
+#: ardour_ui_ed.cc:317
+msgid "Manual|Reference"
 msgstr ""
 
-#: ardour_ui_ed.cc:212
-msgid "Report A Bug"
+#: ardour_ui_ed.cc:318
+msgid "Report a Bug"
 msgstr ""
 
-#: ardour_ui_ed.cc:213
+#: ardour_ui_ed.cc:319
 msgid "Cheat Sheet"
 msgstr ""
 
-#: ardour_ui_ed.cc:214
+#: ardour_ui_ed.cc:320
 msgid "Ardour Website"
 msgstr ""
 
-#: ardour_ui_ed.cc:215
+#: ardour_ui_ed.cc:321
 msgid "Ardour Development"
 msgstr ""
 
-#: ardour_ui_ed.cc:216
+#: ardour_ui_ed.cc:322
 msgid "User Forums"
 msgstr ""
 
-#: ardour_ui_ed.cc:217
-msgid "How to report a bug"
+#: ardour_ui_ed.cc:323
+msgid "How to Report a Bug"
 msgstr ""
 
-#: ardour_ui_ed.cc:219 plugin_ui.cc:419
+#: ardour_ui_ed.cc:325 luawindow.cc:100 luawindow.cc:654 plugin_ui.cc:419
 msgid "Save"
 msgstr "Αποθήκευση"
 
-#: ardour_ui_ed.cc:227 rc_option_editor.cc:1419 rc_option_editor.cc:1430
-#: rc_option_editor.cc:1441 rc_option_editor.cc:1450 rc_option_editor.cc:1463
-#: rc_option_editor.cc:1476 rc_option_editor.cc:1485 rc_option_editor.cc:1495
-#: rc_option_editor.cc:1497 rc_option_editor.cc:1506 rc_option_editor.cc:1522
-#: rc_option_editor.cc:1543 rc_option_editor.cc:1561 rc_option_editor.cc:1563
-#: rc_option_editor.cc:1579 rc_option_editor.cc:1582 rc_option_editor.cc:1584
-#: rc_option_editor.cc:1601 rc_option_editor.cc:1612
+#: ardour_ui_ed.cc:333 rc_option_editor.cc:1975 rc_option_editor.cc:1986
+#: rc_option_editor.cc:1997 rc_option_editor.cc:2008 rc_option_editor.cc:2017
+#: rc_option_editor.cc:2030 rc_option_editor.cc:2043 rc_option_editor.cc:2052
+#: rc_option_editor.cc:2062 rc_option_editor.cc:2079 rc_option_editor.cc:2186
 msgid "Transport"
 msgstr ""
 
-#: ardour_ui_ed.cc:233
+#: ardour_ui_ed.cc:339 engine_dialog.cc:88
 msgid "Stop"
 msgstr "Παύση"
 
-#: ardour_ui_ed.cc:236
+#: ardour_ui_ed.cc:342
 msgid "Roll"
 msgstr ""
 
-#: ardour_ui_ed.cc:240 ardour_ui_ed.cc:243
+#: ardour_ui_ed.cc:346 ardour_ui_ed.cc:349
 msgid "Start/Stop"
 msgstr ""
 
-#: ardour_ui_ed.cc:246
+#: ardour_ui_ed.cc:352
 msgid "Start/Continue/Stop"
 msgstr ""
 
-#: ardour_ui_ed.cc:249
+#: ardour_ui_ed.cc:355
 msgid "Stop and Forget Capture"
 msgstr ""
 
-#: ardour_ui_ed.cc:259
-msgid "Transition To Roll"
+#: ardour_ui_ed.cc:365
+msgid "Transition to Roll"
 msgstr ""
 
-#: ardour_ui_ed.cc:263
-msgid "Transition To Reverse"
+#: ardour_ui_ed.cc:369
+msgid "Transition to Reverse"
 msgstr ""
 
-#: ardour_ui_ed.cc:267
+#: ardour_ui_ed.cc:373
 msgid "Play Loop Range"
 msgstr ""
 
-#: ardour_ui_ed.cc:270
+#: ardour_ui_ed.cc:376
 msgid "Play Selection"
 msgstr ""
 
-#: ardour_ui_ed.cc:273
+#: ardour_ui_ed.cc:379
 msgid "Play Selection w/Preroll"
 msgstr ""
 
-#: ardour_ui_ed.cc:277
+#: ardour_ui_ed.cc:383
 msgid "Enable Record"
 msgstr "Ενεργοποίηση Εγγραφής"
 
-#: ardour_ui_ed.cc:280 ardour_ui_ed.cc:284
+#: ardour_ui_ed.cc:386 ardour_ui_ed.cc:390
 msgid "Start Recording"
 msgstr ""
 
-#: ardour_ui_ed.cc:288
+#: ardour_ui_ed.cc:394
 msgid "Rewind"
 msgstr ""
 
-#: ardour_ui_ed.cc:291
+#: ardour_ui_ed.cc:397
 msgid "Rewind (Slow)"
 msgstr ""
 
-#: ardour_ui_ed.cc:294
+#: ardour_ui_ed.cc:400
 msgid "Rewind (Fast)"
 msgstr ""
 
-#: ardour_ui_ed.cc:297
+#: ardour_ui_ed.cc:403
 msgid "Forward"
 msgstr ""
 
-#: ardour_ui_ed.cc:300
+#: ardour_ui_ed.cc:406
 msgid "Forward (Slow)"
 msgstr ""
 
-#: ardour_ui_ed.cc:303
+#: ardour_ui_ed.cc:409
 msgid "Forward (Fast)"
 msgstr ""
 
-#: ardour_ui_ed.cc:306
+#: ardour_ui_ed.cc:412
 msgid "Go to Zero"
 msgstr ""
 
-#: ardour_ui_ed.cc:309 ardour_ui_ed.cc:312
+#: ardour_ui_ed.cc:415 ardour_ui_ed.cc:418
 msgid "Go to Start"
 msgstr "Πήγαινε στην Αρχή"
 
-#: ardour_ui_ed.cc:315
+#: ardour_ui_ed.cc:421
 msgid "Go to End"
 msgstr ""
 
-#: ardour_ui_ed.cc:318
+#: ardour_ui_ed.cc:424
 msgid "Go to Wall Clock"
 msgstr ""
 
-#: ardour_ui_ed.cc:323 ardour_ui_ed.cc:326
+#: ardour_ui_ed.cc:429 ardour_ui_ed.cc:432
 msgid "Numpad Decimal"
 msgstr ""
 
-#: ardour_ui_ed.cc:329
+#: ardour_ui_ed.cc:435
 msgid "Numpad 0"
 msgstr ""
 
-#: ardour_ui_ed.cc:332
+#: ardour_ui_ed.cc:438
 msgid "Numpad 1"
 msgstr ""
 
-#: ardour_ui_ed.cc:335
+#: ardour_ui_ed.cc:441
 msgid "Numpad 2"
 msgstr ""
 
-#: ardour_ui_ed.cc:338
+#: ardour_ui_ed.cc:444
 msgid "Numpad 3"
 msgstr ""
 
-#: ardour_ui_ed.cc:341
+#: ardour_ui_ed.cc:447
 msgid "Numpad 4"
 msgstr ""
 
-#: ardour_ui_ed.cc:344
+#: ardour_ui_ed.cc:450
 msgid "Numpad 5"
 msgstr ""
 
-#: ardour_ui_ed.cc:347
+#: ardour_ui_ed.cc:453
 msgid "Numpad 6"
 msgstr ""
 
-#: ardour_ui_ed.cc:350
+#: ardour_ui_ed.cc:456
 msgid "Numpad 7"
 msgstr ""
 
-#: ardour_ui_ed.cc:353
+#: ardour_ui_ed.cc:459
 msgid "Numpad 8"
 msgstr ""
 
-#: ardour_ui_ed.cc:356
+#: ardour_ui_ed.cc:462
 msgid "Numpad 9"
 msgstr ""
 
-#: ardour_ui_ed.cc:360
+#: ardour_ui_ed.cc:466
 msgid "Focus On Clock"
 msgstr ""
 
-#: ardour_ui_ed.cc:364 ardour_ui_ed.cc:373 audio_clock.cc:2091 editor.cc:258
-#: editor_actions.cc:569 editor_actions.cc:578 export_timespan_selector.cc:88
+#: ardour_ui_ed.cc:470 ardour_ui_ed.cc:479 audio_clock.cc:2122 editor.cc:321
+#: editor_actions.cc:610 editor_actions.cc:619 export_timespan_selector.cc:85
 #: session_option_editor.cc:41 session_option_editor.cc:61
 #: session_option_editor.cc:80 session_option_editor.cc:96
 #: session_option_editor.cc:109 session_option_editor.cc:122
@@ -1944,257 +2321,274 @@ msgstr ""
 msgid "Timecode"
 msgstr ""
 
-#: ardour_ui_ed.cc:366 ardour_ui_ed.cc:375 editor_actions.cc:567
+#: ardour_ui_ed.cc:472 ardour_ui_ed.cc:481 editor_actions.cc:608
 msgid "Bars & Beats"
 msgstr ""
 
-#: ardour_ui_ed.cc:368 ardour_ui_ed.cc:377
+#: ardour_ui_ed.cc:474 ardour_ui_ed.cc:483
 msgid "Minutes & Seconds"
 msgstr ""
 
-#: ardour_ui_ed.cc:370 ardour_ui_ed.cc:379 audio_clock.cc:2095 editor.cc:259
-#: editor_actions.cc:568
+#: ardour_ui_ed.cc:476 ardour_ui_ed.cc:485 audio_clock.cc:2125 editor.cc:322
+#: editor_actions.cc:609
 msgid "Samples"
 msgstr ""
 
-#: ardour_ui_ed.cc:382
+#: ardour_ui_ed.cc:488
 msgid "Punch In"
 msgstr ""
 
-#: ardour_ui_ed.cc:383 mixer_strip.cc:1819 mixer_strip.cc:1843
-#: mixer_strip.cc:2007 route_ui.cc:162 time_info_box.cc:116
+#: ardour_ui_ed.cc:489 mixer_strip.cc:1992 mixer_strip.cc:2193 route_ui.cc:187
+#: time_info_box.cc:110
 msgid "In"
 msgstr ""
 
-#: ardour_ui_ed.cc:386
+#: ardour_ui_ed.cc:492
 msgid "Punch Out"
 msgstr ""
 
-#: ardour_ui_ed.cc:387 mixer_strip.cc:1831 time_info_box.cc:117
+#: ardour_ui_ed.cc:493 mixer_strip.cc:2004 time_info_box.cc:111
 msgid "Out"
 msgstr ""
 
-#: ardour_ui_ed.cc:390
+#: ardour_ui_ed.cc:496
 msgid "Punch In/Out"
 msgstr ""
 
-#: ardour_ui_ed.cc:391
+#: ardour_ui_ed.cc:497
 msgid "In/Out"
 msgstr ""
 
-#: ardour_ui_ed.cc:394 rc_option_editor.cc:1376
+#: ardour_ui_ed.cc:500 rc_option_editor.cc:1941
 msgid "Click"
 msgstr "Μετρονόμος"
 
-#: ardour_ui_ed.cc:397
+#: ardour_ui_ed.cc:503
 msgid "Auto Input"
 msgstr ""
 
-#: ardour_ui_ed.cc:400
+#: ardour_ui_ed.cc:506
 msgid "Auto Play"
 msgstr ""
 
-#: ardour_ui_ed.cc:411
+#: ardour_ui_ed.cc:517
 msgid "Sync Startup to Video"
 msgstr ""
 
-#: ardour_ui_ed.cc:413
+#: ardour_ui_ed.cc:519
 msgid "Time Master"
 msgstr ""
 
-#: ardour_ui_ed.cc:420
+#: ardour_ui_ed.cc:521
+msgid "Use External Positional Sync Source"
+msgstr ""
+
+#: ardour_ui_ed.cc:526
 msgid "Toggle Record Enable Track %1"
 msgstr ""
 
-#: ardour_ui_ed.cc:427
+#: ardour_ui_ed.cc:533
 msgid "Percentage"
 msgstr "Ποσοστό"
 
-#: ardour_ui_ed.cc:428 shuttle_control.cc:178
+#: ardour_ui_ed.cc:534 shuttle_control.cc:205
 msgid "Semitones"
 msgstr "Ημιτόνια"
 
-#: ardour_ui_ed.cc:432
+#: ardour_ui_ed.cc:538
 msgid "Send MTC"
 msgstr "Αποστολή MTC"
 
-#: ardour_ui_ed.cc:434
+#: ardour_ui_ed.cc:540
 msgid "Send MMC"
 msgstr "Αποστολή MMC"
 
-#: ardour_ui_ed.cc:436
+#: ardour_ui_ed.cc:542
 msgid "Use MMC"
 msgstr ""
 
-#: ardour_ui_ed.cc:438 rc_option_editor.cc:2097
+#: ardour_ui_ed.cc:544 rc_option_editor.cc:2730
 msgid "Send MIDI Clock"
 msgstr ""
 
-#: ardour_ui_ed.cc:440
+#: ardour_ui_ed.cc:546
 msgid "Send MIDI Feedback"
 msgstr ""
 
-#: ardour_ui_ed.cc:446
+#: ardour_ui_ed.cc:552
 msgid "Panic"
 msgstr ""
 
-#: ardour_ui_ed.cc:534
+#: ardour_ui_ed.cc:629
 msgid "Wall Clock"
 msgstr ""
 
-#: ardour_ui_ed.cc:536
+#: ardour_ui_ed.cc:631
 msgid "Disk Space"
 msgstr ""
 
-#: ardour_ui_ed.cc:537
+#: ardour_ui_ed.cc:632
 msgid "DSP"
 msgstr ""
 
-#: ardour_ui_ed.cc:538
+#: ardour_ui_ed.cc:633
+msgid "X-run"
+msgstr ""
+
+#: ardour_ui_ed.cc:634
+msgid "Active Peak-file Work"
+msgstr ""
+
+#: ardour_ui_ed.cc:635
 msgid "Buffers"
 msgstr ""
 
-#: ardour_ui_ed.cc:540
+#: ardour_ui_ed.cc:637
 msgid "Timecode Format"
 msgstr ""
 
-#: ardour_ui_ed.cc:541
+#: ardour_ui_ed.cc:638
 msgid "File Format"
 msgstr ""
 
-#: ardour_ui_options.cc:63
+#: ardour_ui_options.cc:55
 msgid ""
 "It is not possible to use JACK as the the sync source\n"
 "when the pull up/down setting is non-zero."
 msgstr ""
 
-#: ardour_ui_options.cc:317
+#: ardour_ui_options.cc:309
 msgid "Internal"
 msgstr "Εσωτερικό"
 
-#: ardour_ui_options.cc:498
+#: ardour_ui_options.cc:518
 msgid "Enable/Disable external positional sync"
 msgstr ""
 
-#: ardour_ui_options.cc:500
+#: ardour_ui_options.cc:520
 msgid "Sync to JACK is not possible: video pull up/down is set"
 msgstr ""
 
-#: audio_clock.cc:1047 audio_clock.cc:1066
+#: audio_clock.cc:1057 audio_clock.cc:1076
 msgid "--pending--"
 msgstr ""
 
-#: audio_clock.cc:1118
+#: audio_clock.cc:1128
 msgid "SR"
 msgstr ""
 
-#: audio_clock.cc:1124 audio_clock.cc:1128
+#: audio_clock.cc:1134 audio_clock.cc:1138
 msgid "Pull"
 msgstr ""
 
-#: audio_clock.cc:1126
+#: audio_clock.cc:1136
 #, c-format
 msgid "%+.4f%%"
 msgstr ""
 
-#: audio_clock.cc:1282 editor.cc:260 editor_actions.cc:139
-#: editor_actions.cc:561
+#: audio_clock.cc:1292 editor.cc:323 editor_actions.cc:142
+#: editor_actions.cc:602
 msgid "Tempo"
 msgstr "Χρόνος"
 
-#: audio_clock.cc:1286 editor.cc:261 editor_actions.cc:562
+#: audio_clock.cc:1296 editor.cc:324 editor_actions.cc:603
 msgid "Meter"
 msgstr "Μετρητής"
 
-#: audio_clock.cc:1864 audio_streamview.cc:115 editor_actions.cc:1089
-#: session_metadata_dialog.cc:452 session_metadata_dialog.cc:500
-#: session_metadata_dialog.cc:556 session_metadata_dialog.cc:845
-#: streamview.cc:470
+#: audio_clock.cc:1878 audio_streamview.cc:117 editor_actions.cc:1092
+#: luainstance.cc:959 luainstance.cc:1575 plugin_pin_dialog.cc:859
+#: plugin_selector.cc:995 plugin_selector.cc:1016
+#: session_metadata_dialog.cc:455 session_metadata_dialog.cc:503
+#: session_metadata_dialog.cc:559 session_metadata_dialog.cc:848
+#: streamview.cc:474
 msgid "programming error: %1"
 msgstr "σφάλμα προγραμματισμού: %1"
 
-#: audio_clock.cc:1997 audio_clock.cc:2025
+#: audio_clock.cc:2011 audio_clock.cc:2039
 msgid "programming error: %1 %2"
 msgstr ""
 
-#: audio_clock.cc:2093 editor.cc:257 export_timespan_selector.cc:98
+#: audio_clock.cc:2123 editor.cc:320 export_timespan_selector.cc:95
 msgid "Bars:Beats"
 msgstr "Μπάρες:Κτύποι"
 
-#: audio_clock.cc:2094 export_timespan_selector.cc:93
+#: audio_clock.cc:2124 export_timespan_selector.cc:90
 msgid "Minutes:Seconds"
 msgstr "Λεπτά:Δεύτερα"
 
-#: audio_clock.cc:2099
-msgid "Set From Playhead"
+#: audio_clock.cc:2129
+msgid "Set from Playhead"
 msgstr ""
 
-#: audio_clock.cc:2100
+#: audio_clock.cc:2130
 msgid "Locate to This Time"
 msgstr ""
 
-#: audio_region_editor.cc:64 control_point_dialog.cc:49 rhythm_ferret.cc:124
-#: rhythm_ferret.cc:129 rhythm_ferret.cc:134
+#: audio_clock.cc:2133
+msgid "Copy to clipboard"
+msgstr ""
+
+#: audio_region_editor.cc:60 control_point_dialog.cc:49 rhythm_ferret.cc:137
+#: rhythm_ferret.cc:154
 msgid "dB"
 msgstr ""
 
-#: audio_region_editor.cc:67
+#: audio_region_editor.cc:63
 msgid "Region gain:"
 msgstr ""
 
-#: audio_region_editor.cc:77 export_format_dialog.cc:43
+#: audio_region_editor.cc:73 export_format_dialog.cc:49 export_report.cc:772
+#: export_report.cc:1185 fft_graph.cc:370
 msgid "dBFS"
 msgstr ""
 
-#: audio_region_editor.cc:80
+#: audio_region_editor.cc:76
 msgid "Peak amplitude:"
 msgstr ""
 
-#: audio_region_editor.cc:91
+#: audio_region_editor.cc:87
 msgid "Calculating..."
 msgstr ""
 
-#: audio_region_view.cc:1243
+#: audio_region_view.cc:1385
 msgid "add gain control point"
 msgstr "Προσθεση σημείου ελέγχου gain"
 
-#: automation_controller.cc:286 automation_controller.cc:302
+#: automation_controller.cc:304 automation_controller.cc:320
 msgid "Select Note..."
 msgstr ""
 
-#: automation_controller.cc:293
+#: automation_controller.cc:311
 msgid "Halve"
 msgstr ""
 
-#: automation_controller.cc:296
+#: automation_controller.cc:314
 msgid "Double"
 msgstr ""
 
-#: automation_controller.cc:307
-msgid "Set to %1 beat(s)"
-msgstr ""
+#: automation_controller.cc:325
+msgid "Set to %1 beat"
+msgid_plural "Set to %1 beats"
+msgstr[0] ""
+msgstr[1] ""
 
-#: automation_line.cc:286 automation_line.cc:462
+#: automation_line.cc:292 editor_drag.cc:4388
 msgid "automation event move"
 msgstr "μετακίνηση συμβάντος αυτοματισμού"
 
-#: automation_line.cc:488 automation_line.cc:508
-msgid "automation range move"
-msgstr ""
-
-#: automation_line.cc:880 region_gain_line.cc:72
+#: automation_line.cc:888 region_gain_line.cc:75
 msgid "remove control point"
 msgstr "απαλοιφή σημείου ελέγχου"
 
-#: automation_line.cc:1003
+#: automation_line.cc:1013
 msgid "Ignoring illegal points on AutomationLine \"%1\""
 msgstr ""
 
-#: automation_region_view.cc:190 automation_time_axis.cc:644
+#: automation_region_view.cc:193 automation_time_axis.cc:649
 msgid "add automation event"
 msgstr ""
 
-#: automation_streamview.cc:95
+#: automation_streamview.cc:94
 msgid "unable to display automation region for control without list"
 msgstr ""
 
@@ -2206,63 +2600,59 @@ msgstr "Κατάσταση αυτοματισμού"
 msgid "hide track"
 msgstr "απόκρυψη καναλιού"
 
-#: automation_time_axis.cc:308 automation_time_axis.cc:360
-#: automation_time_axis.cc:554 gain_meter.cc:220 generic_pluginui.cc:523
-#: generic_pluginui.cc:817 panner_ui.cc:151
+#: automation_time_axis.cc:310 automation_time_axis.cc:362
+#: automation_time_axis.cc:556 gain_meter.cc:230 generic_pluginui.cc:590
+#: generic_pluginui.cc:934 panner_ui.cc:151
 msgid "Automation|Manual"
 msgstr ""
 
-#: automation_time_axis.cc:310 automation_time_axis.cc:371
-#: automation_time_axis.cc:559 editor.cc:1904 editor.cc:1981
-#: editor_actions.cc:122 editor_actions.cc:1920 gain_meter.cc:223
-#: generic_pluginui.cc:99 generic_pluginui.cc:526 generic_pluginui.cc:819
-#: midi_time_axis.cc:1606 midi_time_axis.cc:1609 midi_time_axis.cc:1612
+#: automation_time_axis.cc:312 automation_time_axis.cc:373
+#: automation_time_axis.cc:561 editor.cc:2033 editor.cc:2111
+#: editor_actions.cc:125 editor_actions.cc:1937 gain_meter.cc:232
+#: generic_pluginui.cc:100 generic_pluginui.cc:593 generic_pluginui.cc:936
+#: midi_time_axis.cc:1610 midi_time_axis.cc:1613 midi_time_axis.cc:1616
 #: panner_ui.cc:154
 msgid "Play"
 msgstr "Αναπαρ/γή"
 
-#: automation_time_axis.cc:312 automation_time_axis.cc:382
-#: automation_time_axis.cc:564 gain_meter.cc:226 generic_pluginui.cc:101
-#: generic_pluginui.cc:529 generic_pluginui.cc:821 panner_ui.cc:157
+#: automation_time_axis.cc:314 automation_time_axis.cc:384
+#: automation_time_axis.cc:566 gain_meter.cc:234 generic_pluginui.cc:102
+#: generic_pluginui.cc:596 generic_pluginui.cc:938 panner_ui.cc:157
 msgid "Write"
 msgstr "Γράψε"
 
-#: automation_time_axis.cc:314 automation_time_axis.cc:393
-#: automation_time_axis.cc:569 gain_meter.cc:229 generic_pluginui.cc:103
-#: generic_pluginui.cc:532 generic_pluginui.cc:823 panner_ui.cc:160
+#: automation_time_axis.cc:316 automation_time_axis.cc:395
+#: automation_time_axis.cc:571 gain_meter.cc:236 generic_pluginui.cc:104
+#: generic_pluginui.cc:599 generic_pluginui.cc:940 panner_ui.cc:160
 msgid "Touch"
 msgstr "Αγγιγμα"
 
-#: automation_time_axis.cc:404 generic_pluginui.cc:535 meter_patterns.cc:112
+#: automation_time_axis.cc:406 generic_pluginui.cc:602 meter_patterns.cc:118
 msgid "???"
 msgstr "???"
 
-#: automation_time_axis.cc:445
+#: automation_time_axis.cc:447
 msgid "clear automation"
 msgstr "εκκαθάριση αυτοματισμού"
 
-#: automation_time_axis.cc:543 editor_actions.cc:645 editor_markers.cc:902
-#: location_ui.cc:57 plugin_selector.cc:86 route_time_axis.cc:854
-msgid "Hide"
-msgstr "Κρύψιμο"
-
-#: automation_time_axis.cc:545
+#: automation_time_axis.cc:547 rc_option_editor.cc:2916
+#: rc_option_editor.cc:2921 rc_option_editor.cc:2967 rc_option_editor.cc:2972
 msgid "Clear"
 msgstr "Εκκαθάριση"
 
-#: automation_time_axis.cc:576
+#: automation_time_axis.cc:578
 msgid "State"
 msgstr "Κατάσταση"
 
-#: automation_time_axis.cc:592
+#: automation_time_axis.cc:594
 msgid "Discrete"
 msgstr ""
 
-#: automation_time_axis.cc:598 export_format_dialog.cc:485
+#: automation_time_axis.cc:600 export_format_dialog.cc:552
 msgid "Linear"
 msgstr "Γραμμικό"
 
-#: automation_time_axis.cc:604 rhythm_ferret.cc:109 shuttle_control.cc:197
+#: automation_time_axis.cc:606 rhythm_ferret.cc:118 shuttle_control.cc:224
 msgid "Mode"
 msgstr "Λειτουργία"
 
@@ -2278,35 +2668,38 @@ msgstr ""
 msgid "Direction:"
 msgstr ""
 
-#: bundle_manager.cc:206 bundle_manager.cc:210 engine_dialog.cc:662
-#: mixer_strip.cc:162 mixer_strip.cc:367 mixer_strip.cc:2240
-#: rc_option_editor.cc:2326
+#: bundle_manager.cc:206 bundle_manager.cc:210 engine_dialog.cc:976
+#: mixer_strip.cc:175 mixer_strip.cc:392 mixer_strip.cc:2451
+#: rc_option_editor.cc:3135
 msgid "Input"
 msgstr ""
 
 #: bundle_manager.cc:207 bundle_manager.cc:212 bundle_manager.cc:246
-#: engine_dialog.cc:664 mixer_strip.cc:166 mixer_strip.cc:371
-#: mixer_strip.cc:2243 rc_option_editor.cc:2330
+#: engine_dialog.cc:978 mixer_strip.cc:179 mixer_strip.cc:396
+#: mixer_strip.cc:2454 monitor_section.cc:296 monitor_section.cc:300
+#: rc_option_editor.cc:3139
 msgid "Output"
 msgstr ""
 
-#: bundle_manager.cc:265 editor.cc:1945 editor_actions.cc:94
-#: editor_actions.cc:104 rc_option_editor.cc:1087 rc_option_editor.cc:1094
+#: bundle_manager.cc:265 editor.cc:2075 editor_actions.cc:97
+#: editor_actions.cc:107 lua_script_manager.cc:33 rc_option_editor.cc:2928
+#: rc_option_editor.cc:2942
 msgid "Edit"
 msgstr "Επεξεργασία"
 
-#: bundle_manager.cc:266 editor.cc:5902 editor.cc:5930 editor_actions.cc:338
-#: editor_actions.cc:339 editor_actions.cc:405 plugin_ui.cc:420
-#: processor_box.cc:2458 route_time_axis.cc:859
+#: bundle_manager.cc:266 editor.cc:5962 editor.cc:5992 editor_actions.cc:360
+#: editor_actions.cc:361 luawindow.cc:101 plugin_ui.cc:420
+#: processor_box.cc:3669 processor_box.cc:3671
 msgid "Delete"
 msgstr ""
 
-#: bundle_manager.cc:272 bundle_manager.cc:439 editor_route_groups.cc:97
-#: editor_routes.cc:206 midi_list_editor.cc:107 session_metadata_dialog.cc:646
+#: bundle_manager.cc:272 bundle_manager.cc:439 editor_route_groups.cc:98
+#: editor_routes.cc:233 lua_script_manager.cc:42 lua_script_manager.cc:76
+#: midi_list_editor.cc:107 session_metadata_dialog.cc:649
 msgid "Name"
 msgstr ""
 
-#: bundle_manager.cc:283
+#: bundle_manager.cc:283 luawindow.cc:566
 msgid "New"
 msgstr "Νέο"
 
@@ -2322,6 +2715,39 @@ msgstr ""
 msgid "Rename Channel"
 msgstr ""
 
+#: color_theme_manager.cc:58
+msgid "Restore Defaults"
+msgstr ""
+
+#: color_theme_manager.cc:62
+msgid "Color Theme"
+msgstr ""
+
+#: color_theme_manager.cc:126
+msgid "Object"
+msgstr ""
+
+#: color_theme_manager.cc:129 route_group_dialog.cc:53
+#: route_group_dialog.cc:81
+msgid "Color"
+msgstr "Χρώμα"
+
+#: color_theme_manager.cc:151
+msgid "Items"
+msgstr ""
+
+#: color_theme_manager.cc:152
+msgid "Palette"
+msgstr ""
+
+#: color_theme_manager.cc:153
+msgid "Transparency"
+msgstr ""
+
+#: color_theme_manager.cc:475
+msgid "Color Palette"
+msgstr ""
+
 #: configinfo.cc:28
 msgid "Build Configuration"
 msgstr ""
@@ -2334,6 +2760,42 @@ msgstr ""
 msgid "Value"
 msgstr "Αξία"
 
+#: control_slave_ui.cc:50 mixer_ui.cc:254
+msgid "Control Masters"
+msgstr ""
+
+#: control_slave_ui.cc:54
+msgid "-vca-"
+msgstr ""
+
+#: control_slave_ui.cc:211
+msgid "Unassign All"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:35
+msgid "Duplicate Tracks & Busses"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:36
+msgid "Copy playlists"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:37
+msgid "Create new (empty) playlists"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:38
+msgid "Share playlists"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:41
+msgid "Duplicate each track/bus this number of times:"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:176
+msgid "1 or more tracks/busses could not be duplicated"
+msgstr ""
+
 #: edit_note_dialog.cc:42
 msgid "Note"
 msgstr ""
@@ -2371,2060 +2833,2155 @@ msgstr ""
 msgid "Velocity"
 msgstr ""
 
-#: edit_note_dialog.cc:88 patch_change_dialog.cc:66
+#: edit_note_dialog.cc:88 export_report.cc:246 export_report.cc:688
+#: patch_change_dialog.cc:66
 msgid "Time"
 msgstr ""
 
-#: edit_note_dialog.cc:98 editor_regions.cc:115
-#: export_timespan_selector.cc:378 export_timespan_selector.cc:440
-#: location_ui.cc:320 midi_list_editor.cc:115 time_info_box.cc:108
+#: edit_note_dialog.cc:99 editor_regions.cc:162
+#: export_timespan_selector.cc:375 export_timespan_selector.cc:437
+#: location_ui.cc:322 midi_list_editor.cc:115 time_info_box.cc:102
 msgid "Length"
 msgstr ""
 
-#: edit_note_dialog.cc:165
+#: edit_note_dialog.cc:166
 msgid "edit note"
 msgstr ""
 
-#: editor.cc:147
+#: editor.cc:160
 msgid "CD Frames"
 msgstr ""
 
-#: editor.cc:148
+#: editor.cc:161
 msgid "TC Frames"
 msgstr ""
 
-#: editor.cc:149
+#: editor.cc:162
 msgid "TC Seconds"
 msgstr ""
 
-#: editor.cc:150
+#: editor.cc:163
 msgid "TC Minutes"
 msgstr ""
 
-#: editor.cc:151
+#: editor.cc:164
 msgid "Seconds"
 msgstr "Δευτερόλεπτα"
 
-#: editor.cc:152
+#: editor.cc:165
 msgid "Minutes"
 msgstr "Λεπτά"
 
-#: editor.cc:153 quantize_dialog.cc:37 quantize_dialog.cc:141
+#: editor.cc:166 quantize_dialog.cc:37
 msgid "Beats/128"
 msgstr ""
 
-#: editor.cc:154 quantize_dialog.cc:38 quantize_dialog.cc:143
+#: editor.cc:167 quantize_dialog.cc:38
 msgid "Beats/64"
 msgstr ""
 
-#: editor.cc:155 quantize_dialog.cc:39 quantize_dialog.cc:145
+#: editor.cc:168 quantize_dialog.cc:39
 msgid "Beats/32"
 msgstr "Κτύποι/32"
 
-#: editor.cc:156
+#: editor.cc:169 quantize_dialog.cc:40
 msgid "Beats/28"
 msgstr ""
 
-#: editor.cc:157
+#: editor.cc:170 quantize_dialog.cc:41
 msgid "Beats/24"
 msgstr ""
 
-#: editor.cc:158
+#: editor.cc:171 quantize_dialog.cc:42
 msgid "Beats/20"
 msgstr ""
 
-#: editor.cc:159 quantize_dialog.cc:40 quantize_dialog.cc:147
+#: editor.cc:172 quantize_dialog.cc:43
 msgid "Beats/16"
 msgstr "Κτύποι/16"
 
-#: editor.cc:160
+#: editor.cc:173 quantize_dialog.cc:44
 msgid "Beats/14"
 msgstr ""
 
-#: editor.cc:161
+#: editor.cc:174 quantize_dialog.cc:45
 msgid "Beats/12"
 msgstr ""
 
-#: editor.cc:162
+#: editor.cc:175 quantize_dialog.cc:46
 msgid "Beats/10"
 msgstr ""
 
-#: editor.cc:163 quantize_dialog.cc:41 quantize_dialog.cc:149
+#: editor.cc:176 quantize_dialog.cc:47
 msgid "Beats/8"
 msgstr "Κτύποι/8"
 
-#: editor.cc:164
+#: editor.cc:177 quantize_dialog.cc:48
 msgid "Beats/7"
 msgstr ""
 
-#: editor.cc:165
+#: editor.cc:178 quantize_dialog.cc:49
 msgid "Beats/6"
 msgstr ""
 
-#: editor.cc:166
+#: editor.cc:179 quantize_dialog.cc:50
 msgid "Beats/5"
 msgstr ""
 
-#: editor.cc:167 quantize_dialog.cc:42 quantize_dialog.cc:151
+#: editor.cc:180 quantize_dialog.cc:51
 msgid "Beats/4"
 msgstr "Κτύποι/4"
 
-#: editor.cc:168 quantize_dialog.cc:43 quantize_dialog.cc:153
+#: editor.cc:181 quantize_dialog.cc:52
 msgid "Beats/3"
 msgstr "Κτύποι/3"
 
-#: editor.cc:169 quantize_dialog.cc:44 quantize_dialog.cc:155
+#: editor.cc:182 quantize_dialog.cc:53
 msgid "Beats/2"
 msgstr ""
 
-#: editor.cc:170 quantize_dialog.cc:45 quantize_dialog.cc:157
+#: editor.cc:183 quantize_dialog.cc:54
 msgid "Beats"
 msgstr "Κτύποι"
 
-#: editor.cc:171
+#: editor.cc:184
 msgid "Bars"
 msgstr "Μπάρες"
 
-#: editor.cc:172
+#: editor.cc:185
 msgid "Marks"
 msgstr "Στίγματα"
 
-#: editor.cc:173
+#: editor.cc:186
 msgid "Region starts"
 msgstr "Αρχές Περιοχών"
 
-#: editor.cc:174
+#: editor.cc:187
 msgid "Region ends"
 msgstr "Τέλη Περιοχών"
 
-#: editor.cc:175
+#: editor.cc:188
 msgid "Region syncs"
 msgstr "Συγχρονισμός Περιοχών"
 
-#: editor.cc:176
+#: editor.cc:189
 msgid "Region bounds"
 msgstr "Όρια περιοχών"
 
-#: editor.cc:181 editor_actions.cc:510
+#: editor.cc:194 editor_actions.cc:551
 msgid "No Grid"
 msgstr ""
 
-#: editor.cc:182 editor_actions.cc:511
+#: editor.cc:195 editor_actions.cc:552
 msgid "Grid"
 msgstr ""
 
-#: editor.cc:183 editor_actions.cc:512
+#: editor.cc:196 editor_actions.cc:553
 msgid "Magnetic"
 msgstr "Μαγνητικό"
 
-#: editor.cc:188 editor.cc:206 editor_actions.cc:121 editor_actions.cc:493
+#: editor.cc:201 editor.cc:219 editor_actions.cc:124 editor_actions.cc:534
 msgid "Playhead"
 msgstr ""
 
-#: editor.cc:189 editor_actions.cc:495
+#: editor.cc:202 editor_actions.cc:536
 msgid "Marker"
 msgstr "Στίγμα"
 
-#: editor.cc:190 editor.cc:207 editor_actions.cc:494
+#: editor.cc:203 editor.cc:220 editor_actions.cc:535
 msgid "Mouse"
 msgstr ""
 
-#: editor.cc:195 editor_actions.cc:502
+#: editor.cc:208 editor_actions.cc:543
 msgid "Slide"
 msgstr "Ολίσθηση"
 
-#: editor.cc:196
+#: editor.cc:209
 msgid "Splice"
 msgstr "Splice"
 
-#: editor.cc:197 editor_actions.cc:501
+#: editor.cc:210 editor_actions.cc:542
 msgid "Ripple"
 msgstr ""
 
-#: editor.cc:198 editor_actions.cc:157 editor_actions.cc:503
-#: editor_actions.cc:1789 editor_markers.cc:905 editor_rulers.cc:260
-#: location_ui.cc:58 mixer_strip.cc:195 mixer_strip.cc:2028
+#: editor.cc:211 editor_actions.cc:1806 editor_markers.cc:910
+#: editor_rulers.cc:259 location_ui.cc:62
 msgid "Lock"
 msgstr "Κλείδωμα"
 
-#: editor.cc:203 mono_panner_editor.cc:42
+#: editor.cc:216 mono_panner_editor.cc:44
 msgid "Left"
 msgstr "Αριστερό"
 
-#: editor.cc:204 mono_panner_editor.cc:47
+#: editor.cc:217 mono_panner_editor.cc:49
 msgid "Right"
 msgstr "Δεξιό"
 
-#: editor.cc:205
+#: editor.cc:218
 msgid "Center"
 msgstr "Κέντρο"
 
-#: editor.cc:208 editor.cc:3231
+#: editor.cc:221
 msgid "Edit point"
 msgstr ""
 
-#: editor.cc:214
+#: editor.cc:227
 msgid "Mushy"
 msgstr ""
 
-#: editor.cc:215
+#: editor.cc:228
 msgid "Smooth"
 msgstr ""
 
-#: editor.cc:216
+#: editor.cc:229
 msgid "Balanced multitimbral mixture"
 msgstr ""
 
-#: editor.cc:217
+#: editor.cc:230
 msgid "Unpitched percussion with stable notes"
 msgstr ""
 
-#: editor.cc:218
+#: editor.cc:231
 msgid "Crisp monophonic instrumental"
 msgstr ""
 
-#: editor.cc:219
+#: editor.cc:232
 msgid "Unpitched solo percussion"
 msgstr ""
 
-#: editor.cc:220
+#: editor.cc:233
 msgid "Resample without preserving pitch"
 msgstr ""
 
-#: editor.cc:256
+#: editor.cc:319
 msgid "Mins:Secs"
 msgstr "Λεπτά:Δέυτερα"
 
-#: editor.cc:262
+#: editor.cc:325
 msgid "Location Markers"
 msgstr "Στίγματα Τοποθεσίας"
 
-#: editor.cc:263
+#: editor.cc:326
 msgid "Range Markers"
 msgstr "Στίγματα διαστημάτων"
 
-#: editor.cc:264
+#: editor.cc:327
 msgid "Loop/Punch Ranges"
 msgstr "Διαστήματα Loop/Punch"
 
-#: editor.cc:265 editor_actions.cc:565
+#: editor.cc:328 editor_actions.cc:606
 msgid "CD Markers"
 msgstr ""
 
-#: editor.cc:266
+#: editor.cc:329
 msgid "Video Timeline"
 msgstr ""
 
-#: editor.cc:283
+#: editor.cc:386
 msgid "mode"
 msgstr "λειτουργία"
 
-#: editor.cc:459 editor_actions.cc:114 editor_actions.cc:564
+#: editor.cc:535 editor_actions.cc:117 editor_actions.cc:605
 msgid "Markers"
 msgstr ""
 
-#: editor.cc:577 rc_option_editor.cc:1939
+#: editor.cc:653 rc_option_editor.cc:2527
 msgid "Regions"
 msgstr "Περιοχές"
 
-#: editor.cc:578
+#: editor.cc:654
 msgid "Tracks & Busses"
 msgstr ""
 
-#: editor.cc:579
+#: editor.cc:655
 msgid "Snapshots"
 msgstr "Στιγμιότυπα"
 
-#: editor.cc:580
+#: editor.cc:656
 msgid "Track & Bus Groups"
 msgstr ""
 
-#: editor.cc:581
+#: editor.cc:657
 msgid "Ranges & Marks"
 msgstr ""
 
-#: editor.cc:728 editor.cc:5754 rc_option_editor.cc:1619
-#: rc_option_editor.cc:1627 rc_option_editor.cc:1635 rc_option_editor.cc:1643
-#: rc_option_editor.cc:1667 rc_option_editor.cc:1679 rc_option_editor.cc:1681
-#: rc_option_editor.cc:1689 rc_option_editor.cc:1697 rc_option_editor.cc:1717
-#: rc_option_editor.cc:1729 rc_option_editor.cc:1731 rc_option_editor.cc:1733
-#: rc_option_editor.cc:1741 rc_option_editor.cc:1749 rc_option_editor.cc:1757
-#: rc_option_editor.cc:1772 rc_option_editor.cc:1776 rc_option_editor.cc:1800
-msgid "Editor"
-msgstr ""
-
-#: editor.cc:1331 editor.cc:4735 editor_actions.cc:134 editor_actions.cc:1865
+#: editor.cc:1333 editor.cc:4737 editor_actions.cc:137 editor_actions.cc:1882
 msgid "Loop"
 msgstr "Loop"
 
-#: editor.cc:1337 editor.cc:4762 editor_actions.cc:135 time_info_box.cc:68
+#: editor.cc:1339 editor.cc:4764 editor_actions.cc:138 time_info_box.cc:62
 msgid "Punch"
 msgstr "Punch"
 
-#: editor.cc:1449 rc_option_editor.cc:1661
+#: editor.cc:1474 rc_option_editor.cc:2299
 msgid "Linear (for highly correlated material)"
 msgstr ""
 
-#: editor.cc:1459 rc_option_editor.cc:1662
+#: editor.cc:1484 rc_option_editor.cc:2300
 msgid "Constant power"
 msgstr ""
 
-#: editor.cc:1468 rc_option_editor.cc:1663
+#: editor.cc:1493 rc_option_editor.cc:2301
 msgid "Symmetric"
 msgstr ""
 
-#: editor.cc:1478 rc_option_editor.cc:1664
+#: editor.cc:1503 rc_option_editor.cc:2302
 msgid "Slow"
 msgstr "Αργό"
 
-#: editor.cc:1487 rc_option_editor.cc:1665 sfdb_ui.cc:1771 sfdb_ui.cc:1881
+#: editor.cc:1512 rc_option_editor.cc:2303 sfdb_ui.cc:1737 sfdb_ui.cc:1847
 msgid "Fast"
 msgstr "Ταχύ"
 
-#: editor.cc:1509 editor.cc:1534
+#: editor.cc:1534 editor.cc:1559
 msgid "Deactivate"
 msgstr "Απενεργοποίηση"
 
-#: editor.cc:1511 editor.cc:1536
+#: editor.cc:1536 editor.cc:1561
 msgid "Activate"
 msgstr "Ενεργοποίηση"
 
-#: editor.cc:1637 editor.cc:1645 editor_ops.cc:3824
+#: editor.cc:1662 editor.cc:1670 editor_ops.cc:3921
 msgid "Freeze"
 msgstr "Πάγωμα"
 
-#: editor.cc:1641
+#: editor.cc:1666
 msgid "Unfreeze"
 msgstr "Ξεπάγωμα"
 
-#: editor.cc:1780
+#: editor.cc:1766
+msgid "Region Loudness Analysis"
+msgstr ""
+
+#: editor.cc:1785 editor.cc:1834
+msgid "Audio Report/Analysis"
+msgstr ""
+
+#: editor.cc:1815
+msgid "Range Loudness Analysis"
+msgstr ""
+
+#: editor.cc:1901
 msgid "Selected Regions"
 msgstr ""
 
-#: editor.cc:1816 editor_markers.cc:940
+#: editor.cc:1945 editor_markers.cc:945
 msgid "Play Range"
 msgstr ""
 
-#: editor.cc:1817 editor_markers.cc:943
+#: editor.cc:1946 editor_markers.cc:948
 msgid "Loop Range"
 msgstr ""
 
-#: editor.cc:1820 editor_markers.cc:950
+#: editor.cc:1949 editor_markers.cc:953
 msgid "Zoom to Range"
 msgstr ""
 
-#: editor.cc:1829 editor_actions.cc:369
+#: editor.cc:1952
+msgid "Loudness Analysis"
+msgstr ""
+
+#: editor.cc:1959 editor_actions.cc:401
 msgid "Move Range Start to Previous Region Boundary"
 msgstr ""
 
-#: editor.cc:1836 editor_actions.cc:376
+#: editor.cc:1966 editor_actions.cc:408
 msgid "Move Range Start to Next Region Boundary"
 msgstr ""
 
-#: editor.cc:1843 editor_actions.cc:383
+#: editor.cc:1973 editor_actions.cc:415
 msgid "Move Range End to Previous Region Boundary"
 msgstr ""
 
-#: editor.cc:1850 editor_actions.cc:390
+#: editor.cc:1980 editor_actions.cc:422
 msgid "Move Range End to Next Region Boundary"
 msgstr ""
 
-#: editor.cc:1856 editor_actions.cc:133 editor_actions.cc:325
+#: editor.cc:1986 editor_actions.cc:136 editor_actions.cc:347
 msgid "Separate"
 msgstr ""
 
-#: editor.cc:1857
+#: editor.cc:1987
 msgid "Convert to Region in Region List"
 msgstr ""
 
-#: editor.cc:1860 editor_markers.cc:970
+#: editor.cc:1990 editor_markers.cc:973
 msgid "Select All in Range"
 msgstr "Επιλογή όλων στο διάστημα"
 
-#: editor.cc:1863 editor_actions.cc:297
+#: editor.cc:1993 editor_actions.cc:319
 msgid "Set Loop from Selection"
 msgstr ""
 
-#: editor.cc:1864 editor_actions.cc:298
+#: editor.cc:1994 editor_actions.cc:320
 msgid "Set Punch from Selection"
 msgstr ""
 
-#: editor.cc:1865 editor_actions.cc:299
+#: editor.cc:1995 editor_actions.cc:321
 msgid "Set Session Start/End from Selection"
 msgstr ""
 
-#: editor.cc:1868
+#: editor.cc:1998
 msgid "Add Range Markers"
 msgstr "Πρόσθεση Στιγμάτων Διαστήματος"
 
-#: editor.cc:1871
+#: editor.cc:2001
 msgid "Crop Region to Range"
 msgstr ""
 
-#: editor.cc:1872
-msgid "Fill Range with Region"
-msgstr ""
-
-#: editor.cc:1873 editor_actions.cc:311
+#: editor.cc:2002 editor_actions.cc:333
 msgid "Duplicate Range"
 msgstr "Αντιγραφή διαστήματος"
 
-#: editor.cc:1876
+#: editor.cc:2005
 msgid "Consolidate Range"
 msgstr ""
 
-#: editor.cc:1877
-msgid "Consolidate Range With Processing"
+#: editor.cc:2006
+msgid "Consolidate Range with Processing"
 msgstr ""
 
-#: editor.cc:1878
+#: editor.cc:2007
 msgid "Bounce Range to Region List"
 msgstr ""
 
-#: editor.cc:1879
-msgid "Bounce Range to Region List With Processing"
+#: editor.cc:2008
+msgid "Bounce Range to Region List with Processing"
 msgstr ""
 
-#: editor.cc:1880 editor_markers.cc:953
+#: editor.cc:2009 editor_markers.cc:956
 msgid "Export Range..."
 msgstr ""
 
-#: editor.cc:1882
+#: editor.cc:2011
 msgid "Export Video Range..."
 msgstr ""
 
-#: editor.cc:1898 editor.cc:1979 editor_actions.cc:303
-msgid "Play From Edit Point"
+#: editor.cc:2027 editor.cc:2109 editor_actions.cc:325
+msgid "Play from Edit Point"
 msgstr ""
 
-#: editor.cc:1899 editor.cc:1980
-msgid "Play From Start"
+#: editor.cc:2028 editor.cc:2110
+msgid "Play from Start"
 msgstr ""
 
-#: editor.cc:1900
+#: editor.cc:2029
 msgid "Play Region"
 msgstr ""
 
-#: editor.cc:1902
+#: editor.cc:2031
 msgid "Loop Region"
 msgstr "Loop Περιοχής"
 
-#: editor.cc:1912 editor.cc:1989
+#: editor.cc:2041 editor.cc:2119
 msgid "Select All in Track"
 msgstr ""
 
-#: editor.cc:1913 editor.cc:1990 editor_actions.cc:194
+#: editor.cc:2042 editor.cc:2120 editor_actions.cc:196
 msgid "Select All Objects"
 msgstr ""
 
-#: editor.cc:1914 editor.cc:1991
+#: editor.cc:2043 editor.cc:2121
 msgid "Invert Selection in Track"
 msgstr ""
 
-#: editor.cc:1915 editor.cc:1992 editor_actions.cc:197
+#: editor.cc:2044 editor.cc:2122 editor_actions.cc:199
 msgid "Invert Selection"
 msgstr ""
 
-#: editor.cc:1917
+#: editor.cc:2046 editor_actions.cc:201
 msgid "Set Range to Loop Range"
 msgstr ""
 
-#: editor.cc:1918
+#: editor.cc:2047 editor_actions.cc:202
 msgid "Set Range to Punch Range"
 msgstr ""
 
-#: editor.cc:1920 editor.cc:1994 editor_actions.cc:199 editor_actions.cc:200
+#: editor.cc:2048 editor_actions.cc:203
+msgid "Set Range to Selected Regions"
+msgstr ""
+
+#: editor.cc:2050 editor.cc:2124 editor_actions.cc:205 editor_actions.cc:206
 msgid "Select All After Edit Point"
 msgstr ""
 
-#: editor.cc:1921 editor.cc:1995 editor_actions.cc:201 editor_actions.cc:202
+#: editor.cc:2051 editor.cc:2125 editor_actions.cc:207 editor_actions.cc:208
 msgid "Select All Before Edit Point"
 msgstr ""
 
-#: editor.cc:1922 editor.cc:1996
+#: editor.cc:2052 editor.cc:2126
 msgid "Select All After Playhead"
 msgstr "Επιλογή όλων μετά την playhead"
 
-#: editor.cc:1923 editor.cc:1997
+#: editor.cc:2053 editor.cc:2127
 msgid "Select All Before Playhead"
 msgstr "Επιλογή όλων πριν την playhead"
 
-#: editor.cc:1924
+#: editor.cc:2054
 msgid "Select All Between Playhead and Edit Point"
 msgstr ""
 
-#: editor.cc:1925
+#: editor.cc:2055
 msgid "Select All Within Playhead and Edit Point"
 msgstr ""
 
-#: editor.cc:1926
+#: editor.cc:2056
 msgid "Select Range Between Playhead and Edit Point"
 msgstr ""
 
-#: editor.cc:1928 editor.cc:1999 editor_actions.cc:131 editor_actions.cc:132
+#: editor.cc:2058 editor.cc:2129 editor_actions.cc:134 editor_actions.cc:135
 msgid "Select"
 msgstr "Επιλογή"
 
-#: editor.cc:1936 editor.cc:2007 editor_actions.cc:337 processor_box.cc:2451
+#: editor.cc:2066 editor.cc:2137 editor_actions.cc:359 processor_box.cc:3665
 msgid "Cut"
 msgstr "Κοπή"
 
-#: editor.cc:1937 editor.cc:2008 editor_actions.cc:341 processor_box.cc:2454
+#: editor.cc:2067 editor.cc:2138 editor_actions.cc:363 processor_box.cc:3667
 msgid "Copy"
 msgstr "Αντιγραφή"
 
-#: editor.cc:1938 editor.cc:2009 editor_actions.cc:342 processor_box.cc:2462
+#: editor.cc:2068 editor.cc:2139 editor_actions.cc:364 processor_box.cc:3679
 msgid "Paste"
 msgstr "Επικόλληση"
 
-#: editor.cc:1942 editor_actions.cc:91
+#: editor.cc:2072 editor_actions.cc:94
 msgid "Align"
 msgstr "Ευθυγράμμιση"
 
-#: editor.cc:1943
+#: editor.cc:2073
 msgid "Align Relative"
 msgstr "Ευθυγράμμιση σχετικών"
 
-#: editor.cc:1950
+#: editor.cc:2080
 msgid "Insert Selected Region"
 msgstr "Εισαγωγή επιλεγμένης περιοχής"
 
-#: editor.cc:1951
+#: editor.cc:2081
 msgid "Insert Existing Media"
 msgstr ""
 
-#: editor.cc:1960 editor.cc:2016
+#: editor.cc:2090 editor.cc:2146
 msgid "Nudge Entire Track Later"
 msgstr ""
 
-#: editor.cc:1961 editor.cc:2017
+#: editor.cc:2091 editor.cc:2147
 msgid "Nudge Track After Edit Point Later"
 msgstr ""
 
-#: editor.cc:1962 editor.cc:2018
+#: editor.cc:2092 editor.cc:2148
 msgid "Nudge Entire Track Earlier"
 msgstr ""
 
-#: editor.cc:1963 editor.cc:2019
+#: editor.cc:2093 editor.cc:2149
 msgid "Nudge Track After Edit Point Earlier"
 msgstr ""
 
-#: editor.cc:1965 editor.cc:2021
+#: editor.cc:2095 editor.cc:2151
 msgid "Nudge"
 msgstr "Νύξη"
 
-#: editor.cc:2235
+#: editor.cc:2353
 msgid ""
 "Playhead position stored with a negative value - ignored (use zero instead)"
 msgstr ""
 
-#: editor.cc:3006 editor.cc:3707 editor.cc:3778 midi_channel_selector.cc:157
+#: editor.cc:3115 editor.cc:3775 editor.cc:3846 midi_channel_selector.cc:157
 #: midi_channel_selector.cc:395 midi_channel_selector.cc:431
 msgid "All"
 msgstr ""
 
-#: editor.cc:3210
-msgid "Smart Mode (add Range functions to Grab mode)"
+#: editor.cc:3280
+msgid "Smart Mode (add range functions to Grab Mode)"
 msgstr ""
 
-#: editor.cc:3211
+#: editor.cc:3281
 msgid "Grab Mode (select/move objects)"
 msgstr ""
 
-#: editor.cc:3212
+#: editor.cc:3282
 msgid "Cut Mode (split regions)"
 msgstr ""
 
-#: editor.cc:3213
+#: editor.cc:3283
 msgid "Range Mode (select time ranges)"
 msgstr ""
 
-#: editor.cc:3214
+#: editor.cc:3284
 msgid "Draw Mode (draw and edit gain/notes/automation)"
 msgstr ""
 
-#: editor.cc:3215
+#: editor.cc:3285
 msgid "Stretch Mode (time-stretch audio and midi regions, preserving pitch)"
 msgstr ""
 
-#: editor.cc:3216
+#: editor.cc:3286
 msgid "Audition Mode (listen to regions)"
 msgstr ""
 
-#: editor.cc:3217
-msgid "Internal Edit Mode (edit notes and gain curves inside regions)"
+#: editor.cc:3287
+msgid "Internal Edit Mode (edit notes and automation points)"
 msgstr ""
 
-#: editor.cc:3218
+#: editor.cc:3288
 msgid ""
 "Groups: click to (de)activate\n"
 "Context-click for other operations"
 msgstr ""
 
-#: editor.cc:3219
+#: editor.cc:3289
 msgid "Nudge Region/Selection Later"
 msgstr ""
 
-#: editor.cc:3220
+#: editor.cc:3290
 msgid "Nudge Region/Selection Earlier"
 msgstr ""
 
-#: editor.cc:3221 editor_actions.cc:262
+#: editor.cc:3291 editor_actions.cc:272
 msgid "Zoom In"
 msgstr ""
 
-#: editor.cc:3222 editor_actions.cc:261
+#: editor.cc:3292 editor_actions.cc:271
 msgid "Zoom Out"
 msgstr ""
 
-#: editor.cc:3223
+#: editor.cc:3293
 msgid "Zoom to Time Scale"
 msgstr ""
 
-#: editor.cc:3224 editor.cc:3729 editor_actions.cc:263
+#: editor.cc:3294 editor.cc:3797 editor_actions.cc:273
 msgid "Zoom to Session"
 msgstr ""
 
-#: editor.cc:3225
-msgid "Zoom focus"
-msgstr ""
+#: editor.cc:3295 editor_actions.cc:115 editor_actions.cc:148
+msgid "Zoom Focus"
+msgstr "Εστίαση Zoom"
 
-#: editor.cc:3226
+#: editor.cc:3296
 msgid "Expand Tracks"
 msgstr ""
 
-#: editor.cc:3227
+#: editor.cc:3297
 msgid "Shrink Tracks"
 msgstr ""
 
-#: editor.cc:3228
+#: editor.cc:3298
 msgid "Number of visible tracks"
 msgstr ""
 
-#: editor.cc:3229
+#: editor.cc:3299
 msgid "Snap/Grid Units"
 msgstr ""
 
-#: editor.cc:3230
+#: editor.cc:3300
 msgid "Snap/Grid Mode"
 msgstr ""
 
-#: editor.cc:3232
+#: editor.cc:3301 editor_actions.cc:101
+msgid "Edit Point"
+msgstr ""
+
+#: editor.cc:3302
 msgid "Edit Mode"
 msgstr "Λειτουργία Επεξ/σίας"
 
-#: editor.cc:3233
+#: editor.cc:3303
 msgid ""
 "Nudge Clock\n"
 "(controls distance used to nudge regions and selections)"
 msgstr ""
 
-#: editor.cc:3501 editor_actions.cc:313
+#: editor.cc:3571 editor_actions.cc:335
 msgid "Command|Undo"
 msgstr ""
 
-#: editor.cc:3503
+#: editor.cc:3573
 msgid "Command|Undo (%1)"
 msgstr ""
 
-#: editor.cc:3510 editor_actions.cc:315 editor_actions.cc:316
-#: editor_actions.cc:317
+#: editor.cc:3580 editor_actions.cc:337 editor_actions.cc:338
+#: editor_actions.cc:339
 msgid "Redo"
 msgstr "Redo"
 
-#: editor.cc:3512
+#: editor.cc:3583
 msgid "Redo (%1)"
 msgstr "Redo (%1)"
 
-#: editor.cc:3531 editor.cc:3555 editor_actions.cc:110 editor_actions.cc:1846
+#: editor.cc:3603 editor.cc:3627 editor_actions.cc:113 editor_actions.cc:1863
 msgid "Duplicate"
 msgstr "Αντιγραφή"
 
-#: editor.cc:3532
+#: editor.cc:3604
 msgid "Number of duplications:"
 msgstr ""
 
-#: editor.cc:3706 route_group_dialog.cc:51 time_info_box.cc:67
+#: editor.cc:3774 route_group_dialog.cc:51 time_info_box.cc:61
 msgid "Selection"
 msgstr ""
 
-#: editor.cc:3709
+#: editor.cc:3777
 msgid "Fit 1 track"
 msgstr ""
 
-#: editor.cc:3710
+#: editor.cc:3778
 msgid "Fit 2 tracks"
 msgstr ""
 
-#: editor.cc:3711
+#: editor.cc:3779
 msgid "Fit 4 tracks"
 msgstr ""
 
-#: editor.cc:3712
+#: editor.cc:3780
 msgid "Fit 8 tracks"
 msgstr ""
 
-#: editor.cc:3713
+#: editor.cc:3781
 msgid "Fit 16 tracks"
 msgstr ""
 
-#: editor.cc:3714
+#: editor.cc:3782
 msgid "Fit 24 tracks"
 msgstr ""
 
-#: editor.cc:3715
+#: editor.cc:3783
 msgid "Fit 32 tracks"
 msgstr ""
 
-#: editor.cc:3716
+#: editor.cc:3784
 msgid "Fit 48 tracks"
 msgstr ""
 
-#: editor.cc:3717
+#: editor.cc:3785
 msgid "Fit All tracks"
 msgstr ""
 
-#: editor.cc:3718
+#: editor.cc:3786
 msgid "Fit Selection"
 msgstr ""
 
-#: editor.cc:3720
+#: editor.cc:3788 editor_actions.cc:288
 msgid "Zoom to 10 ms"
 msgstr ""
 
-#: editor.cc:3721
+#: editor.cc:3789 editor_actions.cc:289
 msgid "Zoom to 100 ms"
 msgstr ""
 
-#: editor.cc:3722
+#: editor.cc:3790 editor_actions.cc:290
 msgid "Zoom to 1 sec"
 msgstr ""
 
-#: editor.cc:3723
+#: editor.cc:3791 editor_actions.cc:291
 msgid "Zoom to 10 sec"
 msgstr ""
 
-#: editor.cc:3724
+#: editor.cc:3792 editor_actions.cc:292
 msgid "Zoom to 1 min"
 msgstr ""
 
-#: editor.cc:3725
+#: editor.cc:3793 editor_actions.cc:294
 msgid "Zoom to 10 min"
 msgstr ""
 
-#: editor.cc:3726
+#: editor.cc:3794
 msgid "Zoom to 1 hour"
 msgstr ""
 
-#: editor.cc:3727
+#: editor.cc:3795
 msgid "Zoom to 8 hours"
 msgstr ""
 
-#: editor.cc:3728
+#: editor.cc:3796
 msgid "Zoom to 24 hours"
 msgstr ""
 
-#: editor.cc:3730
+#: editor.cc:3798
 msgid "Zoom to Range/Region Selection"
 msgstr ""
 
-#: editor.cc:3800
+#: editor.cc:3868
 msgid "*"
 msgstr ""
 
-#: editor.cc:4120
+#: editor.cc:4135
 msgid "Playlist Deletion"
 msgstr ""
 
-#: editor.cc:4121
+#: editor.cc:4136
 msgid ""
 "Playlist %1 is currently unused.\n"
 "If it is kept, its audio files will not be cleaned.\n"
 "If it is deleted, audio files used by it alone will be cleaned."
 msgstr ""
 
-#: editor.cc:4131
+#: editor.cc:4146
+msgid "Delete All Unused"
+msgstr ""
+
+#: editor.cc:4147
 msgid "Delete Playlist"
 msgstr ""
 
-#: editor.cc:4132
+#: editor.cc:4148
 msgid "Keep Playlist"
 msgstr ""
 
-#: editor.cc:4133 editor_audio_import.cc:594 editor_ops.cc:6174
-#: engine_dialog.cc:2083 sfdb_freesound_mootcher.cc:69 processor_box.cc:2219
-#: processor_box.cc:2244
+#: editor.cc:4149
+msgid "Keep Remaining"
+msgstr ""
+
+#: editor.cc:4150 editor_audio_import.cc:600 editor_ops.cc:6530
+#: engine_dialog.cc:2986 sfdb_freesound_mootcher.cc:69 processor_box.cc:3431
+#: processor_box.cc:3456
 msgid "Cancel"
 msgstr "Ακύρωση"
 
-#: editor.cc:4275
+#: editor.cc:4292
 msgid "new playlists"
 msgstr "νέες playlists"
 
-#: editor.cc:4291
+#: editor.cc:4308
 msgid "copy playlists"
 msgstr "Αντιγραφή playlists"
 
-#: editor.cc:4306
+#: editor.cc:4323
 msgid "clear playlists"
 msgstr "εκκαθάριση playlists"
 
-#: editor.cc:5046
+#: editor.cc:5048
 msgid "Please wait while %1 loads visual data."
 msgstr ""
 
-#: editor.cc:5901 editor.cc:5932 editor_markers.cc:985 panner_ui.cc:410
-#: processor_box.cc:2482
+#: editor.cc:5811 editor_actions.cc:479
+msgid "Unset #%1"
+msgstr ""
+
+#: editor.cc:5812 editor_actions.cc:481
+msgid "no action bound"
+msgstr ""
+
+#: editor.cc:5961 editor.cc:5996 editor_markers.cc:998 editor_markers.cc:1018
+#: panner_ui.cc:412 processor_box.cc:3703
 msgid "Edit..."
 msgstr ""
 
-#: editor.cc:5934 editor_actions.cc:1941
+#: editor.cc:6002 editor_actions.cc:1842
+msgid "Transpose..."
+msgstr ""
+
+#: editor.cc:6006 editor_actions.cc:1959
 msgid "Legatize"
 msgstr ""
 
-#: editor.cc:5936 editor_actions.cc:1940
+#: editor.cc:6012 editor_actions.cc:1958
 msgid "Quantize..."
 msgstr ""
 
-#: editor.cc:5938 editor_actions.cc:1943
+#: editor.cc:6015 editor_actions.cc:1961
 msgid "Remove Overlap"
 msgstr ""
 
-#: editor.cc:5940 editor_actions.cc:1942
+#: editor.cc:6021 editor_actions.cc:1960
 msgid "Transform..."
 msgstr ""
 
-#: editor_actions.cc:92
+#: editor_actions.cc:95
 msgid "Autoconnect"
 msgstr "ΑυτόματηΣύνδεση"
 
-#: editor_actions.cc:93
+#: editor_actions.cc:96
 msgid "Crossfades"
 msgstr ""
 
-#: editor_actions.cc:95
+#: editor_actions.cc:98
 msgid "Move Selected Marker"
 msgstr ""
 
-#: editor_actions.cc:96
+#: editor_actions.cc:99
 msgid "Select Range Operations"
 msgstr ""
 
-#: editor_actions.cc:97
+#: editor_actions.cc:100
 msgid "Select Regions"
 msgstr ""
 
-#: editor_actions.cc:98
-msgid "Edit Point"
-msgstr ""
-
-#: editor_actions.cc:99
+#: editor_actions.cc:102
 msgid "Fade"
 msgstr ""
 
-#: editor_actions.cc:100
+#: editor_actions.cc:103
 msgid "Latch"
 msgstr ""
 
-#: editor_actions.cc:101 editor_regions.cc:112 region_editor.cc:46
+#: editor_actions.cc:104 editor_regions.cc:159 region_editor.cc:48
 msgid "Region"
 msgstr ""
 
-#: editor_actions.cc:102
+#: editor_actions.cc:105
 msgid "Layering"
 msgstr "Στρωματοποίηση"
 
-#: editor_actions.cc:103 editor_regions.cc:113 stereo_panner_editor.cc:44
+#: editor_actions.cc:106 editor_regions.cc:160 stereo_panner_editor.cc:46
 msgid "Position"
 msgstr "Θέση"
 
-#: editor_actions.cc:105 gain_meter.cc:156 gain_meter.cc:825 panner_ui.cc:178
-#: panner_ui.cc:635
+#: editor_actions.cc:108 gain_meter.cc:161 gain_meter.cc:848 panner_ui.cc:178
+#: panner_ui.cc:637 route_time_axis.cc:541
 msgid "Trim"
 msgstr "Ισοστάθμιση"
 
-#: editor_actions.cc:106 editor_actions.cc:126 route_group_dialog.cc:46
+#: editor_actions.cc:109 editor_actions.cc:129 route_group_dialog.cc:46
 msgid "Gain"
 msgstr ""
 
-#: editor_actions.cc:107 editor_actions.cc:563
+#: editor_actions.cc:110 editor_actions.cc:604
 msgid "Ranges"
 msgstr ""
 
-#: editor_actions.cc:108 editor_actions.cc:1842 session_option_editor.cc:135
+#: editor_actions.cc:111 editor_actions.cc:1859 session_option_editor.cc:135
 #: session_option_editor.cc:144 session_option_editor.cc:151
+#: session_option_editor.cc:158 session_option_editor.cc:165
 msgid "Fades"
 msgstr ""
 
-#: editor_actions.cc:111
+#: editor_actions.cc:114
 msgid "Link"
 msgstr ""
 
-#: editor_actions.cc:112 editor_actions.cc:145
-msgid "Zoom Focus"
-msgstr "Εστίαση Zoom"
-
-#: editor_actions.cc:113
+#: editor_actions.cc:116
 msgid "Locate to Markers"
 msgstr ""
 
-#: editor_actions.cc:115
+#: editor_actions.cc:118
 msgid "Meter falloff"
 msgstr ""
 
-#: editor_actions.cc:116
+#: editor_actions.cc:119
 msgid "Meter hold"
 msgstr "Παύση Μετρητή"
 
-#: editor_actions.cc:117 session_option_editor.cc:321
+#: editor_actions.cc:120 session_option_editor.cc:342
 msgid "MIDI Options"
 msgstr ""
 
-#: editor_actions.cc:118
+#: editor_actions.cc:121
 msgid "Misc Options"
 msgstr ""
 
-#: editor_actions.cc:119 rc_option_editor.cc:1809 route_group_dialog.cc:54
-#: session_option_editor.cc:243 session_option_editor.cc:250
+#: editor_actions.cc:122 rc_option_editor.cc:2401 route_group_dialog.cc:54
+#: session_option_editor.cc:264 session_option_editor.cc:271
 msgid "Monitoring"
 msgstr ""
 
-#: editor_actions.cc:120
+#: editor_actions.cc:123
 msgid "Active Mark"
 msgstr ""
 
-#: editor_actions.cc:123
+#: editor_actions.cc:126
 msgid "Primary Clock"
 msgstr ""
 
-#: editor_actions.cc:124
+#: editor_actions.cc:127
 msgid "Pullup / Pulldown"
 msgstr ""
 
-#: editor_actions.cc:125
+#: editor_actions.cc:128
 msgid "Region operations"
 msgstr "Ενέργειες Περιοχών"
 
-#: editor_actions.cc:127 ruler_dialog.cc:28
+#: editor_actions.cc:130 ruler_dialog.cc:28
 msgid "Rulers"
 msgstr ""
 
-#: editor_actions.cc:128
+#: editor_actions.cc:131
 msgid "Views"
 msgstr ""
 
-#: editor_actions.cc:129
+#: editor_actions.cc:132
 msgid "Scroll"
 msgstr ""
 
-#: editor_actions.cc:130
+#: editor_actions.cc:133
 msgid "Secondary Clock"
 msgstr ""
 
-#: editor_actions.cc:137
+#: editor_actions.cc:140
 msgid "Subframes"
 msgstr ""
 
-#: editor_actions.cc:140
+#: editor_actions.cc:143
 msgid "Timecode fps"
 msgstr ""
 
-#: editor_actions.cc:141 route_time_axis.cc:575
+#: editor_actions.cc:144 route_time_axis.cc:599
 msgid "Height"
 msgstr "Ύψος"
 
-#: editor_actions.cc:143
+#: editor_actions.cc:146
 msgid "Tools"
 msgstr "Εργαλεία"
 
-#: editor_actions.cc:144
+#: editor_actions.cc:147
 msgid "View"
 msgstr "Οψη"
 
-#: editor_actions.cc:146
+#: editor_actions.cc:149
 msgid "Zoom"
 msgstr ""
 
-#: editor_actions.cc:152
-msgid "Break drag or deselect all"
+#: editor_actions.cc:150
+msgid "Scripted Actions"
 msgstr ""
 
 #: editor_actions.cc:159
+msgid "Session|Lock"
+msgstr ""
+
+#: editor_actions.cc:161
 msgid "Show Editor Mixer"
 msgstr "Ανάδειξη Μίκτη του Editor"
 
-#: editor_actions.cc:160
+#: editor_actions.cc:162
 msgid "Show Editor List"
 msgstr ""
 
-#: editor_actions.cc:162
+#: editor_actions.cc:164
 msgid "Playhead to Next Region Boundary"
 msgstr ""
 
-#: editor_actions.cc:163
+#: editor_actions.cc:165
 msgid "Playhead to Next Region Boundary (No Track Selection)"
 msgstr ""
 
-#: editor_actions.cc:164
+#: editor_actions.cc:166
 msgid "Playhead to Previous Region Boundary"
 msgstr ""
 
-#: editor_actions.cc:165
+#: editor_actions.cc:167
 msgid "Playhead to Previous Region Boundary (No Track Selection)"
 msgstr ""
 
-#: editor_actions.cc:167
+#: editor_actions.cc:169
 msgid "Playhead to Next Region Start"
 msgstr "Playhead στην επόμενη Region Start"
 
-#: editor_actions.cc:168
+#: editor_actions.cc:170
 msgid "Playhead to Next Region End"
 msgstr "Playhead στην επόμενη Region End"
 
-#: editor_actions.cc:169
+#: editor_actions.cc:171
 msgid "Playhead to Next Region Sync"
 msgstr "Playhead στην επόμενη Region Sync"
 
-#: editor_actions.cc:171
+#: editor_actions.cc:173
 msgid "Playhead to Previous Region Start"
 msgstr "Playhead στην προηγούμενη Region Start"
 
-#: editor_actions.cc:172
+#: editor_actions.cc:174
 msgid "Playhead to Previous Region End"
 msgstr "Playhead στην προηγούμενη Region End"
 
-#: editor_actions.cc:173
+#: editor_actions.cc:175
 msgid "Playhead to Previous Region Sync"
 msgstr "Playhead στην προηγούμενη Region Sync"
 
-#: editor_actions.cc:175
+#: editor_actions.cc:177
 msgid "To Next Region Boundary"
 msgstr ""
 
-#: editor_actions.cc:176
+#: editor_actions.cc:178
 msgid "To Next Region Boundary (No Track Selection)"
 msgstr ""
 
-#: editor_actions.cc:177
+#: editor_actions.cc:179
 msgid "To Previous Region Boundary"
 msgstr ""
 
-#: editor_actions.cc:178
+#: editor_actions.cc:180
 msgid "To Previous Region Boundary (No Track Selection)"
 msgstr ""
 
-#: editor_actions.cc:180
+#: editor_actions.cc:182
 msgid "To Next Region Start"
 msgstr ""
 
-#: editor_actions.cc:181
+#: editor_actions.cc:183
 msgid "To Next Region End"
 msgstr ""
 
-#: editor_actions.cc:182
+#: editor_actions.cc:184
 msgid "To Next Region Sync"
 msgstr ""
 
-#: editor_actions.cc:184
+#: editor_actions.cc:186
 msgid "To Previous Region Start"
 msgstr ""
 
-#: editor_actions.cc:185
+#: editor_actions.cc:187
 msgid "To Previous Region End"
 msgstr ""
 
-#: editor_actions.cc:186
+#: editor_actions.cc:188
 msgid "To Previous Region Sync"
 msgstr ""
 
-#: editor_actions.cc:188
+#: editor_actions.cc:190
 msgid "To Range Start"
 msgstr ""
 
-#: editor_actions.cc:189
+#: editor_actions.cc:191
 msgid "To Range End"
 msgstr ""
 
-#: editor_actions.cc:191
+#: editor_actions.cc:193
 msgid "Playhead to Range Start"
 msgstr "Playhead στην Αρχή Διαστήματος"
 
-#: editor_actions.cc:192
+#: editor_actions.cc:194
 msgid "Playhead to Range End"
 msgstr "Η playhead στο τέλος του διαστήματος"
 
-#: editor_actions.cc:195
+#: editor_actions.cc:197
 msgid "Select All Tracks"
 msgstr ""
 
-#: editor_actions.cc:196 export_timespan_selector.cc:61 processor_box.cc:2468
+#: editor_actions.cc:198 export_timespan_selector.cc:59 processor_box.cc:3685
 msgid "Deselect All"
 msgstr "Αποεπιλογή όλων"
 
-#: editor_actions.cc:204
+#: editor_actions.cc:210
 msgid "Select All Overlapping Edit Range"
 msgstr ""
 
-#: editor_actions.cc:205
+#: editor_actions.cc:211
 msgid "Select All Inside Edit Range"
 msgstr ""
 
-#: editor_actions.cc:207
+#: editor_actions.cc:213
 msgid "Select Edit Range"
 msgstr ""
 
-#: editor_actions.cc:209
+#: editor_actions.cc:215
 msgid "Select All in Punch Range"
 msgstr "Επιλογή όλων μέσα στο punch όριο"
 
-#: editor_actions.cc:210
+#: editor_actions.cc:216
 msgid "Select All in Loop Range"
 msgstr ""
 
-#: editor_actions.cc:212
+#: editor_actions.cc:218
 msgid "Select Next Track or Bus"
 msgstr ""
 
-#: editor_actions.cc:213
+#: editor_actions.cc:219
 msgid "Select Previous Track or Bus"
 msgstr ""
 
-#: editor_actions.cc:215
+#: editor_actions.cc:221
 msgid "Toggle Record Enable"
 msgstr ""
 
-#: editor_actions.cc:217
+#: editor_actions.cc:223
 msgid "Toggle Solo"
 msgstr ""
 
-#: editor_actions.cc:219
+#: editor_actions.cc:225
 msgid "Toggle Mute"
 msgstr ""
 
-#: editor_actions.cc:221
+#: editor_actions.cc:227
 msgid "Toggle Solo Isolate"
 msgstr ""
 
-#: editor_actions.cc:226
+#: editor_actions.cc:232
 msgid "Save View %1"
 msgstr ""
 
-#: editor_actions.cc:232
+#: editor_actions.cc:238
 msgid "Go to View %1"
 msgstr ""
 
-#: editor_actions.cc:238
+#: editor_actions.cc:244
 msgid "Locate to Mark %1"
 msgstr ""
 
-#: editor_actions.cc:242 editor_actions.cc:243
+#: editor_actions.cc:249 editor_actions.cc:250
 msgid "Jump to Next Mark"
 msgstr ""
 
-#: editor_actions.cc:244 editor_actions.cc:245
+#: editor_actions.cc:251 editor_actions.cc:252
 msgid "Jump to Previous Mark"
 msgstr ""
 
-#: editor_actions.cc:247 editor_actions.cc:248
+#: editor_actions.cc:254
+msgid "Set Session Start from Playhead"
+msgstr ""
+
+#: editor_actions.cc:255
+msgid "Set Session End from Playhead"
+msgstr ""
+
+#: editor_actions.cc:257 editor_actions.cc:258
 msgid "Add Mark from Playhead"
 msgstr ""
 
-#: editor_actions.cc:250 editor_actions.cc:251
+#: editor_actions.cc:260 editor_actions.cc:261
 msgid "Remove Mark at Playhead"
 msgstr ""
 
-#: editor_actions.cc:253
+#: editor_actions.cc:263
 msgid "Nudge Next Later"
 msgstr ""
 
-#: editor_actions.cc:254
+#: editor_actions.cc:264
 msgid "Nudge Next Earlier"
 msgstr ""
 
-#: editor_actions.cc:256
+#: editor_actions.cc:266
 msgid "Nudge Playhead Forward"
 msgstr ""
 
-#: editor_actions.cc:257
+#: editor_actions.cc:267
 msgid "Nudge Playhead Backward"
 msgstr ""
 
-#: editor_actions.cc:258
-msgid "Playhead To Next Grid"
+#: editor_actions.cc:268
+msgid "Playhead to Next Grid"
 msgstr ""
 
-#: editor_actions.cc:259
-msgid "Playhead To Previous Grid"
+#: editor_actions.cc:269
+msgid "Playhead to Previous Grid"
 msgstr ""
 
-#: editor_actions.cc:264
+#: editor_actions.cc:274
 msgid "Zoom to Selection"
 msgstr ""
 
-#: editor_actions.cc:265
+#: editor_actions.cc:275
 msgid "Toggle Zoom State"
 msgstr ""
 
-#: editor_actions.cc:267
+#: editor_actions.cc:277
 msgid "Expand Track Height"
 msgstr ""
 
-#: editor_actions.cc:268
+#: editor_actions.cc:278
 msgid "Shrink Track Height"
 msgstr ""
 
-#: editor_actions.cc:270
+#: editor_actions.cc:280
+msgid "Fit 1 Track"
+msgstr ""
+
+#: editor_actions.cc:281
+msgid "Fit 2 Tracks"
+msgstr ""
+
+#: editor_actions.cc:282
+msgid "Fit 4 Tracks"
+msgstr ""
+
+#: editor_actions.cc:283
+msgid "Fit 8 Tracks"
+msgstr ""
+
+#: editor_actions.cc:284
+msgid "Fit 16 Tracks"
+msgstr ""
+
+#: editor_actions.cc:285
+msgid "Fit 32 Tracks"
+msgstr ""
+
+#: editor_actions.cc:286
+msgid "Fit All Tracks"
+msgstr ""
+
+#: editor_actions.cc:293
+msgid "Zoom to 5 min"
+msgstr ""
+
+#: editor_actions.cc:296
 msgid "Move Selected Tracks Up"
 msgstr ""
 
-#: editor_actions.cc:272
+#: editor_actions.cc:298
 msgid "Move Selected Tracks Down"
 msgstr ""
 
-#: editor_actions.cc:275
+#: editor_actions.cc:301
 msgid "Scroll Tracks Up"
 msgstr "Κύλιση Καναλιών επάνω"
 
-#: editor_actions.cc:277
+#: editor_actions.cc:302
 msgid "Scroll Tracks Down"
 msgstr "Κύλιση Καναλιών Κάτω"
 
-#: editor_actions.cc:279
+#: editor_actions.cc:303
 msgid "Step Tracks Up"
 msgstr "Μετακίνηση Καναλιών επάνω"
 
-#: editor_actions.cc:281
+#: editor_actions.cc:304
 msgid "Step Tracks Down"
 msgstr "Μετάθεση Καναλιών κάτω"
 
-#: editor_actions.cc:284
+#: editor_actions.cc:306
 msgid "Scroll Backward"
 msgstr "Κύλιση πίσω"
 
-#: editor_actions.cc:285
+#: editor_actions.cc:307
 msgid "Scroll Forward"
 msgstr "Κύλιση εμπρός"
 
-#: editor_actions.cc:286
+#: editor_actions.cc:308
 msgid "Center Playhead"
 msgstr "Playhead στο κέντρο"
 
-#: editor_actions.cc:287
+#: editor_actions.cc:309
 msgid "Center Edit Point"
 msgstr ""
 
-#: editor_actions.cc:289
+#: editor_actions.cc:311
 msgid "Playhead Forward"
 msgstr "Playhead εμπρός"
 
-#: editor_actions.cc:290
+#: editor_actions.cc:312
 msgid "Playhead Backward"
 msgstr "Playhead πίσω"
 
-#: editor_actions.cc:292
+#: editor_actions.cc:314
 msgid "Playhead to Active Mark"
 msgstr ""
 
-#: editor_actions.cc:293
+#: editor_actions.cc:315
 msgid "Active Mark to Playhead"
 msgstr ""
 
-#: editor_actions.cc:295
+#: editor_actions.cc:317
 msgid "Use Skip Ranges"
 msgstr ""
 
-#: editor_actions.cc:302
+#: editor_actions.cc:324
 msgid "Play Selected Regions"
 msgstr ""
 
-#: editor_actions.cc:304
+#: editor_actions.cc:326
 msgid "Play from Edit Point and Return"
 msgstr ""
 
-#: editor_actions.cc:306
+#: editor_actions.cc:328
 msgid "Play Edit Range"
 msgstr ""
 
-#: editor_actions.cc:308
+#: editor_actions.cc:330
 msgid "Playhead to Mouse"
 msgstr ""
 
-#: editor_actions.cc:309
+#: editor_actions.cc:331
 msgid "Active Marker to Mouse"
 msgstr ""
 
-#: editor_actions.cc:319
+#: editor_actions.cc:341
 msgid "Undo Selection Change"
 msgstr ""
 
-#: editor_actions.cc:320
+#: editor_actions.cc:342
 msgid "Redo Selection Change"
 msgstr ""
 
-#: editor_actions.cc:322
+#: editor_actions.cc:344
 msgid "Export Audio"
 msgstr ""
 
-#: editor_actions.cc:323 export_dialog.cc:396
+#: editor_actions.cc:345 export_dialog.cc:424
 msgid "Export Range"
 msgstr "Εξαγωγή διαστήματος"
 
-#: editor_actions.cc:328
+#: editor_actions.cc:350
 msgid "Separate Using Punch Range"
 msgstr ""
 
-#: editor_actions.cc:331
+#: editor_actions.cc:353
 msgid "Separate Using Loop Range"
 msgstr ""
 
-#: editor_actions.cc:334 editor_actions.cc:356
+#: editor_actions.cc:356 editor_actions.cc:379
 msgid "Crop"
 msgstr ""
 
-#: editor_actions.cc:344
+#: editor_actions.cc:366
 msgid "Fade Range Selection"
 msgstr ""
 
-#: editor_actions.cc:346
+#: editor_actions.cc:368
 msgid "Set Tempo from Edit Range = Bar"
 msgstr ""
 
-#: editor_actions.cc:348
+#: editor_actions.cc:371
 msgid "Log"
 msgstr ""
 
-#: editor_actions.cc:351 editor_actions.cc:353
+#: editor_actions.cc:374 editor_actions.cc:376
 msgid "Move to Next Transient"
 msgstr ""
 
-#: editor_actions.cc:352 editor_actions.cc:354
+#: editor_actions.cc:375 editor_actions.cc:377
 msgid "Move to Previous Transient"
 msgstr ""
 
-#: editor_actions.cc:358 editor_actions.cc:361
+#: editor_actions.cc:381
+msgid "Start Range from Playhead"
+msgstr ""
+
+#: editor_actions.cc:382
+msgid "Finish Range from Playhead"
+msgstr ""
+
+#: editor_actions.cc:384 editor_actions.cc:393
 msgid "Start Range"
 msgstr "Εναρκτήριο διάστημα"
 
-#: editor_actions.cc:359 editor_actions.cc:362
+#: editor_actions.cc:385 editor_actions.cc:394
 msgid "Finish Range"
 msgstr "Ολοκλήρωση Διαστήματος"
 
-#: editor_actions.cc:394
+#: editor_actions.cc:387
+msgid "Start Punch Range"
+msgstr ""
+
+#: editor_actions.cc:388
+msgid "Finish Punch Range"
+msgstr ""
+
+#: editor_actions.cc:390
+msgid "Start Loop Range"
+msgstr ""
+
+#: editor_actions.cc:391
+msgid "Finish Loop Range"
+msgstr ""
+
+#: editor_actions.cc:426
 msgid "Follow Playhead"
 msgstr "Ακολουθώντας την playhead"
 
-#: editor_actions.cc:395
+#: editor_actions.cc:427
 msgid "Remove Last Capture"
 msgstr ""
 
-#: editor_actions.cc:397
+#: editor_actions.cc:429
 msgid "Stationary Playhead"
 msgstr ""
 
-#: editor_actions.cc:399 insert_time_dialog.cc:32
+#: editor_actions.cc:431 insert_remove_time_dialog.cc:32
 msgid "Insert Time"
 msgstr ""
 
-#: editor_actions.cc:402
+#: editor_actions.cc:433 insert_remove_time_dialog.cc:32
+msgid "Remove Time"
+msgstr ""
+
+#: editor_actions.cc:438
 msgid "Toggle Active"
 msgstr ""
 
-#: editor_actions.cc:407 editor_actions.cc:1768 editor_markers.cc:921
-#: editor_markers.cc:986 editor_snapshots.cc:122 mixer_strip.cc:1543
-#: route_time_axis.cc:856
+#: editor_actions.cc:440 editor_actions.cc:1785 editor_markers.cc:926
+#: editor_markers.cc:999 editor_markers.cc:1019 editor_snapshots.cc:134
+#: lua_script_manager.cc:32 lua_script_manager.cc:36 mixer_strip.cc:1705
+#: route_time_axis.cc:870 vca_master_strip.cc:400
 msgid "Remove"
 msgstr "Απαλοιφή"
 
-#: editor_actions.cc:411
+#: editor_actions.cc:445
 msgid "Fit Selection (Vertical)"
 msgstr ""
 
-#: editor_actions.cc:413 time_axis_view.cc:1371
+#: editor_actions.cc:447 time_axis_view.cc:1287
 msgid "Largest"
 msgstr "Μέγιστο"
 
-#: editor_actions.cc:416 time_axis_view.cc:1372
+#: editor_actions.cc:450 time_axis_view.cc:1288
 msgid "Larger"
 msgstr "Μεγαλύτερο"
 
-#: editor_actions.cc:419 editor_rulers.cc:249 time_axis_view.cc:1373
+#: editor_actions.cc:453 editor_rulers.cc:248 time_axis_view.cc:1289
 msgid "Large"
 msgstr "Μεγάλο"
 
-#: editor_actions.cc:425 editor_rulers.cc:253 time_axis_view.cc:1375
+#: editor_actions.cc:459 editor_rulers.cc:252 time_axis_view.cc:1291
 msgid "Small"
 msgstr "Μικρό"
 
-#: editor_actions.cc:429
+#: editor_actions.cc:463
 msgid "Sound Selected MIDI Notes"
 msgstr ""
 
-#: editor_actions.cc:434
+#: editor_actions.cc:468
 msgid "Zoom Focus Left"
 msgstr "Εστίαση Zoom αριστερά"
 
-#: editor_actions.cc:435
+#: editor_actions.cc:469
 msgid "Zoom Focus Right"
 msgstr "Εστίαση Zoom δεξιά"
 
-#: editor_actions.cc:436
+#: editor_actions.cc:470
 msgid "Zoom Focus Center"
 msgstr "Εστίαση Zoom κέντρο"
 
-#: editor_actions.cc:437
+#: editor_actions.cc:471
 msgid "Zoom Focus Playhead"
 msgstr "Εστίαση Zoom στην playhead"
 
-#: editor_actions.cc:438
+#: editor_actions.cc:472
 msgid "Zoom Focus Mouse"
 msgstr ""
 
-#: editor_actions.cc:439
+#: editor_actions.cc:473
 msgid "Zoom Focus Edit Point"
 msgstr ""
 
-#: editor_actions.cc:441
+#: editor_actions.cc:475
 msgid "Next Zoom Focus"
 msgstr ""
 
-#: editor_actions.cc:447
+#: editor_actions.cc:488
 msgid "Smart Object Mode"
 msgstr ""
 
-#: editor_actions.cc:450
+#: editor_actions.cc:491
 msgid "Smart"
 msgstr ""
 
-#: editor_actions.cc:453
+#: editor_actions.cc:494
 msgid "Object Tool"
 msgstr "Εργαλείο Object"
 
-#: editor_actions.cc:458
+#: editor_actions.cc:499
 msgid "Range Tool"
 msgstr "Εργαλείο Διαστήματος"
 
-#: editor_actions.cc:463
+#: editor_actions.cc:504
 msgid "Note Drawing Tool"
 msgstr ""
 
-#: editor_actions.cc:468
+#: editor_actions.cc:509
 msgid "Audition Tool"
 msgstr ""
 
-#: editor_actions.cc:473
+#: editor_actions.cc:514
 msgid "Time FX Tool"
 msgstr ""
 
-#: editor_actions.cc:478
+#: editor_actions.cc:519
 msgid "Content Tool"
 msgstr ""
 
-#: editor_actions.cc:484
+#: editor_actions.cc:525
 msgid "Cut Tool"
 msgstr ""
 
-#: editor_actions.cc:490
+#: editor_actions.cc:531
 msgid "Step Mouse Mode"
 msgstr ""
 
-#: editor_actions.cc:497
+#: editor_actions.cc:538
 msgid "Change Edit Point"
 msgstr ""
 
-#: editor_actions.cc:498
+#: editor_actions.cc:539
 msgid "Change Edit Point Including Marker"
 msgstr ""
 
-#: editor_actions.cc:504
+#: editor_actions.cc:544
+msgid "EditMode|Lock"
+msgstr ""
+
+#: editor_actions.cc:545
 msgid "Cycle Edit Mode"
 msgstr ""
 
-#: editor_actions.cc:506
+#: editor_actions.cc:547
 msgid "Snap to"
 msgstr ""
 
-#: editor_actions.cc:507
+#: editor_actions.cc:548
 msgid "Snap Mode"
 msgstr "Λειτουργία Έλξεως"
 
-#: editor_actions.cc:514
+#: editor_actions.cc:555
 msgid "Next Snap Mode"
 msgstr ""
 
-#: editor_actions.cc:515
+#: editor_actions.cc:556
 msgid "Next Snap Choice"
 msgstr ""
 
-#: editor_actions.cc:516
+#: editor_actions.cc:557
 msgid "Next Musical Snap Choice"
 msgstr ""
 
-#: editor_actions.cc:517
+#: editor_actions.cc:558
 msgid "Previous Snap Choice"
 msgstr ""
 
-#: editor_actions.cc:518
+#: editor_actions.cc:559
 msgid "Previous Musical Snap Choice"
 msgstr ""
 
-#: editor_actions.cc:523
+#: editor_actions.cc:564
 msgid "Snap to CD Frame"
 msgstr ""
 
-#: editor_actions.cc:524
+#: editor_actions.cc:565
 msgid "Snap to Timecode Frame"
 msgstr ""
 
-#: editor_actions.cc:525
+#: editor_actions.cc:566
 msgid "Snap to Timecode Seconds"
 msgstr ""
 
-#: editor_actions.cc:526
+#: editor_actions.cc:567
 msgid "Snap to Timecode Minutes"
 msgstr ""
 
-#: editor_actions.cc:527
+#: editor_actions.cc:568
 msgid "Snap to Seconds"
 msgstr ""
 
-#: editor_actions.cc:528
+#: editor_actions.cc:569
 msgid "Snap to Minutes"
 msgstr ""
 
-#: editor_actions.cc:530
+#: editor_actions.cc:571
 msgid "Snap to One Twenty Eighths"
 msgstr ""
 
-#: editor_actions.cc:531
+#: editor_actions.cc:572
 msgid "Snap to Sixty Fourths"
 msgstr ""
 
-#: editor_actions.cc:532
+#: editor_actions.cc:573
 msgid "Snap to Thirty Seconds"
 msgstr ""
 
-#: editor_actions.cc:533
+#: editor_actions.cc:574
 msgid "Snap to Twenty Eighths"
 msgstr ""
 
-#: editor_actions.cc:534
+#: editor_actions.cc:575
 msgid "Snap to Twenty Fourths"
 msgstr ""
 
-#: editor_actions.cc:535
+#: editor_actions.cc:576
 msgid "Snap to Twentieths"
 msgstr ""
 
-#: editor_actions.cc:536
+#: editor_actions.cc:577
 msgid "Snap to Sixteenths"
 msgstr ""
 
-#: editor_actions.cc:537
+#: editor_actions.cc:578
 msgid "Snap to Fourteenths"
 msgstr ""
 
-#: editor_actions.cc:538
+#: editor_actions.cc:579
 msgid "Snap to Twelfths"
 msgstr ""
 
-#: editor_actions.cc:539
+#: editor_actions.cc:580
 msgid "Snap to Tenths"
 msgstr ""
 
-#: editor_actions.cc:540
+#: editor_actions.cc:581
 msgid "Snap to Eighths"
 msgstr ""
 
-#: editor_actions.cc:541
+#: editor_actions.cc:582
 msgid "Snap to Sevenths"
 msgstr ""
 
-#: editor_actions.cc:542
+#: editor_actions.cc:583
 msgid "Snap to Sixths"
 msgstr ""
 
-#: editor_actions.cc:543
+#: editor_actions.cc:584
 msgid "Snap to Fifths"
 msgstr ""
 
-#: editor_actions.cc:544
+#: editor_actions.cc:585
 msgid "Snap to Quarters"
 msgstr ""
 
-#: editor_actions.cc:545
+#: editor_actions.cc:586
 msgid "Snap to Thirds"
 msgstr ""
 
-#: editor_actions.cc:546
+#: editor_actions.cc:587
 msgid "Snap to Halves"
 msgstr ""
 
-#: editor_actions.cc:548
+#: editor_actions.cc:589
 msgid "Snap to Beat"
 msgstr ""
 
-#: editor_actions.cc:549
+#: editor_actions.cc:590
 msgid "Snap to Bar"
 msgstr ""
 
-#: editor_actions.cc:550
+#: editor_actions.cc:591
 msgid "Snap to Mark"
 msgstr ""
 
-#: editor_actions.cc:551
+#: editor_actions.cc:592
 msgid "Snap to Region Start"
 msgstr ""
 
-#: editor_actions.cc:552
+#: editor_actions.cc:593
 msgid "Snap to Region End"
 msgstr ""
 
-#: editor_actions.cc:553
+#: editor_actions.cc:594
 msgid "Snap to Region Sync"
 msgstr ""
 
-#: editor_actions.cc:554
+#: editor_actions.cc:595
 msgid "Snap to Region Boundary"
 msgstr ""
 
-#: editor_actions.cc:556
+#: editor_actions.cc:597
 msgid "Show Marker Lines"
 msgstr ""
 
-#: editor_actions.cc:566
+#: editor_actions.cc:607
 msgid "Loop/Punch"
 msgstr ""
 
-#: editor_actions.cc:570
+#: editor_actions.cc:611
 msgid "Min:Sec"
 msgstr ""
 
-#: editor_actions.cc:572 editor_actions.cc:575 editor_rulers.cc:271
+#: editor_actions.cc:613 editor_actions.cc:616 editor_rulers.cc:270
+#: rc_option_editor.cc:1592
 msgid "Video Monitor"
 msgstr ""
 
-#: editor_actions.cc:574 rc_option_editor.cc:2260
+#: editor_actions.cc:615 rc_option_editor.cc:2844
 msgid "Video"
 msgstr ""
 
-#: editor_actions.cc:577
+#: editor_actions.cc:618
 msgid "Always on Top"
 msgstr ""
 
-#: editor_actions.cc:579
+#: editor_actions.cc:620
 msgid "Frame number"
 msgstr ""
 
-#: editor_actions.cc:580
+#: editor_actions.cc:621
 msgid "Timecode Background"
 msgstr ""
 
-#: editor_actions.cc:581
+#: editor_actions.cc:622
 msgid "Fullscreen"
 msgstr ""
 
-#: editor_actions.cc:582
+#: editor_actions.cc:623
 msgid "Letterbox"
 msgstr ""
 
-#: editor_actions.cc:583
+#: editor_actions.cc:624
 msgid "Original Size"
 msgstr ""
 
-#: editor_actions.cc:640
+#: editor_actions.cc:681
 msgid "Sort"
 msgstr "Ταξινόμηση"
 
-#: editor_actions.cc:651 editor_routes.cc:476 mixer_ui.cc:1196
+#: editor_actions.cc:692 editor_routes.cc:549 mixer_ui.cc:1497
 msgid "Show All"
 msgstr "Εμφάνιση Όλων"
 
-#: editor_actions.cc:652
+#: editor_actions.cc:693
 msgid "Show Automatic Regions"
 msgstr ""
 
-#: editor_actions.cc:654
+#: editor_actions.cc:695
 msgid "Ascending"
 msgstr "Αύξουσα"
 
-#: editor_actions.cc:656
+#: editor_actions.cc:697
 msgid "Descending"
 msgstr "Φθίνουσα"
 
-#: editor_actions.cc:659
+#: editor_actions.cc:700
 msgid "By Region Name"
 msgstr "Με Όνομα Περιοχής"
 
-#: editor_actions.cc:661
+#: editor_actions.cc:702
 msgid "By Region Length"
 msgstr "Με Μέγεθος Περιοχής"
 
-#: editor_actions.cc:663
+#: editor_actions.cc:704
 msgid "By Region Position"
 msgstr "Με Θέση Περιοχής"
 
-#: editor_actions.cc:665
+#: editor_actions.cc:706
 msgid "By Region Timestamp"
 msgstr "Με Χρονο-στάμπα Περιοχής"
 
-#: editor_actions.cc:667
+#: editor_actions.cc:708
 msgid "By Region Start in File"
 msgstr "Με Αρχή-στο-αρχείο της Περιοχής"
 
-#: editor_actions.cc:669
+#: editor_actions.cc:710
 msgid "By Region End in File"
 msgstr "Με Τέλος-στο -αρχείο της Περιοχής"
 
-#: editor_actions.cc:671
+#: editor_actions.cc:712
 msgid "By Source File Name"
 msgstr "Με Όνομα Αρχείου Πηγής"
 
-#: editor_actions.cc:673
+#: editor_actions.cc:714
 msgid "By Source File Length"
 msgstr "Με Μέγεθος Αρχείου Πηγής"
 
-#: editor_actions.cc:675
+#: editor_actions.cc:716
 msgid "By Source File Creation Date"
 msgstr "Με Ημ/νία Αρχείου Πηγής"
 
-#: editor_actions.cc:677
+#: editor_actions.cc:718
 msgid "By Source Filesystem"
 msgstr "Με Filesystem Πηγής"
 
-#: editor_actions.cc:680
+#: editor_actions.cc:721
 msgid "Remove Unused"
 msgstr ""
 
-#: editor_actions.cc:684 editor_audio_import.cc:282
-#: session_import_dialog.cc:75 session_import_dialog.cc:95
-#: session_metadata_dialog.cc:418 editor_videotimeline.cc:91
+#: editor_actions.cc:723
+msgid "Import PT session"
+msgstr ""
+
+#: editor_actions.cc:728 editor_audio_import.cc:282 editor_pt_import.cc:149
+#: luawindow.cc:99 session_import_dialog.cc:75 session_import_dialog.cc:95
+#: session_metadata_dialog.cc:421 sfdb_ui.cc:558 editor_videotimeline.cc:91
 msgid "Import"
 msgstr "Εισαγωγή"
 
-#: editor_actions.cc:687
+#: editor_actions.cc:731
 msgid "Import to Region List..."
 msgstr ""
 
-#: editor_actions.cc:690 session_import_dialog.cc:44
-msgid "Import From Session"
+#: editor_actions.cc:734 session_import_dialog.cc:44
+#: session_import_dialog.cc:65
+msgid "Import from Session"
 msgstr ""
 
-#: editor_actions.cc:694
+#: editor_actions.cc:738
 msgid "Bring all media into session folder"
 msgstr ""
 
-#: editor_actions.cc:697
+#: editor_actions.cc:741
 msgid "Show Summary"
 msgstr ""
 
-#: editor_actions.cc:699
+#: editor_actions.cc:743
 msgid "Show Group Tabs"
 msgstr ""
 
-#: editor_actions.cc:701
+#: editor_actions.cc:745
 msgid "Show Measure Lines"
 msgstr ""
 
-#: editor_actions.cc:705
-msgid "Show Logo"
-msgstr ""
-
-#: editor_actions.cc:709
+#: editor_actions.cc:747
 msgid "Toggle MIDI Input Active for Editor-Selected Tracks/Busses"
 msgstr ""
 
-#: editor_actions.cc:732
-msgid "Loaded editor bindings from %1"
-msgstr ""
-
-#: editor_actions.cc:734
-msgid "Could not find editor.bindings in search path %1"
-msgstr ""
-
-#: editor_actions.cc:1078 editor_actions.cc:1474 editor_actions.cc:1485
-#: editor_actions.cc:1538 editor_actions.cc:1549 editor_actions.cc:1596
-#: editor_actions.cc:1606 editor_regions.cc:1563
+#: editor_actions.cc:1081 editor_actions.cc:1477 editor_actions.cc:1488
+#: editor_actions.cc:1541 editor_actions.cc:1552 editor_actions.cc:1599
+#: editor_actions.cc:1609 editor_regions.cc:1657 luainstance.cc:327
+#: luainstance.cc:1690
 msgid "programming error: %1: %2"
 msgstr ""
 
-#: editor_actions.cc:1774
+#: editor_actions.cc:1791
 msgid "Raise"
 msgstr ""
 
-#: editor_actions.cc:1777
+#: editor_actions.cc:1794
 msgid "Raise to Top"
 msgstr ""
 
-#: editor_actions.cc:1780
+#: editor_actions.cc:1797
 msgid "Lower"
 msgstr "Κατώτερο"
 
-#: editor_actions.cc:1783
+#: editor_actions.cc:1800
 msgid "Lower to Bottom"
 msgstr ""
 
-#: editor_actions.cc:1786
+#: editor_actions.cc:1803
 msgid "Move to Original Position"
 msgstr ""
 
-#: editor_actions.cc:1791
+#: editor_actions.cc:1808
 msgid "Lock to Video"
 msgstr ""
 
-#: editor_actions.cc:1796 editor_markers.cc:912
+#: editor_actions.cc:1813 editor_markers.cc:917
 msgid "Glue to Bars and Beats"
 msgstr ""
 
-#: editor_actions.cc:1801
+#: editor_actions.cc:1818
 msgid "Remove Sync"
 msgstr ""
 
-#: editor_actions.cc:1804 mixer_strip.cc:2006 monitor_section.cc:272
-#: route_time_axis.cc:253 route_time_axis.cc:526
+#: editor_actions.cc:1821 mixer_strip.cc:2192 monitor_section.cc:253
+#: monitor_section.cc:321 route_time_axis.cc:264 route_time_axis.cc:550
 msgid "Mute"
 msgstr "Σιγή"
 
-#: editor_actions.cc:1807
+#: editor_actions.cc:1824
 msgid "Normalize..."
 msgstr ""
 
-#: editor_actions.cc:1810
+#: editor_actions.cc:1827
 msgid "Reverse"
 msgstr "Αντιστροφή"
 
-#: editor_actions.cc:1813
+#: editor_actions.cc:1830
 msgid "Make Mono Regions"
 msgstr ""
 
-#: editor_actions.cc:1816
+#: editor_actions.cc:1833
 msgid "Boost Gain"
 msgstr ""
 
-#: editor_actions.cc:1819
+#: editor_actions.cc:1836
 msgid "Cut Gain"
 msgstr ""
 
-#: editor_actions.cc:1822
+#: editor_actions.cc:1839
 msgid "Pitch Shift..."
 msgstr ""
 
-#: editor_actions.cc:1825
-msgid "Transpose..."
-msgstr ""
-
-#: editor_actions.cc:1828
+#: editor_actions.cc:1845
 msgid "Opaque"
 msgstr ""
 
-#: editor_actions.cc:1832 editor_regions.cc:117
+#: editor_actions.cc:1849 editor_regions.cc:164
 msgid "Fade In"
 msgstr "Fade In"
 
-#: editor_actions.cc:1837 editor_regions.cc:118
+#: editor_actions.cc:1854 editor_regions.cc:165
 msgid "Fade Out"
 msgstr "Fade Out"
 
-#: editor_actions.cc:1852
+#: editor_actions.cc:1869
 msgid "Multi-Duplicate..."
 msgstr ""
 
-#: editor_actions.cc:1857
+#: editor_actions.cc:1874
 msgid "Fill Track"
 msgstr "Γόμωση καναλιού"
 
-#: editor_actions.cc:1861 editor_markers.cc:1000
+#: editor_actions.cc:1878 editor_markers.cc:1033
 msgid "Set Loop Range"
 msgstr "Θέση Loop Διαστήματος"
 
-#: editor_actions.cc:1868
+#: editor_actions.cc:1885
 msgid "Set Punch"
 msgstr ""
 
-#: editor_actions.cc:1872
+#: editor_actions.cc:1889
 msgid "Add Single Range Marker"
 msgstr ""
 
-#: editor_actions.cc:1877
+#: editor_actions.cc:1894
 msgid "Add Range Marker Per Region"
 msgstr ""
 
-#: editor_actions.cc:1881
-msgid "Snap Position To Grid"
+#: editor_actions.cc:1898
+msgid "Snap Position to Grid"
 msgstr ""
 
-#: editor_actions.cc:1884
+#: editor_actions.cc:1901
 msgid "Close Gaps"
 msgstr ""
 
-#: editor_actions.cc:1887
+#: editor_actions.cc:1904
 msgid "Rhythm Ferret..."
 msgstr ""
 
-#: editor_actions.cc:1890
+#: editor_actions.cc:1907
 msgid "Export..."
 msgstr ""
 
-#: editor_actions.cc:1896
+#: editor_actions.cc:1913
 msgid "Separate Under"
 msgstr ""
 
-#: editor_actions.cc:1900 editor_actions.cc:1901
+#: editor_actions.cc:1917 editor_actions.cc:1918
 msgid "Set Fade In Length"
 msgstr ""
 
-#: editor_actions.cc:1902 editor_actions.cc:1903
+#: editor_actions.cc:1919 editor_actions.cc:1920
 msgid "Set Fade Out Length"
 msgstr ""
 
-#: editor_actions.cc:1905
+#: editor_actions.cc:1922
 msgid "Set Tempo from Region = Bar"
 msgstr ""
 
-#: editor_actions.cc:1910
+#: editor_actions.cc:1927
 msgid "Split at Percussion Onsets"
 msgstr ""
 
-#: editor_actions.cc:1915
+#: editor_actions.cc:1932
 msgid "List Editor..."
 msgstr ""
 
-#: editor_actions.cc:1918
+#: editor_actions.cc:1935
 msgid "Properties..."
 msgstr ""
 
-#: editor_actions.cc:1922
+#: editor_actions.cc:1939
 msgid "Bounce (with processing)"
 msgstr ""
 
-#: editor_actions.cc:1923
+#: editor_actions.cc:1940
 msgid "Bounce (without processing)"
 msgstr ""
 
-#: editor_actions.cc:1924
+#: editor_actions.cc:1941
 msgid "Combine"
 msgstr ""
 
-#: editor_actions.cc:1925
+#: editor_actions.cc:1942
 msgid "Uncombine"
 msgstr ""
 
-#: editor_actions.cc:1927
+#: editor_actions.cc:1944
+msgid "Loudness Analysis..."
+msgstr ""
+
+#: editor_actions.cc:1945
 msgid "Spectral Analysis..."
 msgstr ""
 
-#: editor_actions.cc:1929
+#: editor_actions.cc:1947
 msgid "Reset Envelope"
 msgstr ""
 
-#: editor_actions.cc:1931
+#: editor_actions.cc:1949
 msgid "Reset Gain"
 msgstr ""
 
-#: editor_actions.cc:1936
+#: editor_actions.cc:1954
 msgid "Envelope Active"
 msgstr ""
 
-#: editor_actions.cc:1944 editor_actions.cc:1945
+#: editor_actions.cc:1962 editor_actions.cc:1963
 msgid "Insert Patch Change..."
 msgstr ""
 
-#: editor_actions.cc:1946
+#: editor_actions.cc:1964
 msgid "Unlink from other copies"
 msgstr ""
 
-#: editor_actions.cc:1947
+#: editor_actions.cc:1965
 msgid "Strip Silence..."
 msgstr ""
 
-#: editor_actions.cc:1948
+#: editor_actions.cc:1966
 msgid "Set Range Selection"
 msgstr ""
 
-#: editor_actions.cc:1950 editor_actions.cc:1951
+#: editor_actions.cc:1968 editor_actions.cc:1969
 msgid "Nudge Later"
 msgstr ""
 
-#: editor_actions.cc:1952 editor_actions.cc:1953
+#: editor_actions.cc:1970 editor_actions.cc:1971
 msgid "Nudge Earlier"
 msgstr ""
 
-#: editor_actions.cc:1955
+#: editor_actions.cc:1973
 msgid "Sequence Regions"
 msgstr ""
 
-#: editor_actions.cc:1960
+#: editor_actions.cc:1978
 msgid "Nudge Later by Capture Offset"
 msgstr ""
 
-#: editor_actions.cc:1967
+#: editor_actions.cc:1985
 msgid "Nudge Earlier by Capture Offset"
 msgstr ""
 
-#: editor_actions.cc:1971
+#: editor_actions.cc:1989
 msgid "Trim to Loop"
 msgstr ""
 
-#: editor_actions.cc:1972
+#: editor_actions.cc:1990
 msgid "Trim to Punch"
 msgstr ""
 
-#: editor_actions.cc:1974
+#: editor_actions.cc:1992
 msgid "Trim to Previous"
 msgstr ""
 
-#: editor_actions.cc:1975
+#: editor_actions.cc:1993
 msgid "Trim to Next"
 msgstr ""
 
-#: editor_actions.cc:1982
-msgid "Insert Region From Region List"
+#: editor_actions.cc:2000
+msgid "Insert Region from Region List"
 msgstr ""
 
-#: editor_actions.cc:1988
+#: editor_actions.cc:2006
 msgid "Set Sync Position"
 msgstr ""
 
-#: editor_actions.cc:1989
+#: editor_actions.cc:2007
 msgid "Place Transient"
 msgstr ""
 
-#: editor_actions.cc:1990
+#: editor_actions.cc:2008
 msgid "Split/Separate"
 msgstr ""
 
-#: editor_actions.cc:1991
+#: editor_actions.cc:2009
 msgid "Trim Start at Edit Point"
 msgstr ""
 
-#: editor_actions.cc:1992
+#: editor_actions.cc:2010
 msgid "Trim End at Edit Point"
 msgstr ""
 
-#: editor_actions.cc:1997
+#: editor_actions.cc:2015
 msgid "Align Start"
 msgstr ""
 
-#: editor_actions.cc:2004
+#: editor_actions.cc:2022
 msgid "Align Start Relative"
 msgstr ""
 
-#: editor_actions.cc:2008
+#: editor_actions.cc:2026
 msgid "Align End"
 msgstr ""
 
-#: editor_actions.cc:2013
+#: editor_actions.cc:2031
 msgid "Align End Relative"
 msgstr ""
 
-#: editor_actions.cc:2020
+#: editor_actions.cc:2038
 msgid "Align Sync"
 msgstr ""
 
-#: editor_actions.cc:2027
+#: editor_actions.cc:2045
 msgid "Align Sync Relative"
 msgstr ""
 
-#: editor_actions.cc:2031 editor_actions.cc:2034
+#: editor_actions.cc:2049 editor_actions.cc:2050
 msgid "Choose Top..."
 msgstr ""
 
@@ -4448,32 +5005,33 @@ msgid ""
 "%2 as a new source, or skip it?"
 msgstr ""
 
-#: editor_audio_import.cc:282 editor_videotimeline.cc:91
+#: editor_audio_import.cc:282 editor_pt_import.cc:149
+#: editor_videotimeline.cc:91
 msgid "Cancel Import"
 msgstr "Ακύρωση Εισαγωγής"
 
-#: editor_audio_import.cc:559
+#: editor_audio_import.cc:565
 msgid "Editor: cannot open file \"%1\", (%2)"
 msgstr "Editor: δεν γίνεται να ανοίξει το αρχείο \"%1\",(%2)"
 
-#: editor_audio_import.cc:567
+#: editor_audio_import.cc:573
 msgid "Cancel entire import"
 msgstr "Ακύρωση όλης της Εισαγωγής"
 
-#: editor_audio_import.cc:568
+#: editor_audio_import.cc:574
 msgid "Don't embed it"
 msgstr "Μη το εμφυτεύσεις"
 
-#: editor_audio_import.cc:569
+#: editor_audio_import.cc:575
 msgid "Embed all without questions"
 msgstr ""
 
-#: editor_audio_import.cc:572 editor_audio_import.cc:598
-#: export_format_dialog.cc:60
+#: editor_audio_import.cc:578 editor_audio_import.cc:604
+#: export_format_dialog.cc:68
 msgid "Sample rate"
 msgstr ""
 
-#: editor_audio_import.cc:573 editor_audio_import.cc:599
+#: editor_audio_import.cc:579 editor_audio_import.cc:605
 msgid ""
 "%1\n"
 "This audiofile's sample rate doesn't match the session sample rate!"
@@ -4482,209 +5040,278 @@ msgstr ""
 "Ο ρυθμός δειγματοληψίας αυτού του αρχείου δεν ταιριάζει με αυτόν της "
 "συνεδρίας!"
 
-#: editor_audio_import.cc:595
+#: editor_audio_import.cc:601
 msgid "Embed it anyway"
 msgstr "Εμφύτευσέ το ούτως ή άλλως"
 
-#: editor_canvas_events.cc:1306 editor_drag.cc:1381
+#: editor_pt_import.cc:81
+msgid "You can't import a PT session until you have a session loaded."
+msgstr ""
+
+#: editor_pt_import.cc:86
+msgid "Import PT Session"
+msgstr ""
+
+#: editor_pt_import.cc:97
+msgid "%1: this is only the directory/folder name, not the filename.\n"
+msgstr ""
+
+#: editor_pt_import.cc:132
+msgid "Doesn't seem to be a valid PT session file"
+msgstr ""
+
+#: editor_pt_import.cc:136
+msgid ""
+"PT v%1 Session @ %2Hz\n"
+"\n"
+"%3 audio files\n"
+"%4 regions\n"
+"%5 active regions\n"
+"\n"
+"Continue..."
+msgstr ""
+
+#: editor_pt_import.cc:175
+msgid ""
+"Failed to load one or more of the audio files, but continuing to attempt "
+"import."
+msgstr ""
+
+#: editor_pt_import.cc:178
+msgid "Success! Import should complete soon."
+msgstr ""
+
+#: editor_pt_import.cc:263
+msgid "PTImport: UINT_MAX routes? impossible!"
+msgstr ""
+
+#: editor_canvas_events.cc:1296 editor_drag.cc:1418
 msgid "Could not create new track after region placed in the drop zone"
 msgstr ""
 
-#: editor_drag.cc:1266
+#: editor_drag.cc:1306
 msgid "fixed time region drag"
 msgstr ""
 
-#: editor_drag.cc:2214
+#: editor_drag.cc:2249
 msgid "Ripple drag"
 msgstr ""
 
-#: editor_drag.cc:2365 midi_region_view.cc:2813
+#: editor_drag.cc:2311
+msgid "create region"
+msgstr ""
+
+#: editor_drag.cc:2430 midi_region_view.cc:2859
 msgid "resize notes"
 msgstr ""
 
-#: editor_drag.cc:2517
+#: editor_drag.cc:2613 editor_drag.cc:2648
+msgid ""
+"One or more Audio Regions\n"
+"are both Locked and\n"
+"Locked to Video.\n"
+"The video cannot me moved."
+msgstr ""
+
+#: editor_drag.cc:2683
 msgid "Video Start:"
 msgstr ""
 
-#: editor_drag.cc:2519
+#: editor_drag.cc:2685
 msgid "Diff:"
 msgstr ""
 
-#: editor_drag.cc:2538
+#: editor_drag.cc:2707
 msgid "Move Video"
 msgstr ""
 
-#: editor_drag.cc:3046
+#: editor_drag.cc:3177
+msgid "move meter mark"
+msgstr "μετακίνηση στίγματος μετρητή"
+
+#: editor_drag.cc:3179
 msgid "copy meter mark"
 msgstr "αντιγραφή στίγματος μετρητή"
 
-#: editor_drag.cc:3054
-msgid "move meter mark"
-msgstr "μετακίνηση στίγματος μετρητή"
+#: editor_drag.cc:3279
+msgid "inactive"
+msgstr ""
 
-#: editor_drag.cc:3177
+#: editor_drag.cc:3324
+msgid "move tempo mark"
+msgstr "μετακίνηση στίγματος tempo"
+
+#: editor_drag.cc:3331
 msgid "copy tempo mark"
 msgstr "αντιγραφή στίγματος tempo"
 
-#: editor_drag.cc:3185
-msgid "move tempo mark"
-msgstr "μετακίνηση στίγματος tempo"
+#: editor_drag.cc:3462
+msgid "dilate tempo"
+msgstr ""
 
-#: editor_drag.cc:3412
+#: editor_drag.cc:3736
 msgid "change fade in length"
 msgstr "αλλαγή μήκους fade in"
 
-#: editor_drag.cc:3526
+#: editor_drag.cc:3861
 msgid "change fade out length"
 msgstr "αλλαγή μήκους fade out"
 
-#: editor_drag.cc:3880
+#: editor_drag.cc:4239
 msgid "move marker"
 msgstr "μετακίνηση στίγματος"
 
-#: editor_drag.cc:4490
+#: editor_drag.cc:4506 editor_drag.cc:5833
+msgid "automation range move"
+msgstr ""
+
+#: editor_drag.cc:4890
 msgid "An error occurred while executing time stretch operation"
 msgstr ""
 
-#: editor_drag.cc:4947
+#: editor_drag.cc:5351
 msgid "programming_error: %1"
 msgstr ""
 
-#: editor_drag.cc:5016 editor_drag.cc:5026
+#: editor_drag.cc:5420 editor_drag.cc:5430
 msgid "new skip marker"
 msgstr ""
 
-#: editor_drag.cc:5017
+#: editor_drag.cc:5421
 msgid "skip"
 msgstr ""
 
-#: editor_drag.cc:5021 location_ui.cc:56
+#: editor_drag.cc:5425 location_ui.cc:60
 msgid "CD"
 msgstr "CD"
 
-#: editor_drag.cc:5022
+#: editor_drag.cc:5426
 msgid "new CD marker"
 msgstr ""
 
-#: editor_drag.cc:5027 editor_route_groups.cc:437 mixer_ui.cc:1493
+#: editor_drag.cc:5431 editor_route_groups.cc:439 mixer_ui.cc:1840
 msgid "unnamed"
 msgstr "Χωρίς όνομα"
 
-#: editor_drag.cc:5309
+#: editor_drag.cc:5740
 msgid "Automation range drag created for invalid region type"
 msgstr ""
 
-#: editor_route_groups.cc:96
+#: editor_route_groups.cc:97
 msgid "Col"
 msgstr ""
 
-#: editor_route_groups.cc:96
+#: editor_route_groups.cc:97
 msgid "Group Tab Color"
 msgstr ""
 
-#: editor_route_groups.cc:97
+#: editor_route_groups.cc:98
 msgid "Name of Group"
 msgstr ""
 
-#: editor_route_groups.cc:98 editor_routes.cc:207
-msgid "V"
+#: editor_route_groups.cc:99 editor_routes.cc:234
+msgid "Visible|V"
 msgstr ""
 
-#: editor_route_groups.cc:98
+#: editor_route_groups.cc:99
 msgid "Group is visible?"
 msgstr ""
 
-#: editor_route_groups.cc:99
+#: editor_route_groups.cc:100
 msgid "On"
 msgstr ""
 
-#: editor_route_groups.cc:99
+#: editor_route_groups.cc:100
 msgid "Group is enabled?"
 msgstr ""
 
-#: editor_route_groups.cc:100
-msgid "group|G"
+#: editor_route_groups.cc:101
+msgid "Group|G"
 msgstr ""
 
-#: editor_route_groups.cc:100
+#: editor_route_groups.cc:101
 msgid "Sharing Gain?"
 msgstr ""
 
-#: editor_route_groups.cc:101
-msgid "relative|Rel"
+#: editor_route_groups.cc:102
+msgid "Relative|Rel"
 msgstr ""
 
-#: editor_route_groups.cc:101
+#: editor_route_groups.cc:102
 msgid "Relative Gain Changes?"
 msgstr ""
 
-#: editor_route_groups.cc:102
-msgid "mute|M"
+#: editor_route_groups.cc:103 editor_regions.cc:168 editor_routes.cc:239
+#: mixer_strip.cc:2221 meter_strip.cc:365 route_time_axis.cc:2742
+#: time_axis_view.cc:1106
+msgid "Mute|M"
 msgstr ""
 
-#: editor_route_groups.cc:102
+#: editor_route_groups.cc:103
 msgid "Sharing Mute?"
 msgstr ""
 
-#: editor_route_groups.cc:103
-msgid "solo|S"
+#: editor_route_groups.cc:104 editor_routes.cc:240 mixer_strip.cc:2234
+#: meter_strip.cc:373 route_time_axis.cc:2739 vca_master_strip.cc:211
+#: vca_time_axis.cc:236
+msgid "Solo|S"
 msgstr ""
 
-#: editor_route_groups.cc:103
+#: editor_route_groups.cc:104
 msgid "Sharing Solo?"
 msgstr ""
 
-#: editor_route_groups.cc:104 midi_time_axis.cc:1622 midi_time_axis.cc:1625
-#: midi_time_axis.cc:1628
+#: editor_route_groups.cc:105 midi_time_axis.cc:1626 midi_time_axis.cc:1629
+#: midi_time_axis.cc:1632
 msgid "Rec"
 msgstr ""
 
-#: editor_route_groups.cc:104
+#: editor_route_groups.cc:105
 msgid "Sharing Record-enable Status?"
 msgstr ""
 
-#: editor_route_groups.cc:105
-msgid "monitoring|Mon"
+#: editor_route_groups.cc:106
+msgid "Monitoring|Mon"
 msgstr ""
 
-#: editor_route_groups.cc:105
+#: editor_route_groups.cc:106
 msgid "Sharing Monitoring Choice?"
 msgstr ""
 
-#: editor_route_groups.cc:106
-msgid "selection|Sel"
+#: editor_route_groups.cc:107
+msgid "Selection|Sel"
 msgstr ""
 
-#: editor_route_groups.cc:106
+#: editor_route_groups.cc:107
 msgid "Sharing Selected/Editing Status?"
 msgstr ""
 
-#: editor_route_groups.cc:107
-msgid "active|A"
+#: editor_route_groups.cc:108 editor_routes.cc:235
+msgid "Active|A"
 msgstr ""
 
-#: editor_route_groups.cc:107
+#: editor_route_groups.cc:108
 msgid "Sharing Active Status?"
 msgstr ""
 
-#: editor_export_audio.cc:92 editor_markers.cc:740 editor_markers.cc:827
-#: editor_markers.cc:1012 editor_markers.cc:1030 editor_markers.cc:1048
-#: editor_markers.cc:1067 editor_markers.cc:1086 editor_markers.cc:1116
-#: editor_markers.cc:1147 editor_markers.cc:1177 editor_markers.cc:1205
-#: editor_markers.cc:1236 editor_markers.cc:1261 editor_markers.cc:1312
-#: editor_markers.cc:1356 editor_markers.cc:1382 editor_markers.cc:1576
-#: editor_mouse.cc:2120
+#: editor_export_audio.cc:93 editor_markers.cc:733 editor_markers.cc:832
+#: editor_markers.cc:1045 editor_markers.cc:1063 editor_markers.cc:1081
+#: editor_markers.cc:1100 editor_markers.cc:1119 editor_markers.cc:1149
+#: editor_markers.cc:1180 editor_markers.cc:1210 editor_markers.cc:1238
+#: editor_markers.cc:1269 editor_markers.cc:1294 editor_markers.cc:1345
+#: editor_markers.cc:1458 editor_markers.cc:1484 editor_markers.cc:1678
+#: editor_mouse.cc:2255
 msgid "programming error: marker canvas item has no marker object pointer!"
 msgstr ""
 "Σφάλμα προγραμματισμού: ο καμβάς στιγμάτων δεν έχει δείκτη αντικειμένου "
 "στιγμάτων!"
 
-#: editor_export_audio.cc:145 editor_export_audio.cc:150
-msgid "File Exists!"
+#: editor_export_audio.cc:114
+msgid "Confirm MIDI File Overwrite"
 msgstr ""
 
-#: editor_export_audio.cc:153
-msgid "Overwrite Existing File"
+#: editor_export_audio.cc:115 utils_videotl.cc:73
+msgid "A file with the same name already exists. Do you want to overwrite it?"
 msgstr ""
 
 #: editor_group_tabs.cc:176
@@ -4699,130 +5326,163 @@ msgstr ""
 msgid "end"
 msgstr ""
 
-#: editor_markers.cc:657 editor_ops.cc:2085 editor_ops.cc:2107
-#: editor_ops.cc:2164 editor_ops.cc:2193 location_ui.cc:1023
+#: editor_markers.cc:645
+msgid "mark"
+msgstr ""
+
+#: editor_markers.cc:650 editor_ops.cc:2164 editor_ops.cc:2186
+#: editor_ops.cc:2304 editor_ops.cc:2341 location_ui.cc:1049
 msgid "add marker"
 msgstr "πρόσθεση στίγματος"
 
-#: editor_markers.cc:689 editor_markers.cc:1456
+#: editor_markers.cc:682 editor_markers.cc:1558
 msgid "set loop range"
 msgstr "Θέση loop διαστήματος"
 
-#: editor_markers.cc:705 editor_markers.cc:1462
+#: editor_markers.cc:698 editor_markers.cc:1564
 msgid "set punch range"
 msgstr "θέση punch διαστήματος"
 
-#: editor_markers.cc:722 editor_ops.cc:4055
+#: editor_markers.cc:715 editor_ops.cc:4159
 msgid "range"
 msgstr ""
 
-#: editor_markers.cc:725
+#: editor_markers.cc:718
 msgid "new range marker"
 msgstr "νέο στίγμα διαστήματος"
 
-#: editor_markers.cc:758 editor_ops.cc:2129 location_ui.cc:859
+#: editor_markers.cc:751 editor_ops.cc:2272 location_ui.cc:885
 msgid "remove marker"
 msgstr "απαλοιφή στίγματος"
 
-#: editor_markers.cc:894
+#: editor_markers.cc:899
 msgid "Locate to Here"
 msgstr ""
 
-#: editor_markers.cc:895
+#: editor_markers.cc:900
 msgid "Play from Here"
 msgstr ""
 
-#: editor_markers.cc:896
+#: editor_markers.cc:901
 msgid "Move Mark to Playhead"
 msgstr ""
 
-#: editor_markers.cc:900
+#: editor_markers.cc:905
 msgid "Create Range to Next Marker"
 msgstr ""
 
-#: editor_markers.cc:941
+#: editor_markers.cc:946
 msgid "Locate to Marker"
 msgstr ""
 
-#: editor_markers.cc:942
+#: editor_markers.cc:947
 msgid "Play from Marker"
 msgstr ""
 
-#: editor_markers.cc:945
+#: editor_markers.cc:950
 msgid "Set Marker from Playhead"
 msgstr ""
 
-#: editor_markers.cc:947
+#: editor_markers.cc:951
 msgid "Set Range from Selection"
 msgstr ""
 
-#: editor_markers.cc:957
+#: editor_markers.cc:960
 msgid "Hide Range"
 msgstr "Απόκρυψη Διαστήματος"
 
-#: editor_markers.cc:958
+#: editor_markers.cc:961
 msgid "Rename Range..."
 msgstr ""
 
-#: editor_markers.cc:962
+#: editor_markers.cc:965
 msgid "Remove Range"
 msgstr "Απαλοιφή Διαστήματος"
 
-#: editor_markers.cc:969
+#: editor_markers.cc:972
 msgid "Separate Regions in Range"
 msgstr "Διαχωρισμός περιοχών στο διάστημα"
 
-#: editor_markers.cc:972
+#: editor_markers.cc:974
 msgid "Select Range"
 msgstr ""
 
-#: editor_markers.cc:1001
+#: editor_markers.cc:987
+msgid "Make Ramped"
+msgstr ""
+
+#: editor_markers.cc:989
+msgid "Make Constant"
+msgstr ""
+
+#: editor_markers.cc:993 editor_markers.cc:1013
+msgid "Lock to Music"
+msgstr ""
+
+#: editor_markers.cc:995 editor_markers.cc:1015
+msgid "Lock to Audio"
+msgstr ""
+
+#: editor_markers.cc:1034
 msgid "Set Punch Range"
 msgstr "Θέση Punch Διαστήματος"
 
-#: editor_markers.cc:1407 editor_ops.cc:2040
+#: editor_markers.cc:1391
+msgid "change meter lock style"
+msgstr ""
+
+#: editor_markers.cc:1414
+msgid "change tempo lock style"
+msgstr ""
+
+#: editor_markers.cc:1441
+msgid "change tempo type"
+msgstr ""
+
+#: editor_markers.cc:1509 editor_ops.cc:2119
 msgid "New Name:"
 msgstr ""
 
-#: editor_markers.cc:1410
+#: editor_markers.cc:1512
 msgid "Rename Mark"
 msgstr "Μετονομασία Στίγματος"
 
-#: editor_markers.cc:1412
+#: editor_markers.cc:1514
 msgid "Rename Range"
 msgstr "Μετονομασία Διαστήματος"
 
-#: editor_markers.cc:1419 editor_mouse.cc:2137 processor_box.cc:1994
-#: processor_box.cc:2464 route_time_axis.cc:1100 route_ui.cc:1628
+#: editor_markers.cc:1521 editor_mouse.cc:2272 processor_box.cc:3192
+#: processor_box.cc:3681 route_time_axis.cc:1110 route_ui.cc:1637
+#: vca_master_strip.cc:395
 msgid "Rename"
 msgstr "Μετονομασία"
 
-#: editor_markers.cc:1432
+#: editor_markers.cc:1534
 msgid "rename marker"
 msgstr "μετονομασία στίγματος"
 
-#: editor_mixer.cc:90
+#: editor_mixer.cc:98
 msgid "This screen is not tall enough to display the editor mixer"
 msgstr ""
 
-#: editor_mouse.cc:1223 editor_mouse.cc:1241 editor_tempodisplay.cc:270
+#: editor_mouse.cc:1345 editor_mouse.cc:1363 editor_tempodisplay.cc:384
 msgid ""
 "programming error: tempo marker canvas item has no marker object pointer!"
 msgstr ""
 "σφάλμα προγραμματισμού: ο καμβάς στίξης του tempo δεν έχει δείκτη "
 "αντικειμένου στιγμάτων!"
 
-#: editor_mouse.cc:1228 editor_tempodisplay.cc:275
+#: editor_mouse.cc:1350 editor_tempodisplay.cc:389
 msgid "programming error: marker for tempo is not a tempo marker!"
 msgstr ""
 "σφάλμα προγραμματισμού: το στίγμα για το  tempo δεν είναι στιγμα για tempo!"
 
-#: editor_mouse.cc:1246 editor_tempodisplay.cc:375
+#: editor_mouse.cc:1368 editor_tempodisplay.cc:507
 msgid "programming error: marker for meter is not a meter marker!"
 msgstr ""
 "Σφάλμα προγραμματισμού: το στίγμα για το μέτρο δεν είναι στίγμα μέτρου!"
 
-#: editor_mouse.cc:1885 editor_mouse.cc:1910 editor_mouse.cc:1923
+#: editor_mouse.cc:2016 editor_mouse.cc:2041 editor_mouse.cc:2054
 msgid ""
 "programming error: control point canvas item has no control point object "
 "pointer!"
@@ -4830,175 +5490,183 @@ msgstr ""
 "Σφάλμα Προγραμματισμού: ο καμβάς του σημείου ελέγχου δεν έχει  δείκτη "
 "αναφοράς!"
 
-#: editor_mouse.cc:2058
+#: editor_mouse.cc:2085
+msgid "edit note(s)"
+msgstr ""
+
+#: editor_mouse.cc:2193
 msgid "start point trim"
 msgstr ""
 
-#: editor_mouse.cc:2083
-msgid "End point trim"
-msgstr "Τέλος σημείου ισοσταθμίσεως"
+#: editor_mouse.cc:2218
+msgid "end point trim"
+msgstr ""
 
-#: editor_mouse.cc:2135
+#: editor_mouse.cc:2270
 msgid "Name for region:"
 msgstr "Όνομα για περιοχή:"
 
-#: editor_ops.cc:165
+#: editor_ops.cc:168
 msgid "split"
 msgstr "διαχωρισμός"
 
-#: editor_ops.cc:339
+#: editor_ops.cc:342
 msgid "alter selection"
 msgstr ""
 
-#: editor_ops.cc:381
+#: editor_ops.cc:384
 msgid "nudge regions forward"
 msgstr ""
 
-#: editor_ops.cc:404 editor_ops.cc:489
+#: editor_ops.cc:441 editor_ops.cc:535
 msgid "nudge location forward"
 msgstr ""
 
-#: editor_ops.cc:462
+#: editor_ops.cc:472
 msgid "nudge regions backward"
 msgstr ""
 
-#: editor_ops.cc:551
+#: editor_ops.cc:567
 msgid "nudge forward"
 msgstr "νύξη εμπρός"
 
-#: editor_ops.cc:575
+#: editor_ops.cc:591
 msgid "nudge backward"
 msgstr ""
 
-#: editor_ops.cc:618
+#: editor_ops.cc:656
 msgid "sequence regions"
 msgstr ""
 
-#: editor_ops.cc:694
+#: editor_ops.cc:718
 msgid "build_region_boundary_cache called with snap_type = %1"
 msgstr "build_region_boundary_cache εκλήθη με snap_type = %1"
 
-#: editor_ops.cc:2042
+#: editor_ops.cc:2121
 msgid "New Location Marker"
 msgstr ""
 
-#: editor_ops.cc:2164
+#: editor_ops.cc:2212 editor_ops.cc:2236
+msgid "Set session start"
+msgstr ""
+
+#: editor_ops.cc:2304
 msgid "add markers"
 msgstr ""
 
-#: editor_ops.cc:2274
+#: editor_ops.cc:2400
 msgid "clear markers"
 msgstr "εκκαθάριση στιγμάτων"
 
-#: editor_ops.cc:2289
+#: editor_ops.cc:2415
 msgid "clear ranges"
 msgstr "διαγραφή διαστημάτων"
 
-#: editor_ops.cc:2305
+#: editor_ops.cc:2431
 msgid "clear locations"
 msgstr "διαγραφή τοποθεσιών"
 
-#: editor_ops.cc:2368
+#: editor_ops.cc:2494
 msgid "insert region"
 msgstr "προσθήκη περιοχής"
 
-#: editor_ops.cc:2559
+#: editor_ops.cc:2685
 msgid "raise regions"
 msgstr ""
 
-#: editor_ops.cc:2561
+#: editor_ops.cc:2687
 msgid "raise region"
 msgstr ""
 
-#: editor_ops.cc:2567
+#: editor_ops.cc:2693
 msgid "raise regions to top"
 msgstr ""
 
-#: editor_ops.cc:2569
+#: editor_ops.cc:2695
 msgid "raise region to top"
 msgstr ""
 
-#: editor_ops.cc:2575
+#: editor_ops.cc:2701
 msgid "lower regions"
 msgstr ""
 
-#: editor_ops.cc:2577 editor_ops.cc:2585
+#: editor_ops.cc:2703 editor_ops.cc:2711
 msgid "lower region"
 msgstr ""
 
-#: editor_ops.cc:2583
+#: editor_ops.cc:2709
 msgid "lower regions to bottom"
 msgstr ""
 
-#: editor_ops.cc:2668
+#: editor_ops.cc:2794
 msgid "Rename Region"
 msgstr ""
 
-#: editor_ops.cc:2670 processor_box.cc:1992 route_ui.cc:1626
+#: editor_ops.cc:2796 processor_box.cc:3190 route_ui.cc:1635
 msgid "New name:"
 msgstr ""
 
-#: editor_ops.cc:2987
+#: editor_ops.cc:3097
 msgid "separate"
 msgstr "διαχωρισμός"
 
-#: editor_ops.cc:3099
+#: editor_ops.cc:3207
 msgid "separate region under"
 msgstr ""
 
-#: editor_ops.cc:3220
+#: editor_ops.cc:3360
 msgid "trim to selection"
 msgstr "ισοστάθμιση προς τα επιλεγμένα"
 
-#: editor_ops.cc:3356
+#: editor_ops.cc:3442
 msgid "set sync point"
 msgstr ""
 
-#: editor_ops.cc:3380
+#: editor_ops.cc:3466
 msgid "remove region sync"
 msgstr ""
 
-#: editor_ops.cc:3402
+#: editor_ops.cc:3488
 msgid "move regions to original position"
 msgstr ""
 
-#: editor_ops.cc:3404
+#: editor_ops.cc:3490
 msgid "move region to original position"
 msgstr ""
 
-#: editor_ops.cc:3425
+#: editor_ops.cc:3511
 msgid "align selection"
 msgstr "ευθυγράμμιση επιλογής"
 
-#: editor_ops.cc:3499
+#: editor_ops.cc:3585
 msgid "align selection (relative)"
 msgstr "ευθυγράμμιση επιλογής (σχετική)"
 
-#: editor_ops.cc:3533
+#: editor_ops.cc:3619
 msgid "align region"
 msgstr "ευθυγράμμιση περιοχής"
 
-#: editor_ops.cc:3584
+#: editor_ops.cc:3670
 msgid "trim front"
 msgstr ""
 
-#: editor_ops.cc:3584
+#: editor_ops.cc:3670
 msgid "trim back"
 msgstr ""
 
-#: editor_ops.cc:3614
+#: editor_ops.cc:3700
 msgid "trim to loop"
 msgstr ""
 
-#: editor_ops.cc:3624
+#: editor_ops.cc:3710
 msgid "trim to punch"
 msgstr ""
 
-#: editor_ops.cc:3686
+#: editor_ops.cc:3832
 msgid "trim to region"
 msgstr ""
 
-#: editor_ops.cc:3794
+#: editor_ops.cc:3891
 msgid ""
 "This track/bus cannot be frozen because the signal adds or loses channels "
 "before reaching the outputs.\n"
@@ -5006,11 +5674,11 @@ msgid ""
 "input or vice versa."
 msgstr ""
 
-#: editor_ops.cc:3797
+#: editor_ops.cc:3894
 msgid "Cannot freeze"
 msgstr ""
 
-#: editor_ops.cc:3803
+#: editor_ops.cc:3900
 msgid ""
 "<b>%1</b>\n"
 "\n"
@@ -5019,23 +5687,23 @@ msgid ""
 "Freezing will only process the signal as far as the first send/insert/return."
 msgstr ""
 
-#: editor_ops.cc:3807
+#: editor_ops.cc:3904
 msgid "Freeze anyway"
 msgstr ""
 
-#: editor_ops.cc:3808
+#: editor_ops.cc:3905
 msgid "Don't freeze"
 msgstr ""
 
-#: editor_ops.cc:3809
+#: editor_ops.cc:3906
 msgid "Freeze Limits"
 msgstr ""
 
-#: editor_ops.cc:3824
+#: editor_ops.cc:3921
 msgid "Cancel Freeze"
 msgstr "Ακύρωση παγώματος"
 
-#: editor_ops.cc:3854
+#: editor_ops.cc:3952
 msgid ""
 "You can't perform this operation because the processing of the signal will "
 "cause one or more of the tracks to end up with a region with more channels "
@@ -5044,47 +5712,47 @@ msgid ""
 "You can do this without processing, which is a different operation."
 msgstr ""
 
-#: editor_ops.cc:3858
+#: editor_ops.cc:3956
 msgid "Cannot bounce"
 msgstr ""
 
-#: editor_ops.cc:3869
+#: editor_ops.cc:4007
 msgid "bounce range"
 msgstr "αναπήδηση διαστήματο"
 
-#: editor_ops.cc:3971
+#: editor_ops.cc:4074
 msgid "delete"
 msgstr ""
 
-#: editor_ops.cc:3974
+#: editor_ops.cc:4077
 msgid "cut"
 msgstr "κοπή"
 
-#: editor_ops.cc:3977
+#: editor_ops.cc:4080
 msgid "copy"
 msgstr "αντιγραφή"
 
-#: editor_ops.cc:3980
+#: editor_ops.cc:4083
 msgid "clear"
 msgstr "εκκαθάριση"
 
-#: editor_ops.cc:4028
+#: editor_ops.cc:4132
 msgid "objects"
 msgstr ""
 
-#: editor_ops.cc:4238 editor_ops.cc:4270
+#: editor_ops.cc:4342 editor_ops.cc:4427
 msgid "remove region"
 msgstr "απαλοιφή περιοχής"
 
-#: editor_ops.cc:4719
-msgid "duplicate selection"
-msgstr "αντιγραφή επιλογής"
+#: editor_ops.cc:4844
+msgid "duplicate range selection"
+msgstr ""
 
-#: editor_ops.cc:4803
+#: editor_ops.cc:4938
 msgid "nudge track"
 msgstr "νύξη καναλιού"
 
-#: editor_ops.cc:4840
+#: editor_ops.cc:4965
 msgid ""
 "Do you really want to destroy the last capture?\n"
 "(This is destructive and cannot be undone)"
@@ -5092,136 +5760,156 @@ msgstr ""
 "Στ'αλήθεια θέλετε να καταστρέψετε την τελευταία λήψη?\n"
 "(Η πράξη είνα‎ι καταστρεπτική και δεν γίνεται επαναφορά της)"
 
-#: editor_ops.cc:4843 editor_ops.cc:6838 editor_regions.cc:462
-#: editor_snapshots.cc:159 route_ui.cc:1569
+#: editor_ops.cc:4968 editor_ops.cc:7202 editor_regions.cc:503
+#: editor_snapshots.cc:171
 msgid "No, do nothing."
 msgstr "Όχι, να μην γίνει τίποτα."
 
-#: editor_ops.cc:4844
+#: editor_ops.cc:4969
 msgid "Yes, destroy it."
 msgstr "Ναι, να καταστραφεί."
 
-#: editor_ops.cc:4846
+#: editor_ops.cc:4971
 msgid "Destroy last capture"
 msgstr ""
 
-#: editor_ops.cc:4906
+#: editor_ops.cc:5047
 msgid "normalize"
 msgstr "εξομάλυνση"
 
-#: editor_ops.cc:5000
+#: editor_ops.cc:5145
 msgid "reverse regions"
 msgstr "αντιστροφή περιοχών"
 
-#: editor_ops.cc:5034
+#: editor_ops.cc:5182
 msgid "strip silence"
 msgstr ""
 
-#: editor_ops.cc:5091
+#: editor_ops.cc:5263
 msgid "Fork Region(s)"
 msgstr ""
 
-#: editor_ops.cc:5112
+#: editor_ops.cc:5270
 msgid "Could not unlink %1"
 msgstr ""
 
-#: editor_ops.cc:5326
+#: editor_ops.cc:5532
 msgid "reset region gain"
 msgstr ""
 
-#: editor_ops.cc:5379
+#: editor_ops.cc:5590
 msgid "region gain envelope active"
 msgstr ""
 
-#: editor_ops.cc:5406
+#: editor_ops.cc:5615
 msgid "toggle region lock"
 msgstr ""
 
-#: editor_ops.cc:5430
+#: editor_ops.cc:5639
 msgid "Toggle Video Lock"
 msgstr ""
 
-#: editor_ops.cc:5454
+#: editor_ops.cc:5663
 msgid "region lock style"
 msgstr ""
 
-#: editor_ops.cc:5479
+#: editor_ops.cc:5688
 msgid "change region opacity"
 msgstr ""
 
-#: editor_ops.cc:5572
+#: editor_ops.cc:5781
 msgid "fade range"
 msgstr ""
 
-#: editor_ops.cc:5610
+#: editor_ops.cc:5819
 msgid "set fade in length"
 msgstr ""
 
-#: editor_ops.cc:5617
+#: editor_ops.cc:5826
 msgid "set fade out length"
 msgstr ""
 
-#: editor_ops.cc:5662
+#: editor_ops.cc:5891
 msgid "set fade in shape"
 msgstr ""
 
-#: editor_ops.cc:5693
+#: editor_ops.cc:5926
 msgid "set fade out shape"
 msgstr ""
 
-#: editor_ops.cc:5723
+#: editor_ops.cc:5962
 msgid "set fade in active"
 msgstr ""
 
-#: editor_ops.cc:5752
+#: editor_ops.cc:5996
 msgid "set fade out active"
 msgstr ""
 
-#: editor_ops.cc:5994
+#: editor_ops.cc:6056
+msgid "toggle fade active"
+msgstr ""
+
+#: editor_ops.cc:6249
 msgid "set loop range from selection"
 msgstr ""
 
-#: editor_ops.cc:6008
+#: editor_ops.cc:6263
 msgid "set loop range from region"
 msgstr ""
 
-#: editor_ops.cc:6027
+#: editor_ops.cc:6282
 msgid "set punch range from selection"
 msgstr ""
 
-#: editor_ops.cc:6041
+#: editor_ops.cc:6306
 msgid "set session start/end from selection"
 msgstr ""
 
-#: editor_ops.cc:6066
+#: editor_ops.cc:6344
+msgid "set punch start from EP"
+msgstr ""
+
+#: editor_ops.cc:6372
+msgid "set punch end from EP"
+msgstr ""
+
+#: editor_ops.cc:6405
+msgid "set loop start from EP"
+msgstr ""
+
+#: editor_ops.cc:6433
+msgid "set loop end from EP"
+msgstr ""
+
+#: editor_ops.cc:6444
 msgid "set punch range from region"
 msgstr ""
 
-#: editor_ops.cc:6175
+#: editor_ops.cc:6531
 msgid "Add new marker"
 msgstr ""
 
-#: editor_ops.cc:6176
+#: editor_ops.cc:6532
 msgid "Set global tempo"
 msgstr ""
 
-#: editor_ops.cc:6179
+#: editor_ops.cc:6535
 msgid "Define one bar"
 msgstr ""
 
-#: editor_ops.cc:6180
+#: editor_ops.cc:6536
 msgid "Do you want to set the global tempo or add a new tempo marker?"
 msgstr ""
 
-#: editor_ops.cc:6206
+#: editor_ops.cc:6562
 msgid "set tempo from region"
 msgstr ""
 
-#: editor_ops.cc:6236
+#: editor_ops.cc:6591
 msgid "split regions"
 msgstr ""
 
-#: editor_ops.cc:6278
+#: editor_ops.cc:6633
 msgid ""
 "You are about to split\n"
 "%1\n"
@@ -5229,62 +5917,62 @@ msgid ""
 "This could take a long time."
 msgstr ""
 
-#: editor_ops.cc:6285
+#: editor_ops.cc:6640
 msgid "Call for the Ferret!"
 msgstr ""
 
-#: editor_ops.cc:6286
+#: editor_ops.cc:6641
 msgid ""
 "Press OK to continue with this split operation\n"
 "or ask the Ferret dialog to tune the analysis"
 msgstr ""
 
-#: editor_ops.cc:6288
+#: editor_ops.cc:6643
 msgid "Press OK to continue with this split operation"
 msgstr ""
 
-#: editor_ops.cc:6291
+#: editor_ops.cc:6646
 msgid "Excessive split?"
 msgstr ""
 
-#: editor_ops.cc:6443
+#: editor_ops.cc:6800
 msgid "place transient"
 msgstr ""
 
-#: editor_ops.cc:6478
+#: editor_ops.cc:6834
 msgid "snap regions to grid"
 msgstr ""
 
-#: editor_ops.cc:6517
+#: editor_ops.cc:6873
 msgid "Close Region Gaps"
 msgstr ""
 
-#: editor_ops.cc:6522
+#: editor_ops.cc:6878
 msgid "Crossfade length"
 msgstr ""
 
-#: editor_ops.cc:6531 editor_ops.cc:6542 rhythm_ferret.cc:119
-#: session_option_editor.cc:141
+#: editor_ops.cc:6887 editor_ops.cc:6898 rhythm_ferret.cc:128
+#: rhythm_ferret.cc:143 session_option_editor.cc:141
 msgid "ms"
 msgstr ""
 
-#: editor_ops.cc:6533
+#: editor_ops.cc:6889
 msgid "Pull-back length"
 msgstr ""
 
-#: editor_ops.cc:6546
+#: editor_ops.cc:6902 keyeditor.cc:71
 msgid "Ok"
 msgstr ""
 
-#: editor_ops.cc:6561
+#: editor_ops.cc:6917
 msgid "close region gaps"
 msgstr ""
 
-#: editor_ops.cc:6786 route_ui.cc:1543
+#: editor_ops.cc:7160
 msgid "That would be bad news ...."
 msgstr ""
 
-#: editor_ops.cc:6791 route_ui.cc:1548
+#: editor_ops.cc:7165
 msgid ""
 "Removing the master or monitor bus is such a bad idea\n"
 "that %1 is not going to allow it.\n"
@@ -5294,23 +5982,19 @@ msgid ""
 "\"allow-special-bus-removal\" option to be \"yes\""
 msgstr ""
 
-#: editor_ops.cc:6809
-msgid "tracks"
-msgstr ""
-
-#: editor_ops.cc:6811 route_ui.cc:1992
+#: editor_ops.cc:7181
 msgid "track"
-msgstr ""
-
-#: editor_ops.cc:6815
-msgid "busses"
-msgstr ""
+msgid_plural "tracks"
+msgstr[0] ""
+msgstr[1] ""
 
-#: editor_ops.cc:6817 route_ui.cc:1992
+#: editor_ops.cc:7182
 msgid "bus"
-msgstr ""
+msgid_plural "busses"
+msgstr[0] ""
+msgstr[1] ""
 
-#: editor_ops.cc:6822
+#: editor_ops.cc:7186
 msgid ""
 "Do you really want to remove %1 %2 and %3 %4?\n"
 "(You may also lose the playlists associated with the %2)\n"
@@ -5318,7 +6002,7 @@ msgid ""
 "This action cannot be undone, and the session file will be overwritten!"
 msgstr ""
 
-#: editor_ops.cc:6827
+#: editor_ops.cc:7191
 msgid ""
 "Do you really want to remove %1 %2?\n"
 "(You may also lose the playlists associated with the %2)\n"
@@ -5326,358 +6010,371 @@ msgid ""
 "This action cannot be undone, and the session file will be overwritten!"
 msgstr ""
 
-#: editor_ops.cc:6833
+#: editor_ops.cc:7197
 msgid ""
 "Do you really want to remove %1 %2?\n"
 "\n"
 "This action cannot be undone, and the session file will be overwritten"
 msgstr ""
 
-#: editor_ops.cc:6840
+#: editor_ops.cc:7204
 msgid "Yes, remove them."
 msgstr ""
 
-#: editor_ops.cc:6842 editor_snapshots.cc:160 route_ui.cc:1570
+#: editor_ops.cc:7206 editor_snapshots.cc:172
 msgid "Yes, remove it."
 msgstr "Ναι, απάλοιψε το."
 
-#: editor_ops.cc:6847 editor_ops.cc:6849
+#: editor_ops.cc:7211 editor_ops.cc:7213
 msgid "Remove %1"
 msgstr ""
 
-#: editor_ops.cc:6912
+#: editor_ops.cc:7319 editor_ops.cc:7333 editor_ops.cc:7373 editor_ops.cc:7383
 msgid "insert time"
 msgstr ""
 
-#: editor_ops.cc:7076
+#: editor_ops.cc:7436
+msgid "Cannot insert or delete time when in Lock edit."
+msgstr ""
+
+#: editor_ops.cc:7456 editor_ops.cc:7468 editor_ops.cc:7541 editor_ops.cc:7554
+msgid "remove time"
+msgstr ""
+
+#: editor_ops.cc:7628
 msgid "There are too many tracks to fit in the current window"
 msgstr ""
 
-#: editor_ops.cc:7137
+#: editor_ops.cc:7689
 msgid "Sel"
 msgstr ""
 
-#: editor_ops.cc:7176
+#: editor_ops.cc:7728
 #, c-format
 msgid "Saved view %u"
 msgstr ""
 
-#: editor_ops.cc:7201
+#: editor_ops.cc:7753
 msgid "mute regions"
 msgstr ""
 
-#: editor_ops.cc:7203
+#: editor_ops.cc:7755
 msgid "mute region"
 msgstr "σιγή περιοχής"
 
-#: editor_ops.cc:7240
+#: editor_ops.cc:7792
 msgid "combine regions"
 msgstr ""
 
-#: editor_ops.cc:7278
+#: editor_ops.cc:7830
 msgid "uncombine regions"
 msgstr ""
 
-#: editor_ops.cc:7315
+#: editor_ops.cc:7867
 msgid "%1: Locked"
 msgstr ""
 
-#: editor_ops.cc:7322
+#: editor_ops.cc:7874
 msgid "Click to unlock"
 msgstr ""
 
-#: editor_ops.cc:7376
+#: editor_ops.cc:7923
 msgid "Moving embedded files into session folder"
 msgstr ""
 
-#: editor_regions.cc:112
+#: editor_regions.cc:159
 msgid "Region name, with number of channels in []'s"
 msgstr ""
 
-#: editor_regions.cc:113
+#: editor_regions.cc:160
 msgid "Position of start of region"
 msgstr ""
 
-#: editor_regions.cc:114 editor_regions.cc:851 time_info_box.cc:101
+#: editor_regions.cc:161 editor_regions.cc:935 time_info_box.cc:95
 msgid "End"
 msgstr ""
 
-#: editor_regions.cc:114
+#: editor_regions.cc:161
 msgid "Position of end of region"
 msgstr ""
 
-#: editor_regions.cc:115
+#: editor_regions.cc:162
 msgid "Length of the region"
 msgstr ""
 
-#: editor_regions.cc:116
+#: editor_regions.cc:163
 msgid "Position of region sync point, relative to start of the region"
 msgstr ""
 
-#: editor_regions.cc:117
+#: editor_regions.cc:164
 msgid "Length of region fade-in (units: secondary clock), () if disabled"
 msgstr ""
 
-#: editor_regions.cc:118
+#: editor_regions.cc:165
 msgid "Length of region fade-out (units: secondary clock), () if disabled"
 msgstr ""
 
-#: editor_regions.cc:119 mixer_strip.cc:2055 mono_panner.cc:203
-#: panner2d.cc:240 stereo_panner.cc:251 stereo_panner.cc:274
-msgid "L"
-msgstr "L"
+#: editor_regions.cc:166
+msgid "Lock|L"
+msgstr ""
 
-#: editor_regions.cc:119
+#: editor_regions.cc:166
 msgid "Region position locked?"
 msgstr ""
 
-#: editor_regions.cc:120 route_time_axis.cc:103
-msgid "G"
+#: editor_regions.cc:167
+msgid "Gain|G"
 msgstr ""
 
-#: editor_regions.cc:120
+#: editor_regions.cc:167
 msgid "Region position glued to Bars|Beats time?"
 msgstr ""
 
-#: editor_regions.cc:121 editor_routes.cc:211 gain_meter.cc:793
-#: mixer_strip.cc:2032 meter_strip.cc:359 panner_ui.cc:603
-#: route_time_axis.cc:2713 stereo_panner.cc:271 time_axis_view.cc:1190
-msgid "M"
-msgstr ""
-
-#: editor_regions.cc:121
+#: editor_regions.cc:168
 msgid "Region muted?"
 msgstr ""
 
-#: editor_regions.cc:122 mixer_strip.cc:1855
-msgid "O"
+#: editor_regions.cc:169
+msgid "Opaque|O"
 msgstr ""
 
-#: editor_regions.cc:122
+#: editor_regions.cc:169
 msgid "Region opaque (blocks regions below it from being heard)?"
 msgstr ""
 
-#: editor_regions.cc:311 editor_regions.cc:316 editor_regions.cc:318
+#: editor_regions.cc:360 editor_regions.cc:365 editor_regions.cc:367
 msgid "Hidden"
 msgstr "Κρυμμένο"
 
-#: editor_regions.cc:391
+#: editor_regions.cc:432
 msgid "(MISSING) "
 msgstr ""
 
-#: editor_regions.cc:459
+#: editor_regions.cc:500
 msgid ""
 "Do you really want to remove unused regions?\n"
 "(This is destructive and cannot be undone)"
 msgstr ""
 
-#: editor_regions.cc:463
+#: editor_regions.cc:504
 msgid "Yes, remove."
 msgstr ""
 
-#: editor_regions.cc:465
+#: editor_regions.cc:506
 msgid "Remove unused regions"
 msgstr ""
 
-#: editor_regions.cc:818 editor_regions.cc:832 editor_regions.cc:846
+#: editor_regions.cc:735
+msgid "EditorRegions::format_position: negative timecode position: %1"
+msgstr ""
+
+#: editor_regions.cc:900 editor_regions.cc:916 editor_regions.cc:930
 msgid "Mult."
 msgstr ""
 
-#: editor_regions.cc:849 midi_list_editor.cc:104 time_info_box.cc:94
+#: editor_regions.cc:933 midi_list_editor.cc:104 time_info_box.cc:88
 msgid "Start"
 msgstr ""
 
-#: editor_regions.cc:867 editor_regions.cc:883
+#: editor_regions.cc:951 editor_regions.cc:967
 msgid "Multiple"
 msgstr ""
 
-#: editor_regions.cc:952
+#: editor_regions.cc:1036
 msgid "MISSING "
 msgstr ""
 
-#: editor_routes.cc:182 editor_routes.cc:214
+#: editor_routes.cc:126
+msgid "RS"
+msgstr ""
+
+#: editor_routes.cc:208
 msgid "SS"
 msgstr ""
 
-#: editor_routes.cc:206
+#: editor_routes.cc:233
 msgid "Track/Bus Name"
 msgstr ""
 
-#: editor_routes.cc:207
+#: editor_routes.cc:234
 msgid "Track/Bus visible ?"
 msgstr ""
 
-#: editor_routes.cc:208 mixer_strip.cc:2046 meter_strip.cc:371
-#: route_time_axis.cc:105 route_time_axis.cc:2701
-msgid "A"
-msgstr ""
-
-#: editor_routes.cc:208
+#: editor_routes.cc:235
 msgid "Track/Bus active ?"
 msgstr ""
 
-#: editor_routes.cc:209 mixer_strip.cc:2033 mixer_strip.cc:2054
-#: meter_strip.cc:379
-msgid "I"
+#: editor_routes.cc:236
+msgid "MidiInput|I"
 msgstr ""
 
-#: editor_routes.cc:209
+#: editor_routes.cc:236
 msgid "MIDI input enabled"
 msgstr ""
 
-#: editor_routes.cc:210 mono_panner.cc:220 panner2d.cc:241
-#: stereo_panner.cc:249 stereo_panner.cc:276
-msgid "R"
+#: editor_routes.cc:237
+msgid "Rec|R"
 msgstr ""
 
-#: editor_routes.cc:210
+#: editor_routes.cc:237
 msgid "Record enabled"
 msgstr ""
 
-#: editor_routes.cc:211
-msgid "Muted"
+#: editor_routes.cc:238
+msgid "Rec|RS"
 msgstr ""
 
-#: editor_routes.cc:212 mixer_strip.cc:2042 meter_strip.cc:367
-#: route_time_axis.cc:2710
-msgid "S"
+#: editor_routes.cc:238
+msgid "Record Safe"
+msgstr ""
+
+#: editor_routes.cc:239
+msgid "Muted"
 msgstr ""
 
-#: editor_routes.cc:212
+#: editor_routes.cc:240
 msgid "Soloed"
 msgstr ""
 
-#: editor_routes.cc:213
-msgid "SI"
+#: editor_routes.cc:241
+msgid "SoloIso|SI"
 msgstr ""
 
-#: editor_routes.cc:213
+#: editor_routes.cc:241
 msgid "Solo Isolated"
 msgstr ""
 
-#: editor_routes.cc:214
+#: editor_routes.cc:242
+msgid "SoloLock|SS"
+msgstr ""
+
+#: editor_routes.cc:242
 msgid "Solo Safe (Locked)"
 msgstr ""
 
-#: editor_routes.cc:477 mixer_ui.cc:1197
+#: editor_routes.cc:550 mixer_ui.cc:1498
 msgid "Hide All"
 msgstr "Απόκρυψη όλων"
 
-#: editor_routes.cc:478 mixer_ui.cc:1198
+#: editor_routes.cc:551 mixer_ui.cc:1499
 msgid "Show All Audio Tracks"
 msgstr "Ανάδειξη όλων των Audio Καναλιών"
 
-#: editor_routes.cc:479 mixer_ui.cc:1199
+#: editor_routes.cc:552 mixer_ui.cc:1500
 msgid "Hide All Audio Tracks"
 msgstr "Απόκρυψη όλων των Audio Καναλιών"
 
-#: editor_routes.cc:480 mixer_ui.cc:1200
+#: editor_routes.cc:553 mixer_ui.cc:1501
 msgid "Show All Audio Busses"
 msgstr "Ανάδειξη όλων των Audio διαύλων"
 
-#: editor_routes.cc:481 mixer_ui.cc:1201
+#: editor_routes.cc:554 mixer_ui.cc:1502
 msgid "Hide All Audio Busses"
 msgstr "Απόκρυψη όλων των Audio διαύλων"
 
-#: editor_routes.cc:482
+#: editor_routes.cc:555 mixer_ui.cc:1503
 msgid "Show All Midi Tracks"
 msgstr ""
 
-#: editor_routes.cc:483
+#: editor_routes.cc:556 mixer_ui.cc:1504
 msgid "Hide All Midi Tracks"
 msgstr ""
 
-#: editor_routes.cc:484
-msgid "Show Tracks With Regions Under Playhead"
+#: editor_routes.cc:557
+msgid "Only Show Tracks with Regions Under Playhead"
 msgstr ""
 
-#: editor_rulers.cc:211
+#: editor_rulers.cc:212
 msgid "New location marker"
 msgstr "Νέο στίγμα θέσεως"
 
-#: editor_rulers.cc:212
+#: editor_rulers.cc:213
 msgid "Clear all locations"
 msgstr "Εκκαθάριση όλων των θέσεων"
 
-#: editor_rulers.cc:213
+#: editor_rulers.cc:214
 msgid "Unhide locations"
 msgstr ""
 
-#: editor_rulers.cc:217
+#: editor_rulers.cc:218
 msgid "New range"
 msgstr ""
 
-#: editor_rulers.cc:218
+#: editor_rulers.cc:219
 msgid "Clear all ranges"
 msgstr "Εκκαθάριση όλων των διαστημάτων"
 
-#: editor_rulers.cc:219
+#: editor_rulers.cc:220
 msgid "Unhide ranges"
 msgstr ""
 
 #: editor_rulers.cc:224
-msgid "Make Loop range"
+msgid "New Loop range"
 msgstr ""
 
 #: editor_rulers.cc:225
-msgid "Make Punch range"
+msgid "New Punch range"
 msgstr ""
 
 #: editor_rulers.cc:230
 msgid "New CD track marker"
 msgstr ""
 
-#: editor_rulers.cc:235 tempo_dialog.cc:38
+#: editor_rulers.cc:234 tempo_dialog.cc:38
 msgid "New Tempo"
 msgstr "Νέος Χρόνος"
 
-#: editor_rulers.cc:239 tempo_dialog.cc:296
+#: editor_rulers.cc:238 tempo_dialog.cc:419
 msgid "New Meter"
 msgstr "Νέο μέτρο"
 
-#: editor_snapshots.cc:137
+#: editor_snapshots.cc:149
 msgid "Rename Snapshot"
 msgstr ""
 
-#: editor_snapshots.cc:139
+#: editor_snapshots.cc:151
 msgid "New name of snapshot"
 msgstr ""
 
-#: editor_snapshots.cc:157
+#: editor_snapshots.cc:169
 msgid ""
 "Do you really want to remove snapshot \"%1\" ?\n"
 "(which cannot be undone)"
 msgstr ""
 
-#: editor_snapshots.cc:162
+#: editor_snapshots.cc:174
 msgid "Remove snapshot"
 msgstr ""
 
-#: editor_tempodisplay.cc:194 editor_tempodisplay.cc:234
-msgid "add"
-msgstr "πρόσθεση"
-
-#: editor_tempodisplay.cc:215
+#: editor_tempodisplay.cc:318
 msgid "add tempo mark"
 msgstr "πρόσθεση στίγματος χρόνου"
 
-#: editor_tempodisplay.cc:254
+#: editor_tempodisplay.cc:343
+msgid "add"
+msgstr "πρόσθεση"
+
+#: editor_tempodisplay.cc:362
 msgid "add meter mark"
 msgstr "πρόσθεση στίγματος μέτρου"
 
-#: editor_tempodisplay.cc:287 editor_tempodisplay.cc:315
+#: editor_tempodisplay.cc:401 editor_tempodisplay.cc:435
 msgid "done"
 msgstr "έγινε"
 
-#: editor_tempodisplay.cc:304 editor_tempodisplay.cc:330
+#: editor_tempodisplay.cc:422
+msgid "replace meter mark"
+msgstr ""
+
+#: editor_tempodisplay.cc:454
 msgid "replace tempo mark"
 msgstr "αντικατάσταση στίγματος χρόνου"
 
-#: editor_tempodisplay.cc:353 editor_tempodisplay.cc:387
+#: editor_tempodisplay.cc:485 editor_tempodisplay.cc:519
 msgid "remove tempo mark"
 msgstr "απαλοιφή στίγματος χρόνου"
 
-#: editor_tempodisplay.cc:370
+#: editor_tempodisplay.cc:502
 msgid ""
 "programming error: meter marker canvas item has no marker object pointer!"
 msgstr ""
@@ -5688,329 +6385,382 @@ msgstr ""
 msgid "stretch/shrink"
 msgstr ""
 
-#: editor_timefx.cc:129
+#: editor_timefx.cc:130
 msgid "pitch shift"
 msgstr ""
 
-#: editor_timefx.cc:301
+#: editor_timefx.cc:282
 msgid "timefx cannot be started - thread creation error"
 msgstr ""
 
-#: engine_dialog.cc:83
+#: engine_dialog.cc:86
 msgid "Device Control Panel"
 msgstr ""
 
-#: engine_dialog.cc:84
+#: engine_dialog.cc:87
 msgid "Midi Device Setup"
 msgstr ""
 
-#: engine_dialog.cc:85 engine_dialog.cc:2097
+#: engine_dialog.cc:89
+msgid "Refresh Devices"
+msgstr ""
+
+#: engine_dialog.cc:90
+msgid "Use Buffered I/O"
+msgstr ""
+
+#: engine_dialog.cc:91 engine_dialog.cc:3000
 msgid "Measure"
 msgstr ""
 
-#: engine_dialog.cc:86
+#: engine_dialog.cc:92
 msgid "Use results"
 msgstr ""
 
-#: engine_dialog.cc:87
+#: engine_dialog.cc:93
 msgid "Back to settings ... (ignore results)"
 msgstr ""
 
-#: engine_dialog.cc:88
+#: engine_dialog.cc:94
 msgid "Calibrate Audio"
 msgstr ""
 
-#: engine_dialog.cc:92
+#: engine_dialog.cc:98
 msgid "Back to settings"
 msgstr ""
 
-#: engine_dialog.cc:111
+#: engine_dialog.cc:120
 msgid ""
 "No audio/MIDI backends detected. %1 cannot run\n"
 "\n"
 "(This is a build/packaging/system error. It should never happen.)"
 msgstr ""
 
-#: engine_dialog.cc:137
+#: engine_dialog.cc:145
 msgid "Latency Measurement Tool"
 msgstr ""
 
-#: engine_dialog.cc:149
+#: engine_dialog.cc:157
 msgid ""
 "<span weight=\"bold\">Turn down the volume on your audio equipment to a very "
 "low level.</span>"
 msgstr ""
 
-#: engine_dialog.cc:158
+#: engine_dialog.cc:166
 msgid "Select two channels below and connect them using a cable."
 msgstr ""
 
-#: engine_dialog.cc:163
+#: engine_dialog.cc:171
 msgid "Output channel"
 msgstr ""
 
-#: engine_dialog.cc:171
+#: engine_dialog.cc:179
 msgid "Input channel"
 msgstr ""
 
-#: engine_dialog.cc:206
+#: engine_dialog.cc:213
 msgid "Once the channels are connected, click the \"Measure\" button."
 msgstr ""
 
-#: engine_dialog.cc:213
+#: engine_dialog.cc:220
 msgid "When satisfied with the results, click the \"Use results\" button."
 msgstr ""
 
-#: engine_dialog.cc:228 engine_dialog.cc:2217 engine_dialog.cc:2227
+#: engine_dialog.cc:235 engine_dialog.cc:3138 engine_dialog.cc:3148
 msgid "No measurement results yet"
 msgstr ""
 
-#: engine_dialog.cc:238 route_params_ui.cc:106
+#: engine_dialog.cc:245 route_params_ui.cc:106
 msgid "Latency"
 msgstr ""
 
-#: engine_dialog.cc:372
+#: engine_dialog.cc:520
 msgid "Audio System:"
 msgstr ""
 
-#: engine_dialog.cc:409
+#: engine_dialog.cc:564
 msgid "Driver:"
 msgstr ""
 
-#: engine_dialog.cc:415
+#: engine_dialog.cc:571
+msgid "Input Device:"
+msgstr ""
+
+#: engine_dialog.cc:575
+msgid "Output Device:"
+msgstr ""
+
+#: engine_dialog.cc:582
 msgid "Device:"
 msgstr ""
 
-#: engine_dialog.cc:420 engine_dialog.cc:519 sfdb_ui.cc:153 sfdb_ui.cc:348
-#: sfdb_ui.cc:353
+#: engine_dialog.cc:591 engine_dialog.cc:699 export_report.cc:164
+#: export_report.cc:328 sfdb_ui.cc:153 sfdb_ui.cc:348 sfdb_ui.cc:353
 msgid "Sample rate:"
 msgstr ""
 
-#: engine_dialog.cc:426 engine_dialog.cc:526
+#: engine_dialog.cc:597 engine_dialog.cc:706
 msgid "Buffer size:"
 msgstr ""
 
-#: engine_dialog.cc:444
+#: engine_dialog.cc:606
+msgid "Periods:"
+msgstr ""
+
+#: engine_dialog.cc:624
 msgid "Input Channels:"
 msgstr ""
 
-#: engine_dialog.cc:457
+#: engine_dialog.cc:637
 msgid "Output Channels:"
 msgstr ""
 
-#: engine_dialog.cc:469
+#: engine_dialog.cc:649
 msgid "Hardware input latency:"
 msgstr ""
 
-#: engine_dialog.cc:472 engine_dialog.cc:485
+#: engine_dialog.cc:652 engine_dialog.cc:665
 msgid "samples"
 msgstr ""
 
-#: engine_dialog.cc:482
+#: engine_dialog.cc:662
 msgid "Hardware output latency:"
 msgstr ""
 
-#: engine_dialog.cc:493
+#: engine_dialog.cc:673
 msgid "MIDI System:"
 msgstr ""
 
-#: engine_dialog.cc:511
+#: engine_dialog.cc:691
 msgid ""
-"The %1 audio backend was configured and started externally.\n"
-"This limits your control over it."
+"%1 is already running. %2 will connect to it and use the existing settings."
 msgstr ""
 
-#: engine_dialog.cc:564
+#: engine_dialog.cc:744
 msgid ""
 "Failed to start or connect to audio-engine.\n"
 "\n"
 "Latency calibration requires a working audio interface."
 msgstr ""
 
-#: engine_dialog.cc:570
+#: engine_dialog.cc:750
 msgid ""
 "Your selected audio configuration is playback- or capture-only.\n"
 "\n"
 "Latency calibration requires playback and capture"
 msgstr ""
 
-#: engine_dialog.cc:651
+#: engine_dialog.cc:965
 msgid "MIDI Devices"
 msgstr ""
 
-#: engine_dialog.cc:657
+#: engine_dialog.cc:971
 msgid "Device"
 msgstr ""
 
-#: engine_dialog.cc:659
+#: engine_dialog.cc:973
 msgid "Hardware Latencies"
 msgstr ""
 
-#: engine_dialog.cc:700
+#: engine_dialog.cc:1014
 msgid "Calibrate"
 msgstr ""
 
-#: engine_dialog.cc:800
+#: engine_dialog.cc:1117
 msgid "all available channels"
 msgstr ""
 
-#: engine_dialog.cc:1039 latency_gui.cc:39
-msgid "sample"
-msgid_plural "samples"
+#: engine_dialog.cc:1599 latency_gui.cc:55
+msgid "%1 sample"
+msgid_plural "%1 samples"
 msgstr[0] ""
 msgstr[1] ""
 
-#: engine_dialog.cc:1090
+#: engine_dialog.cc:1662
 #, c-format
 msgid "(%.1f ms)"
 msgstr ""
 
-#: engine_dialog.cc:1593
+#: engine_dialog.cc:2413
 msgid "Could not start backend engine %1"
 msgstr ""
 
-#: engine_dialog.cc:1644
+#: engine_dialog.cc:2445
 msgid "Cannot set driver to %1"
 msgstr ""
 
-#: engine_dialog.cc:1648
+#: engine_dialog.cc:2450
+msgid "Cannot set input device name to %1"
+msgstr ""
+
+#: engine_dialog.cc:2454
+msgid "Cannot set output device name to %1"
+msgstr ""
+
+#: engine_dialog.cc:2459
 msgid "Cannot set device name to %1"
 msgstr ""
 
-#: engine_dialog.cc:1652
+#: engine_dialog.cc:2464
 msgid "Cannot set sample rate to %1"
 msgstr ""
 
-#: engine_dialog.cc:1656
+#: engine_dialog.cc:2468
 msgid "Cannot set buffer size to %1"
 msgstr ""
 
-#: engine_dialog.cc:1662
+#: engine_dialog.cc:2472
+msgid "Cannot set periods to %1"
+msgstr ""
+
+#: engine_dialog.cc:2478
 msgid "Cannot set input channels to %1"
 msgstr ""
 
-#: engine_dialog.cc:1666
+#: engine_dialog.cc:2482
 msgid "Cannot set output channels to %1"
 msgstr ""
 
-#: engine_dialog.cc:1672
+#: engine_dialog.cc:2488
 msgid "Cannot set input latency to %1"
 msgstr ""
 
-#: engine_dialog.cc:1676
+#: engine_dialog.cc:2492
 msgid "Cannot set output latency to %1"
 msgstr ""
 
-#: engine_dialog.cc:1955 engine_dialog.cc:2014
+#: engine_dialog.cc:2851 engine_dialog.cc:2917
 msgid "No signal detected "
 msgstr ""
 
-#: engine_dialog.cc:1968 engine_dialog.cc:2022 port_insert_ui.cc:70
+#: engine_dialog.cc:2858
+msgid ""
+"Input signal is > -3dBFS. Lower the signal level (output gain, input gain) "
+"on the audio-interface."
+msgstr ""
+
+#: engine_dialog.cc:2871 engine_dialog.cc:2925 port_insert_ui.cc:70
 #: port_insert_ui.cc:98
 msgid "Disconnected from audio engine"
 msgstr ""
 
-#: engine_dialog.cc:1977 engine_dialog.cc:2030
+#: engine_dialog.cc:2880 engine_dialog.cc:2933
 msgid "Detected roundtrip latency: "
 msgstr ""
 
-#: engine_dialog.cc:1979 engine_dialog.cc:2032
+#: engine_dialog.cc:2882 engine_dialog.cc:2935
 msgid "Systemic latency: "
 msgstr ""
 
-#: engine_dialog.cc:1986
+#: engine_dialog.cc:2889
 msgid "(signal detection error)"
 msgstr ""
 
-#: engine_dialog.cc:1992
+#: engine_dialog.cc:2895
 msgid "(inverted - bad wiring)"
 msgstr ""
 
-#: engine_dialog.cc:2039
+#: engine_dialog.cc:2942
 msgid "(averaging)"
 msgstr ""
 
-#: engine_dialog.cc:2045
+#: engine_dialog.cc:2948
 msgid "(too large jitter)"
 msgstr ""
 
-#: engine_dialog.cc:2049
+#: engine_dialog.cc:2952
 msgid "(large jitter)"
 msgstr ""
 
-#: engine_dialog.cc:2061
+#: engine_dialog.cc:2964
 msgid "Timeout - large MIDI jitter."
 msgstr ""
 
-#: engine_dialog.cc:2077 port_insert_ui.cc:134
+#: engine_dialog.cc:2980 port_insert_ui.cc:134
 msgid "Detecting ..."
 msgstr ""
 
-#: engine_dialog.cc:2171
+#: engine_dialog.cc:3081
 msgid "Disconnect from %1"
 msgstr ""
 
-#: engine_dialog.cc:2175 mixer_strip.cc:1522 route_group_dialog.cc:45
-#: route_time_axis.cc:841
-msgid "Active"
-msgstr "Ενεργό"
+#: engine_dialog.cc:3086
+msgid "Running"
+msgstr ""
+
+#: engine_dialog.cc:3088
+msgid "Connected"
+msgstr ""
 
-#: engine_dialog.cc:2185
+#: engine_dialog.cc:3099
 msgid "Connect to %1"
 msgstr ""
 
-#: engine_dialog.cc:2190
-msgid "Inactive"
+#: engine_dialog.cc:3103 shuttle_control.cc:655
+msgid "Stopped"
 msgstr ""
 
-#: export_channel_selector.cc:45 sfdb_ui.cc:151
+#: export_channel_selector.cc:46 export_report.cc:159 export_report.cc:324
+#: sfdb_ui.cc:151
 msgid "Channels:"
 msgstr ""
 
-#: export_channel_selector.cc:46
+#: export_channel_selector.cc:47
 msgid "Split to mono files"
 msgstr ""
 
-#: export_channel_selector.cc:182
+#: export_channel_selector.cc:197
 msgid "Bus or Track"
 msgstr ""
 
-#: export_channel_selector.cc:459
+#: export_channel_selector.cc:474
 msgid "Region contents without fades nor region gain (channels: %1)"
 msgstr ""
 
-#: export_channel_selector.cc:463
+#: export_channel_selector.cc:478
 msgid "Region contents with fades and region gain (channels: %1)"
 msgstr ""
 
-#: export_channel_selector.cc:467
+#: export_channel_selector.cc:482
 msgid "Track output (channels: %1)"
 msgstr ""
 
-#: export_channel_selector.cc:536
-msgid "Export region contents"
+#: export_channel_selector.cc:552
+msgid "Apply track/bus processing"
 msgstr ""
 
-#: export_channel_selector.cc:537
-msgid "Export track output"
+#: export_channel_selector.cc:553
+msgid "Select all tracks"
 msgstr ""
 
-#: export_dialog.cc:46
+#: export_channel_selector.cc:554
+msgid "Select all busses"
+msgstr ""
+
+#: export_channel_selector.cc:555
+msgid "Deselect all"
+msgstr ""
+
+#: export_channel_selector.cc:589
+msgid "Track name"
+msgstr ""
+
+#: export_dialog.cc:48
 msgid ""
 "<span color=\"#ffa755\">Some already existing files will be overwritten.</"
 "span>"
 msgstr ""
 
-#: export_dialog.cc:47
+#: export_dialog.cc:49
 msgid "List files"
 msgstr ""
 
-#: export_dialog.cc:158 export_format_dialog.cc:59
+#: export_dialog.cc:158 export_format_dialog.cc:67
 msgid "File format"
 msgstr ""
 
-#: export_dialog.cc:159 export_timespan_selector.cc:374
-#: export_timespan_selector.cc:436
+#: export_dialog.cc:159 export_timespan_selector.cc:371
+#: export_timespan_selector.cc:433
 msgid "Time Span"
 msgstr ""
 
@@ -6036,45 +6786,57 @@ msgstr ""
 msgid "Stop Export"
 msgstr "Παύση Εξαγωγής"
 
-#: export_dialog.cc:327
+#: export_dialog.cc:336
 msgid "export"
 msgstr ""
 
-#: export_dialog.cc:346
+#: export_dialog.cc:355
+msgid "Exporting '%3' (timespan %1 of %2)"
+msgstr ""
+
+#: export_dialog.cc:360
 msgid "Normalizing '%3' (timespan %1 of %2)"
 msgstr ""
 
-#: export_dialog.cc:350
-msgid "Exporting '%3' (timespan %1 of %2)"
+#: export_dialog.cc:365
+msgid "Tagging '%3' (timespan %1 of %2)"
+msgstr ""
+
+#: export_dialog.cc:369
+msgid "Uploading '%3' (timespan %1 of %2)"
 msgstr ""
 
-#: export_dialog.cc:373 export_dialog.cc:375
+#: export_dialog.cc:373
+msgid "Running Post Export Command for '%1'"
+msgstr ""
+
+#: export_dialog.cc:401 export_dialog.cc:403
 msgid "<span color=\"#ffa755\">Error: "
 msgstr ""
 
-#: export_dialog.cc:385
+#: export_dialog.cc:413
 msgid "<span color=\"#ffa755\">Warning: "
 msgstr ""
 
-#: export_dialog.cc:387
+#: export_dialog.cc:415
 msgid ""
 "\n"
 "<span color=\"#ffa755\">Warning: "
 msgstr ""
 
-#: export_dialog.cc:411
+#: export_dialog.cc:439
 msgid "Export Selection"
 msgstr ""
 
-#: export_dialog.cc:425
+#: export_dialog.cc:453
 msgid "Export Region"
 msgstr ""
 
-#: export_dialog.cc:434
+#: export_dialog.cc:462
 msgid "Source"
 msgstr ""
 
-#: export_dialog.cc:450
+#: export_dialog.cc:478
 msgid "Stem Export"
 msgstr ""
 
@@ -6082,172 +6844,246 @@ msgstr ""
 msgid "Add another format"
 msgstr ""
 
-#: export_file_notebook.cc:193
+#: export_file_notebook.cc:198
 msgid "Format"
 msgstr ""
 
-#: export_file_notebook.cc:194
+#: export_file_notebook.cc:199
 msgid "Location"
 msgstr "Τοποθεσία"
 
-#: export_file_notebook.cc:195
+#: export_file_notebook.cc:200
 msgid "Upload to Soundcloud"
 msgstr ""
 
-#: export_file_notebook.cc:273
+#: export_file_notebook.cc:201
+msgid "Analyze Exported Audio"
+msgstr ""
+
+#: export_file_notebook.cc:286
 msgid "No format!"
 msgstr ""
 
-#: export_file_notebook.cc:291
+#: export_file_notebook.cc:304
 msgid "Format %1: %2"
 msgstr ""
 
-#: export_filename_selector.cc:32
+#: export_filename_selector.cc:33
 msgid "Label:"
 msgstr ""
 
-#: export_filename_selector.cc:33
+#: export_filename_selector.cc:34 session_dialog.cc:310
 msgid "Session Name"
 msgstr ""
 
-#: export_filename_selector.cc:34
-msgid "Revision:"
+#: export_filename_selector.cc:35
+msgid "Timespan Name"
 msgstr ""
 
 #: export_filename_selector.cc:36
+msgid "Revision:"
+msgstr ""
+
+#: export_filename_selector.cc:38
 msgid "Folder:"
 msgstr ""
 
-#: export_filename_selector.cc:37 session_import_dialog.cc:45
+#: export_filename_selector.cc:39 session_import_dialog.cc:45
 #: transcode_video_dialog.cc:59 video_server_dialog.cc:54
-#: video_server_dialog.cc:56 export_video_dialog.cc:81
-#: export_video_dialog.cc:83
+#: video_server_dialog.cc:56 export_video_dialog.cc:77
+#: export_video_dialog.cc:79
 msgid "Browse"
 msgstr "Αναζήτηση"
 
-#: export_filename_selector.cc:41
-msgid "<i>Build filename(s) from these components:</i>"
+#: export_filename_selector.cc:40 export_report.cc:118
+msgid "Open Folder"
+msgstr ""
+
+#: export_filename_selector.cc:45
+msgid "Build filename(s) from these components:"
 msgstr ""
 
-#: export_filename_selector.cc:212
+#: export_filename_selector.cc:217
 msgid ""
 "<small><i>Sorry, no example filename can be shown at the moment</i></small>"
 msgstr ""
 
-#: export_filename_selector.cc:214
-msgid "<small><i>Current (approximate) filename: \"%1\"</i></small>"
+#: export_filename_selector.cc:219
+msgid "<i>Current (approximate) filename</i>: \"%1\""
 msgstr ""
 
-#: export_filename_selector.cc:250 export_filename_selector.cc:336
+#: export_filename_selector.cc:255 export_filename_selector.cc:402
 msgid ""
 "%1: this is only the directory/folder name, not the filename.\n"
 "The filename will be chosen from the information just above the folder "
 "selector."
 msgstr ""
 
-#: export_filename_selector.cc:322
+#: export_filename_selector.cc:378
+msgid "%1: this is not a valid directory/folder."
+msgstr ""
+
+#: export_filename_selector.cc:388
 msgid "Choose export folder"
 msgstr ""
 
-#: export_format_dialog.cc:31
+#: export_format_dialog.cc:32
 msgid "New Export Format Profile"
 msgstr ""
 
-#: export_format_dialog.cc:31
+#: export_format_dialog.cc:32
 msgid "Edit Export Format Profile"
 msgstr ""
 
-#: export_format_dialog.cc:38
+#: export_format_dialog.cc:39
 msgid "Label: "
 msgstr ""
 
-#: export_format_dialog.cc:41 normalize_dialog.cc:42
-msgid "Normalize to:"
+#: export_format_dialog.cc:42
+msgid "Normalize:"
 msgstr ""
 
-#: export_format_dialog.cc:46
-msgid "Trim silence at start"
+#: export_format_dialog.cc:43
+msgid "Peak"
 msgstr ""
 
-#: export_format_dialog.cc:47
-msgid "Add silence at start:"
+#: export_format_dialog.cc:44
+msgid "Loudness"
 msgstr ""
 
 #: export_format_dialog.cc:50
-msgid "Trim silence at end"
+msgid "LUFS"
 msgstr ""
 
 #: export_format_dialog.cc:51
-msgid "Add silence at end:"
+msgid "dBTP"
 msgstr ""
 
 #: export_format_dialog.cc:54
+msgid "Trim silence at start"
+msgstr ""
+
+#: export_format_dialog.cc:55
+msgid "Add silence at start:"
+msgstr ""
+
+#: export_format_dialog.cc:58
+msgid "Trim silence at end"
+msgstr ""
+
+#: export_format_dialog.cc:59
+msgid "Add silence at end:"
+msgstr ""
+
+#: export_format_dialog.cc:62
 msgid ""
 "Command to run post-export\n"
-"(%f=full path & filename, %d=directory, %b=basename):"
+"(%f=file path, %d=directory, %b=basename, see tooltip for more):"
 msgstr ""
 
-#: export_format_dialog.cc:57
+#: export_format_dialog.cc:65
 msgid "Compatibility"
 msgstr ""
 
-#: export_format_dialog.cc:58
+#: export_format_dialog.cc:66
 msgid "Quality"
 msgstr ""
 
-#: export_format_dialog.cc:61
+#: export_format_dialog.cc:69
 msgid "Sample rate conversion quality:"
 msgstr ""
 
-#: export_format_dialog.cc:68
+#: export_format_dialog.cc:76
 msgid "Dithering"
 msgstr ""
 
-#: export_format_dialog.cc:70
+#: export_format_dialog.cc:78
 msgid "Create CUE file for disk-at-once CD/DVD creation"
 msgstr ""
 
-#: export_format_dialog.cc:71
+#: export_format_dialog.cc:79
 msgid "Create TOC file for disk-at-once CD/DVD creation"
 msgstr ""
 
-#: export_format_dialog.cc:73
+#: export_format_dialog.cc:80
+msgid "Create chapter mark file for MP4 chapter marks"
+msgstr ""
+
+#: export_format_dialog.cc:82
 msgid "Tag file with session's metadata"
 msgstr ""
 
-#: export_format_dialog.cc:470
+#: export_format_dialog.cc:119
+msgid "∧"
+msgstr ""
+
+#: export_format_dialog.cc:124
+msgid ""
+"Normalize to EBU-R128 LUFS target loudness without exceeding the given true-"
+"peak limit. EBU-R128 normalization is only available for mono and stereo "
+"targets, true-peak works for any channel layout."
+msgstr ""
+
+#: export_format_dialog.cc:152
+msgid ""
+"%a Artist name\n"
+"%b File's base-name\n"
+"%c Copyright\n"
+"%d File's directory\n"
+"%f File's full absolute path\n"
+"%l Lyricist\n"
+"%n Session name\n"
+"%o Conductor\n"
+"%t Title\n"
+"%z Organization\n"
+"%A Album\n"
+"%C Comment\n"
+"%E Engineer\n"
+"%G Genre\n"
+"%L Total track count\n"
+"%M Mixer\n"
+"%N Timespan name\n"
+"%O Composer\n"
+"%P Producer\n"
+"%S Disc subtitle\n"
+"%T Track number\n"
+"%Y Year\n"
+"%Z Country"
+msgstr ""
+
+#: export_format_dialog.cc:537
 msgid "Best (sinc)"
 msgstr ""
 
-#: export_format_dialog.cc:475
+#: export_format_dialog.cc:542
 msgid "Medium (sinc)"
 msgstr ""
 
-#: export_format_dialog.cc:480
+#: export_format_dialog.cc:547
 msgid "Fast (sinc)"
 msgstr ""
 
-#: export_format_dialog.cc:490
+#: export_format_dialog.cc:557
 msgid "Zero order hold"
 msgstr ""
 
-#: export_format_dialog.cc:895
+#: export_format_dialog.cc:981
 msgid "Linear encoding options"
 msgstr ""
 
-#: export_format_dialog.cc:911
+#: export_format_dialog.cc:997
 msgid "Ogg Vorbis options"
 msgstr ""
 
-#: export_format_dialog.cc:922
+#: export_format_dialog.cc:1008
 msgid "FLAC options"
 msgstr ""
 
-#: export_format_dialog.cc:939
+#: export_format_dialog.cc:1025
 msgid "Broadcast Wave options"
 msgstr ""
 
-#: export_format_selector.cc:136
+#: export_format_selector.cc:131
 msgid "Do you really want to remove the format?"
 msgstr ""
 
@@ -6255,29 +7091,200 @@ msgstr ""
 msgid "Preset"
 msgstr ""
 
-#: export_preset_selector.cc:104
+#: export_preset_selector.cc:99
 msgid ""
 "The selected preset did not load successfully!\n"
 "Perhaps it references a format that has been removed?"
 msgstr ""
 
-#: export_preset_selector.cc:156
+#: export_preset_selector.cc:151
 msgid "Do you really want to remove this preset?"
 msgstr ""
 
-#: export_timespan_selector.cc:46
+#: export_report.cc:56
+msgid "Export Report/Analysis"
+msgstr ""
+
+#: export_report.cc:147 export_report.cc:327 sfdb_ui.cc:149
+msgid "Format:"
+msgstr ""
+
+#: export_report.cc:166 export_report.cc:328
+msgid "%1 Hz"
+msgstr ""
+
+#: export_report.cc:169 export_report.cc:336 transcode_video_dialog.cc:139
+msgid "Duration:"
+msgstr ""
+
+#: export_report.cc:177 export_report.cc:334
+msgid "Timecode:"
+msgstr ""
+
+#: export_report.cc:185
+msgid "Error:"
+msgstr ""
+
+#: export_report.cc:220 export_report.cc:440
+msgid "(too short integration time)"
+msgstr ""
+
+#: export_report.cc:222
+msgid "-888"
+msgstr ""
+
+#: export_report.cc:227 export_report.cc:353
+msgid "Peak:"
+msgstr ""
+
+#: export_report.cc:228 export_report.cc:360
+msgid "%1 dBFS"
+msgstr ""
+
+#: export_report.cc:229 export_report.cc:369
+msgid "True Peak:"
+msgstr ""
+
+#: export_report.cc:230 export_report.cc:376
+msgid "%1 dBTP"
+msgstr ""
+
+#: export_report.cc:231 export_report.cc:387
+msgid "Normalization Gain:"
+msgstr ""
+
+#: export_report.cc:232
+msgid "+888.88 dB"
+msgstr ""
+
+#: export_report.cc:234 export_report.cc:448
+msgid "Integrated Loudness:"
+msgstr ""
+
+#: export_report.cc:235 export_report.cc:454
+msgid "%1 LUFS"
+msgstr ""
+
+#: export_report.cc:236 export_report.cc:460
+msgid "Loudness Range:"
+msgstr ""
+
+#: export_report.cc:237 export_report.cc:466
+msgid "%1 LU"
+msgstr ""
+
+#: export_report.cc:247 export_report.cc:754
+msgid "100"
+msgstr ""
+
+#: export_report.cc:282 export_report.cc:650
+msgid "00:00:00.000"
+msgstr ""
+
+#: export_report.cc:288
+msgid "0|A8"
+msgstr ""
+
+#: export_report.cc:394
+msgid "%1 dB"
+msgstr ""
+
+#: export_report.cc:425 export_report.cc:433 export_report.cc:553
+msgid ""
+"Not\n"
+"Available"
+msgstr ""
+
+#: export_report.cc:493
+msgid ""
+"LUFS\n"
+"(short)"
+msgstr ""
+
+#: export_report.cc:503
+msgid "Multiplicity"
+msgstr ""
+
+#: export_report.cc:603
+msgid "Logscale|Lg"
+msgstr ""
+
+#: export_report.cc:604
+msgid "Rectified|Rf"
+msgstr ""
+
+#: export_report.cc:605
+msgid "Logscale"
+msgstr ""
+
+#: export_report.cc:606
+msgid "Rectified"
+msgstr ""
+
+#: export_report.cc:738
+msgid "Hz"
+msgstr ""
+
+#: export_report.cc:755
+msgid "500"
+msgstr ""
+
+#: export_report.cc:756
+msgid "1K"
+msgstr ""
+
+#: export_report.cc:757
+msgid "5K"
+msgstr ""
+
+#: export_report.cc:758
+msgid "10K"
+msgstr ""
+
+#: export_report.cc:844
+msgid "Writing Export Analysis Image: %1."
+msgstr ""
+
+#: export_report.cc:941 sfdb_ui.cc:293 sfdb_ui.cc:409
+msgid "Could not read file: %1 (%2)."
+msgstr "Δεν γινόταν να διαβαστεί το αρχείο: %1 (%2)."
+
+#: export_report.cc:967 sfdb_ui.cc:458
+msgid "Could not access soundfile: "
+msgstr "Δεν γινόταν να διαβαστεί το soundfile: "
+
+#: export_report.cc:1203
+msgid "-36"
+msgstr ""
+
+#: export_report.cc:1204 export_report.cc:1208 export_report.cc:1214
+#: export_report.cc:1217
+msgid "-18"
+msgstr ""
+
+#: export_report.cc:1205 export_report.cc:1209 export_report.cc:1215
+#: export_report.cc:1218 export_report.cc:1221 export_report.cc:1222
+msgid "-9"
+msgstr ""
+
+#: export_report.cc:1206 export_report.cc:1210 export_report.cc:1216
+#: export_report.cc:1219 export_report.cc:1223 export_report.cc:1224
+msgid "-3"
+msgstr ""
+
+#: export_timespan_selector.cc:44
 msgid "Show Times as:"
 msgstr ""
 
-#: export_timespan_selector.cc:53 processor_box.cc:2466
+#: export_timespan_selector.cc:51 processor_box.cc:3683
 msgid "Select All"
 msgstr "Επιλογή όλων"
 
-#: export_timespan_selector.cc:223 transform_dialog.cc:93
+#: export_timespan_selector.cc:220 transform_dialog.cc:93
 msgid " to "
 msgstr ""
 
-#: export_timespan_selector.cc:367 export_timespan_selector.cc:426
+#: export_timespan_selector.cc:364 export_timespan_selector.cc:423
 msgid "Range"
 msgstr ""
 
@@ -6293,36 +7300,39 @@ msgstr ""
 msgid "getSoundResourceFile: root = %1, != response"
 msgstr ""
 
-#: sfdb_freesound_mootcher.cc:410 rc_option_editor.cc:1824
+#: sfdb_freesound_mootcher.cc:410 rc_option_editor.cc:2416
 msgid "%1"
 msgstr ""
 
-#: gain_meter.cc:132 gain_meter.cc:400 gain_meter.cc:505 gain_meter.cc:896
+#: gain_meter.cc:137 gain_meter.cc:422 gain_meter.cc:527 gain_meter.cc:919
 msgid "-inf"
 msgstr "-inf"
 
-#: gain_meter.cc:147 gain_meter.cc:958
+#: gain_meter.cc:152 gain_meter.cc:983
 msgid "Fader automation mode"
 msgstr "Λειτουργία αυτοματισμού Fader"
 
-#: gain_meter.cc:148 gain_meter.cc:959
+#: gain_meter.cc:153 gain_meter.cc:984
 msgid "Fader automation type"
 msgstr "Τύπος αυτοματισμού Fader"
 
-#: gain_meter.cc:157 gain_meter.cc:829 panner_ui.cc:179 panner_ui.cc:639
+#: gain_meter.cc:162 gain_meter.cc:852 panner_ui.cc:179 panner_ui.cc:641
 msgid "Abs"
 msgstr ""
 
-#: gain_meter.cc:796 mixer_strip.cc:2049 meter_strip.cc:374 panner_ui.cc:606
-#: route_time_axis.cc:104 route_time_axis.cc:2705
+#: gain_meter.cc:816 vca_master_strip.cc:78 vca_time_axis.cc:54
+msgid "M"
+msgstr ""
+
+#: gain_meter.cc:819 vca_master_strip.cc:296
 msgid "P"
 msgstr ""
 
-#: gain_meter.cc:799 panner_ui.cc:609
+#: gain_meter.cc:822
 msgid "T"
 msgstr ""
 
-#: gain_meter.cc:802 panner_ui.cc:612
+#: gain_meter.cc:825
 msgid "W"
 msgstr ""
 
@@ -6330,47 +7340,51 @@ msgstr ""
 msgid "<span size=\"large\">Presets</span>"
 msgstr ""
 
-#: generic_pluginui.cc:97
+#: generic_pluginui.cc:98 plugin_pin_dialog.cc:333
 msgid "Manual"
 msgstr ""
 
-#: generic_pluginui.cc:106
+#: generic_pluginui.cc:107
 msgid "All Automation"
 msgstr ""
 
 #: generic_pluginui.cc:250
-msgid "Switches"
-msgstr ""
-
-#: generic_pluginui.cc:260 generic_pluginui.cc:436 processor_box.cc:2440
-msgid "Controls"
-msgstr "Πίνακας Ελέγχου"
-
-#: generic_pluginui.cc:293
 msgid "Plugin Editor: could not build control element for port %1"
 msgstr ""
 "Επεξεργαστής Plugin: δεν μπόρεσα να κτίσω στοιχείο ελέγχου για τη θύρα %1"
 
-#: generic_pluginui.cc:318
+#: generic_pluginui.cc:282
 msgid "Plugin Editor: no control for property %1"
 msgstr ""
 
-#: generic_pluginui.cc:324
+#: generic_pluginui.cc:288
 msgid "Plugin Editor: could not build control element for property %1"
 msgstr ""
 
-#: generic_pluginui.cc:468
+#: generic_pluginui.cc:359
+msgid "Switches"
+msgstr ""
+
+#: generic_pluginui.cc:369 generic_pluginui.cc:475 processor_box.cc:3653
+msgid "Controls"
+msgstr "Πίνακας Ελέγχου"
+
+#: generic_pluginui.cc:510
 msgid "Meters"
 msgstr ""
 
-#: generic_pluginui.cc:490
+#: generic_pluginui.cc:548
 msgid "Automation control"
 msgstr ""
 
-#: generic_pluginui.cc:497
+#: generic_pluginui.cc:555
 msgid "Mgnual"
 msgstr ""
 
+#: generic_pluginui.cc:828
+msgid "This control cannot be automated"
+msgstr ""
+
 #: global_port_matrix.cc:158
 msgid "Audio Connection Manager"
 msgstr ""
@@ -6379,126 +7393,163 @@ msgstr ""
 msgid "MIDI Connection Manager"
 msgstr ""
 
-#: global_port_matrix.cc:201 io_selector.cc:211 mixer_strip.cc:793
-#: mixer_strip.cc:894
+#: global_port_matrix.cc:201 io_selector.cc:211 mixer_strip.cc:863
+#: mixer_strip.cc:966 monitor_section.cc:1430 monitor_selector.cc:189
+#: plugin_pin_dialog.cc:1757
 msgid "Disconnect"
 msgstr "Αποσύνδεση"
 
-#: global_port_matrix.cc:207 io_selector.cc:217
+#: global_port_matrix.cc:207 io_selector.cc:217 monitor_selector.cc:195
 msgid "port"
 msgstr "θύρα"
 
-#: group_tabs.cc:312
+#: group_tabs.cc:312 group_tabs.cc:321
 msgid "Selection..."
 msgstr ""
 
-#: group_tabs.cc:313
+#: group_tabs.cc:313 group_tabs.cc:322
 msgid "Record Enabled..."
 msgstr ""
 
-#: group_tabs.cc:314
+#: group_tabs.cc:314 group_tabs.cc:323
 msgid "Soloed..."
 msgstr ""
 
-#: group_tabs.cc:320
+#: group_tabs.cc:316
+msgid "Create New Group From..."
+msgstr ""
+
+#: group_tabs.cc:325
+msgid "Create New Group with Master From..."
+msgstr ""
+
+#: group_tabs.cc:344
 msgid "Create New Group ..."
 msgstr ""
 
-#: group_tabs.cc:321
-msgid "Create New Group From"
+#: group_tabs.cc:345
+msgid "Create New Group with Control Master ..."
 msgstr ""
 
-#: group_tabs.cc:324
+#: group_tabs.cc:355
 msgid "Edit Group..."
 msgstr ""
 
-#: group_tabs.cc:325
+#: group_tabs.cc:356
 msgid "Collect Group"
 msgstr ""
 
-#: group_tabs.cc:326
+#: group_tabs.cc:357
 msgid "Remove Group"
 msgstr ""
 
-#: group_tabs.cc:329
+#: group_tabs.cc:368
+msgid "Assign Group to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:374
 msgid "Remove Subgroup Bus"
 msgstr ""
 
-#: group_tabs.cc:331
+#: group_tabs.cc:376
 msgid "Add New Subgroup Bus"
 msgstr ""
 
-#: group_tabs.cc:333
+#: group_tabs.cc:378
 msgid "Add New Aux Bus (pre-fader)"
 msgstr ""
 
-#: group_tabs.cc:334
+#: group_tabs.cc:379
 msgid "Add New Aux Bus (post-fader)"
 msgstr ""
 
-#: group_tabs.cc:340
+#: group_tabs.cc:404
+msgid "Assign Selection to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:415
+msgid "Assign Record Enabled to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:426
+msgid "Assign Soloed to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:429
 msgid "Enable All Groups"
 msgstr ""
 
-#: group_tabs.cc:341
+#: group_tabs.cc:430
 msgid "Disable All Groups"
 msgstr ""
 
-#: insert_time_dialog.cc:46
+#: insert_remove_time_dialog.cc:52
+msgid "Time to remove"
+msgstr ""
+
+#: insert_remove_time_dialog.cc:52
 msgid "Time to insert:"
 msgstr ""
 
-#: insert_time_dialog.cc:54
+#: insert_remove_time_dialog.cc:61
 msgid "Intersected regions should:"
 msgstr ""
 
-#: insert_time_dialog.cc:57
+#: insert_remove_time_dialog.cc:64
 msgid "stay in position"
 msgstr ""
 
-#: insert_time_dialog.cc:58
+#: insert_remove_time_dialog.cc:65
 msgid "move"
 msgstr ""
 
-#: insert_time_dialog.cc:59
+#: insert_remove_time_dialog.cc:66
 msgid "be split"
 msgstr ""
 
-#: insert_time_dialog.cc:65
-msgid "Insert time on all the track's playlists"
+#: insert_remove_time_dialog.cc:73
+msgid "Apply to all the track's playlists"
 msgstr ""
 
-#: insert_time_dialog.cc:68
+#: insert_remove_time_dialog.cc:76
 msgid "Move glued regions"
 msgstr ""
 
-#: insert_time_dialog.cc:70
+#: insert_remove_time_dialog.cc:78
 msgid "Move markers"
 msgstr ""
 
-#: insert_time_dialog.cc:73
+#: insert_remove_time_dialog.cc:81
 msgid "Move glued markers"
 msgstr ""
 
-#: insert_time_dialog.cc:78
+#: insert_remove_time_dialog.cc:86
 msgid "Move locked markers"
 msgstr ""
 
-#: insert_time_dialog.cc:83
+#: insert_remove_time_dialog.cc:91
 msgid ""
 "Move tempo and meter changes\n"
 "<i>(may cause oddities in the tempo map)</i>"
 msgstr ""
 
-#: insert_time_dialog.cc:91
+#: insert_remove_time_dialog.cc:99
+msgid "Remove time"
+msgstr ""
+
+#: insert_remove_time_dialog.cc:99
 msgid "Insert time"
 msgstr ""
 
-#: instrument_selector.cc:62
+#: insert_remove_time_dialog.cc:174
+msgid "Invalid or zero duration entered. Please enter a valid duration"
+msgstr ""
+
+#: instrument_selector.cc:92
 msgid "-none-"
 msgstr ""
 
-#: interthread_progress_window.cc:103
+#: interthread_progress_window.cc:114
 msgid "Importing file: %1 of %2"
 msgstr ""
 
@@ -6506,64 +7557,89 @@ msgstr ""
 msgid "I/O selector"
 msgstr ""
 
-#: io_selector.cc:266
+#: io_selector.cc:266 monitor_selector.cc:244
 msgid "%1 input"
 msgstr "%1 είσοδος"
 
-#: io_selector.cc:268
+#: io_selector.cc:268 monitor_selector.cc:246
 msgid "%1 output"
 msgstr "%1 έξοδος"
 
-#: keyboard.cc:70
+#: keyboard.cc:93
 msgid "your own"
 msgstr ""
 
-#: keyboard.cc:133 keyboard.cc:157
+#: keyboard.cc:157 keyboard.cc:181
 msgid "Default keybindings not found - %1 will be hard to use!"
 msgstr ""
 
-#: keyboard.cc:136
+#: keyboard.cc:160
 msgid "Key bindings file \"%1\" not found. Default bindings used instead"
 msgstr ""
 
-#: keyeditor.cc:54
+#: keyboard.cc:193
+msgid "Loading keybindings from %1"
+msgstr ""
+
+#: keyeditor.cc:67
+msgid "Colliding keybindings"
+msgstr ""
+
+#: keyeditor.cc:68
+msgid ""
+"The key sequence is already bound. Please remove the other binding first."
+msgstr ""
+
+#: keyeditor.cc:77
+msgid "Key Bindings"
+msgstr ""
+
+#: keyeditor.cc:78
 msgid "Remove shortcut"
 msgstr ""
 
-#: keyeditor.cc:63
-msgid "Action"
+#: keyeditor.cc:80
+msgid "Search..."
 msgstr ""
 
-#: keyeditor.cc:64
-msgid "Shortcut"
+#: keyeditor.cc:82
+msgid "Print"
 msgstr ""
 
-#: keyeditor.cc:84
-msgid "Select an action, then press the key(s) to (re)set its shortcut"
+#: keyeditor.cc:93
+msgid "Click to reset search string"
 msgstr ""
 
-#: keyeditor.cc:98
-msgid "Reset Bindings to Defaults"
+#: keyeditor.cc:97
+msgid "To remove a shortcut select an action then press this: "
 msgstr ""
 
-#: keyeditor.cc:263
-msgid "Main_menu"
+#: keyeditor.cc:109
+msgid "Reset Bindings to Defaults"
 msgstr ""
 
-#: keyeditor.cc:265
-msgid "redirectmenu"
+#: keyeditor.cc:227 lua_script_manager.cc:41
+msgid "Action"
 msgstr ""
 
-#: keyeditor.cc:267
-msgid "Editor_menus"
+#: keyeditor.cc:228
+msgid "Shortcut"
 msgstr ""
 
-#: keyeditor.cc:269
+#: keyeditor.cc:370
 msgid "RegionList"
 msgstr ""
 
-#: keyeditor.cc:271
-msgid "ProcessorMenu"
+#: keyeditor.cc:543
+msgid "Could not open temporary file to print bindings (%1)"
+msgstr ""
+
+#: keyeditor.cc:561
+msgid "Could not save bindings to file (%1)"
+msgstr ""
+
+#: latency_gui.cc:39
+msgid "sample"
 msgstr ""
 
 #: latency_gui.cc:40
@@ -6574,109 +7650,218 @@ msgstr ""
 msgid "period"
 msgstr ""
 
-#: latency_gui.cc:55
-msgid "%1 sample"
-msgid_plural "%1 samples"
-msgstr[0] ""
-msgstr[1] ""
-
-#: latency_gui.cc:72 panner_ui.cc:409
+#: latency_gui.cc:72 panner_ui.cc:411 plugin_pin_dialog.cc:109
+#: plugin_ui.cc:421
 msgid "Reset"
 msgstr ""
 
-#: latency_gui.cc:149 rhythm_ferret.cc:273 sfdb_ui.cc:1912
+#: latency_gui.cc:149 rhythm_ferret.cc:295 sfdb_ui.cc:1878
 msgid "programming error: %1 (%2)"
 msgstr ""
 
-#: location_ui.cc:52 location_ui.cc:54
+#: location_ui.cc:54 location_ui.cc:57
 msgid "Use PH"
 msgstr ""
 
-#: location_ui.cc:59
+#: location_ui.cc:55 location_ui.cc:58
+msgid "Goto"
+msgstr ""
+
+#: location_ui.cc:63
 msgid "Glue"
 msgstr ""
 
-#: location_ui.cc:87
+#: location_ui.cc:88
 msgid "Performer:"
 msgstr ""
 
-#: location_ui.cc:88
+#: location_ui.cc:89
 msgid "Composer:"
 msgstr ""
 
-#: location_ui.cc:90
+#: location_ui.cc:91
 msgid "Pre-Emphasis"
 msgstr ""
 
-#: location_ui.cc:317
+#: location_ui.cc:319
 msgid "Remove this range"
 msgstr ""
 
-#: location_ui.cc:318
+#: location_ui.cc:320
 msgid "Start time - middle click to locate here"
 msgstr ""
 
-#: location_ui.cc:319
+#: location_ui.cc:321
 msgid "End time - middle click to locate here"
 msgstr ""
 
-#: location_ui.cc:322
+#: location_ui.cc:324
 msgid "Set range start from playhead location"
 msgstr ""
 
-#: location_ui.cc:323
+#: location_ui.cc:325
 msgid "Set range end from playhead location"
 msgstr ""
 
-#: location_ui.cc:327
+#: location_ui.cc:329
 msgid "Remove this marker"
 msgstr ""
 
-#: location_ui.cc:328
+#: location_ui.cc:330
 msgid "Position - middle click to locate here"
 msgstr ""
 
-#: location_ui.cc:330
+#: location_ui.cc:332
 msgid "Set marker time from playhead location"
 msgstr ""
 
-#: location_ui.cc:499
+#: location_ui.cc:524
 msgid "You cannot put a CD marker at the start of the session"
 msgstr ""
 
-#: location_ui.cc:725
+#: location_ui.cc:750
 msgid "New Marker"
 msgstr ""
 
-#: location_ui.cc:726
+#: location_ui.cc:751
 msgid "New Range"
 msgstr ""
 
-#: location_ui.cc:739
+#: location_ui.cc:764
 msgid "<b>Loop/Punch Ranges</b>"
 msgstr ""
 
-#: location_ui.cc:764
+#: location_ui.cc:790
 msgid "<b>Markers (Including CD Index)</b>"
 msgstr ""
 
-#: location_ui.cc:799
+#: location_ui.cc:825
 msgid "<b>Ranges (Including CD Track Ranges)</b>"
 msgstr ""
 
-#: location_ui.cc:1042
+#: location_ui.cc:1068
 msgid "add range marker"
 msgstr "πρόσθεση στίγματος διαστήματος"
 
-#: main.cc:82
+#: lua_script_manager.cc:31
+msgid "Add/Set"
+msgstr ""
+
+#: lua_script_manager.cc:34
+msgid "Call"
+msgstr ""
+
+#: lua_script_manager.cc:35
+msgid "New Hook"
+msgstr ""
+
+#: lua_script_manager.cc:77
+msgid "Signal(s)"
+msgstr ""
+
+#: lua_script_manager.cc:127
+msgid "Action %1"
+msgstr ""
+
+#: lua_script_manager.cc:132 lua_script_manager.cc:227
+msgid "Unset"
+msgstr ""
+
+#: luainstance.cc:1079
+msgid "Cannot read script '%1': %2"
+msgstr ""
+
+#: luawindow.cc:97
+msgid "Run"
+msgstr ""
+
+#: luawindow.cc:98
+msgid "Clear Output"
+msgstr ""
+
+#: luawindow.cc:102
+msgid "Revert"
+msgstr ""
+
+#: luawindow.cc:166
+msgid "Select Editor Buffer"
+msgstr ""
+
+#: luawindow.cc:253 luawindow.cc:258
+msgid "Window|Lua"
+msgstr ""
+
+#: luawindow.cc:286 luawindow.cc:304
+msgid "LuaException: %1"
+msgstr ""
+
+#: luawindow.cc:342
+msgid "Deleted %1"
+msgstr ""
+
+#: luawindow.cc:345
+msgid "Failed to delete %1"
+msgstr ""
+
+#: luawindow.cc:411
+msgid ""
+"Missing script header.\n"
+"The script requires an '{ardour}' info table and a 'factory' function."
+msgstr ""
+
+#: luawindow.cc:416
+msgid "Script fails to compile."
+msgstr ""
+
+#: luawindow.cc:423
+msgid "Invalid or missing script-name or script-type."
+msgstr ""
+
+#: luawindow.cc:428
+msgid ""
+"Invalid script-type.\n"
+"Valid types are 'EditorAction' and 'Snippet'."
+msgstr ""
+
+#: luawindow.cc:439 luawindow.cc:490
+msgid "Saved as %1"
+msgstr ""
+
+#: luawindow.cc:442 luawindow.cc:493
+msgid "Error saving file: %1"
+msgstr ""
+
+#: luawindow.cc:452
+msgid ""
+"Script with given name '%1' already exists.\n"
+"Use a different name in the descriptor."
+msgstr ""
+
+#: luawindow.cc:636
+msgid "Scratch Buffer %1"
+msgstr ""
+
+#: luawindow.cc:638
+msgid "Action: '%1'"
+msgstr ""
+
+#: luawindow.cc:640
+msgid "Snippet: %1"
+msgstr ""
+
+#: luawindow.cc:652
+msgid "Save as"
+msgstr ""
+
+#: main.cc:88
 msgid "%1 could not connect to the audio backend."
 msgstr ""
 
-#: main.cc:107 main.cc:123
+#: main.cc:135 main.cc:151
 msgid "The audio backend (%1) has failed, or terminated"
 msgstr ""
 
-#: main.cc:110
+#: main.cc:138
 msgid ""
 "%2 exited unexpectedly, and without notifying %1.\n"
 "\n"
@@ -6685,80 +7870,100 @@ msgid ""
 "Click OK to exit %1."
 msgstr ""
 
-#: main.cc:124
+#: main.cc:152
 msgid "%2 exited unexpectedly, and without notifying %1."
 msgstr ""
 
-#: main.cc:219
+#: main.cc:247
 msgid ""
 "\n"
 "   %1 could not understand your command line      "
 msgstr ""
 
-#: main.cc:221
+#: main.cc:249
 msgid "An error was encountered while launching %1"
 msgstr ""
 
-#: main.cc:310
+#: main.cc:344
 msgid " (built using "
 msgstr ""
 
-#: main.cc:313
+#: main.cc:347
 msgid " and GCC version "
 msgstr ""
 
-#: main.cc:323
-msgid "Copyright (C) 1999-2012 Paul Davis"
+#: main.cc:357
+msgid "Copyright (C) 1999-2015 Paul Davis"
 msgstr ""
 
-#: main.cc:324
+#: main.cc:358
 msgid ""
 "Some portions Copyright (C) Steve Harris, Ari Johnson, Brett Viren, Joel "
 "Baker, Robin Gareus"
 msgstr ""
 
-#: main.cc:326
+#: main.cc:360
 msgid "%1 comes with ABSOLUTELY NO WARRANTY"
 msgstr ""
 
-#: main.cc:327
+#: main.cc:361
 msgid "not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
 msgstr ""
 
-#: main.cc:328
+#: main.cc:362
 msgid "This is free software, and you are welcome to redistribute it "
 msgstr ""
 "Το παρόν είναι ελεύθερο λογισμικό, είστε ελεύθεροι να το επαναδιανείμετε "
 
-#: main.cc:329
+#: main.cc:363
 msgid "under certain conditions; see the source for copying conditions."
 msgstr ""
 "υπό ορισμένους όρους, ανατρέξτε στον κώδικα για τους όρους\n"
 " αντιγραφής."
 
-#: main.cc:334
+#: main.cc:368
 msgid "could not initialize %1."
 msgstr ""
 
-#: main.cc:344
+#: main.cc:378
 msgid "Cannot xinstall SIGPIPE error handler"
 msgstr ""
 
-#: main.cc:351
+#: main.cc:385
+msgid "Could not complete pre-GUI initialization"
+msgstr ""
+
+#: main.cc:392
 msgid "could not create %1 GUI"
 msgstr ""
 
-#: main_clock.cc:52
+#: main_clock.cc:51
 msgid "Display delta to edit cursor"
 msgstr ""
 
-#: marker.cc:273
+#: main_clock.cc:66 tempo_dialog.cc:55
+msgid "Edit Tempo"
+msgstr ""
+
+#: main_clock.cc:67 tempo_dialog.cc:429
+msgid "Edit Meter"
+msgstr ""
+
+#: main_clock.cc:68
+msgid "Insert Tempo Change"
+msgstr ""
+
+#: main_clock.cc:69
+msgid "Insert Meter Change"
+msgstr ""
+
+#: marker.cc:280
 msgid "MarkerText"
 msgstr "ΚείμενοΣτίγματος"
 
 #: midi_channel_selector.cc:161 midi_channel_selector.cc:400
-#: midi_channel_selector.cc:436 rc_option_editor.cc:1573
-#: rc_option_editor.cc:2203 sfdb_ui.cc:665
+#: midi_channel_selector.cc:436 rc_option_editor.cc:2157
+#: rc_option_editor.cc:2799 sfdb_ui.cc:671
 msgid "None"
 msgstr "Ουδέν"
 
@@ -6839,11 +8044,11 @@ msgstr ""
 msgid "Click to force all MIDI channel messages to channel %1"
 msgstr ""
 
-#: midi_channel_selector.cc:718
+#: midi_channel_selector.cc:720
 msgid "Click to toggle recording of channel %1"
 msgstr ""
 
-#: midi_channel_selector.cc:726
+#: midi_channel_selector.cc:728
 msgid "Click to force all recorded channels to %1"
 msgstr ""
 
@@ -6955,192 +8160,188 @@ msgstr ""
 msgid "velocity edit"
 msgstr ""
 
-#: midi_region_view.cc:954
+#: midi_region_view.cc:962
 msgid "add note"
 msgstr ""
 
-#: midi_region_view.cc:1885
+#: midi_region_view.cc:1904
 msgid "step add"
 msgstr ""
 
-#: midi_region_view.cc:1979 midi_region_view.cc:2002
+#: midi_region_view.cc:1998 midi_region_view.cc:2021
 msgid "alter patch change"
 msgstr ""
 
-#: midi_region_view.cc:2038
+#: midi_region_view.cc:2057
 msgid "add patch change"
 msgstr ""
 
-#: midi_region_view.cc:2060 midi_region_view.cc:2061
+#: midi_region_view.cc:2079 midi_region_view.cc:2080
 msgid "move patch change"
 msgstr ""
 
-#: midi_region_view.cc:2073 midi_region_view.cc:2074
+#: midi_region_view.cc:2092 midi_region_view.cc:2093
 msgid "delete patch change"
 msgstr ""
 
-#: midi_region_view.cc:2112
+#: midi_region_view.cc:2131
 msgid "delete selection"
 msgstr ""
 
-#: midi_region_view.cc:2128
+#: midi_region_view.cc:2148
 msgid "delete note"
 msgstr ""
 
-#: midi_region_view.cc:2587
+#: midi_region_view.cc:2589
 msgid "move notes"
 msgstr ""
 
-#: midi_region_view.cc:3070
+#: midi_region_view.cc:3139
 msgid "change velocities"
 msgstr ""
 
-#: midi_region_view.cc:3136
+#: midi_region_view.cc:3205
 msgid "transpose"
 msgstr ""
 
-#: midi_region_view.cc:3164
+#: midi_region_view.cc:3233
 msgid "change note lengths"
 msgstr ""
 
-#: midi_region_view.cc:3240
+#: midi_region_view.cc:3309
 msgid "nudge"
 msgstr ""
 
-#: midi_region_view.cc:3255
+#: midi_region_view.cc:3324
 msgid "change channel"
 msgstr ""
 
-#: midi_region_view.cc:3295
+#: midi_region_view.cc:3372
 msgid "Bank "
 msgstr ""
 
-#: midi_region_view.cc:3296
-msgid "Program "
-msgstr ""
-
-#: midi_region_view.cc:3297
+#: midi_region_view.cc:3374
 msgid "Channel "
 msgstr ""
 
-#: midi_region_view.cc:3484
+#: midi_region_view.cc:3561
 msgid "paste"
 msgstr "επικόλληση"
 
-#: midi_streamview.cc:185
+#: midi_streamview.cc:184
 msgid "attempt to display MIDI region with no source"
 msgstr ""
 
-#: midi_streamview.cc:195
+#: midi_streamview.cc:194
 msgid "attempt to display MIDI region with no model"
 msgstr ""
 
-#: midi_streamview.cc:506
+#: midi_streamview.cc:505
 msgid "failed to create MIDI region"
 msgstr ""
 
-#: midi_time_axis.cc:309
+#: midi_time_axis.cc:306
 msgid "External MIDI Device"
 msgstr ""
 
-#: midi_time_axis.cc:310
+#: midi_time_axis.cc:307
 msgid "External Device Mode"
 msgstr ""
 
-#: midi_time_axis.cc:318
+#: midi_time_axis.cc:315
 msgid "Chns"
 msgstr ""
 
-#: midi_time_axis.cc:320
+#: midi_time_axis.cc:317
 msgid "Click to edit channel settings"
 msgstr ""
 
-#: midi_time_axis.cc:519
+#: midi_time_axis.cc:516
 msgid "Show Full Range"
 msgstr ""
 
-#: midi_time_axis.cc:524
+#: midi_time_axis.cc:521
 msgid "Fit Contents"
 msgstr ""
 
-#: midi_time_axis.cc:528
+#: midi_time_axis.cc:525
 msgid "Note Range"
 msgstr ""
 
-#: midi_time_axis.cc:529
+#: midi_time_axis.cc:526
 msgid "Note Mode"
 msgstr ""
 
-#: midi_time_axis.cc:530
+#: midi_time_axis.cc:527
 msgid "Channel Selector"
 msgstr ""
 
-#: midi_time_axis.cc:535
+#: midi_time_axis.cc:532
 msgid "Color Mode"
 msgstr ""
 
-#: midi_time_axis.cc:594
+#: midi_time_axis.cc:591
 msgid "Bender"
 msgstr ""
 
-#: midi_time_axis.cc:598
+#: midi_time_axis.cc:595
 msgid "Pressure"
 msgstr ""
 
-#: midi_time_axis.cc:610
+#: midi_time_axis.cc:607
 msgid "Controllers"
 msgstr ""
 
-#: midi_time_axis.cc:615
+#: midi_time_axis.cc:612
 msgid "No MIDI Channels selected"
 msgstr ""
 
-#: midi_time_axis.cc:672 midi_time_axis.cc:801
+#: midi_time_axis.cc:669 midi_time_axis.cc:798
 msgid "Hide all channels"
 msgstr ""
 
-#: midi_time_axis.cc:676 midi_time_axis.cc:805
+#: midi_time_axis.cc:673 midi_time_axis.cc:802
 msgid "Show all channels"
 msgstr ""
 
-#: midi_time_axis.cc:687 midi_time_axis.cc:816
+#: midi_time_axis.cc:684 midi_time_axis.cc:813
 msgid "Channel %1"
 msgstr ""
 
-#: midi_time_axis.cc:942 midi_time_axis.cc:974
+#: midi_time_axis.cc:939 midi_time_axis.cc:971
 msgid "Controllers %1-%2"
 msgstr ""
 
-#: midi_time_axis.cc:965 midi_time_axis.cc:968
+#: midi_time_axis.cc:962 midi_time_axis.cc:965
 msgid "Controller %1"
 msgstr ""
 
-#: midi_time_axis.cc:991
+#: midi_time_axis.cc:988
 msgid "Sustained"
 msgstr ""
 
-#: midi_time_axis.cc:998
+#: midi_time_axis.cc:995
 msgid "Percussive"
 msgstr ""
 
-#: midi_time_axis.cc:1018
+#: midi_time_axis.cc:1015
 msgid "Meter Colors"
 msgstr ""
 
-#: midi_time_axis.cc:1025
+#: midi_time_axis.cc:1022
 msgid "Channel Colors"
 msgstr ""
 
-#: midi_time_axis.cc:1032
+#: midi_time_axis.cc:1029
 msgid "Track Color"
 msgstr ""
 
-#: midi_time_axis.cc:1606 midi_time_axis.cc:1612 midi_time_axis.cc:1622
-#: midi_time_axis.cc:1628
+#: midi_time_axis.cc:1610 midi_time_axis.cc:1616 midi_time_axis.cc:1626
+#: midi_time_axis.cc:1632
 msgid "all"
 msgstr ""
 
-#: midi_time_axis.cc:1609 midi_time_axis.cc:1625
+#: midi_time_axis.cc:1613 midi_time_axis.cc:1629
 msgid "some"
 msgstr ""
 
@@ -7156,7 +8357,7 @@ msgstr ""
 msgid "Decimal"
 msgstr ""
 
-#: midi_tracer.cc:57 rc_option_editor.cc:740
+#: midi_tracer.cc:57 rc_option_editor.cc:1356
 msgid "Enabled"
 msgstr ""
 
@@ -7172,35 +8373,36 @@ msgstr ""
 msgid "New velocity"
 msgstr ""
 
-#: missing_file_dialog.cc:35
+#: missing_file_dialog.cc:36
 msgid "Missing File"
 msgstr ""
 
-#: missing_file_dialog.cc:37
+#: missing_file_dialog.cc:38
 msgid "Select a folder to search"
 msgstr ""
 
-#: missing_file_dialog.cc:38
+#: missing_file_dialog.cc:39
 msgid "Add chosen folder to search path, and try again"
 msgstr ""
 
-#: missing_file_dialog.cc:40
+#: missing_file_dialog.cc:41
 msgid "Stop loading this session"
 msgstr ""
 
-#: missing_file_dialog.cc:41
+#: missing_file_dialog.cc:42
 msgid "Skip all missing files"
 msgstr ""
 
-#: missing_file_dialog.cc:42
+#: missing_file_dialog.cc:43
 msgid "Skip this file"
 msgstr ""
 
-#: missing_file_dialog.cc:53
+#: missing_file_dialog.cc:57 tempo_dialog.cc:135 tempo_dialog.cc:136
+#: tempo_dialog.cc:484 tempo_dialog.cc:485
 msgid "audio"
 msgstr ""
 
-#: missing_file_dialog.cc:70
+#: missing_file_dialog.cc:74
 msgid ""
 "%1 cannot find the %2 file\n"
 "\n"
@@ -7212,7 +8414,7 @@ msgid ""
 "\n"
 msgstr ""
 
-#: missing_file_dialog.cc:104
+#: missing_file_dialog.cc:108
 msgid "Click to choose an additional folder"
 msgstr ""
 
@@ -7220,516 +8422,706 @@ msgstr ""
 msgid "Missing Plugins"
 msgstr ""
 
-#: missing_plugin_dialog.cc:33 transcode_video_dialog.cc:60
+#: missing_plugin_dialog.cc:36 transcode_video_dialog.cc:60
 msgid "OK"
 msgstr "OK"
 
-#: mixer_actor.cc:55
-msgid "Toggle Solo on Mixer-Selected Tracks/Busses"
-msgstr ""
-
-#: mixer_actor.cc:56
-msgid "Toggle Mute on Mixer-Selected Tracks/Busses"
-msgstr ""
-
-#: mixer_actor.cc:57
-msgid "Toggle Rec-enable on Mixer-Selected Tracks/Busses"
-msgstr ""
-
-#: mixer_actor.cc:58
-msgid "Decrease Gain on Mixer-Selected Tracks/Busses"
-msgstr ""
-
-#: mixer_actor.cc:59
-msgid "Increase Gain on Mixer-Selected Tracks/Busses"
-msgstr ""
-
-#: mixer_actor.cc:60
-msgid "Set Gain to 0dB on Mixer-Selected Tracks/Busses"
-msgstr ""
-
-#: mixer_actor.cc:63
-msgid "Copy Selected Processors"
-msgstr ""
-
-#: mixer_actor.cc:64
-msgid "Cut Selected Processors"
-msgstr ""
-
-#: mixer_actor.cc:65
-msgid "Paste Selected Processors"
-msgstr ""
-
-#: mixer_actor.cc:66
-msgid "Delete Selected Processors"
-msgstr ""
-
-#: mixer_actor.cc:67
-msgid "Select All (visible) Processors"
-msgstr ""
-
-#: mixer_actor.cc:68
-msgid "Toggle Selected Processors"
-msgstr ""
-
-#: mixer_actor.cc:69
-msgid "Toggle Selected Plugins"
-msgstr ""
-
-#: mixer_actor.cc:70
-msgid "Deselect all strips and processors"
-msgstr ""
-
-#: mixer_actor.cc:72 mixer_actor.cc:73
-msgid "Scroll Mixer Window to the left"
-msgstr ""
-
-#: mixer_actor.cc:75
-msgid "Toggle MIDI Input Active for Mixer-Selected Tracks/Busses"
-msgstr ""
-
-#: mixer_actor.cc:90
-msgid "Loaded mixer bindings from %1"
+#: missing_plugin_dialog.cc:42
+msgid ""
+"This session contains the following plugins that cannot be found on this "
+"system:\n"
+"\n"
 msgstr ""
 
-#: mixer_actor.cc:92
-msgid "Could not find mixer.bindings in search path %1"
+#: missing_plugin_dialog.cc:48
+msgid ""
+"\n"
+"Those plugins will be replaced with inactive stubs.\n"
+"It is recommended that you install the missing plugins and re-load the "
+"session.\n"
+"(also check the blacklist, Window > Log and Preferences > Plugins)"
 msgstr ""
 
-#: mixer_strip.cc:96 mixer_strip.cc:125
+#: mixer_strip.cc:100 mixer_strip.cc:133
 msgid "pre"
 msgstr "προ"
 
-#: mixer_strip.cc:98 mixer_strip.cc:127 mixer_strip.cc:372 mixer_strip.cc:1410
-#: rc_option_editor.cc:2331
+#: mixer_strip.cc:104 mixer_strip.cc:136 mixer_strip.cc:397
+#: mixer_strip.cc:1540 mixer_strip.cc:1551 rc_option_editor.cc:3140
 msgid "Comments"
 msgstr ""
 
-#: mixer_strip.cc:149
+#: mixer_strip.cc:160
 msgid "Click to toggle the width of this mixer strip."
 msgstr ""
 
-#: mixer_strip.cc:151
+#: mixer_strip.cc:162
 msgid ""
 "\n"
 "%1-%2-click to toggle the width of all strips."
 msgstr ""
 
-#: mixer_strip.cc:158
+#: mixer_strip.cc:171
 msgid "Hide this mixer strip"
 msgstr ""
 
-#: mixer_strip.cc:169
+#: mixer_strip.cc:182
 msgid "Click to select metering point"
 msgstr ""
 
-#: mixer_strip.cc:185
+#: mixer_strip.cc:198
 msgid "Isolate Solo"
 msgstr ""
 
-#: mixer_strip.cc:193
+#: mixer_strip.cc:206
 msgid "Lock Solo Status"
 msgstr ""
 
-#: mixer_strip.cc:196 mixer_strip.cc:2027
+#: mixer_strip.cc:208 mixer_strip.cc:2217
+msgid "SoloLock|Lock"
+msgstr ""
+
+#: mixer_strip.cc:209 mixer_strip.cc:2216
 msgid "Iso"
 msgstr ""
 
-#: mixer_strip.cc:250
+#: mixer_strip.cc:263
 msgid "Mix group"
 msgstr ""
 
-#: mixer_strip.cc:368 rc_option_editor.cc:2327
+#: mixer_strip.cc:275
+msgid "Trim: "
+msgstr ""
+
+#: mixer_strip.cc:393 rc_option_editor.cc:3136
 msgid "Phase Invert"
 msgstr ""
 
-#: mixer_strip.cc:369 rc_option_editor.cc:2328
+#: mixer_strip.cc:394 rc_option_editor.cc:3137
 msgid "Record & Monitor"
 msgstr ""
 
-#: mixer_strip.cc:370 rc_option_editor.cc:2329
+#: mixer_strip.cc:395 rc_option_editor.cc:3138
 msgid "Solo Iso / Lock"
 msgstr ""
 
-#: mixer_strip.cc:524
+#: mixer_strip.cc:398 rc_option_editor.cc:3141
+msgid "VCA Assigns"
+msgstr ""
+
+#: mixer_strip.cc:531
+msgid "Show/Hide Monitoring Section"
+msgstr ""
+
+#: mixer_strip.cc:583
 msgid "Enable/Disable MIDI input"
 msgstr ""
 
-#: mixer_strip.cc:688
+#: mixer_strip.cc:749
 msgid "Aux"
 msgstr ""
 
-#: mixer_strip.cc:710
+#: mixer_strip.cc:775
 msgid "Snd"
 msgstr ""
 
-#: mixer_strip.cc:776 mixer_strip.cc:879 processor_box.cc:2382
+#: mixer_strip.cc:846 mixer_strip.cc:951 processor_box.cc:3594
 msgid "Not connected to audio engine - no I/O changes are possible"
 msgstr ""
 
-#: mixer_strip.cc:833 mixer_strip.cc:935
+#: mixer_strip.cc:904 mixer_strip.cc:1007
 msgid "Add %1 port"
 msgstr ""
 
-#: mixer_strip.cc:840 mixer_strip.cc:942
+#: mixer_strip.cc:912 mixer_strip.cc:1014 monitor_section.cc:1466
+#: plugin_pin_dialog.cc:1782
 msgid "Routing Grid"
 msgstr ""
 
-#: mixer_strip.cc:1171
+#: mixer_strip.cc:1291
+msgid "MIDI "
+msgstr ""
+
+#: mixer_strip.cc:1295
 msgid "<b>INPUT</b> to %1"
 msgstr ""
 
-#: mixer_strip.cc:1174
+#: mixer_strip.cc:1297 monitor_section.cc:1511
 msgid "<b>OUTPUT</b> from %1"
 msgstr ""
 
-#: mixer_strip.cc:1287
+#: mixer_strip.cc:1410 monitor_section.cc:1598
 msgid "Disconnected"
 msgstr ""
 
-#: mixer_strip.cc:1413
-msgid "*Comments*"
-msgstr "*Σχόλια*"
-
-#: mixer_strip.cc:1420
-msgid "Cmt"
+#: mixer_strip.cc:1536
+msgid "Click to add/edit comments"
 msgstr ""
 
-#: mixer_strip.cc:1423
-msgid "*Cmt*"
+#: mixer_strip.cc:1540 mixer_strip.cc:1551
+msgid "Cmt"
 msgstr ""
 
-#: mixer_strip.cc:1429
-msgid "Click to Add/Edit Comments"
-msgstr "Κλίκ για Πρόσθεση/Επεξεργασία Σχολίων"
-
-#: mixer_strip.cc:1473
+#: mixer_strip.cc:1596
 msgid "Grp"
 msgstr ""
 
-#: mixer_strip.cc:1476
+#: mixer_strip.cc:1599
 msgid "~G"
 msgstr "~G"
 
-#: mixer_strip.cc:1505 route_time_axis.cc:561
+#: mixer_strip.cc:1640 route_time_axis.cc:585 vca_master_strip.cc:396
 msgid "Color..."
 msgstr ""
 
-#: mixer_strip.cc:1507 route_time_axis.cc:563
+#: mixer_strip.cc:1642 route_time_axis.cc:587
 msgid "Comments..."
 msgstr ""
 
-#: mixer_strip.cc:1509 route_time_axis.cc:565
+#: mixer_strip.cc:1644 route_time_axis.cc:589
 msgid "Inputs..."
 msgstr ""
 
-#: mixer_strip.cc:1511 route_time_axis.cc:567
+#: mixer_strip.cc:1646 route_time_axis.cc:591
 msgid "Outputs..."
 msgstr ""
 
-#: mixer_strip.cc:1516
+#: mixer_strip.cc:1651
 msgid "Save As Template..."
 msgstr ""
 
-#: mixer_strip.cc:1530
+#: mixer_strip.cc:1657 route_group_dialog.cc:45 route_time_axis.cc:851
+msgid "Active"
+msgstr "Ενεργό"
+
+#: mixer_strip.cc:1665 plugin_pin_dialog.cc:1011
+msgid "Strict I/O"
+msgstr ""
+
+#: mixer_strip.cc:1675 processor_box.cc:3698
+msgid "Pin Connections..."
+msgstr ""
+
+#: mixer_strip.cc:1679
 msgid "Adjust Latency..."
 msgstr ""
 
-#: mixer_strip.cc:1533
+#: mixer_strip.cc:1682
 msgid "Protect Against Denormals"
 msgstr ""
 
-#: mixer_strip.cc:1539 route_time_axis.cc:580
-msgid "Remote Control ID..."
+#: mixer_strip.cc:1701 route_time_axis.cc:867
+msgid "Duplicate..."
 msgstr ""
 
-#: mixer_strip.cc:1823
+#: mixer_strip.cc:1996
 msgid "Pre"
 msgstr ""
 
-#: mixer_strip.cc:1827
+#: mixer_strip.cc:2000
 msgid "Post"
 msgstr ""
 
-#: mixer_strip.cc:1847
-msgid "Pr"
+#: mixer_strip.cc:2016
+msgid "Meter|In"
+msgstr ""
+
+#: mixer_strip.cc:2020
+msgid "Meter|Pr"
+msgstr ""
+
+#: mixer_strip.cc:2024
+msgid "Meter|Po"
 msgstr ""
 
-#: mixer_strip.cc:1851
-msgid "Po"
+#: mixer_strip.cc:2028
+msgid "Meter|O"
 msgstr ""
 
-#: mixer_strip.cc:1860
-msgid "C"
+#: mixer_strip.cc:2033
+msgid "Meter|C"
 msgstr ""
 
-#: mixer_strip.cc:2008 route_ui.cc:168
+#: mixer_strip.cc:2194 route_ui.cc:193
 msgid "Disk"
 msgstr ""
 
-#: mixer_strip.cc:2020 monitor_section.cc:70
+#: mixer_strip.cc:2196
+msgid "Mon"
+msgstr ""
+
+#: mixer_strip.cc:2209 monitor_section.cc:81
 msgid "AFL"
 msgstr ""
 
-#: mixer_strip.cc:2023 monitor_section.cc:71
+#: mixer_strip.cc:2212 monitor_section.cc:82
 msgid "PFL"
 msgstr ""
 
-#: mixer_strip.cc:2034 meter_strip.cc:380
-msgid "D"
+#: mixer_strip.cc:2222 meter_strip.cc:385
+msgid "MonitorInput|I"
+msgstr ""
+
+#: mixer_strip.cc:2223 meter_strip.cc:386
+msgid "MonitorDisk|D"
+msgstr ""
+
+#: mixer_strip.cc:2225
+msgid "Mon|O"
+msgstr ""
+
+#: mixer_strip.cc:2238 meter_strip.cc:377 route_time_axis.cc:2730
+#: vca_master_strip.cc:202 vca_time_axis.cc:227
+msgid "AfterFader|A"
 msgstr ""
 
 #: mixer_strip.cc:2241
+msgid "Prefader|P"
+msgstr ""
+
+#: mixer_strip.cc:2246
+msgid "SoloIso|I"
+msgstr ""
+
+#: mixer_strip.cc:2247
+msgid "SoloLock|L"
+msgstr ""
+
+#: mixer_strip.cc:2452
 msgid "Pre Fader"
 msgstr "Προ Fader"
 
-#: mixer_strip.cc:2242
+#: mixer_strip.cc:2453
 msgid "Post Fader"
 msgstr "Μετά Fader"
 
-#: mixer_strip.cc:2286 meter_strip.cc:847
+#: mixer_strip.cc:2498 meter_strip.cc:858
 msgid "Change all in Group to %1"
 msgstr ""
 
-#: mixer_strip.cc:2288 meter_strip.cc:849
+#: mixer_strip.cc:2500 meter_strip.cc:860
 msgid "Change all to %1"
 msgstr ""
 
-#: mixer_strip.cc:2290 meter_strip.cc:851
+#: mixer_strip.cc:2502 meter_strip.cc:862
 msgid "Change same track-type to %1"
 msgstr ""
 
-#: mixer_ui.cc:130 route_time_axis.cc:818
+#: mixer_ui.cc:152 route_time_axis.cc:828
 msgid "Group"
 msgstr ""
 
-#: mixer_ui.cc:1224
+#: mixer_ui.cc:221
+msgid "Favorite Plugins"
+msgstr ""
+
+#: mixer_ui.cc:627
+msgid "Error adding GUI elements for new tracks/busses %1"
+msgstr ""
+
+#: mixer_ui.cc:1542
 msgid "track display list item for renamed strip not found!"
 msgstr "Λίστα αναδείξεως καναλιών για μετονομασμένο διάδρομο δεν ευρέθη!"
 
-#: mixer_ui.cc:1316
+#: mixer_ui.cc:1636
 msgid "-all-"
 msgstr "-όλα-"
 
-#: mixer_ui.cc:1853
+#: mixer_ui.cc:2135
 msgid "Strips"
 msgstr "Διάδρομοι"
 
-#: meter_strip.cc:157
+#: mixer_ui.cc:2479
+msgid "No Track/Bus is selected."
+msgstr ""
+
+#: mixer_ui.cc:2481
+msgid "Add at the top"
+msgstr ""
+
+#: mixer_ui.cc:2483
+msgid "Add Pre-Fader"
+msgstr ""
+
+#: mixer_ui.cc:2485
+msgid "Add Post-Fader"
+msgstr ""
+
+#: mixer_ui.cc:2487
+msgid "Add at the end"
+msgstr ""
+
+#: mixer_ui.cc:2493
+msgid "Remove from favorites"
+msgstr ""
+
+#: mixer_ui.cc:2499
+msgid "Delete Preset"
+msgstr ""
+
+#: mixer_ui.cc:2739
+msgid "Toggle Solo on Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: mixer_ui.cc:2740
+msgid "Toggle Mute on Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: mixer_ui.cc:2741
+msgid "Toggle Rec-enable on Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: mixer_ui.cc:2742
+msgid "Decrease Gain on Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: mixer_ui.cc:2743
+msgid "Increase Gain on Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: mixer_ui.cc:2744
+msgid "Set Gain to 0dB on Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: mixer_ui.cc:2747
+msgid "Copy Selected Processors"
+msgstr ""
+
+#: mixer_ui.cc:2748
+msgid "Cut Selected Processors"
+msgstr ""
+
+#: mixer_ui.cc:2749
+msgid "Paste Selected Processors"
+msgstr ""
+
+#: mixer_ui.cc:2750
+msgid "Delete Selected Processors"
+msgstr ""
+
+#: mixer_ui.cc:2751
+msgid "Select All (visible) Processors"
+msgstr ""
+
+#: mixer_ui.cc:2752
+msgid "Toggle Selected Processors"
+msgstr ""
+
+#: mixer_ui.cc:2753
+msgid "Toggle Selected Plugins"
+msgstr ""
+
+#: mixer_ui.cc:2754
+msgid "Deselect all strips and processors"
+msgstr ""
+
+#: mixer_ui.cc:2756 mixer_ui.cc:2757
+msgid "Scroll Mixer Window to the left"
+msgstr ""
+
+#: mixer_ui.cc:2759
+msgid "Toggle MIDI Input Active for Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: meter_strip.cc:160
 msgid "Reset Peak"
 msgstr ""
 
-#: meter_strip.cc:883
+#: meter_strip.cc:380 route_time_axis.cc:2734 vca_master_strip.cc:206
+#: vca_time_axis.cc:231
+msgid "PreFader|P"
+msgstr ""
+
+#: meter_strip.cc:894
 msgid "Variable height"
 msgstr ""
 
-#: meter_strip.cc:884
+#: meter_strip.cc:895
 msgid "Short"
 msgstr ""
 
-#: meter_strip.cc:885
+#: meter_strip.cc:896
 msgid "Tall"
 msgstr ""
 
-#: meter_strip.cc:886
+#: meter_strip.cc:897
 msgid "Grande"
 msgstr ""
 
-#: meter_strip.cc:887
+#: meter_strip.cc:898
 msgid "Venti"
 msgstr ""
 
-#: meter_patterns.cc:82
-msgid "Peak"
+#: meter_patterns.cc:84
+msgid "Peak (+6dBFS)"
+msgstr ""
+
+#: meter_patterns.cc:87
+msgid "Peak (0dBFS)"
 msgstr ""
 
-#: meter_patterns.cc:85
+#: meter_patterns.cc:90
 msgid "RMS + Peak"
 msgstr ""
 
-#: meter_patterns.cc:88
+#: meter_patterns.cc:93
 msgid "IEC1/DIN"
 msgstr ""
 
-#: meter_patterns.cc:91
+#: meter_patterns.cc:96
 msgid "IEC1/Nordic"
 msgstr ""
 
-#: meter_patterns.cc:94
+#: meter_patterns.cc:99
 msgid "IEC2/BBC"
 msgstr ""
 
-#: meter_patterns.cc:97
+#: meter_patterns.cc:102
 msgid "IEC2/EBU"
 msgstr ""
 
-#: meter_patterns.cc:100
-msgid "K20"
+#: meter_patterns.cc:105
+msgid "K20/RMS"
 msgstr ""
 
-#: meter_patterns.cc:103
-msgid "K14"
+#: meter_patterns.cc:108
+msgid "K14/RMS"
 msgstr ""
 
-#: meter_patterns.cc:106
-msgid "K12"
+#: meter_patterns.cc:111
+msgid "K12/RMS"
 msgstr ""
 
-#: meter_patterns.cc:109
+#: meter_patterns.cc:114
 msgid "VU"
 msgstr ""
 
-#: monitor_section.cc:69
+#: monitor_section.cc:80
 msgid "SiP"
 msgstr ""
 
-#: monitor_section.cc:96 route_group_dialog.cc:49
+#: monitor_section.cc:113 route_group_dialog.cc:49
 msgid "Soloing"
 msgstr ""
 
-#: monitor_section.cc:100
+#: monitor_section.cc:117
 msgid "Isolated"
 msgstr ""
 
-#: monitor_section.cc:104
+#: monitor_section.cc:121
 msgid "Auditioning"
 msgstr ""
 
-#: monitor_section.cc:114
+#: monitor_section.cc:132
 msgid ""
 "When active, something is solo-isolated.\n"
 "Click to de-isolate everything"
 msgstr ""
 
-#: monitor_section.cc:117
+#: monitor_section.cc:135
 msgid ""
 "When active, auditioning is active.\n"
 "Click to stop the audition"
 msgstr ""
 
-#: monitor_section.cc:134
+#: monitor_section.cc:152
 msgid "Solo controls affect solo-in-place"
 msgstr ""
 
-#: monitor_section.cc:140
+#: monitor_section.cc:158
 msgid "Solo controls toggle after-fader-listen"
 msgstr ""
 
-#: monitor_section.cc:146
+#: monitor_section.cc:164
 msgid "Solo controls toggle pre-fader-listen"
 msgstr ""
 
-#: monitor_section.cc:156
+#: monitor_section.cc:170
+msgid "Excl. Solo"
+msgstr ""
+
+#: monitor_section.cc:172
+msgid "Exclusive solo means that only 1 solo is active at a time"
+msgstr ""
+
+#: monitor_section.cc:179
+msgid "Solo » Mute"
+msgstr ""
+
+#: monitor_section.cc:181
+msgid ""
+"If enabled, solo will override mute\n"
+"(a soloed & muted track or bus will be audible)"
+msgstr ""
+
+#: monitor_section.cc:189
+msgid "Processors"
+msgstr ""
+
+#: monitor_section.cc:191
+msgid "Allow one to add monitor effect processors"
+msgstr ""
+
+#: monitor_section.cc:206
 msgid "Gain increase for soloed signals (0dB is normal)"
 msgstr ""
 
-#: monitor_section.cc:170
+#: monitor_section.cc:210 monitor_section.cc:227 monitor_section.cc:244
+#: monitor_section.cc:289
+msgid "0 dB"
+msgstr ""
+
+#: monitor_section.cc:211
+msgid "3 dB"
+msgstr ""
+
+#: monitor_section.cc:212
+msgid "6 dB"
+msgstr ""
+
+#: monitor_section.cc:213
+msgid "10 dB"
+msgstr ""
+
+#: monitor_section.cc:215
 msgid "Solo Boost"
 msgstr ""
 
-#: monitor_section.cc:185
+#: monitor_section.cc:222
 msgid ""
 "Gain reduction non-soloed signals\n"
 "A value above -inf dB causes \"solo-in-front\""
 msgstr ""
 
-#: monitor_section.cc:196
-msgid "SiP Cut"
+#: monitor_section.cc:228 monitor_section.cc:246 monitor_section.cc:291
+msgid "-6 dB"
 msgstr ""
 
-#: monitor_section.cc:211
-msgid "Gain reduction to use when dimming monitor outputs"
+#: monitor_section.cc:229 monitor_section.cc:247 monitor_section.cc:292
+msgid "-12 dB"
 msgstr ""
 
-#: monitor_section.cc:225 monitor_section.cc:283
-msgid "Dim"
+#: monitor_section.cc:230 monitor_section.cc:248 monitor_section.cc:293
+msgid "-20 dB"
 msgstr ""
 
-#: monitor_section.cc:235
-msgid "Excl. Solo"
+#: monitor_section.cc:231
+msgid "OFF"
 msgstr ""
 
-#: monitor_section.cc:237
-msgid "Exclusive solo means that only 1 solo is active at a time"
+#: monitor_section.cc:233
+msgid "SiP Cut"
 msgstr ""
 
-#: monitor_section.cc:244
-msgid "Solo » Mute"
+#: monitor_section.cc:240
+msgid "Gain reduction to use when dimming monitor outputs"
 msgstr ""
 
-#: monitor_section.cc:246
-msgid ""
-"If enabled, solo will override mute\n"
-"(a soloed & muted track or bus will be audible)"
+#: monitor_section.cc:245 monitor_section.cc:290
+msgid "-3 dB"
+msgstr ""
+
+#: monitor_section.cc:250 monitor_section.cc:264 monitor_section.cc:325
+msgid "Dim"
+msgstr ""
+
+#: monitor_section.cc:294
+msgid "-30 dB"
+msgstr ""
+
+#: monitor_section.cc:333
+msgid "Inv"
 msgstr ""
 
-#: monitor_section.cc:323
+#: monitor_section.cc:399
 msgid "Monitor"
 msgstr ""
 
-#: monitor_section.cc:744
+#: monitor_section.cc:897
 msgid "Switch monitor to mono"
 msgstr ""
 
-#: monitor_section.cc:747
+#: monitor_section.cc:900
 msgid "Cut monitor"
 msgstr ""
 
-#: monitor_section.cc:750
+#: monitor_section.cc:903
 msgid "Dim monitor"
 msgstr ""
 
-#: monitor_section.cc:753
+#: monitor_section.cc:906
 msgid "Toggle exclusive solo mode"
 msgstr ""
 
-#: monitor_section.cc:759
+#: monitor_section.cc:912
 msgid "Toggle mute overrides solo mode"
 msgstr ""
 
-#: monitor_section.cc:771
+#: monitor_section.cc:921
 msgid "Cut monitor channel %1"
 msgstr ""
 
-#: monitor_section.cc:776
+#: monitor_section.cc:926
 msgid "Dim monitor channel %1"
 msgstr ""
 
-#: monitor_section.cc:781
+#: monitor_section.cc:931
 msgid "Solo monitor channel %1"
 msgstr ""
 
-#: monitor_section.cc:786
+#: monitor_section.cc:936
 msgid "Invert monitor channel %1"
 msgstr ""
 
-#: monitor_section.cc:796
+#: monitor_section.cc:946
 msgid "In-place solo"
 msgstr ""
 
-#: monitor_section.cc:798
+#: monitor_section.cc:948
 msgid "After Fade Listen (AFL) solo"
 msgstr ""
 
-#: monitor_section.cc:800
+#: monitor_section.cc:950
 msgid "Pre Fade Listen (PFL) solo"
 msgstr ""
 
-#: mono_panner.cc:109 stereo_panner.cc:119
+#: monitor_section.cc:953
+msgid "Toggle Monitor Section Processor Box"
+msgstr ""
+
+#: monitor_section.cc:1413
+msgid "No session - no I/O changes are possible"
+msgstr ""
+
+#: monitor_selector.cc:199
+msgid "Monitor output selector"
+msgstr ""
+
+#: mono_panner.cc:105 stereo_panner.cc:115
 msgid "bypassed"
 msgstr ""
 
-#: mono_panner.cc:123
+#: mono_panner.cc:119
 #, c-format
 msgid "L:%3d R:%3d"
 msgstr ""
 
-#: mono_panner_editor.cc:33
+#: mono_panner.cc:203 panner2d.cc:276 stereo_panner.cc:252
+#: stereo_panner.cc:275
+msgid "Panner|L"
+msgstr ""
+
+#: mono_panner.cc:220 panner2d.cc:277 stereo_panner.cc:250
+#: stereo_panner.cc:277
+msgid "Panner|R"
+msgstr ""
+
+#: mono_panner_editor.cc:35
 msgid "Mono Panner"
 msgstr ""
 
-#: mono_panner_editor.cc:44 mono_panner_editor.cc:49
-#: stereo_panner_editor.cc:46 stereo_panner_editor.cc:51
+#: mono_panner_editor.cc:46 mono_panner_editor.cc:51
+#: stereo_panner_editor.cc:48 stereo_panner_editor.cc:53
 msgid "%"
 msgstr ""
 
@@ -7784,10 +9176,6 @@ msgid ""
 "relies on a stable, sustainable income stream. Thanks for using Ardour!"
 msgstr ""
 
-#: new_plugin_preset_dialog.cc:29
-msgid "New Preset"
-msgstr ""
-
 #: new_plugin_preset_dialog.cc:30
 msgid "Replace existing preset with this name"
 msgstr ""
@@ -7796,6 +9184,10 @@ msgstr ""
 msgid "Name of new preset"
 msgstr ""
 
+#: new_plugin_preset_dialog.cc:44
+msgid "New Favorite Only"
+msgstr ""
+
 #: normalize_dialog.cc:34
 msgid "Normalize regions"
 msgstr ""
@@ -7804,7 +9196,11 @@ msgstr ""
 msgid "Normalize region"
 msgstr ""
 
-#: normalize_dialog.cc:49 strip_silence_dialog.cc:66
+#: normalize_dialog.cc:42
+msgid "Normalize to:"
+msgstr ""
+
+#: normalize_dialog.cc:49 strip_silence_dialog.cc:67
 msgid "dbFS"
 msgstr "dbFS"
 
@@ -7824,103 +9220,106 @@ msgstr "Εξομάλυνση"
 msgid "Select Note"
 msgstr ""
 
-#: opts.cc:57
+#: opts.cc:61
 msgid "Usage: "
 msgstr "Χρήση: "
 
-#: opts.cc:58
+#: opts.cc:62
 msgid "  [SESSION_NAME]              Name of session to load\n"
 msgstr ""
 
-#: opts.cc:59
+#: opts.cc:63
 msgid "  -v, --version               Show version information\n"
 msgstr ""
 
-#: opts.cc:60
+#: opts.cc:64
 msgid "  -h, --help                  Print this message\n"
 msgstr ""
 
-#: opts.cc:61
+#: opts.cc:65
 msgid ""
 "  -a, --no-announcements      Do not contact website for announcements\n"
 msgstr ""
 
-#: opts.cc:62
+#: opts.cc:66
 msgid ""
 "  -b, --bindings              Print all possible keyboard binding names\n"
 msgstr ""
 
-#: opts.cc:63
+#: opts.cc:67
+msgid ""
+"  -B, --bypass-plugins        Bypass all plugins in an existing session\n"
+msgstr ""
+
+#: opts.cc:68
 msgid ""
 "  -c, --name <name>           Use a specific backend client name, default is "
 "ardour\n"
 msgstr ""
 
-#: opts.cc:64
+#: opts.cc:69
 msgid ""
 "  -d, --disable-plugins       Disable all plugins in an existing session\n"
 msgstr ""
 
-#: opts.cc:65
+#: opts.cc:70
 msgid ""
 "  -D, --debug <options>       Set debug flags. Use \"-D list\" to see "
 "available options\n"
 msgstr ""
 
-#: opts.cc:66
+#: opts.cc:71
 msgid "  -n, --no-splash             Do not show splash screen\n"
 msgstr ""
 
-#: opts.cc:67
+#: opts.cc:72
 msgid "  -m, --menus file            Use \"file\" to define menus\n"
 msgstr ""
 
-#: opts.cc:68
+#: opts.cc:73
 msgid ""
 "  -N, --new session-name      Create a new session from the command line\n"
 msgstr ""
 
-#: opts.cc:69
+#: opts.cc:74
 msgid "  -O, --no-hw-optimizations   Disable h/w specific optimizations\n"
 msgstr ""
 
-#: opts.cc:70
+#: opts.cc:75
 msgid "  -P, --no-connect-ports      Do not connect any ports at startup\n"
 msgstr ""
 
-#: opts.cc:71
+#: opts.cc:76
 msgid "  -S, --sync                  Draw the gui synchronously \n"
 msgstr ""
 
-#: opts.cc:73
+#: opts.cc:78
 msgid "  -V, --novst                 Do not use VST support\n"
 msgstr ""
 
-#: opts.cc:75
+#: opts.cc:80
 msgid ""
 "  -E, --save <file>           Load the specified session, save it to <file> "
 "and then quit\n"
 msgstr ""
 
-#: opts.cc:76
+#: opts.cc:81
 msgid "  -C, --curvetest filename    Curve algorithm debugger\n"
 msgstr ""
 
-#: opts.cc:77
-msgid ""
-"  -k, --keybindings filename  Name of key bindings to load (default is ~/."
-"ardour3/ardour.bindings)\n"
+#: opts.cc:82
+msgid "  -k, --keybindings filename  Name of key bindings to load\n"
 msgstr ""
 
-#: panner2d.cc:854
+#: panner2d.cc:896
 msgid "Panner (2D)"
 msgstr ""
 
-#: panner2d.cc:856 panner_ui.cc:400 plugin_ui.cc:452
+#: panner2d.cc:898 panner_ui.cc:402 plugin_ui.cc:458
 msgid "Bypass"
 msgstr ""
 
-#: panner2d.cc:862
+#: panner2d.cc:904
 msgid "Panner"
 msgstr ""
 
@@ -7932,6 +9331,22 @@ msgstr "Λειτουργία αυτοματισμού Pan"
 msgid "Pan automation type"
 msgstr "Τύπος αυτοματισμού Pan"
 
+#: panner_ui.cc:605
+msgid "Manual|M"
+msgstr ""
+
+#: panner_ui.cc:608
+msgid "Play|P"
+msgstr ""
+
+#: panner_ui.cc:611
+msgid "Touch|T"
+msgstr ""
+
+#: panner_ui.cc:614
+msgid "Write|W"
+msgstr ""
+
 #: playlist_selector.cc:43
 msgid "Playlists"
 msgstr ""
@@ -7964,143 +9379,297 @@ msgstr ""
 msgid "Show phase"
 msgstr ""
 
-#: plugin_selector.cc:53 plugin_selector.cc:229
+#: plugin_pin_dialog.cc:55
+msgid "Manual Config"
+msgstr ""
+
+#: plugin_pin_dialog.cc:56
+msgid "Sidechain"
+msgstr ""
+
+#: plugin_pin_dialog.cc:57 plugin_pin_dialog.cc:59 plugin_pin_dialog.cc:61
+#: plugin_pin_dialog.cc:63 plugin_pin_dialog.cc:65 step_entry.cc:81
+#: step_entry.cc:84
+msgid "+"
+msgstr ""
+
+#: plugin_pin_dialog.cc:58 plugin_pin_dialog.cc:60 plugin_pin_dialog.cc:62
+#: plugin_pin_dialog.cc:64 plugin_pin_dialog.cc:66
+msgid "-"
+msgstr ""
+
+#: plugin_pin_dialog.cc:148
+msgid "Audio Input Pins"
+msgstr ""
+
+#: plugin_pin_dialog.cc:157
+msgid "MIDI Input Pins"
+msgstr ""
+
+#: plugin_pin_dialog.cc:166
+msgid "Instances"
+msgstr ""
+
+#: plugin_pin_dialog.cc:176
+msgid "Audio Out"
+msgstr ""
+
+#: plugin_pin_dialog.cc:185
+msgid "MIDI Out"
+msgstr ""
+
+#: plugin_pin_dialog.cc:192
+msgid "Output Presets"
+msgstr ""
+
+#: plugin_pin_dialog.cc:208
+msgid "Add Sidechain Input"
+msgstr ""
+
+#: plugin_pin_dialog.cc:478 plugin_pin_dialog.cc:482 plugin_pin_dialog.cc:486
+#: plugin_setup_dialog.cc:115 plugin_setup_dialog.cc:199
+msgid "Automatic"
+msgstr ""
+
+#: plugin_pin_dialog.cc:515 plugin_setup_dialog.cc:208
+msgid "%1 Channel"
+msgid_plural "%1 Channels"
+msgstr[0] ""
+msgstr[1] ""
+
+#: plugin_pin_dialog.cc:641 processor_box.cc:224
+msgid "Send"
+msgstr ""
+
+#: plugin_pin_dialog.cc:997
+msgid "Latency %1 spl%2 %3"
+msgstr ""
+
+#: plugin_pin_dialog.cc:997 plugin_pin_dialog.cc:1001
+msgid "no-inplace"
+msgstr ""
+
+#: plugin_pin_dialog.cc:999
+msgid "Latency %1 spl"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1055
+msgid "Instance #%1"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1700 processor_box.cc:2508
+msgid "Cannot set up new send: %1"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1707
+msgid "SC %1 (%2)"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1963 plugin_pin_dialog.cc:1971
+msgid "Pin Configuration: %1"
+msgstr ""
+
+#: plugin_setup_dialog.cc:30
+msgid "Plugin Setup"
+msgstr ""
+
+#: plugin_setup_dialog.cc:33
+msgid "Copy I/O Map"
+msgstr ""
+
+#: plugin_setup_dialog.cc:50
+msgid "An Instrument plugin is already present."
+msgstr ""
+
+#: plugin_setup_dialog.cc:54
+msgid "Replace"
+msgstr ""
+
+#: plugin_setup_dialog.cc:60
+msgid "with"
+msgstr ""
+
+#: plugin_setup_dialog.cc:70
+msgid "I/O Pin Mapping"
+msgstr ""
+
+#: plugin_setup_dialog.cc:79
+msgid "Configure Plugin '%1'"
+msgstr ""
+
+#: plugin_setup_dialog.cc:90
+msgid "Output Configuration"
+msgstr ""
+
+#: plugin_selector.cc:54 plugin_selector.cc:322
 msgid "Name contains"
 msgstr ""
 
-#: plugin_selector.cc:54 plugin_selector.cc:233
+#: plugin_selector.cc:55 plugin_selector.cc:326
 msgid "Type contains"
 msgstr ""
 
-#: plugin_selector.cc:55 plugin_selector.cc:231
+#: plugin_selector.cc:56 plugin_selector.cc:324
 msgid "Category contains"
 msgstr ""
 
-#: plugin_selector.cc:56 plugin_selector.cc:253
+#: plugin_selector.cc:57 plugin_selector.cc:349
 msgid "Author contains"
 msgstr ""
 
-#: plugin_selector.cc:57 plugin_selector.cc:255
+#: plugin_selector.cc:58 plugin_selector.cc:351
 msgid "Library contains"
 msgstr ""
 
-#: plugin_selector.cc:58 plugin_selector.cc:219 plugin_selector.cc:537
+#: plugin_selector.cc:59 plugin_selector.cc:278 plugin_selector.cc:639
 msgid "Favorites only"
 msgstr ""
 
-#: plugin_selector.cc:59 plugin_selector.cc:223 plugin_selector.cc:537
+#: plugin_selector.cc:60 plugin_selector.cc:282 plugin_selector.cc:639
 msgid "Hidden only"
 msgstr ""
 
-#: plugin_selector.cc:64
+#: plugin_selector.cc:65
 msgid "Plugin Manager"
 msgstr ""
 
-#: plugin_selector.cc:85
+#: plugin_selector.cc:96
 msgid "Fav"
 msgstr ""
 
-#: plugin_selector.cc:87
+#: plugin_selector.cc:98
 msgid "Available Plugins"
 msgstr ""
 
-#: plugin_selector.cc:88
+#: plugin_selector.cc:99
 msgid "Type"
 msgstr "Τύπωση"
 
-#: plugin_selector.cc:89
+#: plugin_selector.cc:100
 msgid "Category"
 msgstr ""
 
-#: plugin_selector.cc:90
+#: plugin_selector.cc:101
 msgid "Creator"
 msgstr ""
 
-#: plugin_selector.cc:91
+#: plugin_selector.cc:102
 msgid "# Audio In"
 msgstr ""
 
-#: plugin_selector.cc:92
+#: plugin_selector.cc:103
 msgid "# Audio Out"
 msgstr ""
 
-#: plugin_selector.cc:93
+#: plugin_selector.cc:104
 msgid "# MIDI In"
 msgstr ""
 
-#: plugin_selector.cc:94
+#: plugin_selector.cc:105
 msgid "# MIDI Out"
 msgstr ""
 
-#: plugin_selector.cc:116
+#: plugin_selector.cc:132
 msgid "Plugins to be connected"
 msgstr ""
 
-#: plugin_selector.cc:129
+#: plugin_selector.cc:145
 msgid "Add a plugin to the effect list"
 msgstr "Πρόσθεση plugin στη λίστα των εφφέ"
 
-#: plugin_selector.cc:133
+#: plugin_selector.cc:149
 msgid "Remove a plugin from the effect list"
 msgstr "Απαλοιφή plugin από τη λίστα των εφφέ"
 
-#: plugin_selector.cc:135
-msgid "Update available plugins"
-msgstr "Ανανέωση διαθέσιμων plugins"
+#: plugin_selector.cc:161
+msgid "Show Hidden"
+msgstr ""
+
+#: plugin_selector.cc:163
+msgid "Include hidden plugins in list."
+msgstr ""
+
+#: plugin_selector.cc:166
+msgid "Instruments"
+msgstr ""
+
+#: plugin_selector.cc:168
+msgid "Cycle display of instrument plugins (if any)."
+msgstr ""
+
+#: plugin_selector.cc:171
+msgid "Analyzers"
+msgstr ""
+
+#: plugin_selector.cc:173
+msgid "Cycle display of analysis plugins (if any)."
+msgstr ""
+
+#: plugin_selector.cc:176
+msgid "Utils"
+msgstr ""
+
+#: plugin_selector.cc:178
+msgid "Cycle display of utility plugins (if any)."
+msgstr ""
+
+#: plugin_selector.cc:208
+msgid "Filter"
+msgstr ""
 
-#: plugin_selector.cc:172
+#: plugin_selector.cc:232
 msgid "Insert Plugin(s)"
 msgstr ""
 
-#: plugin_selector.cc:337 plugin_selector.cc:338 plugin_selector.cc:339
-#: plugin_selector.cc:340
+#: plugin_selector.cc:439 plugin_selector.cc:440 plugin_selector.cc:441
+#: plugin_selector.cc:442
 msgid "variable"
 msgstr ""
 
-#: plugin_selector.cc:496
+#: plugin_selector.cc:598
 msgid ""
 "The plugin \"%1\" could not be loaded\n"
 "\n"
 "See the Log window for more details (maybe)"
 msgstr ""
 
-#: plugin_selector.cc:644
+#: plugin_selector.cc:757
 msgid "Favorites"
 msgstr ""
 
-#: plugin_selector.cc:646
+#: plugin_selector.cc:759
 msgid "Plugin Manager..."
 msgstr ""
 
-#: plugin_selector.cc:650
+#: plugin_selector.cc:763
 msgid "By Creator"
 msgstr ""
 
-#: plugin_selector.cc:653
+#: plugin_selector.cc:766
 msgid "By Category"
 msgstr ""
 
-#: plugin_ui.cc:113
+#: plugin_ui.cc:114
 msgid "Eh? LADSPA plugins don't have editors!"
 msgstr ""
 
-#: plugin_ui.cc:122 plugin_ui.cc:227
+#: plugin_ui.cc:123 plugin_ui.cc:228
 msgid ""
 "unknown type of editor-supplying plugin (note: no VST support in this "
 "version of %1)"
 msgstr ""
 
-#: plugin_ui.cc:125
+#: plugin_ui.cc:126
 msgid "unknown type of editor-supplying plugin"
 msgstr ""
 
-#: plugin_ui.cc:257
+#: plugin_ui.cc:258
 msgid ""
 "unknown type of editor-supplying plugin (note: no linuxVST support in this "
 "version of %1)"
 msgstr ""
 
-#: plugin_ui.cc:329
+#: plugin_ui.cc:330
 msgid "create_lv2_editor called on non-LV2 plugin"
 msgstr ""
 
@@ -8108,146 +9677,167 @@ msgstr ""
 msgid "Add"
 msgstr "Πρόσθεση"
 
-#: plugin_ui.cc:422
+#: plugin_ui.cc:423
 msgid "Description"
 msgstr ""
 
-#: plugin_ui.cc:423
+#: plugin_ui.cc:424
 msgid "Plugin analysis"
 msgstr ""
 
-#: plugin_ui.cc:430
+#: plugin_ui.cc:431
 msgid ""
 "Presets (if any) for this plugin\n"
 "(Both factory and user-created)"
 msgstr ""
 
-#: plugin_ui.cc:431
+#: plugin_ui.cc:432
 msgid "Save a new preset"
 msgstr ""
 
-#: plugin_ui.cc:432
+#: plugin_ui.cc:433
 msgid "Save the current preset"
 msgstr ""
 
-#: plugin_ui.cc:433
+#: plugin_ui.cc:434
 msgid "Delete the current preset"
 msgstr ""
 
-#: plugin_ui.cc:434
+#: plugin_ui.cc:435
+msgid ""
+"Reset parameters to default (if no parameters are in automation play mode)"
+msgstr ""
+
+#: plugin_ui.cc:436
 msgid "Disable signal processing by the plugin"
 msgstr ""
 
-#: plugin_ui.cc:467 plugin_ui.cc:663
+#: plugin_ui.cc:473 plugin_ui.cc:681
 msgid ""
 "Click to allow the plugin to receive keyboard events that %1 would normally "
 "use as a shortcut"
 msgstr ""
 
-#: plugin_ui.cc:468
+#: plugin_ui.cc:474
 msgid "Click to enable/disable this plugin"
 msgstr ""
 
-#: plugin_ui.cc:507
+#: plugin_ui.cc:517
 msgid "latency (%1 sample)"
 msgid_plural "latency (%1 samples)"
 msgstr[0] ""
 msgstr[1] ""
 
-#: plugin_ui.cc:509
+#: plugin_ui.cc:519
 msgid "latency (%1 ms)"
 msgstr ""
 
-#: plugin_ui.cc:520
+#: plugin_ui.cc:530
 msgid "Edit Latency"
 msgstr ""
 
-#: plugin_ui.cc:566
+#: plugin_ui.cc:576
 msgid ""
 "Plugin presets are not supported in this build of %1. Consider paying for a "
 "full version"
 msgstr ""
 
-#: plugin_ui.cc:574
+#: plugin_ui.cc:584
 msgid ""
 "Plugin presets are not supported in this build, see the Log window for more "
 "information."
 msgstr ""
 
-#: plugin_ui.cc:670
+#: plugin_ui.cc:592
+msgid "New Preset"
+msgstr ""
+
+#: plugin_ui.cc:688
 msgid "Click to allow normal use of %1 keyboard shortcuts"
 msgstr ""
 
-#: port_group.cc:337
-msgid "%1 Busses"
+#: plugin_ui.cc:785
+msgid "(none)"
 msgstr ""
 
 #: port_group.cc:338
-msgid "%1 Tracks"
+msgid "%1 Busses"
 msgstr ""
 
 #: port_group.cc:339
-msgid "Hardware"
+msgid "%1 Tracks"
 msgstr ""
 
 #: port_group.cc:340
-msgid "%1 Misc"
+msgid "Hardware"
 msgstr ""
 
 #: port_group.cc:341
+msgid "%1 Misc"
+msgstr ""
+
+#: port_group.cc:342
 msgid "Other"
 msgstr ""
 
-#: port_group.cc:432 port_group.cc:433
+#: port_group.cc:434 port_group.cc:435
 msgid "LTC Out"
 msgstr ""
 
-#: port_group.cc:436 port_group.cc:437
+#: port_group.cc:438 port_group.cc:439
 msgid "LTC In"
 msgstr ""
 
-#: port_group.cc:463
+#: port_group.cc:473
 msgid "MTC in"
 msgstr ""
 
-#: port_group.cc:466
+#: port_group.cc:476
 msgid "MIDI control in"
 msgstr ""
 
-#: port_group.cc:469
+#: port_group.cc:479
 msgid "MIDI clock in"
 msgstr ""
 
-#: port_group.cc:472
+#: port_group.cc:482
 msgid "MMC in"
 msgstr ""
 
-#: port_group.cc:476
+#: port_group.cc:486
 msgid "MTC out"
 msgstr ""
 
-#: port_group.cc:479
+#: port_group.cc:489
 msgid "MIDI control out"
 msgstr ""
 
-#: port_group.cc:482
+#: port_group.cc:492
 msgid "MIDI clock out"
 msgstr ""
 
-#: port_group.cc:485
+#: port_group.cc:495
 msgid "MMC out"
 msgstr ""
 
-#: port_group.cc:532
+#: port_group.cc:554
 msgid ":monitor"
 msgstr ""
 
-#: port_group.cc:544
+#: port_group.cc:570
 msgid "system:"
 msgstr ""
 
-#: port_group.cc:545
-msgid "alsa_pcm"
+#: port_group.cc:571
+msgid "alsa_pcm:"
+msgstr ""
+
+#: port_group.cc:572
+msgid "alsa_midi:"
+msgstr ""
+
+#: port_group.cc:577
+msgid "Scene "
 msgstr ""
 
 #: port_insert_ui.cc:39
@@ -8270,77 +9860,76 @@ msgstr ""
 msgid "Port Insert "
 msgstr ""
 
-#: port_matrix.cc:331 port_matrix.cc:357
+#: port_matrix.cc:341 port_matrix.cc:367
 msgid "<b>Sources</b>"
 msgstr ""
 
-#: port_matrix.cc:332 port_matrix.cc:358
+#: port_matrix.cc:342 port_matrix.cc:368
 msgid "<b>Destinations</b>"
 msgstr ""
 
-#: port_matrix.cc:440 port_matrix.cc:448
+#: port_matrix.cc:450 port_matrix.cc:458
 #, c-format
 msgid "Add %s %s"
 msgstr ""
 
-#: port_matrix.cc:456
+#: port_matrix.cc:466
 #, c-format
 msgid "Rename '%s'..."
 msgstr ""
 
-#: port_matrix.cc:472
+#: port_matrix.cc:482
 msgid "Remove all"
 msgstr ""
 
-#: port_matrix.cc:492 port_matrix.cc:504
+#: port_matrix.cc:502 port_matrix.cc:514
 #, c-format
 msgid "%s all"
 msgstr ""
 
-#: port_matrix.cc:527
+#: port_matrix.cc:537
 msgid "Rescan"
 msgstr ""
 
-#: port_matrix.cc:529
+#: port_matrix.cc:539
 msgid "Show individual ports"
 msgstr ""
 
-#: port_matrix.cc:535
+#: port_matrix.cc:545
 msgid "Flip"
 msgstr ""
 
-#: port_matrix.cc:722
-msgid ""
-"It is not possible to add a port here, as the first processor in the track "
-"or buss cannot support the new configuration."
+#: port_matrix.cc:732
+msgid "It is not possible to add a port here."
 msgstr ""
 
-#: port_matrix.cc:725
+#: port_matrix.cc:733
 msgid "Cannot add port"
 msgstr ""
 
-#: port_matrix.cc:747
-msgid "Port removal not allowed"
+#: port_matrix.cc:757
+msgid "The last port cannot be removed"
 msgstr ""
 
-#: port_matrix.cc:748
-msgid ""
-"This port cannot be removed.\n"
-"Either the first plugin in the track or buss cannot accept\n"
-"the new number of inputs or the last plugin has more outputs."
+#: port_matrix.cc:760
+msgid "This port cannot be removed."
+msgstr ""
+
+#: port_matrix.cc:765
+msgid "Port removal not allowed"
 msgstr ""
 
-#: port_matrix.cc:965
+#: port_matrix.cc:981
 #, c-format
 msgid "Remove '%s'"
 msgstr ""
 
-#: port_matrix.cc:980
+#: port_matrix.cc:996
 #, c-format
 msgid "%s all from '%s'"
 msgstr ""
 
-#: port_matrix.cc:1046 transform_dialog.cc:62
+#: port_matrix.cc:1062 transform_dialog.cc:62
 msgid "channel"
 msgstr ""
 
@@ -8352,223 +9941,237 @@ msgstr ""
 msgid "There are no %1 ports to connect."
 msgstr ""
 
-#: processor_box.cc:150
-msgid "Send"
+#: processor_box.cc:226
+msgid "Return"
 msgstr ""
 
-#: processor_box.cc:152
-msgid "Return"
+#: processor_box.cc:323
+msgid "New Favorite Preset for \"%1\""
 msgstr ""
 
-#: processor_box.cc:310
+#: processor_box.cc:501
 msgid ""
 "\n"
 "This mono plugin has been replicated %1 times."
 msgstr ""
 
-#: processor_box.cc:314
+#: processor_box.cc:505 processor_box.cc:1527
 msgid ""
 "<b>%1</b>\n"
 "Double-click to show GUI.\n"
-"Alt+double-click to show generic GUI.%2"
+"%2+double-click to show generic GUI.%3"
 msgstr ""
 
-#: processor_box.cc:317
+#: processor_box.cc:508 processor_box.cc:1530
 msgid ""
 "<b>%1</b>\n"
 "Double-click to show generic GUI.%2"
 msgstr ""
 
-#: processor_box.cc:361
+#: processor_box.cc:514
+msgid ""
+"<b>%1</b>\n"
+"The Plugin is not available on this system\n"
+"and has been replaced by a stub."
+msgstr ""
+
+#: processor_box.cc:600
 #, c-format
 msgid "(%1x1) "
 msgstr ""
 
-#: processor_box.cc:437
+#: processor_box.cc:695
+msgid "Inline Display"
+msgstr ""
+
+#: processor_box.cc:703
 msgid "Show All Controls"
 msgstr ""
 
-#: processor_box.cc:441
+#: processor_box.cc:707
 msgid "Hide All Controls"
 msgstr ""
 
-#: processor_box.cc:475
+#: processor_box.cc:752
 msgid "Link panner controls"
 msgstr ""
 
-#: processor_box.cc:575
+#: processor_box.cc:859
 msgid "on"
 msgstr ""
 
-#: processor_box.cc:575 rc_option_editor.cc:2360 rc_option_editor.cc:2374
+#: processor_box.cc:859 rc_option_editor.cc:3178 rc_option_editor.cc:3192
 msgid "off"
 msgstr "εκτός"
 
-#: processor_box.cc:957
+#: processor_box.cc:1817
 msgid ""
 "Right-click to add/remove/edit\n"
 "plugins,inserts,sends and more"
 msgstr ""
 
-#: processor_box.cc:1429 processor_box.cc:1804
+#: processor_box.cc:1966
+msgid ""
+"Processor Drag/Drop failed. Probably because\n"
+"the I/O configuration of the plugins could\n"
+"not match the configuration of this track."
+msgstr ""
+
+#: processor_box.cc:2443 processor_box.cc:2986
 msgid "Plugin Incompatibility"
 msgstr ""
 
-#: processor_box.cc:1432
+#: processor_box.cc:2446
 msgid "You attempted to add the plugin \"%1\" in slot %2.\n"
 msgstr ""
 
-#: processor_box.cc:1438
+#: processor_box.cc:2452
 msgid ""
 "\n"
 "This plugin has:\n"
 msgstr ""
 
-#: processor_box.cc:1441
+#: processor_box.cc:2455
 msgid "\t%1 MIDI input\n"
 msgid_plural "\t%1 MIDI inputs\n"
 msgstr[0] ""
 msgstr[1] ""
 
-#: processor_box.cc:1445
+#: processor_box.cc:2459
 msgid "\t%1 audio input\n"
 msgid_plural "\t%1 audio inputs\n"
 msgstr[0] ""
 msgstr[1] ""
 
-#: processor_box.cc:1448
+#: processor_box.cc:2462
 msgid ""
 "\n"
 "but at the insertion point, there are:\n"
 msgstr ""
 
-#: processor_box.cc:1451
+#: processor_box.cc:2465
 msgid "\t%1 MIDI channel\n"
 msgid_plural "\t%1 MIDI channels\n"
 msgstr[0] ""
 msgstr[1] ""
 
-#: processor_box.cc:1455
+#: processor_box.cc:2469
 msgid "\t%1 audio channel\n"
 msgid_plural "\t%1 audio channels\n"
 msgstr[0] ""
 msgstr[1] ""
 
-#: processor_box.cc:1458
+#: processor_box.cc:2472
 msgid ""
 "\n"
 "%1 is unable to insert this plugin here.\n"
 msgstr ""
 
-#: processor_box.cc:1495
-msgid "Cannot set up new send: %1"
-msgstr ""
-
-#: processor_box.cc:1807
+#: processor_box.cc:2989
 msgid ""
 "You cannot reorder these plugins/sends/inserts\n"
 "in that way because the inputs and\n"
 "outputs will not work correctly."
 msgstr ""
 
-#: processor_box.cc:1991
+#: processor_box.cc:3189
 msgid "Rename Processor"
 msgstr ""
 
-#: processor_box.cc:2022
+#: processor_box.cc:3220
 msgid "At least 100 IO objects exist with a name like %1 - name not changed"
 msgstr ""
 
-#: processor_box.cc:2159
+#: processor_box.cc:3371
 msgid "plugin insert constructor failed"
 msgstr ""
 
-#: processor_box.cc:2170
+#: processor_box.cc:3382
 msgid ""
 "Copying the set of processors on the clipboard failed,\n"
 "probably because the I/O configuration of the plugins\n"
 "could not match the configuration of this track."
 msgstr ""
 
-#: processor_box.cc:2216
+#: processor_box.cc:3428
 msgid ""
 "Do you really want to remove all processors from %1?\n"
 "(this cannot be undone)"
 msgstr ""
 
-#: processor_box.cc:2220 processor_box.cc:2245
+#: processor_box.cc:3432 processor_box.cc:3457
 msgid "Yes, remove them all"
 msgstr "Ναι, απάλοιψέ τα όλα"
 
-#: processor_box.cc:2222 processor_box.cc:2247
+#: processor_box.cc:3434 processor_box.cc:3459
 msgid "Remove processors"
 msgstr ""
 
-#: processor_box.cc:2237
+#: processor_box.cc:3449
 msgid ""
 "Do you really want to remove all pre-fader processors from %1?\n"
 "(this cannot be undone)"
 msgstr ""
 
-#: processor_box.cc:2240
+#: processor_box.cc:3452
 msgid ""
 "Do you really want to remove all post-fader processors from %1?\n"
 "(this cannot be undone)"
 msgstr ""
 
-#: processor_box.cc:2428
+#: processor_box.cc:3641
 msgid "New Plugin"
 msgstr ""
 
-#: processor_box.cc:2431
+#: processor_box.cc:3644
 msgid "New Insert"
 msgstr "Νέο Προσθήκη"
 
-#: processor_box.cc:2434
+#: processor_box.cc:3647
 msgid "New External Send ..."
 msgstr ""
 
-#: processor_box.cc:2438
+#: processor_box.cc:3651
 msgid "New Aux Send ..."
 msgstr ""
 
-#: processor_box.cc:2441
+#: processor_box.cc:3654
 msgid "Send Options"
 msgstr ""
 
-#: processor_box.cc:2443
+#: processor_box.cc:3656
 msgid "Clear (all)"
 msgstr ""
 
-#: processor_box.cc:2445
+#: processor_box.cc:3658
 msgid "Clear (pre-fader)"
 msgstr ""
 
-#: processor_box.cc:2447
+#: processor_box.cc:3660
 msgid "Clear (post-fader)"
 msgstr ""
 
-#: processor_box.cc:2473
+#: processor_box.cc:3690
 msgid "Activate All"
 msgstr "Ενεργοποίηση όλων"
 
-#: processor_box.cc:2475
+#: processor_box.cc:3692
 msgid "Deactivate All"
 msgstr ""
 
-#: processor_box.cc:2477
+#: processor_box.cc:3694
 msgid "A/B Plugins"
 msgstr ""
 
-#: processor_box.cc:2486
+#: processor_box.cc:3707
 msgid "Edit with generic controls..."
 msgstr ""
 
-#: processor_box.cc:2789
+#: processor_box.cc:4039
 msgid "%1: %2 (by %3)"
 msgstr ""
 
-#: processor_box.cc:2791
+#: processor_box.cc:4041
 msgid "%1 (by %2)"
 msgstr ""
 
@@ -8596,345 +10199,444 @@ msgstr ""
 msgid "main grid"
 msgstr ""
 
-#: quantize_dialog.cc:52 quantize_dialog.cc:109
+#: quantize_dialog.cc:61 quantize_dialog.cc:118
 msgid "Quantize"
 msgstr ""
 
-#: quantize_dialog.cc:56
+#: quantize_dialog.cc:65
 msgid "Strength"
 msgstr ""
 
-#: quantize_dialog.cc:59
+#: quantize_dialog.cc:68
 msgid "Swing"
 msgstr ""
 
-#: quantize_dialog.cc:62
+#: quantize_dialog.cc:71
 msgid "Threshold (ticks)"
 msgstr ""
 
-#: quantize_dialog.cc:63
+#: quantize_dialog.cc:72
 msgid "Snap note start"
 msgstr ""
 
-#: quantize_dialog.cc:64
+#: quantize_dialog.cc:73
 msgid "Snap note end"
 msgstr ""
 
-#: rc_option_editor.cc:77
-msgid "Click audio file:"
+#: rc_option_editor.cc:83 rc_option_editor.cc:84 rc_option_editor.cc:1550
+msgid "Browse..."
 msgstr ""
 
-#: rc_option_editor.cc:80 rc_option_editor.cc:87
-msgid "Browse..."
+#: rc_option_editor.cc:89
+msgid "Emphasis on first beat:"
+msgstr ""
+
+#: rc_option_editor.cc:95
+msgid "Use default Click:"
 msgstr ""
 
-#: rc_option_editor.cc:84
+#: rc_option_editor.cc:101
+msgid "Click audio file:"
+msgstr ""
+
+#: rc_option_editor.cc:108
 msgid "Click emphasis audio file:"
 msgstr ""
 
-#: rc_option_editor.cc:116
+#: rc_option_editor.cc:154
 msgid "Choose Click"
 msgstr "Επιλογή Μετρονόμου"
 
-#: rc_option_editor.cc:139
+#: rc_option_editor.cc:177
 msgid "Choose Click Emphasis"
 msgstr "Επιλογή Έμφασης Μετρονόμου"
 
-#: rc_option_editor.cc:170
+#: rc_option_editor.cc:238
 msgid "Limit undo history to"
 msgstr ""
 
-#: rc_option_editor.cc:171
+#: rc_option_editor.cc:239
 msgid "Save undo history of"
 msgstr ""
 
-#: rc_option_editor.cc:180 rc_option_editor.cc:187
+#: rc_option_editor.cc:248 rc_option_editor.cc:255
 msgid "commands"
 msgstr ""
 
-#: rc_option_editor.cc:325
+#: rc_option_editor.cc:378
+msgid ""
+"\n"
+"Changes to this setting will only persist after your project has been saved."
+msgstr ""
+
+#: rc_option_editor.cc:389 rc_option_editor.cc:451
+msgid "<b>Recommended Setting: %1 + button 3 (right mouse button)</b>%2"
+msgstr ""
+
+#: rc_option_editor.cc:403
+msgid "Select Keyboard layout:"
+msgstr ""
+
+#: rc_option_editor.cc:422
+msgid "When Clicking:"
+msgstr ""
+
+#: rc_option_editor.cc:429
 msgid "Edit using:"
 msgstr ""
 
-#: rc_option_editor.cc:331 rc_option_editor.cc:357 rc_option_editor.cc:384
+#: rc_option_editor.cc:435 rc_option_editor.cc:465 rc_option_editor.cc:495
 msgid "+ button"
 msgstr "+ κουμπί"
 
-#: rc_option_editor.cc:351
+#: rc_option_editor.cc:459
 msgid "Delete using:"
 msgstr ""
 
-#: rc_option_editor.cc:378
+#: rc_option_editor.cc:481
+msgid "<b>Recommended Setting: %1 + button 1 (left mouse button)</b>%2"
+msgstr ""
+
+#: rc_option_editor.cc:489
 msgid "Insert note using:"
 msgstr ""
 
-#: rc_option_editor.cc:405
-msgid "Ignore snap using:"
+#: rc_option_editor.cc:507
+msgid "When Beginning a Drag:"
 msgstr ""
 
-#: rc_option_editor.cc:421
-msgid "Keyboard layout:"
+#: rc_option_editor.cc:518 rc_option_editor.cc:545 rc_option_editor.cc:578
+#: rc_option_editor.cc:599 rc_option_editor.cc:643 rc_option_editor.cc:676
+#: rc_option_editor.cc:702 rc_option_editor.cc:730 rc_option_editor.cc:759
+#: rc_option_editor.cc:781
+msgid "<b>Recommended Setting: %1</b>%2"
 msgstr ""
 
-#: rc_option_editor.cc:544
-msgid "Font scaling:"
+#: rc_option_editor.cc:532
+msgid "Copy items using:"
 msgstr ""
 
-#: rc_option_editor.cc:547
-msgid "Default"
+#: rc_option_editor.cc:559
+msgid "Constrain drag using:"
 msgstr ""
 
-#: rc_option_editor.cc:573
-msgid "Major font-scale changes require an application restart to re-layout."
+#: rc_option_editor.cc:567
+msgid "When Beginning a Trim:"
 msgstr ""
 
-#: rc_option_editor.cc:614
-msgid "Waveform Clip Level (dBFS):"
+#: rc_option_editor.cc:586
+msgid "Trim contents using:"
 msgstr ""
 
-#: rc_option_editor.cc:666
-msgid "Playback (seconds of buffering):"
+#: rc_option_editor.cc:607
+msgid "Anchored trim using:"
 msgstr ""
 
-#: rc_option_editor.cc:679
-msgid "Recording (seconds of buffering):"
+#: rc_option_editor.cc:651
+msgid "Resize notes relatively using:"
 msgstr ""
 
-#: rc_option_editor.cc:737
-msgid "Control Surface Protocol"
+#: rc_option_editor.cc:660
+msgid "While Dragging:"
 msgstr ""
 
-#: rc_option_editor.cc:746
-msgid "Double-click on a name to edit settings for an enabled protocol"
+#: rc_option_editor.cc:684
+msgid "Ignore snap using:"
 msgstr ""
 
-#: rc_option_editor.cc:903
-msgid "Show Video Export Info before export"
+#: rc_option_editor.cc:710
+msgid "Snap relatively using:"
 msgstr ""
 
-#: rc_option_editor.cc:904
-msgid "Show Video Server Startup Dialog"
+#: rc_option_editor.cc:718
+msgid "While Trimming:"
 msgstr ""
 
-#: rc_option_editor.cc:905
-msgid "Advanced Setup (remote video server)"
+#: rc_option_editor.cc:738
+msgid "Resize overlapped regions using:"
 msgstr ""
 
-#: rc_option_editor.cc:913
-msgid ""
-"<b>When enabled</b> you can speficify a custom video-server URL and docroot. "
-"- Do not enable this option unless you know what you are doing."
+#: rc_option_editor.cc:746
+msgid "While Dragging Control Points:"
 msgstr ""
 
-#: rc_option_editor.cc:915
-msgid "Video Server URL:"
+#: rc_option_editor.cc:767
+msgid "Fine adjust using:"
 msgstr ""
 
-#: rc_option_editor.cc:920
-msgid ""
-"Base URL of the video-server including http prefix. This is usually 'http://"
-"hostname.example.org:1554/' and defaults to 'http://localhost:1554/' when "
-"the video-server is running locally"
+#: rc_option_editor.cc:789
+msgid "Push points using:"
 msgstr ""
 
-#: rc_option_editor.cc:922
-msgid "Video Folder:"
+#: rc_option_editor.cc:1029
+msgid "GUI and Font scaling:"
 msgstr ""
 
-#: rc_option_editor.cc:927
-msgid ""
-"Local path to the video-server document-root. Only files below this "
-"directory will be accessible by the video-server. If the server run on a "
-"remote host, it should point to a network mounted folder of the server's "
-"docroot or be left empty if it is unvailable. It is used for the local video-"
-"monitor and file-browsing when opening/adding a video file."
+#: rc_option_editor.cc:1032
+msgid "Default"
 msgstr ""
 
-#: rc_option_editor.cc:934
-msgid ""
-"<b>When enabled</b> an information window with details is displayed before "
-"the video-export dialog."
+#: rc_option_editor.cc:1058
+msgid "Adjusting the scale requires an application restart to re-layout."
 msgstr ""
 
-#: rc_option_editor.cc:939
-msgid ""
-"<b>When enabled</b> the video server is never launched automatically without "
-"confirmation"
+#: rc_option_editor.cc:1100
+msgid "∞"
 msgstr ""
 
-#: rc_option_editor.cc:1022
-msgid "Always Display Plugin Scan Progress"
+#: rc_option_editor.cc:1101
+msgid "30 sec"
 msgstr ""
 
-#: rc_option_editor.cc:1023
-msgid "Scan for [new] VST Plugins on Application Start"
+#: rc_option_editor.cc:1102
+msgid "1 min"
 msgstr ""
 
-#: rc_option_editor.cc:1024
-msgid "Scan for AudioUnit Plugins on Application Start"
+#: rc_option_editor.cc:1103
+msgid "2 mins"
 msgstr ""
 
-#: rc_option_editor.cc:1035
-msgid "General"
+#: rc_option_editor.cc:1104
+msgid "3 mins"
 msgstr ""
 
-#: rc_option_editor.cc:1041
-msgid "Scan for Plugins"
+#: rc_option_editor.cc:1105
+msgid "4 mins"
 msgstr ""
 
-#: rc_option_editor.cc:1048
-msgid ""
-"<b>When enabled</b> a popup window showing plugin scan progress is displayed "
-"for indexing (cache load) and discovery (detect new plugins)"
+#: rc_option_editor.cc:1106
+msgid "5 mins"
 msgstr ""
 
-#: rc_option_editor.cc:1055
+#: rc_option_editor.cc:1109
 msgid ""
-"Specify the default timeout for plugin instantiation in 1/10 seconds. "
-"Plugins that require more time to load will be blacklisted. A value of 0 "
-"disables the timeout."
+"Specify the default timeout for plugin instantiation. Plugins that require "
+"more time to load will be blacklisted. A value of 0 disables the timeout."
 msgstr ""
 
-#: rc_option_editor.cc:1057
-msgid "Scan Time Out [deciseconds]"
+#: rc_option_editor.cc:1111
+msgid "Scan Time Out:"
 msgstr ""
 
-#: rc_option_editor.cc:1065
-msgid "VST"
+#: rc_option_editor.cc:1159
+msgid "Waveform Clip Level (dBFS):"
 msgstr ""
 
-#: rc_option_editor.cc:1071
-msgid "Clear VST Cache"
+#: rc_option_editor.cc:1212
+msgid "Small sessions (4-16 tracks)"
 msgstr ""
 
-#: rc_option_editor.cc:1075
-msgid "Clear VST Blacklist"
+#: rc_option_editor.cc:1213
+msgid "Medium sessions (16-64 tracks)"
 msgstr ""
 
-#: rc_option_editor.cc:1083
-msgid ""
-"<b>When enabled</b> new VST plugins are searched, tested and added to the "
-"cache index on application start. When disabled new plugins will only be "
-"available after triggering a 'Scan' manually"
+#: rc_option_editor.cc:1214
+msgid "Large sessions (64+ tracks)"
 msgstr ""
 
-#: rc_option_editor.cc:1086
-msgid "Linux VST Path:"
+#: rc_option_editor.cc:1215
+msgid "Custom (set by sliders below)"
 msgstr ""
 
-#: rc_option_editor.cc:1093
-msgid "Windows VST Path:"
+#: rc_option_editor.cc:1219 export_video_dialog.cc:167
+msgid "Preset:"
 msgstr ""
 
-#: rc_option_editor.cc:1102
-msgid "Audio Unit"
+#: rc_option_editor.cc:1231
+msgid "Playback (seconds of buffering):"
 msgstr ""
 
-#: rc_option_editor.cc:1111
-msgid ""
-"<b>When enabled</b> Audio Unit Plugins are discovered on application start. "
-"When disabled AU plugins will only be available after triggering a 'Scan' "
-"manually. The first successful scan will enable AU auto-scan, Any crash "
-"during plugin discovery will disable it."
+#: rc_option_editor.cc:1244
+msgid "Recording (seconds of buffering):"
 msgstr ""
 
-#: rc_option_editor.cc:1114
-msgid "Clear AU Cache"
+#: rc_option_editor.cc:1322
+msgid "programming error: unknown buffering preset string, index = %1"
 msgstr ""
 
-#: rc_option_editor.cc:1118
-msgid "Clear AU Blacklist"
+#: rc_option_editor.cc:1353
+msgid "Control Surface Protocol"
 msgstr ""
 
-#: rc_option_editor.cc:1201
-msgid "Set Windows VST Search Path"
+#: rc_option_editor.cc:1367
+msgid ""
+"Click to edit the settings for selected protocol ( it must be ENABLED "
+"first ):"
 msgstr ""
 
-#: rc_option_editor.cc:1216
-msgid "Set Linux VST Search Path"
+#: rc_option_editor.cc:1371
+msgid "Show Protocol Settings"
 msgstr ""
 
-#: rc_option_editor.cc:1297
-msgid "%1 Preferences"
+#: rc_option_editor.cc:1494
+msgid "Configuration"
 msgstr ""
 
-#: rc_option_editor.cc:1309
-msgid "DSP CPU Utilization"
+#: rc_option_editor.cc:1547
+msgid "Show Video Export Info before export"
 msgstr ""
 
-#: rc_option_editor.cc:1313
-msgid "Signal processing uses"
+#: rc_option_editor.cc:1548
+msgid "Show Video Server Startup Dialog"
 msgstr ""
 
-#: rc_option_editor.cc:1318
-msgid "all but one processor"
+#: rc_option_editor.cc:1549
+msgid "Advanced Setup (remote video server)"
+msgstr ""
+
+#: rc_option_editor.cc:1556
+msgid "Video Server"
+msgstr ""
+
+#: rc_option_editor.cc:1565
+msgid ""
+"<b>When enabled</b> you can speficify a custom video-server URL and docroot. "
+"- Do not enable this option unless you know what you are doing."
+msgstr ""
+
+#: rc_option_editor.cc:1567
+msgid "Video Server URL:"
+msgstr ""
+
+#: rc_option_editor.cc:1572
+msgid ""
+"Base URL of the video-server including http prefix. This is usually 'http://"
+"hostname.example.org:1554/' and defaults to 'http://localhost:1554/' when "
+"the video-server is running locally"
+msgstr ""
+
+#: rc_option_editor.cc:1574
+msgid "Video Folder:"
+msgstr ""
+
+#: rc_option_editor.cc:1579
+msgid ""
+"Local path to the video-server document-root. Only files below this "
+"directory will be accessible by the video-server. If the server run on a "
+"remote host, it should point to a network mounted folder of the server's "
+"docroot or be left empty if it is unvailable. It is used for the local video-"
+"monitor and file-browsing when opening/adding a video file."
+msgstr ""
+
+#: rc_option_editor.cc:1584
+msgid ""
+"<b>When enabled</b> an information window with details is displayed before "
+"the video-export dialog."
+msgstr ""
+
+#: rc_option_editor.cc:1589
+msgid ""
+"<b>When enabled</b> the video server is never launched automatically without "
+"confirmation"
+msgstr ""
+
+#: rc_option_editor.cc:1598
+msgid "Custom Path to Video Monitor (%1) - leave empty for default:"
 msgstr ""
 
-#: rc_option_editor.cc:1319
+#: rc_option_editor.cc:1610
+msgid ""
+"Set a custom path to the Video Monitor Executable, changing this requires a "
+"restart."
+msgstr ""
+
+#: rc_option_editor.cc:1661
+msgid "Set Video Monitor Executable"
+msgstr ""
+
+#: rc_option_editor.cc:1734
+msgid "Column %1"
+msgstr ""
+
+#: rc_option_editor.cc:1852
+msgid "%1 Preferences"
+msgstr ""
+
+#: rc_option_editor.cc:1874
+msgid "DSP CPU Utilization"
+msgstr ""
+
+#: rc_option_editor.cc:1878
+msgid "Signal processing uses"
+msgstr ""
+
+#: rc_option_editor.cc:1883
+msgid "all but one processor"
+msgstr ""
+
+#: rc_option_editor.cc:1884
 msgid "all available processors"
 msgstr ""
 
-#: rc_option_editor.cc:1322
+#: rc_option_editor.cc:1887
 msgid "%1 processors"
 msgstr ""
 
-#: rc_option_editor.cc:1325
+#: rc_option_editor.cc:1890
 msgid "This setting will only take effect when %1 is restarted."
 msgstr ""
 
-#: rc_option_editor.cc:1330
+#: rc_option_editor.cc:1895
 msgid "Options|Undo"
 msgstr ""
 
-#: rc_option_editor.cc:1337
+#: rc_option_editor.cc:1902
 msgid "Verify removal of last capture"
 msgstr ""
 
-#: rc_option_editor.cc:1345
-msgid "Make periodic backups of the session file"
+#: rc_option_editor.cc:1907
+msgid "Session Management"
 msgstr ""
 
-#: rc_option_editor.cc:1350
-msgid "Session Management"
+#: rc_option_editor.cc:1912
+msgid "Make periodic backups of the session file"
 msgstr ""
 
-#: rc_option_editor.cc:1355
+#: rc_option_editor.cc:1920
 msgid "Always copy imported files"
 msgstr ""
 
-#: rc_option_editor.cc:1362
+#: rc_option_editor.cc:1927
 msgid "Default folder for new sessions:"
 msgstr ""
 
-#: rc_option_editor.cc:1370
+#: rc_option_editor.cc:1935
 msgid "Maximum number of recent sessions"
 msgstr ""
 
-#: rc_option_editor.cc:1383
+#: rc_option_editor.cc:1941 rc_option_editor.cc:1943 rc_option_editor.cc:1945
+msgid "Misc/Click"
+msgstr ""
+
+#: rc_option_editor.cc:1948
 msgid "Click gain level"
 msgstr ""
 
-#: rc_option_editor.cc:1388 route_time_axis.cc:266 route_time_axis.cc:821
+#: rc_option_editor.cc:1953 route_time_axis.cc:277 route_time_axis.cc:831
 msgid "Automation"
 msgstr "Αυτοματισμός"
 
-#: rc_option_editor.cc:1393
+#: rc_option_editor.cc:1958
 msgid "Thinning factor (larger value => less data)"
 msgstr ""
 
-#: rc_option_editor.cc:1402
+#: rc_option_editor.cc:1967
 msgid "Automation sampling interval (milliseconds)"
 msgstr ""
 
-#: rc_option_editor.cc:1414
+#: rc_option_editor.cc:1975
+msgid "Transport Options"
+msgstr ""
+
+#: rc_option_editor.cc:1981
 msgid "Keep record-enable engaged on stop"
 msgstr ""
 
-#: rc_option_editor.cc:1423
+#: rc_option_editor.cc:1990
 msgid "Play loop is a transport mode"
 msgstr ""
 
-#: rc_option_editor.cc:1428
+#: rc_option_editor.cc:1995
 msgid ""
 "<b>When enabled</b> the loop button does not start playback but forces "
 "playback to always play the loop\n"
@@ -8943,25 +10645,25 @@ msgid ""
 "cancels loop playback"
 msgstr ""
 
-#: rc_option_editor.cc:1434
+#: rc_option_editor.cc:2001
 msgid "Stop recording when an xrun occurs"
 msgstr ""
 
-#: rc_option_editor.cc:1439
+#: rc_option_editor.cc:2006
 msgid ""
 "<b>When enabled</b> %1 will stop recording if an over- or underrun is "
 "detected by the audio engine"
 msgstr ""
 
-#: rc_option_editor.cc:1445
+#: rc_option_editor.cc:2012
 msgid "Create markers where xruns occur"
 msgstr ""
 
-#: rc_option_editor.cc:1454
+#: rc_option_editor.cc:2021
 msgid "Stop at the end of the session"
 msgstr ""
 
-#: rc_option_editor.cc:1459
+#: rc_option_editor.cc:2026
 msgid ""
 "<b>When enabled</b> if %1 is <b>not recording</b>, it will stop the "
 "transport when it reaches the current session end marker\n"
@@ -8970,11 +10672,11 @@ msgid ""
 "all times"
 msgstr ""
 
-#: rc_option_editor.cc:1467
+#: rc_option_editor.cc:2034
 msgid "Do seamless looping (not possible when slaved to MTC, LTC etc)"
 msgstr ""
 
-#: rc_option_editor.cc:1472
+#: rc_option_editor.cc:2039
 msgid ""
 "<b>When enabled</b> this will loop by reading ahead and wrapping around at "
 "the loop point, preventing any need to do a transport locate at the end of "
@@ -8984,39 +10686,83 @@ msgid ""
 "loop when %1 reaches the end which will often cause a small click or delay"
 msgstr ""
 
-#: rc_option_editor.cc:1480
+#: rc_option_editor.cc:2047
 msgid "Disable per-track record disarm while rolling"
 msgstr ""
 
-#: rc_option_editor.cc:1484
+#: rc_option_editor.cc:2051
 msgid ""
 "<b>When enabled</b> this will prevent you from accidentally stopping "
 "specific tracks recording during a take"
 msgstr ""
 
-#: rc_option_editor.cc:1489
+#: rc_option_editor.cc:2056
 msgid "12dB gain reduction during fast-forward and fast-rewind"
 msgstr ""
 
-#: rc_option_editor.cc:1493
+#: rc_option_editor.cc:2060
 msgid ""
 "This will reduce the unpleasant increase in perceived volume that occurs "
 "when fast-forwarding or rewinding through some kinds of audio"
 msgstr ""
 
-#: rc_option_editor.cc:1497
-msgid "Sync/Slave"
+#: rc_option_editor.cc:2066
+msgid "Preroll"
+msgstr ""
+
+#: rc_option_editor.cc:2071
+msgid ""
+"The amount of preroll (in seconds) to apply when <b>Play with Preroll</b> is "
+"initiated.\n"
+"\n"
+"If <b>Follow Edits</b> is enabled, the preroll is applied to the playhead "
+"position when a region is selected or trimmed."
+msgstr ""
+
+#: rc_option_editor.cc:2073
+msgid "0 (no pre-roll)"
+msgstr ""
+
+#: rc_option_editor.cc:2074
+msgid "0.1 second"
+msgstr ""
+
+#: rc_option_editor.cc:2075
+msgid "0.25 second"
+msgstr ""
+
+#: rc_option_editor.cc:2076
+msgid "0.5 second"
+msgstr ""
+
+#: rc_option_editor.cc:2077
+msgid "1.0 second"
+msgstr ""
+
+#: rc_option_editor.cc:2078
+msgid "2.0 seconds"
+msgstr ""
+
+#: rc_option_editor.cc:2081 rc_option_editor.cc:2090 rc_option_editor.cc:2106
+#: rc_option_editor.cc:2127 rc_option_editor.cc:2145 rc_option_editor.cc:2147
+#: rc_option_editor.cc:2164 rc_option_editor.cc:2167 rc_option_editor.cc:2169
+#: rc_option_editor.cc:2197
+msgid "Transport/Sync"
 msgstr ""
 
-#: rc_option_editor.cc:1501
+#: rc_option_editor.cc:2081
+msgid "Synchronization and Slave Options"
+msgstr ""
+
+#: rc_option_editor.cc:2085
 msgid "External timecode source"
 msgstr ""
 
-#: rc_option_editor.cc:1510
+#: rc_option_editor.cc:2094
 msgid "Match session video frame rate to external timecode"
 msgstr ""
 
-#: rc_option_editor.cc:1516
+#: rc_option_editor.cc:2100
 msgid ""
 "This option controls the value of the video frame rate <i>while chasing</i> "
 "an external timecode source.\n"
@@ -9030,27 +10776,27 @@ msgid ""
 "external timecode standard and the session standard."
 msgstr ""
 
-#: rc_option_editor.cc:1526
-msgid "Sync lock timecode to clock - Disable drift compensation."
+#: rc_option_editor.cc:2110
+msgid "Sync-lock timecode to clock (disable drift compensation)"
 msgstr ""
 
-#: rc_option_editor.cc:1532
+#: rc_option_editor.cc:2116
 msgid ""
 "<b>When enabled</b> %1 will never varispeed when slaved to external "
 "timecode. Sync Lock indicates that the selected external timecode source "
 "shares clock-sync (Black & Burst, Wordclock, etc) with the audio "
 "interface. This option disables drift compensation. The transport speed is "
-"fixed at 1.0.Varispeed LTC will be ignored and cause drift.\n"
+"fixed at 1.0. Vari-speed LTC will be ignored and cause drift.\n"
 "\n"
 "<b>When disabled</b> %1 will compensate for potential drift, regardless if "
 "the timecode sources shares clock sync."
 msgstr ""
 
-#: rc_option_editor.cc:1547
+#: rc_option_editor.cc:2131
 msgid "Lock to 29.9700 fps instead of 30000/1001"
 msgstr ""
 
-#: rc_option_editor.cc:1553
+#: rc_option_editor.cc:2137
 msgid ""
 "<b>When enabled</b> the external timecode source is assumed to use 29.97 fps "
 "instead of 30000/1001.\n"
@@ -9063,659 +10809,926 @@ msgid ""
 "variant of using exactly 29.97 fps has zero timecode drift.\n"
 msgstr ""
 
-#: rc_option_editor.cc:1563
+#: rc_option_editor.cc:2147
 msgid "LTC Reader"
 msgstr ""
 
-#: rc_option_editor.cc:1567
+#: rc_option_editor.cc:2151
 msgid "LTC incoming port"
 msgstr ""
 
-#: rc_option_editor.cc:1582
+#: rc_option_editor.cc:2167
 msgid "LTC Generator"
 msgstr ""
 
-#: rc_option_editor.cc:1587
+#: rc_option_editor.cc:2172
 msgid "Enable LTC generator"
 msgstr ""
 
-#: rc_option_editor.cc:1594
+#: rc_option_editor.cc:2179
 msgid "Send LTC while stopped"
 msgstr ""
 
-#: rc_option_editor.cc:1600
+#: rc_option_editor.cc:2185
 msgid ""
 "<b>When enabled</b> %1 will continue to send LTC information even when the "
 "transport (playhead) is not moving"
 msgstr ""
 
-#: rc_option_editor.cc:1606
+#: rc_option_editor.cc:2191
 msgid "LTC generator level"
 msgstr ""
 
-#: rc_option_editor.cc:1610
+#: rc_option_editor.cc:2195
 msgid ""
 "Specify the Peak Volume of the generated LTC signal in dbFS. A good value "
 "is  0dBu ^= -18dbFS in an EBU calibrated system"
 msgstr ""
 
-#: rc_option_editor.cc:1622
-msgid "Allow dragging of playhead"
+#: rc_option_editor.cc:2204
+msgid "Make rubberband selection rectangle snap to the grid"
 msgstr ""
 
-#: rc_option_editor.cc:1630
-msgid "Move relevant automation when audio regions are moved"
+#: rc_option_editor.cc:2211
+msgid "Name new markers"
 msgstr ""
 
-#: rc_option_editor.cc:1638
-msgid "Show meters on tracks in the editor"
+#: rc_option_editor.cc:2216
+msgid ""
+"If enabled, popup a dialog when a new marker is created to allow its name to "
+"be set as it is created.\n"
+"\n"
+"You can always rename markers by right-clicking on them"
 msgstr ""
 
-#: rc_option_editor.cc:1646
+#: rc_option_editor.cc:2222
+msgid "Allow dragging of playhead"
+msgstr ""
+
+#: rc_option_editor.cc:2230
 msgid "Display master-meter in the toolbar"
 msgstr ""
 
-#: rc_option_editor.cc:1653
-msgid "Default fade shape"
+#: rc_option_editor.cc:2239
+msgid "Show zoom toolbar (if torn off)"
 msgstr ""
 
-#: rc_option_editor.cc:1672
-msgid "Regions in active edit groups are edited together"
+#: rc_option_editor.cc:2247
+msgid ""
+"Always use mouse cursor position as zoom focus when zooming using mouse "
+"scroll wheel"
 msgstr ""
 
-#: rc_option_editor.cc:1673
-msgid "whenever they overlap in time"
+#: rc_option_editor.cc:2256
+msgid "Update editor window during drags of the summary"
 msgstr ""
 
-#: rc_option_editor.cc:1674
-msgid "only if they have identical length, position and origin"
+#: rc_option_editor.cc:2264
+msgid "Auto-scroll editor window when dragging near its edges"
 msgstr ""
 
-#: rc_option_editor.cc:1684
-msgid "Make rubberband selection rectangle snap to the grid"
+#: rc_option_editor.cc:2272
+msgid "Show gain envelopes in audio regions"
 msgstr ""
 
-#: rc_option_editor.cc:1692
-msgid "Show waveforms in regions"
+#: rc_option_editor.cc:2273
+msgid "in all modes"
 msgstr ""
 
-#: rc_option_editor.cc:1700
-msgid "Show gain envelopes in audio regions"
+#: rc_option_editor.cc:2274
+msgid "only in Draw and Internal Edit modes"
 msgstr ""
 
-#: rc_option_editor.cc:1701
-msgid "in all modes"
+#: rc_option_editor.cc:2279
+msgid "Editor Behavior"
 msgstr ""
 
-#: rc_option_editor.cc:1702
-msgid "only in region gain mode"
+#: rc_option_editor.cc:2284
+msgid "Move relevant automation when audio regions are moved"
 msgstr ""
 
-#: rc_option_editor.cc:1709
-msgid "Waveform scale"
+#: rc_option_editor.cc:2291
+msgid "Default fade shape"
 msgstr ""
 
-#: rc_option_editor.cc:1714
-msgid "linear"
-msgstr "γραμμική"
+#: rc_option_editor.cc:2310
+msgid "Regions in active edit groups are edited together"
+msgstr ""
 
-#: rc_option_editor.cc:1715
-msgid "logarithmic"
+#: rc_option_editor.cc:2311
+msgid "whenever they overlap in time"
 msgstr ""
 
-#: rc_option_editor.cc:1721
-msgid "Waveform shape"
+#: rc_option_editor.cc:2312
+msgid "only if they have identical length, position and origin"
 msgstr ""
 
-#: rc_option_editor.cc:1726
-msgid "traditional"
+#: rc_option_editor.cc:2321
+msgid "Layering model"
 msgstr ""
 
-#: rc_option_editor.cc:1727
-msgid "rectified"
+#: rc_option_editor.cc:2326
+msgid "later is higher"
 msgstr ""
 
-#: rc_option_editor.cc:1736
-msgid "Show waveforms for audio while it is being recorded"
+#: rc_option_editor.cc:2327
+msgid "manual layering"
 msgstr ""
 
-#: rc_option_editor.cc:1744
-msgid "Show zoom toolbar"
+#: rc_option_editor.cc:2332
+msgid "After splitting selected regions, select"
 msgstr ""
 
-#: rc_option_editor.cc:1752
-msgid "Update editor window during drags of the summary"
+#: rc_option_editor.cc:2337
+msgid "no regions"
 msgstr ""
 
-#: rc_option_editor.cc:1760
-msgid "Synchronise editor and mixer selection"
+#: rc_option_editor.cc:2340
+msgid "newly-created regions"
 msgstr ""
 
-#: rc_option_editor.cc:1767
-msgid "Name new markers"
+#: rc_option_editor.cc:2344
+msgid "existing selection and newly-created regions"
 msgstr ""
 
-#: rc_option_editor.cc:1773
-msgid ""
-"If enabled, popup a dialog when a new marker is created to allow its name to "
-"be set as it is created.\n"
-"\n"
-"You can always rename markers by right-clicking on them"
+#: rc_option_editor.cc:2348 rc_option_editor.cc:2351 rc_option_editor.cc:2360
+#: rc_option_editor.cc:2378 rc_option_editor.cc:2390 rc_option_editor.cc:2392
+msgid "Editor/Waveforms"
 msgstr ""
 
-#: rc_option_editor.cc:1779
-msgid "Auto-scroll editor window when dragging near its edges"
+#: rc_option_editor.cc:2348
+msgid "Waveforms"
 msgstr ""
 
-#: rc_option_editor.cc:1786
-msgid "After splitting selected regions, select"
+#: rc_option_editor.cc:2354
+msgid "Show waveforms in regions"
 msgstr ""
 
-#: rc_option_editor.cc:1791
-msgid "no regions"
+#: rc_option_editor.cc:2363
+msgid "Show waveforms for audio while it is being recorded"
 msgstr ""
 
-#: rc_option_editor.cc:1794
-msgid "newly-created regions"
+#: rc_option_editor.cc:2370
+msgid "Waveform scale"
 msgstr ""
 
-#: rc_option_editor.cc:1798
-msgid "existing selection and newly-created regions"
+#: rc_option_editor.cc:2375
+msgid "linear"
+msgstr "γραμμική"
+
+#: rc_option_editor.cc:2376
+msgid "logarithmic"
 msgstr ""
 
-#: rc_option_editor.cc:1805
+#: rc_option_editor.cc:2382
+msgid "Waveform shape"
+msgstr ""
+
+#: rc_option_editor.cc:2387
+msgid "traditional"
+msgstr ""
+
+#: rc_option_editor.cc:2388
+msgid "rectified"
+msgstr ""
+
+#: rc_option_editor.cc:2397
 msgid "Buffering"
 msgstr ""
 
-#: rc_option_editor.cc:1813
+#: rc_option_editor.cc:2405
 msgid "Record monitoring handled by"
 msgstr ""
 
-#: rc_option_editor.cc:1819
+#: rc_option_editor.cc:2411
 msgid "via Audio Driver"
 msgstr ""
 
-#: rc_option_editor.cc:1825
+#: rc_option_editor.cc:2417
 msgid "audio hardware"
 msgstr ""
 
-#: rc_option_editor.cc:1832
+#: rc_option_editor.cc:2424
 msgid "Tape machine mode"
 msgstr ""
 
-#: rc_option_editor.cc:1837
+#: rc_option_editor.cc:2429
 msgid "Connection of tracks and busses"
 msgstr ""
 
-#: rc_option_editor.cc:1842
+#: rc_option_editor.cc:2435
 msgid "Auto-connect master/monitor busses"
 msgstr ""
 
-#: rc_option_editor.cc:1849
+#: rc_option_editor.cc:2442
 msgid "Connect track inputs"
 msgstr ""
 
-#: rc_option_editor.cc:1854
+#: rc_option_editor.cc:2447
 msgid "automatically to physical inputs"
 msgstr ""
 
-#: rc_option_editor.cc:1855 rc_option_editor.cc:1868
+#: rc_option_editor.cc:2448 rc_option_editor.cc:2461
 msgid "manually"
 msgstr ""
 
-#: rc_option_editor.cc:1861
+#: rc_option_editor.cc:2454
 msgid "Connect track and bus outputs"
 msgstr ""
 
-#: rc_option_editor.cc:1866
+#: rc_option_editor.cc:2459
 msgid "automatically to physical outputs"
 msgstr ""
 
-#: rc_option_editor.cc:1867
+#: rc_option_editor.cc:2460
 msgid "automatically to master bus"
 msgstr ""
 
-#: rc_option_editor.cc:1872
+#: rc_option_editor.cc:2467
+msgid "Use 'Strict-I/O' for new tracks or Busses"
+msgstr ""
+
+#: rc_option_editor.cc:2478
 msgid "Denormals"
 msgstr ""
 
-#: rc_option_editor.cc:1877
+#: rc_option_editor.cc:2483
 msgid "Use DC bias to protect against denormals"
 msgstr ""
 
-#: rc_option_editor.cc:1884
+#: rc_option_editor.cc:2490
 msgid "Processor handling"
 msgstr ""
 
-#: rc_option_editor.cc:1890
+#: rc_option_editor.cc:2496
 msgid "no processor handling"
 msgstr ""
 
-#: rc_option_editor.cc:1896
+#: rc_option_editor.cc:2502
 msgid "use FlushToZero"
 msgstr ""
 
-#: rc_option_editor.cc:1903
+#: rc_option_editor.cc:2509
 msgid "use DenormalsAreZero"
 msgstr ""
 
-#: rc_option_editor.cc:1910
+#: rc_option_editor.cc:2516
 msgid "use FlushToZero and DenormalsAreZero"
 msgstr ""
 
-#: rc_option_editor.cc:1926
-msgid "Silence plugins when the transport is stopped"
+#: rc_option_editor.cc:2532
+msgid "Enable automatic analysis of audio"
 msgstr ""
 
-#: rc_option_editor.cc:1934
-msgid "Make new plugins active"
+#: rc_option_editor.cc:2540
+msgid "Replicate missing region channels"
 msgstr ""
 
-#: rc_option_editor.cc:1944
-msgid "Enable automatic analysis of audio"
+#: rc_option_editor.cc:2547 rc_option_editor.cc:2556 rc_option_editor.cc:2558
+#: rc_option_editor.cc:2566 rc_option_editor.cc:2574 rc_option_editor.cc:2582
+#: rc_option_editor.cc:2600 rc_option_editor.cc:2612 rc_option_editor.cc:2624
+#: rc_option_editor.cc:2626 rc_option_editor.cc:2628 rc_option_editor.cc:2636
+#: rc_option_editor.cc:2644 rc_option_editor.cc:2652 rc_option_editor.cc:2662
+#: rc_option_editor.cc:2663
+msgid "Solo & mute"
 msgstr ""
 
-#: rc_option_editor.cc:1952
-msgid "Replicate missing region channels"
+#: rc_option_editor.cc:2551
+msgid "Solo controls are Listen controls"
 msgstr ""
 
-#: rc_option_editor.cc:1959 rc_option_editor.cc:1961 rc_option_editor.cc:1976
-#: rc_option_editor.cc:1988 rc_option_editor.cc:2000 rc_option_editor.cc:2012
-#: rc_option_editor.cc:2016 rc_option_editor.cc:2024 rc_option_editor.cc:2032
-#: rc_option_editor.cc:2040 rc_option_editor.cc:2042 rc_option_editor.cc:2050
-#: rc_option_editor.cc:2058 rc_option_editor.cc:2066 rc_option_editor.cc:2074
-#: rc_option_editor.cc:2076
-msgid "Solo / mute"
+#: rc_option_editor.cc:2561
+msgid "Exclusive solo"
 msgstr ""
 
-#: rc_option_editor.cc:1964
-msgid "Solo-in-place mute cut (dB)"
+#: rc_option_editor.cc:2569
+msgid "Show solo muting"
 msgstr ""
 
-#: rc_option_editor.cc:1971
-msgid "Solo controls are Listen controls"
+#: rc_option_editor.cc:2577
+msgid "Soloing overrides muting"
+msgstr ""
+
+#: rc_option_editor.cc:2585
+msgid "Solo-in-place mute cut (dB)"
 msgstr ""
 
-#: rc_option_editor.cc:1980
+#: rc_option_editor.cc:2592
 msgid "Listen Position"
 msgstr ""
 
-#: rc_option_editor.cc:1985
+#: rc_option_editor.cc:2597
 msgid "after-fader (AFL)"
 msgstr ""
 
-#: rc_option_editor.cc:1986
+#: rc_option_editor.cc:2598
 msgid "pre-fader (PFL)"
 msgstr ""
 
-#: rc_option_editor.cc:1992
+#: rc_option_editor.cc:2604
 msgid "PFL signals come from"
 msgstr ""
 
-#: rc_option_editor.cc:1997
+#: rc_option_editor.cc:2609
 msgid "before pre-fader processors"
 msgstr ""
 
-#: rc_option_editor.cc:1998
+#: rc_option_editor.cc:2610
 msgid "pre-fader but after pre-fader processors"
 msgstr ""
 
-#: rc_option_editor.cc:2004
+#: rc_option_editor.cc:2616
 msgid "AFL signals come from"
 msgstr ""
 
-#: rc_option_editor.cc:2009
+#: rc_option_editor.cc:2621
 msgid "immediately post-fader"
 msgstr ""
 
-#: rc_option_editor.cc:2010
+#: rc_option_editor.cc:2622
 msgid "after post-fader processors (before pan)"
 msgstr ""
 
-#: rc_option_editor.cc:2019
-msgid "Exclusive solo"
-msgstr ""
-
-#: rc_option_editor.cc:2027
-msgid "Show solo muting"
-msgstr ""
-
-#: rc_option_editor.cc:2035
-msgid "Soloing overrides muting"
-msgstr ""
-
-#: rc_option_editor.cc:2040
+#: rc_option_editor.cc:2626
 msgid "Default track / bus muting options"
 msgstr ""
 
-#: rc_option_editor.cc:2045
+#: rc_option_editor.cc:2631
 msgid "Mute affects pre-fader sends"
 msgstr ""
 
-#: rc_option_editor.cc:2053
+#: rc_option_editor.cc:2639
 msgid "Mute affects post-fader sends"
 msgstr ""
 
-#: rc_option_editor.cc:2061
+#: rc_option_editor.cc:2647
 msgid "Mute affects control outputs"
 msgstr ""
 
-#: rc_option_editor.cc:2069
+#: rc_option_editor.cc:2655
 msgid "Mute affects main outputs"
 msgstr ""
 
-#: rc_option_editor.cc:2074
+#: rc_option_editor.cc:2662
 msgid "Send Routing"
 msgstr ""
 
-#: rc_option_editor.cc:2079
+#: rc_option_editor.cc:2666
 msgid "Link panners of Aux and External Sends with main panner by default"
 msgstr ""
 
-#: rc_option_editor.cc:2087
+#: rc_option_editor.cc:2672
+msgid "MIDI Preferences"
+msgstr ""
+
+#: rc_option_editor.cc:2677
 msgid "MIDI read-ahead time (seconds)"
 msgstr ""
 
-#: rc_option_editor.cc:2105
-msgid "Send MIDI Time Code"
+#: rc_option_editor.cc:2687
+msgid "Initial program change"
+msgstr ""
+
+#: rc_option_editor.cc:2696
+msgid "Display first MIDI bank/program as 0"
+msgstr ""
+
+#: rc_option_editor.cc:2704
+msgid "Never display periodic MIDI messages (MTC, MIDI Clock)"
+msgstr ""
+
+#: rc_option_editor.cc:2712
+msgid "Sound MIDI notes as they are selected in the editor"
+msgstr ""
+
+#: rc_option_editor.cc:2720
+msgid "Send MIDI control feedback"
+msgstr ""
+
+#: rc_option_editor.cc:2725 rc_option_editor.cc:2727 rc_option_editor.cc:2735
+#: rc_option_editor.cc:2737 rc_option_editor.cc:2745 rc_option_editor.cc:2754
+#: rc_option_editor.cc:2756 rc_option_editor.cc:2764 rc_option_editor.cc:2772
+#: rc_option_editor.cc:2781
+msgid "MIDI/Sync"
+msgstr ""
+
+#: rc_option_editor.cc:2725
+msgid "MIDI Clock"
+msgstr ""
+
+#: rc_option_editor.cc:2735
+msgid "MIDI Time Code (MTC)"
+msgstr ""
+
+#: rc_option_editor.cc:2740
+msgid "Send MIDI Time Code"
+msgstr ""
+
+#: rc_option_editor.cc:2748
+msgid "Percentage either side of normal transport speed to transmit MTC"
+msgstr ""
+
+#: rc_option_editor.cc:2754
+msgid "Midi Machine Control (MMC)"
+msgstr ""
+
+#: rc_option_editor.cc:2759
+msgid "Obey MIDI Machine Control commands"
+msgstr ""
+
+#: rc_option_editor.cc:2767
+msgid "Send MIDI Machine Control commands"
+msgstr ""
+
+#: rc_option_editor.cc:2775
+msgid "Inbound MMC device ID"
+msgstr ""
+
+#: rc_option_editor.cc:2784
+msgid "Outbound MMC device ID"
+msgstr ""
+
+#: rc_option_editor.cc:2790
+msgid "Midi Audition"
+msgstr ""
+
+#: rc_option_editor.cc:2794
+msgid "Midi Audition Synth (LV2)"
+msgstr ""
+
+#: rc_option_editor.cc:2825 rc_option_editor.cc:2835 rc_option_editor.cc:2837
+msgid "User interaction"
+msgstr ""
+
+#: rc_option_editor.cc:2828
+msgid ""
+"Use translations of %1 messages\n"
+"   <i>(requires a restart of %1 to take effect)</i>\n"
+"   <i>(if available for your language preferences)</i>"
+msgstr ""
+
+#: rc_option_editor.cc:2835
+msgid "Keyboard"
+msgstr ""
+
+#: rc_option_editor.cc:2848 startup.cc:352
+msgid "Scan for Plugins"
+msgstr ""
+
+#: rc_option_editor.cc:2853
+msgid "General"
+msgstr ""
+
+#: rc_option_editor.cc:2858
+msgid "Always Display Plugin Scan Progress"
+msgstr ""
+
+#: rc_option_editor.cc:2864
+msgid ""
+"<b>When enabled</b> a popup window showing plugin scan progress is displayed "
+"for indexing (cache load) and discovery (detect new plugins)"
+msgstr ""
+
+#: rc_option_editor.cc:2869
+msgid "Silence plugins when the transport is stopped"
+msgstr ""
+
+#: rc_option_editor.cc:2875
+msgid ""
+"<b>When enabled</b> plugins will be reset at transport stop. When disabled "
+"plugins will be left unchanged at transport stop.\n"
+"\n"
+"This mostly affects plugins with a \"tail\" like Reverbs."
+msgstr ""
+
+#: rc_option_editor.cc:2879
+msgid "Make new plugins active"
+msgstr ""
+
+#: rc_option_editor.cc:2885
+msgid ""
+"<b>When enabled</b> plugins will be activated when they are added to tracks/"
+"busses. When disabled plugins will be left inactive when they are added to "
+"tracks/busses"
+msgstr ""
+
+#: rc_option_editor.cc:2888 rc_option_editor.cc:2896 rc_option_editor.cc:2908
+#: rc_option_editor.cc:2913 rc_option_editor.cc:2915 rc_option_editor.cc:2920
+#: rc_option_editor.cc:2927 rc_option_editor.cc:2932 rc_option_editor.cc:2941
+msgid "Plugins/VST"
+msgstr ""
+
+#: rc_option_editor.cc:2888
+msgid "VST"
+msgstr ""
+
+#: rc_option_editor.cc:2892
+msgid "Scan for [new] VST Plugins on Application Start"
+msgstr ""
+
+#: rc_option_editor.cc:2898
+msgid ""
+"<b>When enabled</b> new VST plugins are searched, tested and added to the "
+"cache index on application start. When disabled new plugins will only be "
+"available after triggering a 'Scan' manually"
+msgstr ""
+
+#: rc_option_editor.cc:2904
+msgid "Verbose Plugin Scan"
+msgstr ""
+
+#: rc_option_editor.cc:2910
+msgid ""
+"<b>When enabled</b> additional information for every plugin is added to the "
+"Log Window."
+msgstr ""
+
+#: rc_option_editor.cc:2918
+msgid "VST Cache:"
+msgstr ""
+
+#: rc_option_editor.cc:2923
+msgid "VST Blacklist:"
+msgstr ""
+
+#: rc_option_editor.cc:2930
+msgid "Linux VST Path:"
+msgstr ""
+
+#: rc_option_editor.cc:2935 rc_option_editor.cc:2948
+msgid "Path:"
+msgstr ""
+
+#: rc_option_editor.cc:2944
+msgid "Windows VST Path:"
 msgstr ""
 
-#: rc_option_editor.cc:2113
-msgid "Percentage either side of normal transport speed to transmit MTC"
+#: rc_option_editor.cc:2954 rc_option_editor.cc:2966 rc_option_editor.cc:2971
+msgid "Plugins/Audio Unit"
 msgstr ""
 
-#: rc_option_editor.cc:2122
-msgid "Obey MIDI Machine Control commands"
+#: rc_option_editor.cc:2954
+msgid "Audio Unit"
 msgstr ""
 
-#: rc_option_editor.cc:2130
-msgid "Send MIDI Machine Control commands"
+#: rc_option_editor.cc:2958
+msgid "Scan for AudioUnit Plugins on Application Start"
 msgstr ""
 
-#: rc_option_editor.cc:2138
-msgid "Send MIDI control feedback"
+#: rc_option_editor.cc:2964
+msgid ""
+"<b>When enabled</b> Audio Unit Plugins are discovered on application start. "
+"When disabled AU plugins will only be available after triggering a 'Scan' "
+"manually. The first successful scan will enable AU auto-scan, Any crash "
+"during plugin discovery will disable it."
 msgstr ""
 
-#: rc_option_editor.cc:2146
-msgid "Inbound MMC device ID"
+#: rc_option_editor.cc:2969
+msgid "AU Cache:"
 msgstr ""
 
-#: rc_option_editor.cc:2155
-msgid "Outbound MMC device ID"
+#: rc_option_editor.cc:2974
+msgid "AU Blacklist:"
 msgstr ""
 
-#: rc_option_editor.cc:2164
-msgid "Initial program change"
+#: rc_option_editor.cc:2978
+msgid "Plugin GUI"
 msgstr ""
 
-#: rc_option_editor.cc:2173
-msgid "Display first MIDI bank/program as 0"
+#: rc_option_editor.cc:2982
+msgid "Automatically open the plugin GUI when adding a new plugin"
 msgstr ""
 
-#: rc_option_editor.cc:2181
-msgid "Never display periodic MIDI messages (MTC, MIDI Clock)"
+#: rc_option_editor.cc:2991
+msgid "Show Plugin Inline Display on Mixerstrip by default"
 msgstr ""
 
-#: rc_option_editor.cc:2189
-msgid "Sound MIDI notes as they are selected"
+#: rc_option_editor.cc:2998
+msgid ""
+"Don't automatically open the plugin GUI when the plugin has an inline "
+"display mode"
 msgstr ""
 
-#: rc_option_editor.cc:2194
-msgid "Midi Audition"
+#: rc_option_editor.cc:3005
+msgid "Instrument"
 msgstr ""
 
-#: rc_option_editor.cc:2198
-msgid "Midi Audition Synth (LV2)"
+#: rc_option_editor.cc:3009
+msgid "Ask to replace existing instrument plugin"
 msgstr ""
 
-#: rc_option_editor.cc:2229 rc_option_editor.cc:2239 rc_option_editor.cc:2241
-msgid "User interaction"
+#: rc_option_editor.cc:3017
+msgid "Interactively configure instrument plugins on insert"
 msgstr ""
 
-#: rc_option_editor.cc:2232
+#: rc_option_editor.cc:3023
 msgid ""
-"Use translations of %1 messages\n"
-"   <i>(requires a restart of %1 to take effect)</i>\n"
-"   <i>(if available for your language preferences)</i>"
+"<b>When enabled</b> show a dialog to select instrument channel configuration "
+"before adding a multichannel plugin."
 msgstr ""
 
-#: rc_option_editor.cc:2239
-msgid "Keyboard"
+#: rc_option_editor.cc:3032
+msgid "Disable Graphics Hardware Acceleration (requires restart)"
 msgstr ""
 
-#: rc_option_editor.cc:2249
-msgid "Control surface remote ID"
+#: rc_option_editor.cc:3038
+msgid ""
+"Render large parts of the application user-interface in software, instead of "
+"using 2D-graphics acceleration.\n"
+"This requires restarting %1 before having an effect"
 msgstr ""
 
-#: rc_option_editor.cc:2254
-msgid "assigned by user"
+#: rc_option_editor.cc:3039 rc_option_editor.cc:3051 rc_option_editor.cc:3054
+#: rc_option_editor.cc:3062 rc_option_editor.cc:3070 rc_option_editor.cc:3078
+#: rc_option_editor.cc:3086 rc_option_editor.cc:3097 rc_option_editor.cc:3113
+#: rc_option_editor.cc:3129 rc_option_editor.cc:3144 rc_option_editor.cc:3153
+#: rc_option_editor.cc:3161
+msgid "Preferences|GUI"
 msgstr ""
 
-#: rc_option_editor.cc:2255
-msgid "follows order of mixer"
+#: rc_option_editor.cc:3045
+msgid "Possibly improve slow graphical performance (requires restart)"
 msgstr ""
 
-#: rc_option_editor.cc:2269 rc_option_editor.cc:2278 rc_option_editor.cc:2287
-#: rc_option_editor.cc:2297 rc_option_editor.cc:2321 rc_option_editor.cc:2334
-#: rc_option_editor.cc:2343
-msgid "Preferences|GUI"
+#: rc_option_editor.cc:3050
+msgid ""
+"Disables hardware gradient rendering on buggy video drivers (\"buggy "
+"gradients patch\").\n"
+"This requires restarting %1 before having an effect"
 msgstr ""
 
-#: rc_option_editor.cc:2272
+#: rc_option_editor.cc:3057
+msgid "Use Window Manager/Desktop visibility information"
+msgstr ""
+
+#: rc_option_editor.cc:3065
 msgid "Graphically indicate mouse pointer hovering over various widgets"
 msgstr ""
 
-#: rc_option_editor.cc:2281
+#: rc_option_editor.cc:3073
 msgid "Show tooltips if mouse hovers over a control"
 msgstr ""
 
-#: rc_option_editor.cc:2290
+#: rc_option_editor.cc:3081
 msgid "Use name highlight bars in region displays (requires a restart)"
 msgstr ""
 
-#: rc_option_editor.cc:2303
-msgid "update transport clock display at FPS instead of every 100ms"
+#: rc_option_editor.cc:3089
+msgid "Update transport clock display at FPS instead of every 100ms"
 msgstr ""
 
-#: rc_option_editor.cc:2312
+#: rc_option_editor.cc:3104
+msgid "Waveform image cache size (megabytes)"
+msgstr ""
+
+#: rc_option_editor.cc:3112
+msgid ""
+"Increasing the cache size uses more memory to store waveform images, which "
+"can improve graphical performance."
+msgstr ""
+
+#: rc_option_editor.cc:3120
 msgid "Lock timeout (seconds)"
 msgstr ""
 
-#: rc_option_editor.cc:2320
+#: rc_option_editor.cc:3128
 msgid "Lock GUI after this many idle seconds (zero to never lock)"
 msgstr ""
 
-#: rc_option_editor.cc:2336
+#: rc_option_editor.cc:3146
 msgid "Mixer Strip"
 msgstr ""
 
-#: rc_option_editor.cc:2346
+#: rc_option_editor.cc:3156
 msgid "Use narrow strips in the mixer by default"
 msgstr ""
 
-#: rc_option_editor.cc:2351 rc_option_editor.cc:2365 rc_option_editor.cc:2384
-#: rc_option_editor.cc:2400 rc_option_editor.cc:2416 rc_option_editor.cc:2430
-#: rc_option_editor.cc:2444 rc_option_editor.cc:2446
+#: rc_option_editor.cc:3163
+msgid "Action Script Button Visibility"
+msgstr ""
+
+#: rc_option_editor.cc:3169 rc_option_editor.cc:3183 rc_option_editor.cc:3200
+#: rc_option_editor.cc:3216 rc_option_editor.cc:3232 rc_option_editor.cc:3246
+#: rc_option_editor.cc:3272 rc_option_editor.cc:3290 rc_option_editor.cc:3301
+#: rc_option_editor.cc:3308 rc_option_editor.cc:3310 rc_option_editor.cc:3318
+#: rc_option_editor.cc:3320 rc_option_editor.cc:3328 rc_option_editor.cc:3336
+#: rc_option_editor.cc:3338
 msgid "Preferences|Metering"
 msgstr ""
 
-#: rc_option_editor.cc:2355
+#: rc_option_editor.cc:3173
 msgid "Peak hold time"
 msgstr ""
 
-#: rc_option_editor.cc:2361
+#: rc_option_editor.cc:3179
 msgid "short"
 msgstr ""
 
-#: rc_option_editor.cc:2362
+#: rc_option_editor.cc:3180
 msgid "medium"
 msgstr ""
 
-#: rc_option_editor.cc:2363
+#: rc_option_editor.cc:3181
 msgid "long"
 msgstr ""
 
-#: rc_option_editor.cc:2369
+#: rc_option_editor.cc:3187
 msgid "DPM fall-off"
 msgstr ""
 
-#: rc_option_editor.cc:2375
+#: rc_option_editor.cc:3193
 msgid "slowest [6.6dB/sec]"
 msgstr ""
 
-#: rc_option_editor.cc:2376
+#: rc_option_editor.cc:3194
 msgid "slow [8.6dB/sec] (BBC PPM, EBU PPM)"
 msgstr ""
 
-#: rc_option_editor.cc:2377
-msgid "slowish [12.0dB/sec] (DIN)"
-msgstr ""
-
-#: rc_option_editor.cc:2378
-msgid "moderate [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"
-msgstr ""
-
-#: rc_option_editor.cc:2379
-msgid "medium [20dB/sec]"
+#: rc_option_editor.cc:3195
+msgid "moderate [12.0dB/sec] (DIN)"
 msgstr ""
 
-#: rc_option_editor.cc:2380
-msgid "fast [32dB/sec]"
+#: rc_option_editor.cc:3196
+msgid "medium [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"
 msgstr ""
 
-#: rc_option_editor.cc:2381
-msgid "faster [46dB/sec]"
+#: rc_option_editor.cc:3197
+msgid "fast [20dB/sec]"
 msgstr ""
 
-#: rc_option_editor.cc:2382
-msgid "fastest [70dB/sec]"
+#: rc_option_editor.cc:3198
+msgid "very fast [32dB/sec]"
 msgstr ""
 
-#: rc_option_editor.cc:2388
+#: rc_option_editor.cc:3204
 msgid "Meter line-up level; 0dBu"
 msgstr ""
 
-#: rc_option_editor.cc:2393 rc_option_editor.cc:2409
+#: rc_option_editor.cc:3209 rc_option_editor.cc:3225
 msgid "-24dBFS (SMPTE US: 4dBu = -20dBFS)"
 msgstr ""
 
-#: rc_option_editor.cc:2394 rc_option_editor.cc:2410
+#: rc_option_editor.cc:3210 rc_option_editor.cc:3226
 msgid "-20dBFS (SMPTE RP.0155)"
 msgstr ""
 
-#: rc_option_editor.cc:2395 rc_option_editor.cc:2411
+#: rc_option_editor.cc:3211 rc_option_editor.cc:3227
 msgid "-18dBFS (EBU, BBC)"
 msgstr ""
 
-#: rc_option_editor.cc:2396 rc_option_editor.cc:2412
+#: rc_option_editor.cc:3212 rc_option_editor.cc:3228
 msgid "-15dBFS (DIN)"
 msgstr ""
 
-#: rc_option_editor.cc:2398
+#: rc_option_editor.cc:3214
 msgid ""
 "Configure meter-marks and color-knee point for dBFS scale DPM, set reference "
 "level for IEC1/Nordic, IEC2 PPM and VU meter."
 msgstr ""
 
-#: rc_option_editor.cc:2404
+#: rc_option_editor.cc:3220
 msgid "IEC1/DIN Meter line-up level; 0dBu"
 msgstr ""
 
-#: rc_option_editor.cc:2414
+#: rc_option_editor.cc:3230
 msgid "Reference level for IEC1/DIN meter."
 msgstr ""
 
-#: rc_option_editor.cc:2420
+#: rc_option_editor.cc:3236
 msgid "VU Meter standard"
 msgstr ""
 
-#: rc_option_editor.cc:2425
+#: rc_option_editor.cc:3241
 msgid "0VU = -2dBu (France)"
 msgstr ""
 
-#: rc_option_editor.cc:2426
+#: rc_option_editor.cc:3242
 msgid "0VU = 0dBu (North America, Australia)"
 msgstr ""
 
-#: rc_option_editor.cc:2427
+#: rc_option_editor.cc:3243
 msgid "0VU = +4dBu (standard)"
 msgstr ""
 
-#: rc_option_editor.cc:2428
+#: rc_option_editor.cc:3244
 msgid "0VU = +8dBu"
 msgstr ""
 
-#: rc_option_editor.cc:2434
+#: rc_option_editor.cc:3250
 msgid "Peak threshold [dBFS]"
 msgstr ""
 
-#: rc_option_editor.cc:2442
+#: rc_option_editor.cc:3259
+msgid "Default Meter Type for Master Bus"
+msgstr ""
+
+#: rc_option_editor.cc:3277
+msgid "Default Meter Type for Busses"
+msgstr ""
+
+#: rc_option_editor.cc:3294
+msgid "Default Meter Type for Tracks"
+msgstr ""
+
+#: rc_option_editor.cc:3306
 msgid ""
 "Specify the audio signal level in dbFS at and above which the meter-peak "
 "indicator will flash red."
 msgstr ""
 
-#: rc_option_editor.cc:2449
+#: rc_option_editor.cc:3313
 msgid "LED meter style"
 msgstr ""
 
-#: rc_option_editor.cc:2457
+#: rc_option_editor.cc:3318
+msgid "Editor Meters"
+msgstr ""
+
+#: rc_option_editor.cc:3323
+msgid "Show meters on tracks in the editor"
+msgstr ""
+
+#: rc_option_editor.cc:3331
+msgid "Show at most stereo meters in the track-header"
+msgstr ""
+
+#: rc_option_editor.cc:3336
+msgid "Post Export Analysis"
+msgstr ""
+
+#: rc_option_editor.cc:3341
+msgid "Save loudness analysis as image file"
+msgstr ""
+
+#: rc_option_editor.cc:3349
 msgid "Theme"
 msgstr ""
 
-#: region_editor.cc:79
+#: rc_option_editor.cc:3351
+msgid "Theme/Colors"
+msgstr ""
+
+#: rc_option_editor.cc:3429
+msgid "Set Linux VST Search Path"
+msgstr ""
+
+#: rc_option_editor.cc:3443
+msgid "Set Windows VST Search Path"
+msgstr ""
+
+#: region_editor.cc:81
 msgid "audition this region"
 msgstr "ακρόαση της περιοχής"
 
-#: region_editor.cc:88 region_layering_order_editor.cc:75
+#: region_editor.cc:90 region_layering_order_editor.cc:75
 msgid "Position:"
 msgstr ""
 
-#: region_editor.cc:90 add_video_dialog.cc:155
+#: region_editor.cc:92 add_video_dialog.cc:155
 msgid "End:"
 msgstr "Τέλος:"
 
-#: region_editor.cc:92 sfdb_ui.cc:145
+#: region_editor.cc:94 sfdb_ui.cc:145
 msgid "Length:"
 msgstr ""
 
-#: region_editor.cc:94
+#: region_editor.cc:96
 msgid "Sync point (relative to region):"
 msgstr ""
 
-#: region_editor.cc:96
+#: region_editor.cc:98
 msgid "Sync point (absolute):"
 msgstr ""
 
-#: region_editor.cc:98
+#: region_editor.cc:100
 msgid "File start:"
 msgstr ""
 
-#: region_editor.cc:102
+#: region_editor.cc:104
 msgid "Sources:"
 msgstr ""
 
-#: region_editor.cc:104
+#: region_editor.cc:106
 msgid "Source:"
 msgstr ""
 
-#: region_editor.cc:166
+#: region_editor.cc:168
 msgid "Region '%1'"
 msgstr ""
 
-#: region_editor.cc:273
+#: region_editor.cc:279
 msgid "change region start position"
 msgstr ""
 
-#: region_editor.cc:289
+#: region_editor.cc:299
 msgid "change region end position"
 msgstr ""
 
-#: region_editor.cc:309
+#: region_editor.cc:322
 msgid "change region length"
 msgstr ""
 
-#: region_editor.cc:403 region_editor.cc:415
+#: region_editor.cc:416 region_editor.cc:428
 msgid "change region sync point"
 msgstr ""
 
@@ -9735,33 +11748,33 @@ msgstr ""
 msgid "Choose Top Region"
 msgstr ""
 
-#: region_view.cc:277
+#: region_view.cc:271
 msgid "SilenceText"
 msgstr ""
 
-#: region_view.cc:292 region_view.cc:311
+#: region_view.cc:286 region_view.cc:305
 msgid "minutes"
 msgstr ""
 
-#: region_view.cc:295 region_view.cc:314
+#: region_view.cc:289 region_view.cc:308
 msgid "msecs"
 msgstr ""
 
-#: region_view.cc:298 region_view.cc:317
+#: region_view.cc:292 region_view.cc:311
 msgid "secs"
 msgstr ""
 
-#: region_view.cc:301
+#: region_view.cc:295
 msgid "%1 silent segment"
 msgid_plural "%1 silent segments"
 msgstr[0] ""
 msgstr[1] ""
 
-#: region_view.cc:303
+#: region_view.cc:297
 msgid "shortest = %1 %2"
 msgstr ""
 
-#: region_view.cc:320
+#: region_view.cc:314
 msgid ""
 "\n"
 "  (shortest audible segment = %1 %2)"
@@ -9807,55 +11820,63 @@ msgstr ""
 msgid "Modified Kullback-Liebler"
 msgstr ""
 
-#: rhythm_ferret.cc:65
+#: rhythm_ferret.cc:62
+msgid "Spectral Flux"
+msgstr ""
+
+#: rhythm_ferret.cc:68
 msgid "Split region"
 msgstr ""
 
-#: rhythm_ferret.cc:66
+#: rhythm_ferret.cc:70
 msgid "Snap regions"
 msgstr ""
 
-#: rhythm_ferret.cc:67
+#: rhythm_ferret.cc:71
 msgid "Conform regions"
 msgstr ""
 
-#: rhythm_ferret.cc:72
+#: rhythm_ferret.cc:77
 msgid "Rhythm Ferret"
 msgstr ""
 
-#: rhythm_ferret.cc:78
+#: rhythm_ferret.cc:83
 msgid "Analyze"
 msgstr ""
 
-#: rhythm_ferret.cc:113
+#: rhythm_ferret.cc:122
 msgid "Detection function"
 msgstr ""
 
-#: rhythm_ferret.cc:117
-msgid "Trigger gap"
-msgstr ""
-
-#: rhythm_ferret.cc:122 strip_silence_dialog.cc:64
-msgid "Threshold"
+#: rhythm_ferret.cc:126
+msgid "Trigger gap (postproc)"
 msgstr ""
 
-#: rhythm_ferret.cc:127
+#: rhythm_ferret.cc:131
 msgid "Peak threshold"
 msgstr ""
 
-#: rhythm_ferret.cc:132
+#: rhythm_ferret.cc:135
 msgid "Silence threshold"
 msgstr ""
 
-#: rhythm_ferret.cc:137
+#: rhythm_ferret.cc:141
+msgid "Min Inter-Onset Time"
+msgstr ""
+
+#: rhythm_ferret.cc:148
 msgid "Sensitivity"
 msgstr ""
 
-#: rhythm_ferret.cc:141
+#: rhythm_ferret.cc:152
+msgid "Cut Pos Threshold"
+msgstr ""
+
+#: rhythm_ferret.cc:157
 msgid "Operation"
 msgstr ""
 
-#: rhythm_ferret.cc:355
+#: rhythm_ferret.cc:382
 msgid "split regions (rhythm ferret)"
 msgstr ""
 
@@ -9879,19 +11900,15 @@ msgstr ""
 msgid "Active state"
 msgstr ""
 
-#: route_group_dialog.cc:53 route_group_dialog.cc:82 theme_manager.cc:90
-msgid "Color"
-msgstr "Χρώμα"
-
-#: route_group_dialog.cc:59
+#: route_group_dialog.cc:58
 msgid "RouteGroupDialog"
 msgstr ""
 
-#: route_group_dialog.cc:100
+#: route_group_dialog.cc:99
 msgid "<b>Sharing</b>"
 msgstr ""
 
-#: route_group_dialog.cc:200
+#: route_group_dialog.cc:192
 msgid "The group name is not unique. Please use a different name."
 msgstr ""
 
@@ -9911,404 +11928,389 @@ msgstr "Έξοδοι"
 msgid "Plugins, Inserts & Sends"
 msgstr ""
 
-#: route_params_ui.cc:209
+#: route_params_ui.cc:201
 msgid "route display list item for renamed route not found!"
 msgstr "Η λίστα ανάδειξης διαδρομών για μετονομασμένη διαδρομή δεν ευρέθη!"
 
-#: route_params_ui.cc:279 route_params_ui.cc:307
+#: route_params_ui.cc:271 route_params_ui.cc:299
 #, c-format
 msgid "Playback delay: %<PRId64> samples"
 msgstr ""
 
-#: route_params_ui.cc:499
+#: route_params_ui.cc:491
 msgid "NO TRACK"
 msgstr "Κανένα κανάλι"
 
-#: route_params_ui.cc:637 route_params_ui.cc:638
+#: route_params_ui.cc:515
+msgid "Add Track or Bus"
+msgstr ""
+
+#: route_params_ui.cc:627 route_params_ui.cc:628
 msgid "No Track or Bus Selected"
 msgstr ""
 
-#: route_time_axis.cc:181
+#: route_time_axis.cc:104
+msgid "RTAV|G"
+msgstr ""
+
+#: route_time_axis.cc:105
+msgid "RTAV|P"
+msgstr ""
+
+#: route_time_axis.cc:106
+msgid "RTAV|A"
+msgstr ""
+
+#: route_time_axis.cc:194
 msgid "Record (Right-click for Step Edit)"
 msgstr ""
 
-#: route_time_axis.cc:184
+#: route_time_axis.cc:197
 msgid "Record"
 msgstr "Εγγραφή"
 
-#: route_time_axis.cc:254
+#: route_time_axis.cc:265
 msgid "Route Group"
 msgstr ""
 
-#: route_time_axis.cc:264
+#: route_time_axis.cc:275
 msgid "MIDI Controllers and Automation"
 msgstr ""
 
-#: route_time_axis.cc:495
+#: route_time_axis.cc:510
 msgid "Show All Automation"
 msgstr ""
 
-#: route_time_axis.cc:498
+#: route_time_axis.cc:513
 msgid "Show Existing Automation"
 msgstr ""
 
-#: route_time_axis.cc:501
+#: route_time_axis.cc:516
 msgid "Hide All Automation"
 msgstr ""
 
-#: route_time_axis.cc:510
+#: route_time_axis.cc:525
 msgid "Processor automation"
 msgstr ""
 
-#: route_time_axis.cc:517
+#: route_time_axis.cc:532
 msgid "Fader"
 msgstr ""
 
-#: route_time_axis.cc:535
+#: route_time_axis.cc:559
 msgid "Pan"
 msgstr ""
 
-#: route_time_axis.cc:626
+#: route_time_axis.cc:643
 msgid "Overlaid"
 msgstr ""
 
-#: route_time_axis.cc:632
+#: route_time_axis.cc:649
 msgid "Stacked"
 msgstr ""
 
-#: route_time_axis.cc:640
+#: route_time_axis.cc:657
 msgid "Layers"
 msgstr ""
 
-#: route_time_axis.cc:709
+#: route_time_axis.cc:721
 msgid "Automatic (based on I/O connections)"
 msgstr ""
 
-#: route_time_axis.cc:718
+#: route_time_axis.cc:730
 msgid "(Currently: Existing Material)"
 msgstr ""
 
-#: route_time_axis.cc:721
+#: route_time_axis.cc:733
 msgid "(Currently: Capture Time)"
 msgstr ""
 
-#: route_time_axis.cc:729
+#: route_time_axis.cc:741
 msgid "Align With Existing Material"
 msgstr ""
 
-#: route_time_axis.cc:734
+#: route_time_axis.cc:746
 msgid "Align With Capture Time"
 msgstr ""
 
-#: route_time_axis.cc:739
+#: route_time_axis.cc:751
 msgid "Alignment"
 msgstr ""
 
-#: route_time_axis.cc:774
+#: route_time_axis.cc:786
 msgid "Normal Mode"
 msgstr ""
 
-#: route_time_axis.cc:780
+#: route_time_axis.cc:792
 msgid "Tape Mode"
 msgstr ""
 
-#: route_time_axis.cc:786
+#: route_time_axis.cc:798
 msgid "Non-Layered Mode"
 msgstr ""
 
-#: route_time_axis.cc:792
+#: route_time_axis.cc:804
 msgid "Record Mode"
 msgstr ""
 
-#: route_time_axis.cc:799 route_time_axis.cc:1789
+#: route_time_axis.cc:809 route_time_axis.cc:1795
 msgid "Playlist"
 msgstr "Playlist"
 
-#: route_time_axis.cc:1097
+#: route_time_axis.cc:1107
 msgid "Rename Playlist"
 msgstr ""
 
-#: route_time_axis.cc:1098
+#: route_time_axis.cc:1108
 msgid "New name for playlist:"
 msgstr ""
 
-#: route_time_axis.cc:1183
+#: route_time_axis.cc:1193
 msgid "New Copy Playlist"
 msgstr ""
 
-#: route_time_axis.cc:1184 route_time_axis.cc:1237
+#: route_time_axis.cc:1194 route_time_axis.cc:1247
 msgid "Name for new playlist:"
 msgstr ""
 
-#: route_time_axis.cc:1236
+#: route_time_axis.cc:1246
 msgid "New Playlist"
 msgstr ""
 
-#: route_time_axis.cc:1436
-msgid "You cannot create a track with that name as it is reserved for %1"
+#: route_time_axis.cc:1441
+msgid "The name \"%1\" is reserved for %2"
 msgstr ""
 
-#: route_time_axis.cc:1678
+#: route_time_axis.cc:1684
 msgid "New Copy..."
 msgstr ""
 
-#: route_time_axis.cc:1682
+#: route_time_axis.cc:1688
 msgid "New Take"
 msgstr ""
 
-#: route_time_axis.cc:1683
+#: route_time_axis.cc:1689
 msgid "Copy Take"
 msgstr ""
 
-#: route_time_axis.cc:1688
+#: route_time_axis.cc:1694
 msgid "Clear Current"
 msgstr "Εκκαθάριση τρέχοντος"
 
-#: route_time_axis.cc:1691
-msgid "Select From All..."
+#: route_time_axis.cc:1697
+msgid "Select from All..."
 msgstr ""
 
-#: route_time_axis.cc:1779
+#: route_time_axis.cc:1785
 msgid "Take: %1.%2"
 msgstr ""
 
-#: route_time_axis.cc:2169 selection.cc:1007 selection.cc:1061
+#: route_time_axis.cc:2190 selection.cc:1042 selection.cc:1096
 msgid "programming error: "
 msgstr "σφάλμα προγραμματισμού: "
 
-#: route_time_axis.cc:2585
+#: route_time_axis.cc:2614
 msgid "Underlays"
 msgstr ""
 
-#: route_time_axis.cc:2588
+#: route_time_axis.cc:2617
 msgid "Remove \"%1\""
 msgstr ""
 
-#: route_time_axis.cc:2638 route_time_axis.cc:2675
+#: route_time_axis.cc:2667 route_time_axis.cc:2704
 msgid "programming error: underlay reference pointer pairs are inconsistent!"
 msgstr ""
 
-#: route_time_axis.cc:2702
+#: route_time_axis.cc:2731 vca_master_strip.cc:203 vca_time_axis.cc:228
 msgid "After-fade listen (AFL)"
 msgstr ""
 
-#: route_time_axis.cc:2706
+#: route_time_axis.cc:2735 vca_master_strip.cc:207 vca_time_axis.cc:232
 msgid "Pre-fade listen (PFL)"
 msgstr ""
 
-#: route_ui.cc:140
+#: route_ui.cc:165
 msgid "Mute this track"
 msgstr ""
 
-#: route_ui.cc:144
+#: route_ui.cc:169
 msgid "Mute other (non-soloed) tracks"
 msgstr ""
 
-#: route_ui.cc:150
+#: route_ui.cc:175
 msgid "Enable recording on this track"
 msgstr ""
 
-#: route_ui.cc:158
+#: route_ui.cc:183
 msgid "make mixer strips show sends to this bus"
 msgstr ""
 
-#: route_ui.cc:163
+#: route_ui.cc:188
 msgid "Monitor input"
 msgstr ""
 
-#: route_ui.cc:169
+#: route_ui.cc:194
 msgid "Monitor playback"
 msgstr ""
 
-#: route_ui.cc:676
+#: route_ui.cc:706
 msgid "Not connected to AudioEngine - cannot engage record"
 msgstr ""
 
-#: route_ui.cc:875
+#: route_ui.cc:883
+msgid "Rec-Safe"
+msgstr ""
+
+#: route_ui.cc:888
 msgid "Step Entry"
 msgstr ""
 
-#: route_ui.cc:948
+#: route_ui.cc:987
 msgid "Assign all tracks (prefader)"
 msgstr ""
 
-#: route_ui.cc:952
+#: route_ui.cc:991
 msgid "Assign all tracks and buses (prefader)"
 msgstr ""
 
-#: route_ui.cc:956
+#: route_ui.cc:995
 msgid "Assign all tracks (postfader)"
 msgstr ""
 
-#: route_ui.cc:960
+#: route_ui.cc:999
 msgid "Assign all tracks and buses (postfader)"
 msgstr ""
 
-#: route_ui.cc:964
+#: route_ui.cc:1003
 msgid "Assign selected tracks (prefader)"
 msgstr ""
 
-#: route_ui.cc:968
+#: route_ui.cc:1007
 msgid "Assign selected tracks and buses (prefader)"
 msgstr ""
 
-#: route_ui.cc:971
+#: route_ui.cc:1010
 msgid "Assign selected tracks (postfader)"
 msgstr ""
 
-#: route_ui.cc:975
+#: route_ui.cc:1014
 msgid "Assign selected tracks and buses (postfader)"
 msgstr ""
 
-#: route_ui.cc:978
+#: route_ui.cc:1017
 msgid "Copy track/bus gains to sends"
 msgstr ""
 
-#: route_ui.cc:979
+#: route_ui.cc:1018
 msgid "Set sends gain to -inf"
 msgstr ""
 
-#: route_ui.cc:980
+#: route_ui.cc:1019
 msgid "Set sends gain to 0dB"
 msgstr ""
 
-#: route_ui.cc:1300
+#: route_ui.cc:1357
 msgid "Solo Isolate"
 msgstr ""
 
-#: route_ui.cc:1307
+#: route_ui.cc:1364
 msgid "Solo Safe"
 msgstr ""
 
-#: route_ui.cc:1329
+#: route_ui.cc:1386
 msgid "Pre Fader Sends"
 msgstr ""
 
-#: route_ui.cc:1335
+#: route_ui.cc:1392
 msgid "Post Fader Sends"
 msgstr ""
 
-#: route_ui.cc:1341
+#: route_ui.cc:1398
 msgid "Control Outs"
 msgstr "Control Outs"
 
-#: route_ui.cc:1347
+#: route_ui.cc:1404
 msgid "Main Outs"
 msgstr "Main Outs"
 
-#: route_ui.cc:1479
+#: route_ui.cc:1571
 msgid "Color Selection"
 msgstr ""
 
-#: route_ui.cc:1564
-msgid ""
-"Do you really want to remove track \"%1\" ?\n"
-"\n"
-"You may also lose the playlist used by this track.\n"
-"\n"
-"(This action cannot be undone, and the session file will be overwritten)"
-msgstr ""
-
-#: route_ui.cc:1566
-msgid ""
-"Do you really want to remove bus \"%1\" ?\n"
-"\n"
-"(This action cannot be undone, and the session file will be overwritten)"
-msgstr ""
-
-#: route_ui.cc:1574
-msgid "Remove track"
-msgstr ""
-
-#: route_ui.cc:1576
-msgid "Remove bus"
-msgstr ""
-
-#: route_ui.cc:1604
+#: route_ui.cc:1613
 msgid ""
 "The use of colons (':') is discouraged in track and bus names.\n"
 "Do you want to use this new name?"
 msgstr ""
 
-#: route_ui.cc:1608
+#: route_ui.cc:1617
 msgid "Use the new name"
 msgstr ""
 
-#: route_ui.cc:1609
+#: route_ui.cc:1618
 msgid "Re-edit the name"
 msgstr ""
 
-#: route_ui.cc:1622
+#: route_ui.cc:1631
 msgid "Rename Track"
 msgstr "Μετονομασία Καναλιού"
 
-#: route_ui.cc:1624
+#: route_ui.cc:1633
 msgid "Rename Bus"
 msgstr ""
 
-#: route_ui.cc:1692
+#: route_ui.cc:1693
 msgid ": comment editor"
 msgstr ": επεξεργαστής σχολίων"
 
-#: route_ui.cc:1858
+#: route_ui.cc:1848
 msgid " latency"
 msgstr ""
 
-#: route_ui.cc:1871
+#: route_ui.cc:1888
 msgid "Cannot create route template directory %1"
 msgstr ""
 
-#: route_ui.cc:1877
+#: route_ui.cc:1894
 msgid "Save As Template"
 msgstr ""
 
-#: route_ui.cc:1878
+#: route_ui.cc:1895
 msgid "Template name:"
 msgstr ""
 
-#: route_ui.cc:1959
-msgid "Remote Control ID"
+#: route_ui.cc:2019
+msgid ""
+"Left-click to invert polarity of channel %1 of this track. Right-click to "
+"show menu."
 msgstr ""
 
-#: route_ui.cc:1969
-msgid "Remote control ID:"
+#: route_ui.cc:2021
+msgid "Click to show a menu of channels to invert polarity"
 msgstr ""
 
-#: route_ui.cc:1983
-msgid ""
-"The remote control ID of %1 is: %2\n"
-"\n"
-"\n"
-"The remote control ID of %3 cannot be changed."
+#: save_as_dialog.cc:34
+msgid "Switch to newly-saved version"
 msgstr ""
 
-#: route_ui.cc:1987
-msgid "the master bus"
+#: save_as_dialog.cc:35
+msgid "Copy media to new session"
 msgstr ""
 
-#: route_ui.cc:1987
-msgid "the monitor bus"
+#: save_as_dialog.cc:36
+msgid "Copy external media into new session"
 msgstr ""
 
-#: route_ui.cc:1989
-msgid ""
-"The remote control ID of %5 is: %2\n"
-"\n"
-"\n"
-"Remote Control IDs are currently determined by track/bus ordering in %6.\n"
-"\n"
-"%3Use the User Interaction tab of the Preferences window if you want to "
-"change this%4"
+#: save_as_dialog.cc:37
+msgid "Newly-saved session should be empty"
 msgstr ""
 
-#: route_ui.cc:2046
-msgid ""
-"Left-click to invert (phase reverse) channel %1 of this track.  Right-click "
-"to show menu."
+#: save_as_dialog.cc:48
+msgid "Save as session name"
 msgstr ""
 
-#: route_ui.cc:2048
-msgid "Click to show a menu of channels for inversion (phase reverse)"
+#: save_as_dialog.cc:55
+msgid "Parent directory/folder"
 msgstr ""
 
 #: search_path_option.cc:35
@@ -10323,126 +12325,158 @@ msgstr ""
 msgid "the session folder"
 msgstr ""
 
+#: script_selector.cc:43
+msgid "<b>Type:</b>"
+msgstr ""
+
+#: script_selector.cc:49
+msgid "<b>Author:</b>"
+msgstr ""
+
+#: script_selector.cc:55
+msgid "<b>Description:</b>"
+msgstr ""
+
+#: script_selector.cc:131
+msgid "Select Script to unload"
+msgstr ""
+
+#: script_selector.cc:165
+msgid "<b>Name:</b>"
+msgstr ""
+
+#: script_selector.cc:172
+msgid "<b>Instance Parameters</b>"
+msgstr ""
+
 #: send_ui.cc:134
 msgid "Send "
 msgstr ""
 
-#: session_dialog.cc:61
+#: session_dialog.cc:71
 msgid "Session Setup"
 msgstr ""
 
-#: session_dialog.cc:66
+#: session_dialog.cc:76
 msgid "Advanced options ..."
 msgstr ""
 
-#: session_dialog.cc:263
-msgid "New Session"
-msgstr "Νέα συνεδρία"
+#: session_dialog.cc:163 session_dialog.cc:397
+msgid "Recent Sessions"
+msgstr "Πρόσφατες συνεδρίες"
 
-#: session_dialog.cc:301
-msgid "Check the website for more..."
+#: session_dialog.cc:311
+msgid "Sample Rate"
 msgstr ""
 
-#: session_dialog.cc:304
-msgid "Click to open the program website in your web browser"
+#: session_dialog.cc:312
+msgid "File Resolution"
 msgstr ""
 
-#: session_dialog.cc:324
-msgid "Sample Rate"
+#: session_dialog.cc:313
+msgid "Last Modified"
+msgstr ""
+
+#: session_dialog.cc:338
+msgid "New Session"
+msgstr "Νέα συνεδρία"
+
+#: session_dialog.cc:379
+msgid "Check the website for more..."
 msgstr ""
 
-#: session_dialog.cc:325
-msgid "Disk Format"
+#: session_dialog.cc:382
+msgid "Click to open the program website in your web browser"
 msgstr ""
 
-#: session_dialog.cc:343
+#: session_dialog.cc:404
 msgid "Select session file"
 msgstr ""
 
-#: session_dialog.cc:358
+#: session_dialog.cc:417
 msgid "Other Sessions"
 msgstr ""
 
-#: session_dialog.cc:384
+#: session_dialog.cc:424
+msgid "Safe Mode: Disable all Plugins"
+msgstr ""
+
+#: session_dialog.cc:454
 msgid "Open"
 msgstr ""
 
-#: session_dialog.cc:451
+#: session_dialog.cc:521
 msgid "Session name:"
 msgstr ""
 
-#: session_dialog.cc:473
+#: session_dialog.cc:543
 msgid "Create session folder in:"
 msgstr ""
 
-#: session_dialog.cc:496
+#: session_dialog.cc:564
 msgid "Select folder for session"
 msgstr ""
 
-#: session_dialog.cc:525
+#: session_dialog.cc:591
 msgid "Use this template"
 msgstr ""
 
-#: session_dialog.cc:528
+#: session_dialog.cc:594
 msgid "no template"
 msgstr ""
 
-#: session_dialog.cc:663 session_dialog.cc:699
-msgid "32 bit float"
+#: session_dialog.cc:746 session_dialog.cc:793
+msgid "32-bit float"
 msgstr ""
 
-#: session_dialog.cc:666 session_dialog.cc:702
-msgid "24 bit"
+#: session_dialog.cc:749 session_dialog.cc:796
+msgid "24-bit"
 msgstr ""
 
-#: session_dialog.cc:669 session_dialog.cc:705
-msgid "16 bit"
+#: session_dialog.cc:752 session_dialog.cc:799
+msgid "16-bit"
 msgstr ""
 
-#: session_dialog.cc:747 session_dialog.cc:748 session_dialog.cc:749
+#: session_dialog.cc:877 session_dialog.cc:878 session_dialog.cc:879
 msgid "channels"
 msgstr "κανάλια"
 
-#: session_dialog.cc:763
+#: session_dialog.cc:893
 msgid "<b>Busses</b>"
 msgstr ""
 
-#: session_dialog.cc:764
+#: session_dialog.cc:894
 msgid "<b>Inputs</b>"
 msgstr ""
 
-#: session_dialog.cc:765
+#: session_dialog.cc:895
 msgid "<b>Outputs</b>"
 msgstr ""
 
-#: session_dialog.cc:773
+#: session_dialog.cc:903
 msgid "Create master bus"
 msgstr ""
 
-#: session_dialog.cc:783
+#: session_dialog.cc:913
 msgid "Automatically connect to physical inputs"
 msgstr ""
 
-#: session_dialog.cc:790 session_dialog.cc:849
+#: session_dialog.cc:920 session_dialog.cc:979
 msgid "Use only"
 msgstr ""
 
-#: session_dialog.cc:843
+#: session_dialog.cc:973
 msgid "Automatically connect outputs"
 msgstr ""
 
-#: session_dialog.cc:865
+#: session_dialog.cc:995
 msgid "... to master bus"
 msgstr ""
 
-#: session_dialog.cc:875
+#: session_dialog.cc:1005
 msgid "... to physical outputs"
 msgstr ""
 
-#: session_import_dialog.cc:65
-msgid "Import from Session"
-msgstr ""
-
 #: session_import_dialog.cc:74
 msgid "Elements"
 msgstr ""
@@ -10463,197 +12497,197 @@ msgstr ""
 msgid "This will select all elements of this type!"
 msgstr ""
 
-#: session_metadata_dialog.cc:285
+#: session_metadata_dialog.cc:288
 msgid "EAN Check digit OK"
 msgstr ""
 
-#: session_metadata_dialog.cc:289
+#: session_metadata_dialog.cc:292
 msgid "EAN Check digit error"
 msgstr ""
 
-#: session_metadata_dialog.cc:289
+#: session_metadata_dialog.cc:292
 msgid "expected"
 msgstr ""
 
-#: session_metadata_dialog.cc:294
+#: session_metadata_dialog.cc:297
 msgid "EAN Length error"
 msgstr ""
 
-#: session_metadata_dialog.cc:423
+#: session_metadata_dialog.cc:426
 msgid "Field"
 msgstr "Πεδίο"
 
-#: session_metadata_dialog.cc:427
+#: session_metadata_dialog.cc:430
 msgid "Values (current value on top)"
 msgstr ""
 
-#: session_metadata_dialog.cc:641
+#: session_metadata_dialog.cc:644
 msgid "User"
 msgstr ""
 
-#: session_metadata_dialog.cc:649
+#: session_metadata_dialog.cc:652
 msgid "Email"
 msgstr ""
 
-#: session_metadata_dialog.cc:652
+#: session_metadata_dialog.cc:655
 msgid "Web"
 msgstr ""
 
-#: session_metadata_dialog.cc:655
+#: session_metadata_dialog.cc:658
 msgid "Organization"
 msgstr ""
 
-#: session_metadata_dialog.cc:658
+#: session_metadata_dialog.cc:661
 msgid "Country"
 msgstr ""
 
-#: session_metadata_dialog.cc:672
+#: session_metadata_dialog.cc:675
 msgid "Title"
 msgstr ""
 
-#: session_metadata_dialog.cc:675
+#: session_metadata_dialog.cc:678
 msgid "Track Number"
 msgstr ""
 
-#: session_metadata_dialog.cc:678
+#: session_metadata_dialog.cc:681
 msgid "Subtitle"
 msgstr ""
 
-#: session_metadata_dialog.cc:681
+#: session_metadata_dialog.cc:684
 msgid "Grouping"
 msgstr ""
 
-#: session_metadata_dialog.cc:684
+#: session_metadata_dialog.cc:687
 msgid "Artist"
 msgstr ""
 
-#: session_metadata_dialog.cc:687
+#: session_metadata_dialog.cc:690
 msgid "Genre"
 msgstr ""
 
-#: session_metadata_dialog.cc:690
+#: session_metadata_dialog.cc:693
 msgid "Comment"
 msgstr ""
 
-#: session_metadata_dialog.cc:693
+#: session_metadata_dialog.cc:696
 msgid "Copyright"
 msgstr ""
 
-#: session_metadata_dialog.cc:701 session_metadata_dialog.cc:706
+#: session_metadata_dialog.cc:704 session_metadata_dialog.cc:709
 msgid "Album"
 msgstr ""
 
-#: session_metadata_dialog.cc:709
+#: session_metadata_dialog.cc:712
 msgid "Year"
 msgstr ""
 
-#: session_metadata_dialog.cc:712
+#: session_metadata_dialog.cc:715
 msgid "Album Artist"
 msgstr ""
 
-#: session_metadata_dialog.cc:715
+#: session_metadata_dialog.cc:718
 msgid "Total Tracks"
 msgstr ""
 
-#: session_metadata_dialog.cc:718
+#: session_metadata_dialog.cc:721
 msgid "Disc Subtitle"
 msgstr ""
 
-#: session_metadata_dialog.cc:721
+#: session_metadata_dialog.cc:724
 msgid "Disc Number"
 msgstr ""
 
-#: session_metadata_dialog.cc:724
+#: session_metadata_dialog.cc:727
 msgid "Total Discs"
 msgstr ""
 
-#: session_metadata_dialog.cc:727
+#: session_metadata_dialog.cc:730
 msgid "Compilation"
 msgstr ""
 
-#: session_metadata_dialog.cc:730
+#: session_metadata_dialog.cc:733
 msgid "ISRC"
 msgstr ""
 
-#: session_metadata_dialog.cc:733
+#: session_metadata_dialog.cc:736
 msgid "EAN barcode"
 msgstr ""
 
-#: session_metadata_dialog.cc:746
+#: session_metadata_dialog.cc:749
 msgid "People"
 msgstr ""
 
-#: session_metadata_dialog.cc:751
+#: session_metadata_dialog.cc:754
 msgid "Lyricist"
 msgstr ""
 
-#: session_metadata_dialog.cc:754
+#: session_metadata_dialog.cc:757
 msgid "Composer"
 msgstr ""
 
-#: session_metadata_dialog.cc:757
+#: session_metadata_dialog.cc:760
 msgid "Conductor"
 msgstr ""
 
-#: session_metadata_dialog.cc:760
+#: session_metadata_dialog.cc:763
 msgid "Remixer"
 msgstr ""
 
-#: session_metadata_dialog.cc:763
+#: session_metadata_dialog.cc:766
 msgid "Arranger"
 msgstr ""
 
-#: session_metadata_dialog.cc:766
+#: session_metadata_dialog.cc:769
 msgid "Engineer"
 msgstr ""
 
-#: session_metadata_dialog.cc:769
+#: session_metadata_dialog.cc:772
 msgid "Producer"
 msgstr ""
 
-#: session_metadata_dialog.cc:772
+#: session_metadata_dialog.cc:775
 msgid "DJ Mixer"
 msgstr ""
 
-#: session_metadata_dialog.cc:775
+#: session_metadata_dialog.cc:778
 msgid "Metadata|Mixer"
 msgstr ""
 
-#: session_metadata_dialog.cc:783
+#: session_metadata_dialog.cc:786
 msgid "School"
 msgstr ""
 
-#: session_metadata_dialog.cc:788
+#: session_metadata_dialog.cc:791
 msgid "Instructor"
 msgstr ""
 
-#: session_metadata_dialog.cc:791
+#: session_metadata_dialog.cc:794
 msgid "Course"
 msgstr ""
 
-#: session_metadata_dialog.cc:799
+#: session_metadata_dialog.cc:802
 msgid "Edit Session Metadata"
 msgstr ""
 
-#: session_metadata_dialog.cc:830
+#: session_metadata_dialog.cc:833
 msgid "Import session metadata"
 msgstr ""
 
-#: session_metadata_dialog.cc:851
+#: session_metadata_dialog.cc:854
 msgid "Choose session to import metadata from"
 msgstr ""
 
-#: session_metadata_dialog.cc:889
+#: session_metadata_dialog.cc:892
 msgid "This session file could not be read!"
 msgstr ""
 
-#: session_metadata_dialog.cc:899
+#: session_metadata_dialog.cc:902
 msgid ""
 "The session file didn't contain metadata!\n"
 "Maybe this is an old session format?"
 msgstr ""
 
-#: session_metadata_dialog.cc:918
+#: session_metadata_dialog.cc:921
 msgid "Import all from:"
 msgstr ""
 
@@ -10800,209 +12834,230 @@ msgid "Destructive crossfade length"
 msgstr ""
 
 #: session_option_editor.cc:146
-msgid "Region fades active"
+msgid "Declick when transport starts and stops"
 msgstr ""
 
 #: session_option_editor.cc:153
+msgid "Declick when monitor state changes"
+msgstr ""
+
+#: session_option_editor.cc:160
+msgid "Region fades active"
+msgstr ""
+
+#: session_option_editor.cc:167
 msgid "Region fades visible"
 msgstr ""
 
-#: session_option_editor.cc:160 session_option_editor.cc:173
-#: session_option_editor.cc:187
+#: session_option_editor.cc:174 session_option_editor.cc:187
+#: session_option_editor.cc:208
 msgid "Media"
 msgstr ""
 
-#: session_option_editor.cc:160
+#: session_option_editor.cc:174
 msgid "Audio file format"
 msgstr ""
 
-#: session_option_editor.cc:164
+#: session_option_editor.cc:178
 msgid "Sample format"
 msgstr ""
 
-#: session_option_editor.cc:169
+#: session_option_editor.cc:183
 msgid "32-bit floating point"
 msgstr ""
 
-#: session_option_editor.cc:170
+#: session_option_editor.cc:184
 msgid "24-bit integer"
 msgstr ""
 
-#: session_option_editor.cc:171
+#: session_option_editor.cc:185
 msgid "16-bit integer"
 msgstr ""
 
-#: session_option_editor.cc:177
+#: session_option_editor.cc:191
 msgid "File type"
 msgstr ""
 
-#: session_option_editor.cc:182
-msgid "Broadcast WAVE"
+#: session_option_editor.cc:196
+msgid "Broadcast WAVE (4GB size limit)"
 msgstr ""
 
-#: session_option_editor.cc:183
-msgid "WAVE"
+#: session_option_editor.cc:198
+msgid "Broadcast RF64"
 msgstr ""
 
-#: session_option_editor.cc:184
+#: session_option_editor.cc:200
+msgid "WAVE (4GB size limit)"
+msgstr ""
+
+#: session_option_editor.cc:201
 msgid "WAVE-64"
 msgstr ""
 
-#: session_option_editor.cc:189
+#: session_option_editor.cc:205
+msgid "RF64 (WAV compatible)"
+msgstr ""
+
+#: session_option_editor.cc:210 session_option_editor.cc:216
+#: session_option_editor.cc:223
+msgid "Files|Locations"
+msgstr ""
+
+#: session_option_editor.cc:210
 msgid "File locations"
 msgstr ""
 
-#: session_option_editor.cc:191
+#: session_option_editor.cc:212
 msgid "Search for audio files in:"
 msgstr ""
 
-#: session_option_editor.cc:197
+#: session_option_editor.cc:218
 msgid "Search for MIDI files in:"
 msgstr ""
 
-#: session_option_editor.cc:206 session_option_editor.cc:218
-#: session_option_editor.cc:228 session_option_editor.cc:239
+#: session_option_editor.cc:227 session_option_editor.cc:239
+#: session_option_editor.cc:249 session_option_editor.cc:260
 msgid "Filenames"
 msgstr ""
 
-#: session_option_editor.cc:206
+#: session_option_editor.cc:227
 msgid "File Naming"
 msgstr ""
 
-#: session_option_editor.cc:212
+#: session_option_editor.cc:233
 msgid "Prefix Track number"
 msgstr ""
 
-#: session_option_editor.cc:217
+#: session_option_editor.cc:238
 msgid ""
 "Adds the current track number to the beginning of the recorded file name."
 msgstr ""
 
-#: session_option_editor.cc:222
+#: session_option_editor.cc:243
 msgid "Prefix Take Name"
 msgstr ""
 
-#: session_option_editor.cc:227
+#: session_option_editor.cc:248
 msgid "Adds the Take Name to the beginning of the recorded file name."
 msgstr ""
 
-#: session_option_editor.cc:232
+#: session_option_editor.cc:253
 msgid "Take Name"
 msgstr ""
 
-#: session_option_editor.cc:245
+#: session_option_editor.cc:266
 msgid ""
 "Track Input Monitoring automatically follows transport state (\"auto-input\")"
 msgstr ""
 
-#: session_option_editor.cc:252
+#: session_option_editor.cc:273
 msgid "Use monitor section in this session"
 msgstr ""
 
-#: session_option_editor.cc:257 session_option_editor.cc:259
-#: session_option_editor.cc:266 session_option_editor.cc:273
-#: session_option_editor.cc:280 session_option_editor.cc:282
-#: session_option_editor.cc:289 session_option_editor.cc:296
-#: session_option_editor.cc:303 session_option_editor.cc:310
-#: session_option_editor.cc:312
+#: session_option_editor.cc:278 session_option_editor.cc:280
+#: session_option_editor.cc:287 session_option_editor.cc:294
+#: session_option_editor.cc:301 session_option_editor.cc:303
+#: session_option_editor.cc:310 session_option_editor.cc:317
+#: session_option_editor.cc:324 session_option_editor.cc:331
+#: session_option_editor.cc:333
 msgid "Meterbridge"
 msgstr ""
 
-#: session_option_editor.cc:257
+#: session_option_editor.cc:278
 msgid "Route Display"
 msgstr ""
 
-#: session_option_editor.cc:261
+#: session_option_editor.cc:282
 msgid "Show Midi Tracks"
 msgstr ""
 
-#: session_option_editor.cc:268
+#: session_option_editor.cc:289
 msgid "Show Busses"
 msgstr ""
 
-#: session_option_editor.cc:275
+#: session_option_editor.cc:296
 msgid "Include Master Bus"
 msgstr ""
 
-#: session_option_editor.cc:280
+#: session_option_editor.cc:301
 msgid "Button Area"
 msgstr ""
 
-#: session_option_editor.cc:284
+#: session_option_editor.cc:305
 msgid "Rec-enable Button"
 msgstr ""
 
-#: session_option_editor.cc:291
+#: session_option_editor.cc:312
 msgid "Mute Button"
 msgstr ""
 
-#: session_option_editor.cc:298
+#: session_option_editor.cc:319
 msgid "Solo Button"
 msgstr ""
 
-#: session_option_editor.cc:305
+#: session_option_editor.cc:326
 msgid "Monitor Buttons"
 msgstr ""
 
-#: session_option_editor.cc:310
+#: session_option_editor.cc:331
 msgid "Name Labels"
 msgstr ""
 
-#: session_option_editor.cc:314
+#: session_option_editor.cc:335
 msgid "Track Name"
 msgstr ""
 
-#: session_option_editor.cc:325
+#: session_option_editor.cc:346
 msgid "MIDI region copies are independent"
 msgstr ""
 
-#: session_option_editor.cc:332
+#: session_option_editor.cc:353
 msgid ""
 "Policy for handling overlapping notes\n"
 " on the same MIDI channel"
 msgstr ""
 
-#: session_option_editor.cc:337
+#: session_option_editor.cc:358
 msgid "never allow them"
 msgstr ""
 
-#: session_option_editor.cc:338
+#: session_option_editor.cc:359
 msgid "don't do anything in particular"
 msgstr ""
 
-#: session_option_editor.cc:339
+#: session_option_editor.cc:360
 msgid "replace any overlapped existing note"
 msgstr ""
 
-#: session_option_editor.cc:340
+#: session_option_editor.cc:361
 msgid "shorten the overlapped existing note"
 msgstr ""
 
-#: session_option_editor.cc:341
+#: session_option_editor.cc:362
 msgid "shorten the overlapping new note"
 msgstr ""
 
-#: session_option_editor.cc:342
+#: session_option_editor.cc:363
 msgid "replace both overlapping notes with a single note"
 msgstr ""
 
-#: session_option_editor.cc:346
+#: session_option_editor.cc:367
 msgid "Glue to bars and beats"
 msgstr ""
 
-#: session_option_editor.cc:350
+#: session_option_editor.cc:371
 msgid "Glue new markers to bars and beats"
 msgstr ""
 
-#: session_option_editor.cc:357
+#: session_option_editor.cc:378
 msgid "Glue new regions to bars and beats"
 msgstr ""
 
-#: session_option_editor.cc:362
+#: session_option_editor.cc:383
 msgid "Defaults"
 msgstr ""
 
-#: session_option_editor.cc:364
+#: session_option_editor.cc:385
 msgid "Use these settings as defaults"
 msgstr ""
 
@@ -11038,26 +13093,14 @@ msgstr ""
 msgid "Timestamp:"
 msgstr ""
 
-#: sfdb_ui.cc:149
-msgid "Format:"
-msgstr ""
-
-#: sfdb_ui.cc:188 sfdb_ui.cc:653
+#: sfdb_ui.cc:188 sfdb_ui.cc:659
 msgid "Tags:"
 msgstr ""
 
-#: sfdb_ui.cc:293 sfdb_ui.cc:409
-msgid "Could not read file: %1 (%2)."
-msgstr "Δεν γινόταν να διαβαστεί το αρχείο: %1 (%2)."
-
 #: sfdb_ui.cc:297
 msgid "<b>Midi File Information</b>"
 msgstr ""
 
-#: sfdb_ui.cc:458
-msgid "Could not access soundfile: "
-msgstr "Δεν γινόταν να διαβαστεί το soundfile: "
-
 #: sfdb_ui.cc:530
 msgid "SoundFileBox: Could not tokenize string: "
 msgstr ""
@@ -11066,284 +13109,280 @@ msgstr ""
 msgid "Search"
 msgstr ""
 
-#: sfdb_ui.cc:576
+#: sfdb_ui.cc:581
 msgid "Audio and MIDI files"
 msgstr ""
 
-#: sfdb_ui.cc:579
+#: sfdb_ui.cc:584
 msgid "Audio files"
 msgstr ""
 
-#: sfdb_ui.cc:582
+#: sfdb_ui.cc:587
 msgid "MIDI files"
 msgstr ""
 
-#: sfdb_ui.cc:585 add_video_dialog.cc:123
+#: sfdb_ui.cc:590 add_video_dialog.cc:123
 msgid "All files"
 msgstr ""
 
-#: sfdb_ui.cc:604 add_video_dialog.cc:246
+#: sfdb_ui.cc:609 add_video_dialog.cc:246
 msgid "Browse Files"
 msgstr ""
 
-#: sfdb_ui.cc:633
+#: sfdb_ui.cc:638
 msgid "Paths"
 msgstr "Μονοπάτια"
 
-#: sfdb_ui.cc:642
+#: sfdb_ui.cc:647
 msgid "Search Tags"
 msgstr ""
 
-#: sfdb_ui.cc:658
+#: sfdb_ui.cc:664
 msgid "Sort:"
 msgstr ""
 
-#: sfdb_ui.cc:666
+#: sfdb_ui.cc:672
 msgid "Longest"
 msgstr ""
 
-#: sfdb_ui.cc:667
+#: sfdb_ui.cc:673
 msgid "Shortest"
 msgstr ""
 
-#: sfdb_ui.cc:668
+#: sfdb_ui.cc:674
 msgid "Newest"
 msgstr ""
 
-#: sfdb_ui.cc:669
+#: sfdb_ui.cc:675
 msgid "Oldest"
 msgstr ""
 
-#: sfdb_ui.cc:670
+#: sfdb_ui.cc:676
 msgid "Most downloaded"
 msgstr ""
 
-#: sfdb_ui.cc:671
+#: sfdb_ui.cc:677
 msgid "Least downloaded"
 msgstr ""
 
-#: sfdb_ui.cc:672
+#: sfdb_ui.cc:678
 msgid "Highest rated"
 msgstr ""
 
-#: sfdb_ui.cc:673
+#: sfdb_ui.cc:679
 msgid "Lowest rated"
 msgstr ""
 
-#: sfdb_ui.cc:678
+#: sfdb_ui.cc:684
 msgid "More"
 msgstr ""
 
-#: sfdb_ui.cc:682
+#: sfdb_ui.cc:688
 msgid "Similar"
 msgstr ""
 
-#: sfdb_ui.cc:694
+#: sfdb_ui.cc:700
 msgid "ID"
 msgstr ""
 
-#: sfdb_ui.cc:695 add_video_dialog.cc:83
+#: sfdb_ui.cc:701 add_video_dialog.cc:83
 msgid "Filename"
 msgstr ""
 
-#: sfdb_ui.cc:697
+#: sfdb_ui.cc:703 time_fx_dialog.cc:154
 msgid "Duration"
 msgstr ""
 
-#: sfdb_ui.cc:698
+#: sfdb_ui.cc:704
 msgid "Size"
 msgstr ""
 
-#: sfdb_ui.cc:699
+#: sfdb_ui.cc:705
 msgid "Samplerate"
 msgstr ""
 
-#: sfdb_ui.cc:700
+#: sfdb_ui.cc:706
 msgid "License"
 msgstr ""
 
-#: sfdb_ui.cc:718
+#: sfdb_ui.cc:724
 msgid "Search Freesound"
 msgstr ""
 
-#: sfdb_ui.cc:738
-msgid "Press to import selected files and close this window"
+#: sfdb_ui.cc:741
+msgid "Press to import selected files"
 msgstr ""
 
-#: sfdb_ui.cc:739
-msgid "Press to import selected files and leave this window open"
-msgstr ""
-
-#: sfdb_ui.cc:740
+#: sfdb_ui.cc:742
 msgid "Press to close this window without importing any files"
 msgstr ""
 
-#: sfdb_ui.cc:936
+#: sfdb_ui.cc:937
 msgid "SoundFileBrowser: Could not tokenize string: "
 msgstr ""
 
-#: sfdb_ui.cc:1136
+#: sfdb_ui.cc:1137
 msgid "%1 more page of 100 results available"
 msgid_plural "%1 more pages of 100 results available"
 msgstr[0] ""
 msgstr[1] ""
 
-#: sfdb_ui.cc:1141
+#: sfdb_ui.cc:1142
 msgid "No more results available"
 msgstr ""
 
-#: sfdb_ui.cc:1205
+#: sfdb_ui.cc:1206
 msgid "B"
 msgstr ""
 
-#: sfdb_ui.cc:1207
+#: sfdb_ui.cc:1208
 msgid "kB"
 msgstr ""
 
-#: sfdb_ui.cc:1209 sfdb_ui.cc:1211
+#: sfdb_ui.cc:1210 sfdb_ui.cc:1212
 msgid "MB"
 msgstr ""
 
-#: sfdb_ui.cc:1213
+#: sfdb_ui.cc:1214
 msgid "GB"
 msgstr ""
 
-#: sfdb_ui.cc:1425 sfdb_ui.cc:1738 sfdb_ui.cc:1801 sfdb_ui.cc:1819
+#: sfdb_ui.cc:1431 sfdb_ui.cc:1728 sfdb_ui.cc:1764 sfdb_ui.cc:1782
 msgid "one track per file"
 msgstr ""
 
-#: sfdb_ui.cc:1428 sfdb_ui.cc:1802 sfdb_ui.cc:1820
+#: sfdb_ui.cc:1434 sfdb_ui.cc:1765 sfdb_ui.cc:1783
 msgid "one track per channel"
 msgstr ""
 
-#: sfdb_ui.cc:1436 sfdb_ui.cc:1804 sfdb_ui.cc:1821
+#: sfdb_ui.cc:1442 sfdb_ui.cc:1767 sfdb_ui.cc:1784
 msgid "sequence files"
 msgstr ""
 
-#: sfdb_ui.cc:1439 sfdb_ui.cc:1809
+#: sfdb_ui.cc:1445 sfdb_ui.cc:1772
 msgid "all files in one track"
 msgstr ""
 
-#: sfdb_ui.cc:1440 sfdb_ui.cc:1803
+#: sfdb_ui.cc:1446 sfdb_ui.cc:1766
 msgid "merge files"
 msgstr ""
 
-#: sfdb_ui.cc:1446 sfdb_ui.cc:1806
+#: sfdb_ui.cc:1452 sfdb_ui.cc:1769
 msgid "one region per file"
 msgstr ""
 
-#: sfdb_ui.cc:1449 sfdb_ui.cc:1807
+#: sfdb_ui.cc:1455 sfdb_ui.cc:1770
 msgid "one region per channel"
 msgstr ""
 
-#: sfdb_ui.cc:1454 sfdb_ui.cc:1808 sfdb_ui.cc:1822
+#: sfdb_ui.cc:1460 sfdb_ui.cc:1771 sfdb_ui.cc:1785
 msgid "all files in one region"
 msgstr ""
 
-#: sfdb_ui.cc:1521
+#: sfdb_ui.cc:1527
 msgid ""
 "One or more of the selected files\n"
 "cannot be used by %1"
 msgstr ""
 
-#: sfdb_ui.cc:1665
+#: sfdb_ui.cc:1671
 msgid "Copy files to session"
 msgstr ""
 
-#: sfdb_ui.cc:1682 sfdb_ui.cc:1859
+#: sfdb_ui.cc:1686 sfdb_ui.cc:1825
 msgid "file timestamp"
 msgstr ""
 
-#: sfdb_ui.cc:1683 sfdb_ui.cc:1861
+#: sfdb_ui.cc:1687 sfdb_ui.cc:1827
 msgid "edit point"
 msgstr ""
 
-#: sfdb_ui.cc:1684 sfdb_ui.cc:1863
+#: sfdb_ui.cc:1688 sfdb_ui.cc:1829
 msgid "playhead"
 msgstr ""
 
-#: sfdb_ui.cc:1685
+#: sfdb_ui.cc:1689
 msgid "session start"
 msgstr ""
 
-#: sfdb_ui.cc:1691
-msgid "<b>Add files as ...</b>"
+#: sfdb_ui.cc:1695
+msgid "<b>Add files ...</b>"
 msgstr ""
 
-#: sfdb_ui.cc:1713
+#: sfdb_ui.cc:1700
 msgid "<b>Insert at</b>"
 msgstr ""
 
-#: sfdb_ui.cc:1726
+#: sfdb_ui.cc:1705
 msgid "<b>Mapping</b>"
 msgstr ""
 
-#: sfdb_ui.cc:1744
+#: sfdb_ui.cc:1710
 msgid "<b>Conversion quality</b>"
 msgstr ""
 
-#: sfdb_ui.cc:1756
+#: sfdb_ui.cc:1715
 msgid "<b>Instrument</b>"
 msgstr ""
 
-#: sfdb_ui.cc:1768 sfdb_ui.cc:1875
+#: sfdb_ui.cc:1734 sfdb_ui.cc:1841
 msgid "Best"
 msgstr ""
 
-#: sfdb_ui.cc:1769 sfdb_ui.cc:1877
+#: sfdb_ui.cc:1735 sfdb_ui.cc:1843
 msgid "Good"
 msgstr ""
 
-#: sfdb_ui.cc:1770 sfdb_ui.cc:1879
+#: sfdb_ui.cc:1736 sfdb_ui.cc:1845
 msgid "Quick"
 msgstr ""
 
-#: sfdb_ui.cc:1772
+#: sfdb_ui.cc:1738
 msgid "Fastest"
 msgstr "Ταχύτατο"
 
-#: shuttle_control.cc:56
+#: shuttle_control.cc:64
 msgid "Shuttle speed control (Context-click for options)"
 msgstr ""
 
-#: shuttle_control.cc:174
+#: shuttle_control.cc:201 time_fx_dialog.cc:164
 msgid "Percent"
 msgstr ""
 
-#: shuttle_control.cc:182
+#: shuttle_control.cc:209
 msgid "Units"
 msgstr ""
 
-#: shuttle_control.cc:188 shuttle_control.cc:609
+#: shuttle_control.cc:215 shuttle_control.cc:671
 msgid "Sprung"
 msgstr "Έλασμα"
 
-#: shuttle_control.cc:192 shuttle_control.cc:612
+#: shuttle_control.cc:219 shuttle_control.cc:674
 msgid "Wheel"
 msgstr "Τροχός"
 
-#: shuttle_control.cc:226
+#: shuttle_control.cc:253
 msgid "Maximum speed"
 msgstr "μέγιστη ταχύτητα"
 
-#: shuttle_control.cc:568
+#: shuttle_control.cc:256
+msgid "Reset to 100%"
+msgstr ""
+
+#: shuttle_control.cc:633
 msgid "Playing"
 msgstr ""
 
-#: shuttle_control.cc:583
+#: shuttle_control.cc:648
 #, c-format
 msgid "<<< %+d semitones"
 msgstr ""
 
-#: shuttle_control.cc:585
+#: shuttle_control.cc:650
 #, c-format
 msgid ">>> %+d semitones"
 msgstr ""
 
-#: shuttle_control.cc:590
-msgid "Stopped"
-msgstr ""
-
 #: soundcloud_export_selector.cc:44
 msgid "User Email"
 msgstr ""
@@ -11368,7 +13407,7 @@ msgstr ""
 msgid "%1: %2 of %3 bytes uploaded"
 msgstr ""
 
-#: splash.cc:73
+#: splash.cc:78
 msgid "%1 loading ..."
 msgstr ""
 
@@ -11384,17 +13423,17 @@ msgstr ""
 msgid "Azimuth:"
 msgstr ""
 
-#: startup.cc:67
+#: startup.cc:71
 msgid ""
 "Use an external mixer or the hardware mixer of your audio interface.\n"
 "%1 will play NO role in monitoring"
 msgstr ""
 
-#: startup.cc:69
+#: startup.cc:73
 msgid "Ask %1 to play back material as it is being recorded"
 msgstr ""
 
-#: startup.cc:142
+#: startup.cc:146
 msgid ""
 "<span size=\"larger\">%1 is a digital audio workstation. You can use it to "
 "record, edit and mix multi-track audio. You can produce your own CDs, mix "
@@ -11404,15 +13443,15 @@ msgid ""
 "program.</span> "
 msgstr ""
 
-#: startup.cc:168
+#: startup.cc:172
 msgid "Welcome to %1"
 msgstr ""
 
-#: startup.cc:191
+#: startup.cc:195
 msgid "Default folder for %1 sessions"
 msgstr ""
 
-#: startup.cc:197
+#: startup.cc:201
 msgid ""
 "Each project that you work on with %1 has its own folder.\n"
 "These can require a lot of disk space if you are recording audio.\n"
@@ -11422,11 +13461,11 @@ msgid ""
 "<i>(You can put new sessions anywhere, this is just a default)</i>"
 msgstr ""
 
-#: startup.cc:220
+#: startup.cc:224
 msgid "Default folder for new sessions"
 msgstr ""
 
-#: startup.cc:241
+#: startup.cc:245
 msgid ""
 "While recording instruments or vocals, you probably want to listen to the\n"
 "signal as well as record it. This is called \"monitoring\". There are\n"
@@ -11440,31 +13479,31 @@ msgid ""
 "<i>If you do not understand what this is about, just accept the default.</i>"
 msgstr ""
 
-#: startup.cc:262
+#: startup.cc:266
 msgid "Monitoring Choices"
 msgstr ""
 
-#: startup.cc:285
+#: startup.cc:289
 msgid "Use a Master bus directly"
 msgstr ""
 
-#: startup.cc:287
+#: startup.cc:291
 msgid ""
 "Connect the Master bus directly to your hardware outputs. This is preferable "
 "for simple usage."
 msgstr ""
 
-#: startup.cc:296
+#: startup.cc:300
 msgid "Use an additional Monitor bus"
 msgstr ""
 
-#: startup.cc:299
+#: startup.cc:303
 msgid ""
 "Use a Monitor bus between Master bus and hardware outputs for \n"
 "greater control in monitoring without affecting the mix."
 msgstr ""
 
-#: startup.cc:321
+#: startup.cc:325
 msgid ""
 "<i>You can change this preference at any time via the Preferences dialog.\n"
 "You can also add or remove the monitor section to/from any session.</i>\n"
@@ -11472,46 +13511,42 @@ msgid ""
 "<i>If you do not understand what this is about, just accept the default.</i>"
 msgstr ""
 
-#: startup.cc:332
+#: startup.cc:336
 msgid "Monitor Section"
 msgstr ""
 
-#: step_entry.cc:60
+#: step_entry.cc:59
 msgid "Step Entry: %1"
 msgstr ""
 
-#: step_entry.cc:65
+#: step_entry.cc:64
 msgid ">beat"
 msgstr ""
 
-#: step_entry.cc:66
+#: step_entry.cc:65
 msgid ">bar"
 msgstr ""
 
-#: step_entry.cc:67
+#: step_entry.cc:66
 msgid ">EP"
 msgstr ""
 
-#: step_entry.cc:68
+#: step_entry.cc:67
 msgid "sustain"
 msgstr ""
 
-#: step_entry.cc:69
+#: step_entry.cc:68
 msgid "rest"
 msgstr ""
 
-#: step_entry.cc:70
+#: step_entry.cc:69
 msgid "g-rest"
 msgstr ""
 
-#: step_entry.cc:71
+#: step_entry.cc:70
 msgid "back"
 msgstr ""
 
-#: step_entry.cc:82 step_entry.cc:85
-msgid "+"
-msgstr ""
-
 #: step_entry.cc:191
 msgid "Set note length to a whole note"
 msgstr ""
@@ -11620,11 +13655,11 @@ msgstr ""
 msgid "Insert a program change message"
 msgstr ""
 
-#: step_entry.cc:343 step_entry.cc:700
+#: step_entry.cc:343 step_entry.cc:645
 msgid "Move Insert Position Back by Note Length"
 msgstr ""
 
-#: step_entry.cc:344 step_entry.cc:698
+#: step_entry.cc:344 step_entry.cc:643
 msgid "Move Insert Position to Edit Point"
 msgstr ""
 
@@ -11636,240 +13671,244 @@ msgstr ""
 msgid "Octave"
 msgstr ""
 
-#: step_entry.cc:598
+#: step_entry.cc:592
 msgid "Insert Note A"
 msgstr ""
 
-#: step_entry.cc:599
+#: step_entry.cc:593
 msgid "Insert Note A-sharp"
 msgstr ""
 
-#: step_entry.cc:600
+#: step_entry.cc:594
 msgid "Insert Note B"
 msgstr ""
 
-#: step_entry.cc:601
+#: step_entry.cc:595
 msgid "Insert Note C"
 msgstr ""
 
-#: step_entry.cc:602
+#: step_entry.cc:596
 msgid "Insert Note C-sharp"
 msgstr ""
 
-#: step_entry.cc:603
+#: step_entry.cc:597
 msgid "Insert Note D"
 msgstr ""
 
-#: step_entry.cc:604
+#: step_entry.cc:598
 msgid "Insert Note D-sharp"
 msgstr ""
 
-#: step_entry.cc:605
+#: step_entry.cc:599
 msgid "Insert Note E"
 msgstr ""
 
-#: step_entry.cc:606
+#: step_entry.cc:600
 msgid "Insert Note F"
 msgstr ""
 
-#: step_entry.cc:607
+#: step_entry.cc:601
 msgid "Insert Note F-sharp"
 msgstr ""
 
-#: step_entry.cc:608
+#: step_entry.cc:602
 msgid "Insert Note G"
 msgstr ""
 
-#: step_entry.cc:609
+#: step_entry.cc:603
 msgid "Insert Note G-sharp"
 msgstr ""
 
-#: step_entry.cc:611
+#: step_entry.cc:605
 msgid "Insert a Note-length Rest"
 msgstr ""
 
-#: step_entry.cc:612
+#: step_entry.cc:606
 msgid "Insert a Snap-length Rest"
 msgstr ""
 
-#: step_entry.cc:614 step_entry.cc:615
+#: step_entry.cc:608 step_entry.cc:609
 msgid "Move to next octave"
 msgstr ""
 
-#: step_entry.cc:617
+#: step_entry.cc:611
 msgid "Move to Next Note Length"
 msgstr ""
 
-#: step_entry.cc:618
+#: step_entry.cc:612
 msgid "Move to Previous Note Length"
 msgstr ""
 
-#: step_entry.cc:620
+#: step_entry.cc:614
 msgid "Increase Note Length"
 msgstr ""
 
-#: step_entry.cc:621
+#: step_entry.cc:615
 msgid "Decrease Note Length"
 msgstr ""
 
-#: step_entry.cc:623
+#: step_entry.cc:617
 msgid "Move to Next Note Velocity"
 msgstr ""
 
-#: step_entry.cc:624
+#: step_entry.cc:618
 msgid "Move to Previous Note Velocity"
 msgstr ""
 
-#: step_entry.cc:626
+#: step_entry.cc:620
 msgid "Increase Note Velocity"
 msgstr ""
 
-#: step_entry.cc:627
+#: step_entry.cc:621
 msgid "Decrease Note Velocity"
 msgstr ""
 
-#: step_entry.cc:629
+#: step_entry.cc:623
 msgid "Switch to the 1st octave"
 msgstr ""
 
-#: step_entry.cc:630
+#: step_entry.cc:624
 msgid "Switch to the 2nd octave"
 msgstr ""
 
-#: step_entry.cc:631
+#: step_entry.cc:625
 msgid "Switch to the 3rd octave"
 msgstr ""
 
-#: step_entry.cc:632
+#: step_entry.cc:626
 msgid "Switch to the 4th octave"
 msgstr ""
 
-#: step_entry.cc:633
+#: step_entry.cc:627
 msgid "Switch to the 5th octave"
 msgstr ""
 
-#: step_entry.cc:634
+#: step_entry.cc:628
 msgid "Switch to the 6th octave"
 msgstr ""
 
-#: step_entry.cc:635
+#: step_entry.cc:629
 msgid "Switch to the 7th octave"
 msgstr ""
 
-#: step_entry.cc:636
+#: step_entry.cc:630
 msgid "Switch to the 8th octave"
 msgstr ""
 
-#: step_entry.cc:637
+#: step_entry.cc:631
 msgid "Switch to the 9th octave"
 msgstr ""
 
-#: step_entry.cc:638
+#: step_entry.cc:632
 msgid "Switch to the 10th octave"
 msgstr ""
 
-#: step_entry.cc:639
+#: step_entry.cc:633
 msgid "Switch to the 11th octave"
 msgstr ""
 
-#: step_entry.cc:644
+#: step_entry.cc:635
+msgid "Toggle Triple Notes"
+msgstr ""
+
+#: step_entry.cc:638
+msgid "Toggle Chord Entry"
+msgstr ""
+
+#: step_entry.cc:640
+msgid "Sustain Selected Notes by Note Length"
+msgstr ""
+
+#: step_entry.cc:650
 msgid "Set Note Length to Whole"
 msgstr ""
 
-#: step_entry.cc:646
+#: step_entry.cc:652
 msgid "Set Note Length to 1/2"
 msgstr ""
 
-#: step_entry.cc:648
+#: step_entry.cc:654
 msgid "Set Note Length to 1/3"
 msgstr ""
 
-#: step_entry.cc:650
+#: step_entry.cc:656
 msgid "Set Note Length to 1/4"
 msgstr ""
 
-#: step_entry.cc:652
+#: step_entry.cc:658
 msgid "Set Note Length to 1/8"
 msgstr ""
 
-#: step_entry.cc:654
+#: step_entry.cc:660
 msgid "Set Note Length to 1/16"
 msgstr ""
 
-#: step_entry.cc:656
+#: step_entry.cc:662
 msgid "Set Note Length to 1/32"
 msgstr ""
 
-#: step_entry.cc:658
+#: step_entry.cc:664
 msgid "Set Note Length to 1/64"
 msgstr ""
 
-#: step_entry.cc:663
+#: step_entry.cc:669
 msgid "Set Note Velocity to Pianississimo"
 msgstr ""
 
-#: step_entry.cc:665
+#: step_entry.cc:671
 msgid "Set Note Velocity to Pianissimo"
 msgstr ""
 
-#: step_entry.cc:667
+#: step_entry.cc:673
 msgid "Set Note Velocity to Piano"
 msgstr ""
 
-#: step_entry.cc:669
+#: step_entry.cc:675
 msgid "Set Note Velocity to Mezzo-Piano"
 msgstr ""
 
-#: step_entry.cc:671
+#: step_entry.cc:677
 msgid "Set Note Velocity to Mezzo-Forte"
 msgstr ""
 
-#: step_entry.cc:673
+#: step_entry.cc:679
 msgid "Set Note Velocity to Forte"
 msgstr ""
 
-#: step_entry.cc:675 step_entry.cc:677
+#: step_entry.cc:681 step_entry.cc:683
 msgid "Set Note Velocity to Fortississimo"
 msgstr ""
 
-#: step_entry.cc:679
-msgid "Toggle Triple Notes"
-msgstr ""
-
-#: step_entry.cc:684
+#: step_entry.cc:688
 msgid "No Dotted Notes"
 msgstr ""
 
-#: step_entry.cc:686
+#: step_entry.cc:689
 msgid "Toggled Dotted Notes"
 msgstr ""
 
-#: step_entry.cc:688
+#: step_entry.cc:690
 msgid "Toggled Double-Dotted Notes"
 msgstr ""
 
-#: step_entry.cc:690
+#: step_entry.cc:691
 msgid "Toggled Triple-Dotted Notes"
 msgstr ""
 
-#: step_entry.cc:693
-msgid "Toggle Chord Entry"
-msgstr ""
-
-#: step_entry.cc:695
-msgid "Sustain Selected Notes by Note Length"
-msgstr ""
-
-#: stereo_panner.cc:133
+#: stereo_panner.cc:129
 #, c-format
 msgid "L:%3d R:%3d Width:%d%%"
 msgstr ""
 
-#: stereo_panner_editor.cc:35
+#: stereo_panner.cc:272
+msgid "Panner|M"
+msgstr ""
+
+#: stereo_panner_editor.cc:37
 msgid "Stereo Panner"
 msgstr ""
 
-#: stereo_panner_editor.cc:49
+#: stereo_panner_editor.cc:51
 msgid "Width"
 msgstr ""
 
@@ -11877,176 +13916,189 @@ msgstr ""
 msgid "Strip Silence"
 msgstr ""
 
-#: strip_silence_dialog.cc:75
+#: strip_silence_dialog.cc:65
+msgid "Threshold"
+msgstr ""
+
+#: strip_silence_dialog.cc:76
 msgid "Minimum length"
 msgstr ""
 
-#: strip_silence_dialog.cc:83
+#: strip_silence_dialog.cc:84
 msgid "Fade length"
 msgstr ""
 
-#: tempo_dialog.cc:41 tempo_dialog.cc:57
+#: strip_silence_dialog.cc:111 strip_silence_dialog.cc:298
+msgid "Analyzing"
+msgstr ""
+
+#: tempo_dialog.cc:43 tempo_dialog.cc:60
 msgid "bar:"
 msgstr ""
 
-#: tempo_dialog.cc:42 tempo_dialog.cc:58
+#: tempo_dialog.cc:44 tempo_dialog.cc:61
 msgid "beat:"
 msgstr ""
 
-#: tempo_dialog.cc:43 tempo_dialog.cc:59
+#: tempo_dialog.cc:45 tempo_dialog.cc:62
 msgid "Pulse note"
 msgstr ""
 
-#: tempo_dialog.cc:44 tempo_dialog.cc:60
+#: tempo_dialog.cc:46 tempo_dialog.cc:63
 msgid "Tap tempo"
 msgstr ""
 
-#: tempo_dialog.cc:54
-msgid "Edit Tempo"
-msgstr ""
-
-#: tempo_dialog.cc:77 tempo_dialog.cc:78 tempo_dialog.cc:324
-#: tempo_dialog.cc:325
+#: tempo_dialog.cc:81 tempo_dialog.cc:82 tempo_dialog.cc:448
+#: tempo_dialog.cc:449
 msgid "whole"
 msgstr ""
 
-#: tempo_dialog.cc:79 tempo_dialog.cc:80 tempo_dialog.cc:326
-#: tempo_dialog.cc:327
+#: tempo_dialog.cc:83 tempo_dialog.cc:84 tempo_dialog.cc:450
+#: tempo_dialog.cc:451
 msgid "second"
 msgstr ""
 
-#: tempo_dialog.cc:81 tempo_dialog.cc:82 tempo_dialog.cc:328
-#: tempo_dialog.cc:329
+#: tempo_dialog.cc:85 tempo_dialog.cc:86 tempo_dialog.cc:452
+#: tempo_dialog.cc:453
 msgid "third"
 msgstr ""
 
-#: tempo_dialog.cc:83 tempo_dialog.cc:84 tempo_dialog.cc:330
-#: tempo_dialog.cc:331
+#: tempo_dialog.cc:87 tempo_dialog.cc:88 tempo_dialog.cc:454
+#: tempo_dialog.cc:455
 msgid "quarter"
 msgstr ""
 
-#: tempo_dialog.cc:85 tempo_dialog.cc:86 tempo_dialog.cc:332
-#: tempo_dialog.cc:333
+#: tempo_dialog.cc:89 tempo_dialog.cc:90 tempo_dialog.cc:456
+#: tempo_dialog.cc:457
 msgid "eighth"
 msgstr ""
 
-#: tempo_dialog.cc:87 tempo_dialog.cc:88 tempo_dialog.cc:334
-#: tempo_dialog.cc:335
+#: tempo_dialog.cc:91 tempo_dialog.cc:92 tempo_dialog.cc:458
+#: tempo_dialog.cc:459
 msgid "sixteenth"
 msgstr ""
 
-#: tempo_dialog.cc:89 tempo_dialog.cc:90 tempo_dialog.cc:336
-#: tempo_dialog.cc:337
+#: tempo_dialog.cc:93 tempo_dialog.cc:94 tempo_dialog.cc:460
+#: tempo_dialog.cc:461
 msgid "thirty-second"
 msgstr ""
 
-#: tempo_dialog.cc:91 tempo_dialog.cc:92 tempo_dialog.cc:338
-#: tempo_dialog.cc:339
+#: tempo_dialog.cc:95 tempo_dialog.cc:96 tempo_dialog.cc:462
+#: tempo_dialog.cc:463
 msgid "sixty-fourth"
 msgstr ""
 
-#: tempo_dialog.cc:93 tempo_dialog.cc:94 tempo_dialog.cc:340
-#: tempo_dialog.cc:341
+#: tempo_dialog.cc:97 tempo_dialog.cc:98 tempo_dialog.cc:464
+#: tempo_dialog.cc:465
 msgid "one-hundred-twenty-eighth"
 msgstr ""
 
-#: tempo_dialog.cc:121
+#: tempo_dialog.cc:115 tempo_dialog.cc:116
+msgid "ramped"
+msgstr ""
+
+#: tempo_dialog.cc:117 tempo_dialog.cc:118
+msgid "constant"
+msgstr ""
+
+#: tempo_dialog.cc:133 tempo_dialog.cc:134 tempo_dialog.cc:482
+#: tempo_dialog.cc:483
+msgid "music"
+msgstr ""
+
+#: tempo_dialog.cc:161
 msgid "Beats per minute:"
 msgstr ""
 
-#: tempo_dialog.cc:155
+#: tempo_dialog.cc:195
 msgid "Tempo begins at"
 msgstr ""
 
-#: tempo_dialog.cc:251
+#: tempo_dialog.cc:201
+msgid "Lock Style:"
+msgstr ""
+
+#: tempo_dialog.cc:209
+msgid "Tempo Type:"
+msgstr ""
+
+#: tempo_dialog.cc:321
 msgid "incomprehensible pulse note type (%1)"
 msgstr ""
 
-#: tempo_dialog.cc:307
-msgid "Edit Meter"
+#: tempo_dialog.cc:334
+msgid "incomprehensible tempo type (%1)"
 msgstr ""
 
-#: tempo_dialog.cc:356
-msgid "Note value:"
+#: tempo_dialog.cc:347
+msgid "incomprehensible lock style (%1)"
 msgstr ""
 
-#: tempo_dialog.cc:357
-msgid "Beats per bar:"
+#: tempo_dialog.cc:498
+msgid "Note value:"
 msgstr ""
 
-#: tempo_dialog.cc:371
-msgid "Meter begins at bar:"
+#: tempo_dialog.cc:499
+msgid "Lock style:"
 msgstr ""
 
-#: tempo_dialog.cc:484
-msgid "incomprehensible meter note type (%1)"
+#: tempo_dialog.cc:500
+msgid "Beats per bar:"
 msgstr ""
 
-#: theme_manager.cc:65
-msgid "Dark Theme"
+#: tempo_dialog.cc:514
+msgid "Meter begins at bar:"
 msgstr ""
 
-#: theme_manager.cc:66
-msgid "Light Theme"
+#: tempo_dialog.cc:638
+msgid "incomprehensible meter note type (%1)"
 msgstr ""
 
-#: theme_manager.cc:67
-msgid "Restore Defaults"
+#: tempo_dialog.cc:651
+msgid "incomprehensible meter lock style (%1)"
 msgstr ""
 
-#: theme_manager.cc:68
+#: theme_manager.cc:53
 msgid "Draw \"flat\" buttons"
 msgstr ""
 
-#: theme_manager.cc:69
+#: theme_manager.cc:54
 msgid "Blink Rec-Arm buttons"
 msgstr ""
 
-#: theme_manager.cc:70
+#: theme_manager.cc:55
 msgid "Color regions using their track's color"
 msgstr ""
 
-#: theme_manager.cc:71
+#: theme_manager.cc:56
 msgid "Show waveform clipping"
 msgstr ""
 
-#: theme_manager.cc:73
+#: theme_manager.cc:58
 msgid "Waveforms color gradient depth"
 msgstr ""
 
-#: theme_manager.cc:75
+#: theme_manager.cc:60
 msgid "Timeline item gradient depth"
 msgstr ""
 
-#: theme_manager.cc:76
+#: theme_manager.cc:61
 msgid "All floating windows are dialogs"
 msgstr ""
 
-#: theme_manager.cc:77
+#: theme_manager.cc:62
 msgid "Transient windows follow front window."
 msgstr ""
 
-#: theme_manager.cc:78
-msgid "Icon Set"
-msgstr ""
-
-#: theme_manager.cc:87
-msgid "Object"
-msgstr ""
-
-#: theme_manager.cc:163
-msgid "Items"
-msgstr ""
-
-#: theme_manager.cc:164
-msgid "Palette"
+#: theme_manager.cc:63
+msgid "Float detached monitor-section window"
 msgstr ""
 
-#: theme_manager.cc:165
-msgid "Transparency"
+#: theme_manager.cc:64
+msgid "Icon Set"
 msgstr ""
 
-#: theme_manager.cc:195
+#: theme_manager.cc:132
 msgid ""
 "Mark all floating windows to be type \"Dialog\" rather than using \"Utility"
 "\" for some.\n"
@@ -12054,92 +14106,95 @@ msgid ""
 "take effect"
 msgstr ""
 
-#: theme_manager.cc:199
+#: theme_manager.cc:136
 msgid ""
 "Make transient windows follow the front window when toggling between the "
 "editor and mixer.\n"
 "This requires a restart of %1 to take effect"
 msgstr ""
 
-#: theme_manager.cc:620
-msgid "Color Palette"
+#: theme_manager.cc:139
+msgid ""
+"When detaching the monitoring section, mark it as \"Utility\" window to stay "
+"in front.\n"
+"This requires a restart of %1 to take effect"
 msgstr ""
 
 #: time_axis_view.cc:148
 msgid "Track/Bus name (double click to edit)"
 msgstr ""
 
-#: time_axis_view_item.cc:345
+#: time_axis_view_item.cc:326
 msgid "new duration %1 frame is out of bounds for %2"
 msgid_plural "new duration of %1 frames is out of bounds for %2"
 msgstr[0] ""
 msgstr[1] ""
 
-#: time_fx_dialog.cc:62
+#: time_fx_dialog.cc:60
 msgid "Quick but Ugly"
 msgstr "Γρήγορο αλλά  Άσχημο"
 
-#: time_fx_dialog.cc:63
+#: time_fx_dialog.cc:61
 msgid "Skip Anti-aliasing"
 msgstr "Παράκαμψη Anti-aliasing"
 
-#: time_fx_dialog.cc:64
-msgid "Contents:"
+#: time_fx_dialog.cc:62
+msgid "Contents"
 msgstr ""
 
-#: time_fx_dialog.cc:65
+#: time_fx_dialog.cc:63
 msgid "Minimize time distortion"
 msgstr ""
 
-#: time_fx_dialog.cc:66
+#: time_fx_dialog.cc:64
 msgid "Preserve Formants"
 msgstr ""
 
-#: time_fx_dialog.cc:71
+#: time_fx_dialog.cc:81
 msgid "TimeFXDialog"
 msgstr ""
 
-#: time_fx_dialog.cc:74
+#: time_fx_dialog.cc:84
 msgid "Pitch Shift Audio"
 msgstr ""
 
-#: time_fx_dialog.cc:76
+#: time_fx_dialog.cc:86
 msgid "Time Stretch Audio"
 msgstr ""
 
-#: time_fx_dialog.cc:104 transpose_dialog.cc:41
+#: time_fx_dialog.cc:114 transpose_dialog.cc:41
 msgid "Octaves:"
 msgstr ""
 
-#: time_fx_dialog.cc:109 transpose_dialog.cc:46
+#: time_fx_dialog.cc:119 transpose_dialog.cc:46
 msgid "Semitones:"
 msgstr ""
 
-#: time_fx_dialog.cc:114
+#: time_fx_dialog.cc:124
 msgid "Cents:"
 msgstr ""
 
-#: time_fx_dialog.cc:122
+#: time_fx_dialog.cc:132
 msgid "Time|Shift"
 msgstr ""
 
-#: time_fx_dialog.cc:146 time_fx_dialog.cc:149
+#: time_fx_dialog.cc:184 time_fx_dialog.cc:188
 msgid "TimeFXButton"
 msgstr ""
 
-#: time_fx_dialog.cc:154
+#: time_fx_dialog.cc:193
 msgid "Stretch/Shrink"
 msgstr ""
 
-#: time_fx_dialog.cc:164
+#: time_fx_dialog.cc:203
 msgid "<b>Progress</b>"
 msgstr ""
 
-#: time_info_box.cc:124
+#: time_info_box.cc:118
 msgid "Start recording at auto-punch start"
 msgstr "Έναρξη εγγραφής στην αρχή αυτο-εναπόθεσης"
 
-#: time_info_box.cc:125
+#: time_info_box.cc:119
 msgid "Stop recording at auto-punch end"
 msgstr "Λήξη εγγραφής στο τέλος αυτο-εναπόθεσης"
 
@@ -12207,94 +14262,130 @@ msgstr ""
 msgid "Transpose"
 msgstr ""
 
-#: ui_config.cc:163 ui_config.cc:300
+#: ui_config.cc:233 ui_config.cc:416
 msgid "Loading default ui configuration file %1"
 msgstr ""
 
-#: ui_config.cc:166 ui_config.cc:303
+#: ui_config.cc:236 ui_config.cc:419
 msgid "cannot read default ui configuration file \"%1\""
 msgstr ""
 
-#: ui_config.cc:169 ui_config.cc:308
+#: ui_config.cc:239 ui_config.cc:424
 msgid "default ui configuration file \"%1\" not loaded successfully."
 msgstr ""
 
-#: ui_config.cc:177
+#: ui_config.cc:247
 msgid "Could not find default UI configuration file %1"
 msgstr ""
 
-#: ui_config.cc:219
+#: ui_config.cc:330
+msgid "Color file for %1 not found along %2"
+msgstr ""
+
+#: ui_config.cc:337
 msgid "Loading color file %1"
 msgstr ""
 
-#: ui_config.cc:222
+#: ui_config.cc:340
 msgid "cannot read color file \"%1\""
 msgstr ""
 
-#: ui_config.cc:227
+#: ui_config.cc:345
 msgid "color file \"%1\" not loaded successfully."
 msgstr ""
 
-#: ui_config.cc:233
-msgid "Color file %1 not found"
-msgstr ""
-
-#: ui_config.cc:282 ui_config.cc:361
+#: ui_config.cc:397 ui_config.cc:480
 msgid "Color file %1 not saved"
 msgstr ""
 
-#: ui_config.cc:317
+#: ui_config.cc:433
 msgid "Loading user ui configuration file %1"
 msgstr ""
 
-#: ui_config.cc:320
+#: ui_config.cc:436
 msgid "cannot read ui configuration file \"%1\""
 msgstr ""
 
-#: ui_config.cc:325
+#: ui_config.cc:441
 msgid "user ui configuration file \"%1\" not loaded successfully."
 msgstr ""
 
-#: ui_config.cc:333
+#: ui_config.cc:449
 msgid "could not find any ui configuration file, canvas will look broken."
 msgstr ""
 
-#: ui_config.cc:351
+#: ui_config.cc:470
 msgid "Config file %1 not saved"
 msgstr ""
 
-#: ui_config.cc:592
+#: ui_config.cc:715
 msgid "Color %1 not found"
 msgstr ""
 
-#: ui_config.cc:662
+#: ui_config.cc:785
 msgid "Unable to find UI style file %1 in search path %2. %3 will look strange"
 msgstr ""
 
-#: utils.cc:117 utils.cc:160
+#: utils.cc:118 utils.cc:161
 msgid "bad XPM header %1"
 msgstr "εσφαλμένος XPM header %1"
 
-#: utils.cc:577
+#: utils.cc:424
 msgid "cannot find XPM file for %1"
 msgstr ""
 
-#: utils.cc:597 utils.cc:627 utils.cc:641
+#: utils.cc:477 utils.cc:507 utils.cc:527
 msgid "default"
 msgstr ""
 
-#: utils.cc:642
+#: utils.cc:528
 msgid "icon \"%1\" not found for icon set \"%2\", fallback to default"
 msgstr ""
 
-#: utils.cc:649
+#: utils.cc:535
 msgid "cannot find icon image for %1 using %2"
 msgstr ""
 
-#: utils.cc:666 utils.cc:682
+#: utils.cc:552 utils.cc:568
 msgid "Caught exception while loading icon named %1"
 msgstr ""
 
+#: utils.cc:818
+msgid "Overwrite"
+msgstr ""
+
+#: vca_master_strip.cc:74 vca_time_axis.cc:49
+msgid "Solo slaves"
+msgstr ""
+
+#: vca_master_strip.cc:79 vca_time_axis.cc:55
+msgid "Mute slaves"
+msgstr ""
+
+#: vca_master_strip.cc:83
+msgid "Hide this VCA strip"
+msgstr ""
+
+#: vca_master_strip.cc:108 vca_master_strip.cc:418
+msgid "Click to show slaves only"
+msgstr ""
+
+#: vca_master_strip.cc:293
+msgid "A"
+msgstr ""
+
+#: vca_master_strip.cc:300
+msgid "S"
+msgstr ""
+
+#: vca_master_strip.cc:398
+msgid "Drop All Slaves"
+msgstr ""
+
+#: vca_master_strip.cc:421
+msgid "Click to show normal mixer"
+msgstr ""
+
 #: add_video_dialog.cc:54
 msgid "Set Video Track"
 msgstr ""
@@ -12339,32 +14430,48 @@ msgstr ""
 msgid " %1 fps"
 msgstr ""
 
-#: video_timeline.cc:468
+#: vca_time_axis.cc:60
+msgid "D"
+msgstr ""
+
+#: vca_time_axis.cc:61
+msgid "Unassign all slaves"
+msgstr ""
+
+#: vca_time_axis.cc:65
+msgid "V"
+msgstr ""
+
+#: vca_time_axis.cc:66
+msgid "Show only slaves"
+msgstr ""
+
+#: video_timeline.cc:472
 msgid ""
 "Parsing video file info failed. Is the Video Server running? Is the file "
 "readable by the Video Server? Does the docroot match? Is it a video file?"
 msgstr ""
 
-#: video_timeline.cc:506
+#: video_timeline.cc:510
 msgid ""
 "Failed to set session-framerate: '%1' does not have a corresponding option "
 "setting in %2."
 msgstr ""
 
-#: video_timeline.cc:514
+#: video_timeline.cc:518
 msgid ""
 "Video file's framerate is not equal to %1 session timecode's framerate: '%2' "
 "vs '%3'"
 msgstr ""
 
-#: video_timeline.cc:587
+#: video_timeline.cc:591
 msgid ""
 "Video-server docroot mismatch. %1: '%2', video-server: '%3'. This usually "
 "means that the video server was not started by %1 and uses a different "
 "document-root."
 msgstr ""
 
-#: video_timeline.cc:724
+#: video_timeline.cc:728
 msgid ""
 "Video-monitor 'xjadeo' was not found. Please install http://xjadeo.sf.net/ "
 "(a custom path to xjadeo can be specified by setting the XJREMOTE "
@@ -12374,25 +14481,25 @@ msgid ""
 "see also http://manual.ardour.org/video-timeline/setup/"
 msgstr ""
 
-#: video_timeline.cc:739
+#: video_timeline.cc:743
 msgid "Video-monitor 'xjadeo' cannot be launched."
 msgstr ""
 
-#: video_timeline.cc:766
+#: video_timeline.cc:775
 msgid ""
 "Video-monitor 'xjadeo' is too old. Please install xjadeo version 0.7.7 or "
 "later. http://xjadeo.sf.net/"
 msgstr ""
 
-#: video_monitor.cc:285
+#: video_monitor.cc:283
 msgid "Video Monitor: File Not Found."
 msgstr ""
 
 #: transcode_ffmpeg.cc:56
 msgid ""
-"No ffprobe or ffmpeg executables could be found on this system.\n"
-"Video import and export is not possible until you install those tools.\n"
+"ffmpeg installation was not found on this system.\n"
 "%1 requires ffmpeg and ffprobe from ffmpeg.org - version 1.1 or newer.\n"
+"Video import and export is not possible until you install tools.\n"
 "\n"
 "The tools are included with the %1 releases from ardour.org and also "
 "available with the video-server at http://x42.github.com/harvid/\n"
@@ -12414,7 +14521,7 @@ msgstr ""
 msgid "Output File:"
 msgstr ""
 
-#: transcode_video_dialog.cc:61 export_video_dialog.cc:85
+#: transcode_video_dialog.cc:61 export_video_dialog.cc:81
 msgid "Abort"
 msgstr ""
 
@@ -12423,10 +14530,14 @@ msgid "Height = "
 msgstr ""
 
 #: transcode_video_dialog.cc:66
+msgid "Extract LTC from audio and align video"
+msgstr ""
+
+#: transcode_video_dialog.cc:67
 msgid "Manual Override"
 msgstr ""
 
-#: transcode_video_dialog.cc:70 export_video_dialog.cc:103
+#: transcode_video_dialog.cc:71 export_video_dialog.cc:99
 msgid "Debug Mode: Print ffmpeg command and output to stdout."
 msgstr ""
 
@@ -12436,9 +14547,8 @@ msgstr ""
 
 #: transcode_video_dialog.cc:113
 msgid ""
-"No ffprobe or ffmpeg executables could be found on this system. Video Import "
-"is not possible until you install those tools. See the Log window for more "
-"information."
+"ffmpeg installation was not found. Video Import is not possible. See the Log "
+"window for more information."
 msgstr ""
 
 #: transcode_video_dialog.cc:120
@@ -12447,83 +14557,83 @@ msgid ""
 "unsupported video codec or format."
 msgstr ""
 
-#: transcode_video_dialog.cc:134
+#: transcode_video_dialog.cc:137
 msgid "FPS:"
 msgstr ""
 
-#: transcode_video_dialog.cc:136
-msgid "Duration:"
-msgstr ""
-
-#: transcode_video_dialog.cc:138
+#: transcode_video_dialog.cc:141
 msgid "Codec:"
 msgstr ""
 
-#: transcode_video_dialog.cc:140
+#: transcode_video_dialog.cc:143
 msgid "Geometry:"
 msgstr ""
 
-#: transcode_video_dialog.cc:155
+#: transcode_video_dialog.cc:158
 msgid "??"
 msgstr ""
 
-#: transcode_video_dialog.cc:176
+#: transcode_video_dialog.cc:179
 msgid "<b>Import Settings</b>"
 msgstr ""
 
-#: transcode_video_dialog.cc:181
-msgid "Reference From Current Location (Previously Transcoded Files Only)"
+#: transcode_video_dialog.cc:184
+msgid "Reference from Current Location (Previously Transcoded Files Only)"
 msgstr ""
 
-#: transcode_video_dialog.cc:183
+#: transcode_video_dialog.cc:185
 msgid "Import/Transcode Video to Session"
 msgstr ""
 
-#: transcode_video_dialog.cc:191
+#: transcode_video_dialog.cc:188 transcode_video_dialog.cc:198
 msgid "Do Not Import Video (Audio Import Only)"
 msgstr ""
 
-#: transcode_video_dialog.cc:200
+#: transcode_video_dialog.cc:208
+msgid "Do Not Import Video"
+msgstr ""
+
+#: transcode_video_dialog.cc:224
 msgid "Scale Video: Width = "
 msgstr ""
 
-#: transcode_video_dialog.cc:207
+#: transcode_video_dialog.cc:230
 msgid "Original Width"
 msgstr ""
 
-#: transcode_video_dialog.cc:222
+#: transcode_video_dialog.cc:245
 msgid "Bitrate (KBit/s):"
 msgstr ""
 
-#: transcode_video_dialog.cc:227
+#: transcode_video_dialog.cc:250
 msgid "Extract Audio:"
 msgstr ""
 
-#: transcode_video_dialog.cc:232
+#: transcode_video_dialog.cc:255
 msgid "No Audio Track Present"
 msgstr ""
 
-#: transcode_video_dialog.cc:235
+#: transcode_video_dialog.cc:258
 msgid "Do Not Extract Audio"
 msgstr ""
 
-#: transcode_video_dialog.cc:350
+#: transcode_video_dialog.cc:374
 msgid "Extracting Audio.."
 msgstr ""
 
-#: transcode_video_dialog.cc:353
+#: transcode_video_dialog.cc:377
 msgid "Audio Extraction Failed."
 msgstr ""
 
-#: transcode_video_dialog.cc:379
+#: transcode_video_dialog.cc:403
 msgid "Transcoding Video.."
 msgstr ""
 
-#: transcode_video_dialog.cc:413
+#: transcode_video_dialog.cc:437
 msgid "Transcoding Failed."
 msgstr ""
 
-#: transcode_video_dialog.cc:503
+#: transcode_video_dialog.cc:541
 msgid "Save Transcoded Video File"
 msgstr ""
 
@@ -12543,7 +14653,7 @@ msgstr ""
 msgid "Don't show this dialog again. (Reset in Edit->Preferences)."
 msgstr ""
 
-#: video_server_dialog.cc:97
+#: video_server_dialog.cc:94
 msgid ""
 "The external video server 'harvid' can not be found.\n"
 "The tool is included with the %1 releases from ardour.org, alternatively you "
@@ -12553,239 +14663,230 @@ msgid ""
 "see also http://manual.ardour.org/video-timeline/setup/"
 msgstr ""
 
-#: video_server_dialog.cc:129
+#: video_server_dialog.cc:126
 msgid "Listen Address:"
 msgstr ""
 
-#: video_server_dialog.cc:134
+#: video_server_dialog.cc:131
 msgid "Listen Port:"
 msgstr ""
 
-#: video_server_dialog.cc:139
+#: video_server_dialog.cc:136
 msgid "Cache Size:"
 msgstr ""
 
-#: video_server_dialog.cc:145
+#: video_server_dialog.cc:142
 msgid ""
 "%1 relies on an external video server for the videotimeline.\n"
 "The server configured in Edit -> Preferences -> Video is not reachable.\n"
 "Do you want %1 to launch 'harvid' on this machine?"
 msgstr ""
 
-#: video_server_dialog.cc:189
+#: video_server_dialog.cc:186
 msgid "Set Video Server Executable"
 msgstr ""
 
-#: video_server_dialog.cc:209
+#: video_server_dialog.cc:206
 msgid "Server docroot"
 msgstr ""
 
-#: utils_videotl.cc:60
+#: utils_videotl.cc:61
 msgid "Destination is outside Video Server's docroot. "
 msgstr ""
 
-#: utils_videotl.cc:61
+#: utils_videotl.cc:62
 msgid ""
 "The destination file path is outside of the Video Server's docroot. The file "
 "will not be readable by the Video Server. Do you still want to continue?"
 msgstr ""
 
-#: utils_videotl.cc:64
+#: utils_videotl.cc:65
 msgid "Continue"
 msgstr ""
 
-#: utils_videotl.cc:70
+#: utils_videotl.cc:72
 msgid "Confirm Overwrite"
 msgstr ""
 
-#: utils_videotl.cc:71
-msgid "A file with the same name already exists.  Do you want to overwrite it?"
-msgstr ""
-
-#: utils_videotl.cc:81 utils_videotl.cc:97
+#: utils_videotl.cc:82 utils_videotl.cc:98
 msgid "Cannot create video folder \"%1\" (%2)"
 msgstr ""
 
-#: export_video_dialog.cc:71
+#: export_video_dialog.cc:67
 msgid "Export Video File "
 msgstr ""
 
-#: export_video_dialog.cc:82
+#: export_video_dialog.cc:78
 msgid "Video:"
 msgstr ""
 
-#: export_video_dialog.cc:87
+#: export_video_dialog.cc:83
 msgid "Scale Video (W x H):"
 msgstr ""
 
-#: export_video_dialog.cc:88
+#: export_video_dialog.cc:84
 msgid "Retain Aspect"
 msgstr ""
 
-#: export_video_dialog.cc:93
+#: export_video_dialog.cc:89
 msgid "Set Aspect Ratio:"
 msgstr ""
 
-#: export_video_dialog.cc:94
+#: export_video_dialog.cc:90
 msgid "Normalize Audio"
 msgstr ""
 
-#: export_video_dialog.cc:95
+#: export_video_dialog.cc:91
 msgid "2 Pass Encoding"
 msgstr ""
 
-#: export_video_dialog.cc:96
+#: export_video_dialog.cc:92
 msgid "Codec Optimizations:"
 msgstr ""
 
-#: export_video_dialog.cc:98
+#: export_video_dialog.cc:94
 msgid "Deinterlace"
 msgstr ""
 
-#: export_video_dialog.cc:99
+#: export_video_dialog.cc:95
 msgid "Use [2] B-frames (MPEG 2 or 4 only)"
 msgstr ""
 
-#: export_video_dialog.cc:100
+#: export_video_dialog.cc:96
 msgid "Override FPS (Default is to retain FPS from the input video file):"
 msgstr ""
 
-#: export_video_dialog.cc:101
+#: export_video_dialog.cc:97
 msgid "Include Session Metadata"
 msgstr ""
 
-#: export_video_dialog.cc:119
+#: export_video_dialog.cc:115
 msgid ""
-"No ffprobe or ffmpeg executables could be found on this system. Video Export "
-"is not possible until you install those tools. See the Log window for more "
-"information."
+"ffmpeg installation was not found. Video Export is not possible. See the Log "
+"window for more information."
 msgstr ""
 
-#: export_video_dialog.cc:130
+#: export_video_dialog.cc:126
 msgid "<b>Output:</b> (file extension defines format)"
 msgstr ""
 
-#: export_video_dialog.cc:140
+#: export_video_dialog.cc:136
 msgid "<b>Input Video:</b>"
 msgstr ""
 
-#: export_video_dialog.cc:151
+#: export_video_dialog.cc:147
 msgid "Audio:"
 msgstr ""
 
-#: export_video_dialog.cc:153
+#: export_video_dialog.cc:149
 msgid "Master Bus"
 msgstr ""
 
-#: export_video_dialog.cc:158
+#: export_video_dialog.cc:153
 msgid "from the %1 session's start to the session's end"
 msgstr ""
 
-#: export_video_dialog.cc:161
+#: export_video_dialog.cc:156
 msgid "<b>Settings:</b>"
 msgstr ""
 
-#: export_video_dialog.cc:169
+#: export_video_dialog.cc:164
 msgid "Range:"
 msgstr ""
 
-#: export_video_dialog.cc:172
-msgid "Preset:"
-msgstr ""
-
-#: export_video_dialog.cc:175
+#: export_video_dialog.cc:170
 msgid "Video Codec:"
 msgstr ""
 
-#: export_video_dialog.cc:178
+#: export_video_dialog.cc:173
 msgid "Video KBit/s:"
 msgstr ""
 
-#: export_video_dialog.cc:181
+#: export_video_dialog.cc:176
 msgid "Audio Codec:"
 msgstr ""
 
-#: export_video_dialog.cc:184
+#: export_video_dialog.cc:179
 msgid "Audio KBit/s:"
 msgstr ""
 
-#: export_video_dialog.cc:187
+#: export_video_dialog.cc:182
 msgid "Audio Samplerate:"
 msgstr ""
 
-#: export_video_dialog.cc:222 export_video_dialog.cc:231
-#: export_video_dialog.cc:830 export_video_dialog.cc:833
+#: export_video_dialog.cc:215 export_video_dialog.cc:223
+#: export_video_dialog.cc:814 export_video_dialog.cc:817
 msgid "(default for format)"
 msgstr ""
 
-#: export_video_dialog.cc:242 export_video_dialog.cc:255
-#: export_video_dialog.cc:837 export_video_dialog.cc:846
+#: export_video_dialog.cc:233 export_video_dialog.cc:244
+#: export_video_dialog.cc:821 export_video_dialog.cc:830
 msgid "(default)"
 msgstr ""
 
-#: export_video_dialog.cc:256 export_video_dialog.cc:840
+#: export_video_dialog.cc:245 export_video_dialog.cc:824
 msgid "(retain)"
 msgstr ""
 
-#: export_video_dialog.cc:348
+#: export_video_dialog.cc:335
 msgid "from 00:00:00:00 to the video's end"
 msgstr ""
 
-#: export_video_dialog.cc:350
+#: export_video_dialog.cc:337
 msgid "from the video's start to the video's end"
 msgstr ""
 
-#: export_video_dialog.cc:353
+#: export_video_dialog.cc:340
 msgid "Selected range"
 msgstr ""
 
-#: export_video_dialog.cc:589
+#: export_video_dialog.cc:561
 msgid "Normalizing audio"
 msgstr ""
 
-#: export_video_dialog.cc:593
+#: export_video_dialog.cc:566 export_video_dialog.cc:571
 msgid "Exporting audio"
 msgstr ""
 
-#: export_video_dialog.cc:648
+#: export_video_dialog.cc:632
 msgid "Exporting Audio..."
 msgstr ""
 
-#: export_video_dialog.cc:705
+#: export_video_dialog.cc:689
 msgid ""
 "Export Video: Cannot query duration of video-file, using duration from "
 "timeline instead."
 msgstr ""
 
-#: export_video_dialog.cc:735
+#: export_video_dialog.cc:719
 msgid "Export Video: export-range does not include video."
 msgstr ""
 
-#: export_video_dialog.cc:748
+#: export_video_dialog.cc:732
 msgid "Export Video: No Master Out Ports to Connect for Audio Export"
 msgstr ""
 
-#: export_video_dialog.cc:790
+#: export_video_dialog.cc:774
 msgid "Encoding Video..."
 msgstr ""
 
-#: export_video_dialog.cc:810
+#: export_video_dialog.cc:794
 msgid "Export Video: Video input file cannot be read."
 msgstr ""
 
-#: export_video_dialog.cc:916
+#: export_video_dialog.cc:900
 msgid "Encoding Video.. Pass 1/2"
 msgstr ""
 
-#: export_video_dialog.cc:928
+#: export_video_dialog.cc:912
 msgid "Encoding Video.. Pass 2/2"
 msgstr ""
 
-#: export_video_dialog.cc:1031
+#: export_video_dialog.cc:1015
 msgid "Transcoding failed."
 msgstr ""
 
-#: export_video_dialog.cc:1267 export_video_dialog.cc:1287
+#: export_video_dialog.cc:1251 export_video_dialog.cc:1271
 msgid "Save Exported Video File"
 msgstr ""
 
@@ -12803,13 +14904,37 @@ msgstr ""
 
 #: export_video_infobox.cc:51
 msgid ""
+"%1 does not include commercial licenses for encoding audio/video. Visit "
+"mpegla.com for information about licensing various audio/video codecs.\n"
+"\n"
 "Video encoding is a non-trivial task with many details.\n"
 "\n"
-"Please see the manual at %1/video-timeline/operations/#export.\n"
+"Please see the manual at %2/video-timeline/operations/#export.\n"
 "\n"
 "Open Manual in Browser? "
 msgstr ""
 
+#~ msgid "Locations"
+#~ msgstr "Τοποθεσίες"
+
+#~ msgid "End point trim"
+#~ msgstr "Τέλος σημείου ισοσταθμίσεως"
+
+#~ msgid "duplicate selection"
+#~ msgstr "αντιγραφή επιλογής"
+
+#~ msgid "L"
+#~ msgstr "L"
+
+#~ msgid "*Comments*"
+#~ msgstr "*Σχόλια*"
+
+#~ msgid "Click to Add/Edit Comments"
+#~ msgstr "Κλίκ για Πρόσθεση/Επεξεργασία Σχολίων"
+
+#~ msgid "Update available plugins"
+#~ msgstr "Ανανέωση διαθέσιμων plugins"
+
 #~ msgid "Gain Tool"
 #~ msgstr "Εργαλείο Gain"
 
diff --git a/gtk2_ardour/po/en_GB.mo b/gtk2_ardour/po/en_GB.mo
new file mode 100644
index 0000000..37332da
Binary files /dev/null and b/gtk2_ardour/po/en_GB.mo differ
diff --git a/gtk2_ardour/po/en_GB.po b/gtk2_ardour/po/en_GB.po
index 87b6b8c..5e55265 100644
--- a/gtk2_ardour/po/en_GB.po
+++ b/gtk2_ardour/po/en_GB.po
@@ -5,271 +5,302 @@
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: Ardour 3\n"
+"Project-Id-Version: Ardour 5\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-04-02 18:25+0100\n"
-"PO-Revision-Date: 2015-03-21 14:07+0100\n"
+"POT-Creation-Date: 2016-07-14 06:20-0400\n"
+"PO-Revision-Date: 2016-07-24 16:09+0100\n"
 "Last-Translator: Colin Fletcher <colin.m.fletcher at googlemail.com>\n"
 "Language-Team: UK English <colin.m.fletcher at googlemail.com>\n"
-"Language: English (UK)\n"
+"Language: en_GB\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n!=1);\n"
-"X-Poedit-Language: English\n"
-"X-Poedit-Country: UNITED KINGDOM\n"
-"X-Poedit-SourceCharset: utf-8\n"
-"X-Poedit-Basepath: ~/src/ardour2/3.0/gtk2_ardour/\n"
+"X-Poedit-SourceCharset: UTF-8\n"
+"X-Poedit-Basepath: ~/src/ardour2/3.0/gtk2_ardour\n"
+"X-Generator: Poedit 1.8.8\n"
 
-#: about.cc:125
+#: about.cc:127
+msgid "Fons Adriaensen"
+msgstr ""
+
+#: about.cc:128
 msgid "Brian Ahr"
 msgstr ""
 
-#: about.cc:126
+#: about.cc:129
 msgid "John Anderson"
 msgstr ""
 
-#: about.cc:127
+#: about.cc:130
 msgid "Marcus Andersson"
 msgstr ""
 
-#: about.cc:128
+#: about.cc:131
 msgid "Nedko Arnaudov"
 msgstr ""
 
-#: about.cc:129
+#: about.cc:132
 msgid "Hans Baier"
 msgstr ""
 
-#: about.cc:130
+#: about.cc:133
 msgid "Ben Bell"
 msgstr ""
 
-#: about.cc:131
+#: about.cc:134
 msgid "Sakari Bergen"
 msgstr ""
 
-#: about.cc:132
+#: about.cc:135
 msgid "Christian Borss"
 msgstr ""
 
-#: about.cc:133
+#: about.cc:136
 msgid "Chris Cannam"
 msgstr ""
 
-#: about.cc:134
+#: about.cc:137
 msgid "Jeremy Carter"
 msgstr ""
 
-#: about.cc:135
+#: about.cc:138
 msgid "Jesse Chappell"
 msgstr ""
 
-#: about.cc:136
+#: about.cc:139
 msgid "Thomas Charbonnel"
 msgstr ""
 
-#: about.cc:137
+#: about.cc:140
 msgid "Sam Chessman"
 msgstr ""
 
-#: about.cc:138
+#: about.cc:141
 msgid "André Colomb"
 msgstr ""
 
-#: about.cc:139
+#: about.cc:142
 msgid "Paul Davis"
 msgstr ""
 
-#: about.cc:140
+#: about.cc:143
 msgid "Gerard van Dongen"
 msgstr ""
 
-#: about.cc:141
+#: about.cc:144
 msgid "John Emmas"
 msgstr ""
 
-#: about.cc:142
+#: about.cc:145
 msgid "Colin Fletcher"
 msgstr ""
 
-#: about.cc:143
+#: about.cc:146
 msgid "Dave Flick"
 msgstr ""
 
-#: about.cc:144
+#: about.cc:147
 msgid "Hans Fugal"
 msgstr ""
 
-#: about.cc:145
+#: about.cc:148
 msgid "Robin Gareus"
 msgstr ""
 
-#: about.cc:146
+#: about.cc:149
+msgid "Nil Geisweiller"
+msgstr ""
+
+#: about.cc:150
 msgid "Christopher George"
 msgstr ""
 
-#: about.cc:147
+#: about.cc:151
 msgid "Chris Goddard"
 msgstr ""
 
-#: about.cc:148
+#: about.cc:152
 msgid "J. Abelardo Gutierrez"
 msgstr ""
 
-#: about.cc:149
+#: about.cc:153
 msgid "Jeremy Hall"
 msgstr ""
 
-#: about.cc:150
+#: about.cc:154
 msgid "Audun Halland"
 msgstr ""
 
-#: about.cc:151
+#: about.cc:155
 msgid "David Halter"
 msgstr ""
 
-#: about.cc:152
+#: about.cc:156
 msgid "Steve Harris"
 msgstr ""
 
-#: about.cc:153
+#: about.cc:157
 msgid "Melvin Ray Herr"
 msgstr ""
 
-#: about.cc:154
+#: about.cc:158
 msgid "Carl Hetherington"
 msgstr ""
 
-#: about.cc:155
+#: about.cc:159
 msgid "Rob Holland"
 msgstr ""
 
-#: about.cc:156
+#: about.cc:160
 msgid "Robert Jordens"
 msgstr ""
 
-#: about.cc:157
+#: about.cc:161
 msgid "Stefan Kersten"
 msgstr ""
 
-#: about.cc:158
+#: about.cc:162
 msgid "Armand Klenk"
 msgstr ""
 
-#: about.cc:159
+#: about.cc:163
 msgid "Julien de Kozak"
 msgstr ""
 
-#: about.cc:160
+#: about.cc:164
 msgid "Matt Krai"
 msgstr ""
 
-#: about.cc:161
+#: about.cc:165
 msgid "Georg Krause"
 msgstr ""
 
-#: about.cc:162
+#: about.cc:166
 msgid "Nick Lanham"
 msgstr ""
 
-#: about.cc:163
+#: about.cc:167
 msgid "Colin Law"
 msgstr ""
 
-#: about.cc:164
+#: about.cc:168
 msgid "Joshua Leach"
 msgstr ""
 
-#: about.cc:165
+#: about.cc:169
 msgid "Ben Loftis"
 msgstr ""
 
-#: about.cc:166
+#: about.cc:170
 msgid "Nick Mainsbridge"
 msgstr ""
 
-#: about.cc:167
+#: about.cc:171
 msgid "Tim Mayberry"
 msgstr ""
 
-#: about.cc:168
+#: about.cc:172
 msgid "Doug Mclain"
 msgstr ""
 
-#: about.cc:169
+#: about.cc:173
 msgid "Todd Naugle"
 msgstr ""
 
-#: about.cc:170
+#: about.cc:174
+msgid "André Nusser"
+msgstr ""
+
+#: about.cc:175
+msgid "Bent Bisballe Nyeng"
+msgstr ""
+
+#: about.cc:176
 msgid "Jack O'Quin"
 msgstr ""
 
-#: about.cc:171
+#: about.cc:177
+msgid "Pavel Potocek"
+msgstr ""
+
+#: about.cc:178
 msgid "Nimal Ratnayake"
 msgstr ""
 
-#: about.cc:172
+#: about.cc:179
+msgid "Julien Rivaud"
+msgstr ""
+
+#: about.cc:180
 msgid "David Robillard"
 msgstr ""
 
-#: about.cc:173
+#: about.cc:181
+msgid "Julien Roger"
+msgstr ""
+
+#: about.cc:182
 msgid "Taybin Rutkin"
 msgstr ""
 
-#: about.cc:174
+#: about.cc:183
 msgid "Andreas Ruge"
 msgstr ""
 
-#: about.cc:175
+#: about.cc:184
 msgid "Sampo Savolainen"
 msgstr ""
 
-#: about.cc:176
+#: about.cc:185
 msgid "Rodrigo Severo"
 msgstr ""
 
-#: about.cc:177
+#: about.cc:186
 msgid "Per Sigmond"
 msgstr ""
 
-#: about.cc:178
+#: about.cc:187
 msgid "Lincoln Spiteri"
 msgstr ""
 
-#: about.cc:179
+#: about.cc:188
 msgid "Mike Start"
 msgstr ""
 
-#: about.cc:180
+#: about.cc:189
 msgid "Mark Stewart"
 msgstr ""
 
-#: about.cc:181
+#: about.cc:190
 msgid "Roland Stigge"
 msgstr ""
 
-#: about.cc:182
+#: about.cc:191
 msgid "Petter Sundlöf"
 msgstr ""
 
-#: about.cc:183
+#: about.cc:192
 msgid "Mike Täht"
 msgstr ""
 
-#: about.cc:184
+#: about.cc:193
 msgid "Roy Vegard"
 msgstr ""
 
-#: about.cc:185
+#: about.cc:194
 msgid "Thorsten Wilms"
 msgstr ""
 
-#: about.cc:186
+#: about.cc:195
+msgid "Damien Zammit"
+msgstr ""
+
+#: about.cc:196
 msgid "Grygorii Zharun"
 msgstr ""
 
-#: about.cc:191
+#: about.cc:201
 msgid ""
 "French:\n"
 "\tAlain Fréhel <alain.frehel at free.fr>\n"
@@ -278,7 +309,7 @@ msgid ""
 "\tRomain Arnaud <roming22 at gmail.com>\n"
 msgstr ""
 
-#: about.cc:192
+#: about.cc:202
 msgid ""
 "German:\n"
 "\tKarsten Petersen <kapet at kapet.de>\n"
@@ -290,210 +321,264 @@ msgid ""
 "\tRobin Gloster <robin at loc-com.de>\n"
 msgstr ""
 
-#: about.cc:199
+#: about.cc:209
 msgid ""
 "Italian:\n"
 "\tFilippo Pappalardo <filippo at email.it>\n"
 "\tRaffaele Morelli <raffaele.morelli at gmail.com>\n"
 msgstr ""
 
-#: about.cc:200
+#: about.cc:210
 msgid ""
 "Portuguese:\n"
 "\tRui Nuno Capela <rncbc at rncbc.org>\n"
 msgstr ""
 
-#: about.cc:201
+#: about.cc:211
 msgid ""
 "Brazilian Portuguese:\n"
 "\tAlexander da Franca Fernandes <alexander at nautae.eti.br>\n"
 "\tChris Ross <chris at tebibyte.org>\n"
 msgstr ""
 
-#: about.cc:203
+#: about.cc:213
 msgid ""
 "Spanish:\n"
 "\t Alex Krohn <alexkrohn at fastmail.fm>\n"
 "\tPablo Fernández <pablo.fbus at gmail.com>\n"
 msgstr ""
 
-#: about.cc:204
+#: about.cc:214
 msgid ""
 "Russian:\n"
 "\t Igor Blinov <pitstop at nm.ru>\n"
 "\tAlexandre Prokoudine <alexandre.prokoudine at gmail.com>\n"
 msgstr ""
 
-#: about.cc:206
+#: about.cc:216
 msgid ""
 "Greek:\n"
 "\t Klearchos Gourgourinis <muadib at in.gr>\n"
 msgstr ""
 
-#: about.cc:207
+#: about.cc:217
 msgid ""
 "Swedish:\n"
 "\t Petter Sundlöf <petter.sundlof at gmail.com>\n"
 msgstr ""
 
-#: about.cc:208
+#: about.cc:218
 msgid ""
 "Polish:\n"
 "\t Piotr Zaryk <pzaryk at gmail.com>\n"
 msgstr ""
 
-#: about.cc:209
+#: about.cc:219
 msgid ""
 "Czech:\n"
 "\t Pavel Fric <pavelfric at seznam.cz>\n"
 msgstr ""
 
-#: about.cc:210
+#: about.cc:220
 msgid ""
 "Norwegian:\n"
 "\t Eivind Ødegård\n"
 msgstr ""
 
-#: about.cc:211
+#: about.cc:221
 msgid ""
 "Chinese:\n"
 "\t Rui-huai Zhang <zrhzrh at mail.ustc.edu.cn>\n"
 msgstr ""
 
-#: about.cc:591
+#: about.cc:601
+msgid "Intel 64-bit"
+msgstr ""
+
+#: about.cc:603
+msgid "Intel 32-bit"
+msgstr ""
+
+#: about.cc:605
+msgid "PowerPC 64-bit"
+msgstr ""
+
+#: about.cc:607
+msgid "PowerPC 32-bit"
+msgstr ""
+
+#: about.cc:609
+msgid "64-bit"
+msgstr ""
+
+#: about.cc:611
+msgid "32-bit"
+msgstr ""
+
+#: about.cc:619
+msgid " - debug"
+msgstr ""
+
+#: about.cc:625
 msgid "Copyright (C) 1999-2015 Paul Davis\n"
 msgstr ""
 
-#: about.cc:595
+#: about.cc:629
 msgid "http://ardour.org/"
 msgstr ""
 
-#: about.cc:596
+#: about.cc:630
 msgid ""
 "%1%2\n"
-"(built from revision %3)"
+"(rev %3)\n"
+"%4%5"
 msgstr ""
 
-#: about.cc:600
+#: about.cc:635
 msgid "Config"
 msgstr ""
 
-#: actions.cc:85
+#: actions.cc:83
 msgid "Loading menus from %1"
 msgstr ""
 
-#: actions.cc:88 actions.cc:89
+#: actions.cc:86 actions.cc:87
 msgid "badly formatted menu definition file: %1"
 msgstr ""
 
-#: actions.cc:91
+#: actions.cc:89
 msgid "%1 menu definition file not found"
 msgstr ""
 
-#: actions.cc:95 actions.cc:96
+#: actions.cc:93 actions.cc:94
 msgid "%1 will not work without a valid menu definition file"
 msgstr ""
 
-#: add_route_dialog.cc:54 route_params_ui.cc:524
-msgid "Add Track or Bus"
+#: add_route_dialog.cc:58
+msgid "Add Track/Bus/VCA"
 msgstr ""
 
-#: add_route_dialog.cc:57
+#: add_route_dialog.cc:61
 msgid "Configuration:"
 msgstr ""
 
-#: add_route_dialog.cc:58
+#: add_route_dialog.cc:62
 msgid "Record Mode:"
 msgstr ""
 
-#: add_route_dialog.cc:59
+#: add_route_dialog.cc:63
 msgid "Instrument:"
 msgstr ""
 
-#: add_route_dialog.cc:77
+#: add_route_dialog.cc:77 add_route_dialog.cc:228
 msgid "Audio Tracks"
 msgstr ""
 
-#: add_route_dialog.cc:78 add_route_dialog.cc:209
+#: add_route_dialog.cc:78 add_route_dialog.cc:224
 msgid "MIDI Tracks"
 msgstr ""
 
-#: add_route_dialog.cc:79 add_route_dialog.cc:211
+#: add_route_dialog.cc:79 add_route_dialog.cc:226
 msgid "Audio+MIDI Tracks"
 msgstr ""
 
-#: add_route_dialog.cc:80 add_route_dialog.cc:207
-msgid "Busses"
+#: add_route_dialog.cc:80 add_route_dialog.cc:220
+msgid "Audio Busses"
+msgstr ""
+
+#: add_route_dialog.cc:81 add_route_dialog.cc:222
+msgid "MIDI Busses"
+msgstr ""
+
+#: add_route_dialog.cc:82
+msgid "VCA Masters"
 msgstr ""
 
-#: add_route_dialog.cc:83 add_route_dialog.cc:559
+#: add_route_dialog.cc:85 add_route_dialog.cc:622
 msgid "First"
 msgstr ""
 
-#: add_route_dialog.cc:84 add_route_dialog.cc:561
-msgid "After Editor Selection"
+#: add_route_dialog.cc:86 add_route_dialog.cc:626
+msgid "Before Selection"
 msgstr ""
 
-#: add_route_dialog.cc:85 add_route_dialog.cc:563
-msgid "After Mixer Selection"
+#: add_route_dialog.cc:87 add_route_dialog.cc:624
+msgid "After Selection"
 msgstr ""
 
-#: add_route_dialog.cc:86
+#: add_route_dialog.cc:88
 msgid "Last"
 msgstr ""
 
-#: add_route_dialog.cc:103
+#: add_route_dialog.cc:91
+msgid "Flexible-I/O"
+msgstr ""
+
+#: add_route_dialog.cc:92
+msgid "Strict-I/O"
+msgstr ""
+
+#: add_route_dialog.cc:108
 msgid "Add:"
 msgstr ""
 
-#: add_route_dialog.cc:116 time_fx_dialog.cc:91 add_video_dialog.cc:135
-#: video_server_dialog.cc:121
+#: add_route_dialog.cc:121 time_fx_dialog.cc:101 add_video_dialog.cc:135
+#: video_server_dialog.cc:118
 msgid "<b>Options</b>"
 msgstr ""
 
-#: add_route_dialog.cc:126 bundle_manager.cc:193 region_editor.cc:50
-#: route_group_dialog.cc:71
+#: add_route_dialog.cc:131 bundle_manager.cc:193 region_editor.cc:52
+#: route_group_dialog.cc:70
 msgid "Name:"
 msgstr ""
 
-#: add_route_dialog.cc:156
+#: add_route_dialog.cc:155
 msgid "Group:"
 msgstr ""
 
-#: add_route_dialog.cc:162
+#: add_route_dialog.cc:161
 msgid "Insert:"
 msgstr ""
 
-#: add_route_dialog.cc:223 add_route_dialog.cc:232 add_route_dialog.cc:306
-#: ardour_ui_ed.cc:539 engine_dialog.cc:237 rc_option_editor.cc:1805
-#: rc_option_editor.cc:1807 rc_option_editor.cc:1809 rc_option_editor.cc:1827
-#: rc_option_editor.cc:1829 rc_option_editor.cc:1837 rc_option_editor.cc:1839
-#: rc_option_editor.cc:1857 rc_option_editor.cc:1870 rc_option_editor.cc:1872
-#: rc_option_editor.cc:1874 rc_option_editor.cc:1919 rc_option_editor.cc:1921
-#: rc_option_editor.cc:1923 rc_option_editor.cc:1931 rc_option_editor.cc:1939
-#: rc_option_editor.cc:1941 rc_option_editor.cc:1949
+#: add_route_dialog.cc:171
+msgid "Output Ports:"
+msgstr ""
+
+#: add_route_dialog.cc:176 rc_option_editor.cc:2474
+msgid ""
+"With strict-i/o enabled, Effect Processors will not modify the number of "
+"channels on a track. The number of output channels will always match the "
+"number of input channels."
+msgstr ""
+
+#: add_route_dialog.cc:240 add_route_dialog.cc:351 ardour_ui_ed.cc:636
+#: engine_dialog.cc:244 plugin_pin_dialog.cc:67 rc_option_editor.cc:2397
+#: rc_option_editor.cc:2399 rc_option_editor.cc:2401 rc_option_editor.cc:2419
+#: rc_option_editor.cc:2421 rc_option_editor.cc:2429 rc_option_editor.cc:2432
+#: rc_option_editor.cc:2450 rc_option_editor.cc:2463 rc_option_editor.cc:2472
+#: rc_option_editor.cc:2478 rc_option_editor.cc:2480 rc_option_editor.cc:2525
+#: rc_option_editor.cc:2527 rc_option_editor.cc:2529 rc_option_editor.cc:2537
 msgid "Audio"
 msgstr ""
 
-#: add_route_dialog.cc:224 add_route_dialog.cc:235 add_route_dialog.cc:307
-#: editor_actions.cc:109 engine_dialog.cc:239 missing_file_dialog.cc:56
-#: rc_option_editor.cc:2084 rc_option_editor.cc:2094 rc_option_editor.cc:2102
-#: rc_option_editor.cc:2110 rc_option_editor.cc:2119 rc_option_editor.cc:2127
-#: rc_option_editor.cc:2135 rc_option_editor.cc:2143 rc_option_editor.cc:2152
-#: rc_option_editor.cc:2161 rc_option_editor.cc:2170 rc_option_editor.cc:2178
-#: rc_option_editor.cc:2186 rc_option_editor.cc:2194 rc_option_editor.cc:2217
+#: add_route_dialog.cc:243 add_route_dialog.cc:352 editor_actions.cc:112
+#: engine_dialog.cc:246 missing_file_dialog.cc:60 mixer_ui.cc:1895
+#: plugin_pin_dialog.cc:68 rc_option_editor.cc:2672 rc_option_editor.cc:2674
+#: rc_option_editor.cc:2684 rc_option_editor.cc:2693 rc_option_editor.cc:2701
+#: rc_option_editor.cc:2709 rc_option_editor.cc:2717 rc_option_editor.cc:2790
+#: rc_option_editor.cc:2813
 msgid "MIDI"
 msgstr ""
 
-#: add_route_dialog.cc:225 add_route_dialog.cc:238 add_route_dialog.cc:308
+#: add_route_dialog.cc:246 add_route_dialog.cc:353
 msgid "Audio+MIDI"
 msgstr ""
 
-#: add_route_dialog.cc:226 add_route_dialog.cc:241 add_route_dialog.cc:309
+#: add_route_dialog.cc:250 add_route_dialog.cc:354
 msgid "Bus"
 msgstr ""
 
-#: add_route_dialog.cc:268
+#: add_route_dialog.cc:286
 msgid ""
 "Audio+MIDI tracks are intended for use <b>ONLY</b> with plugins that use "
 "both audio and MIDI input data\n"
@@ -502,60 +587,61 @@ msgid ""
 "track instead."
 msgstr ""
 
-#: add_route_dialog.cc:327 add_route_dialog.cc:346 editor_actions.cc:422
-#: editor_rulers.cc:251 time_axis_view.cc:1374
+#: add_route_dialog.cc:373 add_route_dialog.cc:385 editor_actions.cc:456
+#: editor_rulers.cc:250 time_axis_view.cc:1290
 msgid "Normal"
 msgstr ""
 
-#: add_route_dialog.cc:330 add_route_dialog.cc:348
+#: add_route_dialog.cc:374 add_route_dialog.cc:387
 msgid "Non Layered"
 msgstr ""
 
-#: add_route_dialog.cc:331 add_route_dialog.cc:350
+#: add_route_dialog.cc:375 add_route_dialog.cc:389
 msgid "Tape"
 msgstr ""
 
-#: add_route_dialog.cc:431 monitor_section.cc:290
+#: add_route_dialog.cc:476 monitor_section.cc:273 plugin_pin_dialog.cc:509
+#: plugin_setup_dialog.cc:202
 msgid "Mono"
 msgstr ""
 
-#: add_route_dialog.cc:435
+#: add_route_dialog.cc:480 plugin_pin_dialog.cc:512 plugin_setup_dialog.cc:205
 msgid "Stereo"
 msgstr ""
 
-#: add_route_dialog.cc:459
+#: add_route_dialog.cc:503
 msgid "3 Channel"
 msgstr ""
 
-#: add_route_dialog.cc:463
+#: add_route_dialog.cc:507
 msgid "4 Channel"
 msgstr ""
 
-#: add_route_dialog.cc:467
+#: add_route_dialog.cc:511
 msgid "5 Channel"
 msgstr ""
 
-#: add_route_dialog.cc:471
+#: add_route_dialog.cc:515
 msgid "6 Channel"
 msgstr ""
 
-#: add_route_dialog.cc:475
+#: add_route_dialog.cc:519
 msgid "8 Channel"
 msgstr ""
 
-#: add_route_dialog.cc:479
+#: add_route_dialog.cc:523
 msgid "12 Channel"
 msgstr ""
 
-#: add_route_dialog.cc:483 mixer_strip.cc:1836 mixer_strip.cc:2244
+#: add_route_dialog.cc:527 mixer_strip.cc:2009 mixer_strip.cc:2455
 msgid "Custom"
 msgstr ""
 
-#: add_route_dialog.cc:516 add_route_dialog.cc:532 route_group_menu.cc:81
+#: add_route_dialog.cc:569 add_route_dialog.cc:585 route_group_menu.cc:85
 msgid "New Group..."
 msgstr ""
 
-#: add_route_dialog.cc:520 route_group_menu.cc:85
+#: add_route_dialog.cc:573 route_group_menu.cc:89
 msgid "No Group"
 msgstr ""
 
@@ -563,177 +649,215 @@ msgstr ""
 msgid "Ambiguous File"
 msgstr ""
 
-#: ambiguous_file_dialog.cc:35
+#: ambiguous_file_dialog.cc:37
 msgid ""
 "%1 has found the file <i>%2</i> in the following places:\n"
 "\n"
 msgstr ""
 
-#: ambiguous_file_dialog.cc:44
+#: ambiguous_file_dialog.cc:46
 msgid ""
 "\n"
 "\n"
 "Please select the path that you want to get the file from."
 msgstr ""
 
-#: ambiguous_file_dialog.cc:46 missing_file_dialog.cc:46
+#: ambiguous_file_dialog.cc:48 missing_file_dialog.cc:50
 msgid "Done"
 msgstr ""
 
-#: analysis_window.cc:46
+#: analysis_window.cc:45
 msgid "Signal source"
 msgstr ""
 
-#: analysis_window.cc:47
+#: analysis_window.cc:46
 msgid "Selected ranges"
 msgstr ""
 
-#: analysis_window.cc:48
+#: analysis_window.cc:47
 msgid "Selected regions"
 msgstr ""
 
-#: analysis_window.cc:50
-msgid "Display model"
-msgstr ""
-
-#: analysis_window.cc:51
-msgid "Composite graphs for each track"
+#: analysis_window.cc:48
+msgid "Show frequency power range"
 msgstr ""
 
-#: analysis_window.cc:52
-msgid "Composite graph of all tracks"
+#: analysis_window.cc:49
+msgid "Fit dB range"
 msgstr ""
 
-#: analysis_window.cc:54
-msgid "Show frequency power range"
+#: analysis_window.cc:50
+msgid "Proportional Spectrum, -18dB"
 msgstr ""
 
-#: analysis_window.cc:55
-msgid "Normalize values"
-msgstr "Normalise values"
-
-#: analysis_window.cc:59
+#: analysis_window.cc:53
 msgid "FFT analysis window"
 msgstr ""
 
-#: analysis_window.cc:60 editor.cc:1823
+#: analysis_window.cc:54 editor.cc:1953
 msgid "Spectral Analysis"
 msgstr ""
 
-#: analysis_window.cc:67 editor_actions.cc:142 export_channel_selector.cc:557
-#: session_metadata_dialog.cc:667
+#: analysis_window.cc:61 editor_actions.cc:145 session_metadata_dialog.cc:670
 msgid "Track"
 msgstr ""
 
-#: analysis_window.cc:68 editor_actions.cc:648 mixer_ui.cc:131
-#: mixer_ui.cc:1854
+#: analysis_window.cc:62 ardour_ui_ed.cc:254 ardour_ui_ed.cc:255
+#: ardour_ui_ed.cc:256 editor_actions.cc:689 mixer_ui.cc:151 mixer_ui.cc:2134
 msgid "Show"
 msgstr ""
 
-#: analysis_window.cc:135
+#: analysis_window.cc:107
 msgid "Re-analyze data"
 msgstr "Re-analyse data"
 
-#: ardour_button.cc:887
+#: ardour_button.cc:876
 msgid "button cannot watch state of non-existing Controllable\n"
 msgstr ""
 
-#: ardour_button.cc:1155
+#: ardour_button.cc:1144
 msgid "ABCDEFGHIJLKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
 msgstr ""
 
-#: ardour_ui.cc:164
+#: ardour_ui.cc:198
 msgid ""
 "%1 %2.x has discovered configuration files from %1 %3.x.\n"
 "\n"
-"Would you like to copy the relevant files before starting to use the "
-"program?\n"
+"Would you like these files to be copied and used for %1 %2.x?\n"
 "\n"
 "(This will require you to restart %1.)"
 msgstr ""
 
-#: ardour_ui.cc:211 editor_actions.cc:642 region_editor.cc:51
+#: ardour_ui.cc:283 editor_actions.cc:683 region_editor.cc:53
 msgid "Audition"
 msgstr ""
 
-#: ardour_ui.cc:212 editor_actions.cc:136 mixer_strip.cc:2016
-#: rc_option_editor.cc:1959 route_time_axis.cc:252 route_time_axis.cc:2711
+#: ardour_ui.cc:284 editor_actions.cc:139 mixer_strip.cc:2205
+#: monitor_section.cc:329 rc_option_editor.cc:2547 route_time_axis.cc:263
+#: route_time_axis.cc:2740 vca_master_strip.cc:212 vca_time_axis.cc:237
 msgid "Solo"
 msgstr ""
 
-#: ardour_ui.cc:213 rc_option_editor.cc:741
+#: ardour_ui.cc:285 rc_option_editor.cc:1357
 msgid "Feedback"
 msgstr ""
 
-#: ardour_ui.cc:219 speaker_dialog.cc:36
+#: ardour_ui.cc:296 speaker_dialog.cc:36
 msgid "Speaker Configuration"
 msgstr ""
 
-#: ardour_ui.cc:220 keyeditor.cc:53
-msgid "Key Bindings"
-msgstr ""
-
-#: ardour_ui.cc:221
-msgid "Preferences"
-msgstr ""
-
-#: ardour_ui.cc:222 ardour_ui.cc:229
+#: ardour_ui.cc:297
 msgid "Add Tracks/Busses"
 msgstr ""
 
-#: ardour_ui.cc:223
+#: ardour_ui.cc:298
 msgid "About"
 msgstr ""
 
-#: ardour_ui.cc:224 location_ui.cc:1141 session_option_editor.cc:189
-#: session_option_editor.cc:195 session_option_editor.cc:202
-msgid "Locations"
+#: ardour_ui.cc:299 location_ui.cc:1167
+msgid "Ranges|Locations"
 msgstr ""
 
-#: ardour_ui.cc:225 route_params_ui.cc:59 route_params_ui.cc:630
+#: ardour_ui.cc:300 route_params_ui.cc:59 route_params_ui.cc:620
 msgid "Tracks and Busses"
 msgstr ""
 
-#: ardour_ui.cc:226 engine_dialog.cc:70
+#: ardour_ui.cc:301 engine_dialog.cc:73
 msgid "Audio/MIDI Setup"
 msgstr ""
 
-#: ardour_ui.cc:227
+#: ardour_ui.cc:302
 msgid "Video Export Dialog"
 msgstr "Video Export Dialogue"
 
-#: ardour_ui.cc:228
+#: ardour_ui.cc:303 lua_script_manager.cc:30
+msgid "Script Manager"
+msgstr ""
+
+#: ardour_ui.cc:304
 msgid "Properties"
 msgstr ""
 
-#: ardour_ui.cc:230 bundle_manager.cc:264
+#: ardour_ui.cc:305
+msgid "Add Video"
+msgstr ""
+
+#: ardour_ui.cc:306 bundle_manager.cc:264
 msgid "Bundle Manager"
 msgstr ""
 
-#: ardour_ui.cc:231 big_clock_window.cc:37
+#: ardour_ui.cc:307 big_clock_window.cc:37
 msgid "Big Clock"
 msgstr ""
 
-#: ardour_ui.cc:232
+#: ardour_ui.cc:308
 msgid "Audio Connections"
 msgstr ""
 
-#: ardour_ui.cc:233
+#: ardour_ui.cc:309
 msgid "MIDI Connections"
 msgstr ""
 
-#: ardour_ui.cc:242
+#: ardour_ui.cc:310
+msgid "Bindings Editor"
+msgstr ""
+
+#: ardour_ui.cc:321 editor.cc:1288
+msgid "Window|Editor"
+msgstr ""
+
+#: ardour_ui.cc:322 mixer_ui.cc:2210 mixer_ui.cc:2216
+msgid "Window|Mixer"
+msgstr ""
+
+#: ardour_ui.cc:323
+msgid "Window|Preferences"
+msgstr ""
+
+#: ardour_ui.cc:330
 msgid "Your configuration files were copied. You can now restart %1."
 msgstr ""
 
-#: ardour_ui.cc:481
+#: ardour_ui.cc:509
+msgid "Pre-Release Warning"
+msgstr ""
+
+#: ardour_ui.cc:513
+msgid ""
+"<b>Welcome to this pre-release build of %1 %2</b>\n"
+"\n"
+"There are still several issues and bugs to be worked on,\n"
+"as well as general workflow improvements, before this can be considered\n"
+"release software. So, a few guidelines:\n"
+"\n"
+"1) Please do <b>NOT</b> use this software with the expectation that it is "
+"stable or reliable\n"
+"   though it may be so, depending on your workflow.\n"
+"2) Please wait for a helpful writeup of new features.\n"
+"3) <b>Please do NOT use the forums at ardour.org to report issues</b>.\n"
+"4) Please <b>DO</b> use the bugtracker at http://tracker.ardour.org/ to "
+"report issues\n"
+"   making sure to note the product version number as 5.0-pre.\n"
+"5) Please <b>DO</b> use the ardour-users mailing list to discuss ideas and "
+"pass on comments.\n"
+"6) Please <b>DO</b> join us on IRC for real time discussions about %1 %2. "
+"You\n"
+"   can get there directly from within the program via the Help->Chat menu "
+"option.\n"
+"\n"
+"Full information on all the above can be found on the support page at\n"
+"\n"
+"                http://ardour.org/support\n"
+msgstr ""
+
+#: ardour_ui.cc:613
 msgid ""
 "The audio backend was shutdown because:\n"
 "\n"
 "%1"
 msgstr ""
 
-#: ardour_ui.cc:483
+#: ardour_ui.cc:615
 msgid ""
 "The audio backend has either been shutdown or it\n"
 "disconnected %1 because %1\n"
@@ -741,45 +865,45 @@ msgid ""
 "the audio backend and save the session."
 msgstr ""
 
-#: ardour_ui.cc:507
+#: ardour_ui.cc:639
 msgid ""
 "Audio Unit Plugin Scan Failed. Automatic AU scanning has been disabled. "
 "Please see the log window for further details."
 msgstr ""
 
-#: ardour_ui.cc:508
+#: ardour_ui.cc:640
 msgid "Audio Unit Plugin Scan Failed:"
 msgstr ""
 
-#: ardour_ui.cc:827
+#: ardour_ui.cc:1008
 msgid "NSM server did not announce itself"
 msgstr ""
 
-#: ardour_ui.cc:840
+#: ardour_ui.cc:1021
 msgid "NSM: no client ID provided"
 msgstr ""
 
-#: ardour_ui.cc:847
+#: ardour_ui.cc:1028
 msgid "NSM: no session created"
 msgstr ""
 
-#: ardour_ui.cc:870
+#: ardour_ui.cc:1051
 msgid "NSM: initialization failed"
 msgstr ""
 
-#: ardour_ui.cc:900
+#: ardour_ui.cc:1083
 msgid "Free/Demo Version Warning"
 msgstr ""
 
-#: ardour_ui.cc:902
+#: ardour_ui.cc:1085
 msgid "Subscribe and support development of %1"
 msgstr ""
 
-#: ardour_ui.cc:903
+#: ardour_ui.cc:1086
 msgid "Don't warn me about this again"
 msgstr ""
 
-#: ardour_ui.cc:905
+#: ardour_ui.cc:1088
 msgid ""
 "<span weight=\"bold\" size=\"large\">%1</span>\n"
 "\n"
@@ -790,39 +914,39 @@ msgid ""
 "%4"
 msgstr ""
 
-#: ardour_ui.cc:906
+#: ardour_ui.cc:1089
 msgid "This is a free/demo version of %1"
 msgstr ""
 
-#: ardour_ui.cc:907
+#: ardour_ui.cc:1090
 msgid "It will not restore OR save any plugin settings"
 msgstr ""
 
-#: ardour_ui.cc:908
+#: ardour_ui.cc:1091
 msgid ""
 "If you load an existing session with plugin settings\n"
 "they will not be used and will be lost."
 msgstr ""
 
-#: ardour_ui.cc:910 plugin_ui.cc:569
+#: ardour_ui.cc:1093 plugin_ui.cc:579
 msgid ""
 "To get full access to updates without this limitation\n"
 "consider becoming a subscriber for a low cost every month."
 msgstr ""
 
-#: ardour_ui.cc:920
+#: ardour_ui.cc:1103
 msgid "Quit now"
 msgstr ""
 
-#: ardour_ui.cc:921
+#: ardour_ui.cc:1104
 msgid "Continue using %1"
 msgstr ""
 
-#: ardour_ui.cc:954 startup.cc:345
+#: ardour_ui.cc:1135 startup.cc:349
 msgid "%1 is ready for use"
 msgstr ""
 
-#: ardour_ui.cc:996
+#: ardour_ui.cc:1185
 msgid ""
 "WARNING: Your system has a limit for maximum amount of locked memory. This "
 "might cause %1 to run out of memory before your system runs out of memory. \n"
@@ -831,23 +955,23 @@ msgid ""
 "controlled by %2"
 msgstr ""
 
-#: ardour_ui.cc:1013
+#: ardour_ui.cc:1202
 msgid "Do not show this window again"
 msgstr ""
 
-#: ardour_ui.cc:1057
+#: ardour_ui.cc:1245
 msgid "Don't quit"
 msgstr ""
 
-#: ardour_ui.cc:1058
+#: ardour_ui.cc:1246
 msgid "Just quit"
 msgstr ""
 
-#: ardour_ui.cc:1059
+#: ardour_ui.cc:1247 ardour_ui.cc:5362
 msgid "Save and quit"
 msgstr ""
 
-#: ardour_ui.cc:1069
+#: ardour_ui.cc:1257
 msgid ""
 "%1 was unable to save your session.\n"
 "\n"
@@ -856,11 +980,11 @@ msgid ""
 "\"Just quit\" option."
 msgstr ""
 
-#: ardour_ui.cc:1119
+#: ardour_ui.cc:1307
 msgid "Unsaved Session"
 msgstr ""
 
-#: ardour_ui.cc:1140
+#: ardour_ui.cc:1328
 msgid ""
 "The session \"%1\"\n"
 "has not been saved.\n"
@@ -871,7 +995,7 @@ msgid ""
 "What do you want to do?"
 msgstr ""
 
-#: ardour_ui.cc:1143
+#: ardour_ui.cc:1331
 msgid ""
 "The snapshot \"%1\"\n"
 "has not been saved.\n"
@@ -882,74 +1006,107 @@ msgid ""
 "What do you want to do?"
 msgstr ""
 
-#: ardour_ui.cc:1157
+#: ardour_ui.cc:1345
 msgid "Prompter"
 msgstr ""
 
-#: ardour_ui.cc:1269 ardour_ui.cc:1277
+#: ardour_ui.cc:1459 ardour_ui.cc:1467
 msgid "Audio: <span foreground=\"red\">none</span>"
 msgstr ""
 
-#: ardour_ui.cc:1281
+#: ardour_ui.cc:1471
 #, c-format
 msgid "Audio: <span foreground=\"green\">%.1f kHz / %4.1f ms</span>"
 msgstr ""
 
-#: ardour_ui.cc:1285
+#: ardour_ui.cc:1475
 #, c-format
 msgid "Audio: <span foreground=\"green\">%<PRId64> kHz / %4.1f ms</span>"
 msgstr ""
 
-#: ardour_ui.cc:1303 export_video_dialog.cc:80
+#: ardour_ui.cc:1493 export_report.cc:108 export_report.cc:323
+#: export_video_dialog.cc:76
 msgid "File:"
 msgstr ""
 
-#: ardour_ui.cc:1307
+#: ardour_ui.cc:1497
 msgid "BWF"
 msgstr ""
 
-#: ardour_ui.cc:1310
+#: ardour_ui.cc:1500
 msgid "WAV"
 msgstr ""
 
-#: ardour_ui.cc:1313
+#: ardour_ui.cc:1503
 msgid "WAV64"
 msgstr ""
 
-#: ardour_ui.cc:1316 session_option_editor.cc:185
+#: ardour_ui.cc:1506 session_option_editor.cc:202
 msgid "CAF"
 msgstr ""
 
-#: ardour_ui.cc:1319
+#: ardour_ui.cc:1509
 msgid "AIFF"
 msgstr ""
 
-#: ardour_ui.cc:1322
+#: ardour_ui.cc:1512
 msgid "iXML"
 msgstr ""
 
-#: ardour_ui.cc:1325
+#: ardour_ui.cc:1515 session_option_editor.cc:203
 msgid "RF64"
 msgstr ""
 
-#: ardour_ui.cc:1333
+#: ardour_ui.cc:1518
+msgid "RF64/WAV"
+msgstr ""
+
+#: ardour_ui.cc:1521
+msgid "MBWF"
+msgstr ""
+
+#: ardour_ui.cc:1529
 msgid "32-float"
 msgstr ""
 
-#: ardour_ui.cc:1336
+#: ardour_ui.cc:1532
 msgid "24-int"
 msgstr ""
 
-#: ardour_ui.cc:1339
+#: ardour_ui.cc:1535
 msgid "16-int"
 msgstr ""
 
-#: ardour_ui.cc:1358
+#: ardour_ui.cc:1556
+#, c-format
+msgid "X: <span foreground=\"%s\">>10K</span>"
+msgstr ""
+
+#: ardour_ui.cc:1558
+#, c-format
+msgid "X: <span foreground=\"%s\">%u</span>"
+msgstr ""
+
+#: ardour_ui.cc:1561
+#, c-format
+msgid "X: <span foreground=\"%s\">?</span>"
+msgstr ""
+
+#: ardour_ui.cc:1564
+msgid "Audio dropouts. Shift+click to reset"
+msgstr ""
+
+#: ardour_ui.cc:1577
 #, c-format
 msgid "DSP: <span foreground=\"%s\">%5.1f%%</span>"
 msgstr ""
 
-#: ardour_ui.cc:1377
+#: ardour_ui.cc:1587
+#, c-format
+msgid "PkBld: <span foreground=\"%s\">%d</span>"
+msgstr ""
+
+#: ardour_ui.cc:1609
 #, c-format
 msgid ""
 "Buffers: <span foreground=\"green\">p:</span><span foreground=\"%s\">"
@@ -957,215 +1114,263 @@ msgid ""
 "\">%<PRIu32>%%</span>"
 msgstr ""
 
-#: ardour_ui.cc:1418
+#: ardour_ui.cc:1650
 msgid "Disk: <span foreground=\"green\">Unknown</span>"
 msgstr ""
 
-#: ardour_ui.cc:1420
+#: ardour_ui.cc:1652
 msgid "Disk: <span foreground=\"green\">24hrs+</span>"
 msgstr ""
 
-#: ardour_ui.cc:1438
+#: ardour_ui.cc:1670
 msgid "Disk: <span foreground=\"green\">>24 hrs</span>"
 msgstr ""
 
-#: ardour_ui.cc:1449
+#: ardour_ui.cc:1681
 #, c-format
 msgid "Disk: <span foreground=\"%s\">%02dh:%02dm:%02ds</span>"
 msgstr ""
 
-#: ardour_ui.cc:1475
+#: ardour_ui.cc:1707
 #, c-format
 msgid "Timecode|TC: <span foreground=\"%s\">%s</span>"
 msgstr ""
 
-#: ardour_ui.cc:1596 ardour_ui.cc:1605 session_dialog.cc:318
-#: session_dialog.cc:323
-msgid "Recent Sessions"
-msgstr ""
-
-#: ardour_ui.cc:1684
+#: ardour_ui.cc:1789
 msgid ""
 "%1 is not connected to any audio backend.\n"
 "You cannot open or close sessions in this condition"
 msgstr ""
 
-#: ardour_ui.cc:1708
+#: ardour_ui.cc:1807
 msgid "Open Session"
 msgstr ""
 
-#: ardour_ui.cc:1733 session_dialog.cc:349 session_import_dialog.cc:170
-#: session_metadata_dialog.cc:858
+#: ardour_ui.cc:1831 session_dialog.cc:410 session_import_dialog.cc:170
+#: session_metadata_dialog.cc:861
 msgid "%1 sessions"
 msgstr ""
 
-#: ardour_ui.cc:1770
+#: ardour_ui.cc:1879 ardour_ui.cc:1916
 msgid "You cannot add a track without a session already loaded."
 msgstr ""
 
-#: ardour_ui.cc:1778
+#: ardour_ui.cc:1887
 msgid "could not create %1 new mixed track"
 msgid_plural "could not create %1 new mixed tracks"
 msgstr[0] ""
 msgstr[1] ""
 
-#: ardour_ui.cc:1784 ardour_ui.cc:1845
-msgid ""
-"There are insufficient ports available\n"
-"to create a new track or bus.\n"
-"You should save %1, exit and\n"
-"restart with more ports."
-msgstr ""
+#: ardour_ui.cc:1924
+msgid "could not create %1 new Midi Bus"
+msgid_plural "could not create %1 new Midi Busses"
+msgstr[0] ""
+msgstr[1] ""
 
-#: ardour_ui.cc:1819
+#: ardour_ui.cc:1977
 msgid "You cannot add a track or bus without a session already loaded."
 msgstr ""
 
-#: ardour_ui.cc:1828
+#: ardour_ui.cc:1986
 msgid "could not create %1 new audio track"
 msgid_plural "could not create %1 new audio tracks"
 msgstr[0] ""
 msgstr[1] ""
 
-#: ardour_ui.cc:1837
+#: ardour_ui.cc:1995
 msgid "could not create %1 new audio bus"
 msgid_plural "could not create %1 new audio busses"
 msgstr[0] ""
 msgstr[1] ""
 
-#: ardour_ui.cc:1990
+#: ardour_ui.cc:2020
 msgid ""
-"Please create one or more tracks before trying to record.\n"
-"You can do this with the \"Add Track or Bus\" option in the Session menu."
-msgstr ""
-
-#: ardour_ui.cc:2376
-msgid "Save as..."
+"There are insufficient ports available\n"
+"to create a new track or bus.\n"
+"You should save %1, exit and\n"
+"restart with more ports."
 msgstr ""
 
-#: ardour_ui.cc:2377 ardour_ui.cc:2456
-msgid "New session name"
+#: ardour_ui.cc:2164
+msgid ""
+"Please create one or more tracks before trying to record.\n"
+"You can do this with the \"Add Track or Bus\" option in the Session menu."
 msgstr ""
 
-#: ardour_ui.cc:2379
-msgid "Take Snapshot"
+#: ardour_ui.cc:2565
+#, c-format
+msgid "Copied %<PRId64> of %<PRId64>"
 msgstr ""
 
-#: ardour_ui.cc:2380
-msgid "Name of new snapshot"
+#: ardour_ui.cc:2619 save_as_dialog.cc:33
+msgid "Save As"
+msgstr ""
+
+#: ardour_ui.cc:2647
+msgid "Save As failed: %1"
 msgstr ""
 
-#: ardour_ui.cc:2405
+#: ardour_ui.cc:2684
 msgid ""
 "To ensure compatibility with various systems\n"
 "snapshot names may not contain a '%1' character"
 msgstr ""
 
-#: ardour_ui.cc:2417
+#: ardour_ui.cc:2698
 msgid "Confirm Snapshot Overwrite"
 msgstr ""
 
-#: ardour_ui.cc:2418
-msgid "A snapshot already exists with that name.  Do you want to overwrite it?"
+#: ardour_ui.cc:2699
+msgid "A snapshot already exists with that name. Do you want to overwrite it?"
 msgstr ""
 
-#: ardour_ui.cc:2421 utils_videotl.cc:74
-msgid "Overwrite"
+#: ardour_ui.cc:2724
+msgid "Snapshot and switch"
+msgstr ""
+
+#: ardour_ui.cc:2725 ardour_ui.cc:2776
+msgid "New session name"
+msgstr ""
+
+#: ardour_ui.cc:2727
+msgid "Take Snapshot"
 msgstr ""
 
-#: ardour_ui.cc:2455
+#: ardour_ui.cc:2728
+msgid "Name of new snapshot"
+msgstr ""
+
+#: ardour_ui.cc:2775
 msgid "Rename Session"
 msgstr ""
 
-#: ardour_ui.cc:2470 ardour_ui.cc:2884 ardour_ui.cc:2922
+#: ardour_ui.cc:2790 ardour_ui.cc:3267 ardour_ui.cc:3305
 msgid ""
 "To ensure compatibility with various systems\n"
 "session names may not contain a '%1' character"
 msgstr ""
 
-#: ardour_ui.cc:2478
+#: ardour_ui.cc:2798
 msgid ""
 "That name is already in use by another directory/folder. Please try again."
 msgstr ""
 
-#: ardour_ui.cc:2487
+#: ardour_ui.cc:2807
 msgid ""
 "Renaming this session failed.\n"
 "Things could be seriously messed up at this point"
 msgstr ""
 
-#: ardour_ui.cc:2602
+#: ardour_ui.cc:2923 route_ui.cc:1867
+msgid "Confirm Template Overwrite"
+msgstr ""
+
+#: ardour_ui.cc:2924 route_ui.cc:1868
+msgid "A template already exists with that name. Do you want to overwrite it?"
+msgstr ""
+
+#: ardour_ui.cc:2948
 msgid "Save Template"
 msgstr ""
 
-#: ardour_ui.cc:2603
+#: ardour_ui.cc:2949
 msgid "Name for template:"
 msgstr ""
 
-#: ardour_ui.cc:2604
+#: ardour_ui.cc:2950
 msgid "-template"
 msgstr ""
 
-#: ardour_ui.cc:2641
+#: ardour_ui.cc:2987
 msgid ""
 "This session\n"
 "%1\n"
 "already exists. Do you want to open it?"
 msgstr ""
 
-#: ardour_ui.cc:2651
+#: ardour_ui.cc:2997
 msgid "Open Existing Session"
 msgstr ""
 
-#: ardour_ui.cc:2912
+#: ardour_ui.cc:3295
 msgid "There is no existing session at \"%1\""
 msgstr ""
 
-#: ardour_ui.cc:3004
+#: ardour_ui.cc:3391
 msgid "Please wait while %1 loads your session"
 msgstr ""
 
-#: ardour_ui.cc:3019
+#: ardour_ui.cc:3406
 msgid "Port Registration Error"
 msgstr ""
 
-#: ardour_ui.cc:3020
+#: ardour_ui.cc:3407
 msgid "Click the Close button to try again."
 msgstr ""
 
-#: ardour_ui.cc:3041
-msgid "Session \"%1 (snapshot %2)\" did not load successfully"
+#: ardour_ui.cc:3426
+msgid "Session \"%1 (snapshot %2)\" did not load successfully: %3"
 msgstr ""
 
-#: ardour_ui.cc:3047
+#: ardour_ui.cc:3432 ardour_ui.cc:3453 ardour_ui.cc:3548 ardour_ui.cc:3557
 msgid "Loading Error"
 msgstr ""
 
-#: ardour_ui.cc:3066
+#: ardour_ui.cc:3447
+msgid "Session \"%1 (snapshot %2)\" did not load successfully"
+msgstr ""
+
+#: ardour_ui.cc:3475
 msgid ""
 "This session has been opened in read-only mode.\n"
 "\n"
 "You will not be able to record or save."
 msgstr ""
 
-#: ardour_ui.cc:3071
+#: ardour_ui.cc:3480
 msgid "Read-only Session"
 msgstr ""
 
-#: ardour_ui.cc:3137
+#: ardour_ui.cc:3547
+msgid "Could not create session in \"%1\": %2"
+msgstr ""
+
+#: ardour_ui.cc:3556
 msgid "Could not create session in \"%1\""
 msgstr ""
 
-#: ardour_ui.cc:3286
+#: ardour_ui.cc:3601
+msgid ""
+"<b>Just ask and wait for an answer.\n"
+"It may take from minutes to hours.</b>"
+msgstr ""
+
+#: ardour_ui.cc:3603
+msgid "About the Chat"
+msgstr ""
+
+#: ardour_ui.cc:3604
+msgid ""
+"When you're inside the chat just ask your question and wait for an answer. "
+"The chat is occupied by real people with real lives so many of them are "
+"passively online and might not read your question before minutes or hours "
+"later.\n"
+"So please be patient and wait for an answer.\n"
+"\n"
+"You should just leave the chat window open and check back regularly until "
+"someone has answered your question."
+msgstr ""
+
+#: ardour_ui.cc:3723
 msgid "No files were ready for clean-up"
 msgstr ""
 
-#: ardour_ui.cc:3290 ardour_ui.cc:3300 ardour_ui.cc:3433 ardour_ui.cc:3440
-#: ardour_ui_ed.cc:103
+#: ardour_ui.cc:3727 ardour_ui.cc:3737 ardour_ui.cc:3870 ardour_ui.cc:3877
+#: ardour_ui_ed.cc:129
 msgid "Clean-up"
 msgstr ""
 
-#: ardour_ui.cc:3291
+#: ardour_ui.cc:3728
 msgid ""
 "If this seems suprising, \n"
 "check for any existing snapshots.\n"
@@ -1173,19 +1378,19 @@ msgid ""
 "require some unused files to continue to exist."
 msgstr ""
 
-#: ardour_ui.cc:3350
+#: ardour_ui.cc:3787
 msgid "kilo"
 msgstr ""
 
-#: ardour_ui.cc:3353
+#: ardour_ui.cc:3790
 msgid "mega"
 msgstr ""
 
-#: ardour_ui.cc:3356
+#: ardour_ui.cc:3793
 msgid "giga"
 msgstr ""
 
-#: ardour_ui.cc:3361
+#: ardour_ui.cc:3798
 msgid ""
 "The following file was deleted from %2,\n"
 "releasing %3 %4bytes of disk space"
@@ -1195,7 +1400,7 @@ msgid_plural ""
 msgstr[0] ""
 msgstr[1] ""
 
-#: ardour_ui.cc:3368
+#: ardour_ui.cc:3805
 msgid ""
 "The following file was not in use and \n"
 "has been moved to: %2\n"
@@ -1217,90 +1422,126 @@ msgid_plural ""
 msgstr[0] ""
 msgstr[1] ""
 
-#: ardour_ui.cc:3428
+#: ardour_ui.cc:3865
 msgid "Are you sure you want to clean-up?"
 msgstr ""
 
-#: ardour_ui.cc:3435
+#: ardour_ui.cc:3872
 msgid ""
 "Clean-up is a destructive operation.\n"
 "ALL undo/redo information will be lost if you clean-up.\n"
 "Clean-up will move all unused files to a \"dead\" location."
 msgstr ""
 
-#: ardour_ui.cc:3443
+#: ardour_ui.cc:3880
 msgid "CleanupDialog"
 msgstr ""
 
-#: ardour_ui.cc:3473
+#: ardour_ui.cc:3910
 msgid "Cleaned Files"
 msgstr ""
 
-#: ardour_ui.cc:3490
+#: ardour_ui.cc:3927
 msgid "deleted file"
 msgstr ""
 
-#: ardour_ui.cc:3635
+#: ardour_ui.cc:4133
+msgid "Cannot read session script '%1': %2"
+msgstr ""
+
+#: ardour_ui.cc:4142 luainstance.cc:1087
+msgid "Set Script Parameters"
+msgstr ""
+
+#: ardour_ui.cc:4153
+msgid "Session script '%1' instantiation failed: %2"
+msgstr ""
+
+#: ardour_ui.cc:4157
+msgid "Loading Session script '%1' failed: %2"
+msgstr ""
+
+#: ardour_ui.cc:4170
+msgid "There are no active Lua session scripts present in this session."
+msgstr ""
+
+#: ardour_ui.cc:4187
+msgid "Session script '%1' removal failed: %2"
+msgstr ""
+
+#: ardour_ui.cc:4197
 msgid "Video-Server was not launched by %1. The request to stop it is ignored."
 msgstr ""
 
-#: ardour_ui.cc:3639
+#: ardour_ui.cc:4201
 msgid "Stop Video-Server"
 msgstr ""
 
-#: ardour_ui.cc:3640
+#: ardour_ui.cc:4202
 msgid "Do you really want to stop the Video Server?"
 msgstr ""
 
-#: ardour_ui.cc:3643
+#: ardour_ui.cc:4205
 msgid "Yes, Stop It"
 msgstr ""
 
-#: ardour_ui.cc:3669
+#: ardour_ui.cc:4231
 msgid "The Video Server is already started."
 msgstr ""
 
-#: ardour_ui.cc:3671
+#: ardour_ui.cc:4233
 msgid ""
 "An external Video Server is configured and can be reached. Not starting a "
 "new instance."
 msgstr ""
 
-#: ardour_ui.cc:3679 ardour_ui.cc:3784
+#: ardour_ui.cc:4241 ardour_ui.cc:4346
 msgid ""
 "Could not connect to the Video Server. Start it or configure its access URL "
 "in Preferences."
 msgstr ""
 
-#: ardour_ui.cc:3709
+#: ardour_ui.cc:4271
 msgid "Specified docroot is not an existing directory."
 msgstr ""
 
-#: ardour_ui.cc:3715 ardour_ui.cc:3721
+#: ardour_ui.cc:4277 ardour_ui.cc:4283
 msgid "Given Video Server is not an executable file."
 msgstr ""
 
-#: ardour_ui.cc:3755
+#: ardour_ui.cc:4317
 msgid "Cannot launch the video-server"
 msgstr ""
 
-#: ardour_ui.cc:3765
+#: ardour_ui.cc:4327
 msgid "Video-server was started but does not respond to requests..."
 msgstr ""
 
-#: ardour_ui.cc:3810 editor_audio_import.cc:641
+#: ardour_ui.cc:4372 editor_audio_import.cc:647
 msgid "could not open %1"
 msgstr ""
 
-#: ardour_ui.cc:3814
+#: ardour_ui.cc:4376
 msgid "no video-file selected"
 msgstr ""
 
-#: ardour_ui.cc:4012
+#: ardour_ui.cc:4472
+msgid "No LTC detected, video will not be aligned."
+msgstr ""
+
+#: ardour_ui.cc:4478
+msgid "Align video-start to %1 [samples]"
+msgstr ""
+
+#: ardour_ui.cc:4654
+msgid "xrun"
+msgstr ""
+
+#: ardour_ui.cc:4663
 msgid "Recording was stopped because your system could not keep up."
 msgstr ""
 
-#: ardour_ui.cc:4041
+#: ardour_ui.cc:4692
 msgid ""
 "The disk system on your computer\n"
 "was not able to keep up with %1.\n"
@@ -1309,23 +1550,23 @@ msgid ""
 "quickly enough to keep up with recording.\n"
 msgstr ""
 
-#: ardour_ui.cc:4111
+#: ardour_ui.cc:4765
 msgid "Scanning for plugins"
 msgstr ""
 
-#: ardour_ui.cc:4113
+#: ardour_ui.cc:4767
 msgid "Cancel plugin scan"
 msgstr ""
 
-#: ardour_ui.cc:4122
+#: ardour_ui.cc:4776
 msgid "Stop Timeout"
 msgstr ""
 
-#: ardour_ui.cc:4129
+#: ardour_ui.cc:4783
 msgid "Scan Timeout"
 msgstr ""
 
-#: ardour_ui.cc:4172
+#: ardour_ui.cc:4827
 msgid ""
 "The disk system on your computer\n"
 "was not able to keep up with %1.\n"
@@ -1334,11 +1575,11 @@ msgid ""
 "quickly enough to keep up with playback.\n"
 msgstr ""
 
-#: ardour_ui.cc:4212
+#: ardour_ui.cc:4862
 msgid "Crash Recovery"
 msgstr ""
 
-#: ardour_ui.cc:4213
+#: ardour_ui.cc:4863
 msgid ""
 "This session appears to have been in the\n"
 "middle of recording when %1 or\n"
@@ -1349,42 +1590,43 @@ msgid ""
 "what you would like to do.\n"
 msgstr ""
 
-#: ardour_ui.cc:4225
+#: ardour_ui.cc:4875
 msgid "Ignore crash data"
 msgstr ""
 
-#: ardour_ui.cc:4226
+#: ardour_ui.cc:4876
 msgid "Recover from crash"
 msgstr ""
 
-#: ardour_ui.cc:4246
+#: ardour_ui.cc:4896
 msgid "Sample Rate Mismatch"
 msgstr ""
 
-#: ardour_ui.cc:4247
+#: ardour_ui.cc:4897
 msgid ""
 "This session was created with a sample rate of %1 Hz, but\n"
 "%2 is currently running at %3 Hz.  If you load this session,\n"
 "audio may be played at the wrong sample rate.\n"
 msgstr ""
 
-#: ardour_ui.cc:4256
+#: ardour_ui.cc:4906
 msgid "Do not load session"
 msgstr ""
 
-#: ardour_ui.cc:4257
+#: ardour_ui.cc:4907
 msgid "Load session anyway"
 msgstr ""
 
-#: ardour_ui.cc:4284
-msgid "Could not disconnect from Audio/MIDI engine"
-msgstr ""
-
-#: ardour_ui.cc:4301 ardour_ui.cc:4304
-msgid "Could not reconnect to the Audio/MIDI engine"
+#: ardour_ui.cc:4927
+msgid ""
+"This session was created with a sample rate of %1 Hz, but\n"
+"%2 is currently running at %3 Hz.\n"
+"Audio will be recorded and played at the wrong sample rate.\n"
+"Re-Configure the Audio Engine in\n"
+"Menu > Window > Audio/Midi Setup"
 msgstr ""
 
-#: ardour_ui.cc:4588
+#: ardour_ui.cc:5209
 msgid ""
 "%4This is a session from an older version of %3%5\n"
 "\n"
@@ -1396,88 +1638,113 @@ msgid ""
 "\n"
 "%6%2%7\n"
 "\n"
-"From now on, use the -2000 version with older versions of %3"
+"From now on, use the backup copy with older versions of %3"
 msgstr ""
 
-#: ardour_ui2.cc:73
-msgid "UI: cannot setup editor"
+#: ardour_ui.cc:5331
+msgid "This is a free/demo copy of %1. It has just switched to silent mode."
 msgstr ""
 
-#: ardour_ui2.cc:78
-msgid "UI: cannot setup mixer"
+#: ardour_ui.cc:5337
+msgid "%1 is now silent"
 msgstr ""
 
-#: ardour_ui2.cc:83
-msgid "UI: cannot setup meterbridge"
+#: ardour_ui.cc:5339
+msgid ""
+"Please consider paying for a copy of %1 - you can pay whatever you want."
+msgstr ""
+
+#: ardour_ui.cc:5340
+msgid "Better yet become a subscriber - subscriptions start at US$1 per month."
+msgstr ""
+
+#: ardour_ui.cc:5341
+msgid "Pay for a copy (via the web)"
+msgstr ""
+
+#: ardour_ui.cc:5342
+msgid "Become a subscriber (via the web)"
+msgstr ""
+
+#: ardour_ui.cc:5361
+msgid "Remain silent"
+msgstr ""
+
+#: ardour_ui.cc:5363
+msgid "Give me more time"
 msgstr ""
 
-#: ardour_ui2.cc:128
+#: ardour_ui.cc:5656
+msgid "Global keybindings are missing"
+msgstr ""
+
+#: ardour_ui2.cc:79
 msgid "Play from playhead"
 msgstr ""
 
-#: ardour_ui2.cc:129
+#: ardour_ui2.cc:80
 msgid "Stop playback"
 msgstr ""
 
-#: ardour_ui2.cc:130
+#: ardour_ui2.cc:81
 msgid "Toggle record"
 msgstr ""
 
-#: ardour_ui2.cc:131
+#: ardour_ui2.cc:82
 msgid "Play range/selection"
 msgstr ""
 
-#: ardour_ui2.cc:132
+#: ardour_ui2.cc:83
 msgid "Go to start of session"
 msgstr ""
 
-#: ardour_ui2.cc:133
+#: ardour_ui2.cc:84
 msgid "Go to end of session"
 msgstr ""
 
-#: ardour_ui2.cc:134
+#: ardour_ui2.cc:85
 msgid "Play loop range"
 msgstr ""
 
-#: ardour_ui2.cc:135
+#: ardour_ui2.cc:86
 msgid ""
 "MIDI Panic\n"
 "Send note off and reset controller messages on all MIDI channels"
 msgstr ""
 
-#: ardour_ui2.cc:136
+#: ardour_ui2.cc:87
 msgid "Return to last playback start when stopped"
 msgstr ""
 
-#: ardour_ui2.cc:137
-msgid "Playhead follows Range Selections and Edits"
+#: ardour_ui2.cc:88
+msgid "Playhead follows range selections and edits"
 msgstr ""
 
-#: ardour_ui2.cc:138
+#: ardour_ui2.cc:89
 msgid "Be sensible about input monitoring"
 msgstr ""
 
-#: ardour_ui2.cc:139
+#: ardour_ui2.cc:90
 msgid "Enable/Disable audio click"
 msgstr ""
 
-#: ardour_ui2.cc:140 monitor_section.cc:111
+#: ardour_ui2.cc:91 monitor_section.cc:129
 msgid ""
 "When active, something is soloed.\n"
 "Click to de-solo everything"
 msgstr ""
 
-#: ardour_ui2.cc:141
+#: ardour_ui2.cc:92
 msgid ""
-"When active, auditioning is taking place\n"
+"When active, auditioning is taking place.\n"
 "Click to stop the audition"
 msgstr ""
 
-#: ardour_ui2.cc:142
+#: ardour_ui2.cc:93
 msgid "When active, there is a feedback loop."
 msgstr ""
 
-#: ardour_ui2.cc:143
+#: ardour_ui2.cc:94
 msgid ""
 "<b>Primary Clock</b> right-click to set display mode. Click to edit, click"
 "+drag a digit or mouse-over+scroll wheel to modify.\n"
@@ -1485,7 +1752,7 @@ msgid ""
 "confirm; postfix the edit with '+' or '-' to enter delta times.\n"
 msgstr ""
 
-#: ardour_ui2.cc:144
+#: ardour_ui2.cc:95
 msgid ""
 "<b>Secondary Clock</b> right-click to set display mode. Click to edit, click"
 "+drag a digit or mouse-over+scroll wheel to modify.\n"
@@ -1493,450 +1760,559 @@ msgid ""
 "confirm; postfix the edit with '+' or '-' to enter delta times.\n"
 msgstr ""
 
-#: ardour_ui2.cc:145
+#: ardour_ui2.cc:96
 msgid "Reset All Peak Indicators"
 msgstr ""
 
-#: ardour_ui2.cc:146
+#: ardour_ui2.cc:97
 msgid "Show Error Log and acknowledge warnings"
 msgstr ""
 
-#: ardour_ui2.cc:179
+#: ardour_ui2.cc:130
 msgid "[ERROR]: "
 msgstr ""
 
-#: ardour_ui2.cc:182
+#: ardour_ui2.cc:133
 msgid "[WARNING]: "
 msgstr ""
 
-#: ardour_ui2.cc:185
+#: ardour_ui2.cc:136
 msgid "[INFO]: "
 msgstr ""
 
-#: ardour_ui2.cc:253 ardour_ui_ed.cc:403
+#: ardour_ui2.cc:197 ardour_ui_ed.cc:509
 msgid "Auto Return"
 msgstr ""
 
-#: ardour_ui2.cc:255 ardour_ui_ed.cc:406
+#: ardour_ui2.cc:199 ardour_ui_ed.cc:512
 msgid "Follow Edits"
 msgstr ""
 
-#: ardour_ui2.cc:716 rc_option_editor.cc:2300
+#: ardour_ui2.cc:422 ardour_ui2.cc:426 ardour_ui2.cc:430
+msgid ""
+"Drag this tab to the desktop to show %1 in its own window\n"
+"\n"
+"To put the window back, use the Window > %1 > Attach menu action"
+msgstr ""
+
+#: ardour_ui2.cc:638
 msgid "GUI"
 msgstr ""
 
-#: ardour_ui2.cc:733 rc_option_editor.cc:1309 rc_option_editor.cc:1327
-#: rc_option_editor.cc:1330 rc_option_editor.cc:1332 rc_option_editor.cc:1334
-#: rc_option_editor.cc:1342 rc_option_editor.cc:1350 rc_option_editor.cc:1352
-#: rc_option_editor.cc:1360 rc_option_editor.cc:1367 rc_option_editor.cc:1376
-#: rc_option_editor.cc:1378 rc_option_editor.cc:1380 rc_option_editor.cc:1388
-#: rc_option_editor.cc:1390 rc_option_editor.cc:1399
-#: session_option_editor.cc:321 session_option_editor.cc:323
-#: session_option_editor.cc:344 session_option_editor.cc:346
-#: session_option_editor.cc:348 session_option_editor.cc:355
-#: session_option_editor.cc:362 session_option_editor.cc:366
+#: ardour_ui2.cc:651 rc_option_editor.cc:1874 rc_option_editor.cc:1892
+#: rc_option_editor.cc:1895 rc_option_editor.cc:1897 rc_option_editor.cc:1899
+#: rc_option_editor.cc:1907 rc_option_editor.cc:1909 rc_option_editor.cc:1917
+#: rc_option_editor.cc:1925 rc_option_editor.cc:1932 rc_option_editor.cc:1953
+#: rc_option_editor.cc:1955 rc_option_editor.cc:1964
+#: session_option_editor.cc:342 session_option_editor.cc:344
+#: session_option_editor.cc:365 session_option_editor.cc:367
+#: session_option_editor.cc:369 session_option_editor.cc:376
+#: session_option_editor.cc:383 session_option_editor.cc:387
 msgid "Misc"
 msgstr ""
 
-#: ardour_ui_dependents.cc:76
+#: ardour_ui_dependents.cc:118
 msgid "Setup Editor"
 msgstr ""
 
-#: ardour_ui_dependents.cc:78
+#: ardour_ui_dependents.cc:120
 msgid "Setup Mixer"
 msgstr ""
 
-#: ardour_ui_dependents.cc:84
+#: ardour_ui_dependents.cc:127
 msgid "Reload Session History"
 msgstr ""
 
-#: ardour_ui_dialogs.cc:250
+#: ardour_ui_dependents.cc:248
+msgid "UI: cannot setup editor"
+msgstr ""
+
+#: ardour_ui_dependents.cc:253
+msgid "UI: cannot setup mixer"
+msgstr ""
+
+#: ardour_ui_dependents.cc:258
+msgid "UI: cannot setup meterbridge"
+msgstr ""
+
+#: ardour_ui_dependents.cc:263
+msgid "UI: cannot setup luawindow"
+msgstr ""
+
+#: ardour_ui_dependents.cc:269 ardour_ui_ed.cc:136 ardour_ui_ed.cc:257
+#: rc_option_editor.cc:1853 rc_option_editor.cc:3487
+msgid "Preferences"
+msgstr ""
+
+#: ardour_ui_dependents.cc:270 ardour_ui_ed.cc:134 mixer_ui.cc:100
+#: mixer_ui.cc:410
+msgid "Mixer"
+msgstr ""
+
+#: ardour_ui_dependents.cc:271 ardour_ui_ed.cc:135 editor.cc:5790
+#: editor.cc:6062 public_editor.cc:34 rc_option_editor.cc:2201
+#: rc_option_editor.cc:2215 rc_option_editor.cc:2219 rc_option_editor.cc:2227
+#: rc_option_editor.cc:2236 rc_option_editor.cc:2244 rc_option_editor.cc:2253
+#: rc_option_editor.cc:2261 rc_option_editor.cc:2269 rc_option_editor.cc:2279
+#: rc_option_editor.cc:2281 rc_option_editor.cc:2305 rc_option_editor.cc:2317
+#: rc_option_editor.cc:2328 rc_option_editor.cc:2346
+msgid "Editor"
+msgstr ""
+
+#: ardour_ui_dialogs.cc:263
 msgid "Don't close"
 msgstr ""
 
-#: ardour_ui_dialogs.cc:251
+#: ardour_ui_dialogs.cc:264
 msgid "Just close"
 msgstr ""
 
-#: ardour_ui_dialogs.cc:252
+#: ardour_ui_dialogs.cc:265
 msgid "Save and close"
 msgstr ""
 
-#: ardour_ui_dialogs.cc:362
-msgid "This screen is not tall enough to display the mixer window"
+#: ardour_ui_ed.cc:124
+msgid "Escape"
 msgstr ""
 
-#: ardour_ui_ed.cc:102
+#: ardour_ui_ed.cc:128
 msgid "Session"
 msgstr ""
 
-#: ardour_ui_ed.cc:105 editor_actions.cc:138 editor_regions.cc:116
-#: port_group.cc:458 session_option_editor.cc:82 session_option_editor.cc:89
+#: ardour_ui_ed.cc:131 editor_actions.cc:141 editor_regions.cc:163
+#: port_group.cc:468 session_option_editor.cc:82 session_option_editor.cc:89
 msgid "Sync"
 msgstr ""
 
-#: ardour_ui_ed.cc:106
+#: ardour_ui_ed.cc:132
 msgid "Options"
 msgstr ""
 
-#: ardour_ui_ed.cc:107
+#: ardour_ui_ed.cc:133
 msgid "Window"
 msgstr ""
 
-#: ardour_ui_ed.cc:108
+#: ardour_ui_ed.cc:137 ardour_ui_ed.cc:267 ardour_ui_ed.cc:268
+#: ardour_ui_ed.cc:269
+msgid "Detach"
+msgstr ""
+
+#: ardour_ui_ed.cc:138
 msgid "Help"
 msgstr ""
 
-#: ardour_ui_ed.cc:109
+#: ardour_ui_ed.cc:139
 msgid "Misc. Shortcuts"
 msgstr ""
 
-#: ardour_ui_ed.cc:110
+#: ardour_ui_ed.cc:140
 msgid "Audio File Format"
 msgstr ""
 
-#: ardour_ui_ed.cc:111
+#: ardour_ui_ed.cc:141
 msgid "File Type"
 msgstr ""
 
-#: ardour_ui_ed.cc:112 export_format_dialog.cc:67
+#: ardour_ui_ed.cc:142 export_format_dialog.cc:75
 msgid "Sample Format"
 msgstr ""
 
-#: ardour_ui_ed.cc:113 rc_option_editor.cc:2245 rc_option_editor.cc:2257
+#: ardour_ui_ed.cc:143 rc_option_editor.cc:2841
 msgid "Control Surfaces"
 msgstr ""
 
-#: ardour_ui_ed.cc:114 rc_option_editor.cc:1921 rc_option_editor.cc:2264
+#: ardour_ui_ed.cc:144 rc_option_editor.cc:2847 rc_option_editor.cc:2853
+#: rc_option_editor.cc:2862 rc_option_editor.cc:2873 rc_option_editor.cc:2883
+#: rc_option_editor.cc:2945 rc_option_editor.cc:2962 rc_option_editor.cc:2978
+#: rc_option_editor.cc:2979 rc_option_editor.cc:2988 rc_option_editor.cc:3002
+#: rc_option_editor.cc:3005 rc_option_editor.cc:3013 rc_option_editor.cc:3021
 msgid "Plugins"
 msgstr ""
 
-#: ardour_ui_ed.cc:115 rc_option_editor.cc:2351
+#: ardour_ui_ed.cc:145 rc_option_editor.cc:3169
 msgid "Metering"
 msgstr ""
 
-#: ardour_ui_ed.cc:116
+#: ardour_ui_ed.cc:146
 msgid "Fall Off Rate"
 msgstr ""
 
-#: ardour_ui_ed.cc:117
+#: ardour_ui_ed.cc:147
 msgid "Hold Time"
 msgstr ""
 
-#: ardour_ui_ed.cc:118
+#: ardour_ui_ed.cc:148
 msgid "Denormal Handling"
 msgstr ""
 
-#: ardour_ui_ed.cc:122 route_time_axis.cc:1677
+#: ardour_ui_ed.cc:152 route_time_axis.cc:1683
 msgid "New..."
 msgstr ""
 
-#: ardour_ui_ed.cc:124
+#: ardour_ui_ed.cc:154
 msgid "Open..."
 msgstr ""
 
-#: ardour_ui_ed.cc:125
+#: ardour_ui_ed.cc:155
 msgid "Recent..."
 msgstr ""
 
-#: ardour_ui_ed.cc:126 panner_editor.cc:29 playlist_selector.cc:64
+#: ardour_ui_ed.cc:156 panner_editor.cc:29 playlist_selector.cc:64
 msgid "Close"
 msgstr ""
 
-#: ardour_ui_ed.cc:129
+#: ardour_ui_ed.cc:159
 msgid "Add Track or Bus..."
 msgstr ""
 
-#: ardour_ui_ed.cc:134
-msgid "Open Video"
+#: ardour_ui_ed.cc:163
+msgid "Duplicate Tracks/Busses..."
+msgstr ""
+
+#: ardour_ui_ed.cc:169
+msgid "Cancel Solo"
+msgstr ""
+
+#: ardour_ui_ed.cc:173
+msgid "Session|Scripting"
+msgstr ""
+
+#: ardour_ui_ed.cc:176
+msgid "Add Lua Script..."
+msgstr ""
+
+#: ardour_ui_ed.cc:180
+msgid "Remove Lua Script"
 msgstr ""
 
-#: ardour_ui_ed.cc:137
+#: ardour_ui_ed.cc:184
+msgid "Open Video..."
+msgstr ""
+
+#: ardour_ui_ed.cc:187
 msgid "Remove Video"
 msgstr ""
 
-#: ardour_ui_ed.cc:140
-msgid "Export To Video File"
+#: ardour_ui_ed.cc:190
+msgid "Export to Video File..."
+msgstr ""
+
+#: ardour_ui_ed.cc:194
+msgid "Snapshot (& keep working on current version) ..."
 msgstr ""
 
-#: ardour_ui_ed.cc:144
-msgid "Snapshot..."
+#: ardour_ui_ed.cc:197
+msgid "Snapshot (& switch to new version) ..."
 msgstr ""
 
-#: ardour_ui_ed.cc:148
+#: ardour_ui_ed.cc:200
+msgid "Quick Snapshot (& keep working on current version) ..."
+msgstr ""
+
+#: ardour_ui_ed.cc:203
+msgid "Quick Snapshot (& switch to new version) ..."
+msgstr ""
+
+#: ardour_ui_ed.cc:207
 msgid "Save As..."
 msgstr ""
 
-#: ardour_ui_ed.cc:152 editor_actions.cc:1771 editor_markers.cc:903
-#: editor_snapshots.cc:124 mixer_strip.cc:1518 route_time_axis.cc:1673
+#: ardour_ui_ed.cc:210 editor_actions.cc:1788 editor_markers.cc:908
+#: editor_snapshots.cc:136 mixer_strip.cc:1653 route_time_axis.cc:1679
 msgid "Rename..."
 msgstr ""
 
-#: ardour_ui_ed.cc:156
+#: ardour_ui_ed.cc:214
 msgid "Save Template..."
 msgstr ""
 
-#: ardour_ui_ed.cc:159
+#: ardour_ui_ed.cc:217
 msgid "Metadata"
 msgstr ""
 
-#: ardour_ui_ed.cc:162
+#: ardour_ui_ed.cc:220
 msgid "Edit Metadata..."
 msgstr ""
 
-#: ardour_ui_ed.cc:165
+#: ardour_ui_ed.cc:223
 msgid "Import Metadata..."
 msgstr ""
 
-#: ardour_ui_ed.cc:168
-msgid "Export To Audio File(s)..."
+#: ardour_ui_ed.cc:226
+msgid "Export to Audio File(s)..."
 msgstr ""
 
-#: ardour_ui_ed.cc:171
+#: ardour_ui_ed.cc:229
 msgid "Stem export..."
 msgstr ""
 
-#: ardour_ui_ed.cc:174 editor_export_audio.cc:65 export_dialog.cc:129
-#: export_video_dialog.cc:84
+#: ardour_ui_ed.cc:232 editor_export_audio.cc:66 export_channel_selector.cc:190
+#: export_channel_selector.cc:578 export_dialog.cc:131
+#: export_video_dialog.cc:80
 msgid "Export"
 msgstr ""
 
-#: ardour_ui_ed.cc:177
+#: ardour_ui_ed.cc:235
 msgid "Clean-up Unused Sources..."
 msgstr ""
 
-#: ardour_ui_ed.cc:181
+#: ardour_ui_ed.cc:239
+msgid "Reset Peak Files"
+msgstr ""
+
+#: ardour_ui_ed.cc:243
 msgid "Flush Wastebasket"
 msgstr ""
 
-#: ardour_ui_ed.cc:188
+#: ardour_ui_ed.cc:251
 msgid "Quit"
 msgstr ""
 
-#: ardour_ui_ed.cc:192
+#: ardour_ui_ed.cc:252 ardour_ui_ed.cc:259 ardour_ui_ed.cc:260
+#: ardour_ui_ed.cc:261 automation_time_axis.cc:545 editor_actions.cc:686
+#: editor_markers.cc:907 location_ui.cc:61 plugin_selector.cc:97
+#: route_time_axis.cc:864
+msgid "Hide"
+msgstr ""
+
+#: ardour_ui_ed.cc:263 ardour_ui_ed.cc:264 ardour_ui_ed.cc:265
+msgid "Attach"
+msgstr ""
+
+#: ardour_ui_ed.cc:275 ardour_ui_ed.cc:276 ardour_ui_ed.cc:277
+#: ardour_ui_ed.cc:283 ardour_ui_ed.cc:284 ardour_ui_ed.cc:285
+msgid "Change"
+msgstr ""
+
+#: ardour_ui_ed.cc:287
+msgid "Previous Tab"
+msgstr ""
+
+#: ardour_ui_ed.cc:288
+msgid "Next Tab"
+msgstr ""
+
+#: ardour_ui_ed.cc:290
+msgid "Toggle Editor & Mixer"
+msgstr ""
+
+#: ardour_ui_ed.cc:294
 msgid "Maximise Editor Space"
 msgstr ""
 
-#: ardour_ui_ed.cc:193
+#: ardour_ui_ed.cc:295
 msgid "Maximise Mixer Space"
 msgstr ""
 
-#: ardour_ui_ed.cc:194
-msgid "Show Toolbars"
+#: ardour_ui_ed.cc:298
+msgid "Toggle Mixer List"
 msgstr ""
 
-#: ardour_ui_ed.cc:198
-msgid "Show more UI preferences"
+#: ardour_ui_ed.cc:301
+msgid "Toggle Monitor Section Visibility"
 msgstr ""
 
-#: ardour_ui_ed.cc:200 mixer_ui.cc:1924 mixer_ui.cc:1930
-msgid "Window|Mixer"
+#: ardour_ui_ed.cc:305
+msgid "Show more UI preferences"
 msgstr ""
 
-#: ardour_ui_ed.cc:201
-msgid "Toggle Editor+Mixer"
+#: ardour_ui_ed.cc:308
+msgid "Window|Scripting"
 msgstr ""
 
-#: ardour_ui_ed.cc:202 meterbridge.cc:218 meterbridge.cc:224
+#: ardour_ui_ed.cc:309 meterbridge.cc:214 meterbridge.cc:220
 msgid "Window|Meterbridge"
 msgstr ""
 
-#: ardour_ui_ed.cc:204
-msgid "Reattach All Tearoffs"
-msgstr ""
-
-#: ardour_ui_ed.cc:206 midi_tracer.cc:45
+#: ardour_ui_ed.cc:311 midi_tracer.cc:45
 msgid "MIDI Tracer"
 msgstr ""
 
-#: ardour_ui_ed.cc:208
+#: ardour_ui_ed.cc:314
 msgid "Chat"
 msgstr ""
 
-#: ardour_ui_ed.cc:210
+#: ardour_ui_ed.cc:316
 msgid "Help|Manual"
 msgstr ""
 
-#: ardour_ui_ed.cc:211
-msgid "Reference"
+#: ardour_ui_ed.cc:317
+msgid "Manual|Reference"
 msgstr ""
 
-#: ardour_ui_ed.cc:212
-msgid "Report A Bug"
+#: ardour_ui_ed.cc:318
+msgid "Report a Bug"
 msgstr ""
 
-#: ardour_ui_ed.cc:213
+#: ardour_ui_ed.cc:319
 msgid "Cheat Sheet"
 msgstr ""
 
-#: ardour_ui_ed.cc:214
+#: ardour_ui_ed.cc:320
 msgid "Ardour Website"
 msgstr ""
 
-#: ardour_ui_ed.cc:215
+#: ardour_ui_ed.cc:321
 msgid "Ardour Development"
 msgstr ""
 
-#: ardour_ui_ed.cc:216
+#: ardour_ui_ed.cc:322
 msgid "User Forums"
 msgstr ""
 
-#: ardour_ui_ed.cc:217
-msgid "How to report a bug"
+#: ardour_ui_ed.cc:323
+msgid "How to Report a Bug"
 msgstr ""
 
-#: ardour_ui_ed.cc:219 plugin_ui.cc:419
+#: ardour_ui_ed.cc:325 luawindow.cc:100 luawindow.cc:654 plugin_ui.cc:419
 msgid "Save"
 msgstr ""
 
-#: ardour_ui_ed.cc:227 rc_option_editor.cc:1419 rc_option_editor.cc:1430
-#: rc_option_editor.cc:1441 rc_option_editor.cc:1450 rc_option_editor.cc:1463
-#: rc_option_editor.cc:1476 rc_option_editor.cc:1485 rc_option_editor.cc:1495
-#: rc_option_editor.cc:1497 rc_option_editor.cc:1506 rc_option_editor.cc:1522
-#: rc_option_editor.cc:1543 rc_option_editor.cc:1561 rc_option_editor.cc:1563
-#: rc_option_editor.cc:1579 rc_option_editor.cc:1582 rc_option_editor.cc:1584
-#: rc_option_editor.cc:1601 rc_option_editor.cc:1612
+#: ardour_ui_ed.cc:333 rc_option_editor.cc:1975 rc_option_editor.cc:1986
+#: rc_option_editor.cc:1997 rc_option_editor.cc:2008 rc_option_editor.cc:2017
+#: rc_option_editor.cc:2030 rc_option_editor.cc:2043 rc_option_editor.cc:2052
+#: rc_option_editor.cc:2062 rc_option_editor.cc:2079 rc_option_editor.cc:2186
 msgid "Transport"
 msgstr ""
 
-#: ardour_ui_ed.cc:233
+#: ardour_ui_ed.cc:339 engine_dialog.cc:88
 msgid "Stop"
 msgstr ""
 
-#: ardour_ui_ed.cc:236
+#: ardour_ui_ed.cc:342
 msgid "Roll"
 msgstr ""
 
-#: ardour_ui_ed.cc:240 ardour_ui_ed.cc:243
+#: ardour_ui_ed.cc:346 ardour_ui_ed.cc:349
 msgid "Start/Stop"
 msgstr ""
 
-#: ardour_ui_ed.cc:246
+#: ardour_ui_ed.cc:352
 msgid "Start/Continue/Stop"
 msgstr ""
 
-#: ardour_ui_ed.cc:249
+#: ardour_ui_ed.cc:355
 msgid "Stop and Forget Capture"
 msgstr ""
 
-#: ardour_ui_ed.cc:259
-msgid "Transition To Roll"
+#: ardour_ui_ed.cc:365
+msgid "Transition to Roll"
 msgstr ""
 
-#: ardour_ui_ed.cc:263
-msgid "Transition To Reverse"
+#: ardour_ui_ed.cc:369
+msgid "Transition to Reverse"
 msgstr ""
 
-#: ardour_ui_ed.cc:267
+#: ardour_ui_ed.cc:373
 msgid "Play Loop Range"
 msgstr ""
 
-#: ardour_ui_ed.cc:270
+#: ardour_ui_ed.cc:376
 msgid "Play Selection"
 msgstr ""
 
-#: ardour_ui_ed.cc:273
+#: ardour_ui_ed.cc:379
 msgid "Play Selection w/Preroll"
 msgstr ""
 
-#: ardour_ui_ed.cc:277
+#: ardour_ui_ed.cc:383
 msgid "Enable Record"
 msgstr ""
 
-#: ardour_ui_ed.cc:280 ardour_ui_ed.cc:284
+#: ardour_ui_ed.cc:386 ardour_ui_ed.cc:390
 msgid "Start Recording"
 msgstr ""
 
-#: ardour_ui_ed.cc:288
+#: ardour_ui_ed.cc:394
 msgid "Rewind"
 msgstr ""
 
-#: ardour_ui_ed.cc:291
+#: ardour_ui_ed.cc:397
 msgid "Rewind (Slow)"
 msgstr ""
 
-#: ardour_ui_ed.cc:294
+#: ardour_ui_ed.cc:400
 msgid "Rewind (Fast)"
 msgstr ""
 
-#: ardour_ui_ed.cc:297
+#: ardour_ui_ed.cc:403
 msgid "Forward"
 msgstr ""
 
-#: ardour_ui_ed.cc:300
+#: ardour_ui_ed.cc:406
 msgid "Forward (Slow)"
 msgstr ""
 
-#: ardour_ui_ed.cc:303
+#: ardour_ui_ed.cc:409
 msgid "Forward (Fast)"
 msgstr ""
 
-#: ardour_ui_ed.cc:306
+#: ardour_ui_ed.cc:412
 msgid "Go to Zero"
 msgstr ""
 
-#: ardour_ui_ed.cc:309 ardour_ui_ed.cc:312
+#: ardour_ui_ed.cc:415 ardour_ui_ed.cc:418
 msgid "Go to Start"
 msgstr ""
 
-#: ardour_ui_ed.cc:315
+#: ardour_ui_ed.cc:421
 msgid "Go to End"
 msgstr ""
 
-#: ardour_ui_ed.cc:318
+#: ardour_ui_ed.cc:424
 msgid "Go to Wall Clock"
 msgstr ""
 
-#: ardour_ui_ed.cc:323 ardour_ui_ed.cc:326
+#: ardour_ui_ed.cc:429 ardour_ui_ed.cc:432
 msgid "Numpad Decimal"
 msgstr ""
 
-#: ardour_ui_ed.cc:329
+#: ardour_ui_ed.cc:435
 msgid "Numpad 0"
 msgstr ""
 
-#: ardour_ui_ed.cc:332
+#: ardour_ui_ed.cc:438
 msgid "Numpad 1"
 msgstr ""
 
-#: ardour_ui_ed.cc:335
+#: ardour_ui_ed.cc:441
 msgid "Numpad 2"
 msgstr ""
 
-#: ardour_ui_ed.cc:338
+#: ardour_ui_ed.cc:444
 msgid "Numpad 3"
 msgstr ""
 
-#: ardour_ui_ed.cc:341
+#: ardour_ui_ed.cc:447
 msgid "Numpad 4"
 msgstr ""
 
-#: ardour_ui_ed.cc:344
+#: ardour_ui_ed.cc:450
 msgid "Numpad 5"
 msgstr ""
 
-#: ardour_ui_ed.cc:347
+#: ardour_ui_ed.cc:453
 msgid "Numpad 6"
 msgstr ""
 
-#: ardour_ui_ed.cc:350
+#: ardour_ui_ed.cc:456
 msgid "Numpad 7"
 msgstr ""
 
-#: ardour_ui_ed.cc:353
+#: ardour_ui_ed.cc:459
 msgid "Numpad 8"
 msgstr ""
 
-#: ardour_ui_ed.cc:356
+#: ardour_ui_ed.cc:462
 msgid "Numpad 9"
 msgstr ""
 
-#: ardour_ui_ed.cc:360
+#: ardour_ui_ed.cc:466
 msgid "Focus On Clock"
 msgstr ""
 
-#: ardour_ui_ed.cc:364 ardour_ui_ed.cc:373 audio_clock.cc:2091 editor.cc:258
-#: editor_actions.cc:569 editor_actions.cc:578 export_timespan_selector.cc:88
+#: ardour_ui_ed.cc:470 ardour_ui_ed.cc:479 audio_clock.cc:2122 editor.cc:321
+#: editor_actions.cc:610 editor_actions.cc:619 export_timespan_selector.cc:85
 #: session_option_editor.cc:41 session_option_editor.cc:61
 #: session_option_editor.cc:80 session_option_editor.cc:96
 #: session_option_editor.cc:109 session_option_editor.cc:122
@@ -1944,257 +2320,274 @@ msgstr ""
 msgid "Timecode"
 msgstr ""
 
-#: ardour_ui_ed.cc:366 ardour_ui_ed.cc:375 editor_actions.cc:567
+#: ardour_ui_ed.cc:472 ardour_ui_ed.cc:481 editor_actions.cc:608
 msgid "Bars & Beats"
 msgstr ""
 
-#: ardour_ui_ed.cc:368 ardour_ui_ed.cc:377
+#: ardour_ui_ed.cc:474 ardour_ui_ed.cc:483
 msgid "Minutes & Seconds"
 msgstr ""
 
-#: ardour_ui_ed.cc:370 ardour_ui_ed.cc:379 audio_clock.cc:2095 editor.cc:259
-#: editor_actions.cc:568
+#: ardour_ui_ed.cc:476 ardour_ui_ed.cc:485 audio_clock.cc:2125 editor.cc:322
+#: editor_actions.cc:609
 msgid "Samples"
 msgstr ""
 
-#: ardour_ui_ed.cc:382
+#: ardour_ui_ed.cc:488
 msgid "Punch In"
 msgstr ""
 
-#: ardour_ui_ed.cc:383 mixer_strip.cc:1819 mixer_strip.cc:1843
-#: mixer_strip.cc:2007 route_ui.cc:164 time_info_box.cc:116
+#: ardour_ui_ed.cc:489 mixer_strip.cc:1992 mixer_strip.cc:2193 route_ui.cc:187
+#: time_info_box.cc:110
 msgid "In"
 msgstr ""
 
-#: ardour_ui_ed.cc:386
+#: ardour_ui_ed.cc:492
 msgid "Punch Out"
 msgstr ""
 
-#: ardour_ui_ed.cc:387 mixer_strip.cc:1831 time_info_box.cc:117
+#: ardour_ui_ed.cc:493 mixer_strip.cc:2004 time_info_box.cc:111
 msgid "Out"
 msgstr ""
 
-#: ardour_ui_ed.cc:390
+#: ardour_ui_ed.cc:496
 msgid "Punch In/Out"
 msgstr ""
 
-#: ardour_ui_ed.cc:391
+#: ardour_ui_ed.cc:497
 msgid "In/Out"
 msgstr ""
 
-#: ardour_ui_ed.cc:394 rc_option_editor.cc:1376
+#: ardour_ui_ed.cc:500 rc_option_editor.cc:1941
 msgid "Click"
 msgstr ""
 
-#: ardour_ui_ed.cc:397
+#: ardour_ui_ed.cc:503
 msgid "Auto Input"
 msgstr ""
 
-#: ardour_ui_ed.cc:400
+#: ardour_ui_ed.cc:506
 msgid "Auto Play"
 msgstr ""
 
-#: ardour_ui_ed.cc:411
+#: ardour_ui_ed.cc:517
 msgid "Sync Startup to Video"
 msgstr ""
 
-#: ardour_ui_ed.cc:413
+#: ardour_ui_ed.cc:519
 msgid "Time Master"
 msgstr ""
 
-#: ardour_ui_ed.cc:420
+#: ardour_ui_ed.cc:521
+msgid "Use External Positional Sync Source"
+msgstr ""
+
+#: ardour_ui_ed.cc:526
 msgid "Toggle Record Enable Track %1"
 msgstr ""
 
-#: ardour_ui_ed.cc:427
+#: ardour_ui_ed.cc:533
 msgid "Percentage"
 msgstr ""
 
-#: ardour_ui_ed.cc:428 shuttle_control.cc:178
+#: ardour_ui_ed.cc:534 shuttle_control.cc:205
 msgid "Semitones"
 msgstr ""
 
-#: ardour_ui_ed.cc:432
+#: ardour_ui_ed.cc:538
 msgid "Send MTC"
 msgstr ""
 
-#: ardour_ui_ed.cc:434
+#: ardour_ui_ed.cc:540
 msgid "Send MMC"
 msgstr ""
 
-#: ardour_ui_ed.cc:436
+#: ardour_ui_ed.cc:542
 msgid "Use MMC"
 msgstr ""
 
-#: ardour_ui_ed.cc:438 rc_option_editor.cc:2097
+#: ardour_ui_ed.cc:544 rc_option_editor.cc:2730
 msgid "Send MIDI Clock"
 msgstr ""
 
-#: ardour_ui_ed.cc:440
+#: ardour_ui_ed.cc:546
 msgid "Send MIDI Feedback"
 msgstr ""
 
-#: ardour_ui_ed.cc:446
+#: ardour_ui_ed.cc:552
 msgid "Panic"
 msgstr ""
 
-#: ardour_ui_ed.cc:534
+#: ardour_ui_ed.cc:629
 msgid "Wall Clock"
 msgstr ""
 
-#: ardour_ui_ed.cc:536
+#: ardour_ui_ed.cc:631
 msgid "Disk Space"
 msgstr ""
 
-#: ardour_ui_ed.cc:537
+#: ardour_ui_ed.cc:632
 msgid "DSP"
 msgstr ""
 
-#: ardour_ui_ed.cc:538
+#: ardour_ui_ed.cc:633
+msgid "X-run"
+msgstr ""
+
+#: ardour_ui_ed.cc:634
+msgid "Active Peak-file Work"
+msgstr ""
+
+#: ardour_ui_ed.cc:635
 msgid "Buffers"
 msgstr ""
 
-#: ardour_ui_ed.cc:540
+#: ardour_ui_ed.cc:637
 msgid "Timecode Format"
 msgstr ""
 
-#: ardour_ui_ed.cc:541
+#: ardour_ui_ed.cc:638
 msgid "File Format"
 msgstr ""
 
-#: ardour_ui_options.cc:63
+#: ardour_ui_options.cc:55
 msgid ""
 "It is not possible to use JACK as the the sync source\n"
 "when the pull up/down setting is non-zero."
 msgstr ""
 
-#: ardour_ui_options.cc:317
+#: ardour_ui_options.cc:309
 msgid "Internal"
 msgstr ""
 
-#: ardour_ui_options.cc:498
+#: ardour_ui_options.cc:518
 msgid "Enable/Disable external positional sync"
 msgstr ""
 
-#: ardour_ui_options.cc:500
+#: ardour_ui_options.cc:520
 msgid "Sync to JACK is not possible: video pull up/down is set"
 msgstr ""
 
-#: audio_clock.cc:1047 audio_clock.cc:1066
+#: audio_clock.cc:1057 audio_clock.cc:1076
 msgid "--pending--"
 msgstr ""
 
-#: audio_clock.cc:1118
+#: audio_clock.cc:1128
 msgid "SR"
 msgstr ""
 
-#: audio_clock.cc:1124 audio_clock.cc:1128
+#: audio_clock.cc:1134 audio_clock.cc:1138
 msgid "Pull"
 msgstr ""
 
-#: audio_clock.cc:1126
+#: audio_clock.cc:1136
 #, c-format
 msgid "%+.4f%%"
 msgstr ""
 
-#: audio_clock.cc:1282 editor.cc:260 editor_actions.cc:139
-#: editor_actions.cc:561
+#: audio_clock.cc:1292 editor.cc:323 editor_actions.cc:142
+#: editor_actions.cc:602
 msgid "Tempo"
 msgstr ""
 
-#: audio_clock.cc:1286 editor.cc:261 editor_actions.cc:562
+#: audio_clock.cc:1296 editor.cc:324 editor_actions.cc:603
 msgid "Meter"
 msgstr ""
 
-#: audio_clock.cc:1864 audio_streamview.cc:115 editor_actions.cc:1089
-#: session_metadata_dialog.cc:452 session_metadata_dialog.cc:500
-#: session_metadata_dialog.cc:556 session_metadata_dialog.cc:845
-#: streamview.cc:470
+#: audio_clock.cc:1878 audio_streamview.cc:117 editor_actions.cc:1092
+#: luainstance.cc:959 luainstance.cc:1575 plugin_pin_dialog.cc:859
+#: plugin_selector.cc:995 plugin_selector.cc:1016
+#: session_metadata_dialog.cc:455 session_metadata_dialog.cc:503
+#: session_metadata_dialog.cc:559 session_metadata_dialog.cc:848
+#: streamview.cc:474
 msgid "programming error: %1"
 msgstr ""
 
-#: audio_clock.cc:1997 audio_clock.cc:2025
+#: audio_clock.cc:2011 audio_clock.cc:2039
 msgid "programming error: %1 %2"
 msgstr ""
 
-#: audio_clock.cc:2093 editor.cc:257 export_timespan_selector.cc:98
+#: audio_clock.cc:2123 editor.cc:320 export_timespan_selector.cc:95
 msgid "Bars:Beats"
 msgstr ""
 
-#: audio_clock.cc:2094 export_timespan_selector.cc:93
+#: audio_clock.cc:2124 export_timespan_selector.cc:90
 msgid "Minutes:Seconds"
 msgstr ""
 
-#: audio_clock.cc:2099
-msgid "Set From Playhead"
+#: audio_clock.cc:2129
+msgid "Set from Playhead"
 msgstr ""
 
-#: audio_clock.cc:2100
+#: audio_clock.cc:2130
 msgid "Locate to This Time"
 msgstr ""
 
-#: audio_region_editor.cc:64 control_point_dialog.cc:49 rhythm_ferret.cc:124
-#: rhythm_ferret.cc:129 rhythm_ferret.cc:134
+#: audio_clock.cc:2133
+msgid "Copy to clipboard"
+msgstr ""
+
+#: audio_region_editor.cc:60 control_point_dialog.cc:49 rhythm_ferret.cc:137
+#: rhythm_ferret.cc:154
 msgid "dB"
 msgstr ""
 
-#: audio_region_editor.cc:67
+#: audio_region_editor.cc:63
 msgid "Region gain:"
 msgstr ""
 
-#: audio_region_editor.cc:77 export_format_dialog.cc:43
+#: audio_region_editor.cc:73 export_format_dialog.cc:49 export_report.cc:772
+#: export_report.cc:1185 fft_graph.cc:370
 msgid "dBFS"
 msgstr ""
 
-#: audio_region_editor.cc:80
+#: audio_region_editor.cc:76
 msgid "Peak amplitude:"
 msgstr ""
 
-#: audio_region_editor.cc:91
+#: audio_region_editor.cc:87
 msgid "Calculating..."
 msgstr ""
 
-#: audio_region_view.cc:1243
+#: audio_region_view.cc:1385
 msgid "add gain control point"
 msgstr ""
 
-#: automation_controller.cc:286 automation_controller.cc:302
+#: automation_controller.cc:304 automation_controller.cc:320
 msgid "Select Note..."
 msgstr ""
 
-#: automation_controller.cc:293
+#: automation_controller.cc:311
 msgid "Halve"
 msgstr ""
 
-#: automation_controller.cc:296
+#: automation_controller.cc:314
 msgid "Double"
 msgstr ""
 
-#: automation_controller.cc:307
-msgid "Set to %1 beat(s)"
-msgstr ""
+#: automation_controller.cc:325
+msgid "Set to %1 beat"
+msgid_plural "Set to %1 beats"
+msgstr[0] ""
+msgstr[1] ""
 
-#: automation_line.cc:286 automation_line.cc:462
+#: automation_line.cc:292 editor_drag.cc:4388
 msgid "automation event move"
 msgstr ""
 
-#: automation_line.cc:488 automation_line.cc:508
-msgid "automation range move"
-msgstr ""
-
-#: automation_line.cc:880 region_gain_line.cc:72
+#: automation_line.cc:888 region_gain_line.cc:75
 msgid "remove control point"
 msgstr ""
 
-#: automation_line.cc:1003
+#: automation_line.cc:1013
 msgid "Ignoring illegal points on AutomationLine \"%1\""
 msgstr ""
 
-#: automation_region_view.cc:190 automation_time_axis.cc:644
+#: automation_region_view.cc:193 automation_time_axis.cc:649
 msgid "add automation event"
 msgstr ""
 
-#: automation_streamview.cc:95
+#: automation_streamview.cc:94
 msgid "unable to display automation region for control without list"
 msgstr ""
 
@@ -2206,63 +2599,59 @@ msgstr ""
 msgid "hide track"
 msgstr ""
 
-#: automation_time_axis.cc:308 automation_time_axis.cc:360
-#: automation_time_axis.cc:554 gain_meter.cc:220 generic_pluginui.cc:523
-#: generic_pluginui.cc:817 panner_ui.cc:151
+#: automation_time_axis.cc:310 automation_time_axis.cc:362
+#: automation_time_axis.cc:556 gain_meter.cc:230 generic_pluginui.cc:590
+#: generic_pluginui.cc:934 panner_ui.cc:151
 msgid "Automation|Manual"
 msgstr ""
 
-#: automation_time_axis.cc:310 automation_time_axis.cc:371
-#: automation_time_axis.cc:559 editor.cc:1904 editor.cc:1981
-#: editor_actions.cc:122 editor_actions.cc:1920 gain_meter.cc:223
-#: generic_pluginui.cc:99 generic_pluginui.cc:526 generic_pluginui.cc:819
-#: midi_time_axis.cc:1606 midi_time_axis.cc:1609 midi_time_axis.cc:1612
+#: automation_time_axis.cc:312 automation_time_axis.cc:373
+#: automation_time_axis.cc:561 editor.cc:2033 editor.cc:2111
+#: editor_actions.cc:125 editor_actions.cc:1937 gain_meter.cc:232
+#: generic_pluginui.cc:100 generic_pluginui.cc:593 generic_pluginui.cc:936
+#: midi_time_axis.cc:1610 midi_time_axis.cc:1613 midi_time_axis.cc:1616
 #: panner_ui.cc:154
 msgid "Play"
 msgstr ""
 
-#: automation_time_axis.cc:312 automation_time_axis.cc:382
-#: automation_time_axis.cc:564 gain_meter.cc:226 generic_pluginui.cc:101
-#: generic_pluginui.cc:529 generic_pluginui.cc:821 panner_ui.cc:157
+#: automation_time_axis.cc:314 automation_time_axis.cc:384
+#: automation_time_axis.cc:566 gain_meter.cc:234 generic_pluginui.cc:102
+#: generic_pluginui.cc:596 generic_pluginui.cc:938 panner_ui.cc:157
 msgid "Write"
 msgstr ""
 
-#: automation_time_axis.cc:314 automation_time_axis.cc:393
-#: automation_time_axis.cc:569 gain_meter.cc:229 generic_pluginui.cc:103
-#: generic_pluginui.cc:532 generic_pluginui.cc:823 panner_ui.cc:160
+#: automation_time_axis.cc:316 automation_time_axis.cc:395
+#: automation_time_axis.cc:571 gain_meter.cc:236 generic_pluginui.cc:104
+#: generic_pluginui.cc:599 generic_pluginui.cc:940 panner_ui.cc:160
 msgid "Touch"
 msgstr ""
 
-#: automation_time_axis.cc:404 generic_pluginui.cc:535 meter_patterns.cc:112
+#: automation_time_axis.cc:406 generic_pluginui.cc:602 meter_patterns.cc:118
 msgid "???"
 msgstr ""
 
-#: automation_time_axis.cc:445
+#: automation_time_axis.cc:447
 msgid "clear automation"
 msgstr ""
 
-#: automation_time_axis.cc:543 editor_actions.cc:645 editor_markers.cc:902
-#: location_ui.cc:57 plugin_selector.cc:86 route_time_axis.cc:854
-msgid "Hide"
-msgstr ""
-
-#: automation_time_axis.cc:545
+#: automation_time_axis.cc:547 rc_option_editor.cc:2916
+#: rc_option_editor.cc:2921 rc_option_editor.cc:2967 rc_option_editor.cc:2972
 msgid "Clear"
 msgstr ""
 
-#: automation_time_axis.cc:576
+#: automation_time_axis.cc:578
 msgid "State"
 msgstr ""
 
-#: automation_time_axis.cc:592
+#: automation_time_axis.cc:594
 msgid "Discrete"
 msgstr ""
 
-#: automation_time_axis.cc:598 export_format_dialog.cc:485
+#: automation_time_axis.cc:600 export_format_dialog.cc:552
 msgid "Linear"
 msgstr ""
 
-#: automation_time_axis.cc:604 rhythm_ferret.cc:109 shuttle_control.cc:197
+#: automation_time_axis.cc:606 rhythm_ferret.cc:118 shuttle_control.cc:224
 msgid "Mode"
 msgstr ""
 
@@ -2278,35 +2667,38 @@ msgstr ""
 msgid "Direction:"
 msgstr ""
 
-#: bundle_manager.cc:206 bundle_manager.cc:210 engine_dialog.cc:662
-#: mixer_strip.cc:162 mixer_strip.cc:367 mixer_strip.cc:2240
-#: rc_option_editor.cc:2326
+#: bundle_manager.cc:206 bundle_manager.cc:210 engine_dialog.cc:976
+#: mixer_strip.cc:175 mixer_strip.cc:392 mixer_strip.cc:2451
+#: rc_option_editor.cc:3135
 msgid "Input"
 msgstr ""
 
 #: bundle_manager.cc:207 bundle_manager.cc:212 bundle_manager.cc:246
-#: engine_dialog.cc:664 mixer_strip.cc:166 mixer_strip.cc:371
-#: mixer_strip.cc:2243 rc_option_editor.cc:2330
+#: engine_dialog.cc:978 mixer_strip.cc:179 mixer_strip.cc:396
+#: mixer_strip.cc:2454 monitor_section.cc:296 monitor_section.cc:300
+#: rc_option_editor.cc:3139
 msgid "Output"
 msgstr ""
 
-#: bundle_manager.cc:265 editor.cc:1945 editor_actions.cc:94
-#: editor_actions.cc:104 rc_option_editor.cc:1087 rc_option_editor.cc:1094
+#: bundle_manager.cc:265 editor.cc:2075 editor_actions.cc:97
+#: editor_actions.cc:107 lua_script_manager.cc:33 rc_option_editor.cc:2928
+#: rc_option_editor.cc:2942
 msgid "Edit"
 msgstr ""
 
-#: bundle_manager.cc:266 editor.cc:5902 editor.cc:5930 editor_actions.cc:338
-#: editor_actions.cc:339 editor_actions.cc:405 plugin_ui.cc:420
-#: processor_box.cc:2458 route_time_axis.cc:859
+#: bundle_manager.cc:266 editor.cc:5962 editor.cc:5992 editor_actions.cc:360
+#: editor_actions.cc:361 luawindow.cc:101 plugin_ui.cc:420
+#: processor_box.cc:3669 processor_box.cc:3671
 msgid "Delete"
 msgstr ""
 
-#: bundle_manager.cc:272 bundle_manager.cc:439 editor_route_groups.cc:97
-#: editor_routes.cc:206 midi_list_editor.cc:107 session_metadata_dialog.cc:646
+#: bundle_manager.cc:272 bundle_manager.cc:439 editor_route_groups.cc:98
+#: editor_routes.cc:233 lua_script_manager.cc:42 lua_script_manager.cc:76
+#: midi_list_editor.cc:107 session_metadata_dialog.cc:649
 msgid "Name"
 msgstr ""
 
-#: bundle_manager.cc:283
+#: bundle_manager.cc:283 luawindow.cc:566
 msgid "New"
 msgstr ""
 
@@ -2322,6 +2714,38 @@ msgstr ""
 msgid "Rename Channel"
 msgstr ""
 
+#: color_theme_manager.cc:58
+msgid "Restore Defaults"
+msgstr ""
+
+#: color_theme_manager.cc:62
+msgid "Color Theme"
+msgstr "Colour Theme"
+
+#: color_theme_manager.cc:126
+msgid "Object"
+msgstr ""
+
+#: color_theme_manager.cc:129 route_group_dialog.cc:53 route_group_dialog.cc:81
+msgid "Color"
+msgstr "Colour"
+
+#: color_theme_manager.cc:151
+msgid "Items"
+msgstr ""
+
+#: color_theme_manager.cc:152
+msgid "Palette"
+msgstr ""
+
+#: color_theme_manager.cc:153
+msgid "Transparency"
+msgstr ""
+
+#: color_theme_manager.cc:475
+msgid "Color Palette"
+msgstr "Colour Palette"
+
 #: configinfo.cc:28
 msgid "Build Configuration"
 msgstr ""
@@ -2334,6 +2758,42 @@ msgstr ""
 msgid "Value"
 msgstr ""
 
+#: control_slave_ui.cc:50 mixer_ui.cc:254
+msgid "Control Masters"
+msgstr ""
+
+#: control_slave_ui.cc:54
+msgid "-vca-"
+msgstr ""
+
+#: control_slave_ui.cc:211
+msgid "Unassign All"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:35
+msgid "Duplicate Tracks & Busses"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:36
+msgid "Copy playlists"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:37
+msgid "Create new (empty) playlists"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:38
+msgid "Share playlists"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:41
+msgid "Duplicate each track/bus this number of times:"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:176
+msgid "1 or more tracks/busses could not be duplicated"
+msgstr ""
+
 #: edit_note_dialog.cc:42
 msgid "Note"
 msgstr ""
@@ -2371,2060 +2831,2155 @@ msgstr ""
 msgid "Velocity"
 msgstr ""
 
-#: edit_note_dialog.cc:88 patch_change_dialog.cc:66
+#: edit_note_dialog.cc:88 export_report.cc:246 export_report.cc:688
+#: patch_change_dialog.cc:66
 msgid "Time"
 msgstr ""
 
-#: edit_note_dialog.cc:98 editor_regions.cc:115
-#: export_timespan_selector.cc:378 export_timespan_selector.cc:440
-#: location_ui.cc:320 midi_list_editor.cc:115 time_info_box.cc:108
+#: edit_note_dialog.cc:99 editor_regions.cc:162 export_timespan_selector.cc:375
+#: export_timespan_selector.cc:437 location_ui.cc:322 midi_list_editor.cc:115
+#: time_info_box.cc:102
 msgid "Length"
 msgstr ""
 
-#: edit_note_dialog.cc:165
+#: edit_note_dialog.cc:166
 msgid "edit note"
 msgstr ""
 
-#: editor.cc:147
+#: editor.cc:160
 msgid "CD Frames"
 msgstr ""
 
-#: editor.cc:148
+#: editor.cc:161
 msgid "TC Frames"
 msgstr ""
 
-#: editor.cc:149
+#: editor.cc:162
 msgid "TC Seconds"
 msgstr ""
 
-#: editor.cc:150
+#: editor.cc:163
 msgid "TC Minutes"
 msgstr ""
 
-#: editor.cc:151
+#: editor.cc:164
 msgid "Seconds"
 msgstr ""
 
-#: editor.cc:152
+#: editor.cc:165
 msgid "Minutes"
 msgstr ""
 
-#: editor.cc:153 quantize_dialog.cc:37 quantize_dialog.cc:141
+#: editor.cc:166 quantize_dialog.cc:37
 msgid "Beats/128"
 msgstr ""
 
-#: editor.cc:154 quantize_dialog.cc:38 quantize_dialog.cc:143
+#: editor.cc:167 quantize_dialog.cc:38
 msgid "Beats/64"
 msgstr ""
 
-#: editor.cc:155 quantize_dialog.cc:39 quantize_dialog.cc:145
+#: editor.cc:168 quantize_dialog.cc:39
 msgid "Beats/32"
 msgstr ""
 
-#: editor.cc:156
+#: editor.cc:169 quantize_dialog.cc:40
 msgid "Beats/28"
 msgstr ""
 
-#: editor.cc:157
+#: editor.cc:170 quantize_dialog.cc:41
 msgid "Beats/24"
 msgstr ""
 
-#: editor.cc:158
+#: editor.cc:171 quantize_dialog.cc:42
 msgid "Beats/20"
 msgstr ""
 
-#: editor.cc:159 quantize_dialog.cc:40 quantize_dialog.cc:147
+#: editor.cc:172 quantize_dialog.cc:43
 msgid "Beats/16"
 msgstr ""
 
-#: editor.cc:160
+#: editor.cc:173 quantize_dialog.cc:44
 msgid "Beats/14"
 msgstr ""
 
-#: editor.cc:161
+#: editor.cc:174 quantize_dialog.cc:45
 msgid "Beats/12"
 msgstr ""
 
-#: editor.cc:162
+#: editor.cc:175 quantize_dialog.cc:46
 msgid "Beats/10"
 msgstr ""
 
-#: editor.cc:163 quantize_dialog.cc:41 quantize_dialog.cc:149
+#: editor.cc:176 quantize_dialog.cc:47
 msgid "Beats/8"
 msgstr ""
 
-#: editor.cc:164
+#: editor.cc:177 quantize_dialog.cc:48
 msgid "Beats/7"
 msgstr ""
 
-#: editor.cc:165
+#: editor.cc:178 quantize_dialog.cc:49
 msgid "Beats/6"
 msgstr ""
 
-#: editor.cc:166
+#: editor.cc:179 quantize_dialog.cc:50
 msgid "Beats/5"
 msgstr ""
 
-#: editor.cc:167 quantize_dialog.cc:42 quantize_dialog.cc:151
+#: editor.cc:180 quantize_dialog.cc:51
 msgid "Beats/4"
 msgstr ""
 
-#: editor.cc:168 quantize_dialog.cc:43 quantize_dialog.cc:153
+#: editor.cc:181 quantize_dialog.cc:52
 msgid "Beats/3"
 msgstr ""
 
-#: editor.cc:169 quantize_dialog.cc:44 quantize_dialog.cc:155
+#: editor.cc:182 quantize_dialog.cc:53
 msgid "Beats/2"
 msgstr ""
 
-#: editor.cc:170 quantize_dialog.cc:45 quantize_dialog.cc:157
+#: editor.cc:183 quantize_dialog.cc:54
 msgid "Beats"
 msgstr ""
 
-#: editor.cc:171
+#: editor.cc:184
 msgid "Bars"
 msgstr ""
 
-#: editor.cc:172
+#: editor.cc:185
 msgid "Marks"
 msgstr ""
 
-#: editor.cc:173
+#: editor.cc:186
 msgid "Region starts"
 msgstr ""
 
-#: editor.cc:174
+#: editor.cc:187
 msgid "Region ends"
 msgstr ""
 
-#: editor.cc:175
+#: editor.cc:188
 msgid "Region syncs"
 msgstr ""
 
-#: editor.cc:176
+#: editor.cc:189
 msgid "Region bounds"
 msgstr ""
 
-#: editor.cc:181 editor_actions.cc:510
+#: editor.cc:194 editor_actions.cc:551
 msgid "No Grid"
 msgstr ""
 
-#: editor.cc:182 editor_actions.cc:511
+#: editor.cc:195 editor_actions.cc:552
 msgid "Grid"
 msgstr ""
 
-#: editor.cc:183 editor_actions.cc:512
+#: editor.cc:196 editor_actions.cc:553
 msgid "Magnetic"
 msgstr ""
 
-#: editor.cc:188 editor.cc:206 editor_actions.cc:121 editor_actions.cc:493
+#: editor.cc:201 editor.cc:219 editor_actions.cc:124 editor_actions.cc:534
 msgid "Playhead"
 msgstr ""
 
-#: editor.cc:189 editor_actions.cc:495
+#: editor.cc:202 editor_actions.cc:536
 msgid "Marker"
 msgstr ""
 
-#: editor.cc:190 editor.cc:207 editor_actions.cc:494
+#: editor.cc:203 editor.cc:220 editor_actions.cc:535
 msgid "Mouse"
 msgstr ""
 
-#: editor.cc:195 editor_actions.cc:502
+#: editor.cc:208 editor_actions.cc:543
 msgid "Slide"
 msgstr ""
 
-#: editor.cc:196
+#: editor.cc:209
 msgid "Splice"
 msgstr ""
 
-#: editor.cc:197 editor_actions.cc:501
+#: editor.cc:210 editor_actions.cc:542
 msgid "Ripple"
 msgstr ""
 
-#: editor.cc:198 editor_actions.cc:157 editor_actions.cc:503
-#: editor_actions.cc:1789 editor_markers.cc:905 editor_rulers.cc:260
-#: location_ui.cc:58 mixer_strip.cc:195 mixer_strip.cc:2028
+#: editor.cc:211 editor_actions.cc:1806 editor_markers.cc:910
+#: editor_rulers.cc:259 location_ui.cc:62
 msgid "Lock"
 msgstr ""
 
-#: editor.cc:203 mono_panner_editor.cc:42
+#: editor.cc:216 mono_panner_editor.cc:44
 msgid "Left"
 msgstr ""
 
-#: editor.cc:204 mono_panner_editor.cc:47
+#: editor.cc:217 mono_panner_editor.cc:49
 msgid "Right"
 msgstr ""
 
-#: editor.cc:205
+#: editor.cc:218
 msgid "Center"
 msgstr "Centre"
 
-#: editor.cc:208 editor.cc:3231
+#: editor.cc:221
 msgid "Edit point"
 msgstr ""
 
-#: editor.cc:214
+#: editor.cc:227
 msgid "Mushy"
 msgstr ""
 
-#: editor.cc:215
+#: editor.cc:228
 msgid "Smooth"
 msgstr ""
 
-#: editor.cc:216
+#: editor.cc:229
 msgid "Balanced multitimbral mixture"
 msgstr ""
 
-#: editor.cc:217
+#: editor.cc:230
 msgid "Unpitched percussion with stable notes"
 msgstr ""
 
-#: editor.cc:218
+#: editor.cc:231
 msgid "Crisp monophonic instrumental"
 msgstr ""
 
-#: editor.cc:219
+#: editor.cc:232
 msgid "Unpitched solo percussion"
 msgstr ""
 
-#: editor.cc:220
+#: editor.cc:233
 msgid "Resample without preserving pitch"
 msgstr ""
 
-#: editor.cc:256
+#: editor.cc:319
 msgid "Mins:Secs"
 msgstr ""
 
-#: editor.cc:262
+#: editor.cc:325
 msgid "Location Markers"
 msgstr ""
 
-#: editor.cc:263
+#: editor.cc:326
 msgid "Range Markers"
 msgstr ""
 
-#: editor.cc:264
+#: editor.cc:327
 msgid "Loop/Punch Ranges"
 msgstr ""
 
-#: editor.cc:265 editor_actions.cc:565
+#: editor.cc:328 editor_actions.cc:606
 msgid "CD Markers"
 msgstr ""
 
-#: editor.cc:266
+#: editor.cc:329
 msgid "Video Timeline"
 msgstr ""
 
-#: editor.cc:283
+#: editor.cc:386
 msgid "mode"
 msgstr ""
 
-#: editor.cc:459 editor_actions.cc:114 editor_actions.cc:564
+#: editor.cc:535 editor_actions.cc:117 editor_actions.cc:605
 msgid "Markers"
 msgstr ""
 
-#: editor.cc:577 rc_option_editor.cc:1939
+#: editor.cc:653 rc_option_editor.cc:2527
 msgid "Regions"
 msgstr ""
 
-#: editor.cc:578
+#: editor.cc:654
 msgid "Tracks & Busses"
 msgstr ""
 
-#: editor.cc:579
+#: editor.cc:655
 msgid "Snapshots"
 msgstr ""
 
-#: editor.cc:580
+#: editor.cc:656
 msgid "Track & Bus Groups"
 msgstr ""
 
-#: editor.cc:581
+#: editor.cc:657
 msgid "Ranges & Marks"
 msgstr ""
 
-#: editor.cc:728 editor.cc:5754 rc_option_editor.cc:1619
-#: rc_option_editor.cc:1627 rc_option_editor.cc:1635 rc_option_editor.cc:1643
-#: rc_option_editor.cc:1667 rc_option_editor.cc:1679 rc_option_editor.cc:1681
-#: rc_option_editor.cc:1689 rc_option_editor.cc:1697 rc_option_editor.cc:1717
-#: rc_option_editor.cc:1729 rc_option_editor.cc:1731 rc_option_editor.cc:1733
-#: rc_option_editor.cc:1741 rc_option_editor.cc:1749 rc_option_editor.cc:1757
-#: rc_option_editor.cc:1772 rc_option_editor.cc:1776 rc_option_editor.cc:1800
-msgid "Editor"
-msgstr ""
-
-#: editor.cc:1331 editor.cc:4735 editor_actions.cc:134 editor_actions.cc:1865
+#: editor.cc:1333 editor.cc:4737 editor_actions.cc:137 editor_actions.cc:1882
 msgid "Loop"
 msgstr ""
 
-#: editor.cc:1337 editor.cc:4762 editor_actions.cc:135 time_info_box.cc:68
+#: editor.cc:1339 editor.cc:4764 editor_actions.cc:138 time_info_box.cc:62
 msgid "Punch"
 msgstr ""
 
-#: editor.cc:1449 rc_option_editor.cc:1661
+#: editor.cc:1474 rc_option_editor.cc:2299
 msgid "Linear (for highly correlated material)"
 msgstr ""
 
-#: editor.cc:1459 rc_option_editor.cc:1662
+#: editor.cc:1484 rc_option_editor.cc:2300
 msgid "Constant power"
 msgstr ""
 
-#: editor.cc:1468 rc_option_editor.cc:1663
+#: editor.cc:1493 rc_option_editor.cc:2301
 msgid "Symmetric"
 msgstr ""
 
-#: editor.cc:1478 rc_option_editor.cc:1664
+#: editor.cc:1503 rc_option_editor.cc:2302
 msgid "Slow"
 msgstr ""
 
-#: editor.cc:1487 rc_option_editor.cc:1665 sfdb_ui.cc:1771 sfdb_ui.cc:1881
+#: editor.cc:1512 rc_option_editor.cc:2303 sfdb_ui.cc:1737 sfdb_ui.cc:1847
 msgid "Fast"
 msgstr ""
 
-#: editor.cc:1509 editor.cc:1534
+#: editor.cc:1534 editor.cc:1559
 msgid "Deactivate"
 msgstr ""
 
-#: editor.cc:1511 editor.cc:1536
+#: editor.cc:1536 editor.cc:1561
 msgid "Activate"
 msgstr ""
 
-#: editor.cc:1637 editor.cc:1645 editor_ops.cc:3824
+#: editor.cc:1662 editor.cc:1670 editor_ops.cc:3921
 msgid "Freeze"
 msgstr ""
 
-#: editor.cc:1641
+#: editor.cc:1666
 msgid "Unfreeze"
 msgstr ""
 
-#: editor.cc:1780
-msgid "Selected Regions"
+#: editor.cc:1766
+msgid "Region Loudness Analysis"
 msgstr ""
 
-#: editor.cc:1816 editor_markers.cc:940
-msgid "Play Range"
+#: editor.cc:1785 editor.cc:1834
+msgid "Audio Report/Analysis"
 msgstr ""
 
-#: editor.cc:1817 editor_markers.cc:943
+#: editor.cc:1815
+msgid "Range Loudness Analysis"
+msgstr ""
+
+#: editor.cc:1901
+msgid "Selected Regions"
+msgstr ""
+
+#: editor.cc:1945 editor_markers.cc:945
+msgid "Play Range"
+msgstr ""
+
+#: editor.cc:1946 editor_markers.cc:948
 msgid "Loop Range"
 msgstr ""
 
-#: editor.cc:1820 editor_markers.cc:950
+#: editor.cc:1949 editor_markers.cc:953
 msgid "Zoom to Range"
 msgstr ""
 
-#: editor.cc:1829 editor_actions.cc:369
+#: editor.cc:1952
+msgid "Loudness Analysis"
+msgstr ""
+
+#: editor.cc:1959 editor_actions.cc:401
 msgid "Move Range Start to Previous Region Boundary"
 msgstr ""
 
-#: editor.cc:1836 editor_actions.cc:376
+#: editor.cc:1966 editor_actions.cc:408
 msgid "Move Range Start to Next Region Boundary"
 msgstr ""
 
-#: editor.cc:1843 editor_actions.cc:383
+#: editor.cc:1973 editor_actions.cc:415
 msgid "Move Range End to Previous Region Boundary"
 msgstr ""
 
-#: editor.cc:1850 editor_actions.cc:390
+#: editor.cc:1980 editor_actions.cc:422
 msgid "Move Range End to Next Region Boundary"
 msgstr ""
 
-#: editor.cc:1856 editor_actions.cc:133 editor_actions.cc:325
+#: editor.cc:1986 editor_actions.cc:136 editor_actions.cc:347
 msgid "Separate"
 msgstr ""
 
-#: editor.cc:1857
+#: editor.cc:1987
 msgid "Convert to Region in Region List"
 msgstr ""
 
-#: editor.cc:1860 editor_markers.cc:970
+#: editor.cc:1990 editor_markers.cc:973
 msgid "Select All in Range"
 msgstr ""
 
-#: editor.cc:1863 editor_actions.cc:297
+#: editor.cc:1993 editor_actions.cc:319
 msgid "Set Loop from Selection"
 msgstr ""
 
-#: editor.cc:1864 editor_actions.cc:298
+#: editor.cc:1994 editor_actions.cc:320
 msgid "Set Punch from Selection"
 msgstr ""
 
-#: editor.cc:1865 editor_actions.cc:299
+#: editor.cc:1995 editor_actions.cc:321
 msgid "Set Session Start/End from Selection"
 msgstr ""
 
-#: editor.cc:1868
+#: editor.cc:1998
 msgid "Add Range Markers"
 msgstr ""
 
-#: editor.cc:1871
+#: editor.cc:2001
 msgid "Crop Region to Range"
 msgstr ""
 
-#: editor.cc:1872
-msgid "Fill Range with Region"
-msgstr ""
-
-#: editor.cc:1873 editor_actions.cc:311
+#: editor.cc:2002 editor_actions.cc:333
 msgid "Duplicate Range"
 msgstr ""
 
-#: editor.cc:1876
+#: editor.cc:2005
 msgid "Consolidate Range"
 msgstr ""
 
-#: editor.cc:1877
-msgid "Consolidate Range With Processing"
+#: editor.cc:2006
+msgid "Consolidate Range with Processing"
 msgstr ""
 
-#: editor.cc:1878
+#: editor.cc:2007
 msgid "Bounce Range to Region List"
 msgstr ""
 
-#: editor.cc:1879
-msgid "Bounce Range to Region List With Processing"
+#: editor.cc:2008
+msgid "Bounce Range to Region List with Processing"
 msgstr ""
 
-#: editor.cc:1880 editor_markers.cc:953
+#: editor.cc:2009 editor_markers.cc:956
 msgid "Export Range..."
 msgstr ""
 
-#: editor.cc:1882
+#: editor.cc:2011
 msgid "Export Video Range..."
 msgstr ""
 
-#: editor.cc:1898 editor.cc:1979 editor_actions.cc:303
-msgid "Play From Edit Point"
+#: editor.cc:2027 editor.cc:2109 editor_actions.cc:325
+msgid "Play from Edit Point"
 msgstr ""
 
-#: editor.cc:1899 editor.cc:1980
-msgid "Play From Start"
+#: editor.cc:2028 editor.cc:2110
+msgid "Play from Start"
 msgstr ""
 
-#: editor.cc:1900
+#: editor.cc:2029
 msgid "Play Region"
 msgstr ""
 
-#: editor.cc:1902
+#: editor.cc:2031
 msgid "Loop Region"
 msgstr ""
 
-#: editor.cc:1912 editor.cc:1989
+#: editor.cc:2041 editor.cc:2119
 msgid "Select All in Track"
 msgstr ""
 
-#: editor.cc:1913 editor.cc:1990 editor_actions.cc:194
+#: editor.cc:2042 editor.cc:2120 editor_actions.cc:196
 msgid "Select All Objects"
 msgstr ""
 
-#: editor.cc:1914 editor.cc:1991
+#: editor.cc:2043 editor.cc:2121
 msgid "Invert Selection in Track"
 msgstr ""
 
-#: editor.cc:1915 editor.cc:1992 editor_actions.cc:197
+#: editor.cc:2044 editor.cc:2122 editor_actions.cc:199
 msgid "Invert Selection"
 msgstr ""
 
-#: editor.cc:1917
+#: editor.cc:2046 editor_actions.cc:201
 msgid "Set Range to Loop Range"
 msgstr ""
 
-#: editor.cc:1918
+#: editor.cc:2047 editor_actions.cc:202
 msgid "Set Range to Punch Range"
 msgstr ""
 
-#: editor.cc:1920 editor.cc:1994 editor_actions.cc:199 editor_actions.cc:200
+#: editor.cc:2048 editor_actions.cc:203
+msgid "Set Range to Selected Regions"
+msgstr ""
+
+#: editor.cc:2050 editor.cc:2124 editor_actions.cc:205 editor_actions.cc:206
 msgid "Select All After Edit Point"
 msgstr ""
 
-#: editor.cc:1921 editor.cc:1995 editor_actions.cc:201 editor_actions.cc:202
+#: editor.cc:2051 editor.cc:2125 editor_actions.cc:207 editor_actions.cc:208
 msgid "Select All Before Edit Point"
 msgstr ""
 
-#: editor.cc:1922 editor.cc:1996
+#: editor.cc:2052 editor.cc:2126
 msgid "Select All After Playhead"
 msgstr ""
 
-#: editor.cc:1923 editor.cc:1997
+#: editor.cc:2053 editor.cc:2127
 msgid "Select All Before Playhead"
 msgstr ""
 
-#: editor.cc:1924
+#: editor.cc:2054
 msgid "Select All Between Playhead and Edit Point"
 msgstr ""
 
-#: editor.cc:1925
+#: editor.cc:2055
 msgid "Select All Within Playhead and Edit Point"
 msgstr ""
 
-#: editor.cc:1926
+#: editor.cc:2056
 msgid "Select Range Between Playhead and Edit Point"
 msgstr ""
 
-#: editor.cc:1928 editor.cc:1999 editor_actions.cc:131 editor_actions.cc:132
+#: editor.cc:2058 editor.cc:2129 editor_actions.cc:134 editor_actions.cc:135
 msgid "Select"
 msgstr ""
 
-#: editor.cc:1936 editor.cc:2007 editor_actions.cc:337 processor_box.cc:2451
+#: editor.cc:2066 editor.cc:2137 editor_actions.cc:359 processor_box.cc:3665
 msgid "Cut"
 msgstr ""
 
-#: editor.cc:1937 editor.cc:2008 editor_actions.cc:341 processor_box.cc:2454
+#: editor.cc:2067 editor.cc:2138 editor_actions.cc:363 processor_box.cc:3667
 msgid "Copy"
 msgstr ""
 
-#: editor.cc:1938 editor.cc:2009 editor_actions.cc:342 processor_box.cc:2462
+#: editor.cc:2068 editor.cc:2139 editor_actions.cc:364 processor_box.cc:3679
 msgid "Paste"
 msgstr ""
 
-#: editor.cc:1942 editor_actions.cc:91
+#: editor.cc:2072 editor_actions.cc:94
 msgid "Align"
 msgstr ""
 
-#: editor.cc:1943
+#: editor.cc:2073
 msgid "Align Relative"
 msgstr ""
 
-#: editor.cc:1950
+#: editor.cc:2080
 msgid "Insert Selected Region"
 msgstr ""
 
-#: editor.cc:1951
+#: editor.cc:2081
 msgid "Insert Existing Media"
 msgstr ""
 
-#: editor.cc:1960 editor.cc:2016
+#: editor.cc:2090 editor.cc:2146
 msgid "Nudge Entire Track Later"
 msgstr ""
 
-#: editor.cc:1961 editor.cc:2017
+#: editor.cc:2091 editor.cc:2147
 msgid "Nudge Track After Edit Point Later"
 msgstr ""
 
-#: editor.cc:1962 editor.cc:2018
+#: editor.cc:2092 editor.cc:2148
 msgid "Nudge Entire Track Earlier"
 msgstr ""
 
-#: editor.cc:1963 editor.cc:2019
+#: editor.cc:2093 editor.cc:2149
 msgid "Nudge Track After Edit Point Earlier"
 msgstr ""
 
-#: editor.cc:1965 editor.cc:2021
+#: editor.cc:2095 editor.cc:2151
 msgid "Nudge"
 msgstr ""
 
-#: editor.cc:2235
+#: editor.cc:2353
 msgid ""
 "Playhead position stored with a negative value - ignored (use zero instead)"
 msgstr ""
 
-#: editor.cc:3006 editor.cc:3707 editor.cc:3778 midi_channel_selector.cc:157
+#: editor.cc:3115 editor.cc:3775 editor.cc:3846 midi_channel_selector.cc:157
 #: midi_channel_selector.cc:395 midi_channel_selector.cc:431
 msgid "All"
 msgstr ""
 
-#: editor.cc:3210
-msgid "Smart Mode (add Range functions to Grab mode)"
+#: editor.cc:3280
+msgid "Smart Mode (add range functions to Grab Mode)"
 msgstr ""
 
-#: editor.cc:3211
+#: editor.cc:3281
 msgid "Grab Mode (select/move objects)"
 msgstr ""
 
-#: editor.cc:3212
+#: editor.cc:3282
 msgid "Cut Mode (split regions)"
 msgstr ""
 
-#: editor.cc:3213
+#: editor.cc:3283
 msgid "Range Mode (select time ranges)"
 msgstr ""
 
-#: editor.cc:3214
+#: editor.cc:3284
 msgid "Draw Mode (draw and edit gain/notes/automation)"
 msgstr ""
 
-#: editor.cc:3215
+#: editor.cc:3285
 msgid "Stretch Mode (time-stretch audio and midi regions, preserving pitch)"
 msgstr ""
 
-#: editor.cc:3216
+#: editor.cc:3286
 msgid "Audition Mode (listen to regions)"
 msgstr ""
 
-#: editor.cc:3217
-msgid "Internal Edit Mode (edit notes and gain curves inside regions)"
+#: editor.cc:3287
+msgid "Internal Edit Mode (edit notes and automation points)"
 msgstr ""
 
-#: editor.cc:3218
+#: editor.cc:3288
 msgid ""
 "Groups: click to (de)activate\n"
 "Context-click for other operations"
 msgstr ""
 
-#: editor.cc:3219
+#: editor.cc:3289
 msgid "Nudge Region/Selection Later"
 msgstr ""
 
-#: editor.cc:3220
+#: editor.cc:3290
 msgid "Nudge Region/Selection Earlier"
 msgstr ""
 
-#: editor.cc:3221 editor_actions.cc:262
+#: editor.cc:3291 editor_actions.cc:272
 msgid "Zoom In"
 msgstr ""
 
-#: editor.cc:3222 editor_actions.cc:261
+#: editor.cc:3292 editor_actions.cc:271
 msgid "Zoom Out"
 msgstr ""
 
-#: editor.cc:3223
+#: editor.cc:3293
 msgid "Zoom to Time Scale"
 msgstr ""
 
-#: editor.cc:3224 editor.cc:3729 editor_actions.cc:263
+#: editor.cc:3294 editor.cc:3797 editor_actions.cc:273
 msgid "Zoom to Session"
 msgstr ""
 
-#: editor.cc:3225
-msgid "Zoom focus"
+#: editor.cc:3295 editor_actions.cc:115 editor_actions.cc:148
+msgid "Zoom Focus"
 msgstr ""
 
-#: editor.cc:3226
+#: editor.cc:3296
 msgid "Expand Tracks"
 msgstr ""
 
-#: editor.cc:3227
+#: editor.cc:3297
 msgid "Shrink Tracks"
 msgstr ""
 
-#: editor.cc:3228
+#: editor.cc:3298
 msgid "Number of visible tracks"
 msgstr ""
 
-#: editor.cc:3229
+#: editor.cc:3299
 msgid "Snap/Grid Units"
 msgstr ""
 
-#: editor.cc:3230
+#: editor.cc:3300
 msgid "Snap/Grid Mode"
 msgstr ""
 
-#: editor.cc:3232
+#: editor.cc:3301 editor_actions.cc:101
+msgid "Edit Point"
+msgstr ""
+
+#: editor.cc:3302
 msgid "Edit Mode"
 msgstr ""
 
-#: editor.cc:3233
+#: editor.cc:3303
 msgid ""
 "Nudge Clock\n"
 "(controls distance used to nudge regions and selections)"
 msgstr ""
 
-#: editor.cc:3501 editor_actions.cc:313
+#: editor.cc:3571 editor_actions.cc:335
 msgid "Command|Undo"
 msgstr ""
 
-#: editor.cc:3503
+#: editor.cc:3573
 msgid "Command|Undo (%1)"
 msgstr ""
 
-#: editor.cc:3510 editor_actions.cc:315 editor_actions.cc:316
-#: editor_actions.cc:317
+#: editor.cc:3580 editor_actions.cc:337 editor_actions.cc:338
+#: editor_actions.cc:339
 msgid "Redo"
 msgstr ""
 
-#: editor.cc:3512
+#: editor.cc:3583
 msgid "Redo (%1)"
 msgstr ""
 
-#: editor.cc:3531 editor.cc:3555 editor_actions.cc:110 editor_actions.cc:1846
+#: editor.cc:3603 editor.cc:3627 editor_actions.cc:113 editor_actions.cc:1863
 msgid "Duplicate"
 msgstr ""
 
-#: editor.cc:3532
+#: editor.cc:3604
 msgid "Number of duplications:"
 msgstr ""
 
-#: editor.cc:3706 route_group_dialog.cc:51 time_info_box.cc:67
+#: editor.cc:3774 route_group_dialog.cc:51 time_info_box.cc:61
 msgid "Selection"
 msgstr ""
 
-#: editor.cc:3709
+#: editor.cc:3777
 msgid "Fit 1 track"
 msgstr ""
 
-#: editor.cc:3710
+#: editor.cc:3778
 msgid "Fit 2 tracks"
 msgstr ""
 
-#: editor.cc:3711
+#: editor.cc:3779
 msgid "Fit 4 tracks"
 msgstr ""
 
-#: editor.cc:3712
+#: editor.cc:3780
 msgid "Fit 8 tracks"
 msgstr ""
 
-#: editor.cc:3713
+#: editor.cc:3781
 msgid "Fit 16 tracks"
 msgstr ""
 
-#: editor.cc:3714
+#: editor.cc:3782
 msgid "Fit 24 tracks"
 msgstr ""
 
-#: editor.cc:3715
+#: editor.cc:3783
 msgid "Fit 32 tracks"
 msgstr ""
 
-#: editor.cc:3716
+#: editor.cc:3784
 msgid "Fit 48 tracks"
 msgstr ""
 
-#: editor.cc:3717
+#: editor.cc:3785
 msgid "Fit All tracks"
 msgstr ""
 
-#: editor.cc:3718
+#: editor.cc:3786
 msgid "Fit Selection"
 msgstr ""
 
-#: editor.cc:3720
+#: editor.cc:3788 editor_actions.cc:288
 msgid "Zoom to 10 ms"
 msgstr ""
 
-#: editor.cc:3721
+#: editor.cc:3789 editor_actions.cc:289
 msgid "Zoom to 100 ms"
 msgstr ""
 
-#: editor.cc:3722
+#: editor.cc:3790 editor_actions.cc:290
 msgid "Zoom to 1 sec"
 msgstr ""
 
-#: editor.cc:3723
+#: editor.cc:3791 editor_actions.cc:291
 msgid "Zoom to 10 sec"
 msgstr ""
 
-#: editor.cc:3724
+#: editor.cc:3792 editor_actions.cc:292
 msgid "Zoom to 1 min"
 msgstr ""
 
-#: editor.cc:3725
+#: editor.cc:3793 editor_actions.cc:294
 msgid "Zoom to 10 min"
 msgstr ""
 
-#: editor.cc:3726
+#: editor.cc:3794
 msgid "Zoom to 1 hour"
 msgstr ""
 
-#: editor.cc:3727
+#: editor.cc:3795
 msgid "Zoom to 8 hours"
 msgstr ""
 
-#: editor.cc:3728
+#: editor.cc:3796
 msgid "Zoom to 24 hours"
 msgstr ""
 
-#: editor.cc:3730
+#: editor.cc:3798
 msgid "Zoom to Range/Region Selection"
 msgstr ""
 
-#: editor.cc:3800
+#: editor.cc:3868
 msgid "*"
 msgstr ""
 
-#: editor.cc:4120
+#: editor.cc:4135
 msgid "Playlist Deletion"
 msgstr ""
 
-#: editor.cc:4121
+#: editor.cc:4136
 msgid ""
 "Playlist %1 is currently unused.\n"
 "If it is kept, its audio files will not be cleaned.\n"
 "If it is deleted, audio files used by it alone will be cleaned."
 msgstr ""
 
-#: editor.cc:4131
+#: editor.cc:4146
+msgid "Delete All Unused"
+msgstr ""
+
+#: editor.cc:4147
 msgid "Delete Playlist"
 msgstr ""
 
-#: editor.cc:4132
+#: editor.cc:4148
 msgid "Keep Playlist"
 msgstr ""
 
-#: editor.cc:4133 editor_audio_import.cc:594 editor_ops.cc:6174
-#: engine_dialog.cc:2083 sfdb_freesound_mootcher.cc:69 processor_box.cc:2219
-#: processor_box.cc:2244
+#: editor.cc:4149
+msgid "Keep Remaining"
+msgstr ""
+
+#: editor.cc:4150 editor_audio_import.cc:600 editor_ops.cc:6530
+#: engine_dialog.cc:2986 sfdb_freesound_mootcher.cc:69 processor_box.cc:3431
+#: processor_box.cc:3456
 msgid "Cancel"
 msgstr ""
 
-#: editor.cc:4275
+#: editor.cc:4292
 msgid "new playlists"
 msgstr ""
 
-#: editor.cc:4291
+#: editor.cc:4308
 msgid "copy playlists"
 msgstr ""
 
-#: editor.cc:4306
+#: editor.cc:4323
 msgid "clear playlists"
 msgstr ""
 
-#: editor.cc:5046
+#: editor.cc:5048
 msgid "Please wait while %1 loads visual data."
 msgstr ""
 
-#: editor.cc:5901 editor.cc:5932 editor_markers.cc:985 panner_ui.cc:410
-#: processor_box.cc:2482
+#: editor.cc:5811 editor_actions.cc:479
+msgid "Unset #%1"
+msgstr ""
+
+#: editor.cc:5812 editor_actions.cc:481
+msgid "no action bound"
+msgstr ""
+
+#: editor.cc:5961 editor.cc:5996 editor_markers.cc:998 editor_markers.cc:1018
+#: panner_ui.cc:412 processor_box.cc:3703
 msgid "Edit..."
 msgstr ""
 
-#: editor.cc:5934 editor_actions.cc:1941
+#: editor.cc:6002 editor_actions.cc:1842
+msgid "Transpose..."
+msgstr ""
+
+#: editor.cc:6006 editor_actions.cc:1959
 msgid "Legatize"
 msgstr ""
 
-#: editor.cc:5936 editor_actions.cc:1940
+#: editor.cc:6012 editor_actions.cc:1958
 msgid "Quantize..."
 msgstr "Quantise..."
 
-#: editor.cc:5938 editor_actions.cc:1943
+#: editor.cc:6015 editor_actions.cc:1961
 msgid "Remove Overlap"
 msgstr ""
 
-#: editor.cc:5940 editor_actions.cc:1942
+#: editor.cc:6021 editor_actions.cc:1960
 msgid "Transform..."
 msgstr ""
 
-#: editor_actions.cc:92
+#: editor_actions.cc:95
 msgid "Autoconnect"
 msgstr ""
 
-#: editor_actions.cc:93
+#: editor_actions.cc:96
 msgid "Crossfades"
 msgstr ""
 
-#: editor_actions.cc:95
+#: editor_actions.cc:98
 msgid "Move Selected Marker"
 msgstr ""
 
-#: editor_actions.cc:96
+#: editor_actions.cc:99
 msgid "Select Range Operations"
 msgstr ""
 
-#: editor_actions.cc:97
+#: editor_actions.cc:100
 msgid "Select Regions"
 msgstr ""
 
-#: editor_actions.cc:98
-msgid "Edit Point"
-msgstr ""
-
-#: editor_actions.cc:99
+#: editor_actions.cc:102
 msgid "Fade"
 msgstr ""
 
-#: editor_actions.cc:100
+#: editor_actions.cc:103
 msgid "Latch"
 msgstr ""
 
-#: editor_actions.cc:101 editor_regions.cc:112 region_editor.cc:46
+#: editor_actions.cc:104 editor_regions.cc:159 region_editor.cc:48
 msgid "Region"
 msgstr ""
 
-#: editor_actions.cc:102
+#: editor_actions.cc:105
 msgid "Layering"
 msgstr ""
 
-#: editor_actions.cc:103 editor_regions.cc:113 stereo_panner_editor.cc:44
+#: editor_actions.cc:106 editor_regions.cc:160 stereo_panner_editor.cc:46
 msgid "Position"
 msgstr ""
 
-#: editor_actions.cc:105 gain_meter.cc:156 gain_meter.cc:825 panner_ui.cc:178
-#: panner_ui.cc:635
+#: editor_actions.cc:108 gain_meter.cc:161 gain_meter.cc:848 panner_ui.cc:178
+#: panner_ui.cc:637 route_time_axis.cc:541
 msgid "Trim"
 msgstr ""
 
-#: editor_actions.cc:106 editor_actions.cc:126 route_group_dialog.cc:46
+#: editor_actions.cc:109 editor_actions.cc:129 route_group_dialog.cc:46
 msgid "Gain"
 msgstr ""
 
-#: editor_actions.cc:107 editor_actions.cc:563
+#: editor_actions.cc:110 editor_actions.cc:604
 msgid "Ranges"
 msgstr ""
 
-#: editor_actions.cc:108 editor_actions.cc:1842 session_option_editor.cc:135
+#: editor_actions.cc:111 editor_actions.cc:1859 session_option_editor.cc:135
 #: session_option_editor.cc:144 session_option_editor.cc:151
+#: session_option_editor.cc:158 session_option_editor.cc:165
 msgid "Fades"
 msgstr ""
 
-#: editor_actions.cc:111
+#: editor_actions.cc:114
 msgid "Link"
 msgstr ""
 
-#: editor_actions.cc:112 editor_actions.cc:145
-msgid "Zoom Focus"
-msgstr ""
-
-#: editor_actions.cc:113
+#: editor_actions.cc:116
 msgid "Locate to Markers"
 msgstr ""
 
-#: editor_actions.cc:115
+#: editor_actions.cc:118
 msgid "Meter falloff"
 msgstr ""
 
-#: editor_actions.cc:116
+#: editor_actions.cc:119
 msgid "Meter hold"
 msgstr ""
 
-#: editor_actions.cc:117 session_option_editor.cc:321
+#: editor_actions.cc:120 session_option_editor.cc:342
 msgid "MIDI Options"
 msgstr ""
 
-#: editor_actions.cc:118
+#: editor_actions.cc:121
 msgid "Misc Options"
 msgstr ""
 
-#: editor_actions.cc:119 rc_option_editor.cc:1809 route_group_dialog.cc:54
-#: session_option_editor.cc:243 session_option_editor.cc:250
+#: editor_actions.cc:122 rc_option_editor.cc:2401 route_group_dialog.cc:54
+#: session_option_editor.cc:264 session_option_editor.cc:271
 msgid "Monitoring"
 msgstr ""
 
-#: editor_actions.cc:120
+#: editor_actions.cc:123
 msgid "Active Mark"
 msgstr ""
 
-#: editor_actions.cc:123
+#: editor_actions.cc:126
 msgid "Primary Clock"
 msgstr ""
 
-#: editor_actions.cc:124
+#: editor_actions.cc:127
 msgid "Pullup / Pulldown"
 msgstr ""
 
-#: editor_actions.cc:125
+#: editor_actions.cc:128
 msgid "Region operations"
 msgstr ""
 
-#: editor_actions.cc:127 ruler_dialog.cc:28
+#: editor_actions.cc:130 ruler_dialog.cc:28
 msgid "Rulers"
 msgstr ""
 
-#: editor_actions.cc:128
+#: editor_actions.cc:131
 msgid "Views"
 msgstr ""
 
-#: editor_actions.cc:129
+#: editor_actions.cc:132
 msgid "Scroll"
 msgstr ""
 
-#: editor_actions.cc:130
+#: editor_actions.cc:133
 msgid "Secondary Clock"
 msgstr ""
 
-#: editor_actions.cc:137
+#: editor_actions.cc:140
 msgid "Subframes"
 msgstr ""
 
-#: editor_actions.cc:140
+#: editor_actions.cc:143
 msgid "Timecode fps"
 msgstr ""
 
-#: editor_actions.cc:141 route_time_axis.cc:575
+#: editor_actions.cc:144 route_time_axis.cc:599
 msgid "Height"
 msgstr ""
 
-#: editor_actions.cc:143
+#: editor_actions.cc:146
 msgid "Tools"
 msgstr ""
 
-#: editor_actions.cc:144
+#: editor_actions.cc:147
 msgid "View"
 msgstr ""
 
-#: editor_actions.cc:146
+#: editor_actions.cc:149
 msgid "Zoom"
 msgstr ""
 
-#: editor_actions.cc:152
-msgid "Break drag or deselect all"
+#: editor_actions.cc:150
+msgid "Scripted Actions"
 msgstr ""
 
 #: editor_actions.cc:159
+msgid "Session|Lock"
+msgstr ""
+
+#: editor_actions.cc:161
 msgid "Show Editor Mixer"
 msgstr ""
 
-#: editor_actions.cc:160
+#: editor_actions.cc:162
 msgid "Show Editor List"
 msgstr ""
 
-#: editor_actions.cc:162
+#: editor_actions.cc:164
 msgid "Playhead to Next Region Boundary"
 msgstr ""
 
-#: editor_actions.cc:163
+#: editor_actions.cc:165
 msgid "Playhead to Next Region Boundary (No Track Selection)"
 msgstr ""
 
-#: editor_actions.cc:164
+#: editor_actions.cc:166
 msgid "Playhead to Previous Region Boundary"
 msgstr ""
 
-#: editor_actions.cc:165
+#: editor_actions.cc:167
 msgid "Playhead to Previous Region Boundary (No Track Selection)"
 msgstr ""
 
-#: editor_actions.cc:167
+#: editor_actions.cc:169
 msgid "Playhead to Next Region Start"
 msgstr ""
 
-#: editor_actions.cc:168
+#: editor_actions.cc:170
 msgid "Playhead to Next Region End"
 msgstr ""
 
-#: editor_actions.cc:169
+#: editor_actions.cc:171
 msgid "Playhead to Next Region Sync"
 msgstr ""
 
-#: editor_actions.cc:171
+#: editor_actions.cc:173
 msgid "Playhead to Previous Region Start"
 msgstr ""
 
-#: editor_actions.cc:172
+#: editor_actions.cc:174
 msgid "Playhead to Previous Region End"
 msgstr ""
 
-#: editor_actions.cc:173
+#: editor_actions.cc:175
 msgid "Playhead to Previous Region Sync"
 msgstr ""
 
-#: editor_actions.cc:175
+#: editor_actions.cc:177
 msgid "To Next Region Boundary"
 msgstr ""
 
-#: editor_actions.cc:176
+#: editor_actions.cc:178
 msgid "To Next Region Boundary (No Track Selection)"
 msgstr ""
 
-#: editor_actions.cc:177
+#: editor_actions.cc:179
 msgid "To Previous Region Boundary"
 msgstr ""
 
-#: editor_actions.cc:178
+#: editor_actions.cc:180
 msgid "To Previous Region Boundary (No Track Selection)"
 msgstr ""
 
-#: editor_actions.cc:180
+#: editor_actions.cc:182
 msgid "To Next Region Start"
 msgstr ""
 
-#: editor_actions.cc:181
+#: editor_actions.cc:183
 msgid "To Next Region End"
 msgstr ""
 
-#: editor_actions.cc:182
+#: editor_actions.cc:184
 msgid "To Next Region Sync"
 msgstr ""
 
-#: editor_actions.cc:184
+#: editor_actions.cc:186
 msgid "To Previous Region Start"
 msgstr ""
 
-#: editor_actions.cc:185
+#: editor_actions.cc:187
 msgid "To Previous Region End"
 msgstr ""
 
-#: editor_actions.cc:186
+#: editor_actions.cc:188
 msgid "To Previous Region Sync"
 msgstr ""
 
-#: editor_actions.cc:188
+#: editor_actions.cc:190
 msgid "To Range Start"
 msgstr ""
 
-#: editor_actions.cc:189
+#: editor_actions.cc:191
 msgid "To Range End"
 msgstr ""
 
-#: editor_actions.cc:191
+#: editor_actions.cc:193
 msgid "Playhead to Range Start"
 msgstr ""
 
-#: editor_actions.cc:192
+#: editor_actions.cc:194
 msgid "Playhead to Range End"
 msgstr ""
 
-#: editor_actions.cc:195
+#: editor_actions.cc:197
 msgid "Select All Tracks"
 msgstr ""
 
-#: editor_actions.cc:196 export_timespan_selector.cc:61 processor_box.cc:2468
+#: editor_actions.cc:198 export_timespan_selector.cc:59 processor_box.cc:3685
 msgid "Deselect All"
 msgstr ""
 
-#: editor_actions.cc:204
+#: editor_actions.cc:210
 msgid "Select All Overlapping Edit Range"
 msgstr ""
 
-#: editor_actions.cc:205
+#: editor_actions.cc:211
 msgid "Select All Inside Edit Range"
 msgstr ""
 
-#: editor_actions.cc:207
+#: editor_actions.cc:213
 msgid "Select Edit Range"
 msgstr ""
 
-#: editor_actions.cc:209
+#: editor_actions.cc:215
 msgid "Select All in Punch Range"
 msgstr ""
 
-#: editor_actions.cc:210
+#: editor_actions.cc:216
 msgid "Select All in Loop Range"
 msgstr ""
 
-#: editor_actions.cc:212
+#: editor_actions.cc:218
 msgid "Select Next Track or Bus"
 msgstr ""
 
-#: editor_actions.cc:213
+#: editor_actions.cc:219
 msgid "Select Previous Track or Bus"
 msgstr ""
 
-#: editor_actions.cc:215
+#: editor_actions.cc:221
 msgid "Toggle Record Enable"
 msgstr ""
 
-#: editor_actions.cc:217
+#: editor_actions.cc:223
 msgid "Toggle Solo"
 msgstr ""
 
-#: editor_actions.cc:219
+#: editor_actions.cc:225
 msgid "Toggle Mute"
 msgstr ""
 
-#: editor_actions.cc:221
+#: editor_actions.cc:227
 msgid "Toggle Solo Isolate"
 msgstr ""
 
-#: editor_actions.cc:226
+#: editor_actions.cc:232
 msgid "Save View %1"
 msgstr ""
 
-#: editor_actions.cc:232
+#: editor_actions.cc:238
 msgid "Go to View %1"
 msgstr ""
 
-#: editor_actions.cc:238
+#: editor_actions.cc:244
 msgid "Locate to Mark %1"
 msgstr ""
 
-#: editor_actions.cc:242 editor_actions.cc:243
+#: editor_actions.cc:249 editor_actions.cc:250
 msgid "Jump to Next Mark"
 msgstr ""
 
-#: editor_actions.cc:244 editor_actions.cc:245
+#: editor_actions.cc:251 editor_actions.cc:252
 msgid "Jump to Previous Mark"
 msgstr ""
 
-#: editor_actions.cc:247 editor_actions.cc:248
+#: editor_actions.cc:254
+msgid "Set Session Start from Playhead"
+msgstr ""
+
+#: editor_actions.cc:255
+msgid "Set Session End from Playhead"
+msgstr ""
+
+#: editor_actions.cc:257 editor_actions.cc:258
 msgid "Add Mark from Playhead"
 msgstr ""
 
-#: editor_actions.cc:250 editor_actions.cc:251
+#: editor_actions.cc:260 editor_actions.cc:261
 msgid "Remove Mark at Playhead"
 msgstr ""
 
-#: editor_actions.cc:253
+#: editor_actions.cc:263
 msgid "Nudge Next Later"
 msgstr ""
 
-#: editor_actions.cc:254
+#: editor_actions.cc:264
 msgid "Nudge Next Earlier"
 msgstr ""
 
-#: editor_actions.cc:256
+#: editor_actions.cc:266
 msgid "Nudge Playhead Forward"
 msgstr ""
 
-#: editor_actions.cc:257
+#: editor_actions.cc:267
 msgid "Nudge Playhead Backward"
 msgstr ""
 
-#: editor_actions.cc:258
-msgid "Playhead To Next Grid"
+#: editor_actions.cc:268
+msgid "Playhead to Next Grid"
 msgstr ""
 
-#: editor_actions.cc:259
-msgid "Playhead To Previous Grid"
+#: editor_actions.cc:269
+msgid "Playhead to Previous Grid"
 msgstr ""
 
-#: editor_actions.cc:264
+#: editor_actions.cc:274
 msgid "Zoom to Selection"
 msgstr ""
 
-#: editor_actions.cc:265
+#: editor_actions.cc:275
 msgid "Toggle Zoom State"
 msgstr ""
 
-#: editor_actions.cc:267
+#: editor_actions.cc:277
 msgid "Expand Track Height"
 msgstr ""
 
-#: editor_actions.cc:268
+#: editor_actions.cc:278
 msgid "Shrink Track Height"
 msgstr ""
 
-#: editor_actions.cc:270
+#: editor_actions.cc:280
+msgid "Fit 1 Track"
+msgstr ""
+
+#: editor_actions.cc:281
+msgid "Fit 2 Tracks"
+msgstr ""
+
+#: editor_actions.cc:282
+msgid "Fit 4 Tracks"
+msgstr ""
+
+#: editor_actions.cc:283
+msgid "Fit 8 Tracks"
+msgstr ""
+
+#: editor_actions.cc:284
+msgid "Fit 16 Tracks"
+msgstr ""
+
+#: editor_actions.cc:285
+msgid "Fit 32 Tracks"
+msgstr ""
+
+#: editor_actions.cc:286
+msgid "Fit All Tracks"
+msgstr ""
+
+#: editor_actions.cc:293
+msgid "Zoom to 5 min"
+msgstr ""
+
+#: editor_actions.cc:296
 msgid "Move Selected Tracks Up"
 msgstr ""
 
-#: editor_actions.cc:272
+#: editor_actions.cc:298
 msgid "Move Selected Tracks Down"
 msgstr ""
 
-#: editor_actions.cc:275
+#: editor_actions.cc:301
 msgid "Scroll Tracks Up"
 msgstr ""
 
-#: editor_actions.cc:277
+#: editor_actions.cc:302
 msgid "Scroll Tracks Down"
 msgstr ""
 
-#: editor_actions.cc:279
+#: editor_actions.cc:303
 msgid "Step Tracks Up"
 msgstr ""
 
-#: editor_actions.cc:281
+#: editor_actions.cc:304
 msgid "Step Tracks Down"
 msgstr ""
 
-#: editor_actions.cc:284
+#: editor_actions.cc:306
 msgid "Scroll Backward"
 msgstr ""
 
-#: editor_actions.cc:285
+#: editor_actions.cc:307
 msgid "Scroll Forward"
 msgstr ""
 
-#: editor_actions.cc:286
+#: editor_actions.cc:308
 msgid "Center Playhead"
 msgstr "Centre Playhead"
 
-#: editor_actions.cc:287
+#: editor_actions.cc:309
 msgid "Center Edit Point"
 msgstr "Centre Edit Point"
 
-#: editor_actions.cc:289
+#: editor_actions.cc:311
 msgid "Playhead Forward"
 msgstr ""
 
-#: editor_actions.cc:290
+#: editor_actions.cc:312
 msgid "Playhead Backward"
 msgstr ""
 
-#: editor_actions.cc:292
+#: editor_actions.cc:314
 msgid "Playhead to Active Mark"
 msgstr ""
 
-#: editor_actions.cc:293
+#: editor_actions.cc:315
 msgid "Active Mark to Playhead"
 msgstr ""
 
-#: editor_actions.cc:295
+#: editor_actions.cc:317
 msgid "Use Skip Ranges"
 msgstr ""
 
-#: editor_actions.cc:302
+#: editor_actions.cc:324
 msgid "Play Selected Regions"
 msgstr ""
 
-#: editor_actions.cc:304
+#: editor_actions.cc:326
 msgid "Play from Edit Point and Return"
 msgstr ""
 
-#: editor_actions.cc:306
+#: editor_actions.cc:328
 msgid "Play Edit Range"
 msgstr ""
 
-#: editor_actions.cc:308
+#: editor_actions.cc:330
 msgid "Playhead to Mouse"
 msgstr ""
 
-#: editor_actions.cc:309
+#: editor_actions.cc:331
 msgid "Active Marker to Mouse"
 msgstr ""
 
-#: editor_actions.cc:319
+#: editor_actions.cc:341
 msgid "Undo Selection Change"
 msgstr ""
 
-#: editor_actions.cc:320
+#: editor_actions.cc:342
 msgid "Redo Selection Change"
 msgstr ""
 
-#: editor_actions.cc:322
+#: editor_actions.cc:344
 msgid "Export Audio"
 msgstr ""
 
-#: editor_actions.cc:323 export_dialog.cc:396
+#: editor_actions.cc:345 export_dialog.cc:424
 msgid "Export Range"
 msgstr ""
 
-#: editor_actions.cc:328
+#: editor_actions.cc:350
 msgid "Separate Using Punch Range"
 msgstr ""
 
-#: editor_actions.cc:331
+#: editor_actions.cc:353
 msgid "Separate Using Loop Range"
 msgstr ""
 
-#: editor_actions.cc:334 editor_actions.cc:356
+#: editor_actions.cc:356 editor_actions.cc:379
 msgid "Crop"
 msgstr ""
 
-#: editor_actions.cc:344
+#: editor_actions.cc:366
 msgid "Fade Range Selection"
 msgstr ""
 
-#: editor_actions.cc:346
+#: editor_actions.cc:368
 msgid "Set Tempo from Edit Range = Bar"
 msgstr ""
 
-#: editor_actions.cc:348
+#: editor_actions.cc:371
 msgid "Log"
 msgstr ""
 
-#: editor_actions.cc:351 editor_actions.cc:353
+#: editor_actions.cc:374 editor_actions.cc:376
 msgid "Move to Next Transient"
 msgstr ""
 
-#: editor_actions.cc:352 editor_actions.cc:354
+#: editor_actions.cc:375 editor_actions.cc:377
 msgid "Move to Previous Transient"
 msgstr ""
 
-#: editor_actions.cc:358 editor_actions.cc:361
+#: editor_actions.cc:381
+msgid "Start Range from Playhead"
+msgstr ""
+
+#: editor_actions.cc:382
+msgid "Finish Range from Playhead"
+msgstr ""
+
+#: editor_actions.cc:384 editor_actions.cc:393
 msgid "Start Range"
 msgstr ""
 
-#: editor_actions.cc:359 editor_actions.cc:362
+#: editor_actions.cc:385 editor_actions.cc:394
 msgid "Finish Range"
 msgstr ""
 
-#: editor_actions.cc:394
+#: editor_actions.cc:387
+msgid "Start Punch Range"
+msgstr ""
+
+#: editor_actions.cc:388
+msgid "Finish Punch Range"
+msgstr ""
+
+#: editor_actions.cc:390
+msgid "Start Loop Range"
+msgstr ""
+
+#: editor_actions.cc:391
+msgid "Finish Loop Range"
+msgstr ""
+
+#: editor_actions.cc:426
 msgid "Follow Playhead"
 msgstr ""
 
-#: editor_actions.cc:395
+#: editor_actions.cc:427
 msgid "Remove Last Capture"
 msgstr ""
 
-#: editor_actions.cc:397
+#: editor_actions.cc:429
 msgid "Stationary Playhead"
 msgstr ""
 
-#: editor_actions.cc:399 insert_time_dialog.cc:32
+#: editor_actions.cc:431 insert_remove_time_dialog.cc:32
 msgid "Insert Time"
 msgstr ""
 
-#: editor_actions.cc:402
+#: editor_actions.cc:433 insert_remove_time_dialog.cc:32
+msgid "Remove Time"
+msgstr ""
+
+#: editor_actions.cc:438
 msgid "Toggle Active"
 msgstr ""
 
-#: editor_actions.cc:407 editor_actions.cc:1768 editor_markers.cc:921
-#: editor_markers.cc:986 editor_snapshots.cc:122 mixer_strip.cc:1543
-#: route_time_axis.cc:856
+#: editor_actions.cc:440 editor_actions.cc:1785 editor_markers.cc:926
+#: editor_markers.cc:999 editor_markers.cc:1019 editor_snapshots.cc:134
+#: lua_script_manager.cc:32 lua_script_manager.cc:36 mixer_strip.cc:1705
+#: route_time_axis.cc:870 vca_master_strip.cc:400
 msgid "Remove"
 msgstr ""
 
-#: editor_actions.cc:411
+#: editor_actions.cc:445
 msgid "Fit Selection (Vertical)"
 msgstr ""
 
-#: editor_actions.cc:413 time_axis_view.cc:1371
+#: editor_actions.cc:447 time_axis_view.cc:1287
 msgid "Largest"
 msgstr ""
 
-#: editor_actions.cc:416 time_axis_view.cc:1372
+#: editor_actions.cc:450 time_axis_view.cc:1288
 msgid "Larger"
 msgstr ""
 
-#: editor_actions.cc:419 editor_rulers.cc:249 time_axis_view.cc:1373
+#: editor_actions.cc:453 editor_rulers.cc:248 time_axis_view.cc:1289
 msgid "Large"
 msgstr ""
 
-#: editor_actions.cc:425 editor_rulers.cc:253 time_axis_view.cc:1375
+#: editor_actions.cc:459 editor_rulers.cc:252 time_axis_view.cc:1291
 msgid "Small"
 msgstr ""
 
-#: editor_actions.cc:429
+#: editor_actions.cc:463
 msgid "Sound Selected MIDI Notes"
 msgstr ""
 
-#: editor_actions.cc:434
+#: editor_actions.cc:468
 msgid "Zoom Focus Left"
 msgstr ""
 
-#: editor_actions.cc:435
+#: editor_actions.cc:469
 msgid "Zoom Focus Right"
 msgstr ""
 
-#: editor_actions.cc:436
+#: editor_actions.cc:470
 msgid "Zoom Focus Center"
 msgstr "Zoom Focus Centre"
 
-#: editor_actions.cc:437
+#: editor_actions.cc:471
 msgid "Zoom Focus Playhead"
 msgstr ""
 
-#: editor_actions.cc:438
+#: editor_actions.cc:472
 msgid "Zoom Focus Mouse"
 msgstr ""
 
-#: editor_actions.cc:439
+#: editor_actions.cc:473
 msgid "Zoom Focus Edit Point"
 msgstr ""
 
-#: editor_actions.cc:441
+#: editor_actions.cc:475
 msgid "Next Zoom Focus"
 msgstr ""
 
-#: editor_actions.cc:447
+#: editor_actions.cc:488
 msgid "Smart Object Mode"
 msgstr ""
 
-#: editor_actions.cc:450
+#: editor_actions.cc:491
 msgid "Smart"
 msgstr ""
 
-#: editor_actions.cc:453
+#: editor_actions.cc:494
 msgid "Object Tool"
 msgstr ""
 
-#: editor_actions.cc:458
+#: editor_actions.cc:499
 msgid "Range Tool"
 msgstr ""
 
-#: editor_actions.cc:463
+#: editor_actions.cc:504
 msgid "Note Drawing Tool"
 msgstr ""
 
-#: editor_actions.cc:468
+#: editor_actions.cc:509
 msgid "Audition Tool"
 msgstr ""
 
-#: editor_actions.cc:473
+#: editor_actions.cc:514
 msgid "Time FX Tool"
 msgstr ""
 
-#: editor_actions.cc:478
+#: editor_actions.cc:519
 msgid "Content Tool"
 msgstr ""
 
-#: editor_actions.cc:484
+#: editor_actions.cc:525
 msgid "Cut Tool"
 msgstr ""
 
-#: editor_actions.cc:490
+#: editor_actions.cc:531
 msgid "Step Mouse Mode"
 msgstr ""
 
-#: editor_actions.cc:497
+#: editor_actions.cc:538
 msgid "Change Edit Point"
 msgstr ""
 
-#: editor_actions.cc:498
+#: editor_actions.cc:539
 msgid "Change Edit Point Including Marker"
 msgstr ""
 
-#: editor_actions.cc:504
+#: editor_actions.cc:544
+msgid "EditMode|Lock"
+msgstr ""
+
+#: editor_actions.cc:545
 msgid "Cycle Edit Mode"
 msgstr ""
 
-#: editor_actions.cc:506
+#: editor_actions.cc:547
 msgid "Snap to"
 msgstr ""
 
-#: editor_actions.cc:507
+#: editor_actions.cc:548
 msgid "Snap Mode"
 msgstr ""
 
-#: editor_actions.cc:514
+#: editor_actions.cc:555
 msgid "Next Snap Mode"
 msgstr ""
 
-#: editor_actions.cc:515
+#: editor_actions.cc:556
 msgid "Next Snap Choice"
 msgstr ""
 
-#: editor_actions.cc:516
+#: editor_actions.cc:557
 msgid "Next Musical Snap Choice"
 msgstr ""
 
-#: editor_actions.cc:517
+#: editor_actions.cc:558
 msgid "Previous Snap Choice"
 msgstr ""
 
-#: editor_actions.cc:518
+#: editor_actions.cc:559
 msgid "Previous Musical Snap Choice"
 msgstr ""
 
-#: editor_actions.cc:523
+#: editor_actions.cc:564
 msgid "Snap to CD Frame"
 msgstr ""
 
-#: editor_actions.cc:524
+#: editor_actions.cc:565
 msgid "Snap to Timecode Frame"
 msgstr ""
 
-#: editor_actions.cc:525
+#: editor_actions.cc:566
 msgid "Snap to Timecode Seconds"
 msgstr ""
 
-#: editor_actions.cc:526
+#: editor_actions.cc:567
 msgid "Snap to Timecode Minutes"
 msgstr ""
 
-#: editor_actions.cc:527
+#: editor_actions.cc:568
 msgid "Snap to Seconds"
 msgstr ""
 
-#: editor_actions.cc:528
+#: editor_actions.cc:569
 msgid "Snap to Minutes"
 msgstr ""
 
-#: editor_actions.cc:530
+#: editor_actions.cc:571
 msgid "Snap to One Twenty Eighths"
 msgstr ""
 
-#: editor_actions.cc:531
+#: editor_actions.cc:572
 msgid "Snap to Sixty Fourths"
-msgstr ""
+msgstr "Snap to Hemidemisemiquaver"
 
-#: editor_actions.cc:532
+#: editor_actions.cc:573
 msgid "Snap to Thirty Seconds"
 msgstr "Snap to demisemiquavers"
 
-#: editor_actions.cc:533
+#: editor_actions.cc:574
 msgid "Snap to Twenty Eighths"
 msgstr ""
 
-#: editor_actions.cc:534
+#: editor_actions.cc:575
 msgid "Snap to Twenty Fourths"
 msgstr ""
 
-#: editor_actions.cc:535
+#: editor_actions.cc:576
 msgid "Snap to Twentieths"
 msgstr ""
 
-#: editor_actions.cc:536
+#: editor_actions.cc:577
 msgid "Snap to Sixteenths"
 msgstr "Snap to semiquavers"
 
-#: editor_actions.cc:537
+#: editor_actions.cc:578
 msgid "Snap to Fourteenths"
 msgstr ""
 
-#: editor_actions.cc:538
+#: editor_actions.cc:579
 msgid "Snap to Twelfths"
 msgstr ""
 
-#: editor_actions.cc:539
+#: editor_actions.cc:580
 msgid "Snap to Tenths"
 msgstr ""
 
-#: editor_actions.cc:540
+#: editor_actions.cc:581
 msgid "Snap to Eighths"
 msgstr "Snap to quavers"
 
-#: editor_actions.cc:541
+#: editor_actions.cc:582
 msgid "Snap to Sevenths"
 msgstr ""
 
-#: editor_actions.cc:542
+#: editor_actions.cc:583
 msgid "Snap to Sixths"
 msgstr ""
 
-#: editor_actions.cc:543
+#: editor_actions.cc:584
 msgid "Snap to Fifths"
 msgstr ""
 
-#: editor_actions.cc:544
+#: editor_actions.cc:585
 msgid "Snap to Quarters"
 msgstr "Snap to crotchets"
 
-#: editor_actions.cc:545
+#: editor_actions.cc:586
 msgid "Snap to Thirds"
 msgstr ""
 
-#: editor_actions.cc:546
+#: editor_actions.cc:587
 msgid "Snap to Halves"
 msgstr "Snap to minims"
 
-#: editor_actions.cc:548
+#: editor_actions.cc:589
 msgid "Snap to Beat"
 msgstr ""
 
-#: editor_actions.cc:549
+#: editor_actions.cc:590
 msgid "Snap to Bar"
 msgstr ""
 
-#: editor_actions.cc:550
+#: editor_actions.cc:591
 msgid "Snap to Mark"
 msgstr ""
 
-#: editor_actions.cc:551
+#: editor_actions.cc:592
 msgid "Snap to Region Start"
 msgstr ""
 
-#: editor_actions.cc:552
+#: editor_actions.cc:593
 msgid "Snap to Region End"
 msgstr ""
 
-#: editor_actions.cc:553
+#: editor_actions.cc:594
 msgid "Snap to Region Sync"
 msgstr ""
 
-#: editor_actions.cc:554
+#: editor_actions.cc:595
 msgid "Snap to Region Boundary"
 msgstr ""
 
-#: editor_actions.cc:556
+#: editor_actions.cc:597
 msgid "Show Marker Lines"
 msgstr ""
 
-#: editor_actions.cc:566
+#: editor_actions.cc:607
 msgid "Loop/Punch"
 msgstr ""
 
-#: editor_actions.cc:570
+#: editor_actions.cc:611
 msgid "Min:Sec"
 msgstr ""
 
-#: editor_actions.cc:572 editor_actions.cc:575 editor_rulers.cc:271
+#: editor_actions.cc:613 editor_actions.cc:616 editor_rulers.cc:270
+#: rc_option_editor.cc:1592
 msgid "Video Monitor"
 msgstr ""
 
-#: editor_actions.cc:574 rc_option_editor.cc:2260
+#: editor_actions.cc:615 rc_option_editor.cc:2844
 msgid "Video"
 msgstr ""
 
-#: editor_actions.cc:577
+#: editor_actions.cc:618
 msgid "Always on Top"
 msgstr ""
 
-#: editor_actions.cc:579
+#: editor_actions.cc:620
 msgid "Frame number"
 msgstr ""
 
-#: editor_actions.cc:580
+#: editor_actions.cc:621
 msgid "Timecode Background"
 msgstr ""
 
-#: editor_actions.cc:581
+#: editor_actions.cc:622
 msgid "Fullscreen"
 msgstr ""
 
-#: editor_actions.cc:582
+#: editor_actions.cc:623
 msgid "Letterbox"
 msgstr ""
 
-#: editor_actions.cc:583
+#: editor_actions.cc:624
 msgid "Original Size"
 msgstr ""
 
-#: editor_actions.cc:640
+#: editor_actions.cc:681
 msgid "Sort"
 msgstr ""
 
-#: editor_actions.cc:651 editor_routes.cc:476 mixer_ui.cc:1196
+#: editor_actions.cc:692 editor_routes.cc:549 mixer_ui.cc:1497
 msgid "Show All"
 msgstr ""
 
-#: editor_actions.cc:652
+#: editor_actions.cc:693
 msgid "Show Automatic Regions"
 msgstr ""
 
-#: editor_actions.cc:654
+#: editor_actions.cc:695
 msgid "Ascending"
 msgstr ""
 
-#: editor_actions.cc:656
+#: editor_actions.cc:697
 msgid "Descending"
 msgstr ""
 
-#: editor_actions.cc:659
+#: editor_actions.cc:700
 msgid "By Region Name"
 msgstr ""
 
-#: editor_actions.cc:661
+#: editor_actions.cc:702
 msgid "By Region Length"
 msgstr ""
 
-#: editor_actions.cc:663
+#: editor_actions.cc:704
 msgid "By Region Position"
 msgstr ""
 
-#: editor_actions.cc:665
+#: editor_actions.cc:706
 msgid "By Region Timestamp"
 msgstr ""
 
-#: editor_actions.cc:667
+#: editor_actions.cc:708
 msgid "By Region Start in File"
 msgstr ""
 
-#: editor_actions.cc:669
+#: editor_actions.cc:710
 msgid "By Region End in File"
 msgstr ""
 
-#: editor_actions.cc:671
+#: editor_actions.cc:712
 msgid "By Source File Name"
 msgstr ""
 
-#: editor_actions.cc:673
+#: editor_actions.cc:714
 msgid "By Source File Length"
 msgstr ""
 
-#: editor_actions.cc:675
+#: editor_actions.cc:716
 msgid "By Source File Creation Date"
 msgstr ""
 
-#: editor_actions.cc:677
+#: editor_actions.cc:718
 msgid "By Source Filesystem"
 msgstr ""
 
-#: editor_actions.cc:680
+#: editor_actions.cc:721
 msgid "Remove Unused"
 msgstr ""
 
-#: editor_actions.cc:684 editor_audio_import.cc:282
-#: session_import_dialog.cc:75 session_import_dialog.cc:95
-#: session_metadata_dialog.cc:418 editor_videotimeline.cc:91
+#: editor_actions.cc:723
+msgid "Import PT session"
+msgstr ""
+
+#: editor_actions.cc:728 editor_audio_import.cc:282 editor_pt_import.cc:149
+#: luawindow.cc:99 session_import_dialog.cc:75 session_import_dialog.cc:95
+#: session_metadata_dialog.cc:421 sfdb_ui.cc:558 editor_videotimeline.cc:91
 msgid "Import"
 msgstr ""
 
-#: editor_actions.cc:687
+#: editor_actions.cc:731
 msgid "Import to Region List..."
 msgstr ""
 
-#: editor_actions.cc:690 session_import_dialog.cc:44
-msgid "Import From Session"
+#: editor_actions.cc:734 session_import_dialog.cc:44
+#: session_import_dialog.cc:65
+msgid "Import from Session"
 msgstr ""
 
-#: editor_actions.cc:694
+#: editor_actions.cc:738
 msgid "Bring all media into session folder"
 msgstr ""
 
-#: editor_actions.cc:697
+#: editor_actions.cc:741
 msgid "Show Summary"
 msgstr ""
 
-#: editor_actions.cc:699
+#: editor_actions.cc:743
 msgid "Show Group Tabs"
 msgstr ""
 
-#: editor_actions.cc:701
+#: editor_actions.cc:745
 msgid "Show Measure Lines"
 msgstr "Show Bar Lines"
 
-#: editor_actions.cc:705
-msgid "Show Logo"
-msgstr ""
-
-#: editor_actions.cc:709
+#: editor_actions.cc:747
 msgid "Toggle MIDI Input Active for Editor-Selected Tracks/Busses"
 msgstr ""
 
-#: editor_actions.cc:732
-msgid "Loaded editor bindings from %1"
-msgstr ""
-
-#: editor_actions.cc:734
-msgid "Could not find editor.bindings in search path %1"
-msgstr ""
-
-#: editor_actions.cc:1078 editor_actions.cc:1474 editor_actions.cc:1485
-#: editor_actions.cc:1538 editor_actions.cc:1549 editor_actions.cc:1596
-#: editor_actions.cc:1606 editor_regions.cc:1563
+#: editor_actions.cc:1081 editor_actions.cc:1477 editor_actions.cc:1488
+#: editor_actions.cc:1541 editor_actions.cc:1552 editor_actions.cc:1599
+#: editor_actions.cc:1609 editor_regions.cc:1657 luainstance.cc:327
+#: luainstance.cc:1690
 msgid "programming error: %1: %2"
 msgstr ""
 
-#: editor_actions.cc:1774
+#: editor_actions.cc:1791
 msgid "Raise"
 msgstr ""
 
-#: editor_actions.cc:1777
+#: editor_actions.cc:1794
 msgid "Raise to Top"
 msgstr ""
 
-#: editor_actions.cc:1780
+#: editor_actions.cc:1797
 msgid "Lower"
 msgstr ""
 
-#: editor_actions.cc:1783
+#: editor_actions.cc:1800
 msgid "Lower to Bottom"
 msgstr ""
 
-#: editor_actions.cc:1786
+#: editor_actions.cc:1803
 msgid "Move to Original Position"
 msgstr ""
 
-#: editor_actions.cc:1791
+#: editor_actions.cc:1808
 msgid "Lock to Video"
 msgstr ""
 
-#: editor_actions.cc:1796 editor_markers.cc:912
+#: editor_actions.cc:1813 editor_markers.cc:917
 msgid "Glue to Bars and Beats"
 msgstr ""
 
-#: editor_actions.cc:1801
+#: editor_actions.cc:1818
 msgid "Remove Sync"
 msgstr ""
 
-#: editor_actions.cc:1804 mixer_strip.cc:2006 monitor_section.cc:272
-#: route_time_axis.cc:253 route_time_axis.cc:526
+#: editor_actions.cc:1821 mixer_strip.cc:2192 monitor_section.cc:253
+#: monitor_section.cc:321 route_time_axis.cc:264 route_time_axis.cc:550
 msgid "Mute"
 msgstr ""
 
-#: editor_actions.cc:1807
+#: editor_actions.cc:1824
 msgid "Normalize..."
 msgstr "Normalise..."
 
-#: editor_actions.cc:1810
+#: editor_actions.cc:1827
 msgid "Reverse"
 msgstr ""
 
-#: editor_actions.cc:1813
+#: editor_actions.cc:1830
 msgid "Make Mono Regions"
 msgstr ""
 
-#: editor_actions.cc:1816
+#: editor_actions.cc:1833
 msgid "Boost Gain"
 msgstr ""
 
-#: editor_actions.cc:1819
+#: editor_actions.cc:1836
 msgid "Cut Gain"
 msgstr ""
 
-#: editor_actions.cc:1822
+#: editor_actions.cc:1839
 msgid "Pitch Shift..."
 msgstr ""
 
-#: editor_actions.cc:1825
-msgid "Transpose..."
-msgstr ""
-
-#: editor_actions.cc:1828
+#: editor_actions.cc:1845
 msgid "Opaque"
 msgstr ""
 
-#: editor_actions.cc:1832 editor_regions.cc:117
+#: editor_actions.cc:1849 editor_regions.cc:164
 msgid "Fade In"
 msgstr ""
 
-#: editor_actions.cc:1837 editor_regions.cc:118
+#: editor_actions.cc:1854 editor_regions.cc:165
 msgid "Fade Out"
 msgstr ""
 
-#: editor_actions.cc:1852
+#: editor_actions.cc:1869
 msgid "Multi-Duplicate..."
 msgstr ""
 
-#: editor_actions.cc:1857
+#: editor_actions.cc:1874
 msgid "Fill Track"
 msgstr ""
 
-#: editor_actions.cc:1861 editor_markers.cc:1000
+#: editor_actions.cc:1878 editor_markers.cc:1033
 msgid "Set Loop Range"
 msgstr ""
 
-#: editor_actions.cc:1868
+#: editor_actions.cc:1885
 msgid "Set Punch"
 msgstr ""
 
-#: editor_actions.cc:1872
+#: editor_actions.cc:1889
 msgid "Add Single Range Marker"
 msgstr ""
 
-#: editor_actions.cc:1877
+#: editor_actions.cc:1894
 msgid "Add Range Marker Per Region"
 msgstr ""
 
-#: editor_actions.cc:1881
-msgid "Snap Position To Grid"
+#: editor_actions.cc:1898
+msgid "Snap Position to Grid"
 msgstr ""
 
-#: editor_actions.cc:1884
+#: editor_actions.cc:1901
 msgid "Close Gaps"
 msgstr ""
 
-#: editor_actions.cc:1887
+#: editor_actions.cc:1904
 msgid "Rhythm Ferret..."
 msgstr ""
 
-#: editor_actions.cc:1890
+#: editor_actions.cc:1907
 msgid "Export..."
 msgstr ""
 
-#: editor_actions.cc:1896
+#: editor_actions.cc:1913
 msgid "Separate Under"
 msgstr ""
 
-#: editor_actions.cc:1900 editor_actions.cc:1901
+#: editor_actions.cc:1917 editor_actions.cc:1918
 msgid "Set Fade In Length"
 msgstr ""
 
-#: editor_actions.cc:1902 editor_actions.cc:1903
+#: editor_actions.cc:1919 editor_actions.cc:1920
 msgid "Set Fade Out Length"
 msgstr ""
 
-#: editor_actions.cc:1905
+#: editor_actions.cc:1922
 msgid "Set Tempo from Region = Bar"
 msgstr ""
 
-#: editor_actions.cc:1910
+#: editor_actions.cc:1927
 msgid "Split at Percussion Onsets"
 msgstr ""
 
-#: editor_actions.cc:1915
+#: editor_actions.cc:1932
 msgid "List Editor..."
 msgstr ""
 
-#: editor_actions.cc:1918
+#: editor_actions.cc:1935
 msgid "Properties..."
 msgstr ""
 
-#: editor_actions.cc:1922
+#: editor_actions.cc:1939
 msgid "Bounce (with processing)"
 msgstr ""
 
-#: editor_actions.cc:1923
+#: editor_actions.cc:1940
 msgid "Bounce (without processing)"
 msgstr ""
 
-#: editor_actions.cc:1924
+#: editor_actions.cc:1941
 msgid "Combine"
 msgstr ""
 
-#: editor_actions.cc:1925
+#: editor_actions.cc:1942
 msgid "Uncombine"
 msgstr ""
 
-#: editor_actions.cc:1927
+#: editor_actions.cc:1944
+msgid "Loudness Analysis..."
+msgstr ""
+
+#: editor_actions.cc:1945
 msgid "Spectral Analysis..."
 msgstr ""
 
-#: editor_actions.cc:1929
+#: editor_actions.cc:1947
 msgid "Reset Envelope"
 msgstr ""
 
-#: editor_actions.cc:1931
+#: editor_actions.cc:1949
 msgid "Reset Gain"
 msgstr ""
 
-#: editor_actions.cc:1936
+#: editor_actions.cc:1954
 msgid "Envelope Active"
 msgstr ""
 
-#: editor_actions.cc:1944 editor_actions.cc:1945
+#: editor_actions.cc:1962 editor_actions.cc:1963
 msgid "Insert Patch Change..."
 msgstr ""
 
-#: editor_actions.cc:1946
+#: editor_actions.cc:1964
 msgid "Unlink from other copies"
 msgstr ""
 
-#: editor_actions.cc:1947
+#: editor_actions.cc:1965
 msgid "Strip Silence..."
 msgstr ""
 
-#: editor_actions.cc:1948
+#: editor_actions.cc:1966
 msgid "Set Range Selection"
 msgstr ""
 
-#: editor_actions.cc:1950 editor_actions.cc:1951
+#: editor_actions.cc:1968 editor_actions.cc:1969
 msgid "Nudge Later"
 msgstr ""
 
-#: editor_actions.cc:1952 editor_actions.cc:1953
+#: editor_actions.cc:1970 editor_actions.cc:1971
 msgid "Nudge Earlier"
 msgstr ""
 
-#: editor_actions.cc:1955
+#: editor_actions.cc:1973
 msgid "Sequence Regions"
 msgstr ""
 
-#: editor_actions.cc:1960
+#: editor_actions.cc:1978
 msgid "Nudge Later by Capture Offset"
 msgstr ""
 
-#: editor_actions.cc:1967
+#: editor_actions.cc:1985
 msgid "Nudge Earlier by Capture Offset"
 msgstr ""
 
-#: editor_actions.cc:1971
+#: editor_actions.cc:1989
 msgid "Trim to Loop"
 msgstr ""
 
-#: editor_actions.cc:1972
+#: editor_actions.cc:1990
 msgid "Trim to Punch"
 msgstr ""
 
-#: editor_actions.cc:1974
+#: editor_actions.cc:1992
 msgid "Trim to Previous"
 msgstr ""
 
-#: editor_actions.cc:1975
+#: editor_actions.cc:1993
 msgid "Trim to Next"
 msgstr ""
 
-#: editor_actions.cc:1982
-msgid "Insert Region From Region List"
+#: editor_actions.cc:2000
+msgid "Insert Region from Region List"
 msgstr ""
 
-#: editor_actions.cc:1988
+#: editor_actions.cc:2006
 msgid "Set Sync Position"
 msgstr ""
 
-#: editor_actions.cc:1989
+#: editor_actions.cc:2007
 msgid "Place Transient"
 msgstr ""
 
-#: editor_actions.cc:1990
+#: editor_actions.cc:2008
 msgid "Split/Separate"
 msgstr ""
 
-#: editor_actions.cc:1991
+#: editor_actions.cc:2009
 msgid "Trim Start at Edit Point"
 msgstr ""
 
-#: editor_actions.cc:1992
+#: editor_actions.cc:2010
 msgid "Trim End at Edit Point"
 msgstr ""
 
-#: editor_actions.cc:1997
+#: editor_actions.cc:2015
 msgid "Align Start"
 msgstr ""
 
-#: editor_actions.cc:2004
+#: editor_actions.cc:2022
 msgid "Align Start Relative"
 msgstr ""
 
-#: editor_actions.cc:2008
+#: editor_actions.cc:2026
 msgid "Align End"
 msgstr ""
 
-#: editor_actions.cc:2013
+#: editor_actions.cc:2031
 msgid "Align End Relative"
 msgstr ""
 
-#: editor_actions.cc:2020
+#: editor_actions.cc:2038
 msgid "Align Sync"
 msgstr ""
 
-#: editor_actions.cc:2027
+#: editor_actions.cc:2045
 msgid "Align Sync Relative"
 msgstr ""
 
-#: editor_actions.cc:2031 editor_actions.cc:2034
+#: editor_actions.cc:2049 editor_actions.cc:2050
 msgid "Choose Top..."
 msgstr ""
 
@@ -4448,238 +5003,308 @@ msgid ""
 "%2 as a new source, or skip it?"
 msgstr ""
 
-#: editor_audio_import.cc:282 editor_videotimeline.cc:91
+#: editor_audio_import.cc:282 editor_pt_import.cc:149
+#: editor_videotimeline.cc:91
 msgid "Cancel Import"
 msgstr ""
 
-#: editor_audio_import.cc:559
+#: editor_audio_import.cc:565
 msgid "Editor: cannot open file \"%1\", (%2)"
 msgstr ""
 
-#: editor_audio_import.cc:567
+#: editor_audio_import.cc:573
 msgid "Cancel entire import"
 msgstr ""
 
-#: editor_audio_import.cc:568
+#: editor_audio_import.cc:574
 msgid "Don't embed it"
 msgstr ""
 
-#: editor_audio_import.cc:569
+#: editor_audio_import.cc:575
 msgid "Embed all without questions"
 msgstr ""
 
-#: editor_audio_import.cc:572 editor_audio_import.cc:598
-#: export_format_dialog.cc:60
+#: editor_audio_import.cc:578 editor_audio_import.cc:604
+#: export_format_dialog.cc:68
 msgid "Sample rate"
 msgstr ""
 
-#: editor_audio_import.cc:573 editor_audio_import.cc:599
+#: editor_audio_import.cc:579 editor_audio_import.cc:605
 msgid ""
 "%1\n"
 "This audiofile's sample rate doesn't match the session sample rate!"
 msgstr ""
 
-#: editor_audio_import.cc:595
+#: editor_audio_import.cc:601
 msgid "Embed it anyway"
 msgstr ""
 
-#: editor_canvas_events.cc:1306 editor_drag.cc:1381
+#: editor_pt_import.cc:81
+msgid "You can't import a PT session until you have a session loaded."
+msgstr ""
+
+#: editor_pt_import.cc:86
+msgid "Import PT Session"
+msgstr ""
+
+#: editor_pt_import.cc:97
+msgid "%1: this is only the directory/folder name, not the filename.\n"
+msgstr ""
+
+#: editor_pt_import.cc:132
+msgid "Doesn't seem to be a valid PT session file"
+msgstr ""
+
+#: editor_pt_import.cc:136
+msgid ""
+"PT v%1 Session @ %2Hz\n"
+"\n"
+"%3 audio files\n"
+"%4 regions\n"
+"%5 active regions\n"
+"\n"
+"Continue..."
+msgstr ""
+
+#: editor_pt_import.cc:175
+msgid ""
+"Failed to load one or more of the audio files, but continuing to attempt "
+"import."
+msgstr ""
+
+#: editor_pt_import.cc:178
+msgid "Success! Import should complete soon."
+msgstr ""
+
+#: editor_pt_import.cc:263
+msgid "PTImport: UINT_MAX routes? impossible!"
+msgstr ""
+
+#: editor_canvas_events.cc:1296 editor_drag.cc:1418
 msgid "Could not create new track after region placed in the drop zone"
 msgstr ""
 
-#: editor_drag.cc:1266
+#: editor_drag.cc:1306
 msgid "fixed time region drag"
 msgstr ""
 
-#: editor_drag.cc:2214
+#: editor_drag.cc:2249
 msgid "Ripple drag"
 msgstr ""
 
-#: editor_drag.cc:2365 midi_region_view.cc:2813
+#: editor_drag.cc:2311
+msgid "create region"
+msgstr ""
+
+#: editor_drag.cc:2430 midi_region_view.cc:2859
 msgid "resize notes"
 msgstr ""
 
-#: editor_drag.cc:2517
+#: editor_drag.cc:2613 editor_drag.cc:2648
+msgid ""
+"One or more Audio Regions\n"
+"are both Locked and\n"
+"Locked to Video.\n"
+"The video cannot me moved."
+msgstr ""
+
+#: editor_drag.cc:2683
 msgid "Video Start:"
 msgstr ""
 
-#: editor_drag.cc:2519
+#: editor_drag.cc:2685
 msgid "Diff:"
 msgstr ""
 
-#: editor_drag.cc:2538
+#: editor_drag.cc:2707
 msgid "Move Video"
 msgstr ""
 
-#: editor_drag.cc:3046
+#: editor_drag.cc:3177
+msgid "move meter mark"
+msgstr ""
+
+#: editor_drag.cc:3179
 msgid "copy meter mark"
 msgstr ""
 
-#: editor_drag.cc:3054
-msgid "move meter mark"
+#: editor_drag.cc:3279
+msgid "inactive"
 msgstr ""
 
-#: editor_drag.cc:3177
+#: editor_drag.cc:3324
+msgid "move tempo mark"
+msgstr ""
+
+#: editor_drag.cc:3331
 msgid "copy tempo mark"
 msgstr ""
 
-#: editor_drag.cc:3185
-msgid "move tempo mark"
+#: editor_drag.cc:3462
+msgid "dilate tempo"
 msgstr ""
 
-#: editor_drag.cc:3412
+#: editor_drag.cc:3736
 msgid "change fade in length"
 msgstr ""
 
-#: editor_drag.cc:3526
+#: editor_drag.cc:3861
 msgid "change fade out length"
 msgstr ""
 
-#: editor_drag.cc:3880
+#: editor_drag.cc:4239
 msgid "move marker"
 msgstr ""
 
-#: editor_drag.cc:4490
+#: editor_drag.cc:4506 editor_drag.cc:5833
+msgid "automation range move"
+msgstr ""
+
+#: editor_drag.cc:4890
 msgid "An error occurred while executing time stretch operation"
 msgstr ""
 
-#: editor_drag.cc:4947
+#: editor_drag.cc:5351
 msgid "programming_error: %1"
 msgstr ""
 
-#: editor_drag.cc:5016 editor_drag.cc:5026
+#: editor_drag.cc:5420 editor_drag.cc:5430
 msgid "new skip marker"
 msgstr ""
 
-#: editor_drag.cc:5017
+#: editor_drag.cc:5421
 msgid "skip"
 msgstr ""
 
-#: editor_drag.cc:5021 location_ui.cc:56
+#: editor_drag.cc:5425 location_ui.cc:60
 msgid "CD"
 msgstr ""
 
-#: editor_drag.cc:5022
+#: editor_drag.cc:5426
 msgid "new CD marker"
 msgstr ""
 
-#: editor_drag.cc:5027 editor_route_groups.cc:437 mixer_ui.cc:1493
+#: editor_drag.cc:5431 editor_route_groups.cc:439 mixer_ui.cc:1840
 msgid "unnamed"
 msgstr ""
 
-#: editor_drag.cc:5309
+#: editor_drag.cc:5740
 msgid "Automation range drag created for invalid region type"
 msgstr ""
 
-#: editor_route_groups.cc:96
+#: editor_route_groups.cc:97
 msgid "Col"
 msgstr ""
 
-#: editor_route_groups.cc:96
+#: editor_route_groups.cc:97
 msgid "Group Tab Color"
 msgstr "Group Tab Colour"
 
-#: editor_route_groups.cc:97
+#: editor_route_groups.cc:98
 msgid "Name of Group"
 msgstr ""
 
-#: editor_route_groups.cc:98 editor_routes.cc:207
-msgid "V"
+#: editor_route_groups.cc:99 editor_routes.cc:234
+msgid "Visible|V"
 msgstr ""
 
-#: editor_route_groups.cc:98
+#: editor_route_groups.cc:99
 msgid "Group is visible?"
 msgstr ""
 
-#: editor_route_groups.cc:99
+#: editor_route_groups.cc:100
 msgid "On"
 msgstr ""
 
-#: editor_route_groups.cc:99
+#: editor_route_groups.cc:100
 msgid "Group is enabled?"
 msgstr ""
 
-#: editor_route_groups.cc:100
-msgid "group|G"
+#: editor_route_groups.cc:101
+msgid "Group|G"
 msgstr ""
 
-#: editor_route_groups.cc:100
+#: editor_route_groups.cc:101
 msgid "Sharing Gain?"
 msgstr ""
 
-#: editor_route_groups.cc:101
-msgid "relative|Rel"
+#: editor_route_groups.cc:102
+msgid "Relative|Rel"
 msgstr ""
 
-#: editor_route_groups.cc:101
+#: editor_route_groups.cc:102
 msgid "Relative Gain Changes?"
 msgstr ""
 
-#: editor_route_groups.cc:102
-msgid "mute|M"
+#: editor_route_groups.cc:103 editor_regions.cc:168 editor_routes.cc:239
+#: mixer_strip.cc:2221 meter_strip.cc:365 route_time_axis.cc:2742
+#: time_axis_view.cc:1106
+msgid "Mute|M"
 msgstr ""
 
-#: editor_route_groups.cc:102
+#: editor_route_groups.cc:103
 msgid "Sharing Mute?"
 msgstr ""
 
-#: editor_route_groups.cc:103
-msgid "solo|S"
+#: editor_route_groups.cc:104 editor_routes.cc:240 mixer_strip.cc:2234
+#: meter_strip.cc:373 route_time_axis.cc:2739 vca_master_strip.cc:211
+#: vca_time_axis.cc:236
+msgid "Solo|S"
 msgstr ""
 
-#: editor_route_groups.cc:103
+#: editor_route_groups.cc:104
 msgid "Sharing Solo?"
 msgstr ""
 
-#: editor_route_groups.cc:104 midi_time_axis.cc:1622 midi_time_axis.cc:1625
-#: midi_time_axis.cc:1628
+#: editor_route_groups.cc:105 midi_time_axis.cc:1626 midi_time_axis.cc:1629
+#: midi_time_axis.cc:1632
 msgid "Rec"
 msgstr ""
 
-#: editor_route_groups.cc:104
+#: editor_route_groups.cc:105
 msgid "Sharing Record-enable Status?"
 msgstr ""
 
-#: editor_route_groups.cc:105
-msgid "monitoring|Mon"
+#: editor_route_groups.cc:106
+msgid "Monitoring|Mon"
 msgstr ""
 
-#: editor_route_groups.cc:105
+#: editor_route_groups.cc:106
 msgid "Sharing Monitoring Choice?"
 msgstr ""
 
-#: editor_route_groups.cc:106
-msgid "selection|Sel"
+#: editor_route_groups.cc:107
+msgid "Selection|Sel"
 msgstr ""
 
-#: editor_route_groups.cc:106
+#: editor_route_groups.cc:107
 msgid "Sharing Selected/Editing Status?"
 msgstr ""
 
-#: editor_route_groups.cc:107
-msgid "active|A"
+#: editor_route_groups.cc:108 editor_routes.cc:235
+msgid "Active|A"
 msgstr ""
 
-#: editor_route_groups.cc:107
+#: editor_route_groups.cc:108
 msgid "Sharing Active Status?"
 msgstr ""
 
-#: editor_export_audio.cc:92 editor_markers.cc:740 editor_markers.cc:827
-#: editor_markers.cc:1012 editor_markers.cc:1030 editor_markers.cc:1048
-#: editor_markers.cc:1067 editor_markers.cc:1086 editor_markers.cc:1116
-#: editor_markers.cc:1147 editor_markers.cc:1177 editor_markers.cc:1205
-#: editor_markers.cc:1236 editor_markers.cc:1261 editor_markers.cc:1312
-#: editor_markers.cc:1356 editor_markers.cc:1382 editor_markers.cc:1576
-#: editor_mouse.cc:2120
+#: editor_export_audio.cc:93 editor_markers.cc:733 editor_markers.cc:832
+#: editor_markers.cc:1045 editor_markers.cc:1063 editor_markers.cc:1081
+#: editor_markers.cc:1100 editor_markers.cc:1119 editor_markers.cc:1149
+#: editor_markers.cc:1180 editor_markers.cc:1210 editor_markers.cc:1238
+#: editor_markers.cc:1269 editor_markers.cc:1294 editor_markers.cc:1345
+#: editor_markers.cc:1458 editor_markers.cc:1484 editor_markers.cc:1678
+#: editor_mouse.cc:2255
 msgid "programming error: marker canvas item has no marker object pointer!"
 msgstr ""
 
-#: editor_export_audio.cc:145 editor_export_audio.cc:150
-msgid "File Exists!"
+#: editor_export_audio.cc:114
+msgid "Confirm MIDI File Overwrite"
 msgstr ""
 
-#: editor_export_audio.cc:153
-msgid "Overwrite Existing File"
+#: editor_export_audio.cc:115 utils_videotl.cc:73
+msgid "A file with the same name already exists. Do you want to overwrite it?"
 msgstr ""
 
 #: editor_group_tabs.cc:176
@@ -4694,300 +5319,341 @@ msgstr ""
 msgid "end"
 msgstr ""
 
-#: editor_markers.cc:657 editor_ops.cc:2085 editor_ops.cc:2107
-#: editor_ops.cc:2164 editor_ops.cc:2193 location_ui.cc:1023
+#: editor_markers.cc:645
+msgid "mark"
+msgstr ""
+
+#: editor_markers.cc:650 editor_ops.cc:2164 editor_ops.cc:2186
+#: editor_ops.cc:2304 editor_ops.cc:2341 location_ui.cc:1049
 msgid "add marker"
 msgstr ""
 
-#: editor_markers.cc:689 editor_markers.cc:1456
+#: editor_markers.cc:682 editor_markers.cc:1558
 msgid "set loop range"
 msgstr ""
 
-#: editor_markers.cc:705 editor_markers.cc:1462
+#: editor_markers.cc:698 editor_markers.cc:1564
 msgid "set punch range"
 msgstr ""
 
-#: editor_markers.cc:722 editor_ops.cc:4055
+#: editor_markers.cc:715 editor_ops.cc:4159
 msgid "range"
 msgstr ""
 
-#: editor_markers.cc:725
+#: editor_markers.cc:718
 msgid "new range marker"
 msgstr ""
 
-#: editor_markers.cc:758 editor_ops.cc:2129 location_ui.cc:859
+#: editor_markers.cc:751 editor_ops.cc:2272 location_ui.cc:885
 msgid "remove marker"
 msgstr ""
 
-#: editor_markers.cc:894
+#: editor_markers.cc:899
 msgid "Locate to Here"
 msgstr ""
 
-#: editor_markers.cc:895
+#: editor_markers.cc:900
 msgid "Play from Here"
 msgstr ""
 
-#: editor_markers.cc:896
+#: editor_markers.cc:901
 msgid "Move Mark to Playhead"
 msgstr ""
 
-#: editor_markers.cc:900
+#: editor_markers.cc:905
 msgid "Create Range to Next Marker"
 msgstr ""
 
-#: editor_markers.cc:941
+#: editor_markers.cc:946
 msgid "Locate to Marker"
 msgstr ""
 
-#: editor_markers.cc:942
+#: editor_markers.cc:947
 msgid "Play from Marker"
 msgstr ""
 
-#: editor_markers.cc:945
+#: editor_markers.cc:950
 msgid "Set Marker from Playhead"
 msgstr ""
 
-#: editor_markers.cc:947
+#: editor_markers.cc:951
 msgid "Set Range from Selection"
 msgstr ""
 
-#: editor_markers.cc:957
+#: editor_markers.cc:960
 msgid "Hide Range"
 msgstr ""
 
-#: editor_markers.cc:958
+#: editor_markers.cc:961
 msgid "Rename Range..."
 msgstr ""
 
-#: editor_markers.cc:962
+#: editor_markers.cc:965
 msgid "Remove Range"
 msgstr ""
 
-#: editor_markers.cc:969
+#: editor_markers.cc:972
 msgid "Separate Regions in Range"
 msgstr ""
 
-#: editor_markers.cc:972
+#: editor_markers.cc:974
 msgid "Select Range"
 msgstr ""
 
-#: editor_markers.cc:1001
+#: editor_markers.cc:987
+msgid "Make Ramped"
+msgstr ""
+
+#: editor_markers.cc:989
+msgid "Make Constant"
+msgstr ""
+
+#: editor_markers.cc:993 editor_markers.cc:1013
+msgid "Lock to Music"
+msgstr ""
+
+#: editor_markers.cc:995 editor_markers.cc:1015
+msgid "Lock to Audio"
+msgstr ""
+
+#: editor_markers.cc:1034
 msgid "Set Punch Range"
 msgstr ""
 
-#: editor_markers.cc:1407 editor_ops.cc:2040
+#: editor_markers.cc:1391
+msgid "change meter lock style"
+msgstr ""
+
+#: editor_markers.cc:1414
+msgid "change tempo lock style"
+msgstr ""
+
+#: editor_markers.cc:1441
+msgid "change tempo type"
+msgstr ""
+
+#: editor_markers.cc:1509 editor_ops.cc:2119
 msgid "New Name:"
 msgstr ""
 
-#: editor_markers.cc:1410
+#: editor_markers.cc:1512
 msgid "Rename Mark"
 msgstr ""
 
-#: editor_markers.cc:1412
+#: editor_markers.cc:1514
 msgid "Rename Range"
 msgstr ""
 
-#: editor_markers.cc:1419 editor_mouse.cc:2137 processor_box.cc:1994
-#: processor_box.cc:2464 route_time_axis.cc:1100 route_ui.cc:1630
+#: editor_markers.cc:1521 editor_mouse.cc:2272 processor_box.cc:3192
+#: processor_box.cc:3681 route_time_axis.cc:1110 route_ui.cc:1637
+#: vca_master_strip.cc:395
 msgid "Rename"
 msgstr ""
 
-#: editor_markers.cc:1432
+#: editor_markers.cc:1534
 msgid "rename marker"
 msgstr ""
 
-#: editor_mixer.cc:90
+#: editor_mixer.cc:98
 msgid "This screen is not tall enough to display the editor mixer"
 msgstr ""
 
-#: editor_mouse.cc:1223 editor_mouse.cc:1241 editor_tempodisplay.cc:270
+#: editor_mouse.cc:1345 editor_mouse.cc:1363 editor_tempodisplay.cc:384
 msgid ""
 "programming error: tempo marker canvas item has no marker object pointer!"
 msgstr ""
 
-#: editor_mouse.cc:1228 editor_tempodisplay.cc:275
+#: editor_mouse.cc:1350 editor_tempodisplay.cc:389
 msgid "programming error: marker for tempo is not a tempo marker!"
 msgstr ""
 
-#: editor_mouse.cc:1246 editor_tempodisplay.cc:375
+#: editor_mouse.cc:1368 editor_tempodisplay.cc:507
 msgid "programming error: marker for meter is not a meter marker!"
 msgstr ""
 
-#: editor_mouse.cc:1885 editor_mouse.cc:1910 editor_mouse.cc:1923
+#: editor_mouse.cc:2016 editor_mouse.cc:2041 editor_mouse.cc:2054
 msgid ""
 "programming error: control point canvas item has no control point object "
 "pointer!"
 msgstr ""
 
-#: editor_mouse.cc:2058
+#: editor_mouse.cc:2085
+msgid "edit note(s)"
+msgstr ""
+
+#: editor_mouse.cc:2193
 msgid "start point trim"
 msgstr ""
 
-#: editor_mouse.cc:2083
-msgid "End point trim"
+#: editor_mouse.cc:2218
+msgid "end point trim"
 msgstr ""
 
-#: editor_mouse.cc:2135
+#: editor_mouse.cc:2270
 msgid "Name for region:"
 msgstr ""
 
-#: editor_ops.cc:165
+#: editor_ops.cc:168
 msgid "split"
 msgstr ""
 
-#: editor_ops.cc:339
+#: editor_ops.cc:342
 msgid "alter selection"
 msgstr ""
 
-#: editor_ops.cc:381
+#: editor_ops.cc:384
 msgid "nudge regions forward"
 msgstr ""
 
-#: editor_ops.cc:404 editor_ops.cc:489
+#: editor_ops.cc:441 editor_ops.cc:535
 msgid "nudge location forward"
 msgstr ""
 
-#: editor_ops.cc:462
+#: editor_ops.cc:472
 msgid "nudge regions backward"
 msgstr ""
 
-#: editor_ops.cc:551
+#: editor_ops.cc:567
 msgid "nudge forward"
 msgstr ""
 
-#: editor_ops.cc:575
+#: editor_ops.cc:591
 msgid "nudge backward"
 msgstr ""
 
-#: editor_ops.cc:618
+#: editor_ops.cc:656
 msgid "sequence regions"
 msgstr ""
 
-#: editor_ops.cc:694
+#: editor_ops.cc:718
 msgid "build_region_boundary_cache called with snap_type = %1"
 msgstr ""
 
-#: editor_ops.cc:2042
+#: editor_ops.cc:2121
 msgid "New Location Marker"
 msgstr ""
 
-#: editor_ops.cc:2164
+#: editor_ops.cc:2212 editor_ops.cc:2236
+msgid "Set session start"
+msgstr ""
+
+#: editor_ops.cc:2304
 msgid "add markers"
 msgstr ""
 
-#: editor_ops.cc:2274
+#: editor_ops.cc:2400
 msgid "clear markers"
 msgstr ""
 
-#: editor_ops.cc:2289
+#: editor_ops.cc:2415
 msgid "clear ranges"
 msgstr ""
 
-#: editor_ops.cc:2305
+#: editor_ops.cc:2431
 msgid "clear locations"
 msgstr ""
 
-#: editor_ops.cc:2368
+#: editor_ops.cc:2494
 msgid "insert region"
 msgstr ""
 
-#: editor_ops.cc:2559
+#: editor_ops.cc:2685
 msgid "raise regions"
 msgstr ""
 
-#: editor_ops.cc:2561
+#: editor_ops.cc:2687
 msgid "raise region"
 msgstr ""
 
-#: editor_ops.cc:2567
+#: editor_ops.cc:2693
 msgid "raise regions to top"
 msgstr ""
 
-#: editor_ops.cc:2569
+#: editor_ops.cc:2695
 msgid "raise region to top"
 msgstr ""
 
-#: editor_ops.cc:2575
+#: editor_ops.cc:2701
 msgid "lower regions"
 msgstr ""
 
-#: editor_ops.cc:2577 editor_ops.cc:2585
+#: editor_ops.cc:2703 editor_ops.cc:2711
 msgid "lower region"
 msgstr ""
 
-#: editor_ops.cc:2583
+#: editor_ops.cc:2709
 msgid "lower regions to bottom"
 msgstr ""
 
-#: editor_ops.cc:2668
+#: editor_ops.cc:2794
 msgid "Rename Region"
 msgstr ""
 
-#: editor_ops.cc:2670 processor_box.cc:1992 route_ui.cc:1628
+#: editor_ops.cc:2796 processor_box.cc:3190 route_ui.cc:1635
 msgid "New name:"
 msgstr ""
 
-#: editor_ops.cc:2987
+#: editor_ops.cc:3097
 msgid "separate"
 msgstr ""
 
-#: editor_ops.cc:3099
+#: editor_ops.cc:3207
 msgid "separate region under"
 msgstr ""
 
-#: editor_ops.cc:3220
+#: editor_ops.cc:3360
 msgid "trim to selection"
 msgstr ""
 
-#: editor_ops.cc:3356
+#: editor_ops.cc:3442
 msgid "set sync point"
 msgstr ""
 
-#: editor_ops.cc:3380
+#: editor_ops.cc:3466
 msgid "remove region sync"
 msgstr ""
 
-#: editor_ops.cc:3402
+#: editor_ops.cc:3488
 msgid "move regions to original position"
 msgstr ""
 
-#: editor_ops.cc:3404
+#: editor_ops.cc:3490
 msgid "move region to original position"
 msgstr ""
 
-#: editor_ops.cc:3425
+#: editor_ops.cc:3511
 msgid "align selection"
 msgstr ""
 
-#: editor_ops.cc:3499
+#: editor_ops.cc:3585
 msgid "align selection (relative)"
 msgstr ""
 
-#: editor_ops.cc:3533
+#: editor_ops.cc:3619
 msgid "align region"
 msgstr ""
 
-#: editor_ops.cc:3584
+#: editor_ops.cc:3670
 msgid "trim front"
 msgstr ""
 
-#: editor_ops.cc:3584
+#: editor_ops.cc:3670
 msgid "trim back"
 msgstr ""
 
-#: editor_ops.cc:3614
+#: editor_ops.cc:3700
 msgid "trim to loop"
 msgstr ""
 
-#: editor_ops.cc:3624
+#: editor_ops.cc:3710
 msgid "trim to punch"
 msgstr ""
 
-#: editor_ops.cc:3686
+#: editor_ops.cc:3832
 msgid "trim to region"
 msgstr ""
 
-#: editor_ops.cc:3794
+#: editor_ops.cc:3891
 msgid ""
 "This track/bus cannot be frozen because the signal adds or loses channels "
 "before reaching the outputs.\n"
@@ -4995,11 +5661,11 @@ msgid ""
 "input or vice versa."
 msgstr ""
 
-#: editor_ops.cc:3797
+#: editor_ops.cc:3894
 msgid "Cannot freeze"
 msgstr ""
 
-#: editor_ops.cc:3803
+#: editor_ops.cc:3900
 msgid ""
 "<b>%1</b>\n"
 "\n"
@@ -5008,23 +5674,23 @@ msgid ""
 "Freezing will only process the signal as far as the first send/insert/return."
 msgstr ""
 
-#: editor_ops.cc:3807
+#: editor_ops.cc:3904
 msgid "Freeze anyway"
 msgstr ""
 
-#: editor_ops.cc:3808
+#: editor_ops.cc:3905
 msgid "Don't freeze"
 msgstr ""
 
-#: editor_ops.cc:3809
+#: editor_ops.cc:3906
 msgid "Freeze Limits"
 msgstr ""
 
-#: editor_ops.cc:3824
+#: editor_ops.cc:3921
 msgid "Cancel Freeze"
 msgstr ""
 
-#: editor_ops.cc:3854
+#: editor_ops.cc:3952
 msgid ""
 "You can't perform this operation because the processing of the signal will "
 "cause one or more of the tracks to end up with a region with more channels "
@@ -5033,182 +5699,202 @@ msgid ""
 "You can do this without processing, which is a different operation."
 msgstr ""
 
-#: editor_ops.cc:3858
+#: editor_ops.cc:3956
 msgid "Cannot bounce"
 msgstr ""
 
-#: editor_ops.cc:3869
+#: editor_ops.cc:4007
 msgid "bounce range"
 msgstr ""
 
-#: editor_ops.cc:3971
+#: editor_ops.cc:4074
 msgid "delete"
 msgstr ""
 
-#: editor_ops.cc:3974
+#: editor_ops.cc:4077
 msgid "cut"
 msgstr ""
 
-#: editor_ops.cc:3977
+#: editor_ops.cc:4080
 msgid "copy"
 msgstr ""
 
-#: editor_ops.cc:3980
+#: editor_ops.cc:4083
 msgid "clear"
 msgstr ""
 
-#: editor_ops.cc:4028
+#: editor_ops.cc:4132
 msgid "objects"
 msgstr ""
 
-#: editor_ops.cc:4238 editor_ops.cc:4270
+#: editor_ops.cc:4342 editor_ops.cc:4427
 msgid "remove region"
 msgstr ""
 
-#: editor_ops.cc:4719
-msgid "duplicate selection"
+#: editor_ops.cc:4844
+msgid "duplicate range selection"
 msgstr ""
 
-#: editor_ops.cc:4803
+#: editor_ops.cc:4938
 msgid "nudge track"
 msgstr ""
 
-#: editor_ops.cc:4840
+#: editor_ops.cc:4965
 msgid ""
 "Do you really want to destroy the last capture?\n"
 "(This is destructive and cannot be undone)"
 msgstr ""
 
-#: editor_ops.cc:4843 editor_ops.cc:6838 editor_regions.cc:462
-#: editor_snapshots.cc:159 route_ui.cc:1571
+#: editor_ops.cc:4968 editor_ops.cc:7202 editor_regions.cc:503
+#: editor_snapshots.cc:171
 msgid "No, do nothing."
 msgstr ""
 
-#: editor_ops.cc:4844
+#: editor_ops.cc:4969
 msgid "Yes, destroy it."
 msgstr ""
 
-#: editor_ops.cc:4846
+#: editor_ops.cc:4971
 msgid "Destroy last capture"
 msgstr ""
 
-#: editor_ops.cc:4906
+#: editor_ops.cc:5047
 msgid "normalize"
 msgstr "normalise"
 
-#: editor_ops.cc:5000
+#: editor_ops.cc:5145
 msgid "reverse regions"
 msgstr ""
 
-#: editor_ops.cc:5034
+#: editor_ops.cc:5182
 msgid "strip silence"
 msgstr ""
 
-#: editor_ops.cc:5091
+#: editor_ops.cc:5263
 msgid "Fork Region(s)"
 msgstr ""
 
-#: editor_ops.cc:5112
+#: editor_ops.cc:5270
 msgid "Could not unlink %1"
 msgstr ""
 
-#: editor_ops.cc:5326
+#: editor_ops.cc:5532
 msgid "reset region gain"
 msgstr ""
 
-#: editor_ops.cc:5379
+#: editor_ops.cc:5590
 msgid "region gain envelope active"
 msgstr ""
 
-#: editor_ops.cc:5406
+#: editor_ops.cc:5615
 msgid "toggle region lock"
 msgstr ""
 
-#: editor_ops.cc:5430
+#: editor_ops.cc:5639
 msgid "Toggle Video Lock"
 msgstr ""
 
-#: editor_ops.cc:5454
+#: editor_ops.cc:5663
 msgid "region lock style"
 msgstr ""
 
-#: editor_ops.cc:5479
+#: editor_ops.cc:5688
 msgid "change region opacity"
 msgstr ""
 
-#: editor_ops.cc:5572
+#: editor_ops.cc:5781
 msgid "fade range"
 msgstr ""
 
-#: editor_ops.cc:5610
+#: editor_ops.cc:5819
 msgid "set fade in length"
 msgstr ""
 
-#: editor_ops.cc:5617
+#: editor_ops.cc:5826
 msgid "set fade out length"
 msgstr ""
 
-#: editor_ops.cc:5662
+#: editor_ops.cc:5891
 msgid "set fade in shape"
 msgstr ""
 
-#: editor_ops.cc:5693
+#: editor_ops.cc:5926
 msgid "set fade out shape"
 msgstr ""
 
-#: editor_ops.cc:5723
+#: editor_ops.cc:5962
 msgid "set fade in active"
 msgstr ""
 
-#: editor_ops.cc:5752
+#: editor_ops.cc:5996
 msgid "set fade out active"
 msgstr ""
 
-#: editor_ops.cc:5994
+#: editor_ops.cc:6056
+msgid "toggle fade active"
+msgstr ""
+
+#: editor_ops.cc:6249
 msgid "set loop range from selection"
 msgstr ""
 
-#: editor_ops.cc:6008
+#: editor_ops.cc:6263
 msgid "set loop range from region"
 msgstr ""
 
-#: editor_ops.cc:6027
+#: editor_ops.cc:6282
 msgid "set punch range from selection"
 msgstr ""
 
-#: editor_ops.cc:6041
+#: editor_ops.cc:6306
 msgid "set session start/end from selection"
 msgstr ""
 
-#: editor_ops.cc:6066
+#: editor_ops.cc:6344
+msgid "set punch start from EP"
+msgstr ""
+
+#: editor_ops.cc:6372
+msgid "set punch end from EP"
+msgstr ""
+
+#: editor_ops.cc:6405
+msgid "set loop start from EP"
+msgstr ""
+
+#: editor_ops.cc:6433
+msgid "set loop end from EP"
+msgstr ""
+
+#: editor_ops.cc:6444
 msgid "set punch range from region"
 msgstr ""
 
-#: editor_ops.cc:6175
+#: editor_ops.cc:6531
 msgid "Add new marker"
 msgstr ""
 
-#: editor_ops.cc:6176
+#: editor_ops.cc:6532
 msgid "Set global tempo"
 msgstr ""
 
-#: editor_ops.cc:6179
+#: editor_ops.cc:6535
 msgid "Define one bar"
 msgstr ""
 
-#: editor_ops.cc:6180
+#: editor_ops.cc:6536
 msgid "Do you want to set the global tempo or add a new tempo marker?"
 msgstr ""
 
-#: editor_ops.cc:6206
+#: editor_ops.cc:6562
 msgid "set tempo from region"
 msgstr ""
 
-#: editor_ops.cc:6236
+#: editor_ops.cc:6591
 msgid "split regions"
 msgstr ""
 
-#: editor_ops.cc:6278
+#: editor_ops.cc:6633
 msgid ""
 "You are about to split\n"
 "%1\n"
@@ -5216,11 +5902,11 @@ msgid ""
 "This could take a long time."
 msgstr ""
 
-#: editor_ops.cc:6285
+#: editor_ops.cc:6640
 msgid "Call for the Ferret!"
 msgstr ""
 
-#: editor_ops.cc:6286
+#: editor_ops.cc:6641
 msgid ""
 "Press OK to continue with this split operation\n"
 "or ask the Ferret dialog to tune the analysis"
@@ -5228,52 +5914,52 @@ msgstr ""
 "Press OK to continue with this split operation\n"
 "or ask the Ferret dialogue to tune the analysis"
 
-#: editor_ops.cc:6288
+#: editor_ops.cc:6643
 msgid "Press OK to continue with this split operation"
 msgstr ""
 
-#: editor_ops.cc:6291
+#: editor_ops.cc:6646
 msgid "Excessive split?"
 msgstr ""
 
-#: editor_ops.cc:6443
+#: editor_ops.cc:6800
 msgid "place transient"
 msgstr ""
 
-#: editor_ops.cc:6478
+#: editor_ops.cc:6834
 msgid "snap regions to grid"
 msgstr ""
 
-#: editor_ops.cc:6517
+#: editor_ops.cc:6873
 msgid "Close Region Gaps"
 msgstr ""
 
-#: editor_ops.cc:6522
+#: editor_ops.cc:6878
 msgid "Crossfade length"
 msgstr ""
 
-#: editor_ops.cc:6531 editor_ops.cc:6542 rhythm_ferret.cc:119
-#: session_option_editor.cc:141
+#: editor_ops.cc:6887 editor_ops.cc:6898 rhythm_ferret.cc:128
+#: rhythm_ferret.cc:143 session_option_editor.cc:141
 msgid "ms"
 msgstr ""
 
-#: editor_ops.cc:6533
+#: editor_ops.cc:6889
 msgid "Pull-back length"
 msgstr ""
 
-#: editor_ops.cc:6546
+#: editor_ops.cc:6902 keyeditor.cc:71
 msgid "Ok"
 msgstr ""
 
-#: editor_ops.cc:6561
+#: editor_ops.cc:6917
 msgid "close region gaps"
 msgstr ""
 
-#: editor_ops.cc:6786 route_ui.cc:1545
+#: editor_ops.cc:7160
 msgid "That would be bad news ...."
 msgstr ""
 
-#: editor_ops.cc:6791 route_ui.cc:1550
+#: editor_ops.cc:7165
 msgid ""
 "Removing the master or monitor bus is such a bad idea\n"
 "that %1 is not going to allow it.\n"
@@ -5283,23 +5969,19 @@ msgid ""
 "\"allow-special-bus-removal\" option to be \"yes\""
 msgstr ""
 
-#: editor_ops.cc:6809
-msgid "tracks"
-msgstr ""
-
-#: editor_ops.cc:6811 route_ui.cc:1994
+#: editor_ops.cc:7181
 msgid "track"
-msgstr ""
-
-#: editor_ops.cc:6815
-msgid "busses"
-msgstr ""
+msgid_plural "tracks"
+msgstr[0] ""
+msgstr[1] ""
 
-#: editor_ops.cc:6817 route_ui.cc:1994
+#: editor_ops.cc:7182
 msgid "bus"
-msgstr ""
+msgid_plural "busses"
+msgstr[0] ""
+msgstr[1] ""
 
-#: editor_ops.cc:6822
+#: editor_ops.cc:7186
 msgid ""
 "Do you really want to remove %1 %2 and %3 %4?\n"
 "(You may also lose the playlists associated with the %2)\n"
@@ -5307,7 +5989,7 @@ msgid ""
 "This action cannot be undone, and the session file will be overwritten!"
 msgstr ""
 
-#: editor_ops.cc:6827
+#: editor_ops.cc:7191
 msgid ""
 "Do you really want to remove %1 %2?\n"
 "(You may also lose the playlists associated with the %2)\n"
@@ -5315,358 +5997,371 @@ msgid ""
 "This action cannot be undone, and the session file will be overwritten!"
 msgstr ""
 
-#: editor_ops.cc:6833
+#: editor_ops.cc:7197
 msgid ""
 "Do you really want to remove %1 %2?\n"
 "\n"
 "This action cannot be undone, and the session file will be overwritten"
 msgstr ""
 
-#: editor_ops.cc:6840
+#: editor_ops.cc:7204
 msgid "Yes, remove them."
 msgstr ""
 
-#: editor_ops.cc:6842 editor_snapshots.cc:160 route_ui.cc:1572
+#: editor_ops.cc:7206 editor_snapshots.cc:172
 msgid "Yes, remove it."
 msgstr ""
 
-#: editor_ops.cc:6847 editor_ops.cc:6849
+#: editor_ops.cc:7211 editor_ops.cc:7213
 msgid "Remove %1"
 msgstr ""
 
-#: editor_ops.cc:6912
+#: editor_ops.cc:7319 editor_ops.cc:7333 editor_ops.cc:7373 editor_ops.cc:7383
 msgid "insert time"
 msgstr ""
 
-#: editor_ops.cc:7076
+#: editor_ops.cc:7436
+msgid "Cannot insert or delete time when in Lock edit."
+msgstr ""
+
+#: editor_ops.cc:7456 editor_ops.cc:7468 editor_ops.cc:7541 editor_ops.cc:7554
+msgid "remove time"
+msgstr ""
+
+#: editor_ops.cc:7628
 msgid "There are too many tracks to fit in the current window"
 msgstr ""
 
-#: editor_ops.cc:7137
+#: editor_ops.cc:7689
 msgid "Sel"
 msgstr ""
 
-#: editor_ops.cc:7176
+#: editor_ops.cc:7728
 #, c-format
 msgid "Saved view %u"
 msgstr ""
 
-#: editor_ops.cc:7201
+#: editor_ops.cc:7753
 msgid "mute regions"
 msgstr ""
 
-#: editor_ops.cc:7203
+#: editor_ops.cc:7755
 msgid "mute region"
 msgstr ""
 
-#: editor_ops.cc:7240
+#: editor_ops.cc:7792
 msgid "combine regions"
 msgstr ""
 
-#: editor_ops.cc:7278
+#: editor_ops.cc:7830
 msgid "uncombine regions"
 msgstr ""
 
-#: editor_ops.cc:7315
+#: editor_ops.cc:7867
 msgid "%1: Locked"
 msgstr ""
 
-#: editor_ops.cc:7322
+#: editor_ops.cc:7874
 msgid "Click to unlock"
 msgstr ""
 
-#: editor_ops.cc:7376
+#: editor_ops.cc:7923
 msgid "Moving embedded files into session folder"
 msgstr ""
 
-#: editor_regions.cc:112
+#: editor_regions.cc:159
 msgid "Region name, with number of channels in []'s"
 msgstr ""
 
-#: editor_regions.cc:113
+#: editor_regions.cc:160
 msgid "Position of start of region"
 msgstr ""
 
-#: editor_regions.cc:114 editor_regions.cc:851 time_info_box.cc:101
+#: editor_regions.cc:161 editor_regions.cc:935 time_info_box.cc:95
 msgid "End"
 msgstr ""
 
-#: editor_regions.cc:114
+#: editor_regions.cc:161
 msgid "Position of end of region"
 msgstr ""
 
-#: editor_regions.cc:115
+#: editor_regions.cc:162
 msgid "Length of the region"
 msgstr ""
 
-#: editor_regions.cc:116
+#: editor_regions.cc:163
 msgid "Position of region sync point, relative to start of the region"
 msgstr ""
 
-#: editor_regions.cc:117
+#: editor_regions.cc:164
 msgid "Length of region fade-in (units: secondary clock), () if disabled"
 msgstr ""
 
-#: editor_regions.cc:118
+#: editor_regions.cc:165
 msgid "Length of region fade-out (units: secondary clock), () if disabled"
 msgstr ""
 
-#: editor_regions.cc:119 mixer_strip.cc:2055 mono_panner.cc:203
-#: panner2d.cc:240 stereo_panner.cc:251 stereo_panner.cc:274
-msgid "L"
+#: editor_regions.cc:166
+msgid "Lock|L"
 msgstr ""
 
-#: editor_regions.cc:119
+#: editor_regions.cc:166
 msgid "Region position locked?"
 msgstr ""
 
-#: editor_regions.cc:120 route_time_axis.cc:103
-msgid "G"
+#: editor_regions.cc:167
+msgid "Gain|G"
 msgstr ""
 
-#: editor_regions.cc:120
+#: editor_regions.cc:167
 msgid "Region position glued to Bars|Beats time?"
 msgstr ""
 
-#: editor_regions.cc:121 editor_routes.cc:211 gain_meter.cc:793
-#: mixer_strip.cc:2032 meter_strip.cc:363 panner_ui.cc:603
-#: route_time_axis.cc:2713 stereo_panner.cc:271 time_axis_view.cc:1190
-msgid "M"
-msgstr ""
-
-#: editor_regions.cc:121
+#: editor_regions.cc:168
 msgid "Region muted?"
 msgstr ""
 
-#: editor_regions.cc:122 mixer_strip.cc:1855
-msgid "O"
+#: editor_regions.cc:169
+msgid "Opaque|O"
 msgstr ""
 
-#: editor_regions.cc:122
+#: editor_regions.cc:169
 msgid "Region opaque (blocks regions below it from being heard)?"
 msgstr ""
 
-#: editor_regions.cc:311 editor_regions.cc:316 editor_regions.cc:318
+#: editor_regions.cc:360 editor_regions.cc:365 editor_regions.cc:367
 msgid "Hidden"
 msgstr ""
 
-#: editor_regions.cc:391
+#: editor_regions.cc:432
 msgid "(MISSING) "
 msgstr ""
 
-#: editor_regions.cc:459
+#: editor_regions.cc:500
 msgid ""
 "Do you really want to remove unused regions?\n"
 "(This is destructive and cannot be undone)"
 msgstr ""
 
-#: editor_regions.cc:463
+#: editor_regions.cc:504
 msgid "Yes, remove."
 msgstr ""
 
-#: editor_regions.cc:465
+#: editor_regions.cc:506
 msgid "Remove unused regions"
 msgstr ""
 
-#: editor_regions.cc:818 editor_regions.cc:832 editor_regions.cc:846
+#: editor_regions.cc:735
+msgid "EditorRegions::format_position: negative timecode position: %1"
+msgstr ""
+
+#: editor_regions.cc:900 editor_regions.cc:916 editor_regions.cc:930
 msgid "Mult."
 msgstr ""
 
-#: editor_regions.cc:849 midi_list_editor.cc:104 time_info_box.cc:94
+#: editor_regions.cc:933 midi_list_editor.cc:104 time_info_box.cc:88
 msgid "Start"
 msgstr ""
 
-#: editor_regions.cc:867 editor_regions.cc:883
+#: editor_regions.cc:951 editor_regions.cc:967
 msgid "Multiple"
 msgstr ""
 
-#: editor_regions.cc:952
+#: editor_regions.cc:1036
 msgid "MISSING "
 msgstr ""
 
-#: editor_routes.cc:182 editor_routes.cc:214
+#: editor_routes.cc:126
+msgid "RS"
+msgstr ""
+
+#: editor_routes.cc:208
 msgid "SS"
 msgstr ""
 
-#: editor_routes.cc:206
+#: editor_routes.cc:233
 msgid "Track/Bus Name"
 msgstr ""
 
-#: editor_routes.cc:207
+#: editor_routes.cc:234
 msgid "Track/Bus visible ?"
 msgstr ""
 
-#: editor_routes.cc:208 mixer_strip.cc:2046 meter_strip.cc:375
-#: route_time_axis.cc:105 route_time_axis.cc:2701
-msgid "A"
-msgstr ""
-
-#: editor_routes.cc:208
+#: editor_routes.cc:235
 msgid "Track/Bus active ?"
 msgstr ""
 
-#: editor_routes.cc:209 mixer_strip.cc:2033 mixer_strip.cc:2054
-#: meter_strip.cc:383
-msgid "I"
+#: editor_routes.cc:236
+msgid "MidiInput|I"
 msgstr ""
 
-#: editor_routes.cc:209
+#: editor_routes.cc:236
 msgid "MIDI input enabled"
 msgstr ""
 
-#: editor_routes.cc:210 mono_panner.cc:220 panner2d.cc:241
-#: stereo_panner.cc:249 stereo_panner.cc:276
-msgid "R"
+#: editor_routes.cc:237
+msgid "Rec|R"
 msgstr ""
 
-#: editor_routes.cc:210
+#: editor_routes.cc:237
 msgid "Record enabled"
 msgstr ""
 
-#: editor_routes.cc:211
-msgid "Muted"
+#: editor_routes.cc:238
+msgid "Rec|RS"
 msgstr ""
 
-#: editor_routes.cc:212 mixer_strip.cc:2042 meter_strip.cc:371
-#: route_time_axis.cc:2710
-msgid "S"
+#: editor_routes.cc:238
+msgid "Record Safe"
+msgstr ""
+
+#: editor_routes.cc:239
+msgid "Muted"
 msgstr ""
 
-#: editor_routes.cc:212
+#: editor_routes.cc:240
 msgid "Soloed"
 msgstr ""
 
-#: editor_routes.cc:213
-msgid "SI"
+#: editor_routes.cc:241
+msgid "SoloIso|SI"
 msgstr ""
 
-#: editor_routes.cc:213
+#: editor_routes.cc:241
 msgid "Solo Isolated"
 msgstr ""
 
-#: editor_routes.cc:214
+#: editor_routes.cc:242
+msgid "SoloLock|SS"
+msgstr ""
+
+#: editor_routes.cc:242
 msgid "Solo Safe (Locked)"
 msgstr ""
 
-#: editor_routes.cc:477 mixer_ui.cc:1197
+#: editor_routes.cc:550 mixer_ui.cc:1498
 msgid "Hide All"
 msgstr ""
 
-#: editor_routes.cc:478 mixer_ui.cc:1198
+#: editor_routes.cc:551 mixer_ui.cc:1499
 msgid "Show All Audio Tracks"
 msgstr ""
 
-#: editor_routes.cc:479 mixer_ui.cc:1199
+#: editor_routes.cc:552 mixer_ui.cc:1500
 msgid "Hide All Audio Tracks"
 msgstr ""
 
-#: editor_routes.cc:480 mixer_ui.cc:1200
+#: editor_routes.cc:553 mixer_ui.cc:1501
 msgid "Show All Audio Busses"
 msgstr ""
 
-#: editor_routes.cc:481 mixer_ui.cc:1201
+#: editor_routes.cc:554 mixer_ui.cc:1502
 msgid "Hide All Audio Busses"
 msgstr ""
 
-#: editor_routes.cc:482
+#: editor_routes.cc:555 mixer_ui.cc:1503
 msgid "Show All Midi Tracks"
 msgstr ""
 
-#: editor_routes.cc:483
+#: editor_routes.cc:556 mixer_ui.cc:1504
 msgid "Hide All Midi Tracks"
 msgstr ""
 
-#: editor_routes.cc:484
-msgid "Show Tracks With Regions Under Playhead"
+#: editor_routes.cc:557
+msgid "Only Show Tracks with Regions Under Playhead"
 msgstr ""
 
-#: editor_rulers.cc:211
+#: editor_rulers.cc:212
 msgid "New location marker"
 msgstr ""
 
-#: editor_rulers.cc:212
+#: editor_rulers.cc:213
 msgid "Clear all locations"
 msgstr ""
 
-#: editor_rulers.cc:213
+#: editor_rulers.cc:214
 msgid "Unhide locations"
 msgstr ""
 
-#: editor_rulers.cc:217
+#: editor_rulers.cc:218
 msgid "New range"
 msgstr ""
 
-#: editor_rulers.cc:218
+#: editor_rulers.cc:219
 msgid "Clear all ranges"
 msgstr ""
 
-#: editor_rulers.cc:219
+#: editor_rulers.cc:220
 msgid "Unhide ranges"
 msgstr ""
 
 #: editor_rulers.cc:224
-msgid "Make Loop range"
+msgid "New Loop range"
 msgstr ""
 
 #: editor_rulers.cc:225
-msgid "Make Punch range"
+msgid "New Punch range"
 msgstr ""
 
 #: editor_rulers.cc:230
 msgid "New CD track marker"
 msgstr ""
 
-#: editor_rulers.cc:235 tempo_dialog.cc:38
+#: editor_rulers.cc:234 tempo_dialog.cc:38
 msgid "New Tempo"
 msgstr ""
 
-#: editor_rulers.cc:239 tempo_dialog.cc:296
+#: editor_rulers.cc:238 tempo_dialog.cc:419
 msgid "New Meter"
 msgstr ""
 
-#: editor_snapshots.cc:137
+#: editor_snapshots.cc:149
 msgid "Rename Snapshot"
 msgstr ""
 
-#: editor_snapshots.cc:139
+#: editor_snapshots.cc:151
 msgid "New name of snapshot"
 msgstr ""
 
-#: editor_snapshots.cc:157
+#: editor_snapshots.cc:169
 msgid ""
 "Do you really want to remove snapshot \"%1\" ?\n"
 "(which cannot be undone)"
 msgstr ""
 
-#: editor_snapshots.cc:162
+#: editor_snapshots.cc:174
 msgid "Remove snapshot"
 msgstr ""
 
-#: editor_tempodisplay.cc:194 editor_tempodisplay.cc:234
-msgid "add"
+#: editor_tempodisplay.cc:318
+msgid "add tempo mark"
 msgstr ""
 
-#: editor_tempodisplay.cc:215
-msgid "add tempo mark"
+#: editor_tempodisplay.cc:343
+msgid "add"
 msgstr ""
 
-#: editor_tempodisplay.cc:254
+#: editor_tempodisplay.cc:362
 msgid "add meter mark"
 msgstr ""
 
-#: editor_tempodisplay.cc:287 editor_tempodisplay.cc:315
+#: editor_tempodisplay.cc:401 editor_tempodisplay.cc:435
 msgid "done"
 msgstr ""
 
-#: editor_tempodisplay.cc:304 editor_tempodisplay.cc:330
+#: editor_tempodisplay.cc:422
+msgid "replace meter mark"
+msgstr ""
+
+#: editor_tempodisplay.cc:454
 msgid "replace tempo mark"
 msgstr ""
 
-#: editor_tempodisplay.cc:353 editor_tempodisplay.cc:387
+#: editor_tempodisplay.cc:485 editor_tempodisplay.cc:519
 msgid "remove tempo mark"
 msgstr ""
 
-#: editor_tempodisplay.cc:370
+#: editor_tempodisplay.cc:502
 msgid ""
 "programming error: meter marker canvas item has no marker object pointer!"
 msgstr ""
@@ -5675,329 +6370,382 @@ msgstr ""
 msgid "stretch/shrink"
 msgstr ""
 
-#: editor_timefx.cc:129
+#: editor_timefx.cc:130
 msgid "pitch shift"
 msgstr ""
 
-#: editor_timefx.cc:301
+#: editor_timefx.cc:282
 msgid "timefx cannot be started - thread creation error"
 msgstr ""
 
-#: engine_dialog.cc:83
+#: engine_dialog.cc:86
 msgid "Device Control Panel"
 msgstr ""
 
-#: engine_dialog.cc:84
+#: engine_dialog.cc:87
 msgid "Midi Device Setup"
 msgstr ""
 
-#: engine_dialog.cc:85 engine_dialog.cc:2097
+#: engine_dialog.cc:89
+msgid "Refresh Devices"
+msgstr ""
+
+#: engine_dialog.cc:90
+msgid "Use Buffered I/O"
+msgstr ""
+
+#: engine_dialog.cc:91 engine_dialog.cc:3000
 msgid "Measure"
 msgstr ""
 
-#: engine_dialog.cc:86
+#: engine_dialog.cc:92
 msgid "Use results"
 msgstr ""
 
-#: engine_dialog.cc:87
+#: engine_dialog.cc:93
 msgid "Back to settings ... (ignore results)"
 msgstr ""
 
-#: engine_dialog.cc:88
+#: engine_dialog.cc:94
 msgid "Calibrate Audio"
 msgstr ""
 
-#: engine_dialog.cc:92
+#: engine_dialog.cc:98
 msgid "Back to settings"
 msgstr ""
 
-#: engine_dialog.cc:111
+#: engine_dialog.cc:120
 msgid ""
 "No audio/MIDI backends detected. %1 cannot run\n"
 "\n"
 "(This is a build/packaging/system error. It should never happen.)"
 msgstr ""
 
-#: engine_dialog.cc:137
+#: engine_dialog.cc:145
 msgid "Latency Measurement Tool"
 msgstr ""
 
-#: engine_dialog.cc:149
+#: engine_dialog.cc:157
 msgid ""
 "<span weight=\"bold\">Turn down the volume on your audio equipment to a very "
 "low level.</span>"
 msgstr ""
 
-#: engine_dialog.cc:158
+#: engine_dialog.cc:166
 msgid "Select two channels below and connect them using a cable."
 msgstr ""
 
-#: engine_dialog.cc:163
+#: engine_dialog.cc:171
 msgid "Output channel"
 msgstr ""
 
-#: engine_dialog.cc:171
+#: engine_dialog.cc:179
 msgid "Input channel"
 msgstr ""
 
-#: engine_dialog.cc:206
+#: engine_dialog.cc:213
 msgid "Once the channels are connected, click the \"Measure\" button."
 msgstr ""
 
-#: engine_dialog.cc:213
+#: engine_dialog.cc:220
 msgid "When satisfied with the results, click the \"Use results\" button."
 msgstr ""
 
-#: engine_dialog.cc:228 engine_dialog.cc:2217 engine_dialog.cc:2227
+#: engine_dialog.cc:235 engine_dialog.cc:3138 engine_dialog.cc:3148
 msgid "No measurement results yet"
 msgstr ""
 
-#: engine_dialog.cc:238 route_params_ui.cc:106
+#: engine_dialog.cc:245 route_params_ui.cc:106
 msgid "Latency"
 msgstr ""
 
-#: engine_dialog.cc:372
+#: engine_dialog.cc:520
 msgid "Audio System:"
 msgstr ""
 
-#: engine_dialog.cc:409
+#: engine_dialog.cc:564
 msgid "Driver:"
 msgstr ""
 
-#: engine_dialog.cc:415
+#: engine_dialog.cc:571
+msgid "Input Device:"
+msgstr ""
+
+#: engine_dialog.cc:575
+msgid "Output Device:"
+msgstr ""
+
+#: engine_dialog.cc:582
 msgid "Device:"
 msgstr ""
 
-#: engine_dialog.cc:420 engine_dialog.cc:519 sfdb_ui.cc:153 sfdb_ui.cc:348
-#: sfdb_ui.cc:353
+#: engine_dialog.cc:591 engine_dialog.cc:699 export_report.cc:164
+#: export_report.cc:328 sfdb_ui.cc:153 sfdb_ui.cc:348 sfdb_ui.cc:353
 msgid "Sample rate:"
 msgstr ""
 
-#: engine_dialog.cc:426 engine_dialog.cc:526
+#: engine_dialog.cc:597 engine_dialog.cc:706
 msgid "Buffer size:"
 msgstr ""
 
-#: engine_dialog.cc:444
+#: engine_dialog.cc:606
+msgid "Periods:"
+msgstr ""
+
+#: engine_dialog.cc:624
 msgid "Input Channels:"
 msgstr ""
 
-#: engine_dialog.cc:457
+#: engine_dialog.cc:637
 msgid "Output Channels:"
 msgstr ""
 
-#: engine_dialog.cc:469
+#: engine_dialog.cc:649
 msgid "Hardware input latency:"
 msgstr ""
 
-#: engine_dialog.cc:472 engine_dialog.cc:485
+#: engine_dialog.cc:652 engine_dialog.cc:665
 msgid "samples"
 msgstr ""
 
-#: engine_dialog.cc:482
+#: engine_dialog.cc:662
 msgid "Hardware output latency:"
 msgstr ""
 
-#: engine_dialog.cc:493
+#: engine_dialog.cc:673
 msgid "MIDI System:"
 msgstr ""
 
-#: engine_dialog.cc:511
+#: engine_dialog.cc:691
 msgid ""
-"The %1 audio backend was configured and started externally.\n"
-"This limits your control over it."
+"%1 is already running. %2 will connect to it and use the existing settings."
 msgstr ""
 
-#: engine_dialog.cc:564
+#: engine_dialog.cc:744
 msgid ""
 "Failed to start or connect to audio-engine.\n"
 "\n"
 "Latency calibration requires a working audio interface."
 msgstr ""
 
-#: engine_dialog.cc:570
+#: engine_dialog.cc:750
 msgid ""
 "Your selected audio configuration is playback- or capture-only.\n"
 "\n"
 "Latency calibration requires playback and capture"
 msgstr ""
 
-#: engine_dialog.cc:651
+#: engine_dialog.cc:965
 msgid "MIDI Devices"
 msgstr ""
 
-#: engine_dialog.cc:657
+#: engine_dialog.cc:971
 msgid "Device"
 msgstr ""
 
-#: engine_dialog.cc:659
+#: engine_dialog.cc:973
 msgid "Hardware Latencies"
 msgstr ""
 
-#: engine_dialog.cc:700
+#: engine_dialog.cc:1014
 msgid "Calibrate"
 msgstr ""
 
-#: engine_dialog.cc:800
+#: engine_dialog.cc:1117
 msgid "all available channels"
 msgstr ""
 
-#: engine_dialog.cc:1039 latency_gui.cc:39
-msgid "sample"
-msgid_plural "samples"
+#: engine_dialog.cc:1599 latency_gui.cc:55
+msgid "%1 sample"
+msgid_plural "%1 samples"
 msgstr[0] ""
 msgstr[1] ""
 
-#: engine_dialog.cc:1090
+#: engine_dialog.cc:1662
 #, c-format
 msgid "(%.1f ms)"
 msgstr ""
 
-#: engine_dialog.cc:1593
+#: engine_dialog.cc:2413
 msgid "Could not start backend engine %1"
 msgstr ""
 
-#: engine_dialog.cc:1644
+#: engine_dialog.cc:2445
 msgid "Cannot set driver to %1"
 msgstr ""
 
-#: engine_dialog.cc:1648
+#: engine_dialog.cc:2450
+msgid "Cannot set input device name to %1"
+msgstr ""
+
+#: engine_dialog.cc:2454
+msgid "Cannot set output device name to %1"
+msgstr ""
+
+#: engine_dialog.cc:2459
 msgid "Cannot set device name to %1"
 msgstr ""
 
-#: engine_dialog.cc:1652
+#: engine_dialog.cc:2464
 msgid "Cannot set sample rate to %1"
 msgstr ""
 
-#: engine_dialog.cc:1656
+#: engine_dialog.cc:2468
 msgid "Cannot set buffer size to %1"
 msgstr ""
 
-#: engine_dialog.cc:1662
+#: engine_dialog.cc:2472
+msgid "Cannot set periods to %1"
+msgstr ""
+
+#: engine_dialog.cc:2478
 msgid "Cannot set input channels to %1"
 msgstr ""
 
-#: engine_dialog.cc:1666
+#: engine_dialog.cc:2482
 msgid "Cannot set output channels to %1"
 msgstr ""
 
-#: engine_dialog.cc:1672
+#: engine_dialog.cc:2488
 msgid "Cannot set input latency to %1"
 msgstr ""
 
-#: engine_dialog.cc:1676
+#: engine_dialog.cc:2492
 msgid "Cannot set output latency to %1"
 msgstr ""
 
-#: engine_dialog.cc:1955 engine_dialog.cc:2014
+#: engine_dialog.cc:2851 engine_dialog.cc:2917
 msgid "No signal detected "
 msgstr ""
 
-#: engine_dialog.cc:1968 engine_dialog.cc:2022 port_insert_ui.cc:70
+#: engine_dialog.cc:2858
+msgid ""
+"Input signal is > -3dBFS. Lower the signal level (output gain, input gain) "
+"on the audio-interface."
+msgstr ""
+
+#: engine_dialog.cc:2871 engine_dialog.cc:2925 port_insert_ui.cc:70
 #: port_insert_ui.cc:98
 msgid "Disconnected from audio engine"
 msgstr ""
 
-#: engine_dialog.cc:1977 engine_dialog.cc:2030
+#: engine_dialog.cc:2880 engine_dialog.cc:2933
 msgid "Detected roundtrip latency: "
 msgstr ""
 
-#: engine_dialog.cc:1979 engine_dialog.cc:2032
+#: engine_dialog.cc:2882 engine_dialog.cc:2935
 msgid "Systemic latency: "
 msgstr ""
 
-#: engine_dialog.cc:1986
+#: engine_dialog.cc:2889
 msgid "(signal detection error)"
 msgstr ""
 
-#: engine_dialog.cc:1992
+#: engine_dialog.cc:2895
 msgid "(inverted - bad wiring)"
 msgstr ""
 
-#: engine_dialog.cc:2039
+#: engine_dialog.cc:2942
 msgid "(averaging)"
 msgstr ""
 
-#: engine_dialog.cc:2045
+#: engine_dialog.cc:2948
 msgid "(too large jitter)"
 msgstr ""
 
-#: engine_dialog.cc:2049
+#: engine_dialog.cc:2952
 msgid "(large jitter)"
 msgstr ""
 
-#: engine_dialog.cc:2061
+#: engine_dialog.cc:2964
 msgid "Timeout - large MIDI jitter."
 msgstr ""
 
-#: engine_dialog.cc:2077 port_insert_ui.cc:134
+#: engine_dialog.cc:2980 port_insert_ui.cc:134
 msgid "Detecting ..."
 msgstr ""
 
-#: engine_dialog.cc:2171
+#: engine_dialog.cc:3081
 msgid "Disconnect from %1"
 msgstr ""
 
-#: engine_dialog.cc:2175 mixer_strip.cc:1522 route_group_dialog.cc:45
-#: route_time_axis.cc:841
-msgid "Active"
+#: engine_dialog.cc:3086
+msgid "Running"
+msgstr ""
+
+#: engine_dialog.cc:3088
+msgid "Connected"
 msgstr ""
 
-#: engine_dialog.cc:2185
+#: engine_dialog.cc:3099
 msgid "Connect to %1"
 msgstr ""
 
-#: engine_dialog.cc:2190
-msgid "Inactive"
+#: engine_dialog.cc:3103 shuttle_control.cc:655
+msgid "Stopped"
 msgstr ""
 
-#: export_channel_selector.cc:45 sfdb_ui.cc:151
+#: export_channel_selector.cc:46 export_report.cc:159 export_report.cc:324
+#: sfdb_ui.cc:151
 msgid "Channels:"
 msgstr ""
 
-#: export_channel_selector.cc:46
+#: export_channel_selector.cc:47
 msgid "Split to mono files"
 msgstr ""
 
-#: export_channel_selector.cc:182
+#: export_channel_selector.cc:197
 msgid "Bus or Track"
 msgstr ""
 
-#: export_channel_selector.cc:459
+#: export_channel_selector.cc:474
 msgid "Region contents without fades nor region gain (channels: %1)"
 msgstr ""
 
-#: export_channel_selector.cc:463
+#: export_channel_selector.cc:478
 msgid "Region contents with fades and region gain (channels: %1)"
 msgstr ""
 
-#: export_channel_selector.cc:467
+#: export_channel_selector.cc:482
 msgid "Track output (channels: %1)"
 msgstr ""
 
-#: export_channel_selector.cc:536
-msgid "Export region contents"
+#: export_channel_selector.cc:552
+msgid "Apply track/bus processing"
+msgstr ""
+
+#: export_channel_selector.cc:553
+msgid "Select all tracks"
+msgstr ""
+
+#: export_channel_selector.cc:554
+msgid "Select all busses"
+msgstr ""
+
+#: export_channel_selector.cc:555
+msgid "Deselect all"
 msgstr ""
 
-#: export_channel_selector.cc:537
-msgid "Export track output"
+#: export_channel_selector.cc:589
+msgid "Track name"
 msgstr ""
 
-#: export_dialog.cc:46
+#: export_dialog.cc:48
 msgid ""
 "<span color=\"#ffa755\">Some already existing files will be overwritten.</"
 "span>"
 msgstr ""
 
-#: export_dialog.cc:47
+#: export_dialog.cc:49
 msgid "List files"
 msgstr ""
 
-#: export_dialog.cc:158 export_format_dialog.cc:59
+#: export_dialog.cc:158 export_format_dialog.cc:67
 msgid "File format"
 msgstr ""
 
-#: export_dialog.cc:159 export_timespan_selector.cc:374
-#: export_timespan_selector.cc:436
+#: export_dialog.cc:159 export_timespan_selector.cc:371
+#: export_timespan_selector.cc:433
 msgid "Time Span"
 msgstr ""
 
@@ -6023,45 +6771,57 @@ msgstr "Export initialisation failed: %1"
 msgid "Stop Export"
 msgstr ""
 
-#: export_dialog.cc:327
+#: export_dialog.cc:336
 msgid "export"
 msgstr ""
 
-#: export_dialog.cc:346
+#: export_dialog.cc:355
+msgid "Exporting '%3' (timespan %1 of %2)"
+msgstr ""
+
+#: export_dialog.cc:360
 msgid "Normalizing '%3' (timespan %1 of %2)"
 msgstr "Normalising '%3' (timespan %1 of %2)"
 
-#: export_dialog.cc:350
-msgid "Exporting '%3' (timespan %1 of %2)"
+#: export_dialog.cc:365
+msgid "Tagging '%3' (timespan %1 of %2)"
+msgstr ""
+
+#: export_dialog.cc:369
+msgid "Uploading '%3' (timespan %1 of %2)"
+msgstr ""
+
+#: export_dialog.cc:373
+msgid "Running Post Export Command for '%1'"
 msgstr ""
 
-#: export_dialog.cc:373 export_dialog.cc:375
+#: export_dialog.cc:401 export_dialog.cc:403
 msgid "<span color=\"#ffa755\">Error: "
 msgstr ""
 
-#: export_dialog.cc:385
+#: export_dialog.cc:413
 msgid "<span color=\"#ffa755\">Warning: "
 msgstr ""
 
-#: export_dialog.cc:387
+#: export_dialog.cc:415
 msgid ""
 "\n"
 "<span color=\"#ffa755\">Warning: "
 msgstr ""
 
-#: export_dialog.cc:411
+#: export_dialog.cc:439
 msgid "Export Selection"
 msgstr ""
 
-#: export_dialog.cc:425
+#: export_dialog.cc:453
 msgid "Export Region"
 msgstr ""
 
-#: export_dialog.cc:434
+#: export_dialog.cc:462
 msgid "Source"
 msgstr ""
 
-#: export_dialog.cc:450
+#: export_dialog.cc:478
 msgid "Stem Export"
 msgstr ""
 
@@ -6069,172 +6829,249 @@ msgstr ""
 msgid "Add another format"
 msgstr ""
 
-#: export_file_notebook.cc:193
+#: export_file_notebook.cc:198
 msgid "Format"
 msgstr ""
 
-#: export_file_notebook.cc:194
+#: export_file_notebook.cc:199
 msgid "Location"
 msgstr ""
 
-#: export_file_notebook.cc:195
+#: export_file_notebook.cc:200
 msgid "Upload to Soundcloud"
 msgstr ""
 
-#: export_file_notebook.cc:273
+#: export_file_notebook.cc:201
+msgid "Analyze Exported Audio"
+msgstr "Analyse Exported Audio"
+
+#: export_file_notebook.cc:286
 msgid "No format!"
 msgstr ""
 
-#: export_file_notebook.cc:291
+#: export_file_notebook.cc:304
 msgid "Format %1: %2"
 msgstr ""
 
-#: export_filename_selector.cc:32
+#: export_filename_selector.cc:33
 msgid "Label:"
 msgstr ""
 
-#: export_filename_selector.cc:33
+#: export_filename_selector.cc:34 session_dialog.cc:310
 msgid "Session Name"
 msgstr ""
 
-#: export_filename_selector.cc:34
-msgid "Revision:"
+#: export_filename_selector.cc:35
+msgid "Timespan Name"
 msgstr ""
 
 #: export_filename_selector.cc:36
+msgid "Revision:"
+msgstr ""
+
+#: export_filename_selector.cc:38
 msgid "Folder:"
 msgstr ""
 
-#: export_filename_selector.cc:37 session_import_dialog.cc:45
+#: export_filename_selector.cc:39 session_import_dialog.cc:45
 #: transcode_video_dialog.cc:59 video_server_dialog.cc:54
-#: video_server_dialog.cc:56 export_video_dialog.cc:81
-#: export_video_dialog.cc:83
+#: video_server_dialog.cc:56 export_video_dialog.cc:77
+#: export_video_dialog.cc:79
 msgid "Browse"
 msgstr ""
 
-#: export_filename_selector.cc:41
-msgid "<i>Build filename(s) from these components:</i>"
+#: export_filename_selector.cc:40 export_report.cc:118
+msgid "Open Folder"
+msgstr ""
+
+#: export_filename_selector.cc:45
+msgid "Build filename(s) from these components:"
 msgstr ""
 
-#: export_filename_selector.cc:212
+#: export_filename_selector.cc:217
 msgid ""
 "<small><i>Sorry, no example filename can be shown at the moment</i></small>"
 msgstr ""
 
-#: export_filename_selector.cc:214
-msgid "<small><i>Current (approximate) filename: \"%1\"</i></small>"
+#: export_filename_selector.cc:219
+msgid "<i>Current (approximate) filename</i>: \"%1\""
 msgstr ""
 
-#: export_filename_selector.cc:250 export_filename_selector.cc:336
+#: export_filename_selector.cc:255 export_filename_selector.cc:402
 msgid ""
 "%1: this is only the directory/folder name, not the filename.\n"
 "The filename will be chosen from the information just above the folder "
 "selector."
 msgstr ""
 
-#: export_filename_selector.cc:322
+#: export_filename_selector.cc:378
+msgid "%1: this is not a valid directory/folder."
+msgstr ""
+
+#: export_filename_selector.cc:388
 msgid "Choose export folder"
 msgstr ""
 
-#: export_format_dialog.cc:31
+#: export_format_dialog.cc:32
 msgid "New Export Format Profile"
 msgstr ""
 
-#: export_format_dialog.cc:31
+#: export_format_dialog.cc:32
 msgid "Edit Export Format Profile"
 msgstr ""
 
-#: export_format_dialog.cc:38
+#: export_format_dialog.cc:39
 msgid "Label: "
 msgstr ""
 
-#: export_format_dialog.cc:41 normalize_dialog.cc:42
-msgid "Normalize to:"
-msgstr "Normalise to:"
+#: export_format_dialog.cc:42
+msgid "Normalize:"
+msgstr "Normalise:"
+
+#: export_format_dialog.cc:43
+msgid "Peak"
+msgstr ""
 
-#: export_format_dialog.cc:46
+#: export_format_dialog.cc:44
+msgid "Loudness"
+msgstr ""
+
+#: export_format_dialog.cc:50
+msgid "LUFS"
+msgstr ""
+
+#: export_format_dialog.cc:51
+msgid "dBTP"
+msgstr ""
+
+#: export_format_dialog.cc:54
 msgid "Trim silence at start"
 msgstr ""
 
-#: export_format_dialog.cc:47
+#: export_format_dialog.cc:55
 msgid "Add silence at start:"
 msgstr ""
 
-#: export_format_dialog.cc:50
+#: export_format_dialog.cc:58
 msgid "Trim silence at end"
 msgstr ""
 
-#: export_format_dialog.cc:51
+#: export_format_dialog.cc:59
 msgid "Add silence at end:"
 msgstr ""
 
-#: export_format_dialog.cc:54
+#: export_format_dialog.cc:62
 msgid ""
 "Command to run post-export\n"
-"(%f=full path & filename, %d=directory, %b=basename):"
+"(%f=file path, %d=directory, %b=basename, see tooltip for more):"
 msgstr ""
 
-#: export_format_dialog.cc:57
+#: export_format_dialog.cc:65
 msgid "Compatibility"
 msgstr ""
 
-#: export_format_dialog.cc:58
+#: export_format_dialog.cc:66
 msgid "Quality"
 msgstr ""
 
-#: export_format_dialog.cc:61
+#: export_format_dialog.cc:69
 msgid "Sample rate conversion quality:"
 msgstr ""
 
-#: export_format_dialog.cc:68
+#: export_format_dialog.cc:76
 msgid "Dithering"
 msgstr ""
 
-#: export_format_dialog.cc:70
+#: export_format_dialog.cc:78
 msgid "Create CUE file for disk-at-once CD/DVD creation"
 msgstr ""
 
-#: export_format_dialog.cc:71
+#: export_format_dialog.cc:79
 msgid "Create TOC file for disk-at-once CD/DVD creation"
 msgstr ""
 
-#: export_format_dialog.cc:73
-msgid "Tag file with session's metadata"
+#: export_format_dialog.cc:80
+msgid "Create chapter mark file for MP4 chapter marks"
 msgstr ""
 
-#: export_format_dialog.cc:470
+#: export_format_dialog.cc:82
+msgid "Tag file with session's metadata"
+msgstr ""
+
+#: export_format_dialog.cc:119
+msgid "∧"
+msgstr ""
+
+#: export_format_dialog.cc:124
+msgid ""
+"Normalize to EBU-R128 LUFS target loudness without exceeding the given true-"
+"peak limit. EBU-R128 normalization is only available for mono and stereo "
+"targets, true-peak works for any channel layout."
+msgstr ""
+"Normalise to EBU-R128 LUFS target loudness without exceeding the given true-"
+"peak limit. EBU-R128 normalisation is only available for mono and stereo "
+"targets, true-peak works for any channel layout."
+
+#: export_format_dialog.cc:152
+msgid ""
+"%a Artist name\n"
+"%b File's base-name\n"
+"%c Copyright\n"
+"%d File's directory\n"
+"%f File's full absolute path\n"
+"%l Lyricist\n"
+"%n Session name\n"
+"%o Conductor\n"
+"%t Title\n"
+"%z Organization\n"
+"%A Album\n"
+"%C Comment\n"
+"%E Engineer\n"
+"%G Genre\n"
+"%L Total track count\n"
+"%M Mixer\n"
+"%N Timespan name\n"
+"%O Composer\n"
+"%P Producer\n"
+"%S Disc subtitle\n"
+"%T Track number\n"
+"%Y Year\n"
+"%Z Country"
+msgstr ""
+
+#: export_format_dialog.cc:537
 msgid "Best (sinc)"
 msgstr ""
 
-#: export_format_dialog.cc:475
+#: export_format_dialog.cc:542
 msgid "Medium (sinc)"
 msgstr ""
 
-#: export_format_dialog.cc:480
+#: export_format_dialog.cc:547
 msgid "Fast (sinc)"
 msgstr ""
 
-#: export_format_dialog.cc:490
+#: export_format_dialog.cc:557
 msgid "Zero order hold"
 msgstr ""
 
-#: export_format_dialog.cc:895
+#: export_format_dialog.cc:981
 msgid "Linear encoding options"
 msgstr ""
 
-#: export_format_dialog.cc:911
+#: export_format_dialog.cc:997
 msgid "Ogg Vorbis options"
 msgstr ""
 
-#: export_format_dialog.cc:922
+#: export_format_dialog.cc:1008
 msgid "FLAC options"
 msgstr ""
 
-#: export_format_dialog.cc:939
+#: export_format_dialog.cc:1025
 msgid "Broadcast Wave options"
 msgstr ""
 
-#: export_format_selector.cc:136
+#: export_format_selector.cc:131
 msgid "Do you really want to remove the format?"
 msgstr ""
 
@@ -6242,29 +7079,200 @@ msgstr ""
 msgid "Preset"
 msgstr ""
 
-#: export_preset_selector.cc:104
+#: export_preset_selector.cc:99
 msgid ""
 "The selected preset did not load successfully!\n"
 "Perhaps it references a format that has been removed?"
 msgstr ""
 
-#: export_preset_selector.cc:156
+#: export_preset_selector.cc:151
 msgid "Do you really want to remove this preset?"
 msgstr ""
 
-#: export_timespan_selector.cc:46
+#: export_report.cc:56
+msgid "Export Report/Analysis"
+msgstr ""
+
+#: export_report.cc:147 export_report.cc:327 sfdb_ui.cc:149
+msgid "Format:"
+msgstr ""
+
+#: export_report.cc:166 export_report.cc:328
+msgid "%1 Hz"
+msgstr ""
+
+#: export_report.cc:169 export_report.cc:336 transcode_video_dialog.cc:139
+msgid "Duration:"
+msgstr ""
+
+#: export_report.cc:177 export_report.cc:334
+msgid "Timecode:"
+msgstr ""
+
+#: export_report.cc:185
+msgid "Error:"
+msgstr ""
+
+#: export_report.cc:220 export_report.cc:440
+msgid "(too short integration time)"
+msgstr ""
+
+#: export_report.cc:222
+msgid "-888"
+msgstr ""
+
+#: export_report.cc:227 export_report.cc:353
+msgid "Peak:"
+msgstr ""
+
+#: export_report.cc:228 export_report.cc:360
+msgid "%1 dBFS"
+msgstr ""
+
+#: export_report.cc:229 export_report.cc:369
+msgid "True Peak:"
+msgstr ""
+
+#: export_report.cc:230 export_report.cc:376
+msgid "%1 dBTP"
+msgstr ""
+
+#: export_report.cc:231 export_report.cc:387
+msgid "Normalization Gain:"
+msgstr ""
+
+#: export_report.cc:232
+msgid "+888.88 dB"
+msgstr ""
+
+#: export_report.cc:234 export_report.cc:448
+msgid "Integrated Loudness:"
+msgstr ""
+
+#: export_report.cc:235 export_report.cc:454
+msgid "%1 LUFS"
+msgstr ""
+
+#: export_report.cc:236 export_report.cc:460
+msgid "Loudness Range:"
+msgstr ""
+
+#: export_report.cc:237 export_report.cc:466
+msgid "%1 LU"
+msgstr ""
+
+#: export_report.cc:247 export_report.cc:754
+msgid "100"
+msgstr ""
+
+#: export_report.cc:282 export_report.cc:650
+msgid "00:00:00.000"
+msgstr ""
+
+#: export_report.cc:288
+msgid "0|A8"
+msgstr ""
+
+#: export_report.cc:394
+msgid "%1 dB"
+msgstr ""
+
+#: export_report.cc:425 export_report.cc:433 export_report.cc:553
+msgid ""
+"Not\n"
+"Available"
+msgstr ""
+
+#: export_report.cc:493
+msgid ""
+"LUFS\n"
+"(short)"
+msgstr ""
+
+#: export_report.cc:503
+msgid "Multiplicity"
+msgstr ""
+
+#: export_report.cc:603
+msgid "Logscale|Lg"
+msgstr ""
+
+#: export_report.cc:604
+msgid "Rectified|Rf"
+msgstr ""
+
+#: export_report.cc:605
+msgid "Logscale"
+msgstr ""
+
+#: export_report.cc:606
+msgid "Rectified"
+msgstr ""
+
+#: export_report.cc:738
+msgid "Hz"
+msgstr ""
+
+#: export_report.cc:755
+msgid "500"
+msgstr ""
+
+#: export_report.cc:756
+msgid "1K"
+msgstr ""
+
+#: export_report.cc:757
+msgid "5K"
+msgstr ""
+
+#: export_report.cc:758
+msgid "10K"
+msgstr ""
+
+#: export_report.cc:844
+msgid "Writing Export Analysis Image: %1."
+msgstr ""
+
+#: export_report.cc:941 sfdb_ui.cc:293 sfdb_ui.cc:409
+msgid "Could not read file: %1 (%2)."
+msgstr ""
+
+#: export_report.cc:967 sfdb_ui.cc:458
+msgid "Could not access soundfile: "
+msgstr ""
+
+#: export_report.cc:1203
+msgid "-36"
+msgstr ""
+
+#: export_report.cc:1204 export_report.cc:1208 export_report.cc:1214
+#: export_report.cc:1217
+msgid "-18"
+msgstr ""
+
+#: export_report.cc:1205 export_report.cc:1209 export_report.cc:1215
+#: export_report.cc:1218 export_report.cc:1221 export_report.cc:1222
+msgid "-9"
+msgstr ""
+
+#: export_report.cc:1206 export_report.cc:1210 export_report.cc:1216
+#: export_report.cc:1219 export_report.cc:1223 export_report.cc:1224
+msgid "-3"
+msgstr ""
+
+#: export_timespan_selector.cc:44
 msgid "Show Times as:"
 msgstr ""
 
-#: export_timespan_selector.cc:53 processor_box.cc:2466
+#: export_timespan_selector.cc:51 processor_box.cc:3683
 msgid "Select All"
 msgstr ""
 
-#: export_timespan_selector.cc:223 transform_dialog.cc:93
+#: export_timespan_selector.cc:220 transform_dialog.cc:93
 msgid " to "
 msgstr ""
 
-#: export_timespan_selector.cc:367 export_timespan_selector.cc:426
+#: export_timespan_selector.cc:364 export_timespan_selector.cc:423
 msgid "Range"
 msgstr ""
 
@@ -6280,36 +7288,39 @@ msgstr ""
 msgid "getSoundResourceFile: root = %1, != response"
 msgstr ""
 
-#: sfdb_freesound_mootcher.cc:410 rc_option_editor.cc:1824
+#: sfdb_freesound_mootcher.cc:410 rc_option_editor.cc:2416
 msgid "%1"
 msgstr ""
 
-#: gain_meter.cc:132 gain_meter.cc:400 gain_meter.cc:505 gain_meter.cc:896
+#: gain_meter.cc:137 gain_meter.cc:422 gain_meter.cc:527 gain_meter.cc:919
 msgid "-inf"
 msgstr ""
 
-#: gain_meter.cc:147 gain_meter.cc:958
+#: gain_meter.cc:152 gain_meter.cc:983
 msgid "Fader automation mode"
 msgstr ""
 
-#: gain_meter.cc:148 gain_meter.cc:959
+#: gain_meter.cc:153 gain_meter.cc:984
 msgid "Fader automation type"
 msgstr ""
 
-#: gain_meter.cc:157 gain_meter.cc:829 panner_ui.cc:179 panner_ui.cc:639
+#: gain_meter.cc:162 gain_meter.cc:852 panner_ui.cc:179 panner_ui.cc:641
 msgid "Abs"
 msgstr ""
 
-#: gain_meter.cc:796 mixer_strip.cc:2049 meter_strip.cc:378 panner_ui.cc:606
-#: route_time_axis.cc:104 route_time_axis.cc:2705
+#: gain_meter.cc:816 vca_master_strip.cc:78 vca_time_axis.cc:54
+msgid "M"
+msgstr ""
+
+#: gain_meter.cc:819 vca_master_strip.cc:296
 msgid "P"
 msgstr ""
 
-#: gain_meter.cc:799 panner_ui.cc:609
+#: gain_meter.cc:822
 msgid "T"
 msgstr ""
 
-#: gain_meter.cc:802 panner_ui.cc:612
+#: gain_meter.cc:825
 msgid "W"
 msgstr ""
 
@@ -6317,46 +7328,50 @@ msgstr ""
 msgid "<span size=\"large\">Presets</span>"
 msgstr ""
 
-#: generic_pluginui.cc:97
+#: generic_pluginui.cc:98 plugin_pin_dialog.cc:333
 msgid "Manual"
 msgstr ""
 
-#: generic_pluginui.cc:106
+#: generic_pluginui.cc:107
 msgid "All Automation"
 msgstr ""
 
 #: generic_pluginui.cc:250
-msgid "Switches"
+msgid "Plugin Editor: could not build control element for port %1"
 msgstr ""
 
-#: generic_pluginui.cc:260 generic_pluginui.cc:436 processor_box.cc:2440
-msgid "Controls"
+#: generic_pluginui.cc:282
+msgid "Plugin Editor: no control for property %1"
 msgstr ""
 
-#: generic_pluginui.cc:293
-msgid "Plugin Editor: could not build control element for port %1"
+#: generic_pluginui.cc:288
+msgid "Plugin Editor: could not build control element for property %1"
 msgstr ""
 
-#: generic_pluginui.cc:318
-msgid "Plugin Editor: no control for property %1"
+#: generic_pluginui.cc:359
+msgid "Switches"
 msgstr ""
 
-#: generic_pluginui.cc:324
-msgid "Plugin Editor: could not build control element for property %1"
+#: generic_pluginui.cc:369 generic_pluginui.cc:475 processor_box.cc:3653
+msgid "Controls"
 msgstr ""
 
-#: generic_pluginui.cc:468
+#: generic_pluginui.cc:510
 msgid "Meters"
 msgstr ""
 
-#: generic_pluginui.cc:490
+#: generic_pluginui.cc:548
 msgid "Automation control"
 msgstr ""
 
-#: generic_pluginui.cc:497
+#: generic_pluginui.cc:555
 msgid "Mgnual"
 msgstr ""
 
+#: generic_pluginui.cc:828
+msgid "This control cannot be automated"
+msgstr ""
+
 #: global_port_matrix.cc:158
 msgid "Audio Connection Manager"
 msgstr ""
@@ -6365,126 +7380,163 @@ msgstr ""
 msgid "MIDI Connection Manager"
 msgstr ""
 
-#: global_port_matrix.cc:201 io_selector.cc:211 mixer_strip.cc:793
-#: mixer_strip.cc:894
+#: global_port_matrix.cc:201 io_selector.cc:211 mixer_strip.cc:863
+#: mixer_strip.cc:966 monitor_section.cc:1430 monitor_selector.cc:189
+#: plugin_pin_dialog.cc:1757
 msgid "Disconnect"
 msgstr ""
 
-#: global_port_matrix.cc:207 io_selector.cc:217
+#: global_port_matrix.cc:207 io_selector.cc:217 monitor_selector.cc:195
 msgid "port"
 msgstr ""
 
-#: group_tabs.cc:312
+#: group_tabs.cc:312 group_tabs.cc:321
 msgid "Selection..."
 msgstr ""
 
-#: group_tabs.cc:313
+#: group_tabs.cc:313 group_tabs.cc:322
 msgid "Record Enabled..."
 msgstr ""
 
-#: group_tabs.cc:314
+#: group_tabs.cc:314 group_tabs.cc:323
 msgid "Soloed..."
 msgstr ""
 
-#: group_tabs.cc:320
+#: group_tabs.cc:316
+msgid "Create New Group From..."
+msgstr ""
+
+#: group_tabs.cc:325
+msgid "Create New Group with Master From..."
+msgstr ""
+
+#: group_tabs.cc:344
 msgid "Create New Group ..."
 msgstr ""
 
-#: group_tabs.cc:321
-msgid "Create New Group From"
+#: group_tabs.cc:345
+msgid "Create New Group with Control Master ..."
 msgstr ""
 
-#: group_tabs.cc:324
+#: group_tabs.cc:355
 msgid "Edit Group..."
 msgstr ""
 
-#: group_tabs.cc:325
+#: group_tabs.cc:356
 msgid "Collect Group"
 msgstr ""
 
-#: group_tabs.cc:326
+#: group_tabs.cc:357
 msgid "Remove Group"
 msgstr ""
 
-#: group_tabs.cc:329
+#: group_tabs.cc:368
+msgid "Assign Group to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:374
 msgid "Remove Subgroup Bus"
 msgstr ""
 
-#: group_tabs.cc:331
+#: group_tabs.cc:376
 msgid "Add New Subgroup Bus"
 msgstr ""
 
-#: group_tabs.cc:333
+#: group_tabs.cc:378
 msgid "Add New Aux Bus (pre-fader)"
 msgstr ""
 
-#: group_tabs.cc:334
+#: group_tabs.cc:379
 msgid "Add New Aux Bus (post-fader)"
 msgstr ""
 
-#: group_tabs.cc:340
+#: group_tabs.cc:404
+msgid "Assign Selection to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:415
+msgid "Assign Record Enabled to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:426
+msgid "Assign Soloed to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:429
 msgid "Enable All Groups"
 msgstr ""
 
-#: group_tabs.cc:341
+#: group_tabs.cc:430
 msgid "Disable All Groups"
 msgstr ""
 
-#: insert_time_dialog.cc:46
+#: insert_remove_time_dialog.cc:52
+msgid "Time to remove"
+msgstr ""
+
+#: insert_remove_time_dialog.cc:52
 msgid "Time to insert:"
 msgstr ""
 
-#: insert_time_dialog.cc:54
+#: insert_remove_time_dialog.cc:61
 msgid "Intersected regions should:"
 msgstr ""
 
-#: insert_time_dialog.cc:57
+#: insert_remove_time_dialog.cc:64
 msgid "stay in position"
 msgstr ""
 
-#: insert_time_dialog.cc:58
+#: insert_remove_time_dialog.cc:65
 msgid "move"
 msgstr ""
 
-#: insert_time_dialog.cc:59
+#: insert_remove_time_dialog.cc:66
 msgid "be split"
 msgstr ""
 
-#: insert_time_dialog.cc:65
-msgid "Insert time on all the track's playlists"
+#: insert_remove_time_dialog.cc:73
+msgid "Apply to all the track's playlists"
 msgstr ""
 
-#: insert_time_dialog.cc:68
+#: insert_remove_time_dialog.cc:76
 msgid "Move glued regions"
 msgstr ""
 
-#: insert_time_dialog.cc:70
+#: insert_remove_time_dialog.cc:78
 msgid "Move markers"
 msgstr ""
 
-#: insert_time_dialog.cc:73
+#: insert_remove_time_dialog.cc:81
 msgid "Move glued markers"
 msgstr ""
 
-#: insert_time_dialog.cc:78
+#: insert_remove_time_dialog.cc:86
 msgid "Move locked markers"
 msgstr ""
 
-#: insert_time_dialog.cc:83
+#: insert_remove_time_dialog.cc:91
 msgid ""
 "Move tempo and meter changes\n"
 "<i>(may cause oddities in the tempo map)</i>"
 msgstr ""
 
-#: insert_time_dialog.cc:91
+#: insert_remove_time_dialog.cc:99
+msgid "Remove time"
+msgstr ""
+
+#: insert_remove_time_dialog.cc:99
 msgid "Insert time"
 msgstr ""
 
-#: instrument_selector.cc:62
+#: insert_remove_time_dialog.cc:174
+msgid "Invalid or zero duration entered. Please enter a valid duration"
+msgstr ""
+
+#: instrument_selector.cc:92
 msgid "-none-"
 msgstr ""
 
-#: interthread_progress_window.cc:103
+#: interthread_progress_window.cc:114
 msgid "Importing file: %1 of %2"
 msgstr ""
 
@@ -6492,64 +7544,89 @@ msgstr ""
 msgid "I/O selector"
 msgstr ""
 
-#: io_selector.cc:266
+#: io_selector.cc:266 monitor_selector.cc:244
 msgid "%1 input"
 msgstr ""
 
-#: io_selector.cc:268
+#: io_selector.cc:268 monitor_selector.cc:246
 msgid "%1 output"
 msgstr ""
 
-#: keyboard.cc:70
+#: keyboard.cc:93
 msgid "your own"
 msgstr ""
 
-#: keyboard.cc:133 keyboard.cc:157
+#: keyboard.cc:157 keyboard.cc:181
 msgid "Default keybindings not found - %1 will be hard to use!"
 msgstr ""
 
-#: keyboard.cc:136
+#: keyboard.cc:160
 msgid "Key bindings file \"%1\" not found. Default bindings used instead"
 msgstr ""
 
-#: keyeditor.cc:54
+#: keyboard.cc:193
+msgid "Loading keybindings from %1"
+msgstr ""
+
+#: keyeditor.cc:67
+msgid "Colliding keybindings"
+msgstr ""
+
+#: keyeditor.cc:68
+msgid ""
+"The key sequence is already bound. Please remove the other binding first."
+msgstr ""
+
+#: keyeditor.cc:77
+msgid "Key Bindings"
+msgstr ""
+
+#: keyeditor.cc:78
 msgid "Remove shortcut"
 msgstr ""
 
-#: keyeditor.cc:63
-msgid "Action"
+#: keyeditor.cc:80
+msgid "Search..."
 msgstr ""
 
-#: keyeditor.cc:64
-msgid "Shortcut"
+#: keyeditor.cc:82
+msgid "Print"
 msgstr ""
 
-#: keyeditor.cc:84
-msgid "Select an action, then press the key(s) to (re)set its shortcut"
+#: keyeditor.cc:93
+msgid "Click to reset search string"
 msgstr ""
 
-#: keyeditor.cc:98
-msgid "Reset Bindings to Defaults"
+#: keyeditor.cc:97
+msgid "To remove a shortcut select an action then press this: "
 msgstr ""
 
-#: keyeditor.cc:263
-msgid "Main_menu"
+#: keyeditor.cc:109
+msgid "Reset Bindings to Defaults"
 msgstr ""
 
-#: keyeditor.cc:265
-msgid "redirectmenu"
+#: keyeditor.cc:227 lua_script_manager.cc:41
+msgid "Action"
 msgstr ""
 
-#: keyeditor.cc:267
-msgid "Editor_menus"
+#: keyeditor.cc:228
+msgid "Shortcut"
 msgstr ""
 
-#: keyeditor.cc:269
+#: keyeditor.cc:370
 msgid "RegionList"
 msgstr ""
 
-#: keyeditor.cc:271
-msgid "ProcessorMenu"
+#: keyeditor.cc:543
+msgid "Could not open temporary file to print bindings (%1)"
+msgstr ""
+
+#: keyeditor.cc:561
+msgid "Could not save bindings to file (%1)"
+msgstr ""
+
+#: latency_gui.cc:39
+msgid "sample"
 msgstr ""
 
 #: latency_gui.cc:40
@@ -6560,109 +7637,217 @@ msgstr ""
 msgid "period"
 msgstr ""
 
-#: latency_gui.cc:55
-msgid "%1 sample"
-msgid_plural "%1 samples"
-msgstr[0] ""
-msgstr[1] ""
-
-#: latency_gui.cc:72 panner_ui.cc:409
+#: latency_gui.cc:72 panner_ui.cc:411 plugin_pin_dialog.cc:109 plugin_ui.cc:421
 msgid "Reset"
 msgstr ""
 
-#: latency_gui.cc:149 rhythm_ferret.cc:273 sfdb_ui.cc:1912
+#: latency_gui.cc:149 rhythm_ferret.cc:295 sfdb_ui.cc:1878
 msgid "programming error: %1 (%2)"
 msgstr ""
 
-#: location_ui.cc:52 location_ui.cc:54
+#: location_ui.cc:54 location_ui.cc:57
 msgid "Use PH"
 msgstr ""
 
-#: location_ui.cc:59
+#: location_ui.cc:55 location_ui.cc:58
+msgid "Goto"
+msgstr ""
+
+#: location_ui.cc:63
 msgid "Glue"
 msgstr ""
 
-#: location_ui.cc:87
+#: location_ui.cc:88
 msgid "Performer:"
 msgstr ""
 
-#: location_ui.cc:88
+#: location_ui.cc:89
 msgid "Composer:"
 msgstr ""
 
-#: location_ui.cc:90
+#: location_ui.cc:91
 msgid "Pre-Emphasis"
 msgstr ""
 
-#: location_ui.cc:317
+#: location_ui.cc:319
 msgid "Remove this range"
 msgstr ""
 
-#: location_ui.cc:318
+#: location_ui.cc:320
 msgid "Start time - middle click to locate here"
 msgstr ""
 
-#: location_ui.cc:319
+#: location_ui.cc:321
 msgid "End time - middle click to locate here"
 msgstr ""
 
-#: location_ui.cc:322
+#: location_ui.cc:324
 msgid "Set range start from playhead location"
 msgstr ""
 
-#: location_ui.cc:323
+#: location_ui.cc:325
 msgid "Set range end from playhead location"
 msgstr ""
 
-#: location_ui.cc:327
+#: location_ui.cc:329
 msgid "Remove this marker"
 msgstr ""
 
-#: location_ui.cc:328
+#: location_ui.cc:330
 msgid "Position - middle click to locate here"
 msgstr ""
 
-#: location_ui.cc:330
+#: location_ui.cc:332
 msgid "Set marker time from playhead location"
 msgstr ""
 
-#: location_ui.cc:499
+#: location_ui.cc:524
 msgid "You cannot put a CD marker at the start of the session"
 msgstr ""
 
-#: location_ui.cc:725
+#: location_ui.cc:750
 msgid "New Marker"
 msgstr ""
 
-#: location_ui.cc:726
+#: location_ui.cc:751
 msgid "New Range"
 msgstr ""
 
-#: location_ui.cc:739
+#: location_ui.cc:764
 msgid "<b>Loop/Punch Ranges</b>"
 msgstr ""
 
-#: location_ui.cc:764
+#: location_ui.cc:790
 msgid "<b>Markers (Including CD Index)</b>"
 msgstr ""
 
-#: location_ui.cc:799
+#: location_ui.cc:825
 msgid "<b>Ranges (Including CD Track Ranges)</b>"
 msgstr ""
 
-#: location_ui.cc:1042
+#: location_ui.cc:1068
 msgid "add range marker"
 msgstr ""
 
-#: main.cc:82
+#: lua_script_manager.cc:31
+msgid "Add/Set"
+msgstr ""
+
+#: lua_script_manager.cc:34
+msgid "Call"
+msgstr ""
+
+#: lua_script_manager.cc:35
+msgid "New Hook"
+msgstr ""
+
+#: lua_script_manager.cc:77
+msgid "Signal(s)"
+msgstr ""
+
+#: lua_script_manager.cc:127
+msgid "Action %1"
+msgstr ""
+
+#: lua_script_manager.cc:132 lua_script_manager.cc:227
+msgid "Unset"
+msgstr ""
+
+#: luainstance.cc:1079
+msgid "Cannot read script '%1': %2"
+msgstr ""
+
+#: luawindow.cc:97
+msgid "Run"
+msgstr ""
+
+#: luawindow.cc:98
+msgid "Clear Output"
+msgstr ""
+
+#: luawindow.cc:102
+msgid "Revert"
+msgstr ""
+
+#: luawindow.cc:166
+msgid "Select Editor Buffer"
+msgstr ""
+
+#: luawindow.cc:253 luawindow.cc:258
+msgid "Window|Lua"
+msgstr ""
+
+#: luawindow.cc:286 luawindow.cc:304
+msgid "LuaException: %1"
+msgstr ""
+
+#: luawindow.cc:342
+msgid "Deleted %1"
+msgstr ""
+
+#: luawindow.cc:345
+msgid "Failed to delete %1"
+msgstr ""
+
+#: luawindow.cc:411
+msgid ""
+"Missing script header.\n"
+"The script requires an '{ardour}' info table and a 'factory' function."
+msgstr ""
+
+#: luawindow.cc:416
+msgid "Script fails to compile."
+msgstr ""
+
+#: luawindow.cc:423
+msgid "Invalid or missing script-name or script-type."
+msgstr ""
+
+#: luawindow.cc:428
+msgid ""
+"Invalid script-type.\n"
+"Valid types are 'EditorAction' and 'Snippet'."
+msgstr ""
+
+#: luawindow.cc:439 luawindow.cc:490
+msgid "Saved as %1"
+msgstr ""
+
+#: luawindow.cc:442 luawindow.cc:493
+msgid "Error saving file: %1"
+msgstr ""
+
+#: luawindow.cc:452
+msgid ""
+"Script with given name '%1' already exists.\n"
+"Use a different name in the descriptor."
+msgstr ""
+
+#: luawindow.cc:636
+msgid "Scratch Buffer %1"
+msgstr ""
+
+#: luawindow.cc:638
+msgid "Action: '%1'"
+msgstr ""
+
+#: luawindow.cc:640
+msgid "Snippet: %1"
+msgstr ""
+
+#: luawindow.cc:652
+msgid "Save as"
+msgstr ""
+
+#: main.cc:88
 msgid "%1 could not connect to the audio backend."
 msgstr ""
 
-#: main.cc:107 main.cc:123
+#: main.cc:135 main.cc:151
 msgid "The audio backend (%1) has failed, or terminated"
 msgstr ""
 
-#: main.cc:110
+#: main.cc:138
 msgid ""
 "%2 exited unexpectedly, and without notifying %1.\n"
 "\n"
@@ -6671,77 +7856,97 @@ msgid ""
 "Click OK to exit %1."
 msgstr ""
 
-#: main.cc:124
+#: main.cc:152
 msgid "%2 exited unexpectedly, and without notifying %1."
 msgstr ""
 
-#: main.cc:219
+#: main.cc:247
 msgid ""
 "\n"
 "   %1 could not understand your command line      "
 msgstr ""
 
-#: main.cc:221
+#: main.cc:249
 msgid "An error was encountered while launching %1"
 msgstr ""
 
-#: main.cc:310
+#: main.cc:344
 msgid " (built using "
 msgstr ""
 
-#: main.cc:313
+#: main.cc:347
 msgid " and GCC version "
 msgstr ""
 
-#: main.cc:323
-msgid "Copyright (C) 1999-2012 Paul Davis"
+#: main.cc:357
+msgid "Copyright (C) 1999-2015 Paul Davis"
 msgstr ""
 
-#: main.cc:324
+#: main.cc:358
 msgid ""
 "Some portions Copyright (C) Steve Harris, Ari Johnson, Brett Viren, Joel "
 "Baker, Robin Gareus"
 msgstr ""
 
-#: main.cc:326
+#: main.cc:360
 msgid "%1 comes with ABSOLUTELY NO WARRANTY"
 msgstr ""
 
-#: main.cc:327
+#: main.cc:361
 msgid "not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
 msgstr ""
 
-#: main.cc:328
+#: main.cc:362
 msgid "This is free software, and you are welcome to redistribute it "
 msgstr ""
 
-#: main.cc:329
+#: main.cc:363
 msgid "under certain conditions; see the source for copying conditions."
 msgstr ""
 
-#: main.cc:334
+#: main.cc:368
 msgid "could not initialize %1."
 msgstr "could not initialise %1."
 
-#: main.cc:344
+#: main.cc:378
 msgid "Cannot xinstall SIGPIPE error handler"
 msgstr ""
 
-#: main.cc:351
+#: main.cc:385
+msgid "Could not complete pre-GUI initialization"
+msgstr ""
+
+#: main.cc:392
 msgid "could not create %1 GUI"
 msgstr ""
 
-#: main_clock.cc:52
+#: main_clock.cc:51
 msgid "Display delta to edit cursor"
 msgstr ""
 
-#: marker.cc:273
+#: main_clock.cc:66 tempo_dialog.cc:55
+msgid "Edit Tempo"
+msgstr ""
+
+#: main_clock.cc:67 tempo_dialog.cc:429
+msgid "Edit Meter"
+msgstr ""
+
+#: main_clock.cc:68
+msgid "Insert Tempo Change"
+msgstr ""
+
+#: main_clock.cc:69
+msgid "Insert Meter Change"
+msgstr ""
+
+#: marker.cc:280
 msgid "MarkerText"
 msgstr ""
 
 #: midi_channel_selector.cc:161 midi_channel_selector.cc:400
-#: midi_channel_selector.cc:436 rc_option_editor.cc:1573
-#: rc_option_editor.cc:2203 sfdb_ui.cc:665
+#: midi_channel_selector.cc:436 rc_option_editor.cc:2157
+#: rc_option_editor.cc:2799 sfdb_ui.cc:671
 msgid "None"
 msgstr ""
 
@@ -6822,11 +8027,11 @@ msgstr ""
 msgid "Click to force all MIDI channel messages to channel %1"
 msgstr ""
 
-#: midi_channel_selector.cc:718
+#: midi_channel_selector.cc:720
 msgid "Click to toggle recording of channel %1"
 msgstr ""
 
-#: midi_channel_selector.cc:726
+#: midi_channel_selector.cc:728
 msgid "Click to force all recorded channels to %1"
 msgstr ""
 
@@ -6938,192 +8143,188 @@ msgstr ""
 msgid "velocity edit"
 msgstr ""
 
-#: midi_region_view.cc:954
+#: midi_region_view.cc:962
 msgid "add note"
 msgstr ""
 
-#: midi_region_view.cc:1885
+#: midi_region_view.cc:1904
 msgid "step add"
 msgstr ""
 
-#: midi_region_view.cc:1979 midi_region_view.cc:2002
+#: midi_region_view.cc:1998 midi_region_view.cc:2021
 msgid "alter patch change"
 msgstr ""
 
-#: midi_region_view.cc:2038
+#: midi_region_view.cc:2057
 msgid "add patch change"
 msgstr ""
 
-#: midi_region_view.cc:2060 midi_region_view.cc:2061
+#: midi_region_view.cc:2079 midi_region_view.cc:2080
 msgid "move patch change"
 msgstr ""
 
-#: midi_region_view.cc:2073 midi_region_view.cc:2074
+#: midi_region_view.cc:2092 midi_region_view.cc:2093
 msgid "delete patch change"
 msgstr ""
 
-#: midi_region_view.cc:2112
+#: midi_region_view.cc:2131
 msgid "delete selection"
 msgstr ""
 
-#: midi_region_view.cc:2128
+#: midi_region_view.cc:2148
 msgid "delete note"
 msgstr ""
 
-#: midi_region_view.cc:2587
+#: midi_region_view.cc:2589
 msgid "move notes"
 msgstr ""
 
-#: midi_region_view.cc:3070
+#: midi_region_view.cc:3139
 msgid "change velocities"
 msgstr ""
 
-#: midi_region_view.cc:3136
+#: midi_region_view.cc:3205
 msgid "transpose"
 msgstr ""
 
-#: midi_region_view.cc:3164
+#: midi_region_view.cc:3233
 msgid "change note lengths"
 msgstr ""
 
-#: midi_region_view.cc:3240
+#: midi_region_view.cc:3309
 msgid "nudge"
 msgstr ""
 
-#: midi_region_view.cc:3255
+#: midi_region_view.cc:3324
 msgid "change channel"
 msgstr ""
 
-#: midi_region_view.cc:3295
+#: midi_region_view.cc:3372
 msgid "Bank "
 msgstr ""
 
-#: midi_region_view.cc:3296
-msgid "Program "
-msgstr ""
-
-#: midi_region_view.cc:3297
+#: midi_region_view.cc:3374
 msgid "Channel "
 msgstr ""
 
-#: midi_region_view.cc:3484
+#: midi_region_view.cc:3561
 msgid "paste"
 msgstr ""
 
-#: midi_streamview.cc:185
+#: midi_streamview.cc:184
 msgid "attempt to display MIDI region with no source"
 msgstr ""
 
-#: midi_streamview.cc:195
+#: midi_streamview.cc:194
 msgid "attempt to display MIDI region with no model"
 msgstr ""
 
-#: midi_streamview.cc:506
+#: midi_streamview.cc:505
 msgid "failed to create MIDI region"
 msgstr ""
 
-#: midi_time_axis.cc:309
+#: midi_time_axis.cc:306
 msgid "External MIDI Device"
 msgstr ""
 
-#: midi_time_axis.cc:310
+#: midi_time_axis.cc:307
 msgid "External Device Mode"
 msgstr ""
 
-#: midi_time_axis.cc:318
+#: midi_time_axis.cc:315
 msgid "Chns"
 msgstr ""
 
-#: midi_time_axis.cc:320
+#: midi_time_axis.cc:317
 msgid "Click to edit channel settings"
 msgstr ""
 
-#: midi_time_axis.cc:519
+#: midi_time_axis.cc:516
 msgid "Show Full Range"
 msgstr ""
 
-#: midi_time_axis.cc:524
+#: midi_time_axis.cc:521
 msgid "Fit Contents"
 msgstr ""
 
-#: midi_time_axis.cc:528
+#: midi_time_axis.cc:525
 msgid "Note Range"
 msgstr ""
 
-#: midi_time_axis.cc:529
+#: midi_time_axis.cc:526
 msgid "Note Mode"
 msgstr ""
 
-#: midi_time_axis.cc:530
+#: midi_time_axis.cc:527
 msgid "Channel Selector"
 msgstr ""
 
-#: midi_time_axis.cc:535
+#: midi_time_axis.cc:532
 msgid "Color Mode"
 msgstr "Colour Mode"
 
-#: midi_time_axis.cc:594
+#: midi_time_axis.cc:591
 msgid "Bender"
 msgstr ""
 
-#: midi_time_axis.cc:598
+#: midi_time_axis.cc:595
 msgid "Pressure"
 msgstr ""
 
-#: midi_time_axis.cc:610
+#: midi_time_axis.cc:607
 msgid "Controllers"
 msgstr ""
 
-#: midi_time_axis.cc:615
+#: midi_time_axis.cc:612
 msgid "No MIDI Channels selected"
 msgstr ""
 
-#: midi_time_axis.cc:672 midi_time_axis.cc:801
+#: midi_time_axis.cc:669 midi_time_axis.cc:798
 msgid "Hide all channels"
 msgstr ""
 
-#: midi_time_axis.cc:676 midi_time_axis.cc:805
+#: midi_time_axis.cc:673 midi_time_axis.cc:802
 msgid "Show all channels"
 msgstr ""
 
-#: midi_time_axis.cc:687 midi_time_axis.cc:816
+#: midi_time_axis.cc:684 midi_time_axis.cc:813
 msgid "Channel %1"
 msgstr ""
 
-#: midi_time_axis.cc:942 midi_time_axis.cc:974
+#: midi_time_axis.cc:939 midi_time_axis.cc:971
 msgid "Controllers %1-%2"
 msgstr ""
 
-#: midi_time_axis.cc:965 midi_time_axis.cc:968
+#: midi_time_axis.cc:962 midi_time_axis.cc:965
 msgid "Controller %1"
 msgstr ""
 
-#: midi_time_axis.cc:991
+#: midi_time_axis.cc:988
 msgid "Sustained"
 msgstr ""
 
-#: midi_time_axis.cc:998
+#: midi_time_axis.cc:995
 msgid "Percussive"
 msgstr ""
 
-#: midi_time_axis.cc:1018
+#: midi_time_axis.cc:1015
 msgid "Meter Colors"
 msgstr "Meter Colours"
 
-#: midi_time_axis.cc:1025
+#: midi_time_axis.cc:1022
 msgid "Channel Colors"
 msgstr "Channel Colours"
 
-#: midi_time_axis.cc:1032
+#: midi_time_axis.cc:1029
 msgid "Track Color"
 msgstr "Track Colour"
 
-#: midi_time_axis.cc:1606 midi_time_axis.cc:1612 midi_time_axis.cc:1622
-#: midi_time_axis.cc:1628
+#: midi_time_axis.cc:1610 midi_time_axis.cc:1616 midi_time_axis.cc:1626
+#: midi_time_axis.cc:1632
 msgid "all"
 msgstr ""
 
-#: midi_time_axis.cc:1609 midi_time_axis.cc:1625
+#: midi_time_axis.cc:1613 midi_time_axis.cc:1629
 msgid "some"
 msgstr ""
 
@@ -7139,7 +8340,7 @@ msgstr ""
 msgid "Decimal"
 msgstr ""
 
-#: midi_tracer.cc:57 rc_option_editor.cc:740
+#: midi_tracer.cc:57 rc_option_editor.cc:1356
 msgid "Enabled"
 msgstr ""
 
@@ -7155,35 +8356,36 @@ msgstr ""
 msgid "New velocity"
 msgstr ""
 
-#: missing_file_dialog.cc:35
+#: missing_file_dialog.cc:36
 msgid "Missing File"
 msgstr ""
 
-#: missing_file_dialog.cc:37
+#: missing_file_dialog.cc:38
 msgid "Select a folder to search"
 msgstr ""
 
-#: missing_file_dialog.cc:38
+#: missing_file_dialog.cc:39
 msgid "Add chosen folder to search path, and try again"
 msgstr ""
 
-#: missing_file_dialog.cc:40
+#: missing_file_dialog.cc:41
 msgid "Stop loading this session"
 msgstr ""
 
-#: missing_file_dialog.cc:41
+#: missing_file_dialog.cc:42
 msgid "Skip all missing files"
 msgstr ""
 
-#: missing_file_dialog.cc:42
+#: missing_file_dialog.cc:43
 msgid "Skip this file"
 msgstr ""
 
-#: missing_file_dialog.cc:53
+#: missing_file_dialog.cc:57 tempo_dialog.cc:135 tempo_dialog.cc:136
+#: tempo_dialog.cc:484 tempo_dialog.cc:485
 msgid "audio"
 msgstr ""
 
-#: missing_file_dialog.cc:70
+#: missing_file_dialog.cc:74
 msgid ""
 "%1 cannot find the %2 file\n"
 "\n"
@@ -7195,7 +8397,7 @@ msgid ""
 "\n"
 msgstr ""
 
-#: missing_file_dialog.cc:104
+#: missing_file_dialog.cc:108
 msgid "Click to choose an additional folder"
 msgstr ""
 
@@ -7203,516 +8405,704 @@ msgstr ""
 msgid "Missing Plugins"
 msgstr ""
 
-#: missing_plugin_dialog.cc:33 transcode_video_dialog.cc:60
+#: missing_plugin_dialog.cc:36 transcode_video_dialog.cc:60
 msgid "OK"
 msgstr ""
 
-#: mixer_actor.cc:55
-msgid "Toggle Solo on Mixer-Selected Tracks/Busses"
+#: missing_plugin_dialog.cc:42
+msgid ""
+"This session contains the following plugins that cannot be found on this "
+"system:\n"
+"\n"
 msgstr ""
 
-#: mixer_actor.cc:56
-msgid "Toggle Mute on Mixer-Selected Tracks/Busses"
+#: missing_plugin_dialog.cc:48
+msgid ""
+"\n"
+"Those plugins will be replaced with inactive stubs.\n"
+"It is recommended that you install the missing plugins and re-load the "
+"session.\n"
+"(also check the blacklist, Window > Log and Preferences > Plugins)"
 msgstr ""
 
-#: mixer_actor.cc:57
-msgid "Toggle Rec-enable on Mixer-Selected Tracks/Busses"
+#: mixer_strip.cc:100 mixer_strip.cc:133
+msgid "pre"
 msgstr ""
 
-#: mixer_actor.cc:58
-msgid "Decrease Gain on Mixer-Selected Tracks/Busses"
+#: mixer_strip.cc:104 mixer_strip.cc:136 mixer_strip.cc:397 mixer_strip.cc:1540
+#: mixer_strip.cc:1551 rc_option_editor.cc:3140
+msgid "Comments"
 msgstr ""
 
-#: mixer_actor.cc:59
-msgid "Increase Gain on Mixer-Selected Tracks/Busses"
+#: mixer_strip.cc:160
+msgid "Click to toggle the width of this mixer strip."
 msgstr ""
 
-#: mixer_actor.cc:60
-msgid "Set Gain to 0dB on Mixer-Selected Tracks/Busses"
+#: mixer_strip.cc:162
+msgid ""
+"\n"
+"%1-%2-click to toggle the width of all strips."
 msgstr ""
 
-#: mixer_actor.cc:63
-msgid "Copy Selected Processors"
-msgstr ""
-
-#: mixer_actor.cc:64
-msgid "Cut Selected Processors"
-msgstr ""
-
-#: mixer_actor.cc:65
-msgid "Paste Selected Processors"
-msgstr ""
-
-#: mixer_actor.cc:66
-msgid "Delete Selected Processors"
-msgstr ""
-
-#: mixer_actor.cc:67
-msgid "Select All (visible) Processors"
-msgstr ""
-
-#: mixer_actor.cc:68
-msgid "Toggle Selected Processors"
-msgstr ""
-
-#: mixer_actor.cc:69
-msgid "Toggle Selected Plugins"
-msgstr ""
-
-#: mixer_actor.cc:70
-msgid "Deselect all strips and processors"
-msgstr ""
-
-#: mixer_actor.cc:72 mixer_actor.cc:73
-msgid "Scroll Mixer Window to the left"
-msgstr ""
-
-#: mixer_actor.cc:75
-msgid "Toggle MIDI Input Active for Mixer-Selected Tracks/Busses"
-msgstr ""
-
-#: mixer_actor.cc:90
-msgid "Loaded mixer bindings from %1"
-msgstr ""
-
-#: mixer_actor.cc:92
-msgid "Could not find mixer.bindings in search path %1"
-msgstr ""
-
-#: mixer_strip.cc:96 mixer_strip.cc:125
-msgid "pre"
-msgstr ""
-
-#: mixer_strip.cc:98 mixer_strip.cc:127 mixer_strip.cc:372 mixer_strip.cc:1410
-#: rc_option_editor.cc:2331
-msgid "Comments"
-msgstr ""
-
-#: mixer_strip.cc:149
-msgid "Click to toggle the width of this mixer strip."
-msgstr ""
-
-#: mixer_strip.cc:151
-msgid ""
-"\n"
-"%1-%2-click to toggle the width of all strips."
-msgstr ""
-
-#: mixer_strip.cc:158
+#: mixer_strip.cc:171
 msgid "Hide this mixer strip"
 msgstr ""
 
-#: mixer_strip.cc:169
+#: mixer_strip.cc:182
 msgid "Click to select metering point"
 msgstr ""
 
-#: mixer_strip.cc:185
+#: mixer_strip.cc:198
 msgid "Isolate Solo"
 msgstr ""
 
-#: mixer_strip.cc:193
+#: mixer_strip.cc:206
 msgid "Lock Solo Status"
 msgstr ""
 
-#: mixer_strip.cc:196 mixer_strip.cc:2027
+#: mixer_strip.cc:208 mixer_strip.cc:2217
+msgid "SoloLock|Lock"
+msgstr ""
+
+#: mixer_strip.cc:209 mixer_strip.cc:2216
 msgid "Iso"
 msgstr ""
 
-#: mixer_strip.cc:250
+#: mixer_strip.cc:263
 msgid "Mix group"
 msgstr ""
 
-#: mixer_strip.cc:368 rc_option_editor.cc:2327
+#: mixer_strip.cc:275
+msgid "Trim: "
+msgstr ""
+
+#: mixer_strip.cc:393 rc_option_editor.cc:3136
 msgid "Phase Invert"
 msgstr ""
 
-#: mixer_strip.cc:369 rc_option_editor.cc:2328
+#: mixer_strip.cc:394 rc_option_editor.cc:3137
 msgid "Record & Monitor"
 msgstr ""
 
-#: mixer_strip.cc:370 rc_option_editor.cc:2329
+#: mixer_strip.cc:395 rc_option_editor.cc:3138
 msgid "Solo Iso / Lock"
 msgstr ""
 
-#: mixer_strip.cc:524
+#: mixer_strip.cc:398 rc_option_editor.cc:3141
+msgid "VCA Assigns"
+msgstr ""
+
+#: mixer_strip.cc:531
+msgid "Show/Hide Monitoring Section"
+msgstr ""
+
+#: mixer_strip.cc:583
 msgid "Enable/Disable MIDI input"
 msgstr ""
 
-#: mixer_strip.cc:688
+#: mixer_strip.cc:749
 msgid "Aux"
 msgstr ""
 
-#: mixer_strip.cc:710
+#: mixer_strip.cc:775
 msgid "Snd"
 msgstr ""
 
-#: mixer_strip.cc:776 mixer_strip.cc:879 processor_box.cc:2382
+#: mixer_strip.cc:846 mixer_strip.cc:951 processor_box.cc:3594
 msgid "Not connected to audio engine - no I/O changes are possible"
 msgstr ""
 
-#: mixer_strip.cc:833 mixer_strip.cc:935
+#: mixer_strip.cc:904 mixer_strip.cc:1007
 msgid "Add %1 port"
 msgstr ""
 
-#: mixer_strip.cc:840 mixer_strip.cc:942
+#: mixer_strip.cc:912 mixer_strip.cc:1014 monitor_section.cc:1466
+#: plugin_pin_dialog.cc:1782
 msgid "Routing Grid"
 msgstr ""
 
-#: mixer_strip.cc:1171
+#: mixer_strip.cc:1291
+msgid "MIDI "
+msgstr ""
+
+#: mixer_strip.cc:1295
 msgid "<b>INPUT</b> to %1"
 msgstr ""
 
-#: mixer_strip.cc:1174
+#: mixer_strip.cc:1297 monitor_section.cc:1511
 msgid "<b>OUTPUT</b> from %1"
 msgstr ""
 
-#: mixer_strip.cc:1287
+#: mixer_strip.cc:1410 monitor_section.cc:1598
 msgid "Disconnected"
 msgstr ""
 
-#: mixer_strip.cc:1413
-msgid "*Comments*"
+#: mixer_strip.cc:1536
+msgid "Click to add/edit comments"
 msgstr ""
 
-#: mixer_strip.cc:1420
+#: mixer_strip.cc:1540 mixer_strip.cc:1551
 msgid "Cmt"
 msgstr ""
 
-#: mixer_strip.cc:1423
-msgid "*Cmt*"
-msgstr ""
-
-#: mixer_strip.cc:1429
-msgid "Click to Add/Edit Comments"
-msgstr ""
-
-#: mixer_strip.cc:1473
+#: mixer_strip.cc:1596
 msgid "Grp"
 msgstr ""
 
-#: mixer_strip.cc:1476
+#: mixer_strip.cc:1599
 msgid "~G"
 msgstr ""
 
-#: mixer_strip.cc:1505 route_time_axis.cc:561
+#: mixer_strip.cc:1640 route_time_axis.cc:585 vca_master_strip.cc:396
 msgid "Color..."
 msgstr "Colour..."
 
-#: mixer_strip.cc:1507 route_time_axis.cc:563
+#: mixer_strip.cc:1642 route_time_axis.cc:587
 msgid "Comments..."
 msgstr ""
 
-#: mixer_strip.cc:1509 route_time_axis.cc:565
+#: mixer_strip.cc:1644 route_time_axis.cc:589
 msgid "Inputs..."
 msgstr ""
 
-#: mixer_strip.cc:1511 route_time_axis.cc:567
+#: mixer_strip.cc:1646 route_time_axis.cc:591
 msgid "Outputs..."
 msgstr ""
 
-#: mixer_strip.cc:1516
+#: mixer_strip.cc:1651
 msgid "Save As Template..."
 msgstr ""
 
-#: mixer_strip.cc:1530
+#: mixer_strip.cc:1657 route_group_dialog.cc:45 route_time_axis.cc:851
+msgid "Active"
+msgstr ""
+
+#: mixer_strip.cc:1665 plugin_pin_dialog.cc:1011
+msgid "Strict I/O"
+msgstr ""
+
+#: mixer_strip.cc:1675 processor_box.cc:3698
+msgid "Pin Connections..."
+msgstr ""
+
+#: mixer_strip.cc:1679
 msgid "Adjust Latency..."
 msgstr ""
 
-#: mixer_strip.cc:1533
+#: mixer_strip.cc:1682
 msgid "Protect Against Denormals"
 msgstr ""
 
-#: mixer_strip.cc:1539 route_time_axis.cc:580
-msgid "Remote Control ID..."
+#: mixer_strip.cc:1701 route_time_axis.cc:867
+msgid "Duplicate..."
 msgstr ""
 
-#: mixer_strip.cc:1823
+#: mixer_strip.cc:1996
 msgid "Pre"
 msgstr ""
 
-#: mixer_strip.cc:1827
+#: mixer_strip.cc:2000
 msgid "Post"
 msgstr ""
 
-#: mixer_strip.cc:1847
-msgid "Pr"
+#: mixer_strip.cc:2016
+msgid "Meter|In"
+msgstr ""
+
+#: mixer_strip.cc:2020
+msgid "Meter|Pr"
+msgstr ""
+
+#: mixer_strip.cc:2024
+msgid "Meter|Po"
 msgstr ""
 
-#: mixer_strip.cc:1851
-msgid "Po"
+#: mixer_strip.cc:2028
+msgid "Meter|O"
 msgstr ""
 
-#: mixer_strip.cc:1860
-msgid "C"
+#: mixer_strip.cc:2033
+msgid "Meter|C"
 msgstr ""
 
-#: mixer_strip.cc:2008 route_ui.cc:170
+#: mixer_strip.cc:2194 route_ui.cc:193
 msgid "Disk"
 msgstr ""
 
-#: mixer_strip.cc:2020 monitor_section.cc:70
+#: mixer_strip.cc:2196
+msgid "Mon"
+msgstr ""
+
+#: mixer_strip.cc:2209 monitor_section.cc:81
 msgid "AFL"
 msgstr ""
 
-#: mixer_strip.cc:2023 monitor_section.cc:71
+#: mixer_strip.cc:2212 monitor_section.cc:82
 msgid "PFL"
 msgstr ""
 
-#: mixer_strip.cc:2034 meter_strip.cc:384
-msgid "D"
+#: mixer_strip.cc:2222 meter_strip.cc:385
+msgid "MonitorInput|I"
+msgstr ""
+
+#: mixer_strip.cc:2223 meter_strip.cc:386
+msgid "MonitorDisk|D"
+msgstr ""
+
+#: mixer_strip.cc:2225
+msgid "Mon|O"
+msgstr ""
+
+#: mixer_strip.cc:2238 meter_strip.cc:377 route_time_axis.cc:2730
+#: vca_master_strip.cc:202 vca_time_axis.cc:227
+msgid "AfterFader|A"
 msgstr ""
 
 #: mixer_strip.cc:2241
+msgid "Prefader|P"
+msgstr ""
+
+#: mixer_strip.cc:2246
+msgid "SoloIso|I"
+msgstr ""
+
+#: mixer_strip.cc:2247
+msgid "SoloLock|L"
+msgstr ""
+
+#: mixer_strip.cc:2452
 msgid "Pre Fader"
 msgstr ""
 
-#: mixer_strip.cc:2242
+#: mixer_strip.cc:2453
 msgid "Post Fader"
 msgstr ""
 
-#: mixer_strip.cc:2286 meter_strip.cc:851
+#: mixer_strip.cc:2498 meter_strip.cc:858
 msgid "Change all in Group to %1"
 msgstr ""
 
-#: mixer_strip.cc:2288 meter_strip.cc:853
+#: mixer_strip.cc:2500 meter_strip.cc:860
 msgid "Change all to %1"
 msgstr ""
 
-#: mixer_strip.cc:2290 meter_strip.cc:855
+#: mixer_strip.cc:2502 meter_strip.cc:862
 msgid "Change same track-type to %1"
 msgstr ""
 
-#: mixer_ui.cc:130 route_time_axis.cc:818
+#: mixer_ui.cc:152 route_time_axis.cc:828
 msgid "Group"
 msgstr ""
 
-#: mixer_ui.cc:1224
+#: mixer_ui.cc:221
+msgid "Favorite Plugins"
+msgstr ""
+
+#: mixer_ui.cc:627
+msgid "Error adding GUI elements for new tracks/busses %1"
+msgstr ""
+
+#: mixer_ui.cc:1542
 msgid "track display list item for renamed strip not found!"
 msgstr ""
 
-#: mixer_ui.cc:1316
+#: mixer_ui.cc:1636
 msgid "-all-"
 msgstr ""
 
-#: mixer_ui.cc:1853
+#: mixer_ui.cc:2135
 msgid "Strips"
 msgstr ""
 
-#: meter_strip.cc:157
+#: mixer_ui.cc:2479
+msgid "No Track/Bus is selected."
+msgstr ""
+
+#: mixer_ui.cc:2481
+msgid "Add at the top"
+msgstr ""
+
+#: mixer_ui.cc:2483
+msgid "Add Pre-Fader"
+msgstr ""
+
+#: mixer_ui.cc:2485
+msgid "Add Post-Fader"
+msgstr ""
+
+#: mixer_ui.cc:2487
+msgid "Add at the end"
+msgstr ""
+
+#: mixer_ui.cc:2493
+msgid "Remove from favorites"
+msgstr ""
+
+#: mixer_ui.cc:2499
+msgid "Delete Preset"
+msgstr ""
+
+#: mixer_ui.cc:2739
+msgid "Toggle Solo on Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: mixer_ui.cc:2740
+msgid "Toggle Mute on Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: mixer_ui.cc:2741
+msgid "Toggle Rec-enable on Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: mixer_ui.cc:2742
+msgid "Decrease Gain on Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: mixer_ui.cc:2743
+msgid "Increase Gain on Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: mixer_ui.cc:2744
+msgid "Set Gain to 0dB on Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: mixer_ui.cc:2747
+msgid "Copy Selected Processors"
+msgstr ""
+
+#: mixer_ui.cc:2748
+msgid "Cut Selected Processors"
+msgstr ""
+
+#: mixer_ui.cc:2749
+msgid "Paste Selected Processors"
+msgstr ""
+
+#: mixer_ui.cc:2750
+msgid "Delete Selected Processors"
+msgstr ""
+
+#: mixer_ui.cc:2751
+msgid "Select All (visible) Processors"
+msgstr ""
+
+#: mixer_ui.cc:2752
+msgid "Toggle Selected Processors"
+msgstr ""
+
+#: mixer_ui.cc:2753
+msgid "Toggle Selected Plugins"
+msgstr ""
+
+#: mixer_ui.cc:2754
+msgid "Deselect all strips and processors"
+msgstr ""
+
+#: mixer_ui.cc:2756 mixer_ui.cc:2757
+msgid "Scroll Mixer Window to the left"
+msgstr ""
+
+#: mixer_ui.cc:2759
+msgid "Toggle MIDI Input Active for Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: meter_strip.cc:160
 msgid "Reset Peak"
 msgstr ""
 
-#: meter_strip.cc:887
+#: meter_strip.cc:380 route_time_axis.cc:2734 vca_master_strip.cc:206
+#: vca_time_axis.cc:231
+msgid "PreFader|P"
+msgstr ""
+
+#: meter_strip.cc:894
 msgid "Variable height"
 msgstr ""
 
-#: meter_strip.cc:888
+#: meter_strip.cc:895
 msgid "Short"
 msgstr ""
 
-#: meter_strip.cc:889
+#: meter_strip.cc:896
 msgid "Tall"
 msgstr ""
 
-#: meter_strip.cc:890
+#: meter_strip.cc:897
 msgid "Grande"
 msgstr ""
 
-#: meter_strip.cc:891
+#: meter_strip.cc:898
 msgid "Venti"
 msgstr ""
 
-#: meter_patterns.cc:82
-msgid "Peak"
+#: meter_patterns.cc:84
+msgid "Peak (+6dBFS)"
 msgstr ""
 
-#: meter_patterns.cc:85
+#: meter_patterns.cc:87
+msgid "Peak (0dBFS)"
+msgstr ""
+
+#: meter_patterns.cc:90
 msgid "RMS + Peak"
 msgstr ""
 
-#: meter_patterns.cc:88
+#: meter_patterns.cc:93
 msgid "IEC1/DIN"
 msgstr ""
 
-#: meter_patterns.cc:91
+#: meter_patterns.cc:96
 msgid "IEC1/Nordic"
 msgstr ""
 
-#: meter_patterns.cc:94
+#: meter_patterns.cc:99
 msgid "IEC2/BBC"
 msgstr ""
 
-#: meter_patterns.cc:97
+#: meter_patterns.cc:102
 msgid "IEC2/EBU"
 msgstr ""
 
-#: meter_patterns.cc:100
-msgid "K20"
+#: meter_patterns.cc:105
+msgid "K20/RMS"
 msgstr ""
 
-#: meter_patterns.cc:103
-msgid "K14"
+#: meter_patterns.cc:108
+msgid "K14/RMS"
 msgstr ""
 
-#: meter_patterns.cc:106
-msgid "K12"
+#: meter_patterns.cc:111
+msgid "K12/RMS"
 msgstr ""
 
-#: meter_patterns.cc:109
+#: meter_patterns.cc:114
 msgid "VU"
 msgstr ""
 
-#: monitor_section.cc:69
+#: monitor_section.cc:80
 msgid "SiP"
 msgstr ""
 
-#: monitor_section.cc:96 route_group_dialog.cc:49
+#: monitor_section.cc:113 route_group_dialog.cc:49
 msgid "Soloing"
 msgstr ""
 
-#: monitor_section.cc:100
+#: monitor_section.cc:117
 msgid "Isolated"
 msgstr ""
 
-#: monitor_section.cc:104
+#: monitor_section.cc:121
 msgid "Auditioning"
 msgstr ""
 
-#: monitor_section.cc:114
+#: monitor_section.cc:132
 msgid ""
 "When active, something is solo-isolated.\n"
 "Click to de-isolate everything"
 msgstr ""
 
-#: monitor_section.cc:117
+#: monitor_section.cc:135
 msgid ""
 "When active, auditioning is active.\n"
 "Click to stop the audition"
 msgstr ""
 
-#: monitor_section.cc:134
+#: monitor_section.cc:152
 msgid "Solo controls affect solo-in-place"
 msgstr ""
 
-#: monitor_section.cc:140
+#: monitor_section.cc:158
 msgid "Solo controls toggle after-fader-listen"
 msgstr ""
 
-#: monitor_section.cc:146
+#: monitor_section.cc:164
 msgid "Solo controls toggle pre-fader-listen"
 msgstr ""
 
-#: monitor_section.cc:156
+#: monitor_section.cc:170
+msgid "Excl. Solo"
+msgstr ""
+
+#: monitor_section.cc:172
+msgid "Exclusive solo means that only 1 solo is active at a time"
+msgstr ""
+
+#: monitor_section.cc:179
+msgid "Solo » Mute"
+msgstr ""
+
+#: monitor_section.cc:181
+msgid ""
+"If enabled, solo will override mute\n"
+"(a soloed & muted track or bus will be audible)"
+msgstr ""
+
+#: monitor_section.cc:189
+msgid "Processors"
+msgstr ""
+
+#: monitor_section.cc:191
+msgid "Allow one to add monitor effect processors"
+msgstr ""
+
+#: monitor_section.cc:206
 msgid "Gain increase for soloed signals (0dB is normal)"
 msgstr ""
 
-#: monitor_section.cc:170
+#: monitor_section.cc:210 monitor_section.cc:227 monitor_section.cc:244
+#: monitor_section.cc:289
+msgid "0 dB"
+msgstr ""
+
+#: monitor_section.cc:211
+msgid "3 dB"
+msgstr ""
+
+#: monitor_section.cc:212
+msgid "6 dB"
+msgstr ""
+
+#: monitor_section.cc:213
+msgid "10 dB"
+msgstr ""
+
+#: monitor_section.cc:215
 msgid "Solo Boost"
 msgstr ""
 
-#: monitor_section.cc:185
+#: monitor_section.cc:222
 msgid ""
 "Gain reduction non-soloed signals\n"
 "A value above -inf dB causes \"solo-in-front\""
 msgstr ""
 
-#: monitor_section.cc:196
-msgid "SiP Cut"
+#: monitor_section.cc:228 monitor_section.cc:246 monitor_section.cc:291
+msgid "-6 dB"
 msgstr ""
 
-#: monitor_section.cc:211
-msgid "Gain reduction to use when dimming monitor outputs"
+#: monitor_section.cc:229 monitor_section.cc:247 monitor_section.cc:292
+msgid "-12 dB"
 msgstr ""
 
-#: monitor_section.cc:225 monitor_section.cc:283
-msgid "Dim"
+#: monitor_section.cc:230 monitor_section.cc:248 monitor_section.cc:293
+msgid "-20 dB"
 msgstr ""
 
-#: monitor_section.cc:235
-msgid "Excl. Solo"
+#: monitor_section.cc:231
+msgid "OFF"
 msgstr ""
 
-#: monitor_section.cc:237
-msgid "Exclusive solo means that only 1 solo is active at a time"
+#: monitor_section.cc:233
+msgid "SiP Cut"
 msgstr ""
 
-#: monitor_section.cc:244
-msgid "Solo » Mute"
+#: monitor_section.cc:240
+msgid "Gain reduction to use when dimming monitor outputs"
 msgstr ""
 
-#: monitor_section.cc:246
-msgid ""
-"If enabled, solo will override mute\n"
-"(a soloed & muted track or bus will be audible)"
+#: monitor_section.cc:245 monitor_section.cc:290
+msgid "-3 dB"
+msgstr ""
+
+#: monitor_section.cc:250 monitor_section.cc:264 monitor_section.cc:325
+msgid "Dim"
+msgstr ""
+
+#: monitor_section.cc:294
+msgid "-30 dB"
+msgstr ""
+
+#: monitor_section.cc:333
+msgid "Inv"
 msgstr ""
 
-#: monitor_section.cc:323
+#: monitor_section.cc:399
 msgid "Monitor"
 msgstr ""
 
-#: monitor_section.cc:744
+#: monitor_section.cc:897
 msgid "Switch monitor to mono"
 msgstr ""
 
-#: monitor_section.cc:747
+#: monitor_section.cc:900
 msgid "Cut monitor"
 msgstr ""
 
-#: monitor_section.cc:750
+#: monitor_section.cc:903
 msgid "Dim monitor"
 msgstr ""
 
-#: monitor_section.cc:753
+#: monitor_section.cc:906
 msgid "Toggle exclusive solo mode"
 msgstr ""
 
-#: monitor_section.cc:759
+#: monitor_section.cc:912
 msgid "Toggle mute overrides solo mode"
 msgstr ""
 
-#: monitor_section.cc:771
+#: monitor_section.cc:921
 msgid "Cut monitor channel %1"
 msgstr ""
 
-#: monitor_section.cc:776
+#: monitor_section.cc:926
 msgid "Dim monitor channel %1"
 msgstr ""
 
-#: monitor_section.cc:781
+#: monitor_section.cc:931
 msgid "Solo monitor channel %1"
 msgstr ""
 
-#: monitor_section.cc:786
+#: monitor_section.cc:936
 msgid "Invert monitor channel %1"
 msgstr ""
 
-#: monitor_section.cc:796
+#: monitor_section.cc:946
 msgid "In-place solo"
 msgstr ""
 
-#: monitor_section.cc:798
+#: monitor_section.cc:948
 msgid "After Fade Listen (AFL) solo"
 msgstr ""
 
-#: monitor_section.cc:800
+#: monitor_section.cc:950
 msgid "Pre Fade Listen (PFL) solo"
 msgstr ""
 
-#: mono_panner.cc:109 stereo_panner.cc:119
+#: monitor_section.cc:953
+msgid "Toggle Monitor Section Processor Box"
+msgstr ""
+
+#: monitor_section.cc:1413
+msgid "No session - no I/O changes are possible"
+msgstr ""
+
+#: monitor_selector.cc:199
+msgid "Monitor output selector"
+msgstr ""
+
+#: mono_panner.cc:105 stereo_panner.cc:115
 msgid "bypassed"
 msgstr ""
 
-#: mono_panner.cc:123
+#: mono_panner.cc:119
 #, c-format
 msgid "L:%3d R:%3d"
 msgstr ""
 
-#: mono_panner_editor.cc:33
+#: mono_panner.cc:203 panner2d.cc:276 stereo_panner.cc:252 stereo_panner.cc:275
+msgid "Panner|L"
+msgstr ""
+
+#: mono_panner.cc:220 panner2d.cc:277 stereo_panner.cc:250 stereo_panner.cc:277
+msgid "Panner|R"
+msgstr ""
+
+#: mono_panner_editor.cc:35
 msgid "Mono Panner"
 msgstr ""
 
-#: mono_panner_editor.cc:44 mono_panner_editor.cc:49
-#: stereo_panner_editor.cc:46 stereo_panner_editor.cc:51
+#: mono_panner_editor.cc:46 mono_panner_editor.cc:51 stereo_panner_editor.cc:48
+#: stereo_panner_editor.cc:53
 msgid "%"
 msgstr ""
 
@@ -7767,10 +9157,6 @@ msgid ""
 "relies on a stable, sustainable income stream. Thanks for using Ardour!"
 msgstr ""
 
-#: new_plugin_preset_dialog.cc:29
-msgid "New Preset"
-msgstr ""
-
 #: new_plugin_preset_dialog.cc:30
 msgid "Replace existing preset with this name"
 msgstr ""
@@ -7779,6 +9165,10 @@ msgstr ""
 msgid "Name of new preset"
 msgstr ""
 
+#: new_plugin_preset_dialog.cc:44
+msgid "New Favorite Only"
+msgstr ""
+
 #: normalize_dialog.cc:34
 msgid "Normalize regions"
 msgstr "Normalise regions"
@@ -7787,7 +9177,11 @@ msgstr "Normalise regions"
 msgid "Normalize region"
 msgstr "Normalise region"
 
-#: normalize_dialog.cc:49 strip_silence_dialog.cc:66
+#: normalize_dialog.cc:42
+msgid "Normalize to:"
+msgstr "Normalise to:"
+
+#: normalize_dialog.cc:49 strip_silence_dialog.cc:67
 msgid "dbFS"
 msgstr ""
 
@@ -7807,103 +9201,106 @@ msgstr "Normalise"
 msgid "Select Note"
 msgstr ""
 
-#: opts.cc:57
+#: opts.cc:61
 msgid "Usage: "
 msgstr ""
 
-#: opts.cc:58
+#: opts.cc:62
 msgid "  [SESSION_NAME]              Name of session to load\n"
 msgstr ""
 
-#: opts.cc:59
+#: opts.cc:63
 msgid "  -v, --version               Show version information\n"
 msgstr ""
 
-#: opts.cc:60
+#: opts.cc:64
 msgid "  -h, --help                  Print this message\n"
 msgstr ""
 
-#: opts.cc:61
+#: opts.cc:65
 msgid ""
 "  -a, --no-announcements      Do not contact website for announcements\n"
 msgstr ""
 
-#: opts.cc:62
+#: opts.cc:66
 msgid ""
 "  -b, --bindings              Print all possible keyboard binding names\n"
 msgstr ""
 
-#: opts.cc:63
+#: opts.cc:67
+msgid ""
+"  -B, --bypass-plugins        Bypass all plugins in an existing session\n"
+msgstr ""
+
+#: opts.cc:68
 msgid ""
 "  -c, --name <name>           Use a specific backend client name, default is "
 "ardour\n"
 msgstr ""
 
-#: opts.cc:64
+#: opts.cc:69
 msgid ""
 "  -d, --disable-plugins       Disable all plugins in an existing session\n"
 msgstr ""
 
-#: opts.cc:65
+#: opts.cc:70
 msgid ""
 "  -D, --debug <options>       Set debug flags. Use \"-D list\" to see "
 "available options\n"
 msgstr ""
 
-#: opts.cc:66
+#: opts.cc:71
 msgid "  -n, --no-splash             Do not show splash screen\n"
 msgstr ""
 
-#: opts.cc:67
+#: opts.cc:72
 msgid "  -m, --menus file            Use \"file\" to define menus\n"
 msgstr ""
 
-#: opts.cc:68
+#: opts.cc:73
 msgid ""
 "  -N, --new session-name      Create a new session from the command line\n"
 msgstr ""
 
-#: opts.cc:69
+#: opts.cc:74
 msgid "  -O, --no-hw-optimizations   Disable h/w specific optimizations\n"
 msgstr ""
 
-#: opts.cc:70
+#: opts.cc:75
 msgid "  -P, --no-connect-ports      Do not connect any ports at startup\n"
 msgstr ""
 
-#: opts.cc:71
+#: opts.cc:76
 msgid "  -S, --sync                  Draw the gui synchronously \n"
 msgstr ""
 
-#: opts.cc:73
+#: opts.cc:78
 msgid "  -V, --novst                 Do not use VST support\n"
 msgstr ""
 
-#: opts.cc:75
+#: opts.cc:80
 msgid ""
 "  -E, --save <file>           Load the specified session, save it to <file> "
 "and then quit\n"
 msgstr ""
 
-#: opts.cc:76
+#: opts.cc:81
 msgid "  -C, --curvetest filename    Curve algorithm debugger\n"
 msgstr ""
 
-#: opts.cc:77
-msgid ""
-"  -k, --keybindings filename  Name of key bindings to load (default is ~/."
-"ardour3/ardour.bindings)\n"
+#: opts.cc:82
+msgid "  -k, --keybindings filename  Name of key bindings to load\n"
 msgstr ""
 
-#: panner2d.cc:854
+#: panner2d.cc:896
 msgid "Panner (2D)"
 msgstr ""
 
-#: panner2d.cc:856 panner_ui.cc:400 plugin_ui.cc:452
+#: panner2d.cc:898 panner_ui.cc:402 plugin_ui.cc:458
 msgid "Bypass"
 msgstr ""
 
-#: panner2d.cc:862
+#: panner2d.cc:904
 msgid "Panner"
 msgstr ""
 
@@ -7915,6 +9312,22 @@ msgstr ""
 msgid "Pan automation type"
 msgstr ""
 
+#: panner_ui.cc:605
+msgid "Manual|M"
+msgstr ""
+
+#: panner_ui.cc:608
+msgid "Play|P"
+msgstr ""
+
+#: panner_ui.cc:611
+msgid "Touch|T"
+msgstr ""
+
+#: panner_ui.cc:614
+msgid "Write|W"
+msgstr ""
+
 #: playlist_selector.cc:43
 msgid "Playlists"
 msgstr ""
@@ -7947,143 +9360,297 @@ msgstr ""
 msgid "Show phase"
 msgstr ""
 
-#: plugin_selector.cc:53 plugin_selector.cc:229
+#: plugin_pin_dialog.cc:55
+msgid "Manual Config"
+msgstr ""
+
+#: plugin_pin_dialog.cc:56
+msgid "Sidechain"
+msgstr ""
+
+#: plugin_pin_dialog.cc:57 plugin_pin_dialog.cc:59 plugin_pin_dialog.cc:61
+#: plugin_pin_dialog.cc:63 plugin_pin_dialog.cc:65 step_entry.cc:81
+#: step_entry.cc:84
+msgid "+"
+msgstr ""
+
+#: plugin_pin_dialog.cc:58 plugin_pin_dialog.cc:60 plugin_pin_dialog.cc:62
+#: plugin_pin_dialog.cc:64 plugin_pin_dialog.cc:66
+msgid "-"
+msgstr ""
+
+#: plugin_pin_dialog.cc:148
+msgid "Audio Input Pins"
+msgstr ""
+
+#: plugin_pin_dialog.cc:157
+msgid "MIDI Input Pins"
+msgstr ""
+
+#: plugin_pin_dialog.cc:166
+msgid "Instances"
+msgstr ""
+
+#: plugin_pin_dialog.cc:176
+msgid "Audio Out"
+msgstr ""
+
+#: plugin_pin_dialog.cc:185
+msgid "MIDI Out"
+msgstr ""
+
+#: plugin_pin_dialog.cc:192
+msgid "Output Presets"
+msgstr ""
+
+#: plugin_pin_dialog.cc:208
+msgid "Add Sidechain Input"
+msgstr ""
+
+#: plugin_pin_dialog.cc:478 plugin_pin_dialog.cc:482 plugin_pin_dialog.cc:486
+#: plugin_setup_dialog.cc:115 plugin_setup_dialog.cc:199
+msgid "Automatic"
+msgstr ""
+
+#: plugin_pin_dialog.cc:515 plugin_setup_dialog.cc:208
+msgid "%1 Channel"
+msgid_plural "%1 Channels"
+msgstr[0] ""
+msgstr[1] ""
+
+#: plugin_pin_dialog.cc:641 processor_box.cc:224
+msgid "Send"
+msgstr ""
+
+#: plugin_pin_dialog.cc:997
+msgid "Latency %1 spl%2 %3"
+msgstr ""
+
+#: plugin_pin_dialog.cc:997 plugin_pin_dialog.cc:1001
+msgid "no-inplace"
+msgstr ""
+
+#: plugin_pin_dialog.cc:999
+msgid "Latency %1 spl"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1055
+msgid "Instance #%1"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1700 processor_box.cc:2508
+msgid "Cannot set up new send: %1"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1707
+msgid "SC %1 (%2)"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1963 plugin_pin_dialog.cc:1971
+msgid "Pin Configuration: %1"
+msgstr ""
+
+#: plugin_setup_dialog.cc:30
+msgid "Plugin Setup"
+msgstr ""
+
+#: plugin_setup_dialog.cc:33
+msgid "Copy I/O Map"
+msgstr ""
+
+#: plugin_setup_dialog.cc:50
+msgid "An Instrument plugin is already present."
+msgstr ""
+
+#: plugin_setup_dialog.cc:54
+msgid "Replace"
+msgstr ""
+
+#: plugin_setup_dialog.cc:60
+msgid "with"
+msgstr ""
+
+#: plugin_setup_dialog.cc:70
+msgid "I/O Pin Mapping"
+msgstr ""
+
+#: plugin_setup_dialog.cc:79
+msgid "Configure Plugin '%1'"
+msgstr ""
+
+#: plugin_setup_dialog.cc:90
+msgid "Output Configuration"
+msgstr ""
+
+#: plugin_selector.cc:54 plugin_selector.cc:322
 msgid "Name contains"
 msgstr ""
 
-#: plugin_selector.cc:54 plugin_selector.cc:233
+#: plugin_selector.cc:55 plugin_selector.cc:326
 msgid "Type contains"
 msgstr ""
 
-#: plugin_selector.cc:55 plugin_selector.cc:231
+#: plugin_selector.cc:56 plugin_selector.cc:324
 msgid "Category contains"
 msgstr ""
 
-#: plugin_selector.cc:56 plugin_selector.cc:253
+#: plugin_selector.cc:57 plugin_selector.cc:349
 msgid "Author contains"
 msgstr ""
 
-#: plugin_selector.cc:57 plugin_selector.cc:255
+#: plugin_selector.cc:58 plugin_selector.cc:351
 msgid "Library contains"
 msgstr ""
 
-#: plugin_selector.cc:58 plugin_selector.cc:219 plugin_selector.cc:537
+#: plugin_selector.cc:59 plugin_selector.cc:278 plugin_selector.cc:639
 msgid "Favorites only"
 msgstr "Favourites only"
 
-#: plugin_selector.cc:59 plugin_selector.cc:223 plugin_selector.cc:537
+#: plugin_selector.cc:60 plugin_selector.cc:282 plugin_selector.cc:639
 msgid "Hidden only"
 msgstr ""
 
-#: plugin_selector.cc:64
+#: plugin_selector.cc:65
 msgid "Plugin Manager"
 msgstr ""
 
-#: plugin_selector.cc:85
+#: plugin_selector.cc:96
 msgid "Fav"
 msgstr ""
 
-#: plugin_selector.cc:87
+#: plugin_selector.cc:98
 msgid "Available Plugins"
 msgstr ""
 
-#: plugin_selector.cc:88
+#: plugin_selector.cc:99
 msgid "Type"
 msgstr ""
 
-#: plugin_selector.cc:89
+#: plugin_selector.cc:100
 msgid "Category"
 msgstr ""
 
-#: plugin_selector.cc:90
+#: plugin_selector.cc:101
 msgid "Creator"
 msgstr ""
 
-#: plugin_selector.cc:91
+#: plugin_selector.cc:102
 msgid "# Audio In"
 msgstr ""
 
-#: plugin_selector.cc:92
+#: plugin_selector.cc:103
 msgid "# Audio Out"
 msgstr ""
 
-#: plugin_selector.cc:93
+#: plugin_selector.cc:104
 msgid "# MIDI In"
 msgstr ""
 
-#: plugin_selector.cc:94
+#: plugin_selector.cc:105
 msgid "# MIDI Out"
 msgstr ""
 
-#: plugin_selector.cc:116
+#: plugin_selector.cc:132
 msgid "Plugins to be connected"
 msgstr ""
 
-#: plugin_selector.cc:129
+#: plugin_selector.cc:145
 msgid "Add a plugin to the effect list"
 msgstr ""
 
-#: plugin_selector.cc:133
+#: plugin_selector.cc:149
 msgid "Remove a plugin from the effect list"
 msgstr ""
 
-#: plugin_selector.cc:135
-msgid "Update available plugins"
+#: plugin_selector.cc:161
+msgid "Show Hidden"
+msgstr ""
+
+#: plugin_selector.cc:163
+msgid "Include hidden plugins in list."
+msgstr ""
+
+#: plugin_selector.cc:166
+msgid "Instruments"
+msgstr ""
+
+#: plugin_selector.cc:168
+msgid "Cycle display of instrument plugins (if any)."
+msgstr ""
+
+#: plugin_selector.cc:171
+msgid "Analyzers"
+msgstr "Analysers"
+
+#: plugin_selector.cc:173
+msgid "Cycle display of analysis plugins (if any)."
+msgstr ""
+
+#: plugin_selector.cc:176
+msgid "Utils"
+msgstr ""
+
+#: plugin_selector.cc:178
+msgid "Cycle display of utility plugins (if any)."
+msgstr ""
+
+#: plugin_selector.cc:208
+msgid "Filter"
 msgstr ""
 
-#: plugin_selector.cc:172
+#: plugin_selector.cc:232
 msgid "Insert Plugin(s)"
 msgstr ""
 
-#: plugin_selector.cc:337 plugin_selector.cc:338 plugin_selector.cc:339
-#: plugin_selector.cc:340
+#: plugin_selector.cc:439 plugin_selector.cc:440 plugin_selector.cc:441
+#: plugin_selector.cc:442
 msgid "variable"
 msgstr ""
 
-#: plugin_selector.cc:496
+#: plugin_selector.cc:598
 msgid ""
 "The plugin \"%1\" could not be loaded\n"
 "\n"
 "See the Log window for more details (maybe)"
 msgstr ""
 
-#: plugin_selector.cc:644
+#: plugin_selector.cc:757
 msgid "Favorites"
 msgstr "Favourites"
 
-#: plugin_selector.cc:646
+#: plugin_selector.cc:759
 msgid "Plugin Manager..."
 msgstr ""
 
-#: plugin_selector.cc:650
+#: plugin_selector.cc:763
 msgid "By Creator"
 msgstr ""
 
-#: plugin_selector.cc:653
+#: plugin_selector.cc:766
 msgid "By Category"
 msgstr ""
 
-#: plugin_ui.cc:113
+#: plugin_ui.cc:114
 msgid "Eh? LADSPA plugins don't have editors!"
 msgstr ""
 
-#: plugin_ui.cc:122 plugin_ui.cc:227
+#: plugin_ui.cc:123 plugin_ui.cc:228
 msgid ""
 "unknown type of editor-supplying plugin (note: no VST support in this "
 "version of %1)"
 msgstr ""
 
-#: plugin_ui.cc:125
+#: plugin_ui.cc:126
 msgid "unknown type of editor-supplying plugin"
 msgstr ""
 
-#: plugin_ui.cc:257
+#: plugin_ui.cc:258
 msgid ""
 "unknown type of editor-supplying plugin (note: no linuxVST support in this "
 "version of %1)"
 msgstr ""
 
-#: plugin_ui.cc:329
+#: plugin_ui.cc:330
 msgid "create_lv2_editor called on non-LV2 plugin"
 msgstr ""
 
@@ -8091,146 +9658,167 @@ msgstr ""
 msgid "Add"
 msgstr ""
 
-#: plugin_ui.cc:422
+#: plugin_ui.cc:423
 msgid "Description"
 msgstr ""
 
-#: plugin_ui.cc:423
+#: plugin_ui.cc:424
 msgid "Plugin analysis"
 msgstr ""
 
-#: plugin_ui.cc:430
+#: plugin_ui.cc:431
 msgid ""
 "Presets (if any) for this plugin\n"
 "(Both factory and user-created)"
 msgstr ""
 
-#: plugin_ui.cc:431
+#: plugin_ui.cc:432
 msgid "Save a new preset"
 msgstr ""
 
-#: plugin_ui.cc:432
+#: plugin_ui.cc:433
 msgid "Save the current preset"
 msgstr ""
 
-#: plugin_ui.cc:433
+#: plugin_ui.cc:434
 msgid "Delete the current preset"
 msgstr ""
 
-#: plugin_ui.cc:434
+#: plugin_ui.cc:435
+msgid ""
+"Reset parameters to default (if no parameters are in automation play mode)"
+msgstr ""
+
+#: plugin_ui.cc:436
 msgid "Disable signal processing by the plugin"
 msgstr ""
 
-#: plugin_ui.cc:467 plugin_ui.cc:663
+#: plugin_ui.cc:473 plugin_ui.cc:681
 msgid ""
 "Click to allow the plugin to receive keyboard events that %1 would normally "
 "use as a shortcut"
 msgstr ""
 
-#: plugin_ui.cc:468
+#: plugin_ui.cc:474
 msgid "Click to enable/disable this plugin"
 msgstr ""
 
-#: plugin_ui.cc:507
+#: plugin_ui.cc:517
 msgid "latency (%1 sample)"
 msgid_plural "latency (%1 samples)"
 msgstr[0] ""
 msgstr[1] ""
 
-#: plugin_ui.cc:509
+#: plugin_ui.cc:519
 msgid "latency (%1 ms)"
 msgstr ""
 
-#: plugin_ui.cc:520
+#: plugin_ui.cc:530
 msgid "Edit Latency"
 msgstr ""
 
-#: plugin_ui.cc:566
+#: plugin_ui.cc:576
 msgid ""
 "Plugin presets are not supported in this build of %1. Consider paying for a "
 "full version"
 msgstr ""
 
-#: plugin_ui.cc:574
+#: plugin_ui.cc:584
 msgid ""
 "Plugin presets are not supported in this build, see the Log window for more "
 "information."
 msgstr ""
 
-#: plugin_ui.cc:670
+#: plugin_ui.cc:592
+msgid "New Preset"
+msgstr ""
+
+#: plugin_ui.cc:688
 msgid "Click to allow normal use of %1 keyboard shortcuts"
 msgstr ""
 
-#: port_group.cc:337
-msgid "%1 Busses"
+#: plugin_ui.cc:785
+msgid "(none)"
 msgstr ""
 
 #: port_group.cc:338
-msgid "%1 Tracks"
+msgid "%1 Busses"
 msgstr ""
 
 #: port_group.cc:339
-msgid "Hardware"
+msgid "%1 Tracks"
 msgstr ""
 
 #: port_group.cc:340
-msgid "%1 Misc"
+msgid "Hardware"
 msgstr ""
 
 #: port_group.cc:341
+msgid "%1 Misc"
+msgstr ""
+
+#: port_group.cc:342
 msgid "Other"
 msgstr ""
 
-#: port_group.cc:432 port_group.cc:433
+#: port_group.cc:434 port_group.cc:435
 msgid "LTC Out"
 msgstr ""
 
-#: port_group.cc:436 port_group.cc:437
+#: port_group.cc:438 port_group.cc:439
 msgid "LTC In"
 msgstr ""
 
-#: port_group.cc:463
+#: port_group.cc:473
 msgid "MTC in"
 msgstr ""
 
-#: port_group.cc:466
+#: port_group.cc:476
 msgid "MIDI control in"
 msgstr ""
 
-#: port_group.cc:469
+#: port_group.cc:479
 msgid "MIDI clock in"
 msgstr ""
 
-#: port_group.cc:472
+#: port_group.cc:482
 msgid "MMC in"
 msgstr ""
 
-#: port_group.cc:476
+#: port_group.cc:486
 msgid "MTC out"
 msgstr ""
 
-#: port_group.cc:479
+#: port_group.cc:489
 msgid "MIDI control out"
 msgstr ""
 
-#: port_group.cc:482
+#: port_group.cc:492
 msgid "MIDI clock out"
 msgstr ""
 
-#: port_group.cc:485
+#: port_group.cc:495
 msgid "MMC out"
 msgstr ""
 
-#: port_group.cc:532
+#: port_group.cc:554
 msgid ":monitor"
 msgstr ""
 
-#: port_group.cc:544
+#: port_group.cc:570
 msgid "system:"
 msgstr ""
 
-#: port_group.cc:545
-msgid "alsa_pcm"
+#: port_group.cc:571
+msgid "alsa_pcm:"
+msgstr ""
+
+#: port_group.cc:572
+msgid "alsa_midi:"
+msgstr ""
+
+#: port_group.cc:577
+msgid "Scene "
 msgstr ""
 
 #: port_insert_ui.cc:39
@@ -8253,77 +9841,76 @@ msgstr ""
 msgid "Port Insert "
 msgstr ""
 
-#: port_matrix.cc:331 port_matrix.cc:357
+#: port_matrix.cc:341 port_matrix.cc:367
 msgid "<b>Sources</b>"
 msgstr ""
 
-#: port_matrix.cc:332 port_matrix.cc:358
+#: port_matrix.cc:342 port_matrix.cc:368
 msgid "<b>Destinations</b>"
 msgstr ""
 
-#: port_matrix.cc:440 port_matrix.cc:448
+#: port_matrix.cc:450 port_matrix.cc:458
 #, c-format
 msgid "Add %s %s"
 msgstr ""
 
-#: port_matrix.cc:456
+#: port_matrix.cc:466
 #, c-format
 msgid "Rename '%s'..."
 msgstr ""
 
-#: port_matrix.cc:472
+#: port_matrix.cc:482
 msgid "Remove all"
 msgstr ""
 
-#: port_matrix.cc:492 port_matrix.cc:504
+#: port_matrix.cc:502 port_matrix.cc:514
 #, c-format
 msgid "%s all"
 msgstr ""
 
-#: port_matrix.cc:527
+#: port_matrix.cc:537
 msgid "Rescan"
 msgstr ""
 
-#: port_matrix.cc:529
+#: port_matrix.cc:539
 msgid "Show individual ports"
 msgstr ""
 
-#: port_matrix.cc:535
+#: port_matrix.cc:545
 msgid "Flip"
 msgstr ""
 
-#: port_matrix.cc:722
-msgid ""
-"It is not possible to add a port here, as the first processor in the track "
-"or buss cannot support the new configuration."
+#: port_matrix.cc:732
+msgid "It is not possible to add a port here."
 msgstr ""
 
-#: port_matrix.cc:725
+#: port_matrix.cc:733
 msgid "Cannot add port"
 msgstr ""
 
-#: port_matrix.cc:747
-msgid "Port removal not allowed"
+#: port_matrix.cc:757
+msgid "The last port cannot be removed"
 msgstr ""
 
-#: port_matrix.cc:748
-msgid ""
-"This port cannot be removed.\n"
-"Either the first plugin in the track or buss cannot accept\n"
-"the new number of inputs or the last plugin has more outputs."
+#: port_matrix.cc:760
+msgid "This port cannot be removed."
+msgstr ""
+
+#: port_matrix.cc:765
+msgid "Port removal not allowed"
 msgstr ""
 
-#: port_matrix.cc:965
+#: port_matrix.cc:981
 #, c-format
 msgid "Remove '%s'"
 msgstr ""
 
-#: port_matrix.cc:980
+#: port_matrix.cc:996
 #, c-format
 msgid "%s all from '%s'"
 msgstr ""
 
-#: port_matrix.cc:1046 transform_dialog.cc:62
+#: port_matrix.cc:1062 transform_dialog.cc:62
 msgid "channel"
 msgstr ""
 
@@ -8335,223 +9922,237 @@ msgstr ""
 msgid "There are no %1 ports to connect."
 msgstr ""
 
-#: processor_box.cc:150
-msgid "Send"
+#: processor_box.cc:226
+msgid "Return"
 msgstr ""
 
-#: processor_box.cc:152
-msgid "Return"
+#: processor_box.cc:323
+msgid "New Favorite Preset for \"%1\""
 msgstr ""
 
-#: processor_box.cc:310
+#: processor_box.cc:501
 msgid ""
 "\n"
 "This mono plugin has been replicated %1 times."
 msgstr ""
 
-#: processor_box.cc:314
+#: processor_box.cc:505 processor_box.cc:1527
 msgid ""
 "<b>%1</b>\n"
 "Double-click to show GUI.\n"
-"Alt+double-click to show generic GUI.%2"
+"%2+double-click to show generic GUI.%3"
 msgstr ""
 
-#: processor_box.cc:317
+#: processor_box.cc:508 processor_box.cc:1530
 msgid ""
 "<b>%1</b>\n"
 "Double-click to show generic GUI.%2"
 msgstr ""
 
-#: processor_box.cc:361
+#: processor_box.cc:514
+msgid ""
+"<b>%1</b>\n"
+"The Plugin is not available on this system\n"
+"and has been replaced by a stub."
+msgstr ""
+
+#: processor_box.cc:600
 #, c-format
 msgid "(%1x1) "
 msgstr ""
 
-#: processor_box.cc:437
+#: processor_box.cc:695
+msgid "Inline Display"
+msgstr ""
+
+#: processor_box.cc:703
 msgid "Show All Controls"
 msgstr ""
 
-#: processor_box.cc:441
+#: processor_box.cc:707
 msgid "Hide All Controls"
 msgstr ""
 
-#: processor_box.cc:475
+#: processor_box.cc:752
 msgid "Link panner controls"
 msgstr ""
 
-#: processor_box.cc:575
+#: processor_box.cc:859
 msgid "on"
 msgstr ""
 
-#: processor_box.cc:575 rc_option_editor.cc:2360 rc_option_editor.cc:2374
+#: processor_box.cc:859 rc_option_editor.cc:3178 rc_option_editor.cc:3192
 msgid "off"
 msgstr ""
 
-#: processor_box.cc:957
+#: processor_box.cc:1817
 msgid ""
 "Right-click to add/remove/edit\n"
 "plugins,inserts,sends and more"
 msgstr ""
 
-#: processor_box.cc:1429 processor_box.cc:1804
+#: processor_box.cc:1966
+msgid ""
+"Processor Drag/Drop failed. Probably because\n"
+"the I/O configuration of the plugins could\n"
+"not match the configuration of this track."
+msgstr ""
+
+#: processor_box.cc:2443 processor_box.cc:2986
 msgid "Plugin Incompatibility"
 msgstr ""
 
-#: processor_box.cc:1432
+#: processor_box.cc:2446
 msgid "You attempted to add the plugin \"%1\" in slot %2.\n"
 msgstr ""
 
-#: processor_box.cc:1438
+#: processor_box.cc:2452
 msgid ""
 "\n"
 "This plugin has:\n"
 msgstr ""
 
-#: processor_box.cc:1441
+#: processor_box.cc:2455
 msgid "\t%1 MIDI input\n"
 msgid_plural "\t%1 MIDI inputs\n"
 msgstr[0] ""
 msgstr[1] ""
 
-#: processor_box.cc:1445
+#: processor_box.cc:2459
 msgid "\t%1 audio input\n"
 msgid_plural "\t%1 audio inputs\n"
 msgstr[0] ""
 msgstr[1] ""
 
-#: processor_box.cc:1448
+#: processor_box.cc:2462
 msgid ""
 "\n"
 "but at the insertion point, there are:\n"
 msgstr ""
 
-#: processor_box.cc:1451
+#: processor_box.cc:2465
 msgid "\t%1 MIDI channel\n"
 msgid_plural "\t%1 MIDI channels\n"
 msgstr[0] ""
 msgstr[1] ""
 
-#: processor_box.cc:1455
+#: processor_box.cc:2469
 msgid "\t%1 audio channel\n"
 msgid_plural "\t%1 audio channels\n"
 msgstr[0] ""
 msgstr[1] ""
 
-#: processor_box.cc:1458
+#: processor_box.cc:2472
 msgid ""
 "\n"
 "%1 is unable to insert this plugin here.\n"
 msgstr ""
 
-#: processor_box.cc:1495
-msgid "Cannot set up new send: %1"
-msgstr ""
-
-#: processor_box.cc:1807
+#: processor_box.cc:2989
 msgid ""
 "You cannot reorder these plugins/sends/inserts\n"
 "in that way because the inputs and\n"
 "outputs will not work correctly."
 msgstr ""
 
-#: processor_box.cc:1991
+#: processor_box.cc:3189
 msgid "Rename Processor"
 msgstr ""
 
-#: processor_box.cc:2022
+#: processor_box.cc:3220
 msgid "At least 100 IO objects exist with a name like %1 - name not changed"
 msgstr ""
 
-#: processor_box.cc:2159
+#: processor_box.cc:3371
 msgid "plugin insert constructor failed"
 msgstr ""
 
-#: processor_box.cc:2170
+#: processor_box.cc:3382
 msgid ""
 "Copying the set of processors on the clipboard failed,\n"
 "probably because the I/O configuration of the plugins\n"
 "could not match the configuration of this track."
 msgstr ""
 
-#: processor_box.cc:2216
+#: processor_box.cc:3428
 msgid ""
 "Do you really want to remove all processors from %1?\n"
 "(this cannot be undone)"
 msgstr ""
 
-#: processor_box.cc:2220 processor_box.cc:2245
+#: processor_box.cc:3432 processor_box.cc:3457
 msgid "Yes, remove them all"
 msgstr ""
 
-#: processor_box.cc:2222 processor_box.cc:2247
+#: processor_box.cc:3434 processor_box.cc:3459
 msgid "Remove processors"
 msgstr ""
 
-#: processor_box.cc:2237
+#: processor_box.cc:3449
 msgid ""
 "Do you really want to remove all pre-fader processors from %1?\n"
 "(this cannot be undone)"
 msgstr ""
 
-#: processor_box.cc:2240
+#: processor_box.cc:3452
 msgid ""
 "Do you really want to remove all post-fader processors from %1?\n"
 "(this cannot be undone)"
 msgstr ""
 
-#: processor_box.cc:2428
+#: processor_box.cc:3641
 msgid "New Plugin"
 msgstr ""
 
-#: processor_box.cc:2431
+#: processor_box.cc:3644
 msgid "New Insert"
 msgstr ""
 
-#: processor_box.cc:2434
+#: processor_box.cc:3647
 msgid "New External Send ..."
 msgstr ""
 
-#: processor_box.cc:2438
+#: processor_box.cc:3651
 msgid "New Aux Send ..."
 msgstr ""
 
-#: processor_box.cc:2441
+#: processor_box.cc:3654
 msgid "Send Options"
 msgstr ""
 
-#: processor_box.cc:2443
+#: processor_box.cc:3656
 msgid "Clear (all)"
 msgstr ""
 
-#: processor_box.cc:2445
+#: processor_box.cc:3658
 msgid "Clear (pre-fader)"
 msgstr ""
 
-#: processor_box.cc:2447
+#: processor_box.cc:3660
 msgid "Clear (post-fader)"
 msgstr ""
 
-#: processor_box.cc:2473
+#: processor_box.cc:3690
 msgid "Activate All"
 msgstr ""
 
-#: processor_box.cc:2475
+#: processor_box.cc:3692
 msgid "Deactivate All"
 msgstr ""
 
-#: processor_box.cc:2477
+#: processor_box.cc:3694
 msgid "A/B Plugins"
 msgstr ""
 
-#: processor_box.cc:2486
+#: processor_box.cc:3707
 msgid "Edit with generic controls..."
 msgstr ""
 
-#: processor_box.cc:2789
+#: processor_box.cc:4039
 msgid "%1: %2 (by %3)"
 msgstr ""
 
-#: processor_box.cc:2791
+#: processor_box.cc:4041
 msgid "%1 (by %2)"
 msgstr ""
 
@@ -8579,347 +10180,446 @@ msgstr ""
 msgid "main grid"
 msgstr ""
 
-#: quantize_dialog.cc:52 quantize_dialog.cc:109
+#: quantize_dialog.cc:61 quantize_dialog.cc:118
 msgid "Quantize"
 msgstr "Quantise"
 
-#: quantize_dialog.cc:56
+#: quantize_dialog.cc:65
 msgid "Strength"
 msgstr ""
 
-#: quantize_dialog.cc:59
+#: quantize_dialog.cc:68
 msgid "Swing"
 msgstr ""
 
-#: quantize_dialog.cc:62
+#: quantize_dialog.cc:71
 msgid "Threshold (ticks)"
 msgstr ""
 
-#: quantize_dialog.cc:63
+#: quantize_dialog.cc:72
 msgid "Snap note start"
 msgstr ""
 
-#: quantize_dialog.cc:64
+#: quantize_dialog.cc:73
 msgid "Snap note end"
 msgstr ""
 
-#: rc_option_editor.cc:77
-msgid "Click audio file:"
+#: rc_option_editor.cc:83 rc_option_editor.cc:84 rc_option_editor.cc:1550
+msgid "Browse..."
 msgstr ""
 
-#: rc_option_editor.cc:80 rc_option_editor.cc:87
-msgid "Browse..."
+#: rc_option_editor.cc:89
+msgid "Emphasis on first beat:"
+msgstr ""
+
+#: rc_option_editor.cc:95
+msgid "Use default Click:"
+msgstr ""
+
+#: rc_option_editor.cc:101
+msgid "Click audio file:"
 msgstr ""
 
-#: rc_option_editor.cc:84
+#: rc_option_editor.cc:108
 msgid "Click emphasis audio file:"
 msgstr ""
 
-#: rc_option_editor.cc:116
+#: rc_option_editor.cc:154
 msgid "Choose Click"
 msgstr ""
 
-#: rc_option_editor.cc:139
+#: rc_option_editor.cc:177
 msgid "Choose Click Emphasis"
 msgstr ""
 
-#: rc_option_editor.cc:170
+#: rc_option_editor.cc:238
 msgid "Limit undo history to"
 msgstr ""
 
-#: rc_option_editor.cc:171
+#: rc_option_editor.cc:239
 msgid "Save undo history of"
 msgstr ""
 
-#: rc_option_editor.cc:180 rc_option_editor.cc:187
+#: rc_option_editor.cc:248 rc_option_editor.cc:255
 msgid "commands"
 msgstr ""
 
-#: rc_option_editor.cc:325
-msgid "Edit using:"
+#: rc_option_editor.cc:378
+msgid ""
+"\n"
+"Changes to this setting will only persist after your project has been saved."
 msgstr ""
 
-#: rc_option_editor.cc:331 rc_option_editor.cc:357 rc_option_editor.cc:384
-msgid "+ button"
+#: rc_option_editor.cc:389 rc_option_editor.cc:451
+msgid "<b>Recommended Setting: %1 + button 3 (right mouse button)</b>%2"
 msgstr ""
 
-#: rc_option_editor.cc:351
-msgid "Delete using:"
+#: rc_option_editor.cc:403
+msgid "Select Keyboard layout:"
 msgstr ""
 
-#: rc_option_editor.cc:378
-msgid "Insert note using:"
+#: rc_option_editor.cc:422
+msgid "When Clicking:"
 msgstr ""
 
-#: rc_option_editor.cc:405
-msgid "Ignore snap using:"
+#: rc_option_editor.cc:429
+msgid "Edit using:"
 msgstr ""
 
-#: rc_option_editor.cc:421
-msgid "Keyboard layout:"
+#: rc_option_editor.cc:435 rc_option_editor.cc:465 rc_option_editor.cc:495
+msgid "+ button"
 msgstr ""
 
-#: rc_option_editor.cc:544
-msgid "Font scaling:"
+#: rc_option_editor.cc:459
+msgid "Delete using:"
 msgstr ""
 
-#: rc_option_editor.cc:547
-msgid "Default"
+#: rc_option_editor.cc:481
+msgid "<b>Recommended Setting: %1 + button 1 (left mouse button)</b>%2"
 msgstr ""
 
-#: rc_option_editor.cc:573
-msgid "Major font-scale changes require an application restart to re-layout."
+#: rc_option_editor.cc:489
+msgid "Insert note using:"
 msgstr ""
 
-#: rc_option_editor.cc:614
-msgid "Waveform Clip Level (dBFS):"
+#: rc_option_editor.cc:507
+msgid "When Beginning a Drag:"
 msgstr ""
 
-#: rc_option_editor.cc:666
-msgid "Playback (seconds of buffering):"
+#: rc_option_editor.cc:518 rc_option_editor.cc:545 rc_option_editor.cc:578
+#: rc_option_editor.cc:599 rc_option_editor.cc:643 rc_option_editor.cc:676
+#: rc_option_editor.cc:702 rc_option_editor.cc:730 rc_option_editor.cc:759
+#: rc_option_editor.cc:781
+msgid "<b>Recommended Setting: %1</b>%2"
 msgstr ""
 
-#: rc_option_editor.cc:679
-msgid "Recording (seconds of buffering):"
+#: rc_option_editor.cc:532
+msgid "Copy items using:"
 msgstr ""
 
-#: rc_option_editor.cc:737
-msgid "Control Surface Protocol"
+#: rc_option_editor.cc:559
+msgid "Constrain drag using:"
 msgstr ""
 
-#: rc_option_editor.cc:746
-msgid "Double-click on a name to edit settings for an enabled protocol"
+#: rc_option_editor.cc:567
+msgid "When Beginning a Trim:"
 msgstr ""
 
-#: rc_option_editor.cc:903
-msgid "Show Video Export Info before export"
+#: rc_option_editor.cc:586
+msgid "Trim contents using:"
 msgstr ""
 
-#: rc_option_editor.cc:904
-msgid "Show Video Server Startup Dialog"
-msgstr "Show Video Server Startup Dialogue"
+#: rc_option_editor.cc:607
+msgid "Anchored trim using:"
+msgstr ""
 
-#: rc_option_editor.cc:905
-msgid "Advanced Setup (remote video server)"
+#: rc_option_editor.cc:651
+msgid "Resize notes relatively using:"
 msgstr ""
 
-#: rc_option_editor.cc:913
-msgid ""
-"<b>When enabled</b> you can speficify a custom video-server URL and docroot. "
-"- Do not enable this option unless you know what you are doing."
+#: rc_option_editor.cc:660
+msgid "While Dragging:"
 msgstr ""
 
-#: rc_option_editor.cc:915
-msgid "Video Server URL:"
+#: rc_option_editor.cc:684
+msgid "Ignore snap using:"
 msgstr ""
 
-#: rc_option_editor.cc:920
-msgid ""
-"Base URL of the video-server including http prefix. This is usually 'http://"
-"hostname.example.org:1554/' and defaults to 'http://localhost:1554/' when "
-"the video-server is running locally"
+#: rc_option_editor.cc:710
+msgid "Snap relatively using:"
 msgstr ""
 
-#: rc_option_editor.cc:922
-msgid "Video Folder:"
+#: rc_option_editor.cc:718
+msgid "While Trimming:"
 msgstr ""
 
-#: rc_option_editor.cc:927
-msgid ""
-"Local path to the video-server document-root. Only files below this "
-"directory will be accessible by the video-server. If the server run on a "
-"remote host, it should point to a network mounted folder of the server's "
-"docroot or be left empty if it is unvailable. It is used for the local video-"
-"monitor and file-browsing when opening/adding a video file."
+#: rc_option_editor.cc:738
+msgid "Resize overlapped regions using:"
 msgstr ""
 
-#: rc_option_editor.cc:934
-msgid ""
-"<b>When enabled</b> an information window with details is displayed before "
-"the video-export dialog."
+#: rc_option_editor.cc:746
+msgid "While Dragging Control Points:"
 msgstr ""
-"<b>When enabled</b> an information window with details is displayed before "
-"the video-export dialogue."
 
-#: rc_option_editor.cc:939
-msgid ""
-"<b>When enabled</b> the video server is never launched automatically without "
-"confirmation"
+#: rc_option_editor.cc:767
+msgid "Fine adjust using:"
 msgstr ""
 
-#: rc_option_editor.cc:1022
-msgid "Always Display Plugin Scan Progress"
+#: rc_option_editor.cc:789
+msgid "Push points using:"
 msgstr ""
 
-#: rc_option_editor.cc:1023
-msgid "Scan for [new] VST Plugins on Application Start"
+#: rc_option_editor.cc:1029
+msgid "GUI and Font scaling:"
 msgstr ""
 
-#: rc_option_editor.cc:1024
-msgid "Scan for AudioUnit Plugins on Application Start"
+#: rc_option_editor.cc:1032
+msgid "Default"
 msgstr ""
 
-#: rc_option_editor.cc:1035
-msgid "General"
+#: rc_option_editor.cc:1058
+msgid "Adjusting the scale requires an application restart to re-layout."
 msgstr ""
 
-#: rc_option_editor.cc:1041
-msgid "Scan for Plugins"
+#: rc_option_editor.cc:1100
+msgid "∞"
 msgstr ""
 
-#: rc_option_editor.cc:1048
-msgid ""
-"<b>When enabled</b> a popup window showing plugin scan progress is displayed "
-"for indexing (cache load) and discovery (detect new plugins)"
+#: rc_option_editor.cc:1101
+msgid "30 sec"
 msgstr ""
 
-#: rc_option_editor.cc:1055
-msgid ""
-"Specify the default timeout for plugin instantiation in 1/10 seconds. "
-"Plugins that require more time to load will be blacklisted. A value of 0 "
-"disables the timeout."
+#: rc_option_editor.cc:1102
+msgid "1 min"
 msgstr ""
 
-#: rc_option_editor.cc:1057
-msgid "Scan Time Out [deciseconds]"
+#: rc_option_editor.cc:1103
+msgid "2 mins"
 msgstr ""
 
-#: rc_option_editor.cc:1065
-msgid "VST"
+#: rc_option_editor.cc:1104
+msgid "3 mins"
 msgstr ""
 
-#: rc_option_editor.cc:1071
-msgid "Clear VST Cache"
+#: rc_option_editor.cc:1105
+msgid "4 mins"
 msgstr ""
 
-#: rc_option_editor.cc:1075
-msgid "Clear VST Blacklist"
+#: rc_option_editor.cc:1106
+msgid "5 mins"
 msgstr ""
 
-#: rc_option_editor.cc:1083
+#: rc_option_editor.cc:1109
 msgid ""
-"<b>When enabled</b> new VST plugins are searched, tested and added to the "
-"cache index on application start. When disabled new plugins will only be "
-"available after triggering a 'Scan' manually"
+"Specify the default timeout for plugin instantiation. Plugins that require "
+"more time to load will be blacklisted. A value of 0 disables the timeout."
 msgstr ""
 
-#: rc_option_editor.cc:1086
-msgid "Linux VST Path:"
+#: rc_option_editor.cc:1111
+msgid "Scan Time Out:"
 msgstr ""
 
-#: rc_option_editor.cc:1093
-msgid "Windows VST Path:"
+#: rc_option_editor.cc:1159
+msgid "Waveform Clip Level (dBFS):"
 msgstr ""
 
-#: rc_option_editor.cc:1102
-msgid "Audio Unit"
+#: rc_option_editor.cc:1212
+msgid "Small sessions (4-16 tracks)"
 msgstr ""
 
-#: rc_option_editor.cc:1111
-msgid ""
-"<b>When enabled</b> Audio Unit Plugins are discovered on application start. "
-"When disabled AU plugins will only be available after triggering a 'Scan' "
-"manually. The first successful scan will enable AU auto-scan, Any crash "
-"during plugin discovery will disable it."
+#: rc_option_editor.cc:1213
+msgid "Medium sessions (16-64 tracks)"
 msgstr ""
 
-#: rc_option_editor.cc:1114
-msgid "Clear AU Cache"
+#: rc_option_editor.cc:1214
+msgid "Large sessions (64+ tracks)"
 msgstr ""
 
-#: rc_option_editor.cc:1118
-msgid "Clear AU Blacklist"
+#: rc_option_editor.cc:1215
+msgid "Custom (set by sliders below)"
 msgstr ""
 
-#: rc_option_editor.cc:1201
-msgid "Set Windows VST Search Path"
+#: rc_option_editor.cc:1219 export_video_dialog.cc:167
+msgid "Preset:"
 msgstr ""
 
-#: rc_option_editor.cc:1216
-msgid "Set Linux VST Search Path"
+#: rc_option_editor.cc:1231
+msgid "Playback (seconds of buffering):"
 msgstr ""
 
-#: rc_option_editor.cc:1297
-msgid "%1 Preferences"
+#: rc_option_editor.cc:1244
+msgid "Recording (seconds of buffering):"
 msgstr ""
 
-#: rc_option_editor.cc:1309
-msgid "DSP CPU Utilization"
+#: rc_option_editor.cc:1322
+msgid "programming error: unknown buffering preset string, index = %1"
 msgstr ""
 
-#: rc_option_editor.cc:1313
-msgid "Signal processing uses"
+#: rc_option_editor.cc:1353
+msgid "Control Surface Protocol"
 msgstr ""
 
-#: rc_option_editor.cc:1318
-msgid "all but one processor"
+#: rc_option_editor.cc:1367
+msgid ""
+"Click to edit the settings for selected protocol ( it must be ENABLED "
+"first ):"
 msgstr ""
 
-#: rc_option_editor.cc:1319
-msgid "all available processors"
+#: rc_option_editor.cc:1371
+msgid "Show Protocol Settings"
 msgstr ""
 
-#: rc_option_editor.cc:1322
-msgid "%1 processors"
+#: rc_option_editor.cc:1494
+msgid "Configuration"
 msgstr ""
 
-#: rc_option_editor.cc:1325
-msgid "This setting will only take effect when %1 is restarted."
+#: rc_option_editor.cc:1547
+msgid "Show Video Export Info before export"
 msgstr ""
 
-#: rc_option_editor.cc:1330
-msgid "Options|Undo"
+#: rc_option_editor.cc:1548
+msgid "Show Video Server Startup Dialog"
+msgstr "Show Video Server Startup Dialogue"
+
+#: rc_option_editor.cc:1549
+msgid "Advanced Setup (remote video server)"
 msgstr ""
 
-#: rc_option_editor.cc:1337
-msgid "Verify removal of last capture"
+#: rc_option_editor.cc:1556
+msgid "Video Server"
 msgstr ""
 
-#: rc_option_editor.cc:1345
-msgid "Make periodic backups of the session file"
+#: rc_option_editor.cc:1565
+msgid ""
+"<b>When enabled</b> you can speficify a custom video-server URL and docroot. "
+"- Do not enable this option unless you know what you are doing."
 msgstr ""
 
-#: rc_option_editor.cc:1350
+#: rc_option_editor.cc:1567
+msgid "Video Server URL:"
+msgstr ""
+
+#: rc_option_editor.cc:1572
+msgid ""
+"Base URL of the video-server including http prefix. This is usually 'http://"
+"hostname.example.org:1554/' and defaults to 'http://localhost:1554/' when "
+"the video-server is running locally"
+msgstr ""
+
+#: rc_option_editor.cc:1574
+msgid "Video Folder:"
+msgstr ""
+
+#: rc_option_editor.cc:1579
+msgid ""
+"Local path to the video-server document-root. Only files below this "
+"directory will be accessible by the video-server. If the server run on a "
+"remote host, it should point to a network mounted folder of the server's "
+"docroot or be left empty if it is unvailable. It is used for the local video-"
+"monitor and file-browsing when opening/adding a video file."
+msgstr ""
+
+#: rc_option_editor.cc:1584
+msgid ""
+"<b>When enabled</b> an information window with details is displayed before "
+"the video-export dialog."
+msgstr ""
+"<b>When enabled</b> an information window with details is displayed before "
+"the video-export dialogue."
+
+#: rc_option_editor.cc:1589
+msgid ""
+"<b>When enabled</b> the video server is never launched automatically without "
+"confirmation"
+msgstr ""
+
+#: rc_option_editor.cc:1598
+msgid "Custom Path to Video Monitor (%1) - leave empty for default:"
+msgstr ""
+
+#: rc_option_editor.cc:1610
+msgid ""
+"Set a custom path to the Video Monitor Executable, changing this requires a "
+"restart."
+msgstr ""
+
+#: rc_option_editor.cc:1661
+msgid "Set Video Monitor Executable"
+msgstr ""
+
+#: rc_option_editor.cc:1734
+msgid "Column %1"
+msgstr ""
+
+#: rc_option_editor.cc:1852
+msgid "%1 Preferences"
+msgstr ""
+
+#: rc_option_editor.cc:1874
+msgid "DSP CPU Utilization"
+msgstr ""
+
+#: rc_option_editor.cc:1878
+msgid "Signal processing uses"
+msgstr ""
+
+#: rc_option_editor.cc:1883
+msgid "all but one processor"
+msgstr ""
+
+#: rc_option_editor.cc:1884
+msgid "all available processors"
+msgstr ""
+
+#: rc_option_editor.cc:1887
+msgid "%1 processors"
+msgstr ""
+
+#: rc_option_editor.cc:1890
+msgid "This setting will only take effect when %1 is restarted."
+msgstr ""
+
+#: rc_option_editor.cc:1895
+msgid "Options|Undo"
+msgstr ""
+
+#: rc_option_editor.cc:1902
+msgid "Verify removal of last capture"
+msgstr ""
+
+#: rc_option_editor.cc:1907
 msgid "Session Management"
 msgstr ""
 
-#: rc_option_editor.cc:1355
+#: rc_option_editor.cc:1912
+msgid "Make periodic backups of the session file"
+msgstr ""
+
+#: rc_option_editor.cc:1920
 msgid "Always copy imported files"
 msgstr ""
 
-#: rc_option_editor.cc:1362
+#: rc_option_editor.cc:1927
 msgid "Default folder for new sessions:"
 msgstr ""
 
-#: rc_option_editor.cc:1370
+#: rc_option_editor.cc:1935
 msgid "Maximum number of recent sessions"
 msgstr ""
 
-#: rc_option_editor.cc:1383
+#: rc_option_editor.cc:1941 rc_option_editor.cc:1943 rc_option_editor.cc:1945
+msgid "Misc/Click"
+msgstr ""
+
+#: rc_option_editor.cc:1948
 msgid "Click gain level"
 msgstr ""
 
-#: rc_option_editor.cc:1388 route_time_axis.cc:266 route_time_axis.cc:821
+#: rc_option_editor.cc:1953 route_time_axis.cc:277 route_time_axis.cc:831
 msgid "Automation"
 msgstr ""
 
-#: rc_option_editor.cc:1393
+#: rc_option_editor.cc:1958
 msgid "Thinning factor (larger value => less data)"
 msgstr ""
 
-#: rc_option_editor.cc:1402
+#: rc_option_editor.cc:1967
 msgid "Automation sampling interval (milliseconds)"
 msgstr ""
 
-#: rc_option_editor.cc:1414
+#: rc_option_editor.cc:1975
+msgid "Transport Options"
+msgstr ""
+
+#: rc_option_editor.cc:1981
 msgid "Keep record-enable engaged on stop"
 msgstr ""
 
-#: rc_option_editor.cc:1423
+#: rc_option_editor.cc:1990
 msgid "Play loop is a transport mode"
 msgstr ""
 
-#: rc_option_editor.cc:1428
+#: rc_option_editor.cc:1995
 msgid ""
 "<b>When enabled</b> the loop button does not start playback but forces "
 "playback to always play the loop\n"
@@ -8928,25 +10628,25 @@ msgid ""
 "cancels loop playback"
 msgstr ""
 
-#: rc_option_editor.cc:1434
+#: rc_option_editor.cc:2001
 msgid "Stop recording when an xrun occurs"
 msgstr ""
 
-#: rc_option_editor.cc:1439
+#: rc_option_editor.cc:2006
 msgid ""
 "<b>When enabled</b> %1 will stop recording if an over- or underrun is "
 "detected by the audio engine"
 msgstr ""
 
-#: rc_option_editor.cc:1445
+#: rc_option_editor.cc:2012
 msgid "Create markers where xruns occur"
 msgstr ""
 
-#: rc_option_editor.cc:1454
+#: rc_option_editor.cc:2021
 msgid "Stop at the end of the session"
 msgstr ""
 
-#: rc_option_editor.cc:1459
+#: rc_option_editor.cc:2026
 msgid ""
 "<b>When enabled</b> if %1 is <b>not recording</b>, it will stop the "
 "transport when it reaches the current session end marker\n"
@@ -8955,11 +10655,11 @@ msgid ""
 "all times"
 msgstr ""
 
-#: rc_option_editor.cc:1467
+#: rc_option_editor.cc:2034
 msgid "Do seamless looping (not possible when slaved to MTC, LTC etc)"
 msgstr ""
 
-#: rc_option_editor.cc:1472
+#: rc_option_editor.cc:2039
 msgid ""
 "<b>When enabled</b> this will loop by reading ahead and wrapping around at "
 "the loop point, preventing any need to do a transport locate at the end of "
@@ -8969,39 +10669,83 @@ msgid ""
 "loop when %1 reaches the end which will often cause a small click or delay"
 msgstr ""
 
-#: rc_option_editor.cc:1480
+#: rc_option_editor.cc:2047
 msgid "Disable per-track record disarm while rolling"
 msgstr ""
 
-#: rc_option_editor.cc:1484
+#: rc_option_editor.cc:2051
 msgid ""
 "<b>When enabled</b> this will prevent you from accidentally stopping "
 "specific tracks recording during a take"
 msgstr ""
 
-#: rc_option_editor.cc:1489
+#: rc_option_editor.cc:2056
 msgid "12dB gain reduction during fast-forward and fast-rewind"
 msgstr ""
 
-#: rc_option_editor.cc:1493
+#: rc_option_editor.cc:2060
 msgid ""
 "This will reduce the unpleasant increase in perceived volume that occurs "
 "when fast-forwarding or rewinding through some kinds of audio"
 msgstr ""
 
-#: rc_option_editor.cc:1497
-msgid "Sync/Slave"
+#: rc_option_editor.cc:2066
+msgid "Preroll"
+msgstr ""
+
+#: rc_option_editor.cc:2071
+msgid ""
+"The amount of preroll (in seconds) to apply when <b>Play with Preroll</b> is "
+"initiated.\n"
+"\n"
+"If <b>Follow Edits</b> is enabled, the preroll is applied to the playhead "
+"position when a region is selected or trimmed."
+msgstr ""
+
+#: rc_option_editor.cc:2073
+msgid "0 (no pre-roll)"
 msgstr ""
 
-#: rc_option_editor.cc:1501
+#: rc_option_editor.cc:2074
+msgid "0.1 second"
+msgstr ""
+
+#: rc_option_editor.cc:2075
+msgid "0.25 second"
+msgstr ""
+
+#: rc_option_editor.cc:2076
+msgid "0.5 second"
+msgstr ""
+
+#: rc_option_editor.cc:2077
+msgid "1.0 second"
+msgstr ""
+
+#: rc_option_editor.cc:2078
+msgid "2.0 seconds"
+msgstr ""
+
+#: rc_option_editor.cc:2081 rc_option_editor.cc:2090 rc_option_editor.cc:2106
+#: rc_option_editor.cc:2127 rc_option_editor.cc:2145 rc_option_editor.cc:2147
+#: rc_option_editor.cc:2164 rc_option_editor.cc:2167 rc_option_editor.cc:2169
+#: rc_option_editor.cc:2197
+msgid "Transport/Sync"
+msgstr ""
+
+#: rc_option_editor.cc:2081
+msgid "Synchronization and Slave Options"
+msgstr ""
+
+#: rc_option_editor.cc:2085
 msgid "External timecode source"
 msgstr ""
 
-#: rc_option_editor.cc:1510
+#: rc_option_editor.cc:2094
 msgid "Match session video frame rate to external timecode"
 msgstr ""
 
-#: rc_option_editor.cc:1516
+#: rc_option_editor.cc:2100
 msgid ""
 "This option controls the value of the video frame rate <i>while chasing</i> "
 "an external timecode source.\n"
@@ -9015,27 +10759,27 @@ msgid ""
 "external timecode standard and the session standard."
 msgstr ""
 
-#: rc_option_editor.cc:1526
-msgid "Sync lock timecode to clock - Disable drift compensation."
+#: rc_option_editor.cc:2110
+msgid "Sync-lock timecode to clock (disable drift compensation)"
 msgstr ""
 
-#: rc_option_editor.cc:1532
+#: rc_option_editor.cc:2116
 msgid ""
 "<b>When enabled</b> %1 will never varispeed when slaved to external "
 "timecode. Sync Lock indicates that the selected external timecode source "
 "shares clock-sync (Black & Burst, Wordclock, etc) with the audio "
 "interface. This option disables drift compensation. The transport speed is "
-"fixed at 1.0.Varispeed LTC will be ignored and cause drift.\n"
+"fixed at 1.0. Vari-speed LTC will be ignored and cause drift.\n"
 "\n"
 "<b>When disabled</b> %1 will compensate for potential drift, regardless if "
 "the timecode sources shares clock sync."
 msgstr ""
 
-#: rc_option_editor.cc:1547
+#: rc_option_editor.cc:2131
 msgid "Lock to 29.9700 fps instead of 30000/1001"
 msgstr ""
 
-#: rc_option_editor.cc:1553
+#: rc_option_editor.cc:2137
 msgid ""
 "<b>When enabled</b> the external timecode source is assumed to use 29.97 fps "
 "instead of 30000/1001.\n"
@@ -9057,559 +10801,782 @@ msgstr ""
 "vendors use that rate - despite it being against the specs - because the "
 "variant of using exactly 29.97 fps has zero timecode drift.\n"
 
-#: rc_option_editor.cc:1563
+#: rc_option_editor.cc:2147
 msgid "LTC Reader"
 msgstr ""
 
-#: rc_option_editor.cc:1567
+#: rc_option_editor.cc:2151
 msgid "LTC incoming port"
 msgstr ""
 
-#: rc_option_editor.cc:1582
+#: rc_option_editor.cc:2167
 msgid "LTC Generator"
 msgstr ""
 
-#: rc_option_editor.cc:1587
+#: rc_option_editor.cc:2172
 msgid "Enable LTC generator"
 msgstr ""
 
-#: rc_option_editor.cc:1594
+#: rc_option_editor.cc:2179
 msgid "Send LTC while stopped"
 msgstr ""
 
-#: rc_option_editor.cc:1600
+#: rc_option_editor.cc:2185
 msgid ""
 "<b>When enabled</b> %1 will continue to send LTC information even when the "
 "transport (playhead) is not moving"
 msgstr ""
 
-#: rc_option_editor.cc:1606
+#: rc_option_editor.cc:2191
 msgid "LTC generator level"
 msgstr ""
 
-#: rc_option_editor.cc:1610
+#: rc_option_editor.cc:2195
 msgid ""
 "Specify the Peak Volume of the generated LTC signal in dbFS. A good value "
 "is  0dBu ^= -18dbFS in an EBU calibrated system"
 msgstr ""
 
-#: rc_option_editor.cc:1622
-msgid "Allow dragging of playhead"
+#: rc_option_editor.cc:2204
+msgid "Make rubberband selection rectangle snap to the grid"
 msgstr ""
 
-#: rc_option_editor.cc:1630
-msgid "Move relevant automation when audio regions are moved"
+#: rc_option_editor.cc:2211
+msgid "Name new markers"
 msgstr ""
 
-#: rc_option_editor.cc:1638
-msgid "Show meters on tracks in the editor"
+#: rc_option_editor.cc:2216
+msgid ""
+"If enabled, popup a dialog when a new marker is created to allow its name to "
+"be set as it is created.\n"
+"\n"
+"You can always rename markers by right-clicking on them"
 msgstr ""
+"If enabled, pop up a dialogue when a new marker is created to allow its name "
+"to be set as it is created.\n"
+"\n"
+"You can always rename markers by right-clicking on them"
 
-#: rc_option_editor.cc:1646
+#: rc_option_editor.cc:2222
+msgid "Allow dragging of playhead"
+msgstr ""
+
+#: rc_option_editor.cc:2230
 msgid "Display master-meter in the toolbar"
 msgstr ""
 
-#: rc_option_editor.cc:1653
-msgid "Default fade shape"
+#: rc_option_editor.cc:2239
+msgid "Show zoom toolbar (if torn off)"
 msgstr ""
 
-#: rc_option_editor.cc:1672
-msgid "Regions in active edit groups are edited together"
+#: rc_option_editor.cc:2247
+msgid ""
+"Always use mouse cursor position as zoom focus when zooming using mouse "
+"scroll wheel"
 msgstr ""
 
-#: rc_option_editor.cc:1673
-msgid "whenever they overlap in time"
+#: rc_option_editor.cc:2256
+msgid "Update editor window during drags of the summary"
 msgstr ""
 
-#: rc_option_editor.cc:1674
-msgid "only if they have identical length, position and origin"
+#: rc_option_editor.cc:2264
+msgid "Auto-scroll editor window when dragging near its edges"
 msgstr ""
 
-#: rc_option_editor.cc:1684
-msgid "Make rubberband selection rectangle snap to the grid"
+#: rc_option_editor.cc:2272
+msgid "Show gain envelopes in audio regions"
 msgstr ""
 
-#: rc_option_editor.cc:1692
-msgid "Show waveforms in regions"
+#: rc_option_editor.cc:2273
+msgid "in all modes"
 msgstr ""
 
-#: rc_option_editor.cc:1700
-msgid "Show gain envelopes in audio regions"
+#: rc_option_editor.cc:2274
+msgid "only in Draw and Internal Edit modes"
 msgstr ""
 
-#: rc_option_editor.cc:1701
-msgid "in all modes"
+#: rc_option_editor.cc:2279
+msgid "Editor Behavior"
 msgstr ""
 
-#: rc_option_editor.cc:1702
-msgid "only in region gain mode"
+#: rc_option_editor.cc:2284
+msgid "Move relevant automation when audio regions are moved"
 msgstr ""
 
-#: rc_option_editor.cc:1709
-msgid "Waveform scale"
+#: rc_option_editor.cc:2291
+msgid "Default fade shape"
 msgstr ""
 
-#: rc_option_editor.cc:1714
-msgid "linear"
+#: rc_option_editor.cc:2310
+msgid "Regions in active edit groups are edited together"
 msgstr ""
 
-#: rc_option_editor.cc:1715
-msgid "logarithmic"
+#: rc_option_editor.cc:2311
+msgid "whenever they overlap in time"
 msgstr ""
 
-#: rc_option_editor.cc:1721
-msgid "Waveform shape"
+#: rc_option_editor.cc:2312
+msgid "only if they have identical length, position and origin"
 msgstr ""
 
-#: rc_option_editor.cc:1726
-msgid "traditional"
+#: rc_option_editor.cc:2321
+msgid "Layering model"
 msgstr ""
 
-#: rc_option_editor.cc:1727
-msgid "rectified"
+#: rc_option_editor.cc:2326
+msgid "later is higher"
 msgstr ""
 
-#: rc_option_editor.cc:1736
-msgid "Show waveforms for audio while it is being recorded"
+#: rc_option_editor.cc:2327
+msgid "manual layering"
 msgstr ""
 
-#: rc_option_editor.cc:1744
-msgid "Show zoom toolbar"
+#: rc_option_editor.cc:2332
+msgid "After splitting selected regions, select"
 msgstr ""
 
-#: rc_option_editor.cc:1752
-msgid "Update editor window during drags of the summary"
+#: rc_option_editor.cc:2337
+msgid "no regions"
 msgstr ""
 
-#: rc_option_editor.cc:1760
-msgid "Synchronise editor and mixer selection"
+#: rc_option_editor.cc:2340
+msgid "newly-created regions"
 msgstr ""
 
-#: rc_option_editor.cc:1767
-msgid "Name new markers"
+#: rc_option_editor.cc:2344
+msgid "existing selection and newly-created regions"
 msgstr ""
 
-#: rc_option_editor.cc:1773
-msgid ""
-"If enabled, popup a dialog when a new marker is created to allow its name to "
-"be set as it is created.\n"
-"\n"
-"You can always rename markers by right-clicking on them"
+#: rc_option_editor.cc:2348 rc_option_editor.cc:2351 rc_option_editor.cc:2360
+#: rc_option_editor.cc:2378 rc_option_editor.cc:2390 rc_option_editor.cc:2392
+msgid "Editor/Waveforms"
 msgstr ""
-"If enabled, pop up a dialogue when a new marker is created to allow its name "
-"to be set as it is created.\n"
-"\n"
-"You can always rename markers by right-clicking on them"
 
-#: rc_option_editor.cc:1779
-msgid "Auto-scroll editor window when dragging near its edges"
+#: rc_option_editor.cc:2348
+msgid "Waveforms"
 msgstr ""
 
-#: rc_option_editor.cc:1786
-msgid "After splitting selected regions, select"
+#: rc_option_editor.cc:2354
+msgid "Show waveforms in regions"
 msgstr ""
 
-#: rc_option_editor.cc:1791
-msgid "no regions"
+#: rc_option_editor.cc:2363
+msgid "Show waveforms for audio while it is being recorded"
 msgstr ""
 
-#: rc_option_editor.cc:1794
-msgid "newly-created regions"
+#: rc_option_editor.cc:2370
+msgid "Waveform scale"
 msgstr ""
 
-#: rc_option_editor.cc:1798
-msgid "existing selection and newly-created regions"
+#: rc_option_editor.cc:2375
+msgid "linear"
+msgstr ""
+
+#: rc_option_editor.cc:2376
+msgid "logarithmic"
+msgstr ""
+
+#: rc_option_editor.cc:2382
+msgid "Waveform shape"
+msgstr ""
+
+#: rc_option_editor.cc:2387
+msgid "traditional"
+msgstr ""
+
+#: rc_option_editor.cc:2388
+msgid "rectified"
 msgstr ""
 
-#: rc_option_editor.cc:1805
+#: rc_option_editor.cc:2397
 msgid "Buffering"
 msgstr ""
 
-#: rc_option_editor.cc:1813
+#: rc_option_editor.cc:2405
 msgid "Record monitoring handled by"
 msgstr ""
 
-#: rc_option_editor.cc:1819
+#: rc_option_editor.cc:2411
 msgid "via Audio Driver"
 msgstr ""
 
-#: rc_option_editor.cc:1825
+#: rc_option_editor.cc:2417
 msgid "audio hardware"
 msgstr ""
 
-#: rc_option_editor.cc:1832
+#: rc_option_editor.cc:2424
 msgid "Tape machine mode"
 msgstr ""
 
-#: rc_option_editor.cc:1837
+#: rc_option_editor.cc:2429
 msgid "Connection of tracks and busses"
 msgstr ""
 
-#: rc_option_editor.cc:1842
+#: rc_option_editor.cc:2435
 msgid "Auto-connect master/monitor busses"
 msgstr ""
 
-#: rc_option_editor.cc:1849
+#: rc_option_editor.cc:2442
 msgid "Connect track inputs"
 msgstr ""
 
-#: rc_option_editor.cc:1854
+#: rc_option_editor.cc:2447
 msgid "automatically to physical inputs"
 msgstr ""
 
-#: rc_option_editor.cc:1855 rc_option_editor.cc:1868
+#: rc_option_editor.cc:2448 rc_option_editor.cc:2461
 msgid "manually"
 msgstr ""
 
-#: rc_option_editor.cc:1861
+#: rc_option_editor.cc:2454
 msgid "Connect track and bus outputs"
 msgstr ""
 
-#: rc_option_editor.cc:1866
+#: rc_option_editor.cc:2459
 msgid "automatically to physical outputs"
 msgstr ""
 
-#: rc_option_editor.cc:1867
+#: rc_option_editor.cc:2460
 msgid "automatically to master bus"
 msgstr ""
 
-#: rc_option_editor.cc:1872
+#: rc_option_editor.cc:2467
+msgid "Use 'Strict-I/O' for new tracks or Busses"
+msgstr ""
+
+#: rc_option_editor.cc:2478
 msgid "Denormals"
 msgstr ""
 
-#: rc_option_editor.cc:1877
+#: rc_option_editor.cc:2483
 msgid "Use DC bias to protect against denormals"
 msgstr ""
 
-#: rc_option_editor.cc:1884
+#: rc_option_editor.cc:2490
 msgid "Processor handling"
 msgstr ""
 
-#: rc_option_editor.cc:1890
+#: rc_option_editor.cc:2496
 msgid "no processor handling"
 msgstr ""
 
-#: rc_option_editor.cc:1896
+#: rc_option_editor.cc:2502
 msgid "use FlushToZero"
 msgstr ""
 
-#: rc_option_editor.cc:1903
+#: rc_option_editor.cc:2509
 msgid "use DenormalsAreZero"
 msgstr ""
 
-#: rc_option_editor.cc:1910
+#: rc_option_editor.cc:2516
 msgid "use FlushToZero and DenormalsAreZero"
 msgstr ""
 
-#: rc_option_editor.cc:1926
-msgid "Silence plugins when the transport is stopped"
+#: rc_option_editor.cc:2532
+msgid "Enable automatic analysis of audio"
 msgstr ""
 
-#: rc_option_editor.cc:1934
-msgid "Make new plugins active"
+#: rc_option_editor.cc:2540
+msgid "Replicate missing region channels"
 msgstr ""
 
-#: rc_option_editor.cc:1944
-msgid "Enable automatic analysis of audio"
+#: rc_option_editor.cc:2547 rc_option_editor.cc:2556 rc_option_editor.cc:2558
+#: rc_option_editor.cc:2566 rc_option_editor.cc:2574 rc_option_editor.cc:2582
+#: rc_option_editor.cc:2600 rc_option_editor.cc:2612 rc_option_editor.cc:2624
+#: rc_option_editor.cc:2626 rc_option_editor.cc:2628 rc_option_editor.cc:2636
+#: rc_option_editor.cc:2644 rc_option_editor.cc:2652 rc_option_editor.cc:2662
+#: rc_option_editor.cc:2663
+msgid "Solo & mute"
 msgstr ""
 
-#: rc_option_editor.cc:1952
-msgid "Replicate missing region channels"
+#: rc_option_editor.cc:2551
+msgid "Solo controls are Listen controls"
 msgstr ""
 
-#: rc_option_editor.cc:1959 rc_option_editor.cc:1961 rc_option_editor.cc:1976
-#: rc_option_editor.cc:1988 rc_option_editor.cc:2000 rc_option_editor.cc:2012
-#: rc_option_editor.cc:2016 rc_option_editor.cc:2024 rc_option_editor.cc:2032
-#: rc_option_editor.cc:2040 rc_option_editor.cc:2042 rc_option_editor.cc:2050
-#: rc_option_editor.cc:2058 rc_option_editor.cc:2066 rc_option_editor.cc:2074
-#: rc_option_editor.cc:2076
-msgid "Solo / mute"
+#: rc_option_editor.cc:2561
+msgid "Exclusive solo"
 msgstr ""
 
-#: rc_option_editor.cc:1964
-msgid "Solo-in-place mute cut (dB)"
+#: rc_option_editor.cc:2569
+msgid "Show solo muting"
 msgstr ""
 
-#: rc_option_editor.cc:1971
-msgid "Solo controls are Listen controls"
+#: rc_option_editor.cc:2577
+msgid "Soloing overrides muting"
+msgstr ""
+
+#: rc_option_editor.cc:2585
+msgid "Solo-in-place mute cut (dB)"
 msgstr ""
 
-#: rc_option_editor.cc:1980
+#: rc_option_editor.cc:2592
 msgid "Listen Position"
 msgstr ""
 
-#: rc_option_editor.cc:1985
+#: rc_option_editor.cc:2597
 msgid "after-fader (AFL)"
 msgstr ""
 
-#: rc_option_editor.cc:1986
+#: rc_option_editor.cc:2598
 msgid "pre-fader (PFL)"
 msgstr ""
 
-#: rc_option_editor.cc:1992
+#: rc_option_editor.cc:2604
 msgid "PFL signals come from"
 msgstr ""
 
-#: rc_option_editor.cc:1997
+#: rc_option_editor.cc:2609
 msgid "before pre-fader processors"
 msgstr ""
 
-#: rc_option_editor.cc:1998
+#: rc_option_editor.cc:2610
 msgid "pre-fader but after pre-fader processors"
 msgstr ""
 
-#: rc_option_editor.cc:2004
+#: rc_option_editor.cc:2616
 msgid "AFL signals come from"
 msgstr ""
 
-#: rc_option_editor.cc:2009
+#: rc_option_editor.cc:2621
 msgid "immediately post-fader"
 msgstr ""
 
-#: rc_option_editor.cc:2010
+#: rc_option_editor.cc:2622
 msgid "after post-fader processors (before pan)"
 msgstr ""
 
-#: rc_option_editor.cc:2019
-msgid "Exclusive solo"
-msgstr ""
-
-#: rc_option_editor.cc:2027
-msgid "Show solo muting"
-msgstr ""
-
-#: rc_option_editor.cc:2035
-msgid "Soloing overrides muting"
-msgstr ""
-
-#: rc_option_editor.cc:2040
+#: rc_option_editor.cc:2626
 msgid "Default track / bus muting options"
 msgstr ""
 
-#: rc_option_editor.cc:2045
+#: rc_option_editor.cc:2631
 msgid "Mute affects pre-fader sends"
 msgstr ""
 
-#: rc_option_editor.cc:2053
+#: rc_option_editor.cc:2639
 msgid "Mute affects post-fader sends"
 msgstr ""
 
-#: rc_option_editor.cc:2061
+#: rc_option_editor.cc:2647
 msgid "Mute affects control outputs"
 msgstr ""
 
-#: rc_option_editor.cc:2069
+#: rc_option_editor.cc:2655
 msgid "Mute affects main outputs"
 msgstr ""
 
-#: rc_option_editor.cc:2074
+#: rc_option_editor.cc:2662
 msgid "Send Routing"
 msgstr ""
 
-#: rc_option_editor.cc:2079
-msgid "Link panners of Aux and External Sends with main panner by default"
+#: rc_option_editor.cc:2666
+msgid "Link panners of Aux and External Sends with main panner by default"
+msgstr ""
+
+#: rc_option_editor.cc:2672
+msgid "MIDI Preferences"
+msgstr ""
+
+#: rc_option_editor.cc:2677
+msgid "MIDI read-ahead time (seconds)"
+msgstr ""
+
+#: rc_option_editor.cc:2687
+msgid "Initial program change"
+msgstr ""
+
+#: rc_option_editor.cc:2696
+msgid "Display first MIDI bank/program as 0"
+msgstr ""
+
+#: rc_option_editor.cc:2704
+msgid "Never display periodic MIDI messages (MTC, MIDI Clock)"
+msgstr ""
+
+#: rc_option_editor.cc:2712
+msgid "Sound MIDI notes as they are selected in the editor"
+msgstr ""
+
+#: rc_option_editor.cc:2720
+msgid "Send MIDI control feedback"
+msgstr ""
+
+#: rc_option_editor.cc:2725 rc_option_editor.cc:2727 rc_option_editor.cc:2735
+#: rc_option_editor.cc:2737 rc_option_editor.cc:2745 rc_option_editor.cc:2754
+#: rc_option_editor.cc:2756 rc_option_editor.cc:2764 rc_option_editor.cc:2772
+#: rc_option_editor.cc:2781
+msgid "MIDI/Sync"
+msgstr ""
+
+#: rc_option_editor.cc:2725
+msgid "MIDI Clock"
+msgstr ""
+
+#: rc_option_editor.cc:2735
+msgid "MIDI Time Code (MTC)"
+msgstr ""
+
+#: rc_option_editor.cc:2740
+msgid "Send MIDI Time Code"
+msgstr ""
+
+#: rc_option_editor.cc:2748
+msgid "Percentage either side of normal transport speed to transmit MTC"
+msgstr ""
+
+#: rc_option_editor.cc:2754
+msgid "Midi Machine Control (MMC)"
+msgstr ""
+
+#: rc_option_editor.cc:2759
+msgid "Obey MIDI Machine Control commands"
+msgstr ""
+
+#: rc_option_editor.cc:2767
+msgid "Send MIDI Machine Control commands"
+msgstr ""
+
+#: rc_option_editor.cc:2775
+msgid "Inbound MMC device ID"
+msgstr ""
+
+#: rc_option_editor.cc:2784
+msgid "Outbound MMC device ID"
+msgstr ""
+
+#: rc_option_editor.cc:2790
+msgid "Midi Audition"
+msgstr ""
+
+#: rc_option_editor.cc:2794
+msgid "Midi Audition Synth (LV2)"
+msgstr ""
+
+#: rc_option_editor.cc:2825 rc_option_editor.cc:2835 rc_option_editor.cc:2837
+msgid "User interaction"
+msgstr ""
+
+#: rc_option_editor.cc:2828
+msgid ""
+"Use translations of %1 messages\n"
+"   <i>(requires a restart of %1 to take effect)</i>\n"
+"   <i>(if available for your language preferences)</i>"
+msgstr ""
+
+#: rc_option_editor.cc:2835
+msgid "Keyboard"
+msgstr ""
+
+#: rc_option_editor.cc:2848 startup.cc:352
+msgid "Scan for Plugins"
+msgstr ""
+
+#: rc_option_editor.cc:2853
+msgid "General"
+msgstr ""
+
+#: rc_option_editor.cc:2858
+msgid "Always Display Plugin Scan Progress"
+msgstr ""
+
+#: rc_option_editor.cc:2864
+msgid ""
+"<b>When enabled</b> a popup window showing plugin scan progress is displayed "
+"for indexing (cache load) and discovery (detect new plugins)"
+msgstr ""
+
+#: rc_option_editor.cc:2869
+msgid "Silence plugins when the transport is stopped"
+msgstr ""
+
+#: rc_option_editor.cc:2875
+msgid ""
+"<b>When enabled</b> plugins will be reset at transport stop. When disabled "
+"plugins will be left unchanged at transport stop.\n"
+"\n"
+"This mostly affects plugins with a \"tail\" like Reverbs."
+msgstr ""
+
+#: rc_option_editor.cc:2879
+msgid "Make new plugins active"
+msgstr ""
+
+#: rc_option_editor.cc:2885
+msgid ""
+"<b>When enabled</b> plugins will be activated when they are added to tracks/"
+"busses. When disabled plugins will be left inactive when they are added to "
+"tracks/busses"
+msgstr ""
+
+#: rc_option_editor.cc:2888 rc_option_editor.cc:2896 rc_option_editor.cc:2908
+#: rc_option_editor.cc:2913 rc_option_editor.cc:2915 rc_option_editor.cc:2920
+#: rc_option_editor.cc:2927 rc_option_editor.cc:2932 rc_option_editor.cc:2941
+msgid "Plugins/VST"
+msgstr ""
+
+#: rc_option_editor.cc:2888
+msgid "VST"
+msgstr ""
+
+#: rc_option_editor.cc:2892
+msgid "Scan for [new] VST Plugins on Application Start"
+msgstr ""
+
+#: rc_option_editor.cc:2898
+msgid ""
+"<b>When enabled</b> new VST plugins are searched, tested and added to the "
+"cache index on application start. When disabled new plugins will only be "
+"available after triggering a 'Scan' manually"
+msgstr ""
+
+#: rc_option_editor.cc:2904
+msgid "Verbose Plugin Scan"
+msgstr ""
+
+#: rc_option_editor.cc:2910
+msgid ""
+"<b>When enabled</b> additional information for every plugin is added to the "
+"Log Window."
+msgstr ""
+
+#: rc_option_editor.cc:2918
+msgid "VST Cache:"
+msgstr ""
+
+#: rc_option_editor.cc:2923
+msgid "VST Blacklist:"
+msgstr ""
+
+#: rc_option_editor.cc:2930
+msgid "Linux VST Path:"
 msgstr ""
 
-#: rc_option_editor.cc:2087
-msgid "MIDI read-ahead time (seconds)"
+#: rc_option_editor.cc:2935 rc_option_editor.cc:2948
+msgid "Path:"
 msgstr ""
 
-#: rc_option_editor.cc:2105
-msgid "Send MIDI Time Code"
+#: rc_option_editor.cc:2944
+msgid "Windows VST Path:"
 msgstr ""
 
-#: rc_option_editor.cc:2113
-msgid "Percentage either side of normal transport speed to transmit MTC"
+#: rc_option_editor.cc:2954 rc_option_editor.cc:2966 rc_option_editor.cc:2971
+msgid "Plugins/Audio Unit"
 msgstr ""
 
-#: rc_option_editor.cc:2122
-msgid "Obey MIDI Machine Control commands"
+#: rc_option_editor.cc:2954
+msgid "Audio Unit"
 msgstr ""
 
-#: rc_option_editor.cc:2130
-msgid "Send MIDI Machine Control commands"
+#: rc_option_editor.cc:2958
+msgid "Scan for AudioUnit Plugins on Application Start"
 msgstr ""
 
-#: rc_option_editor.cc:2138
-msgid "Send MIDI control feedback"
+#: rc_option_editor.cc:2964
+msgid ""
+"<b>When enabled</b> Audio Unit Plugins are discovered on application start. "
+"When disabled AU plugins will only be available after triggering a 'Scan' "
+"manually. The first successful scan will enable AU auto-scan, Any crash "
+"during plugin discovery will disable it."
 msgstr ""
 
-#: rc_option_editor.cc:2146
-msgid "Inbound MMC device ID"
+#: rc_option_editor.cc:2969
+msgid "AU Cache:"
 msgstr ""
 
-#: rc_option_editor.cc:2155
-msgid "Outbound MMC device ID"
+#: rc_option_editor.cc:2974
+msgid "AU Blacklist:"
 msgstr ""
 
-#: rc_option_editor.cc:2164
-msgid "Initial program change"
+#: rc_option_editor.cc:2978
+msgid "Plugin GUI"
 msgstr ""
 
-#: rc_option_editor.cc:2173
-msgid "Display first MIDI bank/program as 0"
+#: rc_option_editor.cc:2982
+msgid "Automatically open the plugin GUI when adding a new plugin"
 msgstr ""
 
-#: rc_option_editor.cc:2181
-msgid "Never display periodic MIDI messages (MTC, MIDI Clock)"
+#: rc_option_editor.cc:2991
+msgid "Show Plugin Inline Display on Mixerstrip by default"
 msgstr ""
 
-#: rc_option_editor.cc:2189
-msgid "Sound MIDI notes as they are selected"
+#: rc_option_editor.cc:2998
+msgid ""
+"Don't automatically open the plugin GUI when the plugin has an inline "
+"display mode"
 msgstr ""
 
-#: rc_option_editor.cc:2194
-msgid "Midi Audition"
+#: rc_option_editor.cc:3005
+msgid "Instrument"
 msgstr ""
 
-#: rc_option_editor.cc:2198
-msgid "Midi Audition Synth (LV2)"
+#: rc_option_editor.cc:3009
+msgid "Ask to replace existing instrument plugin"
 msgstr ""
 
-#: rc_option_editor.cc:2229 rc_option_editor.cc:2239 rc_option_editor.cc:2241
-msgid "User interaction"
+#: rc_option_editor.cc:3017
+msgid "Interactively configure instrument plugins on insert"
 msgstr ""
 
-#: rc_option_editor.cc:2232
+#: rc_option_editor.cc:3023
 msgid ""
-"Use translations of %1 messages\n"
-"   <i>(requires a restart of %1 to take effect)</i>\n"
-"   <i>(if available for your language preferences)</i>"
+"<b>When enabled</b> show a dialog to select instrument channel configuration "
+"before adding a multichannel plugin."
 msgstr ""
 
-#: rc_option_editor.cc:2239
-msgid "Keyboard"
+#: rc_option_editor.cc:3032
+msgid "Disable Graphics Hardware Acceleration (requires restart)"
+msgstr ""
+
+#: rc_option_editor.cc:3038
+msgid ""
+"Render large parts of the application user-interface in software, instead of "
+"using 2D-graphics acceleration.\n"
+"This requires restarting %1 before having an effect"
 msgstr ""
 
-#: rc_option_editor.cc:2249
-msgid "Control surface remote ID"
+#: rc_option_editor.cc:3039 rc_option_editor.cc:3051 rc_option_editor.cc:3054
+#: rc_option_editor.cc:3062 rc_option_editor.cc:3070 rc_option_editor.cc:3078
+#: rc_option_editor.cc:3086 rc_option_editor.cc:3097 rc_option_editor.cc:3113
+#: rc_option_editor.cc:3129 rc_option_editor.cc:3144 rc_option_editor.cc:3153
+#: rc_option_editor.cc:3161
+msgid "Preferences|GUI"
 msgstr ""
 
-#: rc_option_editor.cc:2254
-msgid "assigned by user"
+#: rc_option_editor.cc:3045
+msgid "Possibly improve slow graphical performance (requires restart)"
 msgstr ""
 
-#: rc_option_editor.cc:2255
-msgid "follows order of mixer"
+#: rc_option_editor.cc:3050
+msgid ""
+"Disables hardware gradient rendering on buggy video drivers (\"buggy "
+"gradients patch\").\n"
+"This requires restarting %1 before having an effect"
 msgstr ""
 
-#: rc_option_editor.cc:2269 rc_option_editor.cc:2278 rc_option_editor.cc:2287
-#: rc_option_editor.cc:2297 rc_option_editor.cc:2321 rc_option_editor.cc:2334
-#: rc_option_editor.cc:2343
-msgid "Preferences|GUI"
+#: rc_option_editor.cc:3057
+msgid "Use Window Manager/Desktop visibility information"
 msgstr ""
 
-#: rc_option_editor.cc:2272
+#: rc_option_editor.cc:3065
 msgid "Graphically indicate mouse pointer hovering over various widgets"
 msgstr ""
 
-#: rc_option_editor.cc:2281
+#: rc_option_editor.cc:3073
 msgid "Show tooltips if mouse hovers over a control"
 msgstr ""
 
-#: rc_option_editor.cc:2290
+#: rc_option_editor.cc:3081
 msgid "Use name highlight bars in region displays (requires a restart)"
 msgstr ""
 
-#: rc_option_editor.cc:2303
-msgid "update transport clock display at FPS instead of every 100ms"
+#: rc_option_editor.cc:3089
+msgid "Update transport clock display at FPS instead of every 100ms"
 msgstr ""
 
-#: rc_option_editor.cc:2312
+#: rc_option_editor.cc:3104
+msgid "Waveform image cache size (megabytes)"
+msgstr ""
+
+#: rc_option_editor.cc:3112
+msgid ""
+"Increasing the cache size uses more memory to store waveform images, which "
+"can improve graphical performance."
+msgstr ""
+
+#: rc_option_editor.cc:3120
 msgid "Lock timeout (seconds)"
 msgstr ""
 
-#: rc_option_editor.cc:2320
+#: rc_option_editor.cc:3128
 msgid "Lock GUI after this many idle seconds (zero to never lock)"
 msgstr ""
 
-#: rc_option_editor.cc:2336
+#: rc_option_editor.cc:3146
 msgid "Mixer Strip"
 msgstr ""
 
-#: rc_option_editor.cc:2346
+#: rc_option_editor.cc:3156
 msgid "Use narrow strips in the mixer by default"
 msgstr ""
 
-#: rc_option_editor.cc:2351 rc_option_editor.cc:2365 rc_option_editor.cc:2384
-#: rc_option_editor.cc:2400 rc_option_editor.cc:2416 rc_option_editor.cc:2430
-#: rc_option_editor.cc:2444 rc_option_editor.cc:2446
+#: rc_option_editor.cc:3163
+msgid "Action Script Button Visibility"
+msgstr ""
+
+#: rc_option_editor.cc:3169 rc_option_editor.cc:3183 rc_option_editor.cc:3200
+#: rc_option_editor.cc:3216 rc_option_editor.cc:3232 rc_option_editor.cc:3246
+#: rc_option_editor.cc:3272 rc_option_editor.cc:3290 rc_option_editor.cc:3301
+#: rc_option_editor.cc:3308 rc_option_editor.cc:3310 rc_option_editor.cc:3318
+#: rc_option_editor.cc:3320 rc_option_editor.cc:3328 rc_option_editor.cc:3336
+#: rc_option_editor.cc:3338
 msgid "Preferences|Metering"
 msgstr ""
 
-#: rc_option_editor.cc:2355
+#: rc_option_editor.cc:3173
 msgid "Peak hold time"
 msgstr ""
 
-#: rc_option_editor.cc:2361
+#: rc_option_editor.cc:3179
 msgid "short"
 msgstr ""
 
-#: rc_option_editor.cc:2362
+#: rc_option_editor.cc:3180
 msgid "medium"
 msgstr ""
 
-#: rc_option_editor.cc:2363
+#: rc_option_editor.cc:3181
 msgid "long"
 msgstr ""
 
-#: rc_option_editor.cc:2369
+#: rc_option_editor.cc:3187
 msgid "DPM fall-off"
 msgstr ""
 
-#: rc_option_editor.cc:2375
+#: rc_option_editor.cc:3193
 msgid "slowest [6.6dB/sec]"
 msgstr ""
 
-#: rc_option_editor.cc:2376
+#: rc_option_editor.cc:3194
 msgid "slow [8.6dB/sec] (BBC PPM, EBU PPM)"
 msgstr ""
 
-#: rc_option_editor.cc:2377
-msgid "slowish [12.0dB/sec] (DIN)"
+#: rc_option_editor.cc:3195
+msgid "moderate [12.0dB/sec] (DIN)"
 msgstr ""
 
-#: rc_option_editor.cc:2378
-msgid "moderate [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"
+#: rc_option_editor.cc:3196
+msgid "medium [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"
 msgstr ""
 
-#: rc_option_editor.cc:2379
-msgid "medium [20dB/sec]"
+#: rc_option_editor.cc:3197
+msgid "fast [20dB/sec]"
 msgstr ""
 
-#: rc_option_editor.cc:2380
-msgid "fast [32dB/sec]"
+#: rc_option_editor.cc:3198
+msgid "very fast [32dB/sec]"
 msgstr ""
 
-#: rc_option_editor.cc:2381
-msgid "faster [46dB/sec]"
-msgstr ""
-
-#: rc_option_editor.cc:2382
-msgid "fastest [70dB/sec]"
-msgstr ""
-
-#: rc_option_editor.cc:2388
+#: rc_option_editor.cc:3204
 msgid "Meter line-up level; 0dBu"
 msgstr ""
 
-#: rc_option_editor.cc:2393 rc_option_editor.cc:2409
+#: rc_option_editor.cc:3209 rc_option_editor.cc:3225
 msgid "-24dBFS (SMPTE US: 4dBu = -20dBFS)"
 msgstr ""
 
-#: rc_option_editor.cc:2394 rc_option_editor.cc:2410
+#: rc_option_editor.cc:3210 rc_option_editor.cc:3226
 msgid "-20dBFS (SMPTE RP.0155)"
 msgstr ""
 
-#: rc_option_editor.cc:2395 rc_option_editor.cc:2411
+#: rc_option_editor.cc:3211 rc_option_editor.cc:3227
 msgid "-18dBFS (EBU, BBC)"
 msgstr ""
 
-#: rc_option_editor.cc:2396 rc_option_editor.cc:2412
+#: rc_option_editor.cc:3212 rc_option_editor.cc:3228
 msgid "-15dBFS (DIN)"
 msgstr ""
 
-#: rc_option_editor.cc:2398
+#: rc_option_editor.cc:3214
 msgid ""
 "Configure meter-marks and color-knee point for dBFS scale DPM, set reference "
 "level for IEC1/Nordic, IEC2 PPM and VU meter."
@@ -9617,105 +11584,149 @@ msgstr ""
 "Configure meter-marks and colour-knee point for dBFS scale DPM, set "
 "reference level for IEC1/Nordic, IEC2 PPM and VU meter."
 
-#: rc_option_editor.cc:2404
+#: rc_option_editor.cc:3220
 msgid "IEC1/DIN Meter line-up level; 0dBu"
 msgstr ""
 
-#: rc_option_editor.cc:2414
+#: rc_option_editor.cc:3230
 msgid "Reference level for IEC1/DIN meter."
 msgstr ""
 
-#: rc_option_editor.cc:2420
+#: rc_option_editor.cc:3236
 msgid "VU Meter standard"
 msgstr ""
 
-#: rc_option_editor.cc:2425
+#: rc_option_editor.cc:3241
 msgid "0VU = -2dBu (France)"
 msgstr ""
 
-#: rc_option_editor.cc:2426
+#: rc_option_editor.cc:3242
 msgid "0VU = 0dBu (North America, Australia)"
 msgstr ""
 
-#: rc_option_editor.cc:2427
+#: rc_option_editor.cc:3243
 msgid "0VU = +4dBu (standard)"
 msgstr ""
 
-#: rc_option_editor.cc:2428
+#: rc_option_editor.cc:3244
 msgid "0VU = +8dBu"
 msgstr ""
 
-#: rc_option_editor.cc:2434
+#: rc_option_editor.cc:3250
 msgid "Peak threshold [dBFS]"
 msgstr ""
 
-#: rc_option_editor.cc:2442
+#: rc_option_editor.cc:3259
+msgid "Default Meter Type for Master Bus"
+msgstr ""
+
+#: rc_option_editor.cc:3277
+msgid "Default Meter Type for Busses"
+msgstr ""
+
+#: rc_option_editor.cc:3294
+msgid "Default Meter Type for Tracks"
+msgstr ""
+
+#: rc_option_editor.cc:3306
 msgid ""
 "Specify the audio signal level in dbFS at and above which the meter-peak "
 "indicator will flash red."
 msgstr ""
 
-#: rc_option_editor.cc:2449
+#: rc_option_editor.cc:3313
 msgid "LED meter style"
 msgstr ""
 
-#: rc_option_editor.cc:2457
+#: rc_option_editor.cc:3318
+msgid "Editor Meters"
+msgstr ""
+
+#: rc_option_editor.cc:3323
+msgid "Show meters on tracks in the editor"
+msgstr ""
+
+#: rc_option_editor.cc:3331
+msgid "Show at most stereo meters in the track-header"
+msgstr ""
+
+#: rc_option_editor.cc:3336
+msgid "Post Export Analysis"
+msgstr ""
+
+#: rc_option_editor.cc:3341
+msgid "Save loudness analysis as image file"
+msgstr ""
+
+#: rc_option_editor.cc:3349
 msgid "Theme"
 msgstr ""
 
-#: region_editor.cc:79
+#: rc_option_editor.cc:3351
+msgid "Theme/Colors"
+msgstr "Theme/Colours"
+
+#: rc_option_editor.cc:3429
+msgid "Set Linux VST Search Path"
+msgstr ""
+
+#: rc_option_editor.cc:3443
+msgid "Set Windows VST Search Path"
+msgstr ""
+
+#: region_editor.cc:81
 msgid "audition this region"
 msgstr ""
 
-#: region_editor.cc:88 region_layering_order_editor.cc:75
+#: region_editor.cc:90 region_layering_order_editor.cc:75
 msgid "Position:"
 msgstr ""
 
-#: region_editor.cc:90 add_video_dialog.cc:155
+#: region_editor.cc:92 add_video_dialog.cc:155
 msgid "End:"
 msgstr ""
 
-#: region_editor.cc:92 sfdb_ui.cc:145
+#: region_editor.cc:94 sfdb_ui.cc:145
 msgid "Length:"
 msgstr ""
 
-#: region_editor.cc:94
+#: region_editor.cc:96
 msgid "Sync point (relative to region):"
 msgstr ""
 
-#: region_editor.cc:96
+#: region_editor.cc:98
 msgid "Sync point (absolute):"
 msgstr ""
 
-#: region_editor.cc:98
+#: region_editor.cc:100
 msgid "File start:"
 msgstr ""
 
-#: region_editor.cc:102
+#: region_editor.cc:104
 msgid "Sources:"
 msgstr ""
 
-#: region_editor.cc:104
+#: region_editor.cc:106
 msgid "Source:"
 msgstr ""
 
-#: region_editor.cc:166
+#: region_editor.cc:168
 msgid "Region '%1'"
 msgstr ""
 
-#: region_editor.cc:273
+#: region_editor.cc:279
 msgid "change region start position"
 msgstr ""
 
-#: region_editor.cc:289
+#: region_editor.cc:299
 msgid "change region end position"
 msgstr ""
 
-#: region_editor.cc:309
+#: region_editor.cc:322
 msgid "change region length"
 msgstr ""
 
-#: region_editor.cc:403 region_editor.cc:415
+#: region_editor.cc:416 region_editor.cc:428
 msgid "change region sync point"
 msgstr ""
 
@@ -9735,33 +11746,33 @@ msgstr ""
 msgid "Choose Top Region"
 msgstr ""
 
-#: region_view.cc:277
+#: region_view.cc:271
 msgid "SilenceText"
 msgstr ""
 
-#: region_view.cc:292 region_view.cc:311
+#: region_view.cc:286 region_view.cc:305
 msgid "minutes"
 msgstr ""
 
-#: region_view.cc:295 region_view.cc:314
+#: region_view.cc:289 region_view.cc:308
 msgid "msecs"
 msgstr ""
 
-#: region_view.cc:298 region_view.cc:317
+#: region_view.cc:292 region_view.cc:311
 msgid "secs"
 msgstr ""
 
-#: region_view.cc:301
+#: region_view.cc:295
 msgid "%1 silent segment"
 msgid_plural "%1 silent segments"
 msgstr[0] ""
 msgstr[1] ""
 
-#: region_view.cc:303
+#: region_view.cc:297
 msgid "shortest = %1 %2"
 msgstr ""
 
-#: region_view.cc:320
+#: region_view.cc:314
 msgid ""
 "\n"
 "  (shortest audible segment = %1 %2)"
@@ -9807,55 +11818,63 @@ msgstr ""
 msgid "Modified Kullback-Liebler"
 msgstr ""
 
-#: rhythm_ferret.cc:65
+#: rhythm_ferret.cc:62
+msgid "Spectral Flux"
+msgstr ""
+
+#: rhythm_ferret.cc:68
 msgid "Split region"
 msgstr ""
 
-#: rhythm_ferret.cc:66
+#: rhythm_ferret.cc:70
 msgid "Snap regions"
 msgstr ""
 
-#: rhythm_ferret.cc:67
+#: rhythm_ferret.cc:71
 msgid "Conform regions"
 msgstr ""
 
-#: rhythm_ferret.cc:72
+#: rhythm_ferret.cc:77
 msgid "Rhythm Ferret"
 msgstr ""
 
-#: rhythm_ferret.cc:78
+#: rhythm_ferret.cc:83
 msgid "Analyze"
 msgstr "Analyse"
 
-#: rhythm_ferret.cc:113
+#: rhythm_ferret.cc:122
 msgid "Detection function"
 msgstr ""
 
-#: rhythm_ferret.cc:117
-msgid "Trigger gap"
-msgstr ""
-
-#: rhythm_ferret.cc:122 strip_silence_dialog.cc:64
-msgid "Threshold"
+#: rhythm_ferret.cc:126
+msgid "Trigger gap (postproc)"
 msgstr ""
 
-#: rhythm_ferret.cc:127
+#: rhythm_ferret.cc:131
 msgid "Peak threshold"
 msgstr ""
 
-#: rhythm_ferret.cc:132
+#: rhythm_ferret.cc:135
 msgid "Silence threshold"
 msgstr ""
 
-#: rhythm_ferret.cc:137
+#: rhythm_ferret.cc:141
+msgid "Min Inter-Onset Time"
+msgstr ""
+
+#: rhythm_ferret.cc:148
 msgid "Sensitivity"
 msgstr ""
 
-#: rhythm_ferret.cc:141
+#: rhythm_ferret.cc:152
+msgid "Cut Pos Threshold"
+msgstr ""
+
+#: rhythm_ferret.cc:157
 msgid "Operation"
 msgstr ""
 
-#: rhythm_ferret.cc:355
+#: rhythm_ferret.cc:382
 msgid "split regions (rhythm ferret)"
 msgstr ""
 
@@ -9879,19 +11898,15 @@ msgstr ""
 msgid "Active state"
 msgstr ""
 
-#: route_group_dialog.cc:53 route_group_dialog.cc:82 theme_manager.cc:90
-msgid "Color"
-msgstr "Colour"
-
-#: route_group_dialog.cc:59
+#: route_group_dialog.cc:58
 msgid "RouteGroupDialog"
 msgstr ""
 
-#: route_group_dialog.cc:100
+#: route_group_dialog.cc:99
 msgid "<b>Sharing</b>"
 msgstr ""
 
-#: route_group_dialog.cc:200
+#: route_group_dialog.cc:192
 msgid "The group name is not unique. Please use a different name."
 msgstr ""
 
@@ -9911,404 +11926,389 @@ msgstr ""
 msgid "Plugins, Inserts & Sends"
 msgstr ""
 
-#: route_params_ui.cc:209
+#: route_params_ui.cc:201
 msgid "route display list item for renamed route not found!"
 msgstr ""
 
-#: route_params_ui.cc:279 route_params_ui.cc:307
+#: route_params_ui.cc:271 route_params_ui.cc:299
 #, c-format
 msgid "Playback delay: %<PRId64> samples"
 msgstr ""
 
-#: route_params_ui.cc:499
+#: route_params_ui.cc:491
 msgid "NO TRACK"
 msgstr ""
 
-#: route_params_ui.cc:637 route_params_ui.cc:638
+#: route_params_ui.cc:515
+msgid "Add Track or Bus"
+msgstr ""
+
+#: route_params_ui.cc:627 route_params_ui.cc:628
 msgid "No Track or Bus Selected"
 msgstr ""
 
-#: route_time_axis.cc:181
+#: route_time_axis.cc:104
+msgid "RTAV|G"
+msgstr ""
+
+#: route_time_axis.cc:105
+msgid "RTAV|P"
+msgstr ""
+
+#: route_time_axis.cc:106
+msgid "RTAV|A"
+msgstr ""
+
+#: route_time_axis.cc:194
 msgid "Record (Right-click for Step Edit)"
 msgstr ""
 
-#: route_time_axis.cc:184
+#: route_time_axis.cc:197
 msgid "Record"
 msgstr ""
 
-#: route_time_axis.cc:254
+#: route_time_axis.cc:265
 msgid "Route Group"
 msgstr ""
 
-#: route_time_axis.cc:264
+#: route_time_axis.cc:275
 msgid "MIDI Controllers and Automation"
 msgstr ""
 
-#: route_time_axis.cc:495
+#: route_time_axis.cc:510
 msgid "Show All Automation"
 msgstr ""
 
-#: route_time_axis.cc:498
+#: route_time_axis.cc:513
 msgid "Show Existing Automation"
 msgstr ""
 
-#: route_time_axis.cc:501
+#: route_time_axis.cc:516
 msgid "Hide All Automation"
 msgstr ""
 
-#: route_time_axis.cc:510
+#: route_time_axis.cc:525
 msgid "Processor automation"
 msgstr ""
 
-#: route_time_axis.cc:517
+#: route_time_axis.cc:532
 msgid "Fader"
 msgstr ""
 
-#: route_time_axis.cc:535
+#: route_time_axis.cc:559
 msgid "Pan"
 msgstr ""
 
-#: route_time_axis.cc:626
+#: route_time_axis.cc:643
 msgid "Overlaid"
 msgstr ""
 
-#: route_time_axis.cc:632
+#: route_time_axis.cc:649
 msgid "Stacked"
 msgstr ""
 
-#: route_time_axis.cc:640
+#: route_time_axis.cc:657
 msgid "Layers"
 msgstr ""
 
-#: route_time_axis.cc:709
+#: route_time_axis.cc:721
 msgid "Automatic (based on I/O connections)"
 msgstr ""
 
-#: route_time_axis.cc:718
+#: route_time_axis.cc:730
 msgid "(Currently: Existing Material)"
 msgstr ""
 
-#: route_time_axis.cc:721
+#: route_time_axis.cc:733
 msgid "(Currently: Capture Time)"
 msgstr ""
 
-#: route_time_axis.cc:729
+#: route_time_axis.cc:741
 msgid "Align With Existing Material"
 msgstr ""
 
-#: route_time_axis.cc:734
+#: route_time_axis.cc:746
 msgid "Align With Capture Time"
 msgstr ""
 
-#: route_time_axis.cc:739
+#: route_time_axis.cc:751
 msgid "Alignment"
 msgstr ""
 
-#: route_time_axis.cc:774
+#: route_time_axis.cc:786
 msgid "Normal Mode"
 msgstr ""
 
-#: route_time_axis.cc:780
+#: route_time_axis.cc:792
 msgid "Tape Mode"
 msgstr ""
 
-#: route_time_axis.cc:786
+#: route_time_axis.cc:798
 msgid "Non-Layered Mode"
 msgstr ""
 
-#: route_time_axis.cc:792
+#: route_time_axis.cc:804
 msgid "Record Mode"
 msgstr ""
 
-#: route_time_axis.cc:799 route_time_axis.cc:1789
+#: route_time_axis.cc:809 route_time_axis.cc:1795
 msgid "Playlist"
 msgstr ""
 
-#: route_time_axis.cc:1097
+#: route_time_axis.cc:1107
 msgid "Rename Playlist"
 msgstr ""
 
-#: route_time_axis.cc:1098
+#: route_time_axis.cc:1108
 msgid "New name for playlist:"
 msgstr ""
 
-#: route_time_axis.cc:1183
+#: route_time_axis.cc:1193
 msgid "New Copy Playlist"
 msgstr ""
 
-#: route_time_axis.cc:1184 route_time_axis.cc:1237
+#: route_time_axis.cc:1194 route_time_axis.cc:1247
 msgid "Name for new playlist:"
 msgstr ""
 
-#: route_time_axis.cc:1236
+#: route_time_axis.cc:1246
 msgid "New Playlist"
 msgstr ""
 
-#: route_time_axis.cc:1436
-msgid "You cannot create a track with that name as it is reserved for %1"
+#: route_time_axis.cc:1441
+msgid "The name \"%1\" is reserved for %2"
 msgstr ""
 
-#: route_time_axis.cc:1678
+#: route_time_axis.cc:1684
 msgid "New Copy..."
 msgstr ""
 
-#: route_time_axis.cc:1682
+#: route_time_axis.cc:1688
 msgid "New Take"
 msgstr ""
 
-#: route_time_axis.cc:1683
+#: route_time_axis.cc:1689
 msgid "Copy Take"
 msgstr ""
 
-#: route_time_axis.cc:1688
+#: route_time_axis.cc:1694
 msgid "Clear Current"
 msgstr ""
 
-#: route_time_axis.cc:1691
-msgid "Select From All..."
+#: route_time_axis.cc:1697
+msgid "Select from All..."
 msgstr ""
 
-#: route_time_axis.cc:1779
+#: route_time_axis.cc:1785
 msgid "Take: %1.%2"
 msgstr ""
 
-#: route_time_axis.cc:2169 selection.cc:1007 selection.cc:1061
+#: route_time_axis.cc:2190 selection.cc:1042 selection.cc:1096
 msgid "programming error: "
 msgstr ""
 
-#: route_time_axis.cc:2585
+#: route_time_axis.cc:2614
 msgid "Underlays"
 msgstr ""
 
-#: route_time_axis.cc:2588
+#: route_time_axis.cc:2617
 msgid "Remove \"%1\""
 msgstr ""
 
-#: route_time_axis.cc:2638 route_time_axis.cc:2675
+#: route_time_axis.cc:2667 route_time_axis.cc:2704
 msgid "programming error: underlay reference pointer pairs are inconsistent!"
 msgstr ""
 
-#: route_time_axis.cc:2702
+#: route_time_axis.cc:2731 vca_master_strip.cc:203 vca_time_axis.cc:228
 msgid "After-fade listen (AFL)"
 msgstr ""
 
-#: route_time_axis.cc:2706
+#: route_time_axis.cc:2735 vca_master_strip.cc:207 vca_time_axis.cc:232
 msgid "Pre-fade listen (PFL)"
 msgstr ""
 
-#: route_ui.cc:142
+#: route_ui.cc:165
 msgid "Mute this track"
 msgstr ""
 
-#: route_ui.cc:146
+#: route_ui.cc:169
 msgid "Mute other (non-soloed) tracks"
 msgstr ""
 
-#: route_ui.cc:152
+#: route_ui.cc:175
 msgid "Enable recording on this track"
 msgstr ""
 
-#: route_ui.cc:160
+#: route_ui.cc:183
 msgid "make mixer strips show sends to this bus"
 msgstr ""
 
-#: route_ui.cc:165
+#: route_ui.cc:188
 msgid "Monitor input"
 msgstr ""
 
-#: route_ui.cc:171
+#: route_ui.cc:194
 msgid "Monitor playback"
 msgstr ""
 
-#: route_ui.cc:678
+#: route_ui.cc:706
 msgid "Not connected to AudioEngine - cannot engage record"
 msgstr ""
 
-#: route_ui.cc:877
+#: route_ui.cc:883
+msgid "Rec-Safe"
+msgstr ""
+
+#: route_ui.cc:888
 msgid "Step Entry"
 msgstr ""
 
-#: route_ui.cc:950
+#: route_ui.cc:987
 msgid "Assign all tracks (prefader)"
 msgstr ""
 
-#: route_ui.cc:954
+#: route_ui.cc:991
 msgid "Assign all tracks and buses (prefader)"
 msgstr ""
 
-#: route_ui.cc:958
+#: route_ui.cc:995
 msgid "Assign all tracks (postfader)"
 msgstr ""
 
-#: route_ui.cc:962
+#: route_ui.cc:999
 msgid "Assign all tracks and buses (postfader)"
 msgstr ""
 
-#: route_ui.cc:966
+#: route_ui.cc:1003
 msgid "Assign selected tracks (prefader)"
 msgstr ""
 
-#: route_ui.cc:970
+#: route_ui.cc:1007
 msgid "Assign selected tracks and buses (prefader)"
 msgstr ""
 
-#: route_ui.cc:973
+#: route_ui.cc:1010
 msgid "Assign selected tracks (postfader)"
 msgstr ""
 
-#: route_ui.cc:977
+#: route_ui.cc:1014
 msgid "Assign selected tracks and buses (postfader)"
 msgstr ""
 
-#: route_ui.cc:980
+#: route_ui.cc:1017
 msgid "Copy track/bus gains to sends"
 msgstr ""
 
-#: route_ui.cc:981
+#: route_ui.cc:1018
 msgid "Set sends gain to -inf"
 msgstr ""
 
-#: route_ui.cc:982
+#: route_ui.cc:1019
 msgid "Set sends gain to 0dB"
 msgstr ""
 
-#: route_ui.cc:1302
+#: route_ui.cc:1357
 msgid "Solo Isolate"
 msgstr ""
 
-#: route_ui.cc:1309
+#: route_ui.cc:1364
 msgid "Solo Safe"
 msgstr ""
 
-#: route_ui.cc:1331
+#: route_ui.cc:1386
 msgid "Pre Fader Sends"
 msgstr ""
 
-#: route_ui.cc:1337
+#: route_ui.cc:1392
 msgid "Post Fader Sends"
 msgstr ""
 
-#: route_ui.cc:1343
+#: route_ui.cc:1398
 msgid "Control Outs"
 msgstr ""
 
-#: route_ui.cc:1349
+#: route_ui.cc:1404
 msgid "Main Outs"
 msgstr ""
 
-#: route_ui.cc:1481
+#: route_ui.cc:1571
 msgid "Color Selection"
 msgstr "Colour Selection"
 
-#: route_ui.cc:1566
-msgid ""
-"Do you really want to remove track \"%1\" ?\n"
-"\n"
-"You may also lose the playlist used by this track.\n"
-"\n"
-"(This action cannot be undone, and the session file will be overwritten)"
-msgstr ""
-
-#: route_ui.cc:1568
-msgid ""
-"Do you really want to remove bus \"%1\" ?\n"
-"\n"
-"(This action cannot be undone, and the session file will be overwritten)"
-msgstr ""
-
-#: route_ui.cc:1576
-msgid "Remove track"
-msgstr ""
-
-#: route_ui.cc:1578
-msgid "Remove bus"
-msgstr ""
-
-#: route_ui.cc:1606
+#: route_ui.cc:1613
 msgid ""
 "The use of colons (':') is discouraged in track and bus names.\n"
 "Do you want to use this new name?"
 msgstr ""
 
-#: route_ui.cc:1610
+#: route_ui.cc:1617
 msgid "Use the new name"
 msgstr ""
 
-#: route_ui.cc:1611
+#: route_ui.cc:1618
 msgid "Re-edit the name"
 msgstr ""
 
-#: route_ui.cc:1624
+#: route_ui.cc:1631
 msgid "Rename Track"
 msgstr ""
 
-#: route_ui.cc:1626
+#: route_ui.cc:1633
 msgid "Rename Bus"
 msgstr ""
 
-#: route_ui.cc:1694
+#: route_ui.cc:1693
 msgid ": comment editor"
 msgstr ""
 
-#: route_ui.cc:1860
+#: route_ui.cc:1848
 msgid " latency"
 msgstr ""
 
-#: route_ui.cc:1873
+#: route_ui.cc:1888
 msgid "Cannot create route template directory %1"
 msgstr ""
 
-#: route_ui.cc:1879
+#: route_ui.cc:1894
 msgid "Save As Template"
 msgstr ""
 
-#: route_ui.cc:1880
+#: route_ui.cc:1895
 msgid "Template name:"
 msgstr ""
 
-#: route_ui.cc:1961
-msgid "Remote Control ID"
+#: route_ui.cc:2019
+msgid ""
+"Left-click to invert polarity of channel %1 of this track. Right-click to "
+"show menu."
 msgstr ""
 
-#: route_ui.cc:1971
-msgid "Remote control ID:"
+#: route_ui.cc:2021
+msgid "Click to show a menu of channels to invert polarity"
 msgstr ""
 
-#: route_ui.cc:1985
-msgid ""
-"The remote control ID of %1 is: %2\n"
-"\n"
-"\n"
-"The remote control ID of %3 cannot be changed."
+#: save_as_dialog.cc:34
+msgid "Switch to newly-saved version"
 msgstr ""
 
-#: route_ui.cc:1989
-msgid "the master bus"
+#: save_as_dialog.cc:35
+msgid "Copy media to new session"
 msgstr ""
 
-#: route_ui.cc:1989
-msgid "the monitor bus"
+#: save_as_dialog.cc:36
+msgid "Copy external media into new session"
 msgstr ""
 
-#: route_ui.cc:1991
-msgid ""
-"The remote control ID of %5 is: %2\n"
-"\n"
-"\n"
-"Remote Control IDs are currently determined by track/bus ordering in %6.\n"
-"\n"
-"%3Use the User Interaction tab of the Preferences window if you want to "
-"change this%4"
+#: save_as_dialog.cc:37
+msgid "Newly-saved session should be empty"
 msgstr ""
 
-#: route_ui.cc:2048
-msgid ""
-"Left-click to invert (phase reverse) channel %1 of this track.  Right-click "
-"to show menu."
+#: save_as_dialog.cc:48
+msgid "Save as session name"
 msgstr ""
 
-#: route_ui.cc:2050
-msgid "Click to show a menu of channels for inversion (phase reverse)"
+#: save_as_dialog.cc:55
+msgid "Parent directory/folder"
 msgstr ""
 
 #: search_path_option.cc:35
@@ -10323,126 +12323,158 @@ msgstr ""
 msgid "the session folder"
 msgstr ""
 
+#: script_selector.cc:43
+msgid "<b>Type:</b>"
+msgstr ""
+
+#: script_selector.cc:49
+msgid "<b>Author:</b>"
+msgstr ""
+
+#: script_selector.cc:55
+msgid "<b>Description:</b>"
+msgstr ""
+
+#: script_selector.cc:131
+msgid "Select Script to unload"
+msgstr ""
+
+#: script_selector.cc:165
+msgid "<b>Name:</b>"
+msgstr ""
+
+#: script_selector.cc:172
+msgid "<b>Instance Parameters</b>"
+msgstr ""
+
 #: send_ui.cc:134
 msgid "Send "
 msgstr ""
 
-#: session_dialog.cc:61
+#: session_dialog.cc:71
 msgid "Session Setup"
 msgstr ""
 
-#: session_dialog.cc:66
+#: session_dialog.cc:76
 msgid "Advanced options ..."
 msgstr ""
 
-#: session_dialog.cc:263
-msgid "New Session"
+#: session_dialog.cc:163 session_dialog.cc:397
+msgid "Recent Sessions"
 msgstr ""
 
-#: session_dialog.cc:301
-msgid "Check the website for more..."
+#: session_dialog.cc:311
+msgid "Sample Rate"
 msgstr ""
 
-#: session_dialog.cc:304
-msgid "Click to open the program website in your web browser"
+#: session_dialog.cc:312
+msgid "File Resolution"
 msgstr ""
 
-#: session_dialog.cc:324
-msgid "Sample Rate"
+#: session_dialog.cc:313
+msgid "Last Modified"
+msgstr ""
+
+#: session_dialog.cc:338
+msgid "New Session"
+msgstr ""
+
+#: session_dialog.cc:379
+msgid "Check the website for more..."
 msgstr ""
 
-#: session_dialog.cc:325
-msgid "Disk Format"
+#: session_dialog.cc:382
+msgid "Click to open the program website in your web browser"
 msgstr ""
 
-#: session_dialog.cc:343
+#: session_dialog.cc:404
 msgid "Select session file"
 msgstr ""
 
-#: session_dialog.cc:358
+#: session_dialog.cc:417
 msgid "Other Sessions"
 msgstr ""
 
-#: session_dialog.cc:384
+#: session_dialog.cc:424
+msgid "Safe Mode: Disable all Plugins"
+msgstr ""
+
+#: session_dialog.cc:454
 msgid "Open"
 msgstr ""
 
-#: session_dialog.cc:451
+#: session_dialog.cc:521
 msgid "Session name:"
 msgstr ""
 
-#: session_dialog.cc:473
+#: session_dialog.cc:543
 msgid "Create session folder in:"
 msgstr ""
 
-#: session_dialog.cc:496
+#: session_dialog.cc:564
 msgid "Select folder for session"
 msgstr ""
 
-#: session_dialog.cc:525
+#: session_dialog.cc:591
 msgid "Use this template"
 msgstr ""
 
-#: session_dialog.cc:528
+#: session_dialog.cc:594
 msgid "no template"
 msgstr ""
 
-#: session_dialog.cc:663 session_dialog.cc:699
-msgid "32 bit float"
+#: session_dialog.cc:746 session_dialog.cc:793
+msgid "32-bit float"
 msgstr ""
 
-#: session_dialog.cc:666 session_dialog.cc:702
-msgid "24 bit"
+#: session_dialog.cc:749 session_dialog.cc:796
+msgid "24-bit"
 msgstr ""
 
-#: session_dialog.cc:669 session_dialog.cc:705
-msgid "16 bit"
+#: session_dialog.cc:752 session_dialog.cc:799
+msgid "16-bit"
 msgstr ""
 
-#: session_dialog.cc:747 session_dialog.cc:748 session_dialog.cc:749
+#: session_dialog.cc:877 session_dialog.cc:878 session_dialog.cc:879
 msgid "channels"
 msgstr ""
 
-#: session_dialog.cc:763
+#: session_dialog.cc:893
 msgid "<b>Busses</b>"
 msgstr ""
 
-#: session_dialog.cc:764
+#: session_dialog.cc:894
 msgid "<b>Inputs</b>"
 msgstr ""
 
-#: session_dialog.cc:765
+#: session_dialog.cc:895
 msgid "<b>Outputs</b>"
 msgstr ""
 
-#: session_dialog.cc:773
+#: session_dialog.cc:903
 msgid "Create master bus"
 msgstr ""
 
-#: session_dialog.cc:783
+#: session_dialog.cc:913
 msgid "Automatically connect to physical inputs"
 msgstr ""
 
-#: session_dialog.cc:790 session_dialog.cc:849
+#: session_dialog.cc:920 session_dialog.cc:979
 msgid "Use only"
 msgstr ""
 
-#: session_dialog.cc:843
+#: session_dialog.cc:973
 msgid "Automatically connect outputs"
 msgstr ""
 
-#: session_dialog.cc:865
+#: session_dialog.cc:995
 msgid "... to master bus"
 msgstr ""
 
-#: session_dialog.cc:875
+#: session_dialog.cc:1005
 msgid "... to physical outputs"
 msgstr ""
 
-#: session_import_dialog.cc:65
-msgid "Import from Session"
-msgstr ""
-
 #: session_import_dialog.cc:74
 msgid "Elements"
 msgstr ""
@@ -10463,197 +12495,197 @@ msgstr ""
 msgid "This will select all elements of this type!"
 msgstr ""
 
-#: session_metadata_dialog.cc:285
+#: session_metadata_dialog.cc:288
 msgid "EAN Check digit OK"
 msgstr ""
 
-#: session_metadata_dialog.cc:289
+#: session_metadata_dialog.cc:292
 msgid "EAN Check digit error"
 msgstr ""
 
-#: session_metadata_dialog.cc:289
+#: session_metadata_dialog.cc:292
 msgid "expected"
 msgstr ""
 
-#: session_metadata_dialog.cc:294
+#: session_metadata_dialog.cc:297
 msgid "EAN Length error"
 msgstr ""
 
-#: session_metadata_dialog.cc:423
+#: session_metadata_dialog.cc:426
 msgid "Field"
 msgstr ""
 
-#: session_metadata_dialog.cc:427
+#: session_metadata_dialog.cc:430
 msgid "Values (current value on top)"
 msgstr ""
 
-#: session_metadata_dialog.cc:641
+#: session_metadata_dialog.cc:644
 msgid "User"
 msgstr ""
 
-#: session_metadata_dialog.cc:649
+#: session_metadata_dialog.cc:652
 msgid "Email"
 msgstr ""
 
-#: session_metadata_dialog.cc:652
+#: session_metadata_dialog.cc:655
 msgid "Web"
 msgstr ""
 
-#: session_metadata_dialog.cc:655
+#: session_metadata_dialog.cc:658
 msgid "Organization"
 msgstr ""
 
-#: session_metadata_dialog.cc:658
+#: session_metadata_dialog.cc:661
 msgid "Country"
 msgstr ""
 
-#: session_metadata_dialog.cc:672
+#: session_metadata_dialog.cc:675
 msgid "Title"
 msgstr ""
 
-#: session_metadata_dialog.cc:675
+#: session_metadata_dialog.cc:678
 msgid "Track Number"
 msgstr ""
 
-#: session_metadata_dialog.cc:678
+#: session_metadata_dialog.cc:681
 msgid "Subtitle"
 msgstr ""
 
-#: session_metadata_dialog.cc:681
+#: session_metadata_dialog.cc:684
 msgid "Grouping"
 msgstr ""
 
-#: session_metadata_dialog.cc:684
+#: session_metadata_dialog.cc:687
 msgid "Artist"
 msgstr ""
 
-#: session_metadata_dialog.cc:687
+#: session_metadata_dialog.cc:690
 msgid "Genre"
 msgstr ""
 
-#: session_metadata_dialog.cc:690
+#: session_metadata_dialog.cc:693
 msgid "Comment"
 msgstr ""
 
-#: session_metadata_dialog.cc:693
+#: session_metadata_dialog.cc:696
 msgid "Copyright"
 msgstr ""
 
-#: session_metadata_dialog.cc:701 session_metadata_dialog.cc:706
+#: session_metadata_dialog.cc:704 session_metadata_dialog.cc:709
 msgid "Album"
 msgstr ""
 
-#: session_metadata_dialog.cc:709
+#: session_metadata_dialog.cc:712
 msgid "Year"
 msgstr ""
 
-#: session_metadata_dialog.cc:712
+#: session_metadata_dialog.cc:715
 msgid "Album Artist"
 msgstr ""
 
-#: session_metadata_dialog.cc:715
+#: session_metadata_dialog.cc:718
 msgid "Total Tracks"
 msgstr ""
 
-#: session_metadata_dialog.cc:718
+#: session_metadata_dialog.cc:721
 msgid "Disc Subtitle"
 msgstr ""
 
-#: session_metadata_dialog.cc:721
+#: session_metadata_dialog.cc:724
 msgid "Disc Number"
 msgstr ""
 
-#: session_metadata_dialog.cc:724
+#: session_metadata_dialog.cc:727
 msgid "Total Discs"
 msgstr ""
 
-#: session_metadata_dialog.cc:727
+#: session_metadata_dialog.cc:730
 msgid "Compilation"
 msgstr ""
 
-#: session_metadata_dialog.cc:730
+#: session_metadata_dialog.cc:733
 msgid "ISRC"
 msgstr ""
 
-#: session_metadata_dialog.cc:733
+#: session_metadata_dialog.cc:736
 msgid "EAN barcode"
 msgstr ""
 
-#: session_metadata_dialog.cc:746
+#: session_metadata_dialog.cc:749
 msgid "People"
 msgstr ""
 
-#: session_metadata_dialog.cc:751
+#: session_metadata_dialog.cc:754
 msgid "Lyricist"
 msgstr ""
 
-#: session_metadata_dialog.cc:754
+#: session_metadata_dialog.cc:757
 msgid "Composer"
 msgstr ""
 
-#: session_metadata_dialog.cc:757
+#: session_metadata_dialog.cc:760
 msgid "Conductor"
 msgstr ""
 
-#: session_metadata_dialog.cc:760
+#: session_metadata_dialog.cc:763
 msgid "Remixer"
 msgstr ""
 
-#: session_metadata_dialog.cc:763
+#: session_metadata_dialog.cc:766
 msgid "Arranger"
 msgstr ""
 
-#: session_metadata_dialog.cc:766
+#: session_metadata_dialog.cc:769
 msgid "Engineer"
 msgstr ""
 
-#: session_metadata_dialog.cc:769
+#: session_metadata_dialog.cc:772
 msgid "Producer"
 msgstr ""
 
-#: session_metadata_dialog.cc:772
+#: session_metadata_dialog.cc:775
 msgid "DJ Mixer"
 msgstr ""
 
-#: session_metadata_dialog.cc:775
+#: session_metadata_dialog.cc:778
 msgid "Metadata|Mixer"
 msgstr ""
 
-#: session_metadata_dialog.cc:783
+#: session_metadata_dialog.cc:786
 msgid "School"
 msgstr ""
 
-#: session_metadata_dialog.cc:788
+#: session_metadata_dialog.cc:791
 msgid "Instructor"
 msgstr ""
 
-#: session_metadata_dialog.cc:791
+#: session_metadata_dialog.cc:794
 msgid "Course"
 msgstr ""
 
-#: session_metadata_dialog.cc:799
+#: session_metadata_dialog.cc:802
 msgid "Edit Session Metadata"
 msgstr ""
 
-#: session_metadata_dialog.cc:830
+#: session_metadata_dialog.cc:833
 msgid "Import session metadata"
 msgstr ""
 
-#: session_metadata_dialog.cc:851
+#: session_metadata_dialog.cc:854
 msgid "Choose session to import metadata from"
 msgstr ""
 
-#: session_metadata_dialog.cc:889
+#: session_metadata_dialog.cc:892
 msgid "This session file could not be read!"
 msgstr ""
 
-#: session_metadata_dialog.cc:899
+#: session_metadata_dialog.cc:902
 msgid ""
 "The session file didn't contain metadata!\n"
 "Maybe this is an old session format?"
 msgstr ""
 
-#: session_metadata_dialog.cc:918
+#: session_metadata_dialog.cc:921
 msgid "Import all from:"
 msgstr ""
 
@@ -10800,209 +12832,230 @@ msgid "Destructive crossfade length"
 msgstr ""
 
 #: session_option_editor.cc:146
-msgid "Region fades active"
+msgid "Declick when transport starts and stops"
 msgstr ""
 
 #: session_option_editor.cc:153
+msgid "Declick when monitor state changes"
+msgstr ""
+
+#: session_option_editor.cc:160
+msgid "Region fades active"
+msgstr ""
+
+#: session_option_editor.cc:167
 msgid "Region fades visible"
 msgstr ""
 
-#: session_option_editor.cc:160 session_option_editor.cc:173
-#: session_option_editor.cc:187
+#: session_option_editor.cc:174 session_option_editor.cc:187
+#: session_option_editor.cc:208
 msgid "Media"
 msgstr ""
 
-#: session_option_editor.cc:160
+#: session_option_editor.cc:174
 msgid "Audio file format"
 msgstr ""
 
-#: session_option_editor.cc:164
+#: session_option_editor.cc:178
 msgid "Sample format"
 msgstr ""
 
-#: session_option_editor.cc:169
+#: session_option_editor.cc:183
 msgid "32-bit floating point"
 msgstr ""
 
-#: session_option_editor.cc:170
+#: session_option_editor.cc:184
 msgid "24-bit integer"
 msgstr ""
 
-#: session_option_editor.cc:171
+#: session_option_editor.cc:185
 msgid "16-bit integer"
 msgstr ""
 
-#: session_option_editor.cc:177
+#: session_option_editor.cc:191
 msgid "File type"
 msgstr ""
 
-#: session_option_editor.cc:182
-msgid "Broadcast WAVE"
+#: session_option_editor.cc:196
+msgid "Broadcast WAVE (4GB size limit)"
 msgstr ""
 
-#: session_option_editor.cc:183
-msgid "WAVE"
+#: session_option_editor.cc:198
+msgid "Broadcast RF64"
 msgstr ""
 
-#: session_option_editor.cc:184
+#: session_option_editor.cc:200
+msgid "WAVE (4GB size limit)"
+msgstr ""
+
+#: session_option_editor.cc:201
 msgid "WAVE-64"
 msgstr ""
 
-#: session_option_editor.cc:189
+#: session_option_editor.cc:205
+msgid "RF64 (WAV compatible)"
+msgstr ""
+
+#: session_option_editor.cc:210 session_option_editor.cc:216
+#: session_option_editor.cc:223
+msgid "Files|Locations"
+msgstr ""
+
+#: session_option_editor.cc:210
 msgid "File locations"
 msgstr ""
 
-#: session_option_editor.cc:191
+#: session_option_editor.cc:212
 msgid "Search for audio files in:"
 msgstr ""
 
-#: session_option_editor.cc:197
+#: session_option_editor.cc:218
 msgid "Search for MIDI files in:"
 msgstr ""
 
-#: session_option_editor.cc:206 session_option_editor.cc:218
-#: session_option_editor.cc:228 session_option_editor.cc:239
+#: session_option_editor.cc:227 session_option_editor.cc:239
+#: session_option_editor.cc:249 session_option_editor.cc:260
 msgid "Filenames"
 msgstr ""
 
-#: session_option_editor.cc:206
+#: session_option_editor.cc:227
 msgid "File Naming"
 msgstr ""
 
-#: session_option_editor.cc:212
+#: session_option_editor.cc:233
 msgid "Prefix Track number"
 msgstr ""
 
-#: session_option_editor.cc:217
+#: session_option_editor.cc:238
 msgid ""
 "Adds the current track number to the beginning of the recorded file name."
 msgstr ""
 
-#: session_option_editor.cc:222
+#: session_option_editor.cc:243
 msgid "Prefix Take Name"
 msgstr ""
 
-#: session_option_editor.cc:227
+#: session_option_editor.cc:248
 msgid "Adds the Take Name to the beginning of the recorded file name."
 msgstr ""
 
-#: session_option_editor.cc:232
+#: session_option_editor.cc:253
 msgid "Take Name"
 msgstr ""
 
-#: session_option_editor.cc:245
+#: session_option_editor.cc:266
 msgid ""
 "Track Input Monitoring automatically follows transport state (\"auto-input\")"
 msgstr ""
 
-#: session_option_editor.cc:252
+#: session_option_editor.cc:273
 msgid "Use monitor section in this session"
 msgstr ""
 
-#: session_option_editor.cc:257 session_option_editor.cc:259
-#: session_option_editor.cc:266 session_option_editor.cc:273
-#: session_option_editor.cc:280 session_option_editor.cc:282
-#: session_option_editor.cc:289 session_option_editor.cc:296
-#: session_option_editor.cc:303 session_option_editor.cc:310
-#: session_option_editor.cc:312
+#: session_option_editor.cc:278 session_option_editor.cc:280
+#: session_option_editor.cc:287 session_option_editor.cc:294
+#: session_option_editor.cc:301 session_option_editor.cc:303
+#: session_option_editor.cc:310 session_option_editor.cc:317
+#: session_option_editor.cc:324 session_option_editor.cc:331
+#: session_option_editor.cc:333
 msgid "Meterbridge"
 msgstr ""
 
-#: session_option_editor.cc:257
+#: session_option_editor.cc:278
 msgid "Route Display"
 msgstr ""
 
-#: session_option_editor.cc:261
+#: session_option_editor.cc:282
 msgid "Show Midi Tracks"
 msgstr ""
 
-#: session_option_editor.cc:268
+#: session_option_editor.cc:289
 msgid "Show Busses"
 msgstr ""
 
-#: session_option_editor.cc:275
+#: session_option_editor.cc:296
 msgid "Include Master Bus"
 msgstr ""
 
-#: session_option_editor.cc:280
+#: session_option_editor.cc:301
 msgid "Button Area"
 msgstr ""
 
-#: session_option_editor.cc:284
+#: session_option_editor.cc:305
 msgid "Rec-enable Button"
 msgstr ""
 
-#: session_option_editor.cc:291
+#: session_option_editor.cc:312
 msgid "Mute Button"
 msgstr ""
 
-#: session_option_editor.cc:298
+#: session_option_editor.cc:319
 msgid "Solo Button"
 msgstr ""
 
-#: session_option_editor.cc:305
+#: session_option_editor.cc:326
 msgid "Monitor Buttons"
 msgstr ""
 
-#: session_option_editor.cc:310
+#: session_option_editor.cc:331
 msgid "Name Labels"
 msgstr ""
 
-#: session_option_editor.cc:314
+#: session_option_editor.cc:335
 msgid "Track Name"
 msgstr ""
 
-#: session_option_editor.cc:325
+#: session_option_editor.cc:346
 msgid "MIDI region copies are independent"
 msgstr ""
 
-#: session_option_editor.cc:332
+#: session_option_editor.cc:353
 msgid ""
 "Policy for handling overlapping notes\n"
 " on the same MIDI channel"
 msgstr ""
 
-#: session_option_editor.cc:337
+#: session_option_editor.cc:358
 msgid "never allow them"
 msgstr ""
 
-#: session_option_editor.cc:338
+#: session_option_editor.cc:359
 msgid "don't do anything in particular"
 msgstr ""
 
-#: session_option_editor.cc:339
+#: session_option_editor.cc:360
 msgid "replace any overlapped existing note"
 msgstr ""
 
-#: session_option_editor.cc:340
+#: session_option_editor.cc:361
 msgid "shorten the overlapped existing note"
 msgstr ""
 
-#: session_option_editor.cc:341
+#: session_option_editor.cc:362
 msgid "shorten the overlapping new note"
 msgstr ""
 
-#: session_option_editor.cc:342
+#: session_option_editor.cc:363
 msgid "replace both overlapping notes with a single note"
 msgstr ""
 
-#: session_option_editor.cc:346
+#: session_option_editor.cc:367
 msgid "Glue to bars and beats"
 msgstr ""
 
-#: session_option_editor.cc:350
+#: session_option_editor.cc:371
 msgid "Glue new markers to bars and beats"
 msgstr ""
 
-#: session_option_editor.cc:357
+#: session_option_editor.cc:378
 msgid "Glue new regions to bars and beats"
 msgstr ""
 
-#: session_option_editor.cc:362
+#: session_option_editor.cc:383
 msgid "Defaults"
 msgstr ""
 
-#: session_option_editor.cc:364
+#: session_option_editor.cc:385
 msgid "Use these settings as defaults"
 msgstr ""
 
@@ -11038,26 +13091,14 @@ msgstr ""
 msgid "Timestamp:"
 msgstr ""
 
-#: sfdb_ui.cc:149
-msgid "Format:"
-msgstr ""
-
-#: sfdb_ui.cc:188 sfdb_ui.cc:653
+#: sfdb_ui.cc:188 sfdb_ui.cc:659
 msgid "Tags:"
 msgstr ""
 
-#: sfdb_ui.cc:293 sfdb_ui.cc:409
-msgid "Could not read file: %1 (%2)."
-msgstr ""
-
 #: sfdb_ui.cc:297
 msgid "<b>Midi File Information</b>"
 msgstr ""
 
-#: sfdb_ui.cc:458
-msgid "Could not access soundfile: "
-msgstr ""
-
 #: sfdb_ui.cc:530
 msgid "SoundFileBox: Could not tokenize string: "
 msgstr "SoundFileBox: Could not tokenise string: "
@@ -11066,284 +13107,280 @@ msgstr "SoundFileBox: Could not tokenise string: "
 msgid "Search"
 msgstr ""
 
-#: sfdb_ui.cc:576
+#: sfdb_ui.cc:581
 msgid "Audio and MIDI files"
 msgstr ""
 
-#: sfdb_ui.cc:579
+#: sfdb_ui.cc:584
 msgid "Audio files"
 msgstr ""
 
-#: sfdb_ui.cc:582
+#: sfdb_ui.cc:587
 msgid "MIDI files"
 msgstr ""
 
-#: sfdb_ui.cc:585 add_video_dialog.cc:123
+#: sfdb_ui.cc:590 add_video_dialog.cc:123
 msgid "All files"
 msgstr ""
 
-#: sfdb_ui.cc:604 add_video_dialog.cc:246
+#: sfdb_ui.cc:609 add_video_dialog.cc:246
 msgid "Browse Files"
 msgstr ""
 
-#: sfdb_ui.cc:633
+#: sfdb_ui.cc:638
 msgid "Paths"
 msgstr ""
 
-#: sfdb_ui.cc:642
+#: sfdb_ui.cc:647
 msgid "Search Tags"
 msgstr ""
 
-#: sfdb_ui.cc:658
+#: sfdb_ui.cc:664
 msgid "Sort:"
 msgstr ""
 
-#: sfdb_ui.cc:666
+#: sfdb_ui.cc:672
 msgid "Longest"
 msgstr ""
 
-#: sfdb_ui.cc:667
+#: sfdb_ui.cc:673
 msgid "Shortest"
 msgstr ""
 
-#: sfdb_ui.cc:668
+#: sfdb_ui.cc:674
 msgid "Newest"
 msgstr ""
 
-#: sfdb_ui.cc:669
+#: sfdb_ui.cc:675
 msgid "Oldest"
 msgstr ""
 
-#: sfdb_ui.cc:670
+#: sfdb_ui.cc:676
 msgid "Most downloaded"
 msgstr ""
 
-#: sfdb_ui.cc:671
+#: sfdb_ui.cc:677
 msgid "Least downloaded"
 msgstr ""
 
-#: sfdb_ui.cc:672
+#: sfdb_ui.cc:678
 msgid "Highest rated"
 msgstr ""
 
-#: sfdb_ui.cc:673
+#: sfdb_ui.cc:679
 msgid "Lowest rated"
 msgstr ""
 
-#: sfdb_ui.cc:678
+#: sfdb_ui.cc:684
 msgid "More"
 msgstr ""
 
-#: sfdb_ui.cc:682
+#: sfdb_ui.cc:688
 msgid "Similar"
 msgstr ""
 
-#: sfdb_ui.cc:694
+#: sfdb_ui.cc:700
 msgid "ID"
 msgstr ""
 
-#: sfdb_ui.cc:695 add_video_dialog.cc:83
+#: sfdb_ui.cc:701 add_video_dialog.cc:83
 msgid "Filename"
 msgstr ""
 
-#: sfdb_ui.cc:697
+#: sfdb_ui.cc:703 time_fx_dialog.cc:154
 msgid "Duration"
 msgstr ""
 
-#: sfdb_ui.cc:698
+#: sfdb_ui.cc:704
 msgid "Size"
 msgstr ""
 
-#: sfdb_ui.cc:699
+#: sfdb_ui.cc:705
 msgid "Samplerate"
 msgstr ""
 
-#: sfdb_ui.cc:700
+#: sfdb_ui.cc:706
 msgid "License"
 msgstr "Licence"
 
-#: sfdb_ui.cc:718
+#: sfdb_ui.cc:724
 msgid "Search Freesound"
 msgstr ""
 
-#: sfdb_ui.cc:738
-msgid "Press to import selected files and close this window"
+#: sfdb_ui.cc:741
+msgid "Press to import selected files"
 msgstr ""
 
-#: sfdb_ui.cc:739
-msgid "Press to import selected files and leave this window open"
-msgstr ""
-
-#: sfdb_ui.cc:740
+#: sfdb_ui.cc:742
 msgid "Press to close this window without importing any files"
 msgstr ""
 
-#: sfdb_ui.cc:936
+#: sfdb_ui.cc:937
 msgid "SoundFileBrowser: Could not tokenize string: "
 msgstr "SoundFileBrowser: Could not tokenise string: "
 
-#: sfdb_ui.cc:1136
+#: sfdb_ui.cc:1137
 msgid "%1 more page of 100 results available"
 msgid_plural "%1 more pages of 100 results available"
 msgstr[0] ""
 msgstr[1] ""
 
-#: sfdb_ui.cc:1141
+#: sfdb_ui.cc:1142
 msgid "No more results available"
 msgstr ""
 
-#: sfdb_ui.cc:1205
+#: sfdb_ui.cc:1206
 msgid "B"
 msgstr ""
 
-#: sfdb_ui.cc:1207
+#: sfdb_ui.cc:1208
 msgid "kB"
 msgstr ""
 
-#: sfdb_ui.cc:1209 sfdb_ui.cc:1211
+#: sfdb_ui.cc:1210 sfdb_ui.cc:1212
 msgid "MB"
 msgstr ""
 
-#: sfdb_ui.cc:1213
+#: sfdb_ui.cc:1214
 msgid "GB"
 msgstr ""
 
-#: sfdb_ui.cc:1425 sfdb_ui.cc:1738 sfdb_ui.cc:1801 sfdb_ui.cc:1819
+#: sfdb_ui.cc:1431 sfdb_ui.cc:1728 sfdb_ui.cc:1764 sfdb_ui.cc:1782
 msgid "one track per file"
 msgstr ""
 
-#: sfdb_ui.cc:1428 sfdb_ui.cc:1802 sfdb_ui.cc:1820
+#: sfdb_ui.cc:1434 sfdb_ui.cc:1765 sfdb_ui.cc:1783
 msgid "one track per channel"
 msgstr ""
 
-#: sfdb_ui.cc:1436 sfdb_ui.cc:1804 sfdb_ui.cc:1821
+#: sfdb_ui.cc:1442 sfdb_ui.cc:1767 sfdb_ui.cc:1784
 msgid "sequence files"
 msgstr ""
 
-#: sfdb_ui.cc:1439 sfdb_ui.cc:1809
+#: sfdb_ui.cc:1445 sfdb_ui.cc:1772
 msgid "all files in one track"
 msgstr ""
 
-#: sfdb_ui.cc:1440 sfdb_ui.cc:1803
+#: sfdb_ui.cc:1446 sfdb_ui.cc:1766
 msgid "merge files"
 msgstr ""
 
-#: sfdb_ui.cc:1446 sfdb_ui.cc:1806
+#: sfdb_ui.cc:1452 sfdb_ui.cc:1769
 msgid "one region per file"
 msgstr ""
 
-#: sfdb_ui.cc:1449 sfdb_ui.cc:1807
+#: sfdb_ui.cc:1455 sfdb_ui.cc:1770
 msgid "one region per channel"
 msgstr ""
 
-#: sfdb_ui.cc:1454 sfdb_ui.cc:1808 sfdb_ui.cc:1822
+#: sfdb_ui.cc:1460 sfdb_ui.cc:1771 sfdb_ui.cc:1785
 msgid "all files in one region"
 msgstr ""
 
-#: sfdb_ui.cc:1521
+#: sfdb_ui.cc:1527
 msgid ""
 "One or more of the selected files\n"
 "cannot be used by %1"
 msgstr ""
 
-#: sfdb_ui.cc:1665
+#: sfdb_ui.cc:1671
 msgid "Copy files to session"
 msgstr ""
 
-#: sfdb_ui.cc:1682 sfdb_ui.cc:1859
+#: sfdb_ui.cc:1686 sfdb_ui.cc:1825
 msgid "file timestamp"
 msgstr ""
 
-#: sfdb_ui.cc:1683 sfdb_ui.cc:1861
+#: sfdb_ui.cc:1687 sfdb_ui.cc:1827
 msgid "edit point"
 msgstr ""
 
-#: sfdb_ui.cc:1684 sfdb_ui.cc:1863
+#: sfdb_ui.cc:1688 sfdb_ui.cc:1829
 msgid "playhead"
 msgstr ""
 
-#: sfdb_ui.cc:1685
+#: sfdb_ui.cc:1689
 msgid "session start"
 msgstr ""
 
-#: sfdb_ui.cc:1691
-msgid "<b>Add files as ...</b>"
+#: sfdb_ui.cc:1695
+msgid "<b>Add files ...</b>"
 msgstr ""
 
-#: sfdb_ui.cc:1713
+#: sfdb_ui.cc:1700
 msgid "<b>Insert at</b>"
 msgstr ""
 
-#: sfdb_ui.cc:1726
+#: sfdb_ui.cc:1705
 msgid "<b>Mapping</b>"
 msgstr ""
 
-#: sfdb_ui.cc:1744
+#: sfdb_ui.cc:1710
 msgid "<b>Conversion quality</b>"
 msgstr ""
 
-#: sfdb_ui.cc:1756
+#: sfdb_ui.cc:1715
 msgid "<b>Instrument</b>"
 msgstr ""
 
-#: sfdb_ui.cc:1768 sfdb_ui.cc:1875
+#: sfdb_ui.cc:1734 sfdb_ui.cc:1841
 msgid "Best"
 msgstr ""
 
-#: sfdb_ui.cc:1769 sfdb_ui.cc:1877
+#: sfdb_ui.cc:1735 sfdb_ui.cc:1843
 msgid "Good"
 msgstr ""
 
-#: sfdb_ui.cc:1770 sfdb_ui.cc:1879
+#: sfdb_ui.cc:1736 sfdb_ui.cc:1845
 msgid "Quick"
 msgstr ""
 
-#: sfdb_ui.cc:1772
+#: sfdb_ui.cc:1738
 msgid "Fastest"
 msgstr ""
 
-#: shuttle_control.cc:56
+#: shuttle_control.cc:64
 msgid "Shuttle speed control (Context-click for options)"
 msgstr ""
 
-#: shuttle_control.cc:174
+#: shuttle_control.cc:201 time_fx_dialog.cc:164
 msgid "Percent"
 msgstr ""
 
-#: shuttle_control.cc:182
+#: shuttle_control.cc:209
 msgid "Units"
 msgstr ""
 
-#: shuttle_control.cc:188 shuttle_control.cc:609
+#: shuttle_control.cc:215 shuttle_control.cc:671
 msgid "Sprung"
 msgstr ""
 
-#: shuttle_control.cc:192 shuttle_control.cc:612
+#: shuttle_control.cc:219 shuttle_control.cc:674
 msgid "Wheel"
 msgstr ""
 
-#: shuttle_control.cc:226
+#: shuttle_control.cc:253
 msgid "Maximum speed"
 msgstr ""
 
-#: shuttle_control.cc:568
+#: shuttle_control.cc:256
+msgid "Reset to 100%"
+msgstr ""
+
+#: shuttle_control.cc:633
 msgid "Playing"
 msgstr ""
 
-#: shuttle_control.cc:583
+#: shuttle_control.cc:648
 #, c-format
 msgid "<<< %+d semitones"
 msgstr ""
 
-#: shuttle_control.cc:585
+#: shuttle_control.cc:650
 #, c-format
 msgid ">>> %+d semitones"
 msgstr ""
 
-#: shuttle_control.cc:590
-msgid "Stopped"
-msgstr ""
-
 #: soundcloud_export_selector.cc:44
 msgid "User Email"
 msgstr ""
@@ -11368,7 +13405,7 @@ msgstr ""
 msgid "%1: %2 of %3 bytes uploaded"
 msgstr ""
 
-#: splash.cc:73
+#: splash.cc:78
 msgid "%1 loading ..."
 msgstr ""
 
@@ -11384,17 +13421,17 @@ msgstr ""
 msgid "Azimuth:"
 msgstr ""
 
-#: startup.cc:67
+#: startup.cc:71
 msgid ""
 "Use an external mixer or the hardware mixer of your audio interface.\n"
 "%1 will play NO role in monitoring"
 msgstr ""
 
-#: startup.cc:69
+#: startup.cc:73
 msgid "Ask %1 to play back material as it is being recorded"
 msgstr ""
 
-#: startup.cc:142
+#: startup.cc:146
 msgid ""
 "<span size=\"larger\">%1 is a digital audio workstation. You can use it to "
 "record, edit and mix multi-track audio. You can produce your own CDs, mix "
@@ -11404,15 +13441,15 @@ msgid ""
 "program.</span> "
 msgstr ""
 
-#: startup.cc:168
+#: startup.cc:172
 msgid "Welcome to %1"
 msgstr ""
 
-#: startup.cc:191
+#: startup.cc:195
 msgid "Default folder for %1 sessions"
 msgstr ""
 
-#: startup.cc:197
+#: startup.cc:201
 msgid ""
 "Each project that you work on with %1 has its own folder.\n"
 "These can require a lot of disk space if you are recording audio.\n"
@@ -11422,11 +13459,11 @@ msgid ""
 "<i>(You can put new sessions anywhere, this is just a default)</i>"
 msgstr ""
 
-#: startup.cc:220
+#: startup.cc:224
 msgid "Default folder for new sessions"
 msgstr ""
 
-#: startup.cc:241
+#: startup.cc:245
 msgid ""
 "While recording instruments or vocals, you probably want to listen to the\n"
 "signal as well as record it. This is called \"monitoring\". There are\n"
@@ -11450,31 +13487,31 @@ msgstr ""
 "\n"
 "<i>If you do not understand what this is about, just accept the default.</i>"
 
-#: startup.cc:262
+#: startup.cc:266
 msgid "Monitoring Choices"
 msgstr ""
 
-#: startup.cc:285
+#: startup.cc:289
 msgid "Use a Master bus directly"
 msgstr ""
 
-#: startup.cc:287
+#: startup.cc:291
 msgid ""
 "Connect the Master bus directly to your hardware outputs. This is preferable "
 "for simple usage."
 msgstr ""
 
-#: startup.cc:296
+#: startup.cc:300
 msgid "Use an additional Monitor bus"
 msgstr ""
 
-#: startup.cc:299
+#: startup.cc:303
 msgid ""
 "Use a Monitor bus between Master bus and hardware outputs for \n"
 "greater control in monitoring without affecting the mix."
 msgstr ""
 
-#: startup.cc:321
+#: startup.cc:325
 msgid ""
 "<i>You can change this preference at any time via the Preferences dialog.\n"
 "You can also add or remove the monitor section to/from any session.</i>\n"
@@ -11486,46 +13523,42 @@ msgstr ""
 "\n"
 "<i>If you do not understand what this is about, just accept the default.</i>"
 
-#: startup.cc:332
+#: startup.cc:336
 msgid "Monitor Section"
 msgstr ""
 
-#: step_entry.cc:60
+#: step_entry.cc:59
 msgid "Step Entry: %1"
 msgstr ""
 
-#: step_entry.cc:65
+#: step_entry.cc:64
 msgid ">beat"
 msgstr ""
 
-#: step_entry.cc:66
+#: step_entry.cc:65
 msgid ">bar"
 msgstr ""
 
-#: step_entry.cc:67
+#: step_entry.cc:66
 msgid ">EP"
 msgstr ""
 
-#: step_entry.cc:68
+#: step_entry.cc:67
 msgid "sustain"
 msgstr ""
 
-#: step_entry.cc:69
+#: step_entry.cc:68
 msgid "rest"
 msgstr ""
 
-#: step_entry.cc:70
+#: step_entry.cc:69
 msgid "g-rest"
 msgstr ""
 
-#: step_entry.cc:71
+#: step_entry.cc:70
 msgid "back"
 msgstr ""
 
-#: step_entry.cc:82 step_entry.cc:85
-msgid "+"
-msgstr ""
-
 #: step_entry.cc:191
 msgid "Set note length to a whole note"
 msgstr "Set note length to a semibreve"
@@ -11634,11 +13667,11 @@ msgstr ""
 msgid "Insert a program change message"
 msgstr ""
 
-#: step_entry.cc:343 step_entry.cc:700
+#: step_entry.cc:343 step_entry.cc:645
 msgid "Move Insert Position Back by Note Length"
 msgstr ""
 
-#: step_entry.cc:344 step_entry.cc:698
+#: step_entry.cc:344 step_entry.cc:643
 msgid "Move Insert Position to Edit Point"
 msgstr ""
 
@@ -11650,240 +13683,244 @@ msgstr ""
 msgid "Octave"
 msgstr ""
 
-#: step_entry.cc:598
+#: step_entry.cc:592
 msgid "Insert Note A"
 msgstr ""
 
-#: step_entry.cc:599
+#: step_entry.cc:593
 msgid "Insert Note A-sharp"
 msgstr ""
 
-#: step_entry.cc:600
+#: step_entry.cc:594
 msgid "Insert Note B"
 msgstr ""
 
-#: step_entry.cc:601
+#: step_entry.cc:595
 msgid "Insert Note C"
 msgstr ""
 
-#: step_entry.cc:602
+#: step_entry.cc:596
 msgid "Insert Note C-sharp"
 msgstr ""
 
-#: step_entry.cc:603
+#: step_entry.cc:597
 msgid "Insert Note D"
 msgstr ""
 
-#: step_entry.cc:604
+#: step_entry.cc:598
 msgid "Insert Note D-sharp"
 msgstr ""
 
-#: step_entry.cc:605
+#: step_entry.cc:599
 msgid "Insert Note E"
 msgstr ""
 
-#: step_entry.cc:606
+#: step_entry.cc:600
 msgid "Insert Note F"
 msgstr ""
 
-#: step_entry.cc:607
+#: step_entry.cc:601
 msgid "Insert Note F-sharp"
 msgstr ""
 
-#: step_entry.cc:608
+#: step_entry.cc:602
 msgid "Insert Note G"
 msgstr ""
 
-#: step_entry.cc:609
+#: step_entry.cc:603
 msgid "Insert Note G-sharp"
 msgstr ""
 
-#: step_entry.cc:611
+#: step_entry.cc:605
 msgid "Insert a Note-length Rest"
 msgstr ""
 
-#: step_entry.cc:612
+#: step_entry.cc:606
 msgid "Insert a Snap-length Rest"
 msgstr ""
 
-#: step_entry.cc:614 step_entry.cc:615
+#: step_entry.cc:608 step_entry.cc:609
 msgid "Move to next octave"
 msgstr ""
 
-#: step_entry.cc:617
+#: step_entry.cc:611
 msgid "Move to Next Note Length"
 msgstr ""
 
-#: step_entry.cc:618
+#: step_entry.cc:612
 msgid "Move to Previous Note Length"
 msgstr ""
 
-#: step_entry.cc:620
+#: step_entry.cc:614
 msgid "Increase Note Length"
 msgstr ""
 
-#: step_entry.cc:621
+#: step_entry.cc:615
 msgid "Decrease Note Length"
 msgstr ""
 
-#: step_entry.cc:623
+#: step_entry.cc:617
 msgid "Move to Next Note Velocity"
 msgstr ""
 
-#: step_entry.cc:624
+#: step_entry.cc:618
 msgid "Move to Previous Note Velocity"
 msgstr ""
 
-#: step_entry.cc:626
+#: step_entry.cc:620
 msgid "Increase Note Velocity"
 msgstr ""
 
-#: step_entry.cc:627
+#: step_entry.cc:621
 msgid "Decrease Note Velocity"
 msgstr ""
 
-#: step_entry.cc:629
+#: step_entry.cc:623
 msgid "Switch to the 1st octave"
 msgstr ""
 
-#: step_entry.cc:630
+#: step_entry.cc:624
 msgid "Switch to the 2nd octave"
 msgstr ""
 
-#: step_entry.cc:631
+#: step_entry.cc:625
 msgid "Switch to the 3rd octave"
 msgstr ""
 
-#: step_entry.cc:632
+#: step_entry.cc:626
 msgid "Switch to the 4th octave"
 msgstr ""
 
-#: step_entry.cc:633
+#: step_entry.cc:627
 msgid "Switch to the 5th octave"
 msgstr ""
 
-#: step_entry.cc:634
+#: step_entry.cc:628
 msgid "Switch to the 6th octave"
 msgstr ""
 
-#: step_entry.cc:635
+#: step_entry.cc:629
 msgid "Switch to the 7th octave"
 msgstr ""
 
-#: step_entry.cc:636
+#: step_entry.cc:630
 msgid "Switch to the 8th octave"
 msgstr ""
 
-#: step_entry.cc:637
+#: step_entry.cc:631
 msgid "Switch to the 9th octave"
 msgstr ""
 
-#: step_entry.cc:638
+#: step_entry.cc:632
 msgid "Switch to the 10th octave"
 msgstr ""
 
-#: step_entry.cc:639
+#: step_entry.cc:633
 msgid "Switch to the 11th octave"
 msgstr ""
 
-#: step_entry.cc:644
+#: step_entry.cc:635
+msgid "Toggle Triple Notes"
+msgstr ""
+
+#: step_entry.cc:638
+msgid "Toggle Chord Entry"
+msgstr ""
+
+#: step_entry.cc:640
+msgid "Sustain Selected Notes by Note Length"
+msgstr ""
+
+#: step_entry.cc:650
 msgid "Set Note Length to Whole"
 msgstr "Set Note Length to semibreve"
 
-#: step_entry.cc:646
+#: step_entry.cc:652
 msgid "Set Note Length to 1/2"
 msgstr "Set Note Length to minim"
 
-#: step_entry.cc:648
+#: step_entry.cc:654
 msgid "Set Note Length to 1/3"
 msgstr "Set Note Length to minim triplet"
 
-#: step_entry.cc:650
+#: step_entry.cc:656
 msgid "Set Note Length to 1/4"
 msgstr "Set Note Length to crotchet"
 
-#: step_entry.cc:652
+#: step_entry.cc:658
 msgid "Set Note Length to 1/8"
 msgstr "Set Note Length to quaver"
 
-#: step_entry.cc:654
+#: step_entry.cc:660
 msgid "Set Note Length to 1/16"
 msgstr "Set Note Length to semiquaver"
 
-#: step_entry.cc:656
+#: step_entry.cc:662
 msgid "Set Note Length to 1/32"
 msgstr "Set Note Length to demisemiquaver"
 
-#: step_entry.cc:658
+#: step_entry.cc:664
 msgid "Set Note Length to 1/64"
 msgstr "Set Note Length to hemidemisemiquaver"
 
-#: step_entry.cc:663
+#: step_entry.cc:669
 msgid "Set Note Velocity to Pianississimo"
 msgstr ""
 
-#: step_entry.cc:665
+#: step_entry.cc:671
 msgid "Set Note Velocity to Pianissimo"
 msgstr ""
 
-#: step_entry.cc:667
+#: step_entry.cc:673
 msgid "Set Note Velocity to Piano"
 msgstr ""
 
-#: step_entry.cc:669
+#: step_entry.cc:675
 msgid "Set Note Velocity to Mezzo-Piano"
 msgstr ""
 
-#: step_entry.cc:671
+#: step_entry.cc:677
 msgid "Set Note Velocity to Mezzo-Forte"
 msgstr ""
 
-#: step_entry.cc:673
+#: step_entry.cc:679
 msgid "Set Note Velocity to Forte"
 msgstr ""
 
-#: step_entry.cc:675 step_entry.cc:677
+#: step_entry.cc:681 step_entry.cc:683
 msgid "Set Note Velocity to Fortississimo"
 msgstr ""
 
-#: step_entry.cc:679
-msgid "Toggle Triple Notes"
-msgstr ""
-
-#: step_entry.cc:684
+#: step_entry.cc:688
 msgid "No Dotted Notes"
 msgstr ""
 
-#: step_entry.cc:686
+#: step_entry.cc:689
 msgid "Toggled Dotted Notes"
 msgstr ""
 
-#: step_entry.cc:688
+#: step_entry.cc:690
 msgid "Toggled Double-Dotted Notes"
 msgstr ""
 
-#: step_entry.cc:690
+#: step_entry.cc:691
 msgid "Toggled Triple-Dotted Notes"
 msgstr ""
 
-#: step_entry.cc:693
-msgid "Toggle Chord Entry"
-msgstr ""
-
-#: step_entry.cc:695
-msgid "Sustain Selected Notes by Note Length"
-msgstr ""
-
-#: stereo_panner.cc:133
+#: stereo_panner.cc:129
 #, c-format
 msgid "L:%3d R:%3d Width:%d%%"
 msgstr ""
 
-#: stereo_panner_editor.cc:35
+#: stereo_panner.cc:272
+msgid "Panner|M"
+msgstr ""
+
+#: stereo_panner_editor.cc:37
 msgid "Stereo Panner"
 msgstr ""
 
-#: stereo_panner_editor.cc:49
+#: stereo_panner_editor.cc:51
 msgid "Width"
 msgstr ""
 
@@ -11891,176 +13928,189 @@ msgstr ""
 msgid "Strip Silence"
 msgstr ""
 
-#: strip_silence_dialog.cc:75
+#: strip_silence_dialog.cc:65
+msgid "Threshold"
+msgstr ""
+
+#: strip_silence_dialog.cc:76
 msgid "Minimum length"
 msgstr ""
 
-#: strip_silence_dialog.cc:83
+#: strip_silence_dialog.cc:84
 msgid "Fade length"
 msgstr ""
 
-#: tempo_dialog.cc:41 tempo_dialog.cc:57
+#: strip_silence_dialog.cc:111 strip_silence_dialog.cc:298
+msgid "Analyzing"
+msgstr ""
+
+#: tempo_dialog.cc:43 tempo_dialog.cc:60
 msgid "bar:"
 msgstr ""
 
-#: tempo_dialog.cc:42 tempo_dialog.cc:58
+#: tempo_dialog.cc:44 tempo_dialog.cc:61
 msgid "beat:"
 msgstr ""
 
-#: tempo_dialog.cc:43 tempo_dialog.cc:59
+#: tempo_dialog.cc:45 tempo_dialog.cc:62
 msgid "Pulse note"
 msgstr ""
 
-#: tempo_dialog.cc:44 tempo_dialog.cc:60
+#: tempo_dialog.cc:46 tempo_dialog.cc:63
 msgid "Tap tempo"
 msgstr ""
 
-#: tempo_dialog.cc:54
-msgid "Edit Tempo"
-msgstr ""
-
-#: tempo_dialog.cc:77 tempo_dialog.cc:78 tempo_dialog.cc:324
-#: tempo_dialog.cc:325
+#: tempo_dialog.cc:81 tempo_dialog.cc:82 tempo_dialog.cc:448
+#: tempo_dialog.cc:449
 msgid "whole"
 msgstr "semibreve"
 
-#: tempo_dialog.cc:79 tempo_dialog.cc:80 tempo_dialog.cc:326
-#: tempo_dialog.cc:327
+#: tempo_dialog.cc:83 tempo_dialog.cc:84 tempo_dialog.cc:450
+#: tempo_dialog.cc:451
 msgid "second"
 msgstr "minim"
 
-#: tempo_dialog.cc:81 tempo_dialog.cc:82 tempo_dialog.cc:328
-#: tempo_dialog.cc:329
+#: tempo_dialog.cc:85 tempo_dialog.cc:86 tempo_dialog.cc:452
+#: tempo_dialog.cc:453
 msgid "third"
 msgstr "minim triplet"
 
-#: tempo_dialog.cc:83 tempo_dialog.cc:84 tempo_dialog.cc:330
-#: tempo_dialog.cc:331
+#: tempo_dialog.cc:87 tempo_dialog.cc:88 tempo_dialog.cc:454
+#: tempo_dialog.cc:455
 msgid "quarter"
 msgstr "crotchet"
 
-#: tempo_dialog.cc:85 tempo_dialog.cc:86 tempo_dialog.cc:332
-#: tempo_dialog.cc:333
+#: tempo_dialog.cc:89 tempo_dialog.cc:90 tempo_dialog.cc:456
+#: tempo_dialog.cc:457
 msgid "eighth"
 msgstr "quaver"
 
-#: tempo_dialog.cc:87 tempo_dialog.cc:88 tempo_dialog.cc:334
-#: tempo_dialog.cc:335
+#: tempo_dialog.cc:91 tempo_dialog.cc:92 tempo_dialog.cc:458
+#: tempo_dialog.cc:459
 msgid "sixteenth"
 msgstr "semiquaver"
 
-#: tempo_dialog.cc:89 tempo_dialog.cc:90 tempo_dialog.cc:336
-#: tempo_dialog.cc:337
+#: tempo_dialog.cc:93 tempo_dialog.cc:94 tempo_dialog.cc:460
+#: tempo_dialog.cc:461
 msgid "thirty-second"
 msgstr "demisemiquaver"
 
-#: tempo_dialog.cc:91 tempo_dialog.cc:92 tempo_dialog.cc:338
-#: tempo_dialog.cc:339
+#: tempo_dialog.cc:95 tempo_dialog.cc:96 tempo_dialog.cc:462
+#: tempo_dialog.cc:463
 msgid "sixty-fourth"
 msgstr "hemidemisemiquaver"
 
-#: tempo_dialog.cc:93 tempo_dialog.cc:94 tempo_dialog.cc:340
-#: tempo_dialog.cc:341
+#: tempo_dialog.cc:97 tempo_dialog.cc:98 tempo_dialog.cc:464
+#: tempo_dialog.cc:465
 msgid "one-hundred-twenty-eighth"
 msgstr "semihemidemisemiquaver"
 
-#: tempo_dialog.cc:121
+#: tempo_dialog.cc:115 tempo_dialog.cc:116
+msgid "ramped"
+msgstr ""
+
+#: tempo_dialog.cc:117 tempo_dialog.cc:118
+msgid "constant"
+msgstr ""
+
+#: tempo_dialog.cc:133 tempo_dialog.cc:134 tempo_dialog.cc:482
+#: tempo_dialog.cc:483
+msgid "music"
+msgstr ""
+
+#: tempo_dialog.cc:161
 msgid "Beats per minute:"
 msgstr ""
 
-#: tempo_dialog.cc:155
+#: tempo_dialog.cc:195
 msgid "Tempo begins at"
 msgstr ""
 
-#: tempo_dialog.cc:251
+#: tempo_dialog.cc:201
+msgid "Lock Style:"
+msgstr ""
+
+#: tempo_dialog.cc:209
+msgid "Tempo Type:"
+msgstr ""
+
+#: tempo_dialog.cc:321
 msgid "incomprehensible pulse note type (%1)"
 msgstr ""
 
-#: tempo_dialog.cc:307
-msgid "Edit Meter"
+#: tempo_dialog.cc:334
+msgid "incomprehensible tempo type (%1)"
 msgstr ""
 
-#: tempo_dialog.cc:356
-msgid "Note value:"
+#: tempo_dialog.cc:347
+msgid "incomprehensible lock style (%1)"
 msgstr ""
 
-#: tempo_dialog.cc:357
-msgid "Beats per bar:"
+#: tempo_dialog.cc:498
+msgid "Note value:"
 msgstr ""
 
-#: tempo_dialog.cc:371
-msgid "Meter begins at bar:"
+#: tempo_dialog.cc:499
+msgid "Lock style:"
 msgstr ""
 
-#: tempo_dialog.cc:484
-msgid "incomprehensible meter note type (%1)"
+#: tempo_dialog.cc:500
+msgid "Beats per bar:"
 msgstr ""
 
-#: theme_manager.cc:65
-msgid "Dark Theme"
+#: tempo_dialog.cc:514
+msgid "Meter begins at bar:"
 msgstr ""
 
-#: theme_manager.cc:66
-msgid "Light Theme"
+#: tempo_dialog.cc:638
+msgid "incomprehensible meter note type (%1)"
 msgstr ""
 
-#: theme_manager.cc:67
-msgid "Restore Defaults"
+#: tempo_dialog.cc:651
+msgid "incomprehensible meter lock style (%1)"
 msgstr ""
 
-#: theme_manager.cc:68
+#: theme_manager.cc:53
 msgid "Draw \"flat\" buttons"
 msgstr ""
 
-#: theme_manager.cc:69
+#: theme_manager.cc:54
 msgid "Blink Rec-Arm buttons"
 msgstr ""
 
-#: theme_manager.cc:70
+#: theme_manager.cc:55
 msgid "Color regions using their track's color"
 msgstr "Colour regions using their track's colour"
 
-#: theme_manager.cc:71
+#: theme_manager.cc:56
 msgid "Show waveform clipping"
 msgstr ""
 
-#: theme_manager.cc:73
+#: theme_manager.cc:58
 msgid "Waveforms color gradient depth"
 msgstr "Waveforms colour gradient depth"
 
-#: theme_manager.cc:75
+#: theme_manager.cc:60
 msgid "Timeline item gradient depth"
 msgstr ""
 
-#: theme_manager.cc:76
+#: theme_manager.cc:61
 msgid "All floating windows are dialogs"
 msgstr "All floating windows are dialogues"
 
-#: theme_manager.cc:77
+#: theme_manager.cc:62
 msgid "Transient windows follow front window."
 msgstr ""
 
-#: theme_manager.cc:78
-msgid "Icon Set"
-msgstr ""
-
-#: theme_manager.cc:87
-msgid "Object"
-msgstr ""
-
-#: theme_manager.cc:163
-msgid "Items"
-msgstr ""
-
-#: theme_manager.cc:164
-msgid "Palette"
+#: theme_manager.cc:63
+msgid "Float detached monitor-section window"
 msgstr ""
 
-#: theme_manager.cc:165
-msgid "Transparency"
+#: theme_manager.cc:64
+msgid "Icon Set"
 msgstr ""
 
-#: theme_manager.cc:195
+#: theme_manager.cc:132
 msgid ""
 "Mark all floating windows to be type \"Dialog\" rather than using \"Utility"
 "\" for some.\n"
@@ -12072,92 +14122,95 @@ msgstr ""
 "This may help with some window managers. This requires a restart of %1 to "
 "take effect"
 
-#: theme_manager.cc:199
+#: theme_manager.cc:136
 msgid ""
 "Make transient windows follow the front window when toggling between the "
 "editor and mixer.\n"
 "This requires a restart of %1 to take effect"
 msgstr ""
 
-#: theme_manager.cc:620
-msgid "Color Palette"
-msgstr "Colour Palette"
+#: theme_manager.cc:139
+msgid ""
+"When detaching the monitoring section, mark it as \"Utility\" window to stay "
+"in front.\n"
+"This requires a restart of %1 to take effect"
+msgstr ""
 
 #: time_axis_view.cc:148
 msgid "Track/Bus name (double click to edit)"
 msgstr ""
 
-#: time_axis_view_item.cc:345
+#: time_axis_view_item.cc:326
 msgid "new duration %1 frame is out of bounds for %2"
 msgid_plural "new duration of %1 frames is out of bounds for %2"
 msgstr[0] ""
 msgstr[1] ""
 
-#: time_fx_dialog.cc:62
+#: time_fx_dialog.cc:60
 msgid "Quick but Ugly"
 msgstr ""
 
-#: time_fx_dialog.cc:63
+#: time_fx_dialog.cc:61
 msgid "Skip Anti-aliasing"
 msgstr ""
 
-#: time_fx_dialog.cc:64
-msgid "Contents:"
+#: time_fx_dialog.cc:62
+msgid "Contents"
 msgstr ""
 
-#: time_fx_dialog.cc:65
+#: time_fx_dialog.cc:63
 msgid "Minimize time distortion"
 msgstr "Minimise time distortion"
 
-#: time_fx_dialog.cc:66
+#: time_fx_dialog.cc:64
 msgid "Preserve Formants"
 msgstr ""
 
-#: time_fx_dialog.cc:71
+#: time_fx_dialog.cc:81
 msgid "TimeFXDialog"
 msgstr ""
 
-#: time_fx_dialog.cc:74
+#: time_fx_dialog.cc:84
 msgid "Pitch Shift Audio"
 msgstr ""
 
-#: time_fx_dialog.cc:76
+#: time_fx_dialog.cc:86
 msgid "Time Stretch Audio"
 msgstr ""
 
-#: time_fx_dialog.cc:104 transpose_dialog.cc:41
+#: time_fx_dialog.cc:114 transpose_dialog.cc:41
 msgid "Octaves:"
 msgstr ""
 
-#: time_fx_dialog.cc:109 transpose_dialog.cc:46
+#: time_fx_dialog.cc:119 transpose_dialog.cc:46
 msgid "Semitones:"
 msgstr ""
 
-#: time_fx_dialog.cc:114
+#: time_fx_dialog.cc:124
 msgid "Cents:"
 msgstr ""
 
-#: time_fx_dialog.cc:122
+#: time_fx_dialog.cc:132
 msgid "Time|Shift"
 msgstr ""
 
-#: time_fx_dialog.cc:146 time_fx_dialog.cc:149
+#: time_fx_dialog.cc:184 time_fx_dialog.cc:188
 msgid "TimeFXButton"
 msgstr ""
 
-#: time_fx_dialog.cc:154
+#: time_fx_dialog.cc:193
 msgid "Stretch/Shrink"
 msgstr ""
 
-#: time_fx_dialog.cc:164
+#: time_fx_dialog.cc:203
 msgid "<b>Progress</b>"
 msgstr ""
 
-#: time_info_box.cc:124
+#: time_info_box.cc:118
 msgid "Start recording at auto-punch start"
 msgstr ""
 
-#: time_info_box.cc:125
+#: time_info_box.cc:119
 msgid "Stop recording at auto-punch end"
 msgstr ""
 
@@ -12225,94 +14278,130 @@ msgstr ""
 msgid "Transpose"
 msgstr ""
 
-#: ui_config.cc:163 ui_config.cc:300
+#: ui_config.cc:233 ui_config.cc:416
 msgid "Loading default ui configuration file %1"
 msgstr ""
 
-#: ui_config.cc:166 ui_config.cc:303
+#: ui_config.cc:236 ui_config.cc:419
 msgid "cannot read default ui configuration file \"%1\""
 msgstr ""
 
-#: ui_config.cc:169 ui_config.cc:308
+#: ui_config.cc:239 ui_config.cc:424
 msgid "default ui configuration file \"%1\" not loaded successfully."
 msgstr ""
 
-#: ui_config.cc:177
+#: ui_config.cc:247
 msgid "Could not find default UI configuration file %1"
 msgstr ""
 
-#: ui_config.cc:219
+#: ui_config.cc:330
+msgid "Color file for %1 not found along %2"
+msgstr "Colour file for %1 not found along %2"
+
+#: ui_config.cc:337
 msgid "Loading color file %1"
 msgstr "Loading colour file %1"
 
-#: ui_config.cc:222
+#: ui_config.cc:340
 msgid "cannot read color file \"%1\""
 msgstr "cannot read colour file \"%1\""
 
-#: ui_config.cc:227
+#: ui_config.cc:345
 msgid "color file \"%1\" not loaded successfully."
 msgstr "colour file \"%1\" not loaded successfully."
 
-#: ui_config.cc:233
-msgid "Color file %1 not found"
-msgstr "Colour file %1 not found"
-
-#: ui_config.cc:282 ui_config.cc:361
+#: ui_config.cc:397 ui_config.cc:480
 msgid "Color file %1 not saved"
 msgstr "Colour file %1 not saved"
 
-#: ui_config.cc:317
+#: ui_config.cc:433
 msgid "Loading user ui configuration file %1"
 msgstr ""
 
-#: ui_config.cc:320
+#: ui_config.cc:436
 msgid "cannot read ui configuration file \"%1\""
 msgstr ""
 
-#: ui_config.cc:325
+#: ui_config.cc:441
 msgid "user ui configuration file \"%1\" not loaded successfully."
 msgstr ""
 
-#: ui_config.cc:333
+#: ui_config.cc:449
 msgid "could not find any ui configuration file, canvas will look broken."
 msgstr ""
 
-#: ui_config.cc:351
+#: ui_config.cc:470
 msgid "Config file %1 not saved"
 msgstr ""
 
-#: ui_config.cc:592
+#: ui_config.cc:715
 msgid "Color %1 not found"
 msgstr "Colour %1 not found"
 
-#: ui_config.cc:662
+#: ui_config.cc:785
 msgid "Unable to find UI style file %1 in search path %2. %3 will look strange"
 msgstr ""
 
-#: utils.cc:117 utils.cc:160
+#: utils.cc:118 utils.cc:161
 msgid "bad XPM header %1"
 msgstr ""
 
-#: utils.cc:577
+#: utils.cc:424
 msgid "cannot find XPM file for %1"
 msgstr ""
 
-#: utils.cc:597 utils.cc:627 utils.cc:641
+#: utils.cc:477 utils.cc:507 utils.cc:527
 msgid "default"
 msgstr ""
 
-#: utils.cc:642
+#: utils.cc:528
 msgid "icon \"%1\" not found for icon set \"%2\", fallback to default"
 msgstr ""
 
-#: utils.cc:649
+#: utils.cc:535
 msgid "cannot find icon image for %1 using %2"
 msgstr ""
 
-#: utils.cc:666 utils.cc:682
+#: utils.cc:552 utils.cc:568
 msgid "Caught exception while loading icon named %1"
 msgstr ""
 
+#: utils.cc:818
+msgid "Overwrite"
+msgstr ""
+
+#: vca_master_strip.cc:74 vca_time_axis.cc:49
+msgid "Solo slaves"
+msgstr ""
+
+#: vca_master_strip.cc:79 vca_time_axis.cc:55
+msgid "Mute slaves"
+msgstr ""
+
+#: vca_master_strip.cc:83
+msgid "Hide this VCA strip"
+msgstr ""
+
+#: vca_master_strip.cc:108 vca_master_strip.cc:418
+msgid "Click to show slaves only"
+msgstr ""
+
+#: vca_master_strip.cc:293
+msgid "A"
+msgstr ""
+
+#: vca_master_strip.cc:300
+msgid "S"
+msgstr ""
+
+#: vca_master_strip.cc:398
+msgid "Drop All Slaves"
+msgstr ""
+
+#: vca_master_strip.cc:421
+msgid "Click to show normal mixer"
+msgstr ""
+
 #: add_video_dialog.cc:54
 msgid "Set Video Track"
 msgstr ""
@@ -12357,32 +14446,48 @@ msgstr ""
 msgid " %1 fps"
 msgstr ""
 
-#: video_timeline.cc:468
+#: vca_time_axis.cc:60
+msgid "D"
+msgstr ""
+
+#: vca_time_axis.cc:61
+msgid "Unassign all slaves"
+msgstr ""
+
+#: vca_time_axis.cc:65
+msgid "V"
+msgstr ""
+
+#: vca_time_axis.cc:66
+msgid "Show only slaves"
+msgstr ""
+
+#: video_timeline.cc:472
 msgid ""
 "Parsing video file info failed. Is the Video Server running? Is the file "
 "readable by the Video Server? Does the docroot match? Is it a video file?"
 msgstr ""
 
-#: video_timeline.cc:506
+#: video_timeline.cc:510
 msgid ""
 "Failed to set session-framerate: '%1' does not have a corresponding option "
 "setting in %2."
 msgstr ""
 
-#: video_timeline.cc:514
+#: video_timeline.cc:518
 msgid ""
 "Video file's framerate is not equal to %1 session timecode's framerate: '%2' "
 "vs '%3'"
 msgstr ""
 
-#: video_timeline.cc:587
+#: video_timeline.cc:591
 msgid ""
 "Video-server docroot mismatch. %1: '%2', video-server: '%3'. This usually "
 "means that the video server was not started by %1 and uses a different "
 "document-root."
 msgstr ""
 
-#: video_timeline.cc:724
+#: video_timeline.cc:728
 msgid ""
 "Video-monitor 'xjadeo' was not found. Please install http://xjadeo.sf.net/ "
 "(a custom path to xjadeo can be specified by setting the XJREMOTE "
@@ -12392,25 +14497,25 @@ msgid ""
 "see also http://manual.ardour.org/video-timeline/setup/"
 msgstr ""
 
-#: video_timeline.cc:739
+#: video_timeline.cc:743
 msgid "Video-monitor 'xjadeo' cannot be launched."
 msgstr ""
 
-#: video_timeline.cc:766
+#: video_timeline.cc:775
 msgid ""
 "Video-monitor 'xjadeo' is too old. Please install xjadeo version 0.7.7 or "
 "later. http://xjadeo.sf.net/"
 msgstr ""
 
-#: video_monitor.cc:285
+#: video_monitor.cc:283
 msgid "Video Monitor: File Not Found."
 msgstr ""
 
 #: transcode_ffmpeg.cc:56
 msgid ""
-"No ffprobe or ffmpeg executables could be found on this system.\n"
-"Video import and export is not possible until you install those tools.\n"
+"ffmpeg installation was not found on this system.\n"
 "%1 requires ffmpeg and ffprobe from ffmpeg.org - version 1.1 or newer.\n"
+"Video import and export is not possible until you install tools.\n"
 "\n"
 "The tools are included with the %1 releases from ardour.org and also "
 "available with the video-server at http://x42.github.com/harvid/\n"
@@ -12432,7 +14537,7 @@ msgstr ""
 msgid "Output File:"
 msgstr ""
 
-#: transcode_video_dialog.cc:61 export_video_dialog.cc:85
+#: transcode_video_dialog.cc:61 export_video_dialog.cc:81
 msgid "Abort"
 msgstr ""
 
@@ -12441,10 +14546,14 @@ msgid "Height = "
 msgstr ""
 
 #: transcode_video_dialog.cc:66
+msgid "Extract LTC from audio and align video"
+msgstr ""
+
+#: transcode_video_dialog.cc:67
 msgid "Manual Override"
 msgstr ""
 
-#: transcode_video_dialog.cc:70 export_video_dialog.cc:103
+#: transcode_video_dialog.cc:71 export_video_dialog.cc:99
 msgid "Debug Mode: Print ffmpeg command and output to stdout."
 msgstr ""
 
@@ -12454,9 +14563,8 @@ msgstr ""
 
 #: transcode_video_dialog.cc:113
 msgid ""
-"No ffprobe or ffmpeg executables could be found on this system. Video Import "
-"is not possible until you install those tools. See the Log window for more "
-"information."
+"ffmpeg installation was not found. Video Import is not possible. See the Log "
+"window for more information."
 msgstr ""
 
 #: transcode_video_dialog.cc:120
@@ -12465,83 +14573,83 @@ msgid ""
 "unsupported video codec or format."
 msgstr ""
 
-#: transcode_video_dialog.cc:134
+#: transcode_video_dialog.cc:137
 msgid "FPS:"
 msgstr ""
 
-#: transcode_video_dialog.cc:136
-msgid "Duration:"
-msgstr ""
-
-#: transcode_video_dialog.cc:138
+#: transcode_video_dialog.cc:141
 msgid "Codec:"
 msgstr ""
 
-#: transcode_video_dialog.cc:140
+#: transcode_video_dialog.cc:143
 msgid "Geometry:"
 msgstr ""
 
-#: transcode_video_dialog.cc:155
+#: transcode_video_dialog.cc:158
 msgid "??"
 msgstr ""
 
-#: transcode_video_dialog.cc:176
+#: transcode_video_dialog.cc:179
 msgid "<b>Import Settings</b>"
 msgstr ""
 
-#: transcode_video_dialog.cc:181
-msgid "Reference From Current Location (Previously Transcoded Files Only)"
+#: transcode_video_dialog.cc:184
+msgid "Reference from Current Location (Previously Transcoded Files Only)"
 msgstr ""
 
-#: transcode_video_dialog.cc:183
+#: transcode_video_dialog.cc:185
 msgid "Import/Transcode Video to Session"
 msgstr ""
 
-#: transcode_video_dialog.cc:191
+#: transcode_video_dialog.cc:188 transcode_video_dialog.cc:198
 msgid "Do Not Import Video (Audio Import Only)"
 msgstr ""
 
-#: transcode_video_dialog.cc:200
+#: transcode_video_dialog.cc:208
+msgid "Do Not Import Video"
+msgstr ""
+
+#: transcode_video_dialog.cc:224
 msgid "Scale Video: Width = "
 msgstr ""
 
-#: transcode_video_dialog.cc:207
+#: transcode_video_dialog.cc:230
 msgid "Original Width"
 msgstr ""
 
-#: transcode_video_dialog.cc:222
+#: transcode_video_dialog.cc:245
 msgid "Bitrate (KBit/s):"
 msgstr ""
 
-#: transcode_video_dialog.cc:227
+#: transcode_video_dialog.cc:250
 msgid "Extract Audio:"
 msgstr ""
 
-#: transcode_video_dialog.cc:232
+#: transcode_video_dialog.cc:255
 msgid "No Audio Track Present"
 msgstr ""
 
-#: transcode_video_dialog.cc:235
+#: transcode_video_dialog.cc:258
 msgid "Do Not Extract Audio"
 msgstr ""
 
-#: transcode_video_dialog.cc:350
+#: transcode_video_dialog.cc:374
 msgid "Extracting Audio.."
 msgstr ""
 
-#: transcode_video_dialog.cc:353
+#: transcode_video_dialog.cc:377
 msgid "Audio Extraction Failed."
 msgstr ""
 
-#: transcode_video_dialog.cc:379
+#: transcode_video_dialog.cc:403
 msgid "Transcoding Video.."
 msgstr ""
 
-#: transcode_video_dialog.cc:413
+#: transcode_video_dialog.cc:437
 msgid "Transcoding Failed."
 msgstr ""
 
-#: transcode_video_dialog.cc:503
+#: transcode_video_dialog.cc:541
 msgid "Save Transcoded Video File"
 msgstr ""
 
@@ -12561,7 +14669,7 @@ msgstr ""
 msgid "Don't show this dialog again. (Reset in Edit->Preferences)."
 msgstr "Don't show this dialogue again. (Reset in Edit->Preferences)."
 
-#: video_server_dialog.cc:97
+#: video_server_dialog.cc:94
 msgid ""
 "The external video server 'harvid' can not be found.\n"
 "The tool is included with the %1 releases from ardour.org, alternatively you "
@@ -12571,197 +14679,188 @@ msgid ""
 "see also http://manual.ardour.org/video-timeline/setup/"
 msgstr ""
 
-#: video_server_dialog.cc:129
+#: video_server_dialog.cc:126
 msgid "Listen Address:"
 msgstr ""
 
-#: video_server_dialog.cc:134
+#: video_server_dialog.cc:131
 msgid "Listen Port:"
 msgstr ""
 
-#: video_server_dialog.cc:139
+#: video_server_dialog.cc:136
 msgid "Cache Size:"
 msgstr ""
 
-#: video_server_dialog.cc:145
+#: video_server_dialog.cc:142
 msgid ""
 "%1 relies on an external video server for the videotimeline.\n"
 "The server configured in Edit -> Preferences -> Video is not reachable.\n"
 "Do you want %1 to launch 'harvid' on this machine?"
 msgstr ""
 
-#: video_server_dialog.cc:189
+#: video_server_dialog.cc:186
 msgid "Set Video Server Executable"
 msgstr ""
 
-#: video_server_dialog.cc:209
+#: video_server_dialog.cc:206
 msgid "Server docroot"
 msgstr ""
 
-#: utils_videotl.cc:60
+#: utils_videotl.cc:61
 msgid "Destination is outside Video Server's docroot. "
 msgstr ""
 
-#: utils_videotl.cc:61
+#: utils_videotl.cc:62
 msgid ""
 "The destination file path is outside of the Video Server's docroot. The file "
 "will not be readable by the Video Server. Do you still want to continue?"
 msgstr ""
 
-#: utils_videotl.cc:64
+#: utils_videotl.cc:65
 msgid "Continue"
 msgstr ""
 
-#: utils_videotl.cc:70
+#: utils_videotl.cc:72
 msgid "Confirm Overwrite"
 msgstr ""
 
-#: utils_videotl.cc:71
-msgid "A file with the same name already exists.  Do you want to overwrite it?"
-msgstr ""
-
-#: utils_videotl.cc:81 utils_videotl.cc:97
+#: utils_videotl.cc:82 utils_videotl.cc:98
 msgid "Cannot create video folder \"%1\" (%2)"
 msgstr ""
 
-#: export_video_dialog.cc:71
+#: export_video_dialog.cc:67
 msgid "Export Video File "
 msgstr ""
 
-#: export_video_dialog.cc:82
+#: export_video_dialog.cc:78
 msgid "Video:"
 msgstr ""
 
-#: export_video_dialog.cc:87
+#: export_video_dialog.cc:83
 msgid "Scale Video (W x H):"
 msgstr ""
 
-#: export_video_dialog.cc:88
+#: export_video_dialog.cc:84
 msgid "Retain Aspect"
 msgstr ""
 
-#: export_video_dialog.cc:93
+#: export_video_dialog.cc:89
 msgid "Set Aspect Ratio:"
 msgstr ""
 
-#: export_video_dialog.cc:94
+#: export_video_dialog.cc:90
 msgid "Normalize Audio"
 msgstr "Normalise Audio"
 
-#: export_video_dialog.cc:95
+#: export_video_dialog.cc:91
 msgid "2 Pass Encoding"
 msgstr ""
 
-#: export_video_dialog.cc:96
+#: export_video_dialog.cc:92
 msgid "Codec Optimizations:"
 msgstr "Codec Optimisations:"
 
-#: export_video_dialog.cc:98
+#: export_video_dialog.cc:94
 msgid "Deinterlace"
 msgstr ""
 
-#: export_video_dialog.cc:99
+#: export_video_dialog.cc:95
 msgid "Use [2] B-frames (MPEG 2 or 4 only)"
 msgstr ""
 
-#: export_video_dialog.cc:100
+#: export_video_dialog.cc:96
 msgid "Override FPS (Default is to retain FPS from the input video file):"
 msgstr ""
 
-#: export_video_dialog.cc:101
+#: export_video_dialog.cc:97
 msgid "Include Session Metadata"
 msgstr ""
 
-#: export_video_dialog.cc:119
+#: export_video_dialog.cc:115
 msgid ""
-"No ffprobe or ffmpeg executables could be found on this system. Video Export "
-"is not possible until you install those tools. See the Log window for more "
-"information."
+"ffmpeg installation was not found. Video Export is not possible. See the Log "
+"window for more information."
 msgstr ""
 
-#: export_video_dialog.cc:130
+#: export_video_dialog.cc:126
 msgid "<b>Output:</b> (file extension defines format)"
 msgstr ""
 
-#: export_video_dialog.cc:140
+#: export_video_dialog.cc:136
 msgid "<b>Input Video:</b>"
 msgstr ""
 
-#: export_video_dialog.cc:151
+#: export_video_dialog.cc:147
 msgid "Audio:"
 msgstr ""
 
-#: export_video_dialog.cc:153
+#: export_video_dialog.cc:149
 msgid "Master Bus"
 msgstr ""
 
-#: export_video_dialog.cc:158
+#: export_video_dialog.cc:153
 msgid "from the %1 session's start to the session's end"
 msgstr ""
 
-#: export_video_dialog.cc:161
+#: export_video_dialog.cc:156
 msgid "<b>Settings:</b>"
 msgstr ""
 
-#: export_video_dialog.cc:169
+#: export_video_dialog.cc:164
 msgid "Range:"
 msgstr ""
 
-#: export_video_dialog.cc:172
-msgid "Preset:"
-msgstr ""
-
-#: export_video_dialog.cc:175
+#: export_video_dialog.cc:170
 msgid "Video Codec:"
 msgstr ""
 
-#: export_video_dialog.cc:178
+#: export_video_dialog.cc:173
 msgid "Video KBit/s:"
 msgstr ""
 
-#: export_video_dialog.cc:181
+#: export_video_dialog.cc:176
 msgid "Audio Codec:"
 msgstr ""
 
-#: export_video_dialog.cc:184
+#: export_video_dialog.cc:179
 msgid "Audio KBit/s:"
 msgstr ""
 
-#: export_video_dialog.cc:187
+#: export_video_dialog.cc:182
 msgid "Audio Samplerate:"
 msgstr ""
 
-#: export_video_dialog.cc:222 export_video_dialog.cc:231
+#: export_video_dialog.cc:215 export_video_dialog.cc:223
 #: export_video_dialog.cc:814 export_video_dialog.cc:817
 msgid "(default for format)"
 msgstr ""
 
-#: export_video_dialog.cc:242 export_video_dialog.cc:255
+#: export_video_dialog.cc:233 export_video_dialog.cc:244
 #: export_video_dialog.cc:821 export_video_dialog.cc:830
 msgid "(default)"
 msgstr ""
 
-#: export_video_dialog.cc:256 export_video_dialog.cc:824
+#: export_video_dialog.cc:245 export_video_dialog.cc:824
 msgid "(retain)"
 msgstr ""
 
-#: export_video_dialog.cc:348
+#: export_video_dialog.cc:335
 msgid "from 00:00:00:00 to the video's end"
 msgstr ""
 
-#: export_video_dialog.cc:350
+#: export_video_dialog.cc:337
 msgid "from the video's start to the video's end"
 msgstr ""
 
-#: export_video_dialog.cc:353
+#: export_video_dialog.cc:340
 msgid "Selected range"
 msgstr ""
 
-#: export_video_dialog.cc:573
+#: export_video_dialog.cc:561
 msgid "Normalizing audio"
 msgstr "Normalising audio"
 
-#: export_video_dialog.cc:577
+#: export_video_dialog.cc:566 export_video_dialog.cc:571
 msgid "Exporting audio"
 msgstr ""
 
@@ -12821,12 +14920,29 @@ msgstr ""
 
 #: export_video_infobox.cc:51
 msgid ""
+"%1 does not include commercial licenses for encoding audio/video. Visit "
+"mpegla.com for information about licensing various audio/video codecs.\n"
+"\n"
 "Video encoding is a non-trivial task with many details.\n"
 "\n"
-"Please see the manual at %1/video-timeline/operations/#export.\n"
+"Please see the manual at %2/video-timeline/operations/#export.\n"
 "\n"
 "Open Manual in Browser? "
 msgstr ""
+"%1 does not include commercial licences for encoding audio/video. Visit "
+"mpegla.com for information about licensing various audio/video codecs.\n"
+"\n"
+"Video encoding is a non-trivial task with many details.\n"
+"\n"
+"Please see the manual at %2/video-timeline/operations/#export.\n"
+"\n"
+"Open Manual in Browser? "
+
+#~ msgid "Normalize values"
+#~ msgstr "Normalise values"
+
+#~ msgid "Color file %1 not found"
+#~ msgstr "Colour file %1 not found"
 
 #~ msgid "Show Measures"
 #~ msgstr "Show Bar Lines"
diff --git a/gtk2_ardour/po/es.mo b/gtk2_ardour/po/es.mo
new file mode 100644
index 0000000..535629e
Binary files /dev/null and b/gtk2_ardour/po/es.mo differ
diff --git a/gtk2_ardour/po/es.po b/gtk2_ardour/po/es.po
index d0f6f39..8771dca 100644
--- a/gtk2_ardour/po/es.po
+++ b/gtk2_ardour/po/es.po
@@ -2,8 +2,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: gtk2_ardour\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-03-31 20:13-0400\n"
-"PO-Revision-Date: 2015-03-16 19:51+0100\n"
+"POT-Creation-Date: 2016-07-25 23:52+0200\n"
+"PO-Revision-Date: 2016-07-27 21:44+0100\n"
 "Last-Translator: Pablo Fernández <pablo.fbus at gmail.com>\n"
 "Language-Team: \n"
 "Language: es\n"
@@ -14,255 +14,287 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=n>1;\n"
 "X-Generator: Poedit 1.5.4\n"
 
-#: about.cc:125
+#: about.cc:127
+msgid "Fons Adriaensen"
+msgstr "Fons Adriaensen"
+
+#: about.cc:128
 msgid "Brian Ahr"
 msgstr "Brian Ahr"
 
-#: about.cc:126
+#: about.cc:129
 msgid "John Anderson"
 msgstr "John Anderson"
 
-#: about.cc:127
+#: about.cc:130
 msgid "Marcus Andersson"
 msgstr "Marcus Andersson"
 
-#: about.cc:128
+#: about.cc:131
 msgid "Nedko Arnaudov"
 msgstr "Nedko Arnaudov"
 
-#: about.cc:129
+#: about.cc:132
 msgid "Hans Baier"
 msgstr "Hans Baier"
 
-#: about.cc:130
+#: about.cc:133
 msgid "Ben Bell"
 msgstr "Ben Bell"
 
-#: about.cc:131
+#: about.cc:134
 msgid "Sakari Bergen"
 msgstr "Sakari Bergen"
 
-#: about.cc:132
+#: about.cc:135
 msgid "Christian Borss"
 msgstr "Christian Borss"
 
-#: about.cc:133
+#: about.cc:136
 msgid "Chris Cannam"
 msgstr "Chris Cannam"
 
-#: about.cc:134
+#: about.cc:137
 msgid "Jeremy Carter"
 msgstr "Jeremy Carter"
 
-#: about.cc:135
+#: about.cc:138
 msgid "Jesse Chappell"
 msgstr "Jesse Chappell"
 
-#: about.cc:136
+#: about.cc:139
 msgid "Thomas Charbonnel"
 msgstr "Thomas Charbonnel"
 
-#: about.cc:137
+#: about.cc:140
 msgid "Sam Chessman"
 msgstr "Sam Chessman"
 
-#: about.cc:138
+#: about.cc:141
 msgid "André Colomb"
 msgstr "André Colomb"
 
-#: about.cc:139
+#: about.cc:142
 msgid "Paul Davis"
 msgstr "Paul Davis"
 
-#: about.cc:140
+#: about.cc:143
 msgid "Gerard van Dongen"
 msgstr "Gerard van Dongen"
 
-#: about.cc:141
+#: about.cc:144
 msgid "John Emmas"
-msgstr ""
+msgstr "John Emmas"
 
-#: about.cc:142
+#: about.cc:145
 msgid "Colin Fletcher"
 msgstr "Colin Fletcher"
 
-#: about.cc:143
+#: about.cc:146
 msgid "Dave Flick"
 msgstr "Dave Flick"
 
-#: about.cc:144
+#: about.cc:147
 msgid "Hans Fugal"
 msgstr "Hans Fugal"
 
-#: about.cc:145
+#: about.cc:148
 msgid "Robin Gareus"
 msgstr "Robin Gareus"
 
-#: about.cc:146
+#: about.cc:149
+msgid "Nil Geisweiller"
+msgstr "Nil Geisweiller"
+
+#: about.cc:150
 msgid "Christopher George"
 msgstr "Christopher George"
 
-#: about.cc:147
+#: about.cc:151
 msgid "Chris Goddard"
 msgstr "Chris Goddard"
 
-#: about.cc:148
+#: about.cc:152
 msgid "J. Abelardo Gutierrez"
 msgstr "J. Abelardo Gutierrez"
 
-#: about.cc:149
+#: about.cc:153
 msgid "Jeremy Hall"
 msgstr "Jeremy Hall"
 
-#: about.cc:150
+#: about.cc:154
 msgid "Audun Halland"
 msgstr "Audun Halland"
 
-#: about.cc:151
+#: about.cc:155
 msgid "David Halter"
 msgstr "David Halter"
 
-#: about.cc:152
+#: about.cc:156
 msgid "Steve Harris"
 msgstr "Steve Harris"
 
-#: about.cc:153
+#: about.cc:157
 msgid "Melvin Ray Herr"
 msgstr "Melvin Ray Herr"
 
-#: about.cc:154
+#: about.cc:158
 msgid "Carl Hetherington"
 msgstr "Carl Hetherington"
 
-#: about.cc:155
+#: about.cc:159
 msgid "Rob Holland"
 msgstr "Rob Holland"
 
-#: about.cc:156
+#: about.cc:160
 msgid "Robert Jordens"
 msgstr "Robert Jordens"
 
-#: about.cc:157
+#: about.cc:161
 msgid "Stefan Kersten"
 msgstr "Stefan Kersten"
 
-#: about.cc:158
+#: about.cc:162
 msgid "Armand Klenk"
 msgstr "Armand Klenk"
 
-#: about.cc:159
+#: about.cc:163
 msgid "Julien de Kozak"
 msgstr "Julien de Kozak"
 
-#: about.cc:160
+#: about.cc:164
 msgid "Matt Krai"
 msgstr "Matt Krai"
 
-#: about.cc:161
+#: about.cc:165
 msgid "Georg Krause"
-msgstr ""
+msgstr "Georg Krause"
 
-#: about.cc:162
+#: about.cc:166
 msgid "Nick Lanham"
 msgstr "Nick Lanham"
 
-#: about.cc:163
+#: about.cc:167
 msgid "Colin Law"
 msgstr "Colin Law"
 
-#: about.cc:164
+#: about.cc:168
 msgid "Joshua Leach"
 msgstr "Joshua Leach"
 
-#: about.cc:165
+#: about.cc:169
 msgid "Ben Loftis"
 msgstr "Ben Loftis"
 
-#: about.cc:166
+#: about.cc:170
 msgid "Nick Mainsbridge"
 msgstr "Nick Mainsbridge"
 
-#: about.cc:167
+#: about.cc:171
 msgid "Tim Mayberry"
 msgstr "Tim Mayberry"
 
-#: about.cc:168
+#: about.cc:172
 msgid "Doug Mclain"
 msgstr "Doug Mclain"
 
-#: about.cc:169
+#: about.cc:173
 msgid "Todd Naugle"
-msgstr ""
+msgstr "Todd Naugle"
 
-#: about.cc:170
+#: about.cc:174
+msgid "André Nusser"
+msgstr "André Nusser"
+
+#: about.cc:175
+msgid "Bent Bisballe Nyeng"
+msgstr "Bent Bisballe Nyeng"
+
+#: about.cc:176
 msgid "Jack O'Quin"
 msgstr "Jack O'Quin"
 
-#: about.cc:171
+#: about.cc:177
+msgid "Pavel Potocek"
+msgstr "Pavel Potocek"
+
+#: about.cc:178
 msgid "Nimal Ratnayake"
 msgstr "Nimal Ratnayake"
 
-#: about.cc:172
+#: about.cc:179
+msgid "Julien Rivaud"
+msgstr "Julien Rivaud"
+
+#: about.cc:180
 msgid "David Robillard"
 msgstr "David Robillard"
 
-#: about.cc:173
+#: about.cc:181
+msgid "Julien Roger"
+msgstr "Julien Roger"
+
+#: about.cc:182
 msgid "Taybin Rutkin"
 msgstr "Taybin Rutkin"
 
-#: about.cc:174
+#: about.cc:183
 msgid "Andreas Ruge"
 msgstr "Andreas Ruge"
 
-#: about.cc:175
+#: about.cc:184
 msgid "Sampo Savolainen"
 msgstr "Sampo Savolainen"
 
-#: about.cc:176
+#: about.cc:185
 msgid "Rodrigo Severo"
 msgstr "Rodrigo Severo"
 
-#: about.cc:177
+#: about.cc:186
 msgid "Per Sigmond"
 msgstr "Per Sigmond"
 
-#: about.cc:178
+#: about.cc:187
 msgid "Lincoln Spiteri"
 msgstr "Lincoln Spiteri"
 
-#: about.cc:179
+#: about.cc:188
 msgid "Mike Start"
 msgstr "Mike Start"
 
-#: about.cc:180
+#: about.cc:189
 msgid "Mark Stewart"
 msgstr "Mark Stewart"
 
-#: about.cc:181
+#: about.cc:190
 msgid "Roland Stigge"
 msgstr "Roland Stigge"
 
-#: about.cc:182
+#: about.cc:191
 msgid "Petter Sundlöf"
 msgstr "Petter Sundlöf"
 
-#: about.cc:183
+#: about.cc:192
 msgid "Mike Täht"
 msgstr "Mike Täht"
 
-#: about.cc:184
+#: about.cc:193
 msgid "Roy Vegard"
 msgstr "Roy Vegard"
 
-#: about.cc:185
+#: about.cc:194
 msgid "Thorsten Wilms"
 msgstr "Thorsten Wilms"
 
-#: about.cc:186
+#: about.cc:195
+msgid "Damien Zammit"
+msgstr "Damien Zammit"
+
+#: about.cc:196
 msgid "Grygorii Zharun"
-msgstr ""
+msgstr "Grygorii Zharun"
 
-#: about.cc:191
+#: about.cc:201
 msgid ""
 "French:\n"
 "\tAlain Fréhel <alain.frehel at free.fr>\n"
@@ -276,7 +308,7 @@ msgstr ""
 "\tMartin Blanchard\n"
 "\tRomain Arnaud <roming22 at gmail.com>\n"
 
-#: about.cc:192
+#: about.cc:202
 msgid ""
 "German:\n"
 "\tKarsten Petersen <kapet at kapet.de>\n"
@@ -296,7 +328,7 @@ msgstr ""
 "\tRichard Oax <richard at pagliacciempire.de>\n"
 "\tRobin Gloster <robin at loc-com.de>\n"
 
-#: about.cc:199
+#: about.cc:209
 msgid ""
 "Italian:\n"
 "\tFilippo Pappalardo <filippo at email.it>\n"
@@ -306,7 +338,7 @@ msgstr ""
 "\tFilippo Pappalardo <filippo at email.it>\n"
 "\tRaffaele Morelli <raffaele.morelli at gmail.com>\n"
 
-#: about.cc:200
+#: about.cc:210
 msgid ""
 "Portuguese:\n"
 "\tRui Nuno Capela <rncbc at rncbc.org>\n"
@@ -314,7 +346,7 @@ msgstr ""
 "Portugués:\n"
 "\tRui Nuno Capela <rncbc at rncbc.org>\n"
 
-#: about.cc:201
+#: about.cc:211
 msgid ""
 "Brazilian Portuguese:\n"
 "\tAlexander da Franca Fernandes <alexander at nautae.eti.br>\n"
@@ -324,7 +356,7 @@ msgstr ""
 "\tAlexander da Franca Fernandes <alexander at nautae.eti.br>\n"
 "\tChris Ross <chris at tebibyte.org>\n"
 
-#: about.cc:203
+#: about.cc:213
 msgid ""
 "Spanish:\n"
 "\t Alex Krohn <alexkrohn at fastmail.fm>\n"
@@ -334,7 +366,7 @@ msgstr ""
 "\t Alex Krohn <alexkrohn at fastmail.fm>\n"
 "\tPablo Fernández <pablo.fbus at gmail.com>\n"
 
-#: about.cc:204
+#: about.cc:214
 msgid ""
 "Russian:\n"
 "\t Igor Blinov <pitstop at nm.ru>\n"
@@ -344,7 +376,7 @@ msgstr ""
 "\t Igor Blinov <pitstop at nm.ru>\n"
 "\tAlexandre Prokoudine <alexandre.prokoudine at gmail.com>\n"
 
-#: about.cc:206
+#: about.cc:216
 msgid ""
 "Greek:\n"
 "\t Klearchos Gourgourinis <muadib at in.gr>\n"
@@ -352,7 +384,7 @@ msgstr ""
 "Griego:\n"
 "\t Klearchos Gourgourinis <muadib at in.gr>\n"
 
-#: about.cc:207
+#: about.cc:217
 msgid ""
 "Swedish:\n"
 "\t Petter Sundlöf <petter.sundlof at gmail.com>\n"
@@ -360,7 +392,7 @@ msgstr ""
 "Sueco:\n"
 "\t Petter Sundlöf <petter.sundlof at gmail.com>\n"
 
-#: about.cc:208
+#: about.cc:218
 msgid ""
 "Polish:\n"
 "\t Piotr Zaryk <pzaryk at gmail.com>\n"
@@ -368,7 +400,7 @@ msgstr ""
 "Polaco:\n"
 "\t Piotr Zaryk <pzaryk at gmail.com>\n"
 
-#: about.cc:209
+#: about.cc:219
 msgid ""
 "Czech:\n"
 "\t Pavel Fric <pavelfric at seznam.cz>\n"
@@ -376,7 +408,7 @@ msgstr ""
 "Checo:\n"
 "\t Pavel Fric <pavelfric at seznam.cz>\n"
 
-#: about.cc:210
+#: about.cc:220
 msgid ""
 "Norwegian:\n"
 "\t Eivind Ødegård\n"
@@ -384,7 +416,7 @@ msgstr ""
 "Noruego:\n"
 "\t Eivind Ødegård\n"
 
-#: about.cc:211
+#: about.cc:221
 msgid ""
 "Chinese:\n"
 "\t Rui-huai Zhang <zrhzrh at mail.ustc.edu.cn>\n"
@@ -392,143 +424,200 @@ msgstr ""
 "Chino:\n"
 "\t Rui-huai Zhang <zrhzrh at mail.ustc.edu.cn>\n"
 
-#: about.cc:591
+#: about.cc:601
+msgid "Intel 64-bit"
+msgstr "Intel 64-bit"
+
+#: about.cc:603
+msgid "Intel 32-bit"
+msgstr "Intel 32-bit"
+
+#: about.cc:605
+msgid "PowerPC 64-bit"
+msgstr "PowerPC 64-bit"
+
+#: about.cc:607
+msgid "PowerPC 32-bit"
+msgstr "PowerPC 32-bit"
+
+#: about.cc:609
+msgid "64-bit"
+msgstr "64-bit"
+
+#: about.cc:611
+msgid "32-bit"
+msgstr "32-bit"
+
+#: about.cc:619
+msgid " - debug"
+msgstr " - debug"
+
+#: about.cc:625
 msgid "Copyright (C) 1999-2015 Paul Davis\n"
 msgstr "Copyright (C) 1999-2015 Paul Davis\n"
 
-#: about.cc:595
+#: about.cc:629
 msgid "http://ardour.org/"
 msgstr "http://ardour.org/"
 
-#: about.cc:596
+#: about.cc:630
 msgid ""
 "%1%2\n"
-"(built from revision %3)"
+"(rev %3)\n"
+"%4%5"
 msgstr ""
 "%1%2\n"
-"(compilado a partir de revisión %3)"
+"(rev %3)\n"
+"%4%5"
 
-#: about.cc:600
+#: about.cc:635
 msgid "Config"
 msgstr "Config"
 
-#: actions.cc:85
+#: actions.cc:83
 msgid "Loading menus from %1"
 msgstr "Cargando menús desde %1"
 
-#: actions.cc:88 actions.cc:89
+#: actions.cc:86 actions.cc:87
 msgid "badly formatted menu definition file: %1"
 msgstr "badly formatted menu definition file: %1"
 
-#: actions.cc:91
+#: actions.cc:89
 msgid "%1 menu definition file not found"
 msgstr "%1 archivo de definición de menú no encontrado"
 
-#: actions.cc:95 actions.cc:96
+#: actions.cc:93 actions.cc:94
 msgid "%1 will not work without a valid menu definition file"
 msgstr "%1 will not work without a valid menu definition file"
 
-#: add_route_dialog.cc:54 route_params_ui.cc:524
-msgid "Add Track or Bus"
-msgstr "Añadir pista o bus"
+#: add_route_dialog.cc:58
+msgid "Add Track/Bus/VCA"
+msgstr "Añadir Pista/Bus/VCA"
 
-#: add_route_dialog.cc:57
+#: add_route_dialog.cc:61
 msgid "Configuration:"
 msgstr "Configuración:"
 
-#: add_route_dialog.cc:58
+#: add_route_dialog.cc:62
 msgid "Record Mode:"
-msgstr "Modo de grabación:"
+msgstr "Modo grabación:"
 
-#: add_route_dialog.cc:59
+#: add_route_dialog.cc:63
 msgid "Instrument:"
 msgstr "Instrumento:"
 
-#: add_route_dialog.cc:77
+#: add_route_dialog.cc:77 add_route_dialog.cc:228
 msgid "Audio Tracks"
 msgstr "Pistas de audio"
 
-#: add_route_dialog.cc:78 add_route_dialog.cc:209
+#: add_route_dialog.cc:78 add_route_dialog.cc:224
 msgid "MIDI Tracks"
 msgstr "Pistas MIDI"
 
-#: add_route_dialog.cc:79 add_route_dialog.cc:211
+#: add_route_dialog.cc:79 add_route_dialog.cc:226
 msgid "Audio+MIDI Tracks"
 msgstr "Pistas de audio+MIDI"
 
-# es correcto utilizar 'buses' en español? -> al parecer sí, desde hace poc. Chequear: http://buscon.rae.es/draeI/SrvltObtenerHtml?IDLEMA=12558&NEDIC=Si
-#: add_route_dialog.cc:80 add_route_dialog.cc:207
-msgid "Busses"
-msgstr "Buses"
+#: add_route_dialog.cc:80 add_route_dialog.cc:220
+msgid "Audio Busses"
+msgstr "Buses de audio"
+
+#: add_route_dialog.cc:81 add_route_dialog.cc:222
+msgid "MIDI Busses"
+msgstr "Buses MIDI"
 
-#: add_route_dialog.cc:83 add_route_dialog.cc:559
+#: add_route_dialog.cc:82
+msgid "VCA Masters"
+msgstr "Masters VCA"
+
+#: add_route_dialog.cc:85 add_route_dialog.cc:622
 msgid "First"
-msgstr ""
+msgstr "Primero"
 
-#: add_route_dialog.cc:84 add_route_dialog.cc:561
-msgid "After Editor Selection"
-msgstr ""
+#: add_route_dialog.cc:86 add_route_dialog.cc:626
+msgid "Before Selection"
+msgstr "Antes de selección"
 
-#: add_route_dialog.cc:85 add_route_dialog.cc:563
-msgid "After Mixer Selection"
-msgstr ""
+#: add_route_dialog.cc:87 add_route_dialog.cc:624
+msgid "After Selection"
+msgstr "Después de selección"
 
-#: add_route_dialog.cc:86
+#: add_route_dialog.cc:88
 msgid "Last"
-msgstr ""
+msgstr "Último"
+
+#: add_route_dialog.cc:91
+msgid "Flexible-I/O"
+msgstr "E/S flexible"
 
-#: add_route_dialog.cc:103
+#: add_route_dialog.cc:92
+msgid "Strict-I/O"
+msgstr "E/S estricto"
+
+#: add_route_dialog.cc:108
 msgid "Add:"
 msgstr "Añadir:"
 
-#: add_route_dialog.cc:116 time_fx_dialog.cc:91 add_video_dialog.cc:135
-#: video_server_dialog.cc:121
+#: add_route_dialog.cc:121 time_fx_dialog.cc:101 add_video_dialog.cc:136
+#: video_server_dialog.cc:118
 msgid "<b>Options</b>"
 msgstr "<b>Opciones</b>"
 
-#: add_route_dialog.cc:126 bundle_manager.cc:193 region_editor.cc:50
-#: route_group_dialog.cc:71
+#: add_route_dialog.cc:131 bundle_manager.cc:193 region_editor.cc:52
+#: route_group_dialog.cc:70
 msgid "Name:"
 msgstr "Nombre:"
 
-#: add_route_dialog.cc:156
+#: add_route_dialog.cc:155
 msgid "Group:"
 msgstr "Grupo:"
 
-#: add_route_dialog.cc:162
+#: add_route_dialog.cc:161
 msgid "Insert:"
+msgstr "Insertar:"
+
+#: add_route_dialog.cc:171
+msgid "Output Ports:"
+msgstr "Puertos de salida:"
+
+#: add_route_dialog.cc:176 rc_option_editor.cc:2474
+msgid ""
+"With strict-i/o enabled, Effect Processors will not modify the number of "
+"channels on a track. The number of output channels will always match the "
+"number of input channels."
 msgstr ""
+"Si E/S estricto está habilitado, los procesadores de efectos no modificarán "
+"el número de canales de una pista. El número de canales de salida siempre "
+"coincidirá con el número de canales de entrada."
 
-#: add_route_dialog.cc:223 add_route_dialog.cc:232 add_route_dialog.cc:306
-#: ardour_ui_ed.cc:539 engine_dialog.cc:237 rc_option_editor.cc:1805
-#: rc_option_editor.cc:1807 rc_option_editor.cc:1809 rc_option_editor.cc:1827
-#: rc_option_editor.cc:1829 rc_option_editor.cc:1837 rc_option_editor.cc:1839
-#: rc_option_editor.cc:1857 rc_option_editor.cc:1870 rc_option_editor.cc:1872
-#: rc_option_editor.cc:1874 rc_option_editor.cc:1919 rc_option_editor.cc:1921
-#: rc_option_editor.cc:1923 rc_option_editor.cc:1931 rc_option_editor.cc:1939
-#: rc_option_editor.cc:1941 rc_option_editor.cc:1949
+#: add_route_dialog.cc:240 add_route_dialog.cc:351 ardour_ui_ed.cc:625
+#: engine_dialog.cc:244 plugin_pin_dialog.cc:67 rc_option_editor.cc:2397
+#: rc_option_editor.cc:2399 rc_option_editor.cc:2401 rc_option_editor.cc:2419
+#: rc_option_editor.cc:2421 rc_option_editor.cc:2429 rc_option_editor.cc:2432
+#: rc_option_editor.cc:2450 rc_option_editor.cc:2463 rc_option_editor.cc:2472
+#: rc_option_editor.cc:2478 rc_option_editor.cc:2480 rc_option_editor.cc:2525
+#: rc_option_editor.cc:2527 rc_option_editor.cc:2529 rc_option_editor.cc:2537
 msgid "Audio"
 msgstr "Audio"
 
-#: add_route_dialog.cc:224 add_route_dialog.cc:235 add_route_dialog.cc:307
-#: editor_actions.cc:109 engine_dialog.cc:239 missing_file_dialog.cc:56
-#: rc_option_editor.cc:2084 rc_option_editor.cc:2094 rc_option_editor.cc:2102
-#: rc_option_editor.cc:2110 rc_option_editor.cc:2119 rc_option_editor.cc:2127
-#: rc_option_editor.cc:2135 rc_option_editor.cc:2143 rc_option_editor.cc:2152
-#: rc_option_editor.cc:2161 rc_option_editor.cc:2170 rc_option_editor.cc:2178
-#: rc_option_editor.cc:2186 rc_option_editor.cc:2194 rc_option_editor.cc:2217
+#: add_route_dialog.cc:243 add_route_dialog.cc:352 editor_actions.cc:112
+#: engine_dialog.cc:246 missing_file_dialog.cc:60 mixer_ui.cc:1895
+#: plugin_pin_dialog.cc:68 rc_option_editor.cc:2672 rc_option_editor.cc:2674
+#: rc_option_editor.cc:2684 rc_option_editor.cc:2693 rc_option_editor.cc:2701
+#: rc_option_editor.cc:2709 rc_option_editor.cc:2717 rc_option_editor.cc:2790
+#: rc_option_editor.cc:2813
 msgid "MIDI"
 msgstr "MIDI"
 
-#: add_route_dialog.cc:225 add_route_dialog.cc:238 add_route_dialog.cc:308
+#: add_route_dialog.cc:246 add_route_dialog.cc:353
 msgid "Audio+MIDI"
 msgstr "Audio+MIDI"
 
-#: add_route_dialog.cc:226 add_route_dialog.cc:241 add_route_dialog.cc:309
+#: add_route_dialog.cc:250 add_route_dialog.cc:354
 msgid "Bus"
 msgstr "Bus"
 
-#: add_route_dialog.cc:268
+#: add_route_dialog.cc:286
 msgid ""
 "Audio+MIDI tracks are intended for use <b>ONLY</b> with plugins that use "
 "both audio and MIDI input data\n"
@@ -541,60 +630,61 @@ msgstr ""
 "\n"
 "Si no vas a usar un plugin de este tipo, usa una pista normal audio o MIDI."
 
-#: add_route_dialog.cc:327 add_route_dialog.cc:346 editor_actions.cc:422
-#: editor_rulers.cc:251 time_axis_view.cc:1374
+#: add_route_dialog.cc:373 add_route_dialog.cc:385 editor_actions.cc:456
+#: editor_rulers.cc:250 time_axis_view.cc:1290
 msgid "Normal"
 msgstr "Normal"
 
-#: add_route_dialog.cc:330 add_route_dialog.cc:348
+#: add_route_dialog.cc:374 add_route_dialog.cc:387
 msgid "Non Layered"
 msgstr "Sin capas"
 
-#: add_route_dialog.cc:331 add_route_dialog.cc:350
+#: add_route_dialog.cc:375 add_route_dialog.cc:389
 msgid "Tape"
 msgstr "Cinta"
 
-#: add_route_dialog.cc:431 monitor_section.cc:290
+#: add_route_dialog.cc:476 monitor_section.cc:273 plugin_pin_dialog.cc:509
+#: plugin_setup_dialog.cc:202
 msgid "Mono"
 msgstr "Mono"
 
-#: add_route_dialog.cc:435
+#: add_route_dialog.cc:480 plugin_pin_dialog.cc:512 plugin_setup_dialog.cc:205
 msgid "Stereo"
 msgstr "Estéreo"
 
-#: add_route_dialog.cc:459
+#: add_route_dialog.cc:503
 msgid "3 Channel"
 msgstr "3 Canales"
 
-#: add_route_dialog.cc:463
+#: add_route_dialog.cc:507
 msgid "4 Channel"
 msgstr "4 Canales"
 
-#: add_route_dialog.cc:467
+#: add_route_dialog.cc:511
 msgid "5 Channel"
 msgstr "5 Canales"
 
-#: add_route_dialog.cc:471
+#: add_route_dialog.cc:515
 msgid "6 Channel"
 msgstr "6 Canales"
 
-#: add_route_dialog.cc:475
+#: add_route_dialog.cc:519
 msgid "8 Channel"
 msgstr "8 Canales"
 
-#: add_route_dialog.cc:479
+#: add_route_dialog.cc:523
 msgid "12 Channel"
 msgstr "12 Canales"
 
-#: add_route_dialog.cc:483 mixer_strip.cc:1836 mixer_strip.cc:2244
+#: add_route_dialog.cc:527 mixer_strip.cc:2009 mixer_strip.cc:2455
 msgid "Custom"
 msgstr "Personalizado"
 
-#: add_route_dialog.cc:516 add_route_dialog.cc:532 route_group_menu.cc:81
+#: add_route_dialog.cc:569 add_route_dialog.cc:585 route_group_menu.cc:85
 msgid "New Group..."
 msgstr "Nuevo grupo..."
 
-#: add_route_dialog.cc:520 route_group_menu.cc:85
+#: add_route_dialog.cc:573 route_group_menu.cc:89
 msgid "No Group"
 msgstr "Sin grupo"
 
@@ -602,7 +692,7 @@ msgstr "Sin grupo"
 msgid "Ambiguous File"
 msgstr "Archivo ambiguo"
 
-#: ambiguous_file_dialog.cc:35
+#: ambiguous_file_dialog.cc:37
 msgid ""
 "%1 has found the file <i>%2</i> in the following places:\n"
 "\n"
@@ -610,7 +700,7 @@ msgstr ""
 "%1 ha encontrado el archivo <i>%2</i> en los siguientes lugares:\n"
 "\n"
 
-#: ambiguous_file_dialog.cc:44
+#: ambiguous_file_dialog.cc:46
 msgid ""
 "\n"
 "\n"
@@ -620,212 +710,260 @@ msgstr ""
 "\n"
 "Por favor, selecciona la ruta del archivo deseado."
 
-#: ambiguous_file_dialog.cc:46 missing_file_dialog.cc:46
+#: ambiguous_file_dialog.cc:48 missing_file_dialog.cc:50
 msgid "Done"
 msgstr "Hecho"
 
-#: analysis_window.cc:46
+#: analysis_window.cc:45
 msgid "Signal source"
 msgstr "Origen de señal"
 
-#: analysis_window.cc:47
+#: analysis_window.cc:46
 msgid "Selected ranges"
 msgstr "Rangos seleccionados"
 
-#: analysis_window.cc:48
+#: analysis_window.cc:47
 msgid "Selected regions"
 msgstr "Regiones seleccionadas"
 
-# (de la ventana de FFT)
-#: analysis_window.cc:50
-msgid "Display model"
-msgstr "Modelo de visualización"
-
-#: analysis_window.cc:51
-msgid "Composite graphs for each track"
-msgstr "Gráficos compuestos para cada pista"
-
-#: analysis_window.cc:52
-msgid "Composite graph of all tracks"
-msgstr "Gráfico compuesto de todas las pistas"
-
-#: analysis_window.cc:54
+#: analysis_window.cc:48
 msgid "Show frequency power range"
 msgstr "Mostrar rango de potencia de frecuencias"
 
-#: analysis_window.cc:55
-msgid "Normalize values"
-msgstr "Normalizar valores"
+#: analysis_window.cc:49
+msgid "Fit dB range"
+msgstr "Ajusta rango dB"
 
-#: analysis_window.cc:59
+#: analysis_window.cc:50
+msgid "Proportional Spectrum, -18dB"
+msgstr "Proportional Spectrum, -18dB"
+
+#: analysis_window.cc:53
 msgid "FFT analysis window"
 msgstr "Ventana de análisis FFT"
 
-#: analysis_window.cc:60 editor.cc:1823
+#: analysis_window.cc:54 editor.cc:1954
 msgid "Spectral Analysis"
 msgstr "Análisis espectral"
 
-#: analysis_window.cc:67 editor_actions.cc:142 export_channel_selector.cc:557
-#: session_metadata_dialog.cc:667
+#: analysis_window.cc:61 editor_actions.cc:145 session_metadata_dialog.cc:670
 msgid "Track"
 msgstr "Pista"
 
-#: analysis_window.cc:68 editor_actions.cc:648 mixer_ui.cc:131
-#: mixer_ui.cc:1854
+#: analysis_window.cc:62 ardour_ui_ed.cc:254 ardour_ui_ed.cc:255
+#: ardour_ui_ed.cc:256 editor_actions.cc:689 mixer_ui.cc:151 mixer_ui.cc:2134
 msgid "Show"
 msgstr "Mostrar"
 
-#: analysis_window.cc:135
+#: analysis_window.cc:107
 msgid "Re-analyze data"
 msgstr "Re-analizar datos"
 
-#: ardour_button.cc:887
+#: ardour_button.cc:876
 msgid "button cannot watch state of non-existing Controllable\n"
 msgstr "el botón no puede observar el estado de un controlable no existente\n"
 
-#: ardour_button.cc:1155
+#: ardour_button.cc:1144
 msgid "ABCDEFGHIJLKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
 msgstr "ABCDEFGHIJLKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
 
-#: ardour_ui.cc:164
+#: ardour_ui.cc:198
 msgid ""
 "%1 %2.x has discovered configuration files from %1 %3.x.\n"
 "\n"
-"Would you like to copy the relevant files before starting to use the "
-"program?\n"
+"Would you like these files to be copied and used for %1 %2.x?\n"
 "\n"
 "(This will require you to restart %1.)"
 msgstr ""
+"%1 %2.x ha descubierto archivos de configuración de %1 %3.x.\n"
+"\n"
+"Quieres que estos archivos se copien y se usen para %1 %2.x?\n"
+"\n"
+"(Es necesario reiniciar %1.)"
 
 # en realidad no existe este término en el español...
-#: ardour_ui.cc:211 editor_actions.cc:642 region_editor.cc:51
+#: ardour_ui.cc:283 editor_actions.cc:683 region_editor.cc:53
 msgid "Audition"
 msgstr "Escucha"
 
-#: ardour_ui.cc:212 editor_actions.cc:136 mixer_strip.cc:2016
-#: rc_option_editor.cc:1959 route_time_axis.cc:252 route_time_axis.cc:2711
+#: ardour_ui.cc:284 editor_actions.cc:139 mixer_strip.cc:2213
+#: monitor_section.cc:329 rc_option_editor.cc:2547 route_time_axis.cc:263
+#: route_time_axis.cc:2740 vca_master_strip.cc:212 vca_time_axis.cc:237
 msgid "Solo"
 msgstr "Solo"
 
-#: ardour_ui.cc:213 rc_option_editor.cc:741
+#: ardour_ui.cc:285 rc_option_editor.cc:1357
 msgid "Feedback"
 msgstr "Realimentación"
 
-#: ardour_ui.cc:219 speaker_dialog.cc:36
+#: ardour_ui.cc:296 speaker_dialog.cc:36
 msgid "Speaker Configuration"
 msgstr "Configuración de altavoces"
 
-#: ardour_ui.cc:220 keyeditor.cc:53
-msgid "Key Bindings"
-msgstr "Combinaciones de teclas"
-
-#: ardour_ui.cc:221
-msgid "Preferences"
-msgstr "Preferencias"
-
-#: ardour_ui.cc:222 ardour_ui.cc:229
+#: ardour_ui.cc:297
 msgid "Add Tracks/Busses"
 msgstr "Añadir Pistas/Buses"
 
-#: ardour_ui.cc:223
+#: ardour_ui.cc:298
 msgid "About"
 msgstr "Acerca de"
 
-#: ardour_ui.cc:224 location_ui.cc:1141 session_option_editor.cc:189
-#: session_option_editor.cc:195 session_option_editor.cc:202
-msgid "Locations"
+#: ardour_ui.cc:299 location_ui.cc:1167
+msgid "Ranges|Locations"
 msgstr "Posiciones"
 
-#: ardour_ui.cc:225 route_params_ui.cc:59 route_params_ui.cc:630
+#: ardour_ui.cc:300 route_params_ui.cc:59 route_params_ui.cc:620
 msgid "Tracks and Busses"
 msgstr "Pistas y buses"
 
-#: ardour_ui.cc:226 engine_dialog.cc:70
+#: ardour_ui.cc:301 engine_dialog.cc:73
 msgid "Audio/MIDI Setup"
-msgstr "Audio/MIDI Setup"
+msgstr "Configuración Audio/MIDI"
 
-#: ardour_ui.cc:227
+#: ardour_ui.cc:302
 msgid "Video Export Dialog"
 msgstr "Diálogo de exportación de video"
 
-#: ardour_ui.cc:228
+#: ardour_ui.cc:303 lua_script_manager.cc:30
+msgid "Script Manager"
+msgstr "Gestor de scripts"
+
+#: ardour_ui.cc:304
 msgid "Properties"
 msgstr "Propiedades"
 
-#: ardour_ui.cc:230 bundle_manager.cc:264
+#: ardour_ui.cc:305
+msgid "Add Video"
+msgstr "Añadir Video"
+
+#: ardour_ui.cc:306 bundle_manager.cc:264
 msgid "Bundle Manager"
 msgstr "Gestor de conjuntos de conexiones"
 
-#: ardour_ui.cc:231 big_clock_window.cc:37
+#: ardour_ui.cc:307 big_clock_window.cc:37
 msgid "Big Clock"
 msgstr "Reloj grande"
 
-#: ardour_ui.cc:232
+#: ardour_ui.cc:308
 msgid "Audio Connections"
-msgstr ""
+msgstr "Conexiones Audio"
 
-#: ardour_ui.cc:233
+#: ardour_ui.cc:309
 msgid "MIDI Connections"
+msgstr "Conexiones MIDI"
+
+#: ardour_ui.cc:310
+msgid "Bindings Editor"
 msgstr ""
 
-#: ardour_ui.cc:242
+#: ardour_ui.cc:321 editor.cc:1289
+msgid "Window|Editor"
+msgstr "Editor"
+
+#: ardour_ui.cc:322 mixer_ui.cc:2210 mixer_ui.cc:2216
+msgid "Window|Mixer"
+msgstr "Mezclador"
+
+#: ardour_ui.cc:323
+msgid "Window|Preferences"
+msgstr "Preferencias"
+
+#: ardour_ui.cc:330
 msgid "Your configuration files were copied. You can now restart %1."
+msgstr "Se copiaron tus archivos de configuración. Ahora puedes reiniciar %1."
+
+#: ardour_ui.cc:509
+msgid "Pre-Release Warning"
+msgstr ""
+
+#: ardour_ui.cc:513
+msgid ""
+"<b>Welcome to this pre-release build of %1 %2</b>\n"
+"\n"
+"There are still several issues and bugs to be worked on,\n"
+"as well as general workflow improvements, before this can be considered\n"
+"release software. So, a few guidelines:\n"
+"\n"
+"1) Please do <b>NOT</b> use this software with the expectation that it is "
+"stable or reliable\n"
+"   though it may be so, depending on your workflow.\n"
+"2) Please wait for a helpful writeup of new features.\n"
+"3) <b>Please do NOT use the forums at ardour.org to report issues</b>.\n"
+"4) Please <b>DO</b> use the bugtracker at http://tracker.ardour.org/ to "
+"report issues\n"
+"   making sure to note the product version number as 5.0-pre.\n"
+"5) Please <b>DO</b> use the ardour-users mailing list to discuss ideas and "
+"pass on comments.\n"
+"6) Please <b>DO</b> join us on IRC for real time discussions about %1 %2. "
+"You\n"
+"   can get there directly from within the program via the Help->Chat menu "
+"option.\n"
+"\n"
+"Full information on all the above can be found on the support page at\n"
+"\n"
+"                http://ardour.org/support\n"
 msgstr ""
 
-#: ardour_ui.cc:481
+#: ardour_ui.cc:613
 msgid ""
 "The audio backend was shutdown because:\n"
 "\n"
 "%1"
 msgstr ""
+"El motor de audio se paró debido a:\n"
+"\n"
+"%1"
 
-#: ardour_ui.cc:483
+#: ardour_ui.cc:615
 msgid ""
 "The audio backend has either been shutdown or it\n"
 "disconnected %1 because %1\n"
 "was not fast enough. Try to restart\n"
 "the audio backend and save the session."
 msgstr ""
+"El motor de audio se paró o desconectó a %1\n"
+"porque %1 no fue lo bastante rápido.\n"
+"Prueba a reiniciar el motor de audio y salvar la sesión."
 
-#: ardour_ui.cc:507
+#: ardour_ui.cc:639
 msgid ""
 "Audio Unit Plugin Scan Failed. Automatic AU scanning has been disabled. "
 "Please see the log window for further details."
 msgstr ""
 
-#: ardour_ui.cc:508
+#: ardour_ui.cc:640
 msgid "Audio Unit Plugin Scan Failed:"
 msgstr ""
 
-#: ardour_ui.cc:827
+#: ardour_ui.cc:1008
 msgid "NSM server did not announce itself"
 msgstr ""
 
-#: ardour_ui.cc:840
+#: ardour_ui.cc:1021
 msgid "NSM: no client ID provided"
 msgstr ""
 
-#: ardour_ui.cc:847
+#: ardour_ui.cc:1028
 msgid "NSM: no session created"
 msgstr ""
 
-#: ardour_ui.cc:870
+#: ardour_ui.cc:1051
 msgid "NSM: initialization failed"
 msgstr ""
 
-#: ardour_ui.cc:900
+#: ardour_ui.cc:1083
 msgid "Free/Demo Version Warning"
 msgstr ""
 
-#: ardour_ui.cc:902
+#: ardour_ui.cc:1085
 msgid "Subscribe and support development of %1"
-msgstr ""
+msgstr "Suscríbete y apoya el desarrollo de %1"
 
-#: ardour_ui.cc:903
+#: ardour_ui.cc:1086
 msgid "Don't warn me about this again"
-msgstr ""
+msgstr "No vuelvas a hacerme esta advertencia"
 
-#: ardour_ui.cc:905
+#: ardour_ui.cc:1088
 msgid ""
 "<span weight=\"bold\" size=\"large\">%1</span>\n"
 "\n"
@@ -835,40 +973,47 @@ msgid ""
 "\n"
 "%4"
 msgstr ""
+"<span weight=\"bold\" size=\"large\">%1</span>\n"
+"\n"
+"<b>%2</b>\n"
+"\n"
+"<i>%3</i>\n"
+"\n"
+"%4"
 
-#: ardour_ui.cc:906
+#: ardour_ui.cc:1089
 msgid "This is a free/demo version of %1"
 msgstr ""
 
-#: ardour_ui.cc:907
+#: ardour_ui.cc:1090
 msgid "It will not restore OR save any plugin settings"
 msgstr ""
 
-#: ardour_ui.cc:908
+#: ardour_ui.cc:1091
 msgid ""
 "If you load an existing session with plugin settings\n"
 "they will not be used and will be lost."
 msgstr ""
 
-#: ardour_ui.cc:910 plugin_ui.cc:569
+#: ardour_ui.cc:1093 plugin_ui.cc:579
 msgid ""
 "To get full access to updates without this limitation\n"
 "consider becoming a subscriber for a low cost every month."
 msgstr ""
 
-#: ardour_ui.cc:920
+#: ardour_ui.cc:1103
 msgid "Quit now"
-msgstr ""
+msgstr "Salir ahora"
 
-#: ardour_ui.cc:921
+#: ardour_ui.cc:1104
 msgid "Continue using %1"
-msgstr ""
+msgstr "Seguir usando %1"
 
-#: ardour_ui.cc:954 startup.cc:345
+#: ardour_ui.cc:1135 startup.cc:349
 msgid "%1 is ready for use"
 msgstr "%1 está preparado para su uso"
 
-#: ardour_ui.cc:996
+#: ardour_ui.cc:1185
 msgid ""
 "WARNING: Your system has a limit for maximum amount of locked memory. This "
 "might cause %1 to run out of memory before your system runs out of memory. \n"
@@ -881,23 +1026,23 @@ msgstr ""
 "\n"
 "Puedes comprobar este límite con 'ulimit -l' y normalmente se establece en %2"
 
-#: ardour_ui.cc:1013
+#: ardour_ui.cc:1202
 msgid "Do not show this window again"
 msgstr "No volver a mostrar esta ventana"
 
-#: ardour_ui.cc:1057
+#: ardour_ui.cc:1245
 msgid "Don't quit"
 msgstr "No salir"
 
-#: ardour_ui.cc:1058
+#: ardour_ui.cc:1246
 msgid "Just quit"
 msgstr "Salir sin guardar"
 
-#: ardour_ui.cc:1059
+#: ardour_ui.cc:1247 ardour_ui.cc:5362
 msgid "Save and quit"
 msgstr "Guardar y salir"
 
-#: ardour_ui.cc:1069
+#: ardour_ui.cc:1257
 msgid ""
 "%1 was unable to save your session.\n"
 "\n"
@@ -911,11 +1056,11 @@ msgstr ""
 "\n"
 "\"Salir sin guardar\"."
 
-#: ardour_ui.cc:1119
+#: ardour_ui.cc:1307
 msgid "Unsaved Session"
 msgstr "Sesión no guardada"
 
-#: ardour_ui.cc:1140
+#: ardour_ui.cc:1328
 msgid ""
 "The session \"%1\"\n"
 "has not been saved.\n"
@@ -933,7 +1078,7 @@ msgstr ""
 "\n"
 "¿Qué deseas hacer?"
 
-#: ardour_ui.cc:1143
+#: ardour_ui.cc:1331
 msgid ""
 "The snapshot \"%1\"\n"
 "has not been saved.\n"
@@ -951,74 +1096,107 @@ msgstr ""
 "\n"
 "¿Qué deseas hacer?"
 
-#: ardour_ui.cc:1157
+#: ardour_ui.cc:1345
 msgid "Prompter"
 msgstr "Prompter"
 
-#: ardour_ui.cc:1269 ardour_ui.cc:1277
+#: ardour_ui.cc:1459 ardour_ui.cc:1467
 msgid "Audio: <span foreground=\"red\">none</span>"
-msgstr ""
+msgstr "Audio: <span foreground=\"red\">none</span>"
 
-#: ardour_ui.cc:1281
+#: ardour_ui.cc:1471
 #, c-format
 msgid "Audio: <span foreground=\"green\">%.1f kHz / %4.1f ms</span>"
-msgstr ""
+msgstr "Audio: <span foreground=\"green\">%.1f kHz / %4.1f ms</span>"
 
-#: ardour_ui.cc:1285
+#: ardour_ui.cc:1475
 #, c-format
 msgid "Audio: <span foreground=\"green\">%<PRId64> kHz / %4.1f ms</span>"
-msgstr ""
+msgstr "Audio: <span foreground=\"green\">%<PRId64> kHz / %4.1f ms</span>"
 
-#: ardour_ui.cc:1303 export_video_dialog.cc:80
+#: ardour_ui.cc:1493 export_report.cc:108 export_report.cc:323
+#: export_video_dialog.cc:76
 msgid "File:"
 msgstr "Archivo:"
 
-#: ardour_ui.cc:1307
+#: ardour_ui.cc:1497
 msgid "BWF"
 msgstr "BWF"
 
-#: ardour_ui.cc:1310
+#: ardour_ui.cc:1500
 msgid "WAV"
 msgstr "WAV"
 
-#: ardour_ui.cc:1313
+#: ardour_ui.cc:1503
 msgid "WAV64"
 msgstr "WAV64"
 
-#: ardour_ui.cc:1316 session_option_editor.cc:185
+#: ardour_ui.cc:1506 session_option_editor.cc:202
 msgid "CAF"
 msgstr "CAF"
 
-#: ardour_ui.cc:1319
+#: ardour_ui.cc:1509
 msgid "AIFF"
 msgstr "AIFF"
 
-#: ardour_ui.cc:1322
+#: ardour_ui.cc:1512
 msgid "iXML"
 msgstr "iXML"
 
-#: ardour_ui.cc:1325
+#: ardour_ui.cc:1515 session_option_editor.cc:203
 msgid "RF64"
 msgstr "RF64"
 
-#: ardour_ui.cc:1333
+#: ardour_ui.cc:1518
+msgid "RF64/WAV"
+msgstr "RF64/WAV"
+
+#: ardour_ui.cc:1521
+msgid "MBWF"
+msgstr ""
+
+#: ardour_ui.cc:1529
 msgid "32-float"
 msgstr "32-float"
 
-#: ardour_ui.cc:1336
+#: ardour_ui.cc:1532
 msgid "24-int"
 msgstr "24-int"
 
-#: ardour_ui.cc:1339
+#: ardour_ui.cc:1535
 msgid "16-int"
 msgstr "16-int"
 
-#: ardour_ui.cc:1358
+#: ardour_ui.cc:1556
+#, c-format
+msgid "X: <span foreground=\"%s\">>10K</span>"
+msgstr "X: <span foreground=\"%s\">>10K</span>"
+
+#: ardour_ui.cc:1558
+#, c-format
+msgid "X: <span foreground=\"%s\">%u</span>"
+msgstr "X: <span foreground=\"%s\">%u</span>"
+
+#: ardour_ui.cc:1561
+#, c-format
+msgid "X: <span foreground=\"%s\">?</span>"
+msgstr "X: <span foreground=\"%s\">?</span>"
+
+#: ardour_ui.cc:1564
+msgid "Audio dropouts. Shift+click to reset"
+msgstr ""
+
+#: ardour_ui.cc:1577
 #, c-format
 msgid "DSP: <span foreground=\"%s\">%5.1f%%</span>"
 msgstr "DSP: <span foreground=\"%s\">%5.1f%%</span>"
 
-#: ardour_ui.cc:1377
+#: ardour_ui.cc:1587
+#, c-format
+msgid "PkBld: <span foreground=\"%s\">%d</span>"
+msgstr "PkBld: <span foreground=\"%s\">%d</span>"
+
+#: ardour_ui.cc:1609
 #, c-format
 msgid ""
 "Buffers: <span foreground=\"green\">p:</span><span foreground=\"%s\">"
@@ -1029,83 +1207,84 @@ msgstr ""
 "%<PRIu32>%%</span> <span foreground=\"green\">c:</span><span foreground=\"%s"
 "\">%<PRIu32>%%</span>"
 
-#: ardour_ui.cc:1418
+#: ardour_ui.cc:1650
 msgid "Disk: <span foreground=\"green\">Unknown</span>"
 msgstr "Disco: <span foreground=\"green\">Desconocido</span>"
 
-#: ardour_ui.cc:1420
+#: ardour_ui.cc:1652
 msgid "Disk: <span foreground=\"green\">24hrs+</span>"
 msgstr "Disco: <span foreground=\"green\">24hrs+</span>"
 
-#: ardour_ui.cc:1438
+#: ardour_ui.cc:1670
 msgid "Disk: <span foreground=\"green\">>24 hrs</span>"
 msgstr "Disco: <span foreground=\"green\">>24 hrs</span>"
 
-#: ardour_ui.cc:1449
+#: ardour_ui.cc:1681
 #, c-format
 msgid "Disk: <span foreground=\"%s\">%02dh:%02dm:%02ds</span>"
 msgstr "Disco: <span foreground=\"%s\">%02dh:%02dm:%02ds</span>"
 
-#: ardour_ui.cc:1475
+#: ardour_ui.cc:1707
 #, c-format
 msgid "Timecode|TC: <span foreground=\"%s\">%s</span>"
 msgstr "TC: <span foreground=\"%s\">%s</span>"
 
-#: ardour_ui.cc:1596 ardour_ui.cc:1605 session_dialog.cc:318
-#: session_dialog.cc:323
-msgid "Recent Sessions"
-msgstr "Sesiones recientes"
-
-#: ardour_ui.cc:1684
+#: ardour_ui.cc:1789
 msgid ""
 "%1 is not connected to any audio backend.\n"
 "You cannot open or close sessions in this condition"
 msgstr ""
 
-#: ardour_ui.cc:1708
+#: ardour_ui.cc:1807
 msgid "Open Session"
 msgstr "Abrir sesión"
 
-#: ardour_ui.cc:1733 session_dialog.cc:349 session_import_dialog.cc:170
-#: session_metadata_dialog.cc:858
+#: ardour_ui.cc:1831 session_dialog.cc:410 session_import_dialog.cc:170
+#: session_metadata_dialog.cc:861
 msgid "%1 sessions"
 msgstr "sesiones %1"
 
-#: ardour_ui.cc:1770
+#: ardour_ui.cc:1879 ardour_ui.cc:1916
 msgid "You cannot add a track without a session already loaded."
 msgstr "No puedes añadir pistas ni buses sin una sesión cargada."
 
-#: ardour_ui.cc:1778
+#: ardour_ui.cc:1887
 msgid "could not create %1 new mixed track"
 msgid_plural "could not create %1 new mixed tracks"
 msgstr[0] "no se pudo crear %1 nueva pista mezclada"
 msgstr[1] "no se pudieron crear %1 nuevas pistas mezcladas"
 
-#: ardour_ui.cc:1784 ardour_ui.cc:1845
-msgid ""
-"There are insufficient ports available\n"
-"to create a new track or bus.\n"
-"You should save %1, exit and\n"
-"restart with more ports."
-msgstr ""
+#: ardour_ui.cc:1924
+msgid "could not create %1 new Midi Bus"
+msgid_plural "could not create %1 new Midi Busses"
+msgstr[0] "no se pudo crear %1 nuevo bus MIDI"
+msgstr[1] "no se pudieron crear %1 nuevos buses MIDI"
 
-#: ardour_ui.cc:1819
+#: ardour_ui.cc:1977
 msgid "You cannot add a track or bus without a session already loaded."
 msgstr "No puedes añadir pistas ni buses sin una sesión cargada."
 
-#: ardour_ui.cc:1828
+#: ardour_ui.cc:1986
 msgid "could not create %1 new audio track"
 msgid_plural "could not create %1 new audio tracks"
 msgstr[0] "no se pudo crear %1 nueva pista de audio"
 msgstr[1] "no se pudieron crear %1 nuevas pistas de audio"
 
-#: ardour_ui.cc:1837
+#: ardour_ui.cc:1995
 msgid "could not create %1 new audio bus"
 msgid_plural "could not create %1 new audio busses"
 msgstr[0] "no se pudo crear %1 nuevo bus de audio"
 msgstr[1] "no se pudieron crear %1 nuevos buses de audio"
 
-#: ardour_ui.cc:1990
+#: ardour_ui.cc:2020
+msgid ""
+"There are insufficient ports available\n"
+"to create a new track or bus.\n"
+"You should save %1, exit and\n"
+"restart with more ports."
+msgstr ""
+
+#: ardour_ui.cc:2164
 msgid ""
 "Please create one or more tracks before trying to record.\n"
 "You can do this with the \"Add Track or Bus\" option in the Session menu."
@@ -1113,23 +1292,20 @@ msgstr ""
 "Por favor, añade al menos 1 pista antes de intentar grabar\n"
 "Lo puedes hacer con la opción \"Añadir pista o bus\" del menú: Sesión."
 
-#: ardour_ui.cc:2376
-msgid "Save as..."
-msgstr "Guardar como..."
-
-#: ardour_ui.cc:2377 ardour_ui.cc:2456
-msgid "New session name"
-msgstr "Nuevo nombre de sesión"
+#: ardour_ui.cc:2565
+#, c-format
+msgid "Copied %<PRId64> of %<PRId64>"
+msgstr ""
 
-#: ardour_ui.cc:2379
-msgid "Take Snapshot"
-msgstr "Guardar captura de sesión"
+#: ardour_ui.cc:2619 save_as_dialog.cc:33
+msgid "Save As"
+msgstr "Guardar como"
 
-#: ardour_ui.cc:2380
-msgid "Name of new snapshot"
-msgstr "Nombre de captura de sesión"
+#: ardour_ui.cc:2647
+msgid "Save As failed: %1"
+msgstr "Guardar como falló: %1"
 
-#: ardour_ui.cc:2405
+#: ardour_ui.cc:2684
 msgid ""
 "To ensure compatibility with various systems\n"
 "snapshot names may not contain a '%1' character"
@@ -1137,23 +1313,35 @@ msgstr ""
 "Para asegurar la compatibilidad entre varios sistemas, los\n"
 "nombres de captura de sesión no pueden contener el carácter '%1'"
 
-#: ardour_ui.cc:2417
+#: ardour_ui.cc:2698
 msgid "Confirm Snapshot Overwrite"
 msgstr "Confirmar reescritura de captura de sesión"
 
-#: ardour_ui.cc:2418
-msgid "A snapshot already exists with that name.  Do you want to overwrite it?"
+#: ardour_ui.cc:2699
+msgid "A snapshot already exists with that name. Do you want to overwrite it?"
 msgstr "Ya existe una captura de sesión con ese nombre. ¿Quieres reescribirla?"
 
-#: ardour_ui.cc:2421 utils_videotl.cc:74
-msgid "Overwrite"
-msgstr "Reescribir"
+#: ardour_ui.cc:2724
+msgid "Snapshot and switch"
+msgstr "Captura de sesión y cambio"
+
+#: ardour_ui.cc:2725 ardour_ui.cc:2776
+msgid "New session name"
+msgstr "Nuevo nombre de sesión"
+
+#: ardour_ui.cc:2727
+msgid "Take Snapshot"
+msgstr "Guardar captura de sesión"
 
-#: ardour_ui.cc:2455
+#: ardour_ui.cc:2728
+msgid "Name of new snapshot"
+msgstr "Nombre de captura de sesión"
+
+#: ardour_ui.cc:2775
 msgid "Rename Session"
 msgstr "Renombrar sesión"
 
-#: ardour_ui.cc:2470 ardour_ui.cc:2886 ardour_ui.cc:2924
+#: ardour_ui.cc:2790 ardour_ui.cc:3267 ardour_ui.cc:3305
 msgid ""
 "To ensure compatibility with various systems\n"
 "session names may not contain a '%1' character"
@@ -1161,14 +1349,14 @@ msgstr ""
 "Para asegurar la compatibilidad entre varios sistemas,\n"
 "los nombres de sesión no pueden contener el carácter '%1'"
 
-#: ardour_ui.cc:2478
+#: ardour_ui.cc:2798
 msgid ""
 "That name is already in use by another directory/folder. Please try again."
 msgstr ""
 "Ese nombre ya está en uso por otro directorio o carpeta. Por favor, "
 "inténtalo otra vez."
 
-#: ardour_ui.cc:2487
+#: ardour_ui.cc:2807
 msgid ""
 "Renaming this session failed.\n"
 "Things could be seriously messed up at this point"
@@ -1176,20 +1364,28 @@ msgstr ""
 "Renaming this session failed.\n"
 "Things could be seriously messed up at this point"
 
-#: ardour_ui.cc:2602
+#: ardour_ui.cc:2923 route_ui.cc:1871
+msgid "Confirm Template Overwrite"
+msgstr "Confirmar reescritura de plantilla"
+
+#: ardour_ui.cc:2924 route_ui.cc:1872
+msgid "A template already exists with that name. Do you want to overwrite it?"
+msgstr "Ya existe una plantilla con ese nombre. ¿Quieres reescribirla?"
+
+#: ardour_ui.cc:2948
 msgid "Save Template"
 msgstr "Guardar plantilla"
 
 # se refiere a la sesión, no al Mezclador
-#: ardour_ui.cc:2603
+#: ardour_ui.cc:2949
 msgid "Name for template:"
 msgstr "Nombre de plantilla:"
 
-#: ardour_ui.cc:2604
+#: ardour_ui.cc:2950
 msgid "-template"
 msgstr "-plantilla"
 
-#: ardour_ui.cc:2643
+#: ardour_ui.cc:2987
 msgid ""
 "This session\n"
 "%1\n"
@@ -1199,59 +1395,89 @@ msgstr ""
 "%1\n"
 "ya existe. ¿Quieres abrirla?"
 
-#: ardour_ui.cc:2653
+#: ardour_ui.cc:2997
 msgid "Open Existing Session"
 msgstr "Abrir sesión existente"
 
-#: ardour_ui.cc:2914
+#: ardour_ui.cc:3295
 msgid "There is no existing session at \"%1\""
 msgstr "No hay ninguna sesión existente en \"%1\""
 
-#: ardour_ui.cc:3006
+#: ardour_ui.cc:3391
 msgid "Please wait while %1 loads your session"
 msgstr "Por favor, espera a que %1 cargue tu sesión"
 
-#: ardour_ui.cc:3021
+#: ardour_ui.cc:3406
 msgid "Port Registration Error"
 msgstr "Error de Registro de Puertos"
 
-#: ardour_ui.cc:3022
+#: ardour_ui.cc:3407
 msgid "Click the Close button to try again."
-msgstr "Pulsa el botón Cerrar para volver a intentarlo"
+msgstr "Pulsa el botón Cerrar para volver a intentarlo."
 
-#: ardour_ui.cc:3043
-msgid "Session \"%1 (snapshot %2)\" did not load successfully"
-msgstr "No se pudo cargar la sesión \"%1 (captura %2)\" "
+#: ardour_ui.cc:3426
+msgid "Session \"%1 (snapshot %2)\" did not load successfully: %3"
+msgstr "La sesión \"%1 (captura %2)\" no se cargó con éxito: %3"
 
-#: ardour_ui.cc:3049
+#: ardour_ui.cc:3432 ardour_ui.cc:3453 ardour_ui.cc:3548 ardour_ui.cc:3557
 msgid "Loading Error"
 msgstr "Error al cargar"
 
-#: ardour_ui.cc:3068
+#: ardour_ui.cc:3447
+msgid "Session \"%1 (snapshot %2)\" did not load successfully"
+msgstr "No se pudo cargar la sesión \"%1 (captura %2)\" "
+
+#: ardour_ui.cc:3475
 msgid ""
 "This session has been opened in read-only mode.\n"
 "\n"
 "You will not be able to record or save."
 msgstr ""
 
-#: ardour_ui.cc:3073
+#: ardour_ui.cc:3480
 msgid "Read-only Session"
 msgstr ""
 
-#: ardour_ui.cc:3139
+#: ardour_ui.cc:3547
+msgid "Could not create session in \"%1\": %2"
+msgstr "No se pudo crear la sesión en \"%1\": %2"
+
+#: ardour_ui.cc:3556
 msgid "Could not create session in \"%1\""
 msgstr "No se pudo crear la sesión en \"%1\""
 
-#: ardour_ui.cc:3288
+#: ardour_ui.cc:3601
+msgid ""
+"<b>Just ask and wait for an answer.\n"
+"It may take from minutes to hours.</b>"
+msgstr ""
+
+#: ardour_ui.cc:3603
+msgid "About the Chat"
+msgstr ""
+
+#: ardour_ui.cc:3604
+msgid ""
+"When you're inside the chat just ask your question and wait for an answer. "
+"The chat is occupied by real people with real lives so many of them are "
+"passively online and might not read your question before minutes or hours "
+"later.\n"
+"So please be patient and wait for an answer.\n"
+"\n"
+"You should just leave the chat window open and check back regularly until "
+"someone has answered your question."
+msgstr ""
+
+#: ardour_ui.cc:3723
 msgid "No files were ready for clean-up"
 msgstr "No había ningún archivo preparado para purgar"
 
-#: ardour_ui.cc:3292 ardour_ui.cc:3302 ardour_ui.cc:3435 ardour_ui.cc:3442
-#: ardour_ui_ed.cc:103
+#: ardour_ui.cc:3727 ardour_ui.cc:3737 ardour_ui.cc:3870 ardour_ui.cc:3877
+#: ardour_ui_ed.cc:129
 msgid "Clean-up"
 msgstr "Purgar"
 
-#: ardour_ui.cc:3293
+#: ardour_ui.cc:3728
 msgid ""
 "If this seems suprising, \n"
 "check for any existing snapshots.\n"
@@ -1262,21 +1488,21 @@ msgstr ""
 "Éstas todavía pueden incluir regiones que hacen que algunos\n"
 "archivos no utilizados continúen existiendo."
 
-#: ardour_ui.cc:3352
+#: ardour_ui.cc:3787
 msgid "kilo"
 msgstr "kilo"
 
-#: ardour_ui.cc:3355
+#: ardour_ui.cc:3790
 msgid "mega"
 msgstr "mega"
 
-#: ardour_ui.cc:3358
+#: ardour_ui.cc:3793
 msgid "giga"
 msgstr "giga"
 
 # debí adaptar para que al completarse con los parámetros el mensaje tuviera sentido en español
 # (quedaba mal por los plurales y la ambigüedad was=fue/estuvo)
-#: ardour_ui.cc:3363
+#: ardour_ui.cc:3798
 msgid ""
 "The following file was deleted from %2,\n"
 "releasing %3 %4bytes of disk space"
@@ -1292,7 +1518,7 @@ msgstr[1] ""
 
 # debí adaptar para que al completarse con los parámetros el mensaje tuviera sentido en español
 # (quedaba mal por los plurales y la ambigüedad was=fue/estuvo)
-#: ardour_ui.cc:3370
+#: ardour_ui.cc:3805
 msgid ""
 "The following file was not in use and \n"
 "has been moved to: %2\n"
@@ -1330,11 +1556,11 @@ msgstr[1] ""
 "\n"
 "liberará %3 %4bytes de espacio en disco.\n"
 
-#: ardour_ui.cc:3430
+#: ardour_ui.cc:3865
 msgid "Are you sure you want to clean-up?"
 msgstr "¿Estás seguro de que quieres purgar?"
 
-#: ardour_ui.cc:3437
+#: ardour_ui.cc:3872
 msgid ""
 "Clean-up is a destructive operation.\n"
 "ALL undo/redo information will be lost if you clean-up.\n"
@@ -1344,40 +1570,64 @@ msgstr ""
 "TODA la información del historial deshacer/rehacer se perderá.\n"
 "Purgar moverá todos los archivos no usados a la carpeta \"dead\"."
 
-#: ardour_ui.cc:3445
+#: ardour_ui.cc:3880
 msgid "CleanupDialog"
 msgstr "Purgar"
 
-#: ardour_ui.cc:3475
+#: ardour_ui.cc:3910
 msgid "Cleaned Files"
 msgstr "Archivos purgados"
 
-#: ardour_ui.cc:3492
+#: ardour_ui.cc:3927
 msgid "deleted file"
 msgstr "archivo eliminado"
 
-#: ardour_ui.cc:3637
+#: ardour_ui.cc:4133
+msgid "Cannot read session script '%1': %2"
+msgstr "No se pudo leer el script de sesión '%1': %2"
+
+#: ardour_ui.cc:4142 luainstance.cc:1104
+msgid "Set Script Parameters"
+msgstr ""
+
+#: ardour_ui.cc:4153
+msgid "Session script '%1' instantiation failed: %2"
+msgstr ""
+
+#: ardour_ui.cc:4157
+msgid "Loading Session script '%1' failed: %2"
+msgstr ""
+
+#: ardour_ui.cc:4170
+msgid "There are no active Lua session scripts present in this session."
+msgstr ""
+
+#: ardour_ui.cc:4187
+msgid "Session script '%1' removal failed: %2"
+msgstr ""
+
+#: ardour_ui.cc:4197
 msgid "Video-Server was not launched by %1. The request to stop it is ignored."
 msgstr ""
 "%1 no ha lanzado el servidor de video. Se ignora la petición de parada."
 
-#: ardour_ui.cc:3641
+#: ardour_ui.cc:4201
 msgid "Stop Video-Server"
 msgstr "Detener el servidor de video"
 
-#: ardour_ui.cc:3642
+#: ardour_ui.cc:4202
 msgid "Do you really want to stop the Video Server?"
 msgstr "¿De verdad quieres detener el servidor de video?"
 
-#: ardour_ui.cc:3645
+#: ardour_ui.cc:4205
 msgid "Yes, Stop It"
 msgstr "Sí, páralo."
 
-#: ardour_ui.cc:3671
+#: ardour_ui.cc:4231
 msgid "The Video Server is already started."
 msgstr "El servidor de video ya está en marcha"
 
-#: ardour_ui.cc:3673
+#: ardour_ui.cc:4233
 msgid ""
 "An external Video Server is configured and can be reached. Not starting a "
 "new instance."
@@ -1385,41 +1635,55 @@ msgstr ""
 "Se ha encontrado un servidor de video externo accesible. No se arranca otra "
 "instancia."
 
-#: ardour_ui.cc:3681 ardour_ui.cc:3786
+#: ardour_ui.cc:4241 ardour_ui.cc:4346
 msgid ""
 "Could not connect to the Video Server. Start it or configure its access URL "
 "in Preferences."
 msgstr ""
+"No pudo conectar al servidor de video. Arráncalo o configura su URL de "
+"acceso en las Preferencias."
 
-#: ardour_ui.cc:3711
+#: ardour_ui.cc:4271
 msgid "Specified docroot is not an existing directory."
 msgstr ""
 
-#: ardour_ui.cc:3717 ardour_ui.cc:3723
+#: ardour_ui.cc:4277 ardour_ui.cc:4283
 msgid "Given Video Server is not an executable file."
 msgstr ""
 
-#: ardour_ui.cc:3757
+#: ardour_ui.cc:4317
 msgid "Cannot launch the video-server"
 msgstr "No se ha podido lanzar el servidor de video"
 
-#: ardour_ui.cc:3767
+#: ardour_ui.cc:4327
 msgid "Video-server was started but does not respond to requests..."
 msgstr "El video server ha iniciado pero no responde a peticiones..."
 
-#: ardour_ui.cc:3812 editor_audio_import.cc:641
+#: ardour_ui.cc:4372 editor_audio_import.cc:647
 msgid "could not open %1"
 msgstr "no se pudo abrir %1"
 
-#: ardour_ui.cc:3816
+#: ardour_ui.cc:4376
 msgid "no video-file selected"
 msgstr "no hay archivo de video seleccionado"
 
-#: ardour_ui.cc:4014
+#: ardour_ui.cc:4472
+msgid "No LTC detected, video will not be aligned."
+msgstr ""
+
+#: ardour_ui.cc:4478
+msgid "Align video-start to %1 [samples]"
+msgstr ""
+
+#: ardour_ui.cc:4654
+msgid "xrun"
+msgstr "xrun"
+
+#: ardour_ui.cc:4663
 msgid "Recording was stopped because your system could not keep up."
 msgstr "Se detuvo la grabación porque el sistema se sobrecargó."
 
-#: ardour_ui.cc:4043
+#: ardour_ui.cc:4692
 msgid ""
 "The disk system on your computer\n"
 "was not able to keep up with %1.\n"
@@ -1433,23 +1697,23 @@ msgstr ""
 "En concreto, la velocidad de escritura de datos en el disco\n"
 "no fue lo bastante alta como para permitir la grabación.\n"
 
-#: ardour_ui.cc:4113
+#: ardour_ui.cc:4765
 msgid "Scanning for plugins"
-msgstr ""
+msgstr "Buscando plugins"
 
-#: ardour_ui.cc:4115
+#: ardour_ui.cc:4767
 msgid "Cancel plugin scan"
-msgstr ""
+msgstr "Cancelar búsqueda de plugins"
 
-#: ardour_ui.cc:4124
+#: ardour_ui.cc:4776
 msgid "Stop Timeout"
 msgstr ""
 
-#: ardour_ui.cc:4131
+#: ardour_ui.cc:4783
 msgid "Scan Timeout"
 msgstr ""
 
-#: ardour_ui.cc:4174
+#: ardour_ui.cc:4827
 msgid ""
 "The disk system on your computer\n"
 "was not able to keep up with %1.\n"
@@ -1463,11 +1727,11 @@ msgstr ""
 "En concreto, la velocidad de lectura de datos desde el disco\n"
 "no fue lo bastante alta como para permitir la reproducción.\n"
 
-#: ardour_ui.cc:4214
+#: ardour_ui.cc:4862
 msgid "Crash Recovery"
 msgstr "Recuperación del crash"
 
-#: ardour_ui.cc:4215
+#: ardour_ui.cc:4863
 msgid ""
 "This session appears to have been in the\n"
 "middle of recording when %1 or\n"
@@ -1485,45 +1749,51 @@ msgstr ""
 "o puede ignorarlo. Por favor, decide qué\n"
 "deseas hacer.\n"
 
-#: ardour_ui.cc:4227
+#: ardour_ui.cc:4875
 msgid "Ignore crash data"
 msgstr "Ignorar información del crash"
 
-#: ardour_ui.cc:4228
+#: ardour_ui.cc:4876
 msgid "Recover from crash"
 msgstr "Recuperar del crash"
 
-#: ardour_ui.cc:4248
+#: ardour_ui.cc:4896
 msgid "Sample Rate Mismatch"
 msgstr "Discrepancia de frecuencia de muestreo"
 
-#: ardour_ui.cc:4249
+#: ardour_ui.cc:4897
 msgid ""
 "This session was created with a sample rate of %1 Hz, but\n"
 "%2 is currently running at %3 Hz.  If you load this session,\n"
 "audio may be played at the wrong sample rate.\n"
 msgstr ""
-"Esta sesión fue creada con una frecuencia de muestreo de %1 Hz\n"
+"Esta sesión fue creada con una tasa de muestreo de %1 Hz\n"
 "pero %2 está ejecutándose actualmente a %3 Hz. Si cargas la sesión\n"
-"puede que el audio se reproduzca a una frecuencia de muestreo incorrecta.\n"
+"puede que el audio se reproduzca con una tasa de muestreo incorrecta.\n"
 
-#: ardour_ui.cc:4258
+#: ardour_ui.cc:4906
 msgid "Do not load session"
 msgstr "No cargar sesión"
 
-#: ardour_ui.cc:4259
+#: ardour_ui.cc:4907
 msgid "Load session anyway"
 msgstr "Cargar sesión de todas formas"
 
-#: ardour_ui.cc:4286
-msgid "Could not disconnect from Audio/MIDI engine"
-msgstr ""
-
-#: ardour_ui.cc:4303 ardour_ui.cc:4306
-msgid "Could not reconnect to the Audio/MIDI engine"
+#: ardour_ui.cc:4927
+msgid ""
+"This session was created with a sample rate of %1 Hz, but\n"
+"%2 is currently running at %3 Hz.\n"
+"Audio will be recorded and played at the wrong sample rate.\n"
+"Re-Configure the Audio Engine in\n"
+"Menu > Window > Audio/Midi Setup"
 msgstr ""
+"Esta sesión fue creada con una tasa de muestreo de %1 Hz\n"
+"pero %2 está ejecutándose actualmente a %3 Hz.\n"
+"El audio se capturará y reproducirá con una tasa de muestreo incorrecta.\n"
+"Reconfigura el motor de audio en\n"
+"Menú > Ventana > Configuración Audio/Midi "
 
-#: ardour_ui.cc:4590
+#: ardour_ui.cc:5209
 msgid ""
 "%4This is a session from an older version of %3%5\n"
 "\n"
@@ -1535,50 +1805,75 @@ msgid ""
 "\n"
 "%6%2%7\n"
 "\n"
-"From now on, use the -2000 version with older versions of %3"
+"From now on, use the backup copy with older versions of %3"
 msgstr ""
 
-#: ardour_ui2.cc:73
-msgid "UI: cannot setup editor"
-msgstr "interfaz de usuario: no se pudo configurar el editor"
+#: ardour_ui.cc:5331
+msgid "This is a free/demo copy of %1. It has just switched to silent mode."
+msgstr ""
 
-#: ardour_ui2.cc:78
-msgid "UI: cannot setup mixer"
-msgstr "interfaz de usuario: no se pudo configurar el mezclador"
+#: ardour_ui.cc:5337
+msgid "%1 is now silent"
+msgstr "%1 está silenciado"
 
-#: ardour_ui2.cc:83
-msgid "UI: cannot setup meterbridge"
+#: ardour_ui.cc:5339
+msgid ""
+"Please consider paying for a copy of %1 - you can pay whatever you want."
+msgstr ""
+
+#: ardour_ui.cc:5340
+msgid "Better yet become a subscriber - subscriptions start at US$1 per month."
+msgstr ""
+
+#: ardour_ui.cc:5341
+msgid "Pay for a copy (via the web)"
+msgstr ""
+
+#: ardour_ui.cc:5342
+msgid "Become a subscriber (via the web)"
+msgstr ""
+
+#: ardour_ui.cc:5361
+msgid "Remain silent"
+msgstr "Permanecer silenciado"
+
+#: ardour_ui.cc:5363
+msgid "Give me more time"
+msgstr ""
+
+#: ardour_ui.cc:5656
+msgid "Global keybindings are missing"
 msgstr ""
 
-#: ardour_ui2.cc:128
+#: ardour_ui2.cc:79
 msgid "Play from playhead"
 msgstr "Reproducir desde cursor"
 
-#: ardour_ui2.cc:129
+#: ardour_ui2.cc:80
 msgid "Stop playback"
 msgstr "Detener reproducción"
 
-#: ardour_ui2.cc:130
+#: ardour_ui2.cc:81
 msgid "Toggle record"
 msgstr "Activar/Desactivar grabación"
 
-#: ardour_ui2.cc:131
+#: ardour_ui2.cc:82
 msgid "Play range/selection"
 msgstr "Reproducir rango/selección"
 
-#: ardour_ui2.cc:132
+#: ardour_ui2.cc:83
 msgid "Go to start of session"
 msgstr "Ir a inicio de sesión"
 
-#: ardour_ui2.cc:133
+#: ardour_ui2.cc:84
 msgid "Go to end of session"
 msgstr "Ir a fin de sesión"
 
-#: ardour_ui2.cc:134
+#: ardour_ui2.cc:85
 msgid "Play loop range"
 msgstr "Reproducir rango de bucle"
 
-#: ardour_ui2.cc:135
+#: ardour_ui2.cc:86
 msgid ""
 "MIDI Panic\n"
 "Send note off and reset controller messages on all MIDI channels"
@@ -1586,23 +1881,23 @@ msgstr ""
 "Pánico MIDI\n"
 "Enviar nota off y resetear mensajes de control en todos los canales MIDI"
 
-#: ardour_ui2.cc:136
+#: ardour_ui2.cc:87
 msgid "Return to last playback start when stopped"
 msgstr "Al detenerse, volver al último inicio de reproducción"
 
-#: ardour_ui2.cc:137
-msgid "Playhead follows Range Selections and Edits"
+#: ardour_ui2.cc:88
+msgid "Playhead follows range selections and edits"
 msgstr "El cursor sigue a las selecciones de rango y edición"
 
-#: ardour_ui2.cc:138
+#: ardour_ui2.cc:89
 msgid "Be sensible about input monitoring"
 msgstr "Monitorización sensible de entradas"
 
-#: ardour_ui2.cc:139
+#: ardour_ui2.cc:90
 msgid "Enable/Disable audio click"
 msgstr "Activar/Desactivar claqueta"
 
-#: ardour_ui2.cc:140 monitor_section.cc:111
+#: ardour_ui2.cc:91 monitor_section.cc:129
 msgid ""
 "When active, something is soloed.\n"
 "Click to de-solo everything"
@@ -1610,19 +1905,19 @@ msgstr ""
 "Si está activado, algo está en solo.\n"
 "Pulsa para desactivar todos los solos"
 
-#: ardour_ui2.cc:141
+#: ardour_ui2.cc:92
 msgid ""
-"When active, auditioning is taking place\n"
+"When active, auditioning is taking place.\n"
 "Click to stop the audition"
 msgstr ""
-"Si está activado, se está produciendo escucha\n"
+"Si está activado, se está produciendo escucha.\n"
 "Pulsa para detener la escucha"
 
-#: ardour_ui2.cc:142
+#: ardour_ui2.cc:93
 msgid "When active, there is a feedback loop."
 msgstr "Cuando está activo,  existe un bucle de realimentación."
 
-#: ardour_ui2.cc:143
+#: ardour_ui2.cc:94
 msgid ""
 "<b>Primary Clock</b> right-click to set display mode. Click to edit, click"
 "+drag a digit or mouse-over+scroll wheel to modify.\n"
@@ -1630,7 +1925,7 @@ msgid ""
 "confirm; postfix the edit with '+' or '-' to enter delta times.\n"
 msgstr ""
 
-#: ardour_ui2.cc:144
+#: ardour_ui2.cc:95
 msgid ""
 "<b>Secondary Clock</b> right-click to set display mode. Click to edit, click"
 "+drag a digit or mouse-over+scroll wheel to modify.\n"
@@ -1638,455 +1933,567 @@ msgid ""
 "confirm; postfix the edit with '+' or '-' to enter delta times.\n"
 msgstr ""
 
-#: ardour_ui2.cc:145
+#: ardour_ui2.cc:96
 msgid "Reset All Peak Indicators"
 msgstr ""
 
-#: ardour_ui2.cc:146
+#: ardour_ui2.cc:97
 msgid "Show Error Log and acknowledge warnings"
 msgstr ""
 
-#: ardour_ui2.cc:179
+#: ardour_ui2.cc:130
 msgid "[ERROR]: "
 msgstr "[ERROR]: "
 
-#: ardour_ui2.cc:182
+#: ardour_ui2.cc:133
 msgid "[WARNING]: "
 msgstr "[AVISO]: "
 
-#: ardour_ui2.cc:185
+#: ardour_ui2.cc:136
 msgid "[INFO]: "
 msgstr "[INFO]: "
 
 # he cambiado desde Auto Volver. Qudaba un poco raro y auto return se entiende mejor
-#: ardour_ui2.cc:253 ardour_ui_ed.cc:403
+#: ardour_ui2.cc:197 ardour_ui_ed.cc:509
 msgid "Auto Return"
 msgstr "Auto Return"
 
-#: ardour_ui2.cc:255 ardour_ui_ed.cc:406
+#: ardour_ui2.cc:199 ardour_ui_ed.cc:512
 msgid "Follow Edits"
 msgstr "Seguir Edits"
 
-#: ardour_ui2.cc:716 rc_option_editor.cc:2300
-msgid "GUI"
+#: ardour_ui2.cc:422 ardour_ui2.cc:426 ardour_ui2.cc:430
+msgid ""
+"Drag this tab to the desktop to show %1 in its own window\n"
+"\n"
+"To put the window back, use the Window > %1 > Attach menu action"
 msgstr ""
+"Arrastra esta pestaña hacia el escritorio para mostrar el %1 en su propia "
+"ventana\n"
+"\n"
+"Para recolocar la ventana en su sitio, usa Ventana > %1 > Acoplar"
 
-#: ardour_ui2.cc:733 rc_option_editor.cc:1309 rc_option_editor.cc:1327
-#: rc_option_editor.cc:1330 rc_option_editor.cc:1332 rc_option_editor.cc:1334
-#: rc_option_editor.cc:1342 rc_option_editor.cc:1350 rc_option_editor.cc:1352
-#: rc_option_editor.cc:1360 rc_option_editor.cc:1367 rc_option_editor.cc:1376
-#: rc_option_editor.cc:1378 rc_option_editor.cc:1380 rc_option_editor.cc:1388
-#: rc_option_editor.cc:1390 rc_option_editor.cc:1399
-#: session_option_editor.cc:321 session_option_editor.cc:323
-#: session_option_editor.cc:344 session_option_editor.cc:346
-#: session_option_editor.cc:348 session_option_editor.cc:355
-#: session_option_editor.cc:362 session_option_editor.cc:366
+#: ardour_ui2.cc:638
+msgid "GUI"
+msgstr "GUI"
+
+#: ardour_ui2.cc:651 rc_option_editor.cc:1874 rc_option_editor.cc:1892
+#: rc_option_editor.cc:1895 rc_option_editor.cc:1897 rc_option_editor.cc:1899
+#: rc_option_editor.cc:1907 rc_option_editor.cc:1909 rc_option_editor.cc:1917
+#: rc_option_editor.cc:1925 rc_option_editor.cc:1932 rc_option_editor.cc:1953
+#: rc_option_editor.cc:1955 rc_option_editor.cc:1964
+#: session_option_editor.cc:342 session_option_editor.cc:344
+#: session_option_editor.cc:365 session_option_editor.cc:367
+#: session_option_editor.cc:369 session_option_editor.cc:376
+#: session_option_editor.cc:383 session_option_editor.cc:387
 msgid "Misc"
 msgstr "Misc"
 
-#: ardour_ui_dependents.cc:76
+#: ardour_ui_dependents.cc:118
 msgid "Setup Editor"
 msgstr "Configurar Editor"
 
-#: ardour_ui_dependents.cc:78
+#: ardour_ui_dependents.cc:120
 msgid "Setup Mixer"
 msgstr "Configurar Mezclador"
 
-#: ardour_ui_dependents.cc:84
+#: ardour_ui_dependents.cc:127
 msgid "Reload Session History"
 msgstr "Recargar historial de sesión"
 
-#: ardour_ui_dialogs.cc:250
+#: ardour_ui_dependents.cc:248
+msgid "UI: cannot setup editor"
+msgstr "interfaz de usuario: no se pudo configurar el editor"
+
+#: ardour_ui_dependents.cc:253
+msgid "UI: cannot setup mixer"
+msgstr "interfaz de usuario: no se pudo configurar el mezclador"
+
+#: ardour_ui_dependents.cc:258
+msgid "UI: cannot setup meterbridge"
+msgstr ""
+
+#: ardour_ui_dependents.cc:263
+msgid "UI: cannot setup luawindow"
+msgstr ""
+
+#: ardour_ui_dependents.cc:269 ardour_ui_ed.cc:136 ardour_ui_ed.cc:257
+#: rc_option_editor.cc:1853 rc_option_editor.cc:3494
+msgid "Preferences"
+msgstr "Preferencias"
+
+#: ardour_ui_dependents.cc:270 ardour_ui_ed.cc:134 mixer_ui.cc:100
+#: mixer_ui.cc:410
+msgid "Mixer"
+msgstr "Mezclador"
+
+#: ardour_ui_dependents.cc:271 ardour_ui_ed.cc:135 editor.cc:5791
+#: editor.cc:6063 public_editor.cc:34 rc_option_editor.cc:2201
+#: rc_option_editor.cc:2215 rc_option_editor.cc:2219 rc_option_editor.cc:2227
+#: rc_option_editor.cc:2236 rc_option_editor.cc:2244 rc_option_editor.cc:2253
+#: rc_option_editor.cc:2261 rc_option_editor.cc:2269 rc_option_editor.cc:2279
+#: rc_option_editor.cc:2281 rc_option_editor.cc:2305 rc_option_editor.cc:2317
+#: rc_option_editor.cc:2328 rc_option_editor.cc:2346
+msgid "Editor"
+msgstr "Editor"
+
+#: ardour_ui_dialogs.cc:263
 msgid "Don't close"
 msgstr "No cerrar"
 
-#: ardour_ui_dialogs.cc:251
+#: ardour_ui_dialogs.cc:264
 msgid "Just close"
 msgstr "Cerrar"
 
-#: ardour_ui_dialogs.cc:252
+#: ardour_ui_dialogs.cc:265
 msgid "Save and close"
 msgstr "Guardar y cerrar"
 
-#: ardour_ui_dialogs.cc:362
-msgid "This screen is not tall enough to display the mixer window"
+#: ardour_ui_ed.cc:124
+msgid "Escape"
 msgstr ""
-"Esta pantalla no es lo bastante alta para mostrar la ventana del mezclador"
 
-#: ardour_ui_ed.cc:102
+#: ardour_ui_ed.cc:128
 msgid "Session"
 msgstr "Sesión"
 
-#: ardour_ui_ed.cc:105 editor_actions.cc:138 editor_regions.cc:116
-#: port_group.cc:458 session_option_editor.cc:82 session_option_editor.cc:89
+#: ardour_ui_ed.cc:131 editor_actions.cc:141 editor_regions.cc:163
+#: port_group.cc:468 session_option_editor.cc:82 session_option_editor.cc:89
 msgid "Sync"
 msgstr "Sinc"
 
-#: ardour_ui_ed.cc:106
+#: ardour_ui_ed.cc:132
 msgid "Options"
 msgstr "Opciones"
 
-#: ardour_ui_ed.cc:107
+#: ardour_ui_ed.cc:133
 msgid "Window"
 msgstr "Ventana"
 
-#: ardour_ui_ed.cc:108
+#: ardour_ui_ed.cc:137 ardour_ui_ed.cc:267 ardour_ui_ed.cc:268
+#: ardour_ui_ed.cc:269
+msgid "Detach"
+msgstr "Desacoplar"
+
+#: ardour_ui_ed.cc:138
 msgid "Help"
 msgstr "Ayuda"
 
-#: ardour_ui_ed.cc:109
+#: ardour_ui_ed.cc:139
 msgid "Misc. Shortcuts"
 msgstr "Atajos varios"
 
-#: ardour_ui_ed.cc:110
+#: ardour_ui_ed.cc:140
 msgid "Audio File Format"
-msgstr "Formato archivo de audio"
+msgstr "Formato de archivo de audio"
 
-#: ardour_ui_ed.cc:111
+#: ardour_ui_ed.cc:141
 msgid "File Type"
 msgstr "Tipo de archivo"
 
-#: ardour_ui_ed.cc:112 export_format_dialog.cc:67
+#: ardour_ui_ed.cc:142 export_format_dialog.cc:75
 msgid "Sample Format"
 msgstr "Formato de muestra"
 
-#: ardour_ui_ed.cc:113 rc_option_editor.cc:2245 rc_option_editor.cc:2257
+#: ardour_ui_ed.cc:143 rc_option_editor.cc:2841
 msgid "Control Surfaces"
 msgstr "Superficies de control"
 
-#: ardour_ui_ed.cc:114 rc_option_editor.cc:1921 rc_option_editor.cc:2264
+#: ardour_ui_ed.cc:144 rc_option_editor.cc:2847 rc_option_editor.cc:2853
+#: rc_option_editor.cc:2862 rc_option_editor.cc:2873 rc_option_editor.cc:2883
+#: rc_option_editor.cc:2945 rc_option_editor.cc:2962 rc_option_editor.cc:2978
+#: rc_option_editor.cc:2979 rc_option_editor.cc:2988 rc_option_editor.cc:3002
+#: rc_option_editor.cc:3005 rc_option_editor.cc:3013 rc_option_editor.cc:3021
 msgid "Plugins"
 msgstr "Plugins"
 
-#: ardour_ui_ed.cc:115 rc_option_editor.cc:2351
+#: ardour_ui_ed.cc:145 rc_option_editor.cc:3169
 msgid "Metering"
 msgstr "Medidores"
 
-#: ardour_ui_ed.cc:116
+#: ardour_ui_ed.cc:146
 msgid "Fall Off Rate"
 msgstr "Tasa de decaimiento"
 
-#: ardour_ui_ed.cc:117
+#: ardour_ui_ed.cc:147
 msgid "Hold Time"
 msgstr "Tiempo de persistencia"
 
-#: ardour_ui_ed.cc:118
+#: ardour_ui_ed.cc:148
 msgid "Denormal Handling"
 msgstr "Manejo de denormals"
 
-#: ardour_ui_ed.cc:122 route_time_axis.cc:1677
+#: ardour_ui_ed.cc:152 route_time_axis.cc:1683
 msgid "New..."
 msgstr "Nueva..."
 
-#: ardour_ui_ed.cc:124
+#: ardour_ui_ed.cc:154
 msgid "Open..."
 msgstr "Abrir..."
 
-#: ardour_ui_ed.cc:125
+#: ardour_ui_ed.cc:155
 msgid "Recent..."
 msgstr "Recientes..."
 
-#: ardour_ui_ed.cc:126 panner_editor.cc:29 playlist_selector.cc:64
+#: ardour_ui_ed.cc:156 panner_editor.cc:29 playlist_selector.cc:64
 msgid "Close"
 msgstr "Cerrar"
 
-#: ardour_ui_ed.cc:129
+#: ardour_ui_ed.cc:159
 msgid "Add Track or Bus..."
 msgstr "Añadir pista o bus..."
 
-#: ardour_ui_ed.cc:134
-msgid "Open Video"
-msgstr "Abrir video"
+#: ardour_ui_ed.cc:163
+msgid "Duplicate Tracks/Busses..."
+msgstr "Duplicar Pistas/Buses..."
+
+#: ardour_ui_ed.cc:169
+msgid "Cancel Solo"
+msgstr "Cancelar solo"
 
-#: ardour_ui_ed.cc:137
+#: ardour_ui_ed.cc:173
+msgid "Session|Scripting"
+msgstr "Scripts"
+
+#: ardour_ui_ed.cc:176
+msgid "Add Lua Script..."
+msgstr "Añadir script Lua"
+
+#: ardour_ui_ed.cc:180
+msgid "Remove Lua Script"
+msgstr "Borrar script Lua"
+
+#: ardour_ui_ed.cc:184
+msgid "Open Video..."
+msgstr "Abrir video..."
+
+#: ardour_ui_ed.cc:187
 msgid "Remove Video"
 msgstr "Borrar video"
 
-#: ardour_ui_ed.cc:140
-msgid "Export To Video File"
-msgstr "Exportar a archivo de video"
+#: ardour_ui_ed.cc:190
+msgid "Export to Video File..."
+msgstr "Exportar a archivo de video..."
+
+#: ardour_ui_ed.cc:194
+msgid "Snapshot (& keep working on current version) ..."
+msgstr "Captura de sesión (y seguir trabajando en la versión actual) ..."
 
-#: ardour_ui_ed.cc:144
-msgid "Snapshot..."
-msgstr "Captura de sesión..."
+#: ardour_ui_ed.cc:197
+msgid "Snapshot (& switch to new version) ..."
+msgstr "Captura de sesión (y cambiar a nueva versión) ..."
 
-#: ardour_ui_ed.cc:148
+#: ardour_ui_ed.cc:200
+msgid "Quick Snapshot (& keep working on current version) ..."
+msgstr ""
+
+#: ardour_ui_ed.cc:203
+msgid "Quick Snapshot (& switch to new version) ..."
+msgstr ""
+
+#: ardour_ui_ed.cc:207
 msgid "Save As..."
 msgstr "Guardar como..."
 
-#: ardour_ui_ed.cc:152 editor_actions.cc:1771 editor_markers.cc:903
-#: editor_snapshots.cc:124 mixer_strip.cc:1518 route_time_axis.cc:1673
+#: ardour_ui_ed.cc:210 editor_actions.cc:1788 editor_markers.cc:908
+#: editor_snapshots.cc:136 mixer_strip.cc:1653 route_time_axis.cc:1679
 msgid "Rename..."
 msgstr "Renombrar..."
 
-#: ardour_ui_ed.cc:156
+#: ardour_ui_ed.cc:214
 msgid "Save Template..."
 msgstr "Guardar plantilla..."
 
-#: ardour_ui_ed.cc:159
+#: ardour_ui_ed.cc:217
 msgid "Metadata"
 msgstr "Metadatos"
 
-#: ardour_ui_ed.cc:162
+#: ardour_ui_ed.cc:220
 msgid "Edit Metadata..."
 msgstr "Editar metadatos..."
 
-#: ardour_ui_ed.cc:165
+#: ardour_ui_ed.cc:223
 msgid "Import Metadata..."
 msgstr "Importar metadatos..."
 
-#: ardour_ui_ed.cc:168
-msgid "Export To Audio File(s)..."
+#: ardour_ui_ed.cc:226
+msgid "Export to Audio File(s)..."
 msgstr "Exportar a archivo(s) de audio..."
 
-#: ardour_ui_ed.cc:171
+#: ardour_ui_ed.cc:229
 msgid "Stem export..."
 msgstr "Stem export..."
 
-#: ardour_ui_ed.cc:174 editor_export_audio.cc:65 export_dialog.cc:129
-#: export_video_dialog.cc:84
+#: ardour_ui_ed.cc:232 editor_export_audio.cc:66
+#: export_channel_selector.cc:190 export_channel_selector.cc:578
+#: export_dialog.cc:131 export_video_dialog.cc:80
 msgid "Export"
 msgstr "Exportar"
 
-#: ardour_ui_ed.cc:177
+#: ardour_ui_ed.cc:235
 msgid "Clean-up Unused Sources..."
 msgstr "Purgar archivos no usados..."
 
-#: ardour_ui_ed.cc:181
+#: ardour_ui_ed.cc:239
+msgid "Reset Peak Files"
+msgstr ""
+
+#: ardour_ui_ed.cc:243
 msgid "Flush Wastebasket"
 msgstr "Vaciar papelera"
 
-#: ardour_ui_ed.cc:188
+#: ardour_ui_ed.cc:251
 msgid "Quit"
 msgstr "Salir"
 
-#: ardour_ui_ed.cc:192
+#: ardour_ui_ed.cc:252 ardour_ui_ed.cc:259 ardour_ui_ed.cc:260
+#: ardour_ui_ed.cc:261 automation_time_axis.cc:545 editor_actions.cc:686
+#: editor_markers.cc:907 location_ui.cc:61 plugin_selector.cc:97
+#: route_time_axis.cc:864
+msgid "Hide"
+msgstr "Ocultar"
+
+#: ardour_ui_ed.cc:263 ardour_ui_ed.cc:264 ardour_ui_ed.cc:265
+msgid "Attach"
+msgstr "Acoplar"
+
+#: ardour_ui_ed.cc:275 ardour_ui_ed.cc:276 ardour_ui_ed.cc:277
+#: ardour_ui_ed.cc:283 ardour_ui_ed.cc:284 ardour_ui_ed.cc:285
+msgid "Change"
+msgstr "Cambio"
+
+#: ardour_ui_ed.cc:287
+msgid "Previous Tab"
+msgstr "Pestaña anterior"
+
+#: ardour_ui_ed.cc:288
+msgid "Next Tab"
+msgstr "Siguiente pestaña"
+
+#: ardour_ui_ed.cc:290
+msgid "Toggle Editor & Mixer"
+msgstr "Conmutar Editor y Mezclador"
+
+#: ardour_ui_ed.cc:294
 msgid "Maximise Editor Space"
 msgstr "Maximizar Editor"
 
-#: ardour_ui_ed.cc:193
+#: ardour_ui_ed.cc:295
 msgid "Maximise Mixer Space"
 msgstr "Maximizar Mezclador"
 
-#: ardour_ui_ed.cc:194
-msgid "Show Toolbars"
-msgstr "Mostrar barras de herramientas"
+#: ardour_ui_ed.cc:298
+msgid "Toggle Mixer List"
+msgstr "Conmutar lista de Mezclador"
+
+#: ardour_ui_ed.cc:301
+msgid "Toggle Monitor Section Visibility"
+msgstr "Conmutar visibilidad de sección de monitorización"
 
-#: ardour_ui_ed.cc:198
+#: ardour_ui_ed.cc:305
 msgid "Show more UI preferences"
 msgstr "Mostrar más preferencias de la IU"
 
-#: ardour_ui_ed.cc:200 mixer_ui.cc:1924 mixer_ui.cc:1930
-msgid "Window|Mixer"
-msgstr "Mezclador"
-
-#: ardour_ui_ed.cc:201
-msgid "Toggle Editor+Mixer"
-msgstr "Mostrar Mezclador"
+#: ardour_ui_ed.cc:308
+msgid "Window|Scripting"
+msgstr "Scripts"
 
-#: ardour_ui_ed.cc:202 meterbridge.cc:218 meterbridge.cc:224
+#: ardour_ui_ed.cc:309 meterbridge.cc:214 meterbridge.cc:220
 msgid "Window|Meterbridge"
-msgstr ""
+msgstr "Meterbridge"
 
-#: ardour_ui_ed.cc:204
-msgid "Reattach All Tearoffs"
-msgstr "Reintegrar las barras dispersas"
-
-#: ardour_ui_ed.cc:206 midi_tracer.cc:45
+#: ardour_ui_ed.cc:311 midi_tracer.cc:45
 msgid "MIDI Tracer"
 msgstr "Rastreador MIDI"
 
-#: ardour_ui_ed.cc:208
+#: ardour_ui_ed.cc:314
 msgid "Chat"
 msgstr "Chat"
 
-#: ardour_ui_ed.cc:210
+#: ardour_ui_ed.cc:316
 msgid "Help|Manual"
 msgstr "Manual"
 
-#: ardour_ui_ed.cc:211
-msgid "Reference"
+#: ardour_ui_ed.cc:317
+msgid "Manual|Reference"
 msgstr "Referencia"
 
-#: ardour_ui_ed.cc:212
-msgid "Report A Bug"
-msgstr ""
+#: ardour_ui_ed.cc:318
+msgid "Report a Bug"
+msgstr "Report a Bug"
 
-#: ardour_ui_ed.cc:213
+#: ardour_ui_ed.cc:319
 msgid "Cheat Sheet"
 msgstr ""
 
-#: ardour_ui_ed.cc:214
+#: ardour_ui_ed.cc:320
 msgid "Ardour Website"
 msgstr ""
 
-#: ardour_ui_ed.cc:215
+#: ardour_ui_ed.cc:321
 msgid "Ardour Development"
 msgstr "Desarrollo de Ardour"
 
-#: ardour_ui_ed.cc:216
+#: ardour_ui_ed.cc:322
 msgid "User Forums"
 msgstr "Foros de usuarios"
 
-#: ardour_ui_ed.cc:217
-msgid "How to report a bug"
+#: ardour_ui_ed.cc:323
+msgid "How to Report a Bug"
 msgstr ""
 
-#: ardour_ui_ed.cc:219 plugin_ui.cc:419
+#: ardour_ui_ed.cc:325 luawindow.cc:100 luawindow.cc:654 plugin_ui.cc:419
 msgid "Save"
 msgstr "Guardar"
 
-#: ardour_ui_ed.cc:227 rc_option_editor.cc:1419 rc_option_editor.cc:1430
-#: rc_option_editor.cc:1441 rc_option_editor.cc:1450 rc_option_editor.cc:1463
-#: rc_option_editor.cc:1476 rc_option_editor.cc:1485 rc_option_editor.cc:1495
-#: rc_option_editor.cc:1497 rc_option_editor.cc:1506 rc_option_editor.cc:1522
-#: rc_option_editor.cc:1543 rc_option_editor.cc:1561 rc_option_editor.cc:1563
-#: rc_option_editor.cc:1579 rc_option_editor.cc:1582 rc_option_editor.cc:1584
-#: rc_option_editor.cc:1601 rc_option_editor.cc:1612
+#: ardour_ui_ed.cc:333 rc_option_editor.cc:1975 rc_option_editor.cc:1986
+#: rc_option_editor.cc:1997 rc_option_editor.cc:2008 rc_option_editor.cc:2017
+#: rc_option_editor.cc:2030 rc_option_editor.cc:2043 rc_option_editor.cc:2052
+#: rc_option_editor.cc:2062 rc_option_editor.cc:2079 rc_option_editor.cc:2186
 msgid "Transport"
 msgstr "Transporte"
 
-#: ardour_ui_ed.cc:233
+#: ardour_ui_ed.cc:339 engine_dialog.cc:88
 msgid "Stop"
 msgstr "Stop"
 
-#: ardour_ui_ed.cc:236
+#: ardour_ui_ed.cc:342
 msgid "Roll"
 msgstr "Roll"
 
-#: ardour_ui_ed.cc:240 ardour_ui_ed.cc:243
+#: ardour_ui_ed.cc:346 ardour_ui_ed.cc:349
 msgid "Start/Stop"
 msgstr "Comenzar/Detener"
 
-#: ardour_ui_ed.cc:246
+#: ardour_ui_ed.cc:352
 msgid "Start/Continue/Stop"
 msgstr "Comenzar/Continuar/Detener"
 
-#: ardour_ui_ed.cc:249
+#: ardour_ui_ed.cc:355
 msgid "Stop and Forget Capture"
 msgstr "Detener y destruir captura"
 
 # it's not literal, but it's what it does
 # translating to "rollo" or "rodar" doesn't make much sense in spanish
 # am I missing something?
-#: ardour_ui_ed.cc:259
-msgid "Transition To Roll"
+#: ardour_ui_ed.cc:365
+msgid "Transition to Roll"
 msgstr "Transición hacia delante"
 
-#: ardour_ui_ed.cc:263
-msgid "Transition To Reverse"
+#: ardour_ui_ed.cc:369
+msgid "Transition to Reverse"
 msgstr "Transición hacia atrás"
 
-#: ardour_ui_ed.cc:267
+#: ardour_ui_ed.cc:373
 msgid "Play Loop Range"
 msgstr "Reproducir rango de bucle"
 
-#: ardour_ui_ed.cc:270
+#: ardour_ui_ed.cc:376
 msgid "Play Selection"
 msgstr "Reproducir selección"
 
-#: ardour_ui_ed.cc:273
+#: ardour_ui_ed.cc:379
 msgid "Play Selection w/Preroll"
 msgstr "Reproducir selección con Preroll"
 
-#: ardour_ui_ed.cc:277
+#: ardour_ui_ed.cc:383
 msgid "Enable Record"
 msgstr "Activar grabación"
 
-#: ardour_ui_ed.cc:280 ardour_ui_ed.cc:284
+#: ardour_ui_ed.cc:386 ardour_ui_ed.cc:390
 msgid "Start Recording"
 msgstr "Iniciar grabación"
 
-#: ardour_ui_ed.cc:288
+#: ardour_ui_ed.cc:394
 msgid "Rewind"
 msgstr "Rebobinar"
 
-#: ardour_ui_ed.cc:291
+#: ardour_ui_ed.cc:397
 msgid "Rewind (Slow)"
 msgstr "Rebobinar (Lento)"
 
-#: ardour_ui_ed.cc:294
+#: ardour_ui_ed.cc:400
 msgid "Rewind (Fast)"
 msgstr "Rebobinar (Rápido)"
 
-#: ardour_ui_ed.cc:297
+#: ardour_ui_ed.cc:403
 msgid "Forward"
 msgstr "Adelante"
 
-#: ardour_ui_ed.cc:300
+#: ardour_ui_ed.cc:406
 msgid "Forward (Slow)"
 msgstr "Adelante (Lento)"
 
-#: ardour_ui_ed.cc:303
+#: ardour_ui_ed.cc:409
 msgid "Forward (Fast)"
 msgstr "Adelante (Rápido)"
 
-#: ardour_ui_ed.cc:306
+#: ardour_ui_ed.cc:412
 msgid "Go to Zero"
 msgstr "Ir a cero"
 
-#: ardour_ui_ed.cc:309 ardour_ui_ed.cc:312
+#: ardour_ui_ed.cc:415 ardour_ui_ed.cc:418
 msgid "Go to Start"
 msgstr "Ir a inicio"
 
-#: ardour_ui_ed.cc:315
+#: ardour_ui_ed.cc:421
 msgid "Go to End"
 msgstr "Ir a fin"
 
-#: ardour_ui_ed.cc:318
+#: ardour_ui_ed.cc:424
 msgid "Go to Wall Clock"
-msgstr "Ir a hora actual"
+msgstr "Ir a reloj "
 
-#: ardour_ui_ed.cc:323 ardour_ui_ed.cc:326
+#: ardour_ui_ed.cc:429 ardour_ui_ed.cc:432
 msgid "Numpad Decimal"
 msgstr ""
 
-#: ardour_ui_ed.cc:329
+#: ardour_ui_ed.cc:435
 msgid "Numpad 0"
 msgstr ""
 
-#: ardour_ui_ed.cc:332
+#: ardour_ui_ed.cc:438
 msgid "Numpad 1"
 msgstr ""
 
-#: ardour_ui_ed.cc:335
+#: ardour_ui_ed.cc:441
 msgid "Numpad 2"
 msgstr ""
 
-#: ardour_ui_ed.cc:338
+#: ardour_ui_ed.cc:444
 msgid "Numpad 3"
 msgstr ""
 
-#: ardour_ui_ed.cc:341
+#: ardour_ui_ed.cc:447
 msgid "Numpad 4"
 msgstr ""
 
-#: ardour_ui_ed.cc:344
+#: ardour_ui_ed.cc:450
 msgid "Numpad 5"
 msgstr ""
 
-#: ardour_ui_ed.cc:347
+#: ardour_ui_ed.cc:453
 msgid "Numpad 6"
 msgstr ""
 
-#: ardour_ui_ed.cc:350
+#: ardour_ui_ed.cc:456
 msgid "Numpad 7"
 msgstr ""
 
-#: ardour_ui_ed.cc:353
+#: ardour_ui_ed.cc:459
 msgid "Numpad 8"
 msgstr ""
 
-#: ardour_ui_ed.cc:356
+#: ardour_ui_ed.cc:462
 msgid "Numpad 9"
 msgstr ""
 
-#: ardour_ui_ed.cc:360
+#: ardour_ui_ed.cc:466
 msgid "Focus On Clock"
 msgstr "Enfocar en reloj"
 
-#: ardour_ui_ed.cc:364 ardour_ui_ed.cc:373 audio_clock.cc:2091 editor.cc:258
-#: editor_actions.cc:569 editor_actions.cc:578 export_timespan_selector.cc:88
+#: ardour_ui_ed.cc:470 ardour_ui_ed.cc:479 audio_clock.cc:2122 editor.cc:321
+#: editor_actions.cc:610 editor_actions.cc:619 export_timespan_selector.cc:85
 #: session_option_editor.cc:41 session_option_editor.cc:61
 #: session_option_editor.cc:80 session_option_editor.cc:96
 #: session_option_editor.cc:109 session_option_editor.cc:122
@@ -2094,126 +2501,138 @@ msgstr "Enfocar en reloj"
 msgid "Timecode"
 msgstr "Timecode"
 
-#: ardour_ui_ed.cc:366 ardour_ui_ed.cc:375 editor_actions.cc:567
+#: ardour_ui_ed.cc:472 ardour_ui_ed.cc:481 editor_actions.cc:608
 msgid "Bars & Beats"
 msgstr "Compases y pulsos"
 
-#: ardour_ui_ed.cc:368 ardour_ui_ed.cc:377
+#: ardour_ui_ed.cc:474 ardour_ui_ed.cc:483
 msgid "Minutes & Seconds"
 msgstr "Minutos y segundos"
 
-#: ardour_ui_ed.cc:370 ardour_ui_ed.cc:379 audio_clock.cc:2095 editor.cc:259
-#: editor_actions.cc:568
+#: ardour_ui_ed.cc:476 ardour_ui_ed.cc:485 audio_clock.cc:2125 editor.cc:322
+#: editor_actions.cc:609
 msgid "Samples"
 msgstr "Muestras"
 
-#: ardour_ui_ed.cc:382
+#: ardour_ui_ed.cc:488
 msgid "Punch In"
 msgstr "Pinchar"
 
-#: ardour_ui_ed.cc:383 mixer_strip.cc:1819 mixer_strip.cc:1843
-#: mixer_strip.cc:2007 route_ui.cc:162 time_info_box.cc:116
+#: ardour_ui_ed.cc:489 mixer_strip.cc:1992 mixer_strip.cc:2193 route_ui.cc:187
+#: time_info_box.cc:110
 msgid "In"
 msgstr "Entrada"
 
-#: ardour_ui_ed.cc:386
+#: ardour_ui_ed.cc:492
 msgid "Punch Out"
 msgstr "Despinchar"
 
-#: ardour_ui_ed.cc:387 mixer_strip.cc:1831 time_info_box.cc:117
+#: ardour_ui_ed.cc:493 mixer_strip.cc:2004 time_info_box.cc:111
 msgid "Out"
 msgstr "Salida"
 
-#: ardour_ui_ed.cc:390
+#: ardour_ui_ed.cc:496
 msgid "Punch In/Out"
 msgstr "Pinchazo"
 
-#: ardour_ui_ed.cc:391
+#: ardour_ui_ed.cc:497
 msgid "In/Out"
 msgstr "In/Out"
 
-#: ardour_ui_ed.cc:394 rc_option_editor.cc:1376
+#: ardour_ui_ed.cc:500 rc_option_editor.cc:1941
 msgid "Click"
 msgstr "Claqueta"
 
-#: ardour_ui_ed.cc:397
+#: ardour_ui_ed.cc:503
 msgid "Auto Input"
 msgstr "Auto Entrada"
 
 # Reproducir Auto is too big
-#: ardour_ui_ed.cc:400
+#: ardour_ui_ed.cc:506
 msgid "Auto Play"
 msgstr "Auto Play"
 
-#: ardour_ui_ed.cc:411
+#: ardour_ui_ed.cc:517
 msgid "Sync Startup to Video"
 msgstr "Sincronizar inicio a video"
 
-#: ardour_ui_ed.cc:413
+#: ardour_ui_ed.cc:519
 msgid "Time Master"
 msgstr "Maestro"
 
-#: ardour_ui_ed.cc:420
+#: ardour_ui_ed.cc:521
+msgid "Use External Positional Sync Source"
+msgstr "Usar sincronización de posición externa"
+
+#: ardour_ui_ed.cc:526
 msgid "Toggle Record Enable Track %1"
 msgstr "Activar/Desactivar grabación en pista %1"
 
-#: ardour_ui_ed.cc:427
+#: ardour_ui_ed.cc:533
 msgid "Percentage"
 msgstr "Porcentaje"
 
-#: ardour_ui_ed.cc:428 shuttle_control.cc:178
+#: ardour_ui_ed.cc:534 shuttle_control.cc:205
 msgid "Semitones"
 msgstr "Semitonos"
 
-#: ardour_ui_ed.cc:432
+#: ardour_ui_ed.cc:538
 msgid "Send MTC"
 msgstr "Enviar MTC"
 
-#: ardour_ui_ed.cc:434
+#: ardour_ui_ed.cc:540
 msgid "Send MMC"
 msgstr "Enviar MMC"
 
-#: ardour_ui_ed.cc:436
+#: ardour_ui_ed.cc:542
 msgid "Use MMC"
 msgstr "Usar MMC"
 
-#: ardour_ui_ed.cc:438 rc_option_editor.cc:2097
+#: ardour_ui_ed.cc:544 rc_option_editor.cc:2730
 msgid "Send MIDI Clock"
 msgstr "Enviar MIDI Clock"
 
-#: ardour_ui_ed.cc:440
+#: ardour_ui_ed.cc:546
 msgid "Send MIDI Feedback"
 msgstr "Enviar MIDI feedback"
 
-#: ardour_ui_ed.cc:446
+#: ardour_ui_ed.cc:552
 msgid "Panic"
 msgstr "Pánico"
 
-#: ardour_ui_ed.cc:534
+#: ardour_ui_ed.cc:618
 msgid "Wall Clock"
 msgstr "Hora actual"
 
-#: ardour_ui_ed.cc:536
+#: ardour_ui_ed.cc:620
 msgid "Disk Space"
 msgstr "Espacio en disco"
 
-#: ardour_ui_ed.cc:537
+#: ardour_ui_ed.cc:621
 msgid "DSP"
 msgstr "DSP"
 
-#: ardour_ui_ed.cc:538
+#: ardour_ui_ed.cc:622
+msgid "X-run"
+msgstr "X-run"
+
+#: ardour_ui_ed.cc:623
+msgid "Active Peak-file Work"
+msgstr ""
+
+#: ardour_ui_ed.cc:624
 msgid "Buffers"
 msgstr "Buffers"
 
-#: ardour_ui_ed.cc:540
+#: ardour_ui_ed.cc:626
 msgid "Timecode Format"
 msgstr "Formato de timecode"
 
-#: ardour_ui_ed.cc:541
+#: ardour_ui_ed.cc:627
 msgid "File Format"
-msgstr "Formato archivo"
+msgstr "Formato de archivo"
 
-#: ardour_ui_options.cc:63
+#: ardour_ui_options.cc:55
 msgid ""
 "It is not possible to use JACK as the the sync source\n"
 "when the pull up/down setting is non-zero."
@@ -2221,133 +2640,138 @@ msgstr ""
 "No es posible usar JACK como fuente de sincronización\n"
 "cuando la configuración de pull up/down no es cero."
 
-#: ardour_ui_options.cc:317
+#: ardour_ui_options.cc:309
 msgid "Internal"
 msgstr "Interno"
 
-#: ardour_ui_options.cc:498
+#: ardour_ui_options.cc:518
 msgid "Enable/Disable external positional sync"
 msgstr "Activar/Desactivar sincronización de posición externa"
 
-#: ardour_ui_options.cc:500
+#: ardour_ui_options.cc:520
 msgid "Sync to JACK is not possible: video pull up/down is set"
 msgstr "No es posible sincronizar a JACK: video pull up/down está establecido"
 
-#: audio_clock.cc:1047 audio_clock.cc:1066
+#: audio_clock.cc:1057 audio_clock.cc:1076
 msgid "--pending--"
 msgstr "--pendiente--"
 
-#: audio_clock.cc:1118
+#: audio_clock.cc:1128
 msgid "SR"
 msgstr "SR"
 
-#: audio_clock.cc:1124 audio_clock.cc:1128
+#: audio_clock.cc:1134 audio_clock.cc:1138
 msgid "Pull"
 msgstr "Pull"
 
-#: audio_clock.cc:1126
+#: audio_clock.cc:1136
 #, c-format
 msgid "%+.4f%%"
 msgstr "%+.4f%%"
 
-#: audio_clock.cc:1282 editor.cc:260 editor_actions.cc:139
-#: editor_actions.cc:561
+#: audio_clock.cc:1292 editor.cc:323 editor_actions.cc:142
+#: editor_actions.cc:602
 msgid "Tempo"
 msgstr "Tempo"
 
-#: audio_clock.cc:1286 editor.cc:261 editor_actions.cc:562
+#: audio_clock.cc:1296 editor.cc:324 editor_actions.cc:603
 msgid "Meter"
 msgstr "Métrica"
 
-#: audio_clock.cc:1864 audio_streamview.cc:115 editor_actions.cc:1089
-#: session_metadata_dialog.cc:452 session_metadata_dialog.cc:500
-#: session_metadata_dialog.cc:556 session_metadata_dialog.cc:845
-#: streamview.cc:470
+#: audio_clock.cc:1878 audio_streamview.cc:117 editor_actions.cc:1092
+#: luainstance.cc:959 luainstance.cc:1575 plugin_pin_dialog.cc:859
+#: plugin_selector.cc:995 plugin_selector.cc:1016
+#: session_metadata_dialog.cc:455 session_metadata_dialog.cc:503
+#: session_metadata_dialog.cc:559 session_metadata_dialog.cc:848
+#: streamview.cc:474
 msgid "programming error: %1"
 msgstr "programming error: %1"
 
-#: audio_clock.cc:1997 audio_clock.cc:2025
+#: audio_clock.cc:2011 audio_clock.cc:2039
 msgid "programming error: %1 %2"
 msgstr "programming error: %1: %2"
 
-#: audio_clock.cc:2093 editor.cc:257 export_timespan_selector.cc:98
+#: audio_clock.cc:2123 editor.cc:320 export_timespan_selector.cc:105
 msgid "Bars:Beats"
 msgstr "Compases:Pulsos"
 
-#: audio_clock.cc:2094 export_timespan_selector.cc:93
+#: audio_clock.cc:2124 export_timespan_selector.cc:100
 msgid "Minutes:Seconds"
 msgstr "Minutos:Segundos"
 
-#: audio_clock.cc:2099
-msgid "Set From Playhead"
+#: audio_clock.cc:2129
+msgid "Set from Playhead"
 msgstr "Establecer según cursor"
 
-#: audio_clock.cc:2100
+#: audio_clock.cc:2130
 msgid "Locate to This Time"
 msgstr "Posicionar aquí"
 
-#: audio_region_editor.cc:64 control_point_dialog.cc:49 rhythm_ferret.cc:124
-#: rhythm_ferret.cc:129 rhythm_ferret.cc:134
+#: audio_clock.cc:2133
+msgid "Copy to clipboard"
+msgstr ""
+
+#: audio_region_editor.cc:60 control_point_dialog.cc:49 rhythm_ferret.cc:137
+#: rhythm_ferret.cc:154
 msgid "dB"
 msgstr "dB"
 
-#: audio_region_editor.cc:67
+#: audio_region_editor.cc:63
 msgid "Region gain:"
 msgstr "Ganancia de región:"
 
-#: audio_region_editor.cc:77 export_format_dialog.cc:43
+#: audio_region_editor.cc:73 export_format_dialog.cc:49 export_report.cc:772
+#: export_report.cc:1185 fft_graph.cc:370
 msgid "dBFS"
 msgstr "dBFS"
 
-#: audio_region_editor.cc:80
+#: audio_region_editor.cc:76
 msgid "Peak amplitude:"
 msgstr "Amplitud de pico:"
 
-#: audio_region_editor.cc:91
+#: audio_region_editor.cc:87
 msgid "Calculating..."
 msgstr "Calculando..."
 
-#: audio_region_view.cc:1243
+#: audio_region_view.cc:1385
 msgid "add gain control point"
 msgstr "añadir punto de control ganancia"
 
-#: automation_controller.cc:286 automation_controller.cc:302
+#: automation_controller.cc:304 automation_controller.cc:320
 msgid "Select Note..."
 msgstr "Seleccionar nota..."
 
-#: automation_controller.cc:293
+#: automation_controller.cc:311
 msgid "Halve"
 msgstr ""
 
-#: automation_controller.cc:296
+#: automation_controller.cc:314
 msgid "Double"
 msgstr ""
 
-#: automation_controller.cc:307
-msgid "Set to %1 beat(s)"
-msgstr ""
+#: automation_controller.cc:325
+msgid "Set to %1 beat"
+msgid_plural "Set to %1 beats"
+msgstr[0] "Ajustar a %1 pulso"
+msgstr[1] "Ajustar a %1 pulsos"
 
-#: automation_line.cc:286 automation_line.cc:462
+#: automation_line.cc:292 editor_drag.cc:4387
 msgid "automation event move"
 msgstr "mover evento de automatización"
 
-#: automation_line.cc:488 automation_line.cc:508
-msgid "automation range move"
-msgstr "mover rango de automatización"
-
-#: automation_line.cc:880 region_gain_line.cc:72
+#: automation_line.cc:888 region_gain_line.cc:75
 msgid "remove control point"
 msgstr "eliminar punto de control"
 
-#: automation_line.cc:1003
+#: automation_line.cc:1013
 msgid "Ignoring illegal points on AutomationLine \"%1\""
 msgstr "Ignorando puntos inválidos de AutomationLine \"%1\""
 
-#: automation_region_view.cc:190 automation_time_axis.cc:644
+#: automation_region_view.cc:193 automation_time_axis.cc:649
 msgid "add automation event"
 msgstr "añadir evento de automatización"
 
-#: automation_streamview.cc:95
+#: automation_streamview.cc:94
 msgid "unable to display automation region for control without list"
 msgstr ""
 
@@ -2359,63 +2783,59 @@ msgstr "estado de automatización"
 msgid "hide track"
 msgstr "ocultar pista"
 
-#: automation_time_axis.cc:308 automation_time_axis.cc:360
-#: automation_time_axis.cc:554 gain_meter.cc:220 generic_pluginui.cc:523
-#: generic_pluginui.cc:817 panner_ui.cc:151
+#: automation_time_axis.cc:310 automation_time_axis.cc:362
+#: automation_time_axis.cc:556 gain_meter.cc:230 generic_pluginui.cc:590
+#: generic_pluginui.cc:934 panner_ui.cc:151
 msgid "Automation|Manual"
 msgstr "Manual"
 
-#: automation_time_axis.cc:310 automation_time_axis.cc:371
-#: automation_time_axis.cc:559 editor.cc:1904 editor.cc:1981
-#: editor_actions.cc:122 editor_actions.cc:1920 gain_meter.cc:223
-#: generic_pluginui.cc:99 generic_pluginui.cc:526 generic_pluginui.cc:819
-#: midi_time_axis.cc:1606 midi_time_axis.cc:1609 midi_time_axis.cc:1612
+#: automation_time_axis.cc:312 automation_time_axis.cc:373
+#: automation_time_axis.cc:561 editor.cc:2033 editor.cc:2111
+#: editor_actions.cc:125 editor_actions.cc:1937 gain_meter.cc:232
+#: generic_pluginui.cc:100 generic_pluginui.cc:593 generic_pluginui.cc:936
+#: midi_time_axis.cc:1610 midi_time_axis.cc:1613 midi_time_axis.cc:1616
 #: panner_ui.cc:154
 msgid "Play"
 msgstr "Reproducir"
 
-#: automation_time_axis.cc:312 automation_time_axis.cc:382
-#: automation_time_axis.cc:564 gain_meter.cc:226 generic_pluginui.cc:101
-#: generic_pluginui.cc:529 generic_pluginui.cc:821 panner_ui.cc:157
+#: automation_time_axis.cc:314 automation_time_axis.cc:384
+#: automation_time_axis.cc:566 gain_meter.cc:234 generic_pluginui.cc:102
+#: generic_pluginui.cc:596 generic_pluginui.cc:938 panner_ui.cc:157
 msgid "Write"
 msgstr "Escribir"
 
-#: automation_time_axis.cc:314 automation_time_axis.cc:393
-#: automation_time_axis.cc:569 gain_meter.cc:229 generic_pluginui.cc:103
-#: generic_pluginui.cc:532 generic_pluginui.cc:823 panner_ui.cc:160
+#: automation_time_axis.cc:316 automation_time_axis.cc:395
+#: automation_time_axis.cc:571 gain_meter.cc:236 generic_pluginui.cc:104
+#: generic_pluginui.cc:599 generic_pluginui.cc:940 panner_ui.cc:160
 msgid "Touch"
 msgstr "Tocar"
 
-#: automation_time_axis.cc:404 generic_pluginui.cc:535 meter_patterns.cc:112
+#: automation_time_axis.cc:406 generic_pluginui.cc:602 meter_patterns.cc:118
 msgid "???"
 msgstr "???"
 
-#: automation_time_axis.cc:445
+#: automation_time_axis.cc:447
 msgid "clear automation"
 msgstr "limpiar automatización"
 
-#: automation_time_axis.cc:543 editor_actions.cc:645 editor_markers.cc:902
-#: location_ui.cc:57 plugin_selector.cc:86 route_time_axis.cc:854
-msgid "Hide"
-msgstr "Ocultar"
-
-#: automation_time_axis.cc:545
+#: automation_time_axis.cc:547 rc_option_editor.cc:2916
+#: rc_option_editor.cc:2921 rc_option_editor.cc:2967 rc_option_editor.cc:2972
 msgid "Clear"
 msgstr "Limpiar"
 
-#: automation_time_axis.cc:576
+#: automation_time_axis.cc:578
 msgid "State"
 msgstr "Estado"
 
-#: automation_time_axis.cc:592
+#: automation_time_axis.cc:594
 msgid "Discrete"
 msgstr "Discreto"
 
-#: automation_time_axis.cc:598 export_format_dialog.cc:485
+#: automation_time_axis.cc:600 export_format_dialog.cc:552
 msgid "Linear"
 msgstr "Lineal"
 
-#: automation_time_axis.cc:604 rhythm_ferret.cc:109 shuttle_control.cc:197
+#: automation_time_axis.cc:606 rhythm_ferret.cc:118 shuttle_control.cc:224
 msgid "Mode"
 msgstr "Modo"
 
@@ -2431,35 +2851,38 @@ msgstr "Editar conjunto"
 msgid "Direction:"
 msgstr "Dirección:"
 
-#: bundle_manager.cc:206 bundle_manager.cc:210 engine_dialog.cc:662
-#: mixer_strip.cc:162 mixer_strip.cc:367 mixer_strip.cc:2240
-#: rc_option_editor.cc:2326
+#: bundle_manager.cc:206 bundle_manager.cc:210 engine_dialog.cc:976
+#: mixer_strip.cc:175 mixer_strip.cc:392 mixer_strip.cc:2451
+#: rc_option_editor.cc:3135
 msgid "Input"
 msgstr "Entrada"
 
 #: bundle_manager.cc:207 bundle_manager.cc:212 bundle_manager.cc:246
-#: engine_dialog.cc:664 mixer_strip.cc:166 mixer_strip.cc:371
-#: mixer_strip.cc:2243 rc_option_editor.cc:2330
+#: engine_dialog.cc:978 mixer_strip.cc:179 mixer_strip.cc:396
+#: mixer_strip.cc:2454 monitor_section.cc:296 monitor_section.cc:300
+#: rc_option_editor.cc:3139
 msgid "Output"
 msgstr "Salida"
 
-#: bundle_manager.cc:265 editor.cc:1945 editor_actions.cc:94
-#: editor_actions.cc:104 rc_option_editor.cc:1087 rc_option_editor.cc:1094
+#: bundle_manager.cc:265 editor.cc:2075 editor_actions.cc:97
+#: editor_actions.cc:107 lua_script_manager.cc:33 rc_option_editor.cc:2928
+#: rc_option_editor.cc:2942
 msgid "Edit"
 msgstr "Editar"
 
-#: bundle_manager.cc:266 editor.cc:5902 editor.cc:5930 editor_actions.cc:338
-#: editor_actions.cc:339 editor_actions.cc:405 plugin_ui.cc:420
-#: processor_box.cc:2458 route_time_axis.cc:859
+#: bundle_manager.cc:266 editor.cc:5962 editor.cc:5992 editor_actions.cc:360
+#: editor_actions.cc:361 luawindow.cc:101 plugin_ui.cc:420
+#: processor_box.cc:3669 processor_box.cc:3671
 msgid "Delete"
 msgstr "Eliminar"
 
-#: bundle_manager.cc:272 bundle_manager.cc:439 editor_route_groups.cc:97
-#: editor_routes.cc:206 midi_list_editor.cc:107 session_metadata_dialog.cc:646
+#: bundle_manager.cc:272 bundle_manager.cc:439 editor_route_groups.cc:98
+#: editor_routes.cc:233 lua_script_manager.cc:42 lua_script_manager.cc:76
+#: midi_list_editor.cc:107 session_metadata_dialog.cc:649
 msgid "Name"
 msgstr "Nombre"
 
-#: bundle_manager.cc:283
+#: bundle_manager.cc:283 luawindow.cc:566
 msgid "New"
 msgstr "Nueva"
 
@@ -2475,6 +2898,39 @@ msgstr "Añadir canal"
 msgid "Rename Channel"
 msgstr "Renombrar canal"
 
+#: color_theme_manager.cc:58
+msgid "Restore Defaults"
+msgstr "Restablecer lo predeterminado"
+
+#: color_theme_manager.cc:62
+msgid "Color Theme"
+msgstr "Tema de color"
+
+#: color_theme_manager.cc:118
+msgid "Object"
+msgstr "Objeto"
+
+#: color_theme_manager.cc:121 route_group_dialog.cc:53
+#: route_group_dialog.cc:81
+msgid "Color"
+msgstr "Color"
+
+#: color_theme_manager.cc:143
+msgid "Items"
+msgstr ""
+
+#: color_theme_manager.cc:144
+msgid "Palette"
+msgstr ""
+
+#: color_theme_manager.cc:145
+msgid "Transparency"
+msgstr "Transparencia"
+
+#: color_theme_manager.cc:467
+msgid "Color Palette"
+msgstr "Paleta de color"
+
 #: configinfo.cc:28
 msgid "Build Configuration"
 msgstr "Configuración compilada"
@@ -2487,6 +2943,42 @@ msgstr "Punto de control"
 msgid "Value"
 msgstr "Valor"
 
+#: control_slave_ui.cc:50 mixer_ui.cc:254
+msgid "Control Masters"
+msgstr ""
+
+#: control_slave_ui.cc:54
+msgid "-vca-"
+msgstr ""
+
+#: control_slave_ui.cc:211
+msgid "Unassign All"
+msgstr "Desasignar todos"
+
+#: duplicate_routes_dialog.cc:35
+msgid "Duplicate Tracks & Busses"
+msgstr "Duplicar pistas y buses"
+
+#: duplicate_routes_dialog.cc:36
+msgid "Copy playlists"
+msgstr "Copiar listas de reproducción"
+
+#: duplicate_routes_dialog.cc:37
+msgid "Create new (empty) playlists"
+msgstr "Nuevas listas de reproducción (vacías)"
+
+#: duplicate_routes_dialog.cc:38
+msgid "Share playlists"
+msgstr "Compartir listas de reproducción"
+
+#: duplicate_routes_dialog.cc:41
+msgid "Duplicate each track/bus this number of times:"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:176
+msgid "1 or more tracks/busses could not be duplicated"
+msgstr ""
+
 #: edit_note_dialog.cc:42
 msgid "Note"
 msgstr "Nota"
@@ -2524,596 +3016,603 @@ msgstr "Tono"
 msgid "Velocity"
 msgstr "Intensidad"
 
-#: edit_note_dialog.cc:88 patch_change_dialog.cc:66
+#: edit_note_dialog.cc:88 export_report.cc:246 export_report.cc:688
+#: patch_change_dialog.cc:66
 msgid "Time"
 msgstr "Tiempo"
 
-#: edit_note_dialog.cc:98 editor_regions.cc:115
-#: export_timespan_selector.cc:378 export_timespan_selector.cc:440
-#: location_ui.cc:320 midi_list_editor.cc:115 time_info_box.cc:108
+#: edit_note_dialog.cc:99 editor_regions.cc:162
+#: export_timespan_selector.cc:375 export_timespan_selector.cc:437
+#: location_ui.cc:322 midi_list_editor.cc:115 time_info_box.cc:102
 msgid "Length"
 msgstr "Duración"
 
-#: edit_note_dialog.cc:165
+#: edit_note_dialog.cc:166
 msgid "edit note"
 msgstr "editar nota"
 
-#: editor.cc:147
+#: editor.cc:160
 msgid "CD Frames"
 msgstr "Cuadros CD"
 
-#: editor.cc:148
+#: editor.cc:161
 msgid "TC Frames"
 msgstr ""
 
-#: editor.cc:149
+#: editor.cc:162
 msgid "TC Seconds"
 msgstr ""
 
-#: editor.cc:150
+#: editor.cc:163
 msgid "TC Minutes"
 msgstr ""
 
-#: editor.cc:151
+#: editor.cc:164
 msgid "Seconds"
 msgstr "Segundos"
 
-#: editor.cc:152
+#: editor.cc:165
 msgid "Minutes"
 msgstr "Minutos"
 
-#: editor.cc:153 quantize_dialog.cc:37 quantize_dialog.cc:141
+#: editor.cc:166 quantize_dialog.cc:37
 msgid "Beats/128"
 msgstr "Pulsos/128"
 
-#: editor.cc:154 quantize_dialog.cc:38 quantize_dialog.cc:143
+#: editor.cc:167 quantize_dialog.cc:38
 msgid "Beats/64"
 msgstr "Pulsos/64"
 
-#: editor.cc:155 quantize_dialog.cc:39 quantize_dialog.cc:145
+#: editor.cc:168 quantize_dialog.cc:39
 msgid "Beats/32"
 msgstr "Pulsos/32"
 
-#: editor.cc:156
+#: editor.cc:169 quantize_dialog.cc:40
 msgid "Beats/28"
 msgstr "Pulsos/28"
 
-#: editor.cc:157
+#: editor.cc:170 quantize_dialog.cc:41
 msgid "Beats/24"
 msgstr "Pulsos/24"
 
-#: editor.cc:158
+#: editor.cc:171 quantize_dialog.cc:42
 msgid "Beats/20"
 msgstr "Pulsos/20"
 
-#: editor.cc:159 quantize_dialog.cc:40 quantize_dialog.cc:147
+#: editor.cc:172 quantize_dialog.cc:43
 msgid "Beats/16"
 msgstr "Pulsos/16"
 
-#: editor.cc:160
+#: editor.cc:173 quantize_dialog.cc:44
 msgid "Beats/14"
 msgstr "Pulsos/14"
 
-#: editor.cc:161
+#: editor.cc:174 quantize_dialog.cc:45
 msgid "Beats/12"
 msgstr "Pulsos/12"
 
-#: editor.cc:162
+#: editor.cc:175 quantize_dialog.cc:46
 msgid "Beats/10"
 msgstr "Pulsos/10"
 
-#: editor.cc:163 quantize_dialog.cc:41 quantize_dialog.cc:149
+#: editor.cc:176 quantize_dialog.cc:47
 msgid "Beats/8"
 msgstr "Pulsos/8"
 
-#: editor.cc:164
+#: editor.cc:177 quantize_dialog.cc:48
 msgid "Beats/7"
 msgstr "Pulsos/7"
 
-#: editor.cc:165
+#: editor.cc:178 quantize_dialog.cc:49
 msgid "Beats/6"
 msgstr "Pulsos/6"
 
-#: editor.cc:166
+#: editor.cc:179 quantize_dialog.cc:50
 msgid "Beats/5"
 msgstr "Pulsos/5"
 
-#: editor.cc:167 quantize_dialog.cc:42 quantize_dialog.cc:151
+#: editor.cc:180 quantize_dialog.cc:51
 msgid "Beats/4"
 msgstr "Pulsos/4"
 
-#: editor.cc:168 quantize_dialog.cc:43 quantize_dialog.cc:153
+#: editor.cc:181 quantize_dialog.cc:52
 msgid "Beats/3"
 msgstr "Pulsos/3"
 
-#: editor.cc:169 quantize_dialog.cc:44 quantize_dialog.cc:155
+#: editor.cc:182 quantize_dialog.cc:53
 msgid "Beats/2"
 msgstr "Pulsos/2"
 
-#: editor.cc:170 quantize_dialog.cc:45 quantize_dialog.cc:157
+#: editor.cc:183 quantize_dialog.cc:54
 msgid "Beats"
 msgstr "Pulsos"
 
-#: editor.cc:171
+#: editor.cc:184
 msgid "Bars"
 msgstr "Compases"
 
-#: editor.cc:172
+#: editor.cc:185
 msgid "Marks"
 msgstr "Marcas"
 
-#: editor.cc:173
+#: editor.cc:186
 msgid "Region starts"
 msgstr "Inicios región"
 
-#: editor.cc:174
+#: editor.cc:187
 msgid "Region ends"
 msgstr "Finales región"
 
-#: editor.cc:175
+#: editor.cc:188
 msgid "Region syncs"
 msgstr "Sincronías región"
 
-#: editor.cc:176
+#: editor.cc:189
 msgid "Region bounds"
 msgstr "Bordes región"
 
-#: editor.cc:181 editor_actions.cc:510
+#: editor.cc:194 editor_actions.cc:551
 msgid "No Grid"
 msgstr "No rejilla"
 
-#: editor.cc:182 editor_actions.cc:511
+#: editor.cc:195 editor_actions.cc:552
 msgid "Grid"
 msgstr "Rejilla"
 
-#: editor.cc:183 editor_actions.cc:512
+#: editor.cc:196 editor_actions.cc:553
 msgid "Magnetic"
 msgstr "Imán"
 
-#: editor.cc:188 editor.cc:206 editor_actions.cc:121 editor_actions.cc:493
+#: editor.cc:201 editor.cc:219 editor_actions.cc:124 editor_actions.cc:534
 msgid "Playhead"
 msgstr "Cursor"
 
-#: editor.cc:189 editor_actions.cc:495
+#: editor.cc:202 editor_actions.cc:536
 msgid "Marker"
 msgstr "Marca"
 
-#: editor.cc:190 editor.cc:207 editor_actions.cc:494
+#: editor.cc:203 editor.cc:220 editor_actions.cc:535
 msgid "Mouse"
 msgstr "Ratón"
 
-#: editor.cc:195 editor_actions.cc:502
+#: editor.cc:208 editor_actions.cc:543
 msgid "Slide"
 msgstr "Deslizar"
 
 # seguro?
-#: editor.cc:196
+#: editor.cc:209
 msgid "Splice"
 msgstr "Reunir"
 
-#: editor.cc:197 editor_actions.cc:501
+#: editor.cc:210 editor_actions.cc:542
 msgid "Ripple"
 msgstr "Rizado"
 
-#: editor.cc:198 editor_actions.cc:157 editor_actions.cc:503
-#: editor_actions.cc:1789 editor_markers.cc:905 editor_rulers.cc:260
-#: location_ui.cc:58 mixer_strip.cc:195 mixer_strip.cc:2028
+#: editor.cc:211 editor_actions.cc:1806 editor_markers.cc:910
+#: editor_rulers.cc:259 location_ui.cc:62
 msgid "Lock"
 msgstr "Bloquear"
 
-#: editor.cc:203 mono_panner_editor.cc:42
+#: editor.cc:216 mono_panner_editor.cc:44
 msgid "Left"
 msgstr "Izquierda"
 
-#: editor.cc:204 mono_panner_editor.cc:47
+#: editor.cc:217 mono_panner_editor.cc:49
 msgid "Right"
 msgstr "Derecha"
 
-#: editor.cc:205
+#: editor.cc:218
 msgid "Center"
 msgstr "Centro"
 
-#: editor.cc:208 editor.cc:3231
+#: editor.cc:221
 msgid "Edit point"
 msgstr "Punto de edición"
 
-#: editor.cc:214
+#: editor.cc:227
 msgid "Mushy"
 msgstr "Mushy"
 
-#: editor.cc:215
+#: editor.cc:228
 msgid "Smooth"
 msgstr "Suave"
 
-#: editor.cc:216
+#: editor.cc:229
 msgid "Balanced multitimbral mixture"
 msgstr "Mezcla multitímbrica balanceada"
 
-#: editor.cc:217
+#: editor.cc:230
 msgid "Unpitched percussion with stable notes"
 msgstr "Percusión no tonal con notas estables"
 
 # "brillante" es un término común al menos en mi zona, quizás haya otras sugerencias
-#: editor.cc:218
+#: editor.cc:231
 msgid "Crisp monophonic instrumental"
 msgstr "Instrumental monofónico brillante"
 
-#: editor.cc:219
+#: editor.cc:232
 msgid "Unpitched solo percussion"
 msgstr "Percusión no tonal"
 
-#: editor.cc:220
+#: editor.cc:233
 msgid "Resample without preserving pitch"
 msgstr "Resamplear sin mantener el tono"
 
-#: editor.cc:256
+#: editor.cc:319
 msgid "Mins:Secs"
 msgstr "Mins:Segs"
 
-#: editor.cc:262
+#: editor.cc:325
 msgid "Location Markers"
 msgstr "Marcas de posición"
 
-#: editor.cc:263
+#: editor.cc:326
 msgid "Range Markers"
 msgstr "Marcas de rango"
 
-#: editor.cc:264
+#: editor.cc:327
 msgid "Loop/Punch Ranges"
 msgstr "Rangos de bucle/pinchazo"
 
-#: editor.cc:265 editor_actions.cc:565
+#: editor.cc:328 editor_actions.cc:606
 msgid "CD Markers"
 msgstr "Marcas de CD"
 
-#: editor.cc:266
+#: editor.cc:329
 msgid "Video Timeline"
 msgstr ""
 
-#: editor.cc:283
+#: editor.cc:386
 msgid "mode"
 msgstr "modo"
 
-#: editor.cc:459 editor_actions.cc:114 editor_actions.cc:564
+#: editor.cc:535 editor_actions.cc:117 editor_actions.cc:605
 msgid "Markers"
 msgstr "Marcas"
 
-#: editor.cc:577 rc_option_editor.cc:1939
+#: editor.cc:653 rc_option_editor.cc:2527
 msgid "Regions"
 msgstr "Regiones"
 
-#: editor.cc:578
+#: editor.cc:654
 msgid "Tracks & Busses"
 msgstr "Pistas y buses"
 
-#: editor.cc:579
+#: editor.cc:655
 msgid "Snapshots"
 msgstr "Capturas de sesión"
 
-#: editor.cc:580
+#: editor.cc:656
 msgid "Track & Bus Groups"
 msgstr "Grupos de pistas y buses"
 
-#: editor.cc:581
+#: editor.cc:657
 msgid "Ranges & Marks"
 msgstr "Rangos y marcas"
 
-#: editor.cc:728 editor.cc:5754 rc_option_editor.cc:1619
-#: rc_option_editor.cc:1627 rc_option_editor.cc:1635 rc_option_editor.cc:1643
-#: rc_option_editor.cc:1667 rc_option_editor.cc:1679 rc_option_editor.cc:1681
-#: rc_option_editor.cc:1689 rc_option_editor.cc:1697 rc_option_editor.cc:1717
-#: rc_option_editor.cc:1729 rc_option_editor.cc:1731 rc_option_editor.cc:1733
-#: rc_option_editor.cc:1741 rc_option_editor.cc:1749 rc_option_editor.cc:1757
-#: rc_option_editor.cc:1772 rc_option_editor.cc:1776 rc_option_editor.cc:1800
-msgid "Editor"
-msgstr "Editor"
-
-#: editor.cc:1331 editor.cc:4735 editor_actions.cc:134 editor_actions.cc:1865
+#: editor.cc:1334 editor.cc:4738 editor_actions.cc:137 editor_actions.cc:1882
 msgid "Loop"
 msgstr "Bucle"
 
-#: editor.cc:1337 editor.cc:4762 editor_actions.cc:135 time_info_box.cc:68
+#: editor.cc:1340 editor.cc:4765 editor_actions.cc:138 time_info_box.cc:62
 msgid "Punch"
 msgstr "Pinchazo"
 
-#: editor.cc:1449 rc_option_editor.cc:1661
+#: editor.cc:1475 rc_option_editor.cc:2299
 msgid "Linear (for highly correlated material)"
 msgstr "Linear (for highly correlated material)"
 
-#: editor.cc:1459 rc_option_editor.cc:1662
+#: editor.cc:1485 rc_option_editor.cc:2300
 msgid "Constant power"
-msgstr "Constant power"
+msgstr "Potencia constante"
 
-#: editor.cc:1468 rc_option_editor.cc:1663
+#: editor.cc:1494 rc_option_editor.cc:2301
 msgid "Symmetric"
 msgstr "Symmetric"
 
-#: editor.cc:1478 rc_option_editor.cc:1664
+#: editor.cc:1504 rc_option_editor.cc:2302
 msgid "Slow"
 msgstr "Lenta"
 
-#: editor.cc:1487 rc_option_editor.cc:1665 sfdb_ui.cc:1771 sfdb_ui.cc:1881
+#: editor.cc:1513 rc_option_editor.cc:2303 sfdb_ui.cc:1737 sfdb_ui.cc:1847
 msgid "Fast"
 msgstr "Rápida"
 
-#: editor.cc:1509 editor.cc:1534
+#: editor.cc:1535 editor.cc:1560
 msgid "Deactivate"
 msgstr "Desactivar"
 
-#: editor.cc:1511 editor.cc:1536
+#: editor.cc:1537 editor.cc:1562
 msgid "Activate"
 msgstr "Activar"
 
-#: editor.cc:1637 editor.cc:1645 editor_ops.cc:3824
+#: editor.cc:1663 editor.cc:1671 editor_ops.cc:3921
 msgid "Freeze"
 msgstr "Congelar"
 
-#: editor.cc:1641
+#: editor.cc:1667
 msgid "Unfreeze"
 msgstr "Descongelar"
 
-#: editor.cc:1780
+#: editor.cc:1767
+msgid "Region Loudness Analysis"
+msgstr "Análisis de loudness de región"
+
+#: editor.cc:1786 editor.cc:1835
+msgid "Audio Report/Analysis"
+msgstr ""
+
+#: editor.cc:1816
+msgid "Range Loudness Analysis"
+msgstr ""
+
+#: editor.cc:1902
 msgid "Selected Regions"
 msgstr "Regiones seleccionadas"
 
-#: editor.cc:1816 editor_markers.cc:940
+#: editor.cc:1946 editor_markers.cc:945
 msgid "Play Range"
 msgstr "Reproducir rango"
 
-#: editor.cc:1817 editor_markers.cc:943
+#: editor.cc:1947 editor_markers.cc:948
 msgid "Loop Range"
 msgstr "Reproducir rango en bucle"
 
-#: editor.cc:1820 editor_markers.cc:950
+#: editor.cc:1950 editor_markers.cc:953
 msgid "Zoom to Range"
 msgstr "Zoom a rango"
 
-#: editor.cc:1829 editor_actions.cc:369
+#: editor.cc:1953
+msgid "Loudness Analysis"
+msgstr "Análisis de loudness"
+
+#: editor.cc:1960 editor_actions.cc:401
 msgid "Move Range Start to Previous Region Boundary"
 msgstr "Mover inicio de rango a borde de región anterior"
 
-#: editor.cc:1836 editor_actions.cc:376
+#: editor.cc:1967 editor_actions.cc:408
 msgid "Move Range Start to Next Region Boundary"
 msgstr "Mover inicio de rango a borde de región siguiente"
 
-#: editor.cc:1843 editor_actions.cc:383
+#: editor.cc:1974 editor_actions.cc:415
 msgid "Move Range End to Previous Region Boundary"
 msgstr "Mover final de rango a borde de región anterior"
 
-#: editor.cc:1850 editor_actions.cc:390
+#: editor.cc:1981 editor_actions.cc:422
 msgid "Move Range End to Next Region Boundary"
 msgstr "Mover final de rango a borde de región siguiente"
 
-#: editor.cc:1856 editor_actions.cc:133 editor_actions.cc:325
+#: editor.cc:1987 editor_actions.cc:136 editor_actions.cc:347
 msgid "Separate"
 msgstr "Separar"
 
-#: editor.cc:1857
+#: editor.cc:1988
 msgid "Convert to Region in Region List"
 msgstr "Convertir a región en lista de regiones"
 
-#: editor.cc:1860 editor_markers.cc:970
+#: editor.cc:1991 editor_markers.cc:973
 msgid "Select All in Range"
 msgstr "Seleccionar todo en rango"
 
-#: editor.cc:1863 editor_actions.cc:297
+#: editor.cc:1994 editor_actions.cc:319
 msgid "Set Loop from Selection"
 msgstr "Definir bucle según selección"
 
-#: editor.cc:1864 editor_actions.cc:298
+#: editor.cc:1995 editor_actions.cc:320
 msgid "Set Punch from Selection"
 msgstr "Definir pinchazo según selección"
 
-#: editor.cc:1865 editor_actions.cc:299
+#: editor.cc:1996 editor_actions.cc:321
 msgid "Set Session Start/End from Selection"
 msgstr "Definir Inicio y Fin de sesión según selección"
 
-#: editor.cc:1868
+#: editor.cc:1999
 msgid "Add Range Markers"
 msgstr "Insertar marcas de rango"
 
-#: editor.cc:1871
+#: editor.cc:2002
 msgid "Crop Region to Range"
 msgstr "Recortar región a rango"
 
-#: editor.cc:1872
-msgid "Fill Range with Region"
-msgstr "Rellenar rango con región"
-
-#: editor.cc:1873 editor_actions.cc:311
+#: editor.cc:2003 editor_actions.cc:333
 msgid "Duplicate Range"
 msgstr "Duplicar rango"
 
-#: editor.cc:1876
+#: editor.cc:2006
 msgid "Consolidate Range"
 msgstr "Consolidar rango"
 
-#: editor.cc:1877
-msgid "Consolidate Range With Processing"
+#: editor.cc:2007
+msgid "Consolidate Range with Processing"
 msgstr "Consolidar rango con procesado"
 
-#: editor.cc:1878
+#: editor.cc:2008
 msgid "Bounce Range to Region List"
 msgstr "Rebotar rango a lista de regiones"
 
-#: editor.cc:1879
-msgid "Bounce Range to Region List With Processing"
+#: editor.cc:2009
+msgid "Bounce Range to Region List with Processing"
 msgstr "Rebotar rango a lista de regiones con procesado"
 
-#: editor.cc:1880 editor_markers.cc:953
+#: editor.cc:2010 editor_markers.cc:956
 msgid "Export Range..."
 msgstr "Exportar rango..."
 
-#: editor.cc:1882
+#: editor.cc:2012
 msgid "Export Video Range..."
 msgstr ""
 
-#: editor.cc:1898 editor.cc:1979 editor_actions.cc:303
-msgid "Play From Edit Point"
+#: editor.cc:2028 editor.cc:2110 editor_actions.cc:325
+msgid "Play from Edit Point"
 msgstr "Reproducir desde punto de edición"
 
-#: editor.cc:1899 editor.cc:1980
-msgid "Play From Start"
+#: editor.cc:2029 editor.cc:2111
+msgid "Play from Start"
 msgstr "Reproducir desde el principio"
 
-#: editor.cc:1900
+#: editor.cc:2030
 msgid "Play Region"
 msgstr "Reproducir región"
 
-#: editor.cc:1902
+#: editor.cc:2032
 msgid "Loop Region"
 msgstr "Reproducir región en bucle"
 
-#: editor.cc:1912 editor.cc:1989
+#: editor.cc:2042 editor.cc:2120
 msgid "Select All in Track"
 msgstr "Seleccionar todo en la pista"
 
-#: editor.cc:1913 editor.cc:1990 editor_actions.cc:194
+#: editor.cc:2043 editor.cc:2121 editor_actions.cc:196
 msgid "Select All Objects"
 msgstr "Seleccionar todos los objetos"
 
-#: editor.cc:1914 editor.cc:1991
+#: editor.cc:2044 editor.cc:2122
 msgid "Invert Selection in Track"
 msgstr "Invertir selección en la pista"
 
-#: editor.cc:1915 editor.cc:1992 editor_actions.cc:197
+#: editor.cc:2045 editor.cc:2123 editor_actions.cc:199
 msgid "Invert Selection"
 msgstr "Invertir selección"
 
-#: editor.cc:1917
+#: editor.cc:2047 editor_actions.cc:201
 msgid "Set Range to Loop Range"
 msgstr "Definir rango como bucle"
 
-#: editor.cc:1918
+#: editor.cc:2048 editor_actions.cc:202
 msgid "Set Range to Punch Range"
 msgstr "Definir rango como rango de pinchazo"
 
-#: editor.cc:1920 editor.cc:1994 editor_actions.cc:199 editor_actions.cc:200
+#: editor.cc:2049 editor_actions.cc:203
+msgid "Set Range to Selected Regions"
+msgstr "Definir rango según selección"
+
+#: editor.cc:2051 editor.cc:2125 editor_actions.cc:205 editor_actions.cc:206
 msgid "Select All After Edit Point"
 msgstr "Seleccionar todo desde punto de edición"
 
-#: editor.cc:1921 editor.cc:1995 editor_actions.cc:201 editor_actions.cc:202
+#: editor.cc:2052 editor.cc:2126 editor_actions.cc:207 editor_actions.cc:208
 msgid "Select All Before Edit Point"
 msgstr "Seleccionar todo hasta punto de edición"
 
-#: editor.cc:1922 editor.cc:1996
+#: editor.cc:2053 editor.cc:2127
 msgid "Select All After Playhead"
 msgstr "Seleccionar todo desde cursor"
 
-#: editor.cc:1923 editor.cc:1997
+#: editor.cc:2054 editor.cc:2128
 msgid "Select All Before Playhead"
 msgstr "Seleccionar todo hasta cursor"
 
-#: editor.cc:1924
+#: editor.cc:2055
 msgid "Select All Between Playhead and Edit Point"
 msgstr "Seleccionar todo entre cursor y punto de edición"
 
 # Qué diferencia hay entre :
 # - Between playhead and edit point
 # - Within playhead and edit point
-#: editor.cc:1925
+#: editor.cc:2056
 msgid "Select All Within Playhead and Edit Point"
 msgstr "Seleccionar todo dentro de cursor y punto de edición"
 
-#: editor.cc:1926
+#: editor.cc:2057
 msgid "Select Range Between Playhead and Edit Point"
 msgstr "Seleccionar rango entre cursor y punto de edición"
 
-#: editor.cc:1928 editor.cc:1999 editor_actions.cc:131 editor_actions.cc:132
+#: editor.cc:2059 editor.cc:2130 editor_actions.cc:134 editor_actions.cc:135
 msgid "Select"
 msgstr "Seleccionar"
 
-#: editor.cc:1936 editor.cc:2007 editor_actions.cc:337 processor_box.cc:2451
+#: editor.cc:2067 editor.cc:2138 editor_actions.cc:359 processor_box.cc:3677
 msgid "Cut"
 msgstr "Cortar"
 
-#: editor.cc:1937 editor.cc:2008 editor_actions.cc:341 processor_box.cc:2454
+#: editor.cc:2068 editor.cc:2139 editor_actions.cc:363 processor_box.cc:3679
 msgid "Copy"
 msgstr "Copiar"
 
-#: editor.cc:1938 editor.cc:2009 editor_actions.cc:342 processor_box.cc:2462
+#: editor.cc:2069 editor.cc:2140 editor_actions.cc:364 processor_box.cc:3691
 msgid "Paste"
 msgstr "Pegar"
 
-#: editor.cc:1942 editor_actions.cc:91
+#: editor.cc:2073 editor_actions.cc:94
 msgid "Align"
 msgstr "Alinear"
 
-#: editor.cc:1943
+#: editor.cc:2074
 msgid "Align Relative"
 msgstr "Alinear relativamente"
 
-#: editor.cc:1950
+#: editor.cc:2081
 msgid "Insert Selected Region"
 msgstr "Insertar región seleccionada"
 
-#: editor.cc:1951
+#: editor.cc:2082
 msgid "Insert Existing Media"
 msgstr "Insertar medios existentes"
 
-#: editor.cc:1960 editor.cc:2016
+#: editor.cc:2091 editor.cc:2147
 msgid "Nudge Entire Track Later"
 msgstr "Atrasar toda la pista"
 
-#: editor.cc:1961 editor.cc:2017
+#: editor.cc:2092 editor.cc:2148
 msgid "Nudge Track After Edit Point Later"
 msgstr "Atrasar pista desde punto de edición"
 
-#: editor.cc:1962 editor.cc:2018
+#: editor.cc:2093 editor.cc:2149
 msgid "Nudge Entire Track Earlier"
 msgstr "Adelantar toda la pista"
 
-#: editor.cc:1963 editor.cc:2019
+#: editor.cc:2094 editor.cc:2150
 msgid "Nudge Track After Edit Point Earlier"
 msgstr "Adelantar pista desde punto de edición"
 
-#: editor.cc:1965 editor.cc:2021
+#: editor.cc:2096 editor.cc:2152
 msgid "Nudge"
 msgstr "Empujar"
 
-#: editor.cc:2235
+#: editor.cc:2354
 msgid ""
 "Playhead position stored with a negative value - ignored (use zero instead)"
 msgstr ""
 
-#: editor.cc:3006 editor.cc:3707 editor.cc:3778 midi_channel_selector.cc:157
+#: editor.cc:3116 editor.cc:3776 editor.cc:3847 midi_channel_selector.cc:157
 #: midi_channel_selector.cc:395 midi_channel_selector.cc:431
 msgid "All"
-msgstr "Todas"
+msgstr "Todos"
 
-#: editor.cc:3210
-msgid "Smart Mode (add Range functions to Grab mode)"
+#: editor.cc:3281
+msgid "Smart Mode (add range functions to Grab Mode)"
 msgstr "Modo smart (añade funciones de rango al modo atrapar)"
 
-#: editor.cc:3211
+#: editor.cc:3282
 msgid "Grab Mode (select/move objects)"
 msgstr "Modo atrapar (seleccionar/mover objetos)"
 
-#: editor.cc:3212
+#: editor.cc:3283
 msgid "Cut Mode (split regions)"
-msgstr "Modo cortar (separar regiones)"
+msgstr "Modo recortar (separar regiones)"
 
-#: editor.cc:3213
+#: editor.cc:3284
 msgid "Range Mode (select time ranges)"
 msgstr "Modo rango (seleccionar rangos de tiempo)"
 
-#: editor.cc:3214
+#: editor.cc:3285
 msgid "Draw Mode (draw and edit gain/notes/automation)"
-msgstr ""
+msgstr "Modo dibujo (dibujar y editar ganancia/notas/automatización)"
 
-#: editor.cc:3215
+#: editor.cc:3286
 msgid "Stretch Mode (time-stretch audio and midi regions, preserving pitch)"
 msgstr ""
+"Modo estirar (cambio de tempo de regiones audio y midi, manteniendo el tono)"
 
-#: editor.cc:3216
+#: editor.cc:3287
 msgid "Audition Mode (listen to regions)"
 msgstr "Modo audición (escuchar regiones)"
 
-#: editor.cc:3217
-msgid "Internal Edit Mode (edit notes and gain curves inside regions)"
-msgstr ""
+#: editor.cc:3288
+msgid "Internal Edit Mode (edit notes and automation points)"
+msgstr "Modo edición interna (editar notas y puntos de automatización)"
 
-#: editor.cc:3218
+#: editor.cc:3289
 msgid ""
 "Groups: click to (de)activate\n"
 "Context-click for other operations"
@@ -3121,59 +3620,63 @@ msgstr ""
 "Grupos: clic  para (des)activar\n"
 "Contexto-clic para otras operaciones"
 
-#: editor.cc:3219
+#: editor.cc:3289
 msgid "Nudge Region/Selection Later"
 msgstr "Atrasar región o selección"
 
-#: editor.cc:3220
+#: editor.cc:3290
 msgid "Nudge Region/Selection Earlier"
 msgstr "Adelantar región o selección"
 
-#: editor.cc:3221 editor_actions.cc:262
+#: editor.cc:3291 editor_actions.cc:272
 msgid "Zoom In"
 msgstr "Acercar"
 
-#: editor.cc:3222 editor_actions.cc:261
+#: editor.cc:3292 editor_actions.cc:271
 msgid "Zoom Out"
 msgstr "Alejar"
 
-#: editor.cc:3223
+#: editor.cc:3293
 msgid "Zoom to Time Scale"
 msgstr ""
 
-#: editor.cc:3224 editor.cc:3729 editor_actions.cc:263
+#: editor.cc:3294 editor.cc:3797 editor_actions.cc:273
 msgid "Zoom to Session"
 msgstr "Ajustar zoom a sesión"
 
-#: editor.cc:3225
-msgid "Zoom focus"
+#: editor.cc:3295 editor_actions.cc:115 editor_actions.cc:148
+msgid "Zoom Focus"
 msgstr "Foco del zoom"
 
-#: editor.cc:3226
+#: editor.cc:3296
 msgid "Expand Tracks"
 msgstr "Expandir pistas"
 
-#: editor.cc:3227
+#: editor.cc:3297
 msgid "Shrink Tracks"
 msgstr "Encoger pistas"
 
-#: editor.cc:3228
+#: editor.cc:3298
 msgid "Number of visible tracks"
 msgstr "Número de pistas visibles"
 
-#: editor.cc:3229
+#: editor.cc:3299
 msgid "Snap/Grid Units"
 msgstr "Unidades de ajuste a rejilla"
 
-#: editor.cc:3230
+#: editor.cc:3300
 msgid "Snap/Grid Mode"
 msgstr "Modo de ajuste a rejilla"
 
-#: editor.cc:3232
+#: editor.cc:3301 editor_actions.cc:101
+msgid "Edit Point"
+msgstr "Punto de edición"
+
+#: editor.cc:3302
 msgid "Edit Mode"
 msgstr "Modo de edición"
 
-#: editor.cc:3233
+#: editor.cc:3303
 msgid ""
 "Nudge Clock\n"
 "(controls distance used to nudge regions and selections)"
@@ -3182,124 +3685,124 @@ msgstr ""
 "(define el tiempo determinado para adelantar y atrasar regiones y "
 "selecciones)"
 
-#: editor.cc:3501 editor_actions.cc:313
+#: editor.cc:3571 editor_actions.cc:335
 msgid "Command|Undo"
 msgstr "Deshacer"
 
-#: editor.cc:3503
+#: editor.cc:3573
 msgid "Command|Undo (%1)"
 msgstr "Deshacer (%1)"
 
-#: editor.cc:3510 editor_actions.cc:315 editor_actions.cc:316
-#: editor_actions.cc:317
+#: editor.cc:3580 editor_actions.cc:337 editor_actions.cc:338
+#: editor_actions.cc:339
 msgid "Redo"
 msgstr "Rehacer"
 
-#: editor.cc:3512
+#: editor.cc:3583
 msgid "Redo (%1)"
 msgstr "Rehacer (%1)"
 
-#: editor.cc:3531 editor.cc:3555 editor_actions.cc:110 editor_actions.cc:1846
+#: editor.cc:3603 editor.cc:3627 editor_actions.cc:113 editor_actions.cc:1863
 msgid "Duplicate"
 msgstr "Duplicar"
 
-#: editor.cc:3532
+#: editor.cc:3604
 msgid "Number of duplications:"
 msgstr "Cantidad de copias:"
 
-#: editor.cc:3706 route_group_dialog.cc:51 time_info_box.cc:67
+#: editor.cc:3774 route_group_dialog.cc:51 time_info_box.cc:61
 msgid "Selection"
 msgstr "Selección"
 
-#: editor.cc:3709
+#: editor.cc:3777
 msgid "Fit 1 track"
 msgstr "Poner 1 pista"
 
-#: editor.cc:3710
+#: editor.cc:3778
 msgid "Fit 2 tracks"
 msgstr "Poner 2 pistas"
 
-#: editor.cc:3711
+#: editor.cc:3779
 msgid "Fit 4 tracks"
 msgstr "Poner 4 pistas"
 
-#: editor.cc:3712
+#: editor.cc:3780
 msgid "Fit 8 tracks"
 msgstr "Poner 8 pistas"
 
-#: editor.cc:3713
+#: editor.cc:3781
 msgid "Fit 16 tracks"
 msgstr "Poner 16 pistas"
 
-#: editor.cc:3714
+#: editor.cc:3782
 msgid "Fit 24 tracks"
 msgstr "Poner 24 pistas"
 
-#: editor.cc:3715
+#: editor.cc:3783
 msgid "Fit 32 tracks"
 msgstr "Poner 32 pistas"
 
-#: editor.cc:3716
+#: editor.cc:3784
 msgid "Fit 48 tracks"
 msgstr "Poner 48 pistas"
 
-#: editor.cc:3717
+#: editor.cc:3785
 msgid "Fit All tracks"
 msgstr "Poner todas las pistas"
 
-#: editor.cc:3718
+#: editor.cc:3786
 msgid "Fit Selection"
 msgstr "Ajustar selección"
 
-#: editor.cc:3720
+#: editor.cc:3788 editor_actions.cc:288
 msgid "Zoom to 10 ms"
 msgstr "Zoom a 10 ms"
 
-#: editor.cc:3721
+#: editor.cc:3789 editor_actions.cc:289
 msgid "Zoom to 100 ms"
 msgstr "Zoom a 100 ms"
 
-#: editor.cc:3722
+#: editor.cc:3790 editor_actions.cc:290
 msgid "Zoom to 1 sec"
 msgstr "Zoom a 1 seg"
 
-#: editor.cc:3723
+#: editor.cc:3791 editor_actions.cc:291
 msgid "Zoom to 10 sec"
 msgstr "Zoom a 10 seg"
 
-#: editor.cc:3724
+#: editor.cc:3792 editor_actions.cc:292
 msgid "Zoom to 1 min"
 msgstr "Zoom a 1 min"
 
-#: editor.cc:3725
+#: editor.cc:3793 editor_actions.cc:294
 msgid "Zoom to 10 min"
 msgstr "Zoom a 10 min"
 
-#: editor.cc:3726
+#: editor.cc:3794
 msgid "Zoom to 1 hour"
 msgstr "Zoom a 1 hora"
 
-#: editor.cc:3727
+#: editor.cc:3795
 msgid "Zoom to 8 hours"
 msgstr "Zoom a 8 horas"
 
-#: editor.cc:3728
+#: editor.cc:3796
 msgid "Zoom to 24 hours"
 msgstr "Zoom a 24 horas"
 
-#: editor.cc:3730
+#: editor.cc:3798
 msgid "Zoom to Range/Region Selection"
 msgstr "Zoom a selección de rango o región"
 
-#: editor.cc:3800
+#: editor.cc:3868
 msgid "*"
 msgstr "*"
 
-#: editor.cc:4120
+#: editor.cc:4135
 msgid "Playlist Deletion"
 msgstr "Borrado de lista de reproducción"
 
-#: editor.cc:4121
+#: editor.cc:4136
 msgid ""
 "Playlist %1 is currently unused.\n"
 "If it is kept, its audio files will not be cleaned.\n"
@@ -3309,1298 +3812,1385 @@ msgstr ""
 "Si la conservas, sus archivos de audio no se purgarán.\n"
 "Si la eliminas, se purgarán sólo los archivos de audio que use ésta."
 
-#: editor.cc:4131
+#: editor.cc:4146
+msgid "Delete All Unused"
+msgstr "Eliminar todo lo no usado"
+
+#: editor.cc:4147
 msgid "Delete Playlist"
 msgstr "Eliminar lista de reproducción"
 
-#: editor.cc:4132
+#: editor.cc:4148
 msgid "Keep Playlist"
 msgstr "Conservar lista de reproducción"
 
-#: editor.cc:4133 editor_audio_import.cc:594 editor_ops.cc:6174
-#: engine_dialog.cc:2083 sfdb_freesound_mootcher.cc:69 processor_box.cc:2219
-#: processor_box.cc:2244
-msgid "Cancel"
+#: editor.cc:4149
+msgid "Keep Remaining"
+msgstr ""
+
+#: editor.cc:4150 editor_audio_import.cc:600 editor_ops.cc:6530
+#: engine_dialog.cc:2986 sfdb_freesound_mootcher.cc:69 processor_box.cc:3431
+#: processor_box.cc:3456
+msgid "Cancel"
 msgstr "Cancelar"
 
-#: editor.cc:4275
+#: editor.cc:4292
 msgid "new playlists"
 msgstr "nuevas listas de reproducción"
 
-#: editor.cc:4291
+#: editor.cc:4308
 msgid "copy playlists"
 msgstr "copiar listas de reproducción"
 
-#: editor.cc:4306
+#: editor.cc:4323
 msgid "clear playlists"
 msgstr "limpiar listas de reproducción"
 
-#: editor.cc:5046
+#: editor.cc:5048
 msgid "Please wait while %1 loads visual data."
 msgstr "Por favor, espera a que %1 cargue datos visuales."
 
-#: editor.cc:5901 editor.cc:5932 editor_markers.cc:985 panner_ui.cc:410
-#: processor_box.cc:2482
+#: editor.cc:5811 editor_actions.cc:479
+msgid "Unset #%1"
+msgstr ""
+
+#: editor.cc:5812 editor_actions.cc:481
+msgid "no action bound"
+msgstr ""
+
+#: editor.cc:5961 editor.cc:5996 editor_markers.cc:998 editor_markers.cc:1018
+#: panner_ui.cc:412 processor_box.cc:3703
 msgid "Edit..."
 msgstr "Editar..."
 
-#: editor.cc:5934 editor_actions.cc:1941
+#: editor.cc:6002 editor_actions.cc:1842
+msgid "Transpose..."
+msgstr "Transponer..."
+
+#: editor.cc:6006 editor_actions.cc:1959
 msgid "Legatize"
 msgstr "Legato"
 
-#: editor.cc:5936 editor_actions.cc:1940
+#: editor.cc:6012 editor_actions.cc:1958
 msgid "Quantize..."
 msgstr "Cuantificar..."
 
-#: editor.cc:5938 editor_actions.cc:1943
+#: editor.cc:6015 editor_actions.cc:1961
 msgid "Remove Overlap"
 msgstr "Eiminar solapamiento"
 
-#: editor.cc:5940 editor_actions.cc:1942
+#: editor.cc:6021 editor_actions.cc:1960
 msgid "Transform..."
 msgstr "Transformar..."
 
-#: editor_actions.cc:92
+#: editor_actions.cc:95
 msgid "Autoconnect"
 msgstr "Autoconectar"
 
-#: editor_actions.cc:93
+#: editor_actions.cc:96
 msgid "Crossfades"
 msgstr "Fundidos cruzados"
 
-#: editor_actions.cc:95
+#: editor_actions.cc:98
 msgid "Move Selected Marker"
 msgstr "Mover marca seleccionada"
 
 # chequear en contexto
-#: editor_actions.cc:96
+#: editor_actions.cc:99
 msgid "Select Range Operations"
 msgstr "Seleccionar operaciones de rango"
 
-#: editor_actions.cc:97
+#: editor_actions.cc:100
 msgid "Select Regions"
 msgstr "Seleccionar regiones"
 
-#: editor_actions.cc:98
-msgid "Edit Point"
-msgstr "Punto de edición"
-
-#: editor_actions.cc:99
+#: editor_actions.cc:102
 msgid "Fade"
 msgstr "Fundido"
 
 # no encuentro de dónde es esta cadena
 # Está en la ventana "combinaciones de teclas". pero no sé qué hace
-#: editor_actions.cc:100
+#: editor_actions.cc:103
 msgid "Latch"
 msgstr "Latch"
 
-#: editor_actions.cc:101 editor_regions.cc:112 region_editor.cc:46
+#: editor_actions.cc:104 editor_regions.cc:159 region_editor.cc:48
 msgid "Region"
 msgstr "Región"
 
-#: editor_actions.cc:102
+#: editor_actions.cc:105
 msgid "Layering"
 msgstr "Superposición"
 
-#: editor_actions.cc:103 editor_regions.cc:113 stereo_panner_editor.cc:44
+#: editor_actions.cc:106 editor_regions.cc:160 stereo_panner_editor.cc:46
 msgid "Position"
 msgstr "Posición"
 
-#: editor_actions.cc:105 gain_meter.cc:156 gain_meter.cc:825 panner_ui.cc:178
-#: panner_ui.cc:635
+#: editor_actions.cc:108 gain_meter.cc:161 gain_meter.cc:848 panner_ui.cc:178
+#: panner_ui.cc:637 route_time_axis.cc:541
 msgid "Trim"
 msgstr "Recortar"
 
-#: editor_actions.cc:106 editor_actions.cc:126 route_group_dialog.cc:46
+#: editor_actions.cc:109 editor_actions.cc:129 route_group_dialog.cc:46
 msgid "Gain"
 msgstr "Ganancia"
 
-#: editor_actions.cc:107 editor_actions.cc:563
+#: editor_actions.cc:110 editor_actions.cc:604
 msgid "Ranges"
 msgstr "Rangos"
 
-#: editor_actions.cc:108 editor_actions.cc:1842 session_option_editor.cc:135
+#: editor_actions.cc:111 editor_actions.cc:1859 session_option_editor.cc:135
 #: session_option_editor.cc:144 session_option_editor.cc:151
+#: session_option_editor.cc:158 session_option_editor.cc:165
 msgid "Fades"
 msgstr "Fundidos"
 
-#: editor_actions.cc:111
+#: editor_actions.cc:114
 msgid "Link"
 msgstr "Enlace"
 
-#: editor_actions.cc:112 editor_actions.cc:145
-msgid "Zoom Focus"
-msgstr "Foco del zoom"
-
 # chequear en contexto
-#: editor_actions.cc:113
+#: editor_actions.cc:116
 msgid "Locate to Markers"
 msgstr "Localizar a marcas"
 
-#: editor_actions.cc:115
+#: editor_actions.cc:118
 msgid "Meter falloff"
 msgstr "Tasa de decaimiento"
 
-#: editor_actions.cc:116
+#: editor_actions.cc:119
 msgid "Meter hold"
 msgstr "Retención"
 
-#: editor_actions.cc:117 session_option_editor.cc:321
+#: editor_actions.cc:120 session_option_editor.cc:342
 msgid "MIDI Options"
 msgstr "Opciones MIDI"
 
-#: editor_actions.cc:118
+#: editor_actions.cc:121
 msgid "Misc Options"
 msgstr "Opciones misceláneas"
 
-#: editor_actions.cc:119 rc_option_editor.cc:1809 route_group_dialog.cc:54
-#: session_option_editor.cc:243 session_option_editor.cc:250
+#: editor_actions.cc:122 rc_option_editor.cc:2401 route_group_dialog.cc:54
+#: session_option_editor.cc:264 session_option_editor.cc:271
 msgid "Monitoring"
 msgstr "Monitorización"
 
-#: editor_actions.cc:120
+#: editor_actions.cc:123
 msgid "Active Mark"
 msgstr "Marca activa"
 
-#: editor_actions.cc:123
+#: editor_actions.cc:126
 msgid "Primary Clock"
 msgstr "Reloj primario"
 
-#: editor_actions.cc:124
+#: editor_actions.cc:127
 msgid "Pullup / Pulldown"
 msgstr "Pullup / Pulldown"
 
-#: editor_actions.cc:125
+#: editor_actions.cc:128
 msgid "Region operations"
 msgstr "Operaciones de región"
 
-#: editor_actions.cc:127 ruler_dialog.cc:28
+#: editor_actions.cc:130 ruler_dialog.cc:28
 msgid "Rulers"
 msgstr "Reglas"
 
-#: editor_actions.cc:128
+#: editor_actions.cc:131
 msgid "Views"
 msgstr "Vistas"
 
 # podría ser "desplazar", chequear contexto
-#: editor_actions.cc:129
+#: editor_actions.cc:132
 msgid "Scroll"
 msgstr "Desplazamiento"
 
-#: editor_actions.cc:130
+#: editor_actions.cc:133
 msgid "Secondary Clock"
 msgstr "Reloj secundario"
 
-#: editor_actions.cc:137
+#: editor_actions.cc:140
 msgid "Subframes"
 msgstr "Subcuadros"
 
-#: editor_actions.cc:140
+#: editor_actions.cc:143
 msgid "Timecode fps"
 msgstr "Timecode fps"
 
-#: editor_actions.cc:141 route_time_axis.cc:575
+#: editor_actions.cc:144 route_time_axis.cc:599
 msgid "Height"
 msgstr "Altura"
 
-#: editor_actions.cc:143
+#: editor_actions.cc:146
 msgid "Tools"
 msgstr "Herramientas"
 
-#: editor_actions.cc:144
+#: editor_actions.cc:147
 msgid "View"
 msgstr "Ver"
 
-#: editor_actions.cc:146
+#: editor_actions.cc:149
 msgid "Zoom"
 msgstr "Zoom"
 
-#: editor_actions.cc:152
-msgid "Break drag or deselect all"
-msgstr "Interrumpir arrastre o deseleccionar todo"
+#: editor_actions.cc:150
+msgid "Scripted Actions"
+msgstr "Acciones con script"
 
 #: editor_actions.cc:159
+msgid "Session|Lock"
+msgstr "Bloquear"
+
+#: editor_actions.cc:161
 msgid "Show Editor Mixer"
 msgstr "Mostrar Mezclador en Editor"
 
-#: editor_actions.cc:160
+#: editor_actions.cc:162
 msgid "Show Editor List"
 msgstr "Mostrar lista de Editor"
 
-#: editor_actions.cc:162
+#: editor_actions.cc:164
 msgid "Playhead to Next Region Boundary"
 msgstr "Cursor a borde de región siguiente"
 
-#: editor_actions.cc:163
+#: editor_actions.cc:165
 msgid "Playhead to Next Region Boundary (No Track Selection)"
 msgstr "Cursor a borde de región siguiente (sin selección de pista)"
 
-#: editor_actions.cc:164
+#: editor_actions.cc:166
 msgid "Playhead to Previous Region Boundary"
 msgstr "Cursor a borde de región anterior"
 
-#: editor_actions.cc:165
+#: editor_actions.cc:167
 msgid "Playhead to Previous Region Boundary (No Track Selection)"
 msgstr "Cursor a borde de región anterior (sin selección de pista)"
 
-#: editor_actions.cc:167
+#: editor_actions.cc:169
 msgid "Playhead to Next Region Start"
 msgstr "Cursor a inicio de región siguiente"
 
-#: editor_actions.cc:168
+#: editor_actions.cc:170
 msgid "Playhead to Next Region End"
 msgstr "Cursor a fin de región siguiente"
 
-#: editor_actions.cc:169
+#: editor_actions.cc:171
 msgid "Playhead to Next Region Sync"
 msgstr "Cursor a punto de sincronía siguiente"
 
-#: editor_actions.cc:171
+#: editor_actions.cc:173
 msgid "Playhead to Previous Region Start"
 msgstr "Cursor a inicio de región anterior"
 
-#: editor_actions.cc:172
+#: editor_actions.cc:174
 msgid "Playhead to Previous Region End"
 msgstr "Cursor a fin de región anterior"
 
-#: editor_actions.cc:173
+#: editor_actions.cc:175
 msgid "Playhead to Previous Region Sync"
 msgstr "Cursor a punto de sincronía anterior"
 
-#: editor_actions.cc:175
+#: editor_actions.cc:177
 msgid "To Next Region Boundary"
 msgstr "A borde de región siguiente"
 
-#: editor_actions.cc:176
+#: editor_actions.cc:178
 msgid "To Next Region Boundary (No Track Selection)"
 msgstr "A borde de región siguiente (sin selección de pista)"
 
-#: editor_actions.cc:177
+#: editor_actions.cc:179
 msgid "To Previous Region Boundary"
 msgstr "A borde de región anterior"
 
-#: editor_actions.cc:178
+#: editor_actions.cc:180
 msgid "To Previous Region Boundary (No Track Selection)"
 msgstr "A borde de región anterior (sin selección de pista)"
 
-#: editor_actions.cc:180
+#: editor_actions.cc:182
 msgid "To Next Region Start"
 msgstr "A inicio de región siguiente"
 
-#: editor_actions.cc:181
+#: editor_actions.cc:183
 msgid "To Next Region End"
 msgstr "A fin de región siguiente"
 
-#: editor_actions.cc:182
+#: editor_actions.cc:184
 msgid "To Next Region Sync"
 msgstr "A sincronía de región siguiente"
 
-#: editor_actions.cc:184
+#: editor_actions.cc:186
 msgid "To Previous Region Start"
 msgstr "A inicio de región anterior"
 
-#: editor_actions.cc:185
+#: editor_actions.cc:187
 msgid "To Previous Region End"
 msgstr "A fin de región anterior"
 
-#: editor_actions.cc:186
+#: editor_actions.cc:188
 msgid "To Previous Region Sync"
 msgstr "A sincronía de región anterior"
 
-#: editor_actions.cc:188
+#: editor_actions.cc:190
 msgid "To Range Start"
 msgstr "A inicio de rango"
 
-#: editor_actions.cc:189
+#: editor_actions.cc:191
 msgid "To Range End"
 msgstr "A fin de rango"
 
-#: editor_actions.cc:191
+#: editor_actions.cc:193
 msgid "Playhead to Range Start"
 msgstr "Cursor a inicio de rango"
 
-#: editor_actions.cc:192
+#: editor_actions.cc:194
 msgid "Playhead to Range End"
 msgstr "Cursor a final de rango"
 
-#: editor_actions.cc:195
+#: editor_actions.cc:197
 msgid "Select All Tracks"
 msgstr "Seleccionar todas las pistas"
 
-#: editor_actions.cc:196 export_timespan_selector.cc:61 processor_box.cc:2468
+#: editor_actions.cc:198 export_timespan_selector.cc:59 processor_box.cc:3685
 msgid "Deselect All"
 msgstr "Deseleccionar todo"
 
-#: editor_actions.cc:204
+#: editor_actions.cc:210
 msgid "Select All Overlapping Edit Range"
 msgstr "Seleccionar todo lo solapado al rango de edición"
 
-#: editor_actions.cc:205
+#: editor_actions.cc:211
 msgid "Select All Inside Edit Range"
 msgstr "Seleccionar todo dentro de rango de edición"
 
-#: editor_actions.cc:207
+#: editor_actions.cc:213
 msgid "Select Edit Range"
 msgstr "Seleccionar rango de edición"
 
-#: editor_actions.cc:209
+#: editor_actions.cc:215
 msgid "Select All in Punch Range"
 msgstr "Seleccionar todo en rango de pinchazo"
 
-#: editor_actions.cc:210
+#: editor_actions.cc:216
 msgid "Select All in Loop Range"
 msgstr "Seleccionar todo dentro de rango de bucle"
 
-#: editor_actions.cc:212
+#: editor_actions.cc:218
 msgid "Select Next Track or Bus"
 msgstr "Seleccionar pista o bus siguiente"
 
-#: editor_actions.cc:213
+#: editor_actions.cc:219
 msgid "Select Previous Track or Bus"
 msgstr "Seleccionar pista o bus anterior"
 
-#: editor_actions.cc:215
+#: editor_actions.cc:221
 msgid "Toggle Record Enable"
 msgstr "Activar/Desactivar grabación"
 
-#: editor_actions.cc:217
+#: editor_actions.cc:223
 msgid "Toggle Solo"
 msgstr "Conmutar solo"
 
-#: editor_actions.cc:219
+#: editor_actions.cc:225
 msgid "Toggle Mute"
 msgstr "Conmutar mudo"
 
-#: editor_actions.cc:221
+#: editor_actions.cc:227
 msgid "Toggle Solo Isolate"
 msgstr "Conmutar solo aislado"
 
-#: editor_actions.cc:226
+#: editor_actions.cc:232
 msgid "Save View %1"
 msgstr "Guardar vista %1"
 
-#: editor_actions.cc:232
+#: editor_actions.cc:238
 msgid "Go to View %1"
 msgstr "Ir a vista %1"
 
-#: editor_actions.cc:238
+#: editor_actions.cc:244
 msgid "Locate to Mark %1"
 msgstr "Localizar a marca %1"
 
-#: editor_actions.cc:242 editor_actions.cc:243
+#: editor_actions.cc:249 editor_actions.cc:250
 msgid "Jump to Next Mark"
 msgstr "Saltar a marca siguiente"
 
-#: editor_actions.cc:244 editor_actions.cc:245
+#: editor_actions.cc:251 editor_actions.cc:252
 msgid "Jump to Previous Mark"
 msgstr "Saltar a marca anterior"
 
-#: editor_actions.cc:247 editor_actions.cc:248
+#: editor_actions.cc:254
+msgid "Set Session Start from Playhead"
+msgstr "Definir Inicio de sesión según cursor"
+
+#: editor_actions.cc:255
+msgid "Set Session End from Playhead"
+msgstr "Definir Fin de sesión según cursor"
+
+#: editor_actions.cc:257 editor_actions.cc:258
 msgid "Add Mark from Playhead"
 msgstr "Añadir marca en cursor"
 
-#: editor_actions.cc:250 editor_actions.cc:251
+#: editor_actions.cc:260 editor_actions.cc:261
 msgid "Remove Mark at Playhead"
 msgstr "Borrar marca en cursor"
 
-#: editor_actions.cc:253
+#: editor_actions.cc:263
 msgid "Nudge Next Later"
 msgstr "Atrasar a cercano"
 
-#: editor_actions.cc:254
+#: editor_actions.cc:264
 msgid "Nudge Next Earlier"
 msgstr "Adelantar a cercano"
 
-#: editor_actions.cc:256
+#: editor_actions.cc:266
 msgid "Nudge Playhead Forward"
 msgstr "Empujar cursor adelante"
 
-#: editor_actions.cc:257
+#: editor_actions.cc:267
 msgid "Nudge Playhead Backward"
 msgstr "Empujar cursor atrás"
 
-#: editor_actions.cc:258
-msgid "Playhead To Next Grid"
+#: editor_actions.cc:268
+msgid "Playhead to Next Grid"
 msgstr "Cursor a rejilla siguiente"
 
-#: editor_actions.cc:259
-msgid "Playhead To Previous Grid"
+#: editor_actions.cc:269
+msgid "Playhead to Previous Grid"
 msgstr "Cursor a rejilla anterior"
 
-#: editor_actions.cc:264
+#: editor_actions.cc:274
 msgid "Zoom to Selection"
 msgstr "Zoom a selección"
 
-#: editor_actions.cc:265
+#: editor_actions.cc:275
 msgid "Toggle Zoom State"
 msgstr "Cambiar estado de zoom"
 
-#: editor_actions.cc:267
+#: editor_actions.cc:277
 msgid "Expand Track Height"
 msgstr "Aumentar altura de pista"
 
-#: editor_actions.cc:268
+#: editor_actions.cc:278
 msgid "Shrink Track Height"
 msgstr "Disminuir altura de pista"
 
-#: editor_actions.cc:270
+#: editor_actions.cc:280
+msgid "Fit 1 Track"
+msgstr "Poner 1 pista"
+
+#: editor_actions.cc:281
+msgid "Fit 2 Tracks"
+msgstr "Poner 2 pistas"
+
+#: editor_actions.cc:282
+msgid "Fit 4 Tracks"
+msgstr "Poner 4 pistas"
+
+#: editor_actions.cc:283
+msgid "Fit 8 Tracks"
+msgstr "Poner 8 pistas"
+
+#: editor_actions.cc:284
+msgid "Fit 16 Tracks"
+msgstr "Poner 16 pistas"
+
+#: editor_actions.cc:285
+msgid "Fit 32 Tracks"
+msgstr "Poner 32 pistas"
+
+#: editor_actions.cc:286
+msgid "Fit All Tracks"
+msgstr "Poner todas las pistas"
+
+#: editor_actions.cc:293
+msgid "Zoom to 5 min"
+msgstr "Zoom a 5 min"
+
+#: editor_actions.cc:296
 msgid "Move Selected Tracks Up"
 msgstr "Subir las pistas seleccionadas"
 
-#: editor_actions.cc:272
+#: editor_actions.cc:298
 msgid "Move Selected Tracks Down"
 msgstr "Bajar las pistas seleccionadas"
 
 # Esto estaba traducido como "desplazar pistas hacia arriba" pero no estaba bien. La clave del sentido original la da la palabra "scroll". Es un desplazamiento de visualización en el editor para ver las pistas de más arriba o de más abajo. NO estamos desplazando pistas.
-#: editor_actions.cc:275
+#: editor_actions.cc:301
 msgid "Scroll Tracks Up"
 msgstr "Desplazarse hacia arriba"
 
-#: editor_actions.cc:277
+#: editor_actions.cc:302
 msgid "Scroll Tracks Down"
 msgstr "Desplazarse hacia abajo"
 
 # No lo encuentro en el Editor pero supongo que es lo mismo que Scroll Tracks up/down, sólo que poco a poco, no de forma brusca como hace el scroll. Lo dejo sin traducir, pues sospecho que la traducción era incorrecta y no sé dónde está ni cómo traducirlo
-#: editor_actions.cc:279
+#: editor_actions.cc:303
 msgid "Step Tracks Up"
 msgstr "Step Tracks Up"
 
-#: editor_actions.cc:281
+#: editor_actions.cc:304
 msgid "Step Tracks Down"
 msgstr "Step Tracks Down"
 
-#: editor_actions.cc:284
+#: editor_actions.cc:306
 msgid "Scroll Backward"
 msgstr "Desplazarse hacia atrás"
 
-#: editor_actions.cc:285
+#: editor_actions.cc:307
 msgid "Scroll Forward"
 msgstr "Desplazarse hacia delante"
 
-#: editor_actions.cc:286
+#: editor_actions.cc:308
 msgid "Center Playhead"
 msgstr "Centrar cursor"
 
-#: editor_actions.cc:287
+#: editor_actions.cc:309
 msgid "Center Edit Point"
 msgstr "Centrar punto de edición"
 
-#: editor_actions.cc:289
+#: editor_actions.cc:311
 msgid "Playhead Forward"
 msgstr "Cursor hacia delante"
 
-#: editor_actions.cc:290
+#: editor_actions.cc:312
 msgid "Playhead Backward"
 msgstr "Cursor hacia atrás"
 
-#: editor_actions.cc:292
+#: editor_actions.cc:314
 msgid "Playhead to Active Mark"
 msgstr "Cursor a marca activa"
 
-#: editor_actions.cc:293
+#: editor_actions.cc:315
 msgid "Active Mark to Playhead"
 msgstr "Marca activa a cursor"
 
-#: editor_actions.cc:295
+#: editor_actions.cc:317
 msgid "Use Skip Ranges"
 msgstr ""
 
-#: editor_actions.cc:302
+#: editor_actions.cc:324
 msgid "Play Selected Regions"
 msgstr "Reproducir regiones seleccionadas"
 
-#: editor_actions.cc:304
+#: editor_actions.cc:326
 msgid "Play from Edit Point and Return"
 msgstr "Reproducir desde punto de edición y retornar"
 
-#: editor_actions.cc:306
+#: editor_actions.cc:328
 msgid "Play Edit Range"
 msgstr "Reproducir rango de edición"
 
-#: editor_actions.cc:308
+#: editor_actions.cc:330
 msgid "Playhead to Mouse"
 msgstr "Cursor a ratón"
 
-#: editor_actions.cc:309
+#: editor_actions.cc:331
 msgid "Active Marker to Mouse"
 msgstr "Marca activa a ratón"
 
-#: editor_actions.cc:319
+#: editor_actions.cc:341
 msgid "Undo Selection Change"
 msgstr "Deshacer cambio de selección"
 
-#: editor_actions.cc:320
+#: editor_actions.cc:342
 msgid "Redo Selection Change"
 msgstr "Rehacer cambio de selección"
 
-#: editor_actions.cc:322
+#: editor_actions.cc:344
 msgid "Export Audio"
 msgstr "Exportar audio"
 
-#: editor_actions.cc:323 export_dialog.cc:396
+#: editor_actions.cc:345 export_dialog.cc:424
 msgid "Export Range"
 msgstr "Exportar rango"
 
-#: editor_actions.cc:328
+#: editor_actions.cc:350
 msgid "Separate Using Punch Range"
 msgstr "Separar usando rango de pinchazo"
 
-#: editor_actions.cc:331
+#: editor_actions.cc:353
 msgid "Separate Using Loop Range"
 msgstr "Separar usando rango de bucle"
 
-#: editor_actions.cc:334 editor_actions.cc:356
+#: editor_actions.cc:356 editor_actions.cc:379
 msgid "Crop"
 msgstr "Recortar"
 
-#: editor_actions.cc:344
+#: editor_actions.cc:366
 msgid "Fade Range Selection"
 msgstr "Atenuar selección de rango"
 
-#: editor_actions.cc:346
+#: editor_actions.cc:368
 msgid "Set Tempo from Edit Range = Bar"
 msgstr "Definir tempo según \"rango de edición = compás\""
 
-#: editor_actions.cc:348
+#: editor_actions.cc:371
 msgid "Log"
 msgstr "Log"
 
-#: editor_actions.cc:351 editor_actions.cc:353
+#: editor_actions.cc:374 editor_actions.cc:376
 msgid "Move to Next Transient"
 msgstr "Mover a siguiente transitorio"
 
-#: editor_actions.cc:352 editor_actions.cc:354
+#: editor_actions.cc:375 editor_actions.cc:377
 msgid "Move to Previous Transient"
 msgstr "Mover a transitorio previo"
 
-#: editor_actions.cc:358 editor_actions.cc:361
+#: editor_actions.cc:381
+msgid "Start Range from Playhead"
+msgstr "Inicio de rango según cursor"
+
+#: editor_actions.cc:382
+msgid "Finish Range from Playhead"
+msgstr "Fin de rango según cursor"
+
+#: editor_actions.cc:384 editor_actions.cc:393
 msgid "Start Range"
 msgstr "Comenzar rango"
 
-#: editor_actions.cc:359 editor_actions.cc:362
+#: editor_actions.cc:385 editor_actions.cc:394
 msgid "Finish Range"
 msgstr "Terminar rango"
 
-#: editor_actions.cc:394
+# rango de pinchado? ok?
+# traduzco por pinchazo, no suena muy bien. consultar
+#: editor_actions.cc:387
+msgid "Start Punch Range"
+msgstr "Inicio de rango de pinchazo"
+
+#: editor_actions.cc:388
+msgid "Finish Punch Range"
+msgstr "Fin de rango de pinchazo"
+
+#: editor_actions.cc:390
+msgid "Start Loop Range"
+msgstr "Inicio de rango de bucle"
+
+#: editor_actions.cc:391
+msgid "Finish Loop Range"
+msgstr "Fin de rango de bucle"
+
+#: editor_actions.cc:426
 msgid "Follow Playhead"
 msgstr "Seguir al cursor"
 
-#: editor_actions.cc:395
+#: editor_actions.cc:427
 msgid "Remove Last Capture"
 msgstr "Borrar última captura"
 
-#: editor_actions.cc:397
+#: editor_actions.cc:429
 msgid "Stationary Playhead"
 msgstr "Cursor estático"
 
-#: editor_actions.cc:399 insert_time_dialog.cc:32
+#: editor_actions.cc:431 insert_remove_time_dialog.cc:32
 msgid "Insert Time"
 msgstr "Insertar tiempo"
 
-#: editor_actions.cc:402
+#: editor_actions.cc:433 insert_remove_time_dialog.cc:32
+msgid "Remove Time"
+msgstr "Borrar tiempo"
+
+#: editor_actions.cc:438
 msgid "Toggle Active"
 msgstr "Activar/Desactivar pista"
 
-#: editor_actions.cc:407 editor_actions.cc:1768 editor_markers.cc:921
-#: editor_markers.cc:986 editor_snapshots.cc:122 mixer_strip.cc:1543
-#: route_time_axis.cc:856
+#: editor_actions.cc:440 editor_actions.cc:1785 editor_markers.cc:926
+#: editor_markers.cc:999 editor_markers.cc:1019 editor_snapshots.cc:134
+#: lua_script_manager.cc:32 lua_script_manager.cc:36 mixer_strip.cc:1705
+#: route_time_axis.cc:870 vca_master_strip.cc:400
 msgid "Remove"
 msgstr "Eliminar"
 
-#: editor_actions.cc:411
+#: editor_actions.cc:445
 msgid "Fit Selection (Vertical)"
 msgstr "Ajustar selección (vertical)"
 
-#: editor_actions.cc:413 time_axis_view.cc:1371
+#: editor_actions.cc:447 time_axis_view.cc:1287
 msgid "Largest"
 msgstr "Máxima"
 
-#: editor_actions.cc:416 time_axis_view.cc:1372
+#: editor_actions.cc:450 time_axis_view.cc:1288
 msgid "Larger"
 msgstr "Muy grande"
 
-#: editor_actions.cc:419 editor_rulers.cc:249 time_axis_view.cc:1373
+#: editor_actions.cc:453 editor_rulers.cc:248 time_axis_view.cc:1289
 msgid "Large"
 msgstr "Grande"
 
 # aquí creo que el original debería decir "smallest" por coherencia (son las alturas de pista). me tomo la libertad de corregir
-#: editor_actions.cc:425 editor_rulers.cc:253 time_axis_view.cc:1375
+#: editor_actions.cc:459 editor_rulers.cc:252 time_axis_view.cc:1291
 msgid "Small"
 msgstr "Mínima"
 
-#: editor_actions.cc:429
+#: editor_actions.cc:463
 msgid "Sound Selected MIDI Notes"
 msgstr "Sound Selected MIDI Notes"
 
-#: editor_actions.cc:434
+#: editor_actions.cc:468
 msgid "Zoom Focus Left"
 msgstr "Foco de zoom a la izquierda"
 
-#: editor_actions.cc:435
+#: editor_actions.cc:469
 msgid "Zoom Focus Right"
 msgstr "Foco de zoom a la derecha"
 
-#: editor_actions.cc:436
+#: editor_actions.cc:470
 msgid "Zoom Focus Center"
 msgstr "Foco de zoom al centro"
 
-#: editor_actions.cc:437
+#: editor_actions.cc:471
 msgid "Zoom Focus Playhead"
 msgstr "Foco de zoom al cursor"
 
-#: editor_actions.cc:438
+#: editor_actions.cc:472
 msgid "Zoom Focus Mouse"
 msgstr "Foco de zoom al ratón"
 
-#: editor_actions.cc:439
+#: editor_actions.cc:473
 msgid "Zoom Focus Edit Point"
 msgstr "Foco de zoom al punto de edición"
 
-#: editor_actions.cc:441
+#: editor_actions.cc:475
 msgid "Next Zoom Focus"
 msgstr "Siguiente foco del zoom"
 
-#: editor_actions.cc:447
+#: editor_actions.cc:488
 msgid "Smart Object Mode"
 msgstr "Modo de objeto smart"
 
-#: editor_actions.cc:450
+#: editor_actions.cc:491
 msgid "Smart"
 msgstr "Smart"
 
-#: editor_actions.cc:453
+#: editor_actions.cc:494
 msgid "Object Tool"
 msgstr "Herramienta de Objeto"
 
-#: editor_actions.cc:458
+#: editor_actions.cc:499
 msgid "Range Tool"
 msgstr "Herramienta de Rango"
 
-#: editor_actions.cc:463
+#: editor_actions.cc:504
 msgid "Note Drawing Tool"
 msgstr "Herramienta de dibujado de notas"
 
-#: editor_actions.cc:468
+#: editor_actions.cc:509
 msgid "Audition Tool"
 msgstr "Herramienta de escucha"
 
-#: editor_actions.cc:473
+#: editor_actions.cc:514
 msgid "Time FX Tool"
 msgstr "Herramienta de Efectos de tiempo"
 
-#: editor_actions.cc:478
+#: editor_actions.cc:519
 msgid "Content Tool"
 msgstr "Herramienta de contenidos"
 
-#: editor_actions.cc:484
+#: editor_actions.cc:525
 msgid "Cut Tool"
 msgstr ""
 
-#: editor_actions.cc:490
+#: editor_actions.cc:531
 msgid "Step Mouse Mode"
 msgstr "Step Mouse Mode"
 
-#: editor_actions.cc:497
+#: editor_actions.cc:538
 msgid "Change Edit Point"
 msgstr "Cambiar punto de edición"
 
-#: editor_actions.cc:498
+#: editor_actions.cc:539
 msgid "Change Edit Point Including Marker"
 msgstr "Cambiar punto de edición incluyendo marca"
 
-#: editor_actions.cc:504
+#: editor_actions.cc:544
+msgid "EditMode|Lock"
+msgstr "Bloqueo"
+
+#: editor_actions.cc:545
 msgid "Cycle Edit Mode"
-msgstr ""
+msgstr "Modo de edición cíclica"
 
-#: editor_actions.cc:506
+#: editor_actions.cc:547
 msgid "Snap to"
 msgstr "Ajustar a"
 
-#: editor_actions.cc:507
+#: editor_actions.cc:548
 msgid "Snap Mode"
 msgstr "Modo de ajuste"
 
-#: editor_actions.cc:514
+#: editor_actions.cc:555
 msgid "Next Snap Mode"
 msgstr "Siguiente modo de ajuste"
 
-#: editor_actions.cc:515
+#: editor_actions.cc:556
 msgid "Next Snap Choice"
 msgstr "Siguiente elección de ajuste"
 
-#: editor_actions.cc:516
+#: editor_actions.cc:557
 msgid "Next Musical Snap Choice"
 msgstr "Siguiente selección de ajuste musical"
 
-#: editor_actions.cc:517
+#: editor_actions.cc:558
 msgid "Previous Snap Choice"
 msgstr "Elección de ajuste anterior"
 
-#: editor_actions.cc:518
+#: editor_actions.cc:559
 msgid "Previous Musical Snap Choice"
 msgstr "Selección de ajuste musical anterior"
 
-#: editor_actions.cc:523
+#: editor_actions.cc:564
 msgid "Snap to CD Frame"
 msgstr "Ajustar a cuadros CD"
 
-#: editor_actions.cc:524
+#: editor_actions.cc:565
 msgid "Snap to Timecode Frame"
 msgstr "Ajustar a muestras Timecode"
 
-#: editor_actions.cc:525
+#: editor_actions.cc:566
 msgid "Snap to Timecode Seconds"
 msgstr "Ajustar a segundos Timecode"
 
-#: editor_actions.cc:526
+#: editor_actions.cc:567
 msgid "Snap to Timecode Minutes"
 msgstr "Ajustar a minutos Timecode"
 
-#: editor_actions.cc:527
+#: editor_actions.cc:568
 msgid "Snap to Seconds"
 msgstr "Ajustar a segundos"
 
-#: editor_actions.cc:528
+#: editor_actions.cc:569
 msgid "Snap to Minutes"
 msgstr "Ajustar a minutos"
 
-#: editor_actions.cc:530
+#: editor_actions.cc:571
 msgid "Snap to One Twenty Eighths"
 msgstr "Ajustar a pulsos/128"
 
-#: editor_actions.cc:531
+#: editor_actions.cc:572
 msgid "Snap to Sixty Fourths"
 msgstr "Ajustar a pulsos/64"
 
-#: editor_actions.cc:532
+#: editor_actions.cc:573
 msgid "Snap to Thirty Seconds"
 msgstr "Ajustar a pulsos/32"
 
-#: editor_actions.cc:533
+#: editor_actions.cc:574
 msgid "Snap to Twenty Eighths"
 msgstr "Ajustar a pulsos/28"
 
-#: editor_actions.cc:534
+#: editor_actions.cc:575
 msgid "Snap to Twenty Fourths"
 msgstr "Ajustar a pulsos/24"
 
-#: editor_actions.cc:535
+#: editor_actions.cc:576
 msgid "Snap to Twentieths"
 msgstr "Ajustar a pulsos/20"
 
-#: editor_actions.cc:536
+#: editor_actions.cc:577
 msgid "Snap to Sixteenths"
 msgstr "Ajustar a pulsos/16"
 
-#: editor_actions.cc:537
+#: editor_actions.cc:578
 msgid "Snap to Fourteenths"
 msgstr "Ajustar a pulsos/14"
 
-#: editor_actions.cc:538
+#: editor_actions.cc:579
 msgid "Snap to Twelfths"
 msgstr "Ajustar a pulsos/12"
 
-#: editor_actions.cc:539
+#: editor_actions.cc:580
 msgid "Snap to Tenths"
 msgstr "Ajustar a pulsos/10"
 
-#: editor_actions.cc:540
+#: editor_actions.cc:581
 msgid "Snap to Eighths"
 msgstr "Ajustar a pulsos/8"
 
-#: editor_actions.cc:541
+#: editor_actions.cc:582
 msgid "Snap to Sevenths"
 msgstr "Ajustar a pulsos/7"
 
-#: editor_actions.cc:542
+#: editor_actions.cc:583
 msgid "Snap to Sixths"
 msgstr "Ajustar a pulsos/6"
 
-#: editor_actions.cc:543
+#: editor_actions.cc:584
 msgid "Snap to Fifths"
 msgstr "Ajustar a pulsos/5"
 
-#: editor_actions.cc:544
+#: editor_actions.cc:585
 msgid "Snap to Quarters"
 msgstr "Ajustar a pulsos/4"
 
-#: editor_actions.cc:545
+#: editor_actions.cc:586
 msgid "Snap to Thirds"
 msgstr "Ajustar a pulsos/3"
 
-#: editor_actions.cc:546
+#: editor_actions.cc:587
 msgid "Snap to Halves"
 msgstr "Ajustar a pulsos/2"
 
-#: editor_actions.cc:548
+#: editor_actions.cc:589
 msgid "Snap to Beat"
 msgstr "Ajustar a pulsos"
 
-#: editor_actions.cc:549
+#: editor_actions.cc:590
 msgid "Snap to Bar"
 msgstr "Ajustar a compases"
 
-#: editor_actions.cc:550
+#: editor_actions.cc:591
 msgid "Snap to Mark"
 msgstr "Ajustar a marcas"
 
-#: editor_actions.cc:551
+#: editor_actions.cc:592
 msgid "Snap to Region Start"
 msgstr "Ajustar a inicios de región"
 
-#: editor_actions.cc:552
+#: editor_actions.cc:593
 msgid "Snap to Region End"
 msgstr "Ajustar a finales de región"
 
-#: editor_actions.cc:553
+#: editor_actions.cc:594
 msgid "Snap to Region Sync"
 msgstr "Ajustar a sincronías de región"
 
-#: editor_actions.cc:554
+#: editor_actions.cc:595
 msgid "Snap to Region Boundary"
 msgstr "Ajustar a bordes de región"
 
-#: editor_actions.cc:556
+#: editor_actions.cc:597
 msgid "Show Marker Lines"
 msgstr "Mostrar líneas de marca"
 
-#: editor_actions.cc:566
+#: editor_actions.cc:607
 msgid "Loop/Punch"
 msgstr "Bucle/Pinchazo"
 
-#: editor_actions.cc:570
+#: editor_actions.cc:611
 msgid "Min:Sec"
 msgstr "Mins:Segs"
 
-#: editor_actions.cc:572 editor_actions.cc:575 editor_rulers.cc:271
+#: editor_actions.cc:613 editor_actions.cc:616 editor_rulers.cc:270
+#: rc_option_editor.cc:1592
 msgid "Video Monitor"
 msgstr ""
 
-#: editor_actions.cc:574 rc_option_editor.cc:2260
+#: editor_actions.cc:615 rc_option_editor.cc:2844
 msgid "Video"
 msgstr ""
 
-#: editor_actions.cc:577
+#: editor_actions.cc:618
 msgid "Always on Top"
 msgstr ""
 
-#: editor_actions.cc:579
+#: editor_actions.cc:620
 msgid "Frame number"
 msgstr ""
 
-#: editor_actions.cc:580
+#: editor_actions.cc:621
 msgid "Timecode Background"
 msgstr ""
 
-#: editor_actions.cc:581
+#: editor_actions.cc:622
 msgid "Fullscreen"
 msgstr ""
 
-#: editor_actions.cc:582
+#: editor_actions.cc:623
 msgid "Letterbox"
 msgstr ""
 
-#: editor_actions.cc:583
+#: editor_actions.cc:624
 msgid "Original Size"
 msgstr ""
 
-#: editor_actions.cc:640
+#: editor_actions.cc:681
 msgid "Sort"
 msgstr "Ordenar"
 
-#: editor_actions.cc:651 editor_routes.cc:476 mixer_ui.cc:1196
+#: editor_actions.cc:692 editor_routes.cc:549 mixer_ui.cc:1497
 msgid "Show All"
 msgstr "Mostrar todo"
 
-#: editor_actions.cc:652
+#: editor_actions.cc:693
 msgid "Show Automatic Regions"
 msgstr "Mostrar regiones automáticas"
 
-#: editor_actions.cc:654
+#: editor_actions.cc:695
 msgid "Ascending"
 msgstr "Ascendente"
 
-#: editor_actions.cc:656
+#: editor_actions.cc:697
 msgid "Descending"
 msgstr "Descendente"
 
-#: editor_actions.cc:659
+#: editor_actions.cc:700
 msgid "By Region Name"
 msgstr "Por nombre de región"
 
-#: editor_actions.cc:661
+#: editor_actions.cc:702
 msgid "By Region Length"
 msgstr "Por duración de región"
 
-#: editor_actions.cc:663
+#: editor_actions.cc:704
 msgid "By Region Position"
 msgstr "Por posición de región"
 
-#: editor_actions.cc:665
+#: editor_actions.cc:706
 msgid "By Region Timestamp"
 msgstr "Por timestamp de región"
 
-#: editor_actions.cc:667
+#: editor_actions.cc:708
 msgid "By Region Start in File"
 msgstr "Por inicio de región en archivo"
 
-#: editor_actions.cc:669
+#: editor_actions.cc:710
 msgid "By Region End in File"
 msgstr "Por fin de región en archivo"
 
-#: editor_actions.cc:671
+#: editor_actions.cc:712
 msgid "By Source File Name"
 msgstr "Por nombre de archivo"
 
-#: editor_actions.cc:673
+#: editor_actions.cc:714
 msgid "By Source File Length"
 msgstr "Por duración de archivo"
 
-#: editor_actions.cc:675
+#: editor_actions.cc:716
 msgid "By Source File Creation Date"
 msgstr "Por fecha de creación"
 
-#: editor_actions.cc:677
+#: editor_actions.cc:718
 msgid "By Source Filesystem"
 msgstr "Por sistema de archivos"
 
-#: editor_actions.cc:680
+#: editor_actions.cc:721
 msgid "Remove Unused"
 msgstr "Eliminar no usados"
 
-#: editor_actions.cc:684 editor_audio_import.cc:282
-#: session_import_dialog.cc:75 session_import_dialog.cc:95
-#: session_metadata_dialog.cc:418 editor_videotimeline.cc:91
+#: editor_actions.cc:723
+msgid "Import PT session"
+msgstr "Importar sesión PT"
+
+#: editor_actions.cc:728 editor_audio_import.cc:282 editor_pt_import.cc:149
+#: luawindow.cc:99 session_import_dialog.cc:75 session_import_dialog.cc:95
+#: session_metadata_dialog.cc:421 sfdb_ui.cc:558 editor_videotimeline.cc:91
 msgid "Import"
 msgstr "Importar"
 
-#: editor_actions.cc:687
+#: editor_actions.cc:731
 msgid "Import to Region List..."
 msgstr "Importar a lista de regiones..."
 
-#: editor_actions.cc:690 session_import_dialog.cc:44
-msgid "Import From Session"
-msgstr "Exportar desde sesión"
+#: editor_actions.cc:734 session_import_dialog.cc:44
+#: session_import_dialog.cc:65
+msgid "Import from Session"
+msgstr "Importar desde sesión"
 
-#: editor_actions.cc:694
+#: editor_actions.cc:738
 msgid "Bring all media into session folder"
 msgstr ""
 
-#: editor_actions.cc:697
+#: editor_actions.cc:741
 msgid "Show Summary"
 msgstr "Mostrar resumen"
 
-#: editor_actions.cc:699
+#: editor_actions.cc:743
 msgid "Show Group Tabs"
 msgstr "Mostrar pestañas de grupos"
 
-#: editor_actions.cc:701
+#: editor_actions.cc:745
 msgid "Show Measure Lines"
 msgstr "Mostrar líneas de compás"
 
-#: editor_actions.cc:705
-msgid "Show Logo"
-msgstr "Mostrar logo"
-
-#: editor_actions.cc:709
+#: editor_actions.cc:747
 msgid "Toggle MIDI Input Active for Editor-Selected Tracks/Busses"
 msgstr ""
 "Conmutar \"Entrada MIDI activa\" para pistas y buses seleccionadas para "
 "edición"
 
-#: editor_actions.cc:732
-msgid "Loaded editor bindings from %1"
-msgstr "Cargando editor de combinaciones de teclas desde %1"
-
-#: editor_actions.cc:734
-msgid "Could not find editor.bindings in search path %1"
-msgstr "Could not find editor.bindings in search path %1"
-
-#: editor_actions.cc:1078 editor_actions.cc:1474 editor_actions.cc:1485
-#: editor_actions.cc:1538 editor_actions.cc:1549 editor_actions.cc:1596
-#: editor_actions.cc:1606 editor_regions.cc:1563
+#: editor_actions.cc:1081 editor_actions.cc:1477 editor_actions.cc:1488
+#: editor_actions.cc:1541 editor_actions.cc:1552 editor_actions.cc:1599
+#: editor_actions.cc:1609 editor_regions.cc:1657 luainstance.cc:327
+#: luainstance.cc:1690
 msgid "programming error: %1: %2"
 msgstr "programming error: %1: %2"
 
-#: editor_actions.cc:1774
+#: editor_actions.cc:1791
 msgid "Raise"
 msgstr "Levantar"
 
-#: editor_actions.cc:1777
+#: editor_actions.cc:1794
 msgid "Raise to Top"
 msgstr "Levantar a capa superior"
 
-#: editor_actions.cc:1780
+#: editor_actions.cc:1797
 msgid "Lower"
 msgstr "Bajar"
 
-#: editor_actions.cc:1783
+#: editor_actions.cc:1800
 msgid "Lower to Bottom"
 msgstr "Bajar a capa inferior"
 
-#: editor_actions.cc:1786
+#: editor_actions.cc:1803
 msgid "Move to Original Position"
 msgstr "Mover a posición original"
 
-#: editor_actions.cc:1791
+#: editor_actions.cc:1808
 msgid "Lock to Video"
 msgstr ""
 
-#: editor_actions.cc:1796 editor_markers.cc:912
+#: editor_actions.cc:1813 editor_markers.cc:917
 msgid "Glue to Bars and Beats"
 msgstr "Adherir a compases y pulsos"
 
-#: editor_actions.cc:1801
+#: editor_actions.cc:1818
 msgid "Remove Sync"
 msgstr "Eliminar sincronía"
 
-#: editor_actions.cc:1804 mixer_strip.cc:2006 monitor_section.cc:272
-#: route_time_axis.cc:253 route_time_axis.cc:526
+#: editor_actions.cc:1821 mixer_strip.cc:2192 monitor_section.cc:253
+#: monitor_section.cc:321 route_time_axis.cc:264 route_time_axis.cc:550
 msgid "Mute"
 msgstr "Mudo"
 
-#: editor_actions.cc:1807
+#: editor_actions.cc:1824
 msgid "Normalize..."
 msgstr "Normalizar..."
 
-#: editor_actions.cc:1810
+#: editor_actions.cc:1827
 msgid "Reverse"
 msgstr "Al revés"
 
-#: editor_actions.cc:1813
+#: editor_actions.cc:1830
 msgid "Make Mono Regions"
 msgstr "Crear regiones mono"
 
-#: editor_actions.cc:1816
+#: editor_actions.cc:1833
 msgid "Boost Gain"
 msgstr "Amplificar ganancia"
 
-#: editor_actions.cc:1819
+#: editor_actions.cc:1836
 msgid "Cut Gain"
 msgstr "Reducir ganancia"
 
-#: editor_actions.cc:1822
+#: editor_actions.cc:1839
 msgid "Pitch Shift..."
 msgstr "Cambiar tono..."
 
-#: editor_actions.cc:1825
-msgid "Transpose..."
-msgstr "Transponer..."
-
-#: editor_actions.cc:1828
+#: editor_actions.cc:1845
 msgid "Opaque"
 msgstr "Opaca"
 
-#: editor_actions.cc:1832 editor_regions.cc:117
+#: editor_actions.cc:1849 editor_regions.cc:164
 msgid "Fade In"
 msgstr "Fundido de entrada"
 
-#: editor_actions.cc:1837 editor_regions.cc:118
+#: editor_actions.cc:1854 editor_regions.cc:165
 msgid "Fade Out"
 msgstr "Fundido de salida"
 
-#: editor_actions.cc:1852
+#: editor_actions.cc:1869
 msgid "Multi-Duplicate..."
 msgstr "Duplicado múltiple..."
 
-#: editor_actions.cc:1857
+#: editor_actions.cc:1874
 msgid "Fill Track"
 msgstr "Llenar pista"
 
-#: editor_actions.cc:1861 editor_markers.cc:1000
+#: editor_actions.cc:1878 editor_markers.cc:1033
 msgid "Set Loop Range"
 msgstr "Crear rango de bucle"
 
-#: editor_actions.cc:1868
+#: editor_actions.cc:1885
 msgid "Set Punch"
 msgstr "Establecer pinchazo"
 
-#: editor_actions.cc:1872
+#: editor_actions.cc:1889
 msgid "Add Single Range Marker"
 msgstr "Añadir marca de rango simple"
 
-#: editor_actions.cc:1877
+#: editor_actions.cc:1894
 msgid "Add Range Marker Per Region"
 msgstr "Añadir marca de rango por región"
 
-#: editor_actions.cc:1881
-msgid "Snap Position To Grid"
+#: editor_actions.cc:1898
+msgid "Snap Position to Grid"
 msgstr "Ajustar posición a rejilla"
 
-#: editor_actions.cc:1884
+#: editor_actions.cc:1901
 msgid "Close Gaps"
 msgstr "Cerrar huecos"
 
-#: editor_actions.cc:1887
+#: editor_actions.cc:1904
 msgid "Rhythm Ferret..."
 msgstr "Rhythm Ferret..."
 
-#: editor_actions.cc:1890
+#: editor_actions.cc:1907
 msgid "Export..."
 msgstr "Exportar..."
 
-#: editor_actions.cc:1896
+#: editor_actions.cc:1913
 msgid "Separate Under"
 msgstr "Separar debajo"
 
-#: editor_actions.cc:1900 editor_actions.cc:1901
+#: editor_actions.cc:1917 editor_actions.cc:1918
 msgid "Set Fade In Length"
 msgstr "Definir duración de fundido de entrada"
 
-#: editor_actions.cc:1902 editor_actions.cc:1903
+#: editor_actions.cc:1919 editor_actions.cc:1920
 msgid "Set Fade Out Length"
 msgstr "Definir duración de fundido de salida"
 
-#: editor_actions.cc:1905
+#: editor_actions.cc:1922
 msgid "Set Tempo from Region = Bar"
 msgstr "Definir tempo según \"región = compás\""
 
-#: editor_actions.cc:1910
+#: editor_actions.cc:1927
 msgid "Split at Percussion Onsets"
 msgstr "Separar en inicios de percusión"
 
-#: editor_actions.cc:1915
+#: editor_actions.cc:1932
 msgid "List Editor..."
 msgstr "Editor de lista de eventos..."
 
-#: editor_actions.cc:1918
+#: editor_actions.cc:1935
 msgid "Properties..."
 msgstr "Propiedades..."
 
-#: editor_actions.cc:1922
+#: editor_actions.cc:1939
 msgid "Bounce (with processing)"
 msgstr "Rebotar (con procesado)"
 
-#: editor_actions.cc:1923
+#: editor_actions.cc:1940
 msgid "Bounce (without processing)"
 msgstr "Rebotar (sin procesado)"
 
-#: editor_actions.cc:1924
+#: editor_actions.cc:1941
 msgid "Combine"
 msgstr "Combinar"
 
-#: editor_actions.cc:1925
+#: editor_actions.cc:1942
 msgid "Uncombine"
 msgstr "Descombinar"
 
-#: editor_actions.cc:1927
+#: editor_actions.cc:1944
+msgid "Loudness Analysis..."
+msgstr "Análisis de loudness..."
+
+#: editor_actions.cc:1945
 msgid "Spectral Analysis..."
 msgstr "Análisis espectral..."
 
-#: editor_actions.cc:1929
+#: editor_actions.cc:1947
 msgid "Reset Envelope"
 msgstr "Restablecer envolvente"
 
-#: editor_actions.cc:1931
+#: editor_actions.cc:1949
 msgid "Reset Gain"
 msgstr "Restablecer ganancia"
 
-#: editor_actions.cc:1936
+#: editor_actions.cc:1954
 msgid "Envelope Active"
 msgstr "Envolvente activa"
 
-#: editor_actions.cc:1944 editor_actions.cc:1945
+#: editor_actions.cc:1962 editor_actions.cc:1963
 msgid "Insert Patch Change..."
 msgstr "Insertar cambio de patch..."
 
-#: editor_actions.cc:1946
+#: editor_actions.cc:1964
 msgid "Unlink from other copies"
 msgstr "Desligar de otras copias"
 
-#: editor_actions.cc:1947
+#: editor_actions.cc:1965
 msgid "Strip Silence..."
 msgstr "Quitar silencio..."
 
-#: editor_actions.cc:1948
+#: editor_actions.cc:1966
 msgid "Set Range Selection"
 msgstr "Establecer selección de rango"
 
-#: editor_actions.cc:1950 editor_actions.cc:1951
+#: editor_actions.cc:1968 editor_actions.cc:1969
 msgid "Nudge Later"
 msgstr "Atrasar"
 
-#: editor_actions.cc:1952 editor_actions.cc:1953
+#: editor_actions.cc:1970 editor_actions.cc:1971
 msgid "Nudge Earlier"
 msgstr "Adelantar"
 
-#: editor_actions.cc:1955
+#: editor_actions.cc:1973
 msgid "Sequence Regions"
 msgstr ""
 
-#: editor_actions.cc:1960
+#: editor_actions.cc:1978
 msgid "Nudge Later by Capture Offset"
 msgstr "Atrasar por compensación de captura"
 
-#: editor_actions.cc:1967
+#: editor_actions.cc:1985
 msgid "Nudge Earlier by Capture Offset"
 msgstr "Adelantar por compensación de captura"
 
-#: editor_actions.cc:1971
+#: editor_actions.cc:1989
 msgid "Trim to Loop"
 msgstr "Recortar a bucle"
 
-#: editor_actions.cc:1972
+#: editor_actions.cc:1990
 msgid "Trim to Punch"
 msgstr "Recortar a pinchazo"
 
-#: editor_actions.cc:1974
+#: editor_actions.cc:1992
 msgid "Trim to Previous"
 msgstr "Recortar a anterior"
 
-#: editor_actions.cc:1975
+#: editor_actions.cc:1993
 msgid "Trim to Next"
 msgstr "Recortar a siguiente"
 
-#: editor_actions.cc:1982
-msgid "Insert Region From Region List"
+#: editor_actions.cc:2000
+msgid "Insert Region from Region List"
 msgstr "Insertar región desde lista de regiones"
 
-#: editor_actions.cc:1988
+#: editor_actions.cc:2006
 msgid "Set Sync Position"
 msgstr "Establecer posición de sincronía"
 
-#: editor_actions.cc:1989
+#: editor_actions.cc:2007
 msgid "Place Transient"
 msgstr "Colocar transitorio"
 
-#: editor_actions.cc:1990
+#: editor_actions.cc:2008
 msgid "Split/Separate"
 msgstr "Separar"
 
-#: editor_actions.cc:1991
+#: editor_actions.cc:2009
 msgid "Trim Start at Edit Point"
 msgstr "Recortar inicio en punto de edición"
 
-#: editor_actions.cc:1992
+#: editor_actions.cc:2010
 msgid "Trim End at Edit Point"
 msgstr "Recortar final en punto de edición"
 
-#: editor_actions.cc:1997
+#: editor_actions.cc:2015
 msgid "Align Start"
 msgstr "Alinear inicio"
 
-#: editor_actions.cc:2004
+#: editor_actions.cc:2022
 msgid "Align Start Relative"
 msgstr "Alinear inicio relativo"
 
-#: editor_actions.cc:2008
+#: editor_actions.cc:2026
 msgid "Align End"
 msgstr "Alinear final"
 
-#: editor_actions.cc:2013
+#: editor_actions.cc:2031
 msgid "Align End Relative"
 msgstr "Alinear final relativo"
 
-#: editor_actions.cc:2020
+#: editor_actions.cc:2038
 msgid "Align Sync"
 msgstr "Alinear sincronía"
 
-#: editor_actions.cc:2027
+#: editor_actions.cc:2045
 msgid "Align Sync Relative"
 msgstr "Alinear sincronía relativo"
 
-#: editor_actions.cc:2031 editor_actions.cc:2034
+#: editor_actions.cc:2049 editor_actions.cc:2050
 msgid "Choose Top..."
 msgstr "Elegir superior..."
 
@@ -4629,32 +5219,33 @@ msgstr ""
 "La sesión ya contiene un archivo llamado %1. ¿Deseas importar %2 como un "
 "nuevo archivo u omitirlo?"
 
-#: editor_audio_import.cc:282 editor_videotimeline.cc:91
+#: editor_audio_import.cc:282 editor_pt_import.cc:149
+#: editor_videotimeline.cc:91
 msgid "Cancel Import"
 msgstr "Cancelar Importación"
 
-#: editor_audio_import.cc:559
+#: editor_audio_import.cc:565
 msgid "Editor: cannot open file \"%1\", (%2)"
 msgstr "Editor: no se pudo abrir el archivo \"%1\", (%2)"
 
-#: editor_audio_import.cc:567
+#: editor_audio_import.cc:573
 msgid "Cancel entire import"
 msgstr "Cancelar importación completa"
 
-#: editor_audio_import.cc:568
+#: editor_audio_import.cc:574
 msgid "Don't embed it"
 msgstr "No embeber"
 
-#: editor_audio_import.cc:569
+#: editor_audio_import.cc:575
 msgid "Embed all without questions"
 msgstr "Embeber todos sin preguntas"
 
-#: editor_audio_import.cc:572 editor_audio_import.cc:598
-#: export_format_dialog.cc:60
+#: editor_audio_import.cc:578 editor_audio_import.cc:604
+#: export_format_dialog.cc:68
 msgid "Sample rate"
 msgstr "Frec. de muestreo"
 
-#: editor_audio_import.cc:573 editor_audio_import.cc:599
+#: editor_audio_import.cc:579 editor_audio_import.cc:605
 msgid ""
 "%1\n"
 "This audiofile's sample rate doesn't match the session sample rate!"
@@ -4662,209 +5253,278 @@ msgstr ""
 "%1\n"
 "¡La frecuencia de muestreo de este archivo es diferente a la de la sesión!"
 
-#: editor_audio_import.cc:595
+#: editor_audio_import.cc:601
 msgid "Embed it anyway"
 msgstr "Embeber de todas formas"
 
-#: editor_canvas_events.cc:1306 editor_drag.cc:1381
+#: editor_pt_import.cc:81
+msgid "You can't import a PT session until you have a session loaded."
+msgstr "No puedes importar una sesión PT hasta tener una sesión cargada."
+
+#: editor_pt_import.cc:86
+msgid "Import PT Session"
+msgstr "Importar sesión PT"
+
+#: editor_pt_import.cc:97
+msgid "%1: this is only the directory/folder name, not the filename.\n"
+msgstr ""
+
+#: editor_pt_import.cc:132
+msgid "Doesn't seem to be a valid PT session file"
+msgstr ""
+
+#: editor_pt_import.cc:136
+msgid ""
+"PT v%1 Session @ %2Hz\n"
+"\n"
+"%3 audio files\n"
+"%4 regions\n"
+"%5 active regions\n"
+"\n"
+"Continue..."
+msgstr ""
+
+#: editor_pt_import.cc:175
+msgid ""
+"Failed to load one or more of the audio files, but continuing to attempt "
+"import."
+msgstr ""
+
+#: editor_pt_import.cc:178
+msgid "Success! Import should complete soon."
+msgstr ""
+
+#: editor_pt_import.cc:263
+msgid "PTImport: UINT_MAX routes? impossible!"
+msgstr ""
+
+#: editor_canvas_events.cc:1296 editor_drag.cc:1418
 msgid "Could not create new track after region placed in the drop zone"
 msgstr ""
 
 # No estoy seguro si queda bien, pero tampoco suena tan mal
-#: editor_drag.cc:1266
+#: editor_drag.cc:1306
 msgid "fixed time region drag"
 msgstr "Arrastre de región en tiempo fijado"
 
-#: editor_drag.cc:2214
+#: editor_drag.cc:2249
 msgid "Ripple drag"
 msgstr ""
 
-#: editor_drag.cc:2365 midi_region_view.cc:2813
+#: editor_drag.cc:2311
+msgid "create region"
+msgstr "crear región"
+
+#: editor_drag.cc:2430 midi_region_view.cc:2857
 msgid "resize notes"
 msgstr "redimensionar notas"
 
-#: editor_drag.cc:2517
+#: editor_drag.cc:2613 editor_drag.cc:2648
+msgid ""
+"One or more Audio Regions\n"
+"are both Locked and\n"
+"Locked to Video.\n"
+"The video cannot me moved."
+msgstr ""
+
+#: editor_drag.cc:2683
 msgid "Video Start:"
 msgstr ""
 
-#: editor_drag.cc:2519
+#: editor_drag.cc:2685
 msgid "Diff:"
 msgstr ""
 
-#: editor_drag.cc:2538
+#: editor_drag.cc:2707
 msgid "Move Video"
 msgstr ""
 
-#: editor_drag.cc:3046
-msgid "copy meter mark"
-msgstr "copiar marca de métrica"
-
-#: editor_drag.cc:3054
+#: editor_drag.cc:3177
 msgid "move meter mark"
 msgstr "mover marca de métrica"
 
-#: editor_drag.cc:3177
-msgid "copy tempo mark"
-msgstr "copiar marca de tempo"
+#: editor_drag.cc:3179
+msgid "copy meter mark"
+msgstr "copiar marca de métrica"
+
+#: editor_drag.cc:3279
+msgid "inactive"
+msgstr "Inactivo"
 
-#: editor_drag.cc:3185
+#: editor_drag.cc:3324
 msgid "move tempo mark"
 msgstr "mover marca de tempo"
 
-#: editor_drag.cc:3412
+#: editor_drag.cc:3331
+msgid "copy tempo mark"
+msgstr "copiar marca de tempo"
+
+#: editor_drag.cc:3462
+msgid "dilate tempo"
+msgstr ""
+
+#: editor_drag.cc:3736
 msgid "change fade in length"
 msgstr "cambiar duración del fundido de entrada"
 
-#: editor_drag.cc:3526
+#: editor_drag.cc:3861
 msgid "change fade out length"
 msgstr "cambiar duración del fundido de salida"
 
-#: editor_drag.cc:3880
+#: editor_drag.cc:4239
 msgid "move marker"
 msgstr "mover marca"
 
-#: editor_drag.cc:4490
+#: editor_drag.cc:4506 editor_drag.cc:5833
+msgid "automation range move"
+msgstr "mover rango de automatización"
+
+#: editor_drag.cc:4890
 msgid "An error occurred while executing time stretch operation"
 msgstr "Ocurrió un error al ejecutar la operación de cambio de tempo"
 
-#: editor_drag.cc:4947
+#: editor_drag.cc:5351
 msgid "programming_error: %1"
 msgstr "programming_error: %1"
 
-#: editor_drag.cc:5016 editor_drag.cc:5026
+#: editor_drag.cc:5420 editor_drag.cc:5430
 msgid "new skip marker"
 msgstr ""
 
-#: editor_drag.cc:5017
+#: editor_drag.cc:5421
 msgid "skip"
 msgstr ""
 
-#: editor_drag.cc:5021 location_ui.cc:56
+#: editor_drag.cc:5425 location_ui.cc:60
 msgid "CD"
 msgstr "CD"
 
-#: editor_drag.cc:5022
+#: editor_drag.cc:5426
 msgid "new CD marker"
 msgstr "nueva marca de CD"
 
-#: editor_drag.cc:5027 editor_route_groups.cc:437 mixer_ui.cc:1493
+#: editor_drag.cc:5431 editor_route_groups.cc:439 mixer_ui.cc:1840
 msgid "unnamed"
 msgstr "sin nombre"
 
-#: editor_drag.cc:5309
+#: editor_drag.cc:5740
 msgid "Automation range drag created for invalid region type"
 msgstr ""
 
-#: editor_route_groups.cc:96
+#: editor_route_groups.cc:97
 msgid "Col"
 msgstr "Col"
 
-#: editor_route_groups.cc:96
+#: editor_route_groups.cc:97
 msgid "Group Tab Color"
 msgstr "Color de grupo"
 
-#: editor_route_groups.cc:97
+#: editor_route_groups.cc:98
 msgid "Name of Group"
 msgstr "Nombre de grupo"
 
-#: editor_route_groups.cc:98 editor_routes.cc:207
-msgid "V"
+#: editor_route_groups.cc:99 editor_routes.cc:234
+msgid "Visible|V"
 msgstr "V"
 
-#: editor_route_groups.cc:98
+#: editor_route_groups.cc:99
 msgid "Group is visible?"
 msgstr "¿El grupo es visible?"
 
-#: editor_route_groups.cc:99
+#: editor_route_groups.cc:100
 msgid "On"
 msgstr "On"
 
-#: editor_route_groups.cc:99
+#: editor_route_groups.cc:100
 msgid "Group is enabled?"
-msgstr "Está activado el grupo?"
+msgstr "¿Está activado el grupo?"
 
-#: editor_route_groups.cc:100
-msgid "group|G"
-msgstr "Grupo|G"
+#: editor_route_groups.cc:101
+msgid "Group|G"
+msgstr "G"
 
-#: editor_route_groups.cc:100
+#: editor_route_groups.cc:101
 msgid "Sharing Gain?"
-msgstr "Comparte ganancia?"
+msgstr "¿Comparte ganancia?"
 
-#: editor_route_groups.cc:101
-msgid "relative|Rel"
-msgstr "Relativa|Rel"
+#: editor_route_groups.cc:102
+msgid "Relative|Rel"
+msgstr "Rel"
 
-#: editor_route_groups.cc:101
+#: editor_route_groups.cc:102
 msgid "Relative Gain Changes?"
 msgstr "¿Cambios de ganancia relativos?"
 
-#: editor_route_groups.cc:102
-msgid "mute|M"
-msgstr "mudo|M"
+#: editor_route_groups.cc:103 editor_regions.cc:168 editor_routes.cc:239
+#: mixer_strip.cc:2229 meter_strip.cc:365 route_time_axis.cc:2742
+#: time_axis_view.cc:1110
+msgid "Mute|M"
+msgstr "M"
 
-#: editor_route_groups.cc:102
+#: editor_route_groups.cc:103
 msgid "Sharing Mute?"
-msgstr "Comparte mudo?"
+msgstr "¿Comparte mudo?"
 
-#: editor_route_groups.cc:103
-msgid "solo|S"
-msgstr "solo|S"
+#: editor_route_groups.cc:104 editor_routes.cc:240 mixer_strip.cc:2242
+#: meter_strip.cc:373 route_time_axis.cc:2739 vca_master_strip.cc:211
+#: vca_time_axis.cc:236
+msgid "Solo|S"
+msgstr "S"
 
-#: editor_route_groups.cc:103
+#: editor_route_groups.cc:104
 msgid "Sharing Solo?"
-msgstr "Comparte solo?"
+msgstr "¿Comparte solo?"
 
-#: editor_route_groups.cc:104 midi_time_axis.cc:1622 midi_time_axis.cc:1625
-#: midi_time_axis.cc:1628
+#: editor_route_groups.cc:105 midi_time_axis.cc:1626 midi_time_axis.cc:1629
+#: midi_time_axis.cc:1632
 msgid "Rec"
 msgstr "Grb"
 
-#: editor_route_groups.cc:104
+#: editor_route_groups.cc:105
 msgid "Sharing Record-enable Status?"
-msgstr "Comparte estado de habilitado para grabación?"
+msgstr "¿Comparte estado de habilitado para grabación?"
 
-#: editor_route_groups.cc:105
-msgid "monitoring|Mon"
-msgstr "Monitorización|Mon"
+#: editor_route_groups.cc:106
+msgid "Monitoring|Mon"
+msgstr "Mon"
 
-#: editor_route_groups.cc:105
+#: editor_route_groups.cc:106
 msgid "Sharing Monitoring Choice?"
 msgstr "¿Opción de compartir monitorización?"
 
-#: editor_route_groups.cc:106
-msgid "selection|Sel"
-msgstr "selection/Sel"
+#: editor_route_groups.cc:107
+msgid "Selection|Sel"
+msgstr "Sel"
 
-#: editor_route_groups.cc:106
+#: editor_route_groups.cc:107
 msgid "Sharing Selected/Editing Status?"
 msgstr "Sharing Selected/Editing Status?"
 
-#: editor_route_groups.cc:107
-msgid "active|A"
-msgstr "Activa|A"
+#: editor_route_groups.cc:108 editor_routes.cc:235
+msgid "Active|A"
+msgstr "A"
 
-#: editor_route_groups.cc:107
+#: editor_route_groups.cc:108
 msgid "Sharing Active Status?"
 msgstr "Comparte estado de activo?"
 
-#: editor_export_audio.cc:92 editor_markers.cc:740 editor_markers.cc:827
-#: editor_markers.cc:1012 editor_markers.cc:1030 editor_markers.cc:1048
-#: editor_markers.cc:1067 editor_markers.cc:1086 editor_markers.cc:1116
-#: editor_markers.cc:1147 editor_markers.cc:1177 editor_markers.cc:1205
-#: editor_markers.cc:1236 editor_markers.cc:1261 editor_markers.cc:1312
-#: editor_markers.cc:1356 editor_markers.cc:1382 editor_markers.cc:1576
-#: editor_mouse.cc:2120
+#: editor_export_audio.cc:93 editor_markers.cc:733 editor_markers.cc:832
+#: editor_markers.cc:1045 editor_markers.cc:1063 editor_markers.cc:1081
+#: editor_markers.cc:1100 editor_markers.cc:1119 editor_markers.cc:1149
+#: editor_markers.cc:1180 editor_markers.cc:1210 editor_markers.cc:1238
+#: editor_markers.cc:1269 editor_markers.cc:1294 editor_markers.cc:1345
+#: editor_markers.cc:1458 editor_markers.cc:1484 editor_markers.cc:1678
+#: editor_mouse.cc:2255
 msgid "programming error: marker canvas item has no marker object pointer!"
 msgstr "programming error: marker canvas item has no marker object pointer!"
 
-#: editor_export_audio.cc:145 editor_export_audio.cc:150
-msgid "File Exists!"
-msgstr "¡El fichero existe!"
+#: editor_export_audio.cc:114
+msgid "Confirm MIDI File Overwrite"
+msgstr "Confirmar reescritura de archivo MIDI"
 
-#: editor_export_audio.cc:153
-msgid "Overwrite Existing File"
-msgstr "Sobreescribir archivo existente"
+#: editor_export_audio.cc:115 utils_videotl.cc:75
+msgid "A file with the same name already exists. Do you want to overwrite it?"
+msgstr "Ya existe un archivo con el mismo nombre. ¿Quieres sobreescribirlo?"
 
 #: editor_group_tabs.cc:176
 msgid "Fit to Window"
@@ -4878,132 +5538,165 @@ msgstr "inicio"
 msgid "end"
 msgstr "fin"
 
-#: editor_markers.cc:657 editor_ops.cc:2085 editor_ops.cc:2107
-#: editor_ops.cc:2164 editor_ops.cc:2193 location_ui.cc:1023
+#: editor_markers.cc:645
+msgid "mark"
+msgstr ""
+
+#: editor_markers.cc:650 editor_ops.cc:2164 editor_ops.cc:2186
+#: editor_ops.cc:2304 editor_ops.cc:2341 location_ui.cc:1049
 msgid "add marker"
 msgstr "añadir marca"
 
-#: editor_markers.cc:689 editor_markers.cc:1456
+#: editor_markers.cc:682 editor_markers.cc:1558
 msgid "set loop range"
 msgstr "crear rango de bucle"
 
-#: editor_markers.cc:705 editor_markers.cc:1462
+#: editor_markers.cc:698 editor_markers.cc:1564
 msgid "set punch range"
 msgstr "crear rango de pinchazo"
 
-#: editor_markers.cc:722 editor_ops.cc:4055
+#: editor_markers.cc:715 editor_ops.cc:4159
 msgid "range"
 msgstr "rango"
 
-#: editor_markers.cc:725
+#: editor_markers.cc:718
 msgid "new range marker"
 msgstr "nueva marca de rango"
 
-#: editor_markers.cc:758 editor_ops.cc:2129 location_ui.cc:859
+#: editor_markers.cc:751 editor_ops.cc:2272 location_ui.cc:885
 msgid "remove marker"
 msgstr "eliminar marca"
 
-#: editor_markers.cc:894
+#: editor_markers.cc:899
 msgid "Locate to Here"
 msgstr "Posicionar aquí"
 
-#: editor_markers.cc:895
+#: editor_markers.cc:900
 msgid "Play from Here"
 msgstr "Reproducir desde aquí"
 
-#: editor_markers.cc:896
+#: editor_markers.cc:901
 msgid "Move Mark to Playhead"
 msgstr "Mover marca hasta cursor"
 
-#: editor_markers.cc:900
+#: editor_markers.cc:905
 msgid "Create Range to Next Marker"
 msgstr "Crear rango hasta marca siguiente"
 
 # chequear en contexto
-#: editor_markers.cc:941
+#: editor_markers.cc:946
 msgid "Locate to Marker"
 msgstr "Localizar a marca"
 
-#: editor_markers.cc:942
+#: editor_markers.cc:947
 msgid "Play from Marker"
 msgstr "Reproducir desde marca"
 
-#: editor_markers.cc:945
+#: editor_markers.cc:950
 msgid "Set Marker from Playhead"
 msgstr "Fijar marca en cursor"
 
-#: editor_markers.cc:947
+#: editor_markers.cc:951
 msgid "Set Range from Selection"
 msgstr "Definir rango según selección"
 
-#: editor_markers.cc:957
+#: editor_markers.cc:960
 msgid "Hide Range"
 msgstr "Ocultar rango"
 
-#: editor_markers.cc:958
+#: editor_markers.cc:961
 msgid "Rename Range..."
 msgstr "Renombrar rango..."
 
-#: editor_markers.cc:962
+#: editor_markers.cc:965
 msgid "Remove Range"
 msgstr "Eliminar rango"
 
-#: editor_markers.cc:969
+#: editor_markers.cc:972
 msgid "Separate Regions in Range"
 msgstr "Separar regiones en rango"
 
-#: editor_markers.cc:972
+#: editor_markers.cc:974
 msgid "Select Range"
 msgstr "Seleccionar rango"
 
+#: editor_markers.cc:987
+msgid "Make Ramped"
+msgstr ""
+
+#: editor_markers.cc:989
+msgid "Make Constant"
+msgstr "Hacer constante"
+
+#: editor_markers.cc:993 editor_markers.cc:1013
+msgid "Lock to Music"
+msgstr "Bloquear a música"
+
+#: editor_markers.cc:995 editor_markers.cc:1015
+msgid "Lock to Audio"
+msgstr "Bloquear a audio"
+
 # rango de pinchado? ok?
 # traduzco por pinchazo, no suena muy bien. consultar
-#: editor_markers.cc:1001
+#: editor_markers.cc:1034
 msgid "Set Punch Range"
 msgstr "Crear rango de pinchazo"
 
-#: editor_markers.cc:1407 editor_ops.cc:2040
+#: editor_markers.cc:1391
+msgid "change meter lock style"
+msgstr "cambiar estilo de bloqueo de métrica"
+
+#: editor_markers.cc:1414
+msgid "change tempo lock style"
+msgstr "cambiar estilo de bloqueo de tempo"
+
+#: editor_markers.cc:1441
+msgid "change tempo type"
+msgstr "cambiar tipo de tempo"
+
+#: editor_markers.cc:1509 editor_ops.cc:2119
 msgid "New Name:"
 msgstr "Nuevo Nombre:"
 
-#: editor_markers.cc:1410
+#: editor_markers.cc:1512
 msgid "Rename Mark"
 msgstr "Renombrar marca"
 
-#: editor_markers.cc:1412
+#: editor_markers.cc:1514
 msgid "Rename Range"
 msgstr "Renombrar rango"
 
-#: editor_markers.cc:1419 editor_mouse.cc:2137 processor_box.cc:1994
-#: processor_box.cc:2464 route_time_axis.cc:1100 route_ui.cc:1628
+#: editor_markers.cc:1521 editor_mouse.cc:2272 processor_box.cc:3192
+#: processor_box.cc:3681 route_time_axis.cc:1110 route_ui.cc:1637
+#: vca_master_strip.cc:395
 msgid "Rename"
 msgstr "Renombrar"
 
-#: editor_markers.cc:1432
+#: editor_markers.cc:1534
 msgid "rename marker"
 msgstr "renombrar marca"
 
-#: editor_mixer.cc:90
+#: editor_mixer.cc:98
 msgid "This screen is not tall enough to display the editor mixer"
 msgstr ""
 "Esta pantalla no es lo bastante alta para mostrar el mezclador en la ventana "
 "del Editor"
 
-#: editor_mouse.cc:1223 editor_mouse.cc:1241 editor_tempodisplay.cc:270
+#: editor_mouse.cc:1345 editor_mouse.cc:1363 editor_tempodisplay.cc:384
 msgid ""
 "programming error: tempo marker canvas item has no marker object pointer!"
 msgstr ""
 "programming error: tempo marker canvas item has no marker object pointer!"
 
-#: editor_mouse.cc:1228 editor_tempodisplay.cc:275
+#: editor_mouse.cc:1350 editor_tempodisplay.cc:389
 msgid "programming error: marker for tempo is not a tempo marker!"
 msgstr "programming error: marker for tempo is not a tempo marker!"
 
-#: editor_mouse.cc:1246 editor_tempodisplay.cc:375
+#: editor_mouse.cc:1368 editor_tempodisplay.cc:507
 msgid "programming error: marker for meter is not a meter marker!"
 msgstr "programming error: marker for meter is not a meter marker!"
 
-#: editor_mouse.cc:1885 editor_mouse.cc:1910 editor_mouse.cc:1923
+#: editor_mouse.cc:2016 editor_mouse.cc:2041 editor_mouse.cc:2054
 msgid ""
 "programming error: control point canvas item has no control point object "
 "pointer!"
@@ -5011,175 +5704,183 @@ msgstr ""
 "programming error: control point canvas item has no control point object "
 "pointer!"
 
-#: editor_mouse.cc:2058
+#: editor_mouse.cc:2085
+msgid "edit note(s)"
+msgstr "editar nota(s)"
+
+#: editor_mouse.cc:2193
 msgid "start point trim"
 msgstr "recortar inicio"
 
-#: editor_mouse.cc:2083
-msgid "End point trim"
-msgstr "recortar final"
+#: editor_mouse.cc:2218
+msgid "end point trim"
+msgstr ""
 
-#: editor_mouse.cc:2135
+#: editor_mouse.cc:2270
 msgid "Name for region:"
 msgstr "Nombre de región:"
 
-#: editor_ops.cc:165
+#: editor_ops.cc:168
 msgid "split"
 msgstr "separar"
 
-#: editor_ops.cc:339
+#: editor_ops.cc:342
 msgid "alter selection"
 msgstr "modificar selección"
 
-#: editor_ops.cc:381
+#: editor_ops.cc:384
 msgid "nudge regions forward"
 msgstr "empujar regiones adelante"
 
-#: editor_ops.cc:404 editor_ops.cc:489
+#: editor_ops.cc:441 editor_ops.cc:535
 msgid "nudge location forward"
 msgstr "empujar posición adelante"
 
-#: editor_ops.cc:462
+#: editor_ops.cc:472
 msgid "nudge regions backward"
 msgstr "empujar regiones atrás"
 
-#: editor_ops.cc:551
+#: editor_ops.cc:567
 msgid "nudge forward"
 msgstr "empujar adelante"
 
-#: editor_ops.cc:575
+#: editor_ops.cc:591
 msgid "nudge backward"
 msgstr "empujar atrás"
 
-#: editor_ops.cc:618
+#: editor_ops.cc:656
 msgid "sequence regions"
 msgstr ""
 
-#: editor_ops.cc:694
+#: editor_ops.cc:718
 msgid "build_region_boundary_cache called with snap_type = %1"
 msgstr "build_region_boundary_cache called with snap_type = %1"
 
-#: editor_ops.cc:2042
+#: editor_ops.cc:2121
 msgid "New Location Marker"
 msgstr "Nueva marca de posición"
 
-#: editor_ops.cc:2164
+#: editor_ops.cc:2212 editor_ops.cc:2236
+msgid "Set session start"
+msgstr "Establecer inicio de sesión"
+
+#: editor_ops.cc:2304
 msgid "add markers"
 msgstr "añadir marcas"
 
-#: editor_ops.cc:2274
+#: editor_ops.cc:2400
 msgid "clear markers"
 msgstr "borrar marcas"
 
-#: editor_ops.cc:2289
+#: editor_ops.cc:2415
 msgid "clear ranges"
 msgstr "borrar rangos"
 
-#: editor_ops.cc:2305
+#: editor_ops.cc:2431
 msgid "clear locations"
 msgstr "borrar posiciones"
 
-#: editor_ops.cc:2368
+#: editor_ops.cc:2494
 msgid "insert region"
 msgstr "insertar región"
 
-#: editor_ops.cc:2559
+#: editor_ops.cc:2685
 msgid "raise regions"
 msgstr "levantar regiones"
 
-#: editor_ops.cc:2561
+#: editor_ops.cc:2687
 msgid "raise region"
 msgstr "levantar región"
 
-#: editor_ops.cc:2567
+#: editor_ops.cc:2693
 msgid "raise regions to top"
 msgstr "levantar regiones a capa superior"
 
-#: editor_ops.cc:2569
+#: editor_ops.cc:2695
 msgid "raise region to top"
 msgstr "levantar región a capa superior"
 
-#: editor_ops.cc:2575
+#: editor_ops.cc:2701
 msgid "lower regions"
 msgstr "bajar regiones"
 
-#: editor_ops.cc:2577 editor_ops.cc:2585
+#: editor_ops.cc:2703 editor_ops.cc:2711
 msgid "lower region"
 msgstr "bajar región"
 
-#: editor_ops.cc:2583
+#: editor_ops.cc:2709
 msgid "lower regions to bottom"
 msgstr "bajar regiones a capa inferior"
 
-#: editor_ops.cc:2668
+#: editor_ops.cc:2794
 msgid "Rename Region"
 msgstr "Renombrar región"
 
-#: editor_ops.cc:2670 processor_box.cc:1992 route_ui.cc:1626
+#: editor_ops.cc:2796 processor_box.cc:3190 route_ui.cc:1635
 msgid "New name:"
 msgstr "Nuevo nombre: "
 
-#: editor_ops.cc:2987
+#: editor_ops.cc:3097
 msgid "separate"
 msgstr "separar"
 
-#: editor_ops.cc:3099
+#: editor_ops.cc:3207
 msgid "separate region under"
 msgstr "separar regiones bajo"
 
-#: editor_ops.cc:3220
+#: editor_ops.cc:3360
 msgid "trim to selection"
 msgstr "recortar según selección"
 
-#: editor_ops.cc:3356
+#: editor_ops.cc:3442
 msgid "set sync point"
 msgstr "definir punto de sincronía"
 
-#: editor_ops.cc:3380
+#: editor_ops.cc:3466
 msgid "remove region sync"
 msgstr "eliminar sincronía de región"
 
-#: editor_ops.cc:3402
+#: editor_ops.cc:3488
 msgid "move regions to original position"
 msgstr "mover regiones a posición original"
 
-#: editor_ops.cc:3404
+#: editor_ops.cc:3490
 msgid "move region to original position"
 msgstr "mover región a posición original"
 
-#: editor_ops.cc:3425
+#: editor_ops.cc:3511
 msgid "align selection"
 msgstr "alinear selección"
 
-#: editor_ops.cc:3499
+#: editor_ops.cc:3585
 msgid "align selection (relative)"
 msgstr "alinear selección (relativo)"
 
-#: editor_ops.cc:3533
+#: editor_ops.cc:3619
 msgid "align region"
 msgstr "alinear región"
 
-#: editor_ops.cc:3584
+#: editor_ops.cc:3670
 msgid "trim front"
 msgstr "recortar inicio"
 
-#: editor_ops.cc:3584
+#: editor_ops.cc:3670
 msgid "trim back"
 msgstr "recortar final"
 
-#: editor_ops.cc:3614
+#: editor_ops.cc:3700
 msgid "trim to loop"
 msgstr "recortar a bucle"
 
-#: editor_ops.cc:3624
+#: editor_ops.cc:3710
 msgid "trim to punch"
 msgstr "recortar a pinchazo"
 
-#: editor_ops.cc:3686
+#: editor_ops.cc:3832
 msgid "trim to region"
 msgstr "recortar a región"
 
-#: editor_ops.cc:3794
+#: editor_ops.cc:3891
 msgid ""
 "This track/bus cannot be frozen because the signal adds or loses channels "
 "before reaching the outputs.\n"
@@ -5191,11 +5892,11 @@ msgstr ""
 "Típicamente, esto es causado por plugins que generan salida estéreo desde "
 "entrada mono o viceversa."
 
-#: editor_ops.cc:3797
+#: editor_ops.cc:3894
 msgid "Cannot freeze"
 msgstr "No se puede congelar"
 
-#: editor_ops.cc:3803
+#: editor_ops.cc:3900
 msgid ""
 "<b>%1</b>\n"
 "\n"
@@ -5210,23 +5911,23 @@ msgstr ""
 "\n"
 "Congelarla sólo procesará la señal hasta el primer envío/inserción/retorno."
 
-#: editor_ops.cc:3807
+#: editor_ops.cc:3904
 msgid "Freeze anyway"
 msgstr "Congelar de todas formas"
 
-#: editor_ops.cc:3808
+#: editor_ops.cc:3905
 msgid "Don't freeze"
 msgstr "No congelar"
 
-#: editor_ops.cc:3809
+#: editor_ops.cc:3906
 msgid "Freeze Limits"
 msgstr "Límites de congelado"
 
-#: editor_ops.cc:3824
+#: editor_ops.cc:3921
 msgid "Cancel Freeze"
 msgstr "Cancelar congelado"
 
-#: editor_ops.cc:3854
+#: editor_ops.cc:3952
 msgid ""
 "You can't perform this operation because the processing of the signal will "
 "cause one or more of the tracks to end up with a region with more channels "
@@ -5240,50 +5941,50 @@ msgstr ""
 "\n"
 "Puedes hacer esto sin procesado, lo cual es una operación diferente."
 
-#: editor_ops.cc:3858
+#: editor_ops.cc:3956
 msgid "Cannot bounce"
 msgstr "No se puede rebotar"
 
 # ¿cómo traducir 'bounce'?
 # lo he visto en otros softwares como 'rebotar' pero ¿realmente se utiliza ese término en el español?
 # Creo que es mejor rebotar, aunque suene un poco raro, que dejarlo en bounce.
-#: editor_ops.cc:3869
+#: editor_ops.cc:4007
 msgid "bounce range"
 msgstr "rebotar rango"
 
-#: editor_ops.cc:3971
+#: editor_ops.cc:4074
 msgid "delete"
 msgstr "eliminar"
 
-#: editor_ops.cc:3974
+#: editor_ops.cc:4077
 msgid "cut"
 msgstr "cortar"
 
-#: editor_ops.cc:3977
+#: editor_ops.cc:4080
 msgid "copy"
 msgstr "copiar"
 
-#: editor_ops.cc:3980
+#: editor_ops.cc:4083
 msgid "clear"
 msgstr "limpiar"
 
-#: editor_ops.cc:4028
+#: editor_ops.cc:4132
 msgid "objects"
 msgstr ""
 
-#: editor_ops.cc:4238 editor_ops.cc:4270
+#: editor_ops.cc:4342 editor_ops.cc:4427
 msgid "remove region"
 msgstr "eliminar región"
 
-#: editor_ops.cc:4719
-msgid "duplicate selection"
-msgstr "duplicar selección"
+#: editor_ops.cc:4844
+msgid "duplicate range selection"
+msgstr "duplicar selección de rango"
 
-#: editor_ops.cc:4803
+#: editor_ops.cc:4938
 msgid "nudge track"
 msgstr "empujar pista"
 
-#: editor_ops.cc:4840
+#: editor_ops.cc:4965
 msgid ""
 "Do you really want to destroy the last capture?\n"
 "(This is destructive and cannot be undone)"
@@ -5291,136 +5992,156 @@ msgstr ""
 "¿De verdad quieres borrar la última captura?\n"
 "(Es una acción destructiva que no podrás deshacer)"
 
-#: editor_ops.cc:4843 editor_ops.cc:6838 editor_regions.cc:462
-#: editor_snapshots.cc:159 route_ui.cc:1569
+#: editor_ops.cc:4968 editor_ops.cc:7202 editor_regions.cc:503
+#: editor_snapshots.cc:171
 msgid "No, do nothing."
 msgstr "No, no hagas nada"
 
-#: editor_ops.cc:4844
+#: editor_ops.cc:4969
 msgid "Yes, destroy it."
 msgstr "Sí, eliminar"
 
-#: editor_ops.cc:4846
+#: editor_ops.cc:4971
 msgid "Destroy last capture"
 msgstr "Destruir última captura"
 
-#: editor_ops.cc:4906
+#: editor_ops.cc:5047
 msgid "normalize"
 msgstr "normalizar"
 
-#: editor_ops.cc:5000
+#: editor_ops.cc:5145
 msgid "reverse regions"
 msgstr "al revés"
 
-#: editor_ops.cc:5034
+#: editor_ops.cc:5182
 msgid "strip silence"
 msgstr "quitar silencio"
 
-#: editor_ops.cc:5091
+#: editor_ops.cc:5263
 msgid "Fork Region(s)"
 msgstr "Ramificar región(es)"
 
-#: editor_ops.cc:5112
+#: editor_ops.cc:5270
 msgid "Could not unlink %1"
 msgstr ""
 
-#: editor_ops.cc:5326
+#: editor_ops.cc:5532
 msgid "reset region gain"
 msgstr "restablecer ganancia de región"
 
-#: editor_ops.cc:5379
+#: editor_ops.cc:5590
 msgid "region gain envelope active"
 msgstr "envolvente de ganancia de región activa"
 
-#: editor_ops.cc:5406
+#: editor_ops.cc:5615
 msgid "toggle region lock"
 msgstr "conmutar bloqueo de región"
 
-#: editor_ops.cc:5430
+#: editor_ops.cc:5639
 msgid "Toggle Video Lock"
 msgstr "Bloqueo de video"
 
-#: editor_ops.cc:5454
+#: editor_ops.cc:5663
 msgid "region lock style"
 msgstr "estilo de bloqueo de región"
 
-#: editor_ops.cc:5479
+#: editor_ops.cc:5688
 msgid "change region opacity"
 msgstr "cambiar opacidad de región"
 
-#: editor_ops.cc:5572
+#: editor_ops.cc:5781
 msgid "fade range"
 msgstr "rango de atenuación"
 
-#: editor_ops.cc:5610
+#: editor_ops.cc:5819
 msgid "set fade in length"
 msgstr "definir duración del fundido de entrada"
 
-#: editor_ops.cc:5617
+#: editor_ops.cc:5826
 msgid "set fade out length"
 msgstr "definir duración del fundido de salida"
 
-#: editor_ops.cc:5662
+#: editor_ops.cc:5891
 msgid "set fade in shape"
 msgstr "ajustar curva de fundido de entrada"
 
-#: editor_ops.cc:5693
+#: editor_ops.cc:5926
 msgid "set fade out shape"
 msgstr "ajustar curva de fundido de salida"
 
-#: editor_ops.cc:5723
+#: editor_ops.cc:5962
 msgid "set fade in active"
 msgstr "activar fundido de entrada"
 
-#: editor_ops.cc:5752
+#: editor_ops.cc:5996
 msgid "set fade out active"
 msgstr "activar fundido de salida"
 
-#: editor_ops.cc:5994
+#: editor_ops.cc:6056
+msgid "toggle fade active"
+msgstr "conmutar fundido activo"
+
+#: editor_ops.cc:6249
 msgid "set loop range from selection"
 msgstr "crear rango de bucle desde selección"
 
-#: editor_ops.cc:6008
+#: editor_ops.cc:6263
 msgid "set loop range from region"
 msgstr "crear rango de bucle desde región"
 
-#: editor_ops.cc:6027
+#: editor_ops.cc:6282
 msgid "set punch range from selection"
 msgstr "crear rango de pinchazo desde selección"
 
-#: editor_ops.cc:6041
+#: editor_ops.cc:6306
 msgid "set session start/end from selection"
-msgstr ""
+msgstr "Definir Inicio y Fin de sesión según selección"
+
+#: editor_ops.cc:6344
+msgid "set punch start from EP"
+msgstr "Definir inicio de pinchazo desde EP"
 
-#: editor_ops.cc:6066
+#: editor_ops.cc:6372
+msgid "set punch end from EP"
+msgstr "Definir fin de pinchazo desde EP"
+
+#: editor_ops.cc:6405
+msgid "set loop start from EP"
+msgstr "Definir inicio de bucle desde EP"
+
+#: editor_ops.cc:6433
+msgid "set loop end from EP"
+msgstr "Definir fin de bucle desde EP"
+
+#: editor_ops.cc:6444
 msgid "set punch range from region"
 msgstr "crear rango de pinchazo desde región"
 
-#: editor_ops.cc:6175
+#: editor_ops.cc:6531
 msgid "Add new marker"
 msgstr "Añadir marca nueva"
 
-#: editor_ops.cc:6176
+#: editor_ops.cc:6532
 msgid "Set global tempo"
 msgstr "Definir tempo global"
 
-#: editor_ops.cc:6179
+#: editor_ops.cc:6535
 msgid "Define one bar"
 msgstr "Definir un compás"
 
-#: editor_ops.cc:6180
+#: editor_ops.cc:6536
 msgid "Do you want to set the global tempo or add a new tempo marker?"
 msgstr "¿Quieres definir el tempo global o añadir una nueva marca de tempo?"
 
-#: editor_ops.cc:6206
+#: editor_ops.cc:6562
 msgid "set tempo from region"
 msgstr "definir tempo a partir de región"
 
-#: editor_ops.cc:6236
+#: editor_ops.cc:6591
 msgid "split regions"
 msgstr "separar regiones"
 
-#: editor_ops.cc:6278
+#: editor_ops.cc:6633
 msgid ""
 "You are about to split\n"
 "%1\n"
@@ -5433,11 +6154,11 @@ msgstr ""
 "Esto puede llevar un buen rato."
 
 # ok?
-#: editor_ops.cc:6285
+#: editor_ops.cc:6640
 msgid "Call for the Ferret!"
 msgstr "¡Llamada al Ferret!"
 
-#: editor_ops.cc:6286
+#: editor_ops.cc:6641
 msgid ""
 "Press OK to continue with this split operation\n"
 "or ask the Ferret dialog to tune the analysis"
@@ -5445,52 +6166,52 @@ msgstr ""
 "Pulsa OK para continuar con esta operación de separación\n"
 "o ajusta el análisis en la ventana de Rhythm Ferret"
 
-#: editor_ops.cc:6288
+#: editor_ops.cc:6643
 msgid "Press OK to continue with this split operation"
 msgstr "Pulsa OK para continuar con esta operación de separación"
 
-#: editor_ops.cc:6291
+#: editor_ops.cc:6646
 msgid "Excessive split?"
 msgstr "¿Excesivas divisiones?"
 
-#: editor_ops.cc:6443
+#: editor_ops.cc:6800
 msgid "place transient"
 msgstr "place transient"
 
-#: editor_ops.cc:6478
+#: editor_ops.cc:6834
 msgid "snap regions to grid"
 msgstr "ajustar regiones a rejilla"
 
-#: editor_ops.cc:6517
+#: editor_ops.cc:6873
 msgid "Close Region Gaps"
 msgstr "Cerrar huecos de regiones"
 
-#: editor_ops.cc:6522
+#: editor_ops.cc:6878
 msgid "Crossfade length"
 msgstr "Duración de fundido cruzado"
 
-#: editor_ops.cc:6531 editor_ops.cc:6542 rhythm_ferret.cc:119
-#: session_option_editor.cc:141
+#: editor_ops.cc:6887 editor_ops.cc:6898 rhythm_ferret.cc:128
+#: rhythm_ferret.cc:143 session_option_editor.cc:141
 msgid "ms"
 msgstr "ms"
 
-#: editor_ops.cc:6533
+#: editor_ops.cc:6889
 msgid "Pull-back length"
 msgstr "Duración de pull-back"
 
-#: editor_ops.cc:6546
+#: editor_ops.cc:6902 keyeditor.cc:71
 msgid "Ok"
 msgstr "Ok"
 
-#: editor_ops.cc:6561
+#: editor_ops.cc:6917
 msgid "close region gaps"
 msgstr "cerrar huecos de regiones"
 
-#: editor_ops.cc:6786 route_ui.cc:1543
+#: editor_ops.cc:7160
 msgid "That would be bad news ...."
 msgstr "That would be bad news ...."
 
-#: editor_ops.cc:6791 route_ui.cc:1548
+#: editor_ops.cc:7165
 msgid ""
 "Removing the master or monitor bus is such a bad idea\n"
 "that %1 is not going to allow it.\n"
@@ -5506,24 +6227,19 @@ msgstr ""
 "edita tu archivo ardour.rc para establecer la\n"
 "opción \"allow-special-bus-removal\" a \"yes\""
 
-#: editor_ops.cc:6809
-msgid "tracks"
-msgstr "pistas"
-
-#: editor_ops.cc:6811 route_ui.cc:1992
+#: editor_ops.cc:7181
 msgid "track"
-msgstr "pista"
+msgid_plural "tracks"
+msgstr[0] "pista"
+msgstr[1] "pistas"
 
-# es correcto utilizar 'buses' en español? -> al parecer sí, desde hace poc. Chequear: http://buscon.rae.es/draeI/SrvltObtenerHtml?IDLEMA=12558&NEDIC=Si
-#: editor_ops.cc:6815
-msgid "busses"
-msgstr "buses"
-
-#: editor_ops.cc:6817 route_ui.cc:1992
+#: editor_ops.cc:7182
 msgid "bus"
-msgstr "bus"
+msgid_plural "busses"
+msgstr[0] "bus"
+msgstr[1] "buses"
 
-#: editor_ops.cc:6822
+#: editor_ops.cc:7186
 msgid ""
 "Do you really want to remove %1 %2 and %3 %4?\n"
 "(You may also lose the playlists associated with the %2)\n"
@@ -5532,11 +6248,11 @@ msgid ""
 msgstr ""
 "¿De verdad deseas eliminar %1 %2 y %3 %4?\n"
 "(Puedes perder también las listas de reproducción\n"
-"asociadas con %2)\n"
+"asociadas con la %2)\n"
 "\n"
 "¡Esta acción no se puede deshacer y sobrescribirá el archivo de sesión!"
 
-#: editor_ops.cc:6827
+#: editor_ops.cc:7191
 msgid ""
 "Do you really want to remove %1 %2?\n"
 "(You may also lose the playlists associated with the %2)\n"
@@ -5545,11 +6261,11 @@ msgid ""
 msgstr ""
 "¿De verdad deseas eliminar %1 %2?\n"
 "(Puedes perder también las listas de reproducción\n"
-"asociadas con %2)\n"
+"asociadas con la %2)\n"
 "\n"
 "¡Esta acción no se puede deshacer y sobrescribirá el archivo de sesión!"
 
-#: editor_ops.cc:6833
+#: editor_ops.cc:7197
 msgid ""
 "Do you really want to remove %1 %2?\n"
 "\n"
@@ -5559,139 +6275,140 @@ msgstr ""
 "\n"
 "Esta acción no se puede deshacer y sobrescribirá el archivo de sesión"
 
-#: editor_ops.cc:6840
+#: editor_ops.cc:7204
 msgid "Yes, remove them."
 msgstr "Sí, elimínalas."
 
-#: editor_ops.cc:6842 editor_snapshots.cc:160 route_ui.cc:1570
+#: editor_ops.cc:7206 editor_snapshots.cc:172
 msgid "Yes, remove it."
 msgstr "Sí, elimínala"
 
-#: editor_ops.cc:6847 editor_ops.cc:6849
+#: editor_ops.cc:7211 editor_ops.cc:7213
 msgid "Remove %1"
 msgstr "Eliminar %1"
 
-#: editor_ops.cc:6912
+#: editor_ops.cc:7319 editor_ops.cc:7333 editor_ops.cc:7373 editor_ops.cc:7383
 msgid "insert time"
 msgstr "insertar tiempo"
 
-#: editor_ops.cc:7076
+#: editor_ops.cc:7436
+msgid "Cannot insert or delete time when in Lock edit."
+msgstr ""
+
+#: editor_ops.cc:7456 editor_ops.cc:7468 editor_ops.cc:7541 editor_ops.cc:7554
+msgid "remove time"
+msgstr "eliminar tiempo"
+
+#: editor_ops.cc:7628
 msgid "There are too many tracks to fit in the current window"
 msgstr "Hay demasiadas pistas para encajar en la ventana actual"
 
-#: editor_ops.cc:7137
+#: editor_ops.cc:7689
 msgid "Sel"
 msgstr ""
 
-#: editor_ops.cc:7176
+#: editor_ops.cc:7728
 #, c-format
 msgid "Saved view %u"
 msgstr "Vista %u guardada"
 
-#: editor_ops.cc:7201
+#: editor_ops.cc:7753
 msgid "mute regions"
 msgstr "enmudecer regiones"
 
-#: editor_ops.cc:7203
+#: editor_ops.cc:7755
 msgid "mute region"
 msgstr "enmudecer región"
 
-#: editor_ops.cc:7240
+#: editor_ops.cc:7792
 msgid "combine regions"
 msgstr "combinar regiones"
 
-#: editor_ops.cc:7278
+#: editor_ops.cc:7830
 msgid "uncombine regions"
 msgstr "Descombinar regiones"
 
-#: editor_ops.cc:7315
+#: editor_ops.cc:7867
 msgid "%1: Locked"
-msgstr ""
+msgstr "%1: Bloqueado"
 
-#: editor_ops.cc:7322
+#: editor_ops.cc:7874
 msgid "Click to unlock"
-msgstr ""
+msgstr "Pulsa para desbloquear"
 
-#: editor_ops.cc:7376
+#: editor_ops.cc:7923
 msgid "Moving embedded files into session folder"
 msgstr ""
 
-#: editor_regions.cc:112
+#: editor_regions.cc:159
 msgid "Region name, with number of channels in []'s"
-msgstr "Region name, with number of channels in []'s"
+msgstr "Nombre de región, con número de canales en []"
 
-#: editor_regions.cc:113
+#: editor_regions.cc:160
 msgid "Position of start of region"
 msgstr "Posición de inicio de región"
 
-#: editor_regions.cc:114 editor_regions.cc:851 time_info_box.cc:101
+#: editor_regions.cc:161 editor_regions.cc:935 time_info_box.cc:95
 msgid "End"
 msgstr "Fin"
 
-#: editor_regions.cc:114
+#: editor_regions.cc:161
 msgid "Position of end of region"
 msgstr "Posición de fin de región"
 
-#: editor_regions.cc:115
+#: editor_regions.cc:162
 msgid "Length of the region"
 msgstr "Duración de la región"
 
-#: editor_regions.cc:116
+#: editor_regions.cc:163
 msgid "Position of region sync point, relative to start of the region"
 msgstr "Position of region sync point, relative to start of the region"
 
-#: editor_regions.cc:117
+#: editor_regions.cc:164
 msgid "Length of region fade-in (units: secondary clock), () if disabled"
 msgstr "Length of region fade-in (units: secondary clock), () if disabled"
 
-#: editor_regions.cc:118
+#: editor_regions.cc:165
 msgid "Length of region fade-out (units: secondary clock), () if disabled"
 msgstr ""
 
-#: editor_regions.cc:119 mixer_strip.cc:2055 mono_panner.cc:203
-#: panner2d.cc:240 stereo_panner.cc:251 stereo_panner.cc:274
-msgid "L"
-msgstr "L"
+#: editor_regions.cc:166
+msgid "Lock|L"
+msgstr "B"
 
-#: editor_regions.cc:119
+#: editor_regions.cc:166
 msgid "Region position locked?"
 msgstr "¿Posición de región bloqueada?"
 
-#: editor_regions.cc:120 route_time_axis.cc:103
-msgid "G"
+#: editor_regions.cc:167
+msgid "Gain|G"
 msgstr "G"
 
-#: editor_regions.cc:120
+#: editor_regions.cc:167
 msgid "Region position glued to Bars|Beats time?"
-msgstr "Region position glued to Bars|Beats time?"
-
-#: editor_regions.cc:121 editor_routes.cc:211 gain_meter.cc:793
-#: mixer_strip.cc:2032 meter_strip.cc:359 panner_ui.cc:603
-#: route_time_axis.cc:2713 stereo_panner.cc:271 time_axis_view.cc:1190
-msgid "M"
-msgstr "M"
+msgstr ""
 
-#: editor_regions.cc:121
+#: editor_regions.cc:168
 msgid "Region muted?"
 msgstr "¿Región silenciada?"
 
-#: editor_regions.cc:122 mixer_strip.cc:1855
-msgid "O"
+#: editor_regions.cc:169
+msgid "Opaque|O"
 msgstr "O"
 
-#: editor_regions.cc:122
+#: editor_regions.cc:169
 msgid "Region opaque (blocks regions below it from being heard)?"
 msgstr "Región opaca (provoca que las regiones inferiores no se escuchen)"
 
-#: editor_regions.cc:311 editor_regions.cc:316 editor_regions.cc:318
+#: editor_regions.cc:360 editor_regions.cc:365 editor_regions.cc:367
 msgid "Hidden"
 msgstr "Oculto"
 
-#: editor_regions.cc:391
+#: editor_regions.cc:432
 msgid "(MISSING) "
 msgstr "(AUSENTE) "
 
-#: editor_regions.cc:459
+#: editor_regions.cc:500
 msgid ""
 "Do you really want to remove unused regions?\n"
 "(This is destructive and cannot be undone)"
@@ -5699,179 +6416,187 @@ msgstr ""
 "¿De verdad quieres borrar las regiones no usadas?\n"
 "(Es una acción destructiva que no podrás deshacer)"
 
-#: editor_regions.cc:463
+#: editor_regions.cc:504
 msgid "Yes, remove."
 msgstr "Sí, eliminar."
 
-#: editor_regions.cc:465
+#: editor_regions.cc:506
 msgid "Remove unused regions"
 msgstr "Eliminar regiones no usadas"
 
-#: editor_regions.cc:818 editor_regions.cc:832 editor_regions.cc:846
+#: editor_regions.cc:735
+msgid "EditorRegions::format_position: negative timecode position: %1"
+msgstr ""
+
+#: editor_regions.cc:900 editor_regions.cc:916 editor_regions.cc:930
 msgid "Mult."
 msgstr "Mult."
 
-#: editor_regions.cc:849 midi_list_editor.cc:104 time_info_box.cc:94
+#: editor_regions.cc:933 midi_list_editor.cc:104 time_info_box.cc:88
 msgid "Start"
 msgstr "Inicio"
 
-#: editor_regions.cc:867 editor_regions.cc:883
+#: editor_regions.cc:951 editor_regions.cc:967
 msgid "Multiple"
 msgstr "Múltiple"
 
-#: editor_regions.cc:952
+#: editor_regions.cc:1036
 msgid "MISSING "
 msgstr "AUSENTE "
 
-#: editor_routes.cc:182 editor_routes.cc:214
+#: editor_routes.cc:126
+msgid "RS"
+msgstr "RS"
+
+#: editor_routes.cc:208
 msgid "SS"
 msgstr "SS"
 
-#: editor_routes.cc:206
+#: editor_routes.cc:233
 msgid "Track/Bus Name"
 msgstr "Nombre de Pista/Bus"
 
-#: editor_routes.cc:207
+#: editor_routes.cc:234
 msgid "Track/Bus visible ?"
 msgstr "¿Pista/Bus visible?"
 
-#: editor_routes.cc:208 mixer_strip.cc:2046 meter_strip.cc:371
-#: route_time_axis.cc:105 route_time_axis.cc:2701
-msgid "A"
-msgstr "A"
-
-#: editor_routes.cc:208
+#: editor_routes.cc:235
 msgid "Track/Bus active ?"
 msgstr "¿Pista/Bus activa/o?"
 
-#: editor_routes.cc:209 mixer_strip.cc:2033 mixer_strip.cc:2054
-#: meter_strip.cc:379
-msgid "I"
+#: editor_routes.cc:236
+msgid "MidiInput|I"
 msgstr "I"
 
-#: editor_routes.cc:209
+#: editor_routes.cc:236
 msgid "MIDI input enabled"
 msgstr "Entrada MIDI habilitada"
 
-#: editor_routes.cc:210 mono_panner.cc:220 panner2d.cc:241
-#: stereo_panner.cc:249 stereo_panner.cc:276
-msgid "R"
+#: editor_routes.cc:237
+msgid "Rec|R"
 msgstr "R"
 
-#: editor_routes.cc:210
+#: editor_routes.cc:237
 msgid "Record enabled"
 msgstr "Grabación habilitada"
 
-#: editor_routes.cc:211
+#: editor_routes.cc:238
+msgid "Rec|RS"
+msgstr "RS"
+
+#: editor_routes.cc:238
+msgid "Record Safe"
+msgstr ""
+
+#: editor_routes.cc:239
 msgid "Muted"
 msgstr "En mudo"
 
-#: editor_routes.cc:212 mixer_strip.cc:2042 meter_strip.cc:367
-#: route_time_axis.cc:2710
-msgid "S"
-msgstr "S"
-
-#: editor_routes.cc:212
+#: editor_routes.cc:240
 msgid "Soloed"
 msgstr "En solo"
 
-#: editor_routes.cc:213
-msgid "SI"
+#: editor_routes.cc:241
+msgid "SoloIso|SI"
 msgstr "SI"
 
-#: editor_routes.cc:213
+#: editor_routes.cc:241
 msgid "Solo Isolated"
 msgstr "Solo aislado"
 
-#: editor_routes.cc:214
+#: editor_routes.cc:242
+msgid "SoloLock|SS"
+msgstr "SS"
+
+#: editor_routes.cc:242
 msgid "Solo Safe (Locked)"
 msgstr "Solo seguro (bloqueado)"
 
-#: editor_routes.cc:477 mixer_ui.cc:1197
+#: editor_routes.cc:550 mixer_ui.cc:1498
 msgid "Hide All"
 msgstr "Ocultar todo"
 
-#: editor_routes.cc:478 mixer_ui.cc:1198
+#: editor_routes.cc:551 mixer_ui.cc:1499
 msgid "Show All Audio Tracks"
 msgstr "Mostrar todas las pistas de audio"
 
-#: editor_routes.cc:479 mixer_ui.cc:1199
+#: editor_routes.cc:552 mixer_ui.cc:1500
 msgid "Hide All Audio Tracks"
 msgstr "Ocultar todas las pistas de audio"
 
-#: editor_routes.cc:480 mixer_ui.cc:1200
+#: editor_routes.cc:553 mixer_ui.cc:1501
 msgid "Show All Audio Busses"
 msgstr "Mostrar todos los buses de audio"
 
-#: editor_routes.cc:481 mixer_ui.cc:1201
+#: editor_routes.cc:554 mixer_ui.cc:1502
 msgid "Hide All Audio Busses"
 msgstr "Ocultar todos los buses de audio"
 
-#: editor_routes.cc:482
+#: editor_routes.cc:555 mixer_ui.cc:1503
 msgid "Show All Midi Tracks"
 msgstr "Mostrar todas las pistas MIDI"
 
-#: editor_routes.cc:483
+#: editor_routes.cc:556 mixer_ui.cc:1504
 msgid "Hide All Midi Tracks"
 msgstr "Ocultar todas las pistas MIDI"
 
-#: editor_routes.cc:484
-msgid "Show Tracks With Regions Under Playhead"
-msgstr "Mostrar pistas con regiones bajo cursor"
+#: editor_routes.cc:557
+msgid "Only Show Tracks with Regions Under Playhead"
+msgstr "Mostrar sólo las pistas con regiones bajo el cursor"
 
-#: editor_rulers.cc:211
+#: editor_rulers.cc:212
 msgid "New location marker"
 msgstr "Nueva marca de posición"
 
-#: editor_rulers.cc:212
+#: editor_rulers.cc:213
 msgid "Clear all locations"
 msgstr "Limpiar todas las posiciones"
 
-#: editor_rulers.cc:213
+#: editor_rulers.cc:214
 msgid "Unhide locations"
 msgstr "Mostrar posiciones"
 
-#: editor_rulers.cc:217
+#: editor_rulers.cc:218
 msgid "New range"
 msgstr "Nuevo rango"
 
-#: editor_rulers.cc:218
+#: editor_rulers.cc:219
 msgid "Clear all ranges"
 msgstr "Limpiar todos los rangos"
 
-#: editor_rulers.cc:219
+#: editor_rulers.cc:220
 msgid "Unhide ranges"
 msgstr "Mostrar rangos"
 
 #: editor_rulers.cc:224
-msgid "Make Loop range"
-msgstr "Crear rango de bucle"
+msgid "New Loop range"
+msgstr "Nuevo rango de bucle"
 
 #: editor_rulers.cc:225
-msgid "Make Punch range"
-msgstr "Crear rango de pinchazo"
+msgid "New Punch range"
+msgstr "Nuevo rango de pinchazo"
 
 #: editor_rulers.cc:230
 msgid "New CD track marker"
 msgstr "Nueva marca de pista de CD"
 
-#: editor_rulers.cc:235 tempo_dialog.cc:38
+#: editor_rulers.cc:234 tempo_dialog.cc:38
 msgid "New Tempo"
 msgstr "Nuevo tempo"
 
-#: editor_rulers.cc:239 tempo_dialog.cc:296
+#: editor_rulers.cc:238 tempo_dialog.cc:419
 msgid "New Meter"
 msgstr "Nueva métrica"
 
-#: editor_snapshots.cc:137
+#: editor_snapshots.cc:149
 msgid "Rename Snapshot"
 msgstr "Renombrar captura de sesión"
 
-#: editor_snapshots.cc:139
+#: editor_snapshots.cc:151
 msgid "New name of snapshot"
 msgstr "Nuevo nombre de captura"
 
-#: editor_snapshots.cc:157
+#: editor_snapshots.cc:169
 msgid ""
 "Do you really want to remove snapshot \"%1\" ?\n"
 "(which cannot be undone)"
@@ -5879,35 +6604,39 @@ msgstr ""
 "¿De verdad deseas eliminar la captura \"%1\" ?\n"
 "(no podrás deshacer esta acción)"
 
-#: editor_snapshots.cc:162
+#: editor_snapshots.cc:174
 msgid "Remove snapshot"
 msgstr "Eliminar captura de sesión"
 
-#: editor_tempodisplay.cc:194 editor_tempodisplay.cc:234
-msgid "add"
-msgstr "añadir"
-
-#: editor_tempodisplay.cc:215
+#: editor_tempodisplay.cc:318
 msgid "add tempo mark"
 msgstr "añadir marca de tempo"
 
-#: editor_tempodisplay.cc:254
+#: editor_tempodisplay.cc:343
+msgid "add"
+msgstr "añadir"
+
+#: editor_tempodisplay.cc:362
 msgid "add meter mark"
 msgstr "añadir marca de métrica"
 
-#: editor_tempodisplay.cc:287 editor_tempodisplay.cc:315
+#: editor_tempodisplay.cc:401 editor_tempodisplay.cc:435
 msgid "done"
 msgstr "listo"
 
-#: editor_tempodisplay.cc:304 editor_tempodisplay.cc:330
+#: editor_tempodisplay.cc:422
+msgid "replace meter mark"
+msgstr "reemplazar marca de métrica"
+
+#: editor_tempodisplay.cc:454
 msgid "replace tempo mark"
 msgstr "reemplazar marca de tempo"
 
-#: editor_tempodisplay.cc:353 editor_tempodisplay.cc:387
+#: editor_tempodisplay.cc:485 editor_tempodisplay.cc:519
 msgid "remove tempo mark"
 msgstr "eliminar marca de tempo"
 
-#: editor_tempodisplay.cc:370
+#: editor_tempodisplay.cc:502
 msgid ""
 "programming error: meter marker canvas item has no marker object pointer!"
 msgstr ""
@@ -5917,54 +6646,62 @@ msgstr ""
 msgid "stretch/shrink"
 msgstr "estirar/contraer"
 
-#: editor_timefx.cc:129
+#: editor_timefx.cc:130
 msgid "pitch shift"
 msgstr "cambiar tono"
 
-#: editor_timefx.cc:301
+#: editor_timefx.cc:282
 msgid "timefx cannot be started - thread creation error"
 msgstr "timefx cannot be started - thread creation error"
 
-#: engine_dialog.cc:83
+#: engine_dialog.cc:86
 msgid "Device Control Panel"
 msgstr ""
 
-#: engine_dialog.cc:84
+#: engine_dialog.cc:87
 msgid "Midi Device Setup"
 msgstr "Configurar dispositivo MIDI"
 
-#: engine_dialog.cc:85 engine_dialog.cc:2097
+#: engine_dialog.cc:89
+msgid "Refresh Devices"
+msgstr ""
+
+#: engine_dialog.cc:90
+msgid "Use Buffered I/O"
+msgstr ""
+
+#: engine_dialog.cc:91 engine_dialog.cc:3000
 msgid "Measure"
 msgstr "Medir"
 
-#: engine_dialog.cc:86
+#: engine_dialog.cc:92
 msgid "Use results"
 msgstr "Usar resultados"
 
-#: engine_dialog.cc:87
+#: engine_dialog.cc:93
 msgid "Back to settings ... (ignore results)"
 msgstr "Volver a configuración (ignorar resultados)"
 
-#: engine_dialog.cc:88
+#: engine_dialog.cc:94
 msgid "Calibrate Audio"
 msgstr "Calibrar audio"
 
-#: engine_dialog.cc:92
+#: engine_dialog.cc:98
 msgid "Back to settings"
 msgstr "Volver a configuración"
 
-#: engine_dialog.cc:111
+#: engine_dialog.cc:120
 msgid ""
 "No audio/MIDI backends detected. %1 cannot run\n"
 "\n"
 "(This is a build/packaging/system error. It should never happen.)"
 msgstr ""
 
-#: engine_dialog.cc:137
+#: engine_dialog.cc:145
 msgid "Latency Measurement Tool"
 msgstr "Herramienta de medición de latencia"
 
-#: engine_dialog.cc:149
+#: engine_dialog.cc:157
 msgid ""
 "<span weight=\"bold\">Turn down the volume on your audio equipment to a very "
 "low level.</span>"
@@ -5972,89 +6709,98 @@ msgstr ""
 "<span weight=\"bold\">Disminuye el volumen de tu equipo de audio hasta un "
 "nivel muy bajo.</span>"
 
-#: engine_dialog.cc:158
+#: engine_dialog.cc:166
 msgid "Select two channels below and connect them using a cable."
 msgstr "Selecciona dos canales y conéctalos por medio de un cable"
 
-#: engine_dialog.cc:163
+#: engine_dialog.cc:171
 msgid "Output channel"
 msgstr "Canal de salida"
 
-#: engine_dialog.cc:171
+#: engine_dialog.cc:179
 msgid "Input channel"
 msgstr "Canal de entrada"
 
-#: engine_dialog.cc:206
+#: engine_dialog.cc:213
 msgid "Once the channels are connected, click the \"Measure\" button."
 msgstr "Cuando hayas conectado los canales, pulsa el botón \"Medir\"."
 
-#: engine_dialog.cc:213
+#: engine_dialog.cc:220
 msgid "When satisfied with the results, click the \"Use results\" button."
 msgstr ""
 "Si estás conforme con los resultados, pulsa el botón \"Usar resultados\"."
 
-#: engine_dialog.cc:228 engine_dialog.cc:2217 engine_dialog.cc:2227
+#: engine_dialog.cc:235 engine_dialog.cc:3138 engine_dialog.cc:3148
 msgid "No measurement results yet"
 msgstr "Aún no hay resultados de la medición"
 
-#: engine_dialog.cc:238 route_params_ui.cc:106
+#: engine_dialog.cc:245 route_params_ui.cc:106
 msgid "Latency"
 msgstr "Latencia"
 
-#: engine_dialog.cc:372
+#: engine_dialog.cc:520
 msgid "Audio System:"
 msgstr "Sistema de audio:"
 
-#: engine_dialog.cc:409
+#: engine_dialog.cc:564
 msgid "Driver:"
 msgstr "Driver:"
 
-#: engine_dialog.cc:415
+#: engine_dialog.cc:571
+msgid "Input Device:"
+msgstr "Dispositivo de Entrada:"
+
+#: engine_dialog.cc:575
+msgid "Output Device:"
+msgstr "Dispositivo de salida:"
+
+#: engine_dialog.cc:582
 msgid "Device:"
 msgstr "Dispositivo:"
 
-#: engine_dialog.cc:420 engine_dialog.cc:519 sfdb_ui.cc:153 sfdb_ui.cc:348
-#: sfdb_ui.cc:353
+#: engine_dialog.cc:591 engine_dialog.cc:699 export_report.cc:164
+#: export_report.cc:328 sfdb_ui.cc:153 sfdb_ui.cc:348 sfdb_ui.cc:353
 msgid "Sample rate:"
 msgstr "Frec. de muestreo:"
 
-#: engine_dialog.cc:426 engine_dialog.cc:526
+#: engine_dialog.cc:597 engine_dialog.cc:706
 msgid "Buffer size:"
 msgstr "Tamaño del buffer:"
 
-#: engine_dialog.cc:444
+#: engine_dialog.cc:606
+msgid "Periods:"
+msgstr "Periodos:"
+
+#: engine_dialog.cc:624
 msgid "Input Channels:"
 msgstr "Canales de entrada:"
 
-#: engine_dialog.cc:457
+#: engine_dialog.cc:637
 msgid "Output Channels:"
 msgstr "Canales de salida:"
 
-#: engine_dialog.cc:469
+#: engine_dialog.cc:649
 msgid "Hardware input latency:"
 msgstr "Latencia de entrada del hardware:"
 
-#: engine_dialog.cc:472 engine_dialog.cc:485
+#: engine_dialog.cc:652 engine_dialog.cc:665
 msgid "samples"
 msgstr "muestras"
 
-#: engine_dialog.cc:482
+#: engine_dialog.cc:662
 msgid "Hardware output latency:"
 msgstr "Latencia de salida del hardware:"
 
-#: engine_dialog.cc:493
+#: engine_dialog.cc:673
 msgid "MIDI System:"
-msgstr ""
+msgstr "Sistema MIDI:"
 
-#: engine_dialog.cc:511
+#: engine_dialog.cc:691
 msgid ""
-"The %1 audio backend was configured and started externally.\n"
-"This limits your control over it."
+"%1 is already running. %2 will connect to it and use the existing settings."
 msgstr ""
-"El backend de audio de %1 se ha configurado y arrancado externamente.\n"
-"Esto limita el control que tienes sobre éste."
 
-#: engine_dialog.cc:564
+#: engine_dialog.cc:744
 msgid ""
 "Failed to start or connect to audio-engine.\n"
 "\n"
@@ -6064,7 +6810,7 @@ msgstr ""
 "\n"
 "La calibración de latencia requiere una interfaz de audio operativa."
 
-#: engine_dialog.cc:570
+#: engine_dialog.cc:750
 msgid ""
 "Your selected audio configuration is playback- or capture-only.\n"
 "\n"
@@ -6074,193 +6820,226 @@ msgstr ""
 "\n"
 "La calibración de latencia requiere ambas reproducción y captura"
 
-#: engine_dialog.cc:651
+#: engine_dialog.cc:965
 msgid "MIDI Devices"
 msgstr "Dispositivos MIDI"
 
-#: engine_dialog.cc:657
+#: engine_dialog.cc:971
 msgid "Device"
 msgstr "Dispositivo"
 
-#: engine_dialog.cc:659
+#: engine_dialog.cc:973
 msgid "Hardware Latencies"
 msgstr "Latencias de hardware"
 
-#: engine_dialog.cc:700
+#: engine_dialog.cc:1014
 msgid "Calibrate"
 msgstr "Calibrar"
 
-#: engine_dialog.cc:800
+#: engine_dialog.cc:1117
 msgid "all available channels"
 msgstr "Todos los canales disponibles"
 
-#: engine_dialog.cc:1039 latency_gui.cc:39
-#, fuzzy
-msgid "sample"
-msgid_plural "samples"
-msgstr[0] "muestra"
-msgstr[1] "muestra"
+#: engine_dialog.cc:1599 latency_gui.cc:55
+msgid "%1 sample"
+msgid_plural "%1 samples"
+msgstr[0] "%1 muestra"
+msgstr[1] "%1 muestras"
 
-#: engine_dialog.cc:1090
+#: engine_dialog.cc:1662
 #, c-format
 msgid "(%.1f ms)"
 msgstr ""
 
-#: engine_dialog.cc:1593
+#: engine_dialog.cc:2413
 msgid "Could not start backend engine %1"
 msgstr ""
 
-#: engine_dialog.cc:1644
+#: engine_dialog.cc:2445
 msgid "Cannot set driver to %1"
 msgstr ""
 
-#: engine_dialog.cc:1648
+#: engine_dialog.cc:2450
+msgid "Cannot set input device name to %1"
+msgstr "No se pudo establecer el nombre de dispositivo de entrada a %1"
+
+#: engine_dialog.cc:2454
+msgid "Cannot set output device name to %1"
+msgstr "No se pudo establecer el nombre de dispositivo de salida a %1"
+
+#: engine_dialog.cc:2459
 msgid "Cannot set device name to %1"
 msgstr ""
 
-#: engine_dialog.cc:1652
+#: engine_dialog.cc:2464
 msgid "Cannot set sample rate to %1"
 msgstr ""
 
-#: engine_dialog.cc:1656
+#: engine_dialog.cc:2468
 msgid "Cannot set buffer size to %1"
 msgstr ""
 
-#: engine_dialog.cc:1662
+#: engine_dialog.cc:2472
+msgid "Cannot set periods to %1"
+msgstr "No se pudieron establecer los periodos a %1"
+
+#: engine_dialog.cc:2478
 msgid "Cannot set input channels to %1"
 msgstr ""
 
-#: engine_dialog.cc:1666
+#: engine_dialog.cc:2482
 msgid "Cannot set output channels to %1"
 msgstr ""
 
-#: engine_dialog.cc:1672
+#: engine_dialog.cc:2488
 msgid "Cannot set input latency to %1"
 msgstr ""
 
-#: engine_dialog.cc:1676
+#: engine_dialog.cc:2492
 msgid "Cannot set output latency to %1"
 msgstr ""
 
-#: engine_dialog.cc:1955 engine_dialog.cc:2014
+#: engine_dialog.cc:2851 engine_dialog.cc:2917
 msgid "No signal detected "
 msgstr ""
 
-#: engine_dialog.cc:1968 engine_dialog.cc:2022 port_insert_ui.cc:70
+#: engine_dialog.cc:2858
+msgid ""
+"Input signal is > -3dBFS. Lower the signal level (output gain, input gain) "
+"on the audio-interface."
+msgstr ""
+
+#: engine_dialog.cc:2871 engine_dialog.cc:2925 port_insert_ui.cc:70
 #: port_insert_ui.cc:98
 msgid "Disconnected from audio engine"
 msgstr "Desconectado del motor de audio"
 
-#: engine_dialog.cc:1977 engine_dialog.cc:2030
+#: engine_dialog.cc:2880 engine_dialog.cc:2933
 msgid "Detected roundtrip latency: "
 msgstr ""
 
-#: engine_dialog.cc:1979 engine_dialog.cc:2032
+#: engine_dialog.cc:2882 engine_dialog.cc:2935
 msgid "Systemic latency: "
 msgstr ""
 
-#: engine_dialog.cc:1986
+#: engine_dialog.cc:2889
 msgid "(signal detection error)"
 msgstr ""
 
-#: engine_dialog.cc:1992
+#: engine_dialog.cc:2895
 msgid "(inverted - bad wiring)"
 msgstr ""
 
-#: engine_dialog.cc:2039
+#: engine_dialog.cc:2942
 msgid "(averaging)"
 msgstr ""
 
-#: engine_dialog.cc:2045
+#: engine_dialog.cc:2948
 msgid "(too large jitter)"
 msgstr ""
 
-#: engine_dialog.cc:2049
+#: engine_dialog.cc:2952
 msgid "(large jitter)"
 msgstr ""
 
-#: engine_dialog.cc:2061
+#: engine_dialog.cc:2964
 msgid "Timeout - large MIDI jitter."
 msgstr ""
 
-#: engine_dialog.cc:2077 port_insert_ui.cc:134
+#: engine_dialog.cc:2980 port_insert_ui.cc:134
 msgid "Detecting ..."
 msgstr "Detectando..."
 
-#: engine_dialog.cc:2171
+#: engine_dialog.cc:3081
 msgid "Disconnect from %1"
 msgstr ""
 
-#: engine_dialog.cc:2175 mixer_strip.cc:1522 route_group_dialog.cc:45
-#: route_time_axis.cc:841
-msgid "Active"
-msgstr "Activo"
+#: engine_dialog.cc:3086
+msgid "Running"
+msgstr ""
 
-#: engine_dialog.cc:2185
+#: engine_dialog.cc:3088
+msgid "Connected"
+msgstr "Conectado"
+
+#: engine_dialog.cc:3099
 msgid "Connect to %1"
 msgstr ""
 
-#: engine_dialog.cc:2190
-msgid "Inactive"
-msgstr "Inactivo"
+#: engine_dialog.cc:3103 shuttle_control.cc:663
+msgid "Stopped"
+msgstr "Parado"
 
-#: export_channel_selector.cc:45 sfdb_ui.cc:151
+#: export_channel_selector.cc:46 export_report.cc:159 export_report.cc:324
+#: sfdb_ui.cc:151
 msgid "Channels:"
 msgstr "Canales:"
 
-#: export_channel_selector.cc:46
+#: export_channel_selector.cc:47
 msgid "Split to mono files"
 msgstr "Dividir a archivos mono"
 
-#: export_channel_selector.cc:182
+#: export_channel_selector.cc:197
 msgid "Bus or Track"
 msgstr "Bus o pista"
 
-#: export_channel_selector.cc:459
+#: export_channel_selector.cc:474
 msgid "Region contents without fades nor region gain (channels: %1)"
 msgstr "Contenidos de región sin fundidos ni ganancia de región (canales: %1)"
 
-#: export_channel_selector.cc:463
+#: export_channel_selector.cc:478
 msgid "Region contents with fades and region gain (channels: %1)"
 msgstr "Contenidos de región con fundidos y ganancia de región (canales: %1)"
 
-#: export_channel_selector.cc:467
+#: export_channel_selector.cc:482
 msgid "Track output (channels: %1)"
 msgstr "Salida de pista (canales: %1)"
 
-#: export_channel_selector.cc:536
-msgid "Export region contents"
+#: export_channel_selector.cc:552
+msgid "Apply track/bus processing"
 msgstr ""
 
-#: export_channel_selector.cc:537
-msgid "Export track output"
-msgstr ""
+#: export_channel_selector.cc:553
+msgid "Select all tracks"
+msgstr "Seleccionar todas las pistas"
+
+#: export_channel_selector.cc:554
+msgid "Select all busses"
+msgstr "Seleccionar todos los buses"
+
+#: export_channel_selector.cc:555
+msgid "Deselect all"
+msgstr "Deseleccionar todo"
+
+#: export_channel_selector.cc:589
+msgid "Track name"
+msgstr "Nombre de pista"
 
-#: export_dialog.cc:46
+#: export_dialog.cc:49
 msgid ""
 "<span color=\"#ffa755\">Some already existing files will be overwritten.</"
 "span>"
 msgstr ""
 "<span color=\"#ffa755\">Algunos archivos existentes se sobrescribirán</span>"
 
-#: export_dialog.cc:47
+#: export_dialog.cc:50
 msgid "List files"
 msgstr "Listar archivos"
 
-#: export_dialog.cc:158 export_format_dialog.cc:59
+#: export_dialog.cc:163 export_format_dialog.cc:67
 msgid "File format"
 msgstr "Formato de archivo"
 
-#: export_dialog.cc:159 export_timespan_selector.cc:374
-#: export_timespan_selector.cc:436
+#: export_dialog.cc:164 export_timespan_selector.cc:411
+#: export_timespan_selector.cc:502
 msgid "Time Span"
 msgstr "Intervalos"
 
-#: export_dialog.cc:160
+#: export_dialog.cc:165
 msgid "Channels"
 msgstr "Canales"
 
-#: export_dialog.cc:182
+#: export_dialog.cc:187
 msgid ""
 "Export has been aborted due to an error!\n"
 "See the Log for details."
@@ -6268,39 +7047,55 @@ msgstr ""
 "¡La exportación se ha estropeado debido a un error!\n"
 "Para más información ver el log."
 
-#: export_dialog.cc:251
+#: export_dialog.cc:298
 msgid "Files that will be overwritten"
 msgstr "Archivos que se sobrescribirán"
 
-#: export_dialog.cc:296
+#: export_dialog.cc:343
 msgid "Export initialization failed: %1"
 msgstr ""
 
-#: export_dialog.cc:306
+#: export_dialog.cc:353
 msgid "Stop Export"
 msgstr "Cancelar Exportación"
 
-#: export_dialog.cc:327
+#: export_dialog.cc:383
 msgid "export"
 msgstr "exportar"
 
-#: export_dialog.cc:346
+#: export_dialog.cc:402
+msgid "Exporting '%3' (timespan %1 of %2)"
+msgstr "Exportando '%3' (timespan %1 de %2)"
+
+#: export_dialog.cc:407
 msgid "Normalizing '%3' (timespan %1 of %2)"
 msgstr "Normalizando '%3' (timespan %1 de %2)"
 
-#: export_dialog.cc:350
-msgid "Exporting '%3' (timespan %1 of %2)"
-msgstr "Exportando '%3' (timespan %1 de %2)"
+#: export_dialog.cc:412
+msgid "Encoding '%3' (timespan %1 of %2)"
+msgstr "Codificando '%3' (timespan %1 de %2)"
+
+#: export_dialog.cc:417
+msgid "Tagging '%3' (timespan %1 of %2)"
+msgstr "Etiquetando '%3' (timespan %1 de %2)"
 
-#: export_dialog.cc:373 export_dialog.cc:375
+#: export_dialog.cc:421
+msgid "Uploading '%3' (timespan %1 of %2)"
+msgstr "Subiendo '%3' (timespan %1 de %2)"
+
+#: export_dialog.cc:425
+msgid "Running Post Export Command for '%1'"
+msgstr ""
+
+#: export_dialog.cc:453 export_dialog.cc:455
 msgid "<span color=\"#ffa755\">Error: "
 msgstr "<span color=\"#ffa755\">Error: "
 
-#: export_dialog.cc:385
+#: export_dialog.cc:465
 msgid "<span color=\"#ffa755\">Warning: "
 msgstr "<span color=\"#ffa755\">Aviso: "
 
-#: export_dialog.cc:387
+#: export_dialog.cc:467
 msgid ""
 "\n"
 "<span color=\"#ffa755\">Warning: "
@@ -6308,19 +7103,19 @@ msgstr ""
 "\n"
 "<span color=\"#ffa755\">Aviso "
 
-#: export_dialog.cc:411
+#: export_dialog.cc:439
 msgid "Export Selection"
 msgstr "Exportar selección"
 
-#: export_dialog.cc:425
+#: export_dialog.cc:453
 msgid "Export Region"
 msgstr "Exportar región"
 
-#: export_dialog.cc:434
+#: export_dialog.cc:462
 msgid "Source"
 msgstr "Origen"
 
-#: export_dialog.cc:450
+#: export_dialog.cc:478
 msgid "Stem Export"
 msgstr "Exportar tipo stem"
 
@@ -6328,174 +7123,248 @@ msgstr "Exportar tipo stem"
 msgid "Add another format"
 msgstr "Añadir otro formato"
 
-#: export_file_notebook.cc:193
+#: export_file_notebook.cc:198
 msgid "Format"
 msgstr "Formato"
 
-#: export_file_notebook.cc:194
+#: export_file_notebook.cc:199
 msgid "Location"
 msgstr "Posición"
 
-#: export_file_notebook.cc:195
+#: export_file_notebook.cc:200
 msgid "Upload to Soundcloud"
 msgstr ""
 
-#: export_file_notebook.cc:273
+#: export_file_notebook.cc:201
+msgid "Analyze Exported Audio"
+msgstr "Analizar audio exportado"
+
+#: export_file_notebook.cc:286
 msgid "No format!"
 msgstr "¡Sin formato!"
 
-#: export_file_notebook.cc:291
+#: export_file_notebook.cc:304
 msgid "Format %1: %2"
 msgstr "Formato %1: %2"
 
-#: export_filename_selector.cc:32
+#: export_filename_selector.cc:33
 msgid "Label:"
 msgstr "Etiqueta:"
 
-#: export_filename_selector.cc:33
+#: export_filename_selector.cc:34 session_dialog.cc:310
 msgid "Session Name"
 msgstr "Nombre de sesión"
 
-#: export_filename_selector.cc:34
+#: export_filename_selector.cc:35
+msgid "Timespan Name"
+msgstr "Nombre de timespan"
+
+#: export_filename_selector.cc:36
 msgid "Revision:"
 msgstr "Revisión:"
 
-#: export_filename_selector.cc:36
+#: export_filename_selector.cc:38
 msgid "Folder:"
 msgstr "Carpeta:"
 
-#: export_filename_selector.cc:37 session_import_dialog.cc:45
+#: export_filename_selector.cc:39 session_import_dialog.cc:45
 #: transcode_video_dialog.cc:59 video_server_dialog.cc:54
-#: video_server_dialog.cc:56 export_video_dialog.cc:81
-#: export_video_dialog.cc:83
+#: video_server_dialog.cc:56 export_video_dialog.cc:77
+#: export_video_dialog.cc:79
 msgid "Browse"
 msgstr "Explorar"
 
-#: export_filename_selector.cc:41
-msgid "<i>Build filename(s) from these components:</i>"
-msgstr "<i>Nombrar los archivos según:</i>"
+#: export_filename_selector.cc:40 export_report.cc:118
+msgid "Open Folder"
+msgstr "Abrir carpeta"
 
-#: export_filename_selector.cc:212
+#: export_filename_selector.cc:45
+msgid "Build filename(s) from these components:"
+msgstr "Construir el nombre de archivo según estos componentes:"
+
+#: export_filename_selector.cc:217
 msgid ""
 "<small><i>Sorry, no example filename can be shown at the moment</i></small>"
 msgstr ""
 "<small><i>En este momento no se puede mostrar un ejemplo de nombre de "
 "archivo</i></small>"
 
-#: export_filename_selector.cc:214
-msgid "<small><i>Current (approximate) filename: \"%1\"</i></small>"
-msgstr "<small><i>Nombre de archivo resultante: \"%1\"</i></small>"
+#: export_filename_selector.cc:219
+msgid "<i>Current (approximate) filename</i>: \"%1\""
+msgstr "<i>Nombre de archivo actual (aproximado)</i>: \"%1\""
 
-#: export_filename_selector.cc:250 export_filename_selector.cc:336
+#: export_filename_selector.cc:255 export_filename_selector.cc:402
 msgid ""
 "%1: this is only the directory/folder name, not the filename.\n"
 "The filename will be chosen from the information just above the folder "
 "selector."
 msgstr ""
 
-#: export_filename_selector.cc:322
+#: export_filename_selector.cc:378
+msgid "%1: this is not a valid directory/folder."
+msgstr ""
+
+#: export_filename_selector.cc:388
 msgid "Choose export folder"
 msgstr "Elije carpeta para exportaciones"
 
-#: export_format_dialog.cc:31
+#: export_format_dialog.cc:32
 msgid "New Export Format Profile"
 msgstr "Nuevo perfil de formato de exportación"
 
-#: export_format_dialog.cc:31
+#: export_format_dialog.cc:32
 msgid "Edit Export Format Profile"
 msgstr "Editar perfil de formato de exportación"
 
-#: export_format_dialog.cc:38
+#: export_format_dialog.cc:39
 msgid "Label: "
 msgstr "Etiqueta: "
 
-#: export_format_dialog.cc:41 normalize_dialog.cc:42
-msgid "Normalize to:"
-msgstr "Normalizar a:"
+#: export_format_dialog.cc:42
+msgid "Normalize:"
+msgstr "Normalizar:"
+
+#: export_format_dialog.cc:43
+msgid "Peak"
+msgstr ""
+
+#: export_format_dialog.cc:44
+msgid "Loudness"
+msgstr ""
+
+#: export_format_dialog.cc:50
+msgid "LUFS"
+msgstr ""
+
+#: export_format_dialog.cc:51
+msgid "dBTP"
+msgstr ""
 
-#: export_format_dialog.cc:46
+#: export_format_dialog.cc:54
 msgid "Trim silence at start"
 msgstr "Recortar silencio en inicio"
 
-#: export_format_dialog.cc:47
+#: export_format_dialog.cc:55
 msgid "Add silence at start:"
 msgstr "Añadir silencio en inicio:"
 
-#: export_format_dialog.cc:50
+#: export_format_dialog.cc:58
 msgid "Trim silence at end"
 msgstr "Recortar silencio en final"
 
-#: export_format_dialog.cc:51
+#: export_format_dialog.cc:59
 msgid "Add silence at end:"
 msgstr "Añadir silencio al final:"
 
-#: export_format_dialog.cc:54
+#: export_format_dialog.cc:62
 msgid ""
 "Command to run post-export\n"
-"(%f=full path & filename, %d=directory, %b=basename):"
+"(%f=file path, %d=directory, %b=basename, see tooltip for more):"
 msgstr ""
 
-#: export_format_dialog.cc:57
+#: export_format_dialog.cc:65
 msgid "Compatibility"
 msgstr "Compatibilidad"
 
-#: export_format_dialog.cc:58
+#: export_format_dialog.cc:66
 msgid "Quality"
 msgstr "Calidad"
 
-#: export_format_dialog.cc:61
+#: export_format_dialog.cc:69
 msgid "Sample rate conversion quality:"
 msgstr "Calidad de conversión de frecuencia de muestreo:"
 
-#: export_format_dialog.cc:68
+#: export_format_dialog.cc:76
 msgid "Dithering"
 msgstr "Dithering"
 
-#: export_format_dialog.cc:70
+#: export_format_dialog.cc:78
 msgid "Create CUE file for disk-at-once CD/DVD creation"
 msgstr "Crear archivo CUE para creación de CD/DVD disk-at-once"
 
-#: export_format_dialog.cc:71
+#: export_format_dialog.cc:79
 msgid "Create TOC file for disk-at-once CD/DVD creation"
 msgstr "Crear archivo TOC para creación de CD/DVD disk-at-once"
 
-#: export_format_dialog.cc:73
+#: export_format_dialog.cc:80
+msgid "Create chapter mark file for MP4 chapter marks"
+msgstr ""
+
+#: export_format_dialog.cc:82
 msgid "Tag file with session's metadata"
 msgstr "Archivo de etiquetas con metadatos de sesión"
 
-#: export_format_dialog.cc:470
+#: export_format_dialog.cc:119
+msgid "\\u2227"
+msgstr ""
+
+#: export_format_dialog.cc:124
+msgid ""
+"Normalize to EBU-R128 LUFS target loudness without exceeding the given true-"
+"peak limit. EBU-R128 normalization is only available for mono and stereo "
+"targets, true-peak works for any channel layout."
+msgstr ""
+
+#: export_format_dialog.cc:152
+msgid ""
+"%a Artist name\n"
+"%b File's base-name\n"
+"%c Copyright\n"
+"%d File's directory\n"
+"%f File's full absolute path\n"
+"%l Lyricist\n"
+"%n Session name\n"
+"%o Conductor\n"
+"%t Title\n"
+"%z Organization\n"
+"%A Album\n"
+"%C Comment\n"
+"%E Engineer\n"
+"%G Genre\n"
+"%L Total track count\n"
+"%M Mixer\n"
+"%N Timespan name\n"
+"%O Composer\n"
+"%P Producer\n"
+"%S Disc subtitle\n"
+"%T Track number\n"
+"%Y Year\n"
+"%Z Country"
+msgstr ""
+
+#: export_format_dialog.cc:537
 msgid "Best (sinc)"
 msgstr "Mejor (sinc)"
 
-#: export_format_dialog.cc:475
+#: export_format_dialog.cc:542
 msgid "Medium (sinc)"
 msgstr "Media (sinc)"
 
-#: export_format_dialog.cc:480
+#: export_format_dialog.cc:547
 msgid "Fast (sinc)"
 msgstr "Rápida (sinc)"
 
-#: export_format_dialog.cc:490
+#: export_format_dialog.cc:557
 msgid "Zero order hold"
 msgstr ""
 
-#: export_format_dialog.cc:895
+#: export_format_dialog.cc:981
 msgid "Linear encoding options"
 msgstr "Opciones de codificación lineal"
 
-#: export_format_dialog.cc:911
+#: export_format_dialog.cc:997
 msgid "Ogg Vorbis options"
 msgstr "Opciones Ogg Vorbis"
 
-#: export_format_dialog.cc:922
+#: export_format_dialog.cc:1008
 msgid "FLAC options"
 msgstr "Opciones FLAC"
 
-#: export_format_dialog.cc:939
+#: export_format_dialog.cc:1025
 msgid "Broadcast Wave options"
 msgstr "Opciones de Broadcast Wave"
 
-#: export_format_selector.cc:136
+#: export_format_selector.cc:131
 msgid "Do you really want to remove the format?"
 msgstr ""
 
@@ -6503,7 +7372,7 @@ msgstr ""
 msgid "Preset"
 msgstr "Preset"
 
-#: export_preset_selector.cc:104
+#: export_preset_selector.cc:99
 msgid ""
 "The selected preset did not load successfully!\n"
 "Perhaps it references a format that has been removed?"
@@ -6511,68 +7380,252 @@ msgstr ""
 "¡El preset seleccionado no se cargó correctamente!\n"
 "¿Quizás se refiere a un formato que ha sido eliminado?"
 
-#: export_preset_selector.cc:156
+#: export_preset_selector.cc:151
 msgid "Do you really want to remove this preset?"
 msgstr ""
 
-#: export_timespan_selector.cc:46
-msgid "Show Times as:"
-msgstr "Mostrar los tiempos como:"
+#: export_report.cc:56
+msgid "Export Report/Analysis"
+msgstr "Exportar informe/análisis"
 
-#: export_timespan_selector.cc:53 processor_box.cc:2466
-msgid "Select All"
-msgstr "Seleccionar todo"
+#: export_report.cc:147 export_report.cc:327 sfdb_ui.cc:149
+msgid "Format:"
+msgstr "Formato:"
 
-#: export_timespan_selector.cc:223 transform_dialog.cc:93
-msgid " to "
-msgstr " a "
+#: export_report.cc:166 export_report.cc:328
+msgid "%1 Hz"
+msgstr ""
 
-#: export_timespan_selector.cc:367 export_timespan_selector.cc:426
-msgid "Range"
-msgstr "Rango"
+#: export_report.cc:169 export_report.cc:336 transcode_video_dialog.cc:139
+msgid "Duration:"
+msgstr "Duración"
 
-#: sfdb_freesound_mootcher.cc:189 sfdb_freesound_mootcher.cc:324
-msgid "curl error %1 (%2)"
+#: export_report.cc:177 export_report.cc:334
+msgid "Timecode:"
+msgstr "Timecode:"
+
+#: export_report.cc:185
+msgid "Error:"
+msgstr "Error:"
+
+#: export_report.cc:220 export_report.cc:440
+msgid "(too short integration time)"
 msgstr ""
 
-#: sfdb_freesound_mootcher.cc:266
-msgid "getSoundResourceFile: There is no valid root in the xml file"
+#: export_report.cc:222
+msgid "-888"
 msgstr ""
 
-#: sfdb_freesound_mootcher.cc:271
-msgid "getSoundResourceFile: root = %1, != response"
+#: export_report.cc:227 export_report.cc:353
+msgid "Peak:"
 msgstr ""
 
-#: sfdb_freesound_mootcher.cc:410 rc_option_editor.cc:1824
-msgid "%1"
+#: export_report.cc:228 export_report.cc:360
+msgid "%1 dBFS"
+msgstr "%1 dBFS"
+
+#: export_report.cc:229 export_report.cc:369
+msgid "True Peak:"
 msgstr ""
 
-#: gain_meter.cc:132 gain_meter.cc:400 gain_meter.cc:505 gain_meter.cc:896
-msgid "-inf"
-msgstr "-inf"
+#: export_report.cc:230 export_report.cc:376
+msgid "%1 dBTP"
+msgstr ""
 
-#: gain_meter.cc:147 gain_meter.cc:958
-msgid "Fader automation mode"
-msgstr "Modo de automatización de fader"
+#: export_report.cc:231 export_report.cc:387
+msgid "Normalization Gain:"
+msgstr "Ganancia de normalización:"
 
-#: gain_meter.cc:148 gain_meter.cc:959
-msgid "Fader automation type"
-msgstr "Tipo de automatización de fader"
+#: export_report.cc:232
+msgid "+888.88 dB"
+msgstr ""
 
-#: gain_meter.cc:157 gain_meter.cc:829 panner_ui.cc:179 panner_ui.cc:639
-msgid "Abs"
-msgstr "Abs"
+#: export_report.cc:234 export_report.cc:448
+msgid "Integrated Loudness:"
+msgstr ""
 
-#: gain_meter.cc:796 mixer_strip.cc:2049 meter_strip.cc:374 panner_ui.cc:606
-#: route_time_axis.cc:104 route_time_axis.cc:2705
+#: export_report.cc:235 export_report.cc:454
+msgid "%1 LUFS"
+msgstr ""
+
+#: export_report.cc:236 export_report.cc:460
+msgid "Loudness Range:"
+msgstr "Rango de loudness:"
+
+#: export_report.cc:237 export_report.cc:466
+msgid "%1 LU"
+msgstr ""
+
+#: export_report.cc:247 export_report.cc:754
+msgid "100"
+msgstr ""
+
+#: export_report.cc:282 export_report.cc:650
+msgid "00:00:00.000"
+msgstr ""
+
+#: export_report.cc:288
+msgid "0|A8"
+msgstr "A8"
+
+#: export_report.cc:394
+msgid "%1 dB"
+msgstr ""
+
+#: export_report.cc:425 export_report.cc:433 export_report.cc:553
+msgid ""
+"Not\n"
+"Available"
+msgstr ""
+"No\n"
+"Disponible"
+
+#: export_report.cc:493
+msgid ""
+"LUFS\n"
+"(short)"
+msgstr ""
+
+#: export_report.cc:503
+msgid "Multiplicity"
+msgstr "Multiplicidad"
+
+#: export_report.cc:603
+msgid "Logscale|Lg"
+msgstr "Lg"
+
+#: export_report.cc:604
+msgid "Rectified|Rf"
+msgstr "Rf"
+
+#: export_report.cc:605
+msgid "Logscale"
+msgstr "Escala logarítimica"
+
+#: export_report.cc:606
+msgid "Rectified"
+msgstr "Rectificada"
+
+#: export_report.cc:738
+msgid "Hz"
+msgstr ""
+
+#: export_report.cc:755
+msgid "500"
+msgstr ""
+
+#: export_report.cc:756
+msgid "1K"
+msgstr ""
+
+#: export_report.cc:757
+msgid "5K"
+msgstr ""
+
+#: export_report.cc:758
+msgid "10K"
+msgstr ""
+
+#: export_report.cc:844
+msgid "Writing Export Analysis Image: %1."
+msgstr ""
+
+#: export_report.cc:941 sfdb_ui.cc:293 sfdb_ui.cc:409
+msgid "Could not read file: %1 (%2)."
+msgstr "No se pudo leer el archivo %1 (%2)."
+
+#: export_report.cc:967 sfdb_ui.cc:458
+msgid "Could not access soundfile: "
+msgstr "No se pudo acceder al archivo de audio: "
+
+#: export_report.cc:1203
+msgid "-36"
+msgstr ""
+
+#: export_report.cc:1204 export_report.cc:1208 export_report.cc:1214
+#: export_report.cc:1217
+msgid "-18"
+msgstr ""
+
+#: export_report.cc:1205 export_report.cc:1209 export_report.cc:1215
+#: export_report.cc:1218 export_report.cc:1221 export_report.cc:1222
+msgid "-9"
+msgstr ""
+
+#: export_report.cc:1206 export_report.cc:1210 export_report.cc:1216
+#: export_report.cc:1219 export_report.cc:1223 export_report.cc:1224
+msgid "-3"
+msgstr ""
+
+#: export_timespan_selector.cc:45
+msgid "Show Times as:"
+msgstr "Mostrar los tiempos como:"
+
+#: export_timespan_selector.cc:46
+msgid "Realtime Export"
+msgstr "Exportar en realtime"
+
+#: export_timespan_selector.cc:54 processor_box.cc:3695
+msgid "Select All"
+msgstr "Seleccionar todo"
+
+#: export_timespan_selector.cc:255 transform_dialog.cc:93
+msgid " to "
+msgstr " a "
+
+#: export_timespan_selector.cc:399 export_timespan_selector.cc:488
+msgid "RT"
+msgstr "RT"
+
+#: export_timespan_selector.cc:400 export_timespan_selector.cc:489
+msgid "Range"
+msgstr "Rango"
+
+#: sfdb_freesound_mootcher.cc:189 sfdb_freesound_mootcher.cc:324
+msgid "curl error %1 (%2)"
+msgstr ""
+
+#: sfdb_freesound_mootcher.cc:266
+msgid "getSoundResourceFile: There is no valid root in the xml file"
+msgstr ""
+
+#: sfdb_freesound_mootcher.cc:271
+msgid "getSoundResourceFile: root = %1, != response"
+msgstr ""
+
+#: sfdb_freesound_mootcher.cc:410 rc_option_editor.cc:2416
+msgid "%1"
+msgstr ""
+
+#: gain_meter.cc:137 gain_meter.cc:422 gain_meter.cc:527 gain_meter.cc:919
+msgid "-inf"
+msgstr "-inf"
+
+#: gain_meter.cc:152 gain_meter.cc:983
+msgid "Fader automation mode"
+msgstr "Modo de automatización de fader"
+
+#: gain_meter.cc:153 gain_meter.cc:984
+msgid "Fader automation type"
+msgstr "Tipo de automatización de fader"
+
+#: gain_meter.cc:162 gain_meter.cc:852 panner_ui.cc:179 panner_ui.cc:641
+msgid "Abs"
+msgstr "Abs"
+
+#: gain_meter.cc:816 vca_master_strip.cc:78 vca_time_axis.cc:54
+msgid "M"
+msgstr "M"
+
+#: gain_meter.cc:819 vca_master_strip.cc:296
 msgid "P"
 msgstr "P"
 
-#: gain_meter.cc:799 panner_ui.cc:609
+#: gain_meter.cc:822
 msgid "T"
 msgstr "T"
 
-#: gain_meter.cc:802 panner_ui.cc:612
+#: gain_meter.cc:825
 msgid "W"
 msgstr "W"
 
@@ -6580,49 +7633,53 @@ msgstr "W"
 msgid "<span size=\"large\">Presets</span>"
 msgstr "<span size=\"large\">Presets</span>"
 
-#: generic_pluginui.cc:97
+#: generic_pluginui.cc:98 plugin_pin_dialog.cc:333
 msgid "Manual"
 msgstr "Manual"
 
-#: generic_pluginui.cc:106
+#: generic_pluginui.cc:107
 msgid "All Automation"
 msgstr "Toda automatización"
 
 #: generic_pluginui.cc:250
-msgid "Switches"
-msgstr "Conmutadores"
-
-#: generic_pluginui.cc:260 generic_pluginui.cc:436 processor_box.cc:2440
-msgid "Controls"
-msgstr "Controles"
-
-#: generic_pluginui.cc:293
 msgid "Plugin Editor: could not build control element for port %1"
 msgstr ""
 "Editor de plugin: no se pudo crear el elemento de control para el puerto %1"
 
-#: generic_pluginui.cc:318
+#: generic_pluginui.cc:282
 msgid "Plugin Editor: no control for property %1"
 msgstr "Editor de plugin: no hay control para propiedad %1"
 
-#: generic_pluginui.cc:324
+#: generic_pluginui.cc:288
 msgid "Plugin Editor: could not build control element for property %1"
 msgstr ""
 "Editor de plugin: no se pudo crear el elemento de control para la propiedad "
 "%1"
 
-#: generic_pluginui.cc:468
+#: generic_pluginui.cc:359
+msgid "Switches"
+msgstr "Conmutadores"
+
+#: generic_pluginui.cc:369 generic_pluginui.cc:475 processor_box.cc:3653
+msgid "Controls"
+msgstr "Controles"
+
+#: generic_pluginui.cc:510
 msgid "Meters"
 msgstr "Medidores"
 
-#: generic_pluginui.cc:490
+#: generic_pluginui.cc:548
 msgid "Automation control"
 msgstr "Control de la automatización"
 
-#: generic_pluginui.cc:497
+#: generic_pluginui.cc:555
 msgid "Mgnual"
 msgstr "Manual"
 
+#: generic_pluginui.cc:828
+msgid "This control cannot be automated"
+msgstr ""
+
 #: global_port_matrix.cc:158
 msgid "Audio Connection Manager"
 msgstr "Gestor de conexiones de audio"
@@ -6631,112 +7688,141 @@ msgstr "Gestor de conexiones de audio"
 msgid "MIDI Connection Manager"
 msgstr "Gestor de conexiones MIDI"
 
-#: global_port_matrix.cc:201 io_selector.cc:211 mixer_strip.cc:793
-#: mixer_strip.cc:894
+#: global_port_matrix.cc:201 io_selector.cc:211 mixer_strip.cc:863
+#: mixer_strip.cc:966 monitor_section.cc:1430 monitor_selector.cc:189
+#: plugin_pin_dialog.cc:1757
 msgid "Disconnect"
 msgstr "Desconectar"
 
-#: global_port_matrix.cc:207 io_selector.cc:217
+#: global_port_matrix.cc:207 io_selector.cc:217 monitor_selector.cc:195
 msgid "port"
 msgstr "puerto"
 
-#: group_tabs.cc:312
+#: group_tabs.cc:312 group_tabs.cc:321
 msgid "Selection..."
 msgstr "Selección..."
 
-#: group_tabs.cc:313
+#: group_tabs.cc:313 group_tabs.cc:322
 msgid "Record Enabled..."
 msgstr "Habilitado para grabación..."
 
-#: group_tabs.cc:314
+#: group_tabs.cc:314 group_tabs.cc:323
 msgid "Soloed..."
 msgstr "En solo..."
 
-#: group_tabs.cc:320
+#: group_tabs.cc:316
+msgid "Create New Group From..."
+msgstr "Crear nuevo grupo según..."
+
+#: group_tabs.cc:325
+msgid "Create New Group with Master From..."
+msgstr "Crear nuevo grupo con Máster según..."
+
+#: group_tabs.cc:344
 msgid "Create New Group ..."
 msgstr "Crear nuevo grupo..."
 
-#: group_tabs.cc:321
-msgid "Create New Group From"
-msgstr ""
+#: group_tabs.cc:345
+msgid "Create New Group with Control Master ..."
+msgstr "Crear nuevo grupo con control Master según..."
 
-#: group_tabs.cc:324
+#: group_tabs.cc:355
 msgid "Edit Group..."
 msgstr "Editar grupo..."
 
-#: group_tabs.cc:325
+#: group_tabs.cc:356
 msgid "Collect Group"
 msgstr ""
 
-#: group_tabs.cc:326
+#: group_tabs.cc:357
 msgid "Remove Group"
 msgstr "Eiminar grupo"
 
-#: group_tabs.cc:329
+#: group_tabs.cc:368
+msgid "Assign Group to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:374
 msgid "Remove Subgroup Bus"
 msgstr "Eliminar bus de subgrupo"
 
-#: group_tabs.cc:331
+#: group_tabs.cc:376
 msgid "Add New Subgroup Bus"
 msgstr "Añadir nuebo bus de subgrupo"
 
-#: group_tabs.cc:333
+#: group_tabs.cc:378
 msgid "Add New Aux Bus (pre-fader)"
 msgstr "Añadir nuevo bus auxiliar (pre-fader)"
 
-#: group_tabs.cc:334
+#: group_tabs.cc:379
 msgid "Add New Aux Bus (post-fader)"
 msgstr "Añadir nuevo bus auxiliar (post-fader)"
 
-#: group_tabs.cc:340
+#: group_tabs.cc:404
+msgid "Assign Selection to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:415
+msgid "Assign Record Enabled to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:426
+msgid "Assign Soloed to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:429
 msgid "Enable All Groups"
 msgstr ""
 
-#: group_tabs.cc:341
+#: group_tabs.cc:430
 msgid "Disable All Groups"
 msgstr "Desactivar todos los grupos"
 
-#: insert_time_dialog.cc:46
+#: insert_remove_time_dialog.cc:52
+msgid "Time to remove"
+msgstr "Tiempo a eliminar"
+
+#: insert_remove_time_dialog.cc:52
 msgid "Time to insert:"
 msgstr "Tiempo a insertar:"
 
-#: insert_time_dialog.cc:54
+#: insert_remove_time_dialog.cc:61
 msgid "Intersected regions should:"
 msgstr "Las regiones intersectadas deberían:"
 
-#: insert_time_dialog.cc:57
+#: insert_remove_time_dialog.cc:64
 msgid "stay in position"
 msgstr "mantenerse en posición"
 
-#: insert_time_dialog.cc:58
+#: insert_remove_time_dialog.cc:65
 msgid "move"
 msgstr "moverse"
 
-#: insert_time_dialog.cc:59
+#: insert_remove_time_dialog.cc:66
 msgid "be split"
 msgstr "separarse"
 
-#: insert_time_dialog.cc:65
-msgid "Insert time on all the track's playlists"
-msgstr "Insertar tiempo en todas las listas de reproducción de la pista"
+#: insert_remove_time_dialog.cc:73
+msgid "Apply to all the track's playlists"
+msgstr "Aplicar a todas las listas de reproducción de la pista"
 
-#: insert_time_dialog.cc:68
+#: insert_remove_time_dialog.cc:76
 msgid "Move glued regions"
 msgstr "Mover regiones adheridas"
 
-#: insert_time_dialog.cc:70
+#: insert_remove_time_dialog.cc:78
 msgid "Move markers"
 msgstr "Mover marcas"
 
-#: insert_time_dialog.cc:73
+#: insert_remove_time_dialog.cc:81
 msgid "Move glued markers"
 msgstr "Mover marcas adheridas"
 
-#: insert_time_dialog.cc:78
+#: insert_remove_time_dialog.cc:86
 msgid "Move locked markers"
 msgstr "Mover marcas bloqueadas"
 
-#: insert_time_dialog.cc:83
+#: insert_remove_time_dialog.cc:91
 msgid ""
 "Move tempo and meter changes\n"
 "<i>(may cause oddities in the tempo map)</i>"
@@ -6744,15 +7830,23 @@ msgstr ""
 "Mover cambios de tempo y métrica\n"
 "<i>(puede provocar problemas en el mapa de tempo)</i>"
 
-#: insert_time_dialog.cc:91
+#: insert_remove_time_dialog.cc:99
+msgid "Remove time"
+msgstr "Borrar tiempo"
+
+#: insert_remove_time_dialog.cc:99
 msgid "Insert time"
 msgstr "Insertar tiempo"
 
-#: instrument_selector.cc:62
+#: insert_remove_time_dialog.cc:174
+msgid "Invalid or zero duration entered. Please enter a valid duration"
+msgstr ""
+
+#: instrument_selector.cc:92
 msgid "-none-"
 msgstr "-ninguno-"
 
-#: interthread_progress_window.cc:103
+#: interthread_progress_window.cc:114
 msgid "Importing file: %1 of %2"
 msgstr "Importando fichero: %1 de %2"
 
@@ -6760,70 +7854,95 @@ msgstr "Importando fichero: %1 de %2"
 msgid "I/O selector"
 msgstr "Selector de E/S"
 
-#: io_selector.cc:266
+#: io_selector.cc:266 monitor_selector.cc:244
 msgid "%1 input"
 msgstr "%1 entrada"
 
-#: io_selector.cc:268
+#: io_selector.cc:268 monitor_selector.cc:246
 msgid "%1 output"
 msgstr "%1 salida"
 
-#: keyboard.cc:70
+#: keyboard.cc:93
 msgid "your own"
 msgstr "la tuya propia"
 
-#: keyboard.cc:133 keyboard.cc:157
+#: keyboard.cc:157 keyboard.cc:181
 msgid "Default keybindings not found - %1 will be hard to use!"
 msgstr ""
 "No se encontraron las combinaciones de teclas predeterminadas - ¡%1 será "
 "difícil de usar!"
 
-#: keyboard.cc:136
+#: keyboard.cc:160
 msgid "Key bindings file \"%1\" not found. Default bindings used instead"
 msgstr ""
 "No se pudo encontrar el archivo de combinaciones de teclas \"%1\". Se usarán "
 "las combinaciones de teclas predeterminadas."
 
-#: keyeditor.cc:54
-msgid "Remove shortcut"
-msgstr "Eliminar atajo"
+#: keyboard.cc:193
+msgid "Loading keybindings from %1"
+msgstr "Cargando atajos de teclado desde %1"
 
-#: keyeditor.cc:63
-msgid "Action"
-msgstr "Acción"
+#: keyeditor.cc:67
+msgid "Colliding keybindings"
+msgstr ""
 
-#: keyeditor.cc:64
-msgid "Shortcut"
-msgstr "Atajo de teclado"
+#: keyeditor.cc:68
+msgid ""
+"The key sequence is already bound. Please remove the other binding first."
+msgstr ""
+
+#: keyeditor.cc:77
+msgid "Key Bindings"
+msgstr "Combinaciones de teclas"
 
-#: keyeditor.cc:84
-msgid "Select an action, then press the key(s) to (re)set its shortcut"
-msgstr "Selecciona una acción y pulsa la/s tecla/s para (r)establecer su atajo"
+#: keyeditor.cc:78
+msgid "Remove shortcut"
+msgstr "Eliminar atajo"
 
-#: keyeditor.cc:98
-msgid "Reset Bindings to Defaults"
+#: keyeditor.cc:80
+msgid "Search..."
+msgstr "Buscar..."
+
+#: keyeditor.cc:82
+msgid "Print"
 msgstr ""
 
-#: keyeditor.cc:263
-msgid "Main_menu"
+#: keyeditor.cc:93
+msgid "Click to reset search string"
 msgstr ""
 
-#: keyeditor.cc:265
-msgid "redirectmenu"
+#: keyeditor.cc:97
+msgid "To remove a shortcut select an action then press this: "
 msgstr ""
 
-#: keyeditor.cc:267
-msgid "Editor_menus"
+#: keyeditor.cc:109
+msgid "Reset Bindings to Defaults"
 msgstr ""
 
-#: keyeditor.cc:269
+#: keyeditor.cc:227 lua_script_manager.cc:41
+msgid "Action"
+msgstr "Acción"
+
+#: keyeditor.cc:228
+msgid "Shortcut"
+msgstr "Atajo de teclado"
+
+#: keyeditor.cc:370
 msgid "RegionList"
 msgstr ""
 
-#: keyeditor.cc:271
-msgid "ProcessorMenu"
+#: keyeditor.cc:543
+msgid "Could not open temporary file to print bindings (%1)"
 msgstr ""
 
+#: keyeditor.cc:561
+msgid "Could not save bindings to file (%1)"
+msgstr ""
+
+#: latency_gui.cc:39
+msgid "sample"
+msgstr "muestra"
+
 #: latency_gui.cc:40
 msgid "msec"
 msgstr "msec"
@@ -6832,109 +7951,218 @@ msgstr "msec"
 msgid "period"
 msgstr "periodo"
 
-#: latency_gui.cc:55
-msgid "%1 sample"
-msgid_plural "%1 samples"
-msgstr[0] "%1 muestra"
-msgstr[1] "%1 muestras"
-
-#: latency_gui.cc:72 panner_ui.cc:409
+#: latency_gui.cc:72 panner_ui.cc:411 plugin_pin_dialog.cc:109
+#: plugin_ui.cc:421
 msgid "Reset"
 msgstr "Restablecer"
 
-#: latency_gui.cc:149 rhythm_ferret.cc:273 sfdb_ui.cc:1912
+#: latency_gui.cc:149 rhythm_ferret.cc:295 sfdb_ui.cc:1878
 msgid "programming error: %1 (%2)"
 msgstr "programming error: %1 (%2)"
 
-#: location_ui.cc:52 location_ui.cc:54
+#: location_ui.cc:54 location_ui.cc:57
 msgid "Use PH"
 msgstr "Usar cursor"
 
-#: location_ui.cc:59
+#: location_ui.cc:55 location_ui.cc:58
+msgid "Goto"
+msgstr "Ir a"
+
+#: location_ui.cc:63
 msgid "Glue"
 msgstr "Adherir"
 
-#: location_ui.cc:87
+#: location_ui.cc:88
 msgid "Performer:"
 msgstr ""
 
-#: location_ui.cc:88
+#: location_ui.cc:89
 msgid "Composer:"
 msgstr "Compositor:"
 
-#: location_ui.cc:90
+#: location_ui.cc:91
 msgid "Pre-Emphasis"
 msgstr "Pre-énfasis"
 
-#: location_ui.cc:317
+#: location_ui.cc:319
 msgid "Remove this range"
 msgstr "Eliminar este rango"
 
-#: location_ui.cc:318
+#: location_ui.cc:320
 msgid "Start time - middle click to locate here"
 msgstr ""
 
-#: location_ui.cc:319
+#: location_ui.cc:321
 msgid "End time - middle click to locate here"
 msgstr ""
 
-#: location_ui.cc:322
+#: location_ui.cc:324
 msgid "Set range start from playhead location"
 msgstr "Establecer inicio de rango en posición de cursor"
 
-#: location_ui.cc:323
+#: location_ui.cc:325
 msgid "Set range end from playhead location"
 msgstr "Establecer fin de rango en posición de cursor"
 
-#: location_ui.cc:327
+#: location_ui.cc:329
 msgid "Remove this marker"
 msgstr "Eliminar esta marca"
 
-#: location_ui.cc:328
+#: location_ui.cc:330
 msgid "Position - middle click to locate here"
 msgstr ""
 
-#: location_ui.cc:330
+#: location_ui.cc:332
 msgid "Set marker time from playhead location"
 msgstr "Establecer tiempo de marca en posición de cursor"
 
-#: location_ui.cc:499
+#: location_ui.cc:524
 msgid "You cannot put a CD marker at the start of the session"
 msgstr "No puedes colocar una marca de CD al inicio de la sesión"
 
-#: location_ui.cc:725
+#: location_ui.cc:750
 msgid "New Marker"
 msgstr "Nueva marca"
 
-#: location_ui.cc:726
+#: location_ui.cc:751
 msgid "New Range"
 msgstr "Nuevo rango"
 
-#: location_ui.cc:739
+#: location_ui.cc:764
 msgid "<b>Loop/Punch Ranges</b>"
 msgstr "<b>Rangos de bucle/pinchazo</b>"
 
-#: location_ui.cc:764
+#: location_ui.cc:790
 msgid "<b>Markers (Including CD Index)</b>"
 msgstr "<b>Marcas (incluyendo índice de CD)</b>"
 
-#: location_ui.cc:799
+#: location_ui.cc:825
 msgid "<b>Ranges (Including CD Track Ranges)</b>"
 msgstr "<b>Rangos (incluyendo rangos de pistas de CD)</b>"
 
-#: location_ui.cc:1042
+#: location_ui.cc:1068
 msgid "add range marker"
 msgstr "añadir marca de rango"
 
-#: main.cc:82
+#: lua_script_manager.cc:31
+msgid "Add/Set"
+msgstr ""
+
+#: lua_script_manager.cc:34
+msgid "Call"
+msgstr ""
+
+#: lua_script_manager.cc:35
+msgid "New Hook"
+msgstr ""
+
+#: lua_script_manager.cc:77
+msgid "Signal(s)"
+msgstr "Señal(es)"
+
+#: lua_script_manager.cc:127
+msgid "Action %1"
+msgstr "Acción %1"
+
+#: lua_script_manager.cc:132 lua_script_manager.cc:227
+msgid "Unset"
+msgstr ""
+
+#: luainstance.cc:1096
+msgid "Cannot read script '%1': %2"
+msgstr "No se pudo leer script '%1': %2"
+
+#: luawindow.cc:97
+msgid "Run"
+msgstr "Ejecutar"
+
+#: luawindow.cc:98
+msgid "Clear Output"
+msgstr "Limpiar salida"
+
+#: luawindow.cc:102
+msgid "Revert"
+msgstr ""
+
+#: luawindow.cc:166
+msgid "Select Editor Buffer"
+msgstr ""
+
+#: luawindow.cc:253 luawindow.cc:258
+msgid "Window|Lua"
+msgstr "Lua"
+
+#: luawindow.cc:286 luawindow.cc:304
+msgid "LuaException: %1"
+msgstr ""
+
+#: luawindow.cc:342
+msgid "Deleted %1"
+msgstr "Eliminado %1"
+
+#: luawindow.cc:345
+msgid "Failed to delete %1"
+msgstr ""
+
+#: luawindow.cc:411
+msgid ""
+"Missing script header.\n"
+"The script requires an '{ardour}' info table and a 'factory' function."
+msgstr ""
+
+#: luawindow.cc:416
+msgid "Script fails to compile."
+msgstr ""
+
+#: luawindow.cc:423
+msgid "Invalid or missing script-name or script-type."
+msgstr ""
+
+#: luawindow.cc:428
+msgid ""
+"Invalid script-type.\n"
+"Valid types are 'EditorAction' and 'Snippet'."
+msgstr ""
+
+#: luawindow.cc:439 luawindow.cc:490
+msgid "Saved as %1"
+msgstr "Guardado como %1"
+
+#: luawindow.cc:442 luawindow.cc:493
+msgid "Error saving file: %1"
+msgstr "Error guardando archivo: %1"
+
+#: luawindow.cc:452
+msgid ""
+"Script with given name '%1' already exists.\n"
+"Use a different name in the descriptor."
+msgstr ""
+
+#: luawindow.cc:636
+msgid "Scratch Buffer %1"
+msgstr ""
+
+#: luawindow.cc:638
+msgid "Action: '%1'"
+msgstr "Acción: '%1'"
+
+#: luawindow.cc:640
+msgid "Snippet: %1"
+msgstr ""
+
+#: luawindow.cc:652
+msgid "Save as"
+msgstr "Guardar como"
+
+#: main.cc:88
 msgid "%1 could not connect to the audio backend."
 msgstr ""
 
-#: main.cc:107 main.cc:123
+#: main.cc:135 main.cc:151
 msgid "The audio backend (%1) has failed, or terminated"
 msgstr ""
 
-#: main.cc:110
+#: main.cc:138
 msgid ""
 "%2 exited unexpectedly, and without notifying %1.\n"
 "\n"
@@ -6943,33 +8171,33 @@ msgid ""
 "Click OK to exit %1."
 msgstr ""
 
-#: main.cc:124
+#: main.cc:152
 msgid "%2 exited unexpectedly, and without notifying %1."
 msgstr ""
 
-#: main.cc:219
+#: main.cc:247
 msgid ""
 "\n"
 "   %1 could not understand your command line      "
 msgstr ""
 
-#: main.cc:221
+#: main.cc:249
 msgid "An error was encountered while launching %1"
 msgstr ""
 
-#: main.cc:310
+#: main.cc:350
 msgid " (built using "
 msgstr " (compilado usando "
 
-#: main.cc:313
+#: main.cc:353
 msgid " and GCC version "
 msgstr " y versión de GCC "
 
-#: main.cc:323
-msgid "Copyright (C) 1999-2012 Paul Davis"
-msgstr "Copyright (C) 1999-2012 Paul Davis"
+#: main.cc:363
+msgid "Copyright (C) 1999-2015 Paul Davis"
+msgstr "Copyright (C) 1999-2015 Paul Davis"
 
-#: main.cc:324
+#: main.cc:364
 msgid ""
 "Some portions Copyright (C) Steve Harris, Ari Johnson, Brett Viren, Joel "
 "Baker, Robin Gareus"
@@ -6977,48 +8205,68 @@ msgstr ""
 "Some portions Copyright (C) Steve Harris, Ari Johnson, Brett Viren, Joel "
 "Baker, Robin Gareus"
 
-#: main.cc:326
+#: main.cc:360
 msgid "%1 comes with ABSOLUTELY NO WARRANTY"
 msgstr "%1 viene SIN GARANTÍA DE NINGUNA CLASE"
 
-#: main.cc:327
+#: main.cc:361
 msgid "not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
 msgstr ""
 "incluidas de comerciabilidad o adecuación para un propósito determinado"
 
-#: main.cc:328
+#: main.cc:362
 msgid "This is free software, and you are welcome to redistribute it "
 msgstr "Esto es software libre. Puedes distribuirlo "
 
-#: main.cc:329
+#: main.cc:363
 msgid "under certain conditions; see the source for copying conditions."
 msgstr ""
 "bajo ciertas condiciones; lee el código para conocer las condiciones de "
 "copia."
 
-#: main.cc:334
+#: main.cc:368
 msgid "could not initialize %1."
 msgstr "no se pudo inicializar %1."
 
-#: main.cc:344
+#: main.cc:378
 msgid "Cannot xinstall SIGPIPE error handler"
 msgstr "Cannot xinstall SIGPIPE error handler"
 
-#: main.cc:351
+#: main.cc:385
+msgid "Could not complete pre-GUI initialization"
+msgstr ""
+
+#: main.cc:392
 msgid "could not create %1 GUI"
 msgstr "could not create %1 GUI"
 
-#: main_clock.cc:52
+#: main_clock.cc:51
 msgid "Display delta to edit cursor"
 msgstr "Mostrar diferencia al punto de edición"
 
-#: marker.cc:273
+#: main_clock.cc:66 tempo_dialog.cc:55
+msgid "Edit Tempo"
+msgstr "Editar tempo"
+
+#: main_clock.cc:67 tempo_dialog.cc:429
+msgid "Edit Meter"
+msgstr "Editar métrica"
+
+#: main_clock.cc:68
+msgid "Insert Tempo Change"
+msgstr "Insertar cambio de tempo"
+
+#: main_clock.cc:69
+msgid "Insert Meter Change"
+msgstr "Insertar cambio de métrica"
+
+#: marker.cc:280
 msgid "MarkerText"
 msgstr "MarkerText"
 
 #: midi_channel_selector.cc:161 midi_channel_selector.cc:400
-#: midi_channel_selector.cc:436 rc_option_editor.cc:1573
-#: rc_option_editor.cc:2203 sfdb_ui.cc:665
+#: midi_channel_selector.cc:436 rc_option_editor.cc:2157
+#: rc_option_editor.cc:2799 sfdb_ui.cc:671
 msgid "None"
 msgstr "Ninguno"
 
@@ -7033,79 +8281,80 @@ msgstr "Forzar"
 
 #: midi_channel_selector.cc:328 midi_channel_selector.cc:370
 msgid "MIDI Channel Control"
-msgstr ""
+msgstr "Control de canales MIDI"
 
 #: midi_channel_selector.cc:330
 msgid "Playback all channels"
-msgstr ""
+msgstr "Reproducir todos los canales"
 
 #: midi_channel_selector.cc:331
 msgid "Play only selected channels"
-msgstr ""
+msgstr "Reproducir sólo los canales seleccionados"
 
 #: midi_channel_selector.cc:332
 msgid "Use a single fixed channel for all playback"
-msgstr ""
+msgstr "Usar un canal determinado para la reproducción"
 
 #: midi_channel_selector.cc:333
 msgid "Record all channels"
-msgstr ""
+msgstr "Grabar en todos los canales"
 
 #: midi_channel_selector.cc:334
 msgid "Record only selected channels"
-msgstr ""
+msgstr "Grabar sólo en los canales seleccionados"
 
 #: midi_channel_selector.cc:335
 msgid "Force all channels to 1 channel"
-msgstr ""
+msgstr "Forzar todos los canales a un único canal"
 
 #: midi_channel_selector.cc:376
 msgid "Inbound"
-msgstr ""
+msgstr "Entrada"
 
 #: midi_channel_selector.cc:396
 msgid "Click to enable recording all channels"
-msgstr ""
+msgstr "Pulsa para habilitar la grabación en todos los canales"
 
 #: midi_channel_selector.cc:401
 msgid "Click to disable recording all channels"
-msgstr ""
+msgstr "Pulsa para deshabilitar la grabación en todos los canales"
 
 #: midi_channel_selector.cc:406
 msgid "Click to invert currently selected recording channels"
-msgstr ""
+msgstr "Pulsa para invertir la selección actual de canales para grabación"
 
 #: midi_channel_selector.cc:413
 msgid "Playback"
-msgstr ""
+msgstr "Reproducción"
 
 #: midi_channel_selector.cc:432
 msgid "Click to enable playback of all channels"
-msgstr ""
+msgstr "Pulsa para habilitar la reproducción de todos los canales"
 
 #: midi_channel_selector.cc:437
 msgid "Click to disable playback of all channels"
-msgstr ""
+msgstr "Pulsa para deshabilitar la reproducción de todos lo canales"
 
 #: midi_channel_selector.cc:442
 msgid "Click to invert current selected playback channels"
 msgstr ""
+"Pulsa para invertir la selección actual de los canales para reproducción"
 
 #: midi_channel_selector.cc:620
 msgid "Click to toggle playback of channel %1"
-msgstr ""
+msgstr "Pulsa para conmutar reproducción del canal %1"
 
 #: midi_channel_selector.cc:628
 msgid "Click to force all MIDI channel messages to channel %1"
-msgstr ""
+msgstr "Pulsa para forzar todos los canales MIDI al canal %1"
 
-#: midi_channel_selector.cc:718
+#: midi_channel_selector.cc:720
 msgid "Click to toggle recording of channel %1"
-msgstr ""
+msgstr "Pulsa para conmutar grabación de canal %1"
 
-#: midi_channel_selector.cc:726
+#: midi_channel_selector.cc:728
 msgid "Click to force all recorded channels to %1"
-msgstr ""
+msgstr "Pulsa para forzar todos los canales de grabación a %1"
 
 #: midi_export_dialog.cc:35
 msgid "Export MIDI: %1"
@@ -7215,192 +8464,188 @@ msgstr "edición de canal"
 msgid "velocity edit"
 msgstr "editar intensidad"
 
-#: midi_region_view.cc:954
+#: midi_region_view.cc:962
 msgid "add note"
 msgstr "añadir nota"
 
-#: midi_region_view.cc:1885
+#: midi_region_view.cc:1904
 msgid "step add"
 msgstr ""
 
-#: midi_region_view.cc:1979 midi_region_view.cc:2002
+#: midi_region_view.cc:1998 midi_region_view.cc:2021
 msgid "alter patch change"
 msgstr "modificar cambio de patch"
 
-#: midi_region_view.cc:2038
+#: midi_region_view.cc:2057
 msgid "add patch change"
 msgstr "añadir cambio de patch"
 
-#: midi_region_view.cc:2060 midi_region_view.cc:2061
+#: midi_region_view.cc:2079 midi_region_view.cc:2080
 msgid "move patch change"
 msgstr "mover cambio de patch"
 
-#: midi_region_view.cc:2073 midi_region_view.cc:2074
+#: midi_region_view.cc:2092 midi_region_view.cc:2093
 msgid "delete patch change"
 msgstr "eliminar cambio de patch"
 
-#: midi_region_view.cc:2112
+#: midi_region_view.cc:2131
 msgid "delete selection"
 msgstr "eliminar selección"
 
-#: midi_region_view.cc:2128
+#: midi_region_view.cc:2148
 msgid "delete note"
 msgstr "eliminar nota"
 
-#: midi_region_view.cc:2587
+#: midi_region_view.cc:2589
 msgid "move notes"
 msgstr "mover notas"
 
-#: midi_region_view.cc:3070
+#: midi_region_view.cc:3139
 msgid "change velocities"
 msgstr "cambiar intensidades"
 
-#: midi_region_view.cc:3136
+#: midi_region_view.cc:3205
 msgid "transpose"
 msgstr "transportar"
 
-#: midi_region_view.cc:3164
+#: midi_region_view.cc:3233
 msgid "change note lengths"
 msgstr "cambiar duración de notas"
 
-#: midi_region_view.cc:3240
+#: midi_region_view.cc:3309
 msgid "nudge"
 msgstr "empujar"
 
-#: midi_region_view.cc:3255
+#: midi_region_view.cc:3324
 msgid "change channel"
 msgstr "cambiar canal"
 
-#: midi_region_view.cc:3295
+#: midi_region_view.cc:3372
 msgid "Bank "
 msgstr "Banco"
 
-#: midi_region_view.cc:3296
-msgid "Program "
-msgstr "Programa"
-
-#: midi_region_view.cc:3297
+#: midi_region_view.cc:3374
 msgid "Channel "
 msgstr "Canal"
 
-#: midi_region_view.cc:3484
+#: midi_region_view.cc:3561
 msgid "paste"
 msgstr "pegar"
 
-#: midi_streamview.cc:185
+#: midi_streamview.cc:184
 msgid "attempt to display MIDI region with no source"
 msgstr ""
 
-#: midi_streamview.cc:195
+#: midi_streamview.cc:194
 msgid "attempt to display MIDI region with no model"
 msgstr ""
 
-#: midi_streamview.cc:506
+#: midi_streamview.cc:505
 msgid "failed to create MIDI region"
 msgstr ""
 
-#: midi_time_axis.cc:309
+#: midi_time_axis.cc:306
 msgid "External MIDI Device"
 msgstr "Dispositivo MIDI externo"
 
-#: midi_time_axis.cc:310
+#: midi_time_axis.cc:307
 msgid "External Device Mode"
 msgstr "Modo de dispositivo externo"
 
-#: midi_time_axis.cc:318
+#: midi_time_axis.cc:315
 msgid "Chns"
 msgstr ""
 
-#: midi_time_axis.cc:320
+#: midi_time_axis.cc:317
 msgid "Click to edit channel settings"
-msgstr ""
+msgstr "Pulsa para editar los ajustes de canales"
 
-#: midi_time_axis.cc:519
+#: midi_time_axis.cc:516
 msgid "Show Full Range"
 msgstr "Mostrar rango completo"
 
-#: midi_time_axis.cc:524
+#: midi_time_axis.cc:521
 msgid "Fit Contents"
 msgstr "Ajustar contenidos"
 
-#: midi_time_axis.cc:528
+#: midi_time_axis.cc:525
 msgid "Note Range"
 msgstr "Rango de notas"
 
-#: midi_time_axis.cc:529
+#: midi_time_axis.cc:526
 msgid "Note Mode"
 msgstr "Modo de notas"
 
-#: midi_time_axis.cc:530
+#: midi_time_axis.cc:527
 msgid "Channel Selector"
 msgstr ""
 
-#: midi_time_axis.cc:535
+#: midi_time_axis.cc:532
 msgid "Color Mode"
 msgstr "Modo color"
 
-#: midi_time_axis.cc:594
+#: midi_time_axis.cc:591
 msgid "Bender"
 msgstr "Bender"
 
-#: midi_time_axis.cc:598
+#: midi_time_axis.cc:595
 msgid "Pressure"
 msgstr "Presión"
 
-#: midi_time_axis.cc:610
+#: midi_time_axis.cc:607
 msgid "Controllers"
 msgstr "Controladores"
 
-#: midi_time_axis.cc:615
+#: midi_time_axis.cc:612
 msgid "No MIDI Channels selected"
 msgstr "No hay canales MIDI seleccionados"
 
-#: midi_time_axis.cc:672 midi_time_axis.cc:801
+#: midi_time_axis.cc:669 midi_time_axis.cc:798
 msgid "Hide all channels"
 msgstr "Ocultar todos los canales"
 
-#: midi_time_axis.cc:676 midi_time_axis.cc:805
+#: midi_time_axis.cc:673 midi_time_axis.cc:802
 msgid "Show all channels"
 msgstr "Mostrar todos los canales"
 
-#: midi_time_axis.cc:687 midi_time_axis.cc:816
+#: midi_time_axis.cc:684 midi_time_axis.cc:813
 msgid "Channel %1"
 msgstr "Canal %1"
 
-#: midi_time_axis.cc:942 midi_time_axis.cc:974
+#: midi_time_axis.cc:939 midi_time_axis.cc:971
 msgid "Controllers %1-%2"
 msgstr "Controladores %1-%2"
 
-#: midi_time_axis.cc:965 midi_time_axis.cc:968
+#: midi_time_axis.cc:962 midi_time_axis.cc:965
 msgid "Controller %1"
 msgstr "Controlador %1"
 
-#: midi_time_axis.cc:991
+#: midi_time_axis.cc:988
 msgid "Sustained"
 msgstr "Sostenido"
 
-#: midi_time_axis.cc:998
+#: midi_time_axis.cc:995
 msgid "Percussive"
 msgstr "Percusivo"
 
-#: midi_time_axis.cc:1018
+#: midi_time_axis.cc:1015
 msgid "Meter Colors"
 msgstr "Colores de medidor"
 
-#: midi_time_axis.cc:1025
+#: midi_time_axis.cc:1022
 msgid "Channel Colors"
 msgstr "Colores de canal"
 
-#: midi_time_axis.cc:1032
+#: midi_time_axis.cc:1029
 msgid "Track Color"
 msgstr "Color de pista"
 
-#: midi_time_axis.cc:1606 midi_time_axis.cc:1612 midi_time_axis.cc:1622
-#: midi_time_axis.cc:1628
+#: midi_time_axis.cc:1610 midi_time_axis.cc:1616 midi_time_axis.cc:1626
+#: midi_time_axis.cc:1632
 msgid "all"
 msgstr ""
 
-#: midi_time_axis.cc:1609 midi_time_axis.cc:1625
+#: midi_time_axis.cc:1613 midi_time_axis.cc:1629
 msgid "some"
 msgstr ""
 
@@ -7417,7 +8662,7 @@ msgstr "Auto-Scroll"
 msgid "Decimal"
 msgstr "Decimal"
 
-#: midi_tracer.cc:57 rc_option_editor.cc:740
+#: midi_tracer.cc:57 rc_option_editor.cc:1356
 msgid "Enabled"
 msgstr "Habilitado"
 
@@ -7433,35 +8678,36 @@ msgstr "Puerto:"
 msgid "New velocity"
 msgstr "Nueva intensidad"
 
-#: missing_file_dialog.cc:35
+#: missing_file_dialog.cc:36
 msgid "Missing File"
 msgstr ""
 
-#: missing_file_dialog.cc:37
+#: missing_file_dialog.cc:38
 msgid "Select a folder to search"
 msgstr "Seleccionar una carpeta para buscar"
 
-#: missing_file_dialog.cc:38
+#: missing_file_dialog.cc:39
 msgid "Add chosen folder to search path, and try again"
 msgstr "Añade la carpeta seleccionada a la ruta de búsqueda y prueba otra vez"
 
-#: missing_file_dialog.cc:40
+#: missing_file_dialog.cc:41
 msgid "Stop loading this session"
 msgstr "Dejar de cargar esta sesión"
 
-#: missing_file_dialog.cc:41
+#: missing_file_dialog.cc:42
 msgid "Skip all missing files"
 msgstr "Omitir todos los archivos ausentes"
 
-#: missing_file_dialog.cc:42
+#: missing_file_dialog.cc:43
 msgid "Skip this file"
 msgstr "Omitir este archivo"
 
-#: missing_file_dialog.cc:53
+#: missing_file_dialog.cc:57 tempo_dialog.cc:135 tempo_dialog.cc:136
+#: tempo_dialog.cc:484 tempo_dialog.cc:485
 msgid "audio"
 msgstr "audio"
 
-#: missing_file_dialog.cc:70
+#: missing_file_dialog.cc:74
 msgid ""
 "%1 cannot find the %2 file\n"
 "\n"
@@ -7481,7 +8727,7 @@ msgstr ""
 "<tt>%4</tt>\n"
 "\n"
 
-#: missing_file_dialog.cc:104
+#: missing_file_dialog.cc:108
 msgid "Click to choose an additional folder"
 msgstr "Pulsa para elegir una carpeta adicional"
 
@@ -7489,98 +8735,40 @@ msgstr "Pulsa para elegir una carpeta adicional"
 msgid "Missing Plugins"
 msgstr "Plugins ausentes"
 
-#: missing_plugin_dialog.cc:33 transcode_video_dialog.cc:60
+#: missing_plugin_dialog.cc:36 transcode_video_dialog.cc:60
 msgid "OK"
 msgstr "OK"
 
-#: mixer_actor.cc:55
-msgid "Toggle Solo on Mixer-Selected Tracks/Busses"
-msgstr "Conmutar solo en pistas/buses seleccionadas en Mezclador"
-
-#: mixer_actor.cc:56
-msgid "Toggle Mute on Mixer-Selected Tracks/Busses"
-msgstr "Conmutar mudo en pistas/buses seleccionadas en Mezclador"
+#: missing_plugin_dialog.cc:42
+msgid ""
+"This session contains the following plugins that cannot be found on this "
+"system:\n"
+"\n"
+msgstr ""
 
-#: mixer_actor.cc:57
-msgid "Toggle Rec-enable on Mixer-Selected Tracks/Busses"
-msgstr ""
-"Activar/Desactivar grabación en pistas/buses seleccionadas en Mezclador"
-
-#: mixer_actor.cc:58
-msgid "Decrease Gain on Mixer-Selected Tracks/Busses"
-msgstr ""
-
-#: mixer_actor.cc:59
-msgid "Increase Gain on Mixer-Selected Tracks/Busses"
-msgstr ""
-
-#: mixer_actor.cc:60
-msgid "Set Gain to 0dB on Mixer-Selected Tracks/Busses"
-msgstr ""
-
-#: mixer_actor.cc:63
-msgid "Copy Selected Processors"
-msgstr "Copiar procesadores seleccionados"
-
-#: mixer_actor.cc:64
-msgid "Cut Selected Processors"
-msgstr "Cortar procesadores seleccionados"
-
-#: mixer_actor.cc:65
-msgid "Paste Selected Processors"
-msgstr "Pegar procesadores seleccionados"
-
-#: mixer_actor.cc:66
-msgid "Delete Selected Processors"
-msgstr "Eliminar procesadores seleccionados"
-
-#: mixer_actor.cc:67
-msgid "Select All (visible) Processors"
-msgstr "Seleccionar todos los procesadores (visibles)"
-
-#: mixer_actor.cc:68
-msgid "Toggle Selected Processors"
-msgstr "Conmutar procesadores seleccionados"
-
-#: mixer_actor.cc:69
-msgid "Toggle Selected Plugins"
-msgstr "Conmutar plugins seleccionados"
-
-#: mixer_actor.cc:70
-msgid "Deselect all strips and processors"
-msgstr ""
-
-#: mixer_actor.cc:72 mixer_actor.cc:73
-msgid "Scroll Mixer Window to the left"
-msgstr ""
-
-#: mixer_actor.cc:75
-msgid "Toggle MIDI Input Active for Mixer-Selected Tracks/Busses"
-msgstr ""
-"Conmutar Entrada MIDI activa para pistas/buses seleccionadas en Mezclador"
-
-#: mixer_actor.cc:90
-msgid "Loaded mixer bindings from %1"
-msgstr ""
-
-#: mixer_actor.cc:92
-msgid "Could not find mixer.bindings in search path %1"
+#: missing_plugin_dialog.cc:48
+msgid ""
+"\n"
+"Those plugins will be replaced with inactive stubs.\n"
+"It is recommended that you install the missing plugins and re-load the "
+"session.\n"
+"(also check the blacklist, Window > Log and Preferences > Plugins)"
 msgstr ""
 
-#: mixer_strip.cc:96 mixer_strip.cc:125
+#: mixer_strip.cc:100 mixer_strip.cc:133
 msgid "pre"
 msgstr "pre"
 
-#: mixer_strip.cc:98 mixer_strip.cc:127 mixer_strip.cc:372 mixer_strip.cc:1410
-#: rc_option_editor.cc:2331
+#: mixer_strip.cc:104 mixer_strip.cc:136 mixer_strip.cc:397
+#: mixer_strip.cc:1540 mixer_strip.cc:1551 rc_option_editor.cc:3140
 msgid "Comments"
 msgstr "Comentarios"
 
-#: mixer_strip.cc:149
+#: mixer_strip.cc:160
 msgid "Click to toggle the width of this mixer strip."
 msgstr "Conmutar anchura de este canal de mezcla."
 
-#: mixer_strip.cc:151
+#: mixer_strip.cc:162
 msgid ""
 "\n"
 "%1-%2-click to toggle the width of all strips."
@@ -7588,287 +8776,460 @@ msgstr ""
 "\n"
 "%1-%2-clic para conmutar la anchura de todos los canales."
 
-#: mixer_strip.cc:158
+#: mixer_strip.cc:171
 msgid "Hide this mixer strip"
 msgstr "Ocultar este canal del mezclador"
 
-#: mixer_strip.cc:169
+#: mixer_strip.cc:182
 msgid "Click to select metering point"
 msgstr "Selección de punto de medición"
 
-#: mixer_strip.cc:185
+#: mixer_strip.cc:198
 msgid "Isolate Solo"
 msgstr "Solo aislado"
 
-#: mixer_strip.cc:193
+#: mixer_strip.cc:206
 msgid "Lock Solo Status"
 msgstr "Bloquear estado de solo"
 
-#: mixer_strip.cc:196 mixer_strip.cc:2027
+#: mixer_strip.cc:208 mixer_strip.cc:2225
+msgid "SoloLock|Lock"
+msgstr "Lock"
+
+#: mixer_strip.cc:209 mixer_strip.cc:2224
 msgid "Iso"
 msgstr ""
 
-#: mixer_strip.cc:250
+#: mixer_strip.cc:263
 msgid "Mix group"
 msgstr "Grupo de mezcla"
 
-#: mixer_strip.cc:368 rc_option_editor.cc:2327
+#: mixer_strip.cc:275
+msgid "Trim: "
+msgstr "Recortar:"
+
+#: mixer_strip.cc:393 rc_option_editor.cc:3136
 msgid "Phase Invert"
 msgstr "Inversión de fase"
 
-#: mixer_strip.cc:369 rc_option_editor.cc:2328
+#: mixer_strip.cc:394 rc_option_editor.cc:3137
 msgid "Record & Monitor"
 msgstr "Grabar y monitorizar"
 
-#: mixer_strip.cc:370 rc_option_editor.cc:2329
+#: mixer_strip.cc:395 rc_option_editor.cc:3138
 msgid "Solo Iso / Lock"
 msgstr "Solo Iso / Lock"
 
-#: mixer_strip.cc:524
+#: mixer_strip.cc:398 rc_option_editor.cc:3141
+msgid "VCA Assigns"
+msgstr ""
+
+#: mixer_strip.cc:531
+msgid "Show/Hide Monitoring Section"
+msgstr "Mostrar/Ocultar sección de monitorización"
+
+#: mixer_strip.cc:583
 msgid "Enable/Disable MIDI input"
 msgstr "Activar/Desactivar entrada MIDI"
 
-#: mixer_strip.cc:688
+#: mixer_strip.cc:749
 msgid "Aux"
 msgstr "Aux"
 
-#: mixer_strip.cc:710
+#: mixer_strip.cc:775
 msgid "Snd"
 msgstr "Snd"
 
-#: mixer_strip.cc:776 mixer_strip.cc:879 processor_box.cc:2382
+#: mixer_strip.cc:846 mixer_strip.cc:951 processor_box.cc:3594
 msgid "Not connected to audio engine - no I/O changes are possible"
 msgstr ""
 
-#: mixer_strip.cc:833 mixer_strip.cc:935
+#: mixer_strip.cc:904 mixer_strip.cc:1007
 msgid "Add %1 port"
-msgstr ""
+msgstr "Añadir %1 puertos"
 
-#: mixer_strip.cc:840 mixer_strip.cc:942
+#: mixer_strip.cc:912 mixer_strip.cc:1014 monitor_section.cc:1466
+#: plugin_pin_dialog.cc:1782
 msgid "Routing Grid"
 msgstr ""
 
-#: mixer_strip.cc:1171
+#: mixer_strip.cc:1291
+msgid "MIDI "
+msgstr "MIDI "
+
+#: mixer_strip.cc:1295
 msgid "<b>INPUT</b> to %1"
 msgstr "<b>ENTRADA</b> a %1"
 
-#: mixer_strip.cc:1174
+#: mixer_strip.cc:1297 monitor_section.cc:1511
 msgid "<b>OUTPUT</b> from %1"
 msgstr "<b>SALIDA</b> desde %1"
 
-#: mixer_strip.cc:1287
+#: mixer_strip.cc:1410 monitor_section.cc:1598
 msgid "Disconnected"
 msgstr "Desconectado"
 
-#: mixer_strip.cc:1413
-msgid "*Comments*"
-msgstr "*Comentarios*"
+#: mixer_strip.cc:1536
+msgid "Click to add/edit comments"
+msgstr "Pulsa para añadir o editar comentarios"
 
-#: mixer_strip.cc:1420
+#: mixer_strip.cc:1540 mixer_strip.cc:1551
 msgid "Cmt"
 msgstr "Cmt"
 
-#: mixer_strip.cc:1423
-msgid "*Cmt*"
-msgstr ""
-
-#: mixer_strip.cc:1429
-msgid "Click to Add/Edit Comments"
-msgstr "Clicar para añadir o editar comentarios"
-
-#: mixer_strip.cc:1473
+#: mixer_strip.cc:1596
 msgid "Grp"
 msgstr "Grp"
 
-#: mixer_strip.cc:1476
+#: mixer_strip.cc:1599
 msgid "~G"
 msgstr "~G"
 
-#: mixer_strip.cc:1505 route_time_axis.cc:561
+#: mixer_strip.cc:1640 route_time_axis.cc:585 vca_master_strip.cc:396
 msgid "Color..."
 msgstr "Color..."
 
-#: mixer_strip.cc:1507 route_time_axis.cc:563
+#: mixer_strip.cc:1642 route_time_axis.cc:587
 msgid "Comments..."
 msgstr "Notas..."
 
-#: mixer_strip.cc:1509 route_time_axis.cc:565
+#: mixer_strip.cc:1644 route_time_axis.cc:589
 msgid "Inputs..."
 msgstr ""
 
-#: mixer_strip.cc:1511 route_time_axis.cc:567
+#: mixer_strip.cc:1646 route_time_axis.cc:591
 msgid "Outputs..."
 msgstr ""
 
-#: mixer_strip.cc:1516
+#: mixer_strip.cc:1651
 msgid "Save As Template..."
 msgstr "Guardar como plantilla..."
 
-#: mixer_strip.cc:1530
+#: mixer_strip.cc:1657 route_group_dialog.cc:45 route_time_axis.cc:851
+msgid "Active"
+msgstr "Activo"
+
+#: mixer_strip.cc:1673 plugin_pin_dialog.cc:1011
+msgid "Strict I/O"
+msgstr "E/S estricto"
+
+#: mixer_strip.cc:1683 processor_box.cc:3710
+msgid "Pin Connections..."
+msgstr "Pin Connections..."
+
+#: mixer_strip.cc:1679
 msgid "Adjust Latency..."
 msgstr "Ajustar latencia..."
 
-#: mixer_strip.cc:1533
+#: mixer_strip.cc:1682
 msgid "Protect Against Denormals"
 msgstr "Proteger contra denormals"
 
-#: mixer_strip.cc:1539 route_time_axis.cc:580
-msgid "Remote Control ID..."
-msgstr "ID de control remoto..."
+#: mixer_strip.cc:1709 route_time_axis.cc:867
+msgid "Duplicate..."
+msgstr "Duplicar..."
 
-#: mixer_strip.cc:1823
+#: mixer_strip.cc:1996
 msgid "Pre"
 msgstr ""
 
-#: mixer_strip.cc:1827
+#: mixer_strip.cc:2000
 msgid "Post"
 msgstr ""
 
-#: mixer_strip.cc:1847
-msgid "Pr"
+#: mixer_strip.cc:2016
+msgid "Meter|In"
+msgstr ""
+
+#: mixer_strip.cc:2020
+msgid "Meter|Pr"
+msgstr ""
+
+#: mixer_strip.cc:2024
+msgid "Meter|Po"
 msgstr ""
 
-#: mixer_strip.cc:1851
-msgid "Po"
+#: mixer_strip.cc:2028
+msgid "Meter|O"
 msgstr ""
 
-#: mixer_strip.cc:1860
-msgid "C"
+#: mixer_strip.cc:2033
+msgid "Meter|C"
 msgstr ""
 
-#: mixer_strip.cc:2008 route_ui.cc:168
+#: mixer_strip.cc:2194 route_ui.cc:193
 msgid "Disk"
 msgstr "Disco"
 
-#: mixer_strip.cc:2020 monitor_section.cc:70
+#: mixer_strip.cc:2204
+msgid "Mon"
+msgstr "Mon"
+
+#: mixer_strip.cc:2209 monitor_section.cc:81
 msgid "AFL"
 msgstr "AFL"
 
-#: mixer_strip.cc:2023 monitor_section.cc:71
+#: mixer_strip.cc:2212 monitor_section.cc:82
 msgid "PFL"
 msgstr "PFL"
 
-#: mixer_strip.cc:2034 meter_strip.cc:380
-msgid "D"
-msgstr "D"
+#: mixer_strip.cc:2222 meter_strip.cc:385
+msgid "MonitorInput|I"
+msgstr ""
+
+#: mixer_strip.cc:2223 meter_strip.cc:386
+msgid "MonitorDisk|D"
+msgstr ""
+
+#: mixer_strip.cc:2233
+msgid "Mon|O"
+msgstr "Mon|O"
+
+#: mixer_strip.cc:2238 meter_strip.cc:377 route_time_axis.cc:2730
+#: vca_master_strip.cc:202 vca_time_axis.cc:227
+msgid "AfterFader|A"
+msgstr ""
 
 #: mixer_strip.cc:2241
+msgid "Prefader|P"
+msgstr ""
+
+#: mixer_strip.cc:2246
+msgid "SoloIso|I"
+msgstr ""
+
+#: mixer_strip.cc:2247
+msgid "SoloLock|L"
+msgstr ""
+
+#: mixer_strip.cc:2452
 msgid "Pre Fader"
 msgstr "Pre-Fader"
 
-#: mixer_strip.cc:2242
+#: mixer_strip.cc:2453
 msgid "Post Fader"
 msgstr "Post-Fader"
 
-#: mixer_strip.cc:2286 meter_strip.cc:847
+#: mixer_strip.cc:2498 meter_strip.cc:858
 msgid "Change all in Group to %1"
 msgstr ""
 
-#: mixer_strip.cc:2288 meter_strip.cc:849
+#: mixer_strip.cc:2500 meter_strip.cc:860
 msgid "Change all to %1"
 msgstr ""
 
-#: mixer_strip.cc:2290 meter_strip.cc:851
+#: mixer_strip.cc:2502 meter_strip.cc:862
 msgid "Change same track-type to %1"
 msgstr ""
 
-#: mixer_ui.cc:130 route_time_axis.cc:818
+#: mixer_ui.cc:152 route_time_axis.cc:828
 msgid "Group"
 msgstr "Grupo"
 
-#: mixer_ui.cc:1224
+#: mixer_ui.cc:221
+msgid "Favorite Plugins"
+msgstr "Plugins favoritos"
+
+#: mixer_ui.cc:627
+msgid "Error adding GUI elements for new tracks/busses %1"
+msgstr ""
+
+#: mixer_ui.cc:1542
 msgid "track display list item for renamed strip not found!"
 msgstr ""
 
-#: mixer_ui.cc:1316
+#: mixer_ui.cc:1636
 msgid "-all-"
 msgstr "-todos-"
 
-#: mixer_ui.cc:1853
+#: mixer_ui.cc:2135
 msgid "Strips"
 msgstr "Canales"
 
-#: meter_strip.cc:157
+#: mixer_ui.cc:2479
+msgid "No Track/Bus is selected."
+msgstr "No hay pista o bus seleccionado."
+
+#: mixer_ui.cc:2481
+msgid "Add at the top"
+msgstr "Añadir arriba del todo"
+
+#: mixer_ui.cc:2483
+msgid "Add Pre-Fader"
+msgstr "Añadir pre-Fader"
+
+#: mixer_ui.cc:2485
+msgid "Add Post-Fader"
+msgstr "Añadir post-Fader"
+
+#: mixer_ui.cc:2487
+msgid "Add at the end"
+msgstr "Añadir al final"
+
+#: mixer_ui.cc:2493
+msgid "Remove from favorites"
+msgstr "Eliminar de favoritos"
+
+#: mixer_ui.cc:2499
+msgid "Delete Preset"
+msgstr "Eliminar preset"
+
+#: mixer_ui.cc:2739
+msgid "Toggle Solo on Mixer-Selected Tracks/Busses"
+msgstr "Conmutar solo en pistas/buses seleccionadas en Mezclador"
+
+#: mixer_ui.cc:2740
+msgid "Toggle Mute on Mixer-Selected Tracks/Busses"
+msgstr "Conmutar mudo en pistas/buses seleccionadas en Mezclador"
+
+#: mixer_ui.cc:2741
+msgid "Toggle Rec-enable on Mixer-Selected Tracks/Busses"
+msgstr ""
+"Activar/Desactivar grabación en pistas/buses seleccionadas en Mezclador"
+
+#: mixer_ui.cc:2742
+msgid "Decrease Gain on Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: mixer_ui.cc:2743
+msgid "Increase Gain on Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: mixer_ui.cc:2744
+msgid "Set Gain to 0dB on Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: mixer_ui.cc:2747
+msgid "Copy Selected Processors"
+msgstr "Copiar procesadores seleccionados"
+
+#: mixer_ui.cc:2748
+msgid "Cut Selected Processors"
+msgstr "Cortar procesadores seleccionados"
+
+#: mixer_ui.cc:2749
+msgid "Paste Selected Processors"
+msgstr "Pegar procesadores seleccionados"
+
+#: mixer_ui.cc:2750
+msgid "Delete Selected Processors"
+msgstr "Eliminar procesadores seleccionados"
+
+#: mixer_ui.cc:2751
+msgid "Select All (visible) Processors"
+msgstr "Seleccionar todos los procesadores (visibles)"
+
+#: mixer_ui.cc:2752
+msgid "Toggle Selected Processors"
+msgstr "Conmutar procesadores seleccionados"
+
+#: mixer_ui.cc:2753
+msgid "Toggle Selected Plugins"
+msgstr "Conmutar plugins seleccionados"
+
+#: mixer_ui.cc:2754
+msgid "Deselect all strips and processors"
+msgstr "Deselect all strips and processors"
+
+#: mixer_ui.cc:2756 mixer_ui.cc:2757
+msgid "Scroll Mixer Window to the left"
+msgstr ""
+
+#: mixer_ui.cc:2759
+msgid "Toggle MIDI Input Active for Mixer-Selected Tracks/Busses"
+msgstr ""
+"Conmutar Entrada MIDI activa para pistas/buses seleccionadas en Mezclador"
+
+#: meter_strip.cc:160
 msgid "Reset Peak"
 msgstr ""
 
-#: meter_strip.cc:883
+#: meter_strip.cc:380 route_time_axis.cc:2734 vca_master_strip.cc:206
+#: vca_time_axis.cc:231
+msgid "PreFader|P"
+msgstr ""
+
+#: meter_strip.cc:894
 msgid "Variable height"
 msgstr ""
 
-#: meter_strip.cc:884
+#: meter_strip.cc:895
 msgid "Short"
 msgstr ""
 
-#: meter_strip.cc:885
+#: meter_strip.cc:896
 msgid "Tall"
 msgstr ""
 
-#: meter_strip.cc:886
+#: meter_strip.cc:897
 msgid "Grande"
 msgstr ""
 
-#: meter_strip.cc:887
+#: meter_strip.cc:898
 msgid "Venti"
 msgstr ""
 
-#: meter_patterns.cc:82
-msgid "Peak"
+#: meter_patterns.cc:84
+msgid "Peak (+6dBFS)"
 msgstr ""
 
-#: meter_patterns.cc:85
+#: meter_patterns.cc:87
+msgid "Peak (0dBFS)"
+msgstr ""
+
+#: meter_patterns.cc:90
 msgid "RMS + Peak"
 msgstr ""
 
-#: meter_patterns.cc:88
+#: meter_patterns.cc:93
 msgid "IEC1/DIN"
 msgstr ""
 
-#: meter_patterns.cc:91
+#: meter_patterns.cc:96
 msgid "IEC1/Nordic"
 msgstr ""
 
-#: meter_patterns.cc:94
+#: meter_patterns.cc:99
 msgid "IEC2/BBC"
 msgstr ""
 
-#: meter_patterns.cc:97
+#: meter_patterns.cc:102
 msgid "IEC2/EBU"
 msgstr ""
 
-#: meter_patterns.cc:100
-msgid "K20"
+#: meter_patterns.cc:105
+msgid "K20/RMS"
 msgstr ""
 
-#: meter_patterns.cc:103
-msgid "K14"
+#: meter_patterns.cc:108
+msgid "K14/RMS"
 msgstr ""
 
-#: meter_patterns.cc:106
-msgid "K12"
+#: meter_patterns.cc:111
+msgid "K12/RMS"
 msgstr ""
 
-#: meter_patterns.cc:109
+#: meter_patterns.cc:114
 msgid "VU"
 msgstr ""
 
-#: monitor_section.cc:69
+#: monitor_section.cc:80
 msgid "SiP"
 msgstr "SiP"
 
-#: monitor_section.cc:96 route_group_dialog.cc:49
+#: monitor_section.cc:113 route_group_dialog.cc:49
 msgid "Soloing"
 msgstr "Solos"
 
-#: monitor_section.cc:100
+#: monitor_section.cc:117
 msgid "Isolated"
 msgstr ""
 
-#: monitor_section.cc:104
+#: monitor_section.cc:121
 msgid "Auditioning"
 msgstr ""
 
-#: monitor_section.cc:114
+#: monitor_section.cc:132
 msgid ""
 "When active, something is solo-isolated.\n"
 "Click to de-isolate everything"
@@ -7876,7 +9237,7 @@ msgstr ""
 "Cuando está activo, algo está en solo aislado.\n"
 "Pulsa para que nada esté aislado"
 
-#: monitor_section.cc:117
+#: monitor_section.cc:135
 msgid ""
 "When active, auditioning is active.\n"
 "Click to stop the audition"
@@ -7884,133 +9245,208 @@ msgstr ""
 "Si está activado, se está produciendo escucha.\n"
 "Pulsa para detener la escucha"
 
-#: monitor_section.cc:134
+#: monitor_section.cc:152
 msgid "Solo controls affect solo-in-place"
 msgstr "Los controles de solo afectan solo-in-situ"
 
-#: monitor_section.cc:140
+#: monitor_section.cc:158
 msgid "Solo controls toggle after-fader-listen"
 msgstr "Los controles de solo conmutan escucha-post-fader"
 
-#: monitor_section.cc:146
+#: monitor_section.cc:164
 msgid "Solo controls toggle pre-fader-listen"
 msgstr "Los controles de solo conmutan escucha-pre-fader"
 
-#: monitor_section.cc:156
+#: monitor_section.cc:170
+msgid "Excl. Solo"
+msgstr ""
+
+#: monitor_section.cc:172
+msgid "Exclusive solo means that only 1 solo is active at a time"
+msgstr ""
+"Solo exclusivo significa que solamente 1 solo está activo en un momento dado"
+
+#: monitor_section.cc:179
+msgid "Solo » Mute"
+msgstr ""
+
+#: monitor_section.cc:181
+msgid ""
+"If enabled, solo will override mute\n"
+"(a soloed & muted track or bus will be audible)"
+msgstr ""
+"Si está habilitado, el solo tendrá preferencia sobre el mudo\n"
+"(una pista o bus en solo y mudo al mismo tiempo será audible)"
+
+#: monitor_section.cc:189
+msgid "Processors"
+msgstr "Procesadores"
+
+#: monitor_section.cc:191
+msgid "Allow one to add monitor effect processors"
+msgstr ""
+
+#: monitor_section.cc:206
 msgid "Gain increase for soloed signals (0dB is normal)"
 msgstr "Incremento de ganancia para señales en solo (0dB es normal)"
 
-#: monitor_section.cc:170
+#: monitor_section.cc:210 monitor_section.cc:227 monitor_section.cc:244
+#: monitor_section.cc:289
+msgid "0 dB"
+msgstr ""
+
+#: monitor_section.cc:211
+msgid "3 dB"
+msgstr ""
+
+#: monitor_section.cc:212
+msgid "6 dB"
+msgstr ""
+
+#: monitor_section.cc:213
+msgid "10 dB"
+msgstr ""
+
+#: monitor_section.cc:215
 msgid "Solo Boost"
 msgstr ""
 
-#: monitor_section.cc:185
+#: monitor_section.cc:222
 msgid ""
 "Gain reduction non-soloed signals\n"
 "A value above -inf dB causes \"solo-in-front\""
 msgstr ""
 
-#: monitor_section.cc:196
-msgid "SiP Cut"
-msgstr "Cortar SiP"
-
-#: monitor_section.cc:211
-msgid "Gain reduction to use when dimming monitor outputs"
+#: monitor_section.cc:228 monitor_section.cc:246 monitor_section.cc:291
+msgid "-6 dB"
 msgstr ""
 
-#: monitor_section.cc:225 monitor_section.cc:283
-msgid "Dim"
-msgstr "Dim"
+#: monitor_section.cc:229 monitor_section.cc:247 monitor_section.cc:292
+msgid "-12 dB"
+msgstr ""
 
-#: monitor_section.cc:235
-msgid "Excl. Solo"
+#: monitor_section.cc:230 monitor_section.cc:248 monitor_section.cc:293
+msgid "-20 dB"
 msgstr ""
 
-#: monitor_section.cc:237
-msgid "Exclusive solo means that only 1 solo is active at a time"
+#: monitor_section.cc:231
+msgid "OFF"
 msgstr ""
-"Solo exclusivo significa que solamente 1 solo está activo en un momento dado"
 
-#: monitor_section.cc:244
-msgid "Solo » Mute"
+#: monitor_section.cc:233
+msgid "SiP Cut"
+msgstr "Cortar SiP"
+
+#: monitor_section.cc:240
+msgid "Gain reduction to use when dimming monitor outputs"
 msgstr ""
 
-#: monitor_section.cc:246
-msgid ""
-"If enabled, solo will override mute\n"
-"(a soloed & muted track or bus will be audible)"
+#: monitor_section.cc:245 monitor_section.cc:290
+msgid "-3 dB"
 msgstr ""
-"Si está habilitado, el solo tendrá preferencia sobre el mudo\n"
-"(una pista o bus en solo y mudo al mismo tiempo será audible)"
 
-#: monitor_section.cc:323
+#: monitor_section.cc:250 monitor_section.cc:264 monitor_section.cc:325
+msgid "Dim"
+msgstr "Dim"
+
+#: monitor_section.cc:294
+msgid "-30 dB"
+msgstr "-30 dB"
+
+#: monitor_section.cc:333
+msgid "Inv"
+msgstr "Inv"
+
+#: monitor_section.cc:399
 msgid "Monitor"
 msgstr "Monitorizar"
 
-#: monitor_section.cc:744
+#: monitor_section.cc:897
 msgid "Switch monitor to mono"
 msgstr "Cambiar monitor a mono"
 
-#: monitor_section.cc:747
+#: monitor_section.cc:900
 msgid "Cut monitor"
 msgstr "Cortar monitor"
 
-#: monitor_section.cc:750
+#: monitor_section.cc:903
 msgid "Dim monitor"
 msgstr "Atenuar monitor"
 
-#: monitor_section.cc:753
+#: monitor_section.cc:906
 msgid "Toggle exclusive solo mode"
 msgstr "Activar/desactivar modo de solo exclusivo"
 
-#: monitor_section.cc:759
+#: monitor_section.cc:912
 msgid "Toggle mute overrides solo mode"
 msgstr "Mudo anula solo"
 
-#: monitor_section.cc:771
+#: monitor_section.cc:921
 msgid "Cut monitor channel %1"
 msgstr "Cortar canal de monitorización %1"
 
-#: monitor_section.cc:776
+#: monitor_section.cc:926
 msgid "Dim monitor channel %1"
 msgstr "Atenuar canal de monitorización %1"
 
-#: monitor_section.cc:781
+#: monitor_section.cc:931
 msgid "Solo monitor channel %1"
 msgstr "Poner en solo canal de monitorización %1"
 
-#: monitor_section.cc:786
+#: monitor_section.cc:936
 msgid "Invert monitor channel %1"
 msgstr "Invertir canal de monitorización %1"
 
-#: monitor_section.cc:796
+#: monitor_section.cc:946
 msgid "In-place solo"
 msgstr ""
 
-#: monitor_section.cc:798
+#: monitor_section.cc:948
 msgid "After Fade Listen (AFL) solo"
 msgstr "Escucha Post-fader (AFL) solo"
 
-#: monitor_section.cc:800
+#: monitor_section.cc:950
 msgid "Pre Fade Listen (PFL) solo"
 msgstr "Escucha pre-fader (PFL) solo"
 
-#: mono_panner.cc:109 stereo_panner.cc:119
+#: monitor_section.cc:953
+msgid "Toggle Monitor Section Processor Box"
+msgstr "Toggle Monitor Section Processor Box"
+
+#: monitor_section.cc:1413
+msgid "No session - no I/O changes are possible"
+msgstr ""
+
+#: monitor_selector.cc:199
+msgid "Monitor output selector"
+msgstr ""
+
+#: mono_panner.cc:105 stereo_panner.cc:115
 msgid "bypassed"
 msgstr ""
 
-#: mono_panner.cc:123
+#: mono_panner.cc:119
 #, c-format
 msgid "L:%3d R:%3d"
 msgstr ""
 
+#: mono_panner.cc:203 panner2d.cc:276 stereo_panner.cc:252
+#: stereo_panner.cc:275
+msgid "Panner|L"
+msgstr ""
+
+#: mono_panner.cc:220 panner2d.cc:277 stereo_panner.cc:250
+#: stereo_panner.cc:277
+msgid "Panner|R"
+msgstr ""
+
 # Aquí estaaba panorámica, pero pan se entiende perfectamente y es mucho más corto
-#: mono_panner_editor.cc:33
+#: mono_panner_editor.cc:35
 msgid "Mono Panner"
-msgstr "Paner mono"
+msgstr "Pan mono"
 
-#: mono_panner_editor.cc:44 mono_panner_editor.cc:49
-#: stereo_panner_editor.cc:46 stereo_panner_editor.cc:51
+#: mono_panner_editor.cc:46 mono_panner_editor.cc:51
+#: stereo_panner_editor.cc:48 stereo_panner_editor.cc:53
 msgid "%"
 msgstr ""
 
@@ -8084,10 +9520,6 @@ msgstr ""
 "de Ardour depende de un flujo de ingresos estable y sostenible.\n"
 "¡Gracias por usar Ardour!"
 
-#: new_plugin_preset_dialog.cc:29
-msgid "New Preset"
-msgstr "Nuevo preset"
-
 #: new_plugin_preset_dialog.cc:30
 msgid "Replace existing preset with this name"
 msgstr "Reemplazar el preset existente con este nombre"
@@ -8096,6 +9528,10 @@ msgstr "Reemplazar el preset existente con este nombre"
 msgid "Name of new preset"
 msgstr "Nombre del nuevo preset"
 
+#: new_plugin_preset_dialog.cc:44
+msgid "New Favorite Only"
+msgstr ""
+
 #: normalize_dialog.cc:34
 msgid "Normalize regions"
 msgstr "Normalizar regiones"
@@ -8104,9 +9540,9 @@ msgstr "Normalizar regiones"
 msgid "Normalize region"
 msgstr "Normalizar región"
 
-#: normalize_dialog.cc:49 strip_silence_dialog.cc:66
-msgid "dbFS"
-msgstr "dbFS"
+#: normalize_dialog.cc:42
+msgid "Normalize to:"
+msgstr "Normalizar a:"
 
 #: normalize_dialog.cc:56
 msgid "Normalize each region using its own peak value"
@@ -8124,90 +9560,97 @@ msgstr "Normalizar"
 msgid "Select Note"
 msgstr "Seleccionar nota"
 
-#: opts.cc:57
+#: opts.cc:61
 msgid "Usage: "
 msgstr "Uso: "
 
-#: opts.cc:58
+#: opts.cc:62
 msgid "  [SESSION_NAME]              Name of session to load\n"
 msgstr "  [SESSION_NAME]            Nombre de sesión a cargar\n"
 
-#: opts.cc:59
+#: opts.cc:63
 msgid "  -v, --version               Show version information\n"
 msgstr ""
 "  -v, --version              Muestra información acerca de la versión\n"
 
-#: opts.cc:60
+#: opts.cc:64
 msgid "  -h, --help                  Print this message\n"
 msgstr "  -h, --help                Muestra este mensaje\n"
 
-#: opts.cc:61
+#: opts.cc:65
 msgid ""
 "  -a, --no-announcements      Do not contact website for announcements\n"
 msgstr ""
 
-#: opts.cc:62
+#: opts.cc:66
 msgid ""
 "  -b, --bindings              Print all possible keyboard binding names\n"
 msgstr ""
 "  -b, --bindings           Muestra todos los atajos de teclado posibles\n"
 
-#: opts.cc:63
+#: opts.cc:67
+msgid ""
+"  -B, --bypass-plugins        Bypass all plugins in an existing session\n"
+msgstr ""
+"  -B, --bypass-plugins        Baipasar todos los plugins en una sesión "
+"existente\n"
+
+#: opts.cc:68
 msgid ""
 "  -c, --name <name>           Use a specific backend client name, default is "
 "ardour\n"
 msgstr ""
 
-#: opts.cc:64
+#: opts.cc:69
 msgid ""
 "  -d, --disable-plugins       Disable all plugins in an existing session\n"
 msgstr ""
 "  -d, --disable-plugins       Desactivar todos los plugins de una sesión "
 "existente\n"
 
-#: opts.cc:65
+#: opts.cc:70
 msgid ""
 "  -D, --debug <options>       Set debug flags. Use \"-D list\" to see "
 "available options\n"
 msgstr ""
 
-#: opts.cc:66
+#: opts.cc:71
 msgid "  -n, --no-splash             Do not show splash screen\n"
 msgstr "  -n, --no-splash           No mostrar pantalla inicial\n"
 
-#: opts.cc:67
+#: opts.cc:72
 msgid "  -m, --menus file            Use \"file\" to define menus\n"
 msgstr "  -m, --menus file               Usar \"file\" para definir menús\n"
 
-#: opts.cc:68
+#: opts.cc:73
 msgid ""
 "  -N, --new session-name      Create a new session from the command line\n"
 msgstr ""
 "  -N, --new session-name       Crear una sesión nueva desde la línea de "
 "comandos\n"
 
-#: opts.cc:69
+#: opts.cc:74
 msgid "  -O, --no-hw-optimizations   Disable h/w specific optimizations\n"
 msgstr ""
 "  -O, --no-hw-optimizations       Desactivar las optimizaciones específicas "
 "de h/w\n"
 
-#: opts.cc:70
+#: opts.cc:75
 msgid "  -P, --no-connect-ports      Do not connect any ports at startup\n"
 msgstr ""
 
 # no sé realmente qué significa
-#: opts.cc:71
+#: opts.cc:76
 msgid "  -S, --sync                  Draw the gui synchronously \n"
 msgstr ""
 "  -S, --sync          Dibujar la interfaz gráfica de usuario "
 "sincrónicamente\n"
 
-#: opts.cc:73
+#: opts.cc:78
 msgid "  -V, --novst                 Do not use VST support\n"
 msgstr "  -V, --novst             No usar soporte VST\n"
 
-#: opts.cc:75
+#: opts.cc:80
 msgid ""
 "  -E, --save <file>           Load the specified session, save it to <file> "
 "and then quit\n"
@@ -8215,28 +9658,26 @@ msgstr ""
 "  -E, --save <file>           Carga la sesión especificada, la guarda a "
 "<file> y después sale\n"
 
-#: opts.cc:76
+#: opts.cc:81
 msgid "  -C, --curvetest filename    Curve algorithm debugger\n"
 msgstr "  -C, --curvetest filename      Debugger del algoritmo de la curva\n"
 
-#: opts.cc:77
-msgid ""
-"  -k, --keybindings filename  Name of key bindings to load (default is ~/."
-"ardour3/ardour.bindings)\n"
+#: opts.cc:82
+msgid "  -k, --keybindings filename  Name of key bindings to load\n"
 msgstr ""
 "  -k, --keybindings filename       Nombre del archivo de combinaciones de "
-"teclas a cargar (predeterminado: ~/.ardour3/ardour.bindings)\n"
+"teclas a cargar\n"
 
-#: panner2d.cc:854
+#: panner2d.cc:896
 msgid "Panner (2D)"
 msgstr "Paner (2D)"
 
-#: panner2d.cc:856 panner_ui.cc:400 plugin_ui.cc:452
+#: panner2d.cc:898 panner_ui.cc:402 plugin_ui.cc:458
 msgid "Bypass"
 msgstr "Puentear"
 
 # Aquí estaaba panorámica, pero pan se entiende perfectamente y es mucho más corto
-#: panner2d.cc:862
+#: panner2d.cc:904
 msgid "Panner"
 msgstr "Paner"
 
@@ -8248,8 +9689,24 @@ msgstr "Modo de automatización de panorámica"
 msgid "Pan automation type"
 msgstr "Tipo de automatización de panorámica"
 
-#: playlist_selector.cc:43
-msgid "Playlists"
+#: panner_ui.cc:605
+msgid "Manual|M"
+msgstr ""
+
+#: panner_ui.cc:608
+msgid "Play|P"
+msgstr ""
+
+#: panner_ui.cc:611
+msgid "Touch|T"
+msgstr ""
+
+#: panner_ui.cc:614
+msgid "Write|W"
+msgstr ""
+
+#: playlist_selector.cc:43
+msgid "Playlists"
 msgstr "Listas de reproducción"
 
 #: playlist_selector.cc:54
@@ -8272,108 +9729,262 @@ msgstr "no asignado"
 msgid "Imported"
 msgstr "Importado"
 
-#: plugin_eq_gui.cc:85 plugin_eq_gui.cc:109
+#: plugin_eq_gui.cc:93 plugin_eq_gui.cc:117
 msgid "dB scale"
 msgstr "escala dB"
 
-#: plugin_eq_gui.cc:116
+#: plugin_eq_gui.cc:124
 msgid "Show phase"
 msgstr "Mostrar fase"
 
-#: plugin_selector.cc:53 plugin_selector.cc:229
+#: plugin_pin_dialog.cc:55
+msgid "Manual Config"
+msgstr "Configuración manual"
+
+#: plugin_pin_dialog.cc:56
+msgid "Sidechain"
+msgstr ""
+
+#: plugin_pin_dialog.cc:57 plugin_pin_dialog.cc:59 plugin_pin_dialog.cc:61
+#: plugin_pin_dialog.cc:63 plugin_pin_dialog.cc:65 step_entry.cc:81
+#: step_entry.cc:84
+msgid "+"
+msgstr "+"
+
+#: plugin_pin_dialog.cc:58 plugin_pin_dialog.cc:60 plugin_pin_dialog.cc:62
+#: plugin_pin_dialog.cc:64 plugin_pin_dialog.cc:66
+msgid "-"
+msgstr ""
+
+#: plugin_pin_dialog.cc:148
+msgid "Audio Input Pins"
+msgstr ""
+
+#: plugin_pin_dialog.cc:157
+msgid "MIDI Input Pins"
+msgstr ""
+
+#: plugin_pin_dialog.cc:166
+msgid "Instances"
+msgstr ""
+
+#: plugin_pin_dialog.cc:176
+msgid "Audio Out"
+msgstr ""
+
+#: plugin_pin_dialog.cc:185
+msgid "MIDI Out"
+msgstr ""
+
+#: plugin_pin_dialog.cc:192
+msgid "Output Presets"
+msgstr ""
+
+#: plugin_pin_dialog.cc:208
+msgid "Add Sidechain Input"
+msgstr ""
+
+#: plugin_pin_dialog.cc:478 plugin_pin_dialog.cc:482 plugin_pin_dialog.cc:486
+#: plugin_setup_dialog.cc:115 plugin_setup_dialog.cc:199
+msgid "Automatic"
+msgstr "Automatic"
+
+#: plugin_pin_dialog.cc:515 plugin_setup_dialog.cc:208
+msgid "%1 Channel"
+msgid_plural "%1 Channels"
+msgstr[0] "%1 Canal"
+msgstr[1] "%1 Canales"
+
+#: plugin_pin_dialog.cc:641 processor_box.cc:224
+msgid "Send"
+msgstr ""
+
+#: plugin_pin_dialog.cc:997
+msgid "Latency %1 spl%2 %3"
+msgstr ""
+
+#: plugin_pin_dialog.cc:997 plugin_pin_dialog.cc:1001
+msgid "no-inplace"
+msgstr ""
+
+#: plugin_pin_dialog.cc:999
+msgid "Latency %1 spl"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1055
+msgid "Instance #%1"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1700 processor_box.cc:2508
+msgid "Cannot set up new send: %1"
+msgstr "No se pudo configurar el nuevo envío: %1"
+
+#: plugin_pin_dialog.cc:1707
+msgid "SC %1 (%2)"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1963 plugin_pin_dialog.cc:1971
+msgid "Pin Configuration: %1"
+msgstr "Pin Configuration: %1"
+
+#: plugin_setup_dialog.cc:30
+msgid "Plugin Setup"
+msgstr "Configuración de plugin"
+
+#: plugin_setup_dialog.cc:33
+msgid "Copy I/O Map"
+msgstr ""
+
+#: plugin_setup_dialog.cc:50
+msgid "An Instrument plugin is already present."
+msgstr ""
+
+#: plugin_setup_dialog.cc:54
+msgid "Replace"
+msgstr ""
+
+#: plugin_setup_dialog.cc:60
+msgid "with"
+msgstr ""
+
+#: plugin_setup_dialog.cc:70
+msgid "I/O Pin Mapping"
+msgstr ""
+
+#: plugin_setup_dialog.cc:79
+msgid "Configure Plugin '%1'"
+msgstr ""
+
+#: plugin_setup_dialog.cc:90
+msgid "Output Configuration"
+msgstr "Configuración de salida"
+
+#: plugin_selector.cc:54 plugin_selector.cc:322
 msgid "Name contains"
 msgstr "El nombre contiene"
 
-#: plugin_selector.cc:54 plugin_selector.cc:233
+#: plugin_selector.cc:55 plugin_selector.cc:326
 msgid "Type contains"
 msgstr "El tipo contiene"
 
-#: plugin_selector.cc:55 plugin_selector.cc:231
+#: plugin_selector.cc:56 plugin_selector.cc:324
 msgid "Category contains"
 msgstr "La categoría contiene"
 
-#: plugin_selector.cc:56 plugin_selector.cc:253
+#: plugin_selector.cc:57 plugin_selector.cc:349
 msgid "Author contains"
 msgstr "El autor contiene"
 
-#: plugin_selector.cc:57 plugin_selector.cc:255
+#: plugin_selector.cc:58 plugin_selector.cc:351
 msgid "Library contains"
 msgstr "La biblioteca contiene"
 
-#: plugin_selector.cc:58 plugin_selector.cc:219 plugin_selector.cc:537
+#: plugin_selector.cc:59 plugin_selector.cc:278 plugin_selector.cc:639
 msgid "Favorites only"
 msgstr "Sólo favoritos"
 
-#: plugin_selector.cc:59 plugin_selector.cc:223 plugin_selector.cc:537
+#: plugin_selector.cc:60 plugin_selector.cc:282 plugin_selector.cc:639
 msgid "Hidden only"
 msgstr "Sólo ocultos"
 
-#: plugin_selector.cc:64
+#: plugin_selector.cc:65
 msgid "Plugin Manager"
 msgstr "Administrador de plugins"
 
-#: plugin_selector.cc:85
+#: plugin_selector.cc:96
 msgid "Fav"
 msgstr "Fav"
 
-#: plugin_selector.cc:87
+#: plugin_selector.cc:98
 msgid "Available Plugins"
 msgstr "Plugins disponibles"
 
-#: plugin_selector.cc:88
+#: plugin_selector.cc:99
 msgid "Type"
 msgstr "Tipo"
 
-#: plugin_selector.cc:89
+#: plugin_selector.cc:100
 msgid "Category"
 msgstr "Categoría"
 
-#: plugin_selector.cc:90
+#: plugin_selector.cc:101
 msgid "Creator"
 msgstr "Creador"
 
-#: plugin_selector.cc:91
+#: plugin_selector.cc:102
 msgid "# Audio In"
 msgstr "# Audio In"
 
-#: plugin_selector.cc:92
+#: plugin_selector.cc:103
 msgid "# Audio Out"
 msgstr "# Audio Out"
 
-#: plugin_selector.cc:93
+#: plugin_selector.cc:104
 msgid "# MIDI In"
 msgstr "# MIDI In"
 
-#: plugin_selector.cc:94
+#: plugin_selector.cc:105
 msgid "# MIDI Out"
 msgstr "# MIDI Out"
 
-#: plugin_selector.cc:116
+#: plugin_selector.cc:132
 msgid "Plugins to be connected"
 msgstr "Plugins que se conectarán"
 
-#: plugin_selector.cc:129
+#: plugin_selector.cc:145
 msgid "Add a plugin to the effect list"
 msgstr "Añadir plugin a la lista de efectos"
 
-#: plugin_selector.cc:133
+#: plugin_selector.cc:149
 msgid "Remove a plugin from the effect list"
 msgstr "Eliminar plugin de la lista de efectos"
 
-#: plugin_selector.cc:135
-msgid "Update available plugins"
-msgstr "Actualizar plugins disponibles"
+#: plugin_selector.cc:161
+msgid "Show Hidden"
+msgstr "Mostrar oculto"
+
+#: plugin_selector.cc:163
+msgid "Include hidden plugins in list."
+msgstr ""
+
+#: plugin_selector.cc:166
+msgid "Instruments"
+msgstr "Instrumentos"
+
+#: plugin_selector.cc:168
+msgid "Cycle display of instrument plugins (if any)."
+msgstr ""
+
+#: plugin_selector.cc:171
+msgid "Analyzers"
+msgstr "Analizadores"
+
+#: plugin_selector.cc:173
+msgid "Cycle display of analysis plugins (if any)."
+msgstr ""
+
+#: plugin_selector.cc:176
+msgid "Utils"
+msgstr ""
+
+#: plugin_selector.cc:178
+msgid "Cycle display of utility plugins (if any)."
+msgstr ""
+
+#: plugin_selector.cc:208
+msgid "Filter"
+msgstr ""
 
-#: plugin_selector.cc:172
+#: plugin_selector.cc:232
 msgid "Insert Plugin(s)"
 msgstr "Insertar plugin/s"
 
-#: plugin_selector.cc:337 plugin_selector.cc:338 plugin_selector.cc:339
-#: plugin_selector.cc:340
+#: plugin_selector.cc:439 plugin_selector.cc:440 plugin_selector.cc:441
+#: plugin_selector.cc:442
 msgid "variable"
 msgstr ""
 
-#: plugin_selector.cc:496
+#: plugin_selector.cc:598
 msgid ""
 "The plugin \"%1\" could not be loaded\n"
 "\n"
@@ -8383,27 +9994,27 @@ msgstr ""
 "\n"
 "Ver la ventana de mensajes para más detalles"
 
-#: plugin_selector.cc:644
+#: plugin_selector.cc:757
 msgid "Favorites"
 msgstr "Favoritos"
 
-#: plugin_selector.cc:646
+#: plugin_selector.cc:759
 msgid "Plugin Manager..."
 msgstr "Administrador de plugins..."
 
-#: plugin_selector.cc:650
+#: plugin_selector.cc:763
 msgid "By Creator"
 msgstr "Por autor"
 
-#: plugin_selector.cc:653
+#: plugin_selector.cc:766
 msgid "By Category"
 msgstr "Por categoría"
 
-#: plugin_ui.cc:113
+#: plugin_ui.cc:114
 msgid "Eh? LADSPA plugins don't have editors!"
 msgstr "¿Cómo? ¡Los plugins LADSPA no tienen editores!"
 
-#: plugin_ui.cc:122 plugin_ui.cc:227
+#: plugin_ui.cc:123 plugin_ui.cc:228
 msgid ""
 "unknown type of editor-supplying plugin (note: no VST support in this "
 "version of %1)"
@@ -8411,11 +10022,11 @@ msgstr ""
 "Tipo desconocido de plugin con editor propio (nota: no hay soporte para VST "
 "en esta versión de %1)"
 
-#: plugin_ui.cc:125
+#: plugin_ui.cc:126
 msgid "unknown type of editor-supplying plugin"
 msgstr "Tipo desconocido de plugin con editor propio "
 
-#: plugin_ui.cc:257
+#: plugin_ui.cc:258
 msgid ""
 "unknown type of editor-supplying plugin (note: no linuxVST support in this "
 "version of %1)"
@@ -8423,7 +10034,7 @@ msgstr ""
 "Tipo desconocido de plugin con editor propio (nota: no hay soporte linuxVST "
 "en esta versión de %1)"
 
-#: plugin_ui.cc:329
+#: plugin_ui.cc:330
 msgid "create_lv2_editor called on non-LV2 plugin"
 msgstr ""
 
@@ -8431,37 +10042,42 @@ msgstr ""
 msgid "Add"
 msgstr "Añadir"
 
-#: plugin_ui.cc:422
+#: plugin_ui.cc:423
 msgid "Description"
 msgstr "Descripción"
 
-#: plugin_ui.cc:423
+#: plugin_ui.cc:424
 msgid "Plugin analysis"
 msgstr "Análisis de plugin"
 
-#: plugin_ui.cc:430
+#: plugin_ui.cc:431
 msgid ""
 "Presets (if any) for this plugin\n"
 "(Both factory and user-created)"
 msgstr ""
 
-#: plugin_ui.cc:431
+#: plugin_ui.cc:432
 msgid "Save a new preset"
 msgstr "Guadar un preset nuevo"
 
-#: plugin_ui.cc:432
+#: plugin_ui.cc:433
 msgid "Save the current preset"
 msgstr ""
 
-#: plugin_ui.cc:433
+#: plugin_ui.cc:434
 msgid "Delete the current preset"
 msgstr ""
 
-#: plugin_ui.cc:434
+#: plugin_ui.cc:435
+msgid ""
+"Reset parameters to default (if no parameters are in automation play mode)"
+msgstr ""
+
+#: plugin_ui.cc:436
 msgid "Disable signal processing by the plugin"
 msgstr ""
 
-#: plugin_ui.cc:467 plugin_ui.cc:663
+#: plugin_ui.cc:473 plugin_ui.cc:681
 msgid ""
 "Click to allow the plugin to receive keyboard events that %1 would normally "
 "use as a shortcut"
@@ -8469,110 +10085,126 @@ msgstr ""
 "Pulsa para permitir que el plugin reciba eventos de teclado que %1 usaría "
 "normalmente como atajos de teclado"
 
-#: plugin_ui.cc:468
+#: plugin_ui.cc:474
 msgid "Click to enable/disable this plugin"
 msgstr "Pulsa para activar/desactivar este plugin"
 
-#: plugin_ui.cc:507
+#: plugin_ui.cc:517
 msgid "latency (%1 sample)"
 msgid_plural "latency (%1 samples)"
 msgstr[0] "latencia (%1 muestra)"
 msgstr[1] "latencia (%1 muestras)"
 
-#: plugin_ui.cc:509
+#: plugin_ui.cc:519
 msgid "latency (%1 ms)"
 msgstr "latencia (%1 ms)"
 
-#: plugin_ui.cc:520
+#: plugin_ui.cc:530
 msgid "Edit Latency"
 msgstr "Editar latencia"
 
-#: plugin_ui.cc:566
+#: plugin_ui.cc:576
 msgid ""
 "Plugin presets are not supported in this build of %1. Consider paying for a "
 "full version"
 msgstr ""
 
-#: plugin_ui.cc:574
+#: plugin_ui.cc:584
 msgid ""
 "Plugin presets are not supported in this build, see the Log window for more "
 "information."
 msgstr ""
 
-#: plugin_ui.cc:670
+#: plugin_ui.cc:592
+msgid "New Preset"
+msgstr "Nuevo preset"
+
+#: plugin_ui.cc:688
 msgid "Click to allow normal use of %1 keyboard shortcuts"
 msgstr "Pulsa para permitir el uso normal de los atajos de teclado de %1"
 
-#: port_group.cc:337
+#: plugin_ui.cc:795
+msgid "(none)"
+msgstr "(ninguno)"
+
+#: port_group.cc:338
 msgid "%1 Busses"
 msgstr "Buses %1"
 
-#: port_group.cc:338
+#: port_group.cc:339
 msgid "%1 Tracks"
 msgstr "Pistas %1"
 
-#: port_group.cc:339
+#: port_group.cc:340
 msgid "Hardware"
 msgstr "Hardware"
 
-#: port_group.cc:340
+#: port_group.cc:341
 msgid "%1 Misc"
 msgstr "Ardour misc"
 
-#: port_group.cc:341
+#: port_group.cc:342
 msgid "Other"
 msgstr "Otro"
 
-#: port_group.cc:432 port_group.cc:433
+#: port_group.cc:434 port_group.cc:435
 msgid "LTC Out"
 msgstr ""
 
-#: port_group.cc:436 port_group.cc:437
+#: port_group.cc:438 port_group.cc:439
 msgid "LTC In"
 msgstr ""
 
-#: port_group.cc:463
+#: port_group.cc:473
 msgid "MTC in"
 msgstr "Entrada MTC"
 
-#: port_group.cc:466
+#: port_group.cc:476
 msgid "MIDI control in"
 msgstr "Entrada control MIDI"
 
-#: port_group.cc:469
+#: port_group.cc:479
 msgid "MIDI clock in"
 msgstr "Entrada reloj MIDI"
 
-#: port_group.cc:472
+#: port_group.cc:482
 msgid "MMC in"
 msgstr "Entrada MMC"
 
-#: port_group.cc:476
+#: port_group.cc:486
 msgid "MTC out"
 msgstr "Salida MTC"
 
-#: port_group.cc:479
+#: port_group.cc:489
 msgid "MIDI control out"
 msgstr "Salida control MIDI"
 
-#: port_group.cc:482
+#: port_group.cc:492
 msgid "MIDI clock out"
 msgstr "Salida reloj MIDI"
 
-#: port_group.cc:485
+#: port_group.cc:495
 msgid "MMC out"
 msgstr "Salida MMC"
 
-#: port_group.cc:532
+#: port_group.cc:554
 msgid ":monitor"
 msgstr ":monitor"
 
-#: port_group.cc:544
+#: port_group.cc:570
 msgid "system:"
 msgstr ""
 
-#: port_group.cc:545
-msgid "alsa_pcm"
+#: port_group.cc:571
+msgid "alsa_pcm:"
+msgstr ""
+
+#: port_group.cc:572
+msgid "alsa_midi:"
+msgstr ""
+
+#: port_group.cc:577
+msgid "Scene "
 msgstr ""
 
 #: port_insert_ui.cc:39
@@ -8595,79 +10227,76 @@ msgstr "No se ha detectado señal"
 msgid "Port Insert "
 msgstr "Inserción puerto"
 
-#: port_matrix.cc:331 port_matrix.cc:357
+#: port_matrix.cc:341 port_matrix.cc:367
 msgid "<b>Sources</b>"
 msgstr "<b>Orígenes</b>"
 
-#: port_matrix.cc:332 port_matrix.cc:358
+#: port_matrix.cc:342 port_matrix.cc:368
 msgid "<b>Destinations</b>"
 msgstr "<b>Destinos</b>"
 
-#: port_matrix.cc:440 port_matrix.cc:448
+#: port_matrix.cc:450 port_matrix.cc:458
 #, c-format
 msgid "Add %s %s"
 msgstr "Añadir %s %s"
 
-#: port_matrix.cc:456
+#: port_matrix.cc:466
 #, c-format
 msgid "Rename '%s'..."
 msgstr "Renombrar '%s'..."
 
-#: port_matrix.cc:472
+#: port_matrix.cc:482
 msgid "Remove all"
 msgstr "Eliminar todo"
 
-#: port_matrix.cc:492 port_matrix.cc:504
+#: port_matrix.cc:502 port_matrix.cc:514
 #, c-format
 msgid "%s all"
 msgstr "%s todos"
 
-#: port_matrix.cc:527
+#: port_matrix.cc:537
 msgid "Rescan"
 msgstr "Buscar otra vez"
 
-#: port_matrix.cc:529
+#: port_matrix.cc:539
 msgid "Show individual ports"
 msgstr "Mostrar puertos individuales"
 
-#: port_matrix.cc:535
+#: port_matrix.cc:545
 msgid "Flip"
 msgstr ""
 
-#: port_matrix.cc:722
-msgid ""
-"It is not possible to add a port here, as the first processor in the track "
-"or buss cannot support the new configuration."
+#: port_matrix.cc:732
+msgid "It is not possible to add a port here."
 msgstr ""
-"No es posible añadir un puerto aquí, pues el primer procesador de la pista o "
-"bus no puede soportar la nueva configuración."
 
-#: port_matrix.cc:725
+#: port_matrix.cc:733
 msgid "Cannot add port"
 msgstr ""
 
-#: port_matrix.cc:747
-msgid "Port removal not allowed"
-msgstr "Eliminación de puertos no permitida"
+#: port_matrix.cc:757
+msgid "The last port cannot be removed"
+msgstr ""
 
-#: port_matrix.cc:748
-msgid ""
-"This port cannot be removed.\n"
-"Either the first plugin in the track or buss cannot accept\n"
-"the new number of inputs or the last plugin has more outputs."
+#: port_matrix.cc:760
+msgid "This port cannot be removed."
 msgstr ""
 
-#: port_matrix.cc:965
+#: port_matrix.cc:765
+msgid "Port removal not allowed"
+msgstr "Eliminación de puertos no permitida"
+
+#: port_matrix.cc:981
 #, c-format
 msgid "Remove '%s'"
 msgstr "Eliminar '%s'"
 
-#: port_matrix.cc:980
+#: port_matrix.cc:996
 #, c-format
 msgid "%s all from '%s'"
 msgstr "%s todo desde '%s'"
 
-#: port_matrix.cc:1046 transform_dialog.cc:62
+#: port_matrix.cc:1062 transform_dialog.cc:62
 msgid "channel"
 msgstr "canal"
 
@@ -8679,59 +10308,70 @@ msgstr "No hay puertos para conectar."
 msgid "There are no %1 ports to connect."
 msgstr "No hay %1 puertos para conectar."
 
-#: processor_box.cc:150
-msgid "Send"
+#: processor_box.cc:226
+msgid "Return"
 msgstr ""
 
-#: processor_box.cc:152
-msgid "Return"
+#: processor_box.cc:323
+msgid "New Favorite Preset for \"%1\""
 msgstr ""
 
-#: processor_box.cc:310
+#: processor_box.cc:501
 msgid ""
 "\n"
 "This mono plugin has been replicated %1 times."
 msgstr ""
 
-#: processor_box.cc:314
+#: processor_box.cc:505 processor_box.cc:1527
 msgid ""
 "<b>%1</b>\n"
 "Double-click to show GUI.\n"
-"Alt+double-click to show generic GUI.%2"
+"%2+double-click to show generic GUI.%3"
 msgstr ""
 
-#: processor_box.cc:317
+#: processor_box.cc:508 processor_box.cc:1530
 msgid ""
 "<b>%1</b>\n"
 "Double-click to show generic GUI.%2"
 msgstr ""
 
-#: processor_box.cc:361
+#: processor_box.cc:514
+msgid ""
+"<b>%1</b>\n"
+"The Plugin is not available on this system\n"
+"and has been replaced by a stub."
+msgstr ""
+
+#: processor_box.cc:600
 #, c-format
 msgid "(%1x1) "
 msgstr ""
 
-#: processor_box.cc:437
+#: processor_box.cc:695
+msgid "Inline Display"
+msgstr ""
+
+#: processor_box.cc:703
 msgid "Show All Controls"
 msgstr "Mostrar todos los controles"
 
-#: processor_box.cc:441
+#: processor_box.cc:707
 msgid "Hide All Controls"
 msgstr "Ocultar todos los controles"
 
-#: processor_box.cc:475
+#: processor_box.cc:752
 msgid "Link panner controls"
 msgstr ""
 
-#: processor_box.cc:575
+#: processor_box.cc:859
 msgid "on"
 msgstr "on"
 
-#: processor_box.cc:575 rc_option_editor.cc:2360 rc_option_editor.cc:2374
+#: processor_box.cc:859 rc_option_editor.cc:3178 rc_option_editor.cc:3192
 msgid "off"
 msgstr "apagado"
 
-#: processor_box.cc:957
+#: processor_box.cc:1817
 msgid ""
 "Right-click to add/remove/edit\n"
 "plugins,inserts,sends and more"
@@ -8739,15 +10379,25 @@ msgstr ""
 "Botón derecho para añadir/eliminar/editar\n"
 "plugins, inserciones, envíos y más"
 
-#: processor_box.cc:1429 processor_box.cc:1804
+#: processor_box.cc:1968
+msgid ""
+"Processor Drag/Drop failed. Probably because\n"
+"the I/O configuration of the plugins could\n"
+"not match the configuration of this track."
+msgstr ""
+"Processor Drag/Drop failed. Probablemente porque\n"
+"la configuración de E/S de los plugins no concuerda\n"
+"con la configuración de E/S de la pista."
+
+#: processor_box.cc:2455 processor_box.cc:2998
 msgid "Plugin Incompatibility"
 msgstr "Incompatiblidad de plugin"
 
-#: processor_box.cc:1432
+#: processor_box.cc:2458
 msgid "You attempted to add the plugin \"%1\" in slot %2.\n"
 msgstr "Intentaste añadir el plugin \"%1\" en el slot %2.\n"
 
-#: processor_box.cc:1438
+#: processor_box.cc:2464
 msgid ""
 "\n"
 "This plugin has:\n"
@@ -8755,19 +10405,19 @@ msgstr ""
 "\n"
 "Este plugin tiene:\n"
 
-#: processor_box.cc:1441
+#: processor_box.cc:2455
 msgid "\t%1 MIDI input\n"
 msgid_plural "\t%1 MIDI inputs\n"
 msgstr[0] "\t%1 entrada MIDI\n"
 msgstr[1] "\t%1 entradas MIDI\n"
 
-#: processor_box.cc:1445
+#: processor_box.cc:2459
 msgid "\t%1 audio input\n"
 msgid_plural "\t%1 audio inputs\n"
 msgstr[0] "\t%1 entrada audio\n"
 msgstr[1] "\t%1 entradas audio\n"
 
-#: processor_box.cc:1448
+#: processor_box.cc:2462
 msgid ""
 "\n"
 "but at the insertion point, there are:\n"
@@ -8775,19 +10425,19 @@ msgstr ""
 "\n"
 "Pero en el punto de inserción hay:\n"
 
-#: processor_box.cc:1451
+#: processor_box.cc:2465
 msgid "\t%1 MIDI channel\n"
 msgid_plural "\t%1 MIDI channels\n"
 msgstr[0] "\t%1 canal MIDI\n"
 msgstr[1] "\t%1 canales MIDI\n"
 
-#: processor_box.cc:1455
+#: processor_box.cc:2469
 msgid "\t%1 audio channel\n"
 msgid_plural "\t%1 audio channels\n"
 msgstr[0] "\t%1 canal audio\n"
 msgstr[1] "\t%1 canales audio\n"
 
-#: processor_box.cc:1458
+#: processor_box.cc:2472
 msgid ""
 "\n"
 "%1 is unable to insert this plugin here.\n"
@@ -8795,11 +10445,7 @@ msgstr ""
 "\n"
 "%1 es incapaz de insertar este plugin aquí.\n"
 
-#: processor_box.cc:1495
-msgid "Cannot set up new send: %1"
-msgstr "No se pudo configurar el nuevo envío: %1"
-
-#: processor_box.cc:1807
+#: processor_box.cc:2989
 msgid ""
 "You cannot reorder these plugins/sends/inserts\n"
 "in that way because the inputs and\n"
@@ -8809,19 +10455,19 @@ msgstr ""
 "de ese modo porque las entradas y salidas no\n"
 "funcionarán correctamente."
 
-#: processor_box.cc:1991
+#: processor_box.cc:3189
 msgid "Rename Processor"
 msgstr "Renombrar procesador"
 
-#: processor_box.cc:2022
+#: processor_box.cc:3220
 msgid "At least 100 IO objects exist with a name like %1 - name not changed"
 msgstr ""
 
-#: processor_box.cc:2159
+#: processor_box.cc:3371
 msgid "plugin insert constructor failed"
 msgstr ""
 
-#: processor_box.cc:2170
+#: processor_box.cc:3382
 msgid ""
 "Copying the set of processors on the clipboard failed,\n"
 "probably because the I/O configuration of the plugins\n"
@@ -8832,7 +10478,7 @@ msgstr ""
 "configuración de E/S de los plugins no concuerda\n"
 "con la configuración de esta pista."
 
-#: processor_box.cc:2216
+#: processor_box.cc:3428
 msgid ""
 "Do you really want to remove all processors from %1?\n"
 "(this cannot be undone)"
@@ -8840,15 +10486,15 @@ msgstr ""
 "¿De verdad deseas eliminar todos los procesadores de %1? \n"
 "(esto no se puede deshacer)"
 
-#: processor_box.cc:2220 processor_box.cc:2245
+#: processor_box.cc:3432 processor_box.cc:3457
 msgid "Yes, remove them all"
 msgstr "Sí, eliminar todos"
 
-#: processor_box.cc:2222 processor_box.cc:2247
+#: processor_box.cc:3434 processor_box.cc:3459
 msgid "Remove processors"
 msgstr "Eliminar procesadores"
 
-#: processor_box.cc:2237
+#: processor_box.cc:3449
 msgid ""
 "Do you really want to remove all pre-fader processors from %1?\n"
 "(this cannot be undone)"
@@ -8856,7 +10502,7 @@ msgstr ""
 "¿De verdad deseas eliminar todos los procesadores pre-fader de %1?\n"
 "(esto no se puede deshacer)"
 
-#: processor_box.cc:2240
+#: processor_box.cc:3452
 msgid ""
 "Do you really want to remove all post-fader processors from %1?\n"
 "(this cannot be undone)"
@@ -8864,61 +10510,61 @@ msgstr ""
 "¿De verdad deseas eliminar todos los procesadores post-fader de %1?\n"
 "(esto no se puede deshacer)"
 
-#: processor_box.cc:2428
+#: processor_box.cc:3641
 msgid "New Plugin"
 msgstr "Nuevo plugin"
 
-#: processor_box.cc:2431
+#: processor_box.cc:3644
 msgid "New Insert"
 msgstr "Nueva inserción"
 
-#: processor_box.cc:2434
+#: processor_box.cc:3647
 msgid "New External Send ..."
 msgstr "Nuevo envío externo..."
 
-#: processor_box.cc:2438
+#: processor_box.cc:3651
 msgid "New Aux Send ..."
 msgstr "Nuevo envío auxiliar..."
 
-#: processor_box.cc:2441
+#: processor_box.cc:3654
 msgid "Send Options"
 msgstr ""
 
-#: processor_box.cc:2443
+#: processor_box.cc:3656
 msgid "Clear (all)"
 msgstr "Limpiar (todos)"
 
 # es correcto el término 'resetear'?
 # He cambiado tipo de compás y compás, cuando tiene este significado, por métrica
-#: processor_box.cc:2445
+#: processor_box.cc:3658
 msgid "Clear (pre-fader)"
 msgstr "Limpiar (pre-fader)"
 
-#: processor_box.cc:2447
+#: processor_box.cc:3660
 msgid "Clear (post-fader)"
 msgstr "Limpiar (post-fader)"
 
-#: processor_box.cc:2473
+#: processor_box.cc:3690
 msgid "Activate All"
 msgstr "Activar todos"
 
-#: processor_box.cc:2475
+#: processor_box.cc:3692
 msgid "Deactivate All"
 msgstr "Desactivar todos"
 
-#: processor_box.cc:2477
+#: processor_box.cc:3694
 msgid "A/B Plugins"
 msgstr "Plugins A/B"
 
-#: processor_box.cc:2486
+#: processor_box.cc:3707
 msgid "Edit with generic controls..."
 msgstr ""
 
-#: processor_box.cc:2789
+#: processor_box.cc:4039
 msgid "%1: %2 (by %3)"
 msgstr "%1: %2 (a %3)"
 
-#: processor_box.cc:2791
+#: processor_box.cc:4041
 msgid "%1 (by %2)"
 msgstr ""
 
@@ -8948,153 +10594,319 @@ msgstr "Banco"
 msgid "main grid"
 msgstr "rejilla principal"
 
-#: quantize_dialog.cc:52 quantize_dialog.cc:109
+#: quantize_dialog.cc:61 quantize_dialog.cc:118
 msgid "Quantize"
 msgstr "Cuantificar"
 
-#: quantize_dialog.cc:56
+#: quantize_dialog.cc:65
 msgid "Strength"
 msgstr "Fuerza"
 
-#: quantize_dialog.cc:59
+#: quantize_dialog.cc:68
 msgid "Swing"
 msgstr "Swing"
 
-#: quantize_dialog.cc:62
+#: quantize_dialog.cc:71
 msgid "Threshold (ticks)"
 msgstr "Umbral (ticks)"
 
-#: quantize_dialog.cc:63
+#: quantize_dialog.cc:72
 msgid "Snap note start"
 msgstr "Ajustar principio de nota"
 
-#: quantize_dialog.cc:64
+#: quantize_dialog.cc:73
 msgid "Snap note end"
 msgstr "Ajustar final de nota"
 
-#: rc_option_editor.cc:77
-msgid "Click audio file:"
-msgstr "Archivo de audio de claqueta:"
-
-#: rc_option_editor.cc:80 rc_option_editor.cc:87
+#: rc_option_editor.cc:83 rc_option_editor.cc:84 rc_option_editor.cc:1550
 msgid "Browse..."
 msgstr "Explorar..."
 
-#: rc_option_editor.cc:84
+#: rc_option_editor.cc:89
+msgid "Emphasis on first beat:"
+msgstr "Énfasis en el primer golpe:"
+
+#: rc_option_editor.cc:95
+msgid "Use default Click:"
+msgstr "Usar claqueta predeterminada:"
+
+#: rc_option_editor.cc:101
+msgid "Click audio file:"
+msgstr "Archivo de audio de claqueta:"
+
+#: rc_option_editor.cc:108
 msgid "Click emphasis audio file:"
 msgstr "Archivo de audio de claqueta acentuada:"
 
-#: rc_option_editor.cc:116
+#: rc_option_editor.cc:154
 msgid "Choose Click"
 msgstr "Elige claqueta"
 
-#: rc_option_editor.cc:139
+#: rc_option_editor.cc:177
 msgid "Choose Click Emphasis"
 msgstr "Elige claqueta acentuada"
 
-#: rc_option_editor.cc:170
+#: rc_option_editor.cc:238
 msgid "Limit undo history to"
 msgstr "Limitar historial de deshacer a"
 
-#: rc_option_editor.cc:171
+#: rc_option_editor.cc:239
 msgid "Save undo history of"
-msgstr "Guardar historial de deshacer de"
+msgstr "Guardar historial de deshacer para"
 
-#: rc_option_editor.cc:180 rc_option_editor.cc:187
+#: rc_option_editor.cc:248 rc_option_editor.cc:255
 msgid "commands"
 msgstr "comandos"
 
-#: rc_option_editor.cc:325
+#: rc_option_editor.cc:378
+msgid ""
+"\n"
+"Changes to this setting will only persist after your project has been saved."
+msgstr ""
+
+#: rc_option_editor.cc:389 rc_option_editor.cc:451
+msgid "<b>Recommended Setting: %1 + button 3 (right mouse button)</b>%2"
+msgstr ""
+
+#: rc_option_editor.cc:403
+msgid "Select Keyboard layout:"
+msgstr "Seleccionar disposición de teclado:"
+
+#: rc_option_editor.cc:422
+msgid "When Clicking:"
+msgstr "Al hacer clic:"
+
+#: rc_option_editor.cc:429
 msgid "Edit using:"
 msgstr "Editar usando:"
 
-#: rc_option_editor.cc:331 rc_option_editor.cc:357 rc_option_editor.cc:384
+#: rc_option_editor.cc:435 rc_option_editor.cc:465 rc_option_editor.cc:495
 msgid "+ button"
 msgstr "+ botón"
 
-#: rc_option_editor.cc:351
+#: rc_option_editor.cc:459
 msgid "Delete using:"
 msgstr "Eliminar usando:"
 
-#: rc_option_editor.cc:378
+#: rc_option_editor.cc:481
+msgid "<b>Recommended Setting: %1 + button 1 (left mouse button)</b>%2"
+msgstr ""
+
+#: rc_option_editor.cc:489
 msgid "Insert note using:"
 msgstr "Insertar nota usando:"
 
-#: rc_option_editor.cc:405
+#: rc_option_editor.cc:507
+msgid "When Beginning a Drag:"
+msgstr "Cuando se empieza a arrastrar:"
+
+#: rc_option_editor.cc:518 rc_option_editor.cc:545 rc_option_editor.cc:578
+#: rc_option_editor.cc:599 rc_option_editor.cc:643 rc_option_editor.cc:676
+#: rc_option_editor.cc:702 rc_option_editor.cc:730 rc_option_editor.cc:759
+#: rc_option_editor.cc:781
+msgid "<b>Recommended Setting: %1</b>%2"
+msgstr "<b>Configuración recomendada: %1</b>%2"
+
+#: rc_option_editor.cc:532
+msgid "Copy items using:"
+msgstr "Copiar elementos usando:"
+
+#: rc_option_editor.cc:559
+msgid "Constrain drag using:"
+msgstr ""
+
+#: rc_option_editor.cc:567
+msgid "When Beginning a Trim:"
+msgstr "Cuando se comienza a recortar:"
+
+#: rc_option_editor.cc:586
+msgid "Trim contents using:"
+msgstr "Recortar contenidos usando:"
+
+#: rc_option_editor.cc:607
+msgid "Anchored trim using:"
+msgstr "Recorte anclado usando:"
+
+#: rc_option_editor.cc:651
+msgid "Resize notes relatively using:"
+msgstr "Redimensionar notas relativamente usando:"
+
+#: rc_option_editor.cc:660
+msgid "While Dragging:"
+msgstr "Mientras se arrastra:"
+
+#: rc_option_editor.cc:684
 msgid "Ignore snap using:"
 msgstr "Ignorar ajuste usando:"
 
-#: rc_option_editor.cc:421
-msgid "Keyboard layout:"
-msgstr "Disposición de teclado:"
+#: rc_option_editor.cc:710
+msgid "Snap relatively using:"
+msgstr "Ajustar relativamente usando:"
+
+#: rc_option_editor.cc:718
+msgid "While Trimming:"
+msgstr "Mientras se recorta:"
 
-#: rc_option_editor.cc:544
-msgid "Font scaling:"
-msgstr "Escalado de tipografía:"
+#: rc_option_editor.cc:738
+msgid "Resize overlapped regions using:"
+msgstr "Redimensionar regiones superpuestas usando:"
 
-#: rc_option_editor.cc:547
+#: rc_option_editor.cc:746
+msgid "While Dragging Control Points:"
+msgstr "Mientras se arrastran puntos de control:"
+
+#: rc_option_editor.cc:767
+msgid "Fine adjust using:"
+msgstr "Ajuste fino usando:"
+
+#: rc_option_editor.cc:789
+msgid "Push points using:"
+msgstr "Empujar puntos usando:"
+
+#: rc_option_editor.cc:1029
+msgid "GUI and Font scaling:"
+msgstr "Escalado de interfaz gráfica y tipografía:"
+
+#: rc_option_editor.cc:1032
 msgid "Default"
 msgstr "Predeterminado"
 
-#: rc_option_editor.cc:573
-msgid "Major font-scale changes require an application restart to re-layout."
+#: rc_option_editor.cc:1058
+msgid "Adjusting the scale requires an application restart to re-layout."
+msgstr "Ajustar la escala requiere reiniciar la aplicación."
+
+#: rc_option_editor.cc:1100
+msgid "\\u221e"
+msgstr ""
+
+#: rc_option_editor.cc:1101
+msgid "30 sec"
+msgstr ""
+
+#: rc_option_editor.cc:1102
+msgid "1 min"
+msgstr ""
+
+#: rc_option_editor.cc:1103
+msgid "2 mins"
+msgstr ""
+
+#: rc_option_editor.cc:1104
+msgid "3 mins"
+msgstr ""
+
+#: rc_option_editor.cc:1105
+msgid "4 mins"
+msgstr ""
+
+#: rc_option_editor.cc:1106
+msgid "5 mins"
+msgstr ""
+
+#: rc_option_editor.cc:1109
+msgid ""
+"Specify the default timeout for plugin instantiation. Plugins that require "
+"more time to load will be blacklisted. A value of 0 disables the timeout."
+msgstr ""
+
+#: rc_option_editor.cc:1111
+msgid "Scan Time Out:"
 msgstr ""
 
-#: rc_option_editor.cc:614
+#: rc_option_editor.cc:1159
 msgid "Waveform Clip Level (dBFS):"
 msgstr ""
 
-#: rc_option_editor.cc:666
+#: rc_option_editor.cc:1212
+msgid "Small sessions (4-16 tracks)"
+msgstr "Sesiones pequeñas (4-16 pistas)"
+
+#: rc_option_editor.cc:1213
+msgid "Medium sessions (16-64 tracks)"
+msgstr ""
+
+#: rc_option_editor.cc:1214
+msgid "Large sessions (64+ tracks)"
+msgstr ""
+
+#: rc_option_editor.cc:1215
+msgid "Custom (set by sliders below)"
+msgstr ""
+
+#: rc_option_editor.cc:1219 export_video_dialog.cc:167
+msgid "Preset:"
+msgstr "Preset:"
+
+#: rc_option_editor.cc:1231
 msgid "Playback (seconds of buffering):"
-msgstr "Reproducción (segundos de buffering)"
+msgstr "Reproducción (segundos de buffering):"
 
-#: rc_option_editor.cc:679
+#: rc_option_editor.cc:1244
 msgid "Recording (seconds of buffering):"
 msgstr "Grabación (segundos de buffering)"
 
-#: rc_option_editor.cc:737
+#: rc_option_editor.cc:1322
+msgid "programming error: unknown buffering preset string, index = %1"
+msgstr ""
+
+#: rc_option_editor.cc:1353
 msgid "Control Surface Protocol"
 msgstr ""
 
-#: rc_option_editor.cc:746
-msgid "Double-click on a name to edit settings for an enabled protocol"
+#: rc_option_editor.cc:1367
+msgid ""
+"Click to edit the settings for selected protocol ( it must be ENABLED "
+"first ):"
 msgstr ""
-"Doble clic en un nombre para editar ajustes para un protocolo habilitado"
+"Pulsa para editar la configuración del protocolo seleccionado (debe estar "
+"habilitado):"
 
-#: rc_option_editor.cc:903
+#: rc_option_editor.cc:1371
+msgid "Show Protocol Settings"
+msgstr "Mostrar ajustes de protocolo"
+
+#: rc_option_editor.cc:1494
+msgid "Configuration"
+msgstr "Configuración:"
+
+#: rc_option_editor.cc:1547
 msgid "Show Video Export Info before export"
 msgstr "Mostrar información antes de exportar"
 
-#: rc_option_editor.cc:904
+#: rc_option_editor.cc:1548
 msgid "Show Video Server Startup Dialog"
 msgstr "Mostrar diálogo de arranque de servidor de video"
 
-#: rc_option_editor.cc:905
+#: rc_option_editor.cc:1549
 msgid "Advanced Setup (remote video server)"
 msgstr "Configuración avanzada (servidor de video remoto)"
 
-#: rc_option_editor.cc:913
+#: rc_option_editor.cc:1556
+msgid "Video Server"
+msgstr "Servidor de video"
+
+#: rc_option_editor.cc:1565
 msgid ""
 "<b>When enabled</b> you can speficify a custom video-server URL and docroot. "
 "- Do not enable this option unless you know what you are doing."
 msgstr ""
 
-#: rc_option_editor.cc:915
+#: rc_option_editor.cc:1567
 msgid "Video Server URL:"
 msgstr "URL del servidor de video:"
 
-#: rc_option_editor.cc:920
+#: rc_option_editor.cc:1572
 msgid ""
 "Base URL of the video-server including http prefix. This is usually 'http://"
 "hostname.example.org:1554/' and defaults to 'http://localhost:1554/' when "
 "the video-server is running locally"
 msgstr ""
 
-#: rc_option_editor.cc:922
+#: rc_option_editor.cc:1574
 msgid "Video Folder:"
 msgstr "Carpeta de videos:"
 
-#: rc_option_editor.cc:927
+#: rc_option_editor.cc:1579
 msgid ""
 "Local path to the video-server document-root. Only files below this "
 "directory will be accessible by the video-server. If the server run on a "
@@ -9103,191 +10915,125 @@ msgid ""
 "monitor and file-browsing when opening/adding a video file."
 msgstr ""
 
-#: rc_option_editor.cc:934
+#: rc_option_editor.cc:1584
 msgid ""
 "<b>When enabled</b> an information window with details is displayed before "
 "the video-export dialog."
 msgstr ""
 
-#: rc_option_editor.cc:939
+#: rc_option_editor.cc:1589
 msgid ""
 "<b>When enabled</b> the video server is never launched automatically without "
 "confirmation"
 msgstr ""
 
-#: rc_option_editor.cc:1022
-msgid "Always Display Plugin Scan Progress"
-msgstr "Mostrar siempre progreso de escaneo de plugins"
-
-#: rc_option_editor.cc:1023
-msgid "Scan for [new] VST Plugins on Application Start"
-msgstr "Buscar plugins VST al arrancar la aplicación "
-
-#: rc_option_editor.cc:1024
-msgid "Scan for AudioUnit Plugins on Application Start"
-msgstr "Busca plugins AudioUnit al arrancar la aplicación "
-
-#: rc_option_editor.cc:1035
-msgid "General"
-msgstr "General"
-
-#: rc_option_editor.cc:1041
-msgid "Scan for Plugins"
-msgstr "Escanear plugins"
+#: rc_option_editor.cc:1598
+msgid "Custom Path to Video Monitor (%1) - leave empty for default:"
+msgstr ""
 
-#: rc_option_editor.cc:1048
+#: rc_option_editor.cc:1610
 msgid ""
-"<b>When enabled</b> a popup window showing plugin scan progress is displayed "
-"for indexing (cache load) and discovery (detect new plugins)"
+"Set a custom path to the Video Monitor Executable, changing this requires a "
+"restart."
 msgstr ""
 
-#: rc_option_editor.cc:1055
-msgid ""
-"Specify the default timeout for plugin instantiation in 1/10 seconds. "
-"Plugins that require more time to load will be blacklisted. A value of 0 "
-"disables the timeout."
+#: rc_option_editor.cc:1661
+msgid "Set Video Monitor Executable"
 msgstr ""
 
-#: rc_option_editor.cc:1057
-msgid "Scan Time Out [deciseconds]"
-msgstr "Tiempo restante [decisegundos]"
+#: rc_option_editor.cc:1734
+msgid "Column %1"
+msgstr ""
 
-#: rc_option_editor.cc:1065
-msgid "VST"
-msgstr "VST"
+#: rc_option_editor.cc:1852
+msgid "%1 Preferences"
+msgstr "Preferencias de %1"
 
-#: rc_option_editor.cc:1071
-msgid "Clear VST Cache"
-msgstr "Limpiar caché de plugins VST"
+#: rc_option_editor.cc:1874
+msgid "DSP CPU Utilization"
+msgstr "Uso de DSP CPU"
 
-#: rc_option_editor.cc:1075
-msgid "Clear VST Blacklist"
-msgstr "Limpiar lista negra de plugins VST"
+#: rc_option_editor.cc:1878
+msgid "Signal processing uses"
+msgstr "Usos de procesado de señal"
 
-#: rc_option_editor.cc:1083
-msgid ""
-"<b>When enabled</b> new VST plugins are searched, tested and added to the "
-"cache index on application start. When disabled new plugins will only be "
-"available after triggering a 'Scan' manually"
-msgstr ""
+#: rc_option_editor.cc:1883
+msgid "all but one processor"
+msgstr "todos los procesadores menos uno"
 
-#: rc_option_editor.cc:1086
-msgid "Linux VST Path:"
-msgstr ""
+#: rc_option_editor.cc:1884
+msgid "all available processors"
+msgstr "todos los procesadores disponibles"
 
-#: rc_option_editor.cc:1093
-msgid "Windows VST Path:"
-msgstr ""
+#: rc_option_editor.cc:1887
+msgid "%1 processors"
+msgstr "%1 procesador(es)"
 
-#: rc_option_editor.cc:1102
-msgid "Audio Unit"
-msgstr "Audio Unit"
-
-#: rc_option_editor.cc:1111
-msgid ""
-"<b>When enabled</b> Audio Unit Plugins are discovered on application start. "
-"When disabled AU plugins will only be available after triggering a 'Scan' "
-"manually. The first successful scan will enable AU auto-scan, Any crash "
-"during plugin discovery will disable it."
-msgstr ""
-
-#: rc_option_editor.cc:1114
-msgid "Clear AU Cache"
-msgstr "Limpiar caché de plugins AU"
-
-#: rc_option_editor.cc:1118
-msgid "Clear AU Blacklist"
-msgstr "Limpiar lista negra de plugins AU"
-
-#: rc_option_editor.cc:1201
-msgid "Set Windows VST Search Path"
-msgstr "Establecer ruta de búsqueda de plugins Windows VST"
-
-#: rc_option_editor.cc:1216
-msgid "Set Linux VST Search Path"
-msgstr "Establecer ruta de búsqueda de plugins Linux VST"
-
-#: rc_option_editor.cc:1297
-msgid "%1 Preferences"
-msgstr "Preferencias de %1"
-
-#: rc_option_editor.cc:1309
-msgid "DSP CPU Utilization"
-msgstr "Uso de DSP CPU"
-
-#: rc_option_editor.cc:1313
-msgid "Signal processing uses"
-msgstr "Usos de procesado de señal"
-
-#: rc_option_editor.cc:1318
-msgid "all but one processor"
-msgstr "todos los procesadores menos uno"
-
-#: rc_option_editor.cc:1319
-msgid "all available processors"
-msgstr "todos los procesadores disponibles"
-
-#: rc_option_editor.cc:1322
-msgid "%1 processors"
-msgstr "%1 procesadores"
-
-#: rc_option_editor.cc:1325
+#: rc_option_editor.cc:1890
 msgid "This setting will only take effect when %1 is restarted."
-msgstr "Esta configuración sólo tendrá efecto cuando %1 sea reiniciado"
+msgstr "Esta configuración sólo tendrá efecto después de reiniciar %1."
 
-#: rc_option_editor.cc:1330
+#: rc_option_editor.cc:1895
 msgid "Options|Undo"
 msgstr "Opciones de deshacer"
 
-#: rc_option_editor.cc:1337
+#: rc_option_editor.cc:1902
 msgid "Verify removal of last capture"
 msgstr "Verificar borrado de última captura"
 
-#: rc_option_editor.cc:1345
-msgid "Make periodic backups of the session file"
-msgstr "Hacer copias de seguridad periódicas del archivo de sesión"
-
-#: rc_option_editor.cc:1350
+#: rc_option_editor.cc:1907
 msgid "Session Management"
 msgstr "Gestión de sesiones"
 
-#: rc_option_editor.cc:1355
+#: rc_option_editor.cc:1912
+msgid "Make periodic backups of the session file"
+msgstr "Hacer copias de seguridad periódicas del archivo de sesión"
+
+#: rc_option_editor.cc:1920
 msgid "Always copy imported files"
 msgstr "Copiar siempre archivos importados"
 
-#: rc_option_editor.cc:1362
+#: rc_option_editor.cc:1927
 msgid "Default folder for new sessions:"
 msgstr "Carpeta predeterminada para sesiones nuevas:"
 
-#: rc_option_editor.cc:1370
+#: rc_option_editor.cc:1935
 msgid "Maximum number of recent sessions"
 msgstr "Número máximo de sesiones recientes"
 
-#: rc_option_editor.cc:1383
+#: rc_option_editor.cc:1941 rc_option_editor.cc:1943 rc_option_editor.cc:1945
+msgid "Misc/Click"
+msgstr "Misc/Claqueta"
+
+#: rc_option_editor.cc:1948
 msgid "Click gain level"
 msgstr "Nivel de ganancia de claqueta"
 
-#: rc_option_editor.cc:1388 route_time_axis.cc:266 route_time_axis.cc:821
+#: rc_option_editor.cc:1953 route_time_axis.cc:277 route_time_axis.cc:831
 msgid "Automation"
 msgstr "Automatización"
 
-#: rc_option_editor.cc:1393
+#: rc_option_editor.cc:1958
 msgid "Thinning factor (larger value => less data)"
 msgstr "Factor de adelgazamiento (mayor valor => menos datos)"
 
-#: rc_option_editor.cc:1402
+#: rc_option_editor.cc:1967
 msgid "Automation sampling interval (milliseconds)"
 msgstr "Intervalo de sampleado de automatización (milisegundos)"
 
-#: rc_option_editor.cc:1414
+#: rc_option_editor.cc:1975
+msgid "Transport Options"
+msgstr "Opciones de transporte"
+
+#: rc_option_editor.cc:1981
 msgid "Keep record-enable engaged on stop"
 msgstr "Mantener la grabación preparada al detener"
 
-#: rc_option_editor.cc:1423
+#: rc_option_editor.cc:1990
 msgid "Play loop is a transport mode"
 msgstr ""
 
-#: rc_option_editor.cc:1428
+#: rc_option_editor.cc:1995
 msgid ""
 "<b>When enabled</b> the loop button does not start playback but forces "
 "playback to always play the loop\n"
@@ -9295,12 +11041,17 @@ msgid ""
 "<b>When disabled</b> the loop button starts playing the loop, but stop then "
 "cancels loop playback"
 msgstr ""
+"<b>Si está habilitado</b> se reproduce el bucle sin parar aunque el botón de "
+"bucle no inicia la reproducción\n"
+"\n"
+"<b>Si está deshabilitado</b> el botón de bucle inicia la reproducción del "
+"rango de bucle pero se para al finalizar éste."
 
-#: rc_option_editor.cc:1434
+#: rc_option_editor.cc:2001
 msgid "Stop recording when an xrun occurs"
 msgstr "Detener grabación al detectar xrun"
 
-#: rc_option_editor.cc:1439
+#: rc_option_editor.cc:2006
 msgid ""
 "<b>When enabled</b> %1 will stop recording if an over- or underrun is "
 "detected by the audio engine"
@@ -9308,15 +11059,15 @@ msgstr ""
 "Si está <b>habilitado</b> %1 dejará de grabar si el motor de audio detecta "
 "un x-run"
 
-#: rc_option_editor.cc:1445
+#: rc_option_editor.cc:2012
 msgid "Create markers where xruns occur"
 msgstr "Crear marca en posición de xrun"
 
-#: rc_option_editor.cc:1454
+#: rc_option_editor.cc:2021
 msgid "Stop at the end of the session"
 msgstr "Parar en el fin de sesión"
 
-#: rc_option_editor.cc:1459
+#: rc_option_editor.cc:2026
 msgid ""
 "<b>When enabled</b> if %1 is <b>not recording</b>, it will stop the "
 "transport when it reaches the current session end marker\n"
@@ -9330,11 +11081,11 @@ msgstr ""
 "Si está <b>deshabilitado</b> %1 seguirá adelante al alcanzar la marca de fin "
 "de sesión, en todo caso"
 
-#: rc_option_editor.cc:1467
+#: rc_option_editor.cc:2034
 msgid "Do seamless looping (not possible when slaved to MTC, LTC etc)"
 msgstr ""
 
-#: rc_option_editor.cc:1472
+#: rc_option_editor.cc:2039
 msgid ""
 "<b>When enabled</b> this will loop by reading ahead and wrapping around at "
 "the loop point, preventing any need to do a transport locate at the end of "
@@ -9350,11 +11101,11 @@ msgstr ""
 "<b>When disabled</b> looping is done by locating back to the start of the "
 "loop when %1 reaches the end which will often cause a small click or delay"
 
-#: rc_option_editor.cc:1480
+#: rc_option_editor.cc:2047
 msgid "Disable per-track record disarm while rolling"
 msgstr "Impedir desactivación de grabación por pista con el transporte activo"
 
-#: rc_option_editor.cc:1484
+#: rc_option_editor.cc:2051
 msgid ""
 "<b>When enabled</b> this will prevent you from accidentally stopping "
 "specific tracks recording during a take"
@@ -9362,11 +11113,11 @@ msgstr ""
 "<b>Si está activado</b> impedirá que se desactive la grabación de pistas "
 "específicas durante una toma"
 
-#: rc_option_editor.cc:1489
+#: rc_option_editor.cc:2056
 msgid "12dB gain reduction during fast-forward and fast-rewind"
 msgstr "Reducir ganancia 12db en avance rápido y rebobinado"
 
-#: rc_option_editor.cc:1493
+#: rc_option_editor.cc:2060
 msgid ""
 "This will reduce the unpleasant increase in perceived volume that occurs "
 "when fast-forwarding or rewinding through some kinds of audio"
@@ -9374,19 +11125,64 @@ msgstr ""
 "Esto reduce el desagradable incremento de volumen percibido que ocurre a "
 "veces al rebobinar o acelerar"
 
-#: rc_option_editor.cc:1497
-msgid "Sync/Slave"
+# podría ser "desplazar", chequear contexto
+#: rc_option_editor.cc:2066
+msgid "Preroll"
+msgstr ""
+
+#: rc_option_editor.cc:2071
+msgid ""
+"The amount of preroll (in seconds) to apply when <b>Play with Preroll</b> is "
+"initiated.\n"
+"\n"
+"If <b>Follow Edits</b> is enabled, the preroll is applied to the playhead "
+"position when a region is selected or trimmed."
+msgstr ""
+
+#: rc_option_editor.cc:2073
+msgid "0 (no pre-roll)"
 msgstr ""
 
-#: rc_option_editor.cc:1501
+#: rc_option_editor.cc:2074
+msgid "0.1 second"
+msgstr ""
+
+#: rc_option_editor.cc:2075
+msgid "0.25 second"
+msgstr ""
+
+#: rc_option_editor.cc:2076
+msgid "0.5 second"
+msgstr ""
+
+#: rc_option_editor.cc:2077
+msgid "1.0 second"
+msgstr ""
+
+#: rc_option_editor.cc:2078
+msgid "2.0 seconds"
+msgstr ""
+
+#: rc_option_editor.cc:2081 rc_option_editor.cc:2090 rc_option_editor.cc:2106
+#: rc_option_editor.cc:2127 rc_option_editor.cc:2145 rc_option_editor.cc:2147
+#: rc_option_editor.cc:2164 rc_option_editor.cc:2167 rc_option_editor.cc:2169
+#: rc_option_editor.cc:2197
+msgid "Transport/Sync"
+msgstr "Transporte/Sync"
+
+#: rc_option_editor.cc:2081
+msgid "Synchronization and Slave Options"
+msgstr "Opciones de sincronización y esclavos"
+
+#: rc_option_editor.cc:2085
 msgid "External timecode source"
 msgstr "Origen de timecode externo"
 
-#: rc_option_editor.cc:1510
+#: rc_option_editor.cc:2094
 msgid "Match session video frame rate to external timecode"
 msgstr ""
 
-#: rc_option_editor.cc:1516
+#: rc_option_editor.cc:2100
 msgid ""
 "This option controls the value of the video frame rate <i>while chasing</i> "
 "an external timecode source.\n"
@@ -9400,27 +11196,27 @@ msgid ""
 "external timecode standard and the session standard."
 msgstr ""
 
-#: rc_option_editor.cc:1526
-msgid "Sync lock timecode to clock - Disable drift compensation."
+#: rc_option_editor.cc:2110
+msgid "Sync-lock timecode to clock (disable drift compensation)"
 msgstr ""
 
-#: rc_option_editor.cc:1532
+#: rc_option_editor.cc:2116
 msgid ""
 "<b>When enabled</b> %1 will never varispeed when slaved to external "
 "timecode. Sync Lock indicates that the selected external timecode source "
 "shares clock-sync (Black & Burst, Wordclock, etc) with the audio "
 "interface. This option disables drift compensation. The transport speed is "
-"fixed at 1.0.Varispeed LTC will be ignored and cause drift.\n"
+"fixed at 1.0. Vari-speed LTC will be ignored and cause drift.\n"
 "\n"
 "<b>When disabled</b> %1 will compensate for potential drift, regardless if "
 "the timecode sources shares clock sync."
 msgstr ""
 
-#: rc_option_editor.cc:1547
+#: rc_option_editor.cc:2131
 msgid "Lock to 29.9700 fps instead of 30000/1001"
 msgstr ""
 
-#: rc_option_editor.cc:1553
+#: rc_option_editor.cc:2137
 msgid ""
 "<b>When enabled</b> the external timecode source is assumed to use 29.97 fps "
 "instead of 30000/1001.\n"
@@ -9433,669 +11229,946 @@ msgid ""
 "variant of using exactly 29.97 fps has zero timecode drift.\n"
 msgstr ""
 
-#: rc_option_editor.cc:1563
+#: rc_option_editor.cc:2147
 msgid "LTC Reader"
 msgstr ""
 
-#: rc_option_editor.cc:1567
+#: rc_option_editor.cc:2151
 msgid "LTC incoming port"
 msgstr ""
 
-#: rc_option_editor.cc:1582
+#: rc_option_editor.cc:2167
 msgid "LTC Generator"
 msgstr "Generador LTC "
 
-#: rc_option_editor.cc:1587
+#: rc_option_editor.cc:2172
 msgid "Enable LTC generator"
 msgstr "Habilitar generador LTC"
 
-#: rc_option_editor.cc:1594
+#: rc_option_editor.cc:2179
 msgid "Send LTC while stopped"
 msgstr ""
 
-#: rc_option_editor.cc:1600
+#: rc_option_editor.cc:2185
 msgid ""
 "<b>When enabled</b> %1 will continue to send LTC information even when the "
 "transport (playhead) is not moving"
 msgstr ""
 
-#: rc_option_editor.cc:1606
+#: rc_option_editor.cc:2191
 msgid "LTC generator level"
 msgstr ""
 
-#: rc_option_editor.cc:1610
+#: rc_option_editor.cc:2195
 msgid ""
 "Specify the Peak Volume of the generated LTC signal in dbFS. A good value "
 "is  0dBu ^= -18dbFS in an EBU calibrated system"
 msgstr ""
 
-#: rc_option_editor.cc:1622
-msgid "Allow dragging of playhead"
-msgstr ""
+#: rc_option_editor.cc:2204
+msgid "Make rubberband selection rectangle snap to the grid"
+msgstr "Hacer que el rectángulo de selección elástica se ajuste a rejilla"
 
-#: rc_option_editor.cc:1630
-msgid "Move relevant automation when audio regions are moved"
-msgstr "Mover automatización relevante al desplazar regiones de audio"
+#: rc_option_editor.cc:2211
+msgid "Name new markers"
+msgstr "Nombrar marcas nuevas"
 
-#: rc_option_editor.cc:1638
-msgid "Show meters on tracks in the editor"
-msgstr "Mostrar medidores en pistas en Editor"
+#: rc_option_editor.cc:2216
+msgid ""
+"If enabled, popup a dialog when a new marker is created to allow its name to "
+"be set as it is created.\n"
+"\n"
+"You can always rename markers by right-clicking on them"
+msgstr ""
+"Si está activo, cada vez que se crea una marca aparece una ventanita para "
+"nombrar la marca\n"
+"\n"
+"(Las marcas se pueden renombrar en cualquier momento, por medio del clic "
+"derecho)"
 
-#: rc_option_editor.cc:1646
+#: rc_option_editor.cc:2222
+msgid "Allow dragging of playhead"
+msgstr "Permitir arrastrado de cursor"
+
+#: rc_option_editor.cc:2230
 msgid "Display master-meter in the toolbar"
+msgstr "Mostrar medidor máster en la barra de herramientas"
+
+#: rc_option_editor.cc:2239
+msgid "Show zoom toolbar (if torn off)"
+msgstr "Mostrar barra de herramientas de zoom"
+
+#: rc_option_editor.cc:2247
+msgid ""
+"Always use mouse cursor position as zoom focus when zooming using mouse "
+"scroll wheel"
 msgstr ""
+"Usar siempre la posición del ratón como foco del zoom cuando se hace zoom "
+"con la rueda del ratón "
 
-#: rc_option_editor.cc:1653
-msgid "Default fade shape"
+#: rc_option_editor.cc:2256
+msgid "Update editor window during drags of the summary"
+msgstr "Actualizar la ventana del editor durante arrastres del resumen"
+
+#: rc_option_editor.cc:2264
+msgid "Auto-scroll editor window when dragging near its edges"
 msgstr ""
+"Auto-scroll en la ventana del editor cuando se arrastra hacia cerca de sus "
+"bordes"
+
+#: rc_option_editor.cc:2272
+msgid "Show gain envelopes in audio regions"
+msgstr "Mostrar envolventes de ganancia en regiones de audio"
+
+#: rc_option_editor.cc:2273
+msgid "in all modes"
+msgstr "en todos los modos"
+
+#: rc_option_editor.cc:2274
+msgid "only in Draw and Internal Edit modes"
+msgstr "sólo en modos de dibujo y ediciones internas"
+
+#: rc_option_editor.cc:2279
+msgid "Editor Behavior"
+msgstr "Comportamiento del Editor"
+
+#: rc_option_editor.cc:2284
+msgid "Move relevant automation when audio regions are moved"
+msgstr "Mover automatización relevante al desplazar regiones de audio"
+
+#: rc_option_editor.cc:2291
+msgid "Default fade shape"
+msgstr "Forma de fundido predeterminada"
 
-#: rc_option_editor.cc:1672
+#: rc_option_editor.cc:2310
 msgid "Regions in active edit groups are edited together"
 msgstr "Las regiones en los grupos de edición activos se editan juntas"
 
-#: rc_option_editor.cc:1673
+#: rc_option_editor.cc:2311
 msgid "whenever they overlap in time"
 msgstr "cuando se solapan en el tiempo"
 
-#: rc_option_editor.cc:1674
+#: rc_option_editor.cc:2312
 msgid "only if they have identical length, position and origin"
 msgstr "sólo si tienen la misma duración, posición y origen"
 
-#: rc_option_editor.cc:1684
-msgid "Make rubberband selection rectangle snap to the grid"
-msgstr "Hacer que el rectángulo de selección elástica se ajuste a rejilla"
+#: rc_option_editor.cc:2321
+msgid "Layering model"
+msgstr "Modelo de superposición"
 
-#: rc_option_editor.cc:1692
-msgid "Show waveforms in regions"
-msgstr "Mostrar formas de onda en regiones"
+#: rc_option_editor.cc:2326
+msgid "later is higher"
+msgstr "El más reciente arriba"
 
-#: rc_option_editor.cc:1700
-msgid "Show gain envelopes in audio regions"
-msgstr "Mostrar envolventes de ganancia en regiones de audio"
+#: rc_option_editor.cc:2327
+msgid "manual layering"
+msgstr "superposición manual"
 
-#: rc_option_editor.cc:1701
-msgid "in all modes"
-msgstr "en todos los modos"
+#: rc_option_editor.cc:2332
+msgid "After splitting selected regions, select"
+msgstr "Tras separar regiones seleccionadas, seleccionar"
+
+#: rc_option_editor.cc:2337
+msgid "no regions"
+msgstr "Ninguna región"
+
+#: rc_option_editor.cc:2340
+msgid "newly-created regions"
+msgstr "Regiones recién creadas"
+
+#: rc_option_editor.cc:2344
+msgid "existing selection and newly-created regions"
+msgstr "Regiones existentes y regiones recién creadas"
+
+#: rc_option_editor.cc:2348 rc_option_editor.cc:2351 rc_option_editor.cc:2360
+#: rc_option_editor.cc:2378 rc_option_editor.cc:2390 rc_option_editor.cc:2392
+msgid "Editor/Waveforms"
+msgstr ""
+
+#: rc_option_editor.cc:2348
+msgid "Waveforms"
+msgstr "Formas de onda"
+
+#: rc_option_editor.cc:2354
+msgid "Show waveforms in regions"
+msgstr "Mostrar formas de onda en regiones"
 
-#: rc_option_editor.cc:1702
-msgid "only in region gain mode"
-msgstr "sólo en el modo de ganancia de región"
+#: rc_option_editor.cc:2363
+msgid "Show waveforms for audio while it is being recorded"
+msgstr "Mostrar formas de onda al grabar audio"
 
-#: rc_option_editor.cc:1709
+#: rc_option_editor.cc:2370
 msgid "Waveform scale"
 msgstr "Escala de forma de onda"
 
-#: rc_option_editor.cc:1714
+#: rc_option_editor.cc:2375
 msgid "linear"
 msgstr "lineal"
 
-#: rc_option_editor.cc:1715
+#: rc_option_editor.cc:2376
 msgid "logarithmic"
 msgstr "logarítmica"
 
-#: rc_option_editor.cc:1721
+#: rc_option_editor.cc:2382
 msgid "Waveform shape"
 msgstr "Forma de onda"
 
 # en realidad no existe este término en el español...
-#: rc_option_editor.cc:1726
+#: rc_option_editor.cc:2387
 msgid "traditional"
 msgstr "tradicional"
 
-#: rc_option_editor.cc:1727
+#: rc_option_editor.cc:2388
 msgid "rectified"
 msgstr "rectificada"
 
-#: rc_option_editor.cc:1736
-msgid "Show waveforms for audio while it is being recorded"
-msgstr "Mostrar formas de onda al grabar audio"
-
-#: rc_option_editor.cc:1744
-msgid "Show zoom toolbar"
-msgstr "Mostrar barra de herramientas de zoom"
-
-#: rc_option_editor.cc:1752
-msgid "Update editor window during drags of the summary"
-msgstr "Actualizar la ventana del editor durante arrastres del resumen"
-
-#: rc_option_editor.cc:1760
-msgid "Synchronise editor and mixer selection"
-msgstr "Sincronizar selección en Editor y Mezclador"
-
-#: rc_option_editor.cc:1767
-msgid "Name new markers"
-msgstr "Nombrar marcas nuevas"
-
-#: rc_option_editor.cc:1773
-msgid ""
-"If enabled, popup a dialog when a new marker is created to allow its name to "
-"be set as it is created.\n"
-"\n"
-"You can always rename markers by right-clicking on them"
-msgstr ""
-"Si está activo, cada vez que se crea una marca aparece una ventanita para "
-"nombrar la marca\n"
-"\n"
-"(Las marcas se pueden renombrar en cualquier momento, por medio del clic "
-"derecho)"
-
-#: rc_option_editor.cc:1779
-msgid "Auto-scroll editor window when dragging near its edges"
-msgstr ""
-"Auto-scroll en la ventana del editor cuando se arrastra hacia cerca de sus "
-"bordes"
-
-#: rc_option_editor.cc:1786
-msgid "After splitting selected regions, select"
-msgstr ""
-
-#: rc_option_editor.cc:1791
-msgid "no regions"
-msgstr ""
-
-#: rc_option_editor.cc:1794
-msgid "newly-created regions"
-msgstr ""
-
-#: rc_option_editor.cc:1798
-msgid "existing selection and newly-created regions"
-msgstr ""
-
-#: rc_option_editor.cc:1805
+#: rc_option_editor.cc:2397
 msgid "Buffering"
 msgstr "Buffering"
 
-#: rc_option_editor.cc:1813
+#: rc_option_editor.cc:2405
 msgid "Record monitoring handled by"
 msgstr "Monitorización de la grabación manejado por"
 
-#: rc_option_editor.cc:1819
+#: rc_option_editor.cc:2411
 msgid "via Audio Driver"
 msgstr ""
 
-#: rc_option_editor.cc:1825
+#: rc_option_editor.cc:2417
 msgid "audio hardware"
 msgstr "hardware de audio"
 
-#: rc_option_editor.cc:1832
+#: rc_option_editor.cc:2424
 msgid "Tape machine mode"
 msgstr "Modo magnetófono"
 
-#: rc_option_editor.cc:1837
+#: rc_option_editor.cc:2429
 msgid "Connection of tracks and busses"
 msgstr "Conexión de pistas y buses"
 
-#: rc_option_editor.cc:1842
+#: rc_option_editor.cc:2435
 msgid "Auto-connect master/monitor busses"
 msgstr "Autoconectar buses master/monitor"
 
-#: rc_option_editor.cc:1849
+#: rc_option_editor.cc:2442
 msgid "Connect track inputs"
 msgstr "Conectar a entradas de pista"
 
-#: rc_option_editor.cc:1854
+#: rc_option_editor.cc:2447
 msgid "automatically to physical inputs"
 msgstr "automáticamente a entradas físicas"
 
-#: rc_option_editor.cc:1855 rc_option_editor.cc:1868
+#: rc_option_editor.cc:2448 rc_option_editor.cc:2461
 msgid "manually"
 msgstr "manualmente"
 
-#: rc_option_editor.cc:1861
+#: rc_option_editor.cc:2454
 msgid "Connect track and bus outputs"
 msgstr "Conectar salidas de pista y bus"
 
-#: rc_option_editor.cc:1866
+#: rc_option_editor.cc:2459
 msgid "automatically to physical outputs"
 msgstr "automáticamente a salidas físicas"
 
-#: rc_option_editor.cc:1867
+#: rc_option_editor.cc:2460
 msgid "automatically to master bus"
 msgstr "automáticamente al bus master"
 
-#: rc_option_editor.cc:1872
+#: rc_option_editor.cc:2467
+msgid "Use 'Strict-I/O' for new tracks or Busses"
+msgstr "Usar 'E/S estricto' para pistas y buses nuevos"
+
+#: rc_option_editor.cc:2478
 msgid "Denormals"
 msgstr "Denormals"
 
-#: rc_option_editor.cc:1877
+#: rc_option_editor.cc:2483
 msgid "Use DC bias to protect against denormals"
 msgstr "Usar DC bias para proteger contra denormals"
 
-#: rc_option_editor.cc:1884
+#: rc_option_editor.cc:2490
 msgid "Processor handling"
 msgstr "Manejo de procesador"
 
-#: rc_option_editor.cc:1890
+#: rc_option_editor.cc:2496
 msgid "no processor handling"
 msgstr "ningún manejo de procesador"
 
-#: rc_option_editor.cc:1896
+#: rc_option_editor.cc:2502
 msgid "use FlushToZero"
 msgstr "usar FlushToZero"
 
-#: rc_option_editor.cc:1903
+#: rc_option_editor.cc:2509
 msgid "use DenormalsAreZero"
 msgstr "usar DenormalsAreZero"
 
-#: rc_option_editor.cc:1910
+#: rc_option_editor.cc:2516
 msgid "use FlushToZero and DenormalsAreZero"
 msgstr "usar FlushToZero y DenormalsAreZero"
 
-#: rc_option_editor.cc:1926
-msgid "Silence plugins when the transport is stopped"
-msgstr "Silenciar plugins cuando el transporte esté parado"
-
-#: rc_option_editor.cc:1934
-msgid "Make new plugins active"
-msgstr "Nuevos plugins inician activados"
-
-#: rc_option_editor.cc:1944
+#: rc_option_editor.cc:2532
 msgid "Enable automatic analysis of audio"
 msgstr "Activar análisis automático de audio"
 
-#: rc_option_editor.cc:1952
+#: rc_option_editor.cc:2540
 msgid "Replicate missing region channels"
 msgstr "Duplicar canales de región ausentes"
 
-#: rc_option_editor.cc:1959 rc_option_editor.cc:1961 rc_option_editor.cc:1976
-#: rc_option_editor.cc:1988 rc_option_editor.cc:2000 rc_option_editor.cc:2012
-#: rc_option_editor.cc:2016 rc_option_editor.cc:2024 rc_option_editor.cc:2032
-#: rc_option_editor.cc:2040 rc_option_editor.cc:2042 rc_option_editor.cc:2050
-#: rc_option_editor.cc:2058 rc_option_editor.cc:2066 rc_option_editor.cc:2074
-#: rc_option_editor.cc:2076
-msgid "Solo / mute"
-msgstr "Solo / mudo"
+#: rc_option_editor.cc:2547 rc_option_editor.cc:2556 rc_option_editor.cc:2558
+#: rc_option_editor.cc:2566 rc_option_editor.cc:2574 rc_option_editor.cc:2582
+#: rc_option_editor.cc:2600 rc_option_editor.cc:2612 rc_option_editor.cc:2624
+#: rc_option_editor.cc:2626 rc_option_editor.cc:2628 rc_option_editor.cc:2636
+#: rc_option_editor.cc:2644 rc_option_editor.cc:2652 rc_option_editor.cc:2662
+#: rc_option_editor.cc:2663
+msgid "Solo & mute"
+msgstr "Solo y mudo"
 
-#: rc_option_editor.cc:1964
-msgid "Solo-in-place mute cut (dB)"
-msgstr "Corte de solo / mudo (dB)"
-
-#: rc_option_editor.cc:1971
+#: rc_option_editor.cc:2551
 msgid "Solo controls are Listen controls"
 msgstr "Los controles de solo son controles de escucha"
 
-#: rc_option_editor.cc:1980
+#: rc_option_editor.cc:2561
+msgid "Exclusive solo"
+msgstr "Solo exclusivo"
+
+#: rc_option_editor.cc:2569
+msgid "Show solo muting"
+msgstr "Mostrar mudos de solo"
+
+#: rc_option_editor.cc:2577
+msgid "Soloing overrides muting"
+msgstr "Solo invalida mudo"
+
+#: rc_option_editor.cc:2585
+msgid "Solo-in-place mute cut (dB)"
+msgstr "Corte de solo / mudo (dB)"
+
+#: rc_option_editor.cc:2592
 msgid "Listen Position"
 msgstr "Posición de escucha"
 
-#: rc_option_editor.cc:1985
+#: rc_option_editor.cc:2597
 msgid "after-fader (AFL)"
 msgstr "Post-fader (AFL) "
 
-#: rc_option_editor.cc:1986
+#: rc_option_editor.cc:2598
 msgid "pre-fader (PFL)"
 msgstr "pre-fader (PFL)"
 
-#: rc_option_editor.cc:1992
+#: rc_option_editor.cc:2604
 msgid "PFL signals come from"
 msgstr "Las señales PFL vienen desde"
 
-#: rc_option_editor.cc:1997
+#: rc_option_editor.cc:2609
 msgid "before pre-fader processors"
 msgstr "antes de procesadores pre-fader"
 
-#: rc_option_editor.cc:1998
+#: rc_option_editor.cc:2610
 msgid "pre-fader but after pre-fader processors"
 msgstr "pre-fader pero después de procesadores pre-fader"
 
-#: rc_option_editor.cc:2004
+#: rc_option_editor.cc:2616
 msgid "AFL signals come from"
 msgstr "Las señales AFL vienen desde"
 
-#: rc_option_editor.cc:2009
+#: rc_option_editor.cc:2621
 msgid "immediately post-fader"
 msgstr "inmediatamente post-fader"
 
-#: rc_option_editor.cc:2010
+#: rc_option_editor.cc:2622
 msgid "after post-fader processors (before pan)"
 msgstr "después de procesadores post-fader (antes de pan)"
 
-#: rc_option_editor.cc:2019
-msgid "Exclusive solo"
-msgstr "Solo exclusivo"
-
-#: rc_option_editor.cc:2027
-msgid "Show solo muting"
-msgstr "Mostrar mudos de solo"
-
-#: rc_option_editor.cc:2035
-msgid "Soloing overrides muting"
-msgstr "Solo invalida mudo"
-
-#: rc_option_editor.cc:2040
+#: rc_option_editor.cc:2626
 msgid "Default track / bus muting options"
 msgstr "Opciones predeterminadas para mudo de pista o bus"
 
-#: rc_option_editor.cc:2045
+#: rc_option_editor.cc:2631
 msgid "Mute affects pre-fader sends"
 msgstr "Mudo afecta envíos pre-fader"
 
-#: rc_option_editor.cc:2053
+#: rc_option_editor.cc:2639
 msgid "Mute affects post-fader sends"
 msgstr "Mudo afecta envíos post-fader"
 
-#: rc_option_editor.cc:2061
+#: rc_option_editor.cc:2647
 msgid "Mute affects control outputs"
 msgstr "Mudo afecta a salidas de control"
 
-#: rc_option_editor.cc:2069
+#: rc_option_editor.cc:2655
 msgid "Mute affects main outputs"
 msgstr "Mudo afecta a salidas principales"
 
-#: rc_option_editor.cc:2074
+#: rc_option_editor.cc:2662
 msgid "Send Routing"
-msgstr ""
+msgstr "Ruteado de envíos"
 
-#: rc_option_editor.cc:2079
+#: rc_option_editor.cc:2666
 msgid "Link panners of Aux and External Sends with main panner by default"
 msgstr ""
+"Enlazar panorámicas de envíos auxiliares y externos con el panorámico "
+"principal de forma predeterminada"
 
-#: rc_option_editor.cc:2087
+#: rc_option_editor.cc:2672
+msgid "MIDI Preferences"
+msgstr "Preferencias MIDI"
+
+#: rc_option_editor.cc:2677
 msgid "MIDI read-ahead time (seconds)"
 msgstr ""
 
-#: rc_option_editor.cc:2105
+#: rc_option_editor.cc:2687
+msgid "Initial program change"
+msgstr "Cambio de programa inicial"
+
+#: rc_option_editor.cc:2696
+msgid "Display first MIDI bank/program as 0"
+msgstr "Mostrar el primer banco o programa MIDI como 0"
+
+#: rc_option_editor.cc:2704
+msgid "Never display periodic MIDI messages (MTC, MIDI Clock)"
+msgstr "No mostrar mensajes MIDI periódicos (MTC, MIDI Clock)"
+
+#: rc_option_editor.cc:2712
+msgid "Sound MIDI notes as they are selected in the editor"
+msgstr "Las notas MIDI suenan al ser seleccionadas"
+
+#: rc_option_editor.cc:2720
+msgid "Send MIDI control feedback"
+msgstr "Enviar feedback de control MIDI"
+
+#: rc_option_editor.cc:2725 rc_option_editor.cc:2727 rc_option_editor.cc:2735
+#: rc_option_editor.cc:2737 rc_option_editor.cc:2745 rc_option_editor.cc:2754
+#: rc_option_editor.cc:2756 rc_option_editor.cc:2764 rc_option_editor.cc:2772
+#: rc_option_editor.cc:2781
+msgid "MIDI/Sync"
+msgstr "MIDI/Sync"
+
+#: rc_option_editor.cc:2725
+msgid "MIDI Clock"
+msgstr "MIDI Clock"
+
+#: rc_option_editor.cc:2735
+msgid "MIDI Time Code (MTC)"
+msgstr "MIDI Time Code (MTC)"
+
+#: rc_option_editor.cc:2740
 msgid "Send MIDI Time Code"
 msgstr "Enviar MIDI Time Code"
 
-#: rc_option_editor.cc:2113
+#: rc_option_editor.cc:2748
 msgid "Percentage either side of normal transport speed to transmit MTC"
 msgstr ""
 "Pocentaje a cada lado de la velocidad normal de transporte para transmitir "
 "MTC"
 
-#: rc_option_editor.cc:2122
+#: rc_option_editor.cc:2754
+msgid "Midi Machine Control (MMC)"
+msgstr "Midi Machine Control (MMC)"
+
+#: rc_option_editor.cc:2759
 msgid "Obey MIDI Machine Control commands"
 msgstr "Obedecer comandos de MIDI Machine Control"
 
-#: rc_option_editor.cc:2130
+#: rc_option_editor.cc:2767
 msgid "Send MIDI Machine Control commands"
 msgstr "Enviar comandos de MIDI Machine Control"
 
-#: rc_option_editor.cc:2138
-msgid "Send MIDI control feedback"
-msgstr "Enviar feedback de control MIDI"
-
-#: rc_option_editor.cc:2146
+#: rc_option_editor.cc:2775
 msgid "Inbound MMC device ID"
 msgstr "ID del dispositivo MMC de entrada"
 
-#: rc_option_editor.cc:2155
+#: rc_option_editor.cc:2784
 msgid "Outbound MMC device ID"
 msgstr "ID del dispositivo MMC de salida"
 
-#: rc_option_editor.cc:2164
-msgid "Initial program change"
-msgstr "Cambio de programa inicial"
-
-#: rc_option_editor.cc:2173
-msgid "Display first MIDI bank/program as 0"
-msgstr "Mostrar el primer banco o programa MIDi como 0"
-
-#: rc_option_editor.cc:2181
-msgid "Never display periodic MIDI messages (MTC, MIDI Clock)"
-msgstr "No mostrar mensajes MIDI periódicos (MTC, MIDI Clock)"
-
-#: rc_option_editor.cc:2189
-msgid "Sound MIDI notes as they are selected"
-msgstr "Las notas MIDI suenan al ser seleccionadas"
-
-#: rc_option_editor.cc:2194
+#: rc_option_editor.cc:2790
 msgid "Midi Audition"
 msgstr ""
 
-#: rc_option_editor.cc:2198
+#: rc_option_editor.cc:2794
 msgid "Midi Audition Synth (LV2)"
 msgstr ""
 
-#: rc_option_editor.cc:2229 rc_option_editor.cc:2239 rc_option_editor.cc:2241
+#: rc_option_editor.cc:2825 rc_option_editor.cc:2835 rc_option_editor.cc:2837
 msgid "User interaction"
 msgstr "Interacción con el usuario"
 
-#: rc_option_editor.cc:2232
+#: rc_option_editor.cc:2828
 msgid ""
 "Use translations of %1 messages\n"
 "   <i>(requires a restart of %1 to take effect)</i>\n"
 "   <i>(if available for your language preferences)</i>"
 msgstr ""
 
-#: rc_option_editor.cc:2239
+#: rc_option_editor.cc:2835
 msgid "Keyboard"
 msgstr "Teclado"
 
-#: rc_option_editor.cc:2249
-msgid "Control surface remote ID"
-msgstr "ID remota de superficies de control"
+#: rc_option_editor.cc:2848 startup.cc:352
+msgid "Scan for Plugins"
+msgstr "Escanear plugins"
 
-#: rc_option_editor.cc:2254
-msgid "assigned by user"
-msgstr "asignado por usuario"
+#: rc_option_editor.cc:2853
+msgid "General"
+msgstr "General"
+
+#: rc_option_editor.cc:2858
+msgid "Always Display Plugin Scan Progress"
+msgstr "Mostrar siempre el progreso de escaneado de plugins"
+
+#: rc_option_editor.cc:2864
+msgid ""
+"<b>When enabled</b> a popup window showing plugin scan progress is displayed "
+"for indexing (cache load) and discovery (detect new plugins)"
+msgstr ""
+
+#: rc_option_editor.cc:2869
+msgid "Silence plugins when the transport is stopped"
+msgstr "Silenciar plugins cuando el transporte está parado"
+
+#: rc_option_editor.cc:2875
+msgid ""
+"<b>When enabled</b> plugins will be reset at transport stop. When disabled "
+"plugins will be left unchanged at transport stop.\n"
+"\n"
+"This mostly affects plugins with a \"tail\" like Reverbs."
+msgstr ""
+
+#: rc_option_editor.cc:2879
+msgid "Make new plugins active"
+msgstr "Los plugins nuevos inician activados"
+
+#: rc_option_editor.cc:2885
+msgid ""
+"<b>When enabled</b> plugins will be activated when they are added to tracks/"
+"busses. When disabled plugins will be left inactive when they are added to "
+"tracks/busses"
+msgstr ""
+
+#: rc_option_editor.cc:2888 rc_option_editor.cc:2889 rc_option_editor.cc:2899
+#: rc_option_editor.cc:2911 rc_option_editor.cc:2916 rc_option_editor.cc:2918
+#: rc_option_editor.cc:2923 rc_option_editor.cc:2930 rc_option_editor.cc:2935
+#: rc_option_editor.cc:2944
+msgid "Plugins/VST"
+msgstr "Plugins/VST"
+
+#: rc_option_editor.cc:2888
+msgid "VST"
+msgstr "VST"
+
+#: rc_option_editor.cc:2895
+msgid "Scan for [new] VST Plugins on Application Start"
+msgstr "Buscar plugins VST al arrancar la aplicación "
+
+#: rc_option_editor.cc:2901
+msgid ""
+"<b>When enabled</b> new VST plugins are searched, tested and added to the "
+"cache index on application start. When disabled new plugins will only be "
+"available after triggering a 'Scan' manually"
+msgstr ""
+
+#: rc_option_editor.cc:2907
+msgid "Verbose Plugin Scan"
+msgstr ""
+
+#: rc_option_editor.cc:2913
+msgid ""
+"<b>When enabled</b> additional information for every plugin is added to the "
+"Log Window."
+msgstr ""
+
+#: rc_option_editor.cc:2921
+msgid "VST Cache:"
+msgstr "VST Cache:"
+
+#: rc_option_editor.cc:2926
+msgid "VST Blacklist:"
+msgstr "VST Blacklist:"
+
+#: rc_option_editor.cc:2933
+msgid "Linux VST Path:"
+msgstr ""
+
+#: rc_option_editor.cc:2938 rc_option_editor.cc:2951
+msgid "Path:"
+msgstr "Ruta:"
+
+#: rc_option_editor.cc:2947
+msgid "Windows VST Path:"
+msgstr ""
+
+#: rc_option_editor.cc:2958 rc_option_editor.cc:2959 rc_option_editor.cc:2973
+#: rc_option_editor.cc:2978
+msgid "Plugins/Audio Unit"
+msgstr "Plugins/Audio Unit"
+
+#: rc_option_editor.cc:2958
+msgid "Audio Unit"
+msgstr "Audio Unit"
+
+#: rc_option_editor.cc:2965
+msgid "Scan for AudioUnit Plugins on Application Start"
+msgstr "Busca plugins AudioUnit al arrancar la aplicación "
+
+#: rc_option_editor.cc:2971
+msgid ""
+"<b>When enabled</b> Audio Unit Plugins are discovered on application start. "
+"When disabled AU plugins will only be available after triggering a 'Scan' "
+"manually. The first successful scan will enable AU auto-scan, Any crash "
+"during plugin discovery will disable it."
+msgstr ""
+
+#: rc_option_editor.cc:2976
+msgid "AU Cache:"
+msgstr "AU Cache:"
+
+#: rc_option_editor.cc:2981
+msgid "AU Blacklist:"
+msgstr "AU Blacklist:"
+
+#: rc_option_editor.cc:2985
+msgid "Plugin GUI"
+msgstr "Plugin GUI"
+
+#: rc_option_editor.cc:2989
+msgid "Automatically open the plugin GUI when adding a new plugin"
+msgstr ""
+"Abrir el interfaz del plugin automáticamente cuando se añade un nuevo plugin"
+
+#: rc_option_editor.cc:2998
+msgid "Show Plugin Inline Display on Mixerstrip by default"
+msgstr "Mostrar el display en línea del plugin de forma predeterminada"
+
+#: rc_option_editor.cc:3005
+msgid ""
+"Don't automatically open the plugin GUI when the plugin has an inline "
+"display mode"
+msgstr ""
+"No abrir el interfaz del plugin automáticamente cuando éste tiene display en "
+"línea"
+
+#: rc_option_editor.cc:3012
+msgid "Instrument"
+msgstr "Instrumento"
+
+#: rc_option_editor.cc:3016
+msgid "Ask to replace existing instrument plugin"
+msgstr "Preguntar para reemplazar plugin de instrumento existente"
+
+#: rc_option_editor.cc:3024
+msgid "Interactively configure instrument plugins on insert"
+msgstr ""
+"Configurar los plugins de instrumentos de forma interactiva al insertarlo"
+
+#: rc_option_editor.cc:3030
+msgid ""
+"<b>When enabled</b> show a dialog to select instrument channel configuration "
+"before adding a multichannel plugin."
+msgstr ""
+
+#: rc_option_editor.cc:3039
+msgid "Disable Graphics Hardware Acceleration (requires restart)"
+msgstr "Deshabilitar aceleración gráfica por hardware (requiere reiniciar)"
+
+#: rc_option_editor.cc:3045
+msgid ""
+"Render large parts of the application user-interface in software, instead of "
+"using 2D-graphics acceleration.\n"
+"This requires restarting %1 before having an effect"
+msgstr ""
+
+#: rc_option_editor.cc:3046 rc_option_editor.cc:3058 rc_option_editor.cc:3061
+#: rc_option_editor.cc:3069 rc_option_editor.cc:3077 rc_option_editor.cc:3085
+#: rc_option_editor.cc:3093 rc_option_editor.cc:3104 rc_option_editor.cc:3120
+#: rc_option_editor.cc:3136 rc_option_editor.cc:3151 rc_option_editor.cc:3160
+#: rc_option_editor.cc:3168
+msgid "Preferences|GUI"
+msgstr ""
+
+#: rc_option_editor.cc:3052
+msgid "Possibly improve slow graphical performance (requires restart)"
+msgstr ""
 
-#: rc_option_editor.cc:2255
-msgid "follows order of mixer"
-msgstr "según orden de Mezclador"
+#: rc_option_editor.cc:3057
+msgid ""
+"Disables hardware gradient rendering on buggy video drivers (\"buggy "
+"gradients patch\").\n"
+"This requires restarting %1 before having an effect"
+msgstr ""
 
-#: rc_option_editor.cc:2269 rc_option_editor.cc:2278 rc_option_editor.cc:2287
-#: rc_option_editor.cc:2297 rc_option_editor.cc:2321 rc_option_editor.cc:2334
-#: rc_option_editor.cc:2343
-msgid "Preferences|GUI"
+#: rc_option_editor.cc:3064
+msgid "Use Window Manager/Desktop visibility information"
 msgstr ""
 
-#: rc_option_editor.cc:2272
+#: rc_option_editor.cc:3072
 msgid "Graphically indicate mouse pointer hovering over various widgets"
 msgstr "Resaltar controles al pasar sobre éstos el puntero del ratón"
 
-#: rc_option_editor.cc:2281
+#: rc_option_editor.cc:3080
 msgid "Show tooltips if mouse hovers over a control"
 msgstr "Mostrar descripciones emergentes al colocar el ratón sobre un control"
 
-#: rc_option_editor.cc:2290
+#: rc_option_editor.cc:3088
 msgid "Use name highlight bars in region displays (requires a restart)"
+msgstr "Usar barras de resaltado para el nombre de región (requiere reiniciar)"
+
+#: rc_option_editor.cc:3096
+msgid "Update transport clock display at FPS instead of every 100ms"
+msgstr "Actualizar el reloj según FPS, en lugar de cada 100 ms"
+
+#: rc_option_editor.cc:3111
+msgid "Waveform image cache size (megabytes)"
 msgstr ""
 
-#: rc_option_editor.cc:2303
-msgid "update transport clock display at FPS instead of every 100ms"
+#: rc_option_editor.cc:3119
+msgid ""
+"Increasing the cache size uses more memory to store waveform images, which "
+"can improve graphical performance."
 msgstr ""
 
-#: rc_option_editor.cc:2312
+#: rc_option_editor.cc:3127
 msgid "Lock timeout (seconds)"
 msgstr ""
 
-#: rc_option_editor.cc:2320
+#: rc_option_editor.cc:3135
 msgid "Lock GUI after this many idle seconds (zero to never lock)"
 msgstr ""
 
-#: rc_option_editor.cc:2336
+#: rc_option_editor.cc:3153
 msgid "Mixer Strip"
 msgstr "Canal de Mezclador"
 
-#: rc_option_editor.cc:2346
+#: rc_option_editor.cc:3163
 msgid "Use narrow strips in the mixer by default"
 msgstr "Usar canales de mezcla estrechos de forma predeterminada"
 
-#: rc_option_editor.cc:2351 rc_option_editor.cc:2365 rc_option_editor.cc:2384
-#: rc_option_editor.cc:2400 rc_option_editor.cc:2416 rc_option_editor.cc:2430
-#: rc_option_editor.cc:2444 rc_option_editor.cc:2446
+#: rc_option_editor.cc:3170
+msgid "Action Script Button Visibility"
+msgstr ""
+
+#: rc_option_editor.cc:3176 rc_option_editor.cc:3190 rc_option_editor.cc:3207
+#: rc_option_editor.cc:3223 rc_option_editor.cc:3239 rc_option_editor.cc:3253
+#: rc_option_editor.cc:3279 rc_option_editor.cc:3297 rc_option_editor.cc:3308
+#: rc_option_editor.cc:3315 rc_option_editor.cc:3317 rc_option_editor.cc:3325
+#: rc_option_editor.cc:3327 rc_option_editor.cc:3335 rc_option_editor.cc:3343
+#: rc_option_editor.cc:3345
 msgid "Preferences|Metering"
 msgstr ""
 
-#: rc_option_editor.cc:2355
+#: rc_option_editor.cc:3180
 msgid "Peak hold time"
 msgstr ""
 
-#: rc_option_editor.cc:2361
+#: rc_option_editor.cc:3186
 msgid "short"
 msgstr "corto"
 
-#: rc_option_editor.cc:2362
+#: rc_option_editor.cc:3187
 msgid "medium"
 msgstr "medio"
 
-#: rc_option_editor.cc:2363
+#: rc_option_editor.cc:3188
 msgid "long"
 msgstr "largo"
 
-#: rc_option_editor.cc:2369
+#: rc_option_editor.cc:3194
 msgid "DPM fall-off"
 msgstr ""
 
-#: rc_option_editor.cc:2375
+#: rc_option_editor.cc:3200
 msgid "slowest [6.6dB/sec]"
 msgstr ""
 
-#: rc_option_editor.cc:2376
+#: rc_option_editor.cc:3201
 msgid "slow [8.6dB/sec] (BBC PPM, EBU PPM)"
 msgstr ""
 
-#: rc_option_editor.cc:2377
-msgid "slowish [12.0dB/sec] (DIN)"
-msgstr ""
-
-#: rc_option_editor.cc:2378
-msgid "moderate [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"
-msgstr ""
-
-#: rc_option_editor.cc:2379
-msgid "medium [20dB/sec]"
+#: rc_option_editor.cc:3202
+msgid "moderate [12.0dB/sec] (DIN)"
 msgstr ""
 
-#: rc_option_editor.cc:2380
-msgid "fast [32dB/sec]"
+#: rc_option_editor.cc:3203
+msgid "medium [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"
 msgstr ""
 
-#: rc_option_editor.cc:2381
-msgid "faster [46dB/sec]"
+#: rc_option_editor.cc:3204
+msgid "fast [20dB/sec]"
 msgstr ""
 
-#: rc_option_editor.cc:2382
-msgid "fastest [70dB/sec]"
+#: rc_option_editor.cc:3205
+msgid "very fast [32dB/sec]"
 msgstr ""
 
-#: rc_option_editor.cc:2388
+#: rc_option_editor.cc:3211
 msgid "Meter line-up level; 0dBu"
 msgstr ""
 
-#: rc_option_editor.cc:2393 rc_option_editor.cc:2409
+#: rc_option_editor.cc:3216 rc_option_editor.cc:3232
 msgid "-24dBFS (SMPTE US: 4dBu = -20dBFS)"
 msgstr ""
 
-#: rc_option_editor.cc:2394 rc_option_editor.cc:2410
+#: rc_option_editor.cc:3217 rc_option_editor.cc:3233
 msgid "-20dBFS (SMPTE RP.0155)"
 msgstr ""
 
-#: rc_option_editor.cc:2395 rc_option_editor.cc:2411
+#: rc_option_editor.cc:3218 rc_option_editor.cc:3234
 msgid "-18dBFS (EBU, BBC)"
 msgstr ""
 
-#: rc_option_editor.cc:2396 rc_option_editor.cc:2412
+#: rc_option_editor.cc:3219 rc_option_editor.cc:3235
 msgid "-15dBFS (DIN)"
 msgstr ""
 
-#: rc_option_editor.cc:2398
+#: rc_option_editor.cc:3221
 msgid ""
 "Configure meter-marks and color-knee point for dBFS scale DPM, set reference "
 "level for IEC1/Nordic, IEC2 PPM and VU meter."
 msgstr ""
 
-#: rc_option_editor.cc:2404
+#: rc_option_editor.cc:3227
 msgid "IEC1/DIN Meter line-up level; 0dBu"
 msgstr ""
 
-#: rc_option_editor.cc:2414
+#: rc_option_editor.cc:3237
 msgid "Reference level for IEC1/DIN meter."
 msgstr ""
 
-#: rc_option_editor.cc:2420
+#: rc_option_editor.cc:3243
 msgid "VU Meter standard"
 msgstr ""
 
-#: rc_option_editor.cc:2425
+#: rc_option_editor.cc:3248
 msgid "0VU = -2dBu (France)"
 msgstr ""
 
-#: rc_option_editor.cc:2426
+#: rc_option_editor.cc:3249
 msgid "0VU = 0dBu (North America, Australia)"
 msgstr ""
 
-#: rc_option_editor.cc:2427
+#: rc_option_editor.cc:3250
 msgid "0VU = +4dBu (standard)"
 msgstr ""
 
-#: rc_option_editor.cc:2428
+#: rc_option_editor.cc:3251
 msgid "0VU = +8dBu"
 msgstr ""
 
-#: rc_option_editor.cc:2434
+#: rc_option_editor.cc:3257
 msgid "Peak threshold [dBFS]"
 msgstr ""
 
-#: rc_option_editor.cc:2442
+#: rc_option_editor.cc:3266
+msgid "Default Meter Type for Master Bus"
+msgstr ""
+
+#: rc_option_editor.cc:3284
+msgid "Default Meter Type for Busses"
+msgstr "Tipo de medidor determinado para buses"
+
+#: rc_option_editor.cc:3301
+msgid "Default Meter Type for Tracks"
+msgstr ""
+
+#: rc_option_editor.cc:3313
 msgid ""
-"Specify the audio signal level in dbFS at and above which the meter-peak "
+"Specify the audio signal level in dBFS at and above which the meter-peak "
 "indicator will flash red."
 msgstr ""
 
-#: rc_option_editor.cc:2449
+#: rc_option_editor.cc:3320
 msgid "LED meter style"
 msgstr ""
 
-#: rc_option_editor.cc:2457
+#: rc_option_editor.cc:3325
+msgid "Editor Meters"
+msgstr "Medidores de Editor"
+
+#: rc_option_editor.cc:3330
+msgid "Show meters on tracks in the editor"
+msgstr "Mostrar medidores en pistas en Editor"
+
+#: rc_option_editor.cc:3338
+msgid "Show at most stereo meters in the track-header"
+msgstr "Mostrar como mucho medidores estéreo en la cabecera de pista"
+
+#: rc_option_editor.cc:3343
+msgid "Post Export Analysis"
+msgstr ""
+
+#: rc_option_editor.cc:3348
+msgid "Save loudness analysis as image file"
+msgstr "Mostrar el análisis de loudness como archivo de imagen"
+
+#: rc_option_editor.cc:3356
 msgid "Theme"
 msgstr "Tema"
 
-#: region_editor.cc:79
+#: rc_option_editor.cc:3358
+msgid "Theme/Colors"
+msgstr "Tema/Colores"
+
+#: rc_option_editor.cc:3436
+msgid "Set Linux VST Search Path"
+msgstr "Establecer ruta de búsqueda de plugins Linux VST"
+
+#: rc_option_editor.cc:3450
+msgid "Set Windows VST Search Path"
+msgstr "Establecer ruta de búsqueda de plugins Windows VST"
+
+#: region_editor.cc:81
 msgid "audition this region"
 msgstr "Escuchar esta región"
 
-#: region_editor.cc:88 region_layering_order_editor.cc:75
+#: region_editor.cc:90 region_layering_order_editor.cc:75
 msgid "Position:"
 msgstr "Posición:"
 
-#: region_editor.cc:90 add_video_dialog.cc:155
+#: region_editor.cc:92 add_video_dialog.cc:155
 msgid "End:"
 msgstr "Fin:"
 
-#: region_editor.cc:92 sfdb_ui.cc:145
+#: region_editor.cc:94 sfdb_ui.cc:145
 msgid "Length:"
 msgstr "Duración:"
 
-#: region_editor.cc:94
+#: region_editor.cc:96
 msgid "Sync point (relative to region):"
 msgstr "Punto de sincronía (relativa a región):"
 
-#: region_editor.cc:96
+#: region_editor.cc:98
 msgid "Sync point (absolute):"
 msgstr "Punto sincronía (absoluto):"
 
-#: region_editor.cc:98
+#: region_editor.cc:100
 msgid "File start:"
 msgstr "Inicio de archivo:"
 
-#: region_editor.cc:102
+#: region_editor.cc:104
 msgid "Sources:"
 msgstr "Orígenes:"
 
-#: region_editor.cc:104
+#: region_editor.cc:106
 msgid "Source:"
 msgstr "Origen:"
 
-#: region_editor.cc:166
+#: region_editor.cc:168
 msgid "Region '%1'"
 msgstr "Región '%1'"
 
-#: region_editor.cc:273
+#: region_editor.cc:279
 msgid "change region start position"
 msgstr "cambiar posición del inicio de región"
 
-#: region_editor.cc:289
+#: region_editor.cc:299
 msgid "change region end position"
 msgstr "cambiar posición del final de región"
 
-#: region_editor.cc:309
+#: region_editor.cc:322
 msgid "change region length"
 msgstr "cambiar duración de región "
 
-#: region_editor.cc:403 region_editor.cc:415
+#: region_editor.cc:416 region_editor.cc:428
 msgid "change region sync point"
 msgstr "cambiar punto de sincronía de región"
 
@@ -10115,33 +12188,33 @@ msgstr "Pista:"
 msgid "Choose Top Region"
 msgstr "Elegir región Superior"
 
-#: region_view.cc:277
+#: region_view.cc:271
 msgid "SilenceText"
 msgstr ""
 
-#: region_view.cc:292 region_view.cc:311
+#: region_view.cc:286 region_view.cc:305
 msgid "minutes"
 msgstr "minutos"
 
-#: region_view.cc:295 region_view.cc:314
+#: region_view.cc:289 region_view.cc:308
 msgid "msecs"
 msgstr "msecs"
 
-#: region_view.cc:298 region_view.cc:317
+#: region_view.cc:292 region_view.cc:311
 msgid "secs"
 msgstr "segundos"
 
-#: region_view.cc:301
+#: region_view.cc:295
 msgid "%1 silent segment"
 msgid_plural "%1 silent segments"
 msgstr[0] "%1 segmento silenciado"
 msgstr[1] "%1 segmentos silenciados"
 
-#: region_view.cc:303
+#: region_view.cc:297
 msgid "shortest = %1 %2"
 msgstr "el más corto = %1 %2"
 
-#: region_view.cc:320
+#: region_view.cc:314
 msgid ""
 "\n"
 "  (shortest audible segment = %1 %2)"
@@ -10189,55 +12262,63 @@ msgstr "Kullback-Liebler"
 msgid "Modified Kullback-Liebler"
 msgstr "Kullback-Liebler modificado"
 
-#: rhythm_ferret.cc:65
+#: rhythm_ferret.cc:62
+msgid "Spectral Flux"
+msgstr "Flujo espectral"
+
+#: rhythm_ferret.cc:68
 msgid "Split region"
 msgstr "Separar región"
 
-#: rhythm_ferret.cc:66
+#: rhythm_ferret.cc:70
 msgid "Snap regions"
 msgstr "Ajustar regiones"
 
-#: rhythm_ferret.cc:67
+#: rhythm_ferret.cc:71
 msgid "Conform regions"
 msgstr "Conformar regiones"
 
-#: rhythm_ferret.cc:72
+#: rhythm_ferret.cc:77
 msgid "Rhythm Ferret"
 msgstr "Rhythm Ferret"
 
-#: rhythm_ferret.cc:78
+#: rhythm_ferret.cc:83
 msgid "Analyze"
 msgstr "Analizar"
 
-#: rhythm_ferret.cc:113
+#: rhythm_ferret.cc:122
 msgid "Detection function"
 msgstr "Función de detección"
 
-#: rhythm_ferret.cc:117
-msgid "Trigger gap"
+#: rhythm_ferret.cc:126
+msgid "Trigger gap (postproc)"
 msgstr ""
 
-#: rhythm_ferret.cc:122 strip_silence_dialog.cc:64
-msgid "Threshold"
-msgstr "Umbral"
-
-#: rhythm_ferret.cc:127
+#: rhythm_ferret.cc:131
 msgid "Peak threshold"
 msgstr "Umbral de pico"
 
-#: rhythm_ferret.cc:132
+#: rhythm_ferret.cc:135
 msgid "Silence threshold"
 msgstr "Umbral de silencio"
 
-#: rhythm_ferret.cc:137
+#: rhythm_ferret.cc:141
+msgid "Min Inter-Onset Time"
+msgstr ""
+
+#: rhythm_ferret.cc:148
 msgid "Sensitivity"
 msgstr "Sensibilidad"
 
-#: rhythm_ferret.cc:141
+#: rhythm_ferret.cc:152
+msgid "Cut Pos Threshold"
+msgstr ""
+
+#: rhythm_ferret.cc:157
 msgid "Operation"
 msgstr "Operación"
 
-#: rhythm_ferret.cc:355
+#: rhythm_ferret.cc:382
 msgid "split regions (rhythm ferret)"
 msgstr "separar regiones (rhythm ferret)"
 
@@ -10259,21 +12340,17 @@ msgstr "Activar grabación"
 
 #: route_group_dialog.cc:52
 msgid "Active state"
-msgstr "EStado activo"
-
-#: route_group_dialog.cc:53 route_group_dialog.cc:82 theme_manager.cc:90
-msgid "Color"
-msgstr "Color"
+msgstr "Estado activo"
 
-#: route_group_dialog.cc:59
+#: route_group_dialog.cc:58
 msgid "RouteGroupDialog"
 msgstr "RouteGroupDialog"
 
-#: route_group_dialog.cc:100
+#: route_group_dialog.cc:99
 msgid "<b>Sharing</b>"
 msgstr "<b>Compartir</b>"
 
-#: route_group_dialog.cc:200
+#: route_group_dialog.cc:192
 msgid "The group name is not unique. Please use a different name."
 msgstr ""
 
@@ -10293,329 +12370,318 @@ msgstr "Salidas"
 msgid "Plugins, Inserts & Sends"
 msgstr "Plugins, inserciones y envíos"
 
-#: route_params_ui.cc:209
+#: route_params_ui.cc:201
 msgid "route display list item for renamed route not found!"
 msgstr "route display list item for renamed route not found!"
 
-#: route_params_ui.cc:279 route_params_ui.cc:307
+#: route_params_ui.cc:271 route_params_ui.cc:299
 #, c-format
 msgid "Playback delay: %<PRId64> samples"
 msgstr "Retardo de reproducción: %<PRId64> muestras"
 
-#: route_params_ui.cc:499
+#: route_params_ui.cc:491
 msgid "NO TRACK"
 msgstr "NINGUNA PISTA"
 
-#: route_params_ui.cc:637 route_params_ui.cc:638
+#: route_params_ui.cc:515
+msgid "Add Track or Bus"
+msgstr "Añadir pista o bus"
+
+#: route_params_ui.cc:627 route_params_ui.cc:628
 msgid "No Track or Bus Selected"
 msgstr "No hay pista o bus seleccionado"
 
-#: route_time_axis.cc:181
+#: route_time_axis.cc:104
+msgid "RTAV|G"
+msgstr ""
+
+#: route_time_axis.cc:105
+msgid "RTAV|P"
+msgstr ""
+
+#: route_time_axis.cc:106
+msgid "RTAV|A"
+msgstr ""
+
+#: route_time_axis.cc:194
 msgid "Record (Right-click for Step Edit)"
 msgstr "Grabar (Clic derecho para step edit)"
 
-#: route_time_axis.cc:184
+#: route_time_axis.cc:197
 msgid "Record"
 msgstr "Grabar"
 
-#: route_time_axis.cc:254
+#: route_time_axis.cc:265
 msgid "Route Group"
 msgstr "Grupo de ruteado"
 
-#: route_time_axis.cc:264
+#: route_time_axis.cc:275
 msgid "MIDI Controllers and Automation"
 msgstr "Controladores y automatización MIDI"
 
-#: route_time_axis.cc:495
+#: route_time_axis.cc:510
 msgid "Show All Automation"
 msgstr "Mostrar toda automatización"
 
-#: route_time_axis.cc:498
+#: route_time_axis.cc:513
 msgid "Show Existing Automation"
 msgstr "Mostrar automatización existente"
 
-#: route_time_axis.cc:501
+#: route_time_axis.cc:516
 msgid "Hide All Automation"
 msgstr "Ocultar toda automatización"
 
-#: route_time_axis.cc:510
+#: route_time_axis.cc:525
 msgid "Processor automation"
 msgstr ""
 
 # Problema: Atenuador no entra. Esto tiene que entrar en la automatización de la pista, en el Editor. Fader se entiende muy bien y entra mejor.
-#: route_time_axis.cc:517
+#: route_time_axis.cc:532
 msgid "Fader"
 msgstr "Fader"
 
 # Aquí estaba panorámica, pero pan se entiende perfectamente y es mucho más corto
-#: route_time_axis.cc:535
+#: route_time_axis.cc:559
 msgid "Pan"
 msgstr "Pan"
 
-#: route_time_axis.cc:626
+#: route_time_axis.cc:643
 msgid "Overlaid"
 msgstr "Superpuestas"
 
-#: route_time_axis.cc:632
+#: route_time_axis.cc:649
 msgid "Stacked"
 msgstr "Apiladas"
 
-#: route_time_axis.cc:640
+#: route_time_axis.cc:657
 msgid "Layers"
 msgstr "Capas"
 
-#: route_time_axis.cc:709
+#: route_time_axis.cc:721
 msgid "Automatic (based on I/O connections)"
 msgstr "Automática (basada en conexiones de E/S)"
 
-#: route_time_axis.cc:718
+#: route_time_axis.cc:730
 msgid "(Currently: Existing Material)"
 msgstr "(Actualmente: Material existente)"
 
-#: route_time_axis.cc:721
+#: route_time_axis.cc:733
 msgid "(Currently: Capture Time)"
 msgstr "(Actualmente: Tiempo de captura)"
 
-#: route_time_axis.cc:729
+#: route_time_axis.cc:741
 msgid "Align With Existing Material"
 msgstr "Alinear con material existente"
 
-#: route_time_axis.cc:734
+#: route_time_axis.cc:746
 msgid "Align With Capture Time"
 msgstr "Alinear con tiempo de captura"
 
-#: route_time_axis.cc:739
+#: route_time_axis.cc:751
 msgid "Alignment"
 msgstr "Alineación"
 
-#: route_time_axis.cc:774
+#: route_time_axis.cc:786
 msgid "Normal Mode"
 msgstr "Modo normal"
 
-#: route_time_axis.cc:780
+#: route_time_axis.cc:792
 msgid "Tape Mode"
 msgstr "Modo cinta"
 
-#: route_time_axis.cc:786
+#: route_time_axis.cc:798
 msgid "Non-Layered Mode"
 msgstr "Modo sin capas"
 
-#: route_time_axis.cc:792
+#: route_time_axis.cc:804
 msgid "Record Mode"
 msgstr "Modo de grabación"
 
-#: route_time_axis.cc:799 route_time_axis.cc:1789
+#: route_time_axis.cc:809 route_time_axis.cc:1795
 msgid "Playlist"
 msgstr "Lista de Reproducción"
 
-#: route_time_axis.cc:1097
+#: route_time_axis.cc:1107
 msgid "Rename Playlist"
 msgstr "Renombrar lista de reproducción"
 
-#: route_time_axis.cc:1098
+#: route_time_axis.cc:1108
 msgid "New name for playlist:"
 msgstr "Nuevo nombre para lista de reproducción"
 
-#: route_time_axis.cc:1183
+#: route_time_axis.cc:1193
 msgid "New Copy Playlist"
 msgstr "Nueva copia de lista de reproducción"
 
-#: route_time_axis.cc:1184 route_time_axis.cc:1237
+#: route_time_axis.cc:1194 route_time_axis.cc:1247
 msgid "Name for new playlist:"
 msgstr "Nombre para nueva lista de reproducción:"
 
-#: route_time_axis.cc:1236
+#: route_time_axis.cc:1246
 msgid "New Playlist"
 msgstr "Nueva lista de reproducción"
 
-#: route_time_axis.cc:1436
-msgid "You cannot create a track with that name as it is reserved for %1"
-msgstr "No puedes crear una pista con ese nombre pues está reservado para %1"
+#: route_time_axis.cc:1441
+msgid "The name \"%1\" is reserved for %2"
+msgstr ""
 
-#: route_time_axis.cc:1678
+#: route_time_axis.cc:1684
 msgid "New Copy..."
 msgstr "Nueva copia..."
 
-#: route_time_axis.cc:1682
+#: route_time_axis.cc:1688
 msgid "New Take"
 msgstr "Nueva toma"
 
-#: route_time_axis.cc:1683
+#: route_time_axis.cc:1689
 msgid "Copy Take"
 msgstr "Copiar toma"
 
-#: route_time_axis.cc:1688
+#: route_time_axis.cc:1694
 msgid "Clear Current"
 msgstr "Borrar actual"
 
-#: route_time_axis.cc:1691
-msgid "Select From All..."
+#: route_time_axis.cc:1697
+msgid "Select from All..."
 msgstr "Selecciona de todos...."
 
-#: route_time_axis.cc:1779
+#: route_time_axis.cc:1785
 msgid "Take: %1.%2"
 msgstr ""
 
-#: route_time_axis.cc:2169 selection.cc:1007 selection.cc:1061
+#: route_time_axis.cc:2190 selection.cc:1042 selection.cc:1096
 msgid "programming error: "
 msgstr "programming error: "
 
-#: route_time_axis.cc:2585
+#: route_time_axis.cc:2614
 msgid "Underlays"
 msgstr "Underlays"
 
-#: route_time_axis.cc:2588
+#: route_time_axis.cc:2617
 msgid "Remove \"%1\""
 msgstr "Eliminar \"%1\""
 
-#: route_time_axis.cc:2638 route_time_axis.cc:2675
+#: route_time_axis.cc:2667 route_time_axis.cc:2704
 msgid "programming error: underlay reference pointer pairs are inconsistent!"
 msgstr "programming error: underlay reference pointer pairs are inconsistent!"
 
-#: route_time_axis.cc:2702
+#: route_time_axis.cc:2731 vca_master_strip.cc:203 vca_time_axis.cc:228
 msgid "After-fade listen (AFL)"
 msgstr "Escucha Post-fader (AFL) "
 
-#: route_time_axis.cc:2706
+#: route_time_axis.cc:2735 vca_master_strip.cc:207 vca_time_axis.cc:232
 msgid "Pre-fade listen (PFL)"
 msgstr "Escucha pre-fader (PFL)"
 
-#: route_ui.cc:140
+#: route_ui.cc:169
 msgid "Mute this track"
 msgstr "Enmudecer esta pista"
 
-#: route_ui.cc:144
+#: route_ui.cc:173
 msgid "Mute other (non-soloed) tracks"
 msgstr "Enmudecer resto de pistas (que no estén en solo)"
 
-#: route_ui.cc:150
+#: route_ui.cc:179
 msgid "Enable recording on this track"
 msgstr "Activar la grabación en esta pista"
 
-#: route_ui.cc:158
+#: route_ui.cc:187
 msgid "make mixer strips show sends to this bus"
 msgstr "hacer que los canales del mezclador muestren envíos a este bus"
 
-#: route_ui.cc:163
+#: route_ui.cc:192
 msgid "Monitor input"
 msgstr "Monitorizar entrada"
 
-#: route_ui.cc:169
+#: route_ui.cc:198
 msgid "Monitor playback"
 msgstr "Monitorizar reproducción"
 
-#: route_ui.cc:676
+#: route_ui.cc:710
 msgid "Not connected to AudioEngine - cannot engage record"
 msgstr ""
 
-#: route_ui.cc:875
+#: route_ui.cc:887
+msgid "Rec-Safe"
+msgstr ""
+
+#: route_ui.cc:892
 msgid "Step Entry"
 msgstr ""
 
-#: route_ui.cc:948
+#: route_ui.cc:991
 msgid "Assign all tracks (prefader)"
 msgstr "Asignar todas las pistas (prefader)"
 
-#: route_ui.cc:952
+#: route_ui.cc:995
 msgid "Assign all tracks and buses (prefader)"
 msgstr "Asignar todas las pistas y buses (prefader)"
 
-#: route_ui.cc:956
+#: route_ui.cc:999
 msgid "Assign all tracks (postfader)"
 msgstr "Asignar todas las pistas (postfader)"
 
-#: route_ui.cc:960
+#: route_ui.cc:1003
 msgid "Assign all tracks and buses (postfader)"
 msgstr "Asignar todas las pistas y buses (postfader)"
 
-#: route_ui.cc:964
+#: route_ui.cc:1007
 msgid "Assign selected tracks (prefader)"
 msgstr "Assignar pistas seleccionadas (prefader)"
 
-#: route_ui.cc:968
+#: route_ui.cc:1011
 msgid "Assign selected tracks and buses (prefader)"
 msgstr "Assignar pistas y buses seleccionados (prefader)"
 
-#: route_ui.cc:971
+#: route_ui.cc:1014
 msgid "Assign selected tracks (postfader)"
 msgstr "Assignar pistas seleccionadas (postfader)"
 
-#: route_ui.cc:975
+#: route_ui.cc:1018
 msgid "Assign selected tracks and buses (postfader)"
 msgstr "Assignar pistas y buses seleccionados (postfader)"
 
-#: route_ui.cc:978
+#: route_ui.cc:1021
 msgid "Copy track/bus gains to sends"
 msgstr "Copiar ganancias de pista/bus a envíos"
 
-#: route_ui.cc:979
+#: route_ui.cc:1022
 msgid "Set sends gain to -inf"
 msgstr "Establecer ganancia de envíos a -inf"
 
-#: route_ui.cc:980
+#: route_ui.cc:1023
 msgid "Set sends gain to 0dB"
 msgstr "Establecer ganancia de envíos a 0dB"
 
-#: route_ui.cc:1300
+#: route_ui.cc:1361
 msgid "Solo Isolate"
 msgstr "Aislar solo"
 
-#: route_ui.cc:1307
+#: route_ui.cc:1368
 msgid "Solo Safe"
 msgstr "Solo seguro"
 
-#: route_ui.cc:1329
+#: route_ui.cc:1390
 msgid "Pre Fader Sends"
 msgstr ""
 
-#: route_ui.cc:1335
+#: route_ui.cc:1396
 msgid "Post Fader Sends"
 msgstr ""
 
-#: route_ui.cc:1341
+#: route_ui.cc:1402
 msgid "Control Outs"
 msgstr "Salidas de control"
 
-#: route_ui.cc:1347
+#: route_ui.cc:1408
 msgid "Main Outs"
 msgstr "Salidas principales"
 
-#: route_ui.cc:1479
+#: route_ui.cc:1575
 msgid "Color Selection"
 msgstr "Selección de color"
 
-#: route_ui.cc:1564
-msgid ""
-"Do you really want to remove track \"%1\" ?\n"
-"\n"
-"You may also lose the playlist used by this track.\n"
-"\n"
-"(This action cannot be undone, and the session file will be overwritten)"
-msgstr ""
-"¿De verdad deseas eliminar la pista \"%1\" ?\n"
-"\n"
-"Puedes perder también la lista de reproducción usada por esta pista.\n"
-"\n"
-"(Esta acción no se puede deshacer y sobrescribirá el archivo de sesión)"
-
-#: route_ui.cc:1566
-msgid ""
-"Do you really want to remove bus \"%1\" ?\n"
-"\n"
-"(This action cannot be undone, and the session file will be overwritten)"
-msgstr ""
-"¿De verdad deseas eliminar el bus \"%1\" ?\n"
-"(Esta acción no se puede deshacer y el archivo de sesión se reescribirá)"
-
-#: route_ui.cc:1574
-msgid "Remove track"
-msgstr "Eliminar pista"
-
-#: route_ui.cc:1576
-msgid "Remove bus"
-msgstr "Eliminar bus"
-
-#: route_ui.cc:1604
+#: route_ui.cc:1617
 msgid ""
 "The use of colons (':') is discouraged in track and bus names.\n"
 "Do you want to use this new name?"
@@ -10624,88 +12690,77 @@ msgstr ""
 "buses.\n"
 "¿Quieres usar este nombre?"
 
-#: route_ui.cc:1608
+#: route_ui.cc:1621
 msgid "Use the new name"
 msgstr "Usar el nuevo nombre"
 
-#: route_ui.cc:1609
+#: route_ui.cc:1622
 msgid "Re-edit the name"
 msgstr ""
 
-#: route_ui.cc:1622
+#: route_ui.cc:1635
 msgid "Rename Track"
 msgstr "Renombrar pista"
 
-#: route_ui.cc:1624
+#: route_ui.cc:1637
 msgid "Rename Bus"
 msgstr "Renombrar bus"
 
-#: route_ui.cc:1692
+#: route_ui.cc:1697
 msgid ": comment editor"
 msgstr ": editor de notas"
 
-#: route_ui.cc:1858
+#: route_ui.cc:1852
 msgid " latency"
 msgstr "latencia"
 
-#: route_ui.cc:1871
+#: route_ui.cc:1892
 msgid "Cannot create route template directory %1"
 msgstr "Cannot create route template directory %1"
 
-#: route_ui.cc:1877
+#: route_ui.cc:1898
 msgid "Save As Template"
 msgstr "Guardar como plantilla"
 
-#: route_ui.cc:1878
+#: route_ui.cc:1899
 msgid "Template name:"
 msgstr "Nombre de plantilla :"
 
-#: route_ui.cc:1959
-msgid "Remote Control ID"
-msgstr "ID de control remoto"
-
-#: route_ui.cc:1969
-msgid "Remote control ID:"
-msgstr "ID de control remoto:"
-
-#: route_ui.cc:1983
+#: route_ui.cc:2023
 msgid ""
-"The remote control ID of %1 is: %2\n"
-"\n"
-"\n"
-"The remote control ID of %3 cannot be changed."
+"Left-click to invert polarity of channel %1 of this track. Right-click to "
+"show menu."
 msgstr ""
+"Clic izquierdo para invertir polaridad de canal %1 de esta pista.  Clic "
+"derecho para mostrar menú."
 
-#: route_ui.cc:1987
-msgid "the master bus"
-msgstr "el bus master"
+#: route_ui.cc:2025
+msgid "Click to show a menu of channels to invert polarity"
+msgstr "Pulsa para mostrar un menú de canales para invertir su polaridad"
 
-#: route_ui.cc:1987
-msgid "the monitor bus"
-msgstr "el bus de monitorización"
+#: save_as_dialog.cc:34
+msgid "Switch to newly-saved version"
+msgstr "Cambiar a versión recién salvada"
 
-#: route_ui.cc:1989
-msgid ""
-"The remote control ID of %5 is: %2\n"
-"\n"
-"\n"
-"Remote Control IDs are currently determined by track/bus ordering in %6.\n"
-"\n"
-"%3Use the User Interaction tab of the Preferences window if you want to "
-"change this%4"
-msgstr ""
+#: save_as_dialog.cc:35
+msgid "Copy media to new session"
+msgstr "Copiar medios a nueva sesión"
 
-#: route_ui.cc:2046
-msgid ""
-"Left-click to invert (phase reverse) channel %1 of this track.  Right-click "
-"to show menu."
-msgstr ""
-"Clic izquierdo para invertir (inversión de fase) canal %1 de esta pista.  "
-"Clic derecho para mostrar menú."
+#: save_as_dialog.cc:36
+msgid "Copy external media into new session"
+msgstr "Copiar medios externos a nueva sesión"
 
-#: route_ui.cc:2048
-msgid "Click to show a menu of channels for inversion (phase reverse)"
-msgstr ""
+#: save_as_dialog.cc:37
+msgid "Newly-saved session should be empty"
+msgstr "La sesión recién salvada debería estar vacía"
+
+#: save_as_dialog.cc:48
+msgid "Save as session name"
+msgstr "Guardar como nombre de sesión"
+
+#: save_as_dialog.cc:55
+msgid "Parent directory/folder"
+msgstr "Carpeta padre"
 
 #: search_path_option.cc:35
 msgid "Select folder to search for media"
@@ -10713,132 +12768,164 @@ msgstr "Seleccionar carpeta para buscar archivos"
 
 #: search_path_option.cc:44
 msgid "Click to add a new location"
-msgstr "Clicar para añadir nueva localización"
+msgstr "Pulsa para añadir nueva localización"
 
 #: search_path_option.cc:51
 msgid "the session folder"
 msgstr "el archivo de sesión"
 
+#: script_selector.cc:43
+msgid "<b>Type:</b>"
+msgstr "<b>Tipo:</b>"
+
+#: script_selector.cc:49
+msgid "<b>Author:</b>"
+msgstr "<b>Autor:</b>"
+
+#: script_selector.cc:55
+msgid "<b>Description:</b>"
+msgstr "<b>Descripción:</b>"
+
+#: script_selector.cc:131
+msgid "Select Script to unload"
+msgstr ""
+
+#: script_selector.cc:165
+msgid "<b>Name:</b>"
+msgstr "<b>Nombre:</b>"
+
+#: script_selector.cc:172
+msgid "<b>Instance Parameters</b>"
+msgstr "<b>Parámetros de instancia</b>"
+
 #: send_ui.cc:134
 msgid "Send "
 msgstr "Enviar "
 
-#: session_dialog.cc:61
+#: session_dialog.cc:71
 msgid "Session Setup"
 msgstr "Configuración de sesión"
 
-#: session_dialog.cc:66
+#: session_dialog.cc:76
 msgid "Advanced options ..."
 msgstr "Opciones avanzadas ..."
 
-#: session_dialog.cc:263
+#: session_dialog.cc:163 session_dialog.cc:397
+msgid "Recent Sessions"
+msgstr "Sesiones recientes"
+
+#: session_dialog.cc:311
+msgid "Sample Rate"
+msgstr "Tasa de muestreo"
+
+#: session_dialog.cc:312
+msgid "File Resolution"
+msgstr "Resolución de archivo"
+
+#: session_dialog.cc:313
+msgid "Last Modified"
+msgstr "Último cambio"
+
+#: session_dialog.cc:338
 msgid "New Session"
 msgstr "Nueva sesión"
 
-#: session_dialog.cc:301
+#: session_dialog.cc:379
 msgid "Check the website for more..."
 msgstr "Busca más en el portal de internet..."
 
-#: session_dialog.cc:304
+#: session_dialog.cc:382
 msgid "Click to open the program website in your web browser"
-msgstr "Clica para abrir el portal del programa en el navegador de internet"
-
-#: session_dialog.cc:324
-msgid "Sample Rate"
-msgstr "Tasa de muestreo"
+msgstr "Pulsa para abrir el portal del programa en el navegador de internet"
 
-#: session_dialog.cc:325
-msgid "Disk Format"
-msgstr "Formato de disco"
-
-#: session_dialog.cc:343
+#: session_dialog.cc:404
 msgid "Select session file"
 msgstr "Seleccionar archivo de sesión"
 
-#: session_dialog.cc:358
+#: session_dialog.cc:417
 msgid "Other Sessions"
 msgstr "Otras sesiones"
 
-#: session_dialog.cc:384
+#: session_dialog.cc:424
+msgid "Safe Mode: Disable all Plugins"
+msgstr "Modo seguro: Deshabilita todos los plugins"
+
+#: session_dialog.cc:454
 msgid "Open"
 msgstr "Abrir"
 
-#: session_dialog.cc:451
+#: session_dialog.cc:521
 msgid "Session name:"
 msgstr "Nombre de sesión:"
 
-#: session_dialog.cc:473
+#: session_dialog.cc:543
 msgid "Create session folder in:"
 msgstr "Crear carpeta de sesión en :"
 
-#: session_dialog.cc:496
+#: session_dialog.cc:564
 msgid "Select folder for session"
 msgstr "Seleccionar carpeta para sesión"
 
-#: session_dialog.cc:525
+#: session_dialog.cc:591
 msgid "Use this template"
 msgstr "Usar esta plantilla"
 
-#: session_dialog.cc:528
+#: session_dialog.cc:594
 msgid "no template"
 msgstr "sin plantilla"
 
-#: session_dialog.cc:663 session_dialog.cc:699
-msgid "32 bit float"
-msgstr "32 bit float"
+#: session_dialog.cc:746 session_dialog.cc:793
+msgid "32-bit float"
+msgstr "32-bit float"
 
-#: session_dialog.cc:666 session_dialog.cc:702
-msgid "24 bit"
-msgstr "24 bit"
+#: session_dialog.cc:749 session_dialog.cc:796
+msgid "24-bit"
+msgstr "24-bit"
 
-#: session_dialog.cc:669 session_dialog.cc:705
-msgid "16 bit"
-msgstr "16 bit"
+#: session_dialog.cc:752 session_dialog.cc:799
+msgid "16-bit"
+msgstr "16-bit"
 
-#: session_dialog.cc:747 session_dialog.cc:748 session_dialog.cc:749
+#: session_dialog.cc:877 session_dialog.cc:878 session_dialog.cc:879
 msgid "channels"
 msgstr "canales"
 
-#: session_dialog.cc:763
+#: session_dialog.cc:893
 msgid "<b>Busses</b>"
 msgstr "<b>Buses</b>"
 
-#: session_dialog.cc:764
+#: session_dialog.cc:894
 msgid "<b>Inputs</b>"
 msgstr "<b>Entradas</b>"
 
-#: session_dialog.cc:765
+#: session_dialog.cc:895
 msgid "<b>Outputs</b>"
 msgstr "<b>Salidas</b>"
 
-#: session_dialog.cc:773
+#: session_dialog.cc:903
 msgid "Create master bus"
 msgstr "Crear bus master"
 
-#: session_dialog.cc:783
+#: session_dialog.cc:913
 msgid "Automatically connect to physical inputs"
 msgstr "Conectar a entradas físicas automáticamente"
 
-#: session_dialog.cc:790 session_dialog.cc:849
+#: session_dialog.cc:920 session_dialog.cc:979
 msgid "Use only"
 msgstr "Usar sólo"
 
-#: session_dialog.cc:843
+#: session_dialog.cc:973
 msgid "Automatically connect outputs"
 msgstr "Conectar salidas automáticamente"
 
-#: session_dialog.cc:865
+#: session_dialog.cc:995
 msgid "... to master bus"
 msgstr "...al bus master"
 
-#: session_dialog.cc:875
+#: session_dialog.cc:1005
 msgid "... to physical outputs"
 msgstr "...a salidas físicas"
 
-#: session_import_dialog.cc:65
-msgid "Import from Session"
-msgstr "Importar desde sesión"
-
 #: session_import_dialog.cc:74
 msgid "Elements"
 msgstr "Elementos"
@@ -10859,191 +12946,191 @@ msgstr "Importar desde sesión"
 msgid "This will select all elements of this type!"
 msgstr ""
 
-#: session_metadata_dialog.cc:285
+#: session_metadata_dialog.cc:288
 msgid "EAN Check digit OK"
 msgstr ""
 
-#: session_metadata_dialog.cc:289
+#: session_metadata_dialog.cc:292
 msgid "EAN Check digit error"
 msgstr ""
 
-#: session_metadata_dialog.cc:289
+#: session_metadata_dialog.cc:292
 msgid "expected"
 msgstr ""
 
-#: session_metadata_dialog.cc:294
+#: session_metadata_dialog.cc:297
 msgid "EAN Length error"
 msgstr ""
 
-#: session_metadata_dialog.cc:423
+#: session_metadata_dialog.cc:426
 msgid "Field"
 msgstr ""
 
-#: session_metadata_dialog.cc:427
+#: session_metadata_dialog.cc:430
 msgid "Values (current value on top)"
 msgstr "Valores (valor actual arriba)"
 
-#: session_metadata_dialog.cc:641
+#: session_metadata_dialog.cc:644
 msgid "User"
 msgstr "Usuario"
 
-#: session_metadata_dialog.cc:649
+#: session_metadata_dialog.cc:652
 msgid "Email"
 msgstr ""
 
-#: session_metadata_dialog.cc:652
+#: session_metadata_dialog.cc:655
 msgid "Web"
 msgstr ""
 
-#: session_metadata_dialog.cc:655
+#: session_metadata_dialog.cc:658
 msgid "Organization"
 msgstr "Organización"
 
-#: session_metadata_dialog.cc:658
+#: session_metadata_dialog.cc:661
 msgid "Country"
 msgstr "País"
 
-#: session_metadata_dialog.cc:672
+#: session_metadata_dialog.cc:675
 msgid "Title"
 msgstr "Título"
 
-#: session_metadata_dialog.cc:675
+#: session_metadata_dialog.cc:678
 msgid "Track Number"
 msgstr "Número de pista"
 
-#: session_metadata_dialog.cc:678
+#: session_metadata_dialog.cc:681
 msgid "Subtitle"
 msgstr "Subtítulo"
 
-#: session_metadata_dialog.cc:681
+#: session_metadata_dialog.cc:684
 msgid "Grouping"
 msgstr ""
 
-#: session_metadata_dialog.cc:684
+#: session_metadata_dialog.cc:687
 msgid "Artist"
 msgstr "Artista"
 
-#: session_metadata_dialog.cc:687
+#: session_metadata_dialog.cc:690
 msgid "Genre"
 msgstr "Género"
 
-#: session_metadata_dialog.cc:690
+#: session_metadata_dialog.cc:693
 msgid "Comment"
 msgstr "Comentario"
 
-#: session_metadata_dialog.cc:693
+#: session_metadata_dialog.cc:696
 msgid "Copyright"
 msgstr "Copyright"
 
-#: session_metadata_dialog.cc:701 session_metadata_dialog.cc:706
+#: session_metadata_dialog.cc:704 session_metadata_dialog.cc:709
 msgid "Album"
 msgstr "Álbum"
 
-#: session_metadata_dialog.cc:709
+#: session_metadata_dialog.cc:712
 msgid "Year"
 msgstr "Año"
 
-#: session_metadata_dialog.cc:712
+#: session_metadata_dialog.cc:715
 msgid "Album Artist"
 msgstr "Artista del álbum"
 
-#: session_metadata_dialog.cc:715
+#: session_metadata_dialog.cc:718
 msgid "Total Tracks"
 msgstr "Número total de pistas"
 
-#: session_metadata_dialog.cc:718
+#: session_metadata_dialog.cc:721
 msgid "Disc Subtitle"
 msgstr "Subtítulo del disco"
 
-#: session_metadata_dialog.cc:721
+#: session_metadata_dialog.cc:724
 msgid "Disc Number"
 msgstr "Número de disco"
 
-#: session_metadata_dialog.cc:724
+#: session_metadata_dialog.cc:727
 msgid "Total Discs"
 msgstr "Número total de discos"
 
-#: session_metadata_dialog.cc:727
+#: session_metadata_dialog.cc:730
 msgid "Compilation"
 msgstr "Recopilatorio"
 
-#: session_metadata_dialog.cc:730
+#: session_metadata_dialog.cc:733
 msgid "ISRC"
 msgstr "ISRC"
 
-#: session_metadata_dialog.cc:733
+#: session_metadata_dialog.cc:736
 msgid "EAN barcode"
 msgstr ""
 
-#: session_metadata_dialog.cc:746
+#: session_metadata_dialog.cc:749
 msgid "People"
 msgstr "Personas"
 
-#: session_metadata_dialog.cc:751
+#: session_metadata_dialog.cc:754
 msgid "Lyricist"
 msgstr "Letrista"
 
-#: session_metadata_dialog.cc:754
+#: session_metadata_dialog.cc:757
 msgid "Composer"
 msgstr "Compositor"
 
-#: session_metadata_dialog.cc:757
+#: session_metadata_dialog.cc:760
 msgid "Conductor"
 msgstr "Director"
 
-#: session_metadata_dialog.cc:760
+#: session_metadata_dialog.cc:763
 msgid "Remixer"
 msgstr "Mezclador"
 
-#: session_metadata_dialog.cc:763
+#: session_metadata_dialog.cc:766
 msgid "Arranger"
 msgstr "Arreglista"
 
-#: session_metadata_dialog.cc:766
+#: session_metadata_dialog.cc:769
 msgid "Engineer"
 msgstr "Ingeniero"
 
-#: session_metadata_dialog.cc:769
+#: session_metadata_dialog.cc:772
 msgid "Producer"
 msgstr "Productor"
 
-#: session_metadata_dialog.cc:772
+#: session_metadata_dialog.cc:775
 msgid "DJ Mixer"
 msgstr "Mezclador DJ"
 
-#: session_metadata_dialog.cc:775
+#: session_metadata_dialog.cc:778
 msgid "Metadata|Mixer"
 msgstr "Mezclador"
 
-#: session_metadata_dialog.cc:783
+#: session_metadata_dialog.cc:786
 msgid "School"
 msgstr "Escuela"
 
-#: session_metadata_dialog.cc:788
+#: session_metadata_dialog.cc:791
 msgid "Instructor"
 msgstr "Profesor"
 
-#: session_metadata_dialog.cc:791
+#: session_metadata_dialog.cc:794
 msgid "Course"
 msgstr "Curso"
 
-#: session_metadata_dialog.cc:799
+#: session_metadata_dialog.cc:802
 msgid "Edit Session Metadata"
 msgstr "Editar metadatos de sesión"
 
-#: session_metadata_dialog.cc:830
+#: session_metadata_dialog.cc:833
 msgid "Import session metadata"
 msgstr "Importar metadatos de sesión"
 
-#: session_metadata_dialog.cc:851
+#: session_metadata_dialog.cc:854
 msgid "Choose session to import metadata from"
 msgstr "Elegir sesión para importar metadatos"
 
-#: session_metadata_dialog.cc:889
+#: session_metadata_dialog.cc:892
 msgid "This session file could not be read!"
 msgstr "¡Este archivo de sesión no se pudo leer!"
 
-#: session_metadata_dialog.cc:899
+#: session_metadata_dialog.cc:902
 msgid ""
 "The session file didn't contain metadata!\n"
 "Maybe this is an old session format?"
@@ -11051,7 +13138,7 @@ msgstr ""
 "¡El archivo de sesión no contenía metadatos!\n"
 "¿Quizás fuera un formato de sesión antiguo?"
 
-#: session_metadata_dialog.cc:918
+#: session_metadata_dialog.cc:921
 msgid "Import all from:"
 msgstr "Importar todos desde:"
 
@@ -11200,165 +13287,186 @@ msgid "Destructive crossfade length"
 msgstr "Duración del fundido cruzado destructivo"
 
 #: session_option_editor.cc:146
+msgid "Declick when transport starts and stops"
+msgstr ""
+
+#: session_option_editor.cc:153
+msgid "Declick when monitor state changes"
+msgstr ""
+
+#: session_option_editor.cc:160
 msgid "Region fades active"
 msgstr "Fundidos de región activos"
 
-#: session_option_editor.cc:153
+#: session_option_editor.cc:167
 msgid "Region fades visible"
 msgstr "Fundidos de región visibles"
 
-#: session_option_editor.cc:160 session_option_editor.cc:173
-#: session_option_editor.cc:187
+#: session_option_editor.cc:174 session_option_editor.cc:187
+#: session_option_editor.cc:208
 msgid "Media"
 msgstr "Archivos"
 
-#: session_option_editor.cc:160
+#: session_option_editor.cc:174
 msgid "Audio file format"
-msgstr "Formato archivo de audio"
+msgstr "Formato de archivo de audio"
 
-#: session_option_editor.cc:164
+#: session_option_editor.cc:178
 msgid "Sample format"
 msgstr "Formato de muestra"
 
-#: session_option_editor.cc:169
+#: session_option_editor.cc:183
 msgid "32-bit floating point"
 msgstr "Coma flotante 32-bit"
 
-#: session_option_editor.cc:170
+#: session_option_editor.cc:184
 msgid "24-bit integer"
 msgstr "Entero 24-bit"
 
-#: session_option_editor.cc:171
+#: session_option_editor.cc:185
 msgid "16-bit integer"
 msgstr "Entero 16-bit"
 
-#: session_option_editor.cc:177
+#: session_option_editor.cc:191
 msgid "File type"
 msgstr "Tipo de archivo"
 
-#: session_option_editor.cc:182
-msgid "Broadcast WAVE"
-msgstr "Broadcast WAVE"
+#: session_option_editor.cc:196
+msgid "Broadcast WAVE (4GB size limit)"
+msgstr "Broadcast WAVE (4GB size limit)"
 
-#: session_option_editor.cc:183
-msgid "WAVE"
-msgstr "WAVE"
+#: session_option_editor.cc:198
+msgid "Broadcast RF64"
+msgstr "Broadcast RF64"
 
-#: session_option_editor.cc:184
+#: session_option_editor.cc:200
+msgid "WAVE (4GB size limit)"
+msgstr ""
+
+#: session_option_editor.cc:201
 msgid "WAVE-64"
 msgstr "WAVE-64"
 
-#: session_option_editor.cc:189
+#: session_option_editor.cc:205
+msgid "RF64 (WAV compatible)"
+msgstr ""
+
+#: session_option_editor.cc:210 session_option_editor.cc:216
+#: session_option_editor.cc:223
+msgid "Files|Locations"
+msgstr "Archivos|Localizaciones"
+
+#: session_option_editor.cc:210
 msgid "File locations"
 msgstr "Localizaciones de archivos"
 
-#: session_option_editor.cc:191
+#: session_option_editor.cc:212
 msgid "Search for audio files in:"
 msgstr "Buscar archivos de audio en:"
 
-#: session_option_editor.cc:197
+#: session_option_editor.cc:218
 msgid "Search for MIDI files in:"
 msgstr "Buscar archivos MIDI en:"
 
-#: session_option_editor.cc:206 session_option_editor.cc:218
-#: session_option_editor.cc:228 session_option_editor.cc:239
+#: session_option_editor.cc:227 session_option_editor.cc:239
+#: session_option_editor.cc:249 session_option_editor.cc:260
 msgid "Filenames"
 msgstr "Nombres de archivo"
 
-#: session_option_editor.cc:206
+#: session_option_editor.cc:227
 msgid "File Naming"
 msgstr "Nombrado de archivos"
 
-#: session_option_editor.cc:212
+#: session_option_editor.cc:233
 msgid "Prefix Track number"
 msgstr "Prefijo número de pista"
 
-#: session_option_editor.cc:217
+#: session_option_editor.cc:238
 msgid ""
 "Adds the current track number to the beginning of the recorded file name."
 msgstr "Añade el número de pista actual al nombre de archivo guardado."
 
-#: session_option_editor.cc:222
+#: session_option_editor.cc:243
 msgid "Prefix Take Name"
 msgstr "Prefijo número de toma"
 
-#: session_option_editor.cc:227
+#: session_option_editor.cc:248
 msgid "Adds the Take Name to the beginning of the recorded file name."
 msgstr "Añade el número de toma actual al nombre de archivo guardado."
 
-#: session_option_editor.cc:232
+#: session_option_editor.cc:253
 msgid "Take Name"
 msgstr "Número de toma"
 
-#: session_option_editor.cc:245
+#: session_option_editor.cc:266
 msgid ""
 "Track Input Monitoring automatically follows transport state (\"auto-input\")"
 msgstr ""
 "La monitorización de entrada de pista sigue automáticamente el estado del "
 "transporte (\"auto-entrada\")"
 
-#: session_option_editor.cc:252
+#: session_option_editor.cc:273
 msgid "Use monitor section in this session"
 msgstr "Usar sección de monitorización en esta sesión"
 
-#: session_option_editor.cc:257 session_option_editor.cc:259
-#: session_option_editor.cc:266 session_option_editor.cc:273
-#: session_option_editor.cc:280 session_option_editor.cc:282
-#: session_option_editor.cc:289 session_option_editor.cc:296
-#: session_option_editor.cc:303 session_option_editor.cc:310
-#: session_option_editor.cc:312
+#: session_option_editor.cc:278 session_option_editor.cc:280
+#: session_option_editor.cc:287 session_option_editor.cc:294
+#: session_option_editor.cc:301 session_option_editor.cc:303
+#: session_option_editor.cc:310 session_option_editor.cc:317
+#: session_option_editor.cc:324 session_option_editor.cc:331
+#: session_option_editor.cc:333
 msgid "Meterbridge"
 msgstr ""
 
-#: session_option_editor.cc:257
+#: session_option_editor.cc:278
 msgid "Route Display"
 msgstr ""
 
-#: session_option_editor.cc:261
+#: session_option_editor.cc:282
 msgid "Show Midi Tracks"
 msgstr "Mostrar pistas MIDI"
 
-#: session_option_editor.cc:268
+#: session_option_editor.cc:289
 msgid "Show Busses"
 msgstr "Mostrar buses"
 
-#: session_option_editor.cc:275
+#: session_option_editor.cc:296
 msgid "Include Master Bus"
 msgstr "Incluir bus master"
 
-#: session_option_editor.cc:280
+#: session_option_editor.cc:301
 msgid "Button Area"
 msgstr ""
 
-#: session_option_editor.cc:284
+#: session_option_editor.cc:305
 msgid "Rec-enable Button"
 msgstr ""
 
-#: session_option_editor.cc:291
+#: session_option_editor.cc:312
 msgid "Mute Button"
 msgstr ""
 
-#: session_option_editor.cc:298
+#: session_option_editor.cc:319
 msgid "Solo Button"
 msgstr ""
 
-#: session_option_editor.cc:305
+#: session_option_editor.cc:326
 msgid "Monitor Buttons"
 msgstr ""
 
-#: session_option_editor.cc:310
+#: session_option_editor.cc:331
 msgid "Name Labels"
 msgstr ""
 
-#: session_option_editor.cc:314
+#: session_option_editor.cc:335
 msgid "Track Name"
 msgstr ""
 
-#: session_option_editor.cc:325
+#: session_option_editor.cc:346
 msgid "MIDI region copies are independent"
 msgstr "Las copias de regiones MIDI son independientes"
 
-#: session_option_editor.cc:332
+#: session_option_editor.cc:353
 msgid ""
 "Policy for handling overlapping notes\n"
 " on the same MIDI channel"
@@ -11366,47 +13474,47 @@ msgstr ""
 "Política de manejo de notas superpuestas\n"
 "en el mismo canal MIDI"
 
-#: session_option_editor.cc:337
+#: session_option_editor.cc:358
 msgid "never allow them"
 msgstr "no permitirlas nunca"
 
-#: session_option_editor.cc:338
+#: session_option_editor.cc:359
 msgid "don't do anything in particular"
 msgstr "no hacer nada especial"
 
-#: session_option_editor.cc:339
+#: session_option_editor.cc:360
 msgid "replace any overlapped existing note"
 msgstr "reemplazar cualquier nota superpuesta existente"
 
-#: session_option_editor.cc:340
+#: session_option_editor.cc:361
 msgid "shorten the overlapped existing note"
 msgstr "acortar la nota existente superpuesta"
 
-#: session_option_editor.cc:341
+#: session_option_editor.cc:362
 msgid "shorten the overlapping new note"
 msgstr "acortar la nueva nota superpuesta"
 
-#: session_option_editor.cc:342
+#: session_option_editor.cc:363
 msgid "replace both overlapping notes with a single note"
 msgstr "reemplazar ambas notas superpuestas con una única nota"
 
-#: session_option_editor.cc:346
+#: session_option_editor.cc:367
 msgid "Glue to bars and beats"
 msgstr "Adherir a compases y pulsos"
 
-#: session_option_editor.cc:350
+#: session_option_editor.cc:371
 msgid "Glue new markers to bars and beats"
 msgstr "Adherir marcadores nuevos a compases y pulsos"
 
-#: session_option_editor.cc:357
+#: session_option_editor.cc:378
 msgid "Glue new regions to bars and beats"
 msgstr "Adherir regiones nuevas a compases y pulsos"
 
-#: session_option_editor.cc:362
+#: session_option_editor.cc:383
 msgid "Defaults"
 msgstr "Predeterminados"
 
-#: session_option_editor.cc:364
+#: session_option_editor.cc:385
 msgid "Use these settings as defaults"
 msgstr "Usa esta configuración como la predeterminada"
 
@@ -11442,26 +13550,14 @@ msgstr "<b>Información del archivo de sonido</b>"
 msgid "Timestamp:"
 msgstr "Timestamp:"
 
-#: sfdb_ui.cc:149
-msgid "Format:"
-msgstr "Formato:"
-
-#: sfdb_ui.cc:188 sfdb_ui.cc:653
+#: sfdb_ui.cc:188 sfdb_ui.cc:659
 msgid "Tags:"
 msgstr "Etiquetas:"
 
-#: sfdb_ui.cc:293 sfdb_ui.cc:409
-msgid "Could not read file: %1 (%2)."
-msgstr "No se pudo leer el archivo %1 (%2)."
-
 #: sfdb_ui.cc:297
 msgid "<b>Midi File Information</b>"
 msgstr ""
 
-#: sfdb_ui.cc:458
-msgid "Could not access soundfile: "
-msgstr "No se pudo acceder al archivo de audio: "
-
 #: sfdb_ui.cc:530
 msgid "SoundFileBox: Could not tokenize string: "
 msgstr "SoundFileBox: Could not tokenize string: "
@@ -11470,181 +13566,177 @@ msgstr "SoundFileBox: Could not tokenize string: "
 msgid "Search"
 msgstr "Buscar"
 
-#: sfdb_ui.cc:576
+#: sfdb_ui.cc:581
 msgid "Audio and MIDI files"
 msgstr "Archivos de audio y MIDI"
 
-#: sfdb_ui.cc:579
+#: sfdb_ui.cc:584
 msgid "Audio files"
 msgstr "Archivos de audio"
 
-#: sfdb_ui.cc:582
+#: sfdb_ui.cc:587
 msgid "MIDI files"
 msgstr "Archivos MIDI"
 
-#: sfdb_ui.cc:585 add_video_dialog.cc:123
+#: sfdb_ui.cc:590 add_video_dialog.cc:124
 msgid "All files"
 msgstr "Todos los archivos"
 
-#: sfdb_ui.cc:604 add_video_dialog.cc:246
+#: sfdb_ui.cc:609 add_video_dialog.cc:247
 msgid "Browse Files"
 msgstr "Explorar archivos"
 
-#: sfdb_ui.cc:633
+#: sfdb_ui.cc:638
 msgid "Paths"
 msgstr "Rutas"
 
-#: sfdb_ui.cc:642
+#: sfdb_ui.cc:647
 msgid "Search Tags"
 msgstr "Buscar etiquetas"
 
-#: sfdb_ui.cc:658
+#: sfdb_ui.cc:664
 msgid "Sort:"
 msgstr "Corto:"
 
-#: sfdb_ui.cc:666
+#: sfdb_ui.cc:672
 msgid "Longest"
 msgstr "El más largo"
 
-#: sfdb_ui.cc:667
+#: sfdb_ui.cc:673
 msgid "Shortest"
 msgstr "El más corto"
 
-#: sfdb_ui.cc:668
+#: sfdb_ui.cc:674
 msgid "Newest"
 msgstr "El más nuevo"
 
-#: sfdb_ui.cc:669
+#: sfdb_ui.cc:675
 msgid "Oldest"
 msgstr "El más antiguo"
 
-#: sfdb_ui.cc:670
+#: sfdb_ui.cc:676
 msgid "Most downloaded"
 msgstr "El más descargado"
 
-#: sfdb_ui.cc:671
+#: sfdb_ui.cc:677
 msgid "Least downloaded"
 msgstr "El menos descargado"
 
-#: sfdb_ui.cc:672
+#: sfdb_ui.cc:678
 msgid "Highest rated"
 msgstr "El puntuado más alto"
 
-#: sfdb_ui.cc:673
+#: sfdb_ui.cc:679
 msgid "Lowest rated"
 msgstr "El puntuado más bajo"
 
-#: sfdb_ui.cc:678
+#: sfdb_ui.cc:684
 msgid "More"
 msgstr ""
 
-#: sfdb_ui.cc:682
+#: sfdb_ui.cc:688
 msgid "Similar"
 msgstr ""
 
-#: sfdb_ui.cc:694
+#: sfdb_ui.cc:700
 msgid "ID"
 msgstr "ID"
 
-#: sfdb_ui.cc:695 add_video_dialog.cc:83
+#: sfdb_ui.cc:701 add_video_dialog.cc:84
 msgid "Filename"
 msgstr "Nombre de archivo"
 
-#: sfdb_ui.cc:697
+#: sfdb_ui.cc:703 time_fx_dialog.cc:154
 msgid "Duration"
 msgstr "Duración"
 
-#: sfdb_ui.cc:698
+#: sfdb_ui.cc:704
 msgid "Size"
 msgstr "Tamaño"
 
-#: sfdb_ui.cc:699
+#: sfdb_ui.cc:705
 msgid "Samplerate"
 msgstr "Frec. de muestreo"
 
-#: sfdb_ui.cc:700
+#: sfdb_ui.cc:706
 msgid "License"
 msgstr "Licencia"
 
-#: sfdb_ui.cc:718
+#: sfdb_ui.cc:724
 msgid "Search Freesound"
 msgstr "Buscar en Freesound"
 
-#: sfdb_ui.cc:738
-msgid "Press to import selected files and close this window"
-msgstr ""
-
-#: sfdb_ui.cc:739
-msgid "Press to import selected files and leave this window open"
-msgstr ""
+#: sfdb_ui.cc:741
+msgid "Press to import selected files"
+msgstr "Pulsar para importar los archivos seleccionados"
 
-#: sfdb_ui.cc:740
+#: sfdb_ui.cc:742
 msgid "Press to close this window without importing any files"
 msgstr ""
 
-#: sfdb_ui.cc:936
+#: sfdb_ui.cc:937
 msgid "SoundFileBrowser: Could not tokenize string: "
 msgstr "SoundFileBrowser: Could not tokenize string: "
 
-#: sfdb_ui.cc:1136
+#: sfdb_ui.cc:1137
 msgid "%1 more page of 100 results available"
 msgid_plural "%1 more pages of 100 results available"
 msgstr[0] ""
 msgstr[1] ""
 
-#: sfdb_ui.cc:1141
+#: sfdb_ui.cc:1142
 msgid "No more results available"
 msgstr ""
 
-#: sfdb_ui.cc:1205
+#: sfdb_ui.cc:1206
 msgid "B"
 msgstr "B"
 
-#: sfdb_ui.cc:1207
+#: sfdb_ui.cc:1208
 msgid "kB"
 msgstr "kB"
 
-#: sfdb_ui.cc:1209 sfdb_ui.cc:1211
+#: sfdb_ui.cc:1210 sfdb_ui.cc:1212
 msgid "MB"
 msgstr "MB"
 
-#: sfdb_ui.cc:1213
+#: sfdb_ui.cc:1214
 msgid "GB"
 msgstr "GB"
 
-#: sfdb_ui.cc:1425 sfdb_ui.cc:1738 sfdb_ui.cc:1801 sfdb_ui.cc:1819
+#: sfdb_ui.cc:1431 sfdb_ui.cc:1728 sfdb_ui.cc:1764 sfdb_ui.cc:1782
 msgid "one track per file"
 msgstr "1 pista por archivo"
 
-#: sfdb_ui.cc:1428 sfdb_ui.cc:1802 sfdb_ui.cc:1820
+#: sfdb_ui.cc:1434 sfdb_ui.cc:1765 sfdb_ui.cc:1783
 msgid "one track per channel"
 msgstr "1 pista por canal"
 
-#: sfdb_ui.cc:1436 sfdb_ui.cc:1804 sfdb_ui.cc:1821
+#: sfdb_ui.cc:1442 sfdb_ui.cc:1767 sfdb_ui.cc:1784
 msgid "sequence files"
 msgstr "secuenciar archivos"
 
-#: sfdb_ui.cc:1439 sfdb_ui.cc:1809
+#: sfdb_ui.cc:1445 sfdb_ui.cc:1772
 msgid "all files in one track"
 msgstr "todos los archivos en una pista"
 
-#: sfdb_ui.cc:1440 sfdb_ui.cc:1803
+#: sfdb_ui.cc:1446 sfdb_ui.cc:1766
 msgid "merge files"
 msgstr "fusionar archivos"
 
-#: sfdb_ui.cc:1446 sfdb_ui.cc:1806
+#: sfdb_ui.cc:1452 sfdb_ui.cc:1769
 msgid "one region per file"
 msgstr "una región por archivo"
 
-#: sfdb_ui.cc:1449 sfdb_ui.cc:1807
+#: sfdb_ui.cc:1455 sfdb_ui.cc:1770
 msgid "one region per channel"
 msgstr "una región por canal"
 
-#: sfdb_ui.cc:1454 sfdb_ui.cc:1808 sfdb_ui.cc:1822
+#: sfdb_ui.cc:1460 sfdb_ui.cc:1771 sfdb_ui.cc:1785
 msgid "all files in one region"
 msgstr "todos los archivos en una región"
 
-#: sfdb_ui.cc:1521
+#: sfdb_ui.cc:1527
 msgid ""
 "One or more of the selected files\n"
 "cannot be used by %1"
@@ -11652,109 +13744,109 @@ msgstr ""
 "Uno o más de los archivos seleccionados\n"
 "no puede ser usado por %1"
 
-#: sfdb_ui.cc:1665
+#: sfdb_ui.cc:1671
 msgid "Copy files to session"
 msgstr ""
 "Copiar archivos\n"
 "a la sesión"
 
-#: sfdb_ui.cc:1682 sfdb_ui.cc:1859
+#: sfdb_ui.cc:1686 sfdb_ui.cc:1825
 msgid "file timestamp"
 msgstr "timestamp de archivo"
 
-#: sfdb_ui.cc:1683 sfdb_ui.cc:1861
+#: sfdb_ui.cc:1687 sfdb_ui.cc:1827
 msgid "edit point"
 msgstr "punto de edición"
 
-#: sfdb_ui.cc:1684 sfdb_ui.cc:1863
+#: sfdb_ui.cc:1688 sfdb_ui.cc:1829
 msgid "playhead"
 msgstr "cursor"
 
-#: sfdb_ui.cc:1685
+#: sfdb_ui.cc:1689
 msgid "session start"
 msgstr "inicio de sesión"
 
-#: sfdb_ui.cc:1691
-msgid "<b>Add files as ...</b>"
-msgstr "<b>Añadir archivos como...</b>"
+#: sfdb_ui.cc:1695
+msgid "<b>Add files ...</b>"
+msgstr "<b>Añadir archivos...</b>"
 
-#: sfdb_ui.cc:1713
+#: sfdb_ui.cc:1700
 msgid "<b>Insert at</b>"
 msgstr "<b>Insertar en</b>"
 
-#: sfdb_ui.cc:1726
+#: sfdb_ui.cc:1705
 msgid "<b>Mapping</b>"
 msgstr "<b>Mapeado</b>"
 
-#: sfdb_ui.cc:1744
+#: sfdb_ui.cc:1710
 msgid "<b>Conversion quality</b>"
 msgstr "<b>Calidad de conversión</b>"
 
-#: sfdb_ui.cc:1756
+#: sfdb_ui.cc:1715
 msgid "<b>Instrument</b>"
 msgstr "<b>Instrumento</b>"
 
-#: sfdb_ui.cc:1768 sfdb_ui.cc:1875
+#: sfdb_ui.cc:1734 sfdb_ui.cc:1841
 msgid "Best"
 msgstr "La mejor"
 
-#: sfdb_ui.cc:1769 sfdb_ui.cc:1877
+#: sfdb_ui.cc:1735 sfdb_ui.cc:1843
 msgid "Good"
 msgstr "Buena"
 
 # Quick=Veloz
 # Fast=Rápida
 # if not, you get two "rápida" entries in the combo
-#: sfdb_ui.cc:1770 sfdb_ui.cc:1879
+#: sfdb_ui.cc:1736 sfdb_ui.cc:1845
 msgid "Quick"
 msgstr "Veloz"
 
-#: sfdb_ui.cc:1772
+#: sfdb_ui.cc:1738
 msgid "Fastest"
 msgstr "Rapidísima"
 
-#: shuttle_control.cc:56
+#: shuttle_control.cc:64
 msgid "Shuttle speed control (Context-click for options)"
 msgstr "Control de velocidad de shuttle (click contextual para opciones)"
 
-#: shuttle_control.cc:174
+#: shuttle_control.cc:202 time_fx_dialog.cc:164
 msgid "Percent"
 msgstr "Porcentaje"
 
-#: shuttle_control.cc:182
+#: shuttle_control.cc:210
 msgid "Units"
 msgstr "Unidades"
 
-#: shuttle_control.cc:188 shuttle_control.cc:609
+#: shuttle_control.cc:216 shuttle_control.cc:679
 msgid "Sprung"
 msgstr "Muelle"
 
-#: shuttle_control.cc:192 shuttle_control.cc:612
+#: shuttle_control.cc:220 shuttle_control.cc:682
 msgid "Wheel"
 msgstr "Rueda"
 
-#: shuttle_control.cc:226
+#: shuttle_control.cc:254
 msgid "Maximum speed"
 msgstr "Velocidad máxima"
 
-#: shuttle_control.cc:568
+#: shuttle_control.cc:257
+msgid "Reset to 100%"
+msgstr ""
+
+#: shuttle_control.cc:641
 msgid "Playing"
 msgstr "Reproduciendo"
 
-#: shuttle_control.cc:583
+#: shuttle_control.cc:656
 #, c-format
 msgid "<<< %+d semitones"
 msgstr "<<< %+d semitonos"
 
-#: shuttle_control.cc:585
+#: shuttle_control.cc:658
 #, c-format
 msgid ">>> %+d semitones"
 msgstr ">>> %+d semitonos"
 
-#: shuttle_control.cc:590
-msgid "Stopped"
-msgstr "Parado"
-
 #: soundcloud_export_selector.cc:44
 msgid "User Email"
 msgstr ""
@@ -11779,7 +13871,7 @@ msgstr ""
 msgid "%1: %2 of %3 bytes uploaded"
 msgstr ""
 
-#: splash.cc:73
+#: splash.cc:78
 msgid "%1 loading ..."
 msgstr "Cargando %1 ..."
 
@@ -11795,7 +13887,7 @@ msgstr "Eliminar altavoz"
 msgid "Azimuth:"
 msgstr "Azimut:"
 
-#: startup.cc:67
+#: startup.cc:71
 msgid ""
 "Use an external mixer or the hardware mixer of your audio interface.\n"
 "%1 will play NO role in monitoring"
@@ -11803,11 +13895,11 @@ msgstr ""
 "Usar un mezclador externo o el mezclador hardware de tu interfaz de audio.\n"
 "%1 no tomará parte en la monitorización"
 
-#: startup.cc:69
+#: startup.cc:73
 msgid "Ask %1 to play back material as it is being recorded"
 msgstr "Pedir a %1 que reproduzca el material al tiempo que se graba"
 
-#: startup.cc:142
+#: startup.cc:146
 msgid ""
 "<span size=\"larger\">%1 is a digital audio workstation. You can use it to "
 "record, edit and mix multi-track audio. You can produce your own CDs, mix "
@@ -11825,15 +13917,15 @@ msgstr ""
 "Hay unas pocas cosas que hace falta configurar antes de que empieces\n"
 "a usar el programa.</span>"
 
-#: startup.cc:168
+#: startup.cc:172
 msgid "Welcome to %1"
 msgstr "Bienvenido a %1"
 
-#: startup.cc:191
+#: startup.cc:195
 msgid "Default folder for %1 sessions"
 msgstr "Carpeta predeterminada para sesiones de %1"
 
-#: startup.cc:197
+#: startup.cc:201
 msgid ""
 "Each project that you work on with %1 has its own folder.\n"
 "These can require a lot of disk space if you are recording audio.\n"
@@ -11850,11 +13942,11 @@ msgstr ""
 "<i>(Puedes poner las nuevas sesiones en cualquier carpeta, esto sólo elige "
 "la predeterminada)</i>"
 
-#: startup.cc:220
+#: startup.cc:224
 msgid "Default folder for new sessions"
 msgstr "Carpeta predeterminada para sesiones nuevas"
 
-#: startup.cc:241
+#: startup.cc:245
 msgid ""
 "While recording instruments or vocals, you probably want to listen to the\n"
 "signal as well as record it. This is called \"monitoring\". There are\n"
@@ -11879,15 +13971,15 @@ msgstr ""
 "<i>Si no entiendes lo que quiere decir esto, acepta la opción predeterminada."
 "</i>"
 
-#: startup.cc:262
+#: startup.cc:266
 msgid "Monitoring Choices"
 msgstr "Opciones de monitorización"
 
-#: startup.cc:285
+#: startup.cc:289
 msgid "Use a Master bus directly"
 msgstr "Usar directamente el bus Master"
 
-#: startup.cc:287
+#: startup.cc:291
 msgid ""
 "Connect the Master bus directly to your hardware outputs. This is preferable "
 "for simple usage."
@@ -11895,11 +13987,11 @@ msgstr ""
 "Conectar el bus Master directamente a tus salidas de hardware.Preferible "
 "para uso simple."
 
-#: startup.cc:296
+#: startup.cc:300
 msgid "Use an additional Monitor bus"
 msgstr "Usar un bus de monitorización adicional"
 
-#: startup.cc:299
+#: startup.cc:303
 msgid ""
 "Use a Monitor bus between Master bus and hardware outputs for \n"
 "greater control in monitoring without affecting the mix."
@@ -11908,7 +14000,7 @@ msgstr ""
 "hardware \n"
 "para mayor control de la monitorización, sin afectar a la mezcla."
 
-#: startup.cc:321
+#: startup.cc:325
 msgid ""
 "<i>You can change this preference at any time via the Preferences dialog.\n"
 "You can also add or remove the monitor section to/from any session.</i>\n"
@@ -11922,46 +14014,42 @@ msgstr ""
 "\n"
 "<i>En caso de duda, acepta la opción predeterminada.</i>"
 
-#: startup.cc:332
+#: startup.cc:336
 msgid "Monitor Section"
 msgstr "Sección de monitorización"
 
-#: step_entry.cc:60
+#: step_entry.cc:59
 msgid "Step Entry: %1"
 msgstr ""
 
-#: step_entry.cc:65
+#: step_entry.cc:64
 msgid ">beat"
 msgstr ">pulso"
 
-#: step_entry.cc:66
+#: step_entry.cc:65
 msgid ">bar"
 msgstr ">compás"
 
-#: step_entry.cc:67
+#: step_entry.cc:66
 msgid ">EP"
 msgstr ">EP"
 
-#: step_entry.cc:68
+#: step_entry.cc:67
 msgid "sustain"
 msgstr "sostenido"
 
-#: step_entry.cc:69
+#: step_entry.cc:68
 msgid "rest"
 msgstr "silencio"
 
-#: step_entry.cc:70
+#: step_entry.cc:69
 msgid "g-rest"
 msgstr ""
 
-#: step_entry.cc:71
+#: step_entry.cc:70
 msgid "back"
 msgstr "atrás"
 
-#: step_entry.cc:82 step_entry.cc:85
-msgid "+"
-msgstr "+"
-
 #: step_entry.cc:191
 msgid "Set note length to a whole note"
 msgstr "Establecer duración de nota a redonda"
@@ -12070,11 +14158,11 @@ msgstr "Insertar mensaje de cambio de banco"
 msgid "Insert a program change message"
 msgstr "Insertar mensaje de cambio de programa"
 
-#: step_entry.cc:343 step_entry.cc:700
+#: step_entry.cc:343 step_entry.cc:645
 msgid "Move Insert Position Back by Note Length"
 msgstr "Atrasar posición de inserción a duración de nota"
 
-#: step_entry.cc:344 step_entry.cc:698
+#: step_entry.cc:344 step_entry.cc:643
 msgid "Move Insert Position to Edit Point"
 msgstr "Mover posición de inserción a punto de edición"
 
@@ -12086,240 +14174,245 @@ msgstr "1/Nota"
 msgid "Octave"
 msgstr "Octava"
 
-#: step_entry.cc:598
+#: step_entry.cc:592
 msgid "Insert Note A"
 msgstr "Insertar nota A"
 
-#: step_entry.cc:599
+#: step_entry.cc:593
 msgid "Insert Note A-sharp"
 msgstr "Insertar nota A sostenido"
 
-#: step_entry.cc:600
+#: step_entry.cc:594
 msgid "Insert Note B"
 msgstr "Insertar nota B"
 
-#: step_entry.cc:601
+#: step_entry.cc:595
 msgid "Insert Note C"
 msgstr "Insertar nota C"
 
-#: step_entry.cc:602
+#: step_entry.cc:596
 msgid "Insert Note C-sharp"
 msgstr "Insertar nota C sostenido"
 
-#: step_entry.cc:603
+#: step_entry.cc:597
 msgid "Insert Note D"
 msgstr "Insertar nota D"
 
-#: step_entry.cc:604
+#: step_entry.cc:598
 msgid "Insert Note D-sharp"
 msgstr "Insertar nota D sostenido"
 
-#: step_entry.cc:605
+#: step_entry.cc:599
 msgid "Insert Note E"
 msgstr "Insertar nota E"
 
-#: step_entry.cc:606
+#: step_entry.cc:600
 msgid "Insert Note F"
 msgstr "Insertar nota F"
 
-#: step_entry.cc:607
+#: step_entry.cc:601
 msgid "Insert Note F-sharp"
 msgstr "Insertar nota F sostenido"
 
-#: step_entry.cc:608
+#: step_entry.cc:602
 msgid "Insert Note G"
 msgstr "Insertar nota G"
 
-#: step_entry.cc:609
+#: step_entry.cc:603
 msgid "Insert Note G-sharp"
 msgstr "Insertar nota G sostenido"
 
-#: step_entry.cc:611
+#: step_entry.cc:605
 msgid "Insert a Note-length Rest"
 msgstr "Insertar un silencio con duración de nota"
 
-#: step_entry.cc:612
+#: step_entry.cc:606
 msgid "Insert a Snap-length Rest"
 msgstr "Insertar un silencio con duración de ajuste"
 
-#: step_entry.cc:614 step_entry.cc:615
+#: step_entry.cc:608 step_entry.cc:609
 msgid "Move to next octave"
 msgstr "Mover a siguiente octava"
 
-#: step_entry.cc:617
+#: step_entry.cc:611
 msgid "Move to Next Note Length"
 msgstr "Mover a duración de nota siguiente"
 
-#: step_entry.cc:618
+#: step_entry.cc:612
 msgid "Move to Previous Note Length"
 msgstr "Mover a duración de nota anterior"
 
-#: step_entry.cc:620
+#: step_entry.cc:614
 msgid "Increase Note Length"
 msgstr "Aumentar duración de nota"
 
-#: step_entry.cc:621
+#: step_entry.cc:615
 msgid "Decrease Note Length"
 msgstr "Disminuir duración de nota"
 
-#: step_entry.cc:623
+#: step_entry.cc:617
 msgid "Move to Next Note Velocity"
 msgstr "Mover a intesidad de nota siguiente"
 
-#: step_entry.cc:624
+#: step_entry.cc:618
 msgid "Move to Previous Note Velocity"
 msgstr "Mover a intesidad de nota anterior"
 
-#: step_entry.cc:626
+#: step_entry.cc:620
 msgid "Increase Note Velocity"
 msgstr "Aumentar intensidad de nota"
 
-#: step_entry.cc:627
+#: step_entry.cc:621
 msgid "Decrease Note Velocity"
 msgstr "Disminuir intensidad de nota"
 
-#: step_entry.cc:629
+#: step_entry.cc:623
 msgid "Switch to the 1st octave"
 msgstr "Cambiar a la primera octava"
 
-#: step_entry.cc:630
+#: step_entry.cc:624
 msgid "Switch to the 2nd octave"
 msgstr "Cambiar a la segunda octava"
 
-#: step_entry.cc:631
+#: step_entry.cc:625
 msgid "Switch to the 3rd octave"
 msgstr "Cambiar a la tercera octava"
 
-#: step_entry.cc:632
+#: step_entry.cc:626
 msgid "Switch to the 4th octave"
 msgstr "Cambiar a la cuarta octava"
 
-#: step_entry.cc:633
+#: step_entry.cc:627
 msgid "Switch to the 5th octave"
 msgstr "Cambiar a la quinta octava"
 
-#: step_entry.cc:634
+#: step_entry.cc:628
 msgid "Switch to the 6th octave"
 msgstr "Cambiar a la sexta octava"
 
-#: step_entry.cc:635
+#: step_entry.cc:629
 msgid "Switch to the 7th octave"
 msgstr "Cambiar a la séptima octava"
 
-#: step_entry.cc:636
+#: step_entry.cc:630
 msgid "Switch to the 8th octave"
 msgstr "Cambiar a la octava octava"
 
-#: step_entry.cc:637
+#: step_entry.cc:631
 msgid "Switch to the 9th octave"
 msgstr "Cambiar a la novena octava"
 
-#: step_entry.cc:638
+#: step_entry.cc:632
 msgid "Switch to the 10th octave"
 msgstr "Cambiar a la décima octava"
 
-#: step_entry.cc:639
+#: step_entry.cc:633
 msgid "Switch to the 11th octave"
 msgstr "Cambiar a la décimoprimera octava"
 
-#: step_entry.cc:644
+#: step_entry.cc:635
+msgid "Toggle Triple Notes"
+msgstr "Notas triples"
+
+#: step_entry.cc:638
+msgid "Toggle Chord Entry"
+msgstr "Entrada de acordes"
+
+#: step_entry.cc:640
+msgid "Sustain Selected Notes by Note Length"
+msgstr "Mantener notas seleccionadas a duración de nota"
+
+#: step_entry.cc:650
 msgid "Set Note Length to Whole"
 msgstr "Establecer duración de nota a entera"
 
-#: step_entry.cc:646
+#: step_entry.cc:652
 msgid "Set Note Length to 1/2"
 msgstr "Establecer duración de nota a 1/2"
 
-#: step_entry.cc:648
+#: step_entry.cc:654
 msgid "Set Note Length to 1/3"
 msgstr "Establecer duración de nota a 1/3"
 
-#: step_entry.cc:650
+#: step_entry.cc:656
 msgid "Set Note Length to 1/4"
 msgstr "Establecer duración de nota a 1/4"
 
-#: step_entry.cc:652
+#: step_entry.cc:658
 msgid "Set Note Length to 1/8"
 msgstr "Establecer duración de nota a 1/8"
 
-#: step_entry.cc:654
+#: step_entry.cc:660
 msgid "Set Note Length to 1/16"
 msgstr "Establecer duración de nota a 1/16"
 
-#: step_entry.cc:656
+#: step_entry.cc:662
 msgid "Set Note Length to 1/32"
 msgstr "Establecer duración de nota a 1/32"
 
-#: step_entry.cc:658
+#: step_entry.cc:664
 msgid "Set Note Length to 1/64"
 msgstr "Establecer duración de nota a 1/64"
 
-#: step_entry.cc:663
+#: step_entry.cc:669
 msgid "Set Note Velocity to Pianississimo"
 msgstr "Establecer intensidad de nota a pianississimo"
 
-#: step_entry.cc:665
+#: step_entry.cc:671
 msgid "Set Note Velocity to Pianissimo"
 msgstr "Establecer intensidad de nota a pianissimo"
 
-#: step_entry.cc:667
+#: step_entry.cc:673
 msgid "Set Note Velocity to Piano"
 msgstr "Establecer intensidad de nota a piano"
 
-#: step_entry.cc:669
+#: step_entry.cc:675
 msgid "Set Note Velocity to Mezzo-Piano"
 msgstr "Establecer intensidad de nota a mezzo-piano"
 
-#: step_entry.cc:671
+#: step_entry.cc:677
 msgid "Set Note Velocity to Mezzo-Forte"
 msgstr "Establecer intensidad de nota a mezzo-forte"
 
-#: step_entry.cc:673
+#: step_entry.cc:679
 msgid "Set Note Velocity to Forte"
 msgstr "Establecer intensidad de nota a forte"
 
-#: step_entry.cc:675 step_entry.cc:677
+#: step_entry.cc:681 step_entry.cc:683
 msgid "Set Note Velocity to Fortississimo"
 msgstr "Establecer intensidad de nota a fortississimo"
 
-#: step_entry.cc:679
-msgid "Toggle Triple Notes"
-msgstr "Notas triples"
-
-#: step_entry.cc:684
+#: step_entry.cc:688
 msgid "No Dotted Notes"
 msgstr "Sin notas con puntillo"
 
-#: step_entry.cc:686
+#: step_entry.cc:689
 msgid "Toggled Dotted Notes"
 msgstr "Notas con puntillo"
 
-#: step_entry.cc:688
+#: step_entry.cc:690
 msgid "Toggled Double-Dotted Notes"
 msgstr "Notas con doble puntillo"
 
-#: step_entry.cc:690
+#: step_entry.cc:691
 msgid "Toggled Triple-Dotted Notes"
 msgstr "Notas con triple puntillo"
 
-#: step_entry.cc:693
-msgid "Toggle Chord Entry"
-msgstr "Entrada de acordes"
-
-#: step_entry.cc:695
-msgid "Sustain Selected Notes by Note Length"
-msgstr "Mantener notas seleccionadas a duración de nota"
-
-#: stereo_panner.cc:133
+#: stereo_panner.cc:129
 #, c-format
 msgid "L:%3d R:%3d Width:%d%%"
 msgstr ""
 
-#: stereo_panner_editor.cc:35
+# Aquí estaba panorámica, pero pan se entiende perfectamente y es mucho más corto
+#: stereo_panner.cc:272
+msgid "Panner|M"
+msgstr "Paner|M"
+
+#: stereo_panner_editor.cc:37
 msgid "Stereo Panner"
 msgstr "Paner estéreo"
 
-#: stereo_panner_editor.cc:49
+#: stereo_panner_editor.cc:51
 msgid "Width"
 msgstr "Anchura"
 
@@ -12327,178 +14420,191 @@ msgstr "Anchura"
 msgid "Strip Silence"
 msgstr "Quitar silencio"
 
-#: strip_silence_dialog.cc:75
+#: strip_silence_dialog.cc:65
+msgid "Threshold"
+msgstr "Umbral"
+
+#: strip_silence_dialog.cc:76
 msgid "Minimum length"
 msgstr "Duración mínima"
 
-#: strip_silence_dialog.cc:83
+#: strip_silence_dialog.cc:84
 msgid "Fade length"
 msgstr "Duración de fundido"
 
-#: tempo_dialog.cc:41 tempo_dialog.cc:57
+#: strip_silence_dialog.cc:111 strip_silence_dialog.cc:298
+msgid "Analyzing"
+msgstr "Analizando"
+
+#: tempo_dialog.cc:43 tempo_dialog.cc:60
 msgid "bar:"
 msgstr "compás:"
 
-#: tempo_dialog.cc:42 tempo_dialog.cc:58
+#: tempo_dialog.cc:44 tempo_dialog.cc:61
 msgid "beat:"
 msgstr "pulso:"
 
-#: tempo_dialog.cc:43 tempo_dialog.cc:59
+#: tempo_dialog.cc:45 tempo_dialog.cc:62
 msgid "Pulse note"
 msgstr "Duración de nota"
 
-#: tempo_dialog.cc:44 tempo_dialog.cc:60
+#: tempo_dialog.cc:46 tempo_dialog.cc:63
 msgid "Tap tempo"
 msgstr ""
 
-#: tempo_dialog.cc:54
-msgid "Edit Tempo"
-msgstr "Editar tempo"
-
-#: tempo_dialog.cc:77 tempo_dialog.cc:78 tempo_dialog.cc:324
-#: tempo_dialog.cc:325
+#: tempo_dialog.cc:81 tempo_dialog.cc:82 tempo_dialog.cc:448
+#: tempo_dialog.cc:449
 msgid "whole"
 msgstr "redonda"
 
-#: tempo_dialog.cc:79 tempo_dialog.cc:80 tempo_dialog.cc:326
-#: tempo_dialog.cc:327
+#: tempo_dialog.cc:83 tempo_dialog.cc:84 tempo_dialog.cc:450
+#: tempo_dialog.cc:451
 msgid "second"
 msgstr "blanca"
 
-#: tempo_dialog.cc:81 tempo_dialog.cc:82 tempo_dialog.cc:328
-#: tempo_dialog.cc:329
+#: tempo_dialog.cc:85 tempo_dialog.cc:86 tempo_dialog.cc:452
+#: tempo_dialog.cc:453
 msgid "third"
 msgstr "tercera"
 
-#: tempo_dialog.cc:83 tempo_dialog.cc:84 tempo_dialog.cc:330
-#: tempo_dialog.cc:331
+#: tempo_dialog.cc:87 tempo_dialog.cc:88 tempo_dialog.cc:454
+#: tempo_dialog.cc:455
 msgid "quarter"
 msgstr "negra"
 
-#: tempo_dialog.cc:85 tempo_dialog.cc:86 tempo_dialog.cc:332
-#: tempo_dialog.cc:333
+#: tempo_dialog.cc:89 tempo_dialog.cc:90 tempo_dialog.cc:456
+#: tempo_dialog.cc:457
 msgid "eighth"
 msgstr "corchea"
 
-#: tempo_dialog.cc:87 tempo_dialog.cc:88 tempo_dialog.cc:334
-#: tempo_dialog.cc:335
+#: tempo_dialog.cc:91 tempo_dialog.cc:92 tempo_dialog.cc:458
+#: tempo_dialog.cc:459
 msgid "sixteenth"
 msgstr "semicorchea"
 
-#: tempo_dialog.cc:89 tempo_dialog.cc:90 tempo_dialog.cc:336
-#: tempo_dialog.cc:337
+#: tempo_dialog.cc:93 tempo_dialog.cc:94 tempo_dialog.cc:460
+#: tempo_dialog.cc:461
 msgid "thirty-second"
 msgstr "fusa"
 
-#: tempo_dialog.cc:91 tempo_dialog.cc:92 tempo_dialog.cc:338
-#: tempo_dialog.cc:339
+#: tempo_dialog.cc:95 tempo_dialog.cc:96 tempo_dialog.cc:462
+#: tempo_dialog.cc:463
 msgid "sixty-fourth"
 msgstr "semifusa"
 
-#: tempo_dialog.cc:93 tempo_dialog.cc:94 tempo_dialog.cc:340
-#: tempo_dialog.cc:341
+#: tempo_dialog.cc:97 tempo_dialog.cc:98 tempo_dialog.cc:464
+#: tempo_dialog.cc:465
 msgid "one-hundred-twenty-eighth"
 msgstr "semi-semifusa"
 
-#: tempo_dialog.cc:121
+#: tempo_dialog.cc:115 tempo_dialog.cc:116
+msgid "ramped"
+msgstr "con rampa"
+
+#: tempo_dialog.cc:117 tempo_dialog.cc:118
+msgid "constant"
+msgstr "constante"
+
+#: tempo_dialog.cc:133 tempo_dialog.cc:134 tempo_dialog.cc:482
+#: tempo_dialog.cc:483
+msgid "music"
+msgstr "Música"
+
+#: tempo_dialog.cc:161
 msgid "Beats per minute:"
 msgstr "Pulsos por minuto:"
 
-#: tempo_dialog.cc:155
+#: tempo_dialog.cc:195
 msgid "Tempo begins at"
 msgstr "El tempo comienza en"
 
-#: tempo_dialog.cc:251
+#: tempo_dialog.cc:201
+msgid "Lock Style:"
+msgstr "Estilo de bloqueo:"
+
+#: tempo_dialog.cc:209
+msgid "Tempo Type:"
+msgstr "Tipo de tempo:"
+
+#: tempo_dialog.cc:321
 msgid "incomprehensible pulse note type (%1)"
-msgstr "duración de nota incomprensible (%1)"
+msgstr "duración de nota no aplicable (%1)"
 
-#: tempo_dialog.cc:307
-msgid "Edit Meter"
-msgstr "Editar métrica"
+#: tempo_dialog.cc:334
+msgid "incomprehensible tempo type (%1)"
+msgstr "tipo de tempo no aplicable (%1)"
+
+#: tempo_dialog.cc:347
+msgid "incomprehensible lock style (%1)"
+msgstr "Estilo de bloqueo no aplicable (%1)"
 
 # hace referencia al tipo de nota (corchea, semicorchea, etc...)
 # (aparece en la ventana de configuración de compás: pulsos por compás, etc...)
-#: tempo_dialog.cc:356
+#: tempo_dialog.cc:498
 msgid "Note value:"
 msgstr "Valor de nota:"
 
-#: tempo_dialog.cc:357
+#: tempo_dialog.cc:499
+msgid "Lock style:"
+msgstr "Estilo de bloqueo:"
+
+#: tempo_dialog.cc:500
 msgid "Beats per bar:"
 msgstr "Pulsos por compás:"
 
-#: tempo_dialog.cc:371
+#: tempo_dialog.cc:514
 msgid "Meter begins at bar:"
 msgstr "Métrica comienza en compás:"
 
-#: tempo_dialog.cc:484
+#: tempo_dialog.cc:638
 msgid "incomprehensible meter note type (%1)"
-msgstr "tipo de métrica incomprensible (%1)"
-
-#: theme_manager.cc:65
-msgid "Dark Theme"
-msgstr "Tema oscuro"
+msgstr "tipo de métrica no aplicable (%1)"
 
-#: theme_manager.cc:66
-msgid "Light Theme"
-msgstr "Tema claro"
+#: tempo_dialog.cc:651
+msgid "incomprehensible meter lock style (%1)"
+msgstr "Estilo de bloqueo de métrica no aplicable (%1)"
 
-#: theme_manager.cc:67
-msgid "Restore Defaults"
-msgstr "Restablecer lo predeterminado"
-
-#: theme_manager.cc:68
+#: theme_manager.cc:53
 msgid "Draw \"flat\" buttons"
 msgstr "Mostrar botones \"planos\""
 
-#: theme_manager.cc:69
+#: theme_manager.cc:54
 msgid "Blink Rec-Arm buttons"
 msgstr ""
 
-#: theme_manager.cc:70
+#: theme_manager.cc:55
 msgid "Color regions using their track's color"
 msgstr "Colorear regiones con el color de su pista"
 
-#: theme_manager.cc:71
+#: theme_manager.cc:56
 msgid "Show waveform clipping"
 msgstr "Mostrar clipping en la onda"
 
-#: theme_manager.cc:73
+#: theme_manager.cc:58
 msgid "Waveforms color gradient depth"
 msgstr "Gradiente de color de las ondas"
 
-#: theme_manager.cc:75
+#: theme_manager.cc:60
 msgid "Timeline item gradient depth"
 msgstr "Gradiente de color de la línea de tiempo"
 
-#: theme_manager.cc:76
+#: theme_manager.cc:61
 msgid "All floating windows are dialogs"
 msgstr ""
 
-#: theme_manager.cc:77
+#: theme_manager.cc:62
 msgid "Transient windows follow front window."
 msgstr ""
 
-#: theme_manager.cc:78
-msgid "Icon Set"
-msgstr ""
-
-#: theme_manager.cc:87
-msgid "Object"
-msgstr "Objeto"
-
-#: theme_manager.cc:163
-msgid "Items"
+#: theme_manager.cc:63
+msgid "Float detached monitor-section window"
 msgstr ""
 
-#: theme_manager.cc:164
-msgid "Palette"
+#: theme_manager.cc:64
+msgid "Icon Set"
 msgstr ""
 
-#: theme_manager.cc:165
-msgid "Transparency"
-msgstr "Transparencia"
-
-#: theme_manager.cc:195
+#: theme_manager.cc:132
 msgid ""
 "Mark all floating windows to be type \"Dialog\" rather than using \"Utility"
 "\" for some.\n"
@@ -12506,92 +14612,95 @@ msgid ""
 "take effect"
 msgstr ""
 
-#: theme_manager.cc:199
+#: theme_manager.cc:136
 msgid ""
 "Make transient windows follow the front window when toggling between the "
 "editor and mixer.\n"
 "This requires a restart of %1 to take effect"
 msgstr ""
 
-#: theme_manager.cc:620
-msgid "Color Palette"
-msgstr "Paleta de color"
+#: theme_manager.cc:139
+msgid ""
+"When detaching the monitoring section, mark it as \"Utility\" window to stay "
+"in front.\n"
+"This requires a restart of %1 to take effect"
+msgstr ""
 
 #: time_axis_view.cc:148
 msgid "Track/Bus name (double click to edit)"
 msgstr "Nombre de pista/bus (doble clic para editar)"
 
-#: time_axis_view_item.cc:345
+#: time_axis_view_item.cc:326
 msgid "new duration %1 frame is out of bounds for %2"
 msgid_plural "new duration of %1 frames is out of bounds for %2"
 msgstr[0] "La nueva duración de %1 cuadro está fuera de límites para %2"
 msgstr[1] "La nueva duración de %1 cuadros está fuera de límites para %2"
 
-#: time_fx_dialog.cc:62
+#: time_fx_dialog.cc:60
 msgid "Quick but Ugly"
 msgstr "Rápido pero feo"
 
-#: time_fx_dialog.cc:63
+#: time_fx_dialog.cc:61
 msgid "Skip Anti-aliasing"
 msgstr "Omitir anti-aliasing"
 
-#: time_fx_dialog.cc:64
-msgid "Contents:"
-msgstr "Contenidos:"
+#: time_fx_dialog.cc:62
+msgid "Contents"
+msgstr "Contenidos"
 
-#: time_fx_dialog.cc:65
+#: time_fx_dialog.cc:63
 msgid "Minimize time distortion"
 msgstr "Minimizar distorsión temporal"
 
-#: time_fx_dialog.cc:66
+#: time_fx_dialog.cc:64
 msgid "Preserve Formants"
 msgstr "Conservar formantes"
 
-#: time_fx_dialog.cc:71
+#: time_fx_dialog.cc:81
 msgid "TimeFXDialog"
 msgstr "TimeFXDialog"
 
-#: time_fx_dialog.cc:74
+#: time_fx_dialog.cc:84
 msgid "Pitch Shift Audio"
 msgstr "Cambiar tono de audio"
 
-#: time_fx_dialog.cc:76
+#: time_fx_dialog.cc:86
 msgid "Time Stretch Audio"
 msgstr "Estirar tiempo de audio"
 
-#: time_fx_dialog.cc:104 transpose_dialog.cc:41
+#: time_fx_dialog.cc:114 transpose_dialog.cc:41
 msgid "Octaves:"
 msgstr "Octavas:"
 
-#: time_fx_dialog.cc:109 transpose_dialog.cc:46
+#: time_fx_dialog.cc:119 transpose_dialog.cc:46
 msgid "Semitones:"
 msgstr "Semitonos:"
 
-#: time_fx_dialog.cc:114
+#: time_fx_dialog.cc:124
 msgid "Cents:"
 msgstr "Cents:"
 
-#: time_fx_dialog.cc:122
+#: time_fx_dialog.cc:132
 msgid "Time|Shift"
 msgstr "Tiempo|Shift"
 
-#: time_fx_dialog.cc:146 time_fx_dialog.cc:149
+#: time_fx_dialog.cc:184 time_fx_dialog.cc:188
 msgid "TimeFXButton"
 msgstr "TimeFXButton"
 
-#: time_fx_dialog.cc:154
+#: time_fx_dialog.cc:193
 msgid "Stretch/Shrink"
 msgstr "Estirar/Contraer"
 
-#: time_fx_dialog.cc:164
+#: time_fx_dialog.cc:203
 msgid "<b>Progress</b>"
 msgstr "<b>Progreso</b>"
 
-#: time_info_box.cc:124
+#: time_info_box.cc:118
 msgid "Start recording at auto-punch start"
 msgstr "Iniciar grabación al iniciar pinchazo"
 
-#: time_info_box.cc:125
+#: time_info_box.cc:119
 msgid "Stop recording at auto-punch end"
 msgstr "Detener grabación al despinchar"
 
@@ -12659,177 +14768,229 @@ msgstr "Transportar MIDI"
 msgid "Transpose"
 msgstr "Transportar"
 
-#: ui_config.cc:163 ui_config.cc:300
+#: ui_config.cc:234 ui_config.cc:422
 msgid "Loading default ui configuration file %1"
 msgstr ""
 "Cargando el archivo de configuración de interfaz de usuario predeterminado %1"
 
-#: ui_config.cc:166 ui_config.cc:303
+#: ui_config.cc:237 ui_config.cc:425
 msgid "cannot read default ui configuration file \"%1\""
 msgstr ""
 "no se pudo leer el archivo de configuración de interfaz de usuario "
 "predeterminado  \"%1\"."
 
-#: ui_config.cc:169 ui_config.cc:308
+#: ui_config.cc:240 ui_config.cc:430
 msgid "default ui configuration file \"%1\" not loaded successfully."
 msgstr ""
 "el archivo de configuración de interfaz de usuario predeterminado \"%1\" no "
 "pudo cargar."
 
-#: ui_config.cc:177
+#: ui_config.cc:248
 msgid "Could not find default UI configuration file %1"
 msgstr ""
 "No se encontró el archivo de configuración de interfaz de usuario "
 "predeterminado %1"
 
-#: ui_config.cc:219
+#: ui_config.cc:289
 msgid "Loading color file %1"
 msgstr "Cargando el archivo de color %1"
 
-#: ui_config.cc:222
+#: ui_config.cc:292
 msgid "cannot read color file \"%1\""
 msgstr "no se pudo leer el archivo de color \"%1\"."
 
-#: ui_config.cc:227
+#: ui_config.cc:297
 msgid "color file \"%1\" not loaded successfully."
 msgstr "el archivo de color \"%1\" no se pudo cargar."
 
-#: ui_config.cc:233
-msgid "Color file %1 not found"
-msgstr "No se encontró el archivo de color %1"
+#: ui_config.cc:325
+msgid "Color file for %1 not found along %2"
+msgstr ""
 
-#: ui_config.cc:282 ui_config.cc:361
+#: ui_config.cc:403 ui_config.cc:486
 msgid "Color file %1 not saved"
 msgstr "No se guardó el archivo de color %1."
 
-#: ui_config.cc:317
+#: ui_config.cc:439
 msgid "Loading user ui configuration file %1"
 msgstr "Cargando el archivo de configuración de interfaz de usuario %1"
 
-#: ui_config.cc:320
+#: ui_config.cc:442
 msgid "cannot read ui configuration file \"%1\""
 msgstr ""
 "no se pudo leer el archivo de configuración de interfaz de usuario \"%1\"."
 
-#: ui_config.cc:325
+#: ui_config.cc:447
 msgid "user ui configuration file \"%1\" not loaded successfully."
 msgstr ""
 "el archivo de configuración de interfaz de usuario \"%1\" no se pudo cargar."
 
-#: ui_config.cc:333
+#: ui_config.cc:455
 msgid "could not find any ui configuration file, canvas will look broken."
 msgstr ""
 "no se puedo encontrar ningún archivo de configuración de interfaz de usuario "
 "\"%1\""
 
-#: ui_config.cc:351
+#: ui_config.cc:476
 msgid "Config file %1 not saved"
 msgstr "No se guardó el archivo de configuración %1."
 
-#: ui_config.cc:592
+#: ui_config.cc:720
 msgid "Color %1 not found"
 msgstr "Color %1 no encontrado"
 
-#: ui_config.cc:662
+#: ui_config.cc:790
 msgid "Unable to find UI style file %1 in search path %2. %3 will look strange"
 msgstr ""
 "No se pudo encontrar el archivo de estilo de interfaz de usuario %1 en la "
 "ruta de búsqueda %2. %3 tendrá un aspecto extraño"
 
-#: utils.cc:117 utils.cc:160
+#: utils.cc:118 utils.cc:161
 msgid "bad XPM header %1"
 msgstr "Encabezado XPM erróneo %1."
 
-#: utils.cc:577
+#: utils.cc:365
 msgid "cannot find XPM file for %1"
 msgstr "No se pudo encontrar el archivo XPM para %1."
 
-#: utils.cc:597 utils.cc:627 utils.cc:641
+#: utils.cc:418 utils.cc:448 utils.cc:468
 msgid "default"
 msgstr ""
 
-#: utils.cc:642
+#: utils.cc:469
 msgid "icon \"%1\" not found for icon set \"%2\", fallback to default"
 msgstr ""
 
-#: utils.cc:649
+#: utils.cc:476
 msgid "cannot find icon image for %1 using %2"
 msgstr "No se pudo encontrar la imagen del icono para %1 usando %2"
 
-#: utils.cc:666 utils.cc:682
+#: utils.cc:493 utils.cc:509
 msgid "Caught exception while loading icon named %1"
 msgstr "Caught exception while loading icon named %1"
 
-#: add_video_dialog.cc:54
+#: utils.cc:759
+msgid "Overwrite"
+msgstr "Reescribir"
+
+#: vca_master_strip.cc:74 vca_time_axis.cc:49
+msgid "Solo slaves"
+msgstr "Esclavos solo"
+
+#: vca_master_strip.cc:79 vca_time_axis.cc:55
+msgid "Mute slaves"
+msgstr ""
+
+#: vca_master_strip.cc:83
+msgid "Hide this VCA strip"
+msgstr "Ocultar este canal VCA"
+
+#: vca_master_strip.cc:108 vca_master_strip.cc:418
+msgid "Click to show slaves only"
+msgstr "Pulsa para mostrar sólo los esclavos"
+
+#: vca_master_strip.cc:293
+msgid "A"
+msgstr "A"
+
+#: vca_master_strip.cc:300
+msgid "S"
+msgstr "S"
+
+#: vca_master_strip.cc:398
+msgid "Drop All Slaves"
+msgstr ""
+
+#: vca_master_strip.cc:421
+msgid "Click to show normal mixer"
+msgstr "Pulsa para mostrar mezclador normal"
+
+#: add_video_dialog.cc:55
 msgid "Set Video Track"
 msgstr ""
 
-#: add_video_dialog.cc:62
+#: add_video_dialog.cc:63
 msgid "Open Video Monitor Window"
 msgstr ""
 
-#: add_video_dialog.cc:63
+#: add_video_dialog.cc:64
 msgid "Adjust Session Framerate to Match Video Framerate"
 msgstr "Ajustar el framerate de la sesión para igualarlo al del video"
 
-#: add_video_dialog.cc:65
+#: add_video_dialog.cc:66
 msgid "Reload docroot"
 msgstr "Recargar docroot"
 
-#: add_video_dialog.cc:120
+#: add_video_dialog.cc:121
 msgid "Video files"
 msgstr "Archivos de video"
 
-#: add_video_dialog.cc:149
+#: add_video_dialog.cc:150
 msgid "<b>Video Information</b>"
 msgstr "<b>Información de video</b>"
 
-#: add_video_dialog.cc:152
+#: add_video_dialog.cc:153
 msgid "Start:"
 msgstr "Inicio:"
 
-#: add_video_dialog.cc:158
+#: add_video_dialog.cc:159
 msgid "Frame rate:"
 msgstr "Frame rate:"
 
-#: add_video_dialog.cc:161
+#: add_video_dialog.cc:162
 msgid "Aspect Ratio:"
 msgstr "Relación de aspecto"
 
-#: add_video_dialog.cc:244
+#: add_video_dialog.cc:245
 msgid "VideoServerIndex"
 msgstr ""
 
-#: add_video_dialog.cc:675
+#: add_video_dialog.cc:676
 msgid " %1 fps"
 msgstr ""
 
-#: video_timeline.cc:468
+#: vca_time_axis.cc:60
+msgid "D"
+msgstr "D"
+
+#: vca_time_axis.cc:61
+msgid "Unassign all slaves"
+msgstr ""
+
+#: vca_time_axis.cc:65
+msgid "V"
+msgstr "V"
+
+#: vca_time_axis.cc:66
+msgid "Show only slaves"
+msgstr "Mostrar sólo esclavos"
+
+#: video_timeline.cc:473
 msgid ""
 "Parsing video file info failed. Is the Video Server running? Is the file "
 "readable by the Video Server? Does the docroot match? Is it a video file?"
 msgstr ""
 
-#: video_timeline.cc:506
+#: video_timeline.cc:511
 msgid ""
 "Failed to set session-framerate: '%1' does not have a corresponding option "
 "setting in %2."
 msgstr ""
 
-#: video_timeline.cc:514
+#: video_timeline.cc:519
 msgid ""
 "Video file's framerate is not equal to %1 session timecode's framerate: '%2' "
 "vs '%3'"
 msgstr ""
 
-#: video_timeline.cc:587
+#: video_timeline.cc:592
 msgid ""
 "Video-server docroot mismatch. %1: '%2', video-server: '%3'. This usually "
 "means that the video server was not started by %1 and uses a different "
 "document-root."
 msgstr ""
 
-#: video_timeline.cc:724
+#: video_timeline.cc:729
 msgid ""
 "Video-monitor 'xjadeo' was not found. Please install http://xjadeo.sf.net/ "
 "(a custom path to xjadeo can be specified by setting the XJREMOTE "
@@ -12839,25 +15000,25 @@ msgid ""
 "see also http://manual.ardour.org/video-timeline/setup/"
 msgstr ""
 
-#: video_timeline.cc:739
+#: video_timeline.cc:744
 msgid "Video-monitor 'xjadeo' cannot be launched."
 msgstr ""
 
-#: video_timeline.cc:766
+#: video_timeline.cc:776
 msgid ""
 "Video-monitor 'xjadeo' is too old. Please install xjadeo version 0.7.7 or "
 "later. http://xjadeo.sf.net/"
 msgstr ""
 
-#: video_monitor.cc:285
+#: video_monitor.cc:283
 msgid "Video Monitor: File Not Found."
 msgstr ""
 
 #: transcode_ffmpeg.cc:56
 msgid ""
-"No ffprobe or ffmpeg executables could be found on this system.\n"
-"Video import and export is not possible until you install those tools.\n"
+"ffmpeg installation was not found on this system.\n"
 "%1 requires ffmpeg and ffprobe from ffmpeg.org - version 1.1 or newer.\n"
+"Video import and export is not possible until you install tools.\n"
 "\n"
 "The tools are included with the %1 releases from ardour.org and also "
 "available with the video-server at http://x42.github.com/harvid/\n"
@@ -12879,7 +15040,7 @@ msgstr ""
 msgid "Output File:"
 msgstr "Archivo de salida:"
 
-#: transcode_video_dialog.cc:61 export_video_dialog.cc:85
+#: transcode_video_dialog.cc:61 export_video_dialog.cc:81
 msgid "Abort"
 msgstr "Cancelar"
 
@@ -12888,12 +15049,16 @@ msgid "Height = "
 msgstr "Altura = "
 
 #: transcode_video_dialog.cc:66
+msgid "Extract LTC from audio and align video"
+msgstr ""
+
+#: transcode_video_dialog.cc:67
 msgid "Manual Override"
 msgstr ""
 
-#: transcode_video_dialog.cc:70 export_video_dialog.cc:103
+#: transcode_video_dialog.cc:71 export_video_dialog.cc:99
 msgid "Debug Mode: Print ffmpeg command and output to stdout."
-msgstr ""
+msgstr "Modo depuración: Imprime los comandos y salidas de ffmpeg a stdout."
 
 #: transcode_video_dialog.cc:107
 msgid "<b>File Information</b>"
@@ -12901,12 +15066,11 @@ msgstr "<b>Información de archivo</b>"
 
 #: transcode_video_dialog.cc:113
 msgid ""
-"No ffprobe or ffmpeg executables could be found on this system. Video Import "
-"is not possible until you install those tools. See the Log window for more "
-"information."
+"ffmpeg installation was not found. Video Import is not possible. See the Log "
+"window for more information."
 msgstr ""
-"No se han encontrado ejecutables de ffprobe o ffmpeg. No es posible importar "
-"video sin instalarlos. Ver la ventana de log para más información"
+"ffmpeg no encontrado. Imposible importar video. Ver la ventana de mensajes "
+"para más información."
 
 #: transcode_video_dialog.cc:120
 msgid ""
@@ -12914,83 +15078,83 @@ msgid ""
 "unsupported video codec or format."
 msgstr ""
 
-#: transcode_video_dialog.cc:134
+#: transcode_video_dialog.cc:137
 msgid "FPS:"
 msgstr "FPS:"
 
-#: transcode_video_dialog.cc:136
-msgid "Duration:"
-msgstr "Duración"
-
-#: transcode_video_dialog.cc:138
+#: transcode_video_dialog.cc:141
 msgid "Codec:"
 msgstr "Codec:"
 
-#: transcode_video_dialog.cc:140
+#: transcode_video_dialog.cc:143
 msgid "Geometry:"
 msgstr "Geometría:"
 
-#: transcode_video_dialog.cc:155
+#: transcode_video_dialog.cc:158
 msgid "??"
 msgstr "??"
 
-#: transcode_video_dialog.cc:176
+#: transcode_video_dialog.cc:179
 msgid "<b>Import Settings</b>"
 msgstr "<b>Importar configuración</b>"
 
-#: transcode_video_dialog.cc:181
-msgid "Reference From Current Location (Previously Transcoded Files Only)"
+#: transcode_video_dialog.cc:184
+msgid "Reference from Current Location (Previously Transcoded Files Only)"
 msgstr ""
 
-#: transcode_video_dialog.cc:183
+#: transcode_video_dialog.cc:185
 msgid "Import/Transcode Video to Session"
 msgstr ""
 
-#: transcode_video_dialog.cc:191
+#: transcode_video_dialog.cc:188 transcode_video_dialog.cc:198
 msgid "Do Not Import Video (Audio Import Only)"
 msgstr "No importar imagen de video (sólo audio)"
 
-#: transcode_video_dialog.cc:200
+#: transcode_video_dialog.cc:208
+msgid "Do Not Import Video"
+msgstr "No importar video"
+
+#: transcode_video_dialog.cc:224
 msgid "Scale Video: Width = "
 msgstr "Escalar video: Anchura = "
 
-#: transcode_video_dialog.cc:207
+#: transcode_video_dialog.cc:230
 msgid "Original Width"
 msgstr "Anchura original"
 
-#: transcode_video_dialog.cc:222
+#: transcode_video_dialog.cc:245
 msgid "Bitrate (KBit/s):"
 msgstr ""
 
-#: transcode_video_dialog.cc:227
+#: transcode_video_dialog.cc:250
 msgid "Extract Audio:"
 msgstr "Extraer audio"
 
-#: transcode_video_dialog.cc:232
+#: transcode_video_dialog.cc:255
 msgid "No Audio Track Present"
 msgstr "No presenta pista de audio"
 
-#: transcode_video_dialog.cc:235
+#: transcode_video_dialog.cc:258
 msgid "Do Not Extract Audio"
 msgstr "No extraer audio"
 
-#: transcode_video_dialog.cc:350
+#: transcode_video_dialog.cc:374
 msgid "Extracting Audio.."
 msgstr "Extrayendo audio..."
 
-#: transcode_video_dialog.cc:353
+#: transcode_video_dialog.cc:377
 msgid "Audio Extraction Failed."
 msgstr "Falló la extracción de audio."
 
-#: transcode_video_dialog.cc:379
+#: transcode_video_dialog.cc:403
 msgid "Transcoding Video.."
 msgstr "Transcoding Video.."
 
-#: transcode_video_dialog.cc:413
+#: transcode_video_dialog.cc:437
 msgid "Transcoding Failed."
 msgstr "Transcoding Failed."
 
-#: transcode_video_dialog.cc:503
+#: transcode_video_dialog.cc:541
 msgid "Save Transcoded Video File"
 msgstr ""
 
@@ -13011,7 +15175,7 @@ msgid "Don't show this dialog again. (Reset in Edit->Preferences)."
 msgstr ""
 "No vuelvas a mostrar este diálogo (resetear en Edición -> Preferencias)"
 
-#: video_server_dialog.cc:97
+#: video_server_dialog.cc:94
 msgid ""
 "The external video server 'harvid' can not be found.\n"
 "The tool is included with the %1 releases from ardour.org, alternatively you "
@@ -13021,239 +15185,232 @@ msgid ""
 "see also http://manual.ardour.org/video-timeline/setup/"
 msgstr ""
 
-#: video_server_dialog.cc:129
+#: video_server_dialog.cc:126
 msgid "Listen Address:"
 msgstr ""
 
-#: video_server_dialog.cc:134
+#: video_server_dialog.cc:131
 msgid "Listen Port:"
 msgstr ""
 
-#: video_server_dialog.cc:139
+#: video_server_dialog.cc:136
 msgid "Cache Size:"
 msgstr ""
 
-#: video_server_dialog.cc:145
+#: video_server_dialog.cc:142
 msgid ""
 "%1 relies on an external video server for the videotimeline.\n"
 "The server configured in Edit -> Preferences -> Video is not reachable.\n"
 "Do you want %1 to launch 'harvid' on this machine?"
 msgstr ""
 
-#: video_server_dialog.cc:189
+#: video_server_dialog.cc:186
 msgid "Set Video Server Executable"
 msgstr ""
 
-#: video_server_dialog.cc:209
+#: video_server_dialog.cc:206
 msgid "Server docroot"
 msgstr ""
 
-#: utils_videotl.cc:60
+#: utils_videotl.cc:63
 msgid "Destination is outside Video Server's docroot. "
 msgstr ""
 
-#: utils_videotl.cc:61
+#: utils_videotl.cc:64
 msgid ""
 "The destination file path is outside of the Video Server's docroot. The file "
 "will not be readable by the Video Server. Do you still want to continue?"
 msgstr ""
 
-#: utils_videotl.cc:64
+#: utils_videotl.cc:67
 msgid "Continue"
 msgstr ""
 
-#: utils_videotl.cc:70
+#: utils_videotl.cc:74
 msgid "Confirm Overwrite"
 msgstr ""
 
-#: utils_videotl.cc:71
-msgid "A file with the same name already exists.  Do you want to overwrite it?"
-msgstr "Existe un archivo con el mismo nombre. ¿Quieres sobreescribirlo?"
-
-#: utils_videotl.cc:81 utils_videotl.cc:97
+#: utils_videotl.cc:84 utils_videotl.cc:100
 msgid "Cannot create video folder \"%1\" (%2)"
 msgstr ""
 
-#: export_video_dialog.cc:71
+#: export_video_dialog.cc:67
 msgid "Export Video File "
 msgstr "Exportar archivo de video"
 
-#: export_video_dialog.cc:82
+#: export_video_dialog.cc:78
 msgid "Video:"
 msgstr "Video:"
 
-#: export_video_dialog.cc:87
+#: export_video_dialog.cc:83
 msgid "Scale Video (W x H):"
 msgstr "Escalar video (Ancho x Alto)"
 
-#: export_video_dialog.cc:88
+#: export_video_dialog.cc:84
 msgid "Retain Aspect"
 msgstr "Retener aspecto"
 
-#: export_video_dialog.cc:93
+#: export_video_dialog.cc:89
 msgid "Set Aspect Ratio:"
 msgstr "Establecer relación de aspecto:"
 
-#: export_video_dialog.cc:94
+#: export_video_dialog.cc:90
 msgid "Normalize Audio"
 msgstr "Normalizar audio"
 
-#: export_video_dialog.cc:95
+#: export_video_dialog.cc:91
 msgid "2 Pass Encoding"
 msgstr "Encoding de 2 pasadas"
 
-#: export_video_dialog.cc:96
+#: export_video_dialog.cc:92
 msgid "Codec Optimizations:"
 msgstr "Optimización de códecs:"
 
-#: export_video_dialog.cc:98
+#: export_video_dialog.cc:94
 msgid "Deinterlace"
 msgstr ""
 
-#: export_video_dialog.cc:99
+#: export_video_dialog.cc:95
 msgid "Use [2] B-frames (MPEG 2 or 4 only)"
 msgstr ""
 
-#: export_video_dialog.cc:100
+#: export_video_dialog.cc:96
 msgid "Override FPS (Default is to retain FPS from the input video file):"
 msgstr ""
 
-#: export_video_dialog.cc:101
+#: export_video_dialog.cc:97
 msgid "Include Session Metadata"
 msgstr "Incluir metadatos de sesión"
 
-#: export_video_dialog.cc:119
+#: export_video_dialog.cc:115
 msgid ""
-"No ffprobe or ffmpeg executables could be found on this system. Video Export "
-"is not possible until you install those tools. See the Log window for more "
-"information."
+"ffmpeg installation was not found. Video Export is not possible. See the Log "
+"window for more information."
 msgstr ""
+"ffmpeg no encontrado. Imposible exportar video. Ver la ventana de mensajes "
+"para más información."
 
-#: export_video_dialog.cc:130
+#: export_video_dialog.cc:126
 msgid "<b>Output:</b> (file extension defines format)"
 msgstr ""
 
-#: export_video_dialog.cc:140
+#: export_video_dialog.cc:136
 msgid "<b>Input Video:</b>"
 msgstr "<b>Entrada de video:</b>"
 
-#: export_video_dialog.cc:151
+#: export_video_dialog.cc:147
 msgid "Audio:"
 msgstr "Audio:"
 
-#: export_video_dialog.cc:153
+#: export_video_dialog.cc:149
 msgid "Master Bus"
 msgstr "Bus master"
 
-#: export_video_dialog.cc:158
+#: export_video_dialog.cc:153
 msgid "from the %1 session's start to the session's end"
 msgstr ""
 
-#: export_video_dialog.cc:161
+#: export_video_dialog.cc:156
 msgid "<b>Settings:</b>"
 msgstr "<b>Configuraciones:</b>"
 
-#: export_video_dialog.cc:169
+#: export_video_dialog.cc:164
 msgid "Range:"
 msgstr "Rango:"
 
-#: export_video_dialog.cc:172
-msgid "Preset:"
-msgstr "Preset:"
-
-#: export_video_dialog.cc:175
+#: export_video_dialog.cc:170
 msgid "Video Codec:"
 msgstr "Códec de video:"
 
-#: export_video_dialog.cc:178
+#: export_video_dialog.cc:173
 msgid "Video KBit/s:"
 msgstr "Video KBit/s:"
 
-#: export_video_dialog.cc:181
+#: export_video_dialog.cc:176
 msgid "Audio Codec:"
 msgstr "Códec de audio:"
 
-#: export_video_dialog.cc:184
+#: export_video_dialog.cc:179
 msgid "Audio KBit/s:"
 msgstr "Audio KBit/s:"
 
-#: export_video_dialog.cc:187
+#: export_video_dialog.cc:182
 msgid "Audio Samplerate:"
 msgstr ""
 
-#: export_video_dialog.cc:222 export_video_dialog.cc:231
-#: export_video_dialog.cc:830 export_video_dialog.cc:833
+#: export_video_dialog.cc:215 export_video_dialog.cc:223
+#: export_video_dialog.cc:814 export_video_dialog.cc:817
 msgid "(default for format)"
 msgstr ""
 
-#: export_video_dialog.cc:242 export_video_dialog.cc:255
-#: export_video_dialog.cc:837 export_video_dialog.cc:846
+#: export_video_dialog.cc:233 export_video_dialog.cc:244
+#: export_video_dialog.cc:821 export_video_dialog.cc:830
 msgid "(default)"
 msgstr "Predeterminado"
 
-#: export_video_dialog.cc:256 export_video_dialog.cc:840
+#: export_video_dialog.cc:245 export_video_dialog.cc:824
 msgid "(retain)"
 msgstr ""
 
-#: export_video_dialog.cc:348
+#: export_video_dialog.cc:335
 msgid "from 00:00:00:00 to the video's end"
 msgstr ""
 
-#: export_video_dialog.cc:350
+#: export_video_dialog.cc:337
 msgid "from the video's start to the video's end"
 msgstr "desde el inicio hasta el final del video"
 
-#: export_video_dialog.cc:353
+#: export_video_dialog.cc:340
 msgid "Selected range"
 msgstr "Rango seleccionado"
 
-#: export_video_dialog.cc:589
+#: export_video_dialog.cc:561
 msgid "Normalizing audio"
 msgstr "Normalizando audio"
 
-#: export_video_dialog.cc:593
+#: export_video_dialog.cc:566 export_video_dialog.cc:571
 msgid "Exporting audio"
 msgstr "Exportando audio"
 
-#: export_video_dialog.cc:648
+#: export_video_dialog.cc:632
 msgid "Exporting Audio..."
 msgstr "Exportando audio..."
 
-#: export_video_dialog.cc:705
+#: export_video_dialog.cc:689
 msgid ""
 "Export Video: Cannot query duration of video-file, using duration from "
 "timeline instead."
 msgstr ""
 
-#: export_video_dialog.cc:735
+#: export_video_dialog.cc:719
 msgid "Export Video: export-range does not include video."
 msgstr ""
 
-#: export_video_dialog.cc:748
+#: export_video_dialog.cc:732
 msgid "Export Video: No Master Out Ports to Connect for Audio Export"
 msgstr ""
 
-#: export_video_dialog.cc:790
+#: export_video_dialog.cc:774
 msgid "Encoding Video..."
 msgstr "Encoding video..."
 
-#: export_video_dialog.cc:810
+#: export_video_dialog.cc:794
 msgid "Export Video: Video input file cannot be read."
 msgstr ""
 
-#: export_video_dialog.cc:916
+#: export_video_dialog.cc:900
 msgid "Encoding Video.. Pass 1/2"
 msgstr ""
 
-#: export_video_dialog.cc:928
+#: export_video_dialog.cc:912
 msgid "Encoding Video.. Pass 2/2"
 msgstr ""
 
-#: export_video_dialog.cc:1031
+#: export_video_dialog.cc:1015
 msgid "Transcoding failed."
 msgstr ""
 
-#: export_video_dialog.cc:1267 export_video_dialog.cc:1287
+#: export_video_dialog.cc:1251 export_video_dialog.cc:1271
 msgid "Save Exported Video File"
 msgstr "Guardar archivo de video exportado"
 
@@ -13273,190 +15430,20 @@ msgstr ""
 
 #: export_video_infobox.cc:51
 msgid ""
+"%1 does not include commercial licenses for encoding audio/video. Visit "
+"mpegla.com for information about licensing various audio/video codecs.\n"
+"\n"
 "Video encoding is a non-trivial task with many details.\n"
 "\n"
-"Please see the manual at %1/video-timeline/operations/#export.\n"
+"Please see the manual at %2/video-timeline/operations/#export.\n"
 "\n"
 "Open Manual in Browser? "
 msgstr ""
 
-#~ msgid "Editor Selection"
-#~ msgstr "Selección Editor"
-
-#~ msgid "Mixer Selection"
-#~ msgstr "Selección Mezclador"
-
-#~ msgid "Insert at:"
-#~ msgstr "Insertar en:"
-
-#~ msgid "Errors"
-#~ msgstr "Errores"
-
 #~ msgid ""
-#~ "Could not connect to the Video Server. Start it or configure its access "
-#~ "URL in Edit -> Preferences."
+#~ "%1%2\n"
+#~ "(built from revision %3)"
 #~ msgstr ""
-#~ "No se ha podido conectar al servidor de video. Arráncalo o configura su "
-#~ "URL de acceso en el menú: Editar -> Preferencias"
-
-#~ msgid "Select Note Press"
-#~ msgstr "Seleccionar presión"
-
-#~ msgid "rubberband selection"
-#~ msgstr "selección elástica"
-
-#~ msgid "Set Selected Track"
-#~ msgstr "Poner la pista seleccionada"
-
-#~ msgid "set selected regions"
-#~ msgstr "establecer regiones seleccionadas"
-
-#~ msgid "select all"
-#~ msgstr "seleccionar todo"
-
-#~ msgid "select all within"
-#~ msgstr "seleccionar todo dentro"
-
-#~ msgid "set selection from range"
-#~ msgstr "nueva selección desde rango"
-
-#~ msgid "select all from range"
-#~ msgstr "seleccionar todo desde rango"
-
-#~ msgid "select all from punch"
-#~ msgstr "seleccionar todo desde pinchazo"
-
-#~ msgid "select all from loop"
-#~ msgstr "seleccionar todo desde bucle"
-
-#~ msgid "select all after cursor"
-#~ msgstr "seleccionar todo desde el cursor"
-
-#~ msgid "select all before cursor"
-#~ msgstr "seleccionar todo hasta el cursor"
-
-#~ msgid "select all after edit"
-#~ msgstr "seleccionar todo desde el punto de edición"
-
-#~ msgid "select all before edit"
-#~ msgstr "seleccionar todo hasta el punto de edición"
-
-#~ msgid "Select Range Between"
-#~ msgstr "Seleccionar rango entre"
-
-#~ msgid "MIDI System"
-#~ msgstr "Sistema MIDI"
-
-#~ msgid "%u samples"
-#~ msgstr "%u muestras"
-
-#~ msgid "Mouse Selection Change"
-#~ msgstr "Cambio de selección de ratón"
-
-#~ msgid "Select Adjacent Note"
-#~ msgstr "Seleccionar nota adyacente"
-
-#~ msgid "Set Note Selection"
-#~ msgstr "Establecer selección de nota"
-
-#~ msgid "Add Note Selection"
-#~ msgstr "Añadir selección de nota"
-
-#~ msgid "Extend Note Selection"
-#~ msgstr "Extender selección de nota"
-
-#~ msgid "Toggle Note Selection"
-#~ msgstr "Conmutar selección de nota"
-
-#~ msgid "This is a BETA RELEASE"
-#~ msgstr "Esta es una edición BETA"
-
-#~ msgid "Track mode:"
-#~ msgstr "Modo de pista:"
-
-#~ msgid "Theme Manager"
-#~ msgstr "Gestor de temas"
-
-#~ msgid "Play Selected Range"
-#~ msgstr "Reproducir rango seleccionado"
-
-#~ msgid "Convert to Region In-Place"
-#~ msgstr "Convertir a región in situ"
-
-#~ msgid "Set Loop from Range"
-#~ msgstr "Crear bucle en rango"
-
-#~ msgid "Set Punch from Range"
-#~ msgstr "Crear pinchazo en rango"
-
-#~ msgid "Draw/Edit MIDI Notes"
-#~ msgstr "Dibujar/Editar notas MIDI"
-
-#~ msgid "Draw Region Gain"
-#~ msgstr "Dibujar ganancia de región"
-
-#~ msgid "Stretch/Shrink Regions and MIDI Notes"
-#~ msgstr "Estirar/Encoger regiones y notas MIDI"
-
-#~ msgid "Listen to Specific Regions"
-#~ msgstr "Escuchar regiones específicas"
-
-#~ msgid "Note Level Editing"
-#~ msgstr "Edición de notas"
-
-#~ msgid "Fit Selected tracks"
-#~ msgstr "Poner las pistas seleccionadas"
-
-#~ msgid "Zoom to Region"
-#~ msgstr "Zoom a región"
-
-#~ msgid "Zoom to Region (Width and Height)"
-#~ msgstr "Zoom a región (ancho y alto)"
-
-#~ msgid "Set Loop from Edit Range"
-#~ msgstr "Definir bucle según rango de edición"
-
-#~ msgid "Set Punch from Edit Range"
-#~ msgstr "Definir pinchazo según rango de edición"
-
-#~ msgid "Move Earlier to Transient"
-#~ msgstr "Mover adelante a transitorio"
-
-#~ msgid "Gain Tool"
-#~ msgstr "Herramienta de Ganancia"
-
-#~ msgid "Zoom Tool"
-#~ msgstr "Herramienta de Zoom"
-
-#~ msgid "Edit MIDI"
-#~ msgstr "Editar MIDI"
-
-#~ msgid "Show Measures"
-#~ msgstr "Mostrar compases"
-
-#~ msgid "Split"
-#~ msgstr "Separar"
-
-#~ msgid " range"
-#~ msgstr "rango"
-
-#~ msgid "set loop range from edit range"
-#~ msgstr "crear rango de bucle desde rango de edición"
-
-#~ msgid "set punch range from edit range"
-#~ msgstr "crear rango de pinchazo desde rango de edición"
-
-#~ msgid "External timecode is sync locked"
-#~ msgstr "Timecode externo bloqueado en sincronía"
-
-#~ msgid "missing RGBA style for \"%1\""
-#~ msgstr "No se encuentra el estilo RGBA para \"%1\"."
-
-#~ msgid "<b>Output:</b>"
-#~ msgstr "<b>Salida:</b>"
-
-#~ msgid "badly formatted UI definition file: %1"
-#~ msgstr "archivo de definición de interfaz de usuario mal formateado: %1"
+#~ "%1%2\n"
+#~ "(compilado a partir de revisión %3)"
 
-#~ msgid "%1 will not work without a valid ardour.menus file"
-#~ msgstr "%1 no funcionará sin un archivo ardour.menus válido"
diff --git a/gtk2_ardour/po/fr.mo b/gtk2_ardour/po/fr.mo
new file mode 100644
index 0000000..5594576
Binary files /dev/null and b/gtk2_ardour/po/fr.mo differ
diff --git a/gtk2_ardour/po/fr.po b/gtk2_ardour/po/fr.po
index 9e4dc7a..611adff 100644
--- a/gtk2_ardour/po/fr.po
+++ b/gtk2_ardour/po/fr.po
@@ -8,274 +8,308 @@
 # Romain Arnaud <roming22 at gmail.com>, 2011, 2013.
 # Fred Rech <f.rech at yahoo.fr>, 2014.
 # Raphaël Doursenaud <rdoursenaud at free.fr>, 2015.
+# Edouard <edwsaintesprit at hotmail.com>, 2016.
+# Rivaud Julien <frnchfrgg at free.fr>, 2016.
 msgid ""
 msgstr ""
-"Project-Id-Version: Ardour 3\n"
+"Project-Id-Version: Ardour 5\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-03-31 20:13-0400\n"
-"PO-Revision-Date: 2015-03-28 20:56+0100\n"
-"Last-Translator: Raphaël Doursenaud <rdoursenaud at free.fr>\n"
+"POT-Creation-Date: 2016-07-29 20:52+0200\n"
+"PO-Revision-Date: 2016-07-14 02:04+0200\n"
+"Last-Translator: Rivaud Julien <frnchfrgg at free.fr>, 2016\n"
 "Language-Team: \n"
 "Language: fr\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n > 1);\n"
-"X-Generator: Poedit 1.7.4\n"
+"X-Generator: Poedit 1.8.8\n"
 "X-Poedit-SourceCharset: UTF-8\n"
-"X-Poedit-Basepath: ../\n"
+"X-Poedit-Basepath: ..\n"
 
-#: about.cc:125
+#: about.cc:127
+msgid "Fons Adriaensen"
+msgstr "Fons Adriaensen"
+
+#: about.cc:128
 msgid "Brian Ahr"
 msgstr "Brian Ahr"
 
-#: about.cc:126
+#: about.cc:129
 msgid "John Anderson"
 msgstr "John Anderson"
 
-#: about.cc:127
+#: about.cc:130
 msgid "Marcus Andersson"
 msgstr "Marcus Andersson"
 
-#: about.cc:128
+#: about.cc:131
 msgid "Nedko Arnaudov"
 msgstr "Nedko Arnaudov"
 
-#: about.cc:129
+#: about.cc:132
 msgid "Hans Baier"
 msgstr "Hans Baier"
 
-#: about.cc:130
+#: about.cc:133
 msgid "Ben Bell"
 msgstr "Ben Bell"
 
-#: about.cc:131
+#: about.cc:134
 msgid "Sakari Bergen"
 msgstr "Sakari Bergen"
 
-#: about.cc:132
+#: about.cc:135
 msgid "Christian Borss"
 msgstr "Christian Borss"
 
-#: about.cc:133
+#: about.cc:136
 msgid "Chris Cannam"
 msgstr "Chris Cannam"
 
-#: about.cc:134
+#: about.cc:137
 msgid "Jeremy Carter"
-msgstr ""
+msgstr "Jeremy Carter"
 
-#: about.cc:135
+#: about.cc:138
 msgid "Jesse Chappell"
 msgstr "Jesse Chappell"
 
-#: about.cc:136
+#: about.cc:139
 msgid "Thomas Charbonnel"
 msgstr "Thomas Charbonnel"
 
-#: about.cc:137
+#: about.cc:140
 msgid "Sam Chessman"
 msgstr "Sam Chessman"
 
-#: about.cc:138
+#: about.cc:141
 msgid "André Colomb"
 msgstr "André Colomb"
 
-#: about.cc:139
+#: about.cc:142
 msgid "Paul Davis"
 msgstr "Paul Davis"
 
-#: about.cc:140
+#: about.cc:143
 msgid "Gerard van Dongen"
 msgstr "Gerard van Dongen"
 
-#: about.cc:141
+#: about.cc:144
 msgid "John Emmas"
-msgstr ""
+msgstr "John Emmas"
 
-#: about.cc:142
+#: about.cc:145
 msgid "Colin Fletcher"
 msgstr "Colin Fletcher"
 
-#: about.cc:143
+#: about.cc:146
 msgid "Dave Flick"
 msgstr "Dave Flick"
 
-#: about.cc:144
+#: about.cc:147
 msgid "Hans Fugal"
 msgstr "Hans Fugal"
 
-#: about.cc:145
+#: about.cc:148
 msgid "Robin Gareus"
 msgstr "Robin Gareus"
 
-#: about.cc:146
+#: about.cc:149
+msgid "Nil Geisweiller"
+msgstr "Nil Geisweiller"
+
+#: about.cc:150
 msgid "Christopher George"
 msgstr "Christopher George"
 
-#: about.cc:147
+#: about.cc:151
 msgid "Chris Goddard"
 msgstr "Chris Goddard"
 
-#: about.cc:148
+#: about.cc:152
 msgid "J. Abelardo Gutierrez"
 msgstr "J. Abelardo Gutierrez"
 
-#: about.cc:149
+#: about.cc:153
 msgid "Jeremy Hall"
 msgstr "Jeremy Hall"
 
-#: about.cc:150
+#: about.cc:154
 msgid "Audun Halland"
 msgstr "Audun Halland"
 
-#: about.cc:151
+#: about.cc:155
 msgid "David Halter"
 msgstr "David Halter"
 
-#: about.cc:152
+#: about.cc:156
 msgid "Steve Harris"
 msgstr "Steve Harris"
 
-#: about.cc:153
+#: about.cc:157
 msgid "Melvin Ray Herr"
 msgstr "Melvin Ray Herr"
 
-#: about.cc:154
+#: about.cc:158
 msgid "Carl Hetherington"
 msgstr "Carl Hetherington"
 
-#: about.cc:155
+#: about.cc:159
 msgid "Rob Holland"
 msgstr "Rob Holland"
 
-#: about.cc:156
+#: about.cc:160
 msgid "Robert Jordens"
 msgstr "Robert Jordens"
 
-#: about.cc:157
+#: about.cc:161
 msgid "Stefan Kersten"
 msgstr "Stefan Kersten"
 
-#: about.cc:158
+#: about.cc:162
 msgid "Armand Klenk"
 msgstr "Armand Klenk"
 
-#: about.cc:159
+#: about.cc:163
 msgid "Julien de Kozak"
 msgstr "Julien de Kozak"
 
-#: about.cc:160
+#: about.cc:164
 msgid "Matt Krai"
 msgstr "Matt Krai"
 
-#: about.cc:161
+#: about.cc:165
 msgid "Georg Krause"
-msgstr ""
+msgstr "Georg Krause"
 
-#: about.cc:162
+#: about.cc:166
 msgid "Nick Lanham"
 msgstr "Nick Lanham"
 
-#: about.cc:163
+#: about.cc:167
 msgid "Colin Law"
 msgstr "Colin Law"
 
-#: about.cc:164
+#: about.cc:168
 msgid "Joshua Leach"
 msgstr "Joshua Leach"
 
-#: about.cc:165
+#: about.cc:169
 msgid "Ben Loftis"
 msgstr "Ben Loftis"
 
-#: about.cc:166
+#: about.cc:170
 msgid "Nick Mainsbridge"
 msgstr "Nick Mainsbridge"
 
-#: about.cc:167
+#: about.cc:171
 msgid "Tim Mayberry"
 msgstr "Tim Mayberry"
 
-#: about.cc:168
+#: about.cc:172
 msgid "Doug Mclain"
 msgstr "Doug Mclain"
 
-#: about.cc:169
+#: about.cc:173
 msgid "Todd Naugle"
-msgstr ""
+msgstr "Todd Naugle"
 
-#: about.cc:170
+#: about.cc:174
+msgid "André Nusser"
+msgstr "André Nusser"
+
+#: about.cc:175
+msgid "Bent Bisballe Nyeng"
+msgstr "Bent Bisballe Nyeng"
+
+#: about.cc:176
 msgid "Jack O'Quin"
 msgstr "Jack O'Quin"
 
-#: about.cc:171
+#: about.cc:177
+msgid "Pavel Potocek"
+msgstr "Pavel Potocek"
+
+#: about.cc:178
 msgid "Nimal Ratnayake"
 msgstr "Nimal Ratnayake"
 
-#: about.cc:172
+#: about.cc:179
+msgid "Julien Rivaud"
+msgstr "Julien Rivaud"
+
+#: about.cc:180
 msgid "David Robillard"
 msgstr "David Robillard"
 
-#: about.cc:173
+#: about.cc:181
+msgid "Julien Roger"
+msgstr "Julien Roger"
+
+#: about.cc:182
 msgid "Taybin Rutkin"
 msgstr "Taybin Rutkin"
 
-#: about.cc:174
+#: about.cc:183
 msgid "Andreas Ruge"
 msgstr "Andreas Ruge"
 
-#: about.cc:175
+#: about.cc:184
 msgid "Sampo Savolainen"
 msgstr "Sampo Savolainen"
 
-#: about.cc:176
+#: about.cc:185
 msgid "Rodrigo Severo"
 msgstr "Rodrigo Severo"
 
-#: about.cc:177
+#: about.cc:186
 msgid "Per Sigmond"
 msgstr "Per Sigmond"
 
-#: about.cc:178
+#: about.cc:187
 msgid "Lincoln Spiteri"
 msgstr "Lincoln Spiteri"
 
-#: about.cc:179
+#: about.cc:188
 msgid "Mike Start"
 msgstr "Mike Start"
 
-#: about.cc:180
+#: about.cc:189
 msgid "Mark Stewart"
 msgstr "Mark Stewart"
 
-#: about.cc:181
+#: about.cc:190
 msgid "Roland Stigge"
 msgstr "Roland Stigge"
 
-#: about.cc:182
+#: about.cc:191
 msgid "Petter Sundlöf"
 msgstr "Petter Sundlöf"
 
-#: about.cc:183
+#: about.cc:192
 msgid "Mike Täht"
 msgstr "Mike Täht"
 
-#: about.cc:184
+#: about.cc:193
 msgid "Roy Vegard"
 msgstr "Roy Vegard"
 
-#: about.cc:185
+#: about.cc:194
 msgid "Thorsten Wilms"
 msgstr "Thorsten Wilms"
 
-#: about.cc:186
+#: about.cc:195
+msgid "Damien Zammit"
+msgstr "Damien Zammit"
+
+#: about.cc:196
 msgid "Grygorii Zharun"
-msgstr ""
+msgstr "Grygorii Zharun"
 
 # I thought it's the right way to add my name to the translators list ?
 # Oh, by the way, have contacted Romain, the last translator, and he says "no problem you can edit the po files, have done my best, it's your turn now!"
-#: about.cc:191
+#: about.cc:201
 msgid ""
 "French:\n"
 "\tAlain Fréhel <alain.frehel at free.fr>\n"
@@ -290,7 +324,7 @@ msgstr ""
 "\tRomain Arnaud <roming22 at gmail.com>\n"
 "\tRaphaël Doursenaud <rdoursenaud at free.fr>\n"
 
-#: about.cc:192
+#: about.cc:202
 msgid ""
 "German:\n"
 "\tKarsten Petersen <kapet at kapet.de>\n"
@@ -310,7 +344,7 @@ msgstr ""
 "\tRichard Oax <richard at pagliacciempire.de>\n"
 "\tRobin Gloster <robin at loc-com.de>\n"
 
-#: about.cc:199
+#: about.cc:209
 msgid ""
 "Italian:\n"
 "\tFilippo Pappalardo <filippo at email.it>\n"
@@ -320,7 +354,7 @@ msgstr ""
 "\tFilippo Pappalardo <filippo at email.it>\n"
 "\tRaffaele Morelli <raffaele.morelli at gmail.com>\n"
 
-#: about.cc:200
+#: about.cc:210
 msgid ""
 "Portuguese:\n"
 "\tRui Nuno Capela <rncbc at rncbc.org>\n"
@@ -328,7 +362,7 @@ msgstr ""
 "Portugais :\n"
 "\tRui Nuno Capela <rncbc at rncbc.org>\n"
 
-#: about.cc:201
+#: about.cc:211
 msgid ""
 "Brazilian Portuguese:\n"
 "\tAlexander da Franca Fernandes <alexander at nautae.eti.br>\n"
@@ -338,7 +372,7 @@ msgstr ""
 "\tAlexander da Franca Fernandes <alexander at nautae.eti.br>\n"
 "\tChris Ross <chris at tebibyte.org>\n"
 
-#: about.cc:203
+#: about.cc:213
 msgid ""
 "Spanish:\n"
 "\t Alex Krohn <alexkrohn at fastmail.fm>\n"
@@ -348,7 +382,7 @@ msgstr ""
 "\tAlex Krohn <alexkrohn at fastmail.fm>\n"
 "\tPablo Fernández <pablo.fbus at gmail.com>\n"
 
-#: about.cc:204
+#: about.cc:214
 msgid ""
 "Russian:\n"
 "\t Igor Blinov <pitstop at nm.ru>\n"
@@ -358,7 +392,7 @@ msgstr ""
 "\tIgor Blinov <pitstop at nm.ru>\n"
 "\tAlexandre Prokoudine <alexandre.prokoudine at gmail.com>\n"
 
-#: about.cc:206
+#: about.cc:216
 msgid ""
 "Greek:\n"
 "\t Klearchos Gourgourinis <muadib at in.gr>\n"
@@ -366,7 +400,7 @@ msgstr ""
 "Grec :\n"
 "\tKlearchos Gourgourinis <muadib at in.gr>\n"
 
-#: about.cc:207
+#: about.cc:217
 msgid ""
 "Swedish:\n"
 "\t Petter Sundlöf <petter.sundlof at gmail.com>\n"
@@ -374,7 +408,7 @@ msgstr ""
 "Suédois :\n"
 "\tPetter Sundlöf <petter.sundlof at gmail.com>\n"
 
-#: about.cc:208
+#: about.cc:218
 msgid ""
 "Polish:\n"
 "\t Piotr Zaryk <pzaryk at gmail.com>\n"
@@ -382,7 +416,7 @@ msgstr ""
 "Polonais :\n"
 "\tPiotr Zaryk <pzaryk at gmail.com>\n"
 
-#: about.cc:209
+#: about.cc:219
 msgid ""
 "Czech:\n"
 "\t Pavel Fric <pavelfric at seznam.cz>\n"
@@ -390,7 +424,7 @@ msgstr ""
 "Tchèque :\n"
 "\tPavel Fric <pavelfric at seznam.cz>\n"
 
-#: about.cc:210
+#: about.cc:220
 msgid ""
 "Norwegian:\n"
 "\t Eivind Ødegård\n"
@@ -398,7 +432,7 @@ msgstr ""
 "Norvégien :\n"
 "\tEivind Ødegård\n"
 
-#: about.cc:211
+#: about.cc:221
 msgid ""
 "Chinese:\n"
 "\t Rui-huai Zhang <zrhzrh at mail.ustc.edu.cn>\n"
@@ -406,146 +440,201 @@ msgstr ""
 "Chinois :\n"
 "\tRui-huai Zhang <zrhzrh at mail.ustc.edu.cn>\n"
 
-#: about.cc:591
-#, fuzzy
+#: about.cc:601
+msgid "Intel 64-bit"
+msgstr "Intel 64 bits"
+
+#: about.cc:603
+msgid "Intel 32-bit"
+msgstr "Intel 32 bits"
+
+#: about.cc:605
+msgid "PowerPC 64-bit"
+msgstr "Power PC 64 bits"
+
+#: about.cc:607
+msgid "PowerPC 32-bit"
+msgstr "Power PC 32 bits"
+
+#: about.cc:609
+msgid "64-bit"
+msgstr "64 bits"
+
+#: about.cc:611
+msgid "32-bit"
+msgstr "32 bits"
+
+#: about.cc:619
+msgid " - debug"
+msgstr " - debug"
+
+#: about.cc:625
 msgid "Copyright (C) 1999-2015 Paul Davis\n"
-msgstr "Copyright © 1999-2013 Paul Davis\n"
+msgstr "Copyright © 1999-2015 Paul Davis\n"
 
-#: about.cc:595
+#: about.cc:629
 msgid "http://ardour.org/"
-msgstr "http://ardour.org"
+msgstr "http://ardour.org/"
 
-#: about.cc:596
-#, fuzzy
+#: about.cc:630
 msgid ""
 "%1%2\n"
-"(built from revision %3)"
+"(rev %3)\n"
+"%4%5"
 msgstr ""
-"%1\n"
-"(compilé de la révision %2)"
+"%1%2\n"
+"(rev %3)\n"
+"%4%5"
 
-#: about.cc:600
+#: about.cc:635
 msgid "Config"
 msgstr "Configuration"
 
-#: actions.cc:85
+#: actions.cc:83
 msgid "Loading menus from %1"
 msgstr "Chargement des menus depuis %1"
 
-#: actions.cc:88 actions.cc:89
+#: actions.cc:86 actions.cc:87
 msgid "badly formatted menu definition file: %1"
 msgstr "fichier de définition de menu mal formé : %1"
 
-#: actions.cc:91
+#: actions.cc:89
 msgid "%1 menu definition file not found"
 msgstr "fichier de définition de menu introuvable : %1"
 
-#: actions.cc:95 actions.cc:96
+#: actions.cc:93 actions.cc:94
 msgid "%1 will not work without a valid menu definition file"
 msgstr "%1 ne fonctionnera pas sans un fichier de définition de menu valide"
 
-#: add_route_dialog.cc:54 route_params_ui.cc:524
-msgid "Add Track or Bus"
-msgstr "Ajouter une piste ou un bus"
+#: add_route_dialog.cc:58
+#, fuzzy
+msgid "Add Track/Bus/VCA"
+msgstr "Ajouter un(e) Piste/Bus/VCA"
 
-#: add_route_dialog.cc:57
+#: add_route_dialog.cc:61
 msgid "Configuration:"
 msgstr "Configuration :"
 
-#: add_route_dialog.cc:58
+#: add_route_dialog.cc:62
 msgid "Record Mode:"
-msgstr "Mode d'enregistrement"
+msgstr "Mode d'enregistrement :"
 
-#: add_route_dialog.cc:59
+#: add_route_dialog.cc:63
 msgid "Instrument:"
 msgstr "Instrument :"
 
-#: add_route_dialog.cc:77
+#: add_route_dialog.cc:77 add_route_dialog.cc:228
 msgid "Audio Tracks"
 msgstr "Pistes audio"
 
-#: add_route_dialog.cc:78 add_route_dialog.cc:209
+#: add_route_dialog.cc:78 add_route_dialog.cc:224
 msgid "MIDI Tracks"
 msgstr "Pistes MIDI"
 
-#: add_route_dialog.cc:79 add_route_dialog.cc:211
+#: add_route_dialog.cc:79 add_route_dialog.cc:226
 msgid "Audio+MIDI Tracks"
 msgstr "Pistes Audio+MIDI"
 
-#: add_route_dialog.cc:80 add_route_dialog.cc:207
-msgid "Busses"
-msgstr "Bus"
+#: add_route_dialog.cc:80 add_route_dialog.cc:220
+msgid "Audio Busses"
+msgstr "Bus Audio"
 
-#: add_route_dialog.cc:83 add_route_dialog.cc:559
-#, fuzzy
-msgid "First"
-msgstr "bas de la première page"
+#: add_route_dialog.cc:81 add_route_dialog.cc:222
+msgid "MIDI Busses"
+msgstr "Bus MIDI"
 
-#: add_route_dialog.cc:84 add_route_dialog.cc:561
-msgid "After Editor Selection"
+#: add_route_dialog.cc:82
+msgid "VCA Masters"
 msgstr ""
 
-#: add_route_dialog.cc:85 add_route_dialog.cc:563
-msgid "After Mixer Selection"
-msgstr ""
+#: add_route_dialog.cc:85 add_route_dialog.cc:622
+msgid "First"
+msgstr "Au début"
+
+#: add_route_dialog.cc:86 add_route_dialog.cc:626
+msgid "Before Selection"
+msgstr "Avant la sélection"
+
+#: add_route_dialog.cc:87 add_route_dialog.cc:624
+msgid "After Selection"
+msgstr "Après la sélection"
 
-#: add_route_dialog.cc:86
+#: add_route_dialog.cc:88
 msgid "Last"
-msgstr ""
+msgstr "À la fin"
+
+#: add_route_dialog.cc:91
+msgid "Flexible-I/O"
+msgstr "E/S flexibles"
 
-#: add_route_dialog.cc:103
+#: add_route_dialog.cc:92
+msgid "Strict-I/O"
+msgstr "E/S strictes"
+
+#: add_route_dialog.cc:108
 msgid "Add:"
 msgstr "Ajouter :"
 
-#: add_route_dialog.cc:116 time_fx_dialog.cc:91 add_video_dialog.cc:135
-#: video_server_dialog.cc:121
+#: add_route_dialog.cc:121 time_fx_dialog.cc:101 add_video_dialog.cc:135
+#: video_server_dialog.cc:118
 msgid "<b>Options</b>"
 msgstr "<b>Options</b>"
 
-#: add_route_dialog.cc:126 bundle_manager.cc:193 region_editor.cc:50
-#: route_group_dialog.cc:71
+#: add_route_dialog.cc:131 bundle_manager.cc:193 region_editor.cc:52
+#: route_group_dialog.cc:70
 msgid "Name:"
 msgstr "Nom :"
 
-#: add_route_dialog.cc:156
+#: add_route_dialog.cc:155
 msgid "Group:"
 msgstr "Groupe :"
 
-#: add_route_dialog.cc:162
-#, fuzzy
+#: add_route_dialog.cc:161
 msgid "Insert:"
-msgstr "Insérer :"
-
-#: add_route_dialog.cc:223 add_route_dialog.cc:232 add_route_dialog.cc:306
-#: ardour_ui_ed.cc:539 engine_dialog.cc:237 rc_option_editor.cc:1805
-#: rc_option_editor.cc:1807 rc_option_editor.cc:1809 rc_option_editor.cc:1827
-#: rc_option_editor.cc:1829 rc_option_editor.cc:1837 rc_option_editor.cc:1839
-#: rc_option_editor.cc:1857 rc_option_editor.cc:1870 rc_option_editor.cc:1872
-#: rc_option_editor.cc:1874 rc_option_editor.cc:1919 rc_option_editor.cc:1921
-#: rc_option_editor.cc:1923 rc_option_editor.cc:1931 rc_option_editor.cc:1939
-#: rc_option_editor.cc:1941 rc_option_editor.cc:1949
+msgstr "Insérer :"
+
+#: add_route_dialog.cc:171
+msgid "Output Ports:"
+msgstr "Ports de sortie :"
+
+#: add_route_dialog.cc:176 rc_option_editor.cc:2474
+msgid ""
+"With strict-i/o enabled, Effect Processors will not modify the number of "
+"channels on a track. The number of output channels will always match the "
+"number of input channels."
+msgstr ""
+"Si le mode « E/S strictes » est actif, les processeurs d'effets ne "
+"modifieront pas le nombre de canaux des pistes. Le nombre de canaux en "
+"sortie correspondra au nombre de canaux en entrée."
+
+#: add_route_dialog.cc:240 add_route_dialog.cc:351 ardour_ui_ed.cc:636
+#: engine_dialog.cc:244 plugin_pin_dialog.cc:67 rc_option_editor.cc:2397
+#: rc_option_editor.cc:2399 rc_option_editor.cc:2401 rc_option_editor.cc:2419
+#: rc_option_editor.cc:2421 rc_option_editor.cc:2429 rc_option_editor.cc:2432
+#: rc_option_editor.cc:2450 rc_option_editor.cc:2463 rc_option_editor.cc:2472
+#: rc_option_editor.cc:2478 rc_option_editor.cc:2480 rc_option_editor.cc:2525
+#: rc_option_editor.cc:2527 rc_option_editor.cc:2529 rc_option_editor.cc:2537
 msgid "Audio"
 msgstr "Audio"
 
-#: add_route_dialog.cc:224 add_route_dialog.cc:235 add_route_dialog.cc:307
-#: editor_actions.cc:109 engine_dialog.cc:239 missing_file_dialog.cc:56
-#: rc_option_editor.cc:2084 rc_option_editor.cc:2094 rc_option_editor.cc:2102
-#: rc_option_editor.cc:2110 rc_option_editor.cc:2119 rc_option_editor.cc:2127
-#: rc_option_editor.cc:2135 rc_option_editor.cc:2143 rc_option_editor.cc:2152
-#: rc_option_editor.cc:2161 rc_option_editor.cc:2170 rc_option_editor.cc:2178
-#: rc_option_editor.cc:2186 rc_option_editor.cc:2194 rc_option_editor.cc:2217
+#: add_route_dialog.cc:243 add_route_dialog.cc:352 editor_actions.cc:112
+#: engine_dialog.cc:246 missing_file_dialog.cc:60 mixer_ui.cc:1895
+#: plugin_pin_dialog.cc:68 rc_option_editor.cc:2672 rc_option_editor.cc:2674
+#: rc_option_editor.cc:2684 rc_option_editor.cc:2693 rc_option_editor.cc:2701
+#: rc_option_editor.cc:2709 rc_option_editor.cc:2717 rc_option_editor.cc:2790
+#: rc_option_editor.cc:2813
 msgid "MIDI"
 msgstr "MIDI"
 
-#: add_route_dialog.cc:225 add_route_dialog.cc:238 add_route_dialog.cc:308
+#: add_route_dialog.cc:246 add_route_dialog.cc:353
 msgid "Audio+MIDI"
 msgstr "Audio+MIDI"
 
-#: add_route_dialog.cc:226 add_route_dialog.cc:241 add_route_dialog.cc:309
+#: add_route_dialog.cc:250 add_route_dialog.cc:354
 msgid "Bus"
 msgstr "Bus"
 
-#: add_route_dialog.cc:268
+#: add_route_dialog.cc:286
 msgid ""
 "Audio+MIDI tracks are intended for use <b>ONLY</b> with plugins that use "
 "both audio and MIDI input data\n"
@@ -559,60 +648,61 @@ msgstr ""
 "Si vous n'envisagez pas d'utiliser un tel greffon, utilisez plutôt une piste "
 "normale audio ou MIDI."
 
-#: add_route_dialog.cc:327 add_route_dialog.cc:346 editor_actions.cc:422
-#: editor_rulers.cc:251 time_axis_view.cc:1374
+#: add_route_dialog.cc:373 add_route_dialog.cc:385 editor_actions.cc:456
+#: editor_rulers.cc:250 time_axis_view.cc:1290
 msgid "Normal"
 msgstr "Normal"
 
-#: add_route_dialog.cc:330 add_route_dialog.cc:348
+#: add_route_dialog.cc:374 add_route_dialog.cc:387
 msgid "Non Layered"
 msgstr "Non empilé"
 
-#: add_route_dialog.cc:331 add_route_dialog.cc:350
+#: add_route_dialog.cc:375 add_route_dialog.cc:389
 msgid "Tape"
 msgstr "Bande"
 
-#: add_route_dialog.cc:431 monitor_section.cc:290
+#: add_route_dialog.cc:476 monitor_section.cc:273 plugin_pin_dialog.cc:509
+#: plugin_setup_dialog.cc:202
 msgid "Mono"
 msgstr "Mono"
 
-#: add_route_dialog.cc:435
+#: add_route_dialog.cc:480 plugin_pin_dialog.cc:512 plugin_setup_dialog.cc:205
 msgid "Stereo"
 msgstr "Stéréo"
 
-#: add_route_dialog.cc:459
+#: add_route_dialog.cc:503
 msgid "3 Channel"
 msgstr "3 canaux"
 
-#: add_route_dialog.cc:463
+#: add_route_dialog.cc:507
 msgid "4 Channel"
 msgstr "4 canaux"
 
-#: add_route_dialog.cc:467
+#: add_route_dialog.cc:511
 msgid "5 Channel"
 msgstr "3 canaux"
 
-#: add_route_dialog.cc:471
+#: add_route_dialog.cc:515
 msgid "6 Channel"
 msgstr "6 canaux"
 
-#: add_route_dialog.cc:475
+#: add_route_dialog.cc:519
 msgid "8 Channel"
 msgstr "8 canaux"
 
-#: add_route_dialog.cc:479
+#: add_route_dialog.cc:523
 msgid "12 Channel"
 msgstr "12 canaux"
 
-#: add_route_dialog.cc:483 mixer_strip.cc:1836 mixer_strip.cc:2244
+#: add_route_dialog.cc:527 mixer_strip.cc:2009 mixer_strip.cc:2455
 msgid "Custom"
 msgstr "Personnalisée"
 
-#: add_route_dialog.cc:516 add_route_dialog.cc:532 route_group_menu.cc:81
+#: add_route_dialog.cc:569 add_route_dialog.cc:585 route_group_menu.cc:85
 msgid "New Group..."
 msgstr "Nouveau groupe…"
 
-#: add_route_dialog.cc:520 route_group_menu.cc:85
+#: add_route_dialog.cc:573 route_group_menu.cc:89
 msgid "No Group"
 msgstr "Aucun groupe"
 
@@ -620,7 +710,7 @@ msgstr "Aucun groupe"
 msgid "Ambiguous File"
 msgstr "Fichier indeterminé"
 
-#: ambiguous_file_dialog.cc:35
+#: ambiguous_file_dialog.cc:37
 msgid ""
 "%1 has found the file <i>%2</i> in the following places:\n"
 "\n"
@@ -628,7 +718,7 @@ msgstr ""
 "%1 a trouvé le fichier <i>%2</i> aux emplacements suivants :\n"
 "\n"
 
-#: ambiguous_file_dialog.cc:44
+#: ambiguous_file_dialog.cc:46
 msgid ""
 "\n"
 "\n"
@@ -638,158 +728,240 @@ msgstr ""
 "\n"
 "Sélectionnez le chemin du fichier à ouvrir."
 
-#: ambiguous_file_dialog.cc:46 missing_file_dialog.cc:46
+#: ambiguous_file_dialog.cc:48 missing_file_dialog.cc:50
 msgid "Done"
 msgstr "Fini"
 
-#: analysis_window.cc:46
+#: analysis_window.cc:45
 msgid "Signal source"
 msgstr "Source du signal"
 
-#: analysis_window.cc:47
+#: analysis_window.cc:46
 msgid "Selected ranges"
 msgstr "Intervalles sélectionnés"
 
-#: analysis_window.cc:48
+#: analysis_window.cc:47
 msgid "Selected regions"
 msgstr "Régions sélectionnées"
 
-#: analysis_window.cc:50
-msgid "Display model"
-msgstr "Modèle d'affichage"
-
-#: analysis_window.cc:51
-msgid "Composite graphs for each track"
-msgstr "Graphs composite pour chaque piste"
-
-#: analysis_window.cc:52
-msgid "Composite graph of all tracks"
-msgstr "Graph composite de toutes les pistes"
-
-#: analysis_window.cc:54
+#: analysis_window.cc:48
 msgid "Show frequency power range"
 msgstr "Afficher la gamme d'intensité fréquentielle"
 
-#: analysis_window.cc:55
-msgid "Normalize values"
-msgstr "Normaliser"
+#: analysis_window.cc:49
+msgid "Fit dB range"
+msgstr ""
+
+#: analysis_window.cc:50
+msgid "Proportional Spectrum, -18dB"
+msgstr ""
 
-#: analysis_window.cc:59
+#: analysis_window.cc:53
 msgid "FFT analysis window"
 msgstr "Fenêtre d'analyse FFT"
 
-#: analysis_window.cc:60 editor.cc:1823
+#: analysis_window.cc:54 editor.cc:1953
 msgid "Spectral Analysis"
 msgstr "Analyse du spectre"
 
-#: analysis_window.cc:67 editor_actions.cc:142 export_channel_selector.cc:557
-#: session_metadata_dialog.cc:667
+#: analysis_window.cc:61 editor_actions.cc:145 session_metadata_dialog.cc:670
 msgid "Track"
 msgstr "Piste"
 
-#: analysis_window.cc:68 editor_actions.cc:648 mixer_ui.cc:131
-#: mixer_ui.cc:1854
+#: analysis_window.cc:62 ardour_ui_ed.cc:254 ardour_ui_ed.cc:255
+#: ardour_ui_ed.cc:256 editor_actions.cc:689 mixer_ui.cc:151 mixer_ui.cc:2134
 msgid "Show"
 msgstr "Afficher"
 
-#: analysis_window.cc:135
+#: analysis_window.cc:107
 msgid "Re-analyze data"
 msgstr "Réanalyser les données"
 
-#: ardour_button.cc:887
+#: ardour_button.cc:876
 msgid "button cannot watch state of non-existing Controllable\n"
 msgstr "Le bouton ne peut pas surveiller un élement Controllable inexistant\n"
 
-#: ardour_button.cc:1155
+#: ardour_button.cc:1144
 msgid "ABCDEFGHIJLKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
 msgstr "ABCDEFGHIJLKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
 
-#: ardour_ui.cc:164
+#: ardour_http.cc:165 ardour_http.cc:179
+msgid "HTTP request failed: (%1) %2"
+msgstr ""
+
+#: ardour_http.cc:169 ardour_http.cc:182
+msgid "HTTP request status: %1"
+msgstr ""
+
+#: ardour_ui.cc:198
 msgid ""
 "%1 %2.x has discovered configuration files from %1 %3.x.\n"
 "\n"
-"Would you like to copy the relevant files before starting to use the "
-"program?\n"
+"Would you like these files to be copied and used for %1 %2.x?\n"
 "\n"
 "(This will require you to restart %1.)"
 msgstr ""
+"%1 %2.x a détecté des fichiers de configuration appartenant à %1 %3.x\n"
+"\n"
+"Voulez-vous copier cette configuration pour l'utiliser avec %1 %2.x ?\n"
+"\n"
+"(Cette action nécessite de redémarrer %1)"
 
-#: ardour_ui.cc:211 editor_actions.cc:642 region_editor.cc:51
+#: ardour_ui.cc:283 editor_actions.cc:683 region_editor.cc:53
 msgid "Audition"
 msgstr "Écoute"
 
-#: ardour_ui.cc:212 editor_actions.cc:136 mixer_strip.cc:2016
-#: rc_option_editor.cc:1959 route_time_axis.cc:252 route_time_axis.cc:2711
+#: ardour_ui.cc:284 editor_actions.cc:139 mixer_strip.cc:2205
+#: monitor_section.cc:329 rc_option_editor.cc:2547 route_time_axis.cc:263
+#: route_time_axis.cc:2740 vca_master_strip.cc:212 vca_time_axis.cc:237
 msgid "Solo"
 msgstr "Solo"
 
-#: ardour_ui.cc:213 rc_option_editor.cc:741
+#: ardour_ui.cc:285 rc_option_editor.cc:1357
 msgid "Feedback"
 msgstr "Retour"
 
-#: ardour_ui.cc:219 speaker_dialog.cc:36
+#: ardour_ui.cc:296 speaker_dialog.cc:36
 msgid "Speaker Configuration"
 msgstr "Positionnement des haut-parleurs"
 
-#: ardour_ui.cc:220 keyeditor.cc:53
-msgid "Key Bindings"
-msgstr "Raccourcis clavier"
-
-#: ardour_ui.cc:221
-msgid "Preferences"
-msgstr "Préférences"
-
-#: ardour_ui.cc:222 ardour_ui.cc:229
+#: ardour_ui.cc:297
 msgid "Add Tracks/Busses"
 msgstr "Ajouter Pistes/Bus"
 
-#: ardour_ui.cc:223
+#: ardour_ui.cc:298
 msgid "About"
 msgstr "À propos"
 
-#: ardour_ui.cc:224 location_ui.cc:1141 session_option_editor.cc:189
-#: session_option_editor.cc:195 session_option_editor.cc:202
-msgid "Locations"
-msgstr "Repères et intervalles"
+#: ardour_ui.cc:299 location_ui.cc:1167
+msgid "Ranges|Locations"
+msgstr "Positions"
 
-#: ardour_ui.cc:225 route_params_ui.cc:59 route_params_ui.cc:630
+#: ardour_ui.cc:300 route_params_ui.cc:59 route_params_ui.cc:620
 msgid "Tracks and Busses"
 msgstr "Pistes et Bus"
 
-#: ardour_ui.cc:226 engine_dialog.cc:70
+#: ardour_ui.cc:301 engine_dialog.cc:73
 msgid "Audio/MIDI Setup"
 msgstr "Réglages Audio/MIDI"
 
-#: ardour_ui.cc:227
+#: ardour_ui.cc:302
 msgid "Video Export Dialog"
-msgstr ""
+msgstr "Fenêtre d'export vidéo"
+
+#: ardour_ui.cc:303 lua_script_manager.cc:30
+msgid "Script Manager"
+msgstr "Gestionnaire de scripts"
 
-#: ardour_ui.cc:228
+#: ardour_ui.cc:304
 msgid "Properties"
 msgstr "Propriétés"
 
-#: ardour_ui.cc:230 bundle_manager.cc:264
+#: ardour_ui.cc:305
+msgid "Add Video"
+msgstr ""
+
+#: ardour_ui.cc:306 bundle_manager.cc:264
 #, fuzzy
 msgid "Bundle Manager"
-msgstr "Gestionnaire de Groupes"
+msgstr "Gestion des Groupes"
 
-#: ardour_ui.cc:231 big_clock_window.cc:37
+#: ardour_ui.cc:307 big_clock_window.cc:37
 msgid "Big Clock"
 msgstr "Grande horloge"
 
-#: ardour_ui.cc:232
+#: ardour_ui.cc:308
 msgid "Audio Connections"
 msgstr "Connexions Audio"
 
-#: ardour_ui.cc:233
+#: ardour_ui.cc:309
 msgid "MIDI Connections"
 msgstr "Connexions MIDI"
 
-#: ardour_ui.cc:242
+#: ardour_ui.cc:310
+msgid "Bindings Editor"
+msgstr "Éditeur de raccourcis"
+
+#: ardour_ui.cc:321 editor.cc:1288
+msgid "Window|Editor"
+msgstr "Éditeur"
+
+#: ardour_ui.cc:322 mixer_ui.cc:2210 mixer_ui.cc:2216
+msgid "Window|Mixer"
+msgstr "Console de mixage"
+
+#: ardour_ui.cc:323
+msgid "Window|Preferences"
+msgstr "Préférences"
+
+#: ardour_ui.cc:330
 msgid "Your configuration files were copied. You can now restart %1."
 msgstr ""
+"Les fichiers de configuration ont été copiés. Vous pouvez maintenant "
+"redémarrer %1."
+
+#: ardour_ui.cc:509
+msgid "Pre-Release Warning"
+msgstr "Avertissement: version préliminaire"
+
+#: ardour_ui.cc:513
+msgid ""
+"<b>Welcome to this pre-release build of %1 %2</b>\n"
+"\n"
+"There are still several issues and bugs to be worked on,\n"
+"as well as general workflow improvements, before this can be considered\n"
+"release software. So, a few guidelines:\n"
+"\n"
+"1) Please do <b>NOT</b> use this software with the expectation that it is "
+"stable or reliable\n"
+"   though it may be so, depending on your workflow.\n"
+"2) Please wait for a helpful writeup of new features.\n"
+"3) <b>Please do NOT use the forums at ardour.org to report issues</b>.\n"
+"4) Please <b>DO</b> use the bugtracker at http://tracker.ardour.org/ to "
+"report issues\n"
+"   making sure to note the product version number as 5.0-pre.\n"
+"5) Please <b>DO</b> use the ardour-users mailing list to discuss ideas and "
+"pass on comments.\n"
+"6) Please <b>DO</b> join us on IRC for real time discussions about %1 %2. "
+"You\n"
+"   can get there directly from within the program via the Help->Chat menu "
+"option.\n"
+"\n"
+"Full information on all the above can be found on the support page at\n"
+"\n"
+"                http://ardour.org/support\n"
+msgstr ""
+"<b>Bienvenue dans cette pré-version du logiciel %1 %2</b>\n"
+"\n"
+"Il y a encore plusieurs problèmes et bogues à résoudre,\n"
+"ainsi que des améliorations générales du flux de travaux, avant que ce "
+"logiciel\n"
+"soit en version stable. Quelques indications:\n"
+"\n"
+"1) N'utilisez <b>PAS</b> ce programme en attendant de lui qu'il soit stable "
+"ou fiable\n"
+"   bien qu'il puisse l'être en fonction de votre flux organisationnel.\n"
+"2) Attendez patiemment que la documentation des nouvelles fonctionnalités "
+"soit écrite.\n"
+"3) <b>N'utilisez PAS les forums sur ardour.org pour rapporter les problèmes</"
+"b>.\n"
+"4) <b>Utilisez</b> s'il vous plait le système de suivi de problèmes situé à "
+"http://tracker.ardour.org/\n"
+"   pour rapporter les soucis en prenant soin de spécifier la version 5.0-"
+"pre.\n"
+"5) <b>Utilisez</b> s'il vous plait la liste de diffusion ardour-users pour "
+"discuter de vos idées\n"
+"   et faire des commentaires.\n"
+"6) <b>Rejoignez-nous</b> sur IRC pour discuter en temps-réel de %1 %2. Vous "
+"pouvez vous y\n"
+"   rendre directement depuis le menu Aide->Salon de discussion (anglais).\n"
+"\n"
+"Des informations complètes à propos de tout ce qui précèdent sont "
+"disponibles sur la page de support\n"
+"\n"
+"                http://ardour.org/support\n"
 
-#: ardour_ui.cc:481
+#: ardour_ui.cc:613
 msgid ""
 "The audio backend was shutdown because:\n"
 "\n"
@@ -799,7 +971,7 @@ msgstr ""
 "\n"
 "%1"
 
-#: ardour_ui.cc:483
+#: ardour_ui.cc:615
 msgid ""
 "The audio backend has either been shutdown or it\n"
 "disconnected %1 because %1\n"
@@ -812,46 +984,47 @@ msgstr ""
 "relancer le moteur audio et de\n"
 "sauvegarder la session."
 
-#: ardour_ui.cc:507
+#: ardour_ui.cc:639
 msgid ""
 "Audio Unit Plugin Scan Failed. Automatic AU scanning has been disabled. "
 "Please see the log window for further details."
 msgstr ""
+"La recherche de greffons Audio Unit a échoué. La recherche automatique d'AU a "
+"été désactivée. Référez vous à la fenêtre de log pour plus de détails."
 
-#: ardour_ui.cc:508
+#: ardour_ui.cc:640
 msgid "Audio Unit Plugin Scan Failed:"
-msgstr ""
+msgstr "La recherche de greffons Audio Unit a échoué :"
 
-#: ardour_ui.cc:827
+#: ardour_ui.cc:1008
 msgid "NSM server did not announce itself"
 msgstr "Le serveur NSM ne s'est pas annoncé"
 
-#: ardour_ui.cc:840
+#: ardour_ui.cc:1021
 msgid "NSM: no client ID provided"
 msgstr "NSM : pas d'ID client fourni"
 
-#: ardour_ui.cc:847
+#: ardour_ui.cc:1028
 msgid "NSM: no session created"
 msgstr "NSM : pas de session créée"
 
-#: ardour_ui.cc:870
+#: ardour_ui.cc:1051
 msgid "NSM: initialization failed"
 msgstr "NSM : échec d'initialisation"
 
-#: ardour_ui.cc:900
+#: ardour_ui.cc:1083
 msgid "Free/Demo Version Warning"
-msgstr ""
+msgstr "Avertissement: version de démonstration gratuite"
 
-#: ardour_ui.cc:902
+#: ardour_ui.cc:1085
 msgid "Subscribe and support development of %1"
-msgstr ""
+msgstr "Abonnez-vous et soutenez le développement de %1"
 
-#: ardour_ui.cc:903
-#, fuzzy
+#: ardour_ui.cc:1086
 msgid "Don't warn me about this again"
 msgstr "Ne plus me poser la question"
 
-#: ardour_ui.cc:905
+#: ardour_ui.cc:1088
 msgid ""
 "<span weight=\"bold\" size=\"large\">%1</span>\n"
 "\n"
@@ -861,40 +1034,51 @@ msgid ""
 "\n"
 "%4"
 msgstr ""
+"<span weight=\"bold\" size=\"large\">%1</span>\n"
+"\n"
+"<b>%2</b>\n"
+"\n"
+"<i>%3</i>\n"
+"\n"
+"%4"
 
-#: ardour_ui.cc:906
+#: ardour_ui.cc:1089
 msgid "This is a free/demo version of %1"
-msgstr ""
+msgstr "Ceci est une version de démonstration gratuite du logiciel %1."
 
-#: ardour_ui.cc:907
+#: ardour_ui.cc:1090
 msgid "It will not restore OR save any plugin settings"
-msgstr ""
+msgstr "Elle ne récupèrera NI ne sauvegardera aucun réglage des greffons"
 
-#: ardour_ui.cc:908
+#: ardour_ui.cc:1091
 msgid ""
 "If you load an existing session with plugin settings\n"
 "they will not be used and will be lost."
 msgstr ""
+"Si vous ouvrez une session existante avec des réglages de greffons\n"
+"ils ne seront pas utilisés et seront perdus."
 
-#: ardour_ui.cc:910 plugin_ui.cc:569
+#: ardour_ui.cc:1093 plugin_ui.cc:579
 msgid ""
 "To get full access to updates without this limitation\n"
 "consider becoming a subscriber for a low cost every month."
 msgstr ""
+"Pour avoir un accès complet aux mises à jours n'ayant pas cette limitation\n"
+"vous pouvez devenir un abonné pour un faible cout mensuel."
 
-#: ardour_ui.cc:920
+#: ardour_ui.cc:1103
 msgid "Quit now"
-msgstr ""
+msgstr "Quitter maintenant"
 
-#: ardour_ui.cc:921
+#: ardour_ui.cc:1104
 msgid "Continue using %1"
-msgstr ""
+msgstr "Continuer à utiliser %1"
 
-#: ardour_ui.cc:954 startup.cc:345
+#: ardour_ui.cc:1135 startup.cc:349
 msgid "%1 is ready for use"
 msgstr "%1 est prêt à être utilisé."
 
-#: ardour_ui.cc:996
+#: ardour_ui.cc:1185
 msgid ""
 "WARNING: Your system has a limit for maximum amount of locked memory. This "
 "might cause %1 to run out of memory before your system runs out of memory. \n"
@@ -902,30 +1086,30 @@ msgid ""
 "You can view the memory limit with 'ulimit -l', and it is normally "
 "controlled by %2"
 msgstr ""
-"ATTENTION : votre système a une limite maximum pour le verrouillage mémoire. "
-"Cela peut entraîner %1 à manquer de mémoire avant l'épuisement de la mémoire "
-"système.\n"
+"ATTENTION : votre système limite la quantité maximum qu'une application peut "
+"bloquer. Cela peut entraîner %1 à manquer de mémoire avant l'épuisement de "
+"la mémoire système.\n"
 "\n"
 "Vous pouvez consulter la limite mémoire avec 'ulimit -l' et elle est "
 "habituellement contrôlée par %2."
 
-#: ardour_ui.cc:1013
+#: ardour_ui.cc:1202
 msgid "Do not show this window again"
 msgstr "Ne plus afficher cette fenêtre"
 
-#: ardour_ui.cc:1057
+#: ardour_ui.cc:1245
 msgid "Don't quit"
 msgstr "Ne pas quitter"
 
-#: ardour_ui.cc:1058
+#: ardour_ui.cc:1246
 msgid "Just quit"
 msgstr "Quitter sans sauvegarder"
 
-#: ardour_ui.cc:1059
+#: ardour_ui.cc:1247 ardour_ui.cc:5362
 msgid "Save and quit"
 msgstr "Sauvegarder et quitter"
 
-#: ardour_ui.cc:1069
+#: ardour_ui.cc:1257
 msgid ""
 "%1 was unable to save your session.\n"
 "\n"
@@ -939,11 +1123,11 @@ msgstr ""
 "\n"
 "cliquez sur le bouton « Quitter sans sauvegarder »."
 
-#: ardour_ui.cc:1119
+#: ardour_ui.cc:1307
 msgid "Unsaved Session"
 msgstr "Session non sauvegardée"
 
-#: ardour_ui.cc:1140
+#: ardour_ui.cc:1328
 msgid ""
 "The session \"%1\"\n"
 "has not been saved.\n"
@@ -961,7 +1145,7 @@ msgstr ""
 "\n"
 "Que voulez-vous faire ?"
 
-#: ardour_ui.cc:1143
+#: ardour_ui.cc:1331
 msgid ""
 "The snapshot \"%1\"\n"
 "has not been saved.\n"
@@ -978,112 +1162,140 @@ msgstr ""
 "\n"
 "Que voulez-vous faire ?"
 
-#: ardour_ui.cc:1157
+#: ardour_ui.cc:1345
 msgid "Prompter"
 msgstr "Question"
 
-#: ardour_ui.cc:1269 ardour_ui.cc:1277
+#: ardour_ui.cc:1459 ardour_ui.cc:1467
 msgid "Audio: <span foreground=\"red\">none</span>"
 msgstr "Audio : <span foreground=\"red\">aucun</span>"
 
-#: ardour_ui.cc:1281
+#: ardour_ui.cc:1471
 #, c-format
 msgid "Audio: <span foreground=\"green\">%.1f kHz / %4.1f ms</span>"
 msgstr "Audio : <span foreground=\"green\">%.1f kHz / %4.1f ms</span>"
 
-#: ardour_ui.cc:1285
+#: ardour_ui.cc:1475
 #, c-format
 msgid "Audio: <span foreground=\"green\">%<PRId64> kHz / %4.1f ms</span>"
 msgstr "Audio : <span foreground=\"green\">%<PRId64> kHz / %4.1f ms</span>"
 
-#: ardour_ui.cc:1303 export_video_dialog.cc:80
+#: ardour_ui.cc:1493 export_report.cc:108 export_report.cc:323
+#: export_video_dialog.cc:76
 msgid "File:"
 msgstr "Fichiers :"
 
-#: ardour_ui.cc:1307
+#: ardour_ui.cc:1497
 msgid "BWF"
 msgstr "BWF"
 
-#: ardour_ui.cc:1310
+#: ardour_ui.cc:1500
 msgid "WAV"
 msgstr "WAV"
 
-#: ardour_ui.cc:1313
+#: ardour_ui.cc:1503
 msgid "WAV64"
 msgstr "WAV64"
 
-#: ardour_ui.cc:1316 session_option_editor.cc:185
+#: ardour_ui.cc:1506 session_option_editor.cc:202
 msgid "CAF"
 msgstr "CAF"
 
-#: ardour_ui.cc:1319
+#: ardour_ui.cc:1509
 msgid "AIFF"
 msgstr "AIFF"
 
-#: ardour_ui.cc:1322
+#: ardour_ui.cc:1512
 msgid "iXML"
 msgstr "iXML"
 
-#: ardour_ui.cc:1325
+#: ardour_ui.cc:1515 session_option_editor.cc:203
 msgid "RF64"
 msgstr "RF64"
 
-#: ardour_ui.cc:1333
+#: ardour_ui.cc:1518
+msgid "RF64/WAV"
+msgstr "RF64/WAV"
+
+#: ardour_ui.cc:1521
+msgid "MBWF"
+msgstr "MBWF"
+
+#: ardour_ui.cc:1529
 msgid "32-float"
 msgstr "32-flottant"
 
-#: ardour_ui.cc:1336
+#: ardour_ui.cc:1532
 msgid "24-int"
 msgstr "24-entier"
 
-#: ardour_ui.cc:1339
+#: ardour_ui.cc:1535
 msgid "16-int"
 msgstr "16-entier"
 
-#: ardour_ui.cc:1358
+#: ardour_ui.cc:1556
 #, c-format
-msgid "DSP: <span foreground=\"%s\">%5.1f%%</span>"
-msgstr "DSP : <span foreground=\"%s\">%5.1f%%</span>"
+msgid "X: <span foreground=\"%s\">>10K</span>"
+msgstr ""
 
-#: ardour_ui.cc:1377
+#: ardour_ui.cc:1558
 #, c-format
-msgid ""
-"Buffers: <span foreground=\"green\">p:</span><span foreground=\"%s\">"
-"%<PRIu32>%%</span> <span foreground=\"green\">c:</span><span foreground=\"%s"
-"\">%<PRIu32>%%</span>"
+msgid "X: <span foreground=\"%s\">%u</span>"
 msgstr ""
-"Tampons : <span foreground=\"green\">l :</span><span foreground=\"%s\">"
-"%<PRIu32>%%</span> <span foreground=\"green\">e :</span><span foreground=\"%s"
-"\">%<PRIu32>%%</span>"
 
-#: ardour_ui.cc:1418
+#: ardour_ui.cc:1561
+#, c-format
+msgid "X: <span foreground=\"%s\">?</span>"
+msgstr ""
+
+#: ardour_ui.cc:1564
+msgid "Audio dropouts. Shift+click to reset"
+msgstr ""
+
+#: ardour_ui.cc:1577
+#, c-format
+msgid "DSP: <span foreground=\"%s\">%5.1f%%</span>"
+msgstr "DSP : <span foreground=\"%s\">%5.1f%%</span>"
+
+#: ardour_ui.cc:1587
+#, c-format
+msgid "PkBld: <span foreground=\"%s\">%d</span>"
+msgstr ""
+
+#: ardour_ui.cc:1609
+#, c-format
+msgid ""
+"Buffers: <span foreground=\"green\">p:</span><span foreground=\"%s\">"
+"%<PRIu32>%%</span> <span foreground=\"green\">c:</span><span foreground=\"%s"
+"\">%<PRIu32>%%</span>"
+msgstr ""
+"Tampons : <span foreground=\"green\">l :</span><span foreground=\"%s\">"
+"%<PRIu32>%%</span> <span foreground=\"green\">e :</span><span foreground=\"%s"
+"\">%<PRIu32>%%</span>"
+
+#: ardour_ui.cc:1650
 msgid "Disk: <span foreground=\"green\">Unknown</span>"
 msgstr "Disque : <span foreground=\"green\">Inconnu</span>"
 
-#: ardour_ui.cc:1420
+#: ardour_ui.cc:1652
 msgid "Disk: <span foreground=\"green\">24hrs+</span>"
 msgstr "Disque : <span foreground=\"green\">+24h</span>"
 
-#: ardour_ui.cc:1438
+#: ardour_ui.cc:1670
 msgid "Disk: <span foreground=\"green\">>24 hrs</span>"
 msgstr "Disque : <span foreground=\"green\">> 24h</span>"
 
-#: ardour_ui.cc:1449
+#: ardour_ui.cc:1681
 #, c-format
 msgid "Disk: <span foreground=\"%s\">%02dh:%02dm:%02ds</span>"
 msgstr "Disque : <span foreground=\"%s\">%02dh:%02dm:%02ds</span>"
 
-#: ardour_ui.cc:1475
+#: ardour_ui.cc:1707
 #, c-format
 msgid "Timecode|TC: <span foreground=\"%s\">%s</span>"
 msgstr "TC : <span foreground=\"%s\">%s</span>"
 
-#: ardour_ui.cc:1596 ardour_ui.cc:1605 session_dialog.cc:318
-#: session_dialog.cc:323
-msgid "Recent Sessions"
-msgstr "Sessions récentes"
-
-#: ardour_ui.cc:1684
+#: ardour_ui.cc:1789
 msgid ""
 "%1 is not connected to any audio backend.\n"
 "You cannot open or close sessions in this condition"
@@ -1091,55 +1303,61 @@ msgstr ""
 "%1 n'est connecté à aucun moteur audio.\n"
 "Aucune session ne peut être ouverte ni fermée dans ces conditions."
 
-#: ardour_ui.cc:1708
+#: ardour_ui.cc:1807
 msgid "Open Session"
 msgstr "Ouvrir une session"
 
-#: ardour_ui.cc:1733 session_dialog.cc:349 session_import_dialog.cc:170
-#: session_metadata_dialog.cc:858
+#: ardour_ui.cc:1831 session_dialog.cc:410 session_import_dialog.cc:170
+#: session_metadata_dialog.cc:861
 msgid "%1 sessions"
 msgstr "Sessions %1"
 
-#: ardour_ui.cc:1770
+#: ardour_ui.cc:1879 ardour_ui.cc:1916
 msgid "You cannot add a track without a session already loaded."
 msgstr "Vous ne pouvez pas ajouter une piste sans avoir ouvert une session."
 
-#: ardour_ui.cc:1778
+#: ardour_ui.cc:1887
 msgid "could not create %1 new mixed track"
 msgid_plural "could not create %1 new mixed tracks"
-msgstr[0] "impossible de créer %1 nouvelle piste mélangée"
-msgstr[1] "impossible de créer %1 nouvelles pistes mélangées"
+msgstr[0] "impossible de créer %1 nouvelle piste hybride"
+msgstr[1] "impossible de créer %1 nouvelles pistes hybrides"
 
-#: ardour_ui.cc:1784 ardour_ui.cc:1845
-msgid ""
-"There are insufficient ports available\n"
-"to create a new track or bus.\n"
-"You should save %1, exit and\n"
-"restart with more ports."
-msgstr ""
-"Il n'y a pas suffisamment de ports disponibles\n"
-"pour créer une nouvelle piste ou bus.\n"
-"Vous devriez sauvegarder %1, quitter et\n"
-"redémarrer avec plus de ports."
+#: ardour_ui.cc:1924
+msgid "could not create %1 new Midi Bus"
+msgid_plural "could not create %1 new Midi Busses"
+msgstr[0] "impossible de créer %1 nouveau bus MIDI"
+msgstr[1] "impossible de créer %1 nouveaux bus MIDI"
 
-#: ardour_ui.cc:1819
+#: ardour_ui.cc:1977
 msgid "You cannot add a track or bus without a session already loaded."
 msgstr ""
 "Vous ne pouvez pas ajouter une piste ou un bus sans avoir ouvert une session."
 
-#: ardour_ui.cc:1828
+#: ardour_ui.cc:1986
 msgid "could not create %1 new audio track"
 msgid_plural "could not create %1 new audio tracks"
 msgstr[0] "impossible de créer %1 nouvelle piste audio"
-msgstr[1] "impossible de créer %1 nouvelles pistes audios"
+msgstr[1] "impossible de créer %1 nouvelles pistes audio"
 
-#: ardour_ui.cc:1837
+#: ardour_ui.cc:1995
 msgid "could not create %1 new audio bus"
 msgid_plural "could not create %1 new audio busses"
-msgstr[0] "impossible de créer %1 nouveau bus"
-msgstr[1] "impossible de créer %1 nouveaux bus"
+msgstr[0] "impossible de créer %1 nouveau bus audio"
+msgstr[1] "impossible de créer %1 nouveaux bus audio"
+
+#: ardour_ui.cc:2020
+msgid ""
+"There are insufficient ports available\n"
+"to create a new track or bus.\n"
+"You should save %1, exit and\n"
+"restart with more ports."
+msgstr ""
+"Il n'y a pas suffisamment de ports disponibles\n"
+"pour créer une nouvelle piste ou bus.\n"
+"Vous devriez sauvegarder %1, quitter et\n"
+"redémarrer avec plus de ports."
 
-#: ardour_ui.cc:1990
+#: ardour_ui.cc:2164
 msgid ""
 "Please create one or more tracks before trying to record.\n"
 "You can do this with the \"Add Track or Bus\" option in the Session menu."
@@ -1147,23 +1365,20 @@ msgstr ""
 "Créez au moins une piste avant d'enregistrer.\n"
 "Allez dans le menu Session, et choisissez « Ajouter piste ou bus »."
 
-#: ardour_ui.cc:2376
-msgid "Save as..."
-msgstr "Sauvegarder sous…"
-
-#: ardour_ui.cc:2377 ardour_ui.cc:2456
-msgid "New session name"
-msgstr "Nom de la nouvelle session :"
+#: ardour_ui.cc:2565
+#, c-format
+msgid "Copied %<PRId64> of %<PRId64>"
+msgstr "%<PRId64> de %<PRId64> copié(s)"
 
-#: ardour_ui.cc:2379
-msgid "Take Snapshot"
-msgstr "Prendre un cliché"
+#: ardour_ui.cc:2619 save_as_dialog.cc:33
+msgid "Save As"
+msgstr "Sauvegarder sous"
 
-#: ardour_ui.cc:2380
-msgid "Name of new snapshot"
-msgstr "Nom du nouveau cliché"
+#: ardour_ui.cc:2647
+msgid "Save As failed: %1"
+msgstr "Échec de la sauvegarde : %1"
 
-#: ardour_ui.cc:2405
+#: ardour_ui.cc:2684
 msgid ""
 "To ensure compatibility with various systems\n"
 "snapshot names may not contain a '%1' character"
@@ -1172,23 +1387,35 @@ msgstr ""
 "systèmes, les noms de cliché ne peuvent pas\n"
 "utiliser le caractère '%1' "
 
-#: ardour_ui.cc:2417
+#: ardour_ui.cc:2698
 msgid "Confirm Snapshot Overwrite"
 msgstr "Confirmer l'écrasement du cliché"
 
-#: ardour_ui.cc:2418
-msgid "A snapshot already exists with that name.  Do you want to overwrite it?"
-msgstr "Un cliché de ce nom existe déjà. Voulez-vous l'écraser ?"
+#: ardour_ui.cc:2699
+msgid "A snapshot already exists with that name. Do you want to overwrite it?"
+msgstr "Un cliché avec ce nom existe déjà. Voulez-vous l'écraser ?"
 
-#: ardour_ui.cc:2421 utils_videotl.cc:74
-msgid "Overwrite"
-msgstr "Écraser"
+#: ardour_ui.cc:2724
+msgid "Snapshot and switch"
+msgstr "Basculer sur un nouveau cliché"
+
+#: ardour_ui.cc:2725 ardour_ui.cc:2776
+msgid "New session name"
+msgstr "Nom de la nouvelle session :"
+
+#: ardour_ui.cc:2727
+msgid "Take Snapshot"
+msgstr "Prendre un cliché"
 
-#: ardour_ui.cc:2455
+#: ardour_ui.cc:2728
+msgid "Name of new snapshot"
+msgstr "Nom du nouveau cliché"
+
+#: ardour_ui.cc:2775
 msgid "Rename Session"
 msgstr "Renommer la session"
 
-#: ardour_ui.cc:2470 ardour_ui.cc:2886 ardour_ui.cc:2924
+#: ardour_ui.cc:2790 ardour_ui.cc:3267 ardour_ui.cc:3305
 msgid ""
 "To ensure compatibility with various systems\n"
 "session names may not contain a '%1' character"
@@ -1196,12 +1423,12 @@ msgstr ""
 "Afin d'assurer la compatibilité sur différents systèmes\n"
 "les noms de sessions ne peuvent pas comporter le caractère '%1'"
 
-#: ardour_ui.cc:2478
+#: ardour_ui.cc:2798
 msgid ""
 "That name is already in use by another directory/folder. Please try again."
 msgstr "Un fichier ou un répertoire utilise déjà ce nom. Essayez autre chose."
 
-#: ardour_ui.cc:2487
+#: ardour_ui.cc:2807
 msgid ""
 "Renaming this session failed.\n"
 "Things could be seriously messed up at this point"
@@ -1209,19 +1436,27 @@ msgstr ""
 "Le renommage de la session a échoué.\n"
 "Il est possible que les données soient à présent corrompues."
 
-#: ardour_ui.cc:2602
+#: ardour_ui.cc:2923 route_ui.cc:1867
+msgid "Confirm Template Overwrite"
+msgstr "Confirmation d'écrasement du modèle"
+
+#: ardour_ui.cc:2924 route_ui.cc:1868
+msgid "A template already exists with that name. Do you want to overwrite it?"
+msgstr "Un modèle avec ce nom existe déjà. Voulez-vous l'écraser ?"
+
+#: ardour_ui.cc:2948
 msgid "Save Template"
 msgstr "Sauvegarder comme modèle"
 
-#: ardour_ui.cc:2603
+#: ardour_ui.cc:2949
 msgid "Name for template:"
 msgstr "Nom du modèle :"
 
-#: ardour_ui.cc:2604
+#: ardour_ui.cc:2950
 msgid "-template"
 msgstr "-modèle"
 
-#: ardour_ui.cc:2643
+#: ardour_ui.cc:2987
 msgid ""
 "This session\n"
 "%1\n"
@@ -1231,35 +1466,39 @@ msgstr ""
 "%1\n"
 "existe déjà. Voulez-vous l'ouvrir ?"
 
-#: ardour_ui.cc:2653
+#: ardour_ui.cc:2997
 msgid "Open Existing Session"
 msgstr "Ouvrir une session"
 
-#: ardour_ui.cc:2914
+#: ardour_ui.cc:3295
 msgid "There is no existing session at \"%1\""
 msgstr "Aucune session n'existe dans « %1 »"
 
-#: ardour_ui.cc:3006
+#: ardour_ui.cc:3391
 msgid "Please wait while %1 loads your session"
 msgstr "Patientez pendant que %1 ouvre la session"
 
-#: ardour_ui.cc:3021
+#: ardour_ui.cc:3406
 msgid "Port Registration Error"
 msgstr "Erreur de référencement du port"
 
-#: ardour_ui.cc:3022
+#: ardour_ui.cc:3407
 msgid "Click the Close button to try again."
 msgstr "Cliquez sur le bouton « Fermer » pour réessayer."
 
-#: ardour_ui.cc:3043
-msgid "Session \"%1 (snapshot %2)\" did not load successfully"
-msgstr "La session « %1 (cliché %2) » ne s'est pas chargée correctement"
+#: ardour_ui.cc:3426
+msgid "Session \"%1 (snapshot %2)\" did not load successfully: %3"
+msgstr "La session « %1 (cliché %2) » n'a pas été chargée correctement: %3"
 
-#: ardour_ui.cc:3049
+#: ardour_ui.cc:3432 ardour_ui.cc:3453 ardour_ui.cc:3548 ardour_ui.cc:3557
 msgid "Loading Error"
 msgstr "Erreur de chargement"
 
-#: ardour_ui.cc:3068
+#: ardour_ui.cc:3447
+msgid "Session \"%1 (snapshot %2)\" did not load successfully"
+msgstr "La session « %1 (cliché %2) » ne s'est pas chargée correctement"
+
+#: ardour_ui.cc:3475
 msgid ""
 "This session has been opened in read-only mode.\n"
 "\n"
@@ -1269,24 +1508,61 @@ msgstr ""
 "\n"
 "Vous ne pourrez pas enregistrer ni sauvegarder."
 
-#: ardour_ui.cc:3073
+#: ardour_ui.cc:3480
 msgid "Read-only Session"
 msgstr "Session en lecture-seule"
 
-#: ardour_ui.cc:3139
+#: ardour_ui.cc:3547
+msgid "Could not create session in \"%1\": %2"
+msgstr "Impossible de créer une session dans « %1 »: %2"
+
+#: ardour_ui.cc:3556
 msgid "Could not create session in \"%1\""
 msgstr "Impossible de créer une session dans « %1 »"
 
-#: ardour_ui.cc:3288
+#: ardour_ui.cc:3601
+msgid ""
+"<b>Just ask and wait for an answer.\n"
+"It may take from minutes to hours.</b>"
+msgstr ""
+"<b>Posez votre question tout simplement et attendez une réponse\n"
+"Cela peut prendre de quelques minutes à plusieurs heures.</b>"
+
+#: ardour_ui.cc:3603
+msgid "About the Chat"
+msgstr "À propos de la discussion instantanée"
+
+#: ardour_ui.cc:3604
+msgid ""
+"When you're inside the chat just ask your question and wait for an answer. "
+"The chat is occupied by real people with real lives so many of them are "
+"passively online and might not read your question before minutes or hours "
+"later.\n"
+"So please be patient and wait for an answer.\n"
+"\n"
+"You should just leave the chat window open and check back regularly until "
+"someone has answered your question."
+msgstr ""
+"Dans la discussion instantanée, posez tout simplement votre question et "
+"attendez une réponse. Vous êtes en discussion avec de vraies personnes ayant "
+"leur vie donc beaucoup d'entre eux sont passifs en ligne et peuvent ne pas "
+"lire votre question avant plusieurs minutes ou plusieurs heures.\n"
+"Soyez donc patient s'il vous plait et attendez une réponse.\n"
+"\n"
+"Vous devriez laisser la fenêtre de discussion ouverte et y jeter "
+"régulièrement un coup d'œil jusqu'à ce que quelqu'un ait répondu à votre "
+"question."
+
+#: ardour_ui.cc:3723
 msgid "No files were ready for clean-up"
 msgstr "Aucun fichier à nettoyer"
 
-#: ardour_ui.cc:3292 ardour_ui.cc:3302 ardour_ui.cc:3435 ardour_ui.cc:3442
-#: ardour_ui_ed.cc:103
+#: ardour_ui.cc:3727 ardour_ui.cc:3737 ardour_ui.cc:3870 ardour_ui.cc:3877
+#: ardour_ui_ed.cc:129
 msgid "Clean-up"
 msgstr "Nettoyer"
 
-#: ardour_ui.cc:3293
+#: ardour_ui.cc:3728
 msgid ""
 "If this seems suprising, \n"
 "check for any existing snapshots.\n"
@@ -1298,19 +1574,19 @@ msgstr ""
 "Ceux-ci pourraient contenir des régions requérant\n"
 "certains fichiers audio inutilisés pour exister."
 
-#: ardour_ui.cc:3352
+#: ardour_ui.cc:3787
 msgid "kilo"
 msgstr "kilo"
 
-#: ardour_ui.cc:3355
+#: ardour_ui.cc:3790
 msgid "mega"
 msgstr "mega"
 
-#: ardour_ui.cc:3358
+#: ardour_ui.cc:3793
 msgid "giga"
 msgstr "giga"
 
-#: ardour_ui.cc:3363
+#: ardour_ui.cc:3798
 msgid ""
 "The following file was deleted from %2,\n"
 "releasing %3 %4bytes of disk space"
@@ -1324,7 +1600,7 @@ msgstr[1] ""
 "Les %1 fichiers suivants ont été éffacés de %2,\n"
 "libérant %3 %4octets d'espace disque."
 
-#: ardour_ui.cc:3370
+#: ardour_ui.cc:3805
 msgid ""
 "The following file was not in use and \n"
 "has been moved to: %2\n"
@@ -1360,11 +1636,11 @@ msgstr[1] ""
 "<span face=\"mono\">Session -> Nettoyer -> Vider la corbeille</span>\n"
 "libérera %3 %4octets d'espace-disque supplémentaire.\n"
 
-#: ardour_ui.cc:3430
+#: ardour_ui.cc:3865
 msgid "Are you sure you want to clean-up?"
 msgstr "Voulez-vous vraiment lancer le nettoyage ?"
 
-#: ardour_ui.cc:3437
+#: ardour_ui.cc:3872
 msgid ""
 "Clean-up is a destructive operation.\n"
 "ALL undo/redo information will be lost if you clean-up.\n"
@@ -1374,41 +1650,65 @@ msgstr ""
 "TOUTES les opérations d'annulation seront perdues.\n"
 "Les fichiers audio inutilisés seront déplacés dans un dossier « dead »."
 
-#: ardour_ui.cc:3445
+#: ardour_ui.cc:3880
 msgid "CleanupDialog"
 msgstr "Fenêtre de nettoyage"
 
-#: ardour_ui.cc:3475
+#: ardour_ui.cc:3910
 msgid "Cleaned Files"
 msgstr "Fichiers nettoyés"
 
-#: ardour_ui.cc:3492
+#: ardour_ui.cc:3927
 msgid "deleted file"
 msgstr "fichier effacé"
 
-#: ardour_ui.cc:3637
+#: ardour_ui.cc:4133
+msgid "Cannot read session script '%1': %2"
+msgstr "Impossible de lire le script de session « %1 »: %2"
+
+#: ardour_ui.cc:4142 luainstance.cc:1087
+msgid "Set Script Parameters"
+msgstr "Définir les paramètres du script"
+
+#: ardour_ui.cc:4153
+msgid "Session script '%1' instantiation failed: %2"
+msgstr "Échec de création d'une instance du script de session « %1 »: %2"
+
+#: ardour_ui.cc:4157
+msgid "Loading Session script '%1' failed: %2"
+msgstr "Échec du chargement du script de session « %1 »: %2"
+
+#: ardour_ui.cc:4170
+msgid "There are no active Lua session scripts present in this session."
+msgstr "Il n'y a aucun script de session Lua actif dans cette session"
+
+#: ardour_ui.cc:4187
+msgid "Session script '%1' removal failed: %2"
+msgstr "Le retrait du script de session « %1 » a échoué : %2"
+
+#: ardour_ui.cc:4197
 msgid "Video-Server was not launched by %1. The request to stop it is ignored."
 msgstr ""
 "Le serveur vidéo n'a pas été lancé par %1. La demande pour l'arrêter est "
 "ignorée."
 
-#: ardour_ui.cc:3641
+#: ardour_ui.cc:4201
 msgid "Stop Video-Server"
 msgstr "Arrêter le Serveur-Vidéo"
 
-#: ardour_ui.cc:3642
+#: ardour_ui.cc:4202
 msgid "Do you really want to stop the Video Server?"
 msgstr "Voulez-vous vraiment arrêter le serveur vidéo ?"
 
-#: ardour_ui.cc:3645
+#: ardour_ui.cc:4205
 msgid "Yes, Stop It"
 msgstr "Oui, l'arrêter"
 
-#: ardour_ui.cc:3671
+#: ardour_ui.cc:4231
 msgid "The Video Server is already started."
-msgstr "Le serveur vidéo est déjà démarré"
+msgstr "Le serveur vidéo est déjà démarré."
 
-#: ardour_ui.cc:3673
+#: ardour_ui.cc:4233
 msgid ""
 "An external Video Server is configured and can be reached. Not starting a "
 "new instance."
@@ -1416,44 +1716,57 @@ msgstr ""
 "Un Serveur-Vidéo est configuré et peut être accessible. Une nouvelle "
 "instance ne sera pas démarrée."
 
-#: ardour_ui.cc:3681 ardour_ui.cc:3786
+#: ardour_ui.cc:4241 ardour_ui.cc:4346
 msgid ""
 "Could not connect to the Video Server. Start it or configure its access URL "
 "in Preferences."
 msgstr ""
+"Impossible de se connecter au serveur vidéo. Démarrez-le ou configurez son "
+"URL d'accès dans les Préférences."
 
-# Should we translate docroot?
-#: ardour_ui.cc:3711
-#, fuzzy
+# docroot = documents root
+#: ardour_ui.cc:4271
 msgid "Specified docroot is not an existing directory."
-msgstr "Le répertoire-racine spéficié n'existe pas."
+msgstr "Le répertoire-racine spécifié n'existe pas."
 
-#: ardour_ui.cc:3717 ardour_ui.cc:3723
+#: ardour_ui.cc:4277 ardour_ui.cc:4283
 msgid "Given Video Server is not an executable file."
 msgstr "Le serveur vidéo indiqué n'est pas un fichier exécutable."
 
-#: ardour_ui.cc:3757
+#: ardour_ui.cc:4317
 msgid "Cannot launch the video-server"
 msgstr "Impossible de lancer le serveur vidéo"
 
-#: ardour_ui.cc:3767
+#: ardour_ui.cc:4327
 msgid "Video-server was started but does not respond to requests..."
 msgstr "Le serveur vidéo a été démarré mais ne répond pas aux requêtes…"
 
-#: ardour_ui.cc:3812 editor_audio_import.cc:641
+#: ardour_ui.cc:4372 editor_audio_import.cc:647
 msgid "could not open %1"
 msgstr "impossible d'ouvrir %1"
 
-#: ardour_ui.cc:3816
+#: ardour_ui.cc:4376
 msgid "no video-file selected"
 msgstr "pas de fichier vidéo sélectionné"
 
-#: ardour_ui.cc:4014
+#: ardour_ui.cc:4472
+msgid "No LTC detected, video will not be aligned."
+msgstr ""
+
+#: ardour_ui.cc:4478
+msgid "Align video-start to %1 [samples]"
+msgstr ""
+
+#: ardour_ui.cc:4654
+msgid "xrun"
+msgstr ""
+
+#: ardour_ui.cc:4663
 msgid "Recording was stopped because your system could not keep up."
 msgstr ""
 "L'enregistrement s'est arrêté car votre système n'était pas assez rapide."
 
-#: ardour_ui.cc:4043
+#: ardour_ui.cc:4692
 msgid ""
 "The disk system on your computer\n"
 "was not able to keep up with %1.\n"
@@ -1467,24 +1780,24 @@ msgstr ""
 "L'enregistrement a généré un débit de\n"
 "données trop important pour le disque.\n"
 
-#: ardour_ui.cc:4113
+#: ardour_ui.cc:4765
 msgid "Scanning for plugins"
 msgstr "Recherche de greffons"
 
-#: ardour_ui.cc:4115
+#: ardour_ui.cc:4767
 msgid "Cancel plugin scan"
 msgstr "Annuler la recherche de greffons"
 
-#: ardour_ui.cc:4124
+#: ardour_ui.cc:4776
 #, fuzzy
 msgid "Stop Timeout"
 msgstr "Délai d'expiration de la recherche"
 
-#: ardour_ui.cc:4131
+#: ardour_ui.cc:4783
 msgid "Scan Timeout"
 msgstr "Délai d'expiration de la recherche"
 
-#: ardour_ui.cc:4174
+#: ardour_ui.cc:4827
 msgid ""
 "The disk system on your computer\n"
 "was not able to keep up with %1.\n"
@@ -1498,11 +1811,11 @@ msgstr ""
 "La lecture a généré un débit de données\n"
 "trop important pour le disque.\n"
 
-#: ardour_ui.cc:4214
+#: ardour_ui.cc:4862
 msgid "Crash Recovery"
 msgstr "Récupération après un crash"
 
-#: ardour_ui.cc:4215
+#: ardour_ui.cc:4863
 msgid ""
 "This session appears to have been in the\n"
 "middle of recording when %1 or\n"
@@ -1519,19 +1832,19 @@ msgstr ""
 "%1 peut récupérer ou ignorer les données\n"
 "de l'enregistrement. Que voulez-vous faire ?\n"
 
-#: ardour_ui.cc:4227
+#: ardour_ui.cc:4875
 msgid "Ignore crash data"
 msgstr "Ignorer les données"
 
-#: ardour_ui.cc:4228
+#: ardour_ui.cc:4876
 msgid "Recover from crash"
 msgstr "Récupérer les données"
 
-#: ardour_ui.cc:4248
+#: ardour_ui.cc:4896
 msgid "Sample Rate Mismatch"
 msgstr "Mauvais taux d'échantillonnage"
 
-#: ardour_ui.cc:4249
+#: ardour_ui.cc:4897
 msgid ""
 "This session was created with a sample rate of %1 Hz, but\n"
 "%2 is currently running at %3 Hz.  If you load this session,\n"
@@ -1541,23 +1854,29 @@ msgstr ""
 "mais %2 tourne actuellement à %3 Hz. Si vous chargez cette session,\n"
 "l'audio pourra être lu avec une mauvaise fréquence d'echantillonnage.\n"
 
-#: ardour_ui.cc:4258
+#: ardour_ui.cc:4906
 msgid "Do not load session"
 msgstr "Ne pas charger la session"
 
-#: ardour_ui.cc:4259
+#: ardour_ui.cc:4907
 msgid "Load session anyway"
 msgstr "Charger quand-même la session"
 
-#: ardour_ui.cc:4286
-msgid "Could not disconnect from Audio/MIDI engine"
-msgstr "Déconnection du moteur Audio/MIDI impossible"
-
-#: ardour_ui.cc:4303 ardour_ui.cc:4306
-msgid "Could not reconnect to the Audio/MIDI engine"
-msgstr "Reconnection au moteur Audio/MIDI impossible"
+#: ardour_ui.cc:4927
+msgid ""
+"This session was created with a sample rate of %1 Hz, but\n"
+"%2 is currently running at %3 Hz.\n"
+"Audio will be recorded and played at the wrong sample rate.\n"
+"Re-Configure the Audio Engine in\n"
+"Menu > Window > Audio/Midi Setup"
+msgstr ""
+"Cette session a été crée avec un taux d'échantillonnage de %1 Hz,\n"
+"mais %2 tourne actuellement à %3 Hz.\n"
+"L'audio sera enregistré et lu avec une mauvaise fréquence\n"
+"d'échantillonnage. Reconfigurez le moteur audio en utilisant\n"
+"le menu Fenêtre > Réglages Audio/MIDI"
 
-#: ardour_ui.cc:4590
+#: ardour_ui.cc:5209
 msgid ""
 "%4This is a session from an older version of %3%5\n"
 "\n"
@@ -1569,62 +1888,75 @@ msgid ""
 "\n"
 "%6%2%7\n"
 "\n"
-"From now on, use the -2000 version with older versions of %3"
+"From now on, use the backup copy with older versions of %3"
 msgstr ""
-"%4Session issue d'une ancienne version de %3%5\n"
-"\n"
-"%3 a copié l'ancien fichier de session\n"
-"\n"
-"%6%1%7\n"
-"\n"
-"vers\n"
-"\n"
-"%6%2%7\n"
-"\n"
-"À partir de maintenant, utilisez la version -2000 avec d'anciennes versions "
-"de %3"
 
-#: ardour_ui2.cc:73
-msgid "UI: cannot setup editor"
-msgstr "UI : impossible de configurer l'éditeur"
+#: ardour_ui.cc:5331
+msgid "This is a free/demo copy of %1. It has just switched to silent mode."
+msgstr ""
 
-#: ardour_ui2.cc:78
-msgid "UI: cannot setup mixer"
-msgstr "UI : impossible de configurer la console"
+#: ardour_ui.cc:5337
+msgid "%1 is now silent"
+msgstr ""
 
-#: ardour_ui2.cc:83
-msgid "UI: cannot setup meterbridge"
-msgstr "UI : impossible de configurer le bandeau de mesure"
+#: ardour_ui.cc:5339
+msgid ""
+"Please consider paying for a copy of %1 - you can pay whatever you want."
+msgstr ""
+
+#: ardour_ui.cc:5340
+msgid "Better yet become a subscriber - subscriptions start at US$1 per month."
+msgstr ""
+
+#: ardour_ui.cc:5341
+msgid "Pay for a copy (via the web)"
+msgstr ""
+
+#: ardour_ui.cc:5342
+msgid "Become a subscriber (via the web)"
+msgstr ""
 
-#: ardour_ui2.cc:128
+#: ardour_ui.cc:5361
+msgid "Remain silent"
+msgstr ""
+
+#: ardour_ui.cc:5363
+msgid "Give me more time"
+msgstr ""
+
+#: ardour_ui.cc:5656
+msgid "Global keybindings are missing"
+msgstr ""
+
+#: ardour_ui2.cc:79
 msgid "Play from playhead"
 msgstr "Lire depuis la tête de lecture"
 
-#: ardour_ui2.cc:129
+#: ardour_ui2.cc:80
 msgid "Stop playback"
 msgstr "Stopper la lecture"
 
-#: ardour_ui2.cc:130
+#: ardour_ui2.cc:81
 msgid "Toggle record"
 msgstr "Armer/désarmer l'enregistrement"
 
-#: ardour_ui2.cc:131
+#: ardour_ui2.cc:82
 msgid "Play range/selection"
 msgstr "Lire l'intervalle/la sélection"
 
-#: ardour_ui2.cc:132
+#: ardour_ui2.cc:83
 msgid "Go to start of session"
 msgstr "Aller au début de la session"
 
-#: ardour_ui2.cc:133
+#: ardour_ui2.cc:84
 msgid "Go to end of session"
 msgstr "Aller à la fin de la session"
 
-#: ardour_ui2.cc:134
+#: ardour_ui2.cc:85
 msgid "Play loop range"
 msgstr "Lire l'intervalle de boucle"
 
-#: ardour_ui2.cc:135
+#: ardour_ui2.cc:86
 msgid ""
 "MIDI Panic\n"
 "Send note off and reset controller messages on all MIDI channels"
@@ -1633,23 +1965,23 @@ msgstr ""
 "Envoyer messages « note off » et « reset controller » sur tous les canaux "
 "MIDI"
 
-#: ardour_ui2.cc:136
+#: ardour_ui2.cc:87
 msgid "Return to last playback start when stopped"
 msgstr "Revenir en début de lecture lors de l'arrêt"
 
-#: ardour_ui2.cc:137
-msgid "Playhead follows Range Selections and Edits"
-msgstr "La tête de lecture suit les intervalles de sélection et les éditions"
+#: ardour_ui2.cc:88
+msgid "Playhead follows range selections and edits"
+msgstr ""
 
-#: ardour_ui2.cc:138
+#: ardour_ui2.cc:89
 msgid "Be sensible about input monitoring"
 msgstr "Monitoring d'entrée automatique"
 
-#: ardour_ui2.cc:139
+#: ardour_ui2.cc:90
 msgid "Enable/Disable audio click"
 msgstr "Activer/désactiver le métronome"
 
-#: ardour_ui2.cc:140 monitor_section.cc:111
+#: ardour_ui2.cc:91 monitor_section.cc:129
 msgid ""
 "When active, something is soloed.\n"
 "Click to de-solo everything"
@@ -1657,19 +1989,17 @@ msgstr ""
 "Actif lorsque quelque chose est en solo\n"
 "Cliquer pour désactiver tous les solos."
 
-#: ardour_ui2.cc:141
+#: ardour_ui2.cc:92
 msgid ""
-"When active, auditioning is taking place\n"
+"When active, auditioning is taking place.\n"
 "Click to stop the audition"
 msgstr ""
-"Actif lorsqu'une écoute est en cours\n"
-"Cliquer pour stopper l'écoute."
 
-#: ardour_ui2.cc:142
+#: ardour_ui2.cc:93
 msgid "When active, there is a feedback loop."
 msgstr "Actif lorsqu'une boucle de larsen est détectée."
 
-#: ardour_ui2.cc:143
+#: ardour_ui2.cc:94
 msgid ""
 "<b>Primary Clock</b> right-click to set display mode. Click to edit, click"
 "+drag a digit or mouse-over+scroll wheel to modify.\n"
@@ -1683,7 +2013,7 @@ msgstr ""
 "<tt>Esc</tt> : annule ; <tt>Entrée</tt> : confirme ; ajouter « + » ou « - » "
 "pour entrer un delta temporel.\n"
 
-#: ardour_ui2.cc:144
+#: ardour_ui2.cc:95
 msgid ""
 "<b>Secondary Clock</b> right-click to set display mode. Click to edit, click"
 "+drag a digit or mouse-over+scroll wheel to modify.\n"
@@ -1696,455 +2026,553 @@ msgstr ""
 "<tt>Esc</tt> annule; <tt>Entrée</tt> : confirme; Ajouter '+' ou '-' pourque "
 "la valeur s'ajoute (ou s'enlève) de la valeur originelle.\n"
 
-#: ardour_ui2.cc:145
+#: ardour_ui2.cc:96
 msgid "Reset All Peak Indicators"
 msgstr "Réinitialiser tous les indicateurs de crête"
 
-#: ardour_ui2.cc:146
+#: ardour_ui2.cc:97
 msgid "Show Error Log and acknowledge warnings"
-msgstr ""
+msgstr "Afficher le journal d'erreurs et prendre en compte les avertissements"
 
-#: ardour_ui2.cc:179
+#: ardour_ui2.cc:130
 msgid "[ERROR]: "
 msgstr "[ERREUR] : "
 
-#: ardour_ui2.cc:182
+#: ardour_ui2.cc:133
 msgid "[WARNING]: "
 msgstr "[AVERTISSEMENT] : "
 
-#: ardour_ui2.cc:185
+#: ardour_ui2.cc:136
 msgid "[INFO]: "
 msgstr "[INFORMATION] : "
 
-#: ardour_ui2.cc:253 ardour_ui_ed.cc:403
+#: ardour_ui2.cc:197 ardour_ui_ed.cc:509
 msgid "Auto Return"
 msgstr "Retour automatique"
 
-#: ardour_ui2.cc:255 ardour_ui_ed.cc:406
+#: ardour_ui2.cc:199 ardour_ui_ed.cc:512
 msgid "Follow Edits"
 msgstr "Suivre éditions"
 
-#: ardour_ui2.cc:716 rc_option_editor.cc:2300
+#: ardour_ui2.cc:422 ardour_ui2.cc:426 ardour_ui2.cc:430
+msgid ""
+"Drag this tab to the desktop to show %1 in its own window\n"
+"\n"
+"To put the window back, use the Window > %1 > Attach menu action"
+msgstr ""
+
+#: ardour_ui2.cc:638
 msgid "GUI"
-msgstr "IHM"
-
-#: ardour_ui2.cc:733 rc_option_editor.cc:1309 rc_option_editor.cc:1327
-#: rc_option_editor.cc:1330 rc_option_editor.cc:1332 rc_option_editor.cc:1334
-#: rc_option_editor.cc:1342 rc_option_editor.cc:1350 rc_option_editor.cc:1352
-#: rc_option_editor.cc:1360 rc_option_editor.cc:1367 rc_option_editor.cc:1376
-#: rc_option_editor.cc:1378 rc_option_editor.cc:1380 rc_option_editor.cc:1388
-#: rc_option_editor.cc:1390 rc_option_editor.cc:1399
-#: session_option_editor.cc:321 session_option_editor.cc:323
-#: session_option_editor.cc:344 session_option_editor.cc:346
-#: session_option_editor.cc:348 session_option_editor.cc:355
-#: session_option_editor.cc:362 session_option_editor.cc:366
-msgid "Misc"
-msgstr "Divers"
+msgstr "Interface graphique"
+
+#: ardour_ui2.cc:651 rc_option_editor.cc:1941 rc_option_editor.cc:1943
+#: rc_option_editor.cc:1945
+msgid "Misc/Click"
+msgstr ""
 
-#: ardour_ui_dependents.cc:76
+#: ardour_ui_dependents.cc:118
 msgid "Setup Editor"
 msgstr "Éditeur de configuration"
 
-#: ardour_ui_dependents.cc:78
+#: ardour_ui_dependents.cc:120
 msgid "Setup Mixer"
 msgstr "Réglages de la Console"
 
-#: ardour_ui_dependents.cc:84
+#: ardour_ui_dependents.cc:127
 msgid "Reload Session History"
 msgstr "Recharger l'historique de la session"
 
-#: ardour_ui_dialogs.cc:250
+#: ardour_ui_dependents.cc:248
+msgid "UI: cannot setup editor"
+msgstr "UI : impossible de configurer l'éditeur"
+
+#: ardour_ui_dependents.cc:253
+msgid "UI: cannot setup mixer"
+msgstr "UI : impossible de configurer la console"
+
+#: ardour_ui_dependents.cc:258
+msgid "UI: cannot setup meterbridge"
+msgstr "UI : impossible de configurer le bandeau de mesure"
+
+#: ardour_ui_dependents.cc:263
+msgid "UI: cannot setup luawindow"
+msgstr ""
+
+#: ardour_ui_dependents.cc:269 ardour_ui_ed.cc:136 ardour_ui_ed.cc:257
+#: rc_option_editor.cc:1853 rc_option_editor.cc:3487
+msgid "Preferences"
+msgstr "Préférences"
+
+#: ardour_ui_dependents.cc:270 ardour_ui_ed.cc:134 mixer_ui.cc:100
+#: mixer_ui.cc:410
+msgid "Mixer"
+msgstr ""
+
+#: ardour_ui_dependents.cc:271 ardour_ui_ed.cc:135 editor.cc:5790
+#: editor.cc:6062 public_editor.cc:34 rc_option_editor.cc:2201
+#: rc_option_editor.cc:2215 rc_option_editor.cc:2219 rc_option_editor.cc:2227
+#: rc_option_editor.cc:2236 rc_option_editor.cc:2244 rc_option_editor.cc:2253
+#: rc_option_editor.cc:2261 rc_option_editor.cc:2269 rc_option_editor.cc:2279
+#: rc_option_editor.cc:2281 rc_option_editor.cc:2305 rc_option_editor.cc:2317
+#: rc_option_editor.cc:2328 rc_option_editor.cc:2346
+msgid "Editor"
+msgstr "Éditeur"
+
+#: ardour_ui_dialogs.cc:263
 msgid "Don't close"
 msgstr "Ne pas fermer"
 
-#: ardour_ui_dialogs.cc:251
+#: ardour_ui_dialogs.cc:264
 msgid "Just close"
 msgstr "Fermer"
 
-#: ardour_ui_dialogs.cc:252
+#: ardour_ui_dialogs.cc:265
 msgid "Save and close"
 msgstr "Sauvegarder et fermer"
 
-#: ardour_ui_dialogs.cc:362
-msgid "This screen is not tall enough to display the mixer window"
+#: ardour_ui_ed.cc:124
+msgid "Escape"
 msgstr ""
-"Cet écran n'est pas assez haut pour afficher la fenêtre de la console de "
-"mixage"
 
-#: ardour_ui_ed.cc:102
+#: ardour_ui_ed.cc:128
 msgid "Session"
 msgstr "Session"
 
-#: ardour_ui_ed.cc:105 editor_actions.cc:138 editor_regions.cc:116
-#: port_group.cc:458 session_option_editor.cc:82 session_option_editor.cc:89
+#: ardour_ui_ed.cc:131 editor_actions.cc:141 editor_regions.cc:163
+#: port_group.cc:468 session_option_editor.cc:82 session_option_editor.cc:89
 msgid "Sync"
 msgstr "Synchro"
 
-#: ardour_ui_ed.cc:106
+#: ardour_ui_ed.cc:132
 msgid "Options"
 msgstr "Options"
 
-#: ardour_ui_ed.cc:107
+#: ardour_ui_ed.cc:133
 msgid "Window"
 msgstr "Fenêtres"
 
-#: ardour_ui_ed.cc:108
+#: ardour_ui_ed.cc:137 ardour_ui_ed.cc:267 ardour_ui_ed.cc:268
+#: ardour_ui_ed.cc:269
+msgid "Detach"
+msgstr "Détacher"
+
+#: ardour_ui_ed.cc:138
 msgid "Help"
 msgstr "Aide"
 
-#: ardour_ui_ed.cc:109
+#: ardour_ui_ed.cc:139
 msgid "Misc. Shortcuts"
 msgstr "Raccourcis divers"
 
-#: ardour_ui_ed.cc:110
+#: ardour_ui_ed.cc:140
 msgid "Audio File Format"
 msgstr "Format de fichiers audio"
 
-#: ardour_ui_ed.cc:111
+#: ardour_ui_ed.cc:141
 msgid "File Type"
 msgstr "fichier"
 
-#: ardour_ui_ed.cc:112 export_format_dialog.cc:67
+#: ardour_ui_ed.cc:142 export_format_dialog.cc:75
 msgid "Sample Format"
 msgstr "Échantillon"
 
-#: ardour_ui_ed.cc:113 rc_option_editor.cc:2245 rc_option_editor.cc:2257
+#: ardour_ui_ed.cc:143 rc_option_editor.cc:2841
 msgid "Control Surfaces"
 msgstr "Surfaces de contrôle"
 
-#: ardour_ui_ed.cc:114 rc_option_editor.cc:1921 rc_option_editor.cc:2264
+#: ardour_ui_ed.cc:144 rc_option_editor.cc:2847 rc_option_editor.cc:2853
+#: rc_option_editor.cc:2862 rc_option_editor.cc:2873 rc_option_editor.cc:2883
+#: rc_option_editor.cc:2945 rc_option_editor.cc:2962 rc_option_editor.cc:2978
+#: rc_option_editor.cc:2979 rc_option_editor.cc:2988 rc_option_editor.cc:3002
+#: rc_option_editor.cc:3005 rc_option_editor.cc:3013 rc_option_editor.cc:3021
 msgid "Plugins"
 msgstr "Greffons"
 
-#: ardour_ui_ed.cc:115 rc_option_editor.cc:2351
+#: ardour_ui_ed.cc:145 rc_option_editor.cc:3169
 msgid "Metering"
 msgstr "Mesure"
 
-#: ardour_ui_ed.cc:116
+#: ardour_ui_ed.cc:146
 msgid "Fall Off Rate"
 msgstr "Taux de chute"
 
-#: ardour_ui_ed.cc:117
+#: ardour_ui_ed.cc:147
 msgid "Hold Time"
 msgstr "Temps de maintien"
 
-#: ardour_ui_ed.cc:118
+#: ardour_ui_ed.cc:148
 msgid "Denormal Handling"
 msgstr "Gestion des dénormaux"
 
-#: ardour_ui_ed.cc:122 route_time_axis.cc:1677
+#: ardour_ui_ed.cc:152 route_time_axis.cc:1683
 msgid "New..."
 msgstr "Nouvelle…"
 
-#: ardour_ui_ed.cc:124
+#: ardour_ui_ed.cc:154
 msgid "Open..."
 msgstr "Ouvrir…"
 
-#: ardour_ui_ed.cc:125
+#: ardour_ui_ed.cc:155
 msgid "Recent..."
 msgstr "Récentes…"
 
-#: ardour_ui_ed.cc:126 panner_editor.cc:29 playlist_selector.cc:64
+#: ardour_ui_ed.cc:156 panner_editor.cc:29 playlist_selector.cc:64
 msgid "Close"
 msgstr "Fermer"
 
-#: ardour_ui_ed.cc:129
+#: ardour_ui_ed.cc:159
 msgid "Add Track or Bus..."
 msgstr "Ajouter une piste ou un bus…"
 
-#: ardour_ui_ed.cc:134
-msgid "Open Video"
-msgstr "Ouvrir vidéo"
+#: ardour_ui_ed.cc:163
+msgid "Duplicate Tracks/Busses..."
+msgstr "Dupliquer les pistes/bus..."
+
+#: ardour_ui_ed.cc:169
+msgid "Cancel Solo"
+msgstr ""
+
+#: ardour_ui_ed.cc:173
+msgid "Session|Scripting"
+msgstr ""
 
-#: ardour_ui_ed.cc:137
+#: ardour_ui_ed.cc:176
+msgid "Add Lua Script..."
+msgstr ""
+
+#: ardour_ui_ed.cc:180
+msgid "Remove Lua Script"
+msgstr ""
+
+#: ardour_ui_ed.cc:184
+msgid "Open Video..."
+msgstr ""
+
+#: ardour_ui_ed.cc:187
 msgid "Remove Video"
 msgstr "Enlever vidéo"
 
-#: ardour_ui_ed.cc:140
-msgid "Export To Video File"
-msgstr "Exporter vers un fichier vidéo…"
+#: ardour_ui_ed.cc:190
+msgid "Export to Video File..."
+msgstr ""
 
-#: ardour_ui_ed.cc:144
-msgid "Snapshot..."
-msgstr "Prendre un cliché…"
+#: ardour_ui_ed.cc:194
+msgid "Snapshot (& keep working on current version) ..."
+msgstr ""
 
-#: ardour_ui_ed.cc:148
+#: ardour_ui_ed.cc:197
+msgid "Snapshot (& switch to new version) ..."
+msgstr ""
+
+#: ardour_ui_ed.cc:200
+msgid "Quick Snapshot (& keep working on current version) ..."
+msgstr ""
+
+#: ardour_ui_ed.cc:203
+msgid "Quick Snapshot (& switch to new version) ..."
+msgstr ""
+
+#: ardour_ui_ed.cc:207
 msgid "Save As..."
 msgstr "Sauvegarder sous…"
 
-#: ardour_ui_ed.cc:152 editor_actions.cc:1771 editor_markers.cc:903
-#: editor_snapshots.cc:124 mixer_strip.cc:1518 route_time_axis.cc:1673
+#: ardour_ui_ed.cc:210 editor_actions.cc:1788 editor_markers.cc:908
+#: editor_snapshots.cc:136 mixer_strip.cc:1653 route_time_axis.cc:1679
 msgid "Rename..."
 msgstr "Renommer.."
 
-#: ardour_ui_ed.cc:156
+#: ardour_ui_ed.cc:214
 msgid "Save Template..."
 msgstr "Sauvegarder comme modèle…"
 
-#: ardour_ui_ed.cc:159
+#: ardour_ui_ed.cc:217
 msgid "Metadata"
 msgstr "Meta-données"
 
-#: ardour_ui_ed.cc:162
+#: ardour_ui_ed.cc:220
 msgid "Edit Metadata..."
 msgstr "Éditer les méta-données…"
 
-#: ardour_ui_ed.cc:165
+#: ardour_ui_ed.cc:223
 msgid "Import Metadata..."
 msgstr "Importer les méta-données"
 
-#: ardour_ui_ed.cc:168
-msgid "Export To Audio File(s)..."
-msgstr "Exporter vers fichier(s) audio…"
+#: ardour_ui_ed.cc:226
+msgid "Export to Audio File(s)..."
+msgstr ""
 
-#: ardour_ui_ed.cc:171
+#: ardour_ui_ed.cc:229
 msgid "Stem export..."
 msgstr "Export de fragments…"
 
-#: ardour_ui_ed.cc:174 editor_export_audio.cc:65 export_dialog.cc:129
-#: export_video_dialog.cc:84
+#: ardour_ui_ed.cc:232 editor_export_audio.cc:66 export_channel_selector.cc:190
+#: export_channel_selector.cc:578 export_dialog.cc:131
+#: export_video_dialog.cc:80
 msgid "Export"
 msgstr "Exporter"
 
-#: ardour_ui_ed.cc:177
+#: ardour_ui_ed.cc:235
 msgid "Clean-up Unused Sources..."
 msgstr "Nettoyer les sources inutilisées…"
 
-#: ardour_ui_ed.cc:181
+#: ardour_ui_ed.cc:239
+msgid "Reset Peak Files"
+msgstr ""
+
+#: ardour_ui_ed.cc:243
 msgid "Flush Wastebasket"
 msgstr "Vider la corbeille"
 
-#: ardour_ui_ed.cc:188
+#: ardour_ui_ed.cc:251
 msgid "Quit"
 msgstr "Quitter"
 
-#: ardour_ui_ed.cc:192
+#: ardour_ui_ed.cc:252 ardour_ui_ed.cc:259 ardour_ui_ed.cc:260
+#: ardour_ui_ed.cc:261 automation_time_axis.cc:545 editor_actions.cc:686
+#: editor_markers.cc:907 location_ui.cc:61 plugin_selector.cc:97
+#: route_time_axis.cc:864
+msgid "Hide"
+msgstr "Cacher"
+
+#: ardour_ui_ed.cc:263 ardour_ui_ed.cc:264 ardour_ui_ed.cc:265
+msgid "Attach"
+msgstr ""
+
+#: ardour_ui_ed.cc:275 ardour_ui_ed.cc:276 ardour_ui_ed.cc:277
+#: ardour_ui_ed.cc:283 ardour_ui_ed.cc:284 ardour_ui_ed.cc:285
+msgid "Change"
+msgstr ""
+
+#: ardour_ui_ed.cc:287
+msgid "Previous Tab"
+msgstr ""
+
+#: ardour_ui_ed.cc:288
+msgid "Next Tab"
+msgstr ""
+
+#: ardour_ui_ed.cc:290
+msgid "Toggle Editor & Mixer"
+msgstr ""
+
+#: ardour_ui_ed.cc:294
 msgid "Maximise Editor Space"
 msgstr "Maximiser l'espace d'édition"
 
-#: ardour_ui_ed.cc:193
+#: ardour_ui_ed.cc:295
 msgid "Maximise Mixer Space"
 msgstr "Maximiser l'espace de mixage"
 
-#: ardour_ui_ed.cc:194
-msgid "Show Toolbars"
-msgstr "Afficher les barres d'outils"
+#: ardour_ui_ed.cc:298
+msgid "Toggle Mixer List"
+msgstr ""
+
+#: ardour_ui_ed.cc:301
+msgid "Toggle Monitor Section Visibility"
+msgstr ""
 
-#: ardour_ui_ed.cc:198
+#: ardour_ui_ed.cc:305
 msgid "Show more UI preferences"
 msgstr "Afficher plus de préférences d'interface graphique"
 
-#: ardour_ui_ed.cc:200 mixer_ui.cc:1924 mixer_ui.cc:1930
-msgid "Window|Mixer"
-msgstr "Console de mixage"
-
-#: ardour_ui_ed.cc:201
-msgid "Toggle Editor+Mixer"
-msgstr "Basculer Éditeur+Console de mixage"
+#: ardour_ui_ed.cc:308
+msgid "Window|Scripting"
+msgstr ""
 
-#: ardour_ui_ed.cc:202 meterbridge.cc:218 meterbridge.cc:224
+#: ardour_ui_ed.cc:309 meterbridge.cc:214 meterbridge.cc:220
 msgid "Window|Meterbridge"
 msgstr "Bandeau de mesure"
 
-#: ardour_ui_ed.cc:204
-msgid "Reattach All Tearoffs"
-msgstr ""
-
-#: ardour_ui_ed.cc:206 midi_tracer.cc:45
+#: ardour_ui_ed.cc:311 midi_tracer.cc:45
 msgid "MIDI Tracer"
 msgstr "Activité MIDI"
 
-#: ardour_ui_ed.cc:208
+#: ardour_ui_ed.cc:314
 msgid "Chat"
 msgstr "Salon de discussion (anglais)"
 
-#: ardour_ui_ed.cc:210
+#: ardour_ui_ed.cc:316
 msgid "Help|Manual"
 msgstr "Manuel"
 
-#: ardour_ui_ed.cc:211
-msgid "Reference"
-msgstr "Référence"
+#: ardour_ui_ed.cc:317
+msgid "Manual|Reference"
+msgstr ""
 
-#: ardour_ui_ed.cc:212
-#, fuzzy
-msgid "Report A Bug"
-msgstr "Rapporter un &bogue..."
+#: ardour_ui_ed.cc:318
+msgid "Report a Bug"
+msgstr ""
 
-#: ardour_ui_ed.cc:213
+#: ardour_ui_ed.cc:319
 msgid "Cheat Sheet"
-msgstr ""
+msgstr "Liste des raccourcis"
 
-#: ardour_ui_ed.cc:214
+#: ardour_ui_ed.cc:320
 msgid "Ardour Website"
-msgstr ""
+msgstr "Site web d'Ardour"
 
-#: ardour_ui_ed.cc:215
+#: ardour_ui_ed.cc:321
 msgid "Ardour Development"
-msgstr ""
+msgstr "Développement d'Ardour"
 
-#: ardour_ui_ed.cc:216
+#: ardour_ui_ed.cc:322
 msgid "User Forums"
-msgstr ""
+msgstr "Forums utilisateurs"
 
-#: ardour_ui_ed.cc:217
-msgid "How to report a bug"
+#: ardour_ui_ed.cc:323
+msgid "How to Report a Bug"
 msgstr ""
 
 # Utilisation de sauvegarder pour éviter la confusion avec enregistrer que l'on réserve au son.
-#: ardour_ui_ed.cc:219 plugin_ui.cc:419
+#: ardour_ui_ed.cc:325 luawindow.cc:100 luawindow.cc:654 plugin_ui.cc:419
 msgid "Save"
 msgstr "Sauvegarder"
 
-#: ardour_ui_ed.cc:227 rc_option_editor.cc:1419 rc_option_editor.cc:1430
-#: rc_option_editor.cc:1441 rc_option_editor.cc:1450 rc_option_editor.cc:1463
-#: rc_option_editor.cc:1476 rc_option_editor.cc:1485 rc_option_editor.cc:1495
-#: rc_option_editor.cc:1497 rc_option_editor.cc:1506 rc_option_editor.cc:1522
-#: rc_option_editor.cc:1543 rc_option_editor.cc:1561 rc_option_editor.cc:1563
-#: rc_option_editor.cc:1579 rc_option_editor.cc:1582 rc_option_editor.cc:1584
-#: rc_option_editor.cc:1601 rc_option_editor.cc:1612
+#: ardour_ui_ed.cc:333 rc_option_editor.cc:1975 rc_option_editor.cc:1986
+#: rc_option_editor.cc:1997 rc_option_editor.cc:2008 rc_option_editor.cc:2017
+#: rc_option_editor.cc:2030 rc_option_editor.cc:2043 rc_option_editor.cc:2052
+#: rc_option_editor.cc:2062 rc_option_editor.cc:2079 rc_option_editor.cc:2186
 msgid "Transport"
 msgstr "Commandes"
 
-#: ardour_ui_ed.cc:233
+#: ardour_ui_ed.cc:339 engine_dialog.cc:88
 msgid "Stop"
 msgstr "Arrêter"
 
-#: ardour_ui_ed.cc:236
+#: ardour_ui_ed.cc:342
 msgid "Roll"
 msgstr "« Roll »"
 
-#: ardour_ui_ed.cc:240 ardour_ui_ed.cc:243
+#: ardour_ui_ed.cc:346 ardour_ui_ed.cc:349
 msgid "Start/Stop"
 msgstr "Lecture/arrêt"
 
-#: ardour_ui_ed.cc:246
+#: ardour_ui_ed.cc:352
 msgid "Start/Continue/Stop"
 msgstr "Lecture/continuer/arrêt"
 
-#: ardour_ui_ed.cc:249
+#: ardour_ui_ed.cc:355
 msgid "Stop and Forget Capture"
-msgstr "Arrêt avec destruction du dernier enregistrement"
+msgstr "Arrêter et détruire le dernier enregistrement"
 
-#: ardour_ui_ed.cc:259
-msgid "Transition To Roll"
-msgstr "Lecture avant"
+#: ardour_ui_ed.cc:365
+msgid "Transition to Roll"
+msgstr ""
 
-#: ardour_ui_ed.cc:263
-msgid "Transition To Reverse"
-msgstr "Lecture arrière"
+#: ardour_ui_ed.cc:369
+msgid "Transition to Reverse"
+msgstr ""
 
-#: ardour_ui_ed.cc:267
+#: ardour_ui_ed.cc:373
 msgid "Play Loop Range"
 msgstr "Lire l'intervalle de boucle"
 
-#: ardour_ui_ed.cc:270
-#, fuzzy
+#: ardour_ui_ed.cc:376
 msgid "Play Selection"
-msgstr "Lire la sélection avec compte à rebours"
+msgstr "Lire la sélection"
 
-#: ardour_ui_ed.cc:273
+#: ardour_ui_ed.cc:379
 msgid "Play Selection w/Preroll"
 msgstr "Lire la sélection avec compte à rebours"
 
-#: ardour_ui_ed.cc:277
+#: ardour_ui_ed.cc:383
 msgid "Enable Record"
 msgstr "Armer l'enregistrement"
 
-#: ardour_ui_ed.cc:280 ardour_ui_ed.cc:284
+#: ardour_ui_ed.cc:386 ardour_ui_ed.cc:390
 msgid "Start Recording"
 msgstr "Démarrer l'enregistrement"
 
-#: ardour_ui_ed.cc:288
+#: ardour_ui_ed.cc:394
 msgid "Rewind"
 msgstr "Rembobiner"
 
-#: ardour_ui_ed.cc:291
+#: ardour_ui_ed.cc:397
 msgid "Rewind (Slow)"
 msgstr "Rembobiner (lent)"
 
-#: ardour_ui_ed.cc:294
+#: ardour_ui_ed.cc:400
 msgid "Rewind (Fast)"
 msgstr "Rembobiner (rapide)"
 
-#: ardour_ui_ed.cc:297
+#: ardour_ui_ed.cc:403
 msgid "Forward"
 msgstr "Avance rapide"
 
-#: ardour_ui_ed.cc:300
+#: ardour_ui_ed.cc:406
 msgid "Forward (Slow)"
 msgstr "Avancer (lent)"
 
-#: ardour_ui_ed.cc:303
+#: ardour_ui_ed.cc:409
 msgid "Forward (Fast)"
 msgstr "Avancer (rapide)"
 
-#: ardour_ui_ed.cc:306
+#: ardour_ui_ed.cc:412
 msgid "Go to Zero"
 msgstr "Aller à zéro"
 
-#: ardour_ui_ed.cc:309 ardour_ui_ed.cc:312
+#: ardour_ui_ed.cc:415 ardour_ui_ed.cc:418
 msgid "Go to Start"
 msgstr "Aller au début"
 
-#: ardour_ui_ed.cc:315
+#: ardour_ui_ed.cc:421
 msgid "Go to End"
 msgstr "Aller à la fin"
 
-#: ardour_ui_ed.cc:318
+#: ardour_ui_ed.cc:424
 msgid "Go to Wall Clock"
 msgstr "Aller à la toute fin"
 
-#: ardour_ui_ed.cc:323 ardour_ui_ed.cc:326
+#: ardour_ui_ed.cc:429 ardour_ui_ed.cc:432
 msgid "Numpad Decimal"
-msgstr "Décimale du pavé numérique"
+msgstr "Point du pavé numérique"
 
-#: ardour_ui_ed.cc:329
+#: ardour_ui_ed.cc:435
 msgid "Numpad 0"
 msgstr "0 du pavé numérique"
 
-#: ardour_ui_ed.cc:332
+#: ardour_ui_ed.cc:438
 msgid "Numpad 1"
 msgstr "1 du pavé numérique"
 
-#: ardour_ui_ed.cc:335
+#: ardour_ui_ed.cc:441
 msgid "Numpad 2"
 msgstr "2 du pavé numérique"
 
-#: ardour_ui_ed.cc:338
+#: ardour_ui_ed.cc:444
 msgid "Numpad 3"
 msgstr "3 du pavé numérique"
 
-#: ardour_ui_ed.cc:341
+#: ardour_ui_ed.cc:447
 msgid "Numpad 4"
 msgstr "4 du pavé numérique"
 
-#: ardour_ui_ed.cc:344
+#: ardour_ui_ed.cc:450
 msgid "Numpad 5"
 msgstr "5 du pavé numérique"
 
-#: ardour_ui_ed.cc:347
+#: ardour_ui_ed.cc:453
 msgid "Numpad 6"
 msgstr "6 du pavé numérique"
 
-#: ardour_ui_ed.cc:350
+#: ardour_ui_ed.cc:456
 msgid "Numpad 7"
 msgstr "7 du pavé numérique"
 
-#: ardour_ui_ed.cc:353
+#: ardour_ui_ed.cc:459
 msgid "Numpad 8"
 msgstr "8 du pavé numérique"
 
-#: ardour_ui_ed.cc:356
+#: ardour_ui_ed.cc:462
 msgid "Numpad 9"
 msgstr "9 du pavé numérique"
 
-#: ardour_ui_ed.cc:360
+#: ardour_ui_ed.cc:466
 msgid "Focus On Clock"
 msgstr "Focus sur l'horloge"
 
-#: ardour_ui_ed.cc:364 ardour_ui_ed.cc:373 audio_clock.cc:2091 editor.cc:258
-#: editor_actions.cc:569 editor_actions.cc:578 export_timespan_selector.cc:88
+#: ardour_ui_ed.cc:470 ardour_ui_ed.cc:479 audio_clock.cc:2122 editor.cc:321
+#: editor_actions.cc:610 editor_actions.cc:619 export_timespan_selector.cc:85
 #: session_option_editor.cc:41 session_option_editor.cc:61
 #: session_option_editor.cc:80 session_option_editor.cc:96
 #: session_option_editor.cc:109 session_option_editor.cc:122
@@ -2152,125 +2580,137 @@ msgstr "Focus sur l'horloge"
 msgid "Timecode"
 msgstr "« Timecode »"
 
-#: ardour_ui_ed.cc:366 ardour_ui_ed.cc:375 editor_actions.cc:567
+#: ardour_ui_ed.cc:472 ardour_ui_ed.cc:481 editor_actions.cc:608
 msgid "Bars & Beats"
 msgstr "Mesures|Temps"
 
-#: ardour_ui_ed.cc:368 ardour_ui_ed.cc:377
+#: ardour_ui_ed.cc:474 ardour_ui_ed.cc:483
 msgid "Minutes & Seconds"
 msgstr "Minutes:Secondes"
 
-#: ardour_ui_ed.cc:370 ardour_ui_ed.cc:379 audio_clock.cc:2095 editor.cc:259
-#: editor_actions.cc:568
+#: ardour_ui_ed.cc:476 ardour_ui_ed.cc:485 audio_clock.cc:2125 editor.cc:322
+#: editor_actions.cc:609
 msgid "Samples"
 msgstr "Échantillons"
 
-#: ardour_ui_ed.cc:382
+#: ardour_ui_ed.cc:488
 msgid "Punch In"
 msgstr "« Punch » entrée"
 
-#: ardour_ui_ed.cc:383 mixer_strip.cc:1819 mixer_strip.cc:1843
-#: mixer_strip.cc:2007 route_ui.cc:162 time_info_box.cc:116
+#: ardour_ui_ed.cc:489 mixer_strip.cc:1992 mixer_strip.cc:2193 route_ui.cc:187
+#: time_info_box.cc:110
 msgid "In"
 msgstr "Entrée"
 
-#: ardour_ui_ed.cc:386
+#: ardour_ui_ed.cc:492
 msgid "Punch Out"
 msgstr "« Punch » sortie"
 
-#: ardour_ui_ed.cc:387 mixer_strip.cc:1831 time_info_box.cc:117
+#: ardour_ui_ed.cc:493 mixer_strip.cc:2004 time_info_box.cc:111
 msgid "Out"
 msgstr "Sortie"
 
-#: ardour_ui_ed.cc:390
+#: ardour_ui_ed.cc:496
 msgid "Punch In/Out"
 msgstr "« Punch »"
 
-#: ardour_ui_ed.cc:391
+#: ardour_ui_ed.cc:497
 msgid "In/Out"
 msgstr "Entrée/Sortie"
 
-#: ardour_ui_ed.cc:394 rc_option_editor.cc:1376
+#: ardour_ui_ed.cc:500 rc_option_editor.cc:1941
 msgid "Click"
 msgstr "Métronome"
 
-#: ardour_ui_ed.cc:397
+#: ardour_ui_ed.cc:503
 msgid "Auto Input"
 msgstr "Écoute automatique"
 
-#: ardour_ui_ed.cc:400
+#: ardour_ui_ed.cc:506
 msgid "Auto Play"
 msgstr "Lecture automatique"
 
-#: ardour_ui_ed.cc:411
+#: ardour_ui_ed.cc:517
 msgid "Sync Startup to Video"
 msgstr "Synchroniser le démarrage avec la vidéo"
 
-#: ardour_ui_ed.cc:413
+#: ardour_ui_ed.cc:519
 msgid "Time Master"
 msgstr "Horloge maître"
 
-#: ardour_ui_ed.cc:420
-msgid "Toggle Record Enable Track %1"
+#: ardour_ui_ed.cc:521
+msgid "Use External Positional Sync Source"
+msgstr ""
+
+#: ardour_ui_ed.cc:526
+msgid "Toggle Record Enable Track %1"
 msgstr "Armer la piste %1"
 
-#: ardour_ui_ed.cc:427
+#: ardour_ui_ed.cc:533
 msgid "Percentage"
-msgstr "pourcentage"
+msgstr "Pourcentage"
 
-#: ardour_ui_ed.cc:428 shuttle_control.cc:178
+#: ardour_ui_ed.cc:534 shuttle_control.cc:205
 msgid "Semitones"
 msgstr "Demi-tons"
 
-#: ardour_ui_ed.cc:432
+#: ardour_ui_ed.cc:538
 msgid "Send MTC"
 msgstr "Envoi MTC (Midi Time Code)"
 
-#: ardour_ui_ed.cc:434
+#: ardour_ui_ed.cc:540
 msgid "Send MMC"
 msgstr "Envoi MMC (Midi Machine Control)"
 
-#: ardour_ui_ed.cc:436
+#: ardour_ui_ed.cc:542
 msgid "Use MMC"
 msgstr "Réception MMC (Midi Machine Control)"
 
-#: ardour_ui_ed.cc:438 rc_option_editor.cc:2097
+#: ardour_ui_ed.cc:544 rc_option_editor.cc:2730
 msgid "Send MIDI Clock"
 msgstr "Envoyer l'horloge MIDI"
 
-#: ardour_ui_ed.cc:440
+#: ardour_ui_ed.cc:546
 msgid "Send MIDI Feedback"
 msgstr "Envoyer les réponses MIDI"
 
-#: ardour_ui_ed.cc:446
+#: ardour_ui_ed.cc:552
 msgid "Panic"
 msgstr "Panique"
 
-#: ardour_ui_ed.cc:534
+#: ardour_ui_ed.cc:629
 msgid "Wall Clock"
 msgstr "Grande horloge"
 
-#: ardour_ui_ed.cc:536
+#: ardour_ui_ed.cc:631
 msgid "Disk Space"
 msgstr "Espace disque"
 
-#: ardour_ui_ed.cc:537
+#: ardour_ui_ed.cc:632
 msgid "DSP"
 msgstr "DSP"
 
-#: ardour_ui_ed.cc:538
+#: ardour_ui_ed.cc:633
+msgid "X-run"
+msgstr ""
+
+#: ardour_ui_ed.cc:634
+msgid "Active Peak-file Work"
+msgstr ""
+
+#: ardour_ui_ed.cc:635
 msgid "Buffers"
 msgstr "Tampons"
 
-#: ardour_ui_ed.cc:540
+#: ardour_ui_ed.cc:637
 msgid "Timecode Format"
 msgstr "Format du « Timecode »"
 
-#: ardour_ui_ed.cc:541
+#: ardour_ui_ed.cc:638
 msgid "File Format"
 msgstr "Format de fichier"
 
-#: ardour_ui_options.cc:63
+#: ardour_ui_options.cc:55
 msgid ""
 "It is not possible to use JACK as the the sync source\n"
 "when the pull up/down setting is non-zero."
@@ -2278,141 +2718,143 @@ msgstr ""
 "Le paramètre « pullup/pulldown » doit être à zéro pour\n"
 "utiliser JACK en tant que source de synchronisation."
 
-#: ardour_ui_options.cc:317
+#: ardour_ui_options.cc:309
 msgid "Internal"
 msgstr "Interne"
 
-#: ardour_ui_options.cc:498
+#: ardour_ui_options.cc:518
 msgid "Enable/Disable external positional sync"
 msgstr "Activer/désactiver la synchronisation positionnelle externe"
 
-#: ardour_ui_options.cc:500
+#: ardour_ui_options.cc:520
 msgid "Sync to JACK is not possible: video pull up/down is set"
 msgstr ""
 "Impossible de synchroniser avec JACK : le « pullup/pulldown » vidéo est "
 "activé"
 
-#: audio_clock.cc:1047 audio_clock.cc:1066
+#: audio_clock.cc:1057 audio_clock.cc:1076
 msgid "--pending--"
 msgstr "--en attente--"
 
-#: audio_clock.cc:1118
+#: audio_clock.cc:1128
 msgid "SR"
 msgstr "FE"
 
-#: audio_clock.cc:1124 audio_clock.cc:1128
+#: audio_clock.cc:1134 audio_clock.cc:1138
 msgid "Pull"
 msgstr "« Pull »"
 
-#: audio_clock.cc:1126
+#: audio_clock.cc:1136
 #, c-format
 msgid "%+.4f%%"
 msgstr "%+.4f%%"
 
-#: audio_clock.cc:1282 editor.cc:260 editor_actions.cc:139
-#: editor_actions.cc:561
+#: audio_clock.cc:1292 editor.cc:323 editor_actions.cc:142
+#: editor_actions.cc:602
 msgid "Tempo"
 msgstr "Tempo"
 
 # L'abréviation est nécessaire, sinon l'affichage est tronqué dans l'horloge
-#: audio_clock.cc:1286 editor.cc:261 editor_actions.cc:562
+#: audio_clock.cc:1296 editor.cc:324 editor_actions.cc:603
 msgid "Meter"
 msgstr "Sig."
 
-#: audio_clock.cc:1864 audio_streamview.cc:115 editor_actions.cc:1089
-#: session_metadata_dialog.cc:452 session_metadata_dialog.cc:500
-#: session_metadata_dialog.cc:556 session_metadata_dialog.cc:845
-#: streamview.cc:470
+#: audio_clock.cc:1878 audio_streamview.cc:117 editor_actions.cc:1092
+#: luainstance.cc:959 luainstance.cc:1575 plugin_pin_dialog.cc:859
+#: plugin_selector.cc:995 plugin_selector.cc:1016
+#: session_metadata_dialog.cc:455 session_metadata_dialog.cc:503
+#: session_metadata_dialog.cc:559 session_metadata_dialog.cc:848
+#: streamview.cc:474
 msgid "programming error: %1"
 msgstr "erreur de programmation: %1"
 
-#: audio_clock.cc:1997 audio_clock.cc:2025
+#: audio_clock.cc:2011 audio_clock.cc:2039
 msgid "programming error: %1 %2"
 msgstr "erreur de programmation: %1 %2"
 
-#: audio_clock.cc:2093 editor.cc:257 export_timespan_selector.cc:98
+#: audio_clock.cc:2123 editor.cc:320 export_timespan_selector.cc:95
 msgid "Bars:Beats"
 msgstr "Mesures|Temps"
 
-#: audio_clock.cc:2094 export_timespan_selector.cc:93
+#: audio_clock.cc:2124 export_timespan_selector.cc:90
 msgid "Minutes:Seconds"
 msgstr "Minutes : Secondes"
 
-#: audio_clock.cc:2099
-msgid "Set From Playhead"
-msgstr "Régler à la tête de lecture"
+#: audio_clock.cc:2129
+msgid "Set from Playhead"
+msgstr ""
 
-#: audio_clock.cc:2100
+#: audio_clock.cc:2130
 msgid "Locate to This Time"
 msgstr "Se placer ici"
 
-#: audio_region_editor.cc:64 control_point_dialog.cc:49 rhythm_ferret.cc:124
-#: rhythm_ferret.cc:129 rhythm_ferret.cc:134
+#: audio_clock.cc:2133
+msgid "Copy to clipboard"
+msgstr ""
+
+#: audio_region_editor.cc:60 control_point_dialog.cc:49 rhythm_ferret.cc:137
+#: rhythm_ferret.cc:154
 msgid "dB"
 msgstr "dB"
 
-#: audio_region_editor.cc:67
+#: audio_region_editor.cc:63
 msgid "Region gain:"
 msgstr "Gain de la région"
 
-#: audio_region_editor.cc:77 export_format_dialog.cc:43
+#: audio_region_editor.cc:73 export_format_dialog.cc:49 export_report.cc:772
+#: export_report.cc:1185 fft_graph.cc:370
 msgid "dBFS"
 msgstr "dBFS"
 
-#: audio_region_editor.cc:80
+#: audio_region_editor.cc:76
 msgid "Peak amplitude:"
 msgstr "Amplitude crête :"
 
-#: audio_region_editor.cc:91
+#: audio_region_editor.cc:87
 msgid "Calculating..."
 msgstr "Calcul en cours…"
 
-#: audio_region_view.cc:1243
+#: audio_region_view.cc:1385
 msgid "add gain control point"
 msgstr "ajout d'un point de contrôle de gain"
 
-#: automation_controller.cc:286 automation_controller.cc:302
+#: automation_controller.cc:304 automation_controller.cc:320
 msgid "Select Note..."
-msgstr ""
+msgstr "Sélectionner une note..."
 
-#: automation_controller.cc:293
-#, fuzzy
+#: automation_controller.cc:311
 msgid "Halve"
-msgstr "Diviser par deux les durées dans la sélection."
+msgstr "Diviser par deux"
 
-#: automation_controller.cc:296
-#, fuzzy
+#: automation_controller.cc:314
 msgid "Double"
-msgstr "Double"
+msgstr "Doubler"
 
-#: automation_controller.cc:307
-#, fuzzy
-msgid "Set to %1 beat(s)"
-msgstr "Impossible de régler le pilote sur %1"
+#: automation_controller.cc:325
+msgid "Set to %1 beat"
+msgid_plural "Set to %1 beats"
+msgstr[0] ""
+msgstr[1] ""
 
-#: automation_line.cc:286 automation_line.cc:462
+#: automation_line.cc:292 editor_drag.cc:4388
 msgid "automation event move"
 msgstr "déplacement d'événement d'automation"
 
-#: automation_line.cc:488 automation_line.cc:508
-msgid "automation range move"
-msgstr "déplacement d'intervalle d'automation"
-
-#: automation_line.cc:880 region_gain_line.cc:72
+#: automation_line.cc:888 region_gain_line.cc:75
 msgid "remove control point"
 msgstr "retrait de point de contrôle"
 
-#: automation_line.cc:1003
+#: automation_line.cc:1013
 msgid "Ignoring illegal points on AutomationLine \"%1\""
 msgstr "Les points illégaux sur la ligne d'automation « %1 » sont ignorés"
 
-#: automation_region_view.cc:190 automation_time_axis.cc:644
+#: automation_region_view.cc:193 automation_time_axis.cc:649
 msgid "add automation event"
 msgstr "ajouter un événement d'automation à "
 
-#: automation_streamview.cc:95
+#: automation_streamview.cc:94
 msgid "unable to display automation region for control without list"
-msgstr ""
+msgstr "Impossible d'afficher la zone d'automation pour un contrôle sans liste"
 
 #: automation_time_axis.cc:163
 msgid "automation state"
@@ -2422,64 +2864,60 @@ msgstr "état de l'automation"
 msgid "hide track"
 msgstr "cacher la piste"
 
-#: automation_time_axis.cc:308 automation_time_axis.cc:360
-#: automation_time_axis.cc:554 gain_meter.cc:220 generic_pluginui.cc:523
-#: generic_pluginui.cc:817 panner_ui.cc:151
+#: automation_time_axis.cc:310 automation_time_axis.cc:362
+#: automation_time_axis.cc:556 gain_meter.cc:230 generic_pluginui.cc:590
+#: generic_pluginui.cc:934 panner_ui.cc:151
 msgid "Automation|Manual"
 msgstr "Manuel"
 
-#: automation_time_axis.cc:310 automation_time_axis.cc:371
-#: automation_time_axis.cc:559 editor.cc:1904 editor.cc:1981
-#: editor_actions.cc:122 editor_actions.cc:1920 gain_meter.cc:223
-#: generic_pluginui.cc:99 generic_pluginui.cc:526 generic_pluginui.cc:819
-#: midi_time_axis.cc:1606 midi_time_axis.cc:1609 midi_time_axis.cc:1612
+#: automation_time_axis.cc:312 automation_time_axis.cc:373
+#: automation_time_axis.cc:561 editor.cc:2033 editor.cc:2111
+#: editor_actions.cc:125 editor_actions.cc:1937 gain_meter.cc:232
+#: generic_pluginui.cc:100 generic_pluginui.cc:593 generic_pluginui.cc:936
+#: midi_time_axis.cc:1610 midi_time_axis.cc:1613 midi_time_axis.cc:1616
 #: panner_ui.cc:154
 msgid "Play"
 msgstr "Lire"
 
-#: automation_time_axis.cc:312 automation_time_axis.cc:382
-#: automation_time_axis.cc:564 gain_meter.cc:226 generic_pluginui.cc:101
-#: generic_pluginui.cc:529 generic_pluginui.cc:821 panner_ui.cc:157
+#: automation_time_axis.cc:314 automation_time_axis.cc:384
+#: automation_time_axis.cc:566 gain_meter.cc:234 generic_pluginui.cc:102
+#: generic_pluginui.cc:596 generic_pluginui.cc:938 panner_ui.cc:157
 msgid "Write"
 msgstr "Écrire"
 
-#: automation_time_axis.cc:314 automation_time_axis.cc:393
-#: automation_time_axis.cc:569 gain_meter.cc:229 generic_pluginui.cc:103
-#: generic_pluginui.cc:532 generic_pluginui.cc:823 panner_ui.cc:160
+#: automation_time_axis.cc:316 automation_time_axis.cc:395
+#: automation_time_axis.cc:571 gain_meter.cc:236 generic_pluginui.cc:104
+#: generic_pluginui.cc:599 generic_pluginui.cc:940 panner_ui.cc:160
 msgid "Touch"
 msgstr "Reprendre"
 
-#: automation_time_axis.cc:404 generic_pluginui.cc:535 meter_patterns.cc:112
+#: automation_time_axis.cc:406 generic_pluginui.cc:602 meter_patterns.cc:118
 msgid "???"
 msgstr "???"
 
-#: automation_time_axis.cc:445
+#: automation_time_axis.cc:447
 msgid "clear automation"
 msgstr "effacer l'automation"
 
-#: automation_time_axis.cc:543 editor_actions.cc:645 editor_markers.cc:902
-#: location_ui.cc:57 plugin_selector.cc:86 route_time_axis.cc:854
-msgid "Hide"
-msgstr "Cacher"
-
-#: automation_time_axis.cc:545
+#: automation_time_axis.cc:547 rc_option_editor.cc:2916
+#: rc_option_editor.cc:2921 rc_option_editor.cc:2967 rc_option_editor.cc:2972
 msgid "Clear"
 msgstr "Effacer"
 
-#: automation_time_axis.cc:576
+#: automation_time_axis.cc:578
 msgid "State"
 msgstr "État"
 
-#: automation_time_axis.cc:592
+#: automation_time_axis.cc:594
 #, fuzzy
 msgid "Discrete"
-msgstr "Discret"
+msgstr "Discontinu"
 
-#: automation_time_axis.cc:598 export_format_dialog.cc:485
+#: automation_time_axis.cc:600 export_format_dialog.cc:552
 msgid "Linear"
 msgstr "Linéaire"
 
-#: automation_time_axis.cc:604 rhythm_ferret.cc:109 shuttle_control.cc:197
+#: automation_time_axis.cc:606 rhythm_ferret.cc:118 shuttle_control.cc:224
 msgid "Mode"
 msgstr "Mode"
 
@@ -2487,47 +2925,46 @@ msgstr "Mode"
 msgid "Disassociate"
 msgstr "Désassocier"
 
-# We can do better
 #: bundle_manager.cc:186
-#, fuzzy
 msgid "Edit Bundle"
-msgstr "Editer le groupe"
+msgstr "Éditer le groupe"
 
-# Sens?
 #: bundle_manager.cc:201
-#, fuzzy
 msgid "Direction:"
-msgstr "Direction :"
+msgstr "Sens :"
 
-#: bundle_manager.cc:206 bundle_manager.cc:210 engine_dialog.cc:662
-#: mixer_strip.cc:162 mixer_strip.cc:367 mixer_strip.cc:2240
-#: rc_option_editor.cc:2326
+#: bundle_manager.cc:206 bundle_manager.cc:210 engine_dialog.cc:976
+#: mixer_strip.cc:175 mixer_strip.cc:392 mixer_strip.cc:2451
+#: rc_option_editor.cc:3135
 msgid "Input"
 msgstr "Entrée"
 
 #: bundle_manager.cc:207 bundle_manager.cc:212 bundle_manager.cc:246
-#: engine_dialog.cc:664 mixer_strip.cc:166 mixer_strip.cc:371
-#: mixer_strip.cc:2243 rc_option_editor.cc:2330
+#: engine_dialog.cc:978 mixer_strip.cc:179 mixer_strip.cc:396
+#: mixer_strip.cc:2454 monitor_section.cc:296 monitor_section.cc:300
+#: rc_option_editor.cc:3139
 msgid "Output"
 msgstr "Sortie"
 
-#: bundle_manager.cc:265 editor.cc:1945 editor_actions.cc:94
-#: editor_actions.cc:104 rc_option_editor.cc:1087 rc_option_editor.cc:1094
+#: bundle_manager.cc:265 editor.cc:2075 editor_actions.cc:97
+#: editor_actions.cc:107 lua_script_manager.cc:33 rc_option_editor.cc:2928
+#: rc_option_editor.cc:2942
 msgid "Edit"
 msgstr "Édition"
 
-#: bundle_manager.cc:266 editor.cc:5902 editor.cc:5930 editor_actions.cc:338
-#: editor_actions.cc:339 editor_actions.cc:405 plugin_ui.cc:420
-#: processor_box.cc:2458 route_time_axis.cc:859
+#: bundle_manager.cc:266 editor.cc:5962 editor.cc:5992 editor_actions.cc:360
+#: editor_actions.cc:361 luawindow.cc:101 plugin_ui.cc:420
+#: processor_box.cc:3669 processor_box.cc:3671
 msgid "Delete"
 msgstr "Supprimer"
 
-#: bundle_manager.cc:272 bundle_manager.cc:439 editor_route_groups.cc:97
-#: editor_routes.cc:206 midi_list_editor.cc:107 session_metadata_dialog.cc:646
+#: bundle_manager.cc:272 bundle_manager.cc:439 editor_route_groups.cc:98
+#: editor_routes.cc:233 lua_script_manager.cc:42 lua_script_manager.cc:76
+#: midi_list_editor.cc:107 session_metadata_dialog.cc:649
 msgid "Name"
 msgstr "Nom"
 
-#: bundle_manager.cc:283
+#: bundle_manager.cc:283 luawindow.cc:566
 msgid "New"
 msgstr "Nouveau"
 
@@ -2544,6 +2981,38 @@ msgstr "Ajouter un canal"
 msgid "Rename Channel"
 msgstr "Renommer le canal"
 
+#: color_theme_manager.cc:58
+msgid "Restore Defaults"
+msgstr "Restaurer la configuration par défaut"
+
+#: color_theme_manager.cc:62
+msgid "Color Theme"
+msgstr ""
+
+#: color_theme_manager.cc:126
+msgid "Object"
+msgstr "Objet"
+
+#: color_theme_manager.cc:129 route_group_dialog.cc:53 route_group_dialog.cc:81
+msgid "Color"
+msgstr "Couleur"
+
+#: color_theme_manager.cc:151
+msgid "Items"
+msgstr "Éléments"
+
+#: color_theme_manager.cc:152
+msgid "Palette"
+msgstr "Palette"
+
+#: color_theme_manager.cc:153
+msgid "Transparency"
+msgstr "Transparence"
+
+#: color_theme_manager.cc:475
+msgid "Color Palette"
+msgstr "Palette de couleurs"
+
 #: configinfo.cc:28
 msgid "Build Configuration"
 msgstr "Configuration de compilation"
@@ -2556,6 +3025,42 @@ msgstr "Point de contrôle"
 msgid "Value"
 msgstr "Valeur"
 
+#: control_slave_ui.cc:50 mixer_ui.cc:254
+msgid "Control Masters"
+msgstr ""
+
+#: control_slave_ui.cc:54
+msgid "-vca-"
+msgstr ""
+
+#: control_slave_ui.cc:211
+msgid "Unassign All"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:35
+msgid "Duplicate Tracks & Busses"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:36
+msgid "Copy playlists"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:37
+msgid "Create new (empty) playlists"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:38
+msgid "Share playlists"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:41
+msgid "Duplicate each track/bus this number of times:"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:176
+msgid "1 or more tracks/busses could not be duplicated"
+msgstr ""
+
 #: edit_note_dialog.cc:42
 msgid "Note"
 msgstr "Note"
@@ -2593,663 +3098,666 @@ msgstr "Hauteur"
 msgid "Velocity"
 msgstr "Vélocité"
 
-#: edit_note_dialog.cc:88 patch_change_dialog.cc:66
+#: edit_note_dialog.cc:88 export_report.cc:246 export_report.cc:688
+#: patch_change_dialog.cc:66
 msgid "Time"
 msgstr "Temps"
 
-#: edit_note_dialog.cc:98 editor_regions.cc:115
-#: export_timespan_selector.cc:378 export_timespan_selector.cc:440
-#: location_ui.cc:320 midi_list_editor.cc:115 time_info_box.cc:108
+#: edit_note_dialog.cc:99 editor_regions.cc:162 export_timespan_selector.cc:375
+#: export_timespan_selector.cc:437 location_ui.cc:322 midi_list_editor.cc:115
+#: time_info_box.cc:102
 msgid "Length"
 msgstr "Durée"
 
-#: edit_note_dialog.cc:165
+#: edit_note_dialog.cc:166
 msgid "edit note"
 msgstr "éditer la note"
 
-#: editor.cc:147
+#: editor.cc:160
 msgid "CD Frames"
 msgstr "Trames de CD"
 
-#: editor.cc:148
+#: editor.cc:161
 msgid "TC Frames"
 msgstr "Trames de TC"
 
-#: editor.cc:149
+#: editor.cc:162
 msgid "TC Seconds"
 msgstr "Secondes de TC"
 
-#: editor.cc:150
+#: editor.cc:163
 msgid "TC Minutes"
 msgstr "Minutes de TC"
 
-#: editor.cc:151
+#: editor.cc:164
 msgid "Seconds"
 msgstr "Secondes"
 
-#: editor.cc:152
+#: editor.cc:165
 msgid "Minutes"
 msgstr "Minutes"
 
-#: editor.cc:153 quantize_dialog.cc:37 quantize_dialog.cc:141
+#: editor.cc:166 quantize_dialog.cc:37
 msgid "Beats/128"
 msgstr "128ème de temps"
 
-#: editor.cc:154 quantize_dialog.cc:38 quantize_dialog.cc:143
+#: editor.cc:167 quantize_dialog.cc:38
 msgid "Beats/64"
 msgstr "64ème de temps"
 
-#: editor.cc:155 quantize_dialog.cc:39 quantize_dialog.cc:145
+#: editor.cc:168 quantize_dialog.cc:39
 msgid "Beats/32"
 msgstr "32ème de temps"
 
-#: editor.cc:156
+#: editor.cc:169 quantize_dialog.cc:40
 msgid "Beats/28"
 msgstr "28ème de temps"
 
-#: editor.cc:157
+#: editor.cc:170 quantize_dialog.cc:41
 msgid "Beats/24"
 msgstr "24ème de temps"
 
-#: editor.cc:158
+#: editor.cc:171 quantize_dialog.cc:42
 msgid "Beats/20"
 msgstr "20ème de temps"
 
-#: editor.cc:159 quantize_dialog.cc:40 quantize_dialog.cc:147
+#: editor.cc:172 quantize_dialog.cc:43
 msgid "Beats/16"
 msgstr "16ème de temps"
 
-#: editor.cc:160
+#: editor.cc:173 quantize_dialog.cc:44
 msgid "Beats/14"
 msgstr "14ème de temps"
 
-#: editor.cc:161
+#: editor.cc:174 quantize_dialog.cc:45
 msgid "Beats/12"
 msgstr "12ème de temps"
 
-#: editor.cc:162
+#: editor.cc:175 quantize_dialog.cc:46
 msgid "Beats/10"
 msgstr "10ème de temps"
 
-#: editor.cc:163 quantize_dialog.cc:41 quantize_dialog.cc:149
+#: editor.cc:176 quantize_dialog.cc:47
 msgid "Beats/8"
 msgstr "8ème de temps"
 
-#: editor.cc:164
+#: editor.cc:177 quantize_dialog.cc:48
 msgid "Beats/7"
 msgstr "7ème de temps"
 
-#: editor.cc:165
+#: editor.cc:178 quantize_dialog.cc:49
 msgid "Beats/6"
 msgstr "6ème de temps"
 
-#: editor.cc:166
+#: editor.cc:179 quantize_dialog.cc:50
 msgid "Beats/5"
 msgstr "5ème de temps"
 
-#: editor.cc:167 quantize_dialog.cc:42 quantize_dialog.cc:151
+#: editor.cc:180 quantize_dialog.cc:51
 msgid "Beats/4"
 msgstr "Quart de temps"
 
-#: editor.cc:168 quantize_dialog.cc:43 quantize_dialog.cc:153
+#: editor.cc:181 quantize_dialog.cc:52
 msgid "Beats/3"
 msgstr "Tiers de temps"
 
-#: editor.cc:169 quantize_dialog.cc:44 quantize_dialog.cc:155
+#: editor.cc:182 quantize_dialog.cc:53
 msgid "Beats/2"
 msgstr "Demi temps"
 
-#: editor.cc:170 quantize_dialog.cc:45 quantize_dialog.cc:157
+#: editor.cc:183 quantize_dialog.cc:54
 msgid "Beats"
 msgstr "Temps"
 
-#: editor.cc:171
+#: editor.cc:184
 msgid "Bars"
 msgstr "Mesures"
 
-#: editor.cc:172
+#: editor.cc:185
 msgid "Marks"
 msgstr "Repères"
 
-#: editor.cc:173
+#: editor.cc:186
 msgid "Region starts"
 msgstr "Débuts de régions"
 
-#: editor.cc:174
+#: editor.cc:187
 msgid "Region ends"
 msgstr "Fins de régions"
 
-#: editor.cc:175
+#: editor.cc:188
 msgid "Region syncs"
 msgstr "Synchros de régions"
 
-#: editor.cc:176
+#: editor.cc:189
 msgid "Region bounds"
 msgstr "Limites de régions"
 
-#: editor.cc:181 editor_actions.cc:510
+#: editor.cc:194 editor_actions.cc:551
 msgid "No Grid"
 msgstr "Pas de grille"
 
-#: editor.cc:182 editor_actions.cc:511
+#: editor.cc:195 editor_actions.cc:552
 msgid "Grid"
 msgstr "Grille"
 
-#: editor.cc:183 editor_actions.cc:512
+#: editor.cc:196 editor_actions.cc:553
 msgid "Magnetic"
 msgstr "Magnétique"
 
-#: editor.cc:188 editor.cc:206 editor_actions.cc:121 editor_actions.cc:493
+#: editor.cc:201 editor.cc:219 editor_actions.cc:124 editor_actions.cc:534
 msgid "Playhead"
 msgstr "Tête de lecture"
 
-#: editor.cc:189 editor_actions.cc:495
+#: editor.cc:202 editor_actions.cc:536
 msgid "Marker"
 msgstr "Repère"
 
-#: editor.cc:190 editor.cc:207 editor_actions.cc:494
+#: editor.cc:203 editor.cc:220 editor_actions.cc:535
 msgid "Mouse"
 msgstr "Souris"
 
-#: editor.cc:195 editor_actions.cc:502
+#: editor.cc:208 editor_actions.cc:543
 msgid "Slide"
 msgstr "Glissant"
 
-#: editor.cc:196
+#: editor.cc:209
 msgid "Splice"
 msgstr "Collant"
 
-# Contexte?
-#: editor.cc:197 editor_actions.cc:501
+#: editor.cc:210 editor_actions.cc:542
 #, fuzzy
 msgid "Ripple"
-msgstr "Ondulation"
+msgstr "Propagation"
 
-#: editor.cc:198 editor_actions.cc:157 editor_actions.cc:503
-#: editor_actions.cc:1789 editor_markers.cc:905 editor_rulers.cc:260
-#: location_ui.cc:58 mixer_strip.cc:195 mixer_strip.cc:2028
+#: editor.cc:211 editor_actions.cc:1806 editor_markers.cc:910
+#: editor_rulers.cc:259 location_ui.cc:62
 msgid "Lock"
 msgstr "Verrouillé"
 
-#: editor.cc:203 mono_panner_editor.cc:42
+#: editor.cc:216 mono_panner_editor.cc:44
 msgid "Left"
 msgstr "Gauche"
 
-#: editor.cc:204 mono_panner_editor.cc:47
+#: editor.cc:217 mono_panner_editor.cc:49
 msgid "Right"
 msgstr "Droite"
 
-#: editor.cc:205
+#: editor.cc:218
 msgid "Center"
 msgstr "Centre"
 
-#: editor.cc:208 editor.cc:3231
+#: editor.cc:221
 msgid "Edit point"
 msgstr "Point d'édition"
 
-#: editor.cc:214
+#: editor.cc:227
 msgid "Mushy"
 msgstr "En bouillie"
 
-#: editor.cc:215
+#: editor.cc:228
 msgid "Smooth"
 msgstr "Lisse"
 
-#: editor.cc:216
+#: editor.cc:229
 msgid "Balanced multitimbral mixture"
 msgstr "Mélange polyphonique équilibré"
 
-#: editor.cc:217
+#: editor.cc:230
 msgid "Unpitched percussion with stable notes"
 msgstr "Percussion atonale à sons stables"
 
-#: editor.cc:218
+#: editor.cc:231
 msgid "Crisp monophonic instrumental"
 msgstr "Instrumental monophonique précis"
 
-#: editor.cc:219
+#: editor.cc:232
 msgid "Unpitched solo percussion"
 msgstr "Percussion solo atonale"
 
-#: editor.cc:220
+#: editor.cc:233
 msgid "Resample without preserving pitch"
 msgstr "Rééchantillonage avec modification de la tonalité"
 
-#: editor.cc:256
+#: editor.cc:319
 msgid "Mins:Secs"
 msgstr "Mins:Secs"
 
-#: editor.cc:262
+#: editor.cc:325
 msgid "Location Markers"
 msgstr "Repères de position"
 
-#: editor.cc:263
+#: editor.cc:326
 msgid "Range Markers"
 msgstr "Repères d'intervalle"
 
-#: editor.cc:264
+#: editor.cc:327
 msgid "Loop/Punch Ranges"
 msgstr "Intervalles boucle/« punch »"
 
-#: editor.cc:265 editor_actions.cc:565
+#: editor.cc:328 editor_actions.cc:606
 msgid "CD Markers"
 msgstr "Repères de CD"
 
-#: editor.cc:266
+#: editor.cc:329
 msgid "Video Timeline"
 msgstr "« Timeline » vidéo"
 
-#: editor.cc:283
+#: editor.cc:386
 msgid "mode"
 msgstr "mode"
 
-#: editor.cc:459 editor_actions.cc:114 editor_actions.cc:564
+#: editor.cc:535 editor_actions.cc:117 editor_actions.cc:605
 msgid "Markers"
 msgstr "Repères"
 
-#: editor.cc:577 rc_option_editor.cc:1939
+#: editor.cc:653 rc_option_editor.cc:2527
 msgid "Regions"
 msgstr "Régions"
 
-#: editor.cc:578
+#: editor.cc:654
 msgid "Tracks & Busses"
 msgstr "Pistes et bus"
 
-#: editor.cc:579
+#: editor.cc:655
 msgid "Snapshots"
 msgstr "Clichés"
 
-#: editor.cc:580
+#: editor.cc:656
 msgid "Track & Bus Groups"
 msgstr "Groupes de pistes et bus"
 
-#: editor.cc:581
+#: editor.cc:657
 msgid "Ranges & Marks"
 msgstr "Intervalles et repères"
 
-#: editor.cc:728 editor.cc:5754 rc_option_editor.cc:1619
-#: rc_option_editor.cc:1627 rc_option_editor.cc:1635 rc_option_editor.cc:1643
-#: rc_option_editor.cc:1667 rc_option_editor.cc:1679 rc_option_editor.cc:1681
-#: rc_option_editor.cc:1689 rc_option_editor.cc:1697 rc_option_editor.cc:1717
-#: rc_option_editor.cc:1729 rc_option_editor.cc:1731 rc_option_editor.cc:1733
-#: rc_option_editor.cc:1741 rc_option_editor.cc:1749 rc_option_editor.cc:1757
-#: rc_option_editor.cc:1772 rc_option_editor.cc:1776 rc_option_editor.cc:1800
-msgid "Editor"
-msgstr "Éditeur"
-
-#: editor.cc:1331 editor.cc:4735 editor_actions.cc:134 editor_actions.cc:1865
+#: editor.cc:1333 editor.cc:4737 editor_actions.cc:137 editor_actions.cc:1882
 msgid "Loop"
 msgstr "Boucle"
 
-#: editor.cc:1337 editor.cc:4762 editor_actions.cc:135 time_info_box.cc:68
+#: editor.cc:1339 editor.cc:4764 editor_actions.cc:138 time_info_box.cc:62
 msgid "Punch"
 msgstr "« Punch »"
 
-#: editor.cc:1449 rc_option_editor.cc:1661
+#: editor.cc:1474 rc_option_editor.cc:2299
 msgid "Linear (for highly correlated material)"
-msgstr "Linéaire (pour matériaux fortement corrélé)"
+msgstr "Linéaire (pour matériau fortement corrélé)"
 
-#: editor.cc:1459 rc_option_editor.cc:1662
+#: editor.cc:1484 rc_option_editor.cc:2300
 msgid "Constant power"
 msgstr "Puissance constante"
 
-#: editor.cc:1468 rc_option_editor.cc:1663
+#: editor.cc:1493 rc_option_editor.cc:2301
 msgid "Symmetric"
 msgstr "Symétrique"
 
-#: editor.cc:1478 rc_option_editor.cc:1664
+#: editor.cc:1503 rc_option_editor.cc:2302
 msgid "Slow"
 msgstr "Lent"
 
-#: editor.cc:1487 rc_option_editor.cc:1665 sfdb_ui.cc:1771 sfdb_ui.cc:1881
+#: editor.cc:1512 rc_option_editor.cc:2303 sfdb_ui.cc:1737 sfdb_ui.cc:1847
 msgid "Fast"
 msgstr "Rapide"
 
-#: editor.cc:1509 editor.cc:1534
+#: editor.cc:1534 editor.cc:1559
 msgid "Deactivate"
 msgstr "Désactiver"
 
-#: editor.cc:1511 editor.cc:1536
+#: editor.cc:1536 editor.cc:1561
 msgid "Activate"
 msgstr "Activer"
 
-#: editor.cc:1637 editor.cc:1645 editor_ops.cc:3824
+#: editor.cc:1662 editor.cc:1670 editor_ops.cc:3921
 msgid "Freeze"
 msgstr "Bloquer"
 
-#: editor.cc:1641
+#: editor.cc:1666
 msgid "Unfreeze"
 msgstr "Débloquer"
 
-#: editor.cc:1780
+#: editor.cc:1766
+msgid "Region Loudness Analysis"
+msgstr ""
+
+#: editor.cc:1785 editor.cc:1834
+msgid "Audio Report/Analysis"
+msgstr ""
+
+#: editor.cc:1815
+msgid "Range Loudness Analysis"
+msgstr ""
+
+#: editor.cc:1901
 msgid "Selected Regions"
 msgstr "régions sélectionnées"
 
-#: editor.cc:1816 editor_markers.cc:940
+#: editor.cc:1945 editor_markers.cc:945
 msgid "Play Range"
 msgstr "Lire l'intervalle"
 
-#: editor.cc:1817 editor_markers.cc:943
+#: editor.cc:1946 editor_markers.cc:948
 msgid "Loop Range"
 msgstr "Boucler sur l'intervalle"
 
-#: editor.cc:1820 editor_markers.cc:950
+#: editor.cc:1949 editor_markers.cc:953
 msgid "Zoom to Range"
 msgstr "Zoomer sur l'intervalle"
 
-#: editor.cc:1829 editor_actions.cc:369
+#: editor.cc:1952
+msgid "Loudness Analysis"
+msgstr ""
+
+#: editor.cc:1959 editor_actions.cc:401
 msgid "Move Range Start to Previous Region Boundary"
 msgstr "Déplacer le début de l'intervalle à la bordure de la région précédente"
 
-#: editor.cc:1836 editor_actions.cc:376
+#: editor.cc:1966 editor_actions.cc:408
 msgid "Move Range Start to Next Region Boundary"
 msgstr "Déplacer le début de l'intervalle à la bordure de la région suivante"
 
-#: editor.cc:1843 editor_actions.cc:383
+#: editor.cc:1973 editor_actions.cc:415
 msgid "Move Range End to Previous Region Boundary"
 msgstr "Déplacer la fin de l'intervalle à la bordure de la région précédente"
 
-#: editor.cc:1850 editor_actions.cc:390
+#: editor.cc:1980 editor_actions.cc:422
 msgid "Move Range End to Next Region Boundary"
 msgstr "Déplacer la fin de l'intervalle à la bordure de la région suivante"
 
-#: editor.cc:1856 editor_actions.cc:133 editor_actions.cc:325
+#: editor.cc:1986 editor_actions.cc:136 editor_actions.cc:347
 msgid "Separate"
 msgstr "Séparer"
 
-#: editor.cc:1857
+#: editor.cc:1987
 msgid "Convert to Region in Region List"
 msgstr "Convertir en région (vers la liste des régions)"
 
-#: editor.cc:1860 editor_markers.cc:970
+#: editor.cc:1990 editor_markers.cc:973
 msgid "Select All in Range"
 msgstr "Sélectionner tout dans l'intervalle"
 
-#: editor.cc:1863 editor_actions.cc:297
-#, fuzzy
+#: editor.cc:1993 editor_actions.cc:319
 msgid "Set Loop from Selection"
-msgstr "Régler l'intervalle de boucle sur la sélection"
+msgstr "Convertir la sélection en marqueurs de début et fin de boucle"
 
-#: editor.cc:1864 editor_actions.cc:298
-#, fuzzy
+#: editor.cc:1994 editor_actions.cc:320
 msgid "Set Punch from Selection"
-msgstr "Régler l'intervalle de « punch » sur la sélection"
+msgstr "Convertir la sélection en marqueurs de début et fin de « punch »"
 
-#: editor.cc:1865 editor_actions.cc:299
+#: editor.cc:1995 editor_actions.cc:321
 msgid "Set Session Start/End from Selection"
-msgstr ""
+msgstr "Convertir la sélection en marqueurs de début et fin de session"
 
-#: editor.cc:1868
+#: editor.cc:1998
 msgid "Add Range Markers"
 msgstr "Ajouter des repères d'intervalle"
 
-#: editor.cc:1871
+#: editor.cc:2001
 msgid "Crop Region to Range"
 msgstr "Rogner la région à l'intervalle"
 
-#: editor.cc:1872
-msgid "Fill Range with Region"
-msgstr "Remplir l'intervalle avec la région"
-
-#: editor.cc:1873 editor_actions.cc:311
+#: editor.cc:2002 editor_actions.cc:333
 msgid "Duplicate Range"
 msgstr "Dupliquer l'intervalle"
 
-#: editor.cc:1876
+#: editor.cc:2005
 msgid "Consolidate Range"
 msgstr "Consolider l'intervalle"
 
-#: editor.cc:1877
-msgid "Consolidate Range With Processing"
-msgstr "Consolider l'intervalle avec traitement"
+#: editor.cc:2006
+msgid "Consolidate Range with Processing"
+msgstr ""
 
 # Jargon
-#: editor.cc:1878
+#: editor.cc:2007
 msgid "Bounce Range to Region List"
 msgstr "« Bouncer » l'intervalle vers la liste des régions"
 
-# Jargon
-#: editor.cc:1879
-msgid "Bounce Range to Region List With Processing"
-msgstr "« Bouncer » l'intervalle vers la liste des régions avec traitement"
+#: editor.cc:2008
+msgid "Bounce Range to Region List with Processing"
+msgstr ""
 
-#: editor.cc:1880 editor_markers.cc:953
+#: editor.cc:2009 editor_markers.cc:956
 msgid "Export Range..."
 msgstr "Exporter l'intervalle…"
 
-#: editor.cc:1882
+#: editor.cc:2011
 msgid "Export Video Range..."
 msgstr "Exporter l'intervalle vidéo…"
 
-#: editor.cc:1898 editor.cc:1979 editor_actions.cc:303
-msgid "Play From Edit Point"
-msgstr "Lire au point d'édition"
+#: editor.cc:2027 editor.cc:2109 editor_actions.cc:325
+msgid "Play from Edit Point"
+msgstr ""
 
-#: editor.cc:1899 editor.cc:1980
-msgid "Play From Start"
-msgstr "Lire depuis le début"
+#: editor.cc:2028 editor.cc:2110
+msgid "Play from Start"
+msgstr ""
 
-#: editor.cc:1900
+#: editor.cc:2029
 msgid "Play Region"
 msgstr "Lire la région"
 
-#: editor.cc:1902
+#: editor.cc:2031
 msgid "Loop Region"
 msgstr "Lire la région en boucle"
 
-#: editor.cc:1912 editor.cc:1989
+#: editor.cc:2041 editor.cc:2119
 msgid "Select All in Track"
 msgstr "Sélectionner tout dans la piste"
 
-#: editor.cc:1913 editor.cc:1990 editor_actions.cc:194
+#: editor.cc:2042 editor.cc:2120 editor_actions.cc:196
 msgid "Select All Objects"
 msgstr "Sélectionner tous les objets"
 
-#: editor.cc:1914 editor.cc:1991
+#: editor.cc:2043 editor.cc:2121
 msgid "Invert Selection in Track"
 msgstr "Inverser la sélection dans la piste"
 
-#: editor.cc:1915 editor.cc:1992 editor_actions.cc:197
+#: editor.cc:2044 editor.cc:2122 editor_actions.cc:199
 msgid "Invert Selection"
 msgstr "Inverser la sélection"
 
-#: editor.cc:1917
+#: editor.cc:2046 editor_actions.cc:201
 msgid "Set Range to Loop Range"
 msgstr "Régler l'intervalle sur l'intervalle de boucle"
 
-#: editor.cc:1918
+#: editor.cc:2047 editor_actions.cc:202
 msgid "Set Range to Punch Range"
 msgstr "Régler l'intervalle sur l'intervalle de « punch »"
 
-#: editor.cc:1920 editor.cc:1994 editor_actions.cc:199 editor_actions.cc:200
+#: editor.cc:2048 editor_actions.cc:203
+msgid "Set Range to Selected Regions"
+msgstr ""
+
+#: editor.cc:2050 editor.cc:2124 editor_actions.cc:205 editor_actions.cc:206
 msgid "Select All After Edit Point"
 msgstr "Tout après le point d'édition"
 
-#: editor.cc:1921 editor.cc:1995 editor_actions.cc:201 editor_actions.cc:202
+#: editor.cc:2051 editor.cc:2125 editor_actions.cc:207 editor_actions.cc:208
 msgid "Select All Before Edit Point"
 msgstr "Tout avant le point d'édition"
 
-#: editor.cc:1922 editor.cc:1996
+#: editor.cc:2052 editor.cc:2126
 msgid "Select All After Playhead"
 msgstr "Tout après la tête de lecture"
 
-#: editor.cc:1923 editor.cc:1997
+#: editor.cc:2053 editor.cc:2127
 msgid "Select All Before Playhead"
 msgstr "Tout avant la tête de lecture"
 
-#: editor.cc:1924
+#: editor.cc:2054
 msgid "Select All Between Playhead and Edit Point"
 msgstr "Sélectionner tout entre la tête de lecture et le point d'édition"
 
-#: editor.cc:1925
+#: editor.cc:2055
 msgid "Select All Within Playhead and Edit Point"
 msgstr "Tout sélectionner entre la tête de lecture et le point d'édition"
 
-#: editor.cc:1926
+#: editor.cc:2056
 msgid "Select Range Between Playhead and Edit Point"
 msgstr "Sélectionner l'intervalle entre la tête et le point d'édition"
 
-#: editor.cc:1928 editor.cc:1999 editor_actions.cc:131 editor_actions.cc:132
+#: editor.cc:2058 editor.cc:2129 editor_actions.cc:134 editor_actions.cc:135
 msgid "Select"
 msgstr "Sélectionner"
 
-#: editor.cc:1936 editor.cc:2007 editor_actions.cc:337 processor_box.cc:2451
+#: editor.cc:2066 editor.cc:2137 editor_actions.cc:359 processor_box.cc:3665
 msgid "Cut"
 msgstr "Couper"
 
-#: editor.cc:1937 editor.cc:2008 editor_actions.cc:341 processor_box.cc:2454
+#: editor.cc:2067 editor.cc:2138 editor_actions.cc:363 processor_box.cc:3667
 msgid "Copy"
 msgstr "Copier"
 
-#: editor.cc:1938 editor.cc:2009 editor_actions.cc:342 processor_box.cc:2462
+#: editor.cc:2068 editor.cc:2139 editor_actions.cc:364 processor_box.cc:3679
 msgid "Paste"
 msgstr "Coller"
 
-#: editor.cc:1942 editor_actions.cc:91
+#: editor.cc:2072 editor_actions.cc:94
 msgid "Align"
 msgstr "Aligner"
 
-#: editor.cc:1943
+#: editor.cc:2073
 msgid "Align Relative"
 msgstr "Aligner relativement"
 
-#: editor.cc:1950
+#: editor.cc:2080
 msgid "Insert Selected Region"
 msgstr "Insérer la région sélectionnée"
 
-#: editor.cc:1951
+#: editor.cc:2081
 msgid "Insert Existing Media"
 msgstr "Insérer des fichiers audio externes"
 
-#: editor.cc:1960 editor.cc:2016
+#: editor.cc:2090 editor.cc:2146
 msgid "Nudge Entire Track Later"
 msgstr "Décaler toute la piste vers la droite"
 
-#: editor.cc:1961 editor.cc:2017
+#: editor.cc:2091 editor.cc:2147
 msgid "Nudge Track After Edit Point Later"
 msgstr "Décaler la piste vers la droite après le point d'édition"
 
-#: editor.cc:1962 editor.cc:2018
+#: editor.cc:2092 editor.cc:2148
 msgid "Nudge Entire Track Earlier"
 msgstr "Décaler toute la piste vers la gauche"
 
-#: editor.cc:1963 editor.cc:2019
+#: editor.cc:2093 editor.cc:2149
 msgid "Nudge Track After Edit Point Earlier"
 msgstr "Décaler la piste vers la gauche après le point d'édition"
 
-#: editor.cc:1965 editor.cc:2021
+#: editor.cc:2095 editor.cc:2151
 msgid "Nudge"
 msgstr "Décaler"
 
-#: editor.cc:2235
+#: editor.cc:2353
 msgid ""
 "Playhead position stored with a negative value - ignored (use zero instead)"
 msgstr ""
+"Valeur de position de tête de lecture négative - ignorée (placée à zéro)"
 
-#: editor.cc:3006 editor.cc:3707 editor.cc:3778 midi_channel_selector.cc:157
+#: editor.cc:3115 editor.cc:3775 editor.cc:3846 midi_channel_selector.cc:157
 #: midi_channel_selector.cc:395 midi_channel_selector.cc:431
 msgid "All"
 msgstr "Tout"
 
-#: editor.cc:3210
-#, fuzzy
-msgid "Smart Mode (add Range functions to Grab mode)"
-msgstr "Mode Smart (ajoute des fonctions d'intervalle au mode Object)"
+#: editor.cc:3280
+msgid "Smart Mode (add range functions to Grab Mode)"
+msgstr ""
 
-#: editor.cc:3211
-#, fuzzy
+#: editor.cc:3281
 msgid "Grab Mode (select/move objects)"
-msgstr "Mode Objet (sélectionner/déplacer des objets)"
+msgstr "Mode Attraper (sélectionner/déplacer des objets)"
 
-#: editor.cc:3212
-#, fuzzy
+#: editor.cc:3282
 msgid "Cut Mode (split regions)"
-msgstr "Mode découpage (séparation des régions)"
+msgstr "Mode Couper (séparation des régions)"
 
-#: editor.cc:3213
-#, fuzzy
+#: editor.cc:3283
 msgid "Range Mode (select time ranges)"
-msgstr "Mode Intervalles (sélectionner/déplacer des Intervalles)"
+msgstr "Mode Intervalle (sélectionner/déplacer des Intervalles)"
 
-#: editor.cc:3214
+#: editor.cc:3284
 msgid "Draw Mode (draw and edit gain/notes/automation)"
-msgstr ""
+msgstr "Mode Dessin (dessiner et modifier le gain, les notes, l'automation)"
 
-#: editor.cc:3215
+#: editor.cc:3285
 msgid "Stretch Mode (time-stretch audio and midi regions, preserving pitch)"
 msgstr ""
+"Mode Étirement (modifie la durée des régions audio et midi en préservant la "
+"tonalité)"
 
-#: editor.cc:3216
-#, fuzzy
+#: editor.cc:3286
 msgid "Audition Mode (listen to regions)"
-msgstr "Écouter des Régions spécifiques"
+msgstr "Mode Écoute (écouter des régions spécifiques)"
 
-#: editor.cc:3217
-msgid "Internal Edit Mode (edit notes and gain curves inside regions)"
-msgstr ""
+#: editor.cc:3287
+msgid "Internal Edit Mode (edit notes and automation points)"
+msgstr "Mode Édition interne (éditer les notes et les points d'automation)"
 
-#: editor.cc:3218
+#: editor.cc:3288
 msgid ""
 "Groups: click to (de)activate\n"
 "Context-click for other operations"
 msgstr ""
 "Groupes : cliquer pour (dés)activer\n"
-"un groupe.\n"
-"Clic droit pour les autres options."
+"Clic droit pour les autres options"
 
-#: editor.cc:3219
+#: editor.cc:3289
 msgid "Nudge Region/Selection Later"
 msgstr "Décaler la région/sélection vers la droite"
 
-#: editor.cc:3220
+#: editor.cc:3290
 msgid "Nudge Region/Selection Earlier"
 msgstr "Décaler la région/sélection vers la gauche"
 
-#: editor.cc:3221 editor_actions.cc:262
+#: editor.cc:3291 editor_actions.cc:272
 msgid "Zoom In"
 msgstr "Zoom avant"
 
-#: editor.cc:3222 editor_actions.cc:261
+#: editor.cc:3292 editor_actions.cc:271
 msgid "Zoom Out"
 msgstr "Zoom arrière"
 
-#: editor.cc:3223
+#: editor.cc:3293
 msgid "Zoom to Time Scale"
 msgstr "Zoomer à l'échelle de temps"
 
-#: editor.cc:3224 editor.cc:3729 editor_actions.cc:263
+#: editor.cc:3294 editor.cc:3797 editor_actions.cc:273
 msgid "Zoom to Session"
 msgstr "Montrer toute la session"
 
-#: editor.cc:3225
-msgid "Zoom focus"
+#: editor.cc:3295 editor_actions.cc:115 editor_actions.cc:148
+msgid "Zoom Focus"
 msgstr "Zoomer sur"
 
-#: editor.cc:3226
+#: editor.cc:3296
 msgid "Expand Tracks"
 msgstr "Agrandir la taille des pistes"
 
-#: editor.cc:3227
+#: editor.cc:3297
 msgid "Shrink Tracks"
 msgstr "Réduire la taille des pistes"
 
-#: editor.cc:3228
+#: editor.cc:3298
 msgid "Number of visible tracks"
 msgstr "Nombre de pistes visibles"
 
-#: editor.cc:3229
+#: editor.cc:3299
 msgid "Snap/Grid Units"
 msgstr "Unités d'alignement/grille"
 
-#: editor.cc:3230
+#: editor.cc:3300
 msgid "Snap/Grid Mode"
 msgstr "Mode d'alignement/grille"
 
-#: editor.cc:3232
+#: editor.cc:3301 editor_actions.cc:101
+msgid "Edit Point"
+msgstr "Point d'édition"
+
+#: editor.cc:3302
 msgid "Edit Mode"
 msgstr "Mode d'édition"
 
-#: editor.cc:3233
+#: editor.cc:3303
 msgid ""
 "Nudge Clock\n"
 "(controls distance used to nudge regions and selections)"
@@ -3257,125 +3765,124 @@ msgstr ""
 "Horloge de décalage\n"
 "(contrôle la distance utilisée pour pousser les régions et les sélections)"
 
-#: editor.cc:3501 editor_actions.cc:313
+#: editor.cc:3571 editor_actions.cc:335
 msgid "Command|Undo"
 msgstr "Annuler"
 
-#: editor.cc:3503
+#: editor.cc:3573
 msgid "Command|Undo (%1)"
 msgstr "Annuler (%1)"
 
-#: editor.cc:3510 editor_actions.cc:315 editor_actions.cc:316
-#: editor_actions.cc:317
+#: editor.cc:3580 editor_actions.cc:337 editor_actions.cc:338
+#: editor_actions.cc:339
 msgid "Redo"
 msgstr "Refaire"
 
-#: editor.cc:3512
+#: editor.cc:3583
 msgid "Redo (%1)"
 msgstr "Refaire (%1)"
 
-#: editor.cc:3531 editor.cc:3555 editor_actions.cc:110 editor_actions.cc:1846
+#: editor.cc:3603 editor.cc:3627 editor_actions.cc:113 editor_actions.cc:1863
 msgid "Duplicate"
 msgstr "Dupliquer"
 
-#: editor.cc:3532
+#: editor.cc:3604
 msgid "Number of duplications:"
 msgstr "Nombre de duplications :"
 
-#: editor.cc:3706 route_group_dialog.cc:51 time_info_box.cc:67
+#: editor.cc:3774 route_group_dialog.cc:51 time_info_box.cc:61
 msgid "Selection"
 msgstr "Sélection"
 
-#: editor.cc:3709
+#: editor.cc:3777
 msgid "Fit 1 track"
 msgstr "Ajuster pour 1 piste"
 
-#: editor.cc:3710
+#: editor.cc:3778
 msgid "Fit 2 tracks"
 msgstr "Ajuster pour 2 pistes"
 
-#: editor.cc:3711
+#: editor.cc:3779
 msgid "Fit 4 tracks"
 msgstr "Ajuster pour 4 pistes"
 
-#: editor.cc:3712
+#: editor.cc:3780
 msgid "Fit 8 tracks"
 msgstr "Ajuster pour 8 pistes"
 
-#: editor.cc:3713
+#: editor.cc:3781
 msgid "Fit 16 tracks"
 msgstr "Ajuster pour 16 pistes"
 
-#: editor.cc:3714
+#: editor.cc:3782
 msgid "Fit 24 tracks"
 msgstr "Ajuster pour 24 pistes"
 
-#: editor.cc:3715
+#: editor.cc:3783
 msgid "Fit 32 tracks"
 msgstr "Ajuster pour 32 pistes"
 
-#: editor.cc:3716
+#: editor.cc:3784
 msgid "Fit 48 tracks"
 msgstr "Ajuster pour 48 pistes"
 
-#: editor.cc:3717
+#: editor.cc:3785
 msgid "Fit All tracks"
 msgstr "Ajuster pour toutes les pistes"
 
-#: editor.cc:3718
-#, fuzzy
+#: editor.cc:3786
 msgid "Fit Selection"
-msgstr "Ajuster à la fenêtre"
+msgstr "Ajuster à la sélection"
 
-#: editor.cc:3720
+#: editor.cc:3788 editor_actions.cc:288
 msgid "Zoom to 10 ms"
 msgstr "Zoomer sur 10 ms"
 
-#: editor.cc:3721
+#: editor.cc:3789 editor_actions.cc:289
 msgid "Zoom to 100 ms"
 msgstr "Zoomer sur 100 ms"
 
-#: editor.cc:3722
+#: editor.cc:3790 editor_actions.cc:290
 msgid "Zoom to 1 sec"
 msgstr "Zoomer sur 1 s"
 
-#: editor.cc:3723
+#: editor.cc:3791 editor_actions.cc:291
 msgid "Zoom to 10 sec"
 msgstr "Zoomer sur 10 s"
 
-#: editor.cc:3724
+#: editor.cc:3792 editor_actions.cc:292
 msgid "Zoom to 1 min"
 msgstr "Zoomer sur 1 mn"
 
-#: editor.cc:3725
+#: editor.cc:3793 editor_actions.cc:294
 msgid "Zoom to 10 min"
 msgstr "Zoomer sur 10 mn"
 
-#: editor.cc:3726
+#: editor.cc:3794
 msgid "Zoom to 1 hour"
 msgstr "Zoomer sur 1 h"
 
-#: editor.cc:3727
+#: editor.cc:3795
 msgid "Zoom to 8 hours"
 msgstr "Zoomer sur 8 h"
 
-#: editor.cc:3728
+#: editor.cc:3796
 msgid "Zoom to 24 hours"
 msgstr "Zoomer sur 24 h"
 
-#: editor.cc:3730
+#: editor.cc:3798
 msgid "Zoom to Range/Region Selection"
 msgstr "Zoomer sur l'intervalle / la région sélectionnée"
 
-#: editor.cc:3800
+#: editor.cc:3868
 msgid "*"
 msgstr "*"
 
-#: editor.cc:4120
+#: editor.cc:4135
 msgid "Playlist Deletion"
 msgstr "Suppression de la liste de lecture"
 
-#: editor.cc:4121
+#: editor.cc:4136
 msgid ""
 "Playlist %1 is currently unused.\n"
 "If it is kept, its audio files will not be cleaned.\n"
@@ -3385,1302 +3892,1380 @@ msgstr ""
 "Si vous la conservez, aucun fichier audio qu'elle utilise ne sera nettoyé.\n"
 "Si vous l'effacez, les fichiers audio qu'elle seule utilise seront nettoyés."
 
-#: editor.cc:4131
+#: editor.cc:4146
+msgid "Delete All Unused"
+msgstr ""
+
+#: editor.cc:4147
 msgid "Delete Playlist"
 msgstr "Supprimer la liste de lecture"
 
-#: editor.cc:4132
+#: editor.cc:4148
 msgid "Keep Playlist"
 msgstr "Garder la liste de lecture"
 
-#: editor.cc:4133 editor_audio_import.cc:594 editor_ops.cc:6174
-#: engine_dialog.cc:2083 sfdb_freesound_mootcher.cc:69 processor_box.cc:2219
-#: processor_box.cc:2244
+#: editor.cc:4149
+msgid "Keep Remaining"
+msgstr ""
+
+#: editor.cc:4150 editor_audio_import.cc:600 editor_ops.cc:6530
+#: engine_dialog.cc:2986 sfdb_freesound_mootcher.cc:69 processor_box.cc:3431
+#: processor_box.cc:3456
 msgid "Cancel"
 msgstr "Annuler"
 
-#: editor.cc:4275
+#: editor.cc:4292
 msgid "new playlists"
 msgstr "nouvelles listes de lecture"
 
-#: editor.cc:4291
+#: editor.cc:4308
 msgid "copy playlists"
 msgstr "copier les listes de lecture"
 
-#: editor.cc:4306
+#: editor.cc:4323
 msgid "clear playlists"
 msgstr "effacer les listes de lecture"
 
-#: editor.cc:5046
+#: editor.cc:5048
 msgid "Please wait while %1 loads visual data."
 msgstr "Patienter pendant que %1 charge les données graphiques."
 
-#: editor.cc:5901 editor.cc:5932 editor_markers.cc:985 panner_ui.cc:410
-#: processor_box.cc:2482
+#: editor.cc:5811 editor_actions.cc:479
+msgid "Unset #%1"
+msgstr ""
+
+#: editor.cc:5812 editor_actions.cc:481
+msgid "no action bound"
+msgstr ""
+
+#: editor.cc:5961 editor.cc:5996 editor_markers.cc:998 editor_markers.cc:1018
+#: panner_ui.cc:412 processor_box.cc:3703
 msgid "Edit..."
 msgstr "Éditer…"
 
-#: editor.cc:5934 editor_actions.cc:1941
+#: editor.cc:6002 editor_actions.cc:1842
+msgid "Transpose..."
+msgstr "Transposer…"
+
+#: editor.cc:6006 editor_actions.cc:1959
 msgid "Legatize"
-msgstr ""
+msgstr "Ligaturer"
 
-#: editor.cc:5936 editor_actions.cc:1940
+#: editor.cc:6012 editor_actions.cc:1958
 msgid "Quantize..."
 msgstr "Quantifier…"
 
-#: editor.cc:5938 editor_actions.cc:1943
+#: editor.cc:6015 editor_actions.cc:1961
 msgid "Remove Overlap"
-msgstr ""
+msgstr "Supprimer le recouvrement"
 
-#: editor.cc:5940 editor_actions.cc:1942
+#: editor.cc:6021 editor_actions.cc:1960
 msgid "Transform..."
-msgstr ""
+msgstr "Transformer..."
 
-#: editor_actions.cc:92
+#: editor_actions.cc:95
 msgid "Autoconnect"
 msgstr "Connexions automatiques"
 
-#: editor_actions.cc:93
+#: editor_actions.cc:96
 msgid "Crossfades"
 msgstr "Fondus enchaînés"
 
-#: editor_actions.cc:95
+#: editor_actions.cc:98
 msgid "Move Selected Marker"
 msgstr "Déplacer le repère sélectionné"
 
-#: editor_actions.cc:96
+#: editor_actions.cc:99
 msgid "Select Range Operations"
 msgstr "Opérations sur intervalle de sélection"
 
-#: editor_actions.cc:97
+#: editor_actions.cc:100
 msgid "Select Regions"
 msgstr "Sélection de régions"
 
-#: editor_actions.cc:98
-msgid "Edit Point"
-msgstr "Point d'édition"
-
-#: editor_actions.cc:99
+#: editor_actions.cc:102
 msgid "Fade"
 msgstr "Fondu"
 
 # Context?
-#: editor_actions.cc:100
-#, fuzzy
+#: editor_actions.cc:103
 msgid "Latch"
-msgstr "Loquet"
+msgstr "Verrouillage"
 
-#: editor_actions.cc:101 editor_regions.cc:112 region_editor.cc:46
+#: editor_actions.cc:104 editor_regions.cc:159 region_editor.cc:48
 msgid "Region"
 msgstr "Régions"
 
-#: editor_actions.cc:102
+#: editor_actions.cc:105
 msgid "Layering"
 msgstr "Empilement des régions"
 
-#: editor_actions.cc:103 editor_regions.cc:113 stereo_panner_editor.cc:44
+#: editor_actions.cc:106 editor_regions.cc:160 stereo_panner_editor.cc:46
 msgid "Position"
 msgstr "Position"
 
-#: editor_actions.cc:105 gain_meter.cc:156 gain_meter.cc:825 panner_ui.cc:178
-#: panner_ui.cc:635
+#: editor_actions.cc:108 gain_meter.cc:161 gain_meter.cc:848 panner_ui.cc:178
+#: panner_ui.cc:637 route_time_axis.cc:541
 msgid "Trim"
 msgstr "Rogner"
 
-#: editor_actions.cc:106 editor_actions.cc:126 route_group_dialog.cc:46
+#: editor_actions.cc:109 editor_actions.cc:129 route_group_dialog.cc:46
 msgid "Gain"
 msgstr "Gain"
 
-#: editor_actions.cc:107 editor_actions.cc:563
+#: editor_actions.cc:110 editor_actions.cc:604
 msgid "Ranges"
 msgstr "Intervalles"
 
-#: editor_actions.cc:108 editor_actions.cc:1842 session_option_editor.cc:135
+#: editor_actions.cc:111 editor_actions.cc:1859 session_option_editor.cc:135
 #: session_option_editor.cc:144 session_option_editor.cc:151
+#: session_option_editor.cc:158 session_option_editor.cc:165
 msgid "Fades"
 msgstr "Fondus"
 
-#: editor_actions.cc:111
+#: editor_actions.cc:114
 msgid "Link"
 msgstr "Lien"
 
-#: editor_actions.cc:112 editor_actions.cc:145
-msgid "Zoom Focus"
-msgstr "Zoomer sur"
-
-#: editor_actions.cc:113
+#: editor_actions.cc:116
 msgid "Locate to Markers"
 msgstr "Déplacer aux repères"
 
-#: editor_actions.cc:115
+#: editor_actions.cc:118
 msgid "Meter falloff"
 msgstr "Taux de chute du bargraphe"
 
-#: editor_actions.cc:116
+#: editor_actions.cc:119
 msgid "Meter hold"
 msgstr "Maintien de la crête de bargraphe"
 
-#: editor_actions.cc:117 session_option_editor.cc:321
+#: editor_actions.cc:120 session_option_editor.cc:342
 msgid "MIDI Options"
 msgstr "Options MIDI"
 
-#: editor_actions.cc:118
+#: editor_actions.cc:121
 msgid "Misc Options"
 msgstr "Autres options"
 
-#: editor_actions.cc:119 rc_option_editor.cc:1809 route_group_dialog.cc:54
-#: session_option_editor.cc:243 session_option_editor.cc:250
+#: editor_actions.cc:122 rc_option_editor.cc:2401 route_group_dialog.cc:54
+#: session_option_editor.cc:264 session_option_editor.cc:271
 msgid "Monitoring"
 msgstr "Écoute de contrôle"
 
-#: editor_actions.cc:120
+#: editor_actions.cc:123
 msgid "Active Mark"
 msgstr "Repère actif"
 
-#: editor_actions.cc:123
+#: editor_actions.cc:126
 msgid "Primary Clock"
 msgstr "Horloge principale"
 
-#: editor_actions.cc:124
+#: editor_actions.cc:127
 msgid "Pullup / Pulldown"
 msgstr "Pullup / Pulldown"
 
-#: editor_actions.cc:125
+#: editor_actions.cc:128
 msgid "Region operations"
 msgstr "Opérations sur les régions"
 
-#: editor_actions.cc:127 ruler_dialog.cc:28
+#: editor_actions.cc:130 ruler_dialog.cc:28
 msgid "Rulers"
 msgstr "Grille"
 
-#: editor_actions.cc:128
+#: editor_actions.cc:131
 msgid "Views"
 msgstr "Vues"
 
-#: editor_actions.cc:129
+#: editor_actions.cc:132
 msgid "Scroll"
 msgstr "Défilement"
 
-#: editor_actions.cc:130
+#: editor_actions.cc:133
 msgid "Secondary Clock"
 msgstr "Horloge secondaire"
 
-#: editor_actions.cc:137
+#: editor_actions.cc:140
 msgid "Subframes"
 msgstr "Sous-trames"
 
-#: editor_actions.cc:140
+#: editor_actions.cc:143
 msgid "Timecode fps"
 msgstr "Trames/s « timecode »"
 
-#: editor_actions.cc:141 route_time_axis.cc:575
+#: editor_actions.cc:144 route_time_axis.cc:599
 msgid "Height"
 msgstr "Hauteur"
 
-#: editor_actions.cc:143
+#: editor_actions.cc:146
 msgid "Tools"
 msgstr "Outils"
 
-#: editor_actions.cc:144
+#: editor_actions.cc:147
 msgid "View"
 msgstr "Affichage"
 
-#: editor_actions.cc:146
+#: editor_actions.cc:149
 msgid "Zoom"
 msgstr "Zoom"
 
-#: editor_actions.cc:152
-msgid "Break drag or deselect all"
-msgstr "Arrêter le déplacement ou tout désélectionner"
+#: editor_actions.cc:150
+msgid "Scripted Actions"
+msgstr ""
 
 #: editor_actions.cc:159
+msgid "Session|Lock"
+msgstr "Verrouiller"
+
+#: editor_actions.cc:161
 msgid "Show Editor Mixer"
 msgstr "Afficher la tranche de mixage"
 
-#: editor_actions.cc:160
+#: editor_actions.cc:162
 msgid "Show Editor List"
 msgstr "Afficher les listes d'édition"
 
-#: editor_actions.cc:162
+#: editor_actions.cc:164
 msgid "Playhead to Next Region Boundary"
 msgstr "Tête de lecture à la bordure de région suivante"
 
-#: editor_actions.cc:163
+#: editor_actions.cc:165
 msgid "Playhead to Next Region Boundary (No Track Selection)"
 msgstr ""
 "Tête de lecture à la bordure de région suivante (Pas de sélection de piste)"
 
-#: editor_actions.cc:164
+#: editor_actions.cc:166
 msgid "Playhead to Previous Region Boundary"
 msgstr "Tête de lecture à la bordure de région précédente"
 
-#: editor_actions.cc:165
+#: editor_actions.cc:167
 msgid "Playhead to Previous Region Boundary (No Track Selection)"
 msgstr ""
 "Tête de lecture à la bordure de région précédente (Pas de sélection de piste)"
 
-#: editor_actions.cc:167
+#: editor_actions.cc:169
 msgid "Playhead to Next Region Start"
-msgstr "début de la région suivante"
+msgstr "Tête de lecture au début de la région suivante"
 
-#: editor_actions.cc:168
+#: editor_actions.cc:170
 msgid "Playhead to Next Region End"
-msgstr "Fin de la région suivante"
+msgstr "Tête de lecture à la fin de la région suivante"
 
-#: editor_actions.cc:169
+#: editor_actions.cc:171
 msgid "Playhead to Next Region Sync"
-msgstr "Tête de lecture au point de synchronisation de région suivant"
+msgstr "Tête de lecture au point de synchronisation de la région suivante"
 
-#: editor_actions.cc:171
+#: editor_actions.cc:173
 msgid "Playhead to Previous Region Start"
-msgstr "début de la région précédente"
+msgstr "Tête de lecture au début de la région précédente"
 
-#: editor_actions.cc:172
+#: editor_actions.cc:174
 msgid "Playhead to Previous Region End"
-msgstr "fin de la région précédente"
+msgstr "Tête de lecture à la fin de la région précédente"
 
-#: editor_actions.cc:173
+#: editor_actions.cc:175
 msgid "Playhead to Previous Region Sync"
-msgstr "Tête de lecture au point de synchronisation de région précédent"
+msgstr "Tête de lecture au point de synchronisation de la région précédente"
 
-#: editor_actions.cc:175
+#: editor_actions.cc:177
 msgid "To Next Region Boundary"
 msgstr "À la bordure de région suivante"
 
-#: editor_actions.cc:176
+#: editor_actions.cc:178
 msgid "To Next Region Boundary (No Track Selection)"
 msgstr "À la bordure de région suivante (Pas de sélection de piste)"
 
-#: editor_actions.cc:177
+#: editor_actions.cc:179
 msgid "To Previous Region Boundary"
 msgstr "À la bordure de région précédente"
 
-#: editor_actions.cc:178
+#: editor_actions.cc:180
 msgid "To Previous Region Boundary (No Track Selection)"
 msgstr "À la bordure de région précédente (Pas de sélection de piste)"
 
-#: editor_actions.cc:180
+#: editor_actions.cc:182
 msgid "To Next Region Start"
 msgstr "Au début de région suivant"
 
-#: editor_actions.cc:181
+#: editor_actions.cc:183
 msgid "To Next Region End"
 msgstr "À la fin de région suivante"
 
-#: editor_actions.cc:182
+#: editor_actions.cc:184
 msgid "To Next Region Sync"
 msgstr "Au point de synchronisation de région suivant"
 
-#: editor_actions.cc:184
+#: editor_actions.cc:186
 msgid "To Previous Region Start"
 msgstr "Au début de région précédent"
 
-#: editor_actions.cc:185
+#: editor_actions.cc:187
 msgid "To Previous Region End"
 msgstr "À la fin de région précédente"
 
-#: editor_actions.cc:186
+#: editor_actions.cc:188
 msgid "To Previous Region Sync"
 msgstr "Au point de synchronisation de région précédent"
 
-#: editor_actions.cc:188
+#: editor_actions.cc:190
 msgid "To Range Start"
 msgstr "Au début de l'intervalle"
 
-#: editor_actions.cc:189
+#: editor_actions.cc:191
 msgid "To Range End"
 msgstr "À la fin de l'intervalle"
 
-#: editor_actions.cc:191
+#: editor_actions.cc:193
 msgid "Playhead to Range Start"
 msgstr "De la tête de lecture au début de l'intervalle"
 
-#: editor_actions.cc:192
+#: editor_actions.cc:194
 msgid "Playhead to Range End"
 msgstr "De la tête de lecture à la fin de l'intervalle"
 
-#: editor_actions.cc:195
+#: editor_actions.cc:197
 msgid "Select All Tracks"
 msgstr "Sélectionner toutes les pistes"
 
-#: editor_actions.cc:196 export_timespan_selector.cc:61 processor_box.cc:2468
+#: editor_actions.cc:198 export_timespan_selector.cc:59 processor_box.cc:3685
 msgid "Deselect All"
 msgstr "Désélectionner tout"
 
-#: editor_actions.cc:204
+#: editor_actions.cc:210
 msgid "Select All Overlapping Edit Range"
 msgstr "Sélectionner tout ce qui chevauche l'intervalle d'édition"
 
-#: editor_actions.cc:205
+#: editor_actions.cc:211
 msgid "Select All Inside Edit Range"
 msgstr "Tout sélectionner à l'intérieur de l'intervalle d'édition"
 
-#: editor_actions.cc:207
+#: editor_actions.cc:213
 msgid "Select Edit Range"
 msgstr "Sélectionner l'intervalle d'édition"
 
-#: editor_actions.cc:209
+#: editor_actions.cc:215
 msgid "Select All in Punch Range"
 msgstr "Tout sélectionner dans l'intervalle de « punch »"
 
-#: editor_actions.cc:210
+#: editor_actions.cc:216
 msgid "Select All in Loop Range"
 msgstr "Tout sélectionner dans l'intervalle de boucle"
 
-#: editor_actions.cc:212
+#: editor_actions.cc:218
 msgid "Select Next Track or Bus"
 msgstr "Sélectionner piste ou bus suivant"
 
-#: editor_actions.cc:213
+#: editor_actions.cc:219
 msgid "Select Previous Track or Bus"
 msgstr "Sélectionner piste ou bus précédent"
 
-#: editor_actions.cc:215
+#: editor_actions.cc:221
 msgid "Toggle Record Enable"
 msgstr "Armer/désarmer l'enregistrement"
 
-#: editor_actions.cc:217
+#: editor_actions.cc:223
 msgid "Toggle Solo"
 msgstr "Basculer Solo"
 
-#: editor_actions.cc:219
+#: editor_actions.cc:225
 msgid "Toggle Mute"
 msgstr "Basculer Muet"
 
-#: editor_actions.cc:221
+#: editor_actions.cc:227
 msgid "Toggle Solo Isolate"
 msgstr "Basculer Solo Isolé"
 
-#: editor_actions.cc:226
+#: editor_actions.cc:232
 msgid "Save View %1"
 msgstr "Sauvegarder la vue %1"
 
-#: editor_actions.cc:232
+#: editor_actions.cc:238
 msgid "Go to View %1"
 msgstr "Charger la vue %1"
 
-#: editor_actions.cc:238
+#: editor_actions.cc:244
 msgid "Locate to Mark %1"
 msgstr "Se placer au repère %1"
 
-#: editor_actions.cc:242 editor_actions.cc:243
+#: editor_actions.cc:249 editor_actions.cc:250
 msgid "Jump to Next Mark"
 msgstr "Sauter au repère suivant"
 
-#: editor_actions.cc:244 editor_actions.cc:245
+#: editor_actions.cc:251 editor_actions.cc:252
 msgid "Jump to Previous Mark"
 msgstr "Sauter au repère précédent"
 
-#: editor_actions.cc:247 editor_actions.cc:248
+#: editor_actions.cc:254
+msgid "Set Session Start from Playhead"
+msgstr ""
+
+#: editor_actions.cc:255
+msgid "Set Session End from Playhead"
+msgstr ""
+
+#: editor_actions.cc:257 editor_actions.cc:258
 msgid "Add Mark from Playhead"
 msgstr "Créer un repère à la tête de lecture"
 
-#: editor_actions.cc:250 editor_actions.cc:251
+#: editor_actions.cc:260 editor_actions.cc:261
 msgid "Remove Mark at Playhead"
 msgstr "Enlever le repère à la tête de lecture"
 
-#: editor_actions.cc:253
+#: editor_actions.cc:263
 msgid "Nudge Next Later"
 msgstr "Décaler le suivant vers la droite"
 
-#: editor_actions.cc:254
+#: editor_actions.cc:264
 msgid "Nudge Next Earlier"
 msgstr "Décaler le suivant vers la gauche"
 
-#: editor_actions.cc:256
+#: editor_actions.cc:266
 msgid "Nudge Playhead Forward"
 msgstr "Décaler la tête de lecture vers la droite"
 
-#: editor_actions.cc:257
+#: editor_actions.cc:267
 msgid "Nudge Playhead Backward"
 msgstr "Décaler la tête de lecture vers la gauche"
 
-#: editor_actions.cc:258
-msgid "Playhead To Next Grid"
-msgstr "Tête de lecture à la grille suivante"
+#: editor_actions.cc:268
+msgid "Playhead to Next Grid"
+msgstr ""
 
-#: editor_actions.cc:259
-msgid "Playhead To Previous Grid"
-msgstr "Tête de lecture à la grille précédente"
+#: editor_actions.cc:269
+msgid "Playhead to Previous Grid"
+msgstr ""
 
-#: editor_actions.cc:264
+#: editor_actions.cc:274
 msgid "Zoom to Selection"
-msgstr ""
+msgstr "Zoom sur la sélection"
 
-#: editor_actions.cc:265
+#: editor_actions.cc:275
 msgid "Toggle Zoom State"
 msgstr "Commuter l'état du zoom"
 
-#: editor_actions.cc:267
+#: editor_actions.cc:277
 msgid "Expand Track Height"
 msgstr "Augmenter la hauteur de la piste"
 
-#: editor_actions.cc:268
+#: editor_actions.cc:278
 msgid "Shrink Track Height"
 msgstr "Diminuer la hauteur de la piste"
 
-#: editor_actions.cc:270
+#: editor_actions.cc:280
+msgid "Fit 1 Track"
+msgstr ""
+
+#: editor_actions.cc:281
+msgid "Fit 2 Tracks"
+msgstr ""
+
+#: editor_actions.cc:282
+msgid "Fit 4 Tracks"
+msgstr ""
+
+#: editor_actions.cc:283
+msgid "Fit 8 Tracks"
+msgstr ""
+
+#: editor_actions.cc:284
+msgid "Fit 16 Tracks"
+msgstr ""
+
+#: editor_actions.cc:285
+msgid "Fit 32 Tracks"
+msgstr ""
+
+#: editor_actions.cc:286
+msgid "Fit All Tracks"
+msgstr ""
+
+#: editor_actions.cc:293
+msgid "Zoom to 5 min"
+msgstr ""
+
+#: editor_actions.cc:296
 msgid "Move Selected Tracks Up"
 msgstr "Déplacer vers le haut"
 
-#: editor_actions.cc:272
+#: editor_actions.cc:298
 msgid "Move Selected Tracks Down"
 msgstr "Déplacer vers le bas"
 
-#: editor_actions.cc:275
+#: editor_actions.cc:301
 msgid "Scroll Tracks Up"
 msgstr "Monter d'une page"
 
-#: editor_actions.cc:277
+#: editor_actions.cc:302
 msgid "Scroll Tracks Down"
 msgstr "Descendre d'une page"
 
-#: editor_actions.cc:279
+#: editor_actions.cc:303
 msgid "Step Tracks Up"
 msgstr "Défiler vers le haut"
 
-#: editor_actions.cc:281
+#: editor_actions.cc:304
 msgid "Step Tracks Down"
 msgstr "Défiler vers le bas"
 
-#: editor_actions.cc:284
+#: editor_actions.cc:306
 msgid "Scroll Backward"
 msgstr "Défiler en arrière"
 
-#: editor_actions.cc:285
+#: editor_actions.cc:307
 msgid "Scroll Forward"
 msgstr "Défiler en avant"
 
-#: editor_actions.cc:286
+#: editor_actions.cc:308
 msgid "Center Playhead"
 msgstr "Centrer sur la tête de lecture"
 
-#: editor_actions.cc:287
+#: editor_actions.cc:309
 msgid "Center Edit Point"
 msgstr "Centrer le point d'édition"
 
-#: editor_actions.cc:289
+#: editor_actions.cc:311
 msgid "Playhead Forward"
 msgstr "Suivre la tête de lecture"
 
-#: editor_actions.cc:290
+#: editor_actions.cc:312
 msgid "Playhead Backward"
 msgstr "Tête de lecture en arrière"
 
-#: editor_actions.cc:292
+#: editor_actions.cc:314
 msgid "Playhead to Active Mark"
 msgstr "Déplacer la tête de lecture au repère actif"
 
-#: editor_actions.cc:293
+#: editor_actions.cc:315
 msgid "Active Mark to Playhead"
 msgstr "Déplacer le repère actif à la tête de lecture"
 
-#: editor_actions.cc:295
+#: editor_actions.cc:317
 msgid "Use Skip Ranges"
-msgstr ""
+msgstr "Utiliser les sauts de plage"
 
-#: editor_actions.cc:302
+#: editor_actions.cc:324
 msgid "Play Selected Regions"
 msgstr "Lire les régions sélectionnées"
 
-#: editor_actions.cc:304
+#: editor_actions.cc:326
 msgid "Play from Edit Point and Return"
 msgstr "Lire au point d'édition et revenir"
 
-#: editor_actions.cc:306
+#: editor_actions.cc:328
 msgid "Play Edit Range"
 msgstr "Lire l'intervalle d'édition"
 
-#: editor_actions.cc:308
+#: editor_actions.cc:330
 msgid "Playhead to Mouse"
 msgstr "Placer sur le curseur d'édition"
 
-#: editor_actions.cc:309
+#: editor_actions.cc:331
 msgid "Active Marker to Mouse"
 msgstr "Déplacer le repère actif à la position de la souris"
 
-#: editor_actions.cc:319
+#: editor_actions.cc:341
 msgid "Undo Selection Change"
-msgstr ""
+msgstr "Annuler la modification de sélection"
 
-#: editor_actions.cc:320
+#: editor_actions.cc:342
 msgid "Redo Selection Change"
-msgstr ""
+msgstr "Refaire la modification de sélection"
 
-#: editor_actions.cc:322
+#: editor_actions.cc:344
 msgid "Export Audio"
 msgstr "Exporter Audio"
 
-#: editor_actions.cc:323 export_dialog.cc:396
+#: editor_actions.cc:345 export_dialog.cc:424
 msgid "Export Range"
 msgstr "Exporter l'intervalle"
 
-#: editor_actions.cc:328
+#: editor_actions.cc:350
 msgid "Separate Using Punch Range"
 msgstr "Séparer suivant l'intervalle de « punch »"
 
-#: editor_actions.cc:331
+#: editor_actions.cc:353
 msgid "Separate Using Loop Range"
 msgstr "Séparer suivant l'intervalle de boucle"
 
-#: editor_actions.cc:334 editor_actions.cc:356
+#: editor_actions.cc:356 editor_actions.cc:379
 msgid "Crop"
 msgstr "Découper"
 
-#: editor_actions.cc:344
+#: editor_actions.cc:366
 msgid "Fade Range Selection"
 msgstr "Fondu sur l'intervalle sélectionné"
 
-#: editor_actions.cc:346
+#: editor_actions.cc:368
 msgid "Set Tempo from Edit Range = Bar"
 msgstr "Régler le tempo sur intervalle d'édition = mesure"
 
-#: editor_actions.cc:348
+#: editor_actions.cc:371
 msgid "Log"
 msgstr "Journal"
 
-#: editor_actions.cc:351 editor_actions.cc:353
-#, fuzzy
+#: editor_actions.cc:374 editor_actions.cc:376
 msgid "Move to Next Transient"
-msgstr "Aller au prochain début de Région (Pistes sélectionnées)"
+msgstr "Aller à la prochaine transitoire"
 
-#: editor_actions.cc:352 editor_actions.cc:354
-#, fuzzy
+#: editor_actions.cc:375 editor_actions.cc:377
 msgid "Move to Previous Transient"
-msgstr "Aller au prochain début de Région (Pistes sélectionnées)"
+msgstr "Aller à la transitoire précédente"
+
+#: editor_actions.cc:381
+msgid "Start Range from Playhead"
+msgstr ""
+
+#: editor_actions.cc:382
+msgid "Finish Range from Playhead"
+msgstr ""
 
-#: editor_actions.cc:358 editor_actions.cc:361
+#: editor_actions.cc:384 editor_actions.cc:393
 msgid "Start Range"
 msgstr "Démarrer un intervalle"
 
-#: editor_actions.cc:359 editor_actions.cc:362
+#: editor_actions.cc:385 editor_actions.cc:394
 msgid "Finish Range"
 msgstr "Terminer un intervalle"
 
-#: editor_actions.cc:394
+#: editor_actions.cc:387
+msgid "Start Punch Range"
+msgstr ""
+
+#: editor_actions.cc:388
+msgid "Finish Punch Range"
+msgstr ""
+
+#: editor_actions.cc:390
+msgid "Start Loop Range"
+msgstr ""
+
+#: editor_actions.cc:391
+msgid "Finish Loop Range"
+msgstr ""
+
+#: editor_actions.cc:426
 msgid "Follow Playhead"
 msgstr "Suivre la tête de lecture"
 
-#: editor_actions.cc:395
+#: editor_actions.cc:427
 msgid "Remove Last Capture"
 msgstr "Détruire le dernier enregistrement"
 
-#: editor_actions.cc:397
+#: editor_actions.cc:429
 msgid "Stationary Playhead"
 msgstr "Tête de lecture stationnaire"
 
-#: editor_actions.cc:399 insert_time_dialog.cc:32
+#: editor_actions.cc:431 insert_remove_time_dialog.cc:32
 msgid "Insert Time"
 msgstr "Insérer temps"
 
-#: editor_actions.cc:402
+#: editor_actions.cc:433 insert_remove_time_dialog.cc:32
+msgid "Remove Time"
+msgstr ""
+
+#: editor_actions.cc:438
 msgid "Toggle Active"
 msgstr "Activer/désactiver"
 
-#: editor_actions.cc:407 editor_actions.cc:1768 editor_markers.cc:921
-#: editor_markers.cc:986 editor_snapshots.cc:122 mixer_strip.cc:1543
-#: route_time_axis.cc:856
+#: editor_actions.cc:440 editor_actions.cc:1785 editor_markers.cc:926
+#: editor_markers.cc:999 editor_markers.cc:1019 editor_snapshots.cc:134
+#: lua_script_manager.cc:32 lua_script_manager.cc:36 mixer_strip.cc:1705
+#: route_time_axis.cc:870 vca_master_strip.cc:400
 msgid "Remove"
 msgstr "Supprimer"
 
-#: editor_actions.cc:411
+#: editor_actions.cc:445
 msgid "Fit Selection (Vertical)"
-msgstr ""
+msgstr "Ajuster à la sélection (verticale)"
 
-#: editor_actions.cc:413 time_axis_view.cc:1371
+#: editor_actions.cc:447 time_axis_view.cc:1287
 msgid "Largest"
 msgstr "Énorme"
 
-#: editor_actions.cc:416 time_axis_view.cc:1372
+#: editor_actions.cc:450 time_axis_view.cc:1288
 msgid "Larger"
 msgstr "Très Grand"
 
-#: editor_actions.cc:419 editor_rulers.cc:249 time_axis_view.cc:1373
+#: editor_actions.cc:453 editor_rulers.cc:248 time_axis_view.cc:1289
 msgid "Large"
 msgstr "Grand"
 
-#: editor_actions.cc:425 editor_rulers.cc:253 time_axis_view.cc:1375
+#: editor_actions.cc:459 editor_rulers.cc:252 time_axis_view.cc:1291
 msgid "Small"
 msgstr "Petit"
 
-#: editor_actions.cc:429
+#: editor_actions.cc:463
 msgid "Sound Selected MIDI Notes"
 msgstr "Jouer les notes MIDI sélectionnées"
 
-#: editor_actions.cc:434
+#: editor_actions.cc:468
 msgid "Zoom Focus Left"
 msgstr "Zoomer sur la gauche"
 
-#: editor_actions.cc:435
+#: editor_actions.cc:469
 msgid "Zoom Focus Right"
 msgstr "Zoomer sur la droite"
 
-#: editor_actions.cc:436
+#: editor_actions.cc:470
 msgid "Zoom Focus Center"
 msgstr "Zoomer au centre"
 
-#: editor_actions.cc:437
+#: editor_actions.cc:471
 msgid "Zoom Focus Playhead"
 msgstr "Zoomer sur la tête de lecture"
 
-#: editor_actions.cc:438
+#: editor_actions.cc:472
 msgid "Zoom Focus Mouse"
 msgstr "Zoomer sur la souris"
 
-#: editor_actions.cc:439
+#: editor_actions.cc:473
 msgid "Zoom Focus Edit Point"
 msgstr "Zoomer sur le point d'édition"
 
-#: editor_actions.cc:441
+#: editor_actions.cc:475
 msgid "Next Zoom Focus"
 msgstr "Option suivante pour Zoomer sur"
 
-#: editor_actions.cc:447
+#: editor_actions.cc:488
 msgid "Smart Object Mode"
 msgstr "Mode objet intelligent"
 
-#: editor_actions.cc:450
-#, fuzzy
+#: editor_actions.cc:491
 msgid "Smart"
 msgstr "Intelligent"
 
-#: editor_actions.cc:453
+#: editor_actions.cc:494
 msgid "Object Tool"
 msgstr "Outil d'objet"
 
-#: editor_actions.cc:458
+#: editor_actions.cc:499
 msgid "Range Tool"
 msgstr "Outil d'intervalle"
 
-#: editor_actions.cc:463
+#: editor_actions.cc:504
 msgid "Note Drawing Tool"
 msgstr "Outil de dessin de note"
 
-#: editor_actions.cc:468
+#: editor_actions.cc:509
 msgid "Audition Tool"
 msgstr "Outil d'écoute"
 
-#: editor_actions.cc:473
+#: editor_actions.cc:514
 msgid "Time FX Tool"
 msgstr "Outil de transformation temporelle"
 
-#: editor_actions.cc:478
+#: editor_actions.cc:519
 msgid "Content Tool"
-msgstr ""
+msgstr "Outil Contenu"
 
-#: editor_actions.cc:484
+#: editor_actions.cc:525
 msgid "Cut Tool"
 msgstr "Outil de découpe"
 
 # Mieux?
-#: editor_actions.cc:490
+#: editor_actions.cc:531
 #, fuzzy
 msgid "Step Mouse Mode"
 msgstr "Mode Pas-à-pas"
 
-#: editor_actions.cc:497
+#: editor_actions.cc:538
 msgid "Change Edit Point"
 msgstr "Changer le point d'édition"
 
-#: editor_actions.cc:498
+#: editor_actions.cc:539
 msgid "Change Edit Point Including Marker"
 msgstr "Changer le point d'édition y compris le repère"
 
-#: editor_actions.cc:504
+#: editor_actions.cc:544
+msgid "EditMode|Lock"
+msgstr ""
+
+#: editor_actions.cc:545
 msgid "Cycle Edit Mode"
 msgstr "Changer le mode d'édition"
 
-#: editor_actions.cc:506
+#: editor_actions.cc:547
 msgid "Snap to"
 msgstr "Aligner sur"
 
-#: editor_actions.cc:507
+#: editor_actions.cc:548
 msgid "Snap Mode"
 msgstr "Mode d'alignement"
 
-#: editor_actions.cc:514
+#: editor_actions.cc:555
 msgid "Next Snap Mode"
 msgstr "Mode d'alignement suivant"
 
-#: editor_actions.cc:515
+#: editor_actions.cc:556
 msgid "Next Snap Choice"
 msgstr "Choix d'alignement suivant"
 
-#: editor_actions.cc:516
+#: editor_actions.cc:557
 msgid "Next Musical Snap Choice"
 msgstr "Choix d'alignement musical suivant"
 
-#: editor_actions.cc:517
+#: editor_actions.cc:558
 msgid "Previous Snap Choice"
 msgstr "Choix d'alignement précédent"
 
-#: editor_actions.cc:518
+#: editor_actions.cc:559
 msgid "Previous Musical Snap Choice"
 msgstr "Choix d'alignement musical précédent"
 
-#: editor_actions.cc:523
+#: editor_actions.cc:564
 msgid "Snap to CD Frame"
-msgstr "Aligner sur la trame CD"
+msgstr "Aimanter à la trame CD"
 
-#: editor_actions.cc:524
+#: editor_actions.cc:565
 msgid "Snap to Timecode Frame"
-msgstr "Aligner sur la trame de « timecode »"
+msgstr "Aimanter à la trame de « timecode »"
 
-#: editor_actions.cc:525
+#: editor_actions.cc:566
 msgid "Snap to Timecode Seconds"
-msgstr "Aligner sur les secondes de « timecode »"
+msgstr "Aimanter aux secondes de « timecode »"
 
-#: editor_actions.cc:526
+#: editor_actions.cc:567
 msgid "Snap to Timecode Minutes"
-msgstr "Aligner sur les minutes de « timecode »"
+msgstr "Aimanter aux minutes de « timecode »"
 
-#: editor_actions.cc:527
+#: editor_actions.cc:568
 msgid "Snap to Seconds"
-msgstr "Aligner sur les secondes"
+msgstr "Aimanter aux secondes"
 
-#: editor_actions.cc:528
+#: editor_actions.cc:569
 msgid "Snap to Minutes"
-msgstr "Aligner sur les minutes"
+msgstr "Aimanter aux minutes"
 
-#: editor_actions.cc:530
+#: editor_actions.cc:571
 msgid "Snap to One Twenty Eighths"
-msgstr "Aligner aux quintuple croches"
+msgstr "Aimanter au 28ème de temps"
 
-#: editor_actions.cc:531
+#: editor_actions.cc:572
 msgid "Snap to Sixty Fourths"
-msgstr "Aligner sur un 64ème de temps"
+msgstr "Aimanter au 46ème de temps"
 
-#: editor_actions.cc:532
+#: editor_actions.cc:573
 msgid "Snap to Thirty Seconds"
-msgstr "Aligner sur 30 secondes"
+msgstr "Aimanter toutes les 30 secondes"
 
-#: editor_actions.cc:533
+#: editor_actions.cc:574
 msgid "Snap to Twenty Eighths"
-msgstr "Aligner sur un 28ème de temps"
+msgstr "Aimanter au 28ème de temps"
 
-#: editor_actions.cc:534
+#: editor_actions.cc:575
 msgid "Snap to Twenty Fourths"
-msgstr "Aligner sur un 24ème de temps"
+msgstr "Aimanter au 24ème de temps"
 
-#: editor_actions.cc:535
+#: editor_actions.cc:576
 msgid "Snap to Twentieths"
-msgstr "Aligner sur un 20ème de temps"
+msgstr "Aimanter au 20ème de temps"
 
-#: editor_actions.cc:536
+#: editor_actions.cc:577
 msgid "Snap to Sixteenths"
-msgstr "Aligner sur un 16ème de temps"
+msgstr "Aimanter au 16ème de temps"
 
-#: editor_actions.cc:537
+#: editor_actions.cc:578
 msgid "Snap to Fourteenths"
-msgstr "Aligner sur un 14ème de temps"
+msgstr "Aimanter au 14ème de temps"
 
-#: editor_actions.cc:538
+#: editor_actions.cc:579
 msgid "Snap to Twelfths"
-msgstr "Aligner sur un 12ème de temps"
+msgstr "Aimanter au 12ème de temps"
 
-#: editor_actions.cc:539
+#: editor_actions.cc:580
 msgid "Snap to Tenths"
-msgstr "Aligner sur un 10ème de temps"
+msgstr "Aimanter au 10ème de temps"
 
-#: editor_actions.cc:540
+#: editor_actions.cc:581
 msgid "Snap to Eighths"
-msgstr "Aligner sur un 8ème de temps"
+msgstr "Aimanter au 8ème de temps"
 
-#: editor_actions.cc:541
+#: editor_actions.cc:582
 msgid "Snap to Sevenths"
-msgstr "Aligner sur un 7ème de temps"
+msgstr "Aimanter au 7ème de temps"
 
-#: editor_actions.cc:542
+#: editor_actions.cc:583
 msgid "Snap to Sixths"
-msgstr "Aligner sur un 6ème de temps"
+msgstr "Aimanter au 6ème de temps"
 
-#: editor_actions.cc:543
+#: editor_actions.cc:584
 msgid "Snap to Fifths"
-msgstr "Aligner sur un 5ème de temps"
+msgstr "Aimanter au 5ème de temps"
 
 # Pas plutôt la noire ?
-#: editor_actions.cc:544
-#, fuzzy
+#: editor_actions.cc:585
 msgid "Snap to Quarters"
-msgstr "un quart de temps"
+msgstr "Aimanter au quart de temps"
 
-#: editor_actions.cc:545
+#: editor_actions.cc:586
 msgid "Snap to Thirds"
-msgstr "Aligner sur un triolet"
+msgstr "Aimanter au tiers de temps"
 
-#: editor_actions.cc:546
+#: editor_actions.cc:587
 msgid "Snap to Halves"
-msgstr "Aligner sur un demi temps"
+msgstr "Aimanter au demi temps"
 
-#: editor_actions.cc:548
+#: editor_actions.cc:589
 msgid "Snap to Beat"
-msgstr "Aligner sur un temps"
+msgstr "Aimanter au temps"
 
-#: editor_actions.cc:549
+#: editor_actions.cc:590
 msgid "Snap to Bar"
-msgstr "Aligner sur les mesures"
+msgstr "Aimanter à la mesure"
 
-#: editor_actions.cc:550
+#: editor_actions.cc:591
 msgid "Snap to Mark"
-msgstr "Aligner sur les repères"
+msgstr "Aimanter aux repères"
 
-#: editor_actions.cc:551
+#: editor_actions.cc:592
 msgid "Snap to Region Start"
-msgstr "Aligner sur un début de région"
+msgstr "Aimanter au début de région"
 
-#: editor_actions.cc:552
+#: editor_actions.cc:593
 msgid "Snap to Region End"
-msgstr "Aligner sur fin de région"
+msgstr "Aimanter à la fin de région"
 
-#: editor_actions.cc:553
+#: editor_actions.cc:594
 msgid "Snap to Region Sync"
-msgstr "Aligner sur synchro de région"
+msgstr "Aimanter aux synchros de région"
 
-#: editor_actions.cc:554
+#: editor_actions.cc:595
 msgid "Snap to Region Boundary"
-msgstr "Aligner sur limite de région"
+msgstr "Aimanter aux limites de région"
 
-#: editor_actions.cc:556
+#: editor_actions.cc:597
 msgid "Show Marker Lines"
 msgstr "Afficher les barres de repères"
 
-#: editor_actions.cc:566
+#: editor_actions.cc:607
 msgid "Loop/Punch"
 msgstr "Boucle/« Punch »"
 
-#: editor_actions.cc:570
+#: editor_actions.cc:611
 msgid "Min:Sec"
 msgstr "Min:Sec"
 
-#: editor_actions.cc:572 editor_actions.cc:575 editor_rulers.cc:271
+#: editor_actions.cc:613 editor_actions.cc:616 editor_rulers.cc:270
+#: rc_option_editor.cc:1592
 msgid "Video Monitor"
 msgstr "Moniteur vidéo"
 
-#: editor_actions.cc:574 rc_option_editor.cc:2260
+#: editor_actions.cc:615 rc_option_editor.cc:2844
 msgid "Video"
 msgstr "Vidéo"
 
-#: editor_actions.cc:577
+#: editor_actions.cc:618
 msgid "Always on Top"
 msgstr "Toujours au dessus"
 
-#: editor_actions.cc:579
+#: editor_actions.cc:620
 msgid "Frame number"
 msgstr "Numéro de trame"
 
-#: editor_actions.cc:580
+#: editor_actions.cc:621
 msgid "Timecode Background"
 msgstr "« Timecode » en arrière-plan"
 
-#: editor_actions.cc:581
+#: editor_actions.cc:622
 msgid "Fullscreen"
 msgstr "Plein écran"
 
-#: editor_actions.cc:582
+#: editor_actions.cc:623
 msgid "Letterbox"
 msgstr "« Letterbox »"
 
-#: editor_actions.cc:583
+#: editor_actions.cc:624
 msgid "Original Size"
 msgstr "Taille originale"
 
-#: editor_actions.cc:640
+#: editor_actions.cc:681
 msgid "Sort"
 msgstr "Trier"
 
-#: editor_actions.cc:651 editor_routes.cc:476 mixer_ui.cc:1196
+#: editor_actions.cc:692 editor_routes.cc:549 mixer_ui.cc:1497
 msgid "Show All"
 msgstr "Tout montrer"
 
-#: editor_actions.cc:652
+#: editor_actions.cc:693
 msgid "Show Automatic Regions"
 msgstr "Afficher les régions automatiques"
 
-#: editor_actions.cc:654
+#: editor_actions.cc:695
 msgid "Ascending"
 msgstr "croissant"
 
-#: editor_actions.cc:656
+#: editor_actions.cc:697
 msgid "Descending"
 msgstr "décroissant"
 
-#: editor_actions.cc:659
+#: editor_actions.cc:700
 msgid "By Region Name"
 msgstr "par nom de région"
 
-#: editor_actions.cc:661
+#: editor_actions.cc:702
 msgid "By Region Length"
 msgstr "par longueur de région"
 
-#: editor_actions.cc:663
+#: editor_actions.cc:704
 msgid "By Region Position"
 msgstr "par position de région"
 
-#: editor_actions.cc:665
+#: editor_actions.cc:706
 msgid "By Region Timestamp"
-msgstr "par date de région"
+msgstr "par horodatage de région"
 
-#: editor_actions.cc:667
+#: editor_actions.cc:708
 msgid "By Region Start in File"
 msgstr "par début de région (dans le fichier)"
 
-#: editor_actions.cc:669
+#: editor_actions.cc:710
 msgid "By Region End in File"
 msgstr "par fin de région (dans le fichier)"
 
-#: editor_actions.cc:671
+#: editor_actions.cc:712
 msgid "By Source File Name"
 msgstr "par nom de fichier source"
 
-#: editor_actions.cc:673
+#: editor_actions.cc:714
 msgid "By Source File Length"
 msgstr "par longueur de fichier source"
 
-#: editor_actions.cc:675
+#: editor_actions.cc:716
 msgid "By Source File Creation Date"
 msgstr "par date de création du fichier source"
 
-#: editor_actions.cc:677
+#: editor_actions.cc:718
 msgid "By Source Filesystem"
 msgstr "par système de fichier source"
 
-#: editor_actions.cc:680
+#: editor_actions.cc:721
 msgid "Remove Unused"
 msgstr "Supprimer les régions inutilisées"
 
-#: editor_actions.cc:684 editor_audio_import.cc:282
-#: session_import_dialog.cc:75 session_import_dialog.cc:95
-#: session_metadata_dialog.cc:418 editor_videotimeline.cc:91
+#: editor_actions.cc:723
+msgid "Import PT session"
+msgstr "Importer une région PT"
+
+#: editor_actions.cc:728 editor_audio_import.cc:282 editor_pt_import.cc:149
+#: luawindow.cc:99 session_import_dialog.cc:75 session_import_dialog.cc:95
+#: session_metadata_dialog.cc:421 sfdb_ui.cc:558 editor_videotimeline.cc:91
 msgid "Import"
 msgstr "Importer"
 
-#: editor_actions.cc:687
+#: editor_actions.cc:731
 msgid "Import to Region List..."
 msgstr "Importer dans la liste des régions…"
 
-#: editor_actions.cc:690 session_import_dialog.cc:44
-msgid "Import From Session"
+#: editor_actions.cc:734 session_import_dialog.cc:44
+#: session_import_dialog.cc:65
+msgid "Import from Session"
 msgstr "Importer depuis une session"
 
-#: editor_actions.cc:694
+#: editor_actions.cc:738
 msgid "Bring all media into session folder"
 msgstr "Déplacer tous les médias dans le dossier de session"
 
-#: editor_actions.cc:697
+#: editor_actions.cc:741
 msgid "Show Summary"
 msgstr "Afficher le résumé"
 
-#: editor_actions.cc:699
+#: editor_actions.cc:743
 msgid "Show Group Tabs"
 msgstr "Afficher les onglets de groupes"
 
-#: editor_actions.cc:701
+#: editor_actions.cc:745
 msgid "Show Measure Lines"
-msgstr ""
+msgstr "Afficher les barres de mesure"
 
-#: editor_actions.cc:705
-msgid "Show Logo"
-msgstr "Afficher le logo"
-
-#: editor_actions.cc:709
+#: editor_actions.cc:747
 msgid "Toggle MIDI Input Active for Editor-Selected Tracks/Busses"
 msgstr ""
 "Basculer l'entrée MIDI active pour les pistes/bus sélectionnés dans l'éditeur"
 
-#: editor_actions.cc:732
-msgid "Loaded editor bindings from %1"
-msgstr "Raccourcis d'éditeur chargés depuis %1"
-
-#: editor_actions.cc:734
-msgid "Could not find editor.bindings in search path %1"
-msgstr ""
-"Impossible de trouver « editor.bindings » dans le chemin de recherche %1"
-
-#: editor_actions.cc:1078 editor_actions.cc:1474 editor_actions.cc:1485
-#: editor_actions.cc:1538 editor_actions.cc:1549 editor_actions.cc:1596
-#: editor_actions.cc:1606 editor_regions.cc:1563
+#: editor_actions.cc:1081 editor_actions.cc:1477 editor_actions.cc:1488
+#: editor_actions.cc:1541 editor_actions.cc:1552 editor_actions.cc:1599
+#: editor_actions.cc:1609 editor_regions.cc:1657 luainstance.cc:327
+#: luainstance.cc:1690
 msgid "programming error: %1: %2"
 msgstr "erreur de programmation: %1: %2"
 
-#: editor_actions.cc:1774
+#: editor_actions.cc:1791
 msgid "Raise"
 msgstr "Envoyer vers l'avant"
 
-#: editor_actions.cc:1777
+#: editor_actions.cc:1794
 msgid "Raise to Top"
 msgstr "Envoyer à l'avant"
 
-#: editor_actions.cc:1780
+#: editor_actions.cc:1797
 msgid "Lower"
 msgstr "Envoyer vers l'arrière"
 
-#: editor_actions.cc:1783
+#: editor_actions.cc:1800
 msgid "Lower to Bottom"
 msgstr "Envoyer à l'arrière"
 
-#: editor_actions.cc:1786
+#: editor_actions.cc:1803
 msgid "Move to Original Position"
 msgstr "Remettre à sa position d'origine"
 
-#: editor_actions.cc:1791
+#: editor_actions.cc:1808
 msgid "Lock to Video"
 msgstr "Verrouiller sur la vidéo"
 
-#: editor_actions.cc:1796 editor_markers.cc:912
+#: editor_actions.cc:1813 editor_markers.cc:917
 msgid "Glue to Bars and Beats"
 msgstr "Coller aux mesures|temps"
 
-#: editor_actions.cc:1801
+#: editor_actions.cc:1818
 msgid "Remove Sync"
 msgstr "Supprimer le point de synchro"
 
-#: editor_actions.cc:1804 mixer_strip.cc:2006 monitor_section.cc:272
-#: route_time_axis.cc:253 route_time_axis.cc:526
+#: editor_actions.cc:1821 mixer_strip.cc:2192 monitor_section.cc:253
+#: monitor_section.cc:321 route_time_axis.cc:264 route_time_axis.cc:550
 msgid "Mute"
 msgstr "Muet"
 
-#: editor_actions.cc:1807
+#: editor_actions.cc:1824
 msgid "Normalize..."
 msgstr "Normaliser…"
 
-#: editor_actions.cc:1810
+#: editor_actions.cc:1827
 msgid "Reverse"
 msgstr "Inverser"
 
-#: editor_actions.cc:1813
+#: editor_actions.cc:1830
 msgid "Make Mono Regions"
 msgstr "Créer des régions mono"
 
-#: editor_actions.cc:1816
+#: editor_actions.cc:1833
 msgid "Boost Gain"
 msgstr "Augmenter le gain"
 
-#: editor_actions.cc:1819
+#: editor_actions.cc:1836
 msgid "Cut Gain"
 msgstr "Couper le gain"
 
-#: editor_actions.cc:1822
+#: editor_actions.cc:1839
 msgid "Pitch Shift..."
 msgstr "Pitch shift…"
 
-#: editor_actions.cc:1825
-msgid "Transpose..."
-msgstr "Transposer…"
-
-#: editor_actions.cc:1828
+#: editor_actions.cc:1845
 msgid "Opaque"
 msgstr "Opaque"
 
-#: editor_actions.cc:1832 editor_regions.cc:117
+#: editor_actions.cc:1849 editor_regions.cc:164
 msgid "Fade In"
 msgstr "Type de fondu entrant"
 
-#: editor_actions.cc:1837 editor_regions.cc:118
+#: editor_actions.cc:1854 editor_regions.cc:165
 msgid "Fade Out"
 msgstr "Type de fondu sortant"
 
-#: editor_actions.cc:1852
+#: editor_actions.cc:1869
 msgid "Multi-Duplicate..."
 msgstr "Multi-dupliquer…"
 
-#: editor_actions.cc:1857
+#: editor_actions.cc:1874
 msgid "Fill Track"
 msgstr "Remplir la piste"
 
-#: editor_actions.cc:1861 editor_markers.cc:1000
+#: editor_actions.cc:1878 editor_markers.cc:1033
 msgid "Set Loop Range"
 msgstr "Régler l'intervalle de boucle"
 
-#: editor_actions.cc:1868
+#: editor_actions.cc:1885
 msgid "Set Punch"
 msgstr "Régler « punch »"
 
-#: editor_actions.cc:1872
+#: editor_actions.cc:1889
 msgid "Add Single Range Marker"
 msgstr "Ajouter un seul repère d'intervalle"
 
-#: editor_actions.cc:1877
+#: editor_actions.cc:1894
 msgid "Add Range Marker Per Region"
 msgstr "Ajouter un repère d'intervalle par région"
 
-#: editor_actions.cc:1881
-msgid "Snap Position To Grid"
+#: editor_actions.cc:1898
+msgid "Snap Position to Grid"
 msgstr "Aligner la position sur la grille"
 
-#: editor_actions.cc:1884
+#: editor_actions.cc:1901
 msgid "Close Gaps"
 msgstr "Combler les écarts"
 
-#: editor_actions.cc:1887
+#: editor_actions.cc:1904
 msgid "Rhythm Ferret..."
 msgstr "Fureteur de rythme…"
 
-#: editor_actions.cc:1890
+#: editor_actions.cc:1907
 msgid "Export..."
 msgstr "Exporter…"
 
-#: editor_actions.cc:1896
+#: editor_actions.cc:1913
 msgid "Separate Under"
 msgstr "Séparer dessous"
 
-#: editor_actions.cc:1900 editor_actions.cc:1901
+#: editor_actions.cc:1917 editor_actions.cc:1918
 msgid "Set Fade In Length"
 msgstr "Définir la durée de montée"
 
-#: editor_actions.cc:1902 editor_actions.cc:1903
+#: editor_actions.cc:1919 editor_actions.cc:1920
 msgid "Set Fade Out Length"
 msgstr "Définir la durée de descente"
 
-#: editor_actions.cc:1905
+#: editor_actions.cc:1922
 msgid "Set Tempo from Region = Bar"
 msgstr "Régler le tempo sur région = mesure"
 
-#: editor_actions.cc:1910
+#: editor_actions.cc:1927
 msgid "Split at Percussion Onsets"
 msgstr "Scinder aux attaques de percussion"
 
-#: editor_actions.cc:1915
+#: editor_actions.cc:1932
 msgid "List Editor..."
 msgstr "Éditeur en liste…"
 
-#: editor_actions.cc:1918
+#: editor_actions.cc:1935
 msgid "Properties..."
 msgstr "Propriétés…"
 
-#: editor_actions.cc:1922
+#: editor_actions.cc:1939
 msgid "Bounce (with processing)"
 msgstr "« Bouncer » (avec traitement)"
 
-#: editor_actions.cc:1923
+#: editor_actions.cc:1940
 msgid "Bounce (without processing)"
 msgstr "« Bouncer » (sans traitement)"
 
-#: editor_actions.cc:1924
+#: editor_actions.cc:1941
 msgid "Combine"
 msgstr "Joindre"
 
-#: editor_actions.cc:1925
+#: editor_actions.cc:1942
 msgid "Uncombine"
 msgstr "Disjoindre"
 
-#: editor_actions.cc:1927
+#: editor_actions.cc:1944
+msgid "Loudness Analysis..."
+msgstr ""
+
+#: editor_actions.cc:1945
 msgid "Spectral Analysis..."
 msgstr "Analyse spectrale…"
 
-#: editor_actions.cc:1929
+#: editor_actions.cc:1947
 msgid "Reset Envelope"
 msgstr "Réinitialiser l'enveloppe"
 
-#: editor_actions.cc:1931
+#: editor_actions.cc:1949
 msgid "Reset Gain"
 msgstr "Réinitialiser le gain"
 
-#: editor_actions.cc:1936
+#: editor_actions.cc:1954
 msgid "Envelope Active"
 msgstr "Enveloppe active"
 
-#: editor_actions.cc:1944 editor_actions.cc:1945
+#: editor_actions.cc:1962 editor_actions.cc:1963
 msgid "Insert Patch Change..."
 msgstr "Insérer un changement de patch…"
 
-#: editor_actions.cc:1946
+#: editor_actions.cc:1964
 msgid "Unlink from other copies"
 msgstr "Délier des autres copies"
 
-#: editor_actions.cc:1947
+#: editor_actions.cc:1965
 msgid "Strip Silence..."
 msgstr "Supprimer le silence…"
 
-#: editor_actions.cc:1948
+#: editor_actions.cc:1966
 msgid "Set Range Selection"
 msgstr "Régler l'intervalle de sélection"
 
-#: editor_actions.cc:1950 editor_actions.cc:1951
+#: editor_actions.cc:1968 editor_actions.cc:1969
 msgid "Nudge Later"
 msgstr "Décaler vers la droite"
 
-#: editor_actions.cc:1952 editor_actions.cc:1953
+#: editor_actions.cc:1970 editor_actions.cc:1971
 msgid "Nudge Earlier"
 msgstr "Décaler vers la gauche"
 
-#: editor_actions.cc:1955
-#, fuzzy
+#: editor_actions.cc:1973
 msgid "Sequence Regions"
 msgstr "Séquencer les régions"
 
-#: editor_actions.cc:1960
+#: editor_actions.cc:1978
 msgid "Nudge Later by Capture Offset"
 msgstr "Décaler vers la droite en fonction du décalage d'enregistrement"
 
-#: editor_actions.cc:1967
+#: editor_actions.cc:1985
 msgid "Nudge Earlier by Capture Offset"
 msgstr "Décaler vers la gauche en fonction du décalage d'enregistrement"
 
-#: editor_actions.cc:1971
+#: editor_actions.cc:1989
 msgid "Trim to Loop"
 msgstr "Rogner aux repères de boucle"
 
-#: editor_actions.cc:1972
+#: editor_actions.cc:1990
 msgid "Trim to Punch"
 msgstr "Rogner aux points de « punch »"
 
-#: editor_actions.cc:1974
+#: editor_actions.cc:1992
 msgid "Trim to Previous"
 msgstr "Rogner aux précédent"
 
-#: editor_actions.cc:1975
+#: editor_actions.cc:1993
 msgid "Trim to Next"
 msgstr "Rogner jusqu'au suivant"
 
-#: editor_actions.cc:1982
-msgid "Insert Region From Region List"
-msgstr "Insérer région depuis la liste des régions"
+#: editor_actions.cc:2000
+msgid "Insert Region from Region List"
+msgstr ""
 
-#: editor_actions.cc:1988
+#: editor_actions.cc:2006
 msgid "Set Sync Position"
 msgstr "Régler la position de synchronisation"
 
-#: editor_actions.cc:1989
+#: editor_actions.cc:2007
 msgid "Place Transient"
 msgstr "Placer transitoire"
 
-#: editor_actions.cc:1990
+#: editor_actions.cc:2008
 msgid "Split/Separate"
-msgstr ""
+msgstr "Découper/Séparer"
 
-#: editor_actions.cc:1991
+#: editor_actions.cc:2009
 msgid "Trim Start at Edit Point"
 msgstr "Rogner du début au point d'édition"
 
-#: editor_actions.cc:1992
+#: editor_actions.cc:2010
 msgid "Trim End at Edit Point"
 msgstr "Rogner de la fin au point d'édition"
 
-#: editor_actions.cc:1997
+#: editor_actions.cc:2015
 msgid "Align Start"
 msgstr "Aligner le début"
 
-#: editor_actions.cc:2004
+#: editor_actions.cc:2022
 msgid "Align Start Relative"
 msgstr "Aligner le début relativement"
 
-#: editor_actions.cc:2008
+#: editor_actions.cc:2026
 msgid "Align End"
 msgstr "Aligner la fin"
 
-#: editor_actions.cc:2013
+#: editor_actions.cc:2031
 msgid "Align End Relative"
 msgstr "Aligner la fin relativement"
 
-#: editor_actions.cc:2020
+#: editor_actions.cc:2038
 msgid "Align Sync"
 msgstr "Aligner le point de synchronisation"
 
-#: editor_actions.cc:2027
+#: editor_actions.cc:2045
 msgid "Align Sync Relative"
 msgstr "Aligner le point de synchronisation relativement"
 
-#: editor_actions.cc:2031 editor_actions.cc:2034
+#: editor_actions.cc:2049 editor_actions.cc:2050
 msgid "Choose Top..."
 msgstr "Choisir le dessus…"
 
@@ -4710,32 +5295,33 @@ msgstr ""
 "La session contient déjà le fichier source %1. Voulez-vous importer %2 comme "
 "un nouveau fichier source, ou l'ignorer ?"
 
-#: editor_audio_import.cc:282 editor_videotimeline.cc:91
+#: editor_audio_import.cc:282 editor_pt_import.cc:149
+#: editor_videotimeline.cc:91
 msgid "Cancel Import"
 msgstr "Annuler l'importation"
 
-#: editor_audio_import.cc:559
+#: editor_audio_import.cc:565
 msgid "Editor: cannot open file \"%1\", (%2)"
 msgstr "Éditeur : impossible d'ouvrir le fichier « %1 » (%2)"
 
-#: editor_audio_import.cc:567
+#: editor_audio_import.cc:573
 msgid "Cancel entire import"
 msgstr "Annuler toute l'importation"
 
-#: editor_audio_import.cc:568
+#: editor_audio_import.cc:574
 msgid "Don't embed it"
 msgstr "Ne pas le lier"
 
-#: editor_audio_import.cc:569
+#: editor_audio_import.cc:575
 msgid "Embed all without questions"
 msgstr "Lier tout sans poser de question"
 
-#: editor_audio_import.cc:572 editor_audio_import.cc:598
-#: export_format_dialog.cc:60
+#: editor_audio_import.cc:578 editor_audio_import.cc:604
+#: export_format_dialog.cc:68
 msgid "Sample rate"
 msgstr "Échantillonnage"
 
-#: editor_audio_import.cc:573 editor_audio_import.cc:599
+#: editor_audio_import.cc:579 editor_audio_import.cc:605
 msgid ""
 "%1\n"
 "This audiofile's sample rate doesn't match the session sample rate!"
@@ -4744,216 +5330,283 @@ msgstr ""
 "La fréquence d'échantillonnage de ce fichier audio ne correspond pas à celle "
 "de la session !"
 
-#: editor_audio_import.cc:595
+#: editor_audio_import.cc:601
 msgid "Embed it anyway"
 msgstr "Lier quand même"
 
-# drop zone?
-#: editor_canvas_events.cc:1306 editor_drag.cc:1381
-#, fuzzy
-msgid "Could not create new track after region placed in the drop zone"
+#: editor_pt_import.cc:81
+msgid "You can't import a PT session until you have a session loaded."
+msgstr ""
+
+#: editor_pt_import.cc:86
+msgid "Import PT Session"
+msgstr ""
+
+#: editor_pt_import.cc:97
+msgid "%1: this is only the directory/folder name, not the filename.\n"
+msgstr ""
+
+#: editor_pt_import.cc:132
+msgid "Doesn't seem to be a valid PT session file"
+msgstr ""
+
+#: editor_pt_import.cc:136
+msgid ""
+"PT v%1 Session @ %2Hz\n"
+"\n"
+"%3 audio files\n"
+"%4 regions\n"
+"%5 active regions\n"
+"\n"
+"Continue..."
 msgstr ""
-"Impossible de créer une nouvelle piste à partir d'une région placée dans la "
-"zone de suppression"
 
-#: editor_drag.cc:1266
+#: editor_pt_import.cc:175
+msgid ""
+"Failed to load one or more of the audio files, but continuing to attempt "
+"import."
+msgstr ""
+
+#: editor_pt_import.cc:178
+msgid "Success! Import should complete soon."
+msgstr ""
+
+#: editor_pt_import.cc:263
+msgid "PTImport: UINT_MAX routes? impossible!"
+msgstr ""
+
+#: editor_canvas_events.cc:1296 editor_drag.cc:1418
+msgid "Could not create new track after region placed in the drop zone"
+msgstr "Impossible de créer une nouvelle piste à partir de la région placée "
+"dans la zone cible"
+
+#: editor_drag.cc:1306
 msgid "fixed time region drag"
 msgstr "Déplacement vertical de région"
 
-#: editor_drag.cc:2214
+#: editor_drag.cc:2249
 msgid "Ripple drag"
+msgstr "Déplacement avec propagation"
+
+#: editor_drag.cc:2311
+msgid "create region"
 msgstr ""
 
-#: editor_drag.cc:2365 midi_region_view.cc:2813
+#: editor_drag.cc:2430 midi_region_view.cc:2859
 #, fuzzy
 msgid "resize notes"
 msgstr "Redimensionner les notes"
 
-#: editor_drag.cc:2517
+#: editor_drag.cc:2613 editor_drag.cc:2648
+msgid ""
+"One or more Audio Regions\n"
+"are both Locked and\n"
+"Locked to Video.\n"
+"The video cannot me moved."
+msgstr ""
+
+#: editor_drag.cc:2683
 msgid "Video Start:"
 msgstr "Début vidéo :"
 
-#: editor_drag.cc:2519
+#: editor_drag.cc:2685
 msgid "Diff:"
 msgstr "Différence :"
 
-#: editor_drag.cc:2538
+#: editor_drag.cc:2707
 msgid "Move Video"
 msgstr "Déplacer vidéo"
 
-#: editor_drag.cc:3046
+#: editor_drag.cc:3177
+msgid "move meter mark"
+msgstr "déplacer le repère de signature"
+
+#: editor_drag.cc:3179
 msgid "copy meter mark"
 msgstr "copier le repère de signature"
 
-#: editor_drag.cc:3054
-msgid "move meter mark"
-msgstr "déplacer le repère de signature"
+#: editor_drag.cc:3279
+msgid "inactive"
+msgstr ""
 
-#: editor_drag.cc:3177
+#: editor_drag.cc:3324
+msgid "move tempo mark"
+msgstr "déplacer le repère de tempo"
+
+#: editor_drag.cc:3331
 msgid "copy tempo mark"
 msgstr "copier le repère de tempo"
 
-#: editor_drag.cc:3185
-msgid "move tempo mark"
-msgstr "déplacer le repère de tempo"
+#: editor_drag.cc:3462
+msgid "dilate tempo"
+msgstr ""
 
-#: editor_drag.cc:3412
+#: editor_drag.cc:3736
 msgid "change fade in length"
 msgstr "modifier la durée de montée"
 
-#: editor_drag.cc:3526
+#: editor_drag.cc:3861
 msgid "change fade out length"
 msgstr "modifier la durée de descente"
 
-#: editor_drag.cc:3880
+#: editor_drag.cc:4239
 msgid "move marker"
 msgstr "déplacer le repère"
 
-#: editor_drag.cc:4490
+#: editor_drag.cc:4506 editor_drag.cc:5833
+msgid "automation range move"
+msgstr "déplacement d'intervalle d'automation"
+
+#: editor_drag.cc:4890
 msgid "An error occurred while executing time stretch operation"
 msgstr "Une erreur est survenue pendant l'opération d'étirement temporel"
 
-#: editor_drag.cc:4947
+#: editor_drag.cc:5351
 msgid "programming_error: %1"
-msgstr "%1 : erreur de programmation"
+msgstr "%1 : erreur de programmation"
 
-#: editor_drag.cc:5016 editor_drag.cc:5026
+#: editor_drag.cc:5420 editor_drag.cc:5430
 msgid "new skip marker"
-msgstr ""
+msgstr "nouveau marqueur de saut"
 
-#: editor_drag.cc:5017
+#: editor_drag.cc:5421
 msgid "skip"
-msgstr ""
+msgstr "saut"
 
-#: editor_drag.cc:5021 location_ui.cc:56
+#: editor_drag.cc:5425 location_ui.cc:60
 msgid "CD"
 msgstr "CD"
 
-#: editor_drag.cc:5022
+#: editor_drag.cc:5426
 msgid "new CD marker"
-msgstr ""
+msgstr "nouveau marqueur de CD"
 
-#: editor_drag.cc:5027 editor_route_groups.cc:437 mixer_ui.cc:1493
+#: editor_drag.cc:5431 editor_route_groups.cc:439 mixer_ui.cc:1840
 msgid "unnamed"
 msgstr "(sans nom)"
 
-#: editor_drag.cc:5309
+#: editor_drag.cc:5740
 msgid "Automation range drag created for invalid region type"
-msgstr ""
+msgstr "Zone d'automation créée pour un type de région invalide"
 
 # Short for color
-#: editor_route_groups.cc:96
+#: editor_route_groups.cc:97
 msgid "Col"
 msgstr "Coul."
 
-#: editor_route_groups.cc:96
+#: editor_route_groups.cc:97
 msgid "Group Tab Color"
 msgstr "Couleur de l'onglet du groupe"
 
-#: editor_route_groups.cc:97
+#: editor_route_groups.cc:98
 msgid "Name of Group"
 msgstr "Nom du groupe"
 
-#: editor_route_groups.cc:98 editor_routes.cc:207
-msgid "V"
+#: editor_route_groups.cc:99 editor_routes.cc:234
+msgid "Visible|V"
 msgstr "V"
 
-#: editor_route_groups.cc:98
+#: editor_route_groups.cc:99
 msgid "Group is visible?"
-msgstr "Groupe est visible ?"
+msgstr "Groupe visible ?"
 
 # Active
-#: editor_route_groups.cc:99
+#: editor_route_groups.cc:100
 msgid "On"
 msgstr "Act."
 
-#: editor_route_groups.cc:99
+#: editor_route_groups.cc:100
 msgid "Group is enabled?"
 msgstr "Groupe activé ?"
 
-#: editor_route_groups.cc:100
-msgid "group|G"
+#: editor_route_groups.cc:101
+msgid "Group|G"
 msgstr "G"
 
-#: editor_route_groups.cc:100
+#: editor_route_groups.cc:101
 msgid "Sharing Gain?"
 msgstr "Partager gain ?"
 
-#: editor_route_groups.cc:101
-msgid "relative|Rel"
-msgstr "Rel."
+#: editor_route_groups.cc:102
+msgid "Relative|Rel"
+msgstr "Rel"
 
-#: editor_route_groups.cc:101
+#: editor_route_groups.cc:102
 msgid "Relative Gain Changes?"
-msgstr "Changements de gain relatifs"
+msgstr "Changements de gain relatifs ?"
 
-#: editor_route_groups.cc:102
-msgid "mute|M"
+#: editor_route_groups.cc:103 editor_regions.cc:168 editor_routes.cc:239
+#: mixer_strip.cc:2221 meter_strip.cc:365 route_time_axis.cc:2742
+#: time_axis_view.cc:1106
+msgid "Mute|M"
 msgstr "M"
 
-#: editor_route_groups.cc:102
+#: editor_route_groups.cc:103
 msgid "Sharing Mute?"
 msgstr "Partager muet ?"
 
-#: editor_route_groups.cc:103
-msgid "solo|S"
+#: editor_route_groups.cc:104 editor_routes.cc:240 mixer_strip.cc:2234
+#: meter_strip.cc:373 route_time_axis.cc:2739 vca_master_strip.cc:211
+#: vca_time_axis.cc:236
+msgid "Solo|S"
 msgstr "S"
 
-#: editor_route_groups.cc:103
+#: editor_route_groups.cc:104
 msgid "Sharing Solo?"
 msgstr "Partager solo ?"
 
-#: editor_route_groups.cc:104 midi_time_axis.cc:1622 midi_time_axis.cc:1625
-#: midi_time_axis.cc:1628
+#: editor_route_groups.cc:105 midi_time_axis.cc:1626 midi_time_axis.cc:1629
+#: midi_time_axis.cc:1632
 msgid "Rec"
 msgstr "Enreg."
 
-#: editor_route_groups.cc:104
+#: editor_route_groups.cc:105
 msgid "Sharing Record-enable Status?"
 msgstr "Partager l'armement ?"
 
-#: editor_route_groups.cc:105
-msgid "monitoring|Mon"
-msgstr "Mon."
+#: editor_route_groups.cc:106
+msgid "Monitoring|Mon"
+msgstr "Mon"
 
-#: editor_route_groups.cc:105
+#: editor_route_groups.cc:106
 msgid "Sharing Monitoring Choice?"
 msgstr "Partager le choix d'écoute ?"
 
-#: editor_route_groups.cc:106
-msgid "selection|Sel"
-msgstr "Sél."
+#: editor_route_groups.cc:107
+msgid "Selection|Sel"
+msgstr "Sel"
 
-#: editor_route_groups.cc:106
+#: editor_route_groups.cc:107
 msgid "Sharing Selected/Editing Status?"
 msgstr "Partager le statut de sélection/édition ?"
 
-#: editor_route_groups.cc:107
-msgid "active|A"
+#: editor_route_groups.cc:108 editor_routes.cc:235
+msgid "Active|A"
 msgstr "A"
 
-#: editor_route_groups.cc:107
+#: editor_route_groups.cc:108
 msgid "Sharing Active Status?"
 msgstr "Partager le statut d'activation ?"
 
-#: editor_export_audio.cc:92 editor_markers.cc:740 editor_markers.cc:827
-#: editor_markers.cc:1012 editor_markers.cc:1030 editor_markers.cc:1048
-#: editor_markers.cc:1067 editor_markers.cc:1086 editor_markers.cc:1116
-#: editor_markers.cc:1147 editor_markers.cc:1177 editor_markers.cc:1205
-#: editor_markers.cc:1236 editor_markers.cc:1261 editor_markers.cc:1312
-#: editor_markers.cc:1356 editor_markers.cc:1382 editor_markers.cc:1576
-#: editor_mouse.cc:2120
-#, fuzzy
+#: editor_export_audio.cc:93 editor_markers.cc:733 editor_markers.cc:832
+#: editor_markers.cc:1045 editor_markers.cc:1063 editor_markers.cc:1081
+#: editor_markers.cc:1100 editor_markers.cc:1119 editor_markers.cc:1149
+#: editor_markers.cc:1180 editor_markers.cc:1210 editor_markers.cc:1238
+#: editor_markers.cc:1269 editor_markers.cc:1294 editor_markers.cc:1345
+#: editor_markers.cc:1458 editor_markers.cc:1484 editor_markers.cc:1678
+#: editor_mouse.cc:2255
 msgid "programming error: marker canvas item has no marker object pointer!"
-msgstr "programming error : marker canvas item has no marker object pointer!"
+msgstr ""
+"erreur de programmation : l'élément de marqueur de canvas n'a pas de "
+"pointeur d'objet marqueur !"
 
-#: editor_export_audio.cc:145 editor_export_audio.cc:150
-msgid "File Exists!"
-msgstr "Le fichier existe !"
+#: editor_export_audio.cc:114
+msgid "Confirm MIDI File Overwrite"
+msgstr "Confirmer l'écrasement du fichier MIDI"
 
-#: editor_export_audio.cc:153
-msgid "Overwrite Existing File"
-msgstr "Écraser le fichier existant"
+#: editor_export_audio.cc:115 utils_videotl.cc:73
+msgid "A file with the same name already exists. Do you want to overwrite it?"
+msgstr "Un fichier du même nom existe déjà. Voulez-vous l'écraser ?"
 
 #: editor_group_tabs.cc:176
 msgid "Fit to Window"
@@ -4967,309 +5620,343 @@ msgstr "début"
 msgid "end"
 msgstr "fin"
 
-#: editor_markers.cc:657 editor_ops.cc:2085 editor_ops.cc:2107
-#: editor_ops.cc:2164 editor_ops.cc:2193 location_ui.cc:1023
+#: editor_markers.cc:645
+msgid "mark"
+msgstr "repère"
+
+#: editor_markers.cc:650 editor_ops.cc:2164 editor_ops.cc:2186
+#: editor_ops.cc:2304 editor_ops.cc:2341 location_ui.cc:1049
 msgid "add marker"
 msgstr "ajouter un repère"
 
-#: editor_markers.cc:689 editor_markers.cc:1456
+#: editor_markers.cc:682 editor_markers.cc:1558
 msgid "set loop range"
 msgstr "définir l'intervalle de boucle"
 
-#: editor_markers.cc:705 editor_markers.cc:1462
+#: editor_markers.cc:698 editor_markers.cc:1564
 msgid "set punch range"
 msgstr "définir l'intervalle de « punch »"
 
-#: editor_markers.cc:722 editor_ops.cc:4055
+#: editor_markers.cc:715 editor_ops.cc:4159
 msgid "range"
 msgstr "intervalle"
 
-#: editor_markers.cc:725
+#: editor_markers.cc:718
 msgid "new range marker"
 msgstr "nouveau repère d'intervalle"
 
-#: editor_markers.cc:758 editor_ops.cc:2129 location_ui.cc:859
+#: editor_markers.cc:751 editor_ops.cc:2272 location_ui.cc:885
 msgid "remove marker"
 msgstr "supprimer le repère"
 
-#: editor_markers.cc:894
+#: editor_markers.cc:899
 msgid "Locate to Here"
 msgstr "Se placer ici"
 
-#: editor_markers.cc:895
+#: editor_markers.cc:900
 msgid "Play from Here"
 msgstr "Lire à partir d'ici"
 
-#: editor_markers.cc:896
+#: editor_markers.cc:901
 msgid "Move Mark to Playhead"
 msgstr "Déplacer le repère à tête de lecture"
 
-#: editor_markers.cc:900
+#: editor_markers.cc:905
 msgid "Create Range to Next Marker"
 msgstr "Créer un intervalle jusqu'au repère suivant"
 
-#: editor_markers.cc:941
+#: editor_markers.cc:946
 msgid "Locate to Marker"
 msgstr "Déplacer au repère"
 
-#: editor_markers.cc:942
+#: editor_markers.cc:947
 msgid "Play from Marker"
 msgstr "Lire depuis le repère"
 
-#: editor_markers.cc:945
+#: editor_markers.cc:950
 msgid "Set Marker from Playhead"
 msgstr "Placer le repère sur la tête de lecture"
 
-#: editor_markers.cc:947
+#: editor_markers.cc:951
 msgid "Set Range from Selection"
 msgstr "Régler l'intervalle sur la sélection"
 
-#: editor_markers.cc:957
+#: editor_markers.cc:960
 msgid "Hide Range"
 msgstr "Cacher l'intervalle"
 
-#: editor_markers.cc:958
+#: editor_markers.cc:961
 msgid "Rename Range..."
 msgstr "Renommer l'intervalle…"
 
-#: editor_markers.cc:962
+#: editor_markers.cc:965
 msgid "Remove Range"
 msgstr "Supprimer l'intervalle"
 
-#: editor_markers.cc:969
+#: editor_markers.cc:972
 msgid "Separate Regions in Range"
 msgstr "Séparer les régions dans l'intervalle"
 
-#: editor_markers.cc:972
+#: editor_markers.cc:974
 msgid "Select Range"
 msgstr "Intervalle de sélection"
 
-#: editor_markers.cc:1001
+#: editor_markers.cc:987
+msgid "Make Ramped"
+msgstr ""
+
+#: editor_markers.cc:989
+msgid "Make Constant"
+msgstr ""
+
+#: editor_markers.cc:993 editor_markers.cc:1013
+msgid "Lock to Music"
+msgstr ""
+
+#: editor_markers.cc:995 editor_markers.cc:1015
+msgid "Lock to Audio"
+msgstr ""
+
+#: editor_markers.cc:1034
 msgid "Set Punch Range"
 msgstr "Intervalle de « Punch »"
 
-#: editor_markers.cc:1407 editor_ops.cc:2040
+#: editor_markers.cc:1391
+msgid "change meter lock style"
+msgstr ""
+
+#: editor_markers.cc:1414
+msgid "change tempo lock style"
+msgstr ""
+
+#: editor_markers.cc:1441
+msgid "change tempo type"
+msgstr ""
+
+#: editor_markers.cc:1509 editor_ops.cc:2119
 msgid "New Name:"
 msgstr "Nouveau nom :"
 
-#: editor_markers.cc:1410
+#: editor_markers.cc:1512
 msgid "Rename Mark"
 msgstr "Renommer le repère"
 
-#: editor_markers.cc:1412
+#: editor_markers.cc:1514
 msgid "Rename Range"
 msgstr "Renommer l'intervalle"
 
-#: editor_markers.cc:1419 editor_mouse.cc:2137 processor_box.cc:1994
-#: processor_box.cc:2464 route_time_axis.cc:1100 route_ui.cc:1628
+#: editor_markers.cc:1521 editor_mouse.cc:2272 processor_box.cc:3192
+#: processor_box.cc:3681 route_time_axis.cc:1110 route_ui.cc:1637
+#: vca_master_strip.cc:395
 msgid "Rename"
 msgstr "Renommer"
 
-#: editor_markers.cc:1432
+#: editor_markers.cc:1534
 msgid "rename marker"
 msgstr "renommer le repère"
 
-#: editor_mixer.cc:90
+#: editor_mixer.cc:98
 msgid "This screen is not tall enough to display the editor mixer"
 msgstr ""
 "Cet écran n'est pas assez haut pour afficher la tranche de mixage de "
 "l'éditeur"
 
-#: editor_mouse.cc:1223 editor_mouse.cc:1241 editor_tempodisplay.cc:270
-#, fuzzy
+#: editor_mouse.cc:1345 editor_mouse.cc:1363 editor_tempodisplay.cc:384
 msgid ""
 "programming error: tempo marker canvas item has no marker object pointer!"
 msgstr ""
-"programming error: tempo marker canvas item has no marker object pointer!"
 
-#: editor_mouse.cc:1228 editor_tempodisplay.cc:275
-#, fuzzy
+#: editor_mouse.cc:1350 editor_tempodisplay.cc:389
 msgid "programming error: marker for tempo is not a tempo marker!"
-msgstr "programming error: marker for tempo is not a tempo marker!"
+msgstr ""
 
-#: editor_mouse.cc:1246 editor_tempodisplay.cc:375
-#, fuzzy
+#: editor_mouse.cc:1368 editor_tempodisplay.cc:507
 msgid "programming error: marker for meter is not a meter marker!"
-msgstr "programming error: marker for meter is not a meter marker!"
+msgstr ""
 
-#: editor_mouse.cc:1885 editor_mouse.cc:1910 editor_mouse.cc:1923
-#, fuzzy
+#: editor_mouse.cc:2016 editor_mouse.cc:2041 editor_mouse.cc:2054
 msgid ""
 "programming error: control point canvas item has no control point object "
 "pointer!"
 msgstr ""
-"programming error: control point canvas item has no control point object "
-"pointer!"
 
-#: editor_mouse.cc:2058
+#: editor_mouse.cc:2085
+msgid "edit note(s)"
+msgstr "édition de notes"
+
+#: editor_mouse.cc:2193
 msgid "start point trim"
-msgstr "Rogner le début"
+msgstr "rogner le début"
 
-#: editor_mouse.cc:2083
-msgid "End point trim"
-msgstr "Rogner la fin"
+#: editor_mouse.cc:2218
+msgid "end point trim"
+msgstr "rogner la fin"
 
-#: editor_mouse.cc:2135
+#: editor_mouse.cc:2270
 msgid "Name for region:"
 msgstr "Nom de la région :"
 
-#: editor_ops.cc:165
+#: editor_ops.cc:168
 msgid "split"
 msgstr "scinder"
 
-#: editor_ops.cc:339
+#: editor_ops.cc:342
 msgid "alter selection"
 msgstr "altérer la sélection"
 
-#: editor_ops.cc:381
+#: editor_ops.cc:384
 msgid "nudge regions forward"
 msgstr "décaler les régions vers la droite"
 
-#: editor_ops.cc:404 editor_ops.cc:489
+#: editor_ops.cc:441 editor_ops.cc:535
 msgid "nudge location forward"
 msgstr "décaler l'emplacement vers la droite"
 
-#: editor_ops.cc:462
+#: editor_ops.cc:472
 msgid "nudge regions backward"
 msgstr "décaler les régions vers la gauche"
 
-#: editor_ops.cc:551
+#: editor_ops.cc:567
 msgid "nudge forward"
 msgstr "décaler vers la droite"
 
-#: editor_ops.cc:575
+#: editor_ops.cc:591
 msgid "nudge backward"
 msgstr "décaler vers la gauche"
 
-#: editor_ops.cc:618
+#: editor_ops.cc:656
 msgid "sequence regions"
 msgstr "séquencer les régions"
 
-#: editor_ops.cc:694
+#: editor_ops.cc:718
 msgid "build_region_boundary_cache called with snap_type = %1"
 msgstr "build_region_boundary_cache appelé avec snap_type = %1"
 
-#: editor_ops.cc:2042
+#: editor_ops.cc:2121
 msgid "New Location Marker"
 msgstr "Nouveau repère de position"
 
-#: editor_ops.cc:2164
+#: editor_ops.cc:2212 editor_ops.cc:2236
+msgid "Set session start"
+msgstr ""
+
+#: editor_ops.cc:2304
 msgid "add markers"
 msgstr "ajouter des repères"
 
-#: editor_ops.cc:2274
+#: editor_ops.cc:2400
 msgid "clear markers"
 msgstr "effacer les repères"
 
-#: editor_ops.cc:2289
+#: editor_ops.cc:2415
 msgid "clear ranges"
 msgstr "effacer les intervalles"
 
-#: editor_ops.cc:2305
+#: editor_ops.cc:2431
 msgid "clear locations"
 msgstr "effacer les repères temporels"
 
-#: editor_ops.cc:2368
+#: editor_ops.cc:2494
 msgid "insert region"
 msgstr "insertion de région"
 
-#: editor_ops.cc:2559
+#: editor_ops.cc:2685
 msgid "raise regions"
 msgstr "remonter les régions"
 
-#: editor_ops.cc:2561
+#: editor_ops.cc:2687
 msgid "raise region"
 msgstr "remonter la région"
 
-#: editor_ops.cc:2567
+#: editor_ops.cc:2693
 msgid "raise regions to top"
 msgstr "remonter les régions tout en haut"
 
-#: editor_ops.cc:2569
+#: editor_ops.cc:2695
 msgid "raise region to top"
 msgstr "remonter la région tout en haut"
 
-#: editor_ops.cc:2575
+#: editor_ops.cc:2701
 msgid "lower regions"
 msgstr "descendre les régions"
 
-#: editor_ops.cc:2577 editor_ops.cc:2585
+#: editor_ops.cc:2703 editor_ops.cc:2711
 msgid "lower region"
 msgstr "descendre la région"
 
-#: editor_ops.cc:2583
+#: editor_ops.cc:2709
 msgid "lower regions to bottom"
 msgstr "descendre les régions tout en bas"
 
-#: editor_ops.cc:2668
+#: editor_ops.cc:2794
 msgid "Rename Region"
 msgstr "renommer la région"
 
-#: editor_ops.cc:2670 processor_box.cc:1992 route_ui.cc:1626
+#: editor_ops.cc:2796 processor_box.cc:3190 route_ui.cc:1635
 msgid "New name:"
 msgstr "Nouveau nom :"
 
-#: editor_ops.cc:2987
+#: editor_ops.cc:3097
 msgid "separate"
 msgstr "séparer"
 
-#: editor_ops.cc:3099
+#: editor_ops.cc:3207
 msgid "separate region under"
 msgstr "séparer la région dessous"
 
-#: editor_ops.cc:3220
+#: editor_ops.cc:3360
 msgid "trim to selection"
 msgstr "rogner à la sélection"
 
-#: editor_ops.cc:3356
+#: editor_ops.cc:3442
 msgid "set sync point"
 msgstr "placer le point de synchro"
 
-#: editor_ops.cc:3380
+#: editor_ops.cc:3466
 msgid "remove region sync"
 msgstr "supprimer la synchro de région"
 
-#: editor_ops.cc:3402
+#: editor_ops.cc:3488
 msgid "move regions to original position"
 msgstr "déplacer les régions à leur position d'origine"
 
-#: editor_ops.cc:3404
+#: editor_ops.cc:3490
 msgid "move region to original position"
 msgstr "replacer la région à sa position initiale"
 
-#: editor_ops.cc:3425
+#: editor_ops.cc:3511
 msgid "align selection"
 msgstr "aligner la sélection"
 
-#: editor_ops.cc:3499
+#: editor_ops.cc:3585
 msgid "align selection (relative)"
 msgstr "aligner la sélection (relatif)"
 
-#: editor_ops.cc:3533
+#: editor_ops.cc:3619
 msgid "align region"
 msgstr "aligner la région"
 
-#: editor_ops.cc:3584
+#: editor_ops.cc:3670
 msgid "trim front"
 msgstr "Rogner en avant"
 
-#: editor_ops.cc:3584
+#: editor_ops.cc:3670
 msgid "trim back"
 msgstr "Rogner en arrière"
 
-#: editor_ops.cc:3614
+#: editor_ops.cc:3700
 msgid "trim to loop"
 msgstr "rogner à la boucle"
 
-#: editor_ops.cc:3624
+#: editor_ops.cc:3710
 msgid "trim to punch"
 msgstr "rogner au punch"
 
-#: editor_ops.cc:3686
+#: editor_ops.cc:3832
 msgid "trim to region"
 msgstr "rogner autour de la région"
 
-#: editor_ops.cc:3794
+#: editor_ops.cc:3891
 msgid ""
 "This track/bus cannot be frozen because the signal adds or loses channels "
 "before reaching the outputs.\n"
@@ -5281,11 +5968,11 @@ msgstr ""
 "Ceci est typiquement causé par des greffons qui génèrent une sortie stéréo à "
 "partir d'une entrée mono ou vice-versa."
 
-#: editor_ops.cc:3797
+#: editor_ops.cc:3894
 msgid "Cannot freeze"
 msgstr "Impossible de geler"
 
-#: editor_ops.cc:3803
+#: editor_ops.cc:3900
 msgid ""
 "<b>%1</b>\n"
 "\n"
@@ -5301,24 +5988,23 @@ msgstr ""
 "Geler cette piste affectera ce cheminement à partir du premier départ/"
 "insertion."
 
-#: editor_ops.cc:3807
+#: editor_ops.cc:3904
 msgid "Freeze anyway"
 msgstr "Geler quand même"
 
-#: editor_ops.cc:3808
+#: editor_ops.cc:3905
 msgid "Don't freeze"
 msgstr "Ne pas geler"
 
-#: editor_ops.cc:3809
+#: editor_ops.cc:3906
 msgid "Freeze Limits"
 msgstr "Limites du gel"
 
-#: editor_ops.cc:3824
+#: editor_ops.cc:3921
 msgid "Cancel Freeze"
 msgstr "Annuler le gel"
 
-#: editor_ops.cc:3854
-#, fuzzy
+#: editor_ops.cc:3952
 msgid ""
 "You can't perform this operation because the processing of the signal will "
 "cause one or more of the tracks to end up with a region with more channels "
@@ -5326,53 +6012,52 @@ msgid ""
 "\n"
 "You can do this without processing, which is a different operation."
 msgstr ""
-"Opération impossible: le traitement du signal sur une ou plusieurs Pistes va "
-"créer une ou plusieurs Régions avec plus de canaux que la ou les Pistes ont "
-"d'entrées.\n"
+"Opération impossible: le traitement du signal va obliger au moins une piste "
+"à contenir une région ayant plus de canaux que la piste a d'entrées.\n"
 "\n"
 "Vous pouvez faire cela sans traitement, ce qui est une opération différente."
 
-#: editor_ops.cc:3858
+#: editor_ops.cc:3956
 msgid "Cannot bounce"
 msgstr "Impossible de « bouncer »"
 
-#: editor_ops.cc:3869
+#: editor_ops.cc:4007
 msgid "bounce range"
 msgstr "« bouncer » l'intervalle"
 
-#: editor_ops.cc:3971
+#: editor_ops.cc:4074
 msgid "delete"
 msgstr "effacer"
 
-#: editor_ops.cc:3974
+#: editor_ops.cc:4077
 msgid "cut"
 msgstr "couper"
 
-#: editor_ops.cc:3977
+#: editor_ops.cc:4080
 msgid "copy"
 msgstr "copier"
 
-#: editor_ops.cc:3980
+#: editor_ops.cc:4083
 msgid "clear"
 msgstr "effacer"
 
-#: editor_ops.cc:4028
+#: editor_ops.cc:4132
 msgid "objects"
 msgstr "objets"
 
-#: editor_ops.cc:4238 editor_ops.cc:4270
+#: editor_ops.cc:4342 editor_ops.cc:4427
 msgid "remove region"
 msgstr "supprimer la région"
 
-#: editor_ops.cc:4719
-msgid "duplicate selection"
-msgstr "dupliquer la sélection"
+#: editor_ops.cc:4844
+msgid "duplicate range selection"
+msgstr ""
 
-#: editor_ops.cc:4803
+#: editor_ops.cc:4938
 msgid "nudge track"
 msgstr "décaler la piste"
 
-#: editor_ops.cc:4840
+#: editor_ops.cc:4965
 msgid ""
 "Do you really want to destroy the last capture?\n"
 "(This is destructive and cannot be undone)"
@@ -5380,138 +6065,158 @@ msgstr ""
 "Voulez-vous vraiment supprimer le dernier enregistrement ?\n"
 "(Cette opération est destructive et ne pourra pas être annulée)"
 
-#: editor_ops.cc:4843 editor_ops.cc:6838 editor_regions.cc:462
-#: editor_snapshots.cc:159 route_ui.cc:1569
+#: editor_ops.cc:4968 editor_ops.cc:7202 editor_regions.cc:503
+#: editor_snapshots.cc:171
 msgid "No, do nothing."
 msgstr "Non, ne rien faire."
 
-#: editor_ops.cc:4844
+#: editor_ops.cc:4969
 msgid "Yes, destroy it."
 msgstr "Oui, la détruire."
 
-#: editor_ops.cc:4846
+#: editor_ops.cc:4971
 msgid "Destroy last capture"
 msgstr "Supprimer la dernière capture"
 
-#: editor_ops.cc:4906
+#: editor_ops.cc:5047
 msgid "normalize"
 msgstr "normaliser"
 
-#: editor_ops.cc:5000
+#: editor_ops.cc:5145
 msgid "reverse regions"
 msgstr "inverser les régions"
 
-#: editor_ops.cc:5034
+#: editor_ops.cc:5182
 msgid "strip silence"
 msgstr "supprimer le silence"
 
-#: editor_ops.cc:5091
+#: editor_ops.cc:5263
 msgid "Fork Region(s)"
 msgstr "Séparer région(s)"
 
-#: editor_ops.cc:5112
+#: editor_ops.cc:5270
 msgid "Could not unlink %1"
 msgstr "Impossible de délier %1"
 
-#: editor_ops.cc:5326
+#: editor_ops.cc:5532
 msgid "reset region gain"
 msgstr "réinitialiser le gain"
 
-#: editor_ops.cc:5379
+#: editor_ops.cc:5590
 msgid "region gain envelope active"
 msgstr "enveloppe de gain de la région active"
 
-#: editor_ops.cc:5406
+#: editor_ops.cc:5615
 msgid "toggle region lock"
 msgstr "verrouiller/déverrouiller la région"
 
-#: editor_ops.cc:5430
+#: editor_ops.cc:5639
 msgid "Toggle Video Lock"
 msgstr "Basculer le verrou vidéo"
 
-#: editor_ops.cc:5454
+#: editor_ops.cc:5663
 msgid "region lock style"
 msgstr "type de verrouillage de la région"
 
-#: editor_ops.cc:5479
+#: editor_ops.cc:5688
 msgid "change region opacity"
 msgstr "changer l'opacité de la région"
 
-#: editor_ops.cc:5572
+#: editor_ops.cc:5781
 #, fuzzy
 msgid "fade range"
 msgstr "intervalle de fondu"
 
-#: editor_ops.cc:5610
+#: editor_ops.cc:5819
 msgid "set fade in length"
 msgstr "définir la durée de montée"
 
-#: editor_ops.cc:5617
+#: editor_ops.cc:5826
 msgid "set fade out length"
 msgstr "définir la durée de descente"
 
-#: editor_ops.cc:5662
+#: editor_ops.cc:5891
 msgid "set fade in shape"
 msgstr "définir la forme de la montée"
 
-#: editor_ops.cc:5693
+#: editor_ops.cc:5926
 msgid "set fade out shape"
 msgstr "définir la forme de la descente"
 
-#: editor_ops.cc:5723
+#: editor_ops.cc:5962
 msgid "set fade in active"
 msgstr "active la montée"
 
-#: editor_ops.cc:5752
+#: editor_ops.cc:5996
 msgid "set fade out active"
 msgstr "active la descente"
 
-#: editor_ops.cc:5994
+#: editor_ops.cc:6056
+msgid "toggle fade active"
+msgstr ""
+
+#: editor_ops.cc:6249
 msgid "set loop range from selection"
 msgstr "régler l'intervalle de boucle sur la sélection"
 
-#: editor_ops.cc:6008
+#: editor_ops.cc:6263
 msgid "set loop range from region"
 msgstr "régler l'intervalle de boucle sur la région"
 
-#: editor_ops.cc:6027
+#: editor_ops.cc:6282
 msgid "set punch range from selection"
 msgstr "régler l'intervalle de « punch » sur la sélection"
 
-#: editor_ops.cc:6041
+#: editor_ops.cc:6306
 msgid "set session start/end from selection"
+msgstr "Définir le début et la fin de la session depuis la sélection "
+
+#: editor_ops.cc:6344
+msgid "set punch start from EP"
+msgstr ""
+
+#: editor_ops.cc:6372
+msgid "set punch end from EP"
+msgstr ""
+
+#: editor_ops.cc:6405
+msgid "set loop start from EP"
+msgstr ""
+
+#: editor_ops.cc:6433
+msgid "set loop end from EP"
 msgstr ""
 
-#: editor_ops.cc:6066
+#: editor_ops.cc:6444
 msgid "set punch range from region"
 msgstr "régler l'intervalle de « punch » sur la région"
 
-#: editor_ops.cc:6175
+#: editor_ops.cc:6531
 msgid "Add new marker"
 msgstr "Ajouter un nouveau repère"
 
-#: editor_ops.cc:6176
+#: editor_ops.cc:6532
 msgid "Set global tempo"
 msgstr "Définir le tempo global"
 
-#: editor_ops.cc:6179
+#: editor_ops.cc:6535
 msgid "Define one bar"
 msgstr "Définir une mesure"
 
-#: editor_ops.cc:6180
+#: editor_ops.cc:6536
 msgid "Do you want to set the global tempo or add a new tempo marker?"
 msgstr ""
 "Voulez-vous définir le tempo global ou ajouter un nouveau repère de tempo ?"
 
-#: editor_ops.cc:6206
+#: editor_ops.cc:6562
 msgid "set tempo from region"
 msgstr "Définir le tempo depuis la région"
 
-#: editor_ops.cc:6236
+#: editor_ops.cc:6591
 msgid "split regions"
 msgstr "scinder les régions"
 
-#: editor_ops.cc:6278
+#: editor_ops.cc:6633
 msgid ""
 "You are about to split\n"
 "%1\n"
@@ -5523,11 +6228,11 @@ msgstr ""
 "en %2 parties.\n"
 "Cela peut prendre un certain temps."
 
-#: editor_ops.cc:6285
+#: editor_ops.cc:6640
 msgid "Call for the Ferret!"
 msgstr "Appeler le Fureteur !"
 
-#: editor_ops.cc:6286
+#: editor_ops.cc:6641
 msgid ""
 "Press OK to continue with this split operation\n"
 "or ask the Ferret dialog to tune the analysis"
@@ -5535,53 +6240,53 @@ msgstr ""
 "Appuyer sur OK pour poursuivre cette séparation\n"
 "ou « Demander au Fureteur » pour affiner l'analyse"
 
-#: editor_ops.cc:6288
+#: editor_ops.cc:6643
 msgid "Press OK to continue with this split operation"
 msgstr "Appuyer sur OK pour éxécuter la séparation"
 
-#: editor_ops.cc:6291
+#: editor_ops.cc:6646
 msgid "Excessive split?"
 msgstr "Trop de séparations ?"
 
-#: editor_ops.cc:6443
+#: editor_ops.cc:6800
 msgid "place transient"
 msgstr "placer transitoire"
 
-#: editor_ops.cc:6478
+#: editor_ops.cc:6834
 msgid "snap regions to grid"
 msgstr "aligner les régions sur la grille"
 
-#: editor_ops.cc:6517
+#: editor_ops.cc:6873
 msgid "Close Region Gaps"
 msgstr "Combler les écarts de région"
 
-#: editor_ops.cc:6522
+#: editor_ops.cc:6878
 msgid "Crossfade length"
 msgstr "Longueur du fondu enchaîné"
 
-#: editor_ops.cc:6531 editor_ops.cc:6542 rhythm_ferret.cc:119
-#: session_option_editor.cc:141
+#: editor_ops.cc:6887 editor_ops.cc:6898 rhythm_ferret.cc:128
+#: rhythm_ferret.cc:143 session_option_editor.cc:141
 msgid "ms"
 msgstr "ms"
 
-#: editor_ops.cc:6533
+#: editor_ops.cc:6889
 #, fuzzy
 msgid "Pull-back length"
 msgstr "Durée du retrait"
 
-#: editor_ops.cc:6546
+#: editor_ops.cc:6902 keyeditor.cc:71
 msgid "Ok"
 msgstr "Ok"
 
-#: editor_ops.cc:6561
+#: editor_ops.cc:6917
 msgid "close region gaps"
 msgstr "combler les écarts de région"
 
-#: editor_ops.cc:6786 route_ui.cc:1543
+#: editor_ops.cc:7160
 msgid "That would be bad news ...."
 msgstr "Mauvaise nouvelle…"
 
-#: editor_ops.cc:6791 route_ui.cc:1548
+#: editor_ops.cc:7165
 msgid ""
 "Removing the master or monitor bus is such a bad idea\n"
 "that %1 is not going to allow it.\n"
@@ -5596,23 +6301,19 @@ msgstr ""
 "Si vous voulez vraiment le faire, éditez le fichier ardour.rc\n"
 "et passez l'option « allow-special-bus-removal » à « yes »"
 
-#: editor_ops.cc:6809
-msgid "tracks"
-msgstr "pistes"
-
-#: editor_ops.cc:6811 route_ui.cc:1992
+#: editor_ops.cc:7181
 msgid "track"
-msgstr "piste"
+msgid_plural "tracks"
+msgstr[0] "piste"
+msgstr[1] "pistes"
 
-#: editor_ops.cc:6815
-msgid "busses"
-msgstr "bus"
-
-#: editor_ops.cc:6817 route_ui.cc:1992
+#: editor_ops.cc:7182
 msgid "bus"
-msgstr "bus"
+msgid_plural "busses"
+msgstr[0] "bus"
+msgstr[1] "bus"
 
-#: editor_ops.cc:6822
+#: editor_ops.cc:7186
 msgid ""
 "Do you really want to remove %1 %2 and %3 %4?\n"
 "(You may also lose the playlists associated with the %2)\n"
@@ -5625,7 +6326,7 @@ msgstr ""
 "Le fichier de session sera écrasé et cette action ne pourra pas être "
 "annulée !"
 
-#: editor_ops.cc:6827
+#: editor_ops.cc:7191
 msgid ""
 "Do you really want to remove %1 %2?\n"
 "(You may also lose the playlists associated with the %2)\n"
@@ -5638,8 +6339,7 @@ msgstr ""
 "Le fichier de session sera écrasé et tette action ne pourra pas être "
 "annulée !"
 
-#: editor_ops.cc:6833
-#, fuzzy
+#: editor_ops.cc:7197
 msgid ""
 "Do you really want to remove %1 %2?\n"
 "\n"
@@ -5647,148 +6347,149 @@ msgid ""
 msgstr ""
 "Voulez-vous vraiment supprimer %1 %2 ?\n"
 "\n"
-"Le fichier de session sera écrasé et tette action ne pourra pas être "
+"Le fichier de session sera écrasé et cette action ne pourra pas être "
 "annulée !"
 
-#: editor_ops.cc:6840
+#: editor_ops.cc:7204
 msgid "Yes, remove them."
 msgstr "Oui, supprimer."
 
-#: editor_ops.cc:6842 editor_snapshots.cc:160 route_ui.cc:1570
+#: editor_ops.cc:7206 editor_snapshots.cc:172
 msgid "Yes, remove it."
 msgstr "Oui, supprimer."
 
-#: editor_ops.cc:6847 editor_ops.cc:6849
+#: editor_ops.cc:7211 editor_ops.cc:7213
 msgid "Remove %1"
 msgstr "Supprimer %1"
 
-#: editor_ops.cc:6912
+#: editor_ops.cc:7319 editor_ops.cc:7333 editor_ops.cc:7373 editor_ops.cc:7383
 msgid "insert time"
 msgstr "insérer temps"
 
-#: editor_ops.cc:7076
+#: editor_ops.cc:7436
+msgid "Cannot insert or delete time when in Lock edit."
+msgstr ""
+
+#: editor_ops.cc:7456 editor_ops.cc:7468 editor_ops.cc:7541 editor_ops.cc:7554
+msgid "remove time"
+msgstr ""
+
+#: editor_ops.cc:7628
 msgid "There are too many tracks to fit in the current window"
 msgstr "La fenêtre courante ne peux pas afficher toutes les pistes"
 
-#: editor_ops.cc:7137
+#: editor_ops.cc:7689
 msgid "Sel"
 msgstr "Sél"
 
-#: editor_ops.cc:7176
+#: editor_ops.cc:7728
 #, c-format
 msgid "Saved view %u"
 msgstr "Vue %u sauvegardée"
 
-#: editor_ops.cc:7201
+#: editor_ops.cc:7753
 msgid "mute regions"
 msgstr "rendre les régions muettes"
 
-#: editor_ops.cc:7203
+#: editor_ops.cc:7755
 msgid "mute region"
 msgstr "rendre la région muette"
 
-#: editor_ops.cc:7240
+#: editor_ops.cc:7792
 msgid "combine regions"
 msgstr "joindre les régions"
 
-#: editor_ops.cc:7278
+#: editor_ops.cc:7830
 msgid "uncombine regions"
 msgstr "disjoindre les régions"
 
-#: editor_ops.cc:7315
+#: editor_ops.cc:7867
 msgid "%1: Locked"
 msgstr "%1 : verrouillé"
 
-#: editor_ops.cc:7322
+#: editor_ops.cc:7874
 msgid "Click to unlock"
 msgstr "Cliquer pour déverrouiller"
 
-#: editor_ops.cc:7376
+#: editor_ops.cc:7923
 msgid "Moving embedded files into session folder"
 msgstr "Déplacer les fichiers embarqués dans le dossier de session"
 
-#: editor_regions.cc:112
+#: editor_regions.cc:159
 msgid "Region name, with number of channels in []'s"
 msgstr "Nom de région avec nombre de canaux entre crochets"
 
-#: editor_regions.cc:113
+#: editor_regions.cc:160
 msgid "Position of start of region"
 msgstr "Position de début de la région"
 
-#: editor_regions.cc:114 editor_regions.cc:851 time_info_box.cc:101
+#: editor_regions.cc:161 editor_regions.cc:935 time_info_box.cc:95
 msgid "End"
 msgstr "Fin"
 
-#: editor_regions.cc:114
+#: editor_regions.cc:161
 msgid "Position of end of region"
 msgstr "Position de la fin de la région"
 
-#: editor_regions.cc:115
+#: editor_regions.cc:162
 msgid "Length of the region"
 msgstr "Longueur de la région"
 
-#: editor_regions.cc:116
+#: editor_regions.cc:163
 msgid "Position of region sync point, relative to start of the region"
 msgstr ""
 "Position du point de synchronisation de la région relativement au début de "
 "la région"
 
-#: editor_regions.cc:117
+#: editor_regions.cc:164
 msgid "Length of region fade-in (units: secondary clock), () if disabled"
 msgstr ""
 "Longueur du fondu d'entrée de la région (unités : horloge secondaire), () si "
 "désactivé"
 
-#: editor_regions.cc:118
+#: editor_regions.cc:165
 msgid "Length of region fade-out (units: secondary clock), () if disabled"
 msgstr ""
 "Longueur du fondu de sortie de la région (unités : horloge secondaire), () "
 "si désactivé"
 
-#: editor_regions.cc:119 mixer_strip.cc:2055 mono_panner.cc:203
-#: panner2d.cc:240 stereo_panner.cc:251 stereo_panner.cc:274
-msgid "L"
+#: editor_regions.cc:166
+msgid "Lock|L"
 msgstr "L"
 
-#: editor_regions.cc:119
+#: editor_regions.cc:166
 msgid "Region position locked?"
 msgstr "Position de la région verrouillée ?"
 
-#: editor_regions.cc:120 route_time_axis.cc:103
-msgid "G"
+#: editor_regions.cc:167
+msgid "Gain|G"
 msgstr "G"
 
-#: editor_regions.cc:120
+#: editor_regions.cc:167
 msgid "Region position glued to Bars|Beats time?"
 msgstr "Position de la région collée au temps des Mesures|Temps ?"
 
-#: editor_regions.cc:121 editor_routes.cc:211 gain_meter.cc:793
-#: mixer_strip.cc:2032 meter_strip.cc:359 panner_ui.cc:603
-#: route_time_axis.cc:2713 stereo_panner.cc:271 time_axis_view.cc:1190
-msgid "M"
-msgstr "M"
-
-#: editor_regions.cc:121
+#: editor_regions.cc:168
 msgid "Region muted?"
 msgstr "Région muette ?"
 
-#: editor_regions.cc:122 mixer_strip.cc:1855
-msgid "O"
+#: editor_regions.cc:169
+msgid "Opaque|O"
 msgstr "O"
 
-#: editor_regions.cc:122
+#: editor_regions.cc:169
 msgid "Region opaque (blocks regions below it from being heard)?"
 msgstr "Région opaque (empêche les régions en dessous d'être entendues) ?"
 
-#: editor_regions.cc:311 editor_regions.cc:316 editor_regions.cc:318
+#: editor_regions.cc:360 editor_regions.cc:365 editor_regions.cc:367
 msgid "Hidden"
 msgstr "Caché"
 
-#: editor_regions.cc:391
+#: editor_regions.cc:432
 msgid "(MISSING) "
 msgstr " (MANQUANT)"
 
-#: editor_regions.cc:459
+#: editor_regions.cc:500
 msgid ""
 "Do you really want to remove unused regions?\n"
 "(This is destructive and cannot be undone)"
@@ -5796,180 +6497,188 @@ msgstr ""
 "Voulez-vous vraiment supprimer les régions non-utilisées ?\n"
 "(Cette opération est destructive et ne pourra pas être annulée)"
 
-#: editor_regions.cc:463
+#: editor_regions.cc:504
 msgid "Yes, remove."
 msgstr "Oui, supprimer."
 
-#: editor_regions.cc:465
+#: editor_regions.cc:506
 msgid "Remove unused regions"
 msgstr "Supprimer les régions non-utilisées"
 
-#: editor_regions.cc:818 editor_regions.cc:832 editor_regions.cc:846
+#: editor_regions.cc:735
+msgid "EditorRegions::format_position: negative timecode position: %1"
+msgstr "EditorRegions::format_position: la position a un timecode négatif: %1"
+
+#: editor_regions.cc:900 editor_regions.cc:916 editor_regions.cc:930
 msgid "Mult."
 msgstr "Mult."
 
-#: editor_regions.cc:849 midi_list_editor.cc:104 time_info_box.cc:94
+#: editor_regions.cc:933 midi_list_editor.cc:104 time_info_box.cc:88
 msgid "Start"
 msgstr "Début"
 
-#: editor_regions.cc:867 editor_regions.cc:883
+#: editor_regions.cc:951 editor_regions.cc:967
 msgid "Multiple"
 msgstr "Multiple"
 
-#: editor_regions.cc:952
+#: editor_regions.cc:1036
 msgid "MISSING "
 msgstr "(MANQUANT)"
 
-#: editor_routes.cc:182 editor_routes.cc:214
+#: editor_routes.cc:126
+msgid "RS"
+msgstr ""
+
+#: editor_routes.cc:208
 msgid "SS"
 msgstr "SS"
 
-#: editor_routes.cc:206
+#: editor_routes.cc:233
 msgid "Track/Bus Name"
 msgstr "Nom de piste/bus"
 
-#: editor_routes.cc:207
+#: editor_routes.cc:234
 msgid "Track/Bus visible ?"
 msgstr "Piste/bus visible ?"
 
-#: editor_routes.cc:208 mixer_strip.cc:2046 meter_strip.cc:371
-#: route_time_axis.cc:105 route_time_axis.cc:2701
-msgid "A"
-msgstr "A"
-
-#: editor_routes.cc:208
+#: editor_routes.cc:235
 msgid "Track/Bus active ?"
 msgstr "Piste/bus actif ?"
 
-# Short for Input
-#: editor_routes.cc:209 mixer_strip.cc:2033 mixer_strip.cc:2054
-#: meter_strip.cc:379
-msgid "I"
-msgstr "E"
+#: editor_routes.cc:236
+msgid "MidiInput|I"
+msgstr "I"
 
-#: editor_routes.cc:209
+#: editor_routes.cc:236
 msgid "MIDI input enabled"
 msgstr "Entrée MIDI activée"
 
-#: editor_routes.cc:210 mono_panner.cc:220 panner2d.cc:241
-#: stereo_panner.cc:249 stereo_panner.cc:276
-msgid "R"
-msgstr "R"
+#: editor_routes.cc:237
+msgid "Rec|R"
+msgstr ""
 
-#: editor_routes.cc:210
+#: editor_routes.cc:237
 msgid "Record enabled"
 msgstr "Enregistrement armé"
 
-#: editor_routes.cc:211
+#: editor_routes.cc:238
+msgid "Rec|RS"
+msgstr ""
+
+#: editor_routes.cc:238
+msgid "Record Safe"
+msgstr "Protégé contre l'enregistrement"
+
+#: editor_routes.cc:239
 msgid "Muted"
 msgstr "Muet"
 
-#: editor_routes.cc:212 mixer_strip.cc:2042 meter_strip.cc:367
-#: route_time_axis.cc:2710
-msgid "S"
-msgstr "S"
-
-#: editor_routes.cc:212
+#: editor_routes.cc:240
 msgid "Soloed"
 msgstr "Solo"
 
-#: editor_routes.cc:213
-msgid "SI"
-msgstr "SI"
+#: editor_routes.cc:241
+msgid "SoloIso|SI"
+msgstr ""
 
-#: editor_routes.cc:213
+#: editor_routes.cc:241
 msgid "Solo Isolated"
 msgstr "Solo isolé"
 
-#: editor_routes.cc:214
+#: editor_routes.cc:242
+msgid "SoloLock|SS"
+msgstr ""
+
+#: editor_routes.cc:242
 msgid "Solo Safe (Locked)"
 msgstr "Bloquer le solo"
 
-#: editor_routes.cc:477 mixer_ui.cc:1197
+#: editor_routes.cc:550 mixer_ui.cc:1498
 msgid "Hide All"
 msgstr "Tout cacher"
 
-#: editor_routes.cc:478 mixer_ui.cc:1198
+#: editor_routes.cc:551 mixer_ui.cc:1499
 msgid "Show All Audio Tracks"
 msgstr "Afficher toutes les pistes audio"
 
-#: editor_routes.cc:479 mixer_ui.cc:1199
+#: editor_routes.cc:552 mixer_ui.cc:1500
 msgid "Hide All Audio Tracks"
 msgstr "Cacher toutes les pistes audio"
 
-#: editor_routes.cc:480 mixer_ui.cc:1200
+#: editor_routes.cc:553 mixer_ui.cc:1501
 msgid "Show All Audio Busses"
 msgstr "Afficher tous les bus"
 
-#: editor_routes.cc:481 mixer_ui.cc:1201
+#: editor_routes.cc:554 mixer_ui.cc:1502
 msgid "Hide All Audio Busses"
 msgstr "Cacher tous les bus"
 
-#: editor_routes.cc:482
+#: editor_routes.cc:555 mixer_ui.cc:1503
 msgid "Show All Midi Tracks"
 msgstr "Afficher toutes les pistes MIDI"
 
-#: editor_routes.cc:483
+#: editor_routes.cc:556 mixer_ui.cc:1504
 msgid "Hide All Midi Tracks"
 msgstr "Cacher toutes les pistes MIDI"
 
-#: editor_routes.cc:484
-msgid "Show Tracks With Regions Under Playhead"
-msgstr "Afficher les pistes ayant une région sous la tête de lecture"
+#: editor_routes.cc:557
+msgid "Only Show Tracks with Regions Under Playhead"
+msgstr ""
+"Ne montrer que les pistes ayant des régions au niveau de la tête de lecture"
 
-#: editor_rulers.cc:211
+#: editor_rulers.cc:212
 msgid "New location marker"
 msgstr "Nouveau repère temporel"
 
-#: editor_rulers.cc:212
+#: editor_rulers.cc:213
 msgid "Clear all locations"
 msgstr "Supprimer tous les repères temporels"
 
-#: editor_rulers.cc:213
+#: editor_rulers.cc:214
 msgid "Unhide locations"
 msgstr "Réafficher les repères temporels"
 
-#: editor_rulers.cc:217
+#: editor_rulers.cc:218
 msgid "New range"
 msgstr "Nouvel intervalle"
 
-#: editor_rulers.cc:218
+#: editor_rulers.cc:219
 msgid "Clear all ranges"
 msgstr "Supprimer tous les intervalles"
 
-#: editor_rulers.cc:219
+#: editor_rulers.cc:220
 msgid "Unhide ranges"
 msgstr "Ré-afficher les intervalles masqués"
 
 #: editor_rulers.cc:224
-msgid "Make Loop range"
-msgstr ""
+msgid "New Loop range"
+msgstr "Nouvel intervalle de bouclage"
 
 #: editor_rulers.cc:225
-msgid "Make Punch range"
+msgid "New Punch range"
 msgstr ""
 
 #: editor_rulers.cc:230
 msgid "New CD track marker"
 msgstr "Nouveau repère de piste de CD"
 
-#: editor_rulers.cc:235 tempo_dialog.cc:38
+#: editor_rulers.cc:234 tempo_dialog.cc:38
 msgid "New Tempo"
 msgstr "Nouveau tempo"
 
-#: editor_rulers.cc:239 tempo_dialog.cc:296
+#: editor_rulers.cc:238 tempo_dialog.cc:419
 msgid "New Meter"
 msgstr "Nouvelle signature"
 
-#: editor_snapshots.cc:137
+#: editor_snapshots.cc:149
 msgid "Rename Snapshot"
 msgstr "Renommer le cliché"
 
-#: editor_snapshots.cc:139
+#: editor_snapshots.cc:151
 msgid "New name of snapshot"
 msgstr "Nouveau nom du cliché"
 
-#: editor_snapshots.cc:157
+#: editor_snapshots.cc:169
 msgid ""
 "Do you really want to remove snapshot \"%1\" ?\n"
 "(which cannot be undone)"
@@ -5977,82 +6686,92 @@ msgstr ""
 "Voulez-vous vraiment supprimer le cliché « %1 » ?\n"
 "(Cette action ne pourra pas être annulée)"
 
-#: editor_snapshots.cc:162
+#: editor_snapshots.cc:174
 msgid "Remove snapshot"
 msgstr "Supprimer le cliché"
 
-#: editor_tempodisplay.cc:194 editor_tempodisplay.cc:234
-msgid "add"
-msgstr "ajouter"
-
-#: editor_tempodisplay.cc:215
+#: editor_tempodisplay.cc:318
 msgid "add tempo mark"
 msgstr "ajouter un changement de tempo"
 
-#: editor_tempodisplay.cc:254
+#: editor_tempodisplay.cc:343
+msgid "add"
+msgstr "ajouter"
+
+#: editor_tempodisplay.cc:362
 msgid "add meter mark"
 msgstr "ajouter un changement de signature"
 
-#: editor_tempodisplay.cc:287 editor_tempodisplay.cc:315
+#: editor_tempodisplay.cc:401 editor_tempodisplay.cc:435
 msgid "done"
 msgstr "terminé"
 
-#: editor_tempodisplay.cc:304 editor_tempodisplay.cc:330
+#: editor_tempodisplay.cc:422
+msgid "replace meter mark"
+msgstr "remplacer le changement de signature"
+
+#: editor_tempodisplay.cc:454
 msgid "replace tempo mark"
 msgstr "remplacer le changement de tempo"
 
-#: editor_tempodisplay.cc:353 editor_tempodisplay.cc:387
+#: editor_tempodisplay.cc:485 editor_tempodisplay.cc:519
 msgid "remove tempo mark"
 msgstr "supprimer le changement de tempo"
 
-#: editor_tempodisplay.cc:370
-#, fuzzy
+#: editor_tempodisplay.cc:502
 msgid ""
 "programming error: meter marker canvas item has no marker object pointer!"
 msgstr ""
-"programming error: meter marker canvas item has no marker object pointer!"
 
 #: editor_timefx.cc:68
 msgid "stretch/shrink"
 msgstr "étirer/contracter"
 
-#: editor_timefx.cc:129
+#: editor_timefx.cc:130
 msgid "pitch shift"
-msgstr "pitch shift"
+msgstr "modifier la tonalité"
 
-#: editor_timefx.cc:301
+#: editor_timefx.cc:282
 msgid "timefx cannot be started - thread creation error"
 msgstr "impossible de démarrer timefx : erreur de création de thread"
 
-#: engine_dialog.cc:83
+#: engine_dialog.cc:86
 msgid "Device Control Panel"
 msgstr "Panneau de contrôle des appareils"
 
-#: engine_dialog.cc:84
+#: engine_dialog.cc:87
 msgid "Midi Device Setup"
 msgstr "Configuration des appareils MIDI"
 
-#: engine_dialog.cc:85 engine_dialog.cc:2097
+#: engine_dialog.cc:89
+msgid "Refresh Devices"
+msgstr ""
+
+#: engine_dialog.cc:90
+msgid "Use Buffered I/O"
+msgstr "Utiliser des E/S avec tampon"
+
+#: engine_dialog.cc:91 engine_dialog.cc:3000
 msgid "Measure"
 msgstr "Mesurer"
 
-#: engine_dialog.cc:86
+#: engine_dialog.cc:92
 msgid "Use results"
 msgstr "Utiliser les résultats"
 
-#: engine_dialog.cc:87
+#: engine_dialog.cc:93
 msgid "Back to settings ... (ignore results)"
 msgstr "Retour aux réglages… (ignorer les résultats)"
 
-#: engine_dialog.cc:88
+#: engine_dialog.cc:94
 msgid "Calibrate Audio"
 msgstr "Calibrer l'audio"
 
-#: engine_dialog.cc:92
+#: engine_dialog.cc:98
 msgid "Back to settings"
 msgstr "Retour aux réglages"
 
-#: engine_dialog.cc:111
+#: engine_dialog.cc:120
 msgid ""
 "No audio/MIDI backends detected. %1 cannot run\n"
 "\n"
@@ -6063,11 +6782,11 @@ msgstr ""
 "(C'est une erreur système/d'empaquetage/de compilation. Cela ne devrait "
 "jamais se produire.)"
 
-#: engine_dialog.cc:137
+#: engine_dialog.cc:145
 msgid "Latency Measurement Tool"
 msgstr "Outil de mesure de latence"
 
-#: engine_dialog.cc:149
+#: engine_dialog.cc:157
 msgid ""
 "<span weight=\"bold\">Turn down the volume on your audio equipment to a very "
 "low level.</span>"
@@ -6075,91 +6794,101 @@ msgstr ""
 "<span weight=\"bold\">Réglez le volume sur votre équipement audio à très "
 "faible niveau.</span>"
 
-#: engine_dialog.cc:158
+#: engine_dialog.cc:166
 msgid "Select two channels below and connect them using a cable."
 msgstr ""
 "Choisissez deux canaux ci-dessous et connectez-les à l'aide d'un câble."
 
-#: engine_dialog.cc:163
+#: engine_dialog.cc:171
 msgid "Output channel"
 msgstr "Canal de sortie"
 
-#: engine_dialog.cc:171
+#: engine_dialog.cc:179
 msgid "Input channel"
 msgstr "Canal d'entrée"
 
-#: engine_dialog.cc:206
+#: engine_dialog.cc:213
 msgid "Once the channels are connected, click the \"Measure\" button."
 msgstr "Une fois les canaux connectés, cliquez sur le bouton « Mesurer »."
 
-#: engine_dialog.cc:213
+#: engine_dialog.cc:220
 msgid "When satisfied with the results, click the \"Use results\" button."
 msgstr ""
 "Lorsque vous êtes satisfait des résultats, cliquez sur le bouton « Utiliser "
 "les résultats »."
 
-#: engine_dialog.cc:228 engine_dialog.cc:2217 engine_dialog.cc:2227
+#: engine_dialog.cc:235 engine_dialog.cc:3138 engine_dialog.cc:3148
 msgid "No measurement results yet"
 msgstr "Aucun résultat de mesure pour le moment"
 
-#: engine_dialog.cc:238 route_params_ui.cc:106
+#: engine_dialog.cc:245 route_params_ui.cc:106
 msgid "Latency"
 msgstr "Latence"
 
-#: engine_dialog.cc:372
+#: engine_dialog.cc:520
 msgid "Audio System:"
 msgstr "Système audio :"
 
-#: engine_dialog.cc:409
+#: engine_dialog.cc:564
 msgid "Driver:"
 msgstr "Pilote :"
 
-#: engine_dialog.cc:415
+#: engine_dialog.cc:571
+msgid "Input Device:"
+msgstr "Périphérique d'entrée :"
+
+#: engine_dialog.cc:575
+msgid "Output Device:"
+msgstr "Périphérique de sortie :"
+
+#: engine_dialog.cc:582
 msgid "Device:"
 msgstr "Appareil :"
 
-#: engine_dialog.cc:420 engine_dialog.cc:519 sfdb_ui.cc:153 sfdb_ui.cc:348
-#: sfdb_ui.cc:353
+#: engine_dialog.cc:591 engine_dialog.cc:699 export_report.cc:164
+#: export_report.cc:328 sfdb_ui.cc:153 sfdb_ui.cc:348 sfdb_ui.cc:353
 msgid "Sample rate:"
 msgstr "Fréquence d'échantillonnage :"
 
-#: engine_dialog.cc:426 engine_dialog.cc:526
+#: engine_dialog.cc:597 engine_dialog.cc:706
 msgid "Buffer size:"
 msgstr "Taille du tampon :"
 
-#: engine_dialog.cc:444
+#: engine_dialog.cc:606
+msgid "Periods:"
+msgstr "Périodes :"
+
+#: engine_dialog.cc:624
 msgid "Input Channels:"
 msgstr "Canaux d'entrée :"
 
-#: engine_dialog.cc:457
+#: engine_dialog.cc:637
 msgid "Output Channels:"
 msgstr "Canaux de sortie :"
 
-#: engine_dialog.cc:469
+#: engine_dialog.cc:649
 msgid "Hardware input latency:"
 msgstr "Latence matérielle en entrée :"
 
-#: engine_dialog.cc:472 engine_dialog.cc:485
+#: engine_dialog.cc:652 engine_dialog.cc:665
 msgid "samples"
 msgstr "échantillons"
 
-#: engine_dialog.cc:482
+#: engine_dialog.cc:662
 msgid "Hardware output latency:"
 msgstr "Latence matérielle en sortie :"
 
-#: engine_dialog.cc:493
+#: engine_dialog.cc:673
 msgid "MIDI System:"
-msgstr ""
+msgstr "Système MIDI :"
 
-#: engine_dialog.cc:511
+#: engine_dialog.cc:691
 msgid ""
-"The %1 audio backend was configured and started externally.\n"
-"This limits your control over it."
+"%1 is already running. %2 will connect to it and use the existing settings."
 msgstr ""
-"Le moteur audio %1 a été configuré et démarré extérieurement.\n"
-"Cela limite votre contrôle."
+"%1 est déjà lancé. %2 va s'y connecter en utilisant les réglages existants."
 
-#: engine_dialog.cc:564
+#: engine_dialog.cc:744
 msgid ""
 "Failed to start or connect to audio-engine.\n"
 "\n"
@@ -6169,7 +6898,7 @@ msgstr ""
 "\n"
 "La calibration de latence nécessite une interface audio fonctionnelle."
 
-#: engine_dialog.cc:570
+#: engine_dialog.cc:750
 msgid ""
 "Your selected audio configuration is playback- or capture-only.\n"
 "\n"
@@ -6180,185 +6909,218 @@ msgstr ""
 "\n"
 "La calibration de latence nécessite lecture et enregistrement."
 
-#: engine_dialog.cc:651
+#: engine_dialog.cc:965
 msgid "MIDI Devices"
 msgstr "Appareils MIDI"
 
-#: engine_dialog.cc:657
+#: engine_dialog.cc:971
 msgid "Device"
 msgstr "Interface audio"
 
-#: engine_dialog.cc:659
+#: engine_dialog.cc:973
 msgid "Hardware Latencies"
 msgstr "Latences matérielles"
 
-#: engine_dialog.cc:700
+#: engine_dialog.cc:1014
 msgid "Calibrate"
 msgstr "Calibrer"
 
-#: engine_dialog.cc:800
+#: engine_dialog.cc:1117
 msgid "all available channels"
 msgstr "tous les canaux disponibles"
 
-#: engine_dialog.cc:1039 latency_gui.cc:39
-#, fuzzy
-msgid "sample"
-msgid_plural "samples"
-msgstr[0] "échantillons"
-msgstr[1] "échantillons"
+#: engine_dialog.cc:1599 latency_gui.cc:55
+msgid "%1 sample"
+msgid_plural "%1 samples"
+msgstr[0] "%1 échantillon"
+msgstr[1] "%1 échantillons"
 
-#: engine_dialog.cc:1090
+#: engine_dialog.cc:1662
 #, c-format
 msgid "(%.1f ms)"
-msgstr ""
+msgstr "(%.1f ms)"
 
-#: engine_dialog.cc:1593
+#: engine_dialog.cc:2413
 msgid "Could not start backend engine %1"
 msgstr "Impossible de démarrer le moteur %1"
 
-#: engine_dialog.cc:1644
+#: engine_dialog.cc:2445
 msgid "Cannot set driver to %1"
 msgstr "Impossible de régler le pilote sur %1"
 
-#: engine_dialog.cc:1648
+#: engine_dialog.cc:2450
+msgid "Cannot set input device name to %1"
+msgstr ""
+
+#: engine_dialog.cc:2454
+msgid "Cannot set output device name to %1"
+msgstr ""
+
+#: engine_dialog.cc:2459
 msgid "Cannot set device name to %1"
 msgstr "Impossible de nommer l'appareil %1"
 
-#: engine_dialog.cc:1652
+#: engine_dialog.cc:2464
 msgid "Cannot set sample rate to %1"
 msgstr "Impossible de régler la fréquence d’échantillonnage sur %1"
 
-#: engine_dialog.cc:1656
+#: engine_dialog.cc:2468
 msgid "Cannot set buffer size to %1"
 msgstr "Impossible de régler la taille du tampon à %1"
 
-#: engine_dialog.cc:1662
+#: engine_dialog.cc:2472
+msgid "Cannot set periods to %1"
+msgstr "Impossible de régler le nombre de périodes sur %1"
+
+#: engine_dialog.cc:2478
 msgid "Cannot set input channels to %1"
 msgstr "Impossible de régler les canaux d'entrée sur %1"
 
-#: engine_dialog.cc:1666
+#: engine_dialog.cc:2482
 msgid "Cannot set output channels to %1"
 msgstr "Impossible de régler les canaux de sortie sur %1"
 
-#: engine_dialog.cc:1672
+#: engine_dialog.cc:2488
 msgid "Cannot set input latency to %1"
 msgstr "Impossible de régler la latence d'entrée sur %1"
 
-#: engine_dialog.cc:1676
+#: engine_dialog.cc:2492
 msgid "Cannot set output latency to %1"
 msgstr "Impossible de régler la latence de sortie sur %1"
 
-#: engine_dialog.cc:1955 engine_dialog.cc:2014
+#: engine_dialog.cc:2851 engine_dialog.cc:2917
 msgid "No signal detected "
 msgstr "Aucun signal détecté"
 
-#: engine_dialog.cc:1968 engine_dialog.cc:2022 port_insert_ui.cc:70
+#: engine_dialog.cc:2858
+msgid ""
+"Input signal is > -3dBFS. Lower the signal level (output gain, input gain) "
+"on the audio-interface."
+msgstr ""
+
+#: engine_dialog.cc:2871 engine_dialog.cc:2925 port_insert_ui.cc:70
 #: port_insert_ui.cc:98
 msgid "Disconnected from audio engine"
 msgstr "Non connecté au moteur audio"
 
-#: engine_dialog.cc:1977 engine_dialog.cc:2030
+#: engine_dialog.cc:2880 engine_dialog.cc:2933
 msgid "Detected roundtrip latency: "
 msgstr "Latence aller-retour détectée : "
 
-#: engine_dialog.cc:1979 engine_dialog.cc:2032
+#: engine_dialog.cc:2882 engine_dialog.cc:2935
 msgid "Systemic latency: "
 msgstr "Latence systémique : "
 
-#: engine_dialog.cc:1986
+#: engine_dialog.cc:2889
 msgid "(signal detection error)"
 msgstr "(erreur de détection du signal)"
 
-#: engine_dialog.cc:1992
+#: engine_dialog.cc:2895
 msgid "(inverted - bad wiring)"
 msgstr "(inversé − mauvais branchements)"
 
-#: engine_dialog.cc:2039
+#: engine_dialog.cc:2942
 msgid "(averaging)"
 msgstr "(moyenne)"
 
-#: engine_dialog.cc:2045
+#: engine_dialog.cc:2948
 msgid "(too large jitter)"
 msgstr "(gigue trop importante)"
 
-#: engine_dialog.cc:2049
+#: engine_dialog.cc:2952
 msgid "(large jitter)"
 msgstr "(gigue importante)"
 
-#: engine_dialog.cc:2061
+#: engine_dialog.cc:2964
 msgid "Timeout - large MIDI jitter."
 msgstr "Délai dépassé − gigue MIDI importante."
 
-#: engine_dialog.cc:2077 port_insert_ui.cc:134
+#: engine_dialog.cc:2980 port_insert_ui.cc:134
 msgid "Detecting ..."
 msgstr "Détection…"
 
-#: engine_dialog.cc:2171
+#: engine_dialog.cc:3081
 msgid "Disconnect from %1"
 msgstr "Déconnecter de %1"
 
-#: engine_dialog.cc:2175 mixer_strip.cc:1522 route_group_dialog.cc:45
-#: route_time_axis.cc:841
-msgid "Active"
-msgstr "Actif"
+#: engine_dialog.cc:3086
+msgid "Running"
+msgstr "En fonctionnement"
+
+#: engine_dialog.cc:3088
+msgid "Connected"
+msgstr "Connecté"
 
-#: engine_dialog.cc:2185
+#: engine_dialog.cc:3099
 msgid "Connect to %1"
 msgstr "Connecter à %1"
 
-#: engine_dialog.cc:2190
-msgid "Inactive"
-msgstr ""
+#: engine_dialog.cc:3103 shuttle_control.cc:655
+msgid "Stopped"
+msgstr "Arrêt"
 
-#: export_channel_selector.cc:45 sfdb_ui.cc:151
+#: export_channel_selector.cc:46 export_report.cc:159 export_report.cc:324
+#: sfdb_ui.cc:151
 msgid "Channels:"
 msgstr "Canaux :"
 
-#: export_channel_selector.cc:46
+#: export_channel_selector.cc:47
 msgid "Split to mono files"
 msgstr "Scinder en fichiers mono"
 
-#: export_channel_selector.cc:182
+#: export_channel_selector.cc:197
 msgid "Bus or Track"
 msgstr "Piste ou Bus"
 
-#: export_channel_selector.cc:459
+#: export_channel_selector.cc:474
 msgid "Region contents without fades nor region gain (channels: %1)"
 msgstr "Contenu de région sans fondus ni gain (canaux : %1)"
 
-#: export_channel_selector.cc:463
+#: export_channel_selector.cc:478
 msgid "Region contents with fades and region gain (channels: %1)"
 msgstr "Contenu de région avec fondu et gain (canaux : %1)"
 
-#: export_channel_selector.cc:467
+#: export_channel_selector.cc:482
 msgid "Track output (channels: %1)"
 msgstr "Sortie de piste (canaux : %1)"
 
-#: export_channel_selector.cc:536
-msgid "Export region contents"
-msgstr "Exporter le contenu de la région"
+#: export_channel_selector.cc:552
+msgid "Apply track/bus processing"
+msgstr ""
+
+#: export_channel_selector.cc:553
+msgid "Select all tracks"
+msgstr ""
+
+#: export_channel_selector.cc:554
+msgid "Select all busses"
+msgstr ""
+
+#: export_channel_selector.cc:555
+msgid "Deselect all"
+msgstr ""
 
-#: export_channel_selector.cc:537
-msgid "Export track output"
-msgstr "Exporter la sortie de piste"
+#: export_channel_selector.cc:589
+msgid "Track name"
+msgstr ""
 
-#: export_dialog.cc:46
+#: export_dialog.cc:48
 msgid ""
 "<span color=\"#ffa755\">Some already existing files will be overwritten.</"
 "span>"
 msgstr ""
 "<span color=\"#ffa755\">Des fichiers existants vont être écrasés.</span>"
 
-#: export_dialog.cc:47
+#: export_dialog.cc:49
 msgid "List files"
 msgstr "Liste des fichiers"
 
-#: export_dialog.cc:158 export_format_dialog.cc:59
+#: export_dialog.cc:158 export_format_dialog.cc:67
 msgid "File format"
 msgstr "Format de fichier"
 
-#: export_dialog.cc:159 export_timespan_selector.cc:374
-#: export_timespan_selector.cc:436
+#: export_dialog.cc:159 export_timespan_selector.cc:371
+#: export_timespan_selector.cc:433
 msgid "Time Span"
 msgstr "Période"
 
@@ -6386,27 +7148,43 @@ msgstr "Échec de l'initialisation de l'exportation : %1"
 msgid "Stop Export"
 msgstr "Arrêter l'exportation"
 
-#: export_dialog.cc:327
+#: export_dialog.cc:336
 msgid "export"
 msgstr "Exporter"
 
-#: export_dialog.cc:346
+#: export_dialog.cc:355
+msgid "Exporting '%3' (timespan %1 of %2)"
+msgstr "Exportation de « %3 » (période %1 sur %2)"
+
+#: export_dialog.cc:360
 msgid "Normalizing '%3' (timespan %1 of %2)"
-msgstr "Normalisation de « %3 » (période %1 de %2)"
+msgstr "Normalisation de « %3 » (période %1 sur %2)"
 
-#: export_dialog.cc:350
-msgid "Exporting '%3' (timespan %1 of %2)"
-msgstr "Exportation de « %3 » (période %1 de %2)"
+#: export_dialog.cc:412
+msgid "Encoding '%3' (timespan %1 of %2)"
+msgstr ""
+
+#: export_dialog.cc:417
+msgid "Tagging '%3' (timespan %1 of %2)"
+msgstr "Étiquetage de « %3 » (période %1 sur %2)"
 
-#: export_dialog.cc:373 export_dialog.cc:375
+#: export_dialog.cc:369
+msgid "Uploading '%3' (timespan %1 of %2)"
+msgstr "Téléversement de « %3 » (période %1 sur %2)"
+
+#: export_dialog.cc:373
+msgid "Running Post Export Command for '%1'"
+msgstr ""
+
+#: export_dialog.cc:401 export_dialog.cc:403
 msgid "<span color=\"#ffa755\">Error: "
 msgstr "<span color=\"#ffa755\">Erreur : "
 
-#: export_dialog.cc:385
+#: export_dialog.cc:413
 msgid "<span color=\"#ffa755\">Warning: "
 msgstr "<span color=\"#ffa755\">Avertissement : "
 
-#: export_dialog.cc:387
+#: export_dialog.cc:415
 msgid ""
 "\n"
 "<span color=\"#ffa755\">Warning: "
@@ -6414,19 +7192,19 @@ msgstr ""
 "\n"
 "<span color=\"#ffa755\">Avertissement : "
 
-#: export_dialog.cc:411
+#: export_dialog.cc:439
 msgid "Export Selection"
 msgstr "Exporter la selection"
 
-#: export_dialog.cc:425
+#: export_dialog.cc:453
 msgid "Export Region"
 msgstr "Exporter la région"
 
-#: export_dialog.cc:434
+#: export_dialog.cc:462
 msgid "Source"
 msgstr "Source"
 
-#: export_dialog.cc:450
+#: export_dialog.cc:478
 msgid "Stem Export"
 msgstr "Export fragment"
 
@@ -6434,65 +7212,77 @@ msgstr "Export fragment"
 msgid "Add another format"
 msgstr "Ajouter un autre format"
 
-#: export_file_notebook.cc:193
+#: export_file_notebook.cc:198
 msgid "Format"
 msgstr "Format"
 
-#: export_file_notebook.cc:194
+#: export_file_notebook.cc:199
 msgid "Location"
 msgstr "Emplacement"
 
-#: export_file_notebook.cc:195
+#: export_file_notebook.cc:200
 msgid "Upload to Soundcloud"
 msgstr "Envoyer sur Soundcloud"
 
-#: export_file_notebook.cc:273
+#: export_file_notebook.cc:201
+msgid "Analyze Exported Audio"
+msgstr ""
+
+#: export_file_notebook.cc:286
 msgid "No format!"
 msgstr "Aucun format !"
 
-#: export_file_notebook.cc:291
+#: export_file_notebook.cc:304
 msgid "Format %1: %2"
 msgstr "Format %1 : %2"
 
-#: export_filename_selector.cc:32
+#: export_filename_selector.cc:33
 msgid "Label:"
 msgstr "Libellé :"
 
-#: export_filename_selector.cc:33
+#: export_filename_selector.cc:34 session_dialog.cc:310
 msgid "Session Name"
 msgstr "Nom de la session"
 
-#: export_filename_selector.cc:34
+#: export_filename_selector.cc:35
+msgid "Timespan Name"
+msgstr ""
+
+#: export_filename_selector.cc:36
 msgid "Revision:"
 msgstr "Révision :"
 
-#: export_filename_selector.cc:36
+#: export_filename_selector.cc:38
 msgid "Folder:"
 msgstr "Dossier :"
 
-#: export_filename_selector.cc:37 session_import_dialog.cc:45
+#: export_filename_selector.cc:39 session_import_dialog.cc:45
 #: transcode_video_dialog.cc:59 video_server_dialog.cc:54
-#: video_server_dialog.cc:56 export_video_dialog.cc:81
-#: export_video_dialog.cc:83
+#: video_server_dialog.cc:56 export_video_dialog.cc:77
+#: export_video_dialog.cc:79
 msgid "Browse"
 msgstr "Parcourir"
 
-#: export_filename_selector.cc:41
-msgid "<i>Build filename(s) from these components:</i>"
-msgstr "<i>Créer le(s) nom(s) de fichier(s) à partir de ces composants :</i>"
+#: export_filename_selector.cc:40 export_report.cc:118
+msgid "Open Folder"
+msgstr ""
+
+#: export_filename_selector.cc:45
+msgid "Build filename(s) from these components:"
+msgstr ""
 
-#: export_filename_selector.cc:212
+#: export_filename_selector.cc:217
 msgid ""
 "<small><i>Sorry, no example filename can be shown at the moment</i></small>"
 msgstr ""
-"<small><i>Désolé, aucun exemple de noe de fichier ne peut être montré pour "
+"<small><i>Désolé, aucun exemple de nom de fichier ne peut être montré pour "
 "le moment</i></small>"
 
-#: export_filename_selector.cc:214
-msgid "<small><i>Current (approximate) filename: \"%1\"</i></small>"
-msgstr "<small><i>Nom de fichier (approximatif) actuel : « %1 »</i></small>"
+#: export_filename_selector.cc:219
+msgid "<i>Current (approximate) filename</i>: \"%1\""
+msgstr ""
 
-#: export_filename_selector.cc:250 export_filename_selector.cc:336
+#: export_filename_selector.cc:255 export_filename_selector.cc:402
 msgid ""
 "%1: this is only the directory/folder name, not the filename.\n"
 "The filename will be chosen from the information just above the folder "
@@ -6502,112 +7292,195 @@ msgstr ""
 "Le nom du fichier sera choisi à partir des informations juste au dessus de "
 "sélecteur de dossier."
 
-#: export_filename_selector.cc:322
+#: export_filename_selector.cc:378
+msgid "%1: this is not a valid directory/folder."
+msgstr ""
+
+#: export_filename_selector.cc:388
 msgid "Choose export folder"
 msgstr "Choisir le dossier d'export"
 
-#: export_format_dialog.cc:31
+#: export_format_dialog.cc:32
 msgid "New Export Format Profile"
 msgstr "Nouveau profil de format d'export"
 
-#: export_format_dialog.cc:31
+#: export_format_dialog.cc:32
 msgid "Edit Export Format Profile"
 msgstr "Édition du profil de format d'export"
 
-#: export_format_dialog.cc:38
+#: export_format_dialog.cc:39
 msgid "Label: "
 msgstr "Libellé : "
 
-#: export_format_dialog.cc:41 normalize_dialog.cc:42
-msgid "Normalize to:"
-msgstr "Normaliser à :"
+#: export_format_dialog.cc:42
+msgid "Normalize:"
+msgstr "Normaliser :"
+
+#: export_format_dialog.cc:43
+msgid "Peak"
+msgstr "Crête"
+
+#: export_format_dialog.cc:44
+msgid "Loudness"
+msgstr ""
 
-#: export_format_dialog.cc:46
+#: export_format_dialog.cc:50
+msgid "LUFS"
+msgstr ""
+
+#: export_format_dialog.cc:51
+msgid "dBTP"
+msgstr ""
+
+#: export_format_dialog.cc:54
 msgid "Trim silence at start"
 msgstr "Couper le silence du début"
 
-#: export_format_dialog.cc:47
+#: export_format_dialog.cc:55
 msgid "Add silence at start:"
 msgstr "Ajouter du silence au début :"
 
-#: export_format_dialog.cc:50
+#: export_format_dialog.cc:58
 msgid "Trim silence at end"
 msgstr "Couper le silence de fin"
 
-#: export_format_dialog.cc:51
+#: export_format_dialog.cc:59
 msgid "Add silence at end:"
 msgstr "Ajouter du silence à la fin :"
 
-#: export_format_dialog.cc:54
+#: export_format_dialog.cc:62
 msgid ""
 "Command to run post-export\n"
-"(%f=full path & filename, %d=directory, %b=basename):"
+"(%f=file path, %d=directory, %b=basename, see tooltip for more):"
 msgstr ""
-"Commande à lancer après l'export\n"
-"(%f = chemin complet et nom de fichier, %d = répertoire, %b = nom de base) :"
 
-#: export_format_dialog.cc:57
+#: export_format_dialog.cc:65
 msgid "Compatibility"
 msgstr "Compatibilité"
 
-#: export_format_dialog.cc:58
+#: export_format_dialog.cc:66
 msgid "Quality"
 msgstr "Qualité"
 
-#: export_format_dialog.cc:61
+#: export_format_dialog.cc:69
 msgid "Sample rate conversion quality:"
 msgstr "Qualité du ré-échantillonage :"
 
-#: export_format_dialog.cc:68
+#: export_format_dialog.cc:76
 msgid "Dithering"
 msgstr "Interpolation"
 
-#: export_format_dialog.cc:70
+#: export_format_dialog.cc:78
 msgid "Create CUE file for disk-at-once CD/DVD creation"
 msgstr "Créer un fichier CUE pour la création de CD / DVD"
 
-#: export_format_dialog.cc:71
+#: export_format_dialog.cc:79
 msgid "Create TOC file for disk-at-once CD/DVD creation"
 msgstr "Créer un fichier TOC pour la création de CD / DVD"
 
-#: export_format_dialog.cc:73
+#: export_format_dialog.cc:80
+msgid "Create chapter mark file for MP4 chapter marks"
+msgstr ""
+
+#: export_format_dialog.cc:82
 msgid "Tag file with session's metadata"
 msgstr "Taguer le fichier avec les méta-données de session"
 
-#: export_format_dialog.cc:470
+#: export_format_dialog.cc:119
+msgid "∧"
+msgstr ""
+
+#: export_format_dialog.cc:124
+msgid ""
+"Normalize to EBU-R128 LUFS target loudness without exceeding the given true-"
+"peak limit. EBU-R128 normalization is only available for mono and stereo "
+"targets, true-peak works for any channel layout."
+msgstr ""
+
+#: export_format_dialog.cc:152
+msgid ""
+"%a Artist name\n"
+"%b File's base-name\n"
+"%c Copyright\n"
+"%d File's directory\n"
+"%f File's full absolute path\n"
+"%l Lyricist\n"
+"%n Session name\n"
+"%o Conductor\n"
+"%t Title\n"
+"%z Organization\n"
+"%A Album\n"
+"%C Comment\n"
+"%E Engineer\n"
+"%G Genre\n"
+"%L Total track count\n"
+"%M Mixer\n"
+"%N Timespan name\n"
+"%O Composer\n"
+"%P Producer\n"
+"%S Disc subtitle\n"
+"%T Track number\n"
+"%Y Year\n"
+"%Z Country"
+msgstr ""
+"%a Nom de l'artiste\n"
+"%b Nom du fichier\n"
+"%c Copyright\n"
+"%d Répertoire du fichier\n"
+"%f Chemin absolu complet du fichier\n"
+"%l Parolier\n"
+"%n Nom de la session\n"
+"%o Chef d'orchestre\n"
+"%t Titre\n"
+"%z Organisation\n"
+"%A Album\n"
+"%C Commentaire\n"
+"%E Ingénieur\n"
+"%G Genre\n"
+"%L Nombre total de pistes\n"
+"%M Mixeur\n"
+"%N Nom de la période\n"
+"%O Compositeur\n"
+"%P Producteur\n"
+"%S Sous-titre du disque\n"
+"%T Numéro de piste\n"
+"%Y Année\n"
+"%Z Pays"
+
+#: export_format_dialog.cc:537
 msgid "Best (sinc)"
 msgstr "Meilleure (sinc)"
 
-#: export_format_dialog.cc:475
+#: export_format_dialog.cc:542
 msgid "Medium (sinc)"
 msgstr "Moyenne (sinc)"
 
-#: export_format_dialog.cc:480
+#: export_format_dialog.cc:547
 msgid "Fast (sinc)"
 msgstr "Rapide (sinc)"
 
-#: export_format_dialog.cc:490
+#: export_format_dialog.cc:557
 #, fuzzy
 msgid "Zero order hold"
 msgstr "Interpolation répétitive (ZOH)"
 
-#: export_format_dialog.cc:895
+#: export_format_dialog.cc:981
 msgid "Linear encoding options"
 msgstr "Options pour l'encodage linéaire"
 
-#: export_format_dialog.cc:911
+#: export_format_dialog.cc:997
 msgid "Ogg Vorbis options"
 msgstr "Options Ogg Vorbis"
 
-#: export_format_dialog.cc:922
+#: export_format_dialog.cc:1008
 msgid "FLAC options"
 msgstr "Options FLAC"
 
-#: export_format_dialog.cc:939
+#: export_format_dialog.cc:1025
 msgid "Broadcast Wave options"
 msgstr "Option Broadcast Wave"
 
-#: export_format_selector.cc:136
+#: export_format_selector.cc:131
 msgid "Do you really want to remove the format?"
 msgstr "Voulez-vous vraiment enlever le format ?"
 
@@ -6615,7 +7488,7 @@ msgstr "Voulez-vous vraiment enlever le format ?"
 msgid "Preset"
 msgstr "Préréglage"
 
-#: export_preset_selector.cc:104
+#: export_preset_selector.cc:99
 msgid ""
 "The selected preset did not load successfully!\n"
 "Perhaps it references a format that has been removed?"
@@ -6623,23 +7496,203 @@ msgstr ""
 "Le préréglage n'a pas pu être chargé !\n"
 "Peut-être qu'il fait référence à un format qui a été supprimé ?"
 
-#: export_preset_selector.cc:156
+#: export_preset_selector.cc:151
 msgid "Do you really want to remove this preset?"
 msgstr "Voulez-vous vraiment enlever ce préréglage ?"
 
-#: export_timespan_selector.cc:46
+#: export_report.cc:56
+msgid "Export Report/Analysis"
+msgstr ""
+
+#: export_report.cc:147 export_report.cc:327 sfdb_ui.cc:149
+msgid "Format:"
+msgstr "Format :"
+
+#: export_report.cc:166 export_report.cc:328
+msgid "%1 Hz"
+msgstr "%1 Hz"
+
+#: export_report.cc:169 export_report.cc:336 transcode_video_dialog.cc:139
+#, fuzzy
+msgid "Duration:"
+msgstr "Durée :"
+
+#: export_report.cc:177 export_report.cc:334
+msgid "Timecode:"
+msgstr ""
+
+#: export_report.cc:185
+msgid "Error:"
+msgstr ""
+
+#: export_report.cc:220 export_report.cc:440
+msgid "(too short integration time)"
+msgstr ""
+
+#: export_report.cc:222
+msgid "-888"
+msgstr ""
+
+#: export_report.cc:227 export_report.cc:353
+msgid "Peak:"
+msgstr ""
+
+#: export_report.cc:228 export_report.cc:360
+msgid "%1 dBFS"
+msgstr ""
+
+#: export_report.cc:229 export_report.cc:369
+msgid "True Peak:"
+msgstr ""
+
+#: export_report.cc:230 export_report.cc:376
+msgid "%1 dBTP"
+msgstr ""
+
+#: export_report.cc:231 export_report.cc:387
+msgid "Normalization Gain:"
+msgstr ""
+
+#: export_report.cc:232
+msgid "+888.88 dB"
+msgstr ""
+
+#: export_report.cc:234 export_report.cc:448
+msgid "Integrated Loudness:"
+msgstr ""
+
+#: export_report.cc:235 export_report.cc:454
+msgid "%1 LUFS"
+msgstr ""
+
+#: export_report.cc:236 export_report.cc:460
+msgid "Loudness Range:"
+msgstr ""
+
+#: export_report.cc:237 export_report.cc:466
+msgid "%1 LU"
+msgstr ""
+
+#: export_report.cc:247 export_report.cc:754
+msgid "100"
+msgstr ""
+
+#: export_report.cc:282 export_report.cc:650
+msgid "00:00:00.000"
+msgstr ""
+
+#: export_report.cc:288
+msgid "0|A8"
+msgstr ""
+
+#: export_report.cc:394
+msgid "%1 dB"
+msgstr ""
+
+#: export_report.cc:425 export_report.cc:433 export_report.cc:553
+msgid ""
+"Not\n"
+"Available"
+msgstr ""
+
+#: export_report.cc:493
+msgid ""
+"LUFS\n"
+"(short)"
+msgstr ""
+
+#: export_report.cc:503
+msgid "Multiplicity"
+msgstr ""
+
+#: export_report.cc:603
+msgid "Logscale|Lg"
+msgstr ""
+
+#: export_report.cc:604
+msgid "Rectified|Rf"
+msgstr ""
+
+#: export_report.cc:605
+msgid "Logscale"
+msgstr ""
+
+#: export_report.cc:606
+msgid "Rectified"
+msgstr ""
+
+#: export_report.cc:738
+msgid "Hz"
+msgstr ""
+
+#: export_report.cc:755
+msgid "500"
+msgstr ""
+
+#: export_report.cc:756
+msgid "1K"
+msgstr ""
+
+#: export_report.cc:757
+msgid "5K"
+msgstr ""
+
+#: export_report.cc:758
+msgid "10K"
+msgstr ""
+
+#: export_report.cc:844
+msgid "Writing Export Analysis Image: %1."
+msgstr ""
+
+#: export_report.cc:941 sfdb_ui.cc:293 sfdb_ui.cc:409
+msgid "Could not read file: %1 (%2)."
+msgstr "Impossible de lire le fichier « %1 » (%2)."
+
+#: export_report.cc:967 sfdb_ui.cc:458
+msgid "Could not access soundfile: "
+msgstr "Impossible d'accéder au fichier audio : "
+
+#: export_report.cc:1203
+msgid "-36"
+msgstr ""
+
+#: export_report.cc:1204 export_report.cc:1208 export_report.cc:1214
+#: export_report.cc:1217
+msgid "-18"
+msgstr ""
+
+#: export_report.cc:1205 export_report.cc:1209 export_report.cc:1215
+#: export_report.cc:1218 export_report.cc:1221 export_report.cc:1222
+msgid "-9"
+msgstr ""
+
+#: export_report.cc:1206 export_report.cc:1210 export_report.cc:1216
+#: export_report.cc:1219 export_report.cc:1223 export_report.cc:1224
+msgid "-3"
+msgstr ""
+
+#: export_timespan_selector.cc:44
 msgid "Show Times as:"
 msgstr "Temps exprimés en :"
 
-#: export_timespan_selector.cc:53 processor_box.cc:2466
+#: export_timespan_selector.cc:46
+msgid "Realtime Export"
+msgstr ""
+
+#: export_timespan_selector.cc:54 processor_box.cc:3695
 msgid "Select All"
 msgstr "Sélectionner tout"
 
-#: export_timespan_selector.cc:223 transform_dialog.cc:93
+#: export_timespan_selector.cc:220 transform_dialog.cc:93
 msgid " to "
 msgstr " à "
 
-#: export_timespan_selector.cc:367 export_timespan_selector.cc:426
+#: export_timespan_selector.cc:399 export_timespan_selector.cc:488
+msgid "RT"
+msgstr ""
+
+#: export_timespan_selector.cc:400 export_timespan_selector.cc:489
 msgid "Range"
 msgstr "Intervalle"
 
@@ -6656,36 +7709,39 @@ msgstr "getSoundResourceFile: Aucune racine valide dans le fichier xml"
 msgid "getSoundResourceFile: root = %1, != response"
 msgstr ""
 
-#: sfdb_freesound_mootcher.cc:410 rc_option_editor.cc:1824
+#: sfdb_freesound_mootcher.cc:410 rc_option_editor.cc:2416
 msgid "%1"
 msgstr "%1"
 
-#: gain_meter.cc:132 gain_meter.cc:400 gain_meter.cc:505 gain_meter.cc:896
+#: gain_meter.cc:137 gain_meter.cc:422 gain_meter.cc:527 gain_meter.cc:919
 msgid "-inf"
 msgstr "-inf"
 
-#: gain_meter.cc:147 gain_meter.cc:958
+#: gain_meter.cc:152 gain_meter.cc:983
 msgid "Fader automation mode"
 msgstr "Mode d'automation du gain"
 
-#: gain_meter.cc:148 gain_meter.cc:959
+#: gain_meter.cc:153 gain_meter.cc:984
 msgid "Fader automation type"
 msgstr "Type d'automation du gain"
 
-#: gain_meter.cc:157 gain_meter.cc:829 panner_ui.cc:179 panner_ui.cc:639
+#: gain_meter.cc:162 gain_meter.cc:852 panner_ui.cc:179 panner_ui.cc:641
 msgid "Abs"
 msgstr "abs"
 
-#: gain_meter.cc:796 mixer_strip.cc:2049 meter_strip.cc:374 panner_ui.cc:606
-#: route_time_axis.cc:104 route_time_axis.cc:2705
+#: gain_meter.cc:816 vca_master_strip.cc:78 vca_time_axis.cc:54
+msgid "M"
+msgstr "M"
+
+#: gain_meter.cc:819 vca_master_strip.cc:296
 msgid "P"
 msgstr "P"
 
-#: gain_meter.cc:799 panner_ui.cc:609
+#: gain_meter.cc:822
 msgid "T"
 msgstr "T"
 
-#: gain_meter.cc:802 panner_ui.cc:612
+#: gain_meter.cc:825
 msgid "W"
 msgstr "W"
 
@@ -6693,52 +7749,57 @@ msgstr "W"
 msgid "<span size=\"large\">Presets</span>"
 msgstr "<span size=\"large\">Réglages prédéfinis</span>"
 
-#: generic_pluginui.cc:97
+#: generic_pluginui.cc:98 plugin_pin_dialog.cc:333
 #, fuzzy
 msgid "Manual"
 msgstr "Manuel"
 
-#: generic_pluginui.cc:106
+#: generic_pluginui.cc:107
 #, fuzzy
 msgid "All Automation"
 msgstr "Afficher toute l'automation"
 
-# ?
 #: generic_pluginui.cc:250
-#, fuzzy
-msgid "Switches"
-msgstr "Commutateurs"
-
-#: generic_pluginui.cc:260 generic_pluginui.cc:436 processor_box.cc:2440
-msgid "Controls"
-msgstr "Contrôles"
-
-#: generic_pluginui.cc:293
 msgid "Plugin Editor: could not build control element for port %1"
 msgstr ""
 "Éditeur de greffon : impossible de construire l'élément de contrôle pour le "
 "port %1"
 
-#: generic_pluginui.cc:318
+#: generic_pluginui.cc:282
 msgid "Plugin Editor: no control for property %1"
-msgstr ""
+msgstr "Editeur de greffon : pas de contrôleur pour la propriété %1"
 
-#: generic_pluginui.cc:324
+#: generic_pluginui.cc:288
 msgid "Plugin Editor: could not build control element for property %1"
 msgstr ""
+"Editeur de greffon : impossible de créer le contrôleur pour la propriété %1"
 
-#: generic_pluginui.cc:468
-msgid "Meters"
-msgstr "Signatures"
+# ?
+#: generic_pluginui.cc:359
+#, fuzzy
+msgid "Switches"
+msgstr "Commutateurs"
+
+#: generic_pluginui.cc:369 generic_pluginui.cc:475 processor_box.cc:3653
+msgid "Controls"
+msgstr "Contrôles"
+
+#: generic_pluginui.cc:510
+msgid "Meters"
+msgstr "Indicateurs"
 
-#: generic_pluginui.cc:490
+#: generic_pluginui.cc:548
 msgid "Automation control"
 msgstr "Contrôle d'automation"
 
-#: generic_pluginui.cc:497
+#: generic_pluginui.cc:555
 msgid "Mgnual"
 msgstr "Manuel"
 
+#: generic_pluginui.cc:828
+msgid "This control cannot be automated"
+msgstr ""
+
 #: global_port_matrix.cc:158
 msgid "Audio Connection Manager"
 msgstr "Gestionnaire de connexion audio"
@@ -6747,131 +7808,166 @@ msgstr "Gestionnaire de connexion audio"
 msgid "MIDI Connection Manager"
 msgstr "Gestion des connexions MIDI"
 
-#: global_port_matrix.cc:201 io_selector.cc:211 mixer_strip.cc:793
-#: mixer_strip.cc:894
+#: global_port_matrix.cc:201 io_selector.cc:211 mixer_strip.cc:863
+#: mixer_strip.cc:966 monitor_section.cc:1430 monitor_selector.cc:189
+#: plugin_pin_dialog.cc:1757
 msgid "Disconnect"
 msgstr "Déconnecter"
 
-#: global_port_matrix.cc:207 io_selector.cc:217
+#: global_port_matrix.cc:207 io_selector.cc:217 monitor_selector.cc:195
 msgid "port"
 msgstr "port"
 
-#: group_tabs.cc:312
+#: group_tabs.cc:312 group_tabs.cc:321
 msgid "Selection..."
 msgstr "Sélectionnées…"
 
-#: group_tabs.cc:313
+#: group_tabs.cc:313 group_tabs.cc:322
 msgid "Record Enabled..."
 msgstr "Armées…"
 
-#: group_tabs.cc:314
+#: group_tabs.cc:314 group_tabs.cc:323
 msgid "Soloed..."
 msgstr "En solo…"
 
-#: group_tabs.cc:320
+#: group_tabs.cc:316
+msgid "Create New Group From..."
+msgstr "Créer un nouveau groupe à partir de..."
+
+#: group_tabs.cc:325
+msgid "Create New Group with Master From..."
+msgstr ""
+
+#: group_tabs.cc:344
 msgid "Create New Group ..."
 msgstr "Créer un nouveau groupe…"
 
-#: group_tabs.cc:321
-msgid "Create New Group From"
-msgstr "Créer un nouveau groupe à partir de"
+#: group_tabs.cc:345
+msgid "Create New Group with Control Master ..."
+msgstr ""
 
-#: group_tabs.cc:324
+#: group_tabs.cc:355
 msgid "Edit Group..."
 msgstr "Éditer le groupe…"
 
 # À l'air de changer la couleur…
-#: group_tabs.cc:325
-#, fuzzy
+#: group_tabs.cc:356
 msgid "Collect Group"
-msgstr "Former un Groupe"
+msgstr "Réunir dans un groupe"
 
-#: group_tabs.cc:326
+#: group_tabs.cc:357
 msgid "Remove Group"
 msgstr "Enlever le groupe"
 
-#: group_tabs.cc:329
+#: group_tabs.cc:368
+msgid "Assign Group to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:374
 msgid "Remove Subgroup Bus"
 msgstr "Enlever le bus sous-groupe"
 
-#: group_tabs.cc:331
+#: group_tabs.cc:376
 msgid "Add New Subgroup Bus"
 msgstr "Ajouter un sous-groupe de bus"
 
-#: group_tabs.cc:333
+#: group_tabs.cc:378
 msgid "Add New Aux Bus (pre-fader)"
 msgstr "Ajouter un nouveau bus auxiliaire (pre-fader)"
 
-#: group_tabs.cc:334
+#: group_tabs.cc:379
 msgid "Add New Aux Bus (post-fader)"
 msgstr "Ajouter un nouveau bus auxiliaire (post-fader)"
 
-#: group_tabs.cc:340
+#: group_tabs.cc:404
+msgid "Assign Selection to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:415
+msgid "Assign Record Enabled to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:426
+msgid "Assign Soloed to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:429
 msgid "Enable All Groups"
 msgstr "Activer tous les groupes"
 
-#: group_tabs.cc:341
+#: group_tabs.cc:430
 msgid "Disable All Groups"
 msgstr "Désactiver tous les groupes"
 
-#: insert_time_dialog.cc:46
+#: insert_remove_time_dialog.cc:52
+msgid "Time to remove"
+msgstr ""
+
+#: insert_remove_time_dialog.cc:52
 msgid "Time to insert:"
 msgstr "Temps à insérer :"
 
-#: insert_time_dialog.cc:54
+#: insert_remove_time_dialog.cc:61
 msgid "Intersected regions should:"
 msgstr "Les régions ayant une intersection devraient :"
 
-#: insert_time_dialog.cc:57
+#: insert_remove_time_dialog.cc:64
 msgid "stay in position"
 msgstr "rester en place"
 
-#: insert_time_dialog.cc:58
+#: insert_remove_time_dialog.cc:65
 msgid "move"
-msgstr "être bougées"
+msgstr "être déplacées"
 
-#: insert_time_dialog.cc:59
+#: insert_remove_time_dialog.cc:66
 msgid "be split"
 msgstr "être séparées"
 
-#: insert_time_dialog.cc:65
-msgid "Insert time on all the track's playlists"
-msgstr "Insérer du temps sur toutes les playlists de la piste"
+#: insert_remove_time_dialog.cc:73
+msgid "Apply to all the track's playlists"
+msgstr ""
 
-#: insert_time_dialog.cc:68
+#: insert_remove_time_dialog.cc:76
 msgid "Move glued regions"
 msgstr "Déplacer les régions collées"
 
-#: insert_time_dialog.cc:70
+#: insert_remove_time_dialog.cc:78
 msgid "Move markers"
 msgstr "Déplacer les repères"
 
-#: insert_time_dialog.cc:73
+#: insert_remove_time_dialog.cc:81
 msgid "Move glued markers"
 msgstr "Déplacer les repères collés"
 
-#: insert_time_dialog.cc:78
+#: insert_remove_time_dialog.cc:86
 msgid "Move locked markers"
 msgstr "Déplacer les repères verrouillés"
 
-#: insert_time_dialog.cc:83
-#, fuzzy
+#: insert_remove_time_dialog.cc:91
 msgid ""
 "Move tempo and meter changes\n"
 "<i>(may cause oddities in the tempo map)</i>"
 msgstr ""
 "Changer le tempo et le rythme\n"
-"<i>(cela peut causer une table de Tempo bizarre)</i>"
+"<i>(cela peut causer une table de tempo bizarre)</i>"
+
+#: insert_remove_time_dialog.cc:99
+msgid "Remove time"
+msgstr ""
 
-#: insert_time_dialog.cc:91
+#: insert_remove_time_dialog.cc:99
 msgid "Insert time"
 msgstr "Insérer temps"
 
-#: instrument_selector.cc:62
+#: insert_remove_time_dialog.cc:174
+msgid "Invalid or zero duration entered. Please enter a valid duration"
+msgstr ""
+
+#: instrument_selector.cc:92
 msgid "-none-"
 msgstr "aucun"
 
-#: interthread_progress_window.cc:103
+#: interthread_progress_window.cc:114
 msgid "Importing file: %1 of %2"
 msgstr "Import du fichier : %1 sur %2"
 
@@ -6879,77 +7975,96 @@ msgstr "Import du fichier : %1 sur %2"
 msgid "I/O selector"
 msgstr "Sélecteur E/S"
 
-#: io_selector.cc:266
+#: io_selector.cc:266 monitor_selector.cc:244
 msgid "%1 input"
 msgstr "Entrée %1"
 
-#: io_selector.cc:268
+#: io_selector.cc:268 monitor_selector.cc:246
 msgid "%1 output"
 msgstr "sortie %1"
 
-#: keyboard.cc:70
+#: keyboard.cc:93
 msgid "your own"
 msgstr "votre propre"
 
-#: keyboard.cc:133 keyboard.cc:157
+#: keyboard.cc:157 keyboard.cc:181
 msgid "Default keybindings not found - %1 will be hard to use!"
 msgstr ""
 "Raccourcis clavier par défaut introuvables - Il sera difficile d'utiliser "
 "%1 !"
 
-#: keyboard.cc:136
+#: keyboard.cc:160
 msgid "Key bindings file \"%1\" not found. Default bindings used instead"
 msgstr ""
 "Fichier de raccourcis clavier « %1 » non trouvé. Utilisation des raccourcis "
 "par défaut."
 
-#: keyeditor.cc:54
+#: keyboard.cc:193
+msgid "Loading keybindings from %1"
+msgstr ""
+
+#: keyeditor.cc:67
+msgid "Colliding keybindings"
+msgstr ""
+
+#: keyeditor.cc:68
+msgid ""
+"The key sequence is already bound. Please remove the other binding first."
+msgstr ""
+
+#: keyeditor.cc:77
+msgid "Key Bindings"
+msgstr "Raccourcis clavier"
+
+#: keyeditor.cc:78
 msgid "Remove shortcut"
 msgstr "Supprimer le raccourci"
 
-#: keyeditor.cc:63
-msgid "Action"
-msgstr "Action"
+#: keyeditor.cc:80
+msgid "Search..."
+msgstr ""
 
-#: keyeditor.cc:64
-msgid "Shortcut"
-msgstr "Raccourci"
+#: keyeditor.cc:82
+msgid "Print"
+msgstr ""
 
-#: keyeditor.cc:84
-msgid "Select an action, then press the key(s) to (re)set its shortcut"
+#: keyeditor.cc:93
+msgid "Click to reset search string"
 msgstr ""
-"Sélectionnez une action, puis appuyez sur la touche pour définir le raccourci"
 
-# Only Keyboard or also control surfaces ?
-#: keyeditor.cc:98
-#, fuzzy
-msgid "Reset Bindings to Defaults"
-msgstr "Réinitialiser les raccourcis claviers par défaut"
+#: keyeditor.cc:97
+msgid "To remove a shortcut select an action then press this: "
+msgstr ""
 
-#: keyeditor.cc:263
-#, fuzzy
-msgid "Main_menu"
-msgstr "Menu_Principal"
+#: keyeditor.cc:109
+msgid "Reset Bindings to Defaults"
+msgstr "Réinitialiser les raccourcis par défaut"
 
-#: keyeditor.cc:265
-#, fuzzy
-msgid "redirectmenu"
-msgstr "menuredirigé"
+#: keyeditor.cc:227 lua_script_manager.cc:41
+msgid "Action"
+msgstr "Action"
 
-#: keyeditor.cc:267
-#, fuzzy
-msgid "Editor_menus"
-msgstr "Menus_Éditeur"
+#: keyeditor.cc:228
+msgid "Shortcut"
+msgstr "Raccourci"
 
-#: keyeditor.cc:269
+#: keyeditor.cc:370
 #, fuzzy
 msgid "RegionList"
 msgstr "ListeDeRégion"
 
-#: keyeditor.cc:271
+#: keyeditor.cc:543
+msgid "Could not open temporary file to print bindings (%1)"
+msgstr ""
+
+#: keyeditor.cc:561
+msgid "Could not save bindings to file (%1)"
+msgstr ""
+
+#: latency_gui.cc:39
 #, fuzzy
-msgid "ProcessorMenu"
-msgstr "MenuProcesseur"
+msgid "sample"
+msgstr "échantillon"
 
 #: latency_gui.cc:40
 msgid "msec"
@@ -6959,109 +8074,217 @@ msgstr "ms"
 msgid "period"
 msgstr "période"
 
-#: latency_gui.cc:55
-msgid "%1 sample"
-msgid_plural "%1 samples"
-msgstr[0] "%1 échantillon"
-msgstr[1] "%1 échantillons"
-
-#: latency_gui.cc:72 panner_ui.cc:409
+#: latency_gui.cc:72 panner_ui.cc:411 plugin_pin_dialog.cc:109 plugin_ui.cc:421
 msgid "Reset"
 msgstr "Réinitialiser"
 
-#: latency_gui.cc:149 rhythm_ferret.cc:273 sfdb_ui.cc:1912
+#: latency_gui.cc:149 rhythm_ferret.cc:295 sfdb_ui.cc:1878
 msgid "programming error: %1 (%2)"
 msgstr "programming error : %1 (%2)"
 
-#: location_ui.cc:52 location_ui.cc:54
+#: location_ui.cc:54 location_ui.cc:57
 msgid "Use PH"
 msgstr "Utiliser TDL"
 
-#: location_ui.cc:59
+#: location_ui.cc:55 location_ui.cc:58
+msgid "Goto"
+msgstr "Aller à"
+
+#: location_ui.cc:63
 msgid "Glue"
 msgstr "Coller"
 
-#: location_ui.cc:87
+#: location_ui.cc:88
 msgid "Performer:"
 msgstr "Exécutant :"
 
-#: location_ui.cc:88
+#: location_ui.cc:89
 msgid "Composer:"
 msgstr "Compositeur :"
 
-#: location_ui.cc:90
+#: location_ui.cc:91
 msgid "Pre-Emphasis"
 msgstr "Pré-accentuation"
 
-#: location_ui.cc:317
+#: location_ui.cc:319
 msgid "Remove this range"
 msgstr "Supprimer cet intervalle"
 
-#: location_ui.cc:318
+#: location_ui.cc:320
 msgid "Start time - middle click to locate here"
 msgstr "Temps de début — clic du milieu pour se positionner ici"
 
-#: location_ui.cc:319
+#: location_ui.cc:321
 msgid "End time - middle click to locate here"
 msgstr "Temps de fin — clic du milieu pour se positionner ici"
 
-#: location_ui.cc:322
+#: location_ui.cc:324
 msgid "Set range start from playhead location"
 msgstr "Régler le début de l'intervalle à la position de la tête de lecture"
 
-#: location_ui.cc:323
+#: location_ui.cc:325
 msgid "Set range end from playhead location"
 msgstr "Régler la fin de l'intervalle à la position de la tête de lecture"
 
-#: location_ui.cc:327
+#: location_ui.cc:329
 msgid "Remove this marker"
 msgstr "Supprimer ce repère"
 
-#: location_ui.cc:328
+#: location_ui.cc:330
 msgid "Position - middle click to locate here"
 msgstr "Position — clic du milieu pou se positionner ici"
 
-#: location_ui.cc:330
+#: location_ui.cc:332
 msgid "Set marker time from playhead location"
 msgstr "Placer le repère en fonction de la position de la tête de lecture"
 
-#: location_ui.cc:499
+#: location_ui.cc:524
 msgid "You cannot put a CD marker at the start of the session"
 msgstr "Vous ne pouvez pas mettre un repère de CD au début de la session"
 
-#: location_ui.cc:725
+#: location_ui.cc:750
 msgid "New Marker"
 msgstr "Nouveau repère"
 
-#: location_ui.cc:726
+#: location_ui.cc:751
 msgid "New Range"
 msgstr "Nouvel intervalle"
 
-#: location_ui.cc:739
+#: location_ui.cc:764
 msgid "<b>Loop/Punch Ranges</b>"
 msgstr "<b>Intervalles de boucle et « punch »</b>"
 
-#: location_ui.cc:764
+#: location_ui.cc:790
 msgid "<b>Markers (Including CD Index)</b>"
 msgstr "<b>Repères (Y compris index de CD)</b>"
 
-#: location_ui.cc:799
+#: location_ui.cc:825
 msgid "<b>Ranges (Including CD Track Ranges)</b>"
 msgstr "<b>Intervalles (Y compris intervalles de piste CD)</b>"
 
-#: location_ui.cc:1042
+#: location_ui.cc:1068
 msgid "add range marker"
 msgstr "ajouter un repère d'intervalle"
 
-#: main.cc:82
+#: lua_script_manager.cc:31
+msgid "Add/Set"
+msgstr ""
+
+#: lua_script_manager.cc:34
+msgid "Call"
+msgstr ""
+
+#: lua_script_manager.cc:35
+msgid "New Hook"
+msgstr ""
+
+#: lua_script_manager.cc:77
+msgid "Signal(s)"
+msgstr ""
+
+#: lua_script_manager.cc:127
+msgid "Action %1"
+msgstr ""
+
+#: lua_script_manager.cc:132 lua_script_manager.cc:227
+msgid "Unset"
+msgstr ""
+
+#: luainstance.cc:1079
+msgid "Cannot read script '%1': %2"
+msgstr ""
+
+#: luawindow.cc:97
+msgid "Run"
+msgstr ""
+
+#: luawindow.cc:98
+msgid "Clear Output"
+msgstr ""
+
+#: luawindow.cc:102
+msgid "Revert"
+msgstr ""
+
+#: luawindow.cc:166
+msgid "Select Editor Buffer"
+msgstr ""
+
+#: luawindow.cc:253 luawindow.cc:258
+msgid "Window|Lua"
+msgstr ""
+
+#: luawindow.cc:286 luawindow.cc:304
+msgid "LuaException: %1"
+msgstr ""
+
+#: luawindow.cc:342
+msgid "Deleted %1"
+msgstr ""
+
+#: luawindow.cc:345
+msgid "Failed to delete %1"
+msgstr ""
+
+#: luawindow.cc:411
+msgid ""
+"Missing script header.\n"
+"The script requires an '{ardour}' info table and a 'factory' function."
+msgstr ""
+
+#: luawindow.cc:416
+msgid "Script fails to compile."
+msgstr ""
+
+#: luawindow.cc:423
+msgid "Invalid or missing script-name or script-type."
+msgstr ""
+
+#: luawindow.cc:428
+msgid ""
+"Invalid script-type.\n"
+"Valid types are 'EditorAction' and 'Snippet'."
+msgstr ""
+
+#: luawindow.cc:439 luawindow.cc:490
+msgid "Saved as %1"
+msgstr ""
+
+#: luawindow.cc:442 luawindow.cc:493
+msgid "Error saving file: %1"
+msgstr ""
+
+#: luawindow.cc:452
+msgid ""
+"Script with given name '%1' already exists.\n"
+"Use a different name in the descriptor."
+msgstr ""
+
+#: luawindow.cc:636
+msgid "Scratch Buffer %1"
+msgstr ""
+
+#: luawindow.cc:638
+msgid "Action: '%1'"
+msgstr ""
+
+#: luawindow.cc:640
+msgid "Snippet: %1"
+msgstr ""
+
+#: luawindow.cc:652
+msgid "Save as"
+msgstr ""
+
+#: main.cc:88
 msgid "%1 could not connect to the audio backend."
 msgstr "%1 ne peut pas se connecter au moteur audio."
 
-#: main.cc:107 main.cc:123
+#: main.cc:135 main.cc:151
 msgid "The audio backend (%1) has failed, or terminated"
 msgstr "Le moteur audio (%1) n'a pas fonctionné ou s'est arrêté"
 
-#: main.cc:110
+#: main.cc:138
 #, fuzzy
 msgid ""
 "%2 exited unexpectedly, and without notifying %1.\n"
@@ -7070,40 +8293,41 @@ msgid ""
 "\n"
 "Click OK to exit %1."
 msgstr ""
-"%2 fermé de manière inattendue, sans rien notifier à %1.\n"
+"%2 s'est terminé de manière inattendue, sans rien notifier à %1.\n"
 "\n"
-"Ceci pourrait venir d'erreur ou mauvaise configuration dans %2.\n"
+"Ceci pourrait venir d'une erreur ou d'une mauvaise configuration dans %2.\n"
 "\n"
-"Cliquer sur OK pour fermer %1."
+"Cliquer OK pour fermer %1."
 
-#: main.cc:124
-#, fuzzy
+#: main.cc:152
 msgid "%2 exited unexpectedly, and without notifying %1."
-msgstr "%2 fermé de manière inattendue, et sans rien notifier à %1."
+msgstr "%2 s'est terminé de manière inattendue, et sans rien notifier à %1."
 
-#: main.cc:219
+#: main.cc:247
 msgid ""
 "\n"
 "   %1 could not understand your command line      "
 msgstr ""
+"\n"
+"   %1 n'a pas pu interpréter votre ligne de commande      "
 
-#: main.cc:221
+#: main.cc:249
 msgid "An error was encountered while launching %1"
-msgstr ""
+msgstr "Une erreur a été rencontrée au lancement de %1"
 
-#: main.cc:310
+#: main.cc:346
 msgid " (built using "
 msgstr " (construit avec "
 
-#: main.cc:313
+#: main.cc:349
 msgid " and GCC version "
 msgstr " et GCC version "
 
-#: main.cc:323
-msgid "Copyright (C) 1999-2012 Paul Davis"
-msgstr "Copyright © 1999-2012 Paul Davis"
+#: main.cc:359
+msgid "Copyright (C) 1999-2015 Paul Davis"
+msgstr "Copyright © 1999-2015 Paul Davis"
 
-#: main.cc:324
+#: main.cc:360
 msgid ""
 "Some portions Copyright (C) Steve Harris, Ari Johnson, Brett Viren, Joel "
 "Baker, Robin Gareus"
@@ -7111,48 +8335,67 @@ msgstr ""
 "Pour certaines parties, Copyright © Steve Harris, Ari Johnson, Brett Viren, "
 "Joel Baker, Robin Gareus"
 
-#: main.cc:326
+#: main.cc:362
 msgid "%1 comes with ABSOLUTELY NO WARRANTY"
 msgstr "%1 est distribué sans AUCUNE GARANTIE"
 
-#: main.cc:327
+#: main.cc:363
 msgid "not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
-msgstr "pas même de COMMERCIALISATION ou d'ADÉQUATION À UN BUT PARTICULIER."
+msgstr "pas même de COMMERCIABILISATION ou d'ADÉQUATION À UN BUT PARTICULIER."
 
-#: main.cc:328
+#: main.cc:364
 msgid "This is free software, and you are welcome to redistribute it "
 msgstr "Ceci est un logiciel libre, et vous êtes encouragé à le distribuer "
 
-#: main.cc:329
+#: main.cc:365
 msgid "under certain conditions; see the source for copying conditions."
 msgstr ""
 "sous certaines conditions ; voir le fichier source pour les conditions de "
 "distribution."
 
-#: main.cc:334
+#: main.cc:370
 msgid "could not initialize %1."
 msgstr "impossible d'initialiser %1."
 
-#: main.cc:344
+#: main.cc:380
 msgid "Cannot xinstall SIGPIPE error handler"
+msgstr "Impossible d'installer le gestionnaire d'erreurs SIGPIPE"
+
+#: main.cc:387
+msgid "Could not complete pre-GUI initialization"
 msgstr ""
 
-#: main.cc:351
-#, fuzzy
+#: main.cc:394
 msgid "could not create %1 GUI"
-msgstr "IHM %1 impossible à créer"
+msgstr "Impossible de créer l'interface de %1"
 
-#: main_clock.cc:52
+#: main_clock.cc:51
 msgid "Display delta to edit cursor"
 msgstr "Afficher le delta par rapport au curseur d'édition"
 
-#: marker.cc:273
+#: main_clock.cc:66 tempo_dialog.cc:55
+msgid "Edit Tempo"
+msgstr "Édition du tempo"
+
+#: main_clock.cc:67 tempo_dialog.cc:429
+msgid "Edit Meter"
+msgstr "Éditer signature"
+
+#: main_clock.cc:68
+msgid "Insert Tempo Change"
+msgstr "Insérer un changement de tempo"
+
+#: main_clock.cc:69
+msgid "Insert Meter Change"
+msgstr "Insérer un changement de signature"
+
+#: marker.cc:280
 msgid "MarkerText"
 msgstr "MarkerText"
 
 #: midi_channel_selector.cc:161 midi_channel_selector.cc:400
-#: midi_channel_selector.cc:436 rc_option_editor.cc:1573
-#: rc_option_editor.cc:2203 sfdb_ui.cc:665
+#: midi_channel_selector.cc:436 rc_option_editor.cc:2157
+#: rc_option_editor.cc:2799 sfdb_ui.cc:671
 msgid "None"
 msgstr "Aucun"
 
@@ -7193,10 +8436,10 @@ msgstr "Enregistrer seulement les canaux sélectionnés"
 msgid "Force all channels to 1 channel"
 msgstr "Forcer tous les canaux sur 1 canal"
 
-# context is missing, translation says something like "entering"
+# context: midi selector dialog (Inbound/Playback)
 #: midi_channel_selector.cc:376
 msgid "Inbound"
-msgstr "Entrant"
+msgstr "Entrée"
 
 #: midi_channel_selector.cc:396
 msgid "Click to enable recording all channels"
@@ -7235,11 +8478,11 @@ msgstr "Cliquer pour basculer la lecture du canal %1"
 msgid "Click to force all MIDI channel messages to channel %1"
 msgstr "Cliquer pour forcer tous les message des canaux MIDI vers le canal %1"
 
-#: midi_channel_selector.cc:718
+#: midi_channel_selector.cc:720
 msgid "Click to toggle recording of channel %1"
 msgstr "Cliquer pour basculer l'enregistrement du canal %1"
 
-#: midi_channel_selector.cc:726
+#: midi_channel_selector.cc:728
 msgid "Click to force all recorded channels to %1"
 msgstr "Cliquer pour forcer tous les canaux enregistrés à %1"
 
@@ -7351,199 +8594,195 @@ msgstr "éditer le canal"
 msgid "velocity edit"
 msgstr "éditer la vélocité"
 
-#: midi_region_view.cc:954
+#: midi_region_view.cc:962
 msgid "add note"
 msgstr "ajouter une note"
 
-#: midi_region_view.cc:1885
+#: midi_region_view.cc:1904
 #, fuzzy
 msgid "step add"
 msgstr "Ajouter Pas-à-pas"
 
-#: midi_region_view.cc:1979 midi_region_view.cc:2002
+#: midi_region_view.cc:1998 midi_region_view.cc:2021
 #, fuzzy
 msgid "alter patch change"
 msgstr "Modifier le changement de patch"
 
-#: midi_region_view.cc:2038
+#: midi_region_view.cc:2057
 #, fuzzy
 msgid "add patch change"
 msgstr "Ajouter le changement de patch"
 
-#: midi_region_view.cc:2060 midi_region_view.cc:2061
+#: midi_region_view.cc:2079 midi_region_view.cc:2080
 #, fuzzy
 msgid "move patch change"
 msgstr "Déplacer le changement de patch"
 
-#: midi_region_view.cc:2073 midi_region_view.cc:2074
+#: midi_region_view.cc:2092 midi_region_view.cc:2093
 #, fuzzy
 msgid "delete patch change"
 msgstr "Effacer le changement de patch"
 
-#: midi_region_view.cc:2112
+#: midi_region_view.cc:2131
 msgid "delete selection"
 msgstr "supprimer la sélection"
 
-#: midi_region_view.cc:2128
+#: midi_region_view.cc:2148
 msgid "delete note"
 msgstr "supprimer la note"
 
-#: midi_region_view.cc:2587
+#: midi_region_view.cc:2589
 msgid "move notes"
 msgstr "déplacer les notes"
 
-#: midi_region_view.cc:3070
+#: midi_region_view.cc:3139
 #, fuzzy
 msgid "change velocities"
 msgstr "Changer les vélocités"
 
-#: midi_region_view.cc:3136
+#: midi_region_view.cc:3205
 msgid "transpose"
 msgstr "transposer"
 
-#: midi_region_view.cc:3164
+#: midi_region_view.cc:3233
 msgid "change note lengths"
 msgstr "modifier la durée de la note"
 
-#: midi_region_view.cc:3240
+#: midi_region_view.cc:3309
 msgid "nudge"
 msgstr "décaler"
 
-#: midi_region_view.cc:3255
+#: midi_region_view.cc:3324
 msgid "change channel"
 msgstr "changer le canal"
 
-#: midi_region_view.cc:3295
+#: midi_region_view.cc:3372
 msgid "Bank "
 msgstr "Banque"
 
-#: midi_region_view.cc:3296
-msgid "Program "
-msgstr "Programme"
-
-#: midi_region_view.cc:3297
+#: midi_region_view.cc:3374
 msgid "Channel "
 msgstr "Canal"
 
-#: midi_region_view.cc:3484
+#: midi_region_view.cc:3561
 msgid "paste"
 msgstr "coller"
 
-#: midi_streamview.cc:185
+#: midi_streamview.cc:184
 msgid "attempt to display MIDI region with no source"
-msgstr ""
+msgstr "Tentative de création de région MIDI sans source"
 
-#: midi_streamview.cc:195
+#: midi_streamview.cc:194
 msgid "attempt to display MIDI region with no model"
-msgstr ""
+msgstr "Tentative de création de région MIDI sans modèle"
 
-#: midi_streamview.cc:506
+#: midi_streamview.cc:505
 msgid "failed to create MIDI region"
 msgstr "Echec lors de la création de la région MIDI"
 
-#: midi_time_axis.cc:309
+#: midi_time_axis.cc:306
 msgid "External MIDI Device"
 msgstr "Appareil MIDI externe"
 
-#: midi_time_axis.cc:310
+#: midi_time_axis.cc:307
 msgid "External Device Mode"
 msgstr "Mode appareil externe"
 
-#: midi_time_axis.cc:318
+#: midi_time_axis.cc:315
 msgid "Chns"
 msgstr "Canx"
 
-#: midi_time_axis.cc:320
+#: midi_time_axis.cc:317
 msgid "Click to edit channel settings"
 msgstr "Clique pour éditer les réglage du canal"
 
-#: midi_time_axis.cc:519
+#: midi_time_axis.cc:516
 msgid "Show Full Range"
 msgstr "Afficher l'ensemble de l'intervalle"
 
-#: midi_time_axis.cc:524
+#: midi_time_axis.cc:521
 msgid "Fit Contents"
 msgstr "Au contenu"
 
-#: midi_time_axis.cc:528
+#: midi_time_axis.cc:525
 msgid "Note Range"
 msgstr "Intervalle de note"
 
-#: midi_time_axis.cc:529
+#: midi_time_axis.cc:526
 msgid "Note Mode"
 msgstr "Mode note"
 
-#: midi_time_axis.cc:530
+#: midi_time_axis.cc:527
 msgid "Channel Selector"
 msgstr "Sélecteur de canal"
 
-#: midi_time_axis.cc:535
+#: midi_time_axis.cc:532
 msgid "Color Mode"
 msgstr "Mode couleur"
 
-#: midi_time_axis.cc:594
+#: midi_time_axis.cc:591
 #, fuzzy
 msgid "Bender"
 msgstr "Tirer la note"
 
-#: midi_time_axis.cc:598
+#: midi_time_axis.cc:595
 msgid "Pressure"
 msgstr "Pression"
 
-#: midi_time_axis.cc:610
+#: midi_time_axis.cc:607
 msgid "Controllers"
 msgstr "Contrôleurs"
 
-#: midi_time_axis.cc:615
+#: midi_time_axis.cc:612
 msgid "No MIDI Channels selected"
 msgstr "Aucun canal MIDI sélectionné"
 
-#: midi_time_axis.cc:672 midi_time_axis.cc:801
+#: midi_time_axis.cc:669 midi_time_axis.cc:798
 msgid "Hide all channels"
 msgstr "Cacher tous les canaux"
 
-#: midi_time_axis.cc:676 midi_time_axis.cc:805
+#: midi_time_axis.cc:673 midi_time_axis.cc:802
 msgid "Show all channels"
 msgstr "Afficher tous les canaux"
 
-#: midi_time_axis.cc:687 midi_time_axis.cc:816
+#: midi_time_axis.cc:684 midi_time_axis.cc:813
 msgid "Channel %1"
 msgstr "Canal %1"
 
-#: midi_time_axis.cc:942 midi_time_axis.cc:974
+#: midi_time_axis.cc:939 midi_time_axis.cc:971
 msgid "Controllers %1-%2"
 msgstr "Contrôleurs %1-%2"
 
-#: midi_time_axis.cc:965 midi_time_axis.cc:968
+#: midi_time_axis.cc:962 midi_time_axis.cc:965
 msgid "Controller %1"
 msgstr "Contrôleur %1"
 
-#: midi_time_axis.cc:991
+#: midi_time_axis.cc:988
 msgid "Sustained"
 msgstr "Longue"
 
-#: midi_time_axis.cc:998
+#: midi_time_axis.cc:995
 msgid "Percussive"
 msgstr "Percussive"
 
-#: midi_time_axis.cc:1018
+#: midi_time_axis.cc:1015
 msgid "Meter Colors"
 msgstr "Couleurs du bargraphe"
 
-#: midi_time_axis.cc:1025
+#: midi_time_axis.cc:1022
 msgid "Channel Colors"
 msgstr "Couleur du canal"
 
-#: midi_time_axis.cc:1032
+#: midi_time_axis.cc:1029
 msgid "Track Color"
 msgstr "Couleur de la piste"
 
-#: midi_time_axis.cc:1606 midi_time_axis.cc:1612 midi_time_axis.cc:1622
-#: midi_time_axis.cc:1628
+#: midi_time_axis.cc:1610 midi_time_axis.cc:1616 midi_time_axis.cc:1626
+#: midi_time_axis.cc:1632
 msgid "all"
 msgstr "tout"
 
-#: midi_time_axis.cc:1609 midi_time_axis.cc:1625
+#: midi_time_axis.cc:1613 midi_time_axis.cc:1629
 msgid "some"
 msgstr "certains"
 
@@ -7559,7 +8798,7 @@ msgstr "Défilement automatique"
 msgid "Decimal"
 msgstr "Décimal"
 
-#: midi_tracer.cc:57 rc_option_editor.cc:740
+#: midi_tracer.cc:57 rc_option_editor.cc:1356
 msgid "Enabled"
 msgstr "Activé"
 
@@ -7575,36 +8814,36 @@ msgstr "Port :"
 msgid "New velocity"
 msgstr "Nouvelle vélocité"
 
-#: missing_file_dialog.cc:35
-#, fuzzy
+#: missing_file_dialog.cc:36
 msgid "Missing File"
-msgstr "Fichier manquant !"
+msgstr "Fichier manquant"
 
-#: missing_file_dialog.cc:37
+#: missing_file_dialog.cc:38
 msgid "Select a folder to search"
 msgstr "Choisir le dossier pour la recherche"
 
-#: missing_file_dialog.cc:38
+#: missing_file_dialog.cc:39
 msgid "Add chosen folder to search path, and try again"
 msgstr "Ajouter le dossier aux chemins de recherche, et essayer à nouveau"
 
-#: missing_file_dialog.cc:40
+#: missing_file_dialog.cc:41
 msgid "Stop loading this session"
 msgstr "Arrêter le chargement de la session"
 
-#: missing_file_dialog.cc:41
+#: missing_file_dialog.cc:42
 msgid "Skip all missing files"
 msgstr "Ignorer tous les fichiers manquants"
 
-#: missing_file_dialog.cc:42
+#: missing_file_dialog.cc:43
 msgid "Skip this file"
 msgstr "Ignorer ce fichier"
 
-#: missing_file_dialog.cc:53
+#: missing_file_dialog.cc:57 tempo_dialog.cc:135 tempo_dialog.cc:136
+#: tempo_dialog.cc:484 tempo_dialog.cc:485
 msgid "audio"
 msgstr "audio"
 
-#: missing_file_dialog.cc:70
+#: missing_file_dialog.cc:74
 msgid ""
 "%1 cannot find the %2 file\n"
 "\n"
@@ -7624,7 +8863,7 @@ msgstr ""
 "<tt>%4</tt>\n"
 "\n"
 
-#: missing_file_dialog.cc:104
+#: missing_file_dialog.cc:108
 msgid "Click to choose an additional folder"
 msgstr "Cliquez pour choisir un dossier supplémentaire"
 
@@ -7632,112 +8871,40 @@ msgstr "Cliquez pour choisir un dossier supplémentaire"
 msgid "Missing Plugins"
 msgstr "Greffons manquants"
 
-#: missing_plugin_dialog.cc:33 transcode_video_dialog.cc:60
+#: missing_plugin_dialog.cc:36 transcode_video_dialog.cc:60
 msgid "OK"
 msgstr "OK"
 
-#: mixer_actor.cc:55
-#, fuzzy
-msgid "Toggle Solo on Mixer-Selected Tracks/Busses"
-msgstr "Basculer Solo sur les Pistes/Bus sélectionnés-Console"
-
-#: mixer_actor.cc:56
-#, fuzzy
-msgid "Toggle Mute on Mixer-Selected Tracks/Busses"
-msgstr "Basculer Muet sur les Pistes/Bus sélectionnés-Console"
-
-#: mixer_actor.cc:57
-#, fuzzy
-msgid "Toggle Rec-enable on Mixer-Selected Tracks/Busses"
-msgstr "Basculer Enreg-Armé les Pistes/Bus sélectionnés-Console"
-
-#: mixer_actor.cc:58
-#, fuzzy
-msgid "Decrease Gain on Mixer-Selected Tracks/Busses"
-msgstr "Baisser le gain pour les Pistes/Bus sélectionnés-Console"
-
-#: mixer_actor.cc:59
-#, fuzzy
-msgid "Increase Gain on Mixer-Selected Tracks/Busses"
-msgstr "Augmenter le gain pour les Pistes/Bus sélectionnés-Console"
-
-#: mixer_actor.cc:60
-#, fuzzy
-msgid "Set Gain to 0dB on Mixer-Selected Tracks/Busses"
-msgstr "Gain à 0dB pour les Pistes/Bus sélectionnés-Console"
-
-#: mixer_actor.cc:63
-#, fuzzy
-msgid "Copy Selected Processors"
-msgstr "Copier les traitements sélectionnés"
-
-#: mixer_actor.cc:64
-#, fuzzy
-msgid "Cut Selected Processors"
-msgstr "Enlever les traitements sélectionnés"
-
-#: mixer_actor.cc:65
-#, fuzzy
-msgid "Paste Selected Processors"
-msgstr "Coller les traitements sélectionnés"
-
-#: mixer_actor.cc:66
-#, fuzzy
-msgid "Delete Selected Processors"
-msgstr "Enlever les traitements sélectionnés"
-
-#: mixer_actor.cc:67
-#, fuzzy
-msgid "Select All (visible) Processors"
-msgstr "Sélectionner tous les traitements (visibles)"
-
-#: mixer_actor.cc:68
-#, fuzzy
-msgid "Toggle Selected Processors"
-msgstr "Basculer les traitements sélectionnés"
-
-#: mixer_actor.cc:69
-msgid "Toggle Selected Plugins"
-msgstr "Activer/désactiver le greffon sélectionné"
-
-#: mixer_actor.cc:70
-msgid "Deselect all strips and processors"
+#: missing_plugin_dialog.cc:42
+msgid ""
+"This session contains the following plugins that cannot be found on this "
+"system:\n"
+"\n"
 msgstr ""
 
-#: mixer_actor.cc:72 mixer_actor.cc:73
-#, fuzzy
-msgid "Scroll Mixer Window to the left"
-msgstr "Défiler vers la gauche de la Console"
-
-#: mixer_actor.cc:75
-#, fuzzy
-msgid "Toggle MIDI Input Active for Mixer-Selected Tracks/Busses"
-msgstr "Pour les Pistes/Bus sélectionnés-Console, activer l'entrée MIDI"
-
-#: mixer_actor.cc:90
-#, fuzzy
-msgid "Loaded mixer bindings from %1"
-msgstr "Réglages de Console chargées depuis %1"
-
-#: mixer_actor.cc:92
-#, fuzzy
-msgid "Could not find mixer.bindings in search path %1"
-msgstr "Réglages de Console introuvables dans %1"
+#: missing_plugin_dialog.cc:48
+msgid ""
+"\n"
+"Those plugins will be replaced with inactive stubs.\n"
+"It is recommended that you install the missing plugins and re-load the "
+"session.\n"
+"(also check the blacklist, Window > Log and Preferences > Plugins)"
+msgstr ""
 
-#: mixer_strip.cc:96 mixer_strip.cc:125
+#: mixer_strip.cc:100 mixer_strip.cc:133
 msgid "pre"
 msgstr "pré"
 
-#: mixer_strip.cc:98 mixer_strip.cc:127 mixer_strip.cc:372 mixer_strip.cc:1410
-#: rc_option_editor.cc:2331
+#: mixer_strip.cc:104 mixer_strip.cc:136 mixer_strip.cc:397 mixer_strip.cc:1540
+#: mixer_strip.cc:1551 rc_option_editor.cc:3140
 msgid "Comments"
 msgstr "Commentaires"
 
-#: mixer_strip.cc:149
+#: mixer_strip.cc:160
 msgid "Click to toggle the width of this mixer strip."
 msgstr "Cliquer pour changer la largeur de la tranche de mixage."
 
-#: mixer_strip.cc:151
+#: mixer_strip.cc:162
 msgid ""
 "\n"
 "%1-%2-click to toggle the width of all strips."
@@ -7745,315 +8912,483 @@ msgstr ""
 "\n"
 "%1-%2-clic pour basculer la largueur de toutes les tranches."
 
-#: mixer_strip.cc:158
+#: mixer_strip.cc:171
 msgid "Hide this mixer strip"
 msgstr "Cacher cette tranche de mixage"
 
-#: mixer_strip.cc:169
+#: mixer_strip.cc:182
 msgid "Click to select metering point"
 msgstr "Cliquer pour choisir le point de mesure"
 
-#: mixer_strip.cc:185
+#: mixer_strip.cc:198
 msgid "Isolate Solo"
 msgstr "Isoler le Solo"
 
-#: mixer_strip.cc:193
+#: mixer_strip.cc:206
 msgid "Lock Solo Status"
 msgstr "Verrouiller le statut Solo"
 
-#: mixer_strip.cc:196 mixer_strip.cc:2027
+#: mixer_strip.cc:208 mixer_strip.cc:2217
+msgid "SoloLock|Lock"
+msgstr "Verr."
+
+#: mixer_strip.cc:209 mixer_strip.cc:2216
 msgid "Iso"
 msgstr "Iso."
 
-#: mixer_strip.cc:250
+#: mixer_strip.cc:263
 msgid "Mix group"
 msgstr "Groupe de mixage"
 
-#: mixer_strip.cc:368 rc_option_editor.cc:2327
+#: mixer_strip.cc:275
+msgid "Trim: "
+msgstr ""
+
+#: mixer_strip.cc:393 rc_option_editor.cc:3136
 #, fuzzy
 msgid "Phase Invert"
 msgstr "Inverseur de phase"
 
-#: mixer_strip.cc:369 rc_option_editor.cc:2328
-#, fuzzy
+#: mixer_strip.cc:394 rc_option_editor.cc:3137
 msgid "Record & Monitor"
-msgstr ": moniteur"
+msgstr "Enregistrement & monitoring"
 
-#: mixer_strip.cc:370 rc_option_editor.cc:2329
+#: mixer_strip.cc:395 rc_option_editor.cc:3138
 #, fuzzy
 msgid "Solo Iso / Lock"
 msgstr "Iso. / ver. solo"
 
-#: mixer_strip.cc:524
+#: mixer_strip.cc:398 rc_option_editor.cc:3141
+msgid "VCA Assigns"
+msgstr ""
+
+#: mixer_strip.cc:531
+msgid "Show/Hide Monitoring Section"
+msgstr "Afficher/Cacher la section d'écoute de contrôle"
+
+#: mixer_strip.cc:583
 msgid "Enable/Disable MIDI input"
 msgstr "Activer/désactiver l'entrée MIDI"
 
-#: mixer_strip.cc:688
+#: mixer_strip.cc:749
 #, fuzzy
 msgid "Aux"
 msgstr ""
 "Départs\n"
 "Aux"
 
-#: mixer_strip.cc:710
+#: mixer_strip.cc:775
 #, fuzzy
 msgid "Snd"
 msgstr "Dép"
 
-#: mixer_strip.cc:776 mixer_strip.cc:879 processor_box.cc:2382
+#: mixer_strip.cc:846 mixer_strip.cc:951 processor_box.cc:3594
 #, fuzzy
 msgid "Not connected to audio engine - no I/O changes are possible"
-msgstr "Déconnecté du moteur Audio: pas de changement E/S possible"
+msgstr "Déconnecté du moteur Audio : pas de modification d'E/S possible"
 
-#: mixer_strip.cc:833 mixer_strip.cc:935
+#: mixer_strip.cc:904 mixer_strip.cc:1007
 msgid "Add %1 port"
-msgstr ""
+msgstr "Ajouter un port %1"
 
-#: mixer_strip.cc:840 mixer_strip.cc:942
-#, fuzzy
+#: mixer_strip.cc:912 mixer_strip.cc:1014 monitor_section.cc:1466
+#: plugin_pin_dialog.cc:1782
 msgid "Routing Grid"
-msgstr "Routine des départs"
+msgstr "Grille de routage"
 
-#: mixer_strip.cc:1171
+#: mixer_strip.cc:1291
+msgid "MIDI "
+msgstr "MIDI "
+
+#: mixer_strip.cc:1295
 msgid "<b>INPUT</b> to %1"
 msgstr "<b>ENTRÉE</b> vers %1"
 
-#: mixer_strip.cc:1174
+#: mixer_strip.cc:1297 monitor_section.cc:1511
 msgid "<b>OUTPUT</b> from %1"
 msgstr "<b>SORTIE</b> depuis %1"
 
-#: mixer_strip.cc:1287
+#: mixer_strip.cc:1410 monitor_section.cc:1598
 msgid "Disconnected"
 msgstr "Déconnecté"
 
-#: mixer_strip.cc:1413
-msgid "*Comments*"
-msgstr "*Commentaires*"
+#: mixer_strip.cc:1536
+msgid "Click to add/edit comments"
+msgstr ""
 
-#: mixer_strip.cc:1420
+#: mixer_strip.cc:1540 mixer_strip.cc:1551
 msgid "Cmt"
 msgstr "Cmt"
 
-#: mixer_strip.cc:1423
-msgid "*Cmt*"
-msgstr "*Cmt*"
-
-#: mixer_strip.cc:1429
-msgid "Click to Add/Edit Comments"
-msgstr "Cliquer pour ajouter ou modifier les commentaires"
-
-#: mixer_strip.cc:1473
+#: mixer_strip.cc:1596
 msgid "Grp"
 msgstr "Grp"
 
-#: mixer_strip.cc:1476
+#: mixer_strip.cc:1599
 msgid "~G"
 msgstr "~G"
 
-#: mixer_strip.cc:1505 route_time_axis.cc:561
+#: mixer_strip.cc:1640 route_time_axis.cc:585 vca_master_strip.cc:396
 msgid "Color..."
 msgstr "Couleur…"
 
-#: mixer_strip.cc:1507 route_time_axis.cc:563
+#: mixer_strip.cc:1642 route_time_axis.cc:587
 msgid "Comments..."
 msgstr "Commentaires…"
 
-#: mixer_strip.cc:1509 route_time_axis.cc:565
-#, fuzzy
+#: mixer_strip.cc:1644 route_time_axis.cc:589
 msgid "Inputs..."
-msgstr "Entrées"
+msgstr "Entrées..."
 
-#: mixer_strip.cc:1511 route_time_axis.cc:567
-#, fuzzy
+#: mixer_strip.cc:1646 route_time_axis.cc:591
 msgid "Outputs..."
-msgstr "Sorties"
+msgstr "Sorties..."
 
-#: mixer_strip.cc:1516
+#: mixer_strip.cc:1651
 msgid "Save As Template..."
 msgstr "Sauvegarder comme modèle…"
 
-#: mixer_strip.cc:1530
+#: mixer_strip.cc:1657 route_group_dialog.cc:45 route_time_axis.cc:851
+msgid "Active"
+msgstr "Actif"
+
+#: mixer_strip.cc:1665 plugin_pin_dialog.cc:1011
+msgid "Strict I/O"
+msgstr "E/S strictes"
+
+#: mixer_strip.cc:1675 processor_box.cc:3698
+msgid "Pin Connections..."
+msgstr "Ajuster les connexions"
+
+#: mixer_strip.cc:1679
 msgid "Adjust Latency..."
 msgstr "Ajuster la latence…"
 
-#: mixer_strip.cc:1533
+#: mixer_strip.cc:1682
 msgid "Protect Against Denormals"
 msgstr "Protèger contre les dénormalisations"
 
-#: mixer_strip.cc:1539 route_time_axis.cc:580
-msgid "Remote Control ID..."
-msgstr "ID de télécommande…"
+#: mixer_strip.cc:1701 route_time_axis.cc:867
+msgid "Duplicate..."
+msgstr "Dupliquer..."
 
-#: mixer_strip.cc:1823
+#: mixer_strip.cc:1996
 #, fuzzy
 msgid "Pre"
 msgstr "pré"
 
-#: mixer_strip.cc:1827
+#: mixer_strip.cc:2000
 #, fuzzy
 msgid "Post"
 msgstr "Post"
 
-#: mixer_strip.cc:1847
-msgid "Pr"
+#: mixer_strip.cc:2016
+msgid "Meter|In"
 msgstr ""
 
-#: mixer_strip.cc:1851
-msgid "Po"
+#: mixer_strip.cc:2020
+msgid "Meter|Pr"
 msgstr ""
 
-#: mixer_strip.cc:1860
-#, fuzzy
-msgid "C"
-msgstr "Ajouter un do"
+#: mixer_strip.cc:2024
+msgid "Meter|Po"
+msgstr ""
+
+#: mixer_strip.cc:2028
+msgid "Meter|O"
+msgstr ""
+
+#: mixer_strip.cc:2033
+msgid "Meter|C"
+msgstr ""
 
-#: mixer_strip.cc:2008 route_ui.cc:168
+#: mixer_strip.cc:2194 route_ui.cc:193
 msgid "Disk"
 msgstr "Disque"
 
-#: mixer_strip.cc:2020 monitor_section.cc:70
+#: mixer_strip.cc:2196
+msgid "Mon"
+msgstr ""
+
+#: mixer_strip.cc:2209 monitor_section.cc:81
 msgid "AFL"
 msgstr "AFL"
 
-#: mixer_strip.cc:2023 monitor_section.cc:71
+#: mixer_strip.cc:2212 monitor_section.cc:82
 msgid "PFL"
 msgstr "PFL"
 
-# Short for Device Output
-#: mixer_strip.cc:2034 meter_strip.cc:380
-msgid "D"
-msgstr "S"
+#: mixer_strip.cc:2222 meter_strip.cc:385
+msgid "MonitorInput|I"
+msgstr ""
 
-#: mixer_strip.cc:2241
-msgid "Pre Fader"
-msgstr "Pré-atténuation"
+#: mixer_strip.cc:2223 meter_strip.cc:386
+msgid "MonitorDisk|D"
+msgstr ""
+
+#: mixer_strip.cc:2225
+msgid "Mon|O"
+msgstr ""
+
+#: mixer_strip.cc:2238 meter_strip.cc:377 route_time_axis.cc:2730
+#: vca_master_strip.cc:202 vca_time_axis.cc:227
+msgid "AfterFader|A"
+msgstr ""
+
+#: mixer_strip.cc:2241
+msgid "Prefader|P"
+msgstr ""
 
-#: mixer_strip.cc:2242
+#: mixer_strip.cc:2246
+msgid "SoloIso|I"
+msgstr ""
+
+#: mixer_strip.cc:2247
+msgid "SoloLock|L"
+msgstr ""
+
+#: mixer_strip.cc:2452
+msgid "Pre Fader"
+msgstr "Pré-atténuation"
+
+#: mixer_strip.cc:2453
 msgid "Post Fader"
 msgstr "Post-atténuation"
 
-#: mixer_strip.cc:2286 meter_strip.cc:847
-#, fuzzy
+#: mixer_strip.cc:2498 meter_strip.cc:858
 msgid "Change all in Group to %1"
-msgstr "Tout dans le groupe en %1"
+msgstr "Changer tout dans le groupe en %1"
 
-#: mixer_strip.cc:2288 meter_strip.cc:849
-#, fuzzy
+#: mixer_strip.cc:2500 meter_strip.cc:860
 msgid "Change all to %1"
-msgstr "Tout en %1"
+msgstr "Changer tout en %1"
 
-#: mixer_strip.cc:2290 meter_strip.cc:851
-#, fuzzy
+#: mixer_strip.cc:2502 meter_strip.cc:862
 msgid "Change same track-type to %1"
-msgstr "Toutes les Pistes du même type en %1"
+msgstr "Toutes les pistes du même type en %1"
 
-#: mixer_ui.cc:130 route_time_axis.cc:818
+#: mixer_ui.cc:152 route_time_axis.cc:828
 msgid "Group"
 msgstr "Groupe"
 
-#: mixer_ui.cc:1224
+#: mixer_ui.cc:221
+msgid "Favorite Plugins"
+msgstr "Greffons favoris"
+
+#: mixer_ui.cc:627
+msgid "Error adding GUI elements for new tracks/busses %1"
+msgstr ""
+
+#: mixer_ui.cc:1542
 msgid "track display list item for renamed strip not found!"
 msgstr ""
 "élément de liste d'affichage de piste introuvable pour la tranche renommée !"
 
-#: mixer_ui.cc:1316
+#: mixer_ui.cc:1636
 msgid "-all-"
 msgstr "-tout-"
 
-#: mixer_ui.cc:1853
+#: mixer_ui.cc:2135
 msgid "Strips"
 msgstr "Tranches"
 
-#: meter_strip.cc:157
+#: mixer_ui.cc:2479
+msgid "No Track/Bus is selected."
+msgstr ""
+
+#: mixer_ui.cc:2481
+msgid "Add at the top"
+msgstr "Ajouter au début"
+
+#: mixer_ui.cc:2483
+msgid "Add Pre-Fader"
+msgstr "Ajouter pré-atténuation"
+
+#: mixer_ui.cc:2485
+msgid "Add Post-Fader"
+msgstr "Ajouter après atténuation"
+
+#: mixer_ui.cc:2487
+msgid "Add at the end"
+msgstr "Ajouter à la fin"
+
+#: mixer_ui.cc:2493
+msgid "Remove from favorites"
+msgstr "Retirer des favoris"
+
+#: mixer_ui.cc:2499
+msgid "Delete Preset"
+msgstr "Supprimer le préréglage"
+
+#: mixer_ui.cc:2739
+msgid "Toggle Solo on Mixer-Selected Tracks/Busses"
+msgstr "Basculer Solo sur les Pistes/Bus sélectionnés"
+
+#: mixer_ui.cc:2740
+msgid "Toggle Mute on Mixer-Selected Tracks/Busses"
+msgstr "Basculer Muet sur les Pistes/Bus sélectionnés"
+
+#: mixer_ui.cc:2741
+msgid "Toggle Rec-enable on Mixer-Selected Tracks/Busses"
+msgstr "(Dés)armer l'enregistrement des Pistes/Bus sélectionnés"
+
+#: mixer_ui.cc:2742
+msgid "Decrease Gain on Mixer-Selected Tracks/Busses"
+msgstr "Baisser le gain pour les Pistes/Bus sélectionnés"
+
+#: mixer_ui.cc:2743
+msgid "Increase Gain on Mixer-Selected Tracks/Busses"
+msgstr "Augmenter le gain pour les Pistes/Bus sélectionnés"
+
+#: mixer_ui.cc:2744
+msgid "Set Gain to 0dB on Mixer-Selected Tracks/Busses"
+msgstr "Gain à 0dB pour les Pistes/Bus sélectionnés"
+
+#: mixer_ui.cc:2747
+#, fuzzy
+msgid "Copy Selected Processors"
+msgstr "Copier les traitements sélectionnés"
+
+#: mixer_ui.cc:2748
+#, fuzzy
+msgid "Cut Selected Processors"
+msgstr "Couper les traitements sélectionnés"
+
+#: mixer_ui.cc:2749
+#, fuzzy
+msgid "Paste Selected Processors"
+msgstr "Coller les traitements sélectionnés"
+
+#: mixer_ui.cc:2750
+msgid "Delete Selected Processors"
+msgstr "Supprimer les traitements sélectionnés"
+
+#: mixer_ui.cc:2751
+#, fuzzy
+msgid "Select All (visible) Processors"
+msgstr "Sélectionner tous les traitements (visibles)"
+
+#: mixer_ui.cc:2752
+msgid "Toggle Selected Processors"
+msgstr "(Dés)Activer les traitements sélectionnés"
+
+#: mixer_ui.cc:2753
+msgid "Toggle Selected Plugins"
+msgstr "Activer/désactiver le greffon sélectionné"
+
+#: mixer_ui.cc:2754
+msgid "Deselect all strips and processors"
+msgstr "Désélectionner toutes les tranches et traitements"
+
+#: mixer_ui.cc:2756 mixer_ui.cc:2757
+#, fuzzy
+msgid "Scroll Mixer Window to the left"
+msgstr "Défiler vers la gauche de la Console"
+
+#: mixer_ui.cc:2759
+msgid "Toggle MIDI Input Active for Mixer-Selected Tracks/Busses"
+msgstr ""
+"Activer l'entrée MIDI des Pistes/Bus sélectionnés dans la console, activer "
+"l'entrée MIDI"
+
+#: meter_strip.cc:160
 msgid "Reset Peak"
+msgstr "Réinitialiser crête"
+
+#: meter_strip.cc:380 route_time_axis.cc:2734 vca_master_strip.cc:206
+#: vca_time_axis.cc:231
+msgid "PreFader|P"
 msgstr ""
 
-#: meter_strip.cc:883
+#: meter_strip.cc:894
 #, fuzzy
 msgid "Variable height"
 msgstr "Hauteur variable"
 
-#: meter_strip.cc:884
+#: meter_strip.cc:895
 #, fuzzy
 msgid "Short"
 msgstr "Petit"
 
-#: meter_strip.cc:885
+#: meter_strip.cc:896
 #, fuzzy
 msgid "Tall"
 msgstr "Moyen"
 
-#: meter_strip.cc:886
+#: meter_strip.cc:897
 #, fuzzy
 msgid "Grande"
 msgstr "Grand"
 
-#: meter_strip.cc:887
+#: meter_strip.cc:898
 msgid "Venti"
 msgstr ""
 
-#: meter_patterns.cc:82
-#, fuzzy
-msgid "Peak"
-msgstr "Pic"
+#: meter_patterns.cc:84
+msgid "Peak (+6dBFS)"
+msgstr ""
 
-#: meter_patterns.cc:85
+#: meter_patterns.cc:87
+msgid "Peak (0dBFS)"
+msgstr ""
+
+#: meter_patterns.cc:90
 #, fuzzy
 msgid "RMS + Peak"
 msgstr "RMS + Crête"
 
-#: meter_patterns.cc:88
+#: meter_patterns.cc:93
 #, fuzzy
 msgid "IEC1/DIN"
 msgstr "Niveau ligne IEC1/DIN, 0 dBu "
 
-#: meter_patterns.cc:91
+#: meter_patterns.cc:96
 #, fuzzy
 msgid "IEC1/Nordic"
 msgstr "IEC1/Nordique"
 
-#: meter_patterns.cc:94
+#: meter_patterns.cc:99
 msgid "IEC2/BBC"
 msgstr ""
 
-#: meter_patterns.cc:97
+#: meter_patterns.cc:102
 msgid "IEC2/EBU"
 msgstr ""
 
-#: meter_patterns.cc:100
-msgid "K20"
+#: meter_patterns.cc:105
+msgid "K20/RMS"
 msgstr ""
 
-#: meter_patterns.cc:103
-msgid "K14"
+#: meter_patterns.cc:108
+msgid "K14/RMS"
 msgstr ""
 
-#: meter_patterns.cc:106
-msgid "K12"
+#: meter_patterns.cc:111
+msgid "K12/RMS"
 msgstr ""
 
-#: meter_patterns.cc:109
+#: meter_patterns.cc:114
 msgid "VU"
-msgstr ""
+msgstr "VU"
 
-#: monitor_section.cc:69
+#: monitor_section.cc:80
 msgid "SiP"
 msgstr "SiP"
 
-#: monitor_section.cc:96 route_group_dialog.cc:49
+#: monitor_section.cc:113 route_group_dialog.cc:49
 msgid "Soloing"
 msgstr "Solo"
 
-#: monitor_section.cc:100
+#: monitor_section.cc:117
 #, fuzzy
 msgid "Isolated"
 msgstr "Isolé"
 
-#: monitor_section.cc:104
+#: monitor_section.cc:121
 msgid "Auditioning"
 msgstr "Écoute"
 
-#: monitor_section.cc:114
+#: monitor_section.cc:132
 msgid ""
 "When active, something is solo-isolated.\n"
 "Click to de-isolate everything"
@@ -8061,7 +9396,7 @@ msgstr ""
 "Actif lorsque quelque chose est isolé par un solo\n"
 "Cliquez pour désactiver tous les solos."
 
-#: monitor_section.cc:117
+#: monitor_section.cc:135
 msgid ""
 "When active, auditioning is active.\n"
 "Click to stop the audition"
@@ -8069,158 +9404,219 @@ msgstr ""
 "Actif lorsqu'une écoute est en cours\n"
 "Cliquez pour stopper l'écoute."
 
-#: monitor_section.cc:134
+#: monitor_section.cc:152
 #, fuzzy
 msgid "Solo controls affect solo-in-place"
 msgstr "Les controles de Solo affectent le Solo-en-place"
 
-#: monitor_section.cc:140
+#: monitor_section.cc:158
 #, fuzzy
 msgid "Solo controls toggle after-fader-listen"
 msgstr "Les contrôles de Solo sont Post-Fader"
 
-#: monitor_section.cc:146
+#: monitor_section.cc:164
 #, fuzzy
 msgid "Solo controls toggle pre-fader-listen"
 msgstr "Les contrôles de Solo sont Pré-Fader"
 
-#: monitor_section.cc:156
+#: monitor_section.cc:170
+#, fuzzy
+msgid "Excl. Solo"
+msgstr "Solo exclusif"
+
+#: monitor_section.cc:172
+msgid "Exclusive solo means that only 1 solo is active at a time"
+msgstr "Solo exclusif veut dire qu'un seul solo peut être actif à la fois"
+
+#: monitor_section.cc:179
 #, fuzzy
+msgid "Solo » Mute"
+msgstr "Solo » Muet"
+
+#: monitor_section.cc:181
+msgid ""
+"If enabled, solo will override mute\n"
+"(a soloed & muted track or bus will be audible)"
+msgstr ""
+"Si actif, le mode solo prend le pas sur le mode muet (une piste muette et en "
+"solo sera audible)"
+
+#: monitor_section.cc:189
+msgid "Processors"
+msgstr ""
+
+#: monitor_section.cc:191
+msgid "Allow one to add monitor effect processors"
+msgstr ""
+
+#: monitor_section.cc:206
 msgid "Gain increase for soloed signals (0dB is normal)"
-msgstr "Volume des signaux en mode solo (0dB est normal)"
+msgstr "Augmentation du gain pour les signaux solo (0dB est normal)"
 
-#: monitor_section.cc:170
+#: monitor_section.cc:210 monitor_section.cc:227 monitor_section.cc:244
+#: monitor_section.cc:289
+msgid "0 dB"
+msgstr "0 dB"
+
+#: monitor_section.cc:211
+msgid "3 dB"
+msgstr "3 dB"
+
+#: monitor_section.cc:212
+msgid "6 dB"
+msgstr "6 dB"
+
+#: monitor_section.cc:213
+msgid "10 dB"
+msgstr "10 dB"
+
+#: monitor_section.cc:215
 msgid "Solo Boost"
 msgstr "Gain Solo"
 
-#: monitor_section.cc:185
-#, fuzzy
+#: monitor_section.cc:222
 msgid ""
 "Gain reduction non-soloed signals\n"
 "A value above -inf dB causes \"solo-in-front\""
 msgstr ""
 "Baisse de gain des signaux non-solo\n"
-"Une valeur supérieure à -infini cause \"solo-devant\""
+"Une valeur supérieure à -infini crée un \"solo-mise en avant\""
+
+#: monitor_section.cc:228 monitor_section.cc:246 monitor_section.cc:291
+msgid "-6 dB"
+msgstr "-6 dB"
+
+#: monitor_section.cc:229 monitor_section.cc:247 monitor_section.cc:292
+msgid "-12 dB"
+msgstr "-12 dB"
 
-#: monitor_section.cc:196
+#: monitor_section.cc:230 monitor_section.cc:248 monitor_section.cc:293
+msgid "-20 dB"
+msgstr "-20 dB"
+
+#: monitor_section.cc:231
+msgid "OFF"
+msgstr ""
+
+#: monitor_section.cc:233
 #, fuzzy
 msgid "SiP Cut"
 msgstr "Réduction SeP"
 
-#: monitor_section.cc:211
-#, fuzzy
+#: monitor_section.cc:240
 msgid "Gain reduction to use when dimming monitor outputs"
-msgstr "Réduction de volume (Dim) pour les sorties Monitor"
+msgstr "Réduction de gain pour l'atténuation (Dim) des sorties de monitoring"
+
+#: monitor_section.cc:245 monitor_section.cc:290
+msgid "-3 dB"
+msgstr "-3 dB"
 
-#: monitor_section.cc:225 monitor_section.cc:283
+#: monitor_section.cc:250 monitor_section.cc:264 monitor_section.cc:325
 #, fuzzy
 msgid "Dim"
 msgstr "Dim"
 
-#: monitor_section.cc:235
-#, fuzzy
-msgid "Excl. Solo"
-msgstr "Solo exclusif"
-
-#: monitor_section.cc:237
-msgid "Exclusive solo means that only 1 solo is active at a time"
-msgstr "Solo exclusif veut dire qu'un seul solo peut être actif à la fois"
-
-#: monitor_section.cc:244
-#, fuzzy
-msgid "Solo » Mute"
-msgstr "Solo » Muet"
+#: monitor_section.cc:294
+msgid "-30 dB"
+msgstr "-30 dB"
 
-#: monitor_section.cc:246
-msgid ""
-"If enabled, solo will override mute\n"
-"(a soloed & muted track or bus will be audible)"
+#: monitor_section.cc:333
+msgid "Inv"
 msgstr ""
-"Si actif, le mode solo prend le pas sur le mode muet (une piste muette et en "
-"solo sera audible)"
 
-#: monitor_section.cc:323
-#, fuzzy
+#: monitor_section.cc:399
 msgid "Monitor"
-msgstr ": moniteur"
+msgstr "Monitoring"
 
-#: monitor_section.cc:744
-#, fuzzy
+#: monitor_section.cc:897
 msgid "Switch monitor to mono"
 msgstr "Ecoute Mono"
 
-#: monitor_section.cc:747
-#, fuzzy
+#: monitor_section.cc:900
 msgid "Cut monitor"
 msgstr "Couper l'écoute"
 
-#: monitor_section.cc:750
-#, fuzzy
+#: monitor_section.cc:903
 msgid "Dim monitor"
-msgstr "Dim écoute"
+msgstr "Atténuer l'écoute"
 
-#: monitor_section.cc:753
-#, fuzzy
+#: monitor_section.cc:906
 msgid "Toggle exclusive solo mode"
-msgstr "Basculer mode Solo en exclusif"
+msgstr "Basculer mode Solo exclusif"
 
-#: monitor_section.cc:759
-#, fuzzy
+#: monitor_section.cc:912
 msgid "Toggle mute overrides solo mode"
-msgstr "Basculer le mode Solo remplace Muet"
+msgstr "(Dés)Activer le mode muet prioritaire sur solo"
 
-#: monitor_section.cc:771
-#, fuzzy
+#: monitor_section.cc:921
 msgid "Cut monitor channel %1"
 msgstr "Canal d'écoute %1 muet"
 
-#: monitor_section.cc:776
+#: monitor_section.cc:926
 #, fuzzy
 msgid "Dim monitor channel %1"
-msgstr "Dim écoute canal %1"
+msgstr "Atténuer le canal de monitoring %1"
 
-#: monitor_section.cc:781
+#: monitor_section.cc:931
 #, fuzzy
 msgid "Solo monitor channel %1"
-msgstr "Solo écoute canal %1"
+msgstr "Solo sur canal de monitoring %1"
 
-#: monitor_section.cc:786
-#, fuzzy
+#: monitor_section.cc:936
 msgid "Invert monitor channel %1"
-msgstr "Inverser la phase du canal %1"
+msgstr "Inverser la phase du canal de monitoring %1"
 
-#: monitor_section.cc:796
+#: monitor_section.cc:946
 #, fuzzy
 msgid "In-place solo"
 msgstr "Solo-en-Place"
 
-#: monitor_section.cc:798
+#: monitor_section.cc:948
 #, fuzzy
 msgid "After Fade Listen (AFL) solo"
 msgstr "Solo Après Fader (AFL)"
 
-#: monitor_section.cc:800
+#: monitor_section.cc:950
 #, fuzzy
 msgid "Pre Fade Listen (PFL) solo"
 msgstr "Solo Pré Fader (PFL)"
 
-#: mono_panner.cc:109 stereo_panner.cc:119
+#: monitor_section.cc:953
+msgid "Toggle Monitor Section Processor Box"
+msgstr ""
+
+#: monitor_section.cc:1413
+msgid "No session - no I/O changes are possible"
+msgstr ""
+
+#: monitor_selector.cc:199
+msgid "Monitor output selector"
+msgstr ""
+
+#: mono_panner.cc:105 stereo_panner.cc:115
 #, fuzzy
 msgid "bypassed"
 msgstr "Désactivé"
 
-#: mono_panner.cc:123
+#: mono_panner.cc:119
 #, c-format
 msgid "L:%3d R:%3d"
 msgstr "G : %3d D : %3d"
 
-#: mono_panner_editor.cc:33
-#, fuzzy
+#: mono_panner.cc:203 panner2d.cc:276 stereo_panner.cc:252 stereo_panner.cc:275
+msgid "Panner|L"
+msgstr "G"
+
+#: mono_panner.cc:220 panner2d.cc:277 stereo_panner.cc:250 stereo_panner.cc:277
+msgid "Panner|R"
+msgstr "D"
+
+#: mono_panner_editor.cc:35
 msgid "Mono Panner"
-msgstr "Pan. Mono"
+msgstr "Balance Mono"
 
-#: mono_panner_editor.cc:44 mono_panner_editor.cc:49
-#: stereo_panner_editor.cc:46 stereo_panner_editor.cc:51
+#: mono_panner_editor.cc:46 mono_panner_editor.cc:51 stereo_panner_editor.cc:48
+#: stereo_panner_editor.cc:53
 msgid "%"
 msgstr "%"
 
@@ -8298,10 +9694,6 @@ msgstr ""
 "d'Ardour est dépendant du revenu généré par les dons, qui doit être stable\n"
 "et permanent. Merci d'utiliser Ardour !"
 
-#: new_plugin_preset_dialog.cc:29
-msgid "New Preset"
-msgstr "Nouveau préréglage"
-
 #: new_plugin_preset_dialog.cc:30
 msgid "Replace existing preset with this name"
 msgstr "Écraser le préréglage avec ce nom"
@@ -8310,6 +9702,10 @@ msgstr "Écraser le préréglage avec ce nom"
 msgid "Name of new preset"
 msgstr "Nom du nouveau préréglage :"
 
+#: new_plugin_preset_dialog.cc:44
+msgid "New Favorite Only"
+msgstr ""
+
 #: normalize_dialog.cc:34
 msgid "Normalize regions"
 msgstr "Normaliser les régions"
@@ -8318,19 +9714,17 @@ msgstr "Normaliser les régions"
 msgid "Normalize region"
 msgstr "Normaliser la région"
 
-#: normalize_dialog.cc:49 strip_silence_dialog.cc:66
-msgid "dbFS"
-msgstr "dBFS"
+#: normalize_dialog.cc:42
+msgid "Normalize to:"
+msgstr "Normaliser à :"
 
 #: normalize_dialog.cc:56
-#, fuzzy
 msgid "Normalize each region using its own peak value"
-msgstr "Normaliser chaque Région selon son propre pic de niveau"
+msgstr "Normaliser chaque Région selon son propre niveau de crête"
 
 #: normalize_dialog.cc:58
-#, fuzzy
 msgid "Normalize each region using the peak value of all regions"
-msgstr "Normaliser chaque Région selon le pic de niveau de toutes"
+msgstr "Normaliser chaque Région selon le niveau de crête global"
 
 #: normalize_dialog.cc:73
 msgid "Normalize"
@@ -8338,38 +9732,45 @@ msgstr "Normaliser"
 
 #: note_select_dialog.cc:33
 msgid "Select Note"
-msgstr ""
+msgstr "Sélectionner une note"
 
-#: opts.cc:57
+#: opts.cc:61
 msgid "Usage: "
 msgstr "Utilisation : "
 
-#: opts.cc:58
+#: opts.cc:62
 msgid "  [SESSION_NAME]              Name of session to load\n"
 msgstr "  [nomsession]                     Nom de la session à charger\n"
 
-#: opts.cc:59
+#: opts.cc:63
 msgid "  -v, --version               Show version information\n"
 msgstr ""
 " -v, --version                    Affiche les informations de version\n"
 
-#: opts.cc:60
+#: opts.cc:64
 msgid "  -h, --help                  Print this message\n"
 msgstr " -h, --help                       Affiche ce message\n"
 
-#: opts.cc:61
+#: opts.cc:65
 msgid ""
 "  -a, --no-announcements      Do not contact website for announcements\n"
 msgstr "  -a, --no-announcements      Ne pas chercher d'annonces sur le site\n"
 
-#: opts.cc:62
+#: opts.cc:66
 msgid ""
 "  -b, --bindings              Print all possible keyboard binding names\n"
 msgstr ""
 "u  -b, --bindings                   Affiche tous les noms de raccourcis "
 "clavier possibles\n"
 
-#: opts.cc:63
+#: opts.cc:67
+msgid ""
+"  -B, --bypass-plugins        Bypass all plugins in an existing session\n"
+msgstr ""
+"  -B, --bypass-plugins        Court-circuiter tous les greffons d'une "
+"session existante\n"
+
+#: opts.cc:68
 #, fuzzy
 msgid ""
 "  -c, --name <name>           Use a specific backend client name, default is "
@@ -8378,14 +9779,14 @@ msgstr ""
 "  -c, --name <name>           Utiliser un nom de client personnalisé, ardour "
 "par défaut\n"
 
-#: opts.cc:64
+#: opts.cc:69
 msgid ""
 "  -d, --disable-plugins       Disable all plugins in an existing session\n"
 msgstr ""
 "  -d, --disable-plugins            Désactive tous les greffons d'une session "
 "existante\n"
 
-#: opts.cc:65
+#: opts.cc:70
 msgid ""
 "  -D, --debug <options>       Set debug flags. Use \"-D list\" to see "
 "available options\n"
@@ -8393,47 +9794,46 @@ msgstr ""
 "  -D, --debug <options>       Définir les drapeaux de débogage. Utiliser « -"
 "D list »  pour avoir les options disponibles\n"
 
-#: opts.cc:66
+#: opts.cc:71
 msgid "  -n, --no-splash             Do not show splash screen\n"
 msgstr ""
 "  -n, --no-splash                Ne pas afficher l'écran de démarrage\n"
 
-#: opts.cc:67
+#: opts.cc:72
 msgid "  -m, --menus file            Use \"file\" to define menus\n"
 msgstr ""
 "  -m, --menus fichier              Utiliser « fichier » pour définir les "
 "menus\n"
 
-#: opts.cc:68
+#: opts.cc:73
 msgid ""
 "  -N, --new session-name      Create a new session from the command line\n"
 msgstr ""
 "  -N, --new nomsession             Créer une nouvelle session depuis la "
 "ligne de commande\n"
 
-#: opts.cc:69
+#: opts.cc:74
 msgid "  -O, --no-hw-optimizations   Disable h/w specific optimizations\n"
 msgstr ""
-"  -O, --no-hw-optimizations        Désactiver les optimisations matérielles "
+"  -O, --no-hw-optimizations   Désactiver les optimisations matérielles "
 "spécifiques\n"
 
-#: opts.cc:70
-#, fuzzy
+#: opts.cc:75
 msgid "  -P, --no-connect-ports      Do not connect any ports at startup\n"
-msgstr "  -P, --no-connect-ports      Sans port connecté au démarrage\n"
+msgstr "  -P, --no-connect-ports      Ne connecter aucun port au démarrage\n"
 
-#: opts.cc:71
+#: opts.cc:76
 msgid "  -S, --sync                  Draw the gui synchronously \n"
 msgstr ""
 "  -S, --sync\t                      Dessiner l'interface graphique en mode "
 "synchrone\n"
 
-#: opts.cc:73
+#: opts.cc:78
 msgid "  -V, --novst                 Do not use VST support\n"
 msgstr ""
 "  -V, --novst                      Désactiver la prise en charge des VST\n"
 
-#: opts.cc:75
+#: opts.cc:80
 msgid ""
 "  -E, --save <file>           Load the specified session, save it to <file> "
 "and then quit\n"
@@ -8441,28 +9841,23 @@ msgstr ""
 "  -E, --save <fichier>           Charger la session, la sauvegarder dans "
 "« fichier » puis quitter\n"
 
-#: opts.cc:76
+#: opts.cc:81
 msgid "  -C, --curvetest filename    Curve algorithm debugger\n"
 msgstr "  -C, --curvetest nomfichier       Débogueur d'algorithme de courbe\n"
 
-#: opts.cc:77
-msgid ""
-"  -k, --keybindings filename  Name of key bindings to load (default is ~/."
-"ardour3/ardour.bindings)\n"
+#: opts.cc:82
+msgid "  -k, --keybindings filename  Name of key bindings to load\n"
 msgstr ""
-"  -k, --keybindings nomfichier       Nom du fichier des raccourcis claviers "
-"à charger (par défaut ~/.ardour3/ardour.bindings)\n"
 
-#: panner2d.cc:854
-#, fuzzy
+#: panner2d.cc:896
 msgid "Panner (2D)"
-msgstr "Panoramique (2D)"
+msgstr "Balance (2D)"
 
-#: panner2d.cc:856 panner_ui.cc:400 plugin_ui.cc:452
+#: panner2d.cc:898 panner_ui.cc:402 plugin_ui.cc:458
 msgid "Bypass"
 msgstr "Court-circuiter"
 
-#: panner2d.cc:862
+#: panner2d.cc:904
 #, fuzzy
 msgid "Panner"
 msgstr "Panoramique"
@@ -8475,6 +9870,22 @@ msgstr "Mode d'automation du panoramique"
 msgid "Pan automation type"
 msgstr "Type d'automation de panoramique"
 
+#: panner_ui.cc:605
+msgid "Manual|M"
+msgstr ""
+
+#: panner_ui.cc:608
+msgid "Play|P"
+msgstr ""
+
+#: panner_ui.cc:611
+msgid "Touch|T"
+msgstr ""
+
+#: panner_ui.cc:614
+msgid "Write|W"
+msgstr ""
+
 #: playlist_selector.cc:43
 msgid "Playlists"
 msgstr "Listes de lecture"
@@ -8508,102 +9919,257 @@ msgstr "Échelle en dB"
 msgid "Show phase"
 msgstr "Afficher la phase"
 
-#: plugin_selector.cc:53 plugin_selector.cc:229
-msgid "Name contains"
-msgstr "Le nom contient"
+#: plugin_pin_dialog.cc:55
+msgid "Manual Config"
+msgstr ""
 
-#: plugin_selector.cc:54 plugin_selector.cc:233
-msgid "Type contains"
-msgstr "Le type contient"
+#: plugin_pin_dialog.cc:56
+msgid "Sidechain"
+msgstr ""
 
-#: plugin_selector.cc:55 plugin_selector.cc:231
-msgid "Category contains"
-msgstr "La catégorie contient"
+#: plugin_pin_dialog.cc:57 plugin_pin_dialog.cc:59 plugin_pin_dialog.cc:61
+#: plugin_pin_dialog.cc:63 plugin_pin_dialog.cc:65 step_entry.cc:81
+#: step_entry.cc:84
+msgid "+"
+msgstr "+"
 
-#: plugin_selector.cc:56 plugin_selector.cc:253
-msgid "Author contains"
-msgstr "Le nom de l'auteur contient"
+#: plugin_pin_dialog.cc:58 plugin_pin_dialog.cc:60 plugin_pin_dialog.cc:62
+#: plugin_pin_dialog.cc:64 plugin_pin_dialog.cc:66
+msgid "-"
+msgstr ""
 
-#: plugin_selector.cc:57 plugin_selector.cc:255
-msgid "Library contains"
-msgstr "La bibliothèque contient"
+#: plugin_pin_dialog.cc:148
+msgid "Audio Input Pins"
+msgstr ""
 
-#: plugin_selector.cc:58 plugin_selector.cc:219 plugin_selector.cc:537
-msgid "Favorites only"
-msgstr "Seulement les favoris"
+#: plugin_pin_dialog.cc:157
+msgid "MIDI Input Pins"
+msgstr ""
 
-#: plugin_selector.cc:59 plugin_selector.cc:223 plugin_selector.cc:537
-#, fuzzy
-msgid "Hidden only"
-msgstr "Seulement les cachés"
+#: plugin_pin_dialog.cc:166
+msgid "Instances"
+msgstr ""
 
-#: plugin_selector.cc:64
-msgid "Plugin Manager"
-msgstr "Gestionnaire de greffons"
+#: plugin_pin_dialog.cc:176
+msgid "Audio Out"
+msgstr ""
 
-#: plugin_selector.cc:85
-msgid "Fav"
+#: plugin_pin_dialog.cc:185
+msgid "MIDI Out"
 msgstr ""
 
-#: plugin_selector.cc:87
-msgid "Available Plugins"
-msgstr "Greffons disponibles"
+#: plugin_pin_dialog.cc:192
+msgid "Output Presets"
+msgstr ""
 
-#: plugin_selector.cc:88
-msgid "Type"
-msgstr "Type"
+#: plugin_pin_dialog.cc:208
+msgid "Add Sidechain Input"
+msgstr ""
 
-#: plugin_selector.cc:89
-msgid "Category"
-msgstr "Catégorie"
+#: plugin_pin_dialog.cc:478 plugin_pin_dialog.cc:482 plugin_pin_dialog.cc:486
+#: plugin_setup_dialog.cc:115 plugin_setup_dialog.cc:199
+msgid "Automatic"
+msgstr ""
 
-#: plugin_selector.cc:90
-msgid "Creator"
-msgstr "Créateur"
+#: plugin_pin_dialog.cc:515 plugin_setup_dialog.cc:208
+msgid "%1 Channel"
+msgid_plural "%1 Channels"
+msgstr[0] ""
+msgstr[1] ""
 
-#: plugin_selector.cc:91
-msgid "# Audio In"
-msgstr "# Entrée audio"
+#: plugin_pin_dialog.cc:641 processor_box.cc:224
+#, fuzzy
+msgid "Send"
+msgstr "Départ"
 
-#: plugin_selector.cc:92
-msgid "# Audio Out"
-msgstr "# Sortie audio"
+#: plugin_pin_dialog.cc:997
+msgid "Latency %1 spl%2 %3"
+msgstr ""
 
-#: plugin_selector.cc:93
-msgid "# MIDI In"
-msgstr "# Entrée MIDI"
+#: plugin_pin_dialog.cc:997 plugin_pin_dialog.cc:1001
+msgid "no-inplace"
+msgstr ""
 
-#: plugin_selector.cc:94
-msgid "# MIDI Out"
+#: plugin_pin_dialog.cc:999
+msgid "Latency %1 spl"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1055
+msgid "Instance #%1"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1700 processor_box.cc:2508
+msgid "Cannot set up new send: %1"
+msgstr "Impossible de configurer le nouveau départ : %1"
+
+#: plugin_pin_dialog.cc:1707
+msgid "SC %1 (%2)"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1963 plugin_pin_dialog.cc:1971
+msgid "Pin Configuration: %1"
+msgstr ""
+
+#: plugin_setup_dialog.cc:30
+msgid "Plugin Setup"
+msgstr ""
+
+#: plugin_setup_dialog.cc:33
+msgid "Copy I/O Map"
+msgstr ""
+
+#: plugin_setup_dialog.cc:50
+msgid "An Instrument plugin is already present."
+msgstr ""
+
+#: plugin_setup_dialog.cc:54
+msgid "Replace"
+msgstr ""
+
+#: plugin_setup_dialog.cc:60
+msgid "with"
+msgstr ""
+
+#: plugin_setup_dialog.cc:70
+msgid "I/O Pin Mapping"
+msgstr ""
+
+#: plugin_setup_dialog.cc:79
+msgid "Configure Plugin '%1'"
+msgstr ""
+
+#: plugin_setup_dialog.cc:90
+msgid "Output Configuration"
+msgstr ""
+
+#: plugin_selector.cc:54 plugin_selector.cc:322
+msgid "Name contains"
+msgstr "Le nom contient"
+
+#: plugin_selector.cc:55 plugin_selector.cc:326
+msgid "Type contains"
+msgstr "Le type contient"
+
+#: plugin_selector.cc:56 plugin_selector.cc:324
+msgid "Category contains"
+msgstr "La catégorie contient"
+
+#: plugin_selector.cc:57 plugin_selector.cc:349
+msgid "Author contains"
+msgstr "Le nom de l'auteur contient"
+
+#: plugin_selector.cc:58 plugin_selector.cc:351
+msgid "Library contains"
+msgstr "La bibliothèque contient"
+
+#: plugin_selector.cc:59 plugin_selector.cc:278 plugin_selector.cc:639
+msgid "Favorites only"
+msgstr "Seulement les favoris"
+
+#: plugin_selector.cc:60 plugin_selector.cc:282 plugin_selector.cc:639
+#, fuzzy
+msgid "Hidden only"
+msgstr "Seulement les cachés"
+
+#: plugin_selector.cc:65
+msgid "Plugin Manager"
+msgstr "Gestionnaire de greffons"
+
+#: plugin_selector.cc:96
+msgid "Fav"
+msgstr "Fav"
+
+#: plugin_selector.cc:98
+msgid "Available Plugins"
+msgstr "Greffons disponibles"
+
+#: plugin_selector.cc:99
+msgid "Type"
+msgstr "Type"
+
+#: plugin_selector.cc:100
+msgid "Category"
+msgstr "Catégorie"
+
+#: plugin_selector.cc:101
+msgid "Creator"
+msgstr "Créateur"
+
+#: plugin_selector.cc:102
+msgid "# Audio In"
+msgstr "# Entrée audio"
+
+#: plugin_selector.cc:103
+msgid "# Audio Out"
+msgstr "# Sortie audio"
+
+#: plugin_selector.cc:104
+msgid "# MIDI In"
+msgstr "# Entrée MIDI"
+
+#: plugin_selector.cc:105
+msgid "# MIDI Out"
 msgstr "# Sortie MIDI"
 
-#: plugin_selector.cc:116
+#: plugin_selector.cc:132
 msgid "Plugins to be connected"
 msgstr "Greffons à connecter"
 
-#: plugin_selector.cc:129
+#: plugin_selector.cc:145
 msgid "Add a plugin to the effect list"
 msgstr "Ajouter un greffon à la liste"
 
-#: plugin_selector.cc:133
+#: plugin_selector.cc:149
 msgid "Remove a plugin from the effect list"
 msgstr "Retirer un greffon de la liste"
 
-#: plugin_selector.cc:135
-msgid "Update available plugins"
-msgstr "Rafraîchir les greffons disponibles"
+#: plugin_selector.cc:161
+msgid "Show Hidden"
+msgstr ""
+
+#: plugin_selector.cc:163
+msgid "Include hidden plugins in list."
+msgstr ""
+
+#: plugin_selector.cc:166
+msgid "Instruments"
+msgstr ""
+
+#: plugin_selector.cc:168
+msgid "Cycle display of instrument plugins (if any)."
+msgstr ""
+
+#: plugin_selector.cc:171
+msgid "Analyzers"
+msgstr ""
+
+#: plugin_selector.cc:173
+msgid "Cycle display of analysis plugins (if any)."
+msgstr ""
+
+#: plugin_selector.cc:176
+msgid "Utils"
+msgstr ""
+
+#: plugin_selector.cc:178
+msgid "Cycle display of utility plugins (if any)."
+msgstr ""
+
+#: plugin_selector.cc:208
+msgid "Filter"
+msgstr ""
 
-#: plugin_selector.cc:172
+#: plugin_selector.cc:232
 msgid "Insert Plugin(s)"
 msgstr "Insérer des greffons"
 
-#: plugin_selector.cc:337 plugin_selector.cc:338 plugin_selector.cc:339
-#: plugin_selector.cc:340
+#: plugin_selector.cc:439 plugin_selector.cc:440 plugin_selector.cc:441
+#: plugin_selector.cc:442
 #, fuzzy
 msgid "variable"
 msgstr "Variable"
 
-#: plugin_selector.cc:496
+#: plugin_selector.cc:598
 msgid ""
 "The plugin \"%1\" could not be loaded\n"
 "\n"
@@ -8613,92 +10179,92 @@ msgstr ""
 "\n"
 "Plus de détails dans la fenêtre de Journal (peut-être)"
 
-#: plugin_selector.cc:644
+#: plugin_selector.cc:757
 msgid "Favorites"
 msgstr "Favoris"
 
-#: plugin_selector.cc:646
+#: plugin_selector.cc:759
 msgid "Plugin Manager..."
 msgstr "Gestionnaire de greffon…"
 
-#: plugin_selector.cc:650
+#: plugin_selector.cc:763
 msgid "By Creator"
 msgstr "Par créateur"
 
-#: plugin_selector.cc:653
+#: plugin_selector.cc:766
 msgid "By Category"
 msgstr "Par catégorie"
 
-#: plugin_ui.cc:113
+#: plugin_ui.cc:114
 msgid "Eh? LADSPA plugins don't have editors!"
 msgstr "Hein ? Les greffons LADSPA n'ont pas d'éditeur !"
 
-#: plugin_ui.cc:122 plugin_ui.cc:227
-#, fuzzy
+#: plugin_ui.cc:123 plugin_ui.cc:228
 msgid ""
 "unknown type of editor-supplying plugin (note: no VST support in this "
 "version of %1)"
 msgstr ""
-"Type d'Éditeur de plugin inconnu (note: VST non supporté dans cette version "
-"d'%1)"
+"type inconnu de greffon fournissant un éditeur (note: VST non supporté dans "
+"cette version d'%1)"
 
-#: plugin_ui.cc:125
+#: plugin_ui.cc:126
 msgid "unknown type of editor-supplying plugin"
-msgstr "type inconnu pour le greffon fournissant un éditeur"
+msgstr "type inconnu de greffon fournissant un éditeur"
 
-#: plugin_ui.cc:257
-#, fuzzy
+#: plugin_ui.cc:258
 msgid ""
 "unknown type of editor-supplying plugin (note: no linuxVST support in this "
 "version of %1)"
 msgstr ""
-"type d'Éditeur de plugin inconnu (note: LinuxVST non supporté dans cette "
-"version d'%1)"
+"type inconnu de greffon fournissant un éditeur (note: LinuxVST non supporté "
+"dans cette version d'%1)"
 
-#: plugin_ui.cc:329
+#: plugin_ui.cc:330
 msgid "create_lv2_editor called on non-LV2 plugin"
-msgstr "create_lv2_editor est appelé sur un greffon non LV2"
+msgstr "create_lv2_editor appelé sur un greffon non LV2"
 
 #: plugin_ui.cc:418
 msgid "Add"
 msgstr "Ajouter"
 
-#: plugin_ui.cc:422
-#, fuzzy
+#: plugin_ui.cc:423
 msgid "Description"
 msgstr "Description"
 
-#: plugin_ui.cc:423
+#: plugin_ui.cc:424
 msgid "Plugin analysis"
 msgstr "Analyse du greffon"
 
-#: plugin_ui.cc:430
-#, fuzzy
+#: plugin_ui.cc:431
 msgid ""
 "Presets (if any) for this plugin\n"
 "(Both factory and user-created)"
 msgstr ""
-"Présets (éventuels) pour ce plugin\n"
+"Préréglages (éventuels) pour ce plugin\n"
 "(d'usine et d'utilisateur)"
 
-#: plugin_ui.cc:431
+#: plugin_ui.cc:432
 msgid "Save a new preset"
 msgstr "Sauvegarder nouveau préréglage"
 
-#: plugin_ui.cc:432
+#: plugin_ui.cc:433
 msgid "Save the current preset"
 msgstr "Sauvegarder le préréglage actuel"
 
-#: plugin_ui.cc:433
+#: plugin_ui.cc:434
 msgid "Delete the current preset"
 msgstr "Effacer le préréglage actuel"
 
-#: plugin_ui.cc:434
-#, fuzzy
+#: plugin_ui.cc:435
+msgid ""
+"Reset parameters to default (if no parameters are in automation play mode)"
+msgstr ""
+
+#: plugin_ui.cc:436
 msgid "Disable signal processing by the plugin"
 msgstr "Désactiver le traitement du signal par le plugin"
 
-#: plugin_ui.cc:467 plugin_ui.cc:663
+#: plugin_ui.cc:473 plugin_ui.cc:681
 msgid ""
 "Click to allow the plugin to receive keyboard events that %1 would normally "
 "use as a shortcut"
@@ -8706,114 +10272,115 @@ msgstr ""
 "Cliquez pour autoriser le greffon à recevoir des événements que %1 considère "
 "habituellement comme des raccourcis"
 
-#: plugin_ui.cc:468
+#: plugin_ui.cc:474
 msgid "Click to enable/disable this plugin"
 msgstr "Cliquer pour activer/désactiver ce greffon"
 
-#: plugin_ui.cc:507
+#: plugin_ui.cc:517
 msgid "latency (%1 sample)"
 msgid_plural "latency (%1 samples)"
 msgstr[0] "latence (%1 sample)"
 msgstr[1] "latence (%1 samples)"
 
-#: plugin_ui.cc:509
+#: plugin_ui.cc:519
 msgid "latency (%1 ms)"
 msgstr "latence (%1 ms)"
 
-#: plugin_ui.cc:520
+#: plugin_ui.cc:530
 msgid "Edit Latency"
-msgstr "Editer la latence"
+msgstr "Modifier la latence"
 
-#: plugin_ui.cc:566
+#: plugin_ui.cc:576
 msgid ""
 "Plugin presets are not supported in this build of %1. Consider paying for a "
 "full version"
 msgstr ""
-"Les préréglages de plugins ne sont pas pris en charge par cette version de "
+"Les préréglages de greffons ne sont pas pris en charge par cette version de "
 "%1. Envisagez d'acheter une version complète."
 
-#: plugin_ui.cc:574
+#: plugin_ui.cc:584
 msgid ""
 "Plugin presets are not supported in this build, see the Log window for more "
 "information."
 msgstr ""
+"Les préréglages des greffons ne sont pas pris en charge par cette version, "
+"consultez la fenêtre Journal pour plus d'informations."
+
+#: plugin_ui.cc:592
+msgid "New Preset"
+msgstr "Nouveau préréglage"
 
-#: plugin_ui.cc:670
+#: plugin_ui.cc:688
 msgid "Click to allow normal use of %1 keyboard shortcuts"
 msgstr "Cliquer pour utiliser normalement les raccourcis claviers de %1"
 
-#: port_group.cc:337
+#: plugin_ui.cc:785
+msgid "(none)"
+msgstr ""
+
+#: port_group.cc:338
 msgid "%1 Busses"
 msgstr "Bus %1"
 
-#: port_group.cc:338
+#: port_group.cc:339
 msgid "%1 Tracks"
 msgstr "Pistes %1"
 
-#: port_group.cc:339
+#: port_group.cc:340
 msgid "Hardware"
 msgstr "Matériel"
 
-#: port_group.cc:340
+#: port_group.cc:341
 msgid "%1 Misc"
 msgstr "Divers %1"
 
-#: port_group.cc:341
+#: port_group.cc:342
 msgid "Other"
 msgstr "Autre"
 
-#: port_group.cc:432 port_group.cc:433
+#: port_group.cc:434 port_group.cc:435
 msgid "LTC Out"
 msgstr "Sortie LTC"
 
-#: port_group.cc:436 port_group.cc:437
+#: port_group.cc:438 port_group.cc:439
 msgid "LTC In"
 msgstr "Entrée LTC"
 
-#: port_group.cc:463
+#: port_group.cc:473
 msgid "MTC in"
 msgstr "Entrée MTC"
 
-#: port_group.cc:466
+#: port_group.cc:476
 msgid "MIDI control in"
 msgstr "Réception des contrôles MIDI"
 
-#: port_group.cc:469
+#: port_group.cc:479
 msgid "MIDI clock in"
 msgstr "Entrée de l'horloge MIDI"
 
-#: port_group.cc:472
+#: port_group.cc:482
 msgid "MMC in"
 msgstr "Entrée MMC"
 
-#: port_group.cc:476
+#: port_group.cc:486
 msgid "MTC out"
 msgstr "Sortie MTC"
 
-#: port_group.cc:479
+#: port_group.cc:489
 msgid "MIDI control out"
 msgstr "Envoi des contrôles MIDI"
 
-#: port_group.cc:482
+#: port_group.cc:492
 msgid "MIDI clock out"
 msgstr "Sortie de l'horloge MIDI"
 
-#: port_group.cc:485
+#: port_group.cc:495
 msgid "MMC out"
 msgstr "Sortie MMC"
 
-#: port_group.cc:532
-#, fuzzy
-msgid ":monitor"
-msgstr ": moniteur"
-
-#: port_group.cc:544
-msgid "system:"
-msgstr "système :"
-
-#: port_group.cc:545
-msgid "alsa_pcm"
-msgstr "alsa_pcm"
+#: port_group.cc:579
+msgid "Scene "
+msgstr ""
 
 #: port_insert_ui.cc:39
 msgid "Measure Latency"
@@ -8832,91 +10399,79 @@ msgid "No signal detected"
 msgstr "Aucun signal détecté"
 
 #: port_insert_ui.cc:165
-#, fuzzy
 msgid "Port Insert "
-msgstr "Insertion du port "
+msgstr "Insertion de port "
 
-#: port_matrix.cc:331 port_matrix.cc:357
+#: port_matrix.cc:341 port_matrix.cc:367
 msgid "<b>Sources</b>"
 msgstr "<b>Sources</b>"
 
-#: port_matrix.cc:332 port_matrix.cc:358
+#: port_matrix.cc:342 port_matrix.cc:368
 msgid "<b>Destinations</b>"
 msgstr "<b>Destinations</b>"
 
-#: port_matrix.cc:440 port_matrix.cc:448
+#: port_matrix.cc:450 port_matrix.cc:458
 #, c-format
 msgid "Add %s %s"
 msgstr "Ajouter %s %s"
 
-#: port_matrix.cc:456
+#: port_matrix.cc:466
 #, c-format
 msgid "Rename '%s'..."
 msgstr "Renommer « %s »…"
 
-#: port_matrix.cc:472
+#: port_matrix.cc:482
 msgid "Remove all"
 msgstr "Tout supprimer"
 
-#: port_matrix.cc:492 port_matrix.cc:504
+#: port_matrix.cc:502 port_matrix.cc:514
 #, c-format
 msgid "%s all"
 msgstr "Tout %s"
 
-#: port_matrix.cc:527
+#: port_matrix.cc:537
 msgid "Rescan"
 msgstr "Rafraîchir"
 
-#: port_matrix.cc:529
-#, fuzzy
+#: port_matrix.cc:539
 msgid "Show individual ports"
 msgstr "Afficher les ports individuels"
 
-#: port_matrix.cc:535
-#, fuzzy
+#: port_matrix.cc:545
 msgid "Flip"
-msgstr "Bascule"
+msgstr "Inverser"
 
-#: port_matrix.cc:722
-#, fuzzy
-msgid ""
-"It is not possible to add a port here, as the first processor in the track "
-"or buss cannot support the new configuration."
-msgstr ""
-"Impossible d'ajouter un port, le premier traitement de la Piste ou Bus n'est "
-"pas compatible avec la nouvelle configuration."
+#: port_matrix.cc:732
+msgid "It is not possible to add a port here."
+msgstr "Impossible d'ajouter un port ici"
 
-#: port_matrix.cc:725
-#, fuzzy
+#: port_matrix.cc:733
 msgid "Cannot add port"
-msgstr "Ajout de port impossible"
+msgstr "Impossible d'ajouter un port"
+
+#: port_matrix.cc:757
+msgid "The last port cannot be removed"
+msgstr "Le dernier port ne peut pas être supprimé"
+
+#: port_matrix.cc:760
+msgid "This port cannot be removed."
+msgstr "Ce port ne peut pas être supprimé"
 
-#: port_matrix.cc:747
+#: port_matrix.cc:765
 msgid "Port removal not allowed"
 msgstr "Suppression de port non permise"
 
-#: port_matrix.cc:748
-#, fuzzy
-msgid ""
-"This port cannot be removed.\n"
-"Either the first plugin in the track or buss cannot accept\n"
-"the new number of inputs or the last plugin has more outputs."
-msgstr ""
-"Retirer ce port est impossible.\n"
-"Soit le premier plugin de la Piste (Bus) ne peut gérer le \n"
-"nouveau nombre d'entrées, soit le dernier à plus de sorties."
-
-#: port_matrix.cc:965
+#: port_matrix.cc:981
 #, c-format
 msgid "Remove '%s'"
 msgstr "Enlever '%s'"
 
-#: port_matrix.cc:980
+#: port_matrix.cc:996
 #, c-format
 msgid "%s all from '%s'"
 msgstr "Tout %s depuis '%s'"
 
-#: port_matrix.cc:1046 transform_dialog.cc:62
+#: port_matrix.cc:1062 transform_dialog.cc:62
 msgid "channel"
 msgstr "canal"
 
@@ -8928,37 +10483,34 @@ msgstr "Il n'y a aucun port à connecter."
 msgid "There are no %1 ports to connect."
 msgstr "Il n'y a aucun port %1 à connecter."
 
-#: processor_box.cc:150
-#, fuzzy
-msgid "Send"
-msgstr "Départ"
-
-#: processor_box.cc:152
+#: processor_box.cc:226
 #, fuzzy
 msgid "Return"
 msgstr "Retour"
 
-#: processor_box.cc:310
-#, fuzzy
+#: processor_box.cc:323
+msgid "New Favorite Preset for \"%1\""
+msgstr ""
+
+#: processor_box.cc:501
 msgid ""
 "\n"
 "This mono plugin has been replicated %1 times."
 msgstr ""
 "\n"
-"Ce plugin mono a été dupliqué %1 fois."
+"Ce greffon mono a été reproduit %1 fois."
 
-#: processor_box.cc:314
-#, fuzzy
+#: processor_box.cc:505 processor_box.cc:1527
 msgid ""
 "<b>%1</b>\n"
 "Double-click to show GUI.\n"
-"Alt+double-click to show generic GUI.%2"
+"%2+double-click to show generic GUI.%3"
 msgstr ""
 "<b>%1</b>\n"
 "Double-clic pour afficher l'interface.\n"
-"Alt+Double-clic pour afficher l'interface générique. %2"
+"%2 + double-clic pour afficher l'interface générique. %3"
 
-#: processor_box.cc:317
+#: processor_box.cc:508 processor_box.cc:1530
 #, fuzzy
 msgid ""
 "<b>%1</b>\n"
@@ -8967,33 +10519,43 @@ msgstr ""
 "<b>%1</b>\n"
 "Double-clic pour afficher l'interface générique. %2"
 
-#: processor_box.cc:361
+#: processor_box.cc:514
+msgid ""
+"<b>%1</b>\n"
+"The Plugin is not available on this system\n"
+"and has been replaced by a stub."
+msgstr ""
+
+#: processor_box.cc:600
 #, c-format
 msgid "(%1x1) "
-msgstr ""
+msgstr "(%1x1) "
+
+#: processor_box.cc:695
+msgid "Inline Display"
+msgstr "Affichage intégré"
 
-#: processor_box.cc:437
+#: processor_box.cc:703
 msgid "Show All Controls"
 msgstr "Afficher les contrôles"
 
-#: processor_box.cc:441
+#: processor_box.cc:707
 msgid "Hide All Controls"
 msgstr "Cacher tous les contrôles"
 
-#: processor_box.cc:475
-#, fuzzy
+#: processor_box.cc:752
 msgid "Link panner controls"
-msgstr "Lier les contrôles de pan."
+msgstr "Lier les contrôles de panoramique"
 
-#: processor_box.cc:575
+#: processor_box.cc:859
 msgid "on"
 msgstr "allumé"
 
-#: processor_box.cc:575 rc_option_editor.cc:2360 rc_option_editor.cc:2374
+#: processor_box.cc:859 rc_option_editor.cc:3178 rc_option_editor.cc:3192
 msgid "off"
-msgstr "sans"
+msgstr "éteint"
 
-#: processor_box.cc:957
+#: processor_box.cc:1817
 msgid ""
 "Right-click to add/remove/edit\n"
 "plugins,inserts,sends and more"
@@ -9001,15 +10563,22 @@ msgstr ""
 "Clic-droit pour ajouter/enlever/modifier\n"
 "greffons/départs/insertions etc."
 
-#: processor_box.cc:1429 processor_box.cc:1804
+#: processor_box.cc:1966
+msgid ""
+"Processor Drag/Drop failed. Probably because\n"
+"the I/O configuration of the plugins could\n"
+"not match the configuration of this track."
+msgstr ""
+
+#: processor_box.cc:2443 processor_box.cc:2986
 msgid "Plugin Incompatibility"
 msgstr "Incompatibilité du greffon"
 
-#: processor_box.cc:1432
+#: processor_box.cc:2446
 msgid "You attempted to add the plugin \"%1\" in slot %2.\n"
 msgstr "Vous avez essayé d'ajouter le greffon « %1 » dans l'emplacement %2.\n"
 
-#: processor_box.cc:1438
+#: processor_box.cc:2452
 msgid ""
 "\n"
 "This plugin has:\n"
@@ -9017,19 +10586,19 @@ msgstr ""
 "\n"
 "Ce greffon possède :\n"
 
-#: processor_box.cc:1441
+#: processor_box.cc:2455
 msgid "\t%1 MIDI input\n"
 msgid_plural "\t%1 MIDI inputs\n"
 msgstr[0] "\t%1 entrée MIDI\n"
 msgstr[1] "\t%1 entrées MIDI\n"
 
-#: processor_box.cc:1445
+#: processor_box.cc:2459
 msgid "\t%1 audio input\n"
 msgid_plural "\t%1 audio inputs\n"
 msgstr[0] "\t%1 entrée audio\n"
 msgstr[1] "\t%1 entrées audio\n"
 
-#: processor_box.cc:1448
+#: processor_box.cc:2462
 msgid ""
 "\n"
 "but at the insertion point, there are:\n"
@@ -9037,19 +10606,19 @@ msgstr ""
 "\n"
 "mais au point d'insertion, il y a :\n"
 
-#: processor_box.cc:1451
+#: processor_box.cc:2465
 msgid "\t%1 MIDI channel\n"
 msgid_plural "\t%1 MIDI channels\n"
 msgstr[0] "\t%1 canal MIDI\n"
 msgstr[1] "\t%1 canaux MIDI\n"
 
-#: processor_box.cc:1455
+#: processor_box.cc:2469
 msgid "\t%1 audio channel\n"
 msgid_plural "\t%1 audio channels\n"
 msgstr[0] "\t%1 canal audio\n"
 msgstr[1] "\t%1 canaux audio\n"
 
-#: processor_box.cc:1458
+#: processor_box.cc:2472
 msgid ""
 "\n"
 "%1 is unable to insert this plugin here.\n"
@@ -9057,11 +10626,7 @@ msgstr ""
 "\n"
 "%1 est incapable d'insérer ce greffon ici.\n"
 
-#: processor_box.cc:1495
-msgid "Cannot set up new send: %1"
-msgstr "Impossible de configurer le nouveau départ : %1"
-
-#: processor_box.cc:1807
+#: processor_box.cc:2989
 msgid ""
 "You cannot reorder these plugins/sends/inserts\n"
 "in that way because the inputs and\n"
@@ -9071,30 +10636,31 @@ msgstr ""
 "de cette façon, car les entrées et sorties\n"
 "ne fonctionneraient pas correctement."
 
-#: processor_box.cc:1991
+#: processor_box.cc:3189
+#, fuzzy
 msgid "Rename Processor"
 msgstr "Renommer le traitement"
 
-#: processor_box.cc:2022
+#: processor_box.cc:3220
 msgid "At least 100 IO objects exist with a name like %1 - name not changed"
 msgstr "Au moins 100 objets E/S avec un nom comme %1 - nom inchangé"
 
-#: processor_box.cc:2159
+#: processor_box.cc:3371
 #, fuzzy
 msgid "plugin insert constructor failed"
-msgstr "Impossible d'insérer ce plugin"
+msgstr "Impossible d'insérer ce greffon"
 
-#: processor_box.cc:2170
+#: processor_box.cc:3382
 msgid ""
 "Copying the set of processors on the clipboard failed,\n"
 "probably because the I/O configuration of the plugins\n"
 "could not match the configuration of this track."
 msgstr ""
 "La copie du jeu de traitements du presse-papier a échoué,\n"
-"probablement car la configuration E/S des plugins\n"
+"probablement car la configuration E/S des greffons\n"
 "ne correspond pas à la configuration de cette Piste."
 
-#: processor_box.cc:2216
+#: processor_box.cc:3428
 msgid ""
 "Do you really want to remove all processors from %1?\n"
 "(this cannot be undone)"
@@ -9102,15 +10668,15 @@ msgstr ""
 "Voulez-vous vraiment enlever tous les traitements de %1 ?\n"
 "(ceci ne pourra pas être annulé)"
 
-#: processor_box.cc:2220 processor_box.cc:2245
+#: processor_box.cc:3432 processor_box.cc:3457
 msgid "Yes, remove them all"
 msgstr "Oui, tout enlever"
 
-#: processor_box.cc:2222 processor_box.cc:2247
+#: processor_box.cc:3434 processor_box.cc:3459
 msgid "Remove processors"
 msgstr "Enlever les traitements"
 
-#: processor_box.cc:2237
+#: processor_box.cc:3449
 msgid ""
 "Do you really want to remove all pre-fader processors from %1?\n"
 "(this cannot be undone)"
@@ -9118,7 +10684,7 @@ msgstr ""
 "Voulez-vous vraiment enlever tous les traitements pré-fader de %1 ?\n"
 "(ceci ne pourra pas être annulé)"
 
-#: processor_box.cc:2240
+#: processor_box.cc:3452
 #, fuzzy
 msgid ""
 "Do you really want to remove all post-fader processors from %1?\n"
@@ -9127,60 +10693,60 @@ msgstr ""
 "Voulez vous vraiment enlever tous les traitements post-fader d'%1 ?\n"
 "(ceci ne pourra pas être annulé)"
 
-#: processor_box.cc:2428
+#: processor_box.cc:3641
 msgid "New Plugin"
 msgstr "Nouveau greffon"
 
-#: processor_box.cc:2431
+#: processor_box.cc:3644
 msgid "New Insert"
 msgstr "Nouvelle insertion"
 
-#: processor_box.cc:2434
+#: processor_box.cc:3647
 msgid "New External Send ..."
 msgstr "Nouveau départ externe…"
 
-#: processor_box.cc:2438
+#: processor_box.cc:3651
 msgid "New Aux Send ..."
 msgstr "Nouveau départ auxilliaire…"
 
-#: processor_box.cc:2441
+#: processor_box.cc:3654
 msgid "Send Options"
 msgstr "Options du départ"
 
-#: processor_box.cc:2443
+#: processor_box.cc:3656
 msgid "Clear (all)"
 msgstr "Supprimer (tout)"
 
-#: processor_box.cc:2445
+#: processor_box.cc:3658
 msgid "Clear (pre-fader)"
 msgstr "Supprimer (pré-fader)"
 
-#: processor_box.cc:2447
+#: processor_box.cc:3660
 msgid "Clear (post-fader)"
 msgstr "Supprimer (post-fader)"
 
-#: processor_box.cc:2473
+#: processor_box.cc:3690
 msgid "Activate All"
 msgstr "Activer tout"
 
-#: processor_box.cc:2475
+#: processor_box.cc:3692
 msgid "Deactivate All"
 msgstr "Tout désactiver"
 
-#: processor_box.cc:2477
+#: processor_box.cc:3694
 msgid "A/B Plugins"
 msgstr "A / B greffons"
 
-# if it's for showing the LV2 generic GUI, translation is correct !
-#: processor_box.cc:2486
+# It is for showing the LV2 generic GUI, so translation is correct.
+#: processor_box.cc:3707
 msgid "Edit with generic controls..."
 msgstr "Editer avec l'interface générique..."
 
-#: processor_box.cc:2789
+#: processor_box.cc:4039
 msgid "%1: %2 (by %3)"
 msgstr "%1 : %2 (par %3)"
 
-#: processor_box.cc:2791
+#: processor_box.cc:4041
 msgid "%1 (by %2)"
 msgstr "%1 (par %2)"
 
@@ -9211,380 +10777,479 @@ msgstr "Banque"
 msgid "main grid"
 msgstr "grille principale"
 
-#: quantize_dialog.cc:52 quantize_dialog.cc:109
+#: quantize_dialog.cc:61 quantize_dialog.cc:118
 msgid "Quantize"
 msgstr "Quantiser"
 
-#: quantize_dialog.cc:56
+#: quantize_dialog.cc:65
 #, fuzzy
 msgid "Strength"
 msgstr "Intensité"
 
-#: quantize_dialog.cc:59
+#: quantize_dialog.cc:68
 msgid "Swing"
 msgstr "Swing"
 
-#: quantize_dialog.cc:62
+#: quantize_dialog.cc:71
 msgid "Threshold (ticks)"
 msgstr "Seuil (clics)"
 
-#: quantize_dialog.cc:63
+#: quantize_dialog.cc:72
 msgid "Snap note start"
 msgstr "Aligner le début de note"
 
-#: quantize_dialog.cc:64
+#: quantize_dialog.cc:73
 msgid "Snap note end"
 msgstr "Aligner la fin de note"
 
-#: rc_option_editor.cc:77
-msgid "Click audio file:"
-msgstr "Fichier son du clic :"
-
-#: rc_option_editor.cc:80 rc_option_editor.cc:87
+#: rc_option_editor.cc:83 rc_option_editor.cc:84 rc_option_editor.cc:1550
 msgid "Browse..."
 msgstr "Parcourir…"
 
-#: rc_option_editor.cc:84
+#: rc_option_editor.cc:89
+msgid "Emphasis on first beat:"
+msgstr ""
+
+#: rc_option_editor.cc:95
+msgid "Use default Click:"
+msgstr ""
+
+#: rc_option_editor.cc:101
+msgid "Click audio file:"
+msgstr "Fichier son du clic :"
+
+#: rc_option_editor.cc:108
 msgid "Click emphasis audio file:"
 msgstr "Fichier son du clic accentué :"
 
-#: rc_option_editor.cc:116
+#: rc_option_editor.cc:154
 msgid "Choose Click"
 msgstr "Choix du clic"
 
-#: rc_option_editor.cc:139
+#: rc_option_editor.cc:177
 msgid "Choose Click Emphasis"
 msgstr "Choix du clic accentué"
 
-#: rc_option_editor.cc:170
+#: rc_option_editor.cc:238
 msgid "Limit undo history to"
 msgstr "Limiter la taille de l'historique d'annulation à"
 
-#: rc_option_editor.cc:171
+#: rc_option_editor.cc:239
 msgid "Save undo history of"
 msgstr "Sauvegarder l'historique d'annulation de"
 
-#: rc_option_editor.cc:180 rc_option_editor.cc:187
+#: rc_option_editor.cc:248 rc_option_editor.cc:255
 msgid "commands"
 msgstr "commandes"
 
-#: rc_option_editor.cc:325
+#: rc_option_editor.cc:378
+msgid ""
+"\n"
+"Changes to this setting will only persist after your project has been saved."
+msgstr ""
+
+#: rc_option_editor.cc:389 rc_option_editor.cc:451
+msgid "<b>Recommended Setting: %1 + button 3 (right mouse button)</b>%2"
+msgstr ""
+
+#: rc_option_editor.cc:403
+msgid "Select Keyboard layout:"
+msgstr ""
+
+#: rc_option_editor.cc:422
+msgid "When Clicking:"
+msgstr ""
+
+#: rc_option_editor.cc:429
 msgid "Edit using:"
 msgstr "Éditer avec :"
 
-#: rc_option_editor.cc:331 rc_option_editor.cc:357 rc_option_editor.cc:384
+#: rc_option_editor.cc:435 rc_option_editor.cc:465 rc_option_editor.cc:495
 #, fuzzy
 msgid "+ button"
 msgstr "+ bouton"
 
-#: rc_option_editor.cc:351
+#: rc_option_editor.cc:459
 msgid "Delete using:"
 msgstr "Effacer avec :"
 
-#: rc_option_editor.cc:378
+#: rc_option_editor.cc:481
+msgid "<b>Recommended Setting: %1 + button 1 (left mouse button)</b>%2"
+msgstr ""
+
+#: rc_option_editor.cc:489
 msgid "Insert note using:"
 msgstr "Insérer une note avec :"
 
-#: rc_option_editor.cc:405
-msgid "Ignore snap using:"
-msgstr "Ignorer l'alignement avec :"
-
-#: rc_option_editor.cc:421
-msgid "Keyboard layout:"
-msgstr "Agencement du clavier :"
+#: rc_option_editor.cc:507
+msgid "When Beginning a Drag:"
+msgstr ""
 
-#: rc_option_editor.cc:544
-msgid "Font scaling:"
-msgstr "Échelle des polices :"
+#: rc_option_editor.cc:518 rc_option_editor.cc:545 rc_option_editor.cc:578
+#: rc_option_editor.cc:599 rc_option_editor.cc:643 rc_option_editor.cc:676
+#: rc_option_editor.cc:702 rc_option_editor.cc:730 rc_option_editor.cc:759
+#: rc_option_editor.cc:781
+msgid "<b>Recommended Setting: %1</b>%2"
+msgstr ""
 
-#: rc_option_editor.cc:547
-#, fuzzy
-msgid "Default"
-msgstr "Par défaut"
+#: rc_option_editor.cc:532
+msgid "Copy items using:"
+msgstr ""
 
-#: rc_option_editor.cc:573
-msgid "Major font-scale changes require an application restart to re-layout."
+#: rc_option_editor.cc:559
+msgid "Constrain drag using:"
 msgstr ""
 
-#: rc_option_editor.cc:614
-msgid "Waveform Clip Level (dBFS):"
+#: rc_option_editor.cc:567
+msgid "When Beginning a Trim:"
 msgstr ""
 
-#: rc_option_editor.cc:666
-msgid "Playback (seconds of buffering):"
-msgstr "Lecture (tampon en secondes) :"
+#: rc_option_editor.cc:586
+msgid "Trim contents using:"
+msgstr ""
 
-#: rc_option_editor.cc:679
-msgid "Recording (seconds of buffering):"
-msgstr "Enregistrement (tampon en secondes) :"
+#: rc_option_editor.cc:607
+msgid "Anchored trim using:"
+msgstr ""
 
-#: rc_option_editor.cc:737
-#, fuzzy
-msgid "Control Surface Protocol"
-msgstr "Protocole de la Surface de Contrôle"
+#: rc_option_editor.cc:651
+msgid "Resize notes relatively using:"
+msgstr ""
 
-#: rc_option_editor.cc:746
-msgid "Double-click on a name to edit settings for an enabled protocol"
-msgstr "Double cliquer sur un nom pour configurer un protocole activé"
+#: rc_option_editor.cc:660
+msgid "While Dragging:"
+msgstr ""
 
-#: rc_option_editor.cc:903
-#, fuzzy
-msgid "Show Video Export Info before export"
-msgstr "Afficher les Infos d'Export Vidéo avant l'Export"
+#: rc_option_editor.cc:684
+msgid "Ignore snap using:"
+msgstr "Ignorer l'aimantation avec :"
 
-#: rc_option_editor.cc:904
-#, fuzzy
-msgid "Show Video Server Startup Dialog"
-msgstr "Options de Démarrage du Serveur Vidéo"
+#: rc_option_editor.cc:710
+msgid "Snap relatively using:"
+msgstr ""
 
-#: rc_option_editor.cc:905
-#, fuzzy
-msgid "Advanced Setup (remote video server)"
-msgstr "Options Avancées (serveur vidéo distant)"
+#: rc_option_editor.cc:718
+msgid "While Trimming:"
+msgstr ""
 
-#: rc_option_editor.cc:913
-#, fuzzy
-msgid ""
-"<b>When enabled</b> you can speficify a custom video-server URL and docroot. "
-"- Do not enable this option unless you know what you are doing."
+#: rc_option_editor.cc:738
+msgid "Resize overlapped regions using:"
 msgstr ""
-"<b>Si actif</b> vous pouvez spécifier l'URL du serveur vidéo et le "
-"répertoire racine. Activez cette option seulement si vous savez ce que vous "
-"faites !"
 
-#: rc_option_editor.cc:915
-#, fuzzy
-msgid "Video Server URL:"
-msgstr "URL du Serveur Vidéo :"
+#: rc_option_editor.cc:746
+msgid "While Dragging Control Points:"
+msgstr ""
 
-#: rc_option_editor.cc:920
-#, fuzzy
-msgid ""
-"Base URL of the video-server including http prefix. This is usually 'http://"
-"hostname.example.org:1554/' and defaults to 'http://localhost:1554/' when "
-"the video-server is running locally"
+#: rc_option_editor.cc:767
+msgid "Fine adjust using:"
 msgstr ""
-"URL du serveur vidéo, incluant un préfixe http. C'est généralement 'http://"
-"serveur.exemple.org:1554/' et par défaut 'http://localhost:1554/' quand le "
-"serveur vidéo tourne localement."
 
-#: rc_option_editor.cc:922
-#, fuzzy
-msgid "Video Folder:"
-msgstr "Répertoire Vidéo :"
+#: rc_option_editor.cc:789
+msgid "Push points using:"
+msgstr ""
 
-#: rc_option_editor.cc:927
-#, fuzzy
-msgid ""
-"Local path to the video-server document-root. Only files below this "
-"directory will be accessible by the video-server. If the server run on a "
-"remote host, it should point to a network mounted folder of the server's "
-"docroot or be left empty if it is unvailable. It is used for the local video-"
-"monitor and file-browsing when opening/adding a video file."
+#: rc_option_editor.cc:1029
+msgid "GUI and Font scaling:"
 msgstr ""
-"Chemin local vers le répertoire-racine du serveur vidéo. Seuls les fichiers "
-"de ce répertoire seront accessibles au serveur vidéo. Si le serveur tourne "
-"sur une machine distante, le chemin doit viser un répertoire réseau inclus "
-"dans le répertoire-racine et monté. Ne pas renseigner le chemin si il est "
-"indisponible. Ce chemin est utilisé pour le Monitoring vidéo local, et "
-"l'exploration lors de l'ouverture/ajout de fichiers vidéo."
 
-#: rc_option_editor.cc:934
-#, fuzzy
-msgid ""
-"<b>When enabled</b> an information window with details is displayed before "
-"the video-export dialog."
+#: rc_option_editor.cc:1032
+msgid "Default"
+msgstr "Par défaut"
+
+#: rc_option_editor.cc:1058
+msgid "Adjusting the scale requires an application restart to re-layout."
 msgstr ""
-"<b>Si actif</b> les détails de l'export vidéo seront affichés avant la boite "
-"de dialogue de l'export."
 
-#: rc_option_editor.cc:939
-#, fuzzy
-msgid ""
-"<b>When enabled</b> the video server is never launched automatically without "
-"confirmation"
+#: rc_option_editor.cc:1100
+msgid "∞"
 msgstr ""
-"<b>Si actif</b> le serveur vidéo sera toujours lancé APRES confirmation."
 
-#: rc_option_editor.cc:1022
-msgid "Always Display Plugin Scan Progress"
+#: rc_option_editor.cc:1101
+msgid "30 sec"
 msgstr ""
 
-#: rc_option_editor.cc:1023
-msgid "Scan for [new] VST Plugins on Application Start"
+#: rc_option_editor.cc:1102
+msgid "1 min"
 msgstr ""
 
-#: rc_option_editor.cc:1024
-msgid "Scan for AudioUnit Plugins on Application Start"
+#: rc_option_editor.cc:1103
+msgid "2 mins"
 msgstr ""
 
-#: rc_option_editor.cc:1035
-#, fuzzy
-msgid "General"
-msgstr "Général"
+#: rc_option_editor.cc:1104
+msgid "3 mins"
+msgstr ""
 
-#: rc_option_editor.cc:1041
-msgid "Scan for Plugins"
-msgstr "Rechercher des greffons"
+#: rc_option_editor.cc:1105
+msgid "4 mins"
+msgstr ""
 
-#: rc_option_editor.cc:1048
-msgid ""
-"<b>When enabled</b> a popup window showing plugin scan progress is displayed "
-"for indexing (cache load) and discovery (detect new plugins)"
+#: rc_option_editor.cc:1106
+msgid "5 mins"
 msgstr ""
 
-#: rc_option_editor.cc:1055
+#: rc_option_editor.cc:1109
 msgid ""
-"Specify the default timeout for plugin instantiation in 1/10 seconds. "
-"Plugins that require more time to load will be blacklisted. A value of 0 "
-"disables the timeout."
+"Specify the default timeout for plugin instantiation. Plugins that require "
+"more time to load will be blacklisted. A value of 0 disables the timeout."
+msgstr ""
+
+#: rc_option_editor.cc:1111
+msgid "Scan Time Out:"
+msgstr ""
+
+#: rc_option_editor.cc:1159
+msgid "Waveform Clip Level (dBFS):"
+msgstr "Niveau d'écrêtage des formes d'ondes (dBFS) :"
+
+#: rc_option_editor.cc:1212
+msgid "Small sessions (4-16 tracks)"
+msgstr ""
+
+#: rc_option_editor.cc:1213
+msgid "Medium sessions (16-64 tracks)"
+msgstr ""
+
+#: rc_option_editor.cc:1214
+msgid "Large sessions (64+ tracks)"
+msgstr ""
+
+#: rc_option_editor.cc:1215
+msgid "Custom (set by sliders below)"
 msgstr ""
 
-#: rc_option_editor.cc:1057
-msgid "Scan Time Out [deciseconds]"
+#: rc_option_editor.cc:1219 export_video_dialog.cc:167
+msgid "Preset:"
+msgstr "Préréglage :"
+
+#: rc_option_editor.cc:1231
+msgid "Playback (seconds of buffering):"
+msgstr "Lecture (tampon en secondes) :"
+
+#: rc_option_editor.cc:1244
+msgid "Recording (seconds of buffering):"
+msgstr "Enregistrement (tampon en secondes) :"
+
+#: rc_option_editor.cc:1322
+msgid "programming error: unknown buffering preset string, index = %1"
 msgstr ""
 
-#: rc_option_editor.cc:1065
+#: rc_option_editor.cc:1353
 #, fuzzy
-msgid "VST"
+msgid "Control Surface Protocol"
+msgstr "Protocole de la Surface de Contrôle"
+
+#: rc_option_editor.cc:1367
+msgid ""
+"Click to edit the settings for selected protocol ( it must be ENABLED "
+"first ):"
+msgstr ""
+
+#: rc_option_editor.cc:1371
+msgid "Show Protocol Settings"
 msgstr ""
-"Type d'Éditeur de plugin inconnu (note: VST non supporté dans cette version "
-"d'%1)"
 
-#: rc_option_editor.cc:1071
-msgid "Clear VST Cache"
+#: rc_option_editor.cc:1494
+msgid "Configuration"
 msgstr ""
 
-#: rc_option_editor.cc:1075
-msgid "Clear VST Blacklist"
+#: rc_option_editor.cc:1547
+msgid "Show Video Export Info before export"
+msgstr "Afficher les Infos d'Export Vidéo avant l'export"
+
+#: rc_option_editor.cc:1548
+#, fuzzy
+msgid "Show Video Server Startup Dialog"
+msgstr "Options de Démarrage du Serveur Vidéo"
+
+#: rc_option_editor.cc:1549
+#, fuzzy
+msgid "Advanced Setup (remote video server)"
+msgstr "Options Avancées (serveur vidéo distant)"
+
+#: rc_option_editor.cc:1556
+msgid "Video Server"
 msgstr ""
 
-#: rc_option_editor.cc:1083
+#: rc_option_editor.cc:1565
+#, fuzzy
 msgid ""
-"<b>When enabled</b> new VST plugins are searched, tested and added to the "
-"cache index on application start. When disabled new plugins will only be "
-"available after triggering a 'Scan' manually"
+"<b>When enabled</b> you can speficify a custom video-server URL and docroot. "
+"- Do not enable this option unless you know what you are doing."
 msgstr ""
+"<b>Si actif</b> vous pouvez spécifier l'URL du serveur vidéo et le "
+"répertoire racine. Activez cette option seulement si vous savez ce que vous "
+"faites !"
 
-#: rc_option_editor.cc:1086
-msgid "Linux VST Path:"
+#: rc_option_editor.cc:1567
+#, fuzzy
+msgid "Video Server URL:"
+msgstr "URL du Serveur Vidéo :"
+
+#: rc_option_editor.cc:1572
+#, fuzzy
+msgid ""
+"Base URL of the video-server including http prefix. This is usually 'http://"
+"hostname.example.org:1554/' and defaults to 'http://localhost:1554/' when "
+"the video-server is running locally"
 msgstr ""
+"URL du serveur vidéo, incluant un préfixe http. C'est généralement 'http://"
+"serveur.exemple.org:1554/' et par défaut 'http://localhost:1554/' quand le "
+"serveur vidéo tourne localement."
 
-#: rc_option_editor.cc:1093
-msgid "Windows VST Path:"
+#: rc_option_editor.cc:1574
+#, fuzzy
+msgid "Video Folder:"
+msgstr "Répertoire Vidéo :"
+
+#: rc_option_editor.cc:1579
+#, fuzzy
+msgid ""
+"Local path to the video-server document-root. Only files below this "
+"directory will be accessible by the video-server. If the server run on a "
+"remote host, it should point to a network mounted folder of the server's "
+"docroot or be left empty if it is unvailable. It is used for the local video-"
+"monitor and file-browsing when opening/adding a video file."
 msgstr ""
+"Chemin local vers le répertoire-racine du serveur vidéo. Seuls les fichiers "
+"contenus dans ce répertoire seront accessibles au serveur vidéo. Si le "
+"serveur tourne sur une machine distante, le chemin doit viser un répertoire "
+"réseau inclus dans le répertoire-racine et monté ou laissé vide s'il est "
+"indisponible. Ce chemin est utilisé pour le monitoring vidéo local, et "
+"l'exploration lors de l'ouverture/ajout de fichiers vidéo."
 
-#: rc_option_editor.cc:1102
-msgid "Audio Unit"
+#: rc_option_editor.cc:1584
+msgid ""
+"<b>When enabled</b> an information window with details is displayed before "
+"the video-export dialog."
 msgstr ""
+"<b>Si actif</b> une fenêtre d'informations détaillées sera affichée avant la "
+"boite de dialogue de l'export vidéo."
 
-#: rc_option_editor.cc:1111
+#: rc_option_editor.cc:1589
+#, fuzzy
 msgid ""
-"<b>When enabled</b> Audio Unit Plugins are discovered on application start. "
-"When disabled AU plugins will only be available after triggering a 'Scan' "
-"manually. The first successful scan will enable AU auto-scan, Any crash "
-"during plugin discovery will disable it."
+"<b>When enabled</b> the video server is never launched automatically without "
+"confirmation"
 msgstr ""
+"<b>Si actif</b> le serveur vidéo sera toujours lancé APRES confirmation."
 
-#: rc_option_editor.cc:1114
-msgid "Clear AU Cache"
+#: rc_option_editor.cc:1598
+msgid "Custom Path to Video Monitor (%1) - leave empty for default:"
 msgstr ""
 
-#: rc_option_editor.cc:1118
-msgid "Clear AU Blacklist"
+#: rc_option_editor.cc:1610
+msgid ""
+"Set a custom path to the Video Monitor Executable, changing this requires a "
+"restart."
 msgstr ""
 
-#: rc_option_editor.cc:1201
-msgid "Set Windows VST Search Path"
+#: rc_option_editor.cc:1661
+msgid "Set Video Monitor Executable"
 msgstr ""
 
-#: rc_option_editor.cc:1216
-msgid "Set Linux VST Search Path"
+#: rc_option_editor.cc:1734
+msgid "Column %1"
 msgstr ""
 
-#: rc_option_editor.cc:1297
+#: rc_option_editor.cc:1852
 msgid "%1 Preferences"
 msgstr "Préférences de %1"
 
-#: rc_option_editor.cc:1309
+#: rc_option_editor.cc:1874 rc_option_editor.cc:1892 rc_option_editor.cc:1895
+#: rc_option_editor.cc:1897 rc_option_editor.cc:1899 rc_option_editor.cc:1907
+#: rc_option_editor.cc:1909 rc_option_editor.cc:1917 rc_option_editor.cc:1925
+#: rc_option_editor.cc:1932 rc_option_editor.cc:1953 rc_option_editor.cc:1955
+#: rc_option_editor.cc:1964 session_option_editor.cc:342
+#: session_option_editor.cc:344 session_option_editor.cc:365
+#: session_option_editor.cc:367 session_option_editor.cc:369
+#: session_option_editor.cc:376 session_option_editor.cc:383
+#: session_option_editor.cc:387
+msgid "Misc"
+msgstr "Divers"
+
+#: rc_option_editor.cc:1874
 msgid "DSP CPU Utilization"
-msgstr "Utilisation du Processeur/Traitements"
+msgstr "Utilisation processeur par les traitements audio"
 
-#: rc_option_editor.cc:1313
+#: rc_option_editor.cc:1878
 msgid "Signal processing uses"
 msgstr "Le traitement du signal utilise"
 
-#: rc_option_editor.cc:1318
+#: rc_option_editor.cc:1883
 msgid "all but one processor"
 msgstr "tous les processeurs sauf un"
 
-#: rc_option_editor.cc:1319
+#: rc_option_editor.cc:1884
 msgid "all available processors"
 msgstr "tous les processeurs disponibles"
 
-#: rc_option_editor.cc:1322
+#: rc_option_editor.cc:1887
 msgid "%1 processors"
 msgstr "%1 processeurs"
 
-#: rc_option_editor.cc:1325
+#: rc_option_editor.cc:1890
 msgid "This setting will only take effect when %1 is restarted."
 msgstr "Cette option ne sera prise en compte qu'après un redémarrage de %1."
 
-#: rc_option_editor.cc:1330
+#: rc_option_editor.cc:1895
 msgid "Options|Undo"
 msgstr "Annuler"
 
-#: rc_option_editor.cc:1337
+#: rc_option_editor.cc:1902
 msgid "Verify removal of last capture"
 msgstr "Confirmer la destruction du dernier enregistrement"
 
-#: rc_option_editor.cc:1345
+#: rc_option_editor.cc:1907
+msgid "Session Management"
+msgstr "Gestion de la session"
+
+#: rc_option_editor.cc:1912
 msgid "Make periodic backups of the session file"
 msgstr "Faire des sauvegardes périodiques du fichier de session"
 
-#: rc_option_editor.cc:1350
-#, fuzzy
-msgid "Session Management"
-msgstr "Gestionnaire de Session"
-
-#: rc_option_editor.cc:1355
+#: rc_option_editor.cc:1920
 msgid "Always copy imported files"
 msgstr "Toujours copier les fichiers importés dans la session"
 
-#: rc_option_editor.cc:1362
+#: rc_option_editor.cc:1927
 msgid "Default folder for new sessions:"
 msgstr "Répertoire par défaut des nouvelles sessions :"
 
-#: rc_option_editor.cc:1370
+#: rc_option_editor.cc:1935
 msgid "Maximum number of recent sessions"
 msgstr "Nombre maximum de sessions récentes"
 
-#: rc_option_editor.cc:1383
+#: rc_option_editor.cc:1948
 #, fuzzy
 msgid "Click gain level"
 msgstr "Niveau du Clic "
 
-#: rc_option_editor.cc:1388 route_time_axis.cc:266 route_time_axis.cc:821
+#: rc_option_editor.cc:1953 route_time_axis.cc:277 route_time_axis.cc:831
 msgid "Automation"
 msgstr "Automation"
 
-#: rc_option_editor.cc:1393
+#: rc_option_editor.cc:1958
 msgid "Thinning factor (larger value => less data)"
 msgstr "Facteur d'espacement (plus => moins de données)"
 
-#: rc_option_editor.cc:1402
+#: rc_option_editor.cc:1967
 msgid "Automation sampling interval (milliseconds)"
 msgstr "Intervalle de prise d'automation (ms)"
 
-#: rc_option_editor.cc:1414
+#: rc_option_editor.cc:1975
+msgid "Transport Options"
+msgstr ""
+
+#: rc_option_editor.cc:1981
 msgid "Keep record-enable engaged on stop"
 msgstr "Rester en enregistrement à l'arrêt"
 
-#: rc_option_editor.cc:1423
+#: rc_option_editor.cc:1990
 msgid "Play loop is a transport mode"
-msgstr ""
+msgstr "Le bouton Boucle est un mode de lecture"
 
-#: rc_option_editor.cc:1428
+#: rc_option_editor.cc:1995
 msgid ""
 "<b>When enabled</b> the loop button does not start playback but forces "
 "playback to always play the loop\n"
@@ -9592,13 +11257,18 @@ msgid ""
 "<b>When disabled</b> the loop button starts playing the loop, but stop then "
 "cancels loop playback"
 msgstr ""
+"<b>Si actif</b>, le bouton Boucle ne démarre pas la lecture mais force la "
+"lecture à se limiter à la boucle\n"
+"\n"
+"<b>Si inactif</b>, le bouton Boucle lance la lecture de la boucle, et Stop "
+"annule la lecture en boucle"
 
-#: rc_option_editor.cc:1434
+#: rc_option_editor.cc:2001
 #, fuzzy
 msgid "Stop recording when an xrun occurs"
 msgstr "Stopper l'enregistrement si un xrun survient"
 
-#: rc_option_editor.cc:1439
+#: rc_option_editor.cc:2006
 #, fuzzy
 msgid ""
 "<b>When enabled</b> %1 will stop recording if an over- or underrun is "
@@ -9607,15 +11277,15 @@ msgstr ""
 "<b>Si actif</b> %1 stoppera l'enregistrement si le moteur Audio détecte un "
 "problème de débit (xrun)"
 
-#: rc_option_editor.cc:1445
+#: rc_option_editor.cc:2012
 msgid "Create markers where xruns occur"
 msgstr "Créer un repère lors des désynchronisations (xrun)"
 
-#: rc_option_editor.cc:1454
+#: rc_option_editor.cc:2021
 msgid "Stop at the end of the session"
 msgstr "Arrêter à la fin de la session"
 
-#: rc_option_editor.cc:1459
+#: rc_option_editor.cc:2026
 #, fuzzy
 msgid ""
 "<b>When enabled</b> if %1 is <b>not recording</b>, it will stop the "
@@ -9624,19 +11294,18 @@ msgid ""
 "<b>When disabled</b> %1 will continue to roll past the session end marker at "
 "all times"
 msgstr ""
-"<b>Si actif</b> quand %1 <b>n'enregistre pas</b>, le Transport est stoppé au "
+"<b>Si actif</b> quand %1 <b>n'enregistre pas</b>, la lecture s'arrête au "
 "repère de fin de session\n"
 "\n"
-"<b>Si inactif</b> %1 ne stoppera jamais le Transport au repère de fin de "
-"session"
+"<b>Si inactif</b> %1 continuera toujours la lecture au delà du repère de fin "
+"de session"
 
-#: rc_option_editor.cc:1467
+#: rc_option_editor.cc:2034
 #, fuzzy
 msgid "Do seamless looping (not possible when slaved to MTC, LTC etc)"
 msgstr "Boucle sans transition audible (impossible si esclave MTC, LTC, etc)"
 
-#: rc_option_editor.cc:1472
-#, fuzzy
+#: rc_option_editor.cc:2039
 msgid ""
 "<b>When enabled</b> this will loop by reading ahead and wrapping around at "
 "the loop point, preventing any need to do a transport locate at the end of "
@@ -9645,53 +11314,96 @@ msgid ""
 "<b>When disabled</b> looping is done by locating back to the start of the "
 "loop when %1 reaches the end which will often cause a small click or delay"
 msgstr ""
-"<b>Si actif</b> la lecture en boucle sera lancée entre les points de boucle, "
-"sans qu'il soit nécessaire de relocaliser le Transport à la fin de la "
-"boucle.\n"
+"<b>Si actif</b> la lecture en boucle sera anticipée et englobera le point de "
+"bouclage, sans qu'il soit nécessaire de relocaliser le transport à la fin de "
+"la boucle.\n"
 "\n"
-"<b>Si inactif</b> la boucle est réalisée en se repositionnant au début quand "
-"%1 atteint la fin, ce qui peut souvent causer un léger clic ou délai."
+"<b>Si inactif</b> la boucle est réalisée en se repositionnant au début de la "
+"boucle quand %1 atteint la fin, ce qui peut souvent causer un léger clic ou "
+"délai."
 
-#: rc_option_editor.cc:1480
+#: rc_option_editor.cc:2047
 msgid "Disable per-track record disarm while rolling"
 msgstr "Désactiver le désarmement des piste pendant l'enregistrement"
 
-#: rc_option_editor.cc:1484
-#, fuzzy
+#: rc_option_editor.cc:2051
 msgid ""
 "<b>When enabled</b> this will prevent you from accidentally stopping "
 "specific tracks recording during a take"
 msgstr ""
 "<b>Si activé<b> évitera de stopper accidentellement l'enregistrement de "
-"Pistes spécifiques pendant une prise"
+"pistes spécifiques pendant une prise"
 
-#: rc_option_editor.cc:1489
+#: rc_option_editor.cc:2056
 msgid "12dB gain reduction during fast-forward and fast-rewind"
 msgstr "-12 dB de gain pendant le déplacement rapide avant/arrière"
 
-#: rc_option_editor.cc:1493
-#, fuzzy
+#: rc_option_editor.cc:2060
 msgid ""
 "This will reduce the unpleasant increase in perceived volume that occurs "
 "when fast-forwarding or rewinding through some kinds of audio"
 msgstr ""
-"Ceci va réduire la désagréable augmentation du volume perçu lors du "
-"déplacement rapide avant/arrière dans certains types d'Audio"
+"Réduit la l'augmentation désagréable du volume perçu lors du déplacement "
+"rapide avant/arrière dans certains types d'audio"
+
+#: rc_option_editor.cc:2066
+msgid "Preroll"
+msgstr ""
+
+#: rc_option_editor.cc:2071
+msgid ""
+"The amount of preroll (in seconds) to apply when <b>Play with Preroll</b> is "
+"initiated.\n"
+"\n"
+"If <b>Follow Edits</b> is enabled, the preroll is applied to the playhead "
+"position when a region is selected or trimmed."
+msgstr ""
+
+#: rc_option_editor.cc:2073
+msgid "0 (no pre-roll)"
+msgstr ""
+
+#: rc_option_editor.cc:2074
+msgid "0.1 second"
+msgstr ""
+
+#: rc_option_editor.cc:2075
+msgid "0.25 second"
+msgstr ""
+
+#: rc_option_editor.cc:2076
+msgid "0.5 second"
+msgstr ""
+
+#: rc_option_editor.cc:2077
+msgid "1.0 second"
+msgstr ""
+
+#: rc_option_editor.cc:2078
+msgid "2.0 seconds"
+msgstr ""
+
+#: rc_option_editor.cc:2081 rc_option_editor.cc:2090 rc_option_editor.cc:2106
+#: rc_option_editor.cc:2127 rc_option_editor.cc:2145 rc_option_editor.cc:2147
+#: rc_option_editor.cc:2164 rc_option_editor.cc:2167 rc_option_editor.cc:2169
+#: rc_option_editor.cc:2197
+msgid "Transport/Sync"
+msgstr ""
 
-#: rc_option_editor.cc:1497
-msgid "Sync/Slave"
-msgstr "Synchronisé/Esclave"
+#: rc_option_editor.cc:2081
+msgid "Synchronization and Slave Options"
+msgstr ""
 
-#: rc_option_editor.cc:1501
+#: rc_option_editor.cc:2085
 msgid "External timecode source"
 msgstr "Source de « timecode » externe"
 
-#: rc_option_editor.cc:1510
+#: rc_option_editor.cc:2094
 #, fuzzy
 msgid "Match session video frame rate to external timecode"
 msgstr "Synchroniser le taux d'images/sec. de la session au timecode externe"
 
-#: rc_option_editor.cc:1516
+#: rc_option_editor.cc:2100
 #, fuzzy
 msgid ""
 "This option controls the value of the video frame rate <i>while chasing</i> "
@@ -9716,28 +11428,28 @@ msgstr ""
 "principale, l'indicateur img/sec clignotera en rouge, et %1 synchronisera "
 "les 2 sources."
 
-#: rc_option_editor.cc:1526
-msgid "Sync lock timecode to clock - Disable drift compensation."
+#: rc_option_editor.cc:2110
+msgid "Sync-lock timecode to clock (disable drift compensation)"
 msgstr ""
 
-#: rc_option_editor.cc:1532
+#: rc_option_editor.cc:2116
 msgid ""
 "<b>When enabled</b> %1 will never varispeed when slaved to external "
 "timecode. Sync Lock indicates that the selected external timecode source "
 "shares clock-sync (Black & Burst, Wordclock, etc) with the audio "
 "interface. This option disables drift compensation. The transport speed is "
-"fixed at 1.0.Varispeed LTC will be ignored and cause drift.\n"
+"fixed at 1.0. Vari-speed LTC will be ignored and cause drift.\n"
 "\n"
 "<b>When disabled</b> %1 will compensate for potential drift, regardless if "
 "the timecode sources shares clock sync."
 msgstr ""
 
-#: rc_option_editor.cc:1547
+#: rc_option_editor.cc:2131
 #, fuzzy
 msgid "Lock to 29.9700 fps instead of 30000/1001"
 msgstr "Bloquer à 29.9700 img/sec plutot que 30000/1001"
 
-#: rc_option_editor.cc:1553
+#: rc_option_editor.cc:2137
 #, fuzzy
 msgid ""
 "<b>When enabled</b> the external timecode source is assumed to use 29.97 fps "
@@ -9760,32 +11472,32 @@ msgstr ""
 "constructeurs l'utilisent -malgré son opposition aux spécifications- car "
 "utiliser 29.97 img/sec n'induit aucun décalage de Timecode.\n"
 
-#: rc_option_editor.cc:1563
+#: rc_option_editor.cc:2147
 #, fuzzy
 msgid "LTC Reader"
 msgstr "Lecteur LTC"
 
-#: rc_option_editor.cc:1567
+#: rc_option_editor.cc:2151
 #, fuzzy
 msgid "LTC incoming port"
 msgstr "Port d'entrée LTC "
 
-#: rc_option_editor.cc:1582
+#: rc_option_editor.cc:2167
 #, fuzzy
 msgid "LTC Generator"
 msgstr "Générateur LTC"
 
-#: rc_option_editor.cc:1587
+#: rc_option_editor.cc:2172
 #, fuzzy
 msgid "Enable LTC generator"
 msgstr "Activer le générateur LTC"
 
-#: rc_option_editor.cc:1594
+#: rc_option_editor.cc:2179
 #, fuzzy
 msgid "Send LTC while stopped"
 msgstr "Envoyer LTC à l'arrêt"
 
-#: rc_option_editor.cc:1600
+#: rc_option_editor.cc:2185
 msgid ""
 "<b>When enabled</b> %1 will continue to send LTC information even when the "
 "transport (playhead) is not moving"
@@ -9793,431 +11505,466 @@ msgstr ""
 "<b>Activé</b> %1 continuera à envoyer l'info LTC même quand le transport (la "
 "tête de lecture) n'est pas en mouvement"
 
-#: rc_option_editor.cc:1606
+#: rc_option_editor.cc:2191
 #, fuzzy
 msgid "LTC generator level"
 msgstr "Niveau du générateur LTC "
 
-#: rc_option_editor.cc:1610
-#, fuzzy
+#: rc_option_editor.cc:2195
 msgid ""
-"Specify the Peak Volume of the generated LTC signal in dbFS. A good value "
-"is  0dBu ^= -18dbFS in an EBU calibrated system"
+"Specify the Peak Volume of the generated LTC signal in dBFS. A good value "
+"is  0dBu ^= -18dBFS in an EBU calibrated system"
 msgstr ""
-"Spécifie le volume de pic du signal LTC généré en dB FS. Dans un système "
-"étalonné en EBU (UER), une bonne valeur est : 0dBu >= -18 dB FS"
+"Spécifie le volume de crête du signal LTC généré en dB FS. Dans un système "
+"étalonné en EBU (UER), une bonne valeur est : 0dBu >= -18 dB FS"
 
-#: rc_option_editor.cc:1622
-msgid "Allow dragging of playhead"
+#: rc_option_editor.cc:2204
+msgid "Make rubberband selection rectangle snap to the grid"
+msgstr "Aimanter la sélection élastique à la grille"
+
+#: rc_option_editor.cc:2211
+msgid "Name new markers"
+msgstr "Nommer les nouveaux repères"
+
+#: rc_option_editor.cc:2216
+msgid ""
+"If enabled, popup a dialog when a new marker is created to allow its name to "
+"be set as it is created.\n"
+"\n"
+"You can always rename markers by right-clicking on them"
 msgstr ""
+"Si actif, demander un nom à la création de tout nouveau repère.\n"
+"Vous pouvez toujours renommer les repères par clic-droit"
 
-#: rc_option_editor.cc:1630
-msgid "Move relevant automation when audio regions are moved"
+#: rc_option_editor.cc:2222
+msgid "Allow dragging of playhead"
+msgstr "Autoriser l'entraînement de la tête de lecture"
+
+#: rc_option_editor.cc:2230
+msgid "Display master-meter in the toolbar"
+msgstr "Vu-mètre master affiché dans la barre d'outils"
+
+#: rc_option_editor.cc:2239
+msgid "Show zoom toolbar (if torn off)"
 msgstr ""
-"Déplacer les automations appropriées lors du déplacement des regions audio"
 
-#: rc_option_editor.cc:1638
-msgid "Show meters on tracks in the editor"
-msgstr "Bargraphe de la Piste affiché dans l'Éditeur"
+#: rc_option_editor.cc:2247
+msgid ""
+"Always use mouse cursor position as zoom focus when zooming using mouse "
+"scroll wheel"
+msgstr ""
 
-#: rc_option_editor.cc:1646
+#: rc_option_editor.cc:2256
 #, fuzzy
-msgid "Display master-meter in the toolbar"
-msgstr "Bargraphe du Master affiché dans la barre d'outils"
+msgid "Update editor window during drags of the summary"
+msgstr ""
+"Mettre à jour l'affichage de la fenêtre de l'Éditeur pendant le cliqué-"
+"glissé du résumé"
+
+#: rc_option_editor.cc:2264
+msgid "Auto-scroll editor window when dragging near its edges"
+msgstr ""
+"Défilement automatique de l'éditeur pendant un cliquer-glisser près de ses "
+"bords"
+
+#: rc_option_editor.cc:2272
+msgid "Show gain envelopes in audio regions"
+msgstr "Afficher les enveloppes de gain dans les régions audio "
+
+#: rc_option_editor.cc:2273
+msgid "in all modes"
+msgstr "dans tous les modes"
+
+#: rc_option_editor.cc:2274
+msgid "only in Draw and Internal Edit modes"
+msgstr ""
 
-#: rc_option_editor.cc:1653
+#: rc_option_editor.cc:2279
+msgid "Editor Behavior"
+msgstr ""
+
+#: rc_option_editor.cc:2284
+msgid "Move relevant automation when audio regions are moved"
+msgstr ""
+"Déplacer les automations appropriées lors du déplacement des regions audio"
+
+#: rc_option_editor.cc:2291
 #, fuzzy
 msgid "Default fade shape"
 msgstr "définir la forme du fade-out"
 
-#: rc_option_editor.cc:1672
+#: rc_option_editor.cc:2310
 msgid "Regions in active edit groups are edited together"
 msgstr "Les Régions en groupes d'édition actifs sont modifiées ensemble "
 
-#: rc_option_editor.cc:1673
+#: rc_option_editor.cc:2311
 msgid "whenever they overlap in time"
 msgstr "si elles se chevauchent"
 
-#: rc_option_editor.cc:1674
+#: rc_option_editor.cc:2312
 msgid "only if they have identical length, position and origin"
 msgstr "seulement si durée, position et origine sont identiques"
 
-#: rc_option_editor.cc:1684
-#, fuzzy
-msgid "Make rubberband selection rectangle snap to the grid"
-msgstr "Le rectangle de sélection élastique \"colle\" à la grille"
+#: rc_option_editor.cc:2321
+msgid "Layering model"
+msgstr ""
 
-#: rc_option_editor.cc:1692
-msgid "Show waveforms in regions"
-msgstr "Afficher l'enveloppe sonore dans les régions"
+#: rc_option_editor.cc:2326
+msgid "later is higher"
+msgstr ""
 
-#: rc_option_editor.cc:1700
-#, fuzzy
-msgid "Show gain envelopes in audio regions"
-msgstr "Afficher les enveloppes de gain des Régions Audio "
+#: rc_option_editor.cc:2327
+msgid "manual layering"
+msgstr ""
 
-#: rc_option_editor.cc:1701
-msgid "in all modes"
-msgstr "dans tous les modes"
+#: rc_option_editor.cc:2332
+msgid "After splitting selected regions, select"
+msgstr "Après la découpe de régions sélectionnées, sélectionner"
+
+#: rc_option_editor.cc:2337
+msgid "no regions"
+msgstr "aucune région"
+
+#: rc_option_editor.cc:2340
+msgid "newly-created regions"
+msgstr "les régions nouvellement créées"
+
+#: rc_option_editor.cc:2344
+msgid "existing selection and newly-created regions"
+msgstr "la sélection en cours et les régions nouvellement créées"
+
+#: rc_option_editor.cc:2348 rc_option_editor.cc:2351 rc_option_editor.cc:2360
+#: rc_option_editor.cc:2378 rc_option_editor.cc:2390 rc_option_editor.cc:2392
+msgid "Editor/Waveforms"
+msgstr ""
+
+#: rc_option_editor.cc:2348
+msgid "Waveforms"
+msgstr ""
+
+#: rc_option_editor.cc:2354
+msgid "Show waveforms in regions"
+msgstr "Afficher l'enveloppe sonore dans les régions"
 
-#: rc_option_editor.cc:1702
-msgid "only in region gain mode"
-msgstr "seulement en mode gain de Région"
+#: rc_option_editor.cc:2363
+msgid "Show waveforms for audio while it is being recorded"
+msgstr "Afficher l'enveloppe Audio pendant son enregistrement"
 
-#: rc_option_editor.cc:1709
+#: rc_option_editor.cc:2370
 msgid "Waveform scale"
 msgstr "Échelle de l'enveloppe "
 
-#: rc_option_editor.cc:1714
+#: rc_option_editor.cc:2375
 msgid "linear"
 msgstr "linéaire"
 
-#: rc_option_editor.cc:1715
+#: rc_option_editor.cc:2376
 msgid "logarithmic"
 msgstr "logarithmique"
 
-#: rc_option_editor.cc:1721
+#: rc_option_editor.cc:2382
 msgid "Waveform shape"
 msgstr "Forme de l'enveloppe "
 
-#: rc_option_editor.cc:1726
+#: rc_option_editor.cc:2387
 msgid "traditional"
 msgstr "traditionnelle"
 
-#: rc_option_editor.cc:1727
+#: rc_option_editor.cc:2388
 msgid "rectified"
 msgstr "redressée"
 
-#: rc_option_editor.cc:1736
-msgid "Show waveforms for audio while it is being recorded"
-msgstr "Afficher l'enveloppe Audio pendant son enregistrement"
+#: rc_option_editor.cc:2397
+msgid "Buffering"
+msgstr "Mise en tampon"
 
-#: rc_option_editor.cc:1744
-msgid "Show zoom toolbar"
-msgstr "Afficher la barre d'outil Zoom"
+#: rc_option_editor.cc:2405
+msgid "Record monitoring handled by"
+msgstr "Monitoring de l'enregistrement géré par"
 
-#: rc_option_editor.cc:1752
-#, fuzzy
-msgid "Update editor window during drags of the summary"
-msgstr ""
-"Mettre à jour l'affichage de la fenêtre de l'Éditeur pendant le cliqué-"
-"glissé du résumé"
-
-#: rc_option_editor.cc:1760
-msgid "Synchronise editor and mixer selection"
-msgstr "Sélection des pistes identique entre éditeur et mixage"
-
-#: rc_option_editor.cc:1767
-msgid "Name new markers"
-msgstr "Nommer les nouveaux repères"
-
-#: rc_option_editor.cc:1773
-msgid ""
-"If enabled, popup a dialog when a new marker is created to allow its name to "
-"be set as it is created.\n"
-"\n"
-"You can always rename markers by right-clicking on them"
-msgstr ""
-"Si actif, demander un nom à la création de tout nouveau repère.\n"
-"Vous pouvez toujours renommer les repères par clic-droit"
-
-#: rc_option_editor.cc:1779
-msgid "Auto-scroll editor window when dragging near its edges"
-msgstr ""
-"Défilement automatique de l'éditeur pendant un cliquer-glisser près de ses "
-"bords"
-
-#: rc_option_editor.cc:1786
-msgid "After splitting selected regions, select"
-msgstr ""
-
-#: rc_option_editor.cc:1791
-#, fuzzy
-msgid "no regions"
-msgstr "Régions"
-
-#: rc_option_editor.cc:1794
-msgid "newly-created regions"
-msgstr ""
-
-#: rc_option_editor.cc:1798
-msgid "existing selection and newly-created regions"
-msgstr ""
-
-#: rc_option_editor.cc:1805
-msgid "Buffering"
-msgstr "Mise en tampon"
-
-#: rc_option_editor.cc:1813
-msgid "Record monitoring handled by"
-msgstr "Monitoring de l'enregistrement géré par"
-
-#: rc_option_editor.cc:1819
+#: rc_option_editor.cc:2411
 #, fuzzy
 msgid "via Audio Driver"
 msgstr "via le pilote Audio"
 
-#: rc_option_editor.cc:1825
+#: rc_option_editor.cc:2417
 msgid "audio hardware"
-msgstr "le matériel audio"
+msgstr "matériel audio"
 
-#: rc_option_editor.cc:1832
+#: rc_option_editor.cc:2424
 msgid "Tape machine mode"
 msgstr "Mode magnétophone"
 
-#: rc_option_editor.cc:1837
+#: rc_option_editor.cc:2429
 msgid "Connection of tracks and busses"
 msgstr "Connexion des pistes et bus"
 
-#: rc_option_editor.cc:1842
+#: rc_option_editor.cc:2435
 msgid "Auto-connect master/monitor busses"
 msgstr "Connexion automatique du bus général et des bus de monitoring"
 
-#: rc_option_editor.cc:1849
+#: rc_option_editor.cc:2442
 msgid "Connect track inputs"
 msgstr "Connecter les entrées des pistes"
 
-#: rc_option_editor.cc:1854
+#: rc_option_editor.cc:2447
 msgid "automatically to physical inputs"
 msgstr "automatiquement aux entrées matérielles"
 
-#: rc_option_editor.cc:1855 rc_option_editor.cc:1868
+#: rc_option_editor.cc:2448 rc_option_editor.cc:2461
 msgid "manually"
 msgstr "manuellement"
 
-#: rc_option_editor.cc:1861
+#: rc_option_editor.cc:2454
 msgid "Connect track and bus outputs"
 msgstr "Connecter les sorties des pistes et des bus"
 
-#: rc_option_editor.cc:1866
+#: rc_option_editor.cc:2459
 msgid "automatically to physical outputs"
 msgstr "automatiquement aux sorties matérielles"
 
-#: rc_option_editor.cc:1867
+#: rc_option_editor.cc:2460
 msgid "automatically to master bus"
 msgstr "automatiquement au bus général"
 
-#: rc_option_editor.cc:1872
+#: rc_option_editor.cc:2467
+msgid "Use 'Strict-I/O' for new tracks or Busses"
+msgstr "Utiliser les E/S strictes pour les nouveaux bus et pistes"
+
+#: rc_option_editor.cc:2478
 #, fuzzy
 msgid "Denormals"
 msgstr "Dénormalisations"
 
-#: rc_option_editor.cc:1877
+#: rc_option_editor.cc:2483
 #, fuzzy
 msgid "Use DC bias to protect against denormals"
 msgstr "Utiliser un courant polarisé pour éviter les dénormalisations"
 
-#: rc_option_editor.cc:1884
+#: rc_option_editor.cc:2490
 msgid "Processor handling"
 msgstr "Gestion du traitement"
 
-#: rc_option_editor.cc:1890
+#: rc_option_editor.cc:2496
 msgid "no processor handling"
 msgstr "pas de gestion du traitement"
 
-#: rc_option_editor.cc:1896
+#: rc_option_editor.cc:2502
 #, fuzzy
 msgid "use FlushToZero"
 msgstr "mettre à zéro (les valeurs inférieures au plus petit détail)"
 
-#: rc_option_editor.cc:1903
+#: rc_option_editor.cc:2509
 msgid "use DenormalsAreZero"
 msgstr "Utiliser DenormalsAreZero"
 
-#: rc_option_editor.cc:1910
+#: rc_option_editor.cc:2516
 #, fuzzy
 msgid "use FlushToZero and DenormalsAreZero"
 msgstr ""
 "mettre à zéro (les valeurs inférieures au plus petit détail ou dénormalisées)"
 
-#: rc_option_editor.cc:1926
-#, fuzzy
-msgid "Silence plugins when the transport is stopped"
-msgstr "Plugins silencieux à l'arrêt"
-
-#: rc_option_editor.cc:1934
-msgid "Make new plugins active"
-msgstr "Activer les nouveaux greffons"
-
-#: rc_option_editor.cc:1944
+#: rc_option_editor.cc:2532
 msgid "Enable automatic analysis of audio"
 msgstr "Activer l'analyse automatique de l'audio"
 
-#: rc_option_editor.cc:1952
+#: rc_option_editor.cc:2540
 msgid "Replicate missing region channels"
 msgstr "Dupliquer les canaux manquants dans la région"
 
-#: rc_option_editor.cc:1959 rc_option_editor.cc:1961 rc_option_editor.cc:1976
-#: rc_option_editor.cc:1988 rc_option_editor.cc:2000 rc_option_editor.cc:2012
-#: rc_option_editor.cc:2016 rc_option_editor.cc:2024 rc_option_editor.cc:2032
-#: rc_option_editor.cc:2040 rc_option_editor.cc:2042 rc_option_editor.cc:2050
-#: rc_option_editor.cc:2058 rc_option_editor.cc:2066 rc_option_editor.cc:2074
-#: rc_option_editor.cc:2076
-msgid "Solo / mute"
-msgstr "Solo / muet"
-
-#: rc_option_editor.cc:1964
-#, fuzzy
-msgid "Solo-in-place mute cut (dB)"
-msgstr "Diminution (en dB) des Pistes NON solo-en-place "
+#: rc_option_editor.cc:2547 rc_option_editor.cc:2556 rc_option_editor.cc:2558
+#: rc_option_editor.cc:2566 rc_option_editor.cc:2574 rc_option_editor.cc:2582
+#: rc_option_editor.cc:2600 rc_option_editor.cc:2612 rc_option_editor.cc:2624
+#: rc_option_editor.cc:2626 rc_option_editor.cc:2628 rc_option_editor.cc:2636
+#: rc_option_editor.cc:2644 rc_option_editor.cc:2652 rc_option_editor.cc:2662
+#: rc_option_editor.cc:2663
+msgid "Solo & mute"
+msgstr ""
 
-#: rc_option_editor.cc:1971
+#: rc_option_editor.cc:2551
 #, fuzzy
 msgid "Solo controls are Listen controls"
 msgstr "Les contrôles de solos sont des contrôles d'écoute"
 
-#: rc_option_editor.cc:1980
+#: rc_option_editor.cc:2561
+msgid "Exclusive solo"
+msgstr "Solo exclusif"
+
+#: rc_option_editor.cc:2569
+msgid "Show solo muting"
+msgstr "Afficher les sourdines de solo"
+
+#: rc_option_editor.cc:2577
+msgid "Soloing overrides muting"
+msgstr "Solo surplante Muet"
+
+#: rc_option_editor.cc:2585
+#, fuzzy
+msgid "Solo-in-place mute cut (dB)"
+msgstr "Diminution (en dB) des Pistes NON solo-en-place "
+
+#: rc_option_editor.cc:2592
 #, fuzzy
 msgid "Listen Position"
 msgstr "Position d'écoute "
 
-#: rc_option_editor.cc:1985
+#: rc_option_editor.cc:2597
 #, fuzzy
 msgid "after-fader (AFL)"
 msgstr "post-fader (AFL)"
 
-#: rc_option_editor.cc:1986
+#: rc_option_editor.cc:2598
 #, fuzzy
 msgid "pre-fader (PFL)"
 msgstr "pré-fader (PFL)"
 
-#: rc_option_editor.cc:1992
+#: rc_option_editor.cc:2604
 msgid "PFL signals come from"
 msgstr "Les signaux PFL sont prélevés"
 
-#: rc_option_editor.cc:1997
+#: rc_option_editor.cc:2609
 msgid "before pre-fader processors"
 msgstr "avant les traitements pré-fader"
 
-#: rc_option_editor.cc:1998
+#: rc_option_editor.cc:2610
 msgid "pre-fader but after pre-fader processors"
 msgstr "après les traitements pré-fader"
 
-#: rc_option_editor.cc:2004
+#: rc_option_editor.cc:2616
 msgid "AFL signals come from"
 msgstr "Les signaux AFL sont prélevés "
 
-#: rc_option_editor.cc:2009
+#: rc_option_editor.cc:2621
 msgid "immediately post-fader"
 msgstr "immédiatement post-fader"
 
-#: rc_option_editor.cc:2010
+#: rc_option_editor.cc:2622
 msgid "after post-fader processors (before pan)"
 msgstr "après les traitements post-fader (avant panoramique)"
 
-#: rc_option_editor.cc:2019
-msgid "Exclusive solo"
-msgstr "Solo exclusif"
-
-#: rc_option_editor.cc:2027
-msgid "Show solo muting"
-msgstr "Afficher les sourdines de solo"
-
-#: rc_option_editor.cc:2035
-msgid "Soloing overrides muting"
-msgstr "Solo surplante Muet"
-
-#: rc_option_editor.cc:2040
+#: rc_option_editor.cc:2626
 msgid "Default track / bus muting options"
 msgstr "Options de silencieux par défaut des pistes/bus"
 
-#: rc_option_editor.cc:2045
+#: rc_option_editor.cc:2631
 msgid "Mute affects pre-fader sends"
 msgstr "Muet affecte les départs pré-fader"
 
-#: rc_option_editor.cc:2053
+#: rc_option_editor.cc:2639
 msgid "Mute affects post-fader sends"
 msgstr "Muet affecte les départs post-fader"
 
-#: rc_option_editor.cc:2061
+#: rc_option_editor.cc:2647
 msgid "Mute affects control outputs"
 msgstr "Muet affecte les sorties de contrôle"
 
-#: rc_option_editor.cc:2069
+#: rc_option_editor.cc:2655
 msgid "Mute affects main outputs"
 msgstr "Muet affecte les sorties principales"
 
-#: rc_option_editor.cc:2074
+#: rc_option_editor.cc:2662
 #, fuzzy
 msgid "Send Routing"
 msgstr "Routine des départs"
 
-#: rc_option_editor.cc:2079
+#: rc_option_editor.cc:2666
 #, fuzzy
 msgid "Link panners of Aux and External Sends with main panner by default"
 msgstr ""
 "Lier par défaut les panoramiques de départs auxiliaires et extérieurs au "
 "panoramique de la Piste (du Bus)"
 
-#: rc_option_editor.cc:2087
+#: rc_option_editor.cc:2672
+msgid "MIDI Preferences"
+msgstr ""
+
+#: rc_option_editor.cc:2677
 msgid "MIDI read-ahead time (seconds)"
+msgstr "Temps d'avance sur lecture du MIDI (secondes)"
+
+#: rc_option_editor.cc:2687
+#, fuzzy
+msgid "Initial program change"
+msgstr "Modifier le programme initial (IPC) "
+
+#: rc_option_editor.cc:2696
+msgid "Display first MIDI bank/program as 0"
+msgstr "Afficher le premier programme/banque MIDI comme 0"
+
+#: rc_option_editor.cc:2704
+msgid "Never display periodic MIDI messages (MTC, MIDI Clock)"
+msgstr "Ne jamais afficher les messages MIDI périodiques (MTC, MIDI Clock)"
+
+#: rc_option_editor.cc:2712
+msgid "Sound MIDI notes as they are selected in the editor"
+msgstr "Jouer les notes MIDI lorsqu'elles sont sélectionnées dans l'éditeur"
+
+#: rc_option_editor.cc:2720
+#, fuzzy
+msgid "Send MIDI control feedback"
+msgstr "Envoyer les retours d'infos de contrôle MIDI"
+
+#: rc_option_editor.cc:2725 rc_option_editor.cc:2727 rc_option_editor.cc:2735
+#: rc_option_editor.cc:2737 rc_option_editor.cc:2745 rc_option_editor.cc:2754
+#: rc_option_editor.cc:2756 rc_option_editor.cc:2764 rc_option_editor.cc:2772
+#: rc_option_editor.cc:2781
+msgid "MIDI/Sync"
+msgstr ""
+
+#: rc_option_editor.cc:2725
+msgid "MIDI Clock"
 msgstr ""
 
-#: rc_option_editor.cc:2105
+#: rc_option_editor.cc:2735
+msgid "MIDI Time Code (MTC)"
+msgstr ""
+
+#: rc_option_editor.cc:2740
 msgid "Send MIDI Time Code"
 msgstr "Envoyer MTC (Midi Time Code)"
 
-#: rc_option_editor.cc:2113
+#: rc_option_editor.cc:2748
 #, fuzzy
 msgid "Percentage either side of normal transport speed to transmit MTC"
 msgstr ""
 "Pourcentage +/- de la vitesse normale du Transport à transmettre en MTC "
 "(CTM) "
 
-#: rc_option_editor.cc:2122
+#: rc_option_editor.cc:2754
+msgid "Midi Machine Control (MMC)"
+msgstr ""
+
+#: rc_option_editor.cc:2759
 msgid "Obey MIDI Machine Control commands"
 msgstr "Obéir aux commandes MMC (MIDI Machine Control)"
 
-#: rc_option_editor.cc:2130
+#: rc_option_editor.cc:2767
 msgid "Send MIDI Machine Control commands"
 msgstr "Envoyer les commandes MMC (MIDI Machine Control)"
 
-#: rc_option_editor.cc:2138
-#, fuzzy
-msgid "Send MIDI control feedback"
-msgstr "Envoyer les retours d'infos de contrôle MIDI"
-
-#: rc_option_editor.cc:2146
+#: rc_option_editor.cc:2775
 msgid "Inbound MMC device ID"
 msgstr "identifiant de l'appareil MMC en entrée"
 
-#: rc_option_editor.cc:2155
+#: rc_option_editor.cc:2784
 msgid "Outbound MMC device ID"
 msgstr "identifiant de l'appareil MMC en sortie"
 
-#: rc_option_editor.cc:2164
-#, fuzzy
-msgid "Initial program change"
-msgstr "Modifier le programme initial (IPC) "
-
-#: rc_option_editor.cc:2173
-msgid "Display first MIDI bank/program as 0"
-msgstr "Afficher le premier programme/banque MIDI comme 0"
-
-#: rc_option_editor.cc:2181
-msgid "Never display periodic MIDI messages (MTC, MIDI Clock)"
-msgstr "Ne jamais afficher les messages MIDI périodiques (MTC, MIDI Clock)"
-
-#: rc_option_editor.cc:2189
-#, fuzzy
-msgid "Sound MIDI notes as they are selected"
-msgstr "Jouer les notes MIDI à leur sélection"
-
-#: rc_option_editor.cc:2194
+#: rc_option_editor.cc:2790
 #, fuzzy
 msgid "Midi Audition"
 msgstr "Ecoute MIDI"
 
-#: rc_option_editor.cc:2198
+#: rc_option_editor.cc:2794
 #, fuzzy
 msgid "Midi Audition Synth (LV2)"
 msgstr "Synthé d'écoute MIDI (LV2) "
 
-#: rc_option_editor.cc:2229 rc_option_editor.cc:2239 rc_option_editor.cc:2241
+#: rc_option_editor.cc:2825 rc_option_editor.cc:2835 rc_option_editor.cc:2837
 msgid "User interaction"
 msgstr "Interaction utilisateur"
 
-#: rc_option_editor.cc:2232
+#: rc_option_editor.cc:2828
 #, fuzzy
 msgid ""
 "Use translations of %1 messages\n"
@@ -10228,277 +11975,507 @@ msgstr ""
 "   <i>(actif après un redémarrage d'%1)</i>\n"
 "   <i>(si disponible pour vos préférences de langue)</i>"
 
-#: rc_option_editor.cc:2239
+#: rc_option_editor.cc:2835
 msgid "Keyboard"
 msgstr "Clavier"
 
-#: rc_option_editor.cc:2249
-msgid "Control surface remote ID"
-msgstr "Identifiant de la surface de contrôle distante "
+#: rc_option_editor.cc:2848 startup.cc:352
+msgid "Scan for Plugins"
+msgstr "Rechercher des greffons"
+
+#: rc_option_editor.cc:2853
+#, fuzzy
+msgid "General"
+msgstr "Général"
+
+#: rc_option_editor.cc:2858
+msgid "Always Display Plugin Scan Progress"
+msgstr "Toujours afficher la progression de la recherche de greffons"
+
+#: rc_option_editor.cc:2864
+msgid ""
+"<b>When enabled</b> a popup window showing plugin scan progress is displayed "
+"for indexing (cache load) and discovery (detect new plugins)"
+msgstr ""
+"<b>Si actif</b>, une fenêtre pop-up montre la progression de la recherche de "
+"nouveaux greffons et de leur indexation."
+
+#: rc_option_editor.cc:2869
+#, fuzzy
+msgid "Silence plugins when the transport is stopped"
+msgstr "Greffons silencieux à l'arrêt"
+
+#: rc_option_editor.cc:2875
+msgid ""
+"<b>When enabled</b> plugins will be reset at transport stop. When disabled "
+"plugins will be left unchanged at transport stop.\n"
+"\n"
+"This mostly affects plugins with a \"tail\" like Reverbs."
+msgstr ""
+
+#: rc_option_editor.cc:2879
+msgid "Make new plugins active"
+msgstr "Activer les nouveaux greffons"
+
+#: rc_option_editor.cc:2885
+msgid ""
+"<b>When enabled</b> plugins will be activated when they are added to tracks/"
+"busses. When disabled plugins will be left inactive when they are added to "
+"tracks/busses"
+msgstr ""
+
+#: rc_option_editor.cc:2888 rc_option_editor.cc:2896 rc_option_editor.cc:2908
+#: rc_option_editor.cc:2913 rc_option_editor.cc:2915 rc_option_editor.cc:2920
+#: rc_option_editor.cc:2927 rc_option_editor.cc:2932 rc_option_editor.cc:2941
+msgid "Plugins/VST"
+msgstr ""
+
+#: rc_option_editor.cc:2888
+msgid "VST"
+msgstr "VST"
+
+#: rc_option_editor.cc:2892
+msgid "Scan for [new] VST Plugins on Application Start"
+msgstr "Rechercher les nouveaux greffons VST au démarrage de l'application"
+
+#: rc_option_editor.cc:2898
+msgid ""
+"<b>When enabled</b> new VST plugins are searched, tested and added to the "
+"cache index on application start. When disabled new plugins will only be "
+"available after triggering a 'Scan' manually"
+msgstr ""
+"<b>Si actif</b> les nouveaux greffons VST sont recherchés, testés et ajoutés "
+"à la liste au démarrage de l'application. Si inactif, les nouveaux greffons "
+"ne seront disponibles qu'après un déclenchement manuel de recherche"
+
+#: rc_option_editor.cc:2904
+msgid "Verbose Plugin Scan"
+msgstr ""
+
+#: rc_option_editor.cc:2910
+msgid ""
+"<b>When enabled</b> additional information for every plugin is added to the "
+"Log Window."
+msgstr ""
+
+#: rc_option_editor.cc:2918
+msgid "VST Cache:"
+msgstr ""
+
+#: rc_option_editor.cc:2923
+msgid "VST Blacklist:"
+msgstr ""
+
+#: rc_option_editor.cc:2930
+msgid "Linux VST Path:"
+msgstr "Dossier Linux VST :"
+
+#: rc_option_editor.cc:2935 rc_option_editor.cc:2948
+msgid "Path:"
+msgstr ""
+
+#: rc_option_editor.cc:2944
+msgid "Windows VST Path:"
+msgstr "Dossier Windows VST :"
+
+#: rc_option_editor.cc:2954 rc_option_editor.cc:2966 rc_option_editor.cc:2971
+msgid "Plugins/Audio Unit"
+msgstr ""
+
+#: rc_option_editor.cc:2954
+msgid "Audio Unit"
+msgstr "Audio Unit"
+
+#: rc_option_editor.cc:2958
+msgid "Scan for AudioUnit Plugins on Application Start"
+msgstr ""
+"Rechercher les nouveaux greffons AudioUnit au démarrage de l'application"
+
+#: rc_option_editor.cc:2964
+msgid ""
+"<b>When enabled</b> Audio Unit Plugins are discovered on application start. "
+"When disabled AU plugins will only be available after triggering a 'Scan' "
+"manually. The first successful scan will enable AU auto-scan, Any crash "
+"during plugin discovery will disable it."
+msgstr ""
+"<b>Si actif</b> les nouveaux greffons AudioUnit sont recherchés au démarrage "
+"de l'application. Si inactif, les nouveaux greffons ne seront disponibles "
+"qu'après un déclenchement manuel de recherche. La première recherche réussie "
+"active le scan automatique des AU, tandis qu'un crash pendant la recherche "
+"le désactive."
+
+#: rc_option_editor.cc:2969
+msgid "AU Cache:"
+msgstr ""
+
+#: rc_option_editor.cc:2974
+msgid "AU Blacklist:"
+msgstr ""
 
-#: rc_option_editor.cc:2254
-msgid "assigned by user"
-msgstr "assigné manuellement"
+#: rc_option_editor.cc:2978
+msgid "Plugin GUI"
+msgstr ""
+
+#: rc_option_editor.cc:2982
+msgid "Automatically open the plugin GUI when adding a new plugin"
+msgstr ""
+
+#: rc_option_editor.cc:2991
+msgid "Show Plugin Inline Display on Mixerstrip by default"
+msgstr ""
+
+#: rc_option_editor.cc:2998
+msgid ""
+"Don't automatically open the plugin GUI when the plugin has an inline "
+"display mode"
+msgstr ""
+
+#: rc_option_editor.cc:3005
+msgid "Instrument"
+msgstr ""
+
+#: rc_option_editor.cc:3009
+msgid "Ask to replace existing instrument plugin"
+msgstr ""
+
+#: rc_option_editor.cc:3017
+msgid "Interactively configure instrument plugins on insert"
+msgstr ""
+
+#: rc_option_editor.cc:3023
+msgid ""
+"<b>When enabled</b> show a dialog to select instrument channel configuration "
+"before adding a multichannel plugin."
+msgstr ""
+
+#: rc_option_editor.cc:3032
+msgid "Disable Graphics Hardware Acceleration (requires restart)"
+msgstr ""
 
-#: rc_option_editor.cc:2255
-msgid "follows order of mixer"
-msgstr "suit l'ordonnancement de la Console"
+#: rc_option_editor.cc:3038
+msgid ""
+"Render large parts of the application user-interface in software, instead of "
+"using 2D-graphics acceleration.\n"
+"This requires restarting %1 before having an effect"
+msgstr ""
 
-#: rc_option_editor.cc:2269 rc_option_editor.cc:2278 rc_option_editor.cc:2287
-#: rc_option_editor.cc:2297 rc_option_editor.cc:2321 rc_option_editor.cc:2334
-#: rc_option_editor.cc:2343
+#: rc_option_editor.cc:3039 rc_option_editor.cc:3051 rc_option_editor.cc:3054
+#: rc_option_editor.cc:3062 rc_option_editor.cc:3070 rc_option_editor.cc:3078
+#: rc_option_editor.cc:3086 rc_option_editor.cc:3097 rc_option_editor.cc:3113
+#: rc_option_editor.cc:3129 rc_option_editor.cc:3144 rc_option_editor.cc:3153
+#: rc_option_editor.cc:3161
 msgid "Preferences|GUI"
 msgstr "Interface graphique"
 
-# widget is not translated else than "gadget" in french. have choosen the french word for "tool"
-#: rc_option_editor.cc:2272
-#, fuzzy
+#: rc_option_editor.cc:3045
+msgid "Possibly improve slow graphical performance (requires restart)"
+msgstr ""
+
+#: rc_option_editor.cc:3050
+msgid ""
+"Disables hardware gradient rendering on buggy video drivers (\"buggy "
+"gradients patch\").\n"
+"This requires restarting %1 before having an effect"
+msgstr ""
+
+#: rc_option_editor.cc:3057
+msgid "Use Window Manager/Desktop visibility information"
+msgstr ""
+
+#: rc_option_editor.cc:3065
 msgid "Graphically indicate mouse pointer hovering over various widgets"
 msgstr ""
-"Changer l'aspect du pointeur lors du survol des différents outils par la "
-"souris"
+"Mettre en valeur visuellement certains contrôles lorsqu'ils sont survolés "
+"par la souris"
 
-#: rc_option_editor.cc:2281
+#: rc_option_editor.cc:3073
 msgid "Show tooltips if mouse hovers over a control"
-msgstr "Afficher des infobulles quand la souris survole une contrôle"
+msgstr "Afficher des infobulles quand la souris survole un contrôle"
 
-#: rc_option_editor.cc:2290
+#: rc_option_editor.cc:3081
 msgid "Use name highlight bars in region displays (requires a restart)"
 msgstr ""
+"Afficher des barres de noms dans l'affichage des régions (nécessite un "
+"redémarrage)"
 
-#: rc_option_editor.cc:2303
-msgid "update transport clock display at FPS instead of every 100ms"
+#: rc_option_editor.cc:3089
+msgid "Update transport clock display at FPS instead of every 100ms"
 msgstr ""
 
-#: rc_option_editor.cc:2312
-msgid "Lock timeout (seconds)"
+#: rc_option_editor.cc:3104
+msgid "Waveform image cache size (megabytes)"
 msgstr ""
 
-#: rc_option_editor.cc:2320
+#: rc_option_editor.cc:3112
+msgid ""
+"Increasing the cache size uses more memory to store waveform images, which "
+"can improve graphical performance."
+msgstr ""
+
+#: rc_option_editor.cc:3120
+msgid "Lock timeout (seconds)"
+msgstr "Délai de temporisation du verrouillage (secondes)"
+
+#: rc_option_editor.cc:3128
 msgid "Lock GUI after this many idle seconds (zero to never lock)"
 msgstr ""
+"Verrouille l'interface graphique après ce nombre de secondes (zéro pour ne "
+"jamais vérouiller)"
 
-#: rc_option_editor.cc:2336
+#: rc_option_editor.cc:3146
 #, fuzzy
 msgid "Mixer Strip"
 msgstr "Tranche de Console"
 
-#: rc_option_editor.cc:2346
+#: rc_option_editor.cc:3156
 msgid "Use narrow strips in the mixer by default"
 msgstr "Utiliser des tranches de console étroites par défaut"
 
-#: rc_option_editor.cc:2351 rc_option_editor.cc:2365 rc_option_editor.cc:2384
-#: rc_option_editor.cc:2400 rc_option_editor.cc:2416 rc_option_editor.cc:2430
-#: rc_option_editor.cc:2444 rc_option_editor.cc:2446
+#: rc_option_editor.cc:3163
+msgid "Action Script Button Visibility"
+msgstr ""
+
+#: rc_option_editor.cc:3169 rc_option_editor.cc:3183 rc_option_editor.cc:3200
+#: rc_option_editor.cc:3216 rc_option_editor.cc:3232 rc_option_editor.cc:3246
+#: rc_option_editor.cc:3272 rc_option_editor.cc:3290 rc_option_editor.cc:3301
+#: rc_option_editor.cc:3308 rc_option_editor.cc:3310 rc_option_editor.cc:3318
+#: rc_option_editor.cc:3320 rc_option_editor.cc:3328 rc_option_editor.cc:3336
+#: rc_option_editor.cc:3338
 msgid "Preferences|Metering"
 msgstr "Mesure"
 
-#: rc_option_editor.cc:2355
+#: rc_option_editor.cc:3173
 #, fuzzy
 msgid "Peak hold time"
 msgstr "Durée de maintien du pic "
 
-#: rc_option_editor.cc:2361
+#: rc_option_editor.cc:3179
 msgid "short"
 msgstr "court"
 
-#: rc_option_editor.cc:2362
+#: rc_option_editor.cc:3180
 #, fuzzy
 msgid "medium"
 msgstr "moyen"
 
-#: rc_option_editor.cc:2363
+#: rc_option_editor.cc:3181
 msgid "long"
 msgstr "long"
 
-#: rc_option_editor.cc:2369
+#: rc_option_editor.cc:3187
 #, fuzzy
 msgid "DPM fall-off"
 msgstr "Chute du pic "
 
-#: rc_option_editor.cc:2375
+#: rc_option_editor.cc:3193
 #, fuzzy
 msgid "slowest [6.6dB/sec]"
 msgstr "le plus lent [6.6dB/sec]"
 
-#: rc_option_editor.cc:2376
+#: rc_option_editor.cc:3194
 #, fuzzy
 msgid "slow [8.6dB/sec] (BBC PPM, EBU PPM)"
 msgstr "lent [8.6dB/sec] (BBC PPM, EBU PPM)"
 
-#: rc_option_editor.cc:2377
-#, fuzzy
-msgid "slowish [12.0dB/sec] (DIN)"
-msgstr "moins lent [12.0dB/sec] (DIN)"
-
-#: rc_option_editor.cc:2378
-#, fuzzy
-msgid "moderate [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"
-msgstr "modéré [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"
-
-#: rc_option_editor.cc:2379
-#, fuzzy
-msgid "medium [20dB/sec]"
-msgstr "moyen [20dB/sec]"
+#: rc_option_editor.cc:3195
+msgid "moderate [12.0dB/sec] (DIN)"
+msgstr ""
 
-#: rc_option_editor.cc:2380
-#, fuzzy
-msgid "fast [32dB/sec]"
-msgstr "rapide [32dB/sec]"
+#: rc_option_editor.cc:3196
+msgid "medium [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"
+msgstr ""
 
-#: rc_option_editor.cc:2381
-#, fuzzy
-msgid "faster [46dB/sec]"
-msgstr "plus rapide [46dB/sec]"
+#: rc_option_editor.cc:3197
+msgid "fast [20dB/sec]"
+msgstr ""
 
-#: rc_option_editor.cc:2382
-#, fuzzy
-msgid "fastest [70dB/sec]"
-msgstr "le plus rapide [70dB/sec]"
+#: rc_option_editor.cc:3198
+msgid "very fast [32dB/sec]"
+msgstr ""
 
-#: rc_option_editor.cc:2388
+#: rc_option_editor.cc:3204
 #, fuzzy
 msgid "Meter line-up level; 0dBu"
 msgstr "Niveau ligne, 0 dBu "
 
-#: rc_option_editor.cc:2393 rc_option_editor.cc:2409
+#: rc_option_editor.cc:3209 rc_option_editor.cc:3225
 msgid "-24dBFS (SMPTE US: 4dBu = -20dBFS)"
-msgstr ""
+msgstr "-24dBFS (SMPTE US: 4dBu = -20dBFS)"
 
-#: rc_option_editor.cc:2394 rc_option_editor.cc:2410
+#: rc_option_editor.cc:3210 rc_option_editor.cc:3226
 msgid "-20dBFS (SMPTE RP.0155)"
-msgstr ""
+msgstr "-20dBFS (SMPTE RP.0155)"
 
-#: rc_option_editor.cc:2395 rc_option_editor.cc:2411
+#: rc_option_editor.cc:3211 rc_option_editor.cc:3227
 msgid "-18dBFS (EBU, BBC)"
-msgstr ""
+msgstr "-18dBFS (EBU, BBC)"
 
-#: rc_option_editor.cc:2396 rc_option_editor.cc:2412
+#: rc_option_editor.cc:3212 rc_option_editor.cc:3228
 msgid "-15dBFS (DIN)"
-msgstr ""
+msgstr "-15dBFS (DIN)"
 
-#: rc_option_editor.cc:2398
-#, fuzzy
+#: rc_option_editor.cc:3214
 msgid ""
 "Configure meter-marks and color-knee point for dBFS scale DPM, set reference "
 "level for IEC1/Nordic, IEC2 PPM and VU meter."
 msgstr ""
-"Configurer les bargraphes : zones de changement de couleur (échelle dB FS) "
-"et niveaux de réference des différents types de modulomètre."
+"Configurer les échelle et zones de changement de couleur pour le modulomètre "
+"dBFS, et le niveau de référence pour les modulomètres IEC1/Nordic, IEC2 PPM "
+"et VU-mètre."
 
-#: rc_option_editor.cc:2404
+#: rc_option_editor.cc:3220
 #, fuzzy
 msgid "IEC1/DIN Meter line-up level; 0dBu"
 msgstr "Niveau ligne IEC1/DIN, 0 dBu "
 
-#: rc_option_editor.cc:2414
+#: rc_option_editor.cc:3230
 #, fuzzy
 msgid "Reference level for IEC1/DIN meter."
 msgstr "Niveau de référence des bargraphes IEC1/DIN."
 
-#: rc_option_editor.cc:2420
+#: rc_option_editor.cc:3236
 #, fuzzy
 msgid "VU Meter standard"
 msgstr "VU-Mètre standard "
 
-#: rc_option_editor.cc:2425
+#: rc_option_editor.cc:3241
 msgid "0VU = -2dBu (France)"
-msgstr ""
+msgstr "0VU = -2dBu (France)"
 
-#: rc_option_editor.cc:2426
-#, fuzzy
+#: rc_option_editor.cc:3242
 msgid "0VU = 0dBu (North America, Australia)"
-msgstr "0VU = 0dBu (Amerique du Nord, Australie)"
+msgstr "0VU = 0dBu (Amérique du Nord, Australie)"
 
-#: rc_option_editor.cc:2427
-#, fuzzy
+#: rc_option_editor.cc:3243
 msgid "0VU = +4dBu (standard)"
-msgstr "0VU = 0dBu (Amerique du Nord, Australie)"
+msgstr "0VU = +4dBu (standard)"
 
-#: rc_option_editor.cc:2428
+#: rc_option_editor.cc:3244
 msgid "0VU = +8dBu"
-msgstr ""
+msgstr "0VU = +8dBu"
 
-#: rc_option_editor.cc:2434
+#: rc_option_editor.cc:3250
 #, fuzzy
 msgid "Peak threshold [dBFS]"
 msgstr "Seuil du pic [dB FS] "
 
-#: rc_option_editor.cc:2442
+#: rc_option_editor.cc:3259
+msgid "Default Meter Type for Master Bus"
+msgstr ""
+
+#: rc_option_editor.cc:3277
+msgid "Default Meter Type for Busses"
+msgstr ""
+
+#: rc_option_editor.cc:3294
+msgid "Default Meter Type for Tracks"
+msgstr ""
+
+#: rc_option_editor.cc:3306
 #, fuzzy
 msgid ""
-"Specify the audio signal level in dbFS at and above which the meter-peak "
+"Specify the audio signal level in dBFS at and above which the meter-peak "
 "indicator will flash red."
 msgstr ""
 "Spécifie le niveau du signal Audio (en dB FS) à partir duquel l'indicateur "
 "de pic clignote en rouge."
 
-#: rc_option_editor.cc:2449
-#, fuzzy
+#: rc_option_editor.cc:3313
 msgid "LED meter style"
-msgstr "Affichage en mode LED"
+msgstr "Style d'afficheur LED"
 
-#: rc_option_editor.cc:2457
-#, fuzzy
+#: rc_option_editor.cc:3318
+msgid "Editor Meters"
+msgstr ""
+
+#: rc_option_editor.cc:3323
+msgid "Show meters on tracks in the editor"
+msgstr "Bargraphe de la Piste affiché dans l'Éditeur"
+
+#: rc_option_editor.cc:3331
+msgid "Show at most stereo meters in the track-header"
+msgstr ""
+
+#: rc_option_editor.cc:3336
+msgid "Post Export Analysis"
+msgstr ""
+
+#: rc_option_editor.cc:3341
+msgid "Save loudness analysis as image file"
+msgstr ""
+
+#: rc_option_editor.cc:3349
 msgid "Theme"
-msgstr "Modèles de Thème"
+msgstr "Thème"
+
+#: rc_option_editor.cc:3351
+msgid "Theme/Colors"
+msgstr "Couleurs"
+
+#: rc_option_editor.cc:3429
+msgid "Set Linux VST Search Path"
+msgstr "Indique le dossier de recherche des VST Linus"
 
-#: region_editor.cc:79
+#: rc_option_editor.cc:3443
+msgid "Set Windows VST Search Path"
+msgstr "Indique le dossier de recherche des VST Windows"
+
+#: region_editor.cc:81
 msgid "audition this region"
 msgstr "écouter cette région"
 
-#: region_editor.cc:88 region_layering_order_editor.cc:75
+#: region_editor.cc:90 region_layering_order_editor.cc:75
 msgid "Position:"
 msgstr "Position :"
 
-#: region_editor.cc:90 add_video_dialog.cc:155
+#: region_editor.cc:92 add_video_dialog.cc:155
 msgid "End:"
 msgstr "Fin :"
 
-#: region_editor.cc:92 sfdb_ui.cc:145
+#: region_editor.cc:94 sfdb_ui.cc:145
 msgid "Length:"
 msgstr "Durée :"
 
-#: region_editor.cc:94
+#: region_editor.cc:96
 #, fuzzy
 msgid "Sync point (relative to region):"
-msgstr "Point de synchro (relatif/Région) :"
+msgstr "Point de synchro (relatif/Région) :"
 
-#: region_editor.cc:96
+#: region_editor.cc:98
 #, fuzzy
 msgid "Sync point (absolute):"
-msgstr "Point de synchro (absolu) :"
+msgstr "Point de synchro (absolu) :"
 
-#: region_editor.cc:98
+#: region_editor.cc:100
 #, fuzzy
 msgid "File start:"
-msgstr "Début du fichier :"
+msgstr "Début du fichier :"
 
-#: region_editor.cc:102
+#: region_editor.cc:104
 msgid "Sources:"
 msgstr "Sources :"
 
-#: region_editor.cc:104
+#: region_editor.cc:106
 msgid "Source:"
 msgstr "Source :"
 
-#: region_editor.cc:166
+#: region_editor.cc:168
 msgid "Region '%1'"
 msgstr "Région '%1'"
 
-#: region_editor.cc:273
+#: region_editor.cc:279
 msgid "change region start position"
 msgstr "changer le début de la région"
 
-#: region_editor.cc:289
+#: region_editor.cc:299
 msgid "change region end position"
 msgstr "changer la fin de la région"
 
-#: region_editor.cc:309
+#: region_editor.cc:322
 msgid "change region length"
 msgstr "changer la longueur de la région"
 
-#: region_editor.cc:403 region_editor.cc:415
+#: region_editor.cc:416 region_editor.cc:428
 #, fuzzy
 msgid "change region sync point"
 msgstr "Modifier le point de synchro de la Région"
@@ -10524,35 +12501,35 @@ msgstr "Choisir la Région audible"
 
 # not sure why no space between the words, or if it doesn't need to be translate ?
 # PLUS, translation says "hide the text"
-#: region_view.cc:277
+#: region_view.cc:271
 #, fuzzy
 msgid "SilenceText"
 msgstr "CacherLeTexte"
 
-#: region_view.cc:292 region_view.cc:311
+#: region_view.cc:286 region_view.cc:305
 msgid "minutes"
 msgstr "minutes"
 
-#: region_view.cc:295 region_view.cc:314
+#: region_view.cc:289 region_view.cc:308
 msgid "msecs"
 msgstr "ms"
 
-#: region_view.cc:298 region_view.cc:317
+#: region_view.cc:292 region_view.cc:311
 msgid "secs"
 msgstr "secondes"
 
-#: region_view.cc:301
+#: region_view.cc:295
 msgid "%1 silent segment"
 msgid_plural "%1 silent segments"
 msgstr[0] "%1 segment silencieux"
 msgstr[1] "%1 segments silencieux"
 
-#: region_view.cc:303
+#: region_view.cc:297
 #, fuzzy
 msgid "shortest = %1 %2"
 msgstr "le plus court = %1 %2"
 
-#: region_view.cc:320
+#: region_view.cc:314
 #, fuzzy
 msgid ""
 "\n"
@@ -10574,14 +12551,12 @@ msgid "Note Onset"
 msgstr "Début de note"
 
 #: rhythm_ferret.cc:54
-#, fuzzy
 msgid "Energy Based"
-msgstr "Basé sur l'Amplitude du Signal"
+msgstr "Basé sur l'énergie"
 
 #: rhythm_ferret.cc:55
-#, fuzzy
 msgid "Spectral Difference"
-msgstr "Différence Spectrale"
+msgstr "Différence spectrale"
 
 #: rhythm_ferret.cc:56
 #, fuzzy
@@ -10590,10 +12565,9 @@ msgstr "Contenu Hautes Fréquences"
 
 #: rhythm_ferret.cc:57
 msgid "Complex Domain"
-msgstr ""
+msgstr "Domaine complexe"
 
 #: rhythm_ferret.cc:58
-#, fuzzy
 msgid "Phase Deviation"
 msgstr "Déviation de Phase"
 
@@ -10607,55 +12581,63 @@ msgstr "Kullback-Liebler"
 msgid "Modified Kullback-Liebler"
 msgstr "Kullback-Liebler modifié"
 
-#: rhythm_ferret.cc:65
+#: rhythm_ferret.cc:62
+msgid "Spectral Flux"
+msgstr ""
+
+#: rhythm_ferret.cc:68
 msgid "Split region"
 msgstr "Scinder la région"
 
-#: rhythm_ferret.cc:66
+#: rhythm_ferret.cc:70
 msgid "Snap regions"
 msgstr "Aligner régions"
 
-#: rhythm_ferret.cc:67
+#: rhythm_ferret.cc:71
 msgid "Conform regions"
 msgstr "Conformer les régions au tempo"
 
-#: rhythm_ferret.cc:72
+#: rhythm_ferret.cc:77
 msgid "Rhythm Ferret"
 msgstr "Fureteur de rythme"
 
-#: rhythm_ferret.cc:78
+#: rhythm_ferret.cc:83
 msgid "Analyze"
 msgstr "Analyser"
 
-#: rhythm_ferret.cc:113
+#: rhythm_ferret.cc:122
 msgid "Detection function"
 msgstr "Fonction de détection"
 
-#: rhythm_ferret.cc:117
-msgid "Trigger gap"
-msgstr "Écart déclenchant"
-
-#: rhythm_ferret.cc:122 strip_silence_dialog.cc:64
-msgid "Threshold"
-msgstr "Seuil"
+#: rhythm_ferret.cc:126
+msgid "Trigger gap (postproc)"
+msgstr ""
 
-#: rhythm_ferret.cc:127
+#: rhythm_ferret.cc:131
 msgid "Peak threshold"
 msgstr "Seuil de pic"
 
-#: rhythm_ferret.cc:132
+#: rhythm_ferret.cc:135
 msgid "Silence threshold"
 msgstr "Seuil de silence"
 
-#: rhythm_ferret.cc:137
+#: rhythm_ferret.cc:141
+msgid "Min Inter-Onset Time"
+msgstr ""
+
+#: rhythm_ferret.cc:148
 msgid "Sensitivity"
 msgstr "Sensibilité"
 
-#: rhythm_ferret.cc:141
+#: rhythm_ferret.cc:152
+msgid "Cut Pos Threshold"
+msgstr ""
+
+#: rhythm_ferret.cc:157
 msgid "Operation"
 msgstr "Opération"
 
-#: rhythm_ferret.cc:355
+#: rhythm_ferret.cc:382
 msgid "split regions (rhythm ferret)"
 msgstr "scinder les régions (fureteur de rythme)"
 
@@ -10675,28 +12657,24 @@ msgstr "Muet"
 msgid "Record enable"
 msgstr "Armement"
 
-# translation assumes that this chain is for a popup to explain that button under mouse is the active state (it could also been a command to active some state and in this case we better translate "activer")
+# This string is for the New Group Dialog and is one of the properties that can be shared among the group.
 #: route_group_dialog.cc:52
 msgid "Active state"
 msgstr "État actif"
 
-#: route_group_dialog.cc:53 route_group_dialog.cc:82 theme_manager.cc:90
-msgid "Color"
-msgstr "Couleur"
-
 # not sure why no space between the words, or if it doesn't need to be translate ?
-#: route_group_dialog.cc:59
+#: route_group_dialog.cc:58
 #, fuzzy
 msgid "RouteGroupDialog"
 msgstr "RoutineDesGroupes"
 
-#: route_group_dialog.cc:100
+#: route_group_dialog.cc:99
 msgid "<b>Sharing</b>"
 msgstr "<b>Partage</b>"
 
-#: route_group_dialog.cc:200
+#: route_group_dialog.cc:192
 msgid "The group name is not unique. Please use a different name."
-msgstr ""
+msgstr "Le nom du groupe existe déjà. Choisissez un autre nom."
 
 #: route_params_ui.cc:84
 msgid "Tracks/Busses"
@@ -10714,352 +12692,325 @@ msgstr "Sorties"
 msgid "Plugins, Inserts & Sends"
 msgstr "Greffons, départs et retours"
 
-#: route_params_ui.cc:209
+#: route_params_ui.cc:201
 msgid "route display list item for renamed route not found!"
 msgstr ""
 "élément de liste d'affichage de route pour la route renommée introuvable !"
 
-#: route_params_ui.cc:279 route_params_ui.cc:307
+#: route_params_ui.cc:271 route_params_ui.cc:299
 #, c-format
 msgid "Playback delay: %<PRId64> samples"
 msgstr "Retard de lecture : %<PRId64> échantillons"
 
-#: route_params_ui.cc:499
+#: route_params_ui.cc:491
 msgid "NO TRACK"
 msgstr "PAS DE PISTE"
 
-#: route_params_ui.cc:637 route_params_ui.cc:638
+#: route_params_ui.cc:515
+msgid "Add Track or Bus"
+msgstr "Ajouter une piste ou un bus"
+
+#: route_params_ui.cc:627 route_params_ui.cc:628
 msgid "No Track or Bus Selected"
 msgstr "Aucune piste ou bus sélectionné"
 
-#: route_time_axis.cc:181
+#: route_time_axis.cc:104
+msgid "RTAV|G"
+msgstr ""
+
+#: route_time_axis.cc:105
+msgid "RTAV|P"
+msgstr ""
+
+#: route_time_axis.cc:106
+msgid "RTAV|A"
+msgstr ""
+
+#: route_time_axis.cc:194
 #, fuzzy
 msgid "Record (Right-click for Step Edit)"
 msgstr "Enregistrement (clic droit: pas-à-pas)"
 
-#: route_time_axis.cc:184
+#: route_time_axis.cc:197
 msgid "Record"
 msgstr "Enregistrement"
 
-#: route_time_axis.cc:254
+#: route_time_axis.cc:265
 msgid "Route Group"
 msgstr "Groupe"
 
-#: route_time_axis.cc:264
-#, fuzzy
+#: route_time_axis.cc:275
 msgid "MIDI Controllers and Automation"
-msgstr "Automation et Controleurs MIDI"
+msgstr "Automation et contrôleurs MIDI"
 
-#: route_time_axis.cc:495
+#: route_time_axis.cc:510
 msgid "Show All Automation"
 msgstr "Afficher toute l'automation"
 
-#: route_time_axis.cc:498
+#: route_time_axis.cc:513
 msgid "Show Existing Automation"
 msgstr "Afficher l'automation existante"
 
-#: route_time_axis.cc:501
+#: route_time_axis.cc:516
 msgid "Hide All Automation"
 msgstr "Cacher toute l'automation"
 
-#: route_time_axis.cc:510
+#: route_time_axis.cc:525
 #, fuzzy
 msgid "Processor automation"
 msgstr "Automation du traitement"
 
-#: route_time_axis.cc:517
+#: route_time_axis.cc:532
 msgid "Fader"
 msgstr "Atténuateur"
 
-#: route_time_axis.cc:535
+#: route_time_axis.cc:559
 msgid "Pan"
 msgstr "Panoramique"
 
-#: route_time_axis.cc:626
+#: route_time_axis.cc:643
 msgid "Overlaid"
 msgstr "Recouvertes"
 
-#: route_time_axis.cc:632
+#: route_time_axis.cc:649
 msgid "Stacked"
 msgstr "Empilées"
 
-#: route_time_axis.cc:640
+#: route_time_axis.cc:657
 msgid "Layers"
 msgstr "Couches"
 
-#: route_time_axis.cc:709
+#: route_time_axis.cc:721
 msgid "Automatic (based on I/O connections)"
 msgstr "Automatique (à partir des connections d'E / S)"
 
-#: route_time_axis.cc:718
+#: route_time_axis.cc:730
 msgid "(Currently: Existing Material)"
 msgstr "(Actuellement : matériaux existant)"
 
-#: route_time_axis.cc:721
+#: route_time_axis.cc:733
 msgid "(Currently: Capture Time)"
 msgstr "(Actuellement : horodatage d'enregistrement)"
 
-#: route_time_axis.cc:729
+#: route_time_axis.cc:741
 msgid "Align With Existing Material"
 msgstr "Aligner avec le matériaux existant"
 
-#: route_time_axis.cc:734
+#: route_time_axis.cc:746
 msgid "Align With Capture Time"
 msgstr "Aligner avec l'horodatage d'enregistrement"
 
-#: route_time_axis.cc:739
+#: route_time_axis.cc:751
 msgid "Alignment"
 msgstr "Alignement"
 
-#: route_time_axis.cc:774
+#: route_time_axis.cc:786
 msgid "Normal Mode"
 msgstr "Mode normal"
 
-#: route_time_axis.cc:780
+#: route_time_axis.cc:792
 msgid "Tape Mode"
 msgstr "Mode Magnéto"
 
-#: route_time_axis.cc:786
+#: route_time_axis.cc:798
 msgid "Non-Layered Mode"
 msgstr "Mode sans empilement"
 
-#: route_time_axis.cc:792
+#: route_time_axis.cc:804
 msgid "Record Mode"
-msgstr ""
+msgstr "Mode enregistrement"
 
-#: route_time_axis.cc:799 route_time_axis.cc:1789
+#: route_time_axis.cc:809 route_time_axis.cc:1795
 msgid "Playlist"
 msgstr "Liste de lecture"
 
-#: route_time_axis.cc:1097
+#: route_time_axis.cc:1107
 msgid "Rename Playlist"
 msgstr "Renommer la liste de lecture"
 
-#: route_time_axis.cc:1098
+#: route_time_axis.cc:1108
 msgid "New name for playlist:"
 msgstr "Nouveau nom de la liste de lecture :"
 
-#: route_time_axis.cc:1183
+#: route_time_axis.cc:1193
 msgid "New Copy Playlist"
 msgstr "Nouvelle copie de la liste de lecture"
 
-#: route_time_axis.cc:1184 route_time_axis.cc:1237
+#: route_time_axis.cc:1194 route_time_axis.cc:1247
 msgid "Name for new playlist:"
 msgstr "Nom de la nouvelle liste de lecture :"
 
-#: route_time_axis.cc:1236
+#: route_time_axis.cc:1246
 msgid "New Playlist"
 msgstr "Nouvelle liste de lecture"
 
-#: route_time_axis.cc:1436
-msgid "You cannot create a track with that name as it is reserved for %1"
-msgstr "Vous ne pouvez pas créer une piste avec ce nom, il est réservé pour %1"
+#: route_time_axis.cc:1441
+msgid "The name \"%1\" is reserved for %2"
+msgstr ""
 
-#: route_time_axis.cc:1678
+#: route_time_axis.cc:1684
 msgid "New Copy..."
 msgstr "Nouvelle copie…"
 
-#: route_time_axis.cc:1682
+#: route_time_axis.cc:1688
 msgid "New Take"
 msgstr "Nouvelle prise"
 
-#: route_time_axis.cc:1683
+#: route_time_axis.cc:1689
 msgid "Copy Take"
 msgstr "Copier la prise"
 
-#: route_time_axis.cc:1688
+#: route_time_axis.cc:1694
 msgid "Clear Current"
 msgstr "Effacer actuelle"
 
-#: route_time_axis.cc:1691
-msgid "Select From All..."
-msgstr "Choisir depuis toutes…"
+#: route_time_axis.cc:1697
+msgid "Select from All..."
+msgstr ""
 
-#: route_time_axis.cc:1779
+#: route_time_axis.cc:1785
 msgid "Take: %1.%2"
 msgstr "Prise : %1.%2"
 
-#: route_time_axis.cc:2169 selection.cc:1007 selection.cc:1061
+#: route_time_axis.cc:2190 selection.cc:1042 selection.cc:1096
 msgid "programming error: "
 msgstr "erreur de programmation: "
 
-#: route_time_axis.cc:2585
+#: route_time_axis.cc:2614
 msgid "Underlays"
 msgstr "Sous-couches"
 
-#: route_time_axis.cc:2588
+#: route_time_axis.cc:2617
 msgid "Remove \"%1\""
 msgstr "Supprimer « %1 »"
 
-#: route_time_axis.cc:2638 route_time_axis.cc:2675
+#: route_time_axis.cc:2667 route_time_axis.cc:2704
 #, fuzzy
 msgid "programming error: underlay reference pointer pairs are inconsistent!"
 msgstr "programming error: underlay reference pointer pairs are inconsistent!"
 
-#: route_time_axis.cc:2702
-#, fuzzy
+#: route_time_axis.cc:2731 vca_master_strip.cc:203 vca_time_axis.cc:228
 msgid "After-fade listen (AFL)"
-msgstr "Ecoute Après Fader (AFL)"
+msgstr "Écoute Après Fader (AFL)"
 
-#: route_time_axis.cc:2706
+#: route_time_axis.cc:2735 vca_master_strip.cc:207 vca_time_axis.cc:232
 #, fuzzy
 msgid "Pre-fade listen (PFL)"
 msgstr "Ecoute Pré Fader (PFL)"
 
-#: route_ui.cc:140
+#: route_ui.cc:165
 msgid "Mute this track"
 msgstr "Rendre la piste muette"
 
-#: route_ui.cc:144
+#: route_ui.cc:169
 msgid "Mute other (non-soloed) tracks"
 msgstr "Rendre les autres pistes (non-solo) muettes"
 
-#: route_ui.cc:150
+#: route_ui.cc:175
 msgid "Enable recording on this track"
 msgstr "Armer l'enregistrement sur cette piste"
 
-#: route_ui.cc:158
+#: route_ui.cc:183
 #, fuzzy
 msgid "make mixer strips show sends to this bus"
 msgstr ""
 "Les tranches de Console montrent les départs vers ce Bus (au lieu de leur "
 "fader)"
 
-#: route_ui.cc:163
+#: route_ui.cc:188
 msgid "Monitor input"
 msgstr "Écoute d'entrée"
 
-#: route_ui.cc:169
+#: route_ui.cc:194
 msgid "Monitor playback"
 msgstr "Écoute de lecture"
 
-#: route_ui.cc:676
+#: route_ui.cc:706
 msgid "Not connected to AudioEngine - cannot engage record"
-msgstr ""
+msgstr "Non connecté au moteur audio - impossible d'activer l'enregistrement"
+
+#: route_ui.cc:883
+msgid "Rec-Safe"
+msgstr "Protégé contre l'enregistrement"
 
-#: route_ui.cc:875
+#: route_ui.cc:888
 #, fuzzy
 msgid "Step Entry"
 msgstr "Pas-à-pas"
 
-#: route_ui.cc:948
-#, fuzzy
+#: route_ui.cc:987
 msgid "Assign all tracks (prefader)"
-msgstr "Assigner toutes les Pistes (pré-fader)"
+msgstr "Assigner toutes les pistes (pré-fader)"
 
-#: route_ui.cc:952
-#, fuzzy
+#: route_ui.cc:991
 msgid "Assign all tracks and buses (prefader)"
-msgstr "Assigner toutes les Pistes et Bus (pré-fader)"
+msgstr "Assigner toutes les pistes et bus (pré-fader)"
 
-#: route_ui.cc:956
-#, fuzzy
+#: route_ui.cc:995
 msgid "Assign all tracks (postfader)"
-msgstr "Assigner toutes les Pistes (post-fader)"
+msgstr "Assigner toutes les pistes (post-fader)"
 
-#: route_ui.cc:960
-#, fuzzy
+#: route_ui.cc:999
 msgid "Assign all tracks and buses (postfader)"
-msgstr "Assigner toutes les Pistes et Bus (post-fader)"
+msgstr "Assigner toutes les pistes et bus (post-fader)"
 
-#: route_ui.cc:964
-#, fuzzy
+#: route_ui.cc:1003
 msgid "Assign selected tracks (prefader)"
-msgstr "Assigner les Pistes sélectionnées (pré-fader)"
+msgstr "Assigner les pistes sélectionnées (pré-fader)"
 
-#: route_ui.cc:968
-#, fuzzy
+#: route_ui.cc:1007
 msgid "Assign selected tracks and buses (prefader)"
-msgstr "Assigner les Pistes et Bus sélectionnés (pré-fader)"
+msgstr "Assigner les pistes et bus sélectionnés (pré-fader)"
 
-#: route_ui.cc:971
-#, fuzzy
+#: route_ui.cc:1010
 msgid "Assign selected tracks (postfader)"
-msgstr "Assigner les Pistes sélectionnées (post-fader)"
+msgstr "Assigner les pistes sélectionnées (post-fader)"
 
-#: route_ui.cc:975
-#, fuzzy
+#: route_ui.cc:1014
 msgid "Assign selected tracks and buses (postfader)"
-msgstr "Assigner les Pistes et Bus sélectionnés (post-fader)"
+msgstr "Assigner les pistes et bus sélectionnés (post-fader)"
 
-#: route_ui.cc:978
-#, fuzzy
+#: route_ui.cc:1017
 msgid "Copy track/bus gains to sends"
-msgstr "Assigner le gain de Piste/Bus aux départs"
+msgstr "Appliquer le gain de piste/bus aux départs"
 
-#: route_ui.cc:979
+#: route_ui.cc:1018
 msgid "Set sends gain to -inf"
 msgstr "Régler le gain des départs à -inf"
 
-#: route_ui.cc:980
+#: route_ui.cc:1019
 msgid "Set sends gain to 0dB"
 msgstr "Régler le gain des départs à 0dB"
 
-#: route_ui.cc:1300
+#: route_ui.cc:1357
 msgid "Solo Isolate"
 msgstr "Isoler le solo"
 
-#: route_ui.cc:1307
+#: route_ui.cc:1364
 msgid "Solo Safe"
 msgstr "Solo verrouillé"
 
-#: route_ui.cc:1329
-#, fuzzy
+#: route_ui.cc:1386
 msgid "Pre Fader Sends"
 msgstr "Départs Pré-Fader"
 
-#: route_ui.cc:1335
-#, fuzzy
+#: route_ui.cc:1392
 msgid "Post Fader Sends"
 msgstr "Départs Post-Fader"
 
-#: route_ui.cc:1341
+#: route_ui.cc:1398
 msgid "Control Outs"
 msgstr "Sorties de contrôle"
 
-#: route_ui.cc:1347
+#: route_ui.cc:1404
 msgid "Main Outs"
 msgstr "Sorties principales"
 
-#: route_ui.cc:1479
+#: route_ui.cc:1571
 msgid "Color Selection"
 msgstr "Sélection de Couleur"
 
-#: route_ui.cc:1564
-msgid ""
-"Do you really want to remove track \"%1\" ?\n"
-"\n"
-"You may also lose the playlist used by this track.\n"
-"\n"
-"(This action cannot be undone, and the session file will be overwritten)"
-msgstr ""
-"Voulez-vous vraiment supprimer la piste « %1 » ?\n"
-"\n"
-"Vous pourrez aussi perdre la liste de lecture utilisée par cette piste.\n"
-"\n"
-"(Cette action ne pourra pas être annulée, et le fichier de session sera "
-"écrasé)"
-
-#: route_ui.cc:1566
-msgid ""
-"Do you really want to remove bus \"%1\" ?\n"
-"\n"
-"(This action cannot be undone, and the session file will be overwritten)"
-msgstr ""
-"Voulez-vous vraiment supprimer le bus « %1 » ?\n"
-"\n"
-"Le fichier de session sera écrasé et cette action ne pourra pas être "
-"annulée !"
-
-#: route_ui.cc:1574
-msgid "Remove track"
-msgstr "Supprimer la piste"
-
-#: route_ui.cc:1576
-msgid "Remove bus"
-msgstr "Supprimer le bus"
-
-#: route_ui.cc:1604
+#: route_ui.cc:1613
 msgid ""
 "The use of colons (':') is discouraged in track and bus names.\n"
 "Do you want to use this new name?"
@@ -11068,108 +13019,78 @@ msgstr ""
 "des bus.\n"
 "Voulez-vous tout de même utiliser ce nom ?"
 
-#: route_ui.cc:1608
+#: route_ui.cc:1617
 #, fuzzy
 msgid "Use the new name"
 msgstr "Utiliser le nouveau nom"
 
-#: route_ui.cc:1609
+#: route_ui.cc:1618
 #, fuzzy
 msgid "Re-edit the name"
 msgstr "Renommer encore"
 
-#: route_ui.cc:1622
+#: route_ui.cc:1631
 msgid "Rename Track"
 msgstr "Renommer la piste"
 
-#: route_ui.cc:1624
+#: route_ui.cc:1633
 msgid "Rename Bus"
 msgstr "Renommer le bus"
 
-#: route_ui.cc:1692
+#: route_ui.cc:1693
 msgid ": comment editor"
 msgstr ": éditeur de commentaires"
 
-#: route_ui.cc:1858
+#: route_ui.cc:1848
 msgid " latency"
 msgstr " latence"
 
-#: route_ui.cc:1871
+#: route_ui.cc:1888
 #, fuzzy
 msgid "Cannot create route template directory %1"
 msgstr "Impossible de créer le répertoire modèle de Routine %1"
 
-#: route_ui.cc:1877
+#: route_ui.cc:1894
 msgid "Save As Template"
 msgstr "Sauvegarder comme modèle"
 
-#: route_ui.cc:1878
+#: route_ui.cc:1895
 msgid "Template name:"
 msgstr "Nom du modèle :"
 
-#: route_ui.cc:1959
-msgid "Remote Control ID"
-msgstr "Identifiant de contrôleur distant"
+#: route_ui.cc:2019
+msgid ""
+"Left-click to invert polarity of channel %1 of this track. Right-click to "
+"show menu."
+msgstr ""
 
-#: route_ui.cc:1969
-msgid "Remote control ID:"
-msgstr "Identifiant de contrôleur distant :"
+#: route_ui.cc:2021
+msgid "Click to show a menu of channels to invert polarity"
+msgstr ""
 
-#: route_ui.cc:1983
-#, fuzzy
-msgid ""
-"The remote control ID of %1 is: %2\n"
-"\n"
-"\n"
-"The remote control ID of %3 cannot be changed."
+#: save_as_dialog.cc:34
+msgid "Switch to newly-saved version"
 msgstr ""
-"L'ID MIDI du controleur %1 est: %2\n"
-"\n"
-"\n"
-"L'ID MIDI du controleur %3 ne peut être changée."
 
-#: route_ui.cc:1987
-#, fuzzy
-msgid "the master bus"
-msgstr "Le Bus Master"
+#: save_as_dialog.cc:35
+msgid "Copy media to new session"
+msgstr ""
 
-#: route_ui.cc:1987
-#, fuzzy
-msgid "the monitor bus"
-msgstr "Le Bus de Monitoring"
+#: save_as_dialog.cc:36
+msgid "Copy external media into new session"
+msgstr ""
 
-#: route_ui.cc:1989
-#, fuzzy
-msgid ""
-"The remote control ID of %5 is: %2\n"
-"\n"
-"\n"
-"Remote Control IDs are currently determined by track/bus ordering in %6.\n"
-"\n"
-"%3Use the User Interaction tab of the Preferences window if you want to "
-"change this%4"
+#: save_as_dialog.cc:37
+msgid "Newly-saved session should be empty"
 msgstr ""
-"L'ID du controleur distant de %5 est : %2\n"
-"\n"
-"\n"
-"Les ID de controleurs distants sont déterminées par l'ordonnancement Pistes/"
-"Bus dans Ardour.\n"
-"\n"
-"%3Pour changer cela, aller dans la fenetre Préférences puis dans l'onglet "
-"Interaction Utlisateur%4"
 
-#: route_ui.cc:2046
-msgid ""
-"Left-click to invert (phase reverse) channel %1 of this track.  Right-click "
-"to show menu."
+#: save_as_dialog.cc:48
+msgid "Save as session name"
 msgstr ""
-"Clic gauche pour inverser la phase du canal %1 de cette piste. Clic droit "
-"pour afficher le menu."
 
-#: route_ui.cc:2048
-#, fuzzy
-msgid "Click to show a menu of channels for inversion (phase reverse)"
-msgstr "Cliquer affiche le menu des canaux pour l'inversion de phase"
+#: save_as_dialog.cc:55
+msgid "Parent directory/folder"
+msgstr ""
 
 #: search_path_option.cc:35
 msgid "Select folder to search for media"
@@ -11183,131 +13104,161 @@ msgstr "Cliquer pour ajouter un nouvel emplacement"
 msgid "the session folder"
 msgstr "Le dossier de la session"
 
+#: script_selector.cc:43
+msgid "<b>Type:</b>"
+msgstr ""
+
+#: script_selector.cc:49
+msgid "<b>Author:</b>"
+msgstr ""
+
+#: script_selector.cc:55
+msgid "<b>Description:</b>"
+msgstr ""
+
+#: script_selector.cc:131
+msgid "Select Script to unload"
+msgstr ""
+
+#: script_selector.cc:165
+msgid "<b>Name:</b>"
+msgstr ""
+
+#: script_selector.cc:172
+msgid "<b>Instance Parameters</b>"
+msgstr ""
+
 #: send_ui.cc:134
 msgid "Send "
 msgstr "Départ "
 
-#: session_dialog.cc:61
+#: session_dialog.cc:71
 msgid "Session Setup"
 msgstr "Réglages de Session"
 
-#: session_dialog.cc:66
+#: session_dialog.cc:76
 msgid "Advanced options ..."
 msgstr "Options avancées…"
 
-#: session_dialog.cc:263
+#: session_dialog.cc:163 session_dialog.cc:397
+msgid "Recent Sessions"
+msgstr "Sessions récentes"
+
+#: session_dialog.cc:311
+#, fuzzy
+msgid "Sample Rate"
+msgstr "Taux d'échantillonage"
+
+#: session_dialog.cc:312
+msgid "File Resolution"
+msgstr ""
+
+#: session_dialog.cc:313
+msgid "Last Modified"
+msgstr ""
+
+#: session_dialog.cc:338
 msgid "New Session"
 msgstr "Nouvelle session"
 
-#: session_dialog.cc:301
+#: session_dialog.cc:379
 #, fuzzy
 msgid "Check the website for more..."
 msgstr "Visiter le site web pour plus de détails..."
 
-#: session_dialog.cc:304
+#: session_dialog.cc:382
 #, fuzzy
 msgid "Click to open the program website in your web browser"
 msgstr "Ouvrir le site du programme dans votre navigateur"
 
-#: session_dialog.cc:324
-#, fuzzy
-msgid "Sample Rate"
-msgstr "Taux d'échantillonage"
-
-# If chain doesn't say "formatting the disk" but "format OF the disk", translation is ok
-#: session_dialog.cc:325
-#, fuzzy
-msgid "Disk Format"
-msgstr "Format du Disque"
-
-#: session_dialog.cc:343
+#: session_dialog.cc:404
 msgid "Select session file"
 msgstr "Choisir un fichier de session"
 
-#: session_dialog.cc:358
+#: session_dialog.cc:417
 msgid "Other Sessions"
 msgstr "Autres sessions"
 
-#: session_dialog.cc:384
+#: session_dialog.cc:424
+msgid "Safe Mode: Disable all Plugins"
+msgstr ""
+
+#: session_dialog.cc:454
 msgid "Open"
 msgstr "Ouvrir"
 
-#: session_dialog.cc:451
+#: session_dialog.cc:521
 msgid "Session name:"
 msgstr "Nom de la session :"
 
-#: session_dialog.cc:473
+#: session_dialog.cc:543
 msgid "Create session folder in:"
 msgstr "Créer le dossier de session dans :"
 
-#: session_dialog.cc:496
+#: session_dialog.cc:564
 msgid "Select folder for session"
 msgstr "Choisir le dossier de session"
 
-#: session_dialog.cc:525
+#: session_dialog.cc:591
 msgid "Use this template"
 msgstr "Utiliser le modèle"
 
-#: session_dialog.cc:528
+#: session_dialog.cc:594
 msgid "no template"
 msgstr "Pas de modèle"
 
-#: session_dialog.cc:663 session_dialog.cc:699
-msgid "32 bit float"
-msgstr "32 bit flottant"
+#: session_dialog.cc:746 session_dialog.cc:793
+msgid "32-bit float"
+msgstr "flottant 32 bits"
 
-#: session_dialog.cc:666 session_dialog.cc:702
-msgid "24 bit"
-msgstr "24 bit"
+#: session_dialog.cc:749 session_dialog.cc:796
+msgid "24-bit"
+msgstr "24 bits"
 
-#: session_dialog.cc:669 session_dialog.cc:705
-msgid "16 bit"
-msgstr "16 bit"
+#: session_dialog.cc:752 session_dialog.cc:799
+msgid "16-bit"
+msgstr "16 bits"
 
-#: session_dialog.cc:747 session_dialog.cc:748 session_dialog.cc:749
+#: session_dialog.cc:877 session_dialog.cc:878 session_dialog.cc:879
 msgid "channels"
 msgstr "canaux"
 
-#: session_dialog.cc:763
+#: session_dialog.cc:893
 msgid "<b>Busses</b>"
 msgstr "<b>Bus</b>"
 
-#: session_dialog.cc:764
+#: session_dialog.cc:894
 msgid "<b>Inputs</b>"
 msgstr "<b>Entrées</b>"
 
-#: session_dialog.cc:765
+#: session_dialog.cc:895
 msgid "<b>Outputs</b>"
 msgstr "<b>Sorties</b>"
 
-#: session_dialog.cc:773
+#: session_dialog.cc:903
 msgid "Create master bus"
 msgstr "Bus de sortie principal à"
 
-#: session_dialog.cc:783
+#: session_dialog.cc:913
 msgid "Automatically connect to physical inputs"
 msgstr "Connecter automatiquement les entrées matérielles"
 
-#: session_dialog.cc:790 session_dialog.cc:849
+#: session_dialog.cc:920 session_dialog.cc:979
 msgid "Use only"
 msgstr "Utiliser seulement"
 
-#: session_dialog.cc:843
+#: session_dialog.cc:973
 msgid "Automatically connect outputs"
 msgstr "Connecter automatiquement les sorties"
 
-#: session_dialog.cc:865
+#: session_dialog.cc:995
 msgid "... to master bus"
 msgstr "… au bus général"
 
-#: session_dialog.cc:875
+#: session_dialog.cc:1005
 msgid "... to physical outputs"
 msgstr "… aux sorties matérielles"
 
-#: session_import_dialog.cc:65
-msgid "Import from Session"
-msgstr "Importer depuis une session"
-
 #: session_import_dialog.cc:74
 msgid "Elements"
 msgstr "Élements"
@@ -11330,199 +13281,198 @@ msgstr "Import depuis la session"
 msgid "This will select all elements of this type!"
 msgstr "Tous les éléments de ce type seront sélectionnés !"
 
-#: session_metadata_dialog.cc:285
+#: session_metadata_dialog.cc:288
 msgid "EAN Check digit OK"
-msgstr ""
+msgstr "Clé de contrôle EAN correcte"
 
-#: session_metadata_dialog.cc:289
+#: session_metadata_dialog.cc:292
 msgid "EAN Check digit error"
-msgstr ""
+msgstr "Clé de contrôle EAN incorrecte"
 
-#: session_metadata_dialog.cc:289
+#: session_metadata_dialog.cc:292
 msgid "expected"
-msgstr ""
+msgstr "attendu"
 
-#: session_metadata_dialog.cc:294
+#: session_metadata_dialog.cc:297
 msgid "EAN Length error"
-msgstr ""
+msgstr "Erreur de longueur EAN"
 
-#: session_metadata_dialog.cc:423
+#: session_metadata_dialog.cc:426
 msgid "Field"
-msgstr "champ"
+msgstr "Champ"
 
-#: session_metadata_dialog.cc:427
+#: session_metadata_dialog.cc:430
 msgid "Values (current value on top)"
 msgstr "Valeurs (valeur actuelle au dessus)"
 
-#: session_metadata_dialog.cc:641
+#: session_metadata_dialog.cc:644
 msgid "User"
 msgstr "Utilisateur"
 
-#: session_metadata_dialog.cc:649
+#: session_metadata_dialog.cc:652
 msgid "Email"
 msgstr "Email"
 
-#: session_metadata_dialog.cc:652
+#: session_metadata_dialog.cc:655
 msgid "Web"
 msgstr "Web"
 
-#: session_metadata_dialog.cc:655
+#: session_metadata_dialog.cc:658
 #, fuzzy
 msgid "Organization"
 msgstr "Organisation"
 
-#: session_metadata_dialog.cc:658
+#: session_metadata_dialog.cc:661
 #, fuzzy
 msgid "Country"
 msgstr "Pays"
 
-#: session_metadata_dialog.cc:672
+#: session_metadata_dialog.cc:675
 msgid "Title"
 msgstr "Titre"
 
-#: session_metadata_dialog.cc:675
+#: session_metadata_dialog.cc:678
 msgid "Track Number"
 msgstr "Numéro de la piste"
 
-#: session_metadata_dialog.cc:678
+#: session_metadata_dialog.cc:681
 msgid "Subtitle"
 msgstr "Sous-titre"
 
-#: session_metadata_dialog.cc:681
+#: session_metadata_dialog.cc:684
 #, fuzzy
 msgid "Grouping"
 msgstr "Groupe"
 
-#: session_metadata_dialog.cc:684
+#: session_metadata_dialog.cc:687
 msgid "Artist"
 msgstr "Artiste"
 
-#: session_metadata_dialog.cc:687
+#: session_metadata_dialog.cc:690
 msgid "Genre"
 msgstr "Genre"
 
-#: session_metadata_dialog.cc:690
+#: session_metadata_dialog.cc:693
 msgid "Comment"
 msgstr "Commentaire"
 
-#: session_metadata_dialog.cc:693
+#: session_metadata_dialog.cc:696
 msgid "Copyright"
 msgstr "Droits d'auteur"
 
-#: session_metadata_dialog.cc:701 session_metadata_dialog.cc:706
+#: session_metadata_dialog.cc:704 session_metadata_dialog.cc:709
 msgid "Album"
 msgstr "Album"
 
-#: session_metadata_dialog.cc:709
+#: session_metadata_dialog.cc:712
 msgid "Year"
 msgstr "Année"
 
-#: session_metadata_dialog.cc:712
+#: session_metadata_dialog.cc:715
 msgid "Album Artist"
 msgstr "Artiste de l'album"
 
-#: session_metadata_dialog.cc:715
+#: session_metadata_dialog.cc:718
 msgid "Total Tracks"
 msgstr "Nombre de morceaux"
 
-#: session_metadata_dialog.cc:718
+#: session_metadata_dialog.cc:721
 msgid "Disc Subtitle"
 msgstr "Sous-titre du disque"
 
-#: session_metadata_dialog.cc:721
+#: session_metadata_dialog.cc:724
 msgid "Disc Number"
 msgstr "Numéro du disque"
 
-#: session_metadata_dialog.cc:724
+#: session_metadata_dialog.cc:727
 msgid "Total Discs"
 msgstr "Nombre de disques"
 
-#: session_metadata_dialog.cc:727
+#: session_metadata_dialog.cc:730
 msgid "Compilation"
 msgstr "Compilation"
 
-#: session_metadata_dialog.cc:730
+#: session_metadata_dialog.cc:733
 msgid "ISRC"
 msgstr "ISRC"
 
-#: session_metadata_dialog.cc:733
+#: session_metadata_dialog.cc:736
 msgid "EAN barcode"
-msgstr ""
+msgstr "Code-barre EAN"
 
-#: session_metadata_dialog.cc:746
+#: session_metadata_dialog.cc:749
 msgid "People"
 msgstr "Participants"
 
-#: session_metadata_dialog.cc:751
+#: session_metadata_dialog.cc:754
 msgid "Lyricist"
 msgstr "Auteur"
 
-#: session_metadata_dialog.cc:754
+#: session_metadata_dialog.cc:757
 msgid "Composer"
 msgstr "Compositeur"
 
-#: session_metadata_dialog.cc:757
+#: session_metadata_dialog.cc:760
 msgid "Conductor"
 msgstr "Chef d'orchestre"
 
-#: session_metadata_dialog.cc:760
+#: session_metadata_dialog.cc:763
 msgid "Remixer"
 msgstr "Remixeur"
 
-#: session_metadata_dialog.cc:763
+#: session_metadata_dialog.cc:766
 msgid "Arranger"
 msgstr "Arrangeur"
 
-#: session_metadata_dialog.cc:766
+#: session_metadata_dialog.cc:769
 msgid "Engineer"
 msgstr "Ingénieur du son"
 
-#: session_metadata_dialog.cc:769
+#: session_metadata_dialog.cc:772
 msgid "Producer"
 msgstr "Producteur"
 
-#: session_metadata_dialog.cc:772
+#: session_metadata_dialog.cc:775
 msgid "DJ Mixer"
 msgstr "DJ Mixeur"
 
-#: session_metadata_dialog.cc:775
+#: session_metadata_dialog.cc:778
 msgid "Metadata|Mixer"
 msgstr "Mixeur"
 
-#: session_metadata_dialog.cc:783
-#, fuzzy
+#: session_metadata_dialog.cc:786
 msgid "School"
-msgstr "Ecole"
+msgstr "École"
 
-#: session_metadata_dialog.cc:788
+#: session_metadata_dialog.cc:791
 #, fuzzy
 msgid "Instructor"
 msgstr "Instructeur"
 
-#: session_metadata_dialog.cc:791
+#: session_metadata_dialog.cc:794
 #, fuzzy
 msgid "Course"
 msgstr "Cours"
 
-#: session_metadata_dialog.cc:799
+#: session_metadata_dialog.cc:802
 msgid "Edit Session Metadata"
 msgstr "Éditer les méta-données de la session"
 
-#: session_metadata_dialog.cc:830
+#: session_metadata_dialog.cc:833
 msgid "Import session metadata"
 msgstr "Importer les méta-données de session"
 
-#: session_metadata_dialog.cc:851
+#: session_metadata_dialog.cc:854
 msgid "Choose session to import metadata from"
 msgstr ""
 "Choisir la session à partir de laquelle les méta-données doivent être "
 "importées"
 
-#: session_metadata_dialog.cc:889
+#: session_metadata_dialog.cc:892
 msgid "This session file could not be read!"
 msgstr "Ce fichier de session n'a pu être lu !"
 
-#: session_metadata_dialog.cc:899
+#: session_metadata_dialog.cc:902
 msgid ""
 "The session file didn't contain metadata!\n"
 "Maybe this is an old session format?"
@@ -11530,7 +13480,7 @@ msgstr ""
 "Le fichier de session ne contient pas de méta-données !\n"
 "Le format de cette session est peut-être ancien ?"
 
-#: session_metadata_dialog.cc:918
+#: session_metadata_dialog.cc:921
 msgid "Import all from:"
 msgstr "Tout importer depuis :"
 
@@ -11548,7 +13498,7 @@ msgstr "Trames par secondes de « timecode »"
 
 #: session_option_editor.cc:50
 msgid "23.976"
-msgstr "23.976"
+msgstr "23,976"
 
 #: session_option_editor.cc:51
 msgid "24"
@@ -11556,7 +13506,7 @@ msgstr "24"
 
 #: session_option_editor.cc:52
 msgid "24.975"
-msgstr "24.975"
+msgstr "24,975"
 
 #: session_option_editor.cc:53
 msgid "25"
@@ -11564,11 +13514,11 @@ msgstr "25"
 
 #: session_option_editor.cc:54
 msgid "29.97"
-msgstr "29.97"
+msgstr "29,97"
 
 #: session_option_editor.cc:55
 msgid "29.97 drop"
-msgstr "29.97 drop"
+msgstr ""
 
 #: session_option_editor.cc:56
 msgid "30"
@@ -11576,11 +13526,11 @@ msgstr "30"
 
 #: session_option_editor.cc:57
 msgid "30 drop"
-msgstr "30 drop"
+msgstr ""
 
 #: session_option_editor.cc:58
 msgid "59.94"
-msgstr "59.94"
+msgstr "59,94"
 
 #: session_option_editor.cc:59
 msgid "60"
@@ -11592,19 +13542,19 @@ msgstr "Pullup/pulldown "
 
 #: session_option_editor.cc:70
 msgid "4.1667 + 0.1%"
-msgstr "4.1667 + 0.1%"
+msgstr "4,1667 + 0,1%"
 
 #: session_option_editor.cc:71
 msgid "4.1667"
-msgstr "4.1667"
+msgstr "4,1667"
 
 #: session_option_editor.cc:72
 msgid "4.1667 - 0.1%"
-msgstr "4.1667 - 0.1%"
+msgstr "4,1667 - 0.1%"
 
 #: session_option_editor.cc:73
 msgid "0.1"
-msgstr "0.1"
+msgstr "0,1"
 
 #: session_option_editor.cc:74
 msgid "none"
@@ -11612,34 +13562,35 @@ msgstr "aucun"
 
 #: session_option_editor.cc:75
 msgid "-0.1"
-msgstr "-0.1"
+msgstr "-0,1"
 
 #: session_option_editor.cc:76
 msgid "-4.1667 + 0.1%"
-msgstr "-4.1667 + 0.1%"
+msgstr "-4,1667 + 0,1%"
 
 #: session_option_editor.cc:77
 msgid "-4.1667"
-msgstr "-4.1667"
+msgstr "-4,1667"
 
 #: session_option_editor.cc:78
 msgid "-4.1667 - 0.1%"
-msgstr "-4.1667 - 0.1%"
+msgstr "-4,1667 - 0,1%"
 
 #: session_option_editor.cc:84
-#, fuzzy
 msgid ""
 "Use Video File's FPS Instead of Timecode Value for Timeline and Video "
 "Monitor."
 msgstr ""
-"Utiliser le débit du fichier vidéo (à la place du Timecode) pour la Timeline "
-"et le Monitoring Vidéo."
+"Utiliser le débit du fichier vidéo au lieu du timecode pour la timeline et "
+"le Monitoring Vidéo."
 
 #: session_option_editor.cc:91
 msgid ""
 "Apply Pull-Up/Down to Video Timeline and Video Monitor (Unless using JACK-"
 "sync)."
 msgstr ""
+"Appliquer les pulldown/pullup à la timeline vidéo et au moniteur vidéo (sauf "
+"en cas d'utilisation de JACK-sync)"
 
 # Chaîne suivie d'un « : » d'où l'espace insécable en fin
 #: session_option_editor.cc:96
@@ -11679,232 +13630,248 @@ msgstr ""
 
 #: session_option_editor.cc:136
 msgid "destructive-xfade-seconds"
-msgstr ""
+msgstr "Secondes-de-fondu-destructif"
 
 #: session_option_editor.cc:137
 msgid "Destructive crossfade length"
 msgstr "Durée du fondu destructif "
 
 #: session_option_editor.cc:146
+msgid "Declick when transport starts and stops"
+msgstr ""
+
+#: session_option_editor.cc:153
+msgid "Declick when monitor state changes"
+msgstr ""
+
+#: session_option_editor.cc:160
 msgid "Region fades active"
 msgstr "Fondus des régions actifs"
 
-#: session_option_editor.cc:153
+#: session_option_editor.cc:167
 msgid "Region fades visible"
 msgstr "Fondus des régions visibles"
 
-#: session_option_editor.cc:160 session_option_editor.cc:173
-#: session_option_editor.cc:187
+#: session_option_editor.cc:174 session_option_editor.cc:187
+#: session_option_editor.cc:208
 msgid "Media"
 msgstr "Médias"
 
-#: session_option_editor.cc:160
+#: session_option_editor.cc:174
 msgid "Audio file format"
 msgstr "Format de fichier audio"
 
-#: session_option_editor.cc:164
+#: session_option_editor.cc:178
 msgid "Sample format"
 msgstr "Échantillonnage "
 
-#: session_option_editor.cc:169
+#: session_option_editor.cc:183
 msgid "32-bit floating point"
 msgstr "32 bits à virgule flottante"
 
-#: session_option_editor.cc:170
+#: session_option_editor.cc:184
 msgid "24-bit integer"
 msgstr "24 bits à entiers signés"
 
-#: session_option_editor.cc:171
+#: session_option_editor.cc:185
 msgid "16-bit integer"
 msgstr "16 bits à entiers signés"
 
-#: session_option_editor.cc:177
+#: session_option_editor.cc:191
 msgid "File type"
 msgstr "Type de fichier"
 
-#: session_option_editor.cc:182
-msgid "Broadcast WAVE"
-msgstr "Broadcast WAVE"
+#: session_option_editor.cc:196
+msgid "Broadcast WAVE (4GB size limit)"
+msgstr ""
 
-#: session_option_editor.cc:183
-msgid "WAVE"
-msgstr "WAVE"
+#: session_option_editor.cc:198
+msgid "Broadcast RF64"
+msgstr ""
 
-#: session_option_editor.cc:184
+#: session_option_editor.cc:200
+msgid "WAVE (4GB size limit)"
+msgstr ""
+
+#: session_option_editor.cc:201
 msgid "WAVE-64"
 msgstr "WAVE-64"
 
-#: session_option_editor.cc:189
+#: session_option_editor.cc:205
+msgid "RF64 (WAV compatible)"
+msgstr ""
+
+#: session_option_editor.cc:210 session_option_editor.cc:216
+#: session_option_editor.cc:223
+msgid "Files|Locations"
+msgstr ""
+
+#: session_option_editor.cc:210
 msgid "File locations"
 msgstr "Emplacement des fichiers"
 
-#: session_option_editor.cc:191
+#: session_option_editor.cc:212
 msgid "Search for audio files in:"
 msgstr "Chercher les fichiers audio dans :"
 
-#: session_option_editor.cc:197
+#: session_option_editor.cc:218
 msgid "Search for MIDI files in:"
 msgstr "Chercher les fichiers MIDI dans :"
 
-#: session_option_editor.cc:206 session_option_editor.cc:218
-#: session_option_editor.cc:228 session_option_editor.cc:239
+#: session_option_editor.cc:227 session_option_editor.cc:239
+#: session_option_editor.cc:249 session_option_editor.cc:260
 msgid "Filenames"
-msgstr ""
+msgstr "Noms de fichiers"
 
-#: session_option_editor.cc:206
+#: session_option_editor.cc:227
 msgid "File Naming"
-msgstr ""
+msgstr "Dénomination de fichier"
 
-#: session_option_editor.cc:212
+#: session_option_editor.cc:233
 msgid "Prefix Track number"
-msgstr ""
+msgstr "Préfixer avec le numéro de piste"
 
-#: session_option_editor.cc:217
+#: session_option_editor.cc:238
 msgid ""
 "Adds the current track number to the beginning of the recorded file name."
 msgstr ""
+"Ajoute le numéro de piste en cours au début du nom du fichier enregistré."
 
-#: session_option_editor.cc:222
+#: session_option_editor.cc:243
 msgid "Prefix Take Name"
-msgstr ""
+msgstr "Préfixer le nom de la prise"
 
-#: session_option_editor.cc:227
+#: session_option_editor.cc:248
 msgid "Adds the Take Name to the beginning of the recorded file name."
-msgstr ""
+msgstr "Ajoute le nom de la prise au début du nom de fichier enregistré."
 
-#: session_option_editor.cc:232
+#: session_option_editor.cc:253
 msgid "Take Name"
-msgstr ""
+msgstr "Nom de prise"
 
-#: session_option_editor.cc:245
+#: session_option_editor.cc:266
 msgid ""
 "Track Input Monitoring automatically follows transport state (\"auto-input\")"
 msgstr ""
 "L'écoute d'entrée des pistes suit automatiquement l'état du transport "
 "(« auto-input »)"
 
-#: session_option_editor.cc:252
+#: session_option_editor.cc:273
 msgid "Use monitor section in this session"
 msgstr "Utiliser une section d'écoute dans cette session"
 
-#: session_option_editor.cc:257 session_option_editor.cc:259
-#: session_option_editor.cc:266 session_option_editor.cc:273
-#: session_option_editor.cc:280 session_option_editor.cc:282
-#: session_option_editor.cc:289 session_option_editor.cc:296
-#: session_option_editor.cc:303 session_option_editor.cc:310
-#: session_option_editor.cc:312
+#: session_option_editor.cc:278 session_option_editor.cc:280
+#: session_option_editor.cc:287 session_option_editor.cc:294
+#: session_option_editor.cc:301 session_option_editor.cc:303
+#: session_option_editor.cc:310 session_option_editor.cc:317
+#: session_option_editor.cc:324 session_option_editor.cc:331
+#: session_option_editor.cc:333
 msgid "Meterbridge"
 msgstr "Bandeau de mesure"
 
-#: session_option_editor.cc:257
-#, fuzzy
+#: session_option_editor.cc:278
 msgid "Route Display"
-msgstr "Affichage"
+msgstr "Affichage du routage"
 
-#: session_option_editor.cc:261
-#, fuzzy
+#: session_option_editor.cc:282
 msgid "Show Midi Tracks"
 msgstr "Afficher les Pistes MIDI"
 
-#: session_option_editor.cc:268
-#, fuzzy
+#: session_option_editor.cc:289
 msgid "Show Busses"
 msgstr "Afficher les Bus"
 
-#: session_option_editor.cc:275
+#: session_option_editor.cc:296
 #, fuzzy
 msgid "Include Master Bus"
 msgstr "Inclure le Bus Master"
 
-#: session_option_editor.cc:280
+#: session_option_editor.cc:301
 #, fuzzy
 msgid "Button Area"
 msgstr "Zone de Boutons"
 
-#: session_option_editor.cc:284
-#, fuzzy
+#: session_option_editor.cc:305
 msgid "Rec-enable Button"
-msgstr "Bouton Armer-Enregistrement"
+msgstr "Bouton d'armement d'enregistrement"
 
-#: session_option_editor.cc:291
+#: session_option_editor.cc:312
 #, fuzzy
 msgid "Mute Button"
 msgstr "Bouton Muet"
 
-#: session_option_editor.cc:298
+#: session_option_editor.cc:319
 #, fuzzy
 msgid "Solo Button"
 msgstr "Bouton Solo"
 
-#: session_option_editor.cc:305
-#, fuzzy
+#: session_option_editor.cc:326
 msgid "Monitor Buttons"
-msgstr "Boutons de Monitoring"
+msgstr "Boutons de monitoring"
 
-#: session_option_editor.cc:310
+#: session_option_editor.cc:331
 #, fuzzy
 msgid "Name Labels"
 msgstr "Etiquettes de noms"
 
-#: session_option_editor.cc:314
+#: session_option_editor.cc:335
 #, fuzzy
 msgid "Track Name"
 msgstr "Nom de la Piste"
 
-#: session_option_editor.cc:325
+#: session_option_editor.cc:346
 msgid "MIDI region copies are independent"
 msgstr "Les copies de région MIDI sont indépendantes"
 
-#: session_option_editor.cc:332
+#: session_option_editor.cc:353
 msgid ""
 "Policy for handling overlapping notes\n"
 " on the same MIDI channel"
 msgstr "Règle de gestion du recouvrement de notes sur le même canal MIDI "
 
-#: session_option_editor.cc:337
+#: session_option_editor.cc:358
 msgid "never allow them"
 msgstr "interdire"
 
-#: session_option_editor.cc:338
+#: session_option_editor.cc:359
 msgid "don't do anything in particular"
 msgstr "ne rien faire"
 
-#: session_option_editor.cc:339
+#: session_option_editor.cc:360
 msgid "replace any overlapped existing note"
 msgstr "remplacer par la nouvelle note"
 
-#: session_option_editor.cc:340
+#: session_option_editor.cc:361
 msgid "shorten the overlapped existing note"
 msgstr "raccourcir la note recouverte"
 
-#: session_option_editor.cc:341
+#: session_option_editor.cc:362
 msgid "shorten the overlapping new note"
 msgstr "raccourcir la nouvelle note"
 
-#: session_option_editor.cc:342
+#: session_option_editor.cc:363
 msgid "replace both overlapping notes with a single note"
 msgstr "fusionner les notes"
 
-#: session_option_editor.cc:346
-#, fuzzy
+#: session_option_editor.cc:367
 msgid "Glue to bars and beats"
 msgstr "Coller aux mesures et temps"
 
-#: session_option_editor.cc:350
+#: session_option_editor.cc:371
 msgid "Glue new markers to bars and beats"
 msgstr "Coller les nouveaux repères aux mesures|temps"
 
-#: session_option_editor.cc:357
+#: session_option_editor.cc:378
 msgid "Glue new regions to bars and beats"
 msgstr "Coller les nouvelles régions aux mesures|temps"
 
-#: session_option_editor.cc:362
+#: session_option_editor.cc:383
 msgid "Defaults"
 msgstr "Par défaut"
 
-#: session_option_editor.cc:364
+#: session_option_editor.cc:385
 msgid "Use these settings as defaults"
-msgstr ""
+msgstr "Utiliser ces paramètres par défaut"
 
 #: sfdb_ui.cc:90 sfdb_ui.cc:110 sfdb_ui.cc:119
 msgid "as new tracks"
@@ -11939,27 +13906,15 @@ msgstr "<b>Informations sur le fichier audio</b>"
 msgid "Timestamp:"
 msgstr "Horodatage :"
 
-#: sfdb_ui.cc:149
-msgid "Format:"
-msgstr "Format :"
-
-#: sfdb_ui.cc:188 sfdb_ui.cc:653
+#: sfdb_ui.cc:188 sfdb_ui.cc:659
 msgid "Tags:"
 msgstr "Étiquettes :"
 
-#: sfdb_ui.cc:293 sfdb_ui.cc:409
-msgid "Could not read file: %1 (%2)."
-msgstr "Impossible de lire le fichier « %1 » (%2)."
-
 #: sfdb_ui.cc:297
 #, fuzzy
 msgid "<b>Midi File Information</b>"
 msgstr "<b>Infos du Fichier Midi</b>"
 
-#: sfdb_ui.cc:458
-msgid "Could not access soundfile: "
-msgstr "Impossible d'accéder au fichier audio : "
-
 #: sfdb_ui.cc:530
 #, fuzzy
 msgid "SoundFileBox: Could not tokenize string: "
@@ -11969,190 +13924,183 @@ msgstr "SoundFileBox: Could not tokenize string: "
 msgid "Search"
 msgstr "Recherche"
 
-#: sfdb_ui.cc:576
+#: sfdb_ui.cc:581
 msgid "Audio and MIDI files"
 msgstr "Fichiers audio et MIDI"
 
-#: sfdb_ui.cc:579
+#: sfdb_ui.cc:584
 msgid "Audio files"
 msgstr "Audio"
 
-#: sfdb_ui.cc:582
+#: sfdb_ui.cc:587
 msgid "MIDI files"
 msgstr "Fichiers MIDI"
 
-#: sfdb_ui.cc:585 add_video_dialog.cc:123
+#: sfdb_ui.cc:590 add_video_dialog.cc:123
 msgid "All files"
 msgstr "Tous les fichiers"
 
-#: sfdb_ui.cc:604 add_video_dialog.cc:246
+#: sfdb_ui.cc:609 add_video_dialog.cc:246
 msgid "Browse Files"
 msgstr "Parcourir les Fichiers"
 
-#: sfdb_ui.cc:633
+#: sfdb_ui.cc:638
 msgid "Paths"
 msgstr "Chemins"
 
-#: sfdb_ui.cc:642
+#: sfdb_ui.cc:647
 msgid "Search Tags"
 msgstr "Recherche de tags"
 
-#: sfdb_ui.cc:658
+#: sfdb_ui.cc:664
 msgid "Sort:"
 msgstr "Trier :"
 
-#: sfdb_ui.cc:666
+#: sfdb_ui.cc:672
 msgid "Longest"
 msgstr "Les plus longs"
 
-#: sfdb_ui.cc:667
+#: sfdb_ui.cc:673
 msgid "Shortest"
 msgstr "Les plus courts"
 
-#: sfdb_ui.cc:668
+#: sfdb_ui.cc:674
 msgid "Newest"
 msgstr "Les plus récents"
 
-#: sfdb_ui.cc:669
+#: sfdb_ui.cc:675
 msgid "Oldest"
 msgstr "Les plus anciens"
 
-#: sfdb_ui.cc:670
+#: sfdb_ui.cc:676
 msgid "Most downloaded"
 msgstr "Les plus téléchargés"
 
-#: sfdb_ui.cc:671
+#: sfdb_ui.cc:677
 msgid "Least downloaded"
 msgstr "Les moins téléchargés"
 
-#: sfdb_ui.cc:672
+#: sfdb_ui.cc:678
 msgid "Highest rated"
 msgstr "Les mieux notés"
 
-#: sfdb_ui.cc:673
+#: sfdb_ui.cc:679
 msgid "Lowest rated"
 msgstr "Les moins bien notés"
 
-#: sfdb_ui.cc:678
+#: sfdb_ui.cc:684
 #, fuzzy
 msgid "More"
 msgstr "Plus"
 
-#: sfdb_ui.cc:682
+#: sfdb_ui.cc:688
 #, fuzzy
 msgid "Similar"
 msgstr "Similaire"
 
-#: sfdb_ui.cc:694
+#: sfdb_ui.cc:700
 msgid "ID"
 msgstr "ID"
 
-#: sfdb_ui.cc:695 add_video_dialog.cc:83
+#: sfdb_ui.cc:701 add_video_dialog.cc:83
 msgid "Filename"
 msgstr "Nom du fichier"
 
-#: sfdb_ui.cc:697
-#, fuzzy
+#: sfdb_ui.cc:703 time_fx_dialog.cc:154
 msgid "Duration"
 msgstr "Durée"
 
-#: sfdb_ui.cc:698
+#: sfdb_ui.cc:704
 #, fuzzy
 msgid "Size"
 msgstr "Taille"
 
-#: sfdb_ui.cc:699
+#: sfdb_ui.cc:705
 msgid "Samplerate"
 msgstr "Taux d'échantillonnage"
 
-#: sfdb_ui.cc:700
+#: sfdb_ui.cc:706
 #, fuzzy
 msgid "License"
 msgstr "Licence"
 
-#: sfdb_ui.cc:718
+#: sfdb_ui.cc:724
 msgid "Search Freesound"
 msgstr "Rechercher sur Freesound"
 
-#: sfdb_ui.cc:738
-#, fuzzy
-msgid "Press to import selected files and close this window"
-msgstr "Importer les fichiers sélectionnés et fermer cette fenêtre"
-
-#: sfdb_ui.cc:739
-#, fuzzy
-msgid "Press to import selected files and leave this window open"
-msgstr "Importer les fichiers sélectionnés et laisser cette fenêtre ouverte"
+#: sfdb_ui.cc:741
+msgid "Press to import selected files"
+msgstr ""
 
-#: sfdb_ui.cc:740
+#: sfdb_ui.cc:742
 msgid "Press to close this window without importing any files"
 msgstr "Cliquez pour fermer cette fenêtre sans importer de fichiers"
 
-#: sfdb_ui.cc:936
+#: sfdb_ui.cc:937
 #, fuzzy
 msgid "SoundFileBrowser: Could not tokenize string: "
 msgstr "SoundFileBrowser: Could not tokenize string: "
 
-#: sfdb_ui.cc:1136
+#: sfdb_ui.cc:1137
 msgid "%1 more page of 100 results available"
 msgid_plural "%1 more pages of 100 results available"
 msgstr[0] "Encore %1 page de 100 résultats disponible"
 msgstr[1] "Encore %1 pages de 100 résultats disponibles"
 
-#: sfdb_ui.cc:1141
+#: sfdb_ui.cc:1142
 #, fuzzy
 msgid "No more results available"
 msgstr "Pas de résultat supplémentaire"
 
-#: sfdb_ui.cc:1205
+#: sfdb_ui.cc:1206
 msgid "B"
 msgstr "B"
 
-#: sfdb_ui.cc:1207
+#: sfdb_ui.cc:1208
 msgid "kB"
 msgstr "kB"
 
-#: sfdb_ui.cc:1209 sfdb_ui.cc:1211
+#: sfdb_ui.cc:1210 sfdb_ui.cc:1212
 msgid "MB"
 msgstr "MB"
 
-#: sfdb_ui.cc:1213
+#: sfdb_ui.cc:1214
 msgid "GB"
 msgstr "GB"
 
-#: sfdb_ui.cc:1425 sfdb_ui.cc:1738 sfdb_ui.cc:1801 sfdb_ui.cc:1819
+#: sfdb_ui.cc:1431 sfdb_ui.cc:1728 sfdb_ui.cc:1764 sfdb_ui.cc:1782
 msgid "one track per file"
 msgstr "une piste par fichier"
 
-#: sfdb_ui.cc:1428 sfdb_ui.cc:1802 sfdb_ui.cc:1820
+#: sfdb_ui.cc:1434 sfdb_ui.cc:1765 sfdb_ui.cc:1783
 msgid "one track per channel"
 msgstr "une piste par canal"
 
-#: sfdb_ui.cc:1436 sfdb_ui.cc:1804 sfdb_ui.cc:1821
+#: sfdb_ui.cc:1442 sfdb_ui.cc:1767 sfdb_ui.cc:1784
 msgid "sequence files"
 msgstr "fichiers séquencés"
 
-#: sfdb_ui.cc:1439 sfdb_ui.cc:1809
+#: sfdb_ui.cc:1445 sfdb_ui.cc:1772
 msgid "all files in one track"
 msgstr "tous les fichiers dans une piste"
 
-#: sfdb_ui.cc:1440 sfdb_ui.cc:1803
+#: sfdb_ui.cc:1446 sfdb_ui.cc:1766
 msgid "merge files"
 msgstr "fusionner les fichiers"
 
-#: sfdb_ui.cc:1446 sfdb_ui.cc:1806
+#: sfdb_ui.cc:1452 sfdb_ui.cc:1769
 msgid "one region per file"
 msgstr "une région par fichier"
 
-#: sfdb_ui.cc:1449 sfdb_ui.cc:1807
+#: sfdb_ui.cc:1455 sfdb_ui.cc:1770
 msgid "one region per channel"
 msgstr "une région par voie"
 
-#: sfdb_ui.cc:1454 sfdb_ui.cc:1808 sfdb_ui.cc:1822
+#: sfdb_ui.cc:1460 sfdb_ui.cc:1771 sfdb_ui.cc:1785
 msgid "all files in one region"
 msgstr "tout dans une région"
 
-#: sfdb_ui.cc:1521
+#: sfdb_ui.cc:1527
 msgid ""
 "One or more of the selected files\n"
 "cannot be used by %1"
@@ -12160,134 +14108,132 @@ msgstr ""
 "Au moins un des fichiers sélectionnés\n"
 "ne peut pas être utilisé par %1"
 
-#: sfdb_ui.cc:1665
+#: sfdb_ui.cc:1671
 msgid "Copy files to session"
 msgstr "Copier les fichiers dans la session"
 
-#: sfdb_ui.cc:1682 sfdb_ui.cc:1859
+#: sfdb_ui.cc:1686 sfdb_ui.cc:1825
 msgid "file timestamp"
-msgstr "à l'horodatage du fichier"
+msgstr "horodatage du fichier"
 
-#: sfdb_ui.cc:1683 sfdb_ui.cc:1861
+#: sfdb_ui.cc:1687 sfdb_ui.cc:1827
 msgid "edit point"
 msgstr "au point d'édition"
 
-#: sfdb_ui.cc:1684 sfdb_ui.cc:1863
+#: sfdb_ui.cc:1688 sfdb_ui.cc:1829
 msgid "playhead"
 msgstr "à la Tête de Lecture"
 
-#: sfdb_ui.cc:1685
-#, fuzzy
+#: sfdb_ui.cc:1689
 msgid "session start"
-msgstr "au début de la session"
+msgstr "début de la session"
 
-#: sfdb_ui.cc:1691
-#, fuzzy
-msgid "<b>Add files as ...</b>"
-msgstr "<b>Ajouter les fichiers...</b>"
+#: sfdb_ui.cc:1695
+msgid "<b>Add files ...</b>"
+msgstr ""
 
-#: sfdb_ui.cc:1713
+#: sfdb_ui.cc:1700
 msgid "<b>Insert at</b>"
 msgstr "<b>Insérer</b>"
 
-#: sfdb_ui.cc:1726
+#: sfdb_ui.cc:1705
 #, fuzzy
 msgid "<b>Mapping</b>"
 msgstr "<b>Routine</b>"
 
-#: sfdb_ui.cc:1744
+#: sfdb_ui.cc:1710
 msgid "<b>Conversion quality</b>"
 msgstr "<b>Qualité de la conversion</b>"
 
-#: sfdb_ui.cc:1756
+#: sfdb_ui.cc:1715
 msgid "<b>Instrument</b>"
-msgstr ""
+msgstr "<b>Instrument</b>"
 
-#: sfdb_ui.cc:1768 sfdb_ui.cc:1875
+#: sfdb_ui.cc:1734 sfdb_ui.cc:1841
 msgid "Best"
 msgstr "Excellente"
 
-#: sfdb_ui.cc:1769 sfdb_ui.cc:1877
+#: sfdb_ui.cc:1735 sfdb_ui.cc:1843
 msgid "Good"
 msgstr "Bonne"
 
-#: sfdb_ui.cc:1770 sfdb_ui.cc:1879
+#: sfdb_ui.cc:1736 sfdb_ui.cc:1845
 msgid "Quick"
 msgstr "Rapide"
 
-#: sfdb_ui.cc:1772
+#: sfdb_ui.cc:1738
 msgid "Fastest"
 msgstr "Très rapide"
 
-#: shuttle_control.cc:56
+#: shuttle_control.cc:64
 msgid "Shuttle speed control (Context-click for options)"
 msgstr "Variateur de vitesse (clic droit pour les options)"
 
-#: shuttle_control.cc:174
+#: shuttle_control.cc:201 time_fx_dialog.cc:164
 msgid "Percent"
 msgstr "Pourcentages"
 
 # The plural is a mistake. Only one choice is available.
-#: shuttle_control.cc:182
+#: shuttle_control.cc:209
 msgid "Units"
 msgstr "Unité"
 
-#: shuttle_control.cc:188 shuttle_control.cc:609
+#: shuttle_control.cc:215 shuttle_control.cc:671
 msgid "Sprung"
 msgstr "Ressort"
 
-#: shuttle_control.cc:192 shuttle_control.cc:612
+#: shuttle_control.cc:219 shuttle_control.cc:674
 msgid "Wheel"
 msgstr "Molette"
 
-#: shuttle_control.cc:226
+#: shuttle_control.cc:253
 msgid "Maximum speed"
 msgstr "Vitesse maximale"
 
-#: shuttle_control.cc:568
+#: shuttle_control.cc:256
+msgid "Reset to 100%"
+msgstr ""
+
+#: shuttle_control.cc:633
 #, fuzzy
 msgid "Playing"
 msgstr "Lecture"
 
-#: shuttle_control.cc:583
+#: shuttle_control.cc:648
 #, c-format
 msgid "<<< %+d semitones"
 msgstr "<<< %+d demi-tons"
 
-#: shuttle_control.cc:585
+#: shuttle_control.cc:650
 #, c-format
 msgid ">>> %+d semitones"
 msgstr ">>> %+d demi-tons"
 
-#: shuttle_control.cc:590
-msgid "Stopped"
-msgstr "Arrêt"
-
 #: soundcloud_export_selector.cc:44
 msgid "User Email"
-msgstr ""
+msgstr "E-mail utilisateur"
 
 #: soundcloud_export_selector.cc:45
 msgid "Password"
-msgstr ""
+msgstr "Mot de passe"
 
 #: soundcloud_export_selector.cc:46
 msgid "Make files public"
-msgstr ""
+msgstr "Rendre les fichiers publics"
 
 #: soundcloud_export_selector.cc:47
 msgid "Open uploaded files in browser"
-msgstr ""
+msgstr "Ouvrir les fichiers téléversés dans le navigateur"
 
 #: soundcloud_export_selector.cc:48
 msgid "Make files downloadable"
-msgstr ""
+msgstr "Rendre les fichiers téléchargeables"
 
 #: soundcloud_export_selector.cc:107
 msgid "%1: %2 of %3 bytes uploaded"
-msgstr ""
+msgstr "%1: %2 sur %3 octets téléversés"
 
-#: splash.cc:73
+#: splash.cc:78
 msgid "%1 loading ..."
 msgstr "Chargement de %1…"
 
@@ -12303,7 +14249,7 @@ msgstr "Supprimer le haut-parleur"
 msgid "Azimuth:"
 msgstr "Azimuth :"
 
-#: startup.cc:67
+#: startup.cc:71
 msgid ""
 "Use an external mixer or the hardware mixer of your audio interface.\n"
 "%1 will play NO role in monitoring"
@@ -12311,11 +14257,11 @@ msgstr ""
 "Utiliser une console de mixage externe ou celle de l'interface audio.\n"
 "(%1 ne jouera AUCUN rôle dans le monitoring)"
 
-#: startup.cc:69
+#: startup.cc:73
 msgid "Ask %1 to play back material as it is being recorded"
 msgstr "Demander à %1 de diffuser le signal pendant l'enregistrement"
 
-#: startup.cc:142
+#: startup.cc:146
 msgid ""
 "<span size=\"larger\">%1 is a digital audio workstation. You can use it to "
 "record, edit and mix multi-track audio. You can produce your own CDs, mix "
@@ -12331,15 +14277,15 @@ msgstr ""
 "\n"
 "Nous allons configurer le logiciel avant que vous ne l'utilisiez.</span> "
 
-#: startup.cc:168
+#: startup.cc:172
 msgid "Welcome to %1"
-msgstr "Bienvenue dans Ardour"
+msgstr "Bienvenue dans %1"
 
-#: startup.cc:191
+#: startup.cc:195
 msgid "Default folder for %1 sessions"
 msgstr "Dossier par défaut des sessions %1"
 
-#: startup.cc:197
+#: startup.cc:201
 msgid ""
 "Each project that you work on with %1 has its own folder.\n"
 "These can require a lot of disk space if you are recording audio.\n"
@@ -12356,11 +14302,11 @@ msgstr ""
 "<i>(Vous pourrez créer des sessions n'importe où, c'est juste une valeur par "
 "défaut)</i>"
 
-#: startup.cc:220
+#: startup.cc:224
 msgid "Default folder for new sessions"
 msgstr "Dossier par défaut des nouvelles sessions"
 
-#: startup.cc:241
+#: startup.cc:245
 msgid ""
 "While recording instruments or vocals, you probably want to listen to the\n"
 "signal as well as record it. This is called \"monitoring\". There are\n"
@@ -12376,23 +14322,24 @@ msgstr ""
 "Lors de l'enregistrement des instruments ou des voix, vous voudrez\n"
 "certainement entendre le signal simultanément à son enregistrement. Ceci\n"
 "est appelé le \"monitoring\".\n"
-"Il existe différentes manières de le faire, selon le matériel et sa"
-"configuration. Les deux manières les plus courantes sont présentées ici.\n"
+"Il existe différentes manières de le faire, selon le matériel et "
+"saconfiguration. Les deux manières les plus courantes sont présentées ici.\n"
 "Veuillez en choisir une convenant à votre configuration.\n"
 "\n"
-"<i>(Ce choix peut être modifié à tout moment, dans le dialogue des Préférences)</i>\n"
+"<i>(Ce choix peut être modifié à tout moment, dans le dialogue des "
+"Préférences)</i>\n"
 "\n"
 "<i>Si vous ne savez pas quoi choisir, conservez l'option par défaut.</i>"
 
-#: startup.cc:262
+#: startup.cc:266
 msgid "Monitoring Choices"
 msgstr "Choix du monitoring"
 
-#: startup.cc:285
+#: startup.cc:289
 msgid "Use a Master bus directly"
 msgstr "Utiliser directement le bus principal (le \"master\")"
 
-#: startup.cc:287
+#: startup.cc:291
 msgid ""
 "Connect the Master bus directly to your hardware outputs. This is preferable "
 "for simple usage."
@@ -12400,11 +14347,11 @@ msgstr ""
 "Connecter le bus principal directement aux sorties matérielles. Cette "
 "configuration est préférable pour une utilisation simple."
 
-#: startup.cc:296
+#: startup.cc:300
 msgid "Use an additional Monitor bus"
 msgstr "Utiliser un bus de monitoring supplémentaire"
 
-#: startup.cc:299
+#: startup.cc:303
 msgid ""
 "Use a Monitor bus between Master bus and hardware outputs for \n"
 "greater control in monitoring without affecting the mix."
@@ -12413,8 +14360,7 @@ msgstr ""
 "sorties matérielles pour un plus grand contrôle de l'écoute monitoring\n"
 "sans affecter le mixage."
 
-#: startup.cc:321
-#, fuzzy
+#: startup.cc:325
 msgid ""
 "<i>You can change this preference at any time via the Preferences dialog.\n"
 "You can also add or remove the monitor section to/from any session.</i>\n"
@@ -12422,88 +14368,84 @@ msgid ""
 "<i>If you do not understand what this is about, just accept the default.</i>"
 msgstr ""
 "<i>Ceci peut être changé à tout moment dans le dialogue de Préférences.\n"
-"Vous pouvez aussi ajouter ou retirer la section d'écoute de toute session.</"
-"i>\n"
+"Vous pouvez aussi ajouter ou retirer la tranche de monitoring de toute "
+"session.</i>\n"
 "\n"
 "<i>Si vous ne voyez pas de quoi il s'agit, acceptez le choix par défaut.</i>"
 
-#: startup.cc:332
+#: startup.cc:336
 msgid "Monitor Section"
 msgstr "Section Monitoring"
 
-#: step_entry.cc:60
+#: step_entry.cc:59
 #, fuzzy
 msgid "Step Entry: %1"
-msgstr "Pas-à-pas : %1"
+msgstr "Pas-à-pas : %1"
 
-#: step_entry.cc:65
+#: step_entry.cc:64
 msgid ">beat"
 msgstr ">temps"
 
-#: step_entry.cc:66
+#: step_entry.cc:65
 msgid ">bar"
 msgstr ">mesure"
 
-#: step_entry.cc:67
+#: step_entry.cc:66
 msgid ">EP"
-msgstr ""
+msgstr ">EP"
 
-#: step_entry.cc:68
+#: step_entry.cc:67
 msgid "sustain"
-msgstr ""
+msgstr "tenue"
 
-#: step_entry.cc:69
+#: step_entry.cc:68
 #, fuzzy
 msgid "rest"
 msgstr "Silence"
 
-#: step_entry.cc:70
+#: step_entry.cc:69
 #, fuzzy
 msgid "g-rest"
 msgstr "G"
 
-#: step_entry.cc:71
+#: step_entry.cc:70
 msgid "back"
 msgstr "retour"
 
-#: step_entry.cc:82 step_entry.cc:85
-msgid "+"
-msgstr "+"
-
 #: step_entry.cc:191
 #, fuzzy
 msgid "Set note length to a whole note"
-msgstr "Durée de la note : blanche"
+msgstr "Durée de la note : blanche"
 
 #: step_entry.cc:192
 #, fuzzy
 msgid "Set note length to a half note"
-msgstr "Durée de la note : noire"
+msgstr "Durée de la note : noire"
 
 #: step_entry.cc:193
 #, fuzzy
 msgid "Set note length to a quarter note"
-msgstr "Durée de la note : croche"
+msgstr "Durée de la note : croche"
 
 #: step_entry.cc:194
 #, fuzzy
 msgid "Set note length to a eighth note"
-msgstr "Durée de la note : double croche"
+msgstr "Durée de la note : double croche"
 
 #: step_entry.cc:195
 #, fuzzy
 msgid "Set note length to a sixteenth note"
-msgstr "Durée de la note : triple croche"
+msgstr "Durée de la note : triple croche"
 
 #: step_entry.cc:196
 #, fuzzy
 msgid "Set note length to a thirty-second note"
-msgstr "Durée de la note : quadruple croche"
+msgstr "Durée de la note : quadruple croche"
 
 #: step_entry.cc:197
 #, fuzzy
 msgid "Set note length to a sixty-fourth note"
-msgstr "Durée de la note : quintuple croche"
+msgstr "Durée de la note : quintuple croche"
 
 #: step_entry.cc:276
 msgid "Set volume (velocity) to pianississimo"
@@ -12530,13 +14472,12 @@ msgid "Set volume (velocity) to forte"
 msgstr "Définir le volume (vélocité) à forte"
 
 #: step_entry.cc:282
-#, fuzzy
 msgid "Set volume (velocity) to fortissimo"
 msgstr "Définir le volume (vélocité) à fortissimo"
 
 #: step_entry.cc:283
 msgid "Set volume (velocity) to fortississimo"
-msgstr ""
+msgstr "Définir le volume (vélocité) à fortississimo"
 
 #: step_entry.cc:331
 msgid "Stack inserted notes to form a chord"
@@ -12545,7 +14486,7 @@ msgstr "Empiler les notes pour former un accord"
 #: step_entry.cc:332
 #, fuzzy
 msgid "Extend selected notes by note length"
-msgstr "Notes sélectionnées : étendre à la durée de note"
+msgstr "Notes sélectionnées : étendre à la durée de note"
 
 #: step_entry.cc:333
 #, fuzzy
@@ -12553,19 +14494,16 @@ msgid "Use undotted note lengths"
 msgstr "Note non pointée"
 
 #: step_entry.cc:334
-#, fuzzy
 msgid "Use dotted (* 1.5) note lengths"
-msgstr "Note pointée (durée X 1,5)"
+msgstr "Note pointée (durée × 1,5)"
 
 #: step_entry.cc:335
-#, fuzzy
 msgid "Use double-dotted (* 1.75) note lengths"
-msgstr "Note double-pointée (durée X 1,75)"
+msgstr "Note double-pointée (durée × 1,75)"
 
 #: step_entry.cc:336
-#, fuzzy
 msgid "Use triple-dotted (* 1.875) note lengths"
-msgstr "Note triple-pointée (durée X 7/8)"
+msgstr "Note triple-pointée (durée × 7/8)"
 
 #: step_entry.cc:337
 #, fuzzy
@@ -12593,12 +14531,12 @@ msgstr "Ajouter un message de changement de banque"
 msgid "Insert a program change message"
 msgstr "Ajouter un message de changement de programme"
 
-#: step_entry.cc:343 step_entry.cc:700
+#: step_entry.cc:343 step_entry.cc:645
 #, fuzzy
 msgid "Move Insert Position Back by Note Length"
 msgstr "Reculer la position d'insertion d'une durée de Note"
 
-#: step_entry.cc:344 step_entry.cc:698
+#: step_entry.cc:344 step_entry.cc:643
 msgid "Move Insert Position to Edit Point"
 msgstr "Déplacer le point d'insertion au point d'édition"
 
@@ -12610,266 +14548,264 @@ msgstr "1 / Note"
 msgid "Octave"
 msgstr "Octave"
 
-#: step_entry.cc:598
+#: step_entry.cc:592
 msgid "Insert Note A"
 msgstr "Insérer un la"
 
-#: step_entry.cc:599
+#: step_entry.cc:593
 msgid "Insert Note A-sharp"
 msgstr "Insérer un la dièse"
 
-#: step_entry.cc:600
+#: step_entry.cc:594
 msgid "Insert Note B"
 msgstr "Insérer un si"
 
-#: step_entry.cc:601
+#: step_entry.cc:595
 msgid "Insert Note C"
 msgstr "Insérer un do"
 
-#: step_entry.cc:602
+#: step_entry.cc:596
 msgid "Insert Note C-sharp"
 msgstr "Insérer un do dièse"
 
-#: step_entry.cc:603
+#: step_entry.cc:597
 msgid "Insert Note D"
 msgstr "Insérer un ré"
 
-#: step_entry.cc:604
+#: step_entry.cc:598
 msgid "Insert Note D-sharp"
 msgstr "Insérer un ré dièse"
 
-#: step_entry.cc:605
+#: step_entry.cc:599
 msgid "Insert Note E"
 msgstr "Insérer un mi"
 
-#: step_entry.cc:606
+#: step_entry.cc:600
 msgid "Insert Note F"
 msgstr "Insérer un fa"
 
-#: step_entry.cc:607
+#: step_entry.cc:601
 msgid "Insert Note F-sharp"
 msgstr "Insérer un fa dièse"
 
-#: step_entry.cc:608
+#: step_entry.cc:602
 msgid "Insert Note G"
 msgstr "Insérer un sol"
 
-#: step_entry.cc:609
+#: step_entry.cc:603
 msgid "Insert Note G-sharp"
 msgstr "Insérer un sol dièse"
 
-#: step_entry.cc:611
+#: step_entry.cc:605
 #, fuzzy
 msgid "Insert a Note-length Rest"
 msgstr "Insérer un silence (durée de Note)"
 
-#: step_entry.cc:612
-#, fuzzy
+#: step_entry.cc:606
 msgid "Insert a Snap-length Rest"
-msgstr "Insérer un silence (durée de Note)"
+msgstr "Insérer un silence (durée d'aimantation)"
 
-#: step_entry.cc:614 step_entry.cc:615
+#: step_entry.cc:608 step_entry.cc:609
 msgid "Move to next octave"
 msgstr "Déplacer au prochain octave"
 
-#: step_entry.cc:617
+#: step_entry.cc:611
 #, fuzzy
 msgid "Move to Next Note Length"
-msgstr "A la prochaine durée de note"
+msgstr "Aller à la prochaine durée de note"
 
-#: step_entry.cc:618
-#, fuzzy
+#: step_entry.cc:612
 msgid "Move to Previous Note Length"
-msgstr "A la précédente durée de note"
+msgstr "Aller à la précédente durée de note"
 
-#: step_entry.cc:620
+#: step_entry.cc:614
 msgid "Increase Note Length"
 msgstr "Augmenter la durée de la note"
 
-#: step_entry.cc:621
+#: step_entry.cc:615
 msgid "Decrease Note Length"
 msgstr "Diminuer la durée de la note"
 
-#: step_entry.cc:623
-#, fuzzy
+#: step_entry.cc:617
 msgid "Move to Next Note Velocity"
-msgstr "A la prochaine vélocité de note"
+msgstr "Aller à la prochaine vélocité de note"
 
-#: step_entry.cc:624
-#, fuzzy
+#: step_entry.cc:618
 msgid "Move to Previous Note Velocity"
-msgstr "A la précédente vélocité de note"
+msgstr "Aller à la précédente vélocité de note"
 
-#: step_entry.cc:626
+#: step_entry.cc:620
 msgid "Increase Note Velocity"
 msgstr "Augmenter la vélocité de la note"
 
-#: step_entry.cc:627
+#: step_entry.cc:621
 msgid "Decrease Note Velocity"
 msgstr "Diminuer la vélocité de la note"
 
-#: step_entry.cc:629
+#: step_entry.cc:623
 msgid "Switch to the 1st octave"
 msgstr "Passer à la 1re octave"
 
-#: step_entry.cc:630
+#: step_entry.cc:624
 msgid "Switch to the 2nd octave"
 msgstr "Passer à la 2e octave"
 
-#: step_entry.cc:631
+#: step_entry.cc:625
 msgid "Switch to the 3rd octave"
 msgstr "Passer à la 3e octave"
 
-#: step_entry.cc:632
+#: step_entry.cc:626
 msgid "Switch to the 4th octave"
 msgstr "Passer à la 4e octave"
 
-#: step_entry.cc:633
+#: step_entry.cc:627
 msgid "Switch to the 5th octave"
 msgstr "Passer à la 5e octave"
 
-#: step_entry.cc:634
+#: step_entry.cc:628
 msgid "Switch to the 6th octave"
 msgstr "Passer à la 6e octave"
 
-#: step_entry.cc:635
+#: step_entry.cc:629
 msgid "Switch to the 7th octave"
 msgstr "Passer à la 7e octave"
 
-#: step_entry.cc:636
+#: step_entry.cc:630
 msgid "Switch to the 8th octave"
 msgstr "Passer à la 8e octave"
 
-#: step_entry.cc:637
+#: step_entry.cc:631
 msgid "Switch to the 9th octave"
 msgstr "Passer à la 9e octave"
 
-#: step_entry.cc:638
+#: step_entry.cc:632
 msgid "Switch to the 10th octave"
 msgstr "Passer à la 10e octave"
 
-#: step_entry.cc:639
+#: step_entry.cc:633
 msgid "Switch to the 11th octave"
 msgstr "Passer à la 11e octave"
 
-#: step_entry.cc:644
+#: step_entry.cc:635
+msgid "Toggle Triple Notes"
+msgstr "Activer/désactiver les triolets"
+
+#: step_entry.cc:638
+msgid "Toggle Chord Entry"
+msgstr "(Dés)Activer la saisie d'accords"
+
+#: step_entry.cc:640
+#, fuzzy
+msgid "Sustain Selected Notes by Note Length"
+msgstr "Prolonger les notes sélectionnées de la durée de note"
+
+#: step_entry.cc:650
 #, fuzzy
 msgid "Set Note Length to Whole"
-msgstr "Durée de la note : Entière"
+msgstr "Durée de la note : Entière"
 
-#: step_entry.cc:646
+#: step_entry.cc:652
 msgid "Set Note Length to 1/2"
-msgstr "Durée de la note : 1/2"
+msgstr "Durée de la note : 1/2"
 
-#: step_entry.cc:648
+#: step_entry.cc:654
 #, fuzzy
 msgid "Set Note Length to 1/3"
-msgstr "Durée de la note : 1/3"
+msgstr "Durée de la note : 1/3"
 
-#: step_entry.cc:650
+#: step_entry.cc:656
 #, fuzzy
 msgid "Set Note Length to 1/4"
-msgstr "Durée de la note : 1/4"
+msgstr "Durée de la note : 1/4"
 
-#: step_entry.cc:652
+#: step_entry.cc:658
 #, fuzzy
 msgid "Set Note Length to 1/8"
-msgstr "Durée de la note : 1/8"
+msgstr "Durée de la note : 1/8"
 
-#: step_entry.cc:654
+#: step_entry.cc:660
 #, fuzzy
 msgid "Set Note Length to 1/16"
-msgstr "Durée de la note : 1/16"
+msgstr "Durée de la note : 1/16"
 
-#: step_entry.cc:656
+#: step_entry.cc:662
 #, fuzzy
 msgid "Set Note Length to 1/32"
-msgstr "Durée de la note : 1/32"
+msgstr "Durée de la note : 1/32"
 
-#: step_entry.cc:658
+#: step_entry.cc:664
 #, fuzzy
 msgid "Set Note Length to 1/64"
-msgstr "Durée de la note : 1/64"
+msgstr "Durée de la note : 1/64"
 
-#: step_entry.cc:663
+#: step_entry.cc:669
 #, fuzzy
 msgid "Set Note Velocity to Pianississimo"
-msgstr "Vélocité de la note : Pianississimo"
+msgstr "Vélocité de la note : Pianississimo"
 
-#: step_entry.cc:665
+#: step_entry.cc:671
 #, fuzzy
 msgid "Set Note Velocity to Pianissimo"
-msgstr "Vélocité de la note : Pianissimo"
+msgstr "Vélocité de la note : Pianissimo"
 
-#: step_entry.cc:667
+#: step_entry.cc:673
 #, fuzzy
 msgid "Set Note Velocity to Piano"
-msgstr "Vélocité de la note : Piano"
+msgstr "Vélocité de la note : Piano"
 
-#: step_entry.cc:669
+#: step_entry.cc:675
 #, fuzzy
 msgid "Set Note Velocity to Mezzo-Piano"
-msgstr "Vélocité de la note : Mezzo-Piano"
+msgstr "Vélocité de la note : Mezzo-Piano"
 
-#: step_entry.cc:671
+#: step_entry.cc:677
 #, fuzzy
 msgid "Set Note Velocity to Mezzo-Forte"
-msgstr "Vélocité de la note : Mezzo-Forte"
+msgstr "Vélocité de la note : Mezzo-Forte"
 
-#: step_entry.cc:673
+#: step_entry.cc:679
 #, fuzzy
 msgid "Set Note Velocity to Forte"
-msgstr "Vélocité de la note : Forte"
+msgstr "Vélocité de la note : Forte"
 
-#: step_entry.cc:675 step_entry.cc:677
+#: step_entry.cc:681 step_entry.cc:683
 #, fuzzy
 msgid "Set Note Velocity to Fortississimo"
-msgstr "Vélocité de la note : Fortississimo"
-
-#: step_entry.cc:679
-msgid "Toggle Triple Notes"
-msgstr ""
+msgstr "Vélocité de la note : Fortississimo"
 
-#: step_entry.cc:684
+#: step_entry.cc:688
 msgid "No Dotted Notes"
 msgstr "Pas de notes pointées"
 
-#: step_entry.cc:686
+#: step_entry.cc:689
 #, fuzzy
 msgid "Toggled Dotted Notes"
 msgstr "Notes Pointées"
 
-#: step_entry.cc:688
+#: step_entry.cc:690
 #, fuzzy
 msgid "Toggled Double-Dotted Notes"
 msgstr "Notes Double-pointées"
 
-#: step_entry.cc:690
+#: step_entry.cc:691
 #, fuzzy
 msgid "Toggled Triple-Dotted Notes"
 msgstr "Notes Triple-pointées"
 
-#: step_entry.cc:693
-#, fuzzy
-msgid "Toggle Chord Entry"
-msgstr "Basculer en entrée d'accord"
-
-#: step_entry.cc:695
-#, fuzzy
-msgid "Sustain Selected Notes by Note Length"
-msgstr "Prolonger les notes sélectionnées de la durée de note"
-
-#: stereo_panner.cc:133
+#: stereo_panner.cc:129
 #, c-format
 msgid "L:%3d R:%3d Width:%d%%"
 msgstr "G : %3d D : %3d Stéréo : %d%%"
 
-#: stereo_panner_editor.cc:35
-#, fuzzy
+#: stereo_panner.cc:272
+msgid "Panner|M"
+msgstr ""
+
+#: stereo_panner_editor.cc:37
 msgid "Stereo Panner"
-msgstr "Panoramique stéréo"
+msgstr "Balance stéréo"
 
-#: stereo_panner_editor.cc:49
+#: stereo_panner_editor.cc:51
 #, fuzzy
 msgid "Width"
 msgstr "Largeur"
@@ -12879,180 +14815,193 @@ msgstr "Largeur"
 msgid "Strip Silence"
 msgstr "Enlever le silence"
 
-#: strip_silence_dialog.cc:75
+#: strip_silence_dialog.cc:65
+msgid "Threshold"
+msgstr "Seuil"
+
+#: strip_silence_dialog.cc:76
 #, fuzzy
 msgid "Minimum length"
 msgstr "Durée minimum"
 
-#: strip_silence_dialog.cc:83
+#: strip_silence_dialog.cc:84
 #, fuzzy
 msgid "Fade length"
 msgstr "Durée du fondu"
 
-#: tempo_dialog.cc:41 tempo_dialog.cc:57
+#: strip_silence_dialog.cc:111 strip_silence_dialog.cc:298
+msgid "Analyzing"
+msgstr ""
+
+#: tempo_dialog.cc:43 tempo_dialog.cc:60
 msgid "bar:"
 msgstr "Mesure :"
 
-#: tempo_dialog.cc:42 tempo_dialog.cc:58
+#: tempo_dialog.cc:44 tempo_dialog.cc:61
 msgid "beat:"
 msgstr "Temps :"
 
-#: tempo_dialog.cc:43 tempo_dialog.cc:59
+#: tempo_dialog.cc:45 tempo_dialog.cc:62
 #, fuzzy
 msgid "Pulse note"
 msgstr "Note percussive"
 
-#: tempo_dialog.cc:44 tempo_dialog.cc:60
+#: tempo_dialog.cc:46 tempo_dialog.cc:63
 msgid "Tap tempo"
-msgstr ""
-
-#: tempo_dialog.cc:54
-msgid "Edit Tempo"
-msgstr "Édition du tempo"
+msgstr "Battre le tempo"
 
-#: tempo_dialog.cc:77 tempo_dialog.cc:78 tempo_dialog.cc:324
-#: tempo_dialog.cc:325
+#: tempo_dialog.cc:81 tempo_dialog.cc:82 tempo_dialog.cc:448
+#: tempo_dialog.cc:449
 msgid "whole"
 msgstr "Ronde"
 
-#: tempo_dialog.cc:79 tempo_dialog.cc:80 tempo_dialog.cc:326
-#: tempo_dialog.cc:327
+#: tempo_dialog.cc:83 tempo_dialog.cc:84 tempo_dialog.cc:450
+#: tempo_dialog.cc:451
 msgid "second"
 msgstr "Blanche"
 
-#: tempo_dialog.cc:81 tempo_dialog.cc:82 tempo_dialog.cc:328
-#: tempo_dialog.cc:329
+#: tempo_dialog.cc:85 tempo_dialog.cc:86 tempo_dialog.cc:452
+#: tempo_dialog.cc:453
 msgid "third"
 msgstr "Noire pointée"
 
-#: tempo_dialog.cc:83 tempo_dialog.cc:84 tempo_dialog.cc:330
-#: tempo_dialog.cc:331
+#: tempo_dialog.cc:87 tempo_dialog.cc:88 tempo_dialog.cc:454
+#: tempo_dialog.cc:455
 msgid "quarter"
 msgstr "Noire"
 
-#: tempo_dialog.cc:85 tempo_dialog.cc:86 tempo_dialog.cc:332
-#: tempo_dialog.cc:333
+#: tempo_dialog.cc:89 tempo_dialog.cc:90 tempo_dialog.cc:456
+#: tempo_dialog.cc:457
 msgid "eighth"
 msgstr "Croche "
 
-#: tempo_dialog.cc:87 tempo_dialog.cc:88 tempo_dialog.cc:334
-#: tempo_dialog.cc:335
+#: tempo_dialog.cc:91 tempo_dialog.cc:92 tempo_dialog.cc:458
+#: tempo_dialog.cc:459
 msgid "sixteenth"
 msgstr "Double croche"
 
-#: tempo_dialog.cc:89 tempo_dialog.cc:90 tempo_dialog.cc:336
-#: tempo_dialog.cc:337
+#: tempo_dialog.cc:93 tempo_dialog.cc:94 tempo_dialog.cc:460
+#: tempo_dialog.cc:461
 msgid "thirty-second"
 msgstr "Triple croche"
 
-#: tempo_dialog.cc:91 tempo_dialog.cc:92 tempo_dialog.cc:338
-#: tempo_dialog.cc:339
+#: tempo_dialog.cc:95 tempo_dialog.cc:96 tempo_dialog.cc:462
+#: tempo_dialog.cc:463
 msgid "sixty-fourth"
 msgstr "Quadruple croche"
 
-#: tempo_dialog.cc:93 tempo_dialog.cc:94 tempo_dialog.cc:340
-#: tempo_dialog.cc:341
+#: tempo_dialog.cc:97 tempo_dialog.cc:98 tempo_dialog.cc:464
+#: tempo_dialog.cc:465
 msgid "one-hundred-twenty-eighth"
 msgstr "Quintuple croche"
 
-#: tempo_dialog.cc:121
+#: tempo_dialog.cc:115 tempo_dialog.cc:116
+msgid "ramped"
+msgstr ""
+
+#: tempo_dialog.cc:117 tempo_dialog.cc:118
+msgid "constant"
+msgstr ""
+
+#: tempo_dialog.cc:133 tempo_dialog.cc:134 tempo_dialog.cc:482
+#: tempo_dialog.cc:483
+msgid "music"
+msgstr ""
+
+#: tempo_dialog.cc:161
 msgid "Beats per minute:"
 msgstr "Battements par minute :"
 
-#: tempo_dialog.cc:155
+#: tempo_dialog.cc:195
 msgid "Tempo begins at"
 msgstr "Le tempo démarre à"
 
-#: tempo_dialog.cc:251
+#: tempo_dialog.cc:201
+msgid "Lock Style:"
+msgstr ""
+
+#: tempo_dialog.cc:209
+msgid "Tempo Type:"
+msgstr ""
+
+#: tempo_dialog.cc:321
 msgid "incomprehensible pulse note type (%1)"
+msgstr "type de rythmique incompréhensible (%1) "
+
+#: tempo_dialog.cc:334
+msgid "incomprehensible tempo type (%1)"
 msgstr ""
 
-#: tempo_dialog.cc:307
-msgid "Edit Meter"
-msgstr "Éditer signature"
+#: tempo_dialog.cc:347
+msgid "incomprehensible lock style (%1)"
+msgstr ""
 
-#: tempo_dialog.cc:356
+#: tempo_dialog.cc:498
 msgid "Note value:"
 msgstr "Valeur de note :"
 
-#: tempo_dialog.cc:357
+#: tempo_dialog.cc:499
+msgid "Lock style:"
+msgstr ""
+
+#: tempo_dialog.cc:500
 msgid "Beats per bar:"
 msgstr "Temps par mesure :"
 
-#: tempo_dialog.cc:371
+#: tempo_dialog.cc:514
 msgid "Meter begins at bar:"
 msgstr "La signature commence à la mesure :"
 
-#: tempo_dialog.cc:484
+#: tempo_dialog.cc:638
 msgid "incomprehensible meter note type (%1)"
-msgstr ""
-
-#: theme_manager.cc:65
-msgid "Dark Theme"
-msgstr "Thème sombre"
-
-#: theme_manager.cc:66
-msgid "Light Theme"
-msgstr "Thème clair"
+msgstr "type de signature incompréhensible (%1)"
 
-#: theme_manager.cc:67
-msgid "Restore Defaults"
-msgstr "Restaurer la configuration par défaut"
+#: tempo_dialog.cc:651
+msgid "incomprehensible meter lock style (%1)"
+msgstr ""
 
-#: theme_manager.cc:68
+#: theme_manager.cc:53
 msgid "Draw \"flat\" buttons"
 msgstr "Afficher des boutons « plats »"
 
-#: theme_manager.cc:69
+#: theme_manager.cc:54
 msgid "Blink Rec-Arm buttons"
-msgstr ""
+msgstr "Faire clignoter les boutons d'armement d'enregistrement"
 
-#: theme_manager.cc:70
+#: theme_manager.cc:55
 msgid "Color regions using their track's color"
 msgstr "Appliquer la couleur de la piste aux régions"
 
-#: theme_manager.cc:71
+#: theme_manager.cc:56
 msgid "Show waveform clipping"
-msgstr ""
+msgstr "Montrer l’écrêtage des formes d'ondes"
 
-#: theme_manager.cc:73
+#: theme_manager.cc:58
 msgid "Waveforms color gradient depth"
-msgstr ""
+msgstr "Profondeur de dégradé des couleurs de formes d'ondes"
 
-#: theme_manager.cc:75
+#: theme_manager.cc:60
 msgid "Timeline item gradient depth"
-msgstr ""
+msgstr "Profondeur de dégradé des éléments de la timeline"
 
-#: theme_manager.cc:76
+#: theme_manager.cc:61
 #, fuzzy
 msgid "All floating windows are dialogs"
 msgstr "Les fenêtres flottantes sont des boites de dialogues."
 
-#: theme_manager.cc:77
+#: theme_manager.cc:62
 msgid "Transient windows follow front window."
-msgstr ""
-
-#: theme_manager.cc:78
-msgid "Icon Set"
-msgstr ""
-
-#: theme_manager.cc:87
-msgid "Object"
-msgstr "Objet"
-
-#: theme_manager.cc:163
-msgid "Items"
-msgstr ""
+msgstr "les fenêtres des transitoires suivent la fenêtre au premier plan."
 
-#: theme_manager.cc:164
-msgid "Palette"
+#: theme_manager.cc:63
+msgid "Float detached monitor-section window"
 msgstr ""
 
-#: theme_manager.cc:165
-msgid "Transparency"
-msgstr ""
+#: theme_manager.cc:64
+msgid "Icon Set"
+msgstr "Jeu d'icônes"
 
-#: theme_manager.cc:195
+#: theme_manager.cc:132
 #, fuzzy
 msgid ""
 "Mark all floating windows to be type \"Dialog\" rather than using \"Utility"
@@ -13065,94 +15014,100 @@ msgstr ""
 "Cela peut aider certains gestionnaires de fenetres (WM), et nécessite un "
 "redémarrage d'%1 pour prendre effet."
 
-#: theme_manager.cc:199
+#: theme_manager.cc:136
 msgid ""
 "Make transient windows follow the front window when toggling between the "
 "editor and mixer.\n"
 "This requires a restart of %1 to take effect"
 msgstr ""
+"Impose aux fenêtres de dialogue de suivre la fenêtre au premier plan "
+"lors du basculement entre l'éditeur et le mixeur.\n"
+"Nécessite un redémarrage de %1"
 
-#: theme_manager.cc:620
-msgid "Color Palette"
+#: theme_manager.cc:139
+msgid ""
+"When detaching the monitoring section, mark it as \"Utility\" window to stay "
+"in front.\n"
+"This requires a restart of %1 to take effect"
 msgstr ""
 
 #: time_axis_view.cc:148
 msgid "Track/Bus name (double click to edit)"
 msgstr "Nom piste/bus (double cliquer pour éditer)"
 
-#: time_axis_view_item.cc:345
+#: time_axis_view_item.cc:326
 msgid "new duration %1 frame is out of bounds for %2"
 msgid_plural "new duration of %1 frames is out of bounds for %2"
 msgstr[0] "la nouvelle durée d'%1 trame est hors limites pour %2"
 msgstr[1] "la nouvelle durée de %1 trames est hors limites pour %2"
 
-#: time_fx_dialog.cc:62
+#: time_fx_dialog.cc:60
 msgid "Quick but Ugly"
 msgstr "rapide, basse qualité"
 
-#: time_fx_dialog.cc:63
+#: time_fx_dialog.cc:61
 msgid "Skip Anti-aliasing"
 msgstr "Pas d'anti-crénelage"
 
-#: time_fx_dialog.cc:64
-msgid "Contents:"
-msgstr "Contenu :"
+#: time_fx_dialog.cc:62
+msgid "Contents"
+msgstr ""
 
-#: time_fx_dialog.cc:65
+#: time_fx_dialog.cc:63
 #, fuzzy
 msgid "Minimize time distortion"
 msgstr "Minimiser la distorsion temporelle"
 
-#: time_fx_dialog.cc:66
+#: time_fx_dialog.cc:64
 msgid "Preserve Formants"
-msgstr ""
+msgstr "Préserver les formants"
 
-#: time_fx_dialog.cc:71
+#: time_fx_dialog.cc:81
 #, fuzzy
 msgid "TimeFXDialog"
 msgstr "TimeFXDialog"
 
-#: time_fx_dialog.cc:74
+#: time_fx_dialog.cc:84
 msgid "Pitch Shift Audio"
 msgstr "Décalage de tonalité audio"
 
-#: time_fx_dialog.cc:76
+#: time_fx_dialog.cc:86
 msgid "Time Stretch Audio"
 msgstr "Étirer/contracter audio"
 
-#: time_fx_dialog.cc:104 transpose_dialog.cc:41
+#: time_fx_dialog.cc:114 transpose_dialog.cc:41
 msgid "Octaves:"
 msgstr "Octaves :"
 
-#: time_fx_dialog.cc:109 transpose_dialog.cc:46
+#: time_fx_dialog.cc:119 transpose_dialog.cc:46
 msgid "Semitones:"
 msgstr "Demi-tons :"
 
-#: time_fx_dialog.cc:114
+#: time_fx_dialog.cc:124
 msgid "Cents:"
 msgstr "Cents :"
 
-#: time_fx_dialog.cc:122
+#: time_fx_dialog.cc:132
 msgid "Time|Shift"
 msgstr "Décaler"
 
-#: time_fx_dialog.cc:146 time_fx_dialog.cc:149
+#: time_fx_dialog.cc:184 time_fx_dialog.cc:188
 msgid "TimeFXButton"
 msgstr "TimeFXButton"
 
-#: time_fx_dialog.cc:154
+#: time_fx_dialog.cc:193
 msgid "Stretch/Shrink"
 msgstr "Étirer/contracter"
 
-#: time_fx_dialog.cc:164
+#: time_fx_dialog.cc:203
 msgid "<b>Progress</b>"
 msgstr "<b>Avancement</b>"
 
-#: time_info_box.cc:124
+#: time_info_box.cc:118
 msgid "Start recording at auto-punch start"
 msgstr "Démarrer l'enregistrement au punch-in"
 
-#: time_info_box.cc:125
+#: time_info_box.cc:119
 msgid "Stop recording at auto-punch end"
 msgstr "Stopper l'enregistrement au punch-out"
 
@@ -13163,32 +15118,31 @@ msgstr "programming error: request for non-existent audio range (%1)!"
 
 #: transform_dialog.cc:39
 msgid "this note's"
-msgstr ""
+msgstr "celui de cette note"
 
 #: transform_dialog.cc:40
-#, fuzzy
 msgid "the previous note's"
-msgstr "A la précédente durée de note"
+msgstr "Celui de la note précédente"
 
 #: transform_dialog.cc:41
 msgid "this note's index"
-msgstr ""
+msgstr "index de cette note"
 
 #: transform_dialog.cc:42
 msgid "the number of notes"
-msgstr ""
+msgstr "le nombre de notes"
 
 #: transform_dialog.cc:43
 msgid "exactly"
-msgstr ""
+msgstr "exactement"
 
 #: transform_dialog.cc:44
 msgid "a random number from"
-msgstr ""
+msgstr "un nombre aléatoire de"
 
 #: transform_dialog.cc:55
 msgid "equal steps from"
-msgstr ""
+msgstr "des pas égaux de"
 
 #: transform_dialog.cc:58
 #, fuzzy
@@ -13196,27 +15150,25 @@ msgid "note number"
 msgstr "numéro de note"
 
 #: transform_dialog.cc:59
-#, fuzzy
 msgid "velocity"
-msgstr "Vélocité"
+msgstr "vélocité"
 
 #: transform_dialog.cc:60
 msgid "start time"
-msgstr ""
+msgstr "temps de début"
 
 #: transform_dialog.cc:61
-#, fuzzy
 msgid "length"
-msgstr "Durée"
+msgstr "durée"
 
 #: transform_dialog.cc:82 transform_dialog.cc:113
 msgid "Transform"
-msgstr ""
+msgstr "Transformer"
 
 #: transform_dialog.cc:91
 #, fuzzy
 msgid "Set "
-msgstr "Créer une boucle à partir de l'intervalle"
+msgstr "Créer"
 
 #: transpose_dialog.cc:30
 msgid "Transpose MIDI"
@@ -13226,111 +15178,147 @@ msgstr "Transposer le MIDI"
 msgid "Transpose"
 msgstr "Transposer"
 
-#: ui_config.cc:163 ui_config.cc:300
+#: ui_config.cc:234 ui_config.cc:417
 msgid "Loading default ui configuration file %1"
 msgstr ""
 "Chargement du fichier de style par défaut (%1) pour l'interface graphique"
 
-#: ui_config.cc:166 ui_config.cc:303
+#: ui_config.cc:237 ui_config.cc:420
 msgid "cannot read default ui configuration file \"%1\""
 msgstr ""
 "impossible de lire le fichier de configuration d'interface graphique par "
 "défaut « %1 »"
 
-#: ui_config.cc:169 ui_config.cc:308
+#: ui_config.cc:240 ui_config.cc:425
 msgid "default ui configuration file \"%1\" not loaded successfully."
 msgstr ""
 "le fichier par défaut (%1) pour la configuration de l'interface graphique "
 "n'a pas pu être chargé correctement."
 
-#: ui_config.cc:177
+#: ui_config.cc:248
 #, fuzzy
 msgid "Could not find default UI configuration file %1"
 msgstr ""
 "Chargement du fichier de style par défaut (%1) pour l'interface graphique"
 
-#: ui_config.cc:219
+#: ui_config.cc:289
 msgid "Loading color file %1"
-msgstr ""
+msgstr "Chargement du fichier de couleur %1"
 
-#: ui_config.cc:222
+#: ui_config.cc:341
 msgid "cannot read color file \"%1\""
-msgstr ""
+msgstr "impossible de lire le fichier de couleur \"%1\""
 
-#: ui_config.cc:227
+#: ui_config.cc:346
 msgid "color file \"%1\" not loaded successfully."
-msgstr ""
+msgstr "le fichier de couleur \"%1\" n'a pas été chargé correctement"
 
-#: ui_config.cc:233
-msgid "Color file %1 not found"
+#: ui_config.cc:325
+msgid "Color file for %1 not found along %2"
 msgstr ""
 
-#: ui_config.cc:282 ui_config.cc:361
-#, fuzzy
+#: ui_config.cc:403 ui_config.cc:486
 msgid "Color file %1 not saved"
-msgstr "Fichier de configuration %1 non sauvegardé"
+msgstr "Fichier de couleur %1 non sauvegardé"
 
-#: ui_config.cc:317
+#: ui_config.cc:434
 msgid "Loading user ui configuration file %1"
 msgstr ""
 "Chargement du fichier utilisateur de la configuration de l'interface "
 "graphique %1"
 
-#: ui_config.cc:320
+#: ui_config.cc:437
 msgid "cannot read ui configuration file \"%1\""
 msgstr ""
 "impossible de lire le fichier (%1) pour la configuration de l'interface "
 "graphique"
 
-#: ui_config.cc:325
+#: ui_config.cc:442
 msgid "user ui configuration file \"%1\" not loaded successfully."
 msgstr ""
 "le fichier utilisateur de configuration de l'interface graphique « %1 » n'a "
 "pas pu être chargé correctement."
 
-#: ui_config.cc:333
+#: ui_config.cc:450
 msgid "could not find any ui configuration file, canvas will look broken."
 msgstr ""
 "aucun fichier de configuration de l'interface graphique n'a éte trouvé.\n"
 "Elle aura l'air étrange."
 
-#: ui_config.cc:351
+#: ui_config.cc:471
 msgid "Config file %1 not saved"
 msgstr "Fichier de configuration %1 non sauvegardé"
 
-#: ui_config.cc:592
-#, fuzzy
+#: ui_config.cc:716
 msgid "Color %1 not found"
-msgstr "Préset de plugin %1 non trouvé"
+msgstr "Couleur %1 introuvable"
 
-#: ui_config.cc:662
+#: ui_config.cc:786
 msgid "Unable to find UI style file %1 in search path %2. %3 will look strange"
 msgstr ""
 "Impossible de trouver le fichier de style « %1 » dans « %2 ». L'interface de "
 "%3 sera étrange."
 
-#: utils.cc:117 utils.cc:160
+#: utils.cc:118 utils.cc:161
 msgid "bad XPM header %1"
 msgstr "mauvais entête XPM %1"
 
-#: utils.cc:577
+#: utils.cc:424
 msgid "cannot find XPM file for %1"
 msgstr "impossible de trouver le fichier XMP pour %1"
 
-#: utils.cc:597 utils.cc:627 utils.cc:641
+#: utils.cc:477 utils.cc:507 utils.cc:527
 msgid "default"
 msgstr "par défaut"
 
-#: utils.cc:642
+#: utils.cc:528
 msgid "icon \"%1\" not found for icon set \"%2\", fallback to default"
 msgstr ""
+"L'icône \"%1\" est introuvable dans le jeu d'icônes \"%2\", icône par défaut "
+"utilisée"
 
-#: utils.cc:649
+#: utils.cc:535
 msgid "cannot find icon image for %1 using %2"
 msgstr "Impossible de trouver l'icône pour %1 avec %2"
 
-#: utils.cc:666 utils.cc:682
+#: utils.cc:552 utils.cc:568
 msgid "Caught exception while loading icon named %1"
+msgstr "Exception rencontrée lors du chargement de l'icône %1"
+
+#: utils.cc:818
+msgid "Overwrite"
+msgstr "Écraser"
+
+#: vca_master_strip.cc:74 vca_time_axis.cc:49
+msgid "Solo slaves"
+msgstr ""
+
+#: vca_master_strip.cc:79 vca_time_axis.cc:55
+msgid "Mute slaves"
+msgstr ""
+
+#: vca_master_strip.cc:83
+msgid "Hide this VCA strip"
+msgstr ""
+
+#: vca_master_strip.cc:108 vca_master_strip.cc:418
+msgid "Click to show slaves only"
+msgstr ""
+
+#: vca_master_strip.cc:293
+msgid "A"
+msgstr "A"
+
+#: vca_master_strip.cc:300
+msgid "S"
+msgstr "S"
+
+#: vca_master_strip.cc:398
+msgid "Drop All Slaves"
+msgstr ""
+
+#: vca_master_strip.cc:421
+msgid "Click to show normal mixer"
 msgstr ""
 
 #: add_video_dialog.cc:54
@@ -13354,14 +15342,12 @@ msgid "Reload docroot"
 msgstr "Recharger le répertoire-racine"
 
 #: add_video_dialog.cc:120
-#, fuzzy
 msgid "Video files"
 msgstr "Fichiers vidéo"
 
 #: add_video_dialog.cc:149
-#, fuzzy
 msgid "<b>Video Information</b>"
-msgstr "<b>Infos de la vidéo</b>"
+msgstr "<b>Informations vidéo</b>"
 
 #: add_video_dialog.cc:152
 #, fuzzy
@@ -13380,13 +15366,30 @@ msgstr "Format de l'image :"
 
 #: add_video_dialog.cc:244
 msgid "VideoServerIndex"
-msgstr ""
+msgstr "Index de serveur vidéo"
 
 #: add_video_dialog.cc:675
 msgid " %1 fps"
+msgstr " %1 ips"
+
+# Short for Device Output
+#: vca_time_axis.cc:60
+msgid "D"
+msgstr "S"
+
+#: vca_time_axis.cc:61
+msgid "Unassign all slaves"
 msgstr ""
 
-#: video_timeline.cc:468
+#: vca_time_axis.cc:65
+msgid "V"
+msgstr "V"
+
+#: vca_time_axis.cc:66
+msgid "Show only slaves"
+msgstr ""
+
+#: video_timeline.cc:472
 #, fuzzy
 msgid ""
 "Parsing video file info failed. Is the Video Server running? Is the file "
@@ -13396,36 +15399,36 @@ msgstr ""
 "il lire le fichier ? Le répertoire-racine convient-il ? Est-ce un fichier "
 "vidéo ?"
 
-#: video_timeline.cc:506
+#: video_timeline.cc:510
 #, fuzzy
 msgid ""
 "Failed to set session-framerate: '%1' does not have a corresponding option "
 "setting in %2."
 msgstr ""
-"Echec du réglage de débit (Img/sec) : '%1' n' a aucune option correspondante "
+"Echec du réglage de débit (Img/sec) : '%1' n' a aucune option correspondante "
 "dans %2."
 
-#: video_timeline.cc:514
+#: video_timeline.cc:518
 #, fuzzy
 msgid ""
 "Video file's framerate is not equal to %1 session timecode's framerate: '%2' "
 "vs '%3'"
 msgstr ""
 "Le débit Img/sec du fichier vidéo ne correspond pas à celui du Timecode de "
-"la session : '%2' versus '%3'"
+"la session : '%2' versus '%3'"
 
-#: video_timeline.cc:587
+#: video_timeline.cc:591
 #, fuzzy
 msgid ""
 "Video-server docroot mismatch. %1: '%2', video-server: '%3'. This usually "
 "means that the video server was not started by %1 and uses a different "
 "document-root."
 msgstr ""
-"Incompatibilité du répertoire-racine. %1 : '%2', serveur-vidéo : '%3'. En "
+"Incompatibilité du répertoire-racine. %1 : '%2', serveur-vidéo : '%3'. En "
 "général, ça signale un démarrage hors-Ardour du serveur-vidéo, et "
 "l'utilisation d'un répertoire-racine différent."
 
-#: video_timeline.cc:724
+#: video_timeline.cc:728
 #, fuzzy
 msgid ""
 "Video-monitor 'xjadeo' was not found. Please install http://xjadeo.sf.net/ "
@@ -13435,34 +15438,35 @@ msgid ""
 "\n"
 "see also http://manual.ardour.org/video-timeline/setup/"
 msgstr ""
-"Le moniteur vidéo 'xjadeo' est introuvable. Merci d'installer : http://"
+"Le moniteur vidéo 'xjadeo' est introuvable. Merci d'installer : http://"
 "xjadeo.sf.net/ (Spécifier le chemin vers xjadeo est possible en réglant les "
 "variables d'environnement de XJREMOTE. Cela doit désigner une application "
 "compatible avec l'interface de télécommande de xjadeo -xjremote-).\n"
 "\n"
 "voir aussi (anglais) http://manual.ardour.org/video-timeline/setup/"
 
-#: video_timeline.cc:739
+#: video_timeline.cc:743
 msgid "Video-monitor 'xjadeo' cannot be launched."
-msgstr ""
+msgstr "Le moniteur vidéo 'xjadeo' n'a pas pu être démarré."
 
-#: video_timeline.cc:766
+#: video_timeline.cc:775
 msgid ""
 "Video-monitor 'xjadeo' is too old. Please install xjadeo version 0.7.7 or "
 "later. http://xjadeo.sf.net/"
 msgstr ""
+"Le moniteur vidéo 'xjadeo' est trop ancien. Installez xjadeo version 0.7.7 "
+"ou ultérieur. http://xjadeo.sf.net/"
 
-#: video_monitor.cc:285
+#: video_monitor.cc:283
 #, fuzzy
 msgid "Video Monitor: File Not Found."
 msgstr "Moniteur Vidéo : Fichier Non Trouvé."
 
 #: transcode_ffmpeg.cc:56
-#, fuzzy
 msgid ""
-"No ffprobe or ffmpeg executables could be found on this system.\n"
-"Video import and export is not possible until you install those tools.\n"
+"ffmpeg installation was not found on this system.\n"
 "%1 requires ffmpeg and ffprobe from ffmpeg.org - version 1.1 or newer.\n"
+"Video import and export is not possible until you install tools.\n"
 "\n"
 "The tools are included with the %1 releases from ardour.org and also "
 "available with the video-server at http://x42.github.com/harvid/\n"
@@ -13475,21 +15479,6 @@ msgid ""
 "\n"
 "see also http://manual.ardour.org/video-timeline/setup/"
 msgstr ""
-"Pas de paquet ffprobe ou ffmpeg sur votre système.\n"
-"L'import/export Vidéo est impossible sans installer ces outils.\n"
-"%1 nécessite ffmpeg et ffprobe, fournis par ffmpeg.org, version 1.1 ou plus "
-"récente.\n"
-"\n"
-"Ces outils sont inclus dans la version %1 d'ardour.org et aussi disponibles "
-"avec le serveur-vidéo à http://x42.github.com/harvid/\n"
-"\n"
-"Important : les fichiers sont à installer dans $PATH et à nommer "
-"ffmpeg_harvid et ffprobe_harvid.\n"
-"Si votre système inclut déjà les paquets concernés, nous vous recommandons "
-"la création de liens symboliques de ffmpeg à ffmpeg_harvid et de ffprobe à "
-"ffprobe_harvid.\n"
-"\n"
-"voir aussi (anglais) http://manual.ardour.org/video-timeline/setup/"
 
 #: transcode_video_dialog.cc:56
 #, fuzzy
@@ -13497,44 +15486,40 @@ msgid "Transcode/Import Video File "
 msgstr "Transcodage/Import du fichier vidéo "
 
 #: transcode_video_dialog.cc:58
-#, fuzzy
 msgid "Output File:"
 msgstr "Fichier de sortie :"
 
-#: transcode_video_dialog.cc:61 export_video_dialog.cc:85
-#, fuzzy
+#: transcode_video_dialog.cc:61 export_video_dialog.cc:81
 msgid "Abort"
-msgstr "Abandon"
+msgstr "Annuler"
 
 #: transcode_video_dialog.cc:63
 msgid "Height = "
 msgstr "Hauteur = "
 
 #: transcode_video_dialog.cc:66
+msgid "Extract LTC from audio and align video"
+msgstr ""
+
+#: transcode_video_dialog.cc:67
 #, fuzzy
 msgid "Manual Override"
 msgstr "Commande manuelle auxiliaire"
 
-#: transcode_video_dialog.cc:70 export_video_dialog.cc:103
+#: transcode_video_dialog.cc:71 export_video_dialog.cc:99
 #, fuzzy
 msgid "Debug Mode: Print ffmpeg command and output to stdout."
 msgstr "Mode Débug: commande ffmpeg et sortie vers stdout."
 
 #: transcode_video_dialog.cc:107
-#, fuzzy
 msgid "<b>File Information</b>"
-msgstr "<b>Infos du fichier</b>"
+msgstr "<b>Informations du fichier</b>"
 
 #: transcode_video_dialog.cc:113
-#, fuzzy
 msgid ""
-"No ffprobe or ffmpeg executables could be found on this system. Video Import "
-"is not possible until you install those tools. See the Log window for more "
-"information."
+"ffmpeg installation was not found. Video Import is not possible. See the Log "
+"window for more information."
 msgstr ""
-"Les éxécutables ffprobe ou ffmpeg ne sont pas disponibles. L'import Vidéo "
-"est impossible sans installer ces outils. Vous trouverez plus d'infos dans "
-"la fenêtre de Log."
 
 #: transcode_video_dialog.cc:120
 #, fuzzy
@@ -13545,102 +15530,96 @@ msgstr ""
 "Infos-fichier illisibles. Probablement '%1' n'est pas un fichier vidéo, ou "
 "le codec / format n'est pas supporté."
 
-#: transcode_video_dialog.cc:134
+#: transcode_video_dialog.cc:137
 #, fuzzy
 msgid "FPS:"
-msgstr "IPS :"
+msgstr "IPS :"
 
-#: transcode_video_dialog.cc:136
-#, fuzzy
-msgid "Duration:"
-msgstr "Durée :"
-
-#: transcode_video_dialog.cc:138
+#: transcode_video_dialog.cc:141
 #, fuzzy
 msgid "Codec:"
-msgstr "Codec :"
+msgstr "Codec :"
 
-#: transcode_video_dialog.cc:140
+#: transcode_video_dialog.cc:143
 #, fuzzy
 msgid "Geometry:"
-msgstr "Géométrie :"
+msgstr "Géométrie :"
 
-#: transcode_video_dialog.cc:155
+#: transcode_video_dialog.cc:158
 msgid "??"
-msgstr ""
+msgstr "??"
 
-#: transcode_video_dialog.cc:176
-#, fuzzy
+#: transcode_video_dialog.cc:179
 msgid "<b>Import Settings</b>"
-msgstr "<b>Importer Réglages</b>"
+msgstr "<b>Paramètres d'import</b>"
 
-#: transcode_video_dialog.cc:181
-#, fuzzy
-msgid "Reference From Current Location (Previously Transcoded Files Only)"
+#: transcode_video_dialog.cc:184
+msgid "Reference from Current Location (Previously Transcoded Files Only)"
 msgstr ""
-"Référence d'emplacement actuel (seulement les fichiers déjà transcodés)"
 
-#: transcode_video_dialog.cc:183
+#: transcode_video_dialog.cc:185
 #, fuzzy
 msgid "Import/Transcode Video to Session"
 msgstr "Importer/transcoder vidéo vers session"
 
-#: transcode_video_dialog.cc:191
+#: transcode_video_dialog.cc:188 transcode_video_dialog.cc:198
 #, fuzzy
 msgid "Do Not Import Video (Audio Import Only)"
 msgstr "Importer seulement l'Audio (pas la vidéo)"
 
-#: transcode_video_dialog.cc:200
+#: transcode_video_dialog.cc:208
+msgid "Do Not Import Video"
+msgstr ""
+
+#: transcode_video_dialog.cc:224
 #, fuzzy
 msgid "Scale Video: Width = "
-msgstr "Format vidéo : Largeur = "
+msgstr "Format vidéo : Largeur = "
 
-#: transcode_video_dialog.cc:207
+#: transcode_video_dialog.cc:230
 #, fuzzy
 msgid "Original Width"
 msgstr "Largeur originelle"
 
-#: transcode_video_dialog.cc:222
+#: transcode_video_dialog.cc:245
 #, fuzzy
 msgid "Bitrate (KBit/s):"
-msgstr "Taux (KBits/sec) :"
+msgstr "Taux (KBits/sec) :"
 
-#: transcode_video_dialog.cc:227
+#: transcode_video_dialog.cc:250
 #, fuzzy
 msgid "Extract Audio:"
-msgstr "Extraire l'Audio :"
+msgstr "Extraire l'Audio :"
 
-#: transcode_video_dialog.cc:232
+#: transcode_video_dialog.cc:255
 #, fuzzy
 msgid "No Audio Track Present"
 msgstr "Aucune Piste Audio"
 
-#: transcode_video_dialog.cc:235
+#: transcode_video_dialog.cc:258
 #, fuzzy
 msgid "Do Not Extract Audio"
 msgstr "Ne pas extraire l'Audio"
 
-#: transcode_video_dialog.cc:350
+#: transcode_video_dialog.cc:374
 #, fuzzy
 msgid "Extracting Audio.."
 msgstr "Extraction Audio.."
 
-#: transcode_video_dialog.cc:353
-#, fuzzy
+#: transcode_video_dialog.cc:377
 msgid "Audio Extraction Failed."
-msgstr "Echec de l'extraction Audio."
+msgstr "Échec de l'extraction audio."
 
-#: transcode_video_dialog.cc:379
+#: transcode_video_dialog.cc:403
 #, fuzzy
 msgid "Transcoding Video.."
 msgstr "Transcodage Vidéo.."
 
-#: transcode_video_dialog.cc:413
-#, fuzzy
+#: transcode_video_dialog.cc:437
 msgid "Transcoding Failed."
-msgstr "Echec du Transcodage."
+msgstr "Échec du Transcodage."
 
-#: transcode_video_dialog.cc:503
+#: transcode_video_dialog.cc:541
 msgid "Save Transcoded Video File"
 msgstr "Sauvegarder le fichier vidéo transcodé"
 
@@ -13650,9 +15629,8 @@ msgid "Launch Video Server"
 msgstr "Lancer le Serveur Vidéo"
 
 #: video_server_dialog.cc:53
-#, fuzzy
 msgid "Server Executable:"
-msgstr "Exécutable du Serveur :"
+msgstr "Exécutable du serveur :"
 
 #: video_server_dialog.cc:55
 #, fuzzy
@@ -13664,7 +15642,7 @@ msgstr "Répertoire-racine du Serveur:"
 msgid "Don't show this dialog again. (Reset in Edit->Preferences)."
 msgstr "Ne plus afficher ce message. (RàZ dans Edition -> Préférences)."
 
-#: video_server_dialog.cc:97
+#: video_server_dialog.cc:94
 #, fuzzy
 msgid ""
 "The external video server 'harvid' can not be found.\n"
@@ -13681,49 +15659,46 @@ msgstr ""
 "\n"
 "voir aussi (anglais) http://manual.ardour.org/video-timeline/setup/"
 
-#: video_server_dialog.cc:129
-#, fuzzy
+#: video_server_dialog.cc:126
 msgid "Listen Address:"
 msgstr "Adresse d'écoute :"
 
-#: video_server_dialog.cc:134
+#: video_server_dialog.cc:131
 #, fuzzy
 msgid "Listen Port:"
 msgstr "Port d'écoute :"
 
-#: video_server_dialog.cc:139
+#: video_server_dialog.cc:136
 #, fuzzy
 msgid "Cache Size:"
 msgstr "Taille du cache :"
 
-#: video_server_dialog.cc:145
-#, fuzzy
+#: video_server_dialog.cc:142
 msgid ""
 "%1 relies on an external video server for the videotimeline.\n"
 "The server configured in Edit -> Preferences -> Video is not reachable.\n"
 "Do you want %1 to launch 'harvid' on this machine?"
 msgstr ""
-"%1 s'appuie sur un Serveur Vidéo externe pour la timeline vidéo.\n"
+"%1 utilise un Serveur Vidéo externe pour la timeline vidéo.\n"
 "Le serveur configuré dans Edition -> Préférences -> Vidéo n'est pas "
 "accessible.\n"
-"Voulez vous qu'%1 lance 'harvid' sur cette machine?"
+"Voulez vous qu'%1 lance 'harvid' sur cette machine ?"
 
-#: video_server_dialog.cc:189
+#: video_server_dialog.cc:186
 #, fuzzy
 msgid "Set Video Server Executable"
 msgstr "Réglages du programme de Serveur Vidéo"
 
-#: video_server_dialog.cc:209
-#, fuzzy
+#: video_server_dialog.cc:206
 msgid "Server docroot"
-msgstr "Dossier-racine du Serveur"
+msgstr "Dossier-racine du serveur"
 
-#: utils_videotl.cc:60
+#: utils_videotl.cc:61
 #, fuzzy
 msgid "Destination is outside Video Server's docroot. "
 msgstr "L'emplacement n'est pas dans le dossier-vidéo-racine."
 
-#: utils_videotl.cc:61
+#: utils_videotl.cc:62
 #, fuzzy
 msgid ""
 "The destination file path is outside of the Video Server's docroot. The file "
@@ -13732,194 +15707,172 @@ msgstr ""
 "Le fichier va être sauvegardé hors du dossier Serveur Vidéo racine. Le "
 "Serveur Vidéo ne pourra pas le lire. Voulez vous vraiment continuer ?"
 
-#: utils_videotl.cc:64
-#, fuzzy
+#: utils_videotl.cc:65
 msgid "Continue"
 msgstr "Continuer"
 
-#: utils_videotl.cc:70
-#, fuzzy
+#: utils_videotl.cc:72
 msgid "Confirm Overwrite"
 msgstr "Confirmer l'écrasement"
 
-#: utils_videotl.cc:71
-#, fuzzy
-msgid "A file with the same name already exists.  Do you want to overwrite it?"
-msgstr "Un fichier existant porte déjà ce nom. Voulez vous l'écraser ?"
-
-#: utils_videotl.cc:81 utils_videotl.cc:97
-#, fuzzy
+#: utils_videotl.cc:82 utils_videotl.cc:98
 msgid "Cannot create video folder \"%1\" (%2)"
-msgstr "Création du dossier vidéo \"%1\" impossible (%2)"
+msgstr "Impossible de créer le dossier vidéo \"%1\" (%2)"
 
-#: export_video_dialog.cc:71
+#: export_video_dialog.cc:67
 #, fuzzy
 msgid "Export Video File "
 msgstr "Export du fichier vidéo"
 
-#: export_video_dialog.cc:82
+#: export_video_dialog.cc:78
 #, fuzzy
 msgid "Video:"
-msgstr "Vidéo :"
+msgstr "Vidéo :"
 
-#: export_video_dialog.cc:87
+#: export_video_dialog.cc:83
 #, fuzzy
 msgid "Scale Video (W x H):"
 msgstr "Taille de vidéo (L x H)"
 
-#: export_video_dialog.cc:88
-#, fuzzy
+#: export_video_dialog.cc:84
 msgid "Retain Aspect"
-msgstr "Format de l'image :"
+msgstr "Conserver l'aspect"
 
-#: export_video_dialog.cc:93
+#: export_video_dialog.cc:89
 #, fuzzy
 msgid "Set Aspect Ratio:"
 msgstr "Régler le ratio d'aspect :"
 
-#: export_video_dialog.cc:94
+#: export_video_dialog.cc:90
 #, fuzzy
 msgid "Normalize Audio"
 msgstr "Normaliser l'Audio"
 
-#: export_video_dialog.cc:95
+#: export_video_dialog.cc:91
 #, fuzzy
 msgid "2 Pass Encoding"
 msgstr "Encodage à 2 passes"
 
-#: export_video_dialog.cc:96
+#: export_video_dialog.cc:92
 #, fuzzy
 msgid "Codec Optimizations:"
-msgstr "Optimisations du Codec :"
+msgstr "Optimisations du Codec :"
 
-#: export_video_dialog.cc:98
+#: export_video_dialog.cc:94
 #, fuzzy
 msgid "Deinterlace"
 msgstr "Désinterlacer"
 
-#: export_video_dialog.cc:99
+#: export_video_dialog.cc:95
 #, fuzzy
 msgid "Use [2] B-frames (MPEG 2 or 4 only)"
 msgstr "Choisir [2] B-frames (MPEG 2 ou 4 seulement)"
 
-#: export_video_dialog.cc:100
+#: export_video_dialog.cc:96
 #, fuzzy
 msgid "Override FPS (Default is to retain FPS from the input video file):"
-msgstr "Ecraser FPS (le défaut est d'aligner sur le fichier vidéo d'entrée) :"
+msgstr "Ecraser FPS (le défaut est d'aligner sur le fichier vidéo d'entrée) :"
 
-#: export_video_dialog.cc:101
+#: export_video_dialog.cc:97
 #, fuzzy
 msgid "Include Session Metadata"
 msgstr "Inclure les métadonnées de la session"
 
-#: export_video_dialog.cc:119
-#, fuzzy
+#: export_video_dialog.cc:115
 msgid ""
-"No ffprobe or ffmpeg executables could be found on this system. Video Export "
-"is not possible until you install those tools. See the Log window for more "
-"information."
+"ffmpeg installation was not found. Video Export is not possible. See the Log "
+"window for more information."
 msgstr ""
-"Pas de paquet ffprobe ou ffmpeg sur votre système. L'exportation Vidéo est "
-"impossible sans installer ces outils. Plus d'infos dans la fenêtre de Log."
 
-#: export_video_dialog.cc:130
+#: export_video_dialog.cc:126
 msgid "<b>Output:</b> (file extension defines format)"
-msgstr ""
+msgstr "<b>Sortie :</b>(l'extension de fichier détermine le format)"
 
-#: export_video_dialog.cc:140
-#, fuzzy
+#: export_video_dialog.cc:136
 msgid "<b>Input Video:</b>"
-msgstr "<b>Entrée :</b>"
+msgstr "<b>Entrée vidéo :</b>"
 
-#: export_video_dialog.cc:151
+#: export_video_dialog.cc:147
 msgid "Audio:"
 msgstr "Audio :"
 
-#: export_video_dialog.cc:153
+#: export_video_dialog.cc:149
 #, fuzzy
 msgid "Master Bus"
 msgstr "Bus Master"
 
-#: export_video_dialog.cc:158
-#, fuzzy
+#: export_video_dialog.cc:153
 msgid "from the %1 session's start to the session's end"
 msgstr "du début à la fin de la session %1"
 
-#: export_video_dialog.cc:161
+#: export_video_dialog.cc:156
 msgid "<b>Settings:</b>"
 msgstr "<b>Réglages :</b>"
 
-#: export_video_dialog.cc:169
+#: export_video_dialog.cc:164
 msgid "Range:"
 msgstr "Intervalle :"
 
-#: export_video_dialog.cc:172
-msgid "Preset:"
-msgstr "Préréglage :"
-
-#: export_video_dialog.cc:175
+#: export_video_dialog.cc:170
 msgid "Video Codec:"
 msgstr "Codec vidée :"
 
-#: export_video_dialog.cc:178
+#: export_video_dialog.cc:173
 msgid "Video KBit/s:"
 msgstr "Débit vidéo (kb / s) :"
 
-#: export_video_dialog.cc:181
+#: export_video_dialog.cc:176
 msgid "Audio Codec:"
 msgstr "Codec audio :"
 
-#: export_video_dialog.cc:184
+#: export_video_dialog.cc:179
 msgid "Audio KBit/s:"
 msgstr "Débit audio (kb / s)"
 
-#: export_video_dialog.cc:187
+#: export_video_dialog.cc:182
 msgid "Audio Samplerate:"
 msgstr "Fréquence d'échantillonnage audio :"
 
-#: export_video_dialog.cc:222 export_video_dialog.cc:231
-#: export_video_dialog.cc:830 export_video_dialog.cc:833
-#, fuzzy
+#: export_video_dialog.cc:215 export_video_dialog.cc:223
+#: export_video_dialog.cc:814 export_video_dialog.cc:817
 msgid "(default for format)"
-msgstr "Format de sortie par défaut"
+msgstr "(format de sortie par défaut)"
 
-#: export_video_dialog.cc:242 export_video_dialog.cc:255
-#: export_video_dialog.cc:837 export_video_dialog.cc:846
-#, fuzzy
+#: export_video_dialog.cc:233 export_video_dialog.cc:244
+#: export_video_dialog.cc:821 export_video_dialog.cc:830
 msgid "(default)"
 msgstr "(par défaut)"
 
-#: export_video_dialog.cc:256 export_video_dialog.cc:840
+#: export_video_dialog.cc:245 export_video_dialog.cc:824
 msgid "(retain)"
-msgstr ""
+msgstr "(conserver)"
 
-#: export_video_dialog.cc:348
-#, fuzzy
+#: export_video_dialog.cc:335
 msgid "from 00:00:00:00 to the video's end"
 msgstr "de 00:00:00:00 à la fin de la vidéo"
 
-#: export_video_dialog.cc:350
+#: export_video_dialog.cc:337
 #, fuzzy
 msgid "from the video's start to the video's end"
 msgstr "du début à la fin de la vidéo"
 
-#: export_video_dialog.cc:353
+#: export_video_dialog.cc:340
 msgid "Selected range"
 msgstr "Intervalle sélectionné"
 
-#: export_video_dialog.cc:589
+#: export_video_dialog.cc:561
 msgid "Normalizing audio"
 msgstr "Normaliser audio"
 
-#: export_video_dialog.cc:593
+#: export_video_dialog.cc:566 export_video_dialog.cc:571
 msgid "Exporting audio"
 msgstr "Exporter audio"
 
-#: export_video_dialog.cc:648
+#: export_video_dialog.cc:632
 msgid "Exporting Audio..."
 msgstr "Exporter audio…"
 
-#: export_video_dialog.cc:705
+#: export_video_dialog.cc:689
 msgid ""
 "Export Video: Cannot query duration of video-file, using duration from "
 "timeline instead."
@@ -13927,37 +15880,37 @@ msgstr ""
 "Export vidéo : impossible de récupérer la durée du fichier vidéo, "
 "utilisation de la durée de la « timeline »."
 
-#: export_video_dialog.cc:735
+#: export_video_dialog.cc:719
 msgid "Export Video: export-range does not include video."
 msgstr "Export vidéo : l'intervalle d'export ne contient pas de vidéo."
 
-#: export_video_dialog.cc:748
+#: export_video_dialog.cc:732
 msgid "Export Video: No Master Out Ports to Connect for Audio Export"
 msgstr ""
 "Export vidéo : aucun port de sortie principal auquel se connecter pour "
 "l'export audio"
 
-#: export_video_dialog.cc:790
+#: export_video_dialog.cc:774
 msgid "Encoding Video..."
 msgstr "Encodage vidéo…"
 
-#: export_video_dialog.cc:810
+#: export_video_dialog.cc:794
 msgid "Export Video: Video input file cannot be read."
 msgstr "Export vidéo : le fichier vidéo d'entrée ne peut être lu."
 
-#: export_video_dialog.cc:916
+#: export_video_dialog.cc:900
 msgid "Encoding Video.. Pass 1/2"
 msgstr "Encodage vidéo… Passe 1 / 2"
 
-#: export_video_dialog.cc:928
+#: export_video_dialog.cc:912
 msgid "Encoding Video.. Pass 2/2"
 msgstr "Encodage vidéo… Passe 2 / 2"
 
-#: export_video_dialog.cc:1031
+#: export_video_dialog.cc:1015
 msgid "Transcoding failed."
 msgstr "Échec du transcodage."
 
-#: export_video_dialog.cc:1267 export_video_dialog.cc:1287
+#: export_video_dialog.cc:1251 export_video_dialog.cc:1271
 msgid "Save Exported Video File"
 msgstr "Sauvegarder le fichier vidéo exporté"
 
@@ -13975,20 +15928,628 @@ msgid "<b>Video Export Info</b>"
 msgstr "<b>Informations d'export vidéo</b>"
 
 #: export_video_infobox.cc:51
-#, fuzzy
 msgid ""
+"%1 does not include commercial licenses for encoding audio/video. Visit "
+"mpegla.com for information about licensing various audio/video codecs.\n"
+"\n"
 "Video encoding is a non-trivial task with many details.\n"
 "\n"
-"Please see the manual at %1/video-timeline/operations/#export.\n"
+"Please see the manual at %2/video-timeline/operations/#export.\n"
 "\n"
 "Open Manual in Browser? "
 msgstr ""
-"L'encodage Vidéo est une tâche complexe avec de nombreux détails\n"
-"\n"
-"Merci de consulter le manuel à %1/video-timeline/operations/#export "
-"(anglais).\n"
-"\n"
-"Ouvrir le manuel en ligne ? "
+
+#, fuzzy
+#~ msgid ""
+#~ "%1%2\n"
+#~ "(built from revision %3)"
+#~ msgstr ""
+#~ "%1\n"
+#~ "(compilé de la révision %2)"
+
+#~ msgid "Busses"
+#~ msgstr "Bus"
+
+#~ msgid "Display model"
+#~ msgstr "Modèle d'affichage"
+
+#~ msgid "Composite graphs for each track"
+#~ msgstr "Graphs composite pour chaque piste"
+
+#~ msgid "Composite graph of all tracks"
+#~ msgstr "Graph composite de toutes les pistes"
+
+#~ msgid "Normalize values"
+#~ msgstr "Normaliser"
+
+#~ msgid "Locations"
+#~ msgstr "Repères et intervalles"
+
+#~ msgid "Save as..."
+#~ msgstr "Sauvegarder sous…"
+
+#~ msgid ""
+#~ "A snapshot already exists with that name.  Do you want to overwrite it?"
+#~ msgstr "Un cliché de ce nom existe déjà. Voulez-vous l'écraser ?"
+
+#~ msgid "Could not disconnect from Audio/MIDI engine"
+#~ msgstr "Déconnection du moteur Audio/MIDI impossible"
+
+#~ msgid "Could not reconnect to the Audio/MIDI engine"
+#~ msgstr "Reconnection au moteur Audio/MIDI impossible"
+
+#~ msgid ""
+#~ "%4This is a session from an older version of %3%5\n"
+#~ "\n"
+#~ "%3 has copied the old session file\n"
+#~ "\n"
+#~ "%6%1%7\n"
+#~ "\n"
+#~ "to\n"
+#~ "\n"
+#~ "%6%2%7\n"
+#~ "\n"
+#~ "From now on, use the -2000 version with older versions of %3"
+#~ msgstr ""
+#~ "%4Session issue d'une ancienne version de %3%5\n"
+#~ "\n"
+#~ "%3 a copié l'ancien fichier de session\n"
+#~ "\n"
+#~ "%6%1%7\n"
+#~ "\n"
+#~ "vers\n"
+#~ "\n"
+#~ "%6%2%7\n"
+#~ "\n"
+#~ "À partir de maintenant, utilisez la version -2000 avec d'anciennes "
+#~ "versions de %3"
+
+#~ msgid "Playhead follows Range Selections and Edits"
+#~ msgstr ""
+#~ "La tête de lecture suit les intervalles de sélection et les éditions"
+
+#~ msgid ""
+#~ "When active, auditioning is taking place\n"
+#~ "Click to stop the audition"
+#~ msgstr ""
+#~ "Actif lorsqu'une écoute est en cours\n"
+#~ "Cliquer pour stopper l'écoute."
+
+#~ msgid "This screen is not tall enough to display the mixer window"
+#~ msgstr ""
+#~ "Cet écran n'est pas assez haut pour afficher la fenêtre de la console de "
+#~ "mixage"
+
+#~ msgid "Open Video"
+#~ msgstr "Ouvrir vidéo"
+
+#~ msgid "Export To Video File"
+#~ msgstr "Exporter vers un fichier vidéo…"
+
+#~ msgid "Snapshot..."
+#~ msgstr "Prendre un cliché…"
+
+#~ msgid "Export To Audio File(s)..."
+#~ msgstr "Exporter vers fichier(s) audio…"
+
+#~ msgid "Show Toolbars"
+#~ msgstr "Afficher les barres d'outils"
+
+#~ msgid "Toggle Editor+Mixer"
+#~ msgstr "Basculer Éditeur+Console de mixage"
+
+#~ msgid "Reference"
+#~ msgstr "Référence"
+
+#, fuzzy
+#~ msgid "Report A Bug"
+#~ msgstr "Rapporter un &bogue..."
+
+#~ msgid "Transition To Roll"
+#~ msgstr "Lecture avant"
+
+#~ msgid "Transition To Reverse"
+#~ msgstr "Lecture arrière"
+
+#~ msgid "Set From Playhead"
+#~ msgstr "Régler à la tête de lecture"
+
+#, fuzzy
+#~ msgid "Set to %1 beat(s)"
+#~ msgstr "Impossible de régler le pilote sur %1"
+
+#~ msgid "Fill Range with Region"
+#~ msgstr "Remplir l'intervalle avec la région"
+
+#~ msgid "Consolidate Range With Processing"
+#~ msgstr "Consolider l'intervalle avec traitement"
+
+# Jargon
+#~ msgid "Bounce Range to Region List With Processing"
+#~ msgstr "« Bouncer » l'intervalle vers la liste des régions avec traitement"
+
+#~ msgid "Play From Edit Point"
+#~ msgstr "Lire au point d'édition"
+
+#~ msgid "Play From Start"
+#~ msgstr "Lire depuis le début"
+
+#, fuzzy
+#~ msgid "Smart Mode (add Range functions to Grab mode)"
+#~ msgstr "Mode Smart (ajoute des fonctions d'intervalle au mode Object)"
+
+#~ msgid "Zoom focus"
+#~ msgstr "Zoomer sur"
+
+#~ msgid "Break drag or deselect all"
+#~ msgstr "Arrêter le déplacement ou tout désélectionner"
+
+#~ msgid "Playhead To Next Grid"
+#~ msgstr "Tête de lecture à la grille suivante"
+
+#~ msgid "Playhead To Previous Grid"
+#~ msgstr "Tête de lecture à la grille précédente"
+
+#~ msgid "Import From Session"
+#~ msgstr "Importer depuis une session"
+
+#~ msgid "Show Logo"
+#~ msgstr "Afficher le logo"
+
+#~ msgid "Loaded editor bindings from %1"
+#~ msgstr "Raccourcis d'éditeur chargés depuis %1"
+
+#~ msgid "Could not find editor.bindings in search path %1"
+#~ msgstr ""
+#~ "Impossible de trouver « editor.bindings » dans le chemin de recherche %1"
+
+#~ msgid "Snap Position To Grid"
+#~ msgstr "Aligner la position sur la grille"
+
+#~ msgid "Insert Region From Region List"
+#~ msgstr "Insérer région depuis la liste des régions"
+
+#~ msgid "group|G"
+#~ msgstr "G"
+
+#~ msgid "relative|Rel"
+#~ msgstr "Rel."
+
+#~ msgid "mute|M"
+#~ msgstr "M"
+
+#~ msgid "solo|S"
+#~ msgstr "S"
+
+#~ msgid "monitoring|Mon"
+#~ msgstr "Mon."
+
+#~ msgid "selection|Sel"
+#~ msgstr "Sél."
+
+#~ msgid "active|A"
+#~ msgstr "A"
+
+#~ msgid "File Exists!"
+#~ msgstr "Le fichier existe !"
+
+#~ msgid "Overwrite Existing File"
+#~ msgstr "Écraser le fichier existant"
+
+#~ msgid "End point trim"
+#~ msgstr "Rogner la fin"
+
+#~ msgid "duplicate selection"
+#~ msgstr "dupliquer la sélection"
+
+#~ msgid "tracks"
+#~ msgstr "pistes"
+
+#~ msgid "busses"
+#~ msgstr "bus"
+
+#~ msgid "L"
+#~ msgstr "L"
+
+#~ msgid "G"
+#~ msgstr "G"
+
+#~ msgid "O"
+#~ msgstr "O"
+
+# Short for Input
+#~ msgid "I"
+#~ msgstr "E"
+
+#~ msgid "R"
+#~ msgstr "R"
+
+#~ msgid "SI"
+#~ msgstr "SI"
+
+#~ msgid "Show Tracks With Regions Under Playhead"
+#~ msgstr "Afficher les pistes ayant une région sous la tête de lecture"
+
+#~ msgid ""
+#~ "The %1 audio backend was configured and started externally.\n"
+#~ "This limits your control over it."
+#~ msgstr ""
+#~ "Le moteur audio %1 a été configuré et démarré extérieurement.\n"
+#~ "Cela limite votre contrôle."
+
+#~ msgid "Export region contents"
+#~ msgstr "Exporter le contenu de la région"
+
+#~ msgid "Export track output"
+#~ msgstr "Exporter la sortie de piste"
+
+#~ msgid "<i>Build filename(s) from these components:</i>"
+#~ msgstr ""
+#~ "<i>Créer le(s) nom(s) de fichier(s) à partir de ces composants :</i>"
+
+#~ msgid "<small><i>Current (approximate) filename: \"%1\"</i></small>"
+#~ msgstr "<small><i>Nom de fichier (approximatif) actuel : « %1 »</i></small>"
+
+#~ msgid ""
+#~ "Command to run post-export\n"
+#~ "(%f=full path & filename, %d=directory, %b=basename):"
+#~ msgstr ""
+#~ "Commande à lancer après l'export\n"
+#~ "(%f = chemin complet et nom de fichier, %d = répertoire, %b = nom de "
+#~ "base) :"
+
+#~ msgid "Create New Group From"
+#~ msgstr "Créer un nouveau groupe à partir de"
+
+#~ msgid "Insert time on all the track's playlists"
+#~ msgstr "Insérer du temps sur toutes les playlists de la piste"
+
+#~ msgid "Select an action, then press the key(s) to (re)set its shortcut"
+#~ msgstr ""
+#~ "Sélectionnez une action, puis appuyez sur la touche pour définir le "
+#~ "raccourci"
+
+#, fuzzy
+#~ msgid "Main_menu"
+#~ msgstr "Menu_Principal"
+
+#~ msgid "Program "
+#~ msgstr "Programme"
+
+#, fuzzy
+#~ msgid "Loaded mixer bindings from %1"
+#~ msgstr "Réglages de Console chargées depuis %1"
+
+#, fuzzy
+#~ msgid "Could not find mixer.bindings in search path %1"
+#~ msgstr "Réglages de Console introuvables dans %1"
+
+#~ msgid "*Comments*"
+#~ msgstr "*Commentaires*"
+
+#~ msgid "*Cmt*"
+#~ msgstr "*Cmt*"
+
+#~ msgid "Click to Add/Edit Comments"
+#~ msgstr "Cliquer pour ajouter ou modifier les commentaires"
+
+#~ msgid "Remote Control ID..."
+#~ msgstr "ID de télécommande…"
+
+#, fuzzy
+#~ msgid "C"
+#~ msgstr "Ajouter un do"
+
+#~ msgid ""
+#~ "  -k, --keybindings filename  Name of key bindings to load (default is ~/."
+#~ "ardour3/ardour.bindings)\n"
+#~ msgstr ""
+#~ "  -k, --keybindings nomfichier       Nom du fichier des raccourcis "
+#~ "claviers à charger (par défaut ~/.ardour3/ardour.bindings)\n"
+
+#~ msgid "Update available plugins"
+#~ msgstr "Rafraîchir les greffons disponibles"
+
+#~ msgid "alsa_pcm"
+#~ msgstr "alsa_pcm"
+
+#, fuzzy
+#~ msgid ""
+#~ "It is not possible to add a port here, as the first processor in the "
+#~ "track or buss cannot support the new configuration."
+#~ msgstr ""
+#~ "Impossible d'ajouter un port, le premier traitement de la Piste ou Bus "
+#~ "n'est pas compatible avec la nouvelle configuration."
+
+#, fuzzy
+#~ msgid ""
+#~ "This port cannot be removed.\n"
+#~ "Either the first plugin in the track or buss cannot accept\n"
+#~ "the new number of inputs or the last plugin has more outputs."
+#~ msgstr ""
+#~ "Retirer ce port est impossible.\n"
+#~ "Soit le premier plugin de la Piste (Bus) ne peut gérer le \n"
+#~ "nouveau nombre d'entrées, soit le dernier à plus de sorties."
+
+#, fuzzy
+#~ msgid ""
+#~ "<b>%1</b>\n"
+#~ "Double-click to show GUI.\n"
+#~ "Alt+double-click to show generic GUI.%2"
+#~ msgstr ""
+#~ "<b>%1</b>\n"
+#~ "Double-clic pour afficher l'interface.\n"
+#~ "Alt+Double-clic pour afficher l'interface générique. %2"
+
+#~ msgid "Keyboard layout:"
+#~ msgstr "Agencement du clavier :"
+
+#~ msgid "Font scaling:"
+#~ msgstr "Échelle des polices :"
+
+#~ msgid "Double-click on a name to edit settings for an enabled protocol"
+#~ msgstr "Double cliquer sur un nom pour configurer un protocole activé"
+
+#~ msgid "Sync/Slave"
+#~ msgstr "Synchronisé/Esclave"
+
+#~ msgid "only in region gain mode"
+#~ msgstr "seulement en mode gain de Région"
+
+#~ msgid "Show zoom toolbar"
+#~ msgstr "Afficher la barre d'outil Zoom"
+
+#~ msgid "Synchronise editor and mixer selection"
+#~ msgstr "Sélection des pistes identique entre éditeur et mixage"
+
+#~ msgid "Solo / mute"
+#~ msgstr "Solo / muet"
+
+#, fuzzy
+#~ msgid "Sound MIDI notes as they are selected"
+#~ msgstr "Jouer les notes MIDI à leur sélection"
+
+#~ msgid "Control surface remote ID"
+#~ msgstr "Identifiant de la surface de contrôle distante "
+
+#~ msgid "assigned by user"
+#~ msgstr "assigné manuellement"
+
+#~ msgid "follows order of mixer"
+#~ msgstr "suit l'ordonnancement de la Console"
+
+#, fuzzy
+#~ msgid "slowish [12.0dB/sec] (DIN)"
+#~ msgstr "moins lent [12.0dB/sec] (DIN)"
+
+#, fuzzy
+#~ msgid "moderate [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"
+#~ msgstr "modéré [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"
+
+#, fuzzy
+#~ msgid "medium [20dB/sec]"
+#~ msgstr "moyen [20dB/sec]"
+
+#, fuzzy
+#~ msgid "fast [32dB/sec]"
+#~ msgstr "rapide [32dB/sec]"
+
+#, fuzzy
+#~ msgid "faster [46dB/sec]"
+#~ msgstr "plus rapide [46dB/sec]"
+
+#, fuzzy
+#~ msgid "fastest [70dB/sec]"
+#~ msgstr "le plus rapide [70dB/sec]"
+
+#~ msgid "Trigger gap"
+#~ msgstr "Écart déclenchant"
+
+#~ msgid "You cannot create a track with that name as it is reserved for %1"
+#~ msgstr ""
+#~ "Vous ne pouvez pas créer une piste avec ce nom, il est réservé pour %1"
+
+#~ msgid "Select From All..."
+#~ msgstr "Choisir depuis toutes…"
+
+#~ msgid ""
+#~ "Do you really want to remove track \"%1\" ?\n"
+#~ "\n"
+#~ "You may also lose the playlist used by this track.\n"
+#~ "\n"
+#~ "(This action cannot be undone, and the session file will be overwritten)"
+#~ msgstr ""
+#~ "Voulez-vous vraiment supprimer la piste « %1 » ?\n"
+#~ "\n"
+#~ "Vous pourrez aussi perdre la liste de lecture utilisée par cette piste.\n"
+#~ "\n"
+#~ "(Cette action ne pourra pas être annulée, et le fichier de session sera "
+#~ "écrasé)"
+
+#~ msgid ""
+#~ "Do you really want to remove bus \"%1\" ?\n"
+#~ "\n"
+#~ "(This action cannot be undone, and the session file will be overwritten)"
+#~ msgstr ""
+#~ "Voulez-vous vraiment supprimer le bus « %1 » ?\n"
+#~ "\n"
+#~ "Le fichier de session sera écrasé et cette action ne pourra pas être "
+#~ "annulée !"
+
+#~ msgid "Remove track"
+#~ msgstr "Supprimer la piste"
+
+#~ msgid "Remove bus"
+#~ msgstr "Supprimer le bus"
+
+#~ msgid "Remote Control ID"
+#~ msgstr "Identifiant de contrôleur distant"
+
+#~ msgid "Remote control ID:"
+#~ msgstr "Identifiant de contrôleur distant :"
+
+#, fuzzy
+#~ msgid ""
+#~ "The remote control ID of %1 is: %2\n"
+#~ "\n"
+#~ "\n"
+#~ "The remote control ID of %3 cannot be changed."
+#~ msgstr ""
+#~ "L'ID MIDI du controleur %1 est: %2\n"
+#~ "\n"
+#~ "\n"
+#~ "L'ID MIDI du controleur %3 ne peut être changée."
+
+#, fuzzy
+#~ msgid "the master bus"
+#~ msgstr "Le Bus Master"
+
+#, fuzzy
+#~ msgid "the monitor bus"
+#~ msgstr "Le Bus de Monitoring"
+
+#, fuzzy
+#~ msgid ""
+#~ "The remote control ID of %5 is: %2\n"
+#~ "\n"
+#~ "\n"
+#~ "Remote Control IDs are currently determined by track/bus ordering in %6.\n"
+#~ "\n"
+#~ "%3Use the User Interaction tab of the Preferences window if you want to "
+#~ "change this%4"
+#~ msgstr ""
+#~ "L'ID du controleur distant de %5 est : %2\n"
+#~ "\n"
+#~ "\n"
+#~ "Les ID de controleurs distants sont déterminées par l'ordonnancement "
+#~ "Pistes/Bus dans Ardour.\n"
+#~ "\n"
+#~ "%3Pour changer cela, aller dans la fenetre Préférences puis dans l'onglet "
+#~ "Interaction Utlisateur%4"
+
+#~ msgid ""
+#~ "Left-click to invert (phase reverse) channel %1 of this track.  Right-"
+#~ "click to show menu."
+#~ msgstr ""
+#~ "Clic gauche pour inverser la phase du canal %1 de cette piste. Clic droit "
+#~ "pour afficher le menu."
+
+#, fuzzy
+#~ msgid "Click to show a menu of channels for inversion (phase reverse)"
+#~ msgstr "Cliquer affiche le menu des canaux pour l'inversion de phase"
+
+# If chain doesn't say "formatting the disk" but "format OF the disk", translation is ok
+#, fuzzy
+#~ msgid "Disk Format"
+#~ msgstr "Format du Disque"
+
+#~ msgid "32 bit float"
+#~ msgstr "32 bit flottant"
+
+#~ msgid "24 bit"
+#~ msgstr "24 bit"
+
+#~ msgid "16 bit"
+#~ msgstr "16 bit"
+
+#~ msgid "Broadcast WAVE"
+#~ msgstr "Broadcast WAVE"
+
+#~ msgid "WAVE"
+#~ msgstr "WAVE"
+
+#, fuzzy
+#~ msgid "Press to import selected files and close this window"
+#~ msgstr "Importer les fichiers sélectionnés et fermer cette fenêtre"
+
+#, fuzzy
+#~ msgid "Press to import selected files and leave this window open"
+#~ msgstr "Importer les fichiers sélectionnés et laisser cette fenêtre ouverte"
+
+#, fuzzy
+#~ msgid "<b>Add files as ...</b>"
+#~ msgstr "<b>Ajouter les fichiers...</b>"
+
+#~ msgid "Contents:"
+#~ msgstr "Contenu :"
+
+#, fuzzy
+#~ msgid ""
+#~ "No ffprobe or ffmpeg executables could be found on this system.\n"
+#~ "Video import and export is not possible until you install those tools.\n"
+#~ "%1 requires ffmpeg and ffprobe from ffmpeg.org - version 1.1 or newer.\n"
+#~ "\n"
+#~ "The tools are included with the %1 releases from ardour.org and also "
+#~ "available with the video-server at http://x42.github.com/harvid/\n"
+#~ "\n"
+#~ "Important: the files need to be installed in $PATH and named "
+#~ "ffmpeg_harvid and ffprobe_harvid.\n"
+#~ "If you already have a suitable ffmpeg installation on your system, we "
+#~ "recommend creating symbolic links from ffmpeg to ffmpeg_harvid and from "
+#~ "ffprobe to ffprobe_harvid.\n"
+#~ "\n"
+#~ "see also http://manual.ardour.org/video-timeline/setup/"
+#~ msgstr ""
+#~ "Pas de paquet ffprobe ou ffmpeg sur votre système.\n"
+#~ "L'import/export Vidéo est impossible sans installer ces outils.\n"
+#~ "%1 nécessite ffmpeg et ffprobe, fournis par ffmpeg.org, version 1.1 ou "
+#~ "plus récente.\n"
+#~ "\n"
+#~ "Ces outils sont inclus dans la version %1 d'ardour.org et aussi "
+#~ "disponibles avec le serveur-vidéo à http://x42.github.com/harvid/\n"
+#~ "\n"
+#~ "Important : les fichiers sont à installer dans $PATH et à nommer "
+#~ "ffmpeg_harvid et ffprobe_harvid.\n"
+#~ "Si votre système inclut déjà les paquets concernés, nous vous "
+#~ "recommandons la création de liens symboliques de ffmpeg à ffmpeg_harvid "
+#~ "et de ffprobe à ffprobe_harvid.\n"
+#~ "\n"
+#~ "voir aussi (anglais) http://manual.ardour.org/video-timeline/setup/"
+
+#, fuzzy
+#~ msgid ""
+#~ "No ffprobe or ffmpeg executables could be found on this system. Video "
+#~ "Import is not possible until you install those tools. See the Log window "
+#~ "for more information."
+#~ msgstr ""
+#~ "Les éxécutables ffprobe ou ffmpeg ne sont pas disponibles. L'import Vidéo "
+#~ "est impossible sans installer ces outils. Vous trouverez plus d'infos "
+#~ "dans la fenêtre de Log."
+
+#, fuzzy
+#~ msgid "Reference From Current Location (Previously Transcoded Files Only)"
+#~ msgstr ""
+#~ "Référence d'emplacement actuel (seulement les fichiers déjà transcodés)"
+
+#, fuzzy
+#~ msgid ""
+#~ "A file with the same name already exists.  Do you want to overwrite it?"
+#~ msgstr "Un fichier existant porte déjà ce nom. Voulez vous l'écraser ?"
+
+#, fuzzy
+#~ msgid ""
+#~ "No ffprobe or ffmpeg executables could be found on this system. Video "
+#~ "Export is not possible until you install those tools. See the Log window "
+#~ "for more information."
+#~ msgstr ""
+#~ "Pas de paquet ffprobe ou ffmpeg sur votre système. L'exportation Vidéo "
+#~ "est impossible sans installer ces outils. Plus d'infos dans la fenêtre de "
+#~ "Log."
+
+#, fuzzy
+#~ msgid ""
+#~ "Video encoding is a non-trivial task with many details.\n"
+#~ "\n"
+#~ "Please see the manual at %1/video-timeline/operations/#export.\n"
+#~ "\n"
+#~ "Open Manual in Browser? "
+#~ msgstr ""
+#~ "L'encodage Vidéo est une tâche complexe avec de nombreux détails\n"
+#~ "\n"
+#~ "Merci de consulter le manuel à %1/video-timeline/operations/#export "
+#~ "(anglais).\n"
+#~ "\n"
+#~ "Ouvrir le manuel en ligne ? "
 
 #~ msgid ""
 #~ "Could not connect to the Video Server. Start it or configure its access "
diff --git a/gtk2_ardour/po/it.mo b/gtk2_ardour/po/it.mo
new file mode 100644
index 0000000..7b4018e
Binary files /dev/null and b/gtk2_ardour/po/it.mo differ
diff --git a/gtk2_ardour/po/it.po b/gtk2_ardour/po/it.po
index 02c2202..7302980 100644
--- a/gtk2_ardour/po/it.po
+++ b/gtk2_ardour/po/it.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: ardour 0.354.0\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-03-31 20:13-0400\n"
+"POT-Creation-Date: 2016-07-14 06:20-0400\n"
 "PO-Revision-Date: 2015-03-22 20:52+0100\n"
 "Last-Translator: Raffaele Morelli <raffaele.morelli at gmail.com>\n"
 "Language-Team: Italiano <>\n"
@@ -19,255 +19,287 @@ msgstr ""
 "X-Generator: Gtranslator 2.91.6\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: about.cc:125
+#: about.cc:127
+msgid "Fons Adriaensen"
+msgstr ""
+
+#: about.cc:128
 msgid "Brian Ahr"
 msgstr "Brian Ahr"
 
-#: about.cc:126
+#: about.cc:129
 msgid "John Anderson"
 msgstr "John Anderson"
 
-#: about.cc:127
+#: about.cc:130
 msgid "Marcus Andersson"
 msgstr "Marcus Andersson"
 
-#: about.cc:128
+#: about.cc:131
 msgid "Nedko Arnaudov"
 msgstr "Nedko Arnaudov"
 
-#: about.cc:129
+#: about.cc:132
 msgid "Hans Baier"
 msgstr "Hans Baier"
 
-#: about.cc:130
+#: about.cc:133
 msgid "Ben Bell"
 msgstr "Ben Bell"
 
-#: about.cc:131
+#: about.cc:134
 msgid "Sakari Bergen"
 msgstr "Sakari Bergen"
 
-#: about.cc:132
+#: about.cc:135
 msgid "Christian Borss"
 msgstr "Christian Borss"
 
-#: about.cc:133
+#: about.cc:136
 msgid "Chris Cannam"
 msgstr "Chris Cannam"
 
-#: about.cc:134
+#: about.cc:137
 msgid "Jeremy Carter"
 msgstr "Jeremy Carter"
 
-#: about.cc:135
+#: about.cc:138
 msgid "Jesse Chappell"
 msgstr "Jesse Chappell"
 
-#: about.cc:136
+#: about.cc:139
 msgid "Thomas Charbonnel"
 msgstr "Thomas Charbonnel"
 
-#: about.cc:137
+#: about.cc:140
 msgid "Sam Chessman"
 msgstr "Sam Chessman"
 
-#: about.cc:138
+#: about.cc:141
 msgid "André Colomb"
 msgstr "André Colomb"
 
-#: about.cc:139
+#: about.cc:142
 msgid "Paul Davis"
 msgstr "Paul Davis"
 
-#: about.cc:140
+#: about.cc:143
 msgid "Gerard van Dongen"
 msgstr "Gerard van Dongen"
 
-#: about.cc:141
+#: about.cc:144
 msgid "John Emmas"
 msgstr "John Emmas"
 
-#: about.cc:142
+#: about.cc:145
 msgid "Colin Fletcher"
 msgstr "Colin Fletcher"
 
-#: about.cc:143
+#: about.cc:146
 msgid "Dave Flick"
 msgstr "Dave Flick"
 
-#: about.cc:144
+#: about.cc:147
 msgid "Hans Fugal"
 msgstr "Hans Fugal"
 
-#: about.cc:145
+#: about.cc:148
 msgid "Robin Gareus"
 msgstr "Robin Gareus"
 
-#: about.cc:146
+#: about.cc:149
+msgid "Nil Geisweiller"
+msgstr ""
+
+#: about.cc:150
 msgid "Christopher George"
 msgstr "Christopher George"
 
-#: about.cc:147
+#: about.cc:151
 msgid "Chris Goddard"
 msgstr "Chris Goddard"
 
-#: about.cc:148
+#: about.cc:152
 msgid "J. Abelardo Gutierrez"
 msgstr "J. Abelardo Gutierrez"
 
-#: about.cc:149
+#: about.cc:153
 msgid "Jeremy Hall"
 msgstr "Jeremy Hall"
 
-#: about.cc:150
+#: about.cc:154
 msgid "Audun Halland"
 msgstr "Audun Halland"
 
-#: about.cc:151
+#: about.cc:155
 msgid "David Halter"
 msgstr "David Halter"
 
-#: about.cc:152
+#: about.cc:156
 msgid "Steve Harris"
 msgstr "Steve Harris"
 
-#: about.cc:153
+#: about.cc:157
 msgid "Melvin Ray Herr"
 msgstr ""
 
-#: about.cc:154
+#: about.cc:158
 msgid "Carl Hetherington"
 msgstr ""
 
-#: about.cc:155
+#: about.cc:159
 msgid "Rob Holland"
 msgstr ""
 
-#: about.cc:156
+#: about.cc:160
 msgid "Robert Jordens"
 msgstr ""
 
-#: about.cc:157
+#: about.cc:161
 msgid "Stefan Kersten"
 msgstr ""
 
-#: about.cc:158
+#: about.cc:162
 msgid "Armand Klenk"
 msgstr ""
 
-#: about.cc:159
+#: about.cc:163
 msgid "Julien de Kozak"
 msgstr ""
 
-#: about.cc:160
+#: about.cc:164
 msgid "Matt Krai"
 msgstr ""
 
-#: about.cc:161
+#: about.cc:165
 msgid "Georg Krause"
 msgstr ""
 
-#: about.cc:162
+#: about.cc:166
 msgid "Nick Lanham"
 msgstr ""
 
-#: about.cc:163
+#: about.cc:167
 msgid "Colin Law"
 msgstr ""
 
-#: about.cc:164
+#: about.cc:168
 msgid "Joshua Leach"
 msgstr ""
 
-#: about.cc:165
+#: about.cc:169
 msgid "Ben Loftis"
 msgstr ""
 
-#: about.cc:166
+#: about.cc:170
 msgid "Nick Mainsbridge"
 msgstr ""
 
-#: about.cc:167
+#: about.cc:171
 msgid "Tim Mayberry"
 msgstr ""
 
-#: about.cc:168
+#: about.cc:172
 msgid "Doug Mclain"
 msgstr ""
 
-#: about.cc:169
+#: about.cc:173
 msgid "Todd Naugle"
 msgstr ""
 
-#: about.cc:170
+#: about.cc:174
+msgid "André Nusser"
+msgstr ""
+
+#: about.cc:175
+msgid "Bent Bisballe Nyeng"
+msgstr ""
+
+#: about.cc:176
 msgid "Jack O'Quin"
 msgstr ""
 
-#: about.cc:171
+#: about.cc:177
+msgid "Pavel Potocek"
+msgstr ""
+
+#: about.cc:178
 msgid "Nimal Ratnayake"
 msgstr ""
 
-#: about.cc:172
+#: about.cc:179
+msgid "Julien Rivaud"
+msgstr ""
+
+#: about.cc:180
 msgid "David Robillard"
 msgstr ""
 
-#: about.cc:173
+#: about.cc:181
+msgid "Julien Roger"
+msgstr ""
+
+#: about.cc:182
 msgid "Taybin Rutkin"
 msgstr ""
 
-#: about.cc:174
+#: about.cc:183
 msgid "Andreas Ruge"
 msgstr ""
 
-#: about.cc:175
+#: about.cc:184
 msgid "Sampo Savolainen"
 msgstr ""
 
-#: about.cc:176
+#: about.cc:185
 msgid "Rodrigo Severo"
 msgstr ""
 
-#: about.cc:177
+#: about.cc:186
 msgid "Per Sigmond"
 msgstr ""
 
-#: about.cc:178
+#: about.cc:187
 msgid "Lincoln Spiteri"
 msgstr ""
 
-#: about.cc:179
+#: about.cc:188
 msgid "Mike Start"
 msgstr ""
 
-#: about.cc:180
+#: about.cc:189
 msgid "Mark Stewart"
 msgstr ""
 
-#: about.cc:181
+#: about.cc:190
 msgid "Roland Stigge"
 msgstr ""
 
-#: about.cc:182
+#: about.cc:191
 msgid "Petter Sundlöf"
 msgstr ""
 
-#: about.cc:183
+#: about.cc:192
 msgid "Mike Täht"
 msgstr ""
 
-#: about.cc:184
+#: about.cc:193
 msgid "Roy Vegard"
 msgstr ""
 
-#: about.cc:185
+#: about.cc:194
 msgid "Thorsten Wilms"
 msgstr ""
 
-#: about.cc:186
+#: about.cc:195
+msgid "Damien Zammit"
+msgstr ""
+
+#: about.cc:196
 msgid "Grygorii Zharun"
 msgstr ""
 
-#: about.cc:191
+#: about.cc:201
 msgid ""
 "French:\n"
 "\tAlain Fréhel <alain.frehel at free.fr>\n"
@@ -276,7 +308,7 @@ msgid ""
 "\tRomain Arnaud <roming22 at gmail.com>\n"
 msgstr ""
 
-#: about.cc:192
+#: about.cc:202
 msgid ""
 "German:\n"
 "\tKarsten Petersen <kapet at kapet.de>\n"
@@ -288,216 +320,268 @@ msgid ""
 "\tRobin Gloster <robin at loc-com.de>\n"
 msgstr ""
 
-#: about.cc:199
+#: about.cc:209
 msgid ""
 "Italian:\n"
 "\tFilippo Pappalardo <filippo at email.it>\n"
 "\tRaffaele Morelli <raffaele.morelli at gmail.com>\n"
 msgstr ""
 "Italiano:\n"
-"\tRaffaele Morelli <raffaele.morelli at gmail.com>"
+"\tRaffaele Morelli <raffaele.morelli at gmail.com>\n"
 
-#: about.cc:200
+#: about.cc:210
 msgid ""
 "Portuguese:\n"
 "\tRui Nuno Capela <rncbc at rncbc.org>\n"
 msgstr ""
 
-#: about.cc:201
+#: about.cc:211
 msgid ""
 "Brazilian Portuguese:\n"
 "\tAlexander da Franca Fernandes <alexander at nautae.eti.br>\n"
 "\tChris Ross <chris at tebibyte.org>\n"
 msgstr ""
 
-#: about.cc:203
+#: about.cc:213
 msgid ""
 "Spanish:\n"
 "\t Alex Krohn <alexkrohn at fastmail.fm>\n"
 "\tPablo Fernández <pablo.fbus at gmail.com>\n"
 msgstr ""
 
-#: about.cc:204
+#: about.cc:214
 msgid ""
 "Russian:\n"
 "\t Igor Blinov <pitstop at nm.ru>\n"
 "\tAlexandre Prokoudine <alexandre.prokoudine at gmail.com>\n"
 msgstr ""
 
-#: about.cc:206
+#: about.cc:216
 msgid ""
 "Greek:\n"
 "\t Klearchos Gourgourinis <muadib at in.gr>\n"
 msgstr ""
 
-#: about.cc:207
+#: about.cc:217
 msgid ""
 "Swedish:\n"
 "\t Petter Sundlöf <petter.sundlof at gmail.com>\n"
 msgstr ""
 
-#: about.cc:208
+#: about.cc:218
 msgid ""
 "Polish:\n"
 "\t Piotr Zaryk <pzaryk at gmail.com>\n"
 msgstr ""
 
-#: about.cc:209
+#: about.cc:219
 msgid ""
 "Czech:\n"
 "\t Pavel Fric <pavelfric at seznam.cz>\n"
 msgstr ""
 
-#: about.cc:210
+#: about.cc:220
 msgid ""
 "Norwegian:\n"
 "\t Eivind Ødegård\n"
 msgstr ""
 
-#: about.cc:211
+#: about.cc:221
 msgid ""
 "Chinese:\n"
 "\t Rui-huai Zhang <zrhzrh at mail.ustc.edu.cn>\n"
 msgstr ""
 
-#: about.cc:591
+#: about.cc:601
+msgid "Intel 64-bit"
+msgstr ""
+
+#: about.cc:603
+msgid "Intel 32-bit"
+msgstr ""
+
+#: about.cc:605
+msgid "PowerPC 64-bit"
+msgstr ""
+
+#: about.cc:607
+msgid "PowerPC 32-bit"
+msgstr ""
+
+#: about.cc:609
+msgid "64-bit"
+msgstr ""
+
+#: about.cc:611
+msgid "32-bit"
+msgstr ""
+
+#: about.cc:619
+msgid " - debug"
+msgstr ""
+
+#: about.cc:625
 msgid "Copyright (C) 1999-2015 Paul Davis\n"
 msgstr ""
 
-#: about.cc:595
+#: about.cc:629
 msgid "http://ardour.org/"
 msgstr "http://ardour.org/"
 
-#: about.cc:596
+#: about.cc:630
 msgid ""
 "%1%2\n"
-"(built from revision %3)"
+"(rev %3)\n"
+"%4%5"
 msgstr ""
-"%1%2\n"
-"(compilato dalla revisione %3)"
 
-#: about.cc:600
+#: about.cc:635
 msgid "Config"
 msgstr "Configurazione "
 
-#: actions.cc:85
+#: actions.cc:83
 msgid "Loading menus from %1"
 msgstr "Inizializzazione menù da %1"
 
-#: actions.cc:88 actions.cc:89
+#: actions.cc:86 actions.cc:87
 msgid "badly formatted menu definition file: %1"
 msgstr "file delle definizioni non formattato correttamente"
 
-#: actions.cc:91
+#: actions.cc:89
 msgid "%1 menu definition file not found"
 msgstr "%1 file di definizione del menù mancante"
 
-#: actions.cc:95 actions.cc:96
+#: actions.cc:93 actions.cc:94
 msgid "%1 will not work without a valid menu definition file"
 msgstr ""
 "%1 non funzionerà correttamente senza un file valido per la definizione del "
 "menù"
 
-#: add_route_dialog.cc:54 route_params_ui.cc:524
-msgid "Add Track or Bus"
-msgstr "Aggiungi Traccia/Bus"
+#: add_route_dialog.cc:58
+msgid "Add Track/Bus/VCA"
+msgstr ""
 
-#: add_route_dialog.cc:57
+#: add_route_dialog.cc:61
 msgid "Configuration:"
 msgstr "Configurazione:"
 
-#: add_route_dialog.cc:58
+#: add_route_dialog.cc:62
 msgid "Record Mode:"
 msgstr "Modalità registrazione:"
 
-#: add_route_dialog.cc:59
+#: add_route_dialog.cc:63
 msgid "Instrument:"
 msgstr "Strumento:"
 
-#: add_route_dialog.cc:77
+#: add_route_dialog.cc:77 add_route_dialog.cc:228
 msgid "Audio Tracks"
 msgstr "Tracce audio"
 
-#: add_route_dialog.cc:78 add_route_dialog.cc:209
+#: add_route_dialog.cc:78 add_route_dialog.cc:224
 msgid "MIDI Tracks"
 msgstr "Tracce MIDI"
 
-#: add_route_dialog.cc:79 add_route_dialog.cc:211
+#: add_route_dialog.cc:79 add_route_dialog.cc:226
 msgid "Audio+MIDI Tracks"
 msgstr "Tracce Audio+MIDI"
 
-#: add_route_dialog.cc:80 add_route_dialog.cc:207
-msgid "Busses"
-msgstr "Busses"
+#: add_route_dialog.cc:80 add_route_dialog.cc:220
+msgid "Audio Busses"
+msgstr ""
+
+#: add_route_dialog.cc:81 add_route_dialog.cc:222
+msgid "MIDI Busses"
+msgstr ""
+
+#: add_route_dialog.cc:82
+msgid "VCA Masters"
+msgstr ""
 
-#: add_route_dialog.cc:83 add_route_dialog.cc:559
+#: add_route_dialog.cc:85 add_route_dialog.cc:622
 msgid "First"
 msgstr ""
 
-#: add_route_dialog.cc:84 add_route_dialog.cc:561
-msgid "After Editor Selection"
+#: add_route_dialog.cc:86 add_route_dialog.cc:626
+msgid "Before Selection"
 msgstr ""
 
-#: add_route_dialog.cc:85 add_route_dialog.cc:563
-msgid "After Mixer Selection"
+#: add_route_dialog.cc:87 add_route_dialog.cc:624
+msgid "After Selection"
 msgstr ""
 
-#: add_route_dialog.cc:86
+#: add_route_dialog.cc:88
 msgid "Last"
 msgstr ""
 
-#: add_route_dialog.cc:103
+#: add_route_dialog.cc:91
+msgid "Flexible-I/O"
+msgstr ""
+
+#: add_route_dialog.cc:92
+msgid "Strict-I/O"
+msgstr ""
+
+#: add_route_dialog.cc:108
 msgid "Add:"
 msgstr "Aggiungi:"
 
-#: add_route_dialog.cc:116 time_fx_dialog.cc:91 add_video_dialog.cc:135
-#: video_server_dialog.cc:121
+#: add_route_dialog.cc:121 time_fx_dialog.cc:101 add_video_dialog.cc:135
+#: video_server_dialog.cc:118
 msgid "<b>Options</b>"
 msgstr "Opzioni"
 
-#: add_route_dialog.cc:126 bundle_manager.cc:193 region_editor.cc:50
-#: route_group_dialog.cc:71
+#: add_route_dialog.cc:131 bundle_manager.cc:193 region_editor.cc:52
+#: route_group_dialog.cc:70
 msgid "Name:"
 msgstr "Nome:"
 
-#: add_route_dialog.cc:156
+#: add_route_dialog.cc:155
 msgid "Group:"
 msgstr "Gruppo:"
 
-#: add_route_dialog.cc:162
+#: add_route_dialog.cc:161
 msgid "Insert:"
 msgstr ""
 
-#: add_route_dialog.cc:223 add_route_dialog.cc:232 add_route_dialog.cc:306
-#: ardour_ui_ed.cc:539 engine_dialog.cc:237 rc_option_editor.cc:1805
-#: rc_option_editor.cc:1807 rc_option_editor.cc:1809 rc_option_editor.cc:1827
-#: rc_option_editor.cc:1829 rc_option_editor.cc:1837 rc_option_editor.cc:1839
-#: rc_option_editor.cc:1857 rc_option_editor.cc:1870 rc_option_editor.cc:1872
-#: rc_option_editor.cc:1874 rc_option_editor.cc:1919 rc_option_editor.cc:1921
-#: rc_option_editor.cc:1923 rc_option_editor.cc:1931 rc_option_editor.cc:1939
-#: rc_option_editor.cc:1941 rc_option_editor.cc:1949
+#: add_route_dialog.cc:171
+msgid "Output Ports:"
+msgstr ""
+
+#: add_route_dialog.cc:176 rc_option_editor.cc:2474
+msgid ""
+"With strict-i/o enabled, Effect Processors will not modify the number of "
+"channels on a track. The number of output channels will always match the "
+"number of input channels."
+msgstr ""
+
+#: add_route_dialog.cc:240 add_route_dialog.cc:351 ardour_ui_ed.cc:636
+#: engine_dialog.cc:244 plugin_pin_dialog.cc:67 rc_option_editor.cc:2397
+#: rc_option_editor.cc:2399 rc_option_editor.cc:2401 rc_option_editor.cc:2419
+#: rc_option_editor.cc:2421 rc_option_editor.cc:2429 rc_option_editor.cc:2432
+#: rc_option_editor.cc:2450 rc_option_editor.cc:2463 rc_option_editor.cc:2472
+#: rc_option_editor.cc:2478 rc_option_editor.cc:2480 rc_option_editor.cc:2525
+#: rc_option_editor.cc:2527 rc_option_editor.cc:2529 rc_option_editor.cc:2537
 msgid "Audio"
 msgstr "Audio"
 
-#: add_route_dialog.cc:224 add_route_dialog.cc:235 add_route_dialog.cc:307
-#: editor_actions.cc:109 engine_dialog.cc:239 missing_file_dialog.cc:56
-#: rc_option_editor.cc:2084 rc_option_editor.cc:2094 rc_option_editor.cc:2102
-#: rc_option_editor.cc:2110 rc_option_editor.cc:2119 rc_option_editor.cc:2127
-#: rc_option_editor.cc:2135 rc_option_editor.cc:2143 rc_option_editor.cc:2152
-#: rc_option_editor.cc:2161 rc_option_editor.cc:2170 rc_option_editor.cc:2178
-#: rc_option_editor.cc:2186 rc_option_editor.cc:2194 rc_option_editor.cc:2217
+#: add_route_dialog.cc:243 add_route_dialog.cc:352 editor_actions.cc:112
+#: engine_dialog.cc:246 missing_file_dialog.cc:60 mixer_ui.cc:1895
+#: plugin_pin_dialog.cc:68 rc_option_editor.cc:2672 rc_option_editor.cc:2674
+#: rc_option_editor.cc:2684 rc_option_editor.cc:2693 rc_option_editor.cc:2701
+#: rc_option_editor.cc:2709 rc_option_editor.cc:2717 rc_option_editor.cc:2790
+#: rc_option_editor.cc:2813
 msgid "MIDI"
 msgstr "MIDI"
 
-#: add_route_dialog.cc:225 add_route_dialog.cc:238 add_route_dialog.cc:308
+#: add_route_dialog.cc:246 add_route_dialog.cc:353
 msgid "Audio+MIDI"
 msgstr "Audio+MIDI"
 
-#: add_route_dialog.cc:226 add_route_dialog.cc:241 add_route_dialog.cc:309
+#: add_route_dialog.cc:250 add_route_dialog.cc:354
 msgid "Bus"
 msgstr "Bus"
 
-#: add_route_dialog.cc:268
+#: add_route_dialog.cc:286
 msgid ""
 "Audio+MIDI tracks are intended for use <b>ONLY</b> with plugins that use "
 "both audio and MIDI input data\n"
@@ -511,60 +595,61 @@ msgstr ""
 "Se non hai intenzione di utilizzare questo tipo di plugin allora utilizza "
 "delle normali tracce audio o midi."
 
-#: add_route_dialog.cc:327 add_route_dialog.cc:346 editor_actions.cc:422
-#: editor_rulers.cc:251 time_axis_view.cc:1374
+#: add_route_dialog.cc:373 add_route_dialog.cc:385 editor_actions.cc:456
+#: editor_rulers.cc:250 time_axis_view.cc:1290
 msgid "Normal"
 msgstr "Normale"
 
-#: add_route_dialog.cc:330 add_route_dialog.cc:348
+#: add_route_dialog.cc:374 add_route_dialog.cc:387
 msgid "Non Layered"
 msgstr "Non stratificato"
 
-#: add_route_dialog.cc:331 add_route_dialog.cc:350
+#: add_route_dialog.cc:375 add_route_dialog.cc:389
 msgid "Tape"
 msgstr "Nastro"
 
-#: add_route_dialog.cc:431 monitor_section.cc:290
+#: add_route_dialog.cc:476 monitor_section.cc:273 plugin_pin_dialog.cc:509
+#: plugin_setup_dialog.cc:202
 msgid "Mono"
 msgstr "Mono"
 
-#: add_route_dialog.cc:435
+#: add_route_dialog.cc:480 plugin_pin_dialog.cc:512 plugin_setup_dialog.cc:205
 msgid "Stereo"
 msgstr "Stereo"
 
-#: add_route_dialog.cc:459
+#: add_route_dialog.cc:503
 msgid "3 Channel"
 msgstr "3 canali"
 
-#: add_route_dialog.cc:463
+#: add_route_dialog.cc:507
 msgid "4 Channel"
 msgstr "4 canali"
 
-#: add_route_dialog.cc:467
+#: add_route_dialog.cc:511
 msgid "5 Channel"
 msgstr "5 canali"
 
-#: add_route_dialog.cc:471
+#: add_route_dialog.cc:515
 msgid "6 Channel"
 msgstr "6 canali"
 
-#: add_route_dialog.cc:475
+#: add_route_dialog.cc:519
 msgid "8 Channel"
 msgstr "8 canali"
 
-#: add_route_dialog.cc:479
+#: add_route_dialog.cc:523
 msgid "12 Channel"
 msgstr "12 canli"
 
-#: add_route_dialog.cc:483 mixer_strip.cc:1836 mixer_strip.cc:2244
+#: add_route_dialog.cc:527 mixer_strip.cc:2009 mixer_strip.cc:2455
 msgid "Custom"
 msgstr "Personalizzato"
 
-#: add_route_dialog.cc:516 add_route_dialog.cc:532 route_group_menu.cc:81
+#: add_route_dialog.cc:569 add_route_dialog.cc:585 route_group_menu.cc:85
 msgid "New Group..."
 msgstr "Nuovo Gruppo"
 
-#: add_route_dialog.cc:520 route_group_menu.cc:85
+#: add_route_dialog.cc:573 route_group_menu.cc:89
 msgid "No Group"
 msgstr "Nessun Gruppo"
 
@@ -572,7 +657,7 @@ msgstr "Nessun Gruppo"
 msgid "Ambiguous File"
 msgstr "File ambiguo"
 
-#: ambiguous_file_dialog.cc:35
+#: ambiguous_file_dialog.cc:37
 msgid ""
 "%1 has found the file <i>%2</i> in the following places:\n"
 "\n"
@@ -580,7 +665,7 @@ msgstr ""
 "%1 ha trovato il file <i>%2</i> nelle seguenti posizioni:\n"
 "\n"
 
-#: ambiguous_file_dialog.cc:44
+#: ambiguous_file_dialog.cc:46
 msgid ""
 "\n"
 "\n"
@@ -589,157 +674,195 @@ msgstr ""
 "\n"
 "Selezionare il percorso dal quale si vuole importare il file."
 
-#: ambiguous_file_dialog.cc:46 missing_file_dialog.cc:46
+#: ambiguous_file_dialog.cc:48 missing_file_dialog.cc:50
 msgid "Done"
 msgstr "Fatto"
 
-#: analysis_window.cc:46
+#: analysis_window.cc:45
 msgid "Signal source"
 msgstr "Segnale sorgente"
 
-#: analysis_window.cc:47
+#: analysis_window.cc:46
 msgid "Selected ranges"
 msgstr "Range selezionati"
 
-#: analysis_window.cc:48
+#: analysis_window.cc:47
 msgid "Selected regions"
 msgstr "Regioni selezionate"
 
-#: analysis_window.cc:50
-msgid "Display model"
-msgstr "Modello di visualizzazione"
-
-#: analysis_window.cc:51
-msgid "Composite graphs for each track"
-msgstr "Grafico composito per ogni traccia"
-
-#: analysis_window.cc:52
-msgid "Composite graph of all tracks"
-msgstr "Grafico composito per tutte le tracce"
-
-#: analysis_window.cc:54
+#: analysis_window.cc:48
 msgid "Show frequency power range"
 msgstr "Mostra l'intervallo di potenza delle frequenze"
 
-#: analysis_window.cc:55
-msgid "Normalize values"
-msgstr "Normalizza i valori"
+#: analysis_window.cc:49
+msgid "Fit dB range"
+msgstr ""
+
+#: analysis_window.cc:50
+msgid "Proportional Spectrum, -18dB"
+msgstr ""
 
-#: analysis_window.cc:59
+#: analysis_window.cc:53
 msgid "FFT analysis window"
 msgstr "Finestra di analisi FFT "
 
-#: analysis_window.cc:60 editor.cc:1823
+#: analysis_window.cc:54 editor.cc:1953
 msgid "Spectral Analysis"
 msgstr "Analisi Spettrale"
 
-#: analysis_window.cc:67 editor_actions.cc:142 export_channel_selector.cc:557
-#: session_metadata_dialog.cc:667
+#: analysis_window.cc:61 editor_actions.cc:145 session_metadata_dialog.cc:670
 msgid "Track"
 msgstr "Traccia"
 
-#: analysis_window.cc:68 editor_actions.cc:648 mixer_ui.cc:131
-#: mixer_ui.cc:1854
+#: analysis_window.cc:62 ardour_ui_ed.cc:254 ardour_ui_ed.cc:255
+#: ardour_ui_ed.cc:256 editor_actions.cc:689 mixer_ui.cc:151 mixer_ui.cc:2134
 msgid "Show"
 msgstr "Mostra"
 
-#: analysis_window.cc:135
+#: analysis_window.cc:107
 msgid "Re-analyze data"
 msgstr "Esegui di nuovo l'analisi"
 
-#: ardour_button.cc:887
+#: ardour_button.cc:876
 msgid "button cannot watch state of non-existing Controllable\n"
 msgstr "il pulsante non riesce a vedere lo stato di Controllable inesistenti\n"
 
-#: ardour_button.cc:1155
+#: ardour_button.cc:1144
 msgid "ABCDEFGHIJLKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
 msgstr "ABCDEFGHIJLKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
 
-#: ardour_ui.cc:164
+#: ardour_ui.cc:198
 msgid ""
 "%1 %2.x has discovered configuration files from %1 %3.x.\n"
 "\n"
-"Would you like to copy the relevant files before starting to use the "
-"program?\n"
+"Would you like these files to be copied and used for %1 %2.x?\n"
 "\n"
 "(This will require you to restart %1.)"
 msgstr ""
 
-#: ardour_ui.cc:211 editor_actions.cc:642 region_editor.cc:51
+#: ardour_ui.cc:283 editor_actions.cc:683 region_editor.cc:53
 msgid "Audition"
 msgstr "Ascolto"
 
-#: ardour_ui.cc:212 editor_actions.cc:136 mixer_strip.cc:2016
-#: rc_option_editor.cc:1959 route_time_axis.cc:252 route_time_axis.cc:2711
+#: ardour_ui.cc:284 editor_actions.cc:139 mixer_strip.cc:2205
+#: monitor_section.cc:329 rc_option_editor.cc:2547 route_time_axis.cc:263
+#: route_time_axis.cc:2740 vca_master_strip.cc:212 vca_time_axis.cc:237
 msgid "Solo"
 msgstr "Solo"
 
-#: ardour_ui.cc:213 rc_option_editor.cc:741
+#: ardour_ui.cc:285 rc_option_editor.cc:1357
 msgid "Feedback"
 msgstr "Feedback"
 
-#: ardour_ui.cc:219 speaker_dialog.cc:36
+#: ardour_ui.cc:296 speaker_dialog.cc:36
 msgid "Speaker Configuration"
 msgstr "Configurazione altoparlanti"
 
-#: ardour_ui.cc:220 keyeditor.cc:53
-msgid "Key Bindings"
-msgstr "Scorciatoie da tastiera"
-
-#: ardour_ui.cc:221
-msgid "Preferences"
-msgstr "Preferenze"
-
-#: ardour_ui.cc:222 ardour_ui.cc:229
+#: ardour_ui.cc:297
 msgid "Add Tracks/Busses"
 msgstr "Aggiungi Tracce/Bus"
 
-#: ardour_ui.cc:223
+#: ardour_ui.cc:298
 msgid "About"
 msgstr "Circa"
 
-#: ardour_ui.cc:224 location_ui.cc:1141 session_option_editor.cc:189
-#: session_option_editor.cc:195 session_option_editor.cc:202
-msgid "Locations"
-msgstr "Posizioni"
+#: ardour_ui.cc:299 location_ui.cc:1167
+msgid "Ranges|Locations"
+msgstr ""
 
-#: ardour_ui.cc:225 route_params_ui.cc:59 route_params_ui.cc:630
+#: ardour_ui.cc:300 route_params_ui.cc:59 route_params_ui.cc:620
 msgid "Tracks and Busses"
 msgstr "Tracce e Bus"
 
-#: ardour_ui.cc:226 engine_dialog.cc:70
+#: ardour_ui.cc:301 engine_dialog.cc:73
 msgid "Audio/MIDI Setup"
 msgstr "Impostazioni Audio/MIDI"
 
-#: ardour_ui.cc:227
+#: ardour_ui.cc:302
 msgid "Video Export Dialog"
 msgstr "Dialogo esportazione video"
 
-#: ardour_ui.cc:228
+#: ardour_ui.cc:303 lua_script_manager.cc:30
+msgid "Script Manager"
+msgstr ""
+
+#: ardour_ui.cc:304
 msgid "Properties"
 msgstr "Proprietà"
 
-#: ardour_ui.cc:230 bundle_manager.cc:264
+#: ardour_ui.cc:305
+msgid "Add Video"
+msgstr ""
+
+#: ardour_ui.cc:306 bundle_manager.cc:264
 msgid "Bundle Manager"
 msgstr "Gestore dei raggruppamenti"
 
-#: ardour_ui.cc:231 big_clock_window.cc:37
+#: ardour_ui.cc:307 big_clock_window.cc:37
 msgid "Big Clock"
 msgstr "Orologio grande"
 
-#: ardour_ui.cc:232
+#: ardour_ui.cc:308
 msgid "Audio Connections"
 msgstr "Connessioni Audio"
 
-#: ardour_ui.cc:233
+#: ardour_ui.cc:309
 msgid "MIDI Connections"
 msgstr "Connessioni MIDI"
 
-#: ardour_ui.cc:242
+#: ardour_ui.cc:310
+msgid "Bindings Editor"
+msgstr ""
+
+#: ardour_ui.cc:321 editor.cc:1288
+msgid "Window|Editor"
+msgstr ""
+
+#: ardour_ui.cc:322 mixer_ui.cc:2210 mixer_ui.cc:2216
+msgid "Window|Mixer"
+msgstr "Finestra|Mixer"
+
+#: ardour_ui.cc:323
+msgid "Window|Preferences"
+msgstr ""
+
+#: ardour_ui.cc:330
 msgid "Your configuration files were copied. You can now restart %1."
 msgstr ""
 
-#: ardour_ui.cc:481
+#: ardour_ui.cc:509
+msgid "Pre-Release Warning"
+msgstr ""
+
+#: ardour_ui.cc:513
+msgid ""
+"<b>Welcome to this pre-release build of %1 %2</b>\n"
+"\n"
+"There are still several issues and bugs to be worked on,\n"
+"as well as general workflow improvements, before this can be considered\n"
+"release software. So, a few guidelines:\n"
+"\n"
+"1) Please do <b>NOT</b> use this software with the expectation that it is "
+"stable or reliable\n"
+"   though it may be so, depending on your workflow.\n"
+"2) Please wait for a helpful writeup of new features.\n"
+"3) <b>Please do NOT use the forums at ardour.org to report issues</b>.\n"
+"4) Please <b>DO</b> use the bugtracker at http://tracker.ardour.org/ to "
+"report issues\n"
+"   making sure to note the product version number as 5.0-pre.\n"
+"5) Please <b>DO</b> use the ardour-users mailing list to discuss ideas and "
+"pass on comments.\n"
+"6) Please <b>DO</b> join us on IRC for real time discussions about %1 %2. "
+"You\n"
+"   can get there directly from within the program via the Help->Chat menu "
+"option.\n"
+"\n"
+"Full information on all the above can be found on the support page at\n"
+"\n"
+"                http://ardour.org/support\n"
+msgstr ""
+
+#: ardour_ui.cc:613
 msgid ""
 "The audio backend was shutdown because:\n"
 "\n"
@@ -749,7 +872,7 @@ msgstr ""
 "\n"
 "%1"
 
-#: ardour_ui.cc:483
+#: ardour_ui.cc:615
 msgid ""
 "The audio backend has either been shutdown or it\n"
 "disconnected %1 because %1\n"
@@ -761,45 +884,45 @@ msgstr ""
 "non era abbastanza veloce. Prova a riavviare il finale audio\n"
 "e salvare la sessione."
 
-#: ardour_ui.cc:507
+#: ardour_ui.cc:639
 msgid ""
 "Audio Unit Plugin Scan Failed. Automatic AU scanning has been disabled. "
 "Please see the log window for further details."
 msgstr ""
 
-#: ardour_ui.cc:508
+#: ardour_ui.cc:640
 msgid "Audio Unit Plugin Scan Failed:"
 msgstr ""
 
-#: ardour_ui.cc:827
+#: ardour_ui.cc:1008
 msgid "NSM server did not announce itself"
 msgstr "Nessuna notifica dal server NSM"
 
-#: ardour_ui.cc:840
+#: ardour_ui.cc:1021
 msgid "NSM: no client ID provided"
 msgstr "NSM: non è stato fornito nessun ID dal client"
 
-#: ardour_ui.cc:847
+#: ardour_ui.cc:1028
 msgid "NSM: no session created"
 msgstr "NSM: non è stata creata una sessione"
 
-#: ardour_ui.cc:870
+#: ardour_ui.cc:1051
 msgid "NSM: initialization failed"
 msgstr "NSM: inizializzazione fallita"
 
-#: ardour_ui.cc:900
+#: ardour_ui.cc:1083
 msgid "Free/Demo Version Warning"
 msgstr ""
 
-#: ardour_ui.cc:902
+#: ardour_ui.cc:1085
 msgid "Subscribe and support development of %1"
 msgstr ""
 
-#: ardour_ui.cc:903
+#: ardour_ui.cc:1086
 msgid "Don't warn me about this again"
 msgstr ""
 
-#: ardour_ui.cc:905
+#: ardour_ui.cc:1088
 msgid ""
 "<span weight=\"bold\" size=\"large\">%1</span>\n"
 "\n"
@@ -810,39 +933,39 @@ msgid ""
 "%4"
 msgstr ""
 
-#: ardour_ui.cc:906
+#: ardour_ui.cc:1089
 msgid "This is a free/demo version of %1"
 msgstr ""
 
-#: ardour_ui.cc:907
+#: ardour_ui.cc:1090
 msgid "It will not restore OR save any plugin settings"
 msgstr ""
 
-#: ardour_ui.cc:908
+#: ardour_ui.cc:1091
 msgid ""
 "If you load an existing session with plugin settings\n"
 "they will not be used and will be lost."
 msgstr ""
 
-#: ardour_ui.cc:910 plugin_ui.cc:569
+#: ardour_ui.cc:1093 plugin_ui.cc:579
 msgid ""
 "To get full access to updates without this limitation\n"
 "consider becoming a subscriber for a low cost every month."
 msgstr ""
 
-#: ardour_ui.cc:920
+#: ardour_ui.cc:1103
 msgid "Quit now"
 msgstr ""
 
-#: ardour_ui.cc:921
+#: ardour_ui.cc:1104
 msgid "Continue using %1"
 msgstr ""
 
-#: ardour_ui.cc:954 startup.cc:345
+#: ardour_ui.cc:1135 startup.cc:349
 msgid "%1 is ready for use"
 msgstr "%1 è pronto."
 
-#: ardour_ui.cc:996
+#: ardour_ui.cc:1185
 msgid ""
 "WARNING: Your system has a limit for maximum amount of locked memory. This "
 "might cause %1 to run out of memory before your system runs out of memory. \n"
@@ -856,23 +979,23 @@ msgstr ""
 "Puoi controllare il limite massimo di memoria usando 'ulimit -l', "
 "normalmente gestito da %2"
 
-#: ardour_ui.cc:1013
+#: ardour_ui.cc:1202
 msgid "Do not show this window again"
 msgstr "Non mostrare di nuovo"
 
-#: ardour_ui.cc:1057
+#: ardour_ui.cc:1245
 msgid "Don't quit"
 msgstr "Non uscire"
 
-#: ardour_ui.cc:1058
+#: ardour_ui.cc:1246
 msgid "Just quit"
 msgstr "Esci e basta"
 
-#: ardour_ui.cc:1059
+#: ardour_ui.cc:1247 ardour_ui.cc:5362
 msgid "Save and quit"
 msgstr "Salva ed esci"
 
-#: ardour_ui.cc:1069
+#: ardour_ui.cc:1257
 msgid ""
 "%1 was unable to save your session.\n"
 "\n"
@@ -886,11 +1009,11 @@ msgstr ""
 "\n"
 "\"Esci e basta\""
 
-#: ardour_ui.cc:1119
+#: ardour_ui.cc:1307
 msgid "Unsaved Session"
 msgstr "Sessione non salvata"
 
-#: ardour_ui.cc:1140
+#: ardour_ui.cc:1328
 msgid ""
 "The session \"%1\"\n"
 "has not been saved.\n"
@@ -908,7 +1031,7 @@ msgstr ""
 "\n"
 "Cosa vuoi fare?"
 
-#: ardour_ui.cc:1143
+#: ardour_ui.cc:1331
 msgid ""
 "The snapshot \"%1\"\n"
 "has not been saved.\n"
@@ -926,74 +1049,107 @@ msgstr ""
 "\n"
 "Cosa vuoi fare?"
 
-#: ardour_ui.cc:1157
+#: ardour_ui.cc:1345
 msgid "Prompter"
 msgstr "Suggeritore"
 
-#: ardour_ui.cc:1269 ardour_ui.cc:1277
+#: ardour_ui.cc:1459 ardour_ui.cc:1467
 msgid "Audio: <span foreground=\"red\">none</span>"
 msgstr "Audio: <span foreground=\"red\">nessuno</span>"
 
-#: ardour_ui.cc:1281
+#: ardour_ui.cc:1471
 #, c-format
 msgid "Audio: <span foreground=\"green\">%.1f kHz / %4.1f ms</span>"
 msgstr "Audio: <span foreground=\"green\">%.1f kHz / %4.1f ms</span>"
 
-#: ardour_ui.cc:1285
+#: ardour_ui.cc:1475
 #, c-format
 msgid "Audio: <span foreground=\"green\">%<PRId64> kHz / %4.1f ms</span>"
 msgstr "Audio: <span foreground=\"green\">%<PRId64> kHz / %4.1f ms</span>"
 
-#: ardour_ui.cc:1303 export_video_dialog.cc:80
+#: ardour_ui.cc:1493 export_report.cc:108 export_report.cc:323
+#: export_video_dialog.cc:76
 msgid "File:"
 msgstr "File:"
 
-#: ardour_ui.cc:1307
+#: ardour_ui.cc:1497
 msgid "BWF"
 msgstr "BWF"
 
-#: ardour_ui.cc:1310
+#: ardour_ui.cc:1500
 msgid "WAV"
 msgstr "WAV"
 
-#: ardour_ui.cc:1313
+#: ardour_ui.cc:1503
 msgid "WAV64"
 msgstr "WAV64"
 
-#: ardour_ui.cc:1316 session_option_editor.cc:185
+#: ardour_ui.cc:1506 session_option_editor.cc:202
 msgid "CAF"
 msgstr "CAF"
 
-#: ardour_ui.cc:1319
+#: ardour_ui.cc:1509
 msgid "AIFF"
 msgstr "AIFF"
 
-#: ardour_ui.cc:1322
+#: ardour_ui.cc:1512
 msgid "iXML"
 msgstr "iXML"
 
-#: ardour_ui.cc:1325
+#: ardour_ui.cc:1515 session_option_editor.cc:203
 msgid "RF64"
 msgstr "RF64"
 
-#: ardour_ui.cc:1333
+#: ardour_ui.cc:1518
+msgid "RF64/WAV"
+msgstr ""
+
+#: ardour_ui.cc:1521
+msgid "MBWF"
+msgstr ""
+
+#: ardour_ui.cc:1529
 msgid "32-float"
 msgstr "32-float"
 
-#: ardour_ui.cc:1336
+#: ardour_ui.cc:1532
 msgid "24-int"
 msgstr "24-int"
 
-#: ardour_ui.cc:1339
+#: ardour_ui.cc:1535
 msgid "16-int"
 msgstr "16-int"
 
-#: ardour_ui.cc:1358
+#: ardour_ui.cc:1556
+#, c-format
+msgid "X: <span foreground=\"%s\">>10K</span>"
+msgstr ""
+
+#: ardour_ui.cc:1558
+#, c-format
+msgid "X: <span foreground=\"%s\">%u</span>"
+msgstr ""
+
+#: ardour_ui.cc:1561
+#, c-format
+msgid "X: <span foreground=\"%s\">?</span>"
+msgstr ""
+
+#: ardour_ui.cc:1564
+msgid "Audio dropouts. Shift+click to reset"
+msgstr ""
+
+#: ardour_ui.cc:1577
 #, c-format
 msgid "DSP: <span foreground=\"%s\">%5.1f%%</span>"
 msgstr "DSP: <span foreground=\"%s\">%5.1f%%</span>"
 
-#: ardour_ui.cc:1377
+#: ardour_ui.cc:1587
+#, c-format
+msgid "PkBld: <span foreground=\"%s\">%d</span>"
+msgstr ""
+
+#: ardour_ui.cc:1609
 #, c-format
 msgid ""
 "Buffers: <span foreground=\"green\">p:</span><span foreground=\"%s\">"
@@ -1004,34 +1160,29 @@ msgstr ""
 "%<PRIu32>%%</span> <span foreground=\"green\">c:</span><span foreground=\"%s"
 "\">%<PRIu32>%%</span>"
 
-#: ardour_ui.cc:1418
+#: ardour_ui.cc:1650
 msgid "Disk: <span foreground=\"green\">Unknown</span>"
 msgstr "Disco: <span foreground=\"green\">Sconosciuto</span>"
 
-#: ardour_ui.cc:1420
+#: ardour_ui.cc:1652
 msgid "Disk: <span foreground=\"green\">24hrs+</span>"
 msgstr "Disco: <span foreground=\"green\">24hrs</span>"
 
-#: ardour_ui.cc:1438
+#: ardour_ui.cc:1670
 msgid "Disk: <span foreground=\"green\">>24 hrs</span>"
 msgstr "Disco: <span foreground=\"green\">>24 hrs</span>"
 
-#: ardour_ui.cc:1449
+#: ardour_ui.cc:1681
 #, c-format
 msgid "Disk: <span foreground=\"%s\">%02dh:%02dm:%02ds</span>"
 msgstr "Disco: <span foreground=\"%s\">%02dh:%02dm:%02ds</span>"
 
-#: ardour_ui.cc:1475
+#: ardour_ui.cc:1707
 #, c-format
 msgid "Timecode|TC: <span foreground=\"%s\">%s</span>"
 msgstr "Timecode|TC: <span foreground=\"%s\">%s</span>"
 
-#: ardour_ui.cc:1596 ardour_ui.cc:1605 session_dialog.cc:318
-#: session_dialog.cc:323
-msgid "Recent Sessions"
-msgstr "Sessioni recenti"
-
-#: ardour_ui.cc:1684
+#: ardour_ui.cc:1789
 msgid ""
 "%1 is not connected to any audio backend.\n"
 "You cannot open or close sessions in this condition"
@@ -1039,57 +1190,63 @@ msgstr ""
 "%1 non è connesso al finale audio.\n"
 "Non puoi aprire o chiudere una sessione in queste condizioni"
 
-#: ardour_ui.cc:1708
+#: ardour_ui.cc:1807
 msgid "Open Session"
 msgstr "Apri sessione"
 
-#: ardour_ui.cc:1733 session_dialog.cc:349 session_import_dialog.cc:170
-#: session_metadata_dialog.cc:858
+#: ardour_ui.cc:1831 session_dialog.cc:410 session_import_dialog.cc:170
+#: session_metadata_dialog.cc:861
 msgid "%1 sessions"
 msgstr "sessioni %1"
 
-#: ardour_ui.cc:1770
+#: ardour_ui.cc:1879 ardour_ui.cc:1916
 msgid "You cannot add a track without a session already loaded."
 msgstr ""
 "Non si può aggiungere una traccia senza prima aver caricato una sessione."
 
-#: ardour_ui.cc:1778
+#: ardour_ui.cc:1887
 msgid "could not create %1 new mixed track"
 msgid_plural "could not create %1 new mixed tracks"
 msgstr[0] "non sono riuscito a creare la nuova traccia missata %1 "
 msgstr[1] "non sono riuscito a creare le nuove tracce missate %1"
 
-#: ardour_ui.cc:1784 ardour_ui.cc:1845
-msgid ""
-"There are insufficient ports available\n"
-"to create a new track or bus.\n"
-"You should save %1, exit and\n"
-"restart with more ports."
-msgstr ""
-"Le porte disponibili sono insufficenti\n"
-"per creare una nuova traccia o bus.\n"
-"Dovresti prima salvare %1, uscire e\n"
-"riavviare con più porte."
+#: ardour_ui.cc:1924
+msgid "could not create %1 new Midi Bus"
+msgid_plural "could not create %1 new Midi Busses"
+msgstr[0] ""
+msgstr[1] ""
 
-#: ardour_ui.cc:1819
+#: ardour_ui.cc:1977
 msgid "You cannot add a track or bus without a session already loaded."
 msgstr ""
 "Non si può aggiungere una traccia o un bus senza prima aver caricato una "
 "sessione."
 
-#: ardour_ui.cc:1828
+#: ardour_ui.cc:1986
 msgid "could not create %1 new audio track"
 msgid_plural "could not create %1 new audio tracks"
 msgstr[0] "impossibile creare la nuova traccia audio %1"
 msgstr[1] "impossibile creare le nuove tracce audio %1"
 
-#: ardour_ui.cc:1837
+#: ardour_ui.cc:1995
 msgid "could not create %1 new audio bus"
 msgid_plural "could not create %1 new audio busses"
 msgstr[0] "impossibile creare il nuovo bus audio %1"
 msgstr[1] "impossibile creare i nuovi bus audio %1"
 
-#: ardour_ui.cc:1990
+#: ardour_ui.cc:2020
+msgid ""
+"There are insufficient ports available\n"
+"to create a new track or bus.\n"
+"You should save %1, exit and\n"
+"restart with more ports."
+msgstr ""
+"Le porte disponibili sono insufficenti\n"
+"per creare una nuova traccia o bus.\n"
+"Dovresti prima salvare %1, uscire e\n"
+"riavviare con più porte."
+
+#: ardour_ui.cc:2164
 msgid ""
 "Please create one or more tracks before trying to record.\n"
 "You can do this with the \"Add Track or Bus\" option in the Session menu."
@@ -1098,23 +1255,20 @@ msgstr ""
 "Puoi farlo attraverso l'opzione \"Aggiungi traccia o bus\" nel menù di "
 "Sessione."
 
-#: ardour_ui.cc:2376
-msgid "Save as..."
-msgstr "Salva come..."
-
-#: ardour_ui.cc:2377 ardour_ui.cc:2456
-msgid "New session name"
-msgstr "Nome della nuova sessione"
+#: ardour_ui.cc:2565
+#, c-format
+msgid "Copied %<PRId64> of %<PRId64>"
+msgstr ""
 
-#: ardour_ui.cc:2379
-msgid "Take Snapshot"
-msgstr "Crea istantanea"
+#: ardour_ui.cc:2619 save_as_dialog.cc:33
+msgid "Save As"
+msgstr ""
 
-#: ardour_ui.cc:2380
-msgid "Name of new snapshot"
-msgstr "Nome della nuova istantanea"
+#: ardour_ui.cc:2647
+msgid "Save As failed: %1"
+msgstr ""
 
-#: ardour_ui.cc:2405
+#: ardour_ui.cc:2684
 msgid ""
 "To ensure compatibility with various systems\n"
 "snapshot names may not contain a '%1' character"
@@ -1122,23 +1276,35 @@ msgstr ""
 "Per assicurare la compatibilità tra sistemi\n"
 "i nomi delle istantanee non devono contenere il carattere '%1'"
 
-#: ardour_ui.cc:2417
+#: ardour_ui.cc:2698
 msgid "Confirm Snapshot Overwrite"
 msgstr "Conferma sovrascrittura istantanea"
 
-#: ardour_ui.cc:2418
-msgid "A snapshot already exists with that name.  Do you want to overwrite it?"
-msgstr "Esiste già un'istantanea con questo nome. Vuoi sovrascriverla?"
+#: ardour_ui.cc:2699
+msgid "A snapshot already exists with that name. Do you want to overwrite it?"
+msgstr ""
 
-#: ardour_ui.cc:2421 utils_videotl.cc:74
-msgid "Overwrite"
-msgstr "Sovrascrivi"
+#: ardour_ui.cc:2724
+msgid "Snapshot and switch"
+msgstr ""
+
+#: ardour_ui.cc:2725 ardour_ui.cc:2776
+msgid "New session name"
+msgstr "Nome della nuova sessione"
+
+#: ardour_ui.cc:2727
+msgid "Take Snapshot"
+msgstr "Crea istantanea"
+
+#: ardour_ui.cc:2728
+msgid "Name of new snapshot"
+msgstr "Nome della nuova istantanea"
 
-#: ardour_ui.cc:2455
+#: ardour_ui.cc:2775
 msgid "Rename Session"
 msgstr "Rinomina la sessione"
 
-#: ardour_ui.cc:2470 ardour_ui.cc:2886 ardour_ui.cc:2924
+#: ardour_ui.cc:2790 ardour_ui.cc:3267 ardour_ui.cc:3305
 msgid ""
 "To ensure compatibility with various systems\n"
 "session names may not contain a '%1' character"
@@ -1146,12 +1312,12 @@ msgstr ""
 "Per assicurare la compatibilità tra sistemi\n"
 "i nomi delle istantanee non devono contenere il carattere '%1'"
 
-#: ardour_ui.cc:2478
+#: ardour_ui.cc:2798
 msgid ""
 "That name is already in use by another directory/folder. Please try again."
 msgstr "Questo nome è già utilizzato in un'altra cartella. Prova di nuovo."
 
-#: ardour_ui.cc:2487
+#: ardour_ui.cc:2807
 msgid ""
 "Renaming this session failed.\n"
 "Things could be seriously messed up at this point"
@@ -1159,19 +1325,27 @@ msgstr ""
 "Errore nel rinominare la sessione.\n"
 "A questo punto le cose potrebbero essere veramente incasinate."
 
-#: ardour_ui.cc:2602
+#: ardour_ui.cc:2923 route_ui.cc:1867
+msgid "Confirm Template Overwrite"
+msgstr ""
+
+#: ardour_ui.cc:2924 route_ui.cc:1868
+msgid "A template already exists with that name. Do you want to overwrite it?"
+msgstr ""
+
+#: ardour_ui.cc:2948
 msgid "Save Template"
 msgstr "Salva Modello"
 
-#: ardour_ui.cc:2603
+#: ardour_ui.cc:2949
 msgid "Name for template:"
 msgstr "Nome per il modello:"
 
-#: ardour_ui.cc:2604
+#: ardour_ui.cc:2950
 msgid "-template"
 msgstr "-modello"
 
-#: ardour_ui.cc:2643
+#: ardour_ui.cc:2987
 msgid ""
 "This session\n"
 "%1\n"
@@ -1181,35 +1355,39 @@ msgstr ""
 "%1\n"
 "esiste già. Vuoi aprirla?"
 
-#: ardour_ui.cc:2653
+#: ardour_ui.cc:2997
 msgid "Open Existing Session"
 msgstr "Apri una sessione"
 
-#: ardour_ui.cc:2914
+#: ardour_ui.cc:3295
 msgid "There is no existing session at \"%1\""
 msgstr "Sessione inesistente in %1"
 
-#: ardour_ui.cc:3006
+#: ardour_ui.cc:3391
 msgid "Please wait while %1 loads your session"
 msgstr "Attendi mentre %1 carca la sessione"
 
-#: ardour_ui.cc:3021
+#: ardour_ui.cc:3406
 msgid "Port Registration Error"
 msgstr "Errore nella registrazione di porta"
 
-#: ardour_ui.cc:3022
+#: ardour_ui.cc:3407
 msgid "Click the Close button to try again."
 msgstr "Clicca su 'Chiudi' per provare di nuovo"
 
-#: ardour_ui.cc:3043
-msgid "Session \"%1 (snapshot %2)\" did not load successfully"
-msgstr "La sessione \"%1 (istantanea %2)\" non è stata caricata correttamente"
+#: ardour_ui.cc:3426
+msgid "Session \"%1 (snapshot %2)\" did not load successfully: %3"
+msgstr ""
 
-#: ardour_ui.cc:3049
+#: ardour_ui.cc:3432 ardour_ui.cc:3453 ardour_ui.cc:3548 ardour_ui.cc:3557
 msgid "Loading Error"
 msgstr "Errore di caricamento"
 
-#: ardour_ui.cc:3068
+#: ardour_ui.cc:3447
+msgid "Session \"%1 (snapshot %2)\" did not load successfully"
+msgstr "La sessione \"%1 (istantanea %2)\" non è stata caricata correttamente"
+
+#: ardour_ui.cc:3475
 msgid ""
 "This session has been opened in read-only mode.\n"
 "\n"
@@ -1219,24 +1397,50 @@ msgstr ""
 "\n"
 "Sarai impossibilitato a registrare o salvare."
 
-#: ardour_ui.cc:3073
+#: ardour_ui.cc:3480
 msgid "Read-only Session"
 msgstr "Sessione in sola lettura"
 
-#: ardour_ui.cc:3139
+#: ardour_ui.cc:3547
+msgid "Could not create session in \"%1\": %2"
+msgstr ""
+
+#: ardour_ui.cc:3556
 msgid "Could not create session in \"%1\""
 msgstr "Impossibile caricare la sessione \"%1\""
 
-#: ardour_ui.cc:3288
+#: ardour_ui.cc:3601
+msgid ""
+"<b>Just ask and wait for an answer.\n"
+"It may take from minutes to hours.</b>"
+msgstr ""
+
+#: ardour_ui.cc:3603
+msgid "About the Chat"
+msgstr ""
+
+#: ardour_ui.cc:3604
+msgid ""
+"When you're inside the chat just ask your question and wait for an answer. "
+"The chat is occupied by real people with real lives so many of them are "
+"passively online and might not read your question before minutes or hours "
+"later.\n"
+"So please be patient and wait for an answer.\n"
+"\n"
+"You should just leave the chat window open and check back regularly until "
+"someone has answered your question."
+msgstr ""
+
+#: ardour_ui.cc:3723
 msgid "No files were ready for clean-up"
 msgstr "Nessun file da pulire"
 
-#: ardour_ui.cc:3292 ardour_ui.cc:3302 ardour_ui.cc:3435 ardour_ui.cc:3442
-#: ardour_ui_ed.cc:103
+#: ardour_ui.cc:3727 ardour_ui.cc:3737 ardour_ui.cc:3870 ardour_ui.cc:3877
+#: ardour_ui_ed.cc:129
 msgid "Clean-up"
 msgstr "Pulisci"
 
-#: ardour_ui.cc:3293
+#: ardour_ui.cc:3728
 msgid ""
 "If this seems suprising, \n"
 "check for any existing snapshots.\n"
@@ -1248,19 +1452,19 @@ msgstr ""
 "Ci possono essere ancora istantanee con regioni\n"
 "che necessitano di questi file."
 
-#: ardour_ui.cc:3352
+#: ardour_ui.cc:3787
 msgid "kilo"
 msgstr "kilo"
 
-#: ardour_ui.cc:3355
+#: ardour_ui.cc:3790
 msgid "mega"
 msgstr "mega"
 
-#: ardour_ui.cc:3358
+#: ardour_ui.cc:3793
 msgid "giga"
 msgstr "giga"
 
-#: ardour_ui.cc:3363
+#: ardour_ui.cc:3798
 msgid ""
 "The following file was deleted from %2,\n"
 "releasing %3 %4bytes of disk space"
@@ -1274,7 +1478,7 @@ msgstr[1] ""
 "I fil che seguono sono stati eliminati da %2,\n"
 "liberando %3 %4bytes di spazio su disco."
 
-#: ardour_ui.cc:3370
+#: ardour_ui.cc:3805
 msgid ""
 "The following file was not in use and \n"
 "has been moved to: %2\n"
@@ -1312,11 +1516,11 @@ msgstr[1] ""
 "\n"
 "verranno liberati %3 %4bytes di spazio su disco.\n"
 
-#: ardour_ui.cc:3430
+#: ardour_ui.cc:3865
 msgid "Are you sure you want to clean-up?"
 msgstr "Siete sicuri di voler ripulire?"
 
-#: ardour_ui.cc:3437
+#: ardour_ui.cc:3872
 msgid ""
 "Clean-up is a destructive operation.\n"
 "ALL undo/redo information will be lost if you clean-up.\n"
@@ -1328,41 +1532,65 @@ msgstr ""
 "La pulizia sposterà tutti i file inutilizzati \n"
 "in una posizione \"morta\"."
 
-#: ardour_ui.cc:3445
+#: ardour_ui.cc:3880
 msgid "CleanupDialog"
 msgstr "DialogoRipulitura"
 
-#: ardour_ui.cc:3475
+#: ardour_ui.cc:3910
 msgid "Cleaned Files"
 msgstr "File ripuliti"
 
-#: ardour_ui.cc:3492
+#: ardour_ui.cc:3927
 msgid "deleted file"
 msgstr "File eliminato"
 
-#: ardour_ui.cc:3637
+#: ardour_ui.cc:4133
+msgid "Cannot read session script '%1': %2"
+msgstr ""
+
+#: ardour_ui.cc:4142 luainstance.cc:1087
+msgid "Set Script Parameters"
+msgstr ""
+
+#: ardour_ui.cc:4153
+msgid "Session script '%1' instantiation failed: %2"
+msgstr ""
+
+#: ardour_ui.cc:4157
+msgid "Loading Session script '%1' failed: %2"
+msgstr ""
+
+#: ardour_ui.cc:4170
+msgid "There are no active Lua session scripts present in this session."
+msgstr ""
+
+#: ardour_ui.cc:4187
+msgid "Session script '%1' removal failed: %2"
+msgstr ""
+
+#: ardour_ui.cc:4197
 msgid "Video-Server was not launched by %1. The request to stop it is ignored."
 msgstr ""
 "Il server video non è stato avviato da %1. La richiesta di interruzione "
 "viene ignorata."
 
-#: ardour_ui.cc:3641
+#: ardour_ui.cc:4201
 msgid "Stop Video-Server"
 msgstr "Ferma il server video"
 
-#: ardour_ui.cc:3642
+#: ardour_ui.cc:4202
 msgid "Do you really want to stop the Video Server?"
 msgstr "Vuoi veramente interrompere il server video?"
 
-#: ardour_ui.cc:3645
+#: ardour_ui.cc:4205
 msgid "Yes, Stop It"
 msgstr "Sì, interrompi"
 
-#: ardour_ui.cc:3671
+#: ardour_ui.cc:4231
 msgid "The Video Server is already started."
 msgstr "Il server video è già stato avviato."
 
-#: ardour_ui.cc:3673
+#: ardour_ui.cc:4233
 msgid ""
 "An external Video Server is configured and can be reached. Not starting a "
 "new instance."
@@ -1370,41 +1598,53 @@ msgstr ""
 "Un server video esterno è configurato è può essere attivato. Non avvio una "
 "nuova istanza."
 
-#: ardour_ui.cc:3681 ardour_ui.cc:3786
+#: ardour_ui.cc:4241 ardour_ui.cc:4346
 msgid ""
 "Could not connect to the Video Server. Start it or configure its access URL "
 "in Preferences."
 msgstr ""
 
-#: ardour_ui.cc:3711
+#: ardour_ui.cc:4271
 msgid "Specified docroot is not an existing directory."
 msgstr "La docroot specificata è una directory inesistente."
 
-#: ardour_ui.cc:3717 ardour_ui.cc:3723
+#: ardour_ui.cc:4277 ardour_ui.cc:4283
 msgid "Given Video Server is not an executable file."
 msgstr "Il server video specificato non è un file eseguibile."
 
-#: ardour_ui.cc:3757
+#: ardour_ui.cc:4317
 msgid "Cannot launch the video-server"
 msgstr "Non riesco ad avviare il server video"
 
-#: ardour_ui.cc:3767
+#: ardour_ui.cc:4327
 msgid "Video-server was started but does not respond to requests..."
 msgstr "Il server video è stato avviato ma non risponde alle richieste..."
 
-#: ardour_ui.cc:3812 editor_audio_import.cc:641
+#: ardour_ui.cc:4372 editor_audio_import.cc:647
 msgid "could not open %1"
 msgstr "impossibile aprire %1"
 
-#: ardour_ui.cc:3816
+#: ardour_ui.cc:4376
 msgid "no video-file selected"
 msgstr "nessuno file video selezionato"
 
-#: ardour_ui.cc:4014
+#: ardour_ui.cc:4472
+msgid "No LTC detected, video will not be aligned."
+msgstr ""
+
+#: ardour_ui.cc:4478
+msgid "Align video-start to %1 [samples]"
+msgstr ""
+
+#: ardour_ui.cc:4654
+msgid "xrun"
+msgstr ""
+
+#: ardour_ui.cc:4663
 msgid "Recording was stopped because your system could not keep up."
 msgstr "La registazione è stata interrotta perche' il sistema non ha retto"
 
-#: ardour_ui.cc:4043
+#: ardour_ui.cc:4692
 msgid ""
 "The disk system on your computer\n"
 "was not able to keep up with %1.\n"
@@ -1416,23 +1656,23 @@ msgstr ""
 "Nello specifico, non riesce a scrivere i dati \n"
 "con la velocità necessaria per le registrazioni.\n"
 
-#: ardour_ui.cc:4113
+#: ardour_ui.cc:4765
 msgid "Scanning for plugins"
 msgstr "Alla ricerca di plugins"
 
-#: ardour_ui.cc:4115
+#: ardour_ui.cc:4767
 msgid "Cancel plugin scan"
 msgstr "Interruzione della ricerca di plugin"
 
-#: ardour_ui.cc:4124
+#: ardour_ui.cc:4776
 msgid "Stop Timeout"
 msgstr ""
 
-#: ardour_ui.cc:4131
+#: ardour_ui.cc:4783
 msgid "Scan Timeout"
 msgstr ""
 
-#: ardour_ui.cc:4174
+#: ardour_ui.cc:4827
 msgid ""
 "The disk system on your computer\n"
 "was not able to keep up with %1.\n"
@@ -1444,11 +1684,11 @@ msgstr ""
 "Nello specifico, non riesce a scrivere i dati \n"
 "con la velocità necessaria per le registrazioni.\n"
 
-#: ardour_ui.cc:4214
+#: ardour_ui.cc:4862
 msgid "Crash Recovery"
 msgstr "Recupero dal crash"
 
-#: ardour_ui.cc:4215
+#: ardour_ui.cc:4863
 msgid ""
 "This session appears to have been in the\n"
 "middle of recording when %1 or\n"
@@ -1465,19 +1705,19 @@ msgstr ""
 "%1 può recuperare l'audio registrato per te \n"
 "oppure ignorarlo. Scegli cosa vuoi fare.\n"
 
-#: ardour_ui.cc:4227
+#: ardour_ui.cc:4875
 msgid "Ignore crash data"
 msgstr "Ignora i dati del crash"
 
-#: ardour_ui.cc:4228
+#: ardour_ui.cc:4876
 msgid "Recover from crash"
 msgstr "Recupero dai dati di crash"
 
-#: ardour_ui.cc:4248
+#: ardour_ui.cc:4896
 msgid "Sample Rate Mismatch"
 msgstr "Frequenza di campionamento discrepante"
 
-#: ardour_ui.cc:4249
+#: ardour_ui.cc:4897
 msgid ""
 "This session was created with a sample rate of %1 Hz, but\n"
 "%2 is currently running at %3 Hz.  If you load this session,\n"
@@ -1488,23 +1728,24 @@ msgstr ""
 "%2 è stato avviato a %3 Hz. Se carichi questa sessione l'audio\n"
 "potrà essere riprodotto alla frequenza di campionamento errata.\n"
 
-#: ardour_ui.cc:4258
+#: ardour_ui.cc:4906
 msgid "Do not load session"
 msgstr "Non caricare la sessione"
 
-#: ardour_ui.cc:4259
+#: ardour_ui.cc:4907
 msgid "Load session anyway"
 msgstr "Apri comunque la sessione"
 
-#: ardour_ui.cc:4286
-msgid "Could not disconnect from Audio/MIDI engine"
-msgstr "Impossibile disconnettersi dal motore Audio/MIDI"
-
-#: ardour_ui.cc:4303 ardour_ui.cc:4306
-msgid "Could not reconnect to the Audio/MIDI engine"
-msgstr "Impossibile riconnettersi al motore Audio/MIDI"
+#: ardour_ui.cc:4927
+msgid ""
+"This session was created with a sample rate of %1 Hz, but\n"
+"%2 is currently running at %3 Hz.\n"
+"Audio will be recorded and played at the wrong sample rate.\n"
+"Re-Configure the Audio Engine in\n"
+"Menu > Window > Audio/Midi Setup"
+msgstr ""
 
-#: ardour_ui.cc:4590
+#: ardour_ui.cc:5209
 msgid ""
 "%4This is a session from an older version of %3%5\n"
 "\n"
@@ -1516,62 +1757,75 @@ msgid ""
 "\n"
 "%6%2%7\n"
 "\n"
-"From now on, use the -2000 version with older versions of %3"
+"From now on, use the backup copy with older versions of %3"
 msgstr ""
-"%4 Questa è una sessione di una versione precedente di %3%5\n"
-"\n"
-"%3 ha copiato il vecchio file di sessione\n"
-"\n"
-"%6%1%7 \n"
-"\n"
-"su\n"
-"\n"
-"%6%2%7\n"
-"\n"
-"Da questo momento in poi utilizza la versione -2000 con vecchie versioni di "
-"%3"
 
-#: ardour_ui2.cc:73
-msgid "UI: cannot setup editor"
-msgstr "UI: impossibile avviare l'editor"
+#: ardour_ui.cc:5331
+msgid "This is a free/demo copy of %1. It has just switched to silent mode."
+msgstr ""
 
-#: ardour_ui2.cc:78
-msgid "UI: cannot setup mixer"
-msgstr "IU: impossibile avviare il mixer"
+#: ardour_ui.cc:5337
+msgid "%1 is now silent"
+msgstr ""
 
-#: ardour_ui2.cc:83
-msgid "UI: cannot setup meterbridge"
-msgstr "UI: impossibile impostare meterbridge"
+#: ardour_ui.cc:5339
+msgid ""
+"Please consider paying for a copy of %1 - you can pay whatever you want."
+msgstr ""
+
+#: ardour_ui.cc:5340
+msgid "Better yet become a subscriber - subscriptions start at US$1 per month."
+msgstr ""
+
+#: ardour_ui.cc:5341
+msgid "Pay for a copy (via the web)"
+msgstr ""
+
+#: ardour_ui.cc:5342
+msgid "Become a subscriber (via the web)"
+msgstr ""
+
+#: ardour_ui.cc:5361
+msgid "Remain silent"
+msgstr ""
+
+#: ardour_ui.cc:5363
+msgid "Give me more time"
+msgstr ""
+
+#: ardour_ui.cc:5656
+msgid "Global keybindings are missing"
+msgstr ""
 
-#: ardour_ui2.cc:128
+#: ardour_ui2.cc:79
 msgid "Play from playhead"
 msgstr "Suona dalla testina"
 
-#: ardour_ui2.cc:129
+#: ardour_ui2.cc:80
 msgid "Stop playback"
 msgstr "Interrompi la riproduzione"
 
-#: ardour_ui2.cc:130
+#: ardour_ui2.cc:81
 msgid "Toggle record"
 msgstr "Attiva/disattiva registrazione"
 
-#: ardour_ui2.cc:131
+#: ardour_ui2.cc:82
 msgid "Play range/selection"
 msgstr "Suona intervallo/selezione"
 
-#: ardour_ui2.cc:132
+#: ardour_ui2.cc:83
 msgid "Go to start of session"
 msgstr "Vai all'inizio della sessione"
 
-#: ardour_ui2.cc:133
+#: ardour_ui2.cc:84
 msgid "Go to end of session"
 msgstr "Vai alla fine della sessione"
 
-#: ardour_ui2.cc:134
+#: ardour_ui2.cc:85
 msgid "Play loop range"
 msgstr "Suona l'intervallo di ciclo"
 
-#: ardour_ui2.cc:135
+#: ardour_ui2.cc:86
 msgid ""
 "MIDI Panic\n"
 "Send note off and reset controller messages on all MIDI channels"
@@ -1579,23 +1833,23 @@ msgstr ""
 "MIDI Panic\n"
 "Invio dei messaggi di note off e reset su tutti i canali MIDI"
 
-#: ardour_ui2.cc:136
+#: ardour_ui2.cc:87
 msgid "Return to last playback start when stopped"
 msgstr "Ritorna al punto d'inizio una volta fermato"
 
-#: ardour_ui2.cc:137
-msgid "Playhead follows Range Selections and Edits"
-msgstr "La testina segue le selezioni di intervalli e gli edit"
+#: ardour_ui2.cc:88
+msgid "Playhead follows range selections and edits"
+msgstr ""
 
-#: ardour_ui2.cc:138
+#: ardour_ui2.cc:89
 msgid "Be sensible about input monitoring"
 msgstr "Controlla accuratamente le entrate"
 
-#: ardour_ui2.cc:139
+#: ardour_ui2.cc:90
 msgid "Enable/Disable audio click"
 msgstr "Abilita/Disabilita il click audio"
 
-#: ardour_ui2.cc:140 monitor_section.cc:111
+#: ardour_ui2.cc:91 monitor_section.cc:129
 msgid ""
 "When active, something is soloed.\n"
 "Click to de-solo everything"
@@ -1603,19 +1857,17 @@ msgstr ""
 "Quando è attivo, qualcosa è in solo.\n"
 "Clicca per ripristinare tutto."
 
-#: ardour_ui2.cc:141
+#: ardour_ui2.cc:92
 msgid ""
-"When active, auditioning is taking place\n"
+"When active, auditioning is taking place.\n"
 "Click to stop the audition"
 msgstr ""
-"Quando è attivo, qualcosa è in ascolto\n"
-"Clicca per ripristinare."
 
-#: ardour_ui2.cc:142
+#: ardour_ui2.cc:93
 msgid "When active, there is a feedback loop."
 msgstr "Se attivo c'è un feedback loop."
 
-#: ardour_ui2.cc:143
+#: ardour_ui2.cc:94
 msgid ""
 "<b>Primary Clock</b> right-click to set display mode. Click to edit, click"
 "+drag a digit or mouse-over+scroll wheel to modify.\n"
@@ -1629,7 +1881,7 @@ msgstr ""
 "<tt>Entra</tt>: conferma; utilizza un postfisso con un '+' o '-' per "
 "inserire il delta dei tempi.\n"
 
-#: ardour_ui2.cc:144
+#: ardour_ui2.cc:95
 msgid ""
 "<b>Secondary Clock</b> right-click to set display mode. Click to edit, click"
 "+drag a digit or mouse-over+scroll wheel to modify.\n"
@@ -1637,451 +1889,559 @@ msgid ""
 "confirm; postfix the edit with '+' or '-' to enter delta times.\n"
 msgstr ""
 
-#: ardour_ui2.cc:145
+#: ardour_ui2.cc:96
 msgid "Reset All Peak Indicators"
 msgstr "Resetta tutti gli indicatori di picco"
 
-#: ardour_ui2.cc:146
+#: ardour_ui2.cc:97
 msgid "Show Error Log and acknowledge warnings"
 msgstr ""
 
-#: ardour_ui2.cc:179
+#: ardour_ui2.cc:130
 msgid "[ERROR]: "
 msgstr "[ERRORE]:"
 
-#: ardour_ui2.cc:182
+#: ardour_ui2.cc:133
 msgid "[WARNING]: "
 msgstr "[ATTENZIONE]:"
 
-#: ardour_ui2.cc:185
+#: ardour_ui2.cc:136
 msgid "[INFO]: "
 msgstr "[INFO]"
 
-#: ardour_ui2.cc:253 ardour_ui_ed.cc:403
+#: ardour_ui2.cc:197 ardour_ui_ed.cc:509
 msgid "Auto Return"
 msgstr "Auto ritorno"
 
-#: ardour_ui2.cc:255 ardour_ui_ed.cc:406
+#: ardour_ui2.cc:199 ardour_ui_ed.cc:512
 msgid "Follow Edits"
 msgstr "Segui le modifiche"
 
-#: ardour_ui2.cc:716 rc_option_editor.cc:2300
+#: ardour_ui2.cc:422 ardour_ui2.cc:426 ardour_ui2.cc:430
+msgid ""
+"Drag this tab to the desktop to show %1 in its own window\n"
+"\n"
+"To put the window back, use the Window > %1 > Attach menu action"
+msgstr ""
+
+#: ardour_ui2.cc:638
 msgid "GUI"
 msgstr "GUI"
 
-#: ardour_ui2.cc:733 rc_option_editor.cc:1309 rc_option_editor.cc:1327
-#: rc_option_editor.cc:1330 rc_option_editor.cc:1332 rc_option_editor.cc:1334
-#: rc_option_editor.cc:1342 rc_option_editor.cc:1350 rc_option_editor.cc:1352
-#: rc_option_editor.cc:1360 rc_option_editor.cc:1367 rc_option_editor.cc:1376
-#: rc_option_editor.cc:1378 rc_option_editor.cc:1380 rc_option_editor.cc:1388
-#: rc_option_editor.cc:1390 rc_option_editor.cc:1399
-#: session_option_editor.cc:321 session_option_editor.cc:323
-#: session_option_editor.cc:344 session_option_editor.cc:346
-#: session_option_editor.cc:348 session_option_editor.cc:355
-#: session_option_editor.cc:362 session_option_editor.cc:366
+#: ardour_ui2.cc:651 rc_option_editor.cc:1874 rc_option_editor.cc:1892
+#: rc_option_editor.cc:1895 rc_option_editor.cc:1897 rc_option_editor.cc:1899
+#: rc_option_editor.cc:1907 rc_option_editor.cc:1909 rc_option_editor.cc:1917
+#: rc_option_editor.cc:1925 rc_option_editor.cc:1932 rc_option_editor.cc:1953
+#: rc_option_editor.cc:1955 rc_option_editor.cc:1964
+#: session_option_editor.cc:342 session_option_editor.cc:344
+#: session_option_editor.cc:365 session_option_editor.cc:367
+#: session_option_editor.cc:369 session_option_editor.cc:376
+#: session_option_editor.cc:383 session_option_editor.cc:387
 msgid "Misc"
 msgstr "Varie"
 
-#: ardour_ui_dependents.cc:76
+#: ardour_ui_dependents.cc:118
 msgid "Setup Editor"
 msgstr "Prepara l'editor"
 
-#: ardour_ui_dependents.cc:78
+#: ardour_ui_dependents.cc:120
 msgid "Setup Mixer"
 msgstr "Prepara il mixer"
 
-#: ardour_ui_dependents.cc:84
+#: ardour_ui_dependents.cc:127
 msgid "Reload Session History"
 msgstr "Ricarica lo storico di sessione"
 
-#: ardour_ui_dialogs.cc:250
+#: ardour_ui_dependents.cc:248
+msgid "UI: cannot setup editor"
+msgstr "UI: impossibile avviare l'editor"
+
+#: ardour_ui_dependents.cc:253
+msgid "UI: cannot setup mixer"
+msgstr "IU: impossibile avviare il mixer"
+
+#: ardour_ui_dependents.cc:258
+msgid "UI: cannot setup meterbridge"
+msgstr "UI: impossibile impostare meterbridge"
+
+#: ardour_ui_dependents.cc:263
+msgid "UI: cannot setup luawindow"
+msgstr ""
+
+#: ardour_ui_dependents.cc:269 ardour_ui_ed.cc:136 ardour_ui_ed.cc:257
+#: rc_option_editor.cc:1853 rc_option_editor.cc:3487
+msgid "Preferences"
+msgstr "Preferenze"
+
+#: ardour_ui_dependents.cc:270 ardour_ui_ed.cc:134 mixer_ui.cc:100
+#: mixer_ui.cc:410
+msgid "Mixer"
+msgstr ""
+
+#: ardour_ui_dependents.cc:271 ardour_ui_ed.cc:135 editor.cc:5790
+#: editor.cc:6062 public_editor.cc:34 rc_option_editor.cc:2201
+#: rc_option_editor.cc:2215 rc_option_editor.cc:2219 rc_option_editor.cc:2227
+#: rc_option_editor.cc:2236 rc_option_editor.cc:2244 rc_option_editor.cc:2253
+#: rc_option_editor.cc:2261 rc_option_editor.cc:2269 rc_option_editor.cc:2279
+#: rc_option_editor.cc:2281 rc_option_editor.cc:2305 rc_option_editor.cc:2317
+#: rc_option_editor.cc:2328 rc_option_editor.cc:2346
+msgid "Editor"
+msgstr "Editor"
+
+#: ardour_ui_dialogs.cc:263
 msgid "Don't close"
 msgstr "Non uscire"
 
-#: ardour_ui_dialogs.cc:251
+#: ardour_ui_dialogs.cc:264
 msgid "Just close"
 msgstr "Chiudi e basta"
 
-#: ardour_ui_dialogs.cc:252
+#: ardour_ui_dialogs.cc:265
 msgid "Save and close"
 msgstr "Salva ed esci"
 
-#: ardour_ui_dialogs.cc:362
-msgid "This screen is not tall enough to display the mixer window"
+#: ardour_ui_ed.cc:124
+msgid "Escape"
 msgstr ""
-"Questo schermo non è sufficentemente alto per mostrare la finestra del mixer"
 
-#: ardour_ui_ed.cc:102
+#: ardour_ui_ed.cc:128
 msgid "Session"
 msgstr "Sessione"
 
-#: ardour_ui_ed.cc:105 editor_actions.cc:138 editor_regions.cc:116
-#: port_group.cc:458 session_option_editor.cc:82 session_option_editor.cc:89
+#: ardour_ui_ed.cc:131 editor_actions.cc:141 editor_regions.cc:163
+#: port_group.cc:468 session_option_editor.cc:82 session_option_editor.cc:89
 msgid "Sync"
 msgstr "Sincronizza"
 
-#: ardour_ui_ed.cc:106
+#: ardour_ui_ed.cc:132
 msgid "Options"
 msgstr "Opzioni"
 
-#: ardour_ui_ed.cc:107
+#: ardour_ui_ed.cc:133
 msgid "Window"
 msgstr "Finestra"
 
-#: ardour_ui_ed.cc:108
+#: ardour_ui_ed.cc:137 ardour_ui_ed.cc:267 ardour_ui_ed.cc:268
+#: ardour_ui_ed.cc:269
+msgid "Detach"
+msgstr ""
+
+#: ardour_ui_ed.cc:138
 msgid "Help"
 msgstr "Aiuto"
 
-#: ardour_ui_ed.cc:109
+#: ardour_ui_ed.cc:139
 msgid "Misc. Shortcuts"
 msgstr "Scorciatoie varie"
 
-#: ardour_ui_ed.cc:110
+#: ardour_ui_ed.cc:140
 msgid "Audio File Format"
 msgstr "Formato del file audio"
 
-#: ardour_ui_ed.cc:111
+#: ardour_ui_ed.cc:141
 msgid "File Type"
 msgstr "Tipo file"
 
-#: ardour_ui_ed.cc:112 export_format_dialog.cc:67
+#: ardour_ui_ed.cc:142 export_format_dialog.cc:75
 msgid "Sample Format"
 msgstr "Formato di campionamento"
 
-#: ardour_ui_ed.cc:113 rc_option_editor.cc:2245 rc_option_editor.cc:2257
+#: ardour_ui_ed.cc:143 rc_option_editor.cc:2841
 msgid "Control Surfaces"
 msgstr "Piattaforme di comando"
 
-#: ardour_ui_ed.cc:114 rc_option_editor.cc:1921 rc_option_editor.cc:2264
+#: ardour_ui_ed.cc:144 rc_option_editor.cc:2847 rc_option_editor.cc:2853
+#: rc_option_editor.cc:2862 rc_option_editor.cc:2873 rc_option_editor.cc:2883
+#: rc_option_editor.cc:2945 rc_option_editor.cc:2962 rc_option_editor.cc:2978
+#: rc_option_editor.cc:2979 rc_option_editor.cc:2988 rc_option_editor.cc:3002
+#: rc_option_editor.cc:3005 rc_option_editor.cc:3013 rc_option_editor.cc:3021
 msgid "Plugins"
 msgstr "Plugins"
 
-#: ardour_ui_ed.cc:115 rc_option_editor.cc:2351
+#: ardour_ui_ed.cc:145 rc_option_editor.cc:3169
 msgid "Metering"
 msgstr "Misurazione"
 
-#: ardour_ui_ed.cc:116
+#: ardour_ui_ed.cc:146
 msgid "Fall Off Rate"
 msgstr "Tempo di caduta"
 
-#: ardour_ui_ed.cc:117
+#: ardour_ui_ed.cc:147
 msgid "Hold Time"
 msgstr "Tempo di tenuta"
 
-#: ardour_ui_ed.cc:118
+#: ardour_ui_ed.cc:148
 msgid "Denormal Handling"
 msgstr "Gestione delle denormalizzazioni"
 
-#: ardour_ui_ed.cc:122 route_time_axis.cc:1677
+#: ardour_ui_ed.cc:152 route_time_axis.cc:1683
 msgid "New..."
 msgstr "Nuovo..."
 
-#: ardour_ui_ed.cc:124
+#: ardour_ui_ed.cc:154
 msgid "Open..."
 msgstr "Apri..."
 
-#: ardour_ui_ed.cc:125
+#: ardour_ui_ed.cc:155
 msgid "Recent..."
 msgstr "Recenti..."
 
-#: ardour_ui_ed.cc:126 panner_editor.cc:29 playlist_selector.cc:64
+#: ardour_ui_ed.cc:156 panner_editor.cc:29 playlist_selector.cc:64
 msgid "Close"
 msgstr "Chiudi"
 
-#: ardour_ui_ed.cc:129
+#: ardour_ui_ed.cc:159
 msgid "Add Track or Bus..."
 msgstr "Aggiungi traccia o bus..."
 
-#: ardour_ui_ed.cc:134
-msgid "Open Video"
-msgstr "Apri video"
+#: ardour_ui_ed.cc:163
+msgid "Duplicate Tracks/Busses..."
+msgstr ""
+
+#: ardour_ui_ed.cc:169
+msgid "Cancel Solo"
+msgstr ""
+
+#: ardour_ui_ed.cc:173
+msgid "Session|Scripting"
+msgstr ""
+
+#: ardour_ui_ed.cc:176
+msgid "Add Lua Script..."
+msgstr ""
+
+#: ardour_ui_ed.cc:180
+msgid "Remove Lua Script"
+msgstr ""
+
+#: ardour_ui_ed.cc:184
+msgid "Open Video..."
+msgstr ""
 
-#: ardour_ui_ed.cc:137
+#: ardour_ui_ed.cc:187
 msgid "Remove Video"
 msgstr "Rimuovi video"
 
-#: ardour_ui_ed.cc:140
-msgid "Export To Video File"
-msgstr "Esporta in un file video"
+#: ardour_ui_ed.cc:190
+msgid "Export to Video File..."
+msgstr ""
 
-#: ardour_ui_ed.cc:144
-msgid "Snapshot..."
-msgstr "Istantanea..."
+#: ardour_ui_ed.cc:194
+msgid "Snapshot (& keep working on current version) ..."
+msgstr ""
 
-#: ardour_ui_ed.cc:148
+#: ardour_ui_ed.cc:197
+msgid "Snapshot (& switch to new version) ..."
+msgstr ""
+
+#: ardour_ui_ed.cc:200
+msgid "Quick Snapshot (& keep working on current version) ..."
+msgstr ""
+
+#: ardour_ui_ed.cc:203
+msgid "Quick Snapshot (& switch to new version) ..."
+msgstr ""
+
+#: ardour_ui_ed.cc:207
 msgid "Save As..."
 msgstr "Salva con nome..."
 
-#: ardour_ui_ed.cc:152 editor_actions.cc:1771 editor_markers.cc:903
-#: editor_snapshots.cc:124 mixer_strip.cc:1518 route_time_axis.cc:1673
+#: ardour_ui_ed.cc:210 editor_actions.cc:1788 editor_markers.cc:908
+#: editor_snapshots.cc:136 mixer_strip.cc:1653 route_time_axis.cc:1679
 msgid "Rename..."
 msgstr "Rinomina..."
 
-#: ardour_ui_ed.cc:156
+#: ardour_ui_ed.cc:214
 msgid "Save Template..."
 msgstr "Salva Modello..."
 
-#: ardour_ui_ed.cc:159
+#: ardour_ui_ed.cc:217
 msgid "Metadata"
 msgstr "Metadati"
 
-#: ardour_ui_ed.cc:162
+#: ardour_ui_ed.cc:220
 msgid "Edit Metadata..."
 msgstr "Modifica metadati..."
 
-#: ardour_ui_ed.cc:165
+#: ardour_ui_ed.cc:223
 msgid "Import Metadata..."
 msgstr "Importa metadati..."
 
-#: ardour_ui_ed.cc:168
-msgid "Export To Audio File(s)..."
-msgstr "Esporta la sessione come file audio..."
+#: ardour_ui_ed.cc:226
+msgid "Export to Audio File(s)..."
+msgstr ""
 
-#: ardour_ui_ed.cc:171
+#: ardour_ui_ed.cc:229
 msgid "Stem export..."
 msgstr "Esportazione Stem"
 
-#: ardour_ui_ed.cc:174 editor_export_audio.cc:65 export_dialog.cc:129
-#: export_video_dialog.cc:84
+#: ardour_ui_ed.cc:232 editor_export_audio.cc:66
+#: export_channel_selector.cc:190 export_channel_selector.cc:578
+#: export_dialog.cc:131 export_video_dialog.cc:80
 msgid "Export"
 msgstr "Esporta"
 
-#: ardour_ui_ed.cc:177
+#: ardour_ui_ed.cc:235
 msgid "Clean-up Unused Sources..."
 msgstr "Pulisci sorgenti inutilizzate..."
 
-#: ardour_ui_ed.cc:181
+#: ardour_ui_ed.cc:239
+msgid "Reset Peak Files"
+msgstr ""
+
+#: ardour_ui_ed.cc:243
 msgid "Flush Wastebasket"
 msgstr "Svuota il cestino"
 
-#: ardour_ui_ed.cc:188
+#: ardour_ui_ed.cc:251
 msgid "Quit"
 msgstr "Esci"
 
-#: ardour_ui_ed.cc:192
+#: ardour_ui_ed.cc:252 ardour_ui_ed.cc:259 ardour_ui_ed.cc:260
+#: ardour_ui_ed.cc:261 automation_time_axis.cc:545 editor_actions.cc:686
+#: editor_markers.cc:907 location_ui.cc:61 plugin_selector.cc:97
+#: route_time_axis.cc:864
+msgid "Hide"
+msgstr "Nascondi"
+
+#: ardour_ui_ed.cc:263 ardour_ui_ed.cc:264 ardour_ui_ed.cc:265
+msgid "Attach"
+msgstr ""
+
+#: ardour_ui_ed.cc:275 ardour_ui_ed.cc:276 ardour_ui_ed.cc:277
+#: ardour_ui_ed.cc:283 ardour_ui_ed.cc:284 ardour_ui_ed.cc:285
+msgid "Change"
+msgstr ""
+
+#: ardour_ui_ed.cc:287
+msgid "Previous Tab"
+msgstr ""
+
+#: ardour_ui_ed.cc:288
+msgid "Next Tab"
+msgstr ""
+
+#: ardour_ui_ed.cc:290
+msgid "Toggle Editor & Mixer"
+msgstr ""
+
+#: ardour_ui_ed.cc:294
 msgid "Maximise Editor Space"
 msgstr "Massimizza l'area dell'editor"
 
-#: ardour_ui_ed.cc:193
+#: ardour_ui_ed.cc:295
 msgid "Maximise Mixer Space"
 msgstr "Massimizza l'area del mixer"
 
-#: ardour_ui_ed.cc:194
-msgid "Show Toolbars"
-msgstr "Mostra le barre degli strumenti"
+#: ardour_ui_ed.cc:298
+msgid "Toggle Mixer List"
+msgstr ""
+
+#: ardour_ui_ed.cc:301
+msgid "Toggle Monitor Section Visibility"
+msgstr ""
 
-#: ardour_ui_ed.cc:198
+#: ardour_ui_ed.cc:305
 msgid "Show more UI preferences"
 msgstr "Mostra più preferenze per la UI"
 
-#: ardour_ui_ed.cc:200 mixer_ui.cc:1924 mixer_ui.cc:1930
-msgid "Window|Mixer"
-msgstr "Finestra|Mixer"
-
-#: ardour_ui_ed.cc:201
-msgid "Toggle Editor+Mixer"
-msgstr "Attiva/disattiva Editor+Mixer"
+#: ardour_ui_ed.cc:308
+msgid "Window|Scripting"
+msgstr ""
 
-#: ardour_ui_ed.cc:202 meterbridge.cc:218 meterbridge.cc:224
+#: ardour_ui_ed.cc:309 meterbridge.cc:214 meterbridge.cc:220
 msgid "Window|Meterbridge"
 msgstr "Finestra|Meterbridge"
 
-#: ardour_ui_ed.cc:204
-msgid "Reattach All Tearoffs"
-msgstr "Ricongiungi tutti gli strappi"
-
-#: ardour_ui_ed.cc:206 midi_tracer.cc:45
+#: ardour_ui_ed.cc:311 midi_tracer.cc:45
 msgid "MIDI Tracer"
 msgstr "Tracciatore MIDI"
 
-#: ardour_ui_ed.cc:208
+#: ardour_ui_ed.cc:314
 msgid "Chat"
 msgstr "Chat"
 
-#: ardour_ui_ed.cc:210
+#: ardour_ui_ed.cc:316
 msgid "Help|Manual"
 msgstr "Aiuto|Manuale"
 
-#: ardour_ui_ed.cc:211
-msgid "Reference"
-msgstr "Riferimenti"
+#: ardour_ui_ed.cc:317
+msgid "Manual|Reference"
+msgstr ""
 
-#: ardour_ui_ed.cc:212
-msgid "Report A Bug"
-msgstr "Segnala un bug"
+#: ardour_ui_ed.cc:318
+msgid "Report a Bug"
+msgstr ""
 
-#: ardour_ui_ed.cc:213
+#: ardour_ui_ed.cc:319
 msgid "Cheat Sheet"
 msgstr ""
 
-#: ardour_ui_ed.cc:214
+#: ardour_ui_ed.cc:320
 msgid "Ardour Website"
 msgstr "Sito web Ardour"
 
-#: ardour_ui_ed.cc:215
+#: ardour_ui_ed.cc:321
 msgid "Ardour Development"
 msgstr "Sviluppo di Ardour"
 
-#: ardour_ui_ed.cc:216
+#: ardour_ui_ed.cc:322
 msgid "User Forums"
 msgstr "Forum utenti"
 
-#: ardour_ui_ed.cc:217
-msgid "How to report a bug"
-msgstr "Come segnalare un bug"
+#: ardour_ui_ed.cc:323
+msgid "How to Report a Bug"
+msgstr ""
 
-#: ardour_ui_ed.cc:219 plugin_ui.cc:419
+#: ardour_ui_ed.cc:325 luawindow.cc:100 luawindow.cc:654 plugin_ui.cc:419
 msgid "Save"
 msgstr "Salva"
 
-#: ardour_ui_ed.cc:227 rc_option_editor.cc:1419 rc_option_editor.cc:1430
-#: rc_option_editor.cc:1441 rc_option_editor.cc:1450 rc_option_editor.cc:1463
-#: rc_option_editor.cc:1476 rc_option_editor.cc:1485 rc_option_editor.cc:1495
-#: rc_option_editor.cc:1497 rc_option_editor.cc:1506 rc_option_editor.cc:1522
-#: rc_option_editor.cc:1543 rc_option_editor.cc:1561 rc_option_editor.cc:1563
-#: rc_option_editor.cc:1579 rc_option_editor.cc:1582 rc_option_editor.cc:1584
-#: rc_option_editor.cc:1601 rc_option_editor.cc:1612
+#: ardour_ui_ed.cc:333 rc_option_editor.cc:1975 rc_option_editor.cc:1986
+#: rc_option_editor.cc:1997 rc_option_editor.cc:2008 rc_option_editor.cc:2017
+#: rc_option_editor.cc:2030 rc_option_editor.cc:2043 rc_option_editor.cc:2052
+#: rc_option_editor.cc:2062 rc_option_editor.cc:2079 rc_option_editor.cc:2186
 msgid "Transport"
 msgstr "Trasporto"
 
-#: ardour_ui_ed.cc:233
+#: ardour_ui_ed.cc:339 engine_dialog.cc:88
 msgid "Stop"
 msgstr "Ferma"
 
-#: ardour_ui_ed.cc:236
+#: ardour_ui_ed.cc:342
 msgid "Roll"
 msgstr "Lancia"
 
-#: ardour_ui_ed.cc:240 ardour_ui_ed.cc:243
+#: ardour_ui_ed.cc:346 ardour_ui_ed.cc:349
 msgid "Start/Stop"
 msgstr "Avvia/Ferma"
 
-#: ardour_ui_ed.cc:246
+#: ardour_ui_ed.cc:352
 msgid "Start/Continue/Stop"
 msgstr "Avvia/Continua/Ferma"
 
-#: ardour_ui_ed.cc:249
+#: ardour_ui_ed.cc:355
 msgid "Stop and Forget Capture"
 msgstr "Ferma e interrompi la registrazione"
 
-#: ardour_ui_ed.cc:259
-msgid "Transition To Roll"
+#: ardour_ui_ed.cc:365
+msgid "Transition to Roll"
 msgstr ""
 
-#: ardour_ui_ed.cc:263
-msgid "Transition To Reverse"
+#: ardour_ui_ed.cc:369
+msgid "Transition to Reverse"
 msgstr ""
 
-#: ardour_ui_ed.cc:267
+#: ardour_ui_ed.cc:373
 msgid "Play Loop Range"
 msgstr "Riproduci l'intervallo di ciclo"
 
-#: ardour_ui_ed.cc:270
+#: ardour_ui_ed.cc:376
 msgid "Play Selection"
 msgstr "Suona la selezione"
 
-#: ardour_ui_ed.cc:273
+#: ardour_ui_ed.cc:379
 msgid "Play Selection w/Preroll"
 msgstr "Suona la selezione con Preroll"
 
-#: ardour_ui_ed.cc:277
+#: ardour_ui_ed.cc:383
 msgid "Enable Record"
 msgstr "Abilita la registrazione"
 
-#: ardour_ui_ed.cc:280 ardour_ui_ed.cc:284
+#: ardour_ui_ed.cc:386 ardour_ui_ed.cc:390
 msgid "Start Recording"
 msgstr "Inizia la registrazione"
 
-#: ardour_ui_ed.cc:288
+#: ardour_ui_ed.cc:394
 msgid "Rewind"
 msgstr "Indietro"
 
-#: ardour_ui_ed.cc:291
+#: ardour_ui_ed.cc:397
 msgid "Rewind (Slow)"
 msgstr "Indietro (lento)"
 
-#: ardour_ui_ed.cc:294
+#: ardour_ui_ed.cc:400
 msgid "Rewind (Fast)"
 msgstr "Indietro (veloce)"
 
-#: ardour_ui_ed.cc:297
+#: ardour_ui_ed.cc:403
 msgid "Forward"
 msgstr "Avanti"
 
-#: ardour_ui_ed.cc:300
+#: ardour_ui_ed.cc:406
 msgid "Forward (Slow)"
 msgstr "Avanti (lento)"
 
-#: ardour_ui_ed.cc:303
+#: ardour_ui_ed.cc:409
 msgid "Forward (Fast)"
 msgstr "Avanti (veloce)"
 
-#: ardour_ui_ed.cc:306
+#: ardour_ui_ed.cc:412
 msgid "Go to Zero"
 msgstr "Vai allo zero"
 
-#: ardour_ui_ed.cc:309 ardour_ui_ed.cc:312
+#: ardour_ui_ed.cc:415 ardour_ui_ed.cc:418
 msgid "Go to Start"
 msgstr "Vai all'inizio"
 
-#: ardour_ui_ed.cc:315
+#: ardour_ui_ed.cc:421
 msgid "Go to End"
 msgstr "Vai alla fine"
 
-#: ardour_ui_ed.cc:318
+#: ardour_ui_ed.cc:424
 msgid "Go to Wall Clock"
 msgstr ""
 
-#: ardour_ui_ed.cc:323 ardour_ui_ed.cc:326
+#: ardour_ui_ed.cc:429 ardour_ui_ed.cc:432
 msgid "Numpad Decimal"
 msgstr "Decimale del tastierino numerico"
 
-#: ardour_ui_ed.cc:329
+#: ardour_ui_ed.cc:435
 msgid "Numpad 0"
 msgstr "Tastierino numerico 0"
 
-#: ardour_ui_ed.cc:332
+#: ardour_ui_ed.cc:438
 msgid "Numpad 1"
 msgstr "Tastierino numerico 1"
 
-#: ardour_ui_ed.cc:335
+#: ardour_ui_ed.cc:441
 msgid "Numpad 2"
 msgstr "Tastierino numerico 2"
 
-#: ardour_ui_ed.cc:338
+#: ardour_ui_ed.cc:444
 msgid "Numpad 3"
 msgstr "Tastierino numerico 3"
 
-#: ardour_ui_ed.cc:341
+#: ardour_ui_ed.cc:447
 msgid "Numpad 4"
 msgstr "Tastierino numerico 4"
 
-#: ardour_ui_ed.cc:344
+#: ardour_ui_ed.cc:450
 msgid "Numpad 5"
 msgstr "Tastierino numerico 5"
 
-#: ardour_ui_ed.cc:347
+#: ardour_ui_ed.cc:453
 msgid "Numpad 6"
 msgstr "Tastierino numerico 6"
 
-#: ardour_ui_ed.cc:350
+#: ardour_ui_ed.cc:456
 msgid "Numpad 7"
 msgstr "Tastierino numerico 7"
 
-#: ardour_ui_ed.cc:353
+#: ardour_ui_ed.cc:459
 msgid "Numpad 8"
 msgstr "Tastierino numerico 8"
 
-#: ardour_ui_ed.cc:356
+#: ardour_ui_ed.cc:462
 msgid "Numpad 9"
 msgstr "Tastierino numerico 9"
 
-#: ardour_ui_ed.cc:360
+#: ardour_ui_ed.cc:466
 msgid "Focus On Clock"
 msgstr "Messa a fuoco sull'orologio"
 
-#: ardour_ui_ed.cc:364 ardour_ui_ed.cc:373 audio_clock.cc:2091 editor.cc:258
-#: editor_actions.cc:569 editor_actions.cc:578 export_timespan_selector.cc:88
+#: ardour_ui_ed.cc:470 ardour_ui_ed.cc:479 audio_clock.cc:2122 editor.cc:321
+#: editor_actions.cc:610 editor_actions.cc:619 export_timespan_selector.cc:85
 #: session_option_editor.cc:41 session_option_editor.cc:61
 #: session_option_editor.cc:80 session_option_editor.cc:96
 #: session_option_editor.cc:109 session_option_editor.cc:122
@@ -2089,125 +2449,137 @@ msgstr "Messa a fuoco sull'orologio"
 msgid "Timecode"
 msgstr ""
 
-#: ardour_ui_ed.cc:366 ardour_ui_ed.cc:375 editor_actions.cc:567
+#: ardour_ui_ed.cc:472 ardour_ui_ed.cc:481 editor_actions.cc:608
 msgid "Bars & Beats"
 msgstr "Battute e battiti"
 
-#: ardour_ui_ed.cc:368 ardour_ui_ed.cc:377
+#: ardour_ui_ed.cc:474 ardour_ui_ed.cc:483
 msgid "Minutes & Seconds"
 msgstr "Minuti e secondi"
 
-#: ardour_ui_ed.cc:370 ardour_ui_ed.cc:379 audio_clock.cc:2095 editor.cc:259
-#: editor_actions.cc:568
+#: ardour_ui_ed.cc:476 ardour_ui_ed.cc:485 audio_clock.cc:2125 editor.cc:322
+#: editor_actions.cc:609
 msgid "Samples"
 msgstr "Campioni"
 
-#: ardour_ui_ed.cc:382
+#: ardour_ui_ed.cc:488
 msgid "Punch In"
 msgstr "Punch in"
 
-#: ardour_ui_ed.cc:383 mixer_strip.cc:1819 mixer_strip.cc:1843
-#: mixer_strip.cc:2007 route_ui.cc:162 time_info_box.cc:116
+#: ardour_ui_ed.cc:489 mixer_strip.cc:1992 mixer_strip.cc:2193 route_ui.cc:187
+#: time_info_box.cc:110
 msgid "In"
 msgstr "Ingresso"
 
-#: ardour_ui_ed.cc:386
+#: ardour_ui_ed.cc:492
 msgid "Punch Out"
 msgstr "Punch out"
 
-#: ardour_ui_ed.cc:387 mixer_strip.cc:1831 time_info_box.cc:117
+#: ardour_ui_ed.cc:493 mixer_strip.cc:2004 time_info_box.cc:111
 msgid "Out"
 msgstr "Uscita"
 
-#: ardour_ui_ed.cc:390
+#: ardour_ui_ed.cc:496
 msgid "Punch In/Out"
 msgstr ""
 
-#: ardour_ui_ed.cc:391
+#: ardour_ui_ed.cc:497
 msgid "In/Out"
 msgstr "Ingresso/Uscita"
 
-#: ardour_ui_ed.cc:394 rc_option_editor.cc:1376
+#: ardour_ui_ed.cc:500 rc_option_editor.cc:1941
 msgid "Click"
 msgstr "Metronomo"
 
-#: ardour_ui_ed.cc:397
+#: ardour_ui_ed.cc:503
 msgid "Auto Input"
 msgstr ""
 
-#: ardour_ui_ed.cc:400
+#: ardour_ui_ed.cc:506
 msgid "Auto Play"
 msgstr "Riproduci automaticamente"
 
-#: ardour_ui_ed.cc:411
+#: ardour_ui_ed.cc:517
 msgid "Sync Startup to Video"
 msgstr "Sincronizza l'inizio con il video"
 
-#: ardour_ui_ed.cc:413
+#: ardour_ui_ed.cc:519
 msgid "Time Master"
 msgstr "Tempo principale"
 
-#: ardour_ui_ed.cc:420
+#: ardour_ui_ed.cc:521
+msgid "Use External Positional Sync Source"
+msgstr ""
+
+#: ardour_ui_ed.cc:526
 msgid "Toggle Record Enable Track %1"
 msgstr "Attiva/disattiva la registrazione sulla traccia %1"
 
-#: ardour_ui_ed.cc:427
+#: ardour_ui_ed.cc:533
 msgid "Percentage"
 msgstr "Percentuale"
 
-#: ardour_ui_ed.cc:428 shuttle_control.cc:178
+#: ardour_ui_ed.cc:534 shuttle_control.cc:205
 msgid "Semitones"
 msgstr "Semitoni"
 
-#: ardour_ui_ed.cc:432
+#: ardour_ui_ed.cc:538
 msgid "Send MTC"
 msgstr "Invia MTC"
 
-#: ardour_ui_ed.cc:434
+#: ardour_ui_ed.cc:540
 msgid "Send MMC"
 msgstr "Invia MMC"
 
-#: ardour_ui_ed.cc:436
+#: ardour_ui_ed.cc:542
 msgid "Use MMC"
 msgstr "Usa MMC"
 
-#: ardour_ui_ed.cc:438 rc_option_editor.cc:2097
+#: ardour_ui_ed.cc:544 rc_option_editor.cc:2730
 msgid "Send MIDI Clock"
 msgstr "Invia il clock MIDI"
 
-#: ardour_ui_ed.cc:440
+#: ardour_ui_ed.cc:546
 msgid "Send MIDI Feedback"
 msgstr "Invia un feedback MIDI"
 
-#: ardour_ui_ed.cc:446
+#: ardour_ui_ed.cc:552
 msgid "Panic"
 msgstr "Panico"
 
-#: ardour_ui_ed.cc:534
+#: ardour_ui_ed.cc:629
 msgid "Wall Clock"
 msgstr "Orologio"
 
-#: ardour_ui_ed.cc:536
+#: ardour_ui_ed.cc:631
 msgid "Disk Space"
 msgstr "Spazio su disco"
 
-#: ardour_ui_ed.cc:537
+#: ardour_ui_ed.cc:632
 msgid "DSP"
 msgstr "DSP"
 
-#: ardour_ui_ed.cc:538
+#: ardour_ui_ed.cc:633
+msgid "X-run"
+msgstr ""
+
+#: ardour_ui_ed.cc:634
+msgid "Active Peak-file Work"
+msgstr ""
+
+#: ardour_ui_ed.cc:635
 msgid "Buffers"
 msgstr "Buffers"
 
-#: ardour_ui_ed.cc:540
+#: ardour_ui_ed.cc:637
 msgid "Timecode Format"
 msgstr ""
 
-#: ardour_ui_ed.cc:541
+#: ardour_ui_ed.cc:638
 msgid "File Format"
 msgstr "Formato del file"
 
-#: ardour_ui_options.cc:63
+#: ardour_ui_options.cc:55
 msgid ""
 "It is not possible to use JACK as the the sync source\n"
 "when the pull up/down setting is non-zero."
@@ -2215,134 +2587,139 @@ msgstr ""
 "Impossibile utilizzare JACK come sorgente di sincronizzazione\n"
 "se le impostazioni di \"pull up/down\" non sono uguali a zero."
 
-#: ardour_ui_options.cc:317
+#: ardour_ui_options.cc:309
 msgid "Internal"
 msgstr "Interno"
 
-#: ardour_ui_options.cc:498
+#: ardour_ui_options.cc:518
 msgid "Enable/Disable external positional sync"
 msgstr "Abilita/Disabilita la sincronia esterna"
 
-#: ardour_ui_options.cc:500
+#: ardour_ui_options.cc:520
 msgid "Sync to JACK is not possible: video pull up/down is set"
 msgstr ""
 "Impossibile sincronizzazione con JACK: è impostato video \"pull up/down\""
 
-#: audio_clock.cc:1047 audio_clock.cc:1066
+#: audio_clock.cc:1057 audio_clock.cc:1076
 msgid "--pending--"
 msgstr "--in corso--"
 
-#: audio_clock.cc:1118
+#: audio_clock.cc:1128
 msgid "SR"
 msgstr "SR"
 
-#: audio_clock.cc:1124 audio_clock.cc:1128
+#: audio_clock.cc:1134 audio_clock.cc:1138
 msgid "Pull"
 msgstr "Tira"
 
-#: audio_clock.cc:1126
+#: audio_clock.cc:1136
 #, c-format
 msgid "%+.4f%%"
 msgstr "%+.4f%%"
 
-#: audio_clock.cc:1282 editor.cc:260 editor_actions.cc:139
-#: editor_actions.cc:561
+#: audio_clock.cc:1292 editor.cc:323 editor_actions.cc:142
+#: editor_actions.cc:602
 msgid "Tempo"
 msgstr "Tempo"
 
-#: audio_clock.cc:1286 editor.cc:261 editor_actions.cc:562
+#: audio_clock.cc:1296 editor.cc:324 editor_actions.cc:603
 msgid "Meter"
 msgstr "Suddivisione"
 
-#: audio_clock.cc:1864 audio_streamview.cc:115 editor_actions.cc:1089
-#: session_metadata_dialog.cc:452 session_metadata_dialog.cc:500
-#: session_metadata_dialog.cc:556 session_metadata_dialog.cc:845
-#: streamview.cc:470
+#: audio_clock.cc:1878 audio_streamview.cc:117 editor_actions.cc:1092
+#: luainstance.cc:959 luainstance.cc:1575 plugin_pin_dialog.cc:859
+#: plugin_selector.cc:995 plugin_selector.cc:1016
+#: session_metadata_dialog.cc:455 session_metadata_dialog.cc:503
+#: session_metadata_dialog.cc:559 session_metadata_dialog.cc:848
+#: streamview.cc:474
 msgid "programming error: %1"
 msgstr "Errore di programmazione: %1"
 
-#: audio_clock.cc:1997 audio_clock.cc:2025
+#: audio_clock.cc:2011 audio_clock.cc:2039
 msgid "programming error: %1 %2"
 msgstr "errore di programmazione: %1 %2"
 
-#: audio_clock.cc:2093 editor.cc:257 export_timespan_selector.cc:98
+#: audio_clock.cc:2123 editor.cc:320 export_timespan_selector.cc:95
 msgid "Bars:Beats"
 msgstr "Battute:Battiti"
 
-#: audio_clock.cc:2094 export_timespan_selector.cc:93
+#: audio_clock.cc:2124 export_timespan_selector.cc:90
 msgid "Minutes:Seconds"
 msgstr "Minuti:Secondi"
 
-#: audio_clock.cc:2099
-msgid "Set From Playhead"
-msgstr "Imposta dalla testina"
+#: audio_clock.cc:2129
+msgid "Set from Playhead"
+msgstr ""
 
-#: audio_clock.cc:2100
+#: audio_clock.cc:2130
 msgid "Locate to This Time"
 msgstr "Posizionati su questo tempo"
 
-#: audio_region_editor.cc:64 control_point_dialog.cc:49 rhythm_ferret.cc:124
-#: rhythm_ferret.cc:129 rhythm_ferret.cc:134
+#: audio_clock.cc:2133
+msgid "Copy to clipboard"
+msgstr ""
+
+#: audio_region_editor.cc:60 control_point_dialog.cc:49 rhythm_ferret.cc:137
+#: rhythm_ferret.cc:154
 msgid "dB"
 msgstr "dB"
 
-#: audio_region_editor.cc:67
+#: audio_region_editor.cc:63
 msgid "Region gain:"
 msgstr "Guadagno della regione:"
 
-#: audio_region_editor.cc:77 export_format_dialog.cc:43
+#: audio_region_editor.cc:73 export_format_dialog.cc:49 export_report.cc:772
+#: export_report.cc:1185 fft_graph.cc:370
 msgid "dBFS"
 msgstr "dBFS"
 
-#: audio_region_editor.cc:80
+#: audio_region_editor.cc:76
 msgid "Peak amplitude:"
 msgstr "Ampiezza di picco:"
 
-#: audio_region_editor.cc:91
+#: audio_region_editor.cc:87
 msgid "Calculating..."
 msgstr "Calcolo..."
 
-#: audio_region_view.cc:1243
+#: audio_region_view.cc:1385
 msgid "add gain control point"
 msgstr "Aggiungi un punto di controllo del guadagno"
 
-#: automation_controller.cc:286 automation_controller.cc:302
+#: automation_controller.cc:304 automation_controller.cc:320
 msgid "Select Note..."
 msgstr "Seleziona nota..."
 
-#: automation_controller.cc:293
+#: automation_controller.cc:311
 msgid "Halve"
 msgstr "Dimezza"
 
-#: automation_controller.cc:296
+#: automation_controller.cc:314
 msgid "Double"
 msgstr "Raddoppia"
 
-#: automation_controller.cc:307
-msgid "Set to %1 beat(s)"
-msgstr "Imposta a %1 battito/i"
+#: automation_controller.cc:325
+msgid "Set to %1 beat"
+msgid_plural "Set to %1 beats"
+msgstr[0] ""
+msgstr[1] ""
 
-#: automation_line.cc:286 automation_line.cc:462
+#: automation_line.cc:292 editor_drag.cc:4388
 msgid "automation event move"
 msgstr "sposta evento automazione"
 
-#: automation_line.cc:488 automation_line.cc:508
-msgid "automation range move"
-msgstr "sposta intervallo automazione"
-
-#: automation_line.cc:880 region_gain_line.cc:72
+#: automation_line.cc:888 region_gain_line.cc:75
 msgid "remove control point"
 msgstr "Rimuovi il punto di controllo"
 
-#: automation_line.cc:1003
+#: automation_line.cc:1013
 msgid "Ignoring illegal points on AutomationLine \"%1\""
 msgstr "Sto ignorando i punti incogruenti su AutomationLine \"%1\""
 
-#: automation_region_view.cc:190 automation_time_axis.cc:644
+#: automation_region_view.cc:193 automation_time_axis.cc:649
 msgid "add automation event"
 msgstr "Aggiungi evento di automazione"
 
-#: automation_streamview.cc:95
+#: automation_streamview.cc:94
 msgid "unable to display automation region for control without list"
 msgstr ""
 "impossibile mostrare la regione di automazione per un controllo senza lista"
@@ -2355,63 +2732,59 @@ msgstr "Stato dell'automazione"
 msgid "hide track"
 msgstr "Nascondi traccia"
 
-#: automation_time_axis.cc:308 automation_time_axis.cc:360
-#: automation_time_axis.cc:554 gain_meter.cc:220 generic_pluginui.cc:523
-#: generic_pluginui.cc:817 panner_ui.cc:151
+#: automation_time_axis.cc:310 automation_time_axis.cc:362
+#: automation_time_axis.cc:556 gain_meter.cc:230 generic_pluginui.cc:590
+#: generic_pluginui.cc:934 panner_ui.cc:151
 msgid "Automation|Manual"
 msgstr "Automazione|Manuale"
 
-#: automation_time_axis.cc:310 automation_time_axis.cc:371
-#: automation_time_axis.cc:559 editor.cc:1904 editor.cc:1981
-#: editor_actions.cc:122 editor_actions.cc:1920 gain_meter.cc:223
-#: generic_pluginui.cc:99 generic_pluginui.cc:526 generic_pluginui.cc:819
-#: midi_time_axis.cc:1606 midi_time_axis.cc:1609 midi_time_axis.cc:1612
+#: automation_time_axis.cc:312 automation_time_axis.cc:373
+#: automation_time_axis.cc:561 editor.cc:2033 editor.cc:2111
+#: editor_actions.cc:125 editor_actions.cc:1937 gain_meter.cc:232
+#: generic_pluginui.cc:100 generic_pluginui.cc:593 generic_pluginui.cc:936
+#: midi_time_axis.cc:1610 midi_time_axis.cc:1613 midi_time_axis.cc:1616
 #: panner_ui.cc:154
 msgid "Play"
 msgstr "Suona"
 
-#: automation_time_axis.cc:312 automation_time_axis.cc:382
-#: automation_time_axis.cc:564 gain_meter.cc:226 generic_pluginui.cc:101
-#: generic_pluginui.cc:529 generic_pluginui.cc:821 panner_ui.cc:157
+#: automation_time_axis.cc:314 automation_time_axis.cc:384
+#: automation_time_axis.cc:566 gain_meter.cc:234 generic_pluginui.cc:102
+#: generic_pluginui.cc:596 generic_pluginui.cc:938 panner_ui.cc:157
 msgid "Write"
 msgstr "Scrivi"
 
-#: automation_time_axis.cc:314 automation_time_axis.cc:393
-#: automation_time_axis.cc:569 gain_meter.cc:229 generic_pluginui.cc:103
-#: generic_pluginui.cc:532 generic_pluginui.cc:823 panner_ui.cc:160
+#: automation_time_axis.cc:316 automation_time_axis.cc:395
+#: automation_time_axis.cc:571 gain_meter.cc:236 generic_pluginui.cc:104
+#: generic_pluginui.cc:599 generic_pluginui.cc:940 panner_ui.cc:160
 msgid "Touch"
 msgstr "Tocco"
 
-#: automation_time_axis.cc:404 generic_pluginui.cc:535 meter_patterns.cc:112
+#: automation_time_axis.cc:406 generic_pluginui.cc:602 meter_patterns.cc:118
 msgid "???"
 msgstr "???"
 
-#: automation_time_axis.cc:445
+#: automation_time_axis.cc:447
 msgid "clear automation"
 msgstr "pulisci l'automazione"
 
-#: automation_time_axis.cc:543 editor_actions.cc:645 editor_markers.cc:902
-#: location_ui.cc:57 plugin_selector.cc:86 route_time_axis.cc:854
-msgid "Hide"
-msgstr "Nascondi"
-
-#: automation_time_axis.cc:545
+#: automation_time_axis.cc:547 rc_option_editor.cc:2916
+#: rc_option_editor.cc:2921 rc_option_editor.cc:2967 rc_option_editor.cc:2972
 msgid "Clear"
 msgstr "Pulisci"
 
-#: automation_time_axis.cc:576
+#: automation_time_axis.cc:578
 msgid "State"
 msgstr "Stato"
 
-#: automation_time_axis.cc:592
+#: automation_time_axis.cc:594
 msgid "Discrete"
 msgstr "Discreto"
 
-#: automation_time_axis.cc:598 export_format_dialog.cc:485
+#: automation_time_axis.cc:600 export_format_dialog.cc:552
 msgid "Linear"
 msgstr "Lineare"
 
-#: automation_time_axis.cc:604 rhythm_ferret.cc:109 shuttle_control.cc:197
+#: automation_time_axis.cc:606 rhythm_ferret.cc:118 shuttle_control.cc:224
 msgid "Mode"
 msgstr "Modo"
 
@@ -2427,35 +2800,38 @@ msgstr "Modifica il raggruppamento"
 msgid "Direction:"
 msgstr "Direzione:"
 
-#: bundle_manager.cc:206 bundle_manager.cc:210 engine_dialog.cc:662
-#: mixer_strip.cc:162 mixer_strip.cc:367 mixer_strip.cc:2240
-#: rc_option_editor.cc:2326
+#: bundle_manager.cc:206 bundle_manager.cc:210 engine_dialog.cc:976
+#: mixer_strip.cc:175 mixer_strip.cc:392 mixer_strip.cc:2451
+#: rc_option_editor.cc:3135
 msgid "Input"
 msgstr "Ingresso"
 
 #: bundle_manager.cc:207 bundle_manager.cc:212 bundle_manager.cc:246
-#: engine_dialog.cc:664 mixer_strip.cc:166 mixer_strip.cc:371
-#: mixer_strip.cc:2243 rc_option_editor.cc:2330
+#: engine_dialog.cc:978 mixer_strip.cc:179 mixer_strip.cc:396
+#: mixer_strip.cc:2454 monitor_section.cc:296 monitor_section.cc:300
+#: rc_option_editor.cc:3139
 msgid "Output"
 msgstr "Uscita"
 
-#: bundle_manager.cc:265 editor.cc:1945 editor_actions.cc:94
-#: editor_actions.cc:104 rc_option_editor.cc:1087 rc_option_editor.cc:1094
+#: bundle_manager.cc:265 editor.cc:2075 editor_actions.cc:97
+#: editor_actions.cc:107 lua_script_manager.cc:33 rc_option_editor.cc:2928
+#: rc_option_editor.cc:2942
 msgid "Edit"
 msgstr "Modifica"
 
-#: bundle_manager.cc:266 editor.cc:5902 editor.cc:5930 editor_actions.cc:338
-#: editor_actions.cc:339 editor_actions.cc:405 plugin_ui.cc:420
-#: processor_box.cc:2458 route_time_axis.cc:859
+#: bundle_manager.cc:266 editor.cc:5962 editor.cc:5992 editor_actions.cc:360
+#: editor_actions.cc:361 luawindow.cc:101 plugin_ui.cc:420
+#: processor_box.cc:3669 processor_box.cc:3671
 msgid "Delete"
 msgstr "Elimina"
 
-#: bundle_manager.cc:272 bundle_manager.cc:439 editor_route_groups.cc:97
-#: editor_routes.cc:206 midi_list_editor.cc:107 session_metadata_dialog.cc:646
+#: bundle_manager.cc:272 bundle_manager.cc:439 editor_route_groups.cc:98
+#: editor_routes.cc:233 lua_script_manager.cc:42 lua_script_manager.cc:76
+#: midi_list_editor.cc:107 session_metadata_dialog.cc:649
 msgid "Name"
 msgstr "Nome"
 
-#: bundle_manager.cc:283
+#: bundle_manager.cc:283 luawindow.cc:566
 msgid "New"
 msgstr "Nuovo"
 
@@ -2471,18 +2847,87 @@ msgstr "Aggiungi canale"
 msgid "Rename Channel"
 msgstr "Rinomina canale"
 
-#: configinfo.cc:28
-msgid "Build Configuration"
-msgstr "Configura"
+#: color_theme_manager.cc:58
+msgid "Restore Defaults"
+msgstr "Ripristina i valori base"
 
-#: control_point_dialog.cc:33
-msgid "Control point"
-msgstr "Punto di controllo"
+#: color_theme_manager.cc:62
+msgid "Color Theme"
+msgstr ""
 
-#: control_point_dialog.cc:45
-msgid "Value"
+#: color_theme_manager.cc:126
+msgid "Object"
+msgstr "oggetto"
+
+#: color_theme_manager.cc:129 route_group_dialog.cc:53
+#: route_group_dialog.cc:81
+msgid "Color"
+msgstr "Colore"
+
+#: color_theme_manager.cc:151
+msgid "Items"
+msgstr ""
+
+#: color_theme_manager.cc:152
+msgid "Palette"
+msgstr ""
+
+#: color_theme_manager.cc:153
+msgid "Transparency"
+msgstr ""
+
+#: color_theme_manager.cc:475
+msgid "Color Palette"
+msgstr ""
+
+#: configinfo.cc:28
+msgid "Build Configuration"
+msgstr "Configura"
+
+#: control_point_dialog.cc:33
+msgid "Control point"
+msgstr "Punto di controllo"
+
+#: control_point_dialog.cc:45
+msgid "Value"
 msgstr "Valore"
 
+#: control_slave_ui.cc:50 mixer_ui.cc:254
+msgid "Control Masters"
+msgstr ""
+
+#: control_slave_ui.cc:54
+msgid "-vca-"
+msgstr ""
+
+#: control_slave_ui.cc:211
+msgid "Unassign All"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:35
+msgid "Duplicate Tracks & Busses"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:36
+msgid "Copy playlists"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:37
+msgid "Create new (empty) playlists"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:38
+msgid "Share playlists"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:41
+msgid "Duplicate each track/bus this number of times:"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:176
+msgid "1 or more tracks/busses could not be duplicated"
+msgstr ""
+
 #: edit_note_dialog.cc:42
 msgid "Note"
 msgstr "Nota"
@@ -2520,599 +2965,601 @@ msgstr "Intonazione"
 msgid "Velocity"
 msgstr "Pressione"
 
-#: edit_note_dialog.cc:88 patch_change_dialog.cc:66
+#: edit_note_dialog.cc:88 export_report.cc:246 export_report.cc:688
+#: patch_change_dialog.cc:66
 msgid "Time"
 msgstr "Tempo"
 
-#: edit_note_dialog.cc:98 editor_regions.cc:115
-#: export_timespan_selector.cc:378 export_timespan_selector.cc:440
-#: location_ui.cc:320 midi_list_editor.cc:115 time_info_box.cc:108
+#: edit_note_dialog.cc:99 editor_regions.cc:162
+#: export_timespan_selector.cc:375 export_timespan_selector.cc:437
+#: location_ui.cc:322 midi_list_editor.cc:115 time_info_box.cc:102
 msgid "Length"
 msgstr "Durata"
 
-#: edit_note_dialog.cc:165
+#: edit_note_dialog.cc:166
 msgid "edit note"
 msgstr "modifca la nota"
 
-#: editor.cc:147
+#: editor.cc:160
 msgid "CD Frames"
 msgstr "CD Frames"
 
-#: editor.cc:148
+#: editor.cc:161
 msgid "TC Frames"
 msgstr ""
 
-#: editor.cc:149
+#: editor.cc:162
 msgid "TC Seconds"
 msgstr "TC Secondi"
 
-#: editor.cc:150
+#: editor.cc:163
 msgid "TC Minutes"
 msgstr "TC Minuti"
 
-#: editor.cc:151
+#: editor.cc:164
 msgid "Seconds"
 msgstr "Secondi"
 
-#: editor.cc:152
+#: editor.cc:165
 msgid "Minutes"
 msgstr "Minuti"
 
-#: editor.cc:153 quantize_dialog.cc:37 quantize_dialog.cc:141
+#: editor.cc:166 quantize_dialog.cc:37
 msgid "Beats/128"
 msgstr "Battiti/128"
 
-#: editor.cc:154 quantize_dialog.cc:38 quantize_dialog.cc:143
+#: editor.cc:167 quantize_dialog.cc:38
 msgid "Beats/64"
 msgstr "Battiti/64"
 
-#: editor.cc:155 quantize_dialog.cc:39 quantize_dialog.cc:145
+#: editor.cc:168 quantize_dialog.cc:39
 msgid "Beats/32"
 msgstr "Battiti/32"
 
-#: editor.cc:156
+#: editor.cc:169 quantize_dialog.cc:40
 msgid "Beats/28"
 msgstr "Battiti/28"
 
-#: editor.cc:157
+#: editor.cc:170 quantize_dialog.cc:41
 msgid "Beats/24"
 msgstr "Battiti/24"
 
-#: editor.cc:158
+#: editor.cc:171 quantize_dialog.cc:42
 msgid "Beats/20"
 msgstr "Battiti/20"
 
-#: editor.cc:159 quantize_dialog.cc:40 quantize_dialog.cc:147
+#: editor.cc:172 quantize_dialog.cc:43
 msgid "Beats/16"
 msgstr "Battiti/16"
 
-#: editor.cc:160
+#: editor.cc:173 quantize_dialog.cc:44
 msgid "Beats/14"
 msgstr "Battiti/14"
 
-#: editor.cc:161
+#: editor.cc:174 quantize_dialog.cc:45
 msgid "Beats/12"
 msgstr "Battiti/12"
 
-#: editor.cc:162
+#: editor.cc:175 quantize_dialog.cc:46
 msgid "Beats/10"
 msgstr "Battiti/10"
 
-#: editor.cc:163 quantize_dialog.cc:41 quantize_dialog.cc:149
+#: editor.cc:176 quantize_dialog.cc:47
 msgid "Beats/8"
 msgstr "Battiti/8"
 
-#: editor.cc:164
+#: editor.cc:177 quantize_dialog.cc:48
 msgid "Beats/7"
 msgstr "Battiti/7"
 
-#: editor.cc:165
+#: editor.cc:178 quantize_dialog.cc:49
 msgid "Beats/6"
 msgstr "Battiti/6"
 
-#: editor.cc:166
+#: editor.cc:179 quantize_dialog.cc:50
 msgid "Beats/5"
 msgstr "Battiti/5"
 
-#: editor.cc:167 quantize_dialog.cc:42 quantize_dialog.cc:151
+#: editor.cc:180 quantize_dialog.cc:51
 msgid "Beats/4"
 msgstr "Battiti/4"
 
-#: editor.cc:168 quantize_dialog.cc:43 quantize_dialog.cc:153
+#: editor.cc:181 quantize_dialog.cc:52
 msgid "Beats/3"
 msgstr "Battiti/3"
 
-#: editor.cc:169 quantize_dialog.cc:44 quantize_dialog.cc:155
+#: editor.cc:182 quantize_dialog.cc:53
 msgid "Beats/2"
 msgstr "Battiti/2"
 
-#: editor.cc:170 quantize_dialog.cc:45 quantize_dialog.cc:157
+#: editor.cc:183 quantize_dialog.cc:54
 msgid "Beats"
 msgstr "Battiti"
 
-#: editor.cc:171
+#: editor.cc:184
 msgid "Bars"
 msgstr "Battute"
 
-#: editor.cc:172
+#: editor.cc:185
 msgid "Marks"
 msgstr "Marcatori"
 
-#: editor.cc:173
+#: editor.cc:186
 msgid "Region starts"
 msgstr "Inizio regione"
 
-#: editor.cc:174
+#: editor.cc:187
 msgid "Region ends"
 msgstr "Fine regione"
 
-#: editor.cc:175
+#: editor.cc:188
 msgid "Region syncs"
 msgstr "Sync delle regioni"
 
-#: editor.cc:176
+#: editor.cc:189
 msgid "Region bounds"
 msgstr "Confini regione"
 
-#: editor.cc:181 editor_actions.cc:510
+#: editor.cc:194 editor_actions.cc:551
 msgid "No Grid"
 msgstr "Nessuna griglia"
 
-#: editor.cc:182 editor_actions.cc:511
+#: editor.cc:195 editor_actions.cc:552
 msgid "Grid"
 msgstr "Griglia"
 
-#: editor.cc:183 editor_actions.cc:512
+#: editor.cc:196 editor_actions.cc:553
 msgid "Magnetic"
 msgstr "Magnetico"
 
-#: editor.cc:188 editor.cc:206 editor_actions.cc:121 editor_actions.cc:493
+#: editor.cc:201 editor.cc:219 editor_actions.cc:124 editor_actions.cc:534
 msgid "Playhead"
 msgstr "Testina"
 
-#: editor.cc:189 editor_actions.cc:495
+#: editor.cc:202 editor_actions.cc:536
 msgid "Marker"
 msgstr "Marcatore"
 
-#: editor.cc:190 editor.cc:207 editor_actions.cc:494
+#: editor.cc:203 editor.cc:220 editor_actions.cc:535
 msgid "Mouse"
 msgstr "Mouse"
 
-#: editor.cc:195 editor_actions.cc:502
+#: editor.cc:208 editor_actions.cc:543
 msgid "Slide"
 msgstr "Scorri"
 
-#: editor.cc:196
+#: editor.cc:209
 msgid "Splice"
 msgstr "Unisci"
 
-#: editor.cc:197 editor_actions.cc:501
+#: editor.cc:210 editor_actions.cc:542
 msgid "Ripple"
 msgstr ""
 
-#: editor.cc:198 editor_actions.cc:157 editor_actions.cc:503
-#: editor_actions.cc:1789 editor_markers.cc:905 editor_rulers.cc:260
-#: location_ui.cc:58 mixer_strip.cc:195 mixer_strip.cc:2028
+#: editor.cc:211 editor_actions.cc:1806 editor_markers.cc:910
+#: editor_rulers.cc:259 location_ui.cc:62
 msgid "Lock"
 msgstr "Blocca"
 
-#: editor.cc:203 mono_panner_editor.cc:42
+#: editor.cc:216 mono_panner_editor.cc:44
 msgid "Left"
 msgstr "Sinistra"
 
-#: editor.cc:204 mono_panner_editor.cc:47
+#: editor.cc:217 mono_panner_editor.cc:49
 msgid "Right"
 msgstr "Destra"
 
-#: editor.cc:205
+#: editor.cc:218
 msgid "Center"
 msgstr "Centro"
 
-#: editor.cc:208 editor.cc:3231
+#: editor.cc:221
 msgid "Edit point"
 msgstr "Punto di modifica"
 
-#: editor.cc:214
+#: editor.cc:227
 msgid "Mushy"
 msgstr ""
 
-#: editor.cc:215
+#: editor.cc:228
 msgid "Smooth"
 msgstr "Dolce"
 
-#: editor.cc:216
+#: editor.cc:229
 msgid "Balanced multitimbral mixture"
 msgstr "Miscela multi timbrica equilibrata"
 
-#: editor.cc:217
+#: editor.cc:230
 msgid "Unpitched percussion with stable notes"
 msgstr ""
 
-#: editor.cc:218
+#: editor.cc:231
 msgid "Crisp monophonic instrumental"
 msgstr ""
 
-#: editor.cc:219
+#: editor.cc:232
 msgid "Unpitched solo percussion"
 msgstr ""
 
-#: editor.cc:220
+#: editor.cc:233
 msgid "Resample without preserving pitch"
 msgstr "Ricampiona senza conservare l'intonazione"
 
-#: editor.cc:256
+#: editor.cc:319
 msgid "Mins:Secs"
 msgstr "Minuti:Secondi"
 
-#: editor.cc:262
+#: editor.cc:325
 msgid "Location Markers"
 msgstr "Marcatori di posizione"
 
-#: editor.cc:263
+#: editor.cc:326
 msgid "Range Markers"
 msgstr "Marcatori di intervallo"
 
-#: editor.cc:264
+#: editor.cc:327
 msgid "Loop/Punch Ranges"
 msgstr "Intervalli di Ciclo/Punch"
 
-#: editor.cc:265 editor_actions.cc:565
+#: editor.cc:328 editor_actions.cc:606
 msgid "CD Markers"
 msgstr "Marcatori CD"
 
-#: editor.cc:266
+#: editor.cc:329
 msgid "Video Timeline"
 msgstr "Timeline video"
 
-#: editor.cc:283
+#: editor.cc:386
 msgid "mode"
 msgstr "modo"
 
-#: editor.cc:459 editor_actions.cc:114 editor_actions.cc:564
+#: editor.cc:535 editor_actions.cc:117 editor_actions.cc:605
 msgid "Markers"
 msgstr "Marcatori"
 
-#: editor.cc:577 rc_option_editor.cc:1939
+#: editor.cc:653 rc_option_editor.cc:2527
 msgid "Regions"
 msgstr "Regioni"
 
-#: editor.cc:578
+#: editor.cc:654
 msgid "Tracks & Busses"
 msgstr "Tracce e Bus"
 
-#: editor.cc:579
+#: editor.cc:655
 msgid "Snapshots"
 msgstr "Istantanee"
 
-#: editor.cc:580
+#: editor.cc:656
 msgid "Track & Bus Groups"
 msgstr "Tracce & Gruppi"
 
-#: editor.cc:581
+#: editor.cc:657
 msgid "Ranges & Marks"
 msgstr "Intervalli & marcatori"
 
-#: editor.cc:728 editor.cc:5754 rc_option_editor.cc:1619
-#: rc_option_editor.cc:1627 rc_option_editor.cc:1635 rc_option_editor.cc:1643
-#: rc_option_editor.cc:1667 rc_option_editor.cc:1679 rc_option_editor.cc:1681
-#: rc_option_editor.cc:1689 rc_option_editor.cc:1697 rc_option_editor.cc:1717
-#: rc_option_editor.cc:1729 rc_option_editor.cc:1731 rc_option_editor.cc:1733
-#: rc_option_editor.cc:1741 rc_option_editor.cc:1749 rc_option_editor.cc:1757
-#: rc_option_editor.cc:1772 rc_option_editor.cc:1776 rc_option_editor.cc:1800
-msgid "Editor"
-msgstr "Editor"
-
-#: editor.cc:1331 editor.cc:4735 editor_actions.cc:134 editor_actions.cc:1865
+#: editor.cc:1333 editor.cc:4737 editor_actions.cc:137 editor_actions.cc:1882
 msgid "Loop"
 msgstr "Ciclo"
 
-#: editor.cc:1337 editor.cc:4762 editor_actions.cc:135 time_info_box.cc:68
+#: editor.cc:1339 editor.cc:4764 editor_actions.cc:138 time_info_box.cc:62
 msgid "Punch"
 msgstr "Punch"
 
-#: editor.cc:1449 rc_option_editor.cc:1661
+#: editor.cc:1474 rc_option_editor.cc:2299
 msgid "Linear (for highly correlated material)"
 msgstr "Lineare (per materiale altamente correlato)"
 
-#: editor.cc:1459 rc_option_editor.cc:1662
+#: editor.cc:1484 rc_option_editor.cc:2300
 msgid "Constant power"
 msgstr "Energia costante"
 
-#: editor.cc:1468 rc_option_editor.cc:1663
+#: editor.cc:1493 rc_option_editor.cc:2301
 msgid "Symmetric"
 msgstr "Simmetrico"
 
-#: editor.cc:1478 rc_option_editor.cc:1664
+#: editor.cc:1503 rc_option_editor.cc:2302
 msgid "Slow"
 msgstr "Lento"
 
-#: editor.cc:1487 rc_option_editor.cc:1665 sfdb_ui.cc:1771 sfdb_ui.cc:1881
+#: editor.cc:1512 rc_option_editor.cc:2303 sfdb_ui.cc:1737 sfdb_ui.cc:1847
 msgid "Fast"
 msgstr "Veloce"
 
-#: editor.cc:1509 editor.cc:1534
+#: editor.cc:1534 editor.cc:1559
 msgid "Deactivate"
 msgstr "Disattiva"
 
-#: editor.cc:1511 editor.cc:1536
+#: editor.cc:1536 editor.cc:1561
 msgid "Activate"
 msgstr "Attiva"
 
-#: editor.cc:1637 editor.cc:1645 editor_ops.cc:3824
+#: editor.cc:1662 editor.cc:1670 editor_ops.cc:3921
 msgid "Freeze"
 msgstr "Congela"
 
-#: editor.cc:1641
+#: editor.cc:1666
 msgid "Unfreeze"
 msgstr "Scongela"
 
-#: editor.cc:1780
+#: editor.cc:1766
+msgid "Region Loudness Analysis"
+msgstr ""
+
+#: editor.cc:1785 editor.cc:1834
+msgid "Audio Report/Analysis"
+msgstr ""
+
+#: editor.cc:1815
+msgid "Range Loudness Analysis"
+msgstr ""
+
+#: editor.cc:1901
 msgid "Selected Regions"
 msgstr "Regioni selezionate"
 
-#: editor.cc:1816 editor_markers.cc:940
+#: editor.cc:1945 editor_markers.cc:945
 msgid "Play Range"
 msgstr "Riproduci l'intervallo"
 
-#: editor.cc:1817 editor_markers.cc:943
+#: editor.cc:1946 editor_markers.cc:948
 msgid "Loop Range"
 msgstr "Cicla l'intervallo"
 
-#: editor.cc:1820 editor_markers.cc:950
+#: editor.cc:1949 editor_markers.cc:953
 msgid "Zoom to Range"
 msgstr "Zoom sull'intervallo"
 
-#: editor.cc:1829 editor_actions.cc:369
+#: editor.cc:1952
+msgid "Loudness Analysis"
+msgstr ""
+
+#: editor.cc:1959 editor_actions.cc:401
 msgid "Move Range Start to Previous Region Boundary"
 msgstr "Sposta l'inizio intervallo alla regione precedente"
 
-#: editor.cc:1836 editor_actions.cc:376
+#: editor.cc:1966 editor_actions.cc:408
 msgid "Move Range Start to Next Region Boundary"
 msgstr "Sposta l'inizio intervallo alla regione successiva"
 
-#: editor.cc:1843 editor_actions.cc:383
+#: editor.cc:1973 editor_actions.cc:415
 msgid "Move Range End to Previous Region Boundary"
 msgstr "Sposta la fine intervallo alla regione precedente"
 
-#: editor.cc:1850 editor_actions.cc:390
+#: editor.cc:1980 editor_actions.cc:422
 msgid "Move Range End to Next Region Boundary"
 msgstr "Sposta la fine intervallo alla prossima regione"
 
-#: editor.cc:1856 editor_actions.cc:133 editor_actions.cc:325
+#: editor.cc:1986 editor_actions.cc:136 editor_actions.cc:347
 msgid "Separate"
 msgstr "Separa"
 
-#: editor.cc:1857
+#: editor.cc:1987
 msgid "Convert to Region in Region List"
 msgstr "Converti in regione nella lista delle regioni"
 
-#: editor.cc:1860 editor_markers.cc:970
+#: editor.cc:1990 editor_markers.cc:973
 msgid "Select All in Range"
 msgstr "Seleziona tutto nell'intervallo"
 
-#: editor.cc:1863 editor_actions.cc:297
+#: editor.cc:1993 editor_actions.cc:319
 msgid "Set Loop from Selection"
 msgstr "Imposta il ciclo dalla selezione"
 
-#: editor.cc:1864 editor_actions.cc:298
+#: editor.cc:1994 editor_actions.cc:320
 msgid "Set Punch from Selection"
 msgstr ""
 
-#: editor.cc:1865 editor_actions.cc:299
+#: editor.cc:1995 editor_actions.cc:321
 msgid "Set Session Start/End from Selection"
 msgstr "Imposta l'inizio/fine sessione dalla selezione"
 
-#: editor.cc:1868
+#: editor.cc:1998
 msgid "Add Range Markers"
 msgstr "Aggiungi marcatori di intervallo"
 
-#: editor.cc:1871
+#: editor.cc:2001
 msgid "Crop Region to Range"
 msgstr "Rifila la regione in base all'intervallo"
 
-#: editor.cc:1872
-msgid "Fill Range with Region"
-msgstr "Riempi intervallo con la regione"
-
-#: editor.cc:1873 editor_actions.cc:311
+#: editor.cc:2002 editor_actions.cc:333
 msgid "Duplicate Range"
 msgstr "Duplica intervallo"
 
-#: editor.cc:1876
+#: editor.cc:2005
 msgid "Consolidate Range"
 msgstr "Consolida l'intervallo"
 
-#: editor.cc:1877
-msgid "Consolidate Range With Processing"
-msgstr "Consolida l'intervallo processando i dati"
+#: editor.cc:2006
+msgid "Consolidate Range with Processing"
+msgstr ""
 
-#: editor.cc:1878
+#: editor.cc:2007
 msgid "Bounce Range to Region List"
 msgstr "Fissa l'intervallo nella lista regioni"
 
-#: editor.cc:1879
-msgid "Bounce Range to Region List With Processing"
-msgstr "Fissa l'intervallo nella lista regioni elaborandolo"
+#: editor.cc:2008
+msgid "Bounce Range to Region List with Processing"
+msgstr ""
 
-#: editor.cc:1880 editor_markers.cc:953
+#: editor.cc:2009 editor_markers.cc:956
 msgid "Export Range..."
 msgstr "Esporta l'intervallo..."
 
-#: editor.cc:1882
+#: editor.cc:2011
 msgid "Export Video Range..."
 msgstr "Esporta l'intervallo video..."
 
-#: editor.cc:1898 editor.cc:1979 editor_actions.cc:303
-msgid "Play From Edit Point"
-msgstr "Suona dal punto di modifica"
+#: editor.cc:2027 editor.cc:2109 editor_actions.cc:325
+msgid "Play from Edit Point"
+msgstr ""
 
-#: editor.cc:1899 editor.cc:1980
-msgid "Play From Start"
-msgstr "Riproduci dall'inizio"
+#: editor.cc:2028 editor.cc:2110
+msgid "Play from Start"
+msgstr ""
 
-#: editor.cc:1900
+#: editor.cc:2029
 msgid "Play Region"
 msgstr "Riproduci la regione"
 
-#: editor.cc:1902
+#: editor.cc:2031
 msgid "Loop Region"
 msgstr "Regione in ciclo"
 
-#: editor.cc:1912 editor.cc:1989
+#: editor.cc:2041 editor.cc:2119
 msgid "Select All in Track"
 msgstr "Seleziona tutto nella traccia"
 
-#: editor.cc:1913 editor.cc:1990 editor_actions.cc:194
+#: editor.cc:2042 editor.cc:2120 editor_actions.cc:196
 msgid "Select All Objects"
 msgstr "Seleziona tutti gli oggetti"
 
-#: editor.cc:1914 editor.cc:1991
+#: editor.cc:2043 editor.cc:2121
 msgid "Invert Selection in Track"
 msgstr "Inverti la selezione nella traccia"
 
-#: editor.cc:1915 editor.cc:1992 editor_actions.cc:197
+#: editor.cc:2044 editor.cc:2122 editor_actions.cc:199
 msgid "Invert Selection"
 msgstr "Inverti selezione"
 
-#: editor.cc:1917
+#: editor.cc:2046 editor_actions.cc:201
 msgid "Set Range to Loop Range"
 msgstr "Imposta l'intervallo come ciclo"
 
-#: editor.cc:1918
+#: editor.cc:2047 editor_actions.cc:202
 msgid "Set Range to Punch Range"
 msgstr "Imposta l'intervallo come intervallo di punch"
 
-#: editor.cc:1920 editor.cc:1994 editor_actions.cc:199 editor_actions.cc:200
+#: editor.cc:2048 editor_actions.cc:203
+msgid "Set Range to Selected Regions"
+msgstr ""
+
+#: editor.cc:2050 editor.cc:2124 editor_actions.cc:205 editor_actions.cc:206
 msgid "Select All After Edit Point"
 msgstr "Seleziona tutto dopo il punto di modifica"
 
-#: editor.cc:1921 editor.cc:1995 editor_actions.cc:201 editor_actions.cc:202
+#: editor.cc:2051 editor.cc:2125 editor_actions.cc:207 editor_actions.cc:208
 msgid "Select All Before Edit Point"
 msgstr "Seleziona tutto prima del punto di modifica"
 
-#: editor.cc:1922 editor.cc:1996
+#: editor.cc:2052 editor.cc:2126
 msgid "Select All After Playhead"
 msgstr "Seleziona tutto dopo la testina"
 
-#: editor.cc:1923 editor.cc:1997
+#: editor.cc:2053 editor.cc:2127
 msgid "Select All Before Playhead"
 msgstr "Seleziona tutto prima della testina"
 
-#: editor.cc:1924
+#: editor.cc:2054
 msgid "Select All Between Playhead and Edit Point"
 msgstr "Seleziona tutto tra la testina ed il punto di modifica"
 
-#: editor.cc:1925
+#: editor.cc:2055
 msgid "Select All Within Playhead and Edit Point"
 msgstr "Seleziona tutto tra testina e punto di modifca"
 
-#: editor.cc:1926
+#: editor.cc:2056
 msgid "Select Range Between Playhead and Edit Point"
 msgstr "Seleziona l'intervallo tra la testina ed il punto di modifica"
 
-#: editor.cc:1928 editor.cc:1999 editor_actions.cc:131 editor_actions.cc:132
+#: editor.cc:2058 editor.cc:2129 editor_actions.cc:134 editor_actions.cc:135
 msgid "Select"
 msgstr "Seleziona"
 
-#: editor.cc:1936 editor.cc:2007 editor_actions.cc:337 processor_box.cc:2451
+#: editor.cc:2066 editor.cc:2137 editor_actions.cc:359 processor_box.cc:3665
 msgid "Cut"
 msgstr "Taglia"
 
-#: editor.cc:1937 editor.cc:2008 editor_actions.cc:341 processor_box.cc:2454
+#: editor.cc:2067 editor.cc:2138 editor_actions.cc:363 processor_box.cc:3667
 msgid "Copy"
 msgstr "Copia"
 
-#: editor.cc:1938 editor.cc:2009 editor_actions.cc:342 processor_box.cc:2462
+#: editor.cc:2068 editor.cc:2139 editor_actions.cc:364 processor_box.cc:3679
 msgid "Paste"
 msgstr "Incolla"
 
-#: editor.cc:1942 editor_actions.cc:91
+#: editor.cc:2072 editor_actions.cc:94
 msgid "Align"
 msgstr "Allinea"
 
-#: editor.cc:1943
+#: editor.cc:2073
 msgid "Align Relative"
 msgstr "Allinea Realtivo"
 
-#: editor.cc:1950
+#: editor.cc:2080
 msgid "Insert Selected Region"
 msgstr "Inserisci la regione selezionata"
 
-#: editor.cc:1951
+#: editor.cc:2081
 msgid "Insert Existing Media"
 msgstr "Inserisci media"
 
-#: editor.cc:1960 editor.cc:2016
+#: editor.cc:2090 editor.cc:2146
 msgid "Nudge Entire Track Later"
 msgstr ""
 
-#: editor.cc:1961 editor.cc:2017
+#: editor.cc:2091 editor.cc:2147
 msgid "Nudge Track After Edit Point Later"
 msgstr ""
 
-#: editor.cc:1962 editor.cc:2018
+#: editor.cc:2092 editor.cc:2148
 msgid "Nudge Entire Track Earlier"
 msgstr ""
 
-#: editor.cc:1963 editor.cc:2019
+#: editor.cc:2093 editor.cc:2149
 msgid "Nudge Track After Edit Point Earlier"
 msgstr ""
 
-#: editor.cc:1965 editor.cc:2021
+#: editor.cc:2095 editor.cc:2151
 msgid "Nudge"
 msgstr "Trascina"
 
-#: editor.cc:2235
+#: editor.cc:2353
 msgid ""
 "Playhead position stored with a negative value - ignored (use zero instead)"
 msgstr ""
 "La posizione della testina è stata memorizziata con un valore negativo - "
 "ignorata (viene utilizzato lo zero)"
 
-#: editor.cc:3006 editor.cc:3707 editor.cc:3778 midi_channel_selector.cc:157
+#: editor.cc:3115 editor.cc:3775 editor.cc:3846 midi_channel_selector.cc:157
 #: midi_channel_selector.cc:395 midi_channel_selector.cc:431
 msgid "All"
 msgstr "Tutto"
 
-#: editor.cc:3210
-msgid "Smart Mode (add Range functions to Grab mode)"
+#: editor.cc:3280
+msgid "Smart Mode (add range functions to Grab Mode)"
 msgstr ""
-"Modalità intelligente (aggiunge le funzioni di intervallo alla modalità di "
-"aggancio)"
 
-#: editor.cc:3211
+#: editor.cc:3281
 msgid "Grab Mode (select/move objects)"
 msgstr "Modalità aggancio (seleziona/muove gli oggetti)"
 
-#: editor.cc:3212
+#: editor.cc:3282
 msgid "Cut Mode (split regions)"
 msgstr "Modalità taglio (divide le regioni)"
 
-#: editor.cc:3213
+#: editor.cc:3283
 msgid "Range Mode (select time ranges)"
 msgstr "Modalità intervallo (seleziona intervalli di tempo)"
 
-#: editor.cc:3214
+#: editor.cc:3284
 msgid "Draw Mode (draw and edit gain/notes/automation)"
 msgstr "Modalità disegno (disegna e modifica il guadagno/note/automazione)"
 
-#: editor.cc:3215
+#: editor.cc:3285
 msgid "Stretch Mode (time-stretch audio and midi regions, preserving pitch)"
 msgstr ""
 "Modalità allungamento (allunga in base al tempo le regioni audio e midi "
 "mantenendo l'intonazione)"
 
-#: editor.cc:3216
+#: editor.cc:3286
 msgid "Audition Mode (listen to regions)"
 msgstr "Modalità ascolto (ascolta le regioni)"
 
-#: editor.cc:3217
-msgid "Internal Edit Mode (edit notes and gain curves inside regions)"
+#: editor.cc:3287
+msgid "Internal Edit Mode (edit notes and automation points)"
 msgstr ""
-"Modalità di modifica interna (modifica le note e le curve di guadagno "
-"all'interno delle regioni)"
 
-#: editor.cc:3218
+#: editor.cc:3288
 msgid ""
 "Groups: click to (de)activate\n"
 "Context-click for other operations"
@@ -3120,182 +3567,186 @@ msgstr ""
 "Gruppi: clicca per disattivare\n"
 "Click di contesto per il resto delle operazioni"
 
-#: editor.cc:3219
+#: editor.cc:3289
 msgid "Nudge Region/Selection Later"
 msgstr ""
 
-#: editor.cc:3220
+#: editor.cc:3290
 msgid "Nudge Region/Selection Earlier"
 msgstr ""
 
-#: editor.cc:3221 editor_actions.cc:262
+#: editor.cc:3291 editor_actions.cc:272
 msgid "Zoom In"
 msgstr "Zoom avanti"
 
-#: editor.cc:3222 editor_actions.cc:261
+#: editor.cc:3292 editor_actions.cc:271
 msgid "Zoom Out"
 msgstr "Zoom indietro"
 
-#: editor.cc:3223
+#: editor.cc:3293
 msgid "Zoom to Time Scale"
 msgstr ""
 
-#: editor.cc:3224 editor.cc:3729 editor_actions.cc:263
+#: editor.cc:3294 editor.cc:3797 editor_actions.cc:273
 msgid "Zoom to Session"
 msgstr "Zoom sulla sessione"
 
-#: editor.cc:3225
-msgid "Zoom focus"
+#: editor.cc:3295 editor_actions.cc:115 editor_actions.cc:148
+msgid "Zoom Focus"
 msgstr "Zoom"
 
-#: editor.cc:3226
+#: editor.cc:3296
 msgid "Expand Tracks"
 msgstr "Espandi tracce"
 
-#: editor.cc:3227
+#: editor.cc:3297
 msgid "Shrink Tracks"
 msgstr "Restringi le tracce"
 
-#: editor.cc:3228
+#: editor.cc:3298
 msgid "Number of visible tracks"
 msgstr "Numero di tracce visibili"
 
-#: editor.cc:3229
+#: editor.cc:3299
 msgid "Snap/Grid Units"
 msgstr "Aggancia/Griglia"
 
-#: editor.cc:3230
+#: editor.cc:3300
 msgid "Snap/Grid Mode"
 msgstr "Aggancia/Modalità griglia"
 
-#: editor.cc:3232
+#: editor.cc:3301 editor_actions.cc:101
+msgid "Edit Point"
+msgstr "Punto di modifica"
+
+#: editor.cc:3302
 msgid "Edit Mode"
 msgstr "Modalità di modifica"
 
-#: editor.cc:3233
+#: editor.cc:3303
 msgid ""
 "Nudge Clock\n"
 "(controls distance used to nudge regions and selections)"
 msgstr ""
 
-#: editor.cc:3501 editor_actions.cc:313
+#: editor.cc:3571 editor_actions.cc:335
 msgid "Command|Undo"
 msgstr "Comando|Annulla"
 
-#: editor.cc:3503
+#: editor.cc:3573
 msgid "Command|Undo (%1)"
 msgstr "Comando|Annulla (%1)"
 
-#: editor.cc:3510 editor_actions.cc:315 editor_actions.cc:316
-#: editor_actions.cc:317
+#: editor.cc:3580 editor_actions.cc:337 editor_actions.cc:338
+#: editor_actions.cc:339
 msgid "Redo"
 msgstr "Ripristina"
 
-#: editor.cc:3512
+#: editor.cc:3583
 msgid "Redo (%1)"
 msgstr "Ripristina (%1)"
 
-#: editor.cc:3531 editor.cc:3555 editor_actions.cc:110 editor_actions.cc:1846
+#: editor.cc:3603 editor.cc:3627 editor_actions.cc:113 editor_actions.cc:1863
 msgid "Duplicate"
 msgstr "Duplica"
 
-#: editor.cc:3532
+#: editor.cc:3604
 msgid "Number of duplications:"
 msgstr "Numero di duplicazioni:"
 
-#: editor.cc:3706 route_group_dialog.cc:51 time_info_box.cc:67
+#: editor.cc:3774 route_group_dialog.cc:51 time_info_box.cc:61
 msgid "Selection"
 msgstr "Selezione"
 
-#: editor.cc:3709
+#: editor.cc:3777
 msgid "Fit 1 track"
 msgstr "Adatta 1 traccia"
 
-#: editor.cc:3710
+#: editor.cc:3778
 msgid "Fit 2 tracks"
 msgstr "Adatta 2 tracce"
 
-#: editor.cc:3711
+#: editor.cc:3779
 msgid "Fit 4 tracks"
 msgstr "Adatta 4 tracce"
 
-#: editor.cc:3712
+#: editor.cc:3780
 msgid "Fit 8 tracks"
 msgstr "Adatta 8 tracce"
 
-#: editor.cc:3713
+#: editor.cc:3781
 msgid "Fit 16 tracks"
 msgstr "Adatta 16 tracce"
 
-#: editor.cc:3714
+#: editor.cc:3782
 msgid "Fit 24 tracks"
 msgstr "Adatta 24 tracce"
 
-#: editor.cc:3715
+#: editor.cc:3783
 msgid "Fit 32 tracks"
 msgstr "Adatta 32 tracce"
 
-#: editor.cc:3716
+#: editor.cc:3784
 msgid "Fit 48 tracks"
 msgstr "Adatta 48 tracce"
 
-#: editor.cc:3717
+#: editor.cc:3785
 msgid "Fit All tracks"
 msgstr "Adatta tutte le tracce"
 
-#: editor.cc:3718
+#: editor.cc:3786
 msgid "Fit Selection"
 msgstr "Adatta selezione"
 
-#: editor.cc:3720
+#: editor.cc:3788 editor_actions.cc:288
 msgid "Zoom to 10 ms"
 msgstr "Zoom a 10 ms"
 
-#: editor.cc:3721
+#: editor.cc:3789 editor_actions.cc:289
 msgid "Zoom to 100 ms"
 msgstr "Zoom a 100 ms"
 
-#: editor.cc:3722
+#: editor.cc:3790 editor_actions.cc:290
 msgid "Zoom to 1 sec"
 msgstr "Zoom a 1 sec"
 
-#: editor.cc:3723
+#: editor.cc:3791 editor_actions.cc:291
 msgid "Zoom to 10 sec"
 msgstr "Zoom a 10 sec"
 
-#: editor.cc:3724
+#: editor.cc:3792 editor_actions.cc:292
 msgid "Zoom to 1 min"
 msgstr "Zoom a 1 min"
 
-#: editor.cc:3725
+#: editor.cc:3793 editor_actions.cc:294
 msgid "Zoom to 10 min"
 msgstr "Zoom a 10 min"
 
-#: editor.cc:3726
+#: editor.cc:3794
 msgid "Zoom to 1 hour"
 msgstr "Zoom a 1 ora"
 
-#: editor.cc:3727
+#: editor.cc:3795
 msgid "Zoom to 8 hours"
 msgstr "Zoom a 8 ore"
 
-#: editor.cc:3728
+#: editor.cc:3796
 msgid "Zoom to 24 hours"
 msgstr "Zoom a 24 ore"
 
-#: editor.cc:3730
+#: editor.cc:3798
 msgid "Zoom to Range/Region Selection"
 msgstr "Zoom sull'intervallo/regione selezionato/a"
 
-#: editor.cc:3800
+#: editor.cc:3868
 msgid "*"
 msgstr "*"
 
-#: editor.cc:4120
+#: editor.cc:4135
 msgid "Playlist Deletion"
 msgstr "Eliminazione playlist"
 
-#: editor.cc:4121
+#: editor.cc:4136
 msgid ""
 "Playlist %1 is currently unused.\n"
 "If it is kept, its audio files will not be cleaned.\n"
@@ -3305,1293 +3756,1378 @@ msgstr ""
 "Se viene mantenuta i file audio associati non saranno puliti.\n"
 "Se viene eliminata, soltanto i file audio da essa utilizzati saranno puliti."
 
-#: editor.cc:4131
+#: editor.cc:4146
+msgid "Delete All Unused"
+msgstr ""
+
+#: editor.cc:4147
 msgid "Delete Playlist"
 msgstr "Elimina la playlist"
 
-#: editor.cc:4132
+#: editor.cc:4148
 msgid "Keep Playlist"
 msgstr "Mantieni la playlist"
 
-#: editor.cc:4133 editor_audio_import.cc:594 editor_ops.cc:6174
-#: engine_dialog.cc:2083 sfdb_freesound_mootcher.cc:69 processor_box.cc:2219
-#: processor_box.cc:2244
+#: editor.cc:4149
+msgid "Keep Remaining"
+msgstr ""
+
+#: editor.cc:4150 editor_audio_import.cc:600 editor_ops.cc:6530
+#: engine_dialog.cc:2986 sfdb_freesound_mootcher.cc:69 processor_box.cc:3431
+#: processor_box.cc:3456
 msgid "Cancel"
 msgstr "Cancella"
 
-#: editor.cc:4275
+#: editor.cc:4292
 msgid "new playlists"
 msgstr "nuove playlist"
 
-#: editor.cc:4291
+#: editor.cc:4308
 msgid "copy playlists"
 msgstr "copia le playlist"
 
-#: editor.cc:4306
+#: editor.cc:4323
 msgid "clear playlists"
 msgstr "cancella le playlist"
 
-#: editor.cc:5046
+#: editor.cc:5048
 msgid "Please wait while %1 loads visual data."
 msgstr "Attendi mentre %1 carica i dati per la visualizzazione"
 
-#: editor.cc:5901 editor.cc:5932 editor_markers.cc:985 panner_ui.cc:410
-#: processor_box.cc:2482
+#: editor.cc:5811 editor_actions.cc:479
+msgid "Unset #%1"
+msgstr ""
+
+#: editor.cc:5812 editor_actions.cc:481
+msgid "no action bound"
+msgstr ""
+
+#: editor.cc:5961 editor.cc:5996 editor_markers.cc:998 editor_markers.cc:1018
+#: panner_ui.cc:412 processor_box.cc:3703
 msgid "Edit..."
 msgstr "Modifica..."
 
-#: editor.cc:5934 editor_actions.cc:1941
+#: editor.cc:6002 editor_actions.cc:1842
+msgid "Transpose..."
+msgstr "Trasponi..."
+
+#: editor.cc:6006 editor_actions.cc:1959
 msgid "Legatize"
 msgstr ""
 
-#: editor.cc:5936 editor_actions.cc:1940
+#: editor.cc:6012 editor_actions.cc:1958
 msgid "Quantize..."
 msgstr "Quantizza"
 
-#: editor.cc:5938 editor_actions.cc:1943
+#: editor.cc:6015 editor_actions.cc:1961
 msgid "Remove Overlap"
 msgstr "Rimuove sovrapposizioni"
 
-#: editor.cc:5940 editor_actions.cc:1942
+#: editor.cc:6021 editor_actions.cc:1960
 msgid "Transform..."
 msgstr "Trasforma..."
 
-#: editor_actions.cc:92
+#: editor_actions.cc:95
 msgid "Autoconnect"
 msgstr "Connetti automaticamente"
 
-#: editor_actions.cc:93
+#: editor_actions.cc:96
 msgid "Crossfades"
 msgstr "Dissolvenze incrociate"
 
-#: editor_actions.cc:95
+#: editor_actions.cc:98
 msgid "Move Selected Marker"
 msgstr "Muovi il marcatore selezionato"
 
-#: editor_actions.cc:96
+#: editor_actions.cc:99
 msgid "Select Range Operations"
 msgstr "Seleziona le operazioni di intervallo"
 
-#: editor_actions.cc:97
+#: editor_actions.cc:100
 msgid "Select Regions"
 msgstr "Seleziona regioni"
 
-#: editor_actions.cc:98
-msgid "Edit Point"
-msgstr "Punto di modifica"
-
-#: editor_actions.cc:99
+#: editor_actions.cc:102
 msgid "Fade"
 msgstr "Dissolvi"
 
-#: editor_actions.cc:100
+#: editor_actions.cc:103
 msgid "Latch"
 msgstr "Chiavistello (?)"
 
-#: editor_actions.cc:101 editor_regions.cc:112 region_editor.cc:46
+#: editor_actions.cc:104 editor_regions.cc:159 region_editor.cc:48
 msgid "Region"
 msgstr "Regione"
 
-#: editor_actions.cc:102
+#: editor_actions.cc:105
 msgid "Layering"
 msgstr "Strato"
 
-#: editor_actions.cc:103 editor_regions.cc:113 stereo_panner_editor.cc:44
+#: editor_actions.cc:106 editor_regions.cc:160 stereo_panner_editor.cc:46
 msgid "Position"
 msgstr "Percorso"
 
-#: editor_actions.cc:105 gain_meter.cc:156 gain_meter.cc:825 panner_ui.cc:178
-#: panner_ui.cc:635
+#: editor_actions.cc:108 gain_meter.cc:161 gain_meter.cc:848 panner_ui.cc:178
+#: panner_ui.cc:637 route_time_axis.cc:541
 msgid "Trim"
 msgstr "Spunta"
 
-#: editor_actions.cc:106 editor_actions.cc:126 route_group_dialog.cc:46
+#: editor_actions.cc:109 editor_actions.cc:129 route_group_dialog.cc:46
 msgid "Gain"
 msgstr "Guadagno"
 
-#: editor_actions.cc:107 editor_actions.cc:563
+#: editor_actions.cc:110 editor_actions.cc:604
 msgid "Ranges"
 msgstr "Intervalli"
 
-#: editor_actions.cc:108 editor_actions.cc:1842 session_option_editor.cc:135
+#: editor_actions.cc:111 editor_actions.cc:1859 session_option_editor.cc:135
 #: session_option_editor.cc:144 session_option_editor.cc:151
+#: session_option_editor.cc:158 session_option_editor.cc:165
 msgid "Fades"
 msgstr "Dissolvenze"
 
-#: editor_actions.cc:111
+#: editor_actions.cc:114
 msgid "Link"
 msgstr "Collega"
 
-#: editor_actions.cc:112 editor_actions.cc:145
-msgid "Zoom Focus"
-msgstr "Zoom"
-
-#: editor_actions.cc:113
+#: editor_actions.cc:116
 msgid "Locate to Markers"
 msgstr "Posizionati sui marcatori"
 
-#: editor_actions.cc:115
+#: editor_actions.cc:118
 msgid "Meter falloff"
 msgstr "Caduta del meter"
 
-#: editor_actions.cc:116
+#: editor_actions.cc:119
 msgid "Meter hold"
 msgstr "Tenuta del misuratore"
 
-#: editor_actions.cc:117 session_option_editor.cc:321
+#: editor_actions.cc:120 session_option_editor.cc:342
 msgid "MIDI Options"
 msgstr "Opzioni MIDI"
 
-#: editor_actions.cc:118
+#: editor_actions.cc:121
 msgid "Misc Options"
 msgstr "Opzioni varie"
 
-#: editor_actions.cc:119 rc_option_editor.cc:1809 route_group_dialog.cc:54
-#: session_option_editor.cc:243 session_option_editor.cc:250
+#: editor_actions.cc:122 rc_option_editor.cc:2401 route_group_dialog.cc:54
+#: session_option_editor.cc:264 session_option_editor.cc:271
 msgid "Monitoring"
 msgstr "Controllo"
 
-#: editor_actions.cc:120
+#: editor_actions.cc:123
 msgid "Active Mark"
 msgstr "Marcatore"
 
-#: editor_actions.cc:123
+#: editor_actions.cc:126
 msgid "Primary Clock"
 msgstr "Orologio principale"
 
-#: editor_actions.cc:124
+#: editor_actions.cc:127
 msgid "Pullup / Pulldown"
 msgstr "Tira su / Tira giù"
 
-#: editor_actions.cc:125
+#: editor_actions.cc:128
 msgid "Region operations"
 msgstr "Operazioni sulle regioni"
 
-#: editor_actions.cc:127 ruler_dialog.cc:28
+#: editor_actions.cc:130 ruler_dialog.cc:28
 msgid "Rulers"
 msgstr "Righelli"
 
-#: editor_actions.cc:128
+#: editor_actions.cc:131
 msgid "Views"
 msgstr "Viste"
 
-#: editor_actions.cc:129
+#: editor_actions.cc:132
 msgid "Scroll"
 msgstr "Scorrimento"
 
-#: editor_actions.cc:130
+#: editor_actions.cc:133
 msgid "Secondary Clock"
 msgstr "Orologio secondario"
 
-#: editor_actions.cc:137
+#: editor_actions.cc:140
 msgid "Subframes"
 msgstr ""
 
-#: editor_actions.cc:140
+#: editor_actions.cc:143
 msgid "Timecode fps"
 msgstr ""
 
-#: editor_actions.cc:141 route_time_axis.cc:575
+#: editor_actions.cc:144 route_time_axis.cc:599
 msgid "Height"
 msgstr "Altezza"
 
-#: editor_actions.cc:143
+#: editor_actions.cc:146
 msgid "Tools"
 msgstr "Strumenti"
 
-#: editor_actions.cc:144
+#: editor_actions.cc:147
 msgid "View"
 msgstr "Vista"
 
-#: editor_actions.cc:146
+#: editor_actions.cc:149
 msgid "Zoom"
 msgstr "Zoom"
 
-#: editor_actions.cc:152
-msgid "Break drag or deselect all"
-msgstr "Interrompi il trascinamento o deseleziona tutto"
+#: editor_actions.cc:150
+msgid "Scripted Actions"
+msgstr ""
 
 #: editor_actions.cc:159
+msgid "Session|Lock"
+msgstr ""
+
+#: editor_actions.cc:161
 msgid "Show Editor Mixer"
 msgstr "Mostra il Mixer dell'editor"
 
-#: editor_actions.cc:160
+#: editor_actions.cc:162
 msgid "Show Editor List"
 msgstr "Mostra la lista dell'editor"
 
-#: editor_actions.cc:162
+#: editor_actions.cc:164
 msgid "Playhead to Next Region Boundary"
 msgstr "Sposta la testina al prossimo limite di regione"
 
-#: editor_actions.cc:163
+#: editor_actions.cc:165
 msgid "Playhead to Next Region Boundary (No Track Selection)"
 msgstr ""
 "Sposta la testina al prossimo limite di regione (nessuna selezione della "
 "traccia)"
 
-#: editor_actions.cc:164
+#: editor_actions.cc:166
 msgid "Playhead to Previous Region Boundary"
 msgstr "Sposta la testina al limite di regione precedente"
 
-#: editor_actions.cc:165
+#: editor_actions.cc:167
 msgid "Playhead to Previous Region Boundary (No Track Selection)"
 msgstr ""
 "Sposta la testina al limite di regione precedente (nessuna selezione della "
 "traccia)"
 
-#: editor_actions.cc:167
+#: editor_actions.cc:169
 msgid "Playhead to Next Region Start"
 msgstr "Sposta la testina all'inizio della prossima regione"
 
-#: editor_actions.cc:168
+#: editor_actions.cc:170
 msgid "Playhead to Next Region End"
 msgstr "Sposta la testina alla fine della prossima regione"
 
-#: editor_actions.cc:169
+#: editor_actions.cc:171
 msgid "Playhead to Next Region Sync"
 msgstr "Sposta la testina al punto di sincronizzazione della prossima regione"
 
-#: editor_actions.cc:171
+#: editor_actions.cc:173
 msgid "Playhead to Previous Region Start"
 msgstr "Sposta la testina all'inizio della regione precedente"
 
-#: editor_actions.cc:172
+#: editor_actions.cc:174
 msgid "Playhead to Previous Region End"
 msgstr "Sposta la testina alla fine della regione precedente"
 
-#: editor_actions.cc:173
+#: editor_actions.cc:175
 msgid "Playhead to Previous Region Sync"
 msgstr "Sposta la testina al punto di sincronizzazine della regione precedente"
 
-#: editor_actions.cc:175
+#: editor_actions.cc:177
 msgid "To Next Region Boundary"
 msgstr "Al prossimo limite di regione"
 
-#: editor_actions.cc:176
+#: editor_actions.cc:178
 msgid "To Next Region Boundary (No Track Selection)"
 msgstr "Al prossimo limite di regione (nessuna selezione della traccia)"
 
-#: editor_actions.cc:177
+#: editor_actions.cc:179
 msgid "To Previous Region Boundary"
 msgstr "Al precedente limite di regione"
 
-#: editor_actions.cc:178
+#: editor_actions.cc:180
 msgid "To Previous Region Boundary (No Track Selection)"
 msgstr "Al termine della regione precedente (Nessuna selezione traccia)"
 
-#: editor_actions.cc:180
+#: editor_actions.cc:182
 msgid "To Next Region Start"
 msgstr "All'inizio della prossima regione"
 
-#: editor_actions.cc:181
+#: editor_actions.cc:183
 msgid "To Next Region End"
 msgstr "Alla fine della prossima regione"
 
-#: editor_actions.cc:182
+#: editor_actions.cc:184
 msgid "To Next Region Sync"
 msgstr "Sincronizzare alla prossima regione"
 
-#: editor_actions.cc:184
+#: editor_actions.cc:186
 msgid "To Previous Region Start"
 msgstr "All'inizio della regione precedente"
 
-#: editor_actions.cc:185
+#: editor_actions.cc:187
 msgid "To Previous Region End"
 msgstr "Alla fine della regione precedente"
 
-#: editor_actions.cc:186
+#: editor_actions.cc:188
 msgid "To Previous Region Sync"
 msgstr "Sincronizzare alla regione precedente"
 
-#: editor_actions.cc:188
+#: editor_actions.cc:190
 msgid "To Range Start"
 msgstr "All'inizio dell'intervallo"
 
-#: editor_actions.cc:189
+#: editor_actions.cc:191
 msgid "To Range End"
 msgstr "Alla fine dell'intervallo"
 
-#: editor_actions.cc:191
+#: editor_actions.cc:193
 msgid "Playhead to Range Start"
 msgstr "Sposta la testina all'inizio dell'intervallo"
 
-#: editor_actions.cc:192
+#: editor_actions.cc:194
 msgid "Playhead to Range End"
 msgstr "Sposta la testina alla fine dell'intervallo"
 
-#: editor_actions.cc:195
+#: editor_actions.cc:197
 msgid "Select All Tracks"
 msgstr "Seleziona tutte le tracce"
 
-#: editor_actions.cc:196 export_timespan_selector.cc:61 processor_box.cc:2468
+#: editor_actions.cc:198 export_timespan_selector.cc:59 processor_box.cc:3685
 msgid "Deselect All"
 msgstr "Deseleziona tutto"
 
-#: editor_actions.cc:204
+#: editor_actions.cc:210
 msgid "Select All Overlapping Edit Range"
 msgstr "Seleziona tutti gli intervalli sovrapposti"
 
-#: editor_actions.cc:205
+#: editor_actions.cc:211
 msgid "Select All Inside Edit Range"
 msgstr "Seleziona tutto nell'intervallo"
 
-#: editor_actions.cc:207
+#: editor_actions.cc:213
 msgid "Select Edit Range"
 msgstr "Seleziona l'intervallo"
 
-#: editor_actions.cc:209
+#: editor_actions.cc:215
 msgid "Select All in Punch Range"
 msgstr "Seleziona tutto nll'intervallo di Punch"
 
-#: editor_actions.cc:210
+#: editor_actions.cc:216
 msgid "Select All in Loop Range"
 msgstr "Seleziona tutto nell'intervallo di ciclo"
 
-#: editor_actions.cc:212
+#: editor_actions.cc:218
 msgid "Select Next Track or Bus"
 msgstr "Seleziona la prossima traccia o bus"
 
-#: editor_actions.cc:213
+#: editor_actions.cc:219
 msgid "Select Previous Track or Bus"
 msgstr "Seleziona la traccia o il bus precedente"
 
-#: editor_actions.cc:215
+#: editor_actions.cc:221
 msgid "Toggle Record Enable"
 msgstr "Attiva/disattiva la registrazione"
 
-#: editor_actions.cc:217
+#: editor_actions.cc:223
 msgid "Toggle Solo"
 msgstr "Attiva/disattiva solo"
 
-#: editor_actions.cc:219
+#: editor_actions.cc:225
 msgid "Toggle Mute"
 msgstr "Attiva/disattiva muto"
 
-#: editor_actions.cc:221
+#: editor_actions.cc:227
 msgid "Toggle Solo Isolate"
 msgstr "Attiva/disattiva solo isolato"
 
-#: editor_actions.cc:226
+#: editor_actions.cc:232
 msgid "Save View %1"
 msgstr "Salva la vista %1"
 
-#: editor_actions.cc:232
+#: editor_actions.cc:238
 msgid "Go to View %1"
 msgstr "Vai alla vista %1"
 
-#: editor_actions.cc:238
+#: editor_actions.cc:244
 msgid "Locate to Mark %1"
 msgstr "Posizionati sul marcatore %1"
 
-#: editor_actions.cc:242 editor_actions.cc:243
+#: editor_actions.cc:249 editor_actions.cc:250
 msgid "Jump to Next Mark"
 msgstr "Vai al prossimo marcatore"
 
-#: editor_actions.cc:244 editor_actions.cc:245
+#: editor_actions.cc:251 editor_actions.cc:252
 msgid "Jump to Previous Mark"
 msgstr "Vai al marcatore precedente"
 
-#: editor_actions.cc:247 editor_actions.cc:248
+#: editor_actions.cc:254
+msgid "Set Session Start from Playhead"
+msgstr ""
+
+#: editor_actions.cc:255
+msgid "Set Session End from Playhead"
+msgstr ""
+
+#: editor_actions.cc:257 editor_actions.cc:258
 msgid "Add Mark from Playhead"
 msgstr "Aggiungi marcatore in corrispondenza della testina"
 
-#: editor_actions.cc:250 editor_actions.cc:251
+#: editor_actions.cc:260 editor_actions.cc:261
 msgid "Remove Mark at Playhead"
 msgstr "Rimuovi il marcatore in corrispondenza della testina"
 
-#: editor_actions.cc:253
+#: editor_actions.cc:263
 msgid "Nudge Next Later"
 msgstr ""
 
-#: editor_actions.cc:254
+#: editor_actions.cc:264
 msgid "Nudge Next Earlier"
 msgstr ""
 
-#: editor_actions.cc:256
+#: editor_actions.cc:266
 msgid "Nudge Playhead Forward"
 msgstr "Avanza la testina"
 
-#: editor_actions.cc:257
+#: editor_actions.cc:267
 msgid "Nudge Playhead Backward"
 msgstr "Indietreggia la testina"
 
-#: editor_actions.cc:258
-msgid "Playhead To Next Grid"
-msgstr "Testina alla prossima griglia"
+#: editor_actions.cc:268
+msgid "Playhead to Next Grid"
+msgstr ""
 
-#: editor_actions.cc:259
-msgid "Playhead To Previous Grid"
-msgstr "Testina alla griglia precedente"
+#: editor_actions.cc:269
+msgid "Playhead to Previous Grid"
+msgstr ""
 
-#: editor_actions.cc:264
+#: editor_actions.cc:274
 msgid "Zoom to Selection"
 msgstr "Zoomm sulla selezione"
 
-#: editor_actions.cc:265
+#: editor_actions.cc:275
 msgid "Toggle Zoom State"
 msgstr "Attiva/disattiva lo stato di zoom"
 
-#: editor_actions.cc:267
+#: editor_actions.cc:277
 msgid "Expand Track Height"
 msgstr "Aumenta l'ampiezza della traccia"
 
-#: editor_actions.cc:268
+#: editor_actions.cc:278
 msgid "Shrink Track Height"
 msgstr "Restringi l'altezza della traccia"
 
-#: editor_actions.cc:270
+#: editor_actions.cc:280
+msgid "Fit 1 Track"
+msgstr ""
+
+#: editor_actions.cc:281
+msgid "Fit 2 Tracks"
+msgstr ""
+
+#: editor_actions.cc:282
+msgid "Fit 4 Tracks"
+msgstr ""
+
+#: editor_actions.cc:283
+msgid "Fit 8 Tracks"
+msgstr ""
+
+#: editor_actions.cc:284
+msgid "Fit 16 Tracks"
+msgstr ""
+
+#: editor_actions.cc:285
+msgid "Fit 32 Tracks"
+msgstr ""
+
+#: editor_actions.cc:286
+msgid "Fit All Tracks"
+msgstr ""
+
+#: editor_actions.cc:293
+msgid "Zoom to 5 min"
+msgstr ""
+
+#: editor_actions.cc:296
 msgid "Move Selected Tracks Up"
 msgstr "Muovi in alto le tracce selezionate"
 
-#: editor_actions.cc:272
+#: editor_actions.cc:298
 msgid "Move Selected Tracks Down"
 msgstr "Muovi in basso le tracce selezionate"
 
-#: editor_actions.cc:275
+#: editor_actions.cc:301
 msgid "Scroll Tracks Up"
 msgstr "Scorri le tracce verso l'alto"
 
-#: editor_actions.cc:277
+#: editor_actions.cc:302
 msgid "Scroll Tracks Down"
 msgstr "Scorri le tracce verso il basso"
 
-#: editor_actions.cc:279
+#: editor_actions.cc:303
 msgid "Step Tracks Up"
 msgstr "Sposta le tracce verso l'alto"
 
-#: editor_actions.cc:281
+#: editor_actions.cc:304
 msgid "Step Tracks Down"
 msgstr "Sposta le tracce verso il basso"
 
-#: editor_actions.cc:284
+#: editor_actions.cc:306
 msgid "Scroll Backward"
 msgstr "Scorri all'indietro"
 
-#: editor_actions.cc:285
+#: editor_actions.cc:307
 msgid "Scroll Forward"
 msgstr "Scorri in avanti"
 
-#: editor_actions.cc:286
+#: editor_actions.cc:308
 msgid "Center Playhead"
 msgstr "Centra testina"
 
-#: editor_actions.cc:287
+#: editor_actions.cc:309
 msgid "Center Edit Point"
 msgstr "Centra il punto di modifica"
 
-#: editor_actions.cc:289
+#: editor_actions.cc:311
 msgid "Playhead Forward"
 msgstr "Testina in avanti"
 
-#: editor_actions.cc:290
+#: editor_actions.cc:312
 msgid "Playhead Backward"
 msgstr "Testina indietro"
 
-#: editor_actions.cc:292
+#: editor_actions.cc:314
 msgid "Playhead to Active Mark"
 msgstr "Testina sul marcatore attivo"
 
-#: editor_actions.cc:293
+#: editor_actions.cc:315
 msgid "Active Mark to Playhead"
 msgstr "Marcatore sulla testina"
 
-#: editor_actions.cc:295
+#: editor_actions.cc:317
 msgid "Use Skip Ranges"
 msgstr "Utilizza il salto degli intervalli"
 
-#: editor_actions.cc:302
+#: editor_actions.cc:324
 msgid "Play Selected Regions"
 msgstr "Esegui le regioni selezionate"
 
-#: editor_actions.cc:304
+#: editor_actions.cc:326
 msgid "Play from Edit Point and Return"
 msgstr "Riproduci dal punto di modifica e ritorna"
 
-#: editor_actions.cc:306
+#: editor_actions.cc:328
 msgid "Play Edit Range"
 msgstr "Suona l'intervallo"
 
-#: editor_actions.cc:308
+#: editor_actions.cc:330
 msgid "Playhead to Mouse"
 msgstr "Testina sul mouse"
 
-#: editor_actions.cc:309
+#: editor_actions.cc:331
 msgid "Active Marker to Mouse"
 msgstr "Marcatore attivo sul mouse"
 
-#: editor_actions.cc:319
+#: editor_actions.cc:341
 msgid "Undo Selection Change"
 msgstr "Annulla cambio di selezione"
 
-#: editor_actions.cc:320
+#: editor_actions.cc:342
 msgid "Redo Selection Change"
 msgstr "Ripeti cambio di selezione"
 
-#: editor_actions.cc:322
+#: editor_actions.cc:344
 msgid "Export Audio"
 msgstr "Esporta l'audio"
 
-#: editor_actions.cc:323 export_dialog.cc:396
+#: editor_actions.cc:345 export_dialog.cc:424
 msgid "Export Range"
 msgstr "Esporta l'intervallo"
 
-#: editor_actions.cc:328
+#: editor_actions.cc:350
 msgid "Separate Using Punch Range"
 msgstr "Separa usando l'intervallo di punch"
 
-#: editor_actions.cc:331
+#: editor_actions.cc:353
 msgid "Separate Using Loop Range"
 msgstr "Separa usando l'intervallo di ciclo"
 
-#: editor_actions.cc:334 editor_actions.cc:356
+#: editor_actions.cc:356 editor_actions.cc:379
 msgid "Crop"
 msgstr "Rifila"
 
-#: editor_actions.cc:344
+#: editor_actions.cc:366
 msgid "Fade Range Selection"
 msgstr "Dissolvi l'intervallo selezionato"
 
-#: editor_actions.cc:346
+#: editor_actions.cc:368
 msgid "Set Tempo from Edit Range = Bar"
 msgstr ""
 
-#: editor_actions.cc:348
+#: editor_actions.cc:371
 msgid "Log"
 msgstr "Messaggio"
 
-#: editor_actions.cc:351 editor_actions.cc:353
+#: editor_actions.cc:374 editor_actions.cc:376
 msgid "Move to Next Transient"
 msgstr "Spostati al prossimo transiente"
 
-#: editor_actions.cc:352 editor_actions.cc:354
+#: editor_actions.cc:375 editor_actions.cc:377
 msgid "Move to Previous Transient"
 msgstr "Spostati al transiente precedente"
 
-#: editor_actions.cc:358 editor_actions.cc:361
+#: editor_actions.cc:381
+msgid "Start Range from Playhead"
+msgstr ""
+
+#: editor_actions.cc:382
+msgid "Finish Range from Playhead"
+msgstr ""
+
+#: editor_actions.cc:384 editor_actions.cc:393
 msgid "Start Range"
 msgstr "Inizio intervallo"
 
-#: editor_actions.cc:359 editor_actions.cc:362
+#: editor_actions.cc:385 editor_actions.cc:394
 msgid "Finish Range"
 msgstr "Fine intervallo"
 
-#: editor_actions.cc:394
+#: editor_actions.cc:387
+msgid "Start Punch Range"
+msgstr ""
+
+#: editor_actions.cc:388
+msgid "Finish Punch Range"
+msgstr ""
+
+#: editor_actions.cc:390
+msgid "Start Loop Range"
+msgstr ""
+
+#: editor_actions.cc:391
+msgid "Finish Loop Range"
+msgstr ""
+
+#: editor_actions.cc:426
 msgid "Follow Playhead"
 msgstr "Segui la testina"
 
-#: editor_actions.cc:395
+#: editor_actions.cc:427
 msgid "Remove Last Capture"
 msgstr "Rimuovi l'ultima registrazione"
 
-#: editor_actions.cc:397
+#: editor_actions.cc:429
 msgid "Stationary Playhead"
 msgstr "Testina stazionaria"
 
-#: editor_actions.cc:399 insert_time_dialog.cc:32
+#: editor_actions.cc:431 insert_remove_time_dialog.cc:32
 msgid "Insert Time"
 msgstr "Inserisci tempo"
 
-#: editor_actions.cc:402
+#: editor_actions.cc:433 insert_remove_time_dialog.cc:32
+msgid "Remove Time"
+msgstr ""
+
+#: editor_actions.cc:438
 msgid "Toggle Active"
 msgstr "Attiva/disattiva"
 
-#: editor_actions.cc:407 editor_actions.cc:1768 editor_markers.cc:921
-#: editor_markers.cc:986 editor_snapshots.cc:122 mixer_strip.cc:1543
-#: route_time_axis.cc:856
+#: editor_actions.cc:440 editor_actions.cc:1785 editor_markers.cc:926
+#: editor_markers.cc:999 editor_markers.cc:1019 editor_snapshots.cc:134
+#: lua_script_manager.cc:32 lua_script_manager.cc:36 mixer_strip.cc:1705
+#: route_time_axis.cc:870 vca_master_strip.cc:400
 msgid "Remove"
 msgstr "Rimuovi"
 
-#: editor_actions.cc:411
+#: editor_actions.cc:445
 msgid "Fit Selection (Vertical)"
 msgstr "Adatta selezione (verticale)"
 
-#: editor_actions.cc:413 time_axis_view.cc:1371
+#: editor_actions.cc:447 time_axis_view.cc:1287
 msgid "Largest"
 msgstr "Ampissimo"
 
-#: editor_actions.cc:416 time_axis_view.cc:1372
+#: editor_actions.cc:450 time_axis_view.cc:1288
 msgid "Larger"
 msgstr "Ampio"
 
-#: editor_actions.cc:419 editor_rulers.cc:249 time_axis_view.cc:1373
+#: editor_actions.cc:453 editor_rulers.cc:248 time_axis_view.cc:1289
 msgid "Large"
 msgstr "Più ampio"
 
-#: editor_actions.cc:425 editor_rulers.cc:253 time_axis_view.cc:1375
+#: editor_actions.cc:459 editor_rulers.cc:252 time_axis_view.cc:1291
 msgid "Small"
 msgstr "Piccolo"
 
-#: editor_actions.cc:429
+#: editor_actions.cc:463
 msgid "Sound Selected MIDI Notes"
 msgstr "Suona le note MIDI selezionate"
 
-#: editor_actions.cc:434
+#: editor_actions.cc:468
 msgid "Zoom Focus Left"
 msgstr "Zoom a sinistra"
 
-#: editor_actions.cc:435
+#: editor_actions.cc:469
 msgid "Zoom Focus Right"
 msgstr "Zoom a destra"
 
-#: editor_actions.cc:436
+#: editor_actions.cc:470
 msgid "Zoom Focus Center"
 msgstr "Zoom centrato"
 
-#: editor_actions.cc:437
+#: editor_actions.cc:471
 msgid "Zoom Focus Playhead"
 msgstr "Zoom sulla testina"
 
-#: editor_actions.cc:438
+#: editor_actions.cc:472
 msgid "Zoom Focus Mouse"
 msgstr "Zoom sul mouse"
 
-#: editor_actions.cc:439
+#: editor_actions.cc:473
 msgid "Zoom Focus Edit Point"
 msgstr "Zoom sul punto di modifica"
 
-#: editor_actions.cc:441
+#: editor_actions.cc:475
 msgid "Next Zoom Focus"
 msgstr ""
 
-#: editor_actions.cc:447
+#: editor_actions.cc:488
 msgid "Smart Object Mode"
 msgstr "Modalità oggetto intelligente"
 
-#: editor_actions.cc:450
+#: editor_actions.cc:491
 msgid "Smart"
 msgstr "Intelligente"
 
-#: editor_actions.cc:453
+#: editor_actions.cc:494
 msgid "Object Tool"
 msgstr "Strumento oggetto"
 
-#: editor_actions.cc:458
+#: editor_actions.cc:499
 msgid "Range Tool"
 msgstr "Strumento intervallo"
 
-#: editor_actions.cc:463
+#: editor_actions.cc:504
 msgid "Note Drawing Tool"
 msgstr "Strumento per disegnare le note"
 
-#: editor_actions.cc:468
+#: editor_actions.cc:509
 msgid "Audition Tool"
 msgstr "Strumento ascolto"
 
-#: editor_actions.cc:473
+#: editor_actions.cc:514
 msgid "Time FX Tool"
 msgstr ""
 
-#: editor_actions.cc:478
+#: editor_actions.cc:519
 msgid "Content Tool"
 msgstr "Strumento contenuto"
 
-#: editor_actions.cc:484
+#: editor_actions.cc:525
 msgid "Cut Tool"
 msgstr "Strumento taglio"
 
-#: editor_actions.cc:490
+#: editor_actions.cc:531
 msgid "Step Mouse Mode"
 msgstr ""
 
-#: editor_actions.cc:497
+#: editor_actions.cc:538
 msgid "Change Edit Point"
 msgstr "Cambia il punto di modifica"
 
-#: editor_actions.cc:498
+#: editor_actions.cc:539
 msgid "Change Edit Point Including Marker"
 msgstr ""
 
-#: editor_actions.cc:504
+#: editor_actions.cc:544
+msgid "EditMode|Lock"
+msgstr ""
+
+#: editor_actions.cc:545
 msgid "Cycle Edit Mode"
 msgstr "Modalità modifica del ciclo"
 
-#: editor_actions.cc:506
+#: editor_actions.cc:547
 msgid "Snap to"
 msgstr "Allinea a"
 
-#: editor_actions.cc:507
+#: editor_actions.cc:548
 msgid "Snap Mode"
 msgstr "Modalita' di Allineamento"
 
-#: editor_actions.cc:514
+#: editor_actions.cc:555
 msgid "Next Snap Mode"
 msgstr ""
 
-#: editor_actions.cc:515
+#: editor_actions.cc:556
 msgid "Next Snap Choice"
 msgstr ""
 
-#: editor_actions.cc:516
+#: editor_actions.cc:557
 msgid "Next Musical Snap Choice"
 msgstr ""
 
-#: editor_actions.cc:517
+#: editor_actions.cc:558
 msgid "Previous Snap Choice"
 msgstr ""
 
-#: editor_actions.cc:518
+#: editor_actions.cc:559
 msgid "Previous Musical Snap Choice"
 msgstr ""
 
-#: editor_actions.cc:523
+#: editor_actions.cc:564
 msgid "Snap to CD Frame"
 msgstr ""
 
-#: editor_actions.cc:524
+#: editor_actions.cc:565
 msgid "Snap to Timecode Frame"
 msgstr ""
 
-#: editor_actions.cc:525
+#: editor_actions.cc:566
 msgid "Snap to Timecode Seconds"
 msgstr ""
 
-#: editor_actions.cc:526
+#: editor_actions.cc:567
 msgid "Snap to Timecode Minutes"
 msgstr ""
 
-#: editor_actions.cc:527
+#: editor_actions.cc:568
 msgid "Snap to Seconds"
 msgstr "Allinea ai secondi"
 
-#: editor_actions.cc:528
+#: editor_actions.cc:569
 msgid "Snap to Minutes"
 msgstr "Allinea ai minuti"
 
-#: editor_actions.cc:530
+#: editor_actions.cc:571
 msgid "Snap to One Twenty Eighths"
 msgstr "Allinea a 1/128"
 
-#: editor_actions.cc:531
+#: editor_actions.cc:572
 msgid "Snap to Sixty Fourths"
 msgstr "Allinea a 1/64"
 
-#: editor_actions.cc:532
+#: editor_actions.cc:573
 msgid "Snap to Thirty Seconds"
 msgstr "Allinea ai trentesimi di secondo"
 
-#: editor_actions.cc:533
+#: editor_actions.cc:574
 msgid "Snap to Twenty Eighths"
 msgstr "Allinea a un 1/28"
 
-#: editor_actions.cc:534
+#: editor_actions.cc:575
 msgid "Snap to Twenty Fourths"
 msgstr "Allinea a un 1/24"
 
-#: editor_actions.cc:535
+#: editor_actions.cc:576
 msgid "Snap to Twentieths"
 msgstr "Allinea a un 1/20"
 
-#: editor_actions.cc:536
+#: editor_actions.cc:577
 msgid "Snap to Sixteenths"
 msgstr "Allinea a un 1/16"
 
-#: editor_actions.cc:537
+#: editor_actions.cc:578
 msgid "Snap to Fourteenths"
 msgstr "Allinea a un 1/14"
 
-#: editor_actions.cc:538
+#: editor_actions.cc:579
 msgid "Snap to Twelfths"
 msgstr "Allinea a un 1/12"
 
-#: editor_actions.cc:539
+#: editor_actions.cc:580
 msgid "Snap to Tenths"
 msgstr "Allinea a 1/10"
 
-#: editor_actions.cc:540
+#: editor_actions.cc:581
 msgid "Snap to Eighths"
 msgstr "Allinea a 1/8"
 
-#: editor_actions.cc:541
+#: editor_actions.cc:582
 msgid "Snap to Sevenths"
 msgstr "Allinea a 1/7"
 
-#: editor_actions.cc:542
+#: editor_actions.cc:583
 msgid "Snap to Sixths"
 msgstr "Allinea a 1/6"
 
-#: editor_actions.cc:543
+#: editor_actions.cc:584
 msgid "Snap to Fifths"
 msgstr "Allinea a 1/5"
 
-#: editor_actions.cc:544
+#: editor_actions.cc:585
 msgid "Snap to Quarters"
 msgstr "Allinea a 1/4"
 
-#: editor_actions.cc:545
+#: editor_actions.cc:586
 msgid "Snap to Thirds"
 msgstr "Allinea a 1/3"
 
-#: editor_actions.cc:546
+#: editor_actions.cc:587
 msgid "Snap to Halves"
 msgstr "Allinea a 1/2"
 
-#: editor_actions.cc:548
+#: editor_actions.cc:589
 msgid "Snap to Beat"
 msgstr "Allinea al battito"
 
-#: editor_actions.cc:549
+#: editor_actions.cc:590
 msgid "Snap to Bar"
 msgstr "Allinea alla battuta"
 
-#: editor_actions.cc:550
+#: editor_actions.cc:591
 msgid "Snap to Mark"
 msgstr "Allinea al marcatore"
 
-#: editor_actions.cc:551
+#: editor_actions.cc:592
 msgid "Snap to Region Start"
 msgstr "Allinea all'inizio regione"
 
-#: editor_actions.cc:552
+#: editor_actions.cc:593
 msgid "Snap to Region End"
 msgstr "Allinea a fine regione"
 
-#: editor_actions.cc:553
+#: editor_actions.cc:594
 msgid "Snap to Region Sync"
 msgstr ""
 
-#: editor_actions.cc:554
+#: editor_actions.cc:595
 msgid "Snap to Region Boundary"
 msgstr "Allinea al limite della regione"
 
-#: editor_actions.cc:556
+#: editor_actions.cc:597
 msgid "Show Marker Lines"
 msgstr "Mostra le linee dei marcatori"
 
-#: editor_actions.cc:566
+#: editor_actions.cc:607
 msgid "Loop/Punch"
 msgstr "Ciclo/Punch"
 
-#: editor_actions.cc:570
+#: editor_actions.cc:611
 msgid "Min:Sec"
 msgstr "Min:Sec"
 
-#: editor_actions.cc:572 editor_actions.cc:575 editor_rulers.cc:271
+#: editor_actions.cc:613 editor_actions.cc:616 editor_rulers.cc:270
+#: rc_option_editor.cc:1592
 msgid "Video Monitor"
 msgstr "Monitor video"
 
-#: editor_actions.cc:574 rc_option_editor.cc:2260
+#: editor_actions.cc:615 rc_option_editor.cc:2844
 msgid "Video"
 msgstr "Video"
 
-#: editor_actions.cc:577
+#: editor_actions.cc:618
 msgid "Always on Top"
 msgstr "Sempre in primo piano"
 
-#: editor_actions.cc:579
+#: editor_actions.cc:620
 msgid "Frame number"
 msgstr "Numero del frame"
 
-#: editor_actions.cc:580
+#: editor_actions.cc:621
 msgid "Timecode Background"
 msgstr ""
 
-#: editor_actions.cc:581
+#: editor_actions.cc:622
 msgid "Fullscreen"
 msgstr "Schermo intero"
 
-#: editor_actions.cc:582
+#: editor_actions.cc:623
 msgid "Letterbox"
 msgstr ""
 
-#: editor_actions.cc:583
+#: editor_actions.cc:624
 msgid "Original Size"
 msgstr "Dimensioni originali"
 
-#: editor_actions.cc:640
+#: editor_actions.cc:681
 msgid "Sort"
 msgstr "Ordina"
 
-#: editor_actions.cc:651 editor_routes.cc:476 mixer_ui.cc:1196
+#: editor_actions.cc:692 editor_routes.cc:549 mixer_ui.cc:1497
 msgid "Show All"
 msgstr "Mostra Tutto"
 
-#: editor_actions.cc:652
+#: editor_actions.cc:693
 msgid "Show Automatic Regions"
 msgstr ""
 
-#: editor_actions.cc:654
+#: editor_actions.cc:695
 msgid "Ascending"
 msgstr "Ascendente"
 
-#: editor_actions.cc:656
+#: editor_actions.cc:697
 msgid "Descending"
 msgstr "Discendente"
 
-#: editor_actions.cc:659
+#: editor_actions.cc:700
 msgid "By Region Name"
 msgstr "Per Nome di Regione"
 
-#: editor_actions.cc:661
+#: editor_actions.cc:702
 msgid "By Region Length"
 msgstr "Per durata della Regione"
 
-#: editor_actions.cc:663
+#: editor_actions.cc:704
 msgid "By Region Position"
 msgstr "Per Posizione della Regione"
 
-#: editor_actions.cc:665
+#: editor_actions.cc:706
 msgid "By Region Timestamp"
 msgstr "Per Data di Regione"
 
-#: editor_actions.cc:667
+#: editor_actions.cc:708
 msgid "By Region Start in File"
 msgstr "Per inizio regione nel file"
 
-#: editor_actions.cc:669
+#: editor_actions.cc:710
 msgid "By Region End in File"
 msgstr "Per Fine di Regione nel file"
 
-#: editor_actions.cc:671
+#: editor_actions.cc:712
 msgid "By Source File Name"
 msgstr "Per Nome di sorgente del file"
 
-#: editor_actions.cc:673
+#: editor_actions.cc:714
 msgid "By Source File Length"
 msgstr "Per durata del file sorgente"
 
-#: editor_actions.cc:675
+#: editor_actions.cc:716
 msgid "By Source File Creation Date"
 msgstr "Per Data di creazione di sorgente del file"
 
-#: editor_actions.cc:677
+#: editor_actions.cc:718
 msgid "By Source Filesystem"
 msgstr "Per Filesystem di sorgente"
 
-#: editor_actions.cc:680
+#: editor_actions.cc:721
 msgid "Remove Unused"
 msgstr "Rimuovi inutilizzati"
 
-#: editor_actions.cc:684 editor_audio_import.cc:282
-#: session_import_dialog.cc:75 session_import_dialog.cc:95
-#: session_metadata_dialog.cc:418 editor_videotimeline.cc:91
+#: editor_actions.cc:723
+msgid "Import PT session"
+msgstr ""
+
+#: editor_actions.cc:728 editor_audio_import.cc:282 editor_pt_import.cc:149
+#: luawindow.cc:99 session_import_dialog.cc:75 session_import_dialog.cc:95
+#: session_metadata_dialog.cc:421 sfdb_ui.cc:558 editor_videotimeline.cc:91
 msgid "Import"
 msgstr "Importa"
 
-#: editor_actions.cc:687
+#: editor_actions.cc:731
 msgid "Import to Region List..."
 msgstr "Importa nella lista delle regioni..."
 
-#: editor_actions.cc:690 session_import_dialog.cc:44
-msgid "Import From Session"
+#: editor_actions.cc:734 session_import_dialog.cc:44
+#: session_import_dialog.cc:65
+msgid "Import from Session"
 msgstr "Importa da una sessione"
 
-#: editor_actions.cc:694
+#: editor_actions.cc:738
 msgid "Bring all media into session folder"
 msgstr "Sposta tutte le sorgenti nella cartella della sessione"
 
-#: editor_actions.cc:697
+#: editor_actions.cc:741
 msgid "Show Summary"
 msgstr "Mostra un riepilogo"
 
-#: editor_actions.cc:699
+#: editor_actions.cc:743
 msgid "Show Group Tabs"
 msgstr "Mostra i gruppi"
 
-#: editor_actions.cc:701
+#: editor_actions.cc:745
 msgid "Show Measure Lines"
 msgstr "Mostra le linee della misura"
 
-#: editor_actions.cc:705
-msgid "Show Logo"
-msgstr "Mostra il logo"
-
-#: editor_actions.cc:709
+#: editor_actions.cc:747
 msgid "Toggle MIDI Input Active for Editor-Selected Tracks/Busses"
 msgstr ""
 "Attiva/disattiva l'input MIDI per le tracce/bus selezionate nell'editor"
 
-#: editor_actions.cc:732
-msgid "Loaded editor bindings from %1"
-msgstr ""
-
-#: editor_actions.cc:734
-msgid "Could not find editor.bindings in search path %1"
-msgstr ""
-
-#: editor_actions.cc:1078 editor_actions.cc:1474 editor_actions.cc:1485
-#: editor_actions.cc:1538 editor_actions.cc:1549 editor_actions.cc:1596
-#: editor_actions.cc:1606 editor_regions.cc:1563
+#: editor_actions.cc:1081 editor_actions.cc:1477 editor_actions.cc:1488
+#: editor_actions.cc:1541 editor_actions.cc:1552 editor_actions.cc:1599
+#: editor_actions.cc:1609 editor_regions.cc:1657 luainstance.cc:327
+#: luainstance.cc:1690
 msgid "programming error: %1: %2"
 msgstr "Errore di programmazione: %1: %2"
 
-#: editor_actions.cc:1774
+#: editor_actions.cc:1791
 msgid "Raise"
 msgstr "Alza"
 
-#: editor_actions.cc:1777
+#: editor_actions.cc:1794
 msgid "Raise to Top"
 msgstr "Porta in cima"
 
-#: editor_actions.cc:1780
+#: editor_actions.cc:1797
 msgid "Lower"
 msgstr "Abbassa"
 
-#: editor_actions.cc:1783
+#: editor_actions.cc:1800
 msgid "Lower to Bottom"
 msgstr "Porta in fondo"
 
-#: editor_actions.cc:1786
+#: editor_actions.cc:1803
 msgid "Move to Original Position"
 msgstr "Spostati alla posizione iniziale"
 
-#: editor_actions.cc:1791
+#: editor_actions.cc:1808
 msgid "Lock to Video"
 msgstr "Aggancia al video"
 
-#: editor_actions.cc:1796 editor_markers.cc:912
+#: editor_actions.cc:1813 editor_markers.cc:917
 msgid "Glue to Bars and Beats"
 msgstr "Aggancia a battute e battiti"
 
-#: editor_actions.cc:1801
+#: editor_actions.cc:1818
 msgid "Remove Sync"
 msgstr "Rimuove la sincronia"
 
-#: editor_actions.cc:1804 mixer_strip.cc:2006 monitor_section.cc:272
-#: route_time_axis.cc:253 route_time_axis.cc:526
+#: editor_actions.cc:1821 mixer_strip.cc:2192 monitor_section.cc:253
+#: monitor_section.cc:321 route_time_axis.cc:264 route_time_axis.cc:550
 msgid "Mute"
 msgstr "Muto"
 
-#: editor_actions.cc:1807
+#: editor_actions.cc:1824
 msgid "Normalize..."
 msgstr "Normalizza..."
 
-#: editor_actions.cc:1810
+#: editor_actions.cc:1827
 msgid "Reverse"
 msgstr "Inverti"
 
-#: editor_actions.cc:1813
+#: editor_actions.cc:1830
 msgid "Make Mono Regions"
 msgstr "Rendi le regioni mono"
 
-#: editor_actions.cc:1816
+#: editor_actions.cc:1833
 msgid "Boost Gain"
 msgstr "Aumenta guadagno"
 
-#: editor_actions.cc:1819
+#: editor_actions.cc:1836
 msgid "Cut Gain"
 msgstr "Riduci guadagno"
 
-#: editor_actions.cc:1822
+#: editor_actions.cc:1839
 msgid "Pitch Shift..."
 msgstr "Cambia tono..."
 
-#: editor_actions.cc:1825
-msgid "Transpose..."
-msgstr "Trasponi..."
-
-#: editor_actions.cc:1828
+#: editor_actions.cc:1845
 msgid "Opaque"
 msgstr "Opaco"
 
-#: editor_actions.cc:1832 editor_regions.cc:117
+#: editor_actions.cc:1849 editor_regions.cc:164
 msgid "Fade In"
 msgstr "Dissolvenza in entrata"
 
-#: editor_actions.cc:1837 editor_regions.cc:118
+#: editor_actions.cc:1854 editor_regions.cc:165
 msgid "Fade Out"
 msgstr "Dissolvenza in uscita"
 
-#: editor_actions.cc:1852
+#: editor_actions.cc:1869
 msgid "Multi-Duplicate..."
 msgstr "Multi-Duplica"
 
-#: editor_actions.cc:1857
+#: editor_actions.cc:1874
 msgid "Fill Track"
 msgstr "Riempi Traccia"
 
-#: editor_actions.cc:1861 editor_markers.cc:1000
+#: editor_actions.cc:1878 editor_markers.cc:1033
 msgid "Set Loop Range"
 msgstr "Imposta l'intervallo di loop"
 
-#: editor_actions.cc:1868
+#: editor_actions.cc:1885
 msgid "Set Punch"
 msgstr "Imposta Punch"
 
-#: editor_actions.cc:1872
+#: editor_actions.cc:1889
 msgid "Add Single Range Marker"
 msgstr "Aggiungi un marcatore singolo"
 
-#: editor_actions.cc:1877
+#: editor_actions.cc:1894
 msgid "Add Range Marker Per Region"
 msgstr "Aggiungi un marcatore di intervallo per la regione"
 
-#: editor_actions.cc:1881
-msgid "Snap Position To Grid"
-msgstr "Allinea la posizione alla griglia"
+#: editor_actions.cc:1898
+msgid "Snap Position to Grid"
+msgstr ""
 
-#: editor_actions.cc:1884
+#: editor_actions.cc:1901
 msgid "Close Gaps"
 msgstr "Chiudi gli spazi"
 
-#: editor_actions.cc:1887
+#: editor_actions.cc:1904
 msgid "Rhythm Ferret..."
 msgstr "Analisi ritmica..."
 
-#: editor_actions.cc:1890
+#: editor_actions.cc:1907
 msgid "Export..."
 msgstr "Esporta..."
 
-#: editor_actions.cc:1896
+#: editor_actions.cc:1913
 msgid "Separate Under"
 msgstr "Separa sotto"
 
-#: editor_actions.cc:1900 editor_actions.cc:1901
+#: editor_actions.cc:1917 editor_actions.cc:1918
 msgid "Set Fade In Length"
 msgstr "Imposta la durata della dissolvenza in entrata"
 
-#: editor_actions.cc:1902 editor_actions.cc:1903
+#: editor_actions.cc:1919 editor_actions.cc:1920
 msgid "Set Fade Out Length"
 msgstr "Durata della dissolvenza in uscita"
 
-#: editor_actions.cc:1905
+#: editor_actions.cc:1922
 msgid "Set Tempo from Region = Bar"
 msgstr "Imposta il tempo dalla regione = Battuta"
 
-#: editor_actions.cc:1910
+#: editor_actions.cc:1927
 msgid "Split at Percussion Onsets"
 msgstr "Dividi in corrispondenza della percussione"
 
-#: editor_actions.cc:1915
+#: editor_actions.cc:1932
 msgid "List Editor..."
 msgstr "Modifica il catalogo..."
 
-#: editor_actions.cc:1918
+#: editor_actions.cc:1935
 msgid "Properties..."
 msgstr "Proprietà..."
 
-#: editor_actions.cc:1922
+#: editor_actions.cc:1939
 msgid "Bounce (with processing)"
 msgstr "Fissa (elaborando)"
 
-#: editor_actions.cc:1923
+#: editor_actions.cc:1940
 msgid "Bounce (without processing)"
 msgstr "Fissa (senza elaborare)"
 
-#: editor_actions.cc:1924
+#: editor_actions.cc:1941
 msgid "Combine"
 msgstr "Unisci"
 
-#: editor_actions.cc:1925
+#: editor_actions.cc:1942
 msgid "Uncombine"
 msgstr "Separa"
 
-#: editor_actions.cc:1927
+#: editor_actions.cc:1944
+msgid "Loudness Analysis..."
+msgstr ""
+
+#: editor_actions.cc:1945
 msgid "Spectral Analysis..."
 msgstr "Analisi spettrale"
 
-#: editor_actions.cc:1929
+#: editor_actions.cc:1947
 msgid "Reset Envelope"
 msgstr "Azzera inviluppo"
 
-#: editor_actions.cc:1931
+#: editor_actions.cc:1949
 msgid "Reset Gain"
 msgstr "Azzera guadagno"
 
-#: editor_actions.cc:1936
+#: editor_actions.cc:1954
 msgid "Envelope Active"
 msgstr "Inviluppo attivo/passiv"
 
-#: editor_actions.cc:1944 editor_actions.cc:1945
+#: editor_actions.cc:1962 editor_actions.cc:1963
 msgid "Insert Patch Change..."
 msgstr "Inserisci cambio di patch"
 
-#: editor_actions.cc:1946
+#: editor_actions.cc:1964
 msgid "Unlink from other copies"
 msgstr "Sgancia dalle altre copie"
 
-#: editor_actions.cc:1947
+#: editor_actions.cc:1965
 msgid "Strip Silence..."
 msgstr "Rimuovi silenzio"
 
-#: editor_actions.cc:1948
+#: editor_actions.cc:1966
 msgid "Set Range Selection"
 msgstr "Imposta intervallo di selezione"
 
-#: editor_actions.cc:1950 editor_actions.cc:1951
+#: editor_actions.cc:1968 editor_actions.cc:1969
 msgid "Nudge Later"
 msgstr ""
 
-#: editor_actions.cc:1952 editor_actions.cc:1953
+#: editor_actions.cc:1970 editor_actions.cc:1971
 msgid "Nudge Earlier"
 msgstr ""
 
-#: editor_actions.cc:1955
+#: editor_actions.cc:1973
 msgid "Sequence Regions"
 msgstr ""
 
-#: editor_actions.cc:1960
+#: editor_actions.cc:1978
 msgid "Nudge Later by Capture Offset"
 msgstr ""
 
-#: editor_actions.cc:1967
+#: editor_actions.cc:1985
 msgid "Nudge Earlier by Capture Offset"
 msgstr ""
 
-#: editor_actions.cc:1971
+#: editor_actions.cc:1989
 msgid "Trim to Loop"
 msgstr "Ritaglia in base al ciclo"
 
-#: editor_actions.cc:1972
+#: editor_actions.cc:1990
 msgid "Trim to Punch"
 msgstr "Ritaglia in base al punch"
 
-#: editor_actions.cc:1974
+#: editor_actions.cc:1992
 msgid "Trim to Previous"
 msgstr "Ritaglia al precedente"
 
-#: editor_actions.cc:1975
+#: editor_actions.cc:1993
 msgid "Trim to Next"
 msgstr "Ritaglia al successivo"
 
-#: editor_actions.cc:1982
-msgid "Insert Region From Region List"
-msgstr "Inserisci regione dal catalogo delle regioni"
+#: editor_actions.cc:2000
+msgid "Insert Region from Region List"
+msgstr ""
 
-#: editor_actions.cc:1988
+#: editor_actions.cc:2006
 msgid "Set Sync Position"
 msgstr "Imposta la posizione di sincronizzazione"
 
-#: editor_actions.cc:1989
+#: editor_actions.cc:2007
 msgid "Place Transient"
 msgstr ""
 
-#: editor_actions.cc:1990
+#: editor_actions.cc:2008
 msgid "Split/Separate"
 msgstr "Dividi/separa"
 
-#: editor_actions.cc:1991
+#: editor_actions.cc:2009
 msgid "Trim Start at Edit Point"
 msgstr ""
 
-#: editor_actions.cc:1992
+#: editor_actions.cc:2010
 msgid "Trim End at Edit Point"
 msgstr ""
 
-#: editor_actions.cc:1997
+#: editor_actions.cc:2015
 msgid "Align Start"
 msgstr "Allinea inizio"
 
-#: editor_actions.cc:2004
+#: editor_actions.cc:2022
 msgid "Align Start Relative"
 msgstr ""
 
-#: editor_actions.cc:2008
+#: editor_actions.cc:2026
 msgid "Align End"
 msgstr "Allinea fine"
 
-#: editor_actions.cc:2013
+#: editor_actions.cc:2031
 msgid "Align End Relative"
 msgstr ""
 
-#: editor_actions.cc:2020
+#: editor_actions.cc:2038
 msgid "Align Sync"
 msgstr ""
 
-#: editor_actions.cc:2027
+#: editor_actions.cc:2045
 msgid "Align Sync Relative"
 msgstr ""
 
-#: editor_actions.cc:2031 editor_actions.cc:2034
+#: editor_actions.cc:2049 editor_actions.cc:2050
 msgid "Choose Top..."
 msgstr "Scegli la prima..."
 
@@ -4620,32 +5156,33 @@ msgstr ""
 "La sessione contiene già un file chiamato %1. Vuoi importare %2 come nuova "
 "sorgente o passare oltre?"
 
-#: editor_audio_import.cc:282 editor_videotimeline.cc:91
+#: editor_audio_import.cc:282 editor_pt_import.cc:149
+#: editor_videotimeline.cc:91
 msgid "Cancel Import"
 msgstr "Annullare l'importazione"
 
-#: editor_audio_import.cc:559
+#: editor_audio_import.cc:565
 msgid "Editor: cannot open file \"%1\", (%2)"
 msgstr "Editor: non posso aprire il file \"%1\", (%2)"
 
-#: editor_audio_import.cc:567
+#: editor_audio_import.cc:573
 msgid "Cancel entire import"
 msgstr "Annulla tutta l'importazione"
 
-#: editor_audio_import.cc:568
+#: editor_audio_import.cc:574
 msgid "Don't embed it"
 msgstr "Non inludere"
 
-#: editor_audio_import.cc:569
+#: editor_audio_import.cc:575
 msgid "Embed all without questions"
 msgstr "Includi tutto senza domande"
 
-#: editor_audio_import.cc:572 editor_audio_import.cc:598
-#: export_format_dialog.cc:60
+#: editor_audio_import.cc:578 editor_audio_import.cc:604
+#: export_format_dialog.cc:68
 msgid "Sample rate"
 msgstr "Frequenza di campionamento"
 
-#: editor_audio_import.cc:573 editor_audio_import.cc:599
+#: editor_audio_import.cc:579 editor_audio_import.cc:605
 msgid ""
 "%1\n"
 "This audiofile's sample rate doesn't match the session sample rate!"
@@ -4653,208 +5190,277 @@ msgstr ""
 "%1\n"
 "Il sample rate del file audio non corrisponde a quello della sessione!"
 
-#: editor_audio_import.cc:595
+#: editor_audio_import.cc:601
 msgid "Embed it anyway"
 msgstr "Includi comunque"
 
-#: editor_canvas_events.cc:1306 editor_drag.cc:1381
+#: editor_pt_import.cc:81
+msgid "You can't import a PT session until you have a session loaded."
+msgstr ""
+
+#: editor_pt_import.cc:86
+msgid "Import PT Session"
+msgstr ""
+
+#: editor_pt_import.cc:97
+msgid "%1: this is only the directory/folder name, not the filename.\n"
+msgstr ""
+
+#: editor_pt_import.cc:132
+msgid "Doesn't seem to be a valid PT session file"
+msgstr ""
+
+#: editor_pt_import.cc:136
+msgid ""
+"PT v%1 Session @ %2Hz\n"
+"\n"
+"%3 audio files\n"
+"%4 regions\n"
+"%5 active regions\n"
+"\n"
+"Continue..."
+msgstr ""
+
+#: editor_pt_import.cc:175
+msgid ""
+"Failed to load one or more of the audio files, but continuing to attempt "
+"import."
+msgstr ""
+
+#: editor_pt_import.cc:178
+msgid "Success! Import should complete soon."
+msgstr ""
+
+#: editor_pt_import.cc:263
+msgid "PTImport: UINT_MAX routes? impossible!"
+msgstr ""
+
+#: editor_canvas_events.cc:1296 editor_drag.cc:1418
 msgid "Could not create new track after region placed in the drop zone"
 msgstr ""
 
-#: editor_drag.cc:1266
+#: editor_drag.cc:1306
 msgid "fixed time region drag"
 msgstr ""
 
-#: editor_drag.cc:2214
+#: editor_drag.cc:2249
 msgid "Ripple drag"
 msgstr ""
 
-#: editor_drag.cc:2365 midi_region_view.cc:2813
+#: editor_drag.cc:2311
+msgid "create region"
+msgstr ""
+
+#: editor_drag.cc:2430 midi_region_view.cc:2859
 msgid "resize notes"
 msgstr "ridimensiona note"
 
-#: editor_drag.cc:2517
+#: editor_drag.cc:2613 editor_drag.cc:2648
+msgid ""
+"One or more Audio Regions\n"
+"are both Locked and\n"
+"Locked to Video.\n"
+"The video cannot me moved."
+msgstr ""
+
+#: editor_drag.cc:2683
 msgid "Video Start:"
 msgstr "Inizio video:"
 
-#: editor_drag.cc:2519
+#: editor_drag.cc:2685
 msgid "Diff:"
 msgstr "Diff:"
 
-#: editor_drag.cc:2538
+#: editor_drag.cc:2707
 msgid "Move Video"
 msgstr "Sposta video"
 
-#: editor_drag.cc:3046
+#: editor_drag.cc:3177
+msgid "move meter mark"
+msgstr "Muovi il meter mark"
+
+#: editor_drag.cc:3179
 msgid "copy meter mark"
 msgstr "Copia il meter mark"
 
-#: editor_drag.cc:3054
-msgid "move meter mark"
-msgstr "Muovi il meter mark"
+#: editor_drag.cc:3279
+msgid "inactive"
+msgstr ""
 
-#: editor_drag.cc:3177
+#: editor_drag.cc:3324
+msgid "move tempo mark"
+msgstr "Muovi il marcatore di tempo"
+
+#: editor_drag.cc:3331
 msgid "copy tempo mark"
 msgstr "Copia il marcatore di tempo"
 
-#: editor_drag.cc:3185
-msgid "move tempo mark"
-msgstr "Muovi il marcatore di tempo"
+#: editor_drag.cc:3462
+msgid "dilate tempo"
+msgstr ""
 
-#: editor_drag.cc:3412
+#: editor_drag.cc:3736
 msgid "change fade in length"
 msgstr "cambia la durata della dissolvenza in entrata"
 
-#: editor_drag.cc:3526
+#: editor_drag.cc:3861
 msgid "change fade out length"
 msgstr "cambia la durata della dissolvenza in uscita"
 
-#: editor_drag.cc:3880
+#: editor_drag.cc:4239
 msgid "move marker"
 msgstr "Muovi marcatore"
 
-#: editor_drag.cc:4490
+#: editor_drag.cc:4506 editor_drag.cc:5833
+msgid "automation range move"
+msgstr "sposta intervallo automazione"
+
+#: editor_drag.cc:4890
 msgid "An error occurred while executing time stretch operation"
 msgstr "C'è stato un errore durante l'esecuzione di 'time stretch'"
 
-#: editor_drag.cc:4947
+#: editor_drag.cc:5351
 msgid "programming_error: %1"
 msgstr "errore_di_programmazione: %1"
 
-#: editor_drag.cc:5016 editor_drag.cc:5026
+#: editor_drag.cc:5420 editor_drag.cc:5430
 msgid "new skip marker"
 msgstr "nuovo marcatore di salto"
 
-#: editor_drag.cc:5017
+#: editor_drag.cc:5421
 msgid "skip"
 msgstr "salta"
 
-#: editor_drag.cc:5021 location_ui.cc:56
+#: editor_drag.cc:5425 location_ui.cc:60
 msgid "CD"
 msgstr "CD"
 
-#: editor_drag.cc:5022
+#: editor_drag.cc:5426
 msgid "new CD marker"
 msgstr "nuovo marcatore di CD"
 
-#: editor_drag.cc:5027 editor_route_groups.cc:437 mixer_ui.cc:1493
+#: editor_drag.cc:5431 editor_route_groups.cc:439 mixer_ui.cc:1840
 msgid "unnamed"
 msgstr "senza nome"
 
-#: editor_drag.cc:5309
+#: editor_drag.cc:5740
 msgid "Automation range drag created for invalid region type"
 msgstr ""
 
-#: editor_route_groups.cc:96
+#: editor_route_groups.cc:97
 msgid "Col"
 msgstr "Col"
 
-#: editor_route_groups.cc:96
+#: editor_route_groups.cc:97
 msgid "Group Tab Color"
 msgstr "Colore del gruppo"
 
-#: editor_route_groups.cc:97
+#: editor_route_groups.cc:98
 msgid "Name of Group"
 msgstr "Nome del gruppo"
 
-#: editor_route_groups.cc:98 editor_routes.cc:207
-msgid "V"
-msgstr "V"
+#: editor_route_groups.cc:99 editor_routes.cc:234
+msgid "Visible|V"
+msgstr ""
 
-#: editor_route_groups.cc:98
+#: editor_route_groups.cc:99
 msgid "Group is visible?"
 msgstr "Gruppo visibile?"
 
-#: editor_route_groups.cc:99
+#: editor_route_groups.cc:100
 msgid "On"
 msgstr "Attivo"
 
-#: editor_route_groups.cc:99
+#: editor_route_groups.cc:100
 msgid "Group is enabled?"
 msgstr "Gruppo attivato?"
 
-#: editor_route_groups.cc:100
-msgid "group|G"
-msgstr "gruppo|G"
+#: editor_route_groups.cc:101
+msgid "Group|G"
+msgstr ""
 
-#: editor_route_groups.cc:100
+#: editor_route_groups.cc:101
 msgid "Sharing Gain?"
 msgstr "Condivisione volume?"
 
-#: editor_route_groups.cc:101
-msgid "relative|Rel"
-msgstr "relativo|Rel"
+#: editor_route_groups.cc:102
+msgid "Relative|Rel"
+msgstr ""
 
-#: editor_route_groups.cc:101
+#: editor_route_groups.cc:102
 msgid "Relative Gain Changes?"
 msgstr "Cambi di volume relativi?"
 
-#: editor_route_groups.cc:102
-msgid "mute|M"
-msgstr "muto|M"
+#: editor_route_groups.cc:103 editor_regions.cc:168 editor_routes.cc:239
+#: mixer_strip.cc:2221 meter_strip.cc:365 route_time_axis.cc:2742
+#: time_axis_view.cc:1106
+msgid "Mute|M"
+msgstr ""
 
-#: editor_route_groups.cc:102
+#: editor_route_groups.cc:103
 msgid "Sharing Mute?"
 msgstr "Condivisione muto?"
 
-#: editor_route_groups.cc:103
-msgid "solo|S"
-msgstr "solo|S"
+#: editor_route_groups.cc:104 editor_routes.cc:240 mixer_strip.cc:2234
+#: meter_strip.cc:373 route_time_axis.cc:2739 vca_master_strip.cc:211
+#: vca_time_axis.cc:236
+msgid "Solo|S"
+msgstr ""
 
-#: editor_route_groups.cc:103
+#: editor_route_groups.cc:104
 msgid "Sharing Solo?"
 msgstr "Condivisione solo?"
 
-#: editor_route_groups.cc:104 midi_time_axis.cc:1622 midi_time_axis.cc:1625
-#: midi_time_axis.cc:1628
+#: editor_route_groups.cc:105 midi_time_axis.cc:1626 midi_time_axis.cc:1629
+#: midi_time_axis.cc:1632
 msgid "Rec"
 msgstr "Reg"
 
-#: editor_route_groups.cc:104
+#: editor_route_groups.cc:105
 msgid "Sharing Record-enable Status?"
 msgstr "Condivisione stato di registrazione?"
 
-#: editor_route_groups.cc:105
-msgid "monitoring|Mon"
-msgstr "monitoraggio|Mon"
+#: editor_route_groups.cc:106
+msgid "Monitoring|Mon"
+msgstr ""
 
-#: editor_route_groups.cc:105
+#: editor_route_groups.cc:106
 msgid "Sharing Monitoring Choice?"
 msgstr "Condivisione scelta monitoraggio?"
 
-#: editor_route_groups.cc:106
-msgid "selection|Sel"
-msgstr "selezione|Sel"
+#: editor_route_groups.cc:107
+msgid "Selection|Sel"
+msgstr ""
 
-#: editor_route_groups.cc:106
+#: editor_route_groups.cc:107
 msgid "Sharing Selected/Editing Status?"
 msgstr "Condivisione stato selezione/modifica?"
 
-#: editor_route_groups.cc:107
-msgid "active|A"
-msgstr "attivo|A"
+#: editor_route_groups.cc:108 editor_routes.cc:235
+msgid "Active|A"
+msgstr ""
 
-#: editor_route_groups.cc:107
+#: editor_route_groups.cc:108
 msgid "Sharing Active Status?"
 msgstr "Condivisione stato attivo?"
 
-#: editor_export_audio.cc:92 editor_markers.cc:740 editor_markers.cc:827
-#: editor_markers.cc:1012 editor_markers.cc:1030 editor_markers.cc:1048
-#: editor_markers.cc:1067 editor_markers.cc:1086 editor_markers.cc:1116
-#: editor_markers.cc:1147 editor_markers.cc:1177 editor_markers.cc:1205
-#: editor_markers.cc:1236 editor_markers.cc:1261 editor_markers.cc:1312
-#: editor_markers.cc:1356 editor_markers.cc:1382 editor_markers.cc:1576
-#: editor_mouse.cc:2120
+#: editor_export_audio.cc:93 editor_markers.cc:733 editor_markers.cc:832
+#: editor_markers.cc:1045 editor_markers.cc:1063 editor_markers.cc:1081
+#: editor_markers.cc:1100 editor_markers.cc:1119 editor_markers.cc:1149
+#: editor_markers.cc:1180 editor_markers.cc:1210 editor_markers.cc:1238
+#: editor_markers.cc:1269 editor_markers.cc:1294 editor_markers.cc:1345
+#: editor_markers.cc:1458 editor_markers.cc:1484 editor_markers.cc:1678
+#: editor_mouse.cc:2255
 msgid "programming error: marker canvas item has no marker object pointer!"
 msgstr ""
 
-#: editor_export_audio.cc:145 editor_export_audio.cc:150
-msgid "File Exists!"
-msgstr "Il file esiste!"
+#: editor_export_audio.cc:114
+msgid "Confirm MIDI File Overwrite"
+msgstr ""
 
-#: editor_export_audio.cc:153
-msgid "Overwrite Existing File"
-msgstr "Sovrascrivo file esistente"
+#: editor_export_audio.cc:115 utils_videotl.cc:73
+msgid "A file with the same name already exists. Do you want to overwrite it?"
+msgstr ""
 
 #: editor_group_tabs.cc:176
 msgid "Fit to Window"
@@ -4868,300 +5474,341 @@ msgstr "inizio"
 msgid "end"
 msgstr "fine"
 
-#: editor_markers.cc:657 editor_ops.cc:2085 editor_ops.cc:2107
-#: editor_ops.cc:2164 editor_ops.cc:2193 location_ui.cc:1023
+#: editor_markers.cc:645
+msgid "mark"
+msgstr ""
+
+#: editor_markers.cc:650 editor_ops.cc:2164 editor_ops.cc:2186
+#: editor_ops.cc:2304 editor_ops.cc:2341 location_ui.cc:1049
 msgid "add marker"
 msgstr "aggiungi marcatore"
 
-#: editor_markers.cc:689 editor_markers.cc:1456
+#: editor_markers.cc:682 editor_markers.cc:1558
 msgid "set loop range"
 msgstr "imposta l'intervallo di ciclo"
 
-#: editor_markers.cc:705 editor_markers.cc:1462
+#: editor_markers.cc:698 editor_markers.cc:1564
 msgid "set punch range"
 msgstr "imposta l'intervallo di punch"
 
-#: editor_markers.cc:722 editor_ops.cc:4055
+#: editor_markers.cc:715 editor_ops.cc:4159
 msgid "range"
 msgstr "intervallo"
 
-#: editor_markers.cc:725
+#: editor_markers.cc:718
 msgid "new range marker"
 msgstr "nuovo marcatore di intervallo"
 
-#: editor_markers.cc:758 editor_ops.cc:2129 location_ui.cc:859
+#: editor_markers.cc:751 editor_ops.cc:2272 location_ui.cc:885
 msgid "remove marker"
 msgstr "rimuovi marcatore"
 
-#: editor_markers.cc:894
+#: editor_markers.cc:899
 msgid "Locate to Here"
 msgstr "Posizionati qui"
 
-#: editor_markers.cc:895
+#: editor_markers.cc:900
 msgid "Play from Here"
 msgstr "Suona da qui"
 
-#: editor_markers.cc:896
+#: editor_markers.cc:901
 msgid "Move Mark to Playhead"
 msgstr "Sposta marcatore alla testina"
 
-#: editor_markers.cc:900
+#: editor_markers.cc:905
 msgid "Create Range to Next Marker"
 msgstr "Crea intervallo fino al prossimo marcatore"
 
-#: editor_markers.cc:941
+#: editor_markers.cc:946
 msgid "Locate to Marker"
 msgstr "Posiziona sul marcatore"
 
-#: editor_markers.cc:942
+#: editor_markers.cc:947
 msgid "Play from Marker"
 msgstr "Suona dal marcatore"
 
-#: editor_markers.cc:945
+#: editor_markers.cc:950
 msgid "Set Marker from Playhead"
 msgstr "Imposta il marcatore dalla testina"
 
-#: editor_markers.cc:947
+#: editor_markers.cc:951
 msgid "Set Range from Selection"
 msgstr "Imposta l'intervallo dalla selezione"
 
-#: editor_markers.cc:957
+#: editor_markers.cc:960
 msgid "Hide Range"
 msgstr "Nascondi intervallo"
 
-#: editor_markers.cc:958
+#: editor_markers.cc:961
 msgid "Rename Range..."
 msgstr "Rinomina intervallo..."
 
-#: editor_markers.cc:962
+#: editor_markers.cc:965
 msgid "Remove Range"
 msgstr "Rimuovi intervallo"
 
-#: editor_markers.cc:969
+#: editor_markers.cc:972
 msgid "Separate Regions in Range"
 msgstr "Separa le regioni nell'intervallo"
 
-#: editor_markers.cc:972
+#: editor_markers.cc:974
 msgid "Select Range"
 msgstr "Separa l'intervallo"
 
-#: editor_markers.cc:1001
+#: editor_markers.cc:987
+msgid "Make Ramped"
+msgstr ""
+
+#: editor_markers.cc:989
+msgid "Make Constant"
+msgstr ""
+
+#: editor_markers.cc:993 editor_markers.cc:1013
+msgid "Lock to Music"
+msgstr ""
+
+#: editor_markers.cc:995 editor_markers.cc:1015
+msgid "Lock to Audio"
+msgstr ""
+
+#: editor_markers.cc:1034
 msgid "Set Punch Range"
 msgstr "Imposta l'intervallo di Punch"
 
-#: editor_markers.cc:1407 editor_ops.cc:2040
+#: editor_markers.cc:1391
+msgid "change meter lock style"
+msgstr ""
+
+#: editor_markers.cc:1414
+msgid "change tempo lock style"
+msgstr ""
+
+#: editor_markers.cc:1441
+msgid "change tempo type"
+msgstr ""
+
+#: editor_markers.cc:1509 editor_ops.cc:2119
 msgid "New Name:"
 msgstr "Nuovo nome: "
 
-#: editor_markers.cc:1410
+#: editor_markers.cc:1512
 msgid "Rename Mark"
 msgstr "Rinomina marcatore"
 
-#: editor_markers.cc:1412
+#: editor_markers.cc:1514
 msgid "Rename Range"
 msgstr "Rinomina intervallo"
 
-#: editor_markers.cc:1419 editor_mouse.cc:2137 processor_box.cc:1994
-#: processor_box.cc:2464 route_time_axis.cc:1100 route_ui.cc:1628
+#: editor_markers.cc:1521 editor_mouse.cc:2272 processor_box.cc:3192
+#: processor_box.cc:3681 route_time_axis.cc:1110 route_ui.cc:1637
+#: vca_master_strip.cc:395
 msgid "Rename"
 msgstr "Rinomina"
 
-#: editor_markers.cc:1432
+#: editor_markers.cc:1534
 msgid "rename marker"
 msgstr "Rinomina marcatore"
 
-#: editor_mixer.cc:90
+#: editor_mixer.cc:98
 msgid "This screen is not tall enough to display the editor mixer"
 msgstr "Questo schermo non è alto abbastanza per mostrare il mixer del'editor"
 
-#: editor_mouse.cc:1223 editor_mouse.cc:1241 editor_tempodisplay.cc:270
+#: editor_mouse.cc:1345 editor_mouse.cc:1363 editor_tempodisplay.cc:384
 msgid ""
 "programming error: tempo marker canvas item has no marker object pointer!"
 msgstr ""
 
-#: editor_mouse.cc:1228 editor_tempodisplay.cc:275
+#: editor_mouse.cc:1350 editor_tempodisplay.cc:389
 msgid "programming error: marker for tempo is not a tempo marker!"
 msgstr ""
 
-#: editor_mouse.cc:1246 editor_tempodisplay.cc:375
+#: editor_mouse.cc:1368 editor_tempodisplay.cc:507
 msgid "programming error: marker for meter is not a meter marker!"
 msgstr ""
 
-#: editor_mouse.cc:1885 editor_mouse.cc:1910 editor_mouse.cc:1923
+#: editor_mouse.cc:2016 editor_mouse.cc:2041 editor_mouse.cc:2054
 msgid ""
 "programming error: control point canvas item has no control point object "
 "pointer!"
 msgstr ""
 
-#: editor_mouse.cc:2058
+#: editor_mouse.cc:2085
+msgid "edit note(s)"
+msgstr ""
+
+#: editor_mouse.cc:2193
 msgid "start point trim"
 msgstr ""
 
-#: editor_mouse.cc:2083
-msgid "End point trim"
+#: editor_mouse.cc:2218
+msgid "end point trim"
 msgstr ""
 
-#: editor_mouse.cc:2135
+#: editor_mouse.cc:2270
 msgid "Name for region:"
 msgstr "Nome per la Regione:"
 
-#: editor_ops.cc:165
+#: editor_ops.cc:168
 msgid "split"
 msgstr "dividi"
 
-#: editor_ops.cc:339
+#: editor_ops.cc:342
 msgid "alter selection"
 msgstr "modifica la selezione"
 
-#: editor_ops.cc:381
+#: editor_ops.cc:384
 msgid "nudge regions forward"
 msgstr "sposta regioni in avanti"
 
-#: editor_ops.cc:404 editor_ops.cc:489
+#: editor_ops.cc:441 editor_ops.cc:535
 msgid "nudge location forward"
 msgstr "sposta posizine in avanti"
 
-#: editor_ops.cc:462
+#: editor_ops.cc:472
 msgid "nudge regions backward"
 msgstr "sposta regioni indietro"
 
-#: editor_ops.cc:551
+#: editor_ops.cc:567
 msgid "nudge forward"
 msgstr ""
 
-#: editor_ops.cc:575
+#: editor_ops.cc:591
 msgid "nudge backward"
 msgstr ""
 
-#: editor_ops.cc:618
+#: editor_ops.cc:656
 msgid "sequence regions"
 msgstr ""
 
-#: editor_ops.cc:694
+#: editor_ops.cc:718
 msgid "build_region_boundary_cache called with snap_type = %1"
 msgstr ""
 
-#: editor_ops.cc:2042
+#: editor_ops.cc:2121
 msgid "New Location Marker"
 msgstr "Nuovo marcatore di posizione"
 
-#: editor_ops.cc:2164
+#: editor_ops.cc:2212 editor_ops.cc:2236
+msgid "Set session start"
+msgstr ""
+
+#: editor_ops.cc:2304
 msgid "add markers"
 msgstr "aggiungi marcatore"
 
-#: editor_ops.cc:2274
+#: editor_ops.cc:2400
 msgid "clear markers"
 msgstr "azzera i marcatori"
 
-#: editor_ops.cc:2289
+#: editor_ops.cc:2415
 msgid "clear ranges"
 msgstr "azzera gli intervalli"
 
-#: editor_ops.cc:2305
+#: editor_ops.cc:2431
 msgid "clear locations"
 msgstr "azzera le posizioni"
 
-#: editor_ops.cc:2368
+#: editor_ops.cc:2494
 msgid "insert region"
 msgstr "inserisci regione"
 
-#: editor_ops.cc:2559
+#: editor_ops.cc:2685
 msgid "raise regions"
 msgstr "alza regioni"
 
-#: editor_ops.cc:2561
+#: editor_ops.cc:2687
 msgid "raise region"
 msgstr "alza regione"
 
-#: editor_ops.cc:2567
+#: editor_ops.cc:2693
 msgid "raise regions to top"
 msgstr "alza le regioni fino in cima"
 
-#: editor_ops.cc:2569
+#: editor_ops.cc:2695
 msgid "raise region to top"
 msgstr "alza la regione fino in cima"
 
-#: editor_ops.cc:2575
+#: editor_ops.cc:2701
 msgid "lower regions"
 msgstr "abbassa le regioni"
 
-#: editor_ops.cc:2577 editor_ops.cc:2585
+#: editor_ops.cc:2703 editor_ops.cc:2711
 msgid "lower region"
 msgstr "abbassa la regione"
 
-#: editor_ops.cc:2583
+#: editor_ops.cc:2709
 msgid "lower regions to bottom"
 msgstr "abbassa le regioni fino in fondo"
 
-#: editor_ops.cc:2668
+#: editor_ops.cc:2794
 msgid "Rename Region"
 msgstr "Rinomina regione"
 
-#: editor_ops.cc:2670 processor_box.cc:1992 route_ui.cc:1626
+#: editor_ops.cc:2796 processor_box.cc:3190 route_ui.cc:1635
 msgid "New name:"
 msgstr "Nuovo nome: "
 
-#: editor_ops.cc:2987
+#: editor_ops.cc:3097
 msgid "separate"
 msgstr "separa"
 
-#: editor_ops.cc:3099
+#: editor_ops.cc:3207
 msgid "separate region under"
 msgstr "separa la regione sottostante"
 
-#: editor_ops.cc:3220
+#: editor_ops.cc:3360
 msgid "trim to selection"
 msgstr "ritaglia in base alla selezione"
 
-#: editor_ops.cc:3356
+#: editor_ops.cc:3442
 msgid "set sync point"
 msgstr "imposta il punto di sincronizzazione"
 
-#: editor_ops.cc:3380
+#: editor_ops.cc:3466
 msgid "remove region sync"
 msgstr "Rimuovi il sync della regione"
 
-#: editor_ops.cc:3402
+#: editor_ops.cc:3488
 msgid "move regions to original position"
 msgstr "sposta le regioni alla posizione originale"
 
-#: editor_ops.cc:3404
+#: editor_ops.cc:3490
 msgid "move region to original position"
 msgstr "sposta la regione alla posizione originale"
 
-#: editor_ops.cc:3425
+#: editor_ops.cc:3511
 msgid "align selection"
 msgstr "allinea selezione"
 
-#: editor_ops.cc:3499
+#: editor_ops.cc:3585
 msgid "align selection (relative)"
 msgstr "allinea selezione (relativo)"
 
-#: editor_ops.cc:3533
+#: editor_ops.cc:3619
 msgid "align region"
 msgstr "allinea la regione"
 
-#: editor_ops.cc:3584
+#: editor_ops.cc:3670
 msgid "trim front"
 msgstr ""
 
-#: editor_ops.cc:3584
+#: editor_ops.cc:3670
 msgid "trim back"
 msgstr ""
 
-#: editor_ops.cc:3614
+#: editor_ops.cc:3700
 msgid "trim to loop"
 msgstr "ritaglia in base al ciclo"
 
-#: editor_ops.cc:3624
+#: editor_ops.cc:3710
 msgid "trim to punch"
 msgstr "ritaglia in base al punch"
 
-#: editor_ops.cc:3686
+#: editor_ops.cc:3832
 msgid "trim to region"
 msgstr "ritaglia in base alla regione"
 
-#: editor_ops.cc:3794
+#: editor_ops.cc:3891
 msgid ""
 "This track/bus cannot be frozen because the signal adds or loses channels "
 "before reaching the outputs.\n"
@@ -5173,11 +5820,11 @@ msgstr ""
 "Tipicamente ciò accade a causa dei plugin che producon un output stereo da "
 "input mono o vice versa."
 
-#: editor_ops.cc:3797
+#: editor_ops.cc:3894
 msgid "Cannot freeze"
 msgstr "Non posso congelare"
 
-#: editor_ops.cc:3803
+#: editor_ops.cc:3900
 msgid ""
 "<b>%1</b>\n"
 "\n"
@@ -5193,23 +5840,23 @@ msgstr ""
 "Il congelamento avrà effetto solo sul segnale della prima mandata/insert/"
 "ritorno. "
 
-#: editor_ops.cc:3807
+#: editor_ops.cc:3904
 msgid "Freeze anyway"
 msgstr "Congela comunque"
 
-#: editor_ops.cc:3808
+#: editor_ops.cc:3905
 msgid "Don't freeze"
 msgstr "Non congelare"
 
-#: editor_ops.cc:3809
+#: editor_ops.cc:3906
 msgid "Freeze Limits"
 msgstr "Congela i limiti"
 
-#: editor_ops.cc:3824
+#: editor_ops.cc:3921
 msgid "Cancel Freeze"
 msgstr "Annulla congelamento"
 
-#: editor_ops.cc:3854
+#: editor_ops.cc:3952
 msgid ""
 "You can't perform this operation because the processing of the signal will "
 "cause one or more of the tracks to end up with a region with more channels "
@@ -5222,47 +5869,47 @@ msgstr ""
 "\n"
 "Puoi farlo senza elaborare, che è una operazione diversa."
 
-#: editor_ops.cc:3858
+#: editor_ops.cc:3956
 msgid "Cannot bounce"
 msgstr "Non posso elaborare"
 
-#: editor_ops.cc:3869
+#: editor_ops.cc:4007
 msgid "bounce range"
 msgstr "elabora intervallo"
 
-#: editor_ops.cc:3971
+#: editor_ops.cc:4074
 msgid "delete"
 msgstr "elimina"
 
-#: editor_ops.cc:3974
+#: editor_ops.cc:4077
 msgid "cut"
 msgstr "taglia"
 
-#: editor_ops.cc:3977
+#: editor_ops.cc:4080
 msgid "copy"
 msgstr "copia"
 
-#: editor_ops.cc:3980
+#: editor_ops.cc:4083
 msgid "clear"
 msgstr "pulisci"
 
-#: editor_ops.cc:4028
+#: editor_ops.cc:4132
 msgid "objects"
 msgstr "oggetti"
 
-#: editor_ops.cc:4238 editor_ops.cc:4270
+#: editor_ops.cc:4342 editor_ops.cc:4427
 msgid "remove region"
 msgstr "Rimuovi la regione"
 
-#: editor_ops.cc:4719
-msgid "duplicate selection"
-msgstr "duplica selezione"
+#: editor_ops.cc:4844
+msgid "duplicate range selection"
+msgstr ""
 
-#: editor_ops.cc:4803
+#: editor_ops.cc:4938
 msgid "nudge track"
 msgstr ""
 
-#: editor_ops.cc:4840
+#: editor_ops.cc:4965
 msgid ""
 "Do you really want to destroy the last capture?\n"
 "(This is destructive and cannot be undone)"
@@ -5270,137 +5917,157 @@ msgstr ""
 "Si vuole realmente rimuovere l'ultima registrazione?\n"
 "(questa azione non potrà essere annullata)"
 
-#: editor_ops.cc:4843 editor_ops.cc:6838 editor_regions.cc:462
-#: editor_snapshots.cc:159 route_ui.cc:1569
+#: editor_ops.cc:4968 editor_ops.cc:7202 editor_regions.cc:503
+#: editor_snapshots.cc:171
 msgid "No, do nothing."
 msgstr "No, non fare niente."
 
-#: editor_ops.cc:4844
+#: editor_ops.cc:4969
 msgid "Yes, destroy it."
 msgstr "Si, rimuovi."
 
-#: editor_ops.cc:4846
+#: editor_ops.cc:4971
 msgid "Destroy last capture"
 msgstr "Distruggi l'ultima registrazione"
 
-#: editor_ops.cc:4906
+#: editor_ops.cc:5047
 msgid "normalize"
 msgstr "Normalizza"
 
-#: editor_ops.cc:5000
+#: editor_ops.cc:5145
 msgid "reverse regions"
 msgstr "fai il Reverse della regione"
 
-#: editor_ops.cc:5034
+#: editor_ops.cc:5182
 msgid "strip silence"
 msgstr "elimina silenzio"
 
-#: editor_ops.cc:5091
+#: editor_ops.cc:5263
 msgid "Fork Region(s)"
 msgstr "Dividi regione/i"
 
-#: editor_ops.cc:5112
+#: editor_ops.cc:5270
 msgid "Could not unlink %1"
 msgstr "Non posso scollegare %1"
 
-#: editor_ops.cc:5326
+#: editor_ops.cc:5532
 msgid "reset region gain"
 msgstr "Ripristina il gain della regione"
 
-#: editor_ops.cc:5379
+#: editor_ops.cc:5590
 msgid "region gain envelope active"
 msgstr ""
 
-#: editor_ops.cc:5406
+#: editor_ops.cc:5615
 msgid "toggle region lock"
 msgstr "Attiva/disattiva il blocco della regione"
 
-#: editor_ops.cc:5430
+#: editor_ops.cc:5639
 msgid "Toggle Video Lock"
 msgstr "Attiva/disattiva il blocco video"
 
-#: editor_ops.cc:5454
+#: editor_ops.cc:5663
 msgid "region lock style"
 msgstr "stile del blocco della regione"
 
-#: editor_ops.cc:5479
+#: editor_ops.cc:5688
 msgid "change region opacity"
 msgstr "cambia l'opacità della regione"
 
-#: editor_ops.cc:5572
+#: editor_ops.cc:5781
 msgid "fade range"
 msgstr "dissolvi intervallo"
 
-#: editor_ops.cc:5610
+#: editor_ops.cc:5819
 msgid "set fade in length"
 msgstr "Imposta la durata della dissolvenza in entrata"
 
-#: editor_ops.cc:5617
+#: editor_ops.cc:5826
 msgid "set fade out length"
 msgstr "durata della dissolvenza in uscita"
 
-#: editor_ops.cc:5662
+#: editor_ops.cc:5891
 msgid "set fade in shape"
 msgstr "durata della dissolvenza in entrata"
 
-#: editor_ops.cc:5693
+#: editor_ops.cc:5926
 msgid "set fade out shape"
 msgstr "forma della dissolvenza in uscita"
 
-#: editor_ops.cc:5723
+#: editor_ops.cc:5962
 msgid "set fade in active"
 msgstr "attiva dissolvenza in entrata"
 
-#: editor_ops.cc:5752
+#: editor_ops.cc:5996
 msgid "set fade out active"
 msgstr "attiva dissolvenza in uscita"
 
-#: editor_ops.cc:5994
+#: editor_ops.cc:6056
+msgid "toggle fade active"
+msgstr ""
+
+#: editor_ops.cc:6249
 msgid "set loop range from selection"
 msgstr "intervallo di ciclo dalla selezione"
 
-#: editor_ops.cc:6008
+#: editor_ops.cc:6263
 msgid "set loop range from region"
 msgstr "imposta l'intervallo di ciclo dalla in base alla regione"
 
-#: editor_ops.cc:6027
+#: editor_ops.cc:6282
 msgid "set punch range from selection"
 msgstr "imposta intervallo di punch dalla selezione"
 
-#: editor_ops.cc:6041
+#: editor_ops.cc:6306
 msgid "set session start/end from selection"
 msgstr ""
 
-#: editor_ops.cc:6066
+#: editor_ops.cc:6344
+msgid "set punch start from EP"
+msgstr ""
+
+#: editor_ops.cc:6372
+msgid "set punch end from EP"
+msgstr ""
+
+#: editor_ops.cc:6405
+msgid "set loop start from EP"
+msgstr ""
+
+#: editor_ops.cc:6433
+msgid "set loop end from EP"
+msgstr ""
+
+#: editor_ops.cc:6444
 msgid "set punch range from region"
 msgstr "imposta intervallo di punch dalla regione"
 
-#: editor_ops.cc:6175
+#: editor_ops.cc:6531
 msgid "Add new marker"
 msgstr "Aggiungi marcatore"
 
-#: editor_ops.cc:6176
+#: editor_ops.cc:6532
 msgid "Set global tempo"
 msgstr "Imposta il tempo globalmente"
 
-#: editor_ops.cc:6179
+#: editor_ops.cc:6535
 msgid "Define one bar"
 msgstr "Definisce una battuta"
 
-#: editor_ops.cc:6180
+#: editor_ops.cc:6536
 msgid "Do you want to set the global tempo or add a new tempo marker?"
 msgstr ""
 "Vuoi impostare il tempo globale o aggiungere un nuovo marcatore di tempo?"
 
-#: editor_ops.cc:6206
+#: editor_ops.cc:6562
 msgid "set tempo from region"
 msgstr "imposta il tempo in base alla regione"
 
-#: editor_ops.cc:6236
+#: editor_ops.cc:6591
 msgid "split regions"
 msgstr "dividi regioni"
 
-#: editor_ops.cc:6278
+#: editor_ops.cc:6633
 msgid ""
 "You are about to split\n"
 "%1\n"
@@ -5412,11 +6079,11 @@ msgstr ""
 "in %2 pezzi.\n"
 "Questa operazione può richiedere parecchio tempo."
 
-#: editor_ops.cc:6285
+#: editor_ops.cc:6640
 msgid "Call for the Ferret!"
 msgstr ""
 
-#: editor_ops.cc:6286
+#: editor_ops.cc:6641
 msgid ""
 "Press OK to continue with this split operation\n"
 "or ask the Ferret dialog to tune the analysis"
@@ -5424,52 +6091,52 @@ msgstr ""
 "Premi OK per continuare con questa operazione\n"
 "oppure chiedi al Ferret di affinare l'analisi."
 
-#: editor_ops.cc:6288
+#: editor_ops.cc:6643
 msgid "Press OK to continue with this split operation"
 msgstr "Premi OK per continuare con questa operazione di separazione."
 
-#: editor_ops.cc:6291
+#: editor_ops.cc:6646
 msgid "Excessive split?"
 msgstr "Separazione esagerata?"
 
-#: editor_ops.cc:6443
+#: editor_ops.cc:6800
 msgid "place transient"
 msgstr ""
 
-#: editor_ops.cc:6478
+#: editor_ops.cc:6834
 msgid "snap regions to grid"
 msgstr "allinea le regioni alla griglia"
 
-#: editor_ops.cc:6517
+#: editor_ops.cc:6873
 msgid "Close Region Gaps"
 msgstr "Chiudi i vuoti della regione"
 
-#: editor_ops.cc:6522
+#: editor_ops.cc:6878
 msgid "Crossfade length"
 msgstr "Durata della dissolvenza incrociata"
 
-#: editor_ops.cc:6531 editor_ops.cc:6542 rhythm_ferret.cc:119
-#: session_option_editor.cc:141
+#: editor_ops.cc:6887 editor_ops.cc:6898 rhythm_ferret.cc:128
+#: rhythm_ferret.cc:143 session_option_editor.cc:141
 msgid "ms"
 msgstr "ms"
 
-#: editor_ops.cc:6533
+#: editor_ops.cc:6889
 msgid "Pull-back length"
 msgstr ""
 
-#: editor_ops.cc:6546
+#: editor_ops.cc:6902 keyeditor.cc:71
 msgid "Ok"
 msgstr "Ok"
 
-#: editor_ops.cc:6561
+#: editor_ops.cc:6917
 msgid "close region gaps"
 msgstr "Riempi gli intervalli della regione"
 
-#: editor_ops.cc:6786 route_ui.cc:1543
+#: editor_ops.cc:7160
 msgid "That would be bad news ...."
 msgstr "Ci sarebbero cattive notizie..."
 
-#: editor_ops.cc:6791 route_ui.cc:1548
+#: editor_ops.cc:7165
 msgid ""
 "Removing the master or monitor bus is such a bad idea\n"
 "that %1 is not going to allow it.\n"
@@ -5485,23 +6152,21 @@ msgstr ""
 "modifica il tuo file ardour.rc ed imposta \n"
 "l'opzione \"allow-special-bus-removal\" su \"yes\""
 
-#: editor_ops.cc:6809
-msgid "tracks"
-msgstr "Tracce"
-
-#: editor_ops.cc:6811 route_ui.cc:1992
+#: editor_ops.cc:7181
+#, fuzzy
 msgid "track"
-msgstr "traccia"
-
-#: editor_ops.cc:6815
-msgid "busses"
-msgstr "Bus"
+msgid_plural "tracks"
+msgstr[0] "traccia"
+msgstr[1] "traccia"
 
-#: editor_ops.cc:6817 route_ui.cc:1992
+#: editor_ops.cc:7182
+#, fuzzy
 msgid "bus"
-msgstr "bus"
+msgid_plural "busses"
+msgstr[0] "bus"
+msgstr[1] "bus"
 
-#: editor_ops.cc:6822
+#: editor_ops.cc:7186
 msgid ""
 "Do you really want to remove %1 %2 and %3 %4?\n"
 "(You may also lose the playlists associated with the %2)\n"
@@ -5514,7 +6179,7 @@ msgstr ""
 "Questa operazione non può essere annullata e il file della sessione sarà "
 "sovrascritto!"
 
-#: editor_ops.cc:6827
+#: editor_ops.cc:7191
 msgid ""
 "Do you really want to remove %1 %2?\n"
 "(You may also lose the playlists associated with the %2)\n"
@@ -5527,7 +6192,7 @@ msgstr ""
 "Questa operazione non può essere annullata e il file della sessione sarà "
 "sovrascritto!"
 
-#: editor_ops.cc:6833
+#: editor_ops.cc:7197
 msgid ""
 "Do you really want to remove %1 %2?\n"
 "\n"
@@ -5538,146 +6203,147 @@ msgstr ""
 "Questa operazione non può essere annullata e il file della sessione verrà "
 "sovrascritto"
 
-#: editor_ops.cc:6840
+#: editor_ops.cc:7204
 msgid "Yes, remove them."
 msgstr "Si, rimuovi."
 
-#: editor_ops.cc:6842 editor_snapshots.cc:160 route_ui.cc:1570
+#: editor_ops.cc:7206 editor_snapshots.cc:172
 msgid "Yes, remove it."
 msgstr "Si, rimuovi."
 
-#: editor_ops.cc:6847 editor_ops.cc:6849
+#: editor_ops.cc:7211 editor_ops.cc:7213
 msgid "Remove %1"
 msgstr "Rimuovi %1"
 
-#: editor_ops.cc:6912
+#: editor_ops.cc:7319 editor_ops.cc:7333 editor_ops.cc:7373 editor_ops.cc:7383
 msgid "insert time"
 msgstr "Inserisci tempo"
 
-#: editor_ops.cc:7076
+#: editor_ops.cc:7436
+msgid "Cannot insert or delete time when in Lock edit."
+msgstr ""
+
+#: editor_ops.cc:7456 editor_ops.cc:7468 editor_ops.cc:7541 editor_ops.cc:7554
+msgid "remove time"
+msgstr ""
+
+#: editor_ops.cc:7628
 msgid "There are too many tracks to fit in the current window"
 msgstr ""
 "Ci sono troppe tracce per essere contenute tutte nella finestra corrente."
 
-#: editor_ops.cc:7137
+#: editor_ops.cc:7689
 msgid "Sel"
 msgstr "Sel"
 
-#: editor_ops.cc:7176
+#: editor_ops.cc:7728
 #, c-format
 msgid "Saved view %u"
 msgstr "Salvata la vista %u"
 
-#: editor_ops.cc:7201
+#: editor_ops.cc:7753
 msgid "mute regions"
 msgstr "Metti in \"mute\" le regioni"
 
-#: editor_ops.cc:7203
+#: editor_ops.cc:7755
 msgid "mute region"
 msgstr "Metti in \"mute\" la regione"
 
-#: editor_ops.cc:7240
+#: editor_ops.cc:7792
 msgid "combine regions"
 msgstr "unisci le regioni"
 
-#: editor_ops.cc:7278
+#: editor_ops.cc:7830
 msgid "uncombine regions"
 msgstr "separa le regioni"
 
-#: editor_ops.cc:7315
+#: editor_ops.cc:7867
 msgid "%1: Locked"
 msgstr "%1: bloccato"
 
-#: editor_ops.cc:7322
+#: editor_ops.cc:7874
 msgid "Click to unlock"
 msgstr "Clicca per sbloccare"
 
-#: editor_ops.cc:7376
+#: editor_ops.cc:7923
 msgid "Moving embedded files into session folder"
 msgstr "Sposta in file inclusi nella cartella della sessione"
 
-#: editor_regions.cc:112
+#: editor_regions.cc:159
 msgid "Region name, with number of channels in []'s"
 msgstr "Nome regione, con numero di canali in []'s"
 
-#: editor_regions.cc:113
+#: editor_regions.cc:160
 msgid "Position of start of region"
 msgstr "Posizione dell'inizio della regione"
 
-#: editor_regions.cc:114 editor_regions.cc:851 time_info_box.cc:101
+#: editor_regions.cc:161 editor_regions.cc:935 time_info_box.cc:95
 msgid "End"
 msgstr "Fine"
 
-#: editor_regions.cc:114
+#: editor_regions.cc:161
 msgid "Position of end of region"
 msgstr "Posizione della fine della regione"
 
-#: editor_regions.cc:115
+#: editor_regions.cc:162
 msgid "Length of the region"
 msgstr "Lunghezza della regione"
 
-#: editor_regions.cc:116
+#: editor_regions.cc:163
 msgid "Position of region sync point, relative to start of the region"
 msgstr ""
 
-#: editor_regions.cc:117
+#: editor_regions.cc:164
 msgid "Length of region fade-in (units: secondary clock), () if disabled"
 msgstr ""
 "Lunghezza della dissolvenza in entrata (unità: orologio secondario), () se "
 "disabilitato"
 
-#: editor_regions.cc:118
+#: editor_regions.cc:165
 msgid "Length of region fade-out (units: secondary clock), () if disabled"
 msgstr ""
 "Lunghezza della dissolvenza in uscita (units: orologio secondario), () se "
 "disabilitato"
 
-#: editor_regions.cc:119 mixer_strip.cc:2055 mono_panner.cc:203
-#: panner2d.cc:240 stereo_panner.cc:251 stereo_panner.cc:274
-msgid "L"
-msgstr "L"
+#: editor_regions.cc:166
+msgid "Lock|L"
+msgstr ""
 
-#: editor_regions.cc:119
+#: editor_regions.cc:166
 msgid "Region position locked?"
 msgstr "Posizione della regione bloccata?"
 
-#: editor_regions.cc:120 route_time_axis.cc:103
-msgid "G"
-msgstr "G"
+#: editor_regions.cc:167
+msgid "Gain|G"
+msgstr ""
 
-#: editor_regions.cc:120
+#: editor_regions.cc:167
 msgid "Region position glued to Bars|Beats time?"
 msgstr "Posizione della regione incollata a battiti|battute?"
 
-#: editor_regions.cc:121 editor_routes.cc:211 gain_meter.cc:793
-#: mixer_strip.cc:2032 meter_strip.cc:359 panner_ui.cc:603
-#: route_time_axis.cc:2713 stereo_panner.cc:271 time_axis_view.cc:1190
-msgid "M"
-msgstr "M"
-
-#: editor_regions.cc:121
+#: editor_regions.cc:168
 msgid "Region muted?"
 msgstr "Mutare la regione?"
 
-#: editor_regions.cc:122 mixer_strip.cc:1855
-msgid "O"
-msgstr "O"
+#: editor_regions.cc:169
+msgid "Opaque|O"
+msgstr ""
 
-#: editor_regions.cc:122
+#: editor_regions.cc:169
 msgid "Region opaque (blocks regions below it from being heard)?"
 msgstr ""
 "Opacizza regione (impedisce anche alle regioni sottostanti di essere "
 "ascoltate)?"
 
-#: editor_regions.cc:311 editor_regions.cc:316 editor_regions.cc:318
+#: editor_regions.cc:360 editor_regions.cc:365 editor_regions.cc:367
 msgid "Hidden"
 msgstr "Nascosto"
 
-#: editor_regions.cc:391
+#: editor_regions.cc:432
 msgid "(MISSING) "
 msgstr "(MANCANTE)"
 
-#: editor_regions.cc:459
+#: editor_regions.cc:500
 msgid ""
 "Do you really want to remove unused regions?\n"
 "(This is destructive and cannot be undone)"
@@ -5685,179 +6351,187 @@ msgstr ""
 "Vuoi veramente rimuovere le regioni inutilizzate?\n"
 "(Questa azione non può essere annullata)"
 
-#: editor_regions.cc:463
+#: editor_regions.cc:504
 msgid "Yes, remove."
 msgstr "Si, rimuovi."
 
-#: editor_regions.cc:465
+#: editor_regions.cc:506
 msgid "Remove unused regions"
 msgstr "Rimuovi le regioni inutilizzate"
 
-#: editor_regions.cc:818 editor_regions.cc:832 editor_regions.cc:846
+#: editor_regions.cc:735
+msgid "EditorRegions::format_position: negative timecode position: %1"
+msgstr ""
+
+#: editor_regions.cc:900 editor_regions.cc:916 editor_regions.cc:930
 msgid "Mult."
 msgstr "Mult."
 
-#: editor_regions.cc:849 midi_list_editor.cc:104 time_info_box.cc:94
+#: editor_regions.cc:933 midi_list_editor.cc:104 time_info_box.cc:88
 msgid "Start"
 msgstr "Inizio"
 
-#: editor_regions.cc:867 editor_regions.cc:883
+#: editor_regions.cc:951 editor_regions.cc:967
 msgid "Multiple"
 msgstr "Multipli"
 
-#: editor_regions.cc:952
+#: editor_regions.cc:1036
 msgid "MISSING "
 msgstr "MANCANTE"
 
-#: editor_routes.cc:182 editor_routes.cc:214
+#: editor_routes.cc:126
+msgid "RS"
+msgstr ""
+
+#: editor_routes.cc:208
 msgid "SS"
 msgstr "SS"
 
-#: editor_routes.cc:206
+#: editor_routes.cc:233
 msgid "Track/Bus Name"
 msgstr "Nome traccia/bus"
 
-#: editor_routes.cc:207
+#: editor_routes.cc:234
 msgid "Track/Bus visible ?"
 msgstr "Traccia/bus visibile?"
 
-#: editor_routes.cc:208 mixer_strip.cc:2046 meter_strip.cc:371
-#: route_time_axis.cc:105 route_time_axis.cc:2701
-msgid "A"
-msgstr "A"
-
-#: editor_routes.cc:208
+#: editor_routes.cc:235
 msgid "Track/Bus active ?"
 msgstr "Traccia/bus attiva?"
 
-#: editor_routes.cc:209 mixer_strip.cc:2033 mixer_strip.cc:2054
-#: meter_strip.cc:379
-msgid "I"
-msgstr "I"
+#: editor_routes.cc:236
+msgid "MidiInput|I"
+msgstr ""
 
-#: editor_routes.cc:209
+#: editor_routes.cc:236
 msgid "MIDI input enabled"
 msgstr "Ingresso MIDI abilitato"
 
-#: editor_routes.cc:210 mono_panner.cc:220 panner2d.cc:241
-#: stereo_panner.cc:249 stereo_panner.cc:276
-msgid "R"
-msgstr "R"
+#: editor_routes.cc:237
+msgid "Rec|R"
+msgstr ""
 
-#: editor_routes.cc:210
+#: editor_routes.cc:237
 msgid "Record enabled"
 msgstr "Registrazione abilitata"
 
-#: editor_routes.cc:211
+#: editor_routes.cc:238
+msgid "Rec|RS"
+msgstr ""
+
+#: editor_routes.cc:238
+msgid "Record Safe"
+msgstr ""
+
+#: editor_routes.cc:239
 msgid "Muted"
 msgstr "Muta"
 
-#: editor_routes.cc:212 mixer_strip.cc:2042 meter_strip.cc:367
-#: route_time_axis.cc:2710
-msgid "S"
-msgstr "S"
-
-#: editor_routes.cc:212
+#: editor_routes.cc:240
 msgid "Soloed"
 msgstr "In solo"
 
-#: editor_routes.cc:213
-msgid "SI"
-msgstr "SI"
+#: editor_routes.cc:241
+msgid "SoloIso|SI"
+msgstr ""
 
-#: editor_routes.cc:213
+#: editor_routes.cc:241
 msgid "Solo Isolated"
 msgstr "Solo isolato"
 
-#: editor_routes.cc:214
+#: editor_routes.cc:242
+msgid "SoloLock|SS"
+msgstr ""
+
+#: editor_routes.cc:242
 msgid "Solo Safe (Locked)"
 msgstr "Solo (bloccata)"
 
-#: editor_routes.cc:477 mixer_ui.cc:1197
+#: editor_routes.cc:550 mixer_ui.cc:1498
 msgid "Hide All"
 msgstr "Nascondi tutto"
 
-#: editor_routes.cc:478 mixer_ui.cc:1198
+#: editor_routes.cc:551 mixer_ui.cc:1499
 msgid "Show All Audio Tracks"
 msgstr "Mostra tutte le tracce audio"
 
-#: editor_routes.cc:479 mixer_ui.cc:1199
+#: editor_routes.cc:552 mixer_ui.cc:1500
 msgid "Hide All Audio Tracks"
 msgstr "Nascondi tutte le tracce audio"
 
-#: editor_routes.cc:480 mixer_ui.cc:1200
+#: editor_routes.cc:553 mixer_ui.cc:1501
 msgid "Show All Audio Busses"
 msgstr "Mostra tutti i Bus Audio"
 
-#: editor_routes.cc:481 mixer_ui.cc:1201
+#: editor_routes.cc:554 mixer_ui.cc:1502
 msgid "Hide All Audio Busses"
 msgstr "Nascondi tutti i Bus Audio"
 
-#: editor_routes.cc:482
+#: editor_routes.cc:555 mixer_ui.cc:1503
 msgid "Show All Midi Tracks"
 msgstr "Mostra tutte le tracce MIDI"
 
-#: editor_routes.cc:483
+#: editor_routes.cc:556 mixer_ui.cc:1504
 msgid "Hide All Midi Tracks"
 msgstr "Nascondi tutte le tracce MIDI"
 
-#: editor_routes.cc:484
-msgid "Show Tracks With Regions Under Playhead"
-msgstr "Mostra le tracce che hanno regioni sotto la testina"
+#: editor_routes.cc:557
+msgid "Only Show Tracks with Regions Under Playhead"
+msgstr ""
 
-#: editor_rulers.cc:211
+#: editor_rulers.cc:212
 msgid "New location marker"
 msgstr "Marcatore di nuova posizione"
 
-#: editor_rulers.cc:212
+#: editor_rulers.cc:213
 msgid "Clear all locations"
 msgstr "Pulisci tutte le posizioni"
 
-#: editor_rulers.cc:213
+#: editor_rulers.cc:214
 msgid "Unhide locations"
 msgstr "Scopri le posizioni"
 
-#: editor_rulers.cc:217
+#: editor_rulers.cc:218
 msgid "New range"
 msgstr "Nuovo intervallo"
 
-#: editor_rulers.cc:218
+#: editor_rulers.cc:219
 msgid "Clear all ranges"
 msgstr "Pulisci tutti gli intervalli"
 
-#: editor_rulers.cc:219
+#: editor_rulers.cc:220
 msgid "Unhide ranges"
 msgstr "Scopri gli intervalli"
 
 #: editor_rulers.cc:224
-msgid "Make Loop range"
+msgid "New Loop range"
 msgstr ""
 
 #: editor_rulers.cc:225
-msgid "Make Punch range"
+msgid "New Punch range"
 msgstr ""
 
 #: editor_rulers.cc:230
 msgid "New CD track marker"
 msgstr "Nuovo marcatore di traccia CD"
 
-#: editor_rulers.cc:235 tempo_dialog.cc:38
+#: editor_rulers.cc:234 tempo_dialog.cc:38
 msgid "New Tempo"
 msgstr "Nuovo tempo"
 
-#: editor_rulers.cc:239 tempo_dialog.cc:296
+#: editor_rulers.cc:238 tempo_dialog.cc:419
 msgid "New Meter"
 msgstr "Nuovo Meter"
 
-#: editor_snapshots.cc:137
+#: editor_snapshots.cc:149
 msgid "Rename Snapshot"
 msgstr "Rinomina istantanea"
 
-#: editor_snapshots.cc:139
+#: editor_snapshots.cc:151
 msgid "New name of snapshot"
 msgstr "Nuovo nome dell'istantanea"
 
-#: editor_snapshots.cc:157
+#: editor_snapshots.cc:169
 msgid ""
 "Do you really want to remove snapshot \"%1\" ?\n"
 "(which cannot be undone)"
@@ -5865,35 +6539,39 @@ msgstr ""
 "Vuoi veramente rimuovere l'istantanea \"%1\" ?\n"
 "(questa azione non potrà essere annullata)"
 
-#: editor_snapshots.cc:162
+#: editor_snapshots.cc:174
 msgid "Remove snapshot"
 msgstr "Rimuovi l'istantanea"
 
-#: editor_tempodisplay.cc:194 editor_tempodisplay.cc:234
-msgid "add"
-msgstr "aggiungi"
-
-#: editor_tempodisplay.cc:215
+#: editor_tempodisplay.cc:318
 msgid "add tempo mark"
 msgstr "agggiungi marcatore di tempo"
 
-#: editor_tempodisplay.cc:254
+#: editor_tempodisplay.cc:343
+msgid "add"
+msgstr "aggiungi"
+
+#: editor_tempodisplay.cc:362
 msgid "add meter mark"
 msgstr "agggiungi marcatore di misurazione"
 
-#: editor_tempodisplay.cc:287 editor_tempodisplay.cc:315
+#: editor_tempodisplay.cc:401 editor_tempodisplay.cc:435
 msgid "done"
 msgstr "fatto"
 
-#: editor_tempodisplay.cc:304 editor_tempodisplay.cc:330
+#: editor_tempodisplay.cc:422
+msgid "replace meter mark"
+msgstr ""
+
+#: editor_tempodisplay.cc:454
 msgid "replace tempo mark"
 msgstr "sostituisci il marcatore di tempo"
 
-#: editor_tempodisplay.cc:353 editor_tempodisplay.cc:387
+#: editor_tempodisplay.cc:485 editor_tempodisplay.cc:519
 msgid "remove tempo mark"
 msgstr "Rimuovi marcatore di tempo"
 
-#: editor_tempodisplay.cc:370
+#: editor_tempodisplay.cc:502
 msgid ""
 "programming error: meter marker canvas item has no marker object pointer!"
 msgstr ""
@@ -5902,43 +6580,51 @@ msgstr ""
 msgid "stretch/shrink"
 msgstr "allunga/restringi"
 
-#: editor_timefx.cc:129
+#: editor_timefx.cc:130
 msgid "pitch shift"
 msgstr "sposta l'intonazione"
 
-#: editor_timefx.cc:301
+#: editor_timefx.cc:282
 msgid "timefx cannot be started - thread creation error"
 msgstr ""
 
-#: engine_dialog.cc:83
+#: engine_dialog.cc:86
 msgid "Device Control Panel"
 msgstr "Pannello di controllo del dispositivo"
 
-#: engine_dialog.cc:84
+#: engine_dialog.cc:87
 msgid "Midi Device Setup"
 msgstr "Impostazioni del dispositivo midi"
 
-#: engine_dialog.cc:85 engine_dialog.cc:2097
+#: engine_dialog.cc:89
+msgid "Refresh Devices"
+msgstr ""
+
+#: engine_dialog.cc:90
+msgid "Use Buffered I/O"
+msgstr ""
+
+#: engine_dialog.cc:91 engine_dialog.cc:3000
 msgid "Measure"
 msgstr "Misura"
 
-#: engine_dialog.cc:86
+#: engine_dialog.cc:92
 msgid "Use results"
 msgstr "Utilizza i risultati"
 
-#: engine_dialog.cc:87
+#: engine_dialog.cc:93
 msgid "Back to settings ... (ignore results)"
 msgstr "Torna alle impostazioni ... (ignora i risultati)"
 
-#: engine_dialog.cc:88
+#: engine_dialog.cc:94
 msgid "Calibrate Audio"
 msgstr "Calibra audio"
 
-#: engine_dialog.cc:92
+#: engine_dialog.cc:98
 msgid "Back to settings"
 msgstr "Torna alle impostazioni"
 
-#: engine_dialog.cc:111
+#: engine_dialog.cc:120
 msgid ""
 "No audio/MIDI backends detected. %1 cannot run\n"
 "\n"
@@ -5949,100 +6635,109 @@ msgstr ""
 "(Questo è un errore di compilazione/pacchettizzazione/sistema. Non dovrebbe "
 "mai accadere.)"
 
-#: engine_dialog.cc:137
+#: engine_dialog.cc:145
 msgid "Latency Measurement Tool"
 msgstr "Misura della latenza"
 
-#: engine_dialog.cc:149
+#: engine_dialog.cc:157
 msgid ""
 "<span weight=\"bold\">Turn down the volume on your audio equipment to a very "
 "low level.</span>"
 msgstr "<span weight=\"bold\">Abbassa il volume ad un livello minimo.</span>"
 
-#: engine_dialog.cc:158
+#: engine_dialog.cc:166
 msgid "Select two channels below and connect them using a cable."
 msgstr "Seleziona due canali qui sotto e connettili utilizzando un cavo."
 
-#: engine_dialog.cc:163
+#: engine_dialog.cc:171
 msgid "Output channel"
 msgstr "Canale di uscita"
 
-#: engine_dialog.cc:171
+#: engine_dialog.cc:179
 msgid "Input channel"
 msgstr "Canale di ingresso"
 
-#: engine_dialog.cc:206
+#: engine_dialog.cc:213
 msgid "Once the channels are connected, click the \"Measure\" button."
 msgstr "Quando i canali saranno collegati clicca il pulsante \"Misura\"."
 
-#: engine_dialog.cc:213
+#: engine_dialog.cc:220
 msgid "When satisfied with the results, click the \"Use results\" button."
 msgstr ""
 "Quando sei soddisfatto dei risultati clicca il pulsante \"Utilizza i "
 "risultati\"."
 
-#: engine_dialog.cc:228 engine_dialog.cc:2217 engine_dialog.cc:2227
+#: engine_dialog.cc:235 engine_dialog.cc:3138 engine_dialog.cc:3148
 msgid "No measurement results yet"
 msgstr "Ancora nessun risulato della misura"
 
-#: engine_dialog.cc:238 route_params_ui.cc:106
+#: engine_dialog.cc:245 route_params_ui.cc:106
 msgid "Latency"
 msgstr "Latenza"
 
-#: engine_dialog.cc:372
+#: engine_dialog.cc:520
 msgid "Audio System:"
 msgstr "Sistema audio:"
 
-#: engine_dialog.cc:409
+#: engine_dialog.cc:564
 msgid "Driver:"
 msgstr "Driver:"
 
-#: engine_dialog.cc:415
+#: engine_dialog.cc:571
+msgid "Input Device:"
+msgstr ""
+
+#: engine_dialog.cc:575
+msgid "Output Device:"
+msgstr ""
+
+#: engine_dialog.cc:582
 msgid "Device:"
 msgstr "Dispositivo:"
 
-#: engine_dialog.cc:420 engine_dialog.cc:519 sfdb_ui.cc:153 sfdb_ui.cc:348
-#: sfdb_ui.cc:353
+#: engine_dialog.cc:591 engine_dialog.cc:699 export_report.cc:164
+#: export_report.cc:328 sfdb_ui.cc:153 sfdb_ui.cc:348 sfdb_ui.cc:353
 msgid "Sample rate:"
 msgstr "Frequenza di campionamento"
 
-#: engine_dialog.cc:426 engine_dialog.cc:526
+#: engine_dialog.cc:597 engine_dialog.cc:706
 msgid "Buffer size:"
 msgstr "Dimenzione buffer:"
 
-#: engine_dialog.cc:444
+#: engine_dialog.cc:606
+msgid "Periods:"
+msgstr ""
+
+#: engine_dialog.cc:624
 msgid "Input Channels:"
 msgstr "Canali di ingresso:"
 
-#: engine_dialog.cc:457
+#: engine_dialog.cc:637
 msgid "Output Channels:"
 msgstr "Canali di uscita:"
 
-#: engine_dialog.cc:469
+#: engine_dialog.cc:649
 msgid "Hardware input latency:"
 msgstr "Latenza in ingresso:"
 
-#: engine_dialog.cc:472 engine_dialog.cc:485
+#: engine_dialog.cc:652 engine_dialog.cc:665
 msgid "samples"
 msgstr "campioni"
 
-#: engine_dialog.cc:482
+#: engine_dialog.cc:662
 msgid "Hardware output latency:"
 msgstr "Latenza in uscita:"
 
-#: engine_dialog.cc:493
+#: engine_dialog.cc:673
 msgid "MIDI System:"
 msgstr ""
 
-#: engine_dialog.cc:511
+#: engine_dialog.cc:691
 msgid ""
-"The %1 audio backend was configured and started externally.\n"
-"This limits your control over it."
+"%1 is already running. %2 will connect to it and use the existing settings."
 msgstr ""
-"Il finale audio di %1 è stato configurato ed avviato dall'esterno.\n"
-"Questo limita il tuo controllo su di esso."
 
-#: engine_dialog.cc:564
+#: engine_dialog.cc:744
 msgid ""
 "Failed to start or connect to audio-engine.\n"
 "\n"
@@ -6052,7 +6747,7 @@ msgstr ""
 "\n"
 "La calibrazione della latenza richiede una interfaccia audio funzionante."
 
-#: engine_dialog.cc:570
+#: engine_dialog.cc:750
 msgid ""
 "Your selected audio configuration is playback- or capture-only.\n"
 "\n"
@@ -6063,169 +6758,202 @@ msgstr ""
 "\n"
 "La calibrazione della latenza richiede entrambe."
 
-#: engine_dialog.cc:651
+#: engine_dialog.cc:965
 msgid "MIDI Devices"
 msgstr "Dispositivi MIDI"
 
-#: engine_dialog.cc:657
+#: engine_dialog.cc:971
 msgid "Device"
 msgstr "Dispositivo"
 
-#: engine_dialog.cc:659
+#: engine_dialog.cc:973
 msgid "Hardware Latencies"
 msgstr "Latenze dell'hardware"
 
-#: engine_dialog.cc:700
+#: engine_dialog.cc:1014
 msgid "Calibrate"
 msgstr "Calibra"
 
-#: engine_dialog.cc:800
+#: engine_dialog.cc:1117
 msgid "all available channels"
 msgstr "tutti i canali disponibili"
 
-#: engine_dialog.cc:1039 latency_gui.cc:39
-#, fuzzy
-msgid "sample"
-msgid_plural "samples"
-msgstr[0] "campione"
-msgstr[1] "campione"
+#: engine_dialog.cc:1599 latency_gui.cc:55
+msgid "%1 sample"
+msgid_plural "%1 samples"
+msgstr[0] "%1 campione"
+msgstr[1] "%1 campioni"
 
-#: engine_dialog.cc:1090
+#: engine_dialog.cc:1662
 #, c-format
 msgid "(%.1f ms)"
 msgstr "(%.1f ms)"
 
-#: engine_dialog.cc:1593
+#: engine_dialog.cc:2413
 msgid "Could not start backend engine %1"
 msgstr "Impossibile avviare il finale audio %1"
 
-#: engine_dialog.cc:1644
+#: engine_dialog.cc:2445
 msgid "Cannot set driver to %1"
 msgstr "Impossibile impostare il driver a %1"
 
-#: engine_dialog.cc:1648
+#: engine_dialog.cc:2450
+msgid "Cannot set input device name to %1"
+msgstr ""
+
+#: engine_dialog.cc:2454
+msgid "Cannot set output device name to %1"
+msgstr ""
+
+#: engine_dialog.cc:2459
 msgid "Cannot set device name to %1"
 msgstr "Impossibile impostare il nome del dispositivo a %1"
 
-#: engine_dialog.cc:1652
+#: engine_dialog.cc:2464
 msgid "Cannot set sample rate to %1"
 msgstr "Impossibile impostare la frequenza di campionamento a %1"
 
-#: engine_dialog.cc:1656
+#: engine_dialog.cc:2468
 msgid "Cannot set buffer size to %1"
 msgstr "Impossibile impostare la dimensione del buffer a %1"
 
-#: engine_dialog.cc:1662
+#: engine_dialog.cc:2472
+msgid "Cannot set periods to %1"
+msgstr ""
+
+#: engine_dialog.cc:2478
 msgid "Cannot set input channels to %1"
 msgstr "Impossibile impostare i canali di ingresso a %1"
 
-#: engine_dialog.cc:1666
+#: engine_dialog.cc:2482
 msgid "Cannot set output channels to %1"
 msgstr "Impossibile impostare i canali di output a %1"
 
-#: engine_dialog.cc:1672
+#: engine_dialog.cc:2488
 msgid "Cannot set input latency to %1"
 msgstr "Impossibile impostere la latenza in ingresso a %1"
 
-#: engine_dialog.cc:1676
+#: engine_dialog.cc:2492
 msgid "Cannot set output latency to %1"
 msgstr "Impossibile impostare la latenza in uscita a %1"
 
-#: engine_dialog.cc:1955 engine_dialog.cc:2014
+#: engine_dialog.cc:2851 engine_dialog.cc:2917
 msgid "No signal detected "
 msgstr "Nessun segnale rilevato"
 
-#: engine_dialog.cc:1968 engine_dialog.cc:2022 port_insert_ui.cc:70
+#: engine_dialog.cc:2858
+msgid ""
+"Input signal is > -3dBFS. Lower the signal level (output gain, input gain) "
+"on the audio-interface."
+msgstr ""
+
+#: engine_dialog.cc:2871 engine_dialog.cc:2925 port_insert_ui.cc:70
 #: port_insert_ui.cc:98
 msgid "Disconnected from audio engine"
 msgstr "Disconnesso dal motore audio"
 
-#: engine_dialog.cc:1977 engine_dialog.cc:2030
+#: engine_dialog.cc:2880 engine_dialog.cc:2933
 msgid "Detected roundtrip latency: "
 msgstr "Rilevata latenza a/r:"
 
-#: engine_dialog.cc:1979 engine_dialog.cc:2032
+#: engine_dialog.cc:2882 engine_dialog.cc:2935
 msgid "Systemic latency: "
 msgstr "Latenza sistemica:"
 
-#: engine_dialog.cc:1986
+#: engine_dialog.cc:2889
 msgid "(signal detection error)"
 msgstr "(errore nella rilevazione del segnale)"
 
-#: engine_dialog.cc:1992
+#: engine_dialog.cc:2895
 msgid "(inverted - bad wiring)"
 msgstr "(invertito - cattivo cablaggio)"
 
-#: engine_dialog.cc:2039
+#: engine_dialog.cc:2942
 msgid "(averaging)"
 msgstr ""
 
-#: engine_dialog.cc:2045
+#: engine_dialog.cc:2948
 msgid "(too large jitter)"
 msgstr ""
 
-#: engine_dialog.cc:2049
+#: engine_dialog.cc:2952
 msgid "(large jitter)"
 msgstr ""
 
-#: engine_dialog.cc:2061
+#: engine_dialog.cc:2964
 msgid "Timeout - large MIDI jitter."
 msgstr ""
 
-#: engine_dialog.cc:2077 port_insert_ui.cc:134
+#: engine_dialog.cc:2980 port_insert_ui.cc:134
 msgid "Detecting ..."
 msgstr "Rilevamento..."
 
-#: engine_dialog.cc:2171
+#: engine_dialog.cc:3081
 msgid "Disconnect from %1"
 msgstr "Disconnesso da %1"
 
-#: engine_dialog.cc:2175 mixer_strip.cc:1522 route_group_dialog.cc:45
-#: route_time_axis.cc:841
-msgid "Active"
-msgstr "Attivo"
+#: engine_dialog.cc:3086
+msgid "Running"
+msgstr ""
+
+#: engine_dialog.cc:3088
+msgid "Connected"
+msgstr ""
 
-#: engine_dialog.cc:2185
+#: engine_dialog.cc:3099
 msgid "Connect to %1"
 msgstr "Connetti a %1"
 
-#: engine_dialog.cc:2190
-msgid "Inactive"
-msgstr "Inattivo"
+#: engine_dialog.cc:3103 shuttle_control.cc:655
+msgid "Stopped"
+msgstr "Fermato"
 
-#: export_channel_selector.cc:45 sfdb_ui.cc:151
+#: export_channel_selector.cc:46 export_report.cc:159 export_report.cc:324
+#: sfdb_ui.cc:151
 msgid "Channels:"
 msgstr "Canali"
 
-#: export_channel_selector.cc:46
+#: export_channel_selector.cc:47
 msgid "Split to mono files"
 msgstr "Dividi in file mono"
 
-#: export_channel_selector.cc:182
+#: export_channel_selector.cc:197
 msgid "Bus or Track"
 msgstr "Bus o traccia"
 
-#: export_channel_selector.cc:459
+#: export_channel_selector.cc:474
 msgid "Region contents without fades nor region gain (channels: %1)"
 msgstr "La regione non contiene dissolvenze né guadagno (canali: %1)"
 
-#: export_channel_selector.cc:463
+#: export_channel_selector.cc:478
 msgid "Region contents with fades and region gain (channels: %1)"
 msgstr "La regione contiene dissolvenze e guadagno (canali: %1)"
 
-#: export_channel_selector.cc:467
+#: export_channel_selector.cc:482
 msgid "Track output (channels: %1)"
 msgstr "Uscita traccia (canali: %1)"
 
-#: export_channel_selector.cc:536
-msgid "Export region contents"
-msgstr "Esporta i contenuti della regione"
+#: export_channel_selector.cc:552
+msgid "Apply track/bus processing"
+msgstr ""
+
+#: export_channel_selector.cc:553
+msgid "Select all tracks"
+msgstr ""
+
+#: export_channel_selector.cc:554
+msgid "Select all busses"
+msgstr ""
+
+#: export_channel_selector.cc:555
+msgid "Deselect all"
+msgstr ""
 
-#: export_channel_selector.cc:537
-msgid "Export track output"
-msgstr "Esporta la traccia"
+#: export_channel_selector.cc:589
+msgid "Track name"
+msgstr ""
 
-#: export_dialog.cc:46
+#: export_dialog.cc:48
 msgid ""
 "<span color=\"#ffa755\">Some already existing files will be overwritten.</"
 "span>"
@@ -6233,16 +6961,16 @@ msgstr ""
 "<span color=\"#ffa755\">Alcuni file preesistenti verranno sovrascritti.</"
 "span>"
 
-#: export_dialog.cc:47
+#: export_dialog.cc:49
 msgid "List files"
 msgstr "Elenca i file"
 
-#: export_dialog.cc:158 export_format_dialog.cc:59
+#: export_dialog.cc:158 export_format_dialog.cc:67
 msgid "File format"
 msgstr "Formato del file"
 
-#: export_dialog.cc:159 export_timespan_selector.cc:374
-#: export_timespan_selector.cc:436
+#: export_dialog.cc:159 export_timespan_selector.cc:371
+#: export_timespan_selector.cc:433
 msgid "Time Span"
 msgstr "Arco di tempo"
 
@@ -6270,27 +6998,39 @@ msgstr "Inizializzazione dell'esportazione fallita: %1"
 msgid "Stop Export"
 msgstr "Ferma esportazione"
 
-#: export_dialog.cc:327
+#: export_dialog.cc:336
 msgid "export"
 msgstr "esportazione"
 
-#: export_dialog.cc:346
+#: export_dialog.cc:355
+msgid "Exporting '%3' (timespan %1 of %2)"
+msgstr "Esportazione '%3' (intervallo %1 di %2)"
+
+#: export_dialog.cc:360
 msgid "Normalizing '%3' (timespan %1 of %2)"
 msgstr "Normalizzazione '%3' (intervallo %1 di %2)"
 
-#: export_dialog.cc:350
-msgid "Exporting '%3' (timespan %1 of %2)"
-msgstr "Esportazione '%3' (intervallo %1 di %2)"
+#: export_dialog.cc:365
+msgid "Tagging '%3' (timespan %1 of %2)"
+msgstr ""
+
+#: export_dialog.cc:369
+msgid "Uploading '%3' (timespan %1 of %2)"
+msgstr ""
+
+#: export_dialog.cc:373
+msgid "Running Post Export Command for '%1'"
+msgstr ""
 
-#: export_dialog.cc:373 export_dialog.cc:375
+#: export_dialog.cc:401 export_dialog.cc:403
 msgid "<span color=\"#ffa755\">Error: "
 msgstr "<span color=\"#ffa755\">Errore: "
 
-#: export_dialog.cc:385
+#: export_dialog.cc:413
 msgid "<span color=\"#ffa755\">Warning: "
 msgstr "<span color=\"#ffa755\">Attenzione: "
 
-#: export_dialog.cc:387
+#: export_dialog.cc:415
 msgid ""
 "\n"
 "<span color=\"#ffa755\">Warning: "
@@ -6298,19 +7038,19 @@ msgstr ""
 "\n"
 "<span color=\"#ffa755\">Attenzione: "
 
-#: export_dialog.cc:411
+#: export_dialog.cc:439
 msgid "Export Selection"
 msgstr "Esporta selezione"
 
-#: export_dialog.cc:425
+#: export_dialog.cc:453
 msgid "Export Region"
 msgstr "Esporta regione"
 
-#: export_dialog.cc:434
+#: export_dialog.cc:462
 msgid "Source"
 msgstr "Sorgente"
 
-#: export_dialog.cc:450
+#: export_dialog.cc:478
 msgid "Stem Export"
 msgstr "Esportazione Stem"
 
@@ -6318,65 +7058,77 @@ msgstr "Esportazione Stem"
 msgid "Add another format"
 msgstr "Aggiungi un altro formato"
 
-#: export_file_notebook.cc:193
+#: export_file_notebook.cc:198
 msgid "Format"
 msgstr "Formato"
 
-#: export_file_notebook.cc:194
+#: export_file_notebook.cc:199
 msgid "Location"
 msgstr "Posizione"
 
-#: export_file_notebook.cc:195
+#: export_file_notebook.cc:200
 msgid "Upload to Soundcloud"
 msgstr "Carica su SoundCloud"
 
-#: export_file_notebook.cc:273
+#: export_file_notebook.cc:201
+msgid "Analyze Exported Audio"
+msgstr ""
+
+#: export_file_notebook.cc:286
 msgid "No format!"
 msgstr "Nessun formato!"
 
-#: export_file_notebook.cc:291
+#: export_file_notebook.cc:304
 msgid "Format %1: %2"
 msgstr "Formato %1: %2"
 
-#: export_filename_selector.cc:32
+#: export_filename_selector.cc:33
 msgid "Label:"
 msgstr "Etichetta:"
 
-#: export_filename_selector.cc:33
+#: export_filename_selector.cc:34 session_dialog.cc:310
 msgid "Session Name"
 msgstr "Nome della sessione"
 
-#: export_filename_selector.cc:34
+#: export_filename_selector.cc:35
+msgid "Timespan Name"
+msgstr ""
+
+#: export_filename_selector.cc:36
 msgid "Revision:"
 msgstr "Revisione"
 
-#: export_filename_selector.cc:36
+#: export_filename_selector.cc:38
 msgid "Folder:"
 msgstr "Cartella:"
 
-#: export_filename_selector.cc:37 session_import_dialog.cc:45
+#: export_filename_selector.cc:39 session_import_dialog.cc:45
 #: transcode_video_dialog.cc:59 video_server_dialog.cc:54
-#: video_server_dialog.cc:56 export_video_dialog.cc:81
-#: export_video_dialog.cc:83
+#: video_server_dialog.cc:56 export_video_dialog.cc:77
+#: export_video_dialog.cc:79
 msgid "Browse"
 msgstr "Sfoglia"
 
-#: export_filename_selector.cc:41
-msgid "<i>Build filename(s) from these components:</i>"
-msgstr "<i>Preparo il/i nome/i a partire da queste componenti:</i>"
+#: export_filename_selector.cc:40 export_report.cc:118
+msgid "Open Folder"
+msgstr ""
+
+#: export_filename_selector.cc:45
+msgid "Build filename(s) from these components:"
+msgstr ""
 
-#: export_filename_selector.cc:212
+#: export_filename_selector.cc:217
 msgid ""
 "<small><i>Sorry, no example filename can be shown at the moment</i></small>"
 msgstr ""
 "<small><i>Spiacente, non è possibile mostrare un esempio di nome in questo "
 "momento</i></small>"
 
-#: export_filename_selector.cc:214
-msgid "<small><i>Current (approximate) filename: \"%1\"</i></small>"
-msgstr "<small><i>Nome file (approssimativo): \"%1\"</i></small>"
+#: export_filename_selector.cc:219
+msgid "<i>Current (approximate) filename</i>: \"%1\""
+msgstr ""
 
-#: export_filename_selector.cc:250 export_filename_selector.cc:336
+#: export_filename_selector.cc:255 export_filename_selector.cc:402
 msgid ""
 "%1: this is only the directory/folder name, not the filename.\n"
 "The filename will be chosen from the information just above the folder "
@@ -6386,112 +7138,171 @@ msgstr ""
 "Il nome del file verrà scelto dalle informazioni immediatamente sopra il "
 "selettore della cartella."
 
-#: export_filename_selector.cc:322
+#: export_filename_selector.cc:378
+msgid "%1: this is not a valid directory/folder."
+msgstr ""
+
+#: export_filename_selector.cc:388
 msgid "Choose export folder"
 msgstr "Scegli la directory di esportazione"
 
-#: export_format_dialog.cc:31
+#: export_format_dialog.cc:32
 msgid "New Export Format Profile"
 msgstr "Nuovo profilo per il formato di esportazione"
 
-#: export_format_dialog.cc:31
+#: export_format_dialog.cc:32
 msgid "Edit Export Format Profile"
 msgstr "Modifica profilo per il formato di esportazione"
 
-#: export_format_dialog.cc:38
+#: export_format_dialog.cc:39
 msgid "Label: "
 msgstr "Etichetta:"
 
-#: export_format_dialog.cc:41 normalize_dialog.cc:42
-msgid "Normalize to:"
-msgstr "Normalizza a:"
+#: export_format_dialog.cc:42
+msgid "Normalize:"
+msgstr ""
+
+#: export_format_dialog.cc:43
+msgid "Peak"
+msgstr "Picco"
+
+#: export_format_dialog.cc:44
+msgid "Loudness"
+msgstr ""
+
+#: export_format_dialog.cc:50
+msgid "LUFS"
+msgstr ""
+
+#: export_format_dialog.cc:51
+msgid "dBTP"
+msgstr ""
 
-#: export_format_dialog.cc:46
+#: export_format_dialog.cc:54
 msgid "Trim silence at start"
 msgstr "Rimuovi il silenzio all'inizio"
 
-#: export_format_dialog.cc:47
+#: export_format_dialog.cc:55
 msgid "Add silence at start:"
 msgstr "Aggiungi silenzio all'inizio:"
 
-#: export_format_dialog.cc:50
+#: export_format_dialog.cc:58
 msgid "Trim silence at end"
 msgstr "Rimuovi il silenzio alla fine"
 
-#: export_format_dialog.cc:51
+#: export_format_dialog.cc:59
 msgid "Add silence at end:"
 msgstr "Aggiungi silenzio alla fine:"
 
-#: export_format_dialog.cc:54
+#: export_format_dialog.cc:62
 msgid ""
 "Command to run post-export\n"
-"(%f=full path & filename, %d=directory, %b=basename):"
+"(%f=file path, %d=directory, %b=basename, see tooltip for more):"
 msgstr ""
-"Comando per lanciare la post esportazione\n"
-"(%f=percorso completo & nome del file, %d=directory, %b=nome senza "
-"estensione):"
 
-#: export_format_dialog.cc:57
+#: export_format_dialog.cc:65
 msgid "Compatibility"
 msgstr "Compatibilità"
 
-#: export_format_dialog.cc:58
+#: export_format_dialog.cc:66
 msgid "Quality"
 msgstr "Qualità"
 
-#: export_format_dialog.cc:61
+#: export_format_dialog.cc:69
 msgid "Sample rate conversion quality:"
 msgstr "Qualità di conversione della frequenza di campionamento:"
 
-#: export_format_dialog.cc:68
+#: export_format_dialog.cc:76
 msgid "Dithering"
 msgstr "Dithering"
 
-#: export_format_dialog.cc:70
+#: export_format_dialog.cc:78
 msgid "Create CUE file for disk-at-once CD/DVD creation"
 msgstr "Crea il file CUE per la creazione del CD/DVD in modalità disk-at-once"
 
-#: export_format_dialog.cc:71
+#: export_format_dialog.cc:79
 msgid "Create TOC file for disk-at-once CD/DVD creation"
 msgstr "Crea il file TOC per la creazione del CD/DVD disk-at-once"
 
-#: export_format_dialog.cc:73
+#: export_format_dialog.cc:80
+msgid "Create chapter mark file for MP4 chapter marks"
+msgstr ""
+
+#: export_format_dialog.cc:82
 msgid "Tag file with session's metadata"
 msgstr "tag file con i metadati della sessione"
 
-#: export_format_dialog.cc:470
+#: export_format_dialog.cc:119
+msgid "∧"
+msgstr ""
+
+#: export_format_dialog.cc:124
+msgid ""
+"Normalize to EBU-R128 LUFS target loudness without exceeding the given true-"
+"peak limit. EBU-R128 normalization is only available for mono and stereo "
+"targets, true-peak works for any channel layout."
+msgstr ""
+
+#: export_format_dialog.cc:152
+msgid ""
+"%a Artist name\n"
+"%b File's base-name\n"
+"%c Copyright\n"
+"%d File's directory\n"
+"%f File's full absolute path\n"
+"%l Lyricist\n"
+"%n Session name\n"
+"%o Conductor\n"
+"%t Title\n"
+"%z Organization\n"
+"%A Album\n"
+"%C Comment\n"
+"%E Engineer\n"
+"%G Genre\n"
+"%L Total track count\n"
+"%M Mixer\n"
+"%N Timespan name\n"
+"%O Composer\n"
+"%P Producer\n"
+"%S Disc subtitle\n"
+"%T Track number\n"
+"%Y Year\n"
+"%Z Country"
+msgstr ""
+
+#: export_format_dialog.cc:537
 msgid "Best (sinc)"
 msgstr "Migliore (sinc)"
 
-#: export_format_dialog.cc:475
+#: export_format_dialog.cc:542
 msgid "Medium (sinc)"
 msgstr "Media (sinc)"
 
-#: export_format_dialog.cc:480
+#: export_format_dialog.cc:547
 msgid "Fast (sinc)"
 msgstr "Veloce (sinc)"
 
-#: export_format_dialog.cc:490
+#: export_format_dialog.cc:557
 msgid "Zero order hold"
 msgstr ""
 
-#: export_format_dialog.cc:895
+#: export_format_dialog.cc:981
 msgid "Linear encoding options"
 msgstr "Opzioni di codifica lineare"
 
-#: export_format_dialog.cc:911
+#: export_format_dialog.cc:997
 msgid "Ogg Vorbis options"
 msgstr "Opzioni Ogg Vorbis"
 
-#: export_format_dialog.cc:922
+#: export_format_dialog.cc:1008
 msgid "FLAC options"
 msgstr "Opzioni FLAC"
 
-#: export_format_dialog.cc:939
+#: export_format_dialog.cc:1025
 msgid "Broadcast Wave options"
 msgstr "Opzioni di trasmissione"
 
-#: export_format_selector.cc:136
+#: export_format_selector.cc:131
 msgid "Do you really want to remove the format?"
 msgstr "Vuoi veramente rimuovere il formato?"
 
@@ -6499,7 +7310,7 @@ msgstr "Vuoi veramente rimuovere il formato?"
 msgid "Preset"
 msgstr "Preimpostazione"
 
-#: export_preset_selector.cc:104
+#: export_preset_selector.cc:99
 msgid ""
 "The selected preset did not load successfully!\n"
 "Perhaps it references a format that has been removed?"
@@ -6507,23 +7318,194 @@ msgstr ""
 "Il preset selezionato non è stato caricato correttamente!\n"
 "Forse fa riferimento ad un formato che è stato rimosso?"
 
-#: export_preset_selector.cc:156
+#: export_preset_selector.cc:151
 msgid "Do you really want to remove this preset?"
 msgstr "Vuoi veramente rimuovere questa preimpostazione?"
 
-#: export_timespan_selector.cc:46
+#: export_report.cc:56
+msgid "Export Report/Analysis"
+msgstr ""
+
+#: export_report.cc:147 export_report.cc:327 sfdb_ui.cc:149
+msgid "Format:"
+msgstr "Formato:"
+
+#: export_report.cc:166 export_report.cc:328
+msgid "%1 Hz"
+msgstr ""
+
+#: export_report.cc:169 export_report.cc:336 transcode_video_dialog.cc:139
+msgid "Duration:"
+msgstr ""
+
+#: export_report.cc:177 export_report.cc:334
+msgid "Timecode:"
+msgstr ""
+
+#: export_report.cc:185
+msgid "Error:"
+msgstr ""
+
+#: export_report.cc:220 export_report.cc:440
+msgid "(too short integration time)"
+msgstr ""
+
+#: export_report.cc:222
+msgid "-888"
+msgstr ""
+
+#: export_report.cc:227 export_report.cc:353
+msgid "Peak:"
+msgstr ""
+
+#: export_report.cc:228 export_report.cc:360
+msgid "%1 dBFS"
+msgstr ""
+
+#: export_report.cc:229 export_report.cc:369
+msgid "True Peak:"
+msgstr ""
+
+#: export_report.cc:230 export_report.cc:376
+msgid "%1 dBTP"
+msgstr ""
+
+#: export_report.cc:231 export_report.cc:387
+msgid "Normalization Gain:"
+msgstr ""
+
+#: export_report.cc:232
+msgid "+888.88 dB"
+msgstr ""
+
+#: export_report.cc:234 export_report.cc:448
+msgid "Integrated Loudness:"
+msgstr ""
+
+#: export_report.cc:235 export_report.cc:454
+msgid "%1 LUFS"
+msgstr ""
+
+#: export_report.cc:236 export_report.cc:460
+msgid "Loudness Range:"
+msgstr ""
+
+#: export_report.cc:237 export_report.cc:466
+msgid "%1 LU"
+msgstr ""
+
+#: export_report.cc:247 export_report.cc:754
+msgid "100"
+msgstr ""
+
+#: export_report.cc:282 export_report.cc:650
+msgid "00:00:00.000"
+msgstr ""
+
+#: export_report.cc:288
+msgid "0|A8"
+msgstr ""
+
+#: export_report.cc:394
+msgid "%1 dB"
+msgstr ""
+
+#: export_report.cc:425 export_report.cc:433 export_report.cc:553
+msgid ""
+"Not\n"
+"Available"
+msgstr ""
+
+#: export_report.cc:493
+msgid ""
+"LUFS\n"
+"(short)"
+msgstr ""
+
+#: export_report.cc:503
+msgid "Multiplicity"
+msgstr ""
+
+#: export_report.cc:603
+msgid "Logscale|Lg"
+msgstr ""
+
+#: export_report.cc:604
+msgid "Rectified|Rf"
+msgstr ""
+
+#: export_report.cc:605
+msgid "Logscale"
+msgstr ""
+
+#: export_report.cc:606
+msgid "Rectified"
+msgstr ""
+
+#: export_report.cc:738
+msgid "Hz"
+msgstr ""
+
+#: export_report.cc:755
+msgid "500"
+msgstr ""
+
+#: export_report.cc:756
+msgid "1K"
+msgstr ""
+
+#: export_report.cc:757
+msgid "5K"
+msgstr ""
+
+#: export_report.cc:758
+msgid "10K"
+msgstr ""
+
+#: export_report.cc:844
+msgid "Writing Export Analysis Image: %1."
+msgstr ""
+
+#: export_report.cc:941 sfdb_ui.cc:293 sfdb_ui.cc:409
+msgid "Could not read file: %1 (%2)."
+msgstr "Editor: impossibile aprire il file %1 (%2)."
+
+#: export_report.cc:967 sfdb_ui.cc:458
+msgid "Could not access soundfile: "
+msgstr "Impossibile accedere al file audio"
+
+#: export_report.cc:1203
+msgid "-36"
+msgstr ""
+
+#: export_report.cc:1204 export_report.cc:1208 export_report.cc:1214
+#: export_report.cc:1217
+msgid "-18"
+msgstr ""
+
+#: export_report.cc:1205 export_report.cc:1209 export_report.cc:1215
+#: export_report.cc:1218 export_report.cc:1221 export_report.cc:1222
+msgid "-9"
+msgstr ""
+
+#: export_report.cc:1206 export_report.cc:1210 export_report.cc:1216
+#: export_report.cc:1219 export_report.cc:1223 export_report.cc:1224
+msgid "-3"
+msgstr ""
+
+#: export_timespan_selector.cc:44
 msgid "Show Times as:"
 msgstr "Mostra tempo come:"
 
-#: export_timespan_selector.cc:53 processor_box.cc:2466
+#: export_timespan_selector.cc:51 processor_box.cc:3683
 msgid "Select All"
 msgstr "Seleziona tutto"
 
-#: export_timespan_selector.cc:223 transform_dialog.cc:93
+#: export_timespan_selector.cc:220 transform_dialog.cc:93
 msgid " to "
 msgstr "a"
 
-#: export_timespan_selector.cc:367 export_timespan_selector.cc:426
+#: export_timespan_selector.cc:364 export_timespan_selector.cc:423
 msgid "Range"
 msgstr "Intervallo"
 
@@ -6539,36 +7521,39 @@ msgstr ""
 msgid "getSoundResourceFile: root = %1, != response"
 msgstr ""
 
-#: sfdb_freesound_mootcher.cc:410 rc_option_editor.cc:1824
+#: sfdb_freesound_mootcher.cc:410 rc_option_editor.cc:2416
 msgid "%1"
 msgstr "%1"
 
-#: gain_meter.cc:132 gain_meter.cc:400 gain_meter.cc:505 gain_meter.cc:896
+#: gain_meter.cc:137 gain_meter.cc:422 gain_meter.cc:527 gain_meter.cc:919
 msgid "-inf"
 msgstr "-inf"
 
-#: gain_meter.cc:147 gain_meter.cc:958
+#: gain_meter.cc:152 gain_meter.cc:983
 msgid "Fader automation mode"
 msgstr "Modalità di automazione fader"
 
-#: gain_meter.cc:148 gain_meter.cc:959
+#: gain_meter.cc:153 gain_meter.cc:984
 msgid "Fader automation type"
 msgstr "Tipo di automazione fader"
 
-#: gain_meter.cc:157 gain_meter.cc:829 panner_ui.cc:179 panner_ui.cc:639
+#: gain_meter.cc:162 gain_meter.cc:852 panner_ui.cc:179 panner_ui.cc:641
 msgid "Abs"
 msgstr "Abs"
 
-#: gain_meter.cc:796 mixer_strip.cc:2049 meter_strip.cc:374 panner_ui.cc:606
-#: route_time_axis.cc:104 route_time_axis.cc:2705
+#: gain_meter.cc:816 vca_master_strip.cc:78 vca_time_axis.cc:54
+msgid "M"
+msgstr "M"
+
+#: gain_meter.cc:819 vca_master_strip.cc:296
 msgid "P"
 msgstr "P"
 
-#: gain_meter.cc:799 panner_ui.cc:609
+#: gain_meter.cc:822
 msgid "T"
 msgstr "T"
 
-#: gain_meter.cc:802 panner_ui.cc:612
+#: gain_meter.cc:825
 msgid "W"
 msgstr "W"
 
@@ -6576,47 +7561,51 @@ msgstr "W"
 msgid "<span size=\"large\">Presets</span>"
 msgstr "<span size=\"large\">Presets</span>"
 
-#: generic_pluginui.cc:97
+#: generic_pluginui.cc:98 plugin_pin_dialog.cc:333
 msgid "Manual"
 msgstr "Manuale"
 
-#: generic_pluginui.cc:106
+#: generic_pluginui.cc:107
 msgid "All Automation"
 msgstr "Tutte le automazioni"
 
 #: generic_pluginui.cc:250
-msgid "Switches"
-msgstr "Interruttori"
-
-#: generic_pluginui.cc:260 generic_pluginui.cc:436 processor_box.cc:2440
-msgid "Controls"
-msgstr "Controlli"
-
-#: generic_pluginui.cc:293
 msgid "Plugin Editor: could not build control element for port %1"
 msgstr ""
 "Plugin Editor: impossibile creare elemento di controllo per la porta %1"
 
-#: generic_pluginui.cc:318
+#: generic_pluginui.cc:282
 msgid "Plugin Editor: no control for property %1"
 msgstr "Editor del plugin: nessuna proprietà di controllo per %1"
 
-#: generic_pluginui.cc:324
+#: generic_pluginui.cc:288
 msgid "Plugin Editor: could not build control element for property %1"
 msgstr ""
 
-#: generic_pluginui.cc:468
+#: generic_pluginui.cc:359
+msgid "Switches"
+msgstr "Interruttori"
+
+#: generic_pluginui.cc:369 generic_pluginui.cc:475 processor_box.cc:3653
+msgid "Controls"
+msgstr "Controlli"
+
+#: generic_pluginui.cc:510
 msgid "Meters"
 msgstr "Meters"
 
-#: generic_pluginui.cc:490
+#: generic_pluginui.cc:548
 msgid "Automation control"
 msgstr "Controllo automazione"
 
-#: generic_pluginui.cc:497
+#: generic_pluginui.cc:555
 msgid "Mgnual"
 msgstr "Manuale"
 
+#: generic_pluginui.cc:828
+msgid "This control cannot be automated"
+msgstr ""
+
 #: global_port_matrix.cc:158
 msgid "Audio Connection Manager"
 msgstr "Gestore delle connessioni audio"
@@ -6625,126 +7614,163 @@ msgstr "Gestore delle connessioni audio"
 msgid "MIDI Connection Manager"
 msgstr "Gestore delle connessionio MIDI"
 
-#: global_port_matrix.cc:201 io_selector.cc:211 mixer_strip.cc:793
-#: mixer_strip.cc:894
+#: global_port_matrix.cc:201 io_selector.cc:211 mixer_strip.cc:863
+#: mixer_strip.cc:966 monitor_section.cc:1430 monitor_selector.cc:189
+#: plugin_pin_dialog.cc:1757
 msgid "Disconnect"
 msgstr "Disconnetti"
 
-#: global_port_matrix.cc:207 io_selector.cc:217
+#: global_port_matrix.cc:207 io_selector.cc:217 monitor_selector.cc:195
 msgid "port"
 msgstr "entrata"
 
-#: group_tabs.cc:312
+#: group_tabs.cc:312 group_tabs.cc:321
 msgid "Selection..."
 msgstr "Selezione..."
 
-#: group_tabs.cc:313
+#: group_tabs.cc:313 group_tabs.cc:322
 msgid "Record Enabled..."
 msgstr "Registrazione abilitata"
 
-#: group_tabs.cc:314
+#: group_tabs.cc:314 group_tabs.cc:323
 msgid "Soloed..."
 msgstr "In solo..."
 
-#: group_tabs.cc:320
+#: group_tabs.cc:316
+msgid "Create New Group From..."
+msgstr ""
+
+#: group_tabs.cc:325
+msgid "Create New Group with Master From..."
+msgstr ""
+
+#: group_tabs.cc:344
 msgid "Create New Group ..."
 msgstr "Crea nuovo gruppo ..."
 
-#: group_tabs.cc:321
-msgid "Create New Group From"
-msgstr "Crea nuovo gruppo da"
+#: group_tabs.cc:345
+msgid "Create New Group with Control Master ..."
+msgstr ""
 
-#: group_tabs.cc:324
+#: group_tabs.cc:355
 msgid "Edit Group..."
 msgstr "Modifica gruppo..."
 
-#: group_tabs.cc:325
+#: group_tabs.cc:356
 msgid "Collect Group"
 msgstr "Raccogli gruppo"
 
-#: group_tabs.cc:326
+#: group_tabs.cc:357
 msgid "Remove Group"
 msgstr "Rimuovi gruppo"
 
-#: group_tabs.cc:329
+#: group_tabs.cc:368
+msgid "Assign Group to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:374
 msgid "Remove Subgroup Bus"
 msgstr ""
 
-#: group_tabs.cc:331
+#: group_tabs.cc:376
 msgid "Add New Subgroup Bus"
 msgstr "Aggiungi un nuovo bus sottogruppo"
 
-#: group_tabs.cc:333
+#: group_tabs.cc:378
 msgid "Add New Aux Bus (pre-fader)"
 msgstr "Aggiungi un nuovo bus ausiliario (pre-fader)"
 
-#: group_tabs.cc:334
+#: group_tabs.cc:379
 msgid "Add New Aux Bus (post-fader)"
 msgstr "Aggiungi un bus ausiliario (post-fader)"
 
-#: group_tabs.cc:340
+#: group_tabs.cc:404
+msgid "Assign Selection to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:415
+msgid "Assign Record Enabled to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:426
+msgid "Assign Soloed to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:429
 msgid "Enable All Groups"
 msgstr "Abilita tutti i gruppi"
 
-#: group_tabs.cc:341
+#: group_tabs.cc:430
 msgid "Disable All Groups"
 msgstr "Disabilita tutti i gruppi"
 
-#: insert_time_dialog.cc:46
+#: insert_remove_time_dialog.cc:52
+msgid "Time to remove"
+msgstr ""
+
+#: insert_remove_time_dialog.cc:52
 msgid "Time to insert:"
 msgstr "Tempo da inserire:"
 
-#: insert_time_dialog.cc:54
+#: insert_remove_time_dialog.cc:61
 msgid "Intersected regions should:"
 msgstr "Le regioni con intersezione dovrebbero:"
 
-#: insert_time_dialog.cc:57
+#: insert_remove_time_dialog.cc:64
 msgid "stay in position"
 msgstr "resta in posizione"
 
-#: insert_time_dialog.cc:58
+#: insert_remove_time_dialog.cc:65
 msgid "move"
 msgstr "sposta"
 
-#: insert_time_dialog.cc:59
+#: insert_remove_time_dialog.cc:66
 msgid "be split"
 msgstr "diviso"
 
-#: insert_time_dialog.cc:65
-msgid "Insert time on all the track's playlists"
-msgstr "Inserisci il tempo su tutte le tracce della scaletta"
+#: insert_remove_time_dialog.cc:73
+msgid "Apply to all the track's playlists"
+msgstr ""
 
-#: insert_time_dialog.cc:68
+#: insert_remove_time_dialog.cc:76
 msgid "Move glued regions"
 msgstr "Sposta regioni incollate"
 
-#: insert_time_dialog.cc:70
+#: insert_remove_time_dialog.cc:78
 msgid "Move markers"
 msgstr "Muovi i marcatori"
 
-#: insert_time_dialog.cc:73
+#: insert_remove_time_dialog.cc:81
 msgid "Move glued markers"
 msgstr "Sposta i marcatori incollati"
 
-#: insert_time_dialog.cc:78
+#: insert_remove_time_dialog.cc:86
 msgid "Move locked markers"
 msgstr "Sposta i marcatori bloccati"
 
-#: insert_time_dialog.cc:83
+#: insert_remove_time_dialog.cc:91
 msgid ""
 "Move tempo and meter changes\n"
 "<i>(may cause oddities in the tempo map)</i>"
 msgstr ""
 
-#: insert_time_dialog.cc:91
+#: insert_remove_time_dialog.cc:99
+msgid "Remove time"
+msgstr ""
+
+#: insert_remove_time_dialog.cc:99
 msgid "Insert time"
 msgstr "Inserisci tempo"
 
-#: instrument_selector.cc:62
+#: insert_remove_time_dialog.cc:174
+msgid "Invalid or zero duration entered. Please enter a valid duration"
+msgstr ""
+
+#: instrument_selector.cc:92
 msgid "-none-"
 msgstr "-nessuno-"
 
-#: interthread_progress_window.cc:103
+#: interthread_progress_window.cc:114
 msgid "Importing file: %1 of %2"
 msgstr "Importazione file: %1 di %2"
 
@@ -6752,181 +7778,314 @@ msgstr "Importazione file: %1 di %2"
 msgid "I/O selector"
 msgstr "Selettore I/O"
 
-#: io_selector.cc:266
+#: io_selector.cc:266 monitor_selector.cc:244
 msgid "%1 input"
 msgstr "entrata %1"
 
-#: io_selector.cc:268
+#: io_selector.cc:268 monitor_selector.cc:246
 msgid "%1 output"
 msgstr "uscita %1"
 
-#: keyboard.cc:70
+#: keyboard.cc:93
 msgid "your own"
 msgstr "il tuo"
 
-#: keyboard.cc:133 keyboard.cc:157
+#: keyboard.cc:157 keyboard.cc:181
 msgid "Default keybindings not found - %1 will be hard to use!"
 msgstr "Scorciatoie base non disponibili - %1 sarà difficile da utilizzare"
 
-#: keyboard.cc:136
+#: keyboard.cc:160
 msgid "Key bindings file \"%1\" not found. Default bindings used instead"
 msgstr ""
 "Il file \"%1\" delle scorciatoie da tastiera non disponibile. Verranno usate "
 "le scorciatoie di base"
 
-#: keyeditor.cc:54
-msgid "Remove shortcut"
-msgstr "Rimuovi scorciatoia"
+#: keyboard.cc:193
+msgid "Loading keybindings from %1"
+msgstr ""
 
-#: keyeditor.cc:63
-msgid "Action"
-msgstr "Azione"
+#: keyeditor.cc:67
+msgid "Colliding keybindings"
+msgstr ""
 
-#: keyeditor.cc:64
-msgid "Shortcut"
-msgstr "Scorciatoia"
+#: keyeditor.cc:68
+msgid ""
+"The key sequence is already bound. Please remove the other binding first."
+msgstr ""
+
+#: keyeditor.cc:77
+msgid "Key Bindings"
+msgstr "Scorciatoie da tastiera"
+
+#: keyeditor.cc:78
+msgid "Remove shortcut"
+msgstr "Rimuovi scorciatoia"
 
-#: keyeditor.cc:84
-msgid "Select an action, then press the key(s) to (re)set its shortcut"
+#: keyeditor.cc:80
+msgid "Search..."
 msgstr ""
-"Selezion un'azione, poi premi il tasto(i) per ripristinare o impostare la "
-"relativa scorciatoia"
 
-#: keyeditor.cc:98
-msgid "Reset Bindings to Defaults"
+#: keyeditor.cc:82
+msgid "Print"
 msgstr ""
 
-#: keyeditor.cc:263
-msgid "Main_menu"
-msgstr "Menù_principale"
+#: keyeditor.cc:93
+msgid "Click to reset search string"
+msgstr ""
 
-#: keyeditor.cc:265
-msgid "redirectmenu"
+#: keyeditor.cc:97
+msgid "To remove a shortcut select an action then press this: "
 msgstr ""
 
-#: keyeditor.cc:267
-msgid "Editor_menus"
+#: keyeditor.cc:109
+msgid "Reset Bindings to Defaults"
 msgstr ""
 
-#: keyeditor.cc:269
+#: keyeditor.cc:227 lua_script_manager.cc:41
+msgid "Action"
+msgstr "Azione"
+
+#: keyeditor.cc:228
+msgid "Shortcut"
+msgstr "Scorciatoia"
+
+#: keyeditor.cc:370
 msgid "RegionList"
 msgstr "CatalogoRegioni"
 
-#: keyeditor.cc:271
-msgid "ProcessorMenu"
+#: keyeditor.cc:543
+msgid "Could not open temporary file to print bindings (%1)"
 msgstr ""
 
-#: latency_gui.cc:40
-msgid "msec"
+#: keyeditor.cc:561
+msgid "Could not save bindings to file (%1)"
+msgstr ""
+
+#: latency_gui.cc:39
+#, fuzzy
+msgid "sample"
+msgstr "campione"
+
+#: latency_gui.cc:40
+msgid "msec"
 msgstr "ms"
 
 #: latency_gui.cc:41
 msgid "period"
 msgstr "periodo"
 
-#: latency_gui.cc:55
-msgid "%1 sample"
-msgid_plural "%1 samples"
-msgstr[0] "%1 campione"
-msgstr[1] "%1 campioni"
-
-#: latency_gui.cc:72 panner_ui.cc:409
+#: latency_gui.cc:72 panner_ui.cc:411 plugin_pin_dialog.cc:109
+#: plugin_ui.cc:421
 msgid "Reset"
 msgstr "Azzera"
 
-#: latency_gui.cc:149 rhythm_ferret.cc:273 sfdb_ui.cc:1912
+#: latency_gui.cc:149 rhythm_ferret.cc:295 sfdb_ui.cc:1878
 msgid "programming error: %1 (%2)"
 msgstr "Errore di programmazione:  %1 (%2)"
 
-#: location_ui.cc:52 location_ui.cc:54
+#: location_ui.cc:54 location_ui.cc:57
 msgid "Use PH"
 msgstr "Utilizza PH"
 
-#: location_ui.cc:59
+#: location_ui.cc:55 location_ui.cc:58
+msgid "Goto"
+msgstr ""
+
+#: location_ui.cc:63
 msgid "Glue"
 msgstr "Colla"
 
-#: location_ui.cc:87
+#: location_ui.cc:88
 msgid "Performer:"
 msgstr "Esecutore:"
 
-#: location_ui.cc:88
+#: location_ui.cc:89
 msgid "Composer:"
 msgstr "Compositore:"
 
-#: location_ui.cc:90
+#: location_ui.cc:91
 msgid "Pre-Emphasis"
 msgstr "Pre-enfasi"
 
-#: location_ui.cc:317
+#: location_ui.cc:319
 msgid "Remove this range"
 msgstr "Rimuovi questo intervallo"
 
-#: location_ui.cc:318
+#: location_ui.cc:320
 msgid "Start time - middle click to locate here"
 msgstr "Tempo d'inizio - clicca con il centrale per posizionarti qui"
 
-#: location_ui.cc:319
+#: location_ui.cc:321
 msgid "End time - middle click to locate here"
 msgstr "Tempo di fine - clicca con il centrale per posizionarti qui"
 
-#: location_ui.cc:322
+#: location_ui.cc:324
 msgid "Set range start from playhead location"
 msgstr "Imposta l'inizio intervallo dalla posizione della testina"
 
-#: location_ui.cc:323
+#: location_ui.cc:325
 msgid "Set range end from playhead location"
 msgstr "Imposta la fine dell'intervallo dalla posizione della testina"
 
-#: location_ui.cc:327
+#: location_ui.cc:329
 msgid "Remove this marker"
 msgstr "Rimuovi questo marcatore"
 
-#: location_ui.cc:328
+#: location_ui.cc:330
 msgid "Position - middle click to locate here"
 msgstr "Posizione - clicca con il centrale per posizionarti qui"
 
-#: location_ui.cc:330
+#: location_ui.cc:332
 msgid "Set marker time from playhead location"
 msgstr "Imposta il marcatore di tempo dalla posizione della testina"
 
-#: location_ui.cc:499
+#: location_ui.cc:524
 msgid "You cannot put a CD marker at the start of the session"
 msgstr "Impossibile inserire un marcatore CD all'inizio della sessione"
 
-#: location_ui.cc:725
+#: location_ui.cc:750
 msgid "New Marker"
 msgstr "Nuovo marcatore"
 
-#: location_ui.cc:726
+#: location_ui.cc:751
 msgid "New Range"
 msgstr "Nuovo Intervallo"
 
-#: location_ui.cc:739
+#: location_ui.cc:764
 msgid "<b>Loop/Punch Ranges</b>"
 msgstr "Intervalli di Ciclo/Punch"
 
-#: location_ui.cc:764
+#: location_ui.cc:790
 msgid "<b>Markers (Including CD Index)</b>"
 msgstr "<b>Marcatori (inclusi gli indici CD)</b>"
 
-#: location_ui.cc:799
+#: location_ui.cc:825
 msgid "<b>Ranges (Including CD Track Ranges)</b>"
 msgstr "<b>Intervalli (inclusi gli intervalli traccia CD)</b>"
 
-#: location_ui.cc:1042
+#: location_ui.cc:1068
 msgid "add range marker"
 msgstr "agggiungi marcatore di intervallo"
 
-#: main.cc:82
+#: lua_script_manager.cc:31
+msgid "Add/Set"
+msgstr ""
+
+#: lua_script_manager.cc:34
+msgid "Call"
+msgstr ""
+
+#: lua_script_manager.cc:35
+msgid "New Hook"
+msgstr ""
+
+#: lua_script_manager.cc:77
+msgid "Signal(s)"
+msgstr ""
+
+#: lua_script_manager.cc:127
+msgid "Action %1"
+msgstr ""
+
+#: lua_script_manager.cc:132 lua_script_manager.cc:227
+msgid "Unset"
+msgstr ""
+
+#: luainstance.cc:1079
+msgid "Cannot read script '%1': %2"
+msgstr ""
+
+#: luawindow.cc:97
+msgid "Run"
+msgstr ""
+
+#: luawindow.cc:98
+msgid "Clear Output"
+msgstr ""
+
+#: luawindow.cc:102
+msgid "Revert"
+msgstr ""
+
+#: luawindow.cc:166
+msgid "Select Editor Buffer"
+msgstr ""
+
+#: luawindow.cc:253 luawindow.cc:258
+msgid "Window|Lua"
+msgstr ""
+
+#: luawindow.cc:286 luawindow.cc:304
+msgid "LuaException: %1"
+msgstr ""
+
+#: luawindow.cc:342
+msgid "Deleted %1"
+msgstr ""
+
+#: luawindow.cc:345
+msgid "Failed to delete %1"
+msgstr ""
+
+#: luawindow.cc:411
+msgid ""
+"Missing script header.\n"
+"The script requires an '{ardour}' info table and a 'factory' function."
+msgstr ""
+
+#: luawindow.cc:416
+msgid "Script fails to compile."
+msgstr ""
+
+#: luawindow.cc:423
+msgid "Invalid or missing script-name or script-type."
+msgstr ""
+
+#: luawindow.cc:428
+msgid ""
+"Invalid script-type.\n"
+"Valid types are 'EditorAction' and 'Snippet'."
+msgstr ""
+
+#: luawindow.cc:439 luawindow.cc:490
+msgid "Saved as %1"
+msgstr ""
+
+#: luawindow.cc:442 luawindow.cc:493
+msgid "Error saving file: %1"
+msgstr ""
+
+#: luawindow.cc:452
+msgid ""
+"Script with given name '%1' already exists.\n"
+"Use a different name in the descriptor."
+msgstr ""
+
+#: luawindow.cc:636
+msgid "Scratch Buffer %1"
+msgstr ""
+
+#: luawindow.cc:638
+msgid "Action: '%1'"
+msgstr ""
+
+#: luawindow.cc:640
+msgid "Snippet: %1"
+msgstr ""
+
+#: luawindow.cc:652
+msgid "Save as"
+msgstr ""
+
+#: main.cc:88
 msgid "%1 could not connect to the audio backend."
 msgstr "%1 non è riuscito a connettersi al finale audio."
 
-#: main.cc:107 main.cc:123
+#: main.cc:135 main.cc:151
 msgid "The audio backend (%1) has failed, or terminated"
 msgstr "Il finale audio (%1) è stato terminato"
 
-#: main.cc:110
+#: main.cc:138
 msgid ""
 "%2 exited unexpectedly, and without notifying %1.\n"
 "\n"
@@ -6940,33 +8099,33 @@ msgstr ""
 "\n"
 "Clicca OK per uscire da %1."
 
-#: main.cc:124
+#: main.cc:152
 msgid "%2 exited unexpectedly, and without notifying %1."
 msgstr "%2 è uscito inaspettatamente e senza notificare %1."
 
-#: main.cc:219
+#: main.cc:247
 msgid ""
 "\n"
 "   %1 could not understand your command line      "
 msgstr ""
 
-#: main.cc:221
+#: main.cc:249
 msgid "An error was encountered while launching %1"
 msgstr ""
 
-#: main.cc:310
+#: main.cc:344
 msgid " (built using "
 msgstr "(compilato usando "
 
-#: main.cc:313
+#: main.cc:347
 msgid " and GCC version "
 msgstr " e la versione di GCC "
 
-#: main.cc:323
-msgid "Copyright (C) 1999-2012 Paul Davis"
-msgstr "Tutti i diritti (C) 1999-2012 Paul Davis"
+#: main.cc:357
+msgid "Copyright (C) 1999-2015 Paul Davis"
+msgstr ""
 
-#: main.cc:324
+#: main.cc:358
 msgid ""
 "Some portions Copyright (C) Steve Harris, Ari Johnson, Brett Viren, Joel "
 "Baker, Robin Gareus"
@@ -6974,47 +8133,67 @@ msgstr ""
 "Alcune parti Copyright (C) Steve Harris, Ari Johnson, Brett Viren, Joel "
 "Baker, Robin Gareus"
 
-#: main.cc:326
+#: main.cc:360
 msgid "%1 comes with ABSOLUTELY NO WARRANTY"
 msgstr "%1 è fornito SENZA ALCUNA GARANZIA"
 
-#: main.cc:327
+#: main.cc:361
 msgid "not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
 msgstr "neanche per la COMMERCIALIZZAZIONE o PER SCOPI PARTICOLARI."
 
-#: main.cc:328
+#: main.cc:362
 msgid "This is free software, and you are welcome to redistribute it "
 msgstr "Questo è software libero e siete i benvenuti se volete redistribuirlo "
 
-#: main.cc:329
+#: main.cc:363
 msgid "under certain conditions; see the source for copying conditions."
 msgstr ""
 "sotto determinate condizioni; leggere i sorgenti per le condizioni relative "
 "alla copia."
 
-#: main.cc:334
+#: main.cc:368
 msgid "could not initialize %1."
 msgstr "Impossibile inizializzare %1."
 
-#: main.cc:344
+#: main.cc:378
 msgid "Cannot xinstall SIGPIPE error handler"
 msgstr "Impossibile installare il gestore degli errori SIGPIPE "
 
-#: main.cc:351
+#: main.cc:385
+msgid "Could not complete pre-GUI initialization"
+msgstr ""
+
+#: main.cc:392
 msgid "could not create %1 GUI"
 msgstr "impossibile creare la GUI per %1"
 
-#: main_clock.cc:52
+#: main_clock.cc:51
 msgid "Display delta to edit cursor"
 msgstr ""
 
-#: marker.cc:273
+#: main_clock.cc:66 tempo_dialog.cc:55
+msgid "Edit Tempo"
+msgstr ""
+
+#: main_clock.cc:67 tempo_dialog.cc:429
+msgid "Edit Meter"
+msgstr ""
+
+#: main_clock.cc:68
+msgid "Insert Tempo Change"
+msgstr ""
+
+#: main_clock.cc:69
+msgid "Insert Meter Change"
+msgstr ""
+
+#: marker.cc:280
 msgid "MarkerText"
 msgstr ""
 
 #: midi_channel_selector.cc:161 midi_channel_selector.cc:400
-#: midi_channel_selector.cc:436 rc_option_editor.cc:1573
-#: rc_option_editor.cc:2203 sfdb_ui.cc:665
+#: midi_channel_selector.cc:436 rc_option_editor.cc:2157
+#: rc_option_editor.cc:2799 sfdb_ui.cc:671
 msgid "None"
 msgstr "Nessuna"
 
@@ -7095,11 +8274,11 @@ msgstr "Clicca per attivare/disattivare la riproduzione per il canale %1"
 msgid "Click to force all MIDI channel messages to channel %1"
 msgstr "Clicca per forzare tutti i messaggi di canale MIDI al canale %1 "
 
-#: midi_channel_selector.cc:718
+#: midi_channel_selector.cc:720
 msgid "Click to toggle recording of channel %1"
 msgstr "Clicca per attivare/disattivare la registrazione del canale %1"
 
-#: midi_channel_selector.cc:726
+#: midi_channel_selector.cc:728
 msgid "Click to force all recorded channels to %1"
 msgstr "Clicca per forzare tutti canali di registrazione sull'%1"
 
@@ -7211,192 +8390,188 @@ msgstr "modifica canale"
 msgid "velocity edit"
 msgstr "modifica velocity"
 
-#: midi_region_view.cc:954
+#: midi_region_view.cc:962
 msgid "add note"
 msgstr "aggiungi nota"
 
-#: midi_region_view.cc:1885
+#: midi_region_view.cc:1904
 msgid "step add"
 msgstr "aggiungi passo"
 
-#: midi_region_view.cc:1979 midi_region_view.cc:2002
+#: midi_region_view.cc:1998 midi_region_view.cc:2021
 msgid "alter patch change"
 msgstr ""
 
-#: midi_region_view.cc:2038
+#: midi_region_view.cc:2057
 msgid "add patch change"
 msgstr ""
 
-#: midi_region_view.cc:2060 midi_region_view.cc:2061
+#: midi_region_view.cc:2079 midi_region_view.cc:2080
 msgid "move patch change"
 msgstr ""
 
-#: midi_region_view.cc:2073 midi_region_view.cc:2074
+#: midi_region_view.cc:2092 midi_region_view.cc:2093
 msgid "delete patch change"
 msgstr ""
 
-#: midi_region_view.cc:2112
+#: midi_region_view.cc:2131
 msgid "delete selection"
 msgstr "cancella selezione"
 
-#: midi_region_view.cc:2128
+#: midi_region_view.cc:2148
 msgid "delete note"
 msgstr "Elimina nota"
 
-#: midi_region_view.cc:2587
+#: midi_region_view.cc:2589
 msgid "move notes"
 msgstr "muovi note"
 
-#: midi_region_view.cc:3070
+#: midi_region_view.cc:3139
 msgid "change velocities"
 msgstr "cambia le velocità"
 
-#: midi_region_view.cc:3136
+#: midi_region_view.cc:3205
 msgid "transpose"
 msgstr "trasponi"
 
-#: midi_region_view.cc:3164
+#: midi_region_view.cc:3233
 msgid "change note lengths"
 msgstr "cambia le durate"
 
-#: midi_region_view.cc:3240
+#: midi_region_view.cc:3309
 msgid "nudge"
 msgstr ""
 
-#: midi_region_view.cc:3255
+#: midi_region_view.cc:3324
 msgid "change channel"
 msgstr "cambia canale"
 
-#: midi_region_view.cc:3295
+#: midi_region_view.cc:3372
 msgid "Bank "
 msgstr "Banco"
 
-#: midi_region_view.cc:3296
-msgid "Program "
-msgstr "Programma"
-
-#: midi_region_view.cc:3297
+#: midi_region_view.cc:3374
 msgid "Channel "
 msgstr "Canale"
 
-#: midi_region_view.cc:3484
+#: midi_region_view.cc:3561
 msgid "paste"
 msgstr "Incolla"
 
-#: midi_streamview.cc:185
+#: midi_streamview.cc:184
 msgid "attempt to display MIDI region with no source"
 msgstr "tenta di mostrare le regioni MIDI senza sorgente"
 
-#: midi_streamview.cc:195
+#: midi_streamview.cc:194
 msgid "attempt to display MIDI region with no model"
 msgstr "tenta di mostrare le regioni MIDI senza modello"
 
-#: midi_streamview.cc:506
+#: midi_streamview.cc:505
 msgid "failed to create MIDI region"
 msgstr "errore nel crare la regione MIDI"
 
-#: midi_time_axis.cc:309
+#: midi_time_axis.cc:306
 msgid "External MIDI Device"
 msgstr "Dispositivo MIDI esterno"
 
-#: midi_time_axis.cc:310
+#: midi_time_axis.cc:307
 msgid "External Device Mode"
 msgstr "Modalità dispositivo esterno"
 
-#: midi_time_axis.cc:318
+#: midi_time_axis.cc:315
 msgid "Chns"
 msgstr "Chns"
 
-#: midi_time_axis.cc:320
+#: midi_time_axis.cc:317
 msgid "Click to edit channel settings"
 msgstr "Clicca per modificare le impostazioni del canale"
 
-#: midi_time_axis.cc:519
+#: midi_time_axis.cc:516
 msgid "Show Full Range"
 msgstr "Mostra tutto l'intervallo"
 
-#: midi_time_axis.cc:524
+#: midi_time_axis.cc:521
 msgid "Fit Contents"
 msgstr "Adatta i contenuti"
 
-#: midi_time_axis.cc:528
+#: midi_time_axis.cc:525
 msgid "Note Range"
 msgstr "Intervallo di nota"
 
-#: midi_time_axis.cc:529
+#: midi_time_axis.cc:526
 msgid "Note Mode"
 msgstr "Modalità nota"
 
-#: midi_time_axis.cc:530
+#: midi_time_axis.cc:527
 msgid "Channel Selector"
 msgstr "Selettore dei canali"
 
-#: midi_time_axis.cc:535
+#: midi_time_axis.cc:532
 msgid "Color Mode"
 msgstr "Modalità colore"
 
-#: midi_time_axis.cc:594
+#: midi_time_axis.cc:591
 msgid "Bender"
 msgstr ""
 
-#: midi_time_axis.cc:598
+#: midi_time_axis.cc:595
 msgid "Pressure"
 msgstr "Pressione"
 
-#: midi_time_axis.cc:610
+#: midi_time_axis.cc:607
 msgid "Controllers"
 msgstr "Controller"
 
-#: midi_time_axis.cc:615
+#: midi_time_axis.cc:612
 msgid "No MIDI Channels selected"
 msgstr "Nessun canale MIDI selezionato"
 
-#: midi_time_axis.cc:672 midi_time_axis.cc:801
+#: midi_time_axis.cc:669 midi_time_axis.cc:798
 msgid "Hide all channels"
 msgstr "Nascondi tutti i canali"
 
-#: midi_time_axis.cc:676 midi_time_axis.cc:805
+#: midi_time_axis.cc:673 midi_time_axis.cc:802
 msgid "Show all channels"
 msgstr "Mostra tutti i canali"
 
-#: midi_time_axis.cc:687 midi_time_axis.cc:816
+#: midi_time_axis.cc:684 midi_time_axis.cc:813
 msgid "Channel %1"
 msgstr "Canale %1"
 
-#: midi_time_axis.cc:942 midi_time_axis.cc:974
+#: midi_time_axis.cc:939 midi_time_axis.cc:971
 msgid "Controllers %1-%2"
 msgstr "Controller %1-%2"
 
-#: midi_time_axis.cc:965 midi_time_axis.cc:968
+#: midi_time_axis.cc:962 midi_time_axis.cc:965
 msgid "Controller %1"
 msgstr "Controller %1"
 
-#: midi_time_axis.cc:991
+#: midi_time_axis.cc:988
 msgid "Sustained"
 msgstr "Sostenuto"
 
-#: midi_time_axis.cc:998
+#: midi_time_axis.cc:995
 msgid "Percussive"
 msgstr "Percussivo"
 
-#: midi_time_axis.cc:1018
+#: midi_time_axis.cc:1015
 msgid "Meter Colors"
 msgstr "Colori del meter"
 
-#: midi_time_axis.cc:1025
+#: midi_time_axis.cc:1022
 msgid "Channel Colors"
 msgstr "Colore canale"
 
-#: midi_time_axis.cc:1032
+#: midi_time_axis.cc:1029
 msgid "Track Color"
 msgstr "Colore traccia"
 
-#: midi_time_axis.cc:1606 midi_time_axis.cc:1612 midi_time_axis.cc:1622
-#: midi_time_axis.cc:1628
+#: midi_time_axis.cc:1610 midi_time_axis.cc:1616 midi_time_axis.cc:1626
+#: midi_time_axis.cc:1632
 msgid "all"
 msgstr "tutti"
 
-#: midi_time_axis.cc:1609 midi_time_axis.cc:1625
+#: midi_time_axis.cc:1613 midi_time_axis.cc:1629
 msgid "some"
 msgstr "alcuni"
 
@@ -7412,7 +8587,7 @@ msgstr "Auto scorrimento"
 msgid "Decimal"
 msgstr "Decimale"
 
-#: midi_tracer.cc:57 rc_option_editor.cc:740
+#: midi_tracer.cc:57 rc_option_editor.cc:1356
 msgid "Enabled"
 msgstr "Abilitato"
 
@@ -7428,36 +8603,37 @@ msgstr "Porta:"
 msgid "New velocity"
 msgstr "Nuova velocity"
 
-#: missing_file_dialog.cc:35
+#: missing_file_dialog.cc:36
 msgid "Missing File"
 msgstr "File mancante"
 
-#: missing_file_dialog.cc:37
+#: missing_file_dialog.cc:38
 msgid "Select a folder to search"
 msgstr "Scegli una cartella da cercare"
 
-#: missing_file_dialog.cc:38
+#: missing_file_dialog.cc:39
 msgid "Add chosen folder to search path, and try again"
 msgstr ""
 "Aggiungere la cartella prescelta al percorso di ricerca e provare di nuovo."
 
-#: missing_file_dialog.cc:40
+#: missing_file_dialog.cc:41
 msgid "Stop loading this session"
 msgstr "Blocca il caricamento della sessione"
 
-#: missing_file_dialog.cc:41
+#: missing_file_dialog.cc:42
 msgid "Skip all missing files"
 msgstr "Salta tutti i file mancanti"
 
-#: missing_file_dialog.cc:42
+#: missing_file_dialog.cc:43
 msgid "Skip this file"
 msgstr "Salta questo file"
 
-#: missing_file_dialog.cc:53
+#: missing_file_dialog.cc:57 tempo_dialog.cc:135 tempo_dialog.cc:136
+#: tempo_dialog.cc:484 tempo_dialog.cc:485
 msgid "audio"
 msgstr "audio"
 
-#: missing_file_dialog.cc:70
+#: missing_file_dialog.cc:74
 msgid ""
 "%1 cannot find the %2 file\n"
 "\n"
@@ -7477,7 +8653,7 @@ msgstr ""
 "<tt>%4</tt>\n"
 "\n"
 
-#: missing_file_dialog.cc:104
+#: missing_file_dialog.cc:108
 msgid "Click to choose an additional folder"
 msgstr "Clicca per scegliere un'altra cartella"
 
@@ -7485,98 +8661,41 @@ msgstr "Clicca per scegliere un'altra cartella"
 msgid "Missing Plugins"
 msgstr "Plugin mancanti"
 
-#: missing_plugin_dialog.cc:33 transcode_video_dialog.cc:60
+#: missing_plugin_dialog.cc:36 transcode_video_dialog.cc:60
 msgid "OK"
 msgstr "Ok"
 
-#: mixer_actor.cc:55
-msgid "Toggle Solo on Mixer-Selected Tracks/Busses"
-msgstr "Attiva/disattiva il Solo sulle tracce/bus del mixer selezionate/i"
-
-#: mixer_actor.cc:56
-msgid "Toggle Mute on Mixer-Selected Tracks/Busses"
-msgstr "Attiva/disattiva il Muto sulle tracce/bus del mixer selezionate/i"
-
-#: mixer_actor.cc:57
-msgid "Toggle Rec-enable on Mixer-Selected Tracks/Busses"
-msgstr ""
-"Attiva/disattiva abilita registrazione sulle tracce/bus selezionate del mixer"
-
-#: mixer_actor.cc:58
-msgid "Decrease Gain on Mixer-Selected Tracks/Busses"
-msgstr "Diminuisci il Guadagno sulle tracce/bus selezionate del mixer"
-
-#: mixer_actor.cc:59
-msgid "Increase Gain on Mixer-Selected Tracks/Busses"
-msgstr "Aumenta il Guadagno sulle tracce/bus selezionate del mixer"
-
-#: mixer_actor.cc:60
-msgid "Set Gain to 0dB on Mixer-Selected Tracks/Busses"
-msgstr "Imposta il Guadagno a 0dB sulle tracce/bus selezionate del mixer"
-
-#: mixer_actor.cc:63
-msgid "Copy Selected Processors"
-msgstr "Copia i processori selezionati"
-
-#: mixer_actor.cc:64
-msgid "Cut Selected Processors"
-msgstr "Taglia i processori selezionati"
-
-#: mixer_actor.cc:65
-msgid "Paste Selected Processors"
-msgstr "Incolla i processori selezionati"
-
-#: mixer_actor.cc:66
-msgid "Delete Selected Processors"
-msgstr "Elimina i processori selezionati"
-
-#: mixer_actor.cc:67
-msgid "Select All (visible) Processors"
-msgstr "Seleziona tutti i processori visibili"
-
-#: mixer_actor.cc:68
-msgid "Toggle Selected Processors"
-msgstr "Attiva/disattiva i processori selezionati"
-
-#: mixer_actor.cc:69
-msgid "Toggle Selected Plugins"
-msgstr "Attiva/disattiva i plugin selezionati"
-
-#: mixer_actor.cc:70
-msgid "Deselect all strips and processors"
-msgstr ""
-
-#: mixer_actor.cc:72 mixer_actor.cc:73
-msgid "Scroll Mixer Window to the left"
-msgstr "Scorri la finestra del mixer verso sinistra"
-
-#: mixer_actor.cc:75
-msgid "Toggle MIDI Input Active for Mixer-Selected Tracks/Busses"
-msgstr "Attiva/disattiva l'input MIDI per le tracce/bus selezionate sul mixer"
-
-#: mixer_actor.cc:90
-msgid "Loaded mixer bindings from %1"
+#: missing_plugin_dialog.cc:42
+msgid ""
+"This session contains the following plugins that cannot be found on this "
+"system:\n"
+"\n"
 msgstr ""
 
-#: mixer_actor.cc:92
-msgid "Could not find mixer.bindings in search path %1"
+#: missing_plugin_dialog.cc:48
+msgid ""
+"\n"
+"Those plugins will be replaced with inactive stubs.\n"
+"It is recommended that you install the missing plugins and re-load the "
+"session.\n"
+"(also check the blacklist, Window > Log and Preferences > Plugins)"
 msgstr ""
 
-#: mixer_strip.cc:96 mixer_strip.cc:125
+#: mixer_strip.cc:100 mixer_strip.cc:133
 msgid "pre"
 msgstr "pre"
 
-#: mixer_strip.cc:98 mixer_strip.cc:127 mixer_strip.cc:372 mixer_strip.cc:1410
-#: rc_option_editor.cc:2331
+#: mixer_strip.cc:104 mixer_strip.cc:136 mixer_strip.cc:397
+#: mixer_strip.cc:1540 mixer_strip.cc:1551 rc_option_editor.cc:3140
 msgid "Comments"
 msgstr "Commenti"
 
-#: mixer_strip.cc:149
+#: mixer_strip.cc:160
 msgid "Click to toggle the width of this mixer strip."
 msgstr ""
 "Clicca per attivare/disattivare la larghezza di questa linguetta del mixer"
 
-#: mixer_strip.cc:151
+#: mixer_strip.cc:162
 msgid ""
 "\n"
 "%1-%2-click to toggle the width of all strips."
@@ -7584,288 +8703,460 @@ msgstr ""
 "\n"
 "%1-%2-clicca per attivare/disattivare la larghezza di tutte le linguette."
 
-#: mixer_strip.cc:158
+#: mixer_strip.cc:171
 msgid "Hide this mixer strip"
 msgstr "Nascondi questa linguetta del mixer"
 
-#: mixer_strip.cc:169
+#: mixer_strip.cc:182
 msgid "Click to select metering point"
 msgstr ""
 
-#: mixer_strip.cc:185
+#: mixer_strip.cc:198
 msgid "Isolate Solo"
 msgstr "Solo isolato"
 
-#: mixer_strip.cc:193
+#: mixer_strip.cc:206
 msgid "Lock Solo Status"
 msgstr "Blocca lo stato di solo"
 
-#: mixer_strip.cc:196 mixer_strip.cc:2027
+#: mixer_strip.cc:208 mixer_strip.cc:2217
+msgid "SoloLock|Lock"
+msgstr ""
+
+#: mixer_strip.cc:209 mixer_strip.cc:2216
 msgid "Iso"
 msgstr "Iso"
 
-#: mixer_strip.cc:250
+#: mixer_strip.cc:263
 msgid "Mix group"
 msgstr "Missa il gruppo"
 
-#: mixer_strip.cc:368 rc_option_editor.cc:2327
+#: mixer_strip.cc:275
+msgid "Trim: "
+msgstr ""
+
+#: mixer_strip.cc:393 rc_option_editor.cc:3136
 msgid "Phase Invert"
 msgstr "Inverti la fase"
 
-#: mixer_strip.cc:369 rc_option_editor.cc:2328
+#: mixer_strip.cc:394 rc_option_editor.cc:3137
 msgid "Record & Monitor"
 msgstr "Registrazione & monitoraggio"
 
-#: mixer_strip.cc:370 rc_option_editor.cc:2329
+#: mixer_strip.cc:395 rc_option_editor.cc:3138
 msgid "Solo Iso / Lock"
 msgstr ""
 
-#: mixer_strip.cc:524
+#: mixer_strip.cc:398 rc_option_editor.cc:3141
+msgid "VCA Assigns"
+msgstr ""
+
+#: mixer_strip.cc:531
+msgid "Show/Hide Monitoring Section"
+msgstr ""
+
+#: mixer_strip.cc:583
 msgid "Enable/Disable MIDI input"
 msgstr "Abilita/disabilita ingresso MIDI"
 
-#: mixer_strip.cc:688
+#: mixer_strip.cc:749
 msgid "Aux"
 msgstr "Ausiliario"
 
-#: mixer_strip.cc:710
+#: mixer_strip.cc:775
 msgid "Snd"
 msgstr "Snd"
 
-#: mixer_strip.cc:776 mixer_strip.cc:879 processor_box.cc:2382
+#: mixer_strip.cc:846 mixer_strip.cc:951 processor_box.cc:3594
 msgid "Not connected to audio engine - no I/O changes are possible"
 msgstr ""
 "Non connesso al motore audio - non è possibile alcun cambiamento in I/O "
 
-#: mixer_strip.cc:833 mixer_strip.cc:935
+#: mixer_strip.cc:904 mixer_strip.cc:1007
 msgid "Add %1 port"
 msgstr ""
 
-#: mixer_strip.cc:840 mixer_strip.cc:942
+#: mixer_strip.cc:912 mixer_strip.cc:1014 monitor_section.cc:1466
+#: plugin_pin_dialog.cc:1782
 msgid "Routing Grid"
 msgstr "Griglia di routing"
 
-#: mixer_strip.cc:1171
+#: mixer_strip.cc:1291
+msgid "MIDI "
+msgstr ""
+
+#: mixer_strip.cc:1295
 msgid "<b>INPUT</b> to %1"
 msgstr "<b>INGRESSO</b> a %1"
 
-#: mixer_strip.cc:1174
+#: mixer_strip.cc:1297 monitor_section.cc:1511
 msgid "<b>OUTPUT</b> from %1"
 msgstr "<b>USCITA</b> da %1"
 
-#: mixer_strip.cc:1287
+#: mixer_strip.cc:1410 monitor_section.cc:1598
 msgid "Disconnected"
 msgstr "Disconnesso"
 
-#: mixer_strip.cc:1413
-msgid "*Comments*"
-msgstr "*Commenti*"
+#: mixer_strip.cc:1536
+msgid "Click to add/edit comments"
+msgstr ""
 
-#: mixer_strip.cc:1420
+#: mixer_strip.cc:1540 mixer_strip.cc:1551
 msgid "Cmt"
 msgstr "Cmt"
 
-#: mixer_strip.cc:1423
-msgid "*Cmt*"
-msgstr "*Cmt*"
-
-#: mixer_strip.cc:1429
-msgid "Click to Add/Edit Comments"
-msgstr "Clicca per aggiungere/modificare commenti"
-
-#: mixer_strip.cc:1473
+#: mixer_strip.cc:1596
 msgid "Grp"
 msgstr "Grp"
 
-#: mixer_strip.cc:1476
+#: mixer_strip.cc:1599
 msgid "~G"
 msgstr "~G"
 
-#: mixer_strip.cc:1505 route_time_axis.cc:561
+#: mixer_strip.cc:1640 route_time_axis.cc:585 vca_master_strip.cc:396
 msgid "Color..."
 msgstr "Colore..."
 
-#: mixer_strip.cc:1507 route_time_axis.cc:563
+#: mixer_strip.cc:1642 route_time_axis.cc:587
 msgid "Comments..."
 msgstr "Commenti..."
 
-#: mixer_strip.cc:1509 route_time_axis.cc:565
+#: mixer_strip.cc:1644 route_time_axis.cc:589
 msgid "Inputs..."
 msgstr "Ingressi..."
 
-#: mixer_strip.cc:1511 route_time_axis.cc:567
+#: mixer_strip.cc:1646 route_time_axis.cc:591
 msgid "Outputs..."
 msgstr "Uscite..."
 
-#: mixer_strip.cc:1516
+#: mixer_strip.cc:1651
 msgid "Save As Template..."
 msgstr "Salva come modello..."
 
-#: mixer_strip.cc:1530
+#: mixer_strip.cc:1657 route_group_dialog.cc:45 route_time_axis.cc:851
+msgid "Active"
+msgstr "Attivo"
+
+#: mixer_strip.cc:1665 plugin_pin_dialog.cc:1011
+msgid "Strict I/O"
+msgstr ""
+
+#: mixer_strip.cc:1675 processor_box.cc:3698
+msgid "Pin Connections..."
+msgstr ""
+
+#: mixer_strip.cc:1679
 msgid "Adjust Latency..."
 msgstr "Regola la latenza..."
 
-#: mixer_strip.cc:1533
+#: mixer_strip.cc:1682
 msgid "Protect Against Denormals"
 msgstr "Protezione dalla denormalizzazione"
 
-#: mixer_strip.cc:1539 route_time_axis.cc:580
-msgid "Remote Control ID..."
-msgstr "ID del controllo remoto..."
+#: mixer_strip.cc:1701 route_time_axis.cc:867
+msgid "Duplicate..."
+msgstr ""
 
-#: mixer_strip.cc:1823
+#: mixer_strip.cc:1996
 msgid "Pre"
 msgstr "Pre"
 
-#: mixer_strip.cc:1827
+#: mixer_strip.cc:2000
 msgid "Post"
 msgstr "Post"
 
-#: mixer_strip.cc:1847
-msgid "Pr"
-msgstr "Pr"
+#: mixer_strip.cc:2016
+msgid "Meter|In"
+msgstr ""
+
+#: mixer_strip.cc:2020
+msgid "Meter|Pr"
+msgstr ""
+
+#: mixer_strip.cc:2024
+msgid "Meter|Po"
+msgstr ""
 
-#: mixer_strip.cc:1851
-msgid "Po"
-msgstr "Po"
+#: mixer_strip.cc:2028
+msgid "Meter|O"
+msgstr ""
 
-#: mixer_strip.cc:1860
-msgid "C"
-msgstr "C"
+#: mixer_strip.cc:2033
+msgid "Meter|C"
+msgstr ""
 
-#: mixer_strip.cc:2008 route_ui.cc:168
+#: mixer_strip.cc:2194 route_ui.cc:193
 msgid "Disk"
 msgstr "Disco"
 
-#: mixer_strip.cc:2020 monitor_section.cc:70
+#: mixer_strip.cc:2196
+msgid "Mon"
+msgstr ""
+
+#: mixer_strip.cc:2209 monitor_section.cc:81
 msgid "AFL"
 msgstr "AFL"
 
-#: mixer_strip.cc:2023 monitor_section.cc:71
+#: mixer_strip.cc:2212 monitor_section.cc:82
 msgid "PFL"
 msgstr "PFL"
 
-#: mixer_strip.cc:2034 meter_strip.cc:380
-msgid "D"
-msgstr "D"
+#: mixer_strip.cc:2222 meter_strip.cc:385
+msgid "MonitorInput|I"
+msgstr ""
+
+#: mixer_strip.cc:2223 meter_strip.cc:386
+msgid "MonitorDisk|D"
+msgstr ""
+
+#: mixer_strip.cc:2225
+msgid "Mon|O"
+msgstr ""
+
+#: mixer_strip.cc:2238 meter_strip.cc:377 route_time_axis.cc:2730
+#: vca_master_strip.cc:202 vca_time_axis.cc:227
+msgid "AfterFader|A"
+msgstr ""
 
 #: mixer_strip.cc:2241
+msgid "Prefader|P"
+msgstr ""
+
+#: mixer_strip.cc:2246
+msgid "SoloIso|I"
+msgstr ""
+
+#: mixer_strip.cc:2247
+msgid "SoloLock|L"
+msgstr ""
+
+#: mixer_strip.cc:2452
 msgid "Pre Fader"
 msgstr "Pre Fader"
 
-#: mixer_strip.cc:2242
+#: mixer_strip.cc:2453
 msgid "Post Fader"
 msgstr "Post Fader"
 
-#: mixer_strip.cc:2286 meter_strip.cc:847
+#: mixer_strip.cc:2498 meter_strip.cc:858
 msgid "Change all in Group to %1"
 msgstr "Cambia tutto nel gruppo a %1"
 
-#: mixer_strip.cc:2288 meter_strip.cc:849
+#: mixer_strip.cc:2500 meter_strip.cc:860
 msgid "Change all to %1"
 msgstr "Cambia tutto a %1"
 
-#: mixer_strip.cc:2290 meter_strip.cc:851
+#: mixer_strip.cc:2502 meter_strip.cc:862
 msgid "Change same track-type to %1"
 msgstr "Cambia lo stesso tipo di traccia a %1"
 
-#: mixer_ui.cc:130 route_time_axis.cc:818
+#: mixer_ui.cc:152 route_time_axis.cc:828
 msgid "Group"
 msgstr "Gruppo"
 
-#: mixer_ui.cc:1224
+#: mixer_ui.cc:221
+msgid "Favorite Plugins"
+msgstr ""
+
+#: mixer_ui.cc:627
+msgid "Error adding GUI elements for new tracks/busses %1"
+msgstr ""
+
+#: mixer_ui.cc:1542
 msgid "track display list item for renamed strip not found!"
 msgstr ""
 
-#: mixer_ui.cc:1316
+#: mixer_ui.cc:1636
 msgid "-all-"
 msgstr "-tutto-"
 
-#: mixer_ui.cc:1853
+#: mixer_ui.cc:2135
 msgid "Strips"
 msgstr "Linguette"
 
-#: meter_strip.cc:157
-msgid "Reset Peak"
-msgstr "Resetta picco"
+#: mixer_ui.cc:2479
+msgid "No Track/Bus is selected."
+msgstr ""
 
-#: meter_strip.cc:883
-msgid "Variable height"
-msgstr "Altezza variabile"
+#: mixer_ui.cc:2481
+msgid "Add at the top"
+msgstr ""
 
-#: meter_strip.cc:884
-msgid "Short"
-msgstr "Corto"
+#: mixer_ui.cc:2483
+msgid "Add Pre-Fader"
+msgstr ""
 
-#: meter_strip.cc:885
-msgid "Tall"
-msgstr "Lungo"
+#: mixer_ui.cc:2485
+msgid "Add Post-Fader"
+msgstr ""
 
-#: meter_strip.cc:886
-msgid "Grande"
-msgstr "Grande"
+#: mixer_ui.cc:2487
+msgid "Add at the end"
+msgstr ""
 
-#: meter_strip.cc:887
-msgid "Venti"
-msgstr "Venti"
+#: mixer_ui.cc:2493
+msgid "Remove from favorites"
+msgstr ""
 
-#: meter_patterns.cc:82
-msgid "Peak"
-msgstr "Picco"
+#: mixer_ui.cc:2499
+msgid "Delete Preset"
+msgstr ""
 
-#: meter_patterns.cc:85
-msgid "RMS + Peak"
-msgstr "RMS + Picco"
+#: mixer_ui.cc:2739
+msgid "Toggle Solo on Mixer-Selected Tracks/Busses"
+msgstr "Attiva/disattiva il Solo sulle tracce/bus del mixer selezionate/i"
 
-#: meter_patterns.cc:88
-msgid "IEC1/DIN"
-msgstr "IEC1/DIN"
+#: mixer_ui.cc:2740
+msgid "Toggle Mute on Mixer-Selected Tracks/Busses"
+msgstr "Attiva/disattiva il Muto sulle tracce/bus del mixer selezionate/i"
 
-#: meter_patterns.cc:91
-msgid "IEC1/Nordic"
-msgstr "IEC1/Nordic"
+#: mixer_ui.cc:2741
+msgid "Toggle Rec-enable on Mixer-Selected Tracks/Busses"
+msgstr ""
+"Attiva/disattiva abilita registrazione sulle tracce/bus selezionate del mixer"
 
-#: meter_patterns.cc:94
-msgid "IEC2/BBC"
-msgstr "IEC2/BBC"
+#: mixer_ui.cc:2742
+msgid "Decrease Gain on Mixer-Selected Tracks/Busses"
+msgstr "Diminuisci il Guadagno sulle tracce/bus selezionate del mixer"
 
-#: meter_patterns.cc:97
-msgid "IEC2/EBU"
-msgstr "IEC2/EBU"
+#: mixer_ui.cc:2743
+msgid "Increase Gain on Mixer-Selected Tracks/Busses"
+msgstr "Aumenta il Guadagno sulle tracce/bus selezionate del mixer"
 
-#: meter_patterns.cc:100
-msgid "K20"
-msgstr "K20"
+#: mixer_ui.cc:2744
+msgid "Set Gain to 0dB on Mixer-Selected Tracks/Busses"
+msgstr "Imposta il Guadagno a 0dB sulle tracce/bus selezionate del mixer"
 
-#: meter_patterns.cc:103
-msgid "K14"
-msgstr "K14"
+#: mixer_ui.cc:2747
+msgid "Copy Selected Processors"
+msgstr "Copia i processori selezionati"
 
-#: meter_patterns.cc:106
-msgid "K12"
-msgstr "K12"
+#: mixer_ui.cc:2748
+msgid "Cut Selected Processors"
+msgstr "Taglia i processori selezionati"
 
-#: meter_patterns.cc:109
-msgid "VU"
-msgstr "VU"
+#: mixer_ui.cc:2749
+msgid "Paste Selected Processors"
+msgstr "Incolla i processori selezionati"
 
-#: monitor_section.cc:69
-msgid "SiP"
-msgstr "SiP"
+#: mixer_ui.cc:2750
+msgid "Delete Selected Processors"
+msgstr "Elimina i processori selezionati"
+
+#: mixer_ui.cc:2751
+msgid "Select All (visible) Processors"
+msgstr "Seleziona tutti i processori visibili"
+
+#: mixer_ui.cc:2752
+msgid "Toggle Selected Processors"
+msgstr "Attiva/disattiva i processori selezionati"
+
+#: mixer_ui.cc:2753
+msgid "Toggle Selected Plugins"
+msgstr "Attiva/disattiva i plugin selezionati"
+
+#: mixer_ui.cc:2754
+msgid "Deselect all strips and processors"
+msgstr ""
+
+#: mixer_ui.cc:2756 mixer_ui.cc:2757
+msgid "Scroll Mixer Window to the left"
+msgstr "Scorri la finestra del mixer verso sinistra"
+
+#: mixer_ui.cc:2759
+msgid "Toggle MIDI Input Active for Mixer-Selected Tracks/Busses"
+msgstr "Attiva/disattiva l'input MIDI per le tracce/bus selezionate sul mixer"
+
+#: meter_strip.cc:160
+msgid "Reset Peak"
+msgstr "Resetta picco"
+
+#: meter_strip.cc:380 route_time_axis.cc:2734 vca_master_strip.cc:206
+#: vca_time_axis.cc:231
+msgid "PreFader|P"
+msgstr ""
+
+#: meter_strip.cc:894
+msgid "Variable height"
+msgstr "Altezza variabile"
+
+#: meter_strip.cc:895
+msgid "Short"
+msgstr "Corto"
+
+#: meter_strip.cc:896
+msgid "Tall"
+msgstr "Lungo"
+
+#: meter_strip.cc:897
+msgid "Grande"
+msgstr "Grande"
+
+#: meter_strip.cc:898
+msgid "Venti"
+msgstr "Venti"
+
+#: meter_patterns.cc:84
+msgid "Peak (+6dBFS)"
+msgstr ""
+
+#: meter_patterns.cc:87
+msgid "Peak (0dBFS)"
+msgstr ""
+
+#: meter_patterns.cc:90
+msgid "RMS + Peak"
+msgstr "RMS + Picco"
+
+#: meter_patterns.cc:93
+msgid "IEC1/DIN"
+msgstr "IEC1/DIN"
+
+#: meter_patterns.cc:96
+msgid "IEC1/Nordic"
+msgstr "IEC1/Nordic"
+
+#: meter_patterns.cc:99
+msgid "IEC2/BBC"
+msgstr "IEC2/BBC"
+
+#: meter_patterns.cc:102
+msgid "IEC2/EBU"
+msgstr "IEC2/EBU"
+
+#: meter_patterns.cc:105
+msgid "K20/RMS"
+msgstr ""
+
+#: meter_patterns.cc:108
+msgid "K14/RMS"
+msgstr ""
+
+#: meter_patterns.cc:111
+msgid "K12/RMS"
+msgstr ""
+
+#: meter_patterns.cc:114
+msgid "VU"
+msgstr "VU"
 
-#: monitor_section.cc:96 route_group_dialog.cc:49
+#: monitor_section.cc:80
+msgid "SiP"
+msgstr "SiP"
+
+#: monitor_section.cc:113 route_group_dialog.cc:49
 msgid "Soloing"
 msgstr "In solo"
 
-#: monitor_section.cc:100
+#: monitor_section.cc:117
 msgid "Isolated"
 msgstr "Isolato"
 
-#: monitor_section.cc:104
+#: monitor_section.cc:121
 msgid "Auditioning"
 msgstr "In ascolto"
 
-#: monitor_section.cc:114
+#: monitor_section.cc:132
 msgid ""
 "When active, something is solo-isolated.\n"
 "Click to de-isolate everything"
@@ -7873,7 +9164,7 @@ msgstr ""
 "Se attivo, qualcosa è in solo-isolato.\n"
 "Clicca per ripristinare tutto"
 
-#: monitor_section.cc:117
+#: monitor_section.cc:135
 msgid ""
 "When active, auditioning is active.\n"
 "Click to stop the audition"
@@ -7881,27 +9172,72 @@ msgstr ""
 "Se attivo, qualcosa è in ascolto.\n"
 "Clicca per ripristinare"
 
-#: monitor_section.cc:134
+#: monitor_section.cc:152
 msgid "Solo controls affect solo-in-place"
 msgstr "I controlli di solo influenzano il solo-in-place"
 
-#: monitor_section.cc:140
+#: monitor_section.cc:158
 msgid "Solo controls toggle after-fader-listen"
 msgstr "Interruttore per i controlli del Solo in modalità ascolto after-fader"
 
-#: monitor_section.cc:146
+#: monitor_section.cc:164
 msgid "Solo controls toggle pre-fader-listen"
 msgstr "Interruttore per il controllo del solo in modalità ascolto pre-fader"
 
-#: monitor_section.cc:156
+#: monitor_section.cc:170
+msgid "Excl. Solo"
+msgstr "Solo esclusivo"
+
+#: monitor_section.cc:172
+msgid "Exclusive solo means that only 1 solo is active at a time"
+msgstr "Solo esclusivo vuol dire che soltanto un solo per volta è attivo"
+
+#: monitor_section.cc:179
+msgid "Solo » Mute"
+msgstr "Solo » Muto"
+
+#: monitor_section.cc:181
+msgid ""
+"If enabled, solo will override mute\n"
+"(a soloed & muted track or bus will be audible)"
+msgstr ""
+"Se abilitato, solo avrà la precedenza sul muto\n"
+"(una traccia o un bus in solo e muto sarà udibile)"
+
+#: monitor_section.cc:189
+msgid "Processors"
+msgstr ""
+
+#: monitor_section.cc:191
+msgid "Allow one to add monitor effect processors"
+msgstr ""
+
+#: monitor_section.cc:206
 msgid "Gain increase for soloed signals (0dB is normal)"
 msgstr "Aumento di guadagno per i segnali in solo (0dB è la norma)"
 
-#: monitor_section.cc:170
+#: monitor_section.cc:210 monitor_section.cc:227 monitor_section.cc:244
+#: monitor_section.cc:289
+msgid "0 dB"
+msgstr ""
+
+#: monitor_section.cc:211
+msgid "3 dB"
+msgstr ""
+
+#: monitor_section.cc:212
+msgid "6 dB"
+msgstr ""
+
+#: monitor_section.cc:213
+msgid "10 dB"
+msgstr ""
+
+#: monitor_section.cc:215
 msgid "Solo Boost"
 msgstr "Spingi solo"
 
-#: monitor_section.cc:185
+#: monitor_section.cc:222
 msgid ""
 "Gain reduction non-soloed signals\n"
 "A value above -inf dB causes \"solo-in-front\""
@@ -7909,106 +9245,136 @@ msgstr ""
 "Riduzione di guadagno per i segnali non in solo\n"
 "Un valore sopra -inf dB ottiene il \"solo-in-front\""
 
-#: monitor_section.cc:196
+#: monitor_section.cc:228 monitor_section.cc:246 monitor_section.cc:291
+msgid "-6 dB"
+msgstr ""
+
+#: monitor_section.cc:229 monitor_section.cc:247 monitor_section.cc:292
+msgid "-12 dB"
+msgstr ""
+
+#: monitor_section.cc:230 monitor_section.cc:248 monitor_section.cc:293
+msgid "-20 dB"
+msgstr ""
+
+#: monitor_section.cc:231
+msgid "OFF"
+msgstr ""
+
+#: monitor_section.cc:233
 msgid "SiP Cut"
 msgstr "Taglio SiP"
 
-#: monitor_section.cc:211
+#: monitor_section.cc:240
 msgid "Gain reduction to use when dimming monitor outputs"
 msgstr ""
 "Riduzione di guadagno da utilizzare per affievolire le uscite del monitor"
 
-#: monitor_section.cc:225 monitor_section.cc:283
+#: monitor_section.cc:245 monitor_section.cc:290
+msgid "-3 dB"
+msgstr ""
+
+#: monitor_section.cc:250 monitor_section.cc:264 monitor_section.cc:325
 msgid "Dim"
 msgstr "Affievolisci"
 
-#: monitor_section.cc:235
-msgid "Excl. Solo"
-msgstr "Solo esclusivo"
-
-#: monitor_section.cc:237
-msgid "Exclusive solo means that only 1 solo is active at a time"
-msgstr "Solo esclusivo vuol dire che soltanto un solo per volta è attivo"
-
-#: monitor_section.cc:244
-msgid "Solo » Mute"
-msgstr "Solo » Muto"
+#: monitor_section.cc:294
+msgid "-30 dB"
+msgstr ""
 
-#: monitor_section.cc:246
-msgid ""
-"If enabled, solo will override mute\n"
-"(a soloed & muted track or bus will be audible)"
+#: monitor_section.cc:333
+msgid "Inv"
 msgstr ""
-"Se abilitato, solo avrà la precedenza sul muto\n"
-"(una traccia o un bus in solo e muto sarà udibile)"
 
-#: monitor_section.cc:323
+#: monitor_section.cc:399
 msgid "Monitor"
 msgstr "Monitora"
 
-#: monitor_section.cc:744
+#: monitor_section.cc:897
 msgid "Switch monitor to mono"
 msgstr "Passa al monitor mono"
 
-#: monitor_section.cc:747
+#: monitor_section.cc:900
 msgid "Cut monitor"
 msgstr "Taglia il monitor"
 
-#: monitor_section.cc:750
+#: monitor_section.cc:903
 msgid "Dim monitor"
 msgstr "Affievolisci il monitor"
 
-#: monitor_section.cc:753
+#: monitor_section.cc:906
 msgid "Toggle exclusive solo mode"
 msgstr "Attiva/disattiva modalità solo esclusivo"
 
-#: monitor_section.cc:759
+#: monitor_section.cc:912
 msgid "Toggle mute overrides solo mode"
 msgstr ""
 
-#: monitor_section.cc:771
+#: monitor_section.cc:921
 msgid "Cut monitor channel %1"
 msgstr "Taglia il canale monitor %1"
 
-#: monitor_section.cc:776
+#: monitor_section.cc:926
 msgid "Dim monitor channel %1"
 msgstr "Affievolisci il canale monitor %1"
 
-#: monitor_section.cc:781
+#: monitor_section.cc:931
 msgid "Solo monitor channel %1"
 msgstr "Solo il canale monitor %1"
 
-#: monitor_section.cc:786
+#: monitor_section.cc:936
 msgid "Invert monitor channel %1"
 msgstr "Inverti il canale monitor %1"
 
-#: monitor_section.cc:796
+#: monitor_section.cc:946
 msgid "In-place solo"
 msgstr "Solo in-place"
 
-#: monitor_section.cc:798
+#: monitor_section.cc:948
 msgid "After Fade Listen (AFL) solo"
 msgstr "Solo in ascolto post fader (AFL)"
 
-#: monitor_section.cc:800
+#: monitor_section.cc:950
 msgid "Pre Fade Listen (PFL) solo"
 msgstr "Solo in ascolto pre fader (PFL)"
 
-#: mono_panner.cc:109 stereo_panner.cc:119
+#: monitor_section.cc:953
+msgid "Toggle Monitor Section Processor Box"
+msgstr ""
+
+#: monitor_section.cc:1413
+msgid "No session - no I/O changes are possible"
+msgstr ""
+
+#: monitor_selector.cc:199
+msgid "Monitor output selector"
+msgstr ""
+
+#: mono_panner.cc:105 stereo_panner.cc:115
 msgid "bypassed"
 msgstr "bypassato"
 
-#: mono_panner.cc:123
+#: mono_panner.cc:119
 #, c-format
 msgid "L:%3d R:%3d"
 msgstr "L:%3d R:%3d"
 
-#: mono_panner_editor.cc:33
+#: mono_panner.cc:203 panner2d.cc:276 stereo_panner.cc:252
+#: stereo_panner.cc:275
+msgid "Panner|L"
+msgstr ""
+
+#: mono_panner.cc:220 panner2d.cc:277 stereo_panner.cc:250
+#: stereo_panner.cc:277
+msgid "Panner|R"
+msgstr ""
+
+#: mono_panner_editor.cc:35
 msgid "Mono Panner"
 msgstr ""
 
-#: mono_panner_editor.cc:44 mono_panner_editor.cc:49
-#: stereo_panner_editor.cc:46 stereo_panner_editor.cc:51
+#: mono_panner_editor.cc:46 mono_panner_editor.cc:51
+#: stereo_panner_editor.cc:48 stereo_panner_editor.cc:53
 msgid "%"
 msgstr "%"
 
@@ -8089,10 +9455,6 @@ msgstr ""
 "di Ardour fa affidamento su un costante flusso di denaro. \n"
 "Grazie per utilizzare Ardour!"
 
-#: new_plugin_preset_dialog.cc:29
-msgid "New Preset"
-msgstr "Nuovo preset"
-
 #: new_plugin_preset_dialog.cc:30
 msgid "Replace existing preset with this name"
 msgstr "Sostituisci il preset esistente con questo"
@@ -8101,6 +9463,10 @@ msgstr "Sostituisci il preset esistente con questo"
 msgid "Name of new preset"
 msgstr "Nome del nuovo preset"
 
+#: new_plugin_preset_dialog.cc:44
+msgid "New Favorite Only"
+msgstr ""
+
 #: normalize_dialog.cc:34
 msgid "Normalize regions"
 msgstr "Normalizza regioni"
@@ -8109,7 +9475,11 @@ msgstr "Normalizza regioni"
 msgid "Normalize region"
 msgstr "Normalizza regione"
 
-#: normalize_dialog.cc:49 strip_silence_dialog.cc:66
+#: normalize_dialog.cc:42
+msgid "Normalize to:"
+msgstr "Normalizza a:"
+
+#: normalize_dialog.cc:49 strip_silence_dialog.cc:67
 msgid "dbFS"
 msgstr "dbFS"
 
@@ -8129,106 +9499,109 @@ msgstr "Normalizza"
 msgid "Select Note"
 msgstr "Seleziona nota"
 
-#: opts.cc:57
+#: opts.cc:61
 msgid "Usage: "
 msgstr "Utilizzo: "
 
-#: opts.cc:58
+#: opts.cc:62
 msgid "  [SESSION_NAME]              Name of session to load\n"
 msgstr "  [nome sessione]                  Nome della sessione da caricare\n"
 
-#: opts.cc:59
+#: opts.cc:63
 msgid "  -v, --version               Show version information\n"
 msgstr "  -v, --versione                    Mostra info sulla versione\n"
 
-#: opts.cc:60
+#: opts.cc:64
 msgid "  -h, --help                  Print this message\n"
 msgstr "  -h, --help                        Mostra questo messaggio\n"
 
-#: opts.cc:61
+#: opts.cc:65
 msgid ""
 "  -a, --no-announcements      Do not contact website for announcements\n"
 msgstr ""
 
-#: opts.cc:62
+#: opts.cc:66
 msgid ""
 "  -b, --bindings              Print all possible keyboard binding names\n"
 msgstr ""
 
-#: opts.cc:63
+#: opts.cc:67
+msgid ""
+"  -B, --bypass-plugins        Bypass all plugins in an existing session\n"
+msgstr ""
+
+#: opts.cc:68
 msgid ""
 "  -c, --name <name>           Use a specific backend client name, default is "
 "ardour\n"
 msgstr ""
 
-#: opts.cc:64
+#: opts.cc:69
 msgid ""
 "  -d, --disable-plugins       Disable all plugins in an existing session\n"
 msgstr ""
 " -d, --disable-plugins     Disabilita tutti i plugin in una sessione "
 "esistente\n"
 
-#: opts.cc:65
+#: opts.cc:70
 msgid ""
 "  -D, --debug <options>       Set debug flags. Use \"-D list\" to see "
 "available options\n"
 msgstr ""
 
-#: opts.cc:66
+#: opts.cc:71
 msgid "  -n, --no-splash             Do not show splash screen\n"
 msgstr ""
 
-#: opts.cc:67
+#: opts.cc:72
 msgid "  -m, --menus file            Use \"file\" to define menus\n"
 msgstr ""
 
-#: opts.cc:68
+#: opts.cc:73
 msgid ""
 "  -N, --new session-name      Create a new session from the command line\n"
 msgstr ""
 "  [nome sessione]                  Crea una sessione dalla riga di comando\n"
 
-#: opts.cc:69
+#: opts.cc:74
 msgid "  -O, --no-hw-optimizations   Disable h/w specific optimizations\n"
 msgstr ""
 
-#: opts.cc:70
+#: opts.cc:75
 msgid "  -P, --no-connect-ports      Do not connect any ports at startup\n"
 msgstr ""
 
-#: opts.cc:71
+#: opts.cc:76
 msgid "  -S, --sync                  Draw the gui synchronously \n"
 msgstr ""
 
-#: opts.cc:73
+#: opts.cc:78
 msgid "  -V, --novst                 Do not use VST support\n"
 msgstr "  -n, --no-splash                   Non usare il supporto VST\n"
 
-#: opts.cc:75
+#: opts.cc:80
 msgid ""
 "  -E, --save <file>           Load the specified session, save it to <file> "
 "and then quit\n"
 msgstr ""
 
-#: opts.cc:76
+#: opts.cc:81
 msgid "  -C, --curvetest filename    Curve algorithm debugger\n"
 msgstr ""
 
-#: opts.cc:77
-msgid ""
-"  -k, --keybindings filename  Name of key bindings to load (default is ~/."
-"ardour3/ardour.bindings)\n"
+#: opts.cc:82
+msgid "  -k, --keybindings filename  Name of key bindings to load\n"
 msgstr ""
 
-#: panner2d.cc:854
+#: panner2d.cc:896
 msgid "Panner (2D)"
 msgstr ""
 
-#: panner2d.cc:856 panner_ui.cc:400 plugin_ui.cc:452
+#: panner2d.cc:898 panner_ui.cc:402 plugin_ui.cc:458
 msgid "Bypass"
 msgstr "Bipassa"
 
-#: panner2d.cc:862
+#: panner2d.cc:904
 msgid "Panner"
 msgstr ""
 
@@ -8240,6 +9613,22 @@ msgstr "Modalita' automazione pan"
 msgid "Pan automation type"
 msgstr "Tipo di automazione pan"
 
+#: panner_ui.cc:605
+msgid "Manual|M"
+msgstr ""
+
+#: panner_ui.cc:608
+msgid "Play|P"
+msgstr ""
+
+#: panner_ui.cc:611
+msgid "Touch|T"
+msgstr ""
+
+#: panner_ui.cc:614
+msgid "Write|W"
+msgstr ""
+
 #: playlist_selector.cc:43
 msgid "Playlists"
 msgstr "Playlists"
@@ -8272,100 +9661,254 @@ msgstr "scala dB"
 msgid "Show phase"
 msgstr "Mostra la fase"
 
-#: plugin_selector.cc:53 plugin_selector.cc:229
+#: plugin_pin_dialog.cc:55
+msgid "Manual Config"
+msgstr ""
+
+#: plugin_pin_dialog.cc:56
+msgid "Sidechain"
+msgstr ""
+
+#: plugin_pin_dialog.cc:57 plugin_pin_dialog.cc:59 plugin_pin_dialog.cc:61
+#: plugin_pin_dialog.cc:63 plugin_pin_dialog.cc:65 step_entry.cc:81
+#: step_entry.cc:84
+msgid "+"
+msgstr ""
+
+#: plugin_pin_dialog.cc:58 plugin_pin_dialog.cc:60 plugin_pin_dialog.cc:62
+#: plugin_pin_dialog.cc:64 plugin_pin_dialog.cc:66
+msgid "-"
+msgstr ""
+
+#: plugin_pin_dialog.cc:148
+msgid "Audio Input Pins"
+msgstr ""
+
+#: plugin_pin_dialog.cc:157
+msgid "MIDI Input Pins"
+msgstr ""
+
+#: plugin_pin_dialog.cc:166
+msgid "Instances"
+msgstr ""
+
+#: plugin_pin_dialog.cc:176
+msgid "Audio Out"
+msgstr ""
+
+#: plugin_pin_dialog.cc:185
+msgid "MIDI Out"
+msgstr ""
+
+#: plugin_pin_dialog.cc:192
+msgid "Output Presets"
+msgstr ""
+
+#: plugin_pin_dialog.cc:208
+msgid "Add Sidechain Input"
+msgstr ""
+
+#: plugin_pin_dialog.cc:478 plugin_pin_dialog.cc:482 plugin_pin_dialog.cc:486
+#: plugin_setup_dialog.cc:115 plugin_setup_dialog.cc:199
+msgid "Automatic"
+msgstr ""
+
+#: plugin_pin_dialog.cc:515 plugin_setup_dialog.cc:208
+msgid "%1 Channel"
+msgid_plural "%1 Channels"
+msgstr[0] ""
+msgstr[1] ""
+
+#: plugin_pin_dialog.cc:641 processor_box.cc:224
+msgid "Send"
+msgstr "Mandata"
+
+#: plugin_pin_dialog.cc:997
+msgid "Latency %1 spl%2 %3"
+msgstr ""
+
+#: plugin_pin_dialog.cc:997 plugin_pin_dialog.cc:1001
+msgid "no-inplace"
+msgstr ""
+
+#: plugin_pin_dialog.cc:999
+msgid "Latency %1 spl"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1055
+msgid "Instance #%1"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1700 processor_box.cc:2508
+msgid "Cannot set up new send: %1"
+msgstr "Impossibile prepare la nuova mandata: %1"
+
+#: plugin_pin_dialog.cc:1707
+msgid "SC %1 (%2)"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1963 plugin_pin_dialog.cc:1971
+msgid "Pin Configuration: %1"
+msgstr ""
+
+#: plugin_setup_dialog.cc:30
+msgid "Plugin Setup"
+msgstr ""
+
+#: plugin_setup_dialog.cc:33
+msgid "Copy I/O Map"
+msgstr ""
+
+#: plugin_setup_dialog.cc:50
+msgid "An Instrument plugin is already present."
+msgstr ""
+
+#: plugin_setup_dialog.cc:54
+msgid "Replace"
+msgstr ""
+
+#: plugin_setup_dialog.cc:60
+msgid "with"
+msgstr ""
+
+#: plugin_setup_dialog.cc:70
+msgid "I/O Pin Mapping"
+msgstr ""
+
+#: plugin_setup_dialog.cc:79
+msgid "Configure Plugin '%1'"
+msgstr ""
+
+#: plugin_setup_dialog.cc:90
+msgid "Output Configuration"
+msgstr ""
+
+#: plugin_selector.cc:54 plugin_selector.cc:322
 msgid "Name contains"
 msgstr "Il nome contiene"
 
-#: plugin_selector.cc:54 plugin_selector.cc:233
+#: plugin_selector.cc:55 plugin_selector.cc:326
 msgid "Type contains"
 msgstr "Il tipo contiene"
 
-#: plugin_selector.cc:55 plugin_selector.cc:231
+#: plugin_selector.cc:56 plugin_selector.cc:324
 msgid "Category contains"
 msgstr "Categoria contiene"
 
-#: plugin_selector.cc:56 plugin_selector.cc:253
+#: plugin_selector.cc:57 plugin_selector.cc:349
 msgid "Author contains"
 msgstr "Autore contiene"
 
-#: plugin_selector.cc:57 plugin_selector.cc:255
+#: plugin_selector.cc:58 plugin_selector.cc:351
 msgid "Library contains"
 msgstr "Libreria contiene"
 
-#: plugin_selector.cc:58 plugin_selector.cc:219 plugin_selector.cc:537
+#: plugin_selector.cc:59 plugin_selector.cc:278 plugin_selector.cc:639
 msgid "Favorites only"
 msgstr "Solo favoriti"
 
-#: plugin_selector.cc:59 plugin_selector.cc:223 plugin_selector.cc:537
+#: plugin_selector.cc:60 plugin_selector.cc:282 plugin_selector.cc:639
 msgid "Hidden only"
 msgstr "Solo nascosto"
 
-#: plugin_selector.cc:64
+#: plugin_selector.cc:65
 msgid "Plugin Manager"
 msgstr "Gestore dei plugin"
 
-#: plugin_selector.cc:85
+#: plugin_selector.cc:96
 msgid "Fav"
 msgstr "Fav"
 
-#: plugin_selector.cc:87
+#: plugin_selector.cc:98
 msgid "Available Plugins"
 msgstr "Plugin disponibili"
 
-#: plugin_selector.cc:88
+#: plugin_selector.cc:99
 msgid "Type"
 msgstr "Tipo"
 
-#: plugin_selector.cc:89
+#: plugin_selector.cc:100
 msgid "Category"
 msgstr "Categoria"
 
-#: plugin_selector.cc:90
+#: plugin_selector.cc:101
 msgid "Creator"
 msgstr "Creatore"
 
-#: plugin_selector.cc:91
+#: plugin_selector.cc:102
 msgid "# Audio In"
 msgstr "# Ingresso audio"
 
-#: plugin_selector.cc:92
+#: plugin_selector.cc:103
 msgid "# Audio Out"
 msgstr "# Uscita audio"
 
-#: plugin_selector.cc:93
+#: plugin_selector.cc:104
 msgid "# MIDI In"
 msgstr "# Ingresso MIDI"
 
-#: plugin_selector.cc:94
+#: plugin_selector.cc:105
 msgid "# MIDI Out"
 msgstr "# Uscita MIDI"
 
-#: plugin_selector.cc:116
+#: plugin_selector.cc:132
 msgid "Plugins to be connected"
 msgstr "Plugin da connettere"
 
-#: plugin_selector.cc:129
+#: plugin_selector.cc:145
 msgid "Add a plugin to the effect list"
 msgstr "Aggiungi un plugin alla lista degli effetti"
 
-#: plugin_selector.cc:133
+#: plugin_selector.cc:149
 msgid "Remove a plugin from the effect list"
 msgstr "Rimuovi un plugin dalla lista degli effetti"
 
-#: plugin_selector.cc:135
-msgid "Update available plugins"
-msgstr "Aggiorna i plugin disponibili"
+#: plugin_selector.cc:161
+msgid "Show Hidden"
+msgstr ""
 
-#: plugin_selector.cc:172
-msgid "Insert Plugin(s)"
-msgstr "Inserisci plugin(s)"
+#: plugin_selector.cc:163
+msgid "Include hidden plugins in list."
+msgstr ""
 
-#: plugin_selector.cc:337 plugin_selector.cc:338 plugin_selector.cc:339
-#: plugin_selector.cc:340
-msgid "variable"
-msgstr "variabile"
+#: plugin_selector.cc:166
+msgid "Instruments"
+msgstr ""
 
-#: plugin_selector.cc:496
+#: plugin_selector.cc:168
+msgid "Cycle display of instrument plugins (if any)."
+msgstr ""
+
+#: plugin_selector.cc:171
+msgid "Analyzers"
+msgstr ""
+
+#: plugin_selector.cc:173
+msgid "Cycle display of analysis plugins (if any)."
+msgstr ""
+
+#: plugin_selector.cc:176
+msgid "Utils"
+msgstr ""
+
+#: plugin_selector.cc:178
+msgid "Cycle display of utility plugins (if any)."
+msgstr ""
+
+#: plugin_selector.cc:208
+msgid "Filter"
+msgstr ""
+
+#: plugin_selector.cc:232
+msgid "Insert Plugin(s)"
+msgstr "Inserisci plugin(s)"
+
+#: plugin_selector.cc:439 plugin_selector.cc:440 plugin_selector.cc:441
+#: plugin_selector.cc:442
+msgid "variable"
+msgstr "variabile"
+
+#: plugin_selector.cc:598
 msgid ""
 "The plugin \"%1\" could not be loaded\n"
 "\n"
@@ -8375,43 +9918,43 @@ msgstr ""
 "\n"
 "Controlla la finestra dei Log per ulteriori dettagli (forse)"
 
-#: plugin_selector.cc:644
+#: plugin_selector.cc:757
 msgid "Favorites"
 msgstr "Favoriti"
 
-#: plugin_selector.cc:646
+#: plugin_selector.cc:759
 msgid "Plugin Manager..."
 msgstr "Gestore dei plugin..."
 
-#: plugin_selector.cc:650
+#: plugin_selector.cc:763
 msgid "By Creator"
 msgstr "Per creatore"
 
-#: plugin_selector.cc:653
+#: plugin_selector.cc:766
 msgid "By Category"
 msgstr "Per categoria"
 
-#: plugin_ui.cc:113
+#: plugin_ui.cc:114
 msgid "Eh? LADSPA plugins don't have editors!"
 msgstr "Cosa? I plugin LADSPA non hanno editor?"
 
-#: plugin_ui.cc:122 plugin_ui.cc:227
+#: plugin_ui.cc:123 plugin_ui.cc:228
 msgid ""
 "unknown type of editor-supplying plugin (note: no VST support in this "
 "version of %1)"
 msgstr ""
 
-#: plugin_ui.cc:125
+#: plugin_ui.cc:126
 msgid "unknown type of editor-supplying plugin"
 msgstr ""
 
-#: plugin_ui.cc:257
+#: plugin_ui.cc:258
 msgid ""
 "unknown type of editor-supplying plugin (note: no linuxVST support in this "
 "version of %1)"
 msgstr ""
 
-#: plugin_ui.cc:329
+#: plugin_ui.cc:330
 msgid "create_lv2_editor called on non-LV2 plugin"
 msgstr ""
 
@@ -8419,15 +9962,15 @@ msgstr ""
 msgid "Add"
 msgstr "Aggiungi"
 
-#: plugin_ui.cc:422
+#: plugin_ui.cc:423
 msgid "Description"
 msgstr "Descrizione"
 
-#: plugin_ui.cc:423
+#: plugin_ui.cc:424
 msgid "Plugin analysis"
 msgstr "Analisi plugin"
 
-#: plugin_ui.cc:430
+#: plugin_ui.cc:431
 msgid ""
 "Presets (if any) for this plugin\n"
 "(Both factory and user-created)"
@@ -8435,23 +9978,28 @@ msgstr ""
 "Preimpostazioni (se presenti) per questo plugin\n"
 "(Sia utente che di fabbrica)"
 
-#: plugin_ui.cc:431
+#: plugin_ui.cc:432
 msgid "Save a new preset"
 msgstr "Salva una nuova preimpostazione"
 
-#: plugin_ui.cc:432
+#: plugin_ui.cc:433
 msgid "Save the current preset"
 msgstr "Salva la preimpostazione corrente"
 
-#: plugin_ui.cc:433
+#: plugin_ui.cc:434
 msgid "Delete the current preset"
 msgstr "Cancella la preimpostazione corrente"
 
-#: plugin_ui.cc:434
+#: plugin_ui.cc:435
+msgid ""
+"Reset parameters to default (if no parameters are in automation play mode)"
+msgstr ""
+
+#: plugin_ui.cc:436
 msgid "Disable signal processing by the plugin"
 msgstr "Disabilita l'elaborazione del segnale da parte del plugin"
 
-#: plugin_ui.cc:467 plugin_ui.cc:663
+#: plugin_ui.cc:473 plugin_ui.cc:681
 msgid ""
 "Click to allow the plugin to receive keyboard events that %1 would normally "
 "use as a shortcut"
@@ -8459,25 +10007,25 @@ msgstr ""
 "Clicca per consentire al plugin di ricevere eventi dalla tastiera che "
 "normalmente %1 userebbe come una scorciatoia"
 
-#: plugin_ui.cc:468
+#: plugin_ui.cc:474
 msgid "Click to enable/disable this plugin"
 msgstr "Clicca per abilitare/disabilitare questo plugin"
 
-#: plugin_ui.cc:507
+#: plugin_ui.cc:517
 msgid "latency (%1 sample)"
 msgid_plural "latency (%1 samples)"
 msgstr[0] "latenza (%1 campione)"
 msgstr[1] "latenza (%1 campioni)"
 
-#: plugin_ui.cc:509
+#: plugin_ui.cc:519
 msgid "latency (%1 ms)"
 msgstr "latenza (%1 ms)"
 
-#: plugin_ui.cc:520
+#: plugin_ui.cc:530
 msgid "Edit Latency"
 msgstr "Modifica latenza"
 
-#: plugin_ui.cc:566
+#: plugin_ui.cc:576
 msgid ""
 "Plugin presets are not supported in this build of %1. Consider paying for a "
 "full version"
@@ -8486,87 +10034,103 @@ msgstr ""
 "Prendi in considerazione una sottoscrizione in denaro per la versione "
 "completa"
 
-#: plugin_ui.cc:574
+#: plugin_ui.cc:584
 msgid ""
 "Plugin presets are not supported in this build, see the Log window for more "
 "information."
 msgstr ""
 
-#: plugin_ui.cc:670
+#: plugin_ui.cc:592
+msgid "New Preset"
+msgstr "Nuovo preset"
+
+#: plugin_ui.cc:688
 msgid "Click to allow normal use of %1 keyboard shortcuts"
 msgstr "Clicca per consentire il normale utilizzo delle scorciatoie di %1"
 
-#: port_group.cc:337
+#: plugin_ui.cc:785
+msgid "(none)"
+msgstr ""
+
+#: port_group.cc:338
 msgid "%1 Busses"
 msgstr "%1 Bus"
 
-#: port_group.cc:338
+#: port_group.cc:339
 msgid "%1 Tracks"
 msgstr "%1 Tracce"
 
-#: port_group.cc:339
+#: port_group.cc:340
 msgid "Hardware"
 msgstr ""
 
-#: port_group.cc:340
+#: port_group.cc:341
 msgid "%1 Misc"
 msgstr "%1 Misc"
 
-#: port_group.cc:341
+#: port_group.cc:342
 msgid "Other"
 msgstr "Altro"
 
-#: port_group.cc:432 port_group.cc:433
+#: port_group.cc:434 port_group.cc:435
 msgid "LTC Out"
 msgstr "Uscita LTC "
 
-#: port_group.cc:436 port_group.cc:437
+#: port_group.cc:438 port_group.cc:439
 msgid "LTC In"
 msgstr "Ingresso LTC"
 
-#: port_group.cc:463
+#: port_group.cc:473
 msgid "MTC in"
 msgstr "Ingresso MTC"
 
-#: port_group.cc:466
+#: port_group.cc:476
 msgid "MIDI control in"
 msgstr "Controllo ingresso MIDI"
 
-#: port_group.cc:469
+#: port_group.cc:479
 msgid "MIDI clock in"
 msgstr "Ingresso orologio MIDI"
 
-#: port_group.cc:472
+#: port_group.cc:482
 msgid "MMC in"
 msgstr "Ingresso MMC"
 
-#: port_group.cc:476
+#: port_group.cc:486
 msgid "MTC out"
 msgstr "Uscita MTC"
 
-#: port_group.cc:479
+#: port_group.cc:489
 msgid "MIDI control out"
 msgstr "Uscita controllo MIDI"
 
-#: port_group.cc:482
+#: port_group.cc:492
 msgid "MIDI clock out"
 msgstr "Uscita controllo MIDI"
 
-#: port_group.cc:485
+#: port_group.cc:495
 msgid "MMC out"
 msgstr "Uscita MMC"
 
-#: port_group.cc:532
+#: port_group.cc:554
 msgid ":monitor"
 msgstr ":controllo"
 
-#: port_group.cc:544
+#: port_group.cc:570
 msgid "system:"
 msgstr "systema:"
 
-#: port_group.cc:545
-msgid "alsa_pcm"
-msgstr "alsa_pcm"
+#: port_group.cc:571
+msgid "alsa_pcm:"
+msgstr ""
+
+#: port_group.cc:572
+msgid "alsa_midi:"
+msgstr ""
+
+#: port_group.cc:577
+msgid "Scene "
+msgstr ""
 
 #: port_insert_ui.cc:39
 msgid "Measure Latency"
@@ -8588,82 +10152,76 @@ msgstr "Nessun segnale rilevato"
 msgid "Port Insert "
 msgstr ""
 
-#: port_matrix.cc:331 port_matrix.cc:357
+#: port_matrix.cc:341 port_matrix.cc:367
 msgid "<b>Sources</b>"
 msgstr "<b>Sorgenti</b>"
 
-#: port_matrix.cc:332 port_matrix.cc:358
+#: port_matrix.cc:342 port_matrix.cc:368
 msgid "<b>Destinations</b>"
 msgstr "<b>Destinazioni</b>"
 
-#: port_matrix.cc:440 port_matrix.cc:448
+#: port_matrix.cc:450 port_matrix.cc:458
 #, c-format
 msgid "Add %s %s"
 msgstr "Aggiungi %s %s"
 
-#: port_matrix.cc:456
+#: port_matrix.cc:466
 #, c-format
 msgid "Rename '%s'..."
 msgstr "Rinomina '%s'..."
 
-#: port_matrix.cc:472
+#: port_matrix.cc:482
 msgid "Remove all"
 msgstr "Rimuovi tutto"
 
-#: port_matrix.cc:492 port_matrix.cc:504
+#: port_matrix.cc:502 port_matrix.cc:514
 #, c-format
 msgid "%s all"
 msgstr "%s tutti"
 
-#: port_matrix.cc:527
+#: port_matrix.cc:537
 msgid "Rescan"
 msgstr "Aggiorna"
 
-#: port_matrix.cc:529
+#: port_matrix.cc:539
 msgid "Show individual ports"
 msgstr "Mostra porte individuali"
 
-#: port_matrix.cc:535
+#: port_matrix.cc:545
 msgid "Flip"
 msgstr ""
 
-#: port_matrix.cc:722
-msgid ""
-"It is not possible to add a port here, as the first processor in the track "
-"or buss cannot support the new configuration."
+#: port_matrix.cc:732
+msgid "It is not possible to add a port here."
 msgstr ""
-"Non è possibile aggiungere una porta qui perché il primo processore nella "
-"traccia o bus non supporta la nuova configurazione."
 
-#: port_matrix.cc:725
+#: port_matrix.cc:733
 msgid "Cannot add port"
 msgstr "Non posso aggiungere la porta"
 
-#: port_matrix.cc:747
-msgid "Port removal not allowed"
-msgstr "La rimozione delle porte non è consentita"
+#: port_matrix.cc:757
+msgid "The last port cannot be removed"
+msgstr ""
 
-#: port_matrix.cc:748
-msgid ""
-"This port cannot be removed.\n"
-"Either the first plugin in the track or buss cannot accept\n"
-"the new number of inputs or the last plugin has more outputs."
+#: port_matrix.cc:760
+msgid "This port cannot be removed."
 msgstr ""
-"Questa porta non può essere rimossa.\n"
-"O il primo plugin nella traccia o bus non può accettare \n"
-"i nuovi ingressi o l'ultimo plugin ha più uscite."
 
-#: port_matrix.cc:965
+#: port_matrix.cc:765
+msgid "Port removal not allowed"
+msgstr "La rimozione delle porte non è consentita"
+
+#: port_matrix.cc:981
 #, c-format
 msgid "Remove '%s'"
 msgstr "Rimuovi '%s'"
 
-#: port_matrix.cc:980
+#: port_matrix.cc:996
 #, c-format
 msgid "%s all from '%s'"
 msgstr "%s tutti da '%s'"
 
-#: port_matrix.cc:1046 transform_dialog.cc:62
+#: port_matrix.cc:1062 transform_dialog.cc:62
 msgid "channel"
 msgstr "canali"
 
@@ -8675,15 +10233,15 @@ msgstr "Non ci sono porte cui connettersi."
 msgid "There are no %1 ports to connect."
 msgstr "Non ci sono porte %1 cui connettersi."
 
-#: processor_box.cc:150
-msgid "Send"
-msgstr "Mandata"
-
-#: processor_box.cc:152
+#: processor_box.cc:226
 msgid "Return"
 msgstr "Ritorno"
 
-#: processor_box.cc:310
+#: processor_box.cc:323
+msgid "New Favorite Preset for \"%1\""
+msgstr ""
+
+#: processor_box.cc:501
 msgid ""
 "\n"
 "This mono plugin has been replicated %1 times."
@@ -8691,17 +10249,14 @@ msgstr ""
 "\n"
 "Questo plugin mono è stato replicato %1 volte."
 
-#: processor_box.cc:314
+#: processor_box.cc:505 processor_box.cc:1527
 msgid ""
 "<b>%1</b>\n"
 "Double-click to show GUI.\n"
-"Alt+double-click to show generic GUI.%2"
+"%2+double-click to show generic GUI.%3"
 msgstr ""
-"<b>%1</b>\n"
-"Doppio click per mostrare la GUI.\n"
-"Alt+doppio-clic per mostrare la GUI generica.%2"
 
-#: processor_box.cc:317
+#: processor_box.cc:508 processor_box.cc:1530
 msgid ""
 "<b>%1</b>\n"
 "Double-click to show generic GUI.%2"
@@ -8709,32 +10264,43 @@ msgstr ""
 "<b>%1</b>\n"
 "Doppio-clic per mostrare la GUI generica.%2"
 
-#: processor_box.cc:361
+#: processor_box.cc:514
+msgid ""
+"<b>%1</b>\n"
+"The Plugin is not available on this system\n"
+"and has been replaced by a stub."
+msgstr ""
+
+#: processor_box.cc:600
 #, c-format
 msgid "(%1x1) "
 msgstr "(%1x1)"
 
-#: processor_box.cc:437
+#: processor_box.cc:695
+msgid "Inline Display"
+msgstr ""
+
+#: processor_box.cc:703
 msgid "Show All Controls"
 msgstr "Mostra tutti i controlli"
 
-#: processor_box.cc:441
+#: processor_box.cc:707
 msgid "Hide All Controls"
 msgstr "Nascondi tutti i controlli"
 
-#: processor_box.cc:475
+#: processor_box.cc:752
 msgid "Link panner controls"
 msgstr ""
 
-#: processor_box.cc:575
+#: processor_box.cc:859
 msgid "on"
 msgstr "acceso"
 
-#: processor_box.cc:575 rc_option_editor.cc:2360 rc_option_editor.cc:2374
+#: processor_box.cc:859 rc_option_editor.cc:3178 rc_option_editor.cc:3192
 msgid "off"
 msgstr "spento"
 
-#: processor_box.cc:957
+#: processor_box.cc:1817
 msgid ""
 "Right-click to add/remove/edit\n"
 "plugins,inserts,sends and more"
@@ -8742,15 +10308,22 @@ msgstr ""
 "Clic-destro per inserire/rimuovere/modificare\n"
 "i plugin, mandate, innesti e altro"
 
-#: processor_box.cc:1429 processor_box.cc:1804
+#: processor_box.cc:1966
+msgid ""
+"Processor Drag/Drop failed. Probably because\n"
+"the I/O configuration of the plugins could\n"
+"not match the configuration of this track."
+msgstr ""
+
+#: processor_box.cc:2443 processor_box.cc:2986
 msgid "Plugin Incompatibility"
 msgstr "Incompatibilità del plugin"
 
-#: processor_box.cc:1432
+#: processor_box.cc:2446
 msgid "You attempted to add the plugin \"%1\" in slot %2.\n"
 msgstr "Hai tentato di aggiungere il plugin \"%1\" nella posizione %2.\n"
 
-#: processor_box.cc:1438
+#: processor_box.cc:2452
 msgid ""
 "\n"
 "This plugin has:\n"
@@ -8758,19 +10331,19 @@ msgstr ""
 "\n"
 "Questo plugin ha:\n"
 
-#: processor_box.cc:1441
+#: processor_box.cc:2455
 msgid "\t%1 MIDI input\n"
 msgid_plural "\t%1 MIDI inputs\n"
 msgstr[0] "\t%1 ingresso MIDI\n"
 msgstr[1] "\t%1 ingressi MIDI\n"
 
-#: processor_box.cc:1445
+#: processor_box.cc:2459
 msgid "\t%1 audio input\n"
 msgid_plural "\t%1 audio inputs\n"
 msgstr[0] "\t%1 ingresso audio\n"
 msgstr[1] "\t%1 ingressi audio\n"
 
-#: processor_box.cc:1448
+#: processor_box.cc:2462
 msgid ""
 "\n"
 "but at the insertion point, there are:\n"
@@ -8778,19 +10351,19 @@ msgstr ""
 "\n"
 "ma in corrispondenza del punto di inserimento ci sono:\n"
 
-#: processor_box.cc:1451
+#: processor_box.cc:2465
 msgid "\t%1 MIDI channel\n"
 msgid_plural "\t%1 MIDI channels\n"
 msgstr[0] "\t%1 canale MIDI\n"
 msgstr[1] "\t%1 canali MIDI\n"
 
-#: processor_box.cc:1455
+#: processor_box.cc:2469
 msgid "\t%1 audio channel\n"
 msgid_plural "\t%1 audio channels\n"
 msgstr[0] "\t%1 canale audio\n"
 msgstr[1] "\t%1 canali audio\n"
 
-#: processor_box.cc:1458
+#: processor_box.cc:2472
 msgid ""
 "\n"
 "%1 is unable to insert this plugin here.\n"
@@ -8798,11 +10371,7 @@ msgstr ""
 "\n"
 "%1 non può inserire qui questo plugin.\n"
 
-#: processor_box.cc:1495
-msgid "Cannot set up new send: %1"
-msgstr "Impossibile prepare la nuova mandata: %1"
-
-#: processor_box.cc:1807
+#: processor_box.cc:2989
 msgid ""
 "You cannot reorder these plugins/sends/inserts\n"
 "in that way because the inputs and\n"
@@ -8812,20 +10381,20 @@ msgstr ""
 "in questa maniera perché gli ingressi e le uscite\n"
 "non funzionerebbero correttamente."
 
-#: processor_box.cc:1991
+#: processor_box.cc:3189
 msgid "Rename Processor"
 msgstr "Rinomina processore"
 
-#: processor_box.cc:2022
+#: processor_box.cc:3220
 msgid "At least 100 IO objects exist with a name like %1 - name not changed"
 msgstr ""
 "Esistono almeno 100 oggetti I/O con un nome simile a %1 - nome non cambiato"
 
-#: processor_box.cc:2159
+#: processor_box.cc:3371
 msgid "plugin insert constructor failed"
 msgstr "il costruttore dell'innesto per il plugin ha fallito"
 
-#: processor_box.cc:2170
+#: processor_box.cc:3382
 msgid ""
 "Copying the set of processors on the clipboard failed,\n"
 "probably because the I/O configuration of the plugins\n"
@@ -8835,7 +10404,7 @@ msgstr ""
 "probabilmente perché la configurazione I/O dei plugin\n"
 "non combacia con la configurazione di questa traccia."
 
-#: processor_box.cc:2216
+#: processor_box.cc:3428
 msgid ""
 "Do you really want to remove all processors from %1?\n"
 "(this cannot be undone)"
@@ -8843,15 +10412,15 @@ msgstr ""
 "Veramente vuoi rimuovere tutti i processori da %1?\n"
 "(questa operazione non può essere annullata)"
 
-#: processor_box.cc:2220 processor_box.cc:2245
+#: processor_box.cc:3432 processor_box.cc:3457
 msgid "Yes, remove them all"
 msgstr "Si, rimuovi tutto"
 
-#: processor_box.cc:2222 processor_box.cc:2247
+#: processor_box.cc:3434 processor_box.cc:3459
 msgid "Remove processors"
 msgstr "Rimuovi processori"
 
-#: processor_box.cc:2237
+#: processor_box.cc:3449
 msgid ""
 "Do you really want to remove all pre-fader processors from %1?\n"
 "(this cannot be undone)"
@@ -8859,7 +10428,7 @@ msgstr ""
 "Veramente vuoi rimuovere tutti i processori pre-fader da %1?\n"
 "(questa operazione non può essere annullata)"
 
-#: processor_box.cc:2240
+#: processor_box.cc:3452
 msgid ""
 "Do you really want to remove all post-fader processors from %1?\n"
 "(this cannot be undone)"
@@ -8867,59 +10436,59 @@ msgstr ""
 "Veramente vuoi rimuovere tutti i processori post-fader da %1?\n"
 "(questa operazione non può essere annullata)"
 
-#: processor_box.cc:2428
+#: processor_box.cc:3641
 msgid "New Plugin"
 msgstr "Nuovo plugin"
 
-#: processor_box.cc:2431
+#: processor_box.cc:3644
 msgid "New Insert"
 msgstr "Nuovo insert"
 
-#: processor_box.cc:2434
+#: processor_box.cc:3647
 msgid "New External Send ..."
 msgstr "Nuova mandata esterna..."
 
-#: processor_box.cc:2438
+#: processor_box.cc:3651
 msgid "New Aux Send ..."
 msgstr "Nuova mandata ausiliaria..."
 
-#: processor_box.cc:2441
+#: processor_box.cc:3654
 msgid "Send Options"
 msgstr "Opzioni della mandata"
 
-#: processor_box.cc:2443
+#: processor_box.cc:3656
 msgid "Clear (all)"
 msgstr "Pulisci (tutto)"
 
-#: processor_box.cc:2445
+#: processor_box.cc:3658
 msgid "Clear (pre-fader)"
 msgstr "Pulisci (pre-fader)"
 
-#: processor_box.cc:2447
+#: processor_box.cc:3660
 msgid "Clear (post-fader)"
 msgstr "Pulisci (post-fader)"
 
-#: processor_box.cc:2473
+#: processor_box.cc:3690
 msgid "Activate All"
 msgstr "Attiva tutto"
 
-#: processor_box.cc:2475
+#: processor_box.cc:3692
 msgid "Deactivate All"
 msgstr "Disattiva tutto"
 
-#: processor_box.cc:2477
+#: processor_box.cc:3694
 msgid "A/B Plugins"
 msgstr "Plugin A/B"
 
-#: processor_box.cc:2486
+#: processor_box.cc:3707
 msgid "Edit with generic controls..."
 msgstr "Modifica attraverso i controlli generici..."
 
-#: processor_box.cc:2789
+#: processor_box.cc:4039
 msgid "%1: %2 (by %3)"
 msgstr "%1: %2 (per %3)"
 
-#: processor_box.cc:2791
+#: processor_box.cc:4041
 msgid "%1 (by %2)"
 msgstr "%1 (di %2)"
 
@@ -8947,135 +10516,296 @@ msgstr "Banco"
 msgid "main grid"
 msgstr "griglia principale"
 
-#: quantize_dialog.cc:52 quantize_dialog.cc:109
+#: quantize_dialog.cc:61 quantize_dialog.cc:118
 msgid "Quantize"
 msgstr "Quantizza"
 
-#: quantize_dialog.cc:56
+#: quantize_dialog.cc:65
 msgid "Strength"
 msgstr "Forza"
 
-#: quantize_dialog.cc:59
+#: quantize_dialog.cc:68
 msgid "Swing"
 msgstr "Swing"
 
-#: quantize_dialog.cc:62
+#: quantize_dialog.cc:71
 msgid "Threshold (ticks)"
 msgstr "Soglia (ticks)"
 
-#: quantize_dialog.cc:63
+#: quantize_dialog.cc:72
 msgid "Snap note start"
 msgstr ""
 
-#: quantize_dialog.cc:64
+#: quantize_dialog.cc:73
 msgid "Snap note end"
 msgstr ""
 
-#: rc_option_editor.cc:77
-msgid "Click audio file:"
-msgstr "File audio (click):"
-
-#: rc_option_editor.cc:80 rc_option_editor.cc:87
+#: rc_option_editor.cc:83 rc_option_editor.cc:84 rc_option_editor.cc:1550
 msgid "Browse..."
 msgstr "Sfoglia..."
 
-#: rc_option_editor.cc:84
+#: rc_option_editor.cc:89
+msgid "Emphasis on first beat:"
+msgstr ""
+
+#: rc_option_editor.cc:95
+msgid "Use default Click:"
+msgstr ""
+
+#: rc_option_editor.cc:101
+msgid "Click audio file:"
+msgstr "File audio (click):"
+
+#: rc_option_editor.cc:108
 msgid "Click emphasis audio file:"
 msgstr "Pecorso del file di enfasi click"
 
-#: rc_option_editor.cc:116
+#: rc_option_editor.cc:154
 msgid "Choose Click"
 msgstr "Scegli click"
 
-#: rc_option_editor.cc:139
+#: rc_option_editor.cc:177
 msgid "Choose Click Emphasis"
 msgstr "Usa come enfasi del click"
 
-#: rc_option_editor.cc:170
+#: rc_option_editor.cc:238
 msgid "Limit undo history to"
 msgstr "Limita lo storico degli annullamenti a"
 
-#: rc_option_editor.cc:171
+#: rc_option_editor.cc:239
 msgid "Save undo history of"
 msgstr "Salva lo storico degli annullamenti di"
 
-#: rc_option_editor.cc:180 rc_option_editor.cc:187
+#: rc_option_editor.cc:248 rc_option_editor.cc:255
 msgid "commands"
 msgstr "comandi"
 
-#: rc_option_editor.cc:325
+#: rc_option_editor.cc:378
+msgid ""
+"\n"
+"Changes to this setting will only persist after your project has been saved."
+msgstr ""
+
+#: rc_option_editor.cc:389 rc_option_editor.cc:451
+msgid "<b>Recommended Setting: %1 + button 3 (right mouse button)</b>%2"
+msgstr ""
+
+#: rc_option_editor.cc:403
+msgid "Select Keyboard layout:"
+msgstr ""
+
+#: rc_option_editor.cc:422
+msgid "When Clicking:"
+msgstr ""
+
+#: rc_option_editor.cc:429
 msgid "Edit using:"
 msgstr "Modifica usando:"
 
-#: rc_option_editor.cc:331 rc_option_editor.cc:357 rc_option_editor.cc:384
+#: rc_option_editor.cc:435 rc_option_editor.cc:465 rc_option_editor.cc:495
 msgid "+ button"
 msgstr "+ pulsante"
 
-#: rc_option_editor.cc:351
+#: rc_option_editor.cc:459
 msgid "Delete using:"
 msgstr "Elimina usando:"
 
-#: rc_option_editor.cc:378
+#: rc_option_editor.cc:481
+msgid "<b>Recommended Setting: %1 + button 1 (left mouse button)</b>%2"
+msgstr ""
+
+#: rc_option_editor.cc:489
 msgid "Insert note using:"
 msgstr "Inserisci nota usando:"
 
-#: rc_option_editor.cc:405
+#: rc_option_editor.cc:507
+msgid "When Beginning a Drag:"
+msgstr ""
+
+#: rc_option_editor.cc:518 rc_option_editor.cc:545 rc_option_editor.cc:578
+#: rc_option_editor.cc:599 rc_option_editor.cc:643 rc_option_editor.cc:676
+#: rc_option_editor.cc:702 rc_option_editor.cc:730 rc_option_editor.cc:759
+#: rc_option_editor.cc:781
+msgid "<b>Recommended Setting: %1</b>%2"
+msgstr ""
+
+#: rc_option_editor.cc:532
+msgid "Copy items using:"
+msgstr ""
+
+#: rc_option_editor.cc:559
+msgid "Constrain drag using:"
+msgstr ""
+
+#: rc_option_editor.cc:567
+msgid "When Beginning a Trim:"
+msgstr ""
+
+#: rc_option_editor.cc:586
+msgid "Trim contents using:"
+msgstr ""
+
+#: rc_option_editor.cc:607
+msgid "Anchored trim using:"
+msgstr ""
+
+#: rc_option_editor.cc:651
+msgid "Resize notes relatively using:"
+msgstr ""
+
+#: rc_option_editor.cc:660
+msgid "While Dragging:"
+msgstr ""
+
+#: rc_option_editor.cc:684
 msgid "Ignore snap using:"
 msgstr ""
 
-#: rc_option_editor.cc:421
-msgid "Keyboard layout:"
-msgstr "Disposizione della tastiera:"
+#: rc_option_editor.cc:710
+msgid "Snap relatively using:"
+msgstr ""
 
-#: rc_option_editor.cc:544
-msgid "Font scaling:"
-msgstr "Scala del carattere"
+#: rc_option_editor.cc:718
+msgid "While Trimming:"
+msgstr ""
+
+#: rc_option_editor.cc:738
+msgid "Resize overlapped regions using:"
+msgstr ""
 
-#: rc_option_editor.cc:547
+#: rc_option_editor.cc:746
+msgid "While Dragging Control Points:"
+msgstr ""
+
+#: rc_option_editor.cc:767
+msgid "Fine adjust using:"
+msgstr ""
+
+#: rc_option_editor.cc:789
+msgid "Push points using:"
+msgstr ""
+
+#: rc_option_editor.cc:1029
+msgid "GUI and Font scaling:"
+msgstr ""
+
+#: rc_option_editor.cc:1032
 msgid "Default"
 msgstr "Default"
 
-#: rc_option_editor.cc:573
-msgid "Major font-scale changes require an application restart to re-layout."
+#: rc_option_editor.cc:1058
+msgid "Adjusting the scale requires an application restart to re-layout."
+msgstr ""
+
+#: rc_option_editor.cc:1100
+msgid "∞"
+msgstr ""
+
+#: rc_option_editor.cc:1101
+msgid "30 sec"
+msgstr ""
+
+#: rc_option_editor.cc:1102
+msgid "1 min"
+msgstr ""
+
+#: rc_option_editor.cc:1103
+msgid "2 mins"
+msgstr ""
+
+#: rc_option_editor.cc:1104
+msgid "3 mins"
+msgstr ""
+
+#: rc_option_editor.cc:1105
+msgid "4 mins"
+msgstr ""
+
+#: rc_option_editor.cc:1106
+msgid "5 mins"
 msgstr ""
-"I cambiamenti principali nell scala del fonto richiedono il riavvio "
-"dell'applicazione."
 
-#: rc_option_editor.cc:614
+#: rc_option_editor.cc:1109
+msgid ""
+"Specify the default timeout for plugin instantiation. Plugins that require "
+"more time to load will be blacklisted. A value of 0 disables the timeout."
+msgstr ""
+
+#: rc_option_editor.cc:1111
+msgid "Scan Time Out:"
+msgstr ""
+
+#: rc_option_editor.cc:1159
 msgid "Waveform Clip Level (dBFS):"
 msgstr ""
 
-#: rc_option_editor.cc:666
+#: rc_option_editor.cc:1212
+msgid "Small sessions (4-16 tracks)"
+msgstr ""
+
+#: rc_option_editor.cc:1213
+msgid "Medium sessions (16-64 tracks)"
+msgstr ""
+
+#: rc_option_editor.cc:1214
+msgid "Large sessions (64+ tracks)"
+msgstr ""
+
+#: rc_option_editor.cc:1215
+msgid "Custom (set by sliders below)"
+msgstr ""
+
+#: rc_option_editor.cc:1219 export_video_dialog.cc:167
+msgid "Preset:"
+msgstr "Preimpostazione:"
+
+#: rc_option_editor.cc:1231
 msgid "Playback (seconds of buffering):"
 msgstr "Riproduzione (secondi di buffering)"
 
-#: rc_option_editor.cc:679
+#: rc_option_editor.cc:1244
 msgid "Recording (seconds of buffering):"
 msgstr "Registrazione (secondi di buffering)"
 
-#: rc_option_editor.cc:737
+#: rc_option_editor.cc:1322
+msgid "programming error: unknown buffering preset string, index = %1"
+msgstr ""
+
+#: rc_option_editor.cc:1353
 msgid "Control Surface Protocol"
 msgstr ""
 
-#: rc_option_editor.cc:746
-msgid "Double-click on a name to edit settings for an enabled protocol"
+#: rc_option_editor.cc:1367
+msgid ""
+"Click to edit the settings for selected protocol ( it must be ENABLED "
+"first ):"
+msgstr ""
+
+#: rc_option_editor.cc:1371
+msgid "Show Protocol Settings"
 msgstr ""
-"Doppio click su un nome per modificare le impostazioni di un protocollo "
-"abilitato"
 
-#: rc_option_editor.cc:903
+#: rc_option_editor.cc:1494
+msgid "Configuration"
+msgstr ""
+
+#: rc_option_editor.cc:1547
 msgid "Show Video Export Info before export"
 msgstr "Mostra le informazioni di esportazione video prima di esportare"
 
-#: rc_option_editor.cc:904
+#: rc_option_editor.cc:1548
 msgid "Show Video Server Startup Dialog"
 msgstr "Mostra la finestra di dialogo delle informazioni del server video"
 
-#: rc_option_editor.cc:905
+#: rc_option_editor.cc:1549
 msgid "Advanced Setup (remote video server)"
 msgstr "Impostazioni avanzate (server video remoto)"
 
-#: rc_option_editor.cc:913
+#: rc_option_editor.cc:1556
+msgid "Video Server"
+msgstr ""
+
+#: rc_option_editor.cc:1565
 msgid ""
 "<b>When enabled</b> you can speficify a custom video-server URL and docroot. "
 "- Do not enable this option unless you know what you are doing."
@@ -9084,11 +10814,11 @@ msgstr ""
 "personalizzato ed una docroot. - Non abilitare questa opzione se non sai "
 "cosa stai facendo."
 
-#: rc_option_editor.cc:915
+#: rc_option_editor.cc:1567
 msgid "Video Server URL:"
 msgstr "URL del server video:"
 
-#: rc_option_editor.cc:920
+#: rc_option_editor.cc:1572
 msgid ""
 "Base URL of the video-server including http prefix. This is usually 'http://"
 "hostname.example.org:1554/' and defaults to 'http://localhost:1554/' when "
@@ -9098,11 +10828,11 @@ msgstr ""
 "'http://hostname.example.org:1554/' e di default è 'http://localhost:1554/' "
 "se il server video è locale"
 
-#: rc_option_editor.cc:922
+#: rc_option_editor.cc:1574
 msgid "Video Folder:"
 msgstr "Cartella video:"
 
-#: rc_option_editor.cc:927
+#: rc_option_editor.cc:1579
 msgid ""
 "Local path to the video-server document-root. Only files below this "
 "directory will be accessible by the video-server. If the server run on a "
@@ -9117,7 +10847,7 @@ msgstr ""
 "per il monitoraggio video locale e per la navigazione dei file durante "
 "l'apertura/aggiunta di un file video."
 
-#: rc_option_editor.cc:934
+#: rc_option_editor.cc:1584
 msgid ""
 "<b>When enabled</b> an information window with details is displayed before "
 "the video-export dialog."
@@ -9125,7 +10855,7 @@ msgstr ""
 "<b>Se abilitata</b> una finestra di dialogo informativa contenente i "
 "dettagli viene mostrata prima della finestra di esportazione video."
 
-#: rc_option_editor.cc:939
+#: rc_option_editor.cc:1589
 msgid ""
 "<b>When enabled</b> the video server is never launched automatically without "
 "confirmation"
@@ -9133,179 +10863,113 @@ msgstr ""
 "<b>Se abilitata</b> il server video non viene mai lanciato automaticamente "
 "senza conferma"
 
-#: rc_option_editor.cc:1022
-msgid "Always Display Plugin Scan Progress"
-msgstr ""
-
-#: rc_option_editor.cc:1023
-msgid "Scan for [new] VST Plugins on Application Start"
-msgstr ""
-
-#: rc_option_editor.cc:1024
-msgid "Scan for AudioUnit Plugins on Application Start"
-msgstr ""
-
-#: rc_option_editor.cc:1035
-msgid "General"
-msgstr "Generale"
-
-#: rc_option_editor.cc:1041
-msgid "Scan for Plugins"
-msgstr "Ricerca dei plugin"
-
-#: rc_option_editor.cc:1048
-msgid ""
-"<b>When enabled</b> a popup window showing plugin scan progress is displayed "
-"for indexing (cache load) and discovery (detect new plugins)"
-msgstr ""
-
-#: rc_option_editor.cc:1055
-msgid ""
-"Specify the default timeout for plugin instantiation in 1/10 seconds. "
-"Plugins that require more time to load will be blacklisted. A value of 0 "
-"disables the timeout."
-msgstr ""
-
-#: rc_option_editor.cc:1057
-msgid "Scan Time Out [deciseconds]"
-msgstr ""
-
-#: rc_option_editor.cc:1065
-msgid "VST"
-msgstr "VST"
-
-#: rc_option_editor.cc:1071
-msgid "Clear VST Cache"
-msgstr "Pulisci la cache VST"
-
-#: rc_option_editor.cc:1075
-msgid "Clear VST Blacklist"
-msgstr "Pulisci la lista nera VST"
-
-#: rc_option_editor.cc:1083
-msgid ""
-"<b>When enabled</b> new VST plugins are searched, tested and added to the "
-"cache index on application start. When disabled new plugins will only be "
-"available after triggering a 'Scan' manually"
+#: rc_option_editor.cc:1598
+msgid "Custom Path to Video Monitor (%1) - leave empty for default:"
 msgstr ""
 
-#: rc_option_editor.cc:1086
-msgid "Linux VST Path:"
-msgstr "Path VST Linux:"
-
-#: rc_option_editor.cc:1093
-msgid "Windows VST Path:"
-msgstr "Percorso VST Windows"
-
-#: rc_option_editor.cc:1102
-msgid "Audio Unit"
-msgstr "Unità audio"
-
-#: rc_option_editor.cc:1111
+#: rc_option_editor.cc:1610
 msgid ""
-"<b>When enabled</b> Audio Unit Plugins are discovered on application start. "
-"When disabled AU plugins will only be available after triggering a 'Scan' "
-"manually. The first successful scan will enable AU auto-scan, Any crash "
-"during plugin discovery will disable it."
+"Set a custom path to the Video Monitor Executable, changing this requires a "
+"restart."
 msgstr ""
 
-#: rc_option_editor.cc:1114
-msgid "Clear AU Cache"
-msgstr "Pulisci la cache AU"
-
-#: rc_option_editor.cc:1118
-msgid "Clear AU Blacklist"
-msgstr "Pulisci la lista nera AU"
-
-#: rc_option_editor.cc:1201
-msgid "Set Windows VST Search Path"
+#: rc_option_editor.cc:1661
+msgid "Set Video Monitor Executable"
 msgstr ""
 
-#: rc_option_editor.cc:1216
-msgid "Set Linux VST Search Path"
+#: rc_option_editor.cc:1734
+msgid "Column %1"
 msgstr ""
 
-#: rc_option_editor.cc:1297
+#: rc_option_editor.cc:1852
 msgid "%1 Preferences"
 msgstr "Preferenze %1"
 
-#: rc_option_editor.cc:1309
+#: rc_option_editor.cc:1874
 msgid "DSP CPU Utilization"
 msgstr "Utilizzo DSP CPU "
 
-#: rc_option_editor.cc:1313
+#: rc_option_editor.cc:1878
 msgid "Signal processing uses"
 msgstr "Elaborazione del segnale utilizza"
 
-#: rc_option_editor.cc:1318
+#: rc_option_editor.cc:1883
 msgid "all but one processor"
 msgstr "tutti i processori tranne uno"
 
-#: rc_option_editor.cc:1319
+#: rc_option_editor.cc:1884
 msgid "all available processors"
 msgstr "tutti i processori disponibili"
 
-#: rc_option_editor.cc:1322
+#: rc_option_editor.cc:1887
 msgid "%1 processors"
 msgstr "%1 processori"
 
-#: rc_option_editor.cc:1325
+#: rc_option_editor.cc:1890
 msgid "This setting will only take effect when %1 is restarted."
 msgstr "Questa impostazione avrà effetto quando %1 verrà riavviato."
 
-#: rc_option_editor.cc:1330
+#: rc_option_editor.cc:1895
 msgid "Options|Undo"
 msgstr "Opzioni|Undo"
 
-#: rc_option_editor.cc:1337
+#: rc_option_editor.cc:1902
 msgid "Verify removal of last capture"
 msgstr "Verifica la rimozione dell'ultima cattura"
 
-#: rc_option_editor.cc:1345
-msgid "Make periodic backups of the session file"
-msgstr "Fai periodicamente un backup del file di sessione"
-
-#: rc_option_editor.cc:1350
+#: rc_option_editor.cc:1907
 msgid "Session Management"
 msgstr "Gestione delle sessione"
 
-#: rc_option_editor.cc:1355
+#: rc_option_editor.cc:1912
+msgid "Make periodic backups of the session file"
+msgstr "Fai periodicamente un backup del file di sessione"
+
+#: rc_option_editor.cc:1920
 msgid "Always copy imported files"
 msgstr "Copia sempre i file importati"
 
-#: rc_option_editor.cc:1362
+#: rc_option_editor.cc:1927
 msgid "Default folder for new sessions:"
 msgstr "Cartella di default per le nuove sessioni:"
 
-#: rc_option_editor.cc:1370
+#: rc_option_editor.cc:1935
 msgid "Maximum number of recent sessions"
 msgstr "Numero massimo per le sessioni recenti:"
 
-#: rc_option_editor.cc:1383
+#: rc_option_editor.cc:1941 rc_option_editor.cc:1943 rc_option_editor.cc:1945
+msgid "Misc/Click"
+msgstr ""
+
+#: rc_option_editor.cc:1948
 msgid "Click gain level"
 msgstr "Livello di guadagno del click"
 
-#: rc_option_editor.cc:1388 route_time_axis.cc:266 route_time_axis.cc:821
+#: rc_option_editor.cc:1953 route_time_axis.cc:277 route_time_axis.cc:831
 msgid "Automation"
 msgstr "Automazione"
 
-#: rc_option_editor.cc:1393
+#: rc_option_editor.cc:1958
 msgid "Thinning factor (larger value => less data)"
 msgstr ""
 
-#: rc_option_editor.cc:1402
+#: rc_option_editor.cc:1967
 msgid "Automation sampling interval (milliseconds)"
 msgstr "Intervallo di campionamento dell'automazione (millisecondi)"
 
-#: rc_option_editor.cc:1414
+#: rc_option_editor.cc:1975
+msgid "Transport Options"
+msgstr ""
+
+#: rc_option_editor.cc:1981
 msgid "Keep record-enable engaged on stop"
 msgstr "Mantieni la registrazione abilitata dopo lo stop"
 
-#: rc_option_editor.cc:1423
+#: rc_option_editor.cc:1990
 msgid "Play loop is a transport mode"
 msgstr ""
 
-#: rc_option_editor.cc:1428
+#: rc_option_editor.cc:1995
 msgid ""
 "<b>When enabled</b> the loop button does not start playback but forces "
 "playback to always play the loop\n"
@@ -9314,25 +10978,25 @@ msgid ""
 "cancels loop playback"
 msgstr ""
 
-#: rc_option_editor.cc:1434
+#: rc_option_editor.cc:2001
 msgid "Stop recording when an xrun occurs"
 msgstr "Ferma la registrazione in caso di xrun"
 
-#: rc_option_editor.cc:1439
+#: rc_option_editor.cc:2006
 msgid ""
 "<b>When enabled</b> %1 will stop recording if an over- or underrun is "
 "detected by the audio engine"
 msgstr ""
 
-#: rc_option_editor.cc:1445
+#: rc_option_editor.cc:2012
 msgid "Create markers where xruns occur"
 msgstr "Crea marcatori in corrispondenza di ogni xrun"
 
-#: rc_option_editor.cc:1454
+#: rc_option_editor.cc:2021
 msgid "Stop at the end of the session"
 msgstr "Fermati alla fine della sessione"
 
-#: rc_option_editor.cc:1459
+#: rc_option_editor.cc:2026
 msgid ""
 "<b>When enabled</b> if %1 is <b>not recording</b>, it will stop the "
 "transport when it reaches the current session end marker\n"
@@ -9341,11 +11005,11 @@ msgid ""
 "all times"
 msgstr ""
 
-#: rc_option_editor.cc:1467
+#: rc_option_editor.cc:2034
 msgid "Do seamless looping (not possible when slaved to MTC, LTC etc)"
 msgstr ""
 
-#: rc_option_editor.cc:1472
+#: rc_option_editor.cc:2039
 msgid ""
 "<b>When enabled</b> this will loop by reading ahead and wrapping around at "
 "the loop point, preventing any need to do a transport locate at the end of "
@@ -9355,39 +11019,83 @@ msgid ""
 "loop when %1 reaches the end which will often cause a small click or delay"
 msgstr ""
 
-#: rc_option_editor.cc:1480
+#: rc_option_editor.cc:2047
 msgid "Disable per-track record disarm while rolling"
 msgstr ""
 
-#: rc_option_editor.cc:1484
+#: rc_option_editor.cc:2051
 msgid ""
 "<b>When enabled</b> this will prevent you from accidentally stopping "
 "specific tracks recording during a take"
 msgstr ""
 
-#: rc_option_editor.cc:1489
+#: rc_option_editor.cc:2056
 msgid "12dB gain reduction during fast-forward and fast-rewind"
 msgstr "Riduci il segnale di 12dB in avanzamento/riavvolgimento rapido"
 
-#: rc_option_editor.cc:1493
+#: rc_option_editor.cc:2060
 msgid ""
 "This will reduce the unpleasant increase in perceived volume that occurs "
 "when fast-forwarding or rewinding through some kinds of audio"
 msgstr ""
 
-#: rc_option_editor.cc:1497
-msgid "Sync/Slave"
+#: rc_option_editor.cc:2066
+msgid "Preroll"
+msgstr ""
+
+#: rc_option_editor.cc:2071
+msgid ""
+"The amount of preroll (in seconds) to apply when <b>Play with Preroll</b> is "
+"initiated.\n"
+"\n"
+"If <b>Follow Edits</b> is enabled, the preroll is applied to the playhead "
+"position when a region is selected or trimmed."
+msgstr ""
+
+#: rc_option_editor.cc:2073
+msgid "0 (no pre-roll)"
+msgstr ""
+
+#: rc_option_editor.cc:2074
+msgid "0.1 second"
+msgstr ""
+
+#: rc_option_editor.cc:2075
+msgid "0.25 second"
+msgstr ""
+
+#: rc_option_editor.cc:2076
+msgid "0.5 second"
+msgstr ""
+
+#: rc_option_editor.cc:2077
+msgid "1.0 second"
+msgstr ""
+
+#: rc_option_editor.cc:2078
+msgid "2.0 seconds"
+msgstr ""
+
+#: rc_option_editor.cc:2081 rc_option_editor.cc:2090 rc_option_editor.cc:2106
+#: rc_option_editor.cc:2127 rc_option_editor.cc:2145 rc_option_editor.cc:2147
+#: rc_option_editor.cc:2164 rc_option_editor.cc:2167 rc_option_editor.cc:2169
+#: rc_option_editor.cc:2197
+msgid "Transport/Sync"
+msgstr ""
+
+#: rc_option_editor.cc:2081
+msgid "Synchronization and Slave Options"
 msgstr ""
 
-#: rc_option_editor.cc:1501
+#: rc_option_editor.cc:2085
 msgid "External timecode source"
 msgstr ""
 
-#: rc_option_editor.cc:1510
+#: rc_option_editor.cc:2094
 msgid "Match session video frame rate to external timecode"
 msgstr ""
 
-#: rc_option_editor.cc:1516
+#: rc_option_editor.cc:2100
 msgid ""
 "This option controls the value of the video frame rate <i>while chasing</i> "
 "an external timecode source.\n"
@@ -9401,27 +11109,27 @@ msgid ""
 "external timecode standard and the session standard."
 msgstr ""
 
-#: rc_option_editor.cc:1526
-msgid "Sync lock timecode to clock - Disable drift compensation."
+#: rc_option_editor.cc:2110
+msgid "Sync-lock timecode to clock (disable drift compensation)"
 msgstr ""
 
-#: rc_option_editor.cc:1532
+#: rc_option_editor.cc:2116
 msgid ""
 "<b>When enabled</b> %1 will never varispeed when slaved to external "
 "timecode. Sync Lock indicates that the selected external timecode source "
 "shares clock-sync (Black & Burst, Wordclock, etc) with the audio "
 "interface. This option disables drift compensation. The transport speed is "
-"fixed at 1.0.Varispeed LTC will be ignored and cause drift.\n"
+"fixed at 1.0. Vari-speed LTC will be ignored and cause drift.\n"
 "\n"
 "<b>When disabled</b> %1 will compensate for potential drift, regardless if "
 "the timecode sources shares clock sync."
 msgstr ""
 
-#: rc_option_editor.cc:1547
+#: rc_option_editor.cc:2131
 msgid "Lock to 29.9700 fps instead of 30000/1001"
 msgstr ""
 
-#: rc_option_editor.cc:1553
+#: rc_option_editor.cc:2137
 msgid ""
 "<b>When enabled</b> the external timecode source is assumed to use 29.97 fps "
 "instead of 30000/1001.\n"
@@ -9434,594 +11142,829 @@ msgid ""
 "variant of using exactly 29.97 fps has zero timecode drift.\n"
 msgstr ""
 
-#: rc_option_editor.cc:1563
+#: rc_option_editor.cc:2147
 msgid "LTC Reader"
 msgstr "Lettore LTC"
 
-#: rc_option_editor.cc:1567
+#: rc_option_editor.cc:2151
 msgid "LTC incoming port"
 msgstr ""
 
-#: rc_option_editor.cc:1582
+#: rc_option_editor.cc:2167
 msgid "LTC Generator"
 msgstr ""
 
-#: rc_option_editor.cc:1587
+#: rc_option_editor.cc:2172
 msgid "Enable LTC generator"
 msgstr ""
 
-#: rc_option_editor.cc:1594
+#: rc_option_editor.cc:2179
 msgid "Send LTC while stopped"
 msgstr ""
 
-#: rc_option_editor.cc:1600
+#: rc_option_editor.cc:2185
 msgid ""
 "<b>When enabled</b> %1 will continue to send LTC information even when the "
 "transport (playhead) is not moving"
 msgstr ""
 
-#: rc_option_editor.cc:1606
+#: rc_option_editor.cc:2191
 msgid "LTC generator level"
 msgstr ""
 
-#: rc_option_editor.cc:1610
+#: rc_option_editor.cc:2195
 msgid ""
 "Specify the Peak Volume of the generated LTC signal in dbFS. A good value "
 "is  0dBu ^= -18dbFS in an EBU calibrated system"
 msgstr ""
 
-#: rc_option_editor.cc:1622
-msgid "Allow dragging of playhead"
+#: rc_option_editor.cc:2204
+msgid "Make rubberband selection rectangle snap to the grid"
 msgstr ""
 
-#: rc_option_editor.cc:1630
-msgid "Move relevant automation when audio regions are moved"
+#: rc_option_editor.cc:2211
+msgid "Name new markers"
+msgstr "Assegna un nome ai nuovi marcatori"
+
+#: rc_option_editor.cc:2216
+msgid ""
+"If enabled, popup a dialog when a new marker is created to allow its name to "
+"be set as it is created.\n"
+"\n"
+"You can always rename markers by right-clicking on them"
 msgstr ""
-"Sposta le automazioni rilevanti quando le regioni audio vengono spostate"
 
-#: rc_option_editor.cc:1638
-msgid "Show meters on tracks in the editor"
-msgstr "Mostra i meter sulle tracce nell'editor"
+#: rc_option_editor.cc:2222
+msgid "Allow dragging of playhead"
+msgstr ""
 
-#: rc_option_editor.cc:1646
+#: rc_option_editor.cc:2230
 msgid "Display master-meter in the toolbar"
 msgstr ""
 
-#: rc_option_editor.cc:1653
-msgid "Default fade shape"
+#: rc_option_editor.cc:2239
+msgid "Show zoom toolbar (if torn off)"
 msgstr ""
 
-#: rc_option_editor.cc:1672
-msgid "Regions in active edit groups are edited together"
+#: rc_option_editor.cc:2247
+msgid ""
+"Always use mouse cursor position as zoom focus when zooming using mouse "
+"scroll wheel"
 msgstr ""
 
-#: rc_option_editor.cc:1673
-msgid "whenever they overlap in time"
+#: rc_option_editor.cc:2256
+msgid "Update editor window during drags of the summary"
 msgstr ""
 
-#: rc_option_editor.cc:1674
-msgid "only if they have identical length, position and origin"
+#: rc_option_editor.cc:2264
+msgid "Auto-scroll editor window when dragging near its edges"
 msgstr ""
 
-#: rc_option_editor.cc:1684
-msgid "Make rubberband selection rectangle snap to the grid"
+#: rc_option_editor.cc:2272
+msgid "Show gain envelopes in audio regions"
 msgstr ""
 
-#: rc_option_editor.cc:1692
-msgid "Show waveforms in regions"
-msgstr "Mostra le onde nelle regioni"
+#: rc_option_editor.cc:2273
+msgid "in all modes"
+msgstr ""
 
-#: rc_option_editor.cc:1700
-msgid "Show gain envelopes in audio regions"
+#: rc_option_editor.cc:2274
+msgid "only in Draw and Internal Edit modes"
 msgstr ""
 
-#: rc_option_editor.cc:1701
-msgid "in all modes"
+#: rc_option_editor.cc:2279
+msgid "Editor Behavior"
 msgstr ""
 
-#: rc_option_editor.cc:1702
-msgid "only in region gain mode"
+#: rc_option_editor.cc:2284
+msgid "Move relevant automation when audio regions are moved"
 msgstr ""
+"Sposta le automazioni rilevanti quando le regioni audio vengono spostate"
 
-#: rc_option_editor.cc:1709
-msgid "Waveform scale"
+#: rc_option_editor.cc:2291
+msgid "Default fade shape"
 msgstr ""
 
-#: rc_option_editor.cc:1714
-msgid "linear"
-msgstr "lineare"
+#: rc_option_editor.cc:2310
+msgid "Regions in active edit groups are edited together"
+msgstr ""
 
-#: rc_option_editor.cc:1715
-msgid "logarithmic"
-msgstr "logaritmico"
+#: rc_option_editor.cc:2311
+msgid "whenever they overlap in time"
+msgstr ""
 
-#: rc_option_editor.cc:1721
-msgid "Waveform shape"
+#: rc_option_editor.cc:2312
+msgid "only if they have identical length, position and origin"
 msgstr ""
 
-#: rc_option_editor.cc:1726
-msgid "traditional"
+#: rc_option_editor.cc:2321
+msgid "Layering model"
 msgstr ""
 
-#: rc_option_editor.cc:1727
-msgid "rectified"
+#: rc_option_editor.cc:2326
+msgid "later is higher"
 msgstr ""
 
-#: rc_option_editor.cc:1736
-msgid "Show waveforms for audio while it is being recorded"
-msgstr "Mostra le onde durante la registrazione audio"
+#: rc_option_editor.cc:2327
+msgid "manual layering"
+msgstr ""
 
-#: rc_option_editor.cc:1744
-msgid "Show zoom toolbar"
-msgstr "Mostra la barra dello zoom"
+#: rc_option_editor.cc:2332
+msgid "After splitting selected regions, select"
+msgstr ""
 
-#: rc_option_editor.cc:1752
-msgid "Update editor window during drags of the summary"
+#: rc_option_editor.cc:2337
+msgid "no regions"
 msgstr ""
 
-#: rc_option_editor.cc:1760
-msgid "Synchronise editor and mixer selection"
+#: rc_option_editor.cc:2340
+msgid "newly-created regions"
 msgstr ""
 
-#: rc_option_editor.cc:1767
-msgid "Name new markers"
-msgstr "Assegna un nome ai nuovi marcatori"
+#: rc_option_editor.cc:2344
+msgid "existing selection and newly-created regions"
+msgstr ""
 
-#: rc_option_editor.cc:1773
-msgid ""
-"If enabled, popup a dialog when a new marker is created to allow its name to "
-"be set as it is created.\n"
-"\n"
-"You can always rename markers by right-clicking on them"
+#: rc_option_editor.cc:2348 rc_option_editor.cc:2351 rc_option_editor.cc:2360
+#: rc_option_editor.cc:2378 rc_option_editor.cc:2390 rc_option_editor.cc:2392
+msgid "Editor/Waveforms"
 msgstr ""
 
-#: rc_option_editor.cc:1779
-msgid "Auto-scroll editor window when dragging near its edges"
+#: rc_option_editor.cc:2348
+msgid "Waveforms"
 msgstr ""
 
-#: rc_option_editor.cc:1786
-msgid "After splitting selected regions, select"
+#: rc_option_editor.cc:2354
+msgid "Show waveforms in regions"
+msgstr "Mostra le onde nelle regioni"
+
+#: rc_option_editor.cc:2363
+msgid "Show waveforms for audio while it is being recorded"
+msgstr "Mostra le onde durante la registrazione audio"
+
+#: rc_option_editor.cc:2370
+msgid "Waveform scale"
 msgstr ""
 
-#: rc_option_editor.cc:1791
-msgid "no regions"
+#: rc_option_editor.cc:2375
+msgid "linear"
+msgstr "lineare"
+
+#: rc_option_editor.cc:2376
+msgid "logarithmic"
+msgstr "logaritmico"
+
+#: rc_option_editor.cc:2382
+msgid "Waveform shape"
 msgstr ""
 
-#: rc_option_editor.cc:1794
-msgid "newly-created regions"
+#: rc_option_editor.cc:2387
+msgid "traditional"
 msgstr ""
 
-#: rc_option_editor.cc:1798
-msgid "existing selection and newly-created regions"
+#: rc_option_editor.cc:2388
+msgid "rectified"
 msgstr ""
 
-#: rc_option_editor.cc:1805
+#: rc_option_editor.cc:2397
 msgid "Buffering"
 msgstr ""
 
-#: rc_option_editor.cc:1813
+#: rc_option_editor.cc:2405
 msgid "Record monitoring handled by"
 msgstr "Controllo della registrazione da parte di"
 
-#: rc_option_editor.cc:1819
+#: rc_option_editor.cc:2411
 msgid "via Audio Driver"
 msgstr ""
 
-#: rc_option_editor.cc:1825
+#: rc_option_editor.cc:2417
 msgid "audio hardware"
 msgstr "hardware audio"
 
-#: rc_option_editor.cc:1832
+#: rc_option_editor.cc:2424
 msgid "Tape machine mode"
 msgstr "Modalità nastro"
 
-#: rc_option_editor.cc:1837
+#: rc_option_editor.cc:2429
 msgid "Connection of tracks and busses"
 msgstr "Connessione di tracce e bus"
 
-#: rc_option_editor.cc:1842
+#: rc_option_editor.cc:2435
 msgid "Auto-connect master/monitor busses"
 msgstr "Connetti automaticamente i bus master/monitor"
 
-#: rc_option_editor.cc:1849
+#: rc_option_editor.cc:2442
 msgid "Connect track inputs"
 msgstr "Connetti ingressi della traccia"
 
-#: rc_option_editor.cc:1854
+#: rc_option_editor.cc:2447
 msgid "automatically to physical inputs"
 msgstr "automaticamente agli ingressi fisici"
 
-#: rc_option_editor.cc:1855 rc_option_editor.cc:1868
+#: rc_option_editor.cc:2448 rc_option_editor.cc:2461
 msgid "manually"
 msgstr "manualmente"
 
-#: rc_option_editor.cc:1861
+#: rc_option_editor.cc:2454
 msgid "Connect track and bus outputs"
 msgstr "Connetti le uscite della traccia e del bus"
 
-#: rc_option_editor.cc:1866
+#: rc_option_editor.cc:2459
 msgid "automatically to physical outputs"
 msgstr "automaticamente alle uscite fisiche"
 
-#: rc_option_editor.cc:1867
+#: rc_option_editor.cc:2460
 msgid "automatically to master bus"
 msgstr "automaticamente al bus master"
 
-#: rc_option_editor.cc:1872
+#: rc_option_editor.cc:2467
+msgid "Use 'Strict-I/O' for new tracks or Busses"
+msgstr ""
+
+#: rc_option_editor.cc:2478
 msgid "Denormals"
 msgstr ""
 
-#: rc_option_editor.cc:1877
+#: rc_option_editor.cc:2483
 msgid "Use DC bias to protect against denormals"
 msgstr ""
 
-#: rc_option_editor.cc:1884
+#: rc_option_editor.cc:2490
 msgid "Processor handling"
 msgstr "Gestione processore"
 
-#: rc_option_editor.cc:1890
+#: rc_option_editor.cc:2496
 msgid "no processor handling"
 msgstr "nessuna gestione processore"
 
-#: rc_option_editor.cc:1896
+#: rc_option_editor.cc:2502
 msgid "use FlushToZero"
 msgstr ""
 
-#: rc_option_editor.cc:1903
+#: rc_option_editor.cc:2509
 msgid "use DenormalsAreZero"
 msgstr ""
 
-#: rc_option_editor.cc:1910
+#: rc_option_editor.cc:2516
 msgid "use FlushToZero and DenormalsAreZero"
 msgstr ""
 
-#: rc_option_editor.cc:1926
-msgid "Silence plugins when the transport is stopped"
+#: rc_option_editor.cc:2532
+msgid "Enable automatic analysis of audio"
+msgstr "Abilita l'analisi automatica dell'audio"
+
+#: rc_option_editor.cc:2540
+msgid "Replicate missing region channels"
 msgstr ""
 
-#: rc_option_editor.cc:1934
-msgid "Make new plugins active"
-msgstr "Attiva i nuovi plugin"
+#: rc_option_editor.cc:2547 rc_option_editor.cc:2556 rc_option_editor.cc:2558
+#: rc_option_editor.cc:2566 rc_option_editor.cc:2574 rc_option_editor.cc:2582
+#: rc_option_editor.cc:2600 rc_option_editor.cc:2612 rc_option_editor.cc:2624
+#: rc_option_editor.cc:2626 rc_option_editor.cc:2628 rc_option_editor.cc:2636
+#: rc_option_editor.cc:2644 rc_option_editor.cc:2652 rc_option_editor.cc:2662
+#: rc_option_editor.cc:2663
+msgid "Solo & mute"
+msgstr ""
 
-#: rc_option_editor.cc:1944
-msgid "Enable automatic analysis of audio"
-msgstr "Abilita l'analisi automatica dell'audio"
+#: rc_option_editor.cc:2551
+msgid "Solo controls are Listen controls"
+msgstr "I controlli di solo sono controlli di ascolto"
+
+#: rc_option_editor.cc:2561
+msgid "Exclusive solo"
+msgstr "Solo esclusivo"
+
+#: rc_option_editor.cc:2569
+msgid "Show solo muting"
+msgstr ""
+
+#: rc_option_editor.cc:2577
+msgid "Soloing overrides muting"
+msgstr ""
+
+#: rc_option_editor.cc:2585
+msgid "Solo-in-place mute cut (dB)"
+msgstr ""
+
+#: rc_option_editor.cc:2592
+msgid "Listen Position"
+msgstr ""
+
+#: rc_option_editor.cc:2597
+msgid "after-fader (AFL)"
+msgstr ""
+
+#: rc_option_editor.cc:2598
+msgid "pre-fader (PFL)"
+msgstr ""
+
+#: rc_option_editor.cc:2604
+msgid "PFL signals come from"
+msgstr "i segnali PFL provengono da"
+
+#: rc_option_editor.cc:2609
+msgid "before pre-fader processors"
+msgstr ""
+
+#: rc_option_editor.cc:2610
+msgid "pre-fader but after pre-fader processors"
+msgstr ""
+
+#: rc_option_editor.cc:2616
+msgid "AFL signals come from"
+msgstr "I segnali AFL provengono da"
+
+#: rc_option_editor.cc:2621
+msgid "immediately post-fader"
+msgstr ""
+
+#: rc_option_editor.cc:2622
+msgid "after post-fader processors (before pan)"
+msgstr ""
+
+#: rc_option_editor.cc:2626
+msgid "Default track / bus muting options"
+msgstr "Opzioni di </i>mute</i> base per Tracce/Bus"
+
+#: rc_option_editor.cc:2631
+msgid "Mute affects pre-fader sends"
+msgstr "Mute agisce sulle mandate pre-fader"
+
+#: rc_option_editor.cc:2639
+msgid "Mute affects post-fader sends"
+msgstr "Mute agisce sulle mandate post-fader"
+
+#: rc_option_editor.cc:2647
+msgid "Mute affects control outputs"
+msgstr "Mute agisce sulle uscite"
+
+#: rc_option_editor.cc:2655
+msgid "Mute affects main outputs"
+msgstr "Mute agisce sulle uscite principali"
+
+#: rc_option_editor.cc:2662
+msgid "Send Routing"
+msgstr ""
+
+#: rc_option_editor.cc:2666
+msgid "Link panners of Aux and External Sends with main panner by default"
+msgstr ""
+
+#: rc_option_editor.cc:2672
+msgid "MIDI Preferences"
+msgstr ""
+
+#: rc_option_editor.cc:2677
+msgid "MIDI read-ahead time (seconds)"
+msgstr ""
+
+#: rc_option_editor.cc:2687
+msgid "Initial program change"
+msgstr ""
+
+#: rc_option_editor.cc:2696
+msgid "Display first MIDI bank/program as 0"
+msgstr ""
+
+#: rc_option_editor.cc:2704
+msgid "Never display periodic MIDI messages (MTC, MIDI Clock)"
+msgstr ""
+
+#: rc_option_editor.cc:2712
+msgid "Sound MIDI notes as they are selected in the editor"
+msgstr ""
+
+#: rc_option_editor.cc:2720
+msgid "Send MIDI control feedback"
+msgstr ""
+
+#: rc_option_editor.cc:2725 rc_option_editor.cc:2727 rc_option_editor.cc:2735
+#: rc_option_editor.cc:2737 rc_option_editor.cc:2745 rc_option_editor.cc:2754
+#: rc_option_editor.cc:2756 rc_option_editor.cc:2764 rc_option_editor.cc:2772
+#: rc_option_editor.cc:2781
+msgid "MIDI/Sync"
+msgstr ""
+
+#: rc_option_editor.cc:2725
+msgid "MIDI Clock"
+msgstr ""
+
+#: rc_option_editor.cc:2735
+msgid "MIDI Time Code (MTC)"
+msgstr ""
+
+#: rc_option_editor.cc:2740
+msgid "Send MIDI Time Code"
+msgstr ""
+
+#: rc_option_editor.cc:2748
+msgid "Percentage either side of normal transport speed to transmit MTC"
+msgstr ""
+
+#: rc_option_editor.cc:2754
+msgid "Midi Machine Control (MMC)"
+msgstr ""
+
+#: rc_option_editor.cc:2759
+msgid "Obey MIDI Machine Control commands"
+msgstr ""
+
+#: rc_option_editor.cc:2767
+msgid "Send MIDI Machine Control commands"
+msgstr ""
+
+#: rc_option_editor.cc:2775
+msgid "Inbound MMC device ID"
+msgstr ""
+
+#: rc_option_editor.cc:2784
+msgid "Outbound MMC device ID"
+msgstr ""
+
+#: rc_option_editor.cc:2790
+msgid "Midi Audition"
+msgstr ""
+
+#: rc_option_editor.cc:2794
+msgid "Midi Audition Synth (LV2)"
+msgstr ""
+
+#: rc_option_editor.cc:2825 rc_option_editor.cc:2835 rc_option_editor.cc:2837
+msgid "User interaction"
+msgstr ""
+
+#: rc_option_editor.cc:2828
+msgid ""
+"Use translations of %1 messages\n"
+"   <i>(requires a restart of %1 to take effect)</i>\n"
+"   <i>(if available for your language preferences)</i>"
+msgstr ""
+
+#: rc_option_editor.cc:2835
+msgid "Keyboard"
+msgstr "Tastiera"
 
-#: rc_option_editor.cc:1952
-msgid "Replicate missing region channels"
-msgstr ""
+#: rc_option_editor.cc:2848 startup.cc:352
+msgid "Scan for Plugins"
+msgstr "Ricerca dei plugin"
 
-#: rc_option_editor.cc:1959 rc_option_editor.cc:1961 rc_option_editor.cc:1976
-#: rc_option_editor.cc:1988 rc_option_editor.cc:2000 rc_option_editor.cc:2012
-#: rc_option_editor.cc:2016 rc_option_editor.cc:2024 rc_option_editor.cc:2032
-#: rc_option_editor.cc:2040 rc_option_editor.cc:2042 rc_option_editor.cc:2050
-#: rc_option_editor.cc:2058 rc_option_editor.cc:2066 rc_option_editor.cc:2074
-#: rc_option_editor.cc:2076
-msgid "Solo / mute"
-msgstr "Solo / mute"
+#: rc_option_editor.cc:2853
+msgid "General"
+msgstr "Generale"
 
-#: rc_option_editor.cc:1964
-msgid "Solo-in-place mute cut (dB)"
+#: rc_option_editor.cc:2858
+msgid "Always Display Plugin Scan Progress"
 msgstr ""
 
-#: rc_option_editor.cc:1971
-msgid "Solo controls are Listen controls"
-msgstr "I controlli di solo sono controlli di ascolto"
-
-#: rc_option_editor.cc:1980
-msgid "Listen Position"
+#: rc_option_editor.cc:2864
+msgid ""
+"<b>When enabled</b> a popup window showing plugin scan progress is displayed "
+"for indexing (cache load) and discovery (detect new plugins)"
 msgstr ""
 
-#: rc_option_editor.cc:1985
-msgid "after-fader (AFL)"
+#: rc_option_editor.cc:2869
+msgid "Silence plugins when the transport is stopped"
 msgstr ""
 
-#: rc_option_editor.cc:1986
-msgid "pre-fader (PFL)"
+#: rc_option_editor.cc:2875
+msgid ""
+"<b>When enabled</b> plugins will be reset at transport stop. When disabled "
+"plugins will be left unchanged at transport stop.\n"
+"\n"
+"This mostly affects plugins with a \"tail\" like Reverbs."
 msgstr ""
 
-#: rc_option_editor.cc:1992
-msgid "PFL signals come from"
-msgstr "i segnali PFL provengono da"
+#: rc_option_editor.cc:2879
+msgid "Make new plugins active"
+msgstr "Attiva i nuovi plugin"
 
-#: rc_option_editor.cc:1997
-msgid "before pre-fader processors"
+#: rc_option_editor.cc:2885
+msgid ""
+"<b>When enabled</b> plugins will be activated when they are added to tracks/"
+"busses. When disabled plugins will be left inactive when they are added to "
+"tracks/busses"
 msgstr ""
 
-#: rc_option_editor.cc:1998
-msgid "pre-fader but after pre-fader processors"
+#: rc_option_editor.cc:2888 rc_option_editor.cc:2896 rc_option_editor.cc:2908
+#: rc_option_editor.cc:2913 rc_option_editor.cc:2915 rc_option_editor.cc:2920
+#: rc_option_editor.cc:2927 rc_option_editor.cc:2932 rc_option_editor.cc:2941
+msgid "Plugins/VST"
 msgstr ""
 
-#: rc_option_editor.cc:2004
-msgid "AFL signals come from"
-msgstr "I segnali AFL provengono da"
+#: rc_option_editor.cc:2888
+msgid "VST"
+msgstr "VST"
 
-#: rc_option_editor.cc:2009
-msgid "immediately post-fader"
+#: rc_option_editor.cc:2892
+msgid "Scan for [new] VST Plugins on Application Start"
 msgstr ""
 
-#: rc_option_editor.cc:2010
-msgid "after post-fader processors (before pan)"
+#: rc_option_editor.cc:2898
+msgid ""
+"<b>When enabled</b> new VST plugins are searched, tested and added to the "
+"cache index on application start. When disabled new plugins will only be "
+"available after triggering a 'Scan' manually"
 msgstr ""
 
-#: rc_option_editor.cc:2019
-msgid "Exclusive solo"
-msgstr "Solo esclusivo"
-
-#: rc_option_editor.cc:2027
-msgid "Show solo muting"
+#: rc_option_editor.cc:2904
+msgid "Verbose Plugin Scan"
 msgstr ""
 
-#: rc_option_editor.cc:2035
-msgid "Soloing overrides muting"
+#: rc_option_editor.cc:2910
+msgid ""
+"<b>When enabled</b> additional information for every plugin is added to the "
+"Log Window."
 msgstr ""
 
-#: rc_option_editor.cc:2040
-msgid "Default track / bus muting options"
-msgstr "Opzioni di </i>mute</i> base per Tracce/Bus"
-
-#: rc_option_editor.cc:2045
-msgid "Mute affects pre-fader sends"
-msgstr "Mute agisce sulle mandate pre-fader"
-
-#: rc_option_editor.cc:2053
-msgid "Mute affects post-fader sends"
-msgstr "Mute agisce sulle mandate post-fader"
+#: rc_option_editor.cc:2918
+msgid "VST Cache:"
+msgstr ""
 
-#: rc_option_editor.cc:2061
-msgid "Mute affects control outputs"
-msgstr "Mute agisce sulle uscite"
+#: rc_option_editor.cc:2923
+msgid "VST Blacklist:"
+msgstr ""
 
-#: rc_option_editor.cc:2069
-msgid "Mute affects main outputs"
-msgstr "Mute agisce sulle uscite principali"
+#: rc_option_editor.cc:2930
+msgid "Linux VST Path:"
+msgstr "Path VST Linux:"
 
-#: rc_option_editor.cc:2074
-msgid "Send Routing"
+#: rc_option_editor.cc:2935 rc_option_editor.cc:2948
+msgid "Path:"
 msgstr ""
 
-#: rc_option_editor.cc:2079
-msgid "Link panners of Aux and External Sends with main panner by default"
-msgstr ""
+#: rc_option_editor.cc:2944
+msgid "Windows VST Path:"
+msgstr "Percorso VST Windows"
 
-#: rc_option_editor.cc:2087
-msgid "MIDI read-ahead time (seconds)"
+#: rc_option_editor.cc:2954 rc_option_editor.cc:2966 rc_option_editor.cc:2971
+msgid "Plugins/Audio Unit"
 msgstr ""
 
-#: rc_option_editor.cc:2105
-msgid "Send MIDI Time Code"
-msgstr ""
+#: rc_option_editor.cc:2954
+msgid "Audio Unit"
+msgstr "Unità audio"
 
-#: rc_option_editor.cc:2113
-msgid "Percentage either side of normal transport speed to transmit MTC"
+#: rc_option_editor.cc:2958
+msgid "Scan for AudioUnit Plugins on Application Start"
 msgstr ""
 
-#: rc_option_editor.cc:2122
-msgid "Obey MIDI Machine Control commands"
+#: rc_option_editor.cc:2964
+msgid ""
+"<b>When enabled</b> Audio Unit Plugins are discovered on application start. "
+"When disabled AU plugins will only be available after triggering a 'Scan' "
+"manually. The first successful scan will enable AU auto-scan, Any crash "
+"during plugin discovery will disable it."
 msgstr ""
 
-#: rc_option_editor.cc:2130
-msgid "Send MIDI Machine Control commands"
+#: rc_option_editor.cc:2969
+msgid "AU Cache:"
 msgstr ""
 
-#: rc_option_editor.cc:2138
-msgid "Send MIDI control feedback"
+#: rc_option_editor.cc:2974
+msgid "AU Blacklist:"
 msgstr ""
 
-#: rc_option_editor.cc:2146
-msgid "Inbound MMC device ID"
+#: rc_option_editor.cc:2978
+msgid "Plugin GUI"
 msgstr ""
 
-#: rc_option_editor.cc:2155
-msgid "Outbound MMC device ID"
+#: rc_option_editor.cc:2982
+msgid "Automatically open the plugin GUI when adding a new plugin"
 msgstr ""
 
-#: rc_option_editor.cc:2164
-msgid "Initial program change"
+#: rc_option_editor.cc:2991
+msgid "Show Plugin Inline Display on Mixerstrip by default"
 msgstr ""
 
-#: rc_option_editor.cc:2173
-msgid "Display first MIDI bank/program as 0"
+#: rc_option_editor.cc:2998
+msgid ""
+"Don't automatically open the plugin GUI when the plugin has an inline "
+"display mode"
 msgstr ""
 
-#: rc_option_editor.cc:2181
-msgid "Never display periodic MIDI messages (MTC, MIDI Clock)"
+#: rc_option_editor.cc:3005
+msgid "Instrument"
 msgstr ""
 
-#: rc_option_editor.cc:2189
-msgid "Sound MIDI notes as they are selected"
+#: rc_option_editor.cc:3009
+msgid "Ask to replace existing instrument plugin"
 msgstr ""
 
-#: rc_option_editor.cc:2194
-msgid "Midi Audition"
+#: rc_option_editor.cc:3017
+msgid "Interactively configure instrument plugins on insert"
 msgstr ""
 
-#: rc_option_editor.cc:2198
-msgid "Midi Audition Synth (LV2)"
+#: rc_option_editor.cc:3023
+msgid ""
+"<b>When enabled</b> show a dialog to select instrument channel configuration "
+"before adding a multichannel plugin."
 msgstr ""
 
-#: rc_option_editor.cc:2229 rc_option_editor.cc:2239 rc_option_editor.cc:2241
-msgid "User interaction"
+#: rc_option_editor.cc:3032
+msgid "Disable Graphics Hardware Acceleration (requires restart)"
 msgstr ""
 
-#: rc_option_editor.cc:2232
+#: rc_option_editor.cc:3038
 msgid ""
-"Use translations of %1 messages\n"
-"   <i>(requires a restart of %1 to take effect)</i>\n"
-"   <i>(if available for your language preferences)</i>"
+"Render large parts of the application user-interface in software, instead of "
+"using 2D-graphics acceleration.\n"
+"This requires restarting %1 before having an effect"
 msgstr ""
 
-#: rc_option_editor.cc:2239
-msgid "Keyboard"
-msgstr "Tastiera"
-
-#: rc_option_editor.cc:2249
-msgid "Control surface remote ID"
-msgstr "ID della piattaforma di controllo"
+#: rc_option_editor.cc:3039 rc_option_editor.cc:3051 rc_option_editor.cc:3054
+#: rc_option_editor.cc:3062 rc_option_editor.cc:3070 rc_option_editor.cc:3078
+#: rc_option_editor.cc:3086 rc_option_editor.cc:3097 rc_option_editor.cc:3113
+#: rc_option_editor.cc:3129 rc_option_editor.cc:3144 rc_option_editor.cc:3153
+#: rc_option_editor.cc:3161
+msgid "Preferences|GUI"
+msgstr "Preferenze|GUI"
 
-#: rc_option_editor.cc:2254
-msgid "assigned by user"
-msgstr "assegnato dall'utente"
+#: rc_option_editor.cc:3045
+msgid "Possibly improve slow graphical performance (requires restart)"
+msgstr ""
 
-#: rc_option_editor.cc:2255
-msgid "follows order of mixer"
-msgstr "segue l'ordine del mixer"
+#: rc_option_editor.cc:3050
+msgid ""
+"Disables hardware gradient rendering on buggy video drivers (\"buggy "
+"gradients patch\").\n"
+"This requires restarting %1 before having an effect"
+msgstr ""
 
-#: rc_option_editor.cc:2269 rc_option_editor.cc:2278 rc_option_editor.cc:2287
-#: rc_option_editor.cc:2297 rc_option_editor.cc:2321 rc_option_editor.cc:2334
-#: rc_option_editor.cc:2343
-msgid "Preferences|GUI"
-msgstr "Preferenze|GUI"
+#: rc_option_editor.cc:3057
+msgid "Use Window Manager/Desktop visibility information"
+msgstr ""
 
-#: rc_option_editor.cc:2272
+#: rc_option_editor.cc:3065
 msgid "Graphically indicate mouse pointer hovering over various widgets"
 msgstr ""
 
-#: rc_option_editor.cc:2281
+#: rc_option_editor.cc:3073
 msgid "Show tooltips if mouse hovers over a control"
 msgstr ""
 
-#: rc_option_editor.cc:2290
+#: rc_option_editor.cc:3081
 msgid "Use name highlight bars in region displays (requires a restart)"
 msgstr ""
 
-#: rc_option_editor.cc:2303
-msgid "update transport clock display at FPS instead of every 100ms"
+#: rc_option_editor.cc:3089
+msgid "Update transport clock display at FPS instead of every 100ms"
 msgstr ""
 
-#: rc_option_editor.cc:2312
+#: rc_option_editor.cc:3104
+msgid "Waveform image cache size (megabytes)"
+msgstr ""
+
+#: rc_option_editor.cc:3112
+msgid ""
+"Increasing the cache size uses more memory to store waveform images, which "
+"can improve graphical performance."
+msgstr ""
+
+#: rc_option_editor.cc:3120
 msgid "Lock timeout (seconds)"
 msgstr ""
 
-#: rc_option_editor.cc:2320
+#: rc_option_editor.cc:3128
 msgid "Lock GUI after this many idle seconds (zero to never lock)"
 msgstr ""
 
-#: rc_option_editor.cc:2336
+#: rc_option_editor.cc:3146
 msgid "Mixer Strip"
 msgstr "Linguetta del mixer"
 
-#: rc_option_editor.cc:2346
+#: rc_option_editor.cc:3156
 msgid "Use narrow strips in the mixer by default"
 msgstr "Utilizza linguette del mixer strette di default."
 
-#: rc_option_editor.cc:2351 rc_option_editor.cc:2365 rc_option_editor.cc:2384
-#: rc_option_editor.cc:2400 rc_option_editor.cc:2416 rc_option_editor.cc:2430
-#: rc_option_editor.cc:2444 rc_option_editor.cc:2446
+#: rc_option_editor.cc:3163
+msgid "Action Script Button Visibility"
+msgstr ""
+
+#: rc_option_editor.cc:3169 rc_option_editor.cc:3183 rc_option_editor.cc:3200
+#: rc_option_editor.cc:3216 rc_option_editor.cc:3232 rc_option_editor.cc:3246
+#: rc_option_editor.cc:3272 rc_option_editor.cc:3290 rc_option_editor.cc:3301
+#: rc_option_editor.cc:3308 rc_option_editor.cc:3310 rc_option_editor.cc:3318
+#: rc_option_editor.cc:3320 rc_option_editor.cc:3328 rc_option_editor.cc:3336
+#: rc_option_editor.cc:3338
 msgid "Preferences|Metering"
 msgstr ""
 
-#: rc_option_editor.cc:2355
+#: rc_option_editor.cc:3173
 msgid "Peak hold time"
 msgstr ""
 
-#: rc_option_editor.cc:2361
+#: rc_option_editor.cc:3179
 msgid "short"
 msgstr "breve"
 
-#: rc_option_editor.cc:2362
+#: rc_option_editor.cc:3180
 msgid "medium"
 msgstr "medio"
 
-#: rc_option_editor.cc:2363
+#: rc_option_editor.cc:3181
 msgid "long"
 msgstr "lungo"
 
-#: rc_option_editor.cc:2369
+#: rc_option_editor.cc:3187
 msgid "DPM fall-off"
 msgstr ""
 
-#: rc_option_editor.cc:2375
+#: rc_option_editor.cc:3193
 msgid "slowest [6.6dB/sec]"
 msgstr "il più lento [6.6dB/sec]"
 
-#: rc_option_editor.cc:2376
+#: rc_option_editor.cc:3194
 msgid "slow [8.6dB/sec] (BBC PPM, EBU PPM)"
 msgstr "lento [8.6dB/sec] (BBC PPM, EBU PPM)"
 
-#: rc_option_editor.cc:2377
-msgid "slowish [12.0dB/sec] (DIN)"
+#: rc_option_editor.cc:3195
+msgid "moderate [12.0dB/sec] (DIN)"
 msgstr ""
 
-#: rc_option_editor.cc:2378
-msgid "moderate [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"
-msgstr "moderato [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"
-
-#: rc_option_editor.cc:2379
-msgid "medium [20dB/sec]"
-msgstr "medio [20dB/sec]"
-
-#: rc_option_editor.cc:2380
-msgid "fast [32dB/sec]"
-msgstr "veloce [32dB/sec]"
+#: rc_option_editor.cc:3196
+msgid "medium [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"
+msgstr ""
 
-#: rc_option_editor.cc:2381
-msgid "faster [46dB/sec]"
-msgstr "più veloce [46dB/sec]"
+#: rc_option_editor.cc:3197
+msgid "fast [20dB/sec]"
+msgstr ""
 
-#: rc_option_editor.cc:2382
-msgid "fastest [70dB/sec]"
-msgstr "massima velocità [70dB/sec]"
+#: rc_option_editor.cc:3198
+msgid "very fast [32dB/sec]"
+msgstr ""
 
-#: rc_option_editor.cc:2388
+#: rc_option_editor.cc:3204
 msgid "Meter line-up level; 0dBu"
 msgstr ""
 
-#: rc_option_editor.cc:2393 rc_option_editor.cc:2409
+#: rc_option_editor.cc:3209 rc_option_editor.cc:3225
 msgid "-24dBFS (SMPTE US: 4dBu = -20dBFS)"
 msgstr "-24dBFS (SMPTE US: 4dBu = -20dBFS)"
 
-#: rc_option_editor.cc:2394 rc_option_editor.cc:2410
+#: rc_option_editor.cc:3210 rc_option_editor.cc:3226
 msgid "-20dBFS (SMPTE RP.0155)"
 msgstr "-20dBFS (SMPTE RP.0155)"
 
-#: rc_option_editor.cc:2395 rc_option_editor.cc:2411
+#: rc_option_editor.cc:3211 rc_option_editor.cc:3227
 msgid "-18dBFS (EBU, BBC)"
 msgstr "-18dBFS (EBU, BBC)"
 
-#: rc_option_editor.cc:2396 rc_option_editor.cc:2412
+#: rc_option_editor.cc:3212 rc_option_editor.cc:3228
 msgid "-15dBFS (DIN)"
 msgstr "-15dBFS (DIN)"
 
-#: rc_option_editor.cc:2398
+#: rc_option_editor.cc:3214
 msgid ""
 "Configure meter-marks and color-knee point for dBFS scale DPM, set reference "
 "level for IEC1/Nordic, IEC2 PPM and VU meter."
 msgstr ""
 
-#: rc_option_editor.cc:2404
+#: rc_option_editor.cc:3220
 msgid "IEC1/DIN Meter line-up level; 0dBu"
 msgstr ""
 
-#: rc_option_editor.cc:2414
+#: rc_option_editor.cc:3230
 msgid "Reference level for IEC1/DIN meter."
 msgstr ""
 
-#: rc_option_editor.cc:2420
+#: rc_option_editor.cc:3236
 msgid "VU Meter standard"
 msgstr ""
 
-#: rc_option_editor.cc:2425
+#: rc_option_editor.cc:3241
 msgid "0VU = -2dBu (France)"
 msgstr "0VU = -2dBu (France)"
 
-#: rc_option_editor.cc:2426
+#: rc_option_editor.cc:3242
 msgid "0VU = 0dBu (North America, Australia)"
 msgstr "0VU = 0dBu (Nord America, Australia)"
 
-#: rc_option_editor.cc:2427
+#: rc_option_editor.cc:3243
 msgid "0VU = +4dBu (standard)"
 msgstr "0VU = +4dBu (standard)"
 
-#: rc_option_editor.cc:2428
+#: rc_option_editor.cc:3244
 msgid "0VU = +8dBu"
 msgstr "0VU = +8dBu"
 
-#: rc_option_editor.cc:2434
+#: rc_option_editor.cc:3250
 msgid "Peak threshold [dBFS]"
 msgstr "Soglia di picco [dBFS]"
 
-#: rc_option_editor.cc:2442
+#: rc_option_editor.cc:3259
+msgid "Default Meter Type for Master Bus"
+msgstr ""
+
+#: rc_option_editor.cc:3277
+msgid "Default Meter Type for Busses"
+msgstr ""
+
+#: rc_option_editor.cc:3294
+msgid "Default Meter Type for Tracks"
+msgstr ""
+
+#: rc_option_editor.cc:3306
 msgid ""
 "Specify the audio signal level in dbFS at and above which the meter-peak "
 "indicator will flash red."
@@ -10029,67 +11972,99 @@ msgstr ""
 "Indica il livello di segnale in dbFS superato il quale il meter di picco "
 "lampeggerà in rosso."
 
-#: rc_option_editor.cc:2449
+#: rc_option_editor.cc:3313
 msgid "LED meter style"
 msgstr ""
 
-#: rc_option_editor.cc:2457
+#: rc_option_editor.cc:3318
+msgid "Editor Meters"
+msgstr ""
+
+#: rc_option_editor.cc:3323
+msgid "Show meters on tracks in the editor"
+msgstr "Mostra i meter sulle tracce nell'editor"
+
+#: rc_option_editor.cc:3331
+msgid "Show at most stereo meters in the track-header"
+msgstr ""
+
+#: rc_option_editor.cc:3336
+msgid "Post Export Analysis"
+msgstr ""
+
+#: rc_option_editor.cc:3341
+msgid "Save loudness analysis as image file"
+msgstr ""
+
+#: rc_option_editor.cc:3349
 msgid "Theme"
 msgstr "Tema"
 
-#: region_editor.cc:79
+#: rc_option_editor.cc:3351
+msgid "Theme/Colors"
+msgstr ""
+
+#: rc_option_editor.cc:3429
+msgid "Set Linux VST Search Path"
+msgstr ""
+
+#: rc_option_editor.cc:3443
+msgid "Set Windows VST Search Path"
+msgstr ""
+
+#: region_editor.cc:81
 msgid "audition this region"
 msgstr "fai l'audition di questa regione"
 
-#: region_editor.cc:88 region_layering_order_editor.cc:75
+#: region_editor.cc:90 region_layering_order_editor.cc:75
 msgid "Position:"
 msgstr "Posizione:"
 
-#: region_editor.cc:90 add_video_dialog.cc:155
+#: region_editor.cc:92 add_video_dialog.cc:155
 msgid "End:"
 msgstr "Fine:"
 
-#: region_editor.cc:92 sfdb_ui.cc:145
+#: region_editor.cc:94 sfdb_ui.cc:145
 msgid "Length:"
 msgstr "Durata:"
 
-#: region_editor.cc:94
+#: region_editor.cc:96
 msgid "Sync point (relative to region):"
 msgstr "Punto di sincronia (relativo alla regione)"
 
-#: region_editor.cc:96
+#: region_editor.cc:98
 msgid "Sync point (absolute):"
 msgstr "Punto di sincronia (assoluto):"
 
-#: region_editor.cc:98
+#: region_editor.cc:100
 msgid "File start:"
 msgstr "Inizio file:"
 
-#: region_editor.cc:102
+#: region_editor.cc:104
 msgid "Sources:"
 msgstr "Sorgenti:"
 
-#: region_editor.cc:104
+#: region_editor.cc:106
 msgid "Source:"
 msgstr "Sorgente:"
 
-#: region_editor.cc:166
+#: region_editor.cc:168
 msgid "Region '%1'"
 msgstr "Regione '%1'"
 
-#: region_editor.cc:273
+#: region_editor.cc:279
 msgid "change region start position"
 msgstr "cambia la posizione di inizio regione"
 
-#: region_editor.cc:289
+#: region_editor.cc:299
 msgid "change region end position"
 msgstr "cambia la posizione di fine regione"
 
-#: region_editor.cc:309
+#: region_editor.cc:322
 msgid "change region length"
 msgstr "cambia la durata della regione"
 
-#: region_editor.cc:403 region_editor.cc:415
+#: region_editor.cc:416 region_editor.cc:428
 msgid "change region sync point"
 msgstr "cambia il punto di sincroniza della regione"
 
@@ -10109,33 +12084,33 @@ msgstr "Traccia:"
 msgid "Choose Top Region"
 msgstr "Scegli la regione in cima"
 
-#: region_view.cc:277
+#: region_view.cc:271
 msgid "SilenceText"
 msgstr ""
 
-#: region_view.cc:292 region_view.cc:311
+#: region_view.cc:286 region_view.cc:305
 msgid "minutes"
 msgstr "minuti"
 
-#: region_view.cc:295 region_view.cc:314
+#: region_view.cc:289 region_view.cc:308
 msgid "msecs"
 msgstr "msec"
 
-#: region_view.cc:298 region_view.cc:317
+#: region_view.cc:292 region_view.cc:311
 msgid "secs"
 msgstr "secondi"
 
-#: region_view.cc:301
+#: region_view.cc:295
 msgid "%1 silent segment"
 msgid_plural "%1 silent segments"
 msgstr[0] ""
 msgstr[1] ""
 
-#: region_view.cc:303
+#: region_view.cc:297
 msgid "shortest = %1 %2"
 msgstr "più corto = %1 %2"
 
-#: region_view.cc:320
+#: region_view.cc:314
 msgid ""
 "\n"
 "  (shortest audible segment = %1 %2)"
@@ -10181,55 +12156,63 @@ msgstr ""
 msgid "Modified Kullback-Liebler"
 msgstr ""
 
-#: rhythm_ferret.cc:65
+#: rhythm_ferret.cc:62
+msgid "Spectral Flux"
+msgstr ""
+
+#: rhythm_ferret.cc:68
 msgid "Split region"
 msgstr "Separa la regione"
 
-#: rhythm_ferret.cc:66
+#: rhythm_ferret.cc:70
 msgid "Snap regions"
 msgstr ""
 
-#: rhythm_ferret.cc:67
+#: rhythm_ferret.cc:71
 msgid "Conform regions"
 msgstr "Conforma regioni"
 
-#: rhythm_ferret.cc:72
+#: rhythm_ferret.cc:77
 msgid "Rhythm Ferret"
 msgstr "Analizzatore ritmico"
 
-#: rhythm_ferret.cc:78
+#: rhythm_ferret.cc:83
 msgid "Analyze"
 msgstr "Analizza"
 
-#: rhythm_ferret.cc:113
+#: rhythm_ferret.cc:122
 msgid "Detection function"
 msgstr ""
 
-#: rhythm_ferret.cc:117
-msgid "Trigger gap"
+#: rhythm_ferret.cc:126
+msgid "Trigger gap (postproc)"
 msgstr ""
 
-#: rhythm_ferret.cc:122 strip_silence_dialog.cc:64
-msgid "Threshold"
-msgstr "Soglia"
-
-#: rhythm_ferret.cc:127
+#: rhythm_ferret.cc:131
 msgid "Peak threshold"
 msgstr "Soglia di picco"
 
-#: rhythm_ferret.cc:132
+#: rhythm_ferret.cc:135
 msgid "Silence threshold"
 msgstr "Soglia del silenzio"
 
-#: rhythm_ferret.cc:137
+#: rhythm_ferret.cc:141
+msgid "Min Inter-Onset Time"
+msgstr ""
+
+#: rhythm_ferret.cc:148
 msgid "Sensitivity"
 msgstr "Sensibilità"
 
-#: rhythm_ferret.cc:141
+#: rhythm_ferret.cc:152
+msgid "Cut Pos Threshold"
+msgstr ""
+
+#: rhythm_ferret.cc:157
 msgid "Operation"
 msgstr "Operazione"
 
-#: rhythm_ferret.cc:355
+#: rhythm_ferret.cc:382
 msgid "split regions (rhythm ferret)"
 msgstr "dividi regioni (rhythm ferret)"
 
@@ -10253,19 +12236,15 @@ msgstr "Attiva registrazione"
 msgid "Active state"
 msgstr "Stato attivo"
 
-#: route_group_dialog.cc:53 route_group_dialog.cc:82 theme_manager.cc:90
-msgid "Color"
-msgstr "Colore"
-
-#: route_group_dialog.cc:59
+#: route_group_dialog.cc:58
 msgid "RouteGroupDialog"
 msgstr ""
 
-#: route_group_dialog.cc:100
+#: route_group_dialog.cc:99
 msgid "<b>Sharing</b>"
 msgstr "<b>Condivisione</b>"
 
-#: route_group_dialog.cc:200
+#: route_group_dialog.cc:192
 msgid "The group name is not unique. Please use a different name."
 msgstr "Il nome del gruppo non è unico. Per favore utilizza un nome diverso."
 
@@ -10285,332 +12264,317 @@ msgstr "Uscite"
 msgid "Plugins, Inserts & Sends"
 msgstr "Plugin, inserts & mandate"
 
-#: route_params_ui.cc:209
+#: route_params_ui.cc:201
 msgid "route display list item for renamed route not found!"
 msgstr ""
 
-#: route_params_ui.cc:279 route_params_ui.cc:307
+#: route_params_ui.cc:271 route_params_ui.cc:299
 #, c-format
 msgid "Playback delay: %<PRId64> samples"
 msgstr "Ritardo di riproduzione: %<PRId64> campioni"
 
-#: route_params_ui.cc:499
+#: route_params_ui.cc:491
 msgid "NO TRACK"
 msgstr "NESSUNA TRACCIA"
 
-#: route_params_ui.cc:637 route_params_ui.cc:638
+#: route_params_ui.cc:515
+msgid "Add Track or Bus"
+msgstr "Aggiungi Traccia/Bus"
+
+#: route_params_ui.cc:627 route_params_ui.cc:628
 msgid "No Track or Bus Selected"
 msgstr "Nessuna traccia o bus selezionati"
 
-#: route_time_axis.cc:181
+#: route_time_axis.cc:104
+msgid "RTAV|G"
+msgstr ""
+
+#: route_time_axis.cc:105
+msgid "RTAV|P"
+msgstr ""
+
+#: route_time_axis.cc:106
+msgid "RTAV|A"
+msgstr ""
+
+#: route_time_axis.cc:194
 msgid "Record (Right-click for Step Edit)"
 msgstr "Registrazione (clicca col destro per la modifica passo passo)"
 
-#: route_time_axis.cc:184
+#: route_time_axis.cc:197
 msgid "Record"
 msgstr "Registra"
 
-#: route_time_axis.cc:254
+#: route_time_axis.cc:265
 msgid "Route Group"
 msgstr ""
 
-#: route_time_axis.cc:264
+#: route_time_axis.cc:275
 msgid "MIDI Controllers and Automation"
 msgstr "Controller MIDI e automazione"
 
-#: route_time_axis.cc:495
+#: route_time_axis.cc:510
 msgid "Show All Automation"
 msgstr "Mostra tutte le automazioni"
 
-#: route_time_axis.cc:498
+#: route_time_axis.cc:513
 msgid "Show Existing Automation"
 msgstr "Mostra le automazioni esistenti"
 
-#: route_time_axis.cc:501
+#: route_time_axis.cc:516
 msgid "Hide All Automation"
 msgstr "Nascondi tutte le automazioni"
 
-#: route_time_axis.cc:510
+#: route_time_axis.cc:525
 msgid "Processor automation"
 msgstr "Automazione del processore"
 
-#: route_time_axis.cc:517
+#: route_time_axis.cc:532
 msgid "Fader"
 msgstr "Fader"
 
-#: route_time_axis.cc:535
+#: route_time_axis.cc:559
 msgid "Pan"
 msgstr "Panorama"
 
-#: route_time_axis.cc:626
+#: route_time_axis.cc:643
 msgid "Overlaid"
 msgstr ""
 
-#: route_time_axis.cc:632
+#: route_time_axis.cc:649
 msgid "Stacked"
 msgstr ""
 
-#: route_time_axis.cc:640
+#: route_time_axis.cc:657
 msgid "Layers"
 msgstr "Livelli"
 
-#: route_time_axis.cc:709
+#: route_time_axis.cc:721
 msgid "Automatic (based on I/O connections)"
 msgstr "Automatico (basato sulle connessioni I/O)"
 
-#: route_time_axis.cc:718
+#: route_time_axis.cc:730
 msgid "(Currently: Existing Material)"
 msgstr ""
 
-#: route_time_axis.cc:721
+#: route_time_axis.cc:733
 msgid "(Currently: Capture Time)"
 msgstr ""
 
-#: route_time_axis.cc:729
+#: route_time_axis.cc:741
 msgid "Align With Existing Material"
 msgstr ""
 
-#: route_time_axis.cc:734
+#: route_time_axis.cc:746
 msgid "Align With Capture Time"
 msgstr ""
 
-#: route_time_axis.cc:739
+#: route_time_axis.cc:751
 msgid "Alignment"
 msgstr "Allineamnento"
 
-#: route_time_axis.cc:774
+#: route_time_axis.cc:786
 msgid "Normal Mode"
 msgstr "Normale"
 
-#: route_time_axis.cc:780
+#: route_time_axis.cc:792
 msgid "Tape Mode"
 msgstr "Nastro"
 
-#: route_time_axis.cc:786
+#: route_time_axis.cc:798
 msgid "Non-Layered Mode"
 msgstr ""
 
-#: route_time_axis.cc:792
+#: route_time_axis.cc:804
 msgid "Record Mode"
 msgstr "Modalità registrazione"
 
-#: route_time_axis.cc:799 route_time_axis.cc:1789
+#: route_time_axis.cc:809 route_time_axis.cc:1795
 msgid "Playlist"
 msgstr "Scaletta"
 
-#: route_time_axis.cc:1097
+#: route_time_axis.cc:1107
 msgid "Rename Playlist"
 msgstr "Rinomina playlist"
 
-#: route_time_axis.cc:1098
+#: route_time_axis.cc:1108
 msgid "New name for playlist:"
 msgstr "Nuovo nome per la playlist:"
 
-#: route_time_axis.cc:1183
+#: route_time_axis.cc:1193
 msgid "New Copy Playlist"
 msgstr "Copia playlist"
 
-#: route_time_axis.cc:1184 route_time_axis.cc:1237
+#: route_time_axis.cc:1194 route_time_axis.cc:1247
 msgid "Name for new playlist:"
 msgstr "Nome per la nuova playlist:"
 
-#: route_time_axis.cc:1236
+#: route_time_axis.cc:1246
 msgid "New Playlist"
 msgstr "Nuova playlist"
 
-#: route_time_axis.cc:1436
-msgid "You cannot create a track with that name as it is reserved for %1"
+#: route_time_axis.cc:1441
+msgid "The name \"%1\" is reserved for %2"
 msgstr ""
-"Non si può creare una traccia con questo nome perché è riservato per %1"
 
-#: route_time_axis.cc:1678
+#: route_time_axis.cc:1684
 msgid "New Copy..."
 msgstr "Nuova copia..."
 
-#: route_time_axis.cc:1682
+#: route_time_axis.cc:1688
 msgid "New Take"
 msgstr "Nuova ripresa"
 
-#: route_time_axis.cc:1683
+#: route_time_axis.cc:1689
 msgid "Copy Take"
 msgstr "Copia ripresa"
 
-#: route_time_axis.cc:1688
+#: route_time_axis.cc:1694
 msgid "Clear Current"
 msgstr "Pulisci Corrente"
 
-#: route_time_axis.cc:1691
-msgid "Select From All..."
-msgstr "Seleziona tutto da..."
+#: route_time_axis.cc:1697
+msgid "Select from All..."
+msgstr ""
 
-#: route_time_axis.cc:1779
+#: route_time_axis.cc:1785
 msgid "Take: %1.%2"
 msgstr "Ripresa: %1.%2"
 
-#: route_time_axis.cc:2169 selection.cc:1007 selection.cc:1061
+#: route_time_axis.cc:2190 selection.cc:1042 selection.cc:1096
 msgid "programming error: "
 msgstr "errore di programmazione: "
 
-#: route_time_axis.cc:2585
+#: route_time_axis.cc:2614
 msgid "Underlays"
 msgstr ""
 
-#: route_time_axis.cc:2588
+#: route_time_axis.cc:2617
 msgid "Remove \"%1\""
 msgstr "Rimuovi  \"%1\""
 
-#: route_time_axis.cc:2638 route_time_axis.cc:2675
+#: route_time_axis.cc:2667 route_time_axis.cc:2704
 msgid "programming error: underlay reference pointer pairs are inconsistent!"
 msgstr ""
 
-#: route_time_axis.cc:2702
+#: route_time_axis.cc:2731 vca_master_strip.cc:203 vca_time_axis.cc:228
 msgid "After-fade listen (AFL)"
 msgstr ""
 
-#: route_time_axis.cc:2706
+#: route_time_axis.cc:2735 vca_master_strip.cc:207 vca_time_axis.cc:232
 msgid "Pre-fade listen (PFL)"
 msgstr ""
 
-#: route_ui.cc:140
+#: route_ui.cc:165
 msgid "Mute this track"
 msgstr "Muta questa traccia"
 
-#: route_ui.cc:144
+#: route_ui.cc:169
 msgid "Mute other (non-soloed) tracks"
 msgstr "Muta le altre (non in solo) tracce"
 
-#: route_ui.cc:150
+#: route_ui.cc:175
 msgid "Enable recording on this track"
 msgstr "Abilita la registrazione"
 
-#: route_ui.cc:158
+#: route_ui.cc:183
 msgid "make mixer strips show sends to this bus"
 msgstr ""
 
-#: route_ui.cc:163
+#: route_ui.cc:188
 msgid "Monitor input"
 msgstr "Monitora ingresso"
 
-#: route_ui.cc:169
+#: route_ui.cc:194
 msgid "Monitor playback"
 msgstr "Monitora la riproduzione"
 
-#: route_ui.cc:676
+#: route_ui.cc:706
 msgid "Not connected to AudioEngine - cannot engage record"
 msgstr ""
 "Non connesso al motore audio - non posso intraprendere la registrazione"
 
-#: route_ui.cc:875
+#: route_ui.cc:883
+msgid "Rec-Safe"
+msgstr ""
+
+#: route_ui.cc:888
 msgid "Step Entry"
 msgstr ""
 
-#: route_ui.cc:948
+#: route_ui.cc:987
 msgid "Assign all tracks (prefader)"
 msgstr "Assegna tutte le tracce (pre fader)"
 
-#: route_ui.cc:952
+#: route_ui.cc:991
 msgid "Assign all tracks and buses (prefader)"
 msgstr "Assegna tutte le tracce e i bus (pre fader)"
 
-#: route_ui.cc:956
+#: route_ui.cc:995
 msgid "Assign all tracks (postfader)"
 msgstr "Assegna tutte le tracce (post fader)"
 
-#: route_ui.cc:960
+#: route_ui.cc:999
 msgid "Assign all tracks and buses (postfader)"
 msgstr "Assegna tutte le tracce e bus (post fader)"
 
-#: route_ui.cc:964
+#: route_ui.cc:1003
 msgid "Assign selected tracks (prefader)"
 msgstr "Assegna le tracce selezionate (pre fader)"
 
-#: route_ui.cc:968
+#: route_ui.cc:1007
 msgid "Assign selected tracks and buses (prefader)"
 msgstr "Assegna le tracce selezionate e i bus (pre fader)"
 
-#: route_ui.cc:971
+#: route_ui.cc:1010
 msgid "Assign selected tracks (postfader)"
 msgstr "Assegna le tracce selezionate (post fader)"
 
-#: route_ui.cc:975
+#: route_ui.cc:1014
 msgid "Assign selected tracks and buses (postfader)"
 msgstr "Assegna le tracce selezionate e i bus (post fader)"
 
-#: route_ui.cc:978
+#: route_ui.cc:1017
 msgid "Copy track/bus gains to sends"
 msgstr "Copia il guadagno della traccia/bus sulle mandate"
 
-#: route_ui.cc:979
+#: route_ui.cc:1018
 msgid "Set sends gain to -inf"
 msgstr "Imposta il volume delle manda su -inf"
 
-#: route_ui.cc:980
+#: route_ui.cc:1019
 msgid "Set sends gain to 0dB"
 msgstr "Imposta il volume delle mandate a 0dB"
 
-#: route_ui.cc:1300
+#: route_ui.cc:1357
 msgid "Solo Isolate"
 msgstr "Solo isolato"
 
-#: route_ui.cc:1307
+#: route_ui.cc:1364
 msgid "Solo Safe"
 msgstr ""
 
-#: route_ui.cc:1329
+#: route_ui.cc:1386
 msgid "Pre Fader Sends"
 msgstr "Mandate pre fader"
 
-#: route_ui.cc:1335
+#: route_ui.cc:1392
 msgid "Post Fader Sends"
 msgstr "Mandate post fader"
 
-#: route_ui.cc:1341
+#: route_ui.cc:1398
 msgid "Control Outs"
 msgstr "Uscite di Controllo"
 
-#: route_ui.cc:1347
+#: route_ui.cc:1404
 msgid "Main Outs"
 msgstr "Uscite Principali"
 
-#: route_ui.cc:1479
+#: route_ui.cc:1571
 msgid "Color Selection"
 msgstr "Scelta colore"
 
-#: route_ui.cc:1564
-msgid ""
-"Do you really want to remove track \"%1\" ?\n"
-"\n"
-"You may also lose the playlist used by this track.\n"
-"\n"
-"(This action cannot be undone, and the session file will be overwritten)"
-msgstr ""
-"Si vuole veramente rimuovere la traccia \"%1\" ?\n"
-"\n"
-"Perderete anche la playlist associata a questa traccia.\n"
-"\n"
-"(questa azione non potrà essere annullata ed il file di sessione verrà "
-"sovrascritto)"
-
-#: route_ui.cc:1566
-msgid ""
-"Do you really want to remove bus \"%1\" ?\n"
-"\n"
-"(This action cannot be undone, and the session file will be overwritten)"
-msgstr ""
-"Si vuole veramente rimuovere il bus \"%1\" ?\n"
-"\n"
-"(questa azione non potrà essere annullata ed il file di sessione verrà "
-"sovrascritto)"
-
-#: route_ui.cc:1574
-msgid "Remove track"
-msgstr "Rimuovi traccia"
-
-#: route_ui.cc:1576
-msgid "Remove bus"
-msgstr "Rimuovi bus"
-
-#: route_ui.cc:1604
+#: route_ui.cc:1613
 msgid ""
 "The use of colons (':') is discouraged in track and bus names.\n"
 "Do you want to use this new name?"
@@ -10619,89 +12583,74 @@ msgstr ""
 "bus.\n"
 "Vuoi utilizzare questo nuovo nome?"
 
-#: route_ui.cc:1608
+#: route_ui.cc:1617
 msgid "Use the new name"
 msgstr "Utilizza il nuovo nome"
 
-#: route_ui.cc:1609
+#: route_ui.cc:1618
 msgid "Re-edit the name"
 msgstr "Ri-modifica il nome"
 
-#: route_ui.cc:1622
+#: route_ui.cc:1631
 msgid "Rename Track"
 msgstr "Rinomina traccia"
 
-#: route_ui.cc:1624
+#: route_ui.cc:1633
 msgid "Rename Bus"
 msgstr "Rinomina bus"
 
-#: route_ui.cc:1692
+#: route_ui.cc:1693
 msgid ": comment editor"
 msgstr ": editor del commento"
 
-#: route_ui.cc:1858
+#: route_ui.cc:1848
 msgid " latency"
 msgstr " latenza"
 
-#: route_ui.cc:1871
+#: route_ui.cc:1888
 msgid "Cannot create route template directory %1"
 msgstr ""
 
-#: route_ui.cc:1877
+#: route_ui.cc:1894
 msgid "Save As Template"
 msgstr "Salva come modello"
 
-#: route_ui.cc:1878
+#: route_ui.cc:1895
 msgid "Template name:"
 msgstr "Nome del modello:"
 
-#: route_ui.cc:1959
-msgid "Remote Control ID"
-msgstr "ID del controllo remoto"
+#: route_ui.cc:2019
+msgid ""
+"Left-click to invert polarity of channel %1 of this track. Right-click to "
+"show menu."
+msgstr ""
 
-#: route_ui.cc:1969
-msgid "Remote control ID:"
-msgstr "ID del controllo remoto:"
+#: route_ui.cc:2021
+msgid "Click to show a menu of channels to invert polarity"
+msgstr ""
 
-#: route_ui.cc:1983
-msgid ""
-"The remote control ID of %1 is: %2\n"
-"\n"
-"\n"
-"The remote control ID of %3 cannot be changed."
+#: save_as_dialog.cc:34
+msgid "Switch to newly-saved version"
 msgstr ""
-"L'ID del controllo remoto di %1 è: %2\n"
-"\n"
-"\n"
-"L'ID del controllo remoto di %3 non può essere modificato."
 
-#: route_ui.cc:1987
-msgid "the master bus"
+#: save_as_dialog.cc:35
+msgid "Copy media to new session"
 msgstr ""
 
-#: route_ui.cc:1987
-msgid "the monitor bus"
+#: save_as_dialog.cc:36
+msgid "Copy external media into new session"
 msgstr ""
 
-#: route_ui.cc:1989
-msgid ""
-"The remote control ID of %5 is: %2\n"
-"\n"
-"\n"
-"Remote Control IDs are currently determined by track/bus ordering in %6.\n"
-"\n"
-"%3Use the User Interaction tab of the Preferences window if you want to "
-"change this%4"
+#: save_as_dialog.cc:37
+msgid "Newly-saved session should be empty"
 msgstr ""
 
-#: route_ui.cc:2046
-msgid ""
-"Left-click to invert (phase reverse) channel %1 of this track.  Right-click "
-"to show menu."
+#: save_as_dialog.cc:48
+msgid "Save as session name"
 msgstr ""
 
-#: route_ui.cc:2048
-msgid "Click to show a menu of channels for inversion (phase reverse)"
+#: save_as_dialog.cc:55
+msgid "Parent directory/folder"
 msgstr ""
 
 #: search_path_option.cc:35
@@ -10716,126 +12665,158 @@ msgstr "Clicca per aggiungere una nuova posizione"
 msgid "the session folder"
 msgstr "la cartella di sessione"
 
+#: script_selector.cc:43
+msgid "<b>Type:</b>"
+msgstr ""
+
+#: script_selector.cc:49
+msgid "<b>Author:</b>"
+msgstr ""
+
+#: script_selector.cc:55
+msgid "<b>Description:</b>"
+msgstr ""
+
+#: script_selector.cc:131
+msgid "Select Script to unload"
+msgstr ""
+
+#: script_selector.cc:165
+msgid "<b>Name:</b>"
+msgstr ""
+
+#: script_selector.cc:172
+msgid "<b>Instance Parameters</b>"
+msgstr ""
+
 #: send_ui.cc:134
 msgid "Send "
 msgstr "Mandata"
 
-#: session_dialog.cc:61
+#: session_dialog.cc:71
 msgid "Session Setup"
 msgstr "Impostazioni della sessione"
 
-#: session_dialog.cc:66
+#: session_dialog.cc:76
 msgid "Advanced options ..."
 msgstr "Impostazioni avanzate..."
 
-#: session_dialog.cc:263
+#: session_dialog.cc:163 session_dialog.cc:397
+msgid "Recent Sessions"
+msgstr "Sessioni recenti"
+
+#: session_dialog.cc:311
+msgid "Sample Rate"
+msgstr "Frequenza di campionamento"
+
+#: session_dialog.cc:312
+msgid "File Resolution"
+msgstr ""
+
+#: session_dialog.cc:313
+msgid "Last Modified"
+msgstr ""
+
+#: session_dialog.cc:338
 msgid "New Session"
 msgstr "Nuova sessione"
 
-#: session_dialog.cc:301
+#: session_dialog.cc:379
 msgid "Check the website for more..."
 msgstr "Controlla il sito web per altro..."
 
-#: session_dialog.cc:304
+#: session_dialog.cc:382
 msgid "Click to open the program website in your web browser"
 msgstr ""
 
-#: session_dialog.cc:324
-msgid "Sample Rate"
-msgstr "Frequenza di campionamento"
-
-#: session_dialog.cc:325
-msgid "Disk Format"
-msgstr "Formato disco"
-
-#: session_dialog.cc:343
+#: session_dialog.cc:404
 msgid "Select session file"
 msgstr "Seleziona un file sessione"
 
-#: session_dialog.cc:358
+#: session_dialog.cc:417
 msgid "Other Sessions"
 msgstr "Altre sessioni"
 
-#: session_dialog.cc:384
+#: session_dialog.cc:424
+msgid "Safe Mode: Disable all Plugins"
+msgstr ""
+
+#: session_dialog.cc:454
 msgid "Open"
 msgstr "Apri"
 
-#: session_dialog.cc:451
+#: session_dialog.cc:521
 msgid "Session name:"
 msgstr "Nome della sessione:"
 
-#: session_dialog.cc:473
+#: session_dialog.cc:543
 msgid "Create session folder in:"
 msgstr "Crea cartella di sessione in: "
 
-#: session_dialog.cc:496
+#: session_dialog.cc:564
 msgid "Select folder for session"
 msgstr "Seleziona una cartella per la sessione"
 
-#: session_dialog.cc:525
+#: session_dialog.cc:591
 msgid "Use this template"
 msgstr "Usa questo modello"
 
-#: session_dialog.cc:528
+#: session_dialog.cc:594
 msgid "no template"
 msgstr "nessun modello"
 
-#: session_dialog.cc:663 session_dialog.cc:699
-msgid "32 bit float"
-msgstr "32 bit float"
+#: session_dialog.cc:746 session_dialog.cc:793
+msgid "32-bit float"
+msgstr ""
 
-#: session_dialog.cc:666 session_dialog.cc:702
-msgid "24 bit"
-msgstr "24 bit"
+#: session_dialog.cc:749 session_dialog.cc:796
+msgid "24-bit"
+msgstr ""
 
-#: session_dialog.cc:669 session_dialog.cc:705
-msgid "16 bit"
-msgstr "16 bit"
+#: session_dialog.cc:752 session_dialog.cc:799
+msgid "16-bit"
+msgstr ""
 
-#: session_dialog.cc:747 session_dialog.cc:748 session_dialog.cc:749
+#: session_dialog.cc:877 session_dialog.cc:878 session_dialog.cc:879
 msgid "channels"
 msgstr "canali"
 
-#: session_dialog.cc:763
+#: session_dialog.cc:893
 msgid "<b>Busses</b>"
 msgstr "<b>Bus</b>"
 
-#: session_dialog.cc:764
+#: session_dialog.cc:894
 msgid "<b>Inputs</b>"
 msgstr "<b>Ingressi</b>"
 
-#: session_dialog.cc:765
+#: session_dialog.cc:895
 msgid "<b>Outputs</b>"
 msgstr "<b>Uscite</b>"
 
-#: session_dialog.cc:773
+#: session_dialog.cc:903
 msgid "Create master bus"
 msgstr "Crea un master bus"
 
-#: session_dialog.cc:783
+#: session_dialog.cc:913
 msgid "Automatically connect to physical inputs"
 msgstr "Connetti automaticamente agli ingressi fisici"
 
-#: session_dialog.cc:790 session_dialog.cc:849
+#: session_dialog.cc:920 session_dialog.cc:979
 msgid "Use only"
 msgstr "Usa soltanto"
 
-#: session_dialog.cc:843
+#: session_dialog.cc:973
 msgid "Automatically connect outputs"
 msgstr "Connetti automaticamente le uscite"
 
-#: session_dialog.cc:865
+#: session_dialog.cc:995
 msgid "... to master bus"
 msgstr "... al bus Master"
 
-#: session_dialog.cc:875
+#: session_dialog.cc:1005
 msgid "... to physical outputs"
 msgstr "... alle uscite fisiche."
 
-#: session_import_dialog.cc:65
-msgid "Import from Session"
-msgstr "Importa da una sessione"
-
 #: session_import_dialog.cc:74
 msgid "Elements"
 msgstr "Elementi"
@@ -10858,191 +12839,191 @@ msgstr "Importa da una sessione"
 msgid "This will select all elements of this type!"
 msgstr "Questo selezionerà tutti gli elementi di questo tipo!"
 
-#: session_metadata_dialog.cc:285
+#: session_metadata_dialog.cc:288
 msgid "EAN Check digit OK"
 msgstr ""
 
-#: session_metadata_dialog.cc:289
+#: session_metadata_dialog.cc:292
 msgid "EAN Check digit error"
 msgstr ""
 
-#: session_metadata_dialog.cc:289
+#: session_metadata_dialog.cc:292
 msgid "expected"
 msgstr ""
 
-#: session_metadata_dialog.cc:294
+#: session_metadata_dialog.cc:297
 msgid "EAN Length error"
 msgstr ""
 
-#: session_metadata_dialog.cc:423
+#: session_metadata_dialog.cc:426
 msgid "Field"
 msgstr "Campo"
 
-#: session_metadata_dialog.cc:427
+#: session_metadata_dialog.cc:430
 msgid "Values (current value on top)"
 msgstr "Valori"
 
-#: session_metadata_dialog.cc:641
+#: session_metadata_dialog.cc:644
 msgid "User"
 msgstr "Utente"
 
-#: session_metadata_dialog.cc:649
+#: session_metadata_dialog.cc:652
 msgid "Email"
 msgstr "Email"
 
-#: session_metadata_dialog.cc:652
+#: session_metadata_dialog.cc:655
 msgid "Web"
 msgstr "Web"
 
-#: session_metadata_dialog.cc:655
+#: session_metadata_dialog.cc:658
 msgid "Organization"
 msgstr "Organizzazione"
 
-#: session_metadata_dialog.cc:658
+#: session_metadata_dialog.cc:661
 msgid "Country"
 msgstr "Stato"
 
-#: session_metadata_dialog.cc:672
+#: session_metadata_dialog.cc:675
 msgid "Title"
 msgstr "Titolo"
 
-#: session_metadata_dialog.cc:675
+#: session_metadata_dialog.cc:678
 msgid "Track Number"
 msgstr "Numero traccia"
 
-#: session_metadata_dialog.cc:678
+#: session_metadata_dialog.cc:681
 msgid "Subtitle"
 msgstr "Sottotitolo"
 
-#: session_metadata_dialog.cc:681
+#: session_metadata_dialog.cc:684
 msgid "Grouping"
 msgstr "Raggruppamento"
 
-#: session_metadata_dialog.cc:684
+#: session_metadata_dialog.cc:687
 msgid "Artist"
 msgstr "Artista"
 
-#: session_metadata_dialog.cc:687
+#: session_metadata_dialog.cc:690
 msgid "Genre"
 msgstr "Genere"
 
-#: session_metadata_dialog.cc:690
+#: session_metadata_dialog.cc:693
 msgid "Comment"
 msgstr "Commento"
 
-#: session_metadata_dialog.cc:693
+#: session_metadata_dialog.cc:696
 msgid "Copyright"
 msgstr "Diritti"
 
-#: session_metadata_dialog.cc:701 session_metadata_dialog.cc:706
+#: session_metadata_dialog.cc:704 session_metadata_dialog.cc:709
 msgid "Album"
 msgstr "Album"
 
-#: session_metadata_dialog.cc:709
+#: session_metadata_dialog.cc:712
 msgid "Year"
 msgstr "Anno"
 
-#: session_metadata_dialog.cc:712
+#: session_metadata_dialog.cc:715
 msgid "Album Artist"
 msgstr "Album Artista"
 
-#: session_metadata_dialog.cc:715
+#: session_metadata_dialog.cc:718
 msgid "Total Tracks"
 msgstr "Tracce totali"
 
-#: session_metadata_dialog.cc:718
+#: session_metadata_dialog.cc:721
 msgid "Disc Subtitle"
 msgstr "Sottotitolo disco"
 
-#: session_metadata_dialog.cc:721
+#: session_metadata_dialog.cc:724
 msgid "Disc Number"
 msgstr "Numero disco"
 
-#: session_metadata_dialog.cc:724
+#: session_metadata_dialog.cc:727
 msgid "Total Discs"
 msgstr "Dischi totali"
 
-#: session_metadata_dialog.cc:727
+#: session_metadata_dialog.cc:730
 msgid "Compilation"
 msgstr "Compilation"
 
-#: session_metadata_dialog.cc:730
+#: session_metadata_dialog.cc:733
 msgid "ISRC"
 msgstr "ISRC"
 
-#: session_metadata_dialog.cc:733
+#: session_metadata_dialog.cc:736
 msgid "EAN barcode"
 msgstr ""
 
-#: session_metadata_dialog.cc:746
+#: session_metadata_dialog.cc:749
 msgid "People"
 msgstr "Persone"
 
-#: session_metadata_dialog.cc:751
+#: session_metadata_dialog.cc:754
 msgid "Lyricist"
 msgstr "Testi"
 
-#: session_metadata_dialog.cc:754
+#: session_metadata_dialog.cc:757
 msgid "Composer"
 msgstr "Compositore"
 
-#: session_metadata_dialog.cc:757
+#: session_metadata_dialog.cc:760
 msgid "Conductor"
 msgstr "Conduttore"
 
-#: session_metadata_dialog.cc:760
+#: session_metadata_dialog.cc:763
 msgid "Remixer"
 msgstr "Remissaggio"
 
-#: session_metadata_dialog.cc:763
+#: session_metadata_dialog.cc:766
 msgid "Arranger"
 msgstr "Arrangiatore"
 
-#: session_metadata_dialog.cc:766
+#: session_metadata_dialog.cc:769
 msgid "Engineer"
 msgstr "Ingegnere"
 
-#: session_metadata_dialog.cc:769
+#: session_metadata_dialog.cc:772
 msgid "Producer"
 msgstr "Produttore"
 
-#: session_metadata_dialog.cc:772
+#: session_metadata_dialog.cc:775
 msgid "DJ Mixer"
 msgstr "DJ Mixer"
 
-#: session_metadata_dialog.cc:775
+#: session_metadata_dialog.cc:778
 msgid "Metadata|Mixer"
 msgstr "Metadati|Mixer"
 
-#: session_metadata_dialog.cc:783
+#: session_metadata_dialog.cc:786
 msgid "School"
 msgstr "Scuola"
 
-#: session_metadata_dialog.cc:788
+#: session_metadata_dialog.cc:791
 msgid "Instructor"
 msgstr "Istruttore"
 
-#: session_metadata_dialog.cc:791
+#: session_metadata_dialog.cc:794
 msgid "Course"
 msgstr "Corso"
 
-#: session_metadata_dialog.cc:799
+#: session_metadata_dialog.cc:802
 msgid "Edit Session Metadata"
 msgstr "Modifica i metadati della sessione"
 
-#: session_metadata_dialog.cc:830
+#: session_metadata_dialog.cc:833
 msgid "Import session metadata"
 msgstr "Importa i metadati di una sessione"
 
-#: session_metadata_dialog.cc:851
+#: session_metadata_dialog.cc:854
 msgid "Choose session to import metadata from"
 msgstr "Scegli la sessione da cui importare i metadati"
 
-#: session_metadata_dialog.cc:889
+#: session_metadata_dialog.cc:892
 msgid "This session file could not be read!"
 msgstr "Impossibile leggere questo file di sessione"
 
-#: session_metadata_dialog.cc:899
+#: session_metadata_dialog.cc:902
 msgid ""
 "The session file didn't contain metadata!\n"
 "Maybe this is an old session format?"
@@ -11050,7 +13031,7 @@ msgstr ""
 "Questo file di sessione non conteneva metadati!\n"
 "Forse è un vecchio formato di sessione?"
 
-#: session_metadata_dialog.cc:918
+#: session_metadata_dialog.cc:921
 msgid "Import all from:"
 msgstr "Importa tutto da:"
 
@@ -11197,214 +13178,235 @@ msgid "Destructive crossfade length"
 msgstr "Dissolvenza distruttiva"
 
 #: session_option_editor.cc:146
+msgid "Declick when transport starts and stops"
+msgstr ""
+
+#: session_option_editor.cc:153
+msgid "Declick when monitor state changes"
+msgstr ""
+
+#: session_option_editor.cc:160
 msgid "Region fades active"
 msgstr "Attiva dissolvenze della regione"
 
-#: session_option_editor.cc:153
+#: session_option_editor.cc:167
 msgid "Region fades visible"
 msgstr "Visualizza dissolvenze della regione"
 
-#: session_option_editor.cc:160 session_option_editor.cc:173
-#: session_option_editor.cc:187
+#: session_option_editor.cc:174 session_option_editor.cc:187
+#: session_option_editor.cc:208
 msgid "Media"
 msgstr "Media"
 
-#: session_option_editor.cc:160
+#: session_option_editor.cc:174
 msgid "Audio file format"
 msgstr "Formato file audio"
 
-#: session_option_editor.cc:164
+#: session_option_editor.cc:178
 msgid "Sample format"
 msgstr "Formato campionamento"
 
-#: session_option_editor.cc:169
+#: session_option_editor.cc:183
 msgid "32-bit floating point"
 msgstr "32-bit virgola mobile"
 
-#: session_option_editor.cc:170
+#: session_option_editor.cc:184
 msgid "24-bit integer"
 msgstr "24-bit intero"
 
-#: session_option_editor.cc:171
+#: session_option_editor.cc:185
 msgid "16-bit integer"
 msgstr "16-bit intero"
 
-#: session_option_editor.cc:177
+#: session_option_editor.cc:191
 msgid "File type"
 msgstr "Tipo file"
 
-#: session_option_editor.cc:182
-msgid "Broadcast WAVE"
+#: session_option_editor.cc:196
+msgid "Broadcast WAVE (4GB size limit)"
 msgstr ""
 
-#: session_option_editor.cc:183
-msgid "WAVE"
+#: session_option_editor.cc:198
+msgid "Broadcast RF64"
 msgstr ""
 
-#: session_option_editor.cc:184
+#: session_option_editor.cc:200
+msgid "WAVE (4GB size limit)"
+msgstr ""
+
+#: session_option_editor.cc:201
 msgid "WAVE-64"
 msgstr ""
 
-#: session_option_editor.cc:189
+#: session_option_editor.cc:205
+msgid "RF64 (WAV compatible)"
+msgstr ""
+
+#: session_option_editor.cc:210 session_option_editor.cc:216
+#: session_option_editor.cc:223
+msgid "Files|Locations"
+msgstr ""
+
+#: session_option_editor.cc:210
 msgid "File locations"
 msgstr "Posizioni dei file"
 
-#: session_option_editor.cc:191
+#: session_option_editor.cc:212
 msgid "Search for audio files in:"
 msgstr "Cerca file audio in:"
 
-#: session_option_editor.cc:197
+#: session_option_editor.cc:218
 msgid "Search for MIDI files in:"
 msgstr "Cerca file MIDI in:"
 
-#: session_option_editor.cc:206 session_option_editor.cc:218
-#: session_option_editor.cc:228 session_option_editor.cc:239
+#: session_option_editor.cc:227 session_option_editor.cc:239
+#: session_option_editor.cc:249 session_option_editor.cc:260
 msgid "Filenames"
 msgstr "Nomi file"
 
-#: session_option_editor.cc:206
+#: session_option_editor.cc:227
 msgid "File Naming"
 msgstr "Denominazione file"
 
-#: session_option_editor.cc:212
+#: session_option_editor.cc:233
 msgid "Prefix Track number"
 msgstr "Prefisso numeri di traccia"
 
-#: session_option_editor.cc:217
+#: session_option_editor.cc:238
 msgid ""
 "Adds the current track number to the beginning of the recorded file name."
 msgstr ""
 "Aggiunge il numero di traccia attuale all'inizio del nome file della "
 "registrazione."
 
-#: session_option_editor.cc:222
+#: session_option_editor.cc:243
 msgid "Prefix Take Name"
 msgstr "Prefisso nome della ripresa"
 
-#: session_option_editor.cc:227
+#: session_option_editor.cc:248
 msgid "Adds the Take Name to the beginning of the recorded file name."
 msgstr "Aggiunge il nome della ripresa all'inizio del nome file registrato"
 
-#: session_option_editor.cc:232
+#: session_option_editor.cc:253
 msgid "Take Name"
 msgstr "Nome ripresa"
 
-#: session_option_editor.cc:245
+#: session_option_editor.cc:266
 msgid ""
 "Track Input Monitoring automatically follows transport state (\"auto-input\")"
 msgstr ""
 "Il monitoraggio dell'ingresso traccia segue automaticamente lo stato del "
 "trasporto (\"ingresso-automatico\")"
 
-#: session_option_editor.cc:252
+#: session_option_editor.cc:273
 msgid "Use monitor section in this session"
 msgstr "Utilizza la sezione di monitoraggio in questa sessione"
 
-#: session_option_editor.cc:257 session_option_editor.cc:259
-#: session_option_editor.cc:266 session_option_editor.cc:273
-#: session_option_editor.cc:280 session_option_editor.cc:282
-#: session_option_editor.cc:289 session_option_editor.cc:296
-#: session_option_editor.cc:303 session_option_editor.cc:310
-#: session_option_editor.cc:312
+#: session_option_editor.cc:278 session_option_editor.cc:280
+#: session_option_editor.cc:287 session_option_editor.cc:294
+#: session_option_editor.cc:301 session_option_editor.cc:303
+#: session_option_editor.cc:310 session_option_editor.cc:317
+#: session_option_editor.cc:324 session_option_editor.cc:331
+#: session_option_editor.cc:333
 msgid "Meterbridge"
 msgstr ""
 
-#: session_option_editor.cc:257
+#: session_option_editor.cc:278
 msgid "Route Display"
 msgstr ""
 
-#: session_option_editor.cc:261
+#: session_option_editor.cc:282
 msgid "Show Midi Tracks"
 msgstr "Mostra le tracce MIDI"
 
-#: session_option_editor.cc:268
+#: session_option_editor.cc:289
 msgid "Show Busses"
 msgstr "Mostra i bus"
 
-#: session_option_editor.cc:275
+#: session_option_editor.cc:296
 msgid "Include Master Bus"
 msgstr "Includi il bus principale"
 
-#: session_option_editor.cc:280
+#: session_option_editor.cc:301
 msgid "Button Area"
 msgstr ""
 
-#: session_option_editor.cc:284
+#: session_option_editor.cc:305
 msgid "Rec-enable Button"
 msgstr "Pulsante di abilitazione registrazione"
 
-#: session_option_editor.cc:291
+#: session_option_editor.cc:312
 msgid "Mute Button"
 msgstr "Pulsante per il muto"
 
-#: session_option_editor.cc:298
+#: session_option_editor.cc:319
 msgid "Solo Button"
 msgstr "Pulsante del solo"
 
-#: session_option_editor.cc:305
+#: session_option_editor.cc:326
 msgid "Monitor Buttons"
 msgstr "Pulsanti monitoraggio"
 
-#: session_option_editor.cc:310
+#: session_option_editor.cc:331
 msgid "Name Labels"
 msgstr "Etichette dei nomi"
 
-#: session_option_editor.cc:314
+#: session_option_editor.cc:335
 msgid "Track Name"
 msgstr "Nome traccia"
 
-#: session_option_editor.cc:325
+#: session_option_editor.cc:346
 msgid "MIDI region copies are independent"
 msgstr "Le copie delle regioni MIDI sono indipendenti"
 
-#: session_option_editor.cc:332
+#: session_option_editor.cc:353
 msgid ""
 "Policy for handling overlapping notes\n"
 " on the same MIDI channel"
 msgstr ""
 "Politiche di gestione delle note in soprapposizione sullo stesso canale MIDI"
 
-#: session_option_editor.cc:337
+#: session_option_editor.cc:358
 msgid "never allow them"
 msgstr "non consentire mai"
 
-#: session_option_editor.cc:338
+#: session_option_editor.cc:359
 msgid "don't do anything in particular"
 msgstr "non fare nulla in particolare"
 
-#: session_option_editor.cc:339
+#: session_option_editor.cc:360
 msgid "replace any overlapped existing note"
 msgstr "sostituisci ogni nota sovrapposta"
 
-#: session_option_editor.cc:340
+#: session_option_editor.cc:361
 msgid "shorten the overlapped existing note"
 msgstr "accorcia le note in sovrapposizione esistenti"
 
-#: session_option_editor.cc:341
+#: session_option_editor.cc:362
 msgid "shorten the overlapping new note"
 msgstr "accorcia la nuova nota in sovrapposizione"
 
-#: session_option_editor.cc:342
+#: session_option_editor.cc:363
 msgid "replace both overlapping notes with a single note"
 msgstr "sostituisci entrambe le note in sovrapposizione con una singola nota"
 
-#: session_option_editor.cc:346
+#: session_option_editor.cc:367
 msgid "Glue to bars and beats"
 msgstr "Incolla a battiti e battute"
 
-#: session_option_editor.cc:350
+#: session_option_editor.cc:371
 msgid "Glue new markers to bars and beats"
 msgstr "Incolla i nuovi marcatori a battiti e battute"
 
-#: session_option_editor.cc:357
+#: session_option_editor.cc:378
 msgid "Glue new regions to bars and beats"
 msgstr "Incolla le nuove regioni a battiti e battute"
 
-#: session_option_editor.cc:362
+#: session_option_editor.cc:383
 msgid "Defaults"
 msgstr ""
 
-#: session_option_editor.cc:364
+#: session_option_editor.cc:385
 msgid "Use these settings as defaults"
 msgstr "Utilizza le impostazioni come default"
 
@@ -11440,26 +13442,14 @@ msgstr "<b>Info sul file audio</b>"
 msgid "Timestamp:"
 msgstr ""
 
-#: sfdb_ui.cc:149
-msgid "Format:"
-msgstr "Formato:"
-
-#: sfdb_ui.cc:188 sfdb_ui.cc:653
+#: sfdb_ui.cc:188 sfdb_ui.cc:659
 msgid "Tags:"
 msgstr ""
 
-#: sfdb_ui.cc:293 sfdb_ui.cc:409
-msgid "Could not read file: %1 (%2)."
-msgstr "Editor: impossibile aprire il file %1 (%2)."
-
 #: sfdb_ui.cc:297
 msgid "<b>Midi File Information</b>"
 msgstr "<b>Informazioni del file MIDI</b>"
 
-#: sfdb_ui.cc:458
-msgid "Could not access soundfile: "
-msgstr "Impossibile accedere al file audio"
-
 #: sfdb_ui.cc:530
 msgid "SoundFileBox: Could not tokenize string: "
 msgstr ""
@@ -11468,181 +13458,177 @@ msgstr ""
 msgid "Search"
 msgstr "Cerca"
 
-#: sfdb_ui.cc:576
+#: sfdb_ui.cc:581
 msgid "Audio and MIDI files"
 msgstr "File audio e MIDI"
 
-#: sfdb_ui.cc:579
+#: sfdb_ui.cc:584
 msgid "Audio files"
 msgstr "File audio"
 
-#: sfdb_ui.cc:582
+#: sfdb_ui.cc:587
 msgid "MIDI files"
 msgstr "File MIDI"
 
-#: sfdb_ui.cc:585 add_video_dialog.cc:123
+#: sfdb_ui.cc:590 add_video_dialog.cc:123
 msgid "All files"
 msgstr "Tutti i file"
 
-#: sfdb_ui.cc:604 add_video_dialog.cc:246
+#: sfdb_ui.cc:609 add_video_dialog.cc:246
 msgid "Browse Files"
 msgstr "Cerca nei file"
 
-#: sfdb_ui.cc:633
+#: sfdb_ui.cc:638
 msgid "Paths"
 msgstr "Percorsi"
 
-#: sfdb_ui.cc:642
+#: sfdb_ui.cc:647
 msgid "Search Tags"
 msgstr ""
 
-#: sfdb_ui.cc:658
+#: sfdb_ui.cc:664
 msgid "Sort:"
 msgstr "Ordina:"
 
-#: sfdb_ui.cc:666
+#: sfdb_ui.cc:672
 msgid "Longest"
 msgstr "Più lunga"
 
-#: sfdb_ui.cc:667
+#: sfdb_ui.cc:673
 msgid "Shortest"
 msgstr "Più corta"
 
-#: sfdb_ui.cc:668
+#: sfdb_ui.cc:674
 msgid "Newest"
 msgstr "Più recente"
 
-#: sfdb_ui.cc:669
+#: sfdb_ui.cc:675
 msgid "Oldest"
 msgstr "Meno recente"
 
-#: sfdb_ui.cc:670
+#: sfdb_ui.cc:676
 msgid "Most downloaded"
 msgstr "Più scaricata"
 
-#: sfdb_ui.cc:671
+#: sfdb_ui.cc:677
 msgid "Least downloaded"
 msgstr "Scaricata per ultima"
 
-#: sfdb_ui.cc:672
+#: sfdb_ui.cc:678
 msgid "Highest rated"
 msgstr ""
 
-#: sfdb_ui.cc:673
+#: sfdb_ui.cc:679
 msgid "Lowest rated"
 msgstr ""
 
-#: sfdb_ui.cc:678
+#: sfdb_ui.cc:684
 msgid "More"
 msgstr "Più"
 
-#: sfdb_ui.cc:682
+#: sfdb_ui.cc:688
 msgid "Similar"
 msgstr "Simile"
 
-#: sfdb_ui.cc:694
+#: sfdb_ui.cc:700
 msgid "ID"
 msgstr "ID"
 
-#: sfdb_ui.cc:695 add_video_dialog.cc:83
+#: sfdb_ui.cc:701 add_video_dialog.cc:83
 msgid "Filename"
 msgstr "Nome file"
 
-#: sfdb_ui.cc:697
+#: sfdb_ui.cc:703 time_fx_dialog.cc:154
 msgid "Duration"
 msgstr "Durata"
 
-#: sfdb_ui.cc:698
+#: sfdb_ui.cc:704
 msgid "Size"
 msgstr "Grandezza"
 
-#: sfdb_ui.cc:699
+#: sfdb_ui.cc:705
 msgid "Samplerate"
 msgstr ""
 
-#: sfdb_ui.cc:700
+#: sfdb_ui.cc:706
 msgid "License"
 msgstr "Licenza"
 
-#: sfdb_ui.cc:718
+#: sfdb_ui.cc:724
 msgid "Search Freesound"
 msgstr "Cerca su freesound"
 
-#: sfdb_ui.cc:738
-msgid "Press to import selected files and close this window"
+#: sfdb_ui.cc:741
+msgid "Press to import selected files"
 msgstr ""
 
-#: sfdb_ui.cc:739
-msgid "Press to import selected files and leave this window open"
-msgstr ""
-
-#: sfdb_ui.cc:740
+#: sfdb_ui.cc:742
 msgid "Press to close this window without importing any files"
 msgstr ""
 
-#: sfdb_ui.cc:936
+#: sfdb_ui.cc:937
 msgid "SoundFileBrowser: Could not tokenize string: "
 msgstr ""
 
-#: sfdb_ui.cc:1136
+#: sfdb_ui.cc:1137
 msgid "%1 more page of 100 results available"
 msgid_plural "%1 more pages of 100 results available"
 msgstr[0] ""
 msgstr[1] ""
 
-#: sfdb_ui.cc:1141
+#: sfdb_ui.cc:1142
 msgid "No more results available"
 msgstr ""
 
-#: sfdb_ui.cc:1205
+#: sfdb_ui.cc:1206
 msgid "B"
 msgstr ""
 
-#: sfdb_ui.cc:1207
+#: sfdb_ui.cc:1208
 msgid "kB"
 msgstr ""
 
-#: sfdb_ui.cc:1209 sfdb_ui.cc:1211
+#: sfdb_ui.cc:1210 sfdb_ui.cc:1212
 msgid "MB"
 msgstr ""
 
-#: sfdb_ui.cc:1213
+#: sfdb_ui.cc:1214
 msgid "GB"
 msgstr ""
 
-#: sfdb_ui.cc:1425 sfdb_ui.cc:1738 sfdb_ui.cc:1801 sfdb_ui.cc:1819
+#: sfdb_ui.cc:1431 sfdb_ui.cc:1728 sfdb_ui.cc:1764 sfdb_ui.cc:1782
 msgid "one track per file"
 msgstr "una traccia per file"
 
-#: sfdb_ui.cc:1428 sfdb_ui.cc:1802 sfdb_ui.cc:1820
+#: sfdb_ui.cc:1434 sfdb_ui.cc:1765 sfdb_ui.cc:1783
 msgid "one track per channel"
 msgstr "una traccia per canale"
 
-#: sfdb_ui.cc:1436 sfdb_ui.cc:1804 sfdb_ui.cc:1821
+#: sfdb_ui.cc:1442 sfdb_ui.cc:1767 sfdb_ui.cc:1784
 msgid "sequence files"
 msgstr ""
 
-#: sfdb_ui.cc:1439 sfdb_ui.cc:1809
+#: sfdb_ui.cc:1445 sfdb_ui.cc:1772
 msgid "all files in one track"
 msgstr "tutti i file in una traccia"
 
-#: sfdb_ui.cc:1440 sfdb_ui.cc:1803
+#: sfdb_ui.cc:1446 sfdb_ui.cc:1766
 msgid "merge files"
 msgstr "Unisci i file"
 
-#: sfdb_ui.cc:1446 sfdb_ui.cc:1806
+#: sfdb_ui.cc:1452 sfdb_ui.cc:1769
 msgid "one region per file"
 msgstr "una regione per file"
 
-#: sfdb_ui.cc:1449 sfdb_ui.cc:1807
+#: sfdb_ui.cc:1455 sfdb_ui.cc:1770
 msgid "one region per channel"
 msgstr "una regione per canale"
 
-#: sfdb_ui.cc:1454 sfdb_ui.cc:1808 sfdb_ui.cc:1822
+#: sfdb_ui.cc:1460 sfdb_ui.cc:1771 sfdb_ui.cc:1785
 msgid "all files in one region"
 msgstr "tutti i file in una regione"
 
-#: sfdb_ui.cc:1521
+#: sfdb_ui.cc:1527
 msgid ""
 "One or more of the selected files\n"
 "cannot be used by %1"
@@ -11650,104 +13636,104 @@ msgstr ""
 "Uno o alcuni dei file selezionati\n"
 "non possono essere utilizzati da %1"
 
-#: sfdb_ui.cc:1665
+#: sfdb_ui.cc:1671
 msgid "Copy files to session"
 msgstr "Copia i file nella sessione"
 
-#: sfdb_ui.cc:1682 sfdb_ui.cc:1859
+#: sfdb_ui.cc:1686 sfdb_ui.cc:1825
 msgid "file timestamp"
 msgstr ""
 
-#: sfdb_ui.cc:1683 sfdb_ui.cc:1861
+#: sfdb_ui.cc:1687 sfdb_ui.cc:1827
 msgid "edit point"
 msgstr ""
 
-#: sfdb_ui.cc:1684 sfdb_ui.cc:1863
+#: sfdb_ui.cc:1688 sfdb_ui.cc:1829
 msgid "playhead"
 msgstr "testina"
 
-#: sfdb_ui.cc:1685
+#: sfdb_ui.cc:1689
 msgid "session start"
 msgstr "inizio sessione"
 
-#: sfdb_ui.cc:1691
-msgid "<b>Add files as ...</b>"
+#: sfdb_ui.cc:1695
+msgid "<b>Add files ...</b>"
 msgstr ""
 
-#: sfdb_ui.cc:1713
+#: sfdb_ui.cc:1700
 msgid "<b>Insert at</b>"
 msgstr ""
 
-#: sfdb_ui.cc:1726
+#: sfdb_ui.cc:1705
 msgid "<b>Mapping</b>"
 msgstr ""
 
-#: sfdb_ui.cc:1744
+#: sfdb_ui.cc:1710
 msgid "<b>Conversion quality</b>"
 msgstr ""
 
-#: sfdb_ui.cc:1756
+#: sfdb_ui.cc:1715
 msgid "<b>Instrument</b>"
 msgstr ""
 
-#: sfdb_ui.cc:1768 sfdb_ui.cc:1875
+#: sfdb_ui.cc:1734 sfdb_ui.cc:1841
 msgid "Best"
 msgstr "Migliore"
 
-#: sfdb_ui.cc:1769 sfdb_ui.cc:1877
+#: sfdb_ui.cc:1735 sfdb_ui.cc:1843
 msgid "Good"
 msgstr "Buona"
 
-#: sfdb_ui.cc:1770 sfdb_ui.cc:1879
+#: sfdb_ui.cc:1736 sfdb_ui.cc:1845
 msgid "Quick"
 msgstr "Veloce"
 
-#: sfdb_ui.cc:1772
+#: sfdb_ui.cc:1738
 msgid "Fastest"
 msgstr "Velocissimo"
 
-#: shuttle_control.cc:56
+#: shuttle_control.cc:64
 msgid "Shuttle speed control (Context-click for options)"
 msgstr ""
 
-#: shuttle_control.cc:174
+#: shuttle_control.cc:201 time_fx_dialog.cc:164
 msgid "Percent"
 msgstr "Percentuale"
 
-#: shuttle_control.cc:182
+#: shuttle_control.cc:209
 msgid "Units"
 msgstr ""
 
-#: shuttle_control.cc:188 shuttle_control.cc:609
+#: shuttle_control.cc:215 shuttle_control.cc:671
 msgid "Sprung"
 msgstr ""
 
-#: shuttle_control.cc:192 shuttle_control.cc:612
+#: shuttle_control.cc:219 shuttle_control.cc:674
 msgid "Wheel"
 msgstr ""
 
-#: shuttle_control.cc:226
+#: shuttle_control.cc:253
 msgid "Maximum speed"
 msgstr "Velocità massima"
 
-#: shuttle_control.cc:568
+#: shuttle_control.cc:256
+msgid "Reset to 100%"
+msgstr ""
+
+#: shuttle_control.cc:633
 msgid "Playing"
 msgstr ""
 
-#: shuttle_control.cc:583
+#: shuttle_control.cc:648
 #, c-format
 msgid "<<< %+d semitones"
 msgstr ""
 
-#: shuttle_control.cc:585
+#: shuttle_control.cc:650
 #, c-format
 msgid ">>> %+d semitones"
 msgstr ""
 
-#: shuttle_control.cc:590
-msgid "Stopped"
-msgstr "Fermato"
-
 #: soundcloud_export_selector.cc:44
 msgid "User Email"
 msgstr ""
@@ -11772,7 +13758,7 @@ msgstr ""
 msgid "%1: %2 of %3 bytes uploaded"
 msgstr ""
 
-#: splash.cc:73
+#: splash.cc:78
 msgid "%1 loading ..."
 msgstr "%1 si sta avviando..."
 
@@ -11788,17 +13774,17 @@ msgstr "Rimuovi altoparlante"
 msgid "Azimuth:"
 msgstr ""
 
-#: startup.cc:67
+#: startup.cc:71
 msgid ""
 "Use an external mixer or the hardware mixer of your audio interface.\n"
 "%1 will play NO role in monitoring"
 msgstr ""
 
-#: startup.cc:69
+#: startup.cc:73
 msgid "Ask %1 to play back material as it is being recorded"
 msgstr ""
 
-#: startup.cc:142
+#: startup.cc:146
 msgid ""
 "<span size=\"larger\">%1 is a digital audio workstation. You can use it to "
 "record, edit and mix multi-track audio. You can produce your own CDs, mix "
@@ -11808,15 +13794,15 @@ msgid ""
 "program.</span> "
 msgstr ""
 
-#: startup.cc:168
+#: startup.cc:172
 msgid "Welcome to %1"
 msgstr "Benvenuti in %1"
 
-#: startup.cc:191
+#: startup.cc:195
 msgid "Default folder for %1 sessions"
 msgstr "Cartella base per le sessioni %1"
 
-#: startup.cc:197
+#: startup.cc:201
 msgid ""
 "Each project that you work on with %1 has its own folder.\n"
 "These can require a lot of disk space if you are recording audio.\n"
@@ -11834,11 +13820,11 @@ msgstr ""
 "<i>(Potrete memorizzare le sessioni dove volete, questo è solo un valore "
 "implicito)</i>"
 
-#: startup.cc:220
+#: startup.cc:224
 msgid "Default folder for new sessions"
 msgstr "Cartella base per le nuove sessioni"
 
-#: startup.cc:241
+#: startup.cc:245
 msgid ""
 "While recording instruments or vocals, you probably want to listen to the\n"
 "signal as well as record it. This is called \"monitoring\". There are\n"
@@ -11852,25 +13838,25 @@ msgid ""
 "<i>If you do not understand what this is about, just accept the default.</i>"
 msgstr ""
 
-#: startup.cc:262
+#: startup.cc:266
 msgid "Monitoring Choices"
 msgstr "Scelte di controllo"
 
-#: startup.cc:285
+#: startup.cc:289
 msgid "Use a Master bus directly"
 msgstr "Utilizza un Master bus direttamente"
 
-#: startup.cc:287
+#: startup.cc:291
 msgid ""
 "Connect the Master bus directly to your hardware outputs. This is preferable "
 "for simple usage."
 msgstr ""
 
-#: startup.cc:296
+#: startup.cc:300
 msgid "Use an additional Monitor bus"
 msgstr "Utilizza un bus Monitor aggiuntivo"
 
-#: startup.cc:299
+#: startup.cc:303
 msgid ""
 "Use a Monitor bus between Master bus and hardware outputs for \n"
 "greater control in monitoring without affecting the mix."
@@ -11878,7 +13864,7 @@ msgstr ""
 "Usa un bus Monitor tra il bus Master e le uscite fisiche\n"
 "per avere un controllo maggiore senza influire sul mixaggio."
 
-#: startup.cc:321
+#: startup.cc:325
 msgid ""
 "<i>You can change this preference at any time via the Preferences dialog.\n"
 "You can also add or remove the monitor section to/from any session.</i>\n"
@@ -11886,46 +13872,42 @@ msgid ""
 "<i>If you do not understand what this is about, just accept the default.</i>"
 msgstr ""
 
-#: startup.cc:332
+#: startup.cc:336
 msgid "Monitor Section"
 msgstr "Sezione di controllo"
 
-#: step_entry.cc:60
+#: step_entry.cc:59
 msgid "Step Entry: %1"
 msgstr ""
 
-#: step_entry.cc:65
+#: step_entry.cc:64
 msgid ">beat"
 msgstr ">battito"
 
-#: step_entry.cc:66
+#: step_entry.cc:65
 msgid ">bar"
 msgstr ">battuta"
 
-#: step_entry.cc:67
+#: step_entry.cc:66
 msgid ">EP"
 msgstr ">EP"
 
-#: step_entry.cc:68
+#: step_entry.cc:67
 msgid "sustain"
 msgstr ""
 
-#: step_entry.cc:69
+#: step_entry.cc:68
 msgid "rest"
 msgstr ""
 
-#: step_entry.cc:70
+#: step_entry.cc:69
 msgid "g-rest"
 msgstr ""
 
-#: step_entry.cc:71
+#: step_entry.cc:70
 msgid "back"
 msgstr ""
 
-#: step_entry.cc:82 step_entry.cc:85
-msgid "+"
-msgstr ""
-
 #: step_entry.cc:191
 msgid "Set note length to a whole note"
 msgstr "Imposta la durata della nota ad una nota"
@@ -12034,11 +14016,11 @@ msgstr ""
 msgid "Insert a program change message"
 msgstr ""
 
-#: step_entry.cc:343 step_entry.cc:700
+#: step_entry.cc:343 step_entry.cc:645
 msgid "Move Insert Position Back by Note Length"
 msgstr ""
 
-#: step_entry.cc:344 step_entry.cc:698
+#: step_entry.cc:344 step_entry.cc:643
 msgid "Move Insert Position to Edit Point"
 msgstr ""
 
@@ -12050,240 +14032,244 @@ msgstr ""
 msgid "Octave"
 msgstr ""
 
-#: step_entry.cc:598
+#: step_entry.cc:592
 msgid "Insert Note A"
 msgstr ""
 
-#: step_entry.cc:599
+#: step_entry.cc:593
 msgid "Insert Note A-sharp"
 msgstr ""
 
-#: step_entry.cc:600
+#: step_entry.cc:594
 msgid "Insert Note B"
 msgstr ""
 
-#: step_entry.cc:601
+#: step_entry.cc:595
 msgid "Insert Note C"
 msgstr ""
 
-#: step_entry.cc:602
+#: step_entry.cc:596
 msgid "Insert Note C-sharp"
 msgstr ""
 
-#: step_entry.cc:603
+#: step_entry.cc:597
 msgid "Insert Note D"
 msgstr ""
 
-#: step_entry.cc:604
+#: step_entry.cc:598
 msgid "Insert Note D-sharp"
 msgstr ""
 
-#: step_entry.cc:605
+#: step_entry.cc:599
 msgid "Insert Note E"
 msgstr ""
 
-#: step_entry.cc:606
+#: step_entry.cc:600
 msgid "Insert Note F"
 msgstr ""
 
-#: step_entry.cc:607
+#: step_entry.cc:601
 msgid "Insert Note F-sharp"
 msgstr ""
 
-#: step_entry.cc:608
+#: step_entry.cc:602
 msgid "Insert Note G"
 msgstr ""
 
-#: step_entry.cc:609
+#: step_entry.cc:603
 msgid "Insert Note G-sharp"
 msgstr ""
 
-#: step_entry.cc:611
+#: step_entry.cc:605
 msgid "Insert a Note-length Rest"
 msgstr ""
 
-#: step_entry.cc:612
+#: step_entry.cc:606
 msgid "Insert a Snap-length Rest"
 msgstr ""
 
-#: step_entry.cc:614 step_entry.cc:615
+#: step_entry.cc:608 step_entry.cc:609
 msgid "Move to next octave"
 msgstr ""
 
-#: step_entry.cc:617
+#: step_entry.cc:611
 msgid "Move to Next Note Length"
 msgstr ""
 
-#: step_entry.cc:618
+#: step_entry.cc:612
 msgid "Move to Previous Note Length"
 msgstr ""
 
-#: step_entry.cc:620
+#: step_entry.cc:614
 msgid "Increase Note Length"
 msgstr "Aumenta la durata della nota"
 
-#: step_entry.cc:621
+#: step_entry.cc:615
 msgid "Decrease Note Length"
 msgstr "Diminuisci la durata della nota"
 
-#: step_entry.cc:623
+#: step_entry.cc:617
 msgid "Move to Next Note Velocity"
 msgstr ""
 
-#: step_entry.cc:624
+#: step_entry.cc:618
 msgid "Move to Previous Note Velocity"
 msgstr ""
 
-#: step_entry.cc:626
+#: step_entry.cc:620
 msgid "Increase Note Velocity"
 msgstr ""
 
-#: step_entry.cc:627
+#: step_entry.cc:621
 msgid "Decrease Note Velocity"
 msgstr ""
 
-#: step_entry.cc:629
+#: step_entry.cc:623
 msgid "Switch to the 1st octave"
 msgstr "Passa alla 1a ottava"
 
-#: step_entry.cc:630
+#: step_entry.cc:624
 msgid "Switch to the 2nd octave"
 msgstr "Passa alla 2a ottava"
 
-#: step_entry.cc:631
+#: step_entry.cc:625
 msgid "Switch to the 3rd octave"
 msgstr "Passa alla 3a ottava"
 
-#: step_entry.cc:632
+#: step_entry.cc:626
 msgid "Switch to the 4th octave"
 msgstr "Passa alla 4a ottava"
 
-#: step_entry.cc:633
+#: step_entry.cc:627
 msgid "Switch to the 5th octave"
 msgstr "Passa alla 5a ottava"
 
-#: step_entry.cc:634
+#: step_entry.cc:628
 msgid "Switch to the 6th octave"
 msgstr "Passa alla 6a ottava"
 
-#: step_entry.cc:635
+#: step_entry.cc:629
 msgid "Switch to the 7th octave"
 msgstr "Passa alla 7a ottava"
 
-#: step_entry.cc:636
+#: step_entry.cc:630
 msgid "Switch to the 8th octave"
 msgstr "Passa alla 8a ottava"
 
-#: step_entry.cc:637
+#: step_entry.cc:631
 msgid "Switch to the 9th octave"
 msgstr "Passa alla 9a ottava"
 
-#: step_entry.cc:638
+#: step_entry.cc:632
 msgid "Switch to the 10th octave"
 msgstr "Passa alla 10a ottava"
 
-#: step_entry.cc:639
+#: step_entry.cc:633
 msgid "Switch to the 11th octave"
 msgstr "Passa alla 11a ottava"
 
-#: step_entry.cc:644
+#: step_entry.cc:635
+msgid "Toggle Triple Notes"
+msgstr "Attiva/disattiva le note terzinate"
+
+#: step_entry.cc:638
+msgid "Toggle Chord Entry"
+msgstr ""
+
+#: step_entry.cc:640
+msgid "Sustain Selected Notes by Note Length"
+msgstr ""
+
+#: step_entry.cc:650
 msgid "Set Note Length to Whole"
 msgstr ""
 
-#: step_entry.cc:646
+#: step_entry.cc:652
 msgid "Set Note Length to 1/2"
 msgstr ""
 
-#: step_entry.cc:648
+#: step_entry.cc:654
 msgid "Set Note Length to 1/3"
 msgstr "Durata della nota a 1/3"
 
-#: step_entry.cc:650
+#: step_entry.cc:656
 msgid "Set Note Length to 1/4"
 msgstr "Durata della nota a 1/4"
 
-#: step_entry.cc:652
+#: step_entry.cc:658
 msgid "Set Note Length to 1/8"
 msgstr "Durata della nota a 1/8"
 
-#: step_entry.cc:654
+#: step_entry.cc:660
 msgid "Set Note Length to 1/16"
 msgstr "Durata della nota a 1/16"
 
-#: step_entry.cc:656
+#: step_entry.cc:662
 msgid "Set Note Length to 1/32"
 msgstr "Durata della nota a 1/32"
 
-#: step_entry.cc:658
+#: step_entry.cc:664
 msgid "Set Note Length to 1/64"
 msgstr "Durata della nota a 1/64"
 
-#: step_entry.cc:663
+#: step_entry.cc:669
 msgid "Set Note Velocity to Pianississimo"
 msgstr ""
 
-#: step_entry.cc:665
+#: step_entry.cc:671
 msgid "Set Note Velocity to Pianissimo"
 msgstr ""
 
-#: step_entry.cc:667
+#: step_entry.cc:673
 msgid "Set Note Velocity to Piano"
 msgstr ""
 
-#: step_entry.cc:669
+#: step_entry.cc:675
 msgid "Set Note Velocity to Mezzo-Piano"
 msgstr ""
 
-#: step_entry.cc:671
+#: step_entry.cc:677
 msgid "Set Note Velocity to Mezzo-Forte"
 msgstr "Imposta la nota su <i>mf</i>"
 
-#: step_entry.cc:673
+#: step_entry.cc:679
 msgid "Set Note Velocity to Forte"
 msgstr "Imposta la nota su <i>f</i>"
 
-#: step_entry.cc:675 step_entry.cc:677
+#: step_entry.cc:681 step_entry.cc:683
 msgid "Set Note Velocity to Fortississimo"
 msgstr "Imposta la nota su <i>fff</i>"
 
-#: step_entry.cc:679
-msgid "Toggle Triple Notes"
-msgstr "Attiva/disattiva le note terzinate"
-
-#: step_entry.cc:684
+#: step_entry.cc:688
 msgid "No Dotted Notes"
 msgstr ""
 
-#: step_entry.cc:686
+#: step_entry.cc:689
 msgid "Toggled Dotted Notes"
 msgstr "Attiva/disattiva note puntate"
 
-#: step_entry.cc:688
+#: step_entry.cc:690
 msgid "Toggled Double-Dotted Notes"
 msgstr ""
 
-#: step_entry.cc:690
+#: step_entry.cc:691
 msgid "Toggled Triple-Dotted Notes"
 msgstr ""
 
-#: step_entry.cc:693
-msgid "Toggle Chord Entry"
-msgstr ""
-
-#: step_entry.cc:695
-msgid "Sustain Selected Notes by Note Length"
-msgstr ""
-
-#: stereo_panner.cc:133
+#: stereo_panner.cc:129
 #, c-format
 msgid "L:%3d R:%3d Width:%d%%"
 msgstr ""
 
-#: stereo_panner_editor.cc:35
+#: stereo_panner.cc:272
+msgid "Panner|M"
+msgstr ""
+
+#: stereo_panner_editor.cc:37
 msgid "Stereo Panner"
 msgstr ""
 
-#: stereo_panner_editor.cc:49
+#: stereo_panner_editor.cc:51
 msgid "Width"
 msgstr ""
 
@@ -12291,176 +14277,189 @@ msgstr ""
 msgid "Strip Silence"
 msgstr "Rimuovi silenzio"
 
-#: strip_silence_dialog.cc:75
+#: strip_silence_dialog.cc:65
+msgid "Threshold"
+msgstr "Soglia"
+
+#: strip_silence_dialog.cc:76
 msgid "Minimum length"
 msgstr "Durata minima"
 
-#: strip_silence_dialog.cc:83
+#: strip_silence_dialog.cc:84
 msgid "Fade length"
 msgstr "Durata delle dissolvenza"
 
-#: tempo_dialog.cc:41 tempo_dialog.cc:57
+#: strip_silence_dialog.cc:111 strip_silence_dialog.cc:298
+msgid "Analyzing"
+msgstr ""
+
+#: tempo_dialog.cc:43 tempo_dialog.cc:60
 msgid "bar:"
 msgstr "battuta:"
 
-#: tempo_dialog.cc:42 tempo_dialog.cc:58
+#: tempo_dialog.cc:44 tempo_dialog.cc:61
 msgid "beat:"
 msgstr "battito:"
 
-#: tempo_dialog.cc:43 tempo_dialog.cc:59
+#: tempo_dialog.cc:45 tempo_dialog.cc:62
 msgid "Pulse note"
 msgstr ""
 
-#: tempo_dialog.cc:44 tempo_dialog.cc:60
+#: tempo_dialog.cc:46 tempo_dialog.cc:63
 msgid "Tap tempo"
 msgstr ""
 
-#: tempo_dialog.cc:54
-msgid "Edit Tempo"
-msgstr ""
-
-#: tempo_dialog.cc:77 tempo_dialog.cc:78 tempo_dialog.cc:324
-#: tempo_dialog.cc:325
+#: tempo_dialog.cc:81 tempo_dialog.cc:82 tempo_dialog.cc:448
+#: tempo_dialog.cc:449
 msgid "whole"
 msgstr ""
 
-#: tempo_dialog.cc:79 tempo_dialog.cc:80 tempo_dialog.cc:326
-#: tempo_dialog.cc:327
+#: tempo_dialog.cc:83 tempo_dialog.cc:84 tempo_dialog.cc:450
+#: tempo_dialog.cc:451
 msgid "second"
 msgstr ""
 
-#: tempo_dialog.cc:81 tempo_dialog.cc:82 tempo_dialog.cc:328
-#: tempo_dialog.cc:329
+#: tempo_dialog.cc:85 tempo_dialog.cc:86 tempo_dialog.cc:452
+#: tempo_dialog.cc:453
 msgid "third"
 msgstr ""
 
-#: tempo_dialog.cc:83 tempo_dialog.cc:84 tempo_dialog.cc:330
-#: tempo_dialog.cc:331
+#: tempo_dialog.cc:87 tempo_dialog.cc:88 tempo_dialog.cc:454
+#: tempo_dialog.cc:455
 msgid "quarter"
 msgstr ""
 
-#: tempo_dialog.cc:85 tempo_dialog.cc:86 tempo_dialog.cc:332
-#: tempo_dialog.cc:333
+#: tempo_dialog.cc:89 tempo_dialog.cc:90 tempo_dialog.cc:456
+#: tempo_dialog.cc:457
 msgid "eighth"
 msgstr ""
 
-#: tempo_dialog.cc:87 tempo_dialog.cc:88 tempo_dialog.cc:334
-#: tempo_dialog.cc:335
+#: tempo_dialog.cc:91 tempo_dialog.cc:92 tempo_dialog.cc:458
+#: tempo_dialog.cc:459
 msgid "sixteenth"
 msgstr ""
 
-#: tempo_dialog.cc:89 tempo_dialog.cc:90 tempo_dialog.cc:336
-#: tempo_dialog.cc:337
+#: tempo_dialog.cc:93 tempo_dialog.cc:94 tempo_dialog.cc:460
+#: tempo_dialog.cc:461
 msgid "thirty-second"
 msgstr ""
 
-#: tempo_dialog.cc:91 tempo_dialog.cc:92 tempo_dialog.cc:338
-#: tempo_dialog.cc:339
+#: tempo_dialog.cc:95 tempo_dialog.cc:96 tempo_dialog.cc:462
+#: tempo_dialog.cc:463
 msgid "sixty-fourth"
 msgstr ""
 
-#: tempo_dialog.cc:93 tempo_dialog.cc:94 tempo_dialog.cc:340
-#: tempo_dialog.cc:341
+#: tempo_dialog.cc:97 tempo_dialog.cc:98 tempo_dialog.cc:464
+#: tempo_dialog.cc:465
 msgid "one-hundred-twenty-eighth"
 msgstr ""
 
-#: tempo_dialog.cc:121
+#: tempo_dialog.cc:115 tempo_dialog.cc:116
+msgid "ramped"
+msgstr ""
+
+#: tempo_dialog.cc:117 tempo_dialog.cc:118
+msgid "constant"
+msgstr ""
+
+#: tempo_dialog.cc:133 tempo_dialog.cc:134 tempo_dialog.cc:482
+#: tempo_dialog.cc:483
+msgid "music"
+msgstr ""
+
+#: tempo_dialog.cc:161
 msgid "Beats per minute:"
 msgstr "Battiti al minuto"
 
-#: tempo_dialog.cc:155
+#: tempo_dialog.cc:195
 msgid "Tempo begins at"
 msgstr ""
 
-#: tempo_dialog.cc:251
+#: tempo_dialog.cc:201
+msgid "Lock Style:"
+msgstr ""
+
+#: tempo_dialog.cc:209
+msgid "Tempo Type:"
+msgstr ""
+
+#: tempo_dialog.cc:321
 msgid "incomprehensible pulse note type (%1)"
 msgstr ""
 
-#: tempo_dialog.cc:307
-msgid "Edit Meter"
+#: tempo_dialog.cc:334
+msgid "incomprehensible tempo type (%1)"
+msgstr ""
+
+#: tempo_dialog.cc:347
+msgid "incomprehensible lock style (%1)"
 msgstr ""
 
-#: tempo_dialog.cc:356
+#: tempo_dialog.cc:498
 msgid "Note value:"
 msgstr ""
 
-#: tempo_dialog.cc:357
+#: tempo_dialog.cc:499
+msgid "Lock style:"
+msgstr ""
+
+#: tempo_dialog.cc:500
 msgid "Beats per bar:"
 msgstr "Battiti per battuta:"
 
-#: tempo_dialog.cc:371
+#: tempo_dialog.cc:514
 msgid "Meter begins at bar:"
 msgstr ""
 
-#: tempo_dialog.cc:484
+#: tempo_dialog.cc:638
 msgid "incomprehensible meter note type (%1)"
 msgstr ""
 
-#: theme_manager.cc:65
-msgid "Dark Theme"
-msgstr "Tema scuro"
-
-#: theme_manager.cc:66
-msgid "Light Theme"
-msgstr "Tema luminoso"
-
-#: theme_manager.cc:67
-msgid "Restore Defaults"
-msgstr "Ripristina i valori base"
+#: tempo_dialog.cc:651
+msgid "incomprehensible meter lock style (%1)"
+msgstr ""
 
-#: theme_manager.cc:68
+#: theme_manager.cc:53
 msgid "Draw \"flat\" buttons"
 msgstr ""
 
-#: theme_manager.cc:69
+#: theme_manager.cc:54
 msgid "Blink Rec-Arm buttons"
 msgstr ""
 
-#: theme_manager.cc:70
+#: theme_manager.cc:55
 msgid "Color regions using their track's color"
 msgstr "Colora le regioni utilizzando il colore della traccia di appartenenza"
 
-#: theme_manager.cc:71
+#: theme_manager.cc:56
 msgid "Show waveform clipping"
 msgstr ""
 
-#: theme_manager.cc:73
+#: theme_manager.cc:58
 msgid "Waveforms color gradient depth"
 msgstr ""
 
-#: theme_manager.cc:75
+#: theme_manager.cc:60
 msgid "Timeline item gradient depth"
 msgstr ""
 
-#: theme_manager.cc:76
-msgid "All floating windows are dialogs"
-msgstr ""
-
-#: theme_manager.cc:77
-msgid "Transient windows follow front window."
-msgstr ""
-
-#: theme_manager.cc:78
-msgid "Icon Set"
+#: theme_manager.cc:61
+msgid "All floating windows are dialogs"
 msgstr ""
 
-#: theme_manager.cc:87
-msgid "Object"
-msgstr "oggetto"
-
-#: theme_manager.cc:163
-msgid "Items"
+#: theme_manager.cc:62
+msgid "Transient windows follow front window."
 msgstr ""
 
-#: theme_manager.cc:164
-msgid "Palette"
+#: theme_manager.cc:63
+msgid "Float detached monitor-section window"
 msgstr ""
 
-#: theme_manager.cc:165
-msgid "Transparency"
+#: theme_manager.cc:64
+msgid "Icon Set"
 msgstr ""
 
-#: theme_manager.cc:195
+#: theme_manager.cc:132
 msgid ""
 "Mark all floating windows to be type \"Dialog\" rather than using \"Utility"
 "\" for some.\n"
@@ -12468,92 +14467,95 @@ msgid ""
 "take effect"
 msgstr ""
 
-#: theme_manager.cc:199
+#: theme_manager.cc:136
 msgid ""
 "Make transient windows follow the front window when toggling between the "
 "editor and mixer.\n"
 "This requires a restart of %1 to take effect"
 msgstr ""
 
-#: theme_manager.cc:620
-msgid "Color Palette"
+#: theme_manager.cc:139
+msgid ""
+"When detaching the monitoring section, mark it as \"Utility\" window to stay "
+"in front.\n"
+"This requires a restart of %1 to take effect"
 msgstr ""
 
 #: time_axis_view.cc:148
 msgid "Track/Bus name (double click to edit)"
 msgstr ""
 
-#: time_axis_view_item.cc:345
+#: time_axis_view_item.cc:326
 msgid "new duration %1 frame is out of bounds for %2"
 msgid_plural "new duration of %1 frames is out of bounds for %2"
 msgstr[0] ""
 msgstr[1] ""
 
-#: time_fx_dialog.cc:62
+#: time_fx_dialog.cc:60
 msgid "Quick but Ugly"
 msgstr "Rapido ma inaccurato"
 
-#: time_fx_dialog.cc:63
+#: time_fx_dialog.cc:61
 msgid "Skip Anti-aliasing"
 msgstr "Salta l'Anti-aliasing"
 
-#: time_fx_dialog.cc:64
-msgid "Contents:"
-msgstr "Contenuti:"
+#: time_fx_dialog.cc:62
+msgid "Contents"
+msgstr ""
 
-#: time_fx_dialog.cc:65
+#: time_fx_dialog.cc:63
 msgid "Minimize time distortion"
 msgstr ""
 
-#: time_fx_dialog.cc:66
+#: time_fx_dialog.cc:64
 msgid "Preserve Formants"
 msgstr ""
 
-#: time_fx_dialog.cc:71
+#: time_fx_dialog.cc:81
 msgid "TimeFXDialog"
 msgstr ""
 
-#: time_fx_dialog.cc:74
+#: time_fx_dialog.cc:84
 msgid "Pitch Shift Audio"
 msgstr ""
 
-#: time_fx_dialog.cc:76
+#: time_fx_dialog.cc:86
 msgid "Time Stretch Audio"
 msgstr ""
 
-#: time_fx_dialog.cc:104 transpose_dialog.cc:41
+#: time_fx_dialog.cc:114 transpose_dialog.cc:41
 msgid "Octaves:"
 msgstr "Ottave:"
 
-#: time_fx_dialog.cc:109 transpose_dialog.cc:46
+#: time_fx_dialog.cc:119 transpose_dialog.cc:46
 msgid "Semitones:"
 msgstr "Semitoni:"
 
-#: time_fx_dialog.cc:114
+#: time_fx_dialog.cc:124
 msgid "Cents:"
 msgstr ""
 
-#: time_fx_dialog.cc:122
+#: time_fx_dialog.cc:132
 msgid "Time|Shift"
 msgstr ""
 
-#: time_fx_dialog.cc:146 time_fx_dialog.cc:149
+#: time_fx_dialog.cc:184 time_fx_dialog.cc:188
 msgid "TimeFXButton"
 msgstr ""
 
-#: time_fx_dialog.cc:154
+#: time_fx_dialog.cc:193
 msgid "Stretch/Shrink"
 msgstr ""
 
-#: time_fx_dialog.cc:164
+#: time_fx_dialog.cc:203
 msgid "<b>Progress</b>"
 msgstr ""
 
-#: time_info_box.cc:124
+#: time_info_box.cc:118
 msgid "Start recording at auto-punch start"
 msgstr "Comincia a registrare al'inizio dell'auto-punch"
 
-#: time_info_box.cc:125
+#: time_info_box.cc:119
 msgid "Stop recording at auto-punch end"
 msgstr "Ferma la registrazione alla fine dell'auto-punch"
 
@@ -12621,102 +14623,138 @@ msgstr "Trasponi MIDI"
 msgid "Transpose"
 msgstr "Trasponi"
 
-#: ui_config.cc:163 ui_config.cc:300
+#: ui_config.cc:233 ui_config.cc:416
 msgid "Loading default ui configuration file %1"
 msgstr "Carico il file di configurazione base per %1"
 
-#: ui_config.cc:166 ui_config.cc:303
+#: ui_config.cc:236 ui_config.cc:419
 msgid "cannot read default ui configuration file \"%1\""
 msgstr "impossibile leggere il file di configurazione base \"%1\""
 
-#: ui_config.cc:169 ui_config.cc:308
+#: ui_config.cc:239 ui_config.cc:424
 msgid "default ui configuration file \"%1\" not loaded successfully."
 msgstr ""
 "il file di configurazione base \"%1\" dell'interfaccia\n"
 "utente non è stato caricato."
 
-#: ui_config.cc:177
+#: ui_config.cc:247
 msgid "Could not find default UI configuration file %1"
 msgstr ""
 
-#: ui_config.cc:219
+#: ui_config.cc:330
+msgid "Color file for %1 not found along %2"
+msgstr ""
+
+#: ui_config.cc:337
 msgid "Loading color file %1"
 msgstr ""
 
-#: ui_config.cc:222
+#: ui_config.cc:340
 msgid "cannot read color file \"%1\""
 msgstr ""
 
-#: ui_config.cc:227
+#: ui_config.cc:345
 msgid "color file \"%1\" not loaded successfully."
 msgstr ""
 
-#: ui_config.cc:233
-msgid "Color file %1 not found"
-msgstr ""
-
-#: ui_config.cc:282 ui_config.cc:361
+#: ui_config.cc:397 ui_config.cc:480
 msgid "Color file %1 not saved"
 msgstr ""
 
-#: ui_config.cc:317
+#: ui_config.cc:433
 msgid "Loading user ui configuration file %1"
 msgstr "Carico il file di configurazione dell'interfaccia utente %1"
 
-#: ui_config.cc:320
+#: ui_config.cc:436
 msgid "cannot read ui configuration file \"%1\""
 msgstr ""
 
-#: ui_config.cc:325
+#: ui_config.cc:441
 msgid "user ui configuration file \"%1\" not loaded successfully."
 msgstr ""
 "il file di configurazione \"%1\" dell'interfaccia utente non è stato "
 "caricato."
 
-#: ui_config.cc:333
+#: ui_config.cc:449
 msgid "could not find any ui configuration file, canvas will look broken."
 msgstr ""
 "non sono riuscito a trovare alcun file di configurazione, l'interfacca avrà "
 "dei problemi."
 
-#: ui_config.cc:351
+#: ui_config.cc:470
 msgid "Config file %1 not saved"
 msgstr "Il file di configurazione %1 non è stato salvato."
 
-#: ui_config.cc:592
+#: ui_config.cc:715
 msgid "Color %1 not found"
 msgstr ""
 
-#: ui_config.cc:662
+#: ui_config.cc:785
 msgid "Unable to find UI style file %1 in search path %2. %3 will look strange"
 msgstr ""
 "Impossibilitato a trovare il file dello stile interfaccia utente %1 \n"
 "nel percorso di ricerca %2. %3 sembra anomalo"
 
-#: utils.cc:117 utils.cc:160
+#: utils.cc:118 utils.cc:161
 msgid "bad XPM header %1"
 msgstr ""
 
-#: utils.cc:577
+#: utils.cc:424
 msgid "cannot find XPM file for %1"
 msgstr "non riesco a trovare un file XPM per %1"
 
-#: utils.cc:597 utils.cc:627 utils.cc:641
+#: utils.cc:477 utils.cc:507 utils.cc:527
 msgid "default"
 msgstr ""
 
-#: utils.cc:642
+#: utils.cc:528
 msgid "icon \"%1\" not found for icon set \"%2\", fallback to default"
 msgstr ""
 
-#: utils.cc:649
+#: utils.cc:535
 msgid "cannot find icon image for %1 using %2"
 msgstr ""
 
-#: utils.cc:666 utils.cc:682
+#: utils.cc:552 utils.cc:568
 msgid "Caught exception while loading icon named %1"
 msgstr ""
 
+#: utils.cc:818
+msgid "Overwrite"
+msgstr "Sovrascrivi"
+
+#: vca_master_strip.cc:74 vca_time_axis.cc:49
+msgid "Solo slaves"
+msgstr ""
+
+#: vca_master_strip.cc:79 vca_time_axis.cc:55
+msgid "Mute slaves"
+msgstr ""
+
+#: vca_master_strip.cc:83
+msgid "Hide this VCA strip"
+msgstr ""
+
+#: vca_master_strip.cc:108 vca_master_strip.cc:418
+msgid "Click to show slaves only"
+msgstr ""
+
+#: vca_master_strip.cc:293
+msgid "A"
+msgstr "A"
+
+#: vca_master_strip.cc:300
+msgid "S"
+msgstr "S"
+
+#: vca_master_strip.cc:398
+msgid "Drop All Slaves"
+msgstr ""
+
+#: vca_master_strip.cc:421
+msgid "Click to show normal mixer"
+msgstr ""
+
 #: add_video_dialog.cc:54
 msgid "Set Video Track"
 msgstr ""
@@ -12761,32 +14799,48 @@ msgstr ""
 msgid " %1 fps"
 msgstr ""
 
-#: video_timeline.cc:468
+#: vca_time_axis.cc:60
+msgid "D"
+msgstr "D"
+
+#: vca_time_axis.cc:61
+msgid "Unassign all slaves"
+msgstr ""
+
+#: vca_time_axis.cc:65
+msgid "V"
+msgstr "V"
+
+#: vca_time_axis.cc:66
+msgid "Show only slaves"
+msgstr ""
+
+#: video_timeline.cc:472
 msgid ""
 "Parsing video file info failed. Is the Video Server running? Is the file "
 "readable by the Video Server? Does the docroot match? Is it a video file?"
 msgstr ""
 
-#: video_timeline.cc:506
+#: video_timeline.cc:510
 msgid ""
 "Failed to set session-framerate: '%1' does not have a corresponding option "
 "setting in %2."
 msgstr ""
 
-#: video_timeline.cc:514
+#: video_timeline.cc:518
 msgid ""
 "Video file's framerate is not equal to %1 session timecode's framerate: '%2' "
 "vs '%3'"
 msgstr ""
 
-#: video_timeline.cc:587
+#: video_timeline.cc:591
 msgid ""
 "Video-server docroot mismatch. %1: '%2', video-server: '%3'. This usually "
 "means that the video server was not started by %1 and uses a different "
 "document-root."
 msgstr ""
 
-#: video_timeline.cc:724
+#: video_timeline.cc:728
 msgid ""
 "Video-monitor 'xjadeo' was not found. Please install http://xjadeo.sf.net/ "
 "(a custom path to xjadeo can be specified by setting the XJREMOTE "
@@ -12796,25 +14850,25 @@ msgid ""
 "see also http://manual.ardour.org/video-timeline/setup/"
 msgstr ""
 
-#: video_timeline.cc:739
+#: video_timeline.cc:743
 msgid "Video-monitor 'xjadeo' cannot be launched."
 msgstr ""
 
-#: video_timeline.cc:766
+#: video_timeline.cc:775
 msgid ""
 "Video-monitor 'xjadeo' is too old. Please install xjadeo version 0.7.7 or "
 "later. http://xjadeo.sf.net/"
 msgstr ""
 
-#: video_monitor.cc:285
+#: video_monitor.cc:283
 msgid "Video Monitor: File Not Found."
 msgstr ""
 
 #: transcode_ffmpeg.cc:56
 msgid ""
-"No ffprobe or ffmpeg executables could be found on this system.\n"
-"Video import and export is not possible until you install those tools.\n"
+"ffmpeg installation was not found on this system.\n"
 "%1 requires ffmpeg and ffprobe from ffmpeg.org - version 1.1 or newer.\n"
+"Video import and export is not possible until you install tools.\n"
 "\n"
 "The tools are included with the %1 releases from ardour.org and also "
 "available with the video-server at http://x42.github.com/harvid/\n"
@@ -12836,7 +14890,7 @@ msgstr ""
 msgid "Output File:"
 msgstr ""
 
-#: transcode_video_dialog.cc:61 export_video_dialog.cc:85
+#: transcode_video_dialog.cc:61 export_video_dialog.cc:81
 msgid "Abort"
 msgstr ""
 
@@ -12845,10 +14899,14 @@ msgid "Height = "
 msgstr ""
 
 #: transcode_video_dialog.cc:66
+msgid "Extract LTC from audio and align video"
+msgstr ""
+
+#: transcode_video_dialog.cc:67
 msgid "Manual Override"
 msgstr ""
 
-#: transcode_video_dialog.cc:70 export_video_dialog.cc:103
+#: transcode_video_dialog.cc:71 export_video_dialog.cc:99
 msgid "Debug Mode: Print ffmpeg command and output to stdout."
 msgstr ""
 
@@ -12858,9 +14916,8 @@ msgstr ""
 
 #: transcode_video_dialog.cc:113
 msgid ""
-"No ffprobe or ffmpeg executables could be found on this system. Video Import "
-"is not possible until you install those tools. See the Log window for more "
-"information."
+"ffmpeg installation was not found. Video Import is not possible. See the Log "
+"window for more information."
 msgstr ""
 
 #: transcode_video_dialog.cc:120
@@ -12869,83 +14926,83 @@ msgid ""
 "unsupported video codec or format."
 msgstr ""
 
-#: transcode_video_dialog.cc:134
+#: transcode_video_dialog.cc:137
 msgid "FPS:"
 msgstr ""
 
-#: transcode_video_dialog.cc:136
-msgid "Duration:"
-msgstr ""
-
-#: transcode_video_dialog.cc:138
+#: transcode_video_dialog.cc:141
 msgid "Codec:"
 msgstr ""
 
-#: transcode_video_dialog.cc:140
+#: transcode_video_dialog.cc:143
 msgid "Geometry:"
 msgstr ""
 
-#: transcode_video_dialog.cc:155
+#: transcode_video_dialog.cc:158
 msgid "??"
 msgstr ""
 
-#: transcode_video_dialog.cc:176
+#: transcode_video_dialog.cc:179
 msgid "<b>Import Settings</b>"
 msgstr ""
 
-#: transcode_video_dialog.cc:181
-msgid "Reference From Current Location (Previously Transcoded Files Only)"
+#: transcode_video_dialog.cc:184
+msgid "Reference from Current Location (Previously Transcoded Files Only)"
 msgstr ""
 
-#: transcode_video_dialog.cc:183
+#: transcode_video_dialog.cc:185
 msgid "Import/Transcode Video to Session"
 msgstr ""
 
-#: transcode_video_dialog.cc:191
+#: transcode_video_dialog.cc:188 transcode_video_dialog.cc:198
 msgid "Do Not Import Video (Audio Import Only)"
 msgstr ""
 
-#: transcode_video_dialog.cc:200
+#: transcode_video_dialog.cc:208
+msgid "Do Not Import Video"
+msgstr ""
+
+#: transcode_video_dialog.cc:224
 msgid "Scale Video: Width = "
 msgstr ""
 
-#: transcode_video_dialog.cc:207
+#: transcode_video_dialog.cc:230
 msgid "Original Width"
 msgstr ""
 
-#: transcode_video_dialog.cc:222
+#: transcode_video_dialog.cc:245
 msgid "Bitrate (KBit/s):"
 msgstr ""
 
-#: transcode_video_dialog.cc:227
+#: transcode_video_dialog.cc:250
 msgid "Extract Audio:"
 msgstr ""
 
-#: transcode_video_dialog.cc:232
+#: transcode_video_dialog.cc:255
 msgid "No Audio Track Present"
 msgstr ""
 
-#: transcode_video_dialog.cc:235
+#: transcode_video_dialog.cc:258
 msgid "Do Not Extract Audio"
 msgstr ""
 
-#: transcode_video_dialog.cc:350
+#: transcode_video_dialog.cc:374
 msgid "Extracting Audio.."
 msgstr ""
 
-#: transcode_video_dialog.cc:353
+#: transcode_video_dialog.cc:377
 msgid "Audio Extraction Failed."
 msgstr ""
 
-#: transcode_video_dialog.cc:379
+#: transcode_video_dialog.cc:403
 msgid "Transcoding Video.."
 msgstr ""
 
-#: transcode_video_dialog.cc:413
+#: transcode_video_dialog.cc:437
 msgid "Transcoding Failed."
 msgstr ""
 
-#: transcode_video_dialog.cc:503
+#: transcode_video_dialog.cc:541
 msgid "Save Transcoded Video File"
 msgstr ""
 
@@ -12965,7 +15022,7 @@ msgstr ""
 msgid "Don't show this dialog again. (Reset in Edit->Preferences)."
 msgstr ""
 
-#: video_server_dialog.cc:97
+#: video_server_dialog.cc:94
 msgid ""
 "The external video server 'harvid' can not be found.\n"
 "The tool is included with the %1 releases from ardour.org, alternatively you "
@@ -12975,239 +15032,230 @@ msgid ""
 "see also http://manual.ardour.org/video-timeline/setup/"
 msgstr ""
 
-#: video_server_dialog.cc:129
+#: video_server_dialog.cc:126
 msgid "Listen Address:"
 msgstr ""
 
-#: video_server_dialog.cc:134
+#: video_server_dialog.cc:131
 msgid "Listen Port:"
 msgstr ""
 
-#: video_server_dialog.cc:139
+#: video_server_dialog.cc:136
 msgid "Cache Size:"
 msgstr ""
 
-#: video_server_dialog.cc:145
+#: video_server_dialog.cc:142
 msgid ""
 "%1 relies on an external video server for the videotimeline.\n"
 "The server configured in Edit -> Preferences -> Video is not reachable.\n"
 "Do you want %1 to launch 'harvid' on this machine?"
 msgstr ""
 
-#: video_server_dialog.cc:189
+#: video_server_dialog.cc:186
 msgid "Set Video Server Executable"
 msgstr ""
 
-#: video_server_dialog.cc:209
+#: video_server_dialog.cc:206
 msgid "Server docroot"
 msgstr ""
 
-#: utils_videotl.cc:60
+#: utils_videotl.cc:61
 msgid "Destination is outside Video Server's docroot. "
 msgstr ""
 
-#: utils_videotl.cc:61
+#: utils_videotl.cc:62
 msgid ""
 "The destination file path is outside of the Video Server's docroot. The file "
 "will not be readable by the Video Server. Do you still want to continue?"
 msgstr ""
 
-#: utils_videotl.cc:64
+#: utils_videotl.cc:65
 msgid "Continue"
 msgstr ""
 
-#: utils_videotl.cc:70
+#: utils_videotl.cc:72
 msgid "Confirm Overwrite"
 msgstr ""
 
-#: utils_videotl.cc:71
-msgid "A file with the same name already exists.  Do you want to overwrite it?"
-msgstr ""
-
-#: utils_videotl.cc:81 utils_videotl.cc:97
+#: utils_videotl.cc:82 utils_videotl.cc:98
 msgid "Cannot create video folder \"%1\" (%2)"
 msgstr "Non posso creare la cartella del video \"%1\" (%2)"
 
-#: export_video_dialog.cc:71
+#: export_video_dialog.cc:67
 msgid "Export Video File "
 msgstr "Esporta file video"
 
-#: export_video_dialog.cc:82
+#: export_video_dialog.cc:78
 msgid "Video:"
 msgstr "Video:"
 
-#: export_video_dialog.cc:87
+#: export_video_dialog.cc:83
 msgid "Scale Video (W x H):"
 msgstr "Scala video (W x H):"
 
-#: export_video_dialog.cc:88
+#: export_video_dialog.cc:84
 msgid "Retain Aspect"
 msgstr ""
 
-#: export_video_dialog.cc:93
+#: export_video_dialog.cc:89
 msgid "Set Aspect Ratio:"
 msgstr "Imposta il rapporto di aspetto:"
 
-#: export_video_dialog.cc:94
+#: export_video_dialog.cc:90
 msgid "Normalize Audio"
 msgstr "Normalizza audio"
 
-#: export_video_dialog.cc:95
+#: export_video_dialog.cc:91
 msgid "2 Pass Encoding"
 msgstr "Codifica a 2 passaggi"
 
-#: export_video_dialog.cc:96
+#: export_video_dialog.cc:92
 msgid "Codec Optimizations:"
 msgstr "Ottimizzazione codec:"
 
-#: export_video_dialog.cc:98
+#: export_video_dialog.cc:94
 msgid "Deinterlace"
 msgstr "Deinterlaccia"
 
-#: export_video_dialog.cc:99
+#: export_video_dialog.cc:95
 msgid "Use [2] B-frames (MPEG 2 or 4 only)"
 msgstr ""
 
-#: export_video_dialog.cc:100
+#: export_video_dialog.cc:96
 msgid "Override FPS (Default is to retain FPS from the input video file):"
 msgstr ""
 
-#: export_video_dialog.cc:101
+#: export_video_dialog.cc:97
 msgid "Include Session Metadata"
 msgstr ""
 
-#: export_video_dialog.cc:119
+#: export_video_dialog.cc:115
 msgid ""
-"No ffprobe or ffmpeg executables could be found on this system. Video Export "
-"is not possible until you install those tools. See the Log window for more "
-"information."
+"ffmpeg installation was not found. Video Export is not possible. See the Log "
+"window for more information."
 msgstr ""
 
-#: export_video_dialog.cc:130
+#: export_video_dialog.cc:126
 msgid "<b>Output:</b> (file extension defines format)"
 msgstr "<b>Uscita:</b> (l'estensione del file definisce il formato)"
 
-#: export_video_dialog.cc:140
+#: export_video_dialog.cc:136
 msgid "<b>Input Video:</b>"
 msgstr "<b>Ingresso video:</b>"
 
-#: export_video_dialog.cc:151
+#: export_video_dialog.cc:147
 msgid "Audio:"
 msgstr "Audio:"
 
-#: export_video_dialog.cc:153
+#: export_video_dialog.cc:149
 msgid "Master Bus"
 msgstr "Bus principale"
 
-#: export_video_dialog.cc:158
+#: export_video_dialog.cc:153
 msgid "from the %1 session's start to the session's end"
 msgstr ""
 
-#: export_video_dialog.cc:161
+#: export_video_dialog.cc:156
 msgid "<b>Settings:</b>"
 msgstr "<b>Impostazioni:</b>"
 
-#: export_video_dialog.cc:169
+#: export_video_dialog.cc:164
 msgid "Range:"
 msgstr "Intervallo:"
 
-#: export_video_dialog.cc:172
-msgid "Preset:"
-msgstr "Preimpostazione:"
-
-#: export_video_dialog.cc:175
+#: export_video_dialog.cc:170
 msgid "Video Codec:"
 msgstr "Codec video:"
 
-#: export_video_dialog.cc:178
+#: export_video_dialog.cc:173
 msgid "Video KBit/s:"
 msgstr "Video KBit/s:"
 
-#: export_video_dialog.cc:181
+#: export_video_dialog.cc:176
 msgid "Audio Codec:"
 msgstr "Codec audio:"
 
-#: export_video_dialog.cc:184
+#: export_video_dialog.cc:179
 msgid "Audio KBit/s:"
 msgstr "KBit/s audio:"
 
-#: export_video_dialog.cc:187
+#: export_video_dialog.cc:182
 msgid "Audio Samplerate:"
 msgstr "Frequenza campionameto audio:"
 
-#: export_video_dialog.cc:222 export_video_dialog.cc:231
-#: export_video_dialog.cc:830 export_video_dialog.cc:833
+#: export_video_dialog.cc:215 export_video_dialog.cc:223
+#: export_video_dialog.cc:814 export_video_dialog.cc:817
 msgid "(default for format)"
 msgstr ""
 
-#: export_video_dialog.cc:242 export_video_dialog.cc:255
-#: export_video_dialog.cc:837 export_video_dialog.cc:846
+#: export_video_dialog.cc:233 export_video_dialog.cc:244
+#: export_video_dialog.cc:821 export_video_dialog.cc:830
 msgid "(default)"
 msgstr ""
 
-#: export_video_dialog.cc:256 export_video_dialog.cc:840
+#: export_video_dialog.cc:245 export_video_dialog.cc:824
 msgid "(retain)"
 msgstr ""
 
-#: export_video_dialog.cc:348
+#: export_video_dialog.cc:335
 msgid "from 00:00:00:00 to the video's end"
 msgstr ""
 
-#: export_video_dialog.cc:350
+#: export_video_dialog.cc:337
 msgid "from the video's start to the video's end"
 msgstr ""
 
-#: export_video_dialog.cc:353
+#: export_video_dialog.cc:340
 msgid "Selected range"
 msgstr "Seleziona intervallo"
 
-#: export_video_dialog.cc:589
+#: export_video_dialog.cc:561
 msgid "Normalizing audio"
 msgstr ""
 
-#: export_video_dialog.cc:593
+#: export_video_dialog.cc:566 export_video_dialog.cc:571
 msgid "Exporting audio"
 msgstr "Esportazione audio"
 
-#: export_video_dialog.cc:648
+#: export_video_dialog.cc:632
 msgid "Exporting Audio..."
 msgstr "Esportazione audio..."
 
-#: export_video_dialog.cc:705
+#: export_video_dialog.cc:689
 msgid ""
 "Export Video: Cannot query duration of video-file, using duration from "
 "timeline instead."
 msgstr ""
 
-#: export_video_dialog.cc:735
+#: export_video_dialog.cc:719
 msgid "Export Video: export-range does not include video."
 msgstr ""
 
-#: export_video_dialog.cc:748
+#: export_video_dialog.cc:732
 msgid "Export Video: No Master Out Ports to Connect for Audio Export"
 msgstr ""
 
-#: export_video_dialog.cc:790
+#: export_video_dialog.cc:774
 msgid "Encoding Video..."
 msgstr "Codifica video..."
 
-#: export_video_dialog.cc:810
+#: export_video_dialog.cc:794
 msgid "Export Video: Video input file cannot be read."
 msgstr "Esporta video: non riesco a leggere il file video in ingresso."
 
-#: export_video_dialog.cc:916
+#: export_video_dialog.cc:900
 msgid "Encoding Video.. Pass 1/2"
 msgstr "Codifica video... passaggio 1/2"
 
-#: export_video_dialog.cc:928
+#: export_video_dialog.cc:912
 msgid "Encoding Video.. Pass 2/2"
 msgstr "Codifica video... passaggio 2/2"
 
-#: export_video_dialog.cc:1031
+#: export_video_dialog.cc:1015
 msgid "Transcoding failed."
 msgstr "Transcodifica fallita."
 
-#: export_video_dialog.cc:1267 export_video_dialog.cc:1287
+#: export_video_dialog.cc:1251 export_video_dialog.cc:1271
 msgid "Save Exported Video File"
 msgstr ""
 
@@ -13225,13 +15273,482 @@ msgstr ""
 
 #: export_video_infobox.cc:51
 msgid ""
+"%1 does not include commercial licenses for encoding audio/video. Visit "
+"mpegla.com for information about licensing various audio/video codecs.\n"
+"\n"
 "Video encoding is a non-trivial task with many details.\n"
 "\n"
-"Please see the manual at %1/video-timeline/operations/#export.\n"
+"Please see the manual at %2/video-timeline/operations/#export.\n"
 "\n"
 "Open Manual in Browser? "
 msgstr ""
 
+#~ msgid ""
+#~ "%1%2\n"
+#~ "(built from revision %3)"
+#~ msgstr ""
+#~ "%1%2\n"
+#~ "(compilato dalla revisione %3)"
+
+#~ msgid "Busses"
+#~ msgstr "Busses"
+
+#~ msgid "Display model"
+#~ msgstr "Modello di visualizzazione"
+
+#~ msgid "Composite graphs for each track"
+#~ msgstr "Grafico composito per ogni traccia"
+
+#~ msgid "Composite graph of all tracks"
+#~ msgstr "Grafico composito per tutte le tracce"
+
+#~ msgid "Normalize values"
+#~ msgstr "Normalizza i valori"
+
+#~ msgid "Locations"
+#~ msgstr "Posizioni"
+
+#~ msgid "Save as..."
+#~ msgstr "Salva come..."
+
+#~ msgid ""
+#~ "A snapshot already exists with that name.  Do you want to overwrite it?"
+#~ msgstr "Esiste già un'istantanea con questo nome. Vuoi sovrascriverla?"
+
+#~ msgid "Could not disconnect from Audio/MIDI engine"
+#~ msgstr "Impossibile disconnettersi dal motore Audio/MIDI"
+
+#~ msgid "Could not reconnect to the Audio/MIDI engine"
+#~ msgstr "Impossibile riconnettersi al motore Audio/MIDI"
+
+#~ msgid ""
+#~ "%4This is a session from an older version of %3%5\n"
+#~ "\n"
+#~ "%3 has copied the old session file\n"
+#~ "\n"
+#~ "%6%1%7\n"
+#~ "\n"
+#~ "to\n"
+#~ "\n"
+#~ "%6%2%7\n"
+#~ "\n"
+#~ "From now on, use the -2000 version with older versions of %3"
+#~ msgstr ""
+#~ "%4 Questa è una sessione di una versione precedente di %3%5\n"
+#~ "\n"
+#~ "%3 ha copiato il vecchio file di sessione\n"
+#~ "\n"
+#~ "%6%1%7 \n"
+#~ "\n"
+#~ "su\n"
+#~ "\n"
+#~ "%6%2%7\n"
+#~ "\n"
+#~ "Da questo momento in poi utilizza la versione -2000 con vecchie versioni "
+#~ "di %3"
+
+#~ msgid "Playhead follows Range Selections and Edits"
+#~ msgstr "La testina segue le selezioni di intervalli e gli edit"
+
+#~ msgid ""
+#~ "When active, auditioning is taking place\n"
+#~ "Click to stop the audition"
+#~ msgstr ""
+#~ "Quando è attivo, qualcosa è in ascolto\n"
+#~ "Clicca per ripristinare."
+
+#~ msgid "This screen is not tall enough to display the mixer window"
+#~ msgstr ""
+#~ "Questo schermo non è sufficentemente alto per mostrare la finestra del "
+#~ "mixer"
+
+#~ msgid "Open Video"
+#~ msgstr "Apri video"
+
+#~ msgid "Export To Video File"
+#~ msgstr "Esporta in un file video"
+
+#~ msgid "Snapshot..."
+#~ msgstr "Istantanea..."
+
+#~ msgid "Export To Audio File(s)..."
+#~ msgstr "Esporta la sessione come file audio..."
+
+#~ msgid "Show Toolbars"
+#~ msgstr "Mostra le barre degli strumenti"
+
+#~ msgid "Toggle Editor+Mixer"
+#~ msgstr "Attiva/disattiva Editor+Mixer"
+
+#~ msgid "Reattach All Tearoffs"
+#~ msgstr "Ricongiungi tutti gli strappi"
+
+#~ msgid "Reference"
+#~ msgstr "Riferimenti"
+
+#~ msgid "Report A Bug"
+#~ msgstr "Segnala un bug"
+
+#~ msgid "How to report a bug"
+#~ msgstr "Come segnalare un bug"
+
+#~ msgid "Set From Playhead"
+#~ msgstr "Imposta dalla testina"
+
+#~ msgid "Set to %1 beat(s)"
+#~ msgstr "Imposta a %1 battito/i"
+
+#~ msgid "Fill Range with Region"
+#~ msgstr "Riempi intervallo con la regione"
+
+#~ msgid "Consolidate Range With Processing"
+#~ msgstr "Consolida l'intervallo processando i dati"
+
+#~ msgid "Bounce Range to Region List With Processing"
+#~ msgstr "Fissa l'intervallo nella lista regioni elaborandolo"
+
+#~ msgid "Play From Edit Point"
+#~ msgstr "Suona dal punto di modifica"
+
+#~ msgid "Play From Start"
+#~ msgstr "Riproduci dall'inizio"
+
+#~ msgid "Smart Mode (add Range functions to Grab mode)"
+#~ msgstr ""
+#~ "Modalità intelligente (aggiunge le funzioni di intervallo alla modalità "
+#~ "di aggancio)"
+
+#~ msgid "Internal Edit Mode (edit notes and gain curves inside regions)"
+#~ msgstr ""
+#~ "Modalità di modifica interna (modifica le note e le curve di guadagno "
+#~ "all'interno delle regioni)"
+
+#~ msgid "Zoom focus"
+#~ msgstr "Zoom"
+
+#~ msgid "Break drag or deselect all"
+#~ msgstr "Interrompi il trascinamento o deseleziona tutto"
+
+#~ msgid "Playhead To Next Grid"
+#~ msgstr "Testina alla prossima griglia"
+
+#~ msgid "Playhead To Previous Grid"
+#~ msgstr "Testina alla griglia precedente"
+
+#~ msgid "Import From Session"
+#~ msgstr "Importa da una sessione"
+
+#~ msgid "Show Logo"
+#~ msgstr "Mostra il logo"
+
+#~ msgid "Snap Position To Grid"
+#~ msgstr "Allinea la posizione alla griglia"
+
+#~ msgid "Insert Region From Region List"
+#~ msgstr "Inserisci regione dal catalogo delle regioni"
+
+#~ msgid "group|G"
+#~ msgstr "gruppo|G"
+
+#~ msgid "relative|Rel"
+#~ msgstr "relativo|Rel"
+
+#~ msgid "mute|M"
+#~ msgstr "muto|M"
+
+#~ msgid "solo|S"
+#~ msgstr "solo|S"
+
+#~ msgid "monitoring|Mon"
+#~ msgstr "monitoraggio|Mon"
+
+#~ msgid "selection|Sel"
+#~ msgstr "selezione|Sel"
+
+#~ msgid "active|A"
+#~ msgstr "attivo|A"
+
+#~ msgid "File Exists!"
+#~ msgstr "Il file esiste!"
+
+#~ msgid "Overwrite Existing File"
+#~ msgstr "Sovrascrivo file esistente"
+
+#~ msgid "duplicate selection"
+#~ msgstr "duplica selezione"
+
+#~ msgid "tracks"
+#~ msgstr "Tracce"
+
+#~ msgid "busses"
+#~ msgstr "Bus"
+
+#~ msgid "L"
+#~ msgstr "L"
+
+#~ msgid "G"
+#~ msgstr "G"
+
+#~ msgid "O"
+#~ msgstr "O"
+
+#~ msgid "I"
+#~ msgstr "I"
+
+#~ msgid "R"
+#~ msgstr "R"
+
+#~ msgid "SI"
+#~ msgstr "SI"
+
+#~ msgid "Show Tracks With Regions Under Playhead"
+#~ msgstr "Mostra le tracce che hanno regioni sotto la testina"
+
+#~ msgid ""
+#~ "The %1 audio backend was configured and started externally.\n"
+#~ "This limits your control over it."
+#~ msgstr ""
+#~ "Il finale audio di %1 è stato configurato ed avviato dall'esterno.\n"
+#~ "Questo limita il tuo controllo su di esso."
+
+#~ msgid "Inactive"
+#~ msgstr "Inattivo"
+
+#~ msgid "Export region contents"
+#~ msgstr "Esporta i contenuti della regione"
+
+#~ msgid "Export track output"
+#~ msgstr "Esporta la traccia"
+
+#~ msgid "<i>Build filename(s) from these components:</i>"
+#~ msgstr "<i>Preparo il/i nome/i a partire da queste componenti:</i>"
+
+#~ msgid "<small><i>Current (approximate) filename: \"%1\"</i></small>"
+#~ msgstr "<small><i>Nome file (approssimativo): \"%1\"</i></small>"
+
+#~ msgid ""
+#~ "Command to run post-export\n"
+#~ "(%f=full path & filename, %d=directory, %b=basename):"
+#~ msgstr ""
+#~ "Comando per lanciare la post esportazione\n"
+#~ "(%f=percorso completo & nome del file, %d=directory, %b=nome senza "
+#~ "estensione):"
+
+#~ msgid "Create New Group From"
+#~ msgstr "Crea nuovo gruppo da"
+
+#~ msgid "Insert time on all the track's playlists"
+#~ msgstr "Inserisci il tempo su tutte le tracce della scaletta"
+
+#~ msgid "Select an action, then press the key(s) to (re)set its shortcut"
+#~ msgstr ""
+#~ "Selezion un'azione, poi premi il tasto(i) per ripristinare o impostare la "
+#~ "relativa scorciatoia"
+
+#~ msgid "Main_menu"
+#~ msgstr "Menù_principale"
+
+#~ msgid "Copyright (C) 1999-2012 Paul Davis"
+#~ msgstr "Tutti i diritti (C) 1999-2012 Paul Davis"
+
+#~ msgid "Program "
+#~ msgstr "Programma"
+
+#~ msgid "*Comments*"
+#~ msgstr "*Commenti*"
+
+#~ msgid "*Cmt*"
+#~ msgstr "*Cmt*"
+
+#~ msgid "Click to Add/Edit Comments"
+#~ msgstr "Clicca per aggiungere/modificare commenti"
+
+#~ msgid "Remote Control ID..."
+#~ msgstr "ID del controllo remoto..."
+
+#~ msgid "Pr"
+#~ msgstr "Pr"
+
+#~ msgid "Po"
+#~ msgstr "Po"
+
+#~ msgid "C"
+#~ msgstr "C"
+
+#~ msgid "K20"
+#~ msgstr "K20"
+
+#~ msgid "K14"
+#~ msgstr "K14"
+
+#~ msgid "K12"
+#~ msgstr "K12"
+
+#~ msgid "Update available plugins"
+#~ msgstr "Aggiorna i plugin disponibili"
+
+#~ msgid "alsa_pcm"
+#~ msgstr "alsa_pcm"
+
+#~ msgid ""
+#~ "It is not possible to add a port here, as the first processor in the "
+#~ "track or buss cannot support the new configuration."
+#~ msgstr ""
+#~ "Non è possibile aggiungere una porta qui perché il primo processore nella "
+#~ "traccia o bus non supporta la nuova configurazione."
+
+#~ msgid ""
+#~ "This port cannot be removed.\n"
+#~ "Either the first plugin in the track or buss cannot accept\n"
+#~ "the new number of inputs or the last plugin has more outputs."
+#~ msgstr ""
+#~ "Questa porta non può essere rimossa.\n"
+#~ "O il primo plugin nella traccia o bus non può accettare \n"
+#~ "i nuovi ingressi o l'ultimo plugin ha più uscite."
+
+#~ msgid ""
+#~ "<b>%1</b>\n"
+#~ "Double-click to show GUI.\n"
+#~ "Alt+double-click to show generic GUI.%2"
+#~ msgstr ""
+#~ "<b>%1</b>\n"
+#~ "Doppio click per mostrare la GUI.\n"
+#~ "Alt+doppio-clic per mostrare la GUI generica.%2"
+
+#~ msgid "Keyboard layout:"
+#~ msgstr "Disposizione della tastiera:"
+
+#~ msgid "Font scaling:"
+#~ msgstr "Scala del carattere"
+
+#~ msgid ""
+#~ "Major font-scale changes require an application restart to re-layout."
+#~ msgstr ""
+#~ "I cambiamenti principali nell scala del fonto richiedono il riavvio "
+#~ "dell'applicazione."
+
+#~ msgid "Double-click on a name to edit settings for an enabled protocol"
+#~ msgstr ""
+#~ "Doppio click su un nome per modificare le impostazioni di un protocollo "
+#~ "abilitato"
+
+#~ msgid "Clear VST Cache"
+#~ msgstr "Pulisci la cache VST"
+
+#~ msgid "Clear VST Blacklist"
+#~ msgstr "Pulisci la lista nera VST"
+
+#~ msgid "Clear AU Cache"
+#~ msgstr "Pulisci la cache AU"
+
+#~ msgid "Clear AU Blacklist"
+#~ msgstr "Pulisci la lista nera AU"
+
+#~ msgid "Show zoom toolbar"
+#~ msgstr "Mostra la barra dello zoom"
+
+#~ msgid "Solo / mute"
+#~ msgstr "Solo / mute"
+
+#~ msgid "Control surface remote ID"
+#~ msgstr "ID della piattaforma di controllo"
+
+#~ msgid "assigned by user"
+#~ msgstr "assegnato dall'utente"
+
+#~ msgid "follows order of mixer"
+#~ msgstr "segue l'ordine del mixer"
+
+#~ msgid "moderate [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"
+#~ msgstr "moderato [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"
+
+#~ msgid "medium [20dB/sec]"
+#~ msgstr "medio [20dB/sec]"
+
+#~ msgid "fast [32dB/sec]"
+#~ msgstr "veloce [32dB/sec]"
+
+#~ msgid "faster [46dB/sec]"
+#~ msgstr "più veloce [46dB/sec]"
+
+#~ msgid "fastest [70dB/sec]"
+#~ msgstr "massima velocità [70dB/sec]"
+
+#~ msgid "You cannot create a track with that name as it is reserved for %1"
+#~ msgstr ""
+#~ "Non si può creare una traccia con questo nome perché è riservato per %1"
+
+#~ msgid "Select From All..."
+#~ msgstr "Seleziona tutto da..."
+
+#~ msgid ""
+#~ "Do you really want to remove track \"%1\" ?\n"
+#~ "\n"
+#~ "You may also lose the playlist used by this track.\n"
+#~ "\n"
+#~ "(This action cannot be undone, and the session file will be overwritten)"
+#~ msgstr ""
+#~ "Si vuole veramente rimuovere la traccia \"%1\" ?\n"
+#~ "\n"
+#~ "Perderete anche la playlist associata a questa traccia.\n"
+#~ "\n"
+#~ "(questa azione non potrà essere annullata ed il file di sessione verrà "
+#~ "sovrascritto)"
+
+#~ msgid ""
+#~ "Do you really want to remove bus \"%1\" ?\n"
+#~ "\n"
+#~ "(This action cannot be undone, and the session file will be overwritten)"
+#~ msgstr ""
+#~ "Si vuole veramente rimuovere il bus \"%1\" ?\n"
+#~ "\n"
+#~ "(questa azione non potrà essere annullata ed il file di sessione verrà "
+#~ "sovrascritto)"
+
+#~ msgid "Remove track"
+#~ msgstr "Rimuovi traccia"
+
+#~ msgid "Remove bus"
+#~ msgstr "Rimuovi bus"
+
+#~ msgid "Remote Control ID"
+#~ msgstr "ID del controllo remoto"
+
+#~ msgid "Remote control ID:"
+#~ msgstr "ID del controllo remoto:"
+
+#~ msgid ""
+#~ "The remote control ID of %1 is: %2\n"
+#~ "\n"
+#~ "\n"
+#~ "The remote control ID of %3 cannot be changed."
+#~ msgstr ""
+#~ "L'ID del controllo remoto di %1 è: %2\n"
+#~ "\n"
+#~ "\n"
+#~ "L'ID del controllo remoto di %3 non può essere modificato."
+
+#~ msgid "Disk Format"
+#~ msgstr "Formato disco"
+
+#~ msgid "32 bit float"
+#~ msgstr "32 bit float"
+
+#~ msgid "24 bit"
+#~ msgstr "24 bit"
+
+#~ msgid "16 bit"
+#~ msgstr "16 bit"
+
+#~ msgid "Dark Theme"
+#~ msgstr "Tema scuro"
+
+#~ msgid "Light Theme"
+#~ msgstr "Tema luminoso"
+
+#~ msgid "Contents:"
+#~ msgstr "Contenuti:"
+
 #~ msgid "Editor Selection"
 #~ msgstr "Selezione editor"
 
diff --git a/gtk2_ardour/po/nn.mo b/gtk2_ardour/po/nn.mo
new file mode 100644
index 0000000..65a0831
Binary files /dev/null and b/gtk2_ardour/po/nn.mo differ
diff --git a/gtk2_ardour/po/nn.po b/gtk2_ardour/po/nn.po
index 52ae6eb..72b4856 100644
--- a/gtk2_ardour/po/nn.po
+++ b/gtk2_ardour/po/nn.po
@@ -7,11 +7,11 @@ msgid ""
 msgstr ""
 "Project-Id-Version: gtk2_ardour 3.0\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-03-31 20:13-0400\n"
+"POT-Creation-Date: 2016-07-14 06:20-0400\n"
 "PO-Revision-Date: 2013-01-05 14:48+0100\n"
 "Last-Translator: Eivind Ødegård <meinmycell-lists at yahoo.no>\n"
 "Language-Team:  <i18n-nn at lister.ping.uio.no>\n"
-"Language: \n"
+"Language: Norwegian Nynorsk\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
@@ -19,255 +19,287 @@ msgstr ""
 "X-Poedit-Country: NORWAY\n"
 "Plural-Forms: nplurals=2; plural=(n != 1)\n"
 
-#: about.cc:125
+#: about.cc:127
+msgid "Fons Adriaensen"
+msgstr ""
+
+#: about.cc:128
 msgid "Brian Ahr"
 msgstr "Brian Ahr"
 
-#: about.cc:126
+#: about.cc:129
 msgid "John Anderson"
 msgstr "John Anderson"
 
-#: about.cc:127
+#: about.cc:130
 msgid "Marcus Andersson"
 msgstr "Marcus Andersson"
 
-#: about.cc:128
+#: about.cc:131
 msgid "Nedko Arnaudov"
 msgstr "Nedko Arnaudov"
 
-#: about.cc:129
+#: about.cc:132
 msgid "Hans Baier"
 msgstr "Hans Baier"
 
-#: about.cc:130
+#: about.cc:133
 msgid "Ben Bell"
 msgstr "Ben Bell"
 
-#: about.cc:131
+#: about.cc:134
 msgid "Sakari Bergen"
 msgstr "Sakari Bergen"
 
-#: about.cc:132
+#: about.cc:135
 msgid "Christian Borss"
 msgstr ""
 
-#: about.cc:133
+#: about.cc:136
 msgid "Chris Cannam"
 msgstr "Chris Cannam"
 
-#: about.cc:134
+#: about.cc:137
 msgid "Jeremy Carter"
 msgstr ""
 
-#: about.cc:135
+#: about.cc:138
 msgid "Jesse Chappell"
 msgstr "Jesse Chappell"
 
-#: about.cc:136
+#: about.cc:139
 msgid "Thomas Charbonnel"
 msgstr "Thomas Charbonnel"
 
-#: about.cc:137
+#: about.cc:140
 msgid "Sam Chessman"
 msgstr "Sam Chessman"
 
-#: about.cc:138
+#: about.cc:141
 msgid "André Colomb"
 msgstr "André Colomb"
 
-#: about.cc:139
+#: about.cc:142
 msgid "Paul Davis"
 msgstr "Paul Davis"
 
-#: about.cc:140
+#: about.cc:143
 msgid "Gerard van Dongen"
 msgstr "Gerard van Dongen"
 
-#: about.cc:141
+#: about.cc:144
 msgid "John Emmas"
 msgstr ""
 
-#: about.cc:142
+#: about.cc:145
 msgid "Colin Fletcher"
 msgstr "Colin Fletcher"
 
-#: about.cc:143
+#: about.cc:146
 msgid "Dave Flick"
 msgstr "Dave Flick"
 
-#: about.cc:144
+#: about.cc:147
 msgid "Hans Fugal"
 msgstr "Hans Fugal"
 
-#: about.cc:145
+#: about.cc:148
 msgid "Robin Gareus"
 msgstr "Robin Gareus"
 
-#: about.cc:146
+#: about.cc:149
+msgid "Nil Geisweiller"
+msgstr ""
+
+#: about.cc:150
 msgid "Christopher George"
 msgstr "Christopher George"
 
-#: about.cc:147
+#: about.cc:151
 msgid "Chris Goddard"
 msgstr "Chris Goddard"
 
-#: about.cc:148
+#: about.cc:152
 msgid "J. Abelardo Gutierrez"
 msgstr "J. Abelardo Gutierrez"
 
-#: about.cc:149
+#: about.cc:153
 msgid "Jeremy Hall"
 msgstr "Jeremy Hall"
 
-#: about.cc:150
+#: about.cc:154
 msgid "Audun Halland"
 msgstr "Audun Halland"
 
-#: about.cc:151
+#: about.cc:155
 msgid "David Halter"
 msgstr "David Halter"
 
-#: about.cc:152
+#: about.cc:156
 msgid "Steve Harris"
 msgstr "Steve Harris"
 
-#: about.cc:153
+#: about.cc:157
 msgid "Melvin Ray Herr"
 msgstr "Melvin Ray Herr"
 
-#: about.cc:154
+#: about.cc:158
 msgid "Carl Hetherington"
 msgstr "Carl Hetherington"
 
-#: about.cc:155
+#: about.cc:159
 msgid "Rob Holland"
 msgstr "Rob Holland"
 
-#: about.cc:156
+#: about.cc:160
 msgid "Robert Jordens"
 msgstr "Robert Jordens"
 
-#: about.cc:157
+#: about.cc:161
 msgid "Stefan Kersten"
 msgstr "Stefan Kersten"
 
-#: about.cc:158
+#: about.cc:162
 msgid "Armand Klenk"
 msgstr "Armand Klenk"
 
-#: about.cc:159
+#: about.cc:163
 msgid "Julien de Kozak"
 msgstr ""
 
-#: about.cc:160
+#: about.cc:164
 msgid "Matt Krai"
 msgstr "Matt Krai"
 
-#: about.cc:161
+#: about.cc:165
 msgid "Georg Krause"
 msgstr ""
 
-#: about.cc:162
+#: about.cc:166
 msgid "Nick Lanham"
 msgstr "Nick Lanham"
 
-#: about.cc:163
+#: about.cc:167
 msgid "Colin Law"
 msgstr "Colin Law"
 
-#: about.cc:164
+#: about.cc:168
 msgid "Joshua Leach"
 msgstr "Joshua Leach"
 
-#: about.cc:165
+#: about.cc:169
 msgid "Ben Loftis"
 msgstr "Ben Loftis"
 
-#: about.cc:166
+#: about.cc:170
 msgid "Nick Mainsbridge"
 msgstr "Nick Mainsbridge"
 
-#: about.cc:167
+#: about.cc:171
 msgid "Tim Mayberry"
 msgstr "Tim Mayberry"
 
-#: about.cc:168
+#: about.cc:172
 msgid "Doug Mclain"
 msgstr "Doug Mclain"
 
-#: about.cc:169
+#: about.cc:173
 msgid "Todd Naugle"
 msgstr ""
 
-#: about.cc:170
+#: about.cc:174
+msgid "André Nusser"
+msgstr ""
+
+#: about.cc:175
+msgid "Bent Bisballe Nyeng"
+msgstr ""
+
+#: about.cc:176
 msgid "Jack O'Quin"
 msgstr "Jack O'Quin"
 
-#: about.cc:171
+#: about.cc:177
+msgid "Pavel Potocek"
+msgstr ""
+
+#: about.cc:178
 msgid "Nimal Ratnayake"
 msgstr "Nimal Ratnayake"
 
-#: about.cc:172
+#: about.cc:179
+msgid "Julien Rivaud"
+msgstr ""
+
+#: about.cc:180
 msgid "David Robillard"
 msgstr "David Robillard"
 
-#: about.cc:173
+#: about.cc:181
+msgid "Julien Roger"
+msgstr ""
+
+#: about.cc:182
 msgid "Taybin Rutkin"
 msgstr "Taybin Rutkin"
 
-#: about.cc:174
+#: about.cc:183
 msgid "Andreas Ruge"
 msgstr "Andreas Ruge"
 
-#: about.cc:175
+#: about.cc:184
 msgid "Sampo Savolainen"
 msgstr "Sampo Savolainen"
 
-#: about.cc:176
+#: about.cc:185
 msgid "Rodrigo Severo"
 msgstr "Rodrigo Severo"
 
-#: about.cc:177
+#: about.cc:186
 msgid "Per Sigmond"
 msgstr "Per Sigmond"
 
-#: about.cc:178
+#: about.cc:187
 msgid "Lincoln Spiteri"
 msgstr "Lincoln Spiteri"
 
-#: about.cc:179
+#: about.cc:188
 msgid "Mike Start"
 msgstr "Mike Start"
 
-#: about.cc:180
+#: about.cc:189
 msgid "Mark Stewart"
 msgstr "Mark Stewart"
 
-#: about.cc:181
+#: about.cc:190
 msgid "Roland Stigge"
 msgstr "Roland Stigge"
 
-#: about.cc:182
+#: about.cc:191
 msgid "Petter Sundlöf"
 msgstr "Petter Sundlöf"
 
-#: about.cc:183
+#: about.cc:192
 msgid "Mike Täht"
 msgstr "Mike Täht"
 
-#: about.cc:184
+#: about.cc:193
 msgid "Roy Vegard"
 msgstr "Roy Vegard"
 
-#: about.cc:185
+#: about.cc:194
 msgid "Thorsten Wilms"
 msgstr "Thorsten Wilms"
 
-#: about.cc:186
+#: about.cc:195
+msgid "Damien Zammit"
+msgstr ""
+
+#: about.cc:196
 msgid "Grygorii Zharun"
 msgstr ""
 
-#: about.cc:191
+#: about.cc:201
 msgid ""
 "French:\n"
 "\tAlain Fréhel <alain.frehel at free.fr>\n"
@@ -281,7 +313,7 @@ msgstr ""
 "\tMartin Blanchard\n"
 "\tRomain Arnaud <roming22 at gmail.com>\n"
 
-#: about.cc:192
+#: about.cc:202
 msgid ""
 "German:\n"
 "\tKarsten Petersen <kapet at kapet.de>\n"
@@ -293,7 +325,7 @@ msgid ""
 "\tRobin Gloster <robin at loc-com.de>\n"
 msgstr ""
 
-#: about.cc:199
+#: about.cc:209
 msgid ""
 "Italian:\n"
 "\tFilippo Pappalardo <filippo at email.it>\n"
@@ -303,7 +335,7 @@ msgstr ""
 "\tFilippo Pappalardo <filippo at email.it>\n"
 "\tRaffaele Morelli <raffaele.morelli at gmail.com>\n"
 
-#: about.cc:200
+#: about.cc:210
 msgid ""
 "Portuguese:\n"
 "\tRui Nuno Capela <rncbc at rncbc.org>\n"
@@ -311,7 +343,7 @@ msgstr ""
 "Portugisisk:\n"
 "\tRui Nuno Capela <rncbc at rncbc.org>\n"
 
-#: about.cc:201
+#: about.cc:211
 msgid ""
 "Brazilian Portuguese:\n"
 "\tAlexander da Franca Fernandes <alexander at nautae.eti.br>\n"
@@ -321,7 +353,7 @@ msgstr ""
 "\tAlexander da Franca Fernandes <alexander at nautae.eti.br>\n"
 "\tChris Ross <chris at tebibyte.org>\n"
 
-#: about.cc:203
+#: about.cc:213
 msgid ""
 "Spanish:\n"
 "\t Alex Krohn <alexkrohn at fastmail.fm>\n"
@@ -331,7 +363,7 @@ msgstr ""
 "\t Alex Krohn <alexkrohn at fastmail.fm>\n"
 "\tPablo Fernández <pablo.fbus at gmail.com>\n"
 
-#: about.cc:204
+#: about.cc:214
 msgid ""
 "Russian:\n"
 "\t Igor Blinov <pitstop at nm.ru>\n"
@@ -341,7 +373,7 @@ msgstr ""
 "\t Igor Blinov <pitstop at nm.ru>\n"
 "\tAlexandre Prokoudine <alexandre.prokoudine at gmail.com>\n"
 
-#: about.cc:206
+#: about.cc:216
 msgid ""
 "Greek:\n"
 "\t Klearchos Gourgourinis <muadib at in.gr>\n"
@@ -349,7 +381,7 @@ msgstr ""
 "Gresk:\n"
 "\t Klearchos Gourgourinis <muadib at in.gr>\n"
 
-#: about.cc:207
+#: about.cc:217
 msgid ""
 "Swedish:\n"
 "\t Petter Sundlöf <petter.sundlof at gmail.com>\n"
@@ -357,7 +389,7 @@ msgstr ""
 "Svensk:\n"
 "\t Petter Sundlöf <petter.sundlof at gmail.com>\n"
 
-#: about.cc:208
+#: about.cc:218
 msgid ""
 "Polish:\n"
 "\t Piotr Zaryk <pzaryk at gmail.com>\n"
@@ -365,7 +397,7 @@ msgstr ""
 "Polsk:\n"
 "\t Piotr Zaryk <pzaryk at gmail.com>\n"
 
-#: about.cc:209
+#: about.cc:219
 msgid ""
 "Czech:\n"
 "\t Pavel Fric <pavelfric at seznam.cz>\n"
@@ -373,7 +405,7 @@ msgstr ""
 "Tsjekkisk:\n"
 "\t Pavel Frich <pavelfric at seznam.cz>\n"
 
-#: about.cc:210
+#: about.cc:220
 msgid ""
 "Norwegian:\n"
 "\t Eivind Ødegård\n"
@@ -381,7 +413,7 @@ msgstr ""
 "Norsk:\n"
 "\t Eivind Ødegård <post at frilyd.tk>\n"
 
-#: about.cc:211
+#: about.cc:221
 msgid ""
 "Chinese:\n"
 "\t Rui-huai Zhang <zrhzrh at mail.ustc.edu.cn>\n"
@@ -389,140 +421,194 @@ msgstr ""
 "Kinesisk:\n"
 "\t Rui-huai Zhang <zrhzrh at mail.ustc.edu.cn>\n"
 
-#: about.cc:591
+#: about.cc:601
+msgid "Intel 64-bit"
+msgstr ""
+
+#: about.cc:603
+msgid "Intel 32-bit"
+msgstr ""
+
+#: about.cc:605
+msgid "PowerPC 64-bit"
+msgstr ""
+
+#: about.cc:607
+msgid "PowerPC 32-bit"
+msgstr ""
+
+#: about.cc:609
+msgid "64-bit"
+msgstr ""
+
+#: about.cc:611
+msgid "32-bit"
+msgstr ""
+
+#: about.cc:619
+msgid " - debug"
+msgstr ""
+
+#: about.cc:625
 msgid "Copyright (C) 1999-2015 Paul Davis\n"
 msgstr ""
 
-#: about.cc:595
+#: about.cc:629
 msgid "http://ardour.org/"
 msgstr "http://ardour.org/"
 
-#: about.cc:596
+#: about.cc:630
 msgid ""
 "%1%2\n"
-"(built from revision %3)"
+"(rev %3)\n"
+"%4%5"
 msgstr ""
 
-#: about.cc:600
+#: about.cc:635
 msgid "Config"
 msgstr "Oppsett"
 
-#: actions.cc:85
+#: actions.cc:83
 msgid "Loading menus from %1"
 msgstr "Lastar menyar frå %1"
 
-#: actions.cc:88 actions.cc:89
+#: actions.cc:86 actions.cc:87
 msgid "badly formatted menu definition file: %1"
 msgstr ""
 
-#: actions.cc:91
+#: actions.cc:89
 msgid "%1 menu definition file not found"
 msgstr "Fann ikkje menydefinisjonsfila til %1"
 
-#: actions.cc:95 actions.cc:96
+#: actions.cc:93 actions.cc:94
 msgid "%1 will not work without a valid menu definition file"
 msgstr ""
 
-#: add_route_dialog.cc:54 route_params_ui.cc:524
-msgid "Add Track or Bus"
-msgstr "Legg til spor eller buss"
+#: add_route_dialog.cc:58
+msgid "Add Track/Bus/VCA"
+msgstr ""
 
-#: add_route_dialog.cc:57
+#: add_route_dialog.cc:61
 msgid "Configuration:"
 msgstr "Innstillingar:"
 
-#: add_route_dialog.cc:58
+#: add_route_dialog.cc:62
 msgid "Record Mode:"
 msgstr ""
 
-#: add_route_dialog.cc:59
+#: add_route_dialog.cc:63
 msgid "Instrument:"
 msgstr "Instrument:"
 
-#: add_route_dialog.cc:77
+#: add_route_dialog.cc:77 add_route_dialog.cc:228
 msgid "Audio Tracks"
 msgstr "Lydspor"
 
-#: add_route_dialog.cc:78 add_route_dialog.cc:209
+#: add_route_dialog.cc:78 add_route_dialog.cc:224
 msgid "MIDI Tracks"
 msgstr "MIDI-spor"
 
-#: add_route_dialog.cc:79 add_route_dialog.cc:211
+#: add_route_dialog.cc:79 add_route_dialog.cc:226
 msgid "Audio+MIDI Tracks"
 msgstr "Lyd+MIDI-spor"
 
-#: add_route_dialog.cc:80 add_route_dialog.cc:207
-msgid "Busses"
-msgstr "Bussar"
+#: add_route_dialog.cc:80 add_route_dialog.cc:220
+msgid "Audio Busses"
+msgstr ""
+
+#: add_route_dialog.cc:81 add_route_dialog.cc:222
+msgid "MIDI Busses"
+msgstr ""
+
+#: add_route_dialog.cc:82
+msgid "VCA Masters"
+msgstr ""
 
-#: add_route_dialog.cc:83 add_route_dialog.cc:559
+#: add_route_dialog.cc:85 add_route_dialog.cc:622
 msgid "First"
 msgstr ""
 
-#: add_route_dialog.cc:84 add_route_dialog.cc:561
-msgid "After Editor Selection"
+#: add_route_dialog.cc:86 add_route_dialog.cc:626
+msgid "Before Selection"
 msgstr ""
 
-#: add_route_dialog.cc:85 add_route_dialog.cc:563
-msgid "After Mixer Selection"
+#: add_route_dialog.cc:87 add_route_dialog.cc:624
+msgid "After Selection"
 msgstr ""
 
-#: add_route_dialog.cc:86
+#: add_route_dialog.cc:88
 msgid "Last"
 msgstr ""
 
-#: add_route_dialog.cc:103
+#: add_route_dialog.cc:91
+msgid "Flexible-I/O"
+msgstr ""
+
+#: add_route_dialog.cc:92
+msgid "Strict-I/O"
+msgstr ""
+
+#: add_route_dialog.cc:108
 msgid "Add:"
 msgstr "Legg til:"
 
-#: add_route_dialog.cc:116 time_fx_dialog.cc:91 add_video_dialog.cc:135
-#: video_server_dialog.cc:121
+#: add_route_dialog.cc:121 time_fx_dialog.cc:101 add_video_dialog.cc:135
+#: video_server_dialog.cc:118
 msgid "<b>Options</b>"
 msgstr "<b>Val</b>"
 
-#: add_route_dialog.cc:126 bundle_manager.cc:193 region_editor.cc:50
-#: route_group_dialog.cc:71
+#: add_route_dialog.cc:131 bundle_manager.cc:193 region_editor.cc:52
+#: route_group_dialog.cc:70
 msgid "Name:"
 msgstr "Namn:"
 
-#: add_route_dialog.cc:156
+#: add_route_dialog.cc:155
 msgid "Group:"
 msgstr "Gruppe:"
 
-#: add_route_dialog.cc:162
+#: add_route_dialog.cc:161
 msgid "Insert:"
 msgstr ""
 
-#: add_route_dialog.cc:223 add_route_dialog.cc:232 add_route_dialog.cc:306
-#: ardour_ui_ed.cc:539 engine_dialog.cc:237 rc_option_editor.cc:1805
-#: rc_option_editor.cc:1807 rc_option_editor.cc:1809 rc_option_editor.cc:1827
-#: rc_option_editor.cc:1829 rc_option_editor.cc:1837 rc_option_editor.cc:1839
-#: rc_option_editor.cc:1857 rc_option_editor.cc:1870 rc_option_editor.cc:1872
-#: rc_option_editor.cc:1874 rc_option_editor.cc:1919 rc_option_editor.cc:1921
-#: rc_option_editor.cc:1923 rc_option_editor.cc:1931 rc_option_editor.cc:1939
-#: rc_option_editor.cc:1941 rc_option_editor.cc:1949
+#: add_route_dialog.cc:171
+msgid "Output Ports:"
+msgstr ""
+
+#: add_route_dialog.cc:176 rc_option_editor.cc:2474
+msgid ""
+"With strict-i/o enabled, Effect Processors will not modify the number of "
+"channels on a track. The number of output channels will always match the "
+"number of input channels."
+msgstr ""
+
+#: add_route_dialog.cc:240 add_route_dialog.cc:351 ardour_ui_ed.cc:636
+#: engine_dialog.cc:244 plugin_pin_dialog.cc:67 rc_option_editor.cc:2397
+#: rc_option_editor.cc:2399 rc_option_editor.cc:2401 rc_option_editor.cc:2419
+#: rc_option_editor.cc:2421 rc_option_editor.cc:2429 rc_option_editor.cc:2432
+#: rc_option_editor.cc:2450 rc_option_editor.cc:2463 rc_option_editor.cc:2472
+#: rc_option_editor.cc:2478 rc_option_editor.cc:2480 rc_option_editor.cc:2525
+#: rc_option_editor.cc:2527 rc_option_editor.cc:2529 rc_option_editor.cc:2537
 msgid "Audio"
 msgstr "Lyd"
 
-#: add_route_dialog.cc:224 add_route_dialog.cc:235 add_route_dialog.cc:307
-#: editor_actions.cc:109 engine_dialog.cc:239 missing_file_dialog.cc:56
-#: rc_option_editor.cc:2084 rc_option_editor.cc:2094 rc_option_editor.cc:2102
-#: rc_option_editor.cc:2110 rc_option_editor.cc:2119 rc_option_editor.cc:2127
-#: rc_option_editor.cc:2135 rc_option_editor.cc:2143 rc_option_editor.cc:2152
-#: rc_option_editor.cc:2161 rc_option_editor.cc:2170 rc_option_editor.cc:2178
-#: rc_option_editor.cc:2186 rc_option_editor.cc:2194 rc_option_editor.cc:2217
+#: add_route_dialog.cc:243 add_route_dialog.cc:352 editor_actions.cc:112
+#: engine_dialog.cc:246 missing_file_dialog.cc:60 mixer_ui.cc:1895
+#: plugin_pin_dialog.cc:68 rc_option_editor.cc:2672 rc_option_editor.cc:2674
+#: rc_option_editor.cc:2684 rc_option_editor.cc:2693 rc_option_editor.cc:2701
+#: rc_option_editor.cc:2709 rc_option_editor.cc:2717 rc_option_editor.cc:2790
+#: rc_option_editor.cc:2813
 msgid "MIDI"
 msgstr "MIDI"
 
-#: add_route_dialog.cc:225 add_route_dialog.cc:238 add_route_dialog.cc:308
+#: add_route_dialog.cc:246 add_route_dialog.cc:353
 msgid "Audio+MIDI"
 msgstr "Lyd+MIDI"
 
-#: add_route_dialog.cc:226 add_route_dialog.cc:241 add_route_dialog.cc:309
+#: add_route_dialog.cc:250 add_route_dialog.cc:354
 msgid "Bus"
 msgstr "Buss"
 
-#: add_route_dialog.cc:268
+#: add_route_dialog.cc:286
 msgid ""
 "Audio+MIDI tracks are intended for use <b>ONLY</b> with plugins that use "
 "both audio and MIDI input data\n"
@@ -536,60 +622,61 @@ msgstr ""
 "Viss du ikkje planlegg å bruka slike utvidingar, bør du bruka eit vanleg "
 "lyd- eller MIDI-spor i staden."
 
-#: add_route_dialog.cc:327 add_route_dialog.cc:346 editor_actions.cc:422
-#: editor_rulers.cc:251 time_axis_view.cc:1374
+#: add_route_dialog.cc:373 add_route_dialog.cc:385 editor_actions.cc:456
+#: editor_rulers.cc:250 time_axis_view.cc:1290
 msgid "Normal"
 msgstr "Normal"
 
-#: add_route_dialog.cc:330 add_route_dialog.cc:348
+#: add_route_dialog.cc:374 add_route_dialog.cc:387
 msgid "Non Layered"
 msgstr "Ikkje lagdelt"
 
-#: add_route_dialog.cc:331 add_route_dialog.cc:350
+#: add_route_dialog.cc:375 add_route_dialog.cc:389
 msgid "Tape"
 msgstr "Band"
 
-#: add_route_dialog.cc:431 monitor_section.cc:290
+#: add_route_dialog.cc:476 monitor_section.cc:273 plugin_pin_dialog.cc:509
+#: plugin_setup_dialog.cc:202
 msgid "Mono"
 msgstr "Mono"
 
-#: add_route_dialog.cc:435
+#: add_route_dialog.cc:480 plugin_pin_dialog.cc:512 plugin_setup_dialog.cc:205
 msgid "Stereo"
 msgstr "Stereo"
 
-#: add_route_dialog.cc:459
+#: add_route_dialog.cc:503
 msgid "3 Channel"
 msgstr "3 kanalar"
 
-#: add_route_dialog.cc:463
+#: add_route_dialog.cc:507
 msgid "4 Channel"
 msgstr "4 kanalar"
 
-#: add_route_dialog.cc:467
+#: add_route_dialog.cc:511
 msgid "5 Channel"
 msgstr "5 kanalar"
 
-#: add_route_dialog.cc:471
+#: add_route_dialog.cc:515
 msgid "6 Channel"
 msgstr "6 kanalar"
 
-#: add_route_dialog.cc:475
+#: add_route_dialog.cc:519
 msgid "8 Channel"
 msgstr "8 kanalar"
 
-#: add_route_dialog.cc:479
+#: add_route_dialog.cc:523
 msgid "12 Channel"
 msgstr "12 kanalar"
 
-#: add_route_dialog.cc:483 mixer_strip.cc:1836 mixer_strip.cc:2244
+#: add_route_dialog.cc:527 mixer_strip.cc:2009 mixer_strip.cc:2455
 msgid "Custom"
 msgstr "Eigen"
 
-#: add_route_dialog.cc:516 add_route_dialog.cc:532 route_group_menu.cc:81
+#: add_route_dialog.cc:569 add_route_dialog.cc:585 route_group_menu.cc:85
 msgid "New Group..."
 msgstr "Ny gruppe..."
 
-#: add_route_dialog.cc:520 route_group_menu.cc:85
+#: add_route_dialog.cc:573 route_group_menu.cc:89
 msgid "No Group"
 msgstr "Inga gruppe"
 
@@ -597,13 +684,13 @@ msgstr "Inga gruppe"
 msgid "Ambiguous File"
 msgstr "Tvitydig fil"
 
-#: ambiguous_file_dialog.cc:35
+#: ambiguous_file_dialog.cc:37
 msgid ""
 "%1 has found the file <i>%2</i> in the following places:\n"
 "\n"
 msgstr ""
 
-#: ambiguous_file_dialog.cc:44
+#: ambiguous_file_dialog.cc:46
 msgid ""
 "\n"
 "\n"
@@ -613,164 +700,202 @@ msgstr ""
 "\n"
 "Vel kva stig du vil henta fila frå."
 
-#: ambiguous_file_dialog.cc:46 missing_file_dialog.cc:46
+#: ambiguous_file_dialog.cc:48 missing_file_dialog.cc:50
 msgid "Done"
 msgstr "Ferdig"
 
-#: analysis_window.cc:46
+#: analysis_window.cc:45
 msgid "Signal source"
 msgstr "Signalkjelde"
 
-#: analysis_window.cc:47
+#: analysis_window.cc:46
 msgid "Selected ranges"
 msgstr "Valde område"
 
-#: analysis_window.cc:48
+#: analysis_window.cc:47
 msgid "Selected regions"
 msgstr "Valde bolkar"
 
-#: analysis_window.cc:50
-msgid "Display model"
-msgstr "Visingsmodell"
-
-#: analysis_window.cc:51
-msgid "Composite graphs for each track"
-msgstr "Samansette grafar for kvart spor"
-
-#: analysis_window.cc:52
-msgid "Composite graph of all tracks"
-msgstr "Samansett graf for alle spor"
-
-#: analysis_window.cc:54
+#: analysis_window.cc:48
 msgid "Show frequency power range"
 msgstr "Vis frekvensstyrkeområde"
 
-#: analysis_window.cc:55
-msgid "Normalize values"
-msgstr "Normaliser verdiar"
+#: analysis_window.cc:49
+msgid "Fit dB range"
+msgstr ""
+
+#: analysis_window.cc:50
+msgid "Proportional Spectrum, -18dB"
+msgstr ""
 
-#: analysis_window.cc:59
+#: analysis_window.cc:53
 msgid "FFT analysis window"
 msgstr "FFT-analyserute"
 
-#: analysis_window.cc:60 editor.cc:1823
+#: analysis_window.cc:54 editor.cc:1953
 msgid "Spectral Analysis"
 msgstr "Spektrumanalyse"
 
-#: analysis_window.cc:67 editor_actions.cc:142 export_channel_selector.cc:557
-#: session_metadata_dialog.cc:667
+#: analysis_window.cc:61 editor_actions.cc:145 session_metadata_dialog.cc:670
 msgid "Track"
 msgstr "Spor"
 
-#: analysis_window.cc:68 editor_actions.cc:648 mixer_ui.cc:131
-#: mixer_ui.cc:1854
+#: analysis_window.cc:62 ardour_ui_ed.cc:254 ardour_ui_ed.cc:255
+#: ardour_ui_ed.cc:256 editor_actions.cc:689 mixer_ui.cc:151 mixer_ui.cc:2134
 msgid "Show"
 msgstr "Vis"
 
-#: analysis_window.cc:135
+#: analysis_window.cc:107
 msgid "Re-analyze data"
 msgstr "Analyser data på nytt"
 
-#: ardour_button.cc:887
+#: ardour_button.cc:876
 msgid "button cannot watch state of non-existing Controllable\n"
 msgstr "knappen kan ikkje overvaka status for ikkje-eksisterande kontroll\n"
 
-#: ardour_button.cc:1155
+#: ardour_button.cc:1144
 msgid "ABCDEFGHIJLKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
 msgstr ""
 
-#: ardour_ui.cc:164
+#: ardour_ui.cc:198
 msgid ""
 "%1 %2.x has discovered configuration files from %1 %3.x.\n"
 "\n"
-"Would you like to copy the relevant files before starting to use the "
-"program?\n"
+"Would you like these files to be copied and used for %1 %2.x?\n"
 "\n"
 "(This will require you to restart %1.)"
 msgstr ""
 
-#: ardour_ui.cc:211 editor_actions.cc:642 region_editor.cc:51
+#: ardour_ui.cc:283 editor_actions.cc:683 region_editor.cc:53
 msgid "Audition"
 msgstr "Lytt"
 
-#: ardour_ui.cc:212 editor_actions.cc:136 mixer_strip.cc:2016
-#: rc_option_editor.cc:1959 route_time_axis.cc:252 route_time_axis.cc:2711
+#: ardour_ui.cc:284 editor_actions.cc:139 mixer_strip.cc:2205
+#: monitor_section.cc:329 rc_option_editor.cc:2547 route_time_axis.cc:263
+#: route_time_axis.cc:2740 vca_master_strip.cc:212 vca_time_axis.cc:237
 msgid "Solo"
 msgstr "Solo"
 
-#: ardour_ui.cc:213 rc_option_editor.cc:741
+#: ardour_ui.cc:285 rc_option_editor.cc:1357
 msgid "Feedback"
 msgstr "Tilbakeføring"
 
-#: ardour_ui.cc:219 speaker_dialog.cc:36
+#: ardour_ui.cc:296 speaker_dialog.cc:36
 msgid "Speaker Configuration"
 msgstr "Høgtalaroppsett"
 
-#: ardour_ui.cc:220 keyeditor.cc:53
-msgid "Key Bindings"
-msgstr "Snøggtastar"
-
-#: ardour_ui.cc:221
-msgid "Preferences"
-msgstr "Innstillingar"
-
-#: ardour_ui.cc:222 ardour_ui.cc:229
+#: ardour_ui.cc:297
 msgid "Add Tracks/Busses"
 msgstr ""
 
-#: ardour_ui.cc:223
+#: ardour_ui.cc:298
 msgid "About"
 msgstr "Om"
 
-#: ardour_ui.cc:224 location_ui.cc:1141 session_option_editor.cc:189
-#: session_option_editor.cc:195 session_option_editor.cc:202
-msgid "Locations"
-msgstr "Stader"
+#: ardour_ui.cc:299 location_ui.cc:1167
+msgid "Ranges|Locations"
+msgstr ""
 
-#: ardour_ui.cc:225 route_params_ui.cc:59 route_params_ui.cc:630
+#: ardour_ui.cc:300 route_params_ui.cc:59 route_params_ui.cc:620
 msgid "Tracks and Busses"
 msgstr "Spor og bussar"
 
-#: ardour_ui.cc:226 engine_dialog.cc:70
+#: ardour_ui.cc:301 engine_dialog.cc:73
 msgid "Audio/MIDI Setup"
 msgstr ""
 
-#: ardour_ui.cc:227
+#: ardour_ui.cc:302
 msgid "Video Export Dialog"
 msgstr ""
 
-#: ardour_ui.cc:228
+#: ardour_ui.cc:303 lua_script_manager.cc:30
+msgid "Script Manager"
+msgstr ""
+
+#: ardour_ui.cc:304
 msgid "Properties"
 msgstr "Eigenskapar"
 
-#: ardour_ui.cc:230 bundle_manager.cc:264
+#: ardour_ui.cc:305
+msgid "Add Video"
+msgstr ""
+
+#: ardour_ui.cc:306 bundle_manager.cc:264
 msgid "Bundle Manager"
 msgstr "Bundelordnar"
 
-#: ardour_ui.cc:231 big_clock_window.cc:37
+#: ardour_ui.cc:307 big_clock_window.cc:37
 msgid "Big Clock"
 msgstr "Stor klokke"
 
-#: ardour_ui.cc:232
+#: ardour_ui.cc:308
 msgid "Audio Connections"
 msgstr ""
 
-#: ardour_ui.cc:233
+#: ardour_ui.cc:309
 msgid "MIDI Connections"
 msgstr ""
 
-#: ardour_ui.cc:242
+#: ardour_ui.cc:310
+msgid "Bindings Editor"
+msgstr ""
+
+#: ardour_ui.cc:321 editor.cc:1288
+msgid "Window|Editor"
+msgstr ""
+
+#: ardour_ui.cc:322 mixer_ui.cc:2210 mixer_ui.cc:2216
+msgid "Window|Mixer"
+msgstr "Vindauga|miksar"
+
+#: ardour_ui.cc:323
+msgid "Window|Preferences"
+msgstr ""
+
+#: ardour_ui.cc:330
 msgid "Your configuration files were copied. You can now restart %1."
 msgstr ""
 
-#: ardour_ui.cc:481
+#: ardour_ui.cc:509
+msgid "Pre-Release Warning"
+msgstr ""
+
+#: ardour_ui.cc:513
+msgid ""
+"<b>Welcome to this pre-release build of %1 %2</b>\n"
+"\n"
+"There are still several issues and bugs to be worked on,\n"
+"as well as general workflow improvements, before this can be considered\n"
+"release software. So, a few guidelines:\n"
+"\n"
+"1) Please do <b>NOT</b> use this software with the expectation that it is "
+"stable or reliable\n"
+"   though it may be so, depending on your workflow.\n"
+"2) Please wait for a helpful writeup of new features.\n"
+"3) <b>Please do NOT use the forums at ardour.org to report issues</b>.\n"
+"4) Please <b>DO</b> use the bugtracker at http://tracker.ardour.org/ to "
+"report issues\n"
+"   making sure to note the product version number as 5.0-pre.\n"
+"5) Please <b>DO</b> use the ardour-users mailing list to discuss ideas and "
+"pass on comments.\n"
+"6) Please <b>DO</b> join us on IRC for real time discussions about %1 %2. "
+"You\n"
+"   can get there directly from within the program via the Help->Chat menu "
+"option.\n"
+"\n"
+"Full information on all the above can be found on the support page at\n"
+"\n"
+"                http://ardour.org/support\n"
+msgstr ""
+
+#: ardour_ui.cc:613
 msgid ""
 "The audio backend was shutdown because:\n"
 "\n"
 "%1"
 msgstr ""
 
-#: ardour_ui.cc:483
+#: ardour_ui.cc:615
 msgid ""
 "The audio backend has either been shutdown or it\n"
 "disconnected %1 because %1\n"
@@ -778,45 +903,45 @@ msgid ""
 "the audio backend and save the session."
 msgstr ""
 
-#: ardour_ui.cc:507
+#: ardour_ui.cc:639
 msgid ""
 "Audio Unit Plugin Scan Failed. Automatic AU scanning has been disabled. "
 "Please see the log window for further details."
 msgstr ""
 
-#: ardour_ui.cc:508
+#: ardour_ui.cc:640
 msgid "Audio Unit Plugin Scan Failed:"
 msgstr ""
 
-#: ardour_ui.cc:827
+#: ardour_ui.cc:1008
 msgid "NSM server did not announce itself"
 msgstr ""
 
-#: ardour_ui.cc:840
+#: ardour_ui.cc:1021
 msgid "NSM: no client ID provided"
 msgstr ""
 
-#: ardour_ui.cc:847
+#: ardour_ui.cc:1028
 msgid "NSM: no session created"
 msgstr ""
 
-#: ardour_ui.cc:870
+#: ardour_ui.cc:1051
 msgid "NSM: initialization failed"
 msgstr ""
 
-#: ardour_ui.cc:900
+#: ardour_ui.cc:1083
 msgid "Free/Demo Version Warning"
 msgstr ""
 
-#: ardour_ui.cc:902
+#: ardour_ui.cc:1085
 msgid "Subscribe and support development of %1"
 msgstr ""
 
-#: ardour_ui.cc:903
+#: ardour_ui.cc:1086
 msgid "Don't warn me about this again"
 msgstr ""
 
-#: ardour_ui.cc:905
+#: ardour_ui.cc:1088
 msgid ""
 "<span weight=\"bold\" size=\"large\">%1</span>\n"
 "\n"
@@ -827,39 +952,39 @@ msgid ""
 "%4"
 msgstr ""
 
-#: ardour_ui.cc:906
+#: ardour_ui.cc:1089
 msgid "This is a free/demo version of %1"
 msgstr ""
 
-#: ardour_ui.cc:907
+#: ardour_ui.cc:1090
 msgid "It will not restore OR save any plugin settings"
 msgstr ""
 
-#: ardour_ui.cc:908
+#: ardour_ui.cc:1091
 msgid ""
 "If you load an existing session with plugin settings\n"
 "they will not be used and will be lost."
 msgstr ""
 
-#: ardour_ui.cc:910 plugin_ui.cc:569
+#: ardour_ui.cc:1093 plugin_ui.cc:579
 msgid ""
 "To get full access to updates without this limitation\n"
 "consider becoming a subscriber for a low cost every month."
 msgstr ""
 
-#: ardour_ui.cc:920
+#: ardour_ui.cc:1103
 msgid "Quit now"
 msgstr ""
 
-#: ardour_ui.cc:921
+#: ardour_ui.cc:1104
 msgid "Continue using %1"
 msgstr ""
 
-#: ardour_ui.cc:954 startup.cc:345
+#: ardour_ui.cc:1135 startup.cc:349
 msgid "%1 is ready for use"
 msgstr "%1 er klar til bruk"
 
-#: ardour_ui.cc:996
+#: ardour_ui.cc:1185
 msgid ""
 "WARNING: Your system has a limit for maximum amount of locked memory. This "
 "might cause %1 to run out of memory before your system runs out of memory. \n"
@@ -873,23 +998,23 @@ msgstr ""
 "Du kan finna ut kva minnegrensa er med 'ulimit -l'. Minnegrensa er vanlegvis "
 "kontrollert av %2"
 
-#: ardour_ui.cc:1013
+#: ardour_ui.cc:1202
 msgid "Do not show this window again"
 msgstr "Ikkje vis denne ruta att"
 
-#: ardour_ui.cc:1057
+#: ardour_ui.cc:1245
 msgid "Don't quit"
 msgstr "Ikkje avslutt"
 
-#: ardour_ui.cc:1058
+#: ardour_ui.cc:1246
 msgid "Just quit"
 msgstr "Berre avslutt"
 
-#: ardour_ui.cc:1059
+#: ardour_ui.cc:1247 ardour_ui.cc:5362
 msgid "Save and quit"
 msgstr "Lagra og avslutt"
 
-#: ardour_ui.cc:1069
+#: ardour_ui.cc:1257
 msgid ""
 "%1 was unable to save your session.\n"
 "\n"
@@ -903,11 +1028,11 @@ msgstr ""
 "\n"
 "\"Berre avslutt\"-alternativet."
 
-#: ardour_ui.cc:1119
+#: ardour_ui.cc:1307
 msgid "Unsaved Session"
 msgstr "Ulagra økt"
 
-#: ardour_ui.cc:1140
+#: ardour_ui.cc:1328
 msgid ""
 "The session \"%1\"\n"
 "has not been saved.\n"
@@ -925,7 +1050,7 @@ msgstr ""
 "\n"
 "Kva vil du gjera?"
 
-#: ardour_ui.cc:1143
+#: ardour_ui.cc:1331
 msgid ""
 "The snapshot \"%1\"\n"
 "has not been saved.\n"
@@ -943,74 +1068,107 @@ msgstr ""
 "\n"
 "Kva vil du gjera?"
 
-#: ardour_ui.cc:1157
+#: ardour_ui.cc:1345
 msgid "Prompter"
 msgstr "Spørsmål"
 
-#: ardour_ui.cc:1269 ardour_ui.cc:1277
+#: ardour_ui.cc:1459 ardour_ui.cc:1467
 msgid "Audio: <span foreground=\"red\">none</span>"
 msgstr ""
 
-#: ardour_ui.cc:1281
+#: ardour_ui.cc:1471
 #, c-format
 msgid "Audio: <span foreground=\"green\">%.1f kHz / %4.1f ms</span>"
 msgstr ""
 
-#: ardour_ui.cc:1285
+#: ardour_ui.cc:1475
 #, c-format
 msgid "Audio: <span foreground=\"green\">%<PRId64> kHz / %4.1f ms</span>"
 msgstr ""
 
-#: ardour_ui.cc:1303 export_video_dialog.cc:80
+#: ardour_ui.cc:1493 export_report.cc:108 export_report.cc:323
+#: export_video_dialog.cc:76
 msgid "File:"
 msgstr "Fil:"
 
-#: ardour_ui.cc:1307
+#: ardour_ui.cc:1497
 msgid "BWF"
 msgstr "BWF"
 
-#: ardour_ui.cc:1310
+#: ardour_ui.cc:1500
 msgid "WAV"
 msgstr "WAV"
 
-#: ardour_ui.cc:1313
+#: ardour_ui.cc:1503
 msgid "WAV64"
 msgstr "WAV64"
 
-#: ardour_ui.cc:1316 session_option_editor.cc:185
+#: ardour_ui.cc:1506 session_option_editor.cc:202
 msgid "CAF"
 msgstr "CAF"
 
-#: ardour_ui.cc:1319
+#: ardour_ui.cc:1509
 msgid "AIFF"
 msgstr "AIFF"
 
-#: ardour_ui.cc:1322
+#: ardour_ui.cc:1512
 msgid "iXML"
 msgstr "iXML"
 
-#: ardour_ui.cc:1325
+#: ardour_ui.cc:1515 session_option_editor.cc:203
 msgid "RF64"
 msgstr "RF64"
 
-#: ardour_ui.cc:1333
+#: ardour_ui.cc:1518
+msgid "RF64/WAV"
+msgstr ""
+
+#: ardour_ui.cc:1521
+msgid "MBWF"
+msgstr ""
+
+#: ardour_ui.cc:1529
 msgid "32-float"
 msgstr "32-flyt"
 
-#: ardour_ui.cc:1336
+#: ardour_ui.cc:1532
 msgid "24-int"
 msgstr "24-heiltal"
 
-#: ardour_ui.cc:1339
+#: ardour_ui.cc:1535
 msgid "16-int"
 msgstr "16-heiltal"
 
-#: ardour_ui.cc:1358
+#: ardour_ui.cc:1556
+#, c-format
+msgid "X: <span foreground=\"%s\">>10K</span>"
+msgstr ""
+
+#: ardour_ui.cc:1558
+#, c-format
+msgid "X: <span foreground=\"%s\">%u</span>"
+msgstr ""
+
+#: ardour_ui.cc:1561
+#, c-format
+msgid "X: <span foreground=\"%s\">?</span>"
+msgstr ""
+
+#: ardour_ui.cc:1564
+msgid "Audio dropouts. Shift+click to reset"
+msgstr ""
+
+#: ardour_ui.cc:1577
 #, c-format
 msgid "DSP: <span foreground=\"%s\">%5.1f%%</span>"
 msgstr "DSP: <span foreground=\"%s\">%5.1f%%</span>"
 
-#: ardour_ui.cc:1377
+#: ardour_ui.cc:1587
+#, c-format
+msgid "PkBld: <span foreground=\"%s\">%d</span>"
+msgstr ""
+
+#: ardour_ui.cc:1609
 #, c-format
 msgid ""
 "Buffers: <span foreground=\"green\">p:</span><span foreground=\"%s\">"
@@ -1021,87 +1179,88 @@ msgstr ""
 "%%</span> <span foreground=\"green\">c:</span><span foreground=\"%s\">"
 "%<PRIu32>%%</span>"
 
-#: ardour_ui.cc:1418
+#: ardour_ui.cc:1650
 msgid "Disk: <span foreground=\"green\">Unknown</span>"
 msgstr "Disk: <span foreground=\"green\">Ukjent</span>"
 
-#: ardour_ui.cc:1420
+#: ardour_ui.cc:1652
 msgid "Disk: <span foreground=\"green\">24hrs+</span>"
 msgstr "Disk: <span foreground=\"green\">24t+</span>"
 
-#: ardour_ui.cc:1438
+#: ardour_ui.cc:1670
 msgid "Disk: <span foreground=\"green\">>24 hrs</span>"
 msgstr "Disk: <span foreground=\"green\">>24t</span>"
 
-#: ardour_ui.cc:1449
+#: ardour_ui.cc:1681
 #, c-format
 msgid "Disk: <span foreground=\"%s\">%02dh:%02dm:%02ds</span>"
 msgstr "Disk: <span foreground=\"%s\">%02dt:%02dm:%02ds</span>"
 
-#: ardour_ui.cc:1475
+#: ardour_ui.cc:1707
 #, c-format
 msgid "Timecode|TC: <span foreground=\"%s\">%s</span>"
 msgstr "Tidskode|TC: <span foreground=\"%s\">%s</span>"
 
-#: ardour_ui.cc:1596 ardour_ui.cc:1605 session_dialog.cc:318
-#: session_dialog.cc:323
-msgid "Recent Sessions"
-msgstr "Siste øktene"
-
-#: ardour_ui.cc:1684
+#: ardour_ui.cc:1789
 msgid ""
 "%1 is not connected to any audio backend.\n"
 "You cannot open or close sessions in this condition"
 msgstr ""
 
-#: ardour_ui.cc:1708
+#: ardour_ui.cc:1807
 msgid "Open Session"
 msgstr "Opna økt"
 
-#: ardour_ui.cc:1733 session_dialog.cc:349 session_import_dialog.cc:170
-#: session_metadata_dialog.cc:858
+#: ardour_ui.cc:1831 session_dialog.cc:410 session_import_dialog.cc:170
+#: session_metadata_dialog.cc:861
 msgid "%1 sessions"
 msgstr "%1 økter"
 
-#: ardour_ui.cc:1770
+#: ardour_ui.cc:1879 ardour_ui.cc:1916
 msgid "You cannot add a track without a session already loaded."
 msgstr ""
 "Du kan ikkje leggja til eit spor eller ein buss når du ikkje har ei økt "
 "innlasta."
 
-#: ardour_ui.cc:1778
+#: ardour_ui.cc:1887
 msgid "could not create %1 new mixed track"
 msgid_plural "could not create %1 new mixed tracks"
 msgstr[0] "greidde ikkje laga %1 nye miksa spor"
 msgstr[1] "ugreidde ikkje laga %1 nye miksa spor"
 
-#: ardour_ui.cc:1784 ardour_ui.cc:1845
-msgid ""
-"There are insufficient ports available\n"
-"to create a new track or bus.\n"
-"You should save %1, exit and\n"
-"restart with more ports."
-msgstr ""
-
-#: ardour_ui.cc:1819
+#: ardour_ui.cc:1924
+msgid "could not create %1 new Midi Bus"
+msgid_plural "could not create %1 new Midi Busses"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ardour_ui.cc:1977
 msgid "You cannot add a track or bus without a session already loaded."
 msgstr ""
 "Du kan ikkje leggja til eit spor eller ein buss når du ikkje har ei økt "
 "innlasta."
 
-#: ardour_ui.cc:1828
+#: ardour_ui.cc:1986
 msgid "could not create %1 new audio track"
 msgid_plural "could not create %1 new audio tracks"
 msgstr[0] "greidde ikkje laga nytt lydspor"
 msgstr[1] "greidde ikkje laga %1 nye lydspor"
 
-#: ardour_ui.cc:1837
+#: ardour_ui.cc:1995
 msgid "could not create %1 new audio bus"
 msgid_plural "could not create %1 new audio busses"
 msgstr[0] "greidde ikkje laga ny lydbuss"
 msgstr[1] "greidde ikkje laga %1 nye lydbussar"
 
-#: ardour_ui.cc:1990
+#: ardour_ui.cc:2020
+msgid ""
+"There are insufficient ports available\n"
+"to create a new track or bus.\n"
+"You should save %1, exit and\n"
+"restart with more ports."
+msgstr ""
+
+#: ardour_ui.cc:2164
 msgid ""
 "Please create one or more tracks before trying to record.\n"
 "You can do this with the \"Add Track or Bus\" option in the Session menu."
@@ -1109,23 +1268,20 @@ msgstr ""
 "Lag eitt eller fleire spor før du prøver å ta opp.\n"
 "Du kan gjera det med «Legg til spor eller buss» i økt-menyen."
 
-#: ardour_ui.cc:2376
-msgid "Save as..."
+#: ardour_ui.cc:2565
+#, c-format
+msgid "Copied %<PRId64> of %<PRId64>"
 msgstr ""
 
-#: ardour_ui.cc:2377 ardour_ui.cc:2456
-msgid "New session name"
-msgstr "Nytt øktnamn"
-
-#: ardour_ui.cc:2379
-msgid "Take Snapshot"
-msgstr "Ta snøggbilete"
+#: ardour_ui.cc:2619 save_as_dialog.cc:33
+msgid "Save As"
+msgstr ""
 
-#: ardour_ui.cc:2380
-msgid "Name of new snapshot"
-msgstr "Namn på det nye snøggbiletet"
+#: ardour_ui.cc:2647
+msgid "Save As failed: %1"
+msgstr ""
 
-#: ardour_ui.cc:2405
+#: ardour_ui.cc:2684
 msgid ""
 "To ensure compatibility with various systems\n"
 "snapshot names may not contain a '%1' character"
@@ -1133,23 +1289,35 @@ msgstr ""
 "For å tryggja kompatibiliteten med ymse system,\n"
 "kan ikkje namn på snøggbilete innehalda teiknet '%1'"
 
-#: ardour_ui.cc:2417
+#: ardour_ui.cc:2698
 msgid "Confirm Snapshot Overwrite"
 msgstr "Stadfest at du vil skriva over snøggbilete"
 
-#: ardour_ui.cc:2418
-msgid "A snapshot already exists with that name.  Do you want to overwrite it?"
-msgstr "Dette snøggbiletet finst frå før. Vil du skriva over det?"
+#: ardour_ui.cc:2699
+msgid "A snapshot already exists with that name. Do you want to overwrite it?"
+msgstr ""
 
-#: ardour_ui.cc:2421 utils_videotl.cc:74
-msgid "Overwrite"
-msgstr "Skriv over"
+#: ardour_ui.cc:2724
+msgid "Snapshot and switch"
+msgstr ""
+
+#: ardour_ui.cc:2725 ardour_ui.cc:2776
+msgid "New session name"
+msgstr "Nytt øktnamn"
+
+#: ardour_ui.cc:2727
+msgid "Take Snapshot"
+msgstr "Ta snøggbilete"
+
+#: ardour_ui.cc:2728
+msgid "Name of new snapshot"
+msgstr "Namn på det nye snøggbiletet"
 
-#: ardour_ui.cc:2455
+#: ardour_ui.cc:2775
 msgid "Rename Session"
 msgstr "Døyp om økt"
 
-#: ardour_ui.cc:2470 ardour_ui.cc:2886 ardour_ui.cc:2924
+#: ardour_ui.cc:2790 ardour_ui.cc:3267 ardour_ui.cc:3305
 msgid ""
 "To ensure compatibility with various systems\n"
 "session names may not contain a '%1' character"
@@ -1157,12 +1325,12 @@ msgstr ""
 "For å tryggja kompatibiliteten med ymse system,\n"
 "kan ikkje namn på økter innehalda teiknet '%1'"
 
-#: ardour_ui.cc:2478
+#: ardour_ui.cc:2798
 msgid ""
 "That name is already in use by another directory/folder. Please try again."
 msgstr "Dette namnet er alt i bruk på ei anna mappe. Prøv på nytt."
 
-#: ardour_ui.cc:2487
+#: ardour_ui.cc:2807
 msgid ""
 "Renaming this session failed.\n"
 "Things could be seriously messed up at this point"
@@ -1170,19 +1338,27 @@ msgstr ""
 "Fekk ikkje til å døypa om denne økta.\n"
 "Her kan det vera noko skikkeleg rot."
 
-#: ardour_ui.cc:2602
+#: ardour_ui.cc:2923 route_ui.cc:1867
+msgid "Confirm Template Overwrite"
+msgstr ""
+
+#: ardour_ui.cc:2924 route_ui.cc:1868
+msgid "A template already exists with that name. Do you want to overwrite it?"
+msgstr ""
+
+#: ardour_ui.cc:2948
 msgid "Save Template"
 msgstr "Lagra mal"
 
-#: ardour_ui.cc:2603
+#: ardour_ui.cc:2949
 msgid "Name for template:"
 msgstr "Namn på malen:"
 
-#: ardour_ui.cc:2604
+#: ardour_ui.cc:2950
 msgid "-template"
 msgstr "-mal"
 
-#: ardour_ui.cc:2643
+#: ardour_ui.cc:2987
 msgid ""
 "This session\n"
 "%1\n"
@@ -1192,59 +1368,89 @@ msgstr ""
 "%1,\n"
 "finst frå før. Vil du opna henne?"
 
-#: ardour_ui.cc:2653
+#: ardour_ui.cc:2997
 msgid "Open Existing Session"
 msgstr "Opna økt"
 
-#: ardour_ui.cc:2914
+#: ardour_ui.cc:3295
 msgid "There is no existing session at \"%1\""
 msgstr "Det finst inga økt i \"%1\""
 
-#: ardour_ui.cc:3006
+#: ardour_ui.cc:3391
 msgid "Please wait while %1 loads your session"
 msgstr "Vent medan %1 lastar økta di"
 
-#: ardour_ui.cc:3021
+#: ardour_ui.cc:3406
 msgid "Port Registration Error"
 msgstr "Feil ved portregistrering"
 
-#: ardour_ui.cc:3022
+#: ardour_ui.cc:3407
 msgid "Click the Close button to try again."
 msgstr "Klikk på Lukk for å prøva att."
 
-#: ardour_ui.cc:3043
-msgid "Session \"%1 (snapshot %2)\" did not load successfully"
-msgstr "Økta \"%1 (snøggbilete %2)\" vart ikkje lasta"
+#: ardour_ui.cc:3426
+msgid "Session \"%1 (snapshot %2)\" did not load successfully: %3"
+msgstr ""
 
-#: ardour_ui.cc:3049
+#: ardour_ui.cc:3432 ardour_ui.cc:3453 ardour_ui.cc:3548 ardour_ui.cc:3557
 msgid "Loading Error"
 msgstr "Feil ved lasting"
 
-#: ardour_ui.cc:3068
+#: ardour_ui.cc:3447
+msgid "Session \"%1 (snapshot %2)\" did not load successfully"
+msgstr "Økta \"%1 (snøggbilete %2)\" vart ikkje lasta"
+
+#: ardour_ui.cc:3475
 msgid ""
 "This session has been opened in read-only mode.\n"
 "\n"
 "You will not be able to record or save."
 msgstr ""
 
-#: ardour_ui.cc:3073
+#: ardour_ui.cc:3480
 msgid "Read-only Session"
 msgstr ""
 
-#: ardour_ui.cc:3139
+#: ardour_ui.cc:3547
+msgid "Could not create session in \"%1\": %2"
+msgstr ""
+
+#: ardour_ui.cc:3556
 msgid "Could not create session in \"%1\""
 msgstr "Greidde ikkje laga økt i \"%1\""
 
-#: ardour_ui.cc:3288
+#: ardour_ui.cc:3601
+msgid ""
+"<b>Just ask and wait for an answer.\n"
+"It may take from minutes to hours.</b>"
+msgstr ""
+
+#: ardour_ui.cc:3603
+msgid "About the Chat"
+msgstr ""
+
+#: ardour_ui.cc:3604
+msgid ""
+"When you're inside the chat just ask your question and wait for an answer. "
+"The chat is occupied by real people with real lives so many of them are "
+"passively online and might not read your question before minutes or hours "
+"later.\n"
+"So please be patient and wait for an answer.\n"
+"\n"
+"You should just leave the chat window open and check back regularly until "
+"someone has answered your question."
+msgstr ""
+
+#: ardour_ui.cc:3723
 msgid "No files were ready for clean-up"
 msgstr "Ingen filer var klare for rydding"
 
-#: ardour_ui.cc:3292 ardour_ui.cc:3302 ardour_ui.cc:3435 ardour_ui.cc:3442
-#: ardour_ui_ed.cc:103
+#: ardour_ui.cc:3727 ardour_ui.cc:3737 ardour_ui.cc:3870 ardour_ui.cc:3877
+#: ardour_ui_ed.cc:129
 msgid "Clean-up"
 msgstr "Opprydding"
 
-#: ardour_ui.cc:3293
+#: ardour_ui.cc:3728
 msgid ""
 "If this seems suprising, \n"
 "check for any existing snapshots.\n"
@@ -1256,19 +1462,19 @@ msgstr ""
 "Det kan hende dei inneheld bolkar\n"
 "som treng ubrukte lydfiler for å eksistera."
 
-#: ardour_ui.cc:3352
+#: ardour_ui.cc:3787
 msgid "kilo"
 msgstr "kilo"
 
-#: ardour_ui.cc:3355
+#: ardour_ui.cc:3790
 msgid "mega"
 msgstr "mega"
 
-#: ardour_ui.cc:3358
+#: ardour_ui.cc:3793
 msgid "giga"
 msgstr "giga"
 
-#: ardour_ui.cc:3363
+#: ardour_ui.cc:3798
 msgid ""
 "The following file was deleted from %2,\n"
 "releasing %3 %4bytes of disk space"
@@ -1278,7 +1484,7 @@ msgid_plural ""
 msgstr[0] ""
 msgstr[1] ""
 
-#: ardour_ui.cc:3370
+#: ardour_ui.cc:3805
 msgid ""
 "The following file was not in use and \n"
 "has been moved to: %2\n"
@@ -1300,11 +1506,11 @@ msgid_plural ""
 msgstr[0] ""
 msgstr[1] ""
 
-#: ardour_ui.cc:3430
+#: ardour_ui.cc:3865
 msgid "Are you sure you want to clean-up?"
 msgstr "Er du sikker på at du vil rydda opp?"
 
-#: ardour_ui.cc:3437
+#: ardour_ui.cc:3872
 msgid ""
 "Clean-up is a destructive operation.\n"
 "ALL undo/redo information will be lost if you clean-up.\n"
@@ -1314,79 +1520,115 @@ msgstr ""
 "ALL angra- og gjer om-informasjon blir sletta om du ryddar.\n"
 "Etter opprydding blir alle ubrukte lydfiler flytte til ei \"daudlyd\"-mappe."
 
-#: ardour_ui.cc:3445
+#: ardour_ui.cc:3880
 msgid "CleanupDialog"
 msgstr "Ryddedialog"
 
-#: ardour_ui.cc:3475
+#: ardour_ui.cc:3910
 msgid "Cleaned Files"
 msgstr "Rydda filer"
 
-#: ardour_ui.cc:3492
+#: ardour_ui.cc:3927
 msgid "deleted file"
 msgstr "sletta fil"
 
-#: ardour_ui.cc:3637
+#: ardour_ui.cc:4133
+msgid "Cannot read session script '%1': %2"
+msgstr ""
+
+#: ardour_ui.cc:4142 luainstance.cc:1087
+msgid "Set Script Parameters"
+msgstr ""
+
+#: ardour_ui.cc:4153
+msgid "Session script '%1' instantiation failed: %2"
+msgstr ""
+
+#: ardour_ui.cc:4157
+msgid "Loading Session script '%1' failed: %2"
+msgstr ""
+
+#: ardour_ui.cc:4170
+msgid "There are no active Lua session scripts present in this session."
+msgstr ""
+
+#: ardour_ui.cc:4187
+msgid "Session script '%1' removal failed: %2"
+msgstr ""
+
+#: ardour_ui.cc:4197
 msgid "Video-Server was not launched by %1. The request to stop it is ignored."
 msgstr ""
 
-#: ardour_ui.cc:3641
+#: ardour_ui.cc:4201
 msgid "Stop Video-Server"
 msgstr ""
 
-#: ardour_ui.cc:3642
+#: ardour_ui.cc:4202
 msgid "Do you really want to stop the Video Server?"
 msgstr ""
 
-#: ardour_ui.cc:3645
+#: ardour_ui.cc:4205
 msgid "Yes, Stop It"
 msgstr ""
 
-#: ardour_ui.cc:3671
+#: ardour_ui.cc:4231
 msgid "The Video Server is already started."
 msgstr ""
 
-#: ardour_ui.cc:3673
+#: ardour_ui.cc:4233
 msgid ""
 "An external Video Server is configured and can be reached. Not starting a "
 "new instance."
 msgstr ""
 
-#: ardour_ui.cc:3681 ardour_ui.cc:3786
+#: ardour_ui.cc:4241 ardour_ui.cc:4346
 msgid ""
 "Could not connect to the Video Server. Start it or configure its access URL "
 "in Preferences."
 msgstr ""
 
-#: ardour_ui.cc:3711
+#: ardour_ui.cc:4271
 msgid "Specified docroot is not an existing directory."
 msgstr ""
 
-#: ardour_ui.cc:3717 ardour_ui.cc:3723
+#: ardour_ui.cc:4277 ardour_ui.cc:4283
 msgid "Given Video Server is not an executable file."
 msgstr ""
 
-#: ardour_ui.cc:3757
+#: ardour_ui.cc:4317
 msgid "Cannot launch the video-server"
 msgstr ""
 
-#: ardour_ui.cc:3767
+#: ardour_ui.cc:4327
 msgid "Video-server was started but does not respond to requests..."
 msgstr ""
 
-#: ardour_ui.cc:3812 editor_audio_import.cc:641
+#: ardour_ui.cc:4372 editor_audio_import.cc:647
 msgid "could not open %1"
 msgstr "greidde ikkje opna %1"
 
-#: ardour_ui.cc:3816
+#: ardour_ui.cc:4376
 msgid "no video-file selected"
 msgstr ""
 
-#: ardour_ui.cc:4014
+#: ardour_ui.cc:4472
+msgid "No LTC detected, video will not be aligned."
+msgstr ""
+
+#: ardour_ui.cc:4478
+msgid "Align video-start to %1 [samples]"
+msgstr ""
+
+#: ardour_ui.cc:4654
+msgid "xrun"
+msgstr ""
+
+#: ardour_ui.cc:4663
 msgid "Recording was stopped because your system could not keep up."
 msgstr "Opptaket stoppa fordi datamaskina di ikkje greidde å henga med."
 
-#: ardour_ui.cc:4043
+#: ardour_ui.cc:4692
 msgid ""
 "The disk system on your computer\n"
 "was not able to keep up with %1.\n"
@@ -1400,23 +1642,23 @@ msgstr ""
 "Det tyder at harddisksystemet ditt ikkje\n"
 "greidde lagra raskt nok til å ta opp.\n"
 
-#: ardour_ui.cc:4113
+#: ardour_ui.cc:4765
 msgid "Scanning for plugins"
 msgstr ""
 
-#: ardour_ui.cc:4115
+#: ardour_ui.cc:4767
 msgid "Cancel plugin scan"
 msgstr ""
 
-#: ardour_ui.cc:4124
+#: ardour_ui.cc:4776
 msgid "Stop Timeout"
 msgstr ""
 
-#: ardour_ui.cc:4131
+#: ardour_ui.cc:4783
 msgid "Scan Timeout"
 msgstr ""
 
-#: ardour_ui.cc:4174
+#: ardour_ui.cc:4827
 msgid ""
 "The disk system on your computer\n"
 "was not able to keep up with %1.\n"
@@ -1430,11 +1672,11 @@ msgstr ""
 "Det tyder at harddisksystemet ditt ikkje\n"
 "greidde lesa raskt nok til å spela av.\n"
 
-#: ardour_ui.cc:4214
+#: ardour_ui.cc:4862
 msgid "Crash Recovery"
 msgstr "Gjenoppretting etter krasj"
 
-#: ardour_ui.cc:4215
+#: ardour_ui.cc:4863
 msgid ""
 "This session appears to have been in the\n"
 "middle of recording when %1 or\n"
@@ -1445,19 +1687,19 @@ msgid ""
 "what you would like to do.\n"
 msgstr ""
 
-#: ardour_ui.cc:4227
+#: ardour_ui.cc:4875
 msgid "Ignore crash data"
 msgstr "Sjå bort frå krasjdata"
 
-#: ardour_ui.cc:4228
+#: ardour_ui.cc:4876
 msgid "Recover from crash"
 msgstr "Hent fram att etter krasj"
 
-#: ardour_ui.cc:4248
+#: ardour_ui.cc:4896
 msgid "Sample Rate Mismatch"
 msgstr "Punktfrekvensen passar ikkje"
 
-#: ardour_ui.cc:4249
+#: ardour_ui.cc:4897
 msgid ""
 "This session was created with a sample rate of %1 Hz, but\n"
 "%2 is currently running at %3 Hz.  If you load this session,\n"
@@ -1467,23 +1709,24 @@ msgstr ""
 "%2 køyrer på %3 Hz nett no. Viss du lastar denne økta,\n"
 "kan det henda lyden blir spelt med feil punktfrekvens.\n"
 
-#: ardour_ui.cc:4258
+#: ardour_ui.cc:4906
 msgid "Do not load session"
 msgstr "Ikkje last økta"
 
-#: ardour_ui.cc:4259
+#: ardour_ui.cc:4907
 msgid "Load session anyway"
 msgstr "Last økta likevel"
 
-#: ardour_ui.cc:4286
-msgid "Could not disconnect from Audio/MIDI engine"
-msgstr ""
-
-#: ardour_ui.cc:4303 ardour_ui.cc:4306
-msgid "Could not reconnect to the Audio/MIDI engine"
+#: ardour_ui.cc:4927
+msgid ""
+"This session was created with a sample rate of %1 Hz, but\n"
+"%2 is currently running at %3 Hz.\n"
+"Audio will be recorded and played at the wrong sample rate.\n"
+"Re-Configure the Audio Engine in\n"
+"Menu > Window > Audio/Midi Setup"
 msgstr ""
 
-#: ardour_ui.cc:4590
+#: ardour_ui.cc:5209
 msgid ""
 "%4This is a session from an older version of %3%5\n"
 "\n"
@@ -1495,73 +1738,98 @@ msgid ""
 "\n"
 "%6%2%7\n"
 "\n"
-"From now on, use the -2000 version with older versions of %3"
+"From now on, use the backup copy with older versions of %3"
 msgstr ""
 
-#: ardour_ui2.cc:73
-msgid "UI: cannot setup editor"
-msgstr "Grensesnitt: Greier ikkje setja opp redigeringa"
+#: ardour_ui.cc:5331
+msgid "This is a free/demo copy of %1. It has just switched to silent mode."
+msgstr ""
 
-#: ardour_ui2.cc:78
-msgid "UI: cannot setup mixer"
-msgstr "Grensesnitt: Greier ikkje setja opp miksaren"
+#: ardour_ui.cc:5337
+msgid "%1 is now silent"
+msgstr ""
 
-#: ardour_ui2.cc:83
-msgid "UI: cannot setup meterbridge"
+#: ardour_ui.cc:5339
+msgid ""
+"Please consider paying for a copy of %1 - you can pay whatever you want."
+msgstr ""
+
+#: ardour_ui.cc:5340
+msgid "Better yet become a subscriber - subscriptions start at US$1 per month."
+msgstr ""
+
+#: ardour_ui.cc:5341
+msgid "Pay for a copy (via the web)"
+msgstr ""
+
+#: ardour_ui.cc:5342
+msgid "Become a subscriber (via the web)"
+msgstr ""
+
+#: ardour_ui.cc:5361
+msgid "Remain silent"
 msgstr ""
 
-#: ardour_ui2.cc:128
+#: ardour_ui.cc:5363
+msgid "Give me more time"
+msgstr ""
+
+#: ardour_ui.cc:5656
+msgid "Global keybindings are missing"
+msgstr ""
+
+#: ardour_ui2.cc:79
 msgid "Play from playhead"
 msgstr "Spel frå spelehovudet"
 
-#: ardour_ui2.cc:129
+#: ardour_ui2.cc:80
 msgid "Stop playback"
 msgstr "Stopp avspelinga"
 
-#: ardour_ui2.cc:130
+#: ardour_ui2.cc:81
 msgid "Toggle record"
 msgstr "Skru på/av opptak"
 
-#: ardour_ui2.cc:131
+#: ardour_ui2.cc:82
 msgid "Play range/selection"
 msgstr "Spel område/utval"
 
-#: ardour_ui2.cc:132
+#: ardour_ui2.cc:83
 msgid "Go to start of session"
 msgstr "Gå til starten av økta"
 
-#: ardour_ui2.cc:133
+#: ardour_ui2.cc:84
 msgid "Go to end of session"
 msgstr "Gå til slutten av økta"
 
-#: ardour_ui2.cc:134
+#: ardour_ui2.cc:85
 msgid "Play loop range"
 msgstr "Spel lykkje-området"
 
-#: ardour_ui2.cc:135
+#: ardour_ui2.cc:86
 msgid ""
 "MIDI Panic\n"
 "Send note off and reset controller messages on all MIDI channels"
 msgstr ""
 "MIDI-panikknSend note av og nullstill kontrollmeldingar på alle MIDI-kanalar"
 
-#: ardour_ui2.cc:136
+#: ardour_ui2.cc:87
 msgid "Return to last playback start when stopped"
 msgstr "GÃ¥ til der du sist byrja avspeling"
 
-#: ardour_ui2.cc:137
-msgid "Playhead follows Range Selections and Edits"
-msgstr "Spelehovudet fylgjer områdeval og redigeringar"
+#: ardour_ui2.cc:88
+msgid "Playhead follows range selections and edits"
+msgstr ""
 
-#: ardour_ui2.cc:138
+#: ardour_ui2.cc:89
 msgid "Be sensible about input monitoring"
 msgstr "Fornuftig inngangslytting"
 
-#: ardour_ui2.cc:139
+#: ardour_ui2.cc:90
 msgid "Enable/Disable audio click"
 msgstr "Slå på/av lydklikk"
 
-#: ardour_ui2.cc:140 monitor_section.cc:111
+#: ardour_ui2.cc:91 monitor_section.cc:129
 msgid ""
 "When active, something is soloed.\n"
 "Click to de-solo everything"
@@ -1569,19 +1837,17 @@ msgstr ""
 "NÃ¥r knappen er trykt inn, er noko i solo.\n"
 "Klikk for å slå av solo på alt."
 
-#: ardour_ui2.cc:141
+#: ardour_ui2.cc:92
 msgid ""
-"When active, auditioning is taking place\n"
+"When active, auditioning is taking place.\n"
 "Click to stop the audition"
 msgstr ""
-"Når knappen er trykt inn, blir noko lytta på.\n"
-"Klikk for å slå av lyttinga."
 
-#: ardour_ui2.cc:142
+#: ardour_ui2.cc:93
 msgid "When active, there is a feedback loop."
 msgstr "Når denne er på, er det ei rundgangssløyfe."
 
-#: ardour_ui2.cc:143
+#: ardour_ui2.cc:94
 msgid ""
 "<b>Primary Clock</b> right-click to set display mode. Click to edit, click"
 "+drag a digit or mouse-over+scroll wheel to modify.\n"
@@ -1589,7 +1855,7 @@ msgid ""
 "confirm; postfix the edit with '+' or '-' to enter delta times.\n"
 msgstr ""
 
-#: ardour_ui2.cc:144
+#: ardour_ui2.cc:95
 msgid ""
 "<b>Secondary Clock</b> right-click to set display mode. Click to edit, click"
 "+drag a digit or mouse-over+scroll wheel to modify.\n"
@@ -1597,450 +1863,559 @@ msgid ""
 "confirm; postfix the edit with '+' or '-' to enter delta times.\n"
 msgstr ""
 
-#: ardour_ui2.cc:145
+#: ardour_ui2.cc:96
 msgid "Reset All Peak Indicators"
 msgstr ""
 
-#: ardour_ui2.cc:146
+#: ardour_ui2.cc:97
 msgid "Show Error Log and acknowledge warnings"
 msgstr ""
 
-#: ardour_ui2.cc:179
+#: ardour_ui2.cc:130
 msgid "[ERROR]: "
 msgstr "[FEIL]:"
 
-#: ardour_ui2.cc:182
+#: ardour_ui2.cc:133
 msgid "[WARNING]: "
 msgstr "[Ã…TVARING]:"
 
-#: ardour_ui2.cc:185
+#: ardour_ui2.cc:136
 msgid "[INFO]: "
 msgstr "[INFO]:"
 
-#: ardour_ui2.cc:253 ardour_ui_ed.cc:403
+#: ardour_ui2.cc:197 ardour_ui_ed.cc:509
 msgid "Auto Return"
 msgstr "Autoretur"
 
-#: ardour_ui2.cc:255 ardour_ui_ed.cc:406
+#: ardour_ui2.cc:199 ardour_ui_ed.cc:512
 msgid "Follow Edits"
 msgstr "Fylg endringar"
 
-#: ardour_ui2.cc:716 rc_option_editor.cc:2300
+#: ardour_ui2.cc:422 ardour_ui2.cc:426 ardour_ui2.cc:430
+msgid ""
+"Drag this tab to the desktop to show %1 in its own window\n"
+"\n"
+"To put the window back, use the Window > %1 > Attach menu action"
+msgstr ""
+
+#: ardour_ui2.cc:638
 msgid "GUI"
 msgstr "Brukarflate"
 
-#: ardour_ui2.cc:733 rc_option_editor.cc:1309 rc_option_editor.cc:1327
-#: rc_option_editor.cc:1330 rc_option_editor.cc:1332 rc_option_editor.cc:1334
-#: rc_option_editor.cc:1342 rc_option_editor.cc:1350 rc_option_editor.cc:1352
-#: rc_option_editor.cc:1360 rc_option_editor.cc:1367 rc_option_editor.cc:1376
-#: rc_option_editor.cc:1378 rc_option_editor.cc:1380 rc_option_editor.cc:1388
-#: rc_option_editor.cc:1390 rc_option_editor.cc:1399
-#: session_option_editor.cc:321 session_option_editor.cc:323
-#: session_option_editor.cc:344 session_option_editor.cc:346
-#: session_option_editor.cc:348 session_option_editor.cc:355
-#: session_option_editor.cc:362 session_option_editor.cc:366
+#: ardour_ui2.cc:651 rc_option_editor.cc:1874 rc_option_editor.cc:1892
+#: rc_option_editor.cc:1895 rc_option_editor.cc:1897 rc_option_editor.cc:1899
+#: rc_option_editor.cc:1907 rc_option_editor.cc:1909 rc_option_editor.cc:1917
+#: rc_option_editor.cc:1925 rc_option_editor.cc:1932 rc_option_editor.cc:1953
+#: rc_option_editor.cc:1955 rc_option_editor.cc:1964
+#: session_option_editor.cc:342 session_option_editor.cc:344
+#: session_option_editor.cc:365 session_option_editor.cc:367
+#: session_option_editor.cc:369 session_option_editor.cc:376
+#: session_option_editor.cc:383 session_option_editor.cc:387
 msgid "Misc"
 msgstr "Ymse"
 
-#: ardour_ui_dependents.cc:76
+#: ardour_ui_dependents.cc:118
 msgid "Setup Editor"
 msgstr "Set opp redigeringa"
 
-#: ardour_ui_dependents.cc:78
+#: ardour_ui_dependents.cc:120
 msgid "Setup Mixer"
 msgstr "Set opp miksaren"
 
-#: ardour_ui_dependents.cc:84
+#: ardour_ui_dependents.cc:127
 msgid "Reload Session History"
 msgstr "Oppdater øktliste"
 
-#: ardour_ui_dialogs.cc:250
+#: ardour_ui_dependents.cc:248
+msgid "UI: cannot setup editor"
+msgstr "Grensesnitt: Greier ikkje setja opp redigeringa"
+
+#: ardour_ui_dependents.cc:253
+msgid "UI: cannot setup mixer"
+msgstr "Grensesnitt: Greier ikkje setja opp miksaren"
+
+#: ardour_ui_dependents.cc:258
+msgid "UI: cannot setup meterbridge"
+msgstr ""
+
+#: ardour_ui_dependents.cc:263
+msgid "UI: cannot setup luawindow"
+msgstr ""
+
+#: ardour_ui_dependents.cc:269 ardour_ui_ed.cc:136 ardour_ui_ed.cc:257
+#: rc_option_editor.cc:1853 rc_option_editor.cc:3487
+msgid "Preferences"
+msgstr "Innstillingar"
+
+#: ardour_ui_dependents.cc:270 ardour_ui_ed.cc:134 mixer_ui.cc:100
+#: mixer_ui.cc:410
+msgid "Mixer"
+msgstr ""
+
+#: ardour_ui_dependents.cc:271 ardour_ui_ed.cc:135 editor.cc:5790
+#: editor.cc:6062 public_editor.cc:34 rc_option_editor.cc:2201
+#: rc_option_editor.cc:2215 rc_option_editor.cc:2219 rc_option_editor.cc:2227
+#: rc_option_editor.cc:2236 rc_option_editor.cc:2244 rc_option_editor.cc:2253
+#: rc_option_editor.cc:2261 rc_option_editor.cc:2269 rc_option_editor.cc:2279
+#: rc_option_editor.cc:2281 rc_option_editor.cc:2305 rc_option_editor.cc:2317
+#: rc_option_editor.cc:2328 rc_option_editor.cc:2346
+msgid "Editor"
+msgstr "Redigering"
+
+#: ardour_ui_dialogs.cc:263
 msgid "Don't close"
 msgstr "Ikkje lukk"
 
-#: ardour_ui_dialogs.cc:251
+#: ardour_ui_dialogs.cc:264
 msgid "Just close"
 msgstr "Berre lukk"
 
-#: ardour_ui_dialogs.cc:252
+#: ardour_ui_dialogs.cc:265
 msgid "Save and close"
 msgstr "Lagra og lukk"
 
-#: ardour_ui_dialogs.cc:362
-msgid "This screen is not tall enough to display the mixer window"
-msgstr "Denne skjermen er ikkje høg nok til å visa miksarvindauga"
+#: ardour_ui_ed.cc:124
+msgid "Escape"
+msgstr ""
 
-#: ardour_ui_ed.cc:102
+#: ardour_ui_ed.cc:128
 msgid "Session"
 msgstr "Økt"
 
-#: ardour_ui_ed.cc:105 editor_actions.cc:138 editor_regions.cc:116
-#: port_group.cc:458 session_option_editor.cc:82 session_option_editor.cc:89
+#: ardour_ui_ed.cc:131 editor_actions.cc:141 editor_regions.cc:163
+#: port_group.cc:468 session_option_editor.cc:82 session_option_editor.cc:89
 msgid "Sync"
 msgstr "Synk"
 
-#: ardour_ui_ed.cc:106
+#: ardour_ui_ed.cc:132
 msgid "Options"
 msgstr "Val"
 
-#: ardour_ui_ed.cc:107
+#: ardour_ui_ed.cc:133
 msgid "Window"
 msgstr "Vindauge"
 
-#: ardour_ui_ed.cc:108
+#: ardour_ui_ed.cc:137 ardour_ui_ed.cc:267 ardour_ui_ed.cc:268
+#: ardour_ui_ed.cc:269
+msgid "Detach"
+msgstr ""
+
+#: ardour_ui_ed.cc:138
 msgid "Help"
 msgstr "Hjelp"
 
-#: ardour_ui_ed.cc:109
+#: ardour_ui_ed.cc:139
 msgid "Misc. Shortcuts"
 msgstr "Ymse snarvegar"
 
-#: ardour_ui_ed.cc:110
+#: ardour_ui_ed.cc:140
 msgid "Audio File Format"
 msgstr "Lydfilformat"
 
-#: ardour_ui_ed.cc:111
+#: ardour_ui_ed.cc:141
 msgid "File Type"
 msgstr "Filtype"
 
-#: ardour_ui_ed.cc:112 export_format_dialog.cc:67
+#: ardour_ui_ed.cc:142 export_format_dialog.cc:75
 msgid "Sample Format"
 msgstr "Punktformat"
 
-#: ardour_ui_ed.cc:113 rc_option_editor.cc:2245 rc_option_editor.cc:2257
+#: ardour_ui_ed.cc:143 rc_option_editor.cc:2841
 msgid "Control Surfaces"
 msgstr "Kontrollflater"
 
-#: ardour_ui_ed.cc:114 rc_option_editor.cc:1921 rc_option_editor.cc:2264
+#: ardour_ui_ed.cc:144 rc_option_editor.cc:2847 rc_option_editor.cc:2853
+#: rc_option_editor.cc:2862 rc_option_editor.cc:2873 rc_option_editor.cc:2883
+#: rc_option_editor.cc:2945 rc_option_editor.cc:2962 rc_option_editor.cc:2978
+#: rc_option_editor.cc:2979 rc_option_editor.cc:2988 rc_option_editor.cc:3002
+#: rc_option_editor.cc:3005 rc_option_editor.cc:3013 rc_option_editor.cc:3021
 msgid "Plugins"
 msgstr "Utvidingar"
 
-#: ardour_ui_ed.cc:115 rc_option_editor.cc:2351
+#: ardour_ui_ed.cc:145 rc_option_editor.cc:3169
 msgid "Metering"
 msgstr "Nivåmåling"
 
-#: ardour_ui_ed.cc:116
+#: ardour_ui_ed.cc:146
 msgid "Fall Off Rate"
 msgstr "Slepprate"
 
-#: ardour_ui_ed.cc:117
+#: ardour_ui_ed.cc:147
 msgid "Hold Time"
 msgstr "Haldetid"
 
-#: ardour_ui_ed.cc:118
+#: ardour_ui_ed.cc:148
 msgid "Denormal Handling"
 msgstr "Handtering av unormale hendingar"
 
-#: ardour_ui_ed.cc:122 route_time_axis.cc:1677
+#: ardour_ui_ed.cc:152 route_time_axis.cc:1683
 msgid "New..."
 msgstr "Ny..."
 
-#: ardour_ui_ed.cc:124
+#: ardour_ui_ed.cc:154
 msgid "Open..."
 msgstr "Opna..."
 
-#: ardour_ui_ed.cc:125
+#: ardour_ui_ed.cc:155
 msgid "Recent..."
 msgstr "Siste..."
 
-#: ardour_ui_ed.cc:126 panner_editor.cc:29 playlist_selector.cc:64
+#: ardour_ui_ed.cc:156 panner_editor.cc:29 playlist_selector.cc:64
 msgid "Close"
 msgstr "Lukk"
 
-#: ardour_ui_ed.cc:129
+#: ardour_ui_ed.cc:159
 msgid "Add Track or Bus..."
 msgstr "Legg til spor eller buss..."
 
-#: ardour_ui_ed.cc:134
-msgid "Open Video"
+#: ardour_ui_ed.cc:163
+msgid "Duplicate Tracks/Busses..."
+msgstr ""
+
+#: ardour_ui_ed.cc:169
+msgid "Cancel Solo"
 msgstr ""
 
-#: ardour_ui_ed.cc:137
+#: ardour_ui_ed.cc:173
+msgid "Session|Scripting"
+msgstr ""
+
+#: ardour_ui_ed.cc:176
+msgid "Add Lua Script..."
+msgstr ""
+
+#: ardour_ui_ed.cc:180
+msgid "Remove Lua Script"
+msgstr ""
+
+#: ardour_ui_ed.cc:184
+msgid "Open Video..."
+msgstr ""
+
+#: ardour_ui_ed.cc:187
 msgid "Remove Video"
 msgstr ""
 
-#: ardour_ui_ed.cc:140
-msgid "Export To Video File"
+#: ardour_ui_ed.cc:190
+msgid "Export to Video File..."
 msgstr ""
 
-#: ardour_ui_ed.cc:144
-msgid "Snapshot..."
-msgstr "Snøggbilete..."
+#: ardour_ui_ed.cc:194
+msgid "Snapshot (& keep working on current version) ..."
+msgstr ""
 
-#: ardour_ui_ed.cc:148
+#: ardour_ui_ed.cc:197
+msgid "Snapshot (& switch to new version) ..."
+msgstr ""
+
+#: ardour_ui_ed.cc:200
+msgid "Quick Snapshot (& keep working on current version) ..."
+msgstr ""
+
+#: ardour_ui_ed.cc:203
+msgid "Quick Snapshot (& switch to new version) ..."
+msgstr ""
+
+#: ardour_ui_ed.cc:207
 msgid "Save As..."
 msgstr "Lagra som..."
 
-#: ardour_ui_ed.cc:152 editor_actions.cc:1771 editor_markers.cc:903
-#: editor_snapshots.cc:124 mixer_strip.cc:1518 route_time_axis.cc:1673
+#: ardour_ui_ed.cc:210 editor_actions.cc:1788 editor_markers.cc:908
+#: editor_snapshots.cc:136 mixer_strip.cc:1653 route_time_axis.cc:1679
 msgid "Rename..."
 msgstr "Døyp om..."
 
-#: ardour_ui_ed.cc:156
+#: ardour_ui_ed.cc:214
 msgid "Save Template..."
 msgstr "Lagra mal..."
 
-#: ardour_ui_ed.cc:159
+#: ardour_ui_ed.cc:217
 msgid "Metadata"
 msgstr "Metadata"
 
-#: ardour_ui_ed.cc:162
+#: ardour_ui_ed.cc:220
 msgid "Edit Metadata..."
 msgstr "Endra metadata..."
 
-#: ardour_ui_ed.cc:165
+#: ardour_ui_ed.cc:223
 msgid "Import Metadata..."
 msgstr "Importer metadata..."
 
-#: ardour_ui_ed.cc:168
-msgid "Export To Audio File(s)..."
-msgstr "Eksporter økta til lydfil(er)..."
+#: ardour_ui_ed.cc:226
+msgid "Export to Audio File(s)..."
+msgstr ""
 
-#: ardour_ui_ed.cc:171
+#: ardour_ui_ed.cc:229
 msgid "Stem export..."
 msgstr "Staveksport..."
 
-#: ardour_ui_ed.cc:174 editor_export_audio.cc:65 export_dialog.cc:129
-#: export_video_dialog.cc:84
+#: ardour_ui_ed.cc:232 editor_export_audio.cc:66
+#: export_channel_selector.cc:190 export_channel_selector.cc:578
+#: export_dialog.cc:131 export_video_dialog.cc:80
 msgid "Export"
 msgstr "Eksporter"
 
-#: ardour_ui_ed.cc:177
+#: ardour_ui_ed.cc:235
 msgid "Clean-up Unused Sources..."
 msgstr "Rydd bort ubrukte kjelder..."
 
-#: ardour_ui_ed.cc:181
+#: ardour_ui_ed.cc:239
+msgid "Reset Peak Files"
+msgstr ""
+
+#: ardour_ui_ed.cc:243
 msgid "Flush Wastebasket"
 msgstr "Tøm søppelkorga"
 
-#: ardour_ui_ed.cc:188
+#: ardour_ui_ed.cc:251
 msgid "Quit"
 msgstr "Avslutt"
 
-#: ardour_ui_ed.cc:192
+#: ardour_ui_ed.cc:252 ardour_ui_ed.cc:259 ardour_ui_ed.cc:260
+#: ardour_ui_ed.cc:261 automation_time_axis.cc:545 editor_actions.cc:686
+#: editor_markers.cc:907 location_ui.cc:61 plugin_selector.cc:97
+#: route_time_axis.cc:864
+msgid "Hide"
+msgstr "Gøym"
+
+#: ardour_ui_ed.cc:263 ardour_ui_ed.cc:264 ardour_ui_ed.cc:265
+msgid "Attach"
+msgstr ""
+
+#: ardour_ui_ed.cc:275 ardour_ui_ed.cc:276 ardour_ui_ed.cc:277
+#: ardour_ui_ed.cc:283 ardour_ui_ed.cc:284 ardour_ui_ed.cc:285
+msgid "Change"
+msgstr ""
+
+#: ardour_ui_ed.cc:287
+msgid "Previous Tab"
+msgstr ""
+
+#: ardour_ui_ed.cc:288
+msgid "Next Tab"
+msgstr ""
+
+#: ardour_ui_ed.cc:290
+msgid "Toggle Editor & Mixer"
+msgstr ""
+
+#: ardour_ui_ed.cc:294
 msgid "Maximise Editor Space"
 msgstr "Gje redigeringa mest plass"
 
-#: ardour_ui_ed.cc:193
+#: ardour_ui_ed.cc:295
 msgid "Maximise Mixer Space"
 msgstr ""
 
-#: ardour_ui_ed.cc:194
-msgid "Show Toolbars"
-msgstr "Vis verktylinene"
-
-#: ardour_ui_ed.cc:198
-msgid "Show more UI preferences"
+#: ardour_ui_ed.cc:298
+msgid "Toggle Mixer List"
 msgstr ""
 
-#: ardour_ui_ed.cc:200 mixer_ui.cc:1924 mixer_ui.cc:1930
-msgid "Window|Mixer"
-msgstr "Vindauga|miksar"
+#: ardour_ui_ed.cc:301
+msgid "Toggle Monitor Section Visibility"
+msgstr ""
 
-#: ardour_ui_ed.cc:201
-msgid "Toggle Editor+Mixer"
+#: ardour_ui_ed.cc:305
+msgid "Show more UI preferences"
 msgstr ""
 
-#: ardour_ui_ed.cc:202 meterbridge.cc:218 meterbridge.cc:224
-msgid "Window|Meterbridge"
+#: ardour_ui_ed.cc:308
+msgid "Window|Scripting"
 msgstr ""
 
-#: ardour_ui_ed.cc:204
-msgid "Reattach All Tearoffs"
+#: ardour_ui_ed.cc:309 meterbridge.cc:214 meterbridge.cc:220
+msgid "Window|Meterbridge"
 msgstr ""
 
-#: ardour_ui_ed.cc:206 midi_tracer.cc:45
+#: ardour_ui_ed.cc:311 midi_tracer.cc:45
 msgid "MIDI Tracer"
 msgstr "MIDI-sporar"
 
-#: ardour_ui_ed.cc:208
+#: ardour_ui_ed.cc:314
 msgid "Chat"
 msgstr "Prat"
 
-#: ardour_ui_ed.cc:210
+#: ardour_ui_ed.cc:316
 msgid "Help|Manual"
 msgstr "Hjelp|Rettleiing"
 
-#: ardour_ui_ed.cc:211
-msgid "Reference"
-msgstr "Referanse"
+#: ardour_ui_ed.cc:317
+msgid "Manual|Reference"
+msgstr ""
 
-#: ardour_ui_ed.cc:212
-msgid "Report A Bug"
+#: ardour_ui_ed.cc:318
+msgid "Report a Bug"
 msgstr ""
 
-#: ardour_ui_ed.cc:213
+#: ardour_ui_ed.cc:319
 msgid "Cheat Sheet"
 msgstr ""
 
-#: ardour_ui_ed.cc:214
+#: ardour_ui_ed.cc:320
 msgid "Ardour Website"
 msgstr ""
 
-#: ardour_ui_ed.cc:215
+#: ardour_ui_ed.cc:321
 msgid "Ardour Development"
 msgstr ""
 
-#: ardour_ui_ed.cc:216
+#: ardour_ui_ed.cc:322
 msgid "User Forums"
 msgstr ""
 
-#: ardour_ui_ed.cc:217
-msgid "How to report a bug"
+#: ardour_ui_ed.cc:323
+msgid "How to Report a Bug"
 msgstr ""
 
-#: ardour_ui_ed.cc:219 plugin_ui.cc:419
+#: ardour_ui_ed.cc:325 luawindow.cc:100 luawindow.cc:654 plugin_ui.cc:419
 msgid "Save"
 msgstr "Lagre"
 
-#: ardour_ui_ed.cc:227 rc_option_editor.cc:1419 rc_option_editor.cc:1430
-#: rc_option_editor.cc:1441 rc_option_editor.cc:1450 rc_option_editor.cc:1463
-#: rc_option_editor.cc:1476 rc_option_editor.cc:1485 rc_option_editor.cc:1495
-#: rc_option_editor.cc:1497 rc_option_editor.cc:1506 rc_option_editor.cc:1522
-#: rc_option_editor.cc:1543 rc_option_editor.cc:1561 rc_option_editor.cc:1563
-#: rc_option_editor.cc:1579 rc_option_editor.cc:1582 rc_option_editor.cc:1584
-#: rc_option_editor.cc:1601 rc_option_editor.cc:1612
+#: ardour_ui_ed.cc:333 rc_option_editor.cc:1975 rc_option_editor.cc:1986
+#: rc_option_editor.cc:1997 rc_option_editor.cc:2008 rc_option_editor.cc:2017
+#: rc_option_editor.cc:2030 rc_option_editor.cc:2043 rc_option_editor.cc:2052
+#: rc_option_editor.cc:2062 rc_option_editor.cc:2079 rc_option_editor.cc:2186
 msgid "Transport"
 msgstr "Speling"
 
-#: ardour_ui_ed.cc:233
+#: ardour_ui_ed.cc:339 engine_dialog.cc:88
 msgid "Stop"
 msgstr "Stopp"
 
-#: ardour_ui_ed.cc:236
+#: ardour_ui_ed.cc:342
 msgid "Roll"
 msgstr "Rull"
 
-#: ardour_ui_ed.cc:240 ardour_ui_ed.cc:243
+#: ardour_ui_ed.cc:346 ardour_ui_ed.cc:349
 msgid "Start/Stop"
 msgstr "Start/stopp"
 
-#: ardour_ui_ed.cc:246
+#: ardour_ui_ed.cc:352
 msgid "Start/Continue/Stop"
 msgstr "Start/hald fram/stopp"
 
-#: ardour_ui_ed.cc:249
+#: ardour_ui_ed.cc:355
 msgid "Stop and Forget Capture"
 msgstr "Stopp og gløym opptaket"
 
-#: ardour_ui_ed.cc:259
-msgid "Transition To Roll"
-msgstr "Overgang til rulling"
+#: ardour_ui_ed.cc:365
+msgid "Transition to Roll"
+msgstr ""
 
-#: ardour_ui_ed.cc:263
-msgid "Transition To Reverse"
-msgstr "Overgang til baklengs"
+#: ardour_ui_ed.cc:369
+msgid "Transition to Reverse"
+msgstr ""
 
-#: ardour_ui_ed.cc:267
+#: ardour_ui_ed.cc:373
 msgid "Play Loop Range"
 msgstr "Spel lykkje-området"
 
-#: ardour_ui_ed.cc:270
+#: ardour_ui_ed.cc:376
 msgid "Play Selection"
 msgstr ""
 
-#: ardour_ui_ed.cc:273
+#: ardour_ui_ed.cc:379
 msgid "Play Selection w/Preroll"
 msgstr "Spel utvalet m/førrull"
 
-#: ardour_ui_ed.cc:277
+#: ardour_ui_ed.cc:383
 msgid "Enable Record"
 msgstr "Skru på opptak"
 
-#: ardour_ui_ed.cc:280 ardour_ui_ed.cc:284
+#: ardour_ui_ed.cc:386 ardour_ui_ed.cc:390
 msgid "Start Recording"
 msgstr "Start opptak"
 
-#: ardour_ui_ed.cc:288
+#: ardour_ui_ed.cc:394
 msgid "Rewind"
 msgstr "Spol bakover"
 
-#: ardour_ui_ed.cc:291
+#: ardour_ui_ed.cc:397
 msgid "Rewind (Slow)"
 msgstr "Spol sakte bakover"
 
-#: ardour_ui_ed.cc:294
+#: ardour_ui_ed.cc:400
 msgid "Rewind (Fast)"
 msgstr "Spol fort bakover"
 
-#: ardour_ui_ed.cc:297
+#: ardour_ui_ed.cc:403
 msgid "Forward"
 msgstr "Framover"
 
-#: ardour_ui_ed.cc:300
+#: ardour_ui_ed.cc:406
 msgid "Forward (Slow)"
 msgstr "Spol sakte framover"
 
-#: ardour_ui_ed.cc:303
+#: ardour_ui_ed.cc:409
 msgid "Forward (Fast)"
 msgstr "Spol fort framover"
 
-#: ardour_ui_ed.cc:306
+#: ardour_ui_ed.cc:412
 msgid "Go to Zero"
 msgstr "GÃ¥ til null"
 
-#: ardour_ui_ed.cc:309 ardour_ui_ed.cc:312
+#: ardour_ui_ed.cc:415 ardour_ui_ed.cc:418
 msgid "Go to Start"
 msgstr "GÃ¥ til starten"
 
-#: ardour_ui_ed.cc:315
+#: ardour_ui_ed.cc:421
 msgid "Go to End"
 msgstr "GÃ¥ til slutten"
 
-#: ardour_ui_ed.cc:318
+#: ardour_ui_ed.cc:424
 msgid "Go to Wall Clock"
 msgstr "GÃ¥ til Veggur"
 
-#: ardour_ui_ed.cc:323 ardour_ui_ed.cc:326
+#: ardour_ui_ed.cc:429 ardour_ui_ed.cc:432
 msgid "Numpad Decimal"
 msgstr ""
 
-#: ardour_ui_ed.cc:329
+#: ardour_ui_ed.cc:435
 msgid "Numpad 0"
 msgstr ""
 
-#: ardour_ui_ed.cc:332
+#: ardour_ui_ed.cc:438
 msgid "Numpad 1"
 msgstr ""
 
-#: ardour_ui_ed.cc:335
+#: ardour_ui_ed.cc:441
 msgid "Numpad 2"
 msgstr ""
 
-#: ardour_ui_ed.cc:338
+#: ardour_ui_ed.cc:444
 msgid "Numpad 3"
 msgstr ""
 
-#: ardour_ui_ed.cc:341
+#: ardour_ui_ed.cc:447
 msgid "Numpad 4"
 msgstr ""
 
-#: ardour_ui_ed.cc:344
+#: ardour_ui_ed.cc:450
 msgid "Numpad 5"
 msgstr ""
 
-#: ardour_ui_ed.cc:347
+#: ardour_ui_ed.cc:453
 msgid "Numpad 6"
 msgstr ""
 
-#: ardour_ui_ed.cc:350
+#: ardour_ui_ed.cc:456
 msgid "Numpad 7"
 msgstr ""
 
-#: ardour_ui_ed.cc:353
+#: ardour_ui_ed.cc:459
 msgid "Numpad 8"
 msgstr ""
 
-#: ardour_ui_ed.cc:356
+#: ardour_ui_ed.cc:462
 msgid "Numpad 9"
 msgstr ""
 
-#: ardour_ui_ed.cc:360
+#: ardour_ui_ed.cc:466
 msgid "Focus On Clock"
 msgstr "Fokuser på klokka"
 
-#: ardour_ui_ed.cc:364 ardour_ui_ed.cc:373 audio_clock.cc:2091 editor.cc:258
-#: editor_actions.cc:569 editor_actions.cc:578 export_timespan_selector.cc:88
+#: ardour_ui_ed.cc:470 ardour_ui_ed.cc:479 audio_clock.cc:2122 editor.cc:321
+#: editor_actions.cc:610 editor_actions.cc:619 export_timespan_selector.cc:85
 #: session_option_editor.cc:41 session_option_editor.cc:61
 #: session_option_editor.cc:80 session_option_editor.cc:96
 #: session_option_editor.cc:109 session_option_editor.cc:122
@@ -2048,125 +2423,137 @@ msgstr "Fokuser på klokka"
 msgid "Timecode"
 msgstr "Tidskode"
 
-#: ardour_ui_ed.cc:366 ardour_ui_ed.cc:375 editor_actions.cc:567
+#: ardour_ui_ed.cc:472 ardour_ui_ed.cc:481 editor_actions.cc:608
 msgid "Bars & Beats"
 msgstr "Takter og taktslag"
 
-#: ardour_ui_ed.cc:368 ardour_ui_ed.cc:377
+#: ardour_ui_ed.cc:474 ardour_ui_ed.cc:483
 msgid "Minutes & Seconds"
 msgstr "Minutt og sekund"
 
-#: ardour_ui_ed.cc:370 ardour_ui_ed.cc:379 audio_clock.cc:2095 editor.cc:259
-#: editor_actions.cc:568
+#: ardour_ui_ed.cc:476 ardour_ui_ed.cc:485 audio_clock.cc:2125 editor.cc:322
+#: editor_actions.cc:609
 msgid "Samples"
 msgstr "Punktprøver"
 
-#: ardour_ui_ed.cc:382
+#: ardour_ui_ed.cc:488
 msgid "Punch In"
 msgstr "Slå inn"
 
-#: ardour_ui_ed.cc:383 mixer_strip.cc:1819 mixer_strip.cc:1843
-#: mixer_strip.cc:2007 route_ui.cc:162 time_info_box.cc:116
+#: ardour_ui_ed.cc:489 mixer_strip.cc:1992 mixer_strip.cc:2193 route_ui.cc:187
+#: time_info_box.cc:110
 msgid "In"
 msgstr "Inn"
 
-#: ardour_ui_ed.cc:386
+#: ardour_ui_ed.cc:492
 msgid "Punch Out"
 msgstr "Slå ut"
 
-#: ardour_ui_ed.cc:387 mixer_strip.cc:1831 time_info_box.cc:117
+#: ardour_ui_ed.cc:493 mixer_strip.cc:2004 time_info_box.cc:111
 msgid "Out"
 msgstr "Ut"
 
-#: ardour_ui_ed.cc:390
+#: ardour_ui_ed.cc:496
 msgid "Punch In/Out"
 msgstr "Slå inn og ut"
 
-#: ardour_ui_ed.cc:391
+#: ardour_ui_ed.cc:497
 msgid "In/Out"
 msgstr "Inn/ut"
 
-#: ardour_ui_ed.cc:394 rc_option_editor.cc:1376
+#: ardour_ui_ed.cc:500 rc_option_editor.cc:1941
 msgid "Click"
 msgstr "Klikk"
 
-#: ardour_ui_ed.cc:397
+#: ardour_ui_ed.cc:503
 msgid "Auto Input"
 msgstr "Autoinngang"
 
-#: ardour_ui_ed.cc:400
+#: ardour_ui_ed.cc:506
 msgid "Auto Play"
 msgstr "Autospel"
 
-#: ardour_ui_ed.cc:411
+#: ardour_ui_ed.cc:517
 msgid "Sync Startup to Video"
 msgstr "Synk oppstart til video"
 
-#: ardour_ui_ed.cc:413
+#: ardour_ui_ed.cc:519
 msgid "Time Master"
 msgstr "Hovudklokke"
 
-#: ardour_ui_ed.cc:420
+#: ardour_ui_ed.cc:521
+msgid "Use External Positional Sync Source"
+msgstr ""
+
+#: ardour_ui_ed.cc:526
 msgid "Toggle Record Enable Track %1"
 msgstr "Skru på/av opptak for spor %1"
 
-#: ardour_ui_ed.cc:427
+#: ardour_ui_ed.cc:533
 msgid "Percentage"
 msgstr "Prosent"
 
-#: ardour_ui_ed.cc:428 shuttle_control.cc:178
+#: ardour_ui_ed.cc:534 shuttle_control.cc:205
 msgid "Semitones"
 msgstr "Halvtonar"
 
-#: ardour_ui_ed.cc:432
+#: ardour_ui_ed.cc:538
 msgid "Send MTC"
 msgstr "Send MTC (Midi Time Code)"
 
-#: ardour_ui_ed.cc:434
+#: ardour_ui_ed.cc:540
 msgid "Send MMC"
 msgstr "Send MMC (Midi Machine Control)"
 
-#: ardour_ui_ed.cc:436
+#: ardour_ui_ed.cc:542
 msgid "Use MMC"
 msgstr "Bruk MMC (Midi Machine Control)"
 
-#: ardour_ui_ed.cc:438 rc_option_editor.cc:2097
+#: ardour_ui_ed.cc:544 rc_option_editor.cc:2730
 msgid "Send MIDI Clock"
 msgstr "Send MIDI-klokke"
 
-#: ardour_ui_ed.cc:440
+#: ardour_ui_ed.cc:546
 msgid "Send MIDI Feedback"
 msgstr "Send MIDI-svar"
 
-#: ardour_ui_ed.cc:446
+#: ardour_ui_ed.cc:552
 msgid "Panic"
 msgstr "Panikk"
 
-#: ardour_ui_ed.cc:534
+#: ardour_ui_ed.cc:629
 msgid "Wall Clock"
 msgstr "Veggur"
 
-#: ardour_ui_ed.cc:536
+#: ardour_ui_ed.cc:631
 msgid "Disk Space"
 msgstr "Diskplass"
 
-#: ardour_ui_ed.cc:537
+#: ardour_ui_ed.cc:632
 msgid "DSP"
 msgstr "DSP"
 
-#: ardour_ui_ed.cc:538
+#: ardour_ui_ed.cc:633
+msgid "X-run"
+msgstr ""
+
+#: ardour_ui_ed.cc:634
+msgid "Active Peak-file Work"
+msgstr ""
+
+#: ardour_ui_ed.cc:635
 msgid "Buffers"
 msgstr "Bufrar"
 
-#: ardour_ui_ed.cc:540
+#: ardour_ui_ed.cc:637
 msgid "Timecode Format"
 msgstr "Tidskodeformat"
 
-#: ardour_ui_ed.cc:541
+#: ardour_ui_ed.cc:638
 msgid "File Format"
 msgstr "Filformat"
 
-#: ardour_ui_options.cc:63
+#: ardour_ui_options.cc:55
 msgid ""
 "It is not possible to use JACK as the the sync source\n"
 "when the pull up/down setting is non-zero."
@@ -2174,133 +2561,138 @@ msgstr ""
 "Du kan ikkje bruka JACK som synkkjelde\n"
 "når ned- og opptrekk-instillinga ikkje er null."
 
-#: ardour_ui_options.cc:317
+#: ardour_ui_options.cc:309
 msgid "Internal"
 msgstr "Intern"
 
-#: ardour_ui_options.cc:498
+#: ardour_ui_options.cc:518
 msgid "Enable/Disable external positional sync"
 msgstr "Skru på/av ekstern posisjonssynk"
 
-#: ardour_ui_options.cc:500
+#: ardour_ui_options.cc:520
 msgid "Sync to JACK is not possible: video pull up/down is set"
 msgstr "Ikkje mogleg å synka til JACK: opp- og nedtrekk for video er fastsett"
 
-#: audio_clock.cc:1047 audio_clock.cc:1066
+#: audio_clock.cc:1057 audio_clock.cc:1076
 msgid "--pending--"
 msgstr "--ventar--"
 
-#: audio_clock.cc:1118
+#: audio_clock.cc:1128
 msgid "SR"
 msgstr "SR"
 
-#: audio_clock.cc:1124 audio_clock.cc:1128
+#: audio_clock.cc:1134 audio_clock.cc:1138
 msgid "Pull"
 msgstr "Dra"
 
-#: audio_clock.cc:1126
+#: audio_clock.cc:1136
 #, c-format
 msgid "%+.4f%%"
 msgstr "%+.4f%%"
 
-#: audio_clock.cc:1282 editor.cc:260 editor_actions.cc:139
-#: editor_actions.cc:561
+#: audio_clock.cc:1292 editor.cc:323 editor_actions.cc:142
+#: editor_actions.cc:602
 msgid "Tempo"
 msgstr "Tempo"
 
-#: audio_clock.cc:1286 editor.cc:261 editor_actions.cc:562
+#: audio_clock.cc:1296 editor.cc:324 editor_actions.cc:603
 msgid "Meter"
 msgstr "Taktart"
 
-#: audio_clock.cc:1864 audio_streamview.cc:115 editor_actions.cc:1089
-#: session_metadata_dialog.cc:452 session_metadata_dialog.cc:500
-#: session_metadata_dialog.cc:556 session_metadata_dialog.cc:845
-#: streamview.cc:470
+#: audio_clock.cc:1878 audio_streamview.cc:117 editor_actions.cc:1092
+#: luainstance.cc:959 luainstance.cc:1575 plugin_pin_dialog.cc:859
+#: plugin_selector.cc:995 plugin_selector.cc:1016
+#: session_metadata_dialog.cc:455 session_metadata_dialog.cc:503
+#: session_metadata_dialog.cc:559 session_metadata_dialog.cc:848
+#: streamview.cc:474
 msgid "programming error: %1"
 msgstr "Programmeringsfeil: %1"
 
-#: audio_clock.cc:1997 audio_clock.cc:2025
+#: audio_clock.cc:2011 audio_clock.cc:2039
 msgid "programming error: %1 %2"
 msgstr "programmeringsfeil: %1 %2"
 
-#: audio_clock.cc:2093 editor.cc:257 export_timespan_selector.cc:98
+#: audio_clock.cc:2123 editor.cc:320 export_timespan_selector.cc:95
 msgid "Bars:Beats"
 msgstr "Takter:Taktslag"
 
-#: audio_clock.cc:2094 export_timespan_selector.cc:93
+#: audio_clock.cc:2124 export_timespan_selector.cc:90
 msgid "Minutes:Seconds"
 msgstr "Minutt:sekund"
 
-#: audio_clock.cc:2099
-msgid "Set From Playhead"
-msgstr "Set ut frå spelehovudet"
+#: audio_clock.cc:2129
+msgid "Set from Playhead"
+msgstr ""
 
-#: audio_clock.cc:2100
+#: audio_clock.cc:2130
 msgid "Locate to This Time"
 msgstr "GÃ¥ hit"
 
-#: audio_region_editor.cc:64 control_point_dialog.cc:49 rhythm_ferret.cc:124
-#: rhythm_ferret.cc:129 rhythm_ferret.cc:134
+#: audio_clock.cc:2133
+msgid "Copy to clipboard"
+msgstr ""
+
+#: audio_region_editor.cc:60 control_point_dialog.cc:49 rhythm_ferret.cc:137
+#: rhythm_ferret.cc:154
 msgid "dB"
 msgstr "dB"
 
-#: audio_region_editor.cc:67
+#: audio_region_editor.cc:63
 msgid "Region gain:"
 msgstr "Bolkvolum:"
 
-#: audio_region_editor.cc:77 export_format_dialog.cc:43
+#: audio_region_editor.cc:73 export_format_dialog.cc:49 export_report.cc:772
+#: export_report.cc:1185 fft_graph.cc:370
 msgid "dBFS"
 msgstr "duFS"
 
-#: audio_region_editor.cc:80
+#: audio_region_editor.cc:76
 msgid "Peak amplitude:"
 msgstr "Toppvolum:"
 
-#: audio_region_editor.cc:91
+#: audio_region_editor.cc:87
 msgid "Calculating..."
 msgstr "Reknar..."
 
-#: audio_region_view.cc:1243
+#: audio_region_view.cc:1385
 msgid "add gain control point"
 msgstr "legg til volumkontrollpunkt"
 
-#: automation_controller.cc:286 automation_controller.cc:302
+#: automation_controller.cc:304 automation_controller.cc:320
 msgid "Select Note..."
 msgstr ""
 
-#: automation_controller.cc:293
+#: automation_controller.cc:311
 msgid "Halve"
 msgstr ""
 
-#: automation_controller.cc:296
+#: automation_controller.cc:314
 msgid "Double"
 msgstr ""
 
-#: automation_controller.cc:307
-msgid "Set to %1 beat(s)"
-msgstr ""
+#: automation_controller.cc:325
+msgid "Set to %1 beat"
+msgid_plural "Set to %1 beats"
+msgstr[0] ""
+msgstr[1] ""
 
-#: automation_line.cc:286 automation_line.cc:462
+#: automation_line.cc:292 editor_drag.cc:4388
 msgid "automation event move"
 msgstr "flytt automasjonspunkt"
 
-#: automation_line.cc:488 automation_line.cc:508
-msgid "automation range move"
-msgstr "flytt automasjonsområde"
-
-#: automation_line.cc:880 region_gain_line.cc:72
+#: automation_line.cc:888 region_gain_line.cc:75
 msgid "remove control point"
 msgstr "fjern kontrollpunkt"
 
-#: automation_line.cc:1003
+#: automation_line.cc:1013
 msgid "Ignoring illegal points on AutomationLine \"%1\""
 msgstr "Ser bort frå ulovlege punkt på Automasjonslinja \"%1\""
 
-#: automation_region_view.cc:190 automation_time_axis.cc:644
+#: automation_region_view.cc:193 automation_time_axis.cc:649
 msgid "add automation event"
 msgstr "legg til ei automasjonshending"
 
-#: automation_streamview.cc:95
+#: automation_streamview.cc:94
 msgid "unable to display automation region for control without list"
 msgstr ""
 
@@ -2312,63 +2704,59 @@ msgstr "automasjonstilstand"
 msgid "hide track"
 msgstr "gøym spor"
 
-#: automation_time_axis.cc:308 automation_time_axis.cc:360
-#: automation_time_axis.cc:554 gain_meter.cc:220 generic_pluginui.cc:523
-#: generic_pluginui.cc:817 panner_ui.cc:151
+#: automation_time_axis.cc:310 automation_time_axis.cc:362
+#: automation_time_axis.cc:556 gain_meter.cc:230 generic_pluginui.cc:590
+#: generic_pluginui.cc:934 panner_ui.cc:151
 msgid "Automation|Manual"
 msgstr "Automasjon|Manuell"
 
-#: automation_time_axis.cc:310 automation_time_axis.cc:371
-#: automation_time_axis.cc:559 editor.cc:1904 editor.cc:1981
-#: editor_actions.cc:122 editor_actions.cc:1920 gain_meter.cc:223
-#: generic_pluginui.cc:99 generic_pluginui.cc:526 generic_pluginui.cc:819
-#: midi_time_axis.cc:1606 midi_time_axis.cc:1609 midi_time_axis.cc:1612
+#: automation_time_axis.cc:312 automation_time_axis.cc:373
+#: automation_time_axis.cc:561 editor.cc:2033 editor.cc:2111
+#: editor_actions.cc:125 editor_actions.cc:1937 gain_meter.cc:232
+#: generic_pluginui.cc:100 generic_pluginui.cc:593 generic_pluginui.cc:936
+#: midi_time_axis.cc:1610 midi_time_axis.cc:1613 midi_time_axis.cc:1616
 #: panner_ui.cc:154
 msgid "Play"
 msgstr "Spel"
 
-#: automation_time_axis.cc:312 automation_time_axis.cc:382
-#: automation_time_axis.cc:564 gain_meter.cc:226 generic_pluginui.cc:101
-#: generic_pluginui.cc:529 generic_pluginui.cc:821 panner_ui.cc:157
+#: automation_time_axis.cc:314 automation_time_axis.cc:384
+#: automation_time_axis.cc:566 gain_meter.cc:234 generic_pluginui.cc:102
+#: generic_pluginui.cc:596 generic_pluginui.cc:938 panner_ui.cc:157
 msgid "Write"
 msgstr "Skriv"
 
-#: automation_time_axis.cc:314 automation_time_axis.cc:393
-#: automation_time_axis.cc:569 gain_meter.cc:229 generic_pluginui.cc:103
-#: generic_pluginui.cc:532 generic_pluginui.cc:823 panner_ui.cc:160
+#: automation_time_axis.cc:316 automation_time_axis.cc:395
+#: automation_time_axis.cc:571 gain_meter.cc:236 generic_pluginui.cc:104
+#: generic_pluginui.cc:599 generic_pluginui.cc:940 panner_ui.cc:160
 msgid "Touch"
 msgstr "Rør"
 
-#: automation_time_axis.cc:404 generic_pluginui.cc:535 meter_patterns.cc:112
+#: automation_time_axis.cc:406 generic_pluginui.cc:602 meter_patterns.cc:118
 msgid "???"
 msgstr "???"
 
-#: automation_time_axis.cc:445
+#: automation_time_axis.cc:447
 msgid "clear automation"
 msgstr "tøm automasjon"
 
-#: automation_time_axis.cc:543 editor_actions.cc:645 editor_markers.cc:902
-#: location_ui.cc:57 plugin_selector.cc:86 route_time_axis.cc:854
-msgid "Hide"
-msgstr "Gøym"
-
-#: automation_time_axis.cc:545
+#: automation_time_axis.cc:547 rc_option_editor.cc:2916
+#: rc_option_editor.cc:2921 rc_option_editor.cc:2967 rc_option_editor.cc:2972
 msgid "Clear"
 msgstr "Tøm"
 
-#: automation_time_axis.cc:576
+#: automation_time_axis.cc:578
 msgid "State"
 msgstr "Tilstand"
 
-#: automation_time_axis.cc:592
+#: automation_time_axis.cc:594
 msgid "Discrete"
 msgstr "Diskret"
 
-#: automation_time_axis.cc:598 export_format_dialog.cc:485
+#: automation_time_axis.cc:600 export_format_dialog.cc:552
 msgid "Linear"
 msgstr "Rettlinja"
 
-#: automation_time_axis.cc:604 rhythm_ferret.cc:109 shuttle_control.cc:197
+#: automation_time_axis.cc:606 rhythm_ferret.cc:118 shuttle_control.cc:224
 msgid "Mode"
 msgstr "Modus"
 
@@ -2384,35 +2772,38 @@ msgstr "Endra bundelen"
 msgid "Direction:"
 msgstr "Retning:"
 
-#: bundle_manager.cc:206 bundle_manager.cc:210 engine_dialog.cc:662
-#: mixer_strip.cc:162 mixer_strip.cc:367 mixer_strip.cc:2240
-#: rc_option_editor.cc:2326
+#: bundle_manager.cc:206 bundle_manager.cc:210 engine_dialog.cc:976
+#: mixer_strip.cc:175 mixer_strip.cc:392 mixer_strip.cc:2451
+#: rc_option_editor.cc:3135
 msgid "Input"
 msgstr "Inngang"
 
 #: bundle_manager.cc:207 bundle_manager.cc:212 bundle_manager.cc:246
-#: engine_dialog.cc:664 mixer_strip.cc:166 mixer_strip.cc:371
-#: mixer_strip.cc:2243 rc_option_editor.cc:2330
+#: engine_dialog.cc:978 mixer_strip.cc:179 mixer_strip.cc:396
+#: mixer_strip.cc:2454 monitor_section.cc:296 monitor_section.cc:300
+#: rc_option_editor.cc:3139
 msgid "Output"
 msgstr "Utgang"
 
-#: bundle_manager.cc:265 editor.cc:1945 editor_actions.cc:94
-#: editor_actions.cc:104 rc_option_editor.cc:1087 rc_option_editor.cc:1094
+#: bundle_manager.cc:265 editor.cc:2075 editor_actions.cc:97
+#: editor_actions.cc:107 lua_script_manager.cc:33 rc_option_editor.cc:2928
+#: rc_option_editor.cc:2942
 msgid "Edit"
 msgstr "Rediger"
 
-#: bundle_manager.cc:266 editor.cc:5902 editor.cc:5930 editor_actions.cc:338
-#: editor_actions.cc:339 editor_actions.cc:405 plugin_ui.cc:420
-#: processor_box.cc:2458 route_time_axis.cc:859
+#: bundle_manager.cc:266 editor.cc:5962 editor.cc:5992 editor_actions.cc:360
+#: editor_actions.cc:361 luawindow.cc:101 plugin_ui.cc:420
+#: processor_box.cc:3669 processor_box.cc:3671
 msgid "Delete"
 msgstr "Slett"
 
-#: bundle_manager.cc:272 bundle_manager.cc:439 editor_route_groups.cc:97
-#: editor_routes.cc:206 midi_list_editor.cc:107 session_metadata_dialog.cc:646
+#: bundle_manager.cc:272 bundle_manager.cc:439 editor_route_groups.cc:98
+#: editor_routes.cc:233 lua_script_manager.cc:42 lua_script_manager.cc:76
+#: midi_list_editor.cc:107 session_metadata_dialog.cc:649
 msgid "Name"
 msgstr "Namn"
 
-#: bundle_manager.cc:283
+#: bundle_manager.cc:283 luawindow.cc:566
 msgid "New"
 msgstr "Ny"
 
@@ -2428,6 +2819,39 @@ msgstr "Legg til kanal"
 msgid "Rename Channel"
 msgstr "Døyp om kanalen"
 
+#: color_theme_manager.cc:58
+msgid "Restore Defaults"
+msgstr "Nullstill til standard"
+
+#: color_theme_manager.cc:62
+msgid "Color Theme"
+msgstr ""
+
+#: color_theme_manager.cc:126
+msgid "Object"
+msgstr "Objekt"
+
+#: color_theme_manager.cc:129 route_group_dialog.cc:53
+#: route_group_dialog.cc:81
+msgid "Color"
+msgstr "Farge"
+
+#: color_theme_manager.cc:151
+msgid "Items"
+msgstr ""
+
+#: color_theme_manager.cc:152
+msgid "Palette"
+msgstr ""
+
+#: color_theme_manager.cc:153
+msgid "Transparency"
+msgstr ""
+
+#: color_theme_manager.cc:475
+msgid "Color Palette"
+msgstr ""
+
 #: configinfo.cc:28
 msgid "Build Configuration"
 msgstr "Byggjeoppsett"
@@ -2440,9 +2864,45 @@ msgstr "Kontrollpunkt"
 msgid "Value"
 msgstr "Verdi"
 
-#: edit_note_dialog.cc:42
-msgid "Note"
-msgstr "Note"
+#: control_slave_ui.cc:50 mixer_ui.cc:254
+msgid "Control Masters"
+msgstr ""
+
+#: control_slave_ui.cc:54
+msgid "-vca-"
+msgstr ""
+
+#: control_slave_ui.cc:211
+msgid "Unassign All"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:35
+msgid "Duplicate Tracks & Busses"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:36
+msgid "Copy playlists"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:37
+msgid "Create new (empty) playlists"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:38
+msgid "Share playlists"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:41
+msgid "Duplicate each track/bus this number of times:"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:176
+msgid "1 or more tracks/busses could not be duplicated"
+msgstr ""
+
+#: edit_note_dialog.cc:42
+msgid "Note"
+msgstr "Note"
 
 #: edit_note_dialog.cc:45
 msgid "Set selected notes to this channel"
@@ -2477,591 +2937,597 @@ msgstr "Tonehøgd"
 msgid "Velocity"
 msgstr "Fart"
 
-#: edit_note_dialog.cc:88 patch_change_dialog.cc:66
+#: edit_note_dialog.cc:88 export_report.cc:246 export_report.cc:688
+#: patch_change_dialog.cc:66
 msgid "Time"
 msgstr "Tid"
 
-#: edit_note_dialog.cc:98 editor_regions.cc:115
-#: export_timespan_selector.cc:378 export_timespan_selector.cc:440
-#: location_ui.cc:320 midi_list_editor.cc:115 time_info_box.cc:108
+#: edit_note_dialog.cc:99 editor_regions.cc:162
+#: export_timespan_selector.cc:375 export_timespan_selector.cc:437
+#: location_ui.cc:322 midi_list_editor.cc:115 time_info_box.cc:102
 msgid "Length"
 msgstr "Lengd"
 
-#: edit_note_dialog.cc:165
+#: edit_note_dialog.cc:166
 msgid "edit note"
 msgstr "endra noten"
 
-#: editor.cc:147
+#: editor.cc:160
 msgid "CD Frames"
 msgstr "CD-rammer"
 
-#: editor.cc:148
+#: editor.cc:161
 msgid "TC Frames"
 msgstr ""
 
-#: editor.cc:149
+#: editor.cc:162
 msgid "TC Seconds"
 msgstr ""
 
-#: editor.cc:150
+#: editor.cc:163
 msgid "TC Minutes"
 msgstr ""
 
-#: editor.cc:151
+#: editor.cc:164
 msgid "Seconds"
 msgstr "Sekund"
 
-#: editor.cc:152
+#: editor.cc:165
 msgid "Minutes"
 msgstr "Minutt"
 
-#: editor.cc:153 quantize_dialog.cc:37 quantize_dialog.cc:141
+#: editor.cc:166 quantize_dialog.cc:37
 msgid "Beats/128"
 msgstr "Slag/128"
 
-#: editor.cc:154 quantize_dialog.cc:38 quantize_dialog.cc:143
+#: editor.cc:167 quantize_dialog.cc:38
 msgid "Beats/64"
 msgstr "Slag/64"
 
-#: editor.cc:155 quantize_dialog.cc:39 quantize_dialog.cc:145
+#: editor.cc:168 quantize_dialog.cc:39
 msgid "Beats/32"
 msgstr "Slag/32"
 
-#: editor.cc:156
+#: editor.cc:169 quantize_dialog.cc:40
 msgid "Beats/28"
 msgstr "Slag/28"
 
-#: editor.cc:157
+#: editor.cc:170 quantize_dialog.cc:41
 msgid "Beats/24"
 msgstr "Slag/24"
 
-#: editor.cc:158
+#: editor.cc:171 quantize_dialog.cc:42
 msgid "Beats/20"
 msgstr "Slag/20"
 
-#: editor.cc:159 quantize_dialog.cc:40 quantize_dialog.cc:147
+#: editor.cc:172 quantize_dialog.cc:43
 msgid "Beats/16"
 msgstr "Slag/16"
 
-#: editor.cc:160
+#: editor.cc:173 quantize_dialog.cc:44
 msgid "Beats/14"
 msgstr "Slag/14"
 
-#: editor.cc:161
+#: editor.cc:174 quantize_dialog.cc:45
 msgid "Beats/12"
 msgstr "Slag/12"
 
-#: editor.cc:162
+#: editor.cc:175 quantize_dialog.cc:46
 msgid "Beats/10"
 msgstr "Slag/10"
 
-#: editor.cc:163 quantize_dialog.cc:41 quantize_dialog.cc:149
+#: editor.cc:176 quantize_dialog.cc:47
 msgid "Beats/8"
 msgstr "Slag/8"
 
-#: editor.cc:164
+#: editor.cc:177 quantize_dialog.cc:48
 msgid "Beats/7"
 msgstr "Slag/7"
 
-#: editor.cc:165
+#: editor.cc:178 quantize_dialog.cc:49
 msgid "Beats/6"
 msgstr "Slag/6"
 
-#: editor.cc:166
+#: editor.cc:179 quantize_dialog.cc:50
 msgid "Beats/5"
 msgstr "Slag/5"
 
-#: editor.cc:167 quantize_dialog.cc:42 quantize_dialog.cc:151
+#: editor.cc:180 quantize_dialog.cc:51
 msgid "Beats/4"
 msgstr "Slag/4"
 
-#: editor.cc:168 quantize_dialog.cc:43 quantize_dialog.cc:153
+#: editor.cc:181 quantize_dialog.cc:52
 msgid "Beats/3"
 msgstr "Slag/3"
 
-#: editor.cc:169 quantize_dialog.cc:44 quantize_dialog.cc:155
+#: editor.cc:182 quantize_dialog.cc:53
 msgid "Beats/2"
 msgstr "Slag/2"
 
-#: editor.cc:170 quantize_dialog.cc:45 quantize_dialog.cc:157
+#: editor.cc:183 quantize_dialog.cc:54
 msgid "Beats"
 msgstr "Slag"
 
-#: editor.cc:171
+#: editor.cc:184
 msgid "Bars"
 msgstr "Takter"
 
-#: editor.cc:172
+#: editor.cc:185
 msgid "Marks"
 msgstr "Merke"
 
-#: editor.cc:173
+#: editor.cc:186
 msgid "Region starts"
 msgstr "Bolk-startar"
 
-#: editor.cc:174
+#: editor.cc:187
 msgid "Region ends"
 msgstr "Bolk-endar"
 
-#: editor.cc:175
+#: editor.cc:188
 msgid "Region syncs"
 msgstr "Bolk-synkar"
 
-#: editor.cc:176
+#: editor.cc:189
 msgid "Region bounds"
 msgstr "Bolkgrenser"
 
-#: editor.cc:181 editor_actions.cc:510
+#: editor.cc:194 editor_actions.cc:551
 msgid "No Grid"
 msgstr "Ikkje vis rutenett"
 
-#: editor.cc:182 editor_actions.cc:511
+#: editor.cc:195 editor_actions.cc:552
 msgid "Grid"
 msgstr "Rutenett"
 
-#: editor.cc:183 editor_actions.cc:512
+#: editor.cc:196 editor_actions.cc:553
 msgid "Magnetic"
 msgstr "Magnetisk"
 
-#: editor.cc:188 editor.cc:206 editor_actions.cc:121 editor_actions.cc:493
+#: editor.cc:201 editor.cc:219 editor_actions.cc:124 editor_actions.cc:534
 msgid "Playhead"
 msgstr "Spelehovudet"
 
-#: editor.cc:189 editor_actions.cc:495
+#: editor.cc:202 editor_actions.cc:536
 msgid "Marker"
 msgstr "Markør"
 
-#: editor.cc:190 editor.cc:207 editor_actions.cc:494
+#: editor.cc:203 editor.cc:220 editor_actions.cc:535
 msgid "Mouse"
 msgstr "Mus"
 
-#: editor.cc:195 editor_actions.cc:502
+#: editor.cc:208 editor_actions.cc:543
 msgid "Slide"
 msgstr "Gli"
 
-#: editor.cc:196
+#: editor.cc:209
 msgid "Splice"
 msgstr "Spleis"
 
-#: editor.cc:197 editor_actions.cc:501
+#: editor.cc:210 editor_actions.cc:542
 msgid "Ripple"
 msgstr ""
 
-#: editor.cc:198 editor_actions.cc:157 editor_actions.cc:503
-#: editor_actions.cc:1789 editor_markers.cc:905 editor_rulers.cc:260
-#: location_ui.cc:58 mixer_strip.cc:195 mixer_strip.cc:2028
+#: editor.cc:211 editor_actions.cc:1806 editor_markers.cc:910
+#: editor_rulers.cc:259 location_ui.cc:62
 msgid "Lock"
 msgstr "LÃ¥s"
 
-#: editor.cc:203 mono_panner_editor.cc:42
+#: editor.cc:216 mono_panner_editor.cc:44
 msgid "Left"
 msgstr "Venstre"
 
-#: editor.cc:204 mono_panner_editor.cc:47
+#: editor.cc:217 mono_panner_editor.cc:49
 msgid "Right"
 msgstr "Høgre"
 
-#: editor.cc:205
+#: editor.cc:218
 msgid "Center"
 msgstr "Midten"
 
-#: editor.cc:208 editor.cc:3231
+#: editor.cc:221
 msgid "Edit point"
 msgstr "Redigeringspunkt"
 
-#: editor.cc:214
+#: editor.cc:227
 msgid "Mushy"
 msgstr "Grumsut"
 
-#: editor.cc:215
+#: editor.cc:228
 msgid "Smooth"
 msgstr "Jamn"
 
-#: editor.cc:216
+#: editor.cc:229
 msgid "Balanced multitimbral mixture"
 msgstr "Balansert fleirklangblanding"
 
-#: editor.cc:217
+#: editor.cc:230
 msgid "Unpitched percussion with stable notes"
 msgstr "Jamne perkusjonsnotar utan tonehøgd"
 
-#: editor.cc:218
+#: editor.cc:231
 msgid "Crisp monophonic instrumental"
 msgstr "Skarp instrumental i mono"
 
-#: editor.cc:219
+#: editor.cc:232
 msgid "Unpitched solo percussion"
 msgstr "Jamne perkusjonsnotar utan tonehøgd"
 
-#: editor.cc:220
+#: editor.cc:233
 msgid "Resample without preserving pitch"
 msgstr "Omkod punktfrekvens utan å halda på tonehøgd"
 
-#: editor.cc:256
+#: editor.cc:319
 msgid "Mins:Secs"
 msgstr "Min:Sek"
 
-#: editor.cc:262
+#: editor.cc:325
 msgid "Location Markers"
 msgstr "Stadmarkørar"
 
-#: editor.cc:263
+#: editor.cc:326
 msgid "Range Markers"
 msgstr "Områdemarkørar"
 
-#: editor.cc:264
+#: editor.cc:327
 msgid "Loop/Punch Ranges"
 msgstr "Lykkje-/innslagsområde"
 
-#: editor.cc:265 editor_actions.cc:565
+#: editor.cc:328 editor_actions.cc:606
 msgid "CD Markers"
 msgstr "CD-markørar"
 
-#: editor.cc:266
+#: editor.cc:329
 msgid "Video Timeline"
 msgstr ""
 
-#: editor.cc:283
+#: editor.cc:386
 msgid "mode"
 msgstr "modus"
 
-#: editor.cc:459 editor_actions.cc:114 editor_actions.cc:564
+#: editor.cc:535 editor_actions.cc:117 editor_actions.cc:605
 msgid "Markers"
 msgstr "Markørar"
 
-#: editor.cc:577 rc_option_editor.cc:1939
+#: editor.cc:653 rc_option_editor.cc:2527
 msgid "Regions"
 msgstr "Bolkar"
 
-#: editor.cc:578
+#: editor.cc:654
 msgid "Tracks & Busses"
 msgstr "Spor og bussar"
 
-#: editor.cc:579
+#: editor.cc:655
 msgid "Snapshots"
 msgstr "Snøggbilete"
 
-#: editor.cc:580
+#: editor.cc:656
 msgid "Track & Bus Groups"
 msgstr "Spor- og bussgrupper"
 
-#: editor.cc:581
+#: editor.cc:657
 msgid "Ranges & Marks"
 msgstr "Område og merke"
 
-#: editor.cc:728 editor.cc:5754 rc_option_editor.cc:1619
-#: rc_option_editor.cc:1627 rc_option_editor.cc:1635 rc_option_editor.cc:1643
-#: rc_option_editor.cc:1667 rc_option_editor.cc:1679 rc_option_editor.cc:1681
-#: rc_option_editor.cc:1689 rc_option_editor.cc:1697 rc_option_editor.cc:1717
-#: rc_option_editor.cc:1729 rc_option_editor.cc:1731 rc_option_editor.cc:1733
-#: rc_option_editor.cc:1741 rc_option_editor.cc:1749 rc_option_editor.cc:1757
-#: rc_option_editor.cc:1772 rc_option_editor.cc:1776 rc_option_editor.cc:1800
-msgid "Editor"
-msgstr "Redigering"
-
-#: editor.cc:1331 editor.cc:4735 editor_actions.cc:134 editor_actions.cc:1865
+#: editor.cc:1333 editor.cc:4737 editor_actions.cc:137 editor_actions.cc:1882
 msgid "Loop"
 msgstr "Spel i lykkje"
 
-#: editor.cc:1337 editor.cc:4762 editor_actions.cc:135 time_info_box.cc:68
+#: editor.cc:1339 editor.cc:4764 editor_actions.cc:138 time_info_box.cc:62
 msgid "Punch"
 msgstr "Slå inn/ut"
 
-#: editor.cc:1449 rc_option_editor.cc:1661
+#: editor.cc:1474 rc_option_editor.cc:2299
 msgid "Linear (for highly correlated material)"
 msgstr "Lineært (for særs nivårett materiale)"
 
-#: editor.cc:1459 rc_option_editor.cc:1662
+#: editor.cc:1484 rc_option_editor.cc:2300
 msgid "Constant power"
 msgstr ""
 
-#: editor.cc:1468 rc_option_editor.cc:1663
+#: editor.cc:1493 rc_option_editor.cc:2301
 msgid "Symmetric"
 msgstr "Symmetrisk"
 
-#: editor.cc:1478 rc_option_editor.cc:1664
+#: editor.cc:1503 rc_option_editor.cc:2302
 msgid "Slow"
 msgstr "Sakte"
 
-#: editor.cc:1487 rc_option_editor.cc:1665 sfdb_ui.cc:1771 sfdb_ui.cc:1881
+#: editor.cc:1512 rc_option_editor.cc:2303 sfdb_ui.cc:1737 sfdb_ui.cc:1847
 msgid "Fast"
 msgstr "Fort"
 
-#: editor.cc:1509 editor.cc:1534
+#: editor.cc:1534 editor.cc:1559
 msgid "Deactivate"
 msgstr "Slå av"
 
-#: editor.cc:1511 editor.cc:1536
+#: editor.cc:1536 editor.cc:1561
 msgid "Activate"
 msgstr "Slå på"
 
-#: editor.cc:1637 editor.cc:1645 editor_ops.cc:3824
+#: editor.cc:1662 editor.cc:1670 editor_ops.cc:3921
 msgid "Freeze"
 msgstr "Frys"
 
-#: editor.cc:1641
+#: editor.cc:1666
 msgid "Unfreeze"
 msgstr "U-frys"
 
-#: editor.cc:1780
+#: editor.cc:1766
+msgid "Region Loudness Analysis"
+msgstr ""
+
+#: editor.cc:1785 editor.cc:1834
+msgid "Audio Report/Analysis"
+msgstr ""
+
+#: editor.cc:1815
+msgid "Range Loudness Analysis"
+msgstr ""
+
+#: editor.cc:1901
 msgid "Selected Regions"
 msgstr "Valde bolkar"
 
-#: editor.cc:1816 editor_markers.cc:940
+#: editor.cc:1945 editor_markers.cc:945
 msgid "Play Range"
 msgstr "Spel området"
 
-#: editor.cc:1817 editor_markers.cc:943
+#: editor.cc:1946 editor_markers.cc:948
 msgid "Loop Range"
 msgstr "Spel området i lykkje"
 
-#: editor.cc:1820 editor_markers.cc:950
+#: editor.cc:1949 editor_markers.cc:953
 msgid "Zoom to Range"
 msgstr "Zoom til området"
 
-#: editor.cc:1829 editor_actions.cc:369
+#: editor.cc:1952
+msgid "Loudness Analysis"
+msgstr ""
+
+#: editor.cc:1959 editor_actions.cc:401
 msgid "Move Range Start to Previous Region Boundary"
 msgstr "Flytt områdestarten til førre bolkgrense"
 
-#: editor.cc:1836 editor_actions.cc:376
+#: editor.cc:1966 editor_actions.cc:408
 msgid "Move Range Start to Next Region Boundary"
 msgstr "Flytt områdestarten til neste bolkgrense"
 
-#: editor.cc:1843 editor_actions.cc:383
+#: editor.cc:1973 editor_actions.cc:415
 msgid "Move Range End to Previous Region Boundary"
 msgstr "Flytt områdeslutten til førre bolkgrense"
 
-#: editor.cc:1850 editor_actions.cc:390
+#: editor.cc:1980 editor_actions.cc:422
 msgid "Move Range End to Next Region Boundary"
 msgstr "Flytt områdeslutten til neste bolkgrense"
 
-#: editor.cc:1856 editor_actions.cc:133 editor_actions.cc:325
+#: editor.cc:1986 editor_actions.cc:136 editor_actions.cc:347
 msgid "Separate"
 msgstr "Skil"
 
-#: editor.cc:1857
+#: editor.cc:1987
 msgid "Convert to Region in Region List"
 msgstr "Gjer om til bolk i bolklista"
 
-#: editor.cc:1860 editor_markers.cc:970
+#: editor.cc:1990 editor_markers.cc:973
 msgid "Select All in Range"
 msgstr "Vel alt innan området"
 
-#: editor.cc:1863 editor_actions.cc:297
+#: editor.cc:1993 editor_actions.cc:319
 msgid "Set Loop from Selection"
 msgstr ""
 
-#: editor.cc:1864 editor_actions.cc:298
+#: editor.cc:1994 editor_actions.cc:320
 msgid "Set Punch from Selection"
 msgstr ""
 
-#: editor.cc:1865 editor_actions.cc:299
+#: editor.cc:1995 editor_actions.cc:321
 msgid "Set Session Start/End from Selection"
 msgstr ""
 
-#: editor.cc:1868
+#: editor.cc:1998
 msgid "Add Range Markers"
 msgstr "Legg til områdemarkørar"
 
-#: editor.cc:1871
+#: editor.cc:2001
 msgid "Crop Region to Range"
 msgstr "Skjer bolken til området"
 
-#: editor.cc:1872
-msgid "Fill Range with Region"
-msgstr "Fyll området med bolken"
-
-#: editor.cc:1873 editor_actions.cc:311
+#: editor.cc:2002 editor_actions.cc:333
 msgid "Duplicate Range"
 msgstr "Klon området"
 
-#: editor.cc:1876
+#: editor.cc:2005
 msgid "Consolidate Range"
 msgstr "Sikra området"
 
-#: editor.cc:1877
-msgid "Consolidate Range With Processing"
-msgstr "Sikra området med prosessering"
+#: editor.cc:2006
+msgid "Consolidate Range with Processing"
+msgstr ""
 
-#: editor.cc:1878
+#: editor.cc:2007
 msgid "Bounce Range to Region List"
 msgstr "Miks ned området til bolkliste"
 
-#: editor.cc:1879
-msgid "Bounce Range to Region List With Processing"
-msgstr "Miks ned området til bolkliste med prosessering"
+#: editor.cc:2008
+msgid "Bounce Range to Region List with Processing"
+msgstr ""
 
-#: editor.cc:1880 editor_markers.cc:953
+#: editor.cc:2009 editor_markers.cc:956
 msgid "Export Range..."
 msgstr "Eksporter området..."
 
-#: editor.cc:1882
+#: editor.cc:2011
 msgid "Export Video Range..."
 msgstr ""
 
-#: editor.cc:1898 editor.cc:1979 editor_actions.cc:303
-msgid "Play From Edit Point"
-msgstr "Spel frå redigeringspunktet"
+#: editor.cc:2027 editor.cc:2109 editor_actions.cc:325
+msgid "Play from Edit Point"
+msgstr ""
 
-#: editor.cc:1899 editor.cc:1980
-msgid "Play From Start"
-msgstr "Spel frå starten"
+#: editor.cc:2028 editor.cc:2110
+msgid "Play from Start"
+msgstr ""
 
-#: editor.cc:1900
+#: editor.cc:2029
 msgid "Play Region"
 msgstr "Spel bolken"
 
-#: editor.cc:1902
+#: editor.cc:2031
 msgid "Loop Region"
 msgstr "Spel bolken i lykkje"
 
-#: editor.cc:1912 editor.cc:1989
+#: editor.cc:2041 editor.cc:2119
 msgid "Select All in Track"
 msgstr "Vel heile sporet"
 
-#: editor.cc:1913 editor.cc:1990 editor_actions.cc:194
+#: editor.cc:2042 editor.cc:2120 editor_actions.cc:196
 msgid "Select All Objects"
 msgstr ""
 
-#: editor.cc:1914 editor.cc:1991
+#: editor.cc:2043 editor.cc:2121
 msgid "Invert Selection in Track"
 msgstr "Omvend valet i sporet"
 
-#: editor.cc:1915 editor.cc:1992 editor_actions.cc:197
+#: editor.cc:2044 editor.cc:2122 editor_actions.cc:199
 msgid "Invert Selection"
 msgstr "Omvend utvalet"
 
-#: editor.cc:1917
+#: editor.cc:2046 editor_actions.cc:201
 msgid "Set Range to Loop Range"
 msgstr "Gjer lykkje-området til eige område"
 
-#: editor.cc:1918
+#: editor.cc:2047 editor_actions.cc:202
 msgid "Set Range to Punch Range"
 msgstr "Gjer innslagsområdet til eige område"
 
-#: editor.cc:1920 editor.cc:1994 editor_actions.cc:199 editor_actions.cc:200
+#: editor.cc:2048 editor_actions.cc:203
+msgid "Set Range to Selected Regions"
+msgstr ""
+
+#: editor.cc:2050 editor.cc:2124 editor_actions.cc:205 editor_actions.cc:206
 msgid "Select All After Edit Point"
 msgstr "Vel alt etter redigeringspunktet"
 
-#: editor.cc:1921 editor.cc:1995 editor_actions.cc:201 editor_actions.cc:202
+#: editor.cc:2051 editor.cc:2125 editor_actions.cc:207 editor_actions.cc:208
 msgid "Select All Before Edit Point"
 msgstr "Vel alt før redigeringspunktet"
 
-#: editor.cc:1922 editor.cc:1996
+#: editor.cc:2052 editor.cc:2126
 msgid "Select All After Playhead"
 msgstr "Vel alt etter spelehovudet"
 
-#: editor.cc:1923 editor.cc:1997
+#: editor.cc:2053 editor.cc:2127
 msgid "Select All Before Playhead"
 msgstr "Vel alt før spelehovudet"
 
-#: editor.cc:1924
+#: editor.cc:2054
 msgid "Select All Between Playhead and Edit Point"
 msgstr "Vel alt mellom spelehovudet og redigeringspunktet"
 
-#: editor.cc:1925
+#: editor.cc:2055
 msgid "Select All Within Playhead and Edit Point"
 msgstr "Vel alt innanfor spelehovudet og redigeringspunktet"
 
-#: editor.cc:1926
+#: editor.cc:2056
 msgid "Select Range Between Playhead and Edit Point"
 msgstr "Vel område mellom spelehovudet og redigeringspunktet"
 
-#: editor.cc:1928 editor.cc:1999 editor_actions.cc:131 editor_actions.cc:132
+#: editor.cc:2058 editor.cc:2129 editor_actions.cc:134 editor_actions.cc:135
 msgid "Select"
 msgstr "Vel"
 
-#: editor.cc:1936 editor.cc:2007 editor_actions.cc:337 processor_box.cc:2451
+#: editor.cc:2066 editor.cc:2137 editor_actions.cc:359 processor_box.cc:3665
 msgid "Cut"
 msgstr "Klypp ut"
 
-#: editor.cc:1937 editor.cc:2008 editor_actions.cc:341 processor_box.cc:2454
+#: editor.cc:2067 editor.cc:2138 editor_actions.cc:363 processor_box.cc:3667
 msgid "Copy"
 msgstr "Kopier"
 
-#: editor.cc:1938 editor.cc:2009 editor_actions.cc:342 processor_box.cc:2462
+#: editor.cc:2068 editor.cc:2139 editor_actions.cc:364 processor_box.cc:3679
 msgid "Paste"
 msgstr "Lim inn"
 
-#: editor.cc:1942 editor_actions.cc:91
+#: editor.cc:2072 editor_actions.cc:94
 msgid "Align"
 msgstr "Juster"
 
-#: editor.cc:1943
+#: editor.cc:2073
 msgid "Align Relative"
 msgstr "Juster relativt"
 
-#: editor.cc:1950
+#: editor.cc:2080
 msgid "Insert Selected Region"
 msgstr "Set inn den valde bolken"
 
-#: editor.cc:1951
+#: editor.cc:2081
 msgid "Insert Existing Media"
 msgstr "Set inn eksisterande media"
 
-#: editor.cc:1960 editor.cc:2016
+#: editor.cc:2090 editor.cc:2146
 msgid "Nudge Entire Track Later"
 msgstr "Skubb heile sporet seinare"
 
-#: editor.cc:1961 editor.cc:2017
+#: editor.cc:2091 editor.cc:2147
 msgid "Nudge Track After Edit Point Later"
 msgstr "Skubb sporet etter redigeringspunktet seinare"
 
-#: editor.cc:1962 editor.cc:2018
+#: editor.cc:2092 editor.cc:2148
 msgid "Nudge Entire Track Earlier"
 msgstr "Skubb heile sporet tidlegare"
 
-#: editor.cc:1963 editor.cc:2019
+#: editor.cc:2093 editor.cc:2149
 msgid "Nudge Track After Edit Point Earlier"
 msgstr "Skubb sporet etter redigeringspunktet tidlegare"
 
-#: editor.cc:1965 editor.cc:2021
+#: editor.cc:2095 editor.cc:2151
 msgid "Nudge"
 msgstr "Skubb"
 
-#: editor.cc:2235
+#: editor.cc:2353
 msgid ""
 "Playhead position stored with a negative value - ignored (use zero instead)"
 msgstr ""
 
-#: editor.cc:3006 editor.cc:3707 editor.cc:3778 midi_channel_selector.cc:157
+#: editor.cc:3115 editor.cc:3775 editor.cc:3846 midi_channel_selector.cc:157
 #: midi_channel_selector.cc:395 midi_channel_selector.cc:431
 msgid "All"
 msgstr "Alt"
 
-#: editor.cc:3210
-msgid "Smart Mode (add Range functions to Grab mode)"
+#: editor.cc:3280
+msgid "Smart Mode (add range functions to Grab Mode)"
 msgstr ""
 
-#: editor.cc:3211
+#: editor.cc:3281
 msgid "Grab Mode (select/move objects)"
 msgstr ""
 
-#: editor.cc:3212
+#: editor.cc:3282
 msgid "Cut Mode (split regions)"
 msgstr ""
 
-#: editor.cc:3213
+#: editor.cc:3283
 msgid "Range Mode (select time ranges)"
 msgstr ""
 
-#: editor.cc:3214
+#: editor.cc:3284
 msgid "Draw Mode (draw and edit gain/notes/automation)"
 msgstr ""
 
-#: editor.cc:3215
+#: editor.cc:3285
 msgid "Stretch Mode (time-stretch audio and midi regions, preserving pitch)"
 msgstr ""
 
-#: editor.cc:3216
+#: editor.cc:3286
 msgid "Audition Mode (listen to regions)"
 msgstr ""
 
-#: editor.cc:3217
-msgid "Internal Edit Mode (edit notes and gain curves inside regions)"
+#: editor.cc:3287
+msgid "Internal Edit Mode (edit notes and automation points)"
 msgstr ""
 
-#: editor.cc:3218
+#: editor.cc:3288
 msgid ""
 "Groups: click to (de)activate\n"
 "Context-click for other operations"
@@ -3069,59 +3535,63 @@ msgstr ""
 "Grupper: klikk for å skru av/på\n"
 "Kontekst-klikk for andre handlingar"
 
-#: editor.cc:3219
+#: editor.cc:3289
 msgid "Nudge Region/Selection Later"
 msgstr "Skubb bolken/markeringa seinare"
 
-#: editor.cc:3220
+#: editor.cc:3290
 msgid "Nudge Region/Selection Earlier"
 msgstr "Skubb bolken/markeringa tidlegare"
 
-#: editor.cc:3221 editor_actions.cc:262
+#: editor.cc:3291 editor_actions.cc:272
 msgid "Zoom In"
 msgstr "Zoom inn"
 
-#: editor.cc:3222 editor_actions.cc:261
+#: editor.cc:3292 editor_actions.cc:271
 msgid "Zoom Out"
 msgstr "Zoom ut"
 
-#: editor.cc:3223
+#: editor.cc:3293
 msgid "Zoom to Time Scale"
 msgstr ""
 
-#: editor.cc:3224 editor.cc:3729 editor_actions.cc:263
+#: editor.cc:3294 editor.cc:3797 editor_actions.cc:273
 msgid "Zoom to Session"
 msgstr "Zoom til heile økta"
 
-#: editor.cc:3225
-msgid "Zoom focus"
+#: editor.cc:3295 editor_actions.cc:115 editor_actions.cc:148
+msgid "Zoom Focus"
 msgstr "Zoom-fokus"
 
-#: editor.cc:3226
+#: editor.cc:3296
 msgid "Expand Tracks"
 msgstr "Utvid spor"
 
-#: editor.cc:3227
+#: editor.cc:3297
 msgid "Shrink Tracks"
 msgstr "Krymp spor"
 
-#: editor.cc:3228
+#: editor.cc:3298
 msgid "Number of visible tracks"
 msgstr ""
 
-#: editor.cc:3229
+#: editor.cc:3299
 msgid "Snap/Grid Units"
 msgstr "Feste- og rutenetteiningar"
 
-#: editor.cc:3230
+#: editor.cc:3300
 msgid "Snap/Grid Mode"
 msgstr "Feste- og rutenettmodus"
 
-#: editor.cc:3232
+#: editor.cc:3301 editor_actions.cc:101
+msgid "Edit Point"
+msgstr "Redigeringspunkt"
+
+#: editor.cc:3302
 msgid "Edit Mode"
 msgstr "Endringsmodus"
 
-#: editor.cc:3233
+#: editor.cc:3303
 msgid ""
 "Nudge Clock\n"
 "(controls distance used to nudge regions and selections)"
@@ -3129,124 +3599,124 @@ msgstr ""
 "Skubbeklokke\n"
 "(kontrollerer avstanden som blir brukt til å skubba område og utval)"
 
-#: editor.cc:3501 editor_actions.cc:313
+#: editor.cc:3571 editor_actions.cc:335
 msgid "Command|Undo"
 msgstr "Kommando|Angra"
 
-#: editor.cc:3503
+#: editor.cc:3573
 msgid "Command|Undo (%1)"
 msgstr "Kommando|Angra (%1)"
 
-#: editor.cc:3510 editor_actions.cc:315 editor_actions.cc:316
-#: editor_actions.cc:317
+#: editor.cc:3580 editor_actions.cc:337 editor_actions.cc:338
+#: editor_actions.cc:339
 msgid "Redo"
 msgstr "Gjer omatt"
 
-#: editor.cc:3512
+#: editor.cc:3583
 msgid "Redo (%1)"
 msgstr "Gjer omatt (%1)"
 
-#: editor.cc:3531 editor.cc:3555 editor_actions.cc:110 editor_actions.cc:1846
+#: editor.cc:3603 editor.cc:3627 editor_actions.cc:113 editor_actions.cc:1863
 msgid "Duplicate"
 msgstr "Klon"
 
-#: editor.cc:3532
+#: editor.cc:3604
 msgid "Number of duplications:"
 msgstr "Kor mange klonar:"
 
-#: editor.cc:3706 route_group_dialog.cc:51 time_info_box.cc:67
+#: editor.cc:3774 route_group_dialog.cc:51 time_info_box.cc:61
 msgid "Selection"
 msgstr "Utval"
 
-#: editor.cc:3709
+#: editor.cc:3777
 msgid "Fit 1 track"
 msgstr ""
 
-#: editor.cc:3710
+#: editor.cc:3778
 msgid "Fit 2 tracks"
 msgstr ""
 
-#: editor.cc:3711
+#: editor.cc:3779
 msgid "Fit 4 tracks"
 msgstr ""
 
-#: editor.cc:3712
+#: editor.cc:3780
 msgid "Fit 8 tracks"
 msgstr ""
 
-#: editor.cc:3713
+#: editor.cc:3781
 msgid "Fit 16 tracks"
 msgstr ""
 
-#: editor.cc:3714
+#: editor.cc:3782
 msgid "Fit 24 tracks"
 msgstr ""
 
-#: editor.cc:3715
+#: editor.cc:3783
 msgid "Fit 32 tracks"
 msgstr ""
 
-#: editor.cc:3716
+#: editor.cc:3784
 msgid "Fit 48 tracks"
 msgstr ""
 
-#: editor.cc:3717
+#: editor.cc:3785
 msgid "Fit All tracks"
 msgstr ""
 
-#: editor.cc:3718
+#: editor.cc:3786
 msgid "Fit Selection"
 msgstr ""
 
-#: editor.cc:3720
+#: editor.cc:3788 editor_actions.cc:288
 msgid "Zoom to 10 ms"
 msgstr ""
 
-#: editor.cc:3721
+#: editor.cc:3789 editor_actions.cc:289
 msgid "Zoom to 100 ms"
 msgstr ""
 
-#: editor.cc:3722
+#: editor.cc:3790 editor_actions.cc:290
 msgid "Zoom to 1 sec"
 msgstr ""
 
-#: editor.cc:3723
+#: editor.cc:3791 editor_actions.cc:291
 msgid "Zoom to 10 sec"
 msgstr ""
 
-#: editor.cc:3724
+#: editor.cc:3792 editor_actions.cc:292
 msgid "Zoom to 1 min"
 msgstr ""
 
-#: editor.cc:3725
+#: editor.cc:3793 editor_actions.cc:294
 msgid "Zoom to 10 min"
 msgstr ""
 
-#: editor.cc:3726
+#: editor.cc:3794
 msgid "Zoom to 1 hour"
 msgstr ""
 
-#: editor.cc:3727
+#: editor.cc:3795
 msgid "Zoom to 8 hours"
 msgstr ""
 
-#: editor.cc:3728
+#: editor.cc:3796
 msgid "Zoom to 24 hours"
 msgstr ""
 
-#: editor.cc:3730
+#: editor.cc:3798
 msgid "Zoom to Range/Region Selection"
 msgstr ""
 
-#: editor.cc:3800
+#: editor.cc:3868
 msgid "*"
 msgstr ""
 
-#: editor.cc:4120
+#: editor.cc:4135
 msgid "Playlist Deletion"
 msgstr "Slett spelelister"
 
-#: editor.cc:4121
+#: editor.cc:4136
 msgid ""
 "Playlist %1 is currently unused.\n"
 "If it is kept, its audio files will not be cleaned.\n"
@@ -3256,1288 +3726,1373 @@ msgstr ""
 "Om du let henne vera, blir ingen lydfiler derifrå rydda bort.\n"
 "Om du slettar henne, vil alle lydfiler derifrå bli rydda bort."
 
-#: editor.cc:4131
+#: editor.cc:4146
+msgid "Delete All Unused"
+msgstr ""
+
+#: editor.cc:4147
 msgid "Delete Playlist"
 msgstr "Slett speleliste"
 
-#: editor.cc:4132
+#: editor.cc:4148
 msgid "Keep Playlist"
 msgstr "Ha speleliste"
 
-#: editor.cc:4133 editor_audio_import.cc:594 editor_ops.cc:6174
-#: engine_dialog.cc:2083 sfdb_freesound_mootcher.cc:69 processor_box.cc:2219
-#: processor_box.cc:2244
+#: editor.cc:4149
+msgid "Keep Remaining"
+msgstr ""
+
+#: editor.cc:4150 editor_audio_import.cc:600 editor_ops.cc:6530
+#: engine_dialog.cc:2986 sfdb_freesound_mootcher.cc:69 processor_box.cc:3431
+#: processor_box.cc:3456
 msgid "Cancel"
 msgstr "Avbryt"
 
-#: editor.cc:4275
+#: editor.cc:4292
 msgid "new playlists"
 msgstr "nye spelelister"
 
-#: editor.cc:4291
+#: editor.cc:4308
 msgid "copy playlists"
 msgstr "kopier spelelister"
 
-#: editor.cc:4306
+#: editor.cc:4323
 msgid "clear playlists"
 msgstr "tøm spelelister"
 
-#: editor.cc:5046
+#: editor.cc:5048
 msgid "Please wait while %1 loads visual data."
 msgstr "Vent medan %1 lastar visuelle data"
 
-#: editor.cc:5901 editor.cc:5932 editor_markers.cc:985 panner_ui.cc:410
-#: processor_box.cc:2482
+#: editor.cc:5811 editor_actions.cc:479
+msgid "Unset #%1"
+msgstr ""
+
+#: editor.cc:5812 editor_actions.cc:481
+msgid "no action bound"
+msgstr ""
+
+#: editor.cc:5961 editor.cc:5996 editor_markers.cc:998 editor_markers.cc:1018
+#: panner_ui.cc:412 processor_box.cc:3703
 msgid "Edit..."
 msgstr "Endra..."
 
-#: editor.cc:5934 editor_actions.cc:1941
+#: editor.cc:6002 editor_actions.cc:1842
+msgid "Transpose..."
+msgstr "Transponer..."
+
+#: editor.cc:6006 editor_actions.cc:1959
 msgid "Legatize"
 msgstr ""
 
-#: editor.cc:5936 editor_actions.cc:1940
+#: editor.cc:6012 editor_actions.cc:1958
 msgid "Quantize..."
 msgstr "Gitterfordel..."
 
-#: editor.cc:5938 editor_actions.cc:1943
+#: editor.cc:6015 editor_actions.cc:1961
 msgid "Remove Overlap"
 msgstr ""
 
-#: editor.cc:5940 editor_actions.cc:1942
+#: editor.cc:6021 editor_actions.cc:1960
 msgid "Transform..."
 msgstr ""
 
-#: editor_actions.cc:92
+#: editor_actions.cc:95
 msgid "Autoconnect"
 msgstr "Automatisk tilkopling"
 
-#: editor_actions.cc:93
+#: editor_actions.cc:96
 msgid "Crossfades"
 msgstr "Krysstoningar"
 
-#: editor_actions.cc:95
+#: editor_actions.cc:98
 msgid "Move Selected Marker"
 msgstr "Flytt den valde markøren"
 
-#: editor_actions.cc:96
+#: editor_actions.cc:99
 msgid "Select Range Operations"
 msgstr "Vel områdehandlingar"
 
-#: editor_actions.cc:97
+#: editor_actions.cc:100
 msgid "Select Regions"
 msgstr "Vel bolkar"
 
-#: editor_actions.cc:98
-msgid "Edit Point"
-msgstr "Redigeringspunkt"
-
-#: editor_actions.cc:99
+#: editor_actions.cc:102
 msgid "Fade"
 msgstr "Ton ut"
 
-#: editor_actions.cc:100
+#: editor_actions.cc:103
 msgid "Latch"
 msgstr "Lask"
 
-#: editor_actions.cc:101 editor_regions.cc:112 region_editor.cc:46
+#: editor_actions.cc:104 editor_regions.cc:159 region_editor.cc:48
 msgid "Region"
 msgstr "Bolk"
 
-#: editor_actions.cc:102
+#: editor_actions.cc:105
 msgid "Layering"
 msgstr "Lag"
 
-#: editor_actions.cc:103 editor_regions.cc:113 stereo_panner_editor.cc:44
+#: editor_actions.cc:106 editor_regions.cc:160 stereo_panner_editor.cc:46
 msgid "Position"
 msgstr "Posisjon"
 
-#: editor_actions.cc:105 gain_meter.cc:156 gain_meter.cc:825 panner_ui.cc:178
-#: panner_ui.cc:635
+#: editor_actions.cc:108 gain_meter.cc:161 gain_meter.cc:848 panner_ui.cc:178
+#: panner_ui.cc:637 route_time_axis.cc:541
 msgid "Trim"
 msgstr "Skjer til"
 
-#: editor_actions.cc:106 editor_actions.cc:126 route_group_dialog.cc:46
+#: editor_actions.cc:109 editor_actions.cc:129 route_group_dialog.cc:46
 msgid "Gain"
 msgstr "Innvolum"
 
-#: editor_actions.cc:107 editor_actions.cc:563
+#: editor_actions.cc:110 editor_actions.cc:604
 msgid "Ranges"
 msgstr "Område"
 
-#: editor_actions.cc:108 editor_actions.cc:1842 session_option_editor.cc:135
+#: editor_actions.cc:111 editor_actions.cc:1859 session_option_editor.cc:135
 #: session_option_editor.cc:144 session_option_editor.cc:151
+#: session_option_editor.cc:158 session_option_editor.cc:165
 msgid "Fades"
 msgstr "Toningar"
 
-#: editor_actions.cc:111
+#: editor_actions.cc:114
 msgid "Link"
 msgstr "Lenkje"
 
-#: editor_actions.cc:112 editor_actions.cc:145
-msgid "Zoom Focus"
-msgstr "Zoom-fokus"
-
-#: editor_actions.cc:113
+#: editor_actions.cc:116
 msgid "Locate to Markers"
 msgstr "Gå til markørar"
 
-#: editor_actions.cc:115
+#: editor_actions.cc:118
 msgid "Meter falloff"
 msgstr "Slepp nivåtoppar"
 
-#: editor_actions.cc:116
+#: editor_actions.cc:119
 msgid "Meter hold"
 msgstr "Hald nivåtoppar"
 
-#: editor_actions.cc:117 session_option_editor.cc:321
+#: editor_actions.cc:120 session_option_editor.cc:342
 msgid "MIDI Options"
 msgstr "MIDI-oppsett"
 
-#: editor_actions.cc:118
+#: editor_actions.cc:121
 msgid "Misc Options"
 msgstr "Ymse val"
 
-#: editor_actions.cc:119 rc_option_editor.cc:1809 route_group_dialog.cc:54
-#: session_option_editor.cc:243 session_option_editor.cc:250
+#: editor_actions.cc:122 rc_option_editor.cc:2401 route_group_dialog.cc:54
+#: session_option_editor.cc:264 session_option_editor.cc:271
 msgid "Monitoring"
 msgstr "Lytting"
 
-#: editor_actions.cc:120
+#: editor_actions.cc:123
 msgid "Active Mark"
 msgstr "Aktivt merke"
 
-#: editor_actions.cc:123
+#: editor_actions.cc:126
 msgid "Primary Clock"
 msgstr "Primærklokke"
 
-#: editor_actions.cc:124
+#: editor_actions.cc:127
 msgid "Pullup / Pulldown"
 msgstr "Dra opp/dra ned"
 
-#: editor_actions.cc:125
+#: editor_actions.cc:128
 msgid "Region operations"
 msgstr "Bolkhandlingar"
 
-#: editor_actions.cc:127 ruler_dialog.cc:28
+#: editor_actions.cc:130 ruler_dialog.cc:28
 msgid "Rulers"
 msgstr "Linjalar"
 
-#: editor_actions.cc:128
+#: editor_actions.cc:131
 msgid "Views"
 msgstr "Visingar"
 
-#: editor_actions.cc:129
+#: editor_actions.cc:132
 msgid "Scroll"
 msgstr "Rull"
 
-#: editor_actions.cc:130
+#: editor_actions.cc:133
 msgid "Secondary Clock"
 msgstr "Sekundærklokke"
 
-#: editor_actions.cc:137
+#: editor_actions.cc:140
 msgid "Subframes"
 msgstr "Underruter"
 
-#: editor_actions.cc:140
+#: editor_actions.cc:143
 msgid "Timecode fps"
 msgstr "Tidskode-RPS"
 
-#: editor_actions.cc:141 route_time_axis.cc:575
+#: editor_actions.cc:144 route_time_axis.cc:599
 msgid "Height"
 msgstr "Høgd"
 
-#: editor_actions.cc:143
+#: editor_actions.cc:146
 msgid "Tools"
 msgstr "Verktøy"
 
-#: editor_actions.cc:144
+#: editor_actions.cc:147
 msgid "View"
 msgstr "Vis"
 
-#: editor_actions.cc:146
+#: editor_actions.cc:149
 msgid "Zoom"
 msgstr "Zoom"
 
-#: editor_actions.cc:152
-msgid "Break drag or deselect all"
-msgstr "Bryt og dra eller vel ingen"
+#: editor_actions.cc:150
+msgid "Scripted Actions"
+msgstr ""
 
 #: editor_actions.cc:159
+msgid "Session|Lock"
+msgstr ""
+
+#: editor_actions.cc:161
 msgid "Show Editor Mixer"
 msgstr "Vis redigeringsmiksar"
 
-#: editor_actions.cc:160
+#: editor_actions.cc:162
 msgid "Show Editor List"
 msgstr "Vis redigeringslista"
 
-#: editor_actions.cc:162
+#: editor_actions.cc:164
 msgid "Playhead to Next Region Boundary"
 msgstr "Spelehovudet til neste bolkgrense"
 
-#: editor_actions.cc:163
+#: editor_actions.cc:165
 msgid "Playhead to Next Region Boundary (No Track Selection)"
 msgstr "Spelehovudet til neste bolkgrense (ikkje vel spor)"
 
-#: editor_actions.cc:164
+#: editor_actions.cc:166
 msgid "Playhead to Previous Region Boundary"
 msgstr "Spelehovudet til førre bolkgrense"
 
-#: editor_actions.cc:165
+#: editor_actions.cc:167
 msgid "Playhead to Previous Region Boundary (No Track Selection)"
 msgstr "Spelehovudet til førre bolkgrense (ikkje vel spor)"
 
-#: editor_actions.cc:167
+#: editor_actions.cc:169
 msgid "Playhead to Next Region Start"
 msgstr "Spelehovudet til neste bolkstart"
 
-#: editor_actions.cc:168
+#: editor_actions.cc:170
 msgid "Playhead to Next Region End"
 msgstr "Spelehovudet til neste bolk"
 
-#: editor_actions.cc:169
+#: editor_actions.cc:171
 msgid "Playhead to Next Region Sync"
 msgstr "Spelehovudet til neste bolksynk"
 
-#: editor_actions.cc:171
+#: editor_actions.cc:173
 msgid "Playhead to Previous Region Start"
 msgstr "Spelehovudet til førre bolkstart"
 
-#: editor_actions.cc:172
+#: editor_actions.cc:174
 msgid "Playhead to Previous Region End"
 msgstr "Spelehovudet til førre bolkslutt"
 
-#: editor_actions.cc:173
+#: editor_actions.cc:175
 msgid "Playhead to Previous Region Sync"
 msgstr "Spelehovudet til førre bolksynk"
 
-#: editor_actions.cc:175
+#: editor_actions.cc:177
 msgid "To Next Region Boundary"
 msgstr "Til neste bolkgrense"
 
-#: editor_actions.cc:176
+#: editor_actions.cc:178
 msgid "To Next Region Boundary (No Track Selection)"
 msgstr "Til neste bolkgrense (ikkje vel spor)"
 
-#: editor_actions.cc:177
+#: editor_actions.cc:179
 msgid "To Previous Region Boundary"
 msgstr "Til førre bolkgrense"
 
-#: editor_actions.cc:178
+#: editor_actions.cc:180
 msgid "To Previous Region Boundary (No Track Selection)"
 msgstr "til førre bolkgrense (ingen valde spor)"
 
-#: editor_actions.cc:180
+#: editor_actions.cc:182
 msgid "To Next Region Start"
 msgstr "Til neste bolkstart"
 
-#: editor_actions.cc:181
+#: editor_actions.cc:183
 msgid "To Next Region End"
 msgstr "Til neste bolkslutt"
 
-#: editor_actions.cc:182
+#: editor_actions.cc:184
 msgid "To Next Region Sync"
 msgstr "Til neste bolksynk"
 
-#: editor_actions.cc:184
+#: editor_actions.cc:186
 msgid "To Previous Region Start"
 msgstr "Til førre bolkstart"
 
-#: editor_actions.cc:185
+#: editor_actions.cc:187
 msgid "To Previous Region End"
 msgstr "Til førre bolkslutt"
 
-#: editor_actions.cc:186
+#: editor_actions.cc:188
 msgid "To Previous Region Sync"
 msgstr "Til førre bolksynk"
 
-#: editor_actions.cc:188
+#: editor_actions.cc:190
 msgid "To Range Start"
 msgstr "Til starten på området"
 
-#: editor_actions.cc:189
+#: editor_actions.cc:191
 msgid "To Range End"
 msgstr "Til slutten av området"
 
-#: editor_actions.cc:191
+#: editor_actions.cc:193
 msgid "Playhead to Range Start"
 msgstr "Spelehovudet til starten på området"
 
-#: editor_actions.cc:192
+#: editor_actions.cc:194
 msgid "Playhead to Range End"
 msgstr "Spelehovudet til slutten av området"
 
-#: editor_actions.cc:195
+#: editor_actions.cc:197
 msgid "Select All Tracks"
 msgstr ""
 
-#: editor_actions.cc:196 export_timespan_selector.cc:61 processor_box.cc:2468
+#: editor_actions.cc:198 export_timespan_selector.cc:59 processor_box.cc:3685
 msgid "Deselect All"
 msgstr "Fjern markering"
 
-#: editor_actions.cc:204
+#: editor_actions.cc:210
 msgid "Select All Overlapping Edit Range"
 msgstr "Vel alt som overlappar redigeringsområdet"
 
-#: editor_actions.cc:205
+#: editor_actions.cc:211
 msgid "Select All Inside Edit Range"
 msgstr "Vel alt i redigeringsområdet"
 
-#: editor_actions.cc:207
+#: editor_actions.cc:213
 msgid "Select Edit Range"
 msgstr "Vel redigeringsområdet"
 
-#: editor_actions.cc:209
+#: editor_actions.cc:215
 msgid "Select All in Punch Range"
 msgstr "Vel alt i innslagsområdet"
 
-#: editor_actions.cc:210
+#: editor_actions.cc:216
 msgid "Select All in Loop Range"
 msgstr "Vel alt i lykkje-området"
 
-#: editor_actions.cc:212
+#: editor_actions.cc:218
 msgid "Select Next Track or Bus"
 msgstr "Vel neste spor eller buss"
 
-#: editor_actions.cc:213
+#: editor_actions.cc:219
 msgid "Select Previous Track or Bus"
 msgstr "Vel førre spor eller buss"
 
-#: editor_actions.cc:215
+#: editor_actions.cc:221
 msgid "Toggle Record Enable"
 msgstr "Skru på/av opptak"
 
-#: editor_actions.cc:217
+#: editor_actions.cc:223
 msgid "Toggle Solo"
 msgstr "Solo av/på"
 
-#: editor_actions.cc:219
+#: editor_actions.cc:225
 msgid "Toggle Mute"
 msgstr "Demping av/på"
 
-#: editor_actions.cc:221
+#: editor_actions.cc:227
 msgid "Toggle Solo Isolate"
 msgstr "Isolert solo av/på"
 
-#: editor_actions.cc:226
+#: editor_actions.cc:232
 msgid "Save View %1"
 msgstr "Lagra vising %1"
 
-#: editor_actions.cc:232
+#: editor_actions.cc:238
 msgid "Go to View %1"
 msgstr "GÃ¥ til vising %1"
 
-#: editor_actions.cc:238
+#: editor_actions.cc:244
 msgid "Locate to Mark %1"
 msgstr "GÃ¥ til merke %1"
 
-#: editor_actions.cc:242 editor_actions.cc:243
+#: editor_actions.cc:249 editor_actions.cc:250
 msgid "Jump to Next Mark"
 msgstr "Hopp til neste merke"
 
-#: editor_actions.cc:244 editor_actions.cc:245
+#: editor_actions.cc:251 editor_actions.cc:252
 msgid "Jump to Previous Mark"
 msgstr "Hopp til førre merke"
 
-#: editor_actions.cc:247 editor_actions.cc:248
+#: editor_actions.cc:254
+msgid "Set Session Start from Playhead"
+msgstr ""
+
+#: editor_actions.cc:255
+msgid "Set Session End from Playhead"
+msgstr ""
+
+#: editor_actions.cc:257 editor_actions.cc:258
 msgid "Add Mark from Playhead"
 msgstr "Legg til merke ved spelehovudet"
 
-#: editor_actions.cc:250 editor_actions.cc:251
+#: editor_actions.cc:260 editor_actions.cc:261
 msgid "Remove Mark at Playhead"
 msgstr ""
 
-#: editor_actions.cc:253
+#: editor_actions.cc:263
 msgid "Nudge Next Later"
 msgstr "Skubb neste seinare"
 
-#: editor_actions.cc:254
+#: editor_actions.cc:264
 msgid "Nudge Next Earlier"
 msgstr "Skubb neste tidlegare"
 
-#: editor_actions.cc:256
+#: editor_actions.cc:266
 msgid "Nudge Playhead Forward"
 msgstr "Skubb spelehovudet framover"
 
-#: editor_actions.cc:257
+#: editor_actions.cc:267
 msgid "Nudge Playhead Backward"
 msgstr "Skubb spelehovudet bakover"
 
-#: editor_actions.cc:258
-msgid "Playhead To Next Grid"
-msgstr "Spelehovudet til neste gitter"
+#: editor_actions.cc:268
+msgid "Playhead to Next Grid"
+msgstr ""
 
-#: editor_actions.cc:259
-msgid "Playhead To Previous Grid"
-msgstr "Spelehovudet til førre gitter"
+#: editor_actions.cc:269
+msgid "Playhead to Previous Grid"
+msgstr ""
 
-#: editor_actions.cc:264
+#: editor_actions.cc:274
 msgid "Zoom to Selection"
 msgstr ""
 
-#: editor_actions.cc:265
+#: editor_actions.cc:275
 msgid "Toggle Zoom State"
 msgstr "Endre zoom-tilstand"
 
-#: editor_actions.cc:267
+#: editor_actions.cc:277
 msgid "Expand Track Height"
 msgstr "Utvid sporhøgd"
 
-#: editor_actions.cc:268
+#: editor_actions.cc:278
 msgid "Shrink Track Height"
 msgstr "Krymp sporhøgd"
 
-#: editor_actions.cc:270
+#: editor_actions.cc:280
+msgid "Fit 1 Track"
+msgstr ""
+
+#: editor_actions.cc:281
+msgid "Fit 2 Tracks"
+msgstr ""
+
+#: editor_actions.cc:282
+msgid "Fit 4 Tracks"
+msgstr ""
+
+#: editor_actions.cc:283
+msgid "Fit 8 Tracks"
+msgstr ""
+
+#: editor_actions.cc:284
+msgid "Fit 16 Tracks"
+msgstr ""
+
+#: editor_actions.cc:285
+msgid "Fit 32 Tracks"
+msgstr ""
+
+#: editor_actions.cc:286
+msgid "Fit All Tracks"
+msgstr ""
+
+#: editor_actions.cc:293
+msgid "Zoom to 5 min"
+msgstr ""
+
+#: editor_actions.cc:296
 msgid "Move Selected Tracks Up"
 msgstr "Flytt dei valde spora opp"
 
-#: editor_actions.cc:272
+#: editor_actions.cc:298
 msgid "Move Selected Tracks Down"
 msgstr "Flytt dei valde spora"
 
-#: editor_actions.cc:275
+#: editor_actions.cc:301
 msgid "Scroll Tracks Up"
 msgstr "Rull spor opp"
 
-#: editor_actions.cc:277
+#: editor_actions.cc:302
 msgid "Scroll Tracks Down"
 msgstr "Rull spor ned"
 
-#: editor_actions.cc:279
+#: editor_actions.cc:303
 msgid "Step Tracks Up"
 msgstr "GÃ¥ spor opp"
 
-#: editor_actions.cc:281
+#: editor_actions.cc:304
 msgid "Step Tracks Down"
 msgstr "GÃ¥ spor ned"
 
-#: editor_actions.cc:284
+#: editor_actions.cc:306
 msgid "Scroll Backward"
 msgstr "Rull bakover"
 
-#: editor_actions.cc:285
+#: editor_actions.cc:307
 msgid "Scroll Forward"
 msgstr "Rull framover"
 
-#: editor_actions.cc:286
+#: editor_actions.cc:308
 msgid "Center Playhead"
 msgstr "Spelehovudet i midten"
 
-#: editor_actions.cc:287
+#: editor_actions.cc:309
 msgid "Center Edit Point"
 msgstr "Midtstill redigeringspunktet"
 
-#: editor_actions.cc:289
+#: editor_actions.cc:311
 msgid "Playhead Forward"
 msgstr "Spelehovudet framover"
 
-#: editor_actions.cc:290
+#: editor_actions.cc:312
 msgid "Playhead Backward"
 msgstr "Spelehovudet bakover"
 
-#: editor_actions.cc:292
+#: editor_actions.cc:314
 msgid "Playhead to Active Mark"
 msgstr "Spelehovudet til det aktive merket"
 
-#: editor_actions.cc:293
+#: editor_actions.cc:315
 msgid "Active Mark to Playhead"
 msgstr "Aktivt merke til spelehovudet"
 
-#: editor_actions.cc:295
+#: editor_actions.cc:317
 msgid "Use Skip Ranges"
 msgstr ""
 
-#: editor_actions.cc:302
+#: editor_actions.cc:324
 msgid "Play Selected Regions"
 msgstr "Spel dei valde bolkane"
 
-#: editor_actions.cc:304
+#: editor_actions.cc:326
 msgid "Play from Edit Point and Return"
 msgstr "Spel frå redigeringspunktet og gå attende"
 
-#: editor_actions.cc:306
+#: editor_actions.cc:328
 msgid "Play Edit Range"
 msgstr "Spel redigeringsområdet"
 
-#: editor_actions.cc:308
+#: editor_actions.cc:330
 msgid "Playhead to Mouse"
 msgstr "Spelehovudet til musa"
 
-#: editor_actions.cc:309
+#: editor_actions.cc:331
 msgid "Active Marker to Mouse"
 msgstr "Aktiv markør til musa"
 
-#: editor_actions.cc:319
+#: editor_actions.cc:341
 msgid "Undo Selection Change"
 msgstr ""
 
-#: editor_actions.cc:320
+#: editor_actions.cc:342
 msgid "Redo Selection Change"
 msgstr ""
 
-#: editor_actions.cc:322
+#: editor_actions.cc:344
 msgid "Export Audio"
 msgstr "Eksporter lyd"
 
-#: editor_actions.cc:323 export_dialog.cc:396
+#: editor_actions.cc:345 export_dialog.cc:424
 msgid "Export Range"
 msgstr "Eksporter området"
 
-#: editor_actions.cc:328
+#: editor_actions.cc:350
 msgid "Separate Using Punch Range"
 msgstr "Gjer innslagsområdet til eige område"
 
-#: editor_actions.cc:331
+#: editor_actions.cc:353
 msgid "Separate Using Loop Range"
 msgstr "Gjer lykkje-området til eige område"
 
-#: editor_actions.cc:334 editor_actions.cc:356
+#: editor_actions.cc:356 editor_actions.cc:379
 msgid "Crop"
 msgstr "Skjer til"
 
-#: editor_actions.cc:344
+#: editor_actions.cc:366
 msgid "Fade Range Selection"
 msgstr ""
 
-#: editor_actions.cc:346
+#: editor_actions.cc:368
 msgid "Set Tempo from Edit Range = Bar"
 msgstr "Set tempoet ut frå at redigeringsområdet = ei takt"
 
-#: editor_actions.cc:348
+#: editor_actions.cc:371
 msgid "Log"
 msgstr "Logg"
 
-#: editor_actions.cc:351 editor_actions.cc:353
+#: editor_actions.cc:374 editor_actions.cc:376
 msgid "Move to Next Transient"
 msgstr ""
 
-#: editor_actions.cc:352 editor_actions.cc:354
+#: editor_actions.cc:375 editor_actions.cc:377
 msgid "Move to Previous Transient"
 msgstr ""
 
-#: editor_actions.cc:358 editor_actions.cc:361
+#: editor_actions.cc:381
+msgid "Start Range from Playhead"
+msgstr ""
+
+#: editor_actions.cc:382
+msgid "Finish Range from Playhead"
+msgstr ""
+
+#: editor_actions.cc:384 editor_actions.cc:393
 msgid "Start Range"
 msgstr "Start området"
 
-#: editor_actions.cc:359 editor_actions.cc:362
+#: editor_actions.cc:385 editor_actions.cc:394
 msgid "Finish Range"
 msgstr "Lag slutt på området"
 
-#: editor_actions.cc:394
+#: editor_actions.cc:387
+msgid "Start Punch Range"
+msgstr ""
+
+#: editor_actions.cc:388
+msgid "Finish Punch Range"
+msgstr ""
+
+#: editor_actions.cc:390
+msgid "Start Loop Range"
+msgstr ""
+
+#: editor_actions.cc:391
+msgid "Finish Loop Range"
+msgstr ""
+
+#: editor_actions.cc:426
 msgid "Follow Playhead"
 msgstr "Fylg spelehovudet"
 
-#: editor_actions.cc:395
+#: editor_actions.cc:427
 msgid "Remove Last Capture"
 msgstr "Fjern siste opptaket "
 
-#: editor_actions.cc:397
+#: editor_actions.cc:429
 msgid "Stationary Playhead"
 msgstr "Fast spelehovud"
 
-#: editor_actions.cc:399 insert_time_dialog.cc:32
+#: editor_actions.cc:431 insert_remove_time_dialog.cc:32
 msgid "Insert Time"
 msgstr "Set inn tid"
 
-#: editor_actions.cc:402
+#: editor_actions.cc:433 insert_remove_time_dialog.cc:32
+msgid "Remove Time"
+msgstr ""
+
+#: editor_actions.cc:438
 msgid "Toggle Active"
 msgstr "Slå av/på"
 
-#: editor_actions.cc:407 editor_actions.cc:1768 editor_markers.cc:921
-#: editor_markers.cc:986 editor_snapshots.cc:122 mixer_strip.cc:1543
-#: route_time_axis.cc:856
+#: editor_actions.cc:440 editor_actions.cc:1785 editor_markers.cc:926
+#: editor_markers.cc:999 editor_markers.cc:1019 editor_snapshots.cc:134
+#: lua_script_manager.cc:32 lua_script_manager.cc:36 mixer_strip.cc:1705
+#: route_time_axis.cc:870 vca_master_strip.cc:400
 msgid "Remove"
 msgstr "Fjern"
 
-#: editor_actions.cc:411
+#: editor_actions.cc:445
 msgid "Fit Selection (Vertical)"
 msgstr ""
 
-#: editor_actions.cc:413 time_axis_view.cc:1371
+#: editor_actions.cc:447 time_axis_view.cc:1287
 msgid "Largest"
 msgstr "Størst"
 
-#: editor_actions.cc:416 time_axis_view.cc:1372
+#: editor_actions.cc:450 time_axis_view.cc:1288
 msgid "Larger"
 msgstr "Større"
 
-#: editor_actions.cc:419 editor_rulers.cc:249 time_axis_view.cc:1373
+#: editor_actions.cc:453 editor_rulers.cc:248 time_axis_view.cc:1289
 msgid "Large"
 msgstr "Stor"
 
-#: editor_actions.cc:425 editor_rulers.cc:253 time_axis_view.cc:1375
+#: editor_actions.cc:459 editor_rulers.cc:252 time_axis_view.cc:1291
 msgid "Small"
 msgstr "Liten"
 
-#: editor_actions.cc:429
+#: editor_actions.cc:463
 msgid "Sound Selected MIDI Notes"
 msgstr "Lytt på dei valde MIDI-notane"
 
-#: editor_actions.cc:434
+#: editor_actions.cc:468
 msgid "Zoom Focus Left"
 msgstr "Zoomfokus: venstre"
 
-#: editor_actions.cc:435
+#: editor_actions.cc:469
 msgid "Zoom Focus Right"
 msgstr "Zoomfokus: høgre"
 
-#: editor_actions.cc:436
+#: editor_actions.cc:470
 msgid "Zoom Focus Center"
 msgstr "Zoomfokus: midten"
 
-#: editor_actions.cc:437
+#: editor_actions.cc:471
 msgid "Zoom Focus Playhead"
 msgstr "Zoomfokus: spelehovudet"
 
-#: editor_actions.cc:438
+#: editor_actions.cc:472
 msgid "Zoom Focus Mouse"
 msgstr "Fokus følgjer musa"
 
-#: editor_actions.cc:439
+#: editor_actions.cc:473
 msgid "Zoom Focus Edit Point"
 msgstr "Zoomfokus på redigeringspunktet"
 
-#: editor_actions.cc:441
+#: editor_actions.cc:475
 msgid "Next Zoom Focus"
 msgstr "Neste zoom-fokus"
 
-#: editor_actions.cc:447
+#: editor_actions.cc:488
 msgid "Smart Object Mode"
 msgstr "Smart objektmodus"
 
-#: editor_actions.cc:450
+#: editor_actions.cc:491
 msgid "Smart"
 msgstr "Smart"
 
-#: editor_actions.cc:453
+#: editor_actions.cc:494
 msgid "Object Tool"
 msgstr "Objektverkty"
 
-#: editor_actions.cc:458
+#: editor_actions.cc:499
 msgid "Range Tool"
 msgstr "Områdeverkty"
 
-#: editor_actions.cc:463
+#: editor_actions.cc:504
 msgid "Note Drawing Tool"
 msgstr "Noteteikningsverkty"
 
-#: editor_actions.cc:468
+#: editor_actions.cc:509
 msgid "Audition Tool"
 msgstr "Lytteverkty"
 
-#: editor_actions.cc:473
+#: editor_actions.cc:514
 msgid "Time FX Tool"
 msgstr "Tidseffektverkty"
 
-#: editor_actions.cc:478
+#: editor_actions.cc:519
 msgid "Content Tool"
 msgstr ""
 
-#: editor_actions.cc:484
+#: editor_actions.cc:525
 msgid "Cut Tool"
 msgstr ""
 
-#: editor_actions.cc:490
+#: editor_actions.cc:531
 msgid "Step Mouse Mode"
 msgstr "Stegmusemodus"
 
-#: editor_actions.cc:497
+#: editor_actions.cc:538
 msgid "Change Edit Point"
 msgstr "Endra redigeringspunkt"
 
-#: editor_actions.cc:498
+#: editor_actions.cc:539
 msgid "Change Edit Point Including Marker"
 msgstr "Endra redigeringspunktet, med markør"
 
-#: editor_actions.cc:504
+#: editor_actions.cc:544
+msgid "EditMode|Lock"
+msgstr ""
+
+#: editor_actions.cc:545
 msgid "Cycle Edit Mode"
 msgstr ""
 
-#: editor_actions.cc:506
+#: editor_actions.cc:547
 msgid "Snap to"
 msgstr "Fest til"
 
-#: editor_actions.cc:507
+#: editor_actions.cc:548
 msgid "Snap Mode"
 msgstr "Festemodus"
 
-#: editor_actions.cc:514
+#: editor_actions.cc:555
 msgid "Next Snap Mode"
 msgstr "Neste festemodus"
 
-#: editor_actions.cc:515
+#: editor_actions.cc:556
 msgid "Next Snap Choice"
 msgstr "Neste festeval"
 
-#: editor_actions.cc:516
+#: editor_actions.cc:557
 msgid "Next Musical Snap Choice"
 msgstr "Neste musikalsk festing-val"
 
-#: editor_actions.cc:517
+#: editor_actions.cc:558
 msgid "Previous Snap Choice"
 msgstr "Neste musikalsk festing-val"
 
-#: editor_actions.cc:518
+#: editor_actions.cc:559
 msgid "Previous Musical Snap Choice"
 msgstr "Førre musikalsk fest-val"
 
-#: editor_actions.cc:523
+#: editor_actions.cc:564
 msgid "Snap to CD Frame"
 msgstr "Fest til CD-ramme"
 
-#: editor_actions.cc:524
+#: editor_actions.cc:565
 msgid "Snap to Timecode Frame"
 msgstr "Fest til tidskoderamme"
 
-#: editor_actions.cc:525
+#: editor_actions.cc:566
 msgid "Snap to Timecode Seconds"
 msgstr "Fest til tidskodesekund"
 
-#: editor_actions.cc:526
+#: editor_actions.cc:567
 msgid "Snap to Timecode Minutes"
 msgstr "Fest til tidskodeminutt"
 
-#: editor_actions.cc:527
+#: editor_actions.cc:568
 msgid "Snap to Seconds"
 msgstr "Fest til sekund"
 
-#: editor_actions.cc:528
+#: editor_actions.cc:569
 msgid "Snap to Minutes"
 msgstr "Fest til minutt"
 
-#: editor_actions.cc:530
+#: editor_actions.cc:571
 msgid "Snap to One Twenty Eighths"
 msgstr "Fest til 128-deler"
 
-#: editor_actions.cc:531
+#: editor_actions.cc:572
 msgid "Snap to Sixty Fourths"
 msgstr "Fest til 64-deler"
 
-#: editor_actions.cc:532
+#: editor_actions.cc:573
 msgid "Snap to Thirty Seconds"
 msgstr "Fest til halvminutt"
 
-#: editor_actions.cc:533
+#: editor_actions.cc:574
 msgid "Snap to Twenty Eighths"
 msgstr "Fest til tjue åttendeler"
 
-#: editor_actions.cc:534
+#: editor_actions.cc:575
 msgid "Snap to Twenty Fourths"
 msgstr "Fest til tjue fjerdedeler"
 
-#: editor_actions.cc:535
+#: editor_actions.cc:576
 msgid "Snap to Twentieths"
 msgstr "Fest til tjuandedeler"
 
-#: editor_actions.cc:536
+#: editor_actions.cc:577
 msgid "Snap to Sixteenths"
 msgstr "Fest til sekstendel"
 
-#: editor_actions.cc:537
+#: editor_actions.cc:578
 msgid "Snap to Fourteenths"
 msgstr "Fest til fjortendel"
 
-#: editor_actions.cc:538
+#: editor_actions.cc:579
 msgid "Snap to Twelfths"
 msgstr "Fest til tolvtedelar"
 
-#: editor_actions.cc:539
+#: editor_actions.cc:580
 msgid "Snap to Tenths"
 msgstr "Fest til tiandedeler"
 
-#: editor_actions.cc:540
+#: editor_actions.cc:581
 msgid "Snap to Eighths"
 msgstr "Fest til åttendeler"
 
-#: editor_actions.cc:541
+#: editor_actions.cc:582
 msgid "Snap to Sevenths"
 msgstr "Fest til sjuandedeler"
 
-#: editor_actions.cc:542
+#: editor_actions.cc:583
 msgid "Snap to Sixths"
 msgstr "Fest til sjettedeler"
 
-#: editor_actions.cc:543
+#: editor_actions.cc:584
 msgid "Snap to Fifths"
 msgstr "Fest til femtedeler"
 
-#: editor_actions.cc:544
+#: editor_actions.cc:585
 msgid "Snap to Quarters"
 msgstr "Fest til fjerdedeler"
 
-#: editor_actions.cc:545
+#: editor_actions.cc:586
 msgid "Snap to Thirds"
 msgstr "Fest til tredjedeler"
 
-#: editor_actions.cc:546
+#: editor_actions.cc:587
 msgid "Snap to Halves"
 msgstr "Fest til halve"
 
-#: editor_actions.cc:548
+#: editor_actions.cc:589
 msgid "Snap to Beat"
 msgstr "Fest til taktslag"
 
-#: editor_actions.cc:549
+#: editor_actions.cc:590
 msgid "Snap to Bar"
 msgstr "Fest til takt"
 
-#: editor_actions.cc:550
+#: editor_actions.cc:591
 msgid "Snap to Mark"
 msgstr "Fest til merke"
 
-#: editor_actions.cc:551
+#: editor_actions.cc:592
 msgid "Snap to Region Start"
 msgstr "Fest til starten av bolken"
 
-#: editor_actions.cc:552
+#: editor_actions.cc:593
 msgid "Snap to Region End"
 msgstr "Fest til slutten av bolken"
 
-#: editor_actions.cc:553
+#: editor_actions.cc:594
 msgid "Snap to Region Sync"
 msgstr "Fest til synkpunktet for bolken"
 
-#: editor_actions.cc:554
+#: editor_actions.cc:595
 msgid "Snap to Region Boundary"
 msgstr "Fest til bolkgrensa"
 
-#: editor_actions.cc:556
+#: editor_actions.cc:597
 msgid "Show Marker Lines"
 msgstr "Vis markørliner"
 
-#: editor_actions.cc:566
+#: editor_actions.cc:607
 msgid "Loop/Punch"
 msgstr "Lykkje/innslag"
 
-#: editor_actions.cc:570
+#: editor_actions.cc:611
 msgid "Min:Sec"
 msgstr "Min:sek"
 
-#: editor_actions.cc:572 editor_actions.cc:575 editor_rulers.cc:271
+#: editor_actions.cc:613 editor_actions.cc:616 editor_rulers.cc:270
+#: rc_option_editor.cc:1592
 msgid "Video Monitor"
 msgstr ""
 
-#: editor_actions.cc:574 rc_option_editor.cc:2260
+#: editor_actions.cc:615 rc_option_editor.cc:2844
 msgid "Video"
 msgstr ""
 
-#: editor_actions.cc:577
+#: editor_actions.cc:618
 msgid "Always on Top"
 msgstr ""
 
-#: editor_actions.cc:579
+#: editor_actions.cc:620
 msgid "Frame number"
 msgstr ""
 
-#: editor_actions.cc:580
+#: editor_actions.cc:621
 msgid "Timecode Background"
 msgstr ""
 
-#: editor_actions.cc:581
+#: editor_actions.cc:622
 msgid "Fullscreen"
 msgstr ""
 
-#: editor_actions.cc:582
+#: editor_actions.cc:623
 msgid "Letterbox"
 msgstr ""
 
-#: editor_actions.cc:583
+#: editor_actions.cc:624
 msgid "Original Size"
 msgstr ""
 
-#: editor_actions.cc:640
+#: editor_actions.cc:681
 msgid "Sort"
 msgstr "Sorter"
 
-#: editor_actions.cc:651 editor_routes.cc:476 mixer_ui.cc:1196
+#: editor_actions.cc:692 editor_routes.cc:549 mixer_ui.cc:1497
 msgid "Show All"
 msgstr "Vis alle"
 
-#: editor_actions.cc:652
+#: editor_actions.cc:693
 msgid "Show Automatic Regions"
 msgstr "Vis automatiske bolkar"
 
-#: editor_actions.cc:654
+#: editor_actions.cc:695
 msgid "Ascending"
 msgstr "Stigande"
 
-#: editor_actions.cc:656
+#: editor_actions.cc:697
 msgid "Descending"
 msgstr "Fallande"
 
-#: editor_actions.cc:659
+#: editor_actions.cc:700
 msgid "By Region Name"
 msgstr "Etter bolknamn"
 
-#: editor_actions.cc:661
+#: editor_actions.cc:702
 msgid "By Region Length"
 msgstr "Etter bolklengd"
 
-#: editor_actions.cc:663
+#: editor_actions.cc:704
 msgid "By Region Position"
 msgstr "Etter bolkplassering"
 
-#: editor_actions.cc:665
+#: editor_actions.cc:706
 msgid "By Region Timestamp"
 msgstr "Etter tidsstemplet på bolken"
 
-#: editor_actions.cc:667
+#: editor_actions.cc:708
 msgid "By Region Start in File"
 msgstr "Etter bolkstarten i fila"
 
-#: editor_actions.cc:669
+#: editor_actions.cc:710
 msgid "By Region End in File"
 msgstr "Etter bolkslutten i fila"
 
-#: editor_actions.cc:671
+#: editor_actions.cc:712
 msgid "By Source File Name"
 msgstr "Etter namn på kjeldefila"
 
-#: editor_actions.cc:673
+#: editor_actions.cc:714
 msgid "By Source File Length"
 msgstr "Etter lengd på kjeldefila"
 
-#: editor_actions.cc:675
+#: editor_actions.cc:716
 msgid "By Source File Creation Date"
 msgstr "Etter datoen kjeldefila vart oppretta"
 
-#: editor_actions.cc:677
+#: editor_actions.cc:718
 msgid "By Source Filesystem"
 msgstr "Etter kjeldefilsystemet"
 
-#: editor_actions.cc:680
+#: editor_actions.cc:721
 msgid "Remove Unused"
 msgstr "Fjern ubrukte"
 
-#: editor_actions.cc:684 editor_audio_import.cc:282
-#: session_import_dialog.cc:75 session_import_dialog.cc:95
-#: session_metadata_dialog.cc:418 editor_videotimeline.cc:91
+#: editor_actions.cc:723
+msgid "Import PT session"
+msgstr ""
+
+#: editor_actions.cc:728 editor_audio_import.cc:282 editor_pt_import.cc:149
+#: luawindow.cc:99 session_import_dialog.cc:75 session_import_dialog.cc:95
+#: session_metadata_dialog.cc:421 sfdb_ui.cc:558 editor_videotimeline.cc:91
 msgid "Import"
 msgstr "Importer"
 
-#: editor_actions.cc:687
+#: editor_actions.cc:731
 msgid "Import to Region List..."
 msgstr "Importer til bolklista..."
 
-#: editor_actions.cc:690 session_import_dialog.cc:44
-msgid "Import From Session"
+#: editor_actions.cc:734 session_import_dialog.cc:44
+#: session_import_dialog.cc:65
+msgid "Import from Session"
 msgstr "Importer frå økt"
 
-#: editor_actions.cc:694
+#: editor_actions.cc:738
 msgid "Bring all media into session folder"
 msgstr ""
 
-#: editor_actions.cc:697
+#: editor_actions.cc:741
 msgid "Show Summary"
 msgstr "Vis samandrag"
 
-#: editor_actions.cc:699
+#: editor_actions.cc:743
 msgid "Show Group Tabs"
 msgstr "Vis gruppefaner"
 
-#: editor_actions.cc:701
+#: editor_actions.cc:745
 msgid "Show Measure Lines"
 msgstr ""
 
-#: editor_actions.cc:705
-msgid "Show Logo"
-msgstr "Vis logo"
-
-#: editor_actions.cc:709
+#: editor_actions.cc:747
 msgid "Toggle MIDI Input Active for Editor-Selected Tracks/Busses"
 msgstr "Skru på/av aktiv MIDI-inngang for redigeringsvalde spor/bussar"
 
-#: editor_actions.cc:732
-msgid "Loaded editor bindings from %1"
-msgstr "Lastar redigerinsbindingar frå %1"
-
-#: editor_actions.cc:734
-msgid "Could not find editor.bindings in search path %1"
-msgstr "Fann ikkje editor.bindings i søkjestigen %1"
-
-#: editor_actions.cc:1078 editor_actions.cc:1474 editor_actions.cc:1485
-#: editor_actions.cc:1538 editor_actions.cc:1549 editor_actions.cc:1596
-#: editor_actions.cc:1606 editor_regions.cc:1563
+#: editor_actions.cc:1081 editor_actions.cc:1477 editor_actions.cc:1488
+#: editor_actions.cc:1541 editor_actions.cc:1552 editor_actions.cc:1599
+#: editor_actions.cc:1609 editor_regions.cc:1657 luainstance.cc:327
+#: luainstance.cc:1690
 msgid "programming error: %1: %2"
 msgstr "Programmeringsfeil: %1: %2"
 
-#: editor_actions.cc:1774
+#: editor_actions.cc:1791
 msgid "Raise"
 msgstr "Hev"
 
-#: editor_actions.cc:1777
+#: editor_actions.cc:1794
 msgid "Raise to Top"
 msgstr "Hev til toppen"
 
-#: editor_actions.cc:1780
+#: editor_actions.cc:1797
 msgid "Lower"
 msgstr "Lægste"
 
-#: editor_actions.cc:1783
+#: editor_actions.cc:1800
 msgid "Lower to Bottom"
 msgstr "Senk til botnen"
 
-#: editor_actions.cc:1786
+#: editor_actions.cc:1803
 msgid "Move to Original Position"
 msgstr "Flytt til opphavleg plass"
 
-#: editor_actions.cc:1791
+#: editor_actions.cc:1808
 msgid "Lock to Video"
 msgstr ""
 
-#: editor_actions.cc:1796 editor_markers.cc:912
+#: editor_actions.cc:1813 editor_markers.cc:917
 msgid "Glue to Bars and Beats"
 msgstr "Lim til takter og taktslag"
 
-#: editor_actions.cc:1801
+#: editor_actions.cc:1818
 msgid "Remove Sync"
 msgstr "Fjern synk"
 
-#: editor_actions.cc:1804 mixer_strip.cc:2006 monitor_section.cc:272
-#: route_time_axis.cc:253 route_time_axis.cc:526
+#: editor_actions.cc:1821 mixer_strip.cc:2192 monitor_section.cc:253
+#: monitor_section.cc:321 route_time_axis.cc:264 route_time_axis.cc:550
 msgid "Mute"
 msgstr "Demp"
 
-#: editor_actions.cc:1807
+#: editor_actions.cc:1824
 msgid "Normalize..."
 msgstr "Normaliser..."
 
-#: editor_actions.cc:1810
+#: editor_actions.cc:1827
 msgid "Reverse"
 msgstr "Baklengs"
 
-#: editor_actions.cc:1813
+#: editor_actions.cc:1830
 msgid "Make Mono Regions"
 msgstr "Lag mono-bolkar"
 
-#: editor_actions.cc:1816
+#: editor_actions.cc:1833
 msgid "Boost Gain"
 msgstr "Auk volumet"
 
-#: editor_actions.cc:1819
+#: editor_actions.cc:1836
 msgid "Cut Gain"
 msgstr "Mink volumet"
 
-#: editor_actions.cc:1822
+#: editor_actions.cc:1839
 msgid "Pitch Shift..."
 msgstr "Endra tonehøgd..."
 
-#: editor_actions.cc:1825
-msgid "Transpose..."
-msgstr "Transponer..."
-
-#: editor_actions.cc:1828
+#: editor_actions.cc:1845
 msgid "Opaque"
 msgstr "Heildekkjande"
 
-#: editor_actions.cc:1832 editor_regions.cc:117
+#: editor_actions.cc:1849 editor_regions.cc:164
 msgid "Fade In"
 msgstr "Ton inn"
 
-#: editor_actions.cc:1837 editor_regions.cc:118
+#: editor_actions.cc:1854 editor_regions.cc:165
 msgid "Fade Out"
 msgstr "Ton ut"
 
-#: editor_actions.cc:1852
+#: editor_actions.cc:1869
 msgid "Multi-Duplicate..."
 msgstr "Multi-kopier..."
 
-#: editor_actions.cc:1857
+#: editor_actions.cc:1874
 msgid "Fill Track"
 msgstr "Fyll sporet"
 
-#: editor_actions.cc:1861 editor_markers.cc:1000
+#: editor_actions.cc:1878 editor_markers.cc:1033
 msgid "Set Loop Range"
 msgstr "Set lykkje-område"
 
-#: editor_actions.cc:1868
+#: editor_actions.cc:1885
 msgid "Set Punch"
 msgstr "Set innslag"
 
-#: editor_actions.cc:1872
+#: editor_actions.cc:1889
 msgid "Add Single Range Marker"
 msgstr "Legg til einskild områdemarkør"
 
-#: editor_actions.cc:1877
+#: editor_actions.cc:1894
 msgid "Add Range Marker Per Region"
 msgstr "Legg til områdemarkør per bolk"
 
-#: editor_actions.cc:1881
-msgid "Snap Position To Grid"
-msgstr "Fest posisjonen til gitteret"
+#: editor_actions.cc:1898
+msgid "Snap Position to Grid"
+msgstr ""
 
-#: editor_actions.cc:1884
+#: editor_actions.cc:1901
 msgid "Close Gaps"
 msgstr "Steng gap"
 
-#: editor_actions.cc:1887
+#: editor_actions.cc:1904
 msgid "Rhythm Ferret..."
 msgstr "Rytmefinnar..."
 
-#: editor_actions.cc:1890
+#: editor_actions.cc:1907
 msgid "Export..."
 msgstr "Eksporter..."
 
-#: editor_actions.cc:1896
+#: editor_actions.cc:1913
 msgid "Separate Under"
 msgstr "Skil under"
 
-#: editor_actions.cc:1900 editor_actions.cc:1901
+#: editor_actions.cc:1917 editor_actions.cc:1918
 msgid "Set Fade In Length"
 msgstr "Endre inntoningslengd"
 
-#: editor_actions.cc:1902 editor_actions.cc:1903
+#: editor_actions.cc:1919 editor_actions.cc:1920
 msgid "Set Fade Out Length"
 msgstr "Endre uttoningslengd"
 
-#: editor_actions.cc:1905
+#: editor_actions.cc:1922
 msgid "Set Tempo from Region = Bar"
 msgstr "Set tempoet ut frå at bolken = ei takt"
 
-#: editor_actions.cc:1910
+#: editor_actions.cc:1927
 msgid "Split at Percussion Onsets"
 msgstr "Del opp bolkane der perkusjonen kjem inn"
 
-#: editor_actions.cc:1915
+#: editor_actions.cc:1932
 msgid "List Editor..."
 msgstr "Listeredigering..."
 
-#: editor_actions.cc:1918
+#: editor_actions.cc:1935
 msgid "Properties..."
 msgstr "Eigenskapar..."
 
-#: editor_actions.cc:1922
+#: editor_actions.cc:1939
 msgid "Bounce (with processing)"
 msgstr "Miks ned området (med signalhandsaming)"
 
-#: editor_actions.cc:1923
+#: editor_actions.cc:1940
 msgid "Bounce (without processing)"
 msgstr "Nedmiks (utan signalhandsaming)"
 
-#: editor_actions.cc:1924
+#: editor_actions.cc:1941
 msgid "Combine"
 msgstr "Kombiner"
 
-#: editor_actions.cc:1925
+#: editor_actions.cc:1942
 msgid "Uncombine"
 msgstr "Løys opp"
 
-#: editor_actions.cc:1927
+#: editor_actions.cc:1944
+msgid "Loudness Analysis..."
+msgstr ""
+
+#: editor_actions.cc:1945
 msgid "Spectral Analysis..."
 msgstr "Spektrumanalyse..."
 
-#: editor_actions.cc:1929
+#: editor_actions.cc:1947
 msgid "Reset Envelope"
 msgstr "Nullstill omhylling"
 
-#: editor_actions.cc:1931
+#: editor_actions.cc:1949
 msgid "Reset Gain"
 msgstr "Nullstill volum"
 
-#: editor_actions.cc:1936
+#: editor_actions.cc:1954
 msgid "Envelope Active"
 msgstr "Omhylling på"
 
-#: editor_actions.cc:1944 editor_actions.cc:1945
+#: editor_actions.cc:1962 editor_actions.cc:1963
 msgid "Insert Patch Change..."
 msgstr "Set inn koplingsendring..."
 
-#: editor_actions.cc:1946
+#: editor_actions.cc:1964
 msgid "Unlink from other copies"
 msgstr "Fjern lenkjer frå andre kopiar"
 
-#: editor_actions.cc:1947
+#: editor_actions.cc:1965
 msgid "Strip Silence..."
 msgstr "Skjer bort stille..."
 
-#: editor_actions.cc:1948
+#: editor_actions.cc:1966
 msgid "Set Range Selection"
 msgstr "Definer områdeval"
 
-#: editor_actions.cc:1950 editor_actions.cc:1951
+#: editor_actions.cc:1968 editor_actions.cc:1969
 msgid "Nudge Later"
 msgstr "Skubb seinare"
 
-#: editor_actions.cc:1952 editor_actions.cc:1953
+#: editor_actions.cc:1970 editor_actions.cc:1971
 msgid "Nudge Earlier"
 msgstr "Skubb tidlegare"
 
-#: editor_actions.cc:1955
+#: editor_actions.cc:1973
 msgid "Sequence Regions"
 msgstr ""
 
-#: editor_actions.cc:1960
+#: editor_actions.cc:1978
 msgid "Nudge Later by Capture Offset"
 msgstr "Skubb seinare etter innspelingsforskuvinga"
 
-#: editor_actions.cc:1967
+#: editor_actions.cc:1985
 msgid "Nudge Earlier by Capture Offset"
 msgstr "Skubb tidlegare etter innspelingsforskuvinga"
 
-#: editor_actions.cc:1971
+#: editor_actions.cc:1989
 msgid "Trim to Loop"
 msgstr "Skjer til lykkja"
 
-#: editor_actions.cc:1972
+#: editor_actions.cc:1990
 msgid "Trim to Punch"
 msgstr "Skjer til innslaget"
 
-#: editor_actions.cc:1974
+#: editor_actions.cc:1992
 msgid "Trim to Previous"
 msgstr "Skjer til førre"
 
-#: editor_actions.cc:1975
+#: editor_actions.cc:1993
 msgid "Trim to Next"
 msgstr "Skjer til neste"
 
-#: editor_actions.cc:1982
-msgid "Insert Region From Region List"
-msgstr "Set inn bolk frå lista"
+#: editor_actions.cc:2000
+msgid "Insert Region from Region List"
+msgstr ""
 
-#: editor_actions.cc:1988
+#: editor_actions.cc:2006
 msgid "Set Sync Position"
 msgstr "Set synkposisjon"
 
-#: editor_actions.cc:1989
+#: editor_actions.cc:2007
 msgid "Place Transient"
 msgstr "Plasser signaltopp"
 
-#: editor_actions.cc:1990
+#: editor_actions.cc:2008
 msgid "Split/Separate"
 msgstr ""
 
-#: editor_actions.cc:1991
+#: editor_actions.cc:2009
 msgid "Trim Start at Edit Point"
 msgstr "Skjer til starten ved redigeringspunktet"
 
-#: editor_actions.cc:1992
+#: editor_actions.cc:2010
 msgid "Trim End at Edit Point"
 msgstr "Skjer til slutten ved redigeringspunktet"
 
-#: editor_actions.cc:1997
+#: editor_actions.cc:2015
 msgid "Align Start"
 msgstr "Juster starten"
 
-#: editor_actions.cc:2004
+#: editor_actions.cc:2022
 msgid "Align Start Relative"
 msgstr "Juster starten relativt"
 
-#: editor_actions.cc:2008
+#: editor_actions.cc:2026
 msgid "Align End"
 msgstr "Juster slutten"
 
-#: editor_actions.cc:2013
+#: editor_actions.cc:2031
 msgid "Align End Relative"
 msgstr "Juster slutten relativt"
 
-#: editor_actions.cc:2020
+#: editor_actions.cc:2038
 msgid "Align Sync"
 msgstr "Juster synk"
 
-#: editor_actions.cc:2027
+#: editor_actions.cc:2045
 msgid "Align Sync Relative"
 msgstr "Juster synken relativt"
 
-#: editor_actions.cc:2031 editor_actions.cc:2034
+#: editor_actions.cc:2049 editor_actions.cc:2050
 msgid "Choose Top..."
 msgstr "Vel topp..."
 
@@ -4566,32 +5121,33 @@ msgstr ""
 "Denne økta bruker alt ei kjeldefil som heiter %1. Vil du importera %2 som ny "
 "fil, eller hoppa over ho?"
 
-#: editor_audio_import.cc:282 editor_videotimeline.cc:91
+#: editor_audio_import.cc:282 editor_pt_import.cc:149
+#: editor_videotimeline.cc:91
 msgid "Cancel Import"
 msgstr "Avbryt import"
 
-#: editor_audio_import.cc:559
+#: editor_audio_import.cc:565
 msgid "Editor: cannot open file \"%1\", (%2)"
 msgstr "Redigering: Kan ikkje opna fila \"%1\" (%2)"
 
-#: editor_audio_import.cc:567
+#: editor_audio_import.cc:573
 msgid "Cancel entire import"
 msgstr "Avbryt heile importen"
 
-#: editor_audio_import.cc:568
+#: editor_audio_import.cc:574
 msgid "Don't embed it"
 msgstr "Ikkje set inn"
 
-#: editor_audio_import.cc:569
+#: editor_audio_import.cc:575
 msgid "Embed all without questions"
 msgstr "Set inn alle utan å spørja"
 
-#: editor_audio_import.cc:572 editor_audio_import.cc:598
-#: export_format_dialog.cc:60
+#: editor_audio_import.cc:578 editor_audio_import.cc:604
+#: export_format_dialog.cc:68
 msgid "Sample rate"
 msgstr "Punktfrekvens"
 
-#: editor_audio_import.cc:573 editor_audio_import.cc:599
+#: editor_audio_import.cc:579 editor_audio_import.cc:605
 msgid ""
 "%1\n"
 "This audiofile's sample rate doesn't match the session sample rate!"
@@ -4599,208 +5155,277 @@ msgstr ""
 "%1\n"
 "Denne lydfila har ikkje same punktfrekvens som økta du arbeider med!"
 
-#: editor_audio_import.cc:595
+#: editor_audio_import.cc:601
 msgid "Embed it anyway"
 msgstr "Set inn likevel"
 
-#: editor_canvas_events.cc:1306 editor_drag.cc:1381
+#: editor_pt_import.cc:81
+msgid "You can't import a PT session until you have a session loaded."
+msgstr ""
+
+#: editor_pt_import.cc:86
+msgid "Import PT Session"
+msgstr ""
+
+#: editor_pt_import.cc:97
+msgid "%1: this is only the directory/folder name, not the filename.\n"
+msgstr ""
+
+#: editor_pt_import.cc:132
+msgid "Doesn't seem to be a valid PT session file"
+msgstr ""
+
+#: editor_pt_import.cc:136
+msgid ""
+"PT v%1 Session @ %2Hz\n"
+"\n"
+"%3 audio files\n"
+"%4 regions\n"
+"%5 active regions\n"
+"\n"
+"Continue..."
+msgstr ""
+
+#: editor_pt_import.cc:175
+msgid ""
+"Failed to load one or more of the audio files, but continuing to attempt "
+"import."
+msgstr ""
+
+#: editor_pt_import.cc:178
+msgid "Success! Import should complete soon."
+msgstr ""
+
+#: editor_pt_import.cc:263
+msgid "PTImport: UINT_MAX routes? impossible!"
+msgstr ""
+
+#: editor_canvas_events.cc:1296 editor_drag.cc:1418
 msgid "Could not create new track after region placed in the drop zone"
 msgstr ""
 
-#: editor_drag.cc:1266
+#: editor_drag.cc:1306
 msgid "fixed time region drag"
 msgstr "fast tid-bolkflytting"
 
-#: editor_drag.cc:2214
+#: editor_drag.cc:2249
 msgid "Ripple drag"
 msgstr ""
 
-#: editor_drag.cc:2365 midi_region_view.cc:2813
+#: editor_drag.cc:2311
+msgid "create region"
+msgstr ""
+
+#: editor_drag.cc:2430 midi_region_view.cc:2859
 msgid "resize notes"
 msgstr "endra notestorleik"
 
-#: editor_drag.cc:2517
+#: editor_drag.cc:2613 editor_drag.cc:2648
+msgid ""
+"One or more Audio Regions\n"
+"are both Locked and\n"
+"Locked to Video.\n"
+"The video cannot me moved."
+msgstr ""
+
+#: editor_drag.cc:2683
 msgid "Video Start:"
 msgstr ""
 
-#: editor_drag.cc:2519
+#: editor_drag.cc:2685
 msgid "Diff:"
 msgstr ""
 
-#: editor_drag.cc:2538
+#: editor_drag.cc:2707
 msgid "Move Video"
 msgstr ""
 
-#: editor_drag.cc:3046
+#: editor_drag.cc:3177
+msgid "move meter mark"
+msgstr "flytt taktartmerke"
+
+#: editor_drag.cc:3179
 msgid "copy meter mark"
 msgstr "kopier taktartmerke"
 
-#: editor_drag.cc:3054
-msgid "move meter mark"
-msgstr "flytt taktartmerke"
+#: editor_drag.cc:3279
+msgid "inactive"
+msgstr ""
 
-#: editor_drag.cc:3177
+#: editor_drag.cc:3324
+msgid "move tempo mark"
+msgstr "flytt tempomerke"
+
+#: editor_drag.cc:3331
 msgid "copy tempo mark"
 msgstr "kopier tempomerke"
 
-#: editor_drag.cc:3185
-msgid "move tempo mark"
-msgstr "flytt tempomerke"
+#: editor_drag.cc:3462
+msgid "dilate tempo"
+msgstr ""
 
-#: editor_drag.cc:3412
+#: editor_drag.cc:3736
 msgid "change fade in length"
 msgstr "endra inntoningslengd"
 
-#: editor_drag.cc:3526
+#: editor_drag.cc:3861
 msgid "change fade out length"
 msgstr "endra uttoningslengd"
 
-#: editor_drag.cc:3880
+#: editor_drag.cc:4239
 msgid "move marker"
 msgstr "flytt markør"
 
-#: editor_drag.cc:4490
+#: editor_drag.cc:4506 editor_drag.cc:5833
+msgid "automation range move"
+msgstr "flytt automasjonsområde"
+
+#: editor_drag.cc:4890
 msgid "An error occurred while executing time stretch operation"
 msgstr "Feil med tidsstrekkinga"
 
-#: editor_drag.cc:4947
+#: editor_drag.cc:5351
 msgid "programming_error: %1"
 msgstr "programming_error: %1"
 
-#: editor_drag.cc:5016 editor_drag.cc:5026
+#: editor_drag.cc:5420 editor_drag.cc:5430
 msgid "new skip marker"
 msgstr ""
 
-#: editor_drag.cc:5017
+#: editor_drag.cc:5421
 msgid "skip"
 msgstr ""
 
-#: editor_drag.cc:5021 location_ui.cc:56
+#: editor_drag.cc:5425 location_ui.cc:60
 msgid "CD"
 msgstr "CD"
 
-#: editor_drag.cc:5022
+#: editor_drag.cc:5426
 msgid "new CD marker"
 msgstr ""
 
-#: editor_drag.cc:5027 editor_route_groups.cc:437 mixer_ui.cc:1493
+#: editor_drag.cc:5431 editor_route_groups.cc:439 mixer_ui.cc:1840
 msgid "unnamed"
 msgstr "utan namn"
 
-#: editor_drag.cc:5309
+#: editor_drag.cc:5740
 msgid "Automation range drag created for invalid region type"
 msgstr ""
 
-#: editor_route_groups.cc:96
+#: editor_route_groups.cc:97
 msgid "Col"
 msgstr "Farge"
 
-#: editor_route_groups.cc:96
+#: editor_route_groups.cc:97
 msgid "Group Tab Color"
 msgstr "Farge på gruppefane"
 
-#: editor_route_groups.cc:97
+#: editor_route_groups.cc:98
 msgid "Name of Group"
 msgstr "Namn på gruppa"
 
-#: editor_route_groups.cc:98 editor_routes.cc:207
-msgid "V"
-msgstr "V"
+#: editor_route_groups.cc:99 editor_routes.cc:234
+msgid "Visible|V"
+msgstr ""
 
-#: editor_route_groups.cc:98
+#: editor_route_groups.cc:99
 msgid "Group is visible?"
 msgstr "Er gruppa synleg?"
 
-#: editor_route_groups.cc:99
+#: editor_route_groups.cc:100
 msgid "On"
 msgstr "PÃ¥"
 
-#: editor_route_groups.cc:99
+#: editor_route_groups.cc:100
 msgid "Group is enabled?"
 msgstr "Er gruppa på?"
 
-#: editor_route_groups.cc:100
-msgid "group|G"
-msgstr "Gruppe|G"
+#: editor_route_groups.cc:101
+msgid "Group|G"
+msgstr ""
 
-#: editor_route_groups.cc:100
+#: editor_route_groups.cc:101
 msgid "Sharing Gain?"
 msgstr "Deler volum?"
 
-#: editor_route_groups.cc:101
-msgid "relative|Rel"
-msgstr "Relativt|Rel"
+#: editor_route_groups.cc:102
+msgid "Relative|Rel"
+msgstr ""
 
-#: editor_route_groups.cc:101
+#: editor_route_groups.cc:102
 msgid "Relative Gain Changes?"
 msgstr "Relative volumendringar?"
 
-#: editor_route_groups.cc:102
-msgid "mute|M"
-msgstr "Demp|D"
+#: editor_route_groups.cc:103 editor_regions.cc:168 editor_routes.cc:239
+#: mixer_strip.cc:2221 meter_strip.cc:365 route_time_axis.cc:2742
+#: time_axis_view.cc:1106
+msgid "Mute|M"
+msgstr ""
 
-#: editor_route_groups.cc:102
+#: editor_route_groups.cc:103
 msgid "Sharing Mute?"
 msgstr "Deler demping?"
 
-#: editor_route_groups.cc:103
-msgid "solo|S"
-msgstr "Solo|S"
+#: editor_route_groups.cc:104 editor_routes.cc:240 mixer_strip.cc:2234
+#: meter_strip.cc:373 route_time_axis.cc:2739 vca_master_strip.cc:211
+#: vca_time_axis.cc:236
+msgid "Solo|S"
+msgstr ""
 
-#: editor_route_groups.cc:103
+#: editor_route_groups.cc:104
 msgid "Sharing Solo?"
 msgstr "Deler solo?"
 
-#: editor_route_groups.cc:104 midi_time_axis.cc:1622 midi_time_axis.cc:1625
-#: midi_time_axis.cc:1628
+#: editor_route_groups.cc:105 midi_time_axis.cc:1626 midi_time_axis.cc:1629
+#: midi_time_axis.cc:1632
 msgid "Rec"
 msgstr "Ta opp"
 
-#: editor_route_groups.cc:104
+#: editor_route_groups.cc:105
 msgid "Sharing Record-enable Status?"
 msgstr "Deler opptaksstatus?"
 
-#: editor_route_groups.cc:105
-msgid "monitoring|Mon"
-msgstr "Lytting|Mon"
+#: editor_route_groups.cc:106
+msgid "Monitoring|Mon"
+msgstr ""
 
-#: editor_route_groups.cc:105
+#: editor_route_groups.cc:106
 msgid "Sharing Monitoring Choice?"
 msgstr "Deler monitorval?"
 
-#: editor_route_groups.cc:106
-msgid "selection|Sel"
-msgstr "Utval|Val"
+#: editor_route_groups.cc:107
+msgid "Selection|Sel"
+msgstr ""
 
-#: editor_route_groups.cc:106
+#: editor_route_groups.cc:107
 msgid "Sharing Selected/Editing Status?"
 msgstr "Deler vald/redigeringsstatus?"
 
-#: editor_route_groups.cc:107
-msgid "active|A"
-msgstr "aktiv|A"
+#: editor_route_groups.cc:108 editor_routes.cc:235
+msgid "Active|A"
+msgstr ""
 
-#: editor_route_groups.cc:107
+#: editor_route_groups.cc:108
 msgid "Sharing Active Status?"
 msgstr "Deler aktiv-status?"
 
-#: editor_export_audio.cc:92 editor_markers.cc:740 editor_markers.cc:827
-#: editor_markers.cc:1012 editor_markers.cc:1030 editor_markers.cc:1048
-#: editor_markers.cc:1067 editor_markers.cc:1086 editor_markers.cc:1116
-#: editor_markers.cc:1147 editor_markers.cc:1177 editor_markers.cc:1205
-#: editor_markers.cc:1236 editor_markers.cc:1261 editor_markers.cc:1312
-#: editor_markers.cc:1356 editor_markers.cc:1382 editor_markers.cc:1576
-#: editor_mouse.cc:2120
+#: editor_export_audio.cc:93 editor_markers.cc:733 editor_markers.cc:832
+#: editor_markers.cc:1045 editor_markers.cc:1063 editor_markers.cc:1081
+#: editor_markers.cc:1100 editor_markers.cc:1119 editor_markers.cc:1149
+#: editor_markers.cc:1180 editor_markers.cc:1210 editor_markers.cc:1238
+#: editor_markers.cc:1269 editor_markers.cc:1294 editor_markers.cc:1345
+#: editor_markers.cc:1458 editor_markers.cc:1484 editor_markers.cc:1678
+#: editor_mouse.cc:2255
 msgid "programming error: marker canvas item has no marker object pointer!"
 msgstr "Programmeringsfeil: markørpalettobjekt har ingen merkeobjektpeikar!"
 
-#: editor_export_audio.cc:145 editor_export_audio.cc:150
-msgid "File Exists!"
-msgstr "Fila eksisterer!"
+#: editor_export_audio.cc:114
+msgid "Confirm MIDI File Overwrite"
+msgstr ""
 
-#: editor_export_audio.cc:153
-msgid "Overwrite Existing File"
-msgstr "Skriv over eksisterande fil"
+#: editor_export_audio.cc:115 utils_videotl.cc:73
+msgid "A file with the same name already exists. Do you want to overwrite it?"
+msgstr ""
 
 #: editor_group_tabs.cc:176
 msgid "Fit to Window"
@@ -4814,128 +5439,161 @@ msgstr "start"
 msgid "end"
 msgstr "slutt"
 
-#: editor_markers.cc:657 editor_ops.cc:2085 editor_ops.cc:2107
-#: editor_ops.cc:2164 editor_ops.cc:2193 location_ui.cc:1023
+#: editor_markers.cc:645
+msgid "mark"
+msgstr ""
+
+#: editor_markers.cc:650 editor_ops.cc:2164 editor_ops.cc:2186
+#: editor_ops.cc:2304 editor_ops.cc:2341 location_ui.cc:1049
 msgid "add marker"
 msgstr "legg til merke"
 
-#: editor_markers.cc:689 editor_markers.cc:1456
+#: editor_markers.cc:682 editor_markers.cc:1558
 msgid "set loop range"
 msgstr "set lykkje-område"
 
-#: editor_markers.cc:705 editor_markers.cc:1462
+#: editor_markers.cc:698 editor_markers.cc:1564
 msgid "set punch range"
 msgstr "set innslagsområde"
 
-#: editor_markers.cc:722 editor_ops.cc:4055
+#: editor_markers.cc:715 editor_ops.cc:4159
 msgid "range"
 msgstr "område"
 
-#: editor_markers.cc:725
+#: editor_markers.cc:718
 msgid "new range marker"
 msgstr "nytt områdemerke"
 
-#: editor_markers.cc:758 editor_ops.cc:2129 location_ui.cc:859
+#: editor_markers.cc:751 editor_ops.cc:2272 location_ui.cc:885
 msgid "remove marker"
 msgstr "fjern markør"
 
-#: editor_markers.cc:894
+#: editor_markers.cc:899
 msgid "Locate to Here"
 msgstr "GÃ¥ hit"
 
-#: editor_markers.cc:895
+#: editor_markers.cc:900
 msgid "Play from Here"
 msgstr "Spel herifrå"
 
-#: editor_markers.cc:896
+#: editor_markers.cc:901
 msgid "Move Mark to Playhead"
 msgstr "Flytt merket til spelehovudet"
 
-#: editor_markers.cc:900
+#: editor_markers.cc:905
 msgid "Create Range to Next Marker"
 msgstr "Lag område til neste markør"
 
-#: editor_markers.cc:941
+#: editor_markers.cc:946
 msgid "Locate to Marker"
 msgstr ""
 
-#: editor_markers.cc:942
+#: editor_markers.cc:947
 msgid "Play from Marker"
 msgstr ""
 
-#: editor_markers.cc:945
+#: editor_markers.cc:950
 msgid "Set Marker from Playhead"
 msgstr ""
 
-#: editor_markers.cc:947
+#: editor_markers.cc:951
 msgid "Set Range from Selection"
 msgstr ""
 
-#: editor_markers.cc:957
+#: editor_markers.cc:960
 msgid "Hide Range"
 msgstr "Gøym området"
 
-#: editor_markers.cc:958
+#: editor_markers.cc:961
 msgid "Rename Range..."
 msgstr "Døyp om området..."
 
-#: editor_markers.cc:962
+#: editor_markers.cc:965
 msgid "Remove Range"
 msgstr "Fjern området"
 
-#: editor_markers.cc:969
+#: editor_markers.cc:972
 msgid "Separate Regions in Range"
 msgstr "Skil bolkane i omådet"
 
-#: editor_markers.cc:972
+#: editor_markers.cc:974
 msgid "Select Range"
 msgstr "Vel område"
 
-#: editor_markers.cc:1001
+#: editor_markers.cc:987
+msgid "Make Ramped"
+msgstr ""
+
+#: editor_markers.cc:989
+msgid "Make Constant"
+msgstr ""
+
+#: editor_markers.cc:993 editor_markers.cc:1013
+msgid "Lock to Music"
+msgstr ""
+
+#: editor_markers.cc:995 editor_markers.cc:1015
+msgid "Lock to Audio"
+msgstr ""
+
+#: editor_markers.cc:1034
 msgid "Set Punch Range"
 msgstr "Set innslagsområde"
 
-#: editor_markers.cc:1407 editor_ops.cc:2040
+#: editor_markers.cc:1391
+msgid "change meter lock style"
+msgstr ""
+
+#: editor_markers.cc:1414
+msgid "change tempo lock style"
+msgstr ""
+
+#: editor_markers.cc:1441
+msgid "change tempo type"
+msgstr ""
+
+#: editor_markers.cc:1509 editor_ops.cc:2119
 msgid "New Name:"
 msgstr "Nytt namn:"
 
-#: editor_markers.cc:1410
+#: editor_markers.cc:1512
 msgid "Rename Mark"
 msgstr "Døyp om merke"
 
-#: editor_markers.cc:1412
+#: editor_markers.cc:1514
 msgid "Rename Range"
 msgstr "Døyp om området"
 
-#: editor_markers.cc:1419 editor_mouse.cc:2137 processor_box.cc:1994
-#: processor_box.cc:2464 route_time_axis.cc:1100 route_ui.cc:1628
+#: editor_markers.cc:1521 editor_mouse.cc:2272 processor_box.cc:3192
+#: processor_box.cc:3681 route_time_axis.cc:1110 route_ui.cc:1637
+#: vca_master_strip.cc:395
 msgid "Rename"
 msgstr "Døyp om"
 
-#: editor_markers.cc:1432
+#: editor_markers.cc:1534
 msgid "rename marker"
 msgstr "døyp om markør"
 
-#: editor_mixer.cc:90
+#: editor_mixer.cc:98
 msgid "This screen is not tall enough to display the editor mixer"
 msgstr "Denne skjermen er ikkje høg nok til å visa redigeringsmiksaren"
 
-#: editor_mouse.cc:1223 editor_mouse.cc:1241 editor_tempodisplay.cc:270
+#: editor_mouse.cc:1345 editor_mouse.cc:1363 editor_tempodisplay.cc:384
 msgid ""
 "programming error: tempo marker canvas item has no marker object pointer!"
 msgstr ""
 "Programmeringsfeil: objektet på tempomarkørpaletten har ingen "
 "tempomarkørpeikar!"
 
-#: editor_mouse.cc:1228 editor_tempodisplay.cc:275
+#: editor_mouse.cc:1350 editor_tempodisplay.cc:389
 msgid "programming error: marker for tempo is not a tempo marker!"
 msgstr "Programmeringsfeil: markøren for tempo er ikkje ingen tempomarkør!"
 
-#: editor_mouse.cc:1246 editor_tempodisplay.cc:375
+#: editor_mouse.cc:1368 editor_tempodisplay.cc:507
 msgid "programming error: marker for meter is not a meter marker!"
 msgstr "Programmeringsfeil: taktartmarkøren er ikkje ein taktartmarkør!"
 
-#: editor_mouse.cc:1885 editor_mouse.cc:1910 editor_mouse.cc:1923
+#: editor_mouse.cc:2016 editor_mouse.cc:2041 editor_mouse.cc:2054
 msgid ""
 "programming error: control point canvas item has no control point object "
 "pointer!"
@@ -4943,175 +5601,183 @@ msgstr ""
 "Programmeringsfeil: objektet på kontrollpunktpaletten har ingen "
 "kontrollpunktpeikar!"
 
-#: editor_mouse.cc:2058
+#: editor_mouse.cc:2085
+msgid "edit note(s)"
+msgstr ""
+
+#: editor_mouse.cc:2193
 msgid "start point trim"
 msgstr "skjer startpunkt"
 
-#: editor_mouse.cc:2083
-msgid "End point trim"
-msgstr "Skjer sluttpunkt"
+#: editor_mouse.cc:2218
+msgid "end point trim"
+msgstr ""
 
-#: editor_mouse.cc:2135
+#: editor_mouse.cc:2270
 msgid "Name for region:"
 msgstr "Namn på bolken:"
 
-#: editor_ops.cc:165
+#: editor_ops.cc:168
 msgid "split"
 msgstr "del"
 
-#: editor_ops.cc:339
+#: editor_ops.cc:342
 msgid "alter selection"
 msgstr "endra utval"
 
-#: editor_ops.cc:381
+#: editor_ops.cc:384
 msgid "nudge regions forward"
 msgstr "skubb bolkane framover"
 
-#: editor_ops.cc:404 editor_ops.cc:489
+#: editor_ops.cc:441 editor_ops.cc:535
 msgid "nudge location forward"
 msgstr "skubb staden framover"
 
-#: editor_ops.cc:462
+#: editor_ops.cc:472
 msgid "nudge regions backward"
 msgstr "skubb bolkane bakover"
 
-#: editor_ops.cc:551
+#: editor_ops.cc:567
 msgid "nudge forward"
 msgstr "skubb framover"
 
-#: editor_ops.cc:575
+#: editor_ops.cc:591
 msgid "nudge backward"
 msgstr "skubb bakover"
 
-#: editor_ops.cc:618
+#: editor_ops.cc:656
 msgid "sequence regions"
 msgstr ""
 
-#: editor_ops.cc:694
+#: editor_ops.cc:718
 msgid "build_region_boundary_cache called with snap_type = %1"
 msgstr "build_region_boundary_cache oppkalla med snap_type = %1"
 
-#: editor_ops.cc:2042
+#: editor_ops.cc:2121
 msgid "New Location Marker"
 msgstr "Ny stadmarkør"
 
-#: editor_ops.cc:2164
+#: editor_ops.cc:2212 editor_ops.cc:2236
+msgid "Set session start"
+msgstr ""
+
+#: editor_ops.cc:2304
 msgid "add markers"
 msgstr "legg til markørar"
 
-#: editor_ops.cc:2274
+#: editor_ops.cc:2400
 msgid "clear markers"
 msgstr "tøm markørar"
 
-#: editor_ops.cc:2289
+#: editor_ops.cc:2415
 msgid "clear ranges"
 msgstr "tøm område"
 
-#: editor_ops.cc:2305
+#: editor_ops.cc:2431
 msgid "clear locations"
 msgstr "tøm stader"
 
-#: editor_ops.cc:2368
+#: editor_ops.cc:2494
 msgid "insert region"
 msgstr "set inn bolk"
 
-#: editor_ops.cc:2559
+#: editor_ops.cc:2685
 msgid "raise regions"
 msgstr "hev bolkane"
 
-#: editor_ops.cc:2561
+#: editor_ops.cc:2687
 msgid "raise region"
 msgstr "hev bolken"
 
-#: editor_ops.cc:2567
+#: editor_ops.cc:2693
 msgid "raise regions to top"
 msgstr "hev bolkane til øvste laget"
 
-#: editor_ops.cc:2569
+#: editor_ops.cc:2695
 msgid "raise region to top"
 msgstr "hev bolken til øvste laget"
 
-#: editor_ops.cc:2575
+#: editor_ops.cc:2701
 msgid "lower regions"
 msgstr "senk bolkane"
 
-#: editor_ops.cc:2577 editor_ops.cc:2585
+#: editor_ops.cc:2703 editor_ops.cc:2711
 msgid "lower region"
 msgstr "senk bolken"
 
-#: editor_ops.cc:2583
+#: editor_ops.cc:2709
 msgid "lower regions to bottom"
 msgstr "senk bolkane til botnlaget"
 
-#: editor_ops.cc:2668
+#: editor_ops.cc:2794
 msgid "Rename Region"
 msgstr "Døyp om bolken"
 
-#: editor_ops.cc:2670 processor_box.cc:1992 route_ui.cc:1626
+#: editor_ops.cc:2796 processor_box.cc:3190 route_ui.cc:1635
 msgid "New name:"
 msgstr "Nytt namn:"
 
-#: editor_ops.cc:2987
+#: editor_ops.cc:3097
 msgid "separate"
 msgstr "skil"
 
-#: editor_ops.cc:3099
+#: editor_ops.cc:3207
 msgid "separate region under"
 msgstr "skil bolken under"
 
-#: editor_ops.cc:3220
+#: editor_ops.cc:3360
 msgid "trim to selection"
 msgstr "skjer til utvalet"
 
-#: editor_ops.cc:3356
+#: editor_ops.cc:3442
 msgid "set sync point"
 msgstr "Set synk-punkt"
 
-#: editor_ops.cc:3380
+#: editor_ops.cc:3466
 msgid "remove region sync"
 msgstr "fjern bolksynk"
 
-#: editor_ops.cc:3402
+#: editor_ops.cc:3488
 msgid "move regions to original position"
 msgstr "flytt bolkane til opphavleg plassering"
 
-#: editor_ops.cc:3404
+#: editor_ops.cc:3490
 msgid "move region to original position"
 msgstr "flytt bolken til opphavleg plassering"
 
-#: editor_ops.cc:3425
+#: editor_ops.cc:3511
 msgid "align selection"
 msgstr "juster utval"
 
-#: editor_ops.cc:3499
+#: editor_ops.cc:3585
 msgid "align selection (relative)"
 msgstr "juster utval (relativt)"
 
-#: editor_ops.cc:3533
+#: editor_ops.cc:3619
 msgid "align region"
 msgstr "juster bolken"
 
-#: editor_ops.cc:3584
+#: editor_ops.cc:3670
 msgid "trim front"
 msgstr "skjer til framme"
 
-#: editor_ops.cc:3584
+#: editor_ops.cc:3670
 msgid "trim back"
 msgstr "skjer til bak"
 
-#: editor_ops.cc:3614
+#: editor_ops.cc:3700
 msgid "trim to loop"
 msgstr "skjer til lykkja"
 
-#: editor_ops.cc:3624
+#: editor_ops.cc:3710
 msgid "trim to punch"
 msgstr "skjer til innslaget"
 
-#: editor_ops.cc:3686
+#: editor_ops.cc:3832
 msgid "trim to region"
 msgstr "skjer til bolken"
 
-#: editor_ops.cc:3794
+#: editor_ops.cc:3891
 msgid ""
 "This track/bus cannot be frozen because the signal adds or loses channels "
 "before reaching the outputs.\n"
@@ -5123,11 +5789,11 @@ msgstr ""
 "Dette kjem vanlegvis av utvidingar som lagar stereo-utsignal frå mono-"
 "innsignal, eller omvendt."
 
-#: editor_ops.cc:3797
+#: editor_ops.cc:3894
 msgid "Cannot freeze"
 msgstr "Kan ikkje frysa"
 
-#: editor_ops.cc:3803
+#: editor_ops.cc:3900
 msgid ""
 "<b>%1</b>\n"
 "\n"
@@ -5142,23 +5808,23 @@ msgstr ""
 "Viss du frys det, vil du berre påverka signalet til fyrste send/retur/"
 "innsmett."
 
-#: editor_ops.cc:3807
+#: editor_ops.cc:3904
 msgid "Freeze anyway"
 msgstr "Frys likevel"
 
-#: editor_ops.cc:3808
+#: editor_ops.cc:3905
 msgid "Don't freeze"
 msgstr "Ikkje frys"
 
-#: editor_ops.cc:3809
+#: editor_ops.cc:3906
 msgid "Freeze Limits"
 msgstr "Frysgrenser"
 
-#: editor_ops.cc:3824
+#: editor_ops.cc:3921
 msgid "Cancel Freeze"
 msgstr "Avbryt frysing"
 
-#: editor_ops.cc:3854
+#: editor_ops.cc:3952
 msgid ""
 "You can't perform this operation because the processing of the signal will "
 "cause one or more of the tracks to end up with a region with more channels "
@@ -5167,47 +5833,47 @@ msgid ""
 "You can do this without processing, which is a different operation."
 msgstr ""
 
-#: editor_ops.cc:3858
+#: editor_ops.cc:3956
 msgid "Cannot bounce"
 msgstr "Kan ikkje miksa ned"
 
-#: editor_ops.cc:3869
+#: editor_ops.cc:4007
 msgid "bounce range"
 msgstr "miks ned område"
 
-#: editor_ops.cc:3971
+#: editor_ops.cc:4074
 msgid "delete"
 msgstr "slett"
 
-#: editor_ops.cc:3974
+#: editor_ops.cc:4077
 msgid "cut"
 msgstr "klypp"
 
-#: editor_ops.cc:3977
+#: editor_ops.cc:4080
 msgid "copy"
 msgstr "kopier"
 
-#: editor_ops.cc:3980
+#: editor_ops.cc:4083
 msgid "clear"
 msgstr "tøm"
 
-#: editor_ops.cc:4028
+#: editor_ops.cc:4132
 msgid "objects"
 msgstr ""
 
-#: editor_ops.cc:4238 editor_ops.cc:4270
+#: editor_ops.cc:4342 editor_ops.cc:4427
 msgid "remove region"
 msgstr "fjern bolken"
 
-#: editor_ops.cc:4719
-msgid "duplicate selection"
-msgstr "klon utvalet"
+#: editor_ops.cc:4844
+msgid "duplicate range selection"
+msgstr ""
 
-#: editor_ops.cc:4803
+#: editor_ops.cc:4938
 msgid "nudge track"
 msgstr "skubb spor"
 
-#: editor_ops.cc:4840
+#: editor_ops.cc:4965
 msgid ""
 "Do you really want to destroy the last capture?\n"
 "(This is destructive and cannot be undone)"
@@ -5215,138 +5881,158 @@ msgstr ""
 "Vil du verkeleg øydeleggja siste innspelinga?\n"
 "(Dette er endeleg og kan ikkje angrast)"
 
-#: editor_ops.cc:4843 editor_ops.cc:6838 editor_regions.cc:462
-#: editor_snapshots.cc:159 route_ui.cc:1569
+#: editor_ops.cc:4968 editor_ops.cc:7202 editor_regions.cc:503
+#: editor_snapshots.cc:171
 msgid "No, do nothing."
 msgstr "Nei, ikkje gjer noko."
 
-#: editor_ops.cc:4844
+#: editor_ops.cc:4969
 msgid "Yes, destroy it."
 msgstr "Ja, øydelegg det."
 
-#: editor_ops.cc:4846
+#: editor_ops.cc:4971
 msgid "Destroy last capture"
 msgstr "Fjern siste opptak"
 
-#: editor_ops.cc:4906
+#: editor_ops.cc:5047
 msgid "normalize"
 msgstr "normaliser"
 
-#: editor_ops.cc:5000
+#: editor_ops.cc:5145
 msgid "reverse regions"
 msgstr "vend bolkane"
 
-#: editor_ops.cc:5034
+#: editor_ops.cc:5182
 msgid "strip silence"
 msgstr "skjer bort stille"
 
-#: editor_ops.cc:5091
+#: editor_ops.cc:5263
 msgid "Fork Region(s)"
 msgstr "Del opp bolk(ane)"
 
-#: editor_ops.cc:5112
+#: editor_ops.cc:5270
 msgid "Could not unlink %1"
 msgstr ""
 
-#: editor_ops.cc:5326
+#: editor_ops.cc:5532
 msgid "reset region gain"
 msgstr "rensk bolk-innvolum"
 
-#: editor_ops.cc:5379
+#: editor_ops.cc:5590
 msgid "region gain envelope active"
 msgstr "bolkomhyllinga på"
 
-#: editor_ops.cc:5406
+#: editor_ops.cc:5615
 msgid "toggle region lock"
 msgstr "skru på bolklås"
 
-#: editor_ops.cc:5430
+#: editor_ops.cc:5639
 msgid "Toggle Video Lock"
 msgstr ""
 
-#: editor_ops.cc:5454
+#: editor_ops.cc:5663
 msgid "region lock style"
 msgstr "type bolklås"
 
-#: editor_ops.cc:5479
+#: editor_ops.cc:5688
 msgid "change region opacity"
 msgstr "endra bolkgjennomsikt"
 
-#: editor_ops.cc:5572
+#: editor_ops.cc:5781
 msgid "fade range"
 msgstr ""
 
-#: editor_ops.cc:5610
+#: editor_ops.cc:5819
 msgid "set fade in length"
 msgstr "endra inntoningslengd"
 
-#: editor_ops.cc:5617
+#: editor_ops.cc:5826
 msgid "set fade out length"
 msgstr "endra uttoningslengd"
 
-#: editor_ops.cc:5662
+#: editor_ops.cc:5891
 msgid "set fade in shape"
 msgstr "endra inntoningsform"
 
-#: editor_ops.cc:5693
+#: editor_ops.cc:5926
 msgid "set fade out shape"
 msgstr "endra uttoningsform"
 
-#: editor_ops.cc:5723
+#: editor_ops.cc:5962
 msgid "set fade in active"
 msgstr "skru på inntoning"
 
-#: editor_ops.cc:5752
+#: editor_ops.cc:5996
 msgid "set fade out active"
 msgstr "skru på uttoning"
 
-#: editor_ops.cc:5994
+#: editor_ops.cc:6056
+msgid "toggle fade active"
+msgstr ""
+
+#: editor_ops.cc:6249
 msgid "set loop range from selection"
 msgstr "set lykkjeområde frå utvalet"
 
-#: editor_ops.cc:6008
+#: editor_ops.cc:6263
 msgid "set loop range from region"
 msgstr "set lykkjeområde frå bolken"
 
-#: editor_ops.cc:6027
+#: editor_ops.cc:6282
 msgid "set punch range from selection"
 msgstr "set innslagsområde frå utvalet"
 
-#: editor_ops.cc:6041
+#: editor_ops.cc:6306
 msgid "set session start/end from selection"
 msgstr ""
 
-#: editor_ops.cc:6066
+#: editor_ops.cc:6344
+msgid "set punch start from EP"
+msgstr ""
+
+#: editor_ops.cc:6372
+msgid "set punch end from EP"
+msgstr ""
+
+#: editor_ops.cc:6405
+msgid "set loop start from EP"
+msgstr ""
+
+#: editor_ops.cc:6433
+msgid "set loop end from EP"
+msgstr ""
+
+#: editor_ops.cc:6444
 msgid "set punch range from region"
 msgstr "set innslagsområdet frå bolken"
 
-#: editor_ops.cc:6175
+#: editor_ops.cc:6531
 msgid "Add new marker"
 msgstr "Legg til markør"
 
-#: editor_ops.cc:6176
+#: editor_ops.cc:6532
 msgid "Set global tempo"
 msgstr "Set tempo for heile prosjektet"
 
-#: editor_ops.cc:6179
+#: editor_ops.cc:6535
 msgid "Define one bar"
 msgstr "Definer ei takt"
 
-#: editor_ops.cc:6180
+#: editor_ops.cc:6536
 msgid "Do you want to set the global tempo or add a new tempo marker?"
 msgstr ""
 "Vil du setja tempoet for heile prosjektet, eller leggja til ein ny "
 "tempomarkør?"
 
-#: editor_ops.cc:6206
+#: editor_ops.cc:6562
 msgid "set tempo from region"
 msgstr "set tempo ut frå bolken"
 
-#: editor_ops.cc:6236
+#: editor_ops.cc:6591
 msgid "split regions"
 msgstr "del opp bolkane"
 
-#: editor_ops.cc:6278
+#: editor_ops.cc:6633
 msgid ""
 "You are about to split\n"
 "%1\n"
@@ -5358,11 +6044,11 @@ msgstr ""
 "i %2 deler.\n"
 "Dette kan ta lang tid."
 
-#: editor_ops.cc:6285
+#: editor_ops.cc:6640
 msgid "Call for the Ferret!"
 msgstr "Rop på rytmefinnaren!"
 
-#: editor_ops.cc:6286
+#: editor_ops.cc:6641
 msgid ""
 "Press OK to continue with this split operation\n"
 "or ask the Ferret dialog to tune the analysis"
@@ -5370,52 +6056,52 @@ msgstr ""
 "Klikk OK for å halda fram med denne oppdelinga,\n"
 "eller spør Finnaren om å finstilla analysen."
 
-#: editor_ops.cc:6288
+#: editor_ops.cc:6643
 msgid "Press OK to continue with this split operation"
 msgstr "Klikk OK for å halda fram med oppdelinga"
 
-#: editor_ops.cc:6291
+#: editor_ops.cc:6646
 msgid "Excessive split?"
 msgstr "Overdriv delinga?"
 
-#: editor_ops.cc:6443
+#: editor_ops.cc:6800
 msgid "place transient"
 msgstr "plasser signaltopp"
 
-#: editor_ops.cc:6478
+#: editor_ops.cc:6834
 msgid "snap regions to grid"
 msgstr "fest bolkane til gitteret"
 
-#: editor_ops.cc:6517
+#: editor_ops.cc:6873
 msgid "Close Region Gaps"
 msgstr "Steng gap mellom bolkane"
 
-#: editor_ops.cc:6522
+#: editor_ops.cc:6878
 msgid "Crossfade length"
 msgstr "Krysstoningslengd"
 
-#: editor_ops.cc:6531 editor_ops.cc:6542 rhythm_ferret.cc:119
-#: session_option_editor.cc:141
+#: editor_ops.cc:6887 editor_ops.cc:6898 rhythm_ferret.cc:128
+#: rhythm_ferret.cc:143 session_option_editor.cc:141
 msgid "ms"
 msgstr "ms"
 
-#: editor_ops.cc:6533
+#: editor_ops.cc:6889
 msgid "Pull-back length"
 msgstr "Skyv tilbake-lengd"
 
-#: editor_ops.cc:6546
+#: editor_ops.cc:6902 keyeditor.cc:71
 msgid "Ok"
 msgstr "Ok"
 
-#: editor_ops.cc:6561
+#: editor_ops.cc:6917
 msgid "close region gaps"
 msgstr "steng gap mellom bolkane"
 
-#: editor_ops.cc:6786 route_ui.cc:1543
+#: editor_ops.cc:7160
 msgid "That would be bad news ...."
 msgstr "Det ville vore dårleg nytt..."
 
-#: editor_ops.cc:6791 route_ui.cc:1548
+#: editor_ops.cc:7165
 msgid ""
 "Removing the master or monitor bus is such a bad idea\n"
 "that %1 is not going to allow it.\n"
@@ -5431,23 +6117,21 @@ msgstr ""
 "redigerer du ardour.rc-fila, og set\n"
 "\"allow-special-bus-removal\"-valet til \"yes\""
 
-#: editor_ops.cc:6809
-msgid "tracks"
-msgstr "spor"
-
-#: editor_ops.cc:6811 route_ui.cc:1992
+#: editor_ops.cc:7181
+#, fuzzy
 msgid "track"
-msgstr "spor"
-
-#: editor_ops.cc:6815
-msgid "busses"
-msgstr "bussar"
+msgid_plural "tracks"
+msgstr[0] "spor"
+msgstr[1] "spor"
 
-#: editor_ops.cc:6817 route_ui.cc:1992
+#: editor_ops.cc:7182
+#, fuzzy
 msgid "bus"
-msgstr "buss"
+msgid_plural "busses"
+msgstr[0] "buss"
+msgstr[1] "buss"
 
-#: editor_ops.cc:6822
+#: editor_ops.cc:7186
 msgid ""
 "Do you really want to remove %1 %2 and %3 %4?\n"
 "(You may also lose the playlists associated with the %2)\n"
@@ -5459,7 +6143,7 @@ msgstr ""
 "\n"
 "Du kan ikkje angra dette, og øktfila vil bli overskriven!"
 
-#: editor_ops.cc:6827
+#: editor_ops.cc:7191
 msgid ""
 "Do you really want to remove %1 %2?\n"
 "(You may also lose the playlists associated with the %2)\n"
@@ -5471,147 +6155,148 @@ msgstr ""
 "\n"
 "Du kan ikkje angra dette, og øktfila vil bli overskriven!"
 
-#: editor_ops.cc:6833
+#: editor_ops.cc:7197
 msgid ""
 "Do you really want to remove %1 %2?\n"
 "\n"
 "This action cannot be undone, and the session file will be overwritten"
 msgstr ""
 
-#: editor_ops.cc:6840
+#: editor_ops.cc:7204
 msgid "Yes, remove them."
 msgstr "Ja, slett dei."
 
-#: editor_ops.cc:6842 editor_snapshots.cc:160 route_ui.cc:1570
+#: editor_ops.cc:7206 editor_snapshots.cc:172
 msgid "Yes, remove it."
 msgstr "Ja, slett det."
 
-#: editor_ops.cc:6847 editor_ops.cc:6849
+#: editor_ops.cc:7211 editor_ops.cc:7213
 msgid "Remove %1"
 msgstr "Fjern %1"
 
-#: editor_ops.cc:6912
+#: editor_ops.cc:7319 editor_ops.cc:7333 editor_ops.cc:7373 editor_ops.cc:7383
 msgid "insert time"
 msgstr "set inn tid"
 
-#: editor_ops.cc:7076
+#: editor_ops.cc:7436
+msgid "Cannot insert or delete time when in Lock edit."
+msgstr ""
+
+#: editor_ops.cc:7456 editor_ops.cc:7468 editor_ops.cc:7541 editor_ops.cc:7554
+msgid "remove time"
+msgstr ""
+
+#: editor_ops.cc:7628
 msgid "There are too many tracks to fit in the current window"
 msgstr "Det er for mange spor til at dei passar i denne ruta"
 
-#: editor_ops.cc:7137
+#: editor_ops.cc:7689
 msgid "Sel"
 msgstr ""
 
-#: editor_ops.cc:7176
+#: editor_ops.cc:7728
 #, c-format
 msgid "Saved view %u"
 msgstr "Lagra vising %u"
 
-#: editor_ops.cc:7201
+#: editor_ops.cc:7753
 msgid "mute regions"
 msgstr "demp bolkane"
 
-#: editor_ops.cc:7203
+#: editor_ops.cc:7755
 msgid "mute region"
 msgstr "demp bolken"
 
-#: editor_ops.cc:7240
+#: editor_ops.cc:7792
 msgid "combine regions"
 msgstr "kombiner bolkar"
 
-#: editor_ops.cc:7278
+#: editor_ops.cc:7830
 msgid "uncombine regions"
 msgstr "løys opp bolkar"
 
-#: editor_ops.cc:7315
+#: editor_ops.cc:7867
 msgid "%1: Locked"
 msgstr ""
 
-#: editor_ops.cc:7322
+#: editor_ops.cc:7874
 msgid "Click to unlock"
 msgstr ""
 
-#: editor_ops.cc:7376
+#: editor_ops.cc:7923
 msgid "Moving embedded files into session folder"
 msgstr ""
 
-#: editor_regions.cc:112
+#: editor_regions.cc:159
 msgid "Region name, with number of channels in []'s"
 msgstr "Bolknamn, med tal på kanalar i [hakeparentesar]"
 
-#: editor_regions.cc:113
+#: editor_regions.cc:160
 msgid "Position of start of region"
 msgstr "Kvar bolken startar"
 
-#: editor_regions.cc:114 editor_regions.cc:851 time_info_box.cc:101
+#: editor_regions.cc:161 editor_regions.cc:935 time_info_box.cc:95
 msgid "End"
 msgstr "Slutt"
 
-#: editor_regions.cc:114
+#: editor_regions.cc:161
 msgid "Position of end of region"
 msgstr "Kvar bolken sluttar"
 
-#: editor_regions.cc:115
+#: editor_regions.cc:162
 msgid "Length of the region"
 msgstr "Lengda på bolken"
 
-#: editor_regions.cc:116
+#: editor_regions.cc:163
 msgid "Position of region sync point, relative to start of the region"
 msgstr "Plassering for bolk-synkpunktet, relativt til bolkstarten"
 
-#: editor_regions.cc:117
+#: editor_regions.cc:164
 msgid "Length of region fade-in (units: secondary clock), () if disabled"
 msgstr ""
 "Lengd på inntoninga på bolken (eining: sekundærklokke), () viss avskrudd"
 
-#: editor_regions.cc:118
+#: editor_regions.cc:165
 msgid "Length of region fade-out (units: secondary clock), () if disabled"
 msgstr ""
 
-#: editor_regions.cc:119 mixer_strip.cc:2055 mono_panner.cc:203
-#: panner2d.cc:240 stereo_panner.cc:251 stereo_panner.cc:274
-msgid "L"
-msgstr "V"
+#: editor_regions.cc:166
+msgid "Lock|L"
+msgstr ""
 
-#: editor_regions.cc:119
+#: editor_regions.cc:166
 msgid "Region position locked?"
 msgstr "Er bolkplasseringa låst?"
 
-#: editor_regions.cc:120 route_time_axis.cc:103
-msgid "G"
-msgstr "G"
+#: editor_regions.cc:167
+msgid "Gain|G"
+msgstr ""
 
-#: editor_regions.cc:120
+#: editor_regions.cc:167
 msgid "Region position glued to Bars|Beats time?"
 msgstr "Er bolkplasseringa limt til takter|taktslag-tida?"
 
-#: editor_regions.cc:121 editor_routes.cc:211 gain_meter.cc:793
-#: mixer_strip.cc:2032 meter_strip.cc:359 panner_ui.cc:603
-#: route_time_axis.cc:2713 stereo_panner.cc:271 time_axis_view.cc:1190
-msgid "M"
-msgstr "M"
-
-#: editor_regions.cc:121
+#: editor_regions.cc:168
 msgid "Region muted?"
 msgstr "Er bolken dempa?"
 
-#: editor_regions.cc:122 mixer_strip.cc:1855
-msgid "O"
-msgstr "O"
+#: editor_regions.cc:169
+msgid "Opaque|O"
+msgstr ""
 
-#: editor_regions.cc:122
+#: editor_regions.cc:169
 msgid "Region opaque (blocks regions below it from being heard)?"
 msgstr "Er bolken gjennomsiktig? (Det hindrar at du høyrer bolkar under han.)"
 
-#: editor_regions.cc:311 editor_regions.cc:316 editor_regions.cc:318
+#: editor_regions.cc:360 editor_regions.cc:365 editor_regions.cc:367
 msgid "Hidden"
 msgstr "Gøymt"
 
-#: editor_regions.cc:391
+#: editor_regions.cc:432
 msgid "(MISSING) "
 msgstr " (MANGLAR) "
 
-#: editor_regions.cc:459
+#: editor_regions.cc:500
 msgid ""
 "Do you really want to remove unused regions?\n"
 "(This is destructive and cannot be undone)"
@@ -5619,179 +6304,187 @@ msgstr ""
 "Vil du verkeleg fjerna ubrukte bolkar?\n"
 "(Dette er endeleg og kan ikkje angrast)"
 
-#: editor_regions.cc:463
+#: editor_regions.cc:504
 msgid "Yes, remove."
 msgstr "Ja, slett"
 
-#: editor_regions.cc:465
+#: editor_regions.cc:506
 msgid "Remove unused regions"
 msgstr "Fjern ubrukte bolkar"
 
-#: editor_regions.cc:818 editor_regions.cc:832 editor_regions.cc:846
+#: editor_regions.cc:735
+msgid "EditorRegions::format_position: negative timecode position: %1"
+msgstr ""
+
+#: editor_regions.cc:900 editor_regions.cc:916 editor_regions.cc:930
 msgid "Mult."
 msgstr "Dobl."
 
-#: editor_regions.cc:849 midi_list_editor.cc:104 time_info_box.cc:94
+#: editor_regions.cc:933 midi_list_editor.cc:104 time_info_box.cc:88
 msgid "Start"
 msgstr "Start"
 
-#: editor_regions.cc:867 editor_regions.cc:883
+#: editor_regions.cc:951 editor_regions.cc:967
 msgid "Multiple"
 msgstr "Mangedoble"
 
-#: editor_regions.cc:952
+#: editor_regions.cc:1036
 msgid "MISSING "
 msgstr "MANGLAR"
 
-#: editor_routes.cc:182 editor_routes.cc:214
+#: editor_routes.cc:126
+msgid "RS"
+msgstr ""
+
+#: editor_routes.cc:208
 msgid "SS"
 msgstr "SS"
 
-#: editor_routes.cc:206
+#: editor_routes.cc:233
 msgid "Track/Bus Name"
 msgstr "Namn på spor/buss"
 
-#: editor_routes.cc:207
+#: editor_routes.cc:234
 msgid "Track/Bus visible ?"
 msgstr "Er sporet/bussen synleg?"
 
-#: editor_routes.cc:208 mixer_strip.cc:2046 meter_strip.cc:371
-#: route_time_axis.cc:105 route_time_axis.cc:2701
-msgid "A"
-msgstr "A"
-
-#: editor_routes.cc:208
+#: editor_routes.cc:235
 msgid "Track/Bus active ?"
 msgstr "Er sporet/bussen aktiv?"
 
-#: editor_routes.cc:209 mixer_strip.cc:2033 mixer_strip.cc:2054
-#: meter_strip.cc:379
-msgid "I"
-msgstr "I"
+#: editor_routes.cc:236
+msgid "MidiInput|I"
+msgstr ""
 
-#: editor_routes.cc:209
+#: editor_routes.cc:236
 msgid "MIDI input enabled"
 msgstr "MIDI-inngang skrudd på"
 
-#: editor_routes.cc:210 mono_panner.cc:220 panner2d.cc:241
-#: stereo_panner.cc:249 stereo_panner.cc:276
-msgid "R"
-msgstr "R"
+#: editor_routes.cc:237
+msgid "Rec|R"
+msgstr ""
 
-#: editor_routes.cc:210
+#: editor_routes.cc:237
 msgid "Record enabled"
 msgstr "Opptak skrudd på"
 
-#: editor_routes.cc:211
+#: editor_routes.cc:238
+msgid "Rec|RS"
+msgstr ""
+
+#: editor_routes.cc:238
+msgid "Record Safe"
+msgstr ""
+
+#: editor_routes.cc:239
 msgid "Muted"
 msgstr "Dempa"
 
-#: editor_routes.cc:212 mixer_strip.cc:2042 meter_strip.cc:367
-#: route_time_axis.cc:2710
-msgid "S"
-msgstr "S"
-
-#: editor_routes.cc:212
+#: editor_routes.cc:240
 msgid "Soloed"
 msgstr "Solo"
 
-#: editor_routes.cc:213
-msgid "SI"
-msgstr "SI"
+#: editor_routes.cc:241
+msgid "SoloIso|SI"
+msgstr ""
 
-#: editor_routes.cc:213
+#: editor_routes.cc:241
 msgid "Solo Isolated"
 msgstr "Isolert solo"
 
-#: editor_routes.cc:214
+#: editor_routes.cc:242
+msgid "SoloLock|SS"
+msgstr ""
+
+#: editor_routes.cc:242
 msgid "Solo Safe (Locked)"
 msgstr "Solo-sikker (låst)"
 
-#: editor_routes.cc:477 mixer_ui.cc:1197
+#: editor_routes.cc:550 mixer_ui.cc:1498
 msgid "Hide All"
 msgstr "Gøym alle"
 
-#: editor_routes.cc:478 mixer_ui.cc:1198
+#: editor_routes.cc:551 mixer_ui.cc:1499
 msgid "Show All Audio Tracks"
 msgstr "Vis alle lydpsor"
 
-#: editor_routes.cc:479 mixer_ui.cc:1199
+#: editor_routes.cc:552 mixer_ui.cc:1500
 msgid "Hide All Audio Tracks"
 msgstr "Gøym alle lydspor"
 
-#: editor_routes.cc:480 mixer_ui.cc:1200
+#: editor_routes.cc:553 mixer_ui.cc:1501
 msgid "Show All Audio Busses"
 msgstr "Vis alle bussar"
 
-#: editor_routes.cc:481 mixer_ui.cc:1201
+#: editor_routes.cc:554 mixer_ui.cc:1502
 msgid "Hide All Audio Busses"
 msgstr "Gøym alle bussar"
 
-#: editor_routes.cc:482
+#: editor_routes.cc:555 mixer_ui.cc:1503
 msgid "Show All Midi Tracks"
 msgstr "Vis alle midipsor"
 
-#: editor_routes.cc:483
+#: editor_routes.cc:556 mixer_ui.cc:1504
 msgid "Hide All Midi Tracks"
 msgstr "Gøym alle midispor"
 
-#: editor_routes.cc:484
-msgid "Show Tracks With Regions Under Playhead"
-msgstr "Vis spor med bolkar under spelehovudet"
+#: editor_routes.cc:557
+msgid "Only Show Tracks with Regions Under Playhead"
+msgstr ""
 
-#: editor_rulers.cc:211
+#: editor_rulers.cc:212
 msgid "New location marker"
 msgstr "Ny stadmarkør"
 
-#: editor_rulers.cc:212
+#: editor_rulers.cc:213
 msgid "Clear all locations"
 msgstr "Tøm alle stader"
 
-#: editor_rulers.cc:213
+#: editor_rulers.cc:214
 msgid "Unhide locations"
 msgstr "Vis stader"
 
-#: editor_rulers.cc:217
+#: editor_rulers.cc:218
 msgid "New range"
 msgstr "Nytt område"
 
-#: editor_rulers.cc:218
+#: editor_rulers.cc:219
 msgid "Clear all ranges"
 msgstr "Tøm alle område"
 
-#: editor_rulers.cc:219
+#: editor_rulers.cc:220
 msgid "Unhide ranges"
 msgstr "Vis område"
 
 #: editor_rulers.cc:224
-msgid "Make Loop range"
+msgid "New Loop range"
 msgstr ""
 
 #: editor_rulers.cc:225
-msgid "Make Punch range"
+msgid "New Punch range"
 msgstr ""
 
 #: editor_rulers.cc:230
 msgid "New CD track marker"
 msgstr "Ny CD-spormarkør"
 
-#: editor_rulers.cc:235 tempo_dialog.cc:38
+#: editor_rulers.cc:234 tempo_dialog.cc:38
 msgid "New Tempo"
 msgstr "Nytt tempo"
 
-#: editor_rulers.cc:239 tempo_dialog.cc:296
+#: editor_rulers.cc:238 tempo_dialog.cc:419
 msgid "New Meter"
 msgstr "Ny taktart"
 
-#: editor_snapshots.cc:137
+#: editor_snapshots.cc:149
 msgid "Rename Snapshot"
 msgstr "Døyp om snøggbilete"
 
-#: editor_snapshots.cc:139
+#: editor_snapshots.cc:151
 msgid "New name of snapshot"
 msgstr "Namn på det nye snøggbiletet:"
 
-#: editor_snapshots.cc:157
+#: editor_snapshots.cc:169
 msgid ""
 "Do you really want to remove snapshot \"%1\" ?\n"
 "(which cannot be undone)"
@@ -5799,35 +6492,39 @@ msgstr ""
 "Vil du verkeleg fjerna snøggbiletet \"%1\"?\n"
 "Du kan ikkje angra."
 
-#: editor_snapshots.cc:162
+#: editor_snapshots.cc:174
 msgid "Remove snapshot"
 msgstr "Fjern snøggbilete"
 
-#: editor_tempodisplay.cc:194 editor_tempodisplay.cc:234
-msgid "add"
-msgstr "legg til"
-
-#: editor_tempodisplay.cc:215
+#: editor_tempodisplay.cc:318
 msgid "add tempo mark"
 msgstr "legg til tempomerke"
 
-#: editor_tempodisplay.cc:254
+#: editor_tempodisplay.cc:343
+msgid "add"
+msgstr "legg til"
+
+#: editor_tempodisplay.cc:362
 msgid "add meter mark"
 msgstr "legg til taktartsmerke"
 
-#: editor_tempodisplay.cc:287 editor_tempodisplay.cc:315
+#: editor_tempodisplay.cc:401 editor_tempodisplay.cc:435
 msgid "done"
 msgstr "ferdig"
 
-#: editor_tempodisplay.cc:304 editor_tempodisplay.cc:330
+#: editor_tempodisplay.cc:422
+msgid "replace meter mark"
+msgstr ""
+
+#: editor_tempodisplay.cc:454
 msgid "replace tempo mark"
 msgstr "byt ut tempomerke"
 
-#: editor_tempodisplay.cc:353 editor_tempodisplay.cc:387
+#: editor_tempodisplay.cc:485 editor_tempodisplay.cc:519
 msgid "remove tempo mark"
 msgstr "fjern tempomerke"
 
-#: editor_tempodisplay.cc:370
+#: editor_tempodisplay.cc:502
 msgid ""
 "programming error: meter marker canvas item has no marker object pointer!"
 msgstr ""
@@ -5837,315 +6534,367 @@ msgstr ""
 msgid "stretch/shrink"
 msgstr "strekk/krymp"
 
-#: editor_timefx.cc:129
+#: editor_timefx.cc:130
 msgid "pitch shift"
 msgstr "endra tonehøgd"
 
-#: editor_timefx.cc:301
+#: editor_timefx.cc:282
 msgid "timefx cannot be started - thread creation error"
 msgstr "greidde ikkje starta tidsstrekk - trådstartingsfeil"
 
-#: engine_dialog.cc:83
+#: engine_dialog.cc:86
 msgid "Device Control Panel"
 msgstr ""
 
-#: engine_dialog.cc:84
+#: engine_dialog.cc:87
 msgid "Midi Device Setup"
 msgstr ""
 
-#: engine_dialog.cc:85 engine_dialog.cc:2097
+#: engine_dialog.cc:89
+msgid "Refresh Devices"
+msgstr ""
+
+#: engine_dialog.cc:90
+msgid "Use Buffered I/O"
+msgstr ""
+
+#: engine_dialog.cc:91 engine_dialog.cc:3000
 msgid "Measure"
 msgstr ""
 
-#: engine_dialog.cc:86
+#: engine_dialog.cc:92
 msgid "Use results"
 msgstr ""
 
-#: engine_dialog.cc:87
+#: engine_dialog.cc:93
 msgid "Back to settings ... (ignore results)"
 msgstr ""
 
-#: engine_dialog.cc:88
+#: engine_dialog.cc:94
 msgid "Calibrate Audio"
 msgstr ""
 
-#: engine_dialog.cc:92
+#: engine_dialog.cc:98
 msgid "Back to settings"
 msgstr ""
 
-#: engine_dialog.cc:111
+#: engine_dialog.cc:120
 msgid ""
 "No audio/MIDI backends detected. %1 cannot run\n"
 "\n"
 "(This is a build/packaging/system error. It should never happen.)"
 msgstr ""
 
-#: engine_dialog.cc:137
+#: engine_dialog.cc:145
 msgid "Latency Measurement Tool"
 msgstr ""
 
-#: engine_dialog.cc:149
+#: engine_dialog.cc:157
 msgid ""
 "<span weight=\"bold\">Turn down the volume on your audio equipment to a very "
 "low level.</span>"
 msgstr ""
 
-#: engine_dialog.cc:158
+#: engine_dialog.cc:166
 msgid "Select two channels below and connect them using a cable."
 msgstr ""
 
-#: engine_dialog.cc:163
+#: engine_dialog.cc:171
 msgid "Output channel"
 msgstr ""
 
-#: engine_dialog.cc:171
+#: engine_dialog.cc:179
 msgid "Input channel"
 msgstr ""
 
-#: engine_dialog.cc:206
+#: engine_dialog.cc:213
 msgid "Once the channels are connected, click the \"Measure\" button."
 msgstr ""
 
-#: engine_dialog.cc:213
+#: engine_dialog.cc:220
 msgid "When satisfied with the results, click the \"Use results\" button."
 msgstr ""
 
-#: engine_dialog.cc:228 engine_dialog.cc:2217 engine_dialog.cc:2227
+#: engine_dialog.cc:235 engine_dialog.cc:3138 engine_dialog.cc:3148
 msgid "No measurement results yet"
 msgstr ""
 
-#: engine_dialog.cc:238 route_params_ui.cc:106
+#: engine_dialog.cc:245 route_params_ui.cc:106
 msgid "Latency"
 msgstr "Treigskap"
 
-#: engine_dialog.cc:372
+#: engine_dialog.cc:520
 msgid "Audio System:"
 msgstr ""
 
-#: engine_dialog.cc:409
+#: engine_dialog.cc:564
 msgid "Driver:"
 msgstr "Drivar:"
 
-#: engine_dialog.cc:415
+#: engine_dialog.cc:571
+msgid "Input Device:"
+msgstr ""
+
+#: engine_dialog.cc:575
+msgid "Output Device:"
+msgstr ""
+
+#: engine_dialog.cc:582
 msgid "Device:"
 msgstr ""
 
-#: engine_dialog.cc:420 engine_dialog.cc:519 sfdb_ui.cc:153 sfdb_ui.cc:348
-#: sfdb_ui.cc:353
+#: engine_dialog.cc:591 engine_dialog.cc:699 export_report.cc:164
+#: export_report.cc:328 sfdb_ui.cc:153 sfdb_ui.cc:348 sfdb_ui.cc:353
 msgid "Sample rate:"
 msgstr "Punktfrekvens:"
 
-#: engine_dialog.cc:426 engine_dialog.cc:526
+#: engine_dialog.cc:597 engine_dialog.cc:706
 msgid "Buffer size:"
 msgstr "Bufferstorleik:"
 
-#: engine_dialog.cc:444
+#: engine_dialog.cc:606
+msgid "Periods:"
+msgstr ""
+
+#: engine_dialog.cc:624
 msgid "Input Channels:"
 msgstr ""
 
-#: engine_dialog.cc:457
+#: engine_dialog.cc:637
 msgid "Output Channels:"
 msgstr ""
 
-#: engine_dialog.cc:469
+#: engine_dialog.cc:649
 msgid "Hardware input latency:"
 msgstr "Treigskap for maskinvare-inngangar:"
 
-#: engine_dialog.cc:472 engine_dialog.cc:485
+#: engine_dialog.cc:652 engine_dialog.cc:665
 msgid "samples"
 msgstr "punkt"
 
-#: engine_dialog.cc:482
+#: engine_dialog.cc:662
 msgid "Hardware output latency:"
 msgstr "Treigskap for maskinvare-utgangar:"
 
-#: engine_dialog.cc:493
+#: engine_dialog.cc:673
 msgid "MIDI System:"
 msgstr ""
 
-#: engine_dialog.cc:511
+#: engine_dialog.cc:691
 msgid ""
-"The %1 audio backend was configured and started externally.\n"
-"This limits your control over it."
+"%1 is already running. %2 will connect to it and use the existing settings."
 msgstr ""
 
-#: engine_dialog.cc:564
+#: engine_dialog.cc:744
 msgid ""
 "Failed to start or connect to audio-engine.\n"
 "\n"
 "Latency calibration requires a working audio interface."
 msgstr ""
 
-#: engine_dialog.cc:570
+#: engine_dialog.cc:750
 msgid ""
 "Your selected audio configuration is playback- or capture-only.\n"
 "\n"
 "Latency calibration requires playback and capture"
 msgstr ""
 
-#: engine_dialog.cc:651
+#: engine_dialog.cc:965
 msgid "MIDI Devices"
 msgstr ""
 
-#: engine_dialog.cc:657
+#: engine_dialog.cc:971
 msgid "Device"
 msgstr "Eining"
 
-#: engine_dialog.cc:659
+#: engine_dialog.cc:973
 msgid "Hardware Latencies"
 msgstr ""
 
-#: engine_dialog.cc:700
+#: engine_dialog.cc:1014
 msgid "Calibrate"
 msgstr ""
 
-#: engine_dialog.cc:800
+#: engine_dialog.cc:1117
 msgid "all available channels"
 msgstr ""
 
-#: engine_dialog.cc:1039 latency_gui.cc:39
-#, fuzzy
-msgid "sample"
-msgid_plural "samples"
-msgstr[0] "punkt"
-msgstr[1] "punkt"
-
-#: engine_dialog.cc:1090
-#, c-format
+#: engine_dialog.cc:1599 latency_gui.cc:55
+msgid "%1 sample"
+msgid_plural "%1 samples"
+msgstr[0] "%1 punkt"
+msgstr[1] "%1 punkt"
+
+#: engine_dialog.cc:1662
+#, c-format
 msgid "(%.1f ms)"
 msgstr ""
 
-#: engine_dialog.cc:1593
+#: engine_dialog.cc:2413
 msgid "Could not start backend engine %1"
 msgstr ""
 
-#: engine_dialog.cc:1644
+#: engine_dialog.cc:2445
 msgid "Cannot set driver to %1"
 msgstr ""
 
-#: engine_dialog.cc:1648
+#: engine_dialog.cc:2450
+msgid "Cannot set input device name to %1"
+msgstr ""
+
+#: engine_dialog.cc:2454
+msgid "Cannot set output device name to %1"
+msgstr ""
+
+#: engine_dialog.cc:2459
 msgid "Cannot set device name to %1"
 msgstr ""
 
-#: engine_dialog.cc:1652
+#: engine_dialog.cc:2464
 msgid "Cannot set sample rate to %1"
 msgstr ""
 
-#: engine_dialog.cc:1656
+#: engine_dialog.cc:2468
 msgid "Cannot set buffer size to %1"
 msgstr ""
 
-#: engine_dialog.cc:1662
+#: engine_dialog.cc:2472
+msgid "Cannot set periods to %1"
+msgstr ""
+
+#: engine_dialog.cc:2478
 msgid "Cannot set input channels to %1"
 msgstr ""
 
-#: engine_dialog.cc:1666
+#: engine_dialog.cc:2482
 msgid "Cannot set output channels to %1"
 msgstr ""
 
-#: engine_dialog.cc:1672
+#: engine_dialog.cc:2488
 msgid "Cannot set input latency to %1"
 msgstr ""
 
-#: engine_dialog.cc:1676
+#: engine_dialog.cc:2492
 msgid "Cannot set output latency to %1"
 msgstr ""
 
-#: engine_dialog.cc:1955 engine_dialog.cc:2014
+#: engine_dialog.cc:2851 engine_dialog.cc:2917
 msgid "No signal detected "
 msgstr ""
 
-#: engine_dialog.cc:1968 engine_dialog.cc:2022 port_insert_ui.cc:70
+#: engine_dialog.cc:2858
+msgid ""
+"Input signal is > -3dBFS. Lower the signal level (output gain, input gain) "
+"on the audio-interface."
+msgstr ""
+
+#: engine_dialog.cc:2871 engine_dialog.cc:2925 port_insert_ui.cc:70
 #: port_insert_ui.cc:98
 msgid "Disconnected from audio engine"
 msgstr "Ikkje tilkopla lydmotoren"
 
-#: engine_dialog.cc:1977 engine_dialog.cc:2030
+#: engine_dialog.cc:2880 engine_dialog.cc:2933
 msgid "Detected roundtrip latency: "
 msgstr ""
 
-#: engine_dialog.cc:1979 engine_dialog.cc:2032
+#: engine_dialog.cc:2882 engine_dialog.cc:2935
 msgid "Systemic latency: "
 msgstr ""
 
-#: engine_dialog.cc:1986
+#: engine_dialog.cc:2889
 msgid "(signal detection error)"
 msgstr ""
 
-#: engine_dialog.cc:1992
+#: engine_dialog.cc:2895
 msgid "(inverted - bad wiring)"
 msgstr ""
 
-#: engine_dialog.cc:2039
+#: engine_dialog.cc:2942
 msgid "(averaging)"
 msgstr ""
 
-#: engine_dialog.cc:2045
+#: engine_dialog.cc:2948
 msgid "(too large jitter)"
 msgstr ""
 
-#: engine_dialog.cc:2049
+#: engine_dialog.cc:2952
 msgid "(large jitter)"
 msgstr ""
 
-#: engine_dialog.cc:2061
+#: engine_dialog.cc:2964
 msgid "Timeout - large MIDI jitter."
 msgstr ""
 
-#: engine_dialog.cc:2077 port_insert_ui.cc:134
+#: engine_dialog.cc:2980 port_insert_ui.cc:134
 msgid "Detecting ..."
 msgstr "Lyttar etter signal..."
 
-#: engine_dialog.cc:2171
+#: engine_dialog.cc:3081
 msgid "Disconnect from %1"
 msgstr ""
 
-#: engine_dialog.cc:2175 mixer_strip.cc:1522 route_group_dialog.cc:45
-#: route_time_axis.cc:841
-msgid "Active"
-msgstr "Aktiv"
+#: engine_dialog.cc:3086
+msgid "Running"
+msgstr ""
 
-#: engine_dialog.cc:2185
-msgid "Connect to %1"
+#: engine_dialog.cc:3088
+msgid "Connected"
 msgstr ""
 
-#: engine_dialog.cc:2190
-msgid "Inactive"
+#: engine_dialog.cc:3099
+msgid "Connect to %1"
 msgstr ""
 
-#: export_channel_selector.cc:45 sfdb_ui.cc:151
+#: engine_dialog.cc:3103 shuttle_control.cc:655
+msgid "Stopped"
+msgstr "Stoppa"
+
+#: export_channel_selector.cc:46 export_report.cc:159 export_report.cc:324
+#: sfdb_ui.cc:151
 msgid "Channels:"
 msgstr "Kanalar:"
 
-#: export_channel_selector.cc:46
+#: export_channel_selector.cc:47
 msgid "Split to mono files"
 msgstr "Del opp til monofiler"
 
-#: export_channel_selector.cc:182
+#: export_channel_selector.cc:197
 msgid "Bus or Track"
 msgstr "Buss eller spor"
 
-#: export_channel_selector.cc:459
+#: export_channel_selector.cc:474
 msgid "Region contents without fades nor region gain (channels: %1)"
 msgstr "Bolkinnhald utan toningar eller bolkvolum (kanalar: %1)"
 
-#: export_channel_selector.cc:463
+#: export_channel_selector.cc:478
 msgid "Region contents with fades and region gain (channels: %1)"
 msgstr "Bolkinnhald med toningar og bolkvolum (kanalar: %1)"
 
-#: export_channel_selector.cc:467
+#: export_channel_selector.cc:482
 msgid "Track output (channels: %1)"
 msgstr "Sporutgang (kanalar: %1)"
 
-#: export_channel_selector.cc:536
-msgid "Export region contents"
+#: export_channel_selector.cc:552
+msgid "Apply track/bus processing"
+msgstr ""
+
+#: export_channel_selector.cc:553
+msgid "Select all tracks"
+msgstr ""
+
+#: export_channel_selector.cc:554
+msgid "Select all busses"
+msgstr ""
+
+#: export_channel_selector.cc:555
+msgid "Deselect all"
 msgstr ""
 
-#: export_channel_selector.cc:537
-msgid "Export track output"
+#: export_channel_selector.cc:589
+msgid "Track name"
 msgstr ""
 
-#: export_dialog.cc:46
+#: export_dialog.cc:48
 msgid ""
 "<span color=\"#ffa755\">Some already existing files will be overwritten.</"
 "span>"
@@ -6153,16 +6902,16 @@ msgstr ""
 "<span color=\"#ffa755\">Dette skriv over nokre filer som finst frå før.</"
 "span>"
 
-#: export_dialog.cc:47
+#: export_dialog.cc:49
 msgid "List files"
 msgstr "List opp filer"
 
-#: export_dialog.cc:158 export_format_dialog.cc:59
+#: export_dialog.cc:158 export_format_dialog.cc:67
 msgid "File format"
 msgstr "Filformat"
 
-#: export_dialog.cc:159 export_timespan_selector.cc:374
-#: export_timespan_selector.cc:436
+#: export_dialog.cc:159 export_timespan_selector.cc:371
+#: export_timespan_selector.cc:433
 msgid "Time Span"
 msgstr "Tidsomfang"
 
@@ -6190,27 +6939,39 @@ msgstr ""
 msgid "Stop Export"
 msgstr "Avbryt eksport"
 
-#: export_dialog.cc:327
+#: export_dialog.cc:336
 msgid "export"
 msgstr "Eksporter"
 
-#: export_dialog.cc:346
+#: export_dialog.cc:355
+msgid "Exporting '%3' (timespan %1 of %2)"
+msgstr "Eksporterer '%3' (tidsomfang %1 av %2)"
+
+#: export_dialog.cc:360
 msgid "Normalizing '%3' (timespan %1 of %2)"
 msgstr "Normaliserer '%3' (tidsomfang %1 av %2)"
 
-#: export_dialog.cc:350
-msgid "Exporting '%3' (timespan %1 of %2)"
-msgstr "Eksporterer '%3' (tidsomfang %1 av %2)"
+#: export_dialog.cc:365
+msgid "Tagging '%3' (timespan %1 of %2)"
+msgstr ""
+
+#: export_dialog.cc:369
+msgid "Uploading '%3' (timespan %1 of %2)"
+msgstr ""
+
+#: export_dialog.cc:373
+msgid "Running Post Export Command for '%1'"
+msgstr ""
 
-#: export_dialog.cc:373 export_dialog.cc:375
+#: export_dialog.cc:401 export_dialog.cc:403
 msgid "<span color=\"#ffa755\">Error: "
 msgstr "<span color=\"#ffa755\">Feil: "
 
-#: export_dialog.cc:385
+#: export_dialog.cc:413
 msgid "<span color=\"#ffa755\">Warning: "
 msgstr "<span color=\"#ffa755\">Ã…tvaring: "
 
-#: export_dialog.cc:387
+#: export_dialog.cc:415
 msgid ""
 "\n"
 "<span color=\"#ffa755\">Warning: "
@@ -6218,19 +6979,19 @@ msgstr ""
 "\n"
 "<span color=\"#ffa755\">Ã…tvaring: "
 
-#: export_dialog.cc:411
+#: export_dialog.cc:439
 msgid "Export Selection"
 msgstr "Eksporter utvalet"
 
-#: export_dialog.cc:425
+#: export_dialog.cc:453
 msgid "Export Region"
 msgstr "Eksporter bolken"
 
-#: export_dialog.cc:434
+#: export_dialog.cc:462
 msgid "Source"
 msgstr "Kjelde"
 
-#: export_dialog.cc:450
+#: export_dialog.cc:478
 msgid "Stem Export"
 msgstr "Staveksport"
 
@@ -6238,64 +6999,76 @@ msgstr "Staveksport"
 msgid "Add another format"
 msgstr "Legg til eit anna format"
 
-#: export_file_notebook.cc:193
+#: export_file_notebook.cc:198
 msgid "Format"
 msgstr "Format"
 
-#: export_file_notebook.cc:194
+#: export_file_notebook.cc:199
 msgid "Location"
 msgstr "Stad"
 
-#: export_file_notebook.cc:195
+#: export_file_notebook.cc:200
 msgid "Upload to Soundcloud"
 msgstr ""
 
-#: export_file_notebook.cc:273
+#: export_file_notebook.cc:201
+msgid "Analyze Exported Audio"
+msgstr ""
+
+#: export_file_notebook.cc:286
 msgid "No format!"
 msgstr "Ikkje noko format!"
 
-#: export_file_notebook.cc:291
+#: export_file_notebook.cc:304
 msgid "Format %1: %2"
 msgstr "Format %1: %2"
 
-#: export_filename_selector.cc:32
+#: export_filename_selector.cc:33
 msgid "Label:"
 msgstr "Merke:"
 
-#: export_filename_selector.cc:33
+#: export_filename_selector.cc:34 session_dialog.cc:310
 msgid "Session Name"
 msgstr "Øktnamn"
 
-#: export_filename_selector.cc:34
+#: export_filename_selector.cc:35
+msgid "Timespan Name"
+msgstr ""
+
+#: export_filename_selector.cc:36
 msgid "Revision:"
 msgstr "Utgåve:"
 
-#: export_filename_selector.cc:36
+#: export_filename_selector.cc:38
 msgid "Folder:"
 msgstr "Mappe:"
 
-#: export_filename_selector.cc:37 session_import_dialog.cc:45
+#: export_filename_selector.cc:39 session_import_dialog.cc:45
 #: transcode_video_dialog.cc:59 video_server_dialog.cc:54
-#: video_server_dialog.cc:56 export_video_dialog.cc:81
-#: export_video_dialog.cc:83
+#: video_server_dialog.cc:56 export_video_dialog.cc:77
+#: export_video_dialog.cc:79
 msgid "Browse"
 msgstr "Bla gjennom"
 
-#: export_filename_selector.cc:41
-msgid "<i>Build filename(s) from these components:</i>"
-msgstr "<i>Lag filnamn av desse byggeklossane:</i>"
+#: export_filename_selector.cc:40 export_report.cc:118
+msgid "Open Folder"
+msgstr ""
+
+#: export_filename_selector.cc:45
+msgid "Build filename(s) from these components:"
+msgstr ""
 
-#: export_filename_selector.cc:212
+#: export_filename_selector.cc:217
 msgid ""
 "<small><i>Sorry, no example filename can be shown at the moment</i></small>"
 msgstr ""
 "<small><i>Me kan diverre ikkje visa noko døme på filnamn no</i></small>"
 
-#: export_filename_selector.cc:214
-msgid "<small><i>Current (approximate) filename: \"%1\"</i></small>"
-msgstr "<small><i>(Omtrentleg) filnamn: \"%1\"</i></small>"
+#: export_filename_selector.cc:219
+msgid "<i>Current (approximate) filename</i>: \"%1\""
+msgstr ""
 
-#: export_filename_selector.cc:250 export_filename_selector.cc:336
+#: export_filename_selector.cc:255 export_filename_selector.cc:402
 msgid ""
 "%1: this is only the directory/folder name, not the filename.\n"
 "The filename will be chosen from the information just above the folder "
@@ -6304,109 +7077,171 @@ msgstr ""
 "%1: dette er berre namnet på katalogen/mappa, ikkje på fila.\n"
 "Filnamnet vel du ut frå informasjonen rett over mappevalet."
 
-#: export_filename_selector.cc:322
+#: export_filename_selector.cc:378
+msgid "%1: this is not a valid directory/folder."
+msgstr ""
+
+#: export_filename_selector.cc:388
 msgid "Choose export folder"
 msgstr "Vel eksportmappe"
 
-#: export_format_dialog.cc:31
+#: export_format_dialog.cc:32
 msgid "New Export Format Profile"
 msgstr "Ny eksportformatprofil"
 
-#: export_format_dialog.cc:31
+#: export_format_dialog.cc:32
 msgid "Edit Export Format Profile"
 msgstr "Endra eksportformatprofilen"
 
-#: export_format_dialog.cc:38
+#: export_format_dialog.cc:39
 msgid "Label: "
 msgstr "Merke:"
 
-#: export_format_dialog.cc:41 normalize_dialog.cc:42
-msgid "Normalize to:"
-msgstr "Normaliser til:"
+#: export_format_dialog.cc:42
+msgid "Normalize:"
+msgstr ""
+
+#: export_format_dialog.cc:43
+msgid "Peak"
+msgstr ""
+
+#: export_format_dialog.cc:44
+msgid "Loudness"
+msgstr ""
 
-#: export_format_dialog.cc:46
+#: export_format_dialog.cc:50
+msgid "LUFS"
+msgstr ""
+
+#: export_format_dialog.cc:51
+msgid "dBTP"
+msgstr ""
+
+#: export_format_dialog.cc:54
 msgid "Trim silence at start"
 msgstr "Skjer bort stille på starten"
 
-#: export_format_dialog.cc:47
+#: export_format_dialog.cc:55
 msgid "Add silence at start:"
 msgstr "Legg til stille på starten:"
 
-#: export_format_dialog.cc:50
+#: export_format_dialog.cc:58
 msgid "Trim silence at end"
 msgstr "Skjer bort stille på slutten"
 
-#: export_format_dialog.cc:51
+#: export_format_dialog.cc:59
 msgid "Add silence at end:"
 msgstr "Legg til stille på slutten:"
 
-#: export_format_dialog.cc:54
+#: export_format_dialog.cc:62
 msgid ""
 "Command to run post-export\n"
-"(%f=full path & filename, %d=directory, %b=basename):"
+"(%f=file path, %d=directory, %b=basename, see tooltip for more):"
 msgstr ""
 
-#: export_format_dialog.cc:57
+#: export_format_dialog.cc:65
 msgid "Compatibility"
 msgstr "Samspel"
 
-#: export_format_dialog.cc:58
+#: export_format_dialog.cc:66
 msgid "Quality"
 msgstr "Kvalitet"
 
-#: export_format_dialog.cc:61
+#: export_format_dialog.cc:69
 msgid "Sample rate conversion quality:"
 msgstr "Konverteringskvalitet:"
 
-#: export_format_dialog.cc:68
+#: export_format_dialog.cc:76
 msgid "Dithering"
 msgstr "Utjamning"
 
-#: export_format_dialog.cc:70
+#: export_format_dialog.cc:78
 msgid "Create CUE file for disk-at-once CD/DVD creation"
 msgstr "Lag CUE-fil for å laga DAO-CD-ar eller DVD-ar"
 
-#: export_format_dialog.cc:71
+#: export_format_dialog.cc:79
 msgid "Create TOC file for disk-at-once CD/DVD creation"
 msgstr "Lag TOC-fil for å laga DAO-CD-ar eller DVD-ar"
 
-#: export_format_dialog.cc:73
+#: export_format_dialog.cc:80
+msgid "Create chapter mark file for MP4 chapter marks"
+msgstr ""
+
+#: export_format_dialog.cc:82
 msgid "Tag file with session's metadata"
 msgstr "Merk fila med metadata frå økta"
 
-#: export_format_dialog.cc:470
+#: export_format_dialog.cc:119
+msgid "∧"
+msgstr ""
+
+#: export_format_dialog.cc:124
+msgid ""
+"Normalize to EBU-R128 LUFS target loudness without exceeding the given true-"
+"peak limit. EBU-R128 normalization is only available for mono and stereo "
+"targets, true-peak works for any channel layout."
+msgstr ""
+
+#: export_format_dialog.cc:152
+msgid ""
+"%a Artist name\n"
+"%b File's base-name\n"
+"%c Copyright\n"
+"%d File's directory\n"
+"%f File's full absolute path\n"
+"%l Lyricist\n"
+"%n Session name\n"
+"%o Conductor\n"
+"%t Title\n"
+"%z Organization\n"
+"%A Album\n"
+"%C Comment\n"
+"%E Engineer\n"
+"%G Genre\n"
+"%L Total track count\n"
+"%M Mixer\n"
+"%N Timespan name\n"
+"%O Composer\n"
+"%P Producer\n"
+"%S Disc subtitle\n"
+"%T Track number\n"
+"%Y Year\n"
+"%Z Country"
+msgstr ""
+
+#: export_format_dialog.cc:537
 msgid "Best (sinc)"
 msgstr "Best (sinc)"
 
-#: export_format_dialog.cc:475
+#: export_format_dialog.cc:542
 msgid "Medium (sinc)"
 msgstr "Middels (sinc)"
 
-#: export_format_dialog.cc:480
+#: export_format_dialog.cc:547
 msgid "Fast (sinc)"
 msgstr "Rask (sinc)"
 
-#: export_format_dialog.cc:490
+#: export_format_dialog.cc:557
 msgid "Zero order hold"
 msgstr "Hald nullorden"
 
-#: export_format_dialog.cc:895
+#: export_format_dialog.cc:981
 msgid "Linear encoding options"
 msgstr "Val for lineær omkoding"
 
-#: export_format_dialog.cc:911
+#: export_format_dialog.cc:997
 msgid "Ogg Vorbis options"
 msgstr "Val for Ogg Vorbis"
 
-#: export_format_dialog.cc:922
+#: export_format_dialog.cc:1008
 msgid "FLAC options"
 msgstr "Val for FLAC"
 
-#: export_format_dialog.cc:939
+#: export_format_dialog.cc:1025
 msgid "Broadcast Wave options"
 msgstr "Val for kringkastingsformat"
 
-#: export_format_selector.cc:136
+#: export_format_selector.cc:131
 msgid "Do you really want to remove the format?"
 msgstr ""
 
@@ -6414,7 +7249,7 @@ msgstr ""
 msgid "Preset"
 msgstr "Ferdigoppsett"
 
-#: export_preset_selector.cc:104
+#: export_preset_selector.cc:99
 msgid ""
 "The selected preset did not load successfully!\n"
 "Perhaps it references a format that has been removed?"
@@ -6422,23 +7257,194 @@ msgstr ""
 "Greidde ikkje lasta dei valde ferdigoppsetta!\n"
 "Kan henda dei viser til eit format som har vorte fjerna?"
 
-#: export_preset_selector.cc:156
+#: export_preset_selector.cc:151
 msgid "Do you really want to remove this preset?"
 msgstr ""
 
-#: export_timespan_selector.cc:46
+#: export_report.cc:56
+msgid "Export Report/Analysis"
+msgstr ""
+
+#: export_report.cc:147 export_report.cc:327 sfdb_ui.cc:149
+msgid "Format:"
+msgstr "Format:"
+
+#: export_report.cc:166 export_report.cc:328
+msgid "%1 Hz"
+msgstr ""
+
+#: export_report.cc:169 export_report.cc:336 transcode_video_dialog.cc:139
+msgid "Duration:"
+msgstr ""
+
+#: export_report.cc:177 export_report.cc:334
+msgid "Timecode:"
+msgstr ""
+
+#: export_report.cc:185
+msgid "Error:"
+msgstr ""
+
+#: export_report.cc:220 export_report.cc:440
+msgid "(too short integration time)"
+msgstr ""
+
+#: export_report.cc:222
+msgid "-888"
+msgstr ""
+
+#: export_report.cc:227 export_report.cc:353
+msgid "Peak:"
+msgstr ""
+
+#: export_report.cc:228 export_report.cc:360
+msgid "%1 dBFS"
+msgstr ""
+
+#: export_report.cc:229 export_report.cc:369
+msgid "True Peak:"
+msgstr ""
+
+#: export_report.cc:230 export_report.cc:376
+msgid "%1 dBTP"
+msgstr ""
+
+#: export_report.cc:231 export_report.cc:387
+msgid "Normalization Gain:"
+msgstr ""
+
+#: export_report.cc:232
+msgid "+888.88 dB"
+msgstr ""
+
+#: export_report.cc:234 export_report.cc:448
+msgid "Integrated Loudness:"
+msgstr ""
+
+#: export_report.cc:235 export_report.cc:454
+msgid "%1 LUFS"
+msgstr ""
+
+#: export_report.cc:236 export_report.cc:460
+msgid "Loudness Range:"
+msgstr ""
+
+#: export_report.cc:237 export_report.cc:466
+msgid "%1 LU"
+msgstr ""
+
+#: export_report.cc:247 export_report.cc:754
+msgid "100"
+msgstr ""
+
+#: export_report.cc:282 export_report.cc:650
+msgid "00:00:00.000"
+msgstr ""
+
+#: export_report.cc:288
+msgid "0|A8"
+msgstr ""
+
+#: export_report.cc:394
+msgid "%1 dB"
+msgstr ""
+
+#: export_report.cc:425 export_report.cc:433 export_report.cc:553
+msgid ""
+"Not\n"
+"Available"
+msgstr ""
+
+#: export_report.cc:493
+msgid ""
+"LUFS\n"
+"(short)"
+msgstr ""
+
+#: export_report.cc:503
+msgid "Multiplicity"
+msgstr ""
+
+#: export_report.cc:603
+msgid "Logscale|Lg"
+msgstr ""
+
+#: export_report.cc:604
+msgid "Rectified|Rf"
+msgstr ""
+
+#: export_report.cc:605
+msgid "Logscale"
+msgstr ""
+
+#: export_report.cc:606
+msgid "Rectified"
+msgstr ""
+
+#: export_report.cc:738
+msgid "Hz"
+msgstr ""
+
+#: export_report.cc:755
+msgid "500"
+msgstr ""
+
+#: export_report.cc:756
+msgid "1K"
+msgstr ""
+
+#: export_report.cc:757
+msgid "5K"
+msgstr ""
+
+#: export_report.cc:758
+msgid "10K"
+msgstr ""
+
+#: export_report.cc:844
+msgid "Writing Export Analysis Image: %1."
+msgstr ""
+
+#: export_report.cc:941 sfdb_ui.cc:293 sfdb_ui.cc:409
+msgid "Could not read file: %1 (%2)."
+msgstr "Greidde ikkje lesa fil: %1 (%2)."
+
+#: export_report.cc:967 sfdb_ui.cc:458
+msgid "Could not access soundfile: "
+msgstr "Fekk ikkje tilgang til lydfil: "
+
+#: export_report.cc:1203
+msgid "-36"
+msgstr ""
+
+#: export_report.cc:1204 export_report.cc:1208 export_report.cc:1214
+#: export_report.cc:1217
+msgid "-18"
+msgstr ""
+
+#: export_report.cc:1205 export_report.cc:1209 export_report.cc:1215
+#: export_report.cc:1218 export_report.cc:1221 export_report.cc:1222
+msgid "-9"
+msgstr ""
+
+#: export_report.cc:1206 export_report.cc:1210 export_report.cc:1216
+#: export_report.cc:1219 export_report.cc:1223 export_report.cc:1224
+msgid "-3"
+msgstr ""
+
+#: export_timespan_selector.cc:44
 msgid "Show Times as:"
 msgstr "Vis tider som:"
 
-#: export_timespan_selector.cc:53 processor_box.cc:2466
+#: export_timespan_selector.cc:51 processor_box.cc:3683
 msgid "Select All"
 msgstr "Vel alt"
 
-#: export_timespan_selector.cc:223 transform_dialog.cc:93
+#: export_timespan_selector.cc:220 transform_dialog.cc:93
 msgid " to "
 msgstr "til"
 
-#: export_timespan_selector.cc:367 export_timespan_selector.cc:426
+#: export_timespan_selector.cc:364 export_timespan_selector.cc:423
 msgid "Range"
 msgstr "Område"
 
@@ -6454,36 +7460,39 @@ msgstr ""
 msgid "getSoundResourceFile: root = %1, != response"
 msgstr ""
 
-#: sfdb_freesound_mootcher.cc:410 rc_option_editor.cc:1824
+#: sfdb_freesound_mootcher.cc:410 rc_option_editor.cc:2416
 msgid "%1"
 msgstr ""
 
-#: gain_meter.cc:132 gain_meter.cc:400 gain_meter.cc:505 gain_meter.cc:896
+#: gain_meter.cc:137 gain_meter.cc:422 gain_meter.cc:527 gain_meter.cc:919
 msgid "-inf"
 msgstr "-ꝏ"
 
-#: gain_meter.cc:147 gain_meter.cc:958
+#: gain_meter.cc:152 gain_meter.cc:983
 msgid "Fader automation mode"
 msgstr "Volumautomasjonsmodus"
 
-#: gain_meter.cc:148 gain_meter.cc:959
+#: gain_meter.cc:153 gain_meter.cc:984
 msgid "Fader automation type"
 msgstr "Automasjonstype for volum"
 
-#: gain_meter.cc:157 gain_meter.cc:829 panner_ui.cc:179 panner_ui.cc:639
+#: gain_meter.cc:162 gain_meter.cc:852 panner_ui.cc:179 panner_ui.cc:641
 msgid "Abs"
 msgstr "Abs"
 
-#: gain_meter.cc:796 mixer_strip.cc:2049 meter_strip.cc:374 panner_ui.cc:606
-#: route_time_axis.cc:104 route_time_axis.cc:2705
+#: gain_meter.cc:816 vca_master_strip.cc:78 vca_time_axis.cc:54
+msgid "M"
+msgstr "M"
+
+#: gain_meter.cc:819 vca_master_strip.cc:296
 msgid "P"
 msgstr "S"
 
-#: gain_meter.cc:799 panner_ui.cc:609
+#: gain_meter.cc:822
 msgid "T"
 msgstr "T"
 
-#: gain_meter.cc:802 panner_ui.cc:612
+#: gain_meter.cc:825
 msgid "W"
 msgstr "W"
 
@@ -6491,46 +7500,50 @@ msgstr "W"
 msgid "<span size=\"large\">Presets</span>"
 msgstr "<span size=\"large\">Ferdiginnstillingar</span>"
 
-#: generic_pluginui.cc:97
+#: generic_pluginui.cc:98 plugin_pin_dialog.cc:333
 msgid "Manual"
 msgstr ""
 
-#: generic_pluginui.cc:106
+#: generic_pluginui.cc:107
 msgid "All Automation"
 msgstr ""
 
 #: generic_pluginui.cc:250
-msgid "Switches"
-msgstr "Brytarar"
-
-#: generic_pluginui.cc:260 generic_pluginui.cc:436 processor_box.cc:2440
-msgid "Controls"
-msgstr "Kontrollar"
-
-#: generic_pluginui.cc:293
 msgid "Plugin Editor: could not build control element for port %1"
 msgstr "Utviding: greidde ikkje byggja kontrollelement for porten %1"
 
-#: generic_pluginui.cc:318
+#: generic_pluginui.cc:282
 msgid "Plugin Editor: no control for property %1"
 msgstr ""
 
-#: generic_pluginui.cc:324
+#: generic_pluginui.cc:288
 msgid "Plugin Editor: could not build control element for property %1"
 msgstr ""
 
-#: generic_pluginui.cc:468
+#: generic_pluginui.cc:359
+msgid "Switches"
+msgstr "Brytarar"
+
+#: generic_pluginui.cc:369 generic_pluginui.cc:475 processor_box.cc:3653
+msgid "Controls"
+msgstr "Kontrollar"
+
+#: generic_pluginui.cc:510
 msgid "Meters"
 msgstr "Mælarar"
 
-#: generic_pluginui.cc:490
+#: generic_pluginui.cc:548
 msgid "Automation control"
 msgstr "Automasjonskontroll"
 
-#: generic_pluginui.cc:497
+#: generic_pluginui.cc:555
 msgid "Mgnual"
 msgstr "Mgnual"
 
+#: generic_pluginui.cc:828
+msgid "This control cannot be automated"
+msgstr ""
+
 #: global_port_matrix.cc:158
 msgid "Audio Connection Manager"
 msgstr "Lydtilkoplingar"
@@ -6539,112 +7552,141 @@ msgstr "Lydtilkoplingar"
 msgid "MIDI Connection Manager"
 msgstr "MIDI-tilkoplingar"
 
-#: global_port_matrix.cc:201 io_selector.cc:211 mixer_strip.cc:793
-#: mixer_strip.cc:894
+#: global_port_matrix.cc:201 io_selector.cc:211 mixer_strip.cc:863
+#: mixer_strip.cc:966 monitor_section.cc:1430 monitor_selector.cc:189
+#: plugin_pin_dialog.cc:1757
 msgid "Disconnect"
 msgstr "Kopla frå"
 
-#: global_port_matrix.cc:207 io_selector.cc:217
+#: global_port_matrix.cc:207 io_selector.cc:217 monitor_selector.cc:195
 msgid "port"
 msgstr "port"
 
-#: group_tabs.cc:312
+#: group_tabs.cc:312 group_tabs.cc:321
 msgid "Selection..."
 msgstr "Utval..."
 
-#: group_tabs.cc:313
+#: group_tabs.cc:313 group_tabs.cc:322
 msgid "Record Enabled..."
 msgstr "Opptak på..."
 
-#: group_tabs.cc:314
+#: group_tabs.cc:314 group_tabs.cc:323
 msgid "Soloed..."
 msgstr "Solo..."
 
-#: group_tabs.cc:320
+#: group_tabs.cc:316
+msgid "Create New Group From..."
+msgstr ""
+
+#: group_tabs.cc:325
+msgid "Create New Group with Master From..."
+msgstr ""
+
+#: group_tabs.cc:344
 msgid "Create New Group ..."
 msgstr "Lag ny gruppe..."
 
-#: group_tabs.cc:321
-msgid "Create New Group From"
-msgstr "Lag ny gruppe frå"
+#: group_tabs.cc:345
+msgid "Create New Group with Control Master ..."
+msgstr ""
 
-#: group_tabs.cc:324
+#: group_tabs.cc:355
 msgid "Edit Group..."
 msgstr "Rediger gruppe..."
 
-#: group_tabs.cc:325
+#: group_tabs.cc:356
 msgid "Collect Group"
 msgstr "Samla gruppa"
 
-#: group_tabs.cc:326
+#: group_tabs.cc:357
 msgid "Remove Group"
 msgstr "Fjern gruppa"
 
-#: group_tabs.cc:329
+#: group_tabs.cc:368
+msgid "Assign Group to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:374
 msgid "Remove Subgroup Bus"
 msgstr "Fjern subgruppe-buss"
 
-#: group_tabs.cc:331
+#: group_tabs.cc:376
 msgid "Add New Subgroup Bus"
 msgstr "Legg til subgruppe-buss"
 
-#: group_tabs.cc:333
+#: group_tabs.cc:378
 msgid "Add New Aux Bus (pre-fader)"
 msgstr "Legg til ny aux-buss (før volum)"
 
-#: group_tabs.cc:334
+#: group_tabs.cc:379
 msgid "Add New Aux Bus (post-fader)"
 msgstr "Legg til aux-buss (etter volum)"
 
-#: group_tabs.cc:340
+#: group_tabs.cc:404
+msgid "Assign Selection to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:415
+msgid "Assign Record Enabled to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:426
+msgid "Assign Soloed to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:429
 msgid "Enable All Groups"
 msgstr "Skru på alle grupper"
 
-#: group_tabs.cc:341
+#: group_tabs.cc:430
 msgid "Disable All Groups"
 msgstr "Slå av alle gruppene"
 
-#: insert_time_dialog.cc:46
+#: insert_remove_time_dialog.cc:52
+msgid "Time to remove"
+msgstr ""
+
+#: insert_remove_time_dialog.cc:52
 msgid "Time to insert:"
 msgstr "Tid å setja inn:"
 
-#: insert_time_dialog.cc:54
+#: insert_remove_time_dialog.cc:61
 msgid "Intersected regions should:"
 msgstr "Innskorne bolkar skal:"
 
-#: insert_time_dialog.cc:57
+#: insert_remove_time_dialog.cc:64
 msgid "stay in position"
 msgstr "bli på plass"
 
-#: insert_time_dialog.cc:58
+#: insert_remove_time_dialog.cc:65
 msgid "move"
 msgstr "flytt"
 
-#: insert_time_dialog.cc:59
+#: insert_remove_time_dialog.cc:66
 msgid "be split"
 msgstr "bli delt"
 
-#: insert_time_dialog.cc:65
-msgid "Insert time on all the track's playlists"
-msgstr "Set inn tid på alle spelelistene til sporet"
+#: insert_remove_time_dialog.cc:73
+msgid "Apply to all the track's playlists"
+msgstr ""
 
-#: insert_time_dialog.cc:68
+#: insert_remove_time_dialog.cc:76
 msgid "Move glued regions"
 msgstr "Flytt limte bolkar"
 
-#: insert_time_dialog.cc:70
+#: insert_remove_time_dialog.cc:78
 msgid "Move markers"
 msgstr "Flytt markørar"
 
-#: insert_time_dialog.cc:73
+#: insert_remove_time_dialog.cc:81
 msgid "Move glued markers"
 msgstr "Flytt limte markørar"
 
-#: insert_time_dialog.cc:78
+#: insert_remove_time_dialog.cc:86
 msgid "Move locked markers"
 msgstr "Flytt låste markørar"
 
-#: insert_time_dialog.cc:83
+#: insert_remove_time_dialog.cc:91
 msgid ""
 "Move tempo and meter changes\n"
 "<i>(may cause oddities in the tempo map)</i>"
@@ -6652,15 +7694,23 @@ msgstr ""
 "Flytt tempo- og taktskifte\n"
 "<i>(kan gje merkelege utslag i tempokartet)</i>"
 
-#: insert_time_dialog.cc:91
+#: insert_remove_time_dialog.cc:99
+msgid "Remove time"
+msgstr ""
+
+#: insert_remove_time_dialog.cc:99
 msgid "Insert time"
 msgstr "Set inn tid"
 
-#: instrument_selector.cc:62
+#: insert_remove_time_dialog.cc:174
+msgid "Invalid or zero duration entered. Please enter a valid duration"
+msgstr ""
+
+#: instrument_selector.cc:92
 msgid "-none-"
 msgstr "-ingen-"
 
-#: interthread_progress_window.cc:103
+#: interthread_progress_window.cc:114
 msgid "Importing file: %1 of %2"
 msgstr "Importerer fil: %1 av %2"
 
@@ -6668,66 +7718,91 @@ msgstr "Importerer fil: %1 av %2"
 msgid "I/O selector"
 msgstr "I/U-veljar"
 
-#: io_selector.cc:266
+#: io_selector.cc:266 monitor_selector.cc:244
 msgid "%1 input"
 msgstr "%1-inngang"
 
-#: io_selector.cc:268
+#: io_selector.cc:268 monitor_selector.cc:246
 msgid "%1 output"
 msgstr "%1-utgang"
 
-#: keyboard.cc:70
+#: keyboard.cc:93
 msgid "your own"
 msgstr "din eigen"
 
-#: keyboard.cc:133 keyboard.cc:157
+#: keyboard.cc:157 keyboard.cc:181
 msgid "Default keybindings not found - %1 will be hard to use!"
 msgstr "Fann ingen standardsnøggtastar. Då blir det ikkje lett å bruka %1!"
 
-#: keyboard.cc:136
+#: keyboard.cc:160
 msgid "Key bindings file \"%1\" not found. Default bindings used instead"
 msgstr "Fann ikkje snøggtastfila \"%1\". Bruker standardsnøggtastar i staden."
 
-#: keyeditor.cc:54
+#: keyboard.cc:193
+msgid "Loading keybindings from %1"
+msgstr ""
+
+#: keyeditor.cc:67
+msgid "Colliding keybindings"
+msgstr ""
+
+#: keyeditor.cc:68
+msgid ""
+"The key sequence is already bound. Please remove the other binding first."
+msgstr ""
+
+#: keyeditor.cc:77
+msgid "Key Bindings"
+msgstr "Snøggtastar"
+
+#: keyeditor.cc:78
 msgid "Remove shortcut"
 msgstr "Alternativ snøggtast:"
 
-#: keyeditor.cc:63
-msgid "Action"
-msgstr "Handling"
+#: keyeditor.cc:80
+msgid "Search..."
+msgstr ""
 
-#: keyeditor.cc:64
-msgid "Shortcut"
-msgstr "Snarveg"
+#: keyeditor.cc:82
+msgid "Print"
+msgstr ""
 
-#: keyeditor.cc:84
-msgid "Select an action, then press the key(s) to (re)set its shortcut"
+#: keyeditor.cc:93
+msgid "Click to reset search string"
 msgstr ""
-"Vel ei handling. Så trykkjer du tasten/tastane som skal utføra handlinga."
 
-#: keyeditor.cc:98
-msgid "Reset Bindings to Defaults"
+#: keyeditor.cc:97
+msgid "To remove a shortcut select an action then press this: "
 msgstr ""
 
-#: keyeditor.cc:263
-msgid "Main_menu"
-msgstr "Hovud_meny"
+#: keyeditor.cc:109
+msgid "Reset Bindings to Defaults"
+msgstr ""
 
-#: keyeditor.cc:265
-msgid "redirectmenu"
-msgstr "omdirigeringsmeny"
+#: keyeditor.cc:227 lua_script_manager.cc:41
+msgid "Action"
+msgstr "Handling"
 
-#: keyeditor.cc:267
-msgid "Editor_menus"
-msgstr "Redigerings_menyar"
+#: keyeditor.cc:228
+msgid "Shortcut"
+msgstr "Snarveg"
 
-#: keyeditor.cc:269
+#: keyeditor.cc:370
 msgid "RegionList"
 msgstr "Bolkliste"
 
-#: keyeditor.cc:271
-msgid "ProcessorMenu"
-msgstr "Prosessormeny"
+#: keyeditor.cc:543
+msgid "Could not open temporary file to print bindings (%1)"
+msgstr ""
+
+#: keyeditor.cc:561
+msgid "Could not save bindings to file (%1)"
+msgstr ""
+
+#: latency_gui.cc:39
+#, fuzzy
+msgid "sample"
+msgstr "punkt"
 
 #: latency_gui.cc:40
 msgid "msec"
@@ -6737,144 +7812,253 @@ msgstr "msek"
 msgid "period"
 msgstr "periode"
 
-#: latency_gui.cc:55
-msgid "%1 sample"
-msgid_plural "%1 samples"
-msgstr[0] "%1 punkt"
-msgstr[1] "%1 punkt"
-
-#: latency_gui.cc:72 panner_ui.cc:409
+#: latency_gui.cc:72 panner_ui.cc:411 plugin_pin_dialog.cc:109
+#: plugin_ui.cc:421
 msgid "Reset"
 msgstr "Nullstill"
 
-#: latency_gui.cc:149 rhythm_ferret.cc:273 sfdb_ui.cc:1912
+#: latency_gui.cc:149 rhythm_ferret.cc:295 sfdb_ui.cc:1878
 msgid "programming error: %1 (%2)"
 msgstr "Programmeringsfeil: %1 (%2)"
 
-#: location_ui.cc:52 location_ui.cc:54
+#: location_ui.cc:54 location_ui.cc:57
 msgid "Use PH"
 msgstr "Bruk PH"
 
-#: location_ui.cc:59
+#: location_ui.cc:55 location_ui.cc:58
+msgid "Goto"
+msgstr ""
+
+#: location_ui.cc:63
 msgid "Glue"
 msgstr "Lim"
 
-#: location_ui.cc:87
+#: location_ui.cc:88
 msgid "Performer:"
 msgstr "Utøvar:"
 
-#: location_ui.cc:88
+#: location_ui.cc:89
 msgid "Composer:"
 msgstr "Komponist:"
 
-#: location_ui.cc:90
+#: location_ui.cc:91
 msgid "Pre-Emphasis"
 msgstr "Før-framheving for CD"
 
-#: location_ui.cc:317
+#: location_ui.cc:319
 msgid "Remove this range"
 msgstr "Fjern dette området"
 
-#: location_ui.cc:318
+#: location_ui.cc:320
 msgid "Start time - middle click to locate here"
 msgstr "Starttid - midtklikk for å gå hit"
 
-#: location_ui.cc:319
+#: location_ui.cc:321
 msgid "End time - middle click to locate here"
 msgstr "Sluttid - midtklikk for å gå hit"
 
-#: location_ui.cc:322
+#: location_ui.cc:324
 msgid "Set range start from playhead location"
 msgstr "Set områdestart ved spelehovudet"
 
-#: location_ui.cc:323
+#: location_ui.cc:325
 msgid "Set range end from playhead location"
 msgstr "Set områdeslutt ved spelehovudet"
 
-#: location_ui.cc:327
+#: location_ui.cc:329
 msgid "Remove this marker"
 msgstr "Fjern denne markøren"
 
-#: location_ui.cc:328
+#: location_ui.cc:330
 msgid "Position - middle click to locate here"
 msgstr "Posisjon - midtklikk for å gå hit"
 
-#: location_ui.cc:330
+#: location_ui.cc:332
 msgid "Set marker time from playhead location"
 msgstr "Set markørtid ved spelehovudet"
 
-#: location_ui.cc:499
+#: location_ui.cc:524
 msgid "You cannot put a CD marker at the start of the session"
 msgstr "Du kan ikkje leggja ein CD-markør på starten av økta"
 
-#: location_ui.cc:725
+#: location_ui.cc:750
 msgid "New Marker"
 msgstr "Nytt merke"
 
-#: location_ui.cc:726
+#: location_ui.cc:751
 msgid "New Range"
 msgstr "Nytt område"
 
-#: location_ui.cc:739
+#: location_ui.cc:764
 msgid "<b>Loop/Punch Ranges</b>"
 msgstr "<b>Lykkje-/innslagsområde</b>"
 
-#: location_ui.cc:764
+#: location_ui.cc:790
 msgid "<b>Markers (Including CD Index)</b>"
 msgstr "<b>Markørar (inkl. CD-indeks)</b>"
 
-#: location_ui.cc:799
+#: location_ui.cc:825
 msgid "<b>Ranges (Including CD Track Ranges)</b>"
 msgstr "<b>Bolkar (inkl. CD-sporbolkar)</b>"
 
-#: location_ui.cc:1042
+#: location_ui.cc:1068
 msgid "add range marker"
 msgstr "legg til områdemarkørar"
 
-#: main.cc:82
-msgid "%1 could not connect to the audio backend."
+#: lua_script_manager.cc:31
+msgid "Add/Set"
 msgstr ""
 
-#: main.cc:107 main.cc:123
-msgid "The audio backend (%1) has failed, or terminated"
+#: lua_script_manager.cc:34
+msgid "Call"
 msgstr ""
 
-#: main.cc:110
-msgid ""
-"%2 exited unexpectedly, and without notifying %1.\n"
-"\n"
+#: lua_script_manager.cc:35
+msgid "New Hook"
+msgstr ""
+
+#: lua_script_manager.cc:77
+msgid "Signal(s)"
+msgstr ""
+
+#: lua_script_manager.cc:127
+msgid "Action %1"
+msgstr ""
+
+#: lua_script_manager.cc:132 lua_script_manager.cc:227
+msgid "Unset"
+msgstr ""
+
+#: luainstance.cc:1079
+msgid "Cannot read script '%1': %2"
+msgstr ""
+
+#: luawindow.cc:97
+msgid "Run"
+msgstr ""
+
+#: luawindow.cc:98
+msgid "Clear Output"
+msgstr ""
+
+#: luawindow.cc:102
+msgid "Revert"
+msgstr ""
+
+#: luawindow.cc:166
+msgid "Select Editor Buffer"
+msgstr ""
+
+#: luawindow.cc:253 luawindow.cc:258
+msgid "Window|Lua"
+msgstr ""
+
+#: luawindow.cc:286 luawindow.cc:304
+msgid "LuaException: %1"
+msgstr ""
+
+#: luawindow.cc:342
+msgid "Deleted %1"
+msgstr ""
+
+#: luawindow.cc:345
+msgid "Failed to delete %1"
+msgstr ""
+
+#: luawindow.cc:411
+msgid ""
+"Missing script header.\n"
+"The script requires an '{ardour}' info table and a 'factory' function."
+msgstr ""
+
+#: luawindow.cc:416
+msgid "Script fails to compile."
+msgstr ""
+
+#: luawindow.cc:423
+msgid "Invalid or missing script-name or script-type."
+msgstr ""
+
+#: luawindow.cc:428
+msgid ""
+"Invalid script-type.\n"
+"Valid types are 'EditorAction' and 'Snippet'."
+msgstr ""
+
+#: luawindow.cc:439 luawindow.cc:490
+msgid "Saved as %1"
+msgstr ""
+
+#: luawindow.cc:442 luawindow.cc:493
+msgid "Error saving file: %1"
+msgstr ""
+
+#: luawindow.cc:452
+msgid ""
+"Script with given name '%1' already exists.\n"
+"Use a different name in the descriptor."
+msgstr ""
+
+#: luawindow.cc:636
+msgid "Scratch Buffer %1"
+msgstr ""
+
+#: luawindow.cc:638
+msgid "Action: '%1'"
+msgstr ""
+
+#: luawindow.cc:640
+msgid "Snippet: %1"
+msgstr ""
+
+#: luawindow.cc:652
+msgid "Save as"
+msgstr ""
+
+#: main.cc:88
+msgid "%1 could not connect to the audio backend."
+msgstr ""
+
+#: main.cc:135 main.cc:151
+msgid "The audio backend (%1) has failed, or terminated"
+msgstr ""
+
+#: main.cc:138
+msgid ""
+"%2 exited unexpectedly, and without notifying %1.\n"
+"\n"
 "This could be due to misconfiguration or to an error inside %2.\n"
 "\n"
 "Click OK to exit %1."
 msgstr ""
 
-#: main.cc:124
+#: main.cc:152
 msgid "%2 exited unexpectedly, and without notifying %1."
 msgstr ""
 
-#: main.cc:219
+#: main.cc:247
 msgid ""
 "\n"
 "   %1 could not understand your command line      "
 msgstr ""
 
-#: main.cc:221
+#: main.cc:249
 msgid "An error was encountered while launching %1"
 msgstr ""
 
-#: main.cc:310
+#: main.cc:344
 msgid " (built using "
 msgstr " (bygd med "
 
-#: main.cc:313
+#: main.cc:347
 msgid " and GCC version "
 msgstr " og GCC-version "
 
-#: main.cc:323
-msgid "Copyright (C) 1999-2012 Paul Davis"
-msgstr "Copyright (C) 1999-2012 Paul Davis"
+#: main.cc:357
+msgid "Copyright (C) 1999-2015 Paul Davis"
+msgstr ""
 
-#: main.cc:324
+#: main.cc:358
 msgid ""
 "Some portions Copyright (C) Steve Harris, Ari Johnson, Brett Viren, Joel "
 "Baker, Robin Gareus"
@@ -6882,48 +8066,68 @@ msgstr ""
 "Nokre deler (C) Steve Harris, Ari Johnson, Brett Viren, Joel Baker, Robin "
 "Gareus"
 
-#: main.cc:326
+#: main.cc:360
 msgid "%1 comes with ABSOLUTELY NO WARRANTY"
 msgstr "%1 har ABSOLUTT INGEN GARANTI"
 
-#: main.cc:327
+#: main.cc:361
 msgid "not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
 msgstr ""
 "mogleik for sal eller bruk til eit spesielt føremål er heller ikkje "
 "garantert."
 
-#: main.cc:328
+#: main.cc:362
 msgid "This is free software, and you are welcome to redistribute it "
 msgstr "Dette er gratis programvare, og du må gjerne gje henne vidare"
 
-#: main.cc:329
+#: main.cc:363
 msgid "under certain conditions; see the source for copying conditions."
 msgstr ""
 "på visse vilkår, sjå kjeldekoden for kopierings- og vidareformidlingsvilkår. "
 
-#: main.cc:334
+#: main.cc:368
 msgid "could not initialize %1."
 msgstr "greidde ikkje starta %1."
 
-#: main.cc:344
+#: main.cc:378
 msgid "Cannot xinstall SIGPIPE error handler"
 msgstr "Kan ikkje xinstallera SIGPIPE-feilhandterar"
 
-#: main.cc:351
+#: main.cc:385
+msgid "Could not complete pre-GUI initialization"
+msgstr ""
+
+#: main.cc:392
 msgid "could not create %1 GUI"
 msgstr ""
 
-#: main_clock.cc:52
+#: main_clock.cc:51
 msgid "Display delta to edit cursor"
 msgstr "Vis delta til redigeringspunktet"
 
-#: marker.cc:273
+#: main_clock.cc:66 tempo_dialog.cc:55
+msgid "Edit Tempo"
+msgstr "Endra tempo"
+
+#: main_clock.cc:67 tempo_dialog.cc:429
+msgid "Edit Meter"
+msgstr "Endra taktart"
+
+#: main_clock.cc:68
+msgid "Insert Tempo Change"
+msgstr ""
+
+#: main_clock.cc:69
+msgid "Insert Meter Change"
+msgstr ""
+
+#: marker.cc:280
 msgid "MarkerText"
 msgstr "MarkørTekst"
 
 #: midi_channel_selector.cc:161 midi_channel_selector.cc:400
-#: midi_channel_selector.cc:436 rc_option_editor.cc:1573
-#: rc_option_editor.cc:2203 sfdb_ui.cc:665
+#: midi_channel_selector.cc:436 rc_option_editor.cc:2157
+#: rc_option_editor.cc:2799 sfdb_ui.cc:671
 msgid "None"
 msgstr "Ingen"
 
@@ -7004,11 +8208,11 @@ msgstr ""
 msgid "Click to force all MIDI channel messages to channel %1"
 msgstr ""
 
-#: midi_channel_selector.cc:718
+#: midi_channel_selector.cc:720
 msgid "Click to toggle recording of channel %1"
 msgstr ""
 
-#: midi_channel_selector.cc:726
+#: midi_channel_selector.cc:728
 msgid "Click to force all recorded channels to %1"
 msgstr ""
 
@@ -7120,192 +8324,188 @@ msgstr "kanalredigering"
 msgid "velocity edit"
 msgstr "anslagsendring"
 
-#: midi_region_view.cc:954
+#: midi_region_view.cc:962
 msgid "add note"
 msgstr "legg til note"
 
-#: midi_region_view.cc:1885
+#: midi_region_view.cc:1904
 msgid "step add"
 msgstr "steg legg til"
 
-#: midi_region_view.cc:1979 midi_region_view.cc:2002
+#: midi_region_view.cc:1998 midi_region_view.cc:2021
 msgid "alter patch change"
 msgstr "endra koplingsendring"
 
-#: midi_region_view.cc:2038
+#: midi_region_view.cc:2057
 msgid "add patch change"
 msgstr "legg til koplingsendring"
 
-#: midi_region_view.cc:2060 midi_region_view.cc:2061
+#: midi_region_view.cc:2079 midi_region_view.cc:2080
 msgid "move patch change"
 msgstr "flytt koplingsendring"
 
-#: midi_region_view.cc:2073 midi_region_view.cc:2074
+#: midi_region_view.cc:2092 midi_region_view.cc:2093
 msgid "delete patch change"
 msgstr "slett koplingsendring"
 
-#: midi_region_view.cc:2112
+#: midi_region_view.cc:2131
 msgid "delete selection"
 msgstr "slett markeringa"
 
-#: midi_region_view.cc:2128
+#: midi_region_view.cc:2148
 msgid "delete note"
 msgstr "slett note"
 
-#: midi_region_view.cc:2587
+#: midi_region_view.cc:2589
 msgid "move notes"
 msgstr "flytt notane"
 
-#: midi_region_view.cc:3070
+#: midi_region_view.cc:3139
 msgid "change velocities"
 msgstr "vel fart"
 
-#: midi_region_view.cc:3136
+#: midi_region_view.cc:3205
 msgid "transpose"
 msgstr "transponer"
 
-#: midi_region_view.cc:3164
+#: midi_region_view.cc:3233
 msgid "change note lengths"
 msgstr "endra notelengder"
 
-#: midi_region_view.cc:3240
+#: midi_region_view.cc:3309
 msgid "nudge"
 msgstr "skubb"
 
-#: midi_region_view.cc:3255
+#: midi_region_view.cc:3324
 msgid "change channel"
 msgstr "endra kanal"
 
-#: midi_region_view.cc:3295
+#: midi_region_view.cc:3372
 msgid "Bank "
 msgstr ""
 
-#: midi_region_view.cc:3296
-msgid "Program "
-msgstr ""
-
-#: midi_region_view.cc:3297
+#: midi_region_view.cc:3374
 msgid "Channel "
 msgstr ""
 
-#: midi_region_view.cc:3484
+#: midi_region_view.cc:3561
 msgid "paste"
 msgstr "lim inn"
 
-#: midi_streamview.cc:185
+#: midi_streamview.cc:184
 msgid "attempt to display MIDI region with no source"
 msgstr ""
 
-#: midi_streamview.cc:195
+#: midi_streamview.cc:194
 msgid "attempt to display MIDI region with no model"
 msgstr ""
 
-#: midi_streamview.cc:506
+#: midi_streamview.cc:505
 msgid "failed to create MIDI region"
 msgstr ""
 
-#: midi_time_axis.cc:309
+#: midi_time_axis.cc:306
 msgid "External MIDI Device"
 msgstr "Ekstern MIDI-eining"
 
-#: midi_time_axis.cc:310
+#: midi_time_axis.cc:307
 msgid "External Device Mode"
 msgstr "Modus for ekstern eining"
 
-#: midi_time_axis.cc:318
+#: midi_time_axis.cc:315
 msgid "Chns"
 msgstr ""
 
-#: midi_time_axis.cc:320
+#: midi_time_axis.cc:317
 msgid "Click to edit channel settings"
 msgstr ""
 
-#: midi_time_axis.cc:519
+#: midi_time_axis.cc:516
 msgid "Show Full Range"
 msgstr "Vis heile området"
 
-#: midi_time_axis.cc:524
+#: midi_time_axis.cc:521
 msgid "Fit Contents"
 msgstr "Pass til innhaldet"
 
-#: midi_time_axis.cc:528
+#: midi_time_axis.cc:525
 msgid "Note Range"
 msgstr "Noteområde"
 
-#: midi_time_axis.cc:529
+#: midi_time_axis.cc:526
 msgid "Note Mode"
 msgstr "Notemodus"
 
-#: midi_time_axis.cc:530
+#: midi_time_axis.cc:527
 msgid "Channel Selector"
 msgstr ""
 
-#: midi_time_axis.cc:535
+#: midi_time_axis.cc:532
 msgid "Color Mode"
 msgstr "Fargemodus"
 
-#: midi_time_axis.cc:594
+#: midi_time_axis.cc:591
 msgid "Bender"
 msgstr "Bendar"
 
-#: midi_time_axis.cc:598
+#: midi_time_axis.cc:595
 msgid "Pressure"
 msgstr "Trykk"
 
-#: midi_time_axis.cc:610
+#: midi_time_axis.cc:607
 msgid "Controllers"
 msgstr "Kontrollarar"
 
-#: midi_time_axis.cc:615
+#: midi_time_axis.cc:612
 msgid "No MIDI Channels selected"
 msgstr "Ingen MIDI-kanalar er valde"
 
-#: midi_time_axis.cc:672 midi_time_axis.cc:801
+#: midi_time_axis.cc:669 midi_time_axis.cc:798
 msgid "Hide all channels"
 msgstr "Gøym alle kanalar"
 
-#: midi_time_axis.cc:676 midi_time_axis.cc:805
+#: midi_time_axis.cc:673 midi_time_axis.cc:802
 msgid "Show all channels"
 msgstr "Vis alle kanalar"
 
-#: midi_time_axis.cc:687 midi_time_axis.cc:816
+#: midi_time_axis.cc:684 midi_time_axis.cc:813
 msgid "Channel %1"
 msgstr "Kanal %1"
 
-#: midi_time_axis.cc:942 midi_time_axis.cc:974
+#: midi_time_axis.cc:939 midi_time_axis.cc:971
 msgid "Controllers %1-%2"
 msgstr "Kontrollarar %1-%2"
 
-#: midi_time_axis.cc:965 midi_time_axis.cc:968
+#: midi_time_axis.cc:962 midi_time_axis.cc:965
 msgid "Controller %1"
 msgstr ""
 
-#: midi_time_axis.cc:991
+#: midi_time_axis.cc:988
 msgid "Sustained"
 msgstr "Uthalden"
 
-#: midi_time_axis.cc:998
+#: midi_time_axis.cc:995
 msgid "Percussive"
 msgstr "Perkussiv"
 
-#: midi_time_axis.cc:1018
+#: midi_time_axis.cc:1015
 msgid "Meter Colors"
 msgstr "Mælarfarger"
 
-#: midi_time_axis.cc:1025
+#: midi_time_axis.cc:1022
 msgid "Channel Colors"
 msgstr "Kanalfarger"
 
-#: midi_time_axis.cc:1032
+#: midi_time_axis.cc:1029
 msgid "Track Color"
 msgstr "Sporfarge"
 
-#: midi_time_axis.cc:1606 midi_time_axis.cc:1612 midi_time_axis.cc:1622
-#: midi_time_axis.cc:1628
+#: midi_time_axis.cc:1610 midi_time_axis.cc:1616 midi_time_axis.cc:1626
+#: midi_time_axis.cc:1632
 msgid "all"
 msgstr ""
 
-#: midi_time_axis.cc:1609 midi_time_axis.cc:1625
+#: midi_time_axis.cc:1613 midi_time_axis.cc:1629
 msgid "some"
 msgstr ""
 
@@ -7321,7 +8521,7 @@ msgstr "Auto-rull"
 msgid "Decimal"
 msgstr "Desimal"
 
-#: midi_tracer.cc:57 rc_option_editor.cc:740
+#: midi_tracer.cc:57 rc_option_editor.cc:1356
 msgid "Enabled"
 msgstr "PÃ¥"
 
@@ -7337,35 +8537,36 @@ msgstr "Port:"
 msgid "New velocity"
 msgstr "Nytt anslag"
 
-#: missing_file_dialog.cc:35
+#: missing_file_dialog.cc:36
 msgid "Missing File"
 msgstr ""
 
-#: missing_file_dialog.cc:37
+#: missing_file_dialog.cc:38
 msgid "Select a folder to search"
 msgstr "Vel ei mappe å søkja gjennom"
 
-#: missing_file_dialog.cc:38
+#: missing_file_dialog.cc:39
 msgid "Add chosen folder to search path, and try again"
 msgstr "Legg til den mappa du har valt til søkjestigen, og prøv att"
 
-#: missing_file_dialog.cc:40
+#: missing_file_dialog.cc:41
 msgid "Stop loading this session"
 msgstr "Ikkje last økta"
 
-#: missing_file_dialog.cc:41
+#: missing_file_dialog.cc:42
 msgid "Skip all missing files"
 msgstr "Hopp over manglande filer"
 
-#: missing_file_dialog.cc:42
+#: missing_file_dialog.cc:43
 msgid "Skip this file"
 msgstr "Hopp over denne fila"
 
-#: missing_file_dialog.cc:53
+#: missing_file_dialog.cc:57 tempo_dialog.cc:135 tempo_dialog.cc:136
+#: tempo_dialog.cc:484 tempo_dialog.cc:485
 msgid "audio"
 msgstr "lyd"
 
-#: missing_file_dialog.cc:70
+#: missing_file_dialog.cc:74
 msgid ""
 "%1 cannot find the %2 file\n"
 "\n"
@@ -7385,7 +8586,7 @@ msgstr ""
 "<tt>%4</tt>\n"
 "\n"
 
-#: missing_file_dialog.cc:104
+#: missing_file_dialog.cc:108
 msgid "Click to choose an additional folder"
 msgstr "Klikk for å velja ei mappe til"
 
@@ -7393,96 +8594,40 @@ msgstr "Klikk for å velja ei mappe til"
 msgid "Missing Plugins"
 msgstr "Manglande utvidingar"
 
-#: missing_plugin_dialog.cc:33 transcode_video_dialog.cc:60
+#: missing_plugin_dialog.cc:36 transcode_video_dialog.cc:60
 msgid "OK"
 msgstr "OK"
 
-#: mixer_actor.cc:55
-msgid "Toggle Solo on Mixer-Selected Tracks/Busses"
-msgstr "Skru på solo på miksar-valde spor/bussar"
-
-#: mixer_actor.cc:56
-msgid "Toggle Mute on Mixer-Selected Tracks/Busses"
-msgstr "Skru på/av demping på miksarvalde spor/bussar"
-
-#: mixer_actor.cc:57
-msgid "Toggle Rec-enable on Mixer-Selected Tracks/Busses"
-msgstr "Skru på/av opptak på miksarvalde spor/bussar"
-
-#: mixer_actor.cc:58
-msgid "Decrease Gain on Mixer-Selected Tracks/Busses"
-msgstr "Minsk volum på miksarvalde spor/bussar"
-
-#: mixer_actor.cc:59
-msgid "Increase Gain on Mixer-Selected Tracks/Busses"
-msgstr "Auk volum på miksarvalde spor/bussar"
-
-#: mixer_actor.cc:60
-msgid "Set Gain to 0dB on Mixer-Selected Tracks/Busses"
-msgstr "Set volumet til 0dB på miksarvalde spor/bussar"
-
-#: mixer_actor.cc:63
-msgid "Copy Selected Processors"
-msgstr "Kopier dei valde signalprosessane"
-
-#: mixer_actor.cc:64
-msgid "Cut Selected Processors"
-msgstr "Klypp ut dei valde signalprosessane"
-
-#: mixer_actor.cc:65
-msgid "Paste Selected Processors"
-msgstr "Lim inn dei valde signalprosessane"
-
-#: mixer_actor.cc:66
-msgid "Delete Selected Processors"
-msgstr "Slett dei valde signalprosessane"
-
-#: mixer_actor.cc:67
-msgid "Select All (visible) Processors"
-msgstr "Vel alle (synlege) signalprosessar"
-
-#: mixer_actor.cc:68
-msgid "Toggle Selected Processors"
-msgstr "Skru av/på dei valde signalprosessane"
-
-#: mixer_actor.cc:69
-msgid "Toggle Selected Plugins"
-msgstr "Skru av/på dei valde utvidingane"
-
-#: mixer_actor.cc:70
-msgid "Deselect all strips and processors"
+#: missing_plugin_dialog.cc:42
+msgid ""
+"This session contains the following plugins that cannot be found on this "
+"system:\n"
+"\n"
 msgstr ""
 
-#: mixer_actor.cc:72 mixer_actor.cc:73
-msgid "Scroll Mixer Window to the left"
-msgstr "Rull miksarvindauga til venstre"
-
-#: mixer_actor.cc:75
-msgid "Toggle MIDI Input Active for Mixer-Selected Tracks/Busses"
-msgstr "Skru på/av aktiv MIDI-inngang for miksarvalde spor/bussar"
-
-#: mixer_actor.cc:90
-msgid "Loaded mixer bindings from %1"
-msgstr "Lasta miksarbindingar frå %1"
-
-#: mixer_actor.cc:92
-msgid "Could not find mixer.bindings in search path %1"
-msgstr "Fann ikkje mixer.bindings i søkjestigen %1"
+#: missing_plugin_dialog.cc:48
+msgid ""
+"\n"
+"Those plugins will be replaced with inactive stubs.\n"
+"It is recommended that you install the missing plugins and re-load the "
+"session.\n"
+"(also check the blacklist, Window > Log and Preferences > Plugins)"
+msgstr ""
 
-#: mixer_strip.cc:96 mixer_strip.cc:125
+#: mixer_strip.cc:100 mixer_strip.cc:133
 msgid "pre"
 msgstr "før"
 
-#: mixer_strip.cc:98 mixer_strip.cc:127 mixer_strip.cc:372 mixer_strip.cc:1410
-#: rc_option_editor.cc:2331
+#: mixer_strip.cc:104 mixer_strip.cc:136 mixer_strip.cc:397
+#: mixer_strip.cc:1540 mixer_strip.cc:1551 rc_option_editor.cc:3140
 msgid "Comments"
 msgstr "Kommentarar"
 
-#: mixer_strip.cc:149
+#: mixer_strip.cc:160
 msgid "Click to toggle the width of this mixer strip."
 msgstr "Klikk for å endra breidd på denne miksarstripa."
 
-#: mixer_strip.cc:151
+#: mixer_strip.cc:162
 msgid ""
 "\n"
 "%1-%2-click to toggle the width of all strips."
@@ -7490,287 +8635,458 @@ msgstr ""
 "\n"
 "%1-%2-klikk for å endra breidda på alle stripene."
 
-#: mixer_strip.cc:158
+#: mixer_strip.cc:171
 msgid "Hide this mixer strip"
 msgstr "Gøym denne miksarstripa"
 
-#: mixer_strip.cc:169
+#: mixer_strip.cc:182
 msgid "Click to select metering point"
 msgstr "Klikk for å velja mælepunkt"
 
-#: mixer_strip.cc:185
+#: mixer_strip.cc:198
 msgid "Isolate Solo"
 msgstr "Isoler solo"
 
-#: mixer_strip.cc:193
+#: mixer_strip.cc:206
 msgid "Lock Solo Status"
 msgstr "LÃ¥s solostatus"
 
-#: mixer_strip.cc:196 mixer_strip.cc:2027
+#: mixer_strip.cc:208 mixer_strip.cc:2217
+msgid "SoloLock|Lock"
+msgstr ""
+
+#: mixer_strip.cc:209 mixer_strip.cc:2216
 msgid "Iso"
 msgstr ""
 
-#: mixer_strip.cc:250
+#: mixer_strip.cc:263
 msgid "Mix group"
 msgstr "Miksgruppe"
 
-#: mixer_strip.cc:368 rc_option_editor.cc:2327
+#: mixer_strip.cc:275
+msgid "Trim: "
+msgstr ""
+
+#: mixer_strip.cc:393 rc_option_editor.cc:3136
 msgid "Phase Invert"
 msgstr "Polaritetsvending"
 
-#: mixer_strip.cc:369 rc_option_editor.cc:2328
+#: mixer_strip.cc:394 rc_option_editor.cc:3137
 msgid "Record & Monitor"
 msgstr ""
 
-#: mixer_strip.cc:370 rc_option_editor.cc:2329
+#: mixer_strip.cc:395 rc_option_editor.cc:3138
 msgid "Solo Iso / Lock"
 msgstr ""
 
-#: mixer_strip.cc:524
+#: mixer_strip.cc:398 rc_option_editor.cc:3141
+msgid "VCA Assigns"
+msgstr ""
+
+#: mixer_strip.cc:531
+msgid "Show/Hide Monitoring Section"
+msgstr ""
+
+#: mixer_strip.cc:583
 msgid "Enable/Disable MIDI input"
 msgstr "Slå på/av MIDI-inngang"
 
-#: mixer_strip.cc:688
+#: mixer_strip.cc:749
 msgid "Aux"
 msgstr ""
 
-#: mixer_strip.cc:710
+#: mixer_strip.cc:775
 msgid "Snd"
 msgstr "Snd"
 
-#: mixer_strip.cc:776 mixer_strip.cc:879 processor_box.cc:2382
+#: mixer_strip.cc:846 mixer_strip.cc:951 processor_box.cc:3594
 msgid "Not connected to audio engine - no I/O changes are possible"
 msgstr ""
 
-#: mixer_strip.cc:833 mixer_strip.cc:935
+#: mixer_strip.cc:904 mixer_strip.cc:1007
 msgid "Add %1 port"
 msgstr ""
 
-#: mixer_strip.cc:840 mixer_strip.cc:942
+#: mixer_strip.cc:912 mixer_strip.cc:1014 monitor_section.cc:1466
+#: plugin_pin_dialog.cc:1782
 msgid "Routing Grid"
 msgstr ""
 
-#: mixer_strip.cc:1171
+#: mixer_strip.cc:1291
+msgid "MIDI "
+msgstr ""
+
+#: mixer_strip.cc:1295
 msgid "<b>INPUT</b> to %1"
 msgstr "<b>INNGANG</b> til %1"
 
-#: mixer_strip.cc:1174
+#: mixer_strip.cc:1297 monitor_section.cc:1511
 msgid "<b>OUTPUT</b> from %1"
 msgstr "<b>UTGANG</b> frå %1"
 
-#: mixer_strip.cc:1287
+#: mixer_strip.cc:1410 monitor_section.cc:1598
 msgid "Disconnected"
 msgstr "Fråkopla"
 
-#: mixer_strip.cc:1413
-msgid "*Comments*"
-msgstr "*Kommentarar*"
+#: mixer_strip.cc:1536
+msgid "Click to add/edit comments"
+msgstr ""
 
-#: mixer_strip.cc:1420
+#: mixer_strip.cc:1540 mixer_strip.cc:1551
 msgid "Cmt"
 msgstr "Kmt"
 
-#: mixer_strip.cc:1423
-msgid "*Cmt*"
-msgstr "*Kmt*"
-
-#: mixer_strip.cc:1429
-msgid "Click to Add/Edit Comments"
-msgstr "Klikk for å leggja til/redigera kommentarar"
-
-#: mixer_strip.cc:1473
+#: mixer_strip.cc:1596
 msgid "Grp"
 msgstr "Grp"
 
-#: mixer_strip.cc:1476
+#: mixer_strip.cc:1599
 msgid "~G"
 msgstr "~G"
 
-#: mixer_strip.cc:1505 route_time_axis.cc:561
+#: mixer_strip.cc:1640 route_time_axis.cc:585 vca_master_strip.cc:396
 msgid "Color..."
 msgstr "Farge..."
 
-#: mixer_strip.cc:1507 route_time_axis.cc:563
+#: mixer_strip.cc:1642 route_time_axis.cc:587
 msgid "Comments..."
 msgstr "Merknader …"
 
-#: mixer_strip.cc:1509 route_time_axis.cc:565
+#: mixer_strip.cc:1644 route_time_axis.cc:589
 msgid "Inputs..."
 msgstr ""
 
-#: mixer_strip.cc:1511 route_time_axis.cc:567
+#: mixer_strip.cc:1646 route_time_axis.cc:591
 msgid "Outputs..."
 msgstr ""
 
-#: mixer_strip.cc:1516
+#: mixer_strip.cc:1651
 msgid "Save As Template..."
 msgstr "Lagra som mal..."
 
-#: mixer_strip.cc:1530
+#: mixer_strip.cc:1657 route_group_dialog.cc:45 route_time_axis.cc:851
+msgid "Active"
+msgstr "Aktiv"
+
+#: mixer_strip.cc:1665 plugin_pin_dialog.cc:1011
+msgid "Strict I/O"
+msgstr ""
+
+#: mixer_strip.cc:1675 processor_box.cc:3698
+msgid "Pin Connections..."
+msgstr ""
+
+#: mixer_strip.cc:1679
 msgid "Adjust Latency..."
 msgstr "Juster treigskap..."
 
-#: mixer_strip.cc:1533
+#: mixer_strip.cc:1682
 msgid "Protect Against Denormals"
 msgstr "Vern mot unormalar"
 
-#: mixer_strip.cc:1539 route_time_axis.cc:580
-msgid "Remote Control ID..."
-msgstr "Fjernstyrings-ID..."
+#: mixer_strip.cc:1701 route_time_axis.cc:867
+msgid "Duplicate..."
+msgstr ""
 
-#: mixer_strip.cc:1823
+#: mixer_strip.cc:1996
 msgid "Pre"
 msgstr ""
 
-#: mixer_strip.cc:1827
+#: mixer_strip.cc:2000
 msgid "Post"
 msgstr ""
 
-#: mixer_strip.cc:1847
-msgid "Pr"
+#: mixer_strip.cc:2016
+msgid "Meter|In"
+msgstr ""
+
+#: mixer_strip.cc:2020
+msgid "Meter|Pr"
+msgstr ""
+
+#: mixer_strip.cc:2024
+msgid "Meter|Po"
 msgstr ""
 
-#: mixer_strip.cc:1851
-msgid "Po"
+#: mixer_strip.cc:2028
+msgid "Meter|O"
 msgstr ""
 
-#: mixer_strip.cc:1860
-msgid "C"
+#: mixer_strip.cc:2033
+msgid "Meter|C"
 msgstr ""
 
-#: mixer_strip.cc:2008 route_ui.cc:168
+#: mixer_strip.cc:2194 route_ui.cc:193
 msgid "Disk"
 msgstr "Disk"
 
-#: mixer_strip.cc:2020 monitor_section.cc:70
+#: mixer_strip.cc:2196
+msgid "Mon"
+msgstr ""
+
+#: mixer_strip.cc:2209 monitor_section.cc:81
 msgid "AFL"
 msgstr "EL"
 
-#: mixer_strip.cc:2023 monitor_section.cc:71
+#: mixer_strip.cc:2212 monitor_section.cc:82
 msgid "PFL"
 msgstr "FL"
 
-#: mixer_strip.cc:2034 meter_strip.cc:380
-msgid "D"
-msgstr "D"
+#: mixer_strip.cc:2222 meter_strip.cc:385
+msgid "MonitorInput|I"
+msgstr ""
+
+#: mixer_strip.cc:2223 meter_strip.cc:386
+msgid "MonitorDisk|D"
+msgstr ""
+
+#: mixer_strip.cc:2225
+msgid "Mon|O"
+msgstr ""
+
+#: mixer_strip.cc:2238 meter_strip.cc:377 route_time_axis.cc:2730
+#: vca_master_strip.cc:202 vca_time_axis.cc:227
+msgid "AfterFader|A"
+msgstr ""
 
 #: mixer_strip.cc:2241
+msgid "Prefader|P"
+msgstr ""
+
+#: mixer_strip.cc:2246
+msgid "SoloIso|I"
+msgstr ""
+
+#: mixer_strip.cc:2247
+msgid "SoloLock|L"
+msgstr ""
+
+#: mixer_strip.cc:2452
 msgid "Pre Fader"
 msgstr "Før volumkontroll"
 
-#: mixer_strip.cc:2242
+#: mixer_strip.cc:2453
 msgid "Post Fader"
 msgstr "Etter volumkontroll"
 
-#: mixer_strip.cc:2286 meter_strip.cc:847
+#: mixer_strip.cc:2498 meter_strip.cc:858
 msgid "Change all in Group to %1"
 msgstr ""
 
-#: mixer_strip.cc:2288 meter_strip.cc:849
+#: mixer_strip.cc:2500 meter_strip.cc:860
 msgid "Change all to %1"
 msgstr ""
 
-#: mixer_strip.cc:2290 meter_strip.cc:851
+#: mixer_strip.cc:2502 meter_strip.cc:862
 msgid "Change same track-type to %1"
 msgstr ""
 
-#: mixer_ui.cc:130 route_time_axis.cc:818
+#: mixer_ui.cc:152 route_time_axis.cc:828
 msgid "Group"
 msgstr "Gruppe"
 
-#: mixer_ui.cc:1224
+#: mixer_ui.cc:221
+msgid "Favorite Plugins"
+msgstr ""
+
+#: mixer_ui.cc:627
+msgid "Error adding GUI elements for new tracks/busses %1"
+msgstr ""
+
+#: mixer_ui.cc:1542
 msgid "track display list item for renamed strip not found!"
 msgstr "fann ikkje sporvisingslisteobjekt for omdøypt stripe!"
 
-#: mixer_ui.cc:1316
+#: mixer_ui.cc:1636
 msgid "-all-"
 msgstr "-alle-"
 
-#: mixer_ui.cc:1853
+#: mixer_ui.cc:2135
 msgid "Strips"
 msgstr "Striper"
 
-#: meter_strip.cc:157
+#: mixer_ui.cc:2479
+msgid "No Track/Bus is selected."
+msgstr ""
+
+#: mixer_ui.cc:2481
+msgid "Add at the top"
+msgstr ""
+
+#: mixer_ui.cc:2483
+msgid "Add Pre-Fader"
+msgstr ""
+
+#: mixer_ui.cc:2485
+msgid "Add Post-Fader"
+msgstr ""
+
+#: mixer_ui.cc:2487
+msgid "Add at the end"
+msgstr ""
+
+#: mixer_ui.cc:2493
+msgid "Remove from favorites"
+msgstr ""
+
+#: mixer_ui.cc:2499
+msgid "Delete Preset"
+msgstr ""
+
+#: mixer_ui.cc:2739
+msgid "Toggle Solo on Mixer-Selected Tracks/Busses"
+msgstr "Skru på solo på miksar-valde spor/bussar"
+
+#: mixer_ui.cc:2740
+msgid "Toggle Mute on Mixer-Selected Tracks/Busses"
+msgstr "Skru på/av demping på miksarvalde spor/bussar"
+
+#: mixer_ui.cc:2741
+msgid "Toggle Rec-enable on Mixer-Selected Tracks/Busses"
+msgstr "Skru på/av opptak på miksarvalde spor/bussar"
+
+#: mixer_ui.cc:2742
+msgid "Decrease Gain on Mixer-Selected Tracks/Busses"
+msgstr "Minsk volum på miksarvalde spor/bussar"
+
+#: mixer_ui.cc:2743
+msgid "Increase Gain on Mixer-Selected Tracks/Busses"
+msgstr "Auk volum på miksarvalde spor/bussar"
+
+#: mixer_ui.cc:2744
+msgid "Set Gain to 0dB on Mixer-Selected Tracks/Busses"
+msgstr "Set volumet til 0dB på miksarvalde spor/bussar"
+
+#: mixer_ui.cc:2747
+msgid "Copy Selected Processors"
+msgstr "Kopier dei valde signalprosessane"
+
+#: mixer_ui.cc:2748
+msgid "Cut Selected Processors"
+msgstr "Klypp ut dei valde signalprosessane"
+
+#: mixer_ui.cc:2749
+msgid "Paste Selected Processors"
+msgstr "Lim inn dei valde signalprosessane"
+
+#: mixer_ui.cc:2750
+msgid "Delete Selected Processors"
+msgstr "Slett dei valde signalprosessane"
+
+#: mixer_ui.cc:2751
+msgid "Select All (visible) Processors"
+msgstr "Vel alle (synlege) signalprosessar"
+
+#: mixer_ui.cc:2752
+msgid "Toggle Selected Processors"
+msgstr "Skru av/på dei valde signalprosessane"
+
+#: mixer_ui.cc:2753
+msgid "Toggle Selected Plugins"
+msgstr "Skru av/på dei valde utvidingane"
+
+#: mixer_ui.cc:2754
+msgid "Deselect all strips and processors"
+msgstr ""
+
+#: mixer_ui.cc:2756 mixer_ui.cc:2757
+msgid "Scroll Mixer Window to the left"
+msgstr "Rull miksarvindauga til venstre"
+
+#: mixer_ui.cc:2759
+msgid "Toggle MIDI Input Active for Mixer-Selected Tracks/Busses"
+msgstr "Skru på/av aktiv MIDI-inngang for miksarvalde spor/bussar"
+
+#: meter_strip.cc:160
 msgid "Reset Peak"
 msgstr ""
 
-#: meter_strip.cc:883
+#: meter_strip.cc:380 route_time_axis.cc:2734 vca_master_strip.cc:206
+#: vca_time_axis.cc:231
+msgid "PreFader|P"
+msgstr ""
+
+#: meter_strip.cc:894
 msgid "Variable height"
 msgstr ""
 
-#: meter_strip.cc:884
+#: meter_strip.cc:895
 msgid "Short"
 msgstr ""
 
-#: meter_strip.cc:885
+#: meter_strip.cc:896
 msgid "Tall"
 msgstr ""
 
-#: meter_strip.cc:886
+#: meter_strip.cc:897
 msgid "Grande"
 msgstr ""
 
-#: meter_strip.cc:887
+#: meter_strip.cc:898
 msgid "Venti"
 msgstr ""
 
-#: meter_patterns.cc:82
-msgid "Peak"
+#: meter_patterns.cc:84
+msgid "Peak (+6dBFS)"
+msgstr ""
+
+#: meter_patterns.cc:87
+msgid "Peak (0dBFS)"
 msgstr ""
 
-#: meter_patterns.cc:85
+#: meter_patterns.cc:90
 msgid "RMS + Peak"
 msgstr ""
 
-#: meter_patterns.cc:88
+#: meter_patterns.cc:93
 msgid "IEC1/DIN"
 msgstr ""
 
-#: meter_patterns.cc:91
+#: meter_patterns.cc:96
 msgid "IEC1/Nordic"
 msgstr ""
 
-#: meter_patterns.cc:94
+#: meter_patterns.cc:99
 msgid "IEC2/BBC"
 msgstr ""
 
-#: meter_patterns.cc:97
+#: meter_patterns.cc:102
 msgid "IEC2/EBU"
 msgstr ""
 
-#: meter_patterns.cc:100
-msgid "K20"
+#: meter_patterns.cc:105
+msgid "K20/RMS"
 msgstr ""
 
-#: meter_patterns.cc:103
-msgid "K14"
+#: meter_patterns.cc:108
+msgid "K14/RMS"
 msgstr ""
 
-#: meter_patterns.cc:106
-msgid "K12"
+#: meter_patterns.cc:111
+msgid "K12/RMS"
 msgstr ""
 
-#: meter_patterns.cc:109
+#: meter_patterns.cc:114
 msgid "VU"
 msgstr ""
 
-#: monitor_section.cc:69
+#: monitor_section.cc:80
 msgid "SiP"
 msgstr "Spp"
 
-#: monitor_section.cc:96 route_group_dialog.cc:49
+#: monitor_section.cc:113 route_group_dialog.cc:49
 msgid "Soloing"
 msgstr "Solo"
 
-#: monitor_section.cc:100
+#: monitor_section.cc:117
 msgid "Isolated"
 msgstr ""
 
-#: monitor_section.cc:104
+#: monitor_section.cc:121
 msgid "Auditioning"
 msgstr ""
 
-#: monitor_section.cc:114
+#: monitor_section.cc:132
 msgid ""
 "When active, something is solo-isolated.\n"
 "Click to de-isolate everything"
@@ -7778,7 +9094,7 @@ msgstr ""
 "NÃ¥r knappen er trykt inn, er noko solo-isolert.\n"
 "Klikk for å av-isolera alt."
 
-#: monitor_section.cc:117
+#: monitor_section.cc:135
 msgid ""
 "When active, auditioning is active.\n"
 "Click to stop the audition"
@@ -7786,27 +9102,72 @@ msgstr ""
 "Når knappen er trykt inn, blir noko lytta på.\n"
 "Klikk for å slå av lyttinga."
 
-#: monitor_section.cc:134
+#: monitor_section.cc:152
 msgid "Solo controls affect solo-in-place"
 msgstr "Solo-kontrollar styrer solo-på-plass"
 
-#: monitor_section.cc:140
+#: monitor_section.cc:158
 msgid "Solo controls toggle after-fader-listen"
 msgstr "Solo-kontrollar styrer etterlytting"
 
-#: monitor_section.cc:146
+#: monitor_section.cc:164
 msgid "Solo controls toggle pre-fader-listen"
 msgstr "Solo-kontrollar styrer førlytting"
 
-#: monitor_section.cc:156
-msgid "Gain increase for soloed signals (0dB is normal)"
-msgstr "Volumauke for solo-signal (0dB er vanleg)"
-
 #: monitor_section.cc:170
-msgid "Solo Boost"
-msgstr "Solo-volumauke"
-
-#: monitor_section.cc:185
+msgid "Excl. Solo"
+msgstr ""
+
+#: monitor_section.cc:172
+msgid "Exclusive solo means that only 1 solo is active at a time"
+msgstr "Eksklusiv solo tyder at berre 1 solo om gongen er aktiv"
+
+#: monitor_section.cc:179
+msgid "Solo » Mute"
+msgstr ""
+
+#: monitor_section.cc:181
+msgid ""
+"If enabled, solo will override mute\n"
+"(a soloed & muted track or bus will be audible)"
+msgstr ""
+"Når skrudd på, vil solo overstyra demping\n"
+"(eit dempa solospor eller -buss vil høyrast)"
+
+#: monitor_section.cc:189
+msgid "Processors"
+msgstr ""
+
+#: monitor_section.cc:191
+msgid "Allow one to add monitor effect processors"
+msgstr ""
+
+#: monitor_section.cc:206
+msgid "Gain increase for soloed signals (0dB is normal)"
+msgstr "Volumauke for solo-signal (0dB er vanleg)"
+
+#: monitor_section.cc:210 monitor_section.cc:227 monitor_section.cc:244
+#: monitor_section.cc:289
+msgid "0 dB"
+msgstr ""
+
+#: monitor_section.cc:211
+msgid "3 dB"
+msgstr ""
+
+#: monitor_section.cc:212
+msgid "6 dB"
+msgstr ""
+
+#: monitor_section.cc:213
+msgid "10 dB"
+msgstr ""
+
+#: monitor_section.cc:215
+msgid "Solo Boost"
+msgstr "Solo-volumauke"
+
+#: monitor_section.cc:222
 msgid ""
 "Gain reduction non-soloed signals\n"
 "A value above -inf dB causes \"solo-in-front\""
@@ -7814,105 +9175,135 @@ msgstr ""
 "Volumreduksjon for signal som ikkje er solo\n"
 "Verdiar over -inf dB gjev «solo-i-front»"
 
-#: monitor_section.cc:196
+#: monitor_section.cc:228 monitor_section.cc:246 monitor_section.cc:291
+msgid "-6 dB"
+msgstr ""
+
+#: monitor_section.cc:229 monitor_section.cc:247 monitor_section.cc:292
+msgid "-12 dB"
+msgstr ""
+
+#: monitor_section.cc:230 monitor_section.cc:248 monitor_section.cc:293
+msgid "-20 dB"
+msgstr ""
+
+#: monitor_section.cc:231
+msgid "OFF"
+msgstr ""
+
+#: monitor_section.cc:233
 msgid "SiP Cut"
 msgstr "Spp-kutt"
 
-#: monitor_section.cc:211
+#: monitor_section.cc:240
 msgid "Gain reduction to use when dimming monitor outputs"
 msgstr "Volumreduksjon når me dimmar monitorutgangane"
 
-#: monitor_section.cc:225 monitor_section.cc:283
-msgid "Dim"
-msgstr "Dim"
-
-#: monitor_section.cc:235
-msgid "Excl. Solo"
+#: monitor_section.cc:245 monitor_section.cc:290
+msgid "-3 dB"
 msgstr ""
 
-#: monitor_section.cc:237
-msgid "Exclusive solo means that only 1 solo is active at a time"
-msgstr "Eksklusiv solo tyder at berre 1 solo om gongen er aktiv"
+#: monitor_section.cc:250 monitor_section.cc:264 monitor_section.cc:325
+msgid "Dim"
+msgstr "Dim"
 
-#: monitor_section.cc:244
-msgid "Solo » Mute"
+#: monitor_section.cc:294
+msgid "-30 dB"
 msgstr ""
 
-#: monitor_section.cc:246
-msgid ""
-"If enabled, solo will override mute\n"
-"(a soloed & muted track or bus will be audible)"
+#: monitor_section.cc:333
+msgid "Inv"
 msgstr ""
-"Når skrudd på, vil solo overstyra demping\n"
-"(eit dempa solospor eller -buss vil høyrast)"
 
-#: monitor_section.cc:323
+#: monitor_section.cc:399
 msgid "Monitor"
 msgstr "Lytting"
 
-#: monitor_section.cc:744
+#: monitor_section.cc:897
 msgid "Switch monitor to mono"
 msgstr ""
 
-#: monitor_section.cc:747
+#: monitor_section.cc:900
 msgid "Cut monitor"
 msgstr ""
 
-#: monitor_section.cc:750
+#: monitor_section.cc:903
 msgid "Dim monitor"
 msgstr ""
 
-#: monitor_section.cc:753
+#: monitor_section.cc:906
 msgid "Toggle exclusive solo mode"
 msgstr ""
 
-#: monitor_section.cc:759
+#: monitor_section.cc:912
 msgid "Toggle mute overrides solo mode"
 msgstr ""
 
-#: monitor_section.cc:771
+#: monitor_section.cc:921
 msgid "Cut monitor channel %1"
 msgstr "Kutt lytting kan %1"
 
-#: monitor_section.cc:776
+#: monitor_section.cc:926
 msgid "Dim monitor channel %1"
 msgstr "Dim lytting kan %1"
 
-#: monitor_section.cc:781
+#: monitor_section.cc:931
 msgid "Solo monitor channel %1"
 msgstr "Solo lytting kan %1"
 
-#: monitor_section.cc:786
+#: monitor_section.cc:936
 msgid "Invert monitor channel %1"
 msgstr "Snu lytting kan %1"
 
-#: monitor_section.cc:796
+#: monitor_section.cc:946
 msgid "In-place solo"
 msgstr ""
 
-#: monitor_section.cc:798
+#: monitor_section.cc:948
 msgid "After Fade Listen (AFL) solo"
 msgstr ""
 
-#: monitor_section.cc:800
+#: monitor_section.cc:950
 msgid "Pre Fade Listen (PFL) solo"
 msgstr ""
 
-#: mono_panner.cc:109 stereo_panner.cc:119
+#: monitor_section.cc:953
+msgid "Toggle Monitor Section Processor Box"
+msgstr ""
+
+#: monitor_section.cc:1413
+msgid "No session - no I/O changes are possible"
+msgstr ""
+
+#: monitor_selector.cc:199
+msgid "Monitor output selector"
+msgstr ""
+
+#: mono_panner.cc:105 stereo_panner.cc:115
 msgid "bypassed"
 msgstr ""
 
-#: mono_panner.cc:123
+#: mono_panner.cc:119
 #, c-format
 msgid "L:%3d R:%3d"
 msgstr ""
 
-#: mono_panner_editor.cc:33
+#: mono_panner.cc:203 panner2d.cc:276 stereo_panner.cc:252
+#: stereo_panner.cc:275
+msgid "Panner|L"
+msgstr ""
+
+#: mono_panner.cc:220 panner2d.cc:277 stereo_panner.cc:250
+#: stereo_panner.cc:277
+msgid "Panner|R"
+msgstr ""
+
+#: mono_panner_editor.cc:35
 msgid "Mono Panner"
 msgstr "Monopanorering"
 
-#: mono_panner_editor.cc:44 mono_panner_editor.cc:49
-#: stereo_panner_editor.cc:46 stereo_panner_editor.cc:51
+#: mono_panner_editor.cc:46 mono_panner_editor.cc:51
+#: stereo_panner_editor.cc:48 stereo_panner_editor.cc:53
 msgid "%"
 msgstr "%"
 
@@ -7988,10 +9379,6 @@ msgstr ""
 "fram med\n"
 "Ã¥ laga Ardour utan stabile inntekter. Takk for at du bruker Ardour!"
 
-#: new_plugin_preset_dialog.cc:29
-msgid "New Preset"
-msgstr "Nytt ferdigoppsett"
-
 #: new_plugin_preset_dialog.cc:30
 msgid "Replace existing preset with this name"
 msgstr "Byt ut eksisterande ferdigoppsett med dette namnet"
@@ -8000,6 +9387,10 @@ msgstr "Byt ut eksisterande ferdigoppsett med dette namnet"
 msgid "Name of new preset"
 msgstr "Namn på det nye ferdigoppsettet"
 
+#: new_plugin_preset_dialog.cc:44
+msgid "New Favorite Only"
+msgstr ""
+
 #: normalize_dialog.cc:34
 msgid "Normalize regions"
 msgstr "Normaliser bolkane"
@@ -8008,7 +9399,11 @@ msgstr "Normaliser bolkane"
 msgid "Normalize region"
 msgstr "Normaliser bolken"
 
-#: normalize_dialog.cc:49 strip_silence_dialog.cc:66
+#: normalize_dialog.cc:42
+msgid "Normalize to:"
+msgstr "Normaliser til:"
+
+#: normalize_dialog.cc:49 strip_silence_dialog.cc:67
 msgid "dbFS"
 msgstr "dbFS"
 
@@ -8028,45 +9423,50 @@ msgstr "Normaliser"
 msgid "Select Note"
 msgstr ""
 
-#: opts.cc:57
+#: opts.cc:61
 msgid "Usage: "
 msgstr "Bruk: "
 
-#: opts.cc:58
+#: opts.cc:62
 msgid "  [SESSION_NAME]              Name of session to load\n"
 msgstr "  [ØKTNAMN]                   Namn på økta du vil lasta\n"
 
-#: opts.cc:59
+#: opts.cc:63
 msgid "  -v, --version               Show version information\n"
 msgstr "  -v, --version                    Vis versionsinformasjon\n"
 
-#: opts.cc:60
+#: opts.cc:64
 msgid "  -h, --help                  Print this message\n"
 msgstr "  -h, --help                         Vis denne meldinga\n"
 
-#: opts.cc:61
+#: opts.cc:65
 msgid ""
 "  -a, --no-announcements      Do not contact website for announcements\n"
 msgstr ""
 
-#: opts.cc:62
+#: opts.cc:66
 msgid ""
 "  -b, --bindings              Print all possible keyboard binding names\n"
 msgstr ""
 "  -b, --bindings                   Vis alle moglege tastekombinasjonar\n"
 
-#: opts.cc:63
+#: opts.cc:67
+msgid ""
+"  -B, --bypass-plugins        Bypass all plugins in an existing session\n"
+msgstr ""
+
+#: opts.cc:68
 msgid ""
 "  -c, --name <name>           Use a specific backend client name, default is "
 "ardour\n"
 msgstr ""
 
-#: opts.cc:64
+#: opts.cc:69
 msgid ""
 "  -d, --disable-plugins       Disable all plugins in an existing session\n"
 msgstr "  -d, --disable-plugins           Skru av alle utvidingar i ei økt\n"
 
-#: opts.cc:65
+#: opts.cc:70
 msgid ""
 "  -D, --debug <options>       Set debug flags. Use \"-D list\" to see "
 "available options\n"
@@ -8074,65 +9474,61 @@ msgstr ""
 "  -D, --debug <val>       Set avlusingsflagg. Bruk \"-D list\" for å sjå kva "
 "val som finst\n"
 
-#: opts.cc:66
+#: opts.cc:71
 msgid "  -n, --no-splash             Do not show splash screen\n"
 msgstr "  -n, --no-splash                Ikkje vis oppstartsbiletet\n"
 
-#: opts.cc:67
+#: opts.cc:72
 msgid "  -m, --menus file            Use \"file\" to define menus\n"
 msgstr "  -m, --menus file                 Bruk \"fil\" for Ardour-menyar\n"
 
-#: opts.cc:68
+#: opts.cc:73
 msgid ""
 "  -N, --new session-name      Create a new session from the command line\n"
 msgstr "  -N, --new session-name           Lag ei ny økt frå kommandolinja\n"
 
-#: opts.cc:69
+#: opts.cc:74
 msgid "  -O, --no-hw-optimizations   Disable h/w specific optimizations\n"
 msgstr ""
 "  -O, --no-hw-optimizations        Ikkje bruk spesialinnstillingar for "
 "maskinvara di\n"
 
-#: opts.cc:70
+#: opts.cc:75
 msgid "  -P, --no-connect-ports      Do not connect any ports at startup\n"
 msgstr ""
 
-#: opts.cc:71
+#: opts.cc:76
 msgid "  -S, --sync                  Draw the gui synchronously \n"
 msgstr "  -S, --sync\t                      Teikne brukarflata synkront \n"
 
-#: opts.cc:73
+#: opts.cc:78
 msgid "  -V, --novst                 Do not use VST support\n"
 msgstr "  -V, --novst                      Slå av VST-støtta\n"
 
-#: opts.cc:75
+#: opts.cc:80
 msgid ""
 "  -E, --save <file>           Load the specified session, save it to <file> "
 "and then quit\n"
 msgstr ""
 "  -E, --save <fil>           Last økta, lagra ho til <file> og avslutt\n"
 
-#: opts.cc:76
+#: opts.cc:81
 msgid "  -C, --curvetest filename    Curve algorithm debugger\n"
 msgstr "  -C, --curvetest filename         Kurvealgoritme-avlusing\n"
 
-#: opts.cc:77
-msgid ""
-"  -k, --keybindings filename  Name of key bindings to load (default is ~/."
-"ardour3/ardour.bindings)\n"
+#: opts.cc:82
+msgid "  -k, --keybindings filename  Name of key bindings to load\n"
 msgstr ""
-"  -k, --keybindings-filename      Namn på snøggtastfil som skal lastast "
-"(standard er ~/.ardour3/ardour.bindings)\n"
 
-#: panner2d.cc:854
+#: panner2d.cc:896
 msgid "Panner (2D)"
 msgstr "Panorering (2D)"
 
-#: panner2d.cc:856 panner_ui.cc:400 plugin_ui.cc:452
+#: panner2d.cc:898 panner_ui.cc:402 plugin_ui.cc:458
 msgid "Bypass"
 msgstr "Forbikopla"
 
-#: panner2d.cc:862
+#: panner2d.cc:904
 msgid "Panner"
 msgstr "Panorering"
 
@@ -8144,6 +9540,22 @@ msgstr "pan-automasjonsmodus"
 msgid "Pan automation type"
 msgstr "pan-automasjonstype"
 
+#: panner_ui.cc:605
+msgid "Manual|M"
+msgstr ""
+
+#: panner_ui.cc:608
+msgid "Play|P"
+msgstr ""
+
+#: panner_ui.cc:611
+msgid "Touch|T"
+msgstr ""
+
+#: panner_ui.cc:614
+msgid "Write|W"
+msgstr ""
+
 #: playlist_selector.cc:43
 msgid "Playlists"
 msgstr "Spelelister"
@@ -8176,100 +9588,254 @@ msgstr "db-skala"
 msgid "Show phase"
 msgstr "Vis fase"
 
-#: plugin_selector.cc:53 plugin_selector.cc:229
+#: plugin_pin_dialog.cc:55
+msgid "Manual Config"
+msgstr ""
+
+#: plugin_pin_dialog.cc:56
+msgid "Sidechain"
+msgstr ""
+
+#: plugin_pin_dialog.cc:57 plugin_pin_dialog.cc:59 plugin_pin_dialog.cc:61
+#: plugin_pin_dialog.cc:63 plugin_pin_dialog.cc:65 step_entry.cc:81
+#: step_entry.cc:84
+msgid "+"
+msgstr "+"
+
+#: plugin_pin_dialog.cc:58 plugin_pin_dialog.cc:60 plugin_pin_dialog.cc:62
+#: plugin_pin_dialog.cc:64 plugin_pin_dialog.cc:66
+msgid "-"
+msgstr ""
+
+#: plugin_pin_dialog.cc:148
+msgid "Audio Input Pins"
+msgstr ""
+
+#: plugin_pin_dialog.cc:157
+msgid "MIDI Input Pins"
+msgstr ""
+
+#: plugin_pin_dialog.cc:166
+msgid "Instances"
+msgstr ""
+
+#: plugin_pin_dialog.cc:176
+msgid "Audio Out"
+msgstr ""
+
+#: plugin_pin_dialog.cc:185
+msgid "MIDI Out"
+msgstr ""
+
+#: plugin_pin_dialog.cc:192
+msgid "Output Presets"
+msgstr ""
+
+#: plugin_pin_dialog.cc:208
+msgid "Add Sidechain Input"
+msgstr ""
+
+#: plugin_pin_dialog.cc:478 plugin_pin_dialog.cc:482 plugin_pin_dialog.cc:486
+#: plugin_setup_dialog.cc:115 plugin_setup_dialog.cc:199
+msgid "Automatic"
+msgstr ""
+
+#: plugin_pin_dialog.cc:515 plugin_setup_dialog.cc:208
+msgid "%1 Channel"
+msgid_plural "%1 Channels"
+msgstr[0] ""
+msgstr[1] ""
+
+#: plugin_pin_dialog.cc:641 processor_box.cc:224
+msgid "Send"
+msgstr ""
+
+#: plugin_pin_dialog.cc:997
+msgid "Latency %1 spl%2 %3"
+msgstr ""
+
+#: plugin_pin_dialog.cc:997 plugin_pin_dialog.cc:1001
+msgid "no-inplace"
+msgstr ""
+
+#: plugin_pin_dialog.cc:999
+msgid "Latency %1 spl"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1055
+msgid "Instance #%1"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1700 processor_box.cc:2508
+msgid "Cannot set up new send: %1"
+msgstr "Greier ikkje setja opp ny send: %1"
+
+#: plugin_pin_dialog.cc:1707
+msgid "SC %1 (%2)"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1963 plugin_pin_dialog.cc:1971
+msgid "Pin Configuration: %1"
+msgstr ""
+
+#: plugin_setup_dialog.cc:30
+msgid "Plugin Setup"
+msgstr ""
+
+#: plugin_setup_dialog.cc:33
+msgid "Copy I/O Map"
+msgstr ""
+
+#: plugin_setup_dialog.cc:50
+msgid "An Instrument plugin is already present."
+msgstr ""
+
+#: plugin_setup_dialog.cc:54
+msgid "Replace"
+msgstr ""
+
+#: plugin_setup_dialog.cc:60
+msgid "with"
+msgstr ""
+
+#: plugin_setup_dialog.cc:70
+msgid "I/O Pin Mapping"
+msgstr ""
+
+#: plugin_setup_dialog.cc:79
+msgid "Configure Plugin '%1'"
+msgstr ""
+
+#: plugin_setup_dialog.cc:90
+msgid "Output Configuration"
+msgstr ""
+
+#: plugin_selector.cc:54 plugin_selector.cc:322
 msgid "Name contains"
 msgstr "Namnet inneheld"
 
-#: plugin_selector.cc:54 plugin_selector.cc:233
+#: plugin_selector.cc:55 plugin_selector.cc:326
 msgid "Type contains"
 msgstr "Typen inneheld"
 
-#: plugin_selector.cc:55 plugin_selector.cc:231
+#: plugin_selector.cc:56 plugin_selector.cc:324
 msgid "Category contains"
 msgstr "Kategorien inneheld"
 
-#: plugin_selector.cc:56 plugin_selector.cc:253
+#: plugin_selector.cc:57 plugin_selector.cc:349
 msgid "Author contains"
 msgstr "Opphavsperson inneheld"
 
-#: plugin_selector.cc:57 plugin_selector.cc:255
+#: plugin_selector.cc:58 plugin_selector.cc:351
 msgid "Library contains"
 msgstr "Biblioteket inneheld"
 
-#: plugin_selector.cc:58 plugin_selector.cc:219 plugin_selector.cc:537
+#: plugin_selector.cc:59 plugin_selector.cc:278 plugin_selector.cc:639
 msgid "Favorites only"
 msgstr "Berre favorittar"
 
-#: plugin_selector.cc:59 plugin_selector.cc:223 plugin_selector.cc:537
+#: plugin_selector.cc:60 plugin_selector.cc:282 plugin_selector.cc:639
 msgid "Hidden only"
 msgstr "Berre gøymt"
 
-#: plugin_selector.cc:64
+#: plugin_selector.cc:65
 msgid "Plugin Manager"
 msgstr "Ordna utvidingar"
 
-#: plugin_selector.cc:85
+#: plugin_selector.cc:96
 msgid "Fav"
 msgstr "Fav"
 
-#: plugin_selector.cc:87
+#: plugin_selector.cc:98
 msgid "Available Plugins"
 msgstr "Tilgjengelege utvidingar"
 
-#: plugin_selector.cc:88
+#: plugin_selector.cc:99
 msgid "Type"
 msgstr "Type"
 
-#: plugin_selector.cc:89
+#: plugin_selector.cc:100
 msgid "Category"
 msgstr "Kategori"
 
-#: plugin_selector.cc:90
+#: plugin_selector.cc:101
 msgid "Creator"
 msgstr "Opphavsperson"
 
-#: plugin_selector.cc:91
+#: plugin_selector.cc:102
 msgid "# Audio In"
 msgstr "# Lyd inn"
 
-#: plugin_selector.cc:92
+#: plugin_selector.cc:103
 msgid "# Audio Out"
 msgstr "# Lyd ut"
 
-#: plugin_selector.cc:93
+#: plugin_selector.cc:104
 msgid "# MIDI In"
 msgstr "# MIDI inn"
 
-#: plugin_selector.cc:94
+#: plugin_selector.cc:105
 msgid "# MIDI Out"
 msgstr "# MIDI ut"
 
-#: plugin_selector.cc:116
+#: plugin_selector.cc:132
 msgid "Plugins to be connected"
 msgstr "Utvidingar som skal koplast til"
 
-#: plugin_selector.cc:129
+#: plugin_selector.cc:145
 msgid "Add a plugin to the effect list"
 msgstr "Legg ei utviding til effektlista"
 
-#: plugin_selector.cc:133
+#: plugin_selector.cc:149
 msgid "Remove a plugin from the effect list"
 msgstr "Fjern ei utviding frå effektlista"
 
-#: plugin_selector.cc:135
-msgid "Update available plugins"
-msgstr "Oppdater utvidingar"
+#: plugin_selector.cc:161
+msgid "Show Hidden"
+msgstr ""
+
+#: plugin_selector.cc:163
+msgid "Include hidden plugins in list."
+msgstr ""
+
+#: plugin_selector.cc:166
+msgid "Instruments"
+msgstr ""
+
+#: plugin_selector.cc:168
+msgid "Cycle display of instrument plugins (if any)."
+msgstr ""
+
+#: plugin_selector.cc:171
+msgid "Analyzers"
+msgstr ""
+
+#: plugin_selector.cc:173
+msgid "Cycle display of analysis plugins (if any)."
+msgstr ""
+
+#: plugin_selector.cc:176
+msgid "Utils"
+msgstr ""
+
+#: plugin_selector.cc:178
+msgid "Cycle display of utility plugins (if any)."
+msgstr ""
+
+#: plugin_selector.cc:208
+msgid "Filter"
+msgstr ""
 
-#: plugin_selector.cc:172
+#: plugin_selector.cc:232
 msgid "Insert Plugin(s)"
 msgstr "Set inn utviding(ar)"
 
-#: plugin_selector.cc:337 plugin_selector.cc:338 plugin_selector.cc:339
-#: plugin_selector.cc:340
+#: plugin_selector.cc:439 plugin_selector.cc:440 plugin_selector.cc:441
+#: plugin_selector.cc:442
 msgid "variable"
 msgstr "variabel"
 
-#: plugin_selector.cc:496
+#: plugin_selector.cc:598
 msgid ""
 "The plugin \"%1\" could not be loaded\n"
 "\n"
@@ -8279,43 +9845,43 @@ msgstr ""
 "\n"
 "Sjå i loggruta etter (kanskje) fleire opplysingar"
 
-#: plugin_selector.cc:644
+#: plugin_selector.cc:757
 msgid "Favorites"
 msgstr "Favorittar"
 
-#: plugin_selector.cc:646
+#: plugin_selector.cc:759
 msgid "Plugin Manager..."
 msgstr "Ordna utvidingar..."
 
-#: plugin_selector.cc:650
+#: plugin_selector.cc:763
 msgid "By Creator"
 msgstr "Etter opphavsperson"
 
-#: plugin_selector.cc:653
+#: plugin_selector.cc:766
 msgid "By Category"
 msgstr "Etter kategori"
 
-#: plugin_ui.cc:113
+#: plugin_ui.cc:114
 msgid "Eh? LADSPA plugins don't have editors!"
 msgstr "Hm? LADSPA-utvidingar har ikkje redigering!"
 
-#: plugin_ui.cc:122 plugin_ui.cc:227
+#: plugin_ui.cc:123 plugin_ui.cc:228
 msgid ""
 "unknown type of editor-supplying plugin (note: no VST support in this "
 "version of %1)"
 msgstr ""
 
-#: plugin_ui.cc:125
+#: plugin_ui.cc:126
 msgid "unknown type of editor-supplying plugin"
 msgstr "ukjent redigerbar utvidingstype"
 
-#: plugin_ui.cc:257
+#: plugin_ui.cc:258
 msgid ""
 "unknown type of editor-supplying plugin (note: no linuxVST support in this "
 "version of %1)"
 msgstr ""
 
-#: plugin_ui.cc:329
+#: plugin_ui.cc:330
 msgid "create_lv2_editor called on non-LV2 plugin"
 msgstr "create_lv2_editor oppkalla på ikkje-LV2-utviding"
 
@@ -8323,15 +9889,15 @@ msgstr "create_lv2_editor oppkalla på ikkje-LV2-utviding"
 msgid "Add"
 msgstr "Legg til"
 
-#: plugin_ui.cc:422
+#: plugin_ui.cc:423
 msgid "Description"
 msgstr "Skildring"
 
-#: plugin_ui.cc:423
+#: plugin_ui.cc:424
 msgid "Plugin analysis"
 msgstr "Analyse av programutvidingar"
 
-#: plugin_ui.cc:430
+#: plugin_ui.cc:431
 msgid ""
 "Presets (if any) for this plugin\n"
 "(Both factory and user-created)"
@@ -8339,23 +9905,28 @@ msgstr ""
 "Førehandsoppsett (viss dei finst) for utvidinga\n"
 "(Både frå produsent og brukarar)"
 
-#: plugin_ui.cc:431
+#: plugin_ui.cc:432
 msgid "Save a new preset"
 msgstr "Lagra nytt ferdigoppsett"
 
-#: plugin_ui.cc:432
+#: plugin_ui.cc:433
 msgid "Save the current preset"
 msgstr "Lagra ferdigoppsettet"
 
-#: plugin_ui.cc:433
+#: plugin_ui.cc:434
 msgid "Delete the current preset"
 msgstr "Slett dette ferdigoppsett"
 
-#: plugin_ui.cc:434
+#: plugin_ui.cc:435
+msgid ""
+"Reset parameters to default (if no parameters are in automation play mode)"
+msgstr ""
+
+#: plugin_ui.cc:436
 msgid "Disable signal processing by the plugin"
 msgstr "Skru av signalhandsaminga åt utvidinga"
 
-#: plugin_ui.cc:467 plugin_ui.cc:663
+#: plugin_ui.cc:473 plugin_ui.cc:681
 msgid ""
 "Click to allow the plugin to receive keyboard events that %1 would normally "
 "use as a shortcut"
@@ -8363,111 +9934,127 @@ msgstr ""
 "Klikk for å gje utvidinga lov til å ta imot tastetrykk som %1 vanlegvis "
 "bruker som snøggtastar"
 
-#: plugin_ui.cc:468
+#: plugin_ui.cc:474
 msgid "Click to enable/disable this plugin"
 msgstr "Klikk for å skru av/på denne utvidinga"
 
-#: plugin_ui.cc:507
+#: plugin_ui.cc:517
 msgid "latency (%1 sample)"
 msgid_plural "latency (%1 samples)"
 msgstr[0] "utreigskap (%1 punkt)"
 msgstr[1] "treigskap (%1 punkt)"
 
-#: plugin_ui.cc:509
+#: plugin_ui.cc:519
 msgid "latency (%1 ms)"
 msgstr "treigskap (%1 ms)"
 
-#: plugin_ui.cc:520
+#: plugin_ui.cc:530
 msgid "Edit Latency"
 msgstr "Endra treigskap"
 
-#: plugin_ui.cc:566
+#: plugin_ui.cc:576
 msgid ""
 "Plugin presets are not supported in this build of %1. Consider paying for a "
 "full version"
 msgstr ""
 
-#: plugin_ui.cc:574
+#: plugin_ui.cc:584
 msgid ""
 "Plugin presets are not supported in this build, see the Log window for more "
 "information."
 msgstr ""
 
-#: plugin_ui.cc:670
+#: plugin_ui.cc:592
+msgid "New Preset"
+msgstr "Nytt ferdigoppsett"
+
+#: plugin_ui.cc:688
 msgid "Click to allow normal use of %1 keyboard shortcuts"
 msgstr "Klikk for å bruka snøggtastane som vanleg i %1"
 
-#: port_group.cc:337
+#: plugin_ui.cc:785
+msgid "(none)"
+msgstr ""
+
+#: port_group.cc:338
 msgid "%1 Busses"
 msgstr "%1 bussar"
 
-#: port_group.cc:338
+#: port_group.cc:339
 msgid "%1 Tracks"
 msgstr "%1 spor"
 
-#: port_group.cc:339
+#: port_group.cc:340
 msgid "Hardware"
 msgstr "Maskinvare"
 
-#: port_group.cc:340
+#: port_group.cc:341
 msgid "%1 Misc"
 msgstr "%1 ymse"
 
-#: port_group.cc:341
+#: port_group.cc:342
 msgid "Other"
 msgstr "Anna"
 
-#: port_group.cc:432 port_group.cc:433
+#: port_group.cc:434 port_group.cc:435
 msgid "LTC Out"
 msgstr "LTC ut"
 
-#: port_group.cc:436 port_group.cc:437
+#: port_group.cc:438 port_group.cc:439
 msgid "LTC In"
 msgstr "LTC inn"
 
-#: port_group.cc:463
+#: port_group.cc:473
 msgid "MTC in"
 msgstr "MTC inn"
 
-#: port_group.cc:466
+#: port_group.cc:476
 msgid "MIDI control in"
 msgstr "MIDI-kontroll inn"
 
-#: port_group.cc:469
+#: port_group.cc:479
 msgid "MIDI clock in"
 msgstr "MIDI-klokke inn"
 
-#: port_group.cc:472
+#: port_group.cc:482
 msgid "MMC in"
 msgstr "MMC inn"
 
-#: port_group.cc:476
+#: port_group.cc:486
 msgid "MTC out"
 msgstr "MTC ut"
 
-#: port_group.cc:479
+#: port_group.cc:489
 msgid "MIDI control out"
 msgstr "MIDI-kontroll ut"
 
-#: port_group.cc:482
+#: port_group.cc:492
 msgid "MIDI clock out"
 msgstr "MIDI-klokke ut"
 
-#: port_group.cc:485
+#: port_group.cc:495
 msgid "MMC out"
 msgstr "MMC ut"
 
-#: port_group.cc:532
+#: port_group.cc:554
 msgid ":monitor"
 msgstr ":lytting"
 
-#: port_group.cc:544
+#: port_group.cc:570
 msgid "system:"
 msgstr "system:"
 
-#: port_group.cc:545
-msgid "alsa_pcm"
-msgstr "alsa_pcm"
+#: port_group.cc:571
+msgid "alsa_pcm:"
+msgstr ""
+
+#: port_group.cc:572
+msgid "alsa_midi:"
+msgstr ""
+
+#: port_group.cc:577
+msgid "Scene "
+msgstr ""
 
 #: port_insert_ui.cc:39
 msgid "Measure Latency"
@@ -8489,79 +10076,76 @@ msgstr "Fann ikkje noko signal"
 msgid "Port Insert "
 msgstr "Portinnstikk"
 
-#: port_matrix.cc:331 port_matrix.cc:357
+#: port_matrix.cc:341 port_matrix.cc:367
 msgid "<b>Sources</b>"
 msgstr "<b>Kjelder</b>"
 
-#: port_matrix.cc:332 port_matrix.cc:358
+#: port_matrix.cc:342 port_matrix.cc:368
 msgid "<b>Destinations</b>"
 msgstr "<b>MÃ¥l</b>"
 
-#: port_matrix.cc:440 port_matrix.cc:448
+#: port_matrix.cc:450 port_matrix.cc:458
 #, c-format
 msgid "Add %s %s"
 msgstr "Legg til %s %s"
 
-#: port_matrix.cc:456
+#: port_matrix.cc:466
 #, c-format
 msgid "Rename '%s'..."
 msgstr "Døyp om '%s'..."
 
-#: port_matrix.cc:472
+#: port_matrix.cc:482
 msgid "Remove all"
 msgstr "Fjern alt"
 
-#: port_matrix.cc:492 port_matrix.cc:504
+#: port_matrix.cc:502 port_matrix.cc:514
 #, c-format
 msgid "%s all"
 msgstr "%s alt"
 
-#: port_matrix.cc:527
+#: port_matrix.cc:537
 msgid "Rescan"
 msgstr "Oppdater"
 
-#: port_matrix.cc:529
+#: port_matrix.cc:539
 msgid "Show individual ports"
 msgstr "Vis individuelle portart"
 
-#: port_matrix.cc:535
+#: port_matrix.cc:545
 msgid "Flip"
 msgstr "Flipp"
 
-#: port_matrix.cc:722
-msgid ""
-"It is not possible to add a port here, as the first processor in the track "
-"or buss cannot support the new configuration."
+#: port_matrix.cc:732
+msgid "It is not possible to add a port here."
 msgstr ""
-"Du kan ikkje leggja til ein port her, fordi den fyrste signalprosessen på "
-"sporet eller bussen ikkje godtek det nye oppsettet."
 
-#: port_matrix.cc:725
+#: port_matrix.cc:733
 msgid "Cannot add port"
 msgstr "Kan ikkje leggja til port"
 
-#: port_matrix.cc:747
-msgid "Port removal not allowed"
-msgstr "Ikkje lov å fjerna portar"
+#: port_matrix.cc:757
+msgid "The last port cannot be removed"
+msgstr ""
 
-#: port_matrix.cc:748
-msgid ""
-"This port cannot be removed.\n"
-"Either the first plugin in the track or buss cannot accept\n"
-"the new number of inputs or the last plugin has more outputs."
+#: port_matrix.cc:760
+msgid "This port cannot be removed."
 msgstr ""
 
-#: port_matrix.cc:965
+#: port_matrix.cc:765
+msgid "Port removal not allowed"
+msgstr "Ikkje lov å fjerna portar"
+
+#: port_matrix.cc:981
 #, c-format
 msgid "Remove '%s'"
 msgstr "Fjern '%s'"
 
-#: port_matrix.cc:980
+#: port_matrix.cc:996
 #, c-format
 msgid "%s all from '%s'"
 msgstr "%s alt frå '%s'"
 
-#: port_matrix.cc:1046 transform_dialog.cc:62
+#: port_matrix.cc:1062 transform_dialog.cc:62
 msgid "channel"
 msgstr "kanal"
 
@@ -8573,59 +10157,70 @@ msgstr "Ingen portar å kopla til."
 msgid "There are no %1 ports to connect."
 msgstr "Ingen %1-portar å kopla til."
 
-#: processor_box.cc:150
-msgid "Send"
+#: processor_box.cc:226
+msgid "Return"
 msgstr ""
 
-#: processor_box.cc:152
-msgid "Return"
+#: processor_box.cc:323
+msgid "New Favorite Preset for \"%1\""
 msgstr ""
 
-#: processor_box.cc:310
+#: processor_box.cc:501
 msgid ""
 "\n"
 "This mono plugin has been replicated %1 times."
 msgstr ""
 
-#: processor_box.cc:314
+#: processor_box.cc:505 processor_box.cc:1527
 msgid ""
 "<b>%1</b>\n"
 "Double-click to show GUI.\n"
-"Alt+double-click to show generic GUI.%2"
+"%2+double-click to show generic GUI.%3"
 msgstr ""
 
-#: processor_box.cc:317
+#: processor_box.cc:508 processor_box.cc:1530
 msgid ""
 "<b>%1</b>\n"
 "Double-click to show generic GUI.%2"
 msgstr ""
 
-#: processor_box.cc:361
+#: processor_box.cc:514
+msgid ""
+"<b>%1</b>\n"
+"The Plugin is not available on this system\n"
+"and has been replaced by a stub."
+msgstr ""
+
+#: processor_box.cc:600
 #, c-format
 msgid "(%1x1) "
 msgstr ""
 
-#: processor_box.cc:437
+#: processor_box.cc:695
+msgid "Inline Display"
+msgstr ""
+
+#: processor_box.cc:703
 msgid "Show All Controls"
 msgstr "Vis alle kontrollar"
 
-#: processor_box.cc:441
+#: processor_box.cc:707
 msgid "Hide All Controls"
 msgstr "Gøym alle kontrollar"
 
-#: processor_box.cc:475
+#: processor_box.cc:752
 msgid "Link panner controls"
 msgstr ""
 
-#: processor_box.cc:575
+#: processor_box.cc:859
 msgid "on"
 msgstr "på"
 
-#: processor_box.cc:575 rc_option_editor.cc:2360 rc_option_editor.cc:2374
+#: processor_box.cc:859 rc_option_editor.cc:3178 rc_option_editor.cc:3192
 msgid "off"
 msgstr "av"
 
-#: processor_box.cc:957
+#: processor_box.cc:1817
 msgid ""
 "Right-click to add/remove/edit\n"
 "plugins,inserts,sends and more"
@@ -8633,15 +10228,22 @@ msgstr ""
 "Høgreklikk for å leggja til/fjerna/redigera\n"
 "utvidingar, innstikk, send og meir"
 
-#: processor_box.cc:1429 processor_box.cc:1804
+#: processor_box.cc:1966
+msgid ""
+"Processor Drag/Drop failed. Probably because\n"
+"the I/O configuration of the plugins could\n"
+"not match the configuration of this track."
+msgstr ""
+
+#: processor_box.cc:2443 processor_box.cc:2986
 msgid "Plugin Incompatibility"
 msgstr "Utvidinga samsvarar ikkje"
 
-#: processor_box.cc:1432
+#: processor_box.cc:2446
 msgid "You attempted to add the plugin \"%1\" in slot %2.\n"
 msgstr "Du prøvde å leggja til utvidinga \"%1\" i skuffen %2.\n"
 
-#: processor_box.cc:1438
+#: processor_box.cc:2452
 msgid ""
 "\n"
 "This plugin has:\n"
@@ -8649,19 +10251,19 @@ msgstr ""
 "\n"
 "Denne utvidinga har:\n"
 
-#: processor_box.cc:1441
+#: processor_box.cc:2455
 msgid "\t%1 MIDI input\n"
 msgid_plural "\t%1 MIDI inputs\n"
 msgstr[0] "\t%1 MIDI-inngang\n"
 msgstr[1] "\t%1 MIDI-inngangar\n"
 
-#: processor_box.cc:1445
+#: processor_box.cc:2459
 msgid "\t%1 audio input\n"
 msgid_plural "\t%1 audio inputs\n"
 msgstr[0] "\t%1 lydinngang\n"
 msgstr[1] "\t%1 lydinngangar\n"
 
-#: processor_box.cc:1448
+#: processor_box.cc:2462
 msgid ""
 "\n"
 "but at the insertion point, there are:\n"
@@ -8669,19 +10271,19 @@ msgstr ""
 "\n"
 "men på innsetingspunktet er det:\n"
 
-#: processor_box.cc:1451
+#: processor_box.cc:2465
 msgid "\t%1 MIDI channel\n"
 msgid_plural "\t%1 MIDI channels\n"
 msgstr[0] "\t%1 MIDI-kanal\n"
 msgstr[1] "\t%1 MIDI-kanalar\n"
 
-#: processor_box.cc:1455
+#: processor_box.cc:2469
 msgid "\t%1 audio channel\n"
 msgid_plural "\t%1 audio channels\n"
 msgstr[0] "\t%1 lydkanal\n"
 msgstr[1] "\t%1 lydkanalar\n"
 
-#: processor_box.cc:1458
+#: processor_box.cc:2472
 msgid ""
 "\n"
 "%1 is unable to insert this plugin here.\n"
@@ -8689,11 +10291,7 @@ msgstr ""
 "\n"
 "%1 greier ikkje setja inn utvidinga her.\n"
 
-#: processor_box.cc:1495
-msgid "Cannot set up new send: %1"
-msgstr "Greier ikkje setja opp ny send: %1"
-
-#: processor_box.cc:1807
+#: processor_box.cc:2989
 msgid ""
 "You cannot reorder these plugins/sends/inserts\n"
 "in that way because the inputs and\n"
@@ -8703,19 +10301,19 @@ msgstr ""
 "signal-omdirigeringar, fordi inn- og utgangane\n"
 "ikkje verkar skikkeleg då."
 
-#: processor_box.cc:1991
+#: processor_box.cc:3189
 msgid "Rename Processor"
 msgstr "Døyp om handsaming"
 
-#: processor_box.cc:2022
+#: processor_box.cc:3220
 msgid "At least 100 IO objects exist with a name like %1 - name not changed"
 msgstr "Det finst minst 100 IU-objekt med namn som %1 - namnet er ikkje endra"
 
-#: processor_box.cc:2159
+#: processor_box.cc:3371
 msgid "plugin insert constructor failed"
 msgstr "greidde ikkje laga instikkpunkt for utvidinga"
 
-#: processor_box.cc:2170
+#: processor_box.cc:3382
 msgid ""
 "Copying the set of processors on the clipboard failed,\n"
 "probably because the I/O configuration of the plugins\n"
@@ -8725,7 +10323,7 @@ msgstr ""
 "tavla, truleg fordi I/U-oppsettet for utvidingane\n"
 "ikkje passar med oppsettet for dette sporet."
 
-#: processor_box.cc:2216
+#: processor_box.cc:3428
 msgid ""
 "Do you really want to remove all processors from %1?\n"
 "(this cannot be undone)"
@@ -8733,15 +10331,15 @@ msgstr ""
 "Vil du verkeleg fjerna alle handsamingar frå %1?\n"
 "(Du kan ikkje angra)"
 
-#: processor_box.cc:2220 processor_box.cc:2245
+#: processor_box.cc:3432 processor_box.cc:3457
 msgid "Yes, remove them all"
 msgstr "Ja, slett alle"
 
-#: processor_box.cc:2222 processor_box.cc:2247
+#: processor_box.cc:3434 processor_box.cc:3459
 msgid "Remove processors"
 msgstr "Fjern handsamingar"
 
-#: processor_box.cc:2237
+#: processor_box.cc:3449
 msgid ""
 "Do you really want to remove all pre-fader processors from %1?\n"
 "(this cannot be undone)"
@@ -8749,7 +10347,7 @@ msgstr ""
 "Vil du verkeleg fjerna alle før-dempar-handsamingar frå %1?\n"
 "(Du kan ikkje angra)"
 
-#: processor_box.cc:2240
+#: processor_box.cc:3452
 msgid ""
 "Do you really want to remove all post-fader processors from %1?\n"
 "(this cannot be undone)"
@@ -8757,59 +10355,59 @@ msgstr ""
 "Vil du verkeleg fjerna alle før-dempar-handsamingar frå %1?\n"
 "(Du kan ikkje angra)"
 
-#: processor_box.cc:2428
+#: processor_box.cc:3641
 msgid "New Plugin"
 msgstr "Ny utviding"
 
-#: processor_box.cc:2431
+#: processor_box.cc:3644
 msgid "New Insert"
 msgstr "Nytt innstikk"
 
-#: processor_box.cc:2434
+#: processor_box.cc:3647
 msgid "New External Send ..."
 msgstr "Ny ekstern send..."
 
-#: processor_box.cc:2438
+#: processor_box.cc:3651
 msgid "New Aux Send ..."
 msgstr "Ny aux-send..."
 
-#: processor_box.cc:2441
+#: processor_box.cc:3654
 msgid "Send Options"
 msgstr ""
 
-#: processor_box.cc:2443
+#: processor_box.cc:3656
 msgid "Clear (all)"
 msgstr "Tøm (alt)"
 
-#: processor_box.cc:2445
+#: processor_box.cc:3658
 msgid "Clear (pre-fader)"
 msgstr "Fjern (før-dempar)"
 
-#: processor_box.cc:2447
+#: processor_box.cc:3660
 msgid "Clear (post-fader)"
 msgstr "Fjern (etter-dempar)"
 
-#: processor_box.cc:2473
+#: processor_box.cc:3690
 msgid "Activate All"
 msgstr "Slå på alle"
 
-#: processor_box.cc:2475
+#: processor_box.cc:3692
 msgid "Deactivate All"
 msgstr "Slå av alle"
 
-#: processor_box.cc:2477
+#: processor_box.cc:3694
 msgid "A/B Plugins"
 msgstr "A/B programutvidingar"
 
-#: processor_box.cc:2486
+#: processor_box.cc:3707
 msgid "Edit with generic controls..."
 msgstr ""
 
-#: processor_box.cc:2789
+#: processor_box.cc:4039
 msgid "%1: %2 (by %3)"
 msgstr "%1: %2 (av %3)"
 
-#: processor_box.cc:2791
+#: processor_box.cc:4041
 msgid "%1 (by %2)"
 msgstr ""
 
@@ -8837,346 +10435,444 @@ msgstr "Bank"
 msgid "main grid"
 msgstr "hovudgitter"
 
-#: quantize_dialog.cc:52 quantize_dialog.cc:109
+#: quantize_dialog.cc:61 quantize_dialog.cc:118
 msgid "Quantize"
 msgstr "Gitterfordel"
 
-#: quantize_dialog.cc:56
+#: quantize_dialog.cc:65
 msgid "Strength"
 msgstr "Styrke"
 
-#: quantize_dialog.cc:59
+#: quantize_dialog.cc:68
 msgid "Swing"
 msgstr "Swing"
 
-#: quantize_dialog.cc:62
+#: quantize_dialog.cc:71
 msgid "Threshold (ticks)"
 msgstr "Terskel (tikk)"
 
-#: quantize_dialog.cc:63
+#: quantize_dialog.cc:72
 msgid "Snap note start"
 msgstr "Fest notestarten"
 
-#: quantize_dialog.cc:64
+#: quantize_dialog.cc:73
 msgid "Snap note end"
 msgstr "Fest noteslutten"
 
-#: rc_option_editor.cc:77
-msgid "Click audio file:"
-msgstr "Klikk-lydfil:"
-
-#: rc_option_editor.cc:80 rc_option_editor.cc:87
+#: rc_option_editor.cc:83 rc_option_editor.cc:84 rc_option_editor.cc:1550
 msgid "Browse..."
 msgstr "Bla gjennom..."
 
-#: rc_option_editor.cc:84
+#: rc_option_editor.cc:89
+msgid "Emphasis on first beat:"
+msgstr ""
+
+#: rc_option_editor.cc:95
+msgid "Use default Click:"
+msgstr ""
+
+#: rc_option_editor.cc:101
+msgid "Click audio file:"
+msgstr "Klikk-lydfil:"
+
+#: rc_option_editor.cc:108
 msgid "Click emphasis audio file:"
 msgstr "Trykklegging-lydfil:"
 
-#: rc_option_editor.cc:116
+#: rc_option_editor.cc:154
 msgid "Choose Click"
 msgstr "Vel klikk"
 
-#: rc_option_editor.cc:139
+#: rc_option_editor.cc:177
 msgid "Choose Click Emphasis"
 msgstr "Vel trykklegging for klikk"
 
-#: rc_option_editor.cc:170
+#: rc_option_editor.cc:238
 msgid "Limit undo history to"
 msgstr "Øvre grense for angrelogg er"
 
-#: rc_option_editor.cc:171
+#: rc_option_editor.cc:239
 msgid "Save undo history of"
 msgstr "Lagra angreloggen for"
 
-#: rc_option_editor.cc:180 rc_option_editor.cc:187
+#: rc_option_editor.cc:248 rc_option_editor.cc:255
 msgid "commands"
 msgstr "kommandoar"
 
-#: rc_option_editor.cc:325
+#: rc_option_editor.cc:378
+msgid ""
+"\n"
+"Changes to this setting will only persist after your project has been saved."
+msgstr ""
+
+#: rc_option_editor.cc:389 rc_option_editor.cc:451
+msgid "<b>Recommended Setting: %1 + button 3 (right mouse button)</b>%2"
+msgstr ""
+
+#: rc_option_editor.cc:403
+msgid "Select Keyboard layout:"
+msgstr ""
+
+#: rc_option_editor.cc:422
+msgid "When Clicking:"
+msgstr ""
+
+#: rc_option_editor.cc:429
 msgid "Edit using:"
 msgstr "Rediger med:"
 
-#: rc_option_editor.cc:331 rc_option_editor.cc:357 rc_option_editor.cc:384
+#: rc_option_editor.cc:435 rc_option_editor.cc:465 rc_option_editor.cc:495
 msgid "+ button"
 msgstr "+ museknapp"
 
-#: rc_option_editor.cc:351
+#: rc_option_editor.cc:459
 msgid "Delete using:"
 msgstr "Slett med:"
 
-#: rc_option_editor.cc:378
+#: rc_option_editor.cc:481
+msgid "<b>Recommended Setting: %1 + button 1 (left mouse button)</b>%2"
+msgstr ""
+
+#: rc_option_editor.cc:489
 msgid "Insert note using:"
 msgstr "Set inn note med:"
 
-#: rc_option_editor.cc:405
+#: rc_option_editor.cc:507
+msgid "When Beginning a Drag:"
+msgstr ""
+
+#: rc_option_editor.cc:518 rc_option_editor.cc:545 rc_option_editor.cc:578
+#: rc_option_editor.cc:599 rc_option_editor.cc:643 rc_option_editor.cc:676
+#: rc_option_editor.cc:702 rc_option_editor.cc:730 rc_option_editor.cc:759
+#: rc_option_editor.cc:781
+msgid "<b>Recommended Setting: %1</b>%2"
+msgstr ""
+
+#: rc_option_editor.cc:532
+msgid "Copy items using:"
+msgstr ""
+
+#: rc_option_editor.cc:559
+msgid "Constrain drag using:"
+msgstr ""
+
+#: rc_option_editor.cc:567
+msgid "When Beginning a Trim:"
+msgstr ""
+
+#: rc_option_editor.cc:586
+msgid "Trim contents using:"
+msgstr ""
+
+#: rc_option_editor.cc:607
+msgid "Anchored trim using:"
+msgstr ""
+
+#: rc_option_editor.cc:651
+msgid "Resize notes relatively using:"
+msgstr ""
+
+#: rc_option_editor.cc:660
+msgid "While Dragging:"
+msgstr ""
+
+#: rc_option_editor.cc:684
 msgid "Ignore snap using:"
 msgstr "Sjå bort frå festing med:"
 
-#: rc_option_editor.cc:421
-msgid "Keyboard layout:"
-msgstr "Tastaturutforming:"
+#: rc_option_editor.cc:710
+msgid "Snap relatively using:"
+msgstr ""
 
-#: rc_option_editor.cc:544
-msgid "Font scaling:"
-msgstr "Skriftskalering:"
+#: rc_option_editor.cc:718
+msgid "While Trimming:"
+msgstr ""
 
-#: rc_option_editor.cc:547
-msgid "Default"
+#: rc_option_editor.cc:738
+msgid "Resize overlapped regions using:"
 msgstr ""
 
-#: rc_option_editor.cc:573
-msgid "Major font-scale changes require an application restart to re-layout."
+#: rc_option_editor.cc:746
+msgid "While Dragging Control Points:"
 msgstr ""
 
-#: rc_option_editor.cc:614
-msgid "Waveform Clip Level (dBFS):"
+#: rc_option_editor.cc:767
+msgid "Fine adjust using:"
 msgstr ""
 
-#: rc_option_editor.cc:666
-msgid "Playback (seconds of buffering):"
-msgstr "Avspeling (sekund bufring):"
+#: rc_option_editor.cc:789
+msgid "Push points using:"
+msgstr ""
 
-#: rc_option_editor.cc:679
-msgid "Recording (seconds of buffering):"
-msgstr "Opptak (sekund bufring):"
+#: rc_option_editor.cc:1029
+msgid "GUI and Font scaling:"
+msgstr ""
 
-#: rc_option_editor.cc:737
-msgid "Control Surface Protocol"
+#: rc_option_editor.cc:1032
+msgid "Default"
 msgstr ""
 
-#: rc_option_editor.cc:746
-msgid "Double-click on a name to edit settings for an enabled protocol"
+#: rc_option_editor.cc:1058
+msgid "Adjusting the scale requires an application restart to re-layout."
 msgstr ""
-"Dobbelklikk på eit namn for å redigera innstillingane for ein aktiv protokoll"
 
-#: rc_option_editor.cc:903
-msgid "Show Video Export Info before export"
+#: rc_option_editor.cc:1100
+msgid "∞"
 msgstr ""
 
-#: rc_option_editor.cc:904
-msgid "Show Video Server Startup Dialog"
+#: rc_option_editor.cc:1101
+msgid "30 sec"
 msgstr ""
 
-#: rc_option_editor.cc:905
-msgid "Advanced Setup (remote video server)"
+#: rc_option_editor.cc:1102
+msgid "1 min"
 msgstr ""
 
-#: rc_option_editor.cc:913
-msgid ""
-"<b>When enabled</b> you can speficify a custom video-server URL and docroot. "
-"- Do not enable this option unless you know what you are doing."
+#: rc_option_editor.cc:1103
+msgid "2 mins"
 msgstr ""
 
-#: rc_option_editor.cc:915
-msgid "Video Server URL:"
+#: rc_option_editor.cc:1104
+msgid "3 mins"
 msgstr ""
 
-#: rc_option_editor.cc:920
-msgid ""
-"Base URL of the video-server including http prefix. This is usually 'http://"
-"hostname.example.org:1554/' and defaults to 'http://localhost:1554/' when "
-"the video-server is running locally"
+#: rc_option_editor.cc:1105
+msgid "4 mins"
 msgstr ""
 
-#: rc_option_editor.cc:922
-msgid "Video Folder:"
+#: rc_option_editor.cc:1106
+msgid "5 mins"
 msgstr ""
 
-#: rc_option_editor.cc:927
+#: rc_option_editor.cc:1109
 msgid ""
-"Local path to the video-server document-root. Only files below this "
-"directory will be accessible by the video-server. If the server run on a "
-"remote host, it should point to a network mounted folder of the server's "
-"docroot or be left empty if it is unvailable. It is used for the local video-"
-"monitor and file-browsing when opening/adding a video file."
+"Specify the default timeout for plugin instantiation. Plugins that require "
+"more time to load will be blacklisted. A value of 0 disables the timeout."
 msgstr ""
 
-#: rc_option_editor.cc:934
-msgid ""
-"<b>When enabled</b> an information window with details is displayed before "
-"the video-export dialog."
+#: rc_option_editor.cc:1111
+msgid "Scan Time Out:"
 msgstr ""
 
-#: rc_option_editor.cc:939
-msgid ""
-"<b>When enabled</b> the video server is never launched automatically without "
-"confirmation"
+#: rc_option_editor.cc:1159
+msgid "Waveform Clip Level (dBFS):"
 msgstr ""
 
-#: rc_option_editor.cc:1022
-msgid "Always Display Plugin Scan Progress"
+#: rc_option_editor.cc:1212
+msgid "Small sessions (4-16 tracks)"
 msgstr ""
 
-#: rc_option_editor.cc:1023
-msgid "Scan for [new] VST Plugins on Application Start"
+#: rc_option_editor.cc:1213
+msgid "Medium sessions (16-64 tracks)"
 msgstr ""
 
-#: rc_option_editor.cc:1024
-msgid "Scan for AudioUnit Plugins on Application Start"
+#: rc_option_editor.cc:1214
+msgid "Large sessions (64+ tracks)"
 msgstr ""
 
-#: rc_option_editor.cc:1035
-msgid "General"
+#: rc_option_editor.cc:1215
+msgid "Custom (set by sliders below)"
 msgstr ""
 
-#: rc_option_editor.cc:1041
-msgid "Scan for Plugins"
+#: rc_option_editor.cc:1219 export_video_dialog.cc:167
+msgid "Preset:"
 msgstr ""
 
-#: rc_option_editor.cc:1048
-msgid ""
-"<b>When enabled</b> a popup window showing plugin scan progress is displayed "
-"for indexing (cache load) and discovery (detect new plugins)"
+#: rc_option_editor.cc:1231
+msgid "Playback (seconds of buffering):"
+msgstr "Avspeling (sekund bufring):"
+
+#: rc_option_editor.cc:1244
+msgid "Recording (seconds of buffering):"
+msgstr "Opptak (sekund bufring):"
+
+#: rc_option_editor.cc:1322
+msgid "programming error: unknown buffering preset string, index = %1"
+msgstr ""
+
+#: rc_option_editor.cc:1353
+msgid "Control Surface Protocol"
 msgstr ""
 
-#: rc_option_editor.cc:1055
+#: rc_option_editor.cc:1367
 msgid ""
-"Specify the default timeout for plugin instantiation in 1/10 seconds. "
-"Plugins that require more time to load will be blacklisted. A value of 0 "
-"disables the timeout."
+"Click to edit the settings for selected protocol ( it must be ENABLED "
+"first ):"
 msgstr ""
 
-#: rc_option_editor.cc:1057
-msgid "Scan Time Out [deciseconds]"
+#: rc_option_editor.cc:1371
+msgid "Show Protocol Settings"
 msgstr ""
 
-#: rc_option_editor.cc:1065
-msgid "VST"
+#: rc_option_editor.cc:1494
+msgid "Configuration"
 msgstr ""
 
-#: rc_option_editor.cc:1071
-msgid "Clear VST Cache"
+#: rc_option_editor.cc:1547
+msgid "Show Video Export Info before export"
+msgstr ""
+
+#: rc_option_editor.cc:1548
+msgid "Show Video Server Startup Dialog"
+msgstr ""
+
+#: rc_option_editor.cc:1549
+msgid "Advanced Setup (remote video server)"
 msgstr ""
 
-#: rc_option_editor.cc:1075
-msgid "Clear VST Blacklist"
+#: rc_option_editor.cc:1556
+msgid "Video Server"
 msgstr ""
 
-#: rc_option_editor.cc:1083
+#: rc_option_editor.cc:1565
 msgid ""
-"<b>When enabled</b> new VST plugins are searched, tested and added to the "
-"cache index on application start. When disabled new plugins will only be "
-"available after triggering a 'Scan' manually"
+"<b>When enabled</b> you can speficify a custom video-server URL and docroot. "
+"- Do not enable this option unless you know what you are doing."
 msgstr ""
 
-#: rc_option_editor.cc:1086
-msgid "Linux VST Path:"
+#: rc_option_editor.cc:1567
+msgid "Video Server URL:"
 msgstr ""
 
-#: rc_option_editor.cc:1093
-msgid "Windows VST Path:"
+#: rc_option_editor.cc:1572
+msgid ""
+"Base URL of the video-server including http prefix. This is usually 'http://"
+"hostname.example.org:1554/' and defaults to 'http://localhost:1554/' when "
+"the video-server is running locally"
 msgstr ""
 
-#: rc_option_editor.cc:1102
-msgid "Audio Unit"
+#: rc_option_editor.cc:1574
+msgid "Video Folder:"
 msgstr ""
 
-#: rc_option_editor.cc:1111
+#: rc_option_editor.cc:1579
 msgid ""
-"<b>When enabled</b> Audio Unit Plugins are discovered on application start. "
-"When disabled AU plugins will only be available after triggering a 'Scan' "
-"manually. The first successful scan will enable AU auto-scan, Any crash "
-"during plugin discovery will disable it."
+"Local path to the video-server document-root. Only files below this "
+"directory will be accessible by the video-server. If the server run on a "
+"remote host, it should point to a network mounted folder of the server's "
+"docroot or be left empty if it is unvailable. It is used for the local video-"
+"monitor and file-browsing when opening/adding a video file."
+msgstr ""
+
+#: rc_option_editor.cc:1584
+msgid ""
+"<b>When enabled</b> an information window with details is displayed before "
+"the video-export dialog."
+msgstr ""
+
+#: rc_option_editor.cc:1589
+msgid ""
+"<b>When enabled</b> the video server is never launched automatically without "
+"confirmation"
 msgstr ""
 
-#: rc_option_editor.cc:1114
-msgid "Clear AU Cache"
+#: rc_option_editor.cc:1598
+msgid "Custom Path to Video Monitor (%1) - leave empty for default:"
 msgstr ""
 
-#: rc_option_editor.cc:1118
-msgid "Clear AU Blacklist"
+#: rc_option_editor.cc:1610
+msgid ""
+"Set a custom path to the Video Monitor Executable, changing this requires a "
+"restart."
 msgstr ""
 
-#: rc_option_editor.cc:1201
-msgid "Set Windows VST Search Path"
+#: rc_option_editor.cc:1661
+msgid "Set Video Monitor Executable"
 msgstr ""
 
-#: rc_option_editor.cc:1216
-msgid "Set Linux VST Search Path"
+#: rc_option_editor.cc:1734
+msgid "Column %1"
 msgstr ""
 
-#: rc_option_editor.cc:1297
+#: rc_option_editor.cc:1852
 msgid "%1 Preferences"
 msgstr "Innstillingar for %1"
 
-#: rc_option_editor.cc:1309
+#: rc_option_editor.cc:1874
 msgid "DSP CPU Utilization"
 msgstr "DSP-prosessorbruk"
 
-#: rc_option_editor.cc:1313
+#: rc_option_editor.cc:1878
 msgid "Signal processing uses"
 msgstr "Signalhandsaminga brukar"
 
-#: rc_option_editor.cc:1318
+#: rc_option_editor.cc:1883
 msgid "all but one processor"
 msgstr "alt bortsett frå ei signalhandsaming"
 
-#: rc_option_editor.cc:1319
+#: rc_option_editor.cc:1884
 msgid "all available processors"
 msgstr "alle tilgjengelege signalhandsamingar"
 
-#: rc_option_editor.cc:1322
+#: rc_option_editor.cc:1887
 msgid "%1 processors"
 msgstr "%1 signalhandsamingar"
 
-#: rc_option_editor.cc:1325
+#: rc_option_editor.cc:1890
 msgid "This setting will only take effect when %1 is restarted."
 msgstr "Dette vil fyrst verka når du startar %s på nytt att."
 
-#: rc_option_editor.cc:1330
+#: rc_option_editor.cc:1895
 msgid "Options|Undo"
 msgstr "Val|Angra"
 
-#: rc_option_editor.cc:1337
+#: rc_option_editor.cc:1902
 msgid "Verify removal of last capture"
 msgstr "Stadfest når du vil fjerna siste opptak"
 
-#: rc_option_editor.cc:1345
-msgid "Make periodic backups of the session file"
-msgstr "Tryggingskopier økta med jamne mellomrom"
-
-#: rc_option_editor.cc:1350
+#: rc_option_editor.cc:1907
 msgid "Session Management"
 msgstr "Økthandtering"
 
-#: rc_option_editor.cc:1355
+#: rc_option_editor.cc:1912
+msgid "Make periodic backups of the session file"
+msgstr "Tryggingskopier økta med jamne mellomrom"
+
+#: rc_option_editor.cc:1920
 msgid "Always copy imported files"
 msgstr "Kopier alltid importerte filer"
 
-#: rc_option_editor.cc:1362
+#: rc_option_editor.cc:1927
 msgid "Default folder for new sessions:"
 msgstr "Standardmappe for nye økter:"
 
-#: rc_option_editor.cc:1370
+#: rc_option_editor.cc:1935
 msgid "Maximum number of recent sessions"
 msgstr "Største tal på samtidige økter"
 
-#: rc_option_editor.cc:1383
+#: rc_option_editor.cc:1941 rc_option_editor.cc:1943 rc_option_editor.cc:1945
+msgid "Misc/Click"
+msgstr ""
+
+#: rc_option_editor.cc:1948
 msgid "Click gain level"
 msgstr "Klikkvolum"
 
-#: rc_option_editor.cc:1388 route_time_axis.cc:266 route_time_axis.cc:821
+#: rc_option_editor.cc:1953 route_time_axis.cc:277 route_time_axis.cc:831
 msgid "Automation"
 msgstr "Automasjon"
 
-#: rc_option_editor.cc:1393
+#: rc_option_editor.cc:1958
 msgid "Thinning factor (larger value => less data)"
 msgstr "Tynningsfaktor (høgare verdi => mindre data)"
 
-#: rc_option_editor.cc:1402
+#: rc_option_editor.cc:1967
 msgid "Automation sampling interval (milliseconds)"
 msgstr "Tid mellom automasjonspunkt (i millisekund)"
 
-#: rc_option_editor.cc:1414
+#: rc_option_editor.cc:1975
+msgid "Transport Options"
+msgstr ""
+
+#: rc_option_editor.cc:1981
 msgid "Keep record-enable engaged on stop"
 msgstr "Hald opptaksstatusen på ved stopp"
 
-#: rc_option_editor.cc:1423
+#: rc_option_editor.cc:1990
 msgid "Play loop is a transport mode"
 msgstr ""
 
-#: rc_option_editor.cc:1428
+#: rc_option_editor.cc:1995
 msgid ""
 "<b>When enabled</b> the loop button does not start playback but forces "
 "playback to always play the loop\n"
@@ -9185,25 +10881,25 @@ msgid ""
 "cancels loop playback"
 msgstr ""
 
-#: rc_option_editor.cc:1434
+#: rc_option_editor.cc:2001
 msgid "Stop recording when an xrun occurs"
 msgstr "Stopp opptak ved xrun-hendingar"
 
-#: rc_option_editor.cc:1439
+#: rc_option_editor.cc:2006
 msgid ""
 "<b>When enabled</b> %1 will stop recording if an over- or underrun is "
 "detected by the audio engine"
 msgstr ""
 
-#: rc_option_editor.cc:1445
+#: rc_option_editor.cc:2012
 msgid "Create markers where xruns occur"
 msgstr "Lag markørar ved xrun-hendingar"
 
-#: rc_option_editor.cc:1454
+#: rc_option_editor.cc:2021
 msgid "Stop at the end of the session"
 msgstr "Stopp ved slutten av økta"
 
-#: rc_option_editor.cc:1459
+#: rc_option_editor.cc:2026
 msgid ""
 "<b>When enabled</b> if %1 is <b>not recording</b>, it will stop the "
 "transport when it reaches the current session end marker\n"
@@ -9212,11 +10908,11 @@ msgid ""
 "all times"
 msgstr ""
 
-#: rc_option_editor.cc:1467
+#: rc_option_editor.cc:2034
 msgid "Do seamless looping (not possible when slaved to MTC, LTC etc)"
 msgstr ""
 
-#: rc_option_editor.cc:1472
+#: rc_option_editor.cc:2039
 msgid ""
 "<b>When enabled</b> this will loop by reading ahead and wrapping around at "
 "the loop point, preventing any need to do a transport locate at the end of "
@@ -9226,11 +10922,11 @@ msgid ""
 "loop when %1 reaches the end which will often cause a small click or delay"
 msgstr ""
 
-#: rc_option_editor.cc:1480
+#: rc_option_editor.cc:2047
 msgid "Disable per-track record disarm while rolling"
 msgstr "Ikkje tillat å skru av opptaksstatusen per spor under avspeling"
 
-#: rc_option_editor.cc:1484
+#: rc_option_editor.cc:2051
 msgid ""
 "<b>When enabled</b> this will prevent you from accidentally stopping "
 "specific tracks recording during a take"
@@ -9238,11 +10934,11 @@ msgstr ""
 "<b>Når dette er på</b>, vil du ikkje kunna slå av opptak for bestemte spor "
 "ved eit uhell medan du tek opp"
 
-#: rc_option_editor.cc:1489
+#: rc_option_editor.cc:2056
 msgid "12dB gain reduction during fast-forward and fast-rewind"
 msgstr "12dB demping ved spoling"
 
-#: rc_option_editor.cc:1493
+#: rc_option_editor.cc:2060
 msgid ""
 "This will reduce the unpleasant increase in perceived volume that occurs "
 "when fast-forwarding or rewinding through some kinds of audio"
@@ -9250,19 +10946,63 @@ msgstr ""
 "Dette reduserer den ubehagelege auken i oppfatta volum som kjem når du "
 "spolar framover eller bakover gjennom nokre typar lyd"
 
-#: rc_option_editor.cc:1497
-msgid "Sync/Slave"
-msgstr "Synk/slave"
+#: rc_option_editor.cc:2066
+msgid "Preroll"
+msgstr ""
+
+#: rc_option_editor.cc:2071
+msgid ""
+"The amount of preroll (in seconds) to apply when <b>Play with Preroll</b> is "
+"initiated.\n"
+"\n"
+"If <b>Follow Edits</b> is enabled, the preroll is applied to the playhead "
+"position when a region is selected or trimmed."
+msgstr ""
+
+#: rc_option_editor.cc:2073
+msgid "0 (no pre-roll)"
+msgstr ""
+
+#: rc_option_editor.cc:2074
+msgid "0.1 second"
+msgstr ""
+
+#: rc_option_editor.cc:2075
+msgid "0.25 second"
+msgstr ""
+
+#: rc_option_editor.cc:2076
+msgid "0.5 second"
+msgstr ""
+
+#: rc_option_editor.cc:2077
+msgid "1.0 second"
+msgstr ""
+
+#: rc_option_editor.cc:2078
+msgid "2.0 seconds"
+msgstr ""
+
+#: rc_option_editor.cc:2081 rc_option_editor.cc:2090 rc_option_editor.cc:2106
+#: rc_option_editor.cc:2127 rc_option_editor.cc:2145 rc_option_editor.cc:2147
+#: rc_option_editor.cc:2164 rc_option_editor.cc:2167 rc_option_editor.cc:2169
+#: rc_option_editor.cc:2197
+msgid "Transport/Sync"
+msgstr ""
+
+#: rc_option_editor.cc:2081
+msgid "Synchronization and Slave Options"
+msgstr ""
 
-#: rc_option_editor.cc:1501
+#: rc_option_editor.cc:2085
 msgid "External timecode source"
 msgstr "Ekstern tidskodekjelde"
 
-#: rc_option_editor.cc:1510
+#: rc_option_editor.cc:2094
 msgid "Match session video frame rate to external timecode"
 msgstr "Tilpass raten for videorammene i denne økta til ekstern tidskode"
 
-#: rc_option_editor.cc:1516
+#: rc_option_editor.cc:2100
 msgid ""
 "This option controls the value of the video frame rate <i>while chasing</i> "
 "an external timecode source.\n"
@@ -9276,27 +11016,27 @@ msgid ""
 "external timecode standard and the session standard."
 msgstr ""
 
-#: rc_option_editor.cc:1526
-msgid "Sync lock timecode to clock - Disable drift compensation."
+#: rc_option_editor.cc:2110
+msgid "Sync-lock timecode to clock (disable drift compensation)"
 msgstr ""
 
-#: rc_option_editor.cc:1532
+#: rc_option_editor.cc:2116
 msgid ""
 "<b>When enabled</b> %1 will never varispeed when slaved to external "
 "timecode. Sync Lock indicates that the selected external timecode source "
 "shares clock-sync (Black & Burst, Wordclock, etc) with the audio "
 "interface. This option disables drift compensation. The transport speed is "
-"fixed at 1.0.Varispeed LTC will be ignored and cause drift.\n"
+"fixed at 1.0. Vari-speed LTC will be ignored and cause drift.\n"
 "\n"
 "<b>When disabled</b> %1 will compensate for potential drift, regardless if "
 "the timecode sources shares clock sync."
 msgstr ""
 
-#: rc_option_editor.cc:1547
+#: rc_option_editor.cc:2131
 msgid "Lock to 29.9700 fps instead of 30000/1001"
 msgstr "LÃ¥s til 29,9700 fps i staden for 30000/1001"
 
-#: rc_option_editor.cc:1553
+#: rc_option_editor.cc:2137
 msgid ""
 "<b>When enabled</b> the external timecode source is assumed to use 29.97 fps "
 "instead of 30000/1001.\n"
@@ -9309,37 +11049,37 @@ msgid ""
 "variant of using exactly 29.97 fps has zero timecode drift.\n"
 msgstr ""
 
-#: rc_option_editor.cc:1563
+#: rc_option_editor.cc:2147
 msgid "LTC Reader"
 msgstr "LTC-lesar"
 
-#: rc_option_editor.cc:1567
+#: rc_option_editor.cc:2151
 msgid "LTC incoming port"
 msgstr "Innkomande LTC-port"
 
-#: rc_option_editor.cc:1582
+#: rc_option_editor.cc:2167
 msgid "LTC Generator"
 msgstr "LTC-generator"
 
-#: rc_option_editor.cc:1587
+#: rc_option_editor.cc:2172
 msgid "Enable LTC generator"
 msgstr "Skru på LTC-generator"
 
-#: rc_option_editor.cc:1594
+#: rc_option_editor.cc:2179
 msgid "Send LTC while stopped"
 msgstr ""
 
-#: rc_option_editor.cc:1600
+#: rc_option_editor.cc:2185
 msgid ""
 "<b>When enabled</b> %1 will continue to send LTC information even when the "
 "transport (playhead) is not moving"
 msgstr ""
 
-#: rc_option_editor.cc:1606
+#: rc_option_editor.cc:2191
 msgid "LTC generator level"
 msgstr "LTC-generatornivå"
 
-#: rc_option_editor.cc:1610
+#: rc_option_editor.cc:2195
 msgid ""
 "Specify the Peak Volume of the generated LTC signal in dbFS. A good value "
 "is  0dBu ^= -18dbFS in an EBU calibrated system"
@@ -9347,627 +11087,894 @@ msgstr ""
 "Gjev toppvolumet til dei genererte LTC-signala i dbFS. Ein bra verdi er  "
 "0dBu ^= -18dbFS i eit EBU-kalibrert system"
 
-#: rc_option_editor.cc:1622
-msgid "Allow dragging of playhead"
-msgstr ""
-
-#: rc_option_editor.cc:1630
-msgid "Move relevant automation when audio regions are moved"
-msgstr "Flytt relevant automasjon saman med lydbolkane"
+#: rc_option_editor.cc:2204
+msgid "Make rubberband selection rectangle snap to the grid"
+msgstr "Få gummistrikkval-rektangelet til å festa til gitteret"
 
-#: rc_option_editor.cc:1638
-msgid "Show meters on tracks in the editor"
-msgstr "Vis mælarar på spor i redigeringa"
+#: rc_option_editor.cc:2211
+msgid "Name new markers"
+msgstr "Døyp nye markørar"
 
-#: rc_option_editor.cc:1646
-msgid "Display master-meter in the toolbar"
+#: rc_option_editor.cc:2216
+msgid ""
+"If enabled, popup a dialog when a new marker is created to allow its name to "
+"be set as it is created.\n"
+"\n"
+"You can always rename markers by right-clicking on them"
 msgstr ""
+"VIss dette er på, vil det koma eit oppsprettvindauga når du lagar ein "
+"markør, slik at du kan gje han namn medan du lagar han.\n"
+"\n"
+"Du kan alltid døypa om markørar ved å høgreklikka på dei."
 
-#: rc_option_editor.cc:1653
-msgid "Default fade shape"
+#: rc_option_editor.cc:2222
+msgid "Allow dragging of playhead"
 msgstr ""
 
-#: rc_option_editor.cc:1672
-msgid "Regions in active edit groups are edited together"
+#: rc_option_editor.cc:2230
+msgid "Display master-meter in the toolbar"
 msgstr ""
 
-#: rc_option_editor.cc:1673
-msgid "whenever they overlap in time"
+#: rc_option_editor.cc:2239
+msgid "Show zoom toolbar (if torn off)"
 msgstr ""
 
-#: rc_option_editor.cc:1674
-msgid "only if they have identical length, position and origin"
+#: rc_option_editor.cc:2247
+msgid ""
+"Always use mouse cursor position as zoom focus when zooming using mouse "
+"scroll wheel"
 msgstr ""
 
-#: rc_option_editor.cc:1684
-msgid "Make rubberband selection rectangle snap to the grid"
-msgstr "Få gummistrikkval-rektangelet til å festa til gitteret"
+#: rc_option_editor.cc:2256
+msgid "Update editor window during drags of the summary"
+msgstr "Oppdater redigeringsvindauga når du dreg samandraget"
 
-#: rc_option_editor.cc:1692
-msgid "Show waveforms in regions"
-msgstr "Vis bylgjeformer i bolkane"
+#: rc_option_editor.cc:2264
+msgid "Auto-scroll editor window when dragging near its edges"
+msgstr "Autorull redigeringsvindauga når du dreg nær kantane"
 
-#: rc_option_editor.cc:1700
+#: rc_option_editor.cc:2272
 msgid "Show gain envelopes in audio regions"
 msgstr "Vis lydomhylling i lydbolkane"
 
-#: rc_option_editor.cc:1701
+#: rc_option_editor.cc:2273
 msgid "in all modes"
 msgstr "i alle modi"
 
-#: rc_option_editor.cc:1702
-msgid "only in region gain mode"
-msgstr "berre i bolkvolum-modus"
-
-#: rc_option_editor.cc:1709
-msgid "Waveform scale"
-msgstr "Bylgjeskala"
-
-#: rc_option_editor.cc:1714
-msgid "linear"
-msgstr "rettlinja"
-
-#: rc_option_editor.cc:1715
-msgid "logarithmic"
-msgstr "logaritmisk"
-
-#: rc_option_editor.cc:1721
-msgid "Waveform shape"
-msgstr "Bylgjeform"
+#: rc_option_editor.cc:2274
+msgid "only in Draw and Internal Edit modes"
+msgstr ""
 
-#: rc_option_editor.cc:1726
-msgid "traditional"
-msgstr "tradisjonell"
+#: rc_option_editor.cc:2279
+msgid "Editor Behavior"
+msgstr ""
 
-#: rc_option_editor.cc:1727
-msgid "rectified"
-msgstr "innretta"
+#: rc_option_editor.cc:2284
+msgid "Move relevant automation when audio regions are moved"
+msgstr "Flytt relevant automasjon saman med lydbolkane"
 
-#: rc_option_editor.cc:1736
-msgid "Show waveforms for audio while it is being recorded"
-msgstr "Vis bylgjeformer ved opptak"
+#: rc_option_editor.cc:2291
+msgid "Default fade shape"
+msgstr ""
 
-#: rc_option_editor.cc:1744
-msgid "Show zoom toolbar"
-msgstr "Vis zoom-verktylina"
+#: rc_option_editor.cc:2310
+msgid "Regions in active edit groups are edited together"
+msgstr ""
 
-#: rc_option_editor.cc:1752
-msgid "Update editor window during drags of the summary"
-msgstr "Oppdater redigeringsvindauga når du dreg samandraget"
+#: rc_option_editor.cc:2311
+msgid "whenever they overlap in time"
+msgstr ""
 
-#: rc_option_editor.cc:1760
-msgid "Synchronise editor and mixer selection"
-msgstr "Samkøyr redigeringa og miksarvalet"
+#: rc_option_editor.cc:2312
+msgid "only if they have identical length, position and origin"
+msgstr ""
 
-#: rc_option_editor.cc:1767
-msgid "Name new markers"
-msgstr "Døyp nye markørar"
+#: rc_option_editor.cc:2321
+msgid "Layering model"
+msgstr ""
 
-#: rc_option_editor.cc:1773
-msgid ""
-"If enabled, popup a dialog when a new marker is created to allow its name to "
-"be set as it is created.\n"
-"\n"
-"You can always rename markers by right-clicking on them"
+#: rc_option_editor.cc:2326
+msgid "later is higher"
 msgstr ""
-"VIss dette er på, vil det koma eit oppsprettvindauga når du lagar ein "
-"markør, slik at du kan gje han namn medan du lagar han.\n"
-"\n"
-"Du kan alltid døypa om markørar ved å høgreklikka på dei."
 
-#: rc_option_editor.cc:1779
-msgid "Auto-scroll editor window when dragging near its edges"
-msgstr "Autorull redigeringsvindauga når du dreg nær kantane"
+#: rc_option_editor.cc:2327
+msgid "manual layering"
+msgstr ""
 
-#: rc_option_editor.cc:1786
+#: rc_option_editor.cc:2332
 msgid "After splitting selected regions, select"
 msgstr ""
 
-#: rc_option_editor.cc:1791
+#: rc_option_editor.cc:2337
 msgid "no regions"
 msgstr ""
 
-#: rc_option_editor.cc:1794
+#: rc_option_editor.cc:2340
 msgid "newly-created regions"
 msgstr ""
 
-#: rc_option_editor.cc:1798
+#: rc_option_editor.cc:2344
 msgid "existing selection and newly-created regions"
 msgstr ""
 
-#: rc_option_editor.cc:1805
+#: rc_option_editor.cc:2348 rc_option_editor.cc:2351 rc_option_editor.cc:2360
+#: rc_option_editor.cc:2378 rc_option_editor.cc:2390 rc_option_editor.cc:2392
+msgid "Editor/Waveforms"
+msgstr ""
+
+#: rc_option_editor.cc:2348
+msgid "Waveforms"
+msgstr ""
+
+#: rc_option_editor.cc:2354
+msgid "Show waveforms in regions"
+msgstr "Vis bylgjeformer i bolkane"
+
+#: rc_option_editor.cc:2363
+msgid "Show waveforms for audio while it is being recorded"
+msgstr "Vis bylgjeformer ved opptak"
+
+#: rc_option_editor.cc:2370
+msgid "Waveform scale"
+msgstr "Bylgjeskala"
+
+#: rc_option_editor.cc:2375
+msgid "linear"
+msgstr "rettlinja"
+
+#: rc_option_editor.cc:2376
+msgid "logarithmic"
+msgstr "logaritmisk"
+
+#: rc_option_editor.cc:2382
+msgid "Waveform shape"
+msgstr "Bylgjeform"
+
+#: rc_option_editor.cc:2387
+msgid "traditional"
+msgstr "tradisjonell"
+
+#: rc_option_editor.cc:2388
+msgid "rectified"
+msgstr "innretta"
+
+#: rc_option_editor.cc:2397
 msgid "Buffering"
 msgstr "Bufring"
 
-#: rc_option_editor.cc:1813
+#: rc_option_editor.cc:2405
 msgid "Record monitoring handled by"
 msgstr "Opptakslyttinga blir handtert av"
 
-#: rc_option_editor.cc:1819
+#: rc_option_editor.cc:2411
 msgid "via Audio Driver"
 msgstr ""
 
-#: rc_option_editor.cc:1825
+#: rc_option_editor.cc:2417
 msgid "audio hardware"
 msgstr "lydmaskinvare"
 
-#: rc_option_editor.cc:1832
+#: rc_option_editor.cc:2424
 msgid "Tape machine mode"
 msgstr "Bandopptakarmodus"
 
-#: rc_option_editor.cc:1837
+#: rc_option_editor.cc:2429
 msgid "Connection of tracks and busses"
 msgstr "Tilkopling av spor og bussar"
 
-#: rc_option_editor.cc:1842
+#: rc_option_editor.cc:2435
 msgid "Auto-connect master/monitor busses"
 msgstr "Kopla til master- og lyttebussane automatisk"
 
-#: rc_option_editor.cc:1849
+#: rc_option_editor.cc:2442
 msgid "Connect track inputs"
 msgstr "Kopla sporinngangane"
 
-#: rc_option_editor.cc:1854
+#: rc_option_editor.cc:2447
 msgid "automatically to physical inputs"
 msgstr "automatisk til fysiske inngangar"
 
-#: rc_option_editor.cc:1855 rc_option_editor.cc:1868
+#: rc_option_editor.cc:2448 rc_option_editor.cc:2461
 msgid "manually"
 msgstr "manuelt"
 
-#: rc_option_editor.cc:1861
+#: rc_option_editor.cc:2454
 msgid "Connect track and bus outputs"
 msgstr "Kopla til spor- og bussutgangar"
 
-#: rc_option_editor.cc:1866
+#: rc_option_editor.cc:2459
 msgid "automatically to physical outputs"
 msgstr "automatisk til fysiske inngangar"
 
-#: rc_option_editor.cc:1867
+#: rc_option_editor.cc:2460
 msgid "automatically to master bus"
 msgstr "automatisk til masterbussen"
 
-#: rc_option_editor.cc:1872
+#: rc_option_editor.cc:2467
+msgid "Use 'Strict-I/O' for new tracks or Busses"
+msgstr ""
+
+#: rc_option_editor.cc:2478
 msgid "Denormals"
 msgstr "Unormalar"
 
-#: rc_option_editor.cc:1877
+#: rc_option_editor.cc:2483
 msgid "Use DC bias to protect against denormals"
 msgstr "Bruk likestraumsbias for å verna mot unormalar"
 
-#: rc_option_editor.cc:1884
+#: rc_option_editor.cc:2490
 msgid "Processor handling"
 msgstr "Prosessorhandtering"
 
-#: rc_option_editor.cc:1890
+#: rc_option_editor.cc:2496
 msgid "no processor handling"
 msgstr "inga prosessorhandtering"
 
-#: rc_option_editor.cc:1896
+#: rc_option_editor.cc:2502
 msgid "use FlushToZero"
 msgstr "bruk SpylTilNull"
 
-#: rc_option_editor.cc:1903
+#: rc_option_editor.cc:2509
 msgid "use DenormalsAreZero"
 msgstr "bruk UnormalarErNull"
 
-#: rc_option_editor.cc:1910
+#: rc_option_editor.cc:2516
 msgid "use FlushToZero and DenormalsAreZero"
 msgstr "bruk SpylTilNull og UnormalarErNull"
 
-#: rc_option_editor.cc:1926
-msgid "Silence plugins when the transport is stopped"
-msgstr "Demp lyden frå utvidingar ved stopp"
-
-#: rc_option_editor.cc:1934
-msgid "Make new plugins active"
-msgstr "Gjer nye utvidingar aktive"
-
-#: rc_option_editor.cc:1944
+#: rc_option_editor.cc:2532
 msgid "Enable automatic analysis of audio"
 msgstr "Skru på automatisk analyse av lyd"
 
-#: rc_option_editor.cc:1952
+#: rc_option_editor.cc:2540
 msgid "Replicate missing region channels"
 msgstr "Kopier manglande bolk-kanalar"
 
-#: rc_option_editor.cc:1959 rc_option_editor.cc:1961 rc_option_editor.cc:1976
-#: rc_option_editor.cc:1988 rc_option_editor.cc:2000 rc_option_editor.cc:2012
-#: rc_option_editor.cc:2016 rc_option_editor.cc:2024 rc_option_editor.cc:2032
-#: rc_option_editor.cc:2040 rc_option_editor.cc:2042 rc_option_editor.cc:2050
-#: rc_option_editor.cc:2058 rc_option_editor.cc:2066 rc_option_editor.cc:2074
-#: rc_option_editor.cc:2076
-msgid "Solo / mute"
-msgstr "Solo / demp"
-
-#: rc_option_editor.cc:1964
-msgid "Solo-in-place mute cut (dB)"
-msgstr "Demping for solo-på-plass (dB)"
+#: rc_option_editor.cc:2547 rc_option_editor.cc:2556 rc_option_editor.cc:2558
+#: rc_option_editor.cc:2566 rc_option_editor.cc:2574 rc_option_editor.cc:2582
+#: rc_option_editor.cc:2600 rc_option_editor.cc:2612 rc_option_editor.cc:2624
+#: rc_option_editor.cc:2626 rc_option_editor.cc:2628 rc_option_editor.cc:2636
+#: rc_option_editor.cc:2644 rc_option_editor.cc:2652 rc_option_editor.cc:2662
+#: rc_option_editor.cc:2663
+msgid "Solo & mute"
+msgstr ""
 
-#: rc_option_editor.cc:1971
+#: rc_option_editor.cc:2551
 msgid "Solo controls are Listen controls"
 msgstr "Solo-kontrollar er lyttekontrollar"
 
-#: rc_option_editor.cc:1980
+#: rc_option_editor.cc:2561
+msgid "Exclusive solo"
+msgstr "Eksklusiv solo"
+
+#: rc_option_editor.cc:2569
+msgid "Show solo muting"
+msgstr "Vis solodemping"
+
+#: rc_option_editor.cc:2577
+msgid "Soloing overrides muting"
+msgstr "Solo overstyrer demping"
+
+#: rc_option_editor.cc:2585
+msgid "Solo-in-place mute cut (dB)"
+msgstr "Demping for solo-på-plass (dB)"
+
+#: rc_option_editor.cc:2592
 msgid "Listen Position"
 msgstr "Lytteposisjon"
 
-#: rc_option_editor.cc:1985
+#: rc_option_editor.cc:2597
 msgid "after-fader (AFL)"
 msgstr "etterlytting (AFL)"
 
-#: rc_option_editor.cc:1986
+#: rc_option_editor.cc:2598
 msgid "pre-fader (PFL)"
 msgstr "førlytting (PFL)"
 
-#: rc_option_editor.cc:1992
+#: rc_option_editor.cc:2604
 msgid "PFL signals come from"
 msgstr "Førlyttingssignal kjem frå "
 
-#: rc_option_editor.cc:1997
+#: rc_option_editor.cc:2609
 msgid "before pre-fader processors"
 msgstr "før før-volum-handsamingar"
 
-#: rc_option_editor.cc:1998
+#: rc_option_editor.cc:2610
 msgid "pre-fader but after pre-fader processors"
 msgstr "før-volum, men etter før-volum-signalhandsaming"
 
-#: rc_option_editor.cc:2004
+#: rc_option_editor.cc:2616
 msgid "AFL signals come from"
 msgstr "AFL-signal kjem frå "
 
-#: rc_option_editor.cc:2009
+#: rc_option_editor.cc:2621
 msgid "immediately post-fader"
 msgstr "rett etter volum"
 
-#: rc_option_editor.cc:2010
+#: rc_option_editor.cc:2622
 msgid "after post-fader processors (before pan)"
-msgstr "etter etter-volum-signalprosessar (før panorering)"
-
-#: rc_option_editor.cc:2019
-msgid "Exclusive solo"
-msgstr "Eksklusiv solo"
-
-#: rc_option_editor.cc:2027
-msgid "Show solo muting"
-msgstr "Vis solodemping"
-
-#: rc_option_editor.cc:2035
-msgid "Soloing overrides muting"
-msgstr "Solo overstyrer demping"
+msgstr "etter etter-volum-signalprosessar (før panorering)"
 
-#: rc_option_editor.cc:2040
+#: rc_option_editor.cc:2626
 msgid "Default track / bus muting options"
 msgstr "Standard spor- og bussdempeval"
 
-#: rc_option_editor.cc:2045
+#: rc_option_editor.cc:2631
 msgid "Mute affects pre-fader sends"
 msgstr "Demping verkar på send før volum"
 
-#: rc_option_editor.cc:2053
+#: rc_option_editor.cc:2639
 msgid "Mute affects post-fader sends"
 msgstr "Demping verkar på send etter volum"
 
-#: rc_option_editor.cc:2061
+#: rc_option_editor.cc:2647
 msgid "Mute affects control outputs"
 msgstr "Demping påverkar kontrollutgangane"
 
-#: rc_option_editor.cc:2069
+#: rc_option_editor.cc:2655
 msgid "Mute affects main outputs"
 msgstr "Demping verkar på hovudutgangar"
 
-#: rc_option_editor.cc:2074
+#: rc_option_editor.cc:2662
 msgid "Send Routing"
 msgstr ""
 
-#: rc_option_editor.cc:2079
+#: rc_option_editor.cc:2666
 msgid "Link panners of Aux and External Sends with main panner by default"
 msgstr ""
 
-#: rc_option_editor.cc:2087
+#: rc_option_editor.cc:2672
+msgid "MIDI Preferences"
+msgstr ""
+
+#: rc_option_editor.cc:2677
 msgid "MIDI read-ahead time (seconds)"
 msgstr ""
 
-#: rc_option_editor.cc:2105
+#: rc_option_editor.cc:2687
+msgid "Initial program change"
+msgstr "Tidleg programendring"
+
+#: rc_option_editor.cc:2696
+msgid "Display first MIDI bank/program as 0"
+msgstr "Vis fyrste MIDI-bank/program som 0"
+
+#: rc_option_editor.cc:2704
+msgid "Never display periodic MIDI messages (MTC, MIDI Clock)"
+msgstr "Aldri vis periodiske MIDI-meldingar (MTC, MIDI-klokke)"
+
+#: rc_option_editor.cc:2712
+msgid "Sound MIDI notes as they are selected in the editor"
+msgstr ""
+
+#: rc_option_editor.cc:2720
+msgid "Send MIDI control feedback"
+msgstr "Send MIDI-kontrollsvar"
+
+#: rc_option_editor.cc:2725 rc_option_editor.cc:2727 rc_option_editor.cc:2735
+#: rc_option_editor.cc:2737 rc_option_editor.cc:2745 rc_option_editor.cc:2754
+#: rc_option_editor.cc:2756 rc_option_editor.cc:2764 rc_option_editor.cc:2772
+#: rc_option_editor.cc:2781
+msgid "MIDI/Sync"
+msgstr ""
+
+#: rc_option_editor.cc:2725
+msgid "MIDI Clock"
+msgstr ""
+
+#: rc_option_editor.cc:2735
+msgid "MIDI Time Code (MTC)"
+msgstr ""
+
+#: rc_option_editor.cc:2740
 msgid "Send MIDI Time Code"
 msgstr "Send MIDI-tidskode"
 
-#: rc_option_editor.cc:2113
+#: rc_option_editor.cc:2748
 msgid "Percentage either side of normal transport speed to transmit MTC"
 msgstr "Prosentdel til kvar side av normal transportfart for å senda MTC"
 
-#: rc_option_editor.cc:2122
+#: rc_option_editor.cc:2754
+msgid "Midi Machine Control (MMC)"
+msgstr ""
+
+#: rc_option_editor.cc:2759
 msgid "Obey MIDI Machine Control commands"
 msgstr "Lyd MIDI-maskinkontrollkommandoar"
 
-#: rc_option_editor.cc:2130
+#: rc_option_editor.cc:2767
 msgid "Send MIDI Machine Control commands"
 msgstr "Send MIDI-maskinkontrollkommandoar"
 
-#: rc_option_editor.cc:2138
-msgid "Send MIDI control feedback"
-msgstr "Send MIDI-kontrollsvar"
-
-#: rc_option_editor.cc:2146
+#: rc_option_editor.cc:2775
 msgid "Inbound MMC device ID"
 msgstr "ID for innkomande MMC-eining"
 
-#: rc_option_editor.cc:2155
+#: rc_option_editor.cc:2784
 msgid "Outbound MMC device ID"
 msgstr "ID for utgåande MMC-eining"
 
-#: rc_option_editor.cc:2164
-msgid "Initial program change"
-msgstr "Tidleg programendring"
-
-#: rc_option_editor.cc:2173
-msgid "Display first MIDI bank/program as 0"
-msgstr "Vis fyrste MIDI-bank/program som 0"
-
-#: rc_option_editor.cc:2181
-msgid "Never display periodic MIDI messages (MTC, MIDI Clock)"
-msgstr "Aldri vis periodiske MIDI-meldingar (MTC, MIDI-klokke)"
-
-#: rc_option_editor.cc:2189
-msgid "Sound MIDI notes as they are selected"
-msgstr "Lytt på MIDI-notar medan du vel dei"
-
-#: rc_option_editor.cc:2194
+#: rc_option_editor.cc:2790
 msgid "Midi Audition"
 msgstr ""
 
-#: rc_option_editor.cc:2198
+#: rc_option_editor.cc:2794
 msgid "Midi Audition Synth (LV2)"
 msgstr ""
 
-#: rc_option_editor.cc:2229 rc_option_editor.cc:2239 rc_option_editor.cc:2241
+#: rc_option_editor.cc:2825 rc_option_editor.cc:2835 rc_option_editor.cc:2837
 msgid "User interaction"
 msgstr "Brukarsamhandling"
 
-#: rc_option_editor.cc:2232
+#: rc_option_editor.cc:2828
 msgid ""
 "Use translations of %1 messages\n"
 "   <i>(requires a restart of %1 to take effect)</i>\n"
 "   <i>(if available for your language preferences)</i>"
 msgstr ""
 
-#: rc_option_editor.cc:2239
+#: rc_option_editor.cc:2835
 msgid "Keyboard"
 msgstr "Tastatur"
 
-#: rc_option_editor.cc:2249
-msgid "Control surface remote ID"
-msgstr "Fjernstyrings-ID for kontrollflate"
+#: rc_option_editor.cc:2848 startup.cc:352
+msgid "Scan for Plugins"
+msgstr ""
+
+#: rc_option_editor.cc:2853
+msgid "General"
+msgstr ""
+
+#: rc_option_editor.cc:2858
+msgid "Always Display Plugin Scan Progress"
+msgstr ""
+
+#: rc_option_editor.cc:2864
+msgid ""
+"<b>When enabled</b> a popup window showing plugin scan progress is displayed "
+"for indexing (cache load) and discovery (detect new plugins)"
+msgstr ""
+
+#: rc_option_editor.cc:2869
+msgid "Silence plugins when the transport is stopped"
+msgstr "Demp lyden frå utvidingar ved stopp"
+
+#: rc_option_editor.cc:2875
+msgid ""
+"<b>When enabled</b> plugins will be reset at transport stop. When disabled "
+"plugins will be left unchanged at transport stop.\n"
+"\n"
+"This mostly affects plugins with a \"tail\" like Reverbs."
+msgstr ""
+
+#: rc_option_editor.cc:2879
+msgid "Make new plugins active"
+msgstr "Gjer nye utvidingar aktive"
+
+#: rc_option_editor.cc:2885
+msgid ""
+"<b>When enabled</b> plugins will be activated when they are added to tracks/"
+"busses. When disabled plugins will be left inactive when they are added to "
+"tracks/busses"
+msgstr ""
+
+#: rc_option_editor.cc:2888 rc_option_editor.cc:2896 rc_option_editor.cc:2908
+#: rc_option_editor.cc:2913 rc_option_editor.cc:2915 rc_option_editor.cc:2920
+#: rc_option_editor.cc:2927 rc_option_editor.cc:2932 rc_option_editor.cc:2941
+msgid "Plugins/VST"
+msgstr ""
+
+#: rc_option_editor.cc:2888
+msgid "VST"
+msgstr ""
+
+#: rc_option_editor.cc:2892
+msgid "Scan for [new] VST Plugins on Application Start"
+msgstr ""
+
+#: rc_option_editor.cc:2898
+msgid ""
+"<b>When enabled</b> new VST plugins are searched, tested and added to the "
+"cache index on application start. When disabled new plugins will only be "
+"available after triggering a 'Scan' manually"
+msgstr ""
+
+#: rc_option_editor.cc:2904
+msgid "Verbose Plugin Scan"
+msgstr ""
+
+#: rc_option_editor.cc:2910
+msgid ""
+"<b>When enabled</b> additional information for every plugin is added to the "
+"Log Window."
+msgstr ""
+
+#: rc_option_editor.cc:2918
+msgid "VST Cache:"
+msgstr ""
+
+#: rc_option_editor.cc:2923
+msgid "VST Blacklist:"
+msgstr ""
+
+#: rc_option_editor.cc:2930
+msgid "Linux VST Path:"
+msgstr ""
+
+#: rc_option_editor.cc:2935 rc_option_editor.cc:2948
+msgid "Path:"
+msgstr ""
+
+#: rc_option_editor.cc:2944
+msgid "Windows VST Path:"
+msgstr ""
+
+#: rc_option_editor.cc:2954 rc_option_editor.cc:2966 rc_option_editor.cc:2971
+msgid "Plugins/Audio Unit"
+msgstr ""
+
+#: rc_option_editor.cc:2954
+msgid "Audio Unit"
+msgstr ""
+
+#: rc_option_editor.cc:2958
+msgid "Scan for AudioUnit Plugins on Application Start"
+msgstr ""
+
+#: rc_option_editor.cc:2964
+msgid ""
+"<b>When enabled</b> Audio Unit Plugins are discovered on application start. "
+"When disabled AU plugins will only be available after triggering a 'Scan' "
+"manually. The first successful scan will enable AU auto-scan, Any crash "
+"during plugin discovery will disable it."
+msgstr ""
+
+#: rc_option_editor.cc:2969
+msgid "AU Cache:"
+msgstr ""
+
+#: rc_option_editor.cc:2974
+msgid "AU Blacklist:"
+msgstr ""
+
+#: rc_option_editor.cc:2978
+msgid "Plugin GUI"
+msgstr ""
+
+#: rc_option_editor.cc:2982
+msgid "Automatically open the plugin GUI when adding a new plugin"
+msgstr ""
+
+#: rc_option_editor.cc:2991
+msgid "Show Plugin Inline Display on Mixerstrip by default"
+msgstr ""
+
+#: rc_option_editor.cc:2998
+msgid ""
+"Don't automatically open the plugin GUI when the plugin has an inline "
+"display mode"
+msgstr ""
+
+#: rc_option_editor.cc:3005
+msgid "Instrument"
+msgstr ""
+
+#: rc_option_editor.cc:3009
+msgid "Ask to replace existing instrument plugin"
+msgstr ""
+
+#: rc_option_editor.cc:3017
+msgid "Interactively configure instrument plugins on insert"
+msgstr ""
+
+#: rc_option_editor.cc:3023
+msgid ""
+"<b>When enabled</b> show a dialog to select instrument channel configuration "
+"before adding a multichannel plugin."
+msgstr ""
 
-#: rc_option_editor.cc:2254
-msgid "assigned by user"
-msgstr "fastsett av brukaren"
+#: rc_option_editor.cc:3032
+msgid "Disable Graphics Hardware Acceleration (requires restart)"
+msgstr ""
 
-#: rc_option_editor.cc:2255
-msgid "follows order of mixer"
-msgstr "fylgjer miksaren"
+#: rc_option_editor.cc:3038
+msgid ""
+"Render large parts of the application user-interface in software, instead of "
+"using 2D-graphics acceleration.\n"
+"This requires restarting %1 before having an effect"
+msgstr ""
 
-#: rc_option_editor.cc:2269 rc_option_editor.cc:2278 rc_option_editor.cc:2287
-#: rc_option_editor.cc:2297 rc_option_editor.cc:2321 rc_option_editor.cc:2334
-#: rc_option_editor.cc:2343
+#: rc_option_editor.cc:3039 rc_option_editor.cc:3051 rc_option_editor.cc:3054
+#: rc_option_editor.cc:3062 rc_option_editor.cc:3070 rc_option_editor.cc:3078
+#: rc_option_editor.cc:3086 rc_option_editor.cc:3097 rc_option_editor.cc:3113
+#: rc_option_editor.cc:3129 rc_option_editor.cc:3144 rc_option_editor.cc:3153
+#: rc_option_editor.cc:3161
 msgid "Preferences|GUI"
 msgstr ""
 
-#: rc_option_editor.cc:2272
+#: rc_option_editor.cc:3045
+msgid "Possibly improve slow graphical performance (requires restart)"
+msgstr ""
+
+#: rc_option_editor.cc:3050
+msgid ""
+"Disables hardware gradient rendering on buggy video drivers (\"buggy "
+"gradients patch\").\n"
+"This requires restarting %1 before having an effect"
+msgstr ""
+
+#: rc_option_editor.cc:3057
+msgid "Use Window Manager/Desktop visibility information"
+msgstr ""
+
+#: rc_option_editor.cc:3065
 msgid "Graphically indicate mouse pointer hovering over various widgets"
 msgstr "Vis musepeikaren grafisk når han er over ulike småprogram"
 
-#: rc_option_editor.cc:2281
+#: rc_option_editor.cc:3073
 msgid "Show tooltips if mouse hovers over a control"
 msgstr "Vis verktøytips når peikaren er over ein kontroll"
 
-#: rc_option_editor.cc:2290
+#: rc_option_editor.cc:3081
 msgid "Use name highlight bars in region displays (requires a restart)"
 msgstr ""
 
-#: rc_option_editor.cc:2303
-msgid "update transport clock display at FPS instead of every 100ms"
+#: rc_option_editor.cc:3089
+msgid "Update transport clock display at FPS instead of every 100ms"
 msgstr ""
 
-#: rc_option_editor.cc:2312
+#: rc_option_editor.cc:3104
+msgid "Waveform image cache size (megabytes)"
+msgstr ""
+
+#: rc_option_editor.cc:3112
+msgid ""
+"Increasing the cache size uses more memory to store waveform images, which "
+"can improve graphical performance."
+msgstr ""
+
+#: rc_option_editor.cc:3120
 msgid "Lock timeout (seconds)"
 msgstr ""
 
-#: rc_option_editor.cc:2320
+#: rc_option_editor.cc:3128
 msgid "Lock GUI after this many idle seconds (zero to never lock)"
 msgstr ""
 
-#: rc_option_editor.cc:2336
+#: rc_option_editor.cc:3146
 msgid "Mixer Strip"
 msgstr "Miksarstripe"
 
-#: rc_option_editor.cc:2346
+#: rc_option_editor.cc:3156
 msgid "Use narrow strips in the mixer by default"
 msgstr "Bruk smale miksarstriper i miksaren som standard"
 
-#: rc_option_editor.cc:2351 rc_option_editor.cc:2365 rc_option_editor.cc:2384
-#: rc_option_editor.cc:2400 rc_option_editor.cc:2416 rc_option_editor.cc:2430
-#: rc_option_editor.cc:2444 rc_option_editor.cc:2446
+#: rc_option_editor.cc:3163
+msgid "Action Script Button Visibility"
+msgstr ""
+
+#: rc_option_editor.cc:3169 rc_option_editor.cc:3183 rc_option_editor.cc:3200
+#: rc_option_editor.cc:3216 rc_option_editor.cc:3232 rc_option_editor.cc:3246
+#: rc_option_editor.cc:3272 rc_option_editor.cc:3290 rc_option_editor.cc:3301
+#: rc_option_editor.cc:3308 rc_option_editor.cc:3310 rc_option_editor.cc:3318
+#: rc_option_editor.cc:3320 rc_option_editor.cc:3328 rc_option_editor.cc:3336
+#: rc_option_editor.cc:3338
 msgid "Preferences|Metering"
 msgstr ""
 
-#: rc_option_editor.cc:2355
+#: rc_option_editor.cc:3173
 msgid "Peak hold time"
 msgstr ""
 
-#: rc_option_editor.cc:2361
+#: rc_option_editor.cc:3179
 msgid "short"
 msgstr "kort"
 
-#: rc_option_editor.cc:2362
+#: rc_option_editor.cc:3180
 msgid "medium"
 msgstr "middels"
 
-#: rc_option_editor.cc:2363
+#: rc_option_editor.cc:3181
 msgid "long"
 msgstr "lenge"
 
-#: rc_option_editor.cc:2369
+#: rc_option_editor.cc:3187
 msgid "DPM fall-off"
 msgstr ""
 
-#: rc_option_editor.cc:2375
+#: rc_option_editor.cc:3193
 msgid "slowest [6.6dB/sec]"
 msgstr ""
 
-#: rc_option_editor.cc:2376
+#: rc_option_editor.cc:3194
 msgid "slow [8.6dB/sec] (BBC PPM, EBU PPM)"
 msgstr ""
 
-#: rc_option_editor.cc:2377
-msgid "slowish [12.0dB/sec] (DIN)"
-msgstr ""
-
-#: rc_option_editor.cc:2378
-msgid "moderate [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"
-msgstr ""
-
-#: rc_option_editor.cc:2379
-msgid "medium [20dB/sec]"
+#: rc_option_editor.cc:3195
+msgid "moderate [12.0dB/sec] (DIN)"
 msgstr ""
 
-#: rc_option_editor.cc:2380
-msgid "fast [32dB/sec]"
+#: rc_option_editor.cc:3196
+msgid "medium [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"
 msgstr ""
 
-#: rc_option_editor.cc:2381
-msgid "faster [46dB/sec]"
+#: rc_option_editor.cc:3197
+msgid "fast [20dB/sec]"
 msgstr ""
 
-#: rc_option_editor.cc:2382
-msgid "fastest [70dB/sec]"
+#: rc_option_editor.cc:3198
+msgid "very fast [32dB/sec]"
 msgstr ""
 
-#: rc_option_editor.cc:2388
+#: rc_option_editor.cc:3204
 msgid "Meter line-up level; 0dBu"
 msgstr ""
 
-#: rc_option_editor.cc:2393 rc_option_editor.cc:2409
+#: rc_option_editor.cc:3209 rc_option_editor.cc:3225
 msgid "-24dBFS (SMPTE US: 4dBu = -20dBFS)"
 msgstr ""
 
-#: rc_option_editor.cc:2394 rc_option_editor.cc:2410
+#: rc_option_editor.cc:3210 rc_option_editor.cc:3226
 msgid "-20dBFS (SMPTE RP.0155)"
 msgstr ""
 
-#: rc_option_editor.cc:2395 rc_option_editor.cc:2411
+#: rc_option_editor.cc:3211 rc_option_editor.cc:3227
 msgid "-18dBFS (EBU, BBC)"
 msgstr ""
 
-#: rc_option_editor.cc:2396 rc_option_editor.cc:2412
+#: rc_option_editor.cc:3212 rc_option_editor.cc:3228
 msgid "-15dBFS (DIN)"
 msgstr ""
 
-#: rc_option_editor.cc:2398
+#: rc_option_editor.cc:3214
 msgid ""
 "Configure meter-marks and color-knee point for dBFS scale DPM, set reference "
 "level for IEC1/Nordic, IEC2 PPM and VU meter."
 msgstr ""
 
-#: rc_option_editor.cc:2404
+#: rc_option_editor.cc:3220
 msgid "IEC1/DIN Meter line-up level; 0dBu"
 msgstr ""
 
-#: rc_option_editor.cc:2414
+#: rc_option_editor.cc:3230
 msgid "Reference level for IEC1/DIN meter."
 msgstr ""
 
-#: rc_option_editor.cc:2420
+#: rc_option_editor.cc:3236
 msgid "VU Meter standard"
 msgstr ""
 
-#: rc_option_editor.cc:2425
+#: rc_option_editor.cc:3241
 msgid "0VU = -2dBu (France)"
 msgstr ""
 
-#: rc_option_editor.cc:2426
+#: rc_option_editor.cc:3242
 msgid "0VU = 0dBu (North America, Australia)"
 msgstr ""
 
-#: rc_option_editor.cc:2427
+#: rc_option_editor.cc:3243
 msgid "0VU = +4dBu (standard)"
 msgstr ""
 
-#: rc_option_editor.cc:2428
+#: rc_option_editor.cc:3244
 msgid "0VU = +8dBu"
 msgstr ""
 
-#: rc_option_editor.cc:2434
+#: rc_option_editor.cc:3250
 msgid "Peak threshold [dBFS]"
 msgstr ""
 
-#: rc_option_editor.cc:2442
+#: rc_option_editor.cc:3259
+msgid "Default Meter Type for Master Bus"
+msgstr ""
+
+#: rc_option_editor.cc:3277
+msgid "Default Meter Type for Busses"
+msgstr ""
+
+#: rc_option_editor.cc:3294
+msgid "Default Meter Type for Tracks"
+msgstr ""
+
+#: rc_option_editor.cc:3306
 msgid ""
 "Specify the audio signal level in dbFS at and above which the meter-peak "
 "indicator will flash red."
 msgstr ""
 
-#: rc_option_editor.cc:2449
+#: rc_option_editor.cc:3313
 msgid "LED meter style"
 msgstr ""
 
-#: rc_option_editor.cc:2457
+#: rc_option_editor.cc:3318
+msgid "Editor Meters"
+msgstr ""
+
+#: rc_option_editor.cc:3323
+msgid "Show meters on tracks in the editor"
+msgstr "Vis mælarar på spor i redigeringa"
+
+#: rc_option_editor.cc:3331
+msgid "Show at most stereo meters in the track-header"
+msgstr ""
+
+#: rc_option_editor.cc:3336
+msgid "Post Export Analysis"
+msgstr ""
+
+#: rc_option_editor.cc:3341
+msgid "Save loudness analysis as image file"
+msgstr ""
+
+#: rc_option_editor.cc:3349
 msgid "Theme"
 msgstr ""
 
-#: region_editor.cc:79
+#: rc_option_editor.cc:3351
+msgid "Theme/Colors"
+msgstr ""
+
+#: rc_option_editor.cc:3429
+msgid "Set Linux VST Search Path"
+msgstr ""
+
+#: rc_option_editor.cc:3443
+msgid "Set Windows VST Search Path"
+msgstr ""
+
+#: region_editor.cc:81
 msgid "audition this region"
 msgstr "lytt på denne bolken"
 
-#: region_editor.cc:88 region_layering_order_editor.cc:75
+#: region_editor.cc:90 region_layering_order_editor.cc:75
 msgid "Position:"
 msgstr "Posisjon:"
 
-#: region_editor.cc:90 add_video_dialog.cc:155
+#: region_editor.cc:92 add_video_dialog.cc:155
 msgid "End:"
 msgstr "Slutt:"
 
-#: region_editor.cc:92 sfdb_ui.cc:145
+#: region_editor.cc:94 sfdb_ui.cc:145
 msgid "Length:"
 msgstr "Lengd:"
 
-#: region_editor.cc:94
+#: region_editor.cc:96
 msgid "Sync point (relative to region):"
 msgstr "Synkpunkt (relativt plassert til bolken):"
 
-#: region_editor.cc:96
+#: region_editor.cc:98
 msgid "Sync point (absolute):"
 msgstr "Synkpunkt (absolutt):"
 
-#: region_editor.cc:98
+#: region_editor.cc:100
 msgid "File start:"
 msgstr "Filstart:"
 
-#: region_editor.cc:102
+#: region_editor.cc:104
 msgid "Sources:"
 msgstr "Kjelder:"
 
-#: region_editor.cc:104
+#: region_editor.cc:106
 msgid "Source:"
 msgstr "Kjelde:"
 
-#: region_editor.cc:166
+#: region_editor.cc:168
 msgid "Region '%1'"
 msgstr "Bolk '%1'"
 
-#: region_editor.cc:273
+#: region_editor.cc:279
 msgid "change region start position"
 msgstr "endre bolkstartposisjon"
 
-#: region_editor.cc:289
+#: region_editor.cc:299
 msgid "change region end position"
 msgstr "endre boksluttposisjon"
 
-#: region_editor.cc:309
+#: region_editor.cc:322
 msgid "change region length"
 msgstr "endre bolklengd"
 
-#: region_editor.cc:403 region_editor.cc:415
+#: region_editor.cc:416 region_editor.cc:428
 msgid "change region sync point"
 msgstr "endre bolksynkposisjon"
 
@@ -9987,33 +11994,33 @@ msgstr "Spor:"
 msgid "Choose Top Region"
 msgstr "Vel toppbolk"
 
-#: region_view.cc:277
+#: region_view.cc:271
 msgid "SilenceText"
 msgstr "StilleTekst"
 
-#: region_view.cc:292 region_view.cc:311
+#: region_view.cc:286 region_view.cc:305
 msgid "minutes"
 msgstr "minutt"
 
-#: region_view.cc:295 region_view.cc:314
+#: region_view.cc:289 region_view.cc:308
 msgid "msecs"
 msgstr "msek"
 
-#: region_view.cc:298 region_view.cc:317
+#: region_view.cc:292 region_view.cc:311
 msgid "secs"
 msgstr "sek"
 
-#: region_view.cc:301
+#: region_view.cc:295
 msgid "%1 silent segment"
 msgid_plural "%1 silent segments"
 msgstr[0] "%1 stille segment"
 msgstr[1] "%1 stille segment"
 
-#: region_view.cc:303
+#: region_view.cc:297
 msgid "shortest = %1 %2"
 msgstr "stuttast = %1 %2"
 
-#: region_view.cc:320
+#: region_view.cc:314
 msgid ""
 "\n"
 "  (shortest audible segment = %1 %2)"
@@ -10061,55 +12068,63 @@ msgstr "Kullback-Liebler"
 msgid "Modified Kullback-Liebler"
 msgstr "Modifisert Kullback-Liebler"
 
-#: rhythm_ferret.cc:65
+#: rhythm_ferret.cc:62
+msgid "Spectral Flux"
+msgstr ""
+
+#: rhythm_ferret.cc:68
 msgid "Split region"
 msgstr "Del bolken"
 
-#: rhythm_ferret.cc:66
+#: rhythm_ferret.cc:70
 msgid "Snap regions"
 msgstr "Fest bolkar"
 
-#: rhythm_ferret.cc:67
+#: rhythm_ferret.cc:71
 msgid "Conform regions"
 msgstr "Einsrett bolkar"
 
-#: rhythm_ferret.cc:72
+#: rhythm_ferret.cc:77
 msgid "Rhythm Ferret"
 msgstr "Rytmefinnar"
 
-#: rhythm_ferret.cc:78
+#: rhythm_ferret.cc:83
 msgid "Analyze"
 msgstr "Analyser"
 
-#: rhythm_ferret.cc:113
+#: rhythm_ferret.cc:122
 msgid "Detection function"
 msgstr "Leitefunksjon"
 
-#: rhythm_ferret.cc:117
-msgid "Trigger gap"
-msgstr "Brytargap"
-
-#: rhythm_ferret.cc:122 strip_silence_dialog.cc:64
-msgid "Threshold"
-msgstr "Dørstokk"
+#: rhythm_ferret.cc:126
+msgid "Trigger gap (postproc)"
+msgstr ""
 
-#: rhythm_ferret.cc:127
+#: rhythm_ferret.cc:131
 msgid "Peak threshold"
 msgstr "Toppterskel"
 
-#: rhythm_ferret.cc:132
+#: rhythm_ferret.cc:135
 msgid "Silence threshold"
 msgstr "Stille-terskel (dB)"
 
-#: rhythm_ferret.cc:137
+#: rhythm_ferret.cc:141
+msgid "Min Inter-Onset Time"
+msgstr ""
+
+#: rhythm_ferret.cc:148
 msgid "Sensitivity"
 msgstr "Følsemd"
 
-#: rhythm_ferret.cc:141
+#: rhythm_ferret.cc:152
+msgid "Cut Pos Threshold"
+msgstr ""
+
+#: rhythm_ferret.cc:157
 msgid "Operation"
 msgstr "Handling"
 
-#: rhythm_ferret.cc:355
+#: rhythm_ferret.cc:382
 msgid "split regions (rhythm ferret)"
 msgstr "del opp bolkane (finn rytmar)"
 
@@ -10133,19 +12148,15 @@ msgstr "Skru på/av opptak"
 msgid "Active state"
 msgstr "Aktiv status"
 
-#: route_group_dialog.cc:53 route_group_dialog.cc:82 theme_manager.cc:90
-msgid "Color"
-msgstr "Farge"
-
-#: route_group_dialog.cc:59
+#: route_group_dialog.cc:58
 msgid "RouteGroupDialog"
 msgstr "Rutegruppedialog"
 
-#: route_group_dialog.cc:100
+#: route_group_dialog.cc:99
 msgid "<b>Sharing</b>"
 msgstr "<b>Deler</b>"
 
-#: route_group_dialog.cc:200
+#: route_group_dialog.cc:192
 msgid "The group name is not unique. Please use a different name."
 msgstr ""
 
@@ -10165,330 +12176,317 @@ msgstr "Utgangar"
 msgid "Plugins, Inserts & Sends"
 msgstr "Utvidingar, innstikk og send"
 
-#: route_params_ui.cc:209
+#: route_params_ui.cc:201
 msgid "route display list item for renamed route not found!"
 msgstr "fann ikkje rutevisingslisteobjekt for omdøypt rute!"
 
-#: route_params_ui.cc:279 route_params_ui.cc:307
+#: route_params_ui.cc:271 route_params_ui.cc:299
 #, c-format
 msgid "Playback delay: %<PRId64> samples"
 msgstr "Avspelingsseinking: %<PRId64> punkt"
 
-#: route_params_ui.cc:499
+#: route_params_ui.cc:491
 msgid "NO TRACK"
 msgstr "IKKJE NOKO SPOR"
 
-#: route_params_ui.cc:637 route_params_ui.cc:638
+#: route_params_ui.cc:515
+msgid "Add Track or Bus"
+msgstr "Legg til spor eller buss"
+
+#: route_params_ui.cc:627 route_params_ui.cc:628
 msgid "No Track or Bus Selected"
 msgstr "Ingen spor eller bussar valde"
 
-#: route_time_axis.cc:181
+#: route_time_axis.cc:104
+msgid "RTAV|G"
+msgstr ""
+
+#: route_time_axis.cc:105
+msgid "RTAV|P"
+msgstr ""
+
+#: route_time_axis.cc:106
+msgid "RTAV|A"
+msgstr ""
+
+#: route_time_axis.cc:194
 msgid "Record (Right-click for Step Edit)"
 msgstr "Ta opp (høgreklikk for stegredigering)"
 
-#: route_time_axis.cc:184
+#: route_time_axis.cc:197
 msgid "Record"
 msgstr "Ta opp"
 
-#: route_time_axis.cc:254
+#: route_time_axis.cc:265
 msgid "Route Group"
 msgstr "Rut gruppe"
 
-#: route_time_axis.cc:264
+#: route_time_axis.cc:275
 msgid "MIDI Controllers and Automation"
 msgstr "MIDI-kontrollar og -automasjon"
 
-#: route_time_axis.cc:495
+#: route_time_axis.cc:510
 msgid "Show All Automation"
 msgstr "Vis all automasjon"
 
-#: route_time_axis.cc:498
+#: route_time_axis.cc:513
 msgid "Show Existing Automation"
 msgstr "Vis gjeldande automasjon"
 
-#: route_time_axis.cc:501
+#: route_time_axis.cc:516
 msgid "Hide All Automation"
 msgstr "Gøym all automasjon"
 
-#: route_time_axis.cc:510
+#: route_time_axis.cc:525
 msgid "Processor automation"
 msgstr ""
 
-#: route_time_axis.cc:517
+#: route_time_axis.cc:532
 msgid "Fader"
 msgstr "Volum"
 
-#: route_time_axis.cc:535
+#: route_time_axis.cc:559
 msgid "Pan"
 msgstr "Panorering"
 
-#: route_time_axis.cc:626
+#: route_time_axis.cc:643
 msgid "Overlaid"
 msgstr "Overlagt"
 
-#: route_time_axis.cc:632
+#: route_time_axis.cc:649
 msgid "Stacked"
 msgstr "Stabla"
 
-#: route_time_axis.cc:640
+#: route_time_axis.cc:657
 msgid "Layers"
 msgstr "Lag"
 
-#: route_time_axis.cc:709
+#: route_time_axis.cc:721
 msgid "Automatic (based on I/O connections)"
 msgstr "Automatisk (basert på I/U-tilkoplingar)"
 
-#: route_time_axis.cc:718
+#: route_time_axis.cc:730
 msgid "(Currently: Existing Material)"
 msgstr "(No: eksisterande materiale)"
 
-#: route_time_axis.cc:721
+#: route_time_axis.cc:733
 msgid "(Currently: Capture Time)"
 msgstr "(No: opptakstidspunkt)"
 
-#: route_time_axis.cc:729
+#: route_time_axis.cc:741
 msgid "Align With Existing Material"
 msgstr "Juster til eksisterande materiale"
 
-#: route_time_axis.cc:734
+#: route_time_axis.cc:746
 msgid "Align With Capture Time"
 msgstr "Juster til innspelingstid"
 
-#: route_time_axis.cc:739
+#: route_time_axis.cc:751
 msgid "Alignment"
 msgstr "Justering"
 
-#: route_time_axis.cc:774
+#: route_time_axis.cc:786
 msgid "Normal Mode"
 msgstr "Normalmodus"
 
-#: route_time_axis.cc:780
+#: route_time_axis.cc:792
 msgid "Tape Mode"
 msgstr "Bandmodus"
 
-#: route_time_axis.cc:786
+#: route_time_axis.cc:798
 msgid "Non-Layered Mode"
 msgstr "Ikkje lagdelt modus"
 
-#: route_time_axis.cc:792
+#: route_time_axis.cc:804
 msgid "Record Mode"
 msgstr ""
 
-#: route_time_axis.cc:799 route_time_axis.cc:1789
+#: route_time_axis.cc:809 route_time_axis.cc:1795
 msgid "Playlist"
 msgstr "Speleliste"
 
-#: route_time_axis.cc:1097
+#: route_time_axis.cc:1107
 msgid "Rename Playlist"
 msgstr "Døyp om spelelista"
 
-#: route_time_axis.cc:1098
+#: route_time_axis.cc:1108
 msgid "New name for playlist:"
 msgstr "Nytt namn på spelelista:"
 
-#: route_time_axis.cc:1183
+#: route_time_axis.cc:1193
 msgid "New Copy Playlist"
 msgstr "Ny spelelistekopi"
 
-#: route_time_axis.cc:1184 route_time_axis.cc:1237
+#: route_time_axis.cc:1194 route_time_axis.cc:1247
 msgid "Name for new playlist:"
 msgstr "Namn på den nye spelelista:"
 
-#: route_time_axis.cc:1236
+#: route_time_axis.cc:1246
 msgid "New Playlist"
 msgstr "Ny speleliste"
 
-#: route_time_axis.cc:1436
-msgid "You cannot create a track with that name as it is reserved for %1"
+#: route_time_axis.cc:1441
+msgid "The name \"%1\" is reserved for %2"
 msgstr ""
-"Du kan ikkje laga eit spor med det namnet, fordi det er halde att for %1"
 
-#: route_time_axis.cc:1678
+#: route_time_axis.cc:1684
 msgid "New Copy..."
 msgstr "Ny kopi..."
 
-#: route_time_axis.cc:1682
+#: route_time_axis.cc:1688
 msgid "New Take"
 msgstr "Nytt tak"
 
-#: route_time_axis.cc:1683
+#: route_time_axis.cc:1689
 msgid "Copy Take"
 msgstr "Kopier tak"
 
-#: route_time_axis.cc:1688
+#: route_time_axis.cc:1694
 msgid "Clear Current"
 msgstr "Tøm gjeldande"
 
-#: route_time_axis.cc:1691
-msgid "Select From All..."
-msgstr "Vel frå alt..."
+#: route_time_axis.cc:1697
+msgid "Select from All..."
+msgstr ""
 
-#: route_time_axis.cc:1779
+#: route_time_axis.cc:1785
 msgid "Take: %1.%2"
 msgstr "Tak: %1.%2"
 
-#: route_time_axis.cc:2169 selection.cc:1007 selection.cc:1061
+#: route_time_axis.cc:2190 selection.cc:1042 selection.cc:1096
 msgid "programming error: "
 msgstr "programmeringsfeil: "
 
-#: route_time_axis.cc:2585
+#: route_time_axis.cc:2614
 msgid "Underlays"
 msgstr "Underlag"
 
-#: route_time_axis.cc:2588
+#: route_time_axis.cc:2617
 msgid "Remove \"%1\""
 msgstr "Fjern \"%1\""
 
-#: route_time_axis.cc:2638 route_time_axis.cc:2675
+#: route_time_axis.cc:2667 route_time_axis.cc:2704
 msgid "programming error: underlay reference pointer pairs are inconsistent!"
 msgstr ""
 "Programmeringsfeil: underlags-tilvisingspeikarpar er ikkje samanhengande!"
 
-#: route_time_axis.cc:2702
+#: route_time_axis.cc:2731 vca_master_strip.cc:203 vca_time_axis.cc:228
 msgid "After-fade listen (AFL)"
 msgstr "Etterlytting (AFL)"
 
-#: route_time_axis.cc:2706
+#: route_time_axis.cc:2735 vca_master_strip.cc:207 vca_time_axis.cc:232
 msgid "Pre-fade listen (PFL)"
 msgstr "Førlytting (PFL)"
 
-#: route_ui.cc:140
+#: route_ui.cc:165
 msgid "Mute this track"
 msgstr "Demp dette sporet"
 
-#: route_ui.cc:144
+#: route_ui.cc:169
 msgid "Mute other (non-soloed) tracks"
 msgstr "Demp alle andre (ikkje-solo) spor"
 
-#: route_ui.cc:150
+#: route_ui.cc:175
 msgid "Enable recording on this track"
 msgstr "Gjer klar til opptak på dette sporet"
 
-#: route_ui.cc:158
+#: route_ui.cc:183
 msgid "make mixer strips show sends to this bus"
 msgstr "få miksarstripene til å visa send for denne bussen"
 
-#: route_ui.cc:163
+#: route_ui.cc:188
 msgid "Monitor input"
 msgstr "Lytt på inngangen"
 
-#: route_ui.cc:169
+#: route_ui.cc:194
 msgid "Monitor playback"
 msgstr "Lytt på avspelinga"
 
-#: route_ui.cc:676
+#: route_ui.cc:706
 msgid "Not connected to AudioEngine - cannot engage record"
 msgstr ""
 
-#: route_ui.cc:875
+#: route_ui.cc:883
+msgid "Rec-Safe"
+msgstr ""
+
+#: route_ui.cc:888
 msgid "Step Entry"
 msgstr "Steginnskriving"
 
-#: route_ui.cc:948
+#: route_ui.cc:987
 msgid "Assign all tracks (prefader)"
 msgstr "Tildel alle spor (før volum)"
 
-#: route_ui.cc:952
+#: route_ui.cc:991
 msgid "Assign all tracks and buses (prefader)"
 msgstr "Tildel alle spor og bussar (førvolum)"
 
-#: route_ui.cc:956
+#: route_ui.cc:995
 msgid "Assign all tracks (postfader)"
 msgstr "Tildel alle spor (etter volum)"
 
-#: route_ui.cc:960
+#: route_ui.cc:999
 msgid "Assign all tracks and buses (postfader)"
 msgstr "Tildel alle spor og bussar (ettervolum)"
 
-#: route_ui.cc:964
+#: route_ui.cc:1003
 msgid "Assign selected tracks (prefader)"
 msgstr "Tildel dei valde spora (førvolum)"
 
-#: route_ui.cc:968
+#: route_ui.cc:1007
 msgid "Assign selected tracks and buses (prefader)"
 msgstr "Tildel dei valde spora og bussane (førvolum)"
 
-#: route_ui.cc:971
+#: route_ui.cc:1010
 msgid "Assign selected tracks (postfader)"
 msgstr "Tildel dei valde spora (ettervolum)"
 
-#: route_ui.cc:975
+#: route_ui.cc:1014
 msgid "Assign selected tracks and buses (postfader)"
 msgstr "Tildel dei valde spora og bussane (ettervolum)"
 
-#: route_ui.cc:978
+#: route_ui.cc:1017
 msgid "Copy track/bus gains to sends"
 msgstr "Kopier spor-/bussvolum til send"
 
-#: route_ui.cc:979
+#: route_ui.cc:1018
 msgid "Set sends gain to -inf"
 msgstr "Set sendvolum til -inf"
 
-#: route_ui.cc:980
+#: route_ui.cc:1019
 msgid "Set sends gain to 0dB"
 msgstr "Set sendvolum til 0dB"
 
-#: route_ui.cc:1300
+#: route_ui.cc:1357
 msgid "Solo Isolate"
 msgstr "Isoler solo"
 
-#: route_ui.cc:1307
+#: route_ui.cc:1364
 msgid "Solo Safe"
 msgstr "Solo-sikker"
 
-#: route_ui.cc:1329
+#: route_ui.cc:1386
 msgid "Pre Fader Sends"
 msgstr ""
 
-#: route_ui.cc:1335
+#: route_ui.cc:1392
 msgid "Post Fader Sends"
 msgstr ""
 
-#: route_ui.cc:1341
+#: route_ui.cc:1398
 msgid "Control Outs"
 msgstr "Kontrollutgangar"
 
-#: route_ui.cc:1347
+#: route_ui.cc:1404
 msgid "Main Outs"
 msgstr "Hovudutgangar"
 
-#: route_ui.cc:1479
+#: route_ui.cc:1571
 msgid "Color Selection"
 msgstr "Fargeval"
 
-#: route_ui.cc:1564
-msgid ""
-"Do you really want to remove track \"%1\" ?\n"
-"\n"
-"You may also lose the playlist used by this track.\n"
-"\n"
-"(This action cannot be undone, and the session file will be overwritten)"
-msgstr ""
-"Vil du verkeleg sletta sporet \"%1\"?\n"
-"\n"
-"Det kan hende du mistar spelelister for sporet òg.\n"
-"\n"
-"(Du kan ikkje angra dette, og øktfila vil bli overskriven)"
-
-#: route_ui.cc:1566
-msgid ""
-"Do you really want to remove bus \"%1\" ?\n"
-"\n"
-"(This action cannot be undone, and the session file will be overwritten)"
-msgstr ""
-"Vil du verkeleg sletta bussen \"%1\"?\n"
-"\n"
-"(Du kan ikkje angra, og øktfila vil bli overskriven!)"
-
-#: route_ui.cc:1574
-msgid "Remove track"
-msgstr "Fjern spor"
-
-#: route_ui.cc:1576
-msgid "Remove bus"
-msgstr "Fjern buss"
-
-#: route_ui.cc:1604
+#: route_ui.cc:1613
 msgid ""
 "The use of colons (':') is discouraged in track and bus names.\n"
 "Do you want to use this new name?"
@@ -10496,92 +12494,75 @@ msgstr ""
 "Me rår ikkje til at du bruker kolon (':') i namn på spor og bussar.\n"
 "Vil du bruka dette nye namnet?"
 
-#: route_ui.cc:1608
+#: route_ui.cc:1617
 msgid "Use the new name"
 msgstr "Bruk det nye namnet"
 
-#: route_ui.cc:1609
+#: route_ui.cc:1618
 msgid "Re-edit the name"
 msgstr "Endra namnet på nytt"
 
-#: route_ui.cc:1622
+#: route_ui.cc:1631
 msgid "Rename Track"
 msgstr "Døyp om spor"
 
-#: route_ui.cc:1624
+#: route_ui.cc:1633
 msgid "Rename Bus"
 msgstr "Døyp om bussen"
 
-#: route_ui.cc:1692
+#: route_ui.cc:1693
 msgid ": comment editor"
 msgstr ": rediger kommentarar"
 
-#: route_ui.cc:1858
+#: route_ui.cc:1848
 msgid " latency"
 msgstr "treigskap"
 
-#: route_ui.cc:1871
+#: route_ui.cc:1888
 msgid "Cannot create route template directory %1"
 msgstr "Greier ikkje laga malmappa for ruter  %1"
 
-#: route_ui.cc:1877
+#: route_ui.cc:1894
 msgid "Save As Template"
 msgstr "Lagra som mal"
 
-#: route_ui.cc:1878
+#: route_ui.cc:1895
 msgid "Template name:"
 msgstr "Namn på malen :"
 
-#: route_ui.cc:1959
-msgid "Remote Control ID"
-msgstr "Fjernstyrings-ID"
-
-#: route_ui.cc:1969
-msgid "Remote control ID:"
-msgstr "Fjernstyrings-ID:"
-
-#: route_ui.cc:1983
+#: route_ui.cc:2019
 msgid ""
-"The remote control ID of %1 is: %2\n"
-"\n"
-"\n"
-"The remote control ID of %3 cannot be changed."
+"Left-click to invert polarity of channel %1 of this track. Right-click to "
+"show menu."
+msgstr ""
+
+#: route_ui.cc:2021
+msgid "Click to show a menu of channels to invert polarity"
+msgstr ""
+
+#: save_as_dialog.cc:34
+msgid "Switch to newly-saved version"
 msgstr ""
-"Fjernkontroll-IDen for %1 er: %2\n"
-"\n"
-"\n"
-"Du kan ikkje endra fjernkontroll-IDen for %3."
 
-#: route_ui.cc:1987
-msgid "the master bus"
-msgstr "hovudbussen"
+#: save_as_dialog.cc:35
+msgid "Copy media to new session"
+msgstr ""
 
-#: route_ui.cc:1987
-msgid "the monitor bus"
-msgstr "lyttebussen"
+#: save_as_dialog.cc:36
+msgid "Copy external media into new session"
+msgstr ""
 
-#: route_ui.cc:1989
-msgid ""
-"The remote control ID of %5 is: %2\n"
-"\n"
-"\n"
-"Remote Control IDs are currently determined by track/bus ordering in %6.\n"
-"\n"
-"%3Use the User Interaction tab of the Preferences window if you want to "
-"change this%4"
+#: save_as_dialog.cc:37
+msgid "Newly-saved session should be empty"
 msgstr ""
 
-#: route_ui.cc:2046
-msgid ""
-"Left-click to invert (phase reverse) channel %1 of this track.  Right-click "
-"to show menu."
+#: save_as_dialog.cc:48
+msgid "Save as session name"
 msgstr ""
-"Venstreklikk for å fasevenda kanal %1 på dette sporet. Høgreklikk for å sjå "
-"menyen."
 
-#: route_ui.cc:2048
-msgid "Click to show a menu of channels for inversion (phase reverse)"
-msgstr "Klikk for å visa ein meny over kanalar å invertera (fasevenda)"
+#: save_as_dialog.cc:55
+msgid "Parent directory/folder"
+msgstr ""
 
 #: search_path_option.cc:35
 msgid "Select folder to search for media"
@@ -10595,126 +12576,158 @@ msgstr "Klikk for å leggja til ein ny stad"
 msgid "the session folder"
 msgstr "øktmappa"
 
+#: script_selector.cc:43
+msgid "<b>Type:</b>"
+msgstr ""
+
+#: script_selector.cc:49
+msgid "<b>Author:</b>"
+msgstr ""
+
+#: script_selector.cc:55
+msgid "<b>Description:</b>"
+msgstr ""
+
+#: script_selector.cc:131
+msgid "Select Script to unload"
+msgstr ""
+
+#: script_selector.cc:165
+msgid "<b>Name:</b>"
+msgstr ""
+
+#: script_selector.cc:172
+msgid "<b>Instance Parameters</b>"
+msgstr ""
+
 #: send_ui.cc:134
 msgid "Send "
 msgstr "Send"
 
-#: session_dialog.cc:61
+#: session_dialog.cc:71
 msgid "Session Setup"
 msgstr ""
 
-#: session_dialog.cc:66
+#: session_dialog.cc:76
 msgid "Advanced options ..."
 msgstr ""
 
-#: session_dialog.cc:263
-msgid "New Session"
-msgstr "Ny økt"
+#: session_dialog.cc:163 session_dialog.cc:397
+msgid "Recent Sessions"
+msgstr "Siste øktene"
 
-#: session_dialog.cc:301
-msgid "Check the website for more..."
+#: session_dialog.cc:311
+msgid "Sample Rate"
 msgstr ""
 
-#: session_dialog.cc:304
-msgid "Click to open the program website in your web browser"
+#: session_dialog.cc:312
+msgid "File Resolution"
 msgstr ""
 
-#: session_dialog.cc:324
-msgid "Sample Rate"
+#: session_dialog.cc:313
+msgid "Last Modified"
+msgstr ""
+
+#: session_dialog.cc:338
+msgid "New Session"
+msgstr "Ny økt"
+
+#: session_dialog.cc:379
+msgid "Check the website for more..."
 msgstr ""
 
-#: session_dialog.cc:325
-msgid "Disk Format"
+#: session_dialog.cc:382
+msgid "Click to open the program website in your web browser"
 msgstr ""
 
-#: session_dialog.cc:343
+#: session_dialog.cc:404
 msgid "Select session file"
 msgstr "Vel øktfil"
 
-#: session_dialog.cc:358
+#: session_dialog.cc:417
 msgid "Other Sessions"
 msgstr ""
 
-#: session_dialog.cc:384
+#: session_dialog.cc:424
+msgid "Safe Mode: Disable all Plugins"
+msgstr ""
+
+#: session_dialog.cc:454
 msgid "Open"
 msgstr "Opna"
 
-#: session_dialog.cc:451
+#: session_dialog.cc:521
 msgid "Session name:"
 msgstr "Namn på økta:"
 
-#: session_dialog.cc:473
+#: session_dialog.cc:543
 msgid "Create session folder in:"
 msgstr "Lag øktmappa i :"
 
-#: session_dialog.cc:496
+#: session_dialog.cc:564
 msgid "Select folder for session"
 msgstr "Vel mappe for økta"
 
-#: session_dialog.cc:525
+#: session_dialog.cc:591
 msgid "Use this template"
 msgstr "Bruk denne malen"
 
-#: session_dialog.cc:528
+#: session_dialog.cc:594
 msgid "no template"
 msgstr "ingen mal"
 
-#: session_dialog.cc:663 session_dialog.cc:699
-msgid "32 bit float"
+#: session_dialog.cc:746 session_dialog.cc:793
+msgid "32-bit float"
 msgstr ""
 
-#: session_dialog.cc:666 session_dialog.cc:702
-msgid "24 bit"
+#: session_dialog.cc:749 session_dialog.cc:796
+msgid "24-bit"
 msgstr ""
 
-#: session_dialog.cc:669 session_dialog.cc:705
-msgid "16 bit"
+#: session_dialog.cc:752 session_dialog.cc:799
+msgid "16-bit"
 msgstr ""
 
-#: session_dialog.cc:747 session_dialog.cc:748 session_dialog.cc:749
+#: session_dialog.cc:877 session_dialog.cc:878 session_dialog.cc:879
 msgid "channels"
 msgstr "kanalar"
 
-#: session_dialog.cc:763
+#: session_dialog.cc:893
 msgid "<b>Busses</b>"
 msgstr "<b>Bussar</b>"
 
-#: session_dialog.cc:764
+#: session_dialog.cc:894
 msgid "<b>Inputs</b>"
 msgstr "<b>Ingangar</b>"
 
-#: session_dialog.cc:765
+#: session_dialog.cc:895
 msgid "<b>Outputs</b>"
 msgstr "<b>Utgangar</b>"
 
-#: session_dialog.cc:773
+#: session_dialog.cc:903
 msgid "Create master bus"
 msgstr "Lag hovudbuss"
 
-#: session_dialog.cc:783
+#: session_dialog.cc:913
 msgid "Automatically connect to physical inputs"
 msgstr "Kopla automatisk til fysiske inngangar"
 
-#: session_dialog.cc:790 session_dialog.cc:849
+#: session_dialog.cc:920 session_dialog.cc:979
 msgid "Use only"
 msgstr "Bruk berre"
 
-#: session_dialog.cc:843
+#: session_dialog.cc:973
 msgid "Automatically connect outputs"
 msgstr "Kopla utgangane automatisk"
 
-#: session_dialog.cc:865
+#: session_dialog.cc:995
 msgid "... to master bus"
 msgstr "... til hovudbussen"
 
-#: session_dialog.cc:875
+#: session_dialog.cc:1005
 msgid "... to physical outputs"
 msgstr "... til fysiske utgangar"
 
-#: session_import_dialog.cc:65
-msgid "Import from Session"
-msgstr "Importer frå økt"
-
 #: session_import_dialog.cc:74
 msgid "Elements"
 msgstr "Element"
@@ -10735,191 +12748,191 @@ msgstr "Importer frå økt"
 msgid "This will select all elements of this type!"
 msgstr "Du vel alle element av dette slaget!"
 
-#: session_metadata_dialog.cc:285
+#: session_metadata_dialog.cc:288
 msgid "EAN Check digit OK"
 msgstr ""
 
-#: session_metadata_dialog.cc:289
+#: session_metadata_dialog.cc:292
 msgid "EAN Check digit error"
 msgstr ""
 
-#: session_metadata_dialog.cc:289
+#: session_metadata_dialog.cc:292
 msgid "expected"
 msgstr ""
 
-#: session_metadata_dialog.cc:294
+#: session_metadata_dialog.cc:297
 msgid "EAN Length error"
 msgstr ""
 
-#: session_metadata_dialog.cc:423
+#: session_metadata_dialog.cc:426
 msgid "Field"
 msgstr "Felt"
 
-#: session_metadata_dialog.cc:427
+#: session_metadata_dialog.cc:430
 msgid "Values (current value on top)"
 msgstr "Verdiar (noverande på toppen)"
 
-#: session_metadata_dialog.cc:641
+#: session_metadata_dialog.cc:644
 msgid "User"
 msgstr "Brukar"
 
-#: session_metadata_dialog.cc:649
+#: session_metadata_dialog.cc:652
 msgid "Email"
 msgstr "Epost"
 
-#: session_metadata_dialog.cc:652
+#: session_metadata_dialog.cc:655
 msgid "Web"
 msgstr "Nett"
 
-#: session_metadata_dialog.cc:655
+#: session_metadata_dialog.cc:658
 msgid "Organization"
 msgstr "Organisasjon"
 
-#: session_metadata_dialog.cc:658
+#: session_metadata_dialog.cc:661
 msgid "Country"
 msgstr "Land"
 
-#: session_metadata_dialog.cc:672
+#: session_metadata_dialog.cc:675
 msgid "Title"
 msgstr "Tittel"
 
-#: session_metadata_dialog.cc:675
+#: session_metadata_dialog.cc:678
 msgid "Track Number"
 msgstr "Spor nummer"
 
-#: session_metadata_dialog.cc:678
+#: session_metadata_dialog.cc:681
 msgid "Subtitle"
 msgstr "Undertittel"
 
-#: session_metadata_dialog.cc:681
+#: session_metadata_dialog.cc:684
 msgid "Grouping"
 msgstr "Gruppering"
 
-#: session_metadata_dialog.cc:684
+#: session_metadata_dialog.cc:687
 msgid "Artist"
 msgstr "Artist"
 
-#: session_metadata_dialog.cc:687
+#: session_metadata_dialog.cc:690
 msgid "Genre"
 msgstr "Sjanger"
 
-#: session_metadata_dialog.cc:690
+#: session_metadata_dialog.cc:693
 msgid "Comment"
 msgstr "Kommentar"
 
-#: session_metadata_dialog.cc:693
+#: session_metadata_dialog.cc:696
 msgid "Copyright"
 msgstr "Copyright"
 
-#: session_metadata_dialog.cc:701 session_metadata_dialog.cc:706
+#: session_metadata_dialog.cc:704 session_metadata_dialog.cc:709
 msgid "Album"
 msgstr "Album"
 
-#: session_metadata_dialog.cc:709
+#: session_metadata_dialog.cc:712
 msgid "Year"
 msgstr "Ã…r"
 
-#: session_metadata_dialog.cc:712
+#: session_metadata_dialog.cc:715
 msgid "Album Artist"
 msgstr "Albumartist"
 
-#: session_metadata_dialog.cc:715
+#: session_metadata_dialog.cc:718
 msgid "Total Tracks"
 msgstr "Spor i alt"
 
-#: session_metadata_dialog.cc:718
+#: session_metadata_dialog.cc:721
 msgid "Disc Subtitle"
 msgstr "Undertittel på plata"
 
-#: session_metadata_dialog.cc:721
+#: session_metadata_dialog.cc:724
 msgid "Disc Number"
 msgstr "Platenummer"
 
-#: session_metadata_dialog.cc:724
+#: session_metadata_dialog.cc:727
 msgid "Total Discs"
 msgstr "Plater totalt"
 
-#: session_metadata_dialog.cc:727
+#: session_metadata_dialog.cc:730
 msgid "Compilation"
 msgstr "Samling"
 
-#: session_metadata_dialog.cc:730
+#: session_metadata_dialog.cc:733
 msgid "ISRC"
 msgstr "ISRC"
 
-#: session_metadata_dialog.cc:733
+#: session_metadata_dialog.cc:736
 msgid "EAN barcode"
 msgstr ""
 
-#: session_metadata_dialog.cc:746
+#: session_metadata_dialog.cc:749
 msgid "People"
 msgstr "Folk"
 
-#: session_metadata_dialog.cc:751
+#: session_metadata_dialog.cc:754
 msgid "Lyricist"
 msgstr "Tekstforfattar"
 
-#: session_metadata_dialog.cc:754
+#: session_metadata_dialog.cc:757
 msgid "Composer"
 msgstr "Komponist"
 
-#: session_metadata_dialog.cc:757
+#: session_metadata_dialog.cc:760
 msgid "Conductor"
 msgstr "Dirigent"
 
-#: session_metadata_dialog.cc:760
+#: session_metadata_dialog.cc:763
 msgid "Remixer"
 msgstr "Remiksar"
 
-#: session_metadata_dialog.cc:763
+#: session_metadata_dialog.cc:766
 msgid "Arranger"
 msgstr "Arrangør"
 
-#: session_metadata_dialog.cc:766
+#: session_metadata_dialog.cc:769
 msgid "Engineer"
 msgstr "Teknikar"
 
-#: session_metadata_dialog.cc:769
+#: session_metadata_dialog.cc:772
 msgid "Producer"
 msgstr "Produsent"
 
-#: session_metadata_dialog.cc:772
+#: session_metadata_dialog.cc:775
 msgid "DJ Mixer"
 msgstr "DJ-miksar"
 
-#: session_metadata_dialog.cc:775
+#: session_metadata_dialog.cc:778
 msgid "Metadata|Mixer"
 msgstr "Metadata|Miksar"
 
-#: session_metadata_dialog.cc:783
+#: session_metadata_dialog.cc:786
 msgid "School"
 msgstr "Skule"
 
-#: session_metadata_dialog.cc:788
+#: session_metadata_dialog.cc:791
 msgid "Instructor"
 msgstr "Dirigent"
 
-#: session_metadata_dialog.cc:791
+#: session_metadata_dialog.cc:794
 msgid "Course"
 msgstr "Kurs/linje"
 
-#: session_metadata_dialog.cc:799
+#: session_metadata_dialog.cc:802
 msgid "Edit Session Metadata"
 msgstr "Endra metadata for økta"
 
-#: session_metadata_dialog.cc:830
+#: session_metadata_dialog.cc:833
 msgid "Import session metadata"
 msgstr "Importer økt-metadata"
 
-#: session_metadata_dialog.cc:851
+#: session_metadata_dialog.cc:854
 msgid "Choose session to import metadata from"
 msgstr "Vel økt å importera metadata frå"
 
-#: session_metadata_dialog.cc:889
+#: session_metadata_dialog.cc:892
 msgid "This session file could not be read!"
 msgstr "Greidde ikkje lesa denne øktfila!"
 
-#: session_metadata_dialog.cc:899
+#: session_metadata_dialog.cc:902
 msgid ""
 "The session file didn't contain metadata!\n"
 "Maybe this is an old session format?"
@@ -10927,7 +12940,7 @@ msgstr ""
 "Denne øktfila inneheld ikkje metadata!\n"
 "Kan henda ho er i eit gamalt øktformat?"
 
-#: session_metadata_dialog.cc:918
+#: session_metadata_dialog.cc:921
 msgid "Import all from:"
 msgstr "Importer alt frå:"
 
@@ -11077,164 +13090,185 @@ msgid "Destructive crossfade length"
 msgstr "Destruktiv overtoningslengd"
 
 #: session_option_editor.cc:146
+msgid "Declick when transport starts and stops"
+msgstr ""
+
+#: session_option_editor.cc:153
+msgid "Declick when monitor state changes"
+msgstr ""
+
+#: session_option_editor.cc:160
 msgid "Region fades active"
 msgstr "Bolktoningar på"
 
-#: session_option_editor.cc:153
+#: session_option_editor.cc:167
 msgid "Region fades visible"
 msgstr "Bolktoningane er synlege"
 
-#: session_option_editor.cc:160 session_option_editor.cc:173
-#: session_option_editor.cc:187
+#: session_option_editor.cc:174 session_option_editor.cc:187
+#: session_option_editor.cc:208
 msgid "Media"
 msgstr "Media"
 
-#: session_option_editor.cc:160
+#: session_option_editor.cc:174
 msgid "Audio file format"
 msgstr "Lydfilformat"
 
-#: session_option_editor.cc:164
+#: session_option_editor.cc:178
 msgid "Sample format"
 msgstr "Punktformat"
 
-#: session_option_editor.cc:169
+#: session_option_editor.cc:183
 msgid "32-bit floating point"
 msgstr "32-bit flytpunkt"
 
-#: session_option_editor.cc:170
+#: session_option_editor.cc:184
 msgid "24-bit integer"
 msgstr "24-bit heiltal"
 
-#: session_option_editor.cc:171
+#: session_option_editor.cc:185
 msgid "16-bit integer"
 msgstr "16-bit heiltal"
 
-#: session_option_editor.cc:177
+#: session_option_editor.cc:191
 msgid "File type"
 msgstr "Filtype"
 
-#: session_option_editor.cc:182
-msgid "Broadcast WAVE"
-msgstr "Kringkast-WAVE"
+#: session_option_editor.cc:196
+msgid "Broadcast WAVE (4GB size limit)"
+msgstr ""
 
-#: session_option_editor.cc:183
-msgid "WAVE"
-msgstr "WAVE"
+#: session_option_editor.cc:198
+msgid "Broadcast RF64"
+msgstr ""
 
-#: session_option_editor.cc:184
+#: session_option_editor.cc:200
+msgid "WAVE (4GB size limit)"
+msgstr ""
+
+#: session_option_editor.cc:201
 msgid "WAVE-64"
 msgstr "WAVE-64"
 
-#: session_option_editor.cc:189
+#: session_option_editor.cc:205
+msgid "RF64 (WAV compatible)"
+msgstr ""
+
+#: session_option_editor.cc:210 session_option_editor.cc:216
+#: session_option_editor.cc:223
+msgid "Files|Locations"
+msgstr ""
+
+#: session_option_editor.cc:210
 msgid "File locations"
 msgstr "Filplasseringar"
 
-#: session_option_editor.cc:191
+#: session_option_editor.cc:212
 msgid "Search for audio files in:"
 msgstr "Søk etter lydfiler i:"
 
-#: session_option_editor.cc:197
+#: session_option_editor.cc:218
 msgid "Search for MIDI files in:"
 msgstr "Sjå etter MIDI-filer i:"
 
-#: session_option_editor.cc:206 session_option_editor.cc:218
-#: session_option_editor.cc:228 session_option_editor.cc:239
+#: session_option_editor.cc:227 session_option_editor.cc:239
+#: session_option_editor.cc:249 session_option_editor.cc:260
 msgid "Filenames"
 msgstr ""
 
-#: session_option_editor.cc:206
+#: session_option_editor.cc:227
 msgid "File Naming"
 msgstr ""
 
-#: session_option_editor.cc:212
+#: session_option_editor.cc:233
 msgid "Prefix Track number"
 msgstr ""
 
-#: session_option_editor.cc:217
+#: session_option_editor.cc:238
 msgid ""
 "Adds the current track number to the beginning of the recorded file name."
 msgstr ""
 
-#: session_option_editor.cc:222
+#: session_option_editor.cc:243
 msgid "Prefix Take Name"
 msgstr ""
 
-#: session_option_editor.cc:227
+#: session_option_editor.cc:248
 msgid "Adds the Take Name to the beginning of the recorded file name."
 msgstr ""
 
-#: session_option_editor.cc:232
+#: session_option_editor.cc:253
 msgid "Take Name"
 msgstr ""
 
-#: session_option_editor.cc:245
+#: session_option_editor.cc:266
 msgid ""
 "Track Input Monitoring automatically follows transport state (\"auto-input\")"
 msgstr ""
 "Lytting til sporinnngangen fylgjer automatisk transportstatus («autoinngang»)"
 
-#: session_option_editor.cc:252
+#: session_option_editor.cc:273
 msgid "Use monitor section in this session"
 msgstr "Bruk lytteavdelinga i denne økta"
 
-#: session_option_editor.cc:257 session_option_editor.cc:259
-#: session_option_editor.cc:266 session_option_editor.cc:273
-#: session_option_editor.cc:280 session_option_editor.cc:282
-#: session_option_editor.cc:289 session_option_editor.cc:296
-#: session_option_editor.cc:303 session_option_editor.cc:310
-#: session_option_editor.cc:312
+#: session_option_editor.cc:278 session_option_editor.cc:280
+#: session_option_editor.cc:287 session_option_editor.cc:294
+#: session_option_editor.cc:301 session_option_editor.cc:303
+#: session_option_editor.cc:310 session_option_editor.cc:317
+#: session_option_editor.cc:324 session_option_editor.cc:331
+#: session_option_editor.cc:333
 msgid "Meterbridge"
 msgstr ""
 
-#: session_option_editor.cc:257
+#: session_option_editor.cc:278
 msgid "Route Display"
 msgstr ""
 
-#: session_option_editor.cc:261
+#: session_option_editor.cc:282
 msgid "Show Midi Tracks"
 msgstr ""
 
-#: session_option_editor.cc:268
+#: session_option_editor.cc:289
 msgid "Show Busses"
 msgstr ""
 
-#: session_option_editor.cc:275
+#: session_option_editor.cc:296
 msgid "Include Master Bus"
 msgstr ""
 
-#: session_option_editor.cc:280
+#: session_option_editor.cc:301
 msgid "Button Area"
 msgstr ""
 
-#: session_option_editor.cc:284
+#: session_option_editor.cc:305
 msgid "Rec-enable Button"
 msgstr ""
 
-#: session_option_editor.cc:291
+#: session_option_editor.cc:312
 msgid "Mute Button"
 msgstr ""
 
-#: session_option_editor.cc:298
+#: session_option_editor.cc:319
 msgid "Solo Button"
 msgstr ""
 
-#: session_option_editor.cc:305
+#: session_option_editor.cc:326
 msgid "Monitor Buttons"
 msgstr ""
 
-#: session_option_editor.cc:310
+#: session_option_editor.cc:331
 msgid "Name Labels"
 msgstr ""
 
-#: session_option_editor.cc:314
+#: session_option_editor.cc:335
 msgid "Track Name"
 msgstr ""
 
-#: session_option_editor.cc:325
+#: session_option_editor.cc:346
 msgid "MIDI region copies are independent"
 msgstr "MIDI-bolkkopiar er uavhengige"
 
-#: session_option_editor.cc:332
+#: session_option_editor.cc:353
 msgid ""
 "Policy for handling overlapping notes\n"
 " on the same MIDI channel"
@@ -11242,47 +13276,47 @@ msgstr ""
 "Framgangsmåte for å handtera overlappande\n"
 "notar på same MIDI-kanal"
 
-#: session_option_editor.cc:337
+#: session_option_editor.cc:358
 msgid "never allow them"
 msgstr "ikkje tillat"
 
-#: session_option_editor.cc:338
+#: session_option_editor.cc:359
 msgid "don't do anything in particular"
 msgstr "ikkje gjer noko spesielt"
 
-#: session_option_editor.cc:339
+#: session_option_editor.cc:360
 msgid "replace any overlapped existing note"
 msgstr "byt ut alle overlappande notar"
 
-#: session_option_editor.cc:340
+#: session_option_editor.cc:361
 msgid "shorten the overlapped existing note"
 msgstr "kort ned den overlappa noten"
 
-#: session_option_editor.cc:341
+#: session_option_editor.cc:362
 msgid "shorten the overlapping new note"
 msgstr "kort ned den overlappa nye noten"
 
-#: session_option_editor.cc:342
+#: session_option_editor.cc:363
 msgid "replace both overlapping notes with a single note"
 msgstr "byt ut båe dei overlappa med ein enkelt note"
 
-#: session_option_editor.cc:346
+#: session_option_editor.cc:367
 msgid "Glue to bars and beats"
 msgstr "Lim til takter og taktslag"
 
-#: session_option_editor.cc:350
+#: session_option_editor.cc:371
 msgid "Glue new markers to bars and beats"
 msgstr "Lim nye markørar til takter og taktslag"
 
-#: session_option_editor.cc:357
+#: session_option_editor.cc:378
 msgid "Glue new regions to bars and beats"
 msgstr "Lim nye bolkar til takter og taktslag"
 
-#: session_option_editor.cc:362
+#: session_option_editor.cc:383
 msgid "Defaults"
 msgstr ""
 
-#: session_option_editor.cc:364
+#: session_option_editor.cc:385
 msgid "Use these settings as defaults"
 msgstr ""
 
@@ -11318,26 +13352,14 @@ msgstr "<b>Lydfilinformasjon</b>"
 msgid "Timestamp:"
 msgstr "Tidsstempel:"
 
-#: sfdb_ui.cc:149
-msgid "Format:"
-msgstr "Format:"
-
-#: sfdb_ui.cc:188 sfdb_ui.cc:653
+#: sfdb_ui.cc:188 sfdb_ui.cc:659
 msgid "Tags:"
 msgstr "Knaggar:"
 
-#: sfdb_ui.cc:293 sfdb_ui.cc:409
-msgid "Could not read file: %1 (%2)."
-msgstr "Greidde ikkje lesa fil: %1 (%2)."
-
 #: sfdb_ui.cc:297
 msgid "<b>Midi File Information</b>"
 msgstr ""
 
-#: sfdb_ui.cc:458
-msgid "Could not access soundfile: "
-msgstr "Fekk ikkje tilgang til lydfil: "
-
 #: sfdb_ui.cc:530
 msgid "SoundFileBox: Could not tokenize string: "
 msgstr "SoundFileBox: Greidde ikkje laga teikn av strengen: "
@@ -11346,181 +13368,177 @@ msgstr "SoundFileBox: Greidde ikkje laga teikn av strengen: "
 msgid "Search"
 msgstr "Søk"
 
-#: sfdb_ui.cc:576
+#: sfdb_ui.cc:581
 msgid "Audio and MIDI files"
 msgstr "Lyd- og MIDI-filer"
 
-#: sfdb_ui.cc:579
+#: sfdb_ui.cc:584
 msgid "Audio files"
 msgstr "Lydfiler"
 
-#: sfdb_ui.cc:582
+#: sfdb_ui.cc:587
 msgid "MIDI files"
 msgstr "MIDI-filer"
 
-#: sfdb_ui.cc:585 add_video_dialog.cc:123
+#: sfdb_ui.cc:590 add_video_dialog.cc:123
 msgid "All files"
 msgstr "Alle filer"
 
-#: sfdb_ui.cc:604 add_video_dialog.cc:246
+#: sfdb_ui.cc:609 add_video_dialog.cc:246
 msgid "Browse Files"
 msgstr "Bla gjennom filer"
 
-#: sfdb_ui.cc:633
+#: sfdb_ui.cc:638
 msgid "Paths"
 msgstr "Stigar"
 
-#: sfdb_ui.cc:642
+#: sfdb_ui.cc:647
 msgid "Search Tags"
 msgstr "Søk i knaggar"
 
-#: sfdb_ui.cc:658
+#: sfdb_ui.cc:664
 msgid "Sort:"
 msgstr "Sorter:"
 
-#: sfdb_ui.cc:666
+#: sfdb_ui.cc:672
 msgid "Longest"
 msgstr "Lengst"
 
-#: sfdb_ui.cc:667
+#: sfdb_ui.cc:673
 msgid "Shortest"
 msgstr "Kortast"
 
-#: sfdb_ui.cc:668
+#: sfdb_ui.cc:674
 msgid "Newest"
 msgstr "Nyast"
 
-#: sfdb_ui.cc:669
+#: sfdb_ui.cc:675
 msgid "Oldest"
 msgstr "Eldste"
 
-#: sfdb_ui.cc:670
+#: sfdb_ui.cc:676
 msgid "Most downloaded"
 msgstr "Mest nedlasta"
 
-#: sfdb_ui.cc:671
+#: sfdb_ui.cc:677
 msgid "Least downloaded"
 msgstr "Minst nedlasta"
 
-#: sfdb_ui.cc:672
+#: sfdb_ui.cc:678
 msgid "Highest rated"
 msgstr "Høgst vurderte"
 
-#: sfdb_ui.cc:673
+#: sfdb_ui.cc:679
 msgid "Lowest rated"
 msgstr "LÃ¥gast vurderte"
 
-#: sfdb_ui.cc:678
+#: sfdb_ui.cc:684
 msgid "More"
 msgstr ""
 
-#: sfdb_ui.cc:682
+#: sfdb_ui.cc:688
 msgid "Similar"
 msgstr ""
 
-#: sfdb_ui.cc:694
+#: sfdb_ui.cc:700
 msgid "ID"
 msgstr "ID"
 
-#: sfdb_ui.cc:695 add_video_dialog.cc:83
+#: sfdb_ui.cc:701 add_video_dialog.cc:83
 msgid "Filename"
 msgstr "Filnamn"
 
-#: sfdb_ui.cc:697
+#: sfdb_ui.cc:703 time_fx_dialog.cc:154
 msgid "Duration"
 msgstr "Lengd"
 
-#: sfdb_ui.cc:698
+#: sfdb_ui.cc:704
 msgid "Size"
 msgstr "Storleik"
 
-#: sfdb_ui.cc:699
+#: sfdb_ui.cc:705
 msgid "Samplerate"
 msgstr "Punktfrekvens"
 
-#: sfdb_ui.cc:700
+#: sfdb_ui.cc:706
 msgid "License"
 msgstr "Lisens"
 
-#: sfdb_ui.cc:718
+#: sfdb_ui.cc:724
 msgid "Search Freesound"
 msgstr "Søk på Freesound"
 
-#: sfdb_ui.cc:738
-msgid "Press to import selected files and close this window"
-msgstr "Trykk for å importera filene og lukka dette vindauga"
-
-#: sfdb_ui.cc:739
-msgid "Press to import selected files and leave this window open"
-msgstr "Press for å importera filene og la dette vindauga vera ope"
+#: sfdb_ui.cc:741
+msgid "Press to import selected files"
+msgstr ""
 
-#: sfdb_ui.cc:740
+#: sfdb_ui.cc:742
 msgid "Press to close this window without importing any files"
 msgstr "Press for å lukka dette vindauga utan å importera nokon filer"
 
-#: sfdb_ui.cc:936
+#: sfdb_ui.cc:937
 msgid "SoundFileBrowser: Could not tokenize string: "
 msgstr "SoundFileBrowser: Greidde ikkje laga teikn av strengen: "
 
-#: sfdb_ui.cc:1136
+#: sfdb_ui.cc:1137
 msgid "%1 more page of 100 results available"
 msgid_plural "%1 more pages of 100 results available"
 msgstr[0] ""
 msgstr[1] ""
 
-#: sfdb_ui.cc:1141
+#: sfdb_ui.cc:1142
 msgid "No more results available"
 msgstr ""
 
-#: sfdb_ui.cc:1205
+#: sfdb_ui.cc:1206
 msgid "B"
 msgstr "B"
 
-#: sfdb_ui.cc:1207
+#: sfdb_ui.cc:1208
 msgid "kB"
 msgstr "kB"
 
-#: sfdb_ui.cc:1209 sfdb_ui.cc:1211
+#: sfdb_ui.cc:1210 sfdb_ui.cc:1212
 msgid "MB"
 msgstr "MB"
 
-#: sfdb_ui.cc:1213
+#: sfdb_ui.cc:1214
 msgid "GB"
 msgstr "GB"
 
-#: sfdb_ui.cc:1425 sfdb_ui.cc:1738 sfdb_ui.cc:1801 sfdb_ui.cc:1819
+#: sfdb_ui.cc:1431 sfdb_ui.cc:1728 sfdb_ui.cc:1764 sfdb_ui.cc:1782
 msgid "one track per file"
 msgstr "Eitt spor per fil"
 
-#: sfdb_ui.cc:1428 sfdb_ui.cc:1802 sfdb_ui.cc:1820
+#: sfdb_ui.cc:1434 sfdb_ui.cc:1765 sfdb_ui.cc:1783
 msgid "one track per channel"
 msgstr "Eitt spor per kanal"
 
-#: sfdb_ui.cc:1436 sfdb_ui.cc:1804 sfdb_ui.cc:1821
+#: sfdb_ui.cc:1442 sfdb_ui.cc:1767 sfdb_ui.cc:1784
 msgid "sequence files"
 msgstr "sekvensfiler"
 
-#: sfdb_ui.cc:1439 sfdb_ui.cc:1809
+#: sfdb_ui.cc:1445 sfdb_ui.cc:1772
 msgid "all files in one track"
 msgstr "alle filene i eitt spor"
 
-#: sfdb_ui.cc:1440 sfdb_ui.cc:1803
+#: sfdb_ui.cc:1446 sfdb_ui.cc:1766
 msgid "merge files"
 msgstr "flett filer"
 
-#: sfdb_ui.cc:1446 sfdb_ui.cc:1806
+#: sfdb_ui.cc:1452 sfdb_ui.cc:1769
 msgid "one region per file"
 msgstr "ein bolk per fil"
 
-#: sfdb_ui.cc:1449 sfdb_ui.cc:1807
+#: sfdb_ui.cc:1455 sfdb_ui.cc:1770
 msgid "one region per channel"
 msgstr "ein bolk for kvar kanal"
 
-#: sfdb_ui.cc:1454 sfdb_ui.cc:1808 sfdb_ui.cc:1822
+#: sfdb_ui.cc:1460 sfdb_ui.cc:1771 sfdb_ui.cc:1785
 msgid "all files in one region"
 msgstr "alle filene i ein bolk"
 
-#: sfdb_ui.cc:1521
+#: sfdb_ui.cc:1527
 msgid ""
 "One or more of the selected files\n"
 "cannot be used by %1"
@@ -11528,104 +13546,104 @@ msgstr ""
 "%1 kan ikkje bruka\n"
 "ei eller fleire av desse filene"
 
-#: sfdb_ui.cc:1665
+#: sfdb_ui.cc:1671
 msgid "Copy files to session"
 msgstr "Kopier filer til økta"
 
-#: sfdb_ui.cc:1682 sfdb_ui.cc:1859
+#: sfdb_ui.cc:1686 sfdb_ui.cc:1825
 msgid "file timestamp"
 msgstr "filtidsstempel"
 
-#: sfdb_ui.cc:1683 sfdb_ui.cc:1861
+#: sfdb_ui.cc:1687 sfdb_ui.cc:1827
 msgid "edit point"
 msgstr "redigeringspunkt"
 
-#: sfdb_ui.cc:1684 sfdb_ui.cc:1863
+#: sfdb_ui.cc:1688 sfdb_ui.cc:1829
 msgid "playhead"
 msgstr "spelehovud"
 
-#: sfdb_ui.cc:1685
+#: sfdb_ui.cc:1689
 msgid "session start"
 msgstr "øktstart"
 
-#: sfdb_ui.cc:1691
-msgid "<b>Add files as ...</b>"
-msgstr "<b>Legg til filer som ...</b>"
+#: sfdb_ui.cc:1695
+msgid "<b>Add files ...</b>"
+msgstr ""
 
-#: sfdb_ui.cc:1713
+#: sfdb_ui.cc:1700
 msgid "<b>Insert at</b>"
 msgstr "<b>Set inn ved</b>"
 
-#: sfdb_ui.cc:1726
+#: sfdb_ui.cc:1705
 msgid "<b>Mapping</b>"
 msgstr "<b>Punktlegging</b>"
 
-#: sfdb_ui.cc:1744
+#: sfdb_ui.cc:1710
 msgid "<b>Conversion quality</b>"
 msgstr "<b>Omkodingskvalitet</b>"
 
-#: sfdb_ui.cc:1756
+#: sfdb_ui.cc:1715
 msgid "<b>Instrument</b>"
 msgstr ""
 
-#: sfdb_ui.cc:1768 sfdb_ui.cc:1875
+#: sfdb_ui.cc:1734 sfdb_ui.cc:1841
 msgid "Best"
 msgstr "Best"
 
-#: sfdb_ui.cc:1769 sfdb_ui.cc:1877
+#: sfdb_ui.cc:1735 sfdb_ui.cc:1843
 msgid "Good"
 msgstr "God"
 
-#: sfdb_ui.cc:1770 sfdb_ui.cc:1879
+#: sfdb_ui.cc:1736 sfdb_ui.cc:1845
 msgid "Quick"
 msgstr "Snøgg"
 
-#: sfdb_ui.cc:1772
+#: sfdb_ui.cc:1738
 msgid "Fastest"
 msgstr "Fortast"
 
-#: shuttle_control.cc:56
+#: shuttle_control.cc:64
 msgid "Shuttle speed control (Context-click for options)"
 msgstr "Fartsjustering (kontekst-klikk for val)"
 
-#: shuttle_control.cc:174
+#: shuttle_control.cc:201 time_fx_dialog.cc:164
 msgid "Percent"
 msgstr "Prosent"
 
-#: shuttle_control.cc:182
+#: shuttle_control.cc:209
 msgid "Units"
 msgstr "Einingar"
 
-#: shuttle_control.cc:188 shuttle_control.cc:609
+#: shuttle_control.cc:215 shuttle_control.cc:671
 msgid "Sprung"
 msgstr "Fjør"
 
-#: shuttle_control.cc:192 shuttle_control.cc:612
+#: shuttle_control.cc:219 shuttle_control.cc:674
 msgid "Wheel"
 msgstr "Hjul"
 
-#: shuttle_control.cc:226
+#: shuttle_control.cc:253
 msgid "Maximum speed"
 msgstr "Maksfart"
 
-#: shuttle_control.cc:568
+#: shuttle_control.cc:256
+msgid "Reset to 100%"
+msgstr ""
+
+#: shuttle_control.cc:633
 msgid "Playing"
 msgstr "Spelar av"
 
-#: shuttle_control.cc:583
+#: shuttle_control.cc:648
 #, c-format
 msgid "<<< %+d semitones"
 msgstr "<<< %+d halvtonar"
 
-#: shuttle_control.cc:585
+#: shuttle_control.cc:650
 #, c-format
 msgid ">>> %+d semitones"
 msgstr ">>> %+d halvtonar"
 
-#: shuttle_control.cc:590
-msgid "Stopped"
-msgstr "Stoppa"
-
 #: soundcloud_export_selector.cc:44
 msgid "User Email"
 msgstr ""
@@ -11650,7 +13668,7 @@ msgstr ""
 msgid "%1: %2 of %3 bytes uploaded"
 msgstr ""
 
-#: splash.cc:73
+#: splash.cc:78
 msgid "%1 loading ..."
 msgstr "%1 startar..."
 
@@ -11666,17 +13684,17 @@ msgstr "Fjern høgtalar"
 msgid "Azimuth:"
 msgstr "Asimut:"
 
-#: startup.cc:67
+#: startup.cc:71
 msgid ""
 "Use an external mixer or the hardware mixer of your audio interface.\n"
 "%1 will play NO role in monitoring"
 msgstr ""
 
-#: startup.cc:69
+#: startup.cc:73
 msgid "Ask %1 to play back material as it is being recorded"
 msgstr "Be %1 om å spela det som blir teke opp"
 
-#: startup.cc:142
+#: startup.cc:146
 msgid ""
 "<span size=\"larger\">%1 is a digital audio workstation. You can use it to "
 "record, edit and mix multi-track audio. You can produce your own CDs, mix "
@@ -11692,15 +13710,15 @@ msgstr ""
 "\n"
 "Me må gjera nokre val før du byrjar å bruka programmet.</span>"
 
-#: startup.cc:168
+#: startup.cc:172
 msgid "Welcome to %1"
 msgstr "Velkomen til %1"
 
-#: startup.cc:191
+#: startup.cc:195
 msgid "Default folder for %1 sessions"
 msgstr "Standardmappa for %1-økter"
 
-#: startup.cc:197
+#: startup.cc:201
 msgid ""
 "Each project that you work on with %1 has its own folder.\n"
 "These can require a lot of disk space if you are recording audio.\n"
@@ -11716,11 +13734,11 @@ msgstr ""
 "\n"
 "<i>(Du kan lagra prosjekt kvar som helst, dette er berre standardvalet)</i>"
 
-#: startup.cc:220
+#: startup.cc:224
 msgid "Default folder for new sessions"
 msgstr "Standardmappe for nye økter"
 
-#: startup.cc:241
+#: startup.cc:245
 msgid ""
 "While recording instruments or vocals, you probably want to listen to the\n"
 "signal as well as record it. This is called \"monitoring\". There are\n"
@@ -11740,15 +13758,15 @@ msgstr ""
 "\n"
 "<i>(Du kan endra dette i Innstillingar-ruta seinare)</i>"
 
-#: startup.cc:262
+#: startup.cc:266
 msgid "Monitoring Choices"
 msgstr "Lyttingsval"
 
-#: startup.cc:285
+#: startup.cc:289
 msgid "Use a Master bus directly"
 msgstr "Bruk hovudbuss direkte"
 
-#: startup.cc:287
+#: startup.cc:291
 msgid ""
 "Connect the Master bus directly to your hardware outputs. This is preferable "
 "for simple usage."
@@ -11756,11 +13774,11 @@ msgstr ""
 "Kopla hovudbussen direkte til maskinvareutgangane. Best for grunnleggande "
 "bruk."
 
-#: startup.cc:296
+#: startup.cc:300
 msgid "Use an additional Monitor bus"
 msgstr "Bruk eigen lyttebuss i tillegg"
 
-#: startup.cc:299
+#: startup.cc:303
 msgid ""
 "Use a Monitor bus between Master bus and hardware outputs for \n"
 "greater control in monitoring without affecting the mix."
@@ -11768,7 +13786,7 @@ msgstr ""
 "Bruk ein lyttebuss mellom hovudbussen og maskinvareutgangane\n"
 "for å ha betre kontroll med lyttinga utan å påverka miksen."
 
-#: startup.cc:321
+#: startup.cc:325
 msgid ""
 "<i>You can change this preference at any time via the Preferences dialog.\n"
 "You can also add or remove the monitor section to/from any session.</i>\n"
@@ -11781,46 +13799,42 @@ msgstr ""
 "\n"
 "<i>Viss du ikkje skjønar kva dette er til, kan du bruka standardvala.</i>"
 
-#: startup.cc:332
+#: startup.cc:336
 msgid "Monitor Section"
 msgstr "Lytteavdeling"
 
-#: step_entry.cc:60
+#: step_entry.cc:59
 msgid "Step Entry: %1"
 msgstr "Steginnlegging: %1"
 
-#: step_entry.cc:65
+#: step_entry.cc:64
 msgid ">beat"
 msgstr ">slag"
 
-#: step_entry.cc:66
+#: step_entry.cc:65
 msgid ">bar"
 msgstr ">takt"
 
-#: step_entry.cc:67
+#: step_entry.cc:66
 msgid ">EP"
 msgstr ">EP"
 
-#: step_entry.cc:68
+#: step_entry.cc:67
 msgid "sustain"
 msgstr "klanglengd"
 
-#: step_entry.cc:69
+#: step_entry.cc:68
 msgid "rest"
 msgstr "pause"
 
-#: step_entry.cc:70
+#: step_entry.cc:69
 msgid "g-rest"
 msgstr "g-pause"
 
-#: step_entry.cc:71
+#: step_entry.cc:70
 msgid "back"
 msgstr "tilbake"
 
-#: step_entry.cc:82 step_entry.cc:85
-msgid "+"
-msgstr "+"
-
 #: step_entry.cc:191
 msgid "Set note length to a whole note"
 msgstr "Bruk heilnote som notelengd"
@@ -11929,11 +13943,11 @@ msgstr "Set inn bankendringsmelding"
 msgid "Insert a program change message"
 msgstr "Set inn ei programendringsmelding"
 
-#: step_entry.cc:343 step_entry.cc:700
+#: step_entry.cc:343 step_entry.cc:645
 msgid "Move Insert Position Back by Note Length"
 msgstr "Flytt Set inn-posisjonen bakover med ei notelengd"
 
-#: step_entry.cc:344 step_entry.cc:698
+#: step_entry.cc:344 step_entry.cc:643
 msgid "Move Insert Position to Edit Point"
 msgstr "Flytt Set inn-posisjonen til redigeringspunktet"
 
@@ -11945,240 +13959,244 @@ msgstr "1/note"
 msgid "Octave"
 msgstr "Oktav"
 
-#: step_entry.cc:598
+#: step_entry.cc:592
 msgid "Insert Note A"
 msgstr "Set inn note A"
 
-#: step_entry.cc:599
+#: step_entry.cc:593
 msgid "Insert Note A-sharp"
 msgstr "Set inn aiss"
 
-#: step_entry.cc:600
+#: step_entry.cc:594
 msgid "Insert Note B"
 msgstr "Set inn note H"
 
-#: step_entry.cc:601
+#: step_entry.cc:595
 msgid "Insert Note C"
 msgstr "Set inn note C"
 
-#: step_entry.cc:602
+#: step_entry.cc:596
 msgid "Insert Note C-sharp"
 msgstr "Set inn ciss"
 
-#: step_entry.cc:603
+#: step_entry.cc:597
 msgid "Insert Note D"
 msgstr "Set inn note D"
 
-#: step_entry.cc:604
+#: step_entry.cc:598
 msgid "Insert Note D-sharp"
 msgstr "Set inn diss"
 
-#: step_entry.cc:605
+#: step_entry.cc:599
 msgid "Insert Note E"
 msgstr "Set inn note E"
 
-#: step_entry.cc:606
+#: step_entry.cc:600
 msgid "Insert Note F"
 msgstr "Set inn note F"
 
-#: step_entry.cc:607
+#: step_entry.cc:601
 msgid "Insert Note F-sharp"
 msgstr "Set inn fiss"
 
-#: step_entry.cc:608
+#: step_entry.cc:602
 msgid "Insert Note G"
 msgstr "Set inn note G"
 
-#: step_entry.cc:609
+#: step_entry.cc:603
 msgid "Insert Note G-sharp"
 msgstr "Set inn giss"
 
-#: step_entry.cc:611
+#: step_entry.cc:605
 msgid "Insert a Note-length Rest"
 msgstr "Set inn pause på ei notelengd"
 
-#: step_entry.cc:612
+#: step_entry.cc:606
 msgid "Insert a Snap-length Rest"
 msgstr "Set inn pause på ei festelengd"
 
-#: step_entry.cc:614 step_entry.cc:615
+#: step_entry.cc:608 step_entry.cc:609
 msgid "Move to next octave"
 msgstr "Flytt til neste oktav"
 
-#: step_entry.cc:617
+#: step_entry.cc:611
 msgid "Move to Next Note Length"
 msgstr "Flytt til neste notelengd"
 
-#: step_entry.cc:618
+#: step_entry.cc:612
 msgid "Move to Previous Note Length"
 msgstr "Flytt til førre notelengd"
 
-#: step_entry.cc:620
+#: step_entry.cc:614
 msgid "Increase Note Length"
 msgstr "Auk notelengd"
 
-#: step_entry.cc:621
+#: step_entry.cc:615
 msgid "Decrease Note Length"
 msgstr "Kort ned notelengd"
 
-#: step_entry.cc:623
+#: step_entry.cc:617
 msgid "Move to Next Note Velocity"
 msgstr "Flytt til neste notevolum"
 
-#: step_entry.cc:624
+#: step_entry.cc:618
 msgid "Move to Previous Note Velocity"
 msgstr "Flytt til førre notevolum"
 
-#: step_entry.cc:626
+#: step_entry.cc:620
 msgid "Increase Note Velocity"
 msgstr "Auk notevolum"
 
-#: step_entry.cc:627
+#: step_entry.cc:621
 msgid "Decrease Note Velocity"
 msgstr "Mink notevolum"
 
-#: step_entry.cc:629
+#: step_entry.cc:623
 msgid "Switch to the 1st octave"
 msgstr "Byt til fyrste oktaven"
 
-#: step_entry.cc:630
+#: step_entry.cc:624
 msgid "Switch to the 2nd octave"
 msgstr "Byt til andre oktaven"
 
-#: step_entry.cc:631
+#: step_entry.cc:625
 msgid "Switch to the 3rd octave"
 msgstr "Byt til tredje oktaven"
 
-#: step_entry.cc:632
+#: step_entry.cc:626
 msgid "Switch to the 4th octave"
 msgstr "Byt til fjerde oktaven"
 
-#: step_entry.cc:633
+#: step_entry.cc:627
 msgid "Switch to the 5th octave"
 msgstr "Byt til femte oktaven"
 
-#: step_entry.cc:634
+#: step_entry.cc:628
 msgid "Switch to the 6th octave"
 msgstr "Byt til sjette oktaven"
 
-#: step_entry.cc:635
+#: step_entry.cc:629
 msgid "Switch to the 7th octave"
 msgstr "Byt til sjuande oktaven"
 
-#: step_entry.cc:636
+#: step_entry.cc:630
 msgid "Switch to the 8th octave"
 msgstr "Byt til åttande oktaven"
 
-#: step_entry.cc:637
+#: step_entry.cc:631
 msgid "Switch to the 9th octave"
 msgstr "Byt til niande oktaven"
 
-#: step_entry.cc:638
+#: step_entry.cc:632
 msgid "Switch to the 10th octave"
 msgstr "Byt til tiande oktaven"
 
-#: step_entry.cc:639
+#: step_entry.cc:633
 msgid "Switch to the 11th octave"
 msgstr "Byt til ellevte oktaven"
 
-#: step_entry.cc:644
+#: step_entry.cc:635
+msgid "Toggle Triple Notes"
+msgstr "Skru på triolar"
+
+#: step_entry.cc:638
+msgid "Toggle Chord Entry"
+msgstr "Skru på akkordskriving"
+
+#: step_entry.cc:640
+msgid "Sustain Selected Notes by Note Length"
+msgstr "Hald desse notane i notelengda"
+
+#: step_entry.cc:650
 msgid "Set Note Length to Whole"
 msgstr "Bruk heilnote som notelengd"
 
-#: step_entry.cc:646
+#: step_entry.cc:652
 msgid "Set Note Length to 1/2"
 msgstr "Set notelengda til 1/2"
 
-#: step_entry.cc:648
+#: step_entry.cc:654
 msgid "Set Note Length to 1/3"
 msgstr "Set notelengda til 1/3"
 
-#: step_entry.cc:650
+#: step_entry.cc:656
 msgid "Set Note Length to 1/4"
 msgstr "Set notelengda til 1/4"
 
-#: step_entry.cc:652
+#: step_entry.cc:658
 msgid "Set Note Length to 1/8"
 msgstr "Set notelengda til 1/8"
 
-#: step_entry.cc:654
+#: step_entry.cc:660
 msgid "Set Note Length to 1/16"
 msgstr "Bruk 1/16 som notelengd"
 
-#: step_entry.cc:656
+#: step_entry.cc:662
 msgid "Set Note Length to 1/32"
 msgstr "Bruk 1/32 som notelengd"
 
-#: step_entry.cc:658
+#: step_entry.cc:664
 msgid "Set Note Length to 1/64"
 msgstr "Bruk 1/64 som notelengd"
 
-#: step_entry.cc:663
+#: step_entry.cc:669
 msgid "Set Note Velocity to Pianississimo"
 msgstr "Bruk piano pianissimo som notevolum"
 
-#: step_entry.cc:665
+#: step_entry.cc:671
 msgid "Set Note Velocity to Pianissimo"
 msgstr "Bruk pianissimo som notevolum"
 
-#: step_entry.cc:667
+#: step_entry.cc:673
 msgid "Set Note Velocity to Piano"
 msgstr "Bruk piano som notevolum"
 
-#: step_entry.cc:669
+#: step_entry.cc:675
 msgid "Set Note Velocity to Mezzo-Piano"
 msgstr "Bruk mezzo piano som notevolum"
 
-#: step_entry.cc:671
+#: step_entry.cc:677
 msgid "Set Note Velocity to Mezzo-Forte"
 msgstr "Bruk mezzo forte som notevolum"
 
-#: step_entry.cc:673
+#: step_entry.cc:679
 msgid "Set Note Velocity to Forte"
 msgstr "Bruk forte som notevolum"
 
-#: step_entry.cc:675 step_entry.cc:677
+#: step_entry.cc:681 step_entry.cc:683
 msgid "Set Note Velocity to Fortississimo"
 msgstr "Bruk forte fortissimo som notevolum"
 
-#: step_entry.cc:679
-msgid "Toggle Triple Notes"
-msgstr "Skru på triolar"
-
-#: step_entry.cc:684
+#: step_entry.cc:688
 msgid "No Dotted Notes"
 msgstr "Ingen punkteringar"
 
-#: step_entry.cc:686
+#: step_entry.cc:689
 msgid "Toggled Dotted Notes"
 msgstr "Skru på punkteringar"
 
-#: step_entry.cc:688
+#: step_entry.cc:690
 msgid "Toggled Double-Dotted Notes"
 msgstr "Skru på dobbelpunkteringar"
 
-#: step_entry.cc:690
+#: step_entry.cc:691
 msgid "Toggled Triple-Dotted Notes"
 msgstr "Skru på trippelpunkteringar"
 
-#: step_entry.cc:693
-msgid "Toggle Chord Entry"
-msgstr "Skru på akkordskriving"
-
-#: step_entry.cc:695
-msgid "Sustain Selected Notes by Note Length"
-msgstr "Hald desse notane i notelengda"
-
-#: stereo_panner.cc:133
+#: stereo_panner.cc:129
 #, c-format
 msgid "L:%3d R:%3d Width:%d%%"
 msgstr ""
 
-#: stereo_panner_editor.cc:35
+#: stereo_panner.cc:272
+msgid "Panner|M"
+msgstr ""
+
+#: stereo_panner_editor.cc:37
 msgid "Stereo Panner"
 msgstr "Stereopanorering"
 
-#: stereo_panner_editor.cc:49
+#: stereo_panner_editor.cc:51
 msgid "Width"
 msgstr "Breidd"
 
@@ -12186,176 +14204,189 @@ msgstr "Breidd"
 msgid "Strip Silence"
 msgstr "Skjer bort stille"
 
-#: strip_silence_dialog.cc:75
+#: strip_silence_dialog.cc:65
+msgid "Threshold"
+msgstr "Dørstokk"
+
+#: strip_silence_dialog.cc:76
 msgid "Minimum length"
 msgstr "Minstelengd"
 
-#: strip_silence_dialog.cc:83
+#: strip_silence_dialog.cc:84
 msgid "Fade length"
 msgstr "Toningslengd"
 
-#: tempo_dialog.cc:41 tempo_dialog.cc:57
+#: strip_silence_dialog.cc:111 strip_silence_dialog.cc:298
+msgid "Analyzing"
+msgstr ""
+
+#: tempo_dialog.cc:43 tempo_dialog.cc:60
 msgid "bar:"
 msgstr "takt:"
 
-#: tempo_dialog.cc:42 tempo_dialog.cc:58
+#: tempo_dialog.cc:44 tempo_dialog.cc:61
 msgid "beat:"
 msgstr "slag:"
 
-#: tempo_dialog.cc:43 tempo_dialog.cc:59
+#: tempo_dialog.cc:45 tempo_dialog.cc:62
 msgid "Pulse note"
 msgstr "Pulsnote"
 
-#: tempo_dialog.cc:44 tempo_dialog.cc:60
+#: tempo_dialog.cc:46 tempo_dialog.cc:63
 msgid "Tap tempo"
 msgstr ""
 
-#: tempo_dialog.cc:54
-msgid "Edit Tempo"
-msgstr "Endra tempo"
-
-#: tempo_dialog.cc:77 tempo_dialog.cc:78 tempo_dialog.cc:324
-#: tempo_dialog.cc:325
+#: tempo_dialog.cc:81 tempo_dialog.cc:82 tempo_dialog.cc:448
+#: tempo_dialog.cc:449
 msgid "whole"
 msgstr "heil"
 
-#: tempo_dialog.cc:79 tempo_dialog.cc:80 tempo_dialog.cc:326
-#: tempo_dialog.cc:327
+#: tempo_dialog.cc:83 tempo_dialog.cc:84 tempo_dialog.cc:450
+#: tempo_dialog.cc:451
 msgid "second"
 msgstr "andre"
 
-#: tempo_dialog.cc:81 tempo_dialog.cc:82 tempo_dialog.cc:328
-#: tempo_dialog.cc:329
+#: tempo_dialog.cc:85 tempo_dialog.cc:86 tempo_dialog.cc:452
+#: tempo_dialog.cc:453
 msgid "third"
 msgstr "tredjedel"
 
-#: tempo_dialog.cc:83 tempo_dialog.cc:84 tempo_dialog.cc:330
-#: tempo_dialog.cc:331
+#: tempo_dialog.cc:87 tempo_dialog.cc:88 tempo_dialog.cc:454
+#: tempo_dialog.cc:455
 msgid "quarter"
 msgstr "fjerdedel"
 
-#: tempo_dialog.cc:85 tempo_dialog.cc:86 tempo_dialog.cc:332
-#: tempo_dialog.cc:333
+#: tempo_dialog.cc:89 tempo_dialog.cc:90 tempo_dialog.cc:456
+#: tempo_dialog.cc:457
 msgid "eighth"
 msgstr "Ã¥ttendel"
 
-#: tempo_dialog.cc:87 tempo_dialog.cc:88 tempo_dialog.cc:334
-#: tempo_dialog.cc:335
+#: tempo_dialog.cc:91 tempo_dialog.cc:92 tempo_dialog.cc:458
+#: tempo_dialog.cc:459
 msgid "sixteenth"
 msgstr "sekstendel"
 
-#: tempo_dialog.cc:89 tempo_dialog.cc:90 tempo_dialog.cc:336
-#: tempo_dialog.cc:337
+#: tempo_dialog.cc:93 tempo_dialog.cc:94 tempo_dialog.cc:460
+#: tempo_dialog.cc:461
 msgid "thirty-second"
 msgstr "toogtredvedel"
 
-#: tempo_dialog.cc:91 tempo_dialog.cc:92 tempo_dialog.cc:338
-#: tempo_dialog.cc:339
+#: tempo_dialog.cc:95 tempo_dialog.cc:96 tempo_dialog.cc:462
+#: tempo_dialog.cc:463
 msgid "sixty-fourth"
 msgstr "sekstifiredel"
 
-#: tempo_dialog.cc:93 tempo_dialog.cc:94 tempo_dialog.cc:340
-#: tempo_dialog.cc:341
+#: tempo_dialog.cc:97 tempo_dialog.cc:98 tempo_dialog.cc:464
+#: tempo_dialog.cc:465
 msgid "one-hundred-twenty-eighth"
 msgstr "hundreogtjueåttedel"
 
-#: tempo_dialog.cc:121
+#: tempo_dialog.cc:115 tempo_dialog.cc:116
+msgid "ramped"
+msgstr ""
+
+#: tempo_dialog.cc:117 tempo_dialog.cc:118
+msgid "constant"
+msgstr ""
+
+#: tempo_dialog.cc:133 tempo_dialog.cc:134 tempo_dialog.cc:482
+#: tempo_dialog.cc:483
+msgid "music"
+msgstr ""
+
+#: tempo_dialog.cc:161
 msgid "Beats per minute:"
 msgstr "Slag per minutt:"
 
-#: tempo_dialog.cc:155
+#: tempo_dialog.cc:195
 msgid "Tempo begins at"
 msgstr "Tempoet byrjar på"
 
-#: tempo_dialog.cc:251
+#: tempo_dialog.cc:201
+msgid "Lock Style:"
+msgstr ""
+
+#: tempo_dialog.cc:209
+msgid "Tempo Type:"
+msgstr ""
+
+#: tempo_dialog.cc:321
 msgid "incomprehensible pulse note type (%1)"
 msgstr "uforståeleg pulsnotetype (%1)"
 
-#: tempo_dialog.cc:307
-msgid "Edit Meter"
-msgstr "Endra taktart"
+#: tempo_dialog.cc:334
+msgid "incomprehensible tempo type (%1)"
+msgstr ""
+
+#: tempo_dialog.cc:347
+msgid "incomprehensible lock style (%1)"
+msgstr ""
 
-#: tempo_dialog.cc:356
+#: tempo_dialog.cc:498
 msgid "Note value:"
 msgstr "Noteverdi:"
 
-#: tempo_dialog.cc:357
+#: tempo_dialog.cc:499
+msgid "Lock style:"
+msgstr ""
+
+#: tempo_dialog.cc:500
 msgid "Beats per bar:"
 msgstr "Slag per takt:"
 
-#: tempo_dialog.cc:371
+#: tempo_dialog.cc:514
 msgid "Meter begins at bar:"
 msgstr "Taktarten byrjar ved takt:"
 
-#: tempo_dialog.cc:484
+#: tempo_dialog.cc:638
 msgid "incomprehensible meter note type (%1)"
 msgstr "uforståeleg taktartnotetype (%1)"
 
-#: theme_manager.cc:65
-msgid "Dark Theme"
-msgstr "Mørk bunad"
-
-#: theme_manager.cc:66
-msgid "Light Theme"
-msgstr "Lys bunad"
-
-#: theme_manager.cc:67
-msgid "Restore Defaults"
-msgstr "Nullstill til standard"
+#: tempo_dialog.cc:651
+msgid "incomprehensible meter lock style (%1)"
+msgstr ""
 
-#: theme_manager.cc:68
+#: theme_manager.cc:53
 msgid "Draw \"flat\" buttons"
 msgstr "Teikna «flate» knappar"
 
-#: theme_manager.cc:69
+#: theme_manager.cc:54
 msgid "Blink Rec-Arm buttons"
 msgstr ""
 
-#: theme_manager.cc:70
+#: theme_manager.cc:55
 msgid "Color regions using their track's color"
 msgstr "Fargelegg bolkar med sporfarga"
 
-#: theme_manager.cc:71
+#: theme_manager.cc:56
 msgid "Show waveform clipping"
 msgstr ""
 
-#: theme_manager.cc:73
+#: theme_manager.cc:58
 msgid "Waveforms color gradient depth"
 msgstr ""
 
-#: theme_manager.cc:75
+#: theme_manager.cc:60
 msgid "Timeline item gradient depth"
 msgstr ""
 
-#: theme_manager.cc:76
+#: theme_manager.cc:61
 msgid "All floating windows are dialogs"
 msgstr ""
 
-#: theme_manager.cc:77
+#: theme_manager.cc:62
 msgid "Transient windows follow front window."
 msgstr ""
 
-#: theme_manager.cc:78
-msgid "Icon Set"
-msgstr ""
-
-#: theme_manager.cc:87
-msgid "Object"
-msgstr "Objekt"
-
-#: theme_manager.cc:163
-msgid "Items"
-msgstr ""
-
-#: theme_manager.cc:164
-msgid "Palette"
+#: theme_manager.cc:63
+msgid "Float detached monitor-section window"
 msgstr ""
 
-#: theme_manager.cc:165
-msgid "Transparency"
+#: theme_manager.cc:64
+msgid "Icon Set"
 msgstr ""
 
-#: theme_manager.cc:195
+#: theme_manager.cc:132
 msgid ""
 "Mark all floating windows to be type \"Dialog\" rather than using \"Utility"
 "\" for some.\n"
@@ -12363,92 +14394,95 @@ msgid ""
 "take effect"
 msgstr ""
 
-#: theme_manager.cc:199
+#: theme_manager.cc:136
 msgid ""
 "Make transient windows follow the front window when toggling between the "
 "editor and mixer.\n"
 "This requires a restart of %1 to take effect"
 msgstr ""
 
-#: theme_manager.cc:620
-msgid "Color Palette"
+#: theme_manager.cc:139
+msgid ""
+"When detaching the monitoring section, mark it as \"Utility\" window to stay "
+"in front.\n"
+"This requires a restart of %1 to take effect"
 msgstr ""
 
 #: time_axis_view.cc:148
 msgid "Track/Bus name (double click to edit)"
 msgstr ""
 
-#: time_axis_view_item.cc:345
+#: time_axis_view_item.cc:326
 msgid "new duration %1 frame is out of bounds for %2"
 msgid_plural "new duration of %1 frames is out of bounds for %2"
 msgstr[0] "lengda no, %1 ramme, er utanfor rekkjevidda for %2"
 msgstr[1] "lengda no, %1 rammer, er utanfor rekkjevidda for %2"
 
-#: time_fx_dialog.cc:62
+#: time_fx_dialog.cc:60
 msgid "Quick but Ugly"
 msgstr "Fort og gale"
 
-#: time_fx_dialog.cc:63
+#: time_fx_dialog.cc:61
 msgid "Skip Anti-aliasing"
 msgstr "Hopp over anti-alias"
 
-#: time_fx_dialog.cc:64
-msgid "Contents:"
-msgstr "Innhald:"
+#: time_fx_dialog.cc:62
+msgid "Contents"
+msgstr ""
 
-#: time_fx_dialog.cc:65
+#: time_fx_dialog.cc:63
 msgid "Minimize time distortion"
 msgstr "Mink tidsforvrenging"
 
-#: time_fx_dialog.cc:66
+#: time_fx_dialog.cc:64
 msgid "Preserve Formants"
 msgstr "Behald formantar"
 
-#: time_fx_dialog.cc:71
+#: time_fx_dialog.cc:81
 msgid "TimeFXDialog"
 msgstr "TidsFXdialog"
 
-#: time_fx_dialog.cc:74
+#: time_fx_dialog.cc:84
 msgid "Pitch Shift Audio"
 msgstr "Endra tonehøgd på lydmaterialet"
 
-#: time_fx_dialog.cc:76
+#: time_fx_dialog.cc:86
 msgid "Time Stretch Audio"
 msgstr "Tidsstrekk lydmaterialet"
 
-#: time_fx_dialog.cc:104 transpose_dialog.cc:41
+#: time_fx_dialog.cc:114 transpose_dialog.cc:41
 msgid "Octaves:"
 msgstr "Oktavar:"
 
-#: time_fx_dialog.cc:109 transpose_dialog.cc:46
+#: time_fx_dialog.cc:119 transpose_dialog.cc:46
 msgid "Semitones:"
 msgstr "Halvtonar:"
 
-#: time_fx_dialog.cc:114
+#: time_fx_dialog.cc:124
 msgid "Cents:"
 msgstr "Cent:"
 
-#: time_fx_dialog.cc:122
+#: time_fx_dialog.cc:132
 msgid "Time|Shift"
 msgstr "Tid|Forskyv"
 
-#: time_fx_dialog.cc:146 time_fx_dialog.cc:149
+#: time_fx_dialog.cc:184 time_fx_dialog.cc:188
 msgid "TimeFXButton"
 msgstr "TidsFXknapp"
 
-#: time_fx_dialog.cc:154
+#: time_fx_dialog.cc:193
 msgid "Stretch/Shrink"
 msgstr "Strekk/krymp"
 
-#: time_fx_dialog.cc:164
+#: time_fx_dialog.cc:203
 msgid "<b>Progress</b>"
 msgstr "<b>Framgang</b>"
 
-#: time_info_box.cc:124
+#: time_info_box.cc:118
 msgid "Start recording at auto-punch start"
 msgstr "Ta opp frå auto-innslagspunktet"
 
-#: time_info_box.cc:125
+#: time_info_box.cc:119
 msgid "Stop recording at auto-punch end"
 msgstr "Stopp opptak ved slutten av innslagsområdet"
 
@@ -12516,94 +14550,130 @@ msgstr "Transponer MIDI"
 msgid "Transpose"
 msgstr "Transponer"
 
-#: ui_config.cc:163 ui_config.cc:300
+#: ui_config.cc:233 ui_config.cc:416
 msgid "Loading default ui configuration file %1"
 msgstr "Lastar standard brukarflatefil %1"
 
-#: ui_config.cc:166 ui_config.cc:303
+#: ui_config.cc:236 ui_config.cc:419
 msgid "cannot read default ui configuration file \"%1\""
 msgstr "greier ikkje lesa standardbrukarflatefila \"%1\""
 
-#: ui_config.cc:169 ui_config.cc:308
+#: ui_config.cc:239 ui_config.cc:424
 msgid "default ui configuration file \"%1\" not loaded successfully."
 msgstr "standardbrukarflatefila \"%1\" vart ikkje lasta."
 
-#: ui_config.cc:177
+#: ui_config.cc:247
 msgid "Could not find default UI configuration file %1"
 msgstr ""
 
-#: ui_config.cc:219
+#: ui_config.cc:330
+msgid "Color file for %1 not found along %2"
+msgstr ""
+
+#: ui_config.cc:337
 msgid "Loading color file %1"
 msgstr ""
 
-#: ui_config.cc:222
+#: ui_config.cc:340
 msgid "cannot read color file \"%1\""
 msgstr ""
 
-#: ui_config.cc:227
+#: ui_config.cc:345
 msgid "color file \"%1\" not loaded successfully."
 msgstr ""
 
-#: ui_config.cc:233
-msgid "Color file %1 not found"
-msgstr ""
-
-#: ui_config.cc:282 ui_config.cc:361
+#: ui_config.cc:397 ui_config.cc:480
 msgid "Color file %1 not saved"
 msgstr ""
 
-#: ui_config.cc:317
+#: ui_config.cc:433
 msgid "Loading user ui configuration file %1"
 msgstr "Lastar eigenvald brukarflatefil %1"
 
-#: ui_config.cc:320
+#: ui_config.cc:436
 msgid "cannot read ui configuration file \"%1\""
 msgstr "greier ikkje lesa brukarflatefila \"%1\""
 
-#: ui_config.cc:325
+#: ui_config.cc:441
 msgid "user ui configuration file \"%1\" not loaded successfully."
 msgstr "den eigenvalde brukarflatefila \"%1\" vart ikkje lasta."
 
-#: ui_config.cc:333
+#: ui_config.cc:449
 msgid "could not find any ui configuration file, canvas will look broken."
 msgstr "finn inga grensesnitt-oppsettsfil, lerretet vil verka øydelagt."
 
-#: ui_config.cc:351
+#: ui_config.cc:470
 msgid "Config file %1 not saved"
 msgstr "Oppsettsfila %1 vart ikkje lagra"
 
-#: ui_config.cc:592
+#: ui_config.cc:715
 msgid "Color %1 not found"
 msgstr ""
 
-#: ui_config.cc:662
+#: ui_config.cc:785
 msgid "Unable to find UI style file %1 in search path %2. %3 will look strange"
 msgstr "Finn ikkje brukarflatefila %1 i søkjestigen %2. %3 vil sjå rar ut"
 
-#: utils.cc:117 utils.cc:160
+#: utils.cc:118 utils.cc:161
 msgid "bad XPM header %1"
 msgstr "Feil med XPM-tittellinja %1"
 
-#: utils.cc:577
+#: utils.cc:424
 msgid "cannot find XPM file for %1"
 msgstr "greier ikkje finna XPM-fil for %1"
 
-#: utils.cc:597 utils.cc:627 utils.cc:641
+#: utils.cc:477 utils.cc:507 utils.cc:527
 msgid "default"
 msgstr ""
 
-#: utils.cc:642
+#: utils.cc:528
 msgid "icon \"%1\" not found for icon set \"%2\", fallback to default"
 msgstr ""
 
-#: utils.cc:649
+#: utils.cc:535
 msgid "cannot find icon image for %1 using %2"
 msgstr "greier ikkje finna ikonbilete for %1 ved bruk av %2"
 
-#: utils.cc:666 utils.cc:682
+#: utils.cc:552 utils.cc:568
 msgid "Caught exception while loading icon named %1"
 msgstr "Fekk unntak når me lasta ikonet %1"
 
+#: utils.cc:818
+msgid "Overwrite"
+msgstr "Skriv over"
+
+#: vca_master_strip.cc:74 vca_time_axis.cc:49
+msgid "Solo slaves"
+msgstr ""
+
+#: vca_master_strip.cc:79 vca_time_axis.cc:55
+msgid "Mute slaves"
+msgstr ""
+
+#: vca_master_strip.cc:83
+msgid "Hide this VCA strip"
+msgstr ""
+
+#: vca_master_strip.cc:108 vca_master_strip.cc:418
+msgid "Click to show slaves only"
+msgstr ""
+
+#: vca_master_strip.cc:293
+msgid "A"
+msgstr "A"
+
+#: vca_master_strip.cc:300
+msgid "S"
+msgstr "S"
+
+#: vca_master_strip.cc:398
+msgid "Drop All Slaves"
+msgstr ""
+
+#: vca_master_strip.cc:421
+msgid "Click to show normal mixer"
+msgstr ""
+
 #: add_video_dialog.cc:54
 msgid "Set Video Track"
 msgstr ""
@@ -12648,32 +14718,48 @@ msgstr ""
 msgid " %1 fps"
 msgstr ""
 
-#: video_timeline.cc:468
+#: vca_time_axis.cc:60
+msgid "D"
+msgstr "D"
+
+#: vca_time_axis.cc:61
+msgid "Unassign all slaves"
+msgstr ""
+
+#: vca_time_axis.cc:65
+msgid "V"
+msgstr "V"
+
+#: vca_time_axis.cc:66
+msgid "Show only slaves"
+msgstr ""
+
+#: video_timeline.cc:472
 msgid ""
 "Parsing video file info failed. Is the Video Server running? Is the file "
 "readable by the Video Server? Does the docroot match? Is it a video file?"
 msgstr ""
 
-#: video_timeline.cc:506
+#: video_timeline.cc:510
 msgid ""
 "Failed to set session-framerate: '%1' does not have a corresponding option "
 "setting in %2."
 msgstr ""
 
-#: video_timeline.cc:514
+#: video_timeline.cc:518
 msgid ""
 "Video file's framerate is not equal to %1 session timecode's framerate: '%2' "
 "vs '%3'"
 msgstr ""
 
-#: video_timeline.cc:587
+#: video_timeline.cc:591
 msgid ""
 "Video-server docroot mismatch. %1: '%2', video-server: '%3'. This usually "
 "means that the video server was not started by %1 and uses a different "
 "document-root."
 msgstr ""
 
-#: video_timeline.cc:724
+#: video_timeline.cc:728
 msgid ""
 "Video-monitor 'xjadeo' was not found. Please install http://xjadeo.sf.net/ "
 "(a custom path to xjadeo can be specified by setting the XJREMOTE "
@@ -12683,25 +14769,25 @@ msgid ""
 "see also http://manual.ardour.org/video-timeline/setup/"
 msgstr ""
 
-#: video_timeline.cc:739
+#: video_timeline.cc:743
 msgid "Video-monitor 'xjadeo' cannot be launched."
 msgstr ""
 
-#: video_timeline.cc:766
+#: video_timeline.cc:775
 msgid ""
 "Video-monitor 'xjadeo' is too old. Please install xjadeo version 0.7.7 or "
 "later. http://xjadeo.sf.net/"
 msgstr ""
 
-#: video_monitor.cc:285
+#: video_monitor.cc:283
 msgid "Video Monitor: File Not Found."
 msgstr ""
 
 #: transcode_ffmpeg.cc:56
 msgid ""
-"No ffprobe or ffmpeg executables could be found on this system.\n"
-"Video import and export is not possible until you install those tools.\n"
+"ffmpeg installation was not found on this system.\n"
 "%1 requires ffmpeg and ffprobe from ffmpeg.org - version 1.1 or newer.\n"
+"Video import and export is not possible until you install tools.\n"
 "\n"
 "The tools are included with the %1 releases from ardour.org and also "
 "available with the video-server at http://x42.github.com/harvid/\n"
@@ -12723,7 +14809,7 @@ msgstr ""
 msgid "Output File:"
 msgstr ""
 
-#: transcode_video_dialog.cc:61 export_video_dialog.cc:85
+#: transcode_video_dialog.cc:61 export_video_dialog.cc:81
 msgid "Abort"
 msgstr ""
 
@@ -12732,10 +14818,14 @@ msgid "Height = "
 msgstr ""
 
 #: transcode_video_dialog.cc:66
+msgid "Extract LTC from audio and align video"
+msgstr ""
+
+#: transcode_video_dialog.cc:67
 msgid "Manual Override"
 msgstr ""
 
-#: transcode_video_dialog.cc:70 export_video_dialog.cc:103
+#: transcode_video_dialog.cc:71 export_video_dialog.cc:99
 msgid "Debug Mode: Print ffmpeg command and output to stdout."
 msgstr ""
 
@@ -12745,9 +14835,8 @@ msgstr ""
 
 #: transcode_video_dialog.cc:113
 msgid ""
-"No ffprobe or ffmpeg executables could be found on this system. Video Import "
-"is not possible until you install those tools. See the Log window for more "
-"information."
+"ffmpeg installation was not found. Video Import is not possible. See the Log "
+"window for more information."
 msgstr ""
 
 #: transcode_video_dialog.cc:120
@@ -12756,83 +14845,83 @@ msgid ""
 "unsupported video codec or format."
 msgstr ""
 
-#: transcode_video_dialog.cc:134
+#: transcode_video_dialog.cc:137
 msgid "FPS:"
 msgstr ""
 
-#: transcode_video_dialog.cc:136
-msgid "Duration:"
-msgstr ""
-
-#: transcode_video_dialog.cc:138
+#: transcode_video_dialog.cc:141
 msgid "Codec:"
 msgstr ""
 
-#: transcode_video_dialog.cc:140
+#: transcode_video_dialog.cc:143
 msgid "Geometry:"
 msgstr ""
 
-#: transcode_video_dialog.cc:155
+#: transcode_video_dialog.cc:158
 msgid "??"
 msgstr ""
 
-#: transcode_video_dialog.cc:176
+#: transcode_video_dialog.cc:179
 msgid "<b>Import Settings</b>"
 msgstr ""
 
-#: transcode_video_dialog.cc:181
-msgid "Reference From Current Location (Previously Transcoded Files Only)"
+#: transcode_video_dialog.cc:184
+msgid "Reference from Current Location (Previously Transcoded Files Only)"
 msgstr ""
 
-#: transcode_video_dialog.cc:183
+#: transcode_video_dialog.cc:185
 msgid "Import/Transcode Video to Session"
 msgstr ""
 
-#: transcode_video_dialog.cc:191
+#: transcode_video_dialog.cc:188 transcode_video_dialog.cc:198
 msgid "Do Not Import Video (Audio Import Only)"
 msgstr ""
 
-#: transcode_video_dialog.cc:200
+#: transcode_video_dialog.cc:208
+msgid "Do Not Import Video"
+msgstr ""
+
+#: transcode_video_dialog.cc:224
 msgid "Scale Video: Width = "
 msgstr ""
 
-#: transcode_video_dialog.cc:207
+#: transcode_video_dialog.cc:230
 msgid "Original Width"
 msgstr ""
 
-#: transcode_video_dialog.cc:222
+#: transcode_video_dialog.cc:245
 msgid "Bitrate (KBit/s):"
 msgstr ""
 
-#: transcode_video_dialog.cc:227
+#: transcode_video_dialog.cc:250
 msgid "Extract Audio:"
 msgstr ""
 
-#: transcode_video_dialog.cc:232
+#: transcode_video_dialog.cc:255
 msgid "No Audio Track Present"
 msgstr ""
 
-#: transcode_video_dialog.cc:235
+#: transcode_video_dialog.cc:258
 msgid "Do Not Extract Audio"
 msgstr ""
 
-#: transcode_video_dialog.cc:350
+#: transcode_video_dialog.cc:374
 msgid "Extracting Audio.."
 msgstr ""
 
-#: transcode_video_dialog.cc:353
+#: transcode_video_dialog.cc:377
 msgid "Audio Extraction Failed."
 msgstr ""
 
-#: transcode_video_dialog.cc:379
+#: transcode_video_dialog.cc:403
 msgid "Transcoding Video.."
 msgstr ""
 
-#: transcode_video_dialog.cc:413
+#: transcode_video_dialog.cc:437
 msgid "Transcoding Failed."
 msgstr ""
 
-#: transcode_video_dialog.cc:503
+#: transcode_video_dialog.cc:541
 msgid "Save Transcoded Video File"
 msgstr ""
 
@@ -12852,7 +14941,7 @@ msgstr ""
 msgid "Don't show this dialog again. (Reset in Edit->Preferences)."
 msgstr ""
 
-#: video_server_dialog.cc:97
+#: video_server_dialog.cc:94
 msgid ""
 "The external video server 'harvid' can not be found.\n"
 "The tool is included with the %1 releases from ardour.org, alternatively you "
@@ -12862,239 +14951,230 @@ msgid ""
 "see also http://manual.ardour.org/video-timeline/setup/"
 msgstr ""
 
-#: video_server_dialog.cc:129
+#: video_server_dialog.cc:126
 msgid "Listen Address:"
 msgstr ""
 
-#: video_server_dialog.cc:134
+#: video_server_dialog.cc:131
 msgid "Listen Port:"
 msgstr ""
 
-#: video_server_dialog.cc:139
+#: video_server_dialog.cc:136
 msgid "Cache Size:"
 msgstr ""
 
-#: video_server_dialog.cc:145
+#: video_server_dialog.cc:142
 msgid ""
 "%1 relies on an external video server for the videotimeline.\n"
 "The server configured in Edit -> Preferences -> Video is not reachable.\n"
 "Do you want %1 to launch 'harvid' on this machine?"
 msgstr ""
 
-#: video_server_dialog.cc:189
+#: video_server_dialog.cc:186
 msgid "Set Video Server Executable"
 msgstr ""
 
-#: video_server_dialog.cc:209
+#: video_server_dialog.cc:206
 msgid "Server docroot"
 msgstr ""
 
-#: utils_videotl.cc:60
+#: utils_videotl.cc:61
 msgid "Destination is outside Video Server's docroot. "
 msgstr ""
 
-#: utils_videotl.cc:61
+#: utils_videotl.cc:62
 msgid ""
 "The destination file path is outside of the Video Server's docroot. The file "
 "will not be readable by the Video Server. Do you still want to continue?"
 msgstr ""
 
-#: utils_videotl.cc:64
+#: utils_videotl.cc:65
 msgid "Continue"
 msgstr ""
 
-#: utils_videotl.cc:70
+#: utils_videotl.cc:72
 msgid "Confirm Overwrite"
 msgstr ""
 
-#: utils_videotl.cc:71
-msgid "A file with the same name already exists.  Do you want to overwrite it?"
-msgstr ""
-
-#: utils_videotl.cc:81 utils_videotl.cc:97
+#: utils_videotl.cc:82 utils_videotl.cc:98
 msgid "Cannot create video folder \"%1\" (%2)"
 msgstr ""
 
-#: export_video_dialog.cc:71
+#: export_video_dialog.cc:67
 msgid "Export Video File "
 msgstr ""
 
-#: export_video_dialog.cc:82
+#: export_video_dialog.cc:78
 msgid "Video:"
 msgstr ""
 
-#: export_video_dialog.cc:87
+#: export_video_dialog.cc:83
 msgid "Scale Video (W x H):"
 msgstr ""
 
-#: export_video_dialog.cc:88
+#: export_video_dialog.cc:84
 msgid "Retain Aspect"
 msgstr ""
 
-#: export_video_dialog.cc:93
+#: export_video_dialog.cc:89
 msgid "Set Aspect Ratio:"
 msgstr ""
 
-#: export_video_dialog.cc:94
+#: export_video_dialog.cc:90
 msgid "Normalize Audio"
 msgstr ""
 
-#: export_video_dialog.cc:95
+#: export_video_dialog.cc:91
 msgid "2 Pass Encoding"
 msgstr ""
 
-#: export_video_dialog.cc:96
+#: export_video_dialog.cc:92
 msgid "Codec Optimizations:"
 msgstr ""
 
-#: export_video_dialog.cc:98
+#: export_video_dialog.cc:94
 msgid "Deinterlace"
 msgstr ""
 
-#: export_video_dialog.cc:99
+#: export_video_dialog.cc:95
 msgid "Use [2] B-frames (MPEG 2 or 4 only)"
 msgstr ""
 
-#: export_video_dialog.cc:100
+#: export_video_dialog.cc:96
 msgid "Override FPS (Default is to retain FPS from the input video file):"
 msgstr ""
 
-#: export_video_dialog.cc:101
+#: export_video_dialog.cc:97
 msgid "Include Session Metadata"
 msgstr ""
 
-#: export_video_dialog.cc:119
+#: export_video_dialog.cc:115
 msgid ""
-"No ffprobe or ffmpeg executables could be found on this system. Video Export "
-"is not possible until you install those tools. See the Log window for more "
-"information."
+"ffmpeg installation was not found. Video Export is not possible. See the Log "
+"window for more information."
 msgstr ""
 
-#: export_video_dialog.cc:130
+#: export_video_dialog.cc:126
 msgid "<b>Output:</b> (file extension defines format)"
 msgstr ""
 
-#: export_video_dialog.cc:140
+#: export_video_dialog.cc:136
 msgid "<b>Input Video:</b>"
 msgstr ""
 
-#: export_video_dialog.cc:151
+#: export_video_dialog.cc:147
 msgid "Audio:"
 msgstr ""
 
-#: export_video_dialog.cc:153
+#: export_video_dialog.cc:149
 msgid "Master Bus"
 msgstr ""
 
-#: export_video_dialog.cc:158
+#: export_video_dialog.cc:153
 msgid "from the %1 session's start to the session's end"
 msgstr ""
 
-#: export_video_dialog.cc:161
+#: export_video_dialog.cc:156
 msgid "<b>Settings:</b>"
 msgstr ""
 
-#: export_video_dialog.cc:169
+#: export_video_dialog.cc:164
 msgid "Range:"
 msgstr ""
 
-#: export_video_dialog.cc:172
-msgid "Preset:"
-msgstr ""
-
-#: export_video_dialog.cc:175
+#: export_video_dialog.cc:170
 msgid "Video Codec:"
 msgstr ""
 
-#: export_video_dialog.cc:178
+#: export_video_dialog.cc:173
 msgid "Video KBit/s:"
 msgstr ""
 
-#: export_video_dialog.cc:181
+#: export_video_dialog.cc:176
 msgid "Audio Codec:"
 msgstr ""
 
-#: export_video_dialog.cc:184
+#: export_video_dialog.cc:179
 msgid "Audio KBit/s:"
 msgstr ""
 
-#: export_video_dialog.cc:187
+#: export_video_dialog.cc:182
 msgid "Audio Samplerate:"
 msgstr ""
 
-#: export_video_dialog.cc:222 export_video_dialog.cc:231
-#: export_video_dialog.cc:830 export_video_dialog.cc:833
+#: export_video_dialog.cc:215 export_video_dialog.cc:223
+#: export_video_dialog.cc:814 export_video_dialog.cc:817
 msgid "(default for format)"
 msgstr ""
 
-#: export_video_dialog.cc:242 export_video_dialog.cc:255
-#: export_video_dialog.cc:837 export_video_dialog.cc:846
+#: export_video_dialog.cc:233 export_video_dialog.cc:244
+#: export_video_dialog.cc:821 export_video_dialog.cc:830
 msgid "(default)"
 msgstr ""
 
-#: export_video_dialog.cc:256 export_video_dialog.cc:840
+#: export_video_dialog.cc:245 export_video_dialog.cc:824
 msgid "(retain)"
 msgstr ""
 
-#: export_video_dialog.cc:348
+#: export_video_dialog.cc:335
 msgid "from 00:00:00:00 to the video's end"
 msgstr ""
 
-#: export_video_dialog.cc:350
+#: export_video_dialog.cc:337
 msgid "from the video's start to the video's end"
 msgstr ""
 
-#: export_video_dialog.cc:353
+#: export_video_dialog.cc:340
 msgid "Selected range"
 msgstr ""
 
-#: export_video_dialog.cc:589
+#: export_video_dialog.cc:561
 msgid "Normalizing audio"
 msgstr ""
 
-#: export_video_dialog.cc:593
+#: export_video_dialog.cc:566 export_video_dialog.cc:571
 msgid "Exporting audio"
 msgstr ""
 
-#: export_video_dialog.cc:648
+#: export_video_dialog.cc:632
 msgid "Exporting Audio..."
 msgstr ""
 
-#: export_video_dialog.cc:705
+#: export_video_dialog.cc:689
 msgid ""
 "Export Video: Cannot query duration of video-file, using duration from "
 "timeline instead."
 msgstr ""
 
-#: export_video_dialog.cc:735
+#: export_video_dialog.cc:719
 msgid "Export Video: export-range does not include video."
 msgstr ""
 
-#: export_video_dialog.cc:748
+#: export_video_dialog.cc:732
 msgid "Export Video: No Master Out Ports to Connect for Audio Export"
 msgstr ""
 
-#: export_video_dialog.cc:790
+#: export_video_dialog.cc:774
 msgid "Encoding Video..."
 msgstr ""
 
-#: export_video_dialog.cc:810
+#: export_video_dialog.cc:794
 msgid "Export Video: Video input file cannot be read."
 msgstr ""
 
-#: export_video_dialog.cc:916
+#: export_video_dialog.cc:900
 msgid "Encoding Video.. Pass 1/2"
 msgstr ""
 
-#: export_video_dialog.cc:928
+#: export_video_dialog.cc:912
 msgid "Encoding Video.. Pass 2/2"
 msgstr ""
 
-#: export_video_dialog.cc:1031
+#: export_video_dialog.cc:1015
 msgid "Transcoding failed."
 msgstr ""
 
-#: export_video_dialog.cc:1267 export_video_dialog.cc:1287
+#: export_video_dialog.cc:1251 export_video_dialog.cc:1271
 msgid "Save Exported Video File"
 msgstr ""
 
@@ -13112,13 +15192,379 @@ msgstr ""
 
 #: export_video_infobox.cc:51
 msgid ""
+"%1 does not include commercial licenses for encoding audio/video. Visit "
+"mpegla.com for information about licensing various audio/video codecs.\n"
+"\n"
 "Video encoding is a non-trivial task with many details.\n"
 "\n"
-"Please see the manual at %1/video-timeline/operations/#export.\n"
+"Please see the manual at %2/video-timeline/operations/#export.\n"
 "\n"
 "Open Manual in Browser? "
 msgstr ""
 
+#~ msgid "Busses"
+#~ msgstr "Bussar"
+
+#~ msgid "Display model"
+#~ msgstr "Visingsmodell"
+
+#~ msgid "Composite graphs for each track"
+#~ msgstr "Samansette grafar for kvart spor"
+
+#~ msgid "Composite graph of all tracks"
+#~ msgstr "Samansett graf for alle spor"
+
+#~ msgid "Normalize values"
+#~ msgstr "Normaliser verdiar"
+
+#~ msgid "Locations"
+#~ msgstr "Stader"
+
+#~ msgid ""
+#~ "A snapshot already exists with that name.  Do you want to overwrite it?"
+#~ msgstr "Dette snøggbiletet finst frå før. Vil du skriva over det?"
+
+#~ msgid "Playhead follows Range Selections and Edits"
+#~ msgstr "Spelehovudet fylgjer områdeval og redigeringar"
+
+#~ msgid ""
+#~ "When active, auditioning is taking place\n"
+#~ "Click to stop the audition"
+#~ msgstr ""
+#~ "Når knappen er trykt inn, blir noko lytta på.\n"
+#~ "Klikk for å slå av lyttinga."
+
+#~ msgid "This screen is not tall enough to display the mixer window"
+#~ msgstr "Denne skjermen er ikkje høg nok til å visa miksarvindauga"
+
+#~ msgid "Snapshot..."
+#~ msgstr "Snøggbilete..."
+
+#~ msgid "Export To Audio File(s)..."
+#~ msgstr "Eksporter økta til lydfil(er)..."
+
+#~ msgid "Show Toolbars"
+#~ msgstr "Vis verktylinene"
+
+#~ msgid "Reference"
+#~ msgstr "Referanse"
+
+#~ msgid "Transition To Roll"
+#~ msgstr "Overgang til rulling"
+
+#~ msgid "Transition To Reverse"
+#~ msgstr "Overgang til baklengs"
+
+#~ msgid "Set From Playhead"
+#~ msgstr "Set ut frå spelehovudet"
+
+#~ msgid "Fill Range with Region"
+#~ msgstr "Fyll området med bolken"
+
+#~ msgid "Consolidate Range With Processing"
+#~ msgstr "Sikra området med prosessering"
+
+#~ msgid "Bounce Range to Region List With Processing"
+#~ msgstr "Miks ned området til bolkliste med prosessering"
+
+#~ msgid "Play From Edit Point"
+#~ msgstr "Spel frå redigeringspunktet"
+
+#~ msgid "Play From Start"
+#~ msgstr "Spel frå starten"
+
+#~ msgid "Zoom focus"
+#~ msgstr "Zoom-fokus"
+
+#~ msgid "Break drag or deselect all"
+#~ msgstr "Bryt og dra eller vel ingen"
+
+#~ msgid "Playhead To Next Grid"
+#~ msgstr "Spelehovudet til neste gitter"
+
+#~ msgid "Playhead To Previous Grid"
+#~ msgstr "Spelehovudet til førre gitter"
+
+#~ msgid "Import From Session"
+#~ msgstr "Importer frå økt"
+
+#~ msgid "Show Logo"
+#~ msgstr "Vis logo"
+
+#~ msgid "Loaded editor bindings from %1"
+#~ msgstr "Lastar redigerinsbindingar frå %1"
+
+#~ msgid "Could not find editor.bindings in search path %1"
+#~ msgstr "Fann ikkje editor.bindings i søkjestigen %1"
+
+#~ msgid "Snap Position To Grid"
+#~ msgstr "Fest posisjonen til gitteret"
+
+#~ msgid "Insert Region From Region List"
+#~ msgstr "Set inn bolk frå lista"
+
+#~ msgid "group|G"
+#~ msgstr "Gruppe|G"
+
+#~ msgid "relative|Rel"
+#~ msgstr "Relativt|Rel"
+
+#~ msgid "mute|M"
+#~ msgstr "Demp|D"
+
+#~ msgid "solo|S"
+#~ msgstr "Solo|S"
+
+#~ msgid "monitoring|Mon"
+#~ msgstr "Lytting|Mon"
+
+#~ msgid "selection|Sel"
+#~ msgstr "Utval|Val"
+
+#~ msgid "active|A"
+#~ msgstr "aktiv|A"
+
+#~ msgid "File Exists!"
+#~ msgstr "Fila eksisterer!"
+
+#~ msgid "Overwrite Existing File"
+#~ msgstr "Skriv over eksisterande fil"
+
+#~ msgid "End point trim"
+#~ msgstr "Skjer sluttpunkt"
+
+#~ msgid "duplicate selection"
+#~ msgstr "klon utvalet"
+
+#~ msgid "tracks"
+#~ msgstr "spor"
+
+#~ msgid "busses"
+#~ msgstr "bussar"
+
+#~ msgid "L"
+#~ msgstr "V"
+
+#~ msgid "G"
+#~ msgstr "G"
+
+#~ msgid "O"
+#~ msgstr "O"
+
+#~ msgid "I"
+#~ msgstr "I"
+
+#~ msgid "R"
+#~ msgstr "R"
+
+#~ msgid "SI"
+#~ msgstr "SI"
+
+#~ msgid "Show Tracks With Regions Under Playhead"
+#~ msgstr "Vis spor med bolkar under spelehovudet"
+
+#~ msgid "<i>Build filename(s) from these components:</i>"
+#~ msgstr "<i>Lag filnamn av desse byggeklossane:</i>"
+
+#~ msgid "<small><i>Current (approximate) filename: \"%1\"</i></small>"
+#~ msgstr "<small><i>(Omtrentleg) filnamn: \"%1\"</i></small>"
+
+#~ msgid "Create New Group From"
+#~ msgstr "Lag ny gruppe frå"
+
+#~ msgid "Insert time on all the track's playlists"
+#~ msgstr "Set inn tid på alle spelelistene til sporet"
+
+#~ msgid "Select an action, then press the key(s) to (re)set its shortcut"
+#~ msgstr ""
+#~ "Vel ei handling. Så trykkjer du tasten/tastane som skal utføra handlinga."
+
+#~ msgid "Main_menu"
+#~ msgstr "Hovud_meny"
+
+#~ msgid "redirectmenu"
+#~ msgstr "omdirigeringsmeny"
+
+#~ msgid "Editor_menus"
+#~ msgstr "Redigerings_menyar"
+
+#~ msgid "ProcessorMenu"
+#~ msgstr "Prosessormeny"
+
+#~ msgid "Copyright (C) 1999-2012 Paul Davis"
+#~ msgstr "Copyright (C) 1999-2012 Paul Davis"
+
+#~ msgid "Loaded mixer bindings from %1"
+#~ msgstr "Lasta miksarbindingar frå %1"
+
+#~ msgid "Could not find mixer.bindings in search path %1"
+#~ msgstr "Fann ikkje mixer.bindings i søkjestigen %1"
+
+#~ msgid "*Comments*"
+#~ msgstr "*Kommentarar*"
+
+#~ msgid "*Cmt*"
+#~ msgstr "*Kmt*"
+
+#~ msgid "Click to Add/Edit Comments"
+#~ msgstr "Klikk for å leggja til/redigera kommentarar"
+
+#~ msgid "Remote Control ID..."
+#~ msgstr "Fjernstyrings-ID..."
+
+#~ msgid ""
+#~ "  -k, --keybindings filename  Name of key bindings to load (default is ~/."
+#~ "ardour3/ardour.bindings)\n"
+#~ msgstr ""
+#~ "  -k, --keybindings-filename      Namn på snøggtastfil som skal lastast "
+#~ "(standard er ~/.ardour3/ardour.bindings)\n"
+
+#~ msgid "Update available plugins"
+#~ msgstr "Oppdater utvidingar"
+
+#~ msgid "alsa_pcm"
+#~ msgstr "alsa_pcm"
+
+#~ msgid ""
+#~ "It is not possible to add a port here, as the first processor in the "
+#~ "track or buss cannot support the new configuration."
+#~ msgstr ""
+#~ "Du kan ikkje leggja til ein port her, fordi den fyrste signalprosessen på "
+#~ "sporet eller bussen ikkje godtek det nye oppsettet."
+
+#~ msgid "Keyboard layout:"
+#~ msgstr "Tastaturutforming:"
+
+#~ msgid "Font scaling:"
+#~ msgstr "Skriftskalering:"
+
+#~ msgid "Double-click on a name to edit settings for an enabled protocol"
+#~ msgstr ""
+#~ "Dobbelklikk på eit namn for å redigera innstillingane for ein aktiv "
+#~ "protokoll"
+
+#~ msgid "Sync/Slave"
+#~ msgstr "Synk/slave"
+
+#~ msgid "only in region gain mode"
+#~ msgstr "berre i bolkvolum-modus"
+
+#~ msgid "Show zoom toolbar"
+#~ msgstr "Vis zoom-verktylina"
+
+#~ msgid "Synchronise editor and mixer selection"
+#~ msgstr "Samkøyr redigeringa og miksarvalet"
+
+#~ msgid "Solo / mute"
+#~ msgstr "Solo / demp"
+
+#~ msgid "Sound MIDI notes as they are selected"
+#~ msgstr "Lytt på MIDI-notar medan du vel dei"
+
+#~ msgid "Control surface remote ID"
+#~ msgstr "Fjernstyrings-ID for kontrollflate"
+
+#~ msgid "assigned by user"
+#~ msgstr "fastsett av brukaren"
+
+#~ msgid "follows order of mixer"
+#~ msgstr "fylgjer miksaren"
+
+#~ msgid "Trigger gap"
+#~ msgstr "Brytargap"
+
+#~ msgid "You cannot create a track with that name as it is reserved for %1"
+#~ msgstr ""
+#~ "Du kan ikkje laga eit spor med det namnet, fordi det er halde att for %1"
+
+#~ msgid "Select From All..."
+#~ msgstr "Vel frå alt..."
+
+#~ msgid ""
+#~ "Do you really want to remove track \"%1\" ?\n"
+#~ "\n"
+#~ "You may also lose the playlist used by this track.\n"
+#~ "\n"
+#~ "(This action cannot be undone, and the session file will be overwritten)"
+#~ msgstr ""
+#~ "Vil du verkeleg sletta sporet \"%1\"?\n"
+#~ "\n"
+#~ "Det kan hende du mistar spelelister for sporet òg.\n"
+#~ "\n"
+#~ "(Du kan ikkje angra dette, og øktfila vil bli overskriven)"
+
+#~ msgid ""
+#~ "Do you really want to remove bus \"%1\" ?\n"
+#~ "\n"
+#~ "(This action cannot be undone, and the session file will be overwritten)"
+#~ msgstr ""
+#~ "Vil du verkeleg sletta bussen \"%1\"?\n"
+#~ "\n"
+#~ "(Du kan ikkje angra, og øktfila vil bli overskriven!)"
+
+#~ msgid "Remove track"
+#~ msgstr "Fjern spor"
+
+#~ msgid "Remove bus"
+#~ msgstr "Fjern buss"
+
+#~ msgid "Remote Control ID"
+#~ msgstr "Fjernstyrings-ID"
+
+#~ msgid "Remote control ID:"
+#~ msgstr "Fjernstyrings-ID:"
+
+#~ msgid ""
+#~ "The remote control ID of %1 is: %2\n"
+#~ "\n"
+#~ "\n"
+#~ "The remote control ID of %3 cannot be changed."
+#~ msgstr ""
+#~ "Fjernkontroll-IDen for %1 er: %2\n"
+#~ "\n"
+#~ "\n"
+#~ "Du kan ikkje endra fjernkontroll-IDen for %3."
+
+#~ msgid "the master bus"
+#~ msgstr "hovudbussen"
+
+#~ msgid "the monitor bus"
+#~ msgstr "lyttebussen"
+
+#~ msgid ""
+#~ "Left-click to invert (phase reverse) channel %1 of this track.  Right-"
+#~ "click to show menu."
+#~ msgstr ""
+#~ "Venstreklikk for å fasevenda kanal %1 på dette sporet. Høgreklikk for å "
+#~ "sjå menyen."
+
+#~ msgid "Click to show a menu of channels for inversion (phase reverse)"
+#~ msgstr "Klikk for å visa ein meny over kanalar å invertera (fasevenda)"
+
+#~ msgid "Broadcast WAVE"
+#~ msgstr "Kringkast-WAVE"
+
+#~ msgid "WAVE"
+#~ msgstr "WAVE"
+
+#~ msgid "Press to import selected files and close this window"
+#~ msgstr "Trykk for å importera filene og lukka dette vindauga"
+
+#~ msgid "Press to import selected files and leave this window open"
+#~ msgstr "Press for å importera filene og la dette vindauga vera ope"
+
+#~ msgid "<b>Add files as ...</b>"
+#~ msgstr "<b>Legg til filer som ...</b>"
+
+#~ msgid "Dark Theme"
+#~ msgstr "Mørk bunad"
+
+#~ msgid "Light Theme"
+#~ msgstr "Lys bunad"
+
+#~ msgid "Contents:"
+#~ msgstr "Innhald:"
+
 #~ msgid ""
 #~ "%1\n"
 #~ "(built from revision %2)"
diff --git a/gtk2_ardour/po/pl.mo b/gtk2_ardour/po/pl.mo
new file mode 100644
index 0000000..414d3a0
Binary files /dev/null and b/gtk2_ardour/po/pl.mo differ
diff --git a/gtk2_ardour/po/pl.po b/gtk2_ardour/po/pl.po
index 8aede27..9d2a9a7 100644
--- a/gtk2_ardour/po/pl.po
+++ b/gtk2_ardour/po/pl.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: gtk2_ardour\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-03-31 20:13-0400\n"
+"POT-Creation-Date: 2016-07-14 06:20-0400\n"
 "PO-Revision-Date: 2008-04-10 10:47+0100\n"
 "Last-Translator: Piotr Zaryk <pzaryk at gmail.com>\n"
 "Language-Team: Polish <pzaryk at gmail.com>\n"
@@ -20,255 +20,287 @@ msgstr ""
 "X-Poedit-Language: Polish\n"
 "X-Poedit-Country: POLAND\n"
 
-#: about.cc:125
+#: about.cc:127
+msgid "Fons Adriaensen"
+msgstr ""
+
+#: about.cc:128
 msgid "Brian Ahr"
 msgstr "Brian Ahr"
 
-#: about.cc:126
+#: about.cc:129
 msgid "John Anderson"
 msgstr "John Anderson"
 
-#: about.cc:127
+#: about.cc:130
 msgid "Marcus Andersson"
 msgstr "Marcus Andersson"
 
-#: about.cc:128
+#: about.cc:131
 msgid "Nedko Arnaudov"
 msgstr "Nedko Arnaudov"
 
-#: about.cc:129
+#: about.cc:132
 msgid "Hans Baier"
 msgstr ""
 
-#: about.cc:130
+#: about.cc:133
 msgid "Ben Bell"
 msgstr "Ben Bell"
 
-#: about.cc:131
+#: about.cc:134
 msgid "Sakari Bergen"
 msgstr ""
 
-#: about.cc:132
+#: about.cc:135
 msgid "Christian Borss"
 msgstr ""
 
-#: about.cc:133
+#: about.cc:136
 msgid "Chris Cannam"
 msgstr ""
 
-#: about.cc:134
+#: about.cc:137
 msgid "Jeremy Carter"
 msgstr ""
 
-#: about.cc:135
+#: about.cc:138
 msgid "Jesse Chappell"
 msgstr "Jesse Chappell"
 
-#: about.cc:136
+#: about.cc:139
 msgid "Thomas Charbonnel"
 msgstr "Thomas Charbonnel"
 
-#: about.cc:137
+#: about.cc:140
 msgid "Sam Chessman"
 msgstr "Sam Chessman"
 
-#: about.cc:138
+#: about.cc:141
 msgid "André Colomb"
 msgstr ""
 
-#: about.cc:139
+#: about.cc:142
 msgid "Paul Davis"
 msgstr "Paul Davis"
 
-#: about.cc:140
+#: about.cc:143
 msgid "Gerard van Dongen"
 msgstr "Gerard van Dongen"
 
-#: about.cc:141
+#: about.cc:144
 msgid "John Emmas"
 msgstr ""
 
-#: about.cc:142
+#: about.cc:145
 msgid "Colin Fletcher"
 msgstr "Colin Fletcher"
 
-#: about.cc:143
+#: about.cc:146
 msgid "Dave Flick"
 msgstr ""
 
-#: about.cc:144
+#: about.cc:147
 msgid "Hans Fugal"
 msgstr "Hans Fugal"
 
-#: about.cc:145
+#: about.cc:148
 msgid "Robin Gareus"
 msgstr ""
 
-#: about.cc:146
+#: about.cc:149
+msgid "Nil Geisweiller"
+msgstr ""
+
+#: about.cc:150
 msgid "Christopher George"
 msgstr "Christopher George"
 
-#: about.cc:147
+#: about.cc:151
 msgid "Chris Goddard"
 msgstr ""
 
-#: about.cc:148
+#: about.cc:152
 msgid "J. Abelardo Gutierrez"
 msgstr ""
 
-#: about.cc:149
+#: about.cc:153
 msgid "Jeremy Hall"
 msgstr "Jeremy Hall"
 
-#: about.cc:150
+#: about.cc:154
 msgid "Audun Halland"
 msgstr "Audun Halland"
 
-#: about.cc:151
+#: about.cc:155
 msgid "David Halter"
 msgstr ""
 
-#: about.cc:152
+#: about.cc:156
 msgid "Steve Harris"
 msgstr "Steve Harris"
 
-#: about.cc:153
+#: about.cc:157
 msgid "Melvin Ray Herr"
 msgstr ""
 
-#: about.cc:154
+#: about.cc:158
 msgid "Carl Hetherington"
 msgstr "Carl Hetherington"
 
-#: about.cc:155
+#: about.cc:159
 msgid "Rob Holland"
 msgstr "Rob Holland"
 
-#: about.cc:156
+#: about.cc:160
 msgid "Robert Jordens"
 msgstr "Robert Jordens"
 
-#: about.cc:157
+#: about.cc:161
 msgid "Stefan Kersten"
 msgstr "Stefan Kersten"
 
-#: about.cc:158
+#: about.cc:162
 msgid "Armand Klenk"
 msgstr "Armand Klenk"
 
-#: about.cc:159
+#: about.cc:163
 msgid "Julien de Kozak"
 msgstr ""
 
-#: about.cc:160
+#: about.cc:164
 msgid "Matt Krai"
 msgstr "Matt Krai"
 
-#: about.cc:161
+#: about.cc:165
 msgid "Georg Krause"
 msgstr ""
 
-#: about.cc:162
+#: about.cc:166
 msgid "Nick Lanham"
 msgstr ""
 
-#: about.cc:163
+#: about.cc:167
 msgid "Colin Law"
 msgstr "Colin Law"
 
-#: about.cc:164
+#: about.cc:168
 msgid "Joshua Leach"
 msgstr "Joshua Leach"
 
-#: about.cc:165
+#: about.cc:169
 msgid "Ben Loftis"
 msgstr "Ben Loftis"
 
-#: about.cc:166
+#: about.cc:170
 msgid "Nick Mainsbridge"
 msgstr "Nick Mainsbridge"
 
-#: about.cc:167
+#: about.cc:171
 msgid "Tim Mayberry"
 msgstr "Tim Mayberry"
 
-#: about.cc:168
+#: about.cc:172
 msgid "Doug Mclain"
 msgstr "Doug Mclain"
 
-#: about.cc:169
+#: about.cc:173
 msgid "Todd Naugle"
 msgstr ""
 
-#: about.cc:170
+#: about.cc:174
+msgid "André Nusser"
+msgstr ""
+
+#: about.cc:175
+msgid "Bent Bisballe Nyeng"
+msgstr ""
+
+#: about.cc:176
 msgid "Jack O'Quin"
 msgstr "Jack O'Quin"
 
-#: about.cc:171
+#: about.cc:177
+msgid "Pavel Potocek"
+msgstr ""
+
+#: about.cc:178
 msgid "Nimal Ratnayake"
 msgstr "Nimal Ratnayake"
 
-#: about.cc:172
+#: about.cc:179
+msgid "Julien Rivaud"
+msgstr ""
+
+#: about.cc:180
 msgid "David Robillard"
 msgstr "David Robillard"
 
-#: about.cc:173
+#: about.cc:181
+msgid "Julien Roger"
+msgstr ""
+
+#: about.cc:182
 msgid "Taybin Rutkin"
 msgstr "Taybin Rutkin"
 
-#: about.cc:174
+#: about.cc:183
 msgid "Andreas Ruge"
 msgstr ""
 
-#: about.cc:175
+#: about.cc:184
 msgid "Sampo Savolainen"
 msgstr "Sampo Savolainen"
 
-#: about.cc:176
+#: about.cc:185
 msgid "Rodrigo Severo"
 msgstr ""
 
-#: about.cc:177
+#: about.cc:186
 msgid "Per Sigmond"
 msgstr "Per Sigmond"
 
-#: about.cc:178
+#: about.cc:187
 msgid "Lincoln Spiteri"
 msgstr ""
 
-#: about.cc:179
+#: about.cc:188
 msgid "Mike Start"
 msgstr ""
 
-#: about.cc:180
+#: about.cc:189
 msgid "Mark Stewart"
 msgstr "Mark Stewart"
 
-#: about.cc:181
+#: about.cc:190
 msgid "Roland Stigge"
 msgstr "Roland Stigge"
 
-#: about.cc:182
+#: about.cc:191
 msgid "Petter Sundlöf"
 msgstr "Petter Sundlöf"
 
-#: about.cc:183
+#: about.cc:192
 msgid "Mike Täht"
 msgstr "Mike Täht"
 
-#: about.cc:184
+#: about.cc:193
 msgid "Roy Vegard"
 msgstr ""
 
-#: about.cc:185
+#: about.cc:194
 msgid "Thorsten Wilms"
 msgstr "Thorsten Wilms"
 
-#: about.cc:186
+#: about.cc:195
+msgid "Damien Zammit"
+msgstr ""
+
+#: about.cc:196
 msgid "Grygorii Zharun"
 msgstr ""
 
-#: about.cc:191
+#: about.cc:201
 msgid ""
 "French:\n"
 "\tAlain Fréhel <alain.frehel at free.fr>\n"
@@ -277,7 +309,7 @@ msgid ""
 "\tRomain Arnaud <roming22 at gmail.com>\n"
 msgstr ""
 
-#: about.cc:192
+#: about.cc:202
 msgid ""
 "German:\n"
 "\tKarsten Petersen <kapet at kapet.de>\n"
@@ -289,14 +321,14 @@ msgid ""
 "\tRobin Gloster <robin at loc-com.de>\n"
 msgstr ""
 
-#: about.cc:199
+#: about.cc:209
 msgid ""
 "Italian:\n"
 "\tFilippo Pappalardo <filippo at email.it>\n"
 "\tRaffaele Morelli <raffaele.morelli at gmail.com>\n"
 msgstr ""
 
-#: about.cc:200
+#: about.cc:210
 msgid ""
 "Portuguese:\n"
 "\tRui Nuno Capela <rncbc at rncbc.org>\n"
@@ -304,7 +336,7 @@ msgstr ""
 "Portuguese:\n"
 "\tRui Nuno Capela <rncbc at rncbc.org>\n"
 
-#: about.cc:201
+#: about.cc:211
 msgid ""
 "Brazilian Portuguese:\n"
 "\tAlexander da Franca Fernandes <alexander at nautae.eti.br>\n"
@@ -314,21 +346,21 @@ msgstr ""
 "\tAlexander da Franca Fernandes <alexander at nautae.eti.br>\n"
 "\tChris Ross <chris at tebibyte.org>\n"
 
-#: about.cc:203
+#: about.cc:213
 msgid ""
 "Spanish:\n"
 "\t Alex Krohn <alexkrohn at fastmail.fm>\n"
 "\tPablo Fernández <pablo.fbus at gmail.com>\n"
 msgstr ""
 
-#: about.cc:204
+#: about.cc:214
 msgid ""
 "Russian:\n"
 "\t Igor Blinov <pitstop at nm.ru>\n"
 "\tAlexandre Prokoudine <alexandre.prokoudine at gmail.com>\n"
 msgstr ""
 
-#: about.cc:206
+#: about.cc:216
 msgid ""
 "Greek:\n"
 "\t Klearchos Gourgourinis <muadib at in.gr>\n"
@@ -336,170 +368,224 @@ msgstr ""
 "Greek:\n"
 "\t Klearchos Gourgourinis <muadib at in.gr>\n"
 
-#: about.cc:207
+#: about.cc:217
 msgid ""
 "Swedish:\n"
 "\t Petter Sundlöf <petter.sundlof at gmail.com>\n"
 msgstr ""
 
-#: about.cc:208
+#: about.cc:218
 msgid ""
 "Polish:\n"
 "\t Piotr Zaryk <pzaryk at gmail.com>\n"
 msgstr ""
 
-#: about.cc:209
+#: about.cc:219
 msgid ""
 "Czech:\n"
 "\t Pavel Fric <pavelfric at seznam.cz>\n"
 msgstr ""
 
-#: about.cc:210
+#: about.cc:220
 msgid ""
 "Norwegian:\n"
 "\t Eivind Ødegård\n"
 msgstr ""
 
-#: about.cc:211
+#: about.cc:221
 msgid ""
 "Chinese:\n"
 "\t Rui-huai Zhang <zrhzrh at mail.ustc.edu.cn>\n"
 msgstr ""
 
-#: about.cc:591
+#: about.cc:601
+msgid "Intel 64-bit"
+msgstr ""
+
+#: about.cc:603
+msgid "Intel 32-bit"
+msgstr ""
+
+#: about.cc:605
+msgid "PowerPC 64-bit"
+msgstr ""
+
+#: about.cc:607
+msgid "PowerPC 32-bit"
+msgstr ""
+
+#: about.cc:609
+msgid "64-bit"
+msgstr ""
+
+#: about.cc:611
+msgid "32-bit"
+msgstr ""
+
+#: about.cc:619
+msgid " - debug"
+msgstr ""
+
+#: about.cc:625
 msgid "Copyright (C) 1999-2015 Paul Davis\n"
 msgstr ""
 
-#: about.cc:595
+#: about.cc:629
 msgid "http://ardour.org/"
 msgstr ""
 
-#: about.cc:596
+#: about.cc:630
 msgid ""
 "%1%2\n"
-"(built from revision %3)"
+"(rev %3)\n"
+"%4%5"
 msgstr ""
 
-#: about.cc:600
+#: about.cc:635
 msgid "Config"
 msgstr ""
 
-#: actions.cc:85
+#: actions.cc:83
 msgid "Loading menus from %1"
 msgstr ""
 
-#: actions.cc:88 actions.cc:89
+#: actions.cc:86 actions.cc:87
 msgid "badly formatted menu definition file: %1"
 msgstr ""
 
-#: actions.cc:91
+#: actions.cc:89
 msgid "%1 menu definition file not found"
 msgstr ""
 
-#: actions.cc:95 actions.cc:96
+#: actions.cc:93 actions.cc:94
 msgid "%1 will not work without a valid menu definition file"
 msgstr ""
 
-#: add_route_dialog.cc:54 route_params_ui.cc:524
-msgid "Add Track or Bus"
+#: add_route_dialog.cc:58
+msgid "Add Track/Bus/VCA"
 msgstr ""
 
-#: add_route_dialog.cc:57
+#: add_route_dialog.cc:61
 msgid "Configuration:"
 msgstr ""
 
-#: add_route_dialog.cc:58
+#: add_route_dialog.cc:62
 msgid "Record Mode:"
 msgstr ""
 
-#: add_route_dialog.cc:59
+#: add_route_dialog.cc:63
 msgid "Instrument:"
 msgstr ""
 
-#: add_route_dialog.cc:77
+#: add_route_dialog.cc:77 add_route_dialog.cc:228
 msgid "Audio Tracks"
 msgstr ""
 
-#: add_route_dialog.cc:78 add_route_dialog.cc:209
+#: add_route_dialog.cc:78 add_route_dialog.cc:224
 msgid "MIDI Tracks"
 msgstr ""
 
-#: add_route_dialog.cc:79 add_route_dialog.cc:211
+#: add_route_dialog.cc:79 add_route_dialog.cc:226
 msgid "Audio+MIDI Tracks"
 msgstr ""
 
-#: add_route_dialog.cc:80 add_route_dialog.cc:207
-msgid "Busses"
+#: add_route_dialog.cc:80 add_route_dialog.cc:220
+msgid "Audio Busses"
+msgstr ""
+
+#: add_route_dialog.cc:81 add_route_dialog.cc:222
+msgid "MIDI Busses"
+msgstr ""
+
+#: add_route_dialog.cc:82
+msgid "VCA Masters"
 msgstr ""
 
-#: add_route_dialog.cc:83 add_route_dialog.cc:559
+#: add_route_dialog.cc:85 add_route_dialog.cc:622
 msgid "First"
 msgstr ""
 
-#: add_route_dialog.cc:84 add_route_dialog.cc:561
-msgid "After Editor Selection"
+#: add_route_dialog.cc:86 add_route_dialog.cc:626
+msgid "Before Selection"
 msgstr ""
 
-#: add_route_dialog.cc:85 add_route_dialog.cc:563
-msgid "After Mixer Selection"
+#: add_route_dialog.cc:87 add_route_dialog.cc:624
+msgid "After Selection"
 msgstr ""
 
-#: add_route_dialog.cc:86
+#: add_route_dialog.cc:88
 msgid "Last"
 msgstr ""
 
-#: add_route_dialog.cc:103
+#: add_route_dialog.cc:91
+msgid "Flexible-I/O"
+msgstr ""
+
+#: add_route_dialog.cc:92
+msgid "Strict-I/O"
+msgstr ""
+
+#: add_route_dialog.cc:108
 msgid "Add:"
 msgstr ""
 
-#: add_route_dialog.cc:116 time_fx_dialog.cc:91 add_video_dialog.cc:135
-#: video_server_dialog.cc:121
+#: add_route_dialog.cc:121 time_fx_dialog.cc:101 add_video_dialog.cc:135
+#: video_server_dialog.cc:118
 msgid "<b>Options</b>"
 msgstr ""
 
-#: add_route_dialog.cc:126 bundle_manager.cc:193 region_editor.cc:50
-#: route_group_dialog.cc:71
+#: add_route_dialog.cc:131 bundle_manager.cc:193 region_editor.cc:52
+#: route_group_dialog.cc:70
 msgid "Name:"
 msgstr ""
 
-#: add_route_dialog.cc:156
+#: add_route_dialog.cc:155
 msgid "Group:"
 msgstr ""
 
-#: add_route_dialog.cc:162
+#: add_route_dialog.cc:161
 msgid "Insert:"
 msgstr ""
 
-#: add_route_dialog.cc:223 add_route_dialog.cc:232 add_route_dialog.cc:306
-#: ardour_ui_ed.cc:539 engine_dialog.cc:237 rc_option_editor.cc:1805
-#: rc_option_editor.cc:1807 rc_option_editor.cc:1809 rc_option_editor.cc:1827
-#: rc_option_editor.cc:1829 rc_option_editor.cc:1837 rc_option_editor.cc:1839
-#: rc_option_editor.cc:1857 rc_option_editor.cc:1870 rc_option_editor.cc:1872
-#: rc_option_editor.cc:1874 rc_option_editor.cc:1919 rc_option_editor.cc:1921
-#: rc_option_editor.cc:1923 rc_option_editor.cc:1931 rc_option_editor.cc:1939
-#: rc_option_editor.cc:1941 rc_option_editor.cc:1949
+#: add_route_dialog.cc:171
+msgid "Output Ports:"
+msgstr ""
+
+#: add_route_dialog.cc:176 rc_option_editor.cc:2474
+msgid ""
+"With strict-i/o enabled, Effect Processors will not modify the number of "
+"channels on a track. The number of output channels will always match the "
+"number of input channels."
+msgstr ""
+
+#: add_route_dialog.cc:240 add_route_dialog.cc:351 ardour_ui_ed.cc:636
+#: engine_dialog.cc:244 plugin_pin_dialog.cc:67 rc_option_editor.cc:2397
+#: rc_option_editor.cc:2399 rc_option_editor.cc:2401 rc_option_editor.cc:2419
+#: rc_option_editor.cc:2421 rc_option_editor.cc:2429 rc_option_editor.cc:2432
+#: rc_option_editor.cc:2450 rc_option_editor.cc:2463 rc_option_editor.cc:2472
+#: rc_option_editor.cc:2478 rc_option_editor.cc:2480 rc_option_editor.cc:2525
+#: rc_option_editor.cc:2527 rc_option_editor.cc:2529 rc_option_editor.cc:2537
 msgid "Audio"
 msgstr ""
 
-#: add_route_dialog.cc:224 add_route_dialog.cc:235 add_route_dialog.cc:307
-#: editor_actions.cc:109 engine_dialog.cc:239 missing_file_dialog.cc:56
-#: rc_option_editor.cc:2084 rc_option_editor.cc:2094 rc_option_editor.cc:2102
-#: rc_option_editor.cc:2110 rc_option_editor.cc:2119 rc_option_editor.cc:2127
-#: rc_option_editor.cc:2135 rc_option_editor.cc:2143 rc_option_editor.cc:2152
-#: rc_option_editor.cc:2161 rc_option_editor.cc:2170 rc_option_editor.cc:2178
-#: rc_option_editor.cc:2186 rc_option_editor.cc:2194 rc_option_editor.cc:2217
+#: add_route_dialog.cc:243 add_route_dialog.cc:352 editor_actions.cc:112
+#: engine_dialog.cc:246 missing_file_dialog.cc:60 mixer_ui.cc:1895
+#: plugin_pin_dialog.cc:68 rc_option_editor.cc:2672 rc_option_editor.cc:2674
+#: rc_option_editor.cc:2684 rc_option_editor.cc:2693 rc_option_editor.cc:2701
+#: rc_option_editor.cc:2709 rc_option_editor.cc:2717 rc_option_editor.cc:2790
+#: rc_option_editor.cc:2813
 msgid "MIDI"
 msgstr "MIDI"
 
-#: add_route_dialog.cc:225 add_route_dialog.cc:238 add_route_dialog.cc:308
+#: add_route_dialog.cc:246 add_route_dialog.cc:353
 msgid "Audio+MIDI"
 msgstr ""
 
-#: add_route_dialog.cc:226 add_route_dialog.cc:241 add_route_dialog.cc:309
+#: add_route_dialog.cc:250 add_route_dialog.cc:354
 msgid "Bus"
 msgstr ""
 
-#: add_route_dialog.cc:268
+#: add_route_dialog.cc:286
 msgid ""
 "Audio+MIDI tracks are intended for use <b>ONLY</b> with plugins that use "
 "both audio and MIDI input data\n"
@@ -508,60 +594,61 @@ msgid ""
 "track instead."
 msgstr ""
 
-#: add_route_dialog.cc:327 add_route_dialog.cc:346 editor_actions.cc:422
-#: editor_rulers.cc:251 time_axis_view.cc:1374
+#: add_route_dialog.cc:373 add_route_dialog.cc:385 editor_actions.cc:456
+#: editor_rulers.cc:250 time_axis_view.cc:1290
 msgid "Normal"
 msgstr "Normalny"
 
-#: add_route_dialog.cc:330 add_route_dialog.cc:348
+#: add_route_dialog.cc:374 add_route_dialog.cc:387
 msgid "Non Layered"
 msgstr ""
 
-#: add_route_dialog.cc:331 add_route_dialog.cc:350
+#: add_route_dialog.cc:375 add_route_dialog.cc:389
 msgid "Tape"
 msgstr "Taśma"
 
-#: add_route_dialog.cc:431 monitor_section.cc:290
+#: add_route_dialog.cc:476 monitor_section.cc:273 plugin_pin_dialog.cc:509
+#: plugin_setup_dialog.cc:202
 msgid "Mono"
 msgstr "Mono"
 
-#: add_route_dialog.cc:435
+#: add_route_dialog.cc:480 plugin_pin_dialog.cc:512 plugin_setup_dialog.cc:205
 msgid "Stereo"
 msgstr "Stereo"
 
-#: add_route_dialog.cc:459
+#: add_route_dialog.cc:503
 msgid "3 Channel"
 msgstr ""
 
-#: add_route_dialog.cc:463
+#: add_route_dialog.cc:507
 msgid "4 Channel"
 msgstr ""
 
-#: add_route_dialog.cc:467
+#: add_route_dialog.cc:511
 msgid "5 Channel"
 msgstr ""
 
-#: add_route_dialog.cc:471
+#: add_route_dialog.cc:515
 msgid "6 Channel"
 msgstr ""
 
-#: add_route_dialog.cc:475
+#: add_route_dialog.cc:519
 msgid "8 Channel"
 msgstr ""
 
-#: add_route_dialog.cc:479
+#: add_route_dialog.cc:523
 msgid "12 Channel"
 msgstr ""
 
-#: add_route_dialog.cc:483 mixer_strip.cc:1836 mixer_strip.cc:2244
+#: add_route_dialog.cc:527 mixer_strip.cc:2009 mixer_strip.cc:2455
 msgid "Custom"
 msgstr ""
 
-#: add_route_dialog.cc:516 add_route_dialog.cc:532 route_group_menu.cc:81
+#: add_route_dialog.cc:569 add_route_dialog.cc:585 route_group_menu.cc:85
 msgid "New Group..."
 msgstr ""
 
-#: add_route_dialog.cc:520 route_group_menu.cc:85
+#: add_route_dialog.cc:573 route_group_menu.cc:89
 msgid "No Group"
 msgstr ""
 
@@ -569,177 +656,215 @@ msgstr ""
 msgid "Ambiguous File"
 msgstr ""
 
-#: ambiguous_file_dialog.cc:35
+#: ambiguous_file_dialog.cc:37
 msgid ""
 "%1 has found the file <i>%2</i> in the following places:\n"
 "\n"
 msgstr ""
 
-#: ambiguous_file_dialog.cc:44
+#: ambiguous_file_dialog.cc:46
 msgid ""
 "\n"
 "\n"
 "Please select the path that you want to get the file from."
 msgstr ""
 
-#: ambiguous_file_dialog.cc:46 missing_file_dialog.cc:46
+#: ambiguous_file_dialog.cc:48 missing_file_dialog.cc:50
 msgid "Done"
 msgstr ""
 
-#: analysis_window.cc:46
+#: analysis_window.cc:45
 msgid "Signal source"
 msgstr "Źródło sygnału"
 
-#: analysis_window.cc:47
+#: analysis_window.cc:46
 msgid "Selected ranges"
 msgstr "Zaznaczone zakresy"
 
-#: analysis_window.cc:48
+#: analysis_window.cc:47
 msgid "Selected regions"
 msgstr "Zaznaczone obszary"
 
-#: analysis_window.cc:50
-msgid "Display model"
-msgstr "Tryb wyświetlania"
-
-#: analysis_window.cc:51
-msgid "Composite graphs for each track"
+#: analysis_window.cc:48
+msgid "Show frequency power range"
 msgstr ""
 
-#: analysis_window.cc:52
-msgid "Composite graph of all tracks"
+#: analysis_window.cc:49
+msgid "Fit dB range"
 msgstr ""
 
-#: analysis_window.cc:54
-msgid "Show frequency power range"
+#: analysis_window.cc:50
+msgid "Proportional Spectrum, -18dB"
 msgstr ""
 
-#: analysis_window.cc:55
-msgid "Normalize values"
-msgstr "Normalizacja wartości"
-
-#: analysis_window.cc:59
+#: analysis_window.cc:53
 msgid "FFT analysis window"
 msgstr "Okno analizy FFT"
 
-#: analysis_window.cc:60 editor.cc:1823
+#: analysis_window.cc:54 editor.cc:1953
 msgid "Spectral Analysis"
 msgstr "Analiza spektrum"
 
-#: analysis_window.cc:67 editor_actions.cc:142 export_channel_selector.cc:557
-#: session_metadata_dialog.cc:667
+#: analysis_window.cc:61 editor_actions.cc:145 session_metadata_dialog.cc:670
 msgid "Track"
 msgstr "Ścieżka"
 
-#: analysis_window.cc:68 editor_actions.cc:648 mixer_ui.cc:131
-#: mixer_ui.cc:1854
+#: analysis_window.cc:62 ardour_ui_ed.cc:254 ardour_ui_ed.cc:255
+#: ardour_ui_ed.cc:256 editor_actions.cc:689 mixer_ui.cc:151 mixer_ui.cc:2134
 msgid "Show"
 msgstr "Wyświetl"
 
-#: analysis_window.cc:135
+#: analysis_window.cc:107
 msgid "Re-analyze data"
 msgstr "Analizuj ponownie"
 
-#: ardour_button.cc:887
+#: ardour_button.cc:876
 msgid "button cannot watch state of non-existing Controllable\n"
 msgstr ""
 
-#: ardour_button.cc:1155
+#: ardour_button.cc:1144
 msgid "ABCDEFGHIJLKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
 msgstr ""
 
-#: ardour_ui.cc:164
+#: ardour_ui.cc:198
 msgid ""
 "%1 %2.x has discovered configuration files from %1 %3.x.\n"
 "\n"
-"Would you like to copy the relevant files before starting to use the "
-"program?\n"
+"Would you like these files to be copied and used for %1 %2.x?\n"
 "\n"
 "(This will require you to restart %1.)"
 msgstr ""
 
-#: ardour_ui.cc:211 editor_actions.cc:642 region_editor.cc:51
+#: ardour_ui.cc:283 editor_actions.cc:683 region_editor.cc:53
 msgid "Audition"
 msgstr "Odsłuch"
 
-#: ardour_ui.cc:212 editor_actions.cc:136 mixer_strip.cc:2016
-#: rc_option_editor.cc:1959 route_time_axis.cc:252 route_time_axis.cc:2711
+#: ardour_ui.cc:284 editor_actions.cc:139 mixer_strip.cc:2205
+#: monitor_section.cc:329 rc_option_editor.cc:2547 route_time_axis.cc:263
+#: route_time_axis.cc:2740 vca_master_strip.cc:212 vca_time_axis.cc:237
 msgid "Solo"
 msgstr "Solo"
 
-#: ardour_ui.cc:213 rc_option_editor.cc:741
+#: ardour_ui.cc:285 rc_option_editor.cc:1357
 msgid "Feedback"
 msgstr "Sprzężenie zwrotne"
 
-#: ardour_ui.cc:219 speaker_dialog.cc:36
+#: ardour_ui.cc:296 speaker_dialog.cc:36
 msgid "Speaker Configuration"
 msgstr ""
 
-#: ardour_ui.cc:220 keyeditor.cc:53
-msgid "Key Bindings"
-msgstr ""
-
-#: ardour_ui.cc:221
-msgid "Preferences"
-msgstr "Preferencje"
-
-#: ardour_ui.cc:222 ardour_ui.cc:229
+#: ardour_ui.cc:297
 msgid "Add Tracks/Busses"
 msgstr ""
 
-#: ardour_ui.cc:223
+#: ardour_ui.cc:298
 msgid "About"
 msgstr "O programie"
 
-#: ardour_ui.cc:224 location_ui.cc:1141 session_option_editor.cc:189
-#: session_option_editor.cc:195 session_option_editor.cc:202
-msgid "Locations"
-msgstr "Położenia"
+#: ardour_ui.cc:299 location_ui.cc:1167
+msgid "Ranges|Locations"
+msgstr ""
 
-#: ardour_ui.cc:225 route_params_ui.cc:59 route_params_ui.cc:630
+#: ardour_ui.cc:300 route_params_ui.cc:59 route_params_ui.cc:620
 msgid "Tracks and Busses"
 msgstr ""
 
-#: ardour_ui.cc:226 engine_dialog.cc:70
+#: ardour_ui.cc:301 engine_dialog.cc:73
 msgid "Audio/MIDI Setup"
 msgstr ""
 
-#: ardour_ui.cc:227
+#: ardour_ui.cc:302
 msgid "Video Export Dialog"
 msgstr ""
 
-#: ardour_ui.cc:228
+#: ardour_ui.cc:303 lua_script_manager.cc:30
+msgid "Script Manager"
+msgstr ""
+
+#: ardour_ui.cc:304
 msgid "Properties"
 msgstr ""
 
-#: ardour_ui.cc:230 bundle_manager.cc:264
+#: ardour_ui.cc:305
+msgid "Add Video"
+msgstr ""
+
+#: ardour_ui.cc:306 bundle_manager.cc:264
 msgid "Bundle Manager"
 msgstr ""
 
-#: ardour_ui.cc:231 big_clock_window.cc:37
+#: ardour_ui.cc:307 big_clock_window.cc:37
 msgid "Big Clock"
 msgstr "Duży zegar"
 
-#: ardour_ui.cc:232
+#: ardour_ui.cc:308
 msgid "Audio Connections"
 msgstr ""
 
-#: ardour_ui.cc:233
+#: ardour_ui.cc:309
 msgid "MIDI Connections"
 msgstr ""
 
-#: ardour_ui.cc:242
+#: ardour_ui.cc:310
+msgid "Bindings Editor"
+msgstr ""
+
+#: ardour_ui.cc:321 editor.cc:1288
+msgid "Window|Editor"
+msgstr ""
+
+#: ardour_ui.cc:322 mixer_ui.cc:2210 mixer_ui.cc:2216
+msgid "Window|Mixer"
+msgstr ""
+
+#: ardour_ui.cc:323
+msgid "Window|Preferences"
+msgstr ""
+
+#: ardour_ui.cc:330
 msgid "Your configuration files were copied. You can now restart %1."
 msgstr ""
 
-#: ardour_ui.cc:481
+#: ardour_ui.cc:509
+msgid "Pre-Release Warning"
+msgstr ""
+
+#: ardour_ui.cc:513
+msgid ""
+"<b>Welcome to this pre-release build of %1 %2</b>\n"
+"\n"
+"There are still several issues and bugs to be worked on,\n"
+"as well as general workflow improvements, before this can be considered\n"
+"release software. So, a few guidelines:\n"
+"\n"
+"1) Please do <b>NOT</b> use this software with the expectation that it is "
+"stable or reliable\n"
+"   though it may be so, depending on your workflow.\n"
+"2) Please wait for a helpful writeup of new features.\n"
+"3) <b>Please do NOT use the forums at ardour.org to report issues</b>.\n"
+"4) Please <b>DO</b> use the bugtracker at http://tracker.ardour.org/ to "
+"report issues\n"
+"   making sure to note the product version number as 5.0-pre.\n"
+"5) Please <b>DO</b> use the ardour-users mailing list to discuss ideas and "
+"pass on comments.\n"
+"6) Please <b>DO</b> join us on IRC for real time discussions about %1 %2. "
+"You\n"
+"   can get there directly from within the program via the Help->Chat menu "
+"option.\n"
+"\n"
+"Full information on all the above can be found on the support page at\n"
+"\n"
+"                http://ardour.org/support\n"
+msgstr ""
+
+#: ardour_ui.cc:613
 msgid ""
 "The audio backend was shutdown because:\n"
 "\n"
 "%1"
 msgstr ""
 
-#: ardour_ui.cc:483
+#: ardour_ui.cc:615
 msgid ""
 "The audio backend has either been shutdown or it\n"
 "disconnected %1 because %1\n"
@@ -747,45 +872,45 @@ msgid ""
 "the audio backend and save the session."
 msgstr ""
 
-#: ardour_ui.cc:507
+#: ardour_ui.cc:639
 msgid ""
 "Audio Unit Plugin Scan Failed. Automatic AU scanning has been disabled. "
 "Please see the log window for further details."
 msgstr ""
 
-#: ardour_ui.cc:508
+#: ardour_ui.cc:640
 msgid "Audio Unit Plugin Scan Failed:"
 msgstr ""
 
-#: ardour_ui.cc:827
+#: ardour_ui.cc:1008
 msgid "NSM server did not announce itself"
 msgstr ""
 
-#: ardour_ui.cc:840
+#: ardour_ui.cc:1021
 msgid "NSM: no client ID provided"
 msgstr ""
 
-#: ardour_ui.cc:847
+#: ardour_ui.cc:1028
 msgid "NSM: no session created"
 msgstr ""
 
-#: ardour_ui.cc:870
+#: ardour_ui.cc:1051
 msgid "NSM: initialization failed"
 msgstr ""
 
-#: ardour_ui.cc:900
+#: ardour_ui.cc:1083
 msgid "Free/Demo Version Warning"
 msgstr ""
 
-#: ardour_ui.cc:902
+#: ardour_ui.cc:1085
 msgid "Subscribe and support development of %1"
 msgstr ""
 
-#: ardour_ui.cc:903
+#: ardour_ui.cc:1086
 msgid "Don't warn me about this again"
 msgstr ""
 
-#: ardour_ui.cc:905
+#: ardour_ui.cc:1088
 msgid ""
 "<span weight=\"bold\" size=\"large\">%1</span>\n"
 "\n"
@@ -796,39 +921,39 @@ msgid ""
 "%4"
 msgstr ""
 
-#: ardour_ui.cc:906
+#: ardour_ui.cc:1089
 msgid "This is a free/demo version of %1"
 msgstr ""
 
-#: ardour_ui.cc:907
+#: ardour_ui.cc:1090
 msgid "It will not restore OR save any plugin settings"
 msgstr ""
 
-#: ardour_ui.cc:908
+#: ardour_ui.cc:1091
 msgid ""
 "If you load an existing session with plugin settings\n"
 "they will not be used and will be lost."
 msgstr ""
 
-#: ardour_ui.cc:910 plugin_ui.cc:569
+#: ardour_ui.cc:1093 plugin_ui.cc:579
 msgid ""
 "To get full access to updates without this limitation\n"
 "consider becoming a subscriber for a low cost every month."
 msgstr ""
 
-#: ardour_ui.cc:920
+#: ardour_ui.cc:1103
 msgid "Quit now"
 msgstr ""
 
-#: ardour_ui.cc:921
+#: ardour_ui.cc:1104
 msgid "Continue using %1"
 msgstr ""
 
-#: ardour_ui.cc:954 startup.cc:345
+#: ardour_ui.cc:1135 startup.cc:349
 msgid "%1 is ready for use"
 msgstr ""
 
-#: ardour_ui.cc:996
+#: ardour_ui.cc:1185
 msgid ""
 "WARNING: Your system has a limit for maximum amount of locked memory. This "
 "might cause %1 to run out of memory before your system runs out of memory. \n"
@@ -837,23 +962,23 @@ msgid ""
 "controlled by %2"
 msgstr ""
 
-#: ardour_ui.cc:1013
+#: ardour_ui.cc:1202
 msgid "Do not show this window again"
 msgstr "Nie pokazuj tego okna więcej"
 
-#: ardour_ui.cc:1057
+#: ardour_ui.cc:1245
 msgid "Don't quit"
 msgstr ""
 
-#: ardour_ui.cc:1058
+#: ardour_ui.cc:1246
 msgid "Just quit"
 msgstr ""
 
-#: ardour_ui.cc:1059
+#: ardour_ui.cc:1247 ardour_ui.cc:5362
 msgid "Save and quit"
 msgstr ""
 
-#: ardour_ui.cc:1069
+#: ardour_ui.cc:1257
 msgid ""
 "%1 was unable to save your session.\n"
 "\n"
@@ -862,11 +987,11 @@ msgid ""
 "\"Just quit\" option."
 msgstr ""
 
-#: ardour_ui.cc:1119
+#: ardour_ui.cc:1307
 msgid "Unsaved Session"
 msgstr ""
 
-#: ardour_ui.cc:1140
+#: ardour_ui.cc:1328
 msgid ""
 "The session \"%1\"\n"
 "has not been saved.\n"
@@ -877,7 +1002,7 @@ msgid ""
 "What do you want to do?"
 msgstr ""
 
-#: ardour_ui.cc:1143
+#: ardour_ui.cc:1331
 msgid ""
 "The snapshot \"%1\"\n"
 "has not been saved.\n"
@@ -888,74 +1013,107 @@ msgid ""
 "What do you want to do?"
 msgstr ""
 
-#: ardour_ui.cc:1157
+#: ardour_ui.cc:1345
 msgid "Prompter"
 msgstr "Prompter"
 
-#: ardour_ui.cc:1269 ardour_ui.cc:1277
+#: ardour_ui.cc:1459 ardour_ui.cc:1467
 msgid "Audio: <span foreground=\"red\">none</span>"
 msgstr ""
 
-#: ardour_ui.cc:1281
+#: ardour_ui.cc:1471
 #, c-format
 msgid "Audio: <span foreground=\"green\">%.1f kHz / %4.1f ms</span>"
 msgstr ""
 
-#: ardour_ui.cc:1285
+#: ardour_ui.cc:1475
 #, c-format
 msgid "Audio: <span foreground=\"green\">%<PRId64> kHz / %4.1f ms</span>"
 msgstr ""
 
-#: ardour_ui.cc:1303 export_video_dialog.cc:80
+#: ardour_ui.cc:1493 export_report.cc:108 export_report.cc:323
+#: export_video_dialog.cc:76
 msgid "File:"
 msgstr ""
 
-#: ardour_ui.cc:1307
+#: ardour_ui.cc:1497
 msgid "BWF"
 msgstr ""
 
-#: ardour_ui.cc:1310
+#: ardour_ui.cc:1500
 msgid "WAV"
 msgstr "WAV"
 
-#: ardour_ui.cc:1313
+#: ardour_ui.cc:1503
 msgid "WAV64"
 msgstr ""
 
-#: ardour_ui.cc:1316 session_option_editor.cc:185
+#: ardour_ui.cc:1506 session_option_editor.cc:202
 msgid "CAF"
 msgstr ""
 
-#: ardour_ui.cc:1319
+#: ardour_ui.cc:1509
 msgid "AIFF"
 msgstr ""
 
-#: ardour_ui.cc:1322
+#: ardour_ui.cc:1512
 msgid "iXML"
 msgstr ""
 
-#: ardour_ui.cc:1325
+#: ardour_ui.cc:1515 session_option_editor.cc:203
 msgid "RF64"
 msgstr ""
 
-#: ardour_ui.cc:1333
+#: ardour_ui.cc:1518
+msgid "RF64/WAV"
+msgstr ""
+
+#: ardour_ui.cc:1521
+msgid "MBWF"
+msgstr ""
+
+#: ardour_ui.cc:1529
 msgid "32-float"
 msgstr ""
 
-#: ardour_ui.cc:1336
+#: ardour_ui.cc:1532
 msgid "24-int"
 msgstr ""
 
-#: ardour_ui.cc:1339
+#: ardour_ui.cc:1535
 msgid "16-int"
 msgstr ""
 
-#: ardour_ui.cc:1358
+#: ardour_ui.cc:1556
+#, c-format
+msgid "X: <span foreground=\"%s\">>10K</span>"
+msgstr ""
+
+#: ardour_ui.cc:1558
+#, c-format
+msgid "X: <span foreground=\"%s\">%u</span>"
+msgstr ""
+
+#: ardour_ui.cc:1561
+#, c-format
+msgid "X: <span foreground=\"%s\">?</span>"
+msgstr ""
+
+#: ardour_ui.cc:1564
+msgid "Audio dropouts. Shift+click to reset"
+msgstr ""
+
+#: ardour_ui.cc:1577
 #, c-format
 msgid "DSP: <span foreground=\"%s\">%5.1f%%</span>"
 msgstr ""
 
-#: ardour_ui.cc:1377
+#: ardour_ui.cc:1587
+#, c-format
+msgid "PkBld: <span foreground=\"%s\">%d</span>"
+msgstr ""
+
+#: ardour_ui.cc:1609
 #, c-format
 msgid ""
 "Buffers: <span foreground=\"green\">p:</span><span foreground=\"%s\">"
@@ -963,159 +1121,178 @@ msgid ""
 "\">%<PRIu32>%%</span>"
 msgstr ""
 
-#: ardour_ui.cc:1418
+#: ardour_ui.cc:1650
 msgid "Disk: <span foreground=\"green\">Unknown</span>"
 msgstr ""
 
-#: ardour_ui.cc:1420
+#: ardour_ui.cc:1652
 msgid "Disk: <span foreground=\"green\">24hrs+</span>"
 msgstr ""
 
-#: ardour_ui.cc:1438
+#: ardour_ui.cc:1670
 msgid "Disk: <span foreground=\"green\">>24 hrs</span>"
 msgstr ""
 
-#: ardour_ui.cc:1449
+#: ardour_ui.cc:1681
 #, c-format
 msgid "Disk: <span foreground=\"%s\">%02dh:%02dm:%02ds</span>"
 msgstr ""
 
-#: ardour_ui.cc:1475
+#: ardour_ui.cc:1707
 #, c-format
 msgid "Timecode|TC: <span foreground=\"%s\">%s</span>"
 msgstr ""
 
-#: ardour_ui.cc:1596 ardour_ui.cc:1605 session_dialog.cc:318
-#: session_dialog.cc:323
-msgid "Recent Sessions"
-msgstr "Poprzednie sesje"
-
-#: ardour_ui.cc:1684
+#: ardour_ui.cc:1789
 msgid ""
 "%1 is not connected to any audio backend.\n"
 "You cannot open or close sessions in this condition"
 msgstr ""
 
-#: ardour_ui.cc:1708
+#: ardour_ui.cc:1807
 msgid "Open Session"
 msgstr "Otwieranie sesji"
 
-#: ardour_ui.cc:1733 session_dialog.cc:349 session_import_dialog.cc:170
-#: session_metadata_dialog.cc:858
+#: ardour_ui.cc:1831 session_dialog.cc:410 session_import_dialog.cc:170
+#: session_metadata_dialog.cc:861
 msgid "%1 sessions"
 msgstr ""
 
-#: ardour_ui.cc:1770
+#: ardour_ui.cc:1879 ardour_ui.cc:1916
 msgid "You cannot add a track without a session already loaded."
 msgstr ""
 
-#: ardour_ui.cc:1778
+#: ardour_ui.cc:1887
 msgid "could not create %1 new mixed track"
 msgid_plural "could not create %1 new mixed tracks"
 msgstr[0] ""
 msgstr[1] ""
 msgstr[2] ""
 
-#: ardour_ui.cc:1784 ardour_ui.cc:1845
-msgid ""
-"There are insufficient ports available\n"
-"to create a new track or bus.\n"
-"You should save %1, exit and\n"
-"restart with more ports."
-msgstr ""
+#: ardour_ui.cc:1924
+msgid "could not create %1 new Midi Bus"
+msgid_plural "could not create %1 new Midi Busses"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
 
-#: ardour_ui.cc:1819
+#: ardour_ui.cc:1977
 msgid "You cannot add a track or bus without a session already loaded."
 msgstr "Nie możesz dodać ścieżki lub szyny bez otwierania sesji."
 
-#: ardour_ui.cc:1828
+#: ardour_ui.cc:1986
 msgid "could not create %1 new audio track"
 msgid_plural "could not create %1 new audio tracks"
 msgstr[0] ""
 msgstr[1] ""
 msgstr[2] ""
 
-#: ardour_ui.cc:1837
+#: ardour_ui.cc:1995
 msgid "could not create %1 new audio bus"
 msgid_plural "could not create %1 new audio busses"
 msgstr[0] ""
 msgstr[1] ""
 msgstr[2] ""
 
-#: ardour_ui.cc:1990
+#: ardour_ui.cc:2020
 msgid ""
-"Please create one or more tracks before trying to record.\n"
-"You can do this with the \"Add Track or Bus\" option in the Session menu."
-msgstr ""
+"There are insufficient ports available\n"
+"to create a new track or bus.\n"
+"You should save %1, exit and\n"
+"restart with more ports."
+msgstr ""
 
-#: ardour_ui.cc:2376
-msgid "Save as..."
+#: ardour_ui.cc:2164
+msgid ""
+"Please create one or more tracks before trying to record.\n"
+"You can do this with the \"Add Track or Bus\" option in the Session menu."
 msgstr ""
 
-#: ardour_ui.cc:2377 ardour_ui.cc:2456
-msgid "New session name"
+#: ardour_ui.cc:2565
+#, c-format
+msgid "Copied %<PRId64> of %<PRId64>"
 msgstr ""
 
-#: ardour_ui.cc:2379
-msgid "Take Snapshot"
+#: ardour_ui.cc:2619 save_as_dialog.cc:33
+msgid "Save As"
 msgstr ""
 
-#: ardour_ui.cc:2380
-msgid "Name of new snapshot"
+#: ardour_ui.cc:2647
+msgid "Save As failed: %1"
 msgstr ""
 
-#: ardour_ui.cc:2405
+#: ardour_ui.cc:2684
 msgid ""
 "To ensure compatibility with various systems\n"
 "snapshot names may not contain a '%1' character"
 msgstr ""
 
-#: ardour_ui.cc:2417
+#: ardour_ui.cc:2698
 msgid "Confirm Snapshot Overwrite"
 msgstr ""
 
-#: ardour_ui.cc:2418
-msgid "A snapshot already exists with that name.  Do you want to overwrite it?"
+#: ardour_ui.cc:2699
+msgid "A snapshot already exists with that name. Do you want to overwrite it?"
 msgstr ""
 
-#: ardour_ui.cc:2421 utils_videotl.cc:74
-msgid "Overwrite"
+#: ardour_ui.cc:2724
+msgid "Snapshot and switch"
+msgstr ""
+
+#: ardour_ui.cc:2725 ardour_ui.cc:2776
+msgid "New session name"
 msgstr ""
 
-#: ardour_ui.cc:2455
+#: ardour_ui.cc:2727
+msgid "Take Snapshot"
+msgstr ""
+
+#: ardour_ui.cc:2728
+msgid "Name of new snapshot"
+msgstr ""
+
+#: ardour_ui.cc:2775
 msgid "Rename Session"
 msgstr ""
 
-#: ardour_ui.cc:2470 ardour_ui.cc:2886 ardour_ui.cc:2924
+#: ardour_ui.cc:2790 ardour_ui.cc:3267 ardour_ui.cc:3305
 msgid ""
 "To ensure compatibility with various systems\n"
 "session names may not contain a '%1' character"
 msgstr ""
 
-#: ardour_ui.cc:2478
+#: ardour_ui.cc:2798
 msgid ""
 "That name is already in use by another directory/folder. Please try again."
 msgstr ""
 
-#: ardour_ui.cc:2487
+#: ardour_ui.cc:2807
 msgid ""
 "Renaming this session failed.\n"
 "Things could be seriously messed up at this point"
 msgstr ""
 
-#: ardour_ui.cc:2602
+#: ardour_ui.cc:2923 route_ui.cc:1867
+msgid "Confirm Template Overwrite"
+msgstr ""
+
+#: ardour_ui.cc:2924 route_ui.cc:1868
+msgid "A template already exists with that name. Do you want to overwrite it?"
+msgstr ""
+
+#: ardour_ui.cc:2948
 msgid "Save Template"
 msgstr ""
 
-#: ardour_ui.cc:2603
+#: ardour_ui.cc:2949
 msgid "Name for template:"
 msgstr ""
 
-#: ardour_ui.cc:2604
+#: ardour_ui.cc:2950
 msgid "-template"
 msgstr "-szablon"
 
-#: ardour_ui.cc:2643
+#: ardour_ui.cc:2987
 msgid ""
 "This session\n"
 "%1\n"
@@ -1125,59 +1302,89 @@ msgstr ""
 "%1\n"
 "już istnieje. Otworzyć ją?"
 
-#: ardour_ui.cc:2653
+#: ardour_ui.cc:2997
 msgid "Open Existing Session"
 msgstr ""
 
-#: ardour_ui.cc:2914
+#: ardour_ui.cc:3295
 msgid "There is no existing session at \"%1\""
 msgstr ""
 
-#: ardour_ui.cc:3006
+#: ardour_ui.cc:3391
 msgid "Please wait while %1 loads your session"
 msgstr ""
 
-#: ardour_ui.cc:3021
+#: ardour_ui.cc:3406
 msgid "Port Registration Error"
 msgstr ""
 
-#: ardour_ui.cc:3022
+#: ardour_ui.cc:3407
 msgid "Click the Close button to try again."
 msgstr ""
 
-#: ardour_ui.cc:3043
-msgid "Session \"%1 (snapshot %2)\" did not load successfully"
-msgstr "Sesja \"%1 (zrzut %2)\" nie została załadowana poprawnie"
+#: ardour_ui.cc:3426
+msgid "Session \"%1 (snapshot %2)\" did not load successfully: %3"
+msgstr ""
 
-#: ardour_ui.cc:3049
+#: ardour_ui.cc:3432 ardour_ui.cc:3453 ardour_ui.cc:3548 ardour_ui.cc:3557
 msgid "Loading Error"
 msgstr "BÅ‚Ä…d wczytywania"
 
-#: ardour_ui.cc:3068
+#: ardour_ui.cc:3447
+msgid "Session \"%1 (snapshot %2)\" did not load successfully"
+msgstr "Sesja \"%1 (zrzut %2)\" nie została załadowana poprawnie"
+
+#: ardour_ui.cc:3475
 msgid ""
 "This session has been opened in read-only mode.\n"
 "\n"
 "You will not be able to record or save."
 msgstr ""
 
-#: ardour_ui.cc:3073
+#: ardour_ui.cc:3480
 msgid "Read-only Session"
 msgstr ""
 
-#: ardour_ui.cc:3139
+#: ardour_ui.cc:3547
+msgid "Could not create session in \"%1\": %2"
+msgstr ""
+
+#: ardour_ui.cc:3556
 msgid "Could not create session in \"%1\""
 msgstr "Nie udało się utworzyć sesji w \"%1\""
 
-#: ardour_ui.cc:3288
+#: ardour_ui.cc:3601
+msgid ""
+"<b>Just ask and wait for an answer.\n"
+"It may take from minutes to hours.</b>"
+msgstr ""
+
+#: ardour_ui.cc:3603
+msgid "About the Chat"
+msgstr ""
+
+#: ardour_ui.cc:3604
+msgid ""
+"When you're inside the chat just ask your question and wait for an answer. "
+"The chat is occupied by real people with real lives so many of them are "
+"passively online and might not read your question before minutes or hours "
+"later.\n"
+"So please be patient and wait for an answer.\n"
+"\n"
+"You should just leave the chat window open and check back regularly until "
+"someone has answered your question."
+msgstr ""
+
+#: ardour_ui.cc:3723
 msgid "No files were ready for clean-up"
 msgstr ""
 
-#: ardour_ui.cc:3292 ardour_ui.cc:3302 ardour_ui.cc:3435 ardour_ui.cc:3442
-#: ardour_ui_ed.cc:103
+#: ardour_ui.cc:3727 ardour_ui.cc:3737 ardour_ui.cc:3870 ardour_ui.cc:3877
+#: ardour_ui_ed.cc:129
 msgid "Clean-up"
 msgstr ""
 
-#: ardour_ui.cc:3293
+#: ardour_ui.cc:3728
 msgid ""
 "If this seems suprising, \n"
 "check for any existing snapshots.\n"
@@ -1189,19 +1396,19 @@ msgstr ""
 "Wciąż mogą zawierać obszary\n"
 "wymagające obecności nieużywanych plików."
 
-#: ardour_ui.cc:3352
+#: ardour_ui.cc:3787
 msgid "kilo"
 msgstr ""
 
-#: ardour_ui.cc:3355
+#: ardour_ui.cc:3790
 msgid "mega"
 msgstr ""
 
-#: ardour_ui.cc:3358
+#: ardour_ui.cc:3793
 msgid "giga"
 msgstr ""
 
-#: ardour_ui.cc:3363
+#: ardour_ui.cc:3798
 msgid ""
 "The following file was deleted from %2,\n"
 "releasing %3 %4bytes of disk space"
@@ -1212,7 +1419,7 @@ msgstr[0] ""
 msgstr[1] ""
 msgstr[2] ""
 
-#: ardour_ui.cc:3370
+#: ardour_ui.cc:3805
 msgid ""
 "The following file was not in use and \n"
 "has been moved to: %2\n"
@@ -1235,90 +1442,126 @@ msgstr[0] ""
 msgstr[1] ""
 msgstr[2] ""
 
-#: ardour_ui.cc:3430
+#: ardour_ui.cc:3865
 msgid "Are you sure you want to clean-up?"
 msgstr ""
 
-#: ardour_ui.cc:3437
+#: ardour_ui.cc:3872
 msgid ""
 "Clean-up is a destructive operation.\n"
 "ALL undo/redo information will be lost if you clean-up.\n"
 "Clean-up will move all unused files to a \"dead\" location."
 msgstr ""
 
-#: ardour_ui.cc:3445
+#: ardour_ui.cc:3880
 msgid "CleanupDialog"
 msgstr "Okno dialogowe czyszczenia"
 
-#: ardour_ui.cc:3475
+#: ardour_ui.cc:3910
 msgid "Cleaned Files"
 msgstr ""
 
-#: ardour_ui.cc:3492
+#: ardour_ui.cc:3927
 msgid "deleted file"
 msgstr "usunięty plik"
 
-#: ardour_ui.cc:3637
+#: ardour_ui.cc:4133
+msgid "Cannot read session script '%1': %2"
+msgstr ""
+
+#: ardour_ui.cc:4142 luainstance.cc:1087
+msgid "Set Script Parameters"
+msgstr ""
+
+#: ardour_ui.cc:4153
+msgid "Session script '%1' instantiation failed: %2"
+msgstr ""
+
+#: ardour_ui.cc:4157
+msgid "Loading Session script '%1' failed: %2"
+msgstr ""
+
+#: ardour_ui.cc:4170
+msgid "There are no active Lua session scripts present in this session."
+msgstr ""
+
+#: ardour_ui.cc:4187
+msgid "Session script '%1' removal failed: %2"
+msgstr ""
+
+#: ardour_ui.cc:4197
 msgid "Video-Server was not launched by %1. The request to stop it is ignored."
 msgstr ""
 
-#: ardour_ui.cc:3641
+#: ardour_ui.cc:4201
 msgid "Stop Video-Server"
 msgstr ""
 
-#: ardour_ui.cc:3642
+#: ardour_ui.cc:4202
 msgid "Do you really want to stop the Video Server?"
 msgstr ""
 
-#: ardour_ui.cc:3645
+#: ardour_ui.cc:4205
 msgid "Yes, Stop It"
 msgstr ""
 
-#: ardour_ui.cc:3671
+#: ardour_ui.cc:4231
 msgid "The Video Server is already started."
 msgstr ""
 
-#: ardour_ui.cc:3673
+#: ardour_ui.cc:4233
 msgid ""
 "An external Video Server is configured and can be reached. Not starting a "
 "new instance."
 msgstr ""
 
-#: ardour_ui.cc:3681 ardour_ui.cc:3786
+#: ardour_ui.cc:4241 ardour_ui.cc:4346
 msgid ""
 "Could not connect to the Video Server. Start it or configure its access URL "
 "in Preferences."
 msgstr ""
 
-#: ardour_ui.cc:3711
+#: ardour_ui.cc:4271
 msgid "Specified docroot is not an existing directory."
 msgstr ""
 
-#: ardour_ui.cc:3717 ardour_ui.cc:3723
+#: ardour_ui.cc:4277 ardour_ui.cc:4283
 msgid "Given Video Server is not an executable file."
 msgstr ""
 
-#: ardour_ui.cc:3757
+#: ardour_ui.cc:4317
 msgid "Cannot launch the video-server"
 msgstr ""
 
-#: ardour_ui.cc:3767
+#: ardour_ui.cc:4327
 msgid "Video-server was started but does not respond to requests..."
 msgstr ""
 
-#: ardour_ui.cc:3812 editor_audio_import.cc:641
+#: ardour_ui.cc:4372 editor_audio_import.cc:647
 msgid "could not open %1"
 msgstr "nie można otworzyć %1"
 
-#: ardour_ui.cc:3816
+#: ardour_ui.cc:4376
 msgid "no video-file selected"
 msgstr ""
 
-#: ardour_ui.cc:4014
+#: ardour_ui.cc:4472
+msgid "No LTC detected, video will not be aligned."
+msgstr ""
+
+#: ardour_ui.cc:4478
+msgid "Align video-start to %1 [samples]"
+msgstr ""
+
+#: ardour_ui.cc:4654
+msgid "xrun"
+msgstr ""
+
+#: ardour_ui.cc:4663
 msgid "Recording was stopped because your system could not keep up."
 msgstr ""
 
-#: ardour_ui.cc:4043
+#: ardour_ui.cc:4692
 msgid ""
 "The disk system on your computer\n"
 "was not able to keep up with %1.\n"
@@ -1327,23 +1570,23 @@ msgid ""
 "quickly enough to keep up with recording.\n"
 msgstr ""
 
-#: ardour_ui.cc:4113
+#: ardour_ui.cc:4765
 msgid "Scanning for plugins"
 msgstr ""
 
-#: ardour_ui.cc:4115
+#: ardour_ui.cc:4767
 msgid "Cancel plugin scan"
 msgstr ""
 
-#: ardour_ui.cc:4124
+#: ardour_ui.cc:4776
 msgid "Stop Timeout"
 msgstr ""
 
-#: ardour_ui.cc:4131
+#: ardour_ui.cc:4783
 msgid "Scan Timeout"
 msgstr ""
 
-#: ardour_ui.cc:4174
+#: ardour_ui.cc:4827
 msgid ""
 "The disk system on your computer\n"
 "was not able to keep up with %1.\n"
@@ -1352,11 +1595,11 @@ msgid ""
 "quickly enough to keep up with playback.\n"
 msgstr ""
 
-#: ardour_ui.cc:4214
+#: ardour_ui.cc:4862
 msgid "Crash Recovery"
 msgstr ""
 
-#: ardour_ui.cc:4215
+#: ardour_ui.cc:4863
 msgid ""
 "This session appears to have been in the\n"
 "middle of recording when %1 or\n"
@@ -1367,42 +1610,43 @@ msgid ""
 "what you would like to do.\n"
 msgstr ""
 
-#: ardour_ui.cc:4227
+#: ardour_ui.cc:4875
 msgid "Ignore crash data"
 msgstr "Ignorowanie dane z awarii"
 
-#: ardour_ui.cc:4228
+#: ardour_ui.cc:4876
 msgid "Recover from crash"
 msgstr "Przywróć dane z awarii"
 
-#: ardour_ui.cc:4248
+#: ardour_ui.cc:4896
 msgid "Sample Rate Mismatch"
 msgstr "Błędna częstotliwość próbkowania"
 
-#: ardour_ui.cc:4249
+#: ardour_ui.cc:4897
 msgid ""
 "This session was created with a sample rate of %1 Hz, but\n"
 "%2 is currently running at %3 Hz.  If you load this session,\n"
 "audio may be played at the wrong sample rate.\n"
 msgstr ""
 
-#: ardour_ui.cc:4258
+#: ardour_ui.cc:4906
 msgid "Do not load session"
 msgstr "Nie Å‚aduj sesji"
 
-#: ardour_ui.cc:4259
+#: ardour_ui.cc:4907
 msgid "Load session anyway"
 msgstr "Załaduj sesję mimo to"
 
-#: ardour_ui.cc:4286
-msgid "Could not disconnect from Audio/MIDI engine"
-msgstr ""
-
-#: ardour_ui.cc:4303 ardour_ui.cc:4306
-msgid "Could not reconnect to the Audio/MIDI engine"
+#: ardour_ui.cc:4927
+msgid ""
+"This session was created with a sample rate of %1 Hz, but\n"
+"%2 is currently running at %3 Hz.\n"
+"Audio will be recorded and played at the wrong sample rate.\n"
+"Re-Configure the Audio Engine in\n"
+"Menu > Window > Audio/Midi Setup"
 msgstr ""
 
-#: ardour_ui.cc:4590
+#: ardour_ui.cc:5209
 msgid ""
 "%4This is a session from an older version of %3%5\n"
 "\n"
@@ -1414,72 +1658,97 @@ msgid ""
 "\n"
 "%6%2%7\n"
 "\n"
-"From now on, use the -2000 version with older versions of %3"
+"From now on, use the backup copy with older versions of %3"
 msgstr ""
 
-#: ardour_ui2.cc:73
-msgid "UI: cannot setup editor"
-msgstr "UI: nie można ustawić edytora"
+#: ardour_ui.cc:5331
+msgid "This is a free/demo copy of %1. It has just switched to silent mode."
+msgstr ""
 
-#: ardour_ui2.cc:78
-msgid "UI: cannot setup mixer"
-msgstr "UI: nie można ustawić miksera"
+#: ardour_ui.cc:5337
+msgid "%1 is now silent"
+msgstr ""
 
-#: ardour_ui2.cc:83
-msgid "UI: cannot setup meterbridge"
+#: ardour_ui.cc:5339
+msgid ""
+"Please consider paying for a copy of %1 - you can pay whatever you want."
+msgstr ""
+
+#: ardour_ui.cc:5340
+msgid "Better yet become a subscriber - subscriptions start at US$1 per month."
+msgstr ""
+
+#: ardour_ui.cc:5341
+msgid "Pay for a copy (via the web)"
+msgstr ""
+
+#: ardour_ui.cc:5342
+msgid "Become a subscriber (via the web)"
+msgstr ""
+
+#: ardour_ui.cc:5361
+msgid "Remain silent"
+msgstr ""
+
+#: ardour_ui.cc:5363
+msgid "Give me more time"
+msgstr ""
+
+#: ardour_ui.cc:5656
+msgid "Global keybindings are missing"
 msgstr ""
 
-#: ardour_ui2.cc:128
+#: ardour_ui2.cc:79
 msgid "Play from playhead"
 msgstr "Odtwórz od położenia głowicy"
 
-#: ardour_ui2.cc:129
+#: ardour_ui2.cc:80
 msgid "Stop playback"
 msgstr "Zatrzymaj odtwarzanie"
 
-#: ardour_ui2.cc:130
+#: ardour_ui2.cc:81
 msgid "Toggle record"
 msgstr ""
 
-#: ardour_ui2.cc:131
+#: ardour_ui2.cc:82
 msgid "Play range/selection"
 msgstr "Odtwórz zakres/zaznaczenie"
 
-#: ardour_ui2.cc:132
+#: ardour_ui2.cc:83
 msgid "Go to start of session"
 msgstr "Przejdź do początku sesji"
 
-#: ardour_ui2.cc:133
+#: ardour_ui2.cc:84
 msgid "Go to end of session"
 msgstr "Przejdź do końca sesji"
 
-#: ardour_ui2.cc:134
+#: ardour_ui2.cc:85
 msgid "Play loop range"
 msgstr "Zakres pętli"
 
-#: ardour_ui2.cc:135
+#: ardour_ui2.cc:86
 msgid ""
 "MIDI Panic\n"
 "Send note off and reset controller messages on all MIDI channels"
 msgstr ""
 
-#: ardour_ui2.cc:136
+#: ardour_ui2.cc:87
 msgid "Return to last playback start when stopped"
 msgstr "Powróć do początku ostatniego odtwarzania przy zatrzymaniu"
 
-#: ardour_ui2.cc:137
-msgid "Playhead follows Range Selections and Edits"
+#: ardour_ui2.cc:88
+msgid "Playhead follows range selections and edits"
 msgstr ""
 
-#: ardour_ui2.cc:138
+#: ardour_ui2.cc:89
 msgid "Be sensible about input monitoring"
 msgstr ""
 
-#: ardour_ui2.cc:139
+#: ardour_ui2.cc:90
 msgid "Enable/Disable audio click"
 msgstr "Włącz/wyłącz metronom"
 
-#: ardour_ui2.cc:140 monitor_section.cc:111
+#: ardour_ui2.cc:91 monitor_section.cc:129
 msgid ""
 "When active, something is soloed.\n"
 "Click to de-solo everything"
@@ -1487,19 +1756,17 @@ msgstr ""
 "Gdy aktywne, gdzieś włączone jest solo.\n"
 "Kliknij by wyłączyć solo wszędzie."
 
-#: ardour_ui2.cc:141
+#: ardour_ui2.cc:92
 msgid ""
-"When active, auditioning is taking place\n"
+"When active, auditioning is taking place.\n"
 "Click to stop the audition"
 msgstr ""
-"Gdy aktywne, odsłuchiwanie jest włączone\n"
-"Kliknij, by zatrzymać odsłuchiwanie."
 
-#: ardour_ui2.cc:142
+#: ardour_ui2.cc:93
 msgid "When active, there is a feedback loop."
 msgstr ""
 
-#: ardour_ui2.cc:143
+#: ardour_ui2.cc:94
 msgid ""
 "<b>Primary Clock</b> right-click to set display mode. Click to edit, click"
 "+drag a digit or mouse-over+scroll wheel to modify.\n"
@@ -1507,7 +1774,7 @@ msgid ""
 "confirm; postfix the edit with '+' or '-' to enter delta times.\n"
 msgstr ""
 
-#: ardour_ui2.cc:144
+#: ardour_ui2.cc:95
 msgid ""
 "<b>Secondary Clock</b> right-click to set display mode. Click to edit, click"
 "+drag a digit or mouse-over+scroll wheel to modify.\n"
@@ -1515,450 +1782,559 @@ msgid ""
 "confirm; postfix the edit with '+' or '-' to enter delta times.\n"
 msgstr ""
 
-#: ardour_ui2.cc:145
+#: ardour_ui2.cc:96
 msgid "Reset All Peak Indicators"
 msgstr ""
 
-#: ardour_ui2.cc:146
+#: ardour_ui2.cc:97
 msgid "Show Error Log and acknowledge warnings"
 msgstr ""
 
-#: ardour_ui2.cc:179
+#: ardour_ui2.cc:130
 msgid "[ERROR]: "
 msgstr "[BŁAD]: "
 
-#: ardour_ui2.cc:182
+#: ardour_ui2.cc:133
 msgid "[WARNING]: "
 msgstr "[OSTRZEŻENIE]: "
 
-#: ardour_ui2.cc:185
+#: ardour_ui2.cc:136
 msgid "[INFO]: "
 msgstr "[INFORMACJA]: "
 
-#: ardour_ui2.cc:253 ardour_ui_ed.cc:403
+#: ardour_ui2.cc:197 ardour_ui_ed.cc:509
 msgid "Auto Return"
 msgstr "Autopowracanie"
 
-#: ardour_ui2.cc:255 ardour_ui_ed.cc:406
+#: ardour_ui2.cc:199 ardour_ui_ed.cc:512
 msgid "Follow Edits"
 msgstr ""
 
-#: ardour_ui2.cc:716 rc_option_editor.cc:2300
+#: ardour_ui2.cc:422 ardour_ui2.cc:426 ardour_ui2.cc:430
+msgid ""
+"Drag this tab to the desktop to show %1 in its own window\n"
+"\n"
+"To put the window back, use the Window > %1 > Attach menu action"
+msgstr ""
+
+#: ardour_ui2.cc:638
 msgid "GUI"
 msgstr ""
 
-#: ardour_ui2.cc:733 rc_option_editor.cc:1309 rc_option_editor.cc:1327
-#: rc_option_editor.cc:1330 rc_option_editor.cc:1332 rc_option_editor.cc:1334
-#: rc_option_editor.cc:1342 rc_option_editor.cc:1350 rc_option_editor.cc:1352
-#: rc_option_editor.cc:1360 rc_option_editor.cc:1367 rc_option_editor.cc:1376
-#: rc_option_editor.cc:1378 rc_option_editor.cc:1380 rc_option_editor.cc:1388
-#: rc_option_editor.cc:1390 rc_option_editor.cc:1399
-#: session_option_editor.cc:321 session_option_editor.cc:323
-#: session_option_editor.cc:344 session_option_editor.cc:346
-#: session_option_editor.cc:348 session_option_editor.cc:355
-#: session_option_editor.cc:362 session_option_editor.cc:366
+#: ardour_ui2.cc:651 rc_option_editor.cc:1874 rc_option_editor.cc:1892
+#: rc_option_editor.cc:1895 rc_option_editor.cc:1897 rc_option_editor.cc:1899
+#: rc_option_editor.cc:1907 rc_option_editor.cc:1909 rc_option_editor.cc:1917
+#: rc_option_editor.cc:1925 rc_option_editor.cc:1932 rc_option_editor.cc:1953
+#: rc_option_editor.cc:1955 rc_option_editor.cc:1964
+#: session_option_editor.cc:342 session_option_editor.cc:344
+#: session_option_editor.cc:365 session_option_editor.cc:367
+#: session_option_editor.cc:369 session_option_editor.cc:376
+#: session_option_editor.cc:383 session_option_editor.cc:387
 msgid "Misc"
 msgstr "Różne"
 
-#: ardour_ui_dependents.cc:76
+#: ardour_ui_dependents.cc:118
 msgid "Setup Editor"
 msgstr "Ustawianie edytora"
 
-#: ardour_ui_dependents.cc:78
+#: ardour_ui_dependents.cc:120
 msgid "Setup Mixer"
 msgstr "Ustawianie miksera"
 
-#: ardour_ui_dependents.cc:84
+#: ardour_ui_dependents.cc:127
 msgid "Reload Session History"
 msgstr "Wczytywanie historii sesji"
 
-#: ardour_ui_dialogs.cc:250
+#: ardour_ui_dependents.cc:248
+msgid "UI: cannot setup editor"
+msgstr "UI: nie można ustawić edytora"
+
+#: ardour_ui_dependents.cc:253
+msgid "UI: cannot setup mixer"
+msgstr "UI: nie można ustawić miksera"
+
+#: ardour_ui_dependents.cc:258
+msgid "UI: cannot setup meterbridge"
+msgstr ""
+
+#: ardour_ui_dependents.cc:263
+msgid "UI: cannot setup luawindow"
+msgstr ""
+
+#: ardour_ui_dependents.cc:269 ardour_ui_ed.cc:136 ardour_ui_ed.cc:257
+#: rc_option_editor.cc:1853 rc_option_editor.cc:3487
+msgid "Preferences"
+msgstr "Preferencje"
+
+#: ardour_ui_dependents.cc:270 ardour_ui_ed.cc:134 mixer_ui.cc:100
+#: mixer_ui.cc:410
+msgid "Mixer"
+msgstr ""
+
+#: ardour_ui_dependents.cc:271 ardour_ui_ed.cc:135 editor.cc:5790
+#: editor.cc:6062 public_editor.cc:34 rc_option_editor.cc:2201
+#: rc_option_editor.cc:2215 rc_option_editor.cc:2219 rc_option_editor.cc:2227
+#: rc_option_editor.cc:2236 rc_option_editor.cc:2244 rc_option_editor.cc:2253
+#: rc_option_editor.cc:2261 rc_option_editor.cc:2269 rc_option_editor.cc:2279
+#: rc_option_editor.cc:2281 rc_option_editor.cc:2305 rc_option_editor.cc:2317
+#: rc_option_editor.cc:2328 rc_option_editor.cc:2346
+msgid "Editor"
+msgstr "Edytor"
+
+#: ardour_ui_dialogs.cc:263
 msgid "Don't close"
 msgstr ""
 
-#: ardour_ui_dialogs.cc:251
+#: ardour_ui_dialogs.cc:264
 msgid "Just close"
 msgstr ""
 
-#: ardour_ui_dialogs.cc:252
+#: ardour_ui_dialogs.cc:265
 msgid "Save and close"
 msgstr ""
 
-#: ardour_ui_dialogs.cc:362
-msgid "This screen is not tall enough to display the mixer window"
+#: ardour_ui_ed.cc:124
+msgid "Escape"
 msgstr ""
 
-#: ardour_ui_ed.cc:102
+#: ardour_ui_ed.cc:128
 msgid "Session"
 msgstr "Sesja"
 
-#: ardour_ui_ed.cc:105 editor_actions.cc:138 editor_regions.cc:116
-#: port_group.cc:458 session_option_editor.cc:82 session_option_editor.cc:89
+#: ardour_ui_ed.cc:131 editor_actions.cc:141 editor_regions.cc:163
+#: port_group.cc:468 session_option_editor.cc:82 session_option_editor.cc:89
 msgid "Sync"
 msgstr "Synchronizacja"
 
-#: ardour_ui_ed.cc:106
+#: ardour_ui_ed.cc:132
 msgid "Options"
 msgstr "Opcje"
 
-#: ardour_ui_ed.cc:107
+#: ardour_ui_ed.cc:133
 msgid "Window"
 msgstr "Okno"
 
-#: ardour_ui_ed.cc:108
+#: ardour_ui_ed.cc:137 ardour_ui_ed.cc:267 ardour_ui_ed.cc:268
+#: ardour_ui_ed.cc:269
+msgid "Detach"
+msgstr ""
+
+#: ardour_ui_ed.cc:138
 msgid "Help"
 msgstr "Pomoc"
 
-#: ardour_ui_ed.cc:109
+#: ardour_ui_ed.cc:139
 msgid "Misc. Shortcuts"
 msgstr "Skróty"
 
-#: ardour_ui_ed.cc:110
+#: ardour_ui_ed.cc:140
 msgid "Audio File Format"
 msgstr "Format pliku dźwiękowego"
 
-#: ardour_ui_ed.cc:111
+#: ardour_ui_ed.cc:141
 msgid "File Type"
 msgstr "Format pliku"
 
-#: ardour_ui_ed.cc:112 export_format_dialog.cc:67
+#: ardour_ui_ed.cc:142 export_format_dialog.cc:75
 msgid "Sample Format"
 msgstr "Format próbkowania"
 
-#: ardour_ui_ed.cc:113 rc_option_editor.cc:2245 rc_option_editor.cc:2257
+#: ardour_ui_ed.cc:143 rc_option_editor.cc:2841
 msgid "Control Surfaces"
 msgstr "UrzÄ…dzenia sterujÄ…ce"
 
-#: ardour_ui_ed.cc:114 rc_option_editor.cc:1921 rc_option_editor.cc:2264
+#: ardour_ui_ed.cc:144 rc_option_editor.cc:2847 rc_option_editor.cc:2853
+#: rc_option_editor.cc:2862 rc_option_editor.cc:2873 rc_option_editor.cc:2883
+#: rc_option_editor.cc:2945 rc_option_editor.cc:2962 rc_option_editor.cc:2978
+#: rc_option_editor.cc:2979 rc_option_editor.cc:2988 rc_option_editor.cc:3002
+#: rc_option_editor.cc:3005 rc_option_editor.cc:3013 rc_option_editor.cc:3021
 msgid "Plugins"
 msgstr "Wtyczki"
 
-#: ardour_ui_ed.cc:115 rc_option_editor.cc:2351
+#: ardour_ui_ed.cc:145 rc_option_editor.cc:3169
 msgid "Metering"
 msgstr "Ustawienia metrum"
 
-#: ardour_ui_ed.cc:116
+#: ardour_ui_ed.cc:146
 msgid "Fall Off Rate"
 msgstr ""
 
-#: ardour_ui_ed.cc:117
+#: ardour_ui_ed.cc:147
 msgid "Hold Time"
 msgstr "Czas przytrzymania"
 
-#: ardour_ui_ed.cc:118
+#: ardour_ui_ed.cc:148
 msgid "Denormal Handling"
 msgstr "Obsługa liczb zdenormalizowanych"
 
-#: ardour_ui_ed.cc:122 route_time_axis.cc:1677
+#: ardour_ui_ed.cc:152 route_time_axis.cc:1683
 msgid "New..."
 msgstr ""
 
-#: ardour_ui_ed.cc:124
+#: ardour_ui_ed.cc:154
 msgid "Open..."
 msgstr ""
 
-#: ardour_ui_ed.cc:125
+#: ardour_ui_ed.cc:155
 msgid "Recent..."
 msgstr ""
 
-#: ardour_ui_ed.cc:126 panner_editor.cc:29 playlist_selector.cc:64
+#: ardour_ui_ed.cc:156 panner_editor.cc:29 playlist_selector.cc:64
 msgid "Close"
 msgstr "Zamknij"
 
-#: ardour_ui_ed.cc:129
+#: ardour_ui_ed.cc:159
 msgid "Add Track or Bus..."
 msgstr ""
 
-#: ardour_ui_ed.cc:134
-msgid "Open Video"
+#: ardour_ui_ed.cc:163
+msgid "Duplicate Tracks/Busses..."
+msgstr ""
+
+#: ardour_ui_ed.cc:169
+msgid "Cancel Solo"
+msgstr ""
+
+#: ardour_ui_ed.cc:173
+msgid "Session|Scripting"
+msgstr ""
+
+#: ardour_ui_ed.cc:176
+msgid "Add Lua Script..."
+msgstr ""
+
+#: ardour_ui_ed.cc:180
+msgid "Remove Lua Script"
+msgstr ""
+
+#: ardour_ui_ed.cc:184
+msgid "Open Video..."
 msgstr ""
 
-#: ardour_ui_ed.cc:137
+#: ardour_ui_ed.cc:187
 msgid "Remove Video"
 msgstr ""
 
-#: ardour_ui_ed.cc:140
-msgid "Export To Video File"
+#: ardour_ui_ed.cc:190
+msgid "Export to Video File..."
 msgstr ""
 
-#: ardour_ui_ed.cc:144
-msgid "Snapshot..."
+#: ardour_ui_ed.cc:194
+msgid "Snapshot (& keep working on current version) ..."
 msgstr ""
 
-#: ardour_ui_ed.cc:148
+#: ardour_ui_ed.cc:197
+msgid "Snapshot (& switch to new version) ..."
+msgstr ""
+
+#: ardour_ui_ed.cc:200
+msgid "Quick Snapshot (& keep working on current version) ..."
+msgstr ""
+
+#: ardour_ui_ed.cc:203
+msgid "Quick Snapshot (& switch to new version) ..."
+msgstr ""
+
+#: ardour_ui_ed.cc:207
 msgid "Save As..."
 msgstr ""
 
-#: ardour_ui_ed.cc:152 editor_actions.cc:1771 editor_markers.cc:903
-#: editor_snapshots.cc:124 mixer_strip.cc:1518 route_time_axis.cc:1673
+#: ardour_ui_ed.cc:210 editor_actions.cc:1788 editor_markers.cc:908
+#: editor_snapshots.cc:136 mixer_strip.cc:1653 route_time_axis.cc:1679
 msgid "Rename..."
 msgstr ""
 
-#: ardour_ui_ed.cc:156
+#: ardour_ui_ed.cc:214
 msgid "Save Template..."
 msgstr "Zapisz szablon"
 
-#: ardour_ui_ed.cc:159
+#: ardour_ui_ed.cc:217
 msgid "Metadata"
 msgstr ""
 
-#: ardour_ui_ed.cc:162
+#: ardour_ui_ed.cc:220
 msgid "Edit Metadata..."
 msgstr ""
 
-#: ardour_ui_ed.cc:165
+#: ardour_ui_ed.cc:223
 msgid "Import Metadata..."
 msgstr ""
 
-#: ardour_ui_ed.cc:168
-msgid "Export To Audio File(s)..."
+#: ardour_ui_ed.cc:226
+msgid "Export to Audio File(s)..."
 msgstr ""
 
-#: ardour_ui_ed.cc:171
+#: ardour_ui_ed.cc:229
 msgid "Stem export..."
 msgstr ""
 
-#: ardour_ui_ed.cc:174 editor_export_audio.cc:65 export_dialog.cc:129
-#: export_video_dialog.cc:84
+#: ardour_ui_ed.cc:232 editor_export_audio.cc:66
+#: export_channel_selector.cc:190 export_channel_selector.cc:578
+#: export_dialog.cc:131 export_video_dialog.cc:80
 msgid "Export"
 msgstr "Eksportuj"
 
-#: ardour_ui_ed.cc:177
+#: ardour_ui_ed.cc:235
 msgid "Clean-up Unused Sources..."
 msgstr ""
 
-#: ardour_ui_ed.cc:181
+#: ardour_ui_ed.cc:239
+msgid "Reset Peak Files"
+msgstr ""
+
+#: ardour_ui_ed.cc:243
 msgid "Flush Wastebasket"
 msgstr ""
 
-#: ardour_ui_ed.cc:188
+#: ardour_ui_ed.cc:251
 msgid "Quit"
 msgstr "Zakończ"
 
-#: ardour_ui_ed.cc:192
+#: ardour_ui_ed.cc:252 ardour_ui_ed.cc:259 ardour_ui_ed.cc:260
+#: ardour_ui_ed.cc:261 automation_time_axis.cc:545 editor_actions.cc:686
+#: editor_markers.cc:907 location_ui.cc:61 plugin_selector.cc:97
+#: route_time_axis.cc:864
+msgid "Hide"
+msgstr "Ukryj"
+
+#: ardour_ui_ed.cc:263 ardour_ui_ed.cc:264 ardour_ui_ed.cc:265
+msgid "Attach"
+msgstr ""
+
+#: ardour_ui_ed.cc:275 ardour_ui_ed.cc:276 ardour_ui_ed.cc:277
+#: ardour_ui_ed.cc:283 ardour_ui_ed.cc:284 ardour_ui_ed.cc:285
+msgid "Change"
+msgstr ""
+
+#: ardour_ui_ed.cc:287
+msgid "Previous Tab"
+msgstr ""
+
+#: ardour_ui_ed.cc:288
+msgid "Next Tab"
+msgstr ""
+
+#: ardour_ui_ed.cc:290
+msgid "Toggle Editor & Mixer"
+msgstr ""
+
+#: ardour_ui_ed.cc:294
 msgid "Maximise Editor Space"
 msgstr "Maksymalizacja edytora"
 
-#: ardour_ui_ed.cc:193
+#: ardour_ui_ed.cc:295
 msgid "Maximise Mixer Space"
 msgstr ""
 
-#: ardour_ui_ed.cc:194
-msgid "Show Toolbars"
+#: ardour_ui_ed.cc:298
+msgid "Toggle Mixer List"
 msgstr ""
 
-#: ardour_ui_ed.cc:198
-msgid "Show more UI preferences"
+#: ardour_ui_ed.cc:301
+msgid "Toggle Monitor Section Visibility"
 msgstr ""
 
-#: ardour_ui_ed.cc:200 mixer_ui.cc:1924 mixer_ui.cc:1930
-msgid "Window|Mixer"
+#: ardour_ui_ed.cc:305
+msgid "Show more UI preferences"
 msgstr ""
 
-#: ardour_ui_ed.cc:201
-msgid "Toggle Editor+Mixer"
+#: ardour_ui_ed.cc:308
+msgid "Window|Scripting"
 msgstr ""
 
-#: ardour_ui_ed.cc:202 meterbridge.cc:218 meterbridge.cc:224
+#: ardour_ui_ed.cc:309 meterbridge.cc:214 meterbridge.cc:220
 msgid "Window|Meterbridge"
 msgstr ""
 
-#: ardour_ui_ed.cc:204
-msgid "Reattach All Tearoffs"
-msgstr ""
-
-#: ardour_ui_ed.cc:206 midi_tracer.cc:45
+#: ardour_ui_ed.cc:311 midi_tracer.cc:45
 msgid "MIDI Tracer"
 msgstr ""
 
-#: ardour_ui_ed.cc:208
+#: ardour_ui_ed.cc:314
 msgid "Chat"
 msgstr ""
 
-#: ardour_ui_ed.cc:210
+#: ardour_ui_ed.cc:316
 msgid "Help|Manual"
 msgstr ""
 
-#: ardour_ui_ed.cc:211
-msgid "Reference"
+#: ardour_ui_ed.cc:317
+msgid "Manual|Reference"
 msgstr ""
 
-#: ardour_ui_ed.cc:212
-msgid "Report A Bug"
+#: ardour_ui_ed.cc:318
+msgid "Report a Bug"
 msgstr ""
 
-#: ardour_ui_ed.cc:213
+#: ardour_ui_ed.cc:319
 msgid "Cheat Sheet"
 msgstr ""
 
-#: ardour_ui_ed.cc:214
+#: ardour_ui_ed.cc:320
 msgid "Ardour Website"
 msgstr ""
 
-#: ardour_ui_ed.cc:215
+#: ardour_ui_ed.cc:321
 msgid "Ardour Development"
 msgstr ""
 
-#: ardour_ui_ed.cc:216
+#: ardour_ui_ed.cc:322
 msgid "User Forums"
 msgstr ""
 
-#: ardour_ui_ed.cc:217
-msgid "How to report a bug"
+#: ardour_ui_ed.cc:323
+msgid "How to Report a Bug"
 msgstr ""
 
-#: ardour_ui_ed.cc:219 plugin_ui.cc:419
+#: ardour_ui_ed.cc:325 luawindow.cc:100 luawindow.cc:654 plugin_ui.cc:419
 msgid "Save"
 msgstr "Zapisz"
 
-#: ardour_ui_ed.cc:227 rc_option_editor.cc:1419 rc_option_editor.cc:1430
-#: rc_option_editor.cc:1441 rc_option_editor.cc:1450 rc_option_editor.cc:1463
-#: rc_option_editor.cc:1476 rc_option_editor.cc:1485 rc_option_editor.cc:1495
-#: rc_option_editor.cc:1497 rc_option_editor.cc:1506 rc_option_editor.cc:1522
-#: rc_option_editor.cc:1543 rc_option_editor.cc:1561 rc_option_editor.cc:1563
-#: rc_option_editor.cc:1579 rc_option_editor.cc:1582 rc_option_editor.cc:1584
-#: rc_option_editor.cc:1601 rc_option_editor.cc:1612
+#: ardour_ui_ed.cc:333 rc_option_editor.cc:1975 rc_option_editor.cc:1986
+#: rc_option_editor.cc:1997 rc_option_editor.cc:2008 rc_option_editor.cc:2017
+#: rc_option_editor.cc:2030 rc_option_editor.cc:2043 rc_option_editor.cc:2052
+#: rc_option_editor.cc:2062 rc_option_editor.cc:2079 rc_option_editor.cc:2186
 msgid "Transport"
 msgstr "Nagrywanie i odtwarzanie"
 
-#: ardour_ui_ed.cc:233
+#: ardour_ui_ed.cc:339 engine_dialog.cc:88
 msgid "Stop"
 msgstr "Zatrzymaj"
 
-#: ardour_ui_ed.cc:236
+#: ardour_ui_ed.cc:342
 msgid "Roll"
 msgstr ""
 
-#: ardour_ui_ed.cc:240 ardour_ui_ed.cc:243
+#: ardour_ui_ed.cc:346 ardour_ui_ed.cc:349
 msgid "Start/Stop"
 msgstr "Uruchom/Zatrzymaj"
 
-#: ardour_ui_ed.cc:246
+#: ardour_ui_ed.cc:352
 msgid "Start/Continue/Stop"
 msgstr ""
 
-#: ardour_ui_ed.cc:249
+#: ardour_ui_ed.cc:355
 msgid "Stop and Forget Capture"
 msgstr ""
 
-#: ardour_ui_ed.cc:259
-msgid "Transition To Roll"
-msgstr "Do przodu"
+#: ardour_ui_ed.cc:365
+msgid "Transition to Roll"
+msgstr ""
 
-#: ardour_ui_ed.cc:263
-msgid "Transition To Reverse"
-msgstr "Od tyłu"
+#: ardour_ui_ed.cc:369
+msgid "Transition to Reverse"
+msgstr ""
 
-#: ardour_ui_ed.cc:267
+#: ardour_ui_ed.cc:373
 msgid "Play Loop Range"
 msgstr "Odtwórz zakres pętli"
 
-#: ardour_ui_ed.cc:270
+#: ardour_ui_ed.cc:376
 msgid "Play Selection"
 msgstr ""
 
-#: ardour_ui_ed.cc:273
+#: ardour_ui_ed.cc:379
 msgid "Play Selection w/Preroll"
 msgstr ""
 
-#: ardour_ui_ed.cc:277
+#: ardour_ui_ed.cc:383
 msgid "Enable Record"
 msgstr "WÅ‚Ä…cz nagrywanie"
 
-#: ardour_ui_ed.cc:280 ardour_ui_ed.cc:284
+#: ardour_ui_ed.cc:386 ardour_ui_ed.cc:390
 msgid "Start Recording"
 msgstr "Rozpocznij nagrywanie"
 
-#: ardour_ui_ed.cc:288
+#: ardour_ui_ed.cc:394
 msgid "Rewind"
 msgstr "Przewiń do tyłu"
 
-#: ardour_ui_ed.cc:291
+#: ardour_ui_ed.cc:397
 msgid "Rewind (Slow)"
 msgstr "Przewiń do tyłu (powoli)"
 
-#: ardour_ui_ed.cc:294
+#: ardour_ui_ed.cc:400
 msgid "Rewind (Fast)"
 msgstr "Przewiń do tyłu (szybko)"
 
-#: ardour_ui_ed.cc:297
+#: ardour_ui_ed.cc:403
 msgid "Forward"
 msgstr "Przewiń do przodu"
 
-#: ardour_ui_ed.cc:300
+#: ardour_ui_ed.cc:406
 msgid "Forward (Slow)"
 msgstr "Przewiń do przodu (powoli)"
 
-#: ardour_ui_ed.cc:303
+#: ardour_ui_ed.cc:409
 msgid "Forward (Fast)"
 msgstr "Przewiń do przodu (szybko)"
 
-#: ardour_ui_ed.cc:306
+#: ardour_ui_ed.cc:412
 msgid "Go to Zero"
 msgstr "Do punktu zerowego"
 
-#: ardour_ui_ed.cc:309 ardour_ui_ed.cc:312
+#: ardour_ui_ed.cc:415 ardour_ui_ed.cc:418
 msgid "Go to Start"
 msgstr "Do poczÄ…tku"
 
-#: ardour_ui_ed.cc:315
+#: ardour_ui_ed.cc:421
 msgid "Go to End"
 msgstr "Do końca"
 
-#: ardour_ui_ed.cc:318
+#: ardour_ui_ed.cc:424
 msgid "Go to Wall Clock"
 msgstr ""
 
-#: ardour_ui_ed.cc:323 ardour_ui_ed.cc:326
+#: ardour_ui_ed.cc:429 ardour_ui_ed.cc:432
 msgid "Numpad Decimal"
 msgstr ""
 
-#: ardour_ui_ed.cc:329
+#: ardour_ui_ed.cc:435
 msgid "Numpad 0"
 msgstr ""
 
-#: ardour_ui_ed.cc:332
+#: ardour_ui_ed.cc:438
 msgid "Numpad 1"
 msgstr ""
 
-#: ardour_ui_ed.cc:335
+#: ardour_ui_ed.cc:441
 msgid "Numpad 2"
 msgstr ""
 
-#: ardour_ui_ed.cc:338
+#: ardour_ui_ed.cc:444
 msgid "Numpad 3"
 msgstr ""
 
-#: ardour_ui_ed.cc:341
+#: ardour_ui_ed.cc:447
 msgid "Numpad 4"
 msgstr ""
 
-#: ardour_ui_ed.cc:344
+#: ardour_ui_ed.cc:450
 msgid "Numpad 5"
 msgstr ""
 
-#: ardour_ui_ed.cc:347
+#: ardour_ui_ed.cc:453
 msgid "Numpad 6"
 msgstr ""
 
-#: ardour_ui_ed.cc:350
+#: ardour_ui_ed.cc:456
 msgid "Numpad 7"
 msgstr ""
 
-#: ardour_ui_ed.cc:353
+#: ardour_ui_ed.cc:459
 msgid "Numpad 8"
 msgstr ""
 
-#: ardour_ui_ed.cc:356
+#: ardour_ui_ed.cc:462
 msgid "Numpad 9"
 msgstr ""
 
-#: ardour_ui_ed.cc:360
+#: ardour_ui_ed.cc:466
 msgid "Focus On Clock"
 msgstr ""
 
-#: ardour_ui_ed.cc:364 ardour_ui_ed.cc:373 audio_clock.cc:2091 editor.cc:258
-#: editor_actions.cc:569 editor_actions.cc:578 export_timespan_selector.cc:88
+#: ardour_ui_ed.cc:470 ardour_ui_ed.cc:479 audio_clock.cc:2122 editor.cc:321
+#: editor_actions.cc:610 editor_actions.cc:619 export_timespan_selector.cc:85
 #: session_option_editor.cc:41 session_option_editor.cc:61
 #: session_option_editor.cc:80 session_option_editor.cc:96
 #: session_option_editor.cc:109 session_option_editor.cc:122
@@ -1966,257 +2342,275 @@ msgstr ""
 msgid "Timecode"
 msgstr "Zegar"
 
-#: ardour_ui_ed.cc:366 ardour_ui_ed.cc:375 editor_actions.cc:567
+#: ardour_ui_ed.cc:472 ardour_ui_ed.cc:481 editor_actions.cc:608
 msgid "Bars & Beats"
 msgstr "Takty i uderzenia"
 
-#: ardour_ui_ed.cc:368 ardour_ui_ed.cc:377
+#: ardour_ui_ed.cc:474 ardour_ui_ed.cc:483
 msgid "Minutes & Seconds"
 msgstr "Minuty i Sekundy"
 
-#: ardour_ui_ed.cc:370 ardour_ui_ed.cc:379 audio_clock.cc:2095 editor.cc:259
-#: editor_actions.cc:568
+#: ardour_ui_ed.cc:476 ardour_ui_ed.cc:485 audio_clock.cc:2125 editor.cc:322
+#: editor_actions.cc:609
 msgid "Samples"
 msgstr "Próbki"
 
-#: ardour_ui_ed.cc:382
+#: ardour_ui_ed.cc:488
 msgid "Punch In"
 msgstr "Wejście przełącznika"
 
-#: ardour_ui_ed.cc:383 mixer_strip.cc:1819 mixer_strip.cc:1843
-#: mixer_strip.cc:2007 route_ui.cc:162 time_info_box.cc:116
+#: ardour_ui_ed.cc:489 mixer_strip.cc:1992 mixer_strip.cc:2193 route_ui.cc:187
+#: time_info_box.cc:110
 msgid "In"
 msgstr "Wejście"
 
-#: ardour_ui_ed.cc:386
+#: ardour_ui_ed.cc:492
 msgid "Punch Out"
 msgstr "Wyjście przełącznika"
 
-#: ardour_ui_ed.cc:387 mixer_strip.cc:1831 time_info_box.cc:117
+#: ardour_ui_ed.cc:493 mixer_strip.cc:2004 time_info_box.cc:111
 msgid "Out"
 msgstr "Wyjście"
 
-#: ardour_ui_ed.cc:390
+#: ardour_ui_ed.cc:496
 msgid "Punch In/Out"
 msgstr "We/wy przełącznika"
 
-#: ardour_ui_ed.cc:391
+#: ardour_ui_ed.cc:497
 msgid "In/Out"
 msgstr ""
 
-#: ardour_ui_ed.cc:394 rc_option_editor.cc:1376
+#: ardour_ui_ed.cc:500 rc_option_editor.cc:1941
 msgid "Click"
 msgstr "Metronom"
 
-#: ardour_ui_ed.cc:397
+#: ardour_ui_ed.cc:503
 msgid "Auto Input"
 msgstr "Wejście dźwięku"
 
-#: ardour_ui_ed.cc:400
+#: ardour_ui_ed.cc:506
 msgid "Auto Play"
 msgstr "Autoodtwarzanie"
 
-#: ardour_ui_ed.cc:411
+#: ardour_ui_ed.cc:517
 msgid "Sync Startup to Video"
 msgstr ""
 
-#: ardour_ui_ed.cc:413
+#: ardour_ui_ed.cc:519
 msgid "Time Master"
 msgstr ""
 
-#: ardour_ui_ed.cc:420
+#: ardour_ui_ed.cc:521
+msgid "Use External Positional Sync Source"
+msgstr ""
+
+#: ardour_ui_ed.cc:526
 msgid "Toggle Record Enable Track %1"
 msgstr ""
 
-#: ardour_ui_ed.cc:427
+#: ardour_ui_ed.cc:533
 msgid "Percentage"
 msgstr "Procenty"
 
-#: ardour_ui_ed.cc:428 shuttle_control.cc:178
+#: ardour_ui_ed.cc:534 shuttle_control.cc:205
 msgid "Semitones"
 msgstr "Półtony"
 
-#: ardour_ui_ed.cc:432
+#: ardour_ui_ed.cc:538
 msgid "Send MTC"
 msgstr "Wysyłanie MTC"
 
-#: ardour_ui_ed.cc:434
+#: ardour_ui_ed.cc:540
 msgid "Send MMC"
 msgstr "Wysyłanie MMC"
 
-#: ardour_ui_ed.cc:436
+#: ardour_ui_ed.cc:542
 msgid "Use MMC"
 msgstr "Używanie MMC"
 
-#: ardour_ui_ed.cc:438 rc_option_editor.cc:2097
+#: ardour_ui_ed.cc:544 rc_option_editor.cc:2730
 msgid "Send MIDI Clock"
 msgstr ""
 
-#: ardour_ui_ed.cc:440
+#: ardour_ui_ed.cc:546
 msgid "Send MIDI Feedback"
 msgstr ""
 
-#: ardour_ui_ed.cc:446
+#: ardour_ui_ed.cc:552
 msgid "Panic"
 msgstr ""
 
-#: ardour_ui_ed.cc:534
+#: ardour_ui_ed.cc:629
 msgid "Wall Clock"
 msgstr ""
 
-#: ardour_ui_ed.cc:536
+#: ardour_ui_ed.cc:631
 msgid "Disk Space"
 msgstr ""
 
-#: ardour_ui_ed.cc:537
+#: ardour_ui_ed.cc:632
 msgid "DSP"
 msgstr ""
 
-#: ardour_ui_ed.cc:538
+#: ardour_ui_ed.cc:633
+msgid "X-run"
+msgstr ""
+
+#: ardour_ui_ed.cc:634
+msgid "Active Peak-file Work"
+msgstr ""
+
+#: ardour_ui_ed.cc:635
 msgid "Buffers"
 msgstr ""
 
-#: ardour_ui_ed.cc:540
+#: ardour_ui_ed.cc:637
 msgid "Timecode Format"
 msgstr ""
 
-#: ardour_ui_ed.cc:541
+#: ardour_ui_ed.cc:638
 msgid "File Format"
 msgstr ""
 
-#: ardour_ui_options.cc:63
+#: ardour_ui_options.cc:55
 msgid ""
 "It is not possible to use JACK as the the sync source\n"
 "when the pull up/down setting is non-zero."
 msgstr ""
 
-#: ardour_ui_options.cc:317
+#: ardour_ui_options.cc:309
 msgid "Internal"
 msgstr ""
 
-#: ardour_ui_options.cc:498
+#: ardour_ui_options.cc:518
 msgid "Enable/Disable external positional sync"
 msgstr ""
 
-#: ardour_ui_options.cc:500
+#: ardour_ui_options.cc:520
 msgid "Sync to JACK is not possible: video pull up/down is set"
 msgstr ""
 
-#: audio_clock.cc:1047 audio_clock.cc:1066
+#: audio_clock.cc:1057 audio_clock.cc:1076
 msgid "--pending--"
 msgstr ""
 
-#: audio_clock.cc:1118
+#: audio_clock.cc:1128
 msgid "SR"
 msgstr ""
 
-#: audio_clock.cc:1124 audio_clock.cc:1128
+#: audio_clock.cc:1134 audio_clock.cc:1138
 msgid "Pull"
 msgstr ""
 
-#: audio_clock.cc:1126
+#: audio_clock.cc:1136
 #, c-format
 msgid "%+.4f%%"
 msgstr ""
 
-#: audio_clock.cc:1282 editor.cc:260 editor_actions.cc:139
-#: editor_actions.cc:561
+#: audio_clock.cc:1292 editor.cc:323 editor_actions.cc:142
+#: editor_actions.cc:602
 msgid "Tempo"
 msgstr "Tempo"
 
-#: audio_clock.cc:1286 editor.cc:261 editor_actions.cc:562
+#: audio_clock.cc:1296 editor.cc:324 editor_actions.cc:603
 msgid "Meter"
 msgstr "Metrum"
 
-#: audio_clock.cc:1864 audio_streamview.cc:115 editor_actions.cc:1089
-#: session_metadata_dialog.cc:452 session_metadata_dialog.cc:500
-#: session_metadata_dialog.cc:556 session_metadata_dialog.cc:845
-#: streamview.cc:470
+#: audio_clock.cc:1878 audio_streamview.cc:117 editor_actions.cc:1092
+#: luainstance.cc:959 luainstance.cc:1575 plugin_pin_dialog.cc:859
+#: plugin_selector.cc:995 plugin_selector.cc:1016
+#: session_metadata_dialog.cc:455 session_metadata_dialog.cc:503
+#: session_metadata_dialog.cc:559 session_metadata_dialog.cc:848
+#: streamview.cc:474
 msgid "programming error: %1"
 msgstr "błąd programowania: %1"
 
-#: audio_clock.cc:1997 audio_clock.cc:2025
+#: audio_clock.cc:2011 audio_clock.cc:2039
 msgid "programming error: %1 %2"
 msgstr "błąd programowania: %1 %2"
 
-#: audio_clock.cc:2093 editor.cc:257 export_timespan_selector.cc:98
+#: audio_clock.cc:2123 editor.cc:320 export_timespan_selector.cc:95
 msgid "Bars:Beats"
 msgstr "Takty:Uderzenia"
 
-#: audio_clock.cc:2094 export_timespan_selector.cc:93
+#: audio_clock.cc:2124 export_timespan_selector.cc:90
 msgid "Minutes:Seconds"
 msgstr "Minuty i sekundy"
 
-#: audio_clock.cc:2099
-msgid "Set From Playhead"
+#: audio_clock.cc:2129
+msgid "Set from Playhead"
 msgstr ""
 
-#: audio_clock.cc:2100
+#: audio_clock.cc:2130
 msgid "Locate to This Time"
 msgstr ""
 
-#: audio_region_editor.cc:64 control_point_dialog.cc:49 rhythm_ferret.cc:124
-#: rhythm_ferret.cc:129 rhythm_ferret.cc:134
+#: audio_clock.cc:2133
+msgid "Copy to clipboard"
+msgstr ""
+
+#: audio_region_editor.cc:60 control_point_dialog.cc:49 rhythm_ferret.cc:137
+#: rhythm_ferret.cc:154
 msgid "dB"
 msgstr ""
 
-#: audio_region_editor.cc:67
+#: audio_region_editor.cc:63
 msgid "Region gain:"
 msgstr ""
 
-#: audio_region_editor.cc:77 export_format_dialog.cc:43
+#: audio_region_editor.cc:73 export_format_dialog.cc:49 export_report.cc:772
+#: export_report.cc:1185 fft_graph.cc:370
 msgid "dBFS"
 msgstr ""
 
-#: audio_region_editor.cc:80
+#: audio_region_editor.cc:76
 msgid "Peak amplitude:"
 msgstr ""
 
-#: audio_region_editor.cc:91
+#: audio_region_editor.cc:87
 msgid "Calculating..."
 msgstr ""
 
-#: audio_region_view.cc:1243
+#: audio_region_view.cc:1385
 msgid "add gain control point"
 msgstr "dodaj punkt kontrolny wzmocnienia"
 
-#: automation_controller.cc:286 automation_controller.cc:302
+#: automation_controller.cc:304 automation_controller.cc:320
 msgid "Select Note..."
 msgstr ""
 
-#: automation_controller.cc:293
+#: automation_controller.cc:311
 msgid "Halve"
 msgstr ""
 
-#: automation_controller.cc:296
+#: automation_controller.cc:314
 msgid "Double"
 msgstr ""
 
-#: automation_controller.cc:307
-msgid "Set to %1 beat(s)"
-msgstr ""
+#: automation_controller.cc:325
+msgid "Set to %1 beat"
+msgid_plural "Set to %1 beats"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
 
-#: automation_line.cc:286 automation_line.cc:462
+#: automation_line.cc:292 editor_drag.cc:4388
 msgid "automation event move"
 msgstr "przesuń zdarzenie automatyki"
 
-#: automation_line.cc:488 automation_line.cc:508
-msgid "automation range move"
-msgstr ""
-
-#: automation_line.cc:880 region_gain_line.cc:72
+#: automation_line.cc:888 region_gain_line.cc:75
 msgid "remove control point"
 msgstr "usuń punkt kontrolny"
 
-#: automation_line.cc:1003
+#: automation_line.cc:1013
 msgid "Ignoring illegal points on AutomationLine \"%1\""
 msgstr ""
 
-#: automation_region_view.cc:190 automation_time_axis.cc:644
+#: automation_region_view.cc:193 automation_time_axis.cc:649
 msgid "add automation event"
 msgstr ""
 
-#: automation_streamview.cc:95
+#: automation_streamview.cc:94
 msgid "unable to display automation region for control without list"
 msgstr ""
 
@@ -2228,63 +2622,59 @@ msgstr "stan automatyki"
 msgid "hide track"
 msgstr "ukryj ścieżkę"
 
-#: automation_time_axis.cc:308 automation_time_axis.cc:360
-#: automation_time_axis.cc:554 gain_meter.cc:220 generic_pluginui.cc:523
-#: generic_pluginui.cc:817 panner_ui.cc:151
+#: automation_time_axis.cc:310 automation_time_axis.cc:362
+#: automation_time_axis.cc:556 gain_meter.cc:230 generic_pluginui.cc:590
+#: generic_pluginui.cc:934 panner_ui.cc:151
 msgid "Automation|Manual"
 msgstr ""
 
-#: automation_time_axis.cc:310 automation_time_axis.cc:371
-#: automation_time_axis.cc:559 editor.cc:1904 editor.cc:1981
-#: editor_actions.cc:122 editor_actions.cc:1920 gain_meter.cc:223
-#: generic_pluginui.cc:99 generic_pluginui.cc:526 generic_pluginui.cc:819
-#: midi_time_axis.cc:1606 midi_time_axis.cc:1609 midi_time_axis.cc:1612
+#: automation_time_axis.cc:312 automation_time_axis.cc:373
+#: automation_time_axis.cc:561 editor.cc:2033 editor.cc:2111
+#: editor_actions.cc:125 editor_actions.cc:1937 gain_meter.cc:232
+#: generic_pluginui.cc:100 generic_pluginui.cc:593 generic_pluginui.cc:936
+#: midi_time_axis.cc:1610 midi_time_axis.cc:1613 midi_time_axis.cc:1616
 #: panner_ui.cc:154
 msgid "Play"
 msgstr "Odtwórz"
 
-#: automation_time_axis.cc:312 automation_time_axis.cc:382
-#: automation_time_axis.cc:564 gain_meter.cc:226 generic_pluginui.cc:101
-#: generic_pluginui.cc:529 generic_pluginui.cc:821 panner_ui.cc:157
+#: automation_time_axis.cc:314 automation_time_axis.cc:384
+#: automation_time_axis.cc:566 gain_meter.cc:234 generic_pluginui.cc:102
+#: generic_pluginui.cc:596 generic_pluginui.cc:938 panner_ui.cc:157
 msgid "Write"
 msgstr "Zapisz"
 
-#: automation_time_axis.cc:314 automation_time_axis.cc:393
-#: automation_time_axis.cc:569 gain_meter.cc:229 generic_pluginui.cc:103
-#: generic_pluginui.cc:532 generic_pluginui.cc:823 panner_ui.cc:160
+#: automation_time_axis.cc:316 automation_time_axis.cc:395
+#: automation_time_axis.cc:571 gain_meter.cc:236 generic_pluginui.cc:104
+#: generic_pluginui.cc:599 generic_pluginui.cc:940 panner_ui.cc:160
 msgid "Touch"
 msgstr "Dotyk"
 
-#: automation_time_axis.cc:404 generic_pluginui.cc:535 meter_patterns.cc:112
+#: automation_time_axis.cc:406 generic_pluginui.cc:602 meter_patterns.cc:118
 msgid "???"
 msgstr "???"
 
-#: automation_time_axis.cc:445
+#: automation_time_axis.cc:447
 msgid "clear automation"
 msgstr "wyczyść automatyzację"
 
-#: automation_time_axis.cc:543 editor_actions.cc:645 editor_markers.cc:902
-#: location_ui.cc:57 plugin_selector.cc:86 route_time_axis.cc:854
-msgid "Hide"
-msgstr "Ukryj"
-
-#: automation_time_axis.cc:545
+#: automation_time_axis.cc:547 rc_option_editor.cc:2916
+#: rc_option_editor.cc:2921 rc_option_editor.cc:2967 rc_option_editor.cc:2972
 msgid "Clear"
 msgstr "Wyczyść"
 
-#: automation_time_axis.cc:576
+#: automation_time_axis.cc:578
 msgid "State"
 msgstr "Stan"
 
-#: automation_time_axis.cc:592
+#: automation_time_axis.cc:594
 msgid "Discrete"
 msgstr ""
 
-#: automation_time_axis.cc:598 export_format_dialog.cc:485
+#: automation_time_axis.cc:600 export_format_dialog.cc:552
 msgid "Linear"
 msgstr "Liniowy"
 
-#: automation_time_axis.cc:604 rhythm_ferret.cc:109 shuttle_control.cc:197
+#: automation_time_axis.cc:606 rhythm_ferret.cc:118 shuttle_control.cc:224
 msgid "Mode"
 msgstr "Tryb"
 
@@ -2300,35 +2690,38 @@ msgstr ""
 msgid "Direction:"
 msgstr ""
 
-#: bundle_manager.cc:206 bundle_manager.cc:210 engine_dialog.cc:662
-#: mixer_strip.cc:162 mixer_strip.cc:367 mixer_strip.cc:2240
-#: rc_option_editor.cc:2326
+#: bundle_manager.cc:206 bundle_manager.cc:210 engine_dialog.cc:976
+#: mixer_strip.cc:175 mixer_strip.cc:392 mixer_strip.cc:2451
+#: rc_option_editor.cc:3135
 msgid "Input"
 msgstr "Wejście"
 
 #: bundle_manager.cc:207 bundle_manager.cc:212 bundle_manager.cc:246
-#: engine_dialog.cc:664 mixer_strip.cc:166 mixer_strip.cc:371
-#: mixer_strip.cc:2243 rc_option_editor.cc:2330
+#: engine_dialog.cc:978 mixer_strip.cc:179 mixer_strip.cc:396
+#: mixer_strip.cc:2454 monitor_section.cc:296 monitor_section.cc:300
+#: rc_option_editor.cc:3139
 msgid "Output"
 msgstr "Wyjście"
 
-#: bundle_manager.cc:265 editor.cc:1945 editor_actions.cc:94
-#: editor_actions.cc:104 rc_option_editor.cc:1087 rc_option_editor.cc:1094
+#: bundle_manager.cc:265 editor.cc:2075 editor_actions.cc:97
+#: editor_actions.cc:107 lua_script_manager.cc:33 rc_option_editor.cc:2928
+#: rc_option_editor.cc:2942
 msgid "Edit"
 msgstr "Edycja"
 
-#: bundle_manager.cc:266 editor.cc:5902 editor.cc:5930 editor_actions.cc:338
-#: editor_actions.cc:339 editor_actions.cc:405 plugin_ui.cc:420
-#: processor_box.cc:2458 route_time_axis.cc:859
+#: bundle_manager.cc:266 editor.cc:5962 editor.cc:5992 editor_actions.cc:360
+#: editor_actions.cc:361 luawindow.cc:101 plugin_ui.cc:420
+#: processor_box.cc:3669 processor_box.cc:3671
 msgid "Delete"
 msgstr "Usuń"
 
-#: bundle_manager.cc:272 bundle_manager.cc:439 editor_route_groups.cc:97
-#: editor_routes.cc:206 midi_list_editor.cc:107 session_metadata_dialog.cc:646
+#: bundle_manager.cc:272 bundle_manager.cc:439 editor_route_groups.cc:98
+#: editor_routes.cc:233 lua_script_manager.cc:42 lua_script_manager.cc:76
+#: midi_list_editor.cc:107 session_metadata_dialog.cc:649
 msgid "Name"
 msgstr "Nazwa"
 
-#: bundle_manager.cc:283
+#: bundle_manager.cc:283 luawindow.cc:566
 msgid "New"
 msgstr "Utwórz"
 
@@ -2344,6 +2737,39 @@ msgstr ""
 msgid "Rename Channel"
 msgstr ""
 
+#: color_theme_manager.cc:58
+msgid "Restore Defaults"
+msgstr ""
+
+#: color_theme_manager.cc:62
+msgid "Color Theme"
+msgstr ""
+
+#: color_theme_manager.cc:126
+msgid "Object"
+msgstr "Obiekt"
+
+#: color_theme_manager.cc:129 route_group_dialog.cc:53
+#: route_group_dialog.cc:81
+msgid "Color"
+msgstr "Kolor"
+
+#: color_theme_manager.cc:151
+msgid "Items"
+msgstr ""
+
+#: color_theme_manager.cc:152
+msgid "Palette"
+msgstr ""
+
+#: color_theme_manager.cc:153
+msgid "Transparency"
+msgstr ""
+
+#: color_theme_manager.cc:475
+msgid "Color Palette"
+msgstr ""
+
 #: configinfo.cc:28
 msgid "Build Configuration"
 msgstr ""
@@ -2356,6 +2782,42 @@ msgstr ""
 msgid "Value"
 msgstr ""
 
+#: control_slave_ui.cc:50 mixer_ui.cc:254
+msgid "Control Masters"
+msgstr ""
+
+#: control_slave_ui.cc:54
+msgid "-vca-"
+msgstr ""
+
+#: control_slave_ui.cc:211
+msgid "Unassign All"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:35
+msgid "Duplicate Tracks & Busses"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:36
+msgid "Copy playlists"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:37
+msgid "Create new (empty) playlists"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:38
+msgid "Share playlists"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:41
+msgid "Duplicate each track/bus this number of times:"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:176
+msgid "1 or more tracks/busses could not be duplicated"
+msgstr ""
+
 #: edit_note_dialog.cc:42
 msgid "Note"
 msgstr ""
@@ -2393,2060 +2855,2155 @@ msgstr ""
 msgid "Velocity"
 msgstr ""
 
-#: edit_note_dialog.cc:88 patch_change_dialog.cc:66
+#: edit_note_dialog.cc:88 export_report.cc:246 export_report.cc:688
+#: patch_change_dialog.cc:66
 msgid "Time"
 msgstr ""
 
-#: edit_note_dialog.cc:98 editor_regions.cc:115
-#: export_timespan_selector.cc:378 export_timespan_selector.cc:440
-#: location_ui.cc:320 midi_list_editor.cc:115 time_info_box.cc:108
+#: edit_note_dialog.cc:99 editor_regions.cc:162
+#: export_timespan_selector.cc:375 export_timespan_selector.cc:437
+#: location_ui.cc:322 midi_list_editor.cc:115 time_info_box.cc:102
 msgid "Length"
 msgstr ""
 
-#: edit_note_dialog.cc:165
+#: edit_note_dialog.cc:166
 msgid "edit note"
 msgstr ""
 
-#: editor.cc:147
+#: editor.cc:160
 msgid "CD Frames"
 msgstr "Klatki CD"
 
-#: editor.cc:148
+#: editor.cc:161
 msgid "TC Frames"
 msgstr ""
 
-#: editor.cc:149
+#: editor.cc:162
 msgid "TC Seconds"
 msgstr ""
 
-#: editor.cc:150
+#: editor.cc:163
 msgid "TC Minutes"
 msgstr ""
 
-#: editor.cc:151
+#: editor.cc:164
 msgid "Seconds"
 msgstr "Sekundy"
 
-#: editor.cc:152
+#: editor.cc:165
 msgid "Minutes"
 msgstr "Minuty"
 
-#: editor.cc:153 quantize_dialog.cc:37 quantize_dialog.cc:141
+#: editor.cc:166 quantize_dialog.cc:37
 msgid "Beats/128"
 msgstr ""
 
-#: editor.cc:154 quantize_dialog.cc:38 quantize_dialog.cc:143
+#: editor.cc:167 quantize_dialog.cc:38
 msgid "Beats/64"
 msgstr ""
 
-#: editor.cc:155 quantize_dialog.cc:39 quantize_dialog.cc:145
+#: editor.cc:168 quantize_dialog.cc:39
 msgid "Beats/32"
 msgstr "Uderzenia/32"
 
-#: editor.cc:156
+#: editor.cc:169 quantize_dialog.cc:40
 msgid "Beats/28"
 msgstr ""
 
-#: editor.cc:157
+#: editor.cc:170 quantize_dialog.cc:41
 msgid "Beats/24"
 msgstr ""
 
-#: editor.cc:158
+#: editor.cc:171 quantize_dialog.cc:42
 msgid "Beats/20"
 msgstr ""
 
-#: editor.cc:159 quantize_dialog.cc:40 quantize_dialog.cc:147
+#: editor.cc:172 quantize_dialog.cc:43
 msgid "Beats/16"
 msgstr "Uderzenia/16"
 
-#: editor.cc:160
+#: editor.cc:173 quantize_dialog.cc:44
 msgid "Beats/14"
 msgstr ""
 
-#: editor.cc:161
+#: editor.cc:174 quantize_dialog.cc:45
 msgid "Beats/12"
 msgstr ""
 
-#: editor.cc:162
+#: editor.cc:175 quantize_dialog.cc:46
 msgid "Beats/10"
 msgstr ""
 
-#: editor.cc:163 quantize_dialog.cc:41 quantize_dialog.cc:149
+#: editor.cc:176 quantize_dialog.cc:47
 msgid "Beats/8"
 msgstr "Uderzenia/8"
 
-#: editor.cc:164
+#: editor.cc:177 quantize_dialog.cc:48
 msgid "Beats/7"
 msgstr ""
 
-#: editor.cc:165
+#: editor.cc:178 quantize_dialog.cc:49
 msgid "Beats/6"
 msgstr ""
 
-#: editor.cc:166
+#: editor.cc:179 quantize_dialog.cc:50
 msgid "Beats/5"
 msgstr ""
 
-#: editor.cc:167 quantize_dialog.cc:42 quantize_dialog.cc:151
+#: editor.cc:180 quantize_dialog.cc:51
 msgid "Beats/4"
 msgstr "Uderzenia/4"
 
-#: editor.cc:168 quantize_dialog.cc:43 quantize_dialog.cc:153
+#: editor.cc:181 quantize_dialog.cc:52
 msgid "Beats/3"
 msgstr "Uderzenia/3"
 
-#: editor.cc:169 quantize_dialog.cc:44 quantize_dialog.cc:155
+#: editor.cc:182 quantize_dialog.cc:53
 msgid "Beats/2"
 msgstr ""
 
-#: editor.cc:170 quantize_dialog.cc:45 quantize_dialog.cc:157
+#: editor.cc:183 quantize_dialog.cc:54
 msgid "Beats"
 msgstr "Uderzenia"
 
-#: editor.cc:171
+#: editor.cc:184
 msgid "Bars"
 msgstr "Takty"
 
-#: editor.cc:172
+#: editor.cc:185
 msgid "Marks"
 msgstr "Znaczniki"
 
-#: editor.cc:173
+#: editor.cc:186
 msgid "Region starts"
 msgstr "PoczÄ…tek obszaru"
 
-#: editor.cc:174
+#: editor.cc:187
 msgid "Region ends"
 msgstr "Koniec obszaru"
 
-#: editor.cc:175
+#: editor.cc:188
 msgid "Region syncs"
 msgstr "Synchronizacja obszaru"
 
-#: editor.cc:176
+#: editor.cc:189
 msgid "Region bounds"
 msgstr "Granice obszaru"
 
-#: editor.cc:181 editor_actions.cc:510
+#: editor.cc:194 editor_actions.cc:551
 msgid "No Grid"
 msgstr "Bez siatki"
 
-#: editor.cc:182 editor_actions.cc:511
+#: editor.cc:195 editor_actions.cc:552
 msgid "Grid"
 msgstr "Siatka"
 
-#: editor.cc:183 editor_actions.cc:512
+#: editor.cc:196 editor_actions.cc:553
 msgid "Magnetic"
 msgstr "PrzyciÄ…ganie"
 
-#: editor.cc:188 editor.cc:206 editor_actions.cc:121 editor_actions.cc:493
+#: editor.cc:201 editor.cc:219 editor_actions.cc:124 editor_actions.cc:534
 msgid "Playhead"
 msgstr "GÅ‚owica"
 
-#: editor.cc:189 editor_actions.cc:495
+#: editor.cc:202 editor_actions.cc:536
 msgid "Marker"
 msgstr "Znacznik"
 
-#: editor.cc:190 editor.cc:207 editor_actions.cc:494
+#: editor.cc:203 editor.cc:220 editor_actions.cc:535
 msgid "Mouse"
 msgstr "Wskaźnik myszy"
 
-#: editor.cc:195 editor_actions.cc:502
+#: editor.cc:208 editor_actions.cc:543
 msgid "Slide"
 msgstr "Åšlizg"
 
-#: editor.cc:196
+#: editor.cc:209
 msgid "Splice"
 msgstr "Klocek"
 
-#: editor.cc:197 editor_actions.cc:501
+#: editor.cc:210 editor_actions.cc:542
 msgid "Ripple"
 msgstr ""
 
-#: editor.cc:198 editor_actions.cc:157 editor_actions.cc:503
-#: editor_actions.cc:1789 editor_markers.cc:905 editor_rulers.cc:260
-#: location_ui.cc:58 mixer_strip.cc:195 mixer_strip.cc:2028
+#: editor.cc:211 editor_actions.cc:1806 editor_markers.cc:910
+#: editor_rulers.cc:259 location_ui.cc:62
 msgid "Lock"
 msgstr "Zablokuj"
 
-#: editor.cc:203 mono_panner_editor.cc:42
+#: editor.cc:216 mono_panner_editor.cc:44
 msgid "Left"
 msgstr "Lewa"
 
-#: editor.cc:204 mono_panner_editor.cc:47
+#: editor.cc:217 mono_panner_editor.cc:49
 msgid "Right"
 msgstr "Prawa"
 
-#: editor.cc:205
+#: editor.cc:218
 msgid "Center"
 msgstr "Åšrodek"
 
-#: editor.cc:208 editor.cc:3231
+#: editor.cc:221
 msgid "Edit point"
 msgstr "Punkt edycji"
 
-#: editor.cc:214
+#: editor.cc:227
 msgid "Mushy"
 msgstr ""
 
-#: editor.cc:215
+#: editor.cc:228
 msgid "Smooth"
 msgstr "PÅ‚ynnie"
 
-#: editor.cc:216
+#: editor.cc:229
 msgid "Balanced multitimbral mixture"
 msgstr ""
 
-#: editor.cc:217
+#: editor.cc:230
 msgid "Unpitched percussion with stable notes"
 msgstr ""
 
-#: editor.cc:218
+#: editor.cc:231
 msgid "Crisp monophonic instrumental"
 msgstr ""
 
-#: editor.cc:219
+#: editor.cc:232
 msgid "Unpitched solo percussion"
 msgstr ""
 
-#: editor.cc:220
+#: editor.cc:233
 msgid "Resample without preserving pitch"
 msgstr ""
 
-#: editor.cc:256
+#: editor.cc:319
 msgid "Mins:Secs"
 msgstr "min:s"
 
-#: editor.cc:262
+#: editor.cc:325
 msgid "Location Markers"
 msgstr "Znaczniki położenia"
 
-#: editor.cc:263
+#: editor.cc:326
 msgid "Range Markers"
 msgstr "Znaczniki zakresu"
 
-#: editor.cc:264
+#: editor.cc:327
 msgid "Loop/Punch Ranges"
 msgstr "Zakresy pętli/przełącznika"
 
-#: editor.cc:265 editor_actions.cc:565
+#: editor.cc:328 editor_actions.cc:606
 msgid "CD Markers"
 msgstr "Znaczniki CD"
 
-#: editor.cc:266
+#: editor.cc:329
 msgid "Video Timeline"
 msgstr ""
 
-#: editor.cc:283
+#: editor.cc:386
 msgid "mode"
 msgstr "tryb"
 
-#: editor.cc:459 editor_actions.cc:114 editor_actions.cc:564
+#: editor.cc:535 editor_actions.cc:117 editor_actions.cc:605
 msgid "Markers"
 msgstr "Znaczniki"
 
-#: editor.cc:577 rc_option_editor.cc:1939
+#: editor.cc:653 rc_option_editor.cc:2527
 msgid "Regions"
 msgstr "Obszar"
 
-#: editor.cc:578
+#: editor.cc:654
 msgid "Tracks & Busses"
 msgstr ""
 
-#: editor.cc:579
+#: editor.cc:655
 msgid "Snapshots"
 msgstr "Zrzuty"
 
-#: editor.cc:580
+#: editor.cc:656
 msgid "Track & Bus Groups"
 msgstr ""
 
-#: editor.cc:581
+#: editor.cc:657
 msgid "Ranges & Marks"
 msgstr ""
 
-#: editor.cc:728 editor.cc:5754 rc_option_editor.cc:1619
-#: rc_option_editor.cc:1627 rc_option_editor.cc:1635 rc_option_editor.cc:1643
-#: rc_option_editor.cc:1667 rc_option_editor.cc:1679 rc_option_editor.cc:1681
-#: rc_option_editor.cc:1689 rc_option_editor.cc:1697 rc_option_editor.cc:1717
-#: rc_option_editor.cc:1729 rc_option_editor.cc:1731 rc_option_editor.cc:1733
-#: rc_option_editor.cc:1741 rc_option_editor.cc:1749 rc_option_editor.cc:1757
-#: rc_option_editor.cc:1772 rc_option_editor.cc:1776 rc_option_editor.cc:1800
-msgid "Editor"
-msgstr "Edytor"
-
-#: editor.cc:1331 editor.cc:4735 editor_actions.cc:134 editor_actions.cc:1865
+#: editor.cc:1333 editor.cc:4737 editor_actions.cc:137 editor_actions.cc:1882
 msgid "Loop"
 msgstr "Pętla"
 
-#: editor.cc:1337 editor.cc:4762 editor_actions.cc:135 time_info_box.cc:68
+#: editor.cc:1339 editor.cc:4764 editor_actions.cc:138 time_info_box.cc:62
 msgid "Punch"
 msgstr "Przełącznik"
 
-#: editor.cc:1449 rc_option_editor.cc:1661
+#: editor.cc:1474 rc_option_editor.cc:2299
 msgid "Linear (for highly correlated material)"
 msgstr ""
 
-#: editor.cc:1459 rc_option_editor.cc:1662
+#: editor.cc:1484 rc_option_editor.cc:2300
 msgid "Constant power"
 msgstr ""
 
-#: editor.cc:1468 rc_option_editor.cc:1663
+#: editor.cc:1493 rc_option_editor.cc:2301
 msgid "Symmetric"
 msgstr ""
 
-#: editor.cc:1478 rc_option_editor.cc:1664
+#: editor.cc:1503 rc_option_editor.cc:2302
 msgid "Slow"
 msgstr "Wolno"
 
-#: editor.cc:1487 rc_option_editor.cc:1665 sfdb_ui.cc:1771 sfdb_ui.cc:1881
+#: editor.cc:1512 rc_option_editor.cc:2303 sfdb_ui.cc:1737 sfdb_ui.cc:1847
 msgid "Fast"
 msgstr "Szybko"
 
-#: editor.cc:1509 editor.cc:1534
+#: editor.cc:1534 editor.cc:1559
 msgid "Deactivate"
 msgstr "Wyłącz"
 
-#: editor.cc:1511 editor.cc:1536
+#: editor.cc:1536 editor.cc:1561
 msgid "Activate"
 msgstr "WÅ‚Ä…cz"
 
-#: editor.cc:1637 editor.cc:1645 editor_ops.cc:3824
+#: editor.cc:1662 editor.cc:1670 editor_ops.cc:3921
 msgid "Freeze"
 msgstr "Zamroź"
 
-#: editor.cc:1641
+#: editor.cc:1666
 msgid "Unfreeze"
 msgstr "Odmroź"
 
-#: editor.cc:1780
+#: editor.cc:1766
+msgid "Region Loudness Analysis"
+msgstr ""
+
+#: editor.cc:1785 editor.cc:1834
+msgid "Audio Report/Analysis"
+msgstr ""
+
+#: editor.cc:1815
+msgid "Range Loudness Analysis"
+msgstr ""
+
+#: editor.cc:1901
 msgid "Selected Regions"
 msgstr ""
 
-#: editor.cc:1816 editor_markers.cc:940
+#: editor.cc:1945 editor_markers.cc:945
 msgid "Play Range"
 msgstr "Odtwórz zakres"
 
-#: editor.cc:1817 editor_markers.cc:943
+#: editor.cc:1946 editor_markers.cc:948
 msgid "Loop Range"
 msgstr "Zapętl zakres"
 
-#: editor.cc:1820 editor_markers.cc:950
+#: editor.cc:1949 editor_markers.cc:953
 msgid "Zoom to Range"
 msgstr ""
 
-#: editor.cc:1829 editor_actions.cc:369
+#: editor.cc:1952
+msgid "Loudness Analysis"
+msgstr ""
+
+#: editor.cc:1959 editor_actions.cc:401
 msgid "Move Range Start to Previous Region Boundary"
 msgstr ""
 
-#: editor.cc:1836 editor_actions.cc:376
+#: editor.cc:1966 editor_actions.cc:408
 msgid "Move Range Start to Next Region Boundary"
 msgstr ""
 
-#: editor.cc:1843 editor_actions.cc:383
+#: editor.cc:1973 editor_actions.cc:415
 msgid "Move Range End to Previous Region Boundary"
 msgstr ""
 
-#: editor.cc:1850 editor_actions.cc:390
+#: editor.cc:1980 editor_actions.cc:422
 msgid "Move Range End to Next Region Boundary"
 msgstr ""
 
-#: editor.cc:1856 editor_actions.cc:133 editor_actions.cc:325
+#: editor.cc:1986 editor_actions.cc:136 editor_actions.cc:347
 msgid "Separate"
 msgstr "Oddziel"
 
-#: editor.cc:1857
+#: editor.cc:1987
 msgid "Convert to Region in Region List"
 msgstr ""
 
-#: editor.cc:1860 editor_markers.cc:970
+#: editor.cc:1990 editor_markers.cc:973
 msgid "Select All in Range"
 msgstr "Wszystko w zakresie"
 
-#: editor.cc:1863 editor_actions.cc:297
+#: editor.cc:1993 editor_actions.cc:319
 msgid "Set Loop from Selection"
 msgstr ""
 
-#: editor.cc:1864 editor_actions.cc:298
+#: editor.cc:1994 editor_actions.cc:320
 msgid "Set Punch from Selection"
 msgstr ""
 
-#: editor.cc:1865 editor_actions.cc:299
+#: editor.cc:1995 editor_actions.cc:321
 msgid "Set Session Start/End from Selection"
 msgstr ""
 
-#: editor.cc:1868
+#: editor.cc:1998
 msgid "Add Range Markers"
 msgstr "Dodaj znaczniki zakresu"
 
-#: editor.cc:1871
+#: editor.cc:2001
 msgid "Crop Region to Range"
 msgstr ""
 
-#: editor.cc:1872
-msgid "Fill Range with Region"
-msgstr ""
-
-#: editor.cc:1873 editor_actions.cc:311
+#: editor.cc:2002 editor_actions.cc:333
 msgid "Duplicate Range"
 msgstr "Duplikuj"
 
-#: editor.cc:1876
+#: editor.cc:2005
 msgid "Consolidate Range"
 msgstr ""
 
-#: editor.cc:1877
-msgid "Consolidate Range With Processing"
+#: editor.cc:2006
+msgid "Consolidate Range with Processing"
 msgstr ""
 
-#: editor.cc:1878
+#: editor.cc:2007
 msgid "Bounce Range to Region List"
 msgstr ""
 
-#: editor.cc:1879
-msgid "Bounce Range to Region List With Processing"
+#: editor.cc:2008
+msgid "Bounce Range to Region List with Processing"
 msgstr ""
 
-#: editor.cc:1880 editor_markers.cc:953
+#: editor.cc:2009 editor_markers.cc:956
 msgid "Export Range..."
 msgstr ""
 
-#: editor.cc:1882
+#: editor.cc:2011
 msgid "Export Video Range..."
 msgstr ""
 
-#: editor.cc:1898 editor.cc:1979 editor_actions.cc:303
-msgid "Play From Edit Point"
-msgstr "Od punktu edycji"
+#: editor.cc:2027 editor.cc:2109 editor_actions.cc:325
+msgid "Play from Edit Point"
+msgstr ""
 
-#: editor.cc:1899 editor.cc:1980
-msgid "Play From Start"
+#: editor.cc:2028 editor.cc:2110
+msgid "Play from Start"
 msgstr ""
 
-#: editor.cc:1900
+#: editor.cc:2029
 msgid "Play Region"
 msgstr ""
 
-#: editor.cc:1902
+#: editor.cc:2031
 msgid "Loop Region"
 msgstr "Zapętl obszar"
 
-#: editor.cc:1912 editor.cc:1989
+#: editor.cc:2041 editor.cc:2119
 msgid "Select All in Track"
 msgstr ""
 
-#: editor.cc:1913 editor.cc:1990 editor_actions.cc:194
+#: editor.cc:2042 editor.cc:2120 editor_actions.cc:196
 msgid "Select All Objects"
 msgstr ""
 
-#: editor.cc:1914 editor.cc:1991
+#: editor.cc:2043 editor.cc:2121
 msgid "Invert Selection in Track"
 msgstr ""
 
-#: editor.cc:1915 editor.cc:1992 editor_actions.cc:197
+#: editor.cc:2044 editor.cc:2122 editor_actions.cc:199
 msgid "Invert Selection"
 msgstr "Odwróć zaznaczenie"
 
-#: editor.cc:1917
+#: editor.cc:2046 editor_actions.cc:201
 msgid "Set Range to Loop Range"
 msgstr ""
 
-#: editor.cc:1918
+#: editor.cc:2047 editor_actions.cc:202
 msgid "Set Range to Punch Range"
 msgstr ""
 
-#: editor.cc:1920 editor.cc:1994 editor_actions.cc:199 editor_actions.cc:200
+#: editor.cc:2048 editor_actions.cc:203
+msgid "Set Range to Selected Regions"
+msgstr ""
+
+#: editor.cc:2050 editor.cc:2124 editor_actions.cc:205 editor_actions.cc:206
 msgid "Select All After Edit Point"
 msgstr "Wszystko za punktem edycji"
 
-#: editor.cc:1921 editor.cc:1995 editor_actions.cc:201 editor_actions.cc:202
+#: editor.cc:2051 editor.cc:2125 editor_actions.cc:207 editor_actions.cc:208
 msgid "Select All Before Edit Point"
 msgstr "Wszystko przed punktem edycji"
 
-#: editor.cc:1922 editor.cc:1996
+#: editor.cc:2052 editor.cc:2126
 msgid "Select All After Playhead"
 msgstr "Wszystko za głowicą"
 
-#: editor.cc:1923 editor.cc:1997
+#: editor.cc:2053 editor.cc:2127
 msgid "Select All Before Playhead"
 msgstr "Wszystko przed głowicą"
 
-#: editor.cc:1924
+#: editor.cc:2054
 msgid "Select All Between Playhead and Edit Point"
 msgstr ""
 
-#: editor.cc:1925
+#: editor.cc:2055
 msgid "Select All Within Playhead and Edit Point"
 msgstr ""
 
-#: editor.cc:1926
+#: editor.cc:2056
 msgid "Select Range Between Playhead and Edit Point"
 msgstr ""
 
-#: editor.cc:1928 editor.cc:1999 editor_actions.cc:131 editor_actions.cc:132
+#: editor.cc:2058 editor.cc:2129 editor_actions.cc:134 editor_actions.cc:135
 msgid "Select"
 msgstr "Zaznacz"
 
-#: editor.cc:1936 editor.cc:2007 editor_actions.cc:337 processor_box.cc:2451
+#: editor.cc:2066 editor.cc:2137 editor_actions.cc:359 processor_box.cc:3665
 msgid "Cut"
 msgstr "Wytnij"
 
-#: editor.cc:1937 editor.cc:2008 editor_actions.cc:341 processor_box.cc:2454
+#: editor.cc:2067 editor.cc:2138 editor_actions.cc:363 processor_box.cc:3667
 msgid "Copy"
 msgstr "Skopiuj"
 
-#: editor.cc:1938 editor.cc:2009 editor_actions.cc:342 processor_box.cc:2462
+#: editor.cc:2068 editor.cc:2139 editor_actions.cc:364 processor_box.cc:3679
 msgid "Paste"
 msgstr "Wklej"
 
-#: editor.cc:1942 editor_actions.cc:91
+#: editor.cc:2072 editor_actions.cc:94
 msgid "Align"
 msgstr "Wyrównaj"
 
-#: editor.cc:1943
+#: editor.cc:2073
 msgid "Align Relative"
 msgstr "Wyrównaj relatywnie"
 
-#: editor.cc:1950
+#: editor.cc:2080
 msgid "Insert Selected Region"
 msgstr "Wstaw zaznaczony obszar"
 
-#: editor.cc:1951
+#: editor.cc:2081
 msgid "Insert Existing Media"
 msgstr ""
 
-#: editor.cc:1960 editor.cc:2016
+#: editor.cc:2090 editor.cc:2146
 msgid "Nudge Entire Track Later"
 msgstr ""
 
-#: editor.cc:1961 editor.cc:2017
+#: editor.cc:2091 editor.cc:2147
 msgid "Nudge Track After Edit Point Later"
 msgstr ""
 
-#: editor.cc:1962 editor.cc:2018
+#: editor.cc:2092 editor.cc:2148
 msgid "Nudge Entire Track Earlier"
 msgstr ""
 
-#: editor.cc:1963 editor.cc:2019
+#: editor.cc:2093 editor.cc:2149
 msgid "Nudge Track After Edit Point Earlier"
 msgstr ""
 
-#: editor.cc:1965 editor.cc:2021
+#: editor.cc:2095 editor.cc:2151
 msgid "Nudge"
 msgstr "Pchnij"
 
-#: editor.cc:2235
+#: editor.cc:2353
 msgid ""
 "Playhead position stored with a negative value - ignored (use zero instead)"
 msgstr ""
 
-#: editor.cc:3006 editor.cc:3707 editor.cc:3778 midi_channel_selector.cc:157
+#: editor.cc:3115 editor.cc:3775 editor.cc:3846 midi_channel_selector.cc:157
 #: midi_channel_selector.cc:395 midi_channel_selector.cc:431
 msgid "All"
 msgstr ""
 
-#: editor.cc:3210
-msgid "Smart Mode (add Range functions to Grab mode)"
+#: editor.cc:3280
+msgid "Smart Mode (add range functions to Grab Mode)"
 msgstr ""
 
-#: editor.cc:3211
+#: editor.cc:3281
 msgid "Grab Mode (select/move objects)"
 msgstr ""
 
-#: editor.cc:3212
+#: editor.cc:3282
 msgid "Cut Mode (split regions)"
 msgstr ""
 
-#: editor.cc:3213
+#: editor.cc:3283
 msgid "Range Mode (select time ranges)"
 msgstr ""
 
-#: editor.cc:3214
+#: editor.cc:3284
 msgid "Draw Mode (draw and edit gain/notes/automation)"
 msgstr ""
 
-#: editor.cc:3215
+#: editor.cc:3285
 msgid "Stretch Mode (time-stretch audio and midi regions, preserving pitch)"
 msgstr ""
 
-#: editor.cc:3216
+#: editor.cc:3286
 msgid "Audition Mode (listen to regions)"
 msgstr ""
 
-#: editor.cc:3217
-msgid "Internal Edit Mode (edit notes and gain curves inside regions)"
+#: editor.cc:3287
+msgid "Internal Edit Mode (edit notes and automation points)"
 msgstr ""
 
-#: editor.cc:3218
+#: editor.cc:3288
 msgid ""
 "Groups: click to (de)activate\n"
 "Context-click for other operations"
 msgstr ""
 
-#: editor.cc:3219
+#: editor.cc:3289
 msgid "Nudge Region/Selection Later"
 msgstr ""
 
-#: editor.cc:3220
+#: editor.cc:3290
 msgid "Nudge Region/Selection Earlier"
 msgstr ""
 
-#: editor.cc:3221 editor_actions.cc:262
+#: editor.cc:3291 editor_actions.cc:272
 msgid "Zoom In"
 msgstr "Powiększ"
 
-#: editor.cc:3222 editor_actions.cc:261
+#: editor.cc:3292 editor_actions.cc:271
 msgid "Zoom Out"
 msgstr "Pomniejsz"
 
-#: editor.cc:3223
+#: editor.cc:3293
 msgid "Zoom to Time Scale"
 msgstr ""
 
-#: editor.cc:3224 editor.cc:3729 editor_actions.cc:263
+#: editor.cc:3294 editor.cc:3797 editor_actions.cc:273
 msgid "Zoom to Session"
 msgstr "Dopasuj do sesji"
 
-#: editor.cc:3225
-msgid "Zoom focus"
+#: editor.cc:3295 editor_actions.cc:115 editor_actions.cc:148
+msgid "Zoom Focus"
 msgstr "Powiększanie do"
 
-#: editor.cc:3226
+#: editor.cc:3296
 msgid "Expand Tracks"
 msgstr ""
 
-#: editor.cc:3227
+#: editor.cc:3297
 msgid "Shrink Tracks"
 msgstr ""
 
-#: editor.cc:3228
+#: editor.cc:3298
 msgid "Number of visible tracks"
 msgstr ""
 
-#: editor.cc:3229
+#: editor.cc:3299
 msgid "Snap/Grid Units"
 msgstr ""
 
-#: editor.cc:3230
+#: editor.cc:3300
 msgid "Snap/Grid Mode"
 msgstr "Tryb przyciÄ…gania"
 
-#: editor.cc:3232
+#: editor.cc:3301 editor_actions.cc:101
+msgid "Edit Point"
+msgstr "Punkt edycji"
+
+#: editor.cc:3302
 msgid "Edit Mode"
 msgstr ""
 
-#: editor.cc:3233
+#: editor.cc:3303
 msgid ""
 "Nudge Clock\n"
 "(controls distance used to nudge regions and selections)"
 msgstr ""
 
-#: editor.cc:3501 editor_actions.cc:313
+#: editor.cc:3571 editor_actions.cc:335
 msgid "Command|Undo"
 msgstr ""
 
-#: editor.cc:3503
+#: editor.cc:3573
 msgid "Command|Undo (%1)"
 msgstr ""
 
-#: editor.cc:3510 editor_actions.cc:315 editor_actions.cc:316
-#: editor_actions.cc:317
+#: editor.cc:3580 editor_actions.cc:337 editor_actions.cc:338
+#: editor_actions.cc:339
 msgid "Redo"
 msgstr "Powtórz"
 
-#: editor.cc:3512
+#: editor.cc:3583
 msgid "Redo (%1)"
 msgstr "Powtórz (%1)"
 
-#: editor.cc:3531 editor.cc:3555 editor_actions.cc:110 editor_actions.cc:1846
+#: editor.cc:3603 editor.cc:3627 editor_actions.cc:113 editor_actions.cc:1863
 msgid "Duplicate"
 msgstr "Powiel"
 
-#: editor.cc:3532
+#: editor.cc:3604
 msgid "Number of duplications:"
 msgstr ""
 
-#: editor.cc:3706 route_group_dialog.cc:51 time_info_box.cc:67
+#: editor.cc:3774 route_group_dialog.cc:51 time_info_box.cc:61
 msgid "Selection"
 msgstr "Zaznaczenie"
 
-#: editor.cc:3709
+#: editor.cc:3777
 msgid "Fit 1 track"
 msgstr ""
 
-#: editor.cc:3710
+#: editor.cc:3778
 msgid "Fit 2 tracks"
 msgstr ""
 
-#: editor.cc:3711
+#: editor.cc:3779
 msgid "Fit 4 tracks"
 msgstr ""
 
-#: editor.cc:3712
+#: editor.cc:3780
 msgid "Fit 8 tracks"
 msgstr ""
 
-#: editor.cc:3713
+#: editor.cc:3781
 msgid "Fit 16 tracks"
 msgstr ""
 
-#: editor.cc:3714
+#: editor.cc:3782
 msgid "Fit 24 tracks"
 msgstr ""
 
-#: editor.cc:3715
+#: editor.cc:3783
 msgid "Fit 32 tracks"
 msgstr ""
 
-#: editor.cc:3716
+#: editor.cc:3784
 msgid "Fit 48 tracks"
 msgstr ""
 
-#: editor.cc:3717
+#: editor.cc:3785
 msgid "Fit All tracks"
 msgstr ""
 
-#: editor.cc:3718
+#: editor.cc:3786
 msgid "Fit Selection"
 msgstr ""
 
-#: editor.cc:3720
+#: editor.cc:3788 editor_actions.cc:288
 msgid "Zoom to 10 ms"
 msgstr ""
 
-#: editor.cc:3721
+#: editor.cc:3789 editor_actions.cc:289
 msgid "Zoom to 100 ms"
 msgstr ""
 
-#: editor.cc:3722
+#: editor.cc:3790 editor_actions.cc:290
 msgid "Zoom to 1 sec"
 msgstr ""
 
-#: editor.cc:3723
+#: editor.cc:3791 editor_actions.cc:291
 msgid "Zoom to 10 sec"
 msgstr ""
 
-#: editor.cc:3724
+#: editor.cc:3792 editor_actions.cc:292
 msgid "Zoom to 1 min"
 msgstr ""
 
-#: editor.cc:3725
+#: editor.cc:3793 editor_actions.cc:294
 msgid "Zoom to 10 min"
 msgstr ""
 
-#: editor.cc:3726
+#: editor.cc:3794
 msgid "Zoom to 1 hour"
 msgstr ""
 
-#: editor.cc:3727
+#: editor.cc:3795
 msgid "Zoom to 8 hours"
 msgstr ""
 
-#: editor.cc:3728
+#: editor.cc:3796
 msgid "Zoom to 24 hours"
 msgstr ""
 
-#: editor.cc:3730
+#: editor.cc:3798
 msgid "Zoom to Range/Region Selection"
 msgstr ""
 
-#: editor.cc:3800
+#: editor.cc:3868
 msgid "*"
 msgstr ""
 
-#: editor.cc:4120
+#: editor.cc:4135
 msgid "Playlist Deletion"
 msgstr ""
 
-#: editor.cc:4121
+#: editor.cc:4136
 msgid ""
 "Playlist %1 is currently unused.\n"
 "If it is kept, its audio files will not be cleaned.\n"
 "If it is deleted, audio files used by it alone will be cleaned."
 msgstr ""
 
-#: editor.cc:4131
+#: editor.cc:4146
+msgid "Delete All Unused"
+msgstr ""
+
+#: editor.cc:4147
 msgid "Delete Playlist"
 msgstr ""
 
-#: editor.cc:4132
+#: editor.cc:4148
 msgid "Keep Playlist"
 msgstr ""
 
-#: editor.cc:4133 editor_audio_import.cc:594 editor_ops.cc:6174
-#: engine_dialog.cc:2083 sfdb_freesound_mootcher.cc:69 processor_box.cc:2219
-#: processor_box.cc:2244
+#: editor.cc:4149
+msgid "Keep Remaining"
+msgstr ""
+
+#: editor.cc:4150 editor_audio_import.cc:600 editor_ops.cc:6530
+#: engine_dialog.cc:2986 sfdb_freesound_mootcher.cc:69 processor_box.cc:3431
+#: processor_box.cc:3456
 msgid "Cancel"
 msgstr "Anuluj"
 
-#: editor.cc:4275
+#: editor.cc:4292
 msgid "new playlists"
 msgstr "nowe listy odtwarzania"
 
-#: editor.cc:4291
+#: editor.cc:4308
 msgid "copy playlists"
 msgstr "skopiuj listy odtwarzania"
 
-#: editor.cc:4306
+#: editor.cc:4323
 msgid "clear playlists"
 msgstr "wyczyść listy odtwarzania"
 
-#: editor.cc:5046
+#: editor.cc:5048
 msgid "Please wait while %1 loads visual data."
 msgstr ""
 
-#: editor.cc:5901 editor.cc:5932 editor_markers.cc:985 panner_ui.cc:410
-#: processor_box.cc:2482
+#: editor.cc:5811 editor_actions.cc:479
+msgid "Unset #%1"
+msgstr ""
+
+#: editor.cc:5812 editor_actions.cc:481
+msgid "no action bound"
+msgstr ""
+
+#: editor.cc:5961 editor.cc:5996 editor_markers.cc:998 editor_markers.cc:1018
+#: panner_ui.cc:412 processor_box.cc:3703
 msgid "Edit..."
 msgstr ""
 
-#: editor.cc:5934 editor_actions.cc:1941
+#: editor.cc:6002 editor_actions.cc:1842
+msgid "Transpose..."
+msgstr ""
+
+#: editor.cc:6006 editor_actions.cc:1959
 msgid "Legatize"
 msgstr ""
 
-#: editor.cc:5936 editor_actions.cc:1940
+#: editor.cc:6012 editor_actions.cc:1958
 msgid "Quantize..."
 msgstr ""
 
-#: editor.cc:5938 editor_actions.cc:1943
+#: editor.cc:6015 editor_actions.cc:1961
 msgid "Remove Overlap"
 msgstr ""
 
-#: editor.cc:5940 editor_actions.cc:1942
+#: editor.cc:6021 editor_actions.cc:1960
 msgid "Transform..."
 msgstr ""
 
-#: editor_actions.cc:92
+#: editor_actions.cc:95
 msgid "Autoconnect"
 msgstr "Automatyczne Å‚Ä…czenie"
 
-#: editor_actions.cc:93
+#: editor_actions.cc:96
 msgid "Crossfades"
 msgstr "Przejścia krzyżowe"
 
-#: editor_actions.cc:95
+#: editor_actions.cc:98
 msgid "Move Selected Marker"
 msgstr "PrzenieÅ› znacznik"
 
-#: editor_actions.cc:96
+#: editor_actions.cc:99
 msgid "Select Range Operations"
 msgstr "Operacje na zakresach"
 
-#: editor_actions.cc:97
+#: editor_actions.cc:100
 msgid "Select Regions"
 msgstr "Zaznacz obszary"
 
-#: editor_actions.cc:98
-msgid "Edit Point"
-msgstr "Punkt edycji"
-
-#: editor_actions.cc:99
+#: editor_actions.cc:102
 msgid "Fade"
 msgstr "Przejścia"
 
-#: editor_actions.cc:100
+#: editor_actions.cc:103
 msgid "Latch"
 msgstr ""
 
-#: editor_actions.cc:101 editor_regions.cc:112 region_editor.cc:46
+#: editor_actions.cc:104 editor_regions.cc:159 region_editor.cc:48
 msgid "Region"
 msgstr "Obszar"
 
-#: editor_actions.cc:102
+#: editor_actions.cc:105
 msgid "Layering"
 msgstr "Warstwy"
 
-#: editor_actions.cc:103 editor_regions.cc:113 stereo_panner_editor.cc:44
+#: editor_actions.cc:106 editor_regions.cc:160 stereo_panner_editor.cc:46
 msgid "Position"
 msgstr "Pozycja"
 
-#: editor_actions.cc:105 gain_meter.cc:156 gain_meter.cc:825 panner_ui.cc:178
-#: panner_ui.cc:635
+#: editor_actions.cc:108 gain_meter.cc:161 gain_meter.cc:848 panner_ui.cc:178
+#: panner_ui.cc:637 route_time_axis.cc:541
 msgid "Trim"
 msgstr "Przytnij"
 
-#: editor_actions.cc:106 editor_actions.cc:126 route_group_dialog.cc:46
+#: editor_actions.cc:109 editor_actions.cc:129 route_group_dialog.cc:46
 msgid "Gain"
 msgstr "Wzmocnienie"
 
-#: editor_actions.cc:107 editor_actions.cc:563
+#: editor_actions.cc:110 editor_actions.cc:604
 msgid "Ranges"
 msgstr "Zakresy"
 
-#: editor_actions.cc:108 editor_actions.cc:1842 session_option_editor.cc:135
+#: editor_actions.cc:111 editor_actions.cc:1859 session_option_editor.cc:135
 #: session_option_editor.cc:144 session_option_editor.cc:151
+#: session_option_editor.cc:158 session_option_editor.cc:165
 msgid "Fades"
 msgstr ""
 
-#: editor_actions.cc:111
+#: editor_actions.cc:114
 msgid "Link"
 msgstr "Łącze"
 
-#: editor_actions.cc:112 editor_actions.cc:145
-msgid "Zoom Focus"
-msgstr "Powiększanie do"
-
-#: editor_actions.cc:113
+#: editor_actions.cc:116
 msgid "Locate to Markers"
 msgstr ""
 
-#: editor_actions.cc:115
+#: editor_actions.cc:118
 msgid "Meter falloff"
 msgstr "Zmniejszanie metrum"
 
-#: editor_actions.cc:116
+#: editor_actions.cc:119
 msgid "Meter hold"
 msgstr "Przytrzymanie metrum"
 
-#: editor_actions.cc:117 session_option_editor.cc:321
+#: editor_actions.cc:120 session_option_editor.cc:342
 msgid "MIDI Options"
 msgstr ""
 
-#: editor_actions.cc:118
+#: editor_actions.cc:121
 msgid "Misc Options"
 msgstr "Różne"
 
-#: editor_actions.cc:119 rc_option_editor.cc:1809 route_group_dialog.cc:54
-#: session_option_editor.cc:243 session_option_editor.cc:250
+#: editor_actions.cc:122 rc_option_editor.cc:2401 route_group_dialog.cc:54
+#: session_option_editor.cc:264 session_option_editor.cc:271
 msgid "Monitoring"
 msgstr "Monitorowanie"
 
-#: editor_actions.cc:120
+#: editor_actions.cc:123
 msgid "Active Mark"
 msgstr "Wskaźnik"
 
-#: editor_actions.cc:123
+#: editor_actions.cc:126
 msgid "Primary Clock"
 msgstr "Zegar podstawowy"
 
-#: editor_actions.cc:124
+#: editor_actions.cc:127
 msgid "Pullup / Pulldown"
 msgstr ""
 
-#: editor_actions.cc:125
+#: editor_actions.cc:128
 msgid "Region operations"
 msgstr "Operacje na obszarach"
 
-#: editor_actions.cc:127 ruler_dialog.cc:28
+#: editor_actions.cc:130 ruler_dialog.cc:28
 msgid "Rulers"
 msgstr "Linijki"
 
-#: editor_actions.cc:128
+#: editor_actions.cc:131
 msgid "Views"
 msgstr ""
 
-#: editor_actions.cc:129
+#: editor_actions.cc:132
 msgid "Scroll"
 msgstr "Przewijanie"
 
-#: editor_actions.cc:130
+#: editor_actions.cc:133
 msgid "Secondary Clock"
 msgstr "Zegar dodatkowy"
 
-#: editor_actions.cc:137
+#: editor_actions.cc:140
 msgid "Subframes"
 msgstr "Podklatki"
 
-#: editor_actions.cc:140
+#: editor_actions.cc:143
 msgid "Timecode fps"
 msgstr "Klatek na sekundÄ™ licznika czasu"
 
-#: editor_actions.cc:141 route_time_axis.cc:575
+#: editor_actions.cc:144 route_time_axis.cc:599
 msgid "Height"
 msgstr "Rozmiar"
 
-#: editor_actions.cc:143
+#: editor_actions.cc:146
 msgid "Tools"
 msgstr "Narzędzia"
 
-#: editor_actions.cc:144
+#: editor_actions.cc:147
 msgid "View"
 msgstr "Widok"
 
-#: editor_actions.cc:146
+#: editor_actions.cc:149
 msgid "Zoom"
 msgstr "Powiększenie"
 
-#: editor_actions.cc:152
-msgid "Break drag or deselect all"
+#: editor_actions.cc:150
+msgid "Scripted Actions"
 msgstr ""
 
 #: editor_actions.cc:159
+msgid "Session|Lock"
+msgstr ""
+
+#: editor_actions.cc:161
 msgid "Show Editor Mixer"
 msgstr "Mikser obok edytora"
 
-#: editor_actions.cc:160
+#: editor_actions.cc:162
 msgid "Show Editor List"
 msgstr ""
 
-#: editor_actions.cc:162
+#: editor_actions.cc:164
 msgid "Playhead to Next Region Boundary"
 msgstr "Do granicy następnego obszaru"
 
-#: editor_actions.cc:163
+#: editor_actions.cc:165
 msgid "Playhead to Next Region Boundary (No Track Selection)"
 msgstr ""
 
-#: editor_actions.cc:164
+#: editor_actions.cc:166
 msgid "Playhead to Previous Region Boundary"
 msgstr "Do granicy poprzedniego obszaru"
 
-#: editor_actions.cc:165
+#: editor_actions.cc:167
 msgid "Playhead to Previous Region Boundary (No Track Selection)"
 msgstr ""
 
-#: editor_actions.cc:167
+#: editor_actions.cc:169
 msgid "Playhead to Next Region Start"
 msgstr "Do początku następnego obszaru"
 
-#: editor_actions.cc:168
+#: editor_actions.cc:170
 msgid "Playhead to Next Region End"
 msgstr "Do końca następnego obszaru"
 
-#: editor_actions.cc:169
+#: editor_actions.cc:171
 msgid "Playhead to Next Region Sync"
 msgstr "Do następnej synchronizacji obszaru"
 
-#: editor_actions.cc:171
+#: editor_actions.cc:173
 msgid "Playhead to Previous Region Start"
 msgstr "Do poczÄ…tku poprzedniego obszaru"
 
-#: editor_actions.cc:172
+#: editor_actions.cc:174
 msgid "Playhead to Previous Region End"
 msgstr "Do końca poprzedniego obszaru"
 
-#: editor_actions.cc:173
+#: editor_actions.cc:175
 msgid "Playhead to Previous Region Sync"
 msgstr "Do poprzedniej synchronizacji obszaru"
 
-#: editor_actions.cc:175
+#: editor_actions.cc:177
 msgid "To Next Region Boundary"
 msgstr ""
 
-#: editor_actions.cc:176
+#: editor_actions.cc:178
 msgid "To Next Region Boundary (No Track Selection)"
 msgstr ""
 
-#: editor_actions.cc:177
+#: editor_actions.cc:179
 msgid "To Previous Region Boundary"
 msgstr ""
 
-#: editor_actions.cc:178
+#: editor_actions.cc:180
 msgid "To Previous Region Boundary (No Track Selection)"
 msgstr ""
 
-#: editor_actions.cc:180
+#: editor_actions.cc:182
 msgid "To Next Region Start"
 msgstr ""
 
-#: editor_actions.cc:181
+#: editor_actions.cc:183
 msgid "To Next Region End"
 msgstr ""
 
-#: editor_actions.cc:182
+#: editor_actions.cc:184
 msgid "To Next Region Sync"
 msgstr ""
 
-#: editor_actions.cc:184
+#: editor_actions.cc:186
 msgid "To Previous Region Start"
 msgstr ""
 
-#: editor_actions.cc:185
+#: editor_actions.cc:187
 msgid "To Previous Region End"
 msgstr ""
 
-#: editor_actions.cc:186
+#: editor_actions.cc:188
 msgid "To Previous Region Sync"
 msgstr ""
 
-#: editor_actions.cc:188
+#: editor_actions.cc:190
 msgid "To Range Start"
 msgstr ""
 
-#: editor_actions.cc:189
+#: editor_actions.cc:191
 msgid "To Range End"
 msgstr ""
 
-#: editor_actions.cc:191
+#: editor_actions.cc:193
 msgid "Playhead to Range Start"
 msgstr "GÅ‚owica do poczÄ…tku zakresu"
 
-#: editor_actions.cc:192
+#: editor_actions.cc:194
 msgid "Playhead to Range End"
 msgstr "Głowica do końca zakresu"
 
-#: editor_actions.cc:195
+#: editor_actions.cc:197
 msgid "Select All Tracks"
 msgstr ""
 
-#: editor_actions.cc:196 export_timespan_selector.cc:61 processor_box.cc:2468
+#: editor_actions.cc:198 export_timespan_selector.cc:59 processor_box.cc:3685
 msgid "Deselect All"
 msgstr "Nic"
 
-#: editor_actions.cc:204
+#: editor_actions.cc:210
 msgid "Select All Overlapping Edit Range"
 msgstr ""
 
-#: editor_actions.cc:205
+#: editor_actions.cc:211
 msgid "Select All Inside Edit Range"
 msgstr ""
 
-#: editor_actions.cc:207
+#: editor_actions.cc:213
 msgid "Select Edit Range"
 msgstr ""
 
-#: editor_actions.cc:209
+#: editor_actions.cc:215
 msgid "Select All in Punch Range"
 msgstr "Wszystko w zakresie przełącznika"
 
-#: editor_actions.cc:210
+#: editor_actions.cc:216
 msgid "Select All in Loop Range"
 msgstr "Wszystko w zakresie pętli"
 
-#: editor_actions.cc:212
+#: editor_actions.cc:218
 msgid "Select Next Track or Bus"
 msgstr ""
 
-#: editor_actions.cc:213
+#: editor_actions.cc:219
 msgid "Select Previous Track or Bus"
 msgstr ""
 
-#: editor_actions.cc:215
+#: editor_actions.cc:221
 msgid "Toggle Record Enable"
 msgstr ""
 
-#: editor_actions.cc:217
+#: editor_actions.cc:223
 msgid "Toggle Solo"
 msgstr ""
 
-#: editor_actions.cc:219
+#: editor_actions.cc:225
 msgid "Toggle Mute"
 msgstr ""
 
-#: editor_actions.cc:221
+#: editor_actions.cc:227
 msgid "Toggle Solo Isolate"
 msgstr ""
 
-#: editor_actions.cc:226
+#: editor_actions.cc:232
 msgid "Save View %1"
 msgstr ""
 
-#: editor_actions.cc:232
+#: editor_actions.cc:238
 msgid "Go to View %1"
 msgstr ""
 
-#: editor_actions.cc:238
+#: editor_actions.cc:244
 msgid "Locate to Mark %1"
 msgstr ""
 
-#: editor_actions.cc:242 editor_actions.cc:243
+#: editor_actions.cc:249 editor_actions.cc:250
 msgid "Jump to Next Mark"
 msgstr ""
 
-#: editor_actions.cc:244 editor_actions.cc:245
+#: editor_actions.cc:251 editor_actions.cc:252
 msgid "Jump to Previous Mark"
 msgstr ""
 
-#: editor_actions.cc:247 editor_actions.cc:248
+#: editor_actions.cc:254
+msgid "Set Session Start from Playhead"
+msgstr ""
+
+#: editor_actions.cc:255
+msgid "Set Session End from Playhead"
+msgstr ""
+
+#: editor_actions.cc:257 editor_actions.cc:258
 msgid "Add Mark from Playhead"
 msgstr "Dodaj znacznik w położeniu głowicy"
 
-#: editor_actions.cc:250 editor_actions.cc:251
+#: editor_actions.cc:260 editor_actions.cc:261
 msgid "Remove Mark at Playhead"
 msgstr ""
 
-#: editor_actions.cc:253
+#: editor_actions.cc:263
 msgid "Nudge Next Later"
 msgstr ""
 
-#: editor_actions.cc:254
+#: editor_actions.cc:264
 msgid "Nudge Next Earlier"
 msgstr ""
 
-#: editor_actions.cc:256
+#: editor_actions.cc:266
 msgid "Nudge Playhead Forward"
 msgstr "Do przodu"
 
-#: editor_actions.cc:257
+#: editor_actions.cc:267
 msgid "Nudge Playhead Backward"
 msgstr "Do tyłu"
 
-#: editor_actions.cc:258
-msgid "Playhead To Next Grid"
+#: editor_actions.cc:268
+msgid "Playhead to Next Grid"
 msgstr ""
 
-#: editor_actions.cc:259
-msgid "Playhead To Previous Grid"
+#: editor_actions.cc:269
+msgid "Playhead to Previous Grid"
 msgstr ""
 
-#: editor_actions.cc:264
+#: editor_actions.cc:274
 msgid "Zoom to Selection"
 msgstr ""
 
-#: editor_actions.cc:265
+#: editor_actions.cc:275
 msgid "Toggle Zoom State"
 msgstr ""
 
-#: editor_actions.cc:267
+#: editor_actions.cc:277
 msgid "Expand Track Height"
 msgstr ""
 
-#: editor_actions.cc:268
+#: editor_actions.cc:278
 msgid "Shrink Track Height"
 msgstr ""
 
-#: editor_actions.cc:270
+#: editor_actions.cc:280
+msgid "Fit 1 Track"
+msgstr ""
+
+#: editor_actions.cc:281
+msgid "Fit 2 Tracks"
+msgstr ""
+
+#: editor_actions.cc:282
+msgid "Fit 4 Tracks"
+msgstr ""
+
+#: editor_actions.cc:283
+msgid "Fit 8 Tracks"
+msgstr ""
+
+#: editor_actions.cc:284
+msgid "Fit 16 Tracks"
+msgstr ""
+
+#: editor_actions.cc:285
+msgid "Fit 32 Tracks"
+msgstr ""
+
+#: editor_actions.cc:286
+msgid "Fit All Tracks"
+msgstr ""
+
+#: editor_actions.cc:293
+msgid "Zoom to 5 min"
+msgstr ""
+
+#: editor_actions.cc:296
 msgid "Move Selected Tracks Up"
 msgstr ""
 
-#: editor_actions.cc:272
+#: editor_actions.cc:298
 msgid "Move Selected Tracks Down"
 msgstr ""
 
-#: editor_actions.cc:275
+#: editor_actions.cc:301
 msgid "Scroll Tracks Up"
 msgstr "Przewiń ścieżki do góry"
 
-#: editor_actions.cc:277
+#: editor_actions.cc:302
 msgid "Scroll Tracks Down"
 msgstr "Przewiń ścieżki na dół"
 
-#: editor_actions.cc:279
+#: editor_actions.cc:303
 msgid "Step Tracks Up"
 msgstr "Przesuń ścieżki w górę"
 
-#: editor_actions.cc:281
+#: editor_actions.cc:304
 msgid "Step Tracks Down"
 msgstr "Przesuń ścieżki w dół"
 
-#: editor_actions.cc:284
+#: editor_actions.cc:306
 msgid "Scroll Backward"
 msgstr "Przewiń do tyłu"
 
-#: editor_actions.cc:285
+#: editor_actions.cc:307
 msgid "Scroll Forward"
 msgstr "Przewiń do przodu"
 
-#: editor_actions.cc:286
+#: editor_actions.cc:308
 msgid "Center Playhead"
 msgstr "Wyśrodkuj"
 
-#: editor_actions.cc:287
+#: editor_actions.cc:309
 msgid "Center Edit Point"
 msgstr ""
 
-#: editor_actions.cc:289
+#: editor_actions.cc:311
 msgid "Playhead Forward"
 msgstr "GÅ‚owica do przodu"
 
-#: editor_actions.cc:290
+#: editor_actions.cc:312
 msgid "Playhead Backward"
 msgstr "Głowica do tyłu"
 
-#: editor_actions.cc:292
+#: editor_actions.cc:314
 msgid "Playhead to Active Mark"
 msgstr ""
 
-#: editor_actions.cc:293
+#: editor_actions.cc:315
 msgid "Active Mark to Playhead"
 msgstr ""
 
-#: editor_actions.cc:295
+#: editor_actions.cc:317
 msgid "Use Skip Ranges"
 msgstr ""
 
-#: editor_actions.cc:302
+#: editor_actions.cc:324
 msgid "Play Selected Regions"
 msgstr ""
 
-#: editor_actions.cc:304
+#: editor_actions.cc:326
 msgid "Play from Edit Point and Return"
 msgstr ""
 
-#: editor_actions.cc:306
+#: editor_actions.cc:328
 msgid "Play Edit Range"
 msgstr "Zaznaczenie"
 
-#: editor_actions.cc:308
+#: editor_actions.cc:330
 msgid "Playhead to Mouse"
 msgstr "Do kursora myszy"
 
-#: editor_actions.cc:309
+#: editor_actions.cc:331
 msgid "Active Marker to Mouse"
 msgstr "Do kursora myszy"
 
-#: editor_actions.cc:319
+#: editor_actions.cc:341
 msgid "Undo Selection Change"
 msgstr ""
 
-#: editor_actions.cc:320
+#: editor_actions.cc:342
 msgid "Redo Selection Change"
 msgstr ""
 
-#: editor_actions.cc:322
+#: editor_actions.cc:344
 msgid "Export Audio"
 msgstr ""
 
-#: editor_actions.cc:323 export_dialog.cc:396
+#: editor_actions.cc:345 export_dialog.cc:424
 msgid "Export Range"
 msgstr "Eksport zakresu"
 
-#: editor_actions.cc:328
+#: editor_actions.cc:350
 msgid "Separate Using Punch Range"
 msgstr ""
 
-#: editor_actions.cc:331
+#: editor_actions.cc:353
 msgid "Separate Using Loop Range"
 msgstr ""
 
-#: editor_actions.cc:334 editor_actions.cc:356
+#: editor_actions.cc:356 editor_actions.cc:379
 msgid "Crop"
 msgstr "Przytnij"
 
-#: editor_actions.cc:344
+#: editor_actions.cc:366
 msgid "Fade Range Selection"
 msgstr ""
 
-#: editor_actions.cc:346
+#: editor_actions.cc:368
 msgid "Set Tempo from Edit Range = Bar"
 msgstr ""
 
-#: editor_actions.cc:348
+#: editor_actions.cc:371
 msgid "Log"
 msgstr ""
 
-#: editor_actions.cc:351 editor_actions.cc:353
+#: editor_actions.cc:374 editor_actions.cc:376
 msgid "Move to Next Transient"
 msgstr ""
 
-#: editor_actions.cc:352 editor_actions.cc:354
+#: editor_actions.cc:375 editor_actions.cc:377
 msgid "Move to Previous Transient"
 msgstr ""
 
-#: editor_actions.cc:358 editor_actions.cc:361
+#: editor_actions.cc:381
+msgid "Start Range from Playhead"
+msgstr ""
+
+#: editor_actions.cc:382
+msgid "Finish Range from Playhead"
+msgstr ""
+
+#: editor_actions.cc:384 editor_actions.cc:393
 msgid "Start Range"
 msgstr "Rozpocznij zakres"
 
-#: editor_actions.cc:359 editor_actions.cc:362
+#: editor_actions.cc:385 editor_actions.cc:394
 msgid "Finish Range"
 msgstr "Zakończ zakres"
 
-#: editor_actions.cc:394
+#: editor_actions.cc:387
+msgid "Start Punch Range"
+msgstr ""
+
+#: editor_actions.cc:388
+msgid "Finish Punch Range"
+msgstr ""
+
+#: editor_actions.cc:390
+msgid "Start Loop Range"
+msgstr ""
+
+#: editor_actions.cc:391
+msgid "Finish Loop Range"
+msgstr ""
+
+#: editor_actions.cc:426
 msgid "Follow Playhead"
 msgstr "Podążanie za głowicą"
 
-#: editor_actions.cc:395
+#: editor_actions.cc:427
 msgid "Remove Last Capture"
 msgstr "Usuń ostatnie nagranie"
 
-#: editor_actions.cc:397
+#: editor_actions.cc:429
 msgid "Stationary Playhead"
 msgstr ""
 
-#: editor_actions.cc:399 insert_time_dialog.cc:32
+#: editor_actions.cc:431 insert_remove_time_dialog.cc:32
 msgid "Insert Time"
 msgstr "Czas wstawienia"
 
-#: editor_actions.cc:402
+#: editor_actions.cc:433 insert_remove_time_dialog.cc:32
+msgid "Remove Time"
+msgstr ""
+
+#: editor_actions.cc:438
 msgid "Toggle Active"
 msgstr "Przełącz aktywność"
 
-#: editor_actions.cc:407 editor_actions.cc:1768 editor_markers.cc:921
-#: editor_markers.cc:986 editor_snapshots.cc:122 mixer_strip.cc:1543
-#: route_time_axis.cc:856
+#: editor_actions.cc:440 editor_actions.cc:1785 editor_markers.cc:926
+#: editor_markers.cc:999 editor_markers.cc:1019 editor_snapshots.cc:134
+#: lua_script_manager.cc:32 lua_script_manager.cc:36 mixer_strip.cc:1705
+#: route_time_axis.cc:870 vca_master_strip.cc:400
 msgid "Remove"
 msgstr "Usuń"
 
-#: editor_actions.cc:411
+#: editor_actions.cc:445
 msgid "Fit Selection (Vertical)"
 msgstr ""
 
-#: editor_actions.cc:413 time_axis_view.cc:1371
+#: editor_actions.cc:447 time_axis_view.cc:1287
 msgid "Largest"
 msgstr "Największy"
 
-#: editor_actions.cc:416 time_axis_view.cc:1372
+#: editor_actions.cc:450 time_axis_view.cc:1288
 msgid "Larger"
 msgstr "Większy"
 
-#: editor_actions.cc:419 editor_rulers.cc:249 time_axis_view.cc:1373
+#: editor_actions.cc:453 editor_rulers.cc:248 time_axis_view.cc:1289
 msgid "Large"
 msgstr "Duży"
 
-#: editor_actions.cc:425 editor_rulers.cc:253 time_axis_view.cc:1375
+#: editor_actions.cc:459 editor_rulers.cc:252 time_axis_view.cc:1291
 msgid "Small"
 msgstr "Mały"
 
-#: editor_actions.cc:429
+#: editor_actions.cc:463
 msgid "Sound Selected MIDI Notes"
 msgstr ""
 
-#: editor_actions.cc:434
+#: editor_actions.cc:468
 msgid "Zoom Focus Left"
 msgstr "Do lewej"
 
-#: editor_actions.cc:435
+#: editor_actions.cc:469
 msgid "Zoom Focus Right"
 msgstr "Do prawej"
 
-#: editor_actions.cc:436
+#: editor_actions.cc:470
 msgid "Zoom Focus Center"
 msgstr "Do środka"
 
-#: editor_actions.cc:437
+#: editor_actions.cc:471
 msgid "Zoom Focus Playhead"
 msgstr "Do głowicy"
 
-#: editor_actions.cc:438
+#: editor_actions.cc:472
 msgid "Zoom Focus Mouse"
 msgstr "Do kursora myszy"
 
-#: editor_actions.cc:439
+#: editor_actions.cc:473
 msgid "Zoom Focus Edit Point"
 msgstr ""
 
-#: editor_actions.cc:441
+#: editor_actions.cc:475
 msgid "Next Zoom Focus"
 msgstr ""
 
-#: editor_actions.cc:447
+#: editor_actions.cc:488
 msgid "Smart Object Mode"
 msgstr ""
 
-#: editor_actions.cc:450
+#: editor_actions.cc:491
 msgid "Smart"
 msgstr ""
 
-#: editor_actions.cc:453
+#: editor_actions.cc:494
 msgid "Object Tool"
 msgstr "Narzędzie obiektów"
 
-#: editor_actions.cc:458
+#: editor_actions.cc:499
 msgid "Range Tool"
 msgstr "Narzędzie zakresów"
 
-#: editor_actions.cc:463
+#: editor_actions.cc:504
 msgid "Note Drawing Tool"
 msgstr ""
 
-#: editor_actions.cc:468
+#: editor_actions.cc:509
 msgid "Audition Tool"
 msgstr ""
 
-#: editor_actions.cc:473
+#: editor_actions.cc:514
 msgid "Time FX Tool"
 msgstr ""
 
-#: editor_actions.cc:478
+#: editor_actions.cc:519
 msgid "Content Tool"
 msgstr ""
 
-#: editor_actions.cc:484
+#: editor_actions.cc:525
 msgid "Cut Tool"
 msgstr ""
 
-#: editor_actions.cc:490
+#: editor_actions.cc:531
 msgid "Step Mouse Mode"
 msgstr ""
 
-#: editor_actions.cc:497
+#: editor_actions.cc:538
 msgid "Change Edit Point"
 msgstr ""
 
-#: editor_actions.cc:498
+#: editor_actions.cc:539
 msgid "Change Edit Point Including Marker"
 msgstr ""
 
-#: editor_actions.cc:504
+#: editor_actions.cc:544
+msgid "EditMode|Lock"
+msgstr ""
+
+#: editor_actions.cc:545
 msgid "Cycle Edit Mode"
 msgstr ""
 
-#: editor_actions.cc:506
+#: editor_actions.cc:547
 msgid "Snap to"
 msgstr ""
 
-#: editor_actions.cc:507
+#: editor_actions.cc:548
 msgid "Snap Mode"
 msgstr "Tryb przyciÄ…gania"
 
-#: editor_actions.cc:514
+#: editor_actions.cc:555
 msgid "Next Snap Mode"
 msgstr ""
 
-#: editor_actions.cc:515
+#: editor_actions.cc:556
 msgid "Next Snap Choice"
 msgstr ""
 
-#: editor_actions.cc:516
+#: editor_actions.cc:557
 msgid "Next Musical Snap Choice"
 msgstr ""
 
-#: editor_actions.cc:517
+#: editor_actions.cc:558
 msgid "Previous Snap Choice"
 msgstr ""
 
-#: editor_actions.cc:518
+#: editor_actions.cc:559
 msgid "Previous Musical Snap Choice"
 msgstr ""
 
-#: editor_actions.cc:523
+#: editor_actions.cc:564
 msgid "Snap to CD Frame"
 msgstr ""
 
-#: editor_actions.cc:524
+#: editor_actions.cc:565
 msgid "Snap to Timecode Frame"
 msgstr ""
 
-#: editor_actions.cc:525
+#: editor_actions.cc:566
 msgid "Snap to Timecode Seconds"
 msgstr ""
 
-#: editor_actions.cc:526
+#: editor_actions.cc:567
 msgid "Snap to Timecode Minutes"
 msgstr ""
 
-#: editor_actions.cc:527
+#: editor_actions.cc:568
 msgid "Snap to Seconds"
 msgstr ""
 
-#: editor_actions.cc:528
+#: editor_actions.cc:569
 msgid "Snap to Minutes"
 msgstr ""
 
-#: editor_actions.cc:530
+#: editor_actions.cc:571
 msgid "Snap to One Twenty Eighths"
 msgstr ""
 
-#: editor_actions.cc:531
+#: editor_actions.cc:572
 msgid "Snap to Sixty Fourths"
 msgstr ""
 
-#: editor_actions.cc:532
+#: editor_actions.cc:573
 msgid "Snap to Thirty Seconds"
 msgstr ""
 
-#: editor_actions.cc:533
+#: editor_actions.cc:574
 msgid "Snap to Twenty Eighths"
 msgstr ""
 
-#: editor_actions.cc:534
+#: editor_actions.cc:575
 msgid "Snap to Twenty Fourths"
 msgstr ""
 
-#: editor_actions.cc:535
+#: editor_actions.cc:576
 msgid "Snap to Twentieths"
 msgstr ""
 
-#: editor_actions.cc:536
+#: editor_actions.cc:577
 msgid "Snap to Sixteenths"
 msgstr ""
 
-#: editor_actions.cc:537
+#: editor_actions.cc:578
 msgid "Snap to Fourteenths"
 msgstr ""
 
-#: editor_actions.cc:538
+#: editor_actions.cc:579
 msgid "Snap to Twelfths"
 msgstr ""
 
-#: editor_actions.cc:539
+#: editor_actions.cc:580
 msgid "Snap to Tenths"
 msgstr ""
 
-#: editor_actions.cc:540
+#: editor_actions.cc:581
 msgid "Snap to Eighths"
 msgstr ""
 
-#: editor_actions.cc:541
+#: editor_actions.cc:582
 msgid "Snap to Sevenths"
 msgstr ""
 
-#: editor_actions.cc:542
+#: editor_actions.cc:583
 msgid "Snap to Sixths"
 msgstr ""
 
-#: editor_actions.cc:543
+#: editor_actions.cc:584
 msgid "Snap to Fifths"
 msgstr ""
 
-#: editor_actions.cc:544
+#: editor_actions.cc:585
 msgid "Snap to Quarters"
 msgstr ""
 
-#: editor_actions.cc:545
+#: editor_actions.cc:586
 msgid "Snap to Thirds"
 msgstr ""
 
-#: editor_actions.cc:546
+#: editor_actions.cc:587
 msgid "Snap to Halves"
 msgstr ""
 
-#: editor_actions.cc:548
+#: editor_actions.cc:589
 msgid "Snap to Beat"
 msgstr ""
 
-#: editor_actions.cc:549
+#: editor_actions.cc:590
 msgid "Snap to Bar"
 msgstr ""
 
-#: editor_actions.cc:550
+#: editor_actions.cc:591
 msgid "Snap to Mark"
 msgstr ""
 
-#: editor_actions.cc:551
+#: editor_actions.cc:592
 msgid "Snap to Region Start"
 msgstr ""
 
-#: editor_actions.cc:552
+#: editor_actions.cc:593
 msgid "Snap to Region End"
 msgstr ""
 
-#: editor_actions.cc:553
+#: editor_actions.cc:594
 msgid "Snap to Region Sync"
 msgstr ""
 
-#: editor_actions.cc:554
+#: editor_actions.cc:595
 msgid "Snap to Region Boundary"
 msgstr ""
 
-#: editor_actions.cc:556
+#: editor_actions.cc:597
 msgid "Show Marker Lines"
 msgstr ""
 
-#: editor_actions.cc:566
+#: editor_actions.cc:607
 msgid "Loop/Punch"
 msgstr "Pętla/przełącznik"
 
-#: editor_actions.cc:570
+#: editor_actions.cc:611
 msgid "Min:Sec"
 msgstr "Minuty i sekundy"
 
-#: editor_actions.cc:572 editor_actions.cc:575 editor_rulers.cc:271
+#: editor_actions.cc:613 editor_actions.cc:616 editor_rulers.cc:270
+#: rc_option_editor.cc:1592
 msgid "Video Monitor"
 msgstr ""
 
-#: editor_actions.cc:574 rc_option_editor.cc:2260
+#: editor_actions.cc:615 rc_option_editor.cc:2844
 msgid "Video"
 msgstr ""
 
-#: editor_actions.cc:577
+#: editor_actions.cc:618
 msgid "Always on Top"
 msgstr ""
 
-#: editor_actions.cc:579
+#: editor_actions.cc:620
 msgid "Frame number"
 msgstr ""
 
-#: editor_actions.cc:580
+#: editor_actions.cc:621
 msgid "Timecode Background"
 msgstr ""
 
-#: editor_actions.cc:581
+#: editor_actions.cc:622
 msgid "Fullscreen"
 msgstr ""
 
-#: editor_actions.cc:582
+#: editor_actions.cc:623
 msgid "Letterbox"
 msgstr ""
 
-#: editor_actions.cc:583
+#: editor_actions.cc:624
 msgid "Original Size"
 msgstr ""
 
-#: editor_actions.cc:640
+#: editor_actions.cc:681
 msgid "Sort"
 msgstr "Sortuj"
 
-#: editor_actions.cc:651 editor_routes.cc:476 mixer_ui.cc:1196
+#: editor_actions.cc:692 editor_routes.cc:549 mixer_ui.cc:1497
 msgid "Show All"
 msgstr "Wyświetl wszystko"
 
-#: editor_actions.cc:652
+#: editor_actions.cc:693
 msgid "Show Automatic Regions"
 msgstr ""
 
-#: editor_actions.cc:654
+#: editor_actions.cc:695
 msgid "Ascending"
 msgstr "RosnÄ…co"
 
-#: editor_actions.cc:656
+#: editor_actions.cc:697
 msgid "Descending"
 msgstr "MalejÄ…co"
 
-#: editor_actions.cc:659
+#: editor_actions.cc:700
 msgid "By Region Name"
 msgstr "Według nazwy obszaru"
 
-#: editor_actions.cc:661
+#: editor_actions.cc:702
 msgid "By Region Length"
 msgstr "Według długości obszaru"
 
-#: editor_actions.cc:663
+#: editor_actions.cc:704
 msgid "By Region Position"
 msgstr "Według pozycji obszaru"
 
-#: editor_actions.cc:665
+#: editor_actions.cc:706
 msgid "By Region Timestamp"
 msgstr "Według timestamp obszaru"
 
-#: editor_actions.cc:667
+#: editor_actions.cc:708
 msgid "By Region Start in File"
 msgstr "Według początku obszaru w pliku"
 
-#: editor_actions.cc:669
+#: editor_actions.cc:710
 msgid "By Region End in File"
 msgstr "Według końca obszaru w pliku"
 
-#: editor_actions.cc:671
+#: editor_actions.cc:712
 msgid "By Source File Name"
 msgstr "Według nazwy pliku źrodłowego"
 
-#: editor_actions.cc:673
+#: editor_actions.cc:714
 msgid "By Source File Length"
 msgstr "Według długości pliku źródłowego"
 
-#: editor_actions.cc:675
+#: editor_actions.cc:716
 msgid "By Source File Creation Date"
 msgstr "Według daty utworzenia pliku źródłowego"
 
-#: editor_actions.cc:677
+#: editor_actions.cc:718
 msgid "By Source Filesystem"
 msgstr "Według systemu plików źródła"
 
-#: editor_actions.cc:680
+#: editor_actions.cc:721
 msgid "Remove Unused"
 msgstr ""
 
-#: editor_actions.cc:684 editor_audio_import.cc:282
-#: session_import_dialog.cc:75 session_import_dialog.cc:95
-#: session_metadata_dialog.cc:418 editor_videotimeline.cc:91
+#: editor_actions.cc:723
+msgid "Import PT session"
+msgstr ""
+
+#: editor_actions.cc:728 editor_audio_import.cc:282 editor_pt_import.cc:149
+#: luawindow.cc:99 session_import_dialog.cc:75 session_import_dialog.cc:95
+#: session_metadata_dialog.cc:421 sfdb_ui.cc:558 editor_videotimeline.cc:91
 msgid "Import"
 msgstr "Importuj"
 
-#: editor_actions.cc:687
+#: editor_actions.cc:731
 msgid "Import to Region List..."
 msgstr ""
 
-#: editor_actions.cc:690 session_import_dialog.cc:44
-msgid "Import From Session"
+#: editor_actions.cc:734 session_import_dialog.cc:44
+#: session_import_dialog.cc:65
+msgid "Import from Session"
 msgstr ""
 
-#: editor_actions.cc:694
+#: editor_actions.cc:738
 msgid "Bring all media into session folder"
 msgstr ""
 
-#: editor_actions.cc:697
+#: editor_actions.cc:741
 msgid "Show Summary"
 msgstr ""
 
-#: editor_actions.cc:699
+#: editor_actions.cc:743
 msgid "Show Group Tabs"
 msgstr ""
 
-#: editor_actions.cc:701
+#: editor_actions.cc:745
 msgid "Show Measure Lines"
 msgstr ""
 
-#: editor_actions.cc:705
-msgid "Show Logo"
-msgstr "Wyświetlanie logo"
-
-#: editor_actions.cc:709
+#: editor_actions.cc:747
 msgid "Toggle MIDI Input Active for Editor-Selected Tracks/Busses"
 msgstr ""
 
-#: editor_actions.cc:732
-msgid "Loaded editor bindings from %1"
-msgstr ""
-
-#: editor_actions.cc:734
-msgid "Could not find editor.bindings in search path %1"
-msgstr ""
-
-#: editor_actions.cc:1078 editor_actions.cc:1474 editor_actions.cc:1485
-#: editor_actions.cc:1538 editor_actions.cc:1549 editor_actions.cc:1596
-#: editor_actions.cc:1606 editor_regions.cc:1563
+#: editor_actions.cc:1081 editor_actions.cc:1477 editor_actions.cc:1488
+#: editor_actions.cc:1541 editor_actions.cc:1552 editor_actions.cc:1599
+#: editor_actions.cc:1609 editor_regions.cc:1657 luainstance.cc:327
+#: luainstance.cc:1690
 msgid "programming error: %1: %2"
 msgstr "błąd programowania: %1: %2"
 
-#: editor_actions.cc:1774
+#: editor_actions.cc:1791
 msgid "Raise"
 msgstr ""
 
-#: editor_actions.cc:1777
+#: editor_actions.cc:1794
 msgid "Raise to Top"
 msgstr ""
 
-#: editor_actions.cc:1780
+#: editor_actions.cc:1797
 msgid "Lower"
 msgstr ""
 
-#: editor_actions.cc:1783
+#: editor_actions.cc:1800
 msgid "Lower to Bottom"
 msgstr ""
 
-#: editor_actions.cc:1786
+#: editor_actions.cc:1803
 msgid "Move to Original Position"
 msgstr ""
 
-#: editor_actions.cc:1791
+#: editor_actions.cc:1808
 msgid "Lock to Video"
 msgstr ""
 
-#: editor_actions.cc:1796 editor_markers.cc:912
+#: editor_actions.cc:1813 editor_markers.cc:917
 msgid "Glue to Bars and Beats"
 msgstr ""
 
-#: editor_actions.cc:1801
+#: editor_actions.cc:1818
 msgid "Remove Sync"
 msgstr ""
 
-#: editor_actions.cc:1804 mixer_strip.cc:2006 monitor_section.cc:272
-#: route_time_axis.cc:253 route_time_axis.cc:526
+#: editor_actions.cc:1821 mixer_strip.cc:2192 monitor_section.cc:253
+#: monitor_section.cc:321 route_time_axis.cc:264 route_time_axis.cc:550
 msgid "Mute"
 msgstr "Wyciszenie"
 
-#: editor_actions.cc:1807
+#: editor_actions.cc:1824
 msgid "Normalize..."
 msgstr ""
 
-#: editor_actions.cc:1810
+#: editor_actions.cc:1827
 msgid "Reverse"
 msgstr "Odwróć"
 
-#: editor_actions.cc:1813
+#: editor_actions.cc:1830
 msgid "Make Mono Regions"
 msgstr ""
 
-#: editor_actions.cc:1816
+#: editor_actions.cc:1833
 msgid "Boost Gain"
 msgstr ""
 
-#: editor_actions.cc:1819
+#: editor_actions.cc:1836
 msgid "Cut Gain"
 msgstr ""
 
-#: editor_actions.cc:1822
+#: editor_actions.cc:1839
 msgid "Pitch Shift..."
 msgstr ""
 
-#: editor_actions.cc:1825
-msgid "Transpose..."
-msgstr ""
-
-#: editor_actions.cc:1828
+#: editor_actions.cc:1845
 msgid "Opaque"
 msgstr "Mętna"
 
-#: editor_actions.cc:1832 editor_regions.cc:117
+#: editor_actions.cc:1849 editor_regions.cc:164
 msgid "Fade In"
 msgstr "Stopniowe wzmocnienie"
 
-#: editor_actions.cc:1837 editor_regions.cc:118
+#: editor_actions.cc:1854 editor_regions.cc:165
 msgid "Fade Out"
 msgstr "Stopniowe wyciszenie"
 
-#: editor_actions.cc:1852
+#: editor_actions.cc:1869
 msgid "Multi-Duplicate..."
 msgstr ""
 
-#: editor_actions.cc:1857
+#: editor_actions.cc:1874
 msgid "Fill Track"
 msgstr "Wypełnij ścieżkę"
 
-#: editor_actions.cc:1861 editor_markers.cc:1000
+#: editor_actions.cc:1878 editor_markers.cc:1033
 msgid "Set Loop Range"
 msgstr "Ustaw zakres pętli"
 
-#: editor_actions.cc:1868
+#: editor_actions.cc:1885
 msgid "Set Punch"
 msgstr ""
 
-#: editor_actions.cc:1872
+#: editor_actions.cc:1889
 msgid "Add Single Range Marker"
 msgstr ""
 
-#: editor_actions.cc:1877
+#: editor_actions.cc:1894
 msgid "Add Range Marker Per Region"
 msgstr ""
 
-#: editor_actions.cc:1881
-msgid "Snap Position To Grid"
+#: editor_actions.cc:1898
+msgid "Snap Position to Grid"
 msgstr ""
 
-#: editor_actions.cc:1884
+#: editor_actions.cc:1901
 msgid "Close Gaps"
 msgstr ""
 
-#: editor_actions.cc:1887
+#: editor_actions.cc:1904
 msgid "Rhythm Ferret..."
 msgstr ""
 
-#: editor_actions.cc:1890
+#: editor_actions.cc:1907
 msgid "Export..."
 msgstr ""
 
-#: editor_actions.cc:1896
+#: editor_actions.cc:1913
 msgid "Separate Under"
 msgstr ""
 
-#: editor_actions.cc:1900 editor_actions.cc:1901
+#: editor_actions.cc:1917 editor_actions.cc:1918
 msgid "Set Fade In Length"
 msgstr "Zmień długość stopniowego wzmocnienia"
 
-#: editor_actions.cc:1902 editor_actions.cc:1903
+#: editor_actions.cc:1919 editor_actions.cc:1920
 msgid "Set Fade Out Length"
 msgstr "Zmień długość stopniowego wyciszenia"
 
-#: editor_actions.cc:1905
+#: editor_actions.cc:1922
 msgid "Set Tempo from Region = Bar"
 msgstr ""
 
-#: editor_actions.cc:1910
+#: editor_actions.cc:1927
 msgid "Split at Percussion Onsets"
 msgstr ""
 
-#: editor_actions.cc:1915
+#: editor_actions.cc:1932
 msgid "List Editor..."
 msgstr ""
 
-#: editor_actions.cc:1918
+#: editor_actions.cc:1935
 msgid "Properties..."
 msgstr ""
 
-#: editor_actions.cc:1922
+#: editor_actions.cc:1939
 msgid "Bounce (with processing)"
 msgstr ""
 
-#: editor_actions.cc:1923
+#: editor_actions.cc:1940
 msgid "Bounce (without processing)"
 msgstr ""
 
-#: editor_actions.cc:1924
+#: editor_actions.cc:1941
 msgid "Combine"
 msgstr ""
 
-#: editor_actions.cc:1925
+#: editor_actions.cc:1942
 msgid "Uncombine"
 msgstr ""
 
-#: editor_actions.cc:1927
+#: editor_actions.cc:1944
+msgid "Loudness Analysis..."
+msgstr ""
+
+#: editor_actions.cc:1945
 msgid "Spectral Analysis..."
 msgstr ""
 
-#: editor_actions.cc:1929
+#: editor_actions.cc:1947
 msgid "Reset Envelope"
 msgstr "Resetuj obwiedniÄ™"
 
-#: editor_actions.cc:1931
+#: editor_actions.cc:1949
 msgid "Reset Gain"
 msgstr ""
 
-#: editor_actions.cc:1936
+#: editor_actions.cc:1954
 msgid "Envelope Active"
 msgstr "WÅ‚Ä…cz obwiedniÄ™"
 
-#: editor_actions.cc:1944 editor_actions.cc:1945
+#: editor_actions.cc:1962 editor_actions.cc:1963
 msgid "Insert Patch Change..."
 msgstr ""
 
-#: editor_actions.cc:1946
+#: editor_actions.cc:1964
 msgid "Unlink from other copies"
 msgstr ""
 
-#: editor_actions.cc:1947
+#: editor_actions.cc:1965
 msgid "Strip Silence..."
 msgstr ""
 
-#: editor_actions.cc:1948
+#: editor_actions.cc:1966
 msgid "Set Range Selection"
 msgstr "Ustaw zakres zaznaczenia"
 
-#: editor_actions.cc:1950 editor_actions.cc:1951
+#: editor_actions.cc:1968 editor_actions.cc:1969
 msgid "Nudge Later"
 msgstr ""
 
-#: editor_actions.cc:1952 editor_actions.cc:1953
+#: editor_actions.cc:1970 editor_actions.cc:1971
 msgid "Nudge Earlier"
 msgstr ""
 
-#: editor_actions.cc:1955
+#: editor_actions.cc:1973
 msgid "Sequence Regions"
 msgstr ""
 
-#: editor_actions.cc:1960
+#: editor_actions.cc:1978
 msgid "Nudge Later by Capture Offset"
 msgstr ""
 
-#: editor_actions.cc:1967
+#: editor_actions.cc:1985
 msgid "Nudge Earlier by Capture Offset"
 msgstr ""
 
-#: editor_actions.cc:1971
+#: editor_actions.cc:1989
 msgid "Trim to Loop"
 msgstr ""
 
-#: editor_actions.cc:1972
+#: editor_actions.cc:1990
 msgid "Trim to Punch"
 msgstr ""
 
-#: editor_actions.cc:1974
+#: editor_actions.cc:1992
 msgid "Trim to Previous"
 msgstr ""
 
-#: editor_actions.cc:1975
+#: editor_actions.cc:1993
 msgid "Trim to Next"
 msgstr ""
 
-#: editor_actions.cc:1982
-msgid "Insert Region From Region List"
+#: editor_actions.cc:2000
+msgid "Insert Region from Region List"
 msgstr ""
 
-#: editor_actions.cc:1988
+#: editor_actions.cc:2006
 msgid "Set Sync Position"
 msgstr ""
 
-#: editor_actions.cc:1989
+#: editor_actions.cc:2007
 msgid "Place Transient"
 msgstr ""
 
-#: editor_actions.cc:1990
+#: editor_actions.cc:2008
 msgid "Split/Separate"
 msgstr ""
 
-#: editor_actions.cc:1991
+#: editor_actions.cc:2009
 msgid "Trim Start at Edit Point"
 msgstr ""
 
-#: editor_actions.cc:1992
+#: editor_actions.cc:2010
 msgid "Trim End at Edit Point"
 msgstr ""
 
-#: editor_actions.cc:1997
+#: editor_actions.cc:2015
 msgid "Align Start"
 msgstr ""
 
-#: editor_actions.cc:2004
+#: editor_actions.cc:2022
 msgid "Align Start Relative"
 msgstr ""
 
-#: editor_actions.cc:2008
+#: editor_actions.cc:2026
 msgid "Align End"
 msgstr ""
 
-#: editor_actions.cc:2013
+#: editor_actions.cc:2031
 msgid "Align End Relative"
 msgstr ""
 
-#: editor_actions.cc:2020
+#: editor_actions.cc:2038
 msgid "Align Sync"
 msgstr ""
 
-#: editor_actions.cc:2027
+#: editor_actions.cc:2045
 msgid "Align Sync Relative"
 msgstr ""
 
-#: editor_actions.cc:2031 editor_actions.cc:2034
+#: editor_actions.cc:2049 editor_actions.cc:2050
 msgid "Choose Top..."
 msgstr ""
 
@@ -4472,32 +5029,33 @@ msgid ""
 "%2 as a new source, or skip it?"
 msgstr ""
 
-#: editor_audio_import.cc:282 editor_videotimeline.cc:91
+#: editor_audio_import.cc:282 editor_pt_import.cc:149
+#: editor_videotimeline.cc:91
 msgid "Cancel Import"
 msgstr "Anuluj import"
 
-#: editor_audio_import.cc:559
+#: editor_audio_import.cc:565
 msgid "Editor: cannot open file \"%1\", (%2)"
 msgstr "Edytor: nie można otworzyć pliku \"%1\", (%2)"
 
-#: editor_audio_import.cc:567
+#: editor_audio_import.cc:573
 msgid "Cancel entire import"
 msgstr "Anuluj cały import"
 
-#: editor_audio_import.cc:568
+#: editor_audio_import.cc:574
 msgid "Don't embed it"
 msgstr "Nie osadzaj tego"
 
-#: editor_audio_import.cc:569
+#: editor_audio_import.cc:575
 msgid "Embed all without questions"
 msgstr "Osadź wszystko bez zadawania pytań"
 
-#: editor_audio_import.cc:572 editor_audio_import.cc:598
-#: export_format_dialog.cc:60
+#: editor_audio_import.cc:578 editor_audio_import.cc:604
+#: export_format_dialog.cc:68
 msgid "Sample rate"
 msgstr ""
 
-#: editor_audio_import.cc:573 editor_audio_import.cc:599
+#: editor_audio_import.cc:579 editor_audio_import.cc:605
 msgid ""
 "%1\n"
 "This audiofile's sample rate doesn't match the session sample rate!"
@@ -4506,207 +5064,276 @@ msgstr ""
 "Częstotliwość próbkowania tego pliku nie odpowiada częstotliwości "
 "próbkowania sesji!"
 
-#: editor_audio_import.cc:595
+#: editor_audio_import.cc:601
 msgid "Embed it anyway"
 msgstr "Osadź mimo to"
 
-#: editor_canvas_events.cc:1306 editor_drag.cc:1381
+#: editor_pt_import.cc:81
+msgid "You can't import a PT session until you have a session loaded."
+msgstr ""
+
+#: editor_pt_import.cc:86
+msgid "Import PT Session"
+msgstr ""
+
+#: editor_pt_import.cc:97
+msgid "%1: this is only the directory/folder name, not the filename.\n"
+msgstr ""
+
+#: editor_pt_import.cc:132
+msgid "Doesn't seem to be a valid PT session file"
+msgstr ""
+
+#: editor_pt_import.cc:136
+msgid ""
+"PT v%1 Session @ %2Hz\n"
+"\n"
+"%3 audio files\n"
+"%4 regions\n"
+"%5 active regions\n"
+"\n"
+"Continue..."
+msgstr ""
+
+#: editor_pt_import.cc:175
+msgid ""
+"Failed to load one or more of the audio files, but continuing to attempt "
+"import."
+msgstr ""
+
+#: editor_pt_import.cc:178
+msgid "Success! Import should complete soon."
+msgstr ""
+
+#: editor_pt_import.cc:263
+msgid "PTImport: UINT_MAX routes? impossible!"
+msgstr ""
+
+#: editor_canvas_events.cc:1296 editor_drag.cc:1418
 msgid "Could not create new track after region placed in the drop zone"
 msgstr ""
 
-#: editor_drag.cc:1266
+#: editor_drag.cc:1306
 msgid "fixed time region drag"
 msgstr ""
 
-#: editor_drag.cc:2214
+#: editor_drag.cc:2249
 msgid "Ripple drag"
 msgstr ""
 
-#: editor_drag.cc:2365 midi_region_view.cc:2813
+#: editor_drag.cc:2311
+msgid "create region"
+msgstr ""
+
+#: editor_drag.cc:2430 midi_region_view.cc:2859
 msgid "resize notes"
 msgstr ""
 
-#: editor_drag.cc:2517
+#: editor_drag.cc:2613 editor_drag.cc:2648
+msgid ""
+"One or more Audio Regions\n"
+"are both Locked and\n"
+"Locked to Video.\n"
+"The video cannot me moved."
+msgstr ""
+
+#: editor_drag.cc:2683
 msgid "Video Start:"
 msgstr ""
 
-#: editor_drag.cc:2519
+#: editor_drag.cc:2685
 msgid "Diff:"
 msgstr ""
 
-#: editor_drag.cc:2538
+#: editor_drag.cc:2707
 msgid "Move Video"
 msgstr ""
 
-#: editor_drag.cc:3046
+#: editor_drag.cc:3177
+msgid "move meter mark"
+msgstr "przesuń oznaczenie metrum"
+
+#: editor_drag.cc:3179
 msgid "copy meter mark"
 msgstr "skopiuj oznaczenie metrum"
 
-#: editor_drag.cc:3054
-msgid "move meter mark"
-msgstr "przesuń oznaczenie metrum"
+#: editor_drag.cc:3279
+msgid "inactive"
+msgstr ""
 
-#: editor_drag.cc:3177
+#: editor_drag.cc:3324
+msgid "move tempo mark"
+msgstr "przesuń znacznik tempa"
+
+#: editor_drag.cc:3331
 msgid "copy tempo mark"
 msgstr "kopiuj znacznik tempa"
 
-#: editor_drag.cc:3185
-msgid "move tempo mark"
-msgstr "przesuń znacznik tempa"
+#: editor_drag.cc:3462
+msgid "dilate tempo"
+msgstr ""
 
-#: editor_drag.cc:3412
+#: editor_drag.cc:3736
 msgid "change fade in length"
 msgstr "zmień długość stopniowego wzmocnienia"
 
-#: editor_drag.cc:3526
+#: editor_drag.cc:3861
 msgid "change fade out length"
 msgstr ""
 
-#: editor_drag.cc:3880
+#: editor_drag.cc:4239
 msgid "move marker"
 msgstr "przesuń znacznik"
 
-#: editor_drag.cc:4490
+#: editor_drag.cc:4506 editor_drag.cc:5833
+msgid "automation range move"
+msgstr ""
+
+#: editor_drag.cc:4890
 msgid "An error occurred while executing time stretch operation"
 msgstr ""
 
-#: editor_drag.cc:4947
+#: editor_drag.cc:5351
 msgid "programming_error: %1"
 msgstr ""
 
-#: editor_drag.cc:5016 editor_drag.cc:5026
+#: editor_drag.cc:5420 editor_drag.cc:5430
 msgid "new skip marker"
 msgstr ""
 
-#: editor_drag.cc:5017
+#: editor_drag.cc:5421
 msgid "skip"
 msgstr ""
 
-#: editor_drag.cc:5021 location_ui.cc:56
+#: editor_drag.cc:5425 location_ui.cc:60
 msgid "CD"
 msgstr "CD"
 
-#: editor_drag.cc:5022
+#: editor_drag.cc:5426
 msgid "new CD marker"
 msgstr ""
 
-#: editor_drag.cc:5027 editor_route_groups.cc:437 mixer_ui.cc:1493
+#: editor_drag.cc:5431 editor_route_groups.cc:439 mixer_ui.cc:1840
 msgid "unnamed"
 msgstr "bez nazwy"
 
-#: editor_drag.cc:5309
+#: editor_drag.cc:5740
 msgid "Automation range drag created for invalid region type"
 msgstr ""
 
-#: editor_route_groups.cc:96
+#: editor_route_groups.cc:97
 msgid "Col"
 msgstr ""
 
-#: editor_route_groups.cc:96
+#: editor_route_groups.cc:97
 msgid "Group Tab Color"
 msgstr ""
 
-#: editor_route_groups.cc:97
+#: editor_route_groups.cc:98
 msgid "Name of Group"
 msgstr ""
 
-#: editor_route_groups.cc:98 editor_routes.cc:207
-msgid "V"
+#: editor_route_groups.cc:99 editor_routes.cc:234
+msgid "Visible|V"
 msgstr ""
 
-#: editor_route_groups.cc:98
+#: editor_route_groups.cc:99
 msgid "Group is visible?"
 msgstr ""
 
-#: editor_route_groups.cc:99
+#: editor_route_groups.cc:100
 msgid "On"
 msgstr ""
 
-#: editor_route_groups.cc:99
+#: editor_route_groups.cc:100
 msgid "Group is enabled?"
 msgstr ""
 
-#: editor_route_groups.cc:100
-msgid "group|G"
+#: editor_route_groups.cc:101
+msgid "Group|G"
 msgstr ""
 
-#: editor_route_groups.cc:100
+#: editor_route_groups.cc:101
 msgid "Sharing Gain?"
 msgstr ""
 
-#: editor_route_groups.cc:101
-msgid "relative|Rel"
+#: editor_route_groups.cc:102
+msgid "Relative|Rel"
 msgstr ""
 
-#: editor_route_groups.cc:101
+#: editor_route_groups.cc:102
 msgid "Relative Gain Changes?"
 msgstr ""
 
-#: editor_route_groups.cc:102
-msgid "mute|M"
+#: editor_route_groups.cc:103 editor_regions.cc:168 editor_routes.cc:239
+#: mixer_strip.cc:2221 meter_strip.cc:365 route_time_axis.cc:2742
+#: time_axis_view.cc:1106
+msgid "Mute|M"
 msgstr ""
 
-#: editor_route_groups.cc:102
+#: editor_route_groups.cc:103
 msgid "Sharing Mute?"
 msgstr ""
 
-#: editor_route_groups.cc:103
-msgid "solo|S"
+#: editor_route_groups.cc:104 editor_routes.cc:240 mixer_strip.cc:2234
+#: meter_strip.cc:373 route_time_axis.cc:2739 vca_master_strip.cc:211
+#: vca_time_axis.cc:236
+msgid "Solo|S"
 msgstr ""
 
-#: editor_route_groups.cc:103
+#: editor_route_groups.cc:104
 msgid "Sharing Solo?"
 msgstr ""
 
-#: editor_route_groups.cc:104 midi_time_axis.cc:1622 midi_time_axis.cc:1625
-#: midi_time_axis.cc:1628
+#: editor_route_groups.cc:105 midi_time_axis.cc:1626 midi_time_axis.cc:1629
+#: midi_time_axis.cc:1632
 msgid "Rec"
 msgstr "Nagr"
 
-#: editor_route_groups.cc:104
+#: editor_route_groups.cc:105
 msgid "Sharing Record-enable Status?"
 msgstr ""
 
-#: editor_route_groups.cc:105
-msgid "monitoring|Mon"
+#: editor_route_groups.cc:106
+msgid "Monitoring|Mon"
 msgstr ""
 
-#: editor_route_groups.cc:105
+#: editor_route_groups.cc:106
 msgid "Sharing Monitoring Choice?"
 msgstr ""
 
-#: editor_route_groups.cc:106
-msgid "selection|Sel"
+#: editor_route_groups.cc:107
+msgid "Selection|Sel"
 msgstr ""
 
-#: editor_route_groups.cc:106
+#: editor_route_groups.cc:107
 msgid "Sharing Selected/Editing Status?"
 msgstr ""
 
-#: editor_route_groups.cc:107
-msgid "active|A"
+#: editor_route_groups.cc:108 editor_routes.cc:235
+msgid "Active|A"
 msgstr ""
 
-#: editor_route_groups.cc:107
+#: editor_route_groups.cc:108
 msgid "Sharing Active Status?"
 msgstr ""
 
-#: editor_export_audio.cc:92 editor_markers.cc:740 editor_markers.cc:827
-#: editor_markers.cc:1012 editor_markers.cc:1030 editor_markers.cc:1048
-#: editor_markers.cc:1067 editor_markers.cc:1086 editor_markers.cc:1116
-#: editor_markers.cc:1147 editor_markers.cc:1177 editor_markers.cc:1205
-#: editor_markers.cc:1236 editor_markers.cc:1261 editor_markers.cc:1312
-#: editor_markers.cc:1356 editor_markers.cc:1382 editor_markers.cc:1576
-#: editor_mouse.cc:2120
+#: editor_export_audio.cc:93 editor_markers.cc:733 editor_markers.cc:832
+#: editor_markers.cc:1045 editor_markers.cc:1063 editor_markers.cc:1081
+#: editor_markers.cc:1100 editor_markers.cc:1119 editor_markers.cc:1149
+#: editor_markers.cc:1180 editor_markers.cc:1210 editor_markers.cc:1238
+#: editor_markers.cc:1269 editor_markers.cc:1294 editor_markers.cc:1345
+#: editor_markers.cc:1458 editor_markers.cc:1484 editor_markers.cc:1678
+#: editor_mouse.cc:2255
 msgid "programming error: marker canvas item has no marker object pointer!"
 msgstr ""
 
-#: editor_export_audio.cc:145 editor_export_audio.cc:150
-msgid "File Exists!"
+#: editor_export_audio.cc:114
+msgid "Confirm MIDI File Overwrite"
 msgstr ""
 
-#: editor_export_audio.cc:153
-msgid "Overwrite Existing File"
+#: editor_export_audio.cc:115 utils_videotl.cc:73
+msgid "A file with the same name already exists. Do you want to overwrite it?"
 msgstr ""
 
 #: editor_group_tabs.cc:176
@@ -4721,300 +5348,341 @@ msgstr ""
 msgid "end"
 msgstr ""
 
-#: editor_markers.cc:657 editor_ops.cc:2085 editor_ops.cc:2107
-#: editor_ops.cc:2164 editor_ops.cc:2193 location_ui.cc:1023
+#: editor_markers.cc:645
+msgid "mark"
+msgstr ""
+
+#: editor_markers.cc:650 editor_ops.cc:2164 editor_ops.cc:2186
+#: editor_ops.cc:2304 editor_ops.cc:2341 location_ui.cc:1049
 msgid "add marker"
 msgstr "dodaj znacznik"
 
-#: editor_markers.cc:689 editor_markers.cc:1456
+#: editor_markers.cc:682 editor_markers.cc:1558
 msgid "set loop range"
 msgstr "ustaw zakres pętli"
 
-#: editor_markers.cc:705 editor_markers.cc:1462
+#: editor_markers.cc:698 editor_markers.cc:1564
 msgid "set punch range"
 msgstr "ustaw zakres przełącznika"
 
-#: editor_markers.cc:722 editor_ops.cc:4055
+#: editor_markers.cc:715 editor_ops.cc:4159
 msgid "range"
 msgstr ""
 
-#: editor_markers.cc:725
+#: editor_markers.cc:718
 msgid "new range marker"
 msgstr "nowy znacznik zakresu"
 
-#: editor_markers.cc:758 editor_ops.cc:2129 location_ui.cc:859
+#: editor_markers.cc:751 editor_ops.cc:2272 location_ui.cc:885
 msgid "remove marker"
 msgstr "usuń znacznik"
 
-#: editor_markers.cc:894
+#: editor_markers.cc:899
 msgid "Locate to Here"
 msgstr ""
 
-#: editor_markers.cc:895
+#: editor_markers.cc:900
 msgid "Play from Here"
 msgstr ""
 
-#: editor_markers.cc:896
+#: editor_markers.cc:901
 msgid "Move Mark to Playhead"
 msgstr "Przesuń znacznik do głowicy"
 
-#: editor_markers.cc:900
+#: editor_markers.cc:905
 msgid "Create Range to Next Marker"
 msgstr ""
 
-#: editor_markers.cc:941
+#: editor_markers.cc:946
 msgid "Locate to Marker"
 msgstr ""
 
-#: editor_markers.cc:942
+#: editor_markers.cc:947
 msgid "Play from Marker"
 msgstr ""
 
-#: editor_markers.cc:945
+#: editor_markers.cc:950
 msgid "Set Marker from Playhead"
 msgstr ""
 
-#: editor_markers.cc:947
+#: editor_markers.cc:951
 msgid "Set Range from Selection"
 msgstr ""
 
-#: editor_markers.cc:957
+#: editor_markers.cc:960
 msgid "Hide Range"
 msgstr "Ukryj zakres"
 
-#: editor_markers.cc:958
+#: editor_markers.cc:961
 msgid "Rename Range..."
 msgstr ""
 
-#: editor_markers.cc:962
+#: editor_markers.cc:965
 msgid "Remove Range"
 msgstr "Usuń zakres"
 
-#: editor_markers.cc:969
+#: editor_markers.cc:972
 msgid "Separate Regions in Range"
 msgstr "Oddziel obszar w zakresie"
 
-#: editor_markers.cc:972
+#: editor_markers.cc:974
 msgid "Select Range"
 msgstr "Zaznacz zakres"
 
-#: editor_markers.cc:1001
+#: editor_markers.cc:987
+msgid "Make Ramped"
+msgstr ""
+
+#: editor_markers.cc:989
+msgid "Make Constant"
+msgstr ""
+
+#: editor_markers.cc:993 editor_markers.cc:1013
+msgid "Lock to Music"
+msgstr ""
+
+#: editor_markers.cc:995 editor_markers.cc:1015
+msgid "Lock to Audio"
+msgstr ""
+
+#: editor_markers.cc:1034
 msgid "Set Punch Range"
 msgstr "Ustaw zakres przełącznika"
 
-#: editor_markers.cc:1407 editor_ops.cc:2040
+#: editor_markers.cc:1391
+msgid "change meter lock style"
+msgstr ""
+
+#: editor_markers.cc:1414
+msgid "change tempo lock style"
+msgstr ""
+
+#: editor_markers.cc:1441
+msgid "change tempo type"
+msgstr ""
+
+#: editor_markers.cc:1509 editor_ops.cc:2119
 msgid "New Name:"
 msgstr "Nazwa:"
 
-#: editor_markers.cc:1410
+#: editor_markers.cc:1512
 msgid "Rename Mark"
 msgstr "Zmień nazwę znacznika"
 
-#: editor_markers.cc:1412
+#: editor_markers.cc:1514
 msgid "Rename Range"
 msgstr "Zmień nazwę zakresu"
 
-#: editor_markers.cc:1419 editor_mouse.cc:2137 processor_box.cc:1994
-#: processor_box.cc:2464 route_time_axis.cc:1100 route_ui.cc:1628
+#: editor_markers.cc:1521 editor_mouse.cc:2272 processor_box.cc:3192
+#: processor_box.cc:3681 route_time_axis.cc:1110 route_ui.cc:1637
+#: vca_master_strip.cc:395
 msgid "Rename"
 msgstr "Zmień nazwę"
 
-#: editor_markers.cc:1432
+#: editor_markers.cc:1534
 msgid "rename marker"
 msgstr "zmień nazwę znacznika"
 
-#: editor_mixer.cc:90
+#: editor_mixer.cc:98
 msgid "This screen is not tall enough to display the editor mixer"
 msgstr ""
 
-#: editor_mouse.cc:1223 editor_mouse.cc:1241 editor_tempodisplay.cc:270
+#: editor_mouse.cc:1345 editor_mouse.cc:1363 editor_tempodisplay.cc:384
 msgid ""
 "programming error: tempo marker canvas item has no marker object pointer!"
 msgstr ""
 
-#: editor_mouse.cc:1228 editor_tempodisplay.cc:275
+#: editor_mouse.cc:1350 editor_tempodisplay.cc:389
 msgid "programming error: marker for tempo is not a tempo marker!"
 msgstr ""
 
-#: editor_mouse.cc:1246 editor_tempodisplay.cc:375
+#: editor_mouse.cc:1368 editor_tempodisplay.cc:507
 msgid "programming error: marker for meter is not a meter marker!"
 msgstr ""
 
-#: editor_mouse.cc:1885 editor_mouse.cc:1910 editor_mouse.cc:1923
+#: editor_mouse.cc:2016 editor_mouse.cc:2041 editor_mouse.cc:2054
 msgid ""
 "programming error: control point canvas item has no control point object "
 "pointer!"
 msgstr ""
 
-#: editor_mouse.cc:2058
+#: editor_mouse.cc:2085
+msgid "edit note(s)"
+msgstr ""
+
+#: editor_mouse.cc:2193
 msgid "start point trim"
 msgstr ""
 
-#: editor_mouse.cc:2083
-msgid "End point trim"
-msgstr "Punkt końcowy przycięcia"
+#: editor_mouse.cc:2218
+msgid "end point trim"
+msgstr ""
 
-#: editor_mouse.cc:2135
+#: editor_mouse.cc:2270
 msgid "Name for region:"
 msgstr "Nazwa obszaru:"
 
-#: editor_ops.cc:165
+#: editor_ops.cc:168
 msgid "split"
 msgstr "podziel"
 
-#: editor_ops.cc:339
+#: editor_ops.cc:342
 msgid "alter selection"
 msgstr ""
 
-#: editor_ops.cc:381
+#: editor_ops.cc:384
 msgid "nudge regions forward"
 msgstr "pchnij obszary do przodu"
 
-#: editor_ops.cc:404 editor_ops.cc:489
+#: editor_ops.cc:441 editor_ops.cc:535
 msgid "nudge location forward"
 msgstr "pchnij pozycjÄ™ do przodu"
 
-#: editor_ops.cc:462
+#: editor_ops.cc:472
 msgid "nudge regions backward"
 msgstr "pchnij obszar do tyłu"
 
-#: editor_ops.cc:551
+#: editor_ops.cc:567
 msgid "nudge forward"
 msgstr "pchnij do przodu"
 
-#: editor_ops.cc:575
+#: editor_ops.cc:591
 msgid "nudge backward"
 msgstr ""
 
-#: editor_ops.cc:618
+#: editor_ops.cc:656
 msgid "sequence regions"
 msgstr ""
 
-#: editor_ops.cc:694
+#: editor_ops.cc:718
 msgid "build_region_boundary_cache called with snap_type = %1"
 msgstr ""
 
-#: editor_ops.cc:2042
+#: editor_ops.cc:2121
 msgid "New Location Marker"
 msgstr ""
 
-#: editor_ops.cc:2164
+#: editor_ops.cc:2212 editor_ops.cc:2236
+msgid "Set session start"
+msgstr ""
+
+#: editor_ops.cc:2304
 msgid "add markers"
 msgstr ""
 
-#: editor_ops.cc:2274
+#: editor_ops.cc:2400
 msgid "clear markers"
 msgstr "wyczyść znaczniki"
 
-#: editor_ops.cc:2289
+#: editor_ops.cc:2415
 msgid "clear ranges"
 msgstr "wyczyść zakresy"
 
-#: editor_ops.cc:2305
+#: editor_ops.cc:2431
 msgid "clear locations"
 msgstr "wyczyść położenia"
 
-#: editor_ops.cc:2368
+#: editor_ops.cc:2494
 msgid "insert region"
 msgstr "wstaw obszar"
 
-#: editor_ops.cc:2559
+#: editor_ops.cc:2685
 msgid "raise regions"
 msgstr ""
 
-#: editor_ops.cc:2561
+#: editor_ops.cc:2687
 msgid "raise region"
 msgstr ""
 
-#: editor_ops.cc:2567
+#: editor_ops.cc:2693
 msgid "raise regions to top"
 msgstr ""
 
-#: editor_ops.cc:2569
+#: editor_ops.cc:2695
 msgid "raise region to top"
 msgstr ""
 
-#: editor_ops.cc:2575
+#: editor_ops.cc:2701
 msgid "lower regions"
 msgstr ""
 
-#: editor_ops.cc:2577 editor_ops.cc:2585
+#: editor_ops.cc:2703 editor_ops.cc:2711
 msgid "lower region"
 msgstr ""
 
-#: editor_ops.cc:2583
+#: editor_ops.cc:2709
 msgid "lower regions to bottom"
 msgstr ""
 
-#: editor_ops.cc:2668
+#: editor_ops.cc:2794
 msgid "Rename Region"
 msgstr "Zmień nazwę obszaru"
 
-#: editor_ops.cc:2670 processor_box.cc:1992 route_ui.cc:1626
+#: editor_ops.cc:2796 processor_box.cc:3190 route_ui.cc:1635
 msgid "New name:"
 msgstr "Nazwa:"
 
-#: editor_ops.cc:2987
+#: editor_ops.cc:3097
 msgid "separate"
 msgstr "oddziel"
 
-#: editor_ops.cc:3099
+#: editor_ops.cc:3207
 msgid "separate region under"
 msgstr ""
 
-#: editor_ops.cc:3220
+#: editor_ops.cc:3360
 msgid "trim to selection"
 msgstr "przytnij do zaznaczenia"
 
-#: editor_ops.cc:3356
+#: editor_ops.cc:3442
 msgid "set sync point"
 msgstr "ustaw punkt synchronizacji"
 
-#: editor_ops.cc:3380
+#: editor_ops.cc:3466
 msgid "remove region sync"
 msgstr ""
 
-#: editor_ops.cc:3402
+#: editor_ops.cc:3488
 msgid "move regions to original position"
 msgstr ""
 
-#: editor_ops.cc:3404
+#: editor_ops.cc:3490
 msgid "move region to original position"
 msgstr ""
 
-#: editor_ops.cc:3425
+#: editor_ops.cc:3511
 msgid "align selection"
 msgstr ""
 
-#: editor_ops.cc:3499
+#: editor_ops.cc:3585
 msgid "align selection (relative)"
 msgstr ""
 
-#: editor_ops.cc:3533
+#: editor_ops.cc:3619
 msgid "align region"
 msgstr ""
 
-#: editor_ops.cc:3584
+#: editor_ops.cc:3670
 msgid "trim front"
 msgstr "przytnij przód"
 
-#: editor_ops.cc:3584
+#: editor_ops.cc:3670
 msgid "trim back"
 msgstr "przytnij tył"
 
-#: editor_ops.cc:3614
+#: editor_ops.cc:3700
 msgid "trim to loop"
 msgstr "przytnij do pętli"
 
-#: editor_ops.cc:3624
+#: editor_ops.cc:3710
 msgid "trim to punch"
 msgstr "przytnij do przełącznika"
 
-#: editor_ops.cc:3686
+#: editor_ops.cc:3832
 msgid "trim to region"
 msgstr ""
 
-#: editor_ops.cc:3794
+#: editor_ops.cc:3891
 msgid ""
 "This track/bus cannot be frozen because the signal adds or loses channels "
 "before reaching the outputs.\n"
@@ -5022,11 +5690,11 @@ msgid ""
 "input or vice versa."
 msgstr ""
 
-#: editor_ops.cc:3797
+#: editor_ops.cc:3894
 msgid "Cannot freeze"
 msgstr ""
 
-#: editor_ops.cc:3803
+#: editor_ops.cc:3900
 msgid ""
 "<b>%1</b>\n"
 "\n"
@@ -5035,23 +5703,23 @@ msgid ""
 "Freezing will only process the signal as far as the first send/insert/return."
 msgstr ""
 
-#: editor_ops.cc:3807
+#: editor_ops.cc:3904
 msgid "Freeze anyway"
 msgstr ""
 
-#: editor_ops.cc:3808
+#: editor_ops.cc:3905
 msgid "Don't freeze"
 msgstr ""
 
-#: editor_ops.cc:3809
+#: editor_ops.cc:3906
 msgid "Freeze Limits"
 msgstr ""
 
-#: editor_ops.cc:3824
+#: editor_ops.cc:3921
 msgid "Cancel Freeze"
 msgstr "Anuluj zamrożenie"
 
-#: editor_ops.cc:3854
+#: editor_ops.cc:3952
 msgid ""
 "You can't perform this operation because the processing of the signal will "
 "cause one or more of the tracks to end up with a region with more channels "
@@ -5060,47 +5728,47 @@ msgid ""
 "You can do this without processing, which is a different operation."
 msgstr ""
 
-#: editor_ops.cc:3858
+#: editor_ops.cc:3956
 msgid "Cannot bounce"
 msgstr ""
 
-#: editor_ops.cc:3869
+#: editor_ops.cc:4007
 msgid "bounce range"
 msgstr "zgraj zakres"
 
-#: editor_ops.cc:3971
+#: editor_ops.cc:4074
 msgid "delete"
 msgstr ""
 
-#: editor_ops.cc:3974
+#: editor_ops.cc:4077
 msgid "cut"
 msgstr "wytnij"
 
-#: editor_ops.cc:3977
+#: editor_ops.cc:4080
 msgid "copy"
 msgstr "skopiuj"
 
-#: editor_ops.cc:3980
+#: editor_ops.cc:4083
 msgid "clear"
 msgstr "wyczyść"
 
-#: editor_ops.cc:4028
+#: editor_ops.cc:4132
 msgid "objects"
 msgstr ""
 
-#: editor_ops.cc:4238 editor_ops.cc:4270
+#: editor_ops.cc:4342 editor_ops.cc:4427
 msgid "remove region"
 msgstr "usuń obszar"
 
-#: editor_ops.cc:4719
-msgid "duplicate selection"
-msgstr "duplikuj zaznaczenie"
+#: editor_ops.cc:4844
+msgid "duplicate range selection"
+msgstr ""
 
-#: editor_ops.cc:4803
+#: editor_ops.cc:4938
 msgid "nudge track"
 msgstr "pchnij ścieżkę"
 
-#: editor_ops.cc:4840
+#: editor_ops.cc:4965
 msgid ""
 "Do you really want to destroy the last capture?\n"
 "(This is destructive and cannot be undone)"
@@ -5108,136 +5776,156 @@ msgstr ""
 "Na pewno usunąć ostatnie nagranie?\n"
 "(Ta operacja nie może zostać cofnięta)"
 
-#: editor_ops.cc:4843 editor_ops.cc:6838 editor_regions.cc:462
-#: editor_snapshots.cc:159 route_ui.cc:1569
+#: editor_ops.cc:4968 editor_ops.cc:7202 editor_regions.cc:503
+#: editor_snapshots.cc:171
 msgid "No, do nothing."
 msgstr "Nie usuwaj niczego"
 
-#: editor_ops.cc:4844
+#: editor_ops.cc:4969
 msgid "Yes, destroy it."
 msgstr "Tak, usuń go."
 
-#: editor_ops.cc:4846
+#: editor_ops.cc:4971
 msgid "Destroy last capture"
 msgstr ""
 
-#: editor_ops.cc:4906
+#: editor_ops.cc:5047
 msgid "normalize"
 msgstr "normalizuj"
 
-#: editor_ops.cc:5000
+#: editor_ops.cc:5145
 msgid "reverse regions"
 msgstr "odwróć obszary"
 
-#: editor_ops.cc:5034
+#: editor_ops.cc:5182
 msgid "strip silence"
 msgstr ""
 
-#: editor_ops.cc:5091
+#: editor_ops.cc:5263
 msgid "Fork Region(s)"
 msgstr ""
 
-#: editor_ops.cc:5112
+#: editor_ops.cc:5270
 msgid "Could not unlink %1"
 msgstr ""
 
-#: editor_ops.cc:5326
+#: editor_ops.cc:5532
 msgid "reset region gain"
 msgstr "zresetuj wzmocnienie obszaru"
 
-#: editor_ops.cc:5379
+#: editor_ops.cc:5590
 msgid "region gain envelope active"
 msgstr ""
 
-#: editor_ops.cc:5406
+#: editor_ops.cc:5615
 msgid "toggle region lock"
 msgstr ""
 
-#: editor_ops.cc:5430
+#: editor_ops.cc:5639
 msgid "Toggle Video Lock"
 msgstr ""
 
-#: editor_ops.cc:5454
+#: editor_ops.cc:5663
 msgid "region lock style"
 msgstr ""
 
-#: editor_ops.cc:5479
+#: editor_ops.cc:5688
 msgid "change region opacity"
 msgstr ""
 
-#: editor_ops.cc:5572
+#: editor_ops.cc:5781
 msgid "fade range"
 msgstr ""
 
-#: editor_ops.cc:5610
+#: editor_ops.cc:5819
 msgid "set fade in length"
 msgstr "zmień długość stopniowego wzmocnienia"
 
-#: editor_ops.cc:5617
+#: editor_ops.cc:5826
 msgid "set fade out length"
 msgstr "zmień długość stopniowego wyciszenia"
 
-#: editor_ops.cc:5662
+#: editor_ops.cc:5891
 msgid "set fade in shape"
 msgstr "ustaw kształt stopniowego wzmocnienia"
 
-#: editor_ops.cc:5693
+#: editor_ops.cc:5926
 msgid "set fade out shape"
 msgstr "ustaw kształt stopniowego wyciszenia"
 
-#: editor_ops.cc:5723
+#: editor_ops.cc:5962
 msgid "set fade in active"
 msgstr "włącz stopniowe wzmocnienie"
 
-#: editor_ops.cc:5752
+#: editor_ops.cc:5996
 msgid "set fade out active"
 msgstr "włącz stopniowe wyciszenie"
 
-#: editor_ops.cc:5994
+#: editor_ops.cc:6056
+msgid "toggle fade active"
+msgstr ""
+
+#: editor_ops.cc:6249
 msgid "set loop range from selection"
 msgstr "ustaw zakres pętli w miejscu zaznaczenia"
 
-#: editor_ops.cc:6008
+#: editor_ops.cc:6263
 msgid "set loop range from region"
 msgstr "ustaw zakres pętli w obszarze"
 
-#: editor_ops.cc:6027
+#: editor_ops.cc:6282
 msgid "set punch range from selection"
 msgstr "ustaw zakres przełącznika w miejscu zaznaczenia"
 
-#: editor_ops.cc:6041
+#: editor_ops.cc:6306
 msgid "set session start/end from selection"
 msgstr ""
 
-#: editor_ops.cc:6066
+#: editor_ops.cc:6344
+msgid "set punch start from EP"
+msgstr ""
+
+#: editor_ops.cc:6372
+msgid "set punch end from EP"
+msgstr ""
+
+#: editor_ops.cc:6405
+msgid "set loop start from EP"
+msgstr ""
+
+#: editor_ops.cc:6433
+msgid "set loop end from EP"
+msgstr ""
+
+#: editor_ops.cc:6444
 msgid "set punch range from region"
 msgstr "ustaw zakres przełącznika w obszarze"
 
-#: editor_ops.cc:6175
+#: editor_ops.cc:6531
 msgid "Add new marker"
 msgstr "Dodaj nowy znacznik"
 
-#: editor_ops.cc:6176
+#: editor_ops.cc:6532
 msgid "Set global tempo"
 msgstr "Ustaw ogólne tempo"
 
-#: editor_ops.cc:6179
+#: editor_ops.cc:6535
 msgid "Define one bar"
 msgstr ""
 
-#: editor_ops.cc:6180
+#: editor_ops.cc:6536
 msgid "Do you want to set the global tempo or add a new tempo marker?"
 msgstr ""
 
-#: editor_ops.cc:6206
+#: editor_ops.cc:6562
 msgid "set tempo from region"
 msgstr "Ustaw tempo dla obszaru"
 
-#: editor_ops.cc:6236
+#: editor_ops.cc:6591
 msgid "split regions"
 msgstr "podziel obszary"
 
-#: editor_ops.cc:6278
+#: editor_ops.cc:6633
 msgid ""
 "You are about to split\n"
 "%1\n"
@@ -5245,62 +5933,62 @@ msgid ""
 "This could take a long time."
 msgstr ""
 
-#: editor_ops.cc:6285
+#: editor_ops.cc:6640
 msgid "Call for the Ferret!"
 msgstr ""
 
-#: editor_ops.cc:6286
+#: editor_ops.cc:6641
 msgid ""
 "Press OK to continue with this split operation\n"
 "or ask the Ferret dialog to tune the analysis"
 msgstr ""
 
-#: editor_ops.cc:6288
+#: editor_ops.cc:6643
 msgid "Press OK to continue with this split operation"
 msgstr ""
 
-#: editor_ops.cc:6291
+#: editor_ops.cc:6646
 msgid "Excessive split?"
 msgstr ""
 
-#: editor_ops.cc:6443
+#: editor_ops.cc:6800
 msgid "place transient"
 msgstr ""
 
-#: editor_ops.cc:6478
+#: editor_ops.cc:6834
 msgid "snap regions to grid"
 msgstr ""
 
-#: editor_ops.cc:6517
+#: editor_ops.cc:6873
 msgid "Close Region Gaps"
 msgstr ""
 
-#: editor_ops.cc:6522
+#: editor_ops.cc:6878
 msgid "Crossfade length"
 msgstr ""
 
-#: editor_ops.cc:6531 editor_ops.cc:6542 rhythm_ferret.cc:119
-#: session_option_editor.cc:141
+#: editor_ops.cc:6887 editor_ops.cc:6898 rhythm_ferret.cc:128
+#: rhythm_ferret.cc:143 session_option_editor.cc:141
 msgid "ms"
 msgstr ""
 
-#: editor_ops.cc:6533
+#: editor_ops.cc:6889
 msgid "Pull-back length"
 msgstr ""
 
-#: editor_ops.cc:6546
+#: editor_ops.cc:6902 keyeditor.cc:71
 msgid "Ok"
 msgstr ""
 
-#: editor_ops.cc:6561
+#: editor_ops.cc:6917
 msgid "close region gaps"
 msgstr ""
 
-#: editor_ops.cc:6786 route_ui.cc:1543
+#: editor_ops.cc:7160
 msgid "That would be bad news ...."
 msgstr ""
 
-#: editor_ops.cc:6791 route_ui.cc:1548
+#: editor_ops.cc:7165
 msgid ""
 "Removing the master or monitor bus is such a bad idea\n"
 "that %1 is not going to allow it.\n"
@@ -5310,23 +5998,23 @@ msgid ""
 "\"allow-special-bus-removal\" option to be \"yes\""
 msgstr ""
 
-#: editor_ops.cc:6809
-msgid "tracks"
-msgstr "ścieżki"
-
-#: editor_ops.cc:6811 route_ui.cc:1992
+#: editor_ops.cc:7181
+#, fuzzy
 msgid "track"
-msgstr "ścieżka"
+msgid_plural "tracks"
+msgstr[0] "ścieżka"
+msgstr[1] "ścieżka"
+msgstr[2] "ścieżka"
 
-#: editor_ops.cc:6815
-msgid "busses"
-msgstr "szyny"
-
-#: editor_ops.cc:6817 route_ui.cc:1992
+#: editor_ops.cc:7182
+#, fuzzy
 msgid "bus"
-msgstr "szyna"
+msgid_plural "busses"
+msgstr[0] "szyna"
+msgstr[1] "szyna"
+msgstr[2] "szyna"
 
-#: editor_ops.cc:6822
+#: editor_ops.cc:7186
 msgid ""
 "Do you really want to remove %1 %2 and %3 %4?\n"
 "(You may also lose the playlists associated with the %2)\n"
@@ -5334,7 +6022,7 @@ msgid ""
 "This action cannot be undone, and the session file will be overwritten!"
 msgstr ""
 
-#: editor_ops.cc:6827
+#: editor_ops.cc:7191
 msgid ""
 "Do you really want to remove %1 %2?\n"
 "(You may also lose the playlists associated with the %2)\n"
@@ -5342,358 +6030,371 @@ msgid ""
 "This action cannot be undone, and the session file will be overwritten!"
 msgstr ""
 
-#: editor_ops.cc:6833
+#: editor_ops.cc:7197
 msgid ""
 "Do you really want to remove %1 %2?\n"
 "\n"
 "This action cannot be undone, and the session file will be overwritten"
 msgstr ""
 
-#: editor_ops.cc:6840
+#: editor_ops.cc:7204
 msgid "Yes, remove them."
 msgstr "Tak, usuń je."
 
-#: editor_ops.cc:6842 editor_snapshots.cc:160 route_ui.cc:1570
+#: editor_ops.cc:7206 editor_snapshots.cc:172
 msgid "Yes, remove it."
 msgstr "Tak, usuń."
 
-#: editor_ops.cc:6847 editor_ops.cc:6849
+#: editor_ops.cc:7211 editor_ops.cc:7213
 msgid "Remove %1"
 msgstr ""
 
-#: editor_ops.cc:6912
+#: editor_ops.cc:7319 editor_ops.cc:7333 editor_ops.cc:7373 editor_ops.cc:7383
 msgid "insert time"
 msgstr "wstaw czas"
 
-#: editor_ops.cc:7076
+#: editor_ops.cc:7436
+msgid "Cannot insert or delete time when in Lock edit."
+msgstr ""
+
+#: editor_ops.cc:7456 editor_ops.cc:7468 editor_ops.cc:7541 editor_ops.cc:7554
+msgid "remove time"
+msgstr ""
+
+#: editor_ops.cc:7628
 msgid "There are too many tracks to fit in the current window"
 msgstr ""
 
-#: editor_ops.cc:7137
+#: editor_ops.cc:7689
 msgid "Sel"
 msgstr ""
 
-#: editor_ops.cc:7176
+#: editor_ops.cc:7728
 #, c-format
 msgid "Saved view %u"
 msgstr ""
 
-#: editor_ops.cc:7201
+#: editor_ops.cc:7753
 msgid "mute regions"
 msgstr ""
 
-#: editor_ops.cc:7203
+#: editor_ops.cc:7755
 msgid "mute region"
 msgstr "wycisz obszar"
 
-#: editor_ops.cc:7240
+#: editor_ops.cc:7792
 msgid "combine regions"
 msgstr ""
 
-#: editor_ops.cc:7278
+#: editor_ops.cc:7830
 msgid "uncombine regions"
 msgstr ""
 
-#: editor_ops.cc:7315
+#: editor_ops.cc:7867
 msgid "%1: Locked"
 msgstr ""
 
-#: editor_ops.cc:7322
+#: editor_ops.cc:7874
 msgid "Click to unlock"
 msgstr ""
 
-#: editor_ops.cc:7376
+#: editor_ops.cc:7923
 msgid "Moving embedded files into session folder"
 msgstr ""
 
-#: editor_regions.cc:112
+#: editor_regions.cc:159
 msgid "Region name, with number of channels in []'s"
 msgstr ""
 
-#: editor_regions.cc:113
+#: editor_regions.cc:160
 msgid "Position of start of region"
 msgstr ""
 
-#: editor_regions.cc:114 editor_regions.cc:851 time_info_box.cc:101
+#: editor_regions.cc:161 editor_regions.cc:935 time_info_box.cc:95
 msgid "End"
 msgstr ""
 
-#: editor_regions.cc:114
+#: editor_regions.cc:161
 msgid "Position of end of region"
 msgstr ""
 
-#: editor_regions.cc:115
+#: editor_regions.cc:162
 msgid "Length of the region"
 msgstr ""
 
-#: editor_regions.cc:116
+#: editor_regions.cc:163
 msgid "Position of region sync point, relative to start of the region"
 msgstr ""
 
-#: editor_regions.cc:117
+#: editor_regions.cc:164
 msgid "Length of region fade-in (units: secondary clock), () if disabled"
 msgstr ""
 
-#: editor_regions.cc:118
+#: editor_regions.cc:165
 msgid "Length of region fade-out (units: secondary clock), () if disabled"
 msgstr ""
 
-#: editor_regions.cc:119 mixer_strip.cc:2055 mono_panner.cc:203
-#: panner2d.cc:240 stereo_panner.cc:251 stereo_panner.cc:274
-msgid "L"
+#: editor_regions.cc:166
+msgid "Lock|L"
 msgstr ""
 
-#: editor_regions.cc:119
+#: editor_regions.cc:166
 msgid "Region position locked?"
 msgstr ""
 
-#: editor_regions.cc:120 route_time_axis.cc:103
-msgid "G"
+#: editor_regions.cc:167
+msgid "Gain|G"
 msgstr ""
 
-#: editor_regions.cc:120
+#: editor_regions.cc:167
 msgid "Region position glued to Bars|Beats time?"
 msgstr ""
 
-#: editor_regions.cc:121 editor_routes.cc:211 gain_meter.cc:793
-#: mixer_strip.cc:2032 meter_strip.cc:359 panner_ui.cc:603
-#: route_time_axis.cc:2713 stereo_panner.cc:271 time_axis_view.cc:1190
-msgid "M"
-msgstr ""
-
-#: editor_regions.cc:121
+#: editor_regions.cc:168
 msgid "Region muted?"
 msgstr ""
 
-#: editor_regions.cc:122 mixer_strip.cc:1855
-msgid "O"
+#: editor_regions.cc:169
+msgid "Opaque|O"
 msgstr ""
 
-#: editor_regions.cc:122
+#: editor_regions.cc:169
 msgid "Region opaque (blocks regions below it from being heard)?"
 msgstr ""
 
-#: editor_regions.cc:311 editor_regions.cc:316 editor_regions.cc:318
+#: editor_regions.cc:360 editor_regions.cc:365 editor_regions.cc:367
 msgid "Hidden"
 msgstr "Ukryte"
 
-#: editor_regions.cc:391
+#: editor_regions.cc:432
 msgid "(MISSING) "
 msgstr ""
 
-#: editor_regions.cc:459
+#: editor_regions.cc:500
 msgid ""
 "Do you really want to remove unused regions?\n"
 "(This is destructive and cannot be undone)"
 msgstr ""
 
-#: editor_regions.cc:463
+#: editor_regions.cc:504
 msgid "Yes, remove."
 msgstr ""
 
-#: editor_regions.cc:465
+#: editor_regions.cc:506
 msgid "Remove unused regions"
 msgstr ""
 
-#: editor_regions.cc:818 editor_regions.cc:832 editor_regions.cc:846
+#: editor_regions.cc:735
+msgid "EditorRegions::format_position: negative timecode position: %1"
+msgstr ""
+
+#: editor_regions.cc:900 editor_regions.cc:916 editor_regions.cc:930
 msgid "Mult."
 msgstr ""
 
-#: editor_regions.cc:849 midi_list_editor.cc:104 time_info_box.cc:94
+#: editor_regions.cc:933 midi_list_editor.cc:104 time_info_box.cc:88
 msgid "Start"
 msgstr ""
 
-#: editor_regions.cc:867 editor_regions.cc:883
+#: editor_regions.cc:951 editor_regions.cc:967
 msgid "Multiple"
 msgstr ""
 
-#: editor_regions.cc:952
+#: editor_regions.cc:1036
 msgid "MISSING "
 msgstr ""
 
-#: editor_routes.cc:182 editor_routes.cc:214
+#: editor_routes.cc:126
+msgid "RS"
+msgstr ""
+
+#: editor_routes.cc:208
 msgid "SS"
 msgstr ""
 
-#: editor_routes.cc:206
+#: editor_routes.cc:233
 msgid "Track/Bus Name"
 msgstr ""
 
-#: editor_routes.cc:207
+#: editor_routes.cc:234
 msgid "Track/Bus visible ?"
 msgstr ""
 
-#: editor_routes.cc:208 mixer_strip.cc:2046 meter_strip.cc:371
-#: route_time_axis.cc:105 route_time_axis.cc:2701
-msgid "A"
-msgstr ""
-
-#: editor_routes.cc:208
+#: editor_routes.cc:235
 msgid "Track/Bus active ?"
 msgstr ""
 
-#: editor_routes.cc:209 mixer_strip.cc:2033 mixer_strip.cc:2054
-#: meter_strip.cc:379
-msgid "I"
+#: editor_routes.cc:236
+msgid "MidiInput|I"
 msgstr ""
 
-#: editor_routes.cc:209
+#: editor_routes.cc:236
 msgid "MIDI input enabled"
 msgstr ""
 
-#: editor_routes.cc:210 mono_panner.cc:220 panner2d.cc:241
-#: stereo_panner.cc:249 stereo_panner.cc:276
-msgid "R"
+#: editor_routes.cc:237
+msgid "Rec|R"
 msgstr ""
 
-#: editor_routes.cc:210
+#: editor_routes.cc:237
 msgid "Record enabled"
 msgstr ""
 
-#: editor_routes.cc:211
-msgid "Muted"
+#: editor_routes.cc:238
+msgid "Rec|RS"
 msgstr ""
 
-#: editor_routes.cc:212 mixer_strip.cc:2042 meter_strip.cc:367
-#: route_time_axis.cc:2710
-msgid "S"
+#: editor_routes.cc:238
+msgid "Record Safe"
+msgstr ""
+
+#: editor_routes.cc:239
+msgid "Muted"
 msgstr ""
 
-#: editor_routes.cc:212
+#: editor_routes.cc:240
 msgid "Soloed"
 msgstr ""
 
-#: editor_routes.cc:213
-msgid "SI"
+#: editor_routes.cc:241
+msgid "SoloIso|SI"
 msgstr ""
 
-#: editor_routes.cc:213
+#: editor_routes.cc:241
 msgid "Solo Isolated"
 msgstr ""
 
-#: editor_routes.cc:214
+#: editor_routes.cc:242
+msgid "SoloLock|SS"
+msgstr ""
+
+#: editor_routes.cc:242
 msgid "Solo Safe (Locked)"
 msgstr ""
 
-#: editor_routes.cc:477 mixer_ui.cc:1197
+#: editor_routes.cc:550 mixer_ui.cc:1498
 msgid "Hide All"
 msgstr "Ukryj wszystko"
 
-#: editor_routes.cc:478 mixer_ui.cc:1198
+#: editor_routes.cc:551 mixer_ui.cc:1499
 msgid "Show All Audio Tracks"
 msgstr "Wyświetl wszystkie ścieżki audio"
 
-#: editor_routes.cc:479 mixer_ui.cc:1199
+#: editor_routes.cc:552 mixer_ui.cc:1500
 msgid "Hide All Audio Tracks"
 msgstr "Ukryj wszystkie ścieżki audio"
 
-#: editor_routes.cc:480 mixer_ui.cc:1200
+#: editor_routes.cc:553 mixer_ui.cc:1501
 msgid "Show All Audio Busses"
 msgstr "Wyświetl wszystkie szyny audio"
 
-#: editor_routes.cc:481 mixer_ui.cc:1201
+#: editor_routes.cc:554 mixer_ui.cc:1502
 msgid "Hide All Audio Busses"
 msgstr "Ukryj wszystkie szyny audio"
 
-#: editor_routes.cc:482
+#: editor_routes.cc:555 mixer_ui.cc:1503
 msgid "Show All Midi Tracks"
 msgstr ""
 
-#: editor_routes.cc:483
+#: editor_routes.cc:556 mixer_ui.cc:1504
 msgid "Hide All Midi Tracks"
 msgstr ""
 
-#: editor_routes.cc:484
-msgid "Show Tracks With Regions Under Playhead"
+#: editor_routes.cc:557
+msgid "Only Show Tracks with Regions Under Playhead"
 msgstr ""
 
-#: editor_rulers.cc:211
+#: editor_rulers.cc:212
 msgid "New location marker"
 msgstr "Nowy znacznik położenia"
 
-#: editor_rulers.cc:212
+#: editor_rulers.cc:213
 msgid "Clear all locations"
 msgstr "Wyczyść wszystkie położenia"
 
-#: editor_rulers.cc:213
+#: editor_rulers.cc:214
 msgid "Unhide locations"
 msgstr "Wyświetl położenia"
 
-#: editor_rulers.cc:217
+#: editor_rulers.cc:218
 msgid "New range"
 msgstr ""
 
-#: editor_rulers.cc:218
+#: editor_rulers.cc:219
 msgid "Clear all ranges"
 msgstr "Wyczyść wszystkie zakresy"
 
-#: editor_rulers.cc:219
+#: editor_rulers.cc:220
 msgid "Unhide ranges"
 msgstr "Wyświetl zakresy"
 
 #: editor_rulers.cc:224
-msgid "Make Loop range"
+msgid "New Loop range"
 msgstr ""
 
 #: editor_rulers.cc:225
-msgid "Make Punch range"
+msgid "New Punch range"
 msgstr ""
 
 #: editor_rulers.cc:230
 msgid "New CD track marker"
 msgstr "Nowy znacznik zakresu (ścieżka CD)"
 
-#: editor_rulers.cc:235 tempo_dialog.cc:38
+#: editor_rulers.cc:234 tempo_dialog.cc:38
 msgid "New Tempo"
 msgstr "Nowe tempo"
 
-#: editor_rulers.cc:239 tempo_dialog.cc:296
+#: editor_rulers.cc:238 tempo_dialog.cc:419
 msgid "New Meter"
 msgstr "Nowe metrum"
 
-#: editor_snapshots.cc:137
+#: editor_snapshots.cc:149
 msgid "Rename Snapshot"
 msgstr ""
 
-#: editor_snapshots.cc:139
+#: editor_snapshots.cc:151
 msgid "New name of snapshot"
 msgstr "Nazwa zrzutu"
 
-#: editor_snapshots.cc:157
+#: editor_snapshots.cc:169
 msgid ""
 "Do you really want to remove snapshot \"%1\" ?\n"
 "(which cannot be undone)"
 msgstr ""
 
-#: editor_snapshots.cc:162
+#: editor_snapshots.cc:174
 msgid "Remove snapshot"
 msgstr ""
 
-#: editor_tempodisplay.cc:194 editor_tempodisplay.cc:234
-msgid "add"
-msgstr "dodaj"
-
-#: editor_tempodisplay.cc:215
+#: editor_tempodisplay.cc:318
 msgid "add tempo mark"
 msgstr "dodaj znacznik tempa"
 
-#: editor_tempodisplay.cc:254
+#: editor_tempodisplay.cc:343
+msgid "add"
+msgstr "dodaj"
+
+#: editor_tempodisplay.cc:362
 msgid "add meter mark"
 msgstr "dodaj oznaczenie metrum"
 
-#: editor_tempodisplay.cc:287 editor_tempodisplay.cc:315
+#: editor_tempodisplay.cc:401 editor_tempodisplay.cc:435
 msgid "done"
 msgstr "ukończono"
 
-#: editor_tempodisplay.cc:304 editor_tempodisplay.cc:330
+#: editor_tempodisplay.cc:422
+msgid "replace meter mark"
+msgstr ""
+
+#: editor_tempodisplay.cc:454
 msgid "replace tempo mark"
 msgstr "zamień znacznik tempa"
 
-#: editor_tempodisplay.cc:353 editor_tempodisplay.cc:387
+#: editor_tempodisplay.cc:485 editor_tempodisplay.cc:519
 msgid "remove tempo mark"
 msgstr "usuń znacznik tempa"
 
-#: editor_tempodisplay.cc:370
+#: editor_tempodisplay.cc:502
 msgid ""
 "programming error: meter marker canvas item has no marker object pointer!"
 msgstr ""
@@ -5702,330 +6403,383 @@ msgstr ""
 msgid "stretch/shrink"
 msgstr ""
 
-#: editor_timefx.cc:129
+#: editor_timefx.cc:130
 msgid "pitch shift"
 msgstr ""
 
-#: editor_timefx.cc:301
+#: editor_timefx.cc:282
 msgid "timefx cannot be started - thread creation error"
 msgstr ""
 
-#: engine_dialog.cc:83
+#: engine_dialog.cc:86
 msgid "Device Control Panel"
 msgstr ""
 
-#: engine_dialog.cc:84
+#: engine_dialog.cc:87
 msgid "Midi Device Setup"
 msgstr ""
 
-#: engine_dialog.cc:85 engine_dialog.cc:2097
+#: engine_dialog.cc:89
+msgid "Refresh Devices"
+msgstr ""
+
+#: engine_dialog.cc:90
+msgid "Use Buffered I/O"
+msgstr ""
+
+#: engine_dialog.cc:91 engine_dialog.cc:3000
 msgid "Measure"
 msgstr ""
 
-#: engine_dialog.cc:86
+#: engine_dialog.cc:92
 msgid "Use results"
 msgstr ""
 
-#: engine_dialog.cc:87
+#: engine_dialog.cc:93
 msgid "Back to settings ... (ignore results)"
 msgstr ""
 
-#: engine_dialog.cc:88
+#: engine_dialog.cc:94
 msgid "Calibrate Audio"
 msgstr ""
 
-#: engine_dialog.cc:92
+#: engine_dialog.cc:98
 msgid "Back to settings"
 msgstr ""
 
-#: engine_dialog.cc:111
+#: engine_dialog.cc:120
 msgid ""
 "No audio/MIDI backends detected. %1 cannot run\n"
 "\n"
 "(This is a build/packaging/system error. It should never happen.)"
 msgstr ""
 
-#: engine_dialog.cc:137
+#: engine_dialog.cc:145
 msgid "Latency Measurement Tool"
 msgstr ""
 
-#: engine_dialog.cc:149
+#: engine_dialog.cc:157
 msgid ""
 "<span weight=\"bold\">Turn down the volume on your audio equipment to a very "
 "low level.</span>"
 msgstr ""
 
-#: engine_dialog.cc:158
+#: engine_dialog.cc:166
 msgid "Select two channels below and connect them using a cable."
 msgstr ""
 
-#: engine_dialog.cc:163
+#: engine_dialog.cc:171
 msgid "Output channel"
 msgstr ""
 
-#: engine_dialog.cc:171
+#: engine_dialog.cc:179
 msgid "Input channel"
 msgstr ""
 
-#: engine_dialog.cc:206
+#: engine_dialog.cc:213
 msgid "Once the channels are connected, click the \"Measure\" button."
 msgstr ""
 
-#: engine_dialog.cc:213
+#: engine_dialog.cc:220
 msgid "When satisfied with the results, click the \"Use results\" button."
 msgstr ""
 
-#: engine_dialog.cc:228 engine_dialog.cc:2217 engine_dialog.cc:2227
+#: engine_dialog.cc:235 engine_dialog.cc:3138 engine_dialog.cc:3148
 msgid "No measurement results yet"
 msgstr ""
 
-#: engine_dialog.cc:238 route_params_ui.cc:106
+#: engine_dialog.cc:245 route_params_ui.cc:106
 msgid "Latency"
 msgstr "Opóźnienie"
 
-#: engine_dialog.cc:372
+#: engine_dialog.cc:520
 msgid "Audio System:"
 msgstr ""
 
-#: engine_dialog.cc:409
+#: engine_dialog.cc:564
 msgid "Driver:"
 msgstr ""
 
-#: engine_dialog.cc:415
+#: engine_dialog.cc:571
+msgid "Input Device:"
+msgstr ""
+
+#: engine_dialog.cc:575
+msgid "Output Device:"
+msgstr ""
+
+#: engine_dialog.cc:582
 msgid "Device:"
 msgstr ""
 
-#: engine_dialog.cc:420 engine_dialog.cc:519 sfdb_ui.cc:153 sfdb_ui.cc:348
-#: sfdb_ui.cc:353
+#: engine_dialog.cc:591 engine_dialog.cc:699 export_report.cc:164
+#: export_report.cc:328 sfdb_ui.cc:153 sfdb_ui.cc:348 sfdb_ui.cc:353
 msgid "Sample rate:"
 msgstr "Częstotliwość próbkowania:"
 
-#: engine_dialog.cc:426 engine_dialog.cc:526
+#: engine_dialog.cc:597 engine_dialog.cc:706
 msgid "Buffer size:"
 msgstr ""
 
-#: engine_dialog.cc:444
+#: engine_dialog.cc:606
+msgid "Periods:"
+msgstr ""
+
+#: engine_dialog.cc:624
 msgid "Input Channels:"
 msgstr ""
 
-#: engine_dialog.cc:457
+#: engine_dialog.cc:637
 msgid "Output Channels:"
 msgstr ""
 
-#: engine_dialog.cc:469
+#: engine_dialog.cc:649
 msgid "Hardware input latency:"
 msgstr ""
 
-#: engine_dialog.cc:472 engine_dialog.cc:485
+#: engine_dialog.cc:652 engine_dialog.cc:665
 msgid "samples"
 msgstr ""
 
-#: engine_dialog.cc:482
+#: engine_dialog.cc:662
 msgid "Hardware output latency:"
 msgstr ""
 
-#: engine_dialog.cc:493
+#: engine_dialog.cc:673
 msgid "MIDI System:"
 msgstr ""
 
-#: engine_dialog.cc:511
+#: engine_dialog.cc:691
 msgid ""
-"The %1 audio backend was configured and started externally.\n"
-"This limits your control over it."
+"%1 is already running. %2 will connect to it and use the existing settings."
 msgstr ""
 
-#: engine_dialog.cc:564
+#: engine_dialog.cc:744
 msgid ""
 "Failed to start or connect to audio-engine.\n"
 "\n"
 "Latency calibration requires a working audio interface."
 msgstr ""
 
-#: engine_dialog.cc:570
+#: engine_dialog.cc:750
 msgid ""
 "Your selected audio configuration is playback- or capture-only.\n"
 "\n"
 "Latency calibration requires playback and capture"
 msgstr ""
 
-#: engine_dialog.cc:651
+#: engine_dialog.cc:965
 msgid "MIDI Devices"
 msgstr ""
 
-#: engine_dialog.cc:657
+#: engine_dialog.cc:971
 msgid "Device"
 msgstr "UrzÄ…dzenie"
 
-#: engine_dialog.cc:659
+#: engine_dialog.cc:973
 msgid "Hardware Latencies"
 msgstr ""
 
-#: engine_dialog.cc:700
+#: engine_dialog.cc:1014
 msgid "Calibrate"
 msgstr ""
 
-#: engine_dialog.cc:800
+#: engine_dialog.cc:1117
 msgid "all available channels"
 msgstr ""
 
-#: engine_dialog.cc:1039 latency_gui.cc:39
-msgid "sample"
-msgid_plural "samples"
+#: engine_dialog.cc:1599 latency_gui.cc:55
+msgid "%1 sample"
+msgid_plural "%1 samples"
 msgstr[0] ""
 msgstr[1] ""
 msgstr[2] ""
 
-#: engine_dialog.cc:1090
+#: engine_dialog.cc:1662
 #, c-format
 msgid "(%.1f ms)"
 msgstr ""
 
-#: engine_dialog.cc:1593
+#: engine_dialog.cc:2413
 msgid "Could not start backend engine %1"
 msgstr ""
 
-#: engine_dialog.cc:1644
+#: engine_dialog.cc:2445
 msgid "Cannot set driver to %1"
 msgstr ""
 
-#: engine_dialog.cc:1648
+#: engine_dialog.cc:2450
+msgid "Cannot set input device name to %1"
+msgstr ""
+
+#: engine_dialog.cc:2454
+msgid "Cannot set output device name to %1"
+msgstr ""
+
+#: engine_dialog.cc:2459
 msgid "Cannot set device name to %1"
 msgstr ""
 
-#: engine_dialog.cc:1652
+#: engine_dialog.cc:2464
 msgid "Cannot set sample rate to %1"
 msgstr ""
 
-#: engine_dialog.cc:1656
+#: engine_dialog.cc:2468
 msgid "Cannot set buffer size to %1"
 msgstr ""
 
-#: engine_dialog.cc:1662
+#: engine_dialog.cc:2472
+msgid "Cannot set periods to %1"
+msgstr ""
+
+#: engine_dialog.cc:2478
 msgid "Cannot set input channels to %1"
 msgstr ""
 
-#: engine_dialog.cc:1666
+#: engine_dialog.cc:2482
 msgid "Cannot set output channels to %1"
 msgstr ""
 
-#: engine_dialog.cc:1672
+#: engine_dialog.cc:2488
 msgid "Cannot set input latency to %1"
 msgstr ""
 
-#: engine_dialog.cc:1676
+#: engine_dialog.cc:2492
 msgid "Cannot set output latency to %1"
 msgstr ""
 
-#: engine_dialog.cc:1955 engine_dialog.cc:2014
+#: engine_dialog.cc:2851 engine_dialog.cc:2917
 msgid "No signal detected "
 msgstr ""
 
-#: engine_dialog.cc:1968 engine_dialog.cc:2022 port_insert_ui.cc:70
+#: engine_dialog.cc:2858
+msgid ""
+"Input signal is > -3dBFS. Lower the signal level (output gain, input gain) "
+"on the audio-interface."
+msgstr ""
+
+#: engine_dialog.cc:2871 engine_dialog.cc:2925 port_insert_ui.cc:70
 #: port_insert_ui.cc:98
 msgid "Disconnected from audio engine"
 msgstr ""
 
-#: engine_dialog.cc:1977 engine_dialog.cc:2030
+#: engine_dialog.cc:2880 engine_dialog.cc:2933
 msgid "Detected roundtrip latency: "
 msgstr ""
 
-#: engine_dialog.cc:1979 engine_dialog.cc:2032
+#: engine_dialog.cc:2882 engine_dialog.cc:2935
 msgid "Systemic latency: "
 msgstr ""
 
-#: engine_dialog.cc:1986
+#: engine_dialog.cc:2889
 msgid "(signal detection error)"
 msgstr ""
 
-#: engine_dialog.cc:1992
+#: engine_dialog.cc:2895
 msgid "(inverted - bad wiring)"
 msgstr ""
 
-#: engine_dialog.cc:2039
+#: engine_dialog.cc:2942
 msgid "(averaging)"
 msgstr ""
 
-#: engine_dialog.cc:2045
+#: engine_dialog.cc:2948
 msgid "(too large jitter)"
 msgstr ""
 
-#: engine_dialog.cc:2049
+#: engine_dialog.cc:2952
 msgid "(large jitter)"
 msgstr ""
 
-#: engine_dialog.cc:2061
+#: engine_dialog.cc:2964
 msgid "Timeout - large MIDI jitter."
 msgstr ""
 
-#: engine_dialog.cc:2077 port_insert_ui.cc:134
+#: engine_dialog.cc:2980 port_insert_ui.cc:134
 msgid "Detecting ..."
 msgstr ""
 
-#: engine_dialog.cc:2171
+#: engine_dialog.cc:3081
 msgid "Disconnect from %1"
 msgstr ""
 
-#: engine_dialog.cc:2175 mixer_strip.cc:1522 route_group_dialog.cc:45
-#: route_time_axis.cc:841
-msgid "Active"
-msgstr "Aktywne"
+#: engine_dialog.cc:3086
+msgid "Running"
+msgstr ""
+
+#: engine_dialog.cc:3088
+msgid "Connected"
+msgstr ""
 
-#: engine_dialog.cc:2185
+#: engine_dialog.cc:3099
 msgid "Connect to %1"
 msgstr ""
 
-#: engine_dialog.cc:2190
-msgid "Inactive"
+#: engine_dialog.cc:3103 shuttle_control.cc:655
+msgid "Stopped"
 msgstr ""
 
-#: export_channel_selector.cc:45 sfdb_ui.cc:151
+#: export_channel_selector.cc:46 export_report.cc:159 export_report.cc:324
+#: sfdb_ui.cc:151
 msgid "Channels:"
 msgstr "Kanały:"
 
-#: export_channel_selector.cc:46
+#: export_channel_selector.cc:47
 msgid "Split to mono files"
 msgstr ""
 
-#: export_channel_selector.cc:182
+#: export_channel_selector.cc:197
 msgid "Bus or Track"
 msgstr ""
 
-#: export_channel_selector.cc:459
+#: export_channel_selector.cc:474
 msgid "Region contents without fades nor region gain (channels: %1)"
 msgstr ""
 
-#: export_channel_selector.cc:463
+#: export_channel_selector.cc:478
 msgid "Region contents with fades and region gain (channels: %1)"
 msgstr ""
 
-#: export_channel_selector.cc:467
+#: export_channel_selector.cc:482
 msgid "Track output (channels: %1)"
 msgstr ""
 
-#: export_channel_selector.cc:536
-msgid "Export region contents"
+#: export_channel_selector.cc:552
+msgid "Apply track/bus processing"
+msgstr ""
+
+#: export_channel_selector.cc:553
+msgid "Select all tracks"
+msgstr ""
+
+#: export_channel_selector.cc:554
+msgid "Select all busses"
+msgstr ""
+
+#: export_channel_selector.cc:555
+msgid "Deselect all"
 msgstr ""
 
-#: export_channel_selector.cc:537
-msgid "Export track output"
+#: export_channel_selector.cc:589
+msgid "Track name"
 msgstr ""
 
-#: export_dialog.cc:46
+#: export_dialog.cc:48
 msgid ""
 "<span color=\"#ffa755\">Some already existing files will be overwritten.</"
 "span>"
 msgstr ""
 
-#: export_dialog.cc:47
+#: export_dialog.cc:49
 msgid "List files"
 msgstr ""
 
-#: export_dialog.cc:158 export_format_dialog.cc:59
+#: export_dialog.cc:158 export_format_dialog.cc:67
 msgid "File format"
 msgstr ""
 
-#: export_dialog.cc:159 export_timespan_selector.cc:374
-#: export_timespan_selector.cc:436
+#: export_dialog.cc:159 export_timespan_selector.cc:371
+#: export_timespan_selector.cc:433
 msgid "Time Span"
 msgstr ""
 
@@ -6051,45 +6805,57 @@ msgstr ""
 msgid "Stop Export"
 msgstr "Zatrzymaj eksport"
 
-#: export_dialog.cc:327
+#: export_dialog.cc:336
 msgid "export"
 msgstr ""
 
-#: export_dialog.cc:346
+#: export_dialog.cc:355
+msgid "Exporting '%3' (timespan %1 of %2)"
+msgstr ""
+
+#: export_dialog.cc:360
 msgid "Normalizing '%3' (timespan %1 of %2)"
 msgstr ""
 
-#: export_dialog.cc:350
-msgid "Exporting '%3' (timespan %1 of %2)"
+#: export_dialog.cc:365
+msgid "Tagging '%3' (timespan %1 of %2)"
+msgstr ""
+
+#: export_dialog.cc:369
+msgid "Uploading '%3' (timespan %1 of %2)"
+msgstr ""
+
+#: export_dialog.cc:373
+msgid "Running Post Export Command for '%1'"
 msgstr ""
 
-#: export_dialog.cc:373 export_dialog.cc:375
+#: export_dialog.cc:401 export_dialog.cc:403
 msgid "<span color=\"#ffa755\">Error: "
 msgstr ""
 
-#: export_dialog.cc:385
+#: export_dialog.cc:413
 msgid "<span color=\"#ffa755\">Warning: "
 msgstr ""
 
-#: export_dialog.cc:387
+#: export_dialog.cc:415
 msgid ""
 "\n"
 "<span color=\"#ffa755\">Warning: "
 msgstr ""
 
-#: export_dialog.cc:411
+#: export_dialog.cc:439
 msgid "Export Selection"
 msgstr ""
 
-#: export_dialog.cc:425
+#: export_dialog.cc:453
 msgid "Export Region"
 msgstr "Eksportuj obszar"
 
-#: export_dialog.cc:434
+#: export_dialog.cc:462
 msgid "Source"
 msgstr ""
 
-#: export_dialog.cc:450
+#: export_dialog.cc:478
 msgid "Stem Export"
 msgstr ""
 
@@ -6097,172 +6863,246 @@ msgstr ""
 msgid "Add another format"
 msgstr ""
 
-#: export_file_notebook.cc:193
+#: export_file_notebook.cc:198
 msgid "Format"
 msgstr "Format"
 
-#: export_file_notebook.cc:194
+#: export_file_notebook.cc:199
 msgid "Location"
 msgstr "Położenie"
 
-#: export_file_notebook.cc:195
+#: export_file_notebook.cc:200
 msgid "Upload to Soundcloud"
 msgstr ""
 
-#: export_file_notebook.cc:273
+#: export_file_notebook.cc:201
+msgid "Analyze Exported Audio"
+msgstr ""
+
+#: export_file_notebook.cc:286
 msgid "No format!"
 msgstr ""
 
-#: export_file_notebook.cc:291
+#: export_file_notebook.cc:304
 msgid "Format %1: %2"
 msgstr ""
 
-#: export_filename_selector.cc:32
+#: export_filename_selector.cc:33
 msgid "Label:"
 msgstr ""
 
-#: export_filename_selector.cc:33
+#: export_filename_selector.cc:34 session_dialog.cc:310
 msgid "Session Name"
 msgstr ""
 
-#: export_filename_selector.cc:34
-msgid "Revision:"
+#: export_filename_selector.cc:35
+msgid "Timespan Name"
 msgstr ""
 
 #: export_filename_selector.cc:36
+msgid "Revision:"
+msgstr ""
+
+#: export_filename_selector.cc:38
 msgid "Folder:"
 msgstr ""
 
-#: export_filename_selector.cc:37 session_import_dialog.cc:45
+#: export_filename_selector.cc:39 session_import_dialog.cc:45
 #: transcode_video_dialog.cc:59 video_server_dialog.cc:54
-#: video_server_dialog.cc:56 export_video_dialog.cc:81
-#: export_video_dialog.cc:83
+#: video_server_dialog.cc:56 export_video_dialog.cc:77
+#: export_video_dialog.cc:79
 msgid "Browse"
 msgstr "PrzeglÄ…daj"
 
-#: export_filename_selector.cc:41
-msgid "<i>Build filename(s) from these components:</i>"
+#: export_filename_selector.cc:40 export_report.cc:118
+msgid "Open Folder"
+msgstr ""
+
+#: export_filename_selector.cc:45
+msgid "Build filename(s) from these components:"
 msgstr ""
 
-#: export_filename_selector.cc:212
+#: export_filename_selector.cc:217
 msgid ""
 "<small><i>Sorry, no example filename can be shown at the moment</i></small>"
 msgstr ""
 
-#: export_filename_selector.cc:214
-msgid "<small><i>Current (approximate) filename: \"%1\"</i></small>"
+#: export_filename_selector.cc:219
+msgid "<i>Current (approximate) filename</i>: \"%1\""
 msgstr ""
 
-#: export_filename_selector.cc:250 export_filename_selector.cc:336
+#: export_filename_selector.cc:255 export_filename_selector.cc:402
 msgid ""
 "%1: this is only the directory/folder name, not the filename.\n"
 "The filename will be chosen from the information just above the folder "
 "selector."
 msgstr ""
 
-#: export_filename_selector.cc:322
+#: export_filename_selector.cc:378
+msgid "%1: this is not a valid directory/folder."
+msgstr ""
+
+#: export_filename_selector.cc:388
 msgid "Choose export folder"
 msgstr ""
 
-#: export_format_dialog.cc:31
+#: export_format_dialog.cc:32
 msgid "New Export Format Profile"
 msgstr ""
 
-#: export_format_dialog.cc:31
+#: export_format_dialog.cc:32
 msgid "Edit Export Format Profile"
 msgstr ""
 
-#: export_format_dialog.cc:38
+#: export_format_dialog.cc:39
 msgid "Label: "
 msgstr ""
 
-#: export_format_dialog.cc:41 normalize_dialog.cc:42
-msgid "Normalize to:"
+#: export_format_dialog.cc:42
+msgid "Normalize:"
 msgstr ""
 
-#: export_format_dialog.cc:46
-msgid "Trim silence at start"
+#: export_format_dialog.cc:43
+msgid "Peak"
 msgstr ""
 
-#: export_format_dialog.cc:47
-msgid "Add silence at start:"
+#: export_format_dialog.cc:44
+msgid "Loudness"
 msgstr ""
 
 #: export_format_dialog.cc:50
-msgid "Trim silence at end"
+msgid "LUFS"
 msgstr ""
 
 #: export_format_dialog.cc:51
-msgid "Add silence at end:"
+msgid "dBTP"
 msgstr ""
 
 #: export_format_dialog.cc:54
-msgid ""
-"Command to run post-export\n"
-"(%f=full path & filename, %d=directory, %b=basename):"
+msgid "Trim silence at start"
 msgstr ""
 
-#: export_format_dialog.cc:57
-msgid "Compatibility"
+#: export_format_dialog.cc:55
+msgid "Add silence at start:"
 msgstr ""
 
 #: export_format_dialog.cc:58
+msgid "Trim silence at end"
+msgstr ""
+
+#: export_format_dialog.cc:59
+msgid "Add silence at end:"
+msgstr ""
+
+#: export_format_dialog.cc:62
+msgid ""
+"Command to run post-export\n"
+"(%f=file path, %d=directory, %b=basename, see tooltip for more):"
+msgstr ""
+
+#: export_format_dialog.cc:65
+msgid "Compatibility"
+msgstr ""
+
+#: export_format_dialog.cc:66
 msgid "Quality"
 msgstr ""
 
-#: export_format_dialog.cc:61
+#: export_format_dialog.cc:69
 msgid "Sample rate conversion quality:"
 msgstr ""
 
-#: export_format_dialog.cc:68
+#: export_format_dialog.cc:76
 msgid "Dithering"
 msgstr ""
 
-#: export_format_dialog.cc:70
+#: export_format_dialog.cc:78
 msgid "Create CUE file for disk-at-once CD/DVD creation"
 msgstr ""
 
-#: export_format_dialog.cc:71
+#: export_format_dialog.cc:79
 msgid "Create TOC file for disk-at-once CD/DVD creation"
 msgstr ""
 
-#: export_format_dialog.cc:73
+#: export_format_dialog.cc:80
+msgid "Create chapter mark file for MP4 chapter marks"
+msgstr ""
+
+#: export_format_dialog.cc:82
 msgid "Tag file with session's metadata"
 msgstr ""
 
-#: export_format_dialog.cc:470
+#: export_format_dialog.cc:119
+msgid "∧"
+msgstr ""
+
+#: export_format_dialog.cc:124
+msgid ""
+"Normalize to EBU-R128 LUFS target loudness without exceeding the given true-"
+"peak limit. EBU-R128 normalization is only available for mono and stereo "
+"targets, true-peak works for any channel layout."
+msgstr ""
+
+#: export_format_dialog.cc:152
+msgid ""
+"%a Artist name\n"
+"%b File's base-name\n"
+"%c Copyright\n"
+"%d File's directory\n"
+"%f File's full absolute path\n"
+"%l Lyricist\n"
+"%n Session name\n"
+"%o Conductor\n"
+"%t Title\n"
+"%z Organization\n"
+"%A Album\n"
+"%C Comment\n"
+"%E Engineer\n"
+"%G Genre\n"
+"%L Total track count\n"
+"%M Mixer\n"
+"%N Timespan name\n"
+"%O Composer\n"
+"%P Producer\n"
+"%S Disc subtitle\n"
+"%T Track number\n"
+"%Y Year\n"
+"%Z Country"
+msgstr ""
+
+#: export_format_dialog.cc:537
 msgid "Best (sinc)"
 msgstr ""
 
-#: export_format_dialog.cc:475
+#: export_format_dialog.cc:542
 msgid "Medium (sinc)"
 msgstr ""
 
-#: export_format_dialog.cc:480
+#: export_format_dialog.cc:547
 msgid "Fast (sinc)"
 msgstr ""
 
-#: export_format_dialog.cc:490
+#: export_format_dialog.cc:557
 msgid "Zero order hold"
 msgstr ""
 
-#: export_format_dialog.cc:895
+#: export_format_dialog.cc:981
 msgid "Linear encoding options"
 msgstr ""
 
-#: export_format_dialog.cc:911
+#: export_format_dialog.cc:997
 msgid "Ogg Vorbis options"
 msgstr ""
 
-#: export_format_dialog.cc:922
+#: export_format_dialog.cc:1008
 msgid "FLAC options"
 msgstr ""
 
-#: export_format_dialog.cc:939
+#: export_format_dialog.cc:1025
 msgid "Broadcast Wave options"
 msgstr ""
 
-#: export_format_selector.cc:136
+#: export_format_selector.cc:131
 msgid "Do you really want to remove the format?"
 msgstr ""
 
@@ -6270,29 +7110,200 @@ msgstr ""
 msgid "Preset"
 msgstr ""
 
-#: export_preset_selector.cc:104
+#: export_preset_selector.cc:99
 msgid ""
 "The selected preset did not load successfully!\n"
 "Perhaps it references a format that has been removed?"
 msgstr ""
 
-#: export_preset_selector.cc:156
+#: export_preset_selector.cc:151
 msgid "Do you really want to remove this preset?"
 msgstr ""
 
-#: export_timespan_selector.cc:46
+#: export_report.cc:56
+msgid "Export Report/Analysis"
+msgstr ""
+
+#: export_report.cc:147 export_report.cc:327 sfdb_ui.cc:149
+msgid "Format:"
+msgstr "Format:"
+
+#: export_report.cc:166 export_report.cc:328
+msgid "%1 Hz"
+msgstr ""
+
+#: export_report.cc:169 export_report.cc:336 transcode_video_dialog.cc:139
+msgid "Duration:"
+msgstr ""
+
+#: export_report.cc:177 export_report.cc:334
+msgid "Timecode:"
+msgstr ""
+
+#: export_report.cc:185
+msgid "Error:"
+msgstr ""
+
+#: export_report.cc:220 export_report.cc:440
+msgid "(too short integration time)"
+msgstr ""
+
+#: export_report.cc:222
+msgid "-888"
+msgstr ""
+
+#: export_report.cc:227 export_report.cc:353
+msgid "Peak:"
+msgstr ""
+
+#: export_report.cc:228 export_report.cc:360
+msgid "%1 dBFS"
+msgstr ""
+
+#: export_report.cc:229 export_report.cc:369
+msgid "True Peak:"
+msgstr ""
+
+#: export_report.cc:230 export_report.cc:376
+msgid "%1 dBTP"
+msgstr ""
+
+#: export_report.cc:231 export_report.cc:387
+msgid "Normalization Gain:"
+msgstr ""
+
+#: export_report.cc:232
+msgid "+888.88 dB"
+msgstr ""
+
+#: export_report.cc:234 export_report.cc:448
+msgid "Integrated Loudness:"
+msgstr ""
+
+#: export_report.cc:235 export_report.cc:454
+msgid "%1 LUFS"
+msgstr ""
+
+#: export_report.cc:236 export_report.cc:460
+msgid "Loudness Range:"
+msgstr ""
+
+#: export_report.cc:237 export_report.cc:466
+msgid "%1 LU"
+msgstr ""
+
+#: export_report.cc:247 export_report.cc:754
+msgid "100"
+msgstr ""
+
+#: export_report.cc:282 export_report.cc:650
+msgid "00:00:00.000"
+msgstr ""
+
+#: export_report.cc:288
+msgid "0|A8"
+msgstr ""
+
+#: export_report.cc:394
+msgid "%1 dB"
+msgstr ""
+
+#: export_report.cc:425 export_report.cc:433 export_report.cc:553
+msgid ""
+"Not\n"
+"Available"
+msgstr ""
+
+#: export_report.cc:493
+msgid ""
+"LUFS\n"
+"(short)"
+msgstr ""
+
+#: export_report.cc:503
+msgid "Multiplicity"
+msgstr ""
+
+#: export_report.cc:603
+msgid "Logscale|Lg"
+msgstr ""
+
+#: export_report.cc:604
+msgid "Rectified|Rf"
+msgstr ""
+
+#: export_report.cc:605
+msgid "Logscale"
+msgstr ""
+
+#: export_report.cc:606
+msgid "Rectified"
+msgstr ""
+
+#: export_report.cc:738
+msgid "Hz"
+msgstr ""
+
+#: export_report.cc:755
+msgid "500"
+msgstr ""
+
+#: export_report.cc:756
+msgid "1K"
+msgstr ""
+
+#: export_report.cc:757
+msgid "5K"
+msgstr ""
+
+#: export_report.cc:758
+msgid "10K"
+msgstr ""
+
+#: export_report.cc:844
+msgid "Writing Export Analysis Image: %1."
+msgstr ""
+
+#: export_report.cc:941 sfdb_ui.cc:293 sfdb_ui.cc:409
+msgid "Could not read file: %1 (%2)."
+msgstr "Nie można odczytać pliku: %1 (%2)."
+
+#: export_report.cc:967 sfdb_ui.cc:458
+msgid "Could not access soundfile: "
+msgstr "Nie można uzyskać dostępu do pliku:"
+
+#: export_report.cc:1203
+msgid "-36"
+msgstr ""
+
+#: export_report.cc:1204 export_report.cc:1208 export_report.cc:1214
+#: export_report.cc:1217
+msgid "-18"
+msgstr ""
+
+#: export_report.cc:1205 export_report.cc:1209 export_report.cc:1215
+#: export_report.cc:1218 export_report.cc:1221 export_report.cc:1222
+msgid "-9"
+msgstr ""
+
+#: export_report.cc:1206 export_report.cc:1210 export_report.cc:1216
+#: export_report.cc:1219 export_report.cc:1223 export_report.cc:1224
+msgid "-3"
+msgstr ""
+
+#: export_timespan_selector.cc:44
 msgid "Show Times as:"
 msgstr ""
 
-#: export_timespan_selector.cc:53 processor_box.cc:2466
+#: export_timespan_selector.cc:51 processor_box.cc:3683
 msgid "Select All"
 msgstr "Wszystko"
 
-#: export_timespan_selector.cc:223 transform_dialog.cc:93
+#: export_timespan_selector.cc:220 transform_dialog.cc:93
 msgid " to "
 msgstr ""
 
-#: export_timespan_selector.cc:367 export_timespan_selector.cc:426
+#: export_timespan_selector.cc:364 export_timespan_selector.cc:423
 msgid "Range"
 msgstr ""
 
@@ -6308,36 +7319,39 @@ msgstr ""
 msgid "getSoundResourceFile: root = %1, != response"
 msgstr ""
 
-#: sfdb_freesound_mootcher.cc:410 rc_option_editor.cc:1824
+#: sfdb_freesound_mootcher.cc:410 rc_option_editor.cc:2416
 msgid "%1"
 msgstr ""
 
-#: gain_meter.cc:132 gain_meter.cc:400 gain_meter.cc:505 gain_meter.cc:896
+#: gain_meter.cc:137 gain_meter.cc:422 gain_meter.cc:527 gain_meter.cc:919
 msgid "-inf"
 msgstr ""
 
-#: gain_meter.cc:147 gain_meter.cc:958
+#: gain_meter.cc:152 gain_meter.cc:983
 msgid "Fader automation mode"
 msgstr "Tryb automatyzacji wzmocnienia"
 
-#: gain_meter.cc:148 gain_meter.cc:959
+#: gain_meter.cc:153 gain_meter.cc:984
 msgid "Fader automation type"
 msgstr "Rodzaj automatyzacji wzmocnienia"
 
-#: gain_meter.cc:157 gain_meter.cc:829 panner_ui.cc:179 panner_ui.cc:639
+#: gain_meter.cc:162 gain_meter.cc:852 panner_ui.cc:179 panner_ui.cc:641
 msgid "Abs"
 msgstr ""
 
-#: gain_meter.cc:796 mixer_strip.cc:2049 meter_strip.cc:374 panner_ui.cc:606
-#: route_time_axis.cc:104 route_time_axis.cc:2705
+#: gain_meter.cc:816 vca_master_strip.cc:78 vca_time_axis.cc:54
+msgid "M"
+msgstr ""
+
+#: gain_meter.cc:819 vca_master_strip.cc:296
 msgid "P"
 msgstr ""
 
-#: gain_meter.cc:799 panner_ui.cc:609
+#: gain_meter.cc:822
 msgid "T"
 msgstr ""
 
-#: gain_meter.cc:802 panner_ui.cc:612
+#: gain_meter.cc:825
 msgid "W"
 msgstr ""
 
@@ -6345,46 +7359,50 @@ msgstr ""
 msgid "<span size=\"large\">Presets</span>"
 msgstr ""
 
-#: generic_pluginui.cc:97
+#: generic_pluginui.cc:98 plugin_pin_dialog.cc:333
 msgid "Manual"
 msgstr ""
 
-#: generic_pluginui.cc:106
+#: generic_pluginui.cc:107
 msgid "All Automation"
 msgstr ""
 
 #: generic_pluginui.cc:250
-msgid "Switches"
-msgstr ""
-
-#: generic_pluginui.cc:260 generic_pluginui.cc:436 processor_box.cc:2440
-msgid "Controls"
-msgstr "Sterowanie"
-
-#: generic_pluginui.cc:293
 msgid "Plugin Editor: could not build control element for port %1"
 msgstr ""
 
-#: generic_pluginui.cc:318
+#: generic_pluginui.cc:282
 msgid "Plugin Editor: no control for property %1"
 msgstr ""
 
-#: generic_pluginui.cc:324
+#: generic_pluginui.cc:288
 msgid "Plugin Editor: could not build control element for property %1"
 msgstr ""
 
-#: generic_pluginui.cc:468
+#: generic_pluginui.cc:359
+msgid "Switches"
+msgstr ""
+
+#: generic_pluginui.cc:369 generic_pluginui.cc:475 processor_box.cc:3653
+msgid "Controls"
+msgstr "Sterowanie"
+
+#: generic_pluginui.cc:510
 msgid "Meters"
 msgstr ""
 
-#: generic_pluginui.cc:490
+#: generic_pluginui.cc:548
 msgid "Automation control"
 msgstr "Kontrola automatyzacji"
 
-#: generic_pluginui.cc:497
+#: generic_pluginui.cc:555
 msgid "Mgnual"
 msgstr ""
 
+#: generic_pluginui.cc:828
+msgid "This control cannot be automated"
+msgstr ""
+
 #: global_port_matrix.cc:158
 msgid "Audio Connection Manager"
 msgstr ""
@@ -6393,126 +7411,163 @@ msgstr ""
 msgid "MIDI Connection Manager"
 msgstr ""
 
-#: global_port_matrix.cc:201 io_selector.cc:211 mixer_strip.cc:793
-#: mixer_strip.cc:894
+#: global_port_matrix.cc:201 io_selector.cc:211 mixer_strip.cc:863
+#: mixer_strip.cc:966 monitor_section.cc:1430 monitor_selector.cc:189
+#: plugin_pin_dialog.cc:1757
 msgid "Disconnect"
 msgstr "Rozłącz"
 
-#: global_port_matrix.cc:207 io_selector.cc:217
+#: global_port_matrix.cc:207 io_selector.cc:217 monitor_selector.cc:195
 msgid "port"
 msgstr ""
 
-#: group_tabs.cc:312
+#: group_tabs.cc:312 group_tabs.cc:321
 msgid "Selection..."
 msgstr ""
 
-#: group_tabs.cc:313
+#: group_tabs.cc:313 group_tabs.cc:322
 msgid "Record Enabled..."
 msgstr ""
 
-#: group_tabs.cc:314
+#: group_tabs.cc:314 group_tabs.cc:323
 msgid "Soloed..."
 msgstr ""
 
-#: group_tabs.cc:320
+#: group_tabs.cc:316
+msgid "Create New Group From..."
+msgstr ""
+
+#: group_tabs.cc:325
+msgid "Create New Group with Master From..."
+msgstr ""
+
+#: group_tabs.cc:344
 msgid "Create New Group ..."
 msgstr ""
 
-#: group_tabs.cc:321
-msgid "Create New Group From"
+#: group_tabs.cc:345
+msgid "Create New Group with Control Master ..."
 msgstr ""
 
-#: group_tabs.cc:324
+#: group_tabs.cc:355
 msgid "Edit Group..."
 msgstr ""
 
-#: group_tabs.cc:325
+#: group_tabs.cc:356
 msgid "Collect Group"
 msgstr ""
 
-#: group_tabs.cc:326
+#: group_tabs.cc:357
 msgid "Remove Group"
 msgstr ""
 
-#: group_tabs.cc:329
+#: group_tabs.cc:368
+msgid "Assign Group to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:374
 msgid "Remove Subgroup Bus"
 msgstr ""
 
-#: group_tabs.cc:331
+#: group_tabs.cc:376
 msgid "Add New Subgroup Bus"
 msgstr ""
 
-#: group_tabs.cc:333
+#: group_tabs.cc:378
 msgid "Add New Aux Bus (pre-fader)"
 msgstr ""
 
-#: group_tabs.cc:334
+#: group_tabs.cc:379
 msgid "Add New Aux Bus (post-fader)"
 msgstr ""
 
-#: group_tabs.cc:340
+#: group_tabs.cc:404
+msgid "Assign Selection to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:415
+msgid "Assign Record Enabled to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:426
+msgid "Assign Soloed to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:429
 msgid "Enable All Groups"
 msgstr ""
 
-#: group_tabs.cc:341
+#: group_tabs.cc:430
 msgid "Disable All Groups"
 msgstr ""
 
-#: insert_time_dialog.cc:46
+#: insert_remove_time_dialog.cc:52
+msgid "Time to remove"
+msgstr ""
+
+#: insert_remove_time_dialog.cc:52
 msgid "Time to insert:"
 msgstr ""
 
-#: insert_time_dialog.cc:54
+#: insert_remove_time_dialog.cc:61
 msgid "Intersected regions should:"
 msgstr ""
 
-#: insert_time_dialog.cc:57
+#: insert_remove_time_dialog.cc:64
 msgid "stay in position"
 msgstr ""
 
-#: insert_time_dialog.cc:58
+#: insert_remove_time_dialog.cc:65
 msgid "move"
 msgstr ""
 
-#: insert_time_dialog.cc:59
+#: insert_remove_time_dialog.cc:66
 msgid "be split"
 msgstr ""
 
-#: insert_time_dialog.cc:65
-msgid "Insert time on all the track's playlists"
+#: insert_remove_time_dialog.cc:73
+msgid "Apply to all the track's playlists"
 msgstr ""
 
-#: insert_time_dialog.cc:68
+#: insert_remove_time_dialog.cc:76
 msgid "Move glued regions"
 msgstr ""
 
-#: insert_time_dialog.cc:70
+#: insert_remove_time_dialog.cc:78
 msgid "Move markers"
 msgstr ""
 
-#: insert_time_dialog.cc:73
+#: insert_remove_time_dialog.cc:81
 msgid "Move glued markers"
 msgstr ""
 
-#: insert_time_dialog.cc:78
+#: insert_remove_time_dialog.cc:86
 msgid "Move locked markers"
 msgstr ""
 
-#: insert_time_dialog.cc:83
+#: insert_remove_time_dialog.cc:91
 msgid ""
 "Move tempo and meter changes\n"
 "<i>(may cause oddities in the tempo map)</i>"
 msgstr ""
 
-#: insert_time_dialog.cc:91
+#: insert_remove_time_dialog.cc:99
+msgid "Remove time"
+msgstr ""
+
+#: insert_remove_time_dialog.cc:99
 msgid "Insert time"
 msgstr ""
 
-#: instrument_selector.cc:62
+#: insert_remove_time_dialog.cc:174
+msgid "Invalid or zero duration entered. Please enter a valid duration"
+msgstr ""
+
+#: instrument_selector.cc:92
 msgid "-none-"
 msgstr ""
 
-#: interthread_progress_window.cc:103
+#: interthread_progress_window.cc:114
 msgid "Importing file: %1 of %2"
 msgstr ""
 
@@ -6520,64 +7575,89 @@ msgstr ""
 msgid "I/O selector"
 msgstr ""
 
-#: io_selector.cc:266
+#: io_selector.cc:266 monitor_selector.cc:244
 msgid "%1 input"
 msgstr "%1 wejście"
 
-#: io_selector.cc:268
+#: io_selector.cc:268 monitor_selector.cc:246
 msgid "%1 output"
 msgstr "%1 wyjście"
 
-#: keyboard.cc:70
+#: keyboard.cc:93
 msgid "your own"
 msgstr "własny"
 
-#: keyboard.cc:133 keyboard.cc:157
+#: keyboard.cc:157 keyboard.cc:181
 msgid "Default keybindings not found - %1 will be hard to use!"
 msgstr ""
 
-#: keyboard.cc:136
+#: keyboard.cc:160
 msgid "Key bindings file \"%1\" not found. Default bindings used instead"
 msgstr ""
 
-#: keyeditor.cc:54
+#: keyboard.cc:193
+msgid "Loading keybindings from %1"
+msgstr ""
+
+#: keyeditor.cc:67
+msgid "Colliding keybindings"
+msgstr ""
+
+#: keyeditor.cc:68
+msgid ""
+"The key sequence is already bound. Please remove the other binding first."
+msgstr ""
+
+#: keyeditor.cc:77
+msgid "Key Bindings"
+msgstr ""
+
+#: keyeditor.cc:78
 msgid "Remove shortcut"
 msgstr "Usuń skrót"
 
-#: keyeditor.cc:63
-msgid "Action"
-msgstr "Czynność"
+#: keyeditor.cc:80
+msgid "Search..."
+msgstr ""
 
-#: keyeditor.cc:64
-msgid "Shortcut"
-msgstr "Skrót"
+#: keyeditor.cc:82
+msgid "Print"
+msgstr ""
 
-#: keyeditor.cc:84
-msgid "Select an action, then press the key(s) to (re)set its shortcut"
+#: keyeditor.cc:93
+msgid "Click to reset search string"
 msgstr ""
 
-#: keyeditor.cc:98
-msgid "Reset Bindings to Defaults"
+#: keyeditor.cc:97
+msgid "To remove a shortcut select an action then press this: "
 msgstr ""
 
-#: keyeditor.cc:263
-msgid "Main_menu"
+#: keyeditor.cc:109
+msgid "Reset Bindings to Defaults"
 msgstr ""
 
-#: keyeditor.cc:265
-msgid "redirectmenu"
+#: keyeditor.cc:227 lua_script_manager.cc:41
+msgid "Action"
+msgstr "Czynność"
+
+#: keyeditor.cc:228
+msgid "Shortcut"
+msgstr "Skrót"
+
+#: keyeditor.cc:370
+msgid "RegionList"
 msgstr ""
 
-#: keyeditor.cc:267
-msgid "Editor_menus"
+#: keyeditor.cc:543
+msgid "Could not open temporary file to print bindings (%1)"
 msgstr ""
 
-#: keyeditor.cc:269
-msgid "RegionList"
+#: keyeditor.cc:561
+msgid "Could not save bindings to file (%1)"
 msgstr ""
 
-#: keyeditor.cc:271
-msgid "ProcessorMenu"
+#: latency_gui.cc:39
+msgid "sample"
 msgstr ""
 
 #: latency_gui.cc:40
@@ -6588,110 +7668,218 @@ msgstr ""
 msgid "period"
 msgstr ""
 
-#: latency_gui.cc:55
-msgid "%1 sample"
-msgid_plural "%1 samples"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-
-#: latency_gui.cc:72 panner_ui.cc:409
+#: latency_gui.cc:72 panner_ui.cc:411 plugin_pin_dialog.cc:109
+#: plugin_ui.cc:421
 msgid "Reset"
 msgstr "Zresetuj"
 
-#: latency_gui.cc:149 rhythm_ferret.cc:273 sfdb_ui.cc:1912
+#: latency_gui.cc:149 rhythm_ferret.cc:295 sfdb_ui.cc:1878
 msgid "programming error: %1 (%2)"
 msgstr ""
 
-#: location_ui.cc:52 location_ui.cc:54
+#: location_ui.cc:54 location_ui.cc:57
 msgid "Use PH"
 msgstr ""
 
-#: location_ui.cc:59
+#: location_ui.cc:55 location_ui.cc:58
+msgid "Goto"
+msgstr ""
+
+#: location_ui.cc:63
 msgid "Glue"
 msgstr ""
 
-#: location_ui.cc:87
+#: location_ui.cc:88
 msgid "Performer:"
 msgstr ""
 
-#: location_ui.cc:88
+#: location_ui.cc:89
 msgid "Composer:"
 msgstr ""
 
-#: location_ui.cc:90
+#: location_ui.cc:91
 msgid "Pre-Emphasis"
 msgstr "Przed naciskiem"
 
-#: location_ui.cc:317
+#: location_ui.cc:319
 msgid "Remove this range"
 msgstr ""
 
-#: location_ui.cc:318
+#: location_ui.cc:320
 msgid "Start time - middle click to locate here"
 msgstr ""
 
-#: location_ui.cc:319
+#: location_ui.cc:321
 msgid "End time - middle click to locate here"
 msgstr ""
 
-#: location_ui.cc:322
+#: location_ui.cc:324
 msgid "Set range start from playhead location"
 msgstr ""
 
-#: location_ui.cc:323
+#: location_ui.cc:325
 msgid "Set range end from playhead location"
 msgstr ""
 
-#: location_ui.cc:327
+#: location_ui.cc:329
 msgid "Remove this marker"
 msgstr ""
 
-#: location_ui.cc:328
+#: location_ui.cc:330
 msgid "Position - middle click to locate here"
 msgstr ""
 
-#: location_ui.cc:330
+#: location_ui.cc:332
 msgid "Set marker time from playhead location"
 msgstr ""
 
-#: location_ui.cc:499
+#: location_ui.cc:524
 msgid "You cannot put a CD marker at the start of the session"
 msgstr ""
 
-#: location_ui.cc:725
+#: location_ui.cc:750
 msgid "New Marker"
 msgstr ""
 
-#: location_ui.cc:726
+#: location_ui.cc:751
 msgid "New Range"
 msgstr ""
 
-#: location_ui.cc:739
+#: location_ui.cc:764
 msgid "<b>Loop/Punch Ranges</b>"
 msgstr ""
 
-#: location_ui.cc:764
+#: location_ui.cc:790
 msgid "<b>Markers (Including CD Index)</b>"
 msgstr ""
 
-#: location_ui.cc:799
+#: location_ui.cc:825
 msgid "<b>Ranges (Including CD Track Ranges)</b>"
 msgstr ""
 
-#: location_ui.cc:1042
+#: location_ui.cc:1068
 msgid "add range marker"
 msgstr "dodaj znacznik zakresu"
 
-#: main.cc:82
+#: lua_script_manager.cc:31
+msgid "Add/Set"
+msgstr ""
+
+#: lua_script_manager.cc:34
+msgid "Call"
+msgstr ""
+
+#: lua_script_manager.cc:35
+msgid "New Hook"
+msgstr ""
+
+#: lua_script_manager.cc:77
+msgid "Signal(s)"
+msgstr ""
+
+#: lua_script_manager.cc:127
+msgid "Action %1"
+msgstr ""
+
+#: lua_script_manager.cc:132 lua_script_manager.cc:227
+msgid "Unset"
+msgstr ""
+
+#: luainstance.cc:1079
+msgid "Cannot read script '%1': %2"
+msgstr ""
+
+#: luawindow.cc:97
+msgid "Run"
+msgstr ""
+
+#: luawindow.cc:98
+msgid "Clear Output"
+msgstr ""
+
+#: luawindow.cc:102
+msgid "Revert"
+msgstr ""
+
+#: luawindow.cc:166
+msgid "Select Editor Buffer"
+msgstr ""
+
+#: luawindow.cc:253 luawindow.cc:258
+msgid "Window|Lua"
+msgstr ""
+
+#: luawindow.cc:286 luawindow.cc:304
+msgid "LuaException: %1"
+msgstr ""
+
+#: luawindow.cc:342
+msgid "Deleted %1"
+msgstr ""
+
+#: luawindow.cc:345
+msgid "Failed to delete %1"
+msgstr ""
+
+#: luawindow.cc:411
+msgid ""
+"Missing script header.\n"
+"The script requires an '{ardour}' info table and a 'factory' function."
+msgstr ""
+
+#: luawindow.cc:416
+msgid "Script fails to compile."
+msgstr ""
+
+#: luawindow.cc:423
+msgid "Invalid or missing script-name or script-type."
+msgstr ""
+
+#: luawindow.cc:428
+msgid ""
+"Invalid script-type.\n"
+"Valid types are 'EditorAction' and 'Snippet'."
+msgstr ""
+
+#: luawindow.cc:439 luawindow.cc:490
+msgid "Saved as %1"
+msgstr ""
+
+#: luawindow.cc:442 luawindow.cc:493
+msgid "Error saving file: %1"
+msgstr ""
+
+#: luawindow.cc:452
+msgid ""
+"Script with given name '%1' already exists.\n"
+"Use a different name in the descriptor."
+msgstr ""
+
+#: luawindow.cc:636
+msgid "Scratch Buffer %1"
+msgstr ""
+
+#: luawindow.cc:638
+msgid "Action: '%1'"
+msgstr ""
+
+#: luawindow.cc:640
+msgid "Snippet: %1"
+msgstr ""
+
+#: luawindow.cc:652
+msgid "Save as"
+msgstr ""
+
+#: main.cc:88
 msgid "%1 could not connect to the audio backend."
 msgstr ""
 
-#: main.cc:107 main.cc:123
+#: main.cc:135 main.cc:151
 msgid "The audio backend (%1) has failed, or terminated"
 msgstr ""
 
-#: main.cc:110
+#: main.cc:138
 msgid ""
 "%2 exited unexpectedly, and without notifying %1.\n"
 "\n"
@@ -6700,78 +7888,98 @@ msgid ""
 "Click OK to exit %1."
 msgstr ""
 
-#: main.cc:124
+#: main.cc:152
 msgid "%2 exited unexpectedly, and without notifying %1."
 msgstr ""
 
-#: main.cc:219
+#: main.cc:247
 msgid ""
 "\n"
 "   %1 could not understand your command line      "
 msgstr ""
 
-#: main.cc:221
+#: main.cc:249
 msgid "An error was encountered while launching %1"
 msgstr ""
 
-#: main.cc:310
+#: main.cc:344
 msgid " (built using "
 msgstr " (skompilowany przy użyciu "
 
-#: main.cc:313
+#: main.cc:347
 msgid " and GCC version "
 msgstr " oraz GCC w wesji "
 
-#: main.cc:323
-msgid "Copyright (C) 1999-2012 Paul Davis"
+#: main.cc:357
+msgid "Copyright (C) 1999-2015 Paul Davis"
 msgstr ""
 
-#: main.cc:324
+#: main.cc:358
 msgid ""
 "Some portions Copyright (C) Steve Harris, Ari Johnson, Brett Viren, Joel "
 "Baker, Robin Gareus"
 msgstr ""
 
-#: main.cc:326
+#: main.cc:360
 msgid "%1 comes with ABSOLUTELY NO WARRANTY"
 msgstr ""
 
-#: main.cc:327
+#: main.cc:361
 msgid "not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
 msgstr ""
 
-#: main.cc:328
+#: main.cc:362
 msgid "This is free software, and you are welcome to redistribute it "
 msgstr "To jest oprogramowanie darmowe i możesz je rozpowszechniać"
 
-#: main.cc:329
+#: main.cc:363
 msgid "under certain conditions; see the source for copying conditions."
 msgstr ""
 "na ściśle określonych zasadach; zobacz plik COPYING by dowiedzieć się więcej."
 
-#: main.cc:334
+#: main.cc:368
 msgid "could not initialize %1."
 msgstr ""
 
-#: main.cc:344
+#: main.cc:378
 msgid "Cannot xinstall SIGPIPE error handler"
 msgstr ""
 
-#: main.cc:351
+#: main.cc:385
+msgid "Could not complete pre-GUI initialization"
+msgstr ""
+
+#: main.cc:392
 msgid "could not create %1 GUI"
 msgstr ""
 
-#: main_clock.cc:52
+#: main_clock.cc:51
 msgid "Display delta to edit cursor"
 msgstr ""
 
-#: marker.cc:273
-msgid "MarkerText"
-msgstr "Tekst znacznika"
+#: main_clock.cc:66 tempo_dialog.cc:55
+msgid "Edit Tempo"
+msgstr ""
 
-#: midi_channel_selector.cc:161 midi_channel_selector.cc:400
-#: midi_channel_selector.cc:436 rc_option_editor.cc:1573
-#: rc_option_editor.cc:2203 sfdb_ui.cc:665
+#: main_clock.cc:67 tempo_dialog.cc:429
+msgid "Edit Meter"
+msgstr ""
+
+#: main_clock.cc:68
+msgid "Insert Tempo Change"
+msgstr ""
+
+#: main_clock.cc:69
+msgid "Insert Meter Change"
+msgstr ""
+
+#: marker.cc:280
+msgid "MarkerText"
+msgstr "Tekst znacznika"
+
+#: midi_channel_selector.cc:161 midi_channel_selector.cc:400
+#: midi_channel_selector.cc:436 rc_option_editor.cc:2157
+#: rc_option_editor.cc:2799 sfdb_ui.cc:671
 msgid "None"
 msgstr "Brak"
 
@@ -6852,11 +8060,11 @@ msgstr ""
 msgid "Click to force all MIDI channel messages to channel %1"
 msgstr ""
 
-#: midi_channel_selector.cc:718
+#: midi_channel_selector.cc:720
 msgid "Click to toggle recording of channel %1"
 msgstr ""
 
-#: midi_channel_selector.cc:726
+#: midi_channel_selector.cc:728
 msgid "Click to force all recorded channels to %1"
 msgstr ""
 
@@ -6968,192 +8176,188 @@ msgstr ""
 msgid "velocity edit"
 msgstr ""
 
-#: midi_region_view.cc:954
+#: midi_region_view.cc:962
 msgid "add note"
 msgstr ""
 
-#: midi_region_view.cc:1885
+#: midi_region_view.cc:1904
 msgid "step add"
 msgstr ""
 
-#: midi_region_view.cc:1979 midi_region_view.cc:2002
+#: midi_region_view.cc:1998 midi_region_view.cc:2021
 msgid "alter patch change"
 msgstr ""
 
-#: midi_region_view.cc:2038
+#: midi_region_view.cc:2057
 msgid "add patch change"
 msgstr ""
 
-#: midi_region_view.cc:2060 midi_region_view.cc:2061
+#: midi_region_view.cc:2079 midi_region_view.cc:2080
 msgid "move patch change"
 msgstr ""
 
-#: midi_region_view.cc:2073 midi_region_view.cc:2074
+#: midi_region_view.cc:2092 midi_region_view.cc:2093
 msgid "delete patch change"
 msgstr ""
 
-#: midi_region_view.cc:2112
+#: midi_region_view.cc:2131
 msgid "delete selection"
 msgstr ""
 
-#: midi_region_view.cc:2128
+#: midi_region_view.cc:2148
 msgid "delete note"
 msgstr ""
 
-#: midi_region_view.cc:2587
+#: midi_region_view.cc:2589
 msgid "move notes"
 msgstr ""
 
-#: midi_region_view.cc:3070
+#: midi_region_view.cc:3139
 msgid "change velocities"
 msgstr ""
 
-#: midi_region_view.cc:3136
+#: midi_region_view.cc:3205
 msgid "transpose"
 msgstr ""
 
-#: midi_region_view.cc:3164
+#: midi_region_view.cc:3233
 msgid "change note lengths"
 msgstr ""
 
-#: midi_region_view.cc:3240
+#: midi_region_view.cc:3309
 msgid "nudge"
 msgstr ""
 
-#: midi_region_view.cc:3255
+#: midi_region_view.cc:3324
 msgid "change channel"
 msgstr ""
 
-#: midi_region_view.cc:3295
+#: midi_region_view.cc:3372
 msgid "Bank "
 msgstr ""
 
-#: midi_region_view.cc:3296
-msgid "Program "
-msgstr ""
-
-#: midi_region_view.cc:3297
+#: midi_region_view.cc:3374
 msgid "Channel "
 msgstr ""
 
-#: midi_region_view.cc:3484
+#: midi_region_view.cc:3561
 msgid "paste"
 msgstr "wklej"
 
-#: midi_streamview.cc:185
+#: midi_streamview.cc:184
 msgid "attempt to display MIDI region with no source"
 msgstr ""
 
-#: midi_streamview.cc:195
+#: midi_streamview.cc:194
 msgid "attempt to display MIDI region with no model"
 msgstr ""
 
-#: midi_streamview.cc:506
+#: midi_streamview.cc:505
 msgid "failed to create MIDI region"
 msgstr ""
 
-#: midi_time_axis.cc:309
+#: midi_time_axis.cc:306
 msgid "External MIDI Device"
 msgstr ""
 
-#: midi_time_axis.cc:310
+#: midi_time_axis.cc:307
 msgid "External Device Mode"
 msgstr ""
 
-#: midi_time_axis.cc:318
+#: midi_time_axis.cc:315
 msgid "Chns"
 msgstr ""
 
-#: midi_time_axis.cc:320
+#: midi_time_axis.cc:317
 msgid "Click to edit channel settings"
 msgstr ""
 
-#: midi_time_axis.cc:519
+#: midi_time_axis.cc:516
 msgid "Show Full Range"
 msgstr ""
 
-#: midi_time_axis.cc:524
+#: midi_time_axis.cc:521
 msgid "Fit Contents"
 msgstr ""
 
-#: midi_time_axis.cc:528
+#: midi_time_axis.cc:525
 msgid "Note Range"
 msgstr ""
 
-#: midi_time_axis.cc:529
+#: midi_time_axis.cc:526
 msgid "Note Mode"
 msgstr ""
 
-#: midi_time_axis.cc:530
+#: midi_time_axis.cc:527
 msgid "Channel Selector"
 msgstr ""
 
-#: midi_time_axis.cc:535
+#: midi_time_axis.cc:532
 msgid "Color Mode"
 msgstr ""
 
-#: midi_time_axis.cc:594
+#: midi_time_axis.cc:591
 msgid "Bender"
 msgstr ""
 
-#: midi_time_axis.cc:598
+#: midi_time_axis.cc:595
 msgid "Pressure"
 msgstr ""
 
-#: midi_time_axis.cc:610
+#: midi_time_axis.cc:607
 msgid "Controllers"
 msgstr ""
 
-#: midi_time_axis.cc:615
+#: midi_time_axis.cc:612
 msgid "No MIDI Channels selected"
 msgstr ""
 
-#: midi_time_axis.cc:672 midi_time_axis.cc:801
+#: midi_time_axis.cc:669 midi_time_axis.cc:798
 msgid "Hide all channels"
 msgstr ""
 
-#: midi_time_axis.cc:676 midi_time_axis.cc:805
+#: midi_time_axis.cc:673 midi_time_axis.cc:802
 msgid "Show all channels"
 msgstr ""
 
-#: midi_time_axis.cc:687 midi_time_axis.cc:816
+#: midi_time_axis.cc:684 midi_time_axis.cc:813
 msgid "Channel %1"
 msgstr ""
 
-#: midi_time_axis.cc:942 midi_time_axis.cc:974
+#: midi_time_axis.cc:939 midi_time_axis.cc:971
 msgid "Controllers %1-%2"
 msgstr ""
 
-#: midi_time_axis.cc:965 midi_time_axis.cc:968
+#: midi_time_axis.cc:962 midi_time_axis.cc:965
 msgid "Controller %1"
 msgstr ""
 
-#: midi_time_axis.cc:991
+#: midi_time_axis.cc:988
 msgid "Sustained"
 msgstr ""
 
-#: midi_time_axis.cc:998
+#: midi_time_axis.cc:995
 msgid "Percussive"
 msgstr ""
 
-#: midi_time_axis.cc:1018
+#: midi_time_axis.cc:1015
 msgid "Meter Colors"
 msgstr ""
 
-#: midi_time_axis.cc:1025
+#: midi_time_axis.cc:1022
 msgid "Channel Colors"
 msgstr ""
 
-#: midi_time_axis.cc:1032
+#: midi_time_axis.cc:1029
 msgid "Track Color"
 msgstr ""
 
-#: midi_time_axis.cc:1606 midi_time_axis.cc:1612 midi_time_axis.cc:1622
-#: midi_time_axis.cc:1628
+#: midi_time_axis.cc:1610 midi_time_axis.cc:1616 midi_time_axis.cc:1626
+#: midi_time_axis.cc:1632
 msgid "all"
 msgstr ""
 
-#: midi_time_axis.cc:1609 midi_time_axis.cc:1625
+#: midi_time_axis.cc:1613 midi_time_axis.cc:1629
 msgid "some"
 msgstr ""
 
@@ -7169,7 +8373,7 @@ msgstr ""
 msgid "Decimal"
 msgstr ""
 
-#: midi_tracer.cc:57 rc_option_editor.cc:740
+#: midi_tracer.cc:57 rc_option_editor.cc:1356
 msgid "Enabled"
 msgstr ""
 
@@ -7185,35 +8389,36 @@ msgstr ""
 msgid "New velocity"
 msgstr ""
 
-#: missing_file_dialog.cc:35
+#: missing_file_dialog.cc:36
 msgid "Missing File"
 msgstr ""
 
-#: missing_file_dialog.cc:37
+#: missing_file_dialog.cc:38
 msgid "Select a folder to search"
 msgstr ""
 
-#: missing_file_dialog.cc:38
+#: missing_file_dialog.cc:39
 msgid "Add chosen folder to search path, and try again"
 msgstr ""
 
-#: missing_file_dialog.cc:40
+#: missing_file_dialog.cc:41
 msgid "Stop loading this session"
 msgstr ""
 
-#: missing_file_dialog.cc:41
+#: missing_file_dialog.cc:42
 msgid "Skip all missing files"
 msgstr ""
 
-#: missing_file_dialog.cc:42
+#: missing_file_dialog.cc:43
 msgid "Skip this file"
 msgstr ""
 
-#: missing_file_dialog.cc:53
+#: missing_file_dialog.cc:57 tempo_dialog.cc:135 tempo_dialog.cc:136
+#: tempo_dialog.cc:484 tempo_dialog.cc:485
 msgid "audio"
 msgstr ""
 
-#: missing_file_dialog.cc:70
+#: missing_file_dialog.cc:74
 msgid ""
 "%1 cannot find the %2 file\n"
 "\n"
@@ -7225,7 +8430,7 @@ msgid ""
 "\n"
 msgstr ""
 
-#: missing_file_dialog.cc:104
+#: missing_file_dialog.cc:108
 msgid "Click to choose an additional folder"
 msgstr ""
 
@@ -7233,516 +8438,706 @@ msgstr ""
 msgid "Missing Plugins"
 msgstr ""
 
-#: missing_plugin_dialog.cc:33 transcode_video_dialog.cc:60
+#: missing_plugin_dialog.cc:36 transcode_video_dialog.cc:60
 msgid "OK"
 msgstr "OK"
 
-#: mixer_actor.cc:55
-msgid "Toggle Solo on Mixer-Selected Tracks/Busses"
-msgstr ""
-
-#: mixer_actor.cc:56
-msgid "Toggle Mute on Mixer-Selected Tracks/Busses"
-msgstr ""
-
-#: mixer_actor.cc:57
-msgid "Toggle Rec-enable on Mixer-Selected Tracks/Busses"
-msgstr ""
-
-#: mixer_actor.cc:58
-msgid "Decrease Gain on Mixer-Selected Tracks/Busses"
-msgstr ""
-
-#: mixer_actor.cc:59
-msgid "Increase Gain on Mixer-Selected Tracks/Busses"
-msgstr ""
-
-#: mixer_actor.cc:60
-msgid "Set Gain to 0dB on Mixer-Selected Tracks/Busses"
-msgstr ""
-
-#: mixer_actor.cc:63
-msgid "Copy Selected Processors"
-msgstr ""
-
-#: mixer_actor.cc:64
-msgid "Cut Selected Processors"
-msgstr ""
-
-#: mixer_actor.cc:65
-msgid "Paste Selected Processors"
-msgstr ""
-
-#: mixer_actor.cc:66
-msgid "Delete Selected Processors"
-msgstr ""
-
-#: mixer_actor.cc:67
-msgid "Select All (visible) Processors"
-msgstr ""
-
-#: mixer_actor.cc:68
-msgid "Toggle Selected Processors"
-msgstr ""
-
-#: mixer_actor.cc:69
-msgid "Toggle Selected Plugins"
-msgstr ""
-
-#: mixer_actor.cc:70
-msgid "Deselect all strips and processors"
-msgstr ""
-
-#: mixer_actor.cc:72 mixer_actor.cc:73
-msgid "Scroll Mixer Window to the left"
-msgstr ""
-
-#: mixer_actor.cc:75
-msgid "Toggle MIDI Input Active for Mixer-Selected Tracks/Busses"
-msgstr ""
-
-#: mixer_actor.cc:90
-msgid "Loaded mixer bindings from %1"
+#: missing_plugin_dialog.cc:42
+msgid ""
+"This session contains the following plugins that cannot be found on this "
+"system:\n"
+"\n"
 msgstr ""
 
-#: mixer_actor.cc:92
-msgid "Could not find mixer.bindings in search path %1"
+#: missing_plugin_dialog.cc:48
+msgid ""
+"\n"
+"Those plugins will be replaced with inactive stubs.\n"
+"It is recommended that you install the missing plugins and re-load the "
+"session.\n"
+"(also check the blacklist, Window > Log and Preferences > Plugins)"
 msgstr ""
 
-#: mixer_strip.cc:96 mixer_strip.cc:125
+#: mixer_strip.cc:100 mixer_strip.cc:133
 msgid "pre"
 msgstr "przed"
 
-#: mixer_strip.cc:98 mixer_strip.cc:127 mixer_strip.cc:372 mixer_strip.cc:1410
-#: rc_option_editor.cc:2331
+#: mixer_strip.cc:104 mixer_strip.cc:136 mixer_strip.cc:397
+#: mixer_strip.cc:1540 mixer_strip.cc:1551 rc_option_editor.cc:3140
 msgid "Comments"
 msgstr ""
 
-#: mixer_strip.cc:149
+#: mixer_strip.cc:160
 msgid "Click to toggle the width of this mixer strip."
 msgstr ""
 
-#: mixer_strip.cc:151
+#: mixer_strip.cc:162
 msgid ""
 "\n"
 "%1-%2-click to toggle the width of all strips."
 msgstr ""
 
-#: mixer_strip.cc:158
+#: mixer_strip.cc:171
 msgid "Hide this mixer strip"
 msgstr ""
 
-#: mixer_strip.cc:169
+#: mixer_strip.cc:182
 msgid "Click to select metering point"
 msgstr ""
 
-#: mixer_strip.cc:185
+#: mixer_strip.cc:198
 msgid "Isolate Solo"
 msgstr ""
 
-#: mixer_strip.cc:193
+#: mixer_strip.cc:206
 msgid "Lock Solo Status"
 msgstr ""
 
-#: mixer_strip.cc:196 mixer_strip.cc:2027
+#: mixer_strip.cc:208 mixer_strip.cc:2217
+msgid "SoloLock|Lock"
+msgstr ""
+
+#: mixer_strip.cc:209 mixer_strip.cc:2216
 msgid "Iso"
 msgstr ""
 
-#: mixer_strip.cc:250
+#: mixer_strip.cc:263
 msgid "Mix group"
 msgstr ""
 
-#: mixer_strip.cc:368 rc_option_editor.cc:2327
+#: mixer_strip.cc:275
+msgid "Trim: "
+msgstr ""
+
+#: mixer_strip.cc:393 rc_option_editor.cc:3136
 msgid "Phase Invert"
 msgstr ""
 
-#: mixer_strip.cc:369 rc_option_editor.cc:2328
+#: mixer_strip.cc:394 rc_option_editor.cc:3137
 msgid "Record & Monitor"
 msgstr ""
 
-#: mixer_strip.cc:370 rc_option_editor.cc:2329
+#: mixer_strip.cc:395 rc_option_editor.cc:3138
 msgid "Solo Iso / Lock"
 msgstr ""
 
-#: mixer_strip.cc:524
+#: mixer_strip.cc:398 rc_option_editor.cc:3141
+msgid "VCA Assigns"
+msgstr ""
+
+#: mixer_strip.cc:531
+msgid "Show/Hide Monitoring Section"
+msgstr ""
+
+#: mixer_strip.cc:583
 msgid "Enable/Disable MIDI input"
 msgstr ""
 
-#: mixer_strip.cc:688
+#: mixer_strip.cc:749
 msgid "Aux"
 msgstr ""
 
-#: mixer_strip.cc:710
+#: mixer_strip.cc:775
 msgid "Snd"
 msgstr ""
 
-#: mixer_strip.cc:776 mixer_strip.cc:879 processor_box.cc:2382
+#: mixer_strip.cc:846 mixer_strip.cc:951 processor_box.cc:3594
 msgid "Not connected to audio engine - no I/O changes are possible"
 msgstr ""
 
-#: mixer_strip.cc:833 mixer_strip.cc:935
+#: mixer_strip.cc:904 mixer_strip.cc:1007
 msgid "Add %1 port"
 msgstr ""
 
-#: mixer_strip.cc:840 mixer_strip.cc:942
+#: mixer_strip.cc:912 mixer_strip.cc:1014 monitor_section.cc:1466
+#: plugin_pin_dialog.cc:1782
 msgid "Routing Grid"
 msgstr ""
 
-#: mixer_strip.cc:1171
+#: mixer_strip.cc:1291
+msgid "MIDI "
+msgstr ""
+
+#: mixer_strip.cc:1295
 msgid "<b>INPUT</b> to %1"
 msgstr ""
 
-#: mixer_strip.cc:1174
+#: mixer_strip.cc:1297 monitor_section.cc:1511
 msgid "<b>OUTPUT</b> from %1"
 msgstr ""
 
-#: mixer_strip.cc:1287
+#: mixer_strip.cc:1410 monitor_section.cc:1598
 msgid "Disconnected"
 msgstr ""
 
-#: mixer_strip.cc:1413
-msgid "*Comments*"
-msgstr "*Komentarze*"
-
-#: mixer_strip.cc:1420
-msgid "Cmt"
+#: mixer_strip.cc:1536
+msgid "Click to add/edit comments"
 msgstr ""
 
-#: mixer_strip.cc:1423
-msgid "*Cmt*"
+#: mixer_strip.cc:1540 mixer_strip.cc:1551
+msgid "Cmt"
 msgstr ""
 
-#: mixer_strip.cc:1429
-msgid "Click to Add/Edit Comments"
-msgstr "Kliknij by dodać/edytować komentarze"
-
-#: mixer_strip.cc:1473
+#: mixer_strip.cc:1596
 msgid "Grp"
 msgstr ""
 
-#: mixer_strip.cc:1476
+#: mixer_strip.cc:1599
 msgid "~G"
 msgstr ""
 
-#: mixer_strip.cc:1505 route_time_axis.cc:561
+#: mixer_strip.cc:1640 route_time_axis.cc:585 vca_master_strip.cc:396
 msgid "Color..."
 msgstr ""
 
-#: mixer_strip.cc:1507 route_time_axis.cc:563
+#: mixer_strip.cc:1642 route_time_axis.cc:587
 msgid "Comments..."
 msgstr ""
 
-#: mixer_strip.cc:1509 route_time_axis.cc:565
+#: mixer_strip.cc:1644 route_time_axis.cc:589
 msgid "Inputs..."
 msgstr ""
 
-#: mixer_strip.cc:1511 route_time_axis.cc:567
+#: mixer_strip.cc:1646 route_time_axis.cc:591
 msgid "Outputs..."
 msgstr ""
 
-#: mixer_strip.cc:1516
+#: mixer_strip.cc:1651
 msgid "Save As Template..."
 msgstr ""
 
-#: mixer_strip.cc:1530
+#: mixer_strip.cc:1657 route_group_dialog.cc:45 route_time_axis.cc:851
+msgid "Active"
+msgstr "Aktywne"
+
+#: mixer_strip.cc:1665 plugin_pin_dialog.cc:1011
+msgid "Strict I/O"
+msgstr ""
+
+#: mixer_strip.cc:1675 processor_box.cc:3698
+msgid "Pin Connections..."
+msgstr ""
+
+#: mixer_strip.cc:1679
 msgid "Adjust Latency..."
 msgstr ""
 
-#: mixer_strip.cc:1533
+#: mixer_strip.cc:1682
 msgid "Protect Against Denormals"
 msgstr ""
 
-#: mixer_strip.cc:1539 route_time_axis.cc:580
-msgid "Remote Control ID..."
+#: mixer_strip.cc:1701 route_time_axis.cc:867
+msgid "Duplicate..."
 msgstr ""
 
-#: mixer_strip.cc:1823
+#: mixer_strip.cc:1996
 msgid "Pre"
 msgstr ""
 
-#: mixer_strip.cc:1827
+#: mixer_strip.cc:2000
 msgid "Post"
 msgstr ""
 
-#: mixer_strip.cc:1847
-msgid "Pr"
+#: mixer_strip.cc:2016
+msgid "Meter|In"
+msgstr ""
+
+#: mixer_strip.cc:2020
+msgid "Meter|Pr"
+msgstr ""
+
+#: mixer_strip.cc:2024
+msgid "Meter|Po"
 msgstr ""
 
-#: mixer_strip.cc:1851
-msgid "Po"
+#: mixer_strip.cc:2028
+msgid "Meter|O"
 msgstr ""
 
-#: mixer_strip.cc:1860
-msgid "C"
+#: mixer_strip.cc:2033
+msgid "Meter|C"
 msgstr ""
 
-#: mixer_strip.cc:2008 route_ui.cc:168
+#: mixer_strip.cc:2194 route_ui.cc:193
 msgid "Disk"
 msgstr ""
 
-#: mixer_strip.cc:2020 monitor_section.cc:70
+#: mixer_strip.cc:2196
+msgid "Mon"
+msgstr ""
+
+#: mixer_strip.cc:2209 monitor_section.cc:81
 msgid "AFL"
 msgstr ""
 
-#: mixer_strip.cc:2023 monitor_section.cc:71
+#: mixer_strip.cc:2212 monitor_section.cc:82
 msgid "PFL"
 msgstr ""
 
-#: mixer_strip.cc:2034 meter_strip.cc:380
-msgid "D"
+#: mixer_strip.cc:2222 meter_strip.cc:385
+msgid "MonitorInput|I"
+msgstr ""
+
+#: mixer_strip.cc:2223 meter_strip.cc:386
+msgid "MonitorDisk|D"
+msgstr ""
+
+#: mixer_strip.cc:2225
+msgid "Mon|O"
+msgstr ""
+
+#: mixer_strip.cc:2238 meter_strip.cc:377 route_time_axis.cc:2730
+#: vca_master_strip.cc:202 vca_time_axis.cc:227
+msgid "AfterFader|A"
 msgstr ""
 
 #: mixer_strip.cc:2241
+msgid "Prefader|P"
+msgstr ""
+
+#: mixer_strip.cc:2246
+msgid "SoloIso|I"
+msgstr ""
+
+#: mixer_strip.cc:2247
+msgid "SoloLock|L"
+msgstr ""
+
+#: mixer_strip.cc:2452
 msgid "Pre Fader"
 msgstr "Przed potencjometrem"
 
-#: mixer_strip.cc:2242
+#: mixer_strip.cc:2453
 msgid "Post Fader"
 msgstr "Za potencjometrem"
 
-#: mixer_strip.cc:2286 meter_strip.cc:847
+#: mixer_strip.cc:2498 meter_strip.cc:858
 msgid "Change all in Group to %1"
 msgstr ""
 
-#: mixer_strip.cc:2288 meter_strip.cc:849
+#: mixer_strip.cc:2500 meter_strip.cc:860
 msgid "Change all to %1"
 msgstr ""
 
-#: mixer_strip.cc:2290 meter_strip.cc:851
+#: mixer_strip.cc:2502 meter_strip.cc:862
 msgid "Change same track-type to %1"
 msgstr ""
 
-#: mixer_ui.cc:130 route_time_axis.cc:818
+#: mixer_ui.cc:152 route_time_axis.cc:828
 msgid "Group"
 msgstr "Grupa"
 
-#: mixer_ui.cc:1224
+#: mixer_ui.cc:221
+msgid "Favorite Plugins"
+msgstr ""
+
+#: mixer_ui.cc:627
+msgid "Error adding GUI elements for new tracks/busses %1"
+msgstr ""
+
+#: mixer_ui.cc:1542
 msgid "track display list item for renamed strip not found!"
 msgstr ""
 
-#: mixer_ui.cc:1316
+#: mixer_ui.cc:1636
 msgid "-all-"
 msgstr "-wszystko-"
 
-#: mixer_ui.cc:1853
+#: mixer_ui.cc:2135
 msgid "Strips"
 msgstr "Pas"
 
-#: meter_strip.cc:157
+#: mixer_ui.cc:2479
+msgid "No Track/Bus is selected."
+msgstr ""
+
+#: mixer_ui.cc:2481
+msgid "Add at the top"
+msgstr ""
+
+#: mixer_ui.cc:2483
+msgid "Add Pre-Fader"
+msgstr ""
+
+#: mixer_ui.cc:2485
+msgid "Add Post-Fader"
+msgstr ""
+
+#: mixer_ui.cc:2487
+msgid "Add at the end"
+msgstr ""
+
+#: mixer_ui.cc:2493
+msgid "Remove from favorites"
+msgstr ""
+
+#: mixer_ui.cc:2499
+msgid "Delete Preset"
+msgstr ""
+
+#: mixer_ui.cc:2739
+msgid "Toggle Solo on Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: mixer_ui.cc:2740
+msgid "Toggle Mute on Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: mixer_ui.cc:2741
+msgid "Toggle Rec-enable on Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: mixer_ui.cc:2742
+msgid "Decrease Gain on Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: mixer_ui.cc:2743
+msgid "Increase Gain on Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: mixer_ui.cc:2744
+msgid "Set Gain to 0dB on Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: mixer_ui.cc:2747
+msgid "Copy Selected Processors"
+msgstr ""
+
+#: mixer_ui.cc:2748
+msgid "Cut Selected Processors"
+msgstr ""
+
+#: mixer_ui.cc:2749
+msgid "Paste Selected Processors"
+msgstr ""
+
+#: mixer_ui.cc:2750
+msgid "Delete Selected Processors"
+msgstr ""
+
+#: mixer_ui.cc:2751
+msgid "Select All (visible) Processors"
+msgstr ""
+
+#: mixer_ui.cc:2752
+msgid "Toggle Selected Processors"
+msgstr ""
+
+#: mixer_ui.cc:2753
+msgid "Toggle Selected Plugins"
+msgstr ""
+
+#: mixer_ui.cc:2754
+msgid "Deselect all strips and processors"
+msgstr ""
+
+#: mixer_ui.cc:2756 mixer_ui.cc:2757
+msgid "Scroll Mixer Window to the left"
+msgstr ""
+
+#: mixer_ui.cc:2759
+msgid "Toggle MIDI Input Active for Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: meter_strip.cc:160
 msgid "Reset Peak"
 msgstr ""
 
-#: meter_strip.cc:883
+#: meter_strip.cc:380 route_time_axis.cc:2734 vca_master_strip.cc:206
+#: vca_time_axis.cc:231
+msgid "PreFader|P"
+msgstr ""
+
+#: meter_strip.cc:894
 msgid "Variable height"
 msgstr ""
 
-#: meter_strip.cc:884
+#: meter_strip.cc:895
 msgid "Short"
 msgstr ""
 
-#: meter_strip.cc:885
+#: meter_strip.cc:896
 msgid "Tall"
 msgstr ""
 
-#: meter_strip.cc:886
+#: meter_strip.cc:897
 msgid "Grande"
 msgstr ""
 
-#: meter_strip.cc:887
+#: meter_strip.cc:898
 msgid "Venti"
 msgstr ""
 
-#: meter_patterns.cc:82
-msgid "Peak"
+#: meter_patterns.cc:84
+msgid "Peak (+6dBFS)"
 msgstr ""
 
-#: meter_patterns.cc:85
+#: meter_patterns.cc:87
+msgid "Peak (0dBFS)"
+msgstr ""
+
+#: meter_patterns.cc:90
 msgid "RMS + Peak"
 msgstr ""
 
-#: meter_patterns.cc:88
+#: meter_patterns.cc:93
 msgid "IEC1/DIN"
 msgstr ""
 
-#: meter_patterns.cc:91
+#: meter_patterns.cc:96
 msgid "IEC1/Nordic"
 msgstr ""
 
-#: meter_patterns.cc:94
+#: meter_patterns.cc:99
 msgid "IEC2/BBC"
 msgstr ""
 
-#: meter_patterns.cc:97
+#: meter_patterns.cc:102
 msgid "IEC2/EBU"
 msgstr ""
 
-#: meter_patterns.cc:100
-msgid "K20"
+#: meter_patterns.cc:105
+msgid "K20/RMS"
 msgstr ""
 
-#: meter_patterns.cc:103
-msgid "K14"
+#: meter_patterns.cc:108
+msgid "K14/RMS"
 msgstr ""
 
-#: meter_patterns.cc:106
-msgid "K12"
+#: meter_patterns.cc:111
+msgid "K12/RMS"
 msgstr ""
 
-#: meter_patterns.cc:109
+#: meter_patterns.cc:114
 msgid "VU"
 msgstr ""
 
-#: monitor_section.cc:69
+#: monitor_section.cc:80
 msgid "SiP"
 msgstr ""
 
-#: monitor_section.cc:96 route_group_dialog.cc:49
+#: monitor_section.cc:113 route_group_dialog.cc:49
 msgid "Soloing"
 msgstr ""
 
-#: monitor_section.cc:100
+#: monitor_section.cc:117
 msgid "Isolated"
 msgstr ""
 
-#: monitor_section.cc:104
+#: monitor_section.cc:121
 msgid "Auditioning"
 msgstr ""
 
-#: monitor_section.cc:114
+#: monitor_section.cc:132
 msgid ""
 "When active, something is solo-isolated.\n"
 "Click to de-isolate everything"
 msgstr ""
 
-#: monitor_section.cc:117
+#: monitor_section.cc:135
 msgid ""
 "When active, auditioning is active.\n"
 "Click to stop the audition"
 msgstr ""
 
-#: monitor_section.cc:134
+#: monitor_section.cc:152
 msgid "Solo controls affect solo-in-place"
 msgstr ""
 
-#: monitor_section.cc:140
+#: monitor_section.cc:158
 msgid "Solo controls toggle after-fader-listen"
 msgstr ""
 
-#: monitor_section.cc:146
+#: monitor_section.cc:164
 msgid "Solo controls toggle pre-fader-listen"
 msgstr ""
 
-#: monitor_section.cc:156
+#: monitor_section.cc:170
+msgid "Excl. Solo"
+msgstr ""
+
+#: monitor_section.cc:172
+msgid "Exclusive solo means that only 1 solo is active at a time"
+msgstr ""
+
+#: monitor_section.cc:179
+msgid "Solo » Mute"
+msgstr ""
+
+#: monitor_section.cc:181
+msgid ""
+"If enabled, solo will override mute\n"
+"(a soloed & muted track or bus will be audible)"
+msgstr ""
+
+#: monitor_section.cc:189
+msgid "Processors"
+msgstr ""
+
+#: monitor_section.cc:191
+msgid "Allow one to add monitor effect processors"
+msgstr ""
+
+#: monitor_section.cc:206
 msgid "Gain increase for soloed signals (0dB is normal)"
 msgstr ""
 
-#: monitor_section.cc:170
+#: monitor_section.cc:210 monitor_section.cc:227 monitor_section.cc:244
+#: monitor_section.cc:289
+msgid "0 dB"
+msgstr ""
+
+#: monitor_section.cc:211
+msgid "3 dB"
+msgstr ""
+
+#: monitor_section.cc:212
+msgid "6 dB"
+msgstr ""
+
+#: monitor_section.cc:213
+msgid "10 dB"
+msgstr ""
+
+#: monitor_section.cc:215
 msgid "Solo Boost"
 msgstr ""
 
-#: monitor_section.cc:185
+#: monitor_section.cc:222
 msgid ""
 "Gain reduction non-soloed signals\n"
 "A value above -inf dB causes \"solo-in-front\""
 msgstr ""
 
-#: monitor_section.cc:196
-msgid "SiP Cut"
+#: monitor_section.cc:228 monitor_section.cc:246 monitor_section.cc:291
+msgid "-6 dB"
 msgstr ""
 
-#: monitor_section.cc:211
-msgid "Gain reduction to use when dimming monitor outputs"
+#: monitor_section.cc:229 monitor_section.cc:247 monitor_section.cc:292
+msgid "-12 dB"
 msgstr ""
 
-#: monitor_section.cc:225 monitor_section.cc:283
-msgid "Dim"
+#: monitor_section.cc:230 monitor_section.cc:248 monitor_section.cc:293
+msgid "-20 dB"
 msgstr ""
 
-#: monitor_section.cc:235
-msgid "Excl. Solo"
+#: monitor_section.cc:231
+msgid "OFF"
 msgstr ""
 
-#: monitor_section.cc:237
-msgid "Exclusive solo means that only 1 solo is active at a time"
+#: monitor_section.cc:233
+msgid "SiP Cut"
 msgstr ""
 
-#: monitor_section.cc:244
-msgid "Solo » Mute"
+#: monitor_section.cc:240
+msgid "Gain reduction to use when dimming monitor outputs"
 msgstr ""
 
-#: monitor_section.cc:246
-msgid ""
-"If enabled, solo will override mute\n"
-"(a soloed & muted track or bus will be audible)"
+#: monitor_section.cc:245 monitor_section.cc:290
+msgid "-3 dB"
+msgstr ""
+
+#: monitor_section.cc:250 monitor_section.cc:264 monitor_section.cc:325
+msgid "Dim"
+msgstr ""
+
+#: monitor_section.cc:294
+msgid "-30 dB"
+msgstr ""
+
+#: monitor_section.cc:333
+msgid "Inv"
 msgstr ""
 
-#: monitor_section.cc:323
+#: monitor_section.cc:399
 msgid "Monitor"
 msgstr ""
 
-#: monitor_section.cc:744
+#: monitor_section.cc:897
 msgid "Switch monitor to mono"
 msgstr ""
 
-#: monitor_section.cc:747
+#: monitor_section.cc:900
 msgid "Cut monitor"
 msgstr ""
 
-#: monitor_section.cc:750
+#: monitor_section.cc:903
 msgid "Dim monitor"
 msgstr ""
 
-#: monitor_section.cc:753
+#: monitor_section.cc:906
 msgid "Toggle exclusive solo mode"
 msgstr ""
 
-#: monitor_section.cc:759
+#: monitor_section.cc:912
 msgid "Toggle mute overrides solo mode"
 msgstr ""
 
-#: monitor_section.cc:771
+#: monitor_section.cc:921
 msgid "Cut monitor channel %1"
 msgstr ""
 
-#: monitor_section.cc:776
+#: monitor_section.cc:926
 msgid "Dim monitor channel %1"
 msgstr ""
 
-#: monitor_section.cc:781
+#: monitor_section.cc:931
 msgid "Solo monitor channel %1"
 msgstr ""
 
-#: monitor_section.cc:786
+#: monitor_section.cc:936
 msgid "Invert monitor channel %1"
 msgstr ""
 
-#: monitor_section.cc:796
+#: monitor_section.cc:946
 msgid "In-place solo"
 msgstr ""
 
-#: monitor_section.cc:798
+#: monitor_section.cc:948
 msgid "After Fade Listen (AFL) solo"
 msgstr ""
 
-#: monitor_section.cc:800
+#: monitor_section.cc:950
 msgid "Pre Fade Listen (PFL) solo"
 msgstr ""
 
-#: mono_panner.cc:109 stereo_panner.cc:119
+#: monitor_section.cc:953
+msgid "Toggle Monitor Section Processor Box"
+msgstr ""
+
+#: monitor_section.cc:1413
+msgid "No session - no I/O changes are possible"
+msgstr ""
+
+#: monitor_selector.cc:199
+msgid "Monitor output selector"
+msgstr ""
+
+#: mono_panner.cc:105 stereo_panner.cc:115
 msgid "bypassed"
 msgstr ""
 
-#: mono_panner.cc:123
+#: mono_panner.cc:119
 #, c-format
 msgid "L:%3d R:%3d"
 msgstr ""
 
-#: mono_panner_editor.cc:33
+#: mono_panner.cc:203 panner2d.cc:276 stereo_panner.cc:252
+#: stereo_panner.cc:275
+msgid "Panner|L"
+msgstr ""
+
+#: mono_panner.cc:220 panner2d.cc:277 stereo_panner.cc:250
+#: stereo_panner.cc:277
+msgid "Panner|R"
+msgstr ""
+
+#: mono_panner_editor.cc:35
 msgid "Mono Panner"
 msgstr ""
 
-#: mono_panner_editor.cc:44 mono_panner_editor.cc:49
-#: stereo_panner_editor.cc:46 stereo_panner_editor.cc:51
+#: mono_panner_editor.cc:46 mono_panner_editor.cc:51
+#: stereo_panner_editor.cc:48 stereo_panner_editor.cc:53
 msgid "%"
 msgstr ""
 
@@ -7797,10 +9192,6 @@ msgid ""
 "relies on a stable, sustainable income stream. Thanks for using Ardour!"
 msgstr ""
 
-#: new_plugin_preset_dialog.cc:29
-msgid "New Preset"
-msgstr ""
-
 #: new_plugin_preset_dialog.cc:30
 msgid "Replace existing preset with this name"
 msgstr ""
@@ -7809,6 +9200,10 @@ msgstr ""
 msgid "Name of new preset"
 msgstr ""
 
+#: new_plugin_preset_dialog.cc:44
+msgid "New Favorite Only"
+msgstr ""
+
 #: normalize_dialog.cc:34
 msgid "Normalize regions"
 msgstr ""
@@ -7817,7 +9212,11 @@ msgstr ""
 msgid "Normalize region"
 msgstr ""
 
-#: normalize_dialog.cc:49 strip_silence_dialog.cc:66
+#: normalize_dialog.cc:42
+msgid "Normalize to:"
+msgstr ""
+
+#: normalize_dialog.cc:49 strip_silence_dialog.cc:67
 msgid "dbFS"
 msgstr ""
 
@@ -7837,103 +9236,106 @@ msgstr "Normalizuj"
 msgid "Select Note"
 msgstr ""
 
-#: opts.cc:57
+#: opts.cc:61
 msgid "Usage: "
 msgstr "Użycie:"
 
-#: opts.cc:58
+#: opts.cc:62
 msgid "  [SESSION_NAME]              Name of session to load\n"
 msgstr ""
 
-#: opts.cc:59
+#: opts.cc:63
 msgid "  -v, --version               Show version information\n"
 msgstr ""
 
-#: opts.cc:60
+#: opts.cc:64
 msgid "  -h, --help                  Print this message\n"
 msgstr ""
 
-#: opts.cc:61
+#: opts.cc:65
 msgid ""
 "  -a, --no-announcements      Do not contact website for announcements\n"
 msgstr ""
 
-#: opts.cc:62
+#: opts.cc:66
 msgid ""
 "  -b, --bindings              Print all possible keyboard binding names\n"
 msgstr ""
 
-#: opts.cc:63
+#: opts.cc:67
+msgid ""
+"  -B, --bypass-plugins        Bypass all plugins in an existing session\n"
+msgstr ""
+
+#: opts.cc:68
 msgid ""
 "  -c, --name <name>           Use a specific backend client name, default is "
 "ardour\n"
 msgstr ""
 
-#: opts.cc:64
+#: opts.cc:69
 msgid ""
 "  -d, --disable-plugins       Disable all plugins in an existing session\n"
 msgstr ""
 
-#: opts.cc:65
+#: opts.cc:70
 msgid ""
 "  -D, --debug <options>       Set debug flags. Use \"-D list\" to see "
 "available options\n"
 msgstr ""
 
-#: opts.cc:66
+#: opts.cc:71
 msgid "  -n, --no-splash             Do not show splash screen\n"
 msgstr ""
 
-#: opts.cc:67
+#: opts.cc:72
 msgid "  -m, --menus file            Use \"file\" to define menus\n"
 msgstr ""
 
-#: opts.cc:68
+#: opts.cc:73
 msgid ""
 "  -N, --new session-name      Create a new session from the command line\n"
 msgstr ""
 
-#: opts.cc:69
+#: opts.cc:74
 msgid "  -O, --no-hw-optimizations   Disable h/w specific optimizations\n"
 msgstr ""
 
-#: opts.cc:70
+#: opts.cc:75
 msgid "  -P, --no-connect-ports      Do not connect any ports at startup\n"
 msgstr ""
 
-#: opts.cc:71
+#: opts.cc:76
 msgid "  -S, --sync                  Draw the gui synchronously \n"
 msgstr ""
 
-#: opts.cc:73
+#: opts.cc:78
 msgid "  -V, --novst                 Do not use VST support\n"
 msgstr ""
 
-#: opts.cc:75
+#: opts.cc:80
 msgid ""
 "  -E, --save <file>           Load the specified session, save it to <file> "
 "and then quit\n"
 msgstr ""
 
-#: opts.cc:76
+#: opts.cc:81
 msgid "  -C, --curvetest filename    Curve algorithm debugger\n"
 msgstr ""
 
-#: opts.cc:77
-msgid ""
-"  -k, --keybindings filename  Name of key bindings to load (default is ~/."
-"ardour3/ardour.bindings)\n"
+#: opts.cc:82
+msgid "  -k, --keybindings filename  Name of key bindings to load\n"
 msgstr ""
 
-#: panner2d.cc:854
+#: panner2d.cc:896
 msgid "Panner (2D)"
 msgstr ""
 
-#: panner2d.cc:856 panner_ui.cc:400 plugin_ui.cc:452
+#: panner2d.cc:898 panner_ui.cc:402 plugin_ui.cc:458
 msgid "Bypass"
 msgstr "Pomiń"
 
-#: panner2d.cc:862
+#: panner2d.cc:904
 msgid "Panner"
 msgstr ""
 
@@ -7945,6 +9347,22 @@ msgstr "Tryb automatyzacji panoramy"
 msgid "Pan automation type"
 msgstr "Rodzaj automatyzacji panoramy"
 
+#: panner_ui.cc:605
+msgid "Manual|M"
+msgstr ""
+
+#: panner_ui.cc:608
+msgid "Play|P"
+msgstr ""
+
+#: panner_ui.cc:611
+msgid "Touch|T"
+msgstr ""
+
+#: panner_ui.cc:614
+msgid "Write|W"
+msgstr ""
+
 #: playlist_selector.cc:43
 msgid "Playlists"
 msgstr "Listy odtwarzania"
@@ -7977,143 +9395,298 @@ msgstr ""
 msgid "Show phase"
 msgstr ""
 
-#: plugin_selector.cc:53 plugin_selector.cc:229
+#: plugin_pin_dialog.cc:55
+msgid "Manual Config"
+msgstr ""
+
+#: plugin_pin_dialog.cc:56
+msgid "Sidechain"
+msgstr ""
+
+#: plugin_pin_dialog.cc:57 plugin_pin_dialog.cc:59 plugin_pin_dialog.cc:61
+#: plugin_pin_dialog.cc:63 plugin_pin_dialog.cc:65 step_entry.cc:81
+#: step_entry.cc:84
+msgid "+"
+msgstr ""
+
+#: plugin_pin_dialog.cc:58 plugin_pin_dialog.cc:60 plugin_pin_dialog.cc:62
+#: plugin_pin_dialog.cc:64 plugin_pin_dialog.cc:66
+msgid "-"
+msgstr ""
+
+#: plugin_pin_dialog.cc:148
+msgid "Audio Input Pins"
+msgstr ""
+
+#: plugin_pin_dialog.cc:157
+msgid "MIDI Input Pins"
+msgstr ""
+
+#: plugin_pin_dialog.cc:166
+msgid "Instances"
+msgstr ""
+
+#: plugin_pin_dialog.cc:176
+msgid "Audio Out"
+msgstr ""
+
+#: plugin_pin_dialog.cc:185
+msgid "MIDI Out"
+msgstr ""
+
+#: plugin_pin_dialog.cc:192
+msgid "Output Presets"
+msgstr ""
+
+#: plugin_pin_dialog.cc:208
+msgid "Add Sidechain Input"
+msgstr ""
+
+#: plugin_pin_dialog.cc:478 plugin_pin_dialog.cc:482 plugin_pin_dialog.cc:486
+#: plugin_setup_dialog.cc:115 plugin_setup_dialog.cc:199
+msgid "Automatic"
+msgstr ""
+
+#: plugin_pin_dialog.cc:515 plugin_setup_dialog.cc:208
+msgid "%1 Channel"
+msgid_plural "%1 Channels"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: plugin_pin_dialog.cc:641 processor_box.cc:224
+msgid "Send"
+msgstr ""
+
+#: plugin_pin_dialog.cc:997
+msgid "Latency %1 spl%2 %3"
+msgstr ""
+
+#: plugin_pin_dialog.cc:997 plugin_pin_dialog.cc:1001
+msgid "no-inplace"
+msgstr ""
+
+#: plugin_pin_dialog.cc:999
+msgid "Latency %1 spl"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1055
+msgid "Instance #%1"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1700 processor_box.cc:2508
+msgid "Cannot set up new send: %1"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1707
+msgid "SC %1 (%2)"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1963 plugin_pin_dialog.cc:1971
+msgid "Pin Configuration: %1"
+msgstr ""
+
+#: plugin_setup_dialog.cc:30
+msgid "Plugin Setup"
+msgstr ""
+
+#: plugin_setup_dialog.cc:33
+msgid "Copy I/O Map"
+msgstr ""
+
+#: plugin_setup_dialog.cc:50
+msgid "An Instrument plugin is already present."
+msgstr ""
+
+#: plugin_setup_dialog.cc:54
+msgid "Replace"
+msgstr ""
+
+#: plugin_setup_dialog.cc:60
+msgid "with"
+msgstr ""
+
+#: plugin_setup_dialog.cc:70
+msgid "I/O Pin Mapping"
+msgstr ""
+
+#: plugin_setup_dialog.cc:79
+msgid "Configure Plugin '%1'"
+msgstr ""
+
+#: plugin_setup_dialog.cc:90
+msgid "Output Configuration"
+msgstr ""
+
+#: plugin_selector.cc:54 plugin_selector.cc:322
 msgid "Name contains"
 msgstr "Nazwa zawiera"
 
-#: plugin_selector.cc:54 plugin_selector.cc:233
+#: plugin_selector.cc:55 plugin_selector.cc:326
 msgid "Type contains"
 msgstr "Rodzaj zawiera"
 
-#: plugin_selector.cc:55 plugin_selector.cc:231
+#: plugin_selector.cc:56 plugin_selector.cc:324
 msgid "Category contains"
 msgstr ""
 
-#: plugin_selector.cc:56 plugin_selector.cc:253
+#: plugin_selector.cc:57 plugin_selector.cc:349
 msgid "Author contains"
 msgstr "Autor zawiera"
 
-#: plugin_selector.cc:57 plugin_selector.cc:255
+#: plugin_selector.cc:58 plugin_selector.cc:351
 msgid "Library contains"
 msgstr "Biblioteka zawiera"
 
-#: plugin_selector.cc:58 plugin_selector.cc:219 plugin_selector.cc:537
+#: plugin_selector.cc:59 plugin_selector.cc:278 plugin_selector.cc:639
 msgid "Favorites only"
 msgstr ""
 
-#: plugin_selector.cc:59 plugin_selector.cc:223 plugin_selector.cc:537
+#: plugin_selector.cc:60 plugin_selector.cc:282 plugin_selector.cc:639
 msgid "Hidden only"
 msgstr ""
 
-#: plugin_selector.cc:64
+#: plugin_selector.cc:65
 msgid "Plugin Manager"
 msgstr ""
 
-#: plugin_selector.cc:85
+#: plugin_selector.cc:96
 msgid "Fav"
 msgstr ""
 
-#: plugin_selector.cc:87
+#: plugin_selector.cc:98
 msgid "Available Plugins"
 msgstr "Dostępne wtyczki"
 
-#: plugin_selector.cc:88
+#: plugin_selector.cc:99
 msgid "Type"
 msgstr "Rodzaj"
 
-#: plugin_selector.cc:89
+#: plugin_selector.cc:100
 msgid "Category"
 msgstr "Kategoria"
 
-#: plugin_selector.cc:90
+#: plugin_selector.cc:101
 msgid "Creator"
 msgstr "Kreator"
 
-#: plugin_selector.cc:91
+#: plugin_selector.cc:102
 msgid "# Audio In"
 msgstr ""
 
-#: plugin_selector.cc:92
+#: plugin_selector.cc:103
 msgid "# Audio Out"
 msgstr ""
 
-#: plugin_selector.cc:93
+#: plugin_selector.cc:104
 msgid "# MIDI In"
 msgstr ""
 
-#: plugin_selector.cc:94
+#: plugin_selector.cc:105
 msgid "# MIDI Out"
 msgstr ""
 
-#: plugin_selector.cc:116
+#: plugin_selector.cc:132
 msgid "Plugins to be connected"
 msgstr "Wtyczki do podłączenia"
 
-#: plugin_selector.cc:129
+#: plugin_selector.cc:145
 msgid "Add a plugin to the effect list"
 msgstr "Dodaj wtyczke do listy efektów"
 
-#: plugin_selector.cc:133
+#: plugin_selector.cc:149
 msgid "Remove a plugin from the effect list"
 msgstr "Usuń wtyczkę z listy efektów"
 
-#: plugin_selector.cc:135
-msgid "Update available plugins"
-msgstr "Odśwież listę dostępnych wtyczek"
+#: plugin_selector.cc:161
+msgid "Show Hidden"
+msgstr ""
+
+#: plugin_selector.cc:163
+msgid "Include hidden plugins in list."
+msgstr ""
+
+#: plugin_selector.cc:166
+msgid "Instruments"
+msgstr ""
+
+#: plugin_selector.cc:168
+msgid "Cycle display of instrument plugins (if any)."
+msgstr ""
+
+#: plugin_selector.cc:171
+msgid "Analyzers"
+msgstr ""
+
+#: plugin_selector.cc:173
+msgid "Cycle display of analysis plugins (if any)."
+msgstr ""
+
+#: plugin_selector.cc:176
+msgid "Utils"
+msgstr ""
+
+#: plugin_selector.cc:178
+msgid "Cycle display of utility plugins (if any)."
+msgstr ""
+
+#: plugin_selector.cc:208
+msgid "Filter"
+msgstr ""
 
-#: plugin_selector.cc:172
+#: plugin_selector.cc:232
 msgid "Insert Plugin(s)"
 msgstr "Wstaw wtyczkÄ™"
 
-#: plugin_selector.cc:337 plugin_selector.cc:338 plugin_selector.cc:339
-#: plugin_selector.cc:340
+#: plugin_selector.cc:439 plugin_selector.cc:440 plugin_selector.cc:441
+#: plugin_selector.cc:442
 msgid "variable"
 msgstr ""
 
-#: plugin_selector.cc:496
+#: plugin_selector.cc:598
 msgid ""
 "The plugin \"%1\" could not be loaded\n"
 "\n"
 "See the Log window for more details (maybe)"
 msgstr ""
 
-#: plugin_selector.cc:644
+#: plugin_selector.cc:757
 msgid "Favorites"
 msgstr ""
 
-#: plugin_selector.cc:646
+#: plugin_selector.cc:759
 msgid "Plugin Manager..."
 msgstr ""
 
-#: plugin_selector.cc:650
+#: plugin_selector.cc:763
 msgid "By Creator"
 msgstr ""
 
-#: plugin_selector.cc:653
+#: plugin_selector.cc:766
 msgid "By Category"
 msgstr ""
 
-#: plugin_ui.cc:113
+#: plugin_ui.cc:114
 msgid "Eh? LADSPA plugins don't have editors!"
 msgstr ""
 
-#: plugin_ui.cc:122 plugin_ui.cc:227
+#: plugin_ui.cc:123 plugin_ui.cc:228
 msgid ""
 "unknown type of editor-supplying plugin (note: no VST support in this "
 "version of %1)"
 msgstr ""
 
-#: plugin_ui.cc:125
+#: plugin_ui.cc:126
 msgid "unknown type of editor-supplying plugin"
 msgstr ""
 
-#: plugin_ui.cc:257
+#: plugin_ui.cc:258
 msgid ""
 "unknown type of editor-supplying plugin (note: no linuxVST support in this "
 "version of %1)"
 msgstr ""
 
-#: plugin_ui.cc:329
+#: plugin_ui.cc:330
 msgid "create_lv2_editor called on non-LV2 plugin"
 msgstr ""
 
@@ -8121,147 +9694,168 @@ msgstr ""
 msgid "Add"
 msgstr "Dodaj"
 
-#: plugin_ui.cc:422
+#: plugin_ui.cc:423
 msgid "Description"
 msgstr ""
 
-#: plugin_ui.cc:423
+#: plugin_ui.cc:424
 msgid "Plugin analysis"
 msgstr ""
 
-#: plugin_ui.cc:430
+#: plugin_ui.cc:431
 msgid ""
 "Presets (if any) for this plugin\n"
 "(Both factory and user-created)"
 msgstr ""
 
-#: plugin_ui.cc:431
+#: plugin_ui.cc:432
 msgid "Save a new preset"
 msgstr ""
 
-#: plugin_ui.cc:432
+#: plugin_ui.cc:433
 msgid "Save the current preset"
 msgstr ""
 
-#: plugin_ui.cc:433
+#: plugin_ui.cc:434
 msgid "Delete the current preset"
 msgstr ""
 
-#: plugin_ui.cc:434
+#: plugin_ui.cc:435
+msgid ""
+"Reset parameters to default (if no parameters are in automation play mode)"
+msgstr ""
+
+#: plugin_ui.cc:436
 msgid "Disable signal processing by the plugin"
 msgstr ""
 
-#: plugin_ui.cc:467 plugin_ui.cc:663
+#: plugin_ui.cc:473 plugin_ui.cc:681
 msgid ""
 "Click to allow the plugin to receive keyboard events that %1 would normally "
 "use as a shortcut"
 msgstr ""
 
-#: plugin_ui.cc:468
+#: plugin_ui.cc:474
 msgid "Click to enable/disable this plugin"
 msgstr ""
 
-#: plugin_ui.cc:507
+#: plugin_ui.cc:517
 msgid "latency (%1 sample)"
 msgid_plural "latency (%1 samples)"
 msgstr[0] ""
 msgstr[1] ""
 msgstr[2] ""
 
-#: plugin_ui.cc:509
+#: plugin_ui.cc:519
 msgid "latency (%1 ms)"
 msgstr ""
 
-#: plugin_ui.cc:520
+#: plugin_ui.cc:530
 msgid "Edit Latency"
 msgstr ""
 
-#: plugin_ui.cc:566
+#: plugin_ui.cc:576
 msgid ""
 "Plugin presets are not supported in this build of %1. Consider paying for a "
 "full version"
 msgstr ""
 
-#: plugin_ui.cc:574
+#: plugin_ui.cc:584
 msgid ""
 "Plugin presets are not supported in this build, see the Log window for more "
 "information."
 msgstr ""
 
-#: plugin_ui.cc:670
+#: plugin_ui.cc:592
+msgid "New Preset"
+msgstr ""
+
+#: plugin_ui.cc:688
 msgid "Click to allow normal use of %1 keyboard shortcuts"
 msgstr ""
 
-#: port_group.cc:337
-msgid "%1 Busses"
+#: plugin_ui.cc:785
+msgid "(none)"
 msgstr ""
 
 #: port_group.cc:338
-msgid "%1 Tracks"
+msgid "%1 Busses"
 msgstr ""
 
 #: port_group.cc:339
-msgid "Hardware"
+msgid "%1 Tracks"
 msgstr ""
 
 #: port_group.cc:340
-msgid "%1 Misc"
+msgid "Hardware"
 msgstr ""
 
 #: port_group.cc:341
+msgid "%1 Misc"
+msgstr ""
+
+#: port_group.cc:342
 msgid "Other"
 msgstr ""
 
-#: port_group.cc:432 port_group.cc:433
+#: port_group.cc:434 port_group.cc:435
 msgid "LTC Out"
 msgstr ""
 
-#: port_group.cc:436 port_group.cc:437
+#: port_group.cc:438 port_group.cc:439
 msgid "LTC In"
 msgstr ""
 
-#: port_group.cc:463
+#: port_group.cc:473
 msgid "MTC in"
 msgstr ""
 
-#: port_group.cc:466
+#: port_group.cc:476
 msgid "MIDI control in"
 msgstr ""
 
-#: port_group.cc:469
+#: port_group.cc:479
 msgid "MIDI clock in"
 msgstr ""
 
-#: port_group.cc:472
+#: port_group.cc:482
 msgid "MMC in"
 msgstr ""
 
-#: port_group.cc:476
+#: port_group.cc:486
 msgid "MTC out"
 msgstr ""
 
-#: port_group.cc:479
+#: port_group.cc:489
 msgid "MIDI control out"
 msgstr ""
 
-#: port_group.cc:482
+#: port_group.cc:492
 msgid "MIDI clock out"
 msgstr ""
 
-#: port_group.cc:485
+#: port_group.cc:495
 msgid "MMC out"
 msgstr ""
 
-#: port_group.cc:532
+#: port_group.cc:554
 msgid ":monitor"
 msgstr ""
 
-#: port_group.cc:544
+#: port_group.cc:570
 msgid "system:"
 msgstr ""
 
-#: port_group.cc:545
-msgid "alsa_pcm"
+#: port_group.cc:571
+msgid "alsa_pcm:"
+msgstr ""
+
+#: port_group.cc:572
+msgid "alsa_midi:"
+msgstr ""
+
+#: port_group.cc:577
+msgid "Scene "
 msgstr ""
 
 #: port_insert_ui.cc:39
@@ -8284,77 +9878,76 @@ msgstr ""
 msgid "Port Insert "
 msgstr ""
 
-#: port_matrix.cc:331 port_matrix.cc:357
+#: port_matrix.cc:341 port_matrix.cc:367
 msgid "<b>Sources</b>"
 msgstr ""
 
-#: port_matrix.cc:332 port_matrix.cc:358
+#: port_matrix.cc:342 port_matrix.cc:368
 msgid "<b>Destinations</b>"
 msgstr ""
 
-#: port_matrix.cc:440 port_matrix.cc:448
+#: port_matrix.cc:450 port_matrix.cc:458
 #, c-format
 msgid "Add %s %s"
 msgstr ""
 
-#: port_matrix.cc:456
+#: port_matrix.cc:466
 #, c-format
 msgid "Rename '%s'..."
 msgstr ""
 
-#: port_matrix.cc:472
+#: port_matrix.cc:482
 msgid "Remove all"
 msgstr ""
 
-#: port_matrix.cc:492 port_matrix.cc:504
+#: port_matrix.cc:502 port_matrix.cc:514
 #, c-format
 msgid "%s all"
 msgstr ""
 
-#: port_matrix.cc:527
+#: port_matrix.cc:537
 msgid "Rescan"
 msgstr "Skanuj ponownie"
 
-#: port_matrix.cc:529
+#: port_matrix.cc:539
 msgid "Show individual ports"
 msgstr ""
 
-#: port_matrix.cc:535
+#: port_matrix.cc:545
 msgid "Flip"
 msgstr ""
 
-#: port_matrix.cc:722
-msgid ""
-"It is not possible to add a port here, as the first processor in the track "
-"or buss cannot support the new configuration."
+#: port_matrix.cc:732
+msgid "It is not possible to add a port here."
 msgstr ""
 
-#: port_matrix.cc:725
+#: port_matrix.cc:733
 msgid "Cannot add port"
 msgstr ""
 
-#: port_matrix.cc:747
-msgid "Port removal not allowed"
+#: port_matrix.cc:757
+msgid "The last port cannot be removed"
 msgstr ""
 
-#: port_matrix.cc:748
-msgid ""
-"This port cannot be removed.\n"
-"Either the first plugin in the track or buss cannot accept\n"
-"the new number of inputs or the last plugin has more outputs."
+#: port_matrix.cc:760
+msgid "This port cannot be removed."
+msgstr ""
+
+#: port_matrix.cc:765
+msgid "Port removal not allowed"
 msgstr ""
 
-#: port_matrix.cc:965
+#: port_matrix.cc:981
 #, c-format
 msgid "Remove '%s'"
 msgstr ""
 
-#: port_matrix.cc:980
+#: port_matrix.cc:996
 #, c-format
 msgid "%s all from '%s'"
 msgstr ""
 
-#: port_matrix.cc:1046 transform_dialog.cc:62
+#: port_matrix.cc:1062 transform_dialog.cc:62
 msgid "channel"
 msgstr ""
 
@@ -8366,227 +9959,241 @@ msgstr ""
 msgid "There are no %1 ports to connect."
 msgstr ""
 
-#: processor_box.cc:150
-msgid "Send"
+#: processor_box.cc:226
+msgid "Return"
 msgstr ""
 
-#: processor_box.cc:152
-msgid "Return"
+#: processor_box.cc:323
+msgid "New Favorite Preset for \"%1\""
 msgstr ""
 
-#: processor_box.cc:310
+#: processor_box.cc:501
 msgid ""
 "\n"
 "This mono plugin has been replicated %1 times."
 msgstr ""
 
-#: processor_box.cc:314
+#: processor_box.cc:505 processor_box.cc:1527
 msgid ""
 "<b>%1</b>\n"
 "Double-click to show GUI.\n"
-"Alt+double-click to show generic GUI.%2"
+"%2+double-click to show generic GUI.%3"
 msgstr ""
 
-#: processor_box.cc:317
+#: processor_box.cc:508 processor_box.cc:1530
 msgid ""
 "<b>%1</b>\n"
 "Double-click to show generic GUI.%2"
 msgstr ""
 
-#: processor_box.cc:361
+#: processor_box.cc:514
+msgid ""
+"<b>%1</b>\n"
+"The Plugin is not available on this system\n"
+"and has been replaced by a stub."
+msgstr ""
+
+#: processor_box.cc:600
 #, c-format
 msgid "(%1x1) "
 msgstr ""
 
-#: processor_box.cc:437
+#: processor_box.cc:695
+msgid "Inline Display"
+msgstr ""
+
+#: processor_box.cc:703
 msgid "Show All Controls"
 msgstr ""
 
-#: processor_box.cc:441
+#: processor_box.cc:707
 msgid "Hide All Controls"
 msgstr ""
 
-#: processor_box.cc:475
+#: processor_box.cc:752
 msgid "Link panner controls"
 msgstr ""
 
-#: processor_box.cc:575
+#: processor_box.cc:859
 msgid "on"
 msgstr ""
 
-#: processor_box.cc:575 rc_option_editor.cc:2360 rc_option_editor.cc:2374
+#: processor_box.cc:859 rc_option_editor.cc:3178 rc_option_editor.cc:3192
 msgid "off"
 msgstr "wył"
 
-#: processor_box.cc:957
+#: processor_box.cc:1817
 msgid ""
 "Right-click to add/remove/edit\n"
 "plugins,inserts,sends and more"
 msgstr ""
 
-#: processor_box.cc:1429 processor_box.cc:1804
+#: processor_box.cc:1966
+msgid ""
+"Processor Drag/Drop failed. Probably because\n"
+"the I/O configuration of the plugins could\n"
+"not match the configuration of this track."
+msgstr ""
+
+#: processor_box.cc:2443 processor_box.cc:2986
 msgid "Plugin Incompatibility"
 msgstr ""
 
-#: processor_box.cc:1432
+#: processor_box.cc:2446
 msgid "You attempted to add the plugin \"%1\" in slot %2.\n"
 msgstr ""
 
-#: processor_box.cc:1438
+#: processor_box.cc:2452
 msgid ""
 "\n"
 "This plugin has:\n"
 msgstr ""
 
-#: processor_box.cc:1441
+#: processor_box.cc:2455
 msgid "\t%1 MIDI input\n"
 msgid_plural "\t%1 MIDI inputs\n"
 msgstr[0] ""
 msgstr[1] ""
 msgstr[2] ""
 
-#: processor_box.cc:1445
+#: processor_box.cc:2459
 msgid "\t%1 audio input\n"
 msgid_plural "\t%1 audio inputs\n"
 msgstr[0] ""
 msgstr[1] ""
 msgstr[2] ""
 
-#: processor_box.cc:1448
+#: processor_box.cc:2462
 msgid ""
 "\n"
 "but at the insertion point, there are:\n"
 msgstr ""
 
-#: processor_box.cc:1451
+#: processor_box.cc:2465
 msgid "\t%1 MIDI channel\n"
 msgid_plural "\t%1 MIDI channels\n"
 msgstr[0] ""
 msgstr[1] ""
 msgstr[2] ""
 
-#: processor_box.cc:1455
+#: processor_box.cc:2469
 msgid "\t%1 audio channel\n"
 msgid_plural "\t%1 audio channels\n"
 msgstr[0] ""
 msgstr[1] ""
 msgstr[2] ""
 
-#: processor_box.cc:1458
+#: processor_box.cc:2472
 msgid ""
 "\n"
 "%1 is unable to insert this plugin here.\n"
 msgstr ""
 
-#: processor_box.cc:1495
-msgid "Cannot set up new send: %1"
-msgstr ""
-
-#: processor_box.cc:1807
+#: processor_box.cc:2989
 msgid ""
 "You cannot reorder these plugins/sends/inserts\n"
 "in that way because the inputs and\n"
 "outputs will not work correctly."
 msgstr ""
 
-#: processor_box.cc:1991
+#: processor_box.cc:3189
 msgid "Rename Processor"
 msgstr ""
 
-#: processor_box.cc:2022
+#: processor_box.cc:3220
 msgid "At least 100 IO objects exist with a name like %1 - name not changed"
 msgstr ""
 
-#: processor_box.cc:2159
+#: processor_box.cc:3371
 msgid "plugin insert constructor failed"
 msgstr ""
 
-#: processor_box.cc:2170
+#: processor_box.cc:3382
 msgid ""
 "Copying the set of processors on the clipboard failed,\n"
 "probably because the I/O configuration of the plugins\n"
 "could not match the configuration of this track."
 msgstr ""
 
-#: processor_box.cc:2216
+#: processor_box.cc:3428
 msgid ""
 "Do you really want to remove all processors from %1?\n"
 "(this cannot be undone)"
 msgstr ""
 
-#: processor_box.cc:2220 processor_box.cc:2245
+#: processor_box.cc:3432 processor_box.cc:3457
 msgid "Yes, remove them all"
 msgstr "Tak, usuń je wszystkie"
 
-#: processor_box.cc:2222 processor_box.cc:2247
+#: processor_box.cc:3434 processor_box.cc:3459
 msgid "Remove processors"
 msgstr ""
 
-#: processor_box.cc:2237
+#: processor_box.cc:3449
 msgid ""
 "Do you really want to remove all pre-fader processors from %1?\n"
 "(this cannot be undone)"
 msgstr ""
 
-#: processor_box.cc:2240
+#: processor_box.cc:3452
 msgid ""
 "Do you really want to remove all post-fader processors from %1?\n"
 "(this cannot be undone)"
 msgstr ""
 
-#: processor_box.cc:2428
+#: processor_box.cc:3641
 msgid "New Plugin"
 msgstr ""
 
-#: processor_box.cc:2431
+#: processor_box.cc:3644
 msgid "New Insert"
 msgstr "Nowy przysył"
 
-#: processor_box.cc:2434
+#: processor_box.cc:3647
 msgid "New External Send ..."
 msgstr ""
 
-#: processor_box.cc:2438
+#: processor_box.cc:3651
 msgid "New Aux Send ..."
 msgstr ""
 
-#: processor_box.cc:2441
+#: processor_box.cc:3654
 msgid "Send Options"
 msgstr ""
 
-#: processor_box.cc:2443
+#: processor_box.cc:3656
 msgid "Clear (all)"
 msgstr ""
 
-#: processor_box.cc:2445
+#: processor_box.cc:3658
 msgid "Clear (pre-fader)"
 msgstr ""
 
-#: processor_box.cc:2447
+#: processor_box.cc:3660
 msgid "Clear (post-fader)"
 msgstr ""
 
-#: processor_box.cc:2473
+#: processor_box.cc:3690
 msgid "Activate All"
 msgstr "WÅ‚Ä…cz wszystko"
 
-#: processor_box.cc:2475
+#: processor_box.cc:3692
 msgid "Deactivate All"
 msgstr ""
 
-#: processor_box.cc:2477
+#: processor_box.cc:3694
 msgid "A/B Plugins"
 msgstr ""
 
-#: processor_box.cc:2486
+#: processor_box.cc:3707
 msgid "Edit with generic controls..."
 msgstr ""
 
-#: processor_box.cc:2789
+#: processor_box.cc:4039
 msgid "%1: %2 (by %3)"
 msgstr ""
 
-#: processor_box.cc:2791
+#: processor_box.cc:4041
 msgid "%1 (by %2)"
 msgstr ""
 
@@ -8614,345 +10221,444 @@ msgstr ""
 msgid "main grid"
 msgstr ""
 
-#: quantize_dialog.cc:52 quantize_dialog.cc:109
+#: quantize_dialog.cc:61 quantize_dialog.cc:118
 msgid "Quantize"
 msgstr ""
 
-#: quantize_dialog.cc:56
+#: quantize_dialog.cc:65
 msgid "Strength"
 msgstr ""
 
-#: quantize_dialog.cc:59
+#: quantize_dialog.cc:68
 msgid "Swing"
 msgstr ""
 
-#: quantize_dialog.cc:62
+#: quantize_dialog.cc:71
 msgid "Threshold (ticks)"
 msgstr ""
 
-#: quantize_dialog.cc:63
+#: quantize_dialog.cc:72
 msgid "Snap note start"
 msgstr ""
 
-#: quantize_dialog.cc:64
+#: quantize_dialog.cc:73
 msgid "Snap note end"
 msgstr ""
 
-#: rc_option_editor.cc:77
-msgid "Click audio file:"
+#: rc_option_editor.cc:83 rc_option_editor.cc:84 rc_option_editor.cc:1550
+msgid "Browse..."
 msgstr ""
 
-#: rc_option_editor.cc:80 rc_option_editor.cc:87
-msgid "Browse..."
+#: rc_option_editor.cc:89
+msgid "Emphasis on first beat:"
+msgstr ""
+
+#: rc_option_editor.cc:95
+msgid "Use default Click:"
 msgstr ""
 
-#: rc_option_editor.cc:84
+#: rc_option_editor.cc:101
+msgid "Click audio file:"
+msgstr ""
+
+#: rc_option_editor.cc:108
 msgid "Click emphasis audio file:"
 msgstr ""
 
-#: rc_option_editor.cc:116
+#: rc_option_editor.cc:154
 msgid "Choose Click"
 msgstr "Wybór dźwięku"
 
-#: rc_option_editor.cc:139
+#: rc_option_editor.cc:177
 msgid "Choose Click Emphasis"
 msgstr "Wybór dźwięku akcentowanego uderzenia"
 
-#: rc_option_editor.cc:170
+#: rc_option_editor.cc:238
 msgid "Limit undo history to"
 msgstr ""
 
-#: rc_option_editor.cc:171
+#: rc_option_editor.cc:239
 msgid "Save undo history of"
 msgstr ""
 
-#: rc_option_editor.cc:180 rc_option_editor.cc:187
+#: rc_option_editor.cc:248 rc_option_editor.cc:255
 msgid "commands"
 msgstr ""
 
-#: rc_option_editor.cc:325
+#: rc_option_editor.cc:378
+msgid ""
+"\n"
+"Changes to this setting will only persist after your project has been saved."
+msgstr ""
+
+#: rc_option_editor.cc:389 rc_option_editor.cc:451
+msgid "<b>Recommended Setting: %1 + button 3 (right mouse button)</b>%2"
+msgstr ""
+
+#: rc_option_editor.cc:403
+msgid "Select Keyboard layout:"
+msgstr ""
+
+#: rc_option_editor.cc:422
+msgid "When Clicking:"
+msgstr ""
+
+#: rc_option_editor.cc:429
 msgid "Edit using:"
 msgstr ""
 
-#: rc_option_editor.cc:331 rc_option_editor.cc:357 rc_option_editor.cc:384
+#: rc_option_editor.cc:435 rc_option_editor.cc:465 rc_option_editor.cc:495
 msgid "+ button"
 msgstr "i przycisk:"
 
-#: rc_option_editor.cc:351
+#: rc_option_editor.cc:459
 msgid "Delete using:"
 msgstr ""
 
-#: rc_option_editor.cc:378
+#: rc_option_editor.cc:481
+msgid "<b>Recommended Setting: %1 + button 1 (left mouse button)</b>%2"
+msgstr ""
+
+#: rc_option_editor.cc:489
 msgid "Insert note using:"
 msgstr ""
 
-#: rc_option_editor.cc:405
-msgid "Ignore snap using:"
+#: rc_option_editor.cc:507
+msgid "When Beginning a Drag:"
 msgstr ""
 
-#: rc_option_editor.cc:421
-msgid "Keyboard layout:"
+#: rc_option_editor.cc:518 rc_option_editor.cc:545 rc_option_editor.cc:578
+#: rc_option_editor.cc:599 rc_option_editor.cc:643 rc_option_editor.cc:676
+#: rc_option_editor.cc:702 rc_option_editor.cc:730 rc_option_editor.cc:759
+#: rc_option_editor.cc:781
+msgid "<b>Recommended Setting: %1</b>%2"
 msgstr ""
 
-#: rc_option_editor.cc:544
-msgid "Font scaling:"
+#: rc_option_editor.cc:532
+msgid "Copy items using:"
 msgstr ""
 
-#: rc_option_editor.cc:547
-msgid "Default"
+#: rc_option_editor.cc:559
+msgid "Constrain drag using:"
 msgstr ""
 
-#: rc_option_editor.cc:573
-msgid "Major font-scale changes require an application restart to re-layout."
+#: rc_option_editor.cc:567
+msgid "When Beginning a Trim:"
 msgstr ""
 
-#: rc_option_editor.cc:614
-msgid "Waveform Clip Level (dBFS):"
+#: rc_option_editor.cc:586
+msgid "Trim contents using:"
 msgstr ""
 
-#: rc_option_editor.cc:666
-msgid "Playback (seconds of buffering):"
+#: rc_option_editor.cc:607
+msgid "Anchored trim using:"
 msgstr ""
 
-#: rc_option_editor.cc:679
-msgid "Recording (seconds of buffering):"
+#: rc_option_editor.cc:651
+msgid "Resize notes relatively using:"
 msgstr ""
 
-#: rc_option_editor.cc:737
-msgid "Control Surface Protocol"
+#: rc_option_editor.cc:660
+msgid "While Dragging:"
 msgstr ""
 
-#: rc_option_editor.cc:746
-msgid "Double-click on a name to edit settings for an enabled protocol"
+#: rc_option_editor.cc:684
+msgid "Ignore snap using:"
 msgstr ""
 
-#: rc_option_editor.cc:903
-msgid "Show Video Export Info before export"
+#: rc_option_editor.cc:710
+msgid "Snap relatively using:"
 msgstr ""
 
-#: rc_option_editor.cc:904
-msgid "Show Video Server Startup Dialog"
+#: rc_option_editor.cc:718
+msgid "While Trimming:"
 msgstr ""
 
-#: rc_option_editor.cc:905
-msgid "Advanced Setup (remote video server)"
+#: rc_option_editor.cc:738
+msgid "Resize overlapped regions using:"
 msgstr ""
 
-#: rc_option_editor.cc:913
-msgid ""
-"<b>When enabled</b> you can speficify a custom video-server URL and docroot. "
-"- Do not enable this option unless you know what you are doing."
+#: rc_option_editor.cc:746
+msgid "While Dragging Control Points:"
 msgstr ""
 
-#: rc_option_editor.cc:915
-msgid "Video Server URL:"
+#: rc_option_editor.cc:767
+msgid "Fine adjust using:"
 msgstr ""
 
-#: rc_option_editor.cc:920
-msgid ""
-"Base URL of the video-server including http prefix. This is usually 'http://"
-"hostname.example.org:1554/' and defaults to 'http://localhost:1554/' when "
-"the video-server is running locally"
+#: rc_option_editor.cc:789
+msgid "Push points using:"
 msgstr ""
 
-#: rc_option_editor.cc:922
-msgid "Video Folder:"
+#: rc_option_editor.cc:1029
+msgid "GUI and Font scaling:"
 msgstr ""
 
-#: rc_option_editor.cc:927
-msgid ""
-"Local path to the video-server document-root. Only files below this "
-"directory will be accessible by the video-server. If the server run on a "
-"remote host, it should point to a network mounted folder of the server's "
-"docroot or be left empty if it is unvailable. It is used for the local video-"
-"monitor and file-browsing when opening/adding a video file."
+#: rc_option_editor.cc:1032
+msgid "Default"
 msgstr ""
 
-#: rc_option_editor.cc:934
-msgid ""
-"<b>When enabled</b> an information window with details is displayed before "
-"the video-export dialog."
+#: rc_option_editor.cc:1058
+msgid "Adjusting the scale requires an application restart to re-layout."
 msgstr ""
 
-#: rc_option_editor.cc:939
-msgid ""
-"<b>When enabled</b> the video server is never launched automatically without "
-"confirmation"
+#: rc_option_editor.cc:1100
+msgid "∞"
 msgstr ""
 
-#: rc_option_editor.cc:1022
-msgid "Always Display Plugin Scan Progress"
+#: rc_option_editor.cc:1101
+msgid "30 sec"
 msgstr ""
 
-#: rc_option_editor.cc:1023
-msgid "Scan for [new] VST Plugins on Application Start"
+#: rc_option_editor.cc:1102
+msgid "1 min"
 msgstr ""
 
-#: rc_option_editor.cc:1024
-msgid "Scan for AudioUnit Plugins on Application Start"
+#: rc_option_editor.cc:1103
+msgid "2 mins"
 msgstr ""
 
-#: rc_option_editor.cc:1035
-msgid "General"
+#: rc_option_editor.cc:1104
+msgid "3 mins"
 msgstr ""
 
-#: rc_option_editor.cc:1041
-msgid "Scan for Plugins"
+#: rc_option_editor.cc:1105
+msgid "4 mins"
 msgstr ""
 
-#: rc_option_editor.cc:1048
-msgid ""
-"<b>When enabled</b> a popup window showing plugin scan progress is displayed "
-"for indexing (cache load) and discovery (detect new plugins)"
+#: rc_option_editor.cc:1106
+msgid "5 mins"
 msgstr ""
 
-#: rc_option_editor.cc:1055
+#: rc_option_editor.cc:1109
 msgid ""
-"Specify the default timeout for plugin instantiation in 1/10 seconds. "
-"Plugins that require more time to load will be blacklisted. A value of 0 "
-"disables the timeout."
+"Specify the default timeout for plugin instantiation. Plugins that require "
+"more time to load will be blacklisted. A value of 0 disables the timeout."
 msgstr ""
 
-#: rc_option_editor.cc:1057
-msgid "Scan Time Out [deciseconds]"
+#: rc_option_editor.cc:1111
+msgid "Scan Time Out:"
 msgstr ""
 
-#: rc_option_editor.cc:1065
-msgid "VST"
+#: rc_option_editor.cc:1159
+msgid "Waveform Clip Level (dBFS):"
 msgstr ""
 
-#: rc_option_editor.cc:1071
-msgid "Clear VST Cache"
+#: rc_option_editor.cc:1212
+msgid "Small sessions (4-16 tracks)"
 msgstr ""
 
-#: rc_option_editor.cc:1075
-msgid "Clear VST Blacklist"
+#: rc_option_editor.cc:1213
+msgid "Medium sessions (16-64 tracks)"
 msgstr ""
 
-#: rc_option_editor.cc:1083
-msgid ""
-"<b>When enabled</b> new VST plugins are searched, tested and added to the "
-"cache index on application start. When disabled new plugins will only be "
-"available after triggering a 'Scan' manually"
+#: rc_option_editor.cc:1214
+msgid "Large sessions (64+ tracks)"
 msgstr ""
 
-#: rc_option_editor.cc:1086
-msgid "Linux VST Path:"
+#: rc_option_editor.cc:1215
+msgid "Custom (set by sliders below)"
 msgstr ""
 
-#: rc_option_editor.cc:1093
-msgid "Windows VST Path:"
+#: rc_option_editor.cc:1219 export_video_dialog.cc:167
+msgid "Preset:"
 msgstr ""
 
-#: rc_option_editor.cc:1102
-msgid "Audio Unit"
+#: rc_option_editor.cc:1231
+msgid "Playback (seconds of buffering):"
 msgstr ""
 
-#: rc_option_editor.cc:1111
-msgid ""
-"<b>When enabled</b> Audio Unit Plugins are discovered on application start. "
-"When disabled AU plugins will only be available after triggering a 'Scan' "
-"manually. The first successful scan will enable AU auto-scan, Any crash "
-"during plugin discovery will disable it."
+#: rc_option_editor.cc:1244
+msgid "Recording (seconds of buffering):"
 msgstr ""
 
-#: rc_option_editor.cc:1114
-msgid "Clear AU Cache"
+#: rc_option_editor.cc:1322
+msgid "programming error: unknown buffering preset string, index = %1"
 msgstr ""
 
-#: rc_option_editor.cc:1118
-msgid "Clear AU Blacklist"
+#: rc_option_editor.cc:1353
+msgid "Control Surface Protocol"
 msgstr ""
 
-#: rc_option_editor.cc:1201
-msgid "Set Windows VST Search Path"
+#: rc_option_editor.cc:1367
+msgid ""
+"Click to edit the settings for selected protocol ( it must be ENABLED "
+"first ):"
 msgstr ""
 
-#: rc_option_editor.cc:1216
-msgid "Set Linux VST Search Path"
+#: rc_option_editor.cc:1371
+msgid "Show Protocol Settings"
+msgstr ""
+
+#: rc_option_editor.cc:1494
+msgid "Configuration"
+msgstr ""
+
+#: rc_option_editor.cc:1547
+msgid "Show Video Export Info before export"
+msgstr ""
+
+#: rc_option_editor.cc:1548
+msgid "Show Video Server Startup Dialog"
+msgstr ""
+
+#: rc_option_editor.cc:1549
+msgid "Advanced Setup (remote video server)"
+msgstr ""
+
+#: rc_option_editor.cc:1556
+msgid "Video Server"
+msgstr ""
+
+#: rc_option_editor.cc:1565
+msgid ""
+"<b>When enabled</b> you can speficify a custom video-server URL and docroot. "
+"- Do not enable this option unless you know what you are doing."
+msgstr ""
+
+#: rc_option_editor.cc:1567
+msgid "Video Server URL:"
+msgstr ""
+
+#: rc_option_editor.cc:1572
+msgid ""
+"Base URL of the video-server including http prefix. This is usually 'http://"
+"hostname.example.org:1554/' and defaults to 'http://localhost:1554/' when "
+"the video-server is running locally"
+msgstr ""
+
+#: rc_option_editor.cc:1574
+msgid "Video Folder:"
+msgstr ""
+
+#: rc_option_editor.cc:1579
+msgid ""
+"Local path to the video-server document-root. Only files below this "
+"directory will be accessible by the video-server. If the server run on a "
+"remote host, it should point to a network mounted folder of the server's "
+"docroot or be left empty if it is unvailable. It is used for the local video-"
+"monitor and file-browsing when opening/adding a video file."
+msgstr ""
+
+#: rc_option_editor.cc:1584
+msgid ""
+"<b>When enabled</b> an information window with details is displayed before "
+"the video-export dialog."
+msgstr ""
+
+#: rc_option_editor.cc:1589
+msgid ""
+"<b>When enabled</b> the video server is never launched automatically without "
+"confirmation"
+msgstr ""
+
+#: rc_option_editor.cc:1598
+msgid "Custom Path to Video Monitor (%1) - leave empty for default:"
+msgstr ""
+
+#: rc_option_editor.cc:1610
+msgid ""
+"Set a custom path to the Video Monitor Executable, changing this requires a "
+"restart."
+msgstr ""
+
+#: rc_option_editor.cc:1661
+msgid "Set Video Monitor Executable"
+msgstr ""
+
+#: rc_option_editor.cc:1734
+msgid "Column %1"
 msgstr ""
 
-#: rc_option_editor.cc:1297
+#: rc_option_editor.cc:1852
 msgid "%1 Preferences"
 msgstr ""
 
-#: rc_option_editor.cc:1309
+#: rc_option_editor.cc:1874
 msgid "DSP CPU Utilization"
 msgstr ""
 
-#: rc_option_editor.cc:1313
+#: rc_option_editor.cc:1878
 msgid "Signal processing uses"
 msgstr ""
 
-#: rc_option_editor.cc:1318
+#: rc_option_editor.cc:1883
 msgid "all but one processor"
 msgstr ""
 
-#: rc_option_editor.cc:1319
+#: rc_option_editor.cc:1884
 msgid "all available processors"
 msgstr ""
 
-#: rc_option_editor.cc:1322
+#: rc_option_editor.cc:1887
 msgid "%1 processors"
 msgstr ""
 
-#: rc_option_editor.cc:1325
+#: rc_option_editor.cc:1890
 msgid "This setting will only take effect when %1 is restarted."
 msgstr ""
 
-#: rc_option_editor.cc:1330
+#: rc_option_editor.cc:1895
 msgid "Options|Undo"
 msgstr ""
 
-#: rc_option_editor.cc:1337
+#: rc_option_editor.cc:1902
 msgid "Verify removal of last capture"
 msgstr ""
 
-#: rc_option_editor.cc:1345
-msgid "Make periodic backups of the session file"
+#: rc_option_editor.cc:1907
+msgid "Session Management"
 msgstr ""
 
-#: rc_option_editor.cc:1350
-msgid "Session Management"
+#: rc_option_editor.cc:1912
+msgid "Make periodic backups of the session file"
 msgstr ""
 
-#: rc_option_editor.cc:1355
+#: rc_option_editor.cc:1920
 msgid "Always copy imported files"
 msgstr "Kopiowanie importowanych plików"
 
-#: rc_option_editor.cc:1362
+#: rc_option_editor.cc:1927
 msgid "Default folder for new sessions:"
 msgstr ""
 
-#: rc_option_editor.cc:1370
+#: rc_option_editor.cc:1935
 msgid "Maximum number of recent sessions"
 msgstr ""
 
-#: rc_option_editor.cc:1383
+#: rc_option_editor.cc:1941 rc_option_editor.cc:1943 rc_option_editor.cc:1945
+msgid "Misc/Click"
+msgstr ""
+
+#: rc_option_editor.cc:1948
 msgid "Click gain level"
 msgstr ""
 
-#: rc_option_editor.cc:1388 route_time_axis.cc:266 route_time_axis.cc:821
+#: rc_option_editor.cc:1953 route_time_axis.cc:277 route_time_axis.cc:831
 msgid "Automation"
 msgstr "Automatyka"
 
-#: rc_option_editor.cc:1393
+#: rc_option_editor.cc:1958
 msgid "Thinning factor (larger value => less data)"
 msgstr ""
 
-#: rc_option_editor.cc:1402
+#: rc_option_editor.cc:1967
 msgid "Automation sampling interval (milliseconds)"
 msgstr ""
 
-#: rc_option_editor.cc:1414
+#: rc_option_editor.cc:1975
+msgid "Transport Options"
+msgstr ""
+
+#: rc_option_editor.cc:1981
 msgid "Keep record-enable engaged on stop"
 msgstr ""
 
-#: rc_option_editor.cc:1423
+#: rc_option_editor.cc:1990
 msgid "Play loop is a transport mode"
 msgstr ""
 
-#: rc_option_editor.cc:1428
+#: rc_option_editor.cc:1995
 msgid ""
 "<b>When enabled</b> the loop button does not start playback but forces "
 "playback to always play the loop\n"
@@ -8961,25 +10667,25 @@ msgid ""
 "cancels loop playback"
 msgstr ""
 
-#: rc_option_editor.cc:1434
+#: rc_option_editor.cc:2001
 msgid "Stop recording when an xrun occurs"
 msgstr ""
 
-#: rc_option_editor.cc:1439
+#: rc_option_editor.cc:2006
 msgid ""
 "<b>When enabled</b> %1 will stop recording if an over- or underrun is "
 "detected by the audio engine"
 msgstr ""
 
-#: rc_option_editor.cc:1445
+#: rc_option_editor.cc:2012
 msgid "Create markers where xruns occur"
 msgstr ""
 
-#: rc_option_editor.cc:1454
+#: rc_option_editor.cc:2021
 msgid "Stop at the end of the session"
 msgstr ""
 
-#: rc_option_editor.cc:1459
+#: rc_option_editor.cc:2026
 msgid ""
 "<b>When enabled</b> if %1 is <b>not recording</b>, it will stop the "
 "transport when it reaches the current session end marker\n"
@@ -8988,11 +10694,11 @@ msgid ""
 "all times"
 msgstr ""
 
-#: rc_option_editor.cc:1467
+#: rc_option_editor.cc:2034
 msgid "Do seamless looping (not possible when slaved to MTC, LTC etc)"
 msgstr ""
 
-#: rc_option_editor.cc:1472
+#: rc_option_editor.cc:2039
 msgid ""
 "<b>When enabled</b> this will loop by reading ahead and wrapping around at "
 "the loop point, preventing any need to do a transport locate at the end of "
@@ -9002,39 +10708,83 @@ msgid ""
 "loop when %1 reaches the end which will often cause a small click or delay"
 msgstr ""
 
-#: rc_option_editor.cc:1480
+#: rc_option_editor.cc:2047
 msgid "Disable per-track record disarm while rolling"
 msgstr ""
 
-#: rc_option_editor.cc:1484
+#: rc_option_editor.cc:2051
 msgid ""
 "<b>When enabled</b> this will prevent you from accidentally stopping "
 "specific tracks recording during a take"
 msgstr ""
 
-#: rc_option_editor.cc:1489
+#: rc_option_editor.cc:2056
 msgid "12dB gain reduction during fast-forward and fast-rewind"
 msgstr ""
 
-#: rc_option_editor.cc:1493
+#: rc_option_editor.cc:2060
 msgid ""
 "This will reduce the unpleasant increase in perceived volume that occurs "
 "when fast-forwarding or rewinding through some kinds of audio"
 msgstr ""
 
-#: rc_option_editor.cc:1497
-msgid "Sync/Slave"
+#: rc_option_editor.cc:2066
+msgid "Preroll"
 msgstr ""
 
-#: rc_option_editor.cc:1501
+#: rc_option_editor.cc:2071
+msgid ""
+"The amount of preroll (in seconds) to apply when <b>Play with Preroll</b> is "
+"initiated.\n"
+"\n"
+"If <b>Follow Edits</b> is enabled, the preroll is applied to the playhead "
+"position when a region is selected or trimmed."
+msgstr ""
+
+#: rc_option_editor.cc:2073
+msgid "0 (no pre-roll)"
+msgstr ""
+
+#: rc_option_editor.cc:2074
+msgid "0.1 second"
+msgstr ""
+
+#: rc_option_editor.cc:2075
+msgid "0.25 second"
+msgstr ""
+
+#: rc_option_editor.cc:2076
+msgid "0.5 second"
+msgstr ""
+
+#: rc_option_editor.cc:2077
+msgid "1.0 second"
+msgstr ""
+
+#: rc_option_editor.cc:2078
+msgid "2.0 seconds"
+msgstr ""
+
+#: rc_option_editor.cc:2081 rc_option_editor.cc:2090 rc_option_editor.cc:2106
+#: rc_option_editor.cc:2127 rc_option_editor.cc:2145 rc_option_editor.cc:2147
+#: rc_option_editor.cc:2164 rc_option_editor.cc:2167 rc_option_editor.cc:2169
+#: rc_option_editor.cc:2197
+msgid "Transport/Sync"
+msgstr ""
+
+#: rc_option_editor.cc:2081
+msgid "Synchronization and Slave Options"
+msgstr ""
+
+#: rc_option_editor.cc:2085
 msgid "External timecode source"
 msgstr ""
 
-#: rc_option_editor.cc:1510
+#: rc_option_editor.cc:2094
 msgid "Match session video frame rate to external timecode"
 msgstr ""
 
-#: rc_option_editor.cc:1516
+#: rc_option_editor.cc:2100
 msgid ""
 "This option controls the value of the video frame rate <i>while chasing</i> "
 "an external timecode source.\n"
@@ -9048,27 +10798,27 @@ msgid ""
 "external timecode standard and the session standard."
 msgstr ""
 
-#: rc_option_editor.cc:1526
-msgid "Sync lock timecode to clock - Disable drift compensation."
+#: rc_option_editor.cc:2110
+msgid "Sync-lock timecode to clock (disable drift compensation)"
 msgstr ""
 
-#: rc_option_editor.cc:1532
+#: rc_option_editor.cc:2116
 msgid ""
 "<b>When enabled</b> %1 will never varispeed when slaved to external "
 "timecode. Sync Lock indicates that the selected external timecode source "
 "shares clock-sync (Black & Burst, Wordclock, etc) with the audio "
 "interface. This option disables drift compensation. The transport speed is "
-"fixed at 1.0.Varispeed LTC will be ignored and cause drift.\n"
+"fixed at 1.0. Vari-speed LTC will be ignored and cause drift.\n"
 "\n"
 "<b>When disabled</b> %1 will compensate for potential drift, regardless if "
 "the timecode sources shares clock sync."
 msgstr ""
 
-#: rc_option_editor.cc:1547
+#: rc_option_editor.cc:2131
 msgid "Lock to 29.9700 fps instead of 30000/1001"
 msgstr ""
 
-#: rc_option_editor.cc:1553
+#: rc_option_editor.cc:2137
 msgid ""
 "<b>When enabled</b> the external timecode source is assumed to use 29.97 fps "
 "instead of 30000/1001.\n"
@@ -9081,659 +10831,926 @@ msgid ""
 "variant of using exactly 29.97 fps has zero timecode drift.\n"
 msgstr ""
 
-#: rc_option_editor.cc:1563
+#: rc_option_editor.cc:2147
 msgid "LTC Reader"
 msgstr ""
 
-#: rc_option_editor.cc:1567
+#: rc_option_editor.cc:2151
 msgid "LTC incoming port"
 msgstr ""
 
-#: rc_option_editor.cc:1582
+#: rc_option_editor.cc:2167
 msgid "LTC Generator"
 msgstr ""
 
-#: rc_option_editor.cc:1587
+#: rc_option_editor.cc:2172
 msgid "Enable LTC generator"
 msgstr ""
 
-#: rc_option_editor.cc:1594
+#: rc_option_editor.cc:2179
 msgid "Send LTC while stopped"
 msgstr ""
 
-#: rc_option_editor.cc:1600
+#: rc_option_editor.cc:2185
 msgid ""
 "<b>When enabled</b> %1 will continue to send LTC information even when the "
 "transport (playhead) is not moving"
 msgstr ""
 
-#: rc_option_editor.cc:1606
+#: rc_option_editor.cc:2191
 msgid "LTC generator level"
 msgstr ""
 
-#: rc_option_editor.cc:1610
+#: rc_option_editor.cc:2195
 msgid ""
 "Specify the Peak Volume of the generated LTC signal in dbFS. A good value "
 "is  0dBu ^= -18dbFS in an EBU calibrated system"
 msgstr ""
 
-#: rc_option_editor.cc:1622
-msgid "Allow dragging of playhead"
+#: rc_option_editor.cc:2204
+msgid "Make rubberband selection rectangle snap to the grid"
 msgstr ""
 
-#: rc_option_editor.cc:1630
-msgid "Move relevant automation when audio regions are moved"
+#: rc_option_editor.cc:2211
+msgid "Name new markers"
 msgstr ""
 
-#: rc_option_editor.cc:1638
-msgid "Show meters on tracks in the editor"
+#: rc_option_editor.cc:2216
+msgid ""
+"If enabled, popup a dialog when a new marker is created to allow its name to "
+"be set as it is created.\n"
+"\n"
+"You can always rename markers by right-clicking on them"
+msgstr ""
+
+#: rc_option_editor.cc:2222
+msgid "Allow dragging of playhead"
 msgstr ""
 
-#: rc_option_editor.cc:1646
+#: rc_option_editor.cc:2230
 msgid "Display master-meter in the toolbar"
 msgstr ""
 
-#: rc_option_editor.cc:1653
-msgid "Default fade shape"
+#: rc_option_editor.cc:2239
+msgid "Show zoom toolbar (if torn off)"
 msgstr ""
 
-#: rc_option_editor.cc:1672
-msgid "Regions in active edit groups are edited together"
+#: rc_option_editor.cc:2247
+msgid ""
+"Always use mouse cursor position as zoom focus when zooming using mouse "
+"scroll wheel"
 msgstr ""
 
-#: rc_option_editor.cc:1673
-msgid "whenever they overlap in time"
+#: rc_option_editor.cc:2256
+msgid "Update editor window during drags of the summary"
 msgstr ""
 
-#: rc_option_editor.cc:1674
-msgid "only if they have identical length, position and origin"
+#: rc_option_editor.cc:2264
+msgid "Auto-scroll editor window when dragging near its edges"
 msgstr ""
 
-#: rc_option_editor.cc:1684
-msgid "Make rubberband selection rectangle snap to the grid"
+#: rc_option_editor.cc:2272
+msgid "Show gain envelopes in audio regions"
 msgstr ""
 
-#: rc_option_editor.cc:1692
-msgid "Show waveforms in regions"
+#: rc_option_editor.cc:2273
+msgid "in all modes"
 msgstr ""
 
-#: rc_option_editor.cc:1700
-msgid "Show gain envelopes in audio regions"
+#: rc_option_editor.cc:2274
+msgid "only in Draw and Internal Edit modes"
 msgstr ""
 
-#: rc_option_editor.cc:1701
-msgid "in all modes"
+#: rc_option_editor.cc:2279
+msgid "Editor Behavior"
 msgstr ""
 
-#: rc_option_editor.cc:1702
-msgid "only in region gain mode"
+#: rc_option_editor.cc:2284
+msgid "Move relevant automation when audio regions are moved"
 msgstr ""
 
-#: rc_option_editor.cc:1709
-msgid "Waveform scale"
+#: rc_option_editor.cc:2291
+msgid "Default fade shape"
 msgstr ""
 
-#: rc_option_editor.cc:1714
-msgid "linear"
-msgstr "linearna"
+#: rc_option_editor.cc:2310
+msgid "Regions in active edit groups are edited together"
+msgstr ""
 
-#: rc_option_editor.cc:1715
-msgid "logarithmic"
+#: rc_option_editor.cc:2311
+msgid "whenever they overlap in time"
 msgstr ""
 
-#: rc_option_editor.cc:1721
-msgid "Waveform shape"
+#: rc_option_editor.cc:2312
+msgid "only if they have identical length, position and origin"
 msgstr ""
 
-#: rc_option_editor.cc:1726
-msgid "traditional"
+#: rc_option_editor.cc:2321
+msgid "Layering model"
 msgstr ""
 
-#: rc_option_editor.cc:1727
-msgid "rectified"
+#: rc_option_editor.cc:2326
+msgid "later is higher"
 msgstr ""
 
-#: rc_option_editor.cc:1736
-msgid "Show waveforms for audio while it is being recorded"
+#: rc_option_editor.cc:2327
+msgid "manual layering"
 msgstr ""
 
-#: rc_option_editor.cc:1744
-msgid "Show zoom toolbar"
+#: rc_option_editor.cc:2332
+msgid "After splitting selected regions, select"
 msgstr ""
 
-#: rc_option_editor.cc:1752
-msgid "Update editor window during drags of the summary"
+#: rc_option_editor.cc:2337
+msgid "no regions"
 msgstr ""
 
-#: rc_option_editor.cc:1760
-msgid "Synchronise editor and mixer selection"
+#: rc_option_editor.cc:2340
+msgid "newly-created regions"
 msgstr ""
 
-#: rc_option_editor.cc:1767
-msgid "Name new markers"
+#: rc_option_editor.cc:2344
+msgid "existing selection and newly-created regions"
 msgstr ""
 
-#: rc_option_editor.cc:1773
-msgid ""
-"If enabled, popup a dialog when a new marker is created to allow its name to "
-"be set as it is created.\n"
-"\n"
-"You can always rename markers by right-clicking on them"
+#: rc_option_editor.cc:2348 rc_option_editor.cc:2351 rc_option_editor.cc:2360
+#: rc_option_editor.cc:2378 rc_option_editor.cc:2390 rc_option_editor.cc:2392
+msgid "Editor/Waveforms"
 msgstr ""
 
-#: rc_option_editor.cc:1779
-msgid "Auto-scroll editor window when dragging near its edges"
+#: rc_option_editor.cc:2348
+msgid "Waveforms"
 msgstr ""
 
-#: rc_option_editor.cc:1786
-msgid "After splitting selected regions, select"
+#: rc_option_editor.cc:2354
+msgid "Show waveforms in regions"
 msgstr ""
 
-#: rc_option_editor.cc:1791
-msgid "no regions"
+#: rc_option_editor.cc:2363
+msgid "Show waveforms for audio while it is being recorded"
 msgstr ""
 
-#: rc_option_editor.cc:1794
-msgid "newly-created regions"
+#: rc_option_editor.cc:2370
+msgid "Waveform scale"
 msgstr ""
 
-#: rc_option_editor.cc:1798
-msgid "existing selection and newly-created regions"
+#: rc_option_editor.cc:2375
+msgid "linear"
+msgstr "linearna"
+
+#: rc_option_editor.cc:2376
+msgid "logarithmic"
 msgstr ""
 
-#: rc_option_editor.cc:1805
+#: rc_option_editor.cc:2382
+msgid "Waveform shape"
+msgstr ""
+
+#: rc_option_editor.cc:2387
+msgid "traditional"
+msgstr ""
+
+#: rc_option_editor.cc:2388
+msgid "rectified"
+msgstr ""
+
+#: rc_option_editor.cc:2397
 msgid "Buffering"
 msgstr ""
 
-#: rc_option_editor.cc:1813
+#: rc_option_editor.cc:2405
 msgid "Record monitoring handled by"
 msgstr ""
 
-#: rc_option_editor.cc:1819
+#: rc_option_editor.cc:2411
 msgid "via Audio Driver"
 msgstr ""
 
-#: rc_option_editor.cc:1825
+#: rc_option_editor.cc:2417
 msgid "audio hardware"
 msgstr ""
 
-#: rc_option_editor.cc:1832
+#: rc_option_editor.cc:2424
 msgid "Tape machine mode"
 msgstr ""
 
-#: rc_option_editor.cc:1837
+#: rc_option_editor.cc:2429
 msgid "Connection of tracks and busses"
 msgstr ""
 
-#: rc_option_editor.cc:1842
+#: rc_option_editor.cc:2435
 msgid "Auto-connect master/monitor busses"
 msgstr ""
 
-#: rc_option_editor.cc:1849
+#: rc_option_editor.cc:2442
 msgid "Connect track inputs"
 msgstr ""
 
-#: rc_option_editor.cc:1854
+#: rc_option_editor.cc:2447
 msgid "automatically to physical inputs"
 msgstr ""
 
-#: rc_option_editor.cc:1855 rc_option_editor.cc:1868
+#: rc_option_editor.cc:2448 rc_option_editor.cc:2461
 msgid "manually"
 msgstr ""
 
-#: rc_option_editor.cc:1861
+#: rc_option_editor.cc:2454
 msgid "Connect track and bus outputs"
 msgstr ""
 
-#: rc_option_editor.cc:1866
+#: rc_option_editor.cc:2459
 msgid "automatically to physical outputs"
 msgstr ""
 
-#: rc_option_editor.cc:1867
+#: rc_option_editor.cc:2460
 msgid "automatically to master bus"
 msgstr ""
 
-#: rc_option_editor.cc:1872
+#: rc_option_editor.cc:2467
+msgid "Use 'Strict-I/O' for new tracks or Busses"
+msgstr ""
+
+#: rc_option_editor.cc:2478
 msgid "Denormals"
 msgstr ""
 
-#: rc_option_editor.cc:1877
+#: rc_option_editor.cc:2483
 msgid "Use DC bias to protect against denormals"
 msgstr ""
 
-#: rc_option_editor.cc:1884
+#: rc_option_editor.cc:2490
 msgid "Processor handling"
 msgstr ""
 
-#: rc_option_editor.cc:1890
+#: rc_option_editor.cc:2496
 msgid "no processor handling"
 msgstr ""
 
-#: rc_option_editor.cc:1896
+#: rc_option_editor.cc:2502
 msgid "use FlushToZero"
 msgstr ""
 
-#: rc_option_editor.cc:1903
+#: rc_option_editor.cc:2509
 msgid "use DenormalsAreZero"
 msgstr ""
 
-#: rc_option_editor.cc:1910
+#: rc_option_editor.cc:2516
 msgid "use FlushToZero and DenormalsAreZero"
 msgstr ""
 
-#: rc_option_editor.cc:1926
-msgid "Silence plugins when the transport is stopped"
+#: rc_option_editor.cc:2532
+msgid "Enable automatic analysis of audio"
 msgstr ""
 
-#: rc_option_editor.cc:1934
-msgid "Make new plugins active"
+#: rc_option_editor.cc:2540
+msgid "Replicate missing region channels"
 msgstr ""
 
-#: rc_option_editor.cc:1944
-msgid "Enable automatic analysis of audio"
+#: rc_option_editor.cc:2547 rc_option_editor.cc:2556 rc_option_editor.cc:2558
+#: rc_option_editor.cc:2566 rc_option_editor.cc:2574 rc_option_editor.cc:2582
+#: rc_option_editor.cc:2600 rc_option_editor.cc:2612 rc_option_editor.cc:2624
+#: rc_option_editor.cc:2626 rc_option_editor.cc:2628 rc_option_editor.cc:2636
+#: rc_option_editor.cc:2644 rc_option_editor.cc:2652 rc_option_editor.cc:2662
+#: rc_option_editor.cc:2663
+msgid "Solo & mute"
 msgstr ""
 
-#: rc_option_editor.cc:1952
-msgid "Replicate missing region channels"
+#: rc_option_editor.cc:2551
+msgid "Solo controls are Listen controls"
 msgstr ""
 
-#: rc_option_editor.cc:1959 rc_option_editor.cc:1961 rc_option_editor.cc:1976
-#: rc_option_editor.cc:1988 rc_option_editor.cc:2000 rc_option_editor.cc:2012
-#: rc_option_editor.cc:2016 rc_option_editor.cc:2024 rc_option_editor.cc:2032
-#: rc_option_editor.cc:2040 rc_option_editor.cc:2042 rc_option_editor.cc:2050
-#: rc_option_editor.cc:2058 rc_option_editor.cc:2066 rc_option_editor.cc:2074
-#: rc_option_editor.cc:2076
-msgid "Solo / mute"
+#: rc_option_editor.cc:2561
+msgid "Exclusive solo"
 msgstr ""
 
-#: rc_option_editor.cc:1964
-msgid "Solo-in-place mute cut (dB)"
+#: rc_option_editor.cc:2569
+msgid "Show solo muting"
+msgstr "Wyświetlanie wyciszania solo"
+
+#: rc_option_editor.cc:2577
+msgid "Soloing overrides muting"
 msgstr ""
 
-#: rc_option_editor.cc:1971
-msgid "Solo controls are Listen controls"
+#: rc_option_editor.cc:2585
+msgid "Solo-in-place mute cut (dB)"
 msgstr ""
 
-#: rc_option_editor.cc:1980
+#: rc_option_editor.cc:2592
 msgid "Listen Position"
 msgstr ""
 
-#: rc_option_editor.cc:1985
+#: rc_option_editor.cc:2597
 msgid "after-fader (AFL)"
 msgstr ""
 
-#: rc_option_editor.cc:1986
+#: rc_option_editor.cc:2598
 msgid "pre-fader (PFL)"
 msgstr ""
 
-#: rc_option_editor.cc:1992
+#: rc_option_editor.cc:2604
 msgid "PFL signals come from"
 msgstr ""
 
-#: rc_option_editor.cc:1997
+#: rc_option_editor.cc:2609
 msgid "before pre-fader processors"
 msgstr ""
 
-#: rc_option_editor.cc:1998
+#: rc_option_editor.cc:2610
 msgid "pre-fader but after pre-fader processors"
 msgstr ""
 
-#: rc_option_editor.cc:2004
+#: rc_option_editor.cc:2616
 msgid "AFL signals come from"
 msgstr ""
 
-#: rc_option_editor.cc:2009
+#: rc_option_editor.cc:2621
 msgid "immediately post-fader"
 msgstr ""
 
-#: rc_option_editor.cc:2010
+#: rc_option_editor.cc:2622
 msgid "after post-fader processors (before pan)"
 msgstr ""
 
-#: rc_option_editor.cc:2019
-msgid "Exclusive solo"
-msgstr ""
-
-#: rc_option_editor.cc:2027
-msgid "Show solo muting"
-msgstr "Wyświetlanie wyciszania solo"
-
-#: rc_option_editor.cc:2035
-msgid "Soloing overrides muting"
-msgstr ""
-
-#: rc_option_editor.cc:2040
+#: rc_option_editor.cc:2626
 msgid "Default track / bus muting options"
 msgstr ""
 
-#: rc_option_editor.cc:2045
+#: rc_option_editor.cc:2631
 msgid "Mute affects pre-fader sends"
 msgstr ""
 
-#: rc_option_editor.cc:2053
+#: rc_option_editor.cc:2639
 msgid "Mute affects post-fader sends"
 msgstr ""
 
-#: rc_option_editor.cc:2061
+#: rc_option_editor.cc:2647
 msgid "Mute affects control outputs"
 msgstr ""
 
-#: rc_option_editor.cc:2069
+#: rc_option_editor.cc:2655
 msgid "Mute affects main outputs"
 msgstr ""
 
-#: rc_option_editor.cc:2074
+#: rc_option_editor.cc:2662
 msgid "Send Routing"
 msgstr ""
 
-#: rc_option_editor.cc:2079
+#: rc_option_editor.cc:2666
 msgid "Link panners of Aux and External Sends with main panner by default"
 msgstr ""
 
-#: rc_option_editor.cc:2087
+#: rc_option_editor.cc:2672
+msgid "MIDI Preferences"
+msgstr ""
+
+#: rc_option_editor.cc:2677
 msgid "MIDI read-ahead time (seconds)"
 msgstr ""
 
-#: rc_option_editor.cc:2105
+#: rc_option_editor.cc:2687
+msgid "Initial program change"
+msgstr ""
+
+#: rc_option_editor.cc:2696
+msgid "Display first MIDI bank/program as 0"
+msgstr ""
+
+#: rc_option_editor.cc:2704
+msgid "Never display periodic MIDI messages (MTC, MIDI Clock)"
+msgstr ""
+
+#: rc_option_editor.cc:2712
+msgid "Sound MIDI notes as they are selected in the editor"
+msgstr ""
+
+#: rc_option_editor.cc:2720
+msgid "Send MIDI control feedback"
+msgstr ""
+
+#: rc_option_editor.cc:2725 rc_option_editor.cc:2727 rc_option_editor.cc:2735
+#: rc_option_editor.cc:2737 rc_option_editor.cc:2745 rc_option_editor.cc:2754
+#: rc_option_editor.cc:2756 rc_option_editor.cc:2764 rc_option_editor.cc:2772
+#: rc_option_editor.cc:2781
+msgid "MIDI/Sync"
+msgstr ""
+
+#: rc_option_editor.cc:2725
+msgid "MIDI Clock"
+msgstr ""
+
+#: rc_option_editor.cc:2735
+msgid "MIDI Time Code (MTC)"
+msgstr ""
+
+#: rc_option_editor.cc:2740
 msgid "Send MIDI Time Code"
 msgstr ""
 
-#: rc_option_editor.cc:2113
+#: rc_option_editor.cc:2748
 msgid "Percentage either side of normal transport speed to transmit MTC"
 msgstr ""
 
-#: rc_option_editor.cc:2122
-msgid "Obey MIDI Machine Control commands"
+#: rc_option_editor.cc:2754
+msgid "Midi Machine Control (MMC)"
 msgstr ""
 
-#: rc_option_editor.cc:2130
-msgid "Send MIDI Machine Control commands"
+#: rc_option_editor.cc:2759
+msgid "Obey MIDI Machine Control commands"
 msgstr ""
 
-#: rc_option_editor.cc:2138
-msgid "Send MIDI control feedback"
+#: rc_option_editor.cc:2767
+msgid "Send MIDI Machine Control commands"
 msgstr ""
 
-#: rc_option_editor.cc:2146
+#: rc_option_editor.cc:2775
 msgid "Inbound MMC device ID"
 msgstr ""
 
-#: rc_option_editor.cc:2155
+#: rc_option_editor.cc:2784
 msgid "Outbound MMC device ID"
 msgstr ""
 
-#: rc_option_editor.cc:2164
-msgid "Initial program change"
+#: rc_option_editor.cc:2790
+msgid "Midi Audition"
 msgstr ""
 
-#: rc_option_editor.cc:2173
-msgid "Display first MIDI bank/program as 0"
+#: rc_option_editor.cc:2794
+msgid "Midi Audition Synth (LV2)"
 msgstr ""
 
-#: rc_option_editor.cc:2181
-msgid "Never display periodic MIDI messages (MTC, MIDI Clock)"
+#: rc_option_editor.cc:2825 rc_option_editor.cc:2835 rc_option_editor.cc:2837
+msgid "User interaction"
+msgstr ""
+
+#: rc_option_editor.cc:2828
+msgid ""
+"Use translations of %1 messages\n"
+"   <i>(requires a restart of %1 to take effect)</i>\n"
+"   <i>(if available for your language preferences)</i>"
+msgstr ""
+
+#: rc_option_editor.cc:2835
+msgid "Keyboard"
+msgstr ""
+
+#: rc_option_editor.cc:2848 startup.cc:352
+msgid "Scan for Plugins"
+msgstr ""
+
+#: rc_option_editor.cc:2853
+msgid "General"
+msgstr ""
+
+#: rc_option_editor.cc:2858
+msgid "Always Display Plugin Scan Progress"
+msgstr ""
+
+#: rc_option_editor.cc:2864
+msgid ""
+"<b>When enabled</b> a popup window showing plugin scan progress is displayed "
+"for indexing (cache load) and discovery (detect new plugins)"
+msgstr ""
+
+#: rc_option_editor.cc:2869
+msgid "Silence plugins when the transport is stopped"
+msgstr ""
+
+#: rc_option_editor.cc:2875
+msgid ""
+"<b>When enabled</b> plugins will be reset at transport stop. When disabled "
+"plugins will be left unchanged at transport stop.\n"
+"\n"
+"This mostly affects plugins with a \"tail\" like Reverbs."
+msgstr ""
+
+#: rc_option_editor.cc:2879
+msgid "Make new plugins active"
+msgstr ""
+
+#: rc_option_editor.cc:2885
+msgid ""
+"<b>When enabled</b> plugins will be activated when they are added to tracks/"
+"busses. When disabled plugins will be left inactive when they are added to "
+"tracks/busses"
+msgstr ""
+
+#: rc_option_editor.cc:2888 rc_option_editor.cc:2896 rc_option_editor.cc:2908
+#: rc_option_editor.cc:2913 rc_option_editor.cc:2915 rc_option_editor.cc:2920
+#: rc_option_editor.cc:2927 rc_option_editor.cc:2932 rc_option_editor.cc:2941
+msgid "Plugins/VST"
+msgstr ""
+
+#: rc_option_editor.cc:2888
+msgid "VST"
+msgstr ""
+
+#: rc_option_editor.cc:2892
+msgid "Scan for [new] VST Plugins on Application Start"
+msgstr ""
+
+#: rc_option_editor.cc:2898
+msgid ""
+"<b>When enabled</b> new VST plugins are searched, tested and added to the "
+"cache index on application start. When disabled new plugins will only be "
+"available after triggering a 'Scan' manually"
+msgstr ""
+
+#: rc_option_editor.cc:2904
+msgid "Verbose Plugin Scan"
+msgstr ""
+
+#: rc_option_editor.cc:2910
+msgid ""
+"<b>When enabled</b> additional information for every plugin is added to the "
+"Log Window."
+msgstr ""
+
+#: rc_option_editor.cc:2918
+msgid "VST Cache:"
+msgstr ""
+
+#: rc_option_editor.cc:2923
+msgid "VST Blacklist:"
+msgstr ""
+
+#: rc_option_editor.cc:2930
+msgid "Linux VST Path:"
+msgstr ""
+
+#: rc_option_editor.cc:2935 rc_option_editor.cc:2948
+msgid "Path:"
+msgstr ""
+
+#: rc_option_editor.cc:2944
+msgid "Windows VST Path:"
+msgstr ""
+
+#: rc_option_editor.cc:2954 rc_option_editor.cc:2966 rc_option_editor.cc:2971
+msgid "Plugins/Audio Unit"
+msgstr ""
+
+#: rc_option_editor.cc:2954
+msgid "Audio Unit"
+msgstr ""
+
+#: rc_option_editor.cc:2958
+msgid "Scan for AudioUnit Plugins on Application Start"
+msgstr ""
+
+#: rc_option_editor.cc:2964
+msgid ""
+"<b>When enabled</b> Audio Unit Plugins are discovered on application start. "
+"When disabled AU plugins will only be available after triggering a 'Scan' "
+"manually. The first successful scan will enable AU auto-scan, Any crash "
+"during plugin discovery will disable it."
+msgstr ""
+
+#: rc_option_editor.cc:2969
+msgid "AU Cache:"
+msgstr ""
+
+#: rc_option_editor.cc:2974
+msgid "AU Blacklist:"
+msgstr ""
+
+#: rc_option_editor.cc:2978
+msgid "Plugin GUI"
+msgstr ""
+
+#: rc_option_editor.cc:2982
+msgid "Automatically open the plugin GUI when adding a new plugin"
+msgstr ""
+
+#: rc_option_editor.cc:2991
+msgid "Show Plugin Inline Display on Mixerstrip by default"
+msgstr ""
+
+#: rc_option_editor.cc:2998
+msgid ""
+"Don't automatically open the plugin GUI when the plugin has an inline "
+"display mode"
 msgstr ""
 
-#: rc_option_editor.cc:2189
-msgid "Sound MIDI notes as they are selected"
+#: rc_option_editor.cc:3005
+msgid "Instrument"
 msgstr ""
 
-#: rc_option_editor.cc:2194
-msgid "Midi Audition"
+#: rc_option_editor.cc:3009
+msgid "Ask to replace existing instrument plugin"
 msgstr ""
 
-#: rc_option_editor.cc:2198
-msgid "Midi Audition Synth (LV2)"
+#: rc_option_editor.cc:3017
+msgid "Interactively configure instrument plugins on insert"
 msgstr ""
 
-#: rc_option_editor.cc:2229 rc_option_editor.cc:2239 rc_option_editor.cc:2241
-msgid "User interaction"
+#: rc_option_editor.cc:3023
+msgid ""
+"<b>When enabled</b> show a dialog to select instrument channel configuration "
+"before adding a multichannel plugin."
 msgstr ""
 
-#: rc_option_editor.cc:2232
-msgid ""
-"Use translations of %1 messages\n"
-"   <i>(requires a restart of %1 to take effect)</i>\n"
-"   <i>(if available for your language preferences)</i>"
+#: rc_option_editor.cc:3032
+msgid "Disable Graphics Hardware Acceleration (requires restart)"
 msgstr ""
 
-#: rc_option_editor.cc:2239
-msgid "Keyboard"
+#: rc_option_editor.cc:3038
+msgid ""
+"Render large parts of the application user-interface in software, instead of "
+"using 2D-graphics acceleration.\n"
+"This requires restarting %1 before having an effect"
 msgstr ""
 
-#: rc_option_editor.cc:2249
-msgid "Control surface remote ID"
+#: rc_option_editor.cc:3039 rc_option_editor.cc:3051 rc_option_editor.cc:3054
+#: rc_option_editor.cc:3062 rc_option_editor.cc:3070 rc_option_editor.cc:3078
+#: rc_option_editor.cc:3086 rc_option_editor.cc:3097 rc_option_editor.cc:3113
+#: rc_option_editor.cc:3129 rc_option_editor.cc:3144 rc_option_editor.cc:3153
+#: rc_option_editor.cc:3161
+msgid "Preferences|GUI"
 msgstr ""
 
-#: rc_option_editor.cc:2254
-msgid "assigned by user"
+#: rc_option_editor.cc:3045
+msgid "Possibly improve slow graphical performance (requires restart)"
 msgstr ""
 
-#: rc_option_editor.cc:2255
-msgid "follows order of mixer"
+#: rc_option_editor.cc:3050
+msgid ""
+"Disables hardware gradient rendering on buggy video drivers (\"buggy "
+"gradients patch\").\n"
+"This requires restarting %1 before having an effect"
 msgstr ""
 
-#: rc_option_editor.cc:2269 rc_option_editor.cc:2278 rc_option_editor.cc:2287
-#: rc_option_editor.cc:2297 rc_option_editor.cc:2321 rc_option_editor.cc:2334
-#: rc_option_editor.cc:2343
-msgid "Preferences|GUI"
+#: rc_option_editor.cc:3057
+msgid "Use Window Manager/Desktop visibility information"
 msgstr ""
 
-#: rc_option_editor.cc:2272
+#: rc_option_editor.cc:3065
 msgid "Graphically indicate mouse pointer hovering over various widgets"
 msgstr ""
 
-#: rc_option_editor.cc:2281
+#: rc_option_editor.cc:3073
 msgid "Show tooltips if mouse hovers over a control"
 msgstr ""
 
-#: rc_option_editor.cc:2290
+#: rc_option_editor.cc:3081
 msgid "Use name highlight bars in region displays (requires a restart)"
 msgstr ""
 
-#: rc_option_editor.cc:2303
-msgid "update transport clock display at FPS instead of every 100ms"
+#: rc_option_editor.cc:3089
+msgid "Update transport clock display at FPS instead of every 100ms"
 msgstr ""
 
-#: rc_option_editor.cc:2312
+#: rc_option_editor.cc:3104
+msgid "Waveform image cache size (megabytes)"
+msgstr ""
+
+#: rc_option_editor.cc:3112
+msgid ""
+"Increasing the cache size uses more memory to store waveform images, which "
+"can improve graphical performance."
+msgstr ""
+
+#: rc_option_editor.cc:3120
 msgid "Lock timeout (seconds)"
 msgstr ""
 
-#: rc_option_editor.cc:2320
+#: rc_option_editor.cc:3128
 msgid "Lock GUI after this many idle seconds (zero to never lock)"
 msgstr ""
 
-#: rc_option_editor.cc:2336
+#: rc_option_editor.cc:3146
 msgid "Mixer Strip"
 msgstr ""
 
-#: rc_option_editor.cc:2346
+#: rc_option_editor.cc:3156
 msgid "Use narrow strips in the mixer by default"
 msgstr ""
 
-#: rc_option_editor.cc:2351 rc_option_editor.cc:2365 rc_option_editor.cc:2384
-#: rc_option_editor.cc:2400 rc_option_editor.cc:2416 rc_option_editor.cc:2430
-#: rc_option_editor.cc:2444 rc_option_editor.cc:2446
+#: rc_option_editor.cc:3163
+msgid "Action Script Button Visibility"
+msgstr ""
+
+#: rc_option_editor.cc:3169 rc_option_editor.cc:3183 rc_option_editor.cc:3200
+#: rc_option_editor.cc:3216 rc_option_editor.cc:3232 rc_option_editor.cc:3246
+#: rc_option_editor.cc:3272 rc_option_editor.cc:3290 rc_option_editor.cc:3301
+#: rc_option_editor.cc:3308 rc_option_editor.cc:3310 rc_option_editor.cc:3318
+#: rc_option_editor.cc:3320 rc_option_editor.cc:3328 rc_option_editor.cc:3336
+#: rc_option_editor.cc:3338
 msgid "Preferences|Metering"
 msgstr ""
 
-#: rc_option_editor.cc:2355
+#: rc_option_editor.cc:3173
 msgid "Peak hold time"
 msgstr ""
 
-#: rc_option_editor.cc:2361
+#: rc_option_editor.cc:3179
 msgid "short"
 msgstr ""
 
-#: rc_option_editor.cc:2362
+#: rc_option_editor.cc:3180
 msgid "medium"
 msgstr ""
 
-#: rc_option_editor.cc:2363
+#: rc_option_editor.cc:3181
 msgid "long"
 msgstr ""
 
-#: rc_option_editor.cc:2369
+#: rc_option_editor.cc:3187
 msgid "DPM fall-off"
 msgstr ""
 
-#: rc_option_editor.cc:2375
+#: rc_option_editor.cc:3193
 msgid "slowest [6.6dB/sec]"
 msgstr ""
 
-#: rc_option_editor.cc:2376
+#: rc_option_editor.cc:3194
 msgid "slow [8.6dB/sec] (BBC PPM, EBU PPM)"
 msgstr ""
 
-#: rc_option_editor.cc:2377
-msgid "slowish [12.0dB/sec] (DIN)"
-msgstr ""
-
-#: rc_option_editor.cc:2378
-msgid "moderate [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"
+#: rc_option_editor.cc:3195
+msgid "moderate [12.0dB/sec] (DIN)"
 msgstr ""
 
-#: rc_option_editor.cc:2379
-msgid "medium [20dB/sec]"
+#: rc_option_editor.cc:3196
+msgid "medium [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"
 msgstr ""
 
-#: rc_option_editor.cc:2380
-msgid "fast [32dB/sec]"
+#: rc_option_editor.cc:3197
+msgid "fast [20dB/sec]"
 msgstr ""
 
-#: rc_option_editor.cc:2381
-msgid "faster [46dB/sec]"
+#: rc_option_editor.cc:3198
+msgid "very fast [32dB/sec]"
 msgstr ""
 
-#: rc_option_editor.cc:2382
-msgid "fastest [70dB/sec]"
-msgstr ""
-
-#: rc_option_editor.cc:2388
+#: rc_option_editor.cc:3204
 msgid "Meter line-up level; 0dBu"
 msgstr ""
 
-#: rc_option_editor.cc:2393 rc_option_editor.cc:2409
+#: rc_option_editor.cc:3209 rc_option_editor.cc:3225
 msgid "-24dBFS (SMPTE US: 4dBu = -20dBFS)"
 msgstr ""
 
-#: rc_option_editor.cc:2394 rc_option_editor.cc:2410
+#: rc_option_editor.cc:3210 rc_option_editor.cc:3226
 msgid "-20dBFS (SMPTE RP.0155)"
 msgstr ""
 
-#: rc_option_editor.cc:2395 rc_option_editor.cc:2411
+#: rc_option_editor.cc:3211 rc_option_editor.cc:3227
 msgid "-18dBFS (EBU, BBC)"
 msgstr ""
 
-#: rc_option_editor.cc:2396 rc_option_editor.cc:2412
+#: rc_option_editor.cc:3212 rc_option_editor.cc:3228
 msgid "-15dBFS (DIN)"
 msgstr ""
 
-#: rc_option_editor.cc:2398
+#: rc_option_editor.cc:3214
 msgid ""
 "Configure meter-marks and color-knee point for dBFS scale DPM, set reference "
 "level for IEC1/Nordic, IEC2 PPM and VU meter."
 msgstr ""
 
-#: rc_option_editor.cc:2404
+#: rc_option_editor.cc:3220
 msgid "IEC1/DIN Meter line-up level; 0dBu"
 msgstr ""
 
-#: rc_option_editor.cc:2414
+#: rc_option_editor.cc:3230
 msgid "Reference level for IEC1/DIN meter."
 msgstr ""
 
-#: rc_option_editor.cc:2420
+#: rc_option_editor.cc:3236
 msgid "VU Meter standard"
 msgstr ""
 
-#: rc_option_editor.cc:2425
+#: rc_option_editor.cc:3241
 msgid "0VU = -2dBu (France)"
 msgstr ""
 
-#: rc_option_editor.cc:2426
+#: rc_option_editor.cc:3242
 msgid "0VU = 0dBu (North America, Australia)"
 msgstr ""
 
-#: rc_option_editor.cc:2427
+#: rc_option_editor.cc:3243
 msgid "0VU = +4dBu (standard)"
 msgstr ""
 
-#: rc_option_editor.cc:2428
+#: rc_option_editor.cc:3244
 msgid "0VU = +8dBu"
 msgstr ""
 
-#: rc_option_editor.cc:2434
+#: rc_option_editor.cc:3250
 msgid "Peak threshold [dBFS]"
 msgstr ""
 
-#: rc_option_editor.cc:2442
+#: rc_option_editor.cc:3259
+msgid "Default Meter Type for Master Bus"
+msgstr ""
+
+#: rc_option_editor.cc:3277
+msgid "Default Meter Type for Busses"
+msgstr ""
+
+#: rc_option_editor.cc:3294
+msgid "Default Meter Type for Tracks"
+msgstr ""
+
+#: rc_option_editor.cc:3306
 msgid ""
 "Specify the audio signal level in dbFS at and above which the meter-peak "
 "indicator will flash red."
 msgstr ""
 
-#: rc_option_editor.cc:2449
+#: rc_option_editor.cc:3313
 msgid "LED meter style"
 msgstr ""
 
-#: rc_option_editor.cc:2457
+#: rc_option_editor.cc:3318
+msgid "Editor Meters"
+msgstr ""
+
+#: rc_option_editor.cc:3323
+msgid "Show meters on tracks in the editor"
+msgstr ""
+
+#: rc_option_editor.cc:3331
+msgid "Show at most stereo meters in the track-header"
+msgstr ""
+
+#: rc_option_editor.cc:3336
+msgid "Post Export Analysis"
+msgstr ""
+
+#: rc_option_editor.cc:3341
+msgid "Save loudness analysis as image file"
+msgstr ""
+
+#: rc_option_editor.cc:3349
 msgid "Theme"
 msgstr ""
 
-#: region_editor.cc:79
+#: rc_option_editor.cc:3351
+msgid "Theme/Colors"
+msgstr ""
+
+#: rc_option_editor.cc:3429
+msgid "Set Linux VST Search Path"
+msgstr ""
+
+#: rc_option_editor.cc:3443
+msgid "Set Windows VST Search Path"
+msgstr ""
+
+#: region_editor.cc:81
 msgid "audition this region"
 msgstr "przesłuchaj ten obszar"
 
-#: region_editor.cc:88 region_layering_order_editor.cc:75
+#: region_editor.cc:90 region_layering_order_editor.cc:75
 msgid "Position:"
 msgstr ""
 
-#: region_editor.cc:90 add_video_dialog.cc:155
+#: region_editor.cc:92 add_video_dialog.cc:155
 msgid "End:"
 msgstr ""
 
-#: region_editor.cc:92 sfdb_ui.cc:145
+#: region_editor.cc:94 sfdb_ui.cc:145
 msgid "Length:"
 msgstr "Długość:"
 
-#: region_editor.cc:94
+#: region_editor.cc:96
 msgid "Sync point (relative to region):"
 msgstr ""
 
-#: region_editor.cc:96
+#: region_editor.cc:98
 msgid "Sync point (absolute):"
 msgstr ""
 
-#: region_editor.cc:98
+#: region_editor.cc:100
 msgid "File start:"
 msgstr ""
 
-#: region_editor.cc:102
+#: region_editor.cc:104
 msgid "Sources:"
 msgstr ""
 
-#: region_editor.cc:104
+#: region_editor.cc:106
 msgid "Source:"
 msgstr ""
 
-#: region_editor.cc:166
+#: region_editor.cc:168
 msgid "Region '%1'"
 msgstr ""
 
-#: region_editor.cc:273
+#: region_editor.cc:279
 msgid "change region start position"
 msgstr "zmień pozycję początkową obszaru"
 
-#: region_editor.cc:289
+#: region_editor.cc:299
 msgid "change region end position"
 msgstr "zmień pozycję końcową obszaru"
 
-#: region_editor.cc:309
+#: region_editor.cc:322
 msgid "change region length"
 msgstr "zmień długość obszaru"
 
-#: region_editor.cc:403 region_editor.cc:415
+#: region_editor.cc:416 region_editor.cc:428
 msgid "change region sync point"
 msgstr ""
 
@@ -9753,34 +11770,34 @@ msgstr ""
 msgid "Choose Top Region"
 msgstr ""
 
-#: region_view.cc:277
+#: region_view.cc:271
 msgid "SilenceText"
 msgstr ""
 
-#: region_view.cc:292 region_view.cc:311
+#: region_view.cc:286 region_view.cc:305
 msgid "minutes"
 msgstr ""
 
-#: region_view.cc:295 region_view.cc:314
+#: region_view.cc:289 region_view.cc:308
 msgid "msecs"
 msgstr ""
 
-#: region_view.cc:298 region_view.cc:317
+#: region_view.cc:292 region_view.cc:311
 msgid "secs"
 msgstr ""
 
-#: region_view.cc:301
+#: region_view.cc:295
 msgid "%1 silent segment"
 msgid_plural "%1 silent segments"
 msgstr[0] ""
 msgstr[1] ""
 msgstr[2] ""
 
-#: region_view.cc:303
+#: region_view.cc:297
 msgid "shortest = %1 %2"
 msgstr ""
 
-#: region_view.cc:320
+#: region_view.cc:314
 msgid ""
 "\n"
 "  (shortest audible segment = %1 %2)"
@@ -9826,55 +11843,63 @@ msgstr ""
 msgid "Modified Kullback-Liebler"
 msgstr ""
 
-#: rhythm_ferret.cc:65
+#: rhythm_ferret.cc:62
+msgid "Spectral Flux"
+msgstr ""
+
+#: rhythm_ferret.cc:68
 msgid "Split region"
 msgstr ""
 
-#: rhythm_ferret.cc:66
+#: rhythm_ferret.cc:70
 msgid "Snap regions"
 msgstr ""
 
-#: rhythm_ferret.cc:67
+#: rhythm_ferret.cc:71
 msgid "Conform regions"
 msgstr ""
 
-#: rhythm_ferret.cc:72
+#: rhythm_ferret.cc:77
 msgid "Rhythm Ferret"
 msgstr ""
 
-#: rhythm_ferret.cc:78
+#: rhythm_ferret.cc:83
 msgid "Analyze"
 msgstr "Analizuj"
 
-#: rhythm_ferret.cc:113
+#: rhythm_ferret.cc:122
 msgid "Detection function"
 msgstr ""
 
-#: rhythm_ferret.cc:117
-msgid "Trigger gap"
+#: rhythm_ferret.cc:126
+msgid "Trigger gap (postproc)"
 msgstr ""
 
-#: rhythm_ferret.cc:122 strip_silence_dialog.cc:64
-msgid "Threshold"
-msgstr "Wartość progowa"
-
-#: rhythm_ferret.cc:127
+#: rhythm_ferret.cc:131
 msgid "Peak threshold"
 msgstr ""
 
-#: rhythm_ferret.cc:132
+#: rhythm_ferret.cc:135
 msgid "Silence threshold"
 msgstr ""
 
-#: rhythm_ferret.cc:137
+#: rhythm_ferret.cc:141
+msgid "Min Inter-Onset Time"
+msgstr ""
+
+#: rhythm_ferret.cc:148
 msgid "Sensitivity"
 msgstr "Czułość"
 
-#: rhythm_ferret.cc:141
+#: rhythm_ferret.cc:152
+msgid "Cut Pos Threshold"
+msgstr ""
+
+#: rhythm_ferret.cc:157
 msgid "Operation"
 msgstr "Operacja"
 
-#: rhythm_ferret.cc:355
+#: rhythm_ferret.cc:382
 msgid "split regions (rhythm ferret)"
 msgstr ""
 
@@ -9898,19 +11923,15 @@ msgstr ""
 msgid "Active state"
 msgstr ""
 
-#: route_group_dialog.cc:53 route_group_dialog.cc:82 theme_manager.cc:90
-msgid "Color"
-msgstr "Kolor"
-
-#: route_group_dialog.cc:59
+#: route_group_dialog.cc:58
 msgid "RouteGroupDialog"
 msgstr ""
 
-#: route_group_dialog.cc:100
+#: route_group_dialog.cc:99
 msgid "<b>Sharing</b>"
 msgstr ""
 
-#: route_group_dialog.cc:200
+#: route_group_dialog.cc:192
 msgid "The group name is not unique. Please use a different name."
 msgstr ""
 
@@ -9930,404 +11951,389 @@ msgstr "Wyjścia"
 msgid "Plugins, Inserts & Sends"
 msgstr ""
 
-#: route_params_ui.cc:209
+#: route_params_ui.cc:201
 msgid "route display list item for renamed route not found!"
 msgstr ""
 
-#: route_params_ui.cc:279 route_params_ui.cc:307
+#: route_params_ui.cc:271 route_params_ui.cc:299
 #, c-format
 msgid "Playback delay: %<PRId64> samples"
 msgstr ""
 
-#: route_params_ui.cc:499
+#: route_params_ui.cc:491
 msgid "NO TRACK"
 msgstr "BRAK ŚCIEŻKI"
 
-#: route_params_ui.cc:637 route_params_ui.cc:638
+#: route_params_ui.cc:515
+msgid "Add Track or Bus"
+msgstr ""
+
+#: route_params_ui.cc:627 route_params_ui.cc:628
 msgid "No Track or Bus Selected"
 msgstr ""
 
-#: route_time_axis.cc:181
+#: route_time_axis.cc:104
+msgid "RTAV|G"
+msgstr ""
+
+#: route_time_axis.cc:105
+msgid "RTAV|P"
+msgstr ""
+
+#: route_time_axis.cc:106
+msgid "RTAV|A"
+msgstr ""
+
+#: route_time_axis.cc:194
 msgid "Record (Right-click for Step Edit)"
 msgstr ""
 
-#: route_time_axis.cc:184
+#: route_time_axis.cc:197
 msgid "Record"
 msgstr "Nagrywanie"
 
-#: route_time_axis.cc:254
+#: route_time_axis.cc:265
 msgid "Route Group"
 msgstr ""
 
-#: route_time_axis.cc:264
+#: route_time_axis.cc:275
 msgid "MIDI Controllers and Automation"
 msgstr ""
 
-#: route_time_axis.cc:495
+#: route_time_axis.cc:510
 msgid "Show All Automation"
 msgstr ""
 
-#: route_time_axis.cc:498
+#: route_time_axis.cc:513
 msgid "Show Existing Automation"
 msgstr ""
 
-#: route_time_axis.cc:501
+#: route_time_axis.cc:516
 msgid "Hide All Automation"
 msgstr ""
 
-#: route_time_axis.cc:510
+#: route_time_axis.cc:525
 msgid "Processor automation"
 msgstr ""
 
-#: route_time_axis.cc:517
+#: route_time_axis.cc:532
 msgid "Fader"
 msgstr "Wzmocnienie"
 
-#: route_time_axis.cc:535
+#: route_time_axis.cc:559
 msgid "Pan"
 msgstr "Panorama"
 
-#: route_time_axis.cc:626
+#: route_time_axis.cc:643
 msgid "Overlaid"
 msgstr ""
 
-#: route_time_axis.cc:632
+#: route_time_axis.cc:649
 msgid "Stacked"
 msgstr ""
 
-#: route_time_axis.cc:640
+#: route_time_axis.cc:657
 msgid "Layers"
 msgstr ""
 
-#: route_time_axis.cc:709
+#: route_time_axis.cc:721
 msgid "Automatic (based on I/O connections)"
 msgstr ""
 
-#: route_time_axis.cc:718
+#: route_time_axis.cc:730
 msgid "(Currently: Existing Material)"
 msgstr ""
 
-#: route_time_axis.cc:721
+#: route_time_axis.cc:733
 msgid "(Currently: Capture Time)"
 msgstr ""
 
-#: route_time_axis.cc:729
+#: route_time_axis.cc:741
 msgid "Align With Existing Material"
 msgstr ""
 
-#: route_time_axis.cc:734
+#: route_time_axis.cc:746
 msgid "Align With Capture Time"
 msgstr ""
 
-#: route_time_axis.cc:739
+#: route_time_axis.cc:751
 msgid "Alignment"
 msgstr "Wyrównanie"
 
-#: route_time_axis.cc:774
+#: route_time_axis.cc:786
 msgid "Normal Mode"
 msgstr ""
 
-#: route_time_axis.cc:780
+#: route_time_axis.cc:792
 msgid "Tape Mode"
 msgstr ""
 
-#: route_time_axis.cc:786
+#: route_time_axis.cc:798
 msgid "Non-Layered Mode"
 msgstr ""
 
-#: route_time_axis.cc:792
+#: route_time_axis.cc:804
 msgid "Record Mode"
 msgstr ""
 
-#: route_time_axis.cc:799 route_time_axis.cc:1789
+#: route_time_axis.cc:809 route_time_axis.cc:1795
 msgid "Playlist"
 msgstr "Lista odtwarzania"
 
-#: route_time_axis.cc:1097
+#: route_time_axis.cc:1107
 msgid "Rename Playlist"
 msgstr ""
 
-#: route_time_axis.cc:1098
+#: route_time_axis.cc:1108
 msgid "New name for playlist:"
 msgstr ""
 
-#: route_time_axis.cc:1183
+#: route_time_axis.cc:1193
 msgid "New Copy Playlist"
 msgstr ""
 
-#: route_time_axis.cc:1184 route_time_axis.cc:1237
+#: route_time_axis.cc:1194 route_time_axis.cc:1247
 msgid "Name for new playlist:"
 msgstr ""
 
-#: route_time_axis.cc:1236
+#: route_time_axis.cc:1246
 msgid "New Playlist"
 msgstr ""
 
-#: route_time_axis.cc:1436
-msgid "You cannot create a track with that name as it is reserved for %1"
+#: route_time_axis.cc:1441
+msgid "The name \"%1\" is reserved for %2"
 msgstr ""
 
-#: route_time_axis.cc:1678
+#: route_time_axis.cc:1684
 msgid "New Copy..."
 msgstr ""
 
-#: route_time_axis.cc:1682
+#: route_time_axis.cc:1688
 msgid "New Take"
 msgstr ""
 
-#: route_time_axis.cc:1683
+#: route_time_axis.cc:1689
 msgid "Copy Take"
 msgstr ""
 
-#: route_time_axis.cc:1688
+#: route_time_axis.cc:1694
 msgid "Clear Current"
 msgstr "Wyczyść aktualną"
 
-#: route_time_axis.cc:1691
-msgid "Select From All..."
+#: route_time_axis.cc:1697
+msgid "Select from All..."
 msgstr ""
 
-#: route_time_axis.cc:1779
+#: route_time_axis.cc:1785
 msgid "Take: %1.%2"
 msgstr ""
 
-#: route_time_axis.cc:2169 selection.cc:1007 selection.cc:1061
+#: route_time_axis.cc:2190 selection.cc:1042 selection.cc:1096
 msgid "programming error: "
 msgstr "błąd programowania:"
 
-#: route_time_axis.cc:2585
+#: route_time_axis.cc:2614
 msgid "Underlays"
 msgstr ""
 
-#: route_time_axis.cc:2588
+#: route_time_axis.cc:2617
 msgid "Remove \"%1\""
 msgstr ""
 
-#: route_time_axis.cc:2638 route_time_axis.cc:2675
+#: route_time_axis.cc:2667 route_time_axis.cc:2704
 msgid "programming error: underlay reference pointer pairs are inconsistent!"
 msgstr ""
 
-#: route_time_axis.cc:2702
+#: route_time_axis.cc:2731 vca_master_strip.cc:203 vca_time_axis.cc:228
 msgid "After-fade listen (AFL)"
 msgstr ""
 
-#: route_time_axis.cc:2706
+#: route_time_axis.cc:2735 vca_master_strip.cc:207 vca_time_axis.cc:232
 msgid "Pre-fade listen (PFL)"
 msgstr ""
 
-#: route_ui.cc:140
+#: route_ui.cc:165
 msgid "Mute this track"
 msgstr ""
 
-#: route_ui.cc:144
+#: route_ui.cc:169
 msgid "Mute other (non-soloed) tracks"
 msgstr ""
 
-#: route_ui.cc:150
+#: route_ui.cc:175
 msgid "Enable recording on this track"
 msgstr ""
 
-#: route_ui.cc:158
+#: route_ui.cc:183
 msgid "make mixer strips show sends to this bus"
 msgstr ""
 
-#: route_ui.cc:163
+#: route_ui.cc:188
 msgid "Monitor input"
 msgstr ""
 
-#: route_ui.cc:169
+#: route_ui.cc:194
 msgid "Monitor playback"
 msgstr ""
 
-#: route_ui.cc:676
+#: route_ui.cc:706
 msgid "Not connected to AudioEngine - cannot engage record"
 msgstr ""
 
-#: route_ui.cc:875
+#: route_ui.cc:883
+msgid "Rec-Safe"
+msgstr ""
+
+#: route_ui.cc:888
 msgid "Step Entry"
 msgstr ""
 
-#: route_ui.cc:948
+#: route_ui.cc:987
 msgid "Assign all tracks (prefader)"
 msgstr ""
 
-#: route_ui.cc:952
+#: route_ui.cc:991
 msgid "Assign all tracks and buses (prefader)"
 msgstr ""
 
-#: route_ui.cc:956
+#: route_ui.cc:995
 msgid "Assign all tracks (postfader)"
 msgstr ""
 
-#: route_ui.cc:960
+#: route_ui.cc:999
 msgid "Assign all tracks and buses (postfader)"
 msgstr ""
 
-#: route_ui.cc:964
+#: route_ui.cc:1003
 msgid "Assign selected tracks (prefader)"
 msgstr ""
 
-#: route_ui.cc:968
+#: route_ui.cc:1007
 msgid "Assign selected tracks and buses (prefader)"
 msgstr ""
 
-#: route_ui.cc:971
+#: route_ui.cc:1010
 msgid "Assign selected tracks (postfader)"
 msgstr ""
 
-#: route_ui.cc:975
+#: route_ui.cc:1014
 msgid "Assign selected tracks and buses (postfader)"
 msgstr ""
 
-#: route_ui.cc:978
+#: route_ui.cc:1017
 msgid "Copy track/bus gains to sends"
 msgstr ""
 
-#: route_ui.cc:979
+#: route_ui.cc:1018
 msgid "Set sends gain to -inf"
 msgstr ""
 
-#: route_ui.cc:980
+#: route_ui.cc:1019
 msgid "Set sends gain to 0dB"
 msgstr ""
 
-#: route_ui.cc:1300
+#: route_ui.cc:1357
 msgid "Solo Isolate"
 msgstr ""
 
-#: route_ui.cc:1307
+#: route_ui.cc:1364
 msgid "Solo Safe"
 msgstr ""
 
-#: route_ui.cc:1329
+#: route_ui.cc:1386
 msgid "Pre Fader Sends"
 msgstr ""
 
-#: route_ui.cc:1335
+#: route_ui.cc:1392
 msgid "Post Fader Sends"
 msgstr ""
 
-#: route_ui.cc:1341
+#: route_ui.cc:1398
 msgid "Control Outs"
 msgstr ""
 
-#: route_ui.cc:1347
+#: route_ui.cc:1404
 msgid "Main Outs"
 msgstr "Główne wyjścia"
 
-#: route_ui.cc:1479
+#: route_ui.cc:1571
 msgid "Color Selection"
 msgstr ""
 
-#: route_ui.cc:1564
-msgid ""
-"Do you really want to remove track \"%1\" ?\n"
-"\n"
-"You may also lose the playlist used by this track.\n"
-"\n"
-"(This action cannot be undone, and the session file will be overwritten)"
-msgstr ""
-
-#: route_ui.cc:1566
-msgid ""
-"Do you really want to remove bus \"%1\" ?\n"
-"\n"
-"(This action cannot be undone, and the session file will be overwritten)"
-msgstr ""
-
-#: route_ui.cc:1574
-msgid "Remove track"
-msgstr ""
-
-#: route_ui.cc:1576
-msgid "Remove bus"
-msgstr ""
-
-#: route_ui.cc:1604
+#: route_ui.cc:1613
 msgid ""
 "The use of colons (':') is discouraged in track and bus names.\n"
 "Do you want to use this new name?"
 msgstr ""
 
-#: route_ui.cc:1608
+#: route_ui.cc:1617
 msgid "Use the new name"
 msgstr ""
 
-#: route_ui.cc:1609
+#: route_ui.cc:1618
 msgid "Re-edit the name"
 msgstr ""
 
-#: route_ui.cc:1622
+#: route_ui.cc:1631
 msgid "Rename Track"
 msgstr "Zmień nazwę ścieżki"
 
-#: route_ui.cc:1624
+#: route_ui.cc:1633
 msgid "Rename Bus"
 msgstr ""
 
-#: route_ui.cc:1692
+#: route_ui.cc:1693
 msgid ": comment editor"
 msgstr ": edytor komentarzy"
 
-#: route_ui.cc:1858
+#: route_ui.cc:1848
 msgid " latency"
 msgstr ""
 
-#: route_ui.cc:1871
+#: route_ui.cc:1888
 msgid "Cannot create route template directory %1"
 msgstr ""
 
-#: route_ui.cc:1877
+#: route_ui.cc:1894
 msgid "Save As Template"
 msgstr ""
 
-#: route_ui.cc:1878
+#: route_ui.cc:1895
 msgid "Template name:"
 msgstr ""
 
-#: route_ui.cc:1959
-msgid "Remote Control ID"
-msgstr "ID zdalnego sterowania"
+#: route_ui.cc:2019
+msgid ""
+"Left-click to invert polarity of channel %1 of this track. Right-click to "
+"show menu."
+msgstr ""
 
-#: route_ui.cc:1969
-msgid "Remote control ID:"
+#: route_ui.cc:2021
+msgid "Click to show a menu of channels to invert polarity"
 msgstr ""
 
-#: route_ui.cc:1983
-msgid ""
-"The remote control ID of %1 is: %2\n"
-"\n"
-"\n"
-"The remote control ID of %3 cannot be changed."
+#: save_as_dialog.cc:34
+msgid "Switch to newly-saved version"
 msgstr ""
 
-#: route_ui.cc:1987
-msgid "the master bus"
+#: save_as_dialog.cc:35
+msgid "Copy media to new session"
 msgstr ""
 
-#: route_ui.cc:1987
-msgid "the monitor bus"
+#: save_as_dialog.cc:36
+msgid "Copy external media into new session"
 msgstr ""
 
-#: route_ui.cc:1989
-msgid ""
-"The remote control ID of %5 is: %2\n"
-"\n"
-"\n"
-"Remote Control IDs are currently determined by track/bus ordering in %6.\n"
-"\n"
-"%3Use the User Interaction tab of the Preferences window if you want to "
-"change this%4"
+#: save_as_dialog.cc:37
+msgid "Newly-saved session should be empty"
 msgstr ""
 
-#: route_ui.cc:2046
-msgid ""
-"Left-click to invert (phase reverse) channel %1 of this track.  Right-click "
-"to show menu."
+#: save_as_dialog.cc:48
+msgid "Save as session name"
 msgstr ""
 
-#: route_ui.cc:2048
-msgid "Click to show a menu of channels for inversion (phase reverse)"
+#: save_as_dialog.cc:55
+msgid "Parent directory/folder"
 msgstr ""
 
 #: search_path_option.cc:35
@@ -10342,126 +12348,158 @@ msgstr ""
 msgid "the session folder"
 msgstr ""
 
+#: script_selector.cc:43
+msgid "<b>Type:</b>"
+msgstr ""
+
+#: script_selector.cc:49
+msgid "<b>Author:</b>"
+msgstr ""
+
+#: script_selector.cc:55
+msgid "<b>Description:</b>"
+msgstr ""
+
+#: script_selector.cc:131
+msgid "Select Script to unload"
+msgstr ""
+
+#: script_selector.cc:165
+msgid "<b>Name:</b>"
+msgstr ""
+
+#: script_selector.cc:172
+msgid "<b>Instance Parameters</b>"
+msgstr ""
+
 #: send_ui.cc:134
 msgid "Send "
 msgstr ""
 
-#: session_dialog.cc:61
+#: session_dialog.cc:71
 msgid "Session Setup"
 msgstr ""
 
-#: session_dialog.cc:66
+#: session_dialog.cc:76
 msgid "Advanced options ..."
 msgstr ""
 
-#: session_dialog.cc:263
-msgid "New Session"
-msgstr "Nowa Sesja"
+#: session_dialog.cc:163 session_dialog.cc:397
+msgid "Recent Sessions"
+msgstr "Poprzednie sesje"
 
-#: session_dialog.cc:301
-msgid "Check the website for more..."
+#: session_dialog.cc:311
+msgid "Sample Rate"
 msgstr ""
 
-#: session_dialog.cc:304
-msgid "Click to open the program website in your web browser"
+#: session_dialog.cc:312
+msgid "File Resolution"
 msgstr ""
 
-#: session_dialog.cc:324
-msgid "Sample Rate"
+#: session_dialog.cc:313
+msgid "Last Modified"
+msgstr ""
+
+#: session_dialog.cc:338
+msgid "New Session"
+msgstr "Nowa Sesja"
+
+#: session_dialog.cc:379
+msgid "Check the website for more..."
 msgstr ""
 
-#: session_dialog.cc:325
-msgid "Disk Format"
+#: session_dialog.cc:382
+msgid "Click to open the program website in your web browser"
 msgstr ""
 
-#: session_dialog.cc:343
+#: session_dialog.cc:404
 msgid "Select session file"
 msgstr ""
 
-#: session_dialog.cc:358
+#: session_dialog.cc:417
 msgid "Other Sessions"
 msgstr ""
 
-#: session_dialog.cc:384
+#: session_dialog.cc:424
+msgid "Safe Mode: Disable all Plugins"
+msgstr ""
+
+#: session_dialog.cc:454
 msgid "Open"
 msgstr ""
 
-#: session_dialog.cc:451
+#: session_dialog.cc:521
 msgid "Session name:"
 msgstr ""
 
-#: session_dialog.cc:473
+#: session_dialog.cc:543
 msgid "Create session folder in:"
 msgstr ""
 
-#: session_dialog.cc:496
+#: session_dialog.cc:564
 msgid "Select folder for session"
 msgstr ""
 
-#: session_dialog.cc:525
+#: session_dialog.cc:591
 msgid "Use this template"
 msgstr ""
 
-#: session_dialog.cc:528
+#: session_dialog.cc:594
 msgid "no template"
 msgstr ""
 
-#: session_dialog.cc:663 session_dialog.cc:699
-msgid "32 bit float"
+#: session_dialog.cc:746 session_dialog.cc:793
+msgid "32-bit float"
 msgstr ""
 
-#: session_dialog.cc:666 session_dialog.cc:702
-msgid "24 bit"
+#: session_dialog.cc:749 session_dialog.cc:796
+msgid "24-bit"
 msgstr ""
 
-#: session_dialog.cc:669 session_dialog.cc:705
-msgid "16 bit"
+#: session_dialog.cc:752 session_dialog.cc:799
+msgid "16-bit"
 msgstr ""
 
-#: session_dialog.cc:747 session_dialog.cc:748 session_dialog.cc:749
+#: session_dialog.cc:877 session_dialog.cc:878 session_dialog.cc:879
 msgid "channels"
 msgstr " "
 
-#: session_dialog.cc:763
+#: session_dialog.cc:893
 msgid "<b>Busses</b>"
 msgstr "<b>Szyny</b>"
 
-#: session_dialog.cc:764
+#: session_dialog.cc:894
 msgid "<b>Inputs</b>"
 msgstr "<b>Wejścia</b>"
 
-#: session_dialog.cc:765
+#: session_dialog.cc:895
 msgid "<b>Outputs</b>"
 msgstr "<b>Wyjścia</b>"
 
-#: session_dialog.cc:773
+#: session_dialog.cc:903
 msgid "Create master bus"
 msgstr ""
 
-#: session_dialog.cc:783
+#: session_dialog.cc:913
 msgid "Automatically connect to physical inputs"
 msgstr ""
 
-#: session_dialog.cc:790 session_dialog.cc:849
+#: session_dialog.cc:920 session_dialog.cc:979
 msgid "Use only"
 msgstr "Ilość używanych kanałów:"
 
-#: session_dialog.cc:843
+#: session_dialog.cc:973
 msgid "Automatically connect outputs"
 msgstr ""
 
-#: session_dialog.cc:865
+#: session_dialog.cc:995
 msgid "... to master bus"
 msgstr ""
 
-#: session_dialog.cc:875
+#: session_dialog.cc:1005
 msgid "... to physical outputs"
 msgstr ""
 
-#: session_import_dialog.cc:65
-msgid "Import from Session"
-msgstr ""
-
 #: session_import_dialog.cc:74
 msgid "Elements"
 msgstr ""
@@ -10482,197 +12520,197 @@ msgstr ""
 msgid "This will select all elements of this type!"
 msgstr ""
 
-#: session_metadata_dialog.cc:285
+#: session_metadata_dialog.cc:288
 msgid "EAN Check digit OK"
 msgstr ""
 
-#: session_metadata_dialog.cc:289
+#: session_metadata_dialog.cc:292
 msgid "EAN Check digit error"
 msgstr ""
 
-#: session_metadata_dialog.cc:289
+#: session_metadata_dialog.cc:292
 msgid "expected"
 msgstr ""
 
-#: session_metadata_dialog.cc:294
+#: session_metadata_dialog.cc:297
 msgid "EAN Length error"
 msgstr ""
 
-#: session_metadata_dialog.cc:423
+#: session_metadata_dialog.cc:426
 msgid "Field"
 msgstr ""
 
-#: session_metadata_dialog.cc:427
+#: session_metadata_dialog.cc:430
 msgid "Values (current value on top)"
 msgstr ""
 
-#: session_metadata_dialog.cc:641
+#: session_metadata_dialog.cc:644
 msgid "User"
 msgstr ""
 
-#: session_metadata_dialog.cc:649
+#: session_metadata_dialog.cc:652
 msgid "Email"
 msgstr ""
 
-#: session_metadata_dialog.cc:652
+#: session_metadata_dialog.cc:655
 msgid "Web"
 msgstr ""
 
-#: session_metadata_dialog.cc:655
+#: session_metadata_dialog.cc:658
 msgid "Organization"
 msgstr ""
 
-#: session_metadata_dialog.cc:658
+#: session_metadata_dialog.cc:661
 msgid "Country"
 msgstr ""
 
-#: session_metadata_dialog.cc:672
+#: session_metadata_dialog.cc:675
 msgid "Title"
 msgstr ""
 
-#: session_metadata_dialog.cc:675
+#: session_metadata_dialog.cc:678
 msgid "Track Number"
 msgstr ""
 
-#: session_metadata_dialog.cc:678
+#: session_metadata_dialog.cc:681
 msgid "Subtitle"
 msgstr ""
 
-#: session_metadata_dialog.cc:681
+#: session_metadata_dialog.cc:684
 msgid "Grouping"
 msgstr ""
 
-#: session_metadata_dialog.cc:684
+#: session_metadata_dialog.cc:687
 msgid "Artist"
 msgstr ""
 
-#: session_metadata_dialog.cc:687
+#: session_metadata_dialog.cc:690
 msgid "Genre"
 msgstr ""
 
-#: session_metadata_dialog.cc:690
+#: session_metadata_dialog.cc:693
 msgid "Comment"
 msgstr ""
 
-#: session_metadata_dialog.cc:693
+#: session_metadata_dialog.cc:696
 msgid "Copyright"
 msgstr ""
 
-#: session_metadata_dialog.cc:701 session_metadata_dialog.cc:706
+#: session_metadata_dialog.cc:704 session_metadata_dialog.cc:709
 msgid "Album"
 msgstr ""
 
-#: session_metadata_dialog.cc:709
+#: session_metadata_dialog.cc:712
 msgid "Year"
 msgstr ""
 
-#: session_metadata_dialog.cc:712
+#: session_metadata_dialog.cc:715
 msgid "Album Artist"
 msgstr ""
 
-#: session_metadata_dialog.cc:715
+#: session_metadata_dialog.cc:718
 msgid "Total Tracks"
 msgstr ""
 
-#: session_metadata_dialog.cc:718
+#: session_metadata_dialog.cc:721
 msgid "Disc Subtitle"
 msgstr ""
 
-#: session_metadata_dialog.cc:721
+#: session_metadata_dialog.cc:724
 msgid "Disc Number"
 msgstr ""
 
-#: session_metadata_dialog.cc:724
+#: session_metadata_dialog.cc:727
 msgid "Total Discs"
 msgstr ""
 
-#: session_metadata_dialog.cc:727
+#: session_metadata_dialog.cc:730
 msgid "Compilation"
 msgstr ""
 
-#: session_metadata_dialog.cc:730
+#: session_metadata_dialog.cc:733
 msgid "ISRC"
 msgstr ""
 
-#: session_metadata_dialog.cc:733
+#: session_metadata_dialog.cc:736
 msgid "EAN barcode"
 msgstr ""
 
-#: session_metadata_dialog.cc:746
+#: session_metadata_dialog.cc:749
 msgid "People"
 msgstr ""
 
-#: session_metadata_dialog.cc:751
+#: session_metadata_dialog.cc:754
 msgid "Lyricist"
 msgstr ""
 
-#: session_metadata_dialog.cc:754
+#: session_metadata_dialog.cc:757
 msgid "Composer"
 msgstr ""
 
-#: session_metadata_dialog.cc:757
+#: session_metadata_dialog.cc:760
 msgid "Conductor"
 msgstr ""
 
-#: session_metadata_dialog.cc:760
+#: session_metadata_dialog.cc:763
 msgid "Remixer"
 msgstr ""
 
-#: session_metadata_dialog.cc:763
+#: session_metadata_dialog.cc:766
 msgid "Arranger"
 msgstr ""
 
-#: session_metadata_dialog.cc:766
+#: session_metadata_dialog.cc:769
 msgid "Engineer"
 msgstr ""
 
-#: session_metadata_dialog.cc:769
+#: session_metadata_dialog.cc:772
 msgid "Producer"
 msgstr ""
 
-#: session_metadata_dialog.cc:772
+#: session_metadata_dialog.cc:775
 msgid "DJ Mixer"
 msgstr ""
 
-#: session_metadata_dialog.cc:775
+#: session_metadata_dialog.cc:778
 msgid "Metadata|Mixer"
 msgstr ""
 
-#: session_metadata_dialog.cc:783
+#: session_metadata_dialog.cc:786
 msgid "School"
 msgstr ""
 
-#: session_metadata_dialog.cc:788
+#: session_metadata_dialog.cc:791
 msgid "Instructor"
 msgstr ""
 
-#: session_metadata_dialog.cc:791
+#: session_metadata_dialog.cc:794
 msgid "Course"
 msgstr ""
 
-#: session_metadata_dialog.cc:799
+#: session_metadata_dialog.cc:802
 msgid "Edit Session Metadata"
 msgstr ""
 
-#: session_metadata_dialog.cc:830
+#: session_metadata_dialog.cc:833
 msgid "Import session metadata"
 msgstr ""
 
-#: session_metadata_dialog.cc:851
+#: session_metadata_dialog.cc:854
 msgid "Choose session to import metadata from"
 msgstr ""
 
-#: session_metadata_dialog.cc:889
+#: session_metadata_dialog.cc:892
 msgid "This session file could not be read!"
 msgstr ""
 
-#: session_metadata_dialog.cc:899
+#: session_metadata_dialog.cc:902
 msgid ""
 "The session file didn't contain metadata!\n"
 "Maybe this is an old session format?"
 msgstr ""
 
-#: session_metadata_dialog.cc:918
+#: session_metadata_dialog.cc:921
 msgid "Import all from:"
 msgstr ""
 
@@ -10819,209 +12857,230 @@ msgid "Destructive crossfade length"
 msgstr ""
 
 #: session_option_editor.cc:146
-msgid "Region fades active"
+msgid "Declick when transport starts and stops"
 msgstr ""
 
 #: session_option_editor.cc:153
+msgid "Declick when monitor state changes"
+msgstr ""
+
+#: session_option_editor.cc:160
+msgid "Region fades active"
+msgstr ""
+
+#: session_option_editor.cc:167
 msgid "Region fades visible"
 msgstr ""
 
-#: session_option_editor.cc:160 session_option_editor.cc:173
-#: session_option_editor.cc:187
+#: session_option_editor.cc:174 session_option_editor.cc:187
+#: session_option_editor.cc:208
 msgid "Media"
 msgstr ""
 
-#: session_option_editor.cc:160
+#: session_option_editor.cc:174
 msgid "Audio file format"
 msgstr ""
 
-#: session_option_editor.cc:164
+#: session_option_editor.cc:178
 msgid "Sample format"
 msgstr ""
 
-#: session_option_editor.cc:169
+#: session_option_editor.cc:183
 msgid "32-bit floating point"
 msgstr ""
 
-#: session_option_editor.cc:170
+#: session_option_editor.cc:184
 msgid "24-bit integer"
 msgstr ""
 
-#: session_option_editor.cc:171
+#: session_option_editor.cc:185
 msgid "16-bit integer"
 msgstr ""
 
-#: session_option_editor.cc:177
+#: session_option_editor.cc:191
 msgid "File type"
 msgstr ""
 
-#: session_option_editor.cc:182
-msgid "Broadcast WAVE"
+#: session_option_editor.cc:196
+msgid "Broadcast WAVE (4GB size limit)"
 msgstr ""
 
-#: session_option_editor.cc:183
-msgid "WAVE"
+#: session_option_editor.cc:198
+msgid "Broadcast RF64"
 msgstr ""
 
-#: session_option_editor.cc:184
+#: session_option_editor.cc:200
+msgid "WAVE (4GB size limit)"
+msgstr ""
+
+#: session_option_editor.cc:201
 msgid "WAVE-64"
 msgstr ""
 
-#: session_option_editor.cc:189
+#: session_option_editor.cc:205
+msgid "RF64 (WAV compatible)"
+msgstr ""
+
+#: session_option_editor.cc:210 session_option_editor.cc:216
+#: session_option_editor.cc:223
+msgid "Files|Locations"
+msgstr ""
+
+#: session_option_editor.cc:210
 msgid "File locations"
 msgstr ""
 
-#: session_option_editor.cc:191
+#: session_option_editor.cc:212
 msgid "Search for audio files in:"
 msgstr ""
 
-#: session_option_editor.cc:197
+#: session_option_editor.cc:218
 msgid "Search for MIDI files in:"
 msgstr ""
 
-#: session_option_editor.cc:206 session_option_editor.cc:218
-#: session_option_editor.cc:228 session_option_editor.cc:239
+#: session_option_editor.cc:227 session_option_editor.cc:239
+#: session_option_editor.cc:249 session_option_editor.cc:260
 msgid "Filenames"
 msgstr ""
 
-#: session_option_editor.cc:206
+#: session_option_editor.cc:227
 msgid "File Naming"
 msgstr ""
 
-#: session_option_editor.cc:212
+#: session_option_editor.cc:233
 msgid "Prefix Track number"
 msgstr ""
 
-#: session_option_editor.cc:217
+#: session_option_editor.cc:238
 msgid ""
 "Adds the current track number to the beginning of the recorded file name."
 msgstr ""
 
-#: session_option_editor.cc:222
+#: session_option_editor.cc:243
 msgid "Prefix Take Name"
 msgstr ""
 
-#: session_option_editor.cc:227
+#: session_option_editor.cc:248
 msgid "Adds the Take Name to the beginning of the recorded file name."
 msgstr ""
 
-#: session_option_editor.cc:232
+#: session_option_editor.cc:253
 msgid "Take Name"
 msgstr ""
 
-#: session_option_editor.cc:245
+#: session_option_editor.cc:266
 msgid ""
 "Track Input Monitoring automatically follows transport state (\"auto-input\")"
 msgstr ""
 
-#: session_option_editor.cc:252
+#: session_option_editor.cc:273
 msgid "Use monitor section in this session"
 msgstr ""
 
-#: session_option_editor.cc:257 session_option_editor.cc:259
-#: session_option_editor.cc:266 session_option_editor.cc:273
-#: session_option_editor.cc:280 session_option_editor.cc:282
-#: session_option_editor.cc:289 session_option_editor.cc:296
-#: session_option_editor.cc:303 session_option_editor.cc:310
-#: session_option_editor.cc:312
+#: session_option_editor.cc:278 session_option_editor.cc:280
+#: session_option_editor.cc:287 session_option_editor.cc:294
+#: session_option_editor.cc:301 session_option_editor.cc:303
+#: session_option_editor.cc:310 session_option_editor.cc:317
+#: session_option_editor.cc:324 session_option_editor.cc:331
+#: session_option_editor.cc:333
 msgid "Meterbridge"
 msgstr ""
 
-#: session_option_editor.cc:257
+#: session_option_editor.cc:278
 msgid "Route Display"
 msgstr ""
 
-#: session_option_editor.cc:261
+#: session_option_editor.cc:282
 msgid "Show Midi Tracks"
 msgstr ""
 
-#: session_option_editor.cc:268
+#: session_option_editor.cc:289
 msgid "Show Busses"
 msgstr ""
 
-#: session_option_editor.cc:275
+#: session_option_editor.cc:296
 msgid "Include Master Bus"
 msgstr ""
 
-#: session_option_editor.cc:280
+#: session_option_editor.cc:301
 msgid "Button Area"
 msgstr ""
 
-#: session_option_editor.cc:284
+#: session_option_editor.cc:305
 msgid "Rec-enable Button"
 msgstr ""
 
-#: session_option_editor.cc:291
+#: session_option_editor.cc:312
 msgid "Mute Button"
 msgstr ""
 
-#: session_option_editor.cc:298
+#: session_option_editor.cc:319
 msgid "Solo Button"
 msgstr ""
 
-#: session_option_editor.cc:305
+#: session_option_editor.cc:326
 msgid "Monitor Buttons"
 msgstr ""
 
-#: session_option_editor.cc:310
+#: session_option_editor.cc:331
 msgid "Name Labels"
 msgstr ""
 
-#: session_option_editor.cc:314
+#: session_option_editor.cc:335
 msgid "Track Name"
 msgstr ""
 
-#: session_option_editor.cc:325
+#: session_option_editor.cc:346
 msgid "MIDI region copies are independent"
 msgstr ""
 
-#: session_option_editor.cc:332
+#: session_option_editor.cc:353
 msgid ""
 "Policy for handling overlapping notes\n"
 " on the same MIDI channel"
 msgstr ""
 
-#: session_option_editor.cc:337
+#: session_option_editor.cc:358
 msgid "never allow them"
 msgstr ""
 
-#: session_option_editor.cc:338
+#: session_option_editor.cc:359
 msgid "don't do anything in particular"
 msgstr ""
 
-#: session_option_editor.cc:339
+#: session_option_editor.cc:360
 msgid "replace any overlapped existing note"
 msgstr ""
 
-#: session_option_editor.cc:340
+#: session_option_editor.cc:361
 msgid "shorten the overlapped existing note"
 msgstr ""
 
-#: session_option_editor.cc:341
+#: session_option_editor.cc:362
 msgid "shorten the overlapping new note"
 msgstr ""
 
-#: session_option_editor.cc:342
+#: session_option_editor.cc:363
 msgid "replace both overlapping notes with a single note"
 msgstr ""
 
-#: session_option_editor.cc:346
+#: session_option_editor.cc:367
 msgid "Glue to bars and beats"
 msgstr ""
 
-#: session_option_editor.cc:350
+#: session_option_editor.cc:371
 msgid "Glue new markers to bars and beats"
 msgstr ""
 
-#: session_option_editor.cc:357
+#: session_option_editor.cc:378
 msgid "Glue new regions to bars and beats"
 msgstr ""
 
-#: session_option_editor.cc:362
+#: session_option_editor.cc:383
 msgid "Defaults"
 msgstr ""
 
-#: session_option_editor.cc:364
+#: session_option_editor.cc:385
 msgid "Use these settings as defaults"
 msgstr ""
 
@@ -11057,25 +13116,13 @@ msgstr ""
 msgid "Timestamp:"
 msgstr ""
 
-#: sfdb_ui.cc:149
-msgid "Format:"
-msgstr "Format:"
-
-#: sfdb_ui.cc:188 sfdb_ui.cc:653
+#: sfdb_ui.cc:188 sfdb_ui.cc:659
 msgid "Tags:"
 msgstr "Etykiety:"
 
-#: sfdb_ui.cc:293 sfdb_ui.cc:409
-msgid "Could not read file: %1 (%2)."
-msgstr "Nie można odczytać pliku: %1 (%2)."
-
 #: sfdb_ui.cc:297
-msgid "<b>Midi File Information</b>"
-msgstr ""
-
-#: sfdb_ui.cc:458
-msgid "Could not access soundfile: "
-msgstr "Nie można uzyskać dostępu do pliku:"
+msgid "<b>Midi File Information</b>"
+msgstr ""
 
 #: sfdb_ui.cc:530
 msgid "SoundFileBox: Could not tokenize string: "
@@ -11085,285 +13132,281 @@ msgstr ""
 msgid "Search"
 msgstr "Szukaj"
 
-#: sfdb_ui.cc:576
+#: sfdb_ui.cc:581
 msgid "Audio and MIDI files"
 msgstr ""
 
-#: sfdb_ui.cc:579
+#: sfdb_ui.cc:584
 msgid "Audio files"
 msgstr "Pliki dźwiękowe"
 
-#: sfdb_ui.cc:582
+#: sfdb_ui.cc:587
 msgid "MIDI files"
 msgstr ""
 
-#: sfdb_ui.cc:585 add_video_dialog.cc:123
+#: sfdb_ui.cc:590 add_video_dialog.cc:123
 msgid "All files"
 msgstr "Wszystkie pliki"
 
-#: sfdb_ui.cc:604 add_video_dialog.cc:246
+#: sfdb_ui.cc:609 add_video_dialog.cc:246
 msgid "Browse Files"
 msgstr "Przeglądanie plików"
 
-#: sfdb_ui.cc:633
+#: sfdb_ui.cc:638
 msgid "Paths"
 msgstr "Ścieżki"
 
-#: sfdb_ui.cc:642
+#: sfdb_ui.cc:647
 msgid "Search Tags"
 msgstr "Wyszukiwanie etykiet"
 
-#: sfdb_ui.cc:658
+#: sfdb_ui.cc:664
 msgid "Sort:"
 msgstr ""
 
-#: sfdb_ui.cc:666
+#: sfdb_ui.cc:672
 msgid "Longest"
 msgstr ""
 
-#: sfdb_ui.cc:667
+#: sfdb_ui.cc:673
 msgid "Shortest"
 msgstr ""
 
-#: sfdb_ui.cc:668
+#: sfdb_ui.cc:674
 msgid "Newest"
 msgstr ""
 
-#: sfdb_ui.cc:669
+#: sfdb_ui.cc:675
 msgid "Oldest"
 msgstr ""
 
-#: sfdb_ui.cc:670
+#: sfdb_ui.cc:676
 msgid "Most downloaded"
 msgstr ""
 
-#: sfdb_ui.cc:671
+#: sfdb_ui.cc:677
 msgid "Least downloaded"
 msgstr ""
 
-#: sfdb_ui.cc:672
+#: sfdb_ui.cc:678
 msgid "Highest rated"
 msgstr ""
 
-#: sfdb_ui.cc:673
+#: sfdb_ui.cc:679
 msgid "Lowest rated"
 msgstr ""
 
-#: sfdb_ui.cc:678
+#: sfdb_ui.cc:684
 msgid "More"
 msgstr ""
 
-#: sfdb_ui.cc:682
+#: sfdb_ui.cc:688
 msgid "Similar"
 msgstr ""
 
-#: sfdb_ui.cc:694
+#: sfdb_ui.cc:700
 msgid "ID"
 msgstr ""
 
-#: sfdb_ui.cc:695 add_video_dialog.cc:83
+#: sfdb_ui.cc:701 add_video_dialog.cc:83
 msgid "Filename"
 msgstr ""
 
-#: sfdb_ui.cc:697
+#: sfdb_ui.cc:703 time_fx_dialog.cc:154
 msgid "Duration"
 msgstr ""
 
-#: sfdb_ui.cc:698
+#: sfdb_ui.cc:704
 msgid "Size"
 msgstr ""
 
-#: sfdb_ui.cc:699
+#: sfdb_ui.cc:705
 msgid "Samplerate"
 msgstr ""
 
-#: sfdb_ui.cc:700
+#: sfdb_ui.cc:706
 msgid "License"
 msgstr ""
 
-#: sfdb_ui.cc:718
+#: sfdb_ui.cc:724
 msgid "Search Freesound"
 msgstr ""
 
-#: sfdb_ui.cc:738
-msgid "Press to import selected files and close this window"
-msgstr ""
-
-#: sfdb_ui.cc:739
-msgid "Press to import selected files and leave this window open"
+#: sfdb_ui.cc:741
+msgid "Press to import selected files"
 msgstr ""
 
-#: sfdb_ui.cc:740
+#: sfdb_ui.cc:742
 msgid "Press to close this window without importing any files"
 msgstr ""
 
-#: sfdb_ui.cc:936
+#: sfdb_ui.cc:937
 msgid "SoundFileBrowser: Could not tokenize string: "
 msgstr ""
 
-#: sfdb_ui.cc:1136
+#: sfdb_ui.cc:1137
 msgid "%1 more page of 100 results available"
 msgid_plural "%1 more pages of 100 results available"
 msgstr[0] ""
 msgstr[1] ""
 msgstr[2] ""
 
-#: sfdb_ui.cc:1141
+#: sfdb_ui.cc:1142
 msgid "No more results available"
 msgstr ""
 
-#: sfdb_ui.cc:1205
+#: sfdb_ui.cc:1206
 msgid "B"
 msgstr ""
 
-#: sfdb_ui.cc:1207
+#: sfdb_ui.cc:1208
 msgid "kB"
 msgstr ""
 
-#: sfdb_ui.cc:1209 sfdb_ui.cc:1211
+#: sfdb_ui.cc:1210 sfdb_ui.cc:1212
 msgid "MB"
 msgstr ""
 
-#: sfdb_ui.cc:1213
+#: sfdb_ui.cc:1214
 msgid "GB"
 msgstr ""
 
-#: sfdb_ui.cc:1425 sfdb_ui.cc:1738 sfdb_ui.cc:1801 sfdb_ui.cc:1819
+#: sfdb_ui.cc:1431 sfdb_ui.cc:1728 sfdb_ui.cc:1764 sfdb_ui.cc:1782
 msgid "one track per file"
 msgstr "jedna ścieżka na plik"
 
-#: sfdb_ui.cc:1428 sfdb_ui.cc:1802 sfdb_ui.cc:1820
+#: sfdb_ui.cc:1434 sfdb_ui.cc:1765 sfdb_ui.cc:1783
 msgid "one track per channel"
 msgstr "jedna ścieżka na kanał"
 
-#: sfdb_ui.cc:1436 sfdb_ui.cc:1804 sfdb_ui.cc:1821
+#: sfdb_ui.cc:1442 sfdb_ui.cc:1767 sfdb_ui.cc:1784
 msgid "sequence files"
 msgstr ""
 
-#: sfdb_ui.cc:1439 sfdb_ui.cc:1809
+#: sfdb_ui.cc:1445 sfdb_ui.cc:1772
 msgid "all files in one track"
 msgstr ""
 
-#: sfdb_ui.cc:1440 sfdb_ui.cc:1803
+#: sfdb_ui.cc:1446 sfdb_ui.cc:1766
 msgid "merge files"
 msgstr "połącz pliki"
 
-#: sfdb_ui.cc:1446 sfdb_ui.cc:1806
+#: sfdb_ui.cc:1452 sfdb_ui.cc:1769
 msgid "one region per file"
 msgstr ""
 
-#: sfdb_ui.cc:1449 sfdb_ui.cc:1807
+#: sfdb_ui.cc:1455 sfdb_ui.cc:1770
 msgid "one region per channel"
 msgstr ""
 
-#: sfdb_ui.cc:1454 sfdb_ui.cc:1808 sfdb_ui.cc:1822
+#: sfdb_ui.cc:1460 sfdb_ui.cc:1771 sfdb_ui.cc:1785
 msgid "all files in one region"
 msgstr ""
 
-#: sfdb_ui.cc:1521
+#: sfdb_ui.cc:1527
 msgid ""
 "One or more of the selected files\n"
 "cannot be used by %1"
 msgstr ""
 
-#: sfdb_ui.cc:1665
+#: sfdb_ui.cc:1671
 msgid "Copy files to session"
 msgstr "Skopiuj pliki do sesji"
 
-#: sfdb_ui.cc:1682 sfdb_ui.cc:1859
+#: sfdb_ui.cc:1686 sfdb_ui.cc:1825
 msgid "file timestamp"
 msgstr ""
 
-#: sfdb_ui.cc:1683 sfdb_ui.cc:1861
+#: sfdb_ui.cc:1687 sfdb_ui.cc:1827
 msgid "edit point"
 msgstr ""
 
-#: sfdb_ui.cc:1684 sfdb_ui.cc:1863
+#: sfdb_ui.cc:1688 sfdb_ui.cc:1829
 msgid "playhead"
 msgstr ""
 
-#: sfdb_ui.cc:1685
+#: sfdb_ui.cc:1689
 msgid "session start"
 msgstr ""
 
-#: sfdb_ui.cc:1691
-msgid "<b>Add files as ...</b>"
+#: sfdb_ui.cc:1695
+msgid "<b>Add files ...</b>"
 msgstr ""
 
-#: sfdb_ui.cc:1713
+#: sfdb_ui.cc:1700
 msgid "<b>Insert at</b>"
 msgstr ""
 
-#: sfdb_ui.cc:1726
+#: sfdb_ui.cc:1705
 msgid "<b>Mapping</b>"
 msgstr ""
 
-#: sfdb_ui.cc:1744
+#: sfdb_ui.cc:1710
 msgid "<b>Conversion quality</b>"
 msgstr ""
 
-#: sfdb_ui.cc:1756
+#: sfdb_ui.cc:1715
 msgid "<b>Instrument</b>"
 msgstr ""
 
-#: sfdb_ui.cc:1768 sfdb_ui.cc:1875
+#: sfdb_ui.cc:1734 sfdb_ui.cc:1841
 msgid "Best"
 msgstr "Najlepsza"
 
-#: sfdb_ui.cc:1769 sfdb_ui.cc:1877
+#: sfdb_ui.cc:1735 sfdb_ui.cc:1843
 msgid "Good"
 msgstr "Dobra"
 
-#: sfdb_ui.cc:1770 sfdb_ui.cc:1879
+#: sfdb_ui.cc:1736 sfdb_ui.cc:1845
 msgid "Quick"
 msgstr "Szybka"
 
-#: sfdb_ui.cc:1772
+#: sfdb_ui.cc:1738
 msgid "Fastest"
 msgstr "Najszybciej"
 
-#: shuttle_control.cc:56
+#: shuttle_control.cc:64
 msgid "Shuttle speed control (Context-click for options)"
 msgstr ""
 
-#: shuttle_control.cc:174
+#: shuttle_control.cc:201 time_fx_dialog.cc:164
 msgid "Percent"
 msgstr ""
 
-#: shuttle_control.cc:182
+#: shuttle_control.cc:209
 msgid "Units"
 msgstr ""
 
-#: shuttle_control.cc:188 shuttle_control.cc:609
+#: shuttle_control.cc:215 shuttle_control.cc:671
 msgid "Sprung"
 msgstr ""
 
-#: shuttle_control.cc:192 shuttle_control.cc:612
+#: shuttle_control.cc:219 shuttle_control.cc:674
 msgid "Wheel"
 msgstr ""
 
-#: shuttle_control.cc:226
+#: shuttle_control.cc:253
 msgid "Maximum speed"
 msgstr "Maksymalna prędkość"
 
-#: shuttle_control.cc:568
+#: shuttle_control.cc:256
+msgid "Reset to 100%"
+msgstr ""
+
+#: shuttle_control.cc:633
 msgid "Playing"
 msgstr ""
 
-#: shuttle_control.cc:583
+#: shuttle_control.cc:648
 #, c-format
 msgid "<<< %+d semitones"
 msgstr ""
 
-#: shuttle_control.cc:585
+#: shuttle_control.cc:650
 #, c-format
 msgid ">>> %+d semitones"
 msgstr ""
 
-#: shuttle_control.cc:590
-msgid "Stopped"
-msgstr ""
-
 #: soundcloud_export_selector.cc:44
 msgid "User Email"
 msgstr ""
@@ -11388,7 +13431,7 @@ msgstr ""
 msgid "%1: %2 of %3 bytes uploaded"
 msgstr ""
 
-#: splash.cc:73
+#: splash.cc:78
 msgid "%1 loading ..."
 msgstr ""
 
@@ -11404,17 +13447,17 @@ msgstr ""
 msgid "Azimuth:"
 msgstr ""
 
-#: startup.cc:67
+#: startup.cc:71
 msgid ""
 "Use an external mixer or the hardware mixer of your audio interface.\n"
 "%1 will play NO role in monitoring"
 msgstr ""
 
-#: startup.cc:69
+#: startup.cc:73
 msgid "Ask %1 to play back material as it is being recorded"
 msgstr ""
 
-#: startup.cc:142
+#: startup.cc:146
 msgid ""
 "<span size=\"larger\">%1 is a digital audio workstation. You can use it to "
 "record, edit and mix multi-track audio. You can produce your own CDs, mix "
@@ -11424,15 +13467,15 @@ msgid ""
 "program.</span> "
 msgstr ""
 
-#: startup.cc:168
+#: startup.cc:172
 msgid "Welcome to %1"
 msgstr ""
 
-#: startup.cc:191
+#: startup.cc:195
 msgid "Default folder for %1 sessions"
 msgstr ""
 
-#: startup.cc:197
+#: startup.cc:201
 msgid ""
 "Each project that you work on with %1 has its own folder.\n"
 "These can require a lot of disk space if you are recording audio.\n"
@@ -11442,11 +13485,11 @@ msgid ""
 "<i>(You can put new sessions anywhere, this is just a default)</i>"
 msgstr ""
 
-#: startup.cc:220
+#: startup.cc:224
 msgid "Default folder for new sessions"
 msgstr ""
 
-#: startup.cc:241
+#: startup.cc:245
 msgid ""
 "While recording instruments or vocals, you probably want to listen to the\n"
 "signal as well as record it. This is called \"monitoring\". There are\n"
@@ -11460,31 +13503,31 @@ msgid ""
 "<i>If you do not understand what this is about, just accept the default.</i>"
 msgstr ""
 
-#: startup.cc:262
+#: startup.cc:266
 msgid "Monitoring Choices"
 msgstr ""
 
-#: startup.cc:285
+#: startup.cc:289
 msgid "Use a Master bus directly"
 msgstr ""
 
-#: startup.cc:287
+#: startup.cc:291
 msgid ""
 "Connect the Master bus directly to your hardware outputs. This is preferable "
 "for simple usage."
 msgstr ""
 
-#: startup.cc:296
+#: startup.cc:300
 msgid "Use an additional Monitor bus"
 msgstr ""
 
-#: startup.cc:299
+#: startup.cc:303
 msgid ""
 "Use a Monitor bus between Master bus and hardware outputs for \n"
 "greater control in monitoring without affecting the mix."
 msgstr ""
 
-#: startup.cc:321
+#: startup.cc:325
 msgid ""
 "<i>You can change this preference at any time via the Preferences dialog.\n"
 "You can also add or remove the monitor section to/from any session.</i>\n"
@@ -11492,46 +13535,42 @@ msgid ""
 "<i>If you do not understand what this is about, just accept the default.</i>"
 msgstr ""
 
-#: startup.cc:332
+#: startup.cc:336
 msgid "Monitor Section"
 msgstr ""
 
-#: step_entry.cc:60
+#: step_entry.cc:59
 msgid "Step Entry: %1"
 msgstr ""
 
-#: step_entry.cc:65
+#: step_entry.cc:64
 msgid ">beat"
 msgstr ""
 
-#: step_entry.cc:66
+#: step_entry.cc:65
 msgid ">bar"
 msgstr ""
 
-#: step_entry.cc:67
+#: step_entry.cc:66
 msgid ">EP"
 msgstr ""
 
-#: step_entry.cc:68
+#: step_entry.cc:67
 msgid "sustain"
 msgstr ""
 
-#: step_entry.cc:69
+#: step_entry.cc:68
 msgid "rest"
 msgstr ""
 
-#: step_entry.cc:70
+#: step_entry.cc:69
 msgid "g-rest"
 msgstr ""
 
-#: step_entry.cc:71
+#: step_entry.cc:70
 msgid "back"
 msgstr ""
 
-#: step_entry.cc:82 step_entry.cc:85
-msgid "+"
-msgstr ""
-
 #: step_entry.cc:191
 msgid "Set note length to a whole note"
 msgstr ""
@@ -11640,11 +13679,11 @@ msgstr ""
 msgid "Insert a program change message"
 msgstr ""
 
-#: step_entry.cc:343 step_entry.cc:700
+#: step_entry.cc:343 step_entry.cc:645
 msgid "Move Insert Position Back by Note Length"
 msgstr ""
 
-#: step_entry.cc:344 step_entry.cc:698
+#: step_entry.cc:344 step_entry.cc:643
 msgid "Move Insert Position to Edit Point"
 msgstr ""
 
@@ -11656,240 +13695,244 @@ msgstr ""
 msgid "Octave"
 msgstr ""
 
-#: step_entry.cc:598
+#: step_entry.cc:592
 msgid "Insert Note A"
 msgstr ""
 
-#: step_entry.cc:599
+#: step_entry.cc:593
 msgid "Insert Note A-sharp"
 msgstr ""
 
-#: step_entry.cc:600
+#: step_entry.cc:594
 msgid "Insert Note B"
 msgstr ""
 
-#: step_entry.cc:601
+#: step_entry.cc:595
 msgid "Insert Note C"
 msgstr ""
 
-#: step_entry.cc:602
+#: step_entry.cc:596
 msgid "Insert Note C-sharp"
 msgstr ""
 
-#: step_entry.cc:603
+#: step_entry.cc:597
 msgid "Insert Note D"
 msgstr ""
 
-#: step_entry.cc:604
+#: step_entry.cc:598
 msgid "Insert Note D-sharp"
 msgstr ""
 
-#: step_entry.cc:605
+#: step_entry.cc:599
 msgid "Insert Note E"
 msgstr ""
 
-#: step_entry.cc:606
+#: step_entry.cc:600
 msgid "Insert Note F"
 msgstr ""
 
-#: step_entry.cc:607
+#: step_entry.cc:601
 msgid "Insert Note F-sharp"
 msgstr ""
 
-#: step_entry.cc:608
+#: step_entry.cc:602
 msgid "Insert Note G"
 msgstr ""
 
-#: step_entry.cc:609
+#: step_entry.cc:603
 msgid "Insert Note G-sharp"
 msgstr ""
 
-#: step_entry.cc:611
+#: step_entry.cc:605
 msgid "Insert a Note-length Rest"
 msgstr ""
 
-#: step_entry.cc:612
+#: step_entry.cc:606
 msgid "Insert a Snap-length Rest"
 msgstr ""
 
-#: step_entry.cc:614 step_entry.cc:615
+#: step_entry.cc:608 step_entry.cc:609
 msgid "Move to next octave"
 msgstr ""
 
-#: step_entry.cc:617
+#: step_entry.cc:611
 msgid "Move to Next Note Length"
 msgstr ""
 
-#: step_entry.cc:618
+#: step_entry.cc:612
 msgid "Move to Previous Note Length"
 msgstr ""
 
-#: step_entry.cc:620
+#: step_entry.cc:614
 msgid "Increase Note Length"
 msgstr ""
 
-#: step_entry.cc:621
+#: step_entry.cc:615
 msgid "Decrease Note Length"
 msgstr ""
 
-#: step_entry.cc:623
+#: step_entry.cc:617
 msgid "Move to Next Note Velocity"
 msgstr ""
 
-#: step_entry.cc:624
+#: step_entry.cc:618
 msgid "Move to Previous Note Velocity"
 msgstr ""
 
-#: step_entry.cc:626
+#: step_entry.cc:620
 msgid "Increase Note Velocity"
 msgstr ""
 
-#: step_entry.cc:627
+#: step_entry.cc:621
 msgid "Decrease Note Velocity"
 msgstr ""
 
-#: step_entry.cc:629
+#: step_entry.cc:623
 msgid "Switch to the 1st octave"
 msgstr ""
 
-#: step_entry.cc:630
+#: step_entry.cc:624
 msgid "Switch to the 2nd octave"
 msgstr ""
 
-#: step_entry.cc:631
+#: step_entry.cc:625
 msgid "Switch to the 3rd octave"
 msgstr ""
 
-#: step_entry.cc:632
+#: step_entry.cc:626
 msgid "Switch to the 4th octave"
 msgstr ""
 
-#: step_entry.cc:633
+#: step_entry.cc:627
 msgid "Switch to the 5th octave"
 msgstr ""
 
-#: step_entry.cc:634
+#: step_entry.cc:628
 msgid "Switch to the 6th octave"
 msgstr ""
 
-#: step_entry.cc:635
+#: step_entry.cc:629
 msgid "Switch to the 7th octave"
 msgstr ""
 
-#: step_entry.cc:636
+#: step_entry.cc:630
 msgid "Switch to the 8th octave"
 msgstr ""
 
-#: step_entry.cc:637
+#: step_entry.cc:631
 msgid "Switch to the 9th octave"
 msgstr ""
 
-#: step_entry.cc:638
+#: step_entry.cc:632
 msgid "Switch to the 10th octave"
 msgstr ""
 
-#: step_entry.cc:639
+#: step_entry.cc:633
 msgid "Switch to the 11th octave"
 msgstr ""
 
-#: step_entry.cc:644
+#: step_entry.cc:635
+msgid "Toggle Triple Notes"
+msgstr ""
+
+#: step_entry.cc:638
+msgid "Toggle Chord Entry"
+msgstr ""
+
+#: step_entry.cc:640
+msgid "Sustain Selected Notes by Note Length"
+msgstr ""
+
+#: step_entry.cc:650
 msgid "Set Note Length to Whole"
 msgstr ""
 
-#: step_entry.cc:646
+#: step_entry.cc:652
 msgid "Set Note Length to 1/2"
 msgstr ""
 
-#: step_entry.cc:648
+#: step_entry.cc:654
 msgid "Set Note Length to 1/3"
 msgstr ""
 
-#: step_entry.cc:650
+#: step_entry.cc:656
 msgid "Set Note Length to 1/4"
 msgstr ""
 
-#: step_entry.cc:652
+#: step_entry.cc:658
 msgid "Set Note Length to 1/8"
 msgstr ""
 
-#: step_entry.cc:654
+#: step_entry.cc:660
 msgid "Set Note Length to 1/16"
 msgstr ""
 
-#: step_entry.cc:656
+#: step_entry.cc:662
 msgid "Set Note Length to 1/32"
 msgstr ""
 
-#: step_entry.cc:658
+#: step_entry.cc:664
 msgid "Set Note Length to 1/64"
 msgstr ""
 
-#: step_entry.cc:663
+#: step_entry.cc:669
 msgid "Set Note Velocity to Pianississimo"
 msgstr ""
 
-#: step_entry.cc:665
+#: step_entry.cc:671
 msgid "Set Note Velocity to Pianissimo"
 msgstr ""
 
-#: step_entry.cc:667
+#: step_entry.cc:673
 msgid "Set Note Velocity to Piano"
 msgstr ""
 
-#: step_entry.cc:669
+#: step_entry.cc:675
 msgid "Set Note Velocity to Mezzo-Piano"
 msgstr ""
 
-#: step_entry.cc:671
+#: step_entry.cc:677
 msgid "Set Note Velocity to Mezzo-Forte"
 msgstr ""
 
-#: step_entry.cc:673
+#: step_entry.cc:679
 msgid "Set Note Velocity to Forte"
 msgstr ""
 
-#: step_entry.cc:675 step_entry.cc:677
+#: step_entry.cc:681 step_entry.cc:683
 msgid "Set Note Velocity to Fortississimo"
 msgstr ""
 
-#: step_entry.cc:679
-msgid "Toggle Triple Notes"
-msgstr ""
-
-#: step_entry.cc:684
+#: step_entry.cc:688
 msgid "No Dotted Notes"
 msgstr ""
 
-#: step_entry.cc:686
+#: step_entry.cc:689
 msgid "Toggled Dotted Notes"
 msgstr ""
 
-#: step_entry.cc:688
+#: step_entry.cc:690
 msgid "Toggled Double-Dotted Notes"
 msgstr ""
 
-#: step_entry.cc:690
+#: step_entry.cc:691
 msgid "Toggled Triple-Dotted Notes"
 msgstr ""
 
-#: step_entry.cc:693
-msgid "Toggle Chord Entry"
-msgstr ""
-
-#: step_entry.cc:695
-msgid "Sustain Selected Notes by Note Length"
-msgstr ""
-
-#: stereo_panner.cc:133
+#: stereo_panner.cc:129
 #, c-format
 msgid "L:%3d R:%3d Width:%d%%"
 msgstr ""
 
-#: stereo_panner_editor.cc:35
+#: stereo_panner.cc:272
+msgid "Panner|M"
+msgstr ""
+
+#: stereo_panner_editor.cc:37
 msgid "Stereo Panner"
 msgstr ""
 
-#: stereo_panner_editor.cc:49
+#: stereo_panner_editor.cc:51
 msgid "Width"
 msgstr ""
 
@@ -11897,176 +13940,189 @@ msgstr ""
 msgid "Strip Silence"
 msgstr ""
 
-#: strip_silence_dialog.cc:75
+#: strip_silence_dialog.cc:65
+msgid "Threshold"
+msgstr "Wartość progowa"
+
+#: strip_silence_dialog.cc:76
 msgid "Minimum length"
 msgstr ""
 
-#: strip_silence_dialog.cc:83
+#: strip_silence_dialog.cc:84
 msgid "Fade length"
 msgstr ""
 
-#: tempo_dialog.cc:41 tempo_dialog.cc:57
+#: strip_silence_dialog.cc:111 strip_silence_dialog.cc:298
+msgid "Analyzing"
+msgstr ""
+
+#: tempo_dialog.cc:43 tempo_dialog.cc:60
 msgid "bar:"
 msgstr ""
 
-#: tempo_dialog.cc:42 tempo_dialog.cc:58
+#: tempo_dialog.cc:44 tempo_dialog.cc:61
 msgid "beat:"
 msgstr ""
 
-#: tempo_dialog.cc:43 tempo_dialog.cc:59
+#: tempo_dialog.cc:45 tempo_dialog.cc:62
 msgid "Pulse note"
 msgstr ""
 
-#: tempo_dialog.cc:44 tempo_dialog.cc:60
+#: tempo_dialog.cc:46 tempo_dialog.cc:63
 msgid "Tap tempo"
 msgstr ""
 
-#: tempo_dialog.cc:54
-msgid "Edit Tempo"
-msgstr ""
-
-#: tempo_dialog.cc:77 tempo_dialog.cc:78 tempo_dialog.cc:324
-#: tempo_dialog.cc:325
+#: tempo_dialog.cc:81 tempo_dialog.cc:82 tempo_dialog.cc:448
+#: tempo_dialog.cc:449
 msgid "whole"
 msgstr ""
 
-#: tempo_dialog.cc:79 tempo_dialog.cc:80 tempo_dialog.cc:326
-#: tempo_dialog.cc:327
+#: tempo_dialog.cc:83 tempo_dialog.cc:84 tempo_dialog.cc:450
+#: tempo_dialog.cc:451
 msgid "second"
 msgstr ""
 
-#: tempo_dialog.cc:81 tempo_dialog.cc:82 tempo_dialog.cc:328
-#: tempo_dialog.cc:329
+#: tempo_dialog.cc:85 tempo_dialog.cc:86 tempo_dialog.cc:452
+#: tempo_dialog.cc:453
 msgid "third"
 msgstr ""
 
-#: tempo_dialog.cc:83 tempo_dialog.cc:84 tempo_dialog.cc:330
-#: tempo_dialog.cc:331
+#: tempo_dialog.cc:87 tempo_dialog.cc:88 tempo_dialog.cc:454
+#: tempo_dialog.cc:455
 msgid "quarter"
 msgstr ""
 
-#: tempo_dialog.cc:85 tempo_dialog.cc:86 tempo_dialog.cc:332
-#: tempo_dialog.cc:333
+#: tempo_dialog.cc:89 tempo_dialog.cc:90 tempo_dialog.cc:456
+#: tempo_dialog.cc:457
 msgid "eighth"
 msgstr ""
 
-#: tempo_dialog.cc:87 tempo_dialog.cc:88 tempo_dialog.cc:334
-#: tempo_dialog.cc:335
+#: tempo_dialog.cc:91 tempo_dialog.cc:92 tempo_dialog.cc:458
+#: tempo_dialog.cc:459
 msgid "sixteenth"
 msgstr ""
 
-#: tempo_dialog.cc:89 tempo_dialog.cc:90 tempo_dialog.cc:336
-#: tempo_dialog.cc:337
+#: tempo_dialog.cc:93 tempo_dialog.cc:94 tempo_dialog.cc:460
+#: tempo_dialog.cc:461
 msgid "thirty-second"
 msgstr ""
 
-#: tempo_dialog.cc:91 tempo_dialog.cc:92 tempo_dialog.cc:338
-#: tempo_dialog.cc:339
+#: tempo_dialog.cc:95 tempo_dialog.cc:96 tempo_dialog.cc:462
+#: tempo_dialog.cc:463
 msgid "sixty-fourth"
 msgstr ""
 
-#: tempo_dialog.cc:93 tempo_dialog.cc:94 tempo_dialog.cc:340
-#: tempo_dialog.cc:341
+#: tempo_dialog.cc:97 tempo_dialog.cc:98 tempo_dialog.cc:464
+#: tempo_dialog.cc:465
 msgid "one-hundred-twenty-eighth"
 msgstr ""
 
-#: tempo_dialog.cc:121
+#: tempo_dialog.cc:115 tempo_dialog.cc:116
+msgid "ramped"
+msgstr ""
+
+#: tempo_dialog.cc:117 tempo_dialog.cc:118
+msgid "constant"
+msgstr ""
+
+#: tempo_dialog.cc:133 tempo_dialog.cc:134 tempo_dialog.cc:482
+#: tempo_dialog.cc:483
+msgid "music"
+msgstr ""
+
+#: tempo_dialog.cc:161
 msgid "Beats per minute:"
 msgstr ""
 
-#: tempo_dialog.cc:155
+#: tempo_dialog.cc:195
 msgid "Tempo begins at"
 msgstr ""
 
-#: tempo_dialog.cc:251
+#: tempo_dialog.cc:201
+msgid "Lock Style:"
+msgstr ""
+
+#: tempo_dialog.cc:209
+msgid "Tempo Type:"
+msgstr ""
+
+#: tempo_dialog.cc:321
 msgid "incomprehensible pulse note type (%1)"
 msgstr ""
 
-#: tempo_dialog.cc:307
-msgid "Edit Meter"
+#: tempo_dialog.cc:334
+msgid "incomprehensible tempo type (%1)"
 msgstr ""
 
-#: tempo_dialog.cc:356
-msgid "Note value:"
+#: tempo_dialog.cc:347
+msgid "incomprehensible lock style (%1)"
 msgstr ""
 
-#: tempo_dialog.cc:357
-msgid "Beats per bar:"
+#: tempo_dialog.cc:498
+msgid "Note value:"
 msgstr ""
 
-#: tempo_dialog.cc:371
-msgid "Meter begins at bar:"
+#: tempo_dialog.cc:499
+msgid "Lock style:"
 msgstr ""
 
-#: tempo_dialog.cc:484
-msgid "incomprehensible meter note type (%1)"
+#: tempo_dialog.cc:500
+msgid "Beats per bar:"
 msgstr ""
 
-#: theme_manager.cc:65
-msgid "Dark Theme"
+#: tempo_dialog.cc:514
+msgid "Meter begins at bar:"
 msgstr ""
 
-#: theme_manager.cc:66
-msgid "Light Theme"
+#: tempo_dialog.cc:638
+msgid "incomprehensible meter note type (%1)"
 msgstr ""
 
-#: theme_manager.cc:67
-msgid "Restore Defaults"
+#: tempo_dialog.cc:651
+msgid "incomprehensible meter lock style (%1)"
 msgstr ""
 
-#: theme_manager.cc:68
+#: theme_manager.cc:53
 msgid "Draw \"flat\" buttons"
 msgstr ""
 
-#: theme_manager.cc:69
+#: theme_manager.cc:54
 msgid "Blink Rec-Arm buttons"
 msgstr ""
 
-#: theme_manager.cc:70
+#: theme_manager.cc:55
 msgid "Color regions using their track's color"
 msgstr ""
 
-#: theme_manager.cc:71
+#: theme_manager.cc:56
 msgid "Show waveform clipping"
 msgstr ""
 
-#: theme_manager.cc:73
+#: theme_manager.cc:58
 msgid "Waveforms color gradient depth"
 msgstr ""
 
-#: theme_manager.cc:75
+#: theme_manager.cc:60
 msgid "Timeline item gradient depth"
 msgstr ""
 
-#: theme_manager.cc:76
+#: theme_manager.cc:61
 msgid "All floating windows are dialogs"
 msgstr ""
 
-#: theme_manager.cc:77
+#: theme_manager.cc:62
 msgid "Transient windows follow front window."
 msgstr ""
 
-#: theme_manager.cc:78
-msgid "Icon Set"
-msgstr ""
-
-#: theme_manager.cc:87
-msgid "Object"
-msgstr "Obiekt"
-
-#: theme_manager.cc:163
-msgid "Items"
-msgstr ""
-
-#: theme_manager.cc:164
-msgid "Palette"
+#: theme_manager.cc:63
+msgid "Float detached monitor-section window"
 msgstr ""
 
-#: theme_manager.cc:165
-msgid "Transparency"
+#: theme_manager.cc:64
+msgid "Icon Set"
 msgstr ""
 
-#: theme_manager.cc:195
+#: theme_manager.cc:132
 msgid ""
 "Mark all floating windows to be type \"Dialog\" rather than using \"Utility"
 "\" for some.\n"
@@ -12074,93 +14130,96 @@ msgid ""
 "take effect"
 msgstr ""
 
-#: theme_manager.cc:199
+#: theme_manager.cc:136
 msgid ""
 "Make transient windows follow the front window when toggling between the "
 "editor and mixer.\n"
 "This requires a restart of %1 to take effect"
 msgstr ""
 
-#: theme_manager.cc:620
-msgid "Color Palette"
+#: theme_manager.cc:139
+msgid ""
+"When detaching the monitoring section, mark it as \"Utility\" window to stay "
+"in front.\n"
+"This requires a restart of %1 to take effect"
 msgstr ""
 
 #: time_axis_view.cc:148
 msgid "Track/Bus name (double click to edit)"
 msgstr ""
 
-#: time_axis_view_item.cc:345
+#: time_axis_view_item.cc:326
 msgid "new duration %1 frame is out of bounds for %2"
 msgid_plural "new duration of %1 frames is out of bounds for %2"
 msgstr[0] ""
 msgstr[1] ""
 msgstr[2] ""
 
-#: time_fx_dialog.cc:62
+#: time_fx_dialog.cc:60
 msgid "Quick but Ugly"
 msgstr "Szybko i niedokładnie"
 
-#: time_fx_dialog.cc:63
+#: time_fx_dialog.cc:61
 msgid "Skip Anti-aliasing"
 msgstr "Pomiń anti-aliasing"
 
-#: time_fx_dialog.cc:64
-msgid "Contents:"
-msgstr "Zawartość:"
+#: time_fx_dialog.cc:62
+msgid "Contents"
+msgstr ""
 
-#: time_fx_dialog.cc:65
+#: time_fx_dialog.cc:63
 msgid "Minimize time distortion"
 msgstr ""
 
-#: time_fx_dialog.cc:66
+#: time_fx_dialog.cc:64
 msgid "Preserve Formants"
 msgstr ""
 
-#: time_fx_dialog.cc:71
+#: time_fx_dialog.cc:81
 msgid "TimeFXDialog"
 msgstr "Okno rozciÄ…gania w czasie"
 
-#: time_fx_dialog.cc:74
+#: time_fx_dialog.cc:84
 msgid "Pitch Shift Audio"
 msgstr ""
 
-#: time_fx_dialog.cc:76
+#: time_fx_dialog.cc:86
 msgid "Time Stretch Audio"
 msgstr ""
 
-#: time_fx_dialog.cc:104 transpose_dialog.cc:41
+#: time_fx_dialog.cc:114 transpose_dialog.cc:41
 msgid "Octaves:"
 msgstr ""
 
-#: time_fx_dialog.cc:109 transpose_dialog.cc:46
+#: time_fx_dialog.cc:119 transpose_dialog.cc:46
 msgid "Semitones:"
 msgstr ""
 
-#: time_fx_dialog.cc:114
+#: time_fx_dialog.cc:124
 msgid "Cents:"
 msgstr ""
 
-#: time_fx_dialog.cc:122
+#: time_fx_dialog.cc:132
 msgid "Time|Shift"
 msgstr ""
 
-#: time_fx_dialog.cc:146 time_fx_dialog.cc:149
+#: time_fx_dialog.cc:184 time_fx_dialog.cc:188
 msgid "TimeFXButton"
 msgstr ""
 
-#: time_fx_dialog.cc:154
+#: time_fx_dialog.cc:193
 msgid "Stretch/Shrink"
 msgstr "RozciÄ…gnij/skurcz"
 
-#: time_fx_dialog.cc:164
+#: time_fx_dialog.cc:203
 msgid "<b>Progress</b>"
 msgstr ""
 
-#: time_info_box.cc:124
+#: time_info_box.cc:118
 msgid "Start recording at auto-punch start"
 msgstr "Rozpocznij nagrywanie przy napotkaniu przełącznika"
 
-#: time_info_box.cc:125
+#: time_info_box.cc:119
 msgid "Stop recording at auto-punch end"
 msgstr "Zatrzymaj nagrywanie na końcu przełącznika"
 
@@ -12228,94 +14287,130 @@ msgstr ""
 msgid "Transpose"
 msgstr "Transponuj"
 
-#: ui_config.cc:163 ui_config.cc:300
+#: ui_config.cc:233 ui_config.cc:416
 msgid "Loading default ui configuration file %1"
 msgstr ""
 
-#: ui_config.cc:166 ui_config.cc:303
+#: ui_config.cc:236 ui_config.cc:419
 msgid "cannot read default ui configuration file \"%1\""
 msgstr ""
 
-#: ui_config.cc:169 ui_config.cc:308
+#: ui_config.cc:239 ui_config.cc:424
 msgid "default ui configuration file \"%1\" not loaded successfully."
 msgstr ""
 
-#: ui_config.cc:177
+#: ui_config.cc:247
 msgid "Could not find default UI configuration file %1"
 msgstr ""
 
-#: ui_config.cc:219
+#: ui_config.cc:330
+msgid "Color file for %1 not found along %2"
+msgstr ""
+
+#: ui_config.cc:337
 msgid "Loading color file %1"
 msgstr ""
 
-#: ui_config.cc:222
+#: ui_config.cc:340
 msgid "cannot read color file \"%1\""
 msgstr ""
 
-#: ui_config.cc:227
+#: ui_config.cc:345
 msgid "color file \"%1\" not loaded successfully."
 msgstr ""
 
-#: ui_config.cc:233
-msgid "Color file %1 not found"
-msgstr ""
-
-#: ui_config.cc:282 ui_config.cc:361
+#: ui_config.cc:397 ui_config.cc:480
 msgid "Color file %1 not saved"
 msgstr ""
 
-#: ui_config.cc:317
+#: ui_config.cc:433
 msgid "Loading user ui configuration file %1"
 msgstr ""
 
-#: ui_config.cc:320
+#: ui_config.cc:436
 msgid "cannot read ui configuration file \"%1\""
 msgstr ""
 
-#: ui_config.cc:325
+#: ui_config.cc:441
 msgid "user ui configuration file \"%1\" not loaded successfully."
 msgstr ""
 
-#: ui_config.cc:333
+#: ui_config.cc:449
 msgid "could not find any ui configuration file, canvas will look broken."
 msgstr ""
 
-#: ui_config.cc:351
+#: ui_config.cc:470
 msgid "Config file %1 not saved"
 msgstr ""
 
-#: ui_config.cc:592
+#: ui_config.cc:715
 msgid "Color %1 not found"
 msgstr ""
 
-#: ui_config.cc:662
+#: ui_config.cc:785
 msgid "Unable to find UI style file %1 in search path %2. %3 will look strange"
 msgstr ""
 
-#: utils.cc:117 utils.cc:160
+#: utils.cc:118 utils.cc:161
 msgid "bad XPM header %1"
 msgstr ""
 
-#: utils.cc:577
+#: utils.cc:424
 msgid "cannot find XPM file for %1"
 msgstr ""
 
-#: utils.cc:597 utils.cc:627 utils.cc:641
+#: utils.cc:477 utils.cc:507 utils.cc:527
 msgid "default"
 msgstr ""
 
-#: utils.cc:642
+#: utils.cc:528
 msgid "icon \"%1\" not found for icon set \"%2\", fallback to default"
 msgstr ""
 
-#: utils.cc:649
+#: utils.cc:535
 msgid "cannot find icon image for %1 using %2"
 msgstr ""
 
-#: utils.cc:666 utils.cc:682
+#: utils.cc:552 utils.cc:568
 msgid "Caught exception while loading icon named %1"
 msgstr ""
 
+#: utils.cc:818
+msgid "Overwrite"
+msgstr ""
+
+#: vca_master_strip.cc:74 vca_time_axis.cc:49
+msgid "Solo slaves"
+msgstr ""
+
+#: vca_master_strip.cc:79 vca_time_axis.cc:55
+msgid "Mute slaves"
+msgstr ""
+
+#: vca_master_strip.cc:83
+msgid "Hide this VCA strip"
+msgstr ""
+
+#: vca_master_strip.cc:108 vca_master_strip.cc:418
+msgid "Click to show slaves only"
+msgstr ""
+
+#: vca_master_strip.cc:293
+msgid "A"
+msgstr ""
+
+#: vca_master_strip.cc:300
+msgid "S"
+msgstr ""
+
+#: vca_master_strip.cc:398
+msgid "Drop All Slaves"
+msgstr ""
+
+#: vca_master_strip.cc:421
+msgid "Click to show normal mixer"
+msgstr ""
+
 #: add_video_dialog.cc:54
 msgid "Set Video Track"
 msgstr ""
@@ -12360,32 +14455,48 @@ msgstr ""
 msgid " %1 fps"
 msgstr ""
 
-#: video_timeline.cc:468
+#: vca_time_axis.cc:60
+msgid "D"
+msgstr ""
+
+#: vca_time_axis.cc:61
+msgid "Unassign all slaves"
+msgstr ""
+
+#: vca_time_axis.cc:65
+msgid "V"
+msgstr ""
+
+#: vca_time_axis.cc:66
+msgid "Show only slaves"
+msgstr ""
+
+#: video_timeline.cc:472
 msgid ""
 "Parsing video file info failed. Is the Video Server running? Is the file "
 "readable by the Video Server? Does the docroot match? Is it a video file?"
 msgstr ""
 
-#: video_timeline.cc:506
+#: video_timeline.cc:510
 msgid ""
 "Failed to set session-framerate: '%1' does not have a corresponding option "
 "setting in %2."
 msgstr ""
 
-#: video_timeline.cc:514
+#: video_timeline.cc:518
 msgid ""
 "Video file's framerate is not equal to %1 session timecode's framerate: '%2' "
 "vs '%3'"
 msgstr ""
 
-#: video_timeline.cc:587
+#: video_timeline.cc:591
 msgid ""
 "Video-server docroot mismatch. %1: '%2', video-server: '%3'. This usually "
 "means that the video server was not started by %1 and uses a different "
 "document-root."
 msgstr ""
 
-#: video_timeline.cc:724
+#: video_timeline.cc:728
 msgid ""
 "Video-monitor 'xjadeo' was not found. Please install http://xjadeo.sf.net/ "
 "(a custom path to xjadeo can be specified by setting the XJREMOTE "
@@ -12395,25 +14506,25 @@ msgid ""
 "see also http://manual.ardour.org/video-timeline/setup/"
 msgstr ""
 
-#: video_timeline.cc:739
+#: video_timeline.cc:743
 msgid "Video-monitor 'xjadeo' cannot be launched."
 msgstr ""
 
-#: video_timeline.cc:766
+#: video_timeline.cc:775
 msgid ""
 "Video-monitor 'xjadeo' is too old. Please install xjadeo version 0.7.7 or "
 "later. http://xjadeo.sf.net/"
 msgstr ""
 
-#: video_monitor.cc:285
+#: video_monitor.cc:283
 msgid "Video Monitor: File Not Found."
 msgstr ""
 
 #: transcode_ffmpeg.cc:56
 msgid ""
-"No ffprobe or ffmpeg executables could be found on this system.\n"
-"Video import and export is not possible until you install those tools.\n"
+"ffmpeg installation was not found on this system.\n"
 "%1 requires ffmpeg and ffprobe from ffmpeg.org - version 1.1 or newer.\n"
+"Video import and export is not possible until you install tools.\n"
 "\n"
 "The tools are included with the %1 releases from ardour.org and also "
 "available with the video-server at http://x42.github.com/harvid/\n"
@@ -12435,7 +14546,7 @@ msgstr ""
 msgid "Output File:"
 msgstr ""
 
-#: transcode_video_dialog.cc:61 export_video_dialog.cc:85
+#: transcode_video_dialog.cc:61 export_video_dialog.cc:81
 msgid "Abort"
 msgstr ""
 
@@ -12444,10 +14555,14 @@ msgid "Height = "
 msgstr ""
 
 #: transcode_video_dialog.cc:66
+msgid "Extract LTC from audio and align video"
+msgstr ""
+
+#: transcode_video_dialog.cc:67
 msgid "Manual Override"
 msgstr ""
 
-#: transcode_video_dialog.cc:70 export_video_dialog.cc:103
+#: transcode_video_dialog.cc:71 export_video_dialog.cc:99
 msgid "Debug Mode: Print ffmpeg command and output to stdout."
 msgstr ""
 
@@ -12457,9 +14572,8 @@ msgstr ""
 
 #: transcode_video_dialog.cc:113
 msgid ""
-"No ffprobe or ffmpeg executables could be found on this system. Video Import "
-"is not possible until you install those tools. See the Log window for more "
-"information."
+"ffmpeg installation was not found. Video Import is not possible. See the Log "
+"window for more information."
 msgstr ""
 
 #: transcode_video_dialog.cc:120
@@ -12468,83 +14582,83 @@ msgid ""
 "unsupported video codec or format."
 msgstr ""
 
-#: transcode_video_dialog.cc:134
+#: transcode_video_dialog.cc:137
 msgid "FPS:"
 msgstr ""
 
-#: transcode_video_dialog.cc:136
-msgid "Duration:"
-msgstr ""
-
-#: transcode_video_dialog.cc:138
+#: transcode_video_dialog.cc:141
 msgid "Codec:"
 msgstr ""
 
-#: transcode_video_dialog.cc:140
+#: transcode_video_dialog.cc:143
 msgid "Geometry:"
 msgstr ""
 
-#: transcode_video_dialog.cc:155
+#: transcode_video_dialog.cc:158
 msgid "??"
 msgstr ""
 
-#: transcode_video_dialog.cc:176
+#: transcode_video_dialog.cc:179
 msgid "<b>Import Settings</b>"
 msgstr ""
 
-#: transcode_video_dialog.cc:181
-msgid "Reference From Current Location (Previously Transcoded Files Only)"
+#: transcode_video_dialog.cc:184
+msgid "Reference from Current Location (Previously Transcoded Files Only)"
 msgstr ""
 
-#: transcode_video_dialog.cc:183
+#: transcode_video_dialog.cc:185
 msgid "Import/Transcode Video to Session"
 msgstr ""
 
-#: transcode_video_dialog.cc:191
+#: transcode_video_dialog.cc:188 transcode_video_dialog.cc:198
 msgid "Do Not Import Video (Audio Import Only)"
 msgstr ""
 
-#: transcode_video_dialog.cc:200
+#: transcode_video_dialog.cc:208
+msgid "Do Not Import Video"
+msgstr ""
+
+#: transcode_video_dialog.cc:224
 msgid "Scale Video: Width = "
 msgstr ""
 
-#: transcode_video_dialog.cc:207
+#: transcode_video_dialog.cc:230
 msgid "Original Width"
 msgstr ""
 
-#: transcode_video_dialog.cc:222
+#: transcode_video_dialog.cc:245
 msgid "Bitrate (KBit/s):"
 msgstr ""
 
-#: transcode_video_dialog.cc:227
+#: transcode_video_dialog.cc:250
 msgid "Extract Audio:"
 msgstr ""
 
-#: transcode_video_dialog.cc:232
+#: transcode_video_dialog.cc:255
 msgid "No Audio Track Present"
 msgstr ""
 
-#: transcode_video_dialog.cc:235
+#: transcode_video_dialog.cc:258
 msgid "Do Not Extract Audio"
 msgstr ""
 
-#: transcode_video_dialog.cc:350
+#: transcode_video_dialog.cc:374
 msgid "Extracting Audio.."
 msgstr ""
 
-#: transcode_video_dialog.cc:353
+#: transcode_video_dialog.cc:377
 msgid "Audio Extraction Failed."
 msgstr ""
 
-#: transcode_video_dialog.cc:379
+#: transcode_video_dialog.cc:403
 msgid "Transcoding Video.."
 msgstr ""
 
-#: transcode_video_dialog.cc:413
+#: transcode_video_dialog.cc:437
 msgid "Transcoding Failed."
 msgstr ""
 
-#: transcode_video_dialog.cc:503
+#: transcode_video_dialog.cc:541
 msgid "Save Transcoded Video File"
 msgstr ""
 
@@ -12564,7 +14678,7 @@ msgstr ""
 msgid "Don't show this dialog again. (Reset in Edit->Preferences)."
 msgstr ""
 
-#: video_server_dialog.cc:97
+#: video_server_dialog.cc:94
 msgid ""
 "The external video server 'harvid' can not be found.\n"
 "The tool is included with the %1 releases from ardour.org, alternatively you "
@@ -12574,239 +14688,230 @@ msgid ""
 "see also http://manual.ardour.org/video-timeline/setup/"
 msgstr ""
 
-#: video_server_dialog.cc:129
+#: video_server_dialog.cc:126
 msgid "Listen Address:"
 msgstr ""
 
-#: video_server_dialog.cc:134
+#: video_server_dialog.cc:131
 msgid "Listen Port:"
 msgstr ""
 
-#: video_server_dialog.cc:139
+#: video_server_dialog.cc:136
 msgid "Cache Size:"
 msgstr ""
 
-#: video_server_dialog.cc:145
+#: video_server_dialog.cc:142
 msgid ""
 "%1 relies on an external video server for the videotimeline.\n"
 "The server configured in Edit -> Preferences -> Video is not reachable.\n"
 "Do you want %1 to launch 'harvid' on this machine?"
 msgstr ""
 
-#: video_server_dialog.cc:189
+#: video_server_dialog.cc:186
 msgid "Set Video Server Executable"
 msgstr ""
 
-#: video_server_dialog.cc:209
+#: video_server_dialog.cc:206
 msgid "Server docroot"
 msgstr ""
 
-#: utils_videotl.cc:60
+#: utils_videotl.cc:61
 msgid "Destination is outside Video Server's docroot. "
 msgstr ""
 
-#: utils_videotl.cc:61
+#: utils_videotl.cc:62
 msgid ""
 "The destination file path is outside of the Video Server's docroot. The file "
 "will not be readable by the Video Server. Do you still want to continue?"
 msgstr ""
 
-#: utils_videotl.cc:64
+#: utils_videotl.cc:65
 msgid "Continue"
 msgstr ""
 
-#: utils_videotl.cc:70
+#: utils_videotl.cc:72
 msgid "Confirm Overwrite"
 msgstr ""
 
-#: utils_videotl.cc:71
-msgid "A file with the same name already exists.  Do you want to overwrite it?"
-msgstr ""
-
-#: utils_videotl.cc:81 utils_videotl.cc:97
+#: utils_videotl.cc:82 utils_videotl.cc:98
 msgid "Cannot create video folder \"%1\" (%2)"
 msgstr ""
 
-#: export_video_dialog.cc:71
+#: export_video_dialog.cc:67
 msgid "Export Video File "
 msgstr ""
 
-#: export_video_dialog.cc:82
+#: export_video_dialog.cc:78
 msgid "Video:"
 msgstr ""
 
-#: export_video_dialog.cc:87
+#: export_video_dialog.cc:83
 msgid "Scale Video (W x H):"
 msgstr ""
 
-#: export_video_dialog.cc:88
+#: export_video_dialog.cc:84
 msgid "Retain Aspect"
 msgstr ""
 
-#: export_video_dialog.cc:93
+#: export_video_dialog.cc:89
 msgid "Set Aspect Ratio:"
 msgstr ""
 
-#: export_video_dialog.cc:94
+#: export_video_dialog.cc:90
 msgid "Normalize Audio"
 msgstr ""
 
-#: export_video_dialog.cc:95
+#: export_video_dialog.cc:91
 msgid "2 Pass Encoding"
 msgstr ""
 
-#: export_video_dialog.cc:96
+#: export_video_dialog.cc:92
 msgid "Codec Optimizations:"
 msgstr ""
 
-#: export_video_dialog.cc:98
+#: export_video_dialog.cc:94
 msgid "Deinterlace"
 msgstr ""
 
-#: export_video_dialog.cc:99
+#: export_video_dialog.cc:95
 msgid "Use [2] B-frames (MPEG 2 or 4 only)"
 msgstr ""
 
-#: export_video_dialog.cc:100
+#: export_video_dialog.cc:96
 msgid "Override FPS (Default is to retain FPS from the input video file):"
 msgstr ""
 
-#: export_video_dialog.cc:101
+#: export_video_dialog.cc:97
 msgid "Include Session Metadata"
 msgstr ""
 
-#: export_video_dialog.cc:119
+#: export_video_dialog.cc:115
 msgid ""
-"No ffprobe or ffmpeg executables could be found on this system. Video Export "
-"is not possible until you install those tools. See the Log window for more "
-"information."
+"ffmpeg installation was not found. Video Export is not possible. See the Log "
+"window for more information."
 msgstr ""
 
-#: export_video_dialog.cc:130
+#: export_video_dialog.cc:126
 msgid "<b>Output:</b> (file extension defines format)"
 msgstr ""
 
-#: export_video_dialog.cc:140
+#: export_video_dialog.cc:136
 msgid "<b>Input Video:</b>"
 msgstr ""
 
-#: export_video_dialog.cc:151
+#: export_video_dialog.cc:147
 msgid "Audio:"
 msgstr ""
 
-#: export_video_dialog.cc:153
+#: export_video_dialog.cc:149
 msgid "Master Bus"
 msgstr ""
 
-#: export_video_dialog.cc:158
+#: export_video_dialog.cc:153
 msgid "from the %1 session's start to the session's end"
 msgstr ""
 
-#: export_video_dialog.cc:161
+#: export_video_dialog.cc:156
 msgid "<b>Settings:</b>"
 msgstr ""
 
-#: export_video_dialog.cc:169
+#: export_video_dialog.cc:164
 msgid "Range:"
 msgstr ""
 
-#: export_video_dialog.cc:172
-msgid "Preset:"
-msgstr ""
-
-#: export_video_dialog.cc:175
+#: export_video_dialog.cc:170
 msgid "Video Codec:"
 msgstr ""
 
-#: export_video_dialog.cc:178
+#: export_video_dialog.cc:173
 msgid "Video KBit/s:"
 msgstr ""
 
-#: export_video_dialog.cc:181
+#: export_video_dialog.cc:176
 msgid "Audio Codec:"
 msgstr ""
 
-#: export_video_dialog.cc:184
+#: export_video_dialog.cc:179
 msgid "Audio KBit/s:"
 msgstr ""
 
-#: export_video_dialog.cc:187
+#: export_video_dialog.cc:182
 msgid "Audio Samplerate:"
 msgstr ""
 
-#: export_video_dialog.cc:222 export_video_dialog.cc:231
-#: export_video_dialog.cc:830 export_video_dialog.cc:833
+#: export_video_dialog.cc:215 export_video_dialog.cc:223
+#: export_video_dialog.cc:814 export_video_dialog.cc:817
 msgid "(default for format)"
 msgstr ""
 
-#: export_video_dialog.cc:242 export_video_dialog.cc:255
-#: export_video_dialog.cc:837 export_video_dialog.cc:846
+#: export_video_dialog.cc:233 export_video_dialog.cc:244
+#: export_video_dialog.cc:821 export_video_dialog.cc:830
 msgid "(default)"
 msgstr ""
 
-#: export_video_dialog.cc:256 export_video_dialog.cc:840
+#: export_video_dialog.cc:245 export_video_dialog.cc:824
 msgid "(retain)"
 msgstr ""
 
-#: export_video_dialog.cc:348
+#: export_video_dialog.cc:335
 msgid "from 00:00:00:00 to the video's end"
 msgstr ""
 
-#: export_video_dialog.cc:350
+#: export_video_dialog.cc:337
 msgid "from the video's start to the video's end"
 msgstr ""
 
-#: export_video_dialog.cc:353
+#: export_video_dialog.cc:340
 msgid "Selected range"
 msgstr ""
 
-#: export_video_dialog.cc:589
+#: export_video_dialog.cc:561
 msgid "Normalizing audio"
 msgstr ""
 
-#: export_video_dialog.cc:593
+#: export_video_dialog.cc:566 export_video_dialog.cc:571
 msgid "Exporting audio"
 msgstr ""
 
-#: export_video_dialog.cc:648
+#: export_video_dialog.cc:632
 msgid "Exporting Audio..."
 msgstr ""
 
-#: export_video_dialog.cc:705
+#: export_video_dialog.cc:689
 msgid ""
 "Export Video: Cannot query duration of video-file, using duration from "
 "timeline instead."
 msgstr ""
 
-#: export_video_dialog.cc:735
+#: export_video_dialog.cc:719
 msgid "Export Video: export-range does not include video."
 msgstr ""
 
-#: export_video_dialog.cc:748
+#: export_video_dialog.cc:732
 msgid "Export Video: No Master Out Ports to Connect for Audio Export"
 msgstr ""
 
-#: export_video_dialog.cc:790
+#: export_video_dialog.cc:774
 msgid "Encoding Video..."
 msgstr ""
 
-#: export_video_dialog.cc:810
+#: export_video_dialog.cc:794
 msgid "Export Video: Video input file cannot be read."
 msgstr ""
 
-#: export_video_dialog.cc:916
+#: export_video_dialog.cc:900
 msgid "Encoding Video.. Pass 1/2"
 msgstr ""
 
-#: export_video_dialog.cc:928
+#: export_video_dialog.cc:912
 msgid "Encoding Video.. Pass 2/2"
 msgstr ""
 
-#: export_video_dialog.cc:1031
+#: export_video_dialog.cc:1015
 msgid "Transcoding failed."
 msgstr ""
 
-#: export_video_dialog.cc:1267 export_video_dialog.cc:1287
+#: export_video_dialog.cc:1251 export_video_dialog.cc:1271
 msgid "Save Exported Video File"
 msgstr ""
 
@@ -12824,13 +14929,74 @@ msgstr ""
 
 #: export_video_infobox.cc:51
 msgid ""
+"%1 does not include commercial licenses for encoding audio/video. Visit "
+"mpegla.com for information about licensing various audio/video codecs.\n"
+"\n"
 "Video encoding is a non-trivial task with many details.\n"
 "\n"
-"Please see the manual at %1/video-timeline/operations/#export.\n"
+"Please see the manual at %2/video-timeline/operations/#export.\n"
 "\n"
 "Open Manual in Browser? "
 msgstr ""
 
+#~ msgid "Display model"
+#~ msgstr "Tryb wyświetlania"
+
+#~ msgid "Normalize values"
+#~ msgstr "Normalizacja wartości"
+
+#~ msgid "Locations"
+#~ msgstr "Położenia"
+
+#~ msgid ""
+#~ "When active, auditioning is taking place\n"
+#~ "Click to stop the audition"
+#~ msgstr ""
+#~ "Gdy aktywne, odsłuchiwanie jest włączone\n"
+#~ "Kliknij, by zatrzymać odsłuchiwanie."
+
+#~ msgid "Transition To Roll"
+#~ msgstr "Do przodu"
+
+#~ msgid "Transition To Reverse"
+#~ msgstr "Od tyłu"
+
+#~ msgid "Play From Edit Point"
+#~ msgstr "Od punktu edycji"
+
+#~ msgid "Zoom focus"
+#~ msgstr "Powiększanie do"
+
+#~ msgid "Show Logo"
+#~ msgstr "Wyświetlanie logo"
+
+#~ msgid "End point trim"
+#~ msgstr "Punkt końcowy przycięcia"
+
+#~ msgid "duplicate selection"
+#~ msgstr "duplikuj zaznaczenie"
+
+#~ msgid "tracks"
+#~ msgstr "ścieżki"
+
+#~ msgid "busses"
+#~ msgstr "szyny"
+
+#~ msgid "*Comments*"
+#~ msgstr "*Komentarze*"
+
+#~ msgid "Click to Add/Edit Comments"
+#~ msgstr "Kliknij by dodać/edytować komentarze"
+
+#~ msgid "Update available plugins"
+#~ msgstr "Odśwież listę dostępnych wtyczek"
+
+#~ msgid "Remote Control ID"
+#~ msgstr "ID zdalnego sterowania"
+
+#~ msgid "Contents:"
+#~ msgstr "Zawartość:"
+
 #~ msgid ""
 #~ "%1\n"
 #~ "(built from revision %2)"
diff --git a/gtk2_ardour/po/pt.mo b/gtk2_ardour/po/pt.mo
new file mode 100644
index 0000000..5899c9d
Binary files /dev/null and b/gtk2_ardour/po/pt.mo differ
diff --git a/gtk2_ardour/po/pt.po b/gtk2_ardour/po/pt.po
index b57407c..2cd933b 100644
--- a/gtk2_ardour/po/pt.po
+++ b/gtk2_ardour/po/pt.po
@@ -4,270 +4,303 @@
 # Authors: Alexander Franca <alexander at nautae.eti.br>
 #          Chris Ross <chris.ross at tebibyte.org>
 #          Leandro Marco <leandromarco at gmail.com>
-#
+#          Marcelo Teles <mteles84 at gmail.com>
 #
 msgid ""
 msgstr ""
 "Project-Id-Version: ardour 0.688.4\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-03-31 20:13-0400\n"
+"POT-Creation-Date: 2016-07-24 21:43-0300\n"
 "PO-Revision-Date: 2005-08-15 21:50-0000\n"
 "Last-Translator: Chris Ross, Alexander Franca & Leandro Marco\n"
 "Language-Team: Portuguese\n"
-"Language: \n"
+"Language: Portuguese\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: about.cc:127
+msgid "Fons Adriaensen"
+msgstr ""
 
-#: about.cc:125
+#: about.cc:128
 msgid "Brian Ahr"
 msgstr ""
 
-#: about.cc:126
+#: about.cc:129
 msgid "John Anderson"
 msgstr ""
 
-#: about.cc:127
+#: about.cc:130
 msgid "Marcus Andersson"
 msgstr ""
 
-#: about.cc:128
+#: about.cc:131
 msgid "Nedko Arnaudov"
 msgstr ""
 
-#: about.cc:129
+#: about.cc:132
 msgid "Hans Baier"
 msgstr ""
 
-#: about.cc:130
+#: about.cc:133
 msgid "Ben Bell"
 msgstr ""
 
-#: about.cc:131
+#: about.cc:134
 msgid "Sakari Bergen"
 msgstr ""
 
-#: about.cc:132
+#: about.cc:135
 msgid "Christian Borss"
 msgstr ""
 
-#: about.cc:133
+#: about.cc:136
 msgid "Chris Cannam"
 msgstr ""
 
-#: about.cc:134
+#: about.cc:137
 msgid "Jeremy Carter"
 msgstr ""
 
-#: about.cc:135
+#: about.cc:138
 msgid "Jesse Chappell"
 msgstr ""
 
-#: about.cc:136
+#: about.cc:139
 msgid "Thomas Charbonnel"
 msgstr ""
 
-#: about.cc:137
+#: about.cc:140
 msgid "Sam Chessman"
 msgstr ""
 
-#: about.cc:138
+#: about.cc:141
 msgid "André Colomb"
 msgstr ""
 
-#: about.cc:139
+#: about.cc:142
 msgid "Paul Davis"
 msgstr ""
 
-#: about.cc:140
+#: about.cc:143
 msgid "Gerard van Dongen"
 msgstr ""
 
-#: about.cc:141
+#: about.cc:144
 msgid "John Emmas"
 msgstr ""
 
-#: about.cc:142
+#: about.cc:145
 msgid "Colin Fletcher"
 msgstr ""
 
-#: about.cc:143
+#: about.cc:146
 msgid "Dave Flick"
 msgstr ""
 
-#: about.cc:144
+#: about.cc:147
 msgid "Hans Fugal"
 msgstr ""
 
-#: about.cc:145
+#: about.cc:148
 msgid "Robin Gareus"
 msgstr ""
 
-#: about.cc:146
+#: about.cc:149
+msgid "Nil Geisweiller"
+msgstr ""
+
+#: about.cc:150
 msgid "Christopher George"
 msgstr ""
 
-#: about.cc:147
+#: about.cc:151
 msgid "Chris Goddard"
 msgstr ""
 
-#: about.cc:148
+#: about.cc:152
 msgid "J. Abelardo Gutierrez"
 msgstr ""
 
-#: about.cc:149
+#: about.cc:153
 msgid "Jeremy Hall"
 msgstr ""
 
-#: about.cc:150
+#: about.cc:154
 msgid "Audun Halland"
 msgstr ""
 
-#: about.cc:151
+#: about.cc:155
 msgid "David Halter"
 msgstr ""
 
-#: about.cc:152
+#: about.cc:156
 msgid "Steve Harris"
 msgstr ""
 
-#: about.cc:153
+#: about.cc:157
 msgid "Melvin Ray Herr"
 msgstr ""
 
-#: about.cc:154
+#: about.cc:158
 msgid "Carl Hetherington"
 msgstr ""
 
-#: about.cc:155
+#: about.cc:159
 msgid "Rob Holland"
 msgstr ""
 
-#: about.cc:156
+#: about.cc:160
 msgid "Robert Jordens"
 msgstr ""
 
-#: about.cc:157
+#: about.cc:161
 msgid "Stefan Kersten"
 msgstr ""
 
-#: about.cc:158
+#: about.cc:162
 msgid "Armand Klenk"
 msgstr ""
 
-#: about.cc:159
+#: about.cc:163
 msgid "Julien de Kozak"
 msgstr ""
 
-#: about.cc:160
+#: about.cc:164
 msgid "Matt Krai"
 msgstr ""
 
-#: about.cc:161
+#: about.cc:165
 msgid "Georg Krause"
 msgstr ""
 
-#: about.cc:162
+#: about.cc:166
 msgid "Nick Lanham"
 msgstr ""
 
-#: about.cc:163
+#: about.cc:167
 msgid "Colin Law"
 msgstr ""
 
-#: about.cc:164
+#: about.cc:168
 msgid "Joshua Leach"
 msgstr ""
 
-#: about.cc:165
+#: about.cc:169
 msgid "Ben Loftis"
 msgstr ""
 
-#: about.cc:166
+#: about.cc:170
 msgid "Nick Mainsbridge"
 msgstr ""
 
-#: about.cc:167
+#: about.cc:171
 msgid "Tim Mayberry"
 msgstr ""
 
-#: about.cc:168
+#: about.cc:172
 msgid "Doug Mclain"
 msgstr ""
 
-#: about.cc:169
+#: about.cc:173
 msgid "Todd Naugle"
 msgstr ""
 
-#: about.cc:170
+#: about.cc:174
+msgid "André Nusser"
+msgstr ""
+
+#: about.cc:175
+msgid "Bent Bisballe Nyeng"
+msgstr ""
+
+#: about.cc:176
 msgid "Jack O'Quin"
 msgstr ""
 
-#: about.cc:171
+#: about.cc:177
+msgid "Pavel Potocek"
+msgstr ""
+
+#: about.cc:178
 msgid "Nimal Ratnayake"
 msgstr ""
 
-#: about.cc:172
+#: about.cc:179
+msgid "Julien Rivaud"
+msgstr ""
+
+#: about.cc:180
 msgid "David Robillard"
 msgstr ""
 
-#: about.cc:173
+#: about.cc:181
+msgid "Julien Roger"
+msgstr ""
+
+#: about.cc:182
 msgid "Taybin Rutkin"
 msgstr ""
 
-#: about.cc:174
+#: about.cc:183
 msgid "Andreas Ruge"
 msgstr ""
 
-#: about.cc:175
+#: about.cc:184
 msgid "Sampo Savolainen"
 msgstr ""
 
-#: about.cc:176
+#: about.cc:185
 msgid "Rodrigo Severo"
 msgstr ""
 
-#: about.cc:177
+#: about.cc:186
 msgid "Per Sigmond"
 msgstr ""
 
-#: about.cc:178
+#: about.cc:187
 msgid "Lincoln Spiteri"
 msgstr ""
 
-#: about.cc:179
+#: about.cc:188
 msgid "Mike Start"
 msgstr ""
 
-#: about.cc:180
+#: about.cc:189
 msgid "Mark Stewart"
 msgstr ""
 
-#: about.cc:181
+#: about.cc:190
 msgid "Roland Stigge"
 msgstr ""
 
-#: about.cc:182
+#: about.cc:191
 msgid "Petter Sundlöf"
 msgstr ""
 
-#: about.cc:183
+#: about.cc:192
 msgid "Mike Täht"
 msgstr ""
 
-#: about.cc:184
+#: about.cc:193
 msgid "Roy Vegard"
 msgstr ""
 
-#: about.cc:185
+#: about.cc:194
 msgid "Thorsten Wilms"
 msgstr ""
 
-#: about.cc:186
+#: about.cc:195
+msgid "Damien Zammit"
+msgstr ""
+
+#: about.cc:196
 msgid "Grygorii Zharun"
 msgstr ""
 
-#: about.cc:191
+#: about.cc:201
 msgid ""
 "French:\n"
 "\tAlain Fréhel <alain.frehel at free.fr>\n"
@@ -276,7 +309,7 @@ msgid ""
 "\tRomain Arnaud <roming22 at gmail.com>\n"
 msgstr ""
 
-#: about.cc:192
+#: about.cc:202
 msgid ""
 "German:\n"
 "\tKarsten Petersen <kapet at kapet.de>\n"
@@ -288,210 +321,264 @@ msgid ""
 "\tRobin Gloster <robin at loc-com.de>\n"
 msgstr ""
 
-#: about.cc:199
+#: about.cc:209
 msgid ""
 "Italian:\n"
 "\tFilippo Pappalardo <filippo at email.it>\n"
 "\tRaffaele Morelli <raffaele.morelli at gmail.com>\n"
 msgstr ""
 
-#: about.cc:200
+#: about.cc:210
 msgid ""
 "Portuguese:\n"
 "\tRui Nuno Capela <rncbc at rncbc.org>\n"
 msgstr ""
 
-#: about.cc:201
+#: about.cc:211
 msgid ""
 "Brazilian Portuguese:\n"
 "\tAlexander da Franca Fernandes <alexander at nautae.eti.br>\n"
 "\tChris Ross <chris at tebibyte.org>\n"
 msgstr ""
 
-#: about.cc:203
+#: about.cc:213
 msgid ""
 "Spanish:\n"
 "\t Alex Krohn <alexkrohn at fastmail.fm>\n"
 "\tPablo Fernández <pablo.fbus at gmail.com>\n"
 msgstr ""
 
-#: about.cc:204
+#: about.cc:214
 msgid ""
 "Russian:\n"
 "\t Igor Blinov <pitstop at nm.ru>\n"
 "\tAlexandre Prokoudine <alexandre.prokoudine at gmail.com>\n"
 msgstr ""
 
-#: about.cc:206
+#: about.cc:216
 msgid ""
 "Greek:\n"
 "\t Klearchos Gourgourinis <muadib at in.gr>\n"
 msgstr ""
 
-#: about.cc:207
+#: about.cc:217
 msgid ""
 "Swedish:\n"
 "\t Petter Sundlöf <petter.sundlof at gmail.com>\n"
 msgstr ""
 
-#: about.cc:208
+#: about.cc:218
 msgid ""
 "Polish:\n"
 "\t Piotr Zaryk <pzaryk at gmail.com>\n"
 msgstr ""
 
-#: about.cc:209
+#: about.cc:219
 msgid ""
 "Czech:\n"
 "\t Pavel Fric <pavelfric at seznam.cz>\n"
 msgstr ""
 
-#: about.cc:210
+#: about.cc:220
 msgid ""
 "Norwegian:\n"
 "\t Eivind Ødegård\n"
 msgstr ""
 
-#: about.cc:211
+#: about.cc:221
 msgid ""
 "Chinese:\n"
 "\t Rui-huai Zhang <zrhzrh at mail.ustc.edu.cn>\n"
 msgstr ""
 
-#: about.cc:591
+#: about.cc:601
+msgid "Intel 64-bit"
+msgstr ""
+
+#: about.cc:603
+msgid "Intel 32-bit"
+msgstr ""
+
+#: about.cc:605
+msgid "PowerPC 64-bit"
+msgstr ""
+
+#: about.cc:607
+msgid "PowerPC 32-bit"
+msgstr ""
+
+#: about.cc:609
+msgid "64-bit"
+msgstr ""
+
+#: about.cc:611
+msgid "32-bit"
+msgstr ""
+
+#: about.cc:619
+msgid " - debug"
+msgstr ""
+
+#: about.cc:625
 msgid "Copyright (C) 1999-2015 Paul Davis\n"
 msgstr ""
 
-#: about.cc:595
+#: about.cc:629
 msgid "http://ardour.org/"
 msgstr ""
 
-#: about.cc:596
+#: about.cc:630
 msgid ""
 "%1%2\n"
-"(built from revision %3)"
+"(rev %3)\n"
+"%4%5"
 msgstr ""
 
-#: about.cc:600
+#: about.cc:635
 msgid "Config"
 msgstr ""
 
-#: actions.cc:85
+#: actions.cc:83
 msgid "Loading menus from %1"
 msgstr ""
 
-#: actions.cc:88 actions.cc:89
+#: actions.cc:86 actions.cc:87
 msgid "badly formatted menu definition file: %1"
 msgstr ""
 
-#: actions.cc:91
+#: actions.cc:89
 msgid "%1 menu definition file not found"
 msgstr ""
 
-#: actions.cc:95 actions.cc:96
+#: actions.cc:93 actions.cc:94
 msgid "%1 will not work without a valid menu definition file"
 msgstr ""
 
-#: add_route_dialog.cc:54 route_params_ui.cc:524
-msgid "Add Track or Bus"
-msgstr ""
+#: add_route_dialog.cc:58
+msgid "Add Track/Bus/VCA"
+msgstr "Adicionar Trilha/Bus/VCA"
 
-#: add_route_dialog.cc:57
+#: add_route_dialog.cc:61
 msgid "Configuration:"
-msgstr ""
+msgstr "Configuração"
 
-#: add_route_dialog.cc:58
+#: add_route_dialog.cc:62
 msgid "Record Mode:"
-msgstr ""
+msgstr "Modo de Gravação"
 
-#: add_route_dialog.cc:59
+#: add_route_dialog.cc:63
 msgid "Instrument:"
-msgstr ""
+msgstr "Instrumento"
 
-#: add_route_dialog.cc:77
+#: add_route_dialog.cc:77 add_route_dialog.cc:228
 msgid "Audio Tracks"
-msgstr ""
+msgstr "Trilhas de Áudio"
 
-#: add_route_dialog.cc:78 add_route_dialog.cc:209
+#: add_route_dialog.cc:78 add_route_dialog.cc:224
 msgid "MIDI Tracks"
-msgstr ""
+msgstr "Trilhas de MIDI"
 
-#: add_route_dialog.cc:79 add_route_dialog.cc:211
+#: add_route_dialog.cc:79 add_route_dialog.cc:226
 msgid "Audio+MIDI Tracks"
+msgstr "Trilhas de Áudio+MIDI"
+
+#: add_route_dialog.cc:80 add_route_dialog.cc:220
+msgid "Audio Busses"
+msgstr ""
+
+#: add_route_dialog.cc:81 add_route_dialog.cc:222
+msgid "MIDI Busses"
 msgstr ""
 
-#: add_route_dialog.cc:80 add_route_dialog.cc:207
-msgid "Busses"
+#: add_route_dialog.cc:82
+msgid "VCA Masters"
 msgstr ""
 
-#: add_route_dialog.cc:83 add_route_dialog.cc:559
+#: add_route_dialog.cc:85 add_route_dialog.cc:622
 msgid "First"
 msgstr ""
 
-#: add_route_dialog.cc:84 add_route_dialog.cc:561
-msgid "After Editor Selection"
+#: add_route_dialog.cc:86 add_route_dialog.cc:626
+msgid "Before Selection"
+msgstr "Antes da Seleção"
+
+#: add_route_dialog.cc:87 add_route_dialog.cc:624
+msgid "After Selection"
+msgstr "Depois da Seleção"
+
+#: add_route_dialog.cc:88
+msgid "Last"
 msgstr ""
 
-#: add_route_dialog.cc:85 add_route_dialog.cc:563
-msgid "After Mixer Selection"
+#: add_route_dialog.cc:91
+msgid "Flexible-I/O"
 msgstr ""
 
-#: add_route_dialog.cc:86
-msgid "Last"
+#: add_route_dialog.cc:92
+msgid "Strict-I/O"
 msgstr ""
 
-#: add_route_dialog.cc:103
+#: add_route_dialog.cc:108
 msgid "Add:"
-msgstr ""
+msgstr "Adicionar:"
 
-#: add_route_dialog.cc:116 time_fx_dialog.cc:91 add_video_dialog.cc:135
-#: video_server_dialog.cc:121
+#: add_route_dialog.cc:121 time_fx_dialog.cc:101 add_video_dialog.cc:136
+#: video_server_dialog.cc:118
 msgid "<b>Options</b>"
-msgstr ""
+msgstr "<b>Opções</b>"
 
-#: add_route_dialog.cc:126 bundle_manager.cc:193 region_editor.cc:50
-#: route_group_dialog.cc:71
+#: add_route_dialog.cc:131 bundle_manager.cc:193 region_editor.cc:52
+#: route_group_dialog.cc:70
 msgid "Name:"
-msgstr ""
+msgstr "Nome:"
 
-#: add_route_dialog.cc:156
+#: add_route_dialog.cc:155
 msgid "Group:"
-msgstr ""
+msgstr "Grupo:"
 
-#: add_route_dialog.cc:162
+#: add_route_dialog.cc:161
 msgid "Insert:"
-msgstr ""
+msgstr "Inserir:"
 
-#: add_route_dialog.cc:223 add_route_dialog.cc:232 add_route_dialog.cc:306
-#: ardour_ui_ed.cc:539 engine_dialog.cc:237 rc_option_editor.cc:1805
-#: rc_option_editor.cc:1807 rc_option_editor.cc:1809 rc_option_editor.cc:1827
-#: rc_option_editor.cc:1829 rc_option_editor.cc:1837 rc_option_editor.cc:1839
-#: rc_option_editor.cc:1857 rc_option_editor.cc:1870 rc_option_editor.cc:1872
-#: rc_option_editor.cc:1874 rc_option_editor.cc:1919 rc_option_editor.cc:1921
-#: rc_option_editor.cc:1923 rc_option_editor.cc:1931 rc_option_editor.cc:1939
-#: rc_option_editor.cc:1941 rc_option_editor.cc:1949
-msgid "Audio"
+#: add_route_dialog.cc:171
+msgid "Output Ports:"
+msgstr "Portas de Saída"
+
+#: add_route_dialog.cc:176 rc_option_editor.cc:2474
+msgid ""
+"With strict-i/o enabled, Effect Processors will not modify the number of "
+"channels on a track. The number of output channels will always match the "
+"number of input channels."
 msgstr ""
 
-#: add_route_dialog.cc:224 add_route_dialog.cc:235 add_route_dialog.cc:307
-#: editor_actions.cc:109 engine_dialog.cc:239 missing_file_dialog.cc:56
-#: rc_option_editor.cc:2084 rc_option_editor.cc:2094 rc_option_editor.cc:2102
-#: rc_option_editor.cc:2110 rc_option_editor.cc:2119 rc_option_editor.cc:2127
-#: rc_option_editor.cc:2135 rc_option_editor.cc:2143 rc_option_editor.cc:2152
-#: rc_option_editor.cc:2161 rc_option_editor.cc:2170 rc_option_editor.cc:2178
-#: rc_option_editor.cc:2186 rc_option_editor.cc:2194 rc_option_editor.cc:2217
+#: add_route_dialog.cc:240 add_route_dialog.cc:351 ardour_ui_ed.cc:625
+#: engine_dialog.cc:244 plugin_pin_dialog.cc:67 rc_option_editor.cc:2397
+#: rc_option_editor.cc:2399 rc_option_editor.cc:2401 rc_option_editor.cc:2419
+#: rc_option_editor.cc:2421 rc_option_editor.cc:2429 rc_option_editor.cc:2432
+#: rc_option_editor.cc:2450 rc_option_editor.cc:2463 rc_option_editor.cc:2472
+#: rc_option_editor.cc:2478 rc_option_editor.cc:2480 rc_option_editor.cc:2525
+#: rc_option_editor.cc:2527 rc_option_editor.cc:2529 rc_option_editor.cc:2537
+msgid "Audio"
+msgstr "Áudio"
+
+#: add_route_dialog.cc:243 add_route_dialog.cc:352 editor_actions.cc:112
+#: engine_dialog.cc:246 missing_file_dialog.cc:60 mixer_ui.cc:1895
+#: plugin_pin_dialog.cc:68 rc_option_editor.cc:2672 rc_option_editor.cc:2674
+#: rc_option_editor.cc:2684 rc_option_editor.cc:2693 rc_option_editor.cc:2701
+#: rc_option_editor.cc:2709 rc_option_editor.cc:2717 rc_option_editor.cc:2790
+#: rc_option_editor.cc:2813
 msgid "MIDI"
 msgstr "MIDI"
 
-#: add_route_dialog.cc:225 add_route_dialog.cc:238 add_route_dialog.cc:308
+#: add_route_dialog.cc:246 add_route_dialog.cc:353
 msgid "Audio+MIDI"
-msgstr ""
+msgstr "Áudio+MIDI"
 
-#: add_route_dialog.cc:226 add_route_dialog.cc:241 add_route_dialog.cc:309
+#: add_route_dialog.cc:250 add_route_dialog.cc:354
 msgid "Bus"
 msgstr ""
 
-#: add_route_dialog.cc:268
+#: add_route_dialog.cc:286
 msgid ""
 "Audio+MIDI tracks are intended for use <b>ONLY</b> with plugins that use "
 "both audio and MIDI input data\n"
@@ -500,60 +587,61 @@ msgid ""
 "track instead."
 msgstr ""
 
-#: add_route_dialog.cc:327 add_route_dialog.cc:346 editor_actions.cc:422
-#: editor_rulers.cc:251 time_axis_view.cc:1374
+#: add_route_dialog.cc:373 add_route_dialog.cc:385 editor_actions.cc:456
+#: editor_rulers.cc:250 time_axis_view.cc:1290
 msgid "Normal"
 msgstr "Normal"
 
-#: add_route_dialog.cc:330 add_route_dialog.cc:348
+#: add_route_dialog.cc:374 add_route_dialog.cc:387
 msgid "Non Layered"
 msgstr ""
 
-#: add_route_dialog.cc:331 add_route_dialog.cc:350
+#: add_route_dialog.cc:375 add_route_dialog.cc:389
 msgid "Tape"
 msgstr ""
 
-#: add_route_dialog.cc:431 monitor_section.cc:290
+#: add_route_dialog.cc:476 monitor_section.cc:273 plugin_pin_dialog.cc:509
+#: plugin_setup_dialog.cc:202
 msgid "Mono"
 msgstr ""
 
-#: add_route_dialog.cc:435
+#: add_route_dialog.cc:480 plugin_pin_dialog.cc:512 plugin_setup_dialog.cc:205
 msgid "Stereo"
 msgstr ""
 
-#: add_route_dialog.cc:459
+#: add_route_dialog.cc:503
 msgid "3 Channel"
 msgstr ""
 
-#: add_route_dialog.cc:463
+#: add_route_dialog.cc:507
 msgid "4 Channel"
 msgstr ""
 
-#: add_route_dialog.cc:467
+#: add_route_dialog.cc:511
 msgid "5 Channel"
 msgstr ""
 
-#: add_route_dialog.cc:471
+#: add_route_dialog.cc:515
 msgid "6 Channel"
 msgstr ""
 
-#: add_route_dialog.cc:475
+#: add_route_dialog.cc:519
 msgid "8 Channel"
 msgstr ""
 
-#: add_route_dialog.cc:479
+#: add_route_dialog.cc:523
 msgid "12 Channel"
 msgstr ""
 
-#: add_route_dialog.cc:483 mixer_strip.cc:1836 mixer_strip.cc:2244
+#: add_route_dialog.cc:527 mixer_strip.cc:2017 mixer_strip.cc:2463
 msgid "Custom"
 msgstr ""
 
-#: add_route_dialog.cc:516 add_route_dialog.cc:532 route_group_menu.cc:81
+#: add_route_dialog.cc:569 add_route_dialog.cc:585 route_group_menu.cc:85
 msgid "New Group..."
-msgstr ""
+msgstr "Novo Grupo..."
 
-#: add_route_dialog.cc:520 route_group_menu.cc:85
+#: add_route_dialog.cc:573 route_group_menu.cc:89
 msgid "No Group"
 msgstr ""
 
@@ -561,177 +649,223 @@ msgstr ""
 msgid "Ambiguous File"
 msgstr ""
 
-#: ambiguous_file_dialog.cc:35
+#: ambiguous_file_dialog.cc:37
 msgid ""
 "%1 has found the file <i>%2</i> in the following places:\n"
 "\n"
 msgstr ""
 
-#: ambiguous_file_dialog.cc:44
+#: ambiguous_file_dialog.cc:46
 msgid ""
 "\n"
 "\n"
 "Please select the path that you want to get the file from."
 msgstr ""
 
-#: ambiguous_file_dialog.cc:46 missing_file_dialog.cc:46
+#: ambiguous_file_dialog.cc:48 missing_file_dialog.cc:50
 msgid "Done"
-msgstr ""
+msgstr "Pronto"
 
-#: analysis_window.cc:46
+#: analysis_window.cc:45
 msgid "Signal source"
-msgstr ""
+msgstr "Fonte de Sinal"
 
-#: analysis_window.cc:47
+#: analysis_window.cc:46
 msgid "Selected ranges"
-msgstr ""
+msgstr "Intervalos selecionados"
 
-#: analysis_window.cc:48
+#: analysis_window.cc:47
 msgid "Selected regions"
-msgstr ""
-
-#: analysis_window.cc:50
-msgid "Display model"
-msgstr ""
-
-#: analysis_window.cc:51
-msgid "Composite graphs for each track"
-msgstr ""
+msgstr "Regiões selecionadas"
 
-#: analysis_window.cc:52
-msgid "Composite graph of all tracks"
+#: analysis_window.cc:48
+msgid "Show frequency power range"
 msgstr ""
 
-#: analysis_window.cc:54
-msgid "Show frequency power range"
+#: analysis_window.cc:49
+msgid "Fit dB range"
 msgstr ""
 
-#: analysis_window.cc:55
-msgid "Normalize values"
+#: analysis_window.cc:50
+msgid "Proportional Spectrum, -18dB"
 msgstr ""
 
-#: analysis_window.cc:59
+#: analysis_window.cc:53
 msgid "FFT analysis window"
 msgstr ""
 
-#: analysis_window.cc:60 editor.cc:1823
+#: analysis_window.cc:54 editor.cc:1953
 msgid "Spectral Analysis"
 msgstr ""
 
-#: analysis_window.cc:67 editor_actions.cc:142 export_channel_selector.cc:557
-#: session_metadata_dialog.cc:667
+#: analysis_window.cc:61 editor_actions.cc:145 session_metadata_dialog.cc:670
 msgid "Track"
 msgstr "Trilha"
 
-#: analysis_window.cc:68 editor_actions.cc:648 mixer_ui.cc:131
-#: mixer_ui.cc:1854
+#: analysis_window.cc:62 ardour_ui_ed.cc:254 ardour_ui_ed.cc:255
+#: ardour_ui_ed.cc:256 editor_actions.cc:689 mixer_ui.cc:151 mixer_ui.cc:2134
 msgid "Show"
-msgstr ""
+msgstr "Mostrar"
 
-#: analysis_window.cc:135
+#: analysis_window.cc:107
 msgid "Re-analyze data"
-msgstr ""
+msgstr "Re-analisar dados"
 
-#: ardour_button.cc:887
+#: ardour_button.cc:876
 msgid "button cannot watch state of non-existing Controllable\n"
 msgstr ""
 
-#: ardour_button.cc:1155
+#: ardour_button.cc:1144
 msgid "ABCDEFGHIJLKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
 msgstr ""
 
-#: ardour_ui.cc:164
+#: ardour_http.cc:165 ardour_http.cc:179
+msgid "HTTP request failed: (%1) %2"
+msgstr ""
+
+#: ardour_http.cc:169 ardour_http.cc:182
+msgid "HTTP request status: %1"
+msgstr ""
+
+#: ardour_ui.cc:198
 msgid ""
 "%1 %2.x has discovered configuration files from %1 %3.x.\n"
 "\n"
-"Would you like to copy the relevant files before starting to use the "
-"program?\n"
+"Would you like these files to be copied and used for %1 %2.x?\n"
 "\n"
 "(This will require you to restart %1.)"
 msgstr ""
 
-#: ardour_ui.cc:211 editor_actions.cc:642 region_editor.cc:51
+#: ardour_ui.cc:283 editor_actions.cc:683 region_editor.cc:53
 msgid "Audition"
 msgstr "Audição"
 
-#: ardour_ui.cc:212 editor_actions.cc:136 mixer_strip.cc:2016
-#: rc_option_editor.cc:1959 route_time_axis.cc:252 route_time_axis.cc:2711
+#: ardour_ui.cc:284 editor_actions.cc:139 mixer_strip.cc:2213
+#: monitor_section.cc:329 rc_option_editor.cc:2547 route_time_axis.cc:263
+#: route_time_axis.cc:2740 vca_master_strip.cc:212 vca_time_axis.cc:237
 msgid "Solo"
 msgstr "Solo"
 
-#: ardour_ui.cc:213 rc_option_editor.cc:741
+#: ardour_ui.cc:285 rc_option_editor.cc:1357
 msgid "Feedback"
 msgstr ""
 
-#: ardour_ui.cc:219 speaker_dialog.cc:36
+#: ardour_ui.cc:296 speaker_dialog.cc:36
 msgid "Speaker Configuration"
-msgstr ""
-
-#: ardour_ui.cc:220 keyeditor.cc:53
-msgid "Key Bindings"
-msgstr ""
-
-#: ardour_ui.cc:221
-msgid "Preferences"
-msgstr ""
+msgstr "Configuração de Autofalantes"
 
-#: ardour_ui.cc:222 ardour_ui.cc:229
+#: ardour_ui.cc:297
 msgid "Add Tracks/Busses"
-msgstr ""
+msgstr "Adicionar Trilhas/Bus"
 
-#: ardour_ui.cc:223
+#: ardour_ui.cc:298
 msgid "About"
 msgstr "Sobre"
 
-#: ardour_ui.cc:224 location_ui.cc:1141 session_option_editor.cc:189
-#: session_option_editor.cc:195 session_option_editor.cc:202
-msgid "Locations"
-msgstr "Localizações"
+#: ardour_ui.cc:299 location_ui.cc:1167
+msgid "Ranges|Locations"
+msgstr "Intervalos|Localizações"
 
-#: ardour_ui.cc:225 route_params_ui.cc:59 route_params_ui.cc:630
+#: ardour_ui.cc:300 route_params_ui.cc:59 route_params_ui.cc:620
 msgid "Tracks and Busses"
-msgstr ""
+msgstr "Trilhas e Bus"
 
-#: ardour_ui.cc:226 engine_dialog.cc:70
+#: ardour_ui.cc:301 engine_dialog.cc:73
 msgid "Audio/MIDI Setup"
-msgstr ""
+msgstr "Configuração de Áudio/MIDI"
 
-#: ardour_ui.cc:227
+#: ardour_ui.cc:302
 msgid "Video Export Dialog"
 msgstr ""
 
-#: ardour_ui.cc:228
-msgid "Properties"
+#: ardour_ui.cc:303 lua_script_manager.cc:30
+msgid "Script Manager"
 msgstr ""
 
-#: ardour_ui.cc:230 bundle_manager.cc:264
+#: ardour_ui.cc:304
+msgid "Properties"
+msgstr "Propriedades"
+
+#: ardour_ui.cc:305
+msgid "Add Video"
+msgstr "Adicionar Vídeo"
+
+#: ardour_ui.cc:306 bundle_manager.cc:264
 msgid "Bundle Manager"
 msgstr ""
 
-#: ardour_ui.cc:231 big_clock_window.cc:37
+#: ardour_ui.cc:307 big_clock_window.cc:37
 msgid "Big Clock"
 msgstr "Metrônomo"
 
-#: ardour_ui.cc:232
+#: ardour_ui.cc:308
 msgid "Audio Connections"
-msgstr ""
+msgstr "Conexões de Áudio"
 
-#: ardour_ui.cc:233
+#: ardour_ui.cc:309
 msgid "MIDI Connections"
+msgstr "Conexões MIDI"
+
+#: ardour_ui.cc:310
+msgid "Bindings Editor"
 msgstr ""
 
-#: ardour_ui.cc:242
+#: ardour_ui.cc:321 editor.cc:1288
+msgid "Window|Editor"
+msgstr "Editor"
+
+#: ardour_ui.cc:322 mixer_ui.cc:2210 mixer_ui.cc:2216
+msgid "Window|Mixer"
+msgstr "Mesa de Som"
+
+#: ardour_ui.cc:323
+msgid "Window|Preferences"
+msgstr "Preferências"
+
+#: ardour_ui.cc:330
 msgid "Your configuration files were copied. You can now restart %1."
 msgstr ""
 
-#: ardour_ui.cc:481
+#: ardour_ui.cc:509
+msgid "Pre-Release Warning"
+msgstr ""
+
+#: ardour_ui.cc:513
+msgid ""
+"<b>Welcome to this pre-release build of %1 %2</b>\n"
+"\n"
+"There are still several issues and bugs to be worked on,\n"
+"as well as general workflow improvements, before this can be considered\n"
+"release software. So, a few guidelines:\n"
+"\n"
+"1) Please do <b>NOT</b> use this software with the expectation that it is "
+"stable or reliable\n"
+"   though it may be so, depending on your workflow.\n"
+"2) Please wait for a helpful writeup of new features.\n"
+"3) <b>Please do NOT use the forums at ardour.org to report issues</b>.\n"
+"4) Please <b>DO</b> use the bugtracker at http://tracker.ardour.org/ to "
+"report issues\n"
+"   making sure to note the product version number as 5.0-pre.\n"
+"5) Please <b>DO</b> use the ardour-users mailing list to discuss ideas and "
+"pass on comments.\n"
+"6) Please <b>DO</b> join us on IRC for real time discussions about %1 %2. "
+"You\n"
+"   can get there directly from within the program via the Help->Chat menu "
+"option.\n"
+"\n"
+"Full information on all the above can be found on the support page at\n"
+"\n"
+"                http://ardour.org/support\n"
+msgstr ""
+
+#: ardour_ui.cc:613
 msgid ""
 "The audio backend was shutdown because:\n"
 "\n"
 "%1"
 msgstr ""
 
-#: ardour_ui.cc:483
+#: ardour_ui.cc:615
 msgid ""
 "The audio backend has either been shutdown or it\n"
 "disconnected %1 because %1\n"
@@ -739,45 +873,45 @@ msgid ""
 "the audio backend and save the session."
 msgstr ""
 
-#: ardour_ui.cc:507
+#: ardour_ui.cc:639
 msgid ""
 "Audio Unit Plugin Scan Failed. Automatic AU scanning has been disabled. "
 "Please see the log window for further details."
 msgstr ""
 
-#: ardour_ui.cc:508
+#: ardour_ui.cc:640
 msgid "Audio Unit Plugin Scan Failed:"
 msgstr ""
 
-#: ardour_ui.cc:827
+#: ardour_ui.cc:1008
 msgid "NSM server did not announce itself"
 msgstr ""
 
-#: ardour_ui.cc:840
+#: ardour_ui.cc:1021
 msgid "NSM: no client ID provided"
 msgstr ""
 
-#: ardour_ui.cc:847
+#: ardour_ui.cc:1028
 msgid "NSM: no session created"
 msgstr ""
 
-#: ardour_ui.cc:870
+#: ardour_ui.cc:1051
 msgid "NSM: initialization failed"
 msgstr ""
 
-#: ardour_ui.cc:900
+#: ardour_ui.cc:1083
 msgid "Free/Demo Version Warning"
 msgstr ""
 
-#: ardour_ui.cc:902
+#: ardour_ui.cc:1085
 msgid "Subscribe and support development of %1"
 msgstr ""
 
-#: ardour_ui.cc:903
+#: ardour_ui.cc:1086
 msgid "Don't warn me about this again"
-msgstr ""
+msgstr "Ignorar este aviso futuramente"
 
-#: ardour_ui.cc:905
+#: ardour_ui.cc:1088
 msgid ""
 "<span weight=\"bold\" size=\"large\">%1</span>\n"
 "\n"
@@ -788,39 +922,39 @@ msgid ""
 "%4"
 msgstr ""
 
-#: ardour_ui.cc:906
+#: ardour_ui.cc:1089
 msgid "This is a free/demo version of %1"
 msgstr ""
 
-#: ardour_ui.cc:907
+#: ardour_ui.cc:1090
 msgid "It will not restore OR save any plugin settings"
 msgstr ""
 
-#: ardour_ui.cc:908
+#: ardour_ui.cc:1091
 msgid ""
 "If you load an existing session with plugin settings\n"
 "they will not be used and will be lost."
 msgstr ""
 
-#: ardour_ui.cc:910 plugin_ui.cc:569
+#: ardour_ui.cc:1093 plugin_ui.cc:579
 msgid ""
 "To get full access to updates without this limitation\n"
 "consider becoming a subscriber for a low cost every month."
 msgstr ""
 
-#: ardour_ui.cc:920
+#: ardour_ui.cc:1103
 msgid "Quit now"
-msgstr ""
+msgstr "Sair agora"
 
-#: ardour_ui.cc:921
+#: ardour_ui.cc:1104
 msgid "Continue using %1"
 msgstr ""
 
-#: ardour_ui.cc:954 startup.cc:345
+#: ardour_ui.cc:1135 startup.cc:349
 msgid "%1 is ready for use"
 msgstr ""
 
-#: ardour_ui.cc:996
+#: ardour_ui.cc:1185
 msgid ""
 "WARNING: Your system has a limit for maximum amount of locked memory. This "
 "might cause %1 to run out of memory before your system runs out of memory. \n"
@@ -829,23 +963,23 @@ msgid ""
 "controlled by %2"
 msgstr ""
 
-#: ardour_ui.cc:1013
+#: ardour_ui.cc:1202
 msgid "Do not show this window again"
-msgstr ""
+msgstr "Não mostrar esta janela novamente"
 
-#: ardour_ui.cc:1057
+#: ardour_ui.cc:1245
 msgid "Don't quit"
-msgstr ""
+msgstr "Não sair"
 
-#: ardour_ui.cc:1058
+#: ardour_ui.cc:1246
 msgid "Just quit"
-msgstr ""
+msgstr "Apenas sair"
 
-#: ardour_ui.cc:1059
+#: ardour_ui.cc:1247 ardour_ui.cc:5362
 msgid "Save and quit"
-msgstr ""
+msgstr "Salvar e sair"
 
-#: ardour_ui.cc:1069
+#: ardour_ui.cc:1257
 msgid ""
 "%1 was unable to save your session.\n"
 "\n"
@@ -854,11 +988,11 @@ msgid ""
 "\"Just quit\" option."
 msgstr ""
 
-#: ardour_ui.cc:1119
+#: ardour_ui.cc:1307
 msgid "Unsaved Session"
-msgstr ""
+msgstr "Sessão Não Salva"
 
-#: ardour_ui.cc:1140
+#: ardour_ui.cc:1328
 msgid ""
 "The session \"%1\"\n"
 "has not been saved.\n"
@@ -868,8 +1002,14 @@ msgid ""
 "\n"
 "What do you want to do?"
 msgstr ""
+"A sessão \"%1\" não foi salva.\n"
+"\n"
+"Qualquer alteração feita agora\n"
+"será perdida se não salvar.\n"
+"\n"
+"O que você deseja fazer?"
 
-#: ardour_ui.cc:1143
+#: ardour_ui.cc:1331
 msgid ""
 "The snapshot \"%1\"\n"
 "has not been saved.\n"
@@ -879,75 +1019,115 @@ msgid ""
 "\n"
 "What do you want to do?"
 msgstr ""
+"The snapshot \"%1\"\n"
+"não foi salvo.\n"
+"\n"
+"Qualquer alteração feita agora\n"
+"será perdida se não salvar.\n"
+"\n"
+"O que você deseja fazer?"
 
-#: ardour_ui.cc:1157
+#: ardour_ui.cc:1345
 msgid "Prompter"
 msgstr ""
 
-#: ardour_ui.cc:1269 ardour_ui.cc:1277
+#: ardour_ui.cc:1459 ardour_ui.cc:1467
 msgid "Audio: <span foreground=\"red\">none</span>"
-msgstr ""
+msgstr "Áudio: <span foreground=\"red\">none</span>"
 
-#: ardour_ui.cc:1281
+#: ardour_ui.cc:1471
 #, c-format
 msgid "Audio: <span foreground=\"green\">%.1f kHz / %4.1f ms</span>"
-msgstr ""
+msgstr "Áudio: <span foreground=\"green\">%.1f kHz / %4.1f ms</span>"
 
-#: ardour_ui.cc:1285
+#: ardour_ui.cc:1475
 #, c-format
 msgid "Audio: <span foreground=\"green\">%<PRId64> kHz / %4.1f ms</span>"
-msgstr ""
+msgstr "Áudio: <span foreground=\"green\">%<PRId64> kHz / %4.1f ms</span>"
 
-#: ardour_ui.cc:1303 export_video_dialog.cc:80
+#: ardour_ui.cc:1493 export_report.cc:108 export_report.cc:323
+#: export_video_dialog.cc:76
 msgid "File:"
-msgstr ""
+msgstr "Arquivo:"
 
-#: ardour_ui.cc:1307
+#: ardour_ui.cc:1497
 msgid "BWF"
 msgstr ""
 
-#: ardour_ui.cc:1310
+#: ardour_ui.cc:1500
 msgid "WAV"
 msgstr ""
 
-#: ardour_ui.cc:1313
+#: ardour_ui.cc:1503
 msgid "WAV64"
 msgstr ""
 
-#: ardour_ui.cc:1316 session_option_editor.cc:185
+#: ardour_ui.cc:1506 session_option_editor.cc:202
 msgid "CAF"
 msgstr ""
 
-#: ardour_ui.cc:1319
+#: ardour_ui.cc:1509
 msgid "AIFF"
 msgstr ""
 
-#: ardour_ui.cc:1322
+#: ardour_ui.cc:1512
 msgid "iXML"
 msgstr ""
 
-#: ardour_ui.cc:1325
+#: ardour_ui.cc:1515 session_option_editor.cc:203
 msgid "RF64"
 msgstr ""
 
-#: ardour_ui.cc:1333
+#: ardour_ui.cc:1518
+msgid "RF64/WAV"
+msgstr ""
+
+#: ardour_ui.cc:1521
+msgid "MBWF"
+msgstr ""
+
+#: ardour_ui.cc:1529
 msgid "32-float"
 msgstr ""
 
-#: ardour_ui.cc:1336
+#: ardour_ui.cc:1532
 msgid "24-int"
 msgstr ""
 
-#: ardour_ui.cc:1339
+#: ardour_ui.cc:1535
 msgid "16-int"
 msgstr ""
 
-#: ardour_ui.cc:1358
+#: ardour_ui.cc:1556
+#, c-format
+msgid "X: <span foreground=\"%s\">>10K</span>"
+msgstr ""
+
+#: ardour_ui.cc:1558
+#, c-format
+msgid "X: <span foreground=\"%s\">%u</span>"
+msgstr ""
+
+#: ardour_ui.cc:1561
+#, c-format
+msgid "X: <span foreground=\"%s\">?</span>"
+msgstr ""
+
+#: ardour_ui.cc:1564
+msgid "Audio dropouts. Shift+click to reset"
+msgstr ""
+
+#: ardour_ui.cc:1577
 #, c-format
 msgid "DSP: <span foreground=\"%s\">%5.1f%%</span>"
 msgstr ""
 
-#: ardour_ui.cc:1377
+#: ardour_ui.cc:1587
+#, c-format
+msgid "PkBld: <span foreground=\"%s\">%d</span>"
+msgstr ""
+
+#: ardour_ui.cc:1609
 #, c-format
 msgid ""
 "Buffers: <span foreground=\"green\">p:</span><span foreground=\"%s\">"
@@ -955,216 +1135,264 @@ msgid ""
 "\">%<PRIu32>%%</span>"
 msgstr ""
 
-#: ardour_ui.cc:1418
+#: ardour_ui.cc:1650
 msgid "Disk: <span foreground=\"green\">Unknown</span>"
 msgstr ""
 
-#: ardour_ui.cc:1420
+#: ardour_ui.cc:1652
 msgid "Disk: <span foreground=\"green\">24hrs+</span>"
 msgstr ""
 
-#: ardour_ui.cc:1438
+#: ardour_ui.cc:1670
 msgid "Disk: <span foreground=\"green\">>24 hrs</span>"
 msgstr ""
 
-#: ardour_ui.cc:1449
+#: ardour_ui.cc:1681
 #, c-format
 msgid "Disk: <span foreground=\"%s\">%02dh:%02dm:%02ds</span>"
 msgstr ""
 
-#: ardour_ui.cc:1475
+#: ardour_ui.cc:1707
 #, c-format
 msgid "Timecode|TC: <span foreground=\"%s\">%s</span>"
-msgstr ""
-
-#: ardour_ui.cc:1596 ardour_ui.cc:1605 session_dialog.cc:318
-#: session_dialog.cc:323
-msgid "Recent Sessions"
-msgstr ""
+msgstr "Tempo|TC: <span foreground=\"%s\">%s</span>"
 
-#: ardour_ui.cc:1684
+#: ardour_ui.cc:1789
 msgid ""
 "%1 is not connected to any audio backend.\n"
 "You cannot open or close sessions in this condition"
 msgstr ""
 
-#: ardour_ui.cc:1708
+#: ardour_ui.cc:1807
 msgid "Open Session"
 msgstr ""
 
-#: ardour_ui.cc:1733 session_dialog.cc:349 session_import_dialog.cc:170
-#: session_metadata_dialog.cc:858
+#: ardour_ui.cc:1831 session_dialog.cc:410 session_import_dialog.cc:170
+#: session_metadata_dialog.cc:861
 msgid "%1 sessions"
 msgstr ""
 
-#: ardour_ui.cc:1770
+#: ardour_ui.cc:1879 ardour_ui.cc:1916
 msgid "You cannot add a track without a session already loaded."
 msgstr ""
 "Você não pode adicionar uma trilha se uma sessão não estiver carregada."
 
-#: ardour_ui.cc:1778
+#: ardour_ui.cc:1887
 msgid "could not create %1 new mixed track"
 msgid_plural "could not create %1 new mixed tracks"
 msgstr[0] ""
 msgstr[1] ""
 
-#: ardour_ui.cc:1784 ardour_ui.cc:1845
-msgid ""
-"There are insufficient ports available\n"
-"to create a new track or bus.\n"
-"You should save %1, exit and\n"
-"restart with more ports."
-msgstr ""
+#: ardour_ui.cc:1924
+msgid "could not create %1 new Midi Bus"
+msgid_plural "could not create %1 new Midi Busses"
+msgstr[0] ""
+msgstr[1] ""
 
-#: ardour_ui.cc:1819
+#: ardour_ui.cc:1977
 msgid "You cannot add a track or bus without a session already loaded."
 msgstr ""
 
-#: ardour_ui.cc:1828
+#: ardour_ui.cc:1986
 msgid "could not create %1 new audio track"
 msgid_plural "could not create %1 new audio tracks"
 msgstr[0] ""
 msgstr[1] ""
 
-#: ardour_ui.cc:1837
+#: ardour_ui.cc:1995
 msgid "could not create %1 new audio bus"
 msgid_plural "could not create %1 new audio busses"
 msgstr[0] ""
 msgstr[1] ""
 
-#: ardour_ui.cc:1990
+#: ardour_ui.cc:2020
 msgid ""
-"Please create one or more tracks before trying to record.\n"
-"You can do this with the \"Add Track or Bus\" option in the Session menu."
+"There are insufficient ports available\n"
+"to create a new track or bus.\n"
+"You should save %1, exit and\n"
+"restart with more ports."
 msgstr ""
 
-#: ardour_ui.cc:2376
-msgid "Save as..."
+#: ardour_ui.cc:2164
+msgid ""
+"Please create one or more tracks before trying to record.\n"
+"You can do this with the \"Add Track or Bus\" option in the Session menu."
 msgstr ""
 
-#: ardour_ui.cc:2377 ardour_ui.cc:2456
-msgid "New session name"
+#: ardour_ui.cc:2565
+#, c-format
+msgid "Copied %<PRId64> of %<PRId64>"
 msgstr ""
 
-#: ardour_ui.cc:2379
-msgid "Take Snapshot"
-msgstr ""
+#: ardour_ui.cc:2619 save_as_dialog.cc:33
+msgid "Save As"
+msgstr "Salvar como"
 
-#: ardour_ui.cc:2380
-msgid "Name of new snapshot"
+#: ardour_ui.cc:2647
+msgid "Save As failed: %1"
 msgstr ""
 
-#: ardour_ui.cc:2405
+#: ardour_ui.cc:2684
 msgid ""
 "To ensure compatibility with various systems\n"
 "snapshot names may not contain a '%1' character"
 msgstr ""
 
-#: ardour_ui.cc:2417
+#: ardour_ui.cc:2698
 msgid "Confirm Snapshot Overwrite"
 msgstr ""
 
-#: ardour_ui.cc:2418
-msgid "A snapshot already exists with that name.  Do you want to overwrite it?"
+#: ardour_ui.cc:2699
+msgid "A snapshot already exists with that name. Do you want to overwrite it?"
 msgstr ""
 
-#: ardour_ui.cc:2421 utils_videotl.cc:74
-msgid "Overwrite"
+#: ardour_ui.cc:2724
+msgid "Snapshot and switch"
 msgstr ""
 
-#: ardour_ui.cc:2455
-msgid "Rename Session"
+#: ardour_ui.cc:2725 ardour_ui.cc:2776
+msgid "New session name"
+msgstr "Nome da nova sessão"
+
+#: ardour_ui.cc:2727
+msgid "Take Snapshot"
 msgstr ""
 
-#: ardour_ui.cc:2470 ardour_ui.cc:2886 ardour_ui.cc:2924
+#: ardour_ui.cc:2728
+msgid "Name of new snapshot"
+msgstr ""
+
+#: ardour_ui.cc:2775
+msgid "Rename Session"
+msgstr "Renomear Sessão"
+
+#: ardour_ui.cc:2790 ardour_ui.cc:3267 ardour_ui.cc:3305
 msgid ""
 "To ensure compatibility with various systems\n"
 "session names may not contain a '%1' character"
 msgstr ""
 
-#: ardour_ui.cc:2478
+#: ardour_ui.cc:2798
 msgid ""
 "That name is already in use by another directory/folder. Please try again."
 msgstr ""
 
-#: ardour_ui.cc:2487
+#: ardour_ui.cc:2807
 msgid ""
 "Renaming this session failed.\n"
 "Things could be seriously messed up at this point"
 msgstr ""
 
-#: ardour_ui.cc:2602
-msgid "Save Template"
+#: ardour_ui.cc:2923 route_ui.cc:1867
+msgid "Confirm Template Overwrite"
 msgstr ""
 
-#: ardour_ui.cc:2603
-msgid "Name for template:"
+#: ardour_ui.cc:2924 route_ui.cc:1868
+msgid "A template already exists with that name. Do you want to overwrite it?"
 msgstr ""
 
-#: ardour_ui.cc:2604
+#: ardour_ui.cc:2948
+msgid "Save Template"
+msgstr "Salvar Esquema"
+
+#: ardour_ui.cc:2949
+msgid "Name for template:"
+msgstr "Nome para o esquema:"
+
+#: ardour_ui.cc:2950
 msgid "-template"
-msgstr "-esquema/template"
+msgstr "-esquema"
 
-#: ardour_ui.cc:2643
+#: ardour_ui.cc:2987
 msgid ""
 "This session\n"
 "%1\n"
 "already exists. Do you want to open it?"
 msgstr ""
 
-#: ardour_ui.cc:2653
+#: ardour_ui.cc:2997
 msgid "Open Existing Session"
-msgstr ""
+msgstr "Abrir Sessão Existente"
 
-#: ardour_ui.cc:2914
+#: ardour_ui.cc:3295
 msgid "There is no existing session at \"%1\""
 msgstr ""
 
-#: ardour_ui.cc:3006
+#: ardour_ui.cc:3391
 msgid "Please wait while %1 loads your session"
 msgstr ""
 
-#: ardour_ui.cc:3021
+#: ardour_ui.cc:3406
 msgid "Port Registration Error"
 msgstr ""
 
-#: ardour_ui.cc:3022
+#: ardour_ui.cc:3407
 msgid "Click the Close button to try again."
+msgstr "Clique no botão Fechar para tentar novamente"
+
+#: ardour_ui.cc:3426
+msgid "Session \"%1 (snapshot %2)\" did not load successfully: %3"
 msgstr ""
 
-#: ardour_ui.cc:3043
+#: ardour_ui.cc:3432 ardour_ui.cc:3453 ardour_ui.cc:3548 ardour_ui.cc:3557
+msgid "Loading Error"
+msgstr "Erro de carregamento"
+
+#: ardour_ui.cc:3447
 msgid "Session \"%1 (snapshot %2)\" did not load successfully"
 msgstr "A sessão \"%1 (instantâneo %2)\" não pôde ser carregada"
 
-#: ardour_ui.cc:3049
-msgid "Loading Error"
-msgstr ""
-
-#: ardour_ui.cc:3068
+#: ardour_ui.cc:3475
 msgid ""
 "This session has been opened in read-only mode.\n"
 "\n"
 "You will not be able to record or save."
 msgstr ""
 
-#: ardour_ui.cc:3073
+#: ardour_ui.cc:3480
 msgid "Read-only Session"
 msgstr ""
 
-#: ardour_ui.cc:3139
+#: ardour_ui.cc:3547
+msgid "Could not create session in \"%1\": %2"
+msgstr ""
+
+#: ardour_ui.cc:3556
 msgid "Could not create session in \"%1\""
 msgstr ""
 
-#: ardour_ui.cc:3288
-msgid "No files were ready for clean-up"
+#: ardour_ui.cc:3601
+msgid ""
+"<b>Just ask and wait for an answer.\n"
+"It may take from minutes to hours.</b>"
 msgstr ""
 
-#: ardour_ui.cc:3292 ardour_ui.cc:3302 ardour_ui.cc:3435 ardour_ui.cc:3442
-#: ardour_ui_ed.cc:103
-msgid "Clean-up"
+#: ardour_ui.cc:3603
+msgid "About the Chat"
 msgstr ""
 
-#: ardour_ui.cc:3293
+#: ardour_ui.cc:3604
+msgid ""
+"When you're inside the chat just ask your question and wait for an answer. "
+"The chat is occupied by real people with real lives so many of them are "
+"passively online and might not read your question before minutes or hours "
+"later.\n"
+"So please be patient and wait for an answer.\n"
+"\n"
+"You should just leave the chat window open and check back regularly until "
+"someone has answered your question."
+msgstr ""
+
+#: ardour_ui.cc:3723
+msgid "No files were ready for clean-up"
+msgstr "Não havia arquivos prontos para limpeza"
+
+#: ardour_ui.cc:3727 ardour_ui.cc:3737 ardour_ui.cc:3870 ardour_ui.cc:3877
+#: ardour_ui_ed.cc:129
+msgid "Clean-up"
+msgstr "Limpeza"
+
+#: ardour_ui.cc:3728
 msgid ""
 "If this seems suprising, \n"
 "check for any existing snapshots.\n"
@@ -1172,19 +1400,19 @@ msgid ""
 "require some unused files to continue to exist."
 msgstr ""
 
-#: ardour_ui.cc:3352
+#: ardour_ui.cc:3787
 msgid "kilo"
 msgstr ""
 
-#: ardour_ui.cc:3355
+#: ardour_ui.cc:3790
 msgid "mega"
 msgstr ""
 
-#: ardour_ui.cc:3358
+#: ardour_ui.cc:3793
 msgid "giga"
 msgstr ""
 
-#: ardour_ui.cc:3363
+#: ardour_ui.cc:3798
 msgid ""
 "The following file was deleted from %2,\n"
 "releasing %3 %4bytes of disk space"
@@ -1194,7 +1422,7 @@ msgid_plural ""
 msgstr[0] ""
 msgstr[1] ""
 
-#: ardour_ui.cc:3370
+#: ardour_ui.cc:3805
 msgid ""
 "The following file was not in use and \n"
 "has been moved to: %2\n"
@@ -1216,90 +1444,126 @@ msgid_plural ""
 msgstr[0] ""
 msgstr[1] ""
 
-#: ardour_ui.cc:3430
+#: ardour_ui.cc:3865
 msgid "Are you sure you want to clean-up?"
 msgstr ""
 
-#: ardour_ui.cc:3437
+#: ardour_ui.cc:3872
 msgid ""
 "Clean-up is a destructive operation.\n"
 "ALL undo/redo information will be lost if you clean-up.\n"
 "Clean-up will move all unused files to a \"dead\" location."
 msgstr ""
 
-#: ardour_ui.cc:3445
+#: ardour_ui.cc:3880
 msgid "CleanupDialog"
 msgstr "Limpar"
 
-#: ardour_ui.cc:3475
+#: ardour_ui.cc:3910
 msgid "Cleaned Files"
 msgstr ""
 
-#: ardour_ui.cc:3492
+#: ardour_ui.cc:3927
 msgid "deleted file"
 msgstr "arquivo removido"
 
-#: ardour_ui.cc:3637
+#: ardour_ui.cc:4133
+msgid "Cannot read session script '%1': %2"
+msgstr ""
+
+#: ardour_ui.cc:4142 luainstance.cc:1104
+msgid "Set Script Parameters"
+msgstr ""
+
+#: ardour_ui.cc:4153
+msgid "Session script '%1' instantiation failed: %2"
+msgstr ""
+
+#: ardour_ui.cc:4157
+msgid "Loading Session script '%1' failed: %2"
+msgstr ""
+
+#: ardour_ui.cc:4170
+msgid "There are no active Lua session scripts present in this session."
+msgstr ""
+
+#: ardour_ui.cc:4187
+msgid "Session script '%1' removal failed: %2"
+msgstr ""
+
+#: ardour_ui.cc:4197
 msgid "Video-Server was not launched by %1. The request to stop it is ignored."
 msgstr ""
 
-#: ardour_ui.cc:3641
+#: ardour_ui.cc:4201
 msgid "Stop Video-Server"
 msgstr ""
 
-#: ardour_ui.cc:3642
+#: ardour_ui.cc:4202
 msgid "Do you really want to stop the Video Server?"
 msgstr ""
 
-#: ardour_ui.cc:3645
+#: ardour_ui.cc:4205
 msgid "Yes, Stop It"
 msgstr ""
 
-#: ardour_ui.cc:3671
+#: ardour_ui.cc:4231
 msgid "The Video Server is already started."
 msgstr ""
 
-#: ardour_ui.cc:3673
+#: ardour_ui.cc:4233
 msgid ""
 "An external Video Server is configured and can be reached. Not starting a "
 "new instance."
 msgstr ""
 
-#: ardour_ui.cc:3681 ardour_ui.cc:3786
+#: ardour_ui.cc:4241 ardour_ui.cc:4346
 msgid ""
 "Could not connect to the Video Server. Start it or configure its access URL "
 "in Preferences."
 msgstr ""
 
-#: ardour_ui.cc:3711
+#: ardour_ui.cc:4271
 msgid "Specified docroot is not an existing directory."
 msgstr ""
 
-#: ardour_ui.cc:3717 ardour_ui.cc:3723
+#: ardour_ui.cc:4277 ardour_ui.cc:4283
 msgid "Given Video Server is not an executable file."
 msgstr ""
 
-#: ardour_ui.cc:3757
+#: ardour_ui.cc:4317
 msgid "Cannot launch the video-server"
 msgstr ""
 
-#: ardour_ui.cc:3767
+#: ardour_ui.cc:4327
 msgid "Video-server was started but does not respond to requests..."
 msgstr ""
 
-#: ardour_ui.cc:3812 editor_audio_import.cc:641
+#: ardour_ui.cc:4372 editor_audio_import.cc:647
 msgid "could not open %1"
 msgstr "não foi possível abrir %1"
 
-#: ardour_ui.cc:3816
+#: ardour_ui.cc:4376
 msgid "no video-file selected"
 msgstr ""
 
-#: ardour_ui.cc:4014
+#: ardour_ui.cc:4472
+msgid "No LTC detected, video will not be aligned."
+msgstr ""
+
+#: ardour_ui.cc:4478
+msgid "Align video-start to %1 [samples]"
+msgstr ""
+
+#: ardour_ui.cc:4654
+msgid "xrun"
+msgstr ""
+
+#: ardour_ui.cc:4663
 msgid "Recording was stopped because your system could not keep up."
 msgstr "A gravação foi encerrada porque seu sistema não consegue acompanhar"
 
-#: ardour_ui.cc:4043
+#: ardour_ui.cc:4692
 msgid ""
 "The disk system on your computer\n"
 "was not able to keep up with %1.\n"
@@ -1308,23 +1572,23 @@ msgid ""
 "quickly enough to keep up with recording.\n"
 msgstr ""
 
-#: ardour_ui.cc:4113
+#: ardour_ui.cc:4765
 msgid "Scanning for plugins"
-msgstr ""
+msgstr "Procurando plugins"
 
-#: ardour_ui.cc:4115
+#: ardour_ui.cc:4767
 msgid "Cancel plugin scan"
 msgstr ""
 
-#: ardour_ui.cc:4124
+#: ardour_ui.cc:4776
 msgid "Stop Timeout"
 msgstr ""
 
-#: ardour_ui.cc:4131
+#: ardour_ui.cc:4783
 msgid "Scan Timeout"
 msgstr ""
 
-#: ardour_ui.cc:4174
+#: ardour_ui.cc:4827
 msgid ""
 "The disk system on your computer\n"
 "was not able to keep up with %1.\n"
@@ -1333,11 +1597,11 @@ msgid ""
 "quickly enough to keep up with playback.\n"
 msgstr ""
 
-#: ardour_ui.cc:4214
+#: ardour_ui.cc:4862
 msgid "Crash Recovery"
 msgstr ""
 
-#: ardour_ui.cc:4215
+#: ardour_ui.cc:4863
 msgid ""
 "This session appears to have been in the\n"
 "middle of recording when %1 or\n"
@@ -1348,42 +1612,43 @@ msgid ""
 "what you would like to do.\n"
 msgstr ""
 
-#: ardour_ui.cc:4227
+#: ardour_ui.cc:4875
 msgid "Ignore crash data"
 msgstr ""
 
-#: ardour_ui.cc:4228
+#: ardour_ui.cc:4876
 msgid "Recover from crash"
 msgstr ""
 
-#: ardour_ui.cc:4248
+#: ardour_ui.cc:4896
 msgid "Sample Rate Mismatch"
 msgstr ""
 
-#: ardour_ui.cc:4249
+#: ardour_ui.cc:4897
 msgid ""
 "This session was created with a sample rate of %1 Hz, but\n"
 "%2 is currently running at %3 Hz.  If you load this session,\n"
 "audio may be played at the wrong sample rate.\n"
 msgstr ""
 
-#: ardour_ui.cc:4258
+#: ardour_ui.cc:4906
 msgid "Do not load session"
 msgstr ""
 
-#: ardour_ui.cc:4259
+#: ardour_ui.cc:4907
 msgid "Load session anyway"
 msgstr ""
 
-#: ardour_ui.cc:4286
-msgid "Could not disconnect from Audio/MIDI engine"
-msgstr ""
-
-#: ardour_ui.cc:4303 ardour_ui.cc:4306
-msgid "Could not reconnect to the Audio/MIDI engine"
+#: ardour_ui.cc:4927
+msgid ""
+"This session was created with a sample rate of %1 Hz, but\n"
+"%2 is currently running at %3 Hz.\n"
+"Audio will be recorded and played at the wrong sample rate.\n"
+"Re-Configure the Audio Engine in\n"
+"Menu > Window > Audio/Midi Setup"
 msgstr ""
 
-#: ardour_ui.cc:4590
+#: ardour_ui.cc:5209
 msgid ""
 "%4This is a session from an older version of %3%5\n"
 "\n"
@@ -1395,88 +1660,113 @@ msgid ""
 "\n"
 "%6%2%7\n"
 "\n"
-"From now on, use the -2000 version with older versions of %3"
+"From now on, use the backup copy with older versions of %3"
 msgstr ""
 
-#: ardour_ui2.cc:73
-msgid "UI: cannot setup editor"
-msgstr "não foi possível iniciar o editor"
+#: ardour_ui.cc:5331
+msgid "This is a free/demo copy of %1. It has just switched to silent mode."
+msgstr ""
 
-#: ardour_ui2.cc:78
-msgid "UI: cannot setup mixer"
-msgstr "não foi possível iniciar o mixer"
+#: ardour_ui.cc:5337
+msgid "%1 is now silent"
+msgstr ""
 
-#: ardour_ui2.cc:83
-msgid "UI: cannot setup meterbridge"
+#: ardour_ui.cc:5339
+msgid ""
+"Please consider paying for a copy of %1 - you can pay whatever you want."
+msgstr ""
+
+#: ardour_ui.cc:5340
+msgid "Better yet become a subscriber - subscriptions start at US$1 per month."
+msgstr ""
+
+#: ardour_ui.cc:5341
+msgid "Pay for a copy (via the web)"
+msgstr ""
+
+#: ardour_ui.cc:5342
+msgid "Become a subscriber (via the web)"
+msgstr ""
+
+#: ardour_ui.cc:5361
+msgid "Remain silent"
+msgstr ""
+
+#: ardour_ui.cc:5363
+msgid "Give me more time"
+msgstr ""
+
+#: ardour_ui.cc:5656
+msgid "Global keybindings are missing"
 msgstr ""
 
-#: ardour_ui2.cc:128
+#: ardour_ui2.cc:79
 msgid "Play from playhead"
 msgstr "Reproduzir a partir do início"
 
-#: ardour_ui2.cc:129
+#: ardour_ui2.cc:80
 msgid "Stop playback"
 msgstr "Parar reprodução"
 
-#: ardour_ui2.cc:130
+#: ardour_ui2.cc:81
 msgid "Toggle record"
 msgstr ""
 
-#: ardour_ui2.cc:131
+#: ardour_ui2.cc:82
 msgid "Play range/selection"
 msgstr "Reproduzir intervalo/seleção"
 
-#: ardour_ui2.cc:132
+#: ardour_ui2.cc:83
 msgid "Go to start of session"
 msgstr "Ir para o início da sessão"
 
-#: ardour_ui2.cc:133
+#: ardour_ui2.cc:84
 msgid "Go to end of session"
 msgstr "Ir para o fim da sessão"
 
-#: ardour_ui2.cc:134
+#: ardour_ui2.cc:85
 msgid "Play loop range"
 msgstr "Reproduzir intervalo"
 
-#: ardour_ui2.cc:135
+#: ardour_ui2.cc:86
 msgid ""
 "MIDI Panic\n"
 "Send note off and reset controller messages on all MIDI channels"
 msgstr ""
 
-#: ardour_ui2.cc:136
+#: ardour_ui2.cc:87
 msgid "Return to last playback start when stopped"
 msgstr "Ir para o início da última reprodução quando parar"
 
-#: ardour_ui2.cc:137
-msgid "Playhead follows Range Selections and Edits"
+#: ardour_ui2.cc:88
+msgid "Playhead follows range selections and edits"
 msgstr ""
 
-#: ardour_ui2.cc:138
+#: ardour_ui2.cc:89
 msgid "Be sensible about input monitoring"
 msgstr "Sensível à monitoração na entrada"
 
-#: ardour_ui2.cc:139
+#: ardour_ui2.cc:90
 msgid "Enable/Disable audio click"
 msgstr "Habilitar/desabilitar metrônomo"
 
-#: ardour_ui2.cc:140 monitor_section.cc:111
+#: ardour_ui2.cc:91 monitor_section.cc:129
 msgid ""
 "When active, something is soloed.\n"
 "Click to de-solo everything"
 msgstr ""
 
-#: ardour_ui2.cc:141
+#: ardour_ui2.cc:92
 msgid ""
-"When active, auditioning is taking place\n"
+"When active, auditioning is taking place.\n"
 "Click to stop the audition"
 msgstr ""
 
-#: ardour_ui2.cc:142
+#: ardour_ui2.cc:93
 msgid "When active, there is a feedback loop."
 msgstr ""
 
-#: ardour_ui2.cc:143
+#: ardour_ui2.cc:94
 msgid ""
 "<b>Primary Clock</b> right-click to set display mode. Click to edit, click"
 "+drag a digit or mouse-over+scroll wheel to modify.\n"
@@ -1484,7 +1774,7 @@ msgid ""
 "confirm; postfix the edit with '+' or '-' to enter delta times.\n"
 msgstr ""
 
-#: ardour_ui2.cc:144
+#: ardour_ui2.cc:95
 msgid ""
 "<b>Secondary Clock</b> right-click to set display mode. Click to edit, click"
 "+drag a digit or mouse-over+scroll wheel to modify.\n"
@@ -1492,708 +1782,835 @@ msgid ""
 "confirm; postfix the edit with '+' or '-' to enter delta times.\n"
 msgstr ""
 
-#: ardour_ui2.cc:145
+#: ardour_ui2.cc:96
 msgid "Reset All Peak Indicators"
 msgstr ""
 
-#: ardour_ui2.cc:146
+#: ardour_ui2.cc:97
 msgid "Show Error Log and acknowledge warnings"
 msgstr ""
 
-#: ardour_ui2.cc:179
+#: ardour_ui2.cc:130
 msgid "[ERROR]: "
-msgstr ""
+msgstr "[ERRO]: "
 
-#: ardour_ui2.cc:182
+#: ardour_ui2.cc:133
 msgid "[WARNING]: "
-msgstr ""
+msgstr "[AVISO]: "
 
-#: ardour_ui2.cc:185
+#: ardour_ui2.cc:136
 msgid "[INFO]: "
-msgstr ""
+msgstr "[INFORMAÇÃO]: "
 
-#: ardour_ui2.cc:253 ardour_ui_ed.cc:403
+#: ardour_ui2.cc:197 ardour_ui_ed.cc:509
 msgid "Auto Return"
-msgstr ""
+msgstr "Retorno Automático"
 
-#: ardour_ui2.cc:255 ardour_ui_ed.cc:406
+#: ardour_ui2.cc:199 ardour_ui_ed.cc:512
 msgid "Follow Edits"
+msgstr "Seguir Edições"
+
+#: ardour_ui2.cc:422 ardour_ui2.cc:426 ardour_ui2.cc:430
+msgid ""
+"Drag this tab to the desktop to show %1 in its own window\n"
+"\n"
+"To put the window back, use the Window > %1 > Attach menu action"
 msgstr ""
 
-#: ardour_ui2.cc:716 rc_option_editor.cc:2300
+#: ardour_ui2.cc:638
 msgid "GUI"
 msgstr ""
 
-#: ardour_ui2.cc:733 rc_option_editor.cc:1309 rc_option_editor.cc:1327
-#: rc_option_editor.cc:1330 rc_option_editor.cc:1332 rc_option_editor.cc:1334
-#: rc_option_editor.cc:1342 rc_option_editor.cc:1350 rc_option_editor.cc:1352
-#: rc_option_editor.cc:1360 rc_option_editor.cc:1367 rc_option_editor.cc:1376
-#: rc_option_editor.cc:1378 rc_option_editor.cc:1380 rc_option_editor.cc:1388
-#: rc_option_editor.cc:1390 rc_option_editor.cc:1399
-#: session_option_editor.cc:321 session_option_editor.cc:323
-#: session_option_editor.cc:344 session_option_editor.cc:346
-#: session_option_editor.cc:348 session_option_editor.cc:355
-#: session_option_editor.cc:362 session_option_editor.cc:366
+#: ardour_ui2.cc:651 rc_option_editor.cc:1874 rc_option_editor.cc:1892
+#: rc_option_editor.cc:1895 rc_option_editor.cc:1897 rc_option_editor.cc:1899
+#: rc_option_editor.cc:1907 rc_option_editor.cc:1909 rc_option_editor.cc:1917
+#: rc_option_editor.cc:1925 rc_option_editor.cc:1932 rc_option_editor.cc:1953
+#: rc_option_editor.cc:1955 rc_option_editor.cc:1964
+#: session_option_editor.cc:342 session_option_editor.cc:344
+#: session_option_editor.cc:365 session_option_editor.cc:367
+#: session_option_editor.cc:369 session_option_editor.cc:376
+#: session_option_editor.cc:383 session_option_editor.cc:387
 msgid "Misc"
 msgstr "Miscelânea"
 
-#: ardour_ui_dependents.cc:76
+#: ardour_ui_dependents.cc:118
 msgid "Setup Editor"
-msgstr ""
+msgstr "Configurar Editor"
 
-#: ardour_ui_dependents.cc:78
+#: ardour_ui_dependents.cc:120
 msgid "Setup Mixer"
-msgstr ""
+msgstr "Configurar Mesa de Som"
 
-#: ardour_ui_dependents.cc:84
+#: ardour_ui_dependents.cc:127
 msgid "Reload Session History"
+msgstr "Recarregar Histórico da Sessão"
+
+#: ardour_ui_dependents.cc:248
+msgid "UI: cannot setup editor"
+msgstr "não foi possível iniciar o editor"
+
+#: ardour_ui_dependents.cc:253
+msgid "UI: cannot setup mixer"
+msgstr "não foi possível iniciar a mesa"
+
+#: ardour_ui_dependents.cc:258
+msgid "UI: cannot setup meterbridge"
 msgstr ""
 
-#: ardour_ui_dialogs.cc:250
-msgid "Don't close"
+#: ardour_ui_dependents.cc:263
+msgid "UI: cannot setup luawindow"
 msgstr ""
 
-#: ardour_ui_dialogs.cc:251
-msgid "Just close"
+#: ardour_ui_dependents.cc:269 ardour_ui_ed.cc:136 ardour_ui_ed.cc:257
+#: rc_option_editor.cc:1853 rc_option_editor.cc:3494
+msgid "Preferences"
+msgstr "Preferências"
+
+#: ardour_ui_dependents.cc:270 ardour_ui_ed.cc:134 mixer_ui.cc:100
+#: mixer_ui.cc:410
+msgid "Mixer"
+msgstr "Mesa de Som"
+
+#: ardour_ui_dependents.cc:271 ardour_ui_ed.cc:135 editor.cc:5790
+#: editor.cc:6062 public_editor.cc:34 rc_option_editor.cc:2201
+#: rc_option_editor.cc:2215 rc_option_editor.cc:2219 rc_option_editor.cc:2227
+#: rc_option_editor.cc:2236 rc_option_editor.cc:2244 rc_option_editor.cc:2253
+#: rc_option_editor.cc:2261 rc_option_editor.cc:2269 rc_option_editor.cc:2279
+#: rc_option_editor.cc:2281 rc_option_editor.cc:2305 rc_option_editor.cc:2317
+#: rc_option_editor.cc:2328 rc_option_editor.cc:2346
+msgid "Editor"
 msgstr ""
 
-#: ardour_ui_dialogs.cc:252
+#: ardour_ui_dialogs.cc:263
+msgid "Don't close"
+msgstr "Não fechar"
+
+#: ardour_ui_dialogs.cc:264
+msgid "Just close"
+msgstr "Apenas Fechar"
+
+#: ardour_ui_dialogs.cc:265
 msgid "Save and close"
-msgstr ""
+msgstr "Salvar e fechar"
 
-#: ardour_ui_dialogs.cc:362
-msgid "This screen is not tall enough to display the mixer window"
+#: ardour_ui_ed.cc:124
+msgid "Escape"
 msgstr ""
 
-#: ardour_ui_ed.cc:102
+#: ardour_ui_ed.cc:128
 msgid "Session"
 msgstr "Sessão"
 
-#: ardour_ui_ed.cc:105 editor_actions.cc:138 editor_regions.cc:116
-#: port_group.cc:458 session_option_editor.cc:82 session_option_editor.cc:89
+#: ardour_ui_ed.cc:131 editor_actions.cc:141 editor_regions.cc:163
+#: port_group.cc:469 session_option_editor.cc:82 session_option_editor.cc:89
 msgid "Sync"
 msgstr "Sincronia"
 
-#: ardour_ui_ed.cc:106
+#: ardour_ui_ed.cc:132
 msgid "Options"
-msgstr ""
+msgstr "Opções"
 
-#: ardour_ui_ed.cc:107
+#: ardour_ui_ed.cc:133
 msgid "Window"
+msgstr "Janela"
+
+#: ardour_ui_ed.cc:137 ardour_ui_ed.cc:267 ardour_ui_ed.cc:268
+#: ardour_ui_ed.cc:269
+msgid "Detach"
 msgstr ""
 
-#: ardour_ui_ed.cc:108
+#: ardour_ui_ed.cc:138
 msgid "Help"
-msgstr ""
+msgstr "Ajuda"
 
-#: ardour_ui_ed.cc:109
+#: ardour_ui_ed.cc:139
 msgid "Misc. Shortcuts"
 msgstr ""
 
-#: ardour_ui_ed.cc:110
+#: ardour_ui_ed.cc:140
 msgid "Audio File Format"
-msgstr ""
+msgstr "Formato do Arquivo de Áudio"
 
-#: ardour_ui_ed.cc:111
+#: ardour_ui_ed.cc:141
 msgid "File Type"
-msgstr ""
+msgstr "Tipo de Arquivo"
 
-#: ardour_ui_ed.cc:112 export_format_dialog.cc:67
+#: ardour_ui_ed.cc:142 export_format_dialog.cc:75
 msgid "Sample Format"
 msgstr ""
 
-#: ardour_ui_ed.cc:113 rc_option_editor.cc:2245 rc_option_editor.cc:2257
+#: ardour_ui_ed.cc:143 rc_option_editor.cc:2841
 msgid "Control Surfaces"
 msgstr ""
 
-#: ardour_ui_ed.cc:114 rc_option_editor.cc:1921 rc_option_editor.cc:2264
+#: ardour_ui_ed.cc:144 rc_option_editor.cc:2847 rc_option_editor.cc:2853
+#: rc_option_editor.cc:2862 rc_option_editor.cc:2873 rc_option_editor.cc:2883
+#: rc_option_editor.cc:2948 rc_option_editor.cc:2969 rc_option_editor.cc:2985
+#: rc_option_editor.cc:2986 rc_option_editor.cc:2995 rc_option_editor.cc:3009
+#: rc_option_editor.cc:3012 rc_option_editor.cc:3020 rc_option_editor.cc:3028
 msgid "Plugins"
 msgstr "Entradas"
 
-#: ardour_ui_ed.cc:115 rc_option_editor.cc:2351
+#: ardour_ui_ed.cc:145 rc_option_editor.cc:3176
 msgid "Metering"
 msgstr ""
 
-#: ardour_ui_ed.cc:116
+#: ardour_ui_ed.cc:146
 msgid "Fall Off Rate"
 msgstr ""
 
-#: ardour_ui_ed.cc:117
+#: ardour_ui_ed.cc:147
 msgid "Hold Time"
 msgstr ""
 
-#: ardour_ui_ed.cc:118
+#: ardour_ui_ed.cc:148
 msgid "Denormal Handling"
 msgstr ""
 
-#: ardour_ui_ed.cc:122 route_time_axis.cc:1677
+#: ardour_ui_ed.cc:152 route_time_axis.cc:1683
 msgid "New..."
-msgstr ""
+msgstr "Novo..."
 
-#: ardour_ui_ed.cc:124
+#: ardour_ui_ed.cc:154
 msgid "Open..."
-msgstr ""
+msgstr "Abrir..."
 
-#: ardour_ui_ed.cc:125
+#: ardour_ui_ed.cc:155
 msgid "Recent..."
-msgstr ""
+msgstr "Recente..."
 
-#: ardour_ui_ed.cc:126 panner_editor.cc:29 playlist_selector.cc:64
+#: ardour_ui_ed.cc:156 panner_editor.cc:29 playlist_selector.cc:64
 msgid "Close"
 msgstr "Fechar"
 
-#: ardour_ui_ed.cc:129
+#: ardour_ui_ed.cc:159
 msgid "Add Track or Bus..."
-msgstr ""
+msgstr "Adicionar Trilha ou Bus"
 
-#: ardour_ui_ed.cc:134
-msgid "Open Video"
+#: ardour_ui_ed.cc:163
+msgid "Duplicate Tracks/Busses..."
+msgstr "Duplicar Trilha/Bus"
+
+#: ardour_ui_ed.cc:169
+msgid "Cancel Solo"
 msgstr ""
 
-#: ardour_ui_ed.cc:137
-msgid "Remove Video"
+#: ardour_ui_ed.cc:173
+msgid "Session|Scripting"
 msgstr ""
 
-#: ardour_ui_ed.cc:140
-msgid "Export To Video File"
+#: ardour_ui_ed.cc:176
+msgid "Add Lua Script..."
 msgstr ""
 
-#: ardour_ui_ed.cc:144
-msgid "Snapshot..."
+#: ardour_ui_ed.cc:180
+msgid "Remove Lua Script"
 msgstr ""
 
-#: ardour_ui_ed.cc:148
+#: ardour_ui_ed.cc:184
+msgid "Open Video..."
+msgstr "Abrir Vídeo"
+
+#: ardour_ui_ed.cc:187
+msgid "Remove Video"
+msgstr "Remover Vídeo"
+
+#: ardour_ui_ed.cc:190
+msgid "Export to Video File..."
+msgstr "Exportar Arquivo de Vídeo"
+
+#: ardour_ui_ed.cc:194
+msgid "Snapshot (& keep working on current version) ..."
+msgstr "Snapshot (& continuar trabalhando nesta versão) ..."
+
+#: ardour_ui_ed.cc:197
+msgid "Snapshot (& switch to new version) ..."
+msgstr "Snapshot (& mudar para nova versão) ..."
+
+#: ardour_ui_ed.cc:200
+msgid "Quick Snapshot (& keep working on current version) ..."
+msgstr "Snapshot rápido (& continuar trabalhando nesta versão) ..."
+
+#: ardour_ui_ed.cc:203
+msgid "Quick Snapshot (& switch to new version) ..."
+msgstr "Snapshot rápido (& mudar para nova versão) ..."
+
+#: ardour_ui_ed.cc:207
 msgid "Save As..."
-msgstr ""
+msgstr "Salvar como..."
 
-#: ardour_ui_ed.cc:152 editor_actions.cc:1771 editor_markers.cc:903
-#: editor_snapshots.cc:124 mixer_strip.cc:1518 route_time_axis.cc:1673
+#: ardour_ui_ed.cc:210 editor_actions.cc:1788 editor_markers.cc:908
+#: editor_snapshots.cc:136 mixer_strip.cc:1661 route_time_axis.cc:1679
 msgid "Rename..."
-msgstr ""
+msgstr "Renomear"
 
-#: ardour_ui_ed.cc:156
+#: ardour_ui_ed.cc:214
 msgid "Save Template..."
 msgstr "Salvar Esquema..."
 
-#: ardour_ui_ed.cc:159
+#: ardour_ui_ed.cc:217
 msgid "Metadata"
-msgstr ""
+msgstr "Metadados"
 
-#: ardour_ui_ed.cc:162
+#: ardour_ui_ed.cc:220
 msgid "Edit Metadata..."
-msgstr ""
+msgstr "Editar Metadados"
 
-#: ardour_ui_ed.cc:165
+#: ardour_ui_ed.cc:223
 msgid "Import Metadata..."
-msgstr ""
+msgstr "Importar Metadados"
 
-#: ardour_ui_ed.cc:168
-msgid "Export To Audio File(s)..."
-msgstr ""
+#: ardour_ui_ed.cc:226
+msgid "Export to Audio File(s)..."
+msgstr "Exportar Arquivo(s) de Áudio..."
 
-#: ardour_ui_ed.cc:171
+#: ardour_ui_ed.cc:229
 msgid "Stem export..."
 msgstr ""
 
-#: ardour_ui_ed.cc:174 editor_export_audio.cc:65 export_dialog.cc:129
-#: export_video_dialog.cc:84
+#: ardour_ui_ed.cc:232 editor_export_audio.cc:66
+#: export_channel_selector.cc:190 export_channel_selector.cc:578
+#: export_dialog.cc:136 export_video_dialog.cc:80
 msgid "Export"
 msgstr "Exportar"
 
-#: ardour_ui_ed.cc:177
+#: ardour_ui_ed.cc:235
 msgid "Clean-up Unused Sources..."
 msgstr ""
 
-#: ardour_ui_ed.cc:181
+#: ardour_ui_ed.cc:239
+msgid "Reset Peak Files"
+msgstr ""
+
+#: ardour_ui_ed.cc:243
 msgid "Flush Wastebasket"
 msgstr ""
 
-#: ardour_ui_ed.cc:188
+#: ardour_ui_ed.cc:251
 msgid "Quit"
 msgstr "Sair"
 
-#: ardour_ui_ed.cc:192
-msgid "Maximise Editor Space"
+#: ardour_ui_ed.cc:252 ardour_ui_ed.cc:259 ardour_ui_ed.cc:260
+#: ardour_ui_ed.cc:261 automation_time_axis.cc:545 editor_actions.cc:686
+#: editor_markers.cc:907 location_ui.cc:61 plugin_selector.cc:97
+#: route_time_axis.cc:864
+msgid "Hide"
+msgstr "Ocultar"
+
+#: ardour_ui_ed.cc:263 ardour_ui_ed.cc:264 ardour_ui_ed.cc:265
+msgid "Attach"
 msgstr ""
 
-#: ardour_ui_ed.cc:193
-msgid "Maximise Mixer Space"
+#: ardour_ui_ed.cc:275 ardour_ui_ed.cc:276 ardour_ui_ed.cc:277
+#: ardour_ui_ed.cc:283 ardour_ui_ed.cc:284 ardour_ui_ed.cc:285
+msgid "Change"
+msgstr "Alterar"
+
+#: ardour_ui_ed.cc:287
+msgid "Previous Tab"
 msgstr ""
 
-#: ardour_ui_ed.cc:194
-msgid "Show Toolbars"
+#: ardour_ui_ed.cc:288
+msgid "Next Tab"
 msgstr ""
 
-#: ardour_ui_ed.cc:198
-msgid "Show more UI preferences"
+#: ardour_ui_ed.cc:290
+msgid "Toggle Editor & Mixer"
+msgstr "Alternar entre Editor e Mesa"
+
+#: ardour_ui_ed.cc:294
+msgid "Maximise Editor Space"
+msgstr "Maximizar Espaço do Editor"
+
+#: ardour_ui_ed.cc:295
+msgid "Maximise Mixer Space"
+msgstr "Maximizar Espaço da Mesa"
+
+#: ardour_ui_ed.cc:298
+msgid "Toggle Mixer List"
 msgstr ""
 
-#: ardour_ui_ed.cc:200 mixer_ui.cc:1924 mixer_ui.cc:1930
-msgid "Window|Mixer"
+#: ardour_ui_ed.cc:301
+msgid "Toggle Monitor Section Visibility"
 msgstr ""
 
-#: ardour_ui_ed.cc:201
-msgid "Toggle Editor+Mixer"
+#: ardour_ui_ed.cc:305
+msgid "Show more UI preferences"
 msgstr ""
 
-#: ardour_ui_ed.cc:202 meterbridge.cc:218 meterbridge.cc:224
-msgid "Window|Meterbridge"
+#: ardour_ui_ed.cc:308
+msgid "Window|Scripting"
 msgstr ""
 
-#: ardour_ui_ed.cc:204
-msgid "Reattach All Tearoffs"
+#: ardour_ui_ed.cc:309 meterbridge.cc:214 meterbridge.cc:220
+msgid "Window|Meterbridge"
 msgstr ""
 
-#: ardour_ui_ed.cc:206 midi_tracer.cc:45
+#: ardour_ui_ed.cc:311 midi_tracer.cc:45
 msgid "MIDI Tracer"
 msgstr ""
 
-#: ardour_ui_ed.cc:208
+#: ardour_ui_ed.cc:314
 msgid "Chat"
-msgstr ""
+msgstr "Bate-papo (IRC)"
 
-#: ardour_ui_ed.cc:210
+#: ardour_ui_ed.cc:316
 msgid "Help|Manual"
-msgstr ""
+msgstr "Tutorial"
 
-#: ardour_ui_ed.cc:211
-msgid "Reference"
-msgstr ""
+#: ardour_ui_ed.cc:317
+msgid "Manual|Reference"
+msgstr "Manual de Referência"
 
-#: ardour_ui_ed.cc:212
-msgid "Report A Bug"
-msgstr ""
+#: ardour_ui_ed.cc:318
+msgid "Report a Bug"
+msgstr "Relatar uma Falha"
 
-#: ardour_ui_ed.cc:213
+#: ardour_ui_ed.cc:319
 msgid "Cheat Sheet"
 msgstr ""
 
-#: ardour_ui_ed.cc:214
+#: ardour_ui_ed.cc:320
 msgid "Ardour Website"
-msgstr ""
+msgstr "Ardour na Web"
 
-#: ardour_ui_ed.cc:215
+#: ardour_ui_ed.cc:321
 msgid "Ardour Development"
-msgstr ""
+msgstr "Desenvolvimento do Ardour"
 
-#: ardour_ui_ed.cc:216
+#: ardour_ui_ed.cc:322
 msgid "User Forums"
-msgstr ""
+msgstr "Fóruns de Usuários"
 
-#: ardour_ui_ed.cc:217
-msgid "How to report a bug"
-msgstr ""
+#: ardour_ui_ed.cc:323
+msgid "How to Report a Bug"
+msgstr "Como Relatar uma Falha"
 
-#: ardour_ui_ed.cc:219 plugin_ui.cc:419
+#: ardour_ui_ed.cc:325 luawindow.cc:100 luawindow.cc:654 plugin_ui.cc:419
 msgid "Save"
 msgstr "Salvar"
 
-#: ardour_ui_ed.cc:227 rc_option_editor.cc:1419 rc_option_editor.cc:1430
-#: rc_option_editor.cc:1441 rc_option_editor.cc:1450 rc_option_editor.cc:1463
-#: rc_option_editor.cc:1476 rc_option_editor.cc:1485 rc_option_editor.cc:1495
-#: rc_option_editor.cc:1497 rc_option_editor.cc:1506 rc_option_editor.cc:1522
-#: rc_option_editor.cc:1543 rc_option_editor.cc:1561 rc_option_editor.cc:1563
-#: rc_option_editor.cc:1579 rc_option_editor.cc:1582 rc_option_editor.cc:1584
-#: rc_option_editor.cc:1601 rc_option_editor.cc:1612
+#: ardour_ui_ed.cc:333 rc_option_editor.cc:1975 rc_option_editor.cc:1986
+#: rc_option_editor.cc:1997 rc_option_editor.cc:2008 rc_option_editor.cc:2017
+#: rc_option_editor.cc:2030 rc_option_editor.cc:2043 rc_option_editor.cc:2052
+#: rc_option_editor.cc:2062 rc_option_editor.cc:2079 rc_option_editor.cc:2186
 msgid "Transport"
-msgstr ""
+msgstr "Operação"
 
-#: ardour_ui_ed.cc:233
+#: ardour_ui_ed.cc:339 engine_dialog.cc:88
 msgid "Stop"
 msgstr "Parar"
 
-#: ardour_ui_ed.cc:236
+#: ardour_ui_ed.cc:342
 msgid "Roll"
 msgstr ""
 
-#: ardour_ui_ed.cc:240 ardour_ui_ed.cc:243
+#: ardour_ui_ed.cc:346 ardour_ui_ed.cc:349
 msgid "Start/Stop"
-msgstr ""
+msgstr "Iniciar/Parar"
 
-#: ardour_ui_ed.cc:246
+#: ardour_ui_ed.cc:352
 msgid "Start/Continue/Stop"
-msgstr ""
+msgstr "Iniciar/Continuar/Parar"
 
-#: ardour_ui_ed.cc:249
+#: ardour_ui_ed.cc:355
 msgid "Stop and Forget Capture"
 msgstr ""
 
-#: ardour_ui_ed.cc:259
-msgid "Transition To Roll"
+#: ardour_ui_ed.cc:365
+msgid "Transition to Roll"
 msgstr ""
 
-#: ardour_ui_ed.cc:263
-msgid "Transition To Reverse"
+#: ardour_ui_ed.cc:369
+msgid "Transition to Reverse"
 msgstr ""
 
-#: ardour_ui_ed.cc:267
+#: ardour_ui_ed.cc:373
 msgid "Play Loop Range"
 msgstr ""
 
-#: ardour_ui_ed.cc:270
+#: ardour_ui_ed.cc:376
 msgid "Play Selection"
 msgstr ""
 
-#: ardour_ui_ed.cc:273
+#: ardour_ui_ed.cc:379
 msgid "Play Selection w/Preroll"
 msgstr ""
 
-#: ardour_ui_ed.cc:277
+#: ardour_ui_ed.cc:383
 msgid "Enable Record"
-msgstr ""
+msgstr "Armar para Gravação"
 
-#: ardour_ui_ed.cc:280 ardour_ui_ed.cc:284
+#: ardour_ui_ed.cc:386 ardour_ui_ed.cc:390
 msgid "Start Recording"
-msgstr ""
+msgstr "Iniciar Gravação"
 
-#: ardour_ui_ed.cc:288
+#: ardour_ui_ed.cc:394
 msgid "Rewind"
-msgstr ""
+msgstr "Rebobinar"
 
-#: ardour_ui_ed.cc:291
+#: ardour_ui_ed.cc:397
 msgid "Rewind (Slow)"
-msgstr ""
+msgstr "Rebobinar (Lento)"
 
-#: ardour_ui_ed.cc:294
+#: ardour_ui_ed.cc:400
 msgid "Rewind (Fast)"
-msgstr ""
+msgstr "Rebobinar (Rápido)"
 
-#: ardour_ui_ed.cc:297
+#: ardour_ui_ed.cc:403
 msgid "Forward"
-msgstr ""
+msgstr "Avançar"
 
-#: ardour_ui_ed.cc:300
+#: ardour_ui_ed.cc:406
 msgid "Forward (Slow)"
-msgstr ""
+msgstr "Avançar (Lento)"
 
-#: ardour_ui_ed.cc:303
+#: ardour_ui_ed.cc:409
 msgid "Forward (Fast)"
-msgstr ""
+msgstr "Avançar (Rápido)"
 
-#: ardour_ui_ed.cc:306
+#: ardour_ui_ed.cc:412
 msgid "Go to Zero"
-msgstr ""
+msgstr "Ir para o Ponto Zero"
 
-#: ardour_ui_ed.cc:309 ardour_ui_ed.cc:312
+#: ardour_ui_ed.cc:415 ardour_ui_ed.cc:418
 msgid "Go to Start"
-msgstr ""
+msgstr "Ir para o Começo"
 
-#: ardour_ui_ed.cc:315
+#: ardour_ui_ed.cc:421
 msgid "Go to End"
-msgstr ""
+msgstr "Ir para o Fim"
 
-#: ardour_ui_ed.cc:318
+#: ardour_ui_ed.cc:424
 msgid "Go to Wall Clock"
 msgstr ""
 
-#: ardour_ui_ed.cc:323 ardour_ui_ed.cc:326
+#: ardour_ui_ed.cc:429 ardour_ui_ed.cc:432
 msgid "Numpad Decimal"
 msgstr ""
 
-#: ardour_ui_ed.cc:329
+#: ardour_ui_ed.cc:435
 msgid "Numpad 0"
 msgstr ""
 
-#: ardour_ui_ed.cc:332
+#: ardour_ui_ed.cc:438
 msgid "Numpad 1"
 msgstr ""
 
-#: ardour_ui_ed.cc:335
+#: ardour_ui_ed.cc:441
 msgid "Numpad 2"
 msgstr ""
 
-#: ardour_ui_ed.cc:338
+#: ardour_ui_ed.cc:444
 msgid "Numpad 3"
 msgstr ""
 
-#: ardour_ui_ed.cc:341
+#: ardour_ui_ed.cc:447
 msgid "Numpad 4"
 msgstr ""
 
-#: ardour_ui_ed.cc:344
+#: ardour_ui_ed.cc:450
 msgid "Numpad 5"
 msgstr ""
 
-#: ardour_ui_ed.cc:347
+#: ardour_ui_ed.cc:453
 msgid "Numpad 6"
 msgstr ""
 
-#: ardour_ui_ed.cc:350
+#: ardour_ui_ed.cc:456
 msgid "Numpad 7"
 msgstr ""
 
-#: ardour_ui_ed.cc:353
+#: ardour_ui_ed.cc:459
 msgid "Numpad 8"
 msgstr ""
 
-#: ardour_ui_ed.cc:356
+#: ardour_ui_ed.cc:462
 msgid "Numpad 9"
 msgstr ""
 
-#: ardour_ui_ed.cc:360
+#: ardour_ui_ed.cc:466
 msgid "Focus On Clock"
 msgstr ""
 
-#: ardour_ui_ed.cc:364 ardour_ui_ed.cc:373 audio_clock.cc:2091 editor.cc:258
-#: editor_actions.cc:569 editor_actions.cc:578 export_timespan_selector.cc:88
+#: ardour_ui_ed.cc:470 ardour_ui_ed.cc:479 audio_clock.cc:2122 editor.cc:321
+#: editor_actions.cc:610 editor_actions.cc:619 export_timespan_selector.cc:95
 #: session_option_editor.cc:41 session_option_editor.cc:61
 #: session_option_editor.cc:80 session_option_editor.cc:96
 #: session_option_editor.cc:109 session_option_editor.cc:122
 #: session_option_editor.cc:124 session_option_editor.cc:126
 msgid "Timecode"
-msgstr ""
+msgstr "Tempo"
 
-#: ardour_ui_ed.cc:366 ardour_ui_ed.cc:375 editor_actions.cc:567
+#: ardour_ui_ed.cc:472 ardour_ui_ed.cc:481 editor_actions.cc:608
 msgid "Bars & Beats"
-msgstr ""
+msgstr "Compasso & Batimentos"
 
-#: ardour_ui_ed.cc:368 ardour_ui_ed.cc:377
+#: ardour_ui_ed.cc:474 ardour_ui_ed.cc:483
 msgid "Minutes & Seconds"
-msgstr ""
+msgstr "Minutos & Segundos"
 
-#: ardour_ui_ed.cc:370 ardour_ui_ed.cc:379 audio_clock.cc:2095 editor.cc:259
-#: editor_actions.cc:568
+#: ardour_ui_ed.cc:476 ardour_ui_ed.cc:485 audio_clock.cc:2125 editor.cc:322
+#: editor_actions.cc:609
 msgid "Samples"
-msgstr ""
+msgstr "Amostras"
 
-#: ardour_ui_ed.cc:382
+#: ardour_ui_ed.cc:488
 msgid "Punch In"
 msgstr ""
 
-#: ardour_ui_ed.cc:383 mixer_strip.cc:1819 mixer_strip.cc:1843
-#: mixer_strip.cc:2007 route_ui.cc:162 time_info_box.cc:116
+#: ardour_ui_ed.cc:489 mixer_strip.cc:2000 mixer_strip.cc:2201 route_ui.cc:187
+#: time_info_box.cc:110
 msgid "In"
 msgstr "Entrada"
 
-#: ardour_ui_ed.cc:386
+#: ardour_ui_ed.cc:492
 msgid "Punch Out"
 msgstr ""
 
-#: ardour_ui_ed.cc:387 mixer_strip.cc:1831 time_info_box.cc:117
+#: ardour_ui_ed.cc:493 mixer_strip.cc:2012 time_info_box.cc:111
 msgid "Out"
-msgstr "Saídas"
+msgstr "Saída"
 
-#: ardour_ui_ed.cc:390
+#: ardour_ui_ed.cc:496
 msgid "Punch In/Out"
 msgstr ""
 
-#: ardour_ui_ed.cc:391
+#: ardour_ui_ed.cc:497
 msgid "In/Out"
-msgstr ""
+msgstr "Entrada/Saída"
 
-#: ardour_ui_ed.cc:394 rc_option_editor.cc:1376
+#: ardour_ui_ed.cc:500 rc_option_editor.cc:1941
 msgid "Click"
 msgstr "Metrônomo"
 
-#: ardour_ui_ed.cc:397
+#: ardour_ui_ed.cc:503
 msgid "Auto Input"
-msgstr ""
+msgstr "Input Automático"
 
-#: ardour_ui_ed.cc:400
+#: ardour_ui_ed.cc:506
 msgid "Auto Play"
-msgstr ""
+msgstr "Reprodução Automática"
 
-#: ardour_ui_ed.cc:411
+#: ardour_ui_ed.cc:517
 msgid "Sync Startup to Video"
 msgstr ""
 
-#: ardour_ui_ed.cc:413
+#: ardour_ui_ed.cc:519
 msgid "Time Master"
 msgstr ""
 
-#: ardour_ui_ed.cc:420
+#: ardour_ui_ed.cc:521
+msgid "Use External Positional Sync Source"
+msgstr ""
+
+#: ardour_ui_ed.cc:526
 msgid "Toggle Record Enable Track %1"
 msgstr ""
 
-#: ardour_ui_ed.cc:427
+#: ardour_ui_ed.cc:533
 msgid "Percentage"
 msgstr "Percentual"
 
-#: ardour_ui_ed.cc:428 shuttle_control.cc:178
+#: ardour_ui_ed.cc:534 shuttle_control.cc:205
 msgid "Semitones"
 msgstr "Semitons"
 
-#: ardour_ui_ed.cc:432
+#: ardour_ui_ed.cc:538
 msgid "Send MTC"
 msgstr "Enviar MTC"
 
-#: ardour_ui_ed.cc:434
+#: ardour_ui_ed.cc:540
 msgid "Send MMC"
 msgstr "Enviar MMC"
 
-#: ardour_ui_ed.cc:436
+#: ardour_ui_ed.cc:542
 msgid "Use MMC"
 msgstr ""
 
-#: ardour_ui_ed.cc:438 rc_option_editor.cc:2097
+#: ardour_ui_ed.cc:544 rc_option_editor.cc:2730
 msgid "Send MIDI Clock"
 msgstr ""
 
-#: ardour_ui_ed.cc:440
+#: ardour_ui_ed.cc:546
 msgid "Send MIDI Feedback"
 msgstr ""
 
-#: ardour_ui_ed.cc:446
+#: ardour_ui_ed.cc:552
 msgid "Panic"
-msgstr ""
+msgstr "Pânico"
 
-#: ardour_ui_ed.cc:534
+#: ardour_ui_ed.cc:618
 msgid "Wall Clock"
-msgstr ""
+msgstr "Relógio"
 
-#: ardour_ui_ed.cc:536
+#: ardour_ui_ed.cc:620
 msgid "Disk Space"
-msgstr ""
+msgstr "Espaço no Disco"
 
-#: ardour_ui_ed.cc:537
+#: ardour_ui_ed.cc:621
 msgid "DSP"
 msgstr ""
 
-#: ardour_ui_ed.cc:538
+#: ardour_ui_ed.cc:622
+msgid "X-run"
+msgstr ""
+
+#: ardour_ui_ed.cc:623
+msgid "Active Peak-file Work"
+msgstr ""
+
+#: ardour_ui_ed.cc:624
 msgid "Buffers"
 msgstr ""
 
-#: ardour_ui_ed.cc:540
+#: ardour_ui_ed.cc:626
 msgid "Timecode Format"
 msgstr ""
 
-#: ardour_ui_ed.cc:541
+#: ardour_ui_ed.cc:627
 msgid "File Format"
 msgstr ""
 
-#: ardour_ui_options.cc:63
+#: ardour_ui_options.cc:55
 msgid ""
 "It is not possible to use JACK as the the sync source\n"
 "when the pull up/down setting is non-zero."
 msgstr ""
 
-#: ardour_ui_options.cc:317
+#: ardour_ui_options.cc:309
 msgid "Internal"
-msgstr ""
+msgstr "Interno"
 
-#: ardour_ui_options.cc:498
+#: ardour_ui_options.cc:518
 msgid "Enable/Disable external positional sync"
 msgstr ""
 
-#: ardour_ui_options.cc:500
+#: ardour_ui_options.cc:520
 msgid "Sync to JACK is not possible: video pull up/down is set"
 msgstr ""
 
-#: audio_clock.cc:1047 audio_clock.cc:1066
+#: audio_clock.cc:1057 audio_clock.cc:1076
 msgid "--pending--"
 msgstr ""
 
-#: audio_clock.cc:1118
+#: audio_clock.cc:1128
 msgid "SR"
 msgstr ""
 
-#: audio_clock.cc:1124 audio_clock.cc:1128
+#: audio_clock.cc:1134 audio_clock.cc:1138
 msgid "Pull"
 msgstr ""
 
-#: audio_clock.cc:1126
+#: audio_clock.cc:1136
 #, c-format
 msgid "%+.4f%%"
 msgstr ""
 
-#: audio_clock.cc:1282 editor.cc:260 editor_actions.cc:139
-#: editor_actions.cc:561
+#: audio_clock.cc:1292 editor.cc:323 editor_actions.cc:142
+#: editor_actions.cc:602
 msgid "Tempo"
-msgstr "Tempo"
+msgstr "BPM"
 
-#: audio_clock.cc:1286 editor.cc:261 editor_actions.cc:562
+#: audio_clock.cc:1296 editor.cc:324 editor_actions.cc:603
 msgid "Meter"
-msgstr "VU (medidor volumétrico)"
-
-#: audio_clock.cc:1864 audio_streamview.cc:115 editor_actions.cc:1089
-#: session_metadata_dialog.cc:452 session_metadata_dialog.cc:500
-#: session_metadata_dialog.cc:556 session_metadata_dialog.cc:845
-#: streamview.cc:470
+msgstr "VU"
+
+#: audio_clock.cc:1878 audio_streamview.cc:117 editor_actions.cc:1092
+#: luainstance.cc:967 luainstance.cc:1593 plugin_pin_dialog.cc:859
+#: plugin_selector.cc:995 plugin_selector.cc:1016
+#: session_metadata_dialog.cc:455 session_metadata_dialog.cc:503
+#: session_metadata_dialog.cc:559 session_metadata_dialog.cc:848
+#: streamview.cc:474
 msgid "programming error: %1"
 msgstr ""
 
-#: audio_clock.cc:1997 audio_clock.cc:2025
+#: audio_clock.cc:2011 audio_clock.cc:2039
 msgid "programming error: %1 %2"
 msgstr ""
 
-#: audio_clock.cc:2093 editor.cc:257 export_timespan_selector.cc:98
+#: audio_clock.cc:2123 editor.cc:320 export_timespan_selector.cc:105
 msgid "Bars:Beats"
 msgstr "Compassos:Batimentos"
 
-#: audio_clock.cc:2094 export_timespan_selector.cc:93
+#: audio_clock.cc:2124 export_timespan_selector.cc:100
 msgid "Minutes:Seconds"
 msgstr "Minutos:Segundos"
 
-#: audio_clock.cc:2099
-msgid "Set From Playhead"
+#: audio_clock.cc:2129
+msgid "Set from Playhead"
 msgstr ""
 
-#: audio_clock.cc:2100
+#: audio_clock.cc:2130
 msgid "Locate to This Time"
 msgstr ""
 
-#: audio_region_editor.cc:64 control_point_dialog.cc:49 rhythm_ferret.cc:124
-#: rhythm_ferret.cc:129 rhythm_ferret.cc:134
+#: audio_clock.cc:2133
+msgid "Copy to clipboard"
+msgstr "Copiar para Área de Transferência"
+
+#: audio_region_editor.cc:60 control_point_dialog.cc:49 rhythm_ferret.cc:137
+#: rhythm_ferret.cc:154
 msgid "dB"
 msgstr ""
 
-#: audio_region_editor.cc:67
+#: audio_region_editor.cc:63
 msgid "Region gain:"
 msgstr ""
 
-#: audio_region_editor.cc:77 export_format_dialog.cc:43
+#: audio_region_editor.cc:73 export_format_dialog.cc:49 export_report.cc:772
+#: export_report.cc:1185 fft_graph.cc:497 normalize_dialog.cc:49
+#: strip_silence_dialog.cc:67
 msgid "dBFS"
 msgstr ""
 
-#: audio_region_editor.cc:80
+#: audio_region_editor.cc:76
 msgid "Peak amplitude:"
 msgstr ""
 
-#: audio_region_editor.cc:91
+#: audio_region_editor.cc:87
 msgid "Calculating..."
-msgstr ""
+msgstr "Calculando..."
 
-#: audio_region_view.cc:1243
+#: audio_region_view.cc:1385
 msgid "add gain control point"
 msgstr ""
 
-#: automation_controller.cc:286 automation_controller.cc:302
+#: automation_controller.cc:304 automation_controller.cc:320
 msgid "Select Note..."
 msgstr ""
 
-#: automation_controller.cc:293
+#: automation_controller.cc:311
 msgid "Halve"
 msgstr ""
 
-#: automation_controller.cc:296
+#: automation_controller.cc:314
 msgid "Double"
 msgstr ""
 
-#: automation_controller.cc:307
-msgid "Set to %1 beat(s)"
-msgstr ""
+#: automation_controller.cc:325
+msgid "Set to %1 beat"
+msgid_plural "Set to %1 beats"
+msgstr[0] ""
+msgstr[1] ""
 
-#: automation_line.cc:286 automation_line.cc:462
+#: automation_line.cc:292 editor_drag.cc:4387
 msgid "automation event move"
 msgstr "mover evento de automação"
 
-#: automation_line.cc:488 automation_line.cc:508
-msgid "automation range move"
-msgstr ""
-
-#: automation_line.cc:880 region_gain_line.cc:72
+#: automation_line.cc:888 region_gain_line.cc:75
 msgid "remove control point"
 msgstr "Remover ponto de controlo"
 
-#: automation_line.cc:1003
+#: automation_line.cc:1013
 msgid "Ignoring illegal points on AutomationLine \"%1\""
 msgstr ""
 
-#: automation_region_view.cc:190 automation_time_axis.cc:644
+#: automation_region_view.cc:193 automation_time_axis.cc:649
 msgid "add automation event"
 msgstr ""
 
-#: automation_streamview.cc:95
+#: automation_streamview.cc:94
 msgid "unable to display automation region for control without list"
 msgstr ""
 
@@ -2205,63 +2622,59 @@ msgstr "estado do automação"
 msgid "hide track"
 msgstr "ocultar esta trilha"
 
-#: automation_time_axis.cc:308 automation_time_axis.cc:360
-#: automation_time_axis.cc:554 gain_meter.cc:220 generic_pluginui.cc:523
-#: generic_pluginui.cc:817 panner_ui.cc:151
+#: automation_time_axis.cc:310 automation_time_axis.cc:362
+#: automation_time_axis.cc:556 gain_meter.cc:230 generic_pluginui.cc:590
+#: generic_pluginui.cc:934 panner_ui.cc:151
 msgid "Automation|Manual"
 msgstr ""
 
-#: automation_time_axis.cc:310 automation_time_axis.cc:371
-#: automation_time_axis.cc:559 editor.cc:1904 editor.cc:1981
-#: editor_actions.cc:122 editor_actions.cc:1920 gain_meter.cc:223
-#: generic_pluginui.cc:99 generic_pluginui.cc:526 generic_pluginui.cc:819
-#: midi_time_axis.cc:1606 midi_time_axis.cc:1609 midi_time_axis.cc:1612
+#: automation_time_axis.cc:312 automation_time_axis.cc:373
+#: automation_time_axis.cc:561 editor.cc:2033 editor.cc:2111
+#: editor_actions.cc:125 editor_actions.cc:1937 gain_meter.cc:232
+#: generic_pluginui.cc:100 generic_pluginui.cc:593 generic_pluginui.cc:936
+#: midi_time_axis.cc:1610 midi_time_axis.cc:1613 midi_time_axis.cc:1616
 #: panner_ui.cc:154
 msgid "Play"
 msgstr "Reproduzir"
 
-#: automation_time_axis.cc:312 automation_time_axis.cc:382
-#: automation_time_axis.cc:564 gain_meter.cc:226 generic_pluginui.cc:101
-#: generic_pluginui.cc:529 generic_pluginui.cc:821 panner_ui.cc:157
+#: automation_time_axis.cc:314 automation_time_axis.cc:384
+#: automation_time_axis.cc:566 gain_meter.cc:234 generic_pluginui.cc:102
+#: generic_pluginui.cc:596 generic_pluginui.cc:938 panner_ui.cc:157
 msgid "Write"
 msgstr ""
 
-#: automation_time_axis.cc:314 automation_time_axis.cc:393
-#: automation_time_axis.cc:569 gain_meter.cc:229 generic_pluginui.cc:103
-#: generic_pluginui.cc:532 generic_pluginui.cc:823 panner_ui.cc:160
+#: automation_time_axis.cc:316 automation_time_axis.cc:395
+#: automation_time_axis.cc:571 gain_meter.cc:236 generic_pluginui.cc:104
+#: generic_pluginui.cc:599 generic_pluginui.cc:940 panner_ui.cc:160
 msgid "Touch"
 msgstr ""
 
-#: automation_time_axis.cc:404 generic_pluginui.cc:535 meter_patterns.cc:112
+#: automation_time_axis.cc:406 generic_pluginui.cc:602 meter_patterns.cc:118
 msgid "???"
 msgstr ""
 
-#: automation_time_axis.cc:445
+#: automation_time_axis.cc:447
 msgid "clear automation"
 msgstr "limpar automação"
 
-#: automation_time_axis.cc:543 editor_actions.cc:645 editor_markers.cc:902
-#: location_ui.cc:57 plugin_selector.cc:86 route_time_axis.cc:854
-msgid "Hide"
-msgstr "Ocultar"
-
-#: automation_time_axis.cc:545
+#: automation_time_axis.cc:547 rc_option_editor.cc:2919
+#: rc_option_editor.cc:2924 rc_option_editor.cc:2974 rc_option_editor.cc:2979
 msgid "Clear"
 msgstr "Limpar"
 
-#: automation_time_axis.cc:576
+#: automation_time_axis.cc:578
 msgid "State"
 msgstr "Estado"
 
-#: automation_time_axis.cc:592
+#: automation_time_axis.cc:594
 msgid "Discrete"
 msgstr ""
 
-#: automation_time_axis.cc:598 export_format_dialog.cc:485
+#: automation_time_axis.cc:600 export_format_dialog.cc:552
 msgid "Linear"
 msgstr "Linear"
 
-#: automation_time_axis.cc:604 rhythm_ferret.cc:109 shuttle_control.cc:197
+#: automation_time_axis.cc:606 rhythm_ferret.cc:118 shuttle_control.cc:224
 msgid "Mode"
 msgstr "Modo"
 
@@ -2277,35 +2690,38 @@ msgstr ""
 msgid "Direction:"
 msgstr ""
 
-#: bundle_manager.cc:206 bundle_manager.cc:210 engine_dialog.cc:662
-#: mixer_strip.cc:162 mixer_strip.cc:367 mixer_strip.cc:2240
-#: rc_option_editor.cc:2326
+#: bundle_manager.cc:206 bundle_manager.cc:210 engine_dialog.cc:976
+#: mixer_strip.cc:175 mixer_strip.cc:392 mixer_strip.cc:2459
+#: rc_option_editor.cc:3142
 msgid "Input"
-msgstr ""
+msgstr "Entrada"
 
 #: bundle_manager.cc:207 bundle_manager.cc:212 bundle_manager.cc:246
-#: engine_dialog.cc:664 mixer_strip.cc:166 mixer_strip.cc:371
-#: mixer_strip.cc:2243 rc_option_editor.cc:2330
+#: engine_dialog.cc:978 mixer_strip.cc:179 mixer_strip.cc:396
+#: mixer_strip.cc:2462 monitor_section.cc:296 monitor_section.cc:300
+#: rc_option_editor.cc:3146
 msgid "Output"
-msgstr ""
+msgstr "Saída"
 
-#: bundle_manager.cc:265 editor.cc:1945 editor_actions.cc:94
-#: editor_actions.cc:104 rc_option_editor.cc:1087 rc_option_editor.cc:1094
+#: bundle_manager.cc:265 editor.cc:2075 editor_actions.cc:97
+#: editor_actions.cc:107 lua_script_manager.cc:33 rc_option_editor.cc:2931
+#: rc_option_editor.cc:2945
 msgid "Edit"
 msgstr "Editar"
 
-#: bundle_manager.cc:266 editor.cc:5902 editor.cc:5930 editor_actions.cc:338
-#: editor_actions.cc:339 editor_actions.cc:405 plugin_ui.cc:420
-#: processor_box.cc:2458 route_time_axis.cc:859
+#: bundle_manager.cc:266 editor.cc:5962 editor.cc:5992 editor_actions.cc:360
+#: editor_actions.cc:361 luawindow.cc:101 plugin_ui.cc:420
+#: processor_box.cc:3681 processor_box.cc:3683
 msgid "Delete"
 msgstr "Apagar"
 
-#: bundle_manager.cc:272 bundle_manager.cc:439 editor_route_groups.cc:97
-#: editor_routes.cc:206 midi_list_editor.cc:107 session_metadata_dialog.cc:646
+#: bundle_manager.cc:272 bundle_manager.cc:439 editor_route_groups.cc:98
+#: editor_routes.cc:233 lua_script_manager.cc:42 lua_script_manager.cc:76
+#: midi_list_editor.cc:107 session_metadata_dialog.cc:649
 msgid "Name"
-msgstr ""
+msgstr "Nome"
 
-#: bundle_manager.cc:283
+#: bundle_manager.cc:283 luawindow.cc:566
 msgid "New"
 msgstr "Novo"
 
@@ -2319,6 +2735,39 @@ msgstr ""
 
 #: bundle_manager.cc:425
 msgid "Rename Channel"
+msgstr "Renomear Canal"
+
+#: color_theme_manager.cc:58
+msgid "Restore Defaults"
+msgstr "Restaurar padrão"
+
+#: color_theme_manager.cc:62
+msgid "Color Theme"
+msgstr ""
+
+#: color_theme_manager.cc:118
+msgid "Object"
+msgstr "Objeto"
+
+#: color_theme_manager.cc:121 route_group_dialog.cc:53
+#: route_group_dialog.cc:81
+msgid "Color"
+msgstr "Cor"
+
+#: color_theme_manager.cc:143
+msgid "Items"
+msgstr "Itens"
+
+#: color_theme_manager.cc:144
+msgid "Palette"
+msgstr "Paleta"
+
+#: color_theme_manager.cc:145
+msgid "Transparency"
+msgstr "Transparência"
+
+#: color_theme_manager.cc:467
+msgid "Color Palette"
 msgstr ""
 
 #: configinfo.cc:28
@@ -2333,6 +2782,42 @@ msgstr ""
 msgid "Value"
 msgstr "Valor"
 
+#: control_slave_ui.cc:50 mixer_ui.cc:254
+msgid "Control Masters"
+msgstr ""
+
+#: control_slave_ui.cc:54
+msgid "-vca-"
+msgstr ""
+
+#: control_slave_ui.cc:211
+msgid "Unassign All"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:35
+msgid "Duplicate Tracks & Busses"
+msgstr "Duplicar Trilhas e Bus"
+
+#: duplicate_routes_dialog.cc:36
+msgid "Copy playlists"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:37
+msgid "Create new (empty) playlists"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:38
+msgid "Share playlists"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:41
+msgid "Duplicate each track/bus this number of times:"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:176
+msgid "1 or more tracks/busses could not be duplicated"
+msgstr ""
+
 #: edit_note_dialog.cc:42
 msgid "Note"
 msgstr ""
@@ -2360,7 +2845,7 @@ msgstr ""
 #: edit_note_dialog.cc:58 midi_list_editor.cc:105 patch_change_dialog.cc:90
 #: step_entry.cc:394
 msgid "Channel"
-msgstr ""
+msgstr "Canal"
 
 #: edit_note_dialog.cc:68
 msgid "Pitch"
@@ -2370,2061 +2855,2156 @@ msgstr ""
 msgid "Velocity"
 msgstr ""
 
-#: edit_note_dialog.cc:88 patch_change_dialog.cc:66
+#: edit_note_dialog.cc:88 export_report.cc:246 export_report.cc:688
+#: patch_change_dialog.cc:66
 msgid "Time"
-msgstr ""
+msgstr "Tempo"
 
-#: edit_note_dialog.cc:98 editor_regions.cc:115
-#: export_timespan_selector.cc:378 export_timespan_selector.cc:440
-#: location_ui.cc:320 midi_list_editor.cc:115 time_info_box.cc:108
+#: edit_note_dialog.cc:99 editor_regions.cc:162
+#: export_timespan_selector.cc:415 export_timespan_selector.cc:506
+#: location_ui.cc:322 midi_list_editor.cc:115 time_info_box.cc:102
 msgid "Length"
-msgstr ""
+msgstr "Duração"
 
-#: edit_note_dialog.cc:165
+#: edit_note_dialog.cc:166
 msgid "edit note"
-msgstr ""
+msgstr "editar nota"
 
-#: editor.cc:147
+#: editor.cc:160
 msgid "CD Frames"
 msgstr "Quadros de CD"
 
-#: editor.cc:148
+#: editor.cc:161
 msgid "TC Frames"
 msgstr ""
 
-#: editor.cc:149
+#: editor.cc:162
 msgid "TC Seconds"
 msgstr ""
 
-#: editor.cc:150
+#: editor.cc:163
 msgid "TC Minutes"
 msgstr ""
 
-#: editor.cc:151
+#: editor.cc:164
 msgid "Seconds"
 msgstr "Segundos"
 
-#: editor.cc:152
+#: editor.cc:165
 msgid "Minutes"
 msgstr "Minutos"
 
-#: editor.cc:153 quantize_dialog.cc:37 quantize_dialog.cc:141
+#: editor.cc:166 quantize_dialog.cc:37
 msgid "Beats/128"
-msgstr ""
+msgstr "Batimento128"
 
-#: editor.cc:154 quantize_dialog.cc:38 quantize_dialog.cc:143
+#: editor.cc:167 quantize_dialog.cc:38
 msgid "Beats/64"
-msgstr ""
+msgstr "Batimento/64"
 
 # ## msgstr "Saídas Principais"
-#: editor.cc:155 quantize_dialog.cc:39 quantize_dialog.cc:145
+#: editor.cc:168 quantize_dialog.cc:39
 msgid "Beats/32"
-msgstr "Batimentos/32"
+msgstr "Batimento/32"
 
-#: editor.cc:156
+#: editor.cc:169 quantize_dialog.cc:40
 msgid "Beats/28"
 msgstr ""
 
-#: editor.cc:157
+#: editor.cc:170 quantize_dialog.cc:41
 msgid "Beats/24"
-msgstr ""
+msgstr "Batimento/24"
 
-#: editor.cc:158
+#: editor.cc:171 quantize_dialog.cc:42
 msgid "Beats/20"
-msgstr ""
+msgstr "Batimento/20"
 
-#: editor.cc:159 quantize_dialog.cc:40 quantize_dialog.cc:147
+#: editor.cc:172 quantize_dialog.cc:43
 msgid "Beats/16"
-msgstr "Batimentos/16"
+msgstr "Batimento/16"
 
-#: editor.cc:160
+#: editor.cc:173 quantize_dialog.cc:44
 msgid "Beats/14"
-msgstr ""
+msgstr "Batimento/14"
 
-#: editor.cc:161
+#: editor.cc:174 quantize_dialog.cc:45
 msgid "Beats/12"
-msgstr ""
+msgstr "Batimento/12"
 
-#: editor.cc:162
+#: editor.cc:175 quantize_dialog.cc:46
 msgid "Beats/10"
-msgstr ""
+msgstr "Batimento/10"
 
-#: editor.cc:163 quantize_dialog.cc:41 quantize_dialog.cc:149
+#: editor.cc:176 quantize_dialog.cc:47
 msgid "Beats/8"
-msgstr "Batimentos/8"
+msgstr "Batimento/8"
 
-#: editor.cc:164
+#: editor.cc:177 quantize_dialog.cc:48
 msgid "Beats/7"
-msgstr ""
+msgstr "Batimento/7"
 
-#: editor.cc:165
+#: editor.cc:178 quantize_dialog.cc:49
 msgid "Beats/6"
-msgstr ""
+msgstr "Batimento/6"
 
-#: editor.cc:166
+#: editor.cc:179 quantize_dialog.cc:50
 msgid "Beats/5"
-msgstr ""
+msgstr "Batimento/5"
 
-#: editor.cc:167 quantize_dialog.cc:42 quantize_dialog.cc:151
+#: editor.cc:180 quantize_dialog.cc:51
 msgid "Beats/4"
-msgstr "Batimentos/4"
+msgstr "Batimento/4"
 
-#: editor.cc:168 quantize_dialog.cc:43 quantize_dialog.cc:153
+#: editor.cc:181 quantize_dialog.cc:52
 msgid "Beats/3"
-msgstr "Batimentos/3"
+msgstr "Batimento/3"
 
-#: editor.cc:169 quantize_dialog.cc:44 quantize_dialog.cc:155
+#: editor.cc:182 quantize_dialog.cc:53
 msgid "Beats/2"
-msgstr ""
+msgstr "Batimento/2"
 
-#: editor.cc:170 quantize_dialog.cc:45 quantize_dialog.cc:157
+#: editor.cc:183 quantize_dialog.cc:54
 msgid "Beats"
 msgstr "Batimentos"
 
-#: editor.cc:171
+#: editor.cc:184
 msgid "Bars"
 msgstr "Compassos"
 
-#: editor.cc:172
+#: editor.cc:185
 msgid "Marks"
 msgstr "Marcas"
 
-#: editor.cc:173
+#: editor.cc:186
 msgid "Region starts"
 msgstr "Começo de regiões"
 
-#: editor.cc:174
+#: editor.cc:187
 msgid "Region ends"
 msgstr "Fim de regiões"
 
-#: editor.cc:175
+#: editor.cc:188
 msgid "Region syncs"
 msgstr "Sincronizações de região"
 
-#: editor.cc:176
+#: editor.cc:189
 msgid "Region bounds"
 msgstr "Divisas de região"
 
-#: editor.cc:181 editor_actions.cc:510
+#: editor.cc:194 editor_actions.cc:551
 msgid "No Grid"
-msgstr ""
+msgstr "Sem Grade"
 
-#: editor.cc:182 editor_actions.cc:511
+#: editor.cc:195 editor_actions.cc:552
 msgid "Grid"
-msgstr ""
+msgstr "Grade"
 
-#: editor.cc:183 editor_actions.cc:512
+#: editor.cc:196 editor_actions.cc:553
 msgid "Magnetic"
 msgstr "Magnético"
 
-#: editor.cc:188 editor.cc:206 editor_actions.cc:121 editor_actions.cc:493
+#: editor.cc:201 editor.cc:219 editor_actions.cc:124 editor_actions.cc:534
 msgid "Playhead"
 msgstr "Início"
 
-#: editor.cc:189 editor_actions.cc:495
+#: editor.cc:202 editor_actions.cc:536
 msgid "Marker"
 msgstr "Marca"
 
-#: editor.cc:190 editor.cc:207 editor_actions.cc:494
+#: editor.cc:203 editor.cc:220 editor_actions.cc:535
 msgid "Mouse"
 msgstr ""
 
-#: editor.cc:195 editor_actions.cc:502
+#: editor.cc:208 editor_actions.cc:543
 msgid "Slide"
 msgstr "Deslizar"
 
-#: editor.cc:196
+#: editor.cc:209
 msgid "Splice"
 msgstr "Reunir"
 
-#: editor.cc:197 editor_actions.cc:501
+#: editor.cc:210 editor_actions.cc:542
 msgid "Ripple"
 msgstr ""
 
-#: editor.cc:198 editor_actions.cc:157 editor_actions.cc:503
-#: editor_actions.cc:1789 editor_markers.cc:905 editor_rulers.cc:260
-#: location_ui.cc:58 mixer_strip.cc:195 mixer_strip.cc:2028
+#: editor.cc:211 editor_actions.cc:1806 editor_markers.cc:910
+#: editor_rulers.cc:259 location_ui.cc:62
 msgid "Lock"
 msgstr "Trancar"
 
-#: editor.cc:203 mono_panner_editor.cc:42
+#: editor.cc:216 mono_panner_editor.cc:44
 msgid "Left"
 msgstr "Esquerdo"
 
-#: editor.cc:204 mono_panner_editor.cc:47
+#: editor.cc:217 mono_panner_editor.cc:49
 msgid "Right"
 msgstr "Direito"
 
-#: editor.cc:205
+#: editor.cc:218
 msgid "Center"
 msgstr "Centro"
 
-#: editor.cc:208 editor.cc:3231
+#: editor.cc:221
 msgid "Edit point"
 msgstr ""
 
-#: editor.cc:214
+#: editor.cc:227
 msgid "Mushy"
 msgstr ""
 
-#: editor.cc:215
+#: editor.cc:228
 msgid "Smooth"
 msgstr ""
 
-#: editor.cc:216
+#: editor.cc:229
 msgid "Balanced multitimbral mixture"
 msgstr ""
 
-#: editor.cc:217
+#: editor.cc:230
 msgid "Unpitched percussion with stable notes"
 msgstr ""
 
-#: editor.cc:218
+#: editor.cc:231
 msgid "Crisp monophonic instrumental"
 msgstr ""
 
-#: editor.cc:219
+#: editor.cc:232
 msgid "Unpitched solo percussion"
 msgstr ""
 
-#: editor.cc:220
+#: editor.cc:233
 msgid "Resample without preserving pitch"
 msgstr ""
 
-#: editor.cc:256
+#: editor.cc:319
 msgid "Mins:Secs"
 msgstr "Mins:Segs"
 
-#: editor.cc:262
+#: editor.cc:325
 msgid "Location Markers"
 msgstr "Marcas de Localização"
 
-#: editor.cc:263
+#: editor.cc:326
 msgid "Range Markers"
 msgstr "Marcas de Intervalos"
 
-#: editor.cc:264
+#: editor.cc:327
 msgid "Loop/Punch Ranges"
 msgstr "Intervalos Loop/Insersão"
 
-#: editor.cc:265 editor_actions.cc:565
+#: editor.cc:328 editor_actions.cc:606
 msgid "CD Markers"
-msgstr ""
+msgstr "Marcadores de CD"
 
-#: editor.cc:266
+#: editor.cc:329
 msgid "Video Timeline"
 msgstr ""
 
-#: editor.cc:283
+#: editor.cc:386
 msgid "mode"
 msgstr "modo"
 
-#: editor.cc:459 editor_actions.cc:114 editor_actions.cc:564
+#: editor.cc:535 editor_actions.cc:117 editor_actions.cc:605
 msgid "Markers"
-msgstr ""
+msgstr "Marcadores"
 
-#: editor.cc:577 rc_option_editor.cc:1939
+#: editor.cc:653 rc_option_editor.cc:2527
 msgid "Regions"
-msgstr ""
+msgstr "Regiões"
 
-#: editor.cc:578
+#: editor.cc:654
 msgid "Tracks & Busses"
-msgstr ""
+msgstr "Trilhas & Bus"
 
-#: editor.cc:579
+#: editor.cc:655
 msgid "Snapshots"
-msgstr "Capturas"
+msgstr ""
 
-#: editor.cc:580
+#: editor.cc:656
 msgid "Track & Bus Groups"
-msgstr ""
+msgstr "Grupos de Trilhas e Bus"
 
-#: editor.cc:581
+#: editor.cc:657
 msgid "Ranges & Marks"
-msgstr ""
-
-#: editor.cc:728 editor.cc:5754 rc_option_editor.cc:1619
-#: rc_option_editor.cc:1627 rc_option_editor.cc:1635 rc_option_editor.cc:1643
-#: rc_option_editor.cc:1667 rc_option_editor.cc:1679 rc_option_editor.cc:1681
-#: rc_option_editor.cc:1689 rc_option_editor.cc:1697 rc_option_editor.cc:1717
-#: rc_option_editor.cc:1729 rc_option_editor.cc:1731 rc_option_editor.cc:1733
-#: rc_option_editor.cc:1741 rc_option_editor.cc:1749 rc_option_editor.cc:1757
-#: rc_option_editor.cc:1772 rc_option_editor.cc:1776 rc_option_editor.cc:1800
-msgid "Editor"
-msgstr ""
+msgstr "Intervalos e Marcadores"
 
-#: editor.cc:1331 editor.cc:4735 editor_actions.cc:134 editor_actions.cc:1865
+#: editor.cc:1333 editor.cc:4737 editor_actions.cc:137 editor_actions.cc:1882
 msgid "Loop"
 msgstr "Ciclo"
 
-#: editor.cc:1337 editor.cc:4762 editor_actions.cc:135 time_info_box.cc:68
+#: editor.cc:1339 editor.cc:4764 editor_actions.cc:138 time_info_box.cc:62
 msgid "Punch"
 msgstr "Inserção"
 
-#: editor.cc:1449 rc_option_editor.cc:1661
+#: editor.cc:1474 rc_option_editor.cc:2299
 msgid "Linear (for highly correlated material)"
 msgstr ""
 
-#: editor.cc:1459 rc_option_editor.cc:1662
+#: editor.cc:1484 rc_option_editor.cc:2300
 msgid "Constant power"
 msgstr ""
 
-#: editor.cc:1468 rc_option_editor.cc:1663
+#: editor.cc:1493 rc_option_editor.cc:2301
 msgid "Symmetric"
 msgstr ""
 
-#: editor.cc:1478 rc_option_editor.cc:1664
+#: editor.cc:1503 rc_option_editor.cc:2302
 msgid "Slow"
 msgstr "Devegar"
 
-#: editor.cc:1487 rc_option_editor.cc:1665 sfdb_ui.cc:1771 sfdb_ui.cc:1881
+#: editor.cc:1512 rc_option_editor.cc:2303 sfdb_ui.cc:1737 sfdb_ui.cc:1847
 msgid "Fast"
 msgstr "Rapido"
 
-#: editor.cc:1509 editor.cc:1534
+#: editor.cc:1534 editor.cc:1559
 msgid "Deactivate"
 msgstr "Desativar"
 
-#: editor.cc:1511 editor.cc:1536
+#: editor.cc:1536 editor.cc:1561
 msgid "Activate"
 msgstr "Ativar"
 
-#: editor.cc:1637 editor.cc:1645 editor_ops.cc:3824
+#: editor.cc:1662 editor.cc:1670 editor_ops.cc:3921
 msgid "Freeze"
 msgstr "Congelar"
 
-#: editor.cc:1641
+#: editor.cc:1666
 msgid "Unfreeze"
 msgstr "Descongelar"
 
-#: editor.cc:1780
+#: editor.cc:1766
+msgid "Region Loudness Analysis"
+msgstr ""
+
+#: editor.cc:1785 editor.cc:1834
+msgid "Audio Report/Analysis"
+msgstr ""
+
+#: editor.cc:1815
+msgid "Range Loudness Analysis"
+msgstr ""
+
+#: editor.cc:1901
 msgid "Selected Regions"
 msgstr ""
 
-#: editor.cc:1816 editor_markers.cc:940
+#: editor.cc:1945 editor_markers.cc:945
 msgid "Play Range"
 msgstr ""
 
-#: editor.cc:1817 editor_markers.cc:943
+#: editor.cc:1946 editor_markers.cc:948
 msgid "Loop Range"
 msgstr ""
 
-#: editor.cc:1820 editor_markers.cc:950
+#: editor.cc:1949 editor_markers.cc:953
 msgid "Zoom to Range"
 msgstr ""
 
-#: editor.cc:1829 editor_actions.cc:369
+#: editor.cc:1952
+msgid "Loudness Analysis"
+msgstr ""
+
+#: editor.cc:1959 editor_actions.cc:401
 msgid "Move Range Start to Previous Region Boundary"
 msgstr ""
 
-#: editor.cc:1836 editor_actions.cc:376
+#: editor.cc:1966 editor_actions.cc:408
 msgid "Move Range Start to Next Region Boundary"
 msgstr ""
 
-#: editor.cc:1843 editor_actions.cc:383
+#: editor.cc:1973 editor_actions.cc:415
 msgid "Move Range End to Previous Region Boundary"
 msgstr ""
 
-#: editor.cc:1850 editor_actions.cc:390
+#: editor.cc:1980 editor_actions.cc:422
 msgid "Move Range End to Next Region Boundary"
 msgstr ""
 
-#: editor.cc:1856 editor_actions.cc:133 editor_actions.cc:325
+#: editor.cc:1986 editor_actions.cc:136 editor_actions.cc:347
 msgid "Separate"
-msgstr ""
+msgstr "Separar"
 
-#: editor.cc:1857
+#: editor.cc:1987
 msgid "Convert to Region in Region List"
 msgstr ""
 
-#: editor.cc:1860 editor_markers.cc:970
+#: editor.cc:1990 editor_markers.cc:973
 msgid "Select All in Range"
 msgstr ""
 
-#: editor.cc:1863 editor_actions.cc:297
+#: editor.cc:1993 editor_actions.cc:319
 msgid "Set Loop from Selection"
 msgstr ""
 
-#: editor.cc:1864 editor_actions.cc:298
+#: editor.cc:1994 editor_actions.cc:320
 msgid "Set Punch from Selection"
 msgstr ""
 
-#: editor.cc:1865 editor_actions.cc:299
+#: editor.cc:1995 editor_actions.cc:321
 msgid "Set Session Start/End from Selection"
 msgstr ""
 
-#: editor.cc:1868
+#: editor.cc:1998
 msgid "Add Range Markers"
-msgstr ""
+msgstr "Adicionar Marcadores para Intervalo"
 
-#: editor.cc:1871
+#: editor.cc:2001
 msgid "Crop Region to Range"
-msgstr ""
+msgstr "Cortar Região para Intervalo"
 
-#: editor.cc:1872
-msgid "Fill Range with Region"
-msgstr ""
-
-#: editor.cc:1873 editor_actions.cc:311
+#: editor.cc:2002 editor_actions.cc:333
 msgid "Duplicate Range"
 msgstr ""
 
-#: editor.cc:1876
+#: editor.cc:2005
 msgid "Consolidate Range"
 msgstr ""
 
-#: editor.cc:1877
-msgid "Consolidate Range With Processing"
+#: editor.cc:2006
+msgid "Consolidate Range with Processing"
 msgstr ""
 
-#: editor.cc:1878
+#: editor.cc:2007
 msgid "Bounce Range to Region List"
 msgstr ""
 
-#: editor.cc:1879
-msgid "Bounce Range to Region List With Processing"
+#: editor.cc:2008
+msgid "Bounce Range to Region List with Processing"
 msgstr ""
 
-#: editor.cc:1880 editor_markers.cc:953
+#: editor.cc:2009 editor_markers.cc:956
 msgid "Export Range..."
 msgstr ""
 
-#: editor.cc:1882
+#: editor.cc:2011
 msgid "Export Video Range..."
 msgstr ""
 
-#: editor.cc:1898 editor.cc:1979 editor_actions.cc:303
-msgid "Play From Edit Point"
-msgstr ""
+#: editor.cc:2027 editor.cc:2109 editor_actions.cc:325
+msgid "Play from Edit Point"
+msgstr "Reproduzir do Ponto de Edição"
 
-#: editor.cc:1899 editor.cc:1980
-msgid "Play From Start"
-msgstr ""
+#: editor.cc:2028 editor.cc:2110
+msgid "Play from Start"
+msgstr "Reproduzir do Início"
 
-#: editor.cc:1900
+#: editor.cc:2029
 msgid "Play Region"
-msgstr ""
+msgstr "Reproduzir Região"
 
-#: editor.cc:1902
+#: editor.cc:2031
 msgid "Loop Region"
 msgstr "Região de loop"
 
-#: editor.cc:1912 editor.cc:1989
+#: editor.cc:2041 editor.cc:2119
 msgid "Select All in Track"
 msgstr ""
 
-#: editor.cc:1913 editor.cc:1990 editor_actions.cc:194
+#: editor.cc:2042 editor.cc:2120 editor_actions.cc:196
 msgid "Select All Objects"
 msgstr ""
 
-#: editor.cc:1914 editor.cc:1991
+#: editor.cc:2043 editor.cc:2121
 msgid "Invert Selection in Track"
-msgstr ""
+msgstr "Inverter Seleção na Trilha"
 
-#: editor.cc:1915 editor.cc:1992 editor_actions.cc:197
+#: editor.cc:2044 editor.cc:2122 editor_actions.cc:199
 msgid "Invert Selection"
-msgstr ""
+msgstr "Inverter Seleção"
 
-#: editor.cc:1917
+#: editor.cc:2046 editor_actions.cc:201
 msgid "Set Range to Loop Range"
 msgstr ""
 
-#: editor.cc:1918
+#: editor.cc:2047 editor_actions.cc:202
 msgid "Set Range to Punch Range"
 msgstr ""
 
-#: editor.cc:1920 editor.cc:1994 editor_actions.cc:199 editor_actions.cc:200
+#: editor.cc:2048 editor_actions.cc:203
+msgid "Set Range to Selected Regions"
+msgstr ""
+
+#: editor.cc:2050 editor.cc:2124 editor_actions.cc:205 editor_actions.cc:206
 msgid "Select All After Edit Point"
 msgstr ""
 
-#: editor.cc:1921 editor.cc:1995 editor_actions.cc:201 editor_actions.cc:202
+#: editor.cc:2051 editor.cc:2125 editor_actions.cc:207 editor_actions.cc:208
 msgid "Select All Before Edit Point"
 msgstr ""
 
-#: editor.cc:1922 editor.cc:1996
+#: editor.cc:2052 editor.cc:2126
 msgid "Select All After Playhead"
 msgstr ""
 
-#: editor.cc:1923 editor.cc:1997
+#: editor.cc:2053 editor.cc:2127
 msgid "Select All Before Playhead"
 msgstr ""
 
-#: editor.cc:1924
+#: editor.cc:2054
 msgid "Select All Between Playhead and Edit Point"
 msgstr ""
 
-#: editor.cc:1925
+#: editor.cc:2055
 msgid "Select All Within Playhead and Edit Point"
 msgstr ""
 
-#: editor.cc:1926
+#: editor.cc:2056
 msgid "Select Range Between Playhead and Edit Point"
 msgstr ""
 
-#: editor.cc:1928 editor.cc:1999 editor_actions.cc:131 editor_actions.cc:132
+#: editor.cc:2058 editor.cc:2129 editor_actions.cc:134 editor_actions.cc:135
 msgid "Select"
 msgstr "Selecionar"
 
-#: editor.cc:1936 editor.cc:2007 editor_actions.cc:337 processor_box.cc:2451
+#: editor.cc:2066 editor.cc:2137 editor_actions.cc:359 processor_box.cc:3677
 msgid "Cut"
 msgstr "Cortar"
 
-#: editor.cc:1937 editor.cc:2008 editor_actions.cc:341 processor_box.cc:2454
+#: editor.cc:2067 editor.cc:2138 editor_actions.cc:363 processor_box.cc:3679
 msgid "Copy"
 msgstr "Copiar"
 
-#: editor.cc:1938 editor.cc:2009 editor_actions.cc:342 processor_box.cc:2462
+#: editor.cc:2068 editor.cc:2139 editor_actions.cc:364 processor_box.cc:3691
 msgid "Paste"
 msgstr "Colar"
 
-#: editor.cc:1942 editor_actions.cc:91
+#: editor.cc:2072 editor_actions.cc:94
 msgid "Align"
 msgstr "Alinhamento"
 
-#: editor.cc:1943
+#: editor.cc:2073
 msgid "Align Relative"
 msgstr "Alinhamento Relativo"
 
-#: editor.cc:1950
+#: editor.cc:2080
 msgid "Insert Selected Region"
-msgstr ""
+msgstr "Inserir Região Selecionada"
 
-#: editor.cc:1951
+#: editor.cc:2081
 msgid "Insert Existing Media"
-msgstr ""
+msgstr "Importar Mídia"
 
-#: editor.cc:1960 editor.cc:2016
+#: editor.cc:2090 editor.cc:2146
 msgid "Nudge Entire Track Later"
 msgstr ""
 
-#: editor.cc:1961 editor.cc:2017
+#: editor.cc:2091 editor.cc:2147
 msgid "Nudge Track After Edit Point Later"
 msgstr ""
 
-#: editor.cc:1962 editor.cc:2018
+#: editor.cc:2092 editor.cc:2148
 msgid "Nudge Entire Track Earlier"
 msgstr ""
 
-#: editor.cc:1963 editor.cc:2019
+#: editor.cc:2093 editor.cc:2149
 msgid "Nudge Track After Edit Point Earlier"
 msgstr ""
 
-#: editor.cc:1965 editor.cc:2021
+#: editor.cc:2095 editor.cc:2151
 msgid "Nudge"
 msgstr "Retocar"
 
-#: editor.cc:2235
+#: editor.cc:2353
 msgid ""
 "Playhead position stored with a negative value - ignored (use zero instead)"
 msgstr ""
 
-#: editor.cc:3006 editor.cc:3707 editor.cc:3778 midi_channel_selector.cc:157
+#: editor.cc:3115 editor.cc:3775 editor.cc:3846 midi_channel_selector.cc:157
 #: midi_channel_selector.cc:395 midi_channel_selector.cc:431
 msgid "All"
 msgstr ""
 
-#: editor.cc:3210
-msgid "Smart Mode (add Range functions to Grab mode)"
+#: editor.cc:3280
+msgid "Smart Mode (add range functions to Grab Mode)"
 msgstr ""
 
-#: editor.cc:3211
+#: editor.cc:3281
 msgid "Grab Mode (select/move objects)"
 msgstr ""
 
-#: editor.cc:3212
+#: editor.cc:3282
 msgid "Cut Mode (split regions)"
 msgstr ""
 
-#: editor.cc:3213
+#: editor.cc:3283
 msgid "Range Mode (select time ranges)"
 msgstr ""
 
-#: editor.cc:3214
+#: editor.cc:3284
 msgid "Draw Mode (draw and edit gain/notes/automation)"
 msgstr ""
 
-#: editor.cc:3215
+#: editor.cc:3285
 msgid "Stretch Mode (time-stretch audio and midi regions, preserving pitch)"
 msgstr ""
 
-#: editor.cc:3216
+#: editor.cc:3286
 msgid "Audition Mode (listen to regions)"
 msgstr ""
 
-#: editor.cc:3217
-msgid "Internal Edit Mode (edit notes and gain curves inside regions)"
+#: editor.cc:3287
+msgid "Internal Edit Mode (edit notes and automation points)"
 msgstr ""
 
-#: editor.cc:3218
+#: editor.cc:3288
 msgid ""
 "Groups: click to (de)activate\n"
 "Context-click for other operations"
 msgstr ""
 
-#: editor.cc:3219
+#: editor.cc:3289
 msgid "Nudge Region/Selection Later"
 msgstr ""
 
-#: editor.cc:3220
+#: editor.cc:3290
 msgid "Nudge Region/Selection Earlier"
 msgstr ""
 
-#: editor.cc:3221 editor_actions.cc:262
+#: editor.cc:3291 editor_actions.cc:272
 msgid "Zoom In"
-msgstr ""
+msgstr "Ampliar"
 
-#: editor.cc:3222 editor_actions.cc:261
+#: editor.cc:3292 editor_actions.cc:271
 msgid "Zoom Out"
-msgstr ""
+msgstr "Reduzir"
 
-#: editor.cc:3223
+#: editor.cc:3293
 msgid "Zoom to Time Scale"
 msgstr ""
 
-#: editor.cc:3224 editor.cc:3729 editor_actions.cc:263
+#: editor.cc:3294 editor.cc:3797 editor_actions.cc:273
 msgid "Zoom to Session"
 msgstr ""
 
-#: editor.cc:3225
-msgid "Zoom focus"
-msgstr ""
+#: editor.cc:3295 editor_actions.cc:115 editor_actions.cc:148
+msgid "Zoom Focus"
+msgstr "Foco de Zoom"
 
-#: editor.cc:3226
+#: editor.cc:3296
 msgid "Expand Tracks"
-msgstr ""
+msgstr "Expandir Trilhas"
 
-#: editor.cc:3227
+#: editor.cc:3297
 msgid "Shrink Tracks"
-msgstr ""
+msgstr "Encolher Trilhas"
 
-#: editor.cc:3228
+#: editor.cc:3298
 msgid "Number of visible tracks"
-msgstr ""
+msgstr "Número de trilhas visíveis"
 
-#: editor.cc:3229
+#: editor.cc:3299
 msgid "Snap/Grid Units"
 msgstr ""
 
-#: editor.cc:3230
+#: editor.cc:3300
 msgid "Snap/Grid Mode"
 msgstr ""
 
-#: editor.cc:3232
+#: editor.cc:3301 editor_actions.cc:101
+msgid "Edit Point"
+msgstr "Ponto de Edição"
+
+#: editor.cc:3302
 msgid "Edit Mode"
 msgstr "Modo de edição"
 
-#: editor.cc:3233
+#: editor.cc:3303
 msgid ""
 "Nudge Clock\n"
 "(controls distance used to nudge regions and selections)"
 msgstr ""
 
-#: editor.cc:3501 editor_actions.cc:313
+#: editor.cc:3571 editor_actions.cc:335
 msgid "Command|Undo"
-msgstr ""
+msgstr "Desfazer"
 
-#: editor.cc:3503
+#: editor.cc:3573
 msgid "Command|Undo (%1)"
-msgstr ""
+msgstr "Desfazer (%1)"
 
-#: editor.cc:3510 editor_actions.cc:315 editor_actions.cc:316
-#: editor_actions.cc:317
+#: editor.cc:3580 editor_actions.cc:337 editor_actions.cc:338
+#: editor_actions.cc:339
 msgid "Redo"
 msgstr "Refazer"
 
-#: editor.cc:3512
+#: editor.cc:3583
 msgid "Redo (%1)"
 msgstr "Refazer (%1)"
 
-#: editor.cc:3531 editor.cc:3555 editor_actions.cc:110 editor_actions.cc:1846
+#: editor.cc:3603 editor.cc:3627 editor_actions.cc:113 editor_actions.cc:1863
 msgid "Duplicate"
 msgstr "Duplicar"
 
-#: editor.cc:3532
+#: editor.cc:3604
 msgid "Number of duplications:"
 msgstr ""
 
-#: editor.cc:3706 route_group_dialog.cc:51 time_info_box.cc:67
+#: editor.cc:3774 route_group_dialog.cc:51 time_info_box.cc:61
 msgid "Selection"
-msgstr ""
+msgstr "Seleção"
 
-#: editor.cc:3709
+#: editor.cc:3777
 msgid "Fit 1 track"
 msgstr ""
 
-#: editor.cc:3710
+#: editor.cc:3778
 msgid "Fit 2 tracks"
 msgstr ""
 
-#: editor.cc:3711
+#: editor.cc:3779
 msgid "Fit 4 tracks"
 msgstr ""
 
-#: editor.cc:3712
+#: editor.cc:3780
 msgid "Fit 8 tracks"
 msgstr ""
 
-#: editor.cc:3713
+#: editor.cc:3781
 msgid "Fit 16 tracks"
 msgstr ""
 
-#: editor.cc:3714
+#: editor.cc:3782
 msgid "Fit 24 tracks"
 msgstr ""
 
-#: editor.cc:3715
+#: editor.cc:3783
 msgid "Fit 32 tracks"
 msgstr ""
 
-#: editor.cc:3716
+#: editor.cc:3784
 msgid "Fit 48 tracks"
 msgstr ""
 
-#: editor.cc:3717
+#: editor.cc:3785
 msgid "Fit All tracks"
 msgstr ""
 
-#: editor.cc:3718
+#: editor.cc:3786
 msgid "Fit Selection"
 msgstr ""
 
-#: editor.cc:3720
+#: editor.cc:3788 editor_actions.cc:288
 msgid "Zoom to 10 ms"
 msgstr ""
 
-#: editor.cc:3721
+#: editor.cc:3789 editor_actions.cc:289
 msgid "Zoom to 100 ms"
 msgstr ""
 
-#: editor.cc:3722
+#: editor.cc:3790 editor_actions.cc:290
 msgid "Zoom to 1 sec"
 msgstr ""
 
-#: editor.cc:3723
+#: editor.cc:3791 editor_actions.cc:291
 msgid "Zoom to 10 sec"
 msgstr ""
 
-#: editor.cc:3724
+#: editor.cc:3792 editor_actions.cc:292
 msgid "Zoom to 1 min"
 msgstr ""
 
-#: editor.cc:3725
+#: editor.cc:3793 editor_actions.cc:294
 msgid "Zoom to 10 min"
 msgstr ""
 
-#: editor.cc:3726
+#: editor.cc:3794
 msgid "Zoom to 1 hour"
 msgstr ""
 
-#: editor.cc:3727
+#: editor.cc:3795
 msgid "Zoom to 8 hours"
 msgstr ""
 
-#: editor.cc:3728
+#: editor.cc:3796
 msgid "Zoom to 24 hours"
 msgstr ""
 
-#: editor.cc:3730
+#: editor.cc:3798
 msgid "Zoom to Range/Region Selection"
 msgstr ""
 
-#: editor.cc:3800
+#: editor.cc:3868
 msgid "*"
 msgstr ""
 
-#: editor.cc:4120
+#: editor.cc:4135
 msgid "Playlist Deletion"
 msgstr ""
 
-#: editor.cc:4121
+#: editor.cc:4136
 msgid ""
 "Playlist %1 is currently unused.\n"
 "If it is kept, its audio files will not be cleaned.\n"
 "If it is deleted, audio files used by it alone will be cleaned."
 msgstr ""
 
-#: editor.cc:4131
+#: editor.cc:4146
+msgid "Delete All Unused"
+msgstr ""
+
+#: editor.cc:4147
 msgid "Delete Playlist"
 msgstr ""
 
-#: editor.cc:4132
+#: editor.cc:4148
 msgid "Keep Playlist"
 msgstr ""
 
-#: editor.cc:4133 editor_audio_import.cc:594 editor_ops.cc:6174
-#: engine_dialog.cc:2083 sfdb_freesound_mootcher.cc:69 processor_box.cc:2219
-#: processor_box.cc:2244
+#: editor.cc:4149
+msgid "Keep Remaining"
+msgstr ""
+
+#: editor.cc:4150 editor_audio_import.cc:600 editor_ops.cc:6530
+#: engine_dialog.cc:2986 sfdb_freesound_mootcher.cc:69 processor_box.cc:3443
+#: processor_box.cc:3468
 msgid "Cancel"
 msgstr "Cancelar"
 
-#: editor.cc:4275
+#: editor.cc:4292
 msgid "new playlists"
 msgstr ""
 
-#: editor.cc:4291
+#: editor.cc:4308
 msgid "copy playlists"
 msgstr ""
 
-#: editor.cc:4306
+#: editor.cc:4323
 msgid "clear playlists"
 msgstr ""
 
-#: editor.cc:5046
+#: editor.cc:5048
 msgid "Please wait while %1 loads visual data."
 msgstr ""
 
-#: editor.cc:5901 editor.cc:5932 editor_markers.cc:985 panner_ui.cc:410
-#: processor_box.cc:2482
+#: editor.cc:5811 editor_actions.cc:479
+msgid "Unset #%1"
+msgstr ""
+
+#: editor.cc:5812 editor_actions.cc:481
+msgid "no action bound"
+msgstr ""
+
+#: editor.cc:5961 editor.cc:5996 editor_markers.cc:998 editor_markers.cc:1018
+#: panner_ui.cc:412 processor_box.cc:3715
 msgid "Edit..."
 msgstr ""
 
-#: editor.cc:5934 editor_actions.cc:1941
+#: editor.cc:6002 editor_actions.cc:1842
+msgid "Transpose..."
+msgstr ""
+
+#: editor.cc:6006 editor_actions.cc:1959
 msgid "Legatize"
 msgstr ""
 
-#: editor.cc:5936 editor_actions.cc:1940
+#: editor.cc:6012 editor_actions.cc:1958
 msgid "Quantize..."
 msgstr ""
 
-#: editor.cc:5938 editor_actions.cc:1943
+#: editor.cc:6015 editor_actions.cc:1961
 msgid "Remove Overlap"
 msgstr ""
 
-#: editor.cc:5940 editor_actions.cc:1942
+#: editor.cc:6021 editor_actions.cc:1960
 msgid "Transform..."
 msgstr ""
 
-#: editor_actions.cc:92
+#: editor_actions.cc:95
 msgid "Autoconnect"
 msgstr ""
 
-#: editor_actions.cc:93
+#: editor_actions.cc:96
 msgid "Crossfades"
 msgstr ""
 
-#: editor_actions.cc:95
+#: editor_actions.cc:98
 msgid "Move Selected Marker"
 msgstr ""
 
-#: editor_actions.cc:96
+#: editor_actions.cc:99
 msgid "Select Range Operations"
 msgstr ""
 
-#: editor_actions.cc:97
+#: editor_actions.cc:100
 msgid "Select Regions"
 msgstr ""
 
-#: editor_actions.cc:98
-msgid "Edit Point"
-msgstr ""
-
-#: editor_actions.cc:99
+#: editor_actions.cc:102
 msgid "Fade"
 msgstr "Fade"
 
-#: editor_actions.cc:100
+#: editor_actions.cc:103
 msgid "Latch"
 msgstr ""
 
-#: editor_actions.cc:101 editor_regions.cc:112 region_editor.cc:46
+#: editor_actions.cc:104 editor_regions.cc:159 region_editor.cc:48
 msgid "Region"
-msgstr ""
+msgstr "Região"
 
-#: editor_actions.cc:102
+#: editor_actions.cc:105
 msgid "Layering"
-msgstr ""
+msgstr "Disposição"
 
-#: editor_actions.cc:103 editor_regions.cc:113 stereo_panner_editor.cc:44
+#: editor_actions.cc:106 editor_regions.cc:160 stereo_panner_editor.cc:46
 msgid "Position"
-msgstr ""
+msgstr "Posição"
 
-#: editor_actions.cc:105 gain_meter.cc:156 gain_meter.cc:825 panner_ui.cc:178
-#: panner_ui.cc:635
+#: editor_actions.cc:108 gain_meter.cc:161 gain_meter.cc:848 panner_ui.cc:178
+#: panner_ui.cc:637 route_time_axis.cc:541
 msgid "Trim"
 msgstr "Cortar"
 
-#: editor_actions.cc:106 editor_actions.cc:126 route_group_dialog.cc:46
+#: editor_actions.cc:109 editor_actions.cc:129 route_group_dialog.cc:46
 msgid "Gain"
-msgstr ""
+msgstr "Ganho"
 
-#: editor_actions.cc:107 editor_actions.cc:563
+#: editor_actions.cc:110 editor_actions.cc:604
 msgid "Ranges"
-msgstr ""
+msgstr "Intervalos"
 
-#: editor_actions.cc:108 editor_actions.cc:1842 session_option_editor.cc:135
+#: editor_actions.cc:111 editor_actions.cc:1859 session_option_editor.cc:135
 #: session_option_editor.cc:144 session_option_editor.cc:151
+#: session_option_editor.cc:158 session_option_editor.cc:165
 msgid "Fades"
 msgstr ""
 
-#: editor_actions.cc:111
+#: editor_actions.cc:114
 msgid "Link"
 msgstr ""
 
-#: editor_actions.cc:112 editor_actions.cc:145
-msgid "Zoom Focus"
-msgstr "Foco de Zoom"
-
-#: editor_actions.cc:113
+#: editor_actions.cc:116
 msgid "Locate to Markers"
 msgstr ""
 
-#: editor_actions.cc:115
+#: editor_actions.cc:118
 msgid "Meter falloff"
 msgstr ""
 
-#: editor_actions.cc:116
+#: editor_actions.cc:119
 msgid "Meter hold"
 msgstr ""
 
-#: editor_actions.cc:117 session_option_editor.cc:321
+#: editor_actions.cc:120 session_option_editor.cc:342
 msgid "MIDI Options"
-msgstr ""
+msgstr "Opções MIDI"
 
-#: editor_actions.cc:118
+#: editor_actions.cc:121
 msgid "Misc Options"
 msgstr ""
 
-#: editor_actions.cc:119 rc_option_editor.cc:1809 route_group_dialog.cc:54
-#: session_option_editor.cc:243 session_option_editor.cc:250
+#: editor_actions.cc:122 rc_option_editor.cc:2401 route_group_dialog.cc:54
+#: session_option_editor.cc:264 session_option_editor.cc:271
 msgid "Monitoring"
 msgstr ""
 
-#: editor_actions.cc:120
+#: editor_actions.cc:123
 msgid "Active Mark"
 msgstr ""
 
-#: editor_actions.cc:123
+#: editor_actions.cc:126
 msgid "Primary Clock"
 msgstr ""
 
-#: editor_actions.cc:124
+#: editor_actions.cc:127
 msgid "Pullup / Pulldown"
 msgstr ""
 
-#: editor_actions.cc:125
+#: editor_actions.cc:128
 msgid "Region operations"
-msgstr ""
+msgstr "Operações de Região"
 
-#: editor_actions.cc:127 ruler_dialog.cc:28
+#: editor_actions.cc:130 ruler_dialog.cc:28
 msgid "Rulers"
-msgstr ""
+msgstr "Réguas"
 
-#: editor_actions.cc:128
+#: editor_actions.cc:131
 msgid "Views"
-msgstr ""
+msgstr "Visualizações"
 
-#: editor_actions.cc:129
+#: editor_actions.cc:132
 msgid "Scroll"
-msgstr ""
+msgstr "Rolagem"
 
-#: editor_actions.cc:130
+#: editor_actions.cc:133
 msgid "Secondary Clock"
 msgstr ""
 
-#: editor_actions.cc:137
+#: editor_actions.cc:140
 msgid "Subframes"
 msgstr ""
 
-#: editor_actions.cc:140
+#: editor_actions.cc:143
 msgid "Timecode fps"
 msgstr ""
 
-#: editor_actions.cc:141 route_time_axis.cc:575
+#: editor_actions.cc:144 route_time_axis.cc:599
 msgid "Height"
 msgstr "Altura"
 
-#: editor_actions.cc:143
+#: editor_actions.cc:146
 msgid "Tools"
 msgstr ""
 
-#: editor_actions.cc:144
+#: editor_actions.cc:147
 msgid "View"
-msgstr ""
+msgstr "Visualizar"
 
-#: editor_actions.cc:146
+#: editor_actions.cc:149
 msgid "Zoom"
 msgstr ""
 
-#: editor_actions.cc:152
-msgid "Break drag or deselect all"
+#: editor_actions.cc:150
+msgid "Scripted Actions"
 msgstr ""
 
 #: editor_actions.cc:159
+msgid "Session|Lock"
+msgstr ""
+
+#: editor_actions.cc:161
 msgid "Show Editor Mixer"
 msgstr ""
 
-#: editor_actions.cc:160
+#: editor_actions.cc:162
 msgid "Show Editor List"
 msgstr ""
 
-#: editor_actions.cc:162
+#: editor_actions.cc:164
 msgid "Playhead to Next Region Boundary"
 msgstr ""
 
-#: editor_actions.cc:163
+#: editor_actions.cc:165
 msgid "Playhead to Next Region Boundary (No Track Selection)"
 msgstr ""
 
-#: editor_actions.cc:164
+#: editor_actions.cc:166
 msgid "Playhead to Previous Region Boundary"
 msgstr ""
 
-#: editor_actions.cc:165
+#: editor_actions.cc:167
 msgid "Playhead to Previous Region Boundary (No Track Selection)"
 msgstr ""
 
-#: editor_actions.cc:167
+#: editor_actions.cc:169
 msgid "Playhead to Next Region Start"
 msgstr ""
 
-#: editor_actions.cc:168
+#: editor_actions.cc:170
 msgid "Playhead to Next Region End"
 msgstr ""
 
-#: editor_actions.cc:169
+#: editor_actions.cc:171
 msgid "Playhead to Next Region Sync"
 msgstr ""
 
-#: editor_actions.cc:171
+#: editor_actions.cc:173
 msgid "Playhead to Previous Region Start"
 msgstr ""
 
-#: editor_actions.cc:172
+#: editor_actions.cc:174
 msgid "Playhead to Previous Region End"
 msgstr ""
 
-#: editor_actions.cc:173
+#: editor_actions.cc:175
 msgid "Playhead to Previous Region Sync"
 msgstr ""
 
-#: editor_actions.cc:175
+#: editor_actions.cc:177
 msgid "To Next Region Boundary"
 msgstr ""
 
-#: editor_actions.cc:176
+#: editor_actions.cc:178
 msgid "To Next Region Boundary (No Track Selection)"
 msgstr ""
 
-#: editor_actions.cc:177
+#: editor_actions.cc:179
 msgid "To Previous Region Boundary"
 msgstr ""
 
-#: editor_actions.cc:178
+#: editor_actions.cc:180
 msgid "To Previous Region Boundary (No Track Selection)"
 msgstr ""
 
-#: editor_actions.cc:180
+#: editor_actions.cc:182
 msgid "To Next Region Start"
 msgstr ""
 
-#: editor_actions.cc:181
+#: editor_actions.cc:183
 msgid "To Next Region End"
 msgstr ""
 
-#: editor_actions.cc:182
+#: editor_actions.cc:184
 msgid "To Next Region Sync"
 msgstr ""
 
-#: editor_actions.cc:184
+#: editor_actions.cc:186
 msgid "To Previous Region Start"
 msgstr ""
 
-#: editor_actions.cc:185
+#: editor_actions.cc:187
 msgid "To Previous Region End"
 msgstr ""
 
-#: editor_actions.cc:186
+#: editor_actions.cc:188
 msgid "To Previous Region Sync"
 msgstr ""
 
-#: editor_actions.cc:188
+#: editor_actions.cc:190
 msgid "To Range Start"
 msgstr ""
 
-#: editor_actions.cc:189
+#: editor_actions.cc:191
 msgid "To Range End"
 msgstr ""
 
-#: editor_actions.cc:191
+#: editor_actions.cc:193
 msgid "Playhead to Range Start"
 msgstr ""
 
-#: editor_actions.cc:192
+#: editor_actions.cc:194
 msgid "Playhead to Range End"
 msgstr ""
 
-#: editor_actions.cc:195
+#: editor_actions.cc:197
 msgid "Select All Tracks"
 msgstr ""
 
-#: editor_actions.cc:196 export_timespan_selector.cc:61 processor_box.cc:2468
+#: editor_actions.cc:198 export_timespan_selector.cc:62 processor_box.cc:3697
 msgid "Deselect All"
 msgstr ""
 
-#: editor_actions.cc:204
+#: editor_actions.cc:210
 msgid "Select All Overlapping Edit Range"
 msgstr ""
 
-#: editor_actions.cc:205
+#: editor_actions.cc:211
 msgid "Select All Inside Edit Range"
 msgstr ""
 
-#: editor_actions.cc:207
+#: editor_actions.cc:213
 msgid "Select Edit Range"
 msgstr ""
 
-#: editor_actions.cc:209
+#: editor_actions.cc:215
 msgid "Select All in Punch Range"
 msgstr ""
 
-#: editor_actions.cc:210
+#: editor_actions.cc:216
 msgid "Select All in Loop Range"
 msgstr ""
 
-#: editor_actions.cc:212
+#: editor_actions.cc:218
 msgid "Select Next Track or Bus"
 msgstr ""
 
-#: editor_actions.cc:213
+#: editor_actions.cc:219
 msgid "Select Previous Track or Bus"
 msgstr ""
 
-#: editor_actions.cc:215
+#: editor_actions.cc:221
 msgid "Toggle Record Enable"
 msgstr ""
 
-#: editor_actions.cc:217
+#: editor_actions.cc:223
 msgid "Toggle Solo"
 msgstr ""
 
-#: editor_actions.cc:219
+#: editor_actions.cc:225
 msgid "Toggle Mute"
 msgstr ""
 
-#: editor_actions.cc:221
+#: editor_actions.cc:227
 msgid "Toggle Solo Isolate"
 msgstr ""
 
-#: editor_actions.cc:226
+#: editor_actions.cc:232
 msgid "Save View %1"
 msgstr ""
 
-#: editor_actions.cc:232
+#: editor_actions.cc:238
 msgid "Go to View %1"
 msgstr ""
 
-#: editor_actions.cc:238
+#: editor_actions.cc:244
 msgid "Locate to Mark %1"
 msgstr ""
 
-#: editor_actions.cc:242 editor_actions.cc:243
+#: editor_actions.cc:249 editor_actions.cc:250
 msgid "Jump to Next Mark"
 msgstr ""
 
-#: editor_actions.cc:244 editor_actions.cc:245
+#: editor_actions.cc:251 editor_actions.cc:252
 msgid "Jump to Previous Mark"
 msgstr ""
 
-#: editor_actions.cc:247 editor_actions.cc:248
-msgid "Add Mark from Playhead"
+#: editor_actions.cc:254
+msgid "Set Session Start from Playhead"
+msgstr ""
+
+#: editor_actions.cc:255
+msgid "Set Session End from Playhead"
+msgstr ""
+
+#: editor_actions.cc:257 editor_actions.cc:258
+msgid "Add Mark from Playhead"
 msgstr ""
 
-#: editor_actions.cc:250 editor_actions.cc:251
+#: editor_actions.cc:260 editor_actions.cc:261
 msgid "Remove Mark at Playhead"
 msgstr ""
 
-#: editor_actions.cc:253
+#: editor_actions.cc:263
 msgid "Nudge Next Later"
 msgstr ""
 
-#: editor_actions.cc:254
+#: editor_actions.cc:264
 msgid "Nudge Next Earlier"
 msgstr ""
 
-#: editor_actions.cc:256
+#: editor_actions.cc:266
 msgid "Nudge Playhead Forward"
 msgstr ""
 
-#: editor_actions.cc:257
+#: editor_actions.cc:267
 msgid "Nudge Playhead Backward"
 msgstr ""
 
-#: editor_actions.cc:258
-msgid "Playhead To Next Grid"
+#: editor_actions.cc:268
+msgid "Playhead to Next Grid"
 msgstr ""
 
-#: editor_actions.cc:259
-msgid "Playhead To Previous Grid"
+#: editor_actions.cc:269
+msgid "Playhead to Previous Grid"
 msgstr ""
 
-#: editor_actions.cc:264
+#: editor_actions.cc:274
 msgid "Zoom to Selection"
-msgstr ""
+msgstr "Zoom para Seleção"
 
-#: editor_actions.cc:265
+#: editor_actions.cc:275
 msgid "Toggle Zoom State"
 msgstr ""
 
-#: editor_actions.cc:267
+#: editor_actions.cc:277
 msgid "Expand Track Height"
 msgstr ""
 
-#: editor_actions.cc:268
+#: editor_actions.cc:278
 msgid "Shrink Track Height"
 msgstr ""
 
-#: editor_actions.cc:270
+#: editor_actions.cc:280
+msgid "Fit 1 Track"
+msgstr ""
+
+#: editor_actions.cc:281
+msgid "Fit 2 Tracks"
+msgstr ""
+
+#: editor_actions.cc:282
+msgid "Fit 4 Tracks"
+msgstr ""
+
+#: editor_actions.cc:283
+msgid "Fit 8 Tracks"
+msgstr ""
+
+#: editor_actions.cc:284
+msgid "Fit 16 Tracks"
+msgstr ""
+
+#: editor_actions.cc:285
+msgid "Fit 32 Tracks"
+msgstr ""
+
+#: editor_actions.cc:286
+msgid "Fit All Tracks"
+msgstr ""
+
+#: editor_actions.cc:293
+msgid "Zoom to 5 min"
+msgstr ""
+
+#: editor_actions.cc:296
 msgid "Move Selected Tracks Up"
 msgstr ""
 
-#: editor_actions.cc:272
+#: editor_actions.cc:298
 msgid "Move Selected Tracks Down"
 msgstr ""
 
-#: editor_actions.cc:275
+#: editor_actions.cc:301
 msgid "Scroll Tracks Up"
 msgstr ""
 
-#: editor_actions.cc:277
+#: editor_actions.cc:302
 msgid "Scroll Tracks Down"
 msgstr ""
 
-#: editor_actions.cc:279
+#: editor_actions.cc:303
 msgid "Step Tracks Up"
 msgstr ""
 
-#: editor_actions.cc:281
+#: editor_actions.cc:304
 msgid "Step Tracks Down"
 msgstr ""
 
-#: editor_actions.cc:284
+#: editor_actions.cc:306
 msgid "Scroll Backward"
 msgstr ""
 
-#: editor_actions.cc:285
+#: editor_actions.cc:307
 msgid "Scroll Forward"
 msgstr ""
 
-#: editor_actions.cc:286
+#: editor_actions.cc:308
 msgid "Center Playhead"
 msgstr ""
 
-#: editor_actions.cc:287
+#: editor_actions.cc:309
 msgid "Center Edit Point"
 msgstr ""
 
-#: editor_actions.cc:289
+#: editor_actions.cc:311
 msgid "Playhead Forward"
 msgstr ""
 
-#: editor_actions.cc:290
+#: editor_actions.cc:312
 msgid "Playhead Backward"
 msgstr ""
 
-#: editor_actions.cc:292
+#: editor_actions.cc:314
 msgid "Playhead to Active Mark"
 msgstr ""
 
-#: editor_actions.cc:293
+#: editor_actions.cc:315
 msgid "Active Mark to Playhead"
 msgstr ""
 
-#: editor_actions.cc:295
+#: editor_actions.cc:317
 msgid "Use Skip Ranges"
 msgstr ""
 
-#: editor_actions.cc:302
+#: editor_actions.cc:324
 msgid "Play Selected Regions"
 msgstr ""
 
-#: editor_actions.cc:304
+#: editor_actions.cc:326
 msgid "Play from Edit Point and Return"
 msgstr ""
 
-#: editor_actions.cc:306
+#: editor_actions.cc:328
 msgid "Play Edit Range"
 msgstr ""
 
-#: editor_actions.cc:308
+#: editor_actions.cc:330
 msgid "Playhead to Mouse"
 msgstr ""
 
-#: editor_actions.cc:309
+#: editor_actions.cc:331
 msgid "Active Marker to Mouse"
 msgstr ""
 
-#: editor_actions.cc:319
+#: editor_actions.cc:341
 msgid "Undo Selection Change"
 msgstr ""
 
-#: editor_actions.cc:320
+#: editor_actions.cc:342
 msgid "Redo Selection Change"
 msgstr ""
 
-#: editor_actions.cc:322
+#: editor_actions.cc:344
 msgid "Export Audio"
 msgstr ""
 
-#: editor_actions.cc:323 export_dialog.cc:396
+#: editor_actions.cc:345 export_dialog.cc:476
 msgid "Export Range"
 msgstr ""
 
-#: editor_actions.cc:328
+#: editor_actions.cc:350
 msgid "Separate Using Punch Range"
 msgstr ""
 
-#: editor_actions.cc:331
+#: editor_actions.cc:353
 msgid "Separate Using Loop Range"
 msgstr ""
 
-#: editor_actions.cc:334 editor_actions.cc:356
+#: editor_actions.cc:356 editor_actions.cc:379
 msgid "Crop"
-msgstr ""
+msgstr "Cortar"
 
-#: editor_actions.cc:344
+#: editor_actions.cc:366
 msgid "Fade Range Selection"
 msgstr ""
 
-#: editor_actions.cc:346
+#: editor_actions.cc:368
 msgid "Set Tempo from Edit Range = Bar"
 msgstr ""
 
-#: editor_actions.cc:348
+#: editor_actions.cc:371
 msgid "Log"
 msgstr ""
 
-#: editor_actions.cc:351 editor_actions.cc:353
+#: editor_actions.cc:374 editor_actions.cc:376
 msgid "Move to Next Transient"
 msgstr ""
 
-#: editor_actions.cc:352 editor_actions.cc:354
+#: editor_actions.cc:375 editor_actions.cc:377
 msgid "Move to Previous Transient"
 msgstr ""
 
-#: editor_actions.cc:358 editor_actions.cc:361
+#: editor_actions.cc:381
+msgid "Start Range from Playhead"
+msgstr ""
+
+#: editor_actions.cc:382
+msgid "Finish Range from Playhead"
+msgstr ""
+
+#: editor_actions.cc:384 editor_actions.cc:393
 msgid "Start Range"
 msgstr ""
 
-#: editor_actions.cc:359 editor_actions.cc:362
+#: editor_actions.cc:385 editor_actions.cc:394
 msgid "Finish Range"
 msgstr ""
 
-#: editor_actions.cc:394
+#: editor_actions.cc:387
+msgid "Start Punch Range"
+msgstr ""
+
+#: editor_actions.cc:388
+msgid "Finish Punch Range"
+msgstr ""
+
+#: editor_actions.cc:390
+msgid "Start Loop Range"
+msgstr ""
+
+#: editor_actions.cc:391
+msgid "Finish Loop Range"
+msgstr ""
+
+#: editor_actions.cc:426
 msgid "Follow Playhead"
 msgstr ""
 
-#: editor_actions.cc:395
+#: editor_actions.cc:427
 msgid "Remove Last Capture"
 msgstr ""
 
-#: editor_actions.cc:397
+#: editor_actions.cc:429
 msgid "Stationary Playhead"
 msgstr ""
 
-#: editor_actions.cc:399 insert_time_dialog.cc:32
+#: editor_actions.cc:431 insert_remove_time_dialog.cc:32
 msgid "Insert Time"
 msgstr ""
 
-#: editor_actions.cc:402
+#: editor_actions.cc:433 insert_remove_time_dialog.cc:32
+msgid "Remove Time"
+msgstr ""
+
+#: editor_actions.cc:438
 msgid "Toggle Active"
 msgstr ""
 
-#: editor_actions.cc:407 editor_actions.cc:1768 editor_markers.cc:921
-#: editor_markers.cc:986 editor_snapshots.cc:122 mixer_strip.cc:1543
-#: route_time_axis.cc:856
+#: editor_actions.cc:440 editor_actions.cc:1785 editor_markers.cc:926
+#: editor_markers.cc:999 editor_markers.cc:1019 editor_snapshots.cc:134
+#: lua_script_manager.cc:32 lua_script_manager.cc:36 mixer_strip.cc:1713
+#: route_time_axis.cc:870 vca_master_strip.cc:400
 msgid "Remove"
 msgstr "Remover"
 
-#: editor_actions.cc:411
+#: editor_actions.cc:445
 msgid "Fit Selection (Vertical)"
 msgstr ""
 
-#: editor_actions.cc:413 time_axis_view.cc:1371
+#: editor_actions.cc:447 time_axis_view.cc:1287
 msgid "Largest"
 msgstr "Enorme"
 
-#: editor_actions.cc:416 time_axis_view.cc:1372
+#: editor_actions.cc:450 time_axis_view.cc:1288
 msgid "Larger"
 msgstr "Maior"
 
-#: editor_actions.cc:419 editor_rulers.cc:249 time_axis_view.cc:1373
+#: editor_actions.cc:453 editor_rulers.cc:248 time_axis_view.cc:1289
 msgid "Large"
 msgstr "Grande"
 
-#: editor_actions.cc:425 editor_rulers.cc:253 time_axis_view.cc:1375
+#: editor_actions.cc:459 editor_rulers.cc:252 time_axis_view.cc:1291
 msgid "Small"
 msgstr "Pequeno"
 
-#: editor_actions.cc:429
+#: editor_actions.cc:463
 msgid "Sound Selected MIDI Notes"
 msgstr ""
 
-#: editor_actions.cc:434
+#: editor_actions.cc:468
 msgid "Zoom Focus Left"
 msgstr ""
 
-#: editor_actions.cc:435
+#: editor_actions.cc:469
 msgid "Zoom Focus Right"
 msgstr ""
 
-#: editor_actions.cc:436
+#: editor_actions.cc:470
 msgid "Zoom Focus Center"
 msgstr ""
 
-#: editor_actions.cc:437
+#: editor_actions.cc:471
 msgid "Zoom Focus Playhead"
 msgstr ""
 
-#: editor_actions.cc:438
+#: editor_actions.cc:472
 msgid "Zoom Focus Mouse"
 msgstr ""
 
-#: editor_actions.cc:439
+#: editor_actions.cc:473
 msgid "Zoom Focus Edit Point"
 msgstr ""
 
-#: editor_actions.cc:441
+#: editor_actions.cc:475
 msgid "Next Zoom Focus"
 msgstr ""
 
-#: editor_actions.cc:447
+#: editor_actions.cc:488
 msgid "Smart Object Mode"
 msgstr ""
 
-#: editor_actions.cc:450
+#: editor_actions.cc:491
 msgid "Smart"
 msgstr ""
 
-#: editor_actions.cc:453
+#: editor_actions.cc:494
 msgid "Object Tool"
 msgstr ""
 
-#: editor_actions.cc:458
+#: editor_actions.cc:499
 msgid "Range Tool"
 msgstr ""
 
-#: editor_actions.cc:463
+#: editor_actions.cc:504
 msgid "Note Drawing Tool"
 msgstr ""
 
-#: editor_actions.cc:468
+#: editor_actions.cc:509
 msgid "Audition Tool"
 msgstr ""
 
-#: editor_actions.cc:473
+#: editor_actions.cc:514
 msgid "Time FX Tool"
 msgstr ""
 
-#: editor_actions.cc:478
+#: editor_actions.cc:519
 msgid "Content Tool"
 msgstr ""
 
-#: editor_actions.cc:484
+#: editor_actions.cc:525
 msgid "Cut Tool"
 msgstr ""
 
-#: editor_actions.cc:490
+#: editor_actions.cc:531
 msgid "Step Mouse Mode"
 msgstr ""
 
-#: editor_actions.cc:497
+#: editor_actions.cc:538
 msgid "Change Edit Point"
 msgstr ""
 
-#: editor_actions.cc:498
+#: editor_actions.cc:539
 msgid "Change Edit Point Including Marker"
 msgstr ""
 
-#: editor_actions.cc:504
+#: editor_actions.cc:544
+msgid "EditMode|Lock"
+msgstr ""
+
+#: editor_actions.cc:545
 msgid "Cycle Edit Mode"
 msgstr ""
 
-#: editor_actions.cc:506
+#: editor_actions.cc:547
 msgid "Snap to"
 msgstr ""
 
-#: editor_actions.cc:507
+#: editor_actions.cc:548
 msgid "Snap Mode"
 msgstr "Modo de Ajuste"
 
-#: editor_actions.cc:514
+#: editor_actions.cc:555
 msgid "Next Snap Mode"
 msgstr ""
 
-#: editor_actions.cc:515
+#: editor_actions.cc:556
 msgid "Next Snap Choice"
 msgstr ""
 
-#: editor_actions.cc:516
+#: editor_actions.cc:557
 msgid "Next Musical Snap Choice"
 msgstr ""
 
-#: editor_actions.cc:517
+#: editor_actions.cc:558
 msgid "Previous Snap Choice"
 msgstr ""
 
-#: editor_actions.cc:518
+#: editor_actions.cc:559
 msgid "Previous Musical Snap Choice"
 msgstr ""
 
-#: editor_actions.cc:523
+#: editor_actions.cc:564
 msgid "Snap to CD Frame"
 msgstr ""
 
-#: editor_actions.cc:524
+#: editor_actions.cc:565
 msgid "Snap to Timecode Frame"
 msgstr ""
 
-#: editor_actions.cc:525
+#: editor_actions.cc:566
 msgid "Snap to Timecode Seconds"
 msgstr ""
 
-#: editor_actions.cc:526
+#: editor_actions.cc:567
 msgid "Snap to Timecode Minutes"
 msgstr ""
 
-#: editor_actions.cc:527
+#: editor_actions.cc:568
 msgid "Snap to Seconds"
 msgstr ""
 
-#: editor_actions.cc:528
+#: editor_actions.cc:569
 msgid "Snap to Minutes"
 msgstr ""
 
-#: editor_actions.cc:530
+#: editor_actions.cc:571
 msgid "Snap to One Twenty Eighths"
 msgstr ""
 
-#: editor_actions.cc:531
+#: editor_actions.cc:572
 msgid "Snap to Sixty Fourths"
 msgstr ""
 
-#: editor_actions.cc:532
+#: editor_actions.cc:573
 msgid "Snap to Thirty Seconds"
 msgstr ""
 
-#: editor_actions.cc:533
+#: editor_actions.cc:574
 msgid "Snap to Twenty Eighths"
 msgstr ""
 
-#: editor_actions.cc:534
+#: editor_actions.cc:575
 msgid "Snap to Twenty Fourths"
 msgstr ""
 
-#: editor_actions.cc:535
+#: editor_actions.cc:576
 msgid "Snap to Twentieths"
 msgstr ""
 
-#: editor_actions.cc:536
+#: editor_actions.cc:577
 msgid "Snap to Sixteenths"
 msgstr ""
 
-#: editor_actions.cc:537
+#: editor_actions.cc:578
 msgid "Snap to Fourteenths"
 msgstr ""
 
-#: editor_actions.cc:538
+#: editor_actions.cc:579
 msgid "Snap to Twelfths"
 msgstr ""
 
-#: editor_actions.cc:539
+#: editor_actions.cc:580
 msgid "Snap to Tenths"
 msgstr ""
 
-#: editor_actions.cc:540
+#: editor_actions.cc:581
 msgid "Snap to Eighths"
 msgstr ""
 
-#: editor_actions.cc:541
+#: editor_actions.cc:582
 msgid "Snap to Sevenths"
 msgstr ""
 
-#: editor_actions.cc:542
+#: editor_actions.cc:583
 msgid "Snap to Sixths"
 msgstr ""
 
-#: editor_actions.cc:543
+#: editor_actions.cc:584
 msgid "Snap to Fifths"
 msgstr ""
 
-#: editor_actions.cc:544
+#: editor_actions.cc:585
 msgid "Snap to Quarters"
 msgstr ""
 
-#: editor_actions.cc:545
+#: editor_actions.cc:586
 msgid "Snap to Thirds"
 msgstr ""
 
-#: editor_actions.cc:546
+#: editor_actions.cc:587
 msgid "Snap to Halves"
 msgstr ""
 
-#: editor_actions.cc:548
+#: editor_actions.cc:589
 msgid "Snap to Beat"
 msgstr ""
 
-#: editor_actions.cc:549
+#: editor_actions.cc:590
 msgid "Snap to Bar"
 msgstr ""
 
-#: editor_actions.cc:550
+#: editor_actions.cc:591
 msgid "Snap to Mark"
 msgstr ""
 
-#: editor_actions.cc:551
+#: editor_actions.cc:592
 msgid "Snap to Region Start"
 msgstr ""
 
-#: editor_actions.cc:552
+#: editor_actions.cc:593
 msgid "Snap to Region End"
 msgstr ""
 
-#: editor_actions.cc:553
+#: editor_actions.cc:594
 msgid "Snap to Region Sync"
 msgstr ""
 
-#: editor_actions.cc:554
+#: editor_actions.cc:595
 msgid "Snap to Region Boundary"
 msgstr ""
 
-#: editor_actions.cc:556
+#: editor_actions.cc:597
 msgid "Show Marker Lines"
 msgstr ""
 
-#: editor_actions.cc:566
+#: editor_actions.cc:607
 msgid "Loop/Punch"
 msgstr ""
 
-#: editor_actions.cc:570
+#: editor_actions.cc:611
 msgid "Min:Sec"
 msgstr ""
 
-#: editor_actions.cc:572 editor_actions.cc:575 editor_rulers.cc:271
+#: editor_actions.cc:613 editor_actions.cc:616 editor_rulers.cc:270
+#: rc_option_editor.cc:1592
 msgid "Video Monitor"
-msgstr ""
+msgstr "Monitor de Vídeo"
 
-#: editor_actions.cc:574 rc_option_editor.cc:2260
+#: editor_actions.cc:615 rc_option_editor.cc:2844
 msgid "Video"
-msgstr ""
+msgstr "Vídeo"
 
-#: editor_actions.cc:577
+#: editor_actions.cc:618
 msgid "Always on Top"
-msgstr ""
+msgstr "Sempre Visível"
 
-#: editor_actions.cc:579
+#: editor_actions.cc:620
 msgid "Frame number"
 msgstr ""
 
-#: editor_actions.cc:580
+#: editor_actions.cc:621
 msgid "Timecode Background"
 msgstr ""
 
-#: editor_actions.cc:581
+#: editor_actions.cc:622
 msgid "Fullscreen"
-msgstr ""
+msgstr "Tela Cheia"
 
-#: editor_actions.cc:582
+#: editor_actions.cc:623
 msgid "Letterbox"
 msgstr ""
 
-#: editor_actions.cc:583
+#: editor_actions.cc:624
 msgid "Original Size"
 msgstr ""
 
-#: editor_actions.cc:640
+#: editor_actions.cc:681
 msgid "Sort"
 msgstr ""
 
-#: editor_actions.cc:651 editor_routes.cc:476 mixer_ui.cc:1196
+#: editor_actions.cc:692 editor_routes.cc:549 mixer_ui.cc:1497
 msgid "Show All"
 msgstr "Mostrar Tudo"
 
-#: editor_actions.cc:652
+#: editor_actions.cc:693
 msgid "Show Automatic Regions"
 msgstr ""
 
-#: editor_actions.cc:654
+#: editor_actions.cc:695
 msgid "Ascending"
 msgstr "Ascendente"
 
-#: editor_actions.cc:656
+#: editor_actions.cc:697
 msgid "Descending"
 msgstr "Descendente"
 
-#: editor_actions.cc:659
+#: editor_actions.cc:700
 msgid "By Region Name"
 msgstr "Por Nome da Região"
 
-#: editor_actions.cc:661
+#: editor_actions.cc:702
 msgid "By Region Length"
 msgstr "Por Tamanho da Região"
 
-#: editor_actions.cc:663
+#: editor_actions.cc:704
 msgid "By Region Position"
 msgstr "Por Posição da Região"
 
-#: editor_actions.cc:665
+#: editor_actions.cc:706
 msgid "By Region Timestamp"
-msgstr "Por tempo data/hora da Região"
+msgstr "Por Fuso Horário da Região"
 
-#: editor_actions.cc:667
+#: editor_actions.cc:708
 msgid "By Region Start in File"
 msgstr "Por posição inicial da Região no arquivo"
 
-#: editor_actions.cc:669
+#: editor_actions.cc:710
 msgid "By Region End in File"
 msgstr "Por posição final da Região no arquivo"
 
-#: editor_actions.cc:671
+#: editor_actions.cc:712
 msgid "By Source File Name"
 msgstr "Por nome original do arquivo"
 
-#: editor_actions.cc:673
+#: editor_actions.cc:714
 msgid "By Source File Length"
 msgstr "Por tamanho do arquivo original"
 
-#: editor_actions.cc:675
+#: editor_actions.cc:716
 msgid "By Source File Creation Date"
 msgstr "Por data de criação do arquivo original"
 
-#: editor_actions.cc:677
+#: editor_actions.cc:718
 msgid "By Source Filesystem"
 msgstr "Por sistema de arquivos original"
 
-#: editor_actions.cc:680
+#: editor_actions.cc:721
 msgid "Remove Unused"
 msgstr ""
 
-#: editor_actions.cc:684 editor_audio_import.cc:282
-#: session_import_dialog.cc:75 session_import_dialog.cc:95
-#: session_metadata_dialog.cc:418 editor_videotimeline.cc:91
+#: editor_actions.cc:723
+msgid "Import PT session"
+msgstr ""
+
+#: editor_actions.cc:728 editor_audio_import.cc:282 editor_pt_import.cc:149
+#: luawindow.cc:99 session_import_dialog.cc:75 session_import_dialog.cc:95
+#: session_metadata_dialog.cc:421 sfdb_ui.cc:558 editor_videotimeline.cc:91
 msgid "Import"
 msgstr "Importar"
 
-#: editor_actions.cc:687
+#: editor_actions.cc:731
 msgid "Import to Region List..."
 msgstr ""
 
-#: editor_actions.cc:690 session_import_dialog.cc:44
-msgid "Import From Session"
+#: editor_actions.cc:734 session_import_dialog.cc:44
+#: session_import_dialog.cc:65
+msgid "Import from Session"
 msgstr ""
 
-#: editor_actions.cc:694
+#: editor_actions.cc:738
 msgid "Bring all media into session folder"
 msgstr ""
 
-#: editor_actions.cc:697
+#: editor_actions.cc:741
 msgid "Show Summary"
 msgstr ""
 
-#: editor_actions.cc:699
+#: editor_actions.cc:743
 msgid "Show Group Tabs"
 msgstr ""
 
-#: editor_actions.cc:701
+#: editor_actions.cc:745
 msgid "Show Measure Lines"
 msgstr ""
 
-#: editor_actions.cc:705
-msgid "Show Logo"
-msgstr ""
-
-#: editor_actions.cc:709
+#: editor_actions.cc:747
 msgid "Toggle MIDI Input Active for Editor-Selected Tracks/Busses"
 msgstr ""
 
-#: editor_actions.cc:732
-msgid "Loaded editor bindings from %1"
-msgstr ""
-
-#: editor_actions.cc:734
-msgid "Could not find editor.bindings in search path %1"
-msgstr ""
-
-#: editor_actions.cc:1078 editor_actions.cc:1474 editor_actions.cc:1485
-#: editor_actions.cc:1538 editor_actions.cc:1549 editor_actions.cc:1596
-#: editor_actions.cc:1606 editor_regions.cc:1563
+#: editor_actions.cc:1081 editor_actions.cc:1477 editor_actions.cc:1488
+#: editor_actions.cc:1541 editor_actions.cc:1552 editor_actions.cc:1599
+#: editor_actions.cc:1609 editor_regions.cc:1657 luainstance.cc:330
+#: luainstance.cc:1708
 msgid "programming error: %1: %2"
 msgstr ""
 
-#: editor_actions.cc:1774
+#: editor_actions.cc:1791
 msgid "Raise"
 msgstr ""
 
-#: editor_actions.cc:1777
+#: editor_actions.cc:1794
 msgid "Raise to Top"
 msgstr ""
 
-#: editor_actions.cc:1780
+#: editor_actions.cc:1797
 msgid "Lower"
 msgstr ""
 
-#: editor_actions.cc:1783
+#: editor_actions.cc:1800
 msgid "Lower to Bottom"
 msgstr ""
 
-#: editor_actions.cc:1786
+#: editor_actions.cc:1803
 msgid "Move to Original Position"
 msgstr ""
 
-#: editor_actions.cc:1791
+#: editor_actions.cc:1808
 msgid "Lock to Video"
 msgstr ""
 
-#: editor_actions.cc:1796 editor_markers.cc:912
+#: editor_actions.cc:1813 editor_markers.cc:917
 msgid "Glue to Bars and Beats"
 msgstr ""
 
-#: editor_actions.cc:1801
+#: editor_actions.cc:1818
 msgid "Remove Sync"
 msgstr ""
 
-#: editor_actions.cc:1804 mixer_strip.cc:2006 monitor_section.cc:272
-#: route_time_axis.cc:253 route_time_axis.cc:526
+#: editor_actions.cc:1821 mixer_strip.cc:2200 monitor_section.cc:253
+#: monitor_section.cc:321 route_time_axis.cc:264 route_time_axis.cc:550
 msgid "Mute"
 msgstr "Mutar"
 
-#: editor_actions.cc:1807
+#: editor_actions.cc:1824
 msgid "Normalize..."
 msgstr ""
 
-#: editor_actions.cc:1810
+#: editor_actions.cc:1827
 msgid "Reverse"
 msgstr "Inverter horizontalmente"
 
-#: editor_actions.cc:1813
+#: editor_actions.cc:1830
 msgid "Make Mono Regions"
 msgstr ""
 
-#: editor_actions.cc:1816
+#: editor_actions.cc:1833
 msgid "Boost Gain"
 msgstr ""
 
-#: editor_actions.cc:1819
+#: editor_actions.cc:1836
 msgid "Cut Gain"
 msgstr ""
 
-#: editor_actions.cc:1822
+#: editor_actions.cc:1839
 msgid "Pitch Shift..."
 msgstr ""
 
-#: editor_actions.cc:1825
-msgid "Transpose..."
-msgstr ""
-
-#: editor_actions.cc:1828
+#: editor_actions.cc:1845
 msgid "Opaque"
 msgstr ""
 
-#: editor_actions.cc:1832 editor_regions.cc:117
+#: editor_actions.cc:1849 editor_regions.cc:164
 msgid "Fade In"
 msgstr "Fade In"
 
-#: editor_actions.cc:1837 editor_regions.cc:118
+#: editor_actions.cc:1854 editor_regions.cc:165
 msgid "Fade Out"
 msgstr "Fade Out"
 
-#: editor_actions.cc:1852
+#: editor_actions.cc:1869
 msgid "Multi-Duplicate..."
 msgstr ""
 
-#: editor_actions.cc:1857
+#: editor_actions.cc:1874
 msgid "Fill Track"
 msgstr "Preencher Trilha"
 
-#: editor_actions.cc:1861 editor_markers.cc:1000
+#: editor_actions.cc:1878 editor_markers.cc:1033
 msgid "Set Loop Range"
 msgstr "Marcar um intervalo de loop"
 
-#: editor_actions.cc:1868
+#: editor_actions.cc:1885
 msgid "Set Punch"
 msgstr ""
 
-#: editor_actions.cc:1872
+#: editor_actions.cc:1889
 msgid "Add Single Range Marker"
 msgstr ""
 
-#: editor_actions.cc:1877
+#: editor_actions.cc:1894
 msgid "Add Range Marker Per Region"
 msgstr ""
 
-#: editor_actions.cc:1881
-msgid "Snap Position To Grid"
+#: editor_actions.cc:1898
+msgid "Snap Position to Grid"
 msgstr ""
 
-#: editor_actions.cc:1884
+#: editor_actions.cc:1901
 msgid "Close Gaps"
 msgstr ""
 
-#: editor_actions.cc:1887
+#: editor_actions.cc:1904
 msgid "Rhythm Ferret..."
 msgstr ""
 
-#: editor_actions.cc:1890
+#: editor_actions.cc:1907
 msgid "Export..."
-msgstr ""
+msgstr "Exportar"
 
-#: editor_actions.cc:1896
+#: editor_actions.cc:1913
 msgid "Separate Under"
 msgstr ""
 
-#: editor_actions.cc:1900 editor_actions.cc:1901
+#: editor_actions.cc:1917 editor_actions.cc:1918
 msgid "Set Fade In Length"
 msgstr ""
 
-#: editor_actions.cc:1902 editor_actions.cc:1903
+#: editor_actions.cc:1919 editor_actions.cc:1920
 msgid "Set Fade Out Length"
 msgstr ""
 
-#: editor_actions.cc:1905
+#: editor_actions.cc:1922
 msgid "Set Tempo from Region = Bar"
 msgstr ""
 
-#: editor_actions.cc:1910
+#: editor_actions.cc:1927
 msgid "Split at Percussion Onsets"
 msgstr ""
 
-#: editor_actions.cc:1915
+#: editor_actions.cc:1932
 msgid "List Editor..."
 msgstr ""
 
-#: editor_actions.cc:1918
+#: editor_actions.cc:1935
 msgid "Properties..."
-msgstr ""
+msgstr "Propriedades"
 
-#: editor_actions.cc:1922
+#: editor_actions.cc:1939
 msgid "Bounce (with processing)"
 msgstr ""
 
-#: editor_actions.cc:1923
+#: editor_actions.cc:1940
 msgid "Bounce (without processing)"
 msgstr ""
 
-#: editor_actions.cc:1924
+#: editor_actions.cc:1941
 msgid "Combine"
 msgstr ""
 
-#: editor_actions.cc:1925
+#: editor_actions.cc:1942
 msgid "Uncombine"
 msgstr ""
 
-#: editor_actions.cc:1927
+#: editor_actions.cc:1944
+msgid "Loudness Analysis..."
+msgstr "Análise de Volume"
+
+#: editor_actions.cc:1945
 msgid "Spectral Analysis..."
-msgstr ""
+msgstr "Análise Espectral"
 
-#: editor_actions.cc:1929
+#: editor_actions.cc:1947
 msgid "Reset Envelope"
 msgstr ""
 
-#: editor_actions.cc:1931
+#: editor_actions.cc:1949
 msgid "Reset Gain"
 msgstr ""
 
-#: editor_actions.cc:1936
+#: editor_actions.cc:1954
 msgid "Envelope Active"
 msgstr ""
 
-#: editor_actions.cc:1944 editor_actions.cc:1945
+#: editor_actions.cc:1962 editor_actions.cc:1963
 msgid "Insert Patch Change..."
 msgstr ""
 
-#: editor_actions.cc:1946
+#: editor_actions.cc:1964
 msgid "Unlink from other copies"
 msgstr ""
 
-#: editor_actions.cc:1947
+#: editor_actions.cc:1965
 msgid "Strip Silence..."
 msgstr ""
 
-#: editor_actions.cc:1948
+#: editor_actions.cc:1966
 msgid "Set Range Selection"
 msgstr ""
 
-#: editor_actions.cc:1950 editor_actions.cc:1951
+#: editor_actions.cc:1968 editor_actions.cc:1969
 msgid "Nudge Later"
 msgstr ""
 
-#: editor_actions.cc:1952 editor_actions.cc:1953
+#: editor_actions.cc:1970 editor_actions.cc:1971
 msgid "Nudge Earlier"
 msgstr ""
 
-#: editor_actions.cc:1955
+#: editor_actions.cc:1973
 msgid "Sequence Regions"
 msgstr ""
 
-#: editor_actions.cc:1960
+#: editor_actions.cc:1978
 msgid "Nudge Later by Capture Offset"
 msgstr ""
 
-#: editor_actions.cc:1967
+#: editor_actions.cc:1985
 msgid "Nudge Earlier by Capture Offset"
 msgstr ""
 
-#: editor_actions.cc:1971
+#: editor_actions.cc:1989
 msgid "Trim to Loop"
 msgstr ""
 
-#: editor_actions.cc:1972
+#: editor_actions.cc:1990
 msgid "Trim to Punch"
 msgstr ""
 
-#: editor_actions.cc:1974
+#: editor_actions.cc:1992
 msgid "Trim to Previous"
 msgstr ""
 
-#: editor_actions.cc:1975
+#: editor_actions.cc:1993
 msgid "Trim to Next"
 msgstr ""
 
-#: editor_actions.cc:1982
-msgid "Insert Region From Region List"
+#: editor_actions.cc:2000
+msgid "Insert Region from Region List"
 msgstr ""
 
-#: editor_actions.cc:1988
+#: editor_actions.cc:2006
 msgid "Set Sync Position"
 msgstr ""
 
-#: editor_actions.cc:1989
+#: editor_actions.cc:2007
 msgid "Place Transient"
 msgstr ""
 
-#: editor_actions.cc:1990
+#: editor_actions.cc:2008
 msgid "Split/Separate"
-msgstr ""
+msgstr "Dividir/Separar"
 
-#: editor_actions.cc:1991
+#: editor_actions.cc:2009
 msgid "Trim Start at Edit Point"
 msgstr ""
 
-#: editor_actions.cc:1992
+#: editor_actions.cc:2010
 msgid "Trim End at Edit Point"
 msgstr ""
 
-#: editor_actions.cc:1997
+#: editor_actions.cc:2015
 msgid "Align Start"
 msgstr ""
 
-#: editor_actions.cc:2004
+#: editor_actions.cc:2022
 msgid "Align Start Relative"
 msgstr ""
 
-#: editor_actions.cc:2008
+#: editor_actions.cc:2026
 msgid "Align End"
-msgstr ""
+msgstr "Alinhas Fim"
 
-#: editor_actions.cc:2013
+#: editor_actions.cc:2031
 msgid "Align End Relative"
 msgstr ""
 
-#: editor_actions.cc:2020
+#: editor_actions.cc:2038
 msgid "Align Sync"
 msgstr ""
 
-#: editor_actions.cc:2027
+#: editor_actions.cc:2045
 msgid "Align Sync Relative"
 msgstr ""
 
-#: editor_actions.cc:2031 editor_actions.cc:2034
+#: editor_actions.cc:2049 editor_actions.cc:2050
 msgid "Choose Top..."
 msgstr ""
 
@@ -4448,238 +5028,308 @@ msgid ""
 "%2 as a new source, or skip it?"
 msgstr ""
 
-#: editor_audio_import.cc:282 editor_videotimeline.cc:91
+#: editor_audio_import.cc:282 editor_pt_import.cc:149
+#: editor_videotimeline.cc:91
 msgid "Cancel Import"
 msgstr "Cancelar importação"
 
-#: editor_audio_import.cc:559
+#: editor_audio_import.cc:565
 msgid "Editor: cannot open file \"%1\", (%2)"
 msgstr ""
 
-#: editor_audio_import.cc:567
+#: editor_audio_import.cc:573
 msgid "Cancel entire import"
 msgstr ""
 
-#: editor_audio_import.cc:568
+#: editor_audio_import.cc:574
 msgid "Don't embed it"
 msgstr ""
 
-#: editor_audio_import.cc:569
+#: editor_audio_import.cc:575
 msgid "Embed all without questions"
 msgstr ""
 
-#: editor_audio_import.cc:572 editor_audio_import.cc:598
-#: export_format_dialog.cc:60
+#: editor_audio_import.cc:578 editor_audio_import.cc:604
+#: export_format_dialog.cc:68
 msgid "Sample rate"
-msgstr ""
+msgstr "Taxa de Amostragem"
 
-#: editor_audio_import.cc:573 editor_audio_import.cc:599
+#: editor_audio_import.cc:579 editor_audio_import.cc:605
 msgid ""
 "%1\n"
 "This audiofile's sample rate doesn't match the session sample rate!"
 msgstr ""
 
-#: editor_audio_import.cc:595
+#: editor_audio_import.cc:601
 msgid "Embed it anyway"
 msgstr ""
 
-#: editor_canvas_events.cc:1306 editor_drag.cc:1381
+#: editor_pt_import.cc:81
+msgid "You can't import a PT session until you have a session loaded."
+msgstr ""
+
+#: editor_pt_import.cc:86
+msgid "Import PT Session"
+msgstr ""
+
+#: editor_pt_import.cc:97
+msgid "%1: this is only the directory/folder name, not the filename.\n"
+msgstr ""
+
+#: editor_pt_import.cc:132
+msgid "Doesn't seem to be a valid PT session file"
+msgstr ""
+
+#: editor_pt_import.cc:136
+msgid ""
+"PT v%1 Session @ %2Hz\n"
+"\n"
+"%3 audio files\n"
+"%4 regions\n"
+"%5 active regions\n"
+"\n"
+"Continue..."
+msgstr ""
+
+#: editor_pt_import.cc:175
+msgid ""
+"Failed to load one or more of the audio files, but continuing to attempt "
+"import."
+msgstr ""
+
+#: editor_pt_import.cc:178
+msgid "Success! Import should complete soon."
+msgstr ""
+
+#: editor_pt_import.cc:263
+msgid "PTImport: UINT_MAX routes? impossible!"
+msgstr ""
+
+#: editor_canvas_events.cc:1296 editor_drag.cc:1418
 msgid "Could not create new track after region placed in the drop zone"
 msgstr ""
 
-#: editor_drag.cc:1266
+#: editor_drag.cc:1306
 msgid "fixed time region drag"
 msgstr ""
 
-#: editor_drag.cc:2214
+#: editor_drag.cc:2249
 msgid "Ripple drag"
 msgstr ""
 
-#: editor_drag.cc:2365 midi_region_view.cc:2813
+#: editor_drag.cc:2311
+msgid "create region"
+msgstr ""
+
+#: editor_drag.cc:2430 midi_region_view.cc:2857
 msgid "resize notes"
 msgstr ""
 
-#: editor_drag.cc:2517
+#: editor_drag.cc:2613 editor_drag.cc:2648
+msgid ""
+"One or more Audio Regions\n"
+"are both Locked and\n"
+"Locked to Video.\n"
+"The video cannot me moved."
+msgstr ""
+
+#: editor_drag.cc:2683
 msgid "Video Start:"
 msgstr ""
 
-#: editor_drag.cc:2519
+#: editor_drag.cc:2685
 msgid "Diff:"
 msgstr ""
 
-#: editor_drag.cc:2538
+#: editor_drag.cc:2707
 msgid "Move Video"
 msgstr ""
 
-#: editor_drag.cc:3046
+#: editor_drag.cc:3176
+msgid "move meter mark"
+msgstr ""
+
+#: editor_drag.cc:3178
 msgid "copy meter mark"
 msgstr ""
 
-#: editor_drag.cc:3054
-msgid "move meter mark"
+#: editor_drag.cc:3278
+msgid "inactive"
+msgstr ""
+
+#: editor_drag.cc:3323
+msgid "move tempo mark"
 msgstr ""
 
-#: editor_drag.cc:3177
+#: editor_drag.cc:3330
 msgid "copy tempo mark"
 msgstr ""
 
-#: editor_drag.cc:3185
-msgid "move tempo mark"
+#: editor_drag.cc:3461
+msgid "dilate tempo"
 msgstr ""
 
-#: editor_drag.cc:3412
+#: editor_drag.cc:3735
 msgid "change fade in length"
 msgstr ""
 
-#: editor_drag.cc:3526
+#: editor_drag.cc:3860
 msgid "change fade out length"
 msgstr ""
 
-#: editor_drag.cc:3880
+#: editor_drag.cc:4238
 msgid "move marker"
 msgstr ""
 
-#: editor_drag.cc:4490
+#: editor_drag.cc:4505 editor_drag.cc:5832
+msgid "automation range move"
+msgstr ""
+
+#: editor_drag.cc:4889
 msgid "An error occurred while executing time stretch operation"
 msgstr ""
 
-#: editor_drag.cc:4947
+#: editor_drag.cc:5350
 msgid "programming_error: %1"
 msgstr ""
 
-#: editor_drag.cc:5016 editor_drag.cc:5026
+#: editor_drag.cc:5419 editor_drag.cc:5429
 msgid "new skip marker"
 msgstr ""
 
-#: editor_drag.cc:5017
+#: editor_drag.cc:5420
 msgid "skip"
 msgstr ""
 
-#: editor_drag.cc:5021 location_ui.cc:56
+#: editor_drag.cc:5424 location_ui.cc:60
 msgid "CD"
 msgstr "CD"
 
-#: editor_drag.cc:5022
+#: editor_drag.cc:5425
 msgid "new CD marker"
 msgstr ""
 
-#: editor_drag.cc:5027 editor_route_groups.cc:437 mixer_ui.cc:1493
+#: editor_drag.cc:5430 editor_route_groups.cc:439 mixer_ui.cc:1840
 msgid "unnamed"
 msgstr ""
 
-#: editor_drag.cc:5309
+#: editor_drag.cc:5739
 msgid "Automation range drag created for invalid region type"
 msgstr ""
 
-#: editor_route_groups.cc:96
+#: editor_route_groups.cc:97
 msgid "Col"
 msgstr ""
 
-#: editor_route_groups.cc:96
+#: editor_route_groups.cc:97
 msgid "Group Tab Color"
 msgstr ""
 
-#: editor_route_groups.cc:97
+#: editor_route_groups.cc:98
 msgid "Name of Group"
-msgstr ""
+msgstr "Nome do Grupo"
 
-#: editor_route_groups.cc:98 editor_routes.cc:207
-msgid "V"
-msgstr ""
+#: editor_route_groups.cc:99 editor_routes.cc:234
+msgid "Visible|V"
+msgstr "Visível|V"
 
-#: editor_route_groups.cc:98
+#: editor_route_groups.cc:99
 msgid "Group is visible?"
-msgstr ""
+msgstr "Grupo é visível?"
 
-#: editor_route_groups.cc:99
+#: editor_route_groups.cc:100
 msgid "On"
-msgstr ""
+msgstr "Ligado"
 
-#: editor_route_groups.cc:99
+#: editor_route_groups.cc:100
 msgid "Group is enabled?"
-msgstr ""
+msgstr "Grupo está ativado?"
 
-#: editor_route_groups.cc:100
-msgid "group|G"
-msgstr ""
+#: editor_route_groups.cc:101
+msgid "Group|G"
+msgstr "Grupo|G"
 
-#: editor_route_groups.cc:100
+#: editor_route_groups.cc:101
 msgid "Sharing Gain?"
-msgstr ""
+msgstr "Ganho compartilhado?"
 
-#: editor_route_groups.cc:101
-msgid "relative|Rel"
+#: editor_route_groups.cc:102
+msgid "Relative|Rel"
 msgstr ""
 
-#: editor_route_groups.cc:101
+#: editor_route_groups.cc:102
 msgid "Relative Gain Changes?"
 msgstr ""
 
-#: editor_route_groups.cc:102
-msgid "mute|M"
+#: editor_route_groups.cc:103 editor_regions.cc:168 editor_routes.cc:239
+#: mixer_strip.cc:2229 meter_strip.cc:365 route_time_axis.cc:2742
+#: time_axis_view.cc:1106
+msgid "Mute|M"
 msgstr ""
 
-#: editor_route_groups.cc:102
+#: editor_route_groups.cc:103
 msgid "Sharing Mute?"
 msgstr ""
 
-#: editor_route_groups.cc:103
-msgid "solo|S"
+#: editor_route_groups.cc:104 editor_routes.cc:240 mixer_strip.cc:2242
+#: meter_strip.cc:373 route_time_axis.cc:2739 vca_master_strip.cc:211
+#: vca_time_axis.cc:236
+msgid "Solo|S"
 msgstr ""
 
-#: editor_route_groups.cc:103
+#: editor_route_groups.cc:104
 msgid "Sharing Solo?"
 msgstr ""
 
-#: editor_route_groups.cc:104 midi_time_axis.cc:1622 midi_time_axis.cc:1625
-#: midi_time_axis.cc:1628
+#: editor_route_groups.cc:105 midi_time_axis.cc:1626 midi_time_axis.cc:1629
+#: midi_time_axis.cc:1632
 msgid "Rec"
 msgstr ""
 
-#: editor_route_groups.cc:104
+#: editor_route_groups.cc:105
 msgid "Sharing Record-enable Status?"
 msgstr ""
 
-#: editor_route_groups.cc:105
-msgid "monitoring|Mon"
+#: editor_route_groups.cc:106
+msgid "Monitoring|Mon"
 msgstr ""
 
-#: editor_route_groups.cc:105
+#: editor_route_groups.cc:106
 msgid "Sharing Monitoring Choice?"
 msgstr ""
 
-#: editor_route_groups.cc:106
-msgid "selection|Sel"
-msgstr ""
+#: editor_route_groups.cc:107
+msgid "Selection|Sel"
+msgstr "Seleção|Sel"
 
-#: editor_route_groups.cc:106
+#: editor_route_groups.cc:107
 msgid "Sharing Selected/Editing Status?"
 msgstr ""
 
-#: editor_route_groups.cc:107
-msgid "active|A"
+#: editor_route_groups.cc:108 editor_routes.cc:235
+msgid "Active|A"
 msgstr ""
 
-#: editor_route_groups.cc:107
+#: editor_route_groups.cc:108
 msgid "Sharing Active Status?"
 msgstr ""
 
-#: editor_export_audio.cc:92 editor_markers.cc:740 editor_markers.cc:827
-#: editor_markers.cc:1012 editor_markers.cc:1030 editor_markers.cc:1048
-#: editor_markers.cc:1067 editor_markers.cc:1086 editor_markers.cc:1116
-#: editor_markers.cc:1147 editor_markers.cc:1177 editor_markers.cc:1205
-#: editor_markers.cc:1236 editor_markers.cc:1261 editor_markers.cc:1312
-#: editor_markers.cc:1356 editor_markers.cc:1382 editor_markers.cc:1576
-#: editor_mouse.cc:2120
+#: editor_export_audio.cc:93 editor_markers.cc:733 editor_markers.cc:832
+#: editor_markers.cc:1045 editor_markers.cc:1063 editor_markers.cc:1081
+#: editor_markers.cc:1100 editor_markers.cc:1119 editor_markers.cc:1149
+#: editor_markers.cc:1180 editor_markers.cc:1210 editor_markers.cc:1238
+#: editor_markers.cc:1269 editor_markers.cc:1294 editor_markers.cc:1345
+#: editor_markers.cc:1458 editor_markers.cc:1484 editor_markers.cc:1678
+#: editor_mouse.cc:2255
 msgid "programming error: marker canvas item has no marker object pointer!"
 msgstr ""
 
-#: editor_export_audio.cc:145 editor_export_audio.cc:150
-msgid "File Exists!"
+#: editor_export_audio.cc:114
+msgid "Confirm MIDI File Overwrite"
 msgstr ""
 
-#: editor_export_audio.cc:153
-msgid "Overwrite Existing File"
+#: editor_export_audio.cc:115 utils_videotl.cc:75
+msgid "A file with the same name already exists. Do you want to overwrite it?"
 msgstr ""
 
 #: editor_group_tabs.cc:176
@@ -4688,306 +5338,347 @@ msgstr ""
 
 #: editor_markers.cc:139
 msgid "start"
-msgstr ""
+msgstr "início"
 
 #: editor_markers.cc:140
 msgid "end"
-msgstr ""
+msgstr "fim"
+
+#: editor_markers.cc:645
+msgid "mark"
+msgstr "marca"
 
-#: editor_markers.cc:657 editor_ops.cc:2085 editor_ops.cc:2107
-#: editor_ops.cc:2164 editor_ops.cc:2193 location_ui.cc:1023
+#: editor_markers.cc:650 editor_ops.cc:2164 editor_ops.cc:2186
+#: editor_ops.cc:2304 editor_ops.cc:2341 location_ui.cc:1049
 msgid "add marker"
 msgstr "adicionar marca"
 
-#: editor_markers.cc:689 editor_markers.cc:1456
+#: editor_markers.cc:682 editor_markers.cc:1558
 msgid "set loop range"
 msgstr ""
 
-#: editor_markers.cc:705 editor_markers.cc:1462
+#: editor_markers.cc:698 editor_markers.cc:1564
 msgid "set punch range"
 msgstr ""
 
-#: editor_markers.cc:722 editor_ops.cc:4055
+#: editor_markers.cc:715 editor_ops.cc:4159
 msgid "range"
 msgstr ""
 
-#: editor_markers.cc:725
+#: editor_markers.cc:718
 msgid "new range marker"
 msgstr ""
 
-#: editor_markers.cc:758 editor_ops.cc:2129 location_ui.cc:859
+#: editor_markers.cc:751 editor_ops.cc:2272 location_ui.cc:885
 msgid "remove marker"
 msgstr "remover marca"
 
-#: editor_markers.cc:894
+#: editor_markers.cc:899
 msgid "Locate to Here"
 msgstr ""
 
-#: editor_markers.cc:895
+#: editor_markers.cc:900
 msgid "Play from Here"
-msgstr ""
+msgstr "Reproduzir daqui"
 
-#: editor_markers.cc:896
+#: editor_markers.cc:901
 msgid "Move Mark to Playhead"
 msgstr ""
 
-#: editor_markers.cc:900
+#: editor_markers.cc:905
 msgid "Create Range to Next Marker"
 msgstr ""
 
-#: editor_markers.cc:941
+#: editor_markers.cc:946
 msgid "Locate to Marker"
 msgstr ""
 
-#: editor_markers.cc:942
+#: editor_markers.cc:947
 msgid "Play from Marker"
 msgstr ""
 
-#: editor_markers.cc:945
+#: editor_markers.cc:950
 msgid "Set Marker from Playhead"
 msgstr ""
 
-#: editor_markers.cc:947
+#: editor_markers.cc:951
 msgid "Set Range from Selection"
 msgstr ""
 
-#: editor_markers.cc:957
+#: editor_markers.cc:960
 msgid "Hide Range"
 msgstr ""
 
-#: editor_markers.cc:958
+#: editor_markers.cc:961
 msgid "Rename Range..."
 msgstr ""
 
-#: editor_markers.cc:962
+#: editor_markers.cc:965
 msgid "Remove Range"
 msgstr ""
 
-#: editor_markers.cc:969
+#: editor_markers.cc:972
 msgid "Separate Regions in Range"
 msgstr ""
 
-#: editor_markers.cc:972
+#: editor_markers.cc:974
 msgid "Select Range"
 msgstr ""
 
-#: editor_markers.cc:1001
+#: editor_markers.cc:987
+msgid "Make Ramped"
+msgstr ""
+
+#: editor_markers.cc:989
+msgid "Make Constant"
+msgstr ""
+
+#: editor_markers.cc:993 editor_markers.cc:1013
+msgid "Lock to Music"
+msgstr ""
+
+#: editor_markers.cc:995 editor_markers.cc:1015
+msgid "Lock to Audio"
+msgstr ""
+
+#: editor_markers.cc:1034
 msgid "Set Punch Range"
 msgstr "Fazer intervalo de inserção"
 
-#: editor_markers.cc:1407 editor_ops.cc:2040
-msgid "New Name:"
+#: editor_markers.cc:1391
+msgid "change meter lock style"
 msgstr ""
 
-#: editor_markers.cc:1410
-msgid "Rename Mark"
+#: editor_markers.cc:1414
+msgid "change tempo lock style"
+msgstr ""
+
+#: editor_markers.cc:1441
+msgid "change tempo type"
 msgstr ""
 
-#: editor_markers.cc:1412
+#: editor_markers.cc:1509 editor_ops.cc:2119
+msgid "New Name:"
+msgstr "Novo Nome"
+
+#: editor_markers.cc:1512
+msgid "Rename Mark"
+msgstr "Renomear Marca"
+
+#: editor_markers.cc:1514
 msgid "Rename Range"
 msgstr ""
 
-#: editor_markers.cc:1419 editor_mouse.cc:2137 processor_box.cc:1994
-#: processor_box.cc:2464 route_time_axis.cc:1100 route_ui.cc:1628
+#: editor_markers.cc:1521 editor_mouse.cc:2272 processor_box.cc:3204
+#: processor_box.cc:3693 route_time_axis.cc:1110 route_ui.cc:1637
+#: vca_master_strip.cc:395
 msgid "Rename"
 msgstr "Renomear"
 
-#: editor_markers.cc:1432
+#: editor_markers.cc:1534
 msgid "rename marker"
 msgstr ""
 
-#: editor_mixer.cc:90
+#: editor_mixer.cc:98
 msgid "This screen is not tall enough to display the editor mixer"
 msgstr ""
 
-#: editor_mouse.cc:1223 editor_mouse.cc:1241 editor_tempodisplay.cc:270
+#: editor_mouse.cc:1345 editor_mouse.cc:1363 editor_tempodisplay.cc:384
 msgid ""
 "programming error: tempo marker canvas item has no marker object pointer!"
 msgstr ""
 
-#: editor_mouse.cc:1228 editor_tempodisplay.cc:275
+#: editor_mouse.cc:1350 editor_tempodisplay.cc:389
 msgid "programming error: marker for tempo is not a tempo marker!"
 msgstr ""
 
-#: editor_mouse.cc:1246 editor_tempodisplay.cc:375
+#: editor_mouse.cc:1368 editor_tempodisplay.cc:507
 msgid "programming error: marker for meter is not a meter marker!"
 msgstr ""
 
-#: editor_mouse.cc:1885 editor_mouse.cc:1910 editor_mouse.cc:1923
+#: editor_mouse.cc:2016 editor_mouse.cc:2041 editor_mouse.cc:2054
 msgid ""
 "programming error: control point canvas item has no control point object "
 "pointer!"
 msgstr ""
 
-#: editor_mouse.cc:2058
+#: editor_mouse.cc:2085
+msgid "edit note(s)"
+msgstr ""
+
+#: editor_mouse.cc:2193
 msgid "start point trim"
 msgstr ""
 
-#: editor_mouse.cc:2083
-msgid "End point trim"
+#: editor_mouse.cc:2218
+msgid "end point trim"
 msgstr ""
 
-#: editor_mouse.cc:2135
+#: editor_mouse.cc:2270
 msgid "Name for region:"
 msgstr "Nome para a região:"
 
-#: editor_ops.cc:165
+#: editor_ops.cc:168
 msgid "split"
 msgstr ""
 
-#: editor_ops.cc:339
+#: editor_ops.cc:342
 msgid "alter selection"
 msgstr ""
 
-#: editor_ops.cc:381
+#: editor_ops.cc:384
 msgid "nudge regions forward"
 msgstr ""
 
-#: editor_ops.cc:404 editor_ops.cc:489
+#: editor_ops.cc:441 editor_ops.cc:535
 msgid "nudge location forward"
 msgstr ""
 
-#: editor_ops.cc:462
+#: editor_ops.cc:472
 msgid "nudge regions backward"
 msgstr ""
 
-#: editor_ops.cc:551
+#: editor_ops.cc:567
 msgid "nudge forward"
 msgstr ""
 
-#: editor_ops.cc:575
+#: editor_ops.cc:591
 msgid "nudge backward"
 msgstr ""
 
-#: editor_ops.cc:618
+#: editor_ops.cc:656
 msgid "sequence regions"
 msgstr ""
 
-#: editor_ops.cc:694
+#: editor_ops.cc:718
 msgid "build_region_boundary_cache called with snap_type = %1"
 msgstr ""
 
-#: editor_ops.cc:2042
+#: editor_ops.cc:2121
 msgid "New Location Marker"
 msgstr ""
 
-#: editor_ops.cc:2164
+#: editor_ops.cc:2212 editor_ops.cc:2236
+msgid "Set session start"
+msgstr ""
+
+#: editor_ops.cc:2304
 msgid "add markers"
 msgstr ""
 
-#: editor_ops.cc:2274
+#: editor_ops.cc:2400
 msgid "clear markers"
 msgstr "limpar marcas"
 
-#: editor_ops.cc:2289
+#: editor_ops.cc:2415
 msgid "clear ranges"
 msgstr "limpar intervalos"
 
-#: editor_ops.cc:2305
+#: editor_ops.cc:2431
 msgid "clear locations"
 msgstr "limpar localizações"
 
-#: editor_ops.cc:2368
+#: editor_ops.cc:2494
 msgid "insert region"
 msgstr ""
 
-#: editor_ops.cc:2559
+#: editor_ops.cc:2685
 msgid "raise regions"
 msgstr ""
 
-#: editor_ops.cc:2561
+#: editor_ops.cc:2687
 msgid "raise region"
 msgstr ""
 
-#: editor_ops.cc:2567
+#: editor_ops.cc:2693
 msgid "raise regions to top"
 msgstr ""
 
-#: editor_ops.cc:2569
+#: editor_ops.cc:2695
 msgid "raise region to top"
 msgstr ""
 
-#: editor_ops.cc:2575
+#: editor_ops.cc:2701
 msgid "lower regions"
 msgstr ""
 
-#: editor_ops.cc:2577 editor_ops.cc:2585
+#: editor_ops.cc:2703 editor_ops.cc:2711
 msgid "lower region"
 msgstr ""
 
-#: editor_ops.cc:2583
+#: editor_ops.cc:2709
 msgid "lower regions to bottom"
 msgstr ""
 
-#: editor_ops.cc:2668
+#: editor_ops.cc:2794
 msgid "Rename Region"
 msgstr ""
 
-#: editor_ops.cc:2670 processor_box.cc:1992 route_ui.cc:1626
+#: editor_ops.cc:2796 processor_box.cc:3202 route_ui.cc:1635
 msgid "New name:"
 msgstr ""
 
-#: editor_ops.cc:2987
+#: editor_ops.cc:3097
 msgid "separate"
 msgstr ""
 
-#: editor_ops.cc:3099
+#: editor_ops.cc:3207
 msgid "separate region under"
 msgstr ""
 
-#: editor_ops.cc:3220
+#: editor_ops.cc:3360
 msgid "trim to selection"
 msgstr ""
 
-#: editor_ops.cc:3356
+#: editor_ops.cc:3442
 msgid "set sync point"
 msgstr ""
 
-#: editor_ops.cc:3380
+#: editor_ops.cc:3466
 msgid "remove region sync"
 msgstr ""
 
-#: editor_ops.cc:3402
+#: editor_ops.cc:3488
 msgid "move regions to original position"
 msgstr ""
 
-#: editor_ops.cc:3404
+#: editor_ops.cc:3490
 msgid "move region to original position"
 msgstr ""
 
-#: editor_ops.cc:3425
+#: editor_ops.cc:3511
 msgid "align selection"
 msgstr ""
 
-#: editor_ops.cc:3499
+#: editor_ops.cc:3585
 msgid "align selection (relative)"
 msgstr ""
 
-#: editor_ops.cc:3533
+#: editor_ops.cc:3619
 msgid "align region"
 msgstr ""
 
-#: editor_ops.cc:3584
+#: editor_ops.cc:3670
 msgid "trim front"
 msgstr ""
 
-#: editor_ops.cc:3584
+#: editor_ops.cc:3670
 msgid "trim back"
 msgstr ""
 
-#: editor_ops.cc:3614
+#: editor_ops.cc:3700
 msgid "trim to loop"
 msgstr ""
 
-#: editor_ops.cc:3624
+#: editor_ops.cc:3710
 msgid "trim to punch"
 msgstr ""
 
-#: editor_ops.cc:3686
+#: editor_ops.cc:3832
 msgid "trim to region"
 msgstr ""
 
-#: editor_ops.cc:3794
+#: editor_ops.cc:3891
 msgid ""
 "This track/bus cannot be frozen because the signal adds or loses channels "
 "before reaching the outputs.\n"
@@ -4995,11 +5686,11 @@ msgid ""
 "input or vice versa."
 msgstr ""
 
-#: editor_ops.cc:3797
+#: editor_ops.cc:3894
 msgid "Cannot freeze"
 msgstr ""
 
-#: editor_ops.cc:3803
+#: editor_ops.cc:3900
 msgid ""
 "<b>%1</b>\n"
 "\n"
@@ -5008,23 +5699,23 @@ msgid ""
 "Freezing will only process the signal as far as the first send/insert/return."
 msgstr ""
 
-#: editor_ops.cc:3807
+#: editor_ops.cc:3904
 msgid "Freeze anyway"
 msgstr ""
 
-#: editor_ops.cc:3808
+#: editor_ops.cc:3905
 msgid "Don't freeze"
 msgstr ""
 
-#: editor_ops.cc:3809
+#: editor_ops.cc:3906
 msgid "Freeze Limits"
 msgstr ""
 
-#: editor_ops.cc:3824
+#: editor_ops.cc:3921
 msgid "Cancel Freeze"
 msgstr ""
 
-#: editor_ops.cc:3854
+#: editor_ops.cc:3952
 msgid ""
 "You can't perform this operation because the processing of the signal will "
 "cause one or more of the tracks to end up with a region with more channels "
@@ -5033,47 +5724,47 @@ msgid ""
 "You can do this without processing, which is a different operation."
 msgstr ""
 
-#: editor_ops.cc:3858
+#: editor_ops.cc:3956
 msgid "Cannot bounce"
 msgstr ""
 
-#: editor_ops.cc:3869
+#: editor_ops.cc:4007
 msgid "bounce range"
 msgstr ""
 
-#: editor_ops.cc:3971
+#: editor_ops.cc:4074
 msgid "delete"
 msgstr ""
 
-#: editor_ops.cc:3974
+#: editor_ops.cc:4077
 msgid "cut"
 msgstr "cortar"
 
-#: editor_ops.cc:3977
+#: editor_ops.cc:4080
 msgid "copy"
 msgstr "copiar"
 
-#: editor_ops.cc:3980
+#: editor_ops.cc:4083
 msgid "clear"
 msgstr "limpar"
 
-#: editor_ops.cc:4028
+#: editor_ops.cc:4132
 msgid "objects"
-msgstr ""
+msgstr "Objetos"
 
-#: editor_ops.cc:4238 editor_ops.cc:4270
+#: editor_ops.cc:4342 editor_ops.cc:4427
 msgid "remove region"
-msgstr ""
+msgstr "remover região"
 
-#: editor_ops.cc:4719
-msgid "duplicate selection"
+#: editor_ops.cc:4844
+msgid "duplicate range selection"
 msgstr ""
 
-#: editor_ops.cc:4803
+#: editor_ops.cc:4938
 msgid "nudge track"
 msgstr ""
 
-#: editor_ops.cc:4840
+#: editor_ops.cc:4965
 msgid ""
 "Do you really want to destroy the last capture?\n"
 "(This is destructive and cannot be undone)"
@@ -5081,136 +5772,156 @@ msgstr ""
 "Você quer realmente remover definitivamente a última captura?\n"
 "(Isto não poderá ser desfeito)"
 
-#: editor_ops.cc:4843 editor_ops.cc:6838 editor_regions.cc:462
-#: editor_snapshots.cc:159 route_ui.cc:1569
+#: editor_ops.cc:4968 editor_ops.cc:7202 editor_regions.cc:503
+#: editor_snapshots.cc:171
 msgid "No, do nothing."
 msgstr "Não, não faça nada."
 
-#: editor_ops.cc:4844
+#: editor_ops.cc:4969
 msgid "Yes, destroy it."
-msgstr "Sim, remova definitivamente isto."
+msgstr "Sim, remover definitivamente."
 
-#: editor_ops.cc:4846
+#: editor_ops.cc:4971
 msgid "Destroy last capture"
 msgstr ""
 
-#: editor_ops.cc:4906
+#: editor_ops.cc:5047
 msgid "normalize"
-msgstr ""
+msgstr "Normalizar"
 
-#: editor_ops.cc:5000
+#: editor_ops.cc:5145
 msgid "reverse regions"
 msgstr "inverter horizontalmente as regiões"
 
-#: editor_ops.cc:5034
+#: editor_ops.cc:5182
 msgid "strip silence"
 msgstr ""
 
-#: editor_ops.cc:5091
+#: editor_ops.cc:5263
 msgid "Fork Region(s)"
 msgstr ""
 
-#: editor_ops.cc:5112
+#: editor_ops.cc:5270
 msgid "Could not unlink %1"
 msgstr ""
 
-#: editor_ops.cc:5326
+#: editor_ops.cc:5532
 msgid "reset region gain"
 msgstr ""
 
-#: editor_ops.cc:5379
+#: editor_ops.cc:5590
 msgid "region gain envelope active"
 msgstr ""
 
-#: editor_ops.cc:5406
+#: editor_ops.cc:5615
 msgid "toggle region lock"
 msgstr ""
 
-#: editor_ops.cc:5430
+#: editor_ops.cc:5639
 msgid "Toggle Video Lock"
 msgstr ""
 
-#: editor_ops.cc:5454
+#: editor_ops.cc:5663
 msgid "region lock style"
 msgstr ""
 
-#: editor_ops.cc:5479
+#: editor_ops.cc:5688
 msgid "change region opacity"
 msgstr ""
 
-#: editor_ops.cc:5572
+#: editor_ops.cc:5781
 msgid "fade range"
 msgstr ""
 
-#: editor_ops.cc:5610
+#: editor_ops.cc:5819
 msgid "set fade in length"
 msgstr ""
 
-#: editor_ops.cc:5617
+#: editor_ops.cc:5826
 msgid "set fade out length"
 msgstr ""
 
-#: editor_ops.cc:5662
+#: editor_ops.cc:5891
 msgid "set fade in shape"
 msgstr ""
 
-#: editor_ops.cc:5693
+#: editor_ops.cc:5926
 msgid "set fade out shape"
 msgstr ""
 
-#: editor_ops.cc:5723
+#: editor_ops.cc:5962
 msgid "set fade in active"
 msgstr ""
 
-#: editor_ops.cc:5752
+#: editor_ops.cc:5996
 msgid "set fade out active"
 msgstr ""
 
-#: editor_ops.cc:5994
+#: editor_ops.cc:6056
+msgid "toggle fade active"
+msgstr ""
+
+#: editor_ops.cc:6249
 msgid "set loop range from selection"
 msgstr ""
 
-#: editor_ops.cc:6008
+#: editor_ops.cc:6263
 msgid "set loop range from region"
 msgstr ""
 
-#: editor_ops.cc:6027
+#: editor_ops.cc:6282
 msgid "set punch range from selection"
 msgstr ""
 
-#: editor_ops.cc:6041
+#: editor_ops.cc:6306
 msgid "set session start/end from selection"
 msgstr ""
 
-#: editor_ops.cc:6066
+#: editor_ops.cc:6344
+msgid "set punch start from EP"
+msgstr ""
+
+#: editor_ops.cc:6372
+msgid "set punch end from EP"
+msgstr ""
+
+#: editor_ops.cc:6405
+msgid "set loop start from EP"
+msgstr ""
+
+#: editor_ops.cc:6433
+msgid "set loop end from EP"
+msgstr ""
+
+#: editor_ops.cc:6444
 msgid "set punch range from region"
 msgstr ""
 
-#: editor_ops.cc:6175
+#: editor_ops.cc:6531
 msgid "Add new marker"
 msgstr ""
 
-#: editor_ops.cc:6176
+#: editor_ops.cc:6532
 msgid "Set global tempo"
 msgstr ""
 
-#: editor_ops.cc:6179
+#: editor_ops.cc:6535
 msgid "Define one bar"
 msgstr ""
 
-#: editor_ops.cc:6180
+#: editor_ops.cc:6536
 msgid "Do you want to set the global tempo or add a new tempo marker?"
 msgstr ""
 
-#: editor_ops.cc:6206
+#: editor_ops.cc:6562
 msgid "set tempo from region"
 msgstr ""
 
-#: editor_ops.cc:6236
+#: editor_ops.cc:6591
 msgid "split regions"
 msgstr ""
 
-#: editor_ops.cc:6278
+#: editor_ops.cc:6633
 msgid ""
 "You are about to split\n"
 "%1\n"
@@ -5218,62 +5929,62 @@ msgid ""
 "This could take a long time."
 msgstr ""
 
-#: editor_ops.cc:6285
+#: editor_ops.cc:6640
 msgid "Call for the Ferret!"
 msgstr ""
 
-#: editor_ops.cc:6286
+#: editor_ops.cc:6641
 msgid ""
 "Press OK to continue with this split operation\n"
 "or ask the Ferret dialog to tune the analysis"
 msgstr ""
 
-#: editor_ops.cc:6288
+#: editor_ops.cc:6643
 msgid "Press OK to continue with this split operation"
 msgstr ""
 
-#: editor_ops.cc:6291
+#: editor_ops.cc:6646
 msgid "Excessive split?"
 msgstr ""
 
-#: editor_ops.cc:6443
+#: editor_ops.cc:6800
 msgid "place transient"
 msgstr ""
 
-#: editor_ops.cc:6478
+#: editor_ops.cc:6834
 msgid "snap regions to grid"
 msgstr ""
 
-#: editor_ops.cc:6517
+#: editor_ops.cc:6873
 msgid "Close Region Gaps"
 msgstr ""
 
-#: editor_ops.cc:6522
+#: editor_ops.cc:6878
 msgid "Crossfade length"
 msgstr ""
 
-#: editor_ops.cc:6531 editor_ops.cc:6542 rhythm_ferret.cc:119
-#: session_option_editor.cc:141
+#: editor_ops.cc:6887 editor_ops.cc:6898 rhythm_ferret.cc:128
+#: rhythm_ferret.cc:143 session_option_editor.cc:141
 msgid "ms"
 msgstr ""
 
-#: editor_ops.cc:6533
+#: editor_ops.cc:6889
 msgid "Pull-back length"
 msgstr ""
 
-#: editor_ops.cc:6546
+#: editor_ops.cc:6902 keyeditor.cc:71
 msgid "Ok"
 msgstr ""
 
-#: editor_ops.cc:6561
+#: editor_ops.cc:6917
 msgid "close region gaps"
 msgstr ""
 
-#: editor_ops.cc:6786 route_ui.cc:1543
+#: editor_ops.cc:7160
 msgid "That would be bad news ...."
 msgstr ""
 
-#: editor_ops.cc:6791 route_ui.cc:1548
+#: editor_ops.cc:7165
 msgid ""
 "Removing the master or monitor bus is such a bad idea\n"
 "that %1 is not going to allow it.\n"
@@ -5283,23 +5994,19 @@ msgid ""
 "\"allow-special-bus-removal\" option to be \"yes\""
 msgstr ""
 
-#: editor_ops.cc:6809
-msgid "tracks"
-msgstr ""
-
-#: editor_ops.cc:6811 route_ui.cc:1992
+#: editor_ops.cc:7181
 msgid "track"
-msgstr ""
-
-#: editor_ops.cc:6815
-msgid "busses"
-msgstr ""
+msgid_plural "tracks"
+msgstr[0] "trilha"
+msgstr[1] "trilhas"
 
-#: editor_ops.cc:6817 route_ui.cc:1992
+#: editor_ops.cc:7182
 msgid "bus"
-msgstr ""
+msgid_plural "busses"
+msgstr[0] ""
+msgstr[1] ""
 
-#: editor_ops.cc:6822
+#: editor_ops.cc:7186
 msgid ""
 "Do you really want to remove %1 %2 and %3 %4?\n"
 "(You may also lose the playlists associated with the %2)\n"
@@ -5307,7 +6014,7 @@ msgid ""
 "This action cannot be undone, and the session file will be overwritten!"
 msgstr ""
 
-#: editor_ops.cc:6827
+#: editor_ops.cc:7191
 msgid ""
 "Do you really want to remove %1 %2?\n"
 "(You may also lose the playlists associated with the %2)\n"
@@ -5315,358 +6022,371 @@ msgid ""
 "This action cannot be undone, and the session file will be overwritten!"
 msgstr ""
 
-#: editor_ops.cc:6833
+#: editor_ops.cc:7197
 msgid ""
 "Do you really want to remove %1 %2?\n"
 "\n"
 "This action cannot be undone, and the session file will be overwritten"
 msgstr ""
 
-#: editor_ops.cc:6840
+#: editor_ops.cc:7204
 msgid "Yes, remove them."
 msgstr ""
 
-#: editor_ops.cc:6842 editor_snapshots.cc:160 route_ui.cc:1570
+#: editor_ops.cc:7206 editor_snapshots.cc:172
 msgid "Yes, remove it."
 msgstr "Sim, remova isto."
 
-#: editor_ops.cc:6847 editor_ops.cc:6849
+#: editor_ops.cc:7211 editor_ops.cc:7213
 msgid "Remove %1"
 msgstr ""
 
-#: editor_ops.cc:6912
+#: editor_ops.cc:7319 editor_ops.cc:7333 editor_ops.cc:7373 editor_ops.cc:7383
 msgid "insert time"
 msgstr ""
 
-#: editor_ops.cc:7076
+#: editor_ops.cc:7436
+msgid "Cannot insert or delete time when in Lock edit."
+msgstr ""
+
+#: editor_ops.cc:7456 editor_ops.cc:7468 editor_ops.cc:7541 editor_ops.cc:7554
+msgid "remove time"
+msgstr ""
+
+#: editor_ops.cc:7628
 msgid "There are too many tracks to fit in the current window"
 msgstr ""
 
-#: editor_ops.cc:7137
+#: editor_ops.cc:7689
 msgid "Sel"
 msgstr ""
 
-#: editor_ops.cc:7176
+#: editor_ops.cc:7728
 #, c-format
 msgid "Saved view %u"
 msgstr ""
 
-#: editor_ops.cc:7201
+#: editor_ops.cc:7753
 msgid "mute regions"
 msgstr ""
 
-#: editor_ops.cc:7203
+#: editor_ops.cc:7755
 msgid "mute region"
 msgstr ""
 
-#: editor_ops.cc:7240
+#: editor_ops.cc:7792
 msgid "combine regions"
 msgstr ""
 
-#: editor_ops.cc:7278
+#: editor_ops.cc:7830
 msgid "uncombine regions"
 msgstr ""
 
-#: editor_ops.cc:7315
+#: editor_ops.cc:7867
 msgid "%1: Locked"
 msgstr ""
 
-#: editor_ops.cc:7322
+#: editor_ops.cc:7874
 msgid "Click to unlock"
 msgstr ""
 
-#: editor_ops.cc:7376
+#: editor_ops.cc:7923
 msgid "Moving embedded files into session folder"
 msgstr ""
 
-#: editor_regions.cc:112
+#: editor_regions.cc:159
 msgid "Region name, with number of channels in []'s"
 msgstr ""
 
-#: editor_regions.cc:113
+#: editor_regions.cc:160
 msgid "Position of start of region"
 msgstr ""
 
-#: editor_regions.cc:114 editor_regions.cc:851 time_info_box.cc:101
+#: editor_regions.cc:161 editor_regions.cc:935 time_info_box.cc:95
 msgid "End"
-msgstr ""
+msgstr "Fim"
 
-#: editor_regions.cc:114
+#: editor_regions.cc:161
 msgid "Position of end of region"
 msgstr ""
 
-#: editor_regions.cc:115
+#: editor_regions.cc:162
 msgid "Length of the region"
 msgstr ""
 
-#: editor_regions.cc:116
+#: editor_regions.cc:163
 msgid "Position of region sync point, relative to start of the region"
 msgstr ""
 
-#: editor_regions.cc:117
+#: editor_regions.cc:164
 msgid "Length of region fade-in (units: secondary clock), () if disabled"
 msgstr ""
 
-#: editor_regions.cc:118
+#: editor_regions.cc:165
 msgid "Length of region fade-out (units: secondary clock), () if disabled"
 msgstr ""
 
-#: editor_regions.cc:119 mixer_strip.cc:2055 mono_panner.cc:203
-#: panner2d.cc:240 stereo_panner.cc:251 stereo_panner.cc:274
-msgid "L"
+#: editor_regions.cc:166
+msgid "Lock|L"
 msgstr ""
 
-#: editor_regions.cc:119
+#: editor_regions.cc:166
 msgid "Region position locked?"
 msgstr ""
 
-#: editor_regions.cc:120 route_time_axis.cc:103
-msgid "G"
+#: editor_regions.cc:167
+msgid "Gain|G"
 msgstr ""
 
-#: editor_regions.cc:120
+#: editor_regions.cc:167
 msgid "Region position glued to Bars|Beats time?"
 msgstr ""
 
-#: editor_regions.cc:121 editor_routes.cc:211 gain_meter.cc:793
-#: mixer_strip.cc:2032 meter_strip.cc:359 panner_ui.cc:603
-#: route_time_axis.cc:2713 stereo_panner.cc:271 time_axis_view.cc:1190
-msgid "M"
-msgstr ""
-
-#: editor_regions.cc:121
+#: editor_regions.cc:168
 msgid "Region muted?"
 msgstr ""
 
-#: editor_regions.cc:122 mixer_strip.cc:1855
-msgid "O"
+#: editor_regions.cc:169
+msgid "Opaque|O"
 msgstr ""
 
-#: editor_regions.cc:122
+#: editor_regions.cc:169
 msgid "Region opaque (blocks regions below it from being heard)?"
 msgstr ""
 
-#: editor_regions.cc:311 editor_regions.cc:316 editor_regions.cc:318
+#: editor_regions.cc:360 editor_regions.cc:365 editor_regions.cc:367
 msgid "Hidden"
 msgstr "Oculto"
 
-#: editor_regions.cc:391
+#: editor_regions.cc:432
 msgid "(MISSING) "
 msgstr ""
 
-#: editor_regions.cc:459
+#: editor_regions.cc:500
 msgid ""
 "Do you really want to remove unused regions?\n"
 "(This is destructive and cannot be undone)"
 msgstr ""
 
-#: editor_regions.cc:463
+#: editor_regions.cc:504
 msgid "Yes, remove."
-msgstr ""
+msgstr "Sim, remover."
 
-#: editor_regions.cc:465
+#: editor_regions.cc:506
 msgid "Remove unused regions"
 msgstr ""
 
-#: editor_regions.cc:818 editor_regions.cc:832 editor_regions.cc:846
+#: editor_regions.cc:735
+msgid "EditorRegions::format_position: negative timecode position: %1"
+msgstr ""
+
+#: editor_regions.cc:900 editor_regions.cc:916 editor_regions.cc:930
 msgid "Mult."
 msgstr ""
 
-#: editor_regions.cc:849 midi_list_editor.cc:104 time_info_box.cc:94
+#: editor_regions.cc:933 midi_list_editor.cc:104 time_info_box.cc:88
 msgid "Start"
-msgstr ""
+msgstr "Início"
 
-#: editor_regions.cc:867 editor_regions.cc:883
+#: editor_regions.cc:951 editor_regions.cc:967
 msgid "Multiple"
 msgstr ""
 
-#: editor_regions.cc:952
+#: editor_regions.cc:1036
 msgid "MISSING "
 msgstr ""
 
-#: editor_routes.cc:182 editor_routes.cc:214
+#: editor_routes.cc:126
+msgid "RS"
+msgstr ""
+
+#: editor_routes.cc:208
 msgid "SS"
 msgstr ""
 
-#: editor_routes.cc:206
+#: editor_routes.cc:233
 msgid "Track/Bus Name"
-msgstr ""
+msgstr "Nome da Trilha/Bus"
 
-#: editor_routes.cc:207
+#: editor_routes.cc:234
 msgid "Track/Bus visible ?"
-msgstr ""
-
-#: editor_routes.cc:208 mixer_strip.cc:2046 meter_strip.cc:371
-#: route_time_axis.cc:105 route_time_axis.cc:2701
-msgid "A"
-msgstr ""
+msgstr "Trilha/Bus Visível ?"
 
-#: editor_routes.cc:208
+#: editor_routes.cc:235
 msgid "Track/Bus active ?"
-msgstr ""
+msgstr "Trilha/Bus ativa ?"
 
-#: editor_routes.cc:209 mixer_strip.cc:2033 mixer_strip.cc:2054
-#: meter_strip.cc:379
-msgid "I"
+#: editor_routes.cc:236
+msgid "MidiInput|I"
 msgstr ""
 
-#: editor_routes.cc:209
+#: editor_routes.cc:236
 msgid "MIDI input enabled"
 msgstr ""
 
-#: editor_routes.cc:210 mono_panner.cc:220 panner2d.cc:241
-#: stereo_panner.cc:249 stereo_panner.cc:276
-msgid "R"
+#: editor_routes.cc:237
+msgid "Rec|R"
 msgstr ""
 
-#: editor_routes.cc:210
+#: editor_routes.cc:237
 msgid "Record enabled"
+msgstr "Armado para Gravação"
+
+#: editor_routes.cc:238
+msgid "Rec|RS"
 msgstr ""
 
-#: editor_routes.cc:211
-msgid "Muted"
+#: editor_routes.cc:238
+msgid "Record Safe"
 msgstr ""
 
-#: editor_routes.cc:212 mixer_strip.cc:2042 meter_strip.cc:367
-#: route_time_axis.cc:2710
-msgid "S"
+#: editor_routes.cc:239
+msgid "Muted"
 msgstr ""
 
-#: editor_routes.cc:212
+#: editor_routes.cc:240
 msgid "Soloed"
 msgstr ""
 
-#: editor_routes.cc:213
-msgid "SI"
+#: editor_routes.cc:241
+msgid "SoloIso|SI"
 msgstr ""
 
-#: editor_routes.cc:213
+#: editor_routes.cc:241
 msgid "Solo Isolated"
 msgstr ""
 
-#: editor_routes.cc:214
+#: editor_routes.cc:242
+msgid "SoloLock|SS"
+msgstr ""
+
+#: editor_routes.cc:242
 msgid "Solo Safe (Locked)"
 msgstr ""
 
-#: editor_routes.cc:477 mixer_ui.cc:1197
+#: editor_routes.cc:550 mixer_ui.cc:1498
 msgid "Hide All"
 msgstr "Ocultar Tudo"
 
-#: editor_routes.cc:478 mixer_ui.cc:1198
+#: editor_routes.cc:551 mixer_ui.cc:1499
 msgid "Show All Audio Tracks"
-msgstr ""
+msgstr "Mostrar Todas as Trilhas de Áudio"
 
-#: editor_routes.cc:479 mixer_ui.cc:1199
+#: editor_routes.cc:552 mixer_ui.cc:1500
 msgid "Hide All Audio Tracks"
-msgstr ""
+msgstr "Ocultar Todas as Trilhas de Áudio"
 
-#: editor_routes.cc:480 mixer_ui.cc:1200
+#: editor_routes.cc:553 mixer_ui.cc:1501
 msgid "Show All Audio Busses"
 msgstr ""
 
-#: editor_routes.cc:481 mixer_ui.cc:1201
+#: editor_routes.cc:554 mixer_ui.cc:1502
 msgid "Hide All Audio Busses"
 msgstr ""
 
-#: editor_routes.cc:482
+#: editor_routes.cc:555 mixer_ui.cc:1503
 msgid "Show All Midi Tracks"
-msgstr ""
+msgstr "Mostrar Todas as Trilhas MIDI"
 
-#: editor_routes.cc:483
+#: editor_routes.cc:556 mixer_ui.cc:1504
 msgid "Hide All Midi Tracks"
-msgstr ""
+msgstr "Mostrar Todas as Trilhas MIDI"
 
-#: editor_routes.cc:484
-msgid "Show Tracks With Regions Under Playhead"
+#: editor_routes.cc:557
+msgid "Only Show Tracks with Regions Under Playhead"
 msgstr ""
 
-#: editor_rulers.cc:211
+#: editor_rulers.cc:212
 msgid "New location marker"
 msgstr "Nova marca de localização"
 
-#: editor_rulers.cc:212
+#: editor_rulers.cc:213
 msgid "Clear all locations"
 msgstr "Apagar todas as localizações"
 
-#: editor_rulers.cc:213
+#: editor_rulers.cc:214
 msgid "Unhide locations"
 msgstr ""
 
-#: editor_rulers.cc:217
+#: editor_rulers.cc:218
 msgid "New range"
 msgstr ""
 
-#: editor_rulers.cc:218
+#: editor_rulers.cc:219
 msgid "Clear all ranges"
 msgstr "Remover todos os intervalos"
 
-#: editor_rulers.cc:219
+#: editor_rulers.cc:220
 msgid "Unhide ranges"
 msgstr ""
 
 #: editor_rulers.cc:224
-msgid "Make Loop range"
+msgid "New Loop range"
 msgstr ""
 
 #: editor_rulers.cc:225
-msgid "Make Punch range"
+msgid "New Punch range"
 msgstr ""
 
 #: editor_rulers.cc:230
 msgid "New CD track marker"
 msgstr ""
 
-#: editor_rulers.cc:235 tempo_dialog.cc:38
+#: editor_rulers.cc:234 tempo_dialog.cc:38
 msgid "New Tempo"
 msgstr "Novo Andamento"
 
-#: editor_rulers.cc:239 tempo_dialog.cc:296
+#: editor_rulers.cc:238 tempo_dialog.cc:419
 msgid "New Meter"
-msgstr "Novo Meter"
+msgstr ""
 
-#: editor_snapshots.cc:137
+#: editor_snapshots.cc:149
 msgid "Rename Snapshot"
-msgstr ""
+msgstr "Renomear Snapshot"
 
-#: editor_snapshots.cc:139
+#: editor_snapshots.cc:151
 msgid "New name of snapshot"
-msgstr ""
+msgstr "Novo nome de snapshot"
 
-#: editor_snapshots.cc:157
+#: editor_snapshots.cc:169
 msgid ""
 "Do you really want to remove snapshot \"%1\" ?\n"
 "(which cannot be undone)"
 msgstr ""
 
-#: editor_snapshots.cc:162
+#: editor_snapshots.cc:174
 msgid "Remove snapshot"
-msgstr ""
+msgstr "Remover snapshot"
 
-#: editor_tempodisplay.cc:194 editor_tempodisplay.cc:234
+#: editor_tempodisplay.cc:318
+msgid "add tempo mark"
+msgstr "adicionar marcação de tempo"
+
+#: editor_tempodisplay.cc:343
 msgid "add"
 msgstr "adicionar"
 
-#: editor_tempodisplay.cc:215
-msgid "add tempo mark"
-msgstr ""
-
-#: editor_tempodisplay.cc:254
+#: editor_tempodisplay.cc:362
 msgid "add meter mark"
 msgstr ""
 
-#: editor_tempodisplay.cc:287 editor_tempodisplay.cc:315
+#: editor_tempodisplay.cc:401 editor_tempodisplay.cc:435
 msgid "done"
 msgstr "pronto"
 
-#: editor_tempodisplay.cc:304 editor_tempodisplay.cc:330
+#: editor_tempodisplay.cc:422
+msgid "replace meter mark"
+msgstr ""
+
+#: editor_tempodisplay.cc:454
 msgid "replace tempo mark"
 msgstr ""
 
-#: editor_tempodisplay.cc:353 editor_tempodisplay.cc:387
+#: editor_tempodisplay.cc:485 editor_tempodisplay.cc:519
 msgid "remove tempo mark"
 msgstr ""
 
-#: editor_tempodisplay.cc:370
+#: editor_tempodisplay.cc:502
 msgid ""
 "programming error: meter marker canvas item has no marker object pointer!"
 msgstr ""
@@ -5675,393 +6395,462 @@ msgstr ""
 msgid "stretch/shrink"
 msgstr ""
 
-#: editor_timefx.cc:129
+#: editor_timefx.cc:130
 msgid "pitch shift"
 msgstr ""
 
-#: editor_timefx.cc:301
+#: editor_timefx.cc:282
 msgid "timefx cannot be started - thread creation error"
 msgstr ""
 
-#: engine_dialog.cc:83
+#: engine_dialog.cc:86
 msgid "Device Control Panel"
-msgstr ""
+msgstr "Painel de Controle do Dispositivo"
 
-#: engine_dialog.cc:84
+#: engine_dialog.cc:87
 msgid "Midi Device Setup"
+msgstr "Configuração Dispositivo MIDI"
+
+#: engine_dialog.cc:89
+msgid "Refresh Devices"
+msgstr ""
+
+#: engine_dialog.cc:90
+msgid "Use Buffered I/O"
 msgstr ""
 
-#: engine_dialog.cc:85 engine_dialog.cc:2097
+#: engine_dialog.cc:91 engine_dialog.cc:3000
 msgid "Measure"
 msgstr ""
 
-#: engine_dialog.cc:86
+#: engine_dialog.cc:92
 msgid "Use results"
 msgstr ""
 
-#: engine_dialog.cc:87
+#: engine_dialog.cc:93
 msgid "Back to settings ... (ignore results)"
 msgstr ""
 
-#: engine_dialog.cc:88
+#: engine_dialog.cc:94
 msgid "Calibrate Audio"
-msgstr ""
+msgstr "Calibrar Áudio"
 
-#: engine_dialog.cc:92
+#: engine_dialog.cc:98
 msgid "Back to settings"
 msgstr ""
 
-#: engine_dialog.cc:111
+#: engine_dialog.cc:120
 msgid ""
 "No audio/MIDI backends detected. %1 cannot run\n"
 "\n"
 "(This is a build/packaging/system error. It should never happen.)"
 msgstr ""
 
-#: engine_dialog.cc:137
+#: engine_dialog.cc:145
 msgid "Latency Measurement Tool"
 msgstr ""
 
-#: engine_dialog.cc:149
+#: engine_dialog.cc:157
 msgid ""
 "<span weight=\"bold\">Turn down the volume on your audio equipment to a very "
 "low level.</span>"
 msgstr ""
 
-#: engine_dialog.cc:158
+#: engine_dialog.cc:166
 msgid "Select two channels below and connect them using a cable."
 msgstr ""
 
-#: engine_dialog.cc:163
+#: engine_dialog.cc:171
 msgid "Output channel"
-msgstr ""
+msgstr "Canal de Saída"
 
-#: engine_dialog.cc:171
+#: engine_dialog.cc:179
 msgid "Input channel"
-msgstr ""
+msgstr "Canal de Entrada"
 
-#: engine_dialog.cc:206
+#: engine_dialog.cc:213
 msgid "Once the channels are connected, click the \"Measure\" button."
 msgstr ""
 
-#: engine_dialog.cc:213
+#: engine_dialog.cc:220
 msgid "When satisfied with the results, click the \"Use results\" button."
 msgstr ""
 
-#: engine_dialog.cc:228 engine_dialog.cc:2217 engine_dialog.cc:2227
+#: engine_dialog.cc:235 engine_dialog.cc:3138 engine_dialog.cc:3148
 msgid "No measurement results yet"
 msgstr ""
 
-#: engine_dialog.cc:238 route_params_ui.cc:106
+#: engine_dialog.cc:245 route_params_ui.cc:106
 msgid "Latency"
-msgstr ""
+msgstr "Latência"
 
-#: engine_dialog.cc:372
+#: engine_dialog.cc:520
 msgid "Audio System:"
-msgstr ""
+msgstr "Sistema de Áudio:"
 
-#: engine_dialog.cc:409
+#: engine_dialog.cc:564
 msgid "Driver:"
 msgstr ""
 
-#: engine_dialog.cc:415
+#: engine_dialog.cc:571
+msgid "Input Device:"
+msgstr "Dispositivo de Entrada:"
+
+#: engine_dialog.cc:575
+msgid "Output Device:"
+msgstr "Dispositivo de Saída:"
+
+#: engine_dialog.cc:582
 msgid "Device:"
-msgstr ""
+msgstr "Dispositivo:"
 
-#: engine_dialog.cc:420 engine_dialog.cc:519 sfdb_ui.cc:153 sfdb_ui.cc:348
-#: sfdb_ui.cc:353
+#: engine_dialog.cc:591 engine_dialog.cc:699 export_report.cc:164
+#: export_report.cc:328 sfdb_ui.cc:153 sfdb_ui.cc:348 sfdb_ui.cc:353
 msgid "Sample rate:"
-msgstr ""
+msgstr "Taxa de Amostragem:"
 
-#: engine_dialog.cc:426 engine_dialog.cc:526
+#: engine_dialog.cc:597 engine_dialog.cc:706
 msgid "Buffer size:"
-msgstr ""
+msgstr "Tamanho do Buffer:"
 
-#: engine_dialog.cc:444
+#: engine_dialog.cc:606
+msgid "Periods:"
+msgstr "Períodos:"
+
+#: engine_dialog.cc:624
 msgid "Input Channels:"
-msgstr ""
+msgstr "Canais de Entrada:"
 
-#: engine_dialog.cc:457
+#: engine_dialog.cc:637
 msgid "Output Channels:"
-msgstr ""
+msgstr "Canais de Saída:"
 
-#: engine_dialog.cc:469
+#: engine_dialog.cc:649
 msgid "Hardware input latency:"
-msgstr ""
+msgstr "Latência de Entrada do Hardware:"
 
-#: engine_dialog.cc:472 engine_dialog.cc:485
+#: engine_dialog.cc:652 engine_dialog.cc:665
 msgid "samples"
-msgstr ""
+msgstr "Amostras"
 
-#: engine_dialog.cc:482
+#: engine_dialog.cc:662
 msgid "Hardware output latency:"
-msgstr ""
+msgstr "Latência de Saída do Hardware:"
 
-#: engine_dialog.cc:493
+#: engine_dialog.cc:673
 msgid "MIDI System:"
-msgstr ""
+msgstr "Sistema MIDI:"
 
-#: engine_dialog.cc:511
+#: engine_dialog.cc:691
 msgid ""
-"The %1 audio backend was configured and started externally.\n"
-"This limits your control over it."
+"%1 is already running. %2 will connect to it and use the existing settings."
 msgstr ""
 
-#: engine_dialog.cc:564
+#: engine_dialog.cc:744
 msgid ""
 "Failed to start or connect to audio-engine.\n"
 "\n"
 "Latency calibration requires a working audio interface."
 msgstr ""
 
-#: engine_dialog.cc:570
+#: engine_dialog.cc:750
 msgid ""
 "Your selected audio configuration is playback- or capture-only.\n"
 "\n"
 "Latency calibration requires playback and capture"
 msgstr ""
 
-#: engine_dialog.cc:651
+#: engine_dialog.cc:965
 msgid "MIDI Devices"
-msgstr ""
+msgstr "Dispositivos MIDI"
 
-#: engine_dialog.cc:657
+#: engine_dialog.cc:971
 msgid "Device"
-msgstr ""
+msgstr "Dispositivo"
 
-#: engine_dialog.cc:659
+#: engine_dialog.cc:973
 msgid "Hardware Latencies"
-msgstr ""
+msgstr "Latências de Hardware"
 
-#: engine_dialog.cc:700
+#: engine_dialog.cc:1014
 msgid "Calibrate"
-msgstr ""
+msgstr "Calibrar"
 
-#: engine_dialog.cc:800
+#: engine_dialog.cc:1117
 msgid "all available channels"
 msgstr ""
 
-#: engine_dialog.cc:1039 latency_gui.cc:39
-msgid "sample"
-msgid_plural "samples"
+#: engine_dialog.cc:1599 latency_gui.cc:55
+msgid "%1 sample"
+msgid_plural "%1 samples"
 msgstr[0] ""
 msgstr[1] ""
 
-#: engine_dialog.cc:1090
+#: engine_dialog.cc:1662
 #, c-format
 msgid "(%.1f ms)"
 msgstr ""
 
-#: engine_dialog.cc:1593
+#: engine_dialog.cc:2413
 msgid "Could not start backend engine %1"
 msgstr ""
 
-#: engine_dialog.cc:1644
+#: engine_dialog.cc:2445
 msgid "Cannot set driver to %1"
 msgstr ""
 
-#: engine_dialog.cc:1648
+#: engine_dialog.cc:2450
+msgid "Cannot set input device name to %1"
+msgstr ""
+
+#: engine_dialog.cc:2454
+msgid "Cannot set output device name to %1"
+msgstr ""
+
+#: engine_dialog.cc:2459
 msgid "Cannot set device name to %1"
 msgstr ""
 
-#: engine_dialog.cc:1652
+#: engine_dialog.cc:2464
 msgid "Cannot set sample rate to %1"
 msgstr ""
 
-#: engine_dialog.cc:1656
+#: engine_dialog.cc:2468
 msgid "Cannot set buffer size to %1"
 msgstr ""
 
-#: engine_dialog.cc:1662
+#: engine_dialog.cc:2472
+msgid "Cannot set periods to %1"
+msgstr ""
+
+#: engine_dialog.cc:2478
 msgid "Cannot set input channels to %1"
 msgstr ""
 
-#: engine_dialog.cc:1666
+#: engine_dialog.cc:2482
 msgid "Cannot set output channels to %1"
 msgstr ""
 
-#: engine_dialog.cc:1672
+#: engine_dialog.cc:2488
 msgid "Cannot set input latency to %1"
 msgstr ""
 
-#: engine_dialog.cc:1676
+#: engine_dialog.cc:2492
 msgid "Cannot set output latency to %1"
 msgstr ""
 
-#: engine_dialog.cc:1955 engine_dialog.cc:2014
+#: engine_dialog.cc:2851 engine_dialog.cc:2917
 msgid "No signal detected "
 msgstr ""
 
-#: engine_dialog.cc:1968 engine_dialog.cc:2022 port_insert_ui.cc:70
+#: engine_dialog.cc:2858
+msgid ""
+"Input signal is > -3dBFS. Lower the signal level (output gain, input gain) "
+"on the audio-interface."
+msgstr ""
+
+#: engine_dialog.cc:2871 engine_dialog.cc:2925 port_insert_ui.cc:70
 #: port_insert_ui.cc:98
 msgid "Disconnected from audio engine"
 msgstr ""
 
-#: engine_dialog.cc:1977 engine_dialog.cc:2030
+#: engine_dialog.cc:2880 engine_dialog.cc:2933
 msgid "Detected roundtrip latency: "
 msgstr ""
 
-#: engine_dialog.cc:1979 engine_dialog.cc:2032
+#: engine_dialog.cc:2882 engine_dialog.cc:2935
 msgid "Systemic latency: "
 msgstr ""
 
-#: engine_dialog.cc:1986
+#: engine_dialog.cc:2889
 msgid "(signal detection error)"
 msgstr ""
 
-#: engine_dialog.cc:1992
+#: engine_dialog.cc:2895
 msgid "(inverted - bad wiring)"
 msgstr ""
 
-#: engine_dialog.cc:2039
+#: engine_dialog.cc:2942
 msgid "(averaging)"
 msgstr ""
 
-#: engine_dialog.cc:2045
+#: engine_dialog.cc:2948
 msgid "(too large jitter)"
 msgstr ""
 
-#: engine_dialog.cc:2049
+#: engine_dialog.cc:2952
 msgid "(large jitter)"
 msgstr ""
 
-#: engine_dialog.cc:2061
+#: engine_dialog.cc:2964
 msgid "Timeout - large MIDI jitter."
 msgstr ""
 
-#: engine_dialog.cc:2077 port_insert_ui.cc:134
+#: engine_dialog.cc:2980 port_insert_ui.cc:134
 msgid "Detecting ..."
 msgstr ""
 
-#: engine_dialog.cc:2171
+#: engine_dialog.cc:3081
 msgid "Disconnect from %1"
 msgstr ""
 
-#: engine_dialog.cc:2175 mixer_strip.cc:1522 route_group_dialog.cc:45
-#: route_time_axis.cc:841
-msgid "Active"
-msgstr "Ativar"
+#: engine_dialog.cc:3086
+msgid "Running"
+msgstr ""
 
-#: engine_dialog.cc:2185
-msgid "Connect to %1"
+#: engine_dialog.cc:3088
+msgid "Connected"
 msgstr ""
 
-#: engine_dialog.cc:2190
-msgid "Inactive"
+#: engine_dialog.cc:3099
+msgid "Connect to %1"
 msgstr ""
 
-#: export_channel_selector.cc:45 sfdb_ui.cc:151
+#: engine_dialog.cc:3103 shuttle_control.cc:655
+msgid "Stopped"
+msgstr "Parado"
+
+#: export_channel_selector.cc:46 export_report.cc:159 export_report.cc:324
+#: sfdb_ui.cc:151
 msgid "Channels:"
 msgstr ""
 
-#: export_channel_selector.cc:46
+#: export_channel_selector.cc:47
 msgid "Split to mono files"
 msgstr ""
 
-#: export_channel_selector.cc:182
+#: export_channel_selector.cc:197
 msgid "Bus or Track"
 msgstr ""
 
-#: export_channel_selector.cc:459
+#: export_channel_selector.cc:474
 msgid "Region contents without fades nor region gain (channels: %1)"
 msgstr ""
 
-#: export_channel_selector.cc:463
+#: export_channel_selector.cc:478
 msgid "Region contents with fades and region gain (channels: %1)"
 msgstr ""
 
-#: export_channel_selector.cc:467
+#: export_channel_selector.cc:482
 msgid "Track output (channels: %1)"
 msgstr ""
 
-#: export_channel_selector.cc:536
-msgid "Export region contents"
+#: export_channel_selector.cc:552
+msgid "Apply track/bus processing"
+msgstr ""
+
+#: export_channel_selector.cc:553
+msgid "Select all tracks"
+msgstr ""
+
+#: export_channel_selector.cc:554
+msgid "Select all busses"
+msgstr ""
+
+#: export_channel_selector.cc:555
+msgid "Deselect all"
 msgstr ""
 
-#: export_channel_selector.cc:537
-msgid "Export track output"
+#: export_channel_selector.cc:589
+msgid "Track name"
 msgstr ""
 
-#: export_dialog.cc:46
+#: export_dialog.cc:49
 msgid ""
 "<span color=\"#ffa755\">Some already existing files will be overwritten.</"
 "span>"
 msgstr ""
 
-#: export_dialog.cc:47
+#: export_dialog.cc:50
 msgid "List files"
 msgstr ""
 
-#: export_dialog.cc:158 export_format_dialog.cc:59
+#: export_dialog.cc:163 export_format_dialog.cc:67
 msgid "File format"
 msgstr ""
 
-#: export_dialog.cc:159 export_timespan_selector.cc:374
-#: export_timespan_selector.cc:436
+#: export_dialog.cc:164 export_timespan_selector.cc:411
+#: export_timespan_selector.cc:502
 msgid "Time Span"
 msgstr ""
 
-#: export_dialog.cc:160
+#: export_dialog.cc:165
 msgid "Channels"
 msgstr ""
 
-#: export_dialog.cc:182
+#: export_dialog.cc:187
 msgid ""
 "Export has been aborted due to an error!\n"
 "See the Log for details."
 msgstr ""
 
-#: export_dialog.cc:251
+#: export_dialog.cc:298
 msgid "Files that will be overwritten"
 msgstr ""
 
-#: export_dialog.cc:296
+#: export_dialog.cc:343
 msgid "Export initialization failed: %1"
 msgstr ""
 
-#: export_dialog.cc:306
+#: export_dialog.cc:353
 msgid "Stop Export"
 msgstr "Cancelar Exportação"
 
-#: export_dialog.cc:327
+#: export_dialog.cc:383
 msgid "export"
 msgstr ""
 
-#: export_dialog.cc:346
+#: export_dialog.cc:402
+msgid "Exporting '%3' (timespan %1 of %2)"
+msgstr ""
+
+#: export_dialog.cc:407
 msgid "Normalizing '%3' (timespan %1 of %2)"
 msgstr ""
 
-#: export_dialog.cc:350
-msgid "Exporting '%3' (timespan %1 of %2)"
+#: export_dialog.cc:412
+msgid "Encoding '%3' (timespan %1 of %2)"
+msgstr ""
+
+#: export_dialog.cc:417
+msgid "Tagging '%3' (timespan %1 of %2)"
+msgstr ""
+
+#: export_dialog.cc:421
+msgid "Uploading '%3' (timespan %1 of %2)"
+msgstr ""
+
+#: export_dialog.cc:425
+msgid "Running Post Export Command for '%1'"
 msgstr ""
 
-#: export_dialog.cc:373 export_dialog.cc:375
+#: export_dialog.cc:453 export_dialog.cc:455
 msgid "<span color=\"#ffa755\">Error: "
 msgstr ""
 
-#: export_dialog.cc:385
+#: export_dialog.cc:465
 msgid "<span color=\"#ffa755\">Warning: "
 msgstr ""
 
-#: export_dialog.cc:387
+#: export_dialog.cc:467
 msgid ""
 "\n"
 "<span color=\"#ffa755\">Warning: "
 msgstr ""
 
-#: export_dialog.cc:411
+#: export_dialog.cc:491
 msgid "Export Selection"
-msgstr ""
+msgstr "Exportar Seleção"
 
-#: export_dialog.cc:425
+#: export_dialog.cc:505
 msgid "Export Region"
-msgstr ""
+msgstr "Exportar Região"
 
-#: export_dialog.cc:434
+#: export_dialog.cc:514
 msgid "Source"
 msgstr ""
 
-#: export_dialog.cc:450
+#: export_dialog.cc:530
 msgid "Stem Export"
 msgstr ""
 
@@ -6069,172 +6858,246 @@ msgstr ""
 msgid "Add another format"
 msgstr ""
 
-#: export_file_notebook.cc:193
+#: export_file_notebook.cc:198
 msgid "Format"
 msgstr ""
 
-#: export_file_notebook.cc:194
+#: export_file_notebook.cc:199
 msgid "Location"
 msgstr "Localização"
 
-#: export_file_notebook.cc:195
+#: export_file_notebook.cc:200
 msgid "Upload to Soundcloud"
 msgstr ""
 
-#: export_file_notebook.cc:273
-msgid "No format!"
+#: export_file_notebook.cc:201
+msgid "Analyze Exported Audio"
 msgstr ""
 
-#: export_file_notebook.cc:291
+#: export_file_notebook.cc:286
+msgid "No format!"
+msgstr "Sem formato!"
+
+#: export_file_notebook.cc:304
 msgid "Format %1: %2"
 msgstr ""
 
-#: export_filename_selector.cc:32
+#: export_filename_selector.cc:33
 msgid "Label:"
-msgstr ""
+msgstr "Rótulo"
 
-#: export_filename_selector.cc:33
+#: export_filename_selector.cc:34 session_dialog.cc:310
 msgid "Session Name"
-msgstr ""
+msgstr "Nome da Sessão"
 
-#: export_filename_selector.cc:34
-msgid "Revision:"
-msgstr ""
+#: export_filename_selector.cc:35
+msgid "Timespan Name"
+msgstr "Indicador de Data"
 
 #: export_filename_selector.cc:36
+msgid "Revision:"
+msgstr "Revisão:"
+
+#: export_filename_selector.cc:38
 msgid "Folder:"
-msgstr ""
+msgstr "Diretório:"
 
-#: export_filename_selector.cc:37 session_import_dialog.cc:45
+#: export_filename_selector.cc:39 session_import_dialog.cc:45
 #: transcode_video_dialog.cc:59 video_server_dialog.cc:54
-#: video_server_dialog.cc:56 export_video_dialog.cc:81
-#: export_video_dialog.cc:83
+#: video_server_dialog.cc:56 export_video_dialog.cc:77
+#: export_video_dialog.cc:79
 msgid "Browse"
 msgstr "Localizar"
 
-#: export_filename_selector.cc:41
-msgid "<i>Build filename(s) from these components:</i>"
+#: export_filename_selector.cc:40 export_report.cc:118
+msgid "Open Folder"
+msgstr "Abrir Diretório"
+
+#: export_filename_selector.cc:45
+msgid "Build filename(s) from these components:"
 msgstr ""
 
-#: export_filename_selector.cc:212
+#: export_filename_selector.cc:217
 msgid ""
 "<small><i>Sorry, no example filename can be shown at the moment</i></small>"
 msgstr ""
 
-#: export_filename_selector.cc:214
-msgid "<small><i>Current (approximate) filename: \"%1\"</i></small>"
+#: export_filename_selector.cc:219
+msgid "<i>Current (approximate) filename</i>: \"%1\""
 msgstr ""
 
-#: export_filename_selector.cc:250 export_filename_selector.cc:336
+#: export_filename_selector.cc:255 export_filename_selector.cc:402
 msgid ""
 "%1: this is only the directory/folder name, not the filename.\n"
 "The filename will be chosen from the information just above the folder "
 "selector."
 msgstr ""
 
-#: export_filename_selector.cc:322
+#: export_filename_selector.cc:378
+msgid "%1: this is not a valid directory/folder."
+msgstr ""
+
+#: export_filename_selector.cc:388
 msgid "Choose export folder"
 msgstr ""
 
-#: export_format_dialog.cc:31
+#: export_format_dialog.cc:32
 msgid "New Export Format Profile"
 msgstr ""
 
-#: export_format_dialog.cc:31
+#: export_format_dialog.cc:32
 msgid "Edit Export Format Profile"
 msgstr ""
 
-#: export_format_dialog.cc:38
+#: export_format_dialog.cc:39
 msgid "Label: "
 msgstr ""
 
-#: export_format_dialog.cc:41 normalize_dialog.cc:42
-msgid "Normalize to:"
+#: export_format_dialog.cc:42
+msgid "Normalize:"
+msgstr ""
+
+#: export_format_dialog.cc:43
+msgid "Peak"
+msgstr ""
+
+#: export_format_dialog.cc:44
+msgid "Loudness"
+msgstr ""
+
+#: export_format_dialog.cc:50
+msgid "LUFS"
+msgstr ""
+
+#: export_format_dialog.cc:51
+msgid "dBTP"
 msgstr ""
 
-#: export_format_dialog.cc:46
+#: export_format_dialog.cc:54
 msgid "Trim silence at start"
 msgstr ""
 
-#: export_format_dialog.cc:47
+#: export_format_dialog.cc:55
 msgid "Add silence at start:"
 msgstr ""
 
-#: export_format_dialog.cc:50
+#: export_format_dialog.cc:58
 msgid "Trim silence at end"
 msgstr ""
 
-#: export_format_dialog.cc:51
+#: export_format_dialog.cc:59
 msgid "Add silence at end:"
 msgstr ""
 
-#: export_format_dialog.cc:54
+#: export_format_dialog.cc:62
 msgid ""
 "Command to run post-export\n"
-"(%f=full path & filename, %d=directory, %b=basename):"
+"(%f=file path, %d=directory, %b=basename, see tooltip for more):"
 msgstr ""
 
-#: export_format_dialog.cc:57
+#: export_format_dialog.cc:65
 msgid "Compatibility"
 msgstr ""
 
-#: export_format_dialog.cc:58
+#: export_format_dialog.cc:66
 msgid "Quality"
 msgstr ""
 
-#: export_format_dialog.cc:61
+#: export_format_dialog.cc:69
 msgid "Sample rate conversion quality:"
 msgstr ""
 
-#: export_format_dialog.cc:68
+#: export_format_dialog.cc:76
 msgid "Dithering"
 msgstr ""
 
-#: export_format_dialog.cc:70
+#: export_format_dialog.cc:78
 msgid "Create CUE file for disk-at-once CD/DVD creation"
 msgstr ""
 
-#: export_format_dialog.cc:71
+#: export_format_dialog.cc:79
 msgid "Create TOC file for disk-at-once CD/DVD creation"
 msgstr ""
 
-#: export_format_dialog.cc:73
+#: export_format_dialog.cc:80
+msgid "Create chapter mark file for MP4 chapter marks"
+msgstr ""
+
+#: export_format_dialog.cc:82
 msgid "Tag file with session's metadata"
 msgstr ""
 
-#: export_format_dialog.cc:470
+#: export_format_dialog.cc:119
+msgid "\\u2227"
+msgstr ""
+
+#: export_format_dialog.cc:124
+msgid ""
+"Normalize to EBU-R128 LUFS target loudness without exceeding the given true-"
+"peak limit. EBU-R128 normalization is only available for mono and stereo "
+"targets, true-peak works for any channel layout."
+msgstr ""
+
+#: export_format_dialog.cc:152
+msgid ""
+"%a Artist name\n"
+"%b File's base-name\n"
+"%c Copyright\n"
+"%d File's directory\n"
+"%f File's full absolute path\n"
+"%l Lyricist\n"
+"%n Session name\n"
+"%o Conductor\n"
+"%t Title\n"
+"%z Organization\n"
+"%A Album\n"
+"%C Comment\n"
+"%E Engineer\n"
+"%G Genre\n"
+"%L Total track count\n"
+"%M Mixer\n"
+"%N Timespan name\n"
+"%O Composer\n"
+"%P Producer\n"
+"%S Disc subtitle\n"
+"%T Track number\n"
+"%Y Year\n"
+"%Z Country"
+msgstr ""
+
+#: export_format_dialog.cc:537
 msgid "Best (sinc)"
 msgstr ""
 
-#: export_format_dialog.cc:475
+#: export_format_dialog.cc:542
 msgid "Medium (sinc)"
 msgstr ""
 
-#: export_format_dialog.cc:480
+#: export_format_dialog.cc:547
 msgid "Fast (sinc)"
 msgstr ""
 
-#: export_format_dialog.cc:490
+#: export_format_dialog.cc:557
 msgid "Zero order hold"
 msgstr ""
 
-#: export_format_dialog.cc:895
+#: export_format_dialog.cc:981
 msgid "Linear encoding options"
 msgstr ""
 
-#: export_format_dialog.cc:911
+#: export_format_dialog.cc:997
 msgid "Ogg Vorbis options"
 msgstr ""
 
-#: export_format_dialog.cc:922
+#: export_format_dialog.cc:1008
 msgid "FLAC options"
 msgstr ""
 
-#: export_format_dialog.cc:939
+#: export_format_dialog.cc:1025
 msgid "Broadcast Wave options"
 msgstr ""
 
-#: export_format_selector.cc:136
+#: export_format_selector.cc:131
 msgid "Do you really want to remove the format?"
 msgstr ""
 
@@ -6242,123 +7105,309 @@ msgstr ""
 msgid "Preset"
 msgstr ""
 
-#: export_preset_selector.cc:104
+#: export_preset_selector.cc:99
 msgid ""
 "The selected preset did not load successfully!\n"
 "Perhaps it references a format that has been removed?"
 msgstr ""
 
-#: export_preset_selector.cc:156
+#: export_preset_selector.cc:151
 msgid "Do you really want to remove this preset?"
 msgstr ""
 
-#: export_timespan_selector.cc:46
-msgid "Show Times as:"
+#: export_report.cc:56
+msgid "Export Report/Analysis"
 msgstr ""
 
-#: export_timespan_selector.cc:53 processor_box.cc:2466
-msgid "Select All"
-msgstr "Selecionar Tudo"
-
-#: export_timespan_selector.cc:223 transform_dialog.cc:93
-msgid " to "
+#: export_report.cc:147 export_report.cc:327 sfdb_ui.cc:149
+msgid "Format:"
 msgstr ""
 
-#: export_timespan_selector.cc:367 export_timespan_selector.cc:426
-msgid "Range"
+#: export_report.cc:166 export_report.cc:328
+msgid "%1 Hz"
 msgstr ""
 
-#: sfdb_freesound_mootcher.cc:189 sfdb_freesound_mootcher.cc:324
-msgid "curl error %1 (%2)"
+#: export_report.cc:169 export_report.cc:336 transcode_video_dialog.cc:139
+msgid "Duration:"
+msgstr "Duração"
+
+#: export_report.cc:177 export_report.cc:334
+msgid "Timecode:"
+msgstr "Tempo"
+
+#: export_report.cc:185
+msgid "Error:"
+msgstr "Erro:"
+
+#: export_report.cc:220 export_report.cc:440
+msgid "(too short integration time)"
 msgstr ""
 
-#: sfdb_freesound_mootcher.cc:266
-msgid "getSoundResourceFile: There is no valid root in the xml file"
+#: export_report.cc:222
+msgid "-888"
 msgstr ""
 
-#: sfdb_freesound_mootcher.cc:271
-msgid "getSoundResourceFile: root = %1, != response"
+#: export_report.cc:227 export_report.cc:353
+msgid "Peak:"
 msgstr ""
 
-#: sfdb_freesound_mootcher.cc:410 rc_option_editor.cc:1824
-msgid "%1"
+#: export_report.cc:228 export_report.cc:360
+msgid "%1 dBFS"
 msgstr ""
 
-#: gain_meter.cc:132 gain_meter.cc:400 gain_meter.cc:505 gain_meter.cc:896
-msgid "-inf"
+#: export_report.cc:229 export_report.cc:369
+msgid "True Peak:"
 msgstr ""
 
-#: gain_meter.cc:147 gain_meter.cc:958
-msgid "Fader automation mode"
+#: export_report.cc:230 export_report.cc:376
+msgid "%1 dBTP"
 msgstr ""
 
-#: gain_meter.cc:148 gain_meter.cc:959
-msgid "Fader automation type"
+#: export_report.cc:231 export_report.cc:387
+msgid "Normalization Gain:"
 msgstr ""
 
-#: gain_meter.cc:157 gain_meter.cc:829 panner_ui.cc:179 panner_ui.cc:639
-msgid "Abs"
+#: export_report.cc:232
+msgid "+888.88 dB"
 msgstr ""
 
-#: gain_meter.cc:796 mixer_strip.cc:2049 meter_strip.cc:374 panner_ui.cc:606
-#: route_time_axis.cc:104 route_time_axis.cc:2705
-msgid "P"
+#: export_report.cc:234 export_report.cc:448
+msgid "Integrated Loudness:"
 msgstr ""
 
-#: gain_meter.cc:799 panner_ui.cc:609
-msgid "T"
+#: export_report.cc:235 export_report.cc:454
+msgid "%1 LUFS"
 msgstr ""
 
-#: gain_meter.cc:802 panner_ui.cc:612
-msgid "W"
+#: export_report.cc:236 export_report.cc:460
+msgid "Loudness Range:"
 msgstr ""
 
-#: generic_pluginui.cc:83
-msgid "<span size=\"large\">Presets</span>"
+#: export_report.cc:237 export_report.cc:466
+msgid "%1 LU"
 msgstr ""
 
-#: generic_pluginui.cc:97
-msgid "Manual"
+#: export_report.cc:247 export_report.cc:754
+msgid "100"
 msgstr ""
 
-#: generic_pluginui.cc:106
-msgid "All Automation"
+#: export_report.cc:282 export_report.cc:650
+msgid "00:00:00.000"
 msgstr ""
 
-#: generic_pluginui.cc:250
-msgid "Switches"
+#: export_report.cc:288
+msgid "0|A8"
 msgstr ""
 
-#: generic_pluginui.cc:260 generic_pluginui.cc:436 processor_box.cc:2440
-msgid "Controls"
+#: export_report.cc:394
+msgid "%1 dB"
 msgstr ""
 
-#: generic_pluginui.cc:293
+#: export_report.cc:425 export_report.cc:433 export_report.cc:553
+msgid ""
+"Not\n"
+"Available"
+msgstr ""
+
+#: export_report.cc:493
+msgid ""
+"LUFS\n"
+"(short)"
+msgstr ""
+
+#: export_report.cc:503
+msgid "Multiplicity"
+msgstr ""
+
+#: export_report.cc:603
+msgid "Logscale|Lg"
+msgstr ""
+
+#: export_report.cc:604
+msgid "Rectified|Rf"
+msgstr ""
+
+#: export_report.cc:605
+msgid "Logscale"
+msgstr ""
+
+#: export_report.cc:606
+msgid "Rectified"
+msgstr ""
+
+#: export_report.cc:738
+msgid "Hz"
+msgstr ""
+
+#: export_report.cc:755
+msgid "500"
+msgstr ""
+
+#: export_report.cc:756
+msgid "1K"
+msgstr ""
+
+#: export_report.cc:757
+msgid "5K"
+msgstr ""
+
+#: export_report.cc:758
+msgid "10K"
+msgstr ""
+
+#: export_report.cc:844
+msgid "Writing Export Analysis Image: %1."
+msgstr ""
+
+#: export_report.cc:941 sfdb_ui.cc:293 sfdb_ui.cc:409
+msgid "Could not read file: %1 (%2)."
+msgstr "Não foi possível ler o arquivo: %1 (%2)."
+
+#: export_report.cc:967 sfdb_ui.cc:458
+msgid "Could not access soundfile: "
+msgstr "não foi possível acessar arquivo de áudio"
+
+#: export_report.cc:1203
+msgid "-36"
+msgstr ""
+
+#: export_report.cc:1204 export_report.cc:1208 export_report.cc:1214
+#: export_report.cc:1217
+msgid "-18"
+msgstr ""
+
+#: export_report.cc:1205 export_report.cc:1209 export_report.cc:1215
+#: export_report.cc:1218 export_report.cc:1221 export_report.cc:1222
+msgid "-9"
+msgstr ""
+
+#: export_report.cc:1206 export_report.cc:1210 export_report.cc:1216
+#: export_report.cc:1219 export_report.cc:1223 export_report.cc:1224
+msgid "-3"
+msgstr ""
+
+#: export_timespan_selector.cc:45
+msgid "Show Times as:"
+msgstr ""
+
+#: export_timespan_selector.cc:46
+msgid "Realtime Export"
+msgstr ""
+
+#: export_timespan_selector.cc:54 processor_box.cc:3695
+msgid "Select All"
+msgstr "Selecionar Tudo"
+
+#: export_timespan_selector.cc:255 transform_dialog.cc:93
+msgid " to "
+msgstr ""
+
+#: export_timespan_selector.cc:399 export_timespan_selector.cc:488
+msgid "RT"
+msgstr ""
+
+#: export_timespan_selector.cc:400 export_timespan_selector.cc:489
+msgid "Range"
+msgstr ""
+
+#: sfdb_freesound_mootcher.cc:189 sfdb_freesound_mootcher.cc:324
+msgid "curl error %1 (%2)"
+msgstr ""
+
+#: sfdb_freesound_mootcher.cc:266
+msgid "getSoundResourceFile: There is no valid root in the xml file"
+msgstr ""
+
+#: sfdb_freesound_mootcher.cc:271
+msgid "getSoundResourceFile: root = %1, != response"
+msgstr ""
+
+#: sfdb_freesound_mootcher.cc:410 rc_option_editor.cc:2416
+msgid "%1"
+msgstr ""
+
+#: gain_meter.cc:137 gain_meter.cc:422 gain_meter.cc:527 gain_meter.cc:919
+msgid "-inf"
+msgstr ""
+
+#: gain_meter.cc:152 gain_meter.cc:983
+msgid "Fader automation mode"
+msgstr ""
+
+#: gain_meter.cc:153 gain_meter.cc:984
+msgid "Fader automation type"
+msgstr ""
+
+#: gain_meter.cc:162 gain_meter.cc:852 panner_ui.cc:179 panner_ui.cc:641
+msgid "Abs"
+msgstr ""
+
+#: gain_meter.cc:816 vca_master_strip.cc:78 vca_time_axis.cc:54
+msgid "M"
+msgstr ""
+
+#: gain_meter.cc:819 vca_master_strip.cc:296
+msgid "P"
+msgstr ""
+
+#: gain_meter.cc:822
+msgid "T"
+msgstr ""
+
+#: gain_meter.cc:825
+msgid "W"
+msgstr ""
+
+#: generic_pluginui.cc:83
+msgid "<span size=\"large\">Presets</span>"
+msgstr ""
+
+#: generic_pluginui.cc:98 plugin_pin_dialog.cc:333
+msgid "Manual"
+msgstr ""
+
+#: generic_pluginui.cc:107
+msgid "All Automation"
+msgstr ""
+
+#: generic_pluginui.cc:250
 msgid "Plugin Editor: could not build control element for port %1"
 msgstr ""
 "Plugin Editor: não foi possível construir elemento de controle para a porta "
 "%1"
 
-#: generic_pluginui.cc:318
+#: generic_pluginui.cc:282
 msgid "Plugin Editor: no control for property %1"
 msgstr ""
 
-#: generic_pluginui.cc:324
+#: generic_pluginui.cc:288
 msgid "Plugin Editor: could not build control element for property %1"
 msgstr ""
 
-#: generic_pluginui.cc:468
+#: generic_pluginui.cc:359
+msgid "Switches"
+msgstr ""
+
+#: generic_pluginui.cc:369 generic_pluginui.cc:475 processor_box.cc:3665
+msgid "Controls"
+msgstr ""
+
+#: generic_pluginui.cc:510
 msgid "Meters"
 msgstr ""
 
-#: generic_pluginui.cc:490
+#: generic_pluginui.cc:548
 msgid "Automation control"
 msgstr ""
 
-#: generic_pluginui.cc:497
+#: generic_pluginui.cc:555
 msgid "Mgnual"
 msgstr ""
 
+#: generic_pluginui.cc:828
+msgid "This control cannot be automated"
+msgstr ""
+
 #: global_port_matrix.cc:158
 msgid "Audio Connection Manager"
 msgstr ""
@@ -6367,126 +7416,163 @@ msgstr ""
 msgid "MIDI Connection Manager"
 msgstr ""
 
-#: global_port_matrix.cc:201 io_selector.cc:211 mixer_strip.cc:793
-#: mixer_strip.cc:894
+#: global_port_matrix.cc:201 io_selector.cc:211 mixer_strip.cc:870
+#: mixer_strip.cc:973 monitor_section.cc:1430 monitor_selector.cc:189
+#: plugin_pin_dialog.cc:1757
 msgid "Disconnect"
 msgstr "Desconectar"
 
-#: global_port_matrix.cc:207 io_selector.cc:217
+#: global_port_matrix.cc:207 io_selector.cc:217 monitor_selector.cc:195
 msgid "port"
 msgstr "porta"
 
-#: group_tabs.cc:312
+#: group_tabs.cc:312 group_tabs.cc:321
 msgid "Selection..."
-msgstr ""
+msgstr "Seleção..."
 
-#: group_tabs.cc:313
+#: group_tabs.cc:313 group_tabs.cc:322
 msgid "Record Enabled..."
-msgstr ""
+msgstr "Gravação Ativada"
 
-#: group_tabs.cc:314
+#: group_tabs.cc:314 group_tabs.cc:323
 msgid "Soloed..."
 msgstr ""
 
-#: group_tabs.cc:320
-msgid "Create New Group ..."
+#: group_tabs.cc:316
+msgid "Create New Group From..."
 msgstr ""
 
-#: group_tabs.cc:321
-msgid "Create New Group From"
+#: group_tabs.cc:325
+msgid "Create New Group with Master From..."
 msgstr ""
 
-#: group_tabs.cc:324
-msgid "Edit Group..."
+#: group_tabs.cc:344
+msgid "Create New Group ..."
+msgstr "Criar Novo Grupo"
+
+#: group_tabs.cc:345
+msgid "Create New Group with Control Master ..."
 msgstr ""
 
-#: group_tabs.cc:325
+#: group_tabs.cc:355
+msgid "Edit Group..."
+msgstr "Editar Grupo"
+
+#: group_tabs.cc:356
 msgid "Collect Group"
 msgstr ""
 
-#: group_tabs.cc:326
+#: group_tabs.cc:357
 msgid "Remove Group"
+msgstr "Remover Grupo"
+
+#: group_tabs.cc:368
+msgid "Assign Group to Control Master..."
 msgstr ""
 
-#: group_tabs.cc:329
+#: group_tabs.cc:374
 msgid "Remove Subgroup Bus"
 msgstr ""
 
-#: group_tabs.cc:331
+#: group_tabs.cc:376
 msgid "Add New Subgroup Bus"
 msgstr ""
 
-#: group_tabs.cc:333
+#: group_tabs.cc:378
 msgid "Add New Aux Bus (pre-fader)"
 msgstr ""
 
-#: group_tabs.cc:334
+#: group_tabs.cc:379
 msgid "Add New Aux Bus (post-fader)"
 msgstr ""
 
-#: group_tabs.cc:340
+#: group_tabs.cc:404
+msgid "Assign Selection to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:415
+msgid "Assign Record Enabled to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:426
+msgid "Assign Soloed to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:429
 msgid "Enable All Groups"
 msgstr ""
 
-#: group_tabs.cc:341
+#: group_tabs.cc:430
 msgid "Disable All Groups"
 msgstr ""
 
-#: insert_time_dialog.cc:46
+#: insert_remove_time_dialog.cc:52
+msgid "Time to remove"
+msgstr ""
+
+#: insert_remove_time_dialog.cc:52
 msgid "Time to insert:"
 msgstr ""
 
-#: insert_time_dialog.cc:54
+#: insert_remove_time_dialog.cc:61
 msgid "Intersected regions should:"
 msgstr ""
 
-#: insert_time_dialog.cc:57
+#: insert_remove_time_dialog.cc:64
 msgid "stay in position"
 msgstr ""
 
-#: insert_time_dialog.cc:58
+#: insert_remove_time_dialog.cc:65
 msgid "move"
-msgstr ""
+msgstr "mover"
 
-#: insert_time_dialog.cc:59
+#: insert_remove_time_dialog.cc:66
 msgid "be split"
 msgstr ""
 
-#: insert_time_dialog.cc:65
-msgid "Insert time on all the track's playlists"
+#: insert_remove_time_dialog.cc:73
+msgid "Apply to all the track's playlists"
 msgstr ""
 
-#: insert_time_dialog.cc:68
+#: insert_remove_time_dialog.cc:76
 msgid "Move glued regions"
 msgstr ""
 
-#: insert_time_dialog.cc:70
+#: insert_remove_time_dialog.cc:78
 msgid "Move markers"
 msgstr ""
 
-#: insert_time_dialog.cc:73
+#: insert_remove_time_dialog.cc:81
 msgid "Move glued markers"
 msgstr ""
 
-#: insert_time_dialog.cc:78
+#: insert_remove_time_dialog.cc:86
 msgid "Move locked markers"
 msgstr ""
 
-#: insert_time_dialog.cc:83
+#: insert_remove_time_dialog.cc:91
 msgid ""
 "Move tempo and meter changes\n"
 "<i>(may cause oddities in the tempo map)</i>"
 msgstr ""
 
-#: insert_time_dialog.cc:91
+#: insert_remove_time_dialog.cc:99
+msgid "Remove time"
+msgstr ""
+
+#: insert_remove_time_dialog.cc:99
 msgid "Insert time"
 msgstr ""
 
-#: instrument_selector.cc:62
+#: insert_remove_time_dialog.cc:174
+msgid "Invalid or zero duration entered. Please enter a valid duration"
+msgstr ""
+
+#: instrument_selector.cc:92
 msgid "-none-"
 msgstr ""
 
-#: interthread_progress_window.cc:103
+#: interthread_progress_window.cc:114
 msgid "Importing file: %1 of %2"
 msgstr ""
 
@@ -6494,64 +7580,89 @@ msgstr ""
 msgid "I/O selector"
 msgstr ""
 
-#: io_selector.cc:266
+#: io_selector.cc:266 monitor_selector.cc:244
 msgid "%1 input"
 msgstr "%1 entrada"
 
-#: io_selector.cc:268
+#: io_selector.cc:268 monitor_selector.cc:246
 msgid "%1 output"
 msgstr "%1 saída"
 
-#: keyboard.cc:70
+#: keyboard.cc:93
 msgid "your own"
 msgstr ""
 
-#: keyboard.cc:133 keyboard.cc:157
+#: keyboard.cc:157 keyboard.cc:181
 msgid "Default keybindings not found - %1 will be hard to use!"
 msgstr ""
 
-#: keyboard.cc:136
+#: keyboard.cc:160
 msgid "Key bindings file \"%1\" not found. Default bindings used instead"
 msgstr ""
 
-#: keyeditor.cc:54
-msgid "Remove shortcut"
+#: keyboard.cc:193
+msgid "Loading keybindings from %1"
 msgstr ""
 
-#: keyeditor.cc:63
-msgid "Action"
+#: keyeditor.cc:67
+msgid "Colliding keybindings"
 msgstr ""
 
-#: keyeditor.cc:64
-msgid "Shortcut"
+#: keyeditor.cc:68
+msgid ""
+"The key sequence is already bound. Please remove the other binding first."
 msgstr ""
 
-#: keyeditor.cc:84
-msgid "Select an action, then press the key(s) to (re)set its shortcut"
+#: keyeditor.cc:77
+msgid "Key Bindings"
 msgstr ""
 
-#: keyeditor.cc:98
-msgid "Reset Bindings to Defaults"
-msgstr ""
+#: keyeditor.cc:78
+msgid "Remove shortcut"
+msgstr "Remover Atalho"
+
+#: keyeditor.cc:80
+msgid "Search..."
+msgstr "Procurar..."
 
-#: keyeditor.cc:263
-msgid "Main_menu"
+#: keyeditor.cc:82
+msgid "Print"
+msgstr "Imprimir"
+
+#: keyeditor.cc:93
+msgid "Click to reset search string"
 msgstr ""
 
-#: keyeditor.cc:265
-msgid "redirectmenu"
+#: keyeditor.cc:97
+msgid "To remove a shortcut select an action then press this: "
 msgstr ""
 
-#: keyeditor.cc:267
-msgid "Editor_menus"
+#: keyeditor.cc:109
+msgid "Reset Bindings to Defaults"
 msgstr ""
 
-#: keyeditor.cc:269
+#: keyeditor.cc:227 lua_script_manager.cc:41
+msgid "Action"
+msgstr "Ação"
+
+#: keyeditor.cc:228
+msgid "Shortcut"
+msgstr "Atalho"
+
+#: keyeditor.cc:370
 msgid "RegionList"
 msgstr ""
 
-#: keyeditor.cc:271
-msgid "ProcessorMenu"
+#: keyeditor.cc:543
+msgid "Could not open temporary file to print bindings (%1)"
+msgstr ""
+
+#: keyeditor.cc:561
+msgid "Could not save bindings to file (%1)"
+msgstr ""
+
+#: latency_gui.cc:39
+msgid "sample"
 msgstr ""
 
 #: latency_gui.cc:40
@@ -6562,109 +7673,218 @@ msgstr ""
 msgid "period"
 msgstr ""
 
-#: latency_gui.cc:55
-msgid "%1 sample"
-msgid_plural "%1 samples"
-msgstr[0] ""
-msgstr[1] ""
-
-#: latency_gui.cc:72 panner_ui.cc:409
+#: latency_gui.cc:72 panner_ui.cc:411 plugin_pin_dialog.cc:109
+#: plugin_ui.cc:421
 msgid "Reset"
 msgstr "Reiniciar"
 
-#: latency_gui.cc:149 rhythm_ferret.cc:273 sfdb_ui.cc:1912
+#: latency_gui.cc:149 rhythm_ferret.cc:295 sfdb_ui.cc:1878
 msgid "programming error: %1 (%2)"
 msgstr ""
 
-#: location_ui.cc:52 location_ui.cc:54
+#: location_ui.cc:54 location_ui.cc:57
 msgid "Use PH"
 msgstr ""
 
-#: location_ui.cc:59
+#: location_ui.cc:55 location_ui.cc:58
+msgid "Goto"
+msgstr ""
+
+#: location_ui.cc:63
 msgid "Glue"
 msgstr ""
 
-#: location_ui.cc:87
+#: location_ui.cc:88
 msgid "Performer:"
 msgstr ""
 
-#: location_ui.cc:88
+#: location_ui.cc:89
 msgid "Composer:"
 msgstr ""
 
-#: location_ui.cc:90
+#: location_ui.cc:91
 msgid "Pre-Emphasis"
 msgstr ""
 
-#: location_ui.cc:317
+#: location_ui.cc:319
 msgid "Remove this range"
 msgstr ""
 
-#: location_ui.cc:318
+#: location_ui.cc:320
 msgid "Start time - middle click to locate here"
 msgstr ""
 
-#: location_ui.cc:319
+#: location_ui.cc:321
 msgid "End time - middle click to locate here"
 msgstr ""
 
-#: location_ui.cc:322
+#: location_ui.cc:324
 msgid "Set range start from playhead location"
 msgstr ""
 
-#: location_ui.cc:323
+#: location_ui.cc:325
 msgid "Set range end from playhead location"
 msgstr ""
 
-#: location_ui.cc:327
+#: location_ui.cc:329
 msgid "Remove this marker"
 msgstr ""
 
-#: location_ui.cc:328
+#: location_ui.cc:330
 msgid "Position - middle click to locate here"
 msgstr ""
 
-#: location_ui.cc:330
+#: location_ui.cc:332
 msgid "Set marker time from playhead location"
 msgstr ""
 
-#: location_ui.cc:499
+#: location_ui.cc:524
 msgid "You cannot put a CD marker at the start of the session"
 msgstr ""
 
-#: location_ui.cc:725
+#: location_ui.cc:750
 msgid "New Marker"
 msgstr ""
 
-#: location_ui.cc:726
+#: location_ui.cc:751
 msgid "New Range"
 msgstr ""
 
-#: location_ui.cc:739
+#: location_ui.cc:764
 msgid "<b>Loop/Punch Ranges</b>"
 msgstr ""
 
-#: location_ui.cc:764
+#: location_ui.cc:790
 msgid "<b>Markers (Including CD Index)</b>"
 msgstr ""
 
-#: location_ui.cc:799
+#: location_ui.cc:825
 msgid "<b>Ranges (Including CD Track Ranges)</b>"
 msgstr ""
 
-#: location_ui.cc:1042
+#: location_ui.cc:1068
 msgid "add range marker"
 msgstr "adicionar marca de intervalo"
 
-#: main.cc:82
+#: lua_script_manager.cc:31
+msgid "Add/Set"
+msgstr ""
+
+#: lua_script_manager.cc:34
+msgid "Call"
+msgstr ""
+
+#: lua_script_manager.cc:35
+msgid "New Hook"
+msgstr ""
+
+#: lua_script_manager.cc:77
+msgid "Signal(s)"
+msgstr ""
+
+#: lua_script_manager.cc:127
+msgid "Action %1"
+msgstr ""
+
+#: lua_script_manager.cc:132 lua_script_manager.cc:227
+msgid "Unset"
+msgstr ""
+
+#: luainstance.cc:1096
+msgid "Cannot read script '%1': %2"
+msgstr ""
+
+#: luawindow.cc:97
+msgid "Run"
+msgstr ""
+
+#: luawindow.cc:98
+msgid "Clear Output"
+msgstr ""
+
+#: luawindow.cc:102
+msgid "Revert"
+msgstr ""
+
+#: luawindow.cc:166
+msgid "Select Editor Buffer"
+msgstr ""
+
+#: luawindow.cc:253 luawindow.cc:258
+msgid "Window|Lua"
+msgstr ""
+
+#: luawindow.cc:286 luawindow.cc:304
+msgid "LuaException: %1"
+msgstr ""
+
+#: luawindow.cc:342
+msgid "Deleted %1"
+msgstr ""
+
+#: luawindow.cc:345
+msgid "Failed to delete %1"
+msgstr ""
+
+#: luawindow.cc:411
+msgid ""
+"Missing script header.\n"
+"The script requires an '{ardour}' info table and a 'factory' function."
+msgstr ""
+
+#: luawindow.cc:416
+msgid "Script fails to compile."
+msgstr ""
+
+#: luawindow.cc:423
+msgid "Invalid or missing script-name or script-type."
+msgstr ""
+
+#: luawindow.cc:428
+msgid ""
+"Invalid script-type.\n"
+"Valid types are 'EditorAction' and 'Snippet'."
+msgstr ""
+
+#: luawindow.cc:439 luawindow.cc:490
+msgid "Saved as %1"
+msgstr "Salvo como %1"
+
+#: luawindow.cc:442 luawindow.cc:493
+msgid "Error saving file: %1"
+msgstr ""
+
+#: luawindow.cc:452
+msgid ""
+"Script with given name '%1' already exists.\n"
+"Use a different name in the descriptor."
+msgstr ""
+
+#: luawindow.cc:636
+msgid "Scratch Buffer %1"
+msgstr ""
+
+#: luawindow.cc:638
+msgid "Action: '%1'"
+msgstr ""
+
+#: luawindow.cc:640
+msgid "Snippet: %1"
+msgstr ""
+
+#: luawindow.cc:652
+msgid "Save as"
+msgstr "Salvar Como"
+
+#: main.cc:88
 msgid "%1 could not connect to the audio backend."
 msgstr ""
 
-#: main.cc:107 main.cc:123
+#: main.cc:135 main.cc:151
 msgid "The audio backend (%1) has failed, or terminated"
 msgstr ""
 
-#: main.cc:110
+#: main.cc:138
 msgid ""
 "%2 exited unexpectedly, and without notifying %1.\n"
 "\n"
@@ -6673,77 +7893,97 @@ msgid ""
 "Click OK to exit %1."
 msgstr ""
 
-#: main.cc:124
+#: main.cc:152
 msgid "%2 exited unexpectedly, and without notifying %1."
 msgstr ""
 
-#: main.cc:219
+#: main.cc:247
 msgid ""
 "\n"
 "   %1 could not understand your command line      "
 msgstr ""
 
-#: main.cc:221
+#: main.cc:249
 msgid "An error was encountered while launching %1"
 msgstr ""
 
-#: main.cc:310
+#: main.cc:350
 msgid " (built using "
 msgstr ""
 
-#: main.cc:313
+#: main.cc:353
 msgid " and GCC version "
 msgstr ""
 
-#: main.cc:323
-msgid "Copyright (C) 1999-2012 Paul Davis"
+#: main.cc:363
+msgid "Copyright (C) 1999-2015 Paul Davis"
 msgstr ""
 
-#: main.cc:324
+#: main.cc:364
 msgid ""
 "Some portions Copyright (C) Steve Harris, Ari Johnson, Brett Viren, Joel "
 "Baker, Robin Gareus"
 msgstr ""
 
-#: main.cc:326
+#: main.cc:366
 msgid "%1 comes with ABSOLUTELY NO WARRANTY"
 msgstr ""
 
-#: main.cc:327
+#: main.cc:367
 msgid "not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
 msgstr ""
 
-#: main.cc:328
+#: main.cc:368
 msgid "This is free software, and you are welcome to redistribute it "
 msgstr "Isto é um Software Livre. Fique à vontade para redistribuí-lo "
 
-#: main.cc:329
+#: main.cc:369
 msgid "under certain conditions; see the source for copying conditions."
 msgstr "com algumas condições; veja o fonte para mais detalhes"
 
-#: main.cc:334
+#: main.cc:374
 msgid "could not initialize %1."
 msgstr ""
 
-#: main.cc:344
+#: main.cc:384
 msgid "Cannot xinstall SIGPIPE error handler"
 msgstr ""
 
-#: main.cc:351
+#: main.cc:391
+msgid "Could not complete pre-GUI initialization"
+msgstr ""
+
+#: main.cc:398
 msgid "could not create %1 GUI"
 msgstr ""
 
-#: main_clock.cc:52
+#: main_clock.cc:51
 msgid "Display delta to edit cursor"
 msgstr ""
 
-#: marker.cc:273
+#: main_clock.cc:66 tempo_dialog.cc:55
+msgid "Edit Tempo"
+msgstr ""
+
+#: main_clock.cc:67 tempo_dialog.cc:429
+msgid "Edit Meter"
+msgstr ""
+
+#: main_clock.cc:68
+msgid "Insert Tempo Change"
+msgstr ""
+
+#: main_clock.cc:69
+msgid "Insert Meter Change"
+msgstr ""
+
+#: marker.cc:280
 msgid "MarkerText"
 msgstr ""
 
 #: midi_channel_selector.cc:161 midi_channel_selector.cc:400
-#: midi_channel_selector.cc:436 rc_option_editor.cc:1573
-#: rc_option_editor.cc:2203 sfdb_ui.cc:665
+#: midi_channel_selector.cc:436 rc_option_editor.cc:2157
+#: rc_option_editor.cc:2799 sfdb_ui.cc:671
 msgid "None"
 msgstr "Nenhum"
 
@@ -6824,11 +8064,11 @@ msgstr ""
 msgid "Click to force all MIDI channel messages to channel %1"
 msgstr ""
 
-#: midi_channel_selector.cc:718
+#: midi_channel_selector.cc:720
 msgid "Click to toggle recording of channel %1"
 msgstr ""
 
-#: midi_channel_selector.cc:726
+#: midi_channel_selector.cc:728
 msgid "Click to force all recorded channels to %1"
 msgstr ""
 
@@ -6932,200 +8172,196 @@ msgstr ""
 msgid "MidiPortDialog"
 msgstr ""
 
-#: midi_region_view.cc:859
+#: midi_region_view.cc:855
 msgid "channel edit"
 msgstr ""
 
-#: midi_region_view.cc:895
+#: midi_region_view.cc:891
 msgid "velocity edit"
 msgstr ""
 
-#: midi_region_view.cc:954
+#: midi_region_view.cc:958
 msgid "add note"
 msgstr ""
 
-#: midi_region_view.cc:1885
+#: midi_region_view.cc:1902
 msgid "step add"
 msgstr ""
 
-#: midi_region_view.cc:1979 midi_region_view.cc:2002
+#: midi_region_view.cc:1996 midi_region_view.cc:2019
 msgid "alter patch change"
 msgstr ""
 
-#: midi_region_view.cc:2038
+#: midi_region_view.cc:2055
 msgid "add patch change"
 msgstr ""
 
-#: midi_region_view.cc:2060 midi_region_view.cc:2061
+#: midi_region_view.cc:2077 midi_region_view.cc:2078
 msgid "move patch change"
 msgstr ""
 
-#: midi_region_view.cc:2073 midi_region_view.cc:2074
+#: midi_region_view.cc:2090 midi_region_view.cc:2091
 msgid "delete patch change"
 msgstr ""
 
-#: midi_region_view.cc:2112
+#: midi_region_view.cc:2129
 msgid "delete selection"
-msgstr ""
+msgstr "remover seleção"
 
-#: midi_region_view.cc:2128
+#: midi_region_view.cc:2146
 msgid "delete note"
-msgstr ""
+msgstr "remover nota"
 
 #: midi_region_view.cc:2587
 msgid "move notes"
-msgstr ""
+msgstr "mover notas"
 
-#: midi_region_view.cc:3070
+#: midi_region_view.cc:3137
 msgid "change velocities"
 msgstr ""
 
-#: midi_region_view.cc:3136
+#: midi_region_view.cc:3203
 msgid "transpose"
 msgstr ""
 
-#: midi_region_view.cc:3164
+#: midi_region_view.cc:3231
 msgid "change note lengths"
 msgstr ""
 
-#: midi_region_view.cc:3240
+#: midi_region_view.cc:3307
 msgid "nudge"
 msgstr ""
 
-#: midi_region_view.cc:3255
+#: midi_region_view.cc:3322
 msgid "change channel"
 msgstr ""
 
-#: midi_region_view.cc:3295
+#: midi_region_view.cc:3370
 msgid "Bank "
 msgstr ""
 
-#: midi_region_view.cc:3296
-msgid "Program "
-msgstr ""
-
-#: midi_region_view.cc:3297
+#: midi_region_view.cc:3372
 msgid "Channel "
 msgstr ""
 
-#: midi_region_view.cc:3484
+#: midi_region_view.cc:3559
 msgid "paste"
 msgstr ""
 
-#: midi_streamview.cc:185
+#: midi_streamview.cc:184
 msgid "attempt to display MIDI region with no source"
 msgstr ""
 
-#: midi_streamview.cc:195
+#: midi_streamview.cc:194
 msgid "attempt to display MIDI region with no model"
 msgstr ""
 
-#: midi_streamview.cc:506
+#: midi_streamview.cc:505
 msgid "failed to create MIDI region"
 msgstr ""
 
-#: midi_time_axis.cc:309
+#: midi_time_axis.cc:306
 msgid "External MIDI Device"
 msgstr ""
 
-#: midi_time_axis.cc:310
+#: midi_time_axis.cc:307
 msgid "External Device Mode"
 msgstr ""
 
-#: midi_time_axis.cc:318
+#: midi_time_axis.cc:315
 msgid "Chns"
 msgstr ""
 
-#: midi_time_axis.cc:320
+#: midi_time_axis.cc:317
 msgid "Click to edit channel settings"
 msgstr ""
 
-#: midi_time_axis.cc:519
+#: midi_time_axis.cc:516
 msgid "Show Full Range"
 msgstr ""
 
-#: midi_time_axis.cc:524
+#: midi_time_axis.cc:521
 msgid "Fit Contents"
 msgstr ""
 
-#: midi_time_axis.cc:528
+#: midi_time_axis.cc:525
 msgid "Note Range"
 msgstr ""
 
-#: midi_time_axis.cc:529
+#: midi_time_axis.cc:526
 msgid "Note Mode"
 msgstr ""
 
-#: midi_time_axis.cc:530
+#: midi_time_axis.cc:527
 msgid "Channel Selector"
 msgstr ""
 
-#: midi_time_axis.cc:535
+#: midi_time_axis.cc:532
 msgid "Color Mode"
 msgstr ""
 
-#: midi_time_axis.cc:594
+#: midi_time_axis.cc:591
 msgid "Bender"
 msgstr ""
 
-#: midi_time_axis.cc:598
+#: midi_time_axis.cc:595
 msgid "Pressure"
 msgstr ""
 
-#: midi_time_axis.cc:610
+#: midi_time_axis.cc:607
 msgid "Controllers"
 msgstr ""
 
-#: midi_time_axis.cc:615
+#: midi_time_axis.cc:612
 msgid "No MIDI Channels selected"
 msgstr ""
 
-#: midi_time_axis.cc:672 midi_time_axis.cc:801
+#: midi_time_axis.cc:669 midi_time_axis.cc:798
 msgid "Hide all channels"
 msgstr ""
 
-#: midi_time_axis.cc:676 midi_time_axis.cc:805
+#: midi_time_axis.cc:673 midi_time_axis.cc:802
 msgid "Show all channels"
 msgstr ""
 
-#: midi_time_axis.cc:687 midi_time_axis.cc:816
+#: midi_time_axis.cc:684 midi_time_axis.cc:813
 msgid "Channel %1"
 msgstr ""
 
-#: midi_time_axis.cc:942 midi_time_axis.cc:974
+#: midi_time_axis.cc:939 midi_time_axis.cc:971
 msgid "Controllers %1-%2"
 msgstr ""
 
-#: midi_time_axis.cc:965 midi_time_axis.cc:968
+#: midi_time_axis.cc:962 midi_time_axis.cc:965
 msgid "Controller %1"
 msgstr ""
 
-#: midi_time_axis.cc:991
+#: midi_time_axis.cc:988
 msgid "Sustained"
 msgstr ""
 
-#: midi_time_axis.cc:998
+#: midi_time_axis.cc:995
 msgid "Percussive"
 msgstr ""
 
-#: midi_time_axis.cc:1018
+#: midi_time_axis.cc:1015
 msgid "Meter Colors"
 msgstr ""
 
-#: midi_time_axis.cc:1025
+#: midi_time_axis.cc:1022
 msgid "Channel Colors"
 msgstr ""
 
-#: midi_time_axis.cc:1032
+#: midi_time_axis.cc:1029
 msgid "Track Color"
 msgstr ""
 
-#: midi_time_axis.cc:1606 midi_time_axis.cc:1612 midi_time_axis.cc:1622
-#: midi_time_axis.cc:1628
+#: midi_time_axis.cc:1610 midi_time_axis.cc:1616 midi_time_axis.cc:1626
+#: midi_time_axis.cc:1632
 msgid "all"
 msgstr ""
 
-#: midi_time_axis.cc:1609 midi_time_axis.cc:1625
+#: midi_time_axis.cc:1613 midi_time_axis.cc:1629
 msgid "some"
 msgstr ""
 
@@ -7141,7 +8377,7 @@ msgstr ""
 msgid "Decimal"
 msgstr ""
 
-#: midi_tracer.cc:57 rc_option_editor.cc:740
+#: midi_tracer.cc:57 rc_option_editor.cc:1356
 msgid "Enabled"
 msgstr ""
 
@@ -7157,35 +8393,36 @@ msgstr ""
 msgid "New velocity"
 msgstr ""
 
-#: missing_file_dialog.cc:35
+#: missing_file_dialog.cc:36
 msgid "Missing File"
 msgstr ""
 
-#: missing_file_dialog.cc:37
+#: missing_file_dialog.cc:38
 msgid "Select a folder to search"
 msgstr ""
 
-#: missing_file_dialog.cc:38
+#: missing_file_dialog.cc:39
 msgid "Add chosen folder to search path, and try again"
 msgstr ""
 
-#: missing_file_dialog.cc:40
+#: missing_file_dialog.cc:41
 msgid "Stop loading this session"
 msgstr ""
 
-#: missing_file_dialog.cc:41
+#: missing_file_dialog.cc:42
 msgid "Skip all missing files"
 msgstr ""
 
-#: missing_file_dialog.cc:42
+#: missing_file_dialog.cc:43
 msgid "Skip this file"
 msgstr ""
 
-#: missing_file_dialog.cc:53
+#: missing_file_dialog.cc:57 tempo_dialog.cc:135 tempo_dialog.cc:136
+#: tempo_dialog.cc:484 tempo_dialog.cc:485
 msgid "audio"
 msgstr ""
 
-#: missing_file_dialog.cc:70
+#: missing_file_dialog.cc:74
 msgid ""
 "%1 cannot find the %2 file\n"
 "\n"
@@ -7197,7 +8434,7 @@ msgid ""
 "\n"
 msgstr ""
 
-#: missing_file_dialog.cc:104
+#: missing_file_dialog.cc:108
 msgid "Click to choose an additional folder"
 msgstr ""
 
@@ -7205,516 +8442,706 @@ msgstr ""
 msgid "Missing Plugins"
 msgstr ""
 
-#: missing_plugin_dialog.cc:33 transcode_video_dialog.cc:60
+#: missing_plugin_dialog.cc:36 transcode_video_dialog.cc:60
 msgid "OK"
 msgstr "OK"
 
-#: mixer_actor.cc:55
-msgid "Toggle Solo on Mixer-Selected Tracks/Busses"
+#: missing_plugin_dialog.cc:42
+msgid ""
+"This session contains the following plugins that cannot be found on this "
+"system:\n"
+"\n"
 msgstr ""
 
-#: mixer_actor.cc:56
-msgid "Toggle Mute on Mixer-Selected Tracks/Busses"
-msgstr ""
-
-#: mixer_actor.cc:57
-msgid "Toggle Rec-enable on Mixer-Selected Tracks/Busses"
-msgstr ""
-
-#: mixer_actor.cc:58
-msgid "Decrease Gain on Mixer-Selected Tracks/Busses"
-msgstr ""
-
-#: mixer_actor.cc:59
-msgid "Increase Gain on Mixer-Selected Tracks/Busses"
-msgstr ""
-
-#: mixer_actor.cc:60
-msgid "Set Gain to 0dB on Mixer-Selected Tracks/Busses"
-msgstr ""
-
-#: mixer_actor.cc:63
-msgid "Copy Selected Processors"
-msgstr ""
-
-#: mixer_actor.cc:64
-msgid "Cut Selected Processors"
-msgstr ""
-
-#: mixer_actor.cc:65
-msgid "Paste Selected Processors"
-msgstr ""
-
-#: mixer_actor.cc:66
-msgid "Delete Selected Processors"
-msgstr ""
-
-#: mixer_actor.cc:67
-msgid "Select All (visible) Processors"
-msgstr ""
-
-#: mixer_actor.cc:68
-msgid "Toggle Selected Processors"
-msgstr ""
-
-#: mixer_actor.cc:69
-msgid "Toggle Selected Plugins"
-msgstr ""
-
-#: mixer_actor.cc:70
-msgid "Deselect all strips and processors"
-msgstr ""
-
-#: mixer_actor.cc:72 mixer_actor.cc:73
-msgid "Scroll Mixer Window to the left"
-msgstr ""
-
-#: mixer_actor.cc:75
-msgid "Toggle MIDI Input Active for Mixer-Selected Tracks/Busses"
-msgstr ""
-
-#: mixer_actor.cc:90
-msgid "Loaded mixer bindings from %1"
-msgstr ""
-
-#: mixer_actor.cc:92
-msgid "Could not find mixer.bindings in search path %1"
+#: missing_plugin_dialog.cc:48
+msgid ""
+"\n"
+"Those plugins will be replaced with inactive stubs.\n"
+"It is recommended that you install the missing plugins and re-load the "
+"session.\n"
+"(also check the blacklist, Window > Log and Preferences > Plugins)"
 msgstr ""
 
-#: mixer_strip.cc:96 mixer_strip.cc:125
+#: mixer_strip.cc:100 mixer_strip.cc:133
 msgid "pre"
 msgstr ""
 
-#: mixer_strip.cc:98 mixer_strip.cc:127 mixer_strip.cc:372 mixer_strip.cc:1410
-#: rc_option_editor.cc:2331
+#: mixer_strip.cc:104 mixer_strip.cc:136 mixer_strip.cc:397
+#: mixer_strip.cc:1548 mixer_strip.cc:1559 rc_option_editor.cc:3147
 msgid "Comments"
-msgstr ""
+msgstr "Comentários"
 
-#: mixer_strip.cc:149
+#: mixer_strip.cc:160
 msgid "Click to toggle the width of this mixer strip."
 msgstr ""
 
-#: mixer_strip.cc:151
+#: mixer_strip.cc:162
 msgid ""
 "\n"
 "%1-%2-click to toggle the width of all strips."
 msgstr ""
 
-#: mixer_strip.cc:158
+#: mixer_strip.cc:171
 msgid "Hide this mixer strip"
 msgstr ""
 
-#: mixer_strip.cc:169
+#: mixer_strip.cc:182
 msgid "Click to select metering point"
 msgstr ""
 
-#: mixer_strip.cc:185
+#: mixer_strip.cc:198
 msgid "Isolate Solo"
 msgstr ""
 
-#: mixer_strip.cc:193
+#: mixer_strip.cc:206
 msgid "Lock Solo Status"
 msgstr ""
 
-#: mixer_strip.cc:196 mixer_strip.cc:2027
+#: mixer_strip.cc:208 mixer_strip.cc:2225
+msgid "SoloLock|Lock"
+msgstr ""
+
+#: mixer_strip.cc:209 mixer_strip.cc:2224
 msgid "Iso"
 msgstr ""
 
-#: mixer_strip.cc:250
+#: mixer_strip.cc:263
 msgid "Mix group"
+msgstr "Mixar Grupo"
+
+#: mixer_strip.cc:275
+msgid "Trim: "
 msgstr ""
 
-#: mixer_strip.cc:368 rc_option_editor.cc:2327
+#: mixer_strip.cc:393 rc_option_editor.cc:3143
 msgid "Phase Invert"
 msgstr ""
 
-#: mixer_strip.cc:369 rc_option_editor.cc:2328
+#: mixer_strip.cc:394 rc_option_editor.cc:3144
 msgid "Record & Monitor"
 msgstr ""
 
-#: mixer_strip.cc:370 rc_option_editor.cc:2329
+#: mixer_strip.cc:395 rc_option_editor.cc:3145
 msgid "Solo Iso / Lock"
 msgstr ""
 
-#: mixer_strip.cc:524
+#: mixer_strip.cc:398 rc_option_editor.cc:3148
+msgid "VCA Assigns"
+msgstr ""
+
+#: mixer_strip.cc:545
+msgid "Show/Hide Monitoring Section"
+msgstr ""
+
+#: mixer_strip.cc:590
 msgid "Enable/Disable MIDI input"
 msgstr ""
 
-#: mixer_strip.cc:688
+#: mixer_strip.cc:756
 msgid "Aux"
 msgstr ""
 
-#: mixer_strip.cc:710
+#: mixer_strip.cc:782
 msgid "Snd"
 msgstr ""
 
-#: mixer_strip.cc:776 mixer_strip.cc:879 processor_box.cc:2382
+#: mixer_strip.cc:853 mixer_strip.cc:958 processor_box.cc:3606
 msgid "Not connected to audio engine - no I/O changes are possible"
 msgstr ""
 
-#: mixer_strip.cc:833 mixer_strip.cc:935
+#: mixer_strip.cc:911 mixer_strip.cc:1014
 msgid "Add %1 port"
 msgstr ""
 
-#: mixer_strip.cc:840 mixer_strip.cc:942
+#: mixer_strip.cc:919 mixer_strip.cc:1021 monitor_section.cc:1466
+#: plugin_pin_dialog.cc:1782
 msgid "Routing Grid"
 msgstr ""
 
-#: mixer_strip.cc:1171
-msgid "<b>INPUT</b> to %1"
+#: mixer_strip.cc:1298
+msgid "MIDI "
 msgstr ""
 
-#: mixer_strip.cc:1174
+#: mixer_strip.cc:1302
+msgid "<b>INPUT</b> to %1"
+msgstr "<b>ENTRADA</b> PARA %1"
+
+#: mixer_strip.cc:1304 monitor_section.cc:1511
 msgid "<b>OUTPUT</b> from %1"
-msgstr ""
+msgstr "<b>SAÍDA</b> DE %1"
 
-#: mixer_strip.cc:1287
+#: mixer_strip.cc:1417 monitor_section.cc:1598
 msgid "Disconnected"
-msgstr ""
+msgstr "Desconectado"
 
-#: mixer_strip.cc:1413
-msgid "*Comments*"
+#: mixer_strip.cc:1544
+msgid "Click to add/edit comments"
 msgstr ""
 
-#: mixer_strip.cc:1420
+#: mixer_strip.cc:1548 mixer_strip.cc:1559
 msgid "Cmt"
 msgstr ""
 
-#: mixer_strip.cc:1423
-msgid "*Cmt*"
-msgstr ""
-
-#: mixer_strip.cc:1429
-msgid "Click to Add/Edit Comments"
-msgstr ""
-
-#: mixer_strip.cc:1473
+#: mixer_strip.cc:1604
 msgid "Grp"
 msgstr ""
 
-#: mixer_strip.cc:1476
+#: mixer_strip.cc:1607
 msgid "~G"
 msgstr ""
 
-#: mixer_strip.cc:1505 route_time_axis.cc:561
+#: mixer_strip.cc:1648 route_time_axis.cc:585 vca_master_strip.cc:396
 msgid "Color..."
-msgstr ""
+msgstr "Cor..."
 
-#: mixer_strip.cc:1507 route_time_axis.cc:563
+#: mixer_strip.cc:1650 route_time_axis.cc:587
 msgid "Comments..."
-msgstr ""
+msgstr "Comentários..."
 
-#: mixer_strip.cc:1509 route_time_axis.cc:565
+#: mixer_strip.cc:1652 route_time_axis.cc:589
 msgid "Inputs..."
-msgstr ""
+msgstr "Entradas..."
 
-#: mixer_strip.cc:1511 route_time_axis.cc:567
+#: mixer_strip.cc:1654 route_time_axis.cc:591
 msgid "Outputs..."
-msgstr ""
+msgstr "Saídas..."
 
-#: mixer_strip.cc:1516
+#: mixer_strip.cc:1659
 msgid "Save As Template..."
+msgstr "Salvar como Esquema..."
+
+#: mixer_strip.cc:1665 route_group_dialog.cc:45 route_time_axis.cc:851
+msgid "Active"
+msgstr "Ativar"
+
+#: mixer_strip.cc:1673 plugin_pin_dialog.cc:1011
+msgid "Strict I/O"
 msgstr ""
 
-#: mixer_strip.cc:1530
-msgid "Adjust Latency..."
+#: mixer_strip.cc:1683 processor_box.cc:3710
+msgid "Pin Connections..."
 msgstr ""
 
-#: mixer_strip.cc:1533
+#: mixer_strip.cc:1687
+msgid "Adjust Latency..."
+msgstr "Ajustar Latência"
+
+#: mixer_strip.cc:1690
 msgid "Protect Against Denormals"
 msgstr ""
 
-#: mixer_strip.cc:1539 route_time_axis.cc:580
-msgid "Remote Control ID..."
-msgstr ""
+#: mixer_strip.cc:1709 route_time_axis.cc:867
+msgid "Duplicate..."
+msgstr "Duplicar..."
 
-#: mixer_strip.cc:1823
+#: mixer_strip.cc:2004
 msgid "Pre"
 msgstr ""
 
-#: mixer_strip.cc:1827
+#: mixer_strip.cc:2008
 msgid "Post"
 msgstr ""
 
-#: mixer_strip.cc:1847
-msgid "Pr"
+#: mixer_strip.cc:2024
+msgid "Meter|In"
+msgstr ""
+
+#: mixer_strip.cc:2028
+msgid "Meter|Pr"
+msgstr ""
+
+#: mixer_strip.cc:2032
+msgid "Meter|Po"
 msgstr ""
 
-#: mixer_strip.cc:1851
-msgid "Po"
+#: mixer_strip.cc:2036
+msgid "Meter|O"
 msgstr ""
 
-#: mixer_strip.cc:1860
-msgid "C"
+#: mixer_strip.cc:2041
+msgid "Meter|C"
 msgstr ""
 
-#: mixer_strip.cc:2008 route_ui.cc:168
+#: mixer_strip.cc:2202 route_ui.cc:193
 msgid "Disk"
 msgstr ""
 
-#: mixer_strip.cc:2020 monitor_section.cc:70
+#: mixer_strip.cc:2204
+msgid "Mon"
+msgstr ""
+
+#: mixer_strip.cc:2217 monitor_section.cc:81
 msgid "AFL"
 msgstr ""
 
-#: mixer_strip.cc:2023 monitor_section.cc:71
+#: mixer_strip.cc:2220 monitor_section.cc:82
 msgid "PFL"
 msgstr ""
 
-#: mixer_strip.cc:2034 meter_strip.cc:380
-msgid "D"
+#: mixer_strip.cc:2230 meter_strip.cc:385
+msgid "MonitorInput|I"
+msgstr ""
+
+#: mixer_strip.cc:2231 meter_strip.cc:386
+msgid "MonitorDisk|D"
+msgstr ""
+
+#: mixer_strip.cc:2233
+msgid "Mon|O"
+msgstr ""
+
+#: mixer_strip.cc:2246 meter_strip.cc:377 route_time_axis.cc:2730
+#: vca_master_strip.cc:202 vca_time_axis.cc:227
+msgid "AfterFader|A"
+msgstr ""
+
+#: mixer_strip.cc:2249
+msgid "Prefader|P"
+msgstr ""
+
+#: mixer_strip.cc:2254
+msgid "SoloIso|I"
+msgstr ""
+
+#: mixer_strip.cc:2255
+msgid "SoloLock|L"
 msgstr ""
 
-#: mixer_strip.cc:2241
+#: mixer_strip.cc:2460
 msgid "Pre Fader"
 msgstr "Pré Fade"
 
-#: mixer_strip.cc:2242
+#: mixer_strip.cc:2461
 msgid "Post Fader"
 msgstr "Pós Fade"
 
-#: mixer_strip.cc:2286 meter_strip.cc:847
+#: mixer_strip.cc:2506 meter_strip.cc:858
 msgid "Change all in Group to %1"
 msgstr ""
 
-#: mixer_strip.cc:2288 meter_strip.cc:849
+#: mixer_strip.cc:2508 meter_strip.cc:860
 msgid "Change all to %1"
 msgstr ""
 
-#: mixer_strip.cc:2290 meter_strip.cc:851
+#: mixer_strip.cc:2510 meter_strip.cc:862
 msgid "Change same track-type to %1"
 msgstr ""
 
-#: mixer_ui.cc:130 route_time_axis.cc:818
+#: mixer_ui.cc:152 route_time_axis.cc:828
 msgid "Group"
+msgstr "Grupo"
+
+#: mixer_ui.cc:221
+msgid "Favorite Plugins"
+msgstr "Plugins Favoritos"
+
+#: mixer_ui.cc:627
+msgid "Error adding GUI elements for new tracks/busses %1"
 msgstr ""
 
-#: mixer_ui.cc:1224
+#: mixer_ui.cc:1542
 msgid "track display list item for renamed strip not found!"
 msgstr "não foi encontrada qualquer trilha para o painel de mixer"
 
-#: mixer_ui.cc:1316
+#: mixer_ui.cc:1636
 msgid "-all-"
 msgstr "-tudo-"
 
-#: mixer_ui.cc:1853
+#: mixer_ui.cc:2135
 msgid "Strips"
 msgstr "Painéis"
 
-#: meter_strip.cc:157
+#: mixer_ui.cc:2479
+msgid "No Track/Bus is selected."
+msgstr ""
+
+#: mixer_ui.cc:2481
+msgid "Add at the top"
+msgstr ""
+
+#: mixer_ui.cc:2483
+msgid "Add Pre-Fader"
+msgstr ""
+
+#: mixer_ui.cc:2485
+msgid "Add Post-Fader"
+msgstr ""
+
+#: mixer_ui.cc:2487
+msgid "Add at the end"
+msgstr ""
+
+#: mixer_ui.cc:2493
+msgid "Remove from favorites"
+msgstr ""
+
+#: mixer_ui.cc:2499
+msgid "Delete Preset"
+msgstr ""
+
+#: mixer_ui.cc:2739
+msgid "Toggle Solo on Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: mixer_ui.cc:2740
+msgid "Toggle Mute on Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: mixer_ui.cc:2741
+msgid "Toggle Rec-enable on Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: mixer_ui.cc:2742
+msgid "Decrease Gain on Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: mixer_ui.cc:2743
+msgid "Increase Gain on Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: mixer_ui.cc:2744
+msgid "Set Gain to 0dB on Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: mixer_ui.cc:2747
+msgid "Copy Selected Processors"
+msgstr ""
+
+#: mixer_ui.cc:2748
+msgid "Cut Selected Processors"
+msgstr ""
+
+#: mixer_ui.cc:2749
+msgid "Paste Selected Processors"
+msgstr ""
+
+#: mixer_ui.cc:2750
+msgid "Delete Selected Processors"
+msgstr ""
+
+#: mixer_ui.cc:2751
+msgid "Select All (visible) Processors"
+msgstr ""
+
+#: mixer_ui.cc:2752
+msgid "Toggle Selected Processors"
+msgstr ""
+
+#: mixer_ui.cc:2753
+msgid "Toggle Selected Plugins"
+msgstr ""
+
+#: mixer_ui.cc:2754
+msgid "Deselect all strips and processors"
+msgstr ""
+
+#: mixer_ui.cc:2756 mixer_ui.cc:2757
+msgid "Scroll Mixer Window to the left"
+msgstr ""
+
+#: mixer_ui.cc:2759
+msgid "Toggle MIDI Input Active for Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: meter_strip.cc:160
 msgid "Reset Peak"
 msgstr ""
 
-#: meter_strip.cc:883
+#: meter_strip.cc:380 route_time_axis.cc:2734 vca_master_strip.cc:206
+#: vca_time_axis.cc:231
+msgid "PreFader|P"
+msgstr ""
+
+#: meter_strip.cc:894
 msgid "Variable height"
 msgstr ""
 
-#: meter_strip.cc:884
+#: meter_strip.cc:895
 msgid "Short"
 msgstr ""
 
-#: meter_strip.cc:885
+#: meter_strip.cc:896
 msgid "Tall"
 msgstr ""
 
-#: meter_strip.cc:886
+#: meter_strip.cc:897
 msgid "Grande"
 msgstr ""
 
-#: meter_strip.cc:887
+#: meter_strip.cc:898
 msgid "Venti"
 msgstr ""
 
-#: meter_patterns.cc:82
-msgid "Peak"
+#: meter_patterns.cc:84
+msgid "Peak (+6dBFS)"
+msgstr ""
+
+#: meter_patterns.cc:87
+msgid "Peak (0dBFS)"
 msgstr ""
 
-#: meter_patterns.cc:85
+#: meter_patterns.cc:90
 msgid "RMS + Peak"
 msgstr ""
 
-#: meter_patterns.cc:88
+#: meter_patterns.cc:93
 msgid "IEC1/DIN"
 msgstr ""
 
-#: meter_patterns.cc:91
+#: meter_patterns.cc:96
 msgid "IEC1/Nordic"
 msgstr ""
 
-#: meter_patterns.cc:94
+#: meter_patterns.cc:99
 msgid "IEC2/BBC"
 msgstr ""
 
-#: meter_patterns.cc:97
+#: meter_patterns.cc:102
 msgid "IEC2/EBU"
 msgstr ""
 
-#: meter_patterns.cc:100
-msgid "K20"
+#: meter_patterns.cc:105
+msgid "K20/RMS"
 msgstr ""
 
-#: meter_patterns.cc:103
-msgid "K14"
+#: meter_patterns.cc:108
+msgid "K14/RMS"
 msgstr ""
 
-#: meter_patterns.cc:106
-msgid "K12"
+#: meter_patterns.cc:111
+msgid "K12/RMS"
 msgstr ""
 
-#: meter_patterns.cc:109
+#: meter_patterns.cc:114
 msgid "VU"
 msgstr ""
 
-#: monitor_section.cc:69
+#: monitor_section.cc:80
 msgid "SiP"
 msgstr ""
 
-#: monitor_section.cc:96 route_group_dialog.cc:49
+#: monitor_section.cc:113 route_group_dialog.cc:49
 msgid "Soloing"
 msgstr ""
 
-#: monitor_section.cc:100
+#: monitor_section.cc:117
 msgid "Isolated"
 msgstr ""
 
-#: monitor_section.cc:104
+#: monitor_section.cc:121
 msgid "Auditioning"
 msgstr ""
 
-#: monitor_section.cc:114
+#: monitor_section.cc:132
 msgid ""
 "When active, something is solo-isolated.\n"
 "Click to de-isolate everything"
 msgstr ""
 
-#: monitor_section.cc:117
+#: monitor_section.cc:135
 msgid ""
 "When active, auditioning is active.\n"
 "Click to stop the audition"
 msgstr ""
 
-#: monitor_section.cc:134
+#: monitor_section.cc:152
 msgid "Solo controls affect solo-in-place"
 msgstr ""
 
-#: monitor_section.cc:140
+#: monitor_section.cc:158
 msgid "Solo controls toggle after-fader-listen"
 msgstr ""
 
-#: monitor_section.cc:146
+#: monitor_section.cc:164
 msgid "Solo controls toggle pre-fader-listen"
 msgstr ""
 
-#: monitor_section.cc:156
+#: monitor_section.cc:170
+msgid "Excl. Solo"
+msgstr ""
+
+#: monitor_section.cc:172
+msgid "Exclusive solo means that only 1 solo is active at a time"
+msgstr ""
+
+#: monitor_section.cc:179
+msgid "Solo » Mute"
+msgstr ""
+
+#: monitor_section.cc:181
+msgid ""
+"If enabled, solo will override mute\n"
+"(a soloed & muted track or bus will be audible)"
+msgstr ""
+
+#: monitor_section.cc:189
+msgid "Processors"
+msgstr ""
+
+#: monitor_section.cc:191
+msgid "Allow one to add monitor effect processors"
+msgstr ""
+
+#: monitor_section.cc:206
 msgid "Gain increase for soloed signals (0dB is normal)"
 msgstr ""
 
-#: monitor_section.cc:170
+#: monitor_section.cc:210 monitor_section.cc:227 monitor_section.cc:244
+#: monitor_section.cc:289
+msgid "0 dB"
+msgstr ""
+
+#: monitor_section.cc:211
+msgid "3 dB"
+msgstr ""
+
+#: monitor_section.cc:212
+msgid "6 dB"
+msgstr ""
+
+#: monitor_section.cc:213
+msgid "10 dB"
+msgstr ""
+
+#: monitor_section.cc:215
 msgid "Solo Boost"
 msgstr ""
 
-#: monitor_section.cc:185
+#: monitor_section.cc:222
 msgid ""
 "Gain reduction non-soloed signals\n"
 "A value above -inf dB causes \"solo-in-front\""
 msgstr ""
 
-#: monitor_section.cc:196
-msgid "SiP Cut"
+#: monitor_section.cc:228 monitor_section.cc:246 monitor_section.cc:291
+msgid "-6 dB"
 msgstr ""
 
-#: monitor_section.cc:211
-msgid "Gain reduction to use when dimming monitor outputs"
+#: monitor_section.cc:229 monitor_section.cc:247 monitor_section.cc:292
+msgid "-12 dB"
 msgstr ""
 
-#: monitor_section.cc:225 monitor_section.cc:283
-msgid "Dim"
+#: monitor_section.cc:230 monitor_section.cc:248 monitor_section.cc:293
+msgid "-20 dB"
 msgstr ""
 
-#: monitor_section.cc:235
-msgid "Excl. Solo"
+#: monitor_section.cc:231
+msgid "OFF"
 msgstr ""
 
-#: monitor_section.cc:237
-msgid "Exclusive solo means that only 1 solo is active at a time"
+#: monitor_section.cc:233
+msgid "SiP Cut"
 msgstr ""
 
-#: monitor_section.cc:244
-msgid "Solo » Mute"
+#: monitor_section.cc:240
+msgid "Gain reduction to use when dimming monitor outputs"
 msgstr ""
 
-#: monitor_section.cc:246
-msgid ""
-"If enabled, solo will override mute\n"
-"(a soloed & muted track or bus will be audible)"
+#: monitor_section.cc:245 monitor_section.cc:290
+msgid "-3 dB"
 msgstr ""
 
-#: monitor_section.cc:323
+#: monitor_section.cc:250 monitor_section.cc:264 monitor_section.cc:325
+msgid "Dim"
+msgstr ""
+
+#: monitor_section.cc:294
+msgid "-30 dB"
+msgstr ""
+
+#: monitor_section.cc:333
+msgid "Inv"
+msgstr ""
+
+#: monitor_section.cc:399
 msgid "Monitor"
 msgstr ""
 
-#: monitor_section.cc:744
+#: monitor_section.cc:897
 msgid "Switch monitor to mono"
 msgstr ""
 
-#: monitor_section.cc:747
+#: monitor_section.cc:900
 msgid "Cut monitor"
 msgstr ""
 
-#: monitor_section.cc:750
+#: monitor_section.cc:903
 msgid "Dim monitor"
 msgstr ""
 
-#: monitor_section.cc:753
+#: monitor_section.cc:906
 msgid "Toggle exclusive solo mode"
 msgstr ""
 
-#: monitor_section.cc:759
+#: monitor_section.cc:912
 msgid "Toggle mute overrides solo mode"
 msgstr ""
 
-#: monitor_section.cc:771
+#: monitor_section.cc:921
 msgid "Cut monitor channel %1"
 msgstr ""
 
-#: monitor_section.cc:776
+#: monitor_section.cc:926
 msgid "Dim monitor channel %1"
 msgstr ""
 
-#: monitor_section.cc:781
+#: monitor_section.cc:931
 msgid "Solo monitor channel %1"
 msgstr ""
 
-#: monitor_section.cc:786
+#: monitor_section.cc:936
 msgid "Invert monitor channel %1"
 msgstr ""
 
-#: monitor_section.cc:796
+#: monitor_section.cc:946
 msgid "In-place solo"
 msgstr ""
 
-#: monitor_section.cc:798
+#: monitor_section.cc:948
 msgid "After Fade Listen (AFL) solo"
 msgstr ""
 
-#: monitor_section.cc:800
+#: monitor_section.cc:950
 msgid "Pre Fade Listen (PFL) solo"
 msgstr ""
 
-#: mono_panner.cc:109 stereo_panner.cc:119
+#: monitor_section.cc:953
+msgid "Toggle Monitor Section Processor Box"
+msgstr ""
+
+#: monitor_section.cc:1413
+msgid "No session - no I/O changes are possible"
+msgstr ""
+
+#: monitor_selector.cc:199
+msgid "Monitor output selector"
+msgstr ""
+
+#: mono_panner.cc:105 stereo_panner.cc:115
 msgid "bypassed"
 msgstr ""
 
-#: mono_panner.cc:123
+#: mono_panner.cc:119
 #, c-format
 msgid "L:%3d R:%3d"
 msgstr ""
 
-#: mono_panner_editor.cc:33
+#: mono_panner.cc:203 panner2d.cc:276 stereo_panner.cc:252
+#: stereo_panner.cc:275
+msgid "Panner|L"
+msgstr ""
+
+#: mono_panner.cc:220 panner2d.cc:277 stereo_panner.cc:250
+#: stereo_panner.cc:277
+msgid "Panner|R"
+msgstr ""
+
+#: mono_panner_editor.cc:35
 msgid "Mono Panner"
 msgstr ""
 
-#: mono_panner_editor.cc:44 mono_panner_editor.cc:49
-#: stereo_panner_editor.cc:46 stereo_panner_editor.cc:51
+#: mono_panner_editor.cc:46 mono_panner_editor.cc:51
+#: stereo_panner_editor.cc:48 stereo_panner_editor.cc:53
 msgid "%"
 msgstr ""
 
@@ -7769,10 +9196,6 @@ msgid ""
 "relies on a stable, sustainable income stream. Thanks for using Ardour!"
 msgstr ""
 
-#: new_plugin_preset_dialog.cc:29
-msgid "New Preset"
-msgstr ""
-
 #: new_plugin_preset_dialog.cc:30
 msgid "Replace existing preset with this name"
 msgstr ""
@@ -7781,6 +9204,10 @@ msgstr ""
 msgid "Name of new preset"
 msgstr ""
 
+#: new_plugin_preset_dialog.cc:44
+msgid "New Favorite Only"
+msgstr ""
+
 #: normalize_dialog.cc:34
 msgid "Normalize regions"
 msgstr ""
@@ -7789,8 +9216,8 @@ msgstr ""
 msgid "Normalize region"
 msgstr ""
 
-#: normalize_dialog.cc:49 strip_silence_dialog.cc:66
-msgid "dbFS"
+#: normalize_dialog.cc:42
+msgid "Normalize to:"
 msgstr ""
 
 #: normalize_dialog.cc:56
@@ -7809,103 +9236,106 @@ msgstr "Normalizar"
 msgid "Select Note"
 msgstr ""
 
-#: opts.cc:57
+#: opts.cc:61
 msgid "Usage: "
 msgstr "Usual: "
 
-#: opts.cc:58
+#: opts.cc:62
 msgid "  [SESSION_NAME]              Name of session to load\n"
 msgstr ""
 
-#: opts.cc:59
+#: opts.cc:63
 msgid "  -v, --version               Show version information\n"
 msgstr ""
 
-#: opts.cc:60
+#: opts.cc:64
 msgid "  -h, --help                  Print this message\n"
 msgstr ""
 
-#: opts.cc:61
+#: opts.cc:65
 msgid ""
 "  -a, --no-announcements      Do not contact website for announcements\n"
 msgstr ""
 
-#: opts.cc:62
+#: opts.cc:66
 msgid ""
 "  -b, --bindings              Print all possible keyboard binding names\n"
 msgstr ""
 
-#: opts.cc:63
+#: opts.cc:67
+msgid ""
+"  -B, --bypass-plugins        Bypass all plugins in an existing session\n"
+msgstr ""
+
+#: opts.cc:68
 msgid ""
 "  -c, --name <name>           Use a specific backend client name, default is "
 "ardour\n"
 msgstr ""
 
-#: opts.cc:64
+#: opts.cc:69
 msgid ""
 "  -d, --disable-plugins       Disable all plugins in an existing session\n"
 msgstr ""
 
-#: opts.cc:65
+#: opts.cc:70
 msgid ""
 "  -D, --debug <options>       Set debug flags. Use \"-D list\" to see "
 "available options\n"
 msgstr ""
 
-#: opts.cc:66
+#: opts.cc:71
 msgid "  -n, --no-splash             Do not show splash screen\n"
 msgstr ""
 
-#: opts.cc:67
+#: opts.cc:72
 msgid "  -m, --menus file            Use \"file\" to define menus\n"
 msgstr ""
 
-#: opts.cc:68
+#: opts.cc:73
 msgid ""
 "  -N, --new session-name      Create a new session from the command line\n"
 msgstr ""
 
-#: opts.cc:69
+#: opts.cc:74
 msgid "  -O, --no-hw-optimizations   Disable h/w specific optimizations\n"
 msgstr ""
 
-#: opts.cc:70
+#: opts.cc:75
 msgid "  -P, --no-connect-ports      Do not connect any ports at startup\n"
 msgstr ""
 
-#: opts.cc:71
+#: opts.cc:76
 msgid "  -S, --sync                  Draw the gui synchronously \n"
 msgstr ""
 
-#: opts.cc:73
+#: opts.cc:78
 msgid "  -V, --novst                 Do not use VST support\n"
 msgstr ""
 
-#: opts.cc:75
+#: opts.cc:80
 msgid ""
 "  -E, --save <file>           Load the specified session, save it to <file> "
 "and then quit\n"
 msgstr ""
 
-#: opts.cc:76
+#: opts.cc:81
 msgid "  -C, --curvetest filename    Curve algorithm debugger\n"
 msgstr ""
 
-#: opts.cc:77
-msgid ""
-"  -k, --keybindings filename  Name of key bindings to load (default is ~/."
-"ardour3/ardour.bindings)\n"
+#: opts.cc:82
+msgid "  -k, --keybindings filename  Name of key bindings to load\n"
 msgstr ""
 
-#: panner2d.cc:854
+#: panner2d.cc:896
 msgid "Panner (2D)"
 msgstr ""
 
-#: panner2d.cc:856 panner_ui.cc:400 plugin_ui.cc:452
+#: panner2d.cc:898 panner_ui.cc:402 plugin_ui.cc:458
 msgid "Bypass"
 msgstr "Ignorar"
 
-#: panner2d.cc:862
+#: panner2d.cc:904
 msgid "Panner"
 msgstr ""
 
@@ -7917,6 +9347,22 @@ msgstr "modo automático de pan"
 msgid "Pan automation type"
 msgstr "Tipo do pan automático"
 
+#: panner_ui.cc:605
+msgid "Manual|M"
+msgstr ""
+
+#: panner_ui.cc:608
+msgid "Play|P"
+msgstr ""
+
+#: panner_ui.cc:611
+msgid "Touch|T"
+msgstr ""
+
+#: panner_ui.cc:614
+msgid "Write|W"
+msgstr ""
+
 #: playlist_selector.cc:43
 msgid "Playlists"
 msgstr ""
@@ -7942,151 +9388,305 @@ msgstr ""
 msgid "Imported"
 msgstr ""
 
-#: plugin_eq_gui.cc:85 plugin_eq_gui.cc:109
+#: plugin_eq_gui.cc:93 plugin_eq_gui.cc:117
 msgid "dB scale"
 msgstr ""
 
-#: plugin_eq_gui.cc:116
+#: plugin_eq_gui.cc:124
 msgid "Show phase"
 msgstr ""
 
-#: plugin_selector.cc:53 plugin_selector.cc:229
+#: plugin_pin_dialog.cc:55
+msgid "Manual Config"
+msgstr ""
+
+#: plugin_pin_dialog.cc:56
+msgid "Sidechain"
+msgstr ""
+
+#: plugin_pin_dialog.cc:57 plugin_pin_dialog.cc:59 plugin_pin_dialog.cc:61
+#: plugin_pin_dialog.cc:63 plugin_pin_dialog.cc:65 step_entry.cc:81
+#: step_entry.cc:84
+msgid "+"
+msgstr ""
+
+#: plugin_pin_dialog.cc:58 plugin_pin_dialog.cc:60 plugin_pin_dialog.cc:62
+#: plugin_pin_dialog.cc:64 plugin_pin_dialog.cc:66
+msgid "-"
+msgstr ""
+
+#: plugin_pin_dialog.cc:148
+msgid "Audio Input Pins"
+msgstr ""
+
+#: plugin_pin_dialog.cc:157
+msgid "MIDI Input Pins"
+msgstr ""
+
+#: plugin_pin_dialog.cc:166
+msgid "Instances"
+msgstr ""
+
+#: plugin_pin_dialog.cc:176
+msgid "Audio Out"
+msgstr ""
+
+#: plugin_pin_dialog.cc:185
+msgid "MIDI Out"
+msgstr ""
+
+#: plugin_pin_dialog.cc:192
+msgid "Output Presets"
+msgstr ""
+
+#: plugin_pin_dialog.cc:208
+msgid "Add Sidechain Input"
+msgstr ""
+
+#: plugin_pin_dialog.cc:478 plugin_pin_dialog.cc:482 plugin_pin_dialog.cc:486
+#: plugin_setup_dialog.cc:115 plugin_setup_dialog.cc:199
+msgid "Automatic"
+msgstr ""
+
+#: plugin_pin_dialog.cc:515 plugin_setup_dialog.cc:208
+msgid "%1 Channel"
+msgid_plural "%1 Channels"
+msgstr[0] ""
+msgstr[1] ""
+
+#: plugin_pin_dialog.cc:641 processor_box.cc:224
+msgid "Send"
+msgstr ""
+
+#: plugin_pin_dialog.cc:997
+msgid "Latency %1 spl%2 %3"
+msgstr ""
+
+#: plugin_pin_dialog.cc:997 plugin_pin_dialog.cc:1001
+msgid "no-inplace"
+msgstr ""
+
+#: plugin_pin_dialog.cc:999
+msgid "Latency %1 spl"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1055
+msgid "Instance #%1"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1700 processor_box.cc:2520
+msgid "Cannot set up new send: %1"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1707
+msgid "SC %1 (%2)"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1963 plugin_pin_dialog.cc:1971
+msgid "Pin Configuration: %1"
+msgstr ""
+
+#: plugin_setup_dialog.cc:30
+msgid "Plugin Setup"
+msgstr ""
+
+#: plugin_setup_dialog.cc:33
+msgid "Copy I/O Map"
+msgstr ""
+
+#: plugin_setup_dialog.cc:50
+msgid "An Instrument plugin is already present."
+msgstr ""
+
+#: plugin_setup_dialog.cc:54
+msgid "Replace"
+msgstr ""
+
+#: plugin_setup_dialog.cc:60
+msgid "with"
+msgstr ""
+
+#: plugin_setup_dialog.cc:70
+msgid "I/O Pin Mapping"
+msgstr ""
+
+#: plugin_setup_dialog.cc:79
+msgid "Configure Plugin '%1'"
+msgstr ""
+
+#: plugin_setup_dialog.cc:90
+msgid "Output Configuration"
+msgstr ""
+
+#: plugin_selector.cc:54 plugin_selector.cc:322
 msgid "Name contains"
 msgstr ""
 
-#: plugin_selector.cc:54 plugin_selector.cc:233
+#: plugin_selector.cc:55 plugin_selector.cc:326
 msgid "Type contains"
 msgstr ""
 
-#: plugin_selector.cc:55 plugin_selector.cc:231
+#: plugin_selector.cc:56 plugin_selector.cc:324
 msgid "Category contains"
 msgstr ""
 
-#: plugin_selector.cc:56 plugin_selector.cc:253
+#: plugin_selector.cc:57 plugin_selector.cc:349
 msgid "Author contains"
 msgstr ""
 
-#: plugin_selector.cc:57 plugin_selector.cc:255
+#: plugin_selector.cc:58 plugin_selector.cc:351
 msgid "Library contains"
 msgstr ""
 
-#: plugin_selector.cc:58 plugin_selector.cc:219 plugin_selector.cc:537
+#: plugin_selector.cc:59 plugin_selector.cc:278 plugin_selector.cc:639
 msgid "Favorites only"
 msgstr ""
 
-#: plugin_selector.cc:59 plugin_selector.cc:223 plugin_selector.cc:537
+#: plugin_selector.cc:60 plugin_selector.cc:282 plugin_selector.cc:639
 msgid "Hidden only"
 msgstr ""
 
-#: plugin_selector.cc:64
+#: plugin_selector.cc:65
 msgid "Plugin Manager"
 msgstr ""
 
-#: plugin_selector.cc:85
+#: plugin_selector.cc:96
 msgid "Fav"
 msgstr ""
 
-#: plugin_selector.cc:87
+#: plugin_selector.cc:98
 msgid "Available Plugins"
 msgstr ""
 
-#: plugin_selector.cc:88
+#: plugin_selector.cc:99
 msgid "Type"
 msgstr "Tipo"
 
-#: plugin_selector.cc:89
+#: plugin_selector.cc:100
 msgid "Category"
 msgstr ""
 
-#: plugin_selector.cc:90
+#: plugin_selector.cc:101
 msgid "Creator"
 msgstr ""
 
-#: plugin_selector.cc:91
+#: plugin_selector.cc:102
 msgid "# Audio In"
 msgstr ""
 
-#: plugin_selector.cc:92
+#: plugin_selector.cc:103
 msgid "# Audio Out"
 msgstr ""
 
-#: plugin_selector.cc:93
+#: plugin_selector.cc:104
 msgid "# MIDI In"
 msgstr ""
 
-#: plugin_selector.cc:94
+#: plugin_selector.cc:105
 msgid "# MIDI Out"
 msgstr ""
 
-#: plugin_selector.cc:116
+#: plugin_selector.cc:132
 msgid "Plugins to be connected"
 msgstr ""
 
-#: plugin_selector.cc:129
+#: plugin_selector.cc:145
 msgid "Add a plugin to the effect list"
 msgstr "Adicionar plugin na lista de efeitos"
 
-#: plugin_selector.cc:133
+#: plugin_selector.cc:149
 msgid "Remove a plugin from the effect list"
 msgstr "Remover plugin da lista de efeitos"
 
-#: plugin_selector.cc:135
-msgid "Update available plugins"
-msgstr "Atualizar plugins disponíveis"
+#: plugin_selector.cc:161
+msgid "Show Hidden"
+msgstr ""
+
+#: plugin_selector.cc:163
+msgid "Include hidden plugins in list."
+msgstr ""
+
+#: plugin_selector.cc:166
+msgid "Instruments"
+msgstr ""
+
+#: plugin_selector.cc:168
+msgid "Cycle display of instrument plugins (if any)."
+msgstr ""
+
+#: plugin_selector.cc:171
+msgid "Analyzers"
+msgstr ""
+
+#: plugin_selector.cc:173
+msgid "Cycle display of analysis plugins (if any)."
+msgstr ""
+
+#: plugin_selector.cc:176
+msgid "Utils"
+msgstr ""
+
+#: plugin_selector.cc:178
+msgid "Cycle display of utility plugins (if any)."
+msgstr ""
+
+#: plugin_selector.cc:208
+msgid "Filter"
+msgstr ""
 
-#: plugin_selector.cc:172
+#: plugin_selector.cc:232
 msgid "Insert Plugin(s)"
 msgstr ""
 
-#: plugin_selector.cc:337 plugin_selector.cc:338 plugin_selector.cc:339
-#: plugin_selector.cc:340
+#: plugin_selector.cc:439 plugin_selector.cc:440 plugin_selector.cc:441
+#: plugin_selector.cc:442
 msgid "variable"
 msgstr ""
 
-#: plugin_selector.cc:496
+#: plugin_selector.cc:598
 msgid ""
 "The plugin \"%1\" could not be loaded\n"
 "\n"
 "See the Log window for more details (maybe)"
 msgstr ""
 
-#: plugin_selector.cc:644
+#: plugin_selector.cc:757
 msgid "Favorites"
 msgstr ""
 
-#: plugin_selector.cc:646
+#: plugin_selector.cc:759
 msgid "Plugin Manager..."
 msgstr ""
 
-#: plugin_selector.cc:650
+#: plugin_selector.cc:763
 msgid "By Creator"
 msgstr ""
 
-#: plugin_selector.cc:653
+#: plugin_selector.cc:766
 msgid "By Category"
 msgstr ""
 
-#: plugin_ui.cc:113
+#: plugin_ui.cc:114
 msgid "Eh? LADSPA plugins don't have editors!"
 msgstr ""
 
-#: plugin_ui.cc:122 plugin_ui.cc:227
+#: plugin_ui.cc:123 plugin_ui.cc:228
 msgid ""
 "unknown type of editor-supplying plugin (note: no VST support in this "
 "version of %1)"
 msgstr ""
 
-#: plugin_ui.cc:125
+#: plugin_ui.cc:126
 msgid "unknown type of editor-supplying plugin"
 msgstr ""
 
-#: plugin_ui.cc:257
+#: plugin_ui.cc:258
 msgid ""
 "unknown type of editor-supplying plugin (note: no linuxVST support in this "
 "version of %1)"
 msgstr ""
 
-#: plugin_ui.cc:329
+#: plugin_ui.cc:330
 msgid "create_lv2_editor called on non-LV2 plugin"
 msgstr ""
 
@@ -8094,146 +9694,167 @@ msgstr ""
 msgid "Add"
 msgstr "Adicionar"
 
-#: plugin_ui.cc:422
+#: plugin_ui.cc:423
 msgid "Description"
 msgstr ""
 
-#: plugin_ui.cc:423
+#: plugin_ui.cc:424
 msgid "Plugin analysis"
 msgstr ""
 
-#: plugin_ui.cc:430
+#: plugin_ui.cc:431
 msgid ""
 "Presets (if any) for this plugin\n"
 "(Both factory and user-created)"
 msgstr ""
 
-#: plugin_ui.cc:431
+#: plugin_ui.cc:432
 msgid "Save a new preset"
 msgstr ""
 
-#: plugin_ui.cc:432
+#: plugin_ui.cc:433
 msgid "Save the current preset"
 msgstr ""
 
-#: plugin_ui.cc:433
+#: plugin_ui.cc:434
 msgid "Delete the current preset"
 msgstr ""
 
-#: plugin_ui.cc:434
+#: plugin_ui.cc:435
+msgid ""
+"Reset parameters to default (if no parameters are in automation play mode)"
+msgstr ""
+
+#: plugin_ui.cc:436
 msgid "Disable signal processing by the plugin"
 msgstr ""
 
-#: plugin_ui.cc:467 plugin_ui.cc:663
+#: plugin_ui.cc:473 plugin_ui.cc:681
 msgid ""
 "Click to allow the plugin to receive keyboard events that %1 would normally "
 "use as a shortcut"
 msgstr ""
 
-#: plugin_ui.cc:468
+#: plugin_ui.cc:474
 msgid "Click to enable/disable this plugin"
 msgstr ""
 
-#: plugin_ui.cc:507
+#: plugin_ui.cc:517
 msgid "latency (%1 sample)"
 msgid_plural "latency (%1 samples)"
 msgstr[0] ""
 msgstr[1] ""
 
-#: plugin_ui.cc:509
+#: plugin_ui.cc:519
 msgid "latency (%1 ms)"
 msgstr ""
 
-#: plugin_ui.cc:520
+#: plugin_ui.cc:530
 msgid "Edit Latency"
 msgstr ""
 
-#: plugin_ui.cc:566
+#: plugin_ui.cc:576
 msgid ""
 "Plugin presets are not supported in this build of %1. Consider paying for a "
 "full version"
 msgstr ""
 
-#: plugin_ui.cc:574
+#: plugin_ui.cc:584
 msgid ""
 "Plugin presets are not supported in this build, see the Log window for more "
 "information."
 msgstr ""
 
-#: plugin_ui.cc:670
+#: plugin_ui.cc:592
+msgid "New Preset"
+msgstr ""
+
+#: plugin_ui.cc:688
 msgid "Click to allow normal use of %1 keyboard shortcuts"
 msgstr ""
 
-#: port_group.cc:337
-msgid "%1 Busses"
+#: plugin_ui.cc:795
+msgid "(none)"
 msgstr ""
 
 #: port_group.cc:338
-msgid "%1 Tracks"
-msgstr ""
+msgid "%1 Busses"
+msgstr "%1 Bus"
 
 #: port_group.cc:339
+msgid "%1 Tracks"
+msgstr "%1 Trilhas"
+
+#: port_group.cc:340
 msgid "Hardware"
 msgstr ""
 
-#: port_group.cc:340
+#: port_group.cc:341
 msgid "%1 Misc"
 msgstr ""
 
-#: port_group.cc:341
+#: port_group.cc:342
 msgid "Other"
 msgstr ""
 
-#: port_group.cc:432 port_group.cc:433
+#: port_group.cc:435 port_group.cc:436
 msgid "LTC Out"
 msgstr ""
 
-#: port_group.cc:436 port_group.cc:437
+#: port_group.cc:439 port_group.cc:440
 msgid "LTC In"
 msgstr ""
 
-#: port_group.cc:463
+#: port_group.cc:474
 msgid "MTC in"
 msgstr ""
 
-#: port_group.cc:466
+#: port_group.cc:477
 msgid "MIDI control in"
 msgstr ""
 
-#: port_group.cc:469
+#: port_group.cc:480
 msgid "MIDI clock in"
 msgstr ""
 
-#: port_group.cc:472
+#: port_group.cc:483
 msgid "MMC in"
 msgstr ""
 
-#: port_group.cc:476
+#: port_group.cc:487
 msgid "MTC out"
 msgstr ""
 
-#: port_group.cc:479
+#: port_group.cc:490
 msgid "MIDI control out"
 msgstr ""
 
-#: port_group.cc:482
+#: port_group.cc:493
 msgid "MIDI clock out"
 msgstr ""
 
-#: port_group.cc:485
+#: port_group.cc:496
 msgid "MMC out"
 msgstr ""
 
-#: port_group.cc:532
+#: port_group.cc:555
 msgid ":monitor"
 msgstr ""
 
-#: port_group.cc:544
+#: port_group.cc:571
 msgid "system:"
 msgstr ""
 
-#: port_group.cc:545
-msgid "alsa_pcm"
+#: port_group.cc:572
+msgid "alsa_pcm:"
+msgstr ""
+
+#: port_group.cc:573
+msgid "alsa_midi:"
+msgstr ""
+
+#: port_group.cc:578
+msgid "Scene "
 msgstr ""
 
 #: port_insert_ui.cc:39
@@ -8256,77 +9877,76 @@ msgstr ""
 msgid "Port Insert "
 msgstr ""
 
-#: port_matrix.cc:331 port_matrix.cc:357
+#: port_matrix.cc:341 port_matrix.cc:367
 msgid "<b>Sources</b>"
 msgstr ""
 
-#: port_matrix.cc:332 port_matrix.cc:358
+#: port_matrix.cc:342 port_matrix.cc:368
 msgid "<b>Destinations</b>"
 msgstr ""
 
-#: port_matrix.cc:440 port_matrix.cc:448
+#: port_matrix.cc:450 port_matrix.cc:458
 #, c-format
 msgid "Add %s %s"
 msgstr ""
 
-#: port_matrix.cc:456
+#: port_matrix.cc:466
 #, c-format
 msgid "Rename '%s'..."
 msgstr ""
 
-#: port_matrix.cc:472
+#: port_matrix.cc:482
 msgid "Remove all"
 msgstr ""
 
-#: port_matrix.cc:492 port_matrix.cc:504
+#: port_matrix.cc:502 port_matrix.cc:514
 #, c-format
 msgid "%s all"
 msgstr ""
 
-#: port_matrix.cc:527
+#: port_matrix.cc:537
 msgid "Rescan"
 msgstr "Rescanear"
 
-#: port_matrix.cc:529
+#: port_matrix.cc:539
 msgid "Show individual ports"
 msgstr ""
 
-#: port_matrix.cc:535
+#: port_matrix.cc:545
 msgid "Flip"
 msgstr ""
 
-#: port_matrix.cc:722
-msgid ""
-"It is not possible to add a port here, as the first processor in the track "
-"or buss cannot support the new configuration."
+#: port_matrix.cc:732
+msgid "It is not possible to add a port here."
 msgstr ""
 
-#: port_matrix.cc:725
+#: port_matrix.cc:733
 msgid "Cannot add port"
 msgstr ""
 
-#: port_matrix.cc:747
-msgid "Port removal not allowed"
+#: port_matrix.cc:757
+msgid "The last port cannot be removed"
 msgstr ""
 
-#: port_matrix.cc:748
-msgid ""
-"This port cannot be removed.\n"
-"Either the first plugin in the track or buss cannot accept\n"
-"the new number of inputs or the last plugin has more outputs."
+#: port_matrix.cc:760
+msgid "This port cannot be removed."
+msgstr ""
+
+#: port_matrix.cc:765
+msgid "Port removal not allowed"
 msgstr ""
 
-#: port_matrix.cc:965
+#: port_matrix.cc:981
 #, c-format
 msgid "Remove '%s'"
 msgstr ""
 
-#: port_matrix.cc:980
+#: port_matrix.cc:996
 #, c-format
 msgid "%s all from '%s'"
 msgstr ""
 
-#: port_matrix.cc:1046 transform_dialog.cc:62
+#: port_matrix.cc:1062 transform_dialog.cc:62
 msgid "channel"
 msgstr ""
 
@@ -8338,223 +9958,239 @@ msgstr ""
 msgid "There are no %1 ports to connect."
 msgstr ""
 
-#: processor_box.cc:150
-msgid "Send"
+#: processor_box.cc:226
+msgid "Return"
 msgstr ""
 
-#: processor_box.cc:152
-msgid "Return"
+#: processor_box.cc:323
+msgid "New Favorite Preset for \"%1\""
 msgstr ""
 
-#: processor_box.cc:310
+#: processor_box.cc:501
 msgid ""
 "\n"
 "This mono plugin has been replicated %1 times."
 msgstr ""
 
-#: processor_box.cc:314
+#: processor_box.cc:505 processor_box.cc:1528
 msgid ""
 "<b>%1</b>\n"
 "Double-click to show GUI.\n"
-"Alt+double-click to show generic GUI.%2"
+"%2+double-click to show generic GUI.%3"
 msgstr ""
 
-#: processor_box.cc:317
+#: processor_box.cc:508 processor_box.cc:1531
 msgid ""
 "<b>%1</b>\n"
 "Double-click to show generic GUI.%2"
 msgstr ""
 
-#: processor_box.cc:361
+#: processor_box.cc:514
+msgid ""
+"<b>%1</b>\n"
+"The Plugin is not available on this system\n"
+"and has been replaced by a stub."
+msgstr ""
+
+#: processor_box.cc:600
 #, c-format
 msgid "(%1x1) "
 msgstr ""
 
-#: processor_box.cc:437
+#: processor_box.cc:695
+msgid "Inline Display"
+msgstr ""
+
+#: processor_box.cc:703
 msgid "Show All Controls"
 msgstr ""
 
-#: processor_box.cc:441
+#: processor_box.cc:707
 msgid "Hide All Controls"
 msgstr ""
 
-#: processor_box.cc:475
+#: processor_box.cc:752
 msgid "Link panner controls"
 msgstr ""
 
-#: processor_box.cc:575
+#: processor_box.cc:859
 msgid "on"
 msgstr ""
 
-#: processor_box.cc:575 rc_option_editor.cc:2360 rc_option_editor.cc:2374
+#: processor_box.cc:859 rc_option_editor.cc:3185 rc_option_editor.cc:3199
 msgid "off"
 msgstr "desligado"
 
-#: processor_box.cc:957
+#: processor_box.cc:1819
 msgid ""
 "Right-click to add/remove/edit\n"
 "plugins,inserts,sends and more"
 msgstr ""
+"Clique com o botão direito para adicionar, remover\n"
+"ou editar plugins, inserts, sends e mais..."
+
+#: processor_box.cc:1968
+msgid ""
+"Processor Drag/Drop failed. Probably because\n"
+"the I/O configuration of the plugins could\n"
+"not match the configuration of this track."
+msgstr ""
 
-#: processor_box.cc:1429 processor_box.cc:1804
+#: processor_box.cc:2455 processor_box.cc:2998
 msgid "Plugin Incompatibility"
 msgstr ""
 
-#: processor_box.cc:1432
+#: processor_box.cc:2458
 msgid "You attempted to add the plugin \"%1\" in slot %2.\n"
 msgstr ""
 
-#: processor_box.cc:1438
+#: processor_box.cc:2464
 msgid ""
 "\n"
 "This plugin has:\n"
 msgstr ""
 
-#: processor_box.cc:1441
+#: processor_box.cc:2467
 msgid "\t%1 MIDI input\n"
 msgid_plural "\t%1 MIDI inputs\n"
 msgstr[0] ""
 msgstr[1] ""
 
-#: processor_box.cc:1445
+#: processor_box.cc:2471
 msgid "\t%1 audio input\n"
 msgid_plural "\t%1 audio inputs\n"
 msgstr[0] ""
 msgstr[1] ""
 
-#: processor_box.cc:1448
+#: processor_box.cc:2474
 msgid ""
 "\n"
 "but at the insertion point, there are:\n"
 msgstr ""
 
-#: processor_box.cc:1451
+#: processor_box.cc:2477
 msgid "\t%1 MIDI channel\n"
 msgid_plural "\t%1 MIDI channels\n"
 msgstr[0] ""
 msgstr[1] ""
 
-#: processor_box.cc:1455
+#: processor_box.cc:2481
 msgid "\t%1 audio channel\n"
 msgid_plural "\t%1 audio channels\n"
 msgstr[0] ""
 msgstr[1] ""
 
-#: processor_box.cc:1458
+#: processor_box.cc:2484
 msgid ""
 "\n"
 "%1 is unable to insert this plugin here.\n"
 msgstr ""
 
-#: processor_box.cc:1495
-msgid "Cannot set up new send: %1"
-msgstr ""
-
-#: processor_box.cc:1807
+#: processor_box.cc:3001
 msgid ""
 "You cannot reorder these plugins/sends/inserts\n"
 "in that way because the inputs and\n"
 "outputs will not work correctly."
 msgstr ""
 
-#: processor_box.cc:1991
+#: processor_box.cc:3201
 msgid "Rename Processor"
 msgstr ""
 
-#: processor_box.cc:2022
+#: processor_box.cc:3232
 msgid "At least 100 IO objects exist with a name like %1 - name not changed"
 msgstr ""
 
-#: processor_box.cc:2159
+#: processor_box.cc:3383
 msgid "plugin insert constructor failed"
 msgstr ""
 
-#: processor_box.cc:2170
+#: processor_box.cc:3394
 msgid ""
 "Copying the set of processors on the clipboard failed,\n"
 "probably because the I/O configuration of the plugins\n"
 "could not match the configuration of this track."
 msgstr ""
 
-#: processor_box.cc:2216
+#: processor_box.cc:3440
 msgid ""
 "Do you really want to remove all processors from %1?\n"
 "(this cannot be undone)"
 msgstr ""
 
-#: processor_box.cc:2220 processor_box.cc:2245
+#: processor_box.cc:3444 processor_box.cc:3469
 msgid "Yes, remove them all"
 msgstr ""
 
-#: processor_box.cc:2222 processor_box.cc:2247
+#: processor_box.cc:3446 processor_box.cc:3471
 msgid "Remove processors"
 msgstr ""
 
-#: processor_box.cc:2237
+#: processor_box.cc:3461
 msgid ""
 "Do you really want to remove all pre-fader processors from %1?\n"
 "(this cannot be undone)"
 msgstr ""
 
-#: processor_box.cc:2240
+#: processor_box.cc:3464
 msgid ""
 "Do you really want to remove all post-fader processors from %1?\n"
 "(this cannot be undone)"
 msgstr ""
 
-#: processor_box.cc:2428
+#: processor_box.cc:3653
 msgid "New Plugin"
-msgstr ""
+msgstr "Novo Plugin"
 
-#: processor_box.cc:2431
+#: processor_box.cc:3656
 msgid "New Insert"
-msgstr ""
+msgstr "Novo Insert"
 
-#: processor_box.cc:2434
+#: processor_box.cc:3659
 msgid "New External Send ..."
-msgstr ""
+msgstr "Novo Send Externo"
 
-#: processor_box.cc:2438
+#: processor_box.cc:3663
 msgid "New Aux Send ..."
-msgstr ""
+msgstr "Novo Send Auxiliar"
 
-#: processor_box.cc:2441
+#: processor_box.cc:3666
 msgid "Send Options"
 msgstr ""
 
-#: processor_box.cc:2443
+#: processor_box.cc:3668
 msgid "Clear (all)"
-msgstr ""
+msgstr "Limpar (Tudo)"
 
-#: processor_box.cc:2445
+#: processor_box.cc:3670
 msgid "Clear (pre-fader)"
-msgstr ""
+msgstr "Limpar (pre-fader)"
 
-#: processor_box.cc:2447
+#: processor_box.cc:3672
 msgid "Clear (post-fader)"
-msgstr ""
+msgstr "Limpar (pós-fader_"
 
-#: processor_box.cc:2473
+#: processor_box.cc:3702
 msgid "Activate All"
-msgstr ""
+msgstr "Ativar Tudo"
 
-#: processor_box.cc:2475
+#: processor_box.cc:3704
 msgid "Deactivate All"
-msgstr ""
+msgstr "Desativar Tudo"
 
-#: processor_box.cc:2477
+#: processor_box.cc:3706
 msgid "A/B Plugins"
 msgstr ""
 
-#: processor_box.cc:2486
+#: processor_box.cc:3719
 msgid "Edit with generic controls..."
 msgstr ""
 
-#: processor_box.cc:2789
+#: processor_box.cc:4051
 msgid "%1: %2 (by %3)"
 msgstr ""
 
-#: processor_box.cc:2791
+#: processor_box.cc:4053
 msgid "%1 (by %2)"
 msgstr ""
 
@@ -8582,345 +10218,444 @@ msgstr ""
 msgid "main grid"
 msgstr ""
 
-#: quantize_dialog.cc:52 quantize_dialog.cc:109
+#: quantize_dialog.cc:61 quantize_dialog.cc:118
 msgid "Quantize"
 msgstr ""
 
-#: quantize_dialog.cc:56
+#: quantize_dialog.cc:65
 msgid "Strength"
 msgstr ""
 
-#: quantize_dialog.cc:59
+#: quantize_dialog.cc:68
 msgid "Swing"
 msgstr ""
 
-#: quantize_dialog.cc:62
+#: quantize_dialog.cc:71
 msgid "Threshold (ticks)"
 msgstr ""
 
-#: quantize_dialog.cc:63
+#: quantize_dialog.cc:72
 msgid "Snap note start"
 msgstr ""
 
-#: quantize_dialog.cc:64
+#: quantize_dialog.cc:73
 msgid "Snap note end"
 msgstr ""
 
-#: rc_option_editor.cc:77
-msgid "Click audio file:"
+#: rc_option_editor.cc:83 rc_option_editor.cc:84 rc_option_editor.cc:1550
+msgid "Browse..."
 msgstr ""
 
-#: rc_option_editor.cc:80 rc_option_editor.cc:87
-msgid "Browse..."
+#: rc_option_editor.cc:89
+msgid "Emphasis on first beat:"
+msgstr ""
+
+#: rc_option_editor.cc:95
+msgid "Use default Click:"
+msgstr ""
+
+#: rc_option_editor.cc:101
+msgid "Click audio file:"
 msgstr ""
 
-#: rc_option_editor.cc:84
+#: rc_option_editor.cc:108
 msgid "Click emphasis audio file:"
 msgstr ""
 
-#: rc_option_editor.cc:116
+#: rc_option_editor.cc:154
 msgid "Choose Click"
 msgstr ""
 
-#: rc_option_editor.cc:139
+#: rc_option_editor.cc:177
 msgid "Choose Click Emphasis"
 msgstr ""
 
-#: rc_option_editor.cc:170
+#: rc_option_editor.cc:238
 msgid "Limit undo history to"
 msgstr ""
 
-#: rc_option_editor.cc:171
+#: rc_option_editor.cc:239
 msgid "Save undo history of"
 msgstr ""
 
-#: rc_option_editor.cc:180 rc_option_editor.cc:187
+#: rc_option_editor.cc:248 rc_option_editor.cc:255
 msgid "commands"
 msgstr ""
 
-#: rc_option_editor.cc:325
+#: rc_option_editor.cc:378
+msgid ""
+"\n"
+"Changes to this setting will only persist after your project has been saved."
+msgstr ""
+
+#: rc_option_editor.cc:389 rc_option_editor.cc:451
+msgid "<b>Recommended Setting: %1 + button 3 (right mouse button)</b>%2"
+msgstr ""
+
+#: rc_option_editor.cc:403
+msgid "Select Keyboard layout:"
+msgstr ""
+
+#: rc_option_editor.cc:422
+msgid "When Clicking:"
+msgstr ""
+
+#: rc_option_editor.cc:429
 msgid "Edit using:"
 msgstr ""
 
-#: rc_option_editor.cc:331 rc_option_editor.cc:357 rc_option_editor.cc:384
+#: rc_option_editor.cc:435 rc_option_editor.cc:465 rc_option_editor.cc:495
 msgid "+ button"
 msgstr "+ button"
 
-#: rc_option_editor.cc:351
+#: rc_option_editor.cc:459
 msgid "Delete using:"
 msgstr ""
 
-#: rc_option_editor.cc:378
+#: rc_option_editor.cc:481
+msgid "<b>Recommended Setting: %1 + button 1 (left mouse button)</b>%2"
+msgstr ""
+
+#: rc_option_editor.cc:489
 msgid "Insert note using:"
 msgstr ""
 
-#: rc_option_editor.cc:405
-msgid "Ignore snap using:"
+#: rc_option_editor.cc:507
+msgid "When Beginning a Drag:"
 msgstr ""
 
-#: rc_option_editor.cc:421
-msgid "Keyboard layout:"
+#: rc_option_editor.cc:518 rc_option_editor.cc:545 rc_option_editor.cc:578
+#: rc_option_editor.cc:599 rc_option_editor.cc:643 rc_option_editor.cc:676
+#: rc_option_editor.cc:702 rc_option_editor.cc:730 rc_option_editor.cc:759
+#: rc_option_editor.cc:781
+msgid "<b>Recommended Setting: %1</b>%2"
 msgstr ""
 
-#: rc_option_editor.cc:544
-msgid "Font scaling:"
+#: rc_option_editor.cc:532
+msgid "Copy items using:"
 msgstr ""
 
-#: rc_option_editor.cc:547
-msgid "Default"
+#: rc_option_editor.cc:559
+msgid "Constrain drag using:"
 msgstr ""
 
-#: rc_option_editor.cc:573
-msgid "Major font-scale changes require an application restart to re-layout."
+#: rc_option_editor.cc:567
+msgid "When Beginning a Trim:"
 msgstr ""
 
-#: rc_option_editor.cc:614
-msgid "Waveform Clip Level (dBFS):"
+#: rc_option_editor.cc:586
+msgid "Trim contents using:"
 msgstr ""
 
-#: rc_option_editor.cc:666
-msgid "Playback (seconds of buffering):"
+#: rc_option_editor.cc:607
+msgid "Anchored trim using:"
 msgstr ""
 
-#: rc_option_editor.cc:679
-msgid "Recording (seconds of buffering):"
+#: rc_option_editor.cc:651
+msgid "Resize notes relatively using:"
 msgstr ""
 
-#: rc_option_editor.cc:737
-msgid "Control Surface Protocol"
+#: rc_option_editor.cc:660
+msgid "While Dragging:"
 msgstr ""
 
-#: rc_option_editor.cc:746
-msgid "Double-click on a name to edit settings for an enabled protocol"
+#: rc_option_editor.cc:684
+msgid "Ignore snap using:"
 msgstr ""
 
-#: rc_option_editor.cc:903
-msgid "Show Video Export Info before export"
+#: rc_option_editor.cc:710
+msgid "Snap relatively using:"
 msgstr ""
 
-#: rc_option_editor.cc:904
-msgid "Show Video Server Startup Dialog"
+#: rc_option_editor.cc:718
+msgid "While Trimming:"
 msgstr ""
 
-#: rc_option_editor.cc:905
-msgid "Advanced Setup (remote video server)"
+#: rc_option_editor.cc:738
+msgid "Resize overlapped regions using:"
 msgstr ""
 
-#: rc_option_editor.cc:913
-msgid ""
-"<b>When enabled</b> you can speficify a custom video-server URL and docroot. "
-"- Do not enable this option unless you know what you are doing."
+#: rc_option_editor.cc:746
+msgid "While Dragging Control Points:"
 msgstr ""
 
-#: rc_option_editor.cc:915
-msgid "Video Server URL:"
+#: rc_option_editor.cc:767
+msgid "Fine adjust using:"
 msgstr ""
 
-#: rc_option_editor.cc:920
-msgid ""
-"Base URL of the video-server including http prefix. This is usually 'http://"
-"hostname.example.org:1554/' and defaults to 'http://localhost:1554/' when "
-"the video-server is running locally"
+#: rc_option_editor.cc:789
+msgid "Push points using:"
 msgstr ""
 
-#: rc_option_editor.cc:922
-msgid "Video Folder:"
+#: rc_option_editor.cc:1029
+msgid "GUI and Font scaling:"
 msgstr ""
 
-#: rc_option_editor.cc:927
-msgid ""
-"Local path to the video-server document-root. Only files below this "
-"directory will be accessible by the video-server. If the server run on a "
-"remote host, it should point to a network mounted folder of the server's "
-"docroot or be left empty if it is unvailable. It is used for the local video-"
-"monitor and file-browsing when opening/adding a video file."
+#: rc_option_editor.cc:1032
+msgid "Default"
 msgstr ""
 
-#: rc_option_editor.cc:934
-msgid ""
-"<b>When enabled</b> an information window with details is displayed before "
-"the video-export dialog."
+#: rc_option_editor.cc:1058
+msgid "Adjusting the scale requires an application restart to re-layout."
 msgstr ""
 
-#: rc_option_editor.cc:939
-msgid ""
-"<b>When enabled</b> the video server is never launched automatically without "
-"confirmation"
+#: rc_option_editor.cc:1100
+msgid "\\u221e"
 msgstr ""
 
-#: rc_option_editor.cc:1022
-msgid "Always Display Plugin Scan Progress"
+#: rc_option_editor.cc:1101
+msgid "30 sec"
 msgstr ""
 
-#: rc_option_editor.cc:1023
-msgid "Scan for [new] VST Plugins on Application Start"
+#: rc_option_editor.cc:1102
+msgid "1 min"
 msgstr ""
 
-#: rc_option_editor.cc:1024
-msgid "Scan for AudioUnit Plugins on Application Start"
+#: rc_option_editor.cc:1103
+msgid "2 mins"
 msgstr ""
 
-#: rc_option_editor.cc:1035
-msgid "General"
+#: rc_option_editor.cc:1104
+msgid "3 mins"
 msgstr ""
 
-#: rc_option_editor.cc:1041
-msgid "Scan for Plugins"
+#: rc_option_editor.cc:1105
+msgid "4 mins"
 msgstr ""
 
-#: rc_option_editor.cc:1048
-msgid ""
-"<b>When enabled</b> a popup window showing plugin scan progress is displayed "
-"for indexing (cache load) and discovery (detect new plugins)"
+#: rc_option_editor.cc:1106
+msgid "5 mins"
 msgstr ""
 
-#: rc_option_editor.cc:1055
+#: rc_option_editor.cc:1109
 msgid ""
-"Specify the default timeout for plugin instantiation in 1/10 seconds. "
-"Plugins that require more time to load will be blacklisted. A value of 0 "
-"disables the timeout."
+"Specify the default timeout for plugin instantiation. Plugins that require "
+"more time to load will be blacklisted. A value of 0 disables the timeout."
 msgstr ""
 
-#: rc_option_editor.cc:1057
-msgid "Scan Time Out [deciseconds]"
+#: rc_option_editor.cc:1111
+msgid "Scan Time Out:"
 msgstr ""
 
-#: rc_option_editor.cc:1065
-msgid "VST"
+#: rc_option_editor.cc:1159
+msgid "Waveform Clip Level (dBFS):"
 msgstr ""
 
-#: rc_option_editor.cc:1071
-msgid "Clear VST Cache"
+#: rc_option_editor.cc:1212
+msgid "Small sessions (4-16 tracks)"
 msgstr ""
 
-#: rc_option_editor.cc:1075
-msgid "Clear VST Blacklist"
+#: rc_option_editor.cc:1213
+msgid "Medium sessions (16-64 tracks)"
 msgstr ""
 
-#: rc_option_editor.cc:1083
-msgid ""
-"<b>When enabled</b> new VST plugins are searched, tested and added to the "
-"cache index on application start. When disabled new plugins will only be "
-"available after triggering a 'Scan' manually"
+#: rc_option_editor.cc:1214
+msgid "Large sessions (64+ tracks)"
 msgstr ""
 
-#: rc_option_editor.cc:1086
-msgid "Linux VST Path:"
+#: rc_option_editor.cc:1215
+msgid "Custom (set by sliders below)"
 msgstr ""
 
-#: rc_option_editor.cc:1093
-msgid "Windows VST Path:"
+#: rc_option_editor.cc:1219 export_video_dialog.cc:167
+msgid "Preset:"
 msgstr ""
 
-#: rc_option_editor.cc:1102
-msgid "Audio Unit"
+#: rc_option_editor.cc:1231
+msgid "Playback (seconds of buffering):"
 msgstr ""
 
-#: rc_option_editor.cc:1111
-msgid ""
-"<b>When enabled</b> Audio Unit Plugins are discovered on application start. "
-"When disabled AU plugins will only be available after triggering a 'Scan' "
-"manually. The first successful scan will enable AU auto-scan, Any crash "
-"during plugin discovery will disable it."
+#: rc_option_editor.cc:1244
+msgid "Recording (seconds of buffering):"
 msgstr ""
 
-#: rc_option_editor.cc:1114
-msgid "Clear AU Cache"
+#: rc_option_editor.cc:1322
+msgid "programming error: unknown buffering preset string, index = %1"
 msgstr ""
 
-#: rc_option_editor.cc:1118
-msgid "Clear AU Blacklist"
+#: rc_option_editor.cc:1353
+msgid "Control Surface Protocol"
 msgstr ""
 
-#: rc_option_editor.cc:1201
-msgid "Set Windows VST Search Path"
+#: rc_option_editor.cc:1367
+msgid ""
+"Click to edit the settings for selected protocol ( it must be ENABLED "
+"first ):"
 msgstr ""
 
-#: rc_option_editor.cc:1216
-msgid "Set Linux VST Search Path"
+#: rc_option_editor.cc:1371
+msgid "Show Protocol Settings"
 msgstr ""
 
-#: rc_option_editor.cc:1297
-msgid "%1 Preferences"
+#: rc_option_editor.cc:1494
+msgid "Configuration"
 msgstr ""
 
-#: rc_option_editor.cc:1309
-msgid "DSP CPU Utilization"
+#: rc_option_editor.cc:1547
+msgid "Show Video Export Info before export"
 msgstr ""
 
-#: rc_option_editor.cc:1313
-msgid "Signal processing uses"
+#: rc_option_editor.cc:1548
+msgid "Show Video Server Startup Dialog"
 msgstr ""
 
-#: rc_option_editor.cc:1318
-msgid "all but one processor"
+#: rc_option_editor.cc:1549
+msgid "Advanced Setup (remote video server)"
 msgstr ""
 
-#: rc_option_editor.cc:1319
-msgid "all available processors"
+#: rc_option_editor.cc:1556
+msgid "Video Server"
 msgstr ""
 
-#: rc_option_editor.cc:1322
+#: rc_option_editor.cc:1565
+msgid ""
+"<b>When enabled</b> you can speficify a custom video-server URL and docroot. "
+"- Do not enable this option unless you know what you are doing."
+msgstr ""
+
+#: rc_option_editor.cc:1567
+msgid "Video Server URL:"
+msgstr ""
+
+#: rc_option_editor.cc:1572
+msgid ""
+"Base URL of the video-server including http prefix. This is usually 'http://"
+"hostname.example.org:1554/' and defaults to 'http://localhost:1554/' when "
+"the video-server is running locally"
+msgstr ""
+
+#: rc_option_editor.cc:1574
+msgid "Video Folder:"
+msgstr ""
+
+#: rc_option_editor.cc:1579
+msgid ""
+"Local path to the video-server document-root. Only files below this "
+"directory will be accessible by the video-server. If the server run on a "
+"remote host, it should point to a network mounted folder of the server's "
+"docroot or be left empty if it is unvailable. It is used for the local video-"
+"monitor and file-browsing when opening/adding a video file."
+msgstr ""
+
+#: rc_option_editor.cc:1584
+msgid ""
+"<b>When enabled</b> an information window with details is displayed before "
+"the video-export dialog."
+msgstr ""
+
+#: rc_option_editor.cc:1589
+msgid ""
+"<b>When enabled</b> the video server is never launched automatically without "
+"confirmation"
+msgstr ""
+
+#: rc_option_editor.cc:1598
+msgid "Custom Path to Video Monitor (%1) - leave empty for default:"
+msgstr ""
+
+#: rc_option_editor.cc:1610
+msgid ""
+"Set a custom path to the Video Monitor Executable, changing this requires a "
+"restart."
+msgstr ""
+
+#: rc_option_editor.cc:1661
+msgid "Set Video Monitor Executable"
+msgstr ""
+
+#: rc_option_editor.cc:1734
+msgid "Column %1"
+msgstr ""
+
+#: rc_option_editor.cc:1852
+msgid "%1 Preferences"
+msgstr ""
+
+#: rc_option_editor.cc:1874
+msgid "DSP CPU Utilization"
+msgstr ""
+
+#: rc_option_editor.cc:1878
+msgid "Signal processing uses"
+msgstr ""
+
+#: rc_option_editor.cc:1883
+msgid "all but one processor"
+msgstr ""
+
+#: rc_option_editor.cc:1884
+msgid "all available processors"
+msgstr ""
+
+#: rc_option_editor.cc:1887
 msgid "%1 processors"
 msgstr ""
 
-#: rc_option_editor.cc:1325
+#: rc_option_editor.cc:1890
 msgid "This setting will only take effect when %1 is restarted."
 msgstr ""
 
-#: rc_option_editor.cc:1330
+#: rc_option_editor.cc:1895
 msgid "Options|Undo"
-msgstr ""
+msgstr "Opções|Desfazer"
 
-#: rc_option_editor.cc:1337
+#: rc_option_editor.cc:1902
 msgid "Verify removal of last capture"
 msgstr ""
 
-#: rc_option_editor.cc:1345
-msgid "Make periodic backups of the session file"
+#: rc_option_editor.cc:1907
+msgid "Session Management"
 msgstr ""
 
-#: rc_option_editor.cc:1350
-msgid "Session Management"
+#: rc_option_editor.cc:1912
+msgid "Make periodic backups of the session file"
 msgstr ""
 
-#: rc_option_editor.cc:1355
+#: rc_option_editor.cc:1920
 msgid "Always copy imported files"
 msgstr ""
 
-#: rc_option_editor.cc:1362
+#: rc_option_editor.cc:1927
 msgid "Default folder for new sessions:"
 msgstr ""
 
-#: rc_option_editor.cc:1370
+#: rc_option_editor.cc:1935
 msgid "Maximum number of recent sessions"
 msgstr ""
 
-#: rc_option_editor.cc:1383
+#: rc_option_editor.cc:1941 rc_option_editor.cc:1943 rc_option_editor.cc:1945
+msgid "Misc/Click"
+msgstr ""
+
+#: rc_option_editor.cc:1948
 msgid "Click gain level"
 msgstr ""
 
-#: rc_option_editor.cc:1388 route_time_axis.cc:266 route_time_axis.cc:821
+#: rc_option_editor.cc:1953 route_time_axis.cc:277 route_time_axis.cc:831
 msgid "Automation"
 msgstr "Automação"
 
-#: rc_option_editor.cc:1393
+#: rc_option_editor.cc:1958
 msgid "Thinning factor (larger value => less data)"
 msgstr ""
 
-#: rc_option_editor.cc:1402
+#: rc_option_editor.cc:1967
 msgid "Automation sampling interval (milliseconds)"
 msgstr ""
 
-#: rc_option_editor.cc:1414
+#: rc_option_editor.cc:1975
+msgid "Transport Options"
+msgstr "Opções de Operação"
+
+#: rc_option_editor.cc:1981
 msgid "Keep record-enable engaged on stop"
 msgstr ""
 
-#: rc_option_editor.cc:1423
+#: rc_option_editor.cc:1990
 msgid "Play loop is a transport mode"
 msgstr ""
 
-#: rc_option_editor.cc:1428
+#: rc_option_editor.cc:1995
 msgid ""
 "<b>When enabled</b> the loop button does not start playback but forces "
 "playback to always play the loop\n"
@@ -8929,25 +10664,25 @@ msgid ""
 "cancels loop playback"
 msgstr ""
 
-#: rc_option_editor.cc:1434
+#: rc_option_editor.cc:2001
 msgid "Stop recording when an xrun occurs"
 msgstr ""
 
-#: rc_option_editor.cc:1439
+#: rc_option_editor.cc:2006
 msgid ""
 "<b>When enabled</b> %1 will stop recording if an over- or underrun is "
 "detected by the audio engine"
 msgstr ""
 
-#: rc_option_editor.cc:1445
+#: rc_option_editor.cc:2012
 msgid "Create markers where xruns occur"
 msgstr ""
 
-#: rc_option_editor.cc:1454
+#: rc_option_editor.cc:2021
 msgid "Stop at the end of the session"
 msgstr ""
 
-#: rc_option_editor.cc:1459
+#: rc_option_editor.cc:2026
 msgid ""
 "<b>When enabled</b> if %1 is <b>not recording</b>, it will stop the "
 "transport when it reaches the current session end marker\n"
@@ -8956,11 +10691,11 @@ msgid ""
 "all times"
 msgstr ""
 
-#: rc_option_editor.cc:1467
+#: rc_option_editor.cc:2034
 msgid "Do seamless looping (not possible when slaved to MTC, LTC etc)"
 msgstr ""
 
-#: rc_option_editor.cc:1472
+#: rc_option_editor.cc:2039
 msgid ""
 "<b>When enabled</b> this will loop by reading ahead and wrapping around at "
 "the loop point, preventing any need to do a transport locate at the end of "
@@ -8970,39 +10705,83 @@ msgid ""
 "loop when %1 reaches the end which will often cause a small click or delay"
 msgstr ""
 
-#: rc_option_editor.cc:1480
+#: rc_option_editor.cc:2047
 msgid "Disable per-track record disarm while rolling"
 msgstr ""
 
-#: rc_option_editor.cc:1484
+#: rc_option_editor.cc:2051
 msgid ""
 "<b>When enabled</b> this will prevent you from accidentally stopping "
 "specific tracks recording during a take"
 msgstr ""
 
-#: rc_option_editor.cc:1489
+#: rc_option_editor.cc:2056
 msgid "12dB gain reduction during fast-forward and fast-rewind"
 msgstr ""
 
-#: rc_option_editor.cc:1493
+#: rc_option_editor.cc:2060
 msgid ""
 "This will reduce the unpleasant increase in perceived volume that occurs "
 "when fast-forwarding or rewinding through some kinds of audio"
 msgstr ""
 
-#: rc_option_editor.cc:1497
-msgid "Sync/Slave"
+#: rc_option_editor.cc:2066
+msgid "Preroll"
+msgstr ""
+
+#: rc_option_editor.cc:2071
+msgid ""
+"The amount of preroll (in seconds) to apply when <b>Play with Preroll</b> is "
+"initiated.\n"
+"\n"
+"If <b>Follow Edits</b> is enabled, the preroll is applied to the playhead "
+"position when a region is selected or trimmed."
+msgstr ""
+
+#: rc_option_editor.cc:2073
+msgid "0 (no pre-roll)"
+msgstr ""
+
+#: rc_option_editor.cc:2074
+msgid "0.1 second"
+msgstr ""
+
+#: rc_option_editor.cc:2075
+msgid "0.25 second"
+msgstr ""
+
+#: rc_option_editor.cc:2076
+msgid "0.5 second"
+msgstr ""
+
+#: rc_option_editor.cc:2077
+msgid "1.0 second"
 msgstr ""
 
-#: rc_option_editor.cc:1501
+#: rc_option_editor.cc:2078
+msgid "2.0 seconds"
+msgstr ""
+
+#: rc_option_editor.cc:2081 rc_option_editor.cc:2090 rc_option_editor.cc:2106
+#: rc_option_editor.cc:2127 rc_option_editor.cc:2145 rc_option_editor.cc:2147
+#: rc_option_editor.cc:2164 rc_option_editor.cc:2167 rc_option_editor.cc:2169
+#: rc_option_editor.cc:2197
+msgid "Transport/Sync"
+msgstr "Operação/Sincronização"
+
+#: rc_option_editor.cc:2081
+msgid "Synchronization and Slave Options"
+msgstr ""
+
+#: rc_option_editor.cc:2085
 msgid "External timecode source"
 msgstr ""
 
-#: rc_option_editor.cc:1510
+#: rc_option_editor.cc:2094
 msgid "Match session video frame rate to external timecode"
 msgstr ""
 
-#: rc_option_editor.cc:1516
+#: rc_option_editor.cc:2100
 msgid ""
 "This option controls the value of the video frame rate <i>while chasing</i> "
 "an external timecode source.\n"
@@ -9016,27 +10795,27 @@ msgid ""
 "external timecode standard and the session standard."
 msgstr ""
 
-#: rc_option_editor.cc:1526
-msgid "Sync lock timecode to clock - Disable drift compensation."
+#: rc_option_editor.cc:2110
+msgid "Sync-lock timecode to clock (disable drift compensation)"
 msgstr ""
 
-#: rc_option_editor.cc:1532
+#: rc_option_editor.cc:2116
 msgid ""
 "<b>When enabled</b> %1 will never varispeed when slaved to external "
 "timecode. Sync Lock indicates that the selected external timecode source "
 "shares clock-sync (Black & Burst, Wordclock, etc) with the audio "
 "interface. This option disables drift compensation. The transport speed is "
-"fixed at 1.0.Varispeed LTC will be ignored and cause drift.\n"
+"fixed at 1.0. Vari-speed LTC will be ignored and cause drift.\n"
 "\n"
 "<b>When disabled</b> %1 will compensate for potential drift, regardless if "
 "the timecode sources shares clock sync."
 msgstr ""
 
-#: rc_option_editor.cc:1547
+#: rc_option_editor.cc:2131
 msgid "Lock to 29.9700 fps instead of 30000/1001"
 msgstr ""
 
-#: rc_option_editor.cc:1553
+#: rc_option_editor.cc:2137
 msgid ""
 "<b>When enabled</b> the external timecode source is assumed to use 29.97 fps "
 "instead of 30000/1001.\n"
@@ -9049,659 +10828,929 @@ msgid ""
 "variant of using exactly 29.97 fps has zero timecode drift.\n"
 msgstr ""
 
-#: rc_option_editor.cc:1563
+#: rc_option_editor.cc:2147
 msgid "LTC Reader"
 msgstr ""
 
-#: rc_option_editor.cc:1567
+#: rc_option_editor.cc:2151
 msgid "LTC incoming port"
 msgstr ""
 
-#: rc_option_editor.cc:1582
+#: rc_option_editor.cc:2167
 msgid "LTC Generator"
 msgstr ""
 
-#: rc_option_editor.cc:1587
+#: rc_option_editor.cc:2172
 msgid "Enable LTC generator"
 msgstr ""
 
-#: rc_option_editor.cc:1594
+#: rc_option_editor.cc:2179
 msgid "Send LTC while stopped"
 msgstr ""
 
-#: rc_option_editor.cc:1600
+#: rc_option_editor.cc:2185
 msgid ""
 "<b>When enabled</b> %1 will continue to send LTC information even when the "
 "transport (playhead) is not moving"
 msgstr ""
 
-#: rc_option_editor.cc:1606
+#: rc_option_editor.cc:2191
 msgid "LTC generator level"
 msgstr ""
 
-#: rc_option_editor.cc:1610
+#: rc_option_editor.cc:2195
 msgid ""
-"Specify the Peak Volume of the generated LTC signal in dbFS. A good value "
-"is  0dBu ^= -18dbFS in an EBU calibrated system"
+"Specify the Peak Volume of the generated LTC signal in dBFS. A good value "
+"is  0dBu ^= -18dBFS in an EBU calibrated system"
 msgstr ""
 
-#: rc_option_editor.cc:1622
-msgid "Allow dragging of playhead"
+#: rc_option_editor.cc:2204
+msgid "Make rubberband selection rectangle snap to the grid"
 msgstr ""
 
-#: rc_option_editor.cc:1630
-msgid "Move relevant automation when audio regions are moved"
+#: rc_option_editor.cc:2211
+msgid "Name new markers"
 msgstr ""
 
-#: rc_option_editor.cc:1638
-msgid "Show meters on tracks in the editor"
+#: rc_option_editor.cc:2216
+msgid ""
+"If enabled, popup a dialog when a new marker is created to allow its name to "
+"be set as it is created.\n"
+"\n"
+"You can always rename markers by right-clicking on them"
 msgstr ""
 
-#: rc_option_editor.cc:1646
+#: rc_option_editor.cc:2222
+msgid "Allow dragging of playhead"
+msgstr ""
+
+#: rc_option_editor.cc:2230
 msgid "Display master-meter in the toolbar"
 msgstr ""
 
-#: rc_option_editor.cc:1653
-msgid "Default fade shape"
+#: rc_option_editor.cc:2239
+msgid "Show zoom toolbar (if torn off)"
 msgstr ""
 
-#: rc_option_editor.cc:1672
-msgid "Regions in active edit groups are edited together"
+#: rc_option_editor.cc:2247
+msgid ""
+"Always use mouse cursor position as zoom focus when zooming using mouse "
+"scroll wheel"
 msgstr ""
 
-#: rc_option_editor.cc:1673
-msgid "whenever they overlap in time"
+#: rc_option_editor.cc:2256
+msgid "Update editor window during drags of the summary"
 msgstr ""
 
-#: rc_option_editor.cc:1674
-msgid "only if they have identical length, position and origin"
+#: rc_option_editor.cc:2264
+msgid "Auto-scroll editor window when dragging near its edges"
 msgstr ""
 
-#: rc_option_editor.cc:1684
-msgid "Make rubberband selection rectangle snap to the grid"
+#: rc_option_editor.cc:2272
+msgid "Show gain envelopes in audio regions"
 msgstr ""
 
-#: rc_option_editor.cc:1692
-msgid "Show waveforms in regions"
+#: rc_option_editor.cc:2273
+msgid "in all modes"
 msgstr ""
 
-#: rc_option_editor.cc:1700
-msgid "Show gain envelopes in audio regions"
+#: rc_option_editor.cc:2274
+msgid "only in Draw and Internal Edit modes"
 msgstr ""
 
-#: rc_option_editor.cc:1701
-msgid "in all modes"
+#: rc_option_editor.cc:2279
+msgid "Editor Behavior"
 msgstr ""
 
-#: rc_option_editor.cc:1702
-msgid "only in region gain mode"
+#: rc_option_editor.cc:2284
+msgid "Move relevant automation when audio regions are moved"
 msgstr ""
 
-#: rc_option_editor.cc:1709
-msgid "Waveform scale"
+#: rc_option_editor.cc:2291
+msgid "Default fade shape"
 msgstr ""
 
-#: rc_option_editor.cc:1714
-msgid "linear"
-msgstr "linear"
+#: rc_option_editor.cc:2310
+msgid "Regions in active edit groups are edited together"
+msgstr ""
 
-#: rc_option_editor.cc:1715
-msgid "logarithmic"
+#: rc_option_editor.cc:2311
+msgid "whenever they overlap in time"
 msgstr ""
 
-#: rc_option_editor.cc:1721
-msgid "Waveform shape"
+#: rc_option_editor.cc:2312
+msgid "only if they have identical length, position and origin"
 msgstr ""
 
-#: rc_option_editor.cc:1726
-msgid "traditional"
+#: rc_option_editor.cc:2321
+msgid "Layering model"
 msgstr ""
 
-#: rc_option_editor.cc:1727
-msgid "rectified"
+#: rc_option_editor.cc:2326
+msgid "later is higher"
 msgstr ""
 
-#: rc_option_editor.cc:1736
-msgid "Show waveforms for audio while it is being recorded"
+#: rc_option_editor.cc:2327
+msgid "manual layering"
 msgstr ""
 
-#: rc_option_editor.cc:1744
-msgid "Show zoom toolbar"
+#: rc_option_editor.cc:2332
+msgid "After splitting selected regions, select"
 msgstr ""
 
-#: rc_option_editor.cc:1752
-msgid "Update editor window during drags of the summary"
+#: rc_option_editor.cc:2337
+msgid "no regions"
 msgstr ""
 
-#: rc_option_editor.cc:1760
-msgid "Synchronise editor and mixer selection"
+#: rc_option_editor.cc:2340
+msgid "newly-created regions"
 msgstr ""
 
-#: rc_option_editor.cc:1767
-msgid "Name new markers"
+#: rc_option_editor.cc:2344
+msgid "existing selection and newly-created regions"
 msgstr ""
 
-#: rc_option_editor.cc:1773
-msgid ""
-"If enabled, popup a dialog when a new marker is created to allow its name to "
-"be set as it is created.\n"
-"\n"
-"You can always rename markers by right-clicking on them"
+#: rc_option_editor.cc:2348 rc_option_editor.cc:2351 rc_option_editor.cc:2360
+#: rc_option_editor.cc:2378 rc_option_editor.cc:2390 rc_option_editor.cc:2392
+msgid "Editor/Waveforms"
 msgstr ""
 
-#: rc_option_editor.cc:1779
-msgid "Auto-scroll editor window when dragging near its edges"
+#: rc_option_editor.cc:2348
+msgid "Waveforms"
 msgstr ""
 
-#: rc_option_editor.cc:1786
-msgid "After splitting selected regions, select"
+#: rc_option_editor.cc:2354
+msgid "Show waveforms in regions"
 msgstr ""
 
-#: rc_option_editor.cc:1791
-msgid "no regions"
+#: rc_option_editor.cc:2363
+msgid "Show waveforms for audio while it is being recorded"
 msgstr ""
 
-#: rc_option_editor.cc:1794
-msgid "newly-created regions"
+#: rc_option_editor.cc:2370
+msgid "Waveform scale"
 msgstr ""
 
-#: rc_option_editor.cc:1798
-msgid "existing selection and newly-created regions"
+#: rc_option_editor.cc:2375
+msgid "linear"
+msgstr "linear"
+
+#: rc_option_editor.cc:2376
+msgid "logarithmic"
+msgstr ""
+
+#: rc_option_editor.cc:2382
+msgid "Waveform shape"
 msgstr ""
 
-#: rc_option_editor.cc:1805
+#: rc_option_editor.cc:2387
+msgid "traditional"
+msgstr ""
+
+#: rc_option_editor.cc:2388
+msgid "rectified"
+msgstr ""
+
+#: rc_option_editor.cc:2397
 msgid "Buffering"
 msgstr ""
 
-#: rc_option_editor.cc:1813
+#: rc_option_editor.cc:2405
 msgid "Record monitoring handled by"
 msgstr ""
 
-#: rc_option_editor.cc:1819
+#: rc_option_editor.cc:2411
 msgid "via Audio Driver"
 msgstr ""
 
-#: rc_option_editor.cc:1825
+#: rc_option_editor.cc:2417
 msgid "audio hardware"
 msgstr ""
 
-#: rc_option_editor.cc:1832
+#: rc_option_editor.cc:2424
 msgid "Tape machine mode"
 msgstr ""
 
-#: rc_option_editor.cc:1837
+#: rc_option_editor.cc:2429
 msgid "Connection of tracks and busses"
 msgstr ""
 
-#: rc_option_editor.cc:1842
+#: rc_option_editor.cc:2435
 msgid "Auto-connect master/monitor busses"
 msgstr ""
 
-#: rc_option_editor.cc:1849
+#: rc_option_editor.cc:2442
 msgid "Connect track inputs"
 msgstr ""
 
-#: rc_option_editor.cc:1854
+#: rc_option_editor.cc:2447
 msgid "automatically to physical inputs"
 msgstr ""
 
-#: rc_option_editor.cc:1855 rc_option_editor.cc:1868
+#: rc_option_editor.cc:2448 rc_option_editor.cc:2461
 msgid "manually"
 msgstr ""
 
-#: rc_option_editor.cc:1861
+#: rc_option_editor.cc:2454
 msgid "Connect track and bus outputs"
 msgstr ""
 
-#: rc_option_editor.cc:1866
+#: rc_option_editor.cc:2459
 msgid "automatically to physical outputs"
 msgstr ""
 
-#: rc_option_editor.cc:1867
+#: rc_option_editor.cc:2460
 msgid "automatically to master bus"
 msgstr ""
 
-#: rc_option_editor.cc:1872
+#: rc_option_editor.cc:2467
+msgid "Use 'Strict-I/O' for new tracks or Busses"
+msgstr ""
+
+#: rc_option_editor.cc:2478
 msgid "Denormals"
 msgstr ""
 
-#: rc_option_editor.cc:1877
+#: rc_option_editor.cc:2483
 msgid "Use DC bias to protect against denormals"
 msgstr ""
 
-#: rc_option_editor.cc:1884
+#: rc_option_editor.cc:2490
 msgid "Processor handling"
 msgstr ""
 
-#: rc_option_editor.cc:1890
+#: rc_option_editor.cc:2496
 msgid "no processor handling"
 msgstr ""
 
-#: rc_option_editor.cc:1896
+#: rc_option_editor.cc:2502
 msgid "use FlushToZero"
 msgstr ""
 
-#: rc_option_editor.cc:1903
+#: rc_option_editor.cc:2509
 msgid "use DenormalsAreZero"
 msgstr ""
 
-#: rc_option_editor.cc:1910
+#: rc_option_editor.cc:2516
 msgid "use FlushToZero and DenormalsAreZero"
 msgstr ""
 
-#: rc_option_editor.cc:1926
-msgid "Silence plugins when the transport is stopped"
+#: rc_option_editor.cc:2532
+msgid "Enable automatic analysis of audio"
 msgstr ""
 
-#: rc_option_editor.cc:1934
-msgid "Make new plugins active"
+#: rc_option_editor.cc:2540
+msgid "Replicate missing region channels"
 msgstr ""
 
-#: rc_option_editor.cc:1944
-msgid "Enable automatic analysis of audio"
+#: rc_option_editor.cc:2547 rc_option_editor.cc:2556 rc_option_editor.cc:2558
+#: rc_option_editor.cc:2566 rc_option_editor.cc:2574 rc_option_editor.cc:2582
+#: rc_option_editor.cc:2600 rc_option_editor.cc:2612 rc_option_editor.cc:2624
+#: rc_option_editor.cc:2626 rc_option_editor.cc:2628 rc_option_editor.cc:2636
+#: rc_option_editor.cc:2644 rc_option_editor.cc:2652 rc_option_editor.cc:2662
+#: rc_option_editor.cc:2663
+msgid "Solo & mute"
 msgstr ""
 
-#: rc_option_editor.cc:1952
-msgid "Replicate missing region channels"
+#: rc_option_editor.cc:2551
+msgid "Solo controls are Listen controls"
 msgstr ""
 
-#: rc_option_editor.cc:1959 rc_option_editor.cc:1961 rc_option_editor.cc:1976
-#: rc_option_editor.cc:1988 rc_option_editor.cc:2000 rc_option_editor.cc:2012
-#: rc_option_editor.cc:2016 rc_option_editor.cc:2024 rc_option_editor.cc:2032
-#: rc_option_editor.cc:2040 rc_option_editor.cc:2042 rc_option_editor.cc:2050
-#: rc_option_editor.cc:2058 rc_option_editor.cc:2066 rc_option_editor.cc:2074
-#: rc_option_editor.cc:2076
-msgid "Solo / mute"
+#: rc_option_editor.cc:2561
+msgid "Exclusive solo"
 msgstr ""
 
-#: rc_option_editor.cc:1964
-msgid "Solo-in-place mute cut (dB)"
+#: rc_option_editor.cc:2569
+msgid "Show solo muting"
 msgstr ""
 
-#: rc_option_editor.cc:1971
-msgid "Solo controls are Listen controls"
+#: rc_option_editor.cc:2577
+msgid "Soloing overrides muting"
+msgstr ""
+
+#: rc_option_editor.cc:2585
+msgid "Solo-in-place mute cut (dB)"
 msgstr ""
 
-#: rc_option_editor.cc:1980
+#: rc_option_editor.cc:2592
 msgid "Listen Position"
 msgstr ""
 
-#: rc_option_editor.cc:1985
+#: rc_option_editor.cc:2597
 msgid "after-fader (AFL)"
 msgstr ""
 
-#: rc_option_editor.cc:1986
+#: rc_option_editor.cc:2598
 msgid "pre-fader (PFL)"
 msgstr ""
 
-#: rc_option_editor.cc:1992
+#: rc_option_editor.cc:2604
 msgid "PFL signals come from"
 msgstr ""
 
-#: rc_option_editor.cc:1997
+#: rc_option_editor.cc:2609
 msgid "before pre-fader processors"
 msgstr ""
 
-#: rc_option_editor.cc:1998
+#: rc_option_editor.cc:2610
 msgid "pre-fader but after pre-fader processors"
 msgstr ""
 
-#: rc_option_editor.cc:2004
+#: rc_option_editor.cc:2616
 msgid "AFL signals come from"
 msgstr ""
 
-#: rc_option_editor.cc:2009
+#: rc_option_editor.cc:2621
 msgid "immediately post-fader"
 msgstr ""
 
-#: rc_option_editor.cc:2010
+#: rc_option_editor.cc:2622
 msgid "after post-fader processors (before pan)"
 msgstr ""
 
-#: rc_option_editor.cc:2019
-msgid "Exclusive solo"
-msgstr ""
-
-#: rc_option_editor.cc:2027
-msgid "Show solo muting"
-msgstr ""
-
-#: rc_option_editor.cc:2035
-msgid "Soloing overrides muting"
-msgstr ""
-
-#: rc_option_editor.cc:2040
+#: rc_option_editor.cc:2626
 msgid "Default track / bus muting options"
 msgstr ""
 
-#: rc_option_editor.cc:2045
+#: rc_option_editor.cc:2631
 msgid "Mute affects pre-fader sends"
 msgstr ""
 
-#: rc_option_editor.cc:2053
+#: rc_option_editor.cc:2639
 msgid "Mute affects post-fader sends"
 msgstr ""
 
-#: rc_option_editor.cc:2061
+#: rc_option_editor.cc:2647
 msgid "Mute affects control outputs"
 msgstr ""
 
-#: rc_option_editor.cc:2069
+#: rc_option_editor.cc:2655
 msgid "Mute affects main outputs"
 msgstr ""
 
-#: rc_option_editor.cc:2074
+#: rc_option_editor.cc:2662
 msgid "Send Routing"
 msgstr ""
 
-#: rc_option_editor.cc:2079
+#: rc_option_editor.cc:2666
 msgid "Link panners of Aux and External Sends with main panner by default"
 msgstr ""
 
-#: rc_option_editor.cc:2087
+#: rc_option_editor.cc:2672
+msgid "MIDI Preferences"
+msgstr ""
+
+#: rc_option_editor.cc:2677
 msgid "MIDI read-ahead time (seconds)"
 msgstr ""
 
-#: rc_option_editor.cc:2105
-msgid "Send MIDI Time Code"
+#: rc_option_editor.cc:2687
+msgid "Initial program change"
 msgstr ""
 
-#: rc_option_editor.cc:2113
-msgid "Percentage either side of normal transport speed to transmit MTC"
+#: rc_option_editor.cc:2696
+msgid "Display first MIDI bank/program as 0"
 msgstr ""
 
-#: rc_option_editor.cc:2122
-msgid "Obey MIDI Machine Control commands"
+#: rc_option_editor.cc:2704
+msgid "Never display periodic MIDI messages (MTC, MIDI Clock)"
 msgstr ""
 
-#: rc_option_editor.cc:2130
-msgid "Send MIDI Machine Control commands"
+#: rc_option_editor.cc:2712
+msgid "Sound MIDI notes as they are selected in the editor"
 msgstr ""
 
-#: rc_option_editor.cc:2138
+#: rc_option_editor.cc:2720
 msgid "Send MIDI control feedback"
 msgstr ""
 
-#: rc_option_editor.cc:2146
-msgid "Inbound MMC device ID"
+#: rc_option_editor.cc:2725 rc_option_editor.cc:2727 rc_option_editor.cc:2735
+#: rc_option_editor.cc:2737 rc_option_editor.cc:2745 rc_option_editor.cc:2754
+#: rc_option_editor.cc:2756 rc_option_editor.cc:2764 rc_option_editor.cc:2772
+#: rc_option_editor.cc:2781
+msgid "MIDI/Sync"
 msgstr ""
 
-#: rc_option_editor.cc:2155
-msgid "Outbound MMC device ID"
+#: rc_option_editor.cc:2725
+msgid "MIDI Clock"
 msgstr ""
 
-#: rc_option_editor.cc:2164
-msgid "Initial program change"
+#: rc_option_editor.cc:2735
+msgid "MIDI Time Code (MTC)"
 msgstr ""
 
-#: rc_option_editor.cc:2173
-msgid "Display first MIDI bank/program as 0"
+#: rc_option_editor.cc:2740
+msgid "Send MIDI Time Code"
 msgstr ""
 
-#: rc_option_editor.cc:2181
-msgid "Never display periodic MIDI messages (MTC, MIDI Clock)"
+#: rc_option_editor.cc:2748
+msgid "Percentage either side of normal transport speed to transmit MTC"
+msgstr ""
+
+#: rc_option_editor.cc:2754
+msgid "Midi Machine Control (MMC)"
+msgstr ""
+
+#: rc_option_editor.cc:2759
+msgid "Obey MIDI Machine Control commands"
+msgstr ""
+
+#: rc_option_editor.cc:2767
+msgid "Send MIDI Machine Control commands"
+msgstr ""
+
+#: rc_option_editor.cc:2775
+msgid "Inbound MMC device ID"
 msgstr ""
 
-#: rc_option_editor.cc:2189
-msgid "Sound MIDI notes as they are selected"
+#: rc_option_editor.cc:2784
+msgid "Outbound MMC device ID"
 msgstr ""
 
-#: rc_option_editor.cc:2194
+#: rc_option_editor.cc:2790
 msgid "Midi Audition"
 msgstr ""
 
-#: rc_option_editor.cc:2198
+#: rc_option_editor.cc:2794
 msgid "Midi Audition Synth (LV2)"
 msgstr ""
 
-#: rc_option_editor.cc:2229 rc_option_editor.cc:2239 rc_option_editor.cc:2241
+#: rc_option_editor.cc:2825 rc_option_editor.cc:2835 rc_option_editor.cc:2837
 msgid "User interaction"
 msgstr ""
 
-#: rc_option_editor.cc:2232
+#: rc_option_editor.cc:2828
 msgid ""
 "Use translations of %1 messages\n"
 "   <i>(requires a restart of %1 to take effect)</i>\n"
 "   <i>(if available for your language preferences)</i>"
 msgstr ""
 
-#: rc_option_editor.cc:2239
+#: rc_option_editor.cc:2835
 msgid "Keyboard"
 msgstr ""
 
-#: rc_option_editor.cc:2249
-msgid "Control surface remote ID"
+#: rc_option_editor.cc:2848 rc_option_editor.cc:2890 rc_option_editor.cc:2960
+#: startup.cc:352
+msgid "Scan for Plugins"
 msgstr ""
 
-#: rc_option_editor.cc:2254
-msgid "assigned by user"
+#: rc_option_editor.cc:2853
+msgid "General"
 msgstr ""
 
-#: rc_option_editor.cc:2255
-msgid "follows order of mixer"
+#: rc_option_editor.cc:2858
+msgid "Always Display Plugin Scan Progress"
 msgstr ""
 
-#: rc_option_editor.cc:2269 rc_option_editor.cc:2278 rc_option_editor.cc:2287
-#: rc_option_editor.cc:2297 rc_option_editor.cc:2321 rc_option_editor.cc:2334
-#: rc_option_editor.cc:2343
+#: rc_option_editor.cc:2864
+msgid ""
+"<b>When enabled</b> a popup window showing plugin scan progress is displayed "
+"for indexing (cache load) and discovery (detect new plugins)"
+msgstr ""
+
+#: rc_option_editor.cc:2869
+msgid "Silence plugins when the transport is stopped"
+msgstr ""
+
+#: rc_option_editor.cc:2875
+msgid ""
+"<b>When enabled</b> plugins will be reset at transport stop. When disabled "
+"plugins will be left unchanged at transport stop.\n"
+"\n"
+"This mostly affects plugins with a \"tail\" like Reverbs."
+msgstr ""
+
+#: rc_option_editor.cc:2879
+msgid "Make new plugins active"
+msgstr ""
+
+#: rc_option_editor.cc:2885
+msgid ""
+"<b>When enabled</b> plugins will be activated when they are added to tracks/"
+"busses. When disabled plugins will be left inactive when they are added to "
+"tracks/busses"
+msgstr ""
+
+#: rc_option_editor.cc:2888 rc_option_editor.cc:2889 rc_option_editor.cc:2899
+#: rc_option_editor.cc:2911 rc_option_editor.cc:2916 rc_option_editor.cc:2918
+#: rc_option_editor.cc:2923 rc_option_editor.cc:2930 rc_option_editor.cc:2935
+#: rc_option_editor.cc:2944
+msgid "Plugins/VST"
+msgstr ""
+
+#: rc_option_editor.cc:2888
+msgid "VST"
+msgstr ""
+
+#: rc_option_editor.cc:2895
+msgid "Scan for [new] VST Plugins on Application Start"
+msgstr ""
+
+#: rc_option_editor.cc:2901
+msgid ""
+"<b>When enabled</b> new VST plugins are searched, tested and added to the "
+"cache index on application start. When disabled new plugins will only be "
+"available after triggering a 'Scan' manually"
+msgstr ""
+
+#: rc_option_editor.cc:2907
+msgid "Verbose Plugin Scan"
+msgstr ""
+
+#: rc_option_editor.cc:2913
+msgid ""
+"<b>When enabled</b> additional information for every plugin is added to the "
+"Log Window."
+msgstr ""
+
+#: rc_option_editor.cc:2921
+msgid "VST Cache:"
+msgstr ""
+
+#: rc_option_editor.cc:2926
+msgid "VST Blacklist:"
+msgstr ""
+
+#: rc_option_editor.cc:2933
+msgid "Linux VST Path:"
+msgstr ""
+
+#: rc_option_editor.cc:2938 rc_option_editor.cc:2951
+msgid "Path:"
+msgstr ""
+
+#: rc_option_editor.cc:2947
+msgid "Windows VST Path:"
+msgstr ""
+
+#: rc_option_editor.cc:2958 rc_option_editor.cc:2959 rc_option_editor.cc:2973
+#: rc_option_editor.cc:2978
+msgid "Plugins/Audio Unit"
+msgstr ""
+
+#: rc_option_editor.cc:2958
+msgid "Audio Unit"
+msgstr ""
+
+#: rc_option_editor.cc:2965
+msgid "Scan for AudioUnit Plugins on Application Start"
+msgstr ""
+
+#: rc_option_editor.cc:2971
+msgid ""
+"<b>When enabled</b> Audio Unit Plugins are discovered on application start. "
+"When disabled AU plugins will only be available after triggering a 'Scan' "
+"manually. The first successful scan will enable AU auto-scan, Any crash "
+"during plugin discovery will disable it."
+msgstr ""
+
+#: rc_option_editor.cc:2976
+msgid "AU Cache:"
+msgstr ""
+
+#: rc_option_editor.cc:2981
+msgid "AU Blacklist:"
+msgstr ""
+
+#: rc_option_editor.cc:2985
+msgid "Plugin GUI"
+msgstr ""
+
+#: rc_option_editor.cc:2989
+msgid "Automatically open the plugin GUI when adding a new plugin"
+msgstr ""
+
+#: rc_option_editor.cc:2998
+msgid "Show Plugin Inline Display on Mixerstrip by default"
+msgstr ""
+
+#: rc_option_editor.cc:3005
+msgid ""
+"Don't automatically open the plugin GUI when the plugin has an inline "
+"display mode"
+msgstr ""
+
+#: rc_option_editor.cc:3012
+msgid "Instrument"
+msgstr ""
+
+#: rc_option_editor.cc:3016
+msgid "Ask to replace existing instrument plugin"
+msgstr ""
+
+#: rc_option_editor.cc:3024
+msgid "Interactively configure instrument plugins on insert"
+msgstr ""
+
+#: rc_option_editor.cc:3030
+msgid ""
+"<b>When enabled</b> show a dialog to select instrument channel configuration "
+"before adding a multichannel plugin."
+msgstr ""
+
+#: rc_option_editor.cc:3039
+msgid "Disable Graphics Hardware Acceleration (requires restart)"
+msgstr ""
+
+#: rc_option_editor.cc:3045
+msgid ""
+"Render large parts of the application user-interface in software, instead of "
+"using 2D-graphics acceleration.\n"
+"This requires restarting %1 before having an effect"
+msgstr ""
+
+#: rc_option_editor.cc:3046 rc_option_editor.cc:3058 rc_option_editor.cc:3061
+#: rc_option_editor.cc:3069 rc_option_editor.cc:3077 rc_option_editor.cc:3085
+#: rc_option_editor.cc:3093 rc_option_editor.cc:3104 rc_option_editor.cc:3120
+#: rc_option_editor.cc:3136 rc_option_editor.cc:3151 rc_option_editor.cc:3160
+#: rc_option_editor.cc:3168
 msgid "Preferences|GUI"
 msgstr ""
 
-#: rc_option_editor.cc:2272
+#: rc_option_editor.cc:3052
+msgid "Possibly improve slow graphical performance (requires restart)"
+msgstr ""
+
+#: rc_option_editor.cc:3057
+msgid ""
+"Disables hardware gradient rendering on buggy video drivers (\"buggy "
+"gradients patch\").\n"
+"This requires restarting %1 before having an effect"
+msgstr ""
+
+#: rc_option_editor.cc:3064
+msgid "Use Window Manager/Desktop visibility information"
+msgstr ""
+
+#: rc_option_editor.cc:3072
 msgid "Graphically indicate mouse pointer hovering over various widgets"
 msgstr ""
 
-#: rc_option_editor.cc:2281
+#: rc_option_editor.cc:3080
 msgid "Show tooltips if mouse hovers over a control"
 msgstr ""
 
-#: rc_option_editor.cc:2290
+#: rc_option_editor.cc:3088
 msgid "Use name highlight bars in region displays (requires a restart)"
 msgstr ""
 
-#: rc_option_editor.cc:2303
-msgid "update transport clock display at FPS instead of every 100ms"
+#: rc_option_editor.cc:3096
+msgid "Update transport clock display at FPS instead of every 100ms"
 msgstr ""
 
-#: rc_option_editor.cc:2312
+#: rc_option_editor.cc:3111
+msgid "Waveform image cache size (megabytes)"
+msgstr ""
+
+#: rc_option_editor.cc:3119
+msgid ""
+"Increasing the cache size uses more memory to store waveform images, which "
+"can improve graphical performance."
+msgstr ""
+
+#: rc_option_editor.cc:3127
 msgid "Lock timeout (seconds)"
 msgstr ""
 
-#: rc_option_editor.cc:2320
+#: rc_option_editor.cc:3135
 msgid "Lock GUI after this many idle seconds (zero to never lock)"
 msgstr ""
 
-#: rc_option_editor.cc:2336
+#: rc_option_editor.cc:3153
 msgid "Mixer Strip"
 msgstr ""
 
-#: rc_option_editor.cc:2346
+#: rc_option_editor.cc:3163
 msgid "Use narrow strips in the mixer by default"
 msgstr ""
 
-#: rc_option_editor.cc:2351 rc_option_editor.cc:2365 rc_option_editor.cc:2384
-#: rc_option_editor.cc:2400 rc_option_editor.cc:2416 rc_option_editor.cc:2430
-#: rc_option_editor.cc:2444 rc_option_editor.cc:2446
+#: rc_option_editor.cc:3170
+msgid "Action Script Button Visibility"
+msgstr ""
+
+#: rc_option_editor.cc:3176 rc_option_editor.cc:3190 rc_option_editor.cc:3207
+#: rc_option_editor.cc:3223 rc_option_editor.cc:3239 rc_option_editor.cc:3253
+#: rc_option_editor.cc:3279 rc_option_editor.cc:3297 rc_option_editor.cc:3308
+#: rc_option_editor.cc:3315 rc_option_editor.cc:3317 rc_option_editor.cc:3325
+#: rc_option_editor.cc:3327 rc_option_editor.cc:3335 rc_option_editor.cc:3343
+#: rc_option_editor.cc:3345
 msgid "Preferences|Metering"
 msgstr ""
 
-#: rc_option_editor.cc:2355
+#: rc_option_editor.cc:3180
 msgid "Peak hold time"
 msgstr ""
 
-#: rc_option_editor.cc:2361
+#: rc_option_editor.cc:3186
 msgid "short"
 msgstr ""
 
-#: rc_option_editor.cc:2362
+#: rc_option_editor.cc:3187
 msgid "medium"
 msgstr ""
 
-#: rc_option_editor.cc:2363
+#: rc_option_editor.cc:3188
 msgid "long"
 msgstr ""
 
-#: rc_option_editor.cc:2369
+#: rc_option_editor.cc:3194
 msgid "DPM fall-off"
 msgstr ""
 
-#: rc_option_editor.cc:2375
+#: rc_option_editor.cc:3200
 msgid "slowest [6.6dB/sec]"
 msgstr ""
 
-#: rc_option_editor.cc:2376
+#: rc_option_editor.cc:3201
 msgid "slow [8.6dB/sec] (BBC PPM, EBU PPM)"
 msgstr ""
 
-#: rc_option_editor.cc:2377
-msgid "slowish [12.0dB/sec] (DIN)"
-msgstr ""
-
-#: rc_option_editor.cc:2378
-msgid "moderate [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"
+#: rc_option_editor.cc:3202
+msgid "moderate [12.0dB/sec] (DIN)"
 msgstr ""
 
-#: rc_option_editor.cc:2379
-msgid "medium [20dB/sec]"
+#: rc_option_editor.cc:3203
+msgid "medium [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"
 msgstr ""
 
-#: rc_option_editor.cc:2380
-msgid "fast [32dB/sec]"
+#: rc_option_editor.cc:3204
+msgid "fast [20dB/sec]"
 msgstr ""
 
-#: rc_option_editor.cc:2381
-msgid "faster [46dB/sec]"
+#: rc_option_editor.cc:3205
+msgid "very fast [32dB/sec]"
 msgstr ""
 
-#: rc_option_editor.cc:2382
-msgid "fastest [70dB/sec]"
-msgstr ""
-
-#: rc_option_editor.cc:2388
+#: rc_option_editor.cc:3211
 msgid "Meter line-up level; 0dBu"
 msgstr ""
 
-#: rc_option_editor.cc:2393 rc_option_editor.cc:2409
+#: rc_option_editor.cc:3216 rc_option_editor.cc:3232
 msgid "-24dBFS (SMPTE US: 4dBu = -20dBFS)"
 msgstr ""
 
-#: rc_option_editor.cc:2394 rc_option_editor.cc:2410
+#: rc_option_editor.cc:3217 rc_option_editor.cc:3233
 msgid "-20dBFS (SMPTE RP.0155)"
 msgstr ""
 
-#: rc_option_editor.cc:2395 rc_option_editor.cc:2411
+#: rc_option_editor.cc:3218 rc_option_editor.cc:3234
 msgid "-18dBFS (EBU, BBC)"
 msgstr ""
 
-#: rc_option_editor.cc:2396 rc_option_editor.cc:2412
+#: rc_option_editor.cc:3219 rc_option_editor.cc:3235
 msgid "-15dBFS (DIN)"
 msgstr ""
 
-#: rc_option_editor.cc:2398
+#: rc_option_editor.cc:3221
 msgid ""
 "Configure meter-marks and color-knee point for dBFS scale DPM, set reference "
 "level for IEC1/Nordic, IEC2 PPM and VU meter."
 msgstr ""
 
-#: rc_option_editor.cc:2404
+#: rc_option_editor.cc:3227
 msgid "IEC1/DIN Meter line-up level; 0dBu"
 msgstr ""
 
-#: rc_option_editor.cc:2414
+#: rc_option_editor.cc:3237
 msgid "Reference level for IEC1/DIN meter."
 msgstr ""
 
-#: rc_option_editor.cc:2420
+#: rc_option_editor.cc:3243
 msgid "VU Meter standard"
 msgstr ""
 
-#: rc_option_editor.cc:2425
+#: rc_option_editor.cc:3248
 msgid "0VU = -2dBu (France)"
 msgstr ""
 
-#: rc_option_editor.cc:2426
+#: rc_option_editor.cc:3249
 msgid "0VU = 0dBu (North America, Australia)"
 msgstr ""
 
-#: rc_option_editor.cc:2427
+#: rc_option_editor.cc:3250
 msgid "0VU = +4dBu (standard)"
 msgstr ""
 
-#: rc_option_editor.cc:2428
+#: rc_option_editor.cc:3251
 msgid "0VU = +8dBu"
 msgstr ""
 
-#: rc_option_editor.cc:2434
+#: rc_option_editor.cc:3257
 msgid "Peak threshold [dBFS]"
 msgstr ""
 
-#: rc_option_editor.cc:2442
+#: rc_option_editor.cc:3266
+msgid "Default Meter Type for Master Bus"
+msgstr ""
+
+#: rc_option_editor.cc:3284
+msgid "Default Meter Type for Busses"
+msgstr ""
+
+#: rc_option_editor.cc:3301
+msgid "Default Meter Type for Tracks"
+msgstr ""
+
+#: rc_option_editor.cc:3313
 msgid ""
-"Specify the audio signal level in dbFS at and above which the meter-peak "
+"Specify the audio signal level in dBFS at and above which the meter-peak "
 "indicator will flash red."
 msgstr ""
 
-#: rc_option_editor.cc:2449
+#: rc_option_editor.cc:3320
 msgid "LED meter style"
 msgstr ""
 
-#: rc_option_editor.cc:2457
+#: rc_option_editor.cc:3325
+msgid "Editor Meters"
+msgstr ""
+
+#: rc_option_editor.cc:3330
+msgid "Show meters on tracks in the editor"
+msgstr ""
+
+#: rc_option_editor.cc:3338
+msgid "Show at most stereo meters in the track-header"
+msgstr ""
+
+#: rc_option_editor.cc:3343
+msgid "Post Export Analysis"
+msgstr ""
+
+#: rc_option_editor.cc:3348
+msgid "Save loudness analysis as image file"
+msgstr ""
+
+#: rc_option_editor.cc:3356
 msgid "Theme"
 msgstr ""
 
-#: region_editor.cc:79
+#: rc_option_editor.cc:3358
+msgid "Theme/Colors"
+msgstr ""
+
+#: rc_option_editor.cc:3436
+msgid "Set Linux VST Search Path"
+msgstr ""
+
+#: rc_option_editor.cc:3450
+msgid "Set Windows VST Search Path"
+msgstr ""
+
+#: region_editor.cc:81
 msgid "audition this region"
 msgstr "ouvir esta região"
 
-#: region_editor.cc:88 region_layering_order_editor.cc:75
+#: region_editor.cc:90 region_layering_order_editor.cc:75
 msgid "Position:"
 msgstr ""
 
-#: region_editor.cc:90 add_video_dialog.cc:155
+#: region_editor.cc:92 add_video_dialog.cc:156
 msgid "End:"
 msgstr "Final:"
 
-#: region_editor.cc:92 sfdb_ui.cc:145
+#: region_editor.cc:94 sfdb_ui.cc:145
 msgid "Length:"
 msgstr ""
 
-#: region_editor.cc:94
+#: region_editor.cc:96
 msgid "Sync point (relative to region):"
 msgstr ""
 
-#: region_editor.cc:96
+#: region_editor.cc:98
 msgid "Sync point (absolute):"
 msgstr ""
 
-#: region_editor.cc:98
+#: region_editor.cc:100
 msgid "File start:"
 msgstr ""
 
-#: region_editor.cc:102
+#: region_editor.cc:104
 msgid "Sources:"
 msgstr ""
 
-#: region_editor.cc:104
+#: region_editor.cc:106
 msgid "Source:"
 msgstr ""
 
-#: region_editor.cc:166
+#: region_editor.cc:168
 msgid "Region '%1'"
 msgstr ""
 
-#: region_editor.cc:273
+#: region_editor.cc:279
 msgid "change region start position"
 msgstr ""
 
-#: region_editor.cc:289
+#: region_editor.cc:299
 msgid "change region end position"
 msgstr ""
 
-#: region_editor.cc:309
+#: region_editor.cc:322
 msgid "change region length"
 msgstr ""
 
-#: region_editor.cc:403 region_editor.cc:415
+#: region_editor.cc:416 region_editor.cc:428
 msgid "change region sync point"
 msgstr ""
 
@@ -9721,33 +11770,33 @@ msgstr ""
 msgid "Choose Top Region"
 msgstr ""
 
-#: region_view.cc:277
+#: region_view.cc:271
 msgid "SilenceText"
 msgstr ""
 
-#: region_view.cc:292 region_view.cc:311
+#: region_view.cc:286 region_view.cc:305
 msgid "minutes"
 msgstr ""
 
-#: region_view.cc:295 region_view.cc:314
+#: region_view.cc:289 region_view.cc:308
 msgid "msecs"
 msgstr ""
 
-#: region_view.cc:298 region_view.cc:317
+#: region_view.cc:292 region_view.cc:311
 msgid "secs"
 msgstr ""
 
-#: region_view.cc:301
+#: region_view.cc:295
 msgid "%1 silent segment"
 msgid_plural "%1 silent segments"
 msgstr[0] ""
 msgstr[1] ""
 
-#: region_view.cc:303
+#: region_view.cc:297
 msgid "shortest = %1 %2"
 msgstr ""
 
-#: region_view.cc:320
+#: region_view.cc:314
 msgid ""
 "\n"
 "  (shortest audible segment = %1 %2)"
@@ -9793,55 +11842,63 @@ msgstr ""
 msgid "Modified Kullback-Liebler"
 msgstr ""
 
-#: rhythm_ferret.cc:65
+#: rhythm_ferret.cc:62
+msgid "Spectral Flux"
+msgstr ""
+
+#: rhythm_ferret.cc:68
 msgid "Split region"
 msgstr ""
 
-#: rhythm_ferret.cc:66
+#: rhythm_ferret.cc:70
 msgid "Snap regions"
 msgstr ""
 
-#: rhythm_ferret.cc:67
+#: rhythm_ferret.cc:71
 msgid "Conform regions"
 msgstr ""
 
-#: rhythm_ferret.cc:72
+#: rhythm_ferret.cc:77
 msgid "Rhythm Ferret"
 msgstr ""
 
-#: rhythm_ferret.cc:78
+#: rhythm_ferret.cc:83
 msgid "Analyze"
 msgstr ""
 
-#: rhythm_ferret.cc:113
+#: rhythm_ferret.cc:122
 msgid "Detection function"
 msgstr ""
 
-#: rhythm_ferret.cc:117
-msgid "Trigger gap"
+#: rhythm_ferret.cc:126
+msgid "Trigger gap (postproc)"
 msgstr ""
 
-#: rhythm_ferret.cc:122 strip_silence_dialog.cc:64
-msgid "Threshold"
-msgstr ""
-
-#: rhythm_ferret.cc:127
+#: rhythm_ferret.cc:131
 msgid "Peak threshold"
 msgstr ""
 
-#: rhythm_ferret.cc:132
+#: rhythm_ferret.cc:135
 msgid "Silence threshold"
 msgstr ""
 
-#: rhythm_ferret.cc:137
+#: rhythm_ferret.cc:141
+msgid "Min Inter-Onset Time"
+msgstr ""
+
+#: rhythm_ferret.cc:148
 msgid "Sensitivity"
 msgstr ""
 
-#: rhythm_ferret.cc:141
+#: rhythm_ferret.cc:152
+msgid "Cut Pos Threshold"
+msgstr ""
+
+#: rhythm_ferret.cc:157
 msgid "Operation"
 msgstr ""
 
-#: rhythm_ferret.cc:355
+#: rhythm_ferret.cc:382
 msgid "split regions (rhythm ferret)"
 msgstr ""
 
@@ -9865,25 +11922,21 @@ msgstr ""
 msgid "Active state"
 msgstr ""
 
-#: route_group_dialog.cc:53 route_group_dialog.cc:82 theme_manager.cc:90
-msgid "Color"
-msgstr "Cor"
-
-#: route_group_dialog.cc:59
+#: route_group_dialog.cc:58
 msgid "RouteGroupDialog"
 msgstr ""
 
-#: route_group_dialog.cc:100
+#: route_group_dialog.cc:99
 msgid "<b>Sharing</b>"
 msgstr ""
 
-#: route_group_dialog.cc:200
+#: route_group_dialog.cc:192
 msgid "The group name is not unique. Please use a different name."
 msgstr ""
 
 #: route_params_ui.cc:84
 msgid "Tracks/Busses"
-msgstr ""
+msgstr "Trilhas / Bus"
 
 #: route_params_ui.cc:103
 msgid "Inputs"
@@ -9897,404 +11950,389 @@ msgstr "Saídas"
 msgid "Plugins, Inserts & Sends"
 msgstr ""
 
-#: route_params_ui.cc:209
+#: route_params_ui.cc:201
 msgid "route display list item for renamed route not found!"
 msgstr "não foi encontrada qualquer elemento para encaminhamento"
 
-#: route_params_ui.cc:279 route_params_ui.cc:307
+#: route_params_ui.cc:271 route_params_ui.cc:299
 #, c-format
 msgid "Playback delay: %<PRId64> samples"
-msgstr ""
+msgstr "Atraso de Playback: %<PRId64> amostras"
 
-#: route_params_ui.cc:499
+#: route_params_ui.cc:491
 msgid "NO TRACK"
 msgstr "NENHUMA TRILHA"
 
-#: route_params_ui.cc:637 route_params_ui.cc:638
+#: route_params_ui.cc:515
+msgid "Add Track or Bus"
+msgstr "Adicionar Trilha ou Bus"
+
+#: route_params_ui.cc:627 route_params_ui.cc:628
 msgid "No Track or Bus Selected"
+msgstr "Nenhuma Trilha ou Bus Selecionado(a)"
+
+#: route_time_axis.cc:104
+msgid "RTAV|G"
+msgstr ""
+
+#: route_time_axis.cc:105
+msgid "RTAV|P"
+msgstr ""
+
+#: route_time_axis.cc:106
+msgid "RTAV|A"
 msgstr ""
 
-#: route_time_axis.cc:181
+#: route_time_axis.cc:194
 msgid "Record (Right-click for Step Edit)"
 msgstr ""
 
-#: route_time_axis.cc:184
+#: route_time_axis.cc:197
 msgid "Record"
-msgstr "Gravar"
+msgstr "Armar para Gravação"
 
-#: route_time_axis.cc:254
+#: route_time_axis.cc:265
 msgid "Route Group"
-msgstr ""
+msgstr "Grupo de roteamento"
 
-#: route_time_axis.cc:264
+#: route_time_axis.cc:275
 msgid "MIDI Controllers and Automation"
 msgstr ""
 
-#: route_time_axis.cc:495
+#: route_time_axis.cc:510
 msgid "Show All Automation"
 msgstr ""
 
-#: route_time_axis.cc:498
+#: route_time_axis.cc:513
 msgid "Show Existing Automation"
 msgstr ""
 
-#: route_time_axis.cc:501
+#: route_time_axis.cc:516
 msgid "Hide All Automation"
 msgstr ""
 
-#: route_time_axis.cc:510
+#: route_time_axis.cc:525
 msgid "Processor automation"
 msgstr ""
 
-#: route_time_axis.cc:517
+#: route_time_axis.cc:532
 msgid "Fader"
 msgstr ""
 
-#: route_time_axis.cc:535
+#: route_time_axis.cc:559
 msgid "Pan"
 msgstr ""
 
-#: route_time_axis.cc:626
+#: route_time_axis.cc:643
 msgid "Overlaid"
 msgstr ""
 
-#: route_time_axis.cc:632
+#: route_time_axis.cc:649
 msgid "Stacked"
 msgstr ""
 
-#: route_time_axis.cc:640
+#: route_time_axis.cc:657
 msgid "Layers"
 msgstr ""
 
-#: route_time_axis.cc:709
+#: route_time_axis.cc:721
 msgid "Automatic (based on I/O connections)"
 msgstr ""
 
-#: route_time_axis.cc:718
+#: route_time_axis.cc:730
 msgid "(Currently: Existing Material)"
 msgstr ""
 
-#: route_time_axis.cc:721
+#: route_time_axis.cc:733
 msgid "(Currently: Capture Time)"
 msgstr ""
 
-#: route_time_axis.cc:729
+#: route_time_axis.cc:741
 msgid "Align With Existing Material"
 msgstr ""
 
-#: route_time_axis.cc:734
+#: route_time_axis.cc:746
 msgid "Align With Capture Time"
 msgstr ""
 
-#: route_time_axis.cc:739
+#: route_time_axis.cc:751
 msgid "Alignment"
 msgstr ""
 
-#: route_time_axis.cc:774
+#: route_time_axis.cc:786
 msgid "Normal Mode"
 msgstr ""
 
-#: route_time_axis.cc:780
+#: route_time_axis.cc:792
 msgid "Tape Mode"
 msgstr ""
 
-#: route_time_axis.cc:786
+#: route_time_axis.cc:798
 msgid "Non-Layered Mode"
 msgstr ""
 
-#: route_time_axis.cc:792
+#: route_time_axis.cc:804
 msgid "Record Mode"
 msgstr ""
 
-#: route_time_axis.cc:799 route_time_axis.cc:1789
+#: route_time_axis.cc:809 route_time_axis.cc:1795
 msgid "Playlist"
 msgstr "Lista de reprodução"
 
-#: route_time_axis.cc:1097
+#: route_time_axis.cc:1107
 msgid "Rename Playlist"
 msgstr ""
 
-#: route_time_axis.cc:1098
+#: route_time_axis.cc:1108
 msgid "New name for playlist:"
 msgstr ""
 
-#: route_time_axis.cc:1183
+#: route_time_axis.cc:1193
 msgid "New Copy Playlist"
 msgstr ""
 
-#: route_time_axis.cc:1184 route_time_axis.cc:1237
+#: route_time_axis.cc:1194 route_time_axis.cc:1247
 msgid "Name for new playlist:"
 msgstr ""
 
-#: route_time_axis.cc:1236
+#: route_time_axis.cc:1246
 msgid "New Playlist"
 msgstr ""
 
-#: route_time_axis.cc:1436
-msgid "You cannot create a track with that name as it is reserved for %1"
+#: route_time_axis.cc:1441
+msgid "The name \"%1\" is reserved for %2"
 msgstr ""
 
-#: route_time_axis.cc:1678
+#: route_time_axis.cc:1684
 msgid "New Copy..."
 msgstr ""
 
-#: route_time_axis.cc:1682
+#: route_time_axis.cc:1688
 msgid "New Take"
 msgstr ""
 
-#: route_time_axis.cc:1683
+#: route_time_axis.cc:1689
 msgid "Copy Take"
 msgstr ""
 
-#: route_time_axis.cc:1688
+#: route_time_axis.cc:1694
 msgid "Clear Current"
 msgstr "Limpar Atual"
 
-#: route_time_axis.cc:1691
-msgid "Select From All..."
+#: route_time_axis.cc:1697
+msgid "Select from All..."
 msgstr ""
 
-#: route_time_axis.cc:1779
+#: route_time_axis.cc:1785
 msgid "Take: %1.%2"
 msgstr ""
 
-#: route_time_axis.cc:2169 selection.cc:1007 selection.cc:1061
+#: route_time_axis.cc:2190 selection.cc:1042 selection.cc:1096
 msgid "programming error: "
 msgstr ""
 
-#: route_time_axis.cc:2585
+#: route_time_axis.cc:2614
 msgid "Underlays"
 msgstr ""
 
-#: route_time_axis.cc:2588
+#: route_time_axis.cc:2617
 msgid "Remove \"%1\""
 msgstr ""
 
-#: route_time_axis.cc:2638 route_time_axis.cc:2675
+#: route_time_axis.cc:2667 route_time_axis.cc:2704
 msgid "programming error: underlay reference pointer pairs are inconsistent!"
 msgstr ""
 
-#: route_time_axis.cc:2702
+#: route_time_axis.cc:2731 vca_master_strip.cc:203 vca_time_axis.cc:228
 msgid "After-fade listen (AFL)"
 msgstr ""
 
-#: route_time_axis.cc:2706
+#: route_time_axis.cc:2735 vca_master_strip.cc:207 vca_time_axis.cc:232
 msgid "Pre-fade listen (PFL)"
 msgstr ""
 
-#: route_ui.cc:140
+#: route_ui.cc:165
 msgid "Mute this track"
-msgstr ""
+msgstr "Mutar essa trilha"
 
-#: route_ui.cc:144
+#: route_ui.cc:169
 msgid "Mute other (non-soloed) tracks"
-msgstr ""
+msgstr "Mutar outras trilhas (sem solo)"
 
-#: route_ui.cc:150
+#: route_ui.cc:175
 msgid "Enable recording on this track"
-msgstr ""
+msgstr "Permitir gravação nesta trilha"
 
-#: route_ui.cc:158
+#: route_ui.cc:183
 msgid "make mixer strips show sends to this bus"
 msgstr ""
 
-#: route_ui.cc:163
+#: route_ui.cc:188
 msgid "Monitor input"
 msgstr ""
 
-#: route_ui.cc:169
+#: route_ui.cc:194
 msgid "Monitor playback"
 msgstr ""
 
-#: route_ui.cc:676
+#: route_ui.cc:706
 msgid "Not connected to AudioEngine - cannot engage record"
 msgstr ""
 
-#: route_ui.cc:875
+#: route_ui.cc:883
+msgid "Rec-Safe"
+msgstr ""
+
+#: route_ui.cc:888
 msgid "Step Entry"
 msgstr ""
 
-#: route_ui.cc:948
+#: route_ui.cc:987
 msgid "Assign all tracks (prefader)"
 msgstr ""
 
-#: route_ui.cc:952
+#: route_ui.cc:991
 msgid "Assign all tracks and buses (prefader)"
 msgstr ""
 
-#: route_ui.cc:956
+#: route_ui.cc:995
 msgid "Assign all tracks (postfader)"
 msgstr ""
 
-#: route_ui.cc:960
+#: route_ui.cc:999
 msgid "Assign all tracks and buses (postfader)"
 msgstr ""
 
-#: route_ui.cc:964
+#: route_ui.cc:1003
 msgid "Assign selected tracks (prefader)"
 msgstr ""
 
-#: route_ui.cc:968
+#: route_ui.cc:1007
 msgid "Assign selected tracks and buses (prefader)"
 msgstr ""
 
-#: route_ui.cc:971
+#: route_ui.cc:1010
 msgid "Assign selected tracks (postfader)"
 msgstr ""
 
-#: route_ui.cc:975
+#: route_ui.cc:1014
 msgid "Assign selected tracks and buses (postfader)"
 msgstr ""
 
-#: route_ui.cc:978
+#: route_ui.cc:1017
 msgid "Copy track/bus gains to sends"
 msgstr ""
 
-#: route_ui.cc:979
+#: route_ui.cc:1018
 msgid "Set sends gain to -inf"
 msgstr ""
 
-#: route_ui.cc:980
+#: route_ui.cc:1019
 msgid "Set sends gain to 0dB"
 msgstr ""
 
-#: route_ui.cc:1300
+#: route_ui.cc:1357
 msgid "Solo Isolate"
 msgstr ""
 
-#: route_ui.cc:1307
+#: route_ui.cc:1364
 msgid "Solo Safe"
 msgstr ""
 
-#: route_ui.cc:1329
+#: route_ui.cc:1386
 msgid "Pre Fader Sends"
 msgstr ""
 
-#: route_ui.cc:1335
+#: route_ui.cc:1392
 msgid "Post Fader Sends"
 msgstr ""
 
-#: route_ui.cc:1341
+#: route_ui.cc:1398
 msgid "Control Outs"
 msgstr "Controle de Saídas"
 
-#: route_ui.cc:1347
+#: route_ui.cc:1404
 msgid "Main Outs"
 msgstr "Saídas Principais"
 
-#: route_ui.cc:1479
+#: route_ui.cc:1571
 msgid "Color Selection"
 msgstr ""
 
-#: route_ui.cc:1564
-msgid ""
-"Do you really want to remove track \"%1\" ?\n"
-"\n"
-"You may also lose the playlist used by this track.\n"
-"\n"
-"(This action cannot be undone, and the session file will be overwritten)"
-msgstr ""
-
-#: route_ui.cc:1566
-msgid ""
-"Do you really want to remove bus \"%1\" ?\n"
-"\n"
-"(This action cannot be undone, and the session file will be overwritten)"
-msgstr ""
-
-#: route_ui.cc:1574
-msgid "Remove track"
-msgstr ""
-
-#: route_ui.cc:1576
-msgid "Remove bus"
-msgstr ""
-
-#: route_ui.cc:1604
+#: route_ui.cc:1613
 msgid ""
 "The use of colons (':') is discouraged in track and bus names.\n"
 "Do you want to use this new name?"
 msgstr ""
 
-#: route_ui.cc:1608
+#: route_ui.cc:1617
 msgid "Use the new name"
 msgstr ""
 
-#: route_ui.cc:1609
+#: route_ui.cc:1618
 msgid "Re-edit the name"
 msgstr ""
 
-#: route_ui.cc:1622
+#: route_ui.cc:1631
 msgid "Rename Track"
 msgstr ""
 
-#: route_ui.cc:1624
+#: route_ui.cc:1633
 msgid "Rename Bus"
 msgstr ""
 
-#: route_ui.cc:1692
+#: route_ui.cc:1693
 msgid ": comment editor"
 msgstr ""
 
-#: route_ui.cc:1858
+#: route_ui.cc:1848
 msgid " latency"
 msgstr ""
 
-#: route_ui.cc:1871
+#: route_ui.cc:1888
 msgid "Cannot create route template directory %1"
 msgstr ""
 
-#: route_ui.cc:1877
+#: route_ui.cc:1894
 msgid "Save As Template"
 msgstr ""
 
-#: route_ui.cc:1878
+#: route_ui.cc:1895
 msgid "Template name:"
 msgstr ""
 
-#: route_ui.cc:1959
-msgid "Remote Control ID"
+#: route_ui.cc:2019
+msgid ""
+"Left-click to invert polarity of channel %1 of this track. Right-click to "
+"show menu."
 msgstr ""
 
-#: route_ui.cc:1969
-msgid "Remote control ID:"
+#: route_ui.cc:2021
+msgid "Click to show a menu of channels to invert polarity"
 msgstr ""
 
-#: route_ui.cc:1983
-msgid ""
-"The remote control ID of %1 is: %2\n"
-"\n"
-"\n"
-"The remote control ID of %3 cannot be changed."
+#: save_as_dialog.cc:34
+msgid "Switch to newly-saved version"
 msgstr ""
 
-#: route_ui.cc:1987
-msgid "the master bus"
+#: save_as_dialog.cc:35
+msgid "Copy media to new session"
 msgstr ""
 
-#: route_ui.cc:1987
-msgid "the monitor bus"
+#: save_as_dialog.cc:36
+msgid "Copy external media into new session"
 msgstr ""
 
-#: route_ui.cc:1989
-msgid ""
-"The remote control ID of %5 is: %2\n"
-"\n"
-"\n"
-"Remote Control IDs are currently determined by track/bus ordering in %6.\n"
-"\n"
-"%3Use the User Interaction tab of the Preferences window if you want to "
-"change this%4"
+#: save_as_dialog.cc:37
+msgid "Newly-saved session should be empty"
 msgstr ""
 
-#: route_ui.cc:2046
-msgid ""
-"Left-click to invert (phase reverse) channel %1 of this track.  Right-click "
-"to show menu."
+#: save_as_dialog.cc:48
+msgid "Save as session name"
 msgstr ""
 
-#: route_ui.cc:2048
-msgid "Click to show a menu of channels for inversion (phase reverse)"
+#: save_as_dialog.cc:55
+msgid "Parent directory/folder"
 msgstr ""
 
 #: search_path_option.cc:35
@@ -10309,125 +12347,157 @@ msgstr ""
 msgid "the session folder"
 msgstr ""
 
-#: send_ui.cc:134
-msgid "Send "
+#: script_selector.cc:43
+msgid "<b>Type:</b>"
 msgstr ""
 
-#: session_dialog.cc:61
-msgid "Session Setup"
+#: script_selector.cc:49
+msgid "<b>Author:</b>"
 msgstr ""
 
-#: session_dialog.cc:66
-msgid "Advanced options ..."
+#: script_selector.cc:55
+msgid "<b>Description:</b>"
 msgstr ""
 
-#: session_dialog.cc:263
-msgid "New Session"
+#: script_selector.cc:131
+msgid "Select Script to unload"
 msgstr ""
 
-#: session_dialog.cc:301
-msgid "Check the website for more..."
+#: script_selector.cc:165
+msgid "<b>Name:</b>"
 msgstr ""
 
-#: session_dialog.cc:304
-msgid "Click to open the program website in your web browser"
+#: script_selector.cc:172
+msgid "<b>Instance Parameters</b>"
 msgstr ""
 
-#: session_dialog.cc:324
+#: send_ui.cc:134
+msgid "Send "
+msgstr ""
+
+#: session_dialog.cc:71
+msgid "Session Setup"
+msgstr "Configurar Sessão"
+
+#: session_dialog.cc:76
+msgid "Advanced options ..."
+msgstr "Opções Avançadas"
+
+#: session_dialog.cc:163 session_dialog.cc:397
+msgid "Recent Sessions"
+msgstr "Sessões Recentes"
+
+#: session_dialog.cc:311
 msgid "Sample Rate"
+msgstr "Amostragem"
+
+#: session_dialog.cc:312
+msgid "File Resolution"
+msgstr "Resolução"
+
+#: session_dialog.cc:313
+msgid "Last Modified"
+msgstr "Última Modificação"
+
+#: session_dialog.cc:338
+msgid "New Session"
+msgstr "Nova Sessão"
+
+#: session_dialog.cc:379
+msgid "Check the website for more..."
 msgstr ""
 
-#: session_dialog.cc:325
-msgid "Disk Format"
+#: session_dialog.cc:382
+msgid "Click to open the program website in your web browser"
 msgstr ""
 
-#: session_dialog.cc:343
+#: session_dialog.cc:404
 msgid "Select session file"
-msgstr ""
+msgstr "Selecionar Sessão"
 
-#: session_dialog.cc:358
+#: session_dialog.cc:417
 msgid "Other Sessions"
-msgstr ""
+msgstr "Outras Sessões"
+
+#: session_dialog.cc:424
+msgid "Safe Mode: Disable all Plugins"
+msgstr "Modo de Segurança: Desabilitar todos os plugins"
 
-#: session_dialog.cc:384
+#: session_dialog.cc:454
 msgid "Open"
-msgstr ""
+msgstr "Abrir"
 
-#: session_dialog.cc:451
+#: session_dialog.cc:521
 msgid "Session name:"
-msgstr ""
+msgstr "Nome da Sessão"
 
-#: session_dialog.cc:473
+#: session_dialog.cc:543
 msgid "Create session folder in:"
-msgstr ""
+msgstr "Criar diretório da sessão em:"
 
-#: session_dialog.cc:496
+#: session_dialog.cc:564
 msgid "Select folder for session"
 msgstr ""
 
-#: session_dialog.cc:525
+#: session_dialog.cc:591
 msgid "Use this template"
 msgstr ""
 
-#: session_dialog.cc:528
+#: session_dialog.cc:594
 msgid "no template"
 msgstr ""
 
-#: session_dialog.cc:663 session_dialog.cc:699
-msgid "32 bit float"
+#: session_dialog.cc:746 session_dialog.cc:793
+msgid "32-bit float"
 msgstr ""
 
-#: session_dialog.cc:666 session_dialog.cc:702
-msgid "24 bit"
+#: session_dialog.cc:749 session_dialog.cc:796
+msgid "24-bit"
 msgstr ""
 
-#: session_dialog.cc:669 session_dialog.cc:705
-msgid "16 bit"
+#: session_dialog.cc:752 session_dialog.cc:799
+msgid "16-bit"
 msgstr ""
 
-#: session_dialog.cc:747 session_dialog.cc:748 session_dialog.cc:749
+#: session_dialog.cc:877 session_dialog.cc:878 session_dialog.cc:879
 msgid "channels"
-msgstr ""
+msgstr "canais"
 
-#: session_dialog.cc:763
+#: session_dialog.cc:893
 msgid "<b>Busses</b>"
 msgstr ""
 
-#: session_dialog.cc:764
+#: session_dialog.cc:894
 msgid "<b>Inputs</b>"
-msgstr ""
+msgstr "Entradas"
 
-#: session_dialog.cc:765
+#: session_dialog.cc:895
 msgid "<b>Outputs</b>"
-msgstr ""
+msgstr "Saídas"
 
-#: session_dialog.cc:773
+#: session_dialog.cc:903
 msgid "Create master bus"
-msgstr ""
+msgstr "Criar Bus Mestre"
 
-#: session_dialog.cc:783
+#: session_dialog.cc:913
 msgid "Automatically connect to physical inputs"
-msgstr ""
+msgstr "Conectar entradas físicas automaticamente"
 
-#: session_dialog.cc:790 session_dialog.cc:849
+#: session_dialog.cc:920 session_dialog.cc:979
 msgid "Use only"
-msgstr ""
+msgstr "Usar somente"
 
-#: session_dialog.cc:843
+#: session_dialog.cc:973
 msgid "Automatically connect outputs"
-msgstr ""
+msgstr "Conectar saídas automaticamente"
 
-#: session_dialog.cc:865
+#: session_dialog.cc:995
 msgid "... to master bus"
-msgstr ""
+msgstr "... para o bus mestre"
 
-#: session_dialog.cc:875
+#: session_dialog.cc:1005
 msgid "... to physical outputs"
-msgstr ""
-
-#: session_import_dialog.cc:65
-msgid "Import from Session"
-msgstr ""
+msgstr "... para saídas físicas"
 
 #: session_import_dialog.cc:74
 msgid "Elements"
@@ -10449,197 +12519,197 @@ msgstr ""
 msgid "This will select all elements of this type!"
 msgstr ""
 
-#: session_metadata_dialog.cc:285
+#: session_metadata_dialog.cc:288
 msgid "EAN Check digit OK"
 msgstr ""
 
-#: session_metadata_dialog.cc:289
+#: session_metadata_dialog.cc:292
 msgid "EAN Check digit error"
 msgstr ""
 
-#: session_metadata_dialog.cc:289
+#: session_metadata_dialog.cc:292
 msgid "expected"
 msgstr ""
 
-#: session_metadata_dialog.cc:294
+#: session_metadata_dialog.cc:297
 msgid "EAN Length error"
 msgstr ""
 
-#: session_metadata_dialog.cc:423
+#: session_metadata_dialog.cc:426
 msgid "Field"
 msgstr "Campo"
 
-#: session_metadata_dialog.cc:427
+#: session_metadata_dialog.cc:430
 msgid "Values (current value on top)"
 msgstr ""
 
-#: session_metadata_dialog.cc:641
+#: session_metadata_dialog.cc:644
 msgid "User"
-msgstr ""
+msgstr "Usuário"
 
-#: session_metadata_dialog.cc:649
+#: session_metadata_dialog.cc:652
 msgid "Email"
-msgstr ""
+msgstr "e-mail"
 
-#: session_metadata_dialog.cc:652
+#: session_metadata_dialog.cc:655
 msgid "Web"
 msgstr ""
 
-#: session_metadata_dialog.cc:655
+#: session_metadata_dialog.cc:658
 msgid "Organization"
-msgstr ""
+msgstr "Organização"
 
-#: session_metadata_dialog.cc:658
+#: session_metadata_dialog.cc:661
 msgid "Country"
-msgstr ""
+msgstr "País"
 
-#: session_metadata_dialog.cc:672
+#: session_metadata_dialog.cc:675
 msgid "Title"
-msgstr ""
+msgstr "Título"
 
-#: session_metadata_dialog.cc:675
+#: session_metadata_dialog.cc:678
 msgid "Track Number"
-msgstr ""
+msgstr "Número da faixa"
 
-#: session_metadata_dialog.cc:678
+#: session_metadata_dialog.cc:681
 msgid "Subtitle"
-msgstr ""
+msgstr "Subtítulo"
 
-#: session_metadata_dialog.cc:681
+#: session_metadata_dialog.cc:684
 msgid "Grouping"
-msgstr ""
+msgstr "Agrupamento"
 
-#: session_metadata_dialog.cc:684
+#: session_metadata_dialog.cc:687
 msgid "Artist"
-msgstr ""
+msgstr "Artista"
 
-#: session_metadata_dialog.cc:687
+#: session_metadata_dialog.cc:690
 msgid "Genre"
-msgstr ""
+msgstr "Gênero"
 
-#: session_metadata_dialog.cc:690
+#: session_metadata_dialog.cc:693
 msgid "Comment"
-msgstr ""
+msgstr "Comentários"
 
-#: session_metadata_dialog.cc:693
+#: session_metadata_dialog.cc:696
 msgid "Copyright"
-msgstr ""
+msgstr "Direitos Autorais"
 
-#: session_metadata_dialog.cc:701 session_metadata_dialog.cc:706
+#: session_metadata_dialog.cc:704 session_metadata_dialog.cc:709
 msgid "Album"
-msgstr ""
+msgstr "Álbum"
 
-#: session_metadata_dialog.cc:709
+#: session_metadata_dialog.cc:712
 msgid "Year"
-msgstr ""
+msgstr "Ano"
 
-#: session_metadata_dialog.cc:712
+#: session_metadata_dialog.cc:715
 msgid "Album Artist"
-msgstr ""
+msgstr "Artista do Álbum"
 
-#: session_metadata_dialog.cc:715
+#: session_metadata_dialog.cc:718
 msgid "Total Tracks"
-msgstr ""
+msgstr "Total de Faixas"
 
-#: session_metadata_dialog.cc:718
+#: session_metadata_dialog.cc:721
 msgid "Disc Subtitle"
-msgstr ""
+msgstr "Subsítulo do Disco"
 
-#: session_metadata_dialog.cc:721
+#: session_metadata_dialog.cc:724
 msgid "Disc Number"
-msgstr ""
+msgstr "Número do Disco"
 
-#: session_metadata_dialog.cc:724
+#: session_metadata_dialog.cc:727
 msgid "Total Discs"
 msgstr ""
 
-#: session_metadata_dialog.cc:727
+#: session_metadata_dialog.cc:730
 msgid "Compilation"
-msgstr ""
+msgstr "Compilação"
 
-#: session_metadata_dialog.cc:730
+#: session_metadata_dialog.cc:733
 msgid "ISRC"
 msgstr ""
 
-#: session_metadata_dialog.cc:733
+#: session_metadata_dialog.cc:736
 msgid "EAN barcode"
 msgstr ""
 
-#: session_metadata_dialog.cc:746
+#: session_metadata_dialog.cc:749
 msgid "People"
 msgstr ""
 
-#: session_metadata_dialog.cc:751
+#: session_metadata_dialog.cc:754
 msgid "Lyricist"
-msgstr ""
+msgstr "Letrista"
 
-#: session_metadata_dialog.cc:754
+#: session_metadata_dialog.cc:757
 msgid "Composer"
-msgstr ""
+msgstr "Compositor"
 
-#: session_metadata_dialog.cc:757
+#: session_metadata_dialog.cc:760
 msgid "Conductor"
 msgstr ""
 
-#: session_metadata_dialog.cc:760
+#: session_metadata_dialog.cc:763
 msgid "Remixer"
 msgstr ""
 
-#: session_metadata_dialog.cc:763
+#: session_metadata_dialog.cc:766
 msgid "Arranger"
-msgstr ""
+msgstr "Arranjador"
 
-#: session_metadata_dialog.cc:766
+#: session_metadata_dialog.cc:769
 msgid "Engineer"
-msgstr ""
+msgstr "Engenheiro de Áudio"
 
-#: session_metadata_dialog.cc:769
+#: session_metadata_dialog.cc:772
 msgid "Producer"
-msgstr ""
+msgstr "Produtor"
 
-#: session_metadata_dialog.cc:772
+#: session_metadata_dialog.cc:775
 msgid "DJ Mixer"
 msgstr ""
 
-#: session_metadata_dialog.cc:775
+#: session_metadata_dialog.cc:778
 msgid "Metadata|Mixer"
 msgstr ""
 
-#: session_metadata_dialog.cc:783
+#: session_metadata_dialog.cc:786
 msgid "School"
 msgstr ""
 
-#: session_metadata_dialog.cc:788
+#: session_metadata_dialog.cc:791
 msgid "Instructor"
 msgstr ""
 
-#: session_metadata_dialog.cc:791
+#: session_metadata_dialog.cc:794
 msgid "Course"
 msgstr ""
 
-#: session_metadata_dialog.cc:799
+#: session_metadata_dialog.cc:802
 msgid "Edit Session Metadata"
 msgstr ""
 
-#: session_metadata_dialog.cc:830
+#: session_metadata_dialog.cc:833
 msgid "Import session metadata"
 msgstr ""
 
-#: session_metadata_dialog.cc:851
+#: session_metadata_dialog.cc:854
 msgid "Choose session to import metadata from"
 msgstr ""
 
-#: session_metadata_dialog.cc:889
+#: session_metadata_dialog.cc:892
 msgid "This session file could not be read!"
 msgstr ""
 
-#: session_metadata_dialog.cc:899
+#: session_metadata_dialog.cc:902
 msgid ""
 "The session file didn't contain metadata!\n"
 "Maybe this is an old session format?"
 msgstr ""
 
-#: session_metadata_dialog.cc:918
+#: session_metadata_dialog.cc:921
 msgid "Import all from:"
 msgstr ""
 
@@ -10786,209 +12856,230 @@ msgid "Destructive crossfade length"
 msgstr ""
 
 #: session_option_editor.cc:146
-msgid "Region fades active"
+msgid "Declick when transport starts and stops"
 msgstr ""
 
 #: session_option_editor.cc:153
+msgid "Declick when monitor state changes"
+msgstr ""
+
+#: session_option_editor.cc:160
+msgid "Region fades active"
+msgstr ""
+
+#: session_option_editor.cc:167
 msgid "Region fades visible"
 msgstr ""
 
-#: session_option_editor.cc:160 session_option_editor.cc:173
-#: session_option_editor.cc:187
+#: session_option_editor.cc:174 session_option_editor.cc:187
+#: session_option_editor.cc:208
 msgid "Media"
 msgstr ""
 
-#: session_option_editor.cc:160
+#: session_option_editor.cc:174
 msgid "Audio file format"
 msgstr ""
 
-#: session_option_editor.cc:164
+#: session_option_editor.cc:178
 msgid "Sample format"
 msgstr ""
 
-#: session_option_editor.cc:169
+#: session_option_editor.cc:183
 msgid "32-bit floating point"
 msgstr ""
 
-#: session_option_editor.cc:170
+#: session_option_editor.cc:184
 msgid "24-bit integer"
 msgstr ""
 
-#: session_option_editor.cc:171
+#: session_option_editor.cc:185
 msgid "16-bit integer"
 msgstr ""
 
-#: session_option_editor.cc:177
+#: session_option_editor.cc:191
 msgid "File type"
 msgstr ""
 
-#: session_option_editor.cc:182
-msgid "Broadcast WAVE"
+#: session_option_editor.cc:196
+msgid "Broadcast WAVE (4GB size limit)"
 msgstr ""
 
-#: session_option_editor.cc:183
-msgid "WAVE"
+#: session_option_editor.cc:198
+msgid "Broadcast RF64"
 msgstr ""
 
-#: session_option_editor.cc:184
+#: session_option_editor.cc:200
+msgid "WAVE (4GB size limit)"
+msgstr ""
+
+#: session_option_editor.cc:201
 msgid "WAVE-64"
 msgstr ""
 
-#: session_option_editor.cc:189
+#: session_option_editor.cc:205
+msgid "RF64 (WAV compatible)"
+msgstr ""
+
+#: session_option_editor.cc:210 session_option_editor.cc:216
+#: session_option_editor.cc:223
+msgid "Files|Locations"
+msgstr ""
+
+#: session_option_editor.cc:210
 msgid "File locations"
 msgstr ""
 
-#: session_option_editor.cc:191
+#: session_option_editor.cc:212
 msgid "Search for audio files in:"
 msgstr ""
 
-#: session_option_editor.cc:197
+#: session_option_editor.cc:218
 msgid "Search for MIDI files in:"
 msgstr ""
 
-#: session_option_editor.cc:206 session_option_editor.cc:218
-#: session_option_editor.cc:228 session_option_editor.cc:239
+#: session_option_editor.cc:227 session_option_editor.cc:239
+#: session_option_editor.cc:249 session_option_editor.cc:260
 msgid "Filenames"
 msgstr ""
 
-#: session_option_editor.cc:206
+#: session_option_editor.cc:227
 msgid "File Naming"
 msgstr ""
 
-#: session_option_editor.cc:212
+#: session_option_editor.cc:233
 msgid "Prefix Track number"
 msgstr ""
 
-#: session_option_editor.cc:217
+#: session_option_editor.cc:238
 msgid ""
 "Adds the current track number to the beginning of the recorded file name."
 msgstr ""
 
-#: session_option_editor.cc:222
+#: session_option_editor.cc:243
 msgid "Prefix Take Name"
 msgstr ""
 
-#: session_option_editor.cc:227
+#: session_option_editor.cc:248
 msgid "Adds the Take Name to the beginning of the recorded file name."
 msgstr ""
 
-#: session_option_editor.cc:232
+#: session_option_editor.cc:253
 msgid "Take Name"
 msgstr ""
 
-#: session_option_editor.cc:245
+#: session_option_editor.cc:266
 msgid ""
 "Track Input Monitoring automatically follows transport state (\"auto-input\")"
 msgstr ""
 
-#: session_option_editor.cc:252
+#: session_option_editor.cc:273
 msgid "Use monitor section in this session"
 msgstr ""
 
-#: session_option_editor.cc:257 session_option_editor.cc:259
-#: session_option_editor.cc:266 session_option_editor.cc:273
-#: session_option_editor.cc:280 session_option_editor.cc:282
-#: session_option_editor.cc:289 session_option_editor.cc:296
-#: session_option_editor.cc:303 session_option_editor.cc:310
-#: session_option_editor.cc:312
+#: session_option_editor.cc:278 session_option_editor.cc:280
+#: session_option_editor.cc:287 session_option_editor.cc:294
+#: session_option_editor.cc:301 session_option_editor.cc:303
+#: session_option_editor.cc:310 session_option_editor.cc:317
+#: session_option_editor.cc:324 session_option_editor.cc:331
+#: session_option_editor.cc:333
 msgid "Meterbridge"
-msgstr ""
+msgstr "Mostrador de Volume"
 
-#: session_option_editor.cc:257
+#: session_option_editor.cc:278
 msgid "Route Display"
-msgstr ""
+msgstr "Exibir Roteamento"
 
-#: session_option_editor.cc:261
+#: session_option_editor.cc:282
 msgid "Show Midi Tracks"
-msgstr ""
+msgstr "Mostrar Trilhas MIDI"
 
-#: session_option_editor.cc:268
+#: session_option_editor.cc:289
 msgid "Show Busses"
 msgstr ""
 
-#: session_option_editor.cc:275
+#: session_option_editor.cc:296
 msgid "Include Master Bus"
 msgstr ""
 
-#: session_option_editor.cc:280
+#: session_option_editor.cc:301
 msgid "Button Area"
 msgstr ""
 
-#: session_option_editor.cc:284
+#: session_option_editor.cc:305
 msgid "Rec-enable Button"
 msgstr ""
 
-#: session_option_editor.cc:291
+#: session_option_editor.cc:312
 msgid "Mute Button"
 msgstr ""
 
-#: session_option_editor.cc:298
+#: session_option_editor.cc:319
 msgid "Solo Button"
 msgstr ""
 
-#: session_option_editor.cc:305
+#: session_option_editor.cc:326
 msgid "Monitor Buttons"
 msgstr ""
 
-#: session_option_editor.cc:310
+#: session_option_editor.cc:331
 msgid "Name Labels"
 msgstr ""
 
-#: session_option_editor.cc:314
+#: session_option_editor.cc:335
 msgid "Track Name"
 msgstr ""
 
-#: session_option_editor.cc:325
+#: session_option_editor.cc:346
 msgid "MIDI region copies are independent"
 msgstr ""
 
-#: session_option_editor.cc:332
+#: session_option_editor.cc:353
 msgid ""
 "Policy for handling overlapping notes\n"
 " on the same MIDI channel"
 msgstr ""
 
-#: session_option_editor.cc:337
+#: session_option_editor.cc:358
 msgid "never allow them"
 msgstr ""
 
-#: session_option_editor.cc:338
+#: session_option_editor.cc:359
 msgid "don't do anything in particular"
 msgstr ""
 
-#: session_option_editor.cc:339
+#: session_option_editor.cc:360
 msgid "replace any overlapped existing note"
 msgstr ""
 
-#: session_option_editor.cc:340
+#: session_option_editor.cc:361
 msgid "shorten the overlapped existing note"
 msgstr ""
 
-#: session_option_editor.cc:341
+#: session_option_editor.cc:362
 msgid "shorten the overlapping new note"
 msgstr ""
 
-#: session_option_editor.cc:342
+#: session_option_editor.cc:363
 msgid "replace both overlapping notes with a single note"
 msgstr ""
 
-#: session_option_editor.cc:346
+#: session_option_editor.cc:367
 msgid "Glue to bars and beats"
 msgstr ""
 
-#: session_option_editor.cc:350
+#: session_option_editor.cc:371
 msgid "Glue new markers to bars and beats"
 msgstr ""
 
-#: session_option_editor.cc:357
+#: session_option_editor.cc:378
 msgid "Glue new regions to bars and beats"
 msgstr ""
 
-#: session_option_editor.cc:362
+#: session_option_editor.cc:383
 msgid "Defaults"
 msgstr ""
 
-#: session_option_editor.cc:364
+#: session_option_editor.cc:385
 msgid "Use these settings as defaults"
 msgstr ""
 
@@ -11024,26 +13115,14 @@ msgstr ""
 msgid "Timestamp:"
 msgstr ""
 
-#: sfdb_ui.cc:149
-msgid "Format:"
-msgstr ""
-
-#: sfdb_ui.cc:188 sfdb_ui.cc:653
+#: sfdb_ui.cc:188 sfdb_ui.cc:659
 msgid "Tags:"
 msgstr ""
 
-#: sfdb_ui.cc:293 sfdb_ui.cc:409
-msgid "Could not read file: %1 (%2)."
-msgstr "Não foi possível ler o arquivo: %1 (%2)."
-
 #: sfdb_ui.cc:297
 msgid "<b>Midi File Information</b>"
 msgstr ""
 
-#: sfdb_ui.cc:458
-msgid "Could not access soundfile: "
-msgstr "não foi possível acessar arquivo de áudio"
-
 #: sfdb_ui.cc:530
 msgid "SoundFileBox: Could not tokenize string: "
 msgstr ""
@@ -11052,284 +13131,280 @@ msgstr ""
 msgid "Search"
 msgstr ""
 
-#: sfdb_ui.cc:576
+#: sfdb_ui.cc:581
 msgid "Audio and MIDI files"
 msgstr ""
 
-#: sfdb_ui.cc:579
+#: sfdb_ui.cc:584
 msgid "Audio files"
 msgstr ""
 
-#: sfdb_ui.cc:582
+#: sfdb_ui.cc:587
 msgid "MIDI files"
 msgstr ""
 
-#: sfdb_ui.cc:585 add_video_dialog.cc:123
+#: sfdb_ui.cc:590 add_video_dialog.cc:124
 msgid "All files"
 msgstr ""
 
-#: sfdb_ui.cc:604 add_video_dialog.cc:246
+#: sfdb_ui.cc:609 add_video_dialog.cc:247
 msgid "Browse Files"
 msgstr ""
 
-#: sfdb_ui.cc:633
+#: sfdb_ui.cc:638
 msgid "Paths"
 msgstr ""
 
-#: sfdb_ui.cc:642
+#: sfdb_ui.cc:647
 msgid "Search Tags"
 msgstr ""
 
-#: sfdb_ui.cc:658
+#: sfdb_ui.cc:664
 msgid "Sort:"
 msgstr ""
 
-#: sfdb_ui.cc:666
+#: sfdb_ui.cc:672
 msgid "Longest"
 msgstr ""
 
-#: sfdb_ui.cc:667
+#: sfdb_ui.cc:673
 msgid "Shortest"
 msgstr ""
 
-#: sfdb_ui.cc:668
+#: sfdb_ui.cc:674
 msgid "Newest"
 msgstr ""
 
-#: sfdb_ui.cc:669
+#: sfdb_ui.cc:675
 msgid "Oldest"
 msgstr ""
 
-#: sfdb_ui.cc:670
+#: sfdb_ui.cc:676
 msgid "Most downloaded"
 msgstr ""
 
-#: sfdb_ui.cc:671
+#: sfdb_ui.cc:677
 msgid "Least downloaded"
 msgstr ""
 
-#: sfdb_ui.cc:672
+#: sfdb_ui.cc:678
 msgid "Highest rated"
 msgstr ""
 
-#: sfdb_ui.cc:673
+#: sfdb_ui.cc:679
 msgid "Lowest rated"
 msgstr ""
 
-#: sfdb_ui.cc:678
+#: sfdb_ui.cc:684
 msgid "More"
 msgstr ""
 
-#: sfdb_ui.cc:682
+#: sfdb_ui.cc:688
 msgid "Similar"
 msgstr ""
 
-#: sfdb_ui.cc:694
+#: sfdb_ui.cc:700
 msgid "ID"
 msgstr ""
 
-#: sfdb_ui.cc:695 add_video_dialog.cc:83
+#: sfdb_ui.cc:701 add_video_dialog.cc:84
 msgid "Filename"
 msgstr ""
 
-#: sfdb_ui.cc:697
+#: sfdb_ui.cc:703 time_fx_dialog.cc:154
 msgid "Duration"
 msgstr ""
 
-#: sfdb_ui.cc:698
+#: sfdb_ui.cc:704
 msgid "Size"
 msgstr ""
 
-#: sfdb_ui.cc:699
+#: sfdb_ui.cc:705
 msgid "Samplerate"
 msgstr ""
 
-#: sfdb_ui.cc:700
+#: sfdb_ui.cc:706
 msgid "License"
 msgstr ""
 
-#: sfdb_ui.cc:718
+#: sfdb_ui.cc:724
 msgid "Search Freesound"
 msgstr ""
 
-#: sfdb_ui.cc:738
-msgid "Press to import selected files and close this window"
+#: sfdb_ui.cc:741
+msgid "Press to import selected files"
 msgstr ""
 
-#: sfdb_ui.cc:739
-msgid "Press to import selected files and leave this window open"
-msgstr ""
-
-#: sfdb_ui.cc:740
+#: sfdb_ui.cc:742
 msgid "Press to close this window without importing any files"
 msgstr ""
 
-#: sfdb_ui.cc:936
+#: sfdb_ui.cc:937
 msgid "SoundFileBrowser: Could not tokenize string: "
 msgstr ""
 
-#: sfdb_ui.cc:1136
+#: sfdb_ui.cc:1137
 msgid "%1 more page of 100 results available"
 msgid_plural "%1 more pages of 100 results available"
 msgstr[0] ""
 msgstr[1] ""
 
-#: sfdb_ui.cc:1141
+#: sfdb_ui.cc:1142
 msgid "No more results available"
 msgstr ""
 
-#: sfdb_ui.cc:1205
+#: sfdb_ui.cc:1206
 msgid "B"
 msgstr ""
 
-#: sfdb_ui.cc:1207
+#: sfdb_ui.cc:1208
 msgid "kB"
 msgstr ""
 
-#: sfdb_ui.cc:1209 sfdb_ui.cc:1211
+#: sfdb_ui.cc:1210 sfdb_ui.cc:1212
 msgid "MB"
 msgstr ""
 
-#: sfdb_ui.cc:1213
+#: sfdb_ui.cc:1214
 msgid "GB"
 msgstr ""
 
-#: sfdb_ui.cc:1425 sfdb_ui.cc:1738 sfdb_ui.cc:1801 sfdb_ui.cc:1819
+#: sfdb_ui.cc:1431 sfdb_ui.cc:1728 sfdb_ui.cc:1764 sfdb_ui.cc:1782
 msgid "one track per file"
 msgstr ""
 
-#: sfdb_ui.cc:1428 sfdb_ui.cc:1802 sfdb_ui.cc:1820
+#: sfdb_ui.cc:1434 sfdb_ui.cc:1765 sfdb_ui.cc:1783
 msgid "one track per channel"
 msgstr ""
 
-#: sfdb_ui.cc:1436 sfdb_ui.cc:1804 sfdb_ui.cc:1821
+#: sfdb_ui.cc:1442 sfdb_ui.cc:1767 sfdb_ui.cc:1784
 msgid "sequence files"
 msgstr ""
 
-#: sfdb_ui.cc:1439 sfdb_ui.cc:1809
+#: sfdb_ui.cc:1445 sfdb_ui.cc:1772
 msgid "all files in one track"
 msgstr ""
 
-#: sfdb_ui.cc:1440 sfdb_ui.cc:1803
+#: sfdb_ui.cc:1446 sfdb_ui.cc:1766
 msgid "merge files"
 msgstr ""
 
-#: sfdb_ui.cc:1446 sfdb_ui.cc:1806
+#: sfdb_ui.cc:1452 sfdb_ui.cc:1769
 msgid "one region per file"
 msgstr ""
 
-#: sfdb_ui.cc:1449 sfdb_ui.cc:1807
+#: sfdb_ui.cc:1455 sfdb_ui.cc:1770
 msgid "one region per channel"
 msgstr ""
 
-#: sfdb_ui.cc:1454 sfdb_ui.cc:1808 sfdb_ui.cc:1822
+#: sfdb_ui.cc:1460 sfdb_ui.cc:1771 sfdb_ui.cc:1785
 msgid "all files in one region"
 msgstr ""
 
-#: sfdb_ui.cc:1521
+#: sfdb_ui.cc:1527
 msgid ""
 "One or more of the selected files\n"
 "cannot be used by %1"
 msgstr ""
 
-#: sfdb_ui.cc:1665
+#: sfdb_ui.cc:1671
 msgid "Copy files to session"
 msgstr ""
 
-#: sfdb_ui.cc:1682 sfdb_ui.cc:1859
+#: sfdb_ui.cc:1686 sfdb_ui.cc:1825
 msgid "file timestamp"
 msgstr ""
 
-#: sfdb_ui.cc:1683 sfdb_ui.cc:1861
+#: sfdb_ui.cc:1687 sfdb_ui.cc:1827
 msgid "edit point"
 msgstr ""
 
-#: sfdb_ui.cc:1684 sfdb_ui.cc:1863
+#: sfdb_ui.cc:1688 sfdb_ui.cc:1829
 msgid "playhead"
 msgstr ""
 
-#: sfdb_ui.cc:1685
+#: sfdb_ui.cc:1689
 msgid "session start"
 msgstr ""
 
-#: sfdb_ui.cc:1691
-msgid "<b>Add files as ...</b>"
+#: sfdb_ui.cc:1695
+msgid "<b>Add files ...</b>"
 msgstr ""
 
-#: sfdb_ui.cc:1713
+#: sfdb_ui.cc:1700
 msgid "<b>Insert at</b>"
 msgstr ""
 
-#: sfdb_ui.cc:1726
+#: sfdb_ui.cc:1705
 msgid "<b>Mapping</b>"
 msgstr ""
 
-#: sfdb_ui.cc:1744
+#: sfdb_ui.cc:1710
 msgid "<b>Conversion quality</b>"
 msgstr ""
 
-#: sfdb_ui.cc:1756
+#: sfdb_ui.cc:1715
 msgid "<b>Instrument</b>"
 msgstr ""
 
-#: sfdb_ui.cc:1768 sfdb_ui.cc:1875
+#: sfdb_ui.cc:1734 sfdb_ui.cc:1841
 msgid "Best"
 msgstr ""
 
-#: sfdb_ui.cc:1769 sfdb_ui.cc:1877
+#: sfdb_ui.cc:1735 sfdb_ui.cc:1843
 msgid "Good"
 msgstr ""
 
-#: sfdb_ui.cc:1770 sfdb_ui.cc:1879
+#: sfdb_ui.cc:1736 sfdb_ui.cc:1845
 msgid "Quick"
 msgstr ""
 
-#: sfdb_ui.cc:1772
+#: sfdb_ui.cc:1738
 msgid "Fastest"
 msgstr "Rapidamente"
 
-#: shuttle_control.cc:56
+#: shuttle_control.cc:64
 msgid "Shuttle speed control (Context-click for options)"
 msgstr ""
 
-#: shuttle_control.cc:174
+#: shuttle_control.cc:201 time_fx_dialog.cc:164
 msgid "Percent"
 msgstr ""
 
-#: shuttle_control.cc:182
+#: shuttle_control.cc:209
 msgid "Units"
 msgstr ""
 
-#: shuttle_control.cc:188 shuttle_control.cc:609
+#: shuttle_control.cc:215 shuttle_control.cc:671
 msgid "Sprung"
 msgstr "Retornável"
 
-#: shuttle_control.cc:192 shuttle_control.cc:612
+#: shuttle_control.cc:219 shuttle_control.cc:674
 msgid "Wheel"
 msgstr "Fixo"
 
-#: shuttle_control.cc:226
+#: shuttle_control.cc:253
 msgid "Maximum speed"
 msgstr ""
 
-#: shuttle_control.cc:568
-msgid "Playing"
+#: shuttle_control.cc:256
+msgid "Reset to 100%"
 msgstr ""
 
-#: shuttle_control.cc:583
+#: shuttle_control.cc:633
+msgid "Playing"
+msgstr "Reproduzindo"
+
+#: shuttle_control.cc:648
 #, c-format
 msgid "<<< %+d semitones"
 msgstr ""
 
-#: shuttle_control.cc:585
+#: shuttle_control.cc:650
 #, c-format
 msgid ">>> %+d semitones"
 msgstr ""
 
-#: shuttle_control.cc:590
-msgid "Stopped"
-msgstr ""
-
 #: soundcloud_export_selector.cc:44
 msgid "User Email"
 msgstr ""
@@ -11354,7 +13429,7 @@ msgstr ""
 msgid "%1: %2 of %3 bytes uploaded"
 msgstr ""
 
-#: splash.cc:73
+#: splash.cc:78
 msgid "%1 loading ..."
 msgstr ""
 
@@ -11370,17 +13445,17 @@ msgstr ""
 msgid "Azimuth:"
 msgstr ""
 
-#: startup.cc:67
+#: startup.cc:71
 msgid ""
 "Use an external mixer or the hardware mixer of your audio interface.\n"
 "%1 will play NO role in monitoring"
 msgstr ""
 
-#: startup.cc:69
+#: startup.cc:73
 msgid "Ask %1 to play back material as it is being recorded"
 msgstr ""
 
-#: startup.cc:142
+#: startup.cc:146
 msgid ""
 "<span size=\"larger\">%1 is a digital audio workstation. You can use it to "
 "record, edit and mix multi-track audio. You can produce your own CDs, mix "
@@ -11390,15 +13465,15 @@ msgid ""
 "program.</span> "
 msgstr ""
 
-#: startup.cc:168
+#: startup.cc:172
 msgid "Welcome to %1"
-msgstr ""
+msgstr "Bem-vindo ao %1"
 
-#: startup.cc:191
+#: startup.cc:195
 msgid "Default folder for %1 sessions"
-msgstr ""
+msgstr "Diretório padrão para %1 sessões"
 
-#: startup.cc:197
+#: startup.cc:201
 msgid ""
 "Each project that you work on with %1 has its own folder.\n"
 "These can require a lot of disk space if you are recording audio.\n"
@@ -11408,11 +13483,11 @@ msgid ""
 "<i>(You can put new sessions anywhere, this is just a default)</i>"
 msgstr ""
 
-#: startup.cc:220
+#: startup.cc:224
 msgid "Default folder for new sessions"
 msgstr ""
 
-#: startup.cc:241
+#: startup.cc:245
 msgid ""
 "While recording instruments or vocals, you probably want to listen to the\n"
 "signal as well as record it. This is called \"monitoring\". There are\n"
@@ -11426,31 +13501,31 @@ msgid ""
 "<i>If you do not understand what this is about, just accept the default.</i>"
 msgstr ""
 
-#: startup.cc:262
+#: startup.cc:266
 msgid "Monitoring Choices"
 msgstr ""
 
-#: startup.cc:285
+#: startup.cc:289
 msgid "Use a Master bus directly"
 msgstr ""
 
-#: startup.cc:287
+#: startup.cc:291
 msgid ""
 "Connect the Master bus directly to your hardware outputs. This is preferable "
 "for simple usage."
 msgstr ""
 
-#: startup.cc:296
+#: startup.cc:300
 msgid "Use an additional Monitor bus"
 msgstr ""
 
-#: startup.cc:299
+#: startup.cc:303
 msgid ""
 "Use a Monitor bus between Master bus and hardware outputs for \n"
 "greater control in monitoring without affecting the mix."
 msgstr ""
 
-#: startup.cc:321
+#: startup.cc:325
 msgid ""
 "<i>You can change this preference at any time via the Preferences dialog.\n"
 "You can also add or remove the monitor section to/from any session.</i>\n"
@@ -11458,46 +13533,42 @@ msgid ""
 "<i>If you do not understand what this is about, just accept the default.</i>"
 msgstr ""
 
-#: startup.cc:332
+#: startup.cc:336
 msgid "Monitor Section"
 msgstr ""
 
-#: step_entry.cc:60
+#: step_entry.cc:59
 msgid "Step Entry: %1"
 msgstr ""
 
-#: step_entry.cc:65
+#: step_entry.cc:64
 msgid ">beat"
 msgstr ""
 
-#: step_entry.cc:66
+#: step_entry.cc:65
 msgid ">bar"
 msgstr ""
 
-#: step_entry.cc:67
+#: step_entry.cc:66
 msgid ">EP"
 msgstr ""
 
-#: step_entry.cc:68
+#: step_entry.cc:67
 msgid "sustain"
 msgstr ""
 
-#: step_entry.cc:69
+#: step_entry.cc:68
 msgid "rest"
 msgstr ""
 
-#: step_entry.cc:70
+#: step_entry.cc:69
 msgid "g-rest"
 msgstr ""
 
-#: step_entry.cc:71
+#: step_entry.cc:70
 msgid "back"
 msgstr ""
 
-#: step_entry.cc:82 step_entry.cc:85
-msgid "+"
-msgstr ""
-
 #: step_entry.cc:191
 msgid "Set note length to a whole note"
 msgstr ""
@@ -11606,11 +13677,11 @@ msgstr ""
 msgid "Insert a program change message"
 msgstr ""
 
-#: step_entry.cc:343 step_entry.cc:700
+#: step_entry.cc:343 step_entry.cc:645
 msgid "Move Insert Position Back by Note Length"
 msgstr ""
 
-#: step_entry.cc:344 step_entry.cc:698
+#: step_entry.cc:344 step_entry.cc:643
 msgid "Move Insert Position to Edit Point"
 msgstr ""
 
@@ -11622,240 +13693,244 @@ msgstr ""
 msgid "Octave"
 msgstr ""
 
-#: step_entry.cc:598
+#: step_entry.cc:592
 msgid "Insert Note A"
 msgstr ""
 
-#: step_entry.cc:599
+#: step_entry.cc:593
 msgid "Insert Note A-sharp"
 msgstr ""
 
-#: step_entry.cc:600
+#: step_entry.cc:594
 msgid "Insert Note B"
 msgstr ""
 
-#: step_entry.cc:601
+#: step_entry.cc:595
 msgid "Insert Note C"
 msgstr ""
 
-#: step_entry.cc:602
+#: step_entry.cc:596
 msgid "Insert Note C-sharp"
 msgstr ""
 
-#: step_entry.cc:603
+#: step_entry.cc:597
 msgid "Insert Note D"
 msgstr ""
 
-#: step_entry.cc:604
+#: step_entry.cc:598
 msgid "Insert Note D-sharp"
 msgstr ""
 
-#: step_entry.cc:605
+#: step_entry.cc:599
 msgid "Insert Note E"
 msgstr ""
 
-#: step_entry.cc:606
+#: step_entry.cc:600
 msgid "Insert Note F"
 msgstr ""
 
-#: step_entry.cc:607
+#: step_entry.cc:601
 msgid "Insert Note F-sharp"
 msgstr ""
 
-#: step_entry.cc:608
+#: step_entry.cc:602
 msgid "Insert Note G"
 msgstr ""
 
-#: step_entry.cc:609
+#: step_entry.cc:603
 msgid "Insert Note G-sharp"
 msgstr ""
 
-#: step_entry.cc:611
+#: step_entry.cc:605
 msgid "Insert a Note-length Rest"
 msgstr ""
 
-#: step_entry.cc:612
+#: step_entry.cc:606
 msgid "Insert a Snap-length Rest"
 msgstr ""
 
-#: step_entry.cc:614 step_entry.cc:615
+#: step_entry.cc:608 step_entry.cc:609
 msgid "Move to next octave"
 msgstr ""
 
-#: step_entry.cc:617
+#: step_entry.cc:611
 msgid "Move to Next Note Length"
 msgstr ""
 
-#: step_entry.cc:618
+#: step_entry.cc:612
 msgid "Move to Previous Note Length"
 msgstr ""
 
-#: step_entry.cc:620
+#: step_entry.cc:614
 msgid "Increase Note Length"
 msgstr ""
 
-#: step_entry.cc:621
+#: step_entry.cc:615
 msgid "Decrease Note Length"
 msgstr ""
 
-#: step_entry.cc:623
+#: step_entry.cc:617
 msgid "Move to Next Note Velocity"
 msgstr ""
 
-#: step_entry.cc:624
+#: step_entry.cc:618
 msgid "Move to Previous Note Velocity"
 msgstr ""
 
-#: step_entry.cc:626
+#: step_entry.cc:620
 msgid "Increase Note Velocity"
 msgstr ""
 
-#: step_entry.cc:627
+#: step_entry.cc:621
 msgid "Decrease Note Velocity"
 msgstr ""
 
-#: step_entry.cc:629
+#: step_entry.cc:623
 msgid "Switch to the 1st octave"
 msgstr ""
 
-#: step_entry.cc:630
+#: step_entry.cc:624
 msgid "Switch to the 2nd octave"
 msgstr ""
 
-#: step_entry.cc:631
+#: step_entry.cc:625
 msgid "Switch to the 3rd octave"
 msgstr ""
 
-#: step_entry.cc:632
+#: step_entry.cc:626
 msgid "Switch to the 4th octave"
 msgstr ""
 
-#: step_entry.cc:633
+#: step_entry.cc:627
 msgid "Switch to the 5th octave"
 msgstr ""
 
-#: step_entry.cc:634
+#: step_entry.cc:628
 msgid "Switch to the 6th octave"
 msgstr ""
 
-#: step_entry.cc:635
+#: step_entry.cc:629
 msgid "Switch to the 7th octave"
 msgstr ""
 
-#: step_entry.cc:636
+#: step_entry.cc:630
 msgid "Switch to the 8th octave"
 msgstr ""
 
-#: step_entry.cc:637
+#: step_entry.cc:631
 msgid "Switch to the 9th octave"
 msgstr ""
 
-#: step_entry.cc:638
+#: step_entry.cc:632
 msgid "Switch to the 10th octave"
 msgstr ""
 
-#: step_entry.cc:639
+#: step_entry.cc:633
 msgid "Switch to the 11th octave"
 msgstr ""
 
-#: step_entry.cc:644
+#: step_entry.cc:635
+msgid "Toggle Triple Notes"
+msgstr ""
+
+#: step_entry.cc:638
+msgid "Toggle Chord Entry"
+msgstr ""
+
+#: step_entry.cc:640
+msgid "Sustain Selected Notes by Note Length"
+msgstr ""
+
+#: step_entry.cc:650
 msgid "Set Note Length to Whole"
 msgstr ""
 
-#: step_entry.cc:646
+#: step_entry.cc:652
 msgid "Set Note Length to 1/2"
 msgstr ""
 
-#: step_entry.cc:648
+#: step_entry.cc:654
 msgid "Set Note Length to 1/3"
 msgstr ""
 
-#: step_entry.cc:650
+#: step_entry.cc:656
 msgid "Set Note Length to 1/4"
 msgstr ""
 
-#: step_entry.cc:652
+#: step_entry.cc:658
 msgid "Set Note Length to 1/8"
 msgstr ""
 
-#: step_entry.cc:654
+#: step_entry.cc:660
 msgid "Set Note Length to 1/16"
 msgstr ""
 
-#: step_entry.cc:656
+#: step_entry.cc:662
 msgid "Set Note Length to 1/32"
 msgstr ""
 
-#: step_entry.cc:658
+#: step_entry.cc:664
 msgid "Set Note Length to 1/64"
 msgstr ""
 
-#: step_entry.cc:663
+#: step_entry.cc:669
 msgid "Set Note Velocity to Pianississimo"
 msgstr ""
 
-#: step_entry.cc:665
+#: step_entry.cc:671
 msgid "Set Note Velocity to Pianissimo"
 msgstr ""
 
-#: step_entry.cc:667
+#: step_entry.cc:673
 msgid "Set Note Velocity to Piano"
 msgstr ""
 
-#: step_entry.cc:669
+#: step_entry.cc:675
 msgid "Set Note Velocity to Mezzo-Piano"
 msgstr ""
 
-#: step_entry.cc:671
+#: step_entry.cc:677
 msgid "Set Note Velocity to Mezzo-Forte"
 msgstr ""
 
-#: step_entry.cc:673
+#: step_entry.cc:679
 msgid "Set Note Velocity to Forte"
 msgstr ""
 
-#: step_entry.cc:675 step_entry.cc:677
+#: step_entry.cc:681 step_entry.cc:683
 msgid "Set Note Velocity to Fortississimo"
 msgstr ""
 
-#: step_entry.cc:679
-msgid "Toggle Triple Notes"
-msgstr ""
-
-#: step_entry.cc:684
+#: step_entry.cc:688
 msgid "No Dotted Notes"
 msgstr ""
 
-#: step_entry.cc:686
+#: step_entry.cc:689
 msgid "Toggled Dotted Notes"
 msgstr ""
 
-#: step_entry.cc:688
+#: step_entry.cc:690
 msgid "Toggled Double-Dotted Notes"
 msgstr ""
 
-#: step_entry.cc:690
+#: step_entry.cc:691
 msgid "Toggled Triple-Dotted Notes"
 msgstr ""
 
-#: step_entry.cc:693
-msgid "Toggle Chord Entry"
-msgstr ""
-
-#: step_entry.cc:695
-msgid "Sustain Selected Notes by Note Length"
-msgstr ""
-
-#: stereo_panner.cc:133
+#: stereo_panner.cc:129
 #, c-format
 msgid "L:%3d R:%3d Width:%d%%"
 msgstr ""
 
-#: stereo_panner_editor.cc:35
+#: stereo_panner.cc:272
+msgid "Panner|M"
+msgstr ""
+
+#: stereo_panner_editor.cc:37
 msgid "Stereo Panner"
 msgstr ""
 
-#: stereo_panner_editor.cc:49
+#: stereo_panner_editor.cc:51
 msgid "Width"
 msgstr ""
 
@@ -11863,176 +13938,189 @@ msgstr ""
 msgid "Strip Silence"
 msgstr ""
 
-#: strip_silence_dialog.cc:75
+#: strip_silence_dialog.cc:65
+msgid "Threshold"
+msgstr ""
+
+#: strip_silence_dialog.cc:76
 msgid "Minimum length"
 msgstr ""
 
-#: strip_silence_dialog.cc:83
+#: strip_silence_dialog.cc:84
 msgid "Fade length"
 msgstr ""
 
-#: tempo_dialog.cc:41 tempo_dialog.cc:57
+#: strip_silence_dialog.cc:111 strip_silence_dialog.cc:298
+msgid "Analyzing"
+msgstr ""
+
+#: tempo_dialog.cc:43 tempo_dialog.cc:60
 msgid "bar:"
 msgstr ""
 
-#: tempo_dialog.cc:42 tempo_dialog.cc:58
+#: tempo_dialog.cc:44 tempo_dialog.cc:61
 msgid "beat:"
 msgstr ""
 
-#: tempo_dialog.cc:43 tempo_dialog.cc:59
+#: tempo_dialog.cc:45 tempo_dialog.cc:62
 msgid "Pulse note"
 msgstr ""
 
-#: tempo_dialog.cc:44 tempo_dialog.cc:60
+#: tempo_dialog.cc:46 tempo_dialog.cc:63
 msgid "Tap tempo"
 msgstr ""
 
-#: tempo_dialog.cc:54
-msgid "Edit Tempo"
-msgstr ""
-
-#: tempo_dialog.cc:77 tempo_dialog.cc:78 tempo_dialog.cc:324
-#: tempo_dialog.cc:325
+#: tempo_dialog.cc:81 tempo_dialog.cc:82 tempo_dialog.cc:448
+#: tempo_dialog.cc:449
 msgid "whole"
 msgstr ""
 
-#: tempo_dialog.cc:79 tempo_dialog.cc:80 tempo_dialog.cc:326
-#: tempo_dialog.cc:327
+#: tempo_dialog.cc:83 tempo_dialog.cc:84 tempo_dialog.cc:450
+#: tempo_dialog.cc:451
 msgid "second"
 msgstr ""
 
-#: tempo_dialog.cc:81 tempo_dialog.cc:82 tempo_dialog.cc:328
-#: tempo_dialog.cc:329
+#: tempo_dialog.cc:85 tempo_dialog.cc:86 tempo_dialog.cc:452
+#: tempo_dialog.cc:453
 msgid "third"
 msgstr ""
 
-#: tempo_dialog.cc:83 tempo_dialog.cc:84 tempo_dialog.cc:330
-#: tempo_dialog.cc:331
+#: tempo_dialog.cc:87 tempo_dialog.cc:88 tempo_dialog.cc:454
+#: tempo_dialog.cc:455
 msgid "quarter"
 msgstr ""
 
-#: tempo_dialog.cc:85 tempo_dialog.cc:86 tempo_dialog.cc:332
-#: tempo_dialog.cc:333
+#: tempo_dialog.cc:89 tempo_dialog.cc:90 tempo_dialog.cc:456
+#: tempo_dialog.cc:457
 msgid "eighth"
 msgstr ""
 
-#: tempo_dialog.cc:87 tempo_dialog.cc:88 tempo_dialog.cc:334
-#: tempo_dialog.cc:335
+#: tempo_dialog.cc:91 tempo_dialog.cc:92 tempo_dialog.cc:458
+#: tempo_dialog.cc:459
 msgid "sixteenth"
 msgstr ""
 
-#: tempo_dialog.cc:89 tempo_dialog.cc:90 tempo_dialog.cc:336
-#: tempo_dialog.cc:337
+#: tempo_dialog.cc:93 tempo_dialog.cc:94 tempo_dialog.cc:460
+#: tempo_dialog.cc:461
 msgid "thirty-second"
 msgstr ""
 
-#: tempo_dialog.cc:91 tempo_dialog.cc:92 tempo_dialog.cc:338
-#: tempo_dialog.cc:339
+#: tempo_dialog.cc:95 tempo_dialog.cc:96 tempo_dialog.cc:462
+#: tempo_dialog.cc:463
 msgid "sixty-fourth"
 msgstr ""
 
-#: tempo_dialog.cc:93 tempo_dialog.cc:94 tempo_dialog.cc:340
-#: tempo_dialog.cc:341
+#: tempo_dialog.cc:97 tempo_dialog.cc:98 tempo_dialog.cc:464
+#: tempo_dialog.cc:465
 msgid "one-hundred-twenty-eighth"
 msgstr ""
 
-#: tempo_dialog.cc:121
+#: tempo_dialog.cc:115 tempo_dialog.cc:116
+msgid "ramped"
+msgstr ""
+
+#: tempo_dialog.cc:117 tempo_dialog.cc:118
+msgid "constant"
+msgstr ""
+
+#: tempo_dialog.cc:133 tempo_dialog.cc:134 tempo_dialog.cc:482
+#: tempo_dialog.cc:483
+msgid "music"
+msgstr ""
+
+#: tempo_dialog.cc:161
 msgid "Beats per minute:"
 msgstr ""
 
-#: tempo_dialog.cc:155
+#: tempo_dialog.cc:195
 msgid "Tempo begins at"
 msgstr ""
 
-#: tempo_dialog.cc:251
+#: tempo_dialog.cc:201
+msgid "Lock Style:"
+msgstr ""
+
+#: tempo_dialog.cc:209
+msgid "Tempo Type:"
+msgstr ""
+
+#: tempo_dialog.cc:321
 msgid "incomprehensible pulse note type (%1)"
 msgstr ""
 
-#: tempo_dialog.cc:307
-msgid "Edit Meter"
+#: tempo_dialog.cc:334
+msgid "incomprehensible tempo type (%1)"
 msgstr ""
 
-#: tempo_dialog.cc:356
-msgid "Note value:"
+#: tempo_dialog.cc:347
+msgid "incomprehensible lock style (%1)"
 msgstr ""
 
-#: tempo_dialog.cc:357
-msgid "Beats per bar:"
+#: tempo_dialog.cc:498
+msgid "Note value:"
 msgstr ""
 
-#: tempo_dialog.cc:371
-msgid "Meter begins at bar:"
+#: tempo_dialog.cc:499
+msgid "Lock style:"
 msgstr ""
 
-#: tempo_dialog.cc:484
-msgid "incomprehensible meter note type (%1)"
+#: tempo_dialog.cc:500
+msgid "Beats per bar:"
 msgstr ""
 
-#: theme_manager.cc:65
-msgid "Dark Theme"
+#: tempo_dialog.cc:514
+msgid "Meter begins at bar:"
 msgstr ""
 
-#: theme_manager.cc:66
-msgid "Light Theme"
+#: tempo_dialog.cc:638
+msgid "incomprehensible meter note type (%1)"
 msgstr ""
 
-#: theme_manager.cc:67
-msgid "Restore Defaults"
+#: tempo_dialog.cc:651
+msgid "incomprehensible meter lock style (%1)"
 msgstr ""
 
-#: theme_manager.cc:68
+#: theme_manager.cc:53
 msgid "Draw \"flat\" buttons"
 msgstr ""
 
-#: theme_manager.cc:69
+#: theme_manager.cc:54
 msgid "Blink Rec-Arm buttons"
 msgstr ""
 
-#: theme_manager.cc:70
+#: theme_manager.cc:55
 msgid "Color regions using their track's color"
 msgstr ""
 
-#: theme_manager.cc:71
+#: theme_manager.cc:56
 msgid "Show waveform clipping"
 msgstr ""
 
-#: theme_manager.cc:73
+#: theme_manager.cc:58
 msgid "Waveforms color gradient depth"
 msgstr ""
 
-#: theme_manager.cc:75
+#: theme_manager.cc:60
 msgid "Timeline item gradient depth"
 msgstr ""
 
-#: theme_manager.cc:76
+#: theme_manager.cc:61
 msgid "All floating windows are dialogs"
 msgstr ""
 
-#: theme_manager.cc:77
+#: theme_manager.cc:62
 msgid "Transient windows follow front window."
 msgstr ""
 
-#: theme_manager.cc:78
-msgid "Icon Set"
-msgstr ""
-
-#: theme_manager.cc:87
-msgid "Object"
-msgstr ""
-
-#: theme_manager.cc:163
-msgid "Items"
-msgstr ""
-
-#: theme_manager.cc:164
-msgid "Palette"
+#: theme_manager.cc:63
+msgid "Float detached monitor-section window"
 msgstr ""
 
-#: theme_manager.cc:165
-msgid "Transparency"
+#: theme_manager.cc:64
+msgid "Icon Set"
 msgstr ""
 
-#: theme_manager.cc:195
+#: theme_manager.cc:132
 msgid ""
 "Mark all floating windows to be type \"Dialog\" rather than using \"Utility"
 "\" for some.\n"
@@ -12040,92 +14128,95 @@ msgid ""
 "take effect"
 msgstr ""
 
-#: theme_manager.cc:199
+#: theme_manager.cc:136
 msgid ""
 "Make transient windows follow the front window when toggling between the "
 "editor and mixer.\n"
 "This requires a restart of %1 to take effect"
 msgstr ""
 
-#: theme_manager.cc:620
-msgid "Color Palette"
+#: theme_manager.cc:139
+msgid ""
+"When detaching the monitoring section, mark it as \"Utility\" window to stay "
+"in front.\n"
+"This requires a restart of %1 to take effect"
 msgstr ""
 
 #: time_axis_view.cc:148
 msgid "Track/Bus name (double click to edit)"
 msgstr ""
 
-#: time_axis_view_item.cc:345
+#: time_axis_view_item.cc:326
 msgid "new duration %1 frame is out of bounds for %2"
 msgid_plural "new duration of %1 frames is out of bounds for %2"
 msgstr[0] ""
 msgstr[1] ""
 
-#: time_fx_dialog.cc:62
+#: time_fx_dialog.cc:60
 msgid "Quick but Ugly"
 msgstr "Rápido mas Feio"
 
-#: time_fx_dialog.cc:63
+#: time_fx_dialog.cc:61
 msgid "Skip Anti-aliasing"
 msgstr "Pular Anti-aliasing"
 
-#: time_fx_dialog.cc:64
-msgid "Contents:"
+#: time_fx_dialog.cc:62
+msgid "Contents"
 msgstr ""
 
-#: time_fx_dialog.cc:65
+#: time_fx_dialog.cc:63
 msgid "Minimize time distortion"
 msgstr ""
 
-#: time_fx_dialog.cc:66
+#: time_fx_dialog.cc:64
 msgid "Preserve Formants"
 msgstr ""
 
-#: time_fx_dialog.cc:71
+#: time_fx_dialog.cc:81
 msgid "TimeFXDialog"
 msgstr ""
 
-#: time_fx_dialog.cc:74
+#: time_fx_dialog.cc:84
 msgid "Pitch Shift Audio"
 msgstr ""
 
-#: time_fx_dialog.cc:76
+#: time_fx_dialog.cc:86
 msgid "Time Stretch Audio"
 msgstr ""
 
-#: time_fx_dialog.cc:104 transpose_dialog.cc:41
+#: time_fx_dialog.cc:114 transpose_dialog.cc:41
 msgid "Octaves:"
 msgstr ""
 
-#: time_fx_dialog.cc:109 transpose_dialog.cc:46
+#: time_fx_dialog.cc:119 transpose_dialog.cc:46
 msgid "Semitones:"
 msgstr ""
 
-#: time_fx_dialog.cc:114
+#: time_fx_dialog.cc:124
 msgid "Cents:"
 msgstr ""
 
-#: time_fx_dialog.cc:122
+#: time_fx_dialog.cc:132
 msgid "Time|Shift"
 msgstr ""
 
-#: time_fx_dialog.cc:146 time_fx_dialog.cc:149
+#: time_fx_dialog.cc:184 time_fx_dialog.cc:188
 msgid "TimeFXButton"
 msgstr ""
 
-#: time_fx_dialog.cc:154
+#: time_fx_dialog.cc:193
 msgid "Stretch/Shrink"
 msgstr ""
 
-#: time_fx_dialog.cc:164
+#: time_fx_dialog.cc:203
 msgid "<b>Progress</b>"
-msgstr ""
+msgstr "<b>Progresso</b>"
 
-#: time_info_box.cc:124
+#: time_info_box.cc:118
 msgid "Start recording at auto-punch start"
 msgstr "Iniciar gravação no início do ponto-automático"
 
-#: time_info_box.cc:125
+#: time_info_box.cc:119
 msgid "Stop recording at auto-punch end"
 msgstr "Parar gravação no final do ponto-automático"
 
@@ -12193,164 +14284,216 @@ msgstr ""
 msgid "Transpose"
 msgstr ""
 
-#: ui_config.cc:163 ui_config.cc:300
+#: ui_config.cc:234 ui_config.cc:422
 msgid "Loading default ui configuration file %1"
 msgstr ""
 
-#: ui_config.cc:166 ui_config.cc:303
+#: ui_config.cc:237 ui_config.cc:425
 msgid "cannot read default ui configuration file \"%1\""
 msgstr ""
 
-#: ui_config.cc:169 ui_config.cc:308
+#: ui_config.cc:240 ui_config.cc:430
 msgid "default ui configuration file \"%1\" not loaded successfully."
 msgstr ""
 
-#: ui_config.cc:177
+#: ui_config.cc:248
 msgid "Could not find default UI configuration file %1"
 msgstr ""
 
-#: ui_config.cc:219
+#: ui_config.cc:289
 msgid "Loading color file %1"
 msgstr ""
 
-#: ui_config.cc:222
+#: ui_config.cc:292
 msgid "cannot read color file \"%1\""
 msgstr ""
 
-#: ui_config.cc:227
+#: ui_config.cc:297
 msgid "color file \"%1\" not loaded successfully."
 msgstr ""
 
-#: ui_config.cc:233
-msgid "Color file %1 not found"
+#: ui_config.cc:325
+msgid "Color file for %1 not found along %2"
 msgstr ""
 
-#: ui_config.cc:282 ui_config.cc:361
+#: ui_config.cc:403 ui_config.cc:486
 msgid "Color file %1 not saved"
 msgstr ""
 
-#: ui_config.cc:317
+#: ui_config.cc:439
 msgid "Loading user ui configuration file %1"
 msgstr ""
 
-#: ui_config.cc:320
+#: ui_config.cc:442
 msgid "cannot read ui configuration file \"%1\""
 msgstr ""
 
-#: ui_config.cc:325
+#: ui_config.cc:447
 msgid "user ui configuration file \"%1\" not loaded successfully."
 msgstr ""
 
-#: ui_config.cc:333
+#: ui_config.cc:455
 msgid "could not find any ui configuration file, canvas will look broken."
 msgstr ""
 
-#: ui_config.cc:351
+#: ui_config.cc:476
 msgid "Config file %1 not saved"
 msgstr ""
 
-#: ui_config.cc:592
+#: ui_config.cc:720
 msgid "Color %1 not found"
 msgstr ""
 
-#: ui_config.cc:662
+#: ui_config.cc:790
 msgid "Unable to find UI style file %1 in search path %2. %3 will look strange"
 msgstr ""
 
-#: utils.cc:117 utils.cc:160
+#: utils.cc:118 utils.cc:161
 msgid "bad XPM header %1"
 msgstr ""
 
-#: utils.cc:577
+#: utils.cc:365
 msgid "cannot find XPM file for %1"
 msgstr ""
 
-#: utils.cc:597 utils.cc:627 utils.cc:641
+#: utils.cc:418 utils.cc:448 utils.cc:468
 msgid "default"
 msgstr ""
 
-#: utils.cc:642
+#: utils.cc:469
 msgid "icon \"%1\" not found for icon set \"%2\", fallback to default"
 msgstr ""
 
-#: utils.cc:649
+#: utils.cc:476
 msgid "cannot find icon image for %1 using %2"
 msgstr ""
 
-#: utils.cc:666 utils.cc:682
+#: utils.cc:493 utils.cc:509
 msgid "Caught exception while loading icon named %1"
 msgstr ""
 
-#: add_video_dialog.cc:54
+#: utils.cc:759
+msgid "Overwrite"
+msgstr "Sobrescrever"
+
+#: vca_master_strip.cc:74 vca_time_axis.cc:49
+msgid "Solo slaves"
+msgstr ""
+
+#: vca_master_strip.cc:79 vca_time_axis.cc:55
+msgid "Mute slaves"
+msgstr ""
+
+#: vca_master_strip.cc:83
+msgid "Hide this VCA strip"
+msgstr ""
+
+#: vca_master_strip.cc:108 vca_master_strip.cc:418
+msgid "Click to show slaves only"
+msgstr ""
+
+#: vca_master_strip.cc:293
+msgid "A"
+msgstr ""
+
+#: vca_master_strip.cc:300
+msgid "S"
+msgstr ""
+
+#: vca_master_strip.cc:398
+msgid "Drop All Slaves"
+msgstr ""
+
+#: vca_master_strip.cc:421
+msgid "Click to show normal mixer"
+msgstr ""
+
+#: add_video_dialog.cc:55
 msgid "Set Video Track"
 msgstr ""
 
-#: add_video_dialog.cc:62
+#: add_video_dialog.cc:63
 msgid "Open Video Monitor Window"
 msgstr ""
 
-#: add_video_dialog.cc:63
+#: add_video_dialog.cc:64
 msgid "Adjust Session Framerate to Match Video Framerate"
 msgstr ""
 
-#: add_video_dialog.cc:65
+#: add_video_dialog.cc:66
 msgid "Reload docroot"
 msgstr ""
 
-#: add_video_dialog.cc:120
+#: add_video_dialog.cc:121
 msgid "Video files"
 msgstr ""
 
-#: add_video_dialog.cc:149
+#: add_video_dialog.cc:150
 msgid "<b>Video Information</b>"
 msgstr ""
 
-#: add_video_dialog.cc:152
+#: add_video_dialog.cc:153
 msgid "Start:"
-msgstr ""
+msgstr "Início:"
 
-#: add_video_dialog.cc:158
+#: add_video_dialog.cc:159
 msgid "Frame rate:"
 msgstr ""
 
-#: add_video_dialog.cc:161
+#: add_video_dialog.cc:162
 msgid "Aspect Ratio:"
-msgstr ""
+msgstr "Proporção da Tela"
 
-#: add_video_dialog.cc:244
+#: add_video_dialog.cc:245
 msgid "VideoServerIndex"
 msgstr ""
 
-#: add_video_dialog.cc:675
+#: add_video_dialog.cc:676
 msgid " %1 fps"
 msgstr ""
 
-#: video_timeline.cc:468
+#: vca_time_axis.cc:60
+msgid "D"
+msgstr ""
+
+#: vca_time_axis.cc:61
+msgid "Unassign all slaves"
+msgstr ""
+
+#: vca_time_axis.cc:65
+msgid "V"
+msgstr ""
+
+#: vca_time_axis.cc:66
+msgid "Show only slaves"
+msgstr ""
+
+#: video_timeline.cc:473
 msgid ""
 "Parsing video file info failed. Is the Video Server running? Is the file "
 "readable by the Video Server? Does the docroot match? Is it a video file?"
 msgstr ""
 
-#: video_timeline.cc:506
+#: video_timeline.cc:511
 msgid ""
 "Failed to set session-framerate: '%1' does not have a corresponding option "
 "setting in %2."
 msgstr ""
 
-#: video_timeline.cc:514
+#: video_timeline.cc:519
 msgid ""
 "Video file's framerate is not equal to %1 session timecode's framerate: '%2' "
 "vs '%3'"
 msgstr ""
 
-#: video_timeline.cc:587
+#: video_timeline.cc:592
 msgid ""
 "Video-server docroot mismatch. %1: '%2', video-server: '%3'. This usually "
 "means that the video server was not started by %1 and uses a different "
 "document-root."
 msgstr ""
 
-#: video_timeline.cc:724
+#: video_timeline.cc:729
 msgid ""
 "Video-monitor 'xjadeo' was not found. Please install http://xjadeo.sf.net/ "
 "(a custom path to xjadeo can be specified by setting the XJREMOTE "
@@ -12360,25 +14503,25 @@ msgid ""
 "see also http://manual.ardour.org/video-timeline/setup/"
 msgstr ""
 
-#: video_timeline.cc:739
+#: video_timeline.cc:744
 msgid "Video-monitor 'xjadeo' cannot be launched."
 msgstr ""
 
-#: video_timeline.cc:766
+#: video_timeline.cc:776
 msgid ""
 "Video-monitor 'xjadeo' is too old. Please install xjadeo version 0.7.7 or "
 "later. http://xjadeo.sf.net/"
 msgstr ""
 
-#: video_monitor.cc:285
+#: video_monitor.cc:283
 msgid "Video Monitor: File Not Found."
 msgstr ""
 
 #: transcode_ffmpeg.cc:56
 msgid ""
-"No ffprobe or ffmpeg executables could be found on this system.\n"
-"Video import and export is not possible until you install those tools.\n"
+"ffmpeg installation was not found on this system.\n"
 "%1 requires ffmpeg and ffprobe from ffmpeg.org - version 1.1 or newer.\n"
+"Video import and export is not possible until you install tools.\n"
 "\n"
 "The tools are included with the %1 releases from ardour.org and also "
 "available with the video-server at http://x42.github.com/harvid/\n"
@@ -12400,7 +14543,7 @@ msgstr ""
 msgid "Output File:"
 msgstr ""
 
-#: transcode_video_dialog.cc:61 export_video_dialog.cc:85
+#: transcode_video_dialog.cc:61 export_video_dialog.cc:81
 msgid "Abort"
 msgstr ""
 
@@ -12409,10 +14552,14 @@ msgid "Height = "
 msgstr ""
 
 #: transcode_video_dialog.cc:66
+msgid "Extract LTC from audio and align video"
+msgstr ""
+
+#: transcode_video_dialog.cc:67
 msgid "Manual Override"
 msgstr ""
 
-#: transcode_video_dialog.cc:70 export_video_dialog.cc:103
+#: transcode_video_dialog.cc:71 export_video_dialog.cc:99
 msgid "Debug Mode: Print ffmpeg command and output to stdout."
 msgstr ""
 
@@ -12422,9 +14569,8 @@ msgstr ""
 
 #: transcode_video_dialog.cc:113
 msgid ""
-"No ffprobe or ffmpeg executables could be found on this system. Video Import "
-"is not possible until you install those tools. See the Log window for more "
-"information."
+"ffmpeg installation was not found. Video Import is not possible. See the Log "
+"window for more information."
 msgstr ""
 
 #: transcode_video_dialog.cc:120
@@ -12433,83 +14579,83 @@ msgid ""
 "unsupported video codec or format."
 msgstr ""
 
-#: transcode_video_dialog.cc:134
+#: transcode_video_dialog.cc:137
 msgid "FPS:"
 msgstr ""
 
-#: transcode_video_dialog.cc:136
-msgid "Duration:"
-msgstr ""
-
-#: transcode_video_dialog.cc:138
+#: transcode_video_dialog.cc:141
 msgid "Codec:"
 msgstr ""
 
-#: transcode_video_dialog.cc:140
+#: transcode_video_dialog.cc:143
 msgid "Geometry:"
 msgstr ""
 
-#: transcode_video_dialog.cc:155
+#: transcode_video_dialog.cc:158
 msgid "??"
 msgstr ""
 
-#: transcode_video_dialog.cc:176
+#: transcode_video_dialog.cc:179
 msgid "<b>Import Settings</b>"
 msgstr ""
 
-#: transcode_video_dialog.cc:181
-msgid "Reference From Current Location (Previously Transcoded Files Only)"
+#: transcode_video_dialog.cc:184
+msgid "Reference from Current Location (Previously Transcoded Files Only)"
 msgstr ""
 
-#: transcode_video_dialog.cc:183
+#: transcode_video_dialog.cc:185
 msgid "Import/Transcode Video to Session"
 msgstr ""
 
-#: transcode_video_dialog.cc:191
+#: transcode_video_dialog.cc:188 transcode_video_dialog.cc:198
 msgid "Do Not Import Video (Audio Import Only)"
 msgstr ""
 
-#: transcode_video_dialog.cc:200
+#: transcode_video_dialog.cc:208
+msgid "Do Not Import Video"
+msgstr ""
+
+#: transcode_video_dialog.cc:224
 msgid "Scale Video: Width = "
 msgstr ""
 
-#: transcode_video_dialog.cc:207
+#: transcode_video_dialog.cc:230
 msgid "Original Width"
 msgstr ""
 
-#: transcode_video_dialog.cc:222
+#: transcode_video_dialog.cc:245
 msgid "Bitrate (KBit/s):"
 msgstr ""
 
-#: transcode_video_dialog.cc:227
+#: transcode_video_dialog.cc:250
 msgid "Extract Audio:"
 msgstr ""
 
-#: transcode_video_dialog.cc:232
+#: transcode_video_dialog.cc:255
 msgid "No Audio Track Present"
 msgstr ""
 
-#: transcode_video_dialog.cc:235
+#: transcode_video_dialog.cc:258
 msgid "Do Not Extract Audio"
 msgstr ""
 
-#: transcode_video_dialog.cc:350
+#: transcode_video_dialog.cc:374
 msgid "Extracting Audio.."
 msgstr ""
 
-#: transcode_video_dialog.cc:353
+#: transcode_video_dialog.cc:377
 msgid "Audio Extraction Failed."
 msgstr ""
 
-#: transcode_video_dialog.cc:379
+#: transcode_video_dialog.cc:403
 msgid "Transcoding Video.."
 msgstr ""
 
-#: transcode_video_dialog.cc:413
+#: transcode_video_dialog.cc:437
 msgid "Transcoding Failed."
 msgstr ""
 
-#: transcode_video_dialog.cc:503
+#: transcode_video_dialog.cc:541
 msgid "Save Transcoded Video File"
 msgstr ""
 
@@ -12529,7 +14675,7 @@ msgstr ""
 msgid "Don't show this dialog again. (Reset in Edit->Preferences)."
 msgstr ""
 
-#: video_server_dialog.cc:97
+#: video_server_dialog.cc:94
 msgid ""
 "The external video server 'harvid' can not be found.\n"
 "The tool is included with the %1 releases from ardour.org, alternatively you "
@@ -12539,239 +14685,230 @@ msgid ""
 "see also http://manual.ardour.org/video-timeline/setup/"
 msgstr ""
 
-#: video_server_dialog.cc:129
+#: video_server_dialog.cc:126
 msgid "Listen Address:"
 msgstr ""
 
-#: video_server_dialog.cc:134
+#: video_server_dialog.cc:131
 msgid "Listen Port:"
 msgstr ""
 
-#: video_server_dialog.cc:139
+#: video_server_dialog.cc:136
 msgid "Cache Size:"
 msgstr ""
 
-#: video_server_dialog.cc:145
+#: video_server_dialog.cc:142
 msgid ""
 "%1 relies on an external video server for the videotimeline.\n"
 "The server configured in Edit -> Preferences -> Video is not reachable.\n"
 "Do you want %1 to launch 'harvid' on this machine?"
 msgstr ""
 
-#: video_server_dialog.cc:189
+#: video_server_dialog.cc:186
 msgid "Set Video Server Executable"
 msgstr ""
 
-#: video_server_dialog.cc:209
+#: video_server_dialog.cc:206
 msgid "Server docroot"
 msgstr ""
 
-#: utils_videotl.cc:60
+#: utils_videotl.cc:63
 msgid "Destination is outside Video Server's docroot. "
 msgstr ""
 
-#: utils_videotl.cc:61
+#: utils_videotl.cc:64
 msgid ""
 "The destination file path is outside of the Video Server's docroot. The file "
 "will not be readable by the Video Server. Do you still want to continue?"
 msgstr ""
 
-#: utils_videotl.cc:64
+#: utils_videotl.cc:67
 msgid "Continue"
 msgstr ""
 
-#: utils_videotl.cc:70
+#: utils_videotl.cc:74
 msgid "Confirm Overwrite"
 msgstr ""
 
-#: utils_videotl.cc:71
-msgid "A file with the same name already exists.  Do you want to overwrite it?"
-msgstr ""
-
-#: utils_videotl.cc:81 utils_videotl.cc:97
+#: utils_videotl.cc:84 utils_videotl.cc:100
 msgid "Cannot create video folder \"%1\" (%2)"
 msgstr ""
 
-#: export_video_dialog.cc:71
+#: export_video_dialog.cc:67
 msgid "Export Video File "
 msgstr ""
 
-#: export_video_dialog.cc:82
+#: export_video_dialog.cc:78
 msgid "Video:"
 msgstr ""
 
-#: export_video_dialog.cc:87
+#: export_video_dialog.cc:83
 msgid "Scale Video (W x H):"
 msgstr ""
 
-#: export_video_dialog.cc:88
+#: export_video_dialog.cc:84
 msgid "Retain Aspect"
 msgstr ""
 
-#: export_video_dialog.cc:93
+#: export_video_dialog.cc:89
 msgid "Set Aspect Ratio:"
 msgstr ""
 
-#: export_video_dialog.cc:94
+#: export_video_dialog.cc:90
 msgid "Normalize Audio"
 msgstr ""
 
-#: export_video_dialog.cc:95
+#: export_video_dialog.cc:91
 msgid "2 Pass Encoding"
 msgstr ""
 
-#: export_video_dialog.cc:96
+#: export_video_dialog.cc:92
 msgid "Codec Optimizations:"
 msgstr ""
 
-#: export_video_dialog.cc:98
+#: export_video_dialog.cc:94
 msgid "Deinterlace"
 msgstr ""
 
-#: export_video_dialog.cc:99
+#: export_video_dialog.cc:95
 msgid "Use [2] B-frames (MPEG 2 or 4 only)"
 msgstr ""
 
-#: export_video_dialog.cc:100
+#: export_video_dialog.cc:96
 msgid "Override FPS (Default is to retain FPS from the input video file):"
 msgstr ""
 
-#: export_video_dialog.cc:101
+#: export_video_dialog.cc:97
 msgid "Include Session Metadata"
 msgstr ""
 
-#: export_video_dialog.cc:119
+#: export_video_dialog.cc:115
 msgid ""
-"No ffprobe or ffmpeg executables could be found on this system. Video Export "
-"is not possible until you install those tools. See the Log window for more "
-"information."
+"ffmpeg installation was not found. Video Export is not possible. See the Log "
+"window for more information."
 msgstr ""
 
-#: export_video_dialog.cc:130
+#: export_video_dialog.cc:126
 msgid "<b>Output:</b> (file extension defines format)"
 msgstr ""
 
-#: export_video_dialog.cc:140
+#: export_video_dialog.cc:136
 msgid "<b>Input Video:</b>"
 msgstr ""
 
-#: export_video_dialog.cc:151
+#: export_video_dialog.cc:147
 msgid "Audio:"
 msgstr ""
 
-#: export_video_dialog.cc:153
+#: export_video_dialog.cc:149
 msgid "Master Bus"
 msgstr ""
 
-#: export_video_dialog.cc:158
+#: export_video_dialog.cc:153
 msgid "from the %1 session's start to the session's end"
 msgstr ""
 
-#: export_video_dialog.cc:161
+#: export_video_dialog.cc:156
 msgid "<b>Settings:</b>"
 msgstr ""
 
-#: export_video_dialog.cc:169
+#: export_video_dialog.cc:164
 msgid "Range:"
 msgstr ""
 
-#: export_video_dialog.cc:172
-msgid "Preset:"
-msgstr ""
-
-#: export_video_dialog.cc:175
+#: export_video_dialog.cc:170
 msgid "Video Codec:"
 msgstr ""
 
-#: export_video_dialog.cc:178
+#: export_video_dialog.cc:173
 msgid "Video KBit/s:"
 msgstr ""
 
-#: export_video_dialog.cc:181
+#: export_video_dialog.cc:176
 msgid "Audio Codec:"
 msgstr ""
 
-#: export_video_dialog.cc:184
+#: export_video_dialog.cc:179
 msgid "Audio KBit/s:"
 msgstr ""
 
-#: export_video_dialog.cc:187
+#: export_video_dialog.cc:182
 msgid "Audio Samplerate:"
 msgstr ""
 
-#: export_video_dialog.cc:222 export_video_dialog.cc:231
-#: export_video_dialog.cc:830 export_video_dialog.cc:833
+#: export_video_dialog.cc:215 export_video_dialog.cc:223
+#: export_video_dialog.cc:814 export_video_dialog.cc:817
 msgid "(default for format)"
 msgstr ""
 
-#: export_video_dialog.cc:242 export_video_dialog.cc:255
-#: export_video_dialog.cc:837 export_video_dialog.cc:846
+#: export_video_dialog.cc:233 export_video_dialog.cc:244
+#: export_video_dialog.cc:821 export_video_dialog.cc:830
 msgid "(default)"
 msgstr ""
 
-#: export_video_dialog.cc:256 export_video_dialog.cc:840
+#: export_video_dialog.cc:245 export_video_dialog.cc:824
 msgid "(retain)"
 msgstr ""
 
-#: export_video_dialog.cc:348
+#: export_video_dialog.cc:335
 msgid "from 00:00:00:00 to the video's end"
 msgstr ""
 
-#: export_video_dialog.cc:350
+#: export_video_dialog.cc:337
 msgid "from the video's start to the video's end"
 msgstr ""
 
-#: export_video_dialog.cc:353
+#: export_video_dialog.cc:340
 msgid "Selected range"
 msgstr ""
 
-#: export_video_dialog.cc:589
+#: export_video_dialog.cc:561
 msgid "Normalizing audio"
 msgstr ""
 
-#: export_video_dialog.cc:593
+#: export_video_dialog.cc:566 export_video_dialog.cc:571
 msgid "Exporting audio"
 msgstr ""
 
-#: export_video_dialog.cc:648
+#: export_video_dialog.cc:632
 msgid "Exporting Audio..."
 msgstr ""
 
-#: export_video_dialog.cc:705
+#: export_video_dialog.cc:689
 msgid ""
 "Export Video: Cannot query duration of video-file, using duration from "
 "timeline instead."
 msgstr ""
 
-#: export_video_dialog.cc:735
+#: export_video_dialog.cc:719
 msgid "Export Video: export-range does not include video."
 msgstr ""
 
-#: export_video_dialog.cc:748
+#: export_video_dialog.cc:732
 msgid "Export Video: No Master Out Ports to Connect for Audio Export"
 msgstr ""
 
-#: export_video_dialog.cc:790
+#: export_video_dialog.cc:774
 msgid "Encoding Video..."
 msgstr ""
 
-#: export_video_dialog.cc:810
+#: export_video_dialog.cc:794
 msgid "Export Video: Video input file cannot be read."
 msgstr ""
 
-#: export_video_dialog.cc:916
+#: export_video_dialog.cc:900
 msgid "Encoding Video.. Pass 1/2"
 msgstr ""
 
-#: export_video_dialog.cc:928
+#: export_video_dialog.cc:912
 msgid "Encoding Video.. Pass 2/2"
 msgstr ""
 
-#: export_video_dialog.cc:1031
+#: export_video_dialog.cc:1015
 msgid "Transcoding failed."
 msgstr ""
 
-#: export_video_dialog.cc:1267 export_video_dialog.cc:1287
+#: export_video_dialog.cc:1251 export_video_dialog.cc:1271
 msgid "Save Exported Video File"
 msgstr ""
 
@@ -12789,13 +14926,22 @@ msgstr ""
 
 #: export_video_infobox.cc:51
 msgid ""
+"%1 does not include commercial licenses for encoding audio/video. Visit "
+"mpegla.com for information about licensing various audio/video codecs.\n"
+"\n"
 "Video encoding is a non-trivial task with many details.\n"
 "\n"
-"Please see the manual at %1/video-timeline/operations/#export.\n"
+"Please see the manual at %2/video-timeline/operations/#export.\n"
 "\n"
 "Open Manual in Browser? "
 msgstr ""
 
+#~ msgid "Locations"
+#~ msgstr "Localizações"
+
+#~ msgid "Update available plugins"
+#~ msgstr "Atualizar plugins disponíveis"
+
 #~ msgid "Split"
 #~ msgstr "Separar"
 
diff --git a/gtk2_ardour/po/pt_PT.mo b/gtk2_ardour/po/pt_PT.mo
new file mode 100644
index 0000000..15c695d
Binary files /dev/null and b/gtk2_ardour/po/pt_PT.mo differ
diff --git a/gtk2_ardour/po/pt_PT.po b/gtk2_ardour/po/pt_PT.po
index 52bb55a..9703792 100644
--- a/gtk2_ardour/po/pt_PT.po
+++ b/gtk2_ardour/po/pt_PT.po
@@ -7,264 +7,296 @@ msgid ""
 msgstr ""
 "Project-Id-Version: gtk2_ardour rev.1702\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-03-31 20:13-0400\n"
+"POT-Creation-Date: 2016-07-14 06:20-0400\n"
 "PO-Revision-Date: 2007-04-15 19:00+0100\n"
 "Last-Translator: Rui Nuno Capela <rncbc at rncbc.org>\n"
 "Language-Team: Portuguese\n"
-"Language: \n"
+"Language: Portuguese\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: about.cc:125
+#: about.cc:127
+msgid "Fons Adriaensen"
+msgstr ""
+
+#: about.cc:128
 msgid "Brian Ahr"
 msgstr ""
 
-#: about.cc:126
+#: about.cc:129
 msgid "John Anderson"
 msgstr ""
 
-#: about.cc:127
+#: about.cc:130
 msgid "Marcus Andersson"
 msgstr ""
 
-#: about.cc:128
+#: about.cc:131
 msgid "Nedko Arnaudov"
 msgstr ""
 
-#: about.cc:129
+#: about.cc:132
 msgid "Hans Baier"
 msgstr ""
 
-#: about.cc:130
+#: about.cc:133
 msgid "Ben Bell"
 msgstr ""
 
-#: about.cc:131
+#: about.cc:134
 msgid "Sakari Bergen"
 msgstr ""
 
-#: about.cc:132
+#: about.cc:135
 msgid "Christian Borss"
 msgstr ""
 
-#: about.cc:133
+#: about.cc:136
 msgid "Chris Cannam"
 msgstr ""
 
-#: about.cc:134
+#: about.cc:137
 msgid "Jeremy Carter"
 msgstr ""
 
-#: about.cc:135
+#: about.cc:138
 msgid "Jesse Chappell"
 msgstr ""
 
-#: about.cc:136
+#: about.cc:139
 msgid "Thomas Charbonnel"
 msgstr ""
 
-#: about.cc:137
+#: about.cc:140
 msgid "Sam Chessman"
 msgstr ""
 
-#: about.cc:138
+#: about.cc:141
 msgid "André Colomb"
 msgstr ""
 
-#: about.cc:139
+#: about.cc:142
 msgid "Paul Davis"
 msgstr ""
 
-#: about.cc:140
+#: about.cc:143
 msgid "Gerard van Dongen"
 msgstr ""
 
-#: about.cc:141
+#: about.cc:144
 msgid "John Emmas"
 msgstr ""
 
-#: about.cc:142
+#: about.cc:145
 msgid "Colin Fletcher"
 msgstr ""
 
-#: about.cc:143
+#: about.cc:146
 msgid "Dave Flick"
 msgstr ""
 
-#: about.cc:144
+#: about.cc:147
 msgid "Hans Fugal"
 msgstr ""
 
-#: about.cc:145
+#: about.cc:148
 msgid "Robin Gareus"
 msgstr ""
 
-#: about.cc:146
+#: about.cc:149
+msgid "Nil Geisweiller"
+msgstr ""
+
+#: about.cc:150
 msgid "Christopher George"
 msgstr ""
 
-#: about.cc:147
+#: about.cc:151
 msgid "Chris Goddard"
 msgstr ""
 
-#: about.cc:148
+#: about.cc:152
 msgid "J. Abelardo Gutierrez"
 msgstr ""
 
-#: about.cc:149
+#: about.cc:153
 msgid "Jeremy Hall"
 msgstr ""
 
-#: about.cc:150
+#: about.cc:154
 msgid "Audun Halland"
 msgstr ""
 
-#: about.cc:151
+#: about.cc:155
 msgid "David Halter"
 msgstr ""
 
-#: about.cc:152
+#: about.cc:156
 msgid "Steve Harris"
 msgstr ""
 
-#: about.cc:153
+#: about.cc:157
 msgid "Melvin Ray Herr"
 msgstr ""
 
-#: about.cc:154
+#: about.cc:158
 msgid "Carl Hetherington"
 msgstr ""
 
-#: about.cc:155
+#: about.cc:159
 msgid "Rob Holland"
 msgstr ""
 
-#: about.cc:156
+#: about.cc:160
 msgid "Robert Jordens"
 msgstr ""
 
-#: about.cc:157
+#: about.cc:161
 msgid "Stefan Kersten"
 msgstr ""
 
-#: about.cc:158
+#: about.cc:162
 msgid "Armand Klenk"
 msgstr ""
 
-#: about.cc:159
+#: about.cc:163
 msgid "Julien de Kozak"
 msgstr ""
 
-#: about.cc:160
+#: about.cc:164
 msgid "Matt Krai"
 msgstr ""
 
-#: about.cc:161
+#: about.cc:165
 msgid "Georg Krause"
 msgstr ""
 
-#: about.cc:162
+#: about.cc:166
 msgid "Nick Lanham"
 msgstr ""
 
-#: about.cc:163
+#: about.cc:167
 msgid "Colin Law"
 msgstr ""
 
-#: about.cc:164
+#: about.cc:168
 msgid "Joshua Leach"
 msgstr ""
 
-#: about.cc:165
+#: about.cc:169
 msgid "Ben Loftis"
 msgstr ""
 
-#: about.cc:166
+#: about.cc:170
 msgid "Nick Mainsbridge"
 msgstr ""
 
-#: about.cc:167
+#: about.cc:171
 msgid "Tim Mayberry"
 msgstr ""
 
-#: about.cc:168
+#: about.cc:172
 msgid "Doug Mclain"
 msgstr ""
 
-#: about.cc:169
+#: about.cc:173
 msgid "Todd Naugle"
 msgstr ""
 
-#: about.cc:170
+#: about.cc:174
+msgid "André Nusser"
+msgstr ""
+
+#: about.cc:175
+msgid "Bent Bisballe Nyeng"
+msgstr ""
+
+#: about.cc:176
 msgid "Jack O'Quin"
 msgstr ""
 
-#: about.cc:171
+#: about.cc:177
+msgid "Pavel Potocek"
+msgstr ""
+
+#: about.cc:178
 msgid "Nimal Ratnayake"
 msgstr ""
 
-#: about.cc:172
+#: about.cc:179
+msgid "Julien Rivaud"
+msgstr ""
+
+#: about.cc:180
 msgid "David Robillard"
 msgstr ""
 
-#: about.cc:173
+#: about.cc:181
+msgid "Julien Roger"
+msgstr ""
+
+#: about.cc:182
 msgid "Taybin Rutkin"
 msgstr ""
 
-#: about.cc:174
+#: about.cc:183
 msgid "Andreas Ruge"
 msgstr ""
 
-#: about.cc:175
+#: about.cc:184
 msgid "Sampo Savolainen"
 msgstr ""
 
-#: about.cc:176
+#: about.cc:185
 msgid "Rodrigo Severo"
 msgstr ""
 
-#: about.cc:177
+#: about.cc:186
 msgid "Per Sigmond"
 msgstr ""
 
-#: about.cc:178
+#: about.cc:187
 msgid "Lincoln Spiteri"
 msgstr ""
 
-#: about.cc:179
+#: about.cc:188
 msgid "Mike Start"
 msgstr ""
 
-#: about.cc:180
+#: about.cc:189
 msgid "Mark Stewart"
 msgstr ""
 
-#: about.cc:181
+#: about.cc:190
 msgid "Roland Stigge"
 msgstr ""
 
-#: about.cc:182
+#: about.cc:191
 msgid "Petter Sundlöf"
 msgstr ""
 
-#: about.cc:183
+#: about.cc:192
 msgid "Mike Täht"
 msgstr ""
 
-#: about.cc:184
+#: about.cc:193
 msgid "Roy Vegard"
 msgstr ""
 
-#: about.cc:185
+#: about.cc:194
 msgid "Thorsten Wilms"
 msgstr ""
 
-#: about.cc:186
+#: about.cc:195
+msgid "Damien Zammit"
+msgstr ""
+
+#: about.cc:196
 msgid "Grygorii Zharun"
 msgstr ""
 
-#: about.cc:191
+#: about.cc:201
 msgid ""
 "French:\n"
 "\tAlain Fréhel <alain.frehel at free.fr>\n"
@@ -273,7 +305,7 @@ msgid ""
 "\tRomain Arnaud <roming22 at gmail.com>\n"
 msgstr ""
 
-#: about.cc:192
+#: about.cc:202
 msgid ""
 "German:\n"
 "\tKarsten Petersen <kapet at kapet.de>\n"
@@ -285,210 +317,264 @@ msgid ""
 "\tRobin Gloster <robin at loc-com.de>\n"
 msgstr ""
 
-#: about.cc:199
+#: about.cc:209
 msgid ""
 "Italian:\n"
 "\tFilippo Pappalardo <filippo at email.it>\n"
 "\tRaffaele Morelli <raffaele.morelli at gmail.com>\n"
 msgstr ""
 
-#: about.cc:200
+#: about.cc:210
 msgid ""
 "Portuguese:\n"
 "\tRui Nuno Capela <rncbc at rncbc.org>\n"
 msgstr ""
 
-#: about.cc:201
+#: about.cc:211
 msgid ""
 "Brazilian Portuguese:\n"
 "\tAlexander da Franca Fernandes <alexander at nautae.eti.br>\n"
 "\tChris Ross <chris at tebibyte.org>\n"
 msgstr ""
 
-#: about.cc:203
+#: about.cc:213
 msgid ""
 "Spanish:\n"
 "\t Alex Krohn <alexkrohn at fastmail.fm>\n"
 "\tPablo Fernández <pablo.fbus at gmail.com>\n"
 msgstr ""
 
-#: about.cc:204
+#: about.cc:214
 msgid ""
 "Russian:\n"
 "\t Igor Blinov <pitstop at nm.ru>\n"
 "\tAlexandre Prokoudine <alexandre.prokoudine at gmail.com>\n"
 msgstr ""
 
-#: about.cc:206
+#: about.cc:216
 msgid ""
 "Greek:\n"
 "\t Klearchos Gourgourinis <muadib at in.gr>\n"
 msgstr ""
 
-#: about.cc:207
+#: about.cc:217
 msgid ""
 "Swedish:\n"
 "\t Petter Sundlöf <petter.sundlof at gmail.com>\n"
 msgstr ""
 
-#: about.cc:208
+#: about.cc:218
 msgid ""
 "Polish:\n"
 "\t Piotr Zaryk <pzaryk at gmail.com>\n"
 msgstr ""
 
-#: about.cc:209
+#: about.cc:219
 msgid ""
 "Czech:\n"
 "\t Pavel Fric <pavelfric at seznam.cz>\n"
 msgstr ""
 
-#: about.cc:210
+#: about.cc:220
 msgid ""
 "Norwegian:\n"
 "\t Eivind Ødegård\n"
 msgstr ""
 
-#: about.cc:211
+#: about.cc:221
 msgid ""
 "Chinese:\n"
 "\t Rui-huai Zhang <zrhzrh at mail.ustc.edu.cn>\n"
 msgstr ""
 
-#: about.cc:591
+#: about.cc:601
+msgid "Intel 64-bit"
+msgstr ""
+
+#: about.cc:603
+msgid "Intel 32-bit"
+msgstr ""
+
+#: about.cc:605
+msgid "PowerPC 64-bit"
+msgstr ""
+
+#: about.cc:607
+msgid "PowerPC 32-bit"
+msgstr ""
+
+#: about.cc:609
+msgid "64-bit"
+msgstr ""
+
+#: about.cc:611
+msgid "32-bit"
+msgstr ""
+
+#: about.cc:619
+msgid " - debug"
+msgstr ""
+
+#: about.cc:625
 msgid "Copyright (C) 1999-2015 Paul Davis\n"
 msgstr ""
 
-#: about.cc:595
+#: about.cc:629
 msgid "http://ardour.org/"
 msgstr ""
 
-#: about.cc:596
+#: about.cc:630
 msgid ""
 "%1%2\n"
-"(built from revision %3)"
+"(rev %3)\n"
+"%4%5"
 msgstr ""
 
-#: about.cc:600
+#: about.cc:635
 msgid "Config"
 msgstr ""
 
-#: actions.cc:85
+#: actions.cc:83
 msgid "Loading menus from %1"
 msgstr ""
 
-#: actions.cc:88 actions.cc:89
+#: actions.cc:86 actions.cc:87
 msgid "badly formatted menu definition file: %1"
 msgstr ""
 
-#: actions.cc:91
+#: actions.cc:89
 msgid "%1 menu definition file not found"
 msgstr ""
 
-#: actions.cc:95 actions.cc:96
+#: actions.cc:93 actions.cc:94
 msgid "%1 will not work without a valid menu definition file"
 msgstr ""
 
-#: add_route_dialog.cc:54 route_params_ui.cc:524
-msgid "Add Track or Bus"
+#: add_route_dialog.cc:58
+msgid "Add Track/Bus/VCA"
 msgstr ""
 
-#: add_route_dialog.cc:57
+#: add_route_dialog.cc:61
 msgid "Configuration:"
 msgstr ""
 
-#: add_route_dialog.cc:58
+#: add_route_dialog.cc:62
 msgid "Record Mode:"
 msgstr ""
 
-#: add_route_dialog.cc:59
+#: add_route_dialog.cc:63
 msgid "Instrument:"
 msgstr ""
 
-#: add_route_dialog.cc:77
+#: add_route_dialog.cc:77 add_route_dialog.cc:228
 msgid "Audio Tracks"
 msgstr ""
 
-#: add_route_dialog.cc:78 add_route_dialog.cc:209
+#: add_route_dialog.cc:78 add_route_dialog.cc:224
 msgid "MIDI Tracks"
 msgstr ""
 
-#: add_route_dialog.cc:79 add_route_dialog.cc:211
+#: add_route_dialog.cc:79 add_route_dialog.cc:226
 msgid "Audio+MIDI Tracks"
 msgstr ""
 
-#: add_route_dialog.cc:80 add_route_dialog.cc:207
-msgid "Busses"
+#: add_route_dialog.cc:80 add_route_dialog.cc:220
+msgid "Audio Busses"
+msgstr ""
+
+#: add_route_dialog.cc:81 add_route_dialog.cc:222
+msgid "MIDI Busses"
+msgstr ""
+
+#: add_route_dialog.cc:82
+msgid "VCA Masters"
 msgstr ""
 
-#: add_route_dialog.cc:83 add_route_dialog.cc:559
+#: add_route_dialog.cc:85 add_route_dialog.cc:622
 msgid "First"
 msgstr ""
 
-#: add_route_dialog.cc:84 add_route_dialog.cc:561
-msgid "After Editor Selection"
+#: add_route_dialog.cc:86 add_route_dialog.cc:626
+msgid "Before Selection"
 msgstr ""
 
-#: add_route_dialog.cc:85 add_route_dialog.cc:563
-msgid "After Mixer Selection"
+#: add_route_dialog.cc:87 add_route_dialog.cc:624
+msgid "After Selection"
 msgstr ""
 
-#: add_route_dialog.cc:86
+#: add_route_dialog.cc:88
 msgid "Last"
 msgstr ""
 
-#: add_route_dialog.cc:103
+#: add_route_dialog.cc:91
+msgid "Flexible-I/O"
+msgstr ""
+
+#: add_route_dialog.cc:92
+msgid "Strict-I/O"
+msgstr ""
+
+#: add_route_dialog.cc:108
 msgid "Add:"
 msgstr ""
 
-#: add_route_dialog.cc:116 time_fx_dialog.cc:91 add_video_dialog.cc:135
-#: video_server_dialog.cc:121
+#: add_route_dialog.cc:121 time_fx_dialog.cc:101 add_video_dialog.cc:135
+#: video_server_dialog.cc:118
 msgid "<b>Options</b>"
 msgstr ""
 
-#: add_route_dialog.cc:126 bundle_manager.cc:193 region_editor.cc:50
-#: route_group_dialog.cc:71
+#: add_route_dialog.cc:131 bundle_manager.cc:193 region_editor.cc:52
+#: route_group_dialog.cc:70
 msgid "Name:"
 msgstr ""
 
-#: add_route_dialog.cc:156
+#: add_route_dialog.cc:155
 msgid "Group:"
 msgstr ""
 
-#: add_route_dialog.cc:162
+#: add_route_dialog.cc:161
 msgid "Insert:"
 msgstr ""
 
-#: add_route_dialog.cc:223 add_route_dialog.cc:232 add_route_dialog.cc:306
-#: ardour_ui_ed.cc:539 engine_dialog.cc:237 rc_option_editor.cc:1805
-#: rc_option_editor.cc:1807 rc_option_editor.cc:1809 rc_option_editor.cc:1827
-#: rc_option_editor.cc:1829 rc_option_editor.cc:1837 rc_option_editor.cc:1839
-#: rc_option_editor.cc:1857 rc_option_editor.cc:1870 rc_option_editor.cc:1872
-#: rc_option_editor.cc:1874 rc_option_editor.cc:1919 rc_option_editor.cc:1921
-#: rc_option_editor.cc:1923 rc_option_editor.cc:1931 rc_option_editor.cc:1939
-#: rc_option_editor.cc:1941 rc_option_editor.cc:1949
+#: add_route_dialog.cc:171
+msgid "Output Ports:"
+msgstr ""
+
+#: add_route_dialog.cc:176 rc_option_editor.cc:2474
+msgid ""
+"With strict-i/o enabled, Effect Processors will not modify the number of "
+"channels on a track. The number of output channels will always match the "
+"number of input channels."
+msgstr ""
+
+#: add_route_dialog.cc:240 add_route_dialog.cc:351 ardour_ui_ed.cc:636
+#: engine_dialog.cc:244 plugin_pin_dialog.cc:67 rc_option_editor.cc:2397
+#: rc_option_editor.cc:2399 rc_option_editor.cc:2401 rc_option_editor.cc:2419
+#: rc_option_editor.cc:2421 rc_option_editor.cc:2429 rc_option_editor.cc:2432
+#: rc_option_editor.cc:2450 rc_option_editor.cc:2463 rc_option_editor.cc:2472
+#: rc_option_editor.cc:2478 rc_option_editor.cc:2480 rc_option_editor.cc:2525
+#: rc_option_editor.cc:2527 rc_option_editor.cc:2529 rc_option_editor.cc:2537
 msgid "Audio"
 msgstr ""
 
-#: add_route_dialog.cc:224 add_route_dialog.cc:235 add_route_dialog.cc:307
-#: editor_actions.cc:109 engine_dialog.cc:239 missing_file_dialog.cc:56
-#: rc_option_editor.cc:2084 rc_option_editor.cc:2094 rc_option_editor.cc:2102
-#: rc_option_editor.cc:2110 rc_option_editor.cc:2119 rc_option_editor.cc:2127
-#: rc_option_editor.cc:2135 rc_option_editor.cc:2143 rc_option_editor.cc:2152
-#: rc_option_editor.cc:2161 rc_option_editor.cc:2170 rc_option_editor.cc:2178
-#: rc_option_editor.cc:2186 rc_option_editor.cc:2194 rc_option_editor.cc:2217
+#: add_route_dialog.cc:243 add_route_dialog.cc:352 editor_actions.cc:112
+#: engine_dialog.cc:246 missing_file_dialog.cc:60 mixer_ui.cc:1895
+#: plugin_pin_dialog.cc:68 rc_option_editor.cc:2672 rc_option_editor.cc:2674
+#: rc_option_editor.cc:2684 rc_option_editor.cc:2693 rc_option_editor.cc:2701
+#: rc_option_editor.cc:2709 rc_option_editor.cc:2717 rc_option_editor.cc:2790
+#: rc_option_editor.cc:2813
 msgid "MIDI"
 msgstr ""
 
-#: add_route_dialog.cc:225 add_route_dialog.cc:238 add_route_dialog.cc:308
+#: add_route_dialog.cc:246 add_route_dialog.cc:353
 msgid "Audio+MIDI"
 msgstr ""
 
-#: add_route_dialog.cc:226 add_route_dialog.cc:241 add_route_dialog.cc:309
+#: add_route_dialog.cc:250 add_route_dialog.cc:354
 msgid "Bus"
 msgstr ""
 
-#: add_route_dialog.cc:268
+#: add_route_dialog.cc:286
 msgid ""
 "Audio+MIDI tracks are intended for use <b>ONLY</b> with plugins that use "
 "both audio and MIDI input data\n"
@@ -497,60 +583,61 @@ msgid ""
 "track instead."
 msgstr ""
 
-#: add_route_dialog.cc:327 add_route_dialog.cc:346 editor_actions.cc:422
-#: editor_rulers.cc:251 time_axis_view.cc:1374
+#: add_route_dialog.cc:373 add_route_dialog.cc:385 editor_actions.cc:456
+#: editor_rulers.cc:250 time_axis_view.cc:1290
 msgid "Normal"
 msgstr "Normal"
 
-#: add_route_dialog.cc:330 add_route_dialog.cc:348
+#: add_route_dialog.cc:374 add_route_dialog.cc:387
 msgid "Non Layered"
 msgstr ""
 
-#: add_route_dialog.cc:331 add_route_dialog.cc:350
+#: add_route_dialog.cc:375 add_route_dialog.cc:389
 msgid "Tape"
 msgstr "Fita"
 
-#: add_route_dialog.cc:431 monitor_section.cc:290
+#: add_route_dialog.cc:476 monitor_section.cc:273 plugin_pin_dialog.cc:509
+#: plugin_setup_dialog.cc:202
 msgid "Mono"
 msgstr ""
 
-#: add_route_dialog.cc:435
+#: add_route_dialog.cc:480 plugin_pin_dialog.cc:512 plugin_setup_dialog.cc:205
 msgid "Stereo"
 msgstr ""
 
-#: add_route_dialog.cc:459
+#: add_route_dialog.cc:503
 msgid "3 Channel"
 msgstr ""
 
-#: add_route_dialog.cc:463
+#: add_route_dialog.cc:507
 msgid "4 Channel"
 msgstr ""
 
-#: add_route_dialog.cc:467
+#: add_route_dialog.cc:511
 msgid "5 Channel"
 msgstr ""
 
-#: add_route_dialog.cc:471
+#: add_route_dialog.cc:515
 msgid "6 Channel"
 msgstr ""
 
-#: add_route_dialog.cc:475
+#: add_route_dialog.cc:519
 msgid "8 Channel"
 msgstr ""
 
-#: add_route_dialog.cc:479
+#: add_route_dialog.cc:523
 msgid "12 Channel"
 msgstr ""
 
-#: add_route_dialog.cc:483 mixer_strip.cc:1836 mixer_strip.cc:2244
+#: add_route_dialog.cc:527 mixer_strip.cc:2009 mixer_strip.cc:2455
 msgid "Custom"
 msgstr ""
 
-#: add_route_dialog.cc:516 add_route_dialog.cc:532 route_group_menu.cc:81
+#: add_route_dialog.cc:569 add_route_dialog.cc:585 route_group_menu.cc:85
 msgid "New Group..."
 msgstr ""
 
-#: add_route_dialog.cc:520 route_group_menu.cc:85
+#: add_route_dialog.cc:573 route_group_menu.cc:89
 msgid "No Group"
 msgstr ""
 
@@ -558,177 +645,215 @@ msgstr ""
 msgid "Ambiguous File"
 msgstr ""
 
-#: ambiguous_file_dialog.cc:35
+#: ambiguous_file_dialog.cc:37
 msgid ""
 "%1 has found the file <i>%2</i> in the following places:\n"
 "\n"
 msgstr ""
 
-#: ambiguous_file_dialog.cc:44
+#: ambiguous_file_dialog.cc:46
 msgid ""
 "\n"
 "\n"
 "Please select the path that you want to get the file from."
 msgstr ""
 
-#: ambiguous_file_dialog.cc:46 missing_file_dialog.cc:46
+#: ambiguous_file_dialog.cc:48 missing_file_dialog.cc:50
 msgid "Done"
 msgstr ""
 
-#: analysis_window.cc:46
+#: analysis_window.cc:45
 msgid "Signal source"
 msgstr ""
 
-#: analysis_window.cc:47
+#: analysis_window.cc:46
 msgid "Selected ranges"
 msgstr ""
 
-#: analysis_window.cc:48
+#: analysis_window.cc:47
 msgid "Selected regions"
 msgstr ""
 
-#: analysis_window.cc:50
-msgid "Display model"
-msgstr ""
-
-#: analysis_window.cc:51
-msgid "Composite graphs for each track"
-msgstr ""
-
-#: analysis_window.cc:52
-msgid "Composite graph of all tracks"
+#: analysis_window.cc:48
+msgid "Show frequency power range"
 msgstr ""
 
-#: analysis_window.cc:54
-msgid "Show frequency power range"
+#: analysis_window.cc:49
+msgid "Fit dB range"
 msgstr ""
 
-#: analysis_window.cc:55
-msgid "Normalize values"
+#: analysis_window.cc:50
+msgid "Proportional Spectrum, -18dB"
 msgstr ""
 
-#: analysis_window.cc:59
+#: analysis_window.cc:53
 msgid "FFT analysis window"
 msgstr ""
 
-#: analysis_window.cc:60 editor.cc:1823
+#: analysis_window.cc:54 editor.cc:1953
 msgid "Spectral Analysis"
 msgstr ""
 
-#: analysis_window.cc:67 editor_actions.cc:142 export_channel_selector.cc:557
-#: session_metadata_dialog.cc:667
+#: analysis_window.cc:61 editor_actions.cc:145 session_metadata_dialog.cc:670
 msgid "Track"
 msgstr "Faixa"
 
-#: analysis_window.cc:68 editor_actions.cc:648 mixer_ui.cc:131
-#: mixer_ui.cc:1854
+#: analysis_window.cc:62 ardour_ui_ed.cc:254 ardour_ui_ed.cc:255
+#: ardour_ui_ed.cc:256 editor_actions.cc:689 mixer_ui.cc:151 mixer_ui.cc:2134
 msgid "Show"
 msgstr ""
 
-#: analysis_window.cc:135
+#: analysis_window.cc:107
 msgid "Re-analyze data"
 msgstr ""
 
-#: ardour_button.cc:887
+#: ardour_button.cc:876
 msgid "button cannot watch state of non-existing Controllable\n"
 msgstr ""
 
-#: ardour_button.cc:1155
+#: ardour_button.cc:1144
 msgid "ABCDEFGHIJLKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
 msgstr ""
 
-#: ardour_ui.cc:164
+#: ardour_ui.cc:198
 msgid ""
 "%1 %2.x has discovered configuration files from %1 %3.x.\n"
 "\n"
-"Would you like to copy the relevant files before starting to use the "
-"program?\n"
+"Would you like these files to be copied and used for %1 %2.x?\n"
 "\n"
 "(This will require you to restart %1.)"
 msgstr ""
 
-#: ardour_ui.cc:211 editor_actions.cc:642 region_editor.cc:51
+#: ardour_ui.cc:283 editor_actions.cc:683 region_editor.cc:53
 msgid "Audition"
 msgstr "Audição"
 
-#: ardour_ui.cc:212 editor_actions.cc:136 mixer_strip.cc:2016
-#: rc_option_editor.cc:1959 route_time_axis.cc:252 route_time_axis.cc:2711
+#: ardour_ui.cc:284 editor_actions.cc:139 mixer_strip.cc:2205
+#: monitor_section.cc:329 rc_option_editor.cc:2547 route_time_axis.cc:263
+#: route_time_axis.cc:2740 vca_master_strip.cc:212 vca_time_axis.cc:237
 msgid "Solo"
 msgstr ""
 
-#: ardour_ui.cc:213 rc_option_editor.cc:741
+#: ardour_ui.cc:285 rc_option_editor.cc:1357
 msgid "Feedback"
 msgstr ""
 
-#: ardour_ui.cc:219 speaker_dialog.cc:36
+#: ardour_ui.cc:296 speaker_dialog.cc:36
 msgid "Speaker Configuration"
 msgstr ""
 
-#: ardour_ui.cc:220 keyeditor.cc:53
-msgid "Key Bindings"
-msgstr ""
-
-#: ardour_ui.cc:221
-msgid "Preferences"
-msgstr ""
-
-#: ardour_ui.cc:222 ardour_ui.cc:229
+#: ardour_ui.cc:297
 msgid "Add Tracks/Busses"
 msgstr ""
 
-#: ardour_ui.cc:223
+#: ardour_ui.cc:298
 msgid "About"
 msgstr "Acerca de"
 
-#: ardour_ui.cc:224 location_ui.cc:1141 session_option_editor.cc:189
-#: session_option_editor.cc:195 session_option_editor.cc:202
-msgid "Locations"
-msgstr "Localizações"
+#: ardour_ui.cc:299 location_ui.cc:1167
+msgid "Ranges|Locations"
+msgstr ""
 
-#: ardour_ui.cc:225 route_params_ui.cc:59 route_params_ui.cc:630
+#: ardour_ui.cc:300 route_params_ui.cc:59 route_params_ui.cc:620
 msgid "Tracks and Busses"
 msgstr ""
 
-#: ardour_ui.cc:226 engine_dialog.cc:70
+#: ardour_ui.cc:301 engine_dialog.cc:73
 msgid "Audio/MIDI Setup"
 msgstr ""
 
-#: ardour_ui.cc:227
+#: ardour_ui.cc:302
 msgid "Video Export Dialog"
 msgstr ""
 
-#: ardour_ui.cc:228
+#: ardour_ui.cc:303 lua_script_manager.cc:30
+msgid "Script Manager"
+msgstr ""
+
+#: ardour_ui.cc:304
 msgid "Properties"
 msgstr ""
 
-#: ardour_ui.cc:230 bundle_manager.cc:264
+#: ardour_ui.cc:305
+msgid "Add Video"
+msgstr ""
+
+#: ardour_ui.cc:306 bundle_manager.cc:264
 msgid "Bundle Manager"
 msgstr ""
 
-#: ardour_ui.cc:231 big_clock_window.cc:37
+#: ardour_ui.cc:307 big_clock_window.cc:37
 msgid "Big Clock"
 msgstr "Cronómetro principal"
 
-#: ardour_ui.cc:232
+#: ardour_ui.cc:308
 msgid "Audio Connections"
 msgstr ""
 
-#: ardour_ui.cc:233
+#: ardour_ui.cc:309
 msgid "MIDI Connections"
 msgstr ""
 
-#: ardour_ui.cc:242
+#: ardour_ui.cc:310
+msgid "Bindings Editor"
+msgstr ""
+
+#: ardour_ui.cc:321 editor.cc:1288
+msgid "Window|Editor"
+msgstr ""
+
+#: ardour_ui.cc:322 mixer_ui.cc:2210 mixer_ui.cc:2216
+msgid "Window|Mixer"
+msgstr ""
+
+#: ardour_ui.cc:323
+msgid "Window|Preferences"
+msgstr ""
+
+#: ardour_ui.cc:330
 msgid "Your configuration files were copied. You can now restart %1."
 msgstr ""
 
-#: ardour_ui.cc:481
+#: ardour_ui.cc:509
+msgid "Pre-Release Warning"
+msgstr ""
+
+#: ardour_ui.cc:513
+msgid ""
+"<b>Welcome to this pre-release build of %1 %2</b>\n"
+"\n"
+"There are still several issues and bugs to be worked on,\n"
+"as well as general workflow improvements, before this can be considered\n"
+"release software. So, a few guidelines:\n"
+"\n"
+"1) Please do <b>NOT</b> use this software with the expectation that it is "
+"stable or reliable\n"
+"   though it may be so, depending on your workflow.\n"
+"2) Please wait for a helpful writeup of new features.\n"
+"3) <b>Please do NOT use the forums at ardour.org to report issues</b>.\n"
+"4) Please <b>DO</b> use the bugtracker at http://tracker.ardour.org/ to "
+"report issues\n"
+"   making sure to note the product version number as 5.0-pre.\n"
+"5) Please <b>DO</b> use the ardour-users mailing list to discuss ideas and "
+"pass on comments.\n"
+"6) Please <b>DO</b> join us on IRC for real time discussions about %1 %2. "
+"You\n"
+"   can get there directly from within the program via the Help->Chat menu "
+"option.\n"
+"\n"
+"Full information on all the above can be found on the support page at\n"
+"\n"
+"                http://ardour.org/support\n"
+msgstr ""
+
+#: ardour_ui.cc:613
 msgid ""
 "The audio backend was shutdown because:\n"
 "\n"
 "%1"
 msgstr ""
 
-#: ardour_ui.cc:483
+#: ardour_ui.cc:615
 msgid ""
 "The audio backend has either been shutdown or it\n"
 "disconnected %1 because %1\n"
@@ -736,45 +861,45 @@ msgid ""
 "the audio backend and save the session."
 msgstr ""
 
-#: ardour_ui.cc:507
+#: ardour_ui.cc:639
 msgid ""
 "Audio Unit Plugin Scan Failed. Automatic AU scanning has been disabled. "
 "Please see the log window for further details."
 msgstr ""
 
-#: ardour_ui.cc:508
+#: ardour_ui.cc:640
 msgid "Audio Unit Plugin Scan Failed:"
 msgstr ""
 
-#: ardour_ui.cc:827
+#: ardour_ui.cc:1008
 msgid "NSM server did not announce itself"
 msgstr ""
 
-#: ardour_ui.cc:840
+#: ardour_ui.cc:1021
 msgid "NSM: no client ID provided"
 msgstr ""
 
-#: ardour_ui.cc:847
+#: ardour_ui.cc:1028
 msgid "NSM: no session created"
 msgstr ""
 
-#: ardour_ui.cc:870
+#: ardour_ui.cc:1051
 msgid "NSM: initialization failed"
 msgstr ""
 
-#: ardour_ui.cc:900
+#: ardour_ui.cc:1083
 msgid "Free/Demo Version Warning"
 msgstr ""
 
-#: ardour_ui.cc:902
+#: ardour_ui.cc:1085
 msgid "Subscribe and support development of %1"
 msgstr ""
 
-#: ardour_ui.cc:903
+#: ardour_ui.cc:1086
 msgid "Don't warn me about this again"
 msgstr ""
 
-#: ardour_ui.cc:905
+#: ardour_ui.cc:1088
 msgid ""
 "<span weight=\"bold\" size=\"large\">%1</span>\n"
 "\n"
@@ -785,39 +910,39 @@ msgid ""
 "%4"
 msgstr ""
 
-#: ardour_ui.cc:906
+#: ardour_ui.cc:1089
 msgid "This is a free/demo version of %1"
 msgstr ""
 
-#: ardour_ui.cc:907
+#: ardour_ui.cc:1090
 msgid "It will not restore OR save any plugin settings"
 msgstr ""
 
-#: ardour_ui.cc:908
+#: ardour_ui.cc:1091
 msgid ""
 "If you load an existing session with plugin settings\n"
 "they will not be used and will be lost."
 msgstr ""
 
-#: ardour_ui.cc:910 plugin_ui.cc:569
+#: ardour_ui.cc:1093 plugin_ui.cc:579
 msgid ""
 "To get full access to updates without this limitation\n"
 "consider becoming a subscriber for a low cost every month."
 msgstr ""
 
-#: ardour_ui.cc:920
+#: ardour_ui.cc:1103
 msgid "Quit now"
 msgstr ""
 
-#: ardour_ui.cc:921
+#: ardour_ui.cc:1104
 msgid "Continue using %1"
 msgstr ""
 
-#: ardour_ui.cc:954 startup.cc:345
+#: ardour_ui.cc:1135 startup.cc:349
 msgid "%1 is ready for use"
 msgstr ""
 
-#: ardour_ui.cc:996
+#: ardour_ui.cc:1185
 msgid ""
 "WARNING: Your system has a limit for maximum amount of locked memory. This "
 "might cause %1 to run out of memory before your system runs out of memory. \n"
@@ -826,23 +951,23 @@ msgid ""
 "controlled by %2"
 msgstr ""
 
-#: ardour_ui.cc:1013
+#: ardour_ui.cc:1202
 msgid "Do not show this window again"
 msgstr ""
 
-#: ardour_ui.cc:1057
+#: ardour_ui.cc:1245
 msgid "Don't quit"
 msgstr ""
 
-#: ardour_ui.cc:1058
+#: ardour_ui.cc:1246
 msgid "Just quit"
 msgstr ""
 
-#: ardour_ui.cc:1059
+#: ardour_ui.cc:1247 ardour_ui.cc:5362
 msgid "Save and quit"
 msgstr ""
 
-#: ardour_ui.cc:1069
+#: ardour_ui.cc:1257
 msgid ""
 "%1 was unable to save your session.\n"
 "\n"
@@ -851,11 +976,11 @@ msgid ""
 "\"Just quit\" option."
 msgstr ""
 
-#: ardour_ui.cc:1119
+#: ardour_ui.cc:1307
 msgid "Unsaved Session"
 msgstr ""
 
-#: ardour_ui.cc:1140
+#: ardour_ui.cc:1328
 msgid ""
 "The session \"%1\"\n"
 "has not been saved.\n"
@@ -866,7 +991,7 @@ msgid ""
 "What do you want to do?"
 msgstr ""
 
-#: ardour_ui.cc:1143
+#: ardour_ui.cc:1331
 msgid ""
 "The snapshot \"%1\"\n"
 "has not been saved.\n"
@@ -877,74 +1002,107 @@ msgid ""
 "What do you want to do?"
 msgstr ""
 
-#: ardour_ui.cc:1157
+#: ardour_ui.cc:1345
 msgid "Prompter"
 msgstr "Alerta"
 
-#: ardour_ui.cc:1269 ardour_ui.cc:1277
+#: ardour_ui.cc:1459 ardour_ui.cc:1467
 msgid "Audio: <span foreground=\"red\">none</span>"
 msgstr ""
 
-#: ardour_ui.cc:1281
+#: ardour_ui.cc:1471
 #, c-format
 msgid "Audio: <span foreground=\"green\">%.1f kHz / %4.1f ms</span>"
 msgstr ""
 
-#: ardour_ui.cc:1285
+#: ardour_ui.cc:1475
 #, c-format
 msgid "Audio: <span foreground=\"green\">%<PRId64> kHz / %4.1f ms</span>"
 msgstr ""
 
-#: ardour_ui.cc:1303 export_video_dialog.cc:80
+#: ardour_ui.cc:1493 export_report.cc:108 export_report.cc:323
+#: export_video_dialog.cc:76
 msgid "File:"
 msgstr ""
 
-#: ardour_ui.cc:1307
+#: ardour_ui.cc:1497
 msgid "BWF"
 msgstr ""
 
-#: ardour_ui.cc:1310
+#: ardour_ui.cc:1500
 msgid "WAV"
 msgstr ""
 
-#: ardour_ui.cc:1313
+#: ardour_ui.cc:1503
 msgid "WAV64"
 msgstr ""
 
-#: ardour_ui.cc:1316 session_option_editor.cc:185
+#: ardour_ui.cc:1506 session_option_editor.cc:202
 msgid "CAF"
 msgstr ""
 
-#: ardour_ui.cc:1319
+#: ardour_ui.cc:1509
 msgid "AIFF"
 msgstr ""
 
-#: ardour_ui.cc:1322
+#: ardour_ui.cc:1512
 msgid "iXML"
 msgstr ""
 
-#: ardour_ui.cc:1325
+#: ardour_ui.cc:1515 session_option_editor.cc:203
 msgid "RF64"
 msgstr ""
 
-#: ardour_ui.cc:1333
+#: ardour_ui.cc:1518
+msgid "RF64/WAV"
+msgstr ""
+
+#: ardour_ui.cc:1521
+msgid "MBWF"
+msgstr ""
+
+#: ardour_ui.cc:1529
 msgid "32-float"
 msgstr ""
 
-#: ardour_ui.cc:1336
+#: ardour_ui.cc:1532
 msgid "24-int"
 msgstr ""
 
-#: ardour_ui.cc:1339
+#: ardour_ui.cc:1535
 msgid "16-int"
 msgstr ""
 
-#: ardour_ui.cc:1358
+#: ardour_ui.cc:1556
+#, c-format
+msgid "X: <span foreground=\"%s\">>10K</span>"
+msgstr ""
+
+#: ardour_ui.cc:1558
+#, c-format
+msgid "X: <span foreground=\"%s\">%u</span>"
+msgstr ""
+
+#: ardour_ui.cc:1561
+#, c-format
+msgid "X: <span foreground=\"%s\">?</span>"
+msgstr ""
+
+#: ardour_ui.cc:1564
+msgid "Audio dropouts. Shift+click to reset"
+msgstr ""
+
+#: ardour_ui.cc:1577
 #, c-format
 msgid "DSP: <span foreground=\"%s\">%5.1f%%</span>"
 msgstr ""
 
-#: ardour_ui.cc:1377
+#: ardour_ui.cc:1587
+#, c-format
+msgid "PkBld: <span foreground=\"%s\">%d</span>"
+msgstr ""
+
+#: ardour_ui.cc:1609
 #, c-format
 msgid ""
 "Buffers: <span foreground=\"green\">p:</span><span foreground=\"%s\">"
@@ -952,217 +1110,265 @@ msgid ""
 "\">%<PRIu32>%%</span>"
 msgstr ""
 
-#: ardour_ui.cc:1418
+#: ardour_ui.cc:1650
 msgid "Disk: <span foreground=\"green\">Unknown</span>"
 msgstr ""
 
-#: ardour_ui.cc:1420
+#: ardour_ui.cc:1652
 msgid "Disk: <span foreground=\"green\">24hrs+</span>"
 msgstr ""
 
-#: ardour_ui.cc:1438
+#: ardour_ui.cc:1670
 msgid "Disk: <span foreground=\"green\">>24 hrs</span>"
 msgstr ""
 
-#: ardour_ui.cc:1449
+#: ardour_ui.cc:1681
 #, c-format
 msgid "Disk: <span foreground=\"%s\">%02dh:%02dm:%02ds</span>"
 msgstr ""
 
-#: ardour_ui.cc:1475
+#: ardour_ui.cc:1707
 #, c-format
 msgid "Timecode|TC: <span foreground=\"%s\">%s</span>"
 msgstr ""
 
-#: ardour_ui.cc:1596 ardour_ui.cc:1605 session_dialog.cc:318
-#: session_dialog.cc:323
-msgid "Recent Sessions"
-msgstr "Sessões recentes"
-
-#: ardour_ui.cc:1684
+#: ardour_ui.cc:1789
 msgid ""
 "%1 is not connected to any audio backend.\n"
 "You cannot open or close sessions in this condition"
 msgstr ""
 
-#: ardour_ui.cc:1708
+#: ardour_ui.cc:1807
 msgid "Open Session"
 msgstr "Abrir sessão"
 
-#: ardour_ui.cc:1733 session_dialog.cc:349 session_import_dialog.cc:170
-#: session_metadata_dialog.cc:858
+#: ardour_ui.cc:1831 session_dialog.cc:410 session_import_dialog.cc:170
+#: session_metadata_dialog.cc:861
 msgid "%1 sessions"
 msgstr ""
 
-#: ardour_ui.cc:1770
+#: ardour_ui.cc:1879 ardour_ui.cc:1916
 msgid "You cannot add a track without a session already loaded."
 msgstr ""
 "Não é possível acrescentar uma faixa sem que haja uma sessão esteja "
 "carregada."
 
-#: ardour_ui.cc:1778
+#: ardour_ui.cc:1887
 msgid "could not create %1 new mixed track"
 msgid_plural "could not create %1 new mixed tracks"
 msgstr[0] ""
 msgstr[1] ""
 
-#: ardour_ui.cc:1784 ardour_ui.cc:1845
-msgid ""
-"There are insufficient ports available\n"
-"to create a new track or bus.\n"
-"You should save %1, exit and\n"
-"restart with more ports."
-msgstr ""
+#: ardour_ui.cc:1924
+msgid "could not create %1 new Midi Bus"
+msgid_plural "could not create %1 new Midi Busses"
+msgstr[0] ""
+msgstr[1] ""
 
-#: ardour_ui.cc:1819
+#: ardour_ui.cc:1977
 msgid "You cannot add a track or bus without a session already loaded."
 msgstr ""
 
-#: ardour_ui.cc:1828
+#: ardour_ui.cc:1986
 msgid "could not create %1 new audio track"
 msgid_plural "could not create %1 new audio tracks"
 msgstr[0] ""
 msgstr[1] ""
 
-#: ardour_ui.cc:1837
+#: ardour_ui.cc:1995
 msgid "could not create %1 new audio bus"
 msgid_plural "could not create %1 new audio busses"
 msgstr[0] ""
 msgstr[1] ""
 
-#: ardour_ui.cc:1990
+#: ardour_ui.cc:2020
 msgid ""
-"Please create one or more tracks before trying to record.\n"
-"You can do this with the \"Add Track or Bus\" option in the Session menu."
+"There are insufficient ports available\n"
+"to create a new track or bus.\n"
+"You should save %1, exit and\n"
+"restart with more ports."
 msgstr ""
 
-#: ardour_ui.cc:2376
-msgid "Save as..."
+#: ardour_ui.cc:2164
+msgid ""
+"Please create one or more tracks before trying to record.\n"
+"You can do this with the \"Add Track or Bus\" option in the Session menu."
 msgstr ""
 
-#: ardour_ui.cc:2377 ardour_ui.cc:2456
-msgid "New session name"
+#: ardour_ui.cc:2565
+#, c-format
+msgid "Copied %<PRId64> of %<PRId64>"
 msgstr ""
 
-#: ardour_ui.cc:2379
-msgid "Take Snapshot"
+#: ardour_ui.cc:2619 save_as_dialog.cc:33
+msgid "Save As"
 msgstr ""
 
-#: ardour_ui.cc:2380
-msgid "Name of new snapshot"
+#: ardour_ui.cc:2647
+msgid "Save As failed: %1"
 msgstr ""
 
-#: ardour_ui.cc:2405
+#: ardour_ui.cc:2684
 msgid ""
 "To ensure compatibility with various systems\n"
 "snapshot names may not contain a '%1' character"
 msgstr ""
 
-#: ardour_ui.cc:2417
+#: ardour_ui.cc:2698
 msgid "Confirm Snapshot Overwrite"
 msgstr ""
 
-#: ardour_ui.cc:2418
-msgid "A snapshot already exists with that name.  Do you want to overwrite it?"
+#: ardour_ui.cc:2699
+msgid "A snapshot already exists with that name. Do you want to overwrite it?"
 msgstr ""
 
-#: ardour_ui.cc:2421 utils_videotl.cc:74
-msgid "Overwrite"
+#: ardour_ui.cc:2724
+msgid "Snapshot and switch"
+msgstr ""
+
+#: ardour_ui.cc:2725 ardour_ui.cc:2776
+msgid "New session name"
+msgstr ""
+
+#: ardour_ui.cc:2727
+msgid "Take Snapshot"
+msgstr ""
+
+#: ardour_ui.cc:2728
+msgid "Name of new snapshot"
 msgstr ""
 
-#: ardour_ui.cc:2455
+#: ardour_ui.cc:2775
 msgid "Rename Session"
 msgstr ""
 
-#: ardour_ui.cc:2470 ardour_ui.cc:2886 ardour_ui.cc:2924
+#: ardour_ui.cc:2790 ardour_ui.cc:3267 ardour_ui.cc:3305
 msgid ""
 "To ensure compatibility with various systems\n"
 "session names may not contain a '%1' character"
 msgstr ""
 
-#: ardour_ui.cc:2478
+#: ardour_ui.cc:2798
 msgid ""
 "That name is already in use by another directory/folder. Please try again."
 msgstr ""
 
-#: ardour_ui.cc:2487
+#: ardour_ui.cc:2807
 msgid ""
 "Renaming this session failed.\n"
 "Things could be seriously messed up at this point"
 msgstr ""
 
-#: ardour_ui.cc:2602
+#: ardour_ui.cc:2923 route_ui.cc:1867
+msgid "Confirm Template Overwrite"
+msgstr ""
+
+#: ardour_ui.cc:2924 route_ui.cc:1868
+msgid "A template already exists with that name. Do you want to overwrite it?"
+msgstr ""
+
+#: ardour_ui.cc:2948
 msgid "Save Template"
 msgstr ""
 
-#: ardour_ui.cc:2603
+#: ardour_ui.cc:2949
 msgid "Name for template:"
 msgstr ""
 
-#: ardour_ui.cc:2604
+#: ardour_ui.cc:2950
 msgid "-template"
 msgstr "-modelo"
 
-#: ardour_ui.cc:2643
+#: ardour_ui.cc:2987
 msgid ""
 "This session\n"
 "%1\n"
 "already exists. Do you want to open it?"
 msgstr ""
 
-#: ardour_ui.cc:2653
+#: ardour_ui.cc:2997
 msgid "Open Existing Session"
 msgstr ""
 
-#: ardour_ui.cc:2914
+#: ardour_ui.cc:3295
 msgid "There is no existing session at \"%1\""
 msgstr ""
 
-#: ardour_ui.cc:3006
+#: ardour_ui.cc:3391
 msgid "Please wait while %1 loads your session"
 msgstr ""
 
-#: ardour_ui.cc:3021
+#: ardour_ui.cc:3406
 msgid "Port Registration Error"
 msgstr ""
 
-#: ardour_ui.cc:3022
+#: ardour_ui.cc:3407
 msgid "Click the Close button to try again."
 msgstr ""
 
-#: ardour_ui.cc:3043
-msgid "Session \"%1 (snapshot %2)\" did not load successfully"
-msgstr "Não foi possível carregar a sessão \"%1 (captura %2)\" com sucesso"
+#: ardour_ui.cc:3426
+msgid "Session \"%1 (snapshot %2)\" did not load successfully: %3"
+msgstr ""
 
-#: ardour_ui.cc:3049
+#: ardour_ui.cc:3432 ardour_ui.cc:3453 ardour_ui.cc:3548 ardour_ui.cc:3557
 msgid "Loading Error"
 msgstr ""
 
-#: ardour_ui.cc:3068
+#: ardour_ui.cc:3447
+msgid "Session \"%1 (snapshot %2)\" did not load successfully"
+msgstr "Não foi possível carregar a sessão \"%1 (captura %2)\" com sucesso"
+
+#: ardour_ui.cc:3475
 msgid ""
 "This session has been opened in read-only mode.\n"
 "\n"
 "You will not be able to record or save."
 msgstr ""
 
-#: ardour_ui.cc:3073
+#: ardour_ui.cc:3480
 msgid "Read-only Session"
 msgstr ""
 
-#: ardour_ui.cc:3139
+#: ardour_ui.cc:3547
+msgid "Could not create session in \"%1\": %2"
+msgstr ""
+
+#: ardour_ui.cc:3556
 msgid "Could not create session in \"%1\""
 msgstr ""
 
-#: ardour_ui.cc:3288
+#: ardour_ui.cc:3601
+msgid ""
+"<b>Just ask and wait for an answer.\n"
+"It may take from minutes to hours.</b>"
+msgstr ""
+
+#: ardour_ui.cc:3603
+msgid "About the Chat"
+msgstr ""
+
+#: ardour_ui.cc:3604
+msgid ""
+"When you're inside the chat just ask your question and wait for an answer. "
+"The chat is occupied by real people with real lives so many of them are "
+"passively online and might not read your question before minutes or hours "
+"later.\n"
+"So please be patient and wait for an answer.\n"
+"\n"
+"You should just leave the chat window open and check back regularly until "
+"someone has answered your question."
+msgstr ""
+
+#: ardour_ui.cc:3723
 msgid "No files were ready for clean-up"
 msgstr ""
 
-#: ardour_ui.cc:3292 ardour_ui.cc:3302 ardour_ui.cc:3435 ardour_ui.cc:3442
-#: ardour_ui_ed.cc:103
+#: ardour_ui.cc:3727 ardour_ui.cc:3737 ardour_ui.cc:3870 ardour_ui.cc:3877
+#: ardour_ui_ed.cc:129
 msgid "Clean-up"
 msgstr ""
 
-#: ardour_ui.cc:3293
+#: ardour_ui.cc:3728
 msgid ""
 "If this seems suprising, \n"
 "check for any existing snapshots.\n"
@@ -1174,19 +1380,19 @@ msgstr ""
 "Estas podem ainda incluir regiões que necessitem\n"
 "da existência de alguns ficheiros já em desuso."
 
-#: ardour_ui.cc:3352
+#: ardour_ui.cc:3787
 msgid "kilo"
 msgstr ""
 
-#: ardour_ui.cc:3355
+#: ardour_ui.cc:3790
 msgid "mega"
 msgstr ""
 
-#: ardour_ui.cc:3358
+#: ardour_ui.cc:3793
 msgid "giga"
 msgstr ""
 
-#: ardour_ui.cc:3363
+#: ardour_ui.cc:3798
 msgid ""
 "The following file was deleted from %2,\n"
 "releasing %3 %4bytes of disk space"
@@ -1196,7 +1402,7 @@ msgid_plural ""
 msgstr[0] ""
 msgstr[1] ""
 
-#: ardour_ui.cc:3370
+#: ardour_ui.cc:3805
 msgid ""
 "The following file was not in use and \n"
 "has been moved to: %2\n"
@@ -1218,92 +1424,128 @@ msgid_plural ""
 msgstr[0] ""
 msgstr[1] ""
 
-#: ardour_ui.cc:3430
+#: ardour_ui.cc:3865
 msgid "Are you sure you want to clean-up?"
 msgstr ""
 
-#: ardour_ui.cc:3437
+#: ardour_ui.cc:3872
 msgid ""
 "Clean-up is a destructive operation.\n"
 "ALL undo/redo information will be lost if you clean-up.\n"
 "Clean-up will move all unused files to a \"dead\" location."
 msgstr ""
 
-#: ardour_ui.cc:3445
+#: ardour_ui.cc:3880
 msgid "CleanupDialog"
 msgstr ""
 
-#: ardour_ui.cc:3475
+#: ardour_ui.cc:3910
 msgid "Cleaned Files"
 msgstr ""
 
-#: ardour_ui.cc:3492
+#: ardour_ui.cc:3927
 msgid "deleted file"
 msgstr "ficheiro eliminado"
 
-#: ardour_ui.cc:3637
+#: ardour_ui.cc:4133
+msgid "Cannot read session script '%1': %2"
+msgstr ""
+
+#: ardour_ui.cc:4142 luainstance.cc:1087
+msgid "Set Script Parameters"
+msgstr ""
+
+#: ardour_ui.cc:4153
+msgid "Session script '%1' instantiation failed: %2"
+msgstr ""
+
+#: ardour_ui.cc:4157
+msgid "Loading Session script '%1' failed: %2"
+msgstr ""
+
+#: ardour_ui.cc:4170
+msgid "There are no active Lua session scripts present in this session."
+msgstr ""
+
+#: ardour_ui.cc:4187
+msgid "Session script '%1' removal failed: %2"
+msgstr ""
+
+#: ardour_ui.cc:4197
 msgid "Video-Server was not launched by %1. The request to stop it is ignored."
 msgstr ""
 
-#: ardour_ui.cc:3641
+#: ardour_ui.cc:4201
 msgid "Stop Video-Server"
 msgstr ""
 
-#: ardour_ui.cc:3642
+#: ardour_ui.cc:4202
 msgid "Do you really want to stop the Video Server?"
 msgstr ""
 
-#: ardour_ui.cc:3645
+#: ardour_ui.cc:4205
 msgid "Yes, Stop It"
 msgstr ""
 
-#: ardour_ui.cc:3671
+#: ardour_ui.cc:4231
 msgid "The Video Server is already started."
 msgstr ""
 
-#: ardour_ui.cc:3673
+#: ardour_ui.cc:4233
 msgid ""
 "An external Video Server is configured and can be reached. Not starting a "
 "new instance."
 msgstr ""
 
-#: ardour_ui.cc:3681 ardour_ui.cc:3786
+#: ardour_ui.cc:4241 ardour_ui.cc:4346
 msgid ""
 "Could not connect to the Video Server. Start it or configure its access URL "
 "in Preferences."
 msgstr ""
 
-#: ardour_ui.cc:3711
+#: ardour_ui.cc:4271
 msgid "Specified docroot is not an existing directory."
 msgstr ""
 
-#: ardour_ui.cc:3717 ardour_ui.cc:3723
+#: ardour_ui.cc:4277 ardour_ui.cc:4283
 msgid "Given Video Server is not an executable file."
 msgstr ""
 
-#: ardour_ui.cc:3757
+#: ardour_ui.cc:4317
 msgid "Cannot launch the video-server"
 msgstr ""
 
-#: ardour_ui.cc:3767
+#: ardour_ui.cc:4327
 msgid "Video-server was started but does not respond to requests..."
 msgstr ""
 
-#: ardour_ui.cc:3812 editor_audio_import.cc:641
+#: ardour_ui.cc:4372 editor_audio_import.cc:647
 msgid "could not open %1"
 msgstr "não foi possível abrir %1"
 
-#: ardour_ui.cc:3816
+#: ardour_ui.cc:4376
 msgid "no video-file selected"
 msgstr ""
 
-#: ardour_ui.cc:4014
+#: ardour_ui.cc:4472
+msgid "No LTC detected, video will not be aligned."
+msgstr ""
+
+#: ardour_ui.cc:4478
+msgid "Align video-start to %1 [samples]"
+msgstr ""
+
+#: ardour_ui.cc:4654
+msgid "xrun"
+msgstr ""
+
+#: ardour_ui.cc:4663
 msgid "Recording was stopped because your system could not keep up."
 msgstr ""
 "A gravação foi interrompida porque o seu sistema não foi capaz de a "
 "acompanhar adequadamente."
 
-#: ardour_ui.cc:4043
+#: ardour_ui.cc:4692
 msgid ""
 "The disk system on your computer\n"
 "was not able to keep up with %1.\n"
@@ -1312,23 +1554,23 @@ msgid ""
 "quickly enough to keep up with recording.\n"
 msgstr ""
 
-#: ardour_ui.cc:4113
+#: ardour_ui.cc:4765
 msgid "Scanning for plugins"
 msgstr ""
 
-#: ardour_ui.cc:4115
+#: ardour_ui.cc:4767
 msgid "Cancel plugin scan"
 msgstr ""
 
-#: ardour_ui.cc:4124
+#: ardour_ui.cc:4776
 msgid "Stop Timeout"
 msgstr ""
 
-#: ardour_ui.cc:4131
+#: ardour_ui.cc:4783
 msgid "Scan Timeout"
 msgstr ""
 
-#: ardour_ui.cc:4174
+#: ardour_ui.cc:4827
 msgid ""
 "The disk system on your computer\n"
 "was not able to keep up with %1.\n"
@@ -1337,11 +1579,11 @@ msgid ""
 "quickly enough to keep up with playback.\n"
 msgstr ""
 
-#: ardour_ui.cc:4214
+#: ardour_ui.cc:4862
 msgid "Crash Recovery"
 msgstr ""
 
-#: ardour_ui.cc:4215
+#: ardour_ui.cc:4863
 msgid ""
 "This session appears to have been in the\n"
 "middle of recording when %1 or\n"
@@ -1352,42 +1594,43 @@ msgid ""
 "what you would like to do.\n"
 msgstr ""
 
-#: ardour_ui.cc:4227
+#: ardour_ui.cc:4875
 msgid "Ignore crash data"
 msgstr "Ignorar"
 
-#: ardour_ui.cc:4228
+#: ardour_ui.cc:4876
 msgid "Recover from crash"
 msgstr "Recuperar"
 
-#: ardour_ui.cc:4248
+#: ardour_ui.cc:4896
 msgid "Sample Rate Mismatch"
 msgstr ""
 
-#: ardour_ui.cc:4249
+#: ardour_ui.cc:4897
 msgid ""
 "This session was created with a sample rate of %1 Hz, but\n"
 "%2 is currently running at %3 Hz.  If you load this session,\n"
 "audio may be played at the wrong sample rate.\n"
 msgstr ""
 
-#: ardour_ui.cc:4258
+#: ardour_ui.cc:4906
 msgid "Do not load session"
 msgstr ""
 
-#: ardour_ui.cc:4259
+#: ardour_ui.cc:4907
 msgid "Load session anyway"
 msgstr ""
 
-#: ardour_ui.cc:4286
-msgid "Could not disconnect from Audio/MIDI engine"
-msgstr ""
-
-#: ardour_ui.cc:4303 ardour_ui.cc:4306
-msgid "Could not reconnect to the Audio/MIDI engine"
+#: ardour_ui.cc:4927
+msgid ""
+"This session was created with a sample rate of %1 Hz, but\n"
+"%2 is currently running at %3 Hz.\n"
+"Audio will be recorded and played at the wrong sample rate.\n"
+"Re-Configure the Audio Engine in\n"
+"Menu > Window > Audio/Midi Setup"
 msgstr ""
 
-#: ardour_ui.cc:4590
+#: ardour_ui.cc:5209
 msgid ""
 "%4This is a session from an older version of %3%5\n"
 "\n"
@@ -1399,88 +1642,113 @@ msgid ""
 "\n"
 "%6%2%7\n"
 "\n"
-"From now on, use the -2000 version with older versions of %3"
+"From now on, use the backup copy with older versions of %3"
 msgstr ""
 
-#: ardour_ui2.cc:73
-msgid "UI: cannot setup editor"
-msgstr "Não foi possível iniciar o painel de edição"
+#: ardour_ui.cc:5331
+msgid "This is a free/demo copy of %1. It has just switched to silent mode."
+msgstr ""
 
-#: ardour_ui2.cc:78
-msgid "UI: cannot setup mixer"
-msgstr "Não foi posivel iniciar o painel de mistura"
+#: ardour_ui.cc:5337
+msgid "%1 is now silent"
+msgstr ""
 
-#: ardour_ui2.cc:83
-msgid "UI: cannot setup meterbridge"
+#: ardour_ui.cc:5339
+msgid ""
+"Please consider paying for a copy of %1 - you can pay whatever you want."
+msgstr ""
+
+#: ardour_ui.cc:5340
+msgid "Better yet become a subscriber - subscriptions start at US$1 per month."
+msgstr ""
+
+#: ardour_ui.cc:5341
+msgid "Pay for a copy (via the web)"
 msgstr ""
 
-#: ardour_ui2.cc:128
+#: ardour_ui.cc:5342
+msgid "Become a subscriber (via the web)"
+msgstr ""
+
+#: ardour_ui.cc:5361
+msgid "Remain silent"
+msgstr ""
+
+#: ardour_ui.cc:5363
+msgid "Give me more time"
+msgstr ""
+
+#: ardour_ui.cc:5656
+msgid "Global keybindings are missing"
+msgstr ""
+
+#: ardour_ui2.cc:79
 msgid "Play from playhead"
 msgstr "Reproduzir desde o cursor de reprodução"
 
-#: ardour_ui2.cc:129
+#: ardour_ui2.cc:80
 msgid "Stop playback"
 msgstr "Parar reprodução"
 
-#: ardour_ui2.cc:130
+#: ardour_ui2.cc:81
 msgid "Toggle record"
 msgstr ""
 
-#: ardour_ui2.cc:131
+#: ardour_ui2.cc:82
 msgid "Play range/selection"
 msgstr "Reproduzir selecção"
 
-#: ardour_ui2.cc:132
+#: ardour_ui2.cc:83
 msgid "Go to start of session"
 msgstr "Ir para o início da sessão"
 
-#: ardour_ui2.cc:133
+#: ardour_ui2.cc:84
 msgid "Go to end of session"
 msgstr "Ir para o final da sessão"
 
-#: ardour_ui2.cc:134
+#: ardour_ui2.cc:85
 msgid "Play loop range"
 msgstr "Reproduzir intervalo cíclico"
 
-#: ardour_ui2.cc:135
+#: ardour_ui2.cc:86
 msgid ""
 "MIDI Panic\n"
 "Send note off and reset controller messages on all MIDI channels"
 msgstr ""
 
-#: ardour_ui2.cc:136
+#: ardour_ui2.cc:87
 msgid "Return to last playback start when stopped"
 msgstr "Ir para a última posição inicial do cursor de reprodução quando parar"
 
-#: ardour_ui2.cc:137
-msgid "Playhead follows Range Selections and Edits"
+#: ardour_ui2.cc:88
+msgid "Playhead follows range selections and edits"
 msgstr ""
 
-#: ardour_ui2.cc:138
+#: ardour_ui2.cc:89
 msgid "Be sensible about input monitoring"
 msgstr "Seja sensível acerca da monitorização de entradas"
 
-#: ardour_ui2.cc:139
+#: ardour_ui2.cc:90
 msgid "Enable/Disable audio click"
 msgstr "Ligar/Desligar o metrónomo"
 
-#: ardour_ui2.cc:140 monitor_section.cc:111
+#: ardour_ui2.cc:91 monitor_section.cc:129
 msgid ""
 "When active, something is soloed.\n"
 "Click to de-solo everything"
 msgstr ""
 
-#: ardour_ui2.cc:141
+#: ardour_ui2.cc:92
 msgid ""
-"When active, auditioning is taking place\n"
+"When active, auditioning is taking place.\n"
 "Click to stop the audition"
 msgstr ""
 
-#: ardour_ui2.cc:142
+#: ardour_ui2.cc:93
 msgid "When active, there is a feedback loop."
 msgstr ""
 
-#: ardour_ui2.cc:143
+#: ardour_ui2.cc:94
 msgid ""
 "<b>Primary Clock</b> right-click to set display mode. Click to edit, click"
 "+drag a digit or mouse-over+scroll wheel to modify.\n"
@@ -1488,7 +1756,7 @@ msgid ""
 "confirm; postfix the edit with '+' or '-' to enter delta times.\n"
 msgstr ""
 
-#: ardour_ui2.cc:144
+#: ardour_ui2.cc:95
 msgid ""
 "<b>Secondary Clock</b> right-click to set display mode. Click to edit, click"
 "+drag a digit or mouse-over+scroll wheel to modify.\n"
@@ -1496,450 +1764,559 @@ msgid ""
 "confirm; postfix the edit with '+' or '-' to enter delta times.\n"
 msgstr ""
 
-#: ardour_ui2.cc:145
+#: ardour_ui2.cc:96
 msgid "Reset All Peak Indicators"
 msgstr ""
 
-#: ardour_ui2.cc:146
+#: ardour_ui2.cc:97
 msgid "Show Error Log and acknowledge warnings"
 msgstr ""
 
-#: ardour_ui2.cc:179
+#: ardour_ui2.cc:130
 msgid "[ERROR]: "
 msgstr ""
 
-#: ardour_ui2.cc:182
+#: ardour_ui2.cc:133
 msgid "[WARNING]: "
 msgstr ""
 
-#: ardour_ui2.cc:185
+#: ardour_ui2.cc:136
 msgid "[INFO]: "
 msgstr ""
 
-#: ardour_ui2.cc:253 ardour_ui_ed.cc:403
+#: ardour_ui2.cc:197 ardour_ui_ed.cc:509
 msgid "Auto Return"
 msgstr ""
 
-#: ardour_ui2.cc:255 ardour_ui_ed.cc:406
+#: ardour_ui2.cc:199 ardour_ui_ed.cc:512
 msgid "Follow Edits"
 msgstr ""
 
-#: ardour_ui2.cc:716 rc_option_editor.cc:2300
+#: ardour_ui2.cc:422 ardour_ui2.cc:426 ardour_ui2.cc:430
+msgid ""
+"Drag this tab to the desktop to show %1 in its own window\n"
+"\n"
+"To put the window back, use the Window > %1 > Attach menu action"
+msgstr ""
+
+#: ardour_ui2.cc:638
 msgid "GUI"
 msgstr ""
 
-#: ardour_ui2.cc:733 rc_option_editor.cc:1309 rc_option_editor.cc:1327
-#: rc_option_editor.cc:1330 rc_option_editor.cc:1332 rc_option_editor.cc:1334
-#: rc_option_editor.cc:1342 rc_option_editor.cc:1350 rc_option_editor.cc:1352
-#: rc_option_editor.cc:1360 rc_option_editor.cc:1367 rc_option_editor.cc:1376
-#: rc_option_editor.cc:1378 rc_option_editor.cc:1380 rc_option_editor.cc:1388
-#: rc_option_editor.cc:1390 rc_option_editor.cc:1399
-#: session_option_editor.cc:321 session_option_editor.cc:323
-#: session_option_editor.cc:344 session_option_editor.cc:346
-#: session_option_editor.cc:348 session_option_editor.cc:355
-#: session_option_editor.cc:362 session_option_editor.cc:366
+#: ardour_ui2.cc:651 rc_option_editor.cc:1874 rc_option_editor.cc:1892
+#: rc_option_editor.cc:1895 rc_option_editor.cc:1897 rc_option_editor.cc:1899
+#: rc_option_editor.cc:1907 rc_option_editor.cc:1909 rc_option_editor.cc:1917
+#: rc_option_editor.cc:1925 rc_option_editor.cc:1932 rc_option_editor.cc:1953
+#: rc_option_editor.cc:1955 rc_option_editor.cc:1964
+#: session_option_editor.cc:342 session_option_editor.cc:344
+#: session_option_editor.cc:365 session_option_editor.cc:367
+#: session_option_editor.cc:369 session_option_editor.cc:376
+#: session_option_editor.cc:383 session_option_editor.cc:387
 msgid "Misc"
 msgstr "Miscelânea"
 
-#: ardour_ui_dependents.cc:76
+#: ardour_ui_dependents.cc:118
 msgid "Setup Editor"
 msgstr ""
 
-#: ardour_ui_dependents.cc:78
+#: ardour_ui_dependents.cc:120
 msgid "Setup Mixer"
 msgstr ""
 
-#: ardour_ui_dependents.cc:84
+#: ardour_ui_dependents.cc:127
 msgid "Reload Session History"
 msgstr ""
 
-#: ardour_ui_dialogs.cc:250
+#: ardour_ui_dependents.cc:248
+msgid "UI: cannot setup editor"
+msgstr "Não foi possível iniciar o painel de edição"
+
+#: ardour_ui_dependents.cc:253
+msgid "UI: cannot setup mixer"
+msgstr "Não foi posivel iniciar o painel de mistura"
+
+#: ardour_ui_dependents.cc:258
+msgid "UI: cannot setup meterbridge"
+msgstr ""
+
+#: ardour_ui_dependents.cc:263
+msgid "UI: cannot setup luawindow"
+msgstr ""
+
+#: ardour_ui_dependents.cc:269 ardour_ui_ed.cc:136 ardour_ui_ed.cc:257
+#: rc_option_editor.cc:1853 rc_option_editor.cc:3487
+msgid "Preferences"
+msgstr ""
+
+#: ardour_ui_dependents.cc:270 ardour_ui_ed.cc:134 mixer_ui.cc:100
+#: mixer_ui.cc:410
+msgid "Mixer"
+msgstr ""
+
+#: ardour_ui_dependents.cc:271 ardour_ui_ed.cc:135 editor.cc:5790
+#: editor.cc:6062 public_editor.cc:34 rc_option_editor.cc:2201
+#: rc_option_editor.cc:2215 rc_option_editor.cc:2219 rc_option_editor.cc:2227
+#: rc_option_editor.cc:2236 rc_option_editor.cc:2244 rc_option_editor.cc:2253
+#: rc_option_editor.cc:2261 rc_option_editor.cc:2269 rc_option_editor.cc:2279
+#: rc_option_editor.cc:2281 rc_option_editor.cc:2305 rc_option_editor.cc:2317
+#: rc_option_editor.cc:2328 rc_option_editor.cc:2346
+msgid "Editor"
+msgstr ""
+
+#: ardour_ui_dialogs.cc:263
 msgid "Don't close"
 msgstr ""
 
-#: ardour_ui_dialogs.cc:251
+#: ardour_ui_dialogs.cc:264
 msgid "Just close"
 msgstr ""
 
-#: ardour_ui_dialogs.cc:252
+#: ardour_ui_dialogs.cc:265
 msgid "Save and close"
 msgstr ""
 
-#: ardour_ui_dialogs.cc:362
-msgid "This screen is not tall enough to display the mixer window"
+#: ardour_ui_ed.cc:124
+msgid "Escape"
 msgstr ""
 
-#: ardour_ui_ed.cc:102
+#: ardour_ui_ed.cc:128
 msgid "Session"
 msgstr "Sessão"
 
-#: ardour_ui_ed.cc:105 editor_actions.cc:138 editor_regions.cc:116
-#: port_group.cc:458 session_option_editor.cc:82 session_option_editor.cc:89
+#: ardour_ui_ed.cc:131 editor_actions.cc:141 editor_regions.cc:163
+#: port_group.cc:468 session_option_editor.cc:82 session_option_editor.cc:89
 msgid "Sync"
 msgstr "Sincronia"
 
-#: ardour_ui_ed.cc:106
+#: ardour_ui_ed.cc:132
 msgid "Options"
 msgstr "Opções"
 
-#: ardour_ui_ed.cc:107
+#: ardour_ui_ed.cc:133
 msgid "Window"
 msgstr ""
 
-#: ardour_ui_ed.cc:108
+#: ardour_ui_ed.cc:137 ardour_ui_ed.cc:267 ardour_ui_ed.cc:268
+#: ardour_ui_ed.cc:269
+msgid "Detach"
+msgstr ""
+
+#: ardour_ui_ed.cc:138
 msgid "Help"
 msgstr "Ajuda"
 
-#: ardour_ui_ed.cc:109
+#: ardour_ui_ed.cc:139
 msgid "Misc. Shortcuts"
 msgstr ""
 
-#: ardour_ui_ed.cc:110
+#: ardour_ui_ed.cc:140
 msgid "Audio File Format"
 msgstr "Formato de ficheiro audio"
 
-#: ardour_ui_ed.cc:111
+#: ardour_ui_ed.cc:141
 msgid "File Type"
 msgstr "Tipo de ficheiro"
 
-#: ardour_ui_ed.cc:112 export_format_dialog.cc:67
+#: ardour_ui_ed.cc:142 export_format_dialog.cc:75
 msgid "Sample Format"
 msgstr "Formato de amostra"
 
-#: ardour_ui_ed.cc:113 rc_option_editor.cc:2245 rc_option_editor.cc:2257
+#: ardour_ui_ed.cc:143 rc_option_editor.cc:2841
 msgid "Control Surfaces"
 msgstr "Mesas de controlo"
 
-#: ardour_ui_ed.cc:114 rc_option_editor.cc:1921 rc_option_editor.cc:2264
+#: ardour_ui_ed.cc:144 rc_option_editor.cc:2847 rc_option_editor.cc:2853
+#: rc_option_editor.cc:2862 rc_option_editor.cc:2873 rc_option_editor.cc:2883
+#: rc_option_editor.cc:2945 rc_option_editor.cc:2962 rc_option_editor.cc:2978
+#: rc_option_editor.cc:2979 rc_option_editor.cc:2988 rc_option_editor.cc:3002
+#: rc_option_editor.cc:3005 rc_option_editor.cc:3013 rc_option_editor.cc:3021
 msgid "Plugins"
 msgstr "Efeitos/plug-ins"
 
-#: ardour_ui_ed.cc:115 rc_option_editor.cc:2351
+#: ardour_ui_ed.cc:145 rc_option_editor.cc:3169
 msgid "Metering"
 msgstr "VUímetro"
 
-#: ardour_ui_ed.cc:116
+#: ardour_ui_ed.cc:146
 msgid "Fall Off Rate"
 msgstr ""
 
-#: ardour_ui_ed.cc:117
+#: ardour_ui_ed.cc:147
 msgid "Hold Time"
 msgstr "Tempo de persistência"
 
-#: ardour_ui_ed.cc:118
+#: ardour_ui_ed.cc:148
 msgid "Denormal Handling"
 msgstr ""
 
-#: ardour_ui_ed.cc:122 route_time_axis.cc:1677
+#: ardour_ui_ed.cc:152 route_time_axis.cc:1683
 msgid "New..."
 msgstr ""
 
-#: ardour_ui_ed.cc:124
+#: ardour_ui_ed.cc:154
 msgid "Open..."
 msgstr ""
 
-#: ardour_ui_ed.cc:125
+#: ardour_ui_ed.cc:155
 msgid "Recent..."
 msgstr ""
 
-#: ardour_ui_ed.cc:126 panner_editor.cc:29 playlist_selector.cc:64
+#: ardour_ui_ed.cc:156 panner_editor.cc:29 playlist_selector.cc:64
 msgid "Close"
 msgstr "Fechar"
 
-#: ardour_ui_ed.cc:129
+#: ardour_ui_ed.cc:159
 msgid "Add Track or Bus..."
 msgstr ""
 
-#: ardour_ui_ed.cc:134
-msgid "Open Video"
+#: ardour_ui_ed.cc:163
+msgid "Duplicate Tracks/Busses..."
+msgstr ""
+
+#: ardour_ui_ed.cc:169
+msgid "Cancel Solo"
 msgstr ""
 
-#: ardour_ui_ed.cc:137
+#: ardour_ui_ed.cc:173
+msgid "Session|Scripting"
+msgstr ""
+
+#: ardour_ui_ed.cc:176
+msgid "Add Lua Script..."
+msgstr ""
+
+#: ardour_ui_ed.cc:180
+msgid "Remove Lua Script"
+msgstr ""
+
+#: ardour_ui_ed.cc:184
+msgid "Open Video..."
+msgstr ""
+
+#: ardour_ui_ed.cc:187
 msgid "Remove Video"
 msgstr ""
 
-#: ardour_ui_ed.cc:140
-msgid "Export To Video File"
+#: ardour_ui_ed.cc:190
+msgid "Export to Video File..."
 msgstr ""
 
-#: ardour_ui_ed.cc:144
-msgid "Snapshot..."
+#: ardour_ui_ed.cc:194
+msgid "Snapshot (& keep working on current version) ..."
 msgstr ""
 
-#: ardour_ui_ed.cc:148
+#: ardour_ui_ed.cc:197
+msgid "Snapshot (& switch to new version) ..."
+msgstr ""
+
+#: ardour_ui_ed.cc:200
+msgid "Quick Snapshot (& keep working on current version) ..."
+msgstr ""
+
+#: ardour_ui_ed.cc:203
+msgid "Quick Snapshot (& switch to new version) ..."
+msgstr ""
+
+#: ardour_ui_ed.cc:207
 msgid "Save As..."
 msgstr ""
 
-#: ardour_ui_ed.cc:152 editor_actions.cc:1771 editor_markers.cc:903
-#: editor_snapshots.cc:124 mixer_strip.cc:1518 route_time_axis.cc:1673
+#: ardour_ui_ed.cc:210 editor_actions.cc:1788 editor_markers.cc:908
+#: editor_snapshots.cc:136 mixer_strip.cc:1653 route_time_axis.cc:1679
 msgid "Rename..."
 msgstr ""
 
-#: ardour_ui_ed.cc:156
+#: ardour_ui_ed.cc:214
 msgid "Save Template..."
 msgstr "Guardar modelo..."
 
-#: ardour_ui_ed.cc:159
+#: ardour_ui_ed.cc:217
 msgid "Metadata"
 msgstr ""
 
-#: ardour_ui_ed.cc:162
+#: ardour_ui_ed.cc:220
 msgid "Edit Metadata..."
 msgstr ""
 
-#: ardour_ui_ed.cc:165
+#: ardour_ui_ed.cc:223
 msgid "Import Metadata..."
 msgstr ""
 
-#: ardour_ui_ed.cc:168
-msgid "Export To Audio File(s)..."
+#: ardour_ui_ed.cc:226
+msgid "Export to Audio File(s)..."
 msgstr ""
 
-#: ardour_ui_ed.cc:171
+#: ardour_ui_ed.cc:229
 msgid "Stem export..."
 msgstr ""
 
-#: ardour_ui_ed.cc:174 editor_export_audio.cc:65 export_dialog.cc:129
-#: export_video_dialog.cc:84
+#: ardour_ui_ed.cc:232 editor_export_audio.cc:66
+#: export_channel_selector.cc:190 export_channel_selector.cc:578
+#: export_dialog.cc:131 export_video_dialog.cc:80
 msgid "Export"
 msgstr "Exportar"
 
-#: ardour_ui_ed.cc:177
+#: ardour_ui_ed.cc:235
 msgid "Clean-up Unused Sources..."
 msgstr ""
 
-#: ardour_ui_ed.cc:181
+#: ardour_ui_ed.cc:239
+msgid "Reset Peak Files"
+msgstr ""
+
+#: ardour_ui_ed.cc:243
 msgid "Flush Wastebasket"
 msgstr ""
 
-#: ardour_ui_ed.cc:188
+#: ardour_ui_ed.cc:251
 msgid "Quit"
 msgstr "Sair"
 
-#: ardour_ui_ed.cc:192
+#: ardour_ui_ed.cc:252 ardour_ui_ed.cc:259 ardour_ui_ed.cc:260
+#: ardour_ui_ed.cc:261 automation_time_axis.cc:545 editor_actions.cc:686
+#: editor_markers.cc:907 location_ui.cc:61 plugin_selector.cc:97
+#: route_time_axis.cc:864
+msgid "Hide"
+msgstr "Esconder"
+
+#: ardour_ui_ed.cc:263 ardour_ui_ed.cc:264 ardour_ui_ed.cc:265
+msgid "Attach"
+msgstr ""
+
+#: ardour_ui_ed.cc:275 ardour_ui_ed.cc:276 ardour_ui_ed.cc:277
+#: ardour_ui_ed.cc:283 ardour_ui_ed.cc:284 ardour_ui_ed.cc:285
+msgid "Change"
+msgstr ""
+
+#: ardour_ui_ed.cc:287
+msgid "Previous Tab"
+msgstr ""
+
+#: ardour_ui_ed.cc:288
+msgid "Next Tab"
+msgstr ""
+
+#: ardour_ui_ed.cc:290
+msgid "Toggle Editor & Mixer"
+msgstr ""
+
+#: ardour_ui_ed.cc:294
 msgid "Maximise Editor Space"
 msgstr "Maximizar o painel de edição"
 
-#: ardour_ui_ed.cc:193
+#: ardour_ui_ed.cc:295
 msgid "Maximise Mixer Space"
 msgstr ""
 
-#: ardour_ui_ed.cc:194
-msgid "Show Toolbars"
+#: ardour_ui_ed.cc:298
+msgid "Toggle Mixer List"
 msgstr ""
 
-#: ardour_ui_ed.cc:198
-msgid "Show more UI preferences"
+#: ardour_ui_ed.cc:301
+msgid "Toggle Monitor Section Visibility"
 msgstr ""
 
-#: ardour_ui_ed.cc:200 mixer_ui.cc:1924 mixer_ui.cc:1930
-msgid "Window|Mixer"
+#: ardour_ui_ed.cc:305
+msgid "Show more UI preferences"
 msgstr ""
 
-#: ardour_ui_ed.cc:201
-msgid "Toggle Editor+Mixer"
+#: ardour_ui_ed.cc:308
+msgid "Window|Scripting"
 msgstr ""
 
-#: ardour_ui_ed.cc:202 meterbridge.cc:218 meterbridge.cc:224
+#: ardour_ui_ed.cc:309 meterbridge.cc:214 meterbridge.cc:220
 msgid "Window|Meterbridge"
 msgstr ""
 
-#: ardour_ui_ed.cc:204
-msgid "Reattach All Tearoffs"
-msgstr ""
-
-#: ardour_ui_ed.cc:206 midi_tracer.cc:45
+#: ardour_ui_ed.cc:311 midi_tracer.cc:45
 msgid "MIDI Tracer"
 msgstr ""
 
-#: ardour_ui_ed.cc:208
+#: ardour_ui_ed.cc:314
 msgid "Chat"
 msgstr ""
 
-#: ardour_ui_ed.cc:210
+#: ardour_ui_ed.cc:316
 msgid "Help|Manual"
 msgstr ""
 
-#: ardour_ui_ed.cc:211
-msgid "Reference"
+#: ardour_ui_ed.cc:317
+msgid "Manual|Reference"
 msgstr ""
 
-#: ardour_ui_ed.cc:212
-msgid "Report A Bug"
+#: ardour_ui_ed.cc:318
+msgid "Report a Bug"
 msgstr ""
 
-#: ardour_ui_ed.cc:213
+#: ardour_ui_ed.cc:319
 msgid "Cheat Sheet"
 msgstr ""
 
-#: ardour_ui_ed.cc:214
+#: ardour_ui_ed.cc:320
 msgid "Ardour Website"
 msgstr ""
 
-#: ardour_ui_ed.cc:215
+#: ardour_ui_ed.cc:321
 msgid "Ardour Development"
 msgstr ""
 
-#: ardour_ui_ed.cc:216
+#: ardour_ui_ed.cc:322
 msgid "User Forums"
 msgstr ""
 
-#: ardour_ui_ed.cc:217
-msgid "How to report a bug"
+#: ardour_ui_ed.cc:323
+msgid "How to Report a Bug"
 msgstr ""
 
-#: ardour_ui_ed.cc:219 plugin_ui.cc:419
+#: ardour_ui_ed.cc:325 luawindow.cc:100 luawindow.cc:654 plugin_ui.cc:419
 msgid "Save"
 msgstr "Guardar"
 
-#: ardour_ui_ed.cc:227 rc_option_editor.cc:1419 rc_option_editor.cc:1430
-#: rc_option_editor.cc:1441 rc_option_editor.cc:1450 rc_option_editor.cc:1463
-#: rc_option_editor.cc:1476 rc_option_editor.cc:1485 rc_option_editor.cc:1495
-#: rc_option_editor.cc:1497 rc_option_editor.cc:1506 rc_option_editor.cc:1522
-#: rc_option_editor.cc:1543 rc_option_editor.cc:1561 rc_option_editor.cc:1563
-#: rc_option_editor.cc:1579 rc_option_editor.cc:1582 rc_option_editor.cc:1584
-#: rc_option_editor.cc:1601 rc_option_editor.cc:1612
+#: ardour_ui_ed.cc:333 rc_option_editor.cc:1975 rc_option_editor.cc:1986
+#: rc_option_editor.cc:1997 rc_option_editor.cc:2008 rc_option_editor.cc:2017
+#: rc_option_editor.cc:2030 rc_option_editor.cc:2043 rc_option_editor.cc:2052
+#: rc_option_editor.cc:2062 rc_option_editor.cc:2079 rc_option_editor.cc:2186
 msgid "Transport"
 msgstr "Transporte"
 
-#: ardour_ui_ed.cc:233
+#: ardour_ui_ed.cc:339 engine_dialog.cc:88
 msgid "Stop"
 msgstr "Parar"
 
-#: ardour_ui_ed.cc:236
+#: ardour_ui_ed.cc:342
 msgid "Roll"
 msgstr "Rolar"
 
-#: ardour_ui_ed.cc:240 ardour_ui_ed.cc:243
+#: ardour_ui_ed.cc:346 ardour_ui_ed.cc:349
 msgid "Start/Stop"
 msgstr "Iniciar/Parar"
 
-#: ardour_ui_ed.cc:246
+#: ardour_ui_ed.cc:352
 msgid "Start/Continue/Stop"
 msgstr ""
 
-#: ardour_ui_ed.cc:249
+#: ardour_ui_ed.cc:355
 msgid "Stop and Forget Capture"
 msgstr ""
 
-#: ardour_ui_ed.cc:259
-msgid "Transition To Roll"
+#: ardour_ui_ed.cc:365
+msgid "Transition to Roll"
 msgstr ""
 
-#: ardour_ui_ed.cc:263
-msgid "Transition To Reverse"
+#: ardour_ui_ed.cc:369
+msgid "Transition to Reverse"
 msgstr ""
 
-#: ardour_ui_ed.cc:267
+#: ardour_ui_ed.cc:373
 msgid "Play Loop Range"
 msgstr "Reproduzir intervalo cíclico"
 
-#: ardour_ui_ed.cc:270
+#: ardour_ui_ed.cc:376
 msgid "Play Selection"
 msgstr ""
 
-#: ardour_ui_ed.cc:273
+#: ardour_ui_ed.cc:379
 msgid "Play Selection w/Preroll"
 msgstr ""
 
-#: ardour_ui_ed.cc:277
+#: ardour_ui_ed.cc:383
 msgid "Enable Record"
 msgstr "Gravar"
 
-#: ardour_ui_ed.cc:280 ardour_ui_ed.cc:284
+#: ardour_ui_ed.cc:386 ardour_ui_ed.cc:390
 msgid "Start Recording"
 msgstr ""
 
-#: ardour_ui_ed.cc:288
+#: ardour_ui_ed.cc:394
 msgid "Rewind"
 msgstr "Rebobinar"
 
-#: ardour_ui_ed.cc:291
+#: ardour_ui_ed.cc:397
 msgid "Rewind (Slow)"
 msgstr "Rebobinar (devagar)"
 
-#: ardour_ui_ed.cc:294
+#: ardour_ui_ed.cc:400
 msgid "Rewind (Fast)"
 msgstr "Rebobinar (rápido)"
 
-#: ardour_ui_ed.cc:297
+#: ardour_ui_ed.cc:403
 msgid "Forward"
 msgstr "Avançar"
 
-#: ardour_ui_ed.cc:300
+#: ardour_ui_ed.cc:406
 msgid "Forward (Slow)"
 msgstr "Avançar (devagar)"
 
-#: ardour_ui_ed.cc:303
+#: ardour_ui_ed.cc:409
 msgid "Forward (Fast)"
 msgstr "Avançar (rápido)"
 
-#: ardour_ui_ed.cc:306
+#: ardour_ui_ed.cc:412
 msgid "Go to Zero"
 msgstr "Ir para o zero"
 
-#: ardour_ui_ed.cc:309 ardour_ui_ed.cc:312
+#: ardour_ui_ed.cc:415 ardour_ui_ed.cc:418
 msgid "Go to Start"
 msgstr "Ir para o início"
 
-#: ardour_ui_ed.cc:315
+#: ardour_ui_ed.cc:421
 msgid "Go to End"
 msgstr "Ir para o final"
 
-#: ardour_ui_ed.cc:318
+#: ardour_ui_ed.cc:424
 msgid "Go to Wall Clock"
 msgstr ""
 
-#: ardour_ui_ed.cc:323 ardour_ui_ed.cc:326
+#: ardour_ui_ed.cc:429 ardour_ui_ed.cc:432
 msgid "Numpad Decimal"
 msgstr ""
 
-#: ardour_ui_ed.cc:329
+#: ardour_ui_ed.cc:435
 msgid "Numpad 0"
 msgstr ""
 
-#: ardour_ui_ed.cc:332
+#: ardour_ui_ed.cc:438
 msgid "Numpad 1"
 msgstr ""
 
-#: ardour_ui_ed.cc:335
+#: ardour_ui_ed.cc:441
 msgid "Numpad 2"
 msgstr ""
 
-#: ardour_ui_ed.cc:338
+#: ardour_ui_ed.cc:444
 msgid "Numpad 3"
 msgstr ""
 
-#: ardour_ui_ed.cc:341
+#: ardour_ui_ed.cc:447
 msgid "Numpad 4"
 msgstr ""
 
-#: ardour_ui_ed.cc:344
+#: ardour_ui_ed.cc:450
 msgid "Numpad 5"
 msgstr ""
 
-#: ardour_ui_ed.cc:347
+#: ardour_ui_ed.cc:453
 msgid "Numpad 6"
 msgstr ""
 
-#: ardour_ui_ed.cc:350
+#: ardour_ui_ed.cc:456
 msgid "Numpad 7"
 msgstr ""
 
-#: ardour_ui_ed.cc:353
+#: ardour_ui_ed.cc:459
 msgid "Numpad 8"
 msgstr ""
 
-#: ardour_ui_ed.cc:356
+#: ardour_ui_ed.cc:462
 msgid "Numpad 9"
 msgstr ""
 
-#: ardour_ui_ed.cc:360
+#: ardour_ui_ed.cc:466
 msgid "Focus On Clock"
 msgstr ""
 
-#: ardour_ui_ed.cc:364 ardour_ui_ed.cc:373 audio_clock.cc:2091 editor.cc:258
-#: editor_actions.cc:569 editor_actions.cc:578 export_timespan_selector.cc:88
+#: ardour_ui_ed.cc:470 ardour_ui_ed.cc:479 audio_clock.cc:2122 editor.cc:321
+#: editor_actions.cc:610 editor_actions.cc:619 export_timespan_selector.cc:85
 #: session_option_editor.cc:41 session_option_editor.cc:61
 #: session_option_editor.cc:80 session_option_editor.cc:96
 #: session_option_editor.cc:109 session_option_editor.cc:122
@@ -1947,257 +2324,274 @@ msgstr ""
 msgid "Timecode"
 msgstr ""
 
-#: ardour_ui_ed.cc:366 ardour_ui_ed.cc:375 editor_actions.cc:567
+#: ardour_ui_ed.cc:472 ardour_ui_ed.cc:481 editor_actions.cc:608
 msgid "Bars & Beats"
 msgstr ""
 
-#: ardour_ui_ed.cc:368 ardour_ui_ed.cc:377
+#: ardour_ui_ed.cc:474 ardour_ui_ed.cc:483
 msgid "Minutes & Seconds"
 msgstr ""
 
-#: ardour_ui_ed.cc:370 ardour_ui_ed.cc:379 audio_clock.cc:2095 editor.cc:259
-#: editor_actions.cc:568
+#: ardour_ui_ed.cc:476 ardour_ui_ed.cc:485 audio_clock.cc:2125 editor.cc:322
+#: editor_actions.cc:609
 msgid "Samples"
 msgstr ""
 
-#: ardour_ui_ed.cc:382
+#: ardour_ui_ed.cc:488
 msgid "Punch In"
 msgstr ""
 
-#: ardour_ui_ed.cc:383 mixer_strip.cc:1819 mixer_strip.cc:1843
-#: mixer_strip.cc:2007 route_ui.cc:162 time_info_box.cc:116
+#: ardour_ui_ed.cc:489 mixer_strip.cc:1992 mixer_strip.cc:2193 route_ui.cc:187
+#: time_info_box.cc:110
 msgid "In"
 msgstr "Entrada"
 
-#: ardour_ui_ed.cc:386
+#: ardour_ui_ed.cc:492
 msgid "Punch Out"
 msgstr ""
 
-#: ardour_ui_ed.cc:387 mixer_strip.cc:1831 time_info_box.cc:117
+#: ardour_ui_ed.cc:493 mixer_strip.cc:2004 time_info_box.cc:111
 msgid "Out"
 msgstr "Saída"
 
-#: ardour_ui_ed.cc:390
+#: ardour_ui_ed.cc:496
 msgid "Punch In/Out"
 msgstr ""
 
-#: ardour_ui_ed.cc:391
+#: ardour_ui_ed.cc:497
 msgid "In/Out"
 msgstr ""
 
-#: ardour_ui_ed.cc:394 rc_option_editor.cc:1376
+#: ardour_ui_ed.cc:500 rc_option_editor.cc:1941
 msgid "Click"
 msgstr "Metrónomo"
 
-#: ardour_ui_ed.cc:397
+#: ardour_ui_ed.cc:503
 msgid "Auto Input"
 msgstr ""
 
-#: ardour_ui_ed.cc:400
+#: ardour_ui_ed.cc:506
 msgid "Auto Play"
 msgstr ""
 
-#: ardour_ui_ed.cc:411
+#: ardour_ui_ed.cc:517
 msgid "Sync Startup to Video"
 msgstr ""
 
-#: ardour_ui_ed.cc:413
+#: ardour_ui_ed.cc:519
 msgid "Time Master"
 msgstr ""
 
-#: ardour_ui_ed.cc:420
+#: ardour_ui_ed.cc:521
+msgid "Use External Positional Sync Source"
+msgstr ""
+
+#: ardour_ui_ed.cc:526
 msgid "Toggle Record Enable Track %1"
 msgstr ""
 
-#: ardour_ui_ed.cc:427
+#: ardour_ui_ed.cc:533
 msgid "Percentage"
 msgstr "Percentagem"
 
-#: ardour_ui_ed.cc:428 shuttle_control.cc:178
+#: ardour_ui_ed.cc:534 shuttle_control.cc:205
 msgid "Semitones"
 msgstr "Semi-tons"
 
-#: ardour_ui_ed.cc:432
+#: ardour_ui_ed.cc:538
 msgid "Send MTC"
 msgstr "Enviar MTC"
 
-#: ardour_ui_ed.cc:434
+#: ardour_ui_ed.cc:540
 msgid "Send MMC"
 msgstr "Enviar MMC"
 
-#: ardour_ui_ed.cc:436
+#: ardour_ui_ed.cc:542
 msgid "Use MMC"
 msgstr "Usar MMC"
 
-#: ardour_ui_ed.cc:438 rc_option_editor.cc:2097
+#: ardour_ui_ed.cc:544 rc_option_editor.cc:2730
 msgid "Send MIDI Clock"
 msgstr ""
 
-#: ardour_ui_ed.cc:440
+#: ardour_ui_ed.cc:546
 msgid "Send MIDI Feedback"
 msgstr ""
 
-#: ardour_ui_ed.cc:446
+#: ardour_ui_ed.cc:552
 msgid "Panic"
 msgstr ""
 
-#: ardour_ui_ed.cc:534
+#: ardour_ui_ed.cc:629
 msgid "Wall Clock"
 msgstr ""
 
-#: ardour_ui_ed.cc:536
+#: ardour_ui_ed.cc:631
 msgid "Disk Space"
 msgstr ""
 
-#: ardour_ui_ed.cc:537
+#: ardour_ui_ed.cc:632
 msgid "DSP"
 msgstr ""
 
-#: ardour_ui_ed.cc:538
+#: ardour_ui_ed.cc:633
+msgid "X-run"
+msgstr ""
+
+#: ardour_ui_ed.cc:634
+msgid "Active Peak-file Work"
+msgstr ""
+
+#: ardour_ui_ed.cc:635
 msgid "Buffers"
 msgstr ""
 
-#: ardour_ui_ed.cc:540
+#: ardour_ui_ed.cc:637
 msgid "Timecode Format"
 msgstr ""
 
-#: ardour_ui_ed.cc:541
+#: ardour_ui_ed.cc:638
 msgid "File Format"
 msgstr ""
 
-#: ardour_ui_options.cc:63
+#: ardour_ui_options.cc:55
 msgid ""
 "It is not possible to use JACK as the the sync source\n"
 "when the pull up/down setting is non-zero."
 msgstr ""
 
-#: ardour_ui_options.cc:317
+#: ardour_ui_options.cc:309
 msgid "Internal"
 msgstr "Interno"
 
-#: ardour_ui_options.cc:498
+#: ardour_ui_options.cc:518
 msgid "Enable/Disable external positional sync"
 msgstr ""
 
-#: ardour_ui_options.cc:500
+#: ardour_ui_options.cc:520
 msgid "Sync to JACK is not possible: video pull up/down is set"
 msgstr ""
 
-#: audio_clock.cc:1047 audio_clock.cc:1066
+#: audio_clock.cc:1057 audio_clock.cc:1076
 msgid "--pending--"
 msgstr ""
 
-#: audio_clock.cc:1118
+#: audio_clock.cc:1128
 msgid "SR"
 msgstr ""
 
-#: audio_clock.cc:1124 audio_clock.cc:1128
+#: audio_clock.cc:1134 audio_clock.cc:1138
 msgid "Pull"
 msgstr ""
 
-#: audio_clock.cc:1126
+#: audio_clock.cc:1136
 #, c-format
 msgid "%+.4f%%"
 msgstr ""
 
-#: audio_clock.cc:1282 editor.cc:260 editor_actions.cc:139
-#: editor_actions.cc:561
+#: audio_clock.cc:1292 editor.cc:323 editor_actions.cc:142
+#: editor_actions.cc:602
 msgid "Tempo"
 msgstr ""
 
-#: audio_clock.cc:1286 editor.cc:261 editor_actions.cc:562
+#: audio_clock.cc:1296 editor.cc:324 editor_actions.cc:603
 msgid "Meter"
 msgstr "VUímetro"
 
-#: audio_clock.cc:1864 audio_streamview.cc:115 editor_actions.cc:1089
-#: session_metadata_dialog.cc:452 session_metadata_dialog.cc:500
-#: session_metadata_dialog.cc:556 session_metadata_dialog.cc:845
-#: streamview.cc:470
+#: audio_clock.cc:1878 audio_streamview.cc:117 editor_actions.cc:1092
+#: luainstance.cc:959 luainstance.cc:1575 plugin_pin_dialog.cc:859
+#: plugin_selector.cc:995 plugin_selector.cc:1016
+#: session_metadata_dialog.cc:455 session_metadata_dialog.cc:503
+#: session_metadata_dialog.cc:559 session_metadata_dialog.cc:848
+#: streamview.cc:474
 msgid "programming error: %1"
 msgstr ""
 
-#: audio_clock.cc:1997 audio_clock.cc:2025
+#: audio_clock.cc:2011 audio_clock.cc:2039
 msgid "programming error: %1 %2"
 msgstr ""
 
-#: audio_clock.cc:2093 editor.cc:257 export_timespan_selector.cc:98
+#: audio_clock.cc:2123 editor.cc:320 export_timespan_selector.cc:95
 msgid "Bars:Beats"
 msgstr "Comp:Bat"
 
-#: audio_clock.cc:2094 export_timespan_selector.cc:93
+#: audio_clock.cc:2124 export_timespan_selector.cc:90
 msgid "Minutes:Seconds"
 msgstr "Mins:Segs"
 
-#: audio_clock.cc:2099
-msgid "Set From Playhead"
+#: audio_clock.cc:2129
+msgid "Set from Playhead"
 msgstr ""
 
-#: audio_clock.cc:2100
+#: audio_clock.cc:2130
 msgid "Locate to This Time"
 msgstr ""
 
-#: audio_region_editor.cc:64 control_point_dialog.cc:49 rhythm_ferret.cc:124
-#: rhythm_ferret.cc:129 rhythm_ferret.cc:134
+#: audio_clock.cc:2133
+msgid "Copy to clipboard"
+msgstr ""
+
+#: audio_region_editor.cc:60 control_point_dialog.cc:49 rhythm_ferret.cc:137
+#: rhythm_ferret.cc:154
 msgid "dB"
 msgstr ""
 
-#: audio_region_editor.cc:67
+#: audio_region_editor.cc:63
 msgid "Region gain:"
 msgstr ""
 
-#: audio_region_editor.cc:77 export_format_dialog.cc:43
+#: audio_region_editor.cc:73 export_format_dialog.cc:49 export_report.cc:772
+#: export_report.cc:1185 fft_graph.cc:370
 msgid "dBFS"
 msgstr ""
 
-#: audio_region_editor.cc:80
+#: audio_region_editor.cc:76
 msgid "Peak amplitude:"
 msgstr ""
 
-#: audio_region_editor.cc:91
+#: audio_region_editor.cc:87
 msgid "Calculating..."
 msgstr ""
 
-#: audio_region_view.cc:1243
+#: audio_region_view.cc:1385
 msgid "add gain control point"
 msgstr "acrescentar ponto de controlo"
 
-#: automation_controller.cc:286 automation_controller.cc:302
+#: automation_controller.cc:304 automation_controller.cc:320
 msgid "Select Note..."
 msgstr ""
 
-#: automation_controller.cc:293
+#: automation_controller.cc:311
 msgid "Halve"
 msgstr ""
 
-#: automation_controller.cc:296
+#: automation_controller.cc:314
 msgid "Double"
 msgstr ""
 
-#: automation_controller.cc:307
-msgid "Set to %1 beat(s)"
-msgstr ""
+#: automation_controller.cc:325
+msgid "Set to %1 beat"
+msgid_plural "Set to %1 beats"
+msgstr[0] ""
+msgstr[1] ""
 
-#: automation_line.cc:286 automation_line.cc:462
+#: automation_line.cc:292 editor_drag.cc:4388
 msgid "automation event move"
 msgstr "mover evento de automatização"
 
-#: automation_line.cc:488 automation_line.cc:508
-msgid "automation range move"
-msgstr ""
-
-#: automation_line.cc:880 region_gain_line.cc:72
+#: automation_line.cc:888 region_gain_line.cc:75
 msgid "remove control point"
 msgstr "remover ponto de controlo"
 
-#: automation_line.cc:1003
+#: automation_line.cc:1013
 msgid "Ignoring illegal points on AutomationLine \"%1\""
 msgstr ""
 
-#: automation_region_view.cc:190 automation_time_axis.cc:644
+#: automation_region_view.cc:193 automation_time_axis.cc:649
 msgid "add automation event"
 msgstr ""
 
-#: automation_streamview.cc:95
+#: automation_streamview.cc:94
 msgid "unable to display automation region for control without list"
 msgstr ""
 
@@ -2209,63 +2603,59 @@ msgstr "estado de automatização"
 msgid "hide track"
 msgstr "esconder faixa"
 
-#: automation_time_axis.cc:308 automation_time_axis.cc:360
-#: automation_time_axis.cc:554 gain_meter.cc:220 generic_pluginui.cc:523
-#: generic_pluginui.cc:817 panner_ui.cc:151
+#: automation_time_axis.cc:310 automation_time_axis.cc:362
+#: automation_time_axis.cc:556 gain_meter.cc:230 generic_pluginui.cc:590
+#: generic_pluginui.cc:934 panner_ui.cc:151
 msgid "Automation|Manual"
 msgstr ""
 
-#: automation_time_axis.cc:310 automation_time_axis.cc:371
-#: automation_time_axis.cc:559 editor.cc:1904 editor.cc:1981
-#: editor_actions.cc:122 editor_actions.cc:1920 gain_meter.cc:223
-#: generic_pluginui.cc:99 generic_pluginui.cc:526 generic_pluginui.cc:819
-#: midi_time_axis.cc:1606 midi_time_axis.cc:1609 midi_time_axis.cc:1612
+#: automation_time_axis.cc:312 automation_time_axis.cc:373
+#: automation_time_axis.cc:561 editor.cc:2033 editor.cc:2111
+#: editor_actions.cc:125 editor_actions.cc:1937 gain_meter.cc:232
+#: generic_pluginui.cc:100 generic_pluginui.cc:593 generic_pluginui.cc:936
+#: midi_time_axis.cc:1610 midi_time_axis.cc:1613 midi_time_axis.cc:1616
 #: panner_ui.cc:154
 msgid "Play"
 msgstr "Reprodução"
 
-#: automation_time_axis.cc:312 automation_time_axis.cc:382
-#: automation_time_axis.cc:564 gain_meter.cc:226 generic_pluginui.cc:101
-#: generic_pluginui.cc:529 generic_pluginui.cc:821 panner_ui.cc:157
+#: automation_time_axis.cc:314 automation_time_axis.cc:384
+#: automation_time_axis.cc:566 gain_meter.cc:234 generic_pluginui.cc:102
+#: generic_pluginui.cc:596 generic_pluginui.cc:938 panner_ui.cc:157
 msgid "Write"
 msgstr "Escrita"
 
-#: automation_time_axis.cc:314 automation_time_axis.cc:393
-#: automation_time_axis.cc:569 gain_meter.cc:229 generic_pluginui.cc:103
-#: generic_pluginui.cc:532 generic_pluginui.cc:823 panner_ui.cc:160
+#: automation_time_axis.cc:316 automation_time_axis.cc:395
+#: automation_time_axis.cc:571 gain_meter.cc:236 generic_pluginui.cc:104
+#: generic_pluginui.cc:599 generic_pluginui.cc:940 panner_ui.cc:160
 msgid "Touch"
 msgstr "Tocar"
 
-#: automation_time_axis.cc:404 generic_pluginui.cc:535 meter_patterns.cc:112
+#: automation_time_axis.cc:406 generic_pluginui.cc:602 meter_patterns.cc:118
 msgid "???"
 msgstr ""
 
-#: automation_time_axis.cc:445
+#: automation_time_axis.cc:447
 msgid "clear automation"
 msgstr "apagar automatizações"
 
-#: automation_time_axis.cc:543 editor_actions.cc:645 editor_markers.cc:902
-#: location_ui.cc:57 plugin_selector.cc:86 route_time_axis.cc:854
-msgid "Hide"
-msgstr "Esconder"
-
-#: automation_time_axis.cc:545
+#: automation_time_axis.cc:547 rc_option_editor.cc:2916
+#: rc_option_editor.cc:2921 rc_option_editor.cc:2967 rc_option_editor.cc:2972
 msgid "Clear"
 msgstr "Apagar"
 
-#: automation_time_axis.cc:576
+#: automation_time_axis.cc:578
 msgid "State"
 msgstr "Estado"
 
-#: automation_time_axis.cc:592
+#: automation_time_axis.cc:594
 msgid "Discrete"
 msgstr ""
 
-#: automation_time_axis.cc:598 export_format_dialog.cc:485
+#: automation_time_axis.cc:600 export_format_dialog.cc:552
 msgid "Linear"
 msgstr ""
 
-#: automation_time_axis.cc:604 rhythm_ferret.cc:109 shuttle_control.cc:197
+#: automation_time_axis.cc:606 rhythm_ferret.cc:118 shuttle_control.cc:224
 msgid "Mode"
 msgstr "Modo"
 
@@ -2281,35 +2671,38 @@ msgstr ""
 msgid "Direction:"
 msgstr ""
 
-#: bundle_manager.cc:206 bundle_manager.cc:210 engine_dialog.cc:662
-#: mixer_strip.cc:162 mixer_strip.cc:367 mixer_strip.cc:2240
-#: rc_option_editor.cc:2326
+#: bundle_manager.cc:206 bundle_manager.cc:210 engine_dialog.cc:976
+#: mixer_strip.cc:175 mixer_strip.cc:392 mixer_strip.cc:2451
+#: rc_option_editor.cc:3135
 msgid "Input"
 msgstr "Entradas"
 
 #: bundle_manager.cc:207 bundle_manager.cc:212 bundle_manager.cc:246
-#: engine_dialog.cc:664 mixer_strip.cc:166 mixer_strip.cc:371
-#: mixer_strip.cc:2243 rc_option_editor.cc:2330
+#: engine_dialog.cc:978 mixer_strip.cc:179 mixer_strip.cc:396
+#: mixer_strip.cc:2454 monitor_section.cc:296 monitor_section.cc:300
+#: rc_option_editor.cc:3139
 msgid "Output"
 msgstr "Saída"
 
-#: bundle_manager.cc:265 editor.cc:1945 editor_actions.cc:94
-#: editor_actions.cc:104 rc_option_editor.cc:1087 rc_option_editor.cc:1094
+#: bundle_manager.cc:265 editor.cc:2075 editor_actions.cc:97
+#: editor_actions.cc:107 lua_script_manager.cc:33 rc_option_editor.cc:2928
+#: rc_option_editor.cc:2942
 msgid "Edit"
 msgstr "Editar"
 
-#: bundle_manager.cc:266 editor.cc:5902 editor.cc:5930 editor_actions.cc:338
-#: editor_actions.cc:339 editor_actions.cc:405 plugin_ui.cc:420
-#: processor_box.cc:2458 route_time_axis.cc:859
+#: bundle_manager.cc:266 editor.cc:5962 editor.cc:5992 editor_actions.cc:360
+#: editor_actions.cc:361 luawindow.cc:101 plugin_ui.cc:420
+#: processor_box.cc:3669 processor_box.cc:3671
 msgid "Delete"
 msgstr "Eliminar"
 
-#: bundle_manager.cc:272 bundle_manager.cc:439 editor_route_groups.cc:97
-#: editor_routes.cc:206 midi_list_editor.cc:107 session_metadata_dialog.cc:646
+#: bundle_manager.cc:272 bundle_manager.cc:439 editor_route_groups.cc:98
+#: editor_routes.cc:233 lua_script_manager.cc:42 lua_script_manager.cc:76
+#: midi_list_editor.cc:107 session_metadata_dialog.cc:649
 msgid "Name"
 msgstr "Nome"
 
-#: bundle_manager.cc:283
+#: bundle_manager.cc:283 luawindow.cc:566
 msgid "New"
 msgstr "Novo"
 
@@ -2325,6 +2718,39 @@ msgstr ""
 msgid "Rename Channel"
 msgstr ""
 
+#: color_theme_manager.cc:58
+msgid "Restore Defaults"
+msgstr ""
+
+#: color_theme_manager.cc:62
+msgid "Color Theme"
+msgstr ""
+
+#: color_theme_manager.cc:126
+msgid "Object"
+msgstr "Objecto"
+
+#: color_theme_manager.cc:129 route_group_dialog.cc:53
+#: route_group_dialog.cc:81
+msgid "Color"
+msgstr "Cor"
+
+#: color_theme_manager.cc:151
+msgid "Items"
+msgstr ""
+
+#: color_theme_manager.cc:152
+msgid "Palette"
+msgstr ""
+
+#: color_theme_manager.cc:153
+msgid "Transparency"
+msgstr ""
+
+#: color_theme_manager.cc:475
+msgid "Color Palette"
+msgstr ""
+
 #: configinfo.cc:28
 msgid "Build Configuration"
 msgstr ""
@@ -2337,6 +2763,42 @@ msgstr ""
 msgid "Value"
 msgstr "Valor"
 
+#: control_slave_ui.cc:50 mixer_ui.cc:254
+msgid "Control Masters"
+msgstr ""
+
+#: control_slave_ui.cc:54
+msgid "-vca-"
+msgstr ""
+
+#: control_slave_ui.cc:211
+msgid "Unassign All"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:35
+msgid "Duplicate Tracks & Busses"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:36
+msgid "Copy playlists"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:37
+msgid "Create new (empty) playlists"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:38
+msgid "Share playlists"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:41
+msgid "Duplicate each track/bus this number of times:"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:176
+msgid "1 or more tracks/busses could not be duplicated"
+msgstr ""
+
 #: edit_note_dialog.cc:42
 msgid "Note"
 msgstr ""
@@ -2374,2060 +2836,2155 @@ msgstr ""
 msgid "Velocity"
 msgstr ""
 
-#: edit_note_dialog.cc:88 patch_change_dialog.cc:66
+#: edit_note_dialog.cc:88 export_report.cc:246 export_report.cc:688
+#: patch_change_dialog.cc:66
 msgid "Time"
 msgstr ""
 
-#: edit_note_dialog.cc:98 editor_regions.cc:115
-#: export_timespan_selector.cc:378 export_timespan_selector.cc:440
-#: location_ui.cc:320 midi_list_editor.cc:115 time_info_box.cc:108
+#: edit_note_dialog.cc:99 editor_regions.cc:162
+#: export_timespan_selector.cc:375 export_timespan_selector.cc:437
+#: location_ui.cc:322 midi_list_editor.cc:115 time_info_box.cc:102
 msgid "Length"
 msgstr ""
 
-#: edit_note_dialog.cc:165
+#: edit_note_dialog.cc:166
 msgid "edit note"
 msgstr ""
 
-#: editor.cc:147
+#: editor.cc:160
 msgid "CD Frames"
 msgstr "Quadros CD"
 
-#: editor.cc:148
+#: editor.cc:161
 msgid "TC Frames"
 msgstr ""
 
-#: editor.cc:149
+#: editor.cc:162
 msgid "TC Seconds"
 msgstr ""
 
-#: editor.cc:150
+#: editor.cc:163
 msgid "TC Minutes"
 msgstr ""
 
-#: editor.cc:151
+#: editor.cc:164
 msgid "Seconds"
 msgstr "Segundos"
 
-#: editor.cc:152
+#: editor.cc:165
 msgid "Minutes"
 msgstr "Minutos"
 
-#: editor.cc:153 quantize_dialog.cc:37 quantize_dialog.cc:141
+#: editor.cc:166 quantize_dialog.cc:37
 msgid "Beats/128"
 msgstr ""
 
-#: editor.cc:154 quantize_dialog.cc:38 quantize_dialog.cc:143
+#: editor.cc:167 quantize_dialog.cc:38
 msgid "Beats/64"
 msgstr ""
 
-#: editor.cc:155 quantize_dialog.cc:39 quantize_dialog.cc:145
+#: editor.cc:168 quantize_dialog.cc:39
 msgid "Beats/32"
 msgstr "Batimentos/32"
 
-#: editor.cc:156
+#: editor.cc:169 quantize_dialog.cc:40
 msgid "Beats/28"
 msgstr ""
 
-#: editor.cc:157
+#: editor.cc:170 quantize_dialog.cc:41
 msgid "Beats/24"
 msgstr ""
 
-#: editor.cc:158
+#: editor.cc:171 quantize_dialog.cc:42
 msgid "Beats/20"
 msgstr ""
 
-#: editor.cc:159 quantize_dialog.cc:40 quantize_dialog.cc:147
+#: editor.cc:172 quantize_dialog.cc:43
 msgid "Beats/16"
 msgstr "Batimentos/16"
 
-#: editor.cc:160
+#: editor.cc:173 quantize_dialog.cc:44
 msgid "Beats/14"
 msgstr ""
 
-#: editor.cc:161
+#: editor.cc:174 quantize_dialog.cc:45
 msgid "Beats/12"
 msgstr ""
 
-#: editor.cc:162
+#: editor.cc:175 quantize_dialog.cc:46
 msgid "Beats/10"
 msgstr ""
 
-#: editor.cc:163 quantize_dialog.cc:41 quantize_dialog.cc:149
+#: editor.cc:176 quantize_dialog.cc:47
 msgid "Beats/8"
 msgstr "Batimentos/8"
 
-#: editor.cc:164
+#: editor.cc:177 quantize_dialog.cc:48
 msgid "Beats/7"
 msgstr ""
 
-#: editor.cc:165
+#: editor.cc:178 quantize_dialog.cc:49
 msgid "Beats/6"
 msgstr ""
 
-#: editor.cc:166
+#: editor.cc:179 quantize_dialog.cc:50
 msgid "Beats/5"
 msgstr ""
 
-#: editor.cc:167 quantize_dialog.cc:42 quantize_dialog.cc:151
+#: editor.cc:180 quantize_dialog.cc:51
 msgid "Beats/4"
 msgstr "Batimentos/4"
 
-#: editor.cc:168 quantize_dialog.cc:43 quantize_dialog.cc:153
+#: editor.cc:181 quantize_dialog.cc:52
 msgid "Beats/3"
 msgstr "Batimentos/3"
 
-#: editor.cc:169 quantize_dialog.cc:44 quantize_dialog.cc:155
+#: editor.cc:182 quantize_dialog.cc:53
 msgid "Beats/2"
 msgstr ""
 
-#: editor.cc:170 quantize_dialog.cc:45 quantize_dialog.cc:157
+#: editor.cc:183 quantize_dialog.cc:54
 msgid "Beats"
 msgstr "Batimentos"
 
-#: editor.cc:171
+#: editor.cc:184
 msgid "Bars"
 msgstr "Compassos"
 
-#: editor.cc:172
+#: editor.cc:185
 msgid "Marks"
 msgstr "Marcadores"
 
-#: editor.cc:173
+#: editor.cc:186
 msgid "Region starts"
 msgstr "Inícios de região"
 
-#: editor.cc:174
+#: editor.cc:187
 msgid "Region ends"
 msgstr "Finais de região"
 
-#: editor.cc:175
+#: editor.cc:188
 msgid "Region syncs"
 msgstr "Sincronismos de região"
 
-#: editor.cc:176
+#: editor.cc:189
 msgid "Region bounds"
 msgstr "Extremos de região"
 
-#: editor.cc:181 editor_actions.cc:510
+#: editor.cc:194 editor_actions.cc:551
 msgid "No Grid"
 msgstr ""
 
-#: editor.cc:182 editor_actions.cc:511
+#: editor.cc:195 editor_actions.cc:552
 msgid "Grid"
 msgstr ""
 
-#: editor.cc:183 editor_actions.cc:512
+#: editor.cc:196 editor_actions.cc:553
 msgid "Magnetic"
 msgstr "Magnético"
 
-#: editor.cc:188 editor.cc:206 editor_actions.cc:121 editor_actions.cc:493
+#: editor.cc:201 editor.cc:219 editor_actions.cc:124 editor_actions.cc:534
 msgid "Playhead"
 msgstr "Cursor de reprodução"
 
-#: editor.cc:189 editor_actions.cc:495
+#: editor.cc:202 editor_actions.cc:536
 msgid "Marker"
 msgstr "Marcador"
 
-#: editor.cc:190 editor.cc:207 editor_actions.cc:494
+#: editor.cc:203 editor.cc:220 editor_actions.cc:535
 msgid "Mouse"
 msgstr ""
 
-#: editor.cc:195 editor_actions.cc:502
+#: editor.cc:208 editor_actions.cc:543
 msgid "Slide"
 msgstr "Deslizar"
 
-#: editor.cc:196
+#: editor.cc:209
 msgid "Splice"
 msgstr "Reunir"
 
-#: editor.cc:197 editor_actions.cc:501
+#: editor.cc:210 editor_actions.cc:542
 msgid "Ripple"
 msgstr ""
 
-#: editor.cc:198 editor_actions.cc:157 editor_actions.cc:503
-#: editor_actions.cc:1789 editor_markers.cc:905 editor_rulers.cc:260
-#: location_ui.cc:58 mixer_strip.cc:195 mixer_strip.cc:2028
+#: editor.cc:211 editor_actions.cc:1806 editor_markers.cc:910
+#: editor_rulers.cc:259 location_ui.cc:62
 msgid "Lock"
 msgstr "Bloquear"
 
-#: editor.cc:203 mono_panner_editor.cc:42
+#: editor.cc:216 mono_panner_editor.cc:44
 msgid "Left"
 msgstr "Esquerda"
 
-#: editor.cc:204 mono_panner_editor.cc:47
+#: editor.cc:217 mono_panner_editor.cc:49
 msgid "Right"
 msgstr "Direita"
 
-#: editor.cc:205
+#: editor.cc:218
 msgid "Center"
 msgstr "Centro"
 
-#: editor.cc:208 editor.cc:3231
+#: editor.cc:221
 msgid "Edit point"
 msgstr ""
 
-#: editor.cc:214
+#: editor.cc:227
 msgid "Mushy"
 msgstr ""
 
-#: editor.cc:215
+#: editor.cc:228
 msgid "Smooth"
 msgstr ""
 
-#: editor.cc:216
+#: editor.cc:229
 msgid "Balanced multitimbral mixture"
 msgstr ""
 
-#: editor.cc:217
+#: editor.cc:230
 msgid "Unpitched percussion with stable notes"
 msgstr ""
 
-#: editor.cc:218
+#: editor.cc:231
 msgid "Crisp monophonic instrumental"
 msgstr ""
 
-#: editor.cc:219
+#: editor.cc:232
 msgid "Unpitched solo percussion"
 msgstr ""
 
-#: editor.cc:220
+#: editor.cc:233
 msgid "Resample without preserving pitch"
 msgstr ""
 
-#: editor.cc:256
+#: editor.cc:319
 msgid "Mins:Secs"
 msgstr "Mins:Segs"
 
-#: editor.cc:262
+#: editor.cc:325
 msgid "Location Markers"
 msgstr "Marcadores de localização"
 
-#: editor.cc:263
+#: editor.cc:326
 msgid "Range Markers"
 msgstr "Marcadores de intervalo"
 
-#: editor.cc:264
+#: editor.cc:327
 msgid "Loop/Punch Ranges"
 msgstr "Ciclos/inserção"
 
-#: editor.cc:265 editor_actions.cc:565
+#: editor.cc:328 editor_actions.cc:606
 msgid "CD Markers"
 msgstr ""
 
-#: editor.cc:266
+#: editor.cc:329
 msgid "Video Timeline"
 msgstr ""
 
-#: editor.cc:283
+#: editor.cc:386
 msgid "mode"
 msgstr "modo"
 
-#: editor.cc:459 editor_actions.cc:114 editor_actions.cc:564
+#: editor.cc:535 editor_actions.cc:117 editor_actions.cc:605
 msgid "Markers"
 msgstr ""
 
-#: editor.cc:577 rc_option_editor.cc:1939
+#: editor.cc:653 rc_option_editor.cc:2527
 msgid "Regions"
 msgstr "Regiões"
 
-#: editor.cc:578
+#: editor.cc:654
 msgid "Tracks & Busses"
 msgstr ""
 
-#: editor.cc:579
+#: editor.cc:655
 msgid "Snapshots"
 msgstr "Capturas"
 
-#: editor.cc:580
+#: editor.cc:656
 msgid "Track & Bus Groups"
 msgstr ""
 
-#: editor.cc:581
+#: editor.cc:657
 msgid "Ranges & Marks"
 msgstr ""
 
-#: editor.cc:728 editor.cc:5754 rc_option_editor.cc:1619
-#: rc_option_editor.cc:1627 rc_option_editor.cc:1635 rc_option_editor.cc:1643
-#: rc_option_editor.cc:1667 rc_option_editor.cc:1679 rc_option_editor.cc:1681
-#: rc_option_editor.cc:1689 rc_option_editor.cc:1697 rc_option_editor.cc:1717
-#: rc_option_editor.cc:1729 rc_option_editor.cc:1731 rc_option_editor.cc:1733
-#: rc_option_editor.cc:1741 rc_option_editor.cc:1749 rc_option_editor.cc:1757
-#: rc_option_editor.cc:1772 rc_option_editor.cc:1776 rc_option_editor.cc:1800
-msgid "Editor"
-msgstr ""
-
-#: editor.cc:1331 editor.cc:4735 editor_actions.cc:134 editor_actions.cc:1865
+#: editor.cc:1333 editor.cc:4737 editor_actions.cc:137 editor_actions.cc:1882
 msgid "Loop"
 msgstr "Ciclo"
 
-#: editor.cc:1337 editor.cc:4762 editor_actions.cc:135 time_info_box.cc:68
+#: editor.cc:1339 editor.cc:4764 editor_actions.cc:138 time_info_box.cc:62
 msgid "Punch"
 msgstr "Inserção"
 
-#: editor.cc:1449 rc_option_editor.cc:1661
+#: editor.cc:1474 rc_option_editor.cc:2299
 msgid "Linear (for highly correlated material)"
 msgstr ""
 
-#: editor.cc:1459 rc_option_editor.cc:1662
+#: editor.cc:1484 rc_option_editor.cc:2300
 msgid "Constant power"
 msgstr ""
 
-#: editor.cc:1468 rc_option_editor.cc:1663
+#: editor.cc:1493 rc_option_editor.cc:2301
 msgid "Symmetric"
 msgstr ""
 
-#: editor.cc:1478 rc_option_editor.cc:1664
+#: editor.cc:1503 rc_option_editor.cc:2302
 msgid "Slow"
 msgstr "Lento"
 
-#: editor.cc:1487 rc_option_editor.cc:1665 sfdb_ui.cc:1771 sfdb_ui.cc:1881
+#: editor.cc:1512 rc_option_editor.cc:2303 sfdb_ui.cc:1737 sfdb_ui.cc:1847
 msgid "Fast"
 msgstr "Rápido"
 
-#: editor.cc:1509 editor.cc:1534
+#: editor.cc:1534 editor.cc:1559
 msgid "Deactivate"
 msgstr "Desactivar"
 
-#: editor.cc:1511 editor.cc:1536
+#: editor.cc:1536 editor.cc:1561
 msgid "Activate"
 msgstr "Activar"
 
-#: editor.cc:1637 editor.cc:1645 editor_ops.cc:3824
+#: editor.cc:1662 editor.cc:1670 editor_ops.cc:3921
 msgid "Freeze"
 msgstr "Congelar"
 
-#: editor.cc:1641
+#: editor.cc:1666
 msgid "Unfreeze"
 msgstr "Descongelar"
 
-#: editor.cc:1780
+#: editor.cc:1766
+msgid "Region Loudness Analysis"
+msgstr ""
+
+#: editor.cc:1785 editor.cc:1834
+msgid "Audio Report/Analysis"
+msgstr ""
+
+#: editor.cc:1815
+msgid "Range Loudness Analysis"
+msgstr ""
+
+#: editor.cc:1901
 msgid "Selected Regions"
 msgstr ""
 
-#: editor.cc:1816 editor_markers.cc:940
+#: editor.cc:1945 editor_markers.cc:945
 msgid "Play Range"
 msgstr ""
 
-#: editor.cc:1817 editor_markers.cc:943
+#: editor.cc:1946 editor_markers.cc:948
 msgid "Loop Range"
 msgstr "Intervalo cíclico"
 
-#: editor.cc:1820 editor_markers.cc:950
+#: editor.cc:1949 editor_markers.cc:953
 msgid "Zoom to Range"
 msgstr ""
 
-#: editor.cc:1829 editor_actions.cc:369
+#: editor.cc:1952
+msgid "Loudness Analysis"
+msgstr ""
+
+#: editor.cc:1959 editor_actions.cc:401
 msgid "Move Range Start to Previous Region Boundary"
 msgstr ""
 
-#: editor.cc:1836 editor_actions.cc:376
+#: editor.cc:1966 editor_actions.cc:408
 msgid "Move Range Start to Next Region Boundary"
 msgstr ""
 
-#: editor.cc:1843 editor_actions.cc:383
+#: editor.cc:1973 editor_actions.cc:415
 msgid "Move Range End to Previous Region Boundary"
 msgstr ""
 
-#: editor.cc:1850 editor_actions.cc:390
+#: editor.cc:1980 editor_actions.cc:422
 msgid "Move Range End to Next Region Boundary"
 msgstr ""
 
-#: editor.cc:1856 editor_actions.cc:133 editor_actions.cc:325
+#: editor.cc:1986 editor_actions.cc:136 editor_actions.cc:347
 msgid "Separate"
 msgstr ""
 
-#: editor.cc:1857
+#: editor.cc:1987
 msgid "Convert to Region in Region List"
 msgstr ""
 
-#: editor.cc:1860 editor_markers.cc:970
+#: editor.cc:1990 editor_markers.cc:973
 msgid "Select All in Range"
 msgstr "Seleccionar tudo no intervalo"
 
-#: editor.cc:1863 editor_actions.cc:297
+#: editor.cc:1993 editor_actions.cc:319
 msgid "Set Loop from Selection"
 msgstr ""
 
-#: editor.cc:1864 editor_actions.cc:298
+#: editor.cc:1994 editor_actions.cc:320
 msgid "Set Punch from Selection"
 msgstr ""
 
-#: editor.cc:1865 editor_actions.cc:299
+#: editor.cc:1995 editor_actions.cc:321
 msgid "Set Session Start/End from Selection"
 msgstr ""
 
-#: editor.cc:1868
+#: editor.cc:1998
 msgid "Add Range Markers"
 msgstr "Acrescentar marcadores de intervalo"
 
-#: editor.cc:1871
+#: editor.cc:2001
 msgid "Crop Region to Range"
 msgstr ""
 
-#: editor.cc:1872
-msgid "Fill Range with Region"
-msgstr ""
-
-#: editor.cc:1873 editor_actions.cc:311
+#: editor.cc:2002 editor_actions.cc:333
 msgid "Duplicate Range"
 msgstr "Duplicar intervalo"
 
-#: editor.cc:1876
+#: editor.cc:2005
 msgid "Consolidate Range"
 msgstr ""
 
-#: editor.cc:1877
-msgid "Consolidate Range With Processing"
+#: editor.cc:2006
+msgid "Consolidate Range with Processing"
 msgstr ""
 
-#: editor.cc:1878
+#: editor.cc:2007
 msgid "Bounce Range to Region List"
 msgstr ""
 
-#: editor.cc:1879
-msgid "Bounce Range to Region List With Processing"
+#: editor.cc:2008
+msgid "Bounce Range to Region List with Processing"
 msgstr ""
 
-#: editor.cc:1880 editor_markers.cc:953
+#: editor.cc:2009 editor_markers.cc:956
 msgid "Export Range..."
 msgstr ""
 
-#: editor.cc:1882
+#: editor.cc:2011
 msgid "Export Video Range..."
 msgstr ""
 
-#: editor.cc:1898 editor.cc:1979 editor_actions.cc:303
-msgid "Play From Edit Point"
+#: editor.cc:2027 editor.cc:2109 editor_actions.cc:325
+msgid "Play from Edit Point"
 msgstr ""
 
-#: editor.cc:1899 editor.cc:1980
-msgid "Play From Start"
+#: editor.cc:2028 editor.cc:2110
+msgid "Play from Start"
 msgstr ""
 
-#: editor.cc:1900
+#: editor.cc:2029
 msgid "Play Region"
 msgstr ""
 
-#: editor.cc:1902
+#: editor.cc:2031
 msgid "Loop Region"
 msgstr "Reproduzir região em ciclo"
 
-#: editor.cc:1912 editor.cc:1989
+#: editor.cc:2041 editor.cc:2119
 msgid "Select All in Track"
 msgstr ""
 
-#: editor.cc:1913 editor.cc:1990 editor_actions.cc:194
+#: editor.cc:2042 editor.cc:2120 editor_actions.cc:196
 msgid "Select All Objects"
 msgstr ""
 
-#: editor.cc:1914 editor.cc:1991
+#: editor.cc:2043 editor.cc:2121
 msgid "Invert Selection in Track"
 msgstr ""
 
-#: editor.cc:1915 editor.cc:1992 editor_actions.cc:197
+#: editor.cc:2044 editor.cc:2122 editor_actions.cc:199
 msgid "Invert Selection"
 msgstr ""
 
-#: editor.cc:1917
+#: editor.cc:2046 editor_actions.cc:201
 msgid "Set Range to Loop Range"
 msgstr ""
 
-#: editor.cc:1918
+#: editor.cc:2047 editor_actions.cc:202
 msgid "Set Range to Punch Range"
 msgstr ""
 
-#: editor.cc:1920 editor.cc:1994 editor_actions.cc:199 editor_actions.cc:200
+#: editor.cc:2048 editor_actions.cc:203
+msgid "Set Range to Selected Regions"
+msgstr ""
+
+#: editor.cc:2050 editor.cc:2124 editor_actions.cc:205 editor_actions.cc:206
 msgid "Select All After Edit Point"
 msgstr ""
 
-#: editor.cc:1921 editor.cc:1995 editor_actions.cc:201 editor_actions.cc:202
+#: editor.cc:2051 editor.cc:2125 editor_actions.cc:207 editor_actions.cc:208
 msgid "Select All Before Edit Point"
 msgstr ""
 
-#: editor.cc:1922 editor.cc:1996
+#: editor.cc:2052 editor.cc:2126
 msgid "Select All After Playhead"
 msgstr "Seleccionar tudo após o cursor de reprodução"
 
-#: editor.cc:1923 editor.cc:1997
+#: editor.cc:2053 editor.cc:2127
 msgid "Select All Before Playhead"
 msgstr "Seleccionar tudo antes do cursor de reprodução"
 
-#: editor.cc:1924
+#: editor.cc:2054
 msgid "Select All Between Playhead and Edit Point"
 msgstr ""
 
-#: editor.cc:1925
+#: editor.cc:2055
 msgid "Select All Within Playhead and Edit Point"
 msgstr ""
 
-#: editor.cc:1926
+#: editor.cc:2056
 msgid "Select Range Between Playhead and Edit Point"
 msgstr ""
 
-#: editor.cc:1928 editor.cc:1999 editor_actions.cc:131 editor_actions.cc:132
+#: editor.cc:2058 editor.cc:2129 editor_actions.cc:134 editor_actions.cc:135
 msgid "Select"
 msgstr "Seleccionar"
 
-#: editor.cc:1936 editor.cc:2007 editor_actions.cc:337 processor_box.cc:2451
+#: editor.cc:2066 editor.cc:2137 editor_actions.cc:359 processor_box.cc:3665
 msgid "Cut"
 msgstr "Cortar"
 
-#: editor.cc:1937 editor.cc:2008 editor_actions.cc:341 processor_box.cc:2454
+#: editor.cc:2067 editor.cc:2138 editor_actions.cc:363 processor_box.cc:3667
 msgid "Copy"
 msgstr "Copiar"
 
-#: editor.cc:1938 editor.cc:2009 editor_actions.cc:342 processor_box.cc:2462
+#: editor.cc:2068 editor.cc:2139 editor_actions.cc:364 processor_box.cc:3679
 msgid "Paste"
 msgstr "Colar"
 
-#: editor.cc:1942 editor_actions.cc:91
+#: editor.cc:2072 editor_actions.cc:94
 msgid "Align"
 msgstr "Alinhar"
 
-#: editor.cc:1943
+#: editor.cc:2073
 msgid "Align Relative"
 msgstr "Alinhar relativamente"
 
-#: editor.cc:1950
+#: editor.cc:2080
 msgid "Insert Selected Region"
 msgstr "Inserir regiões seleccionadas"
 
-#: editor.cc:1951
+#: editor.cc:2081
 msgid "Insert Existing Media"
 msgstr ""
 
-#: editor.cc:1960 editor.cc:2016
+#: editor.cc:2090 editor.cc:2146
 msgid "Nudge Entire Track Later"
 msgstr ""
 
-#: editor.cc:1961 editor.cc:2017
+#: editor.cc:2091 editor.cc:2147
 msgid "Nudge Track After Edit Point Later"
 msgstr ""
 
-#: editor.cc:1962 editor.cc:2018
+#: editor.cc:2092 editor.cc:2148
 msgid "Nudge Entire Track Earlier"
 msgstr ""
 
-#: editor.cc:1963 editor.cc:2019
+#: editor.cc:2093 editor.cc:2149
 msgid "Nudge Track After Edit Point Earlier"
 msgstr ""
 
-#: editor.cc:1965 editor.cc:2021
+#: editor.cc:2095 editor.cc:2151
 msgid "Nudge"
 msgstr "Retocar"
 
-#: editor.cc:2235
+#: editor.cc:2353
 msgid ""
 "Playhead position stored with a negative value - ignored (use zero instead)"
 msgstr ""
 
-#: editor.cc:3006 editor.cc:3707 editor.cc:3778 midi_channel_selector.cc:157
+#: editor.cc:3115 editor.cc:3775 editor.cc:3846 midi_channel_selector.cc:157
 #: midi_channel_selector.cc:395 midi_channel_selector.cc:431
 msgid "All"
 msgstr ""
 
-#: editor.cc:3210
-msgid "Smart Mode (add Range functions to Grab mode)"
+#: editor.cc:3280
+msgid "Smart Mode (add range functions to Grab Mode)"
 msgstr ""
 
-#: editor.cc:3211
+#: editor.cc:3281
 msgid "Grab Mode (select/move objects)"
 msgstr ""
 
-#: editor.cc:3212
+#: editor.cc:3282
 msgid "Cut Mode (split regions)"
 msgstr ""
 
-#: editor.cc:3213
+#: editor.cc:3283
 msgid "Range Mode (select time ranges)"
 msgstr ""
 
-#: editor.cc:3214
+#: editor.cc:3284
 msgid "Draw Mode (draw and edit gain/notes/automation)"
 msgstr ""
 
-#: editor.cc:3215
+#: editor.cc:3285
 msgid "Stretch Mode (time-stretch audio and midi regions, preserving pitch)"
 msgstr ""
 
-#: editor.cc:3216
+#: editor.cc:3286
 msgid "Audition Mode (listen to regions)"
 msgstr ""
 
-#: editor.cc:3217
-msgid "Internal Edit Mode (edit notes and gain curves inside regions)"
+#: editor.cc:3287
+msgid "Internal Edit Mode (edit notes and automation points)"
 msgstr ""
 
-#: editor.cc:3218
+#: editor.cc:3288
 msgid ""
 "Groups: click to (de)activate\n"
 "Context-click for other operations"
 msgstr ""
 
-#: editor.cc:3219
+#: editor.cc:3289
 msgid "Nudge Region/Selection Later"
 msgstr ""
 
-#: editor.cc:3220
+#: editor.cc:3290
 msgid "Nudge Region/Selection Earlier"
 msgstr ""
 
-#: editor.cc:3221 editor_actions.cc:262
+#: editor.cc:3291 editor_actions.cc:272
 msgid "Zoom In"
 msgstr "Zoom (+)"
 
-#: editor.cc:3222 editor_actions.cc:261
+#: editor.cc:3292 editor_actions.cc:271
 msgid "Zoom Out"
 msgstr "Zoom (-)"
 
-#: editor.cc:3223
+#: editor.cc:3293
 msgid "Zoom to Time Scale"
 msgstr ""
 
-#: editor.cc:3224 editor.cc:3729 editor_actions.cc:263
+#: editor.cc:3294 editor.cc:3797 editor_actions.cc:273
 msgid "Zoom to Session"
 msgstr "Zoom (sessão)"
 
-#: editor.cc:3225
-msgid "Zoom focus"
-msgstr ""
+#: editor.cc:3295 editor_actions.cc:115 editor_actions.cc:148
+msgid "Zoom Focus"
+msgstr "Zoom (focagem)"
 
-#: editor.cc:3226
+#: editor.cc:3296
 msgid "Expand Tracks"
 msgstr ""
 
-#: editor.cc:3227
+#: editor.cc:3297
 msgid "Shrink Tracks"
 msgstr ""
 
-#: editor.cc:3228
+#: editor.cc:3298
 msgid "Number of visible tracks"
 msgstr ""
 
-#: editor.cc:3229
+#: editor.cc:3299
 msgid "Snap/Grid Units"
 msgstr ""
 
-#: editor.cc:3230
+#: editor.cc:3300
 msgid "Snap/Grid Mode"
 msgstr ""
 
-#: editor.cc:3232
+#: editor.cc:3301 editor_actions.cc:101
+msgid "Edit Point"
+msgstr ""
+
+#: editor.cc:3302
 msgid "Edit Mode"
 msgstr "Modo de edição"
 
-#: editor.cc:3233
+#: editor.cc:3303
 msgid ""
 "Nudge Clock\n"
 "(controls distance used to nudge regions and selections)"
 msgstr ""
 
-#: editor.cc:3501 editor_actions.cc:313
+#: editor.cc:3571 editor_actions.cc:335
 msgid "Command|Undo"
 msgstr ""
 
-#: editor.cc:3503
+#: editor.cc:3573
 msgid "Command|Undo (%1)"
 msgstr ""
 
-#: editor.cc:3510 editor_actions.cc:315 editor_actions.cc:316
-#: editor_actions.cc:317
+#: editor.cc:3580 editor_actions.cc:337 editor_actions.cc:338
+#: editor_actions.cc:339
 msgid "Redo"
 msgstr "Refazer"
 
-#: editor.cc:3512
+#: editor.cc:3583
 msgid "Redo (%1)"
 msgstr "Refazer (%1)"
 
-#: editor.cc:3531 editor.cc:3555 editor_actions.cc:110 editor_actions.cc:1846
+#: editor.cc:3603 editor.cc:3627 editor_actions.cc:113 editor_actions.cc:1863
 msgid "Duplicate"
 msgstr "Duplicar"
 
-#: editor.cc:3532
+#: editor.cc:3604
 msgid "Number of duplications:"
 msgstr ""
 
-#: editor.cc:3706 route_group_dialog.cc:51 time_info_box.cc:67
+#: editor.cc:3774 route_group_dialog.cc:51 time_info_box.cc:61
 msgid "Selection"
 msgstr ""
 
-#: editor.cc:3709
+#: editor.cc:3777
 msgid "Fit 1 track"
 msgstr ""
 
-#: editor.cc:3710
+#: editor.cc:3778
 msgid "Fit 2 tracks"
 msgstr ""
 
-#: editor.cc:3711
+#: editor.cc:3779
 msgid "Fit 4 tracks"
 msgstr ""
 
-#: editor.cc:3712
+#: editor.cc:3780
 msgid "Fit 8 tracks"
 msgstr ""
 
-#: editor.cc:3713
+#: editor.cc:3781
 msgid "Fit 16 tracks"
 msgstr ""
 
-#: editor.cc:3714
+#: editor.cc:3782
 msgid "Fit 24 tracks"
 msgstr ""
 
-#: editor.cc:3715
+#: editor.cc:3783
 msgid "Fit 32 tracks"
 msgstr ""
 
-#: editor.cc:3716
+#: editor.cc:3784
 msgid "Fit 48 tracks"
 msgstr ""
 
-#: editor.cc:3717
+#: editor.cc:3785
 msgid "Fit All tracks"
 msgstr ""
 
-#: editor.cc:3718
+#: editor.cc:3786
 msgid "Fit Selection"
 msgstr ""
 
-#: editor.cc:3720
+#: editor.cc:3788 editor_actions.cc:288
 msgid "Zoom to 10 ms"
 msgstr ""
 
-#: editor.cc:3721
+#: editor.cc:3789 editor_actions.cc:289
 msgid "Zoom to 100 ms"
 msgstr ""
 
-#: editor.cc:3722
+#: editor.cc:3790 editor_actions.cc:290
 msgid "Zoom to 1 sec"
 msgstr ""
 
-#: editor.cc:3723
+#: editor.cc:3791 editor_actions.cc:291
 msgid "Zoom to 10 sec"
 msgstr ""
 
-#: editor.cc:3724
+#: editor.cc:3792 editor_actions.cc:292
 msgid "Zoom to 1 min"
 msgstr ""
 
-#: editor.cc:3725
+#: editor.cc:3793 editor_actions.cc:294
 msgid "Zoom to 10 min"
 msgstr ""
 
-#: editor.cc:3726
+#: editor.cc:3794
 msgid "Zoom to 1 hour"
 msgstr ""
 
-#: editor.cc:3727
+#: editor.cc:3795
 msgid "Zoom to 8 hours"
 msgstr ""
 
-#: editor.cc:3728
+#: editor.cc:3796
 msgid "Zoom to 24 hours"
 msgstr ""
 
-#: editor.cc:3730
+#: editor.cc:3798
 msgid "Zoom to Range/Region Selection"
 msgstr ""
 
-#: editor.cc:3800
+#: editor.cc:3868
 msgid "*"
 msgstr ""
 
-#: editor.cc:4120
+#: editor.cc:4135
 msgid "Playlist Deletion"
 msgstr ""
 
-#: editor.cc:4121
+#: editor.cc:4136
 msgid ""
 "Playlist %1 is currently unused.\n"
 "If it is kept, its audio files will not be cleaned.\n"
 "If it is deleted, audio files used by it alone will be cleaned."
 msgstr ""
 
-#: editor.cc:4131
+#: editor.cc:4146
+msgid "Delete All Unused"
+msgstr ""
+
+#: editor.cc:4147
 msgid "Delete Playlist"
 msgstr ""
 
-#: editor.cc:4132
+#: editor.cc:4148
 msgid "Keep Playlist"
 msgstr ""
 
-#: editor.cc:4133 editor_audio_import.cc:594 editor_ops.cc:6174
-#: engine_dialog.cc:2083 sfdb_freesound_mootcher.cc:69 processor_box.cc:2219
-#: processor_box.cc:2244
+#: editor.cc:4149
+msgid "Keep Remaining"
+msgstr ""
+
+#: editor.cc:4150 editor_audio_import.cc:600 editor_ops.cc:6530
+#: engine_dialog.cc:2986 sfdb_freesound_mootcher.cc:69 processor_box.cc:3431
+#: processor_box.cc:3456
 msgid "Cancel"
 msgstr "Cancelar"
 
-#: editor.cc:4275
+#: editor.cc:4292
 msgid "new playlists"
 msgstr "nova lista de reprodução"
 
-#: editor.cc:4291
+#: editor.cc:4308
 msgid "copy playlists"
 msgstr "copiar lista de reprodução"
 
-#: editor.cc:4306
+#: editor.cc:4323
 msgid "clear playlists"
 msgstr "apagar lista de reprodução"
 
-#: editor.cc:5046
+#: editor.cc:5048
 msgid "Please wait while %1 loads visual data."
 msgstr ""
 
-#: editor.cc:5901 editor.cc:5932 editor_markers.cc:985 panner_ui.cc:410
-#: processor_box.cc:2482
+#: editor.cc:5811 editor_actions.cc:479
+msgid "Unset #%1"
+msgstr ""
+
+#: editor.cc:5812 editor_actions.cc:481
+msgid "no action bound"
+msgstr ""
+
+#: editor.cc:5961 editor.cc:5996 editor_markers.cc:998 editor_markers.cc:1018
+#: panner_ui.cc:412 processor_box.cc:3703
 msgid "Edit..."
 msgstr ""
 
-#: editor.cc:5934 editor_actions.cc:1941
+#: editor.cc:6002 editor_actions.cc:1842
+msgid "Transpose..."
+msgstr ""
+
+#: editor.cc:6006 editor_actions.cc:1959
 msgid "Legatize"
 msgstr ""
 
-#: editor.cc:5936 editor_actions.cc:1940
+#: editor.cc:6012 editor_actions.cc:1958
 msgid "Quantize..."
 msgstr ""
 
-#: editor.cc:5938 editor_actions.cc:1943
+#: editor.cc:6015 editor_actions.cc:1961
 msgid "Remove Overlap"
 msgstr ""
 
-#: editor.cc:5940 editor_actions.cc:1942
+#: editor.cc:6021 editor_actions.cc:1960
 msgid "Transform..."
 msgstr ""
 
-#: editor_actions.cc:92
+#: editor_actions.cc:95
 msgid "Autoconnect"
 msgstr "Auto-ligar"
 
-#: editor_actions.cc:93
+#: editor_actions.cc:96
 msgid "Crossfades"
 msgstr "Desvanecimentos cruzados"
 
-#: editor_actions.cc:95
+#: editor_actions.cc:98
 msgid "Move Selected Marker"
 msgstr ""
 
-#: editor_actions.cc:96
+#: editor_actions.cc:99
 msgid "Select Range Operations"
 msgstr ""
 
-#: editor_actions.cc:97
+#: editor_actions.cc:100
 msgid "Select Regions"
 msgstr ""
 
-#: editor_actions.cc:98
-msgid "Edit Point"
-msgstr ""
-
-#: editor_actions.cc:99
+#: editor_actions.cc:102
 msgid "Fade"
 msgstr "Desvanecimento"
 
-#: editor_actions.cc:100
+#: editor_actions.cc:103
 msgid "Latch"
 msgstr ""
 
-#: editor_actions.cc:101 editor_regions.cc:112 region_editor.cc:46
+#: editor_actions.cc:104 editor_regions.cc:159 region_editor.cc:48
 msgid "Region"
 msgstr ""
 
-#: editor_actions.cc:102
+#: editor_actions.cc:105
 msgid "Layering"
 msgstr "Nivelar"
 
-#: editor_actions.cc:103 editor_regions.cc:113 stereo_panner_editor.cc:44
+#: editor_actions.cc:106 editor_regions.cc:160 stereo_panner_editor.cc:46
 msgid "Position"
 msgstr "Posição"
 
-#: editor_actions.cc:105 gain_meter.cc:156 gain_meter.cc:825 panner_ui.cc:178
-#: panner_ui.cc:635
+#: editor_actions.cc:108 gain_meter.cc:161 gain_meter.cc:848 panner_ui.cc:178
+#: panner_ui.cc:637 route_time_axis.cc:541
 msgid "Trim"
 msgstr "Cortar"
 
-#: editor_actions.cc:106 editor_actions.cc:126 route_group_dialog.cc:46
+#: editor_actions.cc:109 editor_actions.cc:129 route_group_dialog.cc:46
 msgid "Gain"
 msgstr ""
 
-#: editor_actions.cc:107 editor_actions.cc:563
+#: editor_actions.cc:110 editor_actions.cc:604
 msgid "Ranges"
 msgstr ""
 
-#: editor_actions.cc:108 editor_actions.cc:1842 session_option_editor.cc:135
+#: editor_actions.cc:111 editor_actions.cc:1859 session_option_editor.cc:135
 #: session_option_editor.cc:144 session_option_editor.cc:151
+#: session_option_editor.cc:158 session_option_editor.cc:165
 msgid "Fades"
 msgstr ""
 
-#: editor_actions.cc:111
+#: editor_actions.cc:114
 msgid "Link"
 msgstr ""
 
-#: editor_actions.cc:112 editor_actions.cc:145
-msgid "Zoom Focus"
-msgstr "Zoom (focagem)"
-
-#: editor_actions.cc:113
+#: editor_actions.cc:116
 msgid "Locate to Markers"
 msgstr ""
 
-#: editor_actions.cc:115
+#: editor_actions.cc:118
 msgid "Meter falloff"
 msgstr "VUímetro (decaimento)"
 
-#: editor_actions.cc:116
+#: editor_actions.cc:119
 msgid "Meter hold"
 msgstr "VUímetro (persistência)"
 
-#: editor_actions.cc:117 session_option_editor.cc:321
+#: editor_actions.cc:120 session_option_editor.cc:342
 msgid "MIDI Options"
 msgstr ""
 
-#: editor_actions.cc:118
+#: editor_actions.cc:121
 msgid "Misc Options"
 msgstr ""
 
-#: editor_actions.cc:119 rc_option_editor.cc:1809 route_group_dialog.cc:54
-#: session_option_editor.cc:243 session_option_editor.cc:250
+#: editor_actions.cc:122 rc_option_editor.cc:2401 route_group_dialog.cc:54
+#: session_option_editor.cc:264 session_option_editor.cc:271
 msgid "Monitoring"
 msgstr "Monitorização"
 
-#: editor_actions.cc:120
+#: editor_actions.cc:123
 msgid "Active Mark"
 msgstr ""
 
-#: editor_actions.cc:123
+#: editor_actions.cc:126
 msgid "Primary Clock"
 msgstr ""
 
-#: editor_actions.cc:124
+#: editor_actions.cc:127
 msgid "Pullup / Pulldown"
 msgstr ""
 
-#: editor_actions.cc:125
+#: editor_actions.cc:128
 msgid "Region operations"
 msgstr "Operações em regiões"
 
-#: editor_actions.cc:127 ruler_dialog.cc:28
+#: editor_actions.cc:130 ruler_dialog.cc:28
 msgid "Rulers"
 msgstr ""
 
-#: editor_actions.cc:128
+#: editor_actions.cc:131
 msgid "Views"
 msgstr ""
 
-#: editor_actions.cc:129
+#: editor_actions.cc:132
 msgid "Scroll"
 msgstr ""
 
-#: editor_actions.cc:130
+#: editor_actions.cc:133
 msgid "Secondary Clock"
 msgstr ""
 
-#: editor_actions.cc:137
+#: editor_actions.cc:140
 msgid "Subframes"
 msgstr ""
 
-#: editor_actions.cc:140
+#: editor_actions.cc:143
 msgid "Timecode fps"
 msgstr ""
 
-#: editor_actions.cc:141 route_time_axis.cc:575
+#: editor_actions.cc:144 route_time_axis.cc:599
 msgid "Height"
 msgstr "Altura"
 
-#: editor_actions.cc:143
+#: editor_actions.cc:146
 msgid "Tools"
 msgstr "Ferramentas"
 
-#: editor_actions.cc:144
+#: editor_actions.cc:147
 msgid "View"
 msgstr "Ver"
 
-#: editor_actions.cc:146
+#: editor_actions.cc:149
 msgid "Zoom"
 msgstr ""
 
-#: editor_actions.cc:152
-msgid "Break drag or deselect all"
+#: editor_actions.cc:150
+msgid "Scripted Actions"
 msgstr ""
 
 #: editor_actions.cc:159
+msgid "Session|Lock"
+msgstr ""
+
+#: editor_actions.cc:161
 msgid "Show Editor Mixer"
 msgstr "Mostrar painel de mistura"
 
-#: editor_actions.cc:160
+#: editor_actions.cc:162
 msgid "Show Editor List"
 msgstr ""
 
-#: editor_actions.cc:162
+#: editor_actions.cc:164
 msgid "Playhead to Next Region Boundary"
 msgstr ""
 
-#: editor_actions.cc:163
+#: editor_actions.cc:165
 msgid "Playhead to Next Region Boundary (No Track Selection)"
 msgstr ""
 
-#: editor_actions.cc:164
+#: editor_actions.cc:166
 msgid "Playhead to Previous Region Boundary"
 msgstr ""
 
-#: editor_actions.cc:165
+#: editor_actions.cc:167
 msgid "Playhead to Previous Region Boundary (No Track Selection)"
 msgstr ""
 
-#: editor_actions.cc:167
+#: editor_actions.cc:169
 msgid "Playhead to Next Region Start"
 msgstr "Reprodução ao início da próxima região"
 
-#: editor_actions.cc:168
+#: editor_actions.cc:170
 msgid "Playhead to Next Region End"
 msgstr "Reprodução ao final da próxima região"
 
-#: editor_actions.cc:169
+#: editor_actions.cc:171
 msgid "Playhead to Next Region Sync"
 msgstr "Reprodução síncrona com a próxima região"
 
-#: editor_actions.cc:171
+#: editor_actions.cc:173
 msgid "Playhead to Previous Region Start"
 msgstr "Reprodução ao início da região anterior"
 
-#: editor_actions.cc:172
+#: editor_actions.cc:174
 msgid "Playhead to Previous Region End"
 msgstr "Reprodução ao final da região anterior"
 
-#: editor_actions.cc:173
+#: editor_actions.cc:175
 msgid "Playhead to Previous Region Sync"
 msgstr "Reprodução sincronizada com a região anterior"
 
-#: editor_actions.cc:175
+#: editor_actions.cc:177
 msgid "To Next Region Boundary"
 msgstr ""
 
-#: editor_actions.cc:176
+#: editor_actions.cc:178
 msgid "To Next Region Boundary (No Track Selection)"
 msgstr ""
 
-#: editor_actions.cc:177
+#: editor_actions.cc:179
 msgid "To Previous Region Boundary"
 msgstr ""
 
-#: editor_actions.cc:178
+#: editor_actions.cc:180
 msgid "To Previous Region Boundary (No Track Selection)"
 msgstr ""
 
-#: editor_actions.cc:180
+#: editor_actions.cc:182
 msgid "To Next Region Start"
 msgstr ""
 
-#: editor_actions.cc:181
+#: editor_actions.cc:183
 msgid "To Next Region End"
 msgstr ""
 
-#: editor_actions.cc:182
+#: editor_actions.cc:184
 msgid "To Next Region Sync"
 msgstr ""
 
-#: editor_actions.cc:184
+#: editor_actions.cc:186
 msgid "To Previous Region Start"
 msgstr ""
 
-#: editor_actions.cc:185
+#: editor_actions.cc:187
 msgid "To Previous Region End"
 msgstr ""
 
-#: editor_actions.cc:186
+#: editor_actions.cc:188
 msgid "To Previous Region Sync"
 msgstr ""
 
-#: editor_actions.cc:188
+#: editor_actions.cc:190
 msgid "To Range Start"
 msgstr ""
 
-#: editor_actions.cc:189
+#: editor_actions.cc:191
 msgid "To Range End"
 msgstr ""
 
-#: editor_actions.cc:191
+#: editor_actions.cc:193
 msgid "Playhead to Range Start"
 msgstr "Reprodução no início do intervalo"
 
-#: editor_actions.cc:192
+#: editor_actions.cc:194
 msgid "Playhead to Range End"
 msgstr "Reprodução no final do intervalo"
 
-#: editor_actions.cc:195
+#: editor_actions.cc:197
 msgid "Select All Tracks"
 msgstr ""
 
-#: editor_actions.cc:196 export_timespan_selector.cc:61 processor_box.cc:2468
+#: editor_actions.cc:198 export_timespan_selector.cc:59 processor_box.cc:3685
 msgid "Deselect All"
 msgstr "Seleccionar nenhum"
 
-#: editor_actions.cc:204
+#: editor_actions.cc:210
 msgid "Select All Overlapping Edit Range"
 msgstr ""
 
-#: editor_actions.cc:205
+#: editor_actions.cc:211
 msgid "Select All Inside Edit Range"
 msgstr ""
 
-#: editor_actions.cc:207
+#: editor_actions.cc:213
 msgid "Select Edit Range"
 msgstr ""
 
-#: editor_actions.cc:209
+#: editor_actions.cc:215
 msgid "Select All in Punch Range"
 msgstr "Seleccionar tudo no intervalo de inserção"
 
-#: editor_actions.cc:210
+#: editor_actions.cc:216
 msgid "Select All in Loop Range"
 msgstr "Seleccionar tudo no intervalo de ciclo"
 
-#: editor_actions.cc:212
+#: editor_actions.cc:218
 msgid "Select Next Track or Bus"
 msgstr ""
 
-#: editor_actions.cc:213
+#: editor_actions.cc:219
 msgid "Select Previous Track or Bus"
 msgstr ""
 
-#: editor_actions.cc:215
+#: editor_actions.cc:221
 msgid "Toggle Record Enable"
 msgstr ""
 
-#: editor_actions.cc:217
+#: editor_actions.cc:223
 msgid "Toggle Solo"
 msgstr ""
 
-#: editor_actions.cc:219
+#: editor_actions.cc:225
 msgid "Toggle Mute"
 msgstr ""
 
-#: editor_actions.cc:221
+#: editor_actions.cc:227
 msgid "Toggle Solo Isolate"
 msgstr ""
 
-#: editor_actions.cc:226
+#: editor_actions.cc:232
 msgid "Save View %1"
 msgstr ""
 
-#: editor_actions.cc:232
+#: editor_actions.cc:238
 msgid "Go to View %1"
 msgstr ""
 
-#: editor_actions.cc:238
+#: editor_actions.cc:244
 msgid "Locate to Mark %1"
 msgstr ""
 
-#: editor_actions.cc:242 editor_actions.cc:243
+#: editor_actions.cc:249 editor_actions.cc:250
 msgid "Jump to Next Mark"
 msgstr ""
 
-#: editor_actions.cc:244 editor_actions.cc:245
+#: editor_actions.cc:251 editor_actions.cc:252
 msgid "Jump to Previous Mark"
 msgstr ""
 
-#: editor_actions.cc:247 editor_actions.cc:248
+#: editor_actions.cc:254
+msgid "Set Session Start from Playhead"
+msgstr ""
+
+#: editor_actions.cc:255
+msgid "Set Session End from Playhead"
+msgstr ""
+
+#: editor_actions.cc:257 editor_actions.cc:258
 msgid "Add Mark from Playhead"
 msgstr ""
 
-#: editor_actions.cc:250 editor_actions.cc:251
+#: editor_actions.cc:260 editor_actions.cc:261
 msgid "Remove Mark at Playhead"
 msgstr ""
 
-#: editor_actions.cc:253
+#: editor_actions.cc:263
 msgid "Nudge Next Later"
 msgstr ""
 
-#: editor_actions.cc:254
+#: editor_actions.cc:264
 msgid "Nudge Next Earlier"
 msgstr ""
 
-#: editor_actions.cc:256
+#: editor_actions.cc:266
 msgid "Nudge Playhead Forward"
 msgstr ""
 
-#: editor_actions.cc:257
+#: editor_actions.cc:267
 msgid "Nudge Playhead Backward"
 msgstr ""
 
-#: editor_actions.cc:258
-msgid "Playhead To Next Grid"
+#: editor_actions.cc:268
+msgid "Playhead to Next Grid"
 msgstr ""
 
-#: editor_actions.cc:259
-msgid "Playhead To Previous Grid"
+#: editor_actions.cc:269
+msgid "Playhead to Previous Grid"
 msgstr ""
 
-#: editor_actions.cc:264
+#: editor_actions.cc:274
 msgid "Zoom to Selection"
 msgstr ""
 
-#: editor_actions.cc:265
+#: editor_actions.cc:275
 msgid "Toggle Zoom State"
 msgstr ""
 
-#: editor_actions.cc:267
+#: editor_actions.cc:277
 msgid "Expand Track Height"
 msgstr ""
 
-#: editor_actions.cc:268
+#: editor_actions.cc:278
 msgid "Shrink Track Height"
 msgstr ""
 
-#: editor_actions.cc:270
+#: editor_actions.cc:280
+msgid "Fit 1 Track"
+msgstr ""
+
+#: editor_actions.cc:281
+msgid "Fit 2 Tracks"
+msgstr ""
+
+#: editor_actions.cc:282
+msgid "Fit 4 Tracks"
+msgstr ""
+
+#: editor_actions.cc:283
+msgid "Fit 8 Tracks"
+msgstr ""
+
+#: editor_actions.cc:284
+msgid "Fit 16 Tracks"
+msgstr ""
+
+#: editor_actions.cc:285
+msgid "Fit 32 Tracks"
+msgstr ""
+
+#: editor_actions.cc:286
+msgid "Fit All Tracks"
+msgstr ""
+
+#: editor_actions.cc:293
+msgid "Zoom to 5 min"
+msgstr ""
+
+#: editor_actions.cc:296
 msgid "Move Selected Tracks Up"
 msgstr ""
 
-#: editor_actions.cc:272
+#: editor_actions.cc:298
 msgid "Move Selected Tracks Down"
 msgstr ""
 
-#: editor_actions.cc:275
+#: editor_actions.cc:301
 msgid "Scroll Tracks Up"
 msgstr "Rolar faixas p/cima"
 
-#: editor_actions.cc:277
+#: editor_actions.cc:302
 msgid "Scroll Tracks Down"
 msgstr "Rolar faixas p/baixo"
 
-#: editor_actions.cc:279
+#: editor_actions.cc:303
 msgid "Step Tracks Up"
 msgstr "Passar faixas p/cima"
 
-#: editor_actions.cc:281
+#: editor_actions.cc:304
 msgid "Step Tracks Down"
 msgstr "Passar faixas p/baixo"
 
-#: editor_actions.cc:284
+#: editor_actions.cc:306
 msgid "Scroll Backward"
 msgstr "Rolar p/trás"
 
-#: editor_actions.cc:285
+#: editor_actions.cc:307
 msgid "Scroll Forward"
 msgstr "Rolar p/frente"
 
-#: editor_actions.cc:286
+#: editor_actions.cc:308
 msgid "Center Playhead"
 msgstr "Centrar cursor de reprodução"
 
-#: editor_actions.cc:287
+#: editor_actions.cc:309
 msgid "Center Edit Point"
 msgstr ""
 
-#: editor_actions.cc:289
+#: editor_actions.cc:311
 msgid "Playhead Forward"
 msgstr "Cursor de reprodução p/frente"
 
-#: editor_actions.cc:290
+#: editor_actions.cc:312
 msgid "Playhead Backward"
 msgstr "Cursor de reprodução p/trás"
 
-#: editor_actions.cc:292
+#: editor_actions.cc:314
 msgid "Playhead to Active Mark"
 msgstr ""
 
-#: editor_actions.cc:293
+#: editor_actions.cc:315
 msgid "Active Mark to Playhead"
 msgstr ""
 
-#: editor_actions.cc:295
+#: editor_actions.cc:317
 msgid "Use Skip Ranges"
 msgstr ""
 
-#: editor_actions.cc:302
+#: editor_actions.cc:324
 msgid "Play Selected Regions"
 msgstr ""
 
-#: editor_actions.cc:304
+#: editor_actions.cc:326
 msgid "Play from Edit Point and Return"
 msgstr ""
 
-#: editor_actions.cc:306
+#: editor_actions.cc:328
 msgid "Play Edit Range"
 msgstr ""
 
-#: editor_actions.cc:308
+#: editor_actions.cc:330
 msgid "Playhead to Mouse"
 msgstr ""
 
-#: editor_actions.cc:309
+#: editor_actions.cc:331
 msgid "Active Marker to Mouse"
 msgstr ""
 
-#: editor_actions.cc:319
+#: editor_actions.cc:341
 msgid "Undo Selection Change"
 msgstr ""
 
-#: editor_actions.cc:320
+#: editor_actions.cc:342
 msgid "Redo Selection Change"
 msgstr ""
 
-#: editor_actions.cc:322
+#: editor_actions.cc:344
 msgid "Export Audio"
 msgstr ""
 
-#: editor_actions.cc:323 export_dialog.cc:396
+#: editor_actions.cc:345 export_dialog.cc:424
 msgid "Export Range"
 msgstr "Exportar intervalo"
 
-#: editor_actions.cc:328
+#: editor_actions.cc:350
 msgid "Separate Using Punch Range"
 msgstr ""
 
-#: editor_actions.cc:331
+#: editor_actions.cc:353
 msgid "Separate Using Loop Range"
 msgstr ""
 
-#: editor_actions.cc:334 editor_actions.cc:356
+#: editor_actions.cc:356 editor_actions.cc:379
 msgid "Crop"
 msgstr ""
 
-#: editor_actions.cc:344
+#: editor_actions.cc:366
 msgid "Fade Range Selection"
 msgstr ""
 
-#: editor_actions.cc:346
+#: editor_actions.cc:368
 msgid "Set Tempo from Edit Range = Bar"
 msgstr ""
 
-#: editor_actions.cc:348
+#: editor_actions.cc:371
 msgid "Log"
 msgstr ""
 
-#: editor_actions.cc:351 editor_actions.cc:353
+#: editor_actions.cc:374 editor_actions.cc:376
 msgid "Move to Next Transient"
 msgstr ""
 
-#: editor_actions.cc:352 editor_actions.cc:354
+#: editor_actions.cc:375 editor_actions.cc:377
 msgid "Move to Previous Transient"
 msgstr ""
 
-#: editor_actions.cc:358 editor_actions.cc:361
+#: editor_actions.cc:381
+msgid "Start Range from Playhead"
+msgstr ""
+
+#: editor_actions.cc:382
+msgid "Finish Range from Playhead"
+msgstr ""
+
+#: editor_actions.cc:384 editor_actions.cc:393
 msgid "Start Range"
 msgstr "Iniciar intervalo"
 
-#: editor_actions.cc:359 editor_actions.cc:362
+#: editor_actions.cc:385 editor_actions.cc:394
 msgid "Finish Range"
 msgstr "Finalizar intervalo"
 
-#: editor_actions.cc:394
+#: editor_actions.cc:387
+msgid "Start Punch Range"
+msgstr ""
+
+#: editor_actions.cc:388
+msgid "Finish Punch Range"
+msgstr ""
+
+#: editor_actions.cc:390
+msgid "Start Loop Range"
+msgstr ""
+
+#: editor_actions.cc:391
+msgid "Finish Loop Range"
+msgstr ""
+
+#: editor_actions.cc:426
 msgid "Follow Playhead"
 msgstr "Seguir o cursor de reprodução"
 
-#: editor_actions.cc:395
+#: editor_actions.cc:427
 msgid "Remove Last Capture"
 msgstr "Remover a última captura"
 
-#: editor_actions.cc:397
+#: editor_actions.cc:429
 msgid "Stationary Playhead"
 msgstr ""
 
-#: editor_actions.cc:399 insert_time_dialog.cc:32
+#: editor_actions.cc:431 insert_remove_time_dialog.cc:32
 msgid "Insert Time"
 msgstr ""
 
-#: editor_actions.cc:402
+#: editor_actions.cc:433 insert_remove_time_dialog.cc:32
+msgid "Remove Time"
+msgstr ""
+
+#: editor_actions.cc:438
 msgid "Toggle Active"
 msgstr ""
 
-#: editor_actions.cc:407 editor_actions.cc:1768 editor_markers.cc:921
-#: editor_markers.cc:986 editor_snapshots.cc:122 mixer_strip.cc:1543
-#: route_time_axis.cc:856
+#: editor_actions.cc:440 editor_actions.cc:1785 editor_markers.cc:926
+#: editor_markers.cc:999 editor_markers.cc:1019 editor_snapshots.cc:134
+#: lua_script_manager.cc:32 lua_script_manager.cc:36 mixer_strip.cc:1705
+#: route_time_axis.cc:870 vca_master_strip.cc:400
 msgid "Remove"
 msgstr "Remover"
 
-#: editor_actions.cc:411
+#: editor_actions.cc:445
 msgid "Fit Selection (Vertical)"
 msgstr ""
 
-#: editor_actions.cc:413 time_axis_view.cc:1371
+#: editor_actions.cc:447 time_axis_view.cc:1287
 msgid "Largest"
 msgstr "Enorme"
 
-#: editor_actions.cc:416 time_axis_view.cc:1372
+#: editor_actions.cc:450 time_axis_view.cc:1288
 msgid "Larger"
 msgstr "Maior"
 
-#: editor_actions.cc:419 editor_rulers.cc:249 time_axis_view.cc:1373
+#: editor_actions.cc:453 editor_rulers.cc:248 time_axis_view.cc:1289
 msgid "Large"
 msgstr "Grande"
 
-#: editor_actions.cc:425 editor_rulers.cc:253 time_axis_view.cc:1375
+#: editor_actions.cc:459 editor_rulers.cc:252 time_axis_view.cc:1291
 msgid "Small"
 msgstr "Pequeno"
 
-#: editor_actions.cc:429
+#: editor_actions.cc:463
 msgid "Sound Selected MIDI Notes"
 msgstr ""
 
-#: editor_actions.cc:434
+#: editor_actions.cc:468
 msgid "Zoom Focus Left"
 msgstr "Zoom (focagem/esquerda)"
 
-#: editor_actions.cc:435
+#: editor_actions.cc:469
 msgid "Zoom Focus Right"
 msgstr "Zoom (focagem/direita)"
 
-#: editor_actions.cc:436
+#: editor_actions.cc:470
 msgid "Zoom Focus Center"
 msgstr "Zoom (focagem/centro)"
 
-#: editor_actions.cc:437
+#: editor_actions.cc:471
 msgid "Zoom Focus Playhead"
 msgstr "Zoom (focagem/reprodução)"
 
-#: editor_actions.cc:438
+#: editor_actions.cc:472
 msgid "Zoom Focus Mouse"
 msgstr ""
 
-#: editor_actions.cc:439
+#: editor_actions.cc:473
 msgid "Zoom Focus Edit Point"
 msgstr ""
 
-#: editor_actions.cc:441
+#: editor_actions.cc:475
 msgid "Next Zoom Focus"
 msgstr ""
 
-#: editor_actions.cc:447
+#: editor_actions.cc:488
 msgid "Smart Object Mode"
 msgstr ""
 
-#: editor_actions.cc:450
+#: editor_actions.cc:491
 msgid "Smart"
 msgstr ""
 
-#: editor_actions.cc:453
+#: editor_actions.cc:494
 msgid "Object Tool"
 msgstr "Ferramenta/objecto"
 
-#: editor_actions.cc:458
+#: editor_actions.cc:499
 msgid "Range Tool"
 msgstr "Ferramenta/intervalo"
 
-#: editor_actions.cc:463
+#: editor_actions.cc:504
 msgid "Note Drawing Tool"
 msgstr ""
 
-#: editor_actions.cc:468
+#: editor_actions.cc:509
 msgid "Audition Tool"
 msgstr ""
 
-#: editor_actions.cc:473
+#: editor_actions.cc:514
 msgid "Time FX Tool"
 msgstr ""
 
-#: editor_actions.cc:478
+#: editor_actions.cc:519
 msgid "Content Tool"
 msgstr ""
 
-#: editor_actions.cc:484
+#: editor_actions.cc:525
 msgid "Cut Tool"
 msgstr ""
 
-#: editor_actions.cc:490
+#: editor_actions.cc:531
 msgid "Step Mouse Mode"
 msgstr ""
 
-#: editor_actions.cc:497
+#: editor_actions.cc:538
 msgid "Change Edit Point"
 msgstr ""
 
-#: editor_actions.cc:498
+#: editor_actions.cc:539
 msgid "Change Edit Point Including Marker"
 msgstr ""
 
-#: editor_actions.cc:504
+#: editor_actions.cc:544
+msgid "EditMode|Lock"
+msgstr ""
+
+#: editor_actions.cc:545
 msgid "Cycle Edit Mode"
 msgstr ""
 
-#: editor_actions.cc:506
+#: editor_actions.cc:547
 msgid "Snap to"
 msgstr ""
 
-#: editor_actions.cc:507
+#: editor_actions.cc:548
 msgid "Snap Mode"
 msgstr "Modo de ajuste"
 
-#: editor_actions.cc:514
+#: editor_actions.cc:555
 msgid "Next Snap Mode"
 msgstr ""
 
-#: editor_actions.cc:515
+#: editor_actions.cc:556
 msgid "Next Snap Choice"
 msgstr ""
 
-#: editor_actions.cc:516
+#: editor_actions.cc:557
 msgid "Next Musical Snap Choice"
 msgstr ""
 
-#: editor_actions.cc:517
+#: editor_actions.cc:558
 msgid "Previous Snap Choice"
 msgstr ""
 
-#: editor_actions.cc:518
+#: editor_actions.cc:559
 msgid "Previous Musical Snap Choice"
 msgstr ""
 
-#: editor_actions.cc:523
+#: editor_actions.cc:564
 msgid "Snap to CD Frame"
 msgstr ""
 
-#: editor_actions.cc:524
+#: editor_actions.cc:565
 msgid "Snap to Timecode Frame"
 msgstr ""
 
-#: editor_actions.cc:525
+#: editor_actions.cc:566
 msgid "Snap to Timecode Seconds"
 msgstr ""
 
-#: editor_actions.cc:526
+#: editor_actions.cc:567
 msgid "Snap to Timecode Minutes"
 msgstr ""
 
-#: editor_actions.cc:527
+#: editor_actions.cc:568
 msgid "Snap to Seconds"
 msgstr ""
 
-#: editor_actions.cc:528
+#: editor_actions.cc:569
 msgid "Snap to Minutes"
 msgstr ""
 
-#: editor_actions.cc:530
+#: editor_actions.cc:571
 msgid "Snap to One Twenty Eighths"
 msgstr ""
 
-#: editor_actions.cc:531
+#: editor_actions.cc:572
 msgid "Snap to Sixty Fourths"
 msgstr ""
 
-#: editor_actions.cc:532
+#: editor_actions.cc:573
 msgid "Snap to Thirty Seconds"
 msgstr ""
 
-#: editor_actions.cc:533
+#: editor_actions.cc:574
 msgid "Snap to Twenty Eighths"
 msgstr ""
 
-#: editor_actions.cc:534
+#: editor_actions.cc:575
 msgid "Snap to Twenty Fourths"
 msgstr ""
 
-#: editor_actions.cc:535
+#: editor_actions.cc:576
 msgid "Snap to Twentieths"
 msgstr ""
 
-#: editor_actions.cc:536
+#: editor_actions.cc:577
 msgid "Snap to Sixteenths"
 msgstr ""
 
-#: editor_actions.cc:537
+#: editor_actions.cc:578
 msgid "Snap to Fourteenths"
 msgstr ""
 
-#: editor_actions.cc:538
+#: editor_actions.cc:579
 msgid "Snap to Twelfths"
 msgstr ""
 
-#: editor_actions.cc:539
+#: editor_actions.cc:580
 msgid "Snap to Tenths"
 msgstr ""
 
-#: editor_actions.cc:540
+#: editor_actions.cc:581
 msgid "Snap to Eighths"
 msgstr ""
 
-#: editor_actions.cc:541
+#: editor_actions.cc:582
 msgid "Snap to Sevenths"
 msgstr ""
 
-#: editor_actions.cc:542
+#: editor_actions.cc:583
 msgid "Snap to Sixths"
 msgstr ""
 
-#: editor_actions.cc:543
+#: editor_actions.cc:584
 msgid "Snap to Fifths"
 msgstr ""
 
-#: editor_actions.cc:544
+#: editor_actions.cc:585
 msgid "Snap to Quarters"
 msgstr ""
 
-#: editor_actions.cc:545
+#: editor_actions.cc:586
 msgid "Snap to Thirds"
 msgstr ""
 
-#: editor_actions.cc:546
+#: editor_actions.cc:587
 msgid "Snap to Halves"
 msgstr ""
 
-#: editor_actions.cc:548
+#: editor_actions.cc:589
 msgid "Snap to Beat"
 msgstr ""
 
-#: editor_actions.cc:549
+#: editor_actions.cc:590
 msgid "Snap to Bar"
 msgstr ""
 
-#: editor_actions.cc:550
+#: editor_actions.cc:591
 msgid "Snap to Mark"
 msgstr ""
 
-#: editor_actions.cc:551
+#: editor_actions.cc:592
 msgid "Snap to Region Start"
 msgstr ""
 
-#: editor_actions.cc:552
+#: editor_actions.cc:593
 msgid "Snap to Region End"
 msgstr ""
 
-#: editor_actions.cc:553
+#: editor_actions.cc:594
 msgid "Snap to Region Sync"
 msgstr ""
 
-#: editor_actions.cc:554
+#: editor_actions.cc:595
 msgid "Snap to Region Boundary"
 msgstr ""
 
-#: editor_actions.cc:556
+#: editor_actions.cc:597
 msgid "Show Marker Lines"
 msgstr ""
 
-#: editor_actions.cc:566
+#: editor_actions.cc:607
 msgid "Loop/Punch"
 msgstr ""
 
-#: editor_actions.cc:570
+#: editor_actions.cc:611
 msgid "Min:Sec"
 msgstr ""
 
-#: editor_actions.cc:572 editor_actions.cc:575 editor_rulers.cc:271
+#: editor_actions.cc:613 editor_actions.cc:616 editor_rulers.cc:270
+#: rc_option_editor.cc:1592
 msgid "Video Monitor"
 msgstr ""
 
-#: editor_actions.cc:574 rc_option_editor.cc:2260
+#: editor_actions.cc:615 rc_option_editor.cc:2844
 msgid "Video"
 msgstr ""
 
-#: editor_actions.cc:577
+#: editor_actions.cc:618
 msgid "Always on Top"
 msgstr ""
 
-#: editor_actions.cc:579
+#: editor_actions.cc:620
 msgid "Frame number"
 msgstr ""
 
-#: editor_actions.cc:580
+#: editor_actions.cc:621
 msgid "Timecode Background"
 msgstr ""
 
-#: editor_actions.cc:581
+#: editor_actions.cc:622
 msgid "Fullscreen"
 msgstr ""
 
-#: editor_actions.cc:582
+#: editor_actions.cc:623
 msgid "Letterbox"
 msgstr ""
 
-#: editor_actions.cc:583
+#: editor_actions.cc:624
 msgid "Original Size"
 msgstr ""
 
-#: editor_actions.cc:640
+#: editor_actions.cc:681
 msgid "Sort"
 msgstr "Ordenar"
 
-#: editor_actions.cc:651 editor_routes.cc:476 mixer_ui.cc:1196
+#: editor_actions.cc:692 editor_routes.cc:549 mixer_ui.cc:1497
 msgid "Show All"
 msgstr "Mostrar tudo"
 
-#: editor_actions.cc:652
+#: editor_actions.cc:693
 msgid "Show Automatic Regions"
 msgstr ""
 
-#: editor_actions.cc:654
+#: editor_actions.cc:695
 msgid "Ascending"
 msgstr "Crescente"
 
-#: editor_actions.cc:656
+#: editor_actions.cc:697
 msgid "Descending"
 msgstr "Decrescente"
 
-#: editor_actions.cc:659
+#: editor_actions.cc:700
 msgid "By Region Name"
 msgstr "Por nome de região"
 
-#: editor_actions.cc:661
+#: editor_actions.cc:702
 msgid "By Region Length"
 msgstr "Por comprimento de região"
 
-#: editor_actions.cc:663
+#: editor_actions.cc:704
 msgid "By Region Position"
 msgstr "Por posição de região"
 
-#: editor_actions.cc:665
+#: editor_actions.cc:706
 msgid "By Region Timestamp"
 msgstr "Por instante de região"
 
-#: editor_actions.cc:667
+#: editor_actions.cc:708
 msgid "By Region Start in File"
 msgstr "Por posição inicial da região no ficheiro"
 
-#: editor_actions.cc:669
+#: editor_actions.cc:710
 msgid "By Region End in File"
 msgstr "Por posição final da região no ficheiro"
 
-#: editor_actions.cc:671
+#: editor_actions.cc:712
 msgid "By Source File Name"
 msgstr "Por nome do ficheiro original"
 
-#: editor_actions.cc:673
+#: editor_actions.cc:714
 msgid "By Source File Length"
 msgstr "Por comprimento do ficheiro original"
 
-#: editor_actions.cc:675
+#: editor_actions.cc:716
 msgid "By Source File Creation Date"
 msgstr "Por data de criação do ficheiro original"
 
-#: editor_actions.cc:677
+#: editor_actions.cc:718
 msgid "By Source Filesystem"
 msgstr "Por sistema de ficheiros original"
 
-#: editor_actions.cc:680
+#: editor_actions.cc:721
 msgid "Remove Unused"
 msgstr ""
 
-#: editor_actions.cc:684 editor_audio_import.cc:282
-#: session_import_dialog.cc:75 session_import_dialog.cc:95
-#: session_metadata_dialog.cc:418 editor_videotimeline.cc:91
+#: editor_actions.cc:723
+msgid "Import PT session"
+msgstr ""
+
+#: editor_actions.cc:728 editor_audio_import.cc:282 editor_pt_import.cc:149
+#: luawindow.cc:99 session_import_dialog.cc:75 session_import_dialog.cc:95
+#: session_metadata_dialog.cc:421 sfdb_ui.cc:558 editor_videotimeline.cc:91
 msgid "Import"
 msgstr "Importar"
 
-#: editor_actions.cc:687
+#: editor_actions.cc:731
 msgid "Import to Region List..."
 msgstr ""
 
-#: editor_actions.cc:690 session_import_dialog.cc:44
-msgid "Import From Session"
+#: editor_actions.cc:734 session_import_dialog.cc:44
+#: session_import_dialog.cc:65
+msgid "Import from Session"
 msgstr ""
 
-#: editor_actions.cc:694
+#: editor_actions.cc:738
 msgid "Bring all media into session folder"
 msgstr ""
 
-#: editor_actions.cc:697
+#: editor_actions.cc:741
 msgid "Show Summary"
 msgstr ""
 
-#: editor_actions.cc:699
+#: editor_actions.cc:743
 msgid "Show Group Tabs"
 msgstr ""
 
-#: editor_actions.cc:701
+#: editor_actions.cc:745
 msgid "Show Measure Lines"
 msgstr ""
 
-#: editor_actions.cc:705
-msgid "Show Logo"
-msgstr ""
-
-#: editor_actions.cc:709
+#: editor_actions.cc:747
 msgid "Toggle MIDI Input Active for Editor-Selected Tracks/Busses"
 msgstr ""
 
-#: editor_actions.cc:732
-msgid "Loaded editor bindings from %1"
-msgstr ""
-
-#: editor_actions.cc:734
-msgid "Could not find editor.bindings in search path %1"
-msgstr ""
-
-#: editor_actions.cc:1078 editor_actions.cc:1474 editor_actions.cc:1485
-#: editor_actions.cc:1538 editor_actions.cc:1549 editor_actions.cc:1596
-#: editor_actions.cc:1606 editor_regions.cc:1563
+#: editor_actions.cc:1081 editor_actions.cc:1477 editor_actions.cc:1488
+#: editor_actions.cc:1541 editor_actions.cc:1552 editor_actions.cc:1599
+#: editor_actions.cc:1609 editor_regions.cc:1657 luainstance.cc:327
+#: luainstance.cc:1690
 msgid "programming error: %1: %2"
 msgstr ""
 
-#: editor_actions.cc:1774
+#: editor_actions.cc:1791
 msgid "Raise"
 msgstr ""
 
-#: editor_actions.cc:1777
+#: editor_actions.cc:1794
 msgid "Raise to Top"
 msgstr ""
 
-#: editor_actions.cc:1780
+#: editor_actions.cc:1797
 msgid "Lower"
 msgstr "Inferior"
 
-#: editor_actions.cc:1783
+#: editor_actions.cc:1800
 msgid "Lower to Bottom"
 msgstr ""
 
-#: editor_actions.cc:1786
+#: editor_actions.cc:1803
 msgid "Move to Original Position"
 msgstr ""
 
-#: editor_actions.cc:1791
+#: editor_actions.cc:1808
 msgid "Lock to Video"
 msgstr ""
 
-#: editor_actions.cc:1796 editor_markers.cc:912
+#: editor_actions.cc:1813 editor_markers.cc:917
 msgid "Glue to Bars and Beats"
 msgstr ""
 
-#: editor_actions.cc:1801
+#: editor_actions.cc:1818
 msgid "Remove Sync"
 msgstr ""
 
-#: editor_actions.cc:1804 mixer_strip.cc:2006 monitor_section.cc:272
-#: route_time_axis.cc:253 route_time_axis.cc:526
+#: editor_actions.cc:1821 mixer_strip.cc:2192 monitor_section.cc:253
+#: monitor_section.cc:321 route_time_axis.cc:264 route_time_axis.cc:550
 msgid "Mute"
 msgstr "Mudo"
 
-#: editor_actions.cc:1807
+#: editor_actions.cc:1824
 msgid "Normalize..."
 msgstr ""
 
-#: editor_actions.cc:1810
+#: editor_actions.cc:1827
 msgid "Reverse"
 msgstr "Inverter"
 
-#: editor_actions.cc:1813
+#: editor_actions.cc:1830
 msgid "Make Mono Regions"
 msgstr ""
 
-#: editor_actions.cc:1816
+#: editor_actions.cc:1833
 msgid "Boost Gain"
 msgstr ""
 
-#: editor_actions.cc:1819
+#: editor_actions.cc:1836
 msgid "Cut Gain"
 msgstr ""
 
-#: editor_actions.cc:1822
+#: editor_actions.cc:1839
 msgid "Pitch Shift..."
 msgstr ""
 
-#: editor_actions.cc:1825
-msgid "Transpose..."
-msgstr ""
-
-#: editor_actions.cc:1828
+#: editor_actions.cc:1845
 msgid "Opaque"
 msgstr ""
 
-#: editor_actions.cc:1832 editor_regions.cc:117
+#: editor_actions.cc:1849 editor_regions.cc:164
 msgid "Fade In"
 msgstr "Evanescimento"
 
-#: editor_actions.cc:1837 editor_regions.cc:118
+#: editor_actions.cc:1854 editor_regions.cc:165
 msgid "Fade Out"
 msgstr "Desvanecimento"
 
-#: editor_actions.cc:1852
+#: editor_actions.cc:1869
 msgid "Multi-Duplicate..."
 msgstr ""
 
-#: editor_actions.cc:1857
+#: editor_actions.cc:1874
 msgid "Fill Track"
 msgstr "Preencher faixa"
 
-#: editor_actions.cc:1861 editor_markers.cc:1000
+#: editor_actions.cc:1878 editor_markers.cc:1033
 msgid "Set Loop Range"
 msgstr "Estabelecer intervalo cíclico"
 
-#: editor_actions.cc:1868
+#: editor_actions.cc:1885
 msgid "Set Punch"
 msgstr ""
 
-#: editor_actions.cc:1872
+#: editor_actions.cc:1889
 msgid "Add Single Range Marker"
 msgstr ""
 
-#: editor_actions.cc:1877
+#: editor_actions.cc:1894
 msgid "Add Range Marker Per Region"
 msgstr ""
 
-#: editor_actions.cc:1881
-msgid "Snap Position To Grid"
+#: editor_actions.cc:1898
+msgid "Snap Position to Grid"
 msgstr ""
 
-#: editor_actions.cc:1884
+#: editor_actions.cc:1901
 msgid "Close Gaps"
 msgstr ""
 
-#: editor_actions.cc:1887
+#: editor_actions.cc:1904
 msgid "Rhythm Ferret..."
 msgstr ""
 
-#: editor_actions.cc:1890
+#: editor_actions.cc:1907
 msgid "Export..."
 msgstr ""
 
-#: editor_actions.cc:1896
+#: editor_actions.cc:1913
 msgid "Separate Under"
 msgstr ""
 
-#: editor_actions.cc:1900 editor_actions.cc:1901
+#: editor_actions.cc:1917 editor_actions.cc:1918
 msgid "Set Fade In Length"
 msgstr ""
 
-#: editor_actions.cc:1902 editor_actions.cc:1903
+#: editor_actions.cc:1919 editor_actions.cc:1920
 msgid "Set Fade Out Length"
 msgstr ""
 
-#: editor_actions.cc:1905
+#: editor_actions.cc:1922
 msgid "Set Tempo from Region = Bar"
 msgstr ""
 
-#: editor_actions.cc:1910
+#: editor_actions.cc:1927
 msgid "Split at Percussion Onsets"
 msgstr ""
 
-#: editor_actions.cc:1915
+#: editor_actions.cc:1932
 msgid "List Editor..."
 msgstr ""
 
-#: editor_actions.cc:1918
+#: editor_actions.cc:1935
 msgid "Properties..."
 msgstr ""
 
-#: editor_actions.cc:1922
+#: editor_actions.cc:1939
 msgid "Bounce (with processing)"
 msgstr ""
 
-#: editor_actions.cc:1923
+#: editor_actions.cc:1940
 msgid "Bounce (without processing)"
 msgstr ""
 
-#: editor_actions.cc:1924
+#: editor_actions.cc:1941
 msgid "Combine"
 msgstr ""
 
-#: editor_actions.cc:1925
+#: editor_actions.cc:1942
 msgid "Uncombine"
 msgstr ""
 
-#: editor_actions.cc:1927
+#: editor_actions.cc:1944
+msgid "Loudness Analysis..."
+msgstr ""
+
+#: editor_actions.cc:1945
 msgid "Spectral Analysis..."
 msgstr ""
 
-#: editor_actions.cc:1929
+#: editor_actions.cc:1947
 msgid "Reset Envelope"
 msgstr ""
 
-#: editor_actions.cc:1931
+#: editor_actions.cc:1949
 msgid "Reset Gain"
 msgstr ""
 
-#: editor_actions.cc:1936
+#: editor_actions.cc:1954
 msgid "Envelope Active"
 msgstr ""
 
-#: editor_actions.cc:1944 editor_actions.cc:1945
+#: editor_actions.cc:1962 editor_actions.cc:1963
 msgid "Insert Patch Change..."
 msgstr ""
 
-#: editor_actions.cc:1946
+#: editor_actions.cc:1964
 msgid "Unlink from other copies"
 msgstr ""
 
-#: editor_actions.cc:1947
+#: editor_actions.cc:1965
 msgid "Strip Silence..."
 msgstr ""
 
-#: editor_actions.cc:1948
+#: editor_actions.cc:1966
 msgid "Set Range Selection"
 msgstr ""
 
-#: editor_actions.cc:1950 editor_actions.cc:1951
+#: editor_actions.cc:1968 editor_actions.cc:1969
 msgid "Nudge Later"
 msgstr ""
 
-#: editor_actions.cc:1952 editor_actions.cc:1953
+#: editor_actions.cc:1970 editor_actions.cc:1971
 msgid "Nudge Earlier"
 msgstr ""
 
-#: editor_actions.cc:1955
+#: editor_actions.cc:1973
 msgid "Sequence Regions"
 msgstr ""
 
-#: editor_actions.cc:1960
+#: editor_actions.cc:1978
 msgid "Nudge Later by Capture Offset"
 msgstr ""
 
-#: editor_actions.cc:1967
+#: editor_actions.cc:1985
 msgid "Nudge Earlier by Capture Offset"
 msgstr ""
 
-#: editor_actions.cc:1971
+#: editor_actions.cc:1989
 msgid "Trim to Loop"
 msgstr ""
 
-#: editor_actions.cc:1972
+#: editor_actions.cc:1990
 msgid "Trim to Punch"
 msgstr ""
 
-#: editor_actions.cc:1974
+#: editor_actions.cc:1992
 msgid "Trim to Previous"
 msgstr ""
 
-#: editor_actions.cc:1975
+#: editor_actions.cc:1993
 msgid "Trim to Next"
 msgstr ""
 
-#: editor_actions.cc:1982
-msgid "Insert Region From Region List"
+#: editor_actions.cc:2000
+msgid "Insert Region from Region List"
 msgstr ""
 
-#: editor_actions.cc:1988
+#: editor_actions.cc:2006
 msgid "Set Sync Position"
 msgstr ""
 
-#: editor_actions.cc:1989
+#: editor_actions.cc:2007
 msgid "Place Transient"
 msgstr ""
 
-#: editor_actions.cc:1990
+#: editor_actions.cc:2008
 msgid "Split/Separate"
 msgstr ""
 
-#: editor_actions.cc:1991
+#: editor_actions.cc:2009
 msgid "Trim Start at Edit Point"
 msgstr ""
 
-#: editor_actions.cc:1992
+#: editor_actions.cc:2010
 msgid "Trim End at Edit Point"
 msgstr ""
 
-#: editor_actions.cc:1997
+#: editor_actions.cc:2015
 msgid "Align Start"
 msgstr ""
 
-#: editor_actions.cc:2004
+#: editor_actions.cc:2022
 msgid "Align Start Relative"
 msgstr ""
 
-#: editor_actions.cc:2008
+#: editor_actions.cc:2026
 msgid "Align End"
 msgstr ""
 
-#: editor_actions.cc:2013
+#: editor_actions.cc:2031
 msgid "Align End Relative"
 msgstr ""
 
-#: editor_actions.cc:2020
+#: editor_actions.cc:2038
 msgid "Align Sync"
 msgstr ""
 
-#: editor_actions.cc:2027
+#: editor_actions.cc:2045
 msgid "Align Sync Relative"
 msgstr ""
 
-#: editor_actions.cc:2031 editor_actions.cc:2034
+#: editor_actions.cc:2049 editor_actions.cc:2050
 msgid "Choose Top..."
 msgstr ""
 
@@ -4452,32 +5009,33 @@ msgid ""
 "%2 as a new source, or skip it?"
 msgstr ""
 
-#: editor_audio_import.cc:282 editor_videotimeline.cc:91
+#: editor_audio_import.cc:282 editor_pt_import.cc:149
+#: editor_videotimeline.cc:91
 msgid "Cancel Import"
 msgstr "Cancelar importação"
 
-#: editor_audio_import.cc:559
+#: editor_audio_import.cc:565
 msgid "Editor: cannot open file \"%1\", (%2)"
 msgstr "Editor: não foi possível abrir o ficheiro \"%1\", (%2)"
 
-#: editor_audio_import.cc:567
+#: editor_audio_import.cc:573
 msgid "Cancel entire import"
 msgstr "Cancelar importação inteira"
 
-#: editor_audio_import.cc:568
+#: editor_audio_import.cc:574
 msgid "Don't embed it"
 msgstr "Não acrescentar"
 
-#: editor_audio_import.cc:569
+#: editor_audio_import.cc:575
 msgid "Embed all without questions"
 msgstr "Acrescentar sem qualquer questão"
 
-#: editor_audio_import.cc:572 editor_audio_import.cc:598
-#: export_format_dialog.cc:60
+#: editor_audio_import.cc:578 editor_audio_import.cc:604
+#: export_format_dialog.cc:68
 msgid "Sample rate"
 msgstr ""
 
-#: editor_audio_import.cc:573 editor_audio_import.cc:599
+#: editor_audio_import.cc:579 editor_audio_import.cc:605
 msgid ""
 "%1\n"
 "This audiofile's sample rate doesn't match the session sample rate!"
@@ -4485,207 +5043,276 @@ msgstr ""
 "%1\n"
 "A frequência de amostragem deste ficheiro audio não é igual à de sessão!"
 
-#: editor_audio_import.cc:595
+#: editor_audio_import.cc:601
 msgid "Embed it anyway"
 msgstr "Acrescentar de qualquer forma"
 
-#: editor_canvas_events.cc:1306 editor_drag.cc:1381
+#: editor_pt_import.cc:81
+msgid "You can't import a PT session until you have a session loaded."
+msgstr ""
+
+#: editor_pt_import.cc:86
+msgid "Import PT Session"
+msgstr ""
+
+#: editor_pt_import.cc:97
+msgid "%1: this is only the directory/folder name, not the filename.\n"
+msgstr ""
+
+#: editor_pt_import.cc:132
+msgid "Doesn't seem to be a valid PT session file"
+msgstr ""
+
+#: editor_pt_import.cc:136
+msgid ""
+"PT v%1 Session @ %2Hz\n"
+"\n"
+"%3 audio files\n"
+"%4 regions\n"
+"%5 active regions\n"
+"\n"
+"Continue..."
+msgstr ""
+
+#: editor_pt_import.cc:175
+msgid ""
+"Failed to load one or more of the audio files, but continuing to attempt "
+"import."
+msgstr ""
+
+#: editor_pt_import.cc:178
+msgid "Success! Import should complete soon."
+msgstr ""
+
+#: editor_pt_import.cc:263
+msgid "PTImport: UINT_MAX routes? impossible!"
+msgstr ""
+
+#: editor_canvas_events.cc:1296 editor_drag.cc:1418
 msgid "Could not create new track after region placed in the drop zone"
 msgstr ""
 
-#: editor_drag.cc:1266
+#: editor_drag.cc:1306
 msgid "fixed time region drag"
 msgstr ""
 
-#: editor_drag.cc:2214
+#: editor_drag.cc:2249
 msgid "Ripple drag"
 msgstr ""
 
-#: editor_drag.cc:2365 midi_region_view.cc:2813
+#: editor_drag.cc:2311
+msgid "create region"
+msgstr ""
+
+#: editor_drag.cc:2430 midi_region_view.cc:2859
 msgid "resize notes"
 msgstr ""
 
-#: editor_drag.cc:2517
+#: editor_drag.cc:2613 editor_drag.cc:2648
+msgid ""
+"One or more Audio Regions\n"
+"are both Locked and\n"
+"Locked to Video.\n"
+"The video cannot me moved."
+msgstr ""
+
+#: editor_drag.cc:2683
 msgid "Video Start:"
 msgstr ""
 
-#: editor_drag.cc:2519
+#: editor_drag.cc:2685
 msgid "Diff:"
 msgstr ""
 
-#: editor_drag.cc:2538
+#: editor_drag.cc:2707
 msgid "Move Video"
 msgstr ""
 
-#: editor_drag.cc:3046
+#: editor_drag.cc:3177
+msgid "move meter mark"
+msgstr "mover marccador métrico"
+
+#: editor_drag.cc:3179
 msgid "copy meter mark"
 msgstr "copiar marcador métrico"
 
-#: editor_drag.cc:3054
-msgid "move meter mark"
-msgstr "mover marccador métrico"
+#: editor_drag.cc:3279
+msgid "inactive"
+msgstr ""
 
-#: editor_drag.cc:3177
+#: editor_drag.cc:3324
+msgid "move tempo mark"
+msgstr "mover marcador de tempo"
+
+#: editor_drag.cc:3331
 msgid "copy tempo mark"
 msgstr "copiar marcador de tempo"
 
-#: editor_drag.cc:3185
-msgid "move tempo mark"
-msgstr "mover marcador de tempo"
+#: editor_drag.cc:3462
+msgid "dilate tempo"
+msgstr ""
 
-#: editor_drag.cc:3412
+#: editor_drag.cc:3736
 msgid "change fade in length"
 msgstr "alterar duração de evanescimento"
 
-#: editor_drag.cc:3526
+#: editor_drag.cc:3861
 msgid "change fade out length"
 msgstr "alterar duração de desvanecimento"
 
-#: editor_drag.cc:3880
+#: editor_drag.cc:4239
 msgid "move marker"
 msgstr "mover marcador"
 
-#: editor_drag.cc:4490
+#: editor_drag.cc:4506 editor_drag.cc:5833
+msgid "automation range move"
+msgstr ""
+
+#: editor_drag.cc:4890
 msgid "An error occurred while executing time stretch operation"
 msgstr ""
 
-#: editor_drag.cc:4947
+#: editor_drag.cc:5351
 msgid "programming_error: %1"
 msgstr ""
 
-#: editor_drag.cc:5016 editor_drag.cc:5026
+#: editor_drag.cc:5420 editor_drag.cc:5430
 msgid "new skip marker"
 msgstr ""
 
-#: editor_drag.cc:5017
+#: editor_drag.cc:5421
 msgid "skip"
 msgstr ""
 
-#: editor_drag.cc:5021 location_ui.cc:56
+#: editor_drag.cc:5425 location_ui.cc:60
 msgid "CD"
 msgstr ""
 
-#: editor_drag.cc:5022
+#: editor_drag.cc:5426
 msgid "new CD marker"
 msgstr ""
 
-#: editor_drag.cc:5027 editor_route_groups.cc:437 mixer_ui.cc:1493
+#: editor_drag.cc:5431 editor_route_groups.cc:439 mixer_ui.cc:1840
 msgid "unnamed"
 msgstr "sem nome"
 
-#: editor_drag.cc:5309
+#: editor_drag.cc:5740
 msgid "Automation range drag created for invalid region type"
 msgstr ""
 
-#: editor_route_groups.cc:96
+#: editor_route_groups.cc:97
 msgid "Col"
 msgstr ""
 
-#: editor_route_groups.cc:96
+#: editor_route_groups.cc:97
 msgid "Group Tab Color"
 msgstr ""
 
-#: editor_route_groups.cc:97
+#: editor_route_groups.cc:98
 msgid "Name of Group"
 msgstr ""
 
-#: editor_route_groups.cc:98 editor_routes.cc:207
-msgid "V"
+#: editor_route_groups.cc:99 editor_routes.cc:234
+msgid "Visible|V"
 msgstr ""
 
-#: editor_route_groups.cc:98
+#: editor_route_groups.cc:99
 msgid "Group is visible?"
 msgstr ""
 
-#: editor_route_groups.cc:99
+#: editor_route_groups.cc:100
 msgid "On"
 msgstr ""
 
-#: editor_route_groups.cc:99
+#: editor_route_groups.cc:100
 msgid "Group is enabled?"
 msgstr ""
 
-#: editor_route_groups.cc:100
-msgid "group|G"
+#: editor_route_groups.cc:101
+msgid "Group|G"
 msgstr ""
 
-#: editor_route_groups.cc:100
+#: editor_route_groups.cc:101
 msgid "Sharing Gain?"
 msgstr ""
 
-#: editor_route_groups.cc:101
-msgid "relative|Rel"
+#: editor_route_groups.cc:102
+msgid "Relative|Rel"
 msgstr ""
 
-#: editor_route_groups.cc:101
+#: editor_route_groups.cc:102
 msgid "Relative Gain Changes?"
 msgstr ""
 
-#: editor_route_groups.cc:102
-msgid "mute|M"
+#: editor_route_groups.cc:103 editor_regions.cc:168 editor_routes.cc:239
+#: mixer_strip.cc:2221 meter_strip.cc:365 route_time_axis.cc:2742
+#: time_axis_view.cc:1106
+msgid "Mute|M"
 msgstr ""
 
-#: editor_route_groups.cc:102
+#: editor_route_groups.cc:103
 msgid "Sharing Mute?"
 msgstr ""
 
-#: editor_route_groups.cc:103
-msgid "solo|S"
+#: editor_route_groups.cc:104 editor_routes.cc:240 mixer_strip.cc:2234
+#: meter_strip.cc:373 route_time_axis.cc:2739 vca_master_strip.cc:211
+#: vca_time_axis.cc:236
+msgid "Solo|S"
 msgstr ""
 
-#: editor_route_groups.cc:103
+#: editor_route_groups.cc:104
 msgid "Sharing Solo?"
 msgstr ""
 
-#: editor_route_groups.cc:104 midi_time_axis.cc:1622 midi_time_axis.cc:1625
-#: midi_time_axis.cc:1628
+#: editor_route_groups.cc:105 midi_time_axis.cc:1626 midi_time_axis.cc:1629
+#: midi_time_axis.cc:1632
 msgid "Rec"
 msgstr ""
 
-#: editor_route_groups.cc:104
+#: editor_route_groups.cc:105
 msgid "Sharing Record-enable Status?"
 msgstr ""
 
-#: editor_route_groups.cc:105
-msgid "monitoring|Mon"
+#: editor_route_groups.cc:106
+msgid "Monitoring|Mon"
 msgstr ""
 
-#: editor_route_groups.cc:105
+#: editor_route_groups.cc:106
 msgid "Sharing Monitoring Choice?"
 msgstr ""
 
-#: editor_route_groups.cc:106
-msgid "selection|Sel"
+#: editor_route_groups.cc:107
+msgid "Selection|Sel"
 msgstr ""
 
-#: editor_route_groups.cc:106
+#: editor_route_groups.cc:107
 msgid "Sharing Selected/Editing Status?"
 msgstr ""
 
-#: editor_route_groups.cc:107
-msgid "active|A"
+#: editor_route_groups.cc:108 editor_routes.cc:235
+msgid "Active|A"
 msgstr ""
 
-#: editor_route_groups.cc:107
+#: editor_route_groups.cc:108
 msgid "Sharing Active Status?"
 msgstr ""
 
-#: editor_export_audio.cc:92 editor_markers.cc:740 editor_markers.cc:827
-#: editor_markers.cc:1012 editor_markers.cc:1030 editor_markers.cc:1048
-#: editor_markers.cc:1067 editor_markers.cc:1086 editor_markers.cc:1116
-#: editor_markers.cc:1147 editor_markers.cc:1177 editor_markers.cc:1205
-#: editor_markers.cc:1236 editor_markers.cc:1261 editor_markers.cc:1312
-#: editor_markers.cc:1356 editor_markers.cc:1382 editor_markers.cc:1576
-#: editor_mouse.cc:2120
+#: editor_export_audio.cc:93 editor_markers.cc:733 editor_markers.cc:832
+#: editor_markers.cc:1045 editor_markers.cc:1063 editor_markers.cc:1081
+#: editor_markers.cc:1100 editor_markers.cc:1119 editor_markers.cc:1149
+#: editor_markers.cc:1180 editor_markers.cc:1210 editor_markers.cc:1238
+#: editor_markers.cc:1269 editor_markers.cc:1294 editor_markers.cc:1345
+#: editor_markers.cc:1458 editor_markers.cc:1484 editor_markers.cc:1678
+#: editor_mouse.cc:2255
 msgid "programming error: marker canvas item has no marker object pointer!"
 msgstr ""
 
-#: editor_export_audio.cc:145 editor_export_audio.cc:150
-msgid "File Exists!"
+#: editor_export_audio.cc:114
+msgid "Confirm MIDI File Overwrite"
 msgstr ""
 
-#: editor_export_audio.cc:153
-msgid "Overwrite Existing File"
+#: editor_export_audio.cc:115 utils_videotl.cc:73
+msgid "A file with the same name already exists. Do you want to overwrite it?"
 msgstr ""
 
 #: editor_group_tabs.cc:176
@@ -4700,300 +5327,341 @@ msgstr ""
 msgid "end"
 msgstr ""
 
-#: editor_markers.cc:657 editor_ops.cc:2085 editor_ops.cc:2107
-#: editor_ops.cc:2164 editor_ops.cc:2193 location_ui.cc:1023
+#: editor_markers.cc:645
+msgid "mark"
+msgstr ""
+
+#: editor_markers.cc:650 editor_ops.cc:2164 editor_ops.cc:2186
+#: editor_ops.cc:2304 editor_ops.cc:2341 location_ui.cc:1049
 msgid "add marker"
 msgstr "acrescentar marcador"
 
-#: editor_markers.cc:689 editor_markers.cc:1456
+#: editor_markers.cc:682 editor_markers.cc:1558
 msgid "set loop range"
 msgstr "estabelcer intervalo cíclico"
 
-#: editor_markers.cc:705 editor_markers.cc:1462
+#: editor_markers.cc:698 editor_markers.cc:1564
 msgid "set punch range"
 msgstr "estabelecer intervalo de inserção"
 
-#: editor_markers.cc:722 editor_ops.cc:4055
+#: editor_markers.cc:715 editor_ops.cc:4159
 msgid "range"
 msgstr ""
 
-#: editor_markers.cc:725
+#: editor_markers.cc:718
 msgid "new range marker"
 msgstr "novo marcador de região"
 
-#: editor_markers.cc:758 editor_ops.cc:2129 location_ui.cc:859
+#: editor_markers.cc:751 editor_ops.cc:2272 location_ui.cc:885
 msgid "remove marker"
 msgstr "remover marcador"
 
-#: editor_markers.cc:894
+#: editor_markers.cc:899
 msgid "Locate to Here"
 msgstr ""
 
-#: editor_markers.cc:895
+#: editor_markers.cc:900
 msgid "Play from Here"
 msgstr ""
 
-#: editor_markers.cc:896
+#: editor_markers.cc:901
 msgid "Move Mark to Playhead"
 msgstr ""
 
-#: editor_markers.cc:900
+#: editor_markers.cc:905
 msgid "Create Range to Next Marker"
 msgstr ""
 
-#: editor_markers.cc:941
+#: editor_markers.cc:946
 msgid "Locate to Marker"
 msgstr ""
 
-#: editor_markers.cc:942
+#: editor_markers.cc:947
 msgid "Play from Marker"
 msgstr ""
 
-#: editor_markers.cc:945
+#: editor_markers.cc:950
 msgid "Set Marker from Playhead"
 msgstr ""
 
-#: editor_markers.cc:947
+#: editor_markers.cc:951
 msgid "Set Range from Selection"
 msgstr ""
 
-#: editor_markers.cc:957
+#: editor_markers.cc:960
 msgid "Hide Range"
 msgstr "Esconder intervalo"
 
-#: editor_markers.cc:958
+#: editor_markers.cc:961
 msgid "Rename Range..."
 msgstr ""
 
-#: editor_markers.cc:962
+#: editor_markers.cc:965
 msgid "Remove Range"
 msgstr "Remover intervalo"
 
-#: editor_markers.cc:969
+#: editor_markers.cc:972
 msgid "Separate Regions in Range"
 msgstr "Separar regiões no intervalo"
 
-#: editor_markers.cc:972
+#: editor_markers.cc:974
 msgid "Select Range"
 msgstr ""
 
-#: editor_markers.cc:1001
+#: editor_markers.cc:987
+msgid "Make Ramped"
+msgstr ""
+
+#: editor_markers.cc:989
+msgid "Make Constant"
+msgstr ""
+
+#: editor_markers.cc:993 editor_markers.cc:1013
+msgid "Lock to Music"
+msgstr ""
+
+#: editor_markers.cc:995 editor_markers.cc:1015
+msgid "Lock to Audio"
+msgstr ""
+
+#: editor_markers.cc:1034
 msgid "Set Punch Range"
 msgstr "Estabelecer intervalo de inserção"
 
-#: editor_markers.cc:1407 editor_ops.cc:2040
+#: editor_markers.cc:1391
+msgid "change meter lock style"
+msgstr ""
+
+#: editor_markers.cc:1414
+msgid "change tempo lock style"
+msgstr ""
+
+#: editor_markers.cc:1441
+msgid "change tempo type"
+msgstr ""
+
+#: editor_markers.cc:1509 editor_ops.cc:2119
 msgid "New Name:"
 msgstr "Novo nome: "
 
-#: editor_markers.cc:1410
+#: editor_markers.cc:1512
 msgid "Rename Mark"
 msgstr "Renomear marcador"
 
-#: editor_markers.cc:1412
+#: editor_markers.cc:1514
 msgid "Rename Range"
 msgstr "Renomear intervalo"
 
-#: editor_markers.cc:1419 editor_mouse.cc:2137 processor_box.cc:1994
-#: processor_box.cc:2464 route_time_axis.cc:1100 route_ui.cc:1628
+#: editor_markers.cc:1521 editor_mouse.cc:2272 processor_box.cc:3192
+#: processor_box.cc:3681 route_time_axis.cc:1110 route_ui.cc:1637
+#: vca_master_strip.cc:395
 msgid "Rename"
 msgstr "Renomear"
 
-#: editor_markers.cc:1432
+#: editor_markers.cc:1534
 msgid "rename marker"
 msgstr "remover marcador"
 
-#: editor_mixer.cc:90
+#: editor_mixer.cc:98
 msgid "This screen is not tall enough to display the editor mixer"
 msgstr ""
 
-#: editor_mouse.cc:1223 editor_mouse.cc:1241 editor_tempodisplay.cc:270
+#: editor_mouse.cc:1345 editor_mouse.cc:1363 editor_tempodisplay.cc:384
 msgid ""
 "programming error: tempo marker canvas item has no marker object pointer!"
 msgstr ""
 
-#: editor_mouse.cc:1228 editor_tempodisplay.cc:275
+#: editor_mouse.cc:1350 editor_tempodisplay.cc:389
 msgid "programming error: marker for tempo is not a tempo marker!"
 msgstr ""
 
-#: editor_mouse.cc:1246 editor_tempodisplay.cc:375
+#: editor_mouse.cc:1368 editor_tempodisplay.cc:507
 msgid "programming error: marker for meter is not a meter marker!"
 msgstr ""
 
-#: editor_mouse.cc:1885 editor_mouse.cc:1910 editor_mouse.cc:1923
+#: editor_mouse.cc:2016 editor_mouse.cc:2041 editor_mouse.cc:2054
 msgid ""
 "programming error: control point canvas item has no control point object "
 "pointer!"
 msgstr ""
 
-#: editor_mouse.cc:2058
+#: editor_mouse.cc:2085
+msgid "edit note(s)"
+msgstr ""
+
+#: editor_mouse.cc:2193
 msgid "start point trim"
 msgstr ""
 
-#: editor_mouse.cc:2083
-msgid "End point trim"
-msgstr "Ponto final de corte"
+#: editor_mouse.cc:2218
+msgid "end point trim"
+msgstr ""
 
-#: editor_mouse.cc:2135
+#: editor_mouse.cc:2270
 msgid "Name for region:"
 msgstr "Nome para a região:"
 
-#: editor_ops.cc:165
+#: editor_ops.cc:168
 msgid "split"
 msgstr "separar"
 
-#: editor_ops.cc:339
+#: editor_ops.cc:342
 msgid "alter selection"
 msgstr ""
 
-#: editor_ops.cc:381
+#: editor_ops.cc:384
 msgid "nudge regions forward"
 msgstr ""
 
-#: editor_ops.cc:404 editor_ops.cc:489
+#: editor_ops.cc:441 editor_ops.cc:535
 msgid "nudge location forward"
 msgstr ""
 
-#: editor_ops.cc:462
+#: editor_ops.cc:472
 msgid "nudge regions backward"
 msgstr ""
 
-#: editor_ops.cc:551
+#: editor_ops.cc:567
 msgid "nudge forward"
 msgstr "retocar p/frente"
 
-#: editor_ops.cc:575
+#: editor_ops.cc:591
 msgid "nudge backward"
 msgstr ""
 
-#: editor_ops.cc:618
+#: editor_ops.cc:656
 msgid "sequence regions"
 msgstr ""
 
-#: editor_ops.cc:694
+#: editor_ops.cc:718
 msgid "build_region_boundary_cache called with snap_type = %1"
 msgstr ""
 
-#: editor_ops.cc:2042
+#: editor_ops.cc:2121
 msgid "New Location Marker"
 msgstr ""
 
-#: editor_ops.cc:2164
+#: editor_ops.cc:2212 editor_ops.cc:2236
+msgid "Set session start"
+msgstr ""
+
+#: editor_ops.cc:2304
 msgid "add markers"
 msgstr ""
 
-#: editor_ops.cc:2274
+#: editor_ops.cc:2400
 msgid "clear markers"
 msgstr "apagar marcadores"
 
-#: editor_ops.cc:2289
+#: editor_ops.cc:2415
 msgid "clear ranges"
 msgstr "apagar intervalos"
 
-#: editor_ops.cc:2305
+#: editor_ops.cc:2431
 msgid "clear locations"
 msgstr "apagar localizações"
 
-#: editor_ops.cc:2368
+#: editor_ops.cc:2494
 msgid "insert region"
 msgstr "inserir região"
 
-#: editor_ops.cc:2559
+#: editor_ops.cc:2685
 msgid "raise regions"
 msgstr ""
 
-#: editor_ops.cc:2561
+#: editor_ops.cc:2687
 msgid "raise region"
 msgstr ""
 
-#: editor_ops.cc:2567
+#: editor_ops.cc:2693
 msgid "raise regions to top"
 msgstr ""
 
-#: editor_ops.cc:2569
+#: editor_ops.cc:2695
 msgid "raise region to top"
 msgstr ""
 
-#: editor_ops.cc:2575
+#: editor_ops.cc:2701
 msgid "lower regions"
 msgstr ""
 
-#: editor_ops.cc:2577 editor_ops.cc:2585
+#: editor_ops.cc:2703 editor_ops.cc:2711
 msgid "lower region"
 msgstr ""
 
-#: editor_ops.cc:2583
+#: editor_ops.cc:2709
 msgid "lower regions to bottom"
 msgstr ""
 
-#: editor_ops.cc:2668
+#: editor_ops.cc:2794
 msgid "Rename Region"
 msgstr ""
 
-#: editor_ops.cc:2670 processor_box.cc:1992 route_ui.cc:1626
+#: editor_ops.cc:2796 processor_box.cc:3190 route_ui.cc:1635
 msgid "New name:"
 msgstr ""
 
-#: editor_ops.cc:2987
+#: editor_ops.cc:3097
 msgid "separate"
 msgstr "separar"
 
-#: editor_ops.cc:3099
+#: editor_ops.cc:3207
 msgid "separate region under"
 msgstr ""
 
-#: editor_ops.cc:3220
+#: editor_ops.cc:3360
 msgid "trim to selection"
 msgstr "cortar pela selecção"
 
-#: editor_ops.cc:3356
+#: editor_ops.cc:3442
 msgid "set sync point"
 msgstr ""
 
-#: editor_ops.cc:3380
+#: editor_ops.cc:3466
 msgid "remove region sync"
 msgstr ""
 
-#: editor_ops.cc:3402
+#: editor_ops.cc:3488
 msgid "move regions to original position"
 msgstr ""
 
-#: editor_ops.cc:3404
+#: editor_ops.cc:3490
 msgid "move region to original position"
 msgstr ""
 
-#: editor_ops.cc:3425
+#: editor_ops.cc:3511
 msgid "align selection"
 msgstr "alinhar selecção"
 
-#: editor_ops.cc:3499
+#: editor_ops.cc:3585
 msgid "align selection (relative)"
 msgstr "alinhar selecção (relativamente)"
 
-#: editor_ops.cc:3533
+#: editor_ops.cc:3619
 msgid "align region"
 msgstr "alinhar região"
 
-#: editor_ops.cc:3584
+#: editor_ops.cc:3670
 msgid "trim front"
 msgstr ""
 
-#: editor_ops.cc:3584
+#: editor_ops.cc:3670
 msgid "trim back"
 msgstr ""
 
-#: editor_ops.cc:3614
+#: editor_ops.cc:3700
 msgid "trim to loop"
 msgstr ""
 
-#: editor_ops.cc:3624
+#: editor_ops.cc:3710
 msgid "trim to punch"
 msgstr ""
 
-#: editor_ops.cc:3686
+#: editor_ops.cc:3832
 msgid "trim to region"
 msgstr ""
 
-#: editor_ops.cc:3794
+#: editor_ops.cc:3891
 msgid ""
 "This track/bus cannot be frozen because the signal adds or loses channels "
 "before reaching the outputs.\n"
@@ -5001,11 +5669,11 @@ msgid ""
 "input or vice versa."
 msgstr ""
 
-#: editor_ops.cc:3797
+#: editor_ops.cc:3894
 msgid "Cannot freeze"
 msgstr ""
 
-#: editor_ops.cc:3803
+#: editor_ops.cc:3900
 msgid ""
 "<b>%1</b>\n"
 "\n"
@@ -5014,23 +5682,23 @@ msgid ""
 "Freezing will only process the signal as far as the first send/insert/return."
 msgstr ""
 
-#: editor_ops.cc:3807
+#: editor_ops.cc:3904
 msgid "Freeze anyway"
 msgstr ""
 
-#: editor_ops.cc:3808
+#: editor_ops.cc:3905
 msgid "Don't freeze"
 msgstr ""
 
-#: editor_ops.cc:3809
+#: editor_ops.cc:3906
 msgid "Freeze Limits"
 msgstr ""
 
-#: editor_ops.cc:3824
+#: editor_ops.cc:3921
 msgid "Cancel Freeze"
 msgstr "Cancelar congelamento"
 
-#: editor_ops.cc:3854
+#: editor_ops.cc:3952
 msgid ""
 "You can't perform this operation because the processing of the signal will "
 "cause one or more of the tracks to end up with a region with more channels "
@@ -5039,47 +5707,47 @@ msgid ""
 "You can do this without processing, which is a different operation."
 msgstr ""
 
-#: editor_ops.cc:3858
+#: editor_ops.cc:3956
 msgid "Cannot bounce"
 msgstr ""
 
-#: editor_ops.cc:3869
+#: editor_ops.cc:4007
 msgid "bounce range"
 msgstr "regravar região"
 
-#: editor_ops.cc:3971
+#: editor_ops.cc:4074
 msgid "delete"
 msgstr ""
 
-#: editor_ops.cc:3974
+#: editor_ops.cc:4077
 msgid "cut"
 msgstr "corte"
 
-#: editor_ops.cc:3977
+#: editor_ops.cc:4080
 msgid "copy"
 msgstr "cópia"
 
-#: editor_ops.cc:3980
+#: editor_ops.cc:4083
 msgid "clear"
 msgstr "apagar"
 
-#: editor_ops.cc:4028
+#: editor_ops.cc:4132
 msgid "objects"
 msgstr ""
 
-#: editor_ops.cc:4238 editor_ops.cc:4270
+#: editor_ops.cc:4342 editor_ops.cc:4427
 msgid "remove region"
 msgstr "remover região"
 
-#: editor_ops.cc:4719
-msgid "duplicate selection"
-msgstr "duplicar selecção"
+#: editor_ops.cc:4844
+msgid "duplicate range selection"
+msgstr ""
 
-#: editor_ops.cc:4803
+#: editor_ops.cc:4938
 msgid "nudge track"
 msgstr "retocar faixa"
 
-#: editor_ops.cc:4840
+#: editor_ops.cc:4965
 msgid ""
 "Do you really want to destroy the last capture?\n"
 "(This is destructive and cannot be undone)"
@@ -5087,136 +5755,156 @@ msgstr ""
 "Deseja realmente eliminar a última captura?\n"
 "(esta operação é destrutiva e não pode ser desfeita)"
 
-#: editor_ops.cc:4843 editor_ops.cc:6838 editor_regions.cc:462
-#: editor_snapshots.cc:159 route_ui.cc:1569
+#: editor_ops.cc:4968 editor_ops.cc:7202 editor_regions.cc:503
+#: editor_snapshots.cc:171
 msgid "No, do nothing."
 msgstr "Não, não fazer nada."
 
-#: editor_ops.cc:4844
+#: editor_ops.cc:4969
 msgid "Yes, destroy it."
 msgstr "Sim, elimine-a."
 
-#: editor_ops.cc:4846
+#: editor_ops.cc:4971
 msgid "Destroy last capture"
 msgstr ""
 
-#: editor_ops.cc:4906
+#: editor_ops.cc:5047
 msgid "normalize"
 msgstr "normalizar"
 
-#: editor_ops.cc:5000
+#: editor_ops.cc:5145
 msgid "reverse regions"
 msgstr "inverter regiões"
 
-#: editor_ops.cc:5034
+#: editor_ops.cc:5182
 msgid "strip silence"
 msgstr ""
 
-#: editor_ops.cc:5091
+#: editor_ops.cc:5263
 msgid "Fork Region(s)"
 msgstr ""
 
-#: editor_ops.cc:5112
+#: editor_ops.cc:5270
 msgid "Could not unlink %1"
 msgstr ""
 
-#: editor_ops.cc:5326
+#: editor_ops.cc:5532
 msgid "reset region gain"
 msgstr ""
 
-#: editor_ops.cc:5379
+#: editor_ops.cc:5590
 msgid "region gain envelope active"
 msgstr ""
 
-#: editor_ops.cc:5406
+#: editor_ops.cc:5615
 msgid "toggle region lock"
 msgstr ""
 
-#: editor_ops.cc:5430
+#: editor_ops.cc:5639
 msgid "Toggle Video Lock"
 msgstr ""
 
-#: editor_ops.cc:5454
+#: editor_ops.cc:5663
 msgid "region lock style"
 msgstr ""
 
-#: editor_ops.cc:5479
+#: editor_ops.cc:5688
 msgid "change region opacity"
 msgstr ""
 
-#: editor_ops.cc:5572
+#: editor_ops.cc:5781
 msgid "fade range"
 msgstr ""
 
-#: editor_ops.cc:5610
+#: editor_ops.cc:5819
 msgid "set fade in length"
 msgstr ""
 
-#: editor_ops.cc:5617
+#: editor_ops.cc:5826
 msgid "set fade out length"
 msgstr ""
 
-#: editor_ops.cc:5662
+#: editor_ops.cc:5891
 msgid "set fade in shape"
 msgstr ""
 
-#: editor_ops.cc:5693
+#: editor_ops.cc:5926
 msgid "set fade out shape"
 msgstr ""
 
-#: editor_ops.cc:5723
+#: editor_ops.cc:5962
 msgid "set fade in active"
 msgstr ""
 
-#: editor_ops.cc:5752
+#: editor_ops.cc:5996
 msgid "set fade out active"
 msgstr ""
 
-#: editor_ops.cc:5994
+#: editor_ops.cc:6056
+msgid "toggle fade active"
+msgstr ""
+
+#: editor_ops.cc:6249
 msgid "set loop range from selection"
 msgstr ""
 
-#: editor_ops.cc:6008
+#: editor_ops.cc:6263
 msgid "set loop range from region"
 msgstr ""
 
-#: editor_ops.cc:6027
+#: editor_ops.cc:6282
 msgid "set punch range from selection"
 msgstr ""
 
-#: editor_ops.cc:6041
+#: editor_ops.cc:6306
 msgid "set session start/end from selection"
 msgstr ""
 
-#: editor_ops.cc:6066
+#: editor_ops.cc:6344
+msgid "set punch start from EP"
+msgstr ""
+
+#: editor_ops.cc:6372
+msgid "set punch end from EP"
+msgstr ""
+
+#: editor_ops.cc:6405
+msgid "set loop start from EP"
+msgstr ""
+
+#: editor_ops.cc:6433
+msgid "set loop end from EP"
+msgstr ""
+
+#: editor_ops.cc:6444
 msgid "set punch range from region"
 msgstr ""
 
-#: editor_ops.cc:6175
+#: editor_ops.cc:6531
 msgid "Add new marker"
 msgstr ""
 
-#: editor_ops.cc:6176
+#: editor_ops.cc:6532
 msgid "Set global tempo"
 msgstr ""
 
-#: editor_ops.cc:6179
+#: editor_ops.cc:6535
 msgid "Define one bar"
 msgstr ""
 
-#: editor_ops.cc:6180
+#: editor_ops.cc:6536
 msgid "Do you want to set the global tempo or add a new tempo marker?"
 msgstr ""
 
-#: editor_ops.cc:6206
+#: editor_ops.cc:6562
 msgid "set tempo from region"
 msgstr ""
 
-#: editor_ops.cc:6236
+#: editor_ops.cc:6591
 msgid "split regions"
 msgstr ""
 
-#: editor_ops.cc:6278
+#: editor_ops.cc:6633
 msgid ""
 "You are about to split\n"
 "%1\n"
@@ -5224,62 +5912,62 @@ msgid ""
 "This could take a long time."
 msgstr ""
 
-#: editor_ops.cc:6285
+#: editor_ops.cc:6640
 msgid "Call for the Ferret!"
 msgstr ""
 
-#: editor_ops.cc:6286
+#: editor_ops.cc:6641
 msgid ""
 "Press OK to continue with this split operation\n"
 "or ask the Ferret dialog to tune the analysis"
 msgstr ""
 
-#: editor_ops.cc:6288
+#: editor_ops.cc:6643
 msgid "Press OK to continue with this split operation"
 msgstr ""
 
-#: editor_ops.cc:6291
+#: editor_ops.cc:6646
 msgid "Excessive split?"
 msgstr ""
 
-#: editor_ops.cc:6443
+#: editor_ops.cc:6800
 msgid "place transient"
 msgstr ""
 
-#: editor_ops.cc:6478
+#: editor_ops.cc:6834
 msgid "snap regions to grid"
 msgstr ""
 
-#: editor_ops.cc:6517
+#: editor_ops.cc:6873
 msgid "Close Region Gaps"
 msgstr ""
 
-#: editor_ops.cc:6522
+#: editor_ops.cc:6878
 msgid "Crossfade length"
 msgstr ""
 
-#: editor_ops.cc:6531 editor_ops.cc:6542 rhythm_ferret.cc:119
-#: session_option_editor.cc:141
+#: editor_ops.cc:6887 editor_ops.cc:6898 rhythm_ferret.cc:128
+#: rhythm_ferret.cc:143 session_option_editor.cc:141
 msgid "ms"
 msgstr ""
 
-#: editor_ops.cc:6533
+#: editor_ops.cc:6889
 msgid "Pull-back length"
 msgstr ""
 
-#: editor_ops.cc:6546
+#: editor_ops.cc:6902 keyeditor.cc:71
 msgid "Ok"
 msgstr ""
 
-#: editor_ops.cc:6561
+#: editor_ops.cc:6917
 msgid "close region gaps"
 msgstr ""
 
-#: editor_ops.cc:6786 route_ui.cc:1543
+#: editor_ops.cc:7160
 msgid "That would be bad news ...."
 msgstr ""
 
-#: editor_ops.cc:6791 route_ui.cc:1548
+#: editor_ops.cc:7165
 msgid ""
 "Removing the master or monitor bus is such a bad idea\n"
 "that %1 is not going to allow it.\n"
@@ -5289,23 +5977,19 @@ msgid ""
 "\"allow-special-bus-removal\" option to be \"yes\""
 msgstr ""
 
-#: editor_ops.cc:6809
-msgid "tracks"
-msgstr ""
-
-#: editor_ops.cc:6811 route_ui.cc:1992
+#: editor_ops.cc:7181
 msgid "track"
-msgstr ""
-
-#: editor_ops.cc:6815
-msgid "busses"
-msgstr ""
+msgid_plural "tracks"
+msgstr[0] ""
+msgstr[1] ""
 
-#: editor_ops.cc:6817 route_ui.cc:1992
+#: editor_ops.cc:7182
 msgid "bus"
-msgstr ""
+msgid_plural "busses"
+msgstr[0] ""
+msgstr[1] ""
 
-#: editor_ops.cc:6822
+#: editor_ops.cc:7186
 msgid ""
 "Do you really want to remove %1 %2 and %3 %4?\n"
 "(You may also lose the playlists associated with the %2)\n"
@@ -5313,7 +5997,7 @@ msgid ""
 "This action cannot be undone, and the session file will be overwritten!"
 msgstr ""
 
-#: editor_ops.cc:6827
+#: editor_ops.cc:7191
 msgid ""
 "Do you really want to remove %1 %2?\n"
 "(You may also lose the playlists associated with the %2)\n"
@@ -5321,358 +6005,371 @@ msgid ""
 "This action cannot be undone, and the session file will be overwritten!"
 msgstr ""
 
-#: editor_ops.cc:6833
+#: editor_ops.cc:7197
 msgid ""
 "Do you really want to remove %1 %2?\n"
 "\n"
 "This action cannot be undone, and the session file will be overwritten"
 msgstr ""
 
-#: editor_ops.cc:6840
+#: editor_ops.cc:7204
 msgid "Yes, remove them."
 msgstr ""
 
-#: editor_ops.cc:6842 editor_snapshots.cc:160 route_ui.cc:1570
+#: editor_ops.cc:7206 editor_snapshots.cc:172
 msgid "Yes, remove it."
 msgstr "Sim, remover."
 
-#: editor_ops.cc:6847 editor_ops.cc:6849
+#: editor_ops.cc:7211 editor_ops.cc:7213
 msgid "Remove %1"
 msgstr ""
 
-#: editor_ops.cc:6912
+#: editor_ops.cc:7319 editor_ops.cc:7333 editor_ops.cc:7373 editor_ops.cc:7383
 msgid "insert time"
 msgstr ""
 
-#: editor_ops.cc:7076
+#: editor_ops.cc:7436
+msgid "Cannot insert or delete time when in Lock edit."
+msgstr ""
+
+#: editor_ops.cc:7456 editor_ops.cc:7468 editor_ops.cc:7541 editor_ops.cc:7554
+msgid "remove time"
+msgstr ""
+
+#: editor_ops.cc:7628
 msgid "There are too many tracks to fit in the current window"
 msgstr ""
 
-#: editor_ops.cc:7137
+#: editor_ops.cc:7689
 msgid "Sel"
 msgstr ""
 
-#: editor_ops.cc:7176
+#: editor_ops.cc:7728
 #, c-format
 msgid "Saved view %u"
 msgstr ""
 
-#: editor_ops.cc:7201
+#: editor_ops.cc:7753
 msgid "mute regions"
 msgstr ""
 
-#: editor_ops.cc:7203
+#: editor_ops.cc:7755
 msgid "mute region"
 msgstr "emudecer região"
 
-#: editor_ops.cc:7240
+#: editor_ops.cc:7792
 msgid "combine regions"
 msgstr ""
 
-#: editor_ops.cc:7278
+#: editor_ops.cc:7830
 msgid "uncombine regions"
 msgstr ""
 
-#: editor_ops.cc:7315
+#: editor_ops.cc:7867
 msgid "%1: Locked"
 msgstr ""
 
-#: editor_ops.cc:7322
+#: editor_ops.cc:7874
 msgid "Click to unlock"
 msgstr ""
 
-#: editor_ops.cc:7376
+#: editor_ops.cc:7923
 msgid "Moving embedded files into session folder"
 msgstr ""
 
-#: editor_regions.cc:112
+#: editor_regions.cc:159
 msgid "Region name, with number of channels in []'s"
 msgstr ""
 
-#: editor_regions.cc:113
+#: editor_regions.cc:160
 msgid "Position of start of region"
 msgstr ""
 
-#: editor_regions.cc:114 editor_regions.cc:851 time_info_box.cc:101
+#: editor_regions.cc:161 editor_regions.cc:935 time_info_box.cc:95
 msgid "End"
 msgstr ""
 
-#: editor_regions.cc:114
+#: editor_regions.cc:161
 msgid "Position of end of region"
 msgstr ""
 
-#: editor_regions.cc:115
+#: editor_regions.cc:162
 msgid "Length of the region"
 msgstr ""
 
-#: editor_regions.cc:116
+#: editor_regions.cc:163
 msgid "Position of region sync point, relative to start of the region"
 msgstr ""
 
-#: editor_regions.cc:117
+#: editor_regions.cc:164
 msgid "Length of region fade-in (units: secondary clock), () if disabled"
 msgstr ""
 
-#: editor_regions.cc:118
+#: editor_regions.cc:165
 msgid "Length of region fade-out (units: secondary clock), () if disabled"
 msgstr ""
 
-#: editor_regions.cc:119 mixer_strip.cc:2055 mono_panner.cc:203
-#: panner2d.cc:240 stereo_panner.cc:251 stereo_panner.cc:274
-msgid "L"
+#: editor_regions.cc:166
+msgid "Lock|L"
 msgstr ""
 
-#: editor_regions.cc:119
+#: editor_regions.cc:166
 msgid "Region position locked?"
 msgstr ""
 
-#: editor_regions.cc:120 route_time_axis.cc:103
-msgid "G"
+#: editor_regions.cc:167
+msgid "Gain|G"
 msgstr ""
 
-#: editor_regions.cc:120
+#: editor_regions.cc:167
 msgid "Region position glued to Bars|Beats time?"
 msgstr ""
 
-#: editor_regions.cc:121 editor_routes.cc:211 gain_meter.cc:793
-#: mixer_strip.cc:2032 meter_strip.cc:359 panner_ui.cc:603
-#: route_time_axis.cc:2713 stereo_panner.cc:271 time_axis_view.cc:1190
-msgid "M"
-msgstr ""
-
-#: editor_regions.cc:121
+#: editor_regions.cc:168
 msgid "Region muted?"
 msgstr ""
 
-#: editor_regions.cc:122 mixer_strip.cc:1855
-msgid "O"
+#: editor_regions.cc:169
+msgid "Opaque|O"
 msgstr ""
 
-#: editor_regions.cc:122
+#: editor_regions.cc:169
 msgid "Region opaque (blocks regions below it from being heard)?"
 msgstr ""
 
-#: editor_regions.cc:311 editor_regions.cc:316 editor_regions.cc:318
+#: editor_regions.cc:360 editor_regions.cc:365 editor_regions.cc:367
 msgid "Hidden"
 msgstr "Escondida"
 
-#: editor_regions.cc:391
+#: editor_regions.cc:432
 msgid "(MISSING) "
 msgstr ""
 
-#: editor_regions.cc:459
+#: editor_regions.cc:500
 msgid ""
 "Do you really want to remove unused regions?\n"
 "(This is destructive and cannot be undone)"
 msgstr ""
 
-#: editor_regions.cc:463
+#: editor_regions.cc:504
 msgid "Yes, remove."
 msgstr ""
 
-#: editor_regions.cc:465
+#: editor_regions.cc:506
 msgid "Remove unused regions"
 msgstr ""
 
-#: editor_regions.cc:818 editor_regions.cc:832 editor_regions.cc:846
+#: editor_regions.cc:735
+msgid "EditorRegions::format_position: negative timecode position: %1"
+msgstr ""
+
+#: editor_regions.cc:900 editor_regions.cc:916 editor_regions.cc:930
 msgid "Mult."
 msgstr ""
 
-#: editor_regions.cc:849 midi_list_editor.cc:104 time_info_box.cc:94
+#: editor_regions.cc:933 midi_list_editor.cc:104 time_info_box.cc:88
 msgid "Start"
 msgstr ""
 
-#: editor_regions.cc:867 editor_regions.cc:883
+#: editor_regions.cc:951 editor_regions.cc:967
 msgid "Multiple"
 msgstr ""
 
-#: editor_regions.cc:952
+#: editor_regions.cc:1036
 msgid "MISSING "
 msgstr ""
 
-#: editor_routes.cc:182 editor_routes.cc:214
+#: editor_routes.cc:126
+msgid "RS"
+msgstr ""
+
+#: editor_routes.cc:208
 msgid "SS"
 msgstr ""
 
-#: editor_routes.cc:206
+#: editor_routes.cc:233
 msgid "Track/Bus Name"
 msgstr ""
 
-#: editor_routes.cc:207
+#: editor_routes.cc:234
 msgid "Track/Bus visible ?"
 msgstr ""
 
-#: editor_routes.cc:208 mixer_strip.cc:2046 meter_strip.cc:371
-#: route_time_axis.cc:105 route_time_axis.cc:2701
-msgid "A"
-msgstr ""
-
-#: editor_routes.cc:208
+#: editor_routes.cc:235
 msgid "Track/Bus active ?"
 msgstr ""
 
-#: editor_routes.cc:209 mixer_strip.cc:2033 mixer_strip.cc:2054
-#: meter_strip.cc:379
-msgid "I"
-msgstr "E"
+#: editor_routes.cc:236
+msgid "MidiInput|I"
+msgstr ""
 
-#: editor_routes.cc:209
+#: editor_routes.cc:236
 msgid "MIDI input enabled"
 msgstr ""
 
-#: editor_routes.cc:210 mono_panner.cc:220 panner2d.cc:241
-#: stereo_panner.cc:249 stereo_panner.cc:276
-msgid "R"
+#: editor_routes.cc:237
+msgid "Rec|R"
 msgstr ""
 
-#: editor_routes.cc:210
+#: editor_routes.cc:237
 msgid "Record enabled"
 msgstr ""
 
-#: editor_routes.cc:211
-msgid "Muted"
+#: editor_routes.cc:238
+msgid "Rec|RS"
 msgstr ""
 
-#: editor_routes.cc:212 mixer_strip.cc:2042 meter_strip.cc:367
-#: route_time_axis.cc:2710
-msgid "S"
+#: editor_routes.cc:238
+msgid "Record Safe"
+msgstr ""
+
+#: editor_routes.cc:239
+msgid "Muted"
 msgstr ""
 
-#: editor_routes.cc:212
+#: editor_routes.cc:240
 msgid "Soloed"
 msgstr ""
 
-#: editor_routes.cc:213
-msgid "SI"
+#: editor_routes.cc:241
+msgid "SoloIso|SI"
 msgstr ""
 
-#: editor_routes.cc:213
+#: editor_routes.cc:241
 msgid "Solo Isolated"
 msgstr ""
 
-#: editor_routes.cc:214
+#: editor_routes.cc:242
+msgid "SoloLock|SS"
+msgstr ""
+
+#: editor_routes.cc:242
 msgid "Solo Safe (Locked)"
 msgstr ""
 
-#: editor_routes.cc:477 mixer_ui.cc:1197
+#: editor_routes.cc:550 mixer_ui.cc:1498
 msgid "Hide All"
 msgstr "Esconder tudo"
 
-#: editor_routes.cc:478 mixer_ui.cc:1198
+#: editor_routes.cc:551 mixer_ui.cc:1499
 msgid "Show All Audio Tracks"
 msgstr "Mostrar todos as faixas audio"
 
-#: editor_routes.cc:479 mixer_ui.cc:1199
+#: editor_routes.cc:552 mixer_ui.cc:1500
 msgid "Hide All Audio Tracks"
 msgstr "Esconder todos as faixas audio"
 
-#: editor_routes.cc:480 mixer_ui.cc:1200
+#: editor_routes.cc:553 mixer_ui.cc:1501
 msgid "Show All Audio Busses"
 msgstr "Mostrar todos os barramentos audio"
 
-#: editor_routes.cc:481 mixer_ui.cc:1201
+#: editor_routes.cc:554 mixer_ui.cc:1502
 msgid "Hide All Audio Busses"
 msgstr "Esconder todos os barramentos audio"
 
-#: editor_routes.cc:482
+#: editor_routes.cc:555 mixer_ui.cc:1503
 msgid "Show All Midi Tracks"
 msgstr ""
 
-#: editor_routes.cc:483
+#: editor_routes.cc:556 mixer_ui.cc:1504
 msgid "Hide All Midi Tracks"
 msgstr ""
 
-#: editor_routes.cc:484
-msgid "Show Tracks With Regions Under Playhead"
+#: editor_routes.cc:557
+msgid "Only Show Tracks with Regions Under Playhead"
 msgstr ""
 
-#: editor_rulers.cc:211
+#: editor_rulers.cc:212
 msgid "New location marker"
 msgstr "Novo marcador de localização"
 
-#: editor_rulers.cc:212
+#: editor_rulers.cc:213
 msgid "Clear all locations"
 msgstr "Apagar todas as localizações"
 
-#: editor_rulers.cc:213
+#: editor_rulers.cc:214
 msgid "Unhide locations"
 msgstr ""
 
-#: editor_rulers.cc:217
+#: editor_rulers.cc:218
 msgid "New range"
 msgstr ""
 
-#: editor_rulers.cc:218
+#: editor_rulers.cc:219
 msgid "Clear all ranges"
 msgstr "Apagar todos os intervalos"
 
-#: editor_rulers.cc:219
+#: editor_rulers.cc:220
 msgid "Unhide ranges"
 msgstr ""
 
 #: editor_rulers.cc:224
-msgid "Make Loop range"
+msgid "New Loop range"
 msgstr ""
 
 #: editor_rulers.cc:225
-msgid "Make Punch range"
+msgid "New Punch range"
 msgstr ""
 
 #: editor_rulers.cc:230
 msgid "New CD track marker"
 msgstr ""
 
-#: editor_rulers.cc:235 tempo_dialog.cc:38
+#: editor_rulers.cc:234 tempo_dialog.cc:38
 msgid "New Tempo"
 msgstr "Novo tempo"
 
-#: editor_rulers.cc:239 tempo_dialog.cc:296
+#: editor_rulers.cc:238 tempo_dialog.cc:419
 msgid "New Meter"
 msgstr "Novo VUímetro"
 
-#: editor_snapshots.cc:137
+#: editor_snapshots.cc:149
 msgid "Rename Snapshot"
 msgstr ""
 
-#: editor_snapshots.cc:139
+#: editor_snapshots.cc:151
 msgid "New name of snapshot"
 msgstr ""
 
-#: editor_snapshots.cc:157
+#: editor_snapshots.cc:169
 msgid ""
 "Do you really want to remove snapshot \"%1\" ?\n"
 "(which cannot be undone)"
 msgstr ""
 
-#: editor_snapshots.cc:162
+#: editor_snapshots.cc:174
 msgid "Remove snapshot"
 msgstr ""
 
-#: editor_tempodisplay.cc:194 editor_tempodisplay.cc:234
-msgid "add"
-msgstr "acrescentar"
-
-#: editor_tempodisplay.cc:215
+#: editor_tempodisplay.cc:318
 msgid "add tempo mark"
 msgstr "acrescentar marcador de tempo"
 
-#: editor_tempodisplay.cc:254
+#: editor_tempodisplay.cc:343
+msgid "add"
+msgstr "acrescentar"
+
+#: editor_tempodisplay.cc:362
 msgid "add meter mark"
 msgstr "acrescentar marcador métrico"
 
-#: editor_tempodisplay.cc:287 editor_tempodisplay.cc:315
+#: editor_tempodisplay.cc:401 editor_tempodisplay.cc:435
 msgid "done"
 msgstr "pronto"
 
-#: editor_tempodisplay.cc:304 editor_tempodisplay.cc:330
+#: editor_tempodisplay.cc:422
+msgid "replace meter mark"
+msgstr ""
+
+#: editor_tempodisplay.cc:454
 msgid "replace tempo mark"
 msgstr "substituir marcador de tempo"
 
-#: editor_tempodisplay.cc:353 editor_tempodisplay.cc:387
+#: editor_tempodisplay.cc:485 editor_tempodisplay.cc:519
 msgid "remove tempo mark"
 msgstr "remover marcador de tempo"
 
-#: editor_tempodisplay.cc:370
+#: editor_tempodisplay.cc:502
 msgid ""
 "programming error: meter marker canvas item has no marker object pointer!"
 msgstr ""
@@ -5681,329 +6378,382 @@ msgstr ""
 msgid "stretch/shrink"
 msgstr ""
 
-#: editor_timefx.cc:129
+#: editor_timefx.cc:130
 msgid "pitch shift"
 msgstr ""
 
-#: editor_timefx.cc:301
+#: editor_timefx.cc:282
 msgid "timefx cannot be started - thread creation error"
 msgstr ""
 
-#: engine_dialog.cc:83
+#: engine_dialog.cc:86
 msgid "Device Control Panel"
 msgstr ""
 
-#: engine_dialog.cc:84
+#: engine_dialog.cc:87
 msgid "Midi Device Setup"
 msgstr ""
 
-#: engine_dialog.cc:85 engine_dialog.cc:2097
+#: engine_dialog.cc:89
+msgid "Refresh Devices"
+msgstr ""
+
+#: engine_dialog.cc:90
+msgid "Use Buffered I/O"
+msgstr ""
+
+#: engine_dialog.cc:91 engine_dialog.cc:3000
 msgid "Measure"
 msgstr ""
 
-#: engine_dialog.cc:86
+#: engine_dialog.cc:92
 msgid "Use results"
 msgstr ""
 
-#: engine_dialog.cc:87
+#: engine_dialog.cc:93
 msgid "Back to settings ... (ignore results)"
 msgstr ""
 
-#: engine_dialog.cc:88
+#: engine_dialog.cc:94
 msgid "Calibrate Audio"
 msgstr ""
 
-#: engine_dialog.cc:92
+#: engine_dialog.cc:98
 msgid "Back to settings"
 msgstr ""
 
-#: engine_dialog.cc:111
+#: engine_dialog.cc:120
 msgid ""
 "No audio/MIDI backends detected. %1 cannot run\n"
 "\n"
 "(This is a build/packaging/system error. It should never happen.)"
 msgstr ""
 
-#: engine_dialog.cc:137
+#: engine_dialog.cc:145
 msgid "Latency Measurement Tool"
 msgstr ""
 
-#: engine_dialog.cc:149
+#: engine_dialog.cc:157
 msgid ""
 "<span weight=\"bold\">Turn down the volume on your audio equipment to a very "
 "low level.</span>"
 msgstr ""
 
-#: engine_dialog.cc:158
+#: engine_dialog.cc:166
 msgid "Select two channels below and connect them using a cable."
 msgstr ""
 
-#: engine_dialog.cc:163
+#: engine_dialog.cc:171
 msgid "Output channel"
 msgstr ""
 
-#: engine_dialog.cc:171
+#: engine_dialog.cc:179
 msgid "Input channel"
 msgstr ""
 
-#: engine_dialog.cc:206
+#: engine_dialog.cc:213
 msgid "Once the channels are connected, click the \"Measure\" button."
 msgstr ""
 
-#: engine_dialog.cc:213
+#: engine_dialog.cc:220
 msgid "When satisfied with the results, click the \"Use results\" button."
 msgstr ""
 
-#: engine_dialog.cc:228 engine_dialog.cc:2217 engine_dialog.cc:2227
+#: engine_dialog.cc:235 engine_dialog.cc:3138 engine_dialog.cc:3148
 msgid "No measurement results yet"
 msgstr ""
 
-#: engine_dialog.cc:238 route_params_ui.cc:106
+#: engine_dialog.cc:245 route_params_ui.cc:106
 msgid "Latency"
 msgstr "Latência"
 
-#: engine_dialog.cc:372
+#: engine_dialog.cc:520
 msgid "Audio System:"
 msgstr ""
 
-#: engine_dialog.cc:409
+#: engine_dialog.cc:564
 msgid "Driver:"
 msgstr ""
 
-#: engine_dialog.cc:415
+#: engine_dialog.cc:571
+msgid "Input Device:"
+msgstr ""
+
+#: engine_dialog.cc:575
+msgid "Output Device:"
+msgstr ""
+
+#: engine_dialog.cc:582
 msgid "Device:"
 msgstr ""
 
-#: engine_dialog.cc:420 engine_dialog.cc:519 sfdb_ui.cc:153 sfdb_ui.cc:348
-#: sfdb_ui.cc:353
+#: engine_dialog.cc:591 engine_dialog.cc:699 export_report.cc:164
+#: export_report.cc:328 sfdb_ui.cc:153 sfdb_ui.cc:348 sfdb_ui.cc:353
 msgid "Sample rate:"
 msgstr ""
 
-#: engine_dialog.cc:426 engine_dialog.cc:526
+#: engine_dialog.cc:597 engine_dialog.cc:706
 msgid "Buffer size:"
 msgstr ""
 
-#: engine_dialog.cc:444
+#: engine_dialog.cc:606
+msgid "Periods:"
+msgstr ""
+
+#: engine_dialog.cc:624
 msgid "Input Channels:"
 msgstr ""
 
-#: engine_dialog.cc:457
+#: engine_dialog.cc:637
 msgid "Output Channels:"
 msgstr ""
 
-#: engine_dialog.cc:469
+#: engine_dialog.cc:649
 msgid "Hardware input latency:"
 msgstr ""
 
-#: engine_dialog.cc:472 engine_dialog.cc:485
+#: engine_dialog.cc:652 engine_dialog.cc:665
 msgid "samples"
 msgstr ""
 
-#: engine_dialog.cc:482
+#: engine_dialog.cc:662
 msgid "Hardware output latency:"
 msgstr ""
 
-#: engine_dialog.cc:493
+#: engine_dialog.cc:673
 msgid "MIDI System:"
 msgstr ""
 
-#: engine_dialog.cc:511
+#: engine_dialog.cc:691
 msgid ""
-"The %1 audio backend was configured and started externally.\n"
-"This limits your control over it."
+"%1 is already running. %2 will connect to it and use the existing settings."
 msgstr ""
 
-#: engine_dialog.cc:564
+#: engine_dialog.cc:744
 msgid ""
 "Failed to start or connect to audio-engine.\n"
 "\n"
 "Latency calibration requires a working audio interface."
 msgstr ""
 
-#: engine_dialog.cc:570
+#: engine_dialog.cc:750
 msgid ""
 "Your selected audio configuration is playback- or capture-only.\n"
 "\n"
 "Latency calibration requires playback and capture"
 msgstr ""
 
-#: engine_dialog.cc:651
+#: engine_dialog.cc:965
 msgid "MIDI Devices"
 msgstr ""
 
-#: engine_dialog.cc:657
+#: engine_dialog.cc:971
 msgid "Device"
 msgstr ""
 
-#: engine_dialog.cc:659
+#: engine_dialog.cc:973
 msgid "Hardware Latencies"
 msgstr ""
 
-#: engine_dialog.cc:700
+#: engine_dialog.cc:1014
 msgid "Calibrate"
 msgstr ""
 
-#: engine_dialog.cc:800
+#: engine_dialog.cc:1117
 msgid "all available channels"
 msgstr ""
 
-#: engine_dialog.cc:1039 latency_gui.cc:39
-msgid "sample"
-msgid_plural "samples"
+#: engine_dialog.cc:1599 latency_gui.cc:55
+msgid "%1 sample"
+msgid_plural "%1 samples"
 msgstr[0] ""
 msgstr[1] ""
 
-#: engine_dialog.cc:1090
+#: engine_dialog.cc:1662
 #, c-format
 msgid "(%.1f ms)"
 msgstr ""
 
-#: engine_dialog.cc:1593
+#: engine_dialog.cc:2413
 msgid "Could not start backend engine %1"
 msgstr ""
 
-#: engine_dialog.cc:1644
+#: engine_dialog.cc:2445
 msgid "Cannot set driver to %1"
 msgstr ""
 
-#: engine_dialog.cc:1648
+#: engine_dialog.cc:2450
+msgid "Cannot set input device name to %1"
+msgstr ""
+
+#: engine_dialog.cc:2454
+msgid "Cannot set output device name to %1"
+msgstr ""
+
+#: engine_dialog.cc:2459
 msgid "Cannot set device name to %1"
 msgstr ""
 
-#: engine_dialog.cc:1652
+#: engine_dialog.cc:2464
 msgid "Cannot set sample rate to %1"
 msgstr ""
 
-#: engine_dialog.cc:1656
+#: engine_dialog.cc:2468
 msgid "Cannot set buffer size to %1"
 msgstr ""
 
-#: engine_dialog.cc:1662
+#: engine_dialog.cc:2472
+msgid "Cannot set periods to %1"
+msgstr ""
+
+#: engine_dialog.cc:2478
 msgid "Cannot set input channels to %1"
 msgstr ""
 
-#: engine_dialog.cc:1666
+#: engine_dialog.cc:2482
 msgid "Cannot set output channels to %1"
 msgstr ""
 
-#: engine_dialog.cc:1672
+#: engine_dialog.cc:2488
 msgid "Cannot set input latency to %1"
 msgstr ""
 
-#: engine_dialog.cc:1676
+#: engine_dialog.cc:2492
 msgid "Cannot set output latency to %1"
 msgstr ""
 
-#: engine_dialog.cc:1955 engine_dialog.cc:2014
+#: engine_dialog.cc:2851 engine_dialog.cc:2917
 msgid "No signal detected "
 msgstr ""
 
-#: engine_dialog.cc:1968 engine_dialog.cc:2022 port_insert_ui.cc:70
+#: engine_dialog.cc:2858
+msgid ""
+"Input signal is > -3dBFS. Lower the signal level (output gain, input gain) "
+"on the audio-interface."
+msgstr ""
+
+#: engine_dialog.cc:2871 engine_dialog.cc:2925 port_insert_ui.cc:70
 #: port_insert_ui.cc:98
 msgid "Disconnected from audio engine"
 msgstr ""
 
-#: engine_dialog.cc:1977 engine_dialog.cc:2030
+#: engine_dialog.cc:2880 engine_dialog.cc:2933
 msgid "Detected roundtrip latency: "
 msgstr ""
 
-#: engine_dialog.cc:1979 engine_dialog.cc:2032
+#: engine_dialog.cc:2882 engine_dialog.cc:2935
 msgid "Systemic latency: "
 msgstr ""
 
-#: engine_dialog.cc:1986
+#: engine_dialog.cc:2889
 msgid "(signal detection error)"
 msgstr ""
 
-#: engine_dialog.cc:1992
+#: engine_dialog.cc:2895
 msgid "(inverted - bad wiring)"
 msgstr ""
 
-#: engine_dialog.cc:2039
+#: engine_dialog.cc:2942
 msgid "(averaging)"
 msgstr ""
 
-#: engine_dialog.cc:2045
+#: engine_dialog.cc:2948
 msgid "(too large jitter)"
 msgstr ""
 
-#: engine_dialog.cc:2049
+#: engine_dialog.cc:2952
 msgid "(large jitter)"
 msgstr ""
 
-#: engine_dialog.cc:2061
+#: engine_dialog.cc:2964
 msgid "Timeout - large MIDI jitter."
 msgstr ""
 
-#: engine_dialog.cc:2077 port_insert_ui.cc:134
+#: engine_dialog.cc:2980 port_insert_ui.cc:134
 msgid "Detecting ..."
 msgstr ""
 
-#: engine_dialog.cc:2171
+#: engine_dialog.cc:3081
 msgid "Disconnect from %1"
 msgstr ""
 
-#: engine_dialog.cc:2175 mixer_strip.cc:1522 route_group_dialog.cc:45
-#: route_time_axis.cc:841
-msgid "Active"
-msgstr "Activo"
+#: engine_dialog.cc:3086
+msgid "Running"
+msgstr ""
+
+#: engine_dialog.cc:3088
+msgid "Connected"
+msgstr ""
 
-#: engine_dialog.cc:2185
+#: engine_dialog.cc:3099
 msgid "Connect to %1"
 msgstr ""
 
-#: engine_dialog.cc:2190
-msgid "Inactive"
+#: engine_dialog.cc:3103 shuttle_control.cc:655
+msgid "Stopped"
 msgstr ""
 
-#: export_channel_selector.cc:45 sfdb_ui.cc:151
+#: export_channel_selector.cc:46 export_report.cc:159 export_report.cc:324
+#: sfdb_ui.cc:151
 msgid "Channels:"
 msgstr ""
 
-#: export_channel_selector.cc:46
+#: export_channel_selector.cc:47
 msgid "Split to mono files"
 msgstr ""
 
-#: export_channel_selector.cc:182
+#: export_channel_selector.cc:197
 msgid "Bus or Track"
 msgstr ""
 
-#: export_channel_selector.cc:459
+#: export_channel_selector.cc:474
 msgid "Region contents without fades nor region gain (channels: %1)"
 msgstr ""
 
-#: export_channel_selector.cc:463
+#: export_channel_selector.cc:478
 msgid "Region contents with fades and region gain (channels: %1)"
 msgstr ""
 
-#: export_channel_selector.cc:467
+#: export_channel_selector.cc:482
 msgid "Track output (channels: %1)"
 msgstr ""
 
-#: export_channel_selector.cc:536
-msgid "Export region contents"
+#: export_channel_selector.cc:552
+msgid "Apply track/bus processing"
 msgstr ""
 
-#: export_channel_selector.cc:537
-msgid "Export track output"
+#: export_channel_selector.cc:553
+msgid "Select all tracks"
 msgstr ""
 
-#: export_dialog.cc:46
+#: export_channel_selector.cc:554
+msgid "Select all busses"
+msgstr ""
+
+#: export_channel_selector.cc:555
+msgid "Deselect all"
+msgstr ""
+
+#: export_channel_selector.cc:589
+msgid "Track name"
+msgstr ""
+
+#: export_dialog.cc:48
 msgid ""
 "<span color=\"#ffa755\">Some already existing files will be overwritten.</"
 "span>"
 msgstr ""
 
-#: export_dialog.cc:47
+#: export_dialog.cc:49
 msgid "List files"
 msgstr ""
 
-#: export_dialog.cc:158 export_format_dialog.cc:59
+#: export_dialog.cc:158 export_format_dialog.cc:67
 msgid "File format"
 msgstr ""
 
-#: export_dialog.cc:159 export_timespan_selector.cc:374
-#: export_timespan_selector.cc:436
+#: export_dialog.cc:159 export_timespan_selector.cc:371
+#: export_timespan_selector.cc:433
 msgid "Time Span"
 msgstr ""
 
@@ -6029,45 +6779,57 @@ msgstr ""
 msgid "Stop Export"
 msgstr "Cancelar exportação"
 
-#: export_dialog.cc:327
+#: export_dialog.cc:336
 msgid "export"
 msgstr ""
 
-#: export_dialog.cc:346
+#: export_dialog.cc:355
+msgid "Exporting '%3' (timespan %1 of %2)"
+msgstr ""
+
+#: export_dialog.cc:360
 msgid "Normalizing '%3' (timespan %1 of %2)"
 msgstr ""
 
-#: export_dialog.cc:350
-msgid "Exporting '%3' (timespan %1 of %2)"
+#: export_dialog.cc:365
+msgid "Tagging '%3' (timespan %1 of %2)"
+msgstr ""
+
+#: export_dialog.cc:369
+msgid "Uploading '%3' (timespan %1 of %2)"
 msgstr ""
 
-#: export_dialog.cc:373 export_dialog.cc:375
+#: export_dialog.cc:373
+msgid "Running Post Export Command for '%1'"
+msgstr ""
+
+#: export_dialog.cc:401 export_dialog.cc:403
 msgid "<span color=\"#ffa755\">Error: "
 msgstr ""
 
-#: export_dialog.cc:385
+#: export_dialog.cc:413
 msgid "<span color=\"#ffa755\">Warning: "
 msgstr ""
 
-#: export_dialog.cc:387
+#: export_dialog.cc:415
 msgid ""
 "\n"
 "<span color=\"#ffa755\">Warning: "
 msgstr ""
 
-#: export_dialog.cc:411
+#: export_dialog.cc:439
 msgid "Export Selection"
 msgstr ""
 
-#: export_dialog.cc:425
+#: export_dialog.cc:453
 msgid "Export Region"
 msgstr ""
 
-#: export_dialog.cc:434
+#: export_dialog.cc:462
 msgid "Source"
 msgstr ""
 
-#: export_dialog.cc:450
+#: export_dialog.cc:478
 msgid "Stem Export"
 msgstr ""
 
@@ -6075,172 +6837,246 @@ msgstr ""
 msgid "Add another format"
 msgstr ""
 
-#: export_file_notebook.cc:193
+#: export_file_notebook.cc:198
 msgid "Format"
 msgstr "Formato"
 
-#: export_file_notebook.cc:194
+#: export_file_notebook.cc:199
 msgid "Location"
 msgstr "Localização"
 
-#: export_file_notebook.cc:195
+#: export_file_notebook.cc:200
 msgid "Upload to Soundcloud"
 msgstr ""
 
-#: export_file_notebook.cc:273
+#: export_file_notebook.cc:201
+msgid "Analyze Exported Audio"
+msgstr ""
+
+#: export_file_notebook.cc:286
 msgid "No format!"
 msgstr ""
 
-#: export_file_notebook.cc:291
+#: export_file_notebook.cc:304
 msgid "Format %1: %2"
 msgstr ""
 
-#: export_filename_selector.cc:32
+#: export_filename_selector.cc:33
 msgid "Label:"
 msgstr ""
 
-#: export_filename_selector.cc:33
+#: export_filename_selector.cc:34 session_dialog.cc:310
 msgid "Session Name"
 msgstr ""
 
-#: export_filename_selector.cc:34
-msgid "Revision:"
+#: export_filename_selector.cc:35
+msgid "Timespan Name"
 msgstr ""
 
 #: export_filename_selector.cc:36
+msgid "Revision:"
+msgstr ""
+
+#: export_filename_selector.cc:38
 msgid "Folder:"
 msgstr ""
 
-#: export_filename_selector.cc:37 session_import_dialog.cc:45
+#: export_filename_selector.cc:39 session_import_dialog.cc:45
 #: transcode_video_dialog.cc:59 video_server_dialog.cc:54
-#: video_server_dialog.cc:56 export_video_dialog.cc:81
-#: export_video_dialog.cc:83
+#: video_server_dialog.cc:56 export_video_dialog.cc:77
+#: export_video_dialog.cc:79
 msgid "Browse"
 msgstr "Pesquisar"
 
-#: export_filename_selector.cc:41
-msgid "<i>Build filename(s) from these components:</i>"
+#: export_filename_selector.cc:40 export_report.cc:118
+msgid "Open Folder"
+msgstr ""
+
+#: export_filename_selector.cc:45
+msgid "Build filename(s) from these components:"
 msgstr ""
 
-#: export_filename_selector.cc:212
+#: export_filename_selector.cc:217
 msgid ""
 "<small><i>Sorry, no example filename can be shown at the moment</i></small>"
 msgstr ""
 
-#: export_filename_selector.cc:214
-msgid "<small><i>Current (approximate) filename: \"%1\"</i></small>"
+#: export_filename_selector.cc:219
+msgid "<i>Current (approximate) filename</i>: \"%1\""
 msgstr ""
 
-#: export_filename_selector.cc:250 export_filename_selector.cc:336
+#: export_filename_selector.cc:255 export_filename_selector.cc:402
 msgid ""
 "%1: this is only the directory/folder name, not the filename.\n"
 "The filename will be chosen from the information just above the folder "
 "selector."
 msgstr ""
 
-#: export_filename_selector.cc:322
+#: export_filename_selector.cc:378
+msgid "%1: this is not a valid directory/folder."
+msgstr ""
+
+#: export_filename_selector.cc:388
 msgid "Choose export folder"
 msgstr ""
 
-#: export_format_dialog.cc:31
+#: export_format_dialog.cc:32
 msgid "New Export Format Profile"
 msgstr ""
 
-#: export_format_dialog.cc:31
+#: export_format_dialog.cc:32
 msgid "Edit Export Format Profile"
 msgstr ""
 
-#: export_format_dialog.cc:38
+#: export_format_dialog.cc:39
 msgid "Label: "
 msgstr ""
 
-#: export_format_dialog.cc:41 normalize_dialog.cc:42
-msgid "Normalize to:"
+#: export_format_dialog.cc:42
+msgid "Normalize:"
 msgstr ""
 
-#: export_format_dialog.cc:46
-msgid "Trim silence at start"
+#: export_format_dialog.cc:43
+msgid "Peak"
 msgstr ""
 
-#: export_format_dialog.cc:47
-msgid "Add silence at start:"
+#: export_format_dialog.cc:44
+msgid "Loudness"
 msgstr ""
 
 #: export_format_dialog.cc:50
-msgid "Trim silence at end"
+msgid "LUFS"
 msgstr ""
 
 #: export_format_dialog.cc:51
-msgid "Add silence at end:"
+msgid "dBTP"
 msgstr ""
 
 #: export_format_dialog.cc:54
+msgid "Trim silence at start"
+msgstr ""
+
+#: export_format_dialog.cc:55
+msgid "Add silence at start:"
+msgstr ""
+
+#: export_format_dialog.cc:58
+msgid "Trim silence at end"
+msgstr ""
+
+#: export_format_dialog.cc:59
+msgid "Add silence at end:"
+msgstr ""
+
+#: export_format_dialog.cc:62
 msgid ""
 "Command to run post-export\n"
-"(%f=full path & filename, %d=directory, %b=basename):"
+"(%f=file path, %d=directory, %b=basename, see tooltip for more):"
 msgstr ""
 
-#: export_format_dialog.cc:57
+#: export_format_dialog.cc:65
 msgid "Compatibility"
 msgstr ""
 
-#: export_format_dialog.cc:58
+#: export_format_dialog.cc:66
 msgid "Quality"
 msgstr ""
 
-#: export_format_dialog.cc:61
+#: export_format_dialog.cc:69
 msgid "Sample rate conversion quality:"
 msgstr ""
 
-#: export_format_dialog.cc:68
+#: export_format_dialog.cc:76
 msgid "Dithering"
 msgstr ""
 
-#: export_format_dialog.cc:70
+#: export_format_dialog.cc:78
 msgid "Create CUE file for disk-at-once CD/DVD creation"
 msgstr ""
 
-#: export_format_dialog.cc:71
+#: export_format_dialog.cc:79
 msgid "Create TOC file for disk-at-once CD/DVD creation"
 msgstr ""
 
-#: export_format_dialog.cc:73
+#: export_format_dialog.cc:80
+msgid "Create chapter mark file for MP4 chapter marks"
+msgstr ""
+
+#: export_format_dialog.cc:82
 msgid "Tag file with session's metadata"
 msgstr ""
 
-#: export_format_dialog.cc:470
+#: export_format_dialog.cc:119
+msgid "∧"
+msgstr ""
+
+#: export_format_dialog.cc:124
+msgid ""
+"Normalize to EBU-R128 LUFS target loudness without exceeding the given true-"
+"peak limit. EBU-R128 normalization is only available for mono and stereo "
+"targets, true-peak works for any channel layout."
+msgstr ""
+
+#: export_format_dialog.cc:152
+msgid ""
+"%a Artist name\n"
+"%b File's base-name\n"
+"%c Copyright\n"
+"%d File's directory\n"
+"%f File's full absolute path\n"
+"%l Lyricist\n"
+"%n Session name\n"
+"%o Conductor\n"
+"%t Title\n"
+"%z Organization\n"
+"%A Album\n"
+"%C Comment\n"
+"%E Engineer\n"
+"%G Genre\n"
+"%L Total track count\n"
+"%M Mixer\n"
+"%N Timespan name\n"
+"%O Composer\n"
+"%P Producer\n"
+"%S Disc subtitle\n"
+"%T Track number\n"
+"%Y Year\n"
+"%Z Country"
+msgstr ""
+
+#: export_format_dialog.cc:537
 msgid "Best (sinc)"
 msgstr ""
 
-#: export_format_dialog.cc:475
+#: export_format_dialog.cc:542
 msgid "Medium (sinc)"
 msgstr ""
 
-#: export_format_dialog.cc:480
+#: export_format_dialog.cc:547
 msgid "Fast (sinc)"
 msgstr ""
 
-#: export_format_dialog.cc:490
+#: export_format_dialog.cc:557
 msgid "Zero order hold"
 msgstr ""
 
-#: export_format_dialog.cc:895
+#: export_format_dialog.cc:981
 msgid "Linear encoding options"
 msgstr ""
 
-#: export_format_dialog.cc:911
+#: export_format_dialog.cc:997
 msgid "Ogg Vorbis options"
 msgstr ""
 
-#: export_format_dialog.cc:922
+#: export_format_dialog.cc:1008
 msgid "FLAC options"
 msgstr ""
 
-#: export_format_dialog.cc:939
+#: export_format_dialog.cc:1025
 msgid "Broadcast Wave options"
 msgstr ""
 
-#: export_format_selector.cc:136
+#: export_format_selector.cc:131
 msgid "Do you really want to remove the format?"
 msgstr ""
 
@@ -6248,29 +7084,200 @@ msgstr ""
 msgid "Preset"
 msgstr ""
 
-#: export_preset_selector.cc:104
+#: export_preset_selector.cc:99
 msgid ""
 "The selected preset did not load successfully!\n"
 "Perhaps it references a format that has been removed?"
 msgstr ""
 
-#: export_preset_selector.cc:156
+#: export_preset_selector.cc:151
 msgid "Do you really want to remove this preset?"
 msgstr ""
 
-#: export_timespan_selector.cc:46
+#: export_report.cc:56
+msgid "Export Report/Analysis"
+msgstr ""
+
+#: export_report.cc:147 export_report.cc:327 sfdb_ui.cc:149
+msgid "Format:"
+msgstr ""
+
+#: export_report.cc:166 export_report.cc:328
+msgid "%1 Hz"
+msgstr ""
+
+#: export_report.cc:169 export_report.cc:336 transcode_video_dialog.cc:139
+msgid "Duration:"
+msgstr ""
+
+#: export_report.cc:177 export_report.cc:334
+msgid "Timecode:"
+msgstr ""
+
+#: export_report.cc:185
+msgid "Error:"
+msgstr ""
+
+#: export_report.cc:220 export_report.cc:440
+msgid "(too short integration time)"
+msgstr ""
+
+#: export_report.cc:222
+msgid "-888"
+msgstr ""
+
+#: export_report.cc:227 export_report.cc:353
+msgid "Peak:"
+msgstr ""
+
+#: export_report.cc:228 export_report.cc:360
+msgid "%1 dBFS"
+msgstr ""
+
+#: export_report.cc:229 export_report.cc:369
+msgid "True Peak:"
+msgstr ""
+
+#: export_report.cc:230 export_report.cc:376
+msgid "%1 dBTP"
+msgstr ""
+
+#: export_report.cc:231 export_report.cc:387
+msgid "Normalization Gain:"
+msgstr ""
+
+#: export_report.cc:232
+msgid "+888.88 dB"
+msgstr ""
+
+#: export_report.cc:234 export_report.cc:448
+msgid "Integrated Loudness:"
+msgstr ""
+
+#: export_report.cc:235 export_report.cc:454
+msgid "%1 LUFS"
+msgstr ""
+
+#: export_report.cc:236 export_report.cc:460
+msgid "Loudness Range:"
+msgstr ""
+
+#: export_report.cc:237 export_report.cc:466
+msgid "%1 LU"
+msgstr ""
+
+#: export_report.cc:247 export_report.cc:754
+msgid "100"
+msgstr ""
+
+#: export_report.cc:282 export_report.cc:650
+msgid "00:00:00.000"
+msgstr ""
+
+#: export_report.cc:288
+msgid "0|A8"
+msgstr ""
+
+#: export_report.cc:394
+msgid "%1 dB"
+msgstr ""
+
+#: export_report.cc:425 export_report.cc:433 export_report.cc:553
+msgid ""
+"Not\n"
+"Available"
+msgstr ""
+
+#: export_report.cc:493
+msgid ""
+"LUFS\n"
+"(short)"
+msgstr ""
+
+#: export_report.cc:503
+msgid "Multiplicity"
+msgstr ""
+
+#: export_report.cc:603
+msgid "Logscale|Lg"
+msgstr ""
+
+#: export_report.cc:604
+msgid "Rectified|Rf"
+msgstr ""
+
+#: export_report.cc:605
+msgid "Logscale"
+msgstr ""
+
+#: export_report.cc:606
+msgid "Rectified"
+msgstr ""
+
+#: export_report.cc:738
+msgid "Hz"
+msgstr ""
+
+#: export_report.cc:755
+msgid "500"
+msgstr ""
+
+#: export_report.cc:756
+msgid "1K"
+msgstr ""
+
+#: export_report.cc:757
+msgid "5K"
+msgstr ""
+
+#: export_report.cc:758
+msgid "10K"
+msgstr ""
+
+#: export_report.cc:844
+msgid "Writing Export Analysis Image: %1."
+msgstr ""
+
+#: export_report.cc:941 sfdb_ui.cc:293 sfdb_ui.cc:409
+msgid "Could not read file: %1 (%2)."
+msgstr "Não foi possível ler o ficheiro: %1 (%2)."
+
+#: export_report.cc:967 sfdb_ui.cc:458
+msgid "Could not access soundfile: "
+msgstr "Não foi possível aceder ao ficheiros audio: "
+
+#: export_report.cc:1203
+msgid "-36"
+msgstr ""
+
+#: export_report.cc:1204 export_report.cc:1208 export_report.cc:1214
+#: export_report.cc:1217
+msgid "-18"
+msgstr ""
+
+#: export_report.cc:1205 export_report.cc:1209 export_report.cc:1215
+#: export_report.cc:1218 export_report.cc:1221 export_report.cc:1222
+msgid "-9"
+msgstr ""
+
+#: export_report.cc:1206 export_report.cc:1210 export_report.cc:1216
+#: export_report.cc:1219 export_report.cc:1223 export_report.cc:1224
+msgid "-3"
+msgstr ""
+
+#: export_timespan_selector.cc:44
 msgid "Show Times as:"
 msgstr ""
 
-#: export_timespan_selector.cc:53 processor_box.cc:2466
+#: export_timespan_selector.cc:51 processor_box.cc:3683
 msgid "Select All"
 msgstr "Seleccionar tudo"
 
-#: export_timespan_selector.cc:223 transform_dialog.cc:93
+#: export_timespan_selector.cc:220 transform_dialog.cc:93
 msgid " to "
 msgstr ""
 
-#: export_timespan_selector.cc:367 export_timespan_selector.cc:426
+#: export_timespan_selector.cc:364 export_timespan_selector.cc:423
 msgid "Range"
 msgstr ""
 
@@ -6286,36 +7293,39 @@ msgstr ""
 msgid "getSoundResourceFile: root = %1, != response"
 msgstr ""
 
-#: sfdb_freesound_mootcher.cc:410 rc_option_editor.cc:1824
+#: sfdb_freesound_mootcher.cc:410 rc_option_editor.cc:2416
 msgid "%1"
 msgstr ""
 
-#: gain_meter.cc:132 gain_meter.cc:400 gain_meter.cc:505 gain_meter.cc:896
+#: gain_meter.cc:137 gain_meter.cc:422 gain_meter.cc:527 gain_meter.cc:919
 msgid "-inf"
 msgstr ""
 
-#: gain_meter.cc:147 gain_meter.cc:958
+#: gain_meter.cc:152 gain_meter.cc:983
 msgid "Fader automation mode"
 msgstr "Modo de automatizaçã"
 
-#: gain_meter.cc:148 gain_meter.cc:959
+#: gain_meter.cc:153 gain_meter.cc:984
 msgid "Fader automation type"
 msgstr "Tipo de automatização"
 
-#: gain_meter.cc:157 gain_meter.cc:829 panner_ui.cc:179 panner_ui.cc:639
+#: gain_meter.cc:162 gain_meter.cc:852 panner_ui.cc:179 panner_ui.cc:641
 msgid "Abs"
 msgstr ""
 
-#: gain_meter.cc:796 mixer_strip.cc:2049 meter_strip.cc:374 panner_ui.cc:606
-#: route_time_axis.cc:104 route_time_axis.cc:2705
+#: gain_meter.cc:816 vca_master_strip.cc:78 vca_time_axis.cc:54
+msgid "M"
+msgstr ""
+
+#: gain_meter.cc:819 vca_master_strip.cc:296
 msgid "P"
 msgstr ""
 
-#: gain_meter.cc:799 panner_ui.cc:609
+#: gain_meter.cc:822
 msgid "T"
 msgstr ""
 
-#: gain_meter.cc:802 panner_ui.cc:612
+#: gain_meter.cc:825
 msgid "W"
 msgstr ""
 
@@ -6323,48 +7333,52 @@ msgstr ""
 msgid "<span size=\"large\">Presets</span>"
 msgstr "<span size=\"large\">Parametrizações</span>"
 
-#: generic_pluginui.cc:97
+#: generic_pluginui.cc:98 plugin_pin_dialog.cc:333
 msgid "Manual"
 msgstr ""
 
-#: generic_pluginui.cc:106
+#: generic_pluginui.cc:107
 msgid "All Automation"
 msgstr ""
 
 #: generic_pluginui.cc:250
-msgid "Switches"
-msgstr ""
-
-#: generic_pluginui.cc:260 generic_pluginui.cc:436 processor_box.cc:2440
-msgid "Controls"
-msgstr "Controlos"
-
-#: generic_pluginui.cc:293
 msgid "Plugin Editor: could not build control element for port %1"
 msgstr ""
 "Editor de efeitos/plug-ins: não foi possível criar elemento de controlo para "
 "%1"
 
-#: generic_pluginui.cc:318
+#: generic_pluginui.cc:282
 msgid "Plugin Editor: no control for property %1"
 msgstr ""
 
-#: generic_pluginui.cc:324
+#: generic_pluginui.cc:288
 msgid "Plugin Editor: could not build control element for property %1"
 msgstr ""
 
-#: generic_pluginui.cc:468
+#: generic_pluginui.cc:359
+msgid "Switches"
+msgstr ""
+
+#: generic_pluginui.cc:369 generic_pluginui.cc:475 processor_box.cc:3653
+msgid "Controls"
+msgstr "Controlos"
+
+#: generic_pluginui.cc:510
 msgid "Meters"
 msgstr ""
 
-#: generic_pluginui.cc:490
+#: generic_pluginui.cc:548
 msgid "Automation control"
 msgstr "Controlo de automatização"
 
-#: generic_pluginui.cc:497
+#: generic_pluginui.cc:555
 msgid "Mgnual"
 msgstr ""
 
+#: generic_pluginui.cc:828
+msgid "This control cannot be automated"
+msgstr ""
+
 #: global_port_matrix.cc:158
 msgid "Audio Connection Manager"
 msgstr ""
@@ -6373,126 +7387,163 @@ msgstr ""
 msgid "MIDI Connection Manager"
 msgstr ""
 
-#: global_port_matrix.cc:201 io_selector.cc:211 mixer_strip.cc:793
-#: mixer_strip.cc:894
+#: global_port_matrix.cc:201 io_selector.cc:211 mixer_strip.cc:863
+#: mixer_strip.cc:966 monitor_section.cc:1430 monitor_selector.cc:189
+#: plugin_pin_dialog.cc:1757
 msgid "Disconnect"
 msgstr "Desligar"
 
-#: global_port_matrix.cc:207 io_selector.cc:217
+#: global_port_matrix.cc:207 io_selector.cc:217 monitor_selector.cc:195
 msgid "port"
 msgstr "porto"
 
-#: group_tabs.cc:312
+#: group_tabs.cc:312 group_tabs.cc:321
 msgid "Selection..."
 msgstr ""
 
-#: group_tabs.cc:313
+#: group_tabs.cc:313 group_tabs.cc:322
 msgid "Record Enabled..."
 msgstr ""
 
-#: group_tabs.cc:314
+#: group_tabs.cc:314 group_tabs.cc:323
 msgid "Soloed..."
 msgstr ""
 
-#: group_tabs.cc:320
+#: group_tabs.cc:316
+msgid "Create New Group From..."
+msgstr ""
+
+#: group_tabs.cc:325
+msgid "Create New Group with Master From..."
+msgstr ""
+
+#: group_tabs.cc:344
 msgid "Create New Group ..."
 msgstr ""
 
-#: group_tabs.cc:321
-msgid "Create New Group From"
+#: group_tabs.cc:345
+msgid "Create New Group with Control Master ..."
 msgstr ""
 
-#: group_tabs.cc:324
+#: group_tabs.cc:355
 msgid "Edit Group..."
 msgstr ""
 
-#: group_tabs.cc:325
+#: group_tabs.cc:356
 msgid "Collect Group"
 msgstr ""
 
-#: group_tabs.cc:326
+#: group_tabs.cc:357
 msgid "Remove Group"
 msgstr ""
 
-#: group_tabs.cc:329
+#: group_tabs.cc:368
+msgid "Assign Group to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:374
 msgid "Remove Subgroup Bus"
 msgstr ""
 
-#: group_tabs.cc:331
+#: group_tabs.cc:376
 msgid "Add New Subgroup Bus"
 msgstr ""
 
-#: group_tabs.cc:333
+#: group_tabs.cc:378
 msgid "Add New Aux Bus (pre-fader)"
 msgstr ""
 
-#: group_tabs.cc:334
+#: group_tabs.cc:379
 msgid "Add New Aux Bus (post-fader)"
 msgstr ""
 
-#: group_tabs.cc:340
+#: group_tabs.cc:404
+msgid "Assign Selection to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:415
+msgid "Assign Record Enabled to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:426
+msgid "Assign Soloed to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:429
 msgid "Enable All Groups"
 msgstr ""
 
-#: group_tabs.cc:341
+#: group_tabs.cc:430
 msgid "Disable All Groups"
 msgstr ""
 
-#: insert_time_dialog.cc:46
+#: insert_remove_time_dialog.cc:52
+msgid "Time to remove"
+msgstr ""
+
+#: insert_remove_time_dialog.cc:52
 msgid "Time to insert:"
 msgstr ""
 
-#: insert_time_dialog.cc:54
+#: insert_remove_time_dialog.cc:61
 msgid "Intersected regions should:"
 msgstr ""
 
-#: insert_time_dialog.cc:57
+#: insert_remove_time_dialog.cc:64
 msgid "stay in position"
 msgstr ""
 
-#: insert_time_dialog.cc:58
+#: insert_remove_time_dialog.cc:65
 msgid "move"
 msgstr ""
 
-#: insert_time_dialog.cc:59
+#: insert_remove_time_dialog.cc:66
 msgid "be split"
 msgstr ""
 
-#: insert_time_dialog.cc:65
-msgid "Insert time on all the track's playlists"
+#: insert_remove_time_dialog.cc:73
+msgid "Apply to all the track's playlists"
 msgstr ""
 
-#: insert_time_dialog.cc:68
+#: insert_remove_time_dialog.cc:76
 msgid "Move glued regions"
 msgstr ""
 
-#: insert_time_dialog.cc:70
+#: insert_remove_time_dialog.cc:78
 msgid "Move markers"
 msgstr ""
 
-#: insert_time_dialog.cc:73
+#: insert_remove_time_dialog.cc:81
 msgid "Move glued markers"
 msgstr ""
 
-#: insert_time_dialog.cc:78
+#: insert_remove_time_dialog.cc:86
 msgid "Move locked markers"
 msgstr ""
 
-#: insert_time_dialog.cc:83
+#: insert_remove_time_dialog.cc:91
 msgid ""
 "Move tempo and meter changes\n"
 "<i>(may cause oddities in the tempo map)</i>"
 msgstr ""
 
-#: insert_time_dialog.cc:91
+#: insert_remove_time_dialog.cc:99
+msgid "Remove time"
+msgstr ""
+
+#: insert_remove_time_dialog.cc:99
 msgid "Insert time"
 msgstr ""
 
-#: instrument_selector.cc:62
+#: insert_remove_time_dialog.cc:174
+msgid "Invalid or zero duration entered. Please enter a valid duration"
+msgstr ""
+
+#: instrument_selector.cc:92
 msgid "-none-"
 msgstr ""
 
-#: interthread_progress_window.cc:103
+#: interthread_progress_window.cc:114
 msgid "Importing file: %1 of %2"
 msgstr ""
 
@@ -6500,64 +7551,89 @@ msgstr ""
 msgid "I/O selector"
 msgstr ""
 
-#: io_selector.cc:266
+#: io_selector.cc:266 monitor_selector.cc:244
 msgid "%1 input"
 msgstr "%1 entrada"
 
-#: io_selector.cc:268
+#: io_selector.cc:268 monitor_selector.cc:246
 msgid "%1 output"
 msgstr "%1 saída"
 
-#: keyboard.cc:70
+#: keyboard.cc:93
 msgid "your own"
 msgstr ""
 
-#: keyboard.cc:133 keyboard.cc:157
+#: keyboard.cc:157 keyboard.cc:181
 msgid "Default keybindings not found - %1 will be hard to use!"
 msgstr ""
 
-#: keyboard.cc:136
+#: keyboard.cc:160
 msgid "Key bindings file \"%1\" not found. Default bindings used instead"
 msgstr ""
 
-#: keyeditor.cc:54
+#: keyboard.cc:193
+msgid "Loading keybindings from %1"
+msgstr ""
+
+#: keyeditor.cc:67
+msgid "Colliding keybindings"
+msgstr ""
+
+#: keyeditor.cc:68
+msgid ""
+"The key sequence is already bound. Please remove the other binding first."
+msgstr ""
+
+#: keyeditor.cc:77
+msgid "Key Bindings"
+msgstr ""
+
+#: keyeditor.cc:78
 msgid "Remove shortcut"
 msgstr ""
 
-#: keyeditor.cc:63
-msgid "Action"
+#: keyeditor.cc:80
+msgid "Search..."
 msgstr ""
 
-#: keyeditor.cc:64
-msgid "Shortcut"
+#: keyeditor.cc:82
+msgid "Print"
 msgstr ""
 
-#: keyeditor.cc:84
-msgid "Select an action, then press the key(s) to (re)set its shortcut"
+#: keyeditor.cc:93
+msgid "Click to reset search string"
 msgstr ""
 
-#: keyeditor.cc:98
-msgid "Reset Bindings to Defaults"
+#: keyeditor.cc:97
+msgid "To remove a shortcut select an action then press this: "
 msgstr ""
 
-#: keyeditor.cc:263
-msgid "Main_menu"
+#: keyeditor.cc:109
+msgid "Reset Bindings to Defaults"
 msgstr ""
 
-#: keyeditor.cc:265
-msgid "redirectmenu"
+#: keyeditor.cc:227 lua_script_manager.cc:41
+msgid "Action"
 msgstr ""
 
-#: keyeditor.cc:267
-msgid "Editor_menus"
+#: keyeditor.cc:228
+msgid "Shortcut"
 msgstr ""
 
-#: keyeditor.cc:269
+#: keyeditor.cc:370
 msgid "RegionList"
 msgstr ""
 
-#: keyeditor.cc:271
-msgid "ProcessorMenu"
+#: keyeditor.cc:543
+msgid "Could not open temporary file to print bindings (%1)"
+msgstr ""
+
+#: keyeditor.cc:561
+msgid "Could not save bindings to file (%1)"
+msgstr ""
+
+#: latency_gui.cc:39
+msgid "sample"
 msgstr ""
 
 #: latency_gui.cc:40
@@ -6568,109 +7644,218 @@ msgstr ""
 msgid "period"
 msgstr ""
 
-#: latency_gui.cc:55
-msgid "%1 sample"
-msgid_plural "%1 samples"
-msgstr[0] ""
-msgstr[1] ""
-
-#: latency_gui.cc:72 panner_ui.cc:409
+#: latency_gui.cc:72 panner_ui.cc:411 plugin_pin_dialog.cc:109
+#: plugin_ui.cc:421
 msgid "Reset"
 msgstr "Reiniciar"
 
-#: latency_gui.cc:149 rhythm_ferret.cc:273 sfdb_ui.cc:1912
+#: latency_gui.cc:149 rhythm_ferret.cc:295 sfdb_ui.cc:1878
 msgid "programming error: %1 (%2)"
 msgstr ""
 
-#: location_ui.cc:52 location_ui.cc:54
+#: location_ui.cc:54 location_ui.cc:57
 msgid "Use PH"
 msgstr ""
 
-#: location_ui.cc:59
+#: location_ui.cc:55 location_ui.cc:58
+msgid "Goto"
+msgstr ""
+
+#: location_ui.cc:63
 msgid "Glue"
 msgstr ""
 
-#: location_ui.cc:87
+#: location_ui.cc:88
 msgid "Performer:"
 msgstr ""
 
-#: location_ui.cc:88
+#: location_ui.cc:89
 msgid "Composer:"
 msgstr ""
 
-#: location_ui.cc:90
+#: location_ui.cc:91
 msgid "Pre-Emphasis"
 msgstr "Pré-êmfase"
 
-#: location_ui.cc:317
+#: location_ui.cc:319
 msgid "Remove this range"
 msgstr ""
 
-#: location_ui.cc:318
+#: location_ui.cc:320
 msgid "Start time - middle click to locate here"
 msgstr ""
 
-#: location_ui.cc:319
+#: location_ui.cc:321
 msgid "End time - middle click to locate here"
 msgstr ""
 
-#: location_ui.cc:322
+#: location_ui.cc:324
 msgid "Set range start from playhead location"
 msgstr ""
 
-#: location_ui.cc:323
+#: location_ui.cc:325
 msgid "Set range end from playhead location"
 msgstr ""
 
-#: location_ui.cc:327
+#: location_ui.cc:329
 msgid "Remove this marker"
 msgstr ""
 
-#: location_ui.cc:328
+#: location_ui.cc:330
 msgid "Position - middle click to locate here"
 msgstr ""
 
-#: location_ui.cc:330
+#: location_ui.cc:332
 msgid "Set marker time from playhead location"
 msgstr ""
 
-#: location_ui.cc:499
+#: location_ui.cc:524
 msgid "You cannot put a CD marker at the start of the session"
 msgstr ""
 
-#: location_ui.cc:725
+#: location_ui.cc:750
 msgid "New Marker"
 msgstr ""
 
-#: location_ui.cc:726
+#: location_ui.cc:751
 msgid "New Range"
 msgstr ""
 
-#: location_ui.cc:739
+#: location_ui.cc:764
 msgid "<b>Loop/Punch Ranges</b>"
 msgstr ""
 
-#: location_ui.cc:764
+#: location_ui.cc:790
 msgid "<b>Markers (Including CD Index)</b>"
 msgstr ""
 
-#: location_ui.cc:799
+#: location_ui.cc:825
 msgid "<b>Ranges (Including CD Track Ranges)</b>"
 msgstr ""
 
-#: location_ui.cc:1042
+#: location_ui.cc:1068
 msgid "add range marker"
 msgstr "acrescentar marcador de região"
 
-#: main.cc:82
+#: lua_script_manager.cc:31
+msgid "Add/Set"
+msgstr ""
+
+#: lua_script_manager.cc:34
+msgid "Call"
+msgstr ""
+
+#: lua_script_manager.cc:35
+msgid "New Hook"
+msgstr ""
+
+#: lua_script_manager.cc:77
+msgid "Signal(s)"
+msgstr ""
+
+#: lua_script_manager.cc:127
+msgid "Action %1"
+msgstr ""
+
+#: lua_script_manager.cc:132 lua_script_manager.cc:227
+msgid "Unset"
+msgstr ""
+
+#: luainstance.cc:1079
+msgid "Cannot read script '%1': %2"
+msgstr ""
+
+#: luawindow.cc:97
+msgid "Run"
+msgstr ""
+
+#: luawindow.cc:98
+msgid "Clear Output"
+msgstr ""
+
+#: luawindow.cc:102
+msgid "Revert"
+msgstr ""
+
+#: luawindow.cc:166
+msgid "Select Editor Buffer"
+msgstr ""
+
+#: luawindow.cc:253 luawindow.cc:258
+msgid "Window|Lua"
+msgstr ""
+
+#: luawindow.cc:286 luawindow.cc:304
+msgid "LuaException: %1"
+msgstr ""
+
+#: luawindow.cc:342
+msgid "Deleted %1"
+msgstr ""
+
+#: luawindow.cc:345
+msgid "Failed to delete %1"
+msgstr ""
+
+#: luawindow.cc:411
+msgid ""
+"Missing script header.\n"
+"The script requires an '{ardour}' info table and a 'factory' function."
+msgstr ""
+
+#: luawindow.cc:416
+msgid "Script fails to compile."
+msgstr ""
+
+#: luawindow.cc:423
+msgid "Invalid or missing script-name or script-type."
+msgstr ""
+
+#: luawindow.cc:428
+msgid ""
+"Invalid script-type.\n"
+"Valid types are 'EditorAction' and 'Snippet'."
+msgstr ""
+
+#: luawindow.cc:439 luawindow.cc:490
+msgid "Saved as %1"
+msgstr ""
+
+#: luawindow.cc:442 luawindow.cc:493
+msgid "Error saving file: %1"
+msgstr ""
+
+#: luawindow.cc:452
+msgid ""
+"Script with given name '%1' already exists.\n"
+"Use a different name in the descriptor."
+msgstr ""
+
+#: luawindow.cc:636
+msgid "Scratch Buffer %1"
+msgstr ""
+
+#: luawindow.cc:638
+msgid "Action: '%1'"
+msgstr ""
+
+#: luawindow.cc:640
+msgid "Snippet: %1"
+msgstr ""
+
+#: luawindow.cc:652
+msgid "Save as"
+msgstr ""
+
+#: main.cc:88
 msgid "%1 could not connect to the audio backend."
 msgstr ""
 
-#: main.cc:107 main.cc:123
+#: main.cc:135 main.cc:151
 msgid "The audio backend (%1) has failed, or terminated"
 msgstr ""
 
-#: main.cc:110
+#: main.cc:138
 msgid ""
 "%2 exited unexpectedly, and without notifying %1.\n"
 "\n"
@@ -6679,79 +7864,99 @@ msgid ""
 "Click OK to exit %1."
 msgstr ""
 
-#: main.cc:124
+#: main.cc:152
 msgid "%2 exited unexpectedly, and without notifying %1."
 msgstr ""
 
-#: main.cc:219
+#: main.cc:247
 msgid ""
 "\n"
 "   %1 could not understand your command line      "
 msgstr ""
 
-#: main.cc:221
+#: main.cc:249
 msgid "An error was encountered while launching %1"
 msgstr ""
 
-#: main.cc:310
+#: main.cc:344
 msgid " (built using "
 msgstr " (compilado "
 
-#: main.cc:313
+#: main.cc:347
 msgid " and GCC version "
 msgstr " e versão GCC "
 
-#: main.cc:323
-msgid "Copyright (C) 1999-2012 Paul Davis"
+#: main.cc:357
+msgid "Copyright (C) 1999-2015 Paul Davis"
 msgstr ""
 
-#: main.cc:324
+#: main.cc:358
 msgid ""
 "Some portions Copyright (C) Steve Harris, Ari Johnson, Brett Viren, Joel "
 "Baker, Robin Gareus"
 msgstr ""
 
-#: main.cc:326
+#: main.cc:360
 msgid "%1 comes with ABSOLUTELY NO WARRANTY"
 msgstr ""
 
-#: main.cc:327
+#: main.cc:361
 msgid "not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
 msgstr "nem mesmo para COMERCIALIZAÇÃO ou INDICADO PARA UM FIM PARTICULAR."
 
-#: main.cc:328
+#: main.cc:362
 msgid "This is free software, and you are welcome to redistribute it "
 msgstr "Sendo software livre, é permitida e até encorajada a sua distribuição "
 
-#: main.cc:329
+#: main.cc:363
 msgid "under certain conditions; see the source for copying conditions."
 msgstr ""
 "desde que sejam respeitadas algumas condições; para mais informações, por "
 "favor leia o ficheiro COPYING."
 
-#: main.cc:334
+#: main.cc:368
 msgid "could not initialize %1."
 msgstr ""
 
-#: main.cc:344
+#: main.cc:378
 msgid "Cannot xinstall SIGPIPE error handler"
 msgstr ""
 
-#: main.cc:351
+#: main.cc:385
+msgid "Could not complete pre-GUI initialization"
+msgstr ""
+
+#: main.cc:392
 msgid "could not create %1 GUI"
 msgstr ""
 
-#: main_clock.cc:52
+#: main_clock.cc:51
 msgid "Display delta to edit cursor"
 msgstr ""
 
-#: marker.cc:273
+#: main_clock.cc:66 tempo_dialog.cc:55
+msgid "Edit Tempo"
+msgstr ""
+
+#: main_clock.cc:67 tempo_dialog.cc:429
+msgid "Edit Meter"
+msgstr ""
+
+#: main_clock.cc:68
+msgid "Insert Tempo Change"
+msgstr ""
+
+#: main_clock.cc:69
+msgid "Insert Meter Change"
+msgstr ""
+
+#: marker.cc:280
 msgid "MarkerText"
 msgstr "Marcadores"
 
 #: midi_channel_selector.cc:161 midi_channel_selector.cc:400
-#: midi_channel_selector.cc:436 rc_option_editor.cc:1573
-#: rc_option_editor.cc:2203 sfdb_ui.cc:665
+#: midi_channel_selector.cc:436 rc_option_editor.cc:2157
+#: rc_option_editor.cc:2799 sfdb_ui.cc:671
 msgid "None"
 msgstr "Nenhum"
 
@@ -6832,11 +8037,11 @@ msgstr ""
 msgid "Click to force all MIDI channel messages to channel %1"
 msgstr ""
 
-#: midi_channel_selector.cc:718
+#: midi_channel_selector.cc:720
 msgid "Click to toggle recording of channel %1"
 msgstr ""
 
-#: midi_channel_selector.cc:726
+#: midi_channel_selector.cc:728
 msgid "Click to force all recorded channels to %1"
 msgstr ""
 
@@ -6948,192 +8153,188 @@ msgstr ""
 msgid "velocity edit"
 msgstr ""
 
-#: midi_region_view.cc:954
+#: midi_region_view.cc:962
 msgid "add note"
 msgstr ""
 
-#: midi_region_view.cc:1885
+#: midi_region_view.cc:1904
 msgid "step add"
 msgstr ""
 
-#: midi_region_view.cc:1979 midi_region_view.cc:2002
+#: midi_region_view.cc:1998 midi_region_view.cc:2021
 msgid "alter patch change"
 msgstr ""
 
-#: midi_region_view.cc:2038
+#: midi_region_view.cc:2057
 msgid "add patch change"
 msgstr ""
 
-#: midi_region_view.cc:2060 midi_region_view.cc:2061
+#: midi_region_view.cc:2079 midi_region_view.cc:2080
 msgid "move patch change"
 msgstr ""
 
-#: midi_region_view.cc:2073 midi_region_view.cc:2074
+#: midi_region_view.cc:2092 midi_region_view.cc:2093
 msgid "delete patch change"
 msgstr ""
 
-#: midi_region_view.cc:2112
+#: midi_region_view.cc:2131
 msgid "delete selection"
 msgstr ""
 
-#: midi_region_view.cc:2128
+#: midi_region_view.cc:2148
 msgid "delete note"
 msgstr ""
 
-#: midi_region_view.cc:2587
+#: midi_region_view.cc:2589
 msgid "move notes"
 msgstr ""
 
-#: midi_region_view.cc:3070
+#: midi_region_view.cc:3139
 msgid "change velocities"
 msgstr ""
 
-#: midi_region_view.cc:3136
+#: midi_region_view.cc:3205
 msgid "transpose"
 msgstr ""
 
-#: midi_region_view.cc:3164
+#: midi_region_view.cc:3233
 msgid "change note lengths"
 msgstr ""
 
-#: midi_region_view.cc:3240
+#: midi_region_view.cc:3309
 msgid "nudge"
 msgstr ""
 
-#: midi_region_view.cc:3255
+#: midi_region_view.cc:3324
 msgid "change channel"
 msgstr ""
 
-#: midi_region_view.cc:3295
+#: midi_region_view.cc:3372
 msgid "Bank "
 msgstr ""
 
-#: midi_region_view.cc:3296
-msgid "Program "
-msgstr ""
-
-#: midi_region_view.cc:3297
+#: midi_region_view.cc:3374
 msgid "Channel "
 msgstr ""
 
-#: midi_region_view.cc:3484
+#: midi_region_view.cc:3561
 msgid "paste"
 msgstr "colar"
 
-#: midi_streamview.cc:185
+#: midi_streamview.cc:184
 msgid "attempt to display MIDI region with no source"
 msgstr ""
 
-#: midi_streamview.cc:195
+#: midi_streamview.cc:194
 msgid "attempt to display MIDI region with no model"
 msgstr ""
 
-#: midi_streamview.cc:506
+#: midi_streamview.cc:505
 msgid "failed to create MIDI region"
 msgstr ""
 
-#: midi_time_axis.cc:309
+#: midi_time_axis.cc:306
 msgid "External MIDI Device"
 msgstr ""
 
-#: midi_time_axis.cc:310
+#: midi_time_axis.cc:307
 msgid "External Device Mode"
 msgstr ""
 
-#: midi_time_axis.cc:318
+#: midi_time_axis.cc:315
 msgid "Chns"
 msgstr ""
 
-#: midi_time_axis.cc:320
+#: midi_time_axis.cc:317
 msgid "Click to edit channel settings"
 msgstr ""
 
-#: midi_time_axis.cc:519
+#: midi_time_axis.cc:516
 msgid "Show Full Range"
 msgstr ""
 
-#: midi_time_axis.cc:524
+#: midi_time_axis.cc:521
 msgid "Fit Contents"
 msgstr ""
 
-#: midi_time_axis.cc:528
+#: midi_time_axis.cc:525
 msgid "Note Range"
 msgstr ""
 
-#: midi_time_axis.cc:529
+#: midi_time_axis.cc:526
 msgid "Note Mode"
 msgstr ""
 
-#: midi_time_axis.cc:530
+#: midi_time_axis.cc:527
 msgid "Channel Selector"
 msgstr ""
 
-#: midi_time_axis.cc:535
+#: midi_time_axis.cc:532
 msgid "Color Mode"
 msgstr ""
 
-#: midi_time_axis.cc:594
+#: midi_time_axis.cc:591
 msgid "Bender"
 msgstr ""
 
-#: midi_time_axis.cc:598
+#: midi_time_axis.cc:595
 msgid "Pressure"
 msgstr ""
 
-#: midi_time_axis.cc:610
+#: midi_time_axis.cc:607
 msgid "Controllers"
 msgstr ""
 
-#: midi_time_axis.cc:615
+#: midi_time_axis.cc:612
 msgid "No MIDI Channels selected"
 msgstr ""
 
-#: midi_time_axis.cc:672 midi_time_axis.cc:801
+#: midi_time_axis.cc:669 midi_time_axis.cc:798
 msgid "Hide all channels"
 msgstr ""
 
-#: midi_time_axis.cc:676 midi_time_axis.cc:805
+#: midi_time_axis.cc:673 midi_time_axis.cc:802
 msgid "Show all channels"
 msgstr ""
 
-#: midi_time_axis.cc:687 midi_time_axis.cc:816
+#: midi_time_axis.cc:684 midi_time_axis.cc:813
 msgid "Channel %1"
 msgstr ""
 
-#: midi_time_axis.cc:942 midi_time_axis.cc:974
+#: midi_time_axis.cc:939 midi_time_axis.cc:971
 msgid "Controllers %1-%2"
 msgstr ""
 
-#: midi_time_axis.cc:965 midi_time_axis.cc:968
+#: midi_time_axis.cc:962 midi_time_axis.cc:965
 msgid "Controller %1"
 msgstr ""
 
-#: midi_time_axis.cc:991
+#: midi_time_axis.cc:988
 msgid "Sustained"
 msgstr ""
 
-#: midi_time_axis.cc:998
+#: midi_time_axis.cc:995
 msgid "Percussive"
 msgstr ""
 
-#: midi_time_axis.cc:1018
+#: midi_time_axis.cc:1015
 msgid "Meter Colors"
 msgstr ""
 
-#: midi_time_axis.cc:1025
+#: midi_time_axis.cc:1022
 msgid "Channel Colors"
 msgstr ""
 
-#: midi_time_axis.cc:1032
+#: midi_time_axis.cc:1029
 msgid "Track Color"
 msgstr ""
 
-#: midi_time_axis.cc:1606 midi_time_axis.cc:1612 midi_time_axis.cc:1622
-#: midi_time_axis.cc:1628
+#: midi_time_axis.cc:1610 midi_time_axis.cc:1616 midi_time_axis.cc:1626
+#: midi_time_axis.cc:1632
 msgid "all"
 msgstr ""
 
-#: midi_time_axis.cc:1609 midi_time_axis.cc:1625
+#: midi_time_axis.cc:1613 midi_time_axis.cc:1629
 msgid "some"
 msgstr ""
 
@@ -7149,7 +8350,7 @@ msgstr ""
 msgid "Decimal"
 msgstr ""
 
-#: midi_tracer.cc:57 rc_option_editor.cc:740
+#: midi_tracer.cc:57 rc_option_editor.cc:1356
 msgid "Enabled"
 msgstr ""
 
@@ -7165,35 +8366,36 @@ msgstr ""
 msgid "New velocity"
 msgstr ""
 
-#: missing_file_dialog.cc:35
+#: missing_file_dialog.cc:36
 msgid "Missing File"
 msgstr ""
 
-#: missing_file_dialog.cc:37
+#: missing_file_dialog.cc:38
 msgid "Select a folder to search"
 msgstr ""
 
-#: missing_file_dialog.cc:38
+#: missing_file_dialog.cc:39
 msgid "Add chosen folder to search path, and try again"
 msgstr ""
 
-#: missing_file_dialog.cc:40
+#: missing_file_dialog.cc:41
 msgid "Stop loading this session"
 msgstr ""
 
-#: missing_file_dialog.cc:41
+#: missing_file_dialog.cc:42
 msgid "Skip all missing files"
 msgstr ""
 
-#: missing_file_dialog.cc:42
+#: missing_file_dialog.cc:43
 msgid "Skip this file"
 msgstr ""
 
-#: missing_file_dialog.cc:53
+#: missing_file_dialog.cc:57 tempo_dialog.cc:135 tempo_dialog.cc:136
+#: tempo_dialog.cc:484 tempo_dialog.cc:485
 msgid "audio"
 msgstr ""
 
-#: missing_file_dialog.cc:70
+#: missing_file_dialog.cc:74
 msgid ""
 "%1 cannot find the %2 file\n"
 "\n"
@@ -7205,7 +8407,7 @@ msgid ""
 "\n"
 msgstr ""
 
-#: missing_file_dialog.cc:104
+#: missing_file_dialog.cc:108
 msgid "Click to choose an additional folder"
 msgstr ""
 
@@ -7213,516 +8415,706 @@ msgstr ""
 msgid "Missing Plugins"
 msgstr ""
 
-#: missing_plugin_dialog.cc:33 transcode_video_dialog.cc:60
+#: missing_plugin_dialog.cc:36 transcode_video_dialog.cc:60
 msgid "OK"
 msgstr ""
 
-#: mixer_actor.cc:55
-msgid "Toggle Solo on Mixer-Selected Tracks/Busses"
-msgstr ""
-
-#: mixer_actor.cc:56
-msgid "Toggle Mute on Mixer-Selected Tracks/Busses"
-msgstr ""
-
-#: mixer_actor.cc:57
-msgid "Toggle Rec-enable on Mixer-Selected Tracks/Busses"
-msgstr ""
-
-#: mixer_actor.cc:58
-msgid "Decrease Gain on Mixer-Selected Tracks/Busses"
-msgstr ""
-
-#: mixer_actor.cc:59
-msgid "Increase Gain on Mixer-Selected Tracks/Busses"
-msgstr ""
-
-#: mixer_actor.cc:60
-msgid "Set Gain to 0dB on Mixer-Selected Tracks/Busses"
-msgstr ""
-
-#: mixer_actor.cc:63
-msgid "Copy Selected Processors"
-msgstr ""
-
-#: mixer_actor.cc:64
-msgid "Cut Selected Processors"
-msgstr ""
-
-#: mixer_actor.cc:65
-msgid "Paste Selected Processors"
-msgstr ""
-
-#: mixer_actor.cc:66
-msgid "Delete Selected Processors"
-msgstr ""
-
-#: mixer_actor.cc:67
-msgid "Select All (visible) Processors"
-msgstr ""
-
-#: mixer_actor.cc:68
-msgid "Toggle Selected Processors"
-msgstr ""
-
-#: mixer_actor.cc:69
-msgid "Toggle Selected Plugins"
-msgstr ""
-
-#: mixer_actor.cc:70
-msgid "Deselect all strips and processors"
-msgstr ""
-
-#: mixer_actor.cc:72 mixer_actor.cc:73
-msgid "Scroll Mixer Window to the left"
-msgstr ""
-
-#: mixer_actor.cc:75
-msgid "Toggle MIDI Input Active for Mixer-Selected Tracks/Busses"
-msgstr ""
-
-#: mixer_actor.cc:90
-msgid "Loaded mixer bindings from %1"
+#: missing_plugin_dialog.cc:42
+msgid ""
+"This session contains the following plugins that cannot be found on this "
+"system:\n"
+"\n"
 msgstr ""
 
-#: mixer_actor.cc:92
-msgid "Could not find mixer.bindings in search path %1"
+#: missing_plugin_dialog.cc:48
+msgid ""
+"\n"
+"Those plugins will be replaced with inactive stubs.\n"
+"It is recommended that you install the missing plugins and re-load the "
+"session.\n"
+"(also check the blacklist, Window > Log and Preferences > Plugins)"
 msgstr ""
 
-#: mixer_strip.cc:96 mixer_strip.cc:125
+#: mixer_strip.cc:100 mixer_strip.cc:133
 msgid "pre"
 msgstr ""
 
-#: mixer_strip.cc:98 mixer_strip.cc:127 mixer_strip.cc:372 mixer_strip.cc:1410
-#: rc_option_editor.cc:2331
+#: mixer_strip.cc:104 mixer_strip.cc:136 mixer_strip.cc:397
+#: mixer_strip.cc:1540 mixer_strip.cc:1551 rc_option_editor.cc:3140
 msgid "Comments"
 msgstr ""
 
-#: mixer_strip.cc:149
+#: mixer_strip.cc:160
 msgid "Click to toggle the width of this mixer strip."
 msgstr ""
 
-#: mixer_strip.cc:151
+#: mixer_strip.cc:162
 msgid ""
 "\n"
 "%1-%2-click to toggle the width of all strips."
 msgstr ""
 
-#: mixer_strip.cc:158
+#: mixer_strip.cc:171
 msgid "Hide this mixer strip"
 msgstr ""
 
-#: mixer_strip.cc:169
+#: mixer_strip.cc:182
 msgid "Click to select metering point"
 msgstr ""
 
-#: mixer_strip.cc:185
+#: mixer_strip.cc:198
 msgid "Isolate Solo"
 msgstr ""
 
-#: mixer_strip.cc:193
+#: mixer_strip.cc:206
 msgid "Lock Solo Status"
 msgstr ""
 
-#: mixer_strip.cc:196 mixer_strip.cc:2027
+#: mixer_strip.cc:208 mixer_strip.cc:2217
+msgid "SoloLock|Lock"
+msgstr ""
+
+#: mixer_strip.cc:209 mixer_strip.cc:2216
 msgid "Iso"
 msgstr ""
 
-#: mixer_strip.cc:250
+#: mixer_strip.cc:263
 msgid "Mix group"
 msgstr ""
 
-#: mixer_strip.cc:368 rc_option_editor.cc:2327
+#: mixer_strip.cc:275
+msgid "Trim: "
+msgstr ""
+
+#: mixer_strip.cc:393 rc_option_editor.cc:3136
 msgid "Phase Invert"
 msgstr ""
 
-#: mixer_strip.cc:369 rc_option_editor.cc:2328
+#: mixer_strip.cc:394 rc_option_editor.cc:3137
 msgid "Record & Monitor"
 msgstr ""
 
-#: mixer_strip.cc:370 rc_option_editor.cc:2329
+#: mixer_strip.cc:395 rc_option_editor.cc:3138
 msgid "Solo Iso / Lock"
 msgstr ""
 
-#: mixer_strip.cc:524
+#: mixer_strip.cc:398 rc_option_editor.cc:3141
+msgid "VCA Assigns"
+msgstr ""
+
+#: mixer_strip.cc:531
+msgid "Show/Hide Monitoring Section"
+msgstr ""
+
+#: mixer_strip.cc:583
 msgid "Enable/Disable MIDI input"
 msgstr ""
 
-#: mixer_strip.cc:688
+#: mixer_strip.cc:749
 msgid "Aux"
 msgstr ""
 
-#: mixer_strip.cc:710
+#: mixer_strip.cc:775
 msgid "Snd"
 msgstr ""
 
-#: mixer_strip.cc:776 mixer_strip.cc:879 processor_box.cc:2382
+#: mixer_strip.cc:846 mixer_strip.cc:951 processor_box.cc:3594
 msgid "Not connected to audio engine - no I/O changes are possible"
 msgstr ""
 
-#: mixer_strip.cc:833 mixer_strip.cc:935
+#: mixer_strip.cc:904 mixer_strip.cc:1007
 msgid "Add %1 port"
 msgstr ""
 
-#: mixer_strip.cc:840 mixer_strip.cc:942
+#: mixer_strip.cc:912 mixer_strip.cc:1014 monitor_section.cc:1466
+#: plugin_pin_dialog.cc:1782
 msgid "Routing Grid"
 msgstr ""
 
-#: mixer_strip.cc:1171
+#: mixer_strip.cc:1291
+msgid "MIDI "
+msgstr ""
+
+#: mixer_strip.cc:1295
 msgid "<b>INPUT</b> to %1"
 msgstr ""
 
-#: mixer_strip.cc:1174
+#: mixer_strip.cc:1297 monitor_section.cc:1511
 msgid "<b>OUTPUT</b> from %1"
 msgstr ""
 
-#: mixer_strip.cc:1287
+#: mixer_strip.cc:1410 monitor_section.cc:1598
 msgid "Disconnected"
 msgstr ""
 
-#: mixer_strip.cc:1413
-msgid "*Comments*"
-msgstr "*Comentários*"
-
-#: mixer_strip.cc:1420
-msgid "Cmt"
+#: mixer_strip.cc:1536
+msgid "Click to add/edit comments"
 msgstr ""
 
-#: mixer_strip.cc:1423
-msgid "*Cmt*"
+#: mixer_strip.cc:1540 mixer_strip.cc:1551
+msgid "Cmt"
 msgstr ""
 
-#: mixer_strip.cc:1429
-msgid "Click to Add/Edit Comments"
-msgstr "Clicar para acrescentar/editar comentários"
-
-#: mixer_strip.cc:1473
+#: mixer_strip.cc:1596
 msgid "Grp"
 msgstr ""
 
-#: mixer_strip.cc:1476
+#: mixer_strip.cc:1599
 msgid "~G"
 msgstr ""
 
-#: mixer_strip.cc:1505 route_time_axis.cc:561
+#: mixer_strip.cc:1640 route_time_axis.cc:585 vca_master_strip.cc:396
 msgid "Color..."
 msgstr ""
 
-#: mixer_strip.cc:1507 route_time_axis.cc:563
+#: mixer_strip.cc:1642 route_time_axis.cc:587
 msgid "Comments..."
 msgstr ""
 
-#: mixer_strip.cc:1509 route_time_axis.cc:565
+#: mixer_strip.cc:1644 route_time_axis.cc:589
 msgid "Inputs..."
 msgstr ""
 
-#: mixer_strip.cc:1511 route_time_axis.cc:567
+#: mixer_strip.cc:1646 route_time_axis.cc:591
 msgid "Outputs..."
 msgstr ""
 
-#: mixer_strip.cc:1516
+#: mixer_strip.cc:1651
 msgid "Save As Template..."
 msgstr ""
 
-#: mixer_strip.cc:1530
+#: mixer_strip.cc:1657 route_group_dialog.cc:45 route_time_axis.cc:851
+msgid "Active"
+msgstr "Activo"
+
+#: mixer_strip.cc:1665 plugin_pin_dialog.cc:1011
+msgid "Strict I/O"
+msgstr ""
+
+#: mixer_strip.cc:1675 processor_box.cc:3698
+msgid "Pin Connections..."
+msgstr ""
+
+#: mixer_strip.cc:1679
 msgid "Adjust Latency..."
 msgstr ""
 
-#: mixer_strip.cc:1533
+#: mixer_strip.cc:1682
 msgid "Protect Against Denormals"
 msgstr ""
 
-#: mixer_strip.cc:1539 route_time_axis.cc:580
-msgid "Remote Control ID..."
+#: mixer_strip.cc:1701 route_time_axis.cc:867
+msgid "Duplicate..."
 msgstr ""
 
-#: mixer_strip.cc:1823
+#: mixer_strip.cc:1996
 msgid "Pre"
 msgstr ""
 
-#: mixer_strip.cc:1827
+#: mixer_strip.cc:2000
 msgid "Post"
 msgstr ""
 
-#: mixer_strip.cc:1847
-msgid "Pr"
+#: mixer_strip.cc:2016
+msgid "Meter|In"
+msgstr ""
+
+#: mixer_strip.cc:2020
+msgid "Meter|Pr"
+msgstr ""
+
+#: mixer_strip.cc:2024
+msgid "Meter|Po"
 msgstr ""
 
-#: mixer_strip.cc:1851
-msgid "Po"
+#: mixer_strip.cc:2028
+msgid "Meter|O"
 msgstr ""
 
-#: mixer_strip.cc:1860
-msgid "C"
+#: mixer_strip.cc:2033
+msgid "Meter|C"
 msgstr ""
 
-#: mixer_strip.cc:2008 route_ui.cc:168
+#: mixer_strip.cc:2194 route_ui.cc:193
 msgid "Disk"
 msgstr ""
 
-#: mixer_strip.cc:2020 monitor_section.cc:70
+#: mixer_strip.cc:2196
+msgid "Mon"
+msgstr ""
+
+#: mixer_strip.cc:2209 monitor_section.cc:81
 msgid "AFL"
 msgstr ""
 
-#: mixer_strip.cc:2023 monitor_section.cc:71
+#: mixer_strip.cc:2212 monitor_section.cc:82
 msgid "PFL"
 msgstr ""
 
-#: mixer_strip.cc:2034 meter_strip.cc:380
-msgid "D"
+#: mixer_strip.cc:2222 meter_strip.cc:385
+msgid "MonitorInput|I"
+msgstr ""
+
+#: mixer_strip.cc:2223 meter_strip.cc:386
+msgid "MonitorDisk|D"
+msgstr ""
+
+#: mixer_strip.cc:2225
+msgid "Mon|O"
+msgstr ""
+
+#: mixer_strip.cc:2238 meter_strip.cc:377 route_time_axis.cc:2730
+#: vca_master_strip.cc:202 vca_time_axis.cc:227
+msgid "AfterFader|A"
 msgstr ""
 
 #: mixer_strip.cc:2241
+msgid "Prefader|P"
+msgstr ""
+
+#: mixer_strip.cc:2246
+msgid "SoloIso|I"
+msgstr ""
+
+#: mixer_strip.cc:2247
+msgid "SoloLock|L"
+msgstr ""
+
+#: mixer_strip.cc:2452
 msgid "Pre Fader"
 msgstr "Pré-atenuador"
 
-#: mixer_strip.cc:2242
+#: mixer_strip.cc:2453
 msgid "Post Fader"
 msgstr "Pós-atenuador"
 
-#: mixer_strip.cc:2286 meter_strip.cc:847
+#: mixer_strip.cc:2498 meter_strip.cc:858
 msgid "Change all in Group to %1"
 msgstr ""
 
-#: mixer_strip.cc:2288 meter_strip.cc:849
+#: mixer_strip.cc:2500 meter_strip.cc:860
 msgid "Change all to %1"
 msgstr ""
 
-#: mixer_strip.cc:2290 meter_strip.cc:851
+#: mixer_strip.cc:2502 meter_strip.cc:862
 msgid "Change same track-type to %1"
 msgstr ""
 
-#: mixer_ui.cc:130 route_time_axis.cc:818
+#: mixer_ui.cc:152 route_time_axis.cc:828
 msgid "Group"
 msgstr "Grupo"
 
-#: mixer_ui.cc:1224
+#: mixer_ui.cc:221
+msgid "Favorite Plugins"
+msgstr ""
+
+#: mixer_ui.cc:627
+msgid "Error adding GUI elements for new tracks/busses %1"
+msgstr ""
+
+#: mixer_ui.cc:1542
 msgid "track display list item for renamed strip not found!"
 msgstr "não foi encontrada qualquer faixa para o painel de mistura"
 
-#: mixer_ui.cc:1316
+#: mixer_ui.cc:1636
 msgid "-all-"
 msgstr "-tudo-"
 
-#: mixer_ui.cc:1853
+#: mixer_ui.cc:2135
 msgid "Strips"
 msgstr "Painéis"
 
-#: meter_strip.cc:157
+#: mixer_ui.cc:2479
+msgid "No Track/Bus is selected."
+msgstr ""
+
+#: mixer_ui.cc:2481
+msgid "Add at the top"
+msgstr ""
+
+#: mixer_ui.cc:2483
+msgid "Add Pre-Fader"
+msgstr ""
+
+#: mixer_ui.cc:2485
+msgid "Add Post-Fader"
+msgstr ""
+
+#: mixer_ui.cc:2487
+msgid "Add at the end"
+msgstr ""
+
+#: mixer_ui.cc:2493
+msgid "Remove from favorites"
+msgstr ""
+
+#: mixer_ui.cc:2499
+msgid "Delete Preset"
+msgstr ""
+
+#: mixer_ui.cc:2739
+msgid "Toggle Solo on Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: mixer_ui.cc:2740
+msgid "Toggle Mute on Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: mixer_ui.cc:2741
+msgid "Toggle Rec-enable on Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: mixer_ui.cc:2742
+msgid "Decrease Gain on Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: mixer_ui.cc:2743
+msgid "Increase Gain on Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: mixer_ui.cc:2744
+msgid "Set Gain to 0dB on Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: mixer_ui.cc:2747
+msgid "Copy Selected Processors"
+msgstr ""
+
+#: mixer_ui.cc:2748
+msgid "Cut Selected Processors"
+msgstr ""
+
+#: mixer_ui.cc:2749
+msgid "Paste Selected Processors"
+msgstr ""
+
+#: mixer_ui.cc:2750
+msgid "Delete Selected Processors"
+msgstr ""
+
+#: mixer_ui.cc:2751
+msgid "Select All (visible) Processors"
+msgstr ""
+
+#: mixer_ui.cc:2752
+msgid "Toggle Selected Processors"
+msgstr ""
+
+#: mixer_ui.cc:2753
+msgid "Toggle Selected Plugins"
+msgstr ""
+
+#: mixer_ui.cc:2754
+msgid "Deselect all strips and processors"
+msgstr ""
+
+#: mixer_ui.cc:2756 mixer_ui.cc:2757
+msgid "Scroll Mixer Window to the left"
+msgstr ""
+
+#: mixer_ui.cc:2759
+msgid "Toggle MIDI Input Active for Mixer-Selected Tracks/Busses"
+msgstr ""
+
+#: meter_strip.cc:160
 msgid "Reset Peak"
 msgstr ""
 
-#: meter_strip.cc:883
+#: meter_strip.cc:380 route_time_axis.cc:2734 vca_master_strip.cc:206
+#: vca_time_axis.cc:231
+msgid "PreFader|P"
+msgstr ""
+
+#: meter_strip.cc:894
 msgid "Variable height"
 msgstr ""
 
-#: meter_strip.cc:884
+#: meter_strip.cc:895
 msgid "Short"
 msgstr ""
 
-#: meter_strip.cc:885
+#: meter_strip.cc:896
 msgid "Tall"
 msgstr ""
 
-#: meter_strip.cc:886
+#: meter_strip.cc:897
 msgid "Grande"
 msgstr ""
 
-#: meter_strip.cc:887
+#: meter_strip.cc:898
 msgid "Venti"
 msgstr ""
 
-#: meter_patterns.cc:82
-msgid "Peak"
+#: meter_patterns.cc:84
+msgid "Peak (+6dBFS)"
+msgstr ""
+
+#: meter_patterns.cc:87
+msgid "Peak (0dBFS)"
 msgstr ""
 
-#: meter_patterns.cc:85
+#: meter_patterns.cc:90
 msgid "RMS + Peak"
 msgstr ""
 
-#: meter_patterns.cc:88
+#: meter_patterns.cc:93
 msgid "IEC1/DIN"
 msgstr ""
 
-#: meter_patterns.cc:91
+#: meter_patterns.cc:96
 msgid "IEC1/Nordic"
 msgstr ""
 
-#: meter_patterns.cc:94
+#: meter_patterns.cc:99
 msgid "IEC2/BBC"
 msgstr ""
 
-#: meter_patterns.cc:97
+#: meter_patterns.cc:102
 msgid "IEC2/EBU"
 msgstr ""
 
-#: meter_patterns.cc:100
-msgid "K20"
+#: meter_patterns.cc:105
+msgid "K20/RMS"
 msgstr ""
 
-#: meter_patterns.cc:103
-msgid "K14"
+#: meter_patterns.cc:108
+msgid "K14/RMS"
 msgstr ""
 
-#: meter_patterns.cc:106
-msgid "K12"
+#: meter_patterns.cc:111
+msgid "K12/RMS"
 msgstr ""
 
-#: meter_patterns.cc:109
+#: meter_patterns.cc:114
 msgid "VU"
 msgstr ""
 
-#: monitor_section.cc:69
+#: monitor_section.cc:80
 msgid "SiP"
 msgstr ""
 
-#: monitor_section.cc:96 route_group_dialog.cc:49
+#: monitor_section.cc:113 route_group_dialog.cc:49
 msgid "Soloing"
 msgstr ""
 
-#: monitor_section.cc:100
+#: monitor_section.cc:117
 msgid "Isolated"
 msgstr ""
 
-#: monitor_section.cc:104
+#: monitor_section.cc:121
 msgid "Auditioning"
 msgstr ""
 
-#: monitor_section.cc:114
+#: monitor_section.cc:132
 msgid ""
 "When active, something is solo-isolated.\n"
 "Click to de-isolate everything"
 msgstr ""
 
-#: monitor_section.cc:117
+#: monitor_section.cc:135
 msgid ""
 "When active, auditioning is active.\n"
 "Click to stop the audition"
 msgstr ""
 
-#: monitor_section.cc:134
+#: monitor_section.cc:152
 msgid "Solo controls affect solo-in-place"
 msgstr ""
 
-#: monitor_section.cc:140
+#: monitor_section.cc:158
 msgid "Solo controls toggle after-fader-listen"
 msgstr ""
 
-#: monitor_section.cc:146
+#: monitor_section.cc:164
 msgid "Solo controls toggle pre-fader-listen"
 msgstr ""
 
-#: monitor_section.cc:156
+#: monitor_section.cc:170
+msgid "Excl. Solo"
+msgstr ""
+
+#: monitor_section.cc:172
+msgid "Exclusive solo means that only 1 solo is active at a time"
+msgstr ""
+
+#: monitor_section.cc:179
+msgid "Solo » Mute"
+msgstr ""
+
+#: monitor_section.cc:181
+msgid ""
+"If enabled, solo will override mute\n"
+"(a soloed & muted track or bus will be audible)"
+msgstr ""
+
+#: monitor_section.cc:189
+msgid "Processors"
+msgstr ""
+
+#: monitor_section.cc:191
+msgid "Allow one to add monitor effect processors"
+msgstr ""
+
+#: monitor_section.cc:206
 msgid "Gain increase for soloed signals (0dB is normal)"
 msgstr ""
 
-#: monitor_section.cc:170
+#: monitor_section.cc:210 monitor_section.cc:227 monitor_section.cc:244
+#: monitor_section.cc:289
+msgid "0 dB"
+msgstr ""
+
+#: monitor_section.cc:211
+msgid "3 dB"
+msgstr ""
+
+#: monitor_section.cc:212
+msgid "6 dB"
+msgstr ""
+
+#: monitor_section.cc:213
+msgid "10 dB"
+msgstr ""
+
+#: monitor_section.cc:215
 msgid "Solo Boost"
 msgstr ""
 
-#: monitor_section.cc:185
+#: monitor_section.cc:222
 msgid ""
 "Gain reduction non-soloed signals\n"
 "A value above -inf dB causes \"solo-in-front\""
 msgstr ""
 
-#: monitor_section.cc:196
-msgid "SiP Cut"
+#: monitor_section.cc:228 monitor_section.cc:246 monitor_section.cc:291
+msgid "-6 dB"
 msgstr ""
 
-#: monitor_section.cc:211
-msgid "Gain reduction to use when dimming monitor outputs"
+#: monitor_section.cc:229 monitor_section.cc:247 monitor_section.cc:292
+msgid "-12 dB"
 msgstr ""
 
-#: monitor_section.cc:225 monitor_section.cc:283
-msgid "Dim"
+#: monitor_section.cc:230 monitor_section.cc:248 monitor_section.cc:293
+msgid "-20 dB"
 msgstr ""
 
-#: monitor_section.cc:235
-msgid "Excl. Solo"
+#: monitor_section.cc:231
+msgid "OFF"
 msgstr ""
 
-#: monitor_section.cc:237
-msgid "Exclusive solo means that only 1 solo is active at a time"
+#: monitor_section.cc:233
+msgid "SiP Cut"
 msgstr ""
 
-#: monitor_section.cc:244
-msgid "Solo » Mute"
+#: monitor_section.cc:240
+msgid "Gain reduction to use when dimming monitor outputs"
 msgstr ""
 
-#: monitor_section.cc:246
-msgid ""
-"If enabled, solo will override mute\n"
-"(a soloed & muted track or bus will be audible)"
+#: monitor_section.cc:245 monitor_section.cc:290
+msgid "-3 dB"
+msgstr ""
+
+#: monitor_section.cc:250 monitor_section.cc:264 monitor_section.cc:325
+msgid "Dim"
+msgstr ""
+
+#: monitor_section.cc:294
+msgid "-30 dB"
+msgstr ""
+
+#: monitor_section.cc:333
+msgid "Inv"
 msgstr ""
 
-#: monitor_section.cc:323
+#: monitor_section.cc:399
 msgid "Monitor"
 msgstr ""
 
-#: monitor_section.cc:744
+#: monitor_section.cc:897
 msgid "Switch monitor to mono"
 msgstr ""
 
-#: monitor_section.cc:747
+#: monitor_section.cc:900
 msgid "Cut monitor"
 msgstr ""
 
-#: monitor_section.cc:750
+#: monitor_section.cc:903
 msgid "Dim monitor"
 msgstr ""
 
-#: monitor_section.cc:753
+#: monitor_section.cc:906
 msgid "Toggle exclusive solo mode"
 msgstr ""
 
-#: monitor_section.cc:759
+#: monitor_section.cc:912
 msgid "Toggle mute overrides solo mode"
 msgstr ""
 
-#: monitor_section.cc:771
+#: monitor_section.cc:921
 msgid "Cut monitor channel %1"
 msgstr ""
 
-#: monitor_section.cc:776
+#: monitor_section.cc:926
 msgid "Dim monitor channel %1"
 msgstr ""
 
-#: monitor_section.cc:781
+#: monitor_section.cc:931
 msgid "Solo monitor channel %1"
 msgstr ""
 
-#: monitor_section.cc:786
+#: monitor_section.cc:936
 msgid "Invert monitor channel %1"
 msgstr ""
 
-#: monitor_section.cc:796
+#: monitor_section.cc:946
 msgid "In-place solo"
 msgstr ""
 
-#: monitor_section.cc:798
+#: monitor_section.cc:948
 msgid "After Fade Listen (AFL) solo"
 msgstr ""
 
-#: monitor_section.cc:800
+#: monitor_section.cc:950
 msgid "Pre Fade Listen (PFL) solo"
 msgstr ""
 
-#: mono_panner.cc:109 stereo_panner.cc:119
+#: monitor_section.cc:953
+msgid "Toggle Monitor Section Processor Box"
+msgstr ""
+
+#: monitor_section.cc:1413
+msgid "No session - no I/O changes are possible"
+msgstr ""
+
+#: monitor_selector.cc:199
+msgid "Monitor output selector"
+msgstr ""
+
+#: mono_panner.cc:105 stereo_panner.cc:115
 msgid "bypassed"
 msgstr ""
 
-#: mono_panner.cc:123
+#: mono_panner.cc:119
 #, c-format
 msgid "L:%3d R:%3d"
 msgstr ""
 
-#: mono_panner_editor.cc:33
+#: mono_panner.cc:203 panner2d.cc:276 stereo_panner.cc:252
+#: stereo_panner.cc:275
+msgid "Panner|L"
+msgstr ""
+
+#: mono_panner.cc:220 panner2d.cc:277 stereo_panner.cc:250
+#: stereo_panner.cc:277
+msgid "Panner|R"
+msgstr ""
+
+#: mono_panner_editor.cc:35
 msgid "Mono Panner"
 msgstr ""
 
-#: mono_panner_editor.cc:44 mono_panner_editor.cc:49
-#: stereo_panner_editor.cc:46 stereo_panner_editor.cc:51
+#: mono_panner_editor.cc:46 mono_panner_editor.cc:51
+#: stereo_panner_editor.cc:48 stereo_panner_editor.cc:53
 msgid "%"
 msgstr ""
 
@@ -7777,10 +9169,6 @@ msgid ""
 "relies on a stable, sustainable income stream. Thanks for using Ardour!"
 msgstr ""
 
-#: new_plugin_preset_dialog.cc:29
-msgid "New Preset"
-msgstr ""
-
 #: new_plugin_preset_dialog.cc:30
 msgid "Replace existing preset with this name"
 msgstr ""
@@ -7789,6 +9177,10 @@ msgstr ""
 msgid "Name of new preset"
 msgstr ""
 
+#: new_plugin_preset_dialog.cc:44
+msgid "New Favorite Only"
+msgstr ""
+
 #: normalize_dialog.cc:34
 msgid "Normalize regions"
 msgstr ""
@@ -7797,7 +9189,11 @@ msgstr ""
 msgid "Normalize region"
 msgstr ""
 
-#: normalize_dialog.cc:49 strip_silence_dialog.cc:66
+#: normalize_dialog.cc:42
+msgid "Normalize to:"
+msgstr ""
+
+#: normalize_dialog.cc:49 strip_silence_dialog.cc:67
 msgid "dbFS"
 msgstr ""
 
@@ -7817,103 +9213,106 @@ msgstr "Normalizar"
 msgid "Select Note"
 msgstr ""
 
-#: opts.cc:57
+#: opts.cc:61
 msgid "Usage: "
 msgstr "Uso: "
 
-#: opts.cc:58
+#: opts.cc:62
 msgid "  [SESSION_NAME]              Name of session to load\n"
 msgstr ""
 
-#: opts.cc:59
+#: opts.cc:63
 msgid "  -v, --version               Show version information\n"
 msgstr ""
 
-#: opts.cc:60
+#: opts.cc:64
 msgid "  -h, --help                  Print this message\n"
 msgstr ""
 
-#: opts.cc:61
+#: opts.cc:65
 msgid ""
 "  -a, --no-announcements      Do not contact website for announcements\n"
 msgstr ""
 
-#: opts.cc:62
+#: opts.cc:66
 msgid ""
 "  -b, --bindings              Print all possible keyboard binding names\n"
 msgstr ""
 
-#: opts.cc:63
+#: opts.cc:67
+msgid ""
+"  -B, --bypass-plugins        Bypass all plugins in an existing session\n"
+msgstr ""
+
+#: opts.cc:68
 msgid ""
 "  -c, --name <name>           Use a specific backend client name, default is "
 "ardour\n"
 msgstr ""
 
-#: opts.cc:64
+#: opts.cc:69
 msgid ""
 "  -d, --disable-plugins       Disable all plugins in an existing session\n"
 msgstr ""
 
-#: opts.cc:65
+#: opts.cc:70
 msgid ""
 "  -D, --debug <options>       Set debug flags. Use \"-D list\" to see "
 "available options\n"
 msgstr ""
 
-#: opts.cc:66
+#: opts.cc:71
 msgid "  -n, --no-splash             Do not show splash screen\n"
 msgstr ""
 
-#: opts.cc:67
+#: opts.cc:72
 msgid "  -m, --menus file            Use \"file\" to define menus\n"
 msgstr ""
 
-#: opts.cc:68
+#: opts.cc:73
 msgid ""
 "  -N, --new session-name      Create a new session from the command line\n"
 msgstr ""
 
-#: opts.cc:69
+#: opts.cc:74
 msgid "  -O, --no-hw-optimizations   Disable h/w specific optimizations\n"
 msgstr ""
 
-#: opts.cc:70
+#: opts.cc:75
 msgid "  -P, --no-connect-ports      Do not connect any ports at startup\n"
 msgstr ""
 
-#: opts.cc:71
+#: opts.cc:76
 msgid "  -S, --sync                  Draw the gui synchronously \n"
 msgstr ""
 
-#: opts.cc:73
+#: opts.cc:78
 msgid "  -V, --novst                 Do not use VST support\n"
 msgstr ""
 
-#: opts.cc:75
+#: opts.cc:80
 msgid ""
 "  -E, --save <file>           Load the specified session, save it to <file> "
 "and then quit\n"
 msgstr ""
 
-#: opts.cc:76
+#: opts.cc:81
 msgid "  -C, --curvetest filename    Curve algorithm debugger\n"
 msgstr ""
 
-#: opts.cc:77
-msgid ""
-"  -k, --keybindings filename  Name of key bindings to load (default is ~/."
-"ardour3/ardour.bindings)\n"
+#: opts.cc:82
+msgid "  -k, --keybindings filename  Name of key bindings to load\n"
 msgstr ""
 
-#: panner2d.cc:854
+#: panner2d.cc:896
 msgid "Panner (2D)"
 msgstr ""
 
-#: panner2d.cc:856 panner_ui.cc:400 plugin_ui.cc:452
+#: panner2d.cc:898 panner_ui.cc:402 plugin_ui.cc:458
 msgid "Bypass"
 msgstr "Ignorar"
 
-#: panner2d.cc:862
+#: panner2d.cc:904
 msgid "Panner"
 msgstr ""
 
@@ -7925,6 +9324,22 @@ msgstr "Modo de automatização de panorâmica"
 msgid "Pan automation type"
 msgstr "Tipo de automatização de panorâmica"
 
+#: panner_ui.cc:605
+msgid "Manual|M"
+msgstr ""
+
+#: panner_ui.cc:608
+msgid "Play|P"
+msgstr ""
+
+#: panner_ui.cc:611
+msgid "Touch|T"
+msgstr ""
+
+#: panner_ui.cc:614
+msgid "Write|W"
+msgstr ""
+
 #: playlist_selector.cc:43
 msgid "Playlists"
 msgstr ""
@@ -7957,143 +9372,297 @@ msgstr ""
 msgid "Show phase"
 msgstr ""
 
-#: plugin_selector.cc:53 plugin_selector.cc:229
+#: plugin_pin_dialog.cc:55
+msgid "Manual Config"
+msgstr ""
+
+#: plugin_pin_dialog.cc:56
+msgid "Sidechain"
+msgstr ""
+
+#: plugin_pin_dialog.cc:57 plugin_pin_dialog.cc:59 plugin_pin_dialog.cc:61
+#: plugin_pin_dialog.cc:63 plugin_pin_dialog.cc:65 step_entry.cc:81
+#: step_entry.cc:84
+msgid "+"
+msgstr ""
+
+#: plugin_pin_dialog.cc:58 plugin_pin_dialog.cc:60 plugin_pin_dialog.cc:62
+#: plugin_pin_dialog.cc:64 plugin_pin_dialog.cc:66
+msgid "-"
+msgstr ""
+
+#: plugin_pin_dialog.cc:148
+msgid "Audio Input Pins"
+msgstr ""
+
+#: plugin_pin_dialog.cc:157
+msgid "MIDI Input Pins"
+msgstr ""
+
+#: plugin_pin_dialog.cc:166
+msgid "Instances"
+msgstr ""
+
+#: plugin_pin_dialog.cc:176
+msgid "Audio Out"
+msgstr ""
+
+#: plugin_pin_dialog.cc:185
+msgid "MIDI Out"
+msgstr ""
+
+#: plugin_pin_dialog.cc:192
+msgid "Output Presets"
+msgstr ""
+
+#: plugin_pin_dialog.cc:208
+msgid "Add Sidechain Input"
+msgstr ""
+
+#: plugin_pin_dialog.cc:478 plugin_pin_dialog.cc:482 plugin_pin_dialog.cc:486
+#: plugin_setup_dialog.cc:115 plugin_setup_dialog.cc:199
+msgid "Automatic"
+msgstr ""
+
+#: plugin_pin_dialog.cc:515 plugin_setup_dialog.cc:208
+msgid "%1 Channel"
+msgid_plural "%1 Channels"
+msgstr[0] ""
+msgstr[1] ""
+
+#: plugin_pin_dialog.cc:641 processor_box.cc:224
+msgid "Send"
+msgstr ""
+
+#: plugin_pin_dialog.cc:997
+msgid "Latency %1 spl%2 %3"
+msgstr ""
+
+#: plugin_pin_dialog.cc:997 plugin_pin_dialog.cc:1001
+msgid "no-inplace"
+msgstr ""
+
+#: plugin_pin_dialog.cc:999
+msgid "Latency %1 spl"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1055
+msgid "Instance #%1"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1700 processor_box.cc:2508
+msgid "Cannot set up new send: %1"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1707
+msgid "SC %1 (%2)"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1963 plugin_pin_dialog.cc:1971
+msgid "Pin Configuration: %1"
+msgstr ""
+
+#: plugin_setup_dialog.cc:30
+msgid "Plugin Setup"
+msgstr ""
+
+#: plugin_setup_dialog.cc:33
+msgid "Copy I/O Map"
+msgstr ""
+
+#: plugin_setup_dialog.cc:50
+msgid "An Instrument plugin is already present."
+msgstr ""
+
+#: plugin_setup_dialog.cc:54
+msgid "Replace"
+msgstr ""
+
+#: plugin_setup_dialog.cc:60
+msgid "with"
+msgstr ""
+
+#: plugin_setup_dialog.cc:70
+msgid "I/O Pin Mapping"
+msgstr ""
+
+#: plugin_setup_dialog.cc:79
+msgid "Configure Plugin '%1'"
+msgstr ""
+
+#: plugin_setup_dialog.cc:90
+msgid "Output Configuration"
+msgstr ""
+
+#: plugin_selector.cc:54 plugin_selector.cc:322
 msgid "Name contains"
 msgstr ""
 
-#: plugin_selector.cc:54 plugin_selector.cc:233
+#: plugin_selector.cc:55 plugin_selector.cc:326
 msgid "Type contains"
 msgstr ""
 
-#: plugin_selector.cc:55 plugin_selector.cc:231
+#: plugin_selector.cc:56 plugin_selector.cc:324
 msgid "Category contains"
 msgstr ""
 
-#: plugin_selector.cc:56 plugin_selector.cc:253
+#: plugin_selector.cc:57 plugin_selector.cc:349
 msgid "Author contains"
 msgstr ""
 
-#: plugin_selector.cc:57 plugin_selector.cc:255
+#: plugin_selector.cc:58 plugin_selector.cc:351
 msgid "Library contains"
 msgstr ""
 
-#: plugin_selector.cc:58 plugin_selector.cc:219 plugin_selector.cc:537
+#: plugin_selector.cc:59 plugin_selector.cc:278 plugin_selector.cc:639
 msgid "Favorites only"
 msgstr ""
 
-#: plugin_selector.cc:59 plugin_selector.cc:223 plugin_selector.cc:537
+#: plugin_selector.cc:60 plugin_selector.cc:282 plugin_selector.cc:639
 msgid "Hidden only"
 msgstr ""
 
-#: plugin_selector.cc:64
+#: plugin_selector.cc:65
 msgid "Plugin Manager"
 msgstr ""
 
-#: plugin_selector.cc:85
+#: plugin_selector.cc:96
 msgid "Fav"
 msgstr ""
 
-#: plugin_selector.cc:87
+#: plugin_selector.cc:98
 msgid "Available Plugins"
 msgstr ""
 
-#: plugin_selector.cc:88
+#: plugin_selector.cc:99
 msgid "Type"
 msgstr "Tipo"
 
-#: plugin_selector.cc:89
+#: plugin_selector.cc:100
 msgid "Category"
 msgstr ""
 
-#: plugin_selector.cc:90
+#: plugin_selector.cc:101
 msgid "Creator"
 msgstr ""
 
-#: plugin_selector.cc:91
+#: plugin_selector.cc:102
 msgid "# Audio In"
 msgstr ""
 
-#: plugin_selector.cc:92
+#: plugin_selector.cc:103
 msgid "# Audio Out"
 msgstr ""
 
-#: plugin_selector.cc:93
+#: plugin_selector.cc:104
 msgid "# MIDI In"
 msgstr ""
 
-#: plugin_selector.cc:94
+#: plugin_selector.cc:105
 msgid "# MIDI Out"
 msgstr ""
 
-#: plugin_selector.cc:116
+#: plugin_selector.cc:132
 msgid "Plugins to be connected"
 msgstr ""
 
-#: plugin_selector.cc:129
+#: plugin_selector.cc:145
 msgid "Add a plugin to the effect list"
 msgstr "Acrescentar à lista de efeitos/plug-ins"
 
-#: plugin_selector.cc:133
+#: plugin_selector.cc:149
 msgid "Remove a plugin from the effect list"
 msgstr "Remover da lista de efeitos/plug-ins"
 
-#: plugin_selector.cc:135
-msgid "Update available plugins"
-msgstr "Actualizar efeitos/plug-ins disponíveis"
+#: plugin_selector.cc:161
+msgid "Show Hidden"
+msgstr ""
+
+#: plugin_selector.cc:163
+msgid "Include hidden plugins in list."
+msgstr ""
+
+#: plugin_selector.cc:166
+msgid "Instruments"
+msgstr ""
+
+#: plugin_selector.cc:168
+msgid "Cycle display of instrument plugins (if any)."
+msgstr ""
+
+#: plugin_selector.cc:171
+msgid "Analyzers"
+msgstr ""
+
+#: plugin_selector.cc:173
+msgid "Cycle display of analysis plugins (if any)."
+msgstr ""
+
+#: plugin_selector.cc:176
+msgid "Utils"
+msgstr ""
+
+#: plugin_selector.cc:178
+msgid "Cycle display of utility plugins (if any)."
+msgstr ""
+
+#: plugin_selector.cc:208
+msgid "Filter"
+msgstr ""
 
-#: plugin_selector.cc:172
+#: plugin_selector.cc:232
 msgid "Insert Plugin(s)"
 msgstr ""
 
-#: plugin_selector.cc:337 plugin_selector.cc:338 plugin_selector.cc:339
-#: plugin_selector.cc:340
+#: plugin_selector.cc:439 plugin_selector.cc:440 plugin_selector.cc:441
+#: plugin_selector.cc:442
 msgid "variable"
 msgstr ""
 
-#: plugin_selector.cc:496
+#: plugin_selector.cc:598
 msgid ""
 "The plugin \"%1\" could not be loaded\n"
 "\n"
 "See the Log window for more details (maybe)"
 msgstr ""
 
-#: plugin_selector.cc:644
+#: plugin_selector.cc:757
 msgid "Favorites"
 msgstr ""
 
-#: plugin_selector.cc:646
+#: plugin_selector.cc:759
 msgid "Plugin Manager..."
 msgstr ""
 
-#: plugin_selector.cc:650
+#: plugin_selector.cc:763
 msgid "By Creator"
 msgstr ""
 
-#: plugin_selector.cc:653
+#: plugin_selector.cc:766
 msgid "By Category"
 msgstr ""
 
-#: plugin_ui.cc:113
+#: plugin_ui.cc:114
 msgid "Eh? LADSPA plugins don't have editors!"
 msgstr ""
 
-#: plugin_ui.cc:122 plugin_ui.cc:227
+#: plugin_ui.cc:123 plugin_ui.cc:228
 msgid ""
 "unknown type of editor-supplying plugin (note: no VST support in this "
 "version of %1)"
 msgstr ""
 
-#: plugin_ui.cc:125
+#: plugin_ui.cc:126
 msgid "unknown type of editor-supplying plugin"
 msgstr ""
 
-#: plugin_ui.cc:257
+#: plugin_ui.cc:258
 msgid ""
 "unknown type of editor-supplying plugin (note: no linuxVST support in this "
 "version of %1)"
 msgstr ""
 
-#: plugin_ui.cc:329
+#: plugin_ui.cc:330
 msgid "create_lv2_editor called on non-LV2 plugin"
 msgstr ""
 
@@ -8101,146 +9670,167 @@ msgstr ""
 msgid "Add"
 msgstr "Acrescentar"
 
-#: plugin_ui.cc:422
+#: plugin_ui.cc:423
 msgid "Description"
 msgstr ""
 
-#: plugin_ui.cc:423
+#: plugin_ui.cc:424
 msgid "Plugin analysis"
 msgstr ""
 
-#: plugin_ui.cc:430
+#: plugin_ui.cc:431
 msgid ""
 "Presets (if any) for this plugin\n"
 "(Both factory and user-created)"
 msgstr ""
 
-#: plugin_ui.cc:431
+#: plugin_ui.cc:432
 msgid "Save a new preset"
 msgstr ""
 
-#: plugin_ui.cc:432
+#: plugin_ui.cc:433
 msgid "Save the current preset"
 msgstr ""
 
-#: plugin_ui.cc:433
+#: plugin_ui.cc:434
 msgid "Delete the current preset"
 msgstr ""
 
-#: plugin_ui.cc:434
+#: plugin_ui.cc:435
+msgid ""
+"Reset parameters to default (if no parameters are in automation play mode)"
+msgstr ""
+
+#: plugin_ui.cc:436
 msgid "Disable signal processing by the plugin"
 msgstr ""
 
-#: plugin_ui.cc:467 plugin_ui.cc:663
+#: plugin_ui.cc:473 plugin_ui.cc:681
 msgid ""
 "Click to allow the plugin to receive keyboard events that %1 would normally "
 "use as a shortcut"
 msgstr ""
 
-#: plugin_ui.cc:468
+#: plugin_ui.cc:474
 msgid "Click to enable/disable this plugin"
 msgstr ""
 
-#: plugin_ui.cc:507
+#: plugin_ui.cc:517
 msgid "latency (%1 sample)"
 msgid_plural "latency (%1 samples)"
 msgstr[0] ""
 msgstr[1] ""
 
-#: plugin_ui.cc:509
+#: plugin_ui.cc:519
 msgid "latency (%1 ms)"
 msgstr ""
 
-#: plugin_ui.cc:520
+#: plugin_ui.cc:530
 msgid "Edit Latency"
 msgstr ""
 
-#: plugin_ui.cc:566
+#: plugin_ui.cc:576
 msgid ""
 "Plugin presets are not supported in this build of %1. Consider paying for a "
 "full version"
 msgstr ""
 
-#: plugin_ui.cc:574
+#: plugin_ui.cc:584
 msgid ""
 "Plugin presets are not supported in this build, see the Log window for more "
 "information."
 msgstr ""
 
-#: plugin_ui.cc:670
+#: plugin_ui.cc:592
+msgid "New Preset"
+msgstr ""
+
+#: plugin_ui.cc:688
 msgid "Click to allow normal use of %1 keyboard shortcuts"
 msgstr ""
 
-#: port_group.cc:337
-msgid "%1 Busses"
+#: plugin_ui.cc:785
+msgid "(none)"
 msgstr ""
 
 #: port_group.cc:338
-msgid "%1 Tracks"
+msgid "%1 Busses"
 msgstr ""
 
 #: port_group.cc:339
-msgid "Hardware"
+msgid "%1 Tracks"
 msgstr ""
 
 #: port_group.cc:340
-msgid "%1 Misc"
+msgid "Hardware"
 msgstr ""
 
 #: port_group.cc:341
+msgid "%1 Misc"
+msgstr ""
+
+#: port_group.cc:342
 msgid "Other"
 msgstr ""
 
-#: port_group.cc:432 port_group.cc:433
+#: port_group.cc:434 port_group.cc:435
 msgid "LTC Out"
 msgstr ""
 
-#: port_group.cc:436 port_group.cc:437
+#: port_group.cc:438 port_group.cc:439
 msgid "LTC In"
 msgstr ""
 
-#: port_group.cc:463
+#: port_group.cc:473
 msgid "MTC in"
 msgstr ""
 
-#: port_group.cc:466
+#: port_group.cc:476
 msgid "MIDI control in"
 msgstr ""
 
-#: port_group.cc:469
+#: port_group.cc:479
 msgid "MIDI clock in"
 msgstr ""
 
-#: port_group.cc:472
+#: port_group.cc:482
 msgid "MMC in"
 msgstr ""
 
-#: port_group.cc:476
+#: port_group.cc:486
 msgid "MTC out"
 msgstr ""
 
-#: port_group.cc:479
+#: port_group.cc:489
 msgid "MIDI control out"
 msgstr ""
 
-#: port_group.cc:482
+#: port_group.cc:492
 msgid "MIDI clock out"
 msgstr ""
 
-#: port_group.cc:485
+#: port_group.cc:495
 msgid "MMC out"
 msgstr ""
 
-#: port_group.cc:532
+#: port_group.cc:554
 msgid ":monitor"
 msgstr ""
 
-#: port_group.cc:544
+#: port_group.cc:570
 msgid "system:"
 msgstr ""
 
-#: port_group.cc:545
-msgid "alsa_pcm"
+#: port_group.cc:571
+msgid "alsa_pcm:"
+msgstr ""
+
+#: port_group.cc:572
+msgid "alsa_midi:"
+msgstr ""
+
+#: port_group.cc:577
+msgid "Scene "
 msgstr ""
 
 #: port_insert_ui.cc:39
@@ -8263,77 +9853,76 @@ msgstr ""
 msgid "Port Insert "
 msgstr ""
 
-#: port_matrix.cc:331 port_matrix.cc:357
+#: port_matrix.cc:341 port_matrix.cc:367
 msgid "<b>Sources</b>"
 msgstr ""
 
-#: port_matrix.cc:332 port_matrix.cc:358
+#: port_matrix.cc:342 port_matrix.cc:368
 msgid "<b>Destinations</b>"
 msgstr ""
 
-#: port_matrix.cc:440 port_matrix.cc:448
+#: port_matrix.cc:450 port_matrix.cc:458
 #, c-format
 msgid "Add %s %s"
 msgstr ""
 
-#: port_matrix.cc:456
+#: port_matrix.cc:466
 #, c-format
 msgid "Rename '%s'..."
 msgstr ""
 
-#: port_matrix.cc:472
+#: port_matrix.cc:482
 msgid "Remove all"
 msgstr ""
 
-#: port_matrix.cc:492 port_matrix.cc:504
+#: port_matrix.cc:502 port_matrix.cc:514
 #, c-format
 msgid "%s all"
 msgstr ""
 
-#: port_matrix.cc:527
+#: port_matrix.cc:537
 msgid "Rescan"
 msgstr "Refrescar"
 
-#: port_matrix.cc:529
+#: port_matrix.cc:539
 msgid "Show individual ports"
 msgstr ""
 
-#: port_matrix.cc:535
+#: port_matrix.cc:545
 msgid "Flip"
 msgstr ""
 
-#: port_matrix.cc:722
-msgid ""
-"It is not possible to add a port here, as the first processor in the track "
-"or buss cannot support the new configuration."
+#: port_matrix.cc:732
+msgid "It is not possible to add a port here."
 msgstr ""
 
-#: port_matrix.cc:725
+#: port_matrix.cc:733
 msgid "Cannot add port"
 msgstr ""
 
-#: port_matrix.cc:747
-msgid "Port removal not allowed"
+#: port_matrix.cc:757
+msgid "The last port cannot be removed"
 msgstr ""
 
-#: port_matrix.cc:748
-msgid ""
-"This port cannot be removed.\n"
-"Either the first plugin in the track or buss cannot accept\n"
-"the new number of inputs or the last plugin has more outputs."
+#: port_matrix.cc:760
+msgid "This port cannot be removed."
+msgstr ""
+
+#: port_matrix.cc:765
+msgid "Port removal not allowed"
 msgstr ""
 
-#: port_matrix.cc:965
+#: port_matrix.cc:981
 #, c-format
 msgid "Remove '%s'"
 msgstr ""
 
-#: port_matrix.cc:980
+#: port_matrix.cc:996
 #, c-format
 msgid "%s all from '%s'"
 msgstr ""
 
-#: port_matrix.cc:1046 transform_dialog.cc:62
+#: port_matrix.cc:1062 transform_dialog.cc:62
 msgid "channel"
 msgstr ""
 
@@ -8345,223 +9934,237 @@ msgstr ""
 msgid "There are no %1 ports to connect."
 msgstr ""
 
-#: processor_box.cc:150
-msgid "Send"
+#: processor_box.cc:226
+msgid "Return"
 msgstr ""
 
-#: processor_box.cc:152
-msgid "Return"
+#: processor_box.cc:323
+msgid "New Favorite Preset for \"%1\""
 msgstr ""
 
-#: processor_box.cc:310
+#: processor_box.cc:501
 msgid ""
 "\n"
 "This mono plugin has been replicated %1 times."
 msgstr ""
 
-#: processor_box.cc:314
+#: processor_box.cc:505 processor_box.cc:1527
 msgid ""
 "<b>%1</b>\n"
 "Double-click to show GUI.\n"
-"Alt+double-click to show generic GUI.%2"
+"%2+double-click to show generic GUI.%3"
 msgstr ""
 
-#: processor_box.cc:317
+#: processor_box.cc:508 processor_box.cc:1530
 msgid ""
 "<b>%1</b>\n"
 "Double-click to show generic GUI.%2"
 msgstr ""
 
-#: processor_box.cc:361
+#: processor_box.cc:514
+msgid ""
+"<b>%1</b>\n"
+"The Plugin is not available on this system\n"
+"and has been replaced by a stub."
+msgstr ""
+
+#: processor_box.cc:600
 #, c-format
 msgid "(%1x1) "
 msgstr ""
 
-#: processor_box.cc:437
+#: processor_box.cc:695
+msgid "Inline Display"
+msgstr ""
+
+#: processor_box.cc:703
 msgid "Show All Controls"
 msgstr ""
 
-#: processor_box.cc:441
+#: processor_box.cc:707
 msgid "Hide All Controls"
 msgstr ""
 
-#: processor_box.cc:475
+#: processor_box.cc:752
 msgid "Link panner controls"
 msgstr ""
 
-#: processor_box.cc:575
+#: processor_box.cc:859
 msgid "on"
 msgstr ""
 
-#: processor_box.cc:575 rc_option_editor.cc:2360 rc_option_editor.cc:2374
+#: processor_box.cc:859 rc_option_editor.cc:3178 rc_option_editor.cc:3192
 msgid "off"
 msgstr "desligado"
 
-#: processor_box.cc:957
+#: processor_box.cc:1817
 msgid ""
 "Right-click to add/remove/edit\n"
 "plugins,inserts,sends and more"
 msgstr ""
 
-#: processor_box.cc:1429 processor_box.cc:1804
+#: processor_box.cc:1966
+msgid ""
+"Processor Drag/Drop failed. Probably because\n"
+"the I/O configuration of the plugins could\n"
+"not match the configuration of this track."
+msgstr ""
+
+#: processor_box.cc:2443 processor_box.cc:2986
 msgid "Plugin Incompatibility"
 msgstr ""
 
-#: processor_box.cc:1432
+#: processor_box.cc:2446
 msgid "You attempted to add the plugin \"%1\" in slot %2.\n"
 msgstr ""
 
-#: processor_box.cc:1438
+#: processor_box.cc:2452
 msgid ""
 "\n"
 "This plugin has:\n"
 msgstr ""
 
-#: processor_box.cc:1441
+#: processor_box.cc:2455
 msgid "\t%1 MIDI input\n"
 msgid_plural "\t%1 MIDI inputs\n"
 msgstr[0] ""
 msgstr[1] ""
 
-#: processor_box.cc:1445
+#: processor_box.cc:2459
 msgid "\t%1 audio input\n"
 msgid_plural "\t%1 audio inputs\n"
 msgstr[0] ""
 msgstr[1] ""
 
-#: processor_box.cc:1448
+#: processor_box.cc:2462
 msgid ""
 "\n"
 "but at the insertion point, there are:\n"
 msgstr ""
 
-#: processor_box.cc:1451
+#: processor_box.cc:2465
 msgid "\t%1 MIDI channel\n"
 msgid_plural "\t%1 MIDI channels\n"
 msgstr[0] ""
 msgstr[1] ""
 
-#: processor_box.cc:1455
+#: processor_box.cc:2469
 msgid "\t%1 audio channel\n"
 msgid_plural "\t%1 audio channels\n"
 msgstr[0] ""
 msgstr[1] ""
 
-#: processor_box.cc:1458
+#: processor_box.cc:2472
 msgid ""
 "\n"
 "%1 is unable to insert this plugin here.\n"
 msgstr ""
 
-#: processor_box.cc:1495
-msgid "Cannot set up new send: %1"
-msgstr ""
-
-#: processor_box.cc:1807
+#: processor_box.cc:2989
 msgid ""
 "You cannot reorder these plugins/sends/inserts\n"
 "in that way because the inputs and\n"
 "outputs will not work correctly."
 msgstr ""
 
-#: processor_box.cc:1991
+#: processor_box.cc:3189
 msgid "Rename Processor"
 msgstr ""
 
-#: processor_box.cc:2022
+#: processor_box.cc:3220
 msgid "At least 100 IO objects exist with a name like %1 - name not changed"
 msgstr ""
 
-#: processor_box.cc:2159
+#: processor_box.cc:3371
 msgid "plugin insert constructor failed"
 msgstr ""
 
-#: processor_box.cc:2170
+#: processor_box.cc:3382
 msgid ""
 "Copying the set of processors on the clipboard failed,\n"
 "probably because the I/O configuration of the plugins\n"
 "could not match the configuration of this track."
 msgstr ""
 
-#: processor_box.cc:2216
+#: processor_box.cc:3428
 msgid ""
 "Do you really want to remove all processors from %1?\n"
 "(this cannot be undone)"
 msgstr ""
 
-#: processor_box.cc:2220 processor_box.cc:2245
+#: processor_box.cc:3432 processor_box.cc:3457
 msgid "Yes, remove them all"
 msgstr "Sim, remover todos"
 
-#: processor_box.cc:2222 processor_box.cc:2247
+#: processor_box.cc:3434 processor_box.cc:3459
 msgid "Remove processors"
 msgstr ""
 
-#: processor_box.cc:2237
+#: processor_box.cc:3449
 msgid ""
 "Do you really want to remove all pre-fader processors from %1?\n"
 "(this cannot be undone)"
 msgstr ""
 
-#: processor_box.cc:2240
+#: processor_box.cc:3452
 msgid ""
 "Do you really want to remove all post-fader processors from %1?\n"
 "(this cannot be undone)"
 msgstr ""
 
-#: processor_box.cc:2428
+#: processor_box.cc:3641
 msgid "New Plugin"
 msgstr ""
 
-#: processor_box.cc:2431
+#: processor_box.cc:3644
 msgid "New Insert"
 msgstr "Nova inserção"
 
-#: processor_box.cc:2434
+#: processor_box.cc:3647
 msgid "New External Send ..."
 msgstr ""
 
-#: processor_box.cc:2438
+#: processor_box.cc:3651
 msgid "New Aux Send ..."
 msgstr ""
 
-#: processor_box.cc:2441
+#: processor_box.cc:3654
 msgid "Send Options"
 msgstr ""
 
-#: processor_box.cc:2443
+#: processor_box.cc:3656
 msgid "Clear (all)"
 msgstr ""
 
-#: processor_box.cc:2445
+#: processor_box.cc:3658
 msgid "Clear (pre-fader)"
 msgstr ""
 
-#: processor_box.cc:2447
+#: processor_box.cc:3660
 msgid "Clear (post-fader)"
 msgstr ""
 
-#: processor_box.cc:2473
+#: processor_box.cc:3690
 msgid "Activate All"
 msgstr "Activar tudo"
 
-#: processor_box.cc:2475
+#: processor_box.cc:3692
 msgid "Deactivate All"
 msgstr ""
 
-#: processor_box.cc:2477
+#: processor_box.cc:3694
 msgid "A/B Plugins"
 msgstr ""
 
-#: processor_box.cc:2486
+#: processor_box.cc:3707
 msgid "Edit with generic controls..."
 msgstr ""
 
-#: processor_box.cc:2789
+#: processor_box.cc:4039
 msgid "%1: %2 (by %3)"
 msgstr ""
 
-#: processor_box.cc:2791
+#: processor_box.cc:4041
 msgid "%1 (by %2)"
 msgstr ""
 
@@ -8589,345 +10192,444 @@ msgstr ""
 msgid "main grid"
 msgstr ""
 
-#: quantize_dialog.cc:52 quantize_dialog.cc:109
+#: quantize_dialog.cc:61 quantize_dialog.cc:118
 msgid "Quantize"
 msgstr ""
 
-#: quantize_dialog.cc:56
+#: quantize_dialog.cc:65
 msgid "Strength"
 msgstr ""
 
-#: quantize_dialog.cc:59
+#: quantize_dialog.cc:68
 msgid "Swing"
 msgstr ""
 
-#: quantize_dialog.cc:62
+#: quantize_dialog.cc:71
 msgid "Threshold (ticks)"
 msgstr ""
 
-#: quantize_dialog.cc:63
+#: quantize_dialog.cc:72
 msgid "Snap note start"
 msgstr ""
 
-#: quantize_dialog.cc:64
+#: quantize_dialog.cc:73
 msgid "Snap note end"
 msgstr ""
 
-#: rc_option_editor.cc:77
-msgid "Click audio file:"
+#: rc_option_editor.cc:83 rc_option_editor.cc:84 rc_option_editor.cc:1550
+msgid "Browse..."
 msgstr ""
 
-#: rc_option_editor.cc:80 rc_option_editor.cc:87
-msgid "Browse..."
+#: rc_option_editor.cc:89
+msgid "Emphasis on first beat:"
+msgstr ""
+
+#: rc_option_editor.cc:95
+msgid "Use default Click:"
 msgstr ""
 
-#: rc_option_editor.cc:84
+#: rc_option_editor.cc:101
+msgid "Click audio file:"
+msgstr ""
+
+#: rc_option_editor.cc:108
 msgid "Click emphasis audio file:"
 msgstr ""
 
-#: rc_option_editor.cc:116
+#: rc_option_editor.cc:154
 msgid "Choose Click"
 msgstr "Metrónomo"
 
-#: rc_option_editor.cc:139
+#: rc_option_editor.cc:177
 msgid "Choose Click Emphasis"
 msgstr "Usar metrónomo acentuado"
 
-#: rc_option_editor.cc:170
+#: rc_option_editor.cc:238
 msgid "Limit undo history to"
 msgstr ""
 
-#: rc_option_editor.cc:171
+#: rc_option_editor.cc:239
 msgid "Save undo history of"
 msgstr ""
 
-#: rc_option_editor.cc:180 rc_option_editor.cc:187
+#: rc_option_editor.cc:248 rc_option_editor.cc:255
 msgid "commands"
 msgstr ""
 
-#: rc_option_editor.cc:325
+#: rc_option_editor.cc:378
+msgid ""
+"\n"
+"Changes to this setting will only persist after your project has been saved."
+msgstr ""
+
+#: rc_option_editor.cc:389 rc_option_editor.cc:451
+msgid "<b>Recommended Setting: %1 + button 3 (right mouse button)</b>%2"
+msgstr ""
+
+#: rc_option_editor.cc:403
+msgid "Select Keyboard layout:"
+msgstr ""
+
+#: rc_option_editor.cc:422
+msgid "When Clicking:"
+msgstr ""
+
+#: rc_option_editor.cc:429
 msgid "Edit using:"
 msgstr ""
 
-#: rc_option_editor.cc:331 rc_option_editor.cc:357 rc_option_editor.cc:384
+#: rc_option_editor.cc:435 rc_option_editor.cc:465 rc_option_editor.cc:495
 msgid "+ button"
 msgstr "+ botão"
 
-#: rc_option_editor.cc:351
+#: rc_option_editor.cc:459
 msgid "Delete using:"
 msgstr ""
 
-#: rc_option_editor.cc:378
+#: rc_option_editor.cc:481
+msgid "<b>Recommended Setting: %1 + button 1 (left mouse button)</b>%2"
+msgstr ""
+
+#: rc_option_editor.cc:489
 msgid "Insert note using:"
 msgstr ""
 
-#: rc_option_editor.cc:405
-msgid "Ignore snap using:"
+#: rc_option_editor.cc:507
+msgid "When Beginning a Drag:"
 msgstr ""
 
-#: rc_option_editor.cc:421
-msgid "Keyboard layout:"
+#: rc_option_editor.cc:518 rc_option_editor.cc:545 rc_option_editor.cc:578
+#: rc_option_editor.cc:599 rc_option_editor.cc:643 rc_option_editor.cc:676
+#: rc_option_editor.cc:702 rc_option_editor.cc:730 rc_option_editor.cc:759
+#: rc_option_editor.cc:781
+msgid "<b>Recommended Setting: %1</b>%2"
 msgstr ""
 
-#: rc_option_editor.cc:544
-msgid "Font scaling:"
+#: rc_option_editor.cc:532
+msgid "Copy items using:"
 msgstr ""
 
-#: rc_option_editor.cc:547
-msgid "Default"
+#: rc_option_editor.cc:559
+msgid "Constrain drag using:"
 msgstr ""
 
-#: rc_option_editor.cc:573
-msgid "Major font-scale changes require an application restart to re-layout."
+#: rc_option_editor.cc:567
+msgid "When Beginning a Trim:"
 msgstr ""
 
-#: rc_option_editor.cc:614
-msgid "Waveform Clip Level (dBFS):"
+#: rc_option_editor.cc:586
+msgid "Trim contents using:"
 msgstr ""
 
-#: rc_option_editor.cc:666
-msgid "Playback (seconds of buffering):"
+#: rc_option_editor.cc:607
+msgid "Anchored trim using:"
 msgstr ""
 
-#: rc_option_editor.cc:679
-msgid "Recording (seconds of buffering):"
+#: rc_option_editor.cc:651
+msgid "Resize notes relatively using:"
 msgstr ""
 
-#: rc_option_editor.cc:737
-msgid "Control Surface Protocol"
+#: rc_option_editor.cc:660
+msgid "While Dragging:"
 msgstr ""
 
-#: rc_option_editor.cc:746
-msgid "Double-click on a name to edit settings for an enabled protocol"
+#: rc_option_editor.cc:684
+msgid "Ignore snap using:"
 msgstr ""
 
-#: rc_option_editor.cc:903
-msgid "Show Video Export Info before export"
+#: rc_option_editor.cc:710
+msgid "Snap relatively using:"
 msgstr ""
 
-#: rc_option_editor.cc:904
-msgid "Show Video Server Startup Dialog"
+#: rc_option_editor.cc:718
+msgid "While Trimming:"
 msgstr ""
 
-#: rc_option_editor.cc:905
-msgid "Advanced Setup (remote video server)"
+#: rc_option_editor.cc:738
+msgid "Resize overlapped regions using:"
 msgstr ""
 
-#: rc_option_editor.cc:913
-msgid ""
-"<b>When enabled</b> you can speficify a custom video-server URL and docroot. "
-"- Do not enable this option unless you know what you are doing."
+#: rc_option_editor.cc:746
+msgid "While Dragging Control Points:"
 msgstr ""
 
-#: rc_option_editor.cc:915
-msgid "Video Server URL:"
+#: rc_option_editor.cc:767
+msgid "Fine adjust using:"
 msgstr ""
 
-#: rc_option_editor.cc:920
-msgid ""
-"Base URL of the video-server including http prefix. This is usually 'http://"
-"hostname.example.org:1554/' and defaults to 'http://localhost:1554/' when "
-"the video-server is running locally"
+#: rc_option_editor.cc:789
+msgid "Push points using:"
 msgstr ""
 
-#: rc_option_editor.cc:922
-msgid "Video Folder:"
+#: rc_option_editor.cc:1029
+msgid "GUI and Font scaling:"
 msgstr ""
 
-#: rc_option_editor.cc:927
-msgid ""
-"Local path to the video-server document-root. Only files below this "
-"directory will be accessible by the video-server. If the server run on a "
-"remote host, it should point to a network mounted folder of the server's "
-"docroot or be left empty if it is unvailable. It is used for the local video-"
-"monitor and file-browsing when opening/adding a video file."
+#: rc_option_editor.cc:1032
+msgid "Default"
 msgstr ""
 
-#: rc_option_editor.cc:934
-msgid ""
-"<b>When enabled</b> an information window with details is displayed before "
-"the video-export dialog."
+#: rc_option_editor.cc:1058
+msgid "Adjusting the scale requires an application restart to re-layout."
 msgstr ""
 
-#: rc_option_editor.cc:939
-msgid ""
-"<b>When enabled</b> the video server is never launched automatically without "
-"confirmation"
+#: rc_option_editor.cc:1100
+msgid "∞"
 msgstr ""
 
-#: rc_option_editor.cc:1022
-msgid "Always Display Plugin Scan Progress"
+#: rc_option_editor.cc:1101
+msgid "30 sec"
 msgstr ""
 
-#: rc_option_editor.cc:1023
-msgid "Scan for [new] VST Plugins on Application Start"
+#: rc_option_editor.cc:1102
+msgid "1 min"
 msgstr ""
 
-#: rc_option_editor.cc:1024
-msgid "Scan for AudioUnit Plugins on Application Start"
+#: rc_option_editor.cc:1103
+msgid "2 mins"
 msgstr ""
 
-#: rc_option_editor.cc:1035
-msgid "General"
+#: rc_option_editor.cc:1104
+msgid "3 mins"
 msgstr ""
 
-#: rc_option_editor.cc:1041
-msgid "Scan for Plugins"
+#: rc_option_editor.cc:1105
+msgid "4 mins"
 msgstr ""
 
-#: rc_option_editor.cc:1048
-msgid ""
-"<b>When enabled</b> a popup window showing plugin scan progress is displayed "
-"for indexing (cache load) and discovery (detect new plugins)"
+#: rc_option_editor.cc:1106
+msgid "5 mins"
 msgstr ""
 
-#: rc_option_editor.cc:1055
+#: rc_option_editor.cc:1109
 msgid ""
-"Specify the default timeout for plugin instantiation in 1/10 seconds. "
-"Plugins that require more time to load will be blacklisted. A value of 0 "
-"disables the timeout."
+"Specify the default timeout for plugin instantiation. Plugins that require "
+"more time to load will be blacklisted. A value of 0 disables the timeout."
 msgstr ""
 
-#: rc_option_editor.cc:1057
-msgid "Scan Time Out [deciseconds]"
+#: rc_option_editor.cc:1111
+msgid "Scan Time Out:"
 msgstr ""
 
-#: rc_option_editor.cc:1065
-msgid "VST"
+#: rc_option_editor.cc:1159
+msgid "Waveform Clip Level (dBFS):"
 msgstr ""
 
-#: rc_option_editor.cc:1071
-msgid "Clear VST Cache"
+#: rc_option_editor.cc:1212
+msgid "Small sessions (4-16 tracks)"
 msgstr ""
 
-#: rc_option_editor.cc:1075
-msgid "Clear VST Blacklist"
+#: rc_option_editor.cc:1213
+msgid "Medium sessions (16-64 tracks)"
 msgstr ""
 
-#: rc_option_editor.cc:1083
-msgid ""
-"<b>When enabled</b> new VST plugins are searched, tested and added to the "
-"cache index on application start. When disabled new plugins will only be "
-"available after triggering a 'Scan' manually"
+#: rc_option_editor.cc:1214
+msgid "Large sessions (64+ tracks)"
 msgstr ""
 
-#: rc_option_editor.cc:1086
-msgid "Linux VST Path:"
+#: rc_option_editor.cc:1215
+msgid "Custom (set by sliders below)"
 msgstr ""
 
-#: rc_option_editor.cc:1093
-msgid "Windows VST Path:"
+#: rc_option_editor.cc:1219 export_video_dialog.cc:167
+msgid "Preset:"
 msgstr ""
 
-#: rc_option_editor.cc:1102
-msgid "Audio Unit"
+#: rc_option_editor.cc:1231
+msgid "Playback (seconds of buffering):"
 msgstr ""
 
-#: rc_option_editor.cc:1111
-msgid ""
-"<b>When enabled</b> Audio Unit Plugins are discovered on application start. "
-"When disabled AU plugins will only be available after triggering a 'Scan' "
-"manually. The first successful scan will enable AU auto-scan, Any crash "
-"during plugin discovery will disable it."
+#: rc_option_editor.cc:1244
+msgid "Recording (seconds of buffering):"
 msgstr ""
 
-#: rc_option_editor.cc:1114
-msgid "Clear AU Cache"
+#: rc_option_editor.cc:1322
+msgid "programming error: unknown buffering preset string, index = %1"
 msgstr ""
 
-#: rc_option_editor.cc:1118
-msgid "Clear AU Blacklist"
+#: rc_option_editor.cc:1353
+msgid "Control Surface Protocol"
 msgstr ""
 
-#: rc_option_editor.cc:1201
-msgid "Set Windows VST Search Path"
+#: rc_option_editor.cc:1367
+msgid ""
+"Click to edit the settings for selected protocol ( it must be ENABLED "
+"first ):"
 msgstr ""
 
-#: rc_option_editor.cc:1216
-msgid "Set Linux VST Search Path"
+#: rc_option_editor.cc:1371
+msgid "Show Protocol Settings"
 msgstr ""
 
-#: rc_option_editor.cc:1297
-msgid "%1 Preferences"
+#: rc_option_editor.cc:1494
+msgid "Configuration"
 msgstr ""
 
-#: rc_option_editor.cc:1309
-msgid "DSP CPU Utilization"
+#: rc_option_editor.cc:1547
+msgid "Show Video Export Info before export"
 msgstr ""
 
-#: rc_option_editor.cc:1313
-msgid "Signal processing uses"
+#: rc_option_editor.cc:1548
+msgid "Show Video Server Startup Dialog"
 msgstr ""
 
-#: rc_option_editor.cc:1318
-msgid "all but one processor"
+#: rc_option_editor.cc:1549
+msgid "Advanced Setup (remote video server)"
+msgstr ""
+
+#: rc_option_editor.cc:1556
+msgid "Video Server"
+msgstr ""
+
+#: rc_option_editor.cc:1565
+msgid ""
+"<b>When enabled</b> you can speficify a custom video-server URL and docroot. "
+"- Do not enable this option unless you know what you are doing."
+msgstr ""
+
+#: rc_option_editor.cc:1567
+msgid "Video Server URL:"
+msgstr ""
+
+#: rc_option_editor.cc:1572
+msgid ""
+"Base URL of the video-server including http prefix. This is usually 'http://"
+"hostname.example.org:1554/' and defaults to 'http://localhost:1554/' when "
+"the video-server is running locally"
+msgstr ""
+
+#: rc_option_editor.cc:1574
+msgid "Video Folder:"
+msgstr ""
+
+#: rc_option_editor.cc:1579
+msgid ""
+"Local path to the video-server document-root. Only files below this "
+"directory will be accessible by the video-server. If the server run on a "
+"remote host, it should point to a network mounted folder of the server's "
+"docroot or be left empty if it is unvailable. It is used for the local video-"
+"monitor and file-browsing when opening/adding a video file."
+msgstr ""
+
+#: rc_option_editor.cc:1584
+msgid ""
+"<b>When enabled</b> an information window with details is displayed before "
+"the video-export dialog."
+msgstr ""
+
+#: rc_option_editor.cc:1589
+msgid ""
+"<b>When enabled</b> the video server is never launched automatically without "
+"confirmation"
+msgstr ""
+
+#: rc_option_editor.cc:1598
+msgid "Custom Path to Video Monitor (%1) - leave empty for default:"
 msgstr ""
 
-#: rc_option_editor.cc:1319
+#: rc_option_editor.cc:1610
+msgid ""
+"Set a custom path to the Video Monitor Executable, changing this requires a "
+"restart."
+msgstr ""
+
+#: rc_option_editor.cc:1661
+msgid "Set Video Monitor Executable"
+msgstr ""
+
+#: rc_option_editor.cc:1734
+msgid "Column %1"
+msgstr ""
+
+#: rc_option_editor.cc:1852
+msgid "%1 Preferences"
+msgstr ""
+
+#: rc_option_editor.cc:1874
+msgid "DSP CPU Utilization"
+msgstr ""
+
+#: rc_option_editor.cc:1878
+msgid "Signal processing uses"
+msgstr ""
+
+#: rc_option_editor.cc:1883
+msgid "all but one processor"
+msgstr ""
+
+#: rc_option_editor.cc:1884
 msgid "all available processors"
 msgstr ""
 
-#: rc_option_editor.cc:1322
+#: rc_option_editor.cc:1887
 msgid "%1 processors"
 msgstr ""
 
-#: rc_option_editor.cc:1325
+#: rc_option_editor.cc:1890
 msgid "This setting will only take effect when %1 is restarted."
 msgstr ""
 
-#: rc_option_editor.cc:1330
+#: rc_option_editor.cc:1895
 msgid "Options|Undo"
 msgstr ""
 
-#: rc_option_editor.cc:1337
+#: rc_option_editor.cc:1902
 msgid "Verify removal of last capture"
 msgstr ""
 
-#: rc_option_editor.cc:1345
-msgid "Make periodic backups of the session file"
+#: rc_option_editor.cc:1907
+msgid "Session Management"
 msgstr ""
 
-#: rc_option_editor.cc:1350
-msgid "Session Management"
+#: rc_option_editor.cc:1912
+msgid "Make periodic backups of the session file"
 msgstr ""
 
-#: rc_option_editor.cc:1355
+#: rc_option_editor.cc:1920
 msgid "Always copy imported files"
 msgstr ""
 
-#: rc_option_editor.cc:1362
+#: rc_option_editor.cc:1927
 msgid "Default folder for new sessions:"
 msgstr ""
 
-#: rc_option_editor.cc:1370
+#: rc_option_editor.cc:1935
 msgid "Maximum number of recent sessions"
 msgstr ""
 
-#: rc_option_editor.cc:1383
+#: rc_option_editor.cc:1941 rc_option_editor.cc:1943 rc_option_editor.cc:1945
+msgid "Misc/Click"
+msgstr ""
+
+#: rc_option_editor.cc:1948
 msgid "Click gain level"
 msgstr ""
 
-#: rc_option_editor.cc:1388 route_time_axis.cc:266 route_time_axis.cc:821
+#: rc_option_editor.cc:1953 route_time_axis.cc:277 route_time_axis.cc:831
 msgid "Automation"
 msgstr "Automatização"
 
-#: rc_option_editor.cc:1393
+#: rc_option_editor.cc:1958
 msgid "Thinning factor (larger value => less data)"
 msgstr ""
 
-#: rc_option_editor.cc:1402
+#: rc_option_editor.cc:1967
 msgid "Automation sampling interval (milliseconds)"
 msgstr ""
 
-#: rc_option_editor.cc:1414
+#: rc_option_editor.cc:1975
+msgid "Transport Options"
+msgstr ""
+
+#: rc_option_editor.cc:1981
 msgid "Keep record-enable engaged on stop"
 msgstr ""
 
-#: rc_option_editor.cc:1423
+#: rc_option_editor.cc:1990
 msgid "Play loop is a transport mode"
 msgstr ""
 
-#: rc_option_editor.cc:1428
+#: rc_option_editor.cc:1995
 msgid ""
 "<b>When enabled</b> the loop button does not start playback but forces "
 "playback to always play the loop\n"
@@ -8936,25 +10638,25 @@ msgid ""
 "cancels loop playback"
 msgstr ""
 
-#: rc_option_editor.cc:1434
+#: rc_option_editor.cc:2001
 msgid "Stop recording when an xrun occurs"
 msgstr ""
 
-#: rc_option_editor.cc:1439
+#: rc_option_editor.cc:2006
 msgid ""
 "<b>When enabled</b> %1 will stop recording if an over- or underrun is "
 "detected by the audio engine"
 msgstr ""
 
-#: rc_option_editor.cc:1445
+#: rc_option_editor.cc:2012
 msgid "Create markers where xruns occur"
 msgstr ""
 
-#: rc_option_editor.cc:1454
+#: rc_option_editor.cc:2021
 msgid "Stop at the end of the session"
 msgstr ""
 
-#: rc_option_editor.cc:1459
+#: rc_option_editor.cc:2026
 msgid ""
 "<b>When enabled</b> if %1 is <b>not recording</b>, it will stop the "
 "transport when it reaches the current session end marker\n"
@@ -8963,11 +10665,11 @@ msgid ""
 "all times"
 msgstr ""
 
-#: rc_option_editor.cc:1467
+#: rc_option_editor.cc:2034
 msgid "Do seamless looping (not possible when slaved to MTC, LTC etc)"
 msgstr ""
 
-#: rc_option_editor.cc:1472
+#: rc_option_editor.cc:2039
 msgid ""
 "<b>When enabled</b> this will loop by reading ahead and wrapping around at "
 "the loop point, preventing any need to do a transport locate at the end of "
@@ -8977,39 +10679,83 @@ msgid ""
 "loop when %1 reaches the end which will often cause a small click or delay"
 msgstr ""
 
-#: rc_option_editor.cc:1480
+#: rc_option_editor.cc:2047
 msgid "Disable per-track record disarm while rolling"
 msgstr ""
 
-#: rc_option_editor.cc:1484
+#: rc_option_editor.cc:2051
 msgid ""
 "<b>When enabled</b> this will prevent you from accidentally stopping "
 "specific tracks recording during a take"
 msgstr ""
 
-#: rc_option_editor.cc:1489
+#: rc_option_editor.cc:2056
 msgid "12dB gain reduction during fast-forward and fast-rewind"
 msgstr ""
 
-#: rc_option_editor.cc:1493
+#: rc_option_editor.cc:2060
 msgid ""
 "This will reduce the unpleasant increase in perceived volume that occurs "
 "when fast-forwarding or rewinding through some kinds of audio"
 msgstr ""
 
-#: rc_option_editor.cc:1497
-msgid "Sync/Slave"
+#: rc_option_editor.cc:2066
+msgid "Preroll"
+msgstr ""
+
+#: rc_option_editor.cc:2071
+msgid ""
+"The amount of preroll (in seconds) to apply when <b>Play with Preroll</b> is "
+"initiated.\n"
+"\n"
+"If <b>Follow Edits</b> is enabled, the preroll is applied to the playhead "
+"position when a region is selected or trimmed."
+msgstr ""
+
+#: rc_option_editor.cc:2073
+msgid "0 (no pre-roll)"
+msgstr ""
+
+#: rc_option_editor.cc:2074
+msgid "0.1 second"
+msgstr ""
+
+#: rc_option_editor.cc:2075
+msgid "0.25 second"
+msgstr ""
+
+#: rc_option_editor.cc:2076
+msgid "0.5 second"
+msgstr ""
+
+#: rc_option_editor.cc:2077
+msgid "1.0 second"
+msgstr ""
+
+#: rc_option_editor.cc:2078
+msgid "2.0 seconds"
+msgstr ""
+
+#: rc_option_editor.cc:2081 rc_option_editor.cc:2090 rc_option_editor.cc:2106
+#: rc_option_editor.cc:2127 rc_option_editor.cc:2145 rc_option_editor.cc:2147
+#: rc_option_editor.cc:2164 rc_option_editor.cc:2167 rc_option_editor.cc:2169
+#: rc_option_editor.cc:2197
+msgid "Transport/Sync"
 msgstr ""
 
-#: rc_option_editor.cc:1501
+#: rc_option_editor.cc:2081
+msgid "Synchronization and Slave Options"
+msgstr ""
+
+#: rc_option_editor.cc:2085
 msgid "External timecode source"
 msgstr ""
 
-#: rc_option_editor.cc:1510
+#: rc_option_editor.cc:2094
 msgid "Match session video frame rate to external timecode"
 msgstr ""
 
-#: rc_option_editor.cc:1516
+#: rc_option_editor.cc:2100
 msgid ""
 "This option controls the value of the video frame rate <i>while chasing</i> "
 "an external timecode source.\n"
@@ -9023,27 +10769,27 @@ msgid ""
 "external timecode standard and the session standard."
 msgstr ""
 
-#: rc_option_editor.cc:1526
-msgid "Sync lock timecode to clock - Disable drift compensation."
+#: rc_option_editor.cc:2110
+msgid "Sync-lock timecode to clock (disable drift compensation)"
 msgstr ""
 
-#: rc_option_editor.cc:1532
+#: rc_option_editor.cc:2116
 msgid ""
 "<b>When enabled</b> %1 will never varispeed when slaved to external "
 "timecode. Sync Lock indicates that the selected external timecode source "
 "shares clock-sync (Black & Burst, Wordclock, etc) with the audio "
 "interface. This option disables drift compensation. The transport speed is "
-"fixed at 1.0.Varispeed LTC will be ignored and cause drift.\n"
+"fixed at 1.0. Vari-speed LTC will be ignored and cause drift.\n"
 "\n"
 "<b>When disabled</b> %1 will compensate for potential drift, regardless if "
 "the timecode sources shares clock sync."
 msgstr ""
 
-#: rc_option_editor.cc:1547
+#: rc_option_editor.cc:2131
 msgid "Lock to 29.9700 fps instead of 30000/1001"
 msgstr ""
 
-#: rc_option_editor.cc:1553
+#: rc_option_editor.cc:2137
 msgid ""
 "<b>When enabled</b> the external timecode source is assumed to use 29.97 fps "
 "instead of 30000/1001.\n"
@@ -9056,659 +10802,926 @@ msgid ""
 "variant of using exactly 29.97 fps has zero timecode drift.\n"
 msgstr ""
 
-#: rc_option_editor.cc:1563
+#: rc_option_editor.cc:2147
 msgid "LTC Reader"
 msgstr ""
 
-#: rc_option_editor.cc:1567
+#: rc_option_editor.cc:2151
 msgid "LTC incoming port"
 msgstr ""
 
-#: rc_option_editor.cc:1582
+#: rc_option_editor.cc:2167
 msgid "LTC Generator"
 msgstr ""
 
-#: rc_option_editor.cc:1587
+#: rc_option_editor.cc:2172
 msgid "Enable LTC generator"
 msgstr ""
 
-#: rc_option_editor.cc:1594
+#: rc_option_editor.cc:2179
 msgid "Send LTC while stopped"
 msgstr ""
 
-#: rc_option_editor.cc:1600
+#: rc_option_editor.cc:2185
 msgid ""
 "<b>When enabled</b> %1 will continue to send LTC information even when the "
 "transport (playhead) is not moving"
 msgstr ""
 
-#: rc_option_editor.cc:1606
+#: rc_option_editor.cc:2191
 msgid "LTC generator level"
 msgstr ""
 
-#: rc_option_editor.cc:1610
+#: rc_option_editor.cc:2195
 msgid ""
 "Specify the Peak Volume of the generated LTC signal in dbFS. A good value "
 "is  0dBu ^= -18dbFS in an EBU calibrated system"
 msgstr ""
 
-#: rc_option_editor.cc:1622
-msgid "Allow dragging of playhead"
+#: rc_option_editor.cc:2204
+msgid "Make rubberband selection rectangle snap to the grid"
 msgstr ""
 
-#: rc_option_editor.cc:1630
-msgid "Move relevant automation when audio regions are moved"
+#: rc_option_editor.cc:2211
+msgid "Name new markers"
 msgstr ""
 
-#: rc_option_editor.cc:1638
-msgid "Show meters on tracks in the editor"
+#: rc_option_editor.cc:2216
+msgid ""
+"If enabled, popup a dialog when a new marker is created to allow its name to "
+"be set as it is created.\n"
+"\n"
+"You can always rename markers by right-clicking on them"
 msgstr ""
 
-#: rc_option_editor.cc:1646
+#: rc_option_editor.cc:2222
+msgid "Allow dragging of playhead"
+msgstr ""
+
+#: rc_option_editor.cc:2230
 msgid "Display master-meter in the toolbar"
 msgstr ""
 
-#: rc_option_editor.cc:1653
-msgid "Default fade shape"
+#: rc_option_editor.cc:2239
+msgid "Show zoom toolbar (if torn off)"
 msgstr ""
 
-#: rc_option_editor.cc:1672
-msgid "Regions in active edit groups are edited together"
+#: rc_option_editor.cc:2247
+msgid ""
+"Always use mouse cursor position as zoom focus when zooming using mouse "
+"scroll wheel"
 msgstr ""
 
-#: rc_option_editor.cc:1673
-msgid "whenever they overlap in time"
+#: rc_option_editor.cc:2256
+msgid "Update editor window during drags of the summary"
 msgstr ""
 
-#: rc_option_editor.cc:1674
-msgid "only if they have identical length, position and origin"
+#: rc_option_editor.cc:2264
+msgid "Auto-scroll editor window when dragging near its edges"
 msgstr ""
 
-#: rc_option_editor.cc:1684
-msgid "Make rubberband selection rectangle snap to the grid"
+#: rc_option_editor.cc:2272
+msgid "Show gain envelopes in audio regions"
 msgstr ""
 
-#: rc_option_editor.cc:1692
-msgid "Show waveforms in regions"
+#: rc_option_editor.cc:2273
+msgid "in all modes"
 msgstr ""
 
-#: rc_option_editor.cc:1700
-msgid "Show gain envelopes in audio regions"
+#: rc_option_editor.cc:2274
+msgid "only in Draw and Internal Edit modes"
 msgstr ""
 
-#: rc_option_editor.cc:1701
-msgid "in all modes"
+#: rc_option_editor.cc:2279
+msgid "Editor Behavior"
 msgstr ""
 
-#: rc_option_editor.cc:1702
-msgid "only in region gain mode"
+#: rc_option_editor.cc:2284
+msgid "Move relevant automation when audio regions are moved"
 msgstr ""
 
-#: rc_option_editor.cc:1709
-msgid "Waveform scale"
+#: rc_option_editor.cc:2291
+msgid "Default fade shape"
 msgstr ""
 
-#: rc_option_editor.cc:1714
-msgid "linear"
-msgstr "linear"
+#: rc_option_editor.cc:2310
+msgid "Regions in active edit groups are edited together"
+msgstr ""
 
-#: rc_option_editor.cc:1715
-msgid "logarithmic"
+#: rc_option_editor.cc:2311
+msgid "whenever they overlap in time"
 msgstr ""
 
-#: rc_option_editor.cc:1721
-msgid "Waveform shape"
+#: rc_option_editor.cc:2312
+msgid "only if they have identical length, position and origin"
 msgstr ""
 
-#: rc_option_editor.cc:1726
-msgid "traditional"
+#: rc_option_editor.cc:2321
+msgid "Layering model"
 msgstr ""
 
-#: rc_option_editor.cc:1727
-msgid "rectified"
+#: rc_option_editor.cc:2326
+msgid "later is higher"
 msgstr ""
 
-#: rc_option_editor.cc:1736
-msgid "Show waveforms for audio while it is being recorded"
+#: rc_option_editor.cc:2327
+msgid "manual layering"
 msgstr ""
 
-#: rc_option_editor.cc:1744
-msgid "Show zoom toolbar"
+#: rc_option_editor.cc:2332
+msgid "After splitting selected regions, select"
 msgstr ""
 
-#: rc_option_editor.cc:1752
-msgid "Update editor window during drags of the summary"
+#: rc_option_editor.cc:2337
+msgid "no regions"
 msgstr ""
 
-#: rc_option_editor.cc:1760
-msgid "Synchronise editor and mixer selection"
+#: rc_option_editor.cc:2340
+msgid "newly-created regions"
 msgstr ""
 
-#: rc_option_editor.cc:1767
-msgid "Name new markers"
+#: rc_option_editor.cc:2344
+msgid "existing selection and newly-created regions"
 msgstr ""
 
-#: rc_option_editor.cc:1773
-msgid ""
-"If enabled, popup a dialog when a new marker is created to allow its name to "
-"be set as it is created.\n"
-"\n"
-"You can always rename markers by right-clicking on them"
+#: rc_option_editor.cc:2348 rc_option_editor.cc:2351 rc_option_editor.cc:2360
+#: rc_option_editor.cc:2378 rc_option_editor.cc:2390 rc_option_editor.cc:2392
+msgid "Editor/Waveforms"
 msgstr ""
 
-#: rc_option_editor.cc:1779
-msgid "Auto-scroll editor window when dragging near its edges"
+#: rc_option_editor.cc:2348
+msgid "Waveforms"
 msgstr ""
 
-#: rc_option_editor.cc:1786
-msgid "After splitting selected regions, select"
+#: rc_option_editor.cc:2354
+msgid "Show waveforms in regions"
 msgstr ""
 
-#: rc_option_editor.cc:1791
-msgid "no regions"
+#: rc_option_editor.cc:2363
+msgid "Show waveforms for audio while it is being recorded"
 msgstr ""
 
-#: rc_option_editor.cc:1794
-msgid "newly-created regions"
+#: rc_option_editor.cc:2370
+msgid "Waveform scale"
 msgstr ""
 
-#: rc_option_editor.cc:1798
-msgid "existing selection and newly-created regions"
+#: rc_option_editor.cc:2375
+msgid "linear"
+msgstr "linear"
+
+#: rc_option_editor.cc:2376
+msgid "logarithmic"
 msgstr ""
 
-#: rc_option_editor.cc:1805
+#: rc_option_editor.cc:2382
+msgid "Waveform shape"
+msgstr ""
+
+#: rc_option_editor.cc:2387
+msgid "traditional"
+msgstr ""
+
+#: rc_option_editor.cc:2388
+msgid "rectified"
+msgstr ""
+
+#: rc_option_editor.cc:2397
 msgid "Buffering"
 msgstr ""
 
-#: rc_option_editor.cc:1813
+#: rc_option_editor.cc:2405
 msgid "Record monitoring handled by"
 msgstr ""
 
-#: rc_option_editor.cc:1819
+#: rc_option_editor.cc:2411
 msgid "via Audio Driver"
 msgstr ""
 
-#: rc_option_editor.cc:1825
+#: rc_option_editor.cc:2417
 msgid "audio hardware"
 msgstr ""
 
-#: rc_option_editor.cc:1832
+#: rc_option_editor.cc:2424
 msgid "Tape machine mode"
 msgstr ""
 
-#: rc_option_editor.cc:1837
+#: rc_option_editor.cc:2429
 msgid "Connection of tracks and busses"
 msgstr ""
 
-#: rc_option_editor.cc:1842
+#: rc_option_editor.cc:2435
 msgid "Auto-connect master/monitor busses"
 msgstr ""
 
-#: rc_option_editor.cc:1849
+#: rc_option_editor.cc:2442
 msgid "Connect track inputs"
 msgstr ""
 
-#: rc_option_editor.cc:1854
+#: rc_option_editor.cc:2447
 msgid "automatically to physical inputs"
 msgstr ""
 
-#: rc_option_editor.cc:1855 rc_option_editor.cc:1868
+#: rc_option_editor.cc:2448 rc_option_editor.cc:2461
 msgid "manually"
 msgstr ""
 
-#: rc_option_editor.cc:1861
+#: rc_option_editor.cc:2454
 msgid "Connect track and bus outputs"
 msgstr ""
 
-#: rc_option_editor.cc:1866
+#: rc_option_editor.cc:2459
 msgid "automatically to physical outputs"
 msgstr ""
 
-#: rc_option_editor.cc:1867
+#: rc_option_editor.cc:2460
 msgid "automatically to master bus"
 msgstr ""
 
-#: rc_option_editor.cc:1872
+#: rc_option_editor.cc:2467
+msgid "Use 'Strict-I/O' for new tracks or Busses"
+msgstr ""
+
+#: rc_option_editor.cc:2478
 msgid "Denormals"
 msgstr ""
 
-#: rc_option_editor.cc:1877
+#: rc_option_editor.cc:2483
 msgid "Use DC bias to protect against denormals"
 msgstr ""
 
-#: rc_option_editor.cc:1884
+#: rc_option_editor.cc:2490
 msgid "Processor handling"
 msgstr ""
 
-#: rc_option_editor.cc:1890
+#: rc_option_editor.cc:2496
 msgid "no processor handling"
 msgstr ""
 
-#: rc_option_editor.cc:1896
+#: rc_option_editor.cc:2502
 msgid "use FlushToZero"
 msgstr ""
 
-#: rc_option_editor.cc:1903
+#: rc_option_editor.cc:2509
 msgid "use DenormalsAreZero"
 msgstr ""
 
-#: rc_option_editor.cc:1910
+#: rc_option_editor.cc:2516
 msgid "use FlushToZero and DenormalsAreZero"
 msgstr ""
 
-#: rc_option_editor.cc:1926
-msgid "Silence plugins when the transport is stopped"
+#: rc_option_editor.cc:2532
+msgid "Enable automatic analysis of audio"
 msgstr ""
 
-#: rc_option_editor.cc:1934
-msgid "Make new plugins active"
+#: rc_option_editor.cc:2540
+msgid "Replicate missing region channels"
 msgstr ""
 
-#: rc_option_editor.cc:1944
-msgid "Enable automatic analysis of audio"
+#: rc_option_editor.cc:2547 rc_option_editor.cc:2556 rc_option_editor.cc:2558
+#: rc_option_editor.cc:2566 rc_option_editor.cc:2574 rc_option_editor.cc:2582
+#: rc_option_editor.cc:2600 rc_option_editor.cc:2612 rc_option_editor.cc:2624
+#: rc_option_editor.cc:2626 rc_option_editor.cc:2628 rc_option_editor.cc:2636
+#: rc_option_editor.cc:2644 rc_option_editor.cc:2652 rc_option_editor.cc:2662
+#: rc_option_editor.cc:2663
+msgid "Solo & mute"
 msgstr ""
 
-#: rc_option_editor.cc:1952
-msgid "Replicate missing region channels"
+#: rc_option_editor.cc:2551
+msgid "Solo controls are Listen controls"
 msgstr ""
 
-#: rc_option_editor.cc:1959 rc_option_editor.cc:1961 rc_option_editor.cc:1976
-#: rc_option_editor.cc:1988 rc_option_editor.cc:2000 rc_option_editor.cc:2012
-#: rc_option_editor.cc:2016 rc_option_editor.cc:2024 rc_option_editor.cc:2032
-#: rc_option_editor.cc:2040 rc_option_editor.cc:2042 rc_option_editor.cc:2050
-#: rc_option_editor.cc:2058 rc_option_editor.cc:2066 rc_option_editor.cc:2074
-#: rc_option_editor.cc:2076
-msgid "Solo / mute"
+#: rc_option_editor.cc:2561
+msgid "Exclusive solo"
 msgstr ""
 
-#: rc_option_editor.cc:1964
-msgid "Solo-in-place mute cut (dB)"
+#: rc_option_editor.cc:2569
+msgid "Show solo muting"
 msgstr ""
 
-#: rc_option_editor.cc:1971
-msgid "Solo controls are Listen controls"
+#: rc_option_editor.cc:2577
+msgid "Soloing overrides muting"
+msgstr ""
+
+#: rc_option_editor.cc:2585
+msgid "Solo-in-place mute cut (dB)"
 msgstr ""
 
-#: rc_option_editor.cc:1980
+#: rc_option_editor.cc:2592
 msgid "Listen Position"
 msgstr ""
 
-#: rc_option_editor.cc:1985
+#: rc_option_editor.cc:2597
 msgid "after-fader (AFL)"
 msgstr ""
 
-#: rc_option_editor.cc:1986
+#: rc_option_editor.cc:2598
 msgid "pre-fader (PFL)"
 msgstr ""
 
-#: rc_option_editor.cc:1992
+#: rc_option_editor.cc:2604
 msgid "PFL signals come from"
 msgstr ""
 
-#: rc_option_editor.cc:1997
+#: rc_option_editor.cc:2609
 msgid "before pre-fader processors"
 msgstr ""
 
-#: rc_option_editor.cc:1998
+#: rc_option_editor.cc:2610
 msgid "pre-fader but after pre-fader processors"
 msgstr ""
 
-#: rc_option_editor.cc:2004
+#: rc_option_editor.cc:2616
 msgid "AFL signals come from"
 msgstr ""
 
-#: rc_option_editor.cc:2009
+#: rc_option_editor.cc:2621
 msgid "immediately post-fader"
 msgstr ""
 
-#: rc_option_editor.cc:2010
+#: rc_option_editor.cc:2622
 msgid "after post-fader processors (before pan)"
 msgstr ""
 
-#: rc_option_editor.cc:2019
-msgid "Exclusive solo"
-msgstr ""
-
-#: rc_option_editor.cc:2027
-msgid "Show solo muting"
-msgstr ""
-
-#: rc_option_editor.cc:2035
-msgid "Soloing overrides muting"
-msgstr ""
-
-#: rc_option_editor.cc:2040
+#: rc_option_editor.cc:2626
 msgid "Default track / bus muting options"
 msgstr ""
 
-#: rc_option_editor.cc:2045
+#: rc_option_editor.cc:2631
 msgid "Mute affects pre-fader sends"
 msgstr ""
 
-#: rc_option_editor.cc:2053
+#: rc_option_editor.cc:2639
 msgid "Mute affects post-fader sends"
 msgstr ""
 
-#: rc_option_editor.cc:2061
+#: rc_option_editor.cc:2647
 msgid "Mute affects control outputs"
 msgstr ""
 
-#: rc_option_editor.cc:2069
+#: rc_option_editor.cc:2655
 msgid "Mute affects main outputs"
 msgstr ""
 
-#: rc_option_editor.cc:2074
+#: rc_option_editor.cc:2662
 msgid "Send Routing"
 msgstr ""
 
-#: rc_option_editor.cc:2079
+#: rc_option_editor.cc:2666
 msgid "Link panners of Aux and External Sends with main panner by default"
 msgstr ""
 
-#: rc_option_editor.cc:2087
+#: rc_option_editor.cc:2672
+msgid "MIDI Preferences"
+msgstr ""
+
+#: rc_option_editor.cc:2677
 msgid "MIDI read-ahead time (seconds)"
 msgstr ""
 
-#: rc_option_editor.cc:2105
+#: rc_option_editor.cc:2687
+msgid "Initial program change"
+msgstr ""
+
+#: rc_option_editor.cc:2696
+msgid "Display first MIDI bank/program as 0"
+msgstr ""
+
+#: rc_option_editor.cc:2704
+msgid "Never display periodic MIDI messages (MTC, MIDI Clock)"
+msgstr ""
+
+#: rc_option_editor.cc:2712
+msgid "Sound MIDI notes as they are selected in the editor"
+msgstr ""
+
+#: rc_option_editor.cc:2720
+msgid "Send MIDI control feedback"
+msgstr ""
+
+#: rc_option_editor.cc:2725 rc_option_editor.cc:2727 rc_option_editor.cc:2735
+#: rc_option_editor.cc:2737 rc_option_editor.cc:2745 rc_option_editor.cc:2754
+#: rc_option_editor.cc:2756 rc_option_editor.cc:2764 rc_option_editor.cc:2772
+#: rc_option_editor.cc:2781
+msgid "MIDI/Sync"
+msgstr ""
+
+#: rc_option_editor.cc:2725
+msgid "MIDI Clock"
+msgstr ""
+
+#: rc_option_editor.cc:2735
+msgid "MIDI Time Code (MTC)"
+msgstr ""
+
+#: rc_option_editor.cc:2740
 msgid "Send MIDI Time Code"
 msgstr ""
 
-#: rc_option_editor.cc:2113
-msgid "Percentage either side of normal transport speed to transmit MTC"
+#: rc_option_editor.cc:2748
+msgid "Percentage either side of normal transport speed to transmit MTC"
+msgstr ""
+
+#: rc_option_editor.cc:2754
+msgid "Midi Machine Control (MMC)"
+msgstr ""
+
+#: rc_option_editor.cc:2759
+msgid "Obey MIDI Machine Control commands"
+msgstr ""
+
+#: rc_option_editor.cc:2767
+msgid "Send MIDI Machine Control commands"
+msgstr ""
+
+#: rc_option_editor.cc:2775
+msgid "Inbound MMC device ID"
+msgstr ""
+
+#: rc_option_editor.cc:2784
+msgid "Outbound MMC device ID"
+msgstr ""
+
+#: rc_option_editor.cc:2790
+msgid "Midi Audition"
+msgstr ""
+
+#: rc_option_editor.cc:2794
+msgid "Midi Audition Synth (LV2)"
+msgstr ""
+
+#: rc_option_editor.cc:2825 rc_option_editor.cc:2835 rc_option_editor.cc:2837
+msgid "User interaction"
+msgstr ""
+
+#: rc_option_editor.cc:2828
+msgid ""
+"Use translations of %1 messages\n"
+"   <i>(requires a restart of %1 to take effect)</i>\n"
+"   <i>(if available for your language preferences)</i>"
+msgstr ""
+
+#: rc_option_editor.cc:2835
+msgid "Keyboard"
+msgstr ""
+
+#: rc_option_editor.cc:2848 startup.cc:352
+msgid "Scan for Plugins"
+msgstr ""
+
+#: rc_option_editor.cc:2853
+msgid "General"
+msgstr ""
+
+#: rc_option_editor.cc:2858
+msgid "Always Display Plugin Scan Progress"
+msgstr ""
+
+#: rc_option_editor.cc:2864
+msgid ""
+"<b>When enabled</b> a popup window showing plugin scan progress is displayed "
+"for indexing (cache load) and discovery (detect new plugins)"
+msgstr ""
+
+#: rc_option_editor.cc:2869
+msgid "Silence plugins when the transport is stopped"
+msgstr ""
+
+#: rc_option_editor.cc:2875
+msgid ""
+"<b>When enabled</b> plugins will be reset at transport stop. When disabled "
+"plugins will be left unchanged at transport stop.\n"
+"\n"
+"This mostly affects plugins with a \"tail\" like Reverbs."
+msgstr ""
+
+#: rc_option_editor.cc:2879
+msgid "Make new plugins active"
+msgstr ""
+
+#: rc_option_editor.cc:2885
+msgid ""
+"<b>When enabled</b> plugins will be activated when they are added to tracks/"
+"busses. When disabled plugins will be left inactive when they are added to "
+"tracks/busses"
+msgstr ""
+
+#: rc_option_editor.cc:2888 rc_option_editor.cc:2896 rc_option_editor.cc:2908
+#: rc_option_editor.cc:2913 rc_option_editor.cc:2915 rc_option_editor.cc:2920
+#: rc_option_editor.cc:2927 rc_option_editor.cc:2932 rc_option_editor.cc:2941
+msgid "Plugins/VST"
+msgstr ""
+
+#: rc_option_editor.cc:2888
+msgid "VST"
+msgstr ""
+
+#: rc_option_editor.cc:2892
+msgid "Scan for [new] VST Plugins on Application Start"
+msgstr ""
+
+#: rc_option_editor.cc:2898
+msgid ""
+"<b>When enabled</b> new VST plugins are searched, tested and added to the "
+"cache index on application start. When disabled new plugins will only be "
+"available after triggering a 'Scan' manually"
+msgstr ""
+
+#: rc_option_editor.cc:2904
+msgid "Verbose Plugin Scan"
+msgstr ""
+
+#: rc_option_editor.cc:2910
+msgid ""
+"<b>When enabled</b> additional information for every plugin is added to the "
+"Log Window."
+msgstr ""
+
+#: rc_option_editor.cc:2918
+msgid "VST Cache:"
+msgstr ""
+
+#: rc_option_editor.cc:2923
+msgid "VST Blacklist:"
+msgstr ""
+
+#: rc_option_editor.cc:2930
+msgid "Linux VST Path:"
+msgstr ""
+
+#: rc_option_editor.cc:2935 rc_option_editor.cc:2948
+msgid "Path:"
+msgstr ""
+
+#: rc_option_editor.cc:2944
+msgid "Windows VST Path:"
+msgstr ""
+
+#: rc_option_editor.cc:2954 rc_option_editor.cc:2966 rc_option_editor.cc:2971
+msgid "Plugins/Audio Unit"
 msgstr ""
 
-#: rc_option_editor.cc:2122
-msgid "Obey MIDI Machine Control commands"
+#: rc_option_editor.cc:2954
+msgid "Audio Unit"
 msgstr ""
 
-#: rc_option_editor.cc:2130
-msgid "Send MIDI Machine Control commands"
+#: rc_option_editor.cc:2958
+msgid "Scan for AudioUnit Plugins on Application Start"
 msgstr ""
 
-#: rc_option_editor.cc:2138
-msgid "Send MIDI control feedback"
+#: rc_option_editor.cc:2964
+msgid ""
+"<b>When enabled</b> Audio Unit Plugins are discovered on application start. "
+"When disabled AU plugins will only be available after triggering a 'Scan' "
+"manually. The first successful scan will enable AU auto-scan, Any crash "
+"during plugin discovery will disable it."
 msgstr ""
 
-#: rc_option_editor.cc:2146
-msgid "Inbound MMC device ID"
+#: rc_option_editor.cc:2969
+msgid "AU Cache:"
 msgstr ""
 
-#: rc_option_editor.cc:2155
-msgid "Outbound MMC device ID"
+#: rc_option_editor.cc:2974
+msgid "AU Blacklist:"
 msgstr ""
 
-#: rc_option_editor.cc:2164
-msgid "Initial program change"
+#: rc_option_editor.cc:2978
+msgid "Plugin GUI"
 msgstr ""
 
-#: rc_option_editor.cc:2173
-msgid "Display first MIDI bank/program as 0"
+#: rc_option_editor.cc:2982
+msgid "Automatically open the plugin GUI when adding a new plugin"
 msgstr ""
 
-#: rc_option_editor.cc:2181
-msgid "Never display periodic MIDI messages (MTC, MIDI Clock)"
+#: rc_option_editor.cc:2991
+msgid "Show Plugin Inline Display on Mixerstrip by default"
 msgstr ""
 
-#: rc_option_editor.cc:2189
-msgid "Sound MIDI notes as they are selected"
+#: rc_option_editor.cc:2998
+msgid ""
+"Don't automatically open the plugin GUI when the plugin has an inline "
+"display mode"
 msgstr ""
 
-#: rc_option_editor.cc:2194
-msgid "Midi Audition"
+#: rc_option_editor.cc:3005
+msgid "Instrument"
 msgstr ""
 
-#: rc_option_editor.cc:2198
-msgid "Midi Audition Synth (LV2)"
+#: rc_option_editor.cc:3009
+msgid "Ask to replace existing instrument plugin"
 msgstr ""
 
-#: rc_option_editor.cc:2229 rc_option_editor.cc:2239 rc_option_editor.cc:2241
-msgid "User interaction"
+#: rc_option_editor.cc:3017
+msgid "Interactively configure instrument plugins on insert"
 msgstr ""
 
-#: rc_option_editor.cc:2232
+#: rc_option_editor.cc:3023
 msgid ""
-"Use translations of %1 messages\n"
-"   <i>(requires a restart of %1 to take effect)</i>\n"
-"   <i>(if available for your language preferences)</i>"
+"<b>When enabled</b> show a dialog to select instrument channel configuration "
+"before adding a multichannel plugin."
 msgstr ""
 
-#: rc_option_editor.cc:2239
-msgid "Keyboard"
+#: rc_option_editor.cc:3032
+msgid "Disable Graphics Hardware Acceleration (requires restart)"
 msgstr ""
 
-#: rc_option_editor.cc:2249
-msgid "Control surface remote ID"
+#: rc_option_editor.cc:3038
+msgid ""
+"Render large parts of the application user-interface in software, instead of "
+"using 2D-graphics acceleration.\n"
+"This requires restarting %1 before having an effect"
 msgstr ""
 
-#: rc_option_editor.cc:2254
-msgid "assigned by user"
+#: rc_option_editor.cc:3039 rc_option_editor.cc:3051 rc_option_editor.cc:3054
+#: rc_option_editor.cc:3062 rc_option_editor.cc:3070 rc_option_editor.cc:3078
+#: rc_option_editor.cc:3086 rc_option_editor.cc:3097 rc_option_editor.cc:3113
+#: rc_option_editor.cc:3129 rc_option_editor.cc:3144 rc_option_editor.cc:3153
+#: rc_option_editor.cc:3161
+msgid "Preferences|GUI"
 msgstr ""
 
-#: rc_option_editor.cc:2255
-msgid "follows order of mixer"
+#: rc_option_editor.cc:3045
+msgid "Possibly improve slow graphical performance (requires restart)"
 msgstr ""
 
-#: rc_option_editor.cc:2269 rc_option_editor.cc:2278 rc_option_editor.cc:2287
-#: rc_option_editor.cc:2297 rc_option_editor.cc:2321 rc_option_editor.cc:2334
-#: rc_option_editor.cc:2343
-msgid "Preferences|GUI"
+#: rc_option_editor.cc:3050
+msgid ""
+"Disables hardware gradient rendering on buggy video drivers (\"buggy "
+"gradients patch\").\n"
+"This requires restarting %1 before having an effect"
 msgstr ""
 
-#: rc_option_editor.cc:2272
+#: rc_option_editor.cc:3057
+msgid "Use Window Manager/Desktop visibility information"
+msgstr ""
+
+#: rc_option_editor.cc:3065
 msgid "Graphically indicate mouse pointer hovering over various widgets"
 msgstr ""
 
-#: rc_option_editor.cc:2281
+#: rc_option_editor.cc:3073
 msgid "Show tooltips if mouse hovers over a control"
 msgstr ""
 
-#: rc_option_editor.cc:2290
+#: rc_option_editor.cc:3081
 msgid "Use name highlight bars in region displays (requires a restart)"
 msgstr ""
 
-#: rc_option_editor.cc:2303
-msgid "update transport clock display at FPS instead of every 100ms"
+#: rc_option_editor.cc:3089
+msgid "Update transport clock display at FPS instead of every 100ms"
 msgstr ""
 
-#: rc_option_editor.cc:2312
+#: rc_option_editor.cc:3104
+msgid "Waveform image cache size (megabytes)"
+msgstr ""
+
+#: rc_option_editor.cc:3112
+msgid ""
+"Increasing the cache size uses more memory to store waveform images, which "
+"can improve graphical performance."
+msgstr ""
+
+#: rc_option_editor.cc:3120
 msgid "Lock timeout (seconds)"
 msgstr ""
 
-#: rc_option_editor.cc:2320
+#: rc_option_editor.cc:3128
 msgid "Lock GUI after this many idle seconds (zero to never lock)"
 msgstr ""
 
-#: rc_option_editor.cc:2336
+#: rc_option_editor.cc:3146
 msgid "Mixer Strip"
 msgstr ""
 
-#: rc_option_editor.cc:2346
+#: rc_option_editor.cc:3156
 msgid "Use narrow strips in the mixer by default"
 msgstr ""
 
-#: rc_option_editor.cc:2351 rc_option_editor.cc:2365 rc_option_editor.cc:2384
-#: rc_option_editor.cc:2400 rc_option_editor.cc:2416 rc_option_editor.cc:2430
-#: rc_option_editor.cc:2444 rc_option_editor.cc:2446
+#: rc_option_editor.cc:3163
+msgid "Action Script Button Visibility"
+msgstr ""
+
+#: rc_option_editor.cc:3169 rc_option_editor.cc:3183 rc_option_editor.cc:3200
+#: rc_option_editor.cc:3216 rc_option_editor.cc:3232 rc_option_editor.cc:3246
+#: rc_option_editor.cc:3272 rc_option_editor.cc:3290 rc_option_editor.cc:3301
+#: rc_option_editor.cc:3308 rc_option_editor.cc:3310 rc_option_editor.cc:3318
+#: rc_option_editor.cc:3320 rc_option_editor.cc:3328 rc_option_editor.cc:3336
+#: rc_option_editor.cc:3338
 msgid "Preferences|Metering"
 msgstr ""
 
-#: rc_option_editor.cc:2355
+#: rc_option_editor.cc:3173
 msgid "Peak hold time"
 msgstr ""
 
-#: rc_option_editor.cc:2361
+#: rc_option_editor.cc:3179
 msgid "short"
 msgstr ""
 
-#: rc_option_editor.cc:2362
+#: rc_option_editor.cc:3180
 msgid "medium"
 msgstr ""
 
-#: rc_option_editor.cc:2363
+#: rc_option_editor.cc:3181
 msgid "long"
 msgstr ""
 
-#: rc_option_editor.cc:2369
+#: rc_option_editor.cc:3187
 msgid "DPM fall-off"
 msgstr ""
 
-#: rc_option_editor.cc:2375
+#: rc_option_editor.cc:3193
 msgid "slowest [6.6dB/sec]"
 msgstr ""
 
-#: rc_option_editor.cc:2376
+#: rc_option_editor.cc:3194
 msgid "slow [8.6dB/sec] (BBC PPM, EBU PPM)"
 msgstr ""
 
-#: rc_option_editor.cc:2377
-msgid "slowish [12.0dB/sec] (DIN)"
-msgstr ""
-
-#: rc_option_editor.cc:2378
-msgid "moderate [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"
-msgstr ""
-
-#: rc_option_editor.cc:2379
-msgid "medium [20dB/sec]"
+#: rc_option_editor.cc:3195
+msgid "moderate [12.0dB/sec] (DIN)"
 msgstr ""
 
-#: rc_option_editor.cc:2380
-msgid "fast [32dB/sec]"
+#: rc_option_editor.cc:3196
+msgid "medium [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"
 msgstr ""
 
-#: rc_option_editor.cc:2381
-msgid "faster [46dB/sec]"
+#: rc_option_editor.cc:3197
+msgid "fast [20dB/sec]"
 msgstr ""
 
-#: rc_option_editor.cc:2382
-msgid "fastest [70dB/sec]"
+#: rc_option_editor.cc:3198
+msgid "very fast [32dB/sec]"
 msgstr ""
 
-#: rc_option_editor.cc:2388
+#: rc_option_editor.cc:3204
 msgid "Meter line-up level; 0dBu"
 msgstr ""
 
-#: rc_option_editor.cc:2393 rc_option_editor.cc:2409
+#: rc_option_editor.cc:3209 rc_option_editor.cc:3225
 msgid "-24dBFS (SMPTE US: 4dBu = -20dBFS)"
 msgstr ""
 
-#: rc_option_editor.cc:2394 rc_option_editor.cc:2410
+#: rc_option_editor.cc:3210 rc_option_editor.cc:3226
 msgid "-20dBFS (SMPTE RP.0155)"
 msgstr ""
 
-#: rc_option_editor.cc:2395 rc_option_editor.cc:2411
+#: rc_option_editor.cc:3211 rc_option_editor.cc:3227
 msgid "-18dBFS (EBU, BBC)"
 msgstr ""
 
-#: rc_option_editor.cc:2396 rc_option_editor.cc:2412
+#: rc_option_editor.cc:3212 rc_option_editor.cc:3228
 msgid "-15dBFS (DIN)"
 msgstr ""
 
-#: rc_option_editor.cc:2398
+#: rc_option_editor.cc:3214
 msgid ""
 "Configure meter-marks and color-knee point for dBFS scale DPM, set reference "
 "level for IEC1/Nordic, IEC2 PPM and VU meter."
 msgstr ""
 
-#: rc_option_editor.cc:2404
+#: rc_option_editor.cc:3220
 msgid "IEC1/DIN Meter line-up level; 0dBu"
 msgstr ""
 
-#: rc_option_editor.cc:2414
+#: rc_option_editor.cc:3230
 msgid "Reference level for IEC1/DIN meter."
 msgstr ""
 
-#: rc_option_editor.cc:2420
+#: rc_option_editor.cc:3236
 msgid "VU Meter standard"
 msgstr ""
 
-#: rc_option_editor.cc:2425
+#: rc_option_editor.cc:3241
 msgid "0VU = -2dBu (France)"
 msgstr ""
 
-#: rc_option_editor.cc:2426
+#: rc_option_editor.cc:3242
 msgid "0VU = 0dBu (North America, Australia)"
 msgstr ""
 
-#: rc_option_editor.cc:2427
+#: rc_option_editor.cc:3243
 msgid "0VU = +4dBu (standard)"
 msgstr ""
 
-#: rc_option_editor.cc:2428
+#: rc_option_editor.cc:3244
 msgid "0VU = +8dBu"
 msgstr ""
 
-#: rc_option_editor.cc:2434
+#: rc_option_editor.cc:3250
 msgid "Peak threshold [dBFS]"
 msgstr ""
 
-#: rc_option_editor.cc:2442
+#: rc_option_editor.cc:3259
+msgid "Default Meter Type for Master Bus"
+msgstr ""
+
+#: rc_option_editor.cc:3277
+msgid "Default Meter Type for Busses"
+msgstr ""
+
+#: rc_option_editor.cc:3294
+msgid "Default Meter Type for Tracks"
+msgstr ""
+
+#: rc_option_editor.cc:3306
 msgid ""
 "Specify the audio signal level in dbFS at and above which the meter-peak "
 "indicator will flash red."
 msgstr ""
 
-#: rc_option_editor.cc:2449
+#: rc_option_editor.cc:3313
 msgid "LED meter style"
 msgstr ""
 
-#: rc_option_editor.cc:2457
+#: rc_option_editor.cc:3318
+msgid "Editor Meters"
+msgstr ""
+
+#: rc_option_editor.cc:3323
+msgid "Show meters on tracks in the editor"
+msgstr ""
+
+#: rc_option_editor.cc:3331
+msgid "Show at most stereo meters in the track-header"
+msgstr ""
+
+#: rc_option_editor.cc:3336
+msgid "Post Export Analysis"
+msgstr ""
+
+#: rc_option_editor.cc:3341
+msgid "Save loudness analysis as image file"
+msgstr ""
+
+#: rc_option_editor.cc:3349
 msgid "Theme"
 msgstr ""
 
-#: region_editor.cc:79
+#: rc_option_editor.cc:3351
+msgid "Theme/Colors"
+msgstr ""
+
+#: rc_option_editor.cc:3429
+msgid "Set Linux VST Search Path"
+msgstr ""
+
+#: rc_option_editor.cc:3443
+msgid "Set Windows VST Search Path"
+msgstr ""
+
+#: region_editor.cc:81
 msgid "audition this region"
 msgstr "ouvir esta região"
 
-#: region_editor.cc:88 region_layering_order_editor.cc:75
+#: region_editor.cc:90 region_layering_order_editor.cc:75
 msgid "Position:"
 msgstr ""
 
-#: region_editor.cc:90 add_video_dialog.cc:155
+#: region_editor.cc:92 add_video_dialog.cc:155
 msgid "End:"
 msgstr "Final:"
 
-#: region_editor.cc:92 sfdb_ui.cc:145
+#: region_editor.cc:94 sfdb_ui.cc:145
 msgid "Length:"
 msgstr ""
 
-#: region_editor.cc:94
+#: region_editor.cc:96
 msgid "Sync point (relative to region):"
 msgstr ""
 
-#: region_editor.cc:96
+#: region_editor.cc:98
 msgid "Sync point (absolute):"
 msgstr ""
 
-#: region_editor.cc:98
+#: region_editor.cc:100
 msgid "File start:"
 msgstr ""
 
-#: region_editor.cc:102
+#: region_editor.cc:104
 msgid "Sources:"
 msgstr ""
 
-#: region_editor.cc:104
+#: region_editor.cc:106
 msgid "Source:"
 msgstr ""
 
-#: region_editor.cc:166
+#: region_editor.cc:168
 msgid "Region '%1'"
 msgstr ""
 
-#: region_editor.cc:273
+#: region_editor.cc:279
 msgid "change region start position"
 msgstr ""
 
-#: region_editor.cc:289
+#: region_editor.cc:299
 msgid "change region end position"
 msgstr ""
 
-#: region_editor.cc:309
+#: region_editor.cc:322
 msgid "change region length"
 msgstr ""
 
-#: region_editor.cc:403 region_editor.cc:415
+#: region_editor.cc:416 region_editor.cc:428
 msgid "change region sync point"
 msgstr ""
 
@@ -9728,33 +11741,33 @@ msgstr ""
 msgid "Choose Top Region"
 msgstr ""
 
-#: region_view.cc:277
+#: region_view.cc:271
 msgid "SilenceText"
 msgstr ""
 
-#: region_view.cc:292 region_view.cc:311
+#: region_view.cc:286 region_view.cc:305
 msgid "minutes"
 msgstr ""
 
-#: region_view.cc:295 region_view.cc:314
+#: region_view.cc:289 region_view.cc:308
 msgid "msecs"
 msgstr ""
 
-#: region_view.cc:298 region_view.cc:317
+#: region_view.cc:292 region_view.cc:311
 msgid "secs"
 msgstr ""
 
-#: region_view.cc:301
+#: region_view.cc:295
 msgid "%1 silent segment"
 msgid_plural "%1 silent segments"
 msgstr[0] ""
 msgstr[1] ""
 
-#: region_view.cc:303
+#: region_view.cc:297
 msgid "shortest = %1 %2"
 msgstr ""
 
-#: region_view.cc:320
+#: region_view.cc:314
 msgid ""
 "\n"
 "  (shortest audible segment = %1 %2)"
@@ -9800,55 +11813,63 @@ msgstr ""
 msgid "Modified Kullback-Liebler"
 msgstr ""
 
-#: rhythm_ferret.cc:65
+#: rhythm_ferret.cc:62
+msgid "Spectral Flux"
+msgstr ""
+
+#: rhythm_ferret.cc:68
 msgid "Split region"
 msgstr ""
 
-#: rhythm_ferret.cc:66
+#: rhythm_ferret.cc:70
 msgid "Snap regions"
 msgstr ""
 
-#: rhythm_ferret.cc:67
+#: rhythm_ferret.cc:71
 msgid "Conform regions"
 msgstr ""
 
-#: rhythm_ferret.cc:72
+#: rhythm_ferret.cc:77
 msgid "Rhythm Ferret"
 msgstr ""
 
-#: rhythm_ferret.cc:78
+#: rhythm_ferret.cc:83
 msgid "Analyze"
 msgstr ""
 
-#: rhythm_ferret.cc:113
+#: rhythm_ferret.cc:122
 msgid "Detection function"
 msgstr ""
 
-#: rhythm_ferret.cc:117
-msgid "Trigger gap"
-msgstr ""
-
-#: rhythm_ferret.cc:122 strip_silence_dialog.cc:64
-msgid "Threshold"
+#: rhythm_ferret.cc:126
+msgid "Trigger gap (postproc)"
 msgstr ""
 
-#: rhythm_ferret.cc:127
+#: rhythm_ferret.cc:131
 msgid "Peak threshold"
 msgstr ""
 
-#: rhythm_ferret.cc:132
+#: rhythm_ferret.cc:135
 msgid "Silence threshold"
 msgstr ""
 
-#: rhythm_ferret.cc:137
+#: rhythm_ferret.cc:141
+msgid "Min Inter-Onset Time"
+msgstr ""
+
+#: rhythm_ferret.cc:148
 msgid "Sensitivity"
 msgstr ""
 
-#: rhythm_ferret.cc:141
+#: rhythm_ferret.cc:152
+msgid "Cut Pos Threshold"
+msgstr ""
+
+#: rhythm_ferret.cc:157
 msgid "Operation"
 msgstr ""
 
-#: rhythm_ferret.cc:355
+#: rhythm_ferret.cc:382
 msgid "split regions (rhythm ferret)"
 msgstr ""
 
@@ -9872,19 +11893,15 @@ msgstr ""
 msgid "Active state"
 msgstr ""
 
-#: route_group_dialog.cc:53 route_group_dialog.cc:82 theme_manager.cc:90
-msgid "Color"
-msgstr "Cor"
-
-#: route_group_dialog.cc:59
+#: route_group_dialog.cc:58
 msgid "RouteGroupDialog"
 msgstr ""
 
-#: route_group_dialog.cc:100
+#: route_group_dialog.cc:99
 msgid "<b>Sharing</b>"
 msgstr ""
 
-#: route_group_dialog.cc:200
+#: route_group_dialog.cc:192
 msgid "The group name is not unique. Please use a different name."
 msgstr ""
 
@@ -9904,404 +11921,389 @@ msgstr "Saídas"
 msgid "Plugins, Inserts & Sends"
 msgstr ""
 
-#: route_params_ui.cc:209
+#: route_params_ui.cc:201
 msgid "route display list item for renamed route not found!"
 msgstr "não foi encontrado qualquer encaminhamento"
 
-#: route_params_ui.cc:279 route_params_ui.cc:307
+#: route_params_ui.cc:271 route_params_ui.cc:299
 #, c-format
 msgid "Playback delay: %<PRId64> samples"
 msgstr ""
 
-#: route_params_ui.cc:499
+#: route_params_ui.cc:491
 msgid "NO TRACK"
 msgstr "Nenhuma faixa"
 
-#: route_params_ui.cc:637 route_params_ui.cc:638
+#: route_params_ui.cc:515
+msgid "Add Track or Bus"
+msgstr ""
+
+#: route_params_ui.cc:627 route_params_ui.cc:628
 msgid "No Track or Bus Selected"
 msgstr ""
 
-#: route_time_axis.cc:181
+#: route_time_axis.cc:104
+msgid "RTAV|G"
+msgstr ""
+
+#: route_time_axis.cc:105
+msgid "RTAV|P"
+msgstr ""
+
+#: route_time_axis.cc:106
+msgid "RTAV|A"
+msgstr ""
+
+#: route_time_axis.cc:194
 msgid "Record (Right-click for Step Edit)"
 msgstr ""
 
-#: route_time_axis.cc:184
+#: route_time_axis.cc:197
 msgid "Record"
 msgstr "Gravar"
 
-#: route_time_axis.cc:254
+#: route_time_axis.cc:265
 msgid "Route Group"
 msgstr ""
 
-#: route_time_axis.cc:264
+#: route_time_axis.cc:275
 msgid "MIDI Controllers and Automation"
 msgstr ""
 
-#: route_time_axis.cc:495
+#: route_time_axis.cc:510
 msgid "Show All Automation"
 msgstr ""
 
-#: route_time_axis.cc:498
+#: route_time_axis.cc:513
 msgid "Show Existing Automation"
 msgstr ""
 
-#: route_time_axis.cc:501
+#: route_time_axis.cc:516
 msgid "Hide All Automation"
 msgstr ""
 
-#: route_time_axis.cc:510
+#: route_time_axis.cc:525
 msgid "Processor automation"
 msgstr ""
 
-#: route_time_axis.cc:517
+#: route_time_axis.cc:532
 msgid "Fader"
 msgstr "Desvanecimento"
 
-#: route_time_axis.cc:535
+#: route_time_axis.cc:559
 msgid "Pan"
 msgstr "Panorama"
 
-#: route_time_axis.cc:626
+#: route_time_axis.cc:643
 msgid "Overlaid"
 msgstr ""
 
-#: route_time_axis.cc:632
+#: route_time_axis.cc:649
 msgid "Stacked"
 msgstr ""
 
-#: route_time_axis.cc:640
+#: route_time_axis.cc:657
 msgid "Layers"
 msgstr ""
 
-#: route_time_axis.cc:709
+#: route_time_axis.cc:721
 msgid "Automatic (based on I/O connections)"
 msgstr ""
 
-#: route_time_axis.cc:718
+#: route_time_axis.cc:730
 msgid "(Currently: Existing Material)"
 msgstr ""
 
-#: route_time_axis.cc:721
+#: route_time_axis.cc:733
 msgid "(Currently: Capture Time)"
 msgstr ""
 
-#: route_time_axis.cc:729
+#: route_time_axis.cc:741
 msgid "Align With Existing Material"
 msgstr ""
 
-#: route_time_axis.cc:734
+#: route_time_axis.cc:746
 msgid "Align With Capture Time"
 msgstr ""
 
-#: route_time_axis.cc:739
+#: route_time_axis.cc:751
 msgid "Alignment"
 msgstr "Alinhamento"
 
-#: route_time_axis.cc:774
+#: route_time_axis.cc:786
 msgid "Normal Mode"
 msgstr ""
 
-#: route_time_axis.cc:780
+#: route_time_axis.cc:792
 msgid "Tape Mode"
 msgstr ""
 
-#: route_time_axis.cc:786
+#: route_time_axis.cc:798
 msgid "Non-Layered Mode"
 msgstr ""
 
-#: route_time_axis.cc:792
+#: route_time_axis.cc:804
 msgid "Record Mode"
 msgstr ""
 
-#: route_time_axis.cc:799 route_time_axis.cc:1789
+#: route_time_axis.cc:809 route_time_axis.cc:1795
 msgid "Playlist"
 msgstr "Lista de reprodução"
 
-#: route_time_axis.cc:1097
+#: route_time_axis.cc:1107
 msgid "Rename Playlist"
 msgstr ""
 
-#: route_time_axis.cc:1098
+#: route_time_axis.cc:1108
 msgid "New name for playlist:"
 msgstr ""
 
-#: route_time_axis.cc:1183
+#: route_time_axis.cc:1193
 msgid "New Copy Playlist"
 msgstr ""
 
-#: route_time_axis.cc:1184 route_time_axis.cc:1237
+#: route_time_axis.cc:1194 route_time_axis.cc:1247
 msgid "Name for new playlist:"
 msgstr ""
 
-#: route_time_axis.cc:1236
+#: route_time_axis.cc:1246
 msgid "New Playlist"
 msgstr ""
 
-#: route_time_axis.cc:1436
-msgid "You cannot create a track with that name as it is reserved for %1"
+#: route_time_axis.cc:1441
+msgid "The name \"%1\" is reserved for %2"
 msgstr ""
 
-#: route_time_axis.cc:1678
+#: route_time_axis.cc:1684
 msgid "New Copy..."
 msgstr ""
 
-#: route_time_axis.cc:1682
+#: route_time_axis.cc:1688
 msgid "New Take"
 msgstr ""
 
-#: route_time_axis.cc:1683
+#: route_time_axis.cc:1689
 msgid "Copy Take"
 msgstr ""
 
-#: route_time_axis.cc:1688
+#: route_time_axis.cc:1694
 msgid "Clear Current"
 msgstr "Apagar actual"
 
-#: route_time_axis.cc:1691
-msgid "Select From All..."
+#: route_time_axis.cc:1697
+msgid "Select from All..."
 msgstr ""
 
-#: route_time_axis.cc:1779
+#: route_time_axis.cc:1785
 msgid "Take: %1.%2"
 msgstr ""
 
-#: route_time_axis.cc:2169 selection.cc:1007 selection.cc:1061
+#: route_time_axis.cc:2190 selection.cc:1042 selection.cc:1096
 msgid "programming error: "
 msgstr ""
 
-#: route_time_axis.cc:2585
+#: route_time_axis.cc:2614
 msgid "Underlays"
 msgstr ""
 
-#: route_time_axis.cc:2588
+#: route_time_axis.cc:2617
 msgid "Remove \"%1\""
 msgstr ""
 
-#: route_time_axis.cc:2638 route_time_axis.cc:2675
+#: route_time_axis.cc:2667 route_time_axis.cc:2704
 msgid "programming error: underlay reference pointer pairs are inconsistent!"
 msgstr ""
 
-#: route_time_axis.cc:2702
+#: route_time_axis.cc:2731 vca_master_strip.cc:203 vca_time_axis.cc:228
 msgid "After-fade listen (AFL)"
 msgstr ""
 
-#: route_time_axis.cc:2706
+#: route_time_axis.cc:2735 vca_master_strip.cc:207 vca_time_axis.cc:232
 msgid "Pre-fade listen (PFL)"
 msgstr ""
 
-#: route_ui.cc:140
+#: route_ui.cc:165
 msgid "Mute this track"
 msgstr ""
 
-#: route_ui.cc:144
+#: route_ui.cc:169
 msgid "Mute other (non-soloed) tracks"
 msgstr ""
 
-#: route_ui.cc:150
+#: route_ui.cc:175
 msgid "Enable recording on this track"
 msgstr ""
 
-#: route_ui.cc:158
+#: route_ui.cc:183
 msgid "make mixer strips show sends to this bus"
 msgstr ""
 
-#: route_ui.cc:163
+#: route_ui.cc:188
 msgid "Monitor input"
 msgstr ""
 
-#: route_ui.cc:169
+#: route_ui.cc:194
 msgid "Monitor playback"
 msgstr ""
 
-#: route_ui.cc:676
+#: route_ui.cc:706
 msgid "Not connected to AudioEngine - cannot engage record"
 msgstr ""
 
-#: route_ui.cc:875
+#: route_ui.cc:883
+msgid "Rec-Safe"
+msgstr ""
+
+#: route_ui.cc:888
 msgid "Step Entry"
 msgstr ""
 
-#: route_ui.cc:948
+#: route_ui.cc:987
 msgid "Assign all tracks (prefader)"
 msgstr ""
 
-#: route_ui.cc:952
+#: route_ui.cc:991
 msgid "Assign all tracks and buses (prefader)"
 msgstr ""
 
-#: route_ui.cc:956
+#: route_ui.cc:995
 msgid "Assign all tracks (postfader)"
 msgstr ""
 
-#: route_ui.cc:960
+#: route_ui.cc:999
 msgid "Assign all tracks and buses (postfader)"
 msgstr ""
 
-#: route_ui.cc:964
+#: route_ui.cc:1003
 msgid "Assign selected tracks (prefader)"
 msgstr ""
 
-#: route_ui.cc:968
+#: route_ui.cc:1007
 msgid "Assign selected tracks and buses (prefader)"
 msgstr ""
 
-#: route_ui.cc:971
+#: route_ui.cc:1010
 msgid "Assign selected tracks (postfader)"
 msgstr ""
 
-#: route_ui.cc:975
+#: route_ui.cc:1014
 msgid "Assign selected tracks and buses (postfader)"
 msgstr ""
 
-#: route_ui.cc:978
+#: route_ui.cc:1017
 msgid "Copy track/bus gains to sends"
 msgstr ""
 
-#: route_ui.cc:979
+#: route_ui.cc:1018
 msgid "Set sends gain to -inf"
 msgstr ""
 
-#: route_ui.cc:980
+#: route_ui.cc:1019
 msgid "Set sends gain to 0dB"
 msgstr ""
 
-#: route_ui.cc:1300
+#: route_ui.cc:1357
 msgid "Solo Isolate"
 msgstr ""
 
-#: route_ui.cc:1307
+#: route_ui.cc:1364
 msgid "Solo Safe"
 msgstr ""
 
-#: route_ui.cc:1329
+#: route_ui.cc:1386
 msgid "Pre Fader Sends"
 msgstr ""
 
-#: route_ui.cc:1335
+#: route_ui.cc:1392
 msgid "Post Fader Sends"
 msgstr ""
 
-#: route_ui.cc:1341
+#: route_ui.cc:1398
 msgid "Control Outs"
 msgstr "Saídas de controlo"
 
-#: route_ui.cc:1347
+#: route_ui.cc:1404
 msgid "Main Outs"
 msgstr "Saídas principais"
 
-#: route_ui.cc:1479
+#: route_ui.cc:1571
 msgid "Color Selection"
 msgstr ""
 
-#: route_ui.cc:1564
-msgid ""
-"Do you really want to remove track \"%1\" ?\n"
-"\n"
-"You may also lose the playlist used by this track.\n"
-"\n"
-"(This action cannot be undone, and the session file will be overwritten)"
-msgstr ""
-
-#: route_ui.cc:1566
-msgid ""
-"Do you really want to remove bus \"%1\" ?\n"
-"\n"
-"(This action cannot be undone, and the session file will be overwritten)"
-msgstr ""
-
-#: route_ui.cc:1574
-msgid "Remove track"
-msgstr ""
-
-#: route_ui.cc:1576
-msgid "Remove bus"
-msgstr ""
-
-#: route_ui.cc:1604
+#: route_ui.cc:1613
 msgid ""
 "The use of colons (':') is discouraged in track and bus names.\n"
 "Do you want to use this new name?"
 msgstr ""
 
-#: route_ui.cc:1608
+#: route_ui.cc:1617
 msgid "Use the new name"
 msgstr ""
 
-#: route_ui.cc:1609
+#: route_ui.cc:1618
 msgid "Re-edit the name"
 msgstr ""
 
-#: route_ui.cc:1622
+#: route_ui.cc:1631
 msgid "Rename Track"
 msgstr "Renomear faixa"
 
-#: route_ui.cc:1624
+#: route_ui.cc:1633
 msgid "Rename Bus"
 msgstr ""
 
-#: route_ui.cc:1692
+#: route_ui.cc:1693
 msgid ": comment editor"
 msgstr ": editor de comentários"
 
-#: route_ui.cc:1858
+#: route_ui.cc:1848
 msgid " latency"
 msgstr ""
 
-#: route_ui.cc:1871
+#: route_ui.cc:1888
 msgid "Cannot create route template directory %1"
 msgstr ""
 
-#: route_ui.cc:1877
+#: route_ui.cc:1894
 msgid "Save As Template"
 msgstr ""
 
-#: route_ui.cc:1878
+#: route_ui.cc:1895
 msgid "Template name:"
 msgstr ""
 
-#: route_ui.cc:1959
-msgid "Remote Control ID"
-msgstr "ID controlo remoto"
+#: route_ui.cc:2019
+msgid ""
+"Left-click to invert polarity of channel %1 of this track. Right-click to "
+"show menu."
+msgstr ""
 
-#: route_ui.cc:1969
-msgid "Remote control ID:"
+#: route_ui.cc:2021
+msgid "Click to show a menu of channels to invert polarity"
 msgstr ""
 
-#: route_ui.cc:1983
-msgid ""
-"The remote control ID of %1 is: %2\n"
-"\n"
-"\n"
-"The remote control ID of %3 cannot be changed."
+#: save_as_dialog.cc:34
+msgid "Switch to newly-saved version"
 msgstr ""
 
-#: route_ui.cc:1987
-msgid "the master bus"
+#: save_as_dialog.cc:35
+msgid "Copy media to new session"
 msgstr ""
 
-#: route_ui.cc:1987
-msgid "the monitor bus"
+#: save_as_dialog.cc:36
+msgid "Copy external media into new session"
 msgstr ""
 
-#: route_ui.cc:1989
-msgid ""
-"The remote control ID of %5 is: %2\n"
-"\n"
-"\n"
-"Remote Control IDs are currently determined by track/bus ordering in %6.\n"
-"\n"
-"%3Use the User Interaction tab of the Preferences window if you want to "
-"change this%4"
+#: save_as_dialog.cc:37
+msgid "Newly-saved session should be empty"
 msgstr ""
 
-#: route_ui.cc:2046
-msgid ""
-"Left-click to invert (phase reverse) channel %1 of this track.  Right-click "
-"to show menu."
+#: save_as_dialog.cc:48
+msgid "Save as session name"
 msgstr ""
 
-#: route_ui.cc:2048
-msgid "Click to show a menu of channels for inversion (phase reverse)"
+#: save_as_dialog.cc:55
+msgid "Parent directory/folder"
 msgstr ""
 
 #: search_path_option.cc:35
@@ -10316,126 +12318,158 @@ msgstr ""
 msgid "the session folder"
 msgstr ""
 
+#: script_selector.cc:43
+msgid "<b>Type:</b>"
+msgstr ""
+
+#: script_selector.cc:49
+msgid "<b>Author:</b>"
+msgstr ""
+
+#: script_selector.cc:55
+msgid "<b>Description:</b>"
+msgstr ""
+
+#: script_selector.cc:131
+msgid "Select Script to unload"
+msgstr ""
+
+#: script_selector.cc:165
+msgid "<b>Name:</b>"
+msgstr ""
+
+#: script_selector.cc:172
+msgid "<b>Instance Parameters</b>"
+msgstr ""
+
 #: send_ui.cc:134
 msgid "Send "
 msgstr ""
 
-#: session_dialog.cc:61
+#: session_dialog.cc:71
 msgid "Session Setup"
 msgstr ""
 
-#: session_dialog.cc:66
+#: session_dialog.cc:76
 msgid "Advanced options ..."
 msgstr ""
 
-#: session_dialog.cc:263
-msgid "New Session"
-msgstr "Nova sessão"
+#: session_dialog.cc:163 session_dialog.cc:397
+msgid "Recent Sessions"
+msgstr "Sessões recentes"
 
-#: session_dialog.cc:301
-msgid "Check the website for more..."
+#: session_dialog.cc:311
+msgid "Sample Rate"
 msgstr ""
 
-#: session_dialog.cc:304
-msgid "Click to open the program website in your web browser"
+#: session_dialog.cc:312
+msgid "File Resolution"
 msgstr ""
 
-#: session_dialog.cc:324
-msgid "Sample Rate"
+#: session_dialog.cc:313
+msgid "Last Modified"
+msgstr ""
+
+#: session_dialog.cc:338
+msgid "New Session"
+msgstr "Nova sessão"
+
+#: session_dialog.cc:379
+msgid "Check the website for more..."
 msgstr ""
 
-#: session_dialog.cc:325
-msgid "Disk Format"
+#: session_dialog.cc:382
+msgid "Click to open the program website in your web browser"
 msgstr ""
 
-#: session_dialog.cc:343
+#: session_dialog.cc:404
 msgid "Select session file"
 msgstr ""
 
-#: session_dialog.cc:358
+#: session_dialog.cc:417
 msgid "Other Sessions"
 msgstr ""
 
-#: session_dialog.cc:384
+#: session_dialog.cc:424
+msgid "Safe Mode: Disable all Plugins"
+msgstr ""
+
+#: session_dialog.cc:454
 msgid "Open"
 msgstr ""
 
-#: session_dialog.cc:451
+#: session_dialog.cc:521
 msgid "Session name:"
 msgstr ""
 
-#: session_dialog.cc:473
+#: session_dialog.cc:543
 msgid "Create session folder in:"
 msgstr ""
 
-#: session_dialog.cc:496
+#: session_dialog.cc:564
 msgid "Select folder for session"
 msgstr ""
 
-#: session_dialog.cc:525
+#: session_dialog.cc:591
 msgid "Use this template"
 msgstr ""
 
-#: session_dialog.cc:528
+#: session_dialog.cc:594
 msgid "no template"
 msgstr ""
 
-#: session_dialog.cc:663 session_dialog.cc:699
-msgid "32 bit float"
+#: session_dialog.cc:746 session_dialog.cc:793
+msgid "32-bit float"
 msgstr ""
 
-#: session_dialog.cc:666 session_dialog.cc:702
-msgid "24 bit"
+#: session_dialog.cc:749 session_dialog.cc:796
+msgid "24-bit"
 msgstr ""
 
-#: session_dialog.cc:669 session_dialog.cc:705
-msgid "16 bit"
+#: session_dialog.cc:752 session_dialog.cc:799
+msgid "16-bit"
 msgstr ""
 
-#: session_dialog.cc:747 session_dialog.cc:748 session_dialog.cc:749
+#: session_dialog.cc:877 session_dialog.cc:878 session_dialog.cc:879
 msgid "channels"
 msgstr "canais"
 
-#: session_dialog.cc:763
+#: session_dialog.cc:893
 msgid "<b>Busses</b>"
 msgstr ""
 
-#: session_dialog.cc:764
+#: session_dialog.cc:894
 msgid "<b>Inputs</b>"
 msgstr ""
 
-#: session_dialog.cc:765
+#: session_dialog.cc:895
 msgid "<b>Outputs</b>"
 msgstr ""
 
-#: session_dialog.cc:773
+#: session_dialog.cc:903
 msgid "Create master bus"
 msgstr ""
 
-#: session_dialog.cc:783
+#: session_dialog.cc:913
 msgid "Automatically connect to physical inputs"
 msgstr ""
 
-#: session_dialog.cc:790 session_dialog.cc:849
+#: session_dialog.cc:920 session_dialog.cc:979
 msgid "Use only"
 msgstr ""
 
-#: session_dialog.cc:843
+#: session_dialog.cc:973
 msgid "Automatically connect outputs"
 msgstr ""
 
-#: session_dialog.cc:865
+#: session_dialog.cc:995
 msgid "... to master bus"
 msgstr ""
 
-#: session_dialog.cc:875
+#: session_dialog.cc:1005
 msgid "... to physical outputs"
 msgstr ""
 
-#: session_import_dialog.cc:65
-msgid "Import from Session"
-msgstr ""
-
 #: session_import_dialog.cc:74
 msgid "Elements"
 msgstr ""
@@ -10456,197 +12490,197 @@ msgstr ""
 msgid "This will select all elements of this type!"
 msgstr ""
 
-#: session_metadata_dialog.cc:285
+#: session_metadata_dialog.cc:288
 msgid "EAN Check digit OK"
 msgstr ""
 
-#: session_metadata_dialog.cc:289
+#: session_metadata_dialog.cc:292
 msgid "EAN Check digit error"
 msgstr ""
 
-#: session_metadata_dialog.cc:289
+#: session_metadata_dialog.cc:292
 msgid "expected"
 msgstr ""
 
-#: session_metadata_dialog.cc:294
+#: session_metadata_dialog.cc:297
 msgid "EAN Length error"
 msgstr ""
 
-#: session_metadata_dialog.cc:423
+#: session_metadata_dialog.cc:426
 msgid "Field"
 msgstr "Campo"
 
-#: session_metadata_dialog.cc:427
+#: session_metadata_dialog.cc:430
 msgid "Values (current value on top)"
 msgstr ""
 
-#: session_metadata_dialog.cc:641
+#: session_metadata_dialog.cc:644
 msgid "User"
 msgstr ""
 
-#: session_metadata_dialog.cc:649
+#: session_metadata_dialog.cc:652
 msgid "Email"
 msgstr ""
 
-#: session_metadata_dialog.cc:652
+#: session_metadata_dialog.cc:655
 msgid "Web"
 msgstr ""
 
-#: session_metadata_dialog.cc:655
+#: session_metadata_dialog.cc:658
 msgid "Organization"
 msgstr ""
 
-#: session_metadata_dialog.cc:658
+#: session_metadata_dialog.cc:661
 msgid "Country"
 msgstr ""
 
-#: session_metadata_dialog.cc:672
+#: session_metadata_dialog.cc:675
 msgid "Title"
 msgstr ""
 
-#: session_metadata_dialog.cc:675
+#: session_metadata_dialog.cc:678
 msgid "Track Number"
 msgstr ""
 
-#: session_metadata_dialog.cc:678
+#: session_metadata_dialog.cc:681
 msgid "Subtitle"
 msgstr ""
 
-#: session_metadata_dialog.cc:681
+#: session_metadata_dialog.cc:684
 msgid "Grouping"
 msgstr ""
 
-#: session_metadata_dialog.cc:684
+#: session_metadata_dialog.cc:687
 msgid "Artist"
 msgstr ""
 
-#: session_metadata_dialog.cc:687
+#: session_metadata_dialog.cc:690
 msgid "Genre"
 msgstr ""
 
-#: session_metadata_dialog.cc:690
+#: session_metadata_dialog.cc:693
 msgid "Comment"
 msgstr ""
 
-#: session_metadata_dialog.cc:693
+#: session_metadata_dialog.cc:696
 msgid "Copyright"
 msgstr ""
 
-#: session_metadata_dialog.cc:701 session_metadata_dialog.cc:706
+#: session_metadata_dialog.cc:704 session_metadata_dialog.cc:709
 msgid "Album"
 msgstr ""
 
-#: session_metadata_dialog.cc:709
+#: session_metadata_dialog.cc:712
 msgid "Year"
 msgstr ""
 
-#: session_metadata_dialog.cc:712
+#: session_metadata_dialog.cc:715
 msgid "Album Artist"
 msgstr ""
 
-#: session_metadata_dialog.cc:715
+#: session_metadata_dialog.cc:718
 msgid "Total Tracks"
 msgstr ""
 
-#: session_metadata_dialog.cc:718
+#: session_metadata_dialog.cc:721
 msgid "Disc Subtitle"
 msgstr ""
 
-#: session_metadata_dialog.cc:721
+#: session_metadata_dialog.cc:724
 msgid "Disc Number"
 msgstr ""
 
-#: session_metadata_dialog.cc:724
+#: session_metadata_dialog.cc:727
 msgid "Total Discs"
 msgstr ""
 
-#: session_metadata_dialog.cc:727
+#: session_metadata_dialog.cc:730
 msgid "Compilation"
 msgstr ""
 
-#: session_metadata_dialog.cc:730
+#: session_metadata_dialog.cc:733
 msgid "ISRC"
 msgstr ""
 
-#: session_metadata_dialog.cc:733
+#: session_metadata_dialog.cc:736
 msgid "EAN barcode"
 msgstr ""
 
-#: session_metadata_dialog.cc:746
+#: session_metadata_dialog.cc:749
 msgid "People"
 msgstr ""
 
-#: session_metadata_dialog.cc:751
+#: session_metadata_dialog.cc:754
 msgid "Lyricist"
 msgstr ""
 
-#: session_metadata_dialog.cc:754
+#: session_metadata_dialog.cc:757
 msgid "Composer"
 msgstr ""
 
-#: session_metadata_dialog.cc:757
+#: session_metadata_dialog.cc:760
 msgid "Conductor"
 msgstr ""
 
-#: session_metadata_dialog.cc:760
+#: session_metadata_dialog.cc:763
 msgid "Remixer"
 msgstr ""
 
-#: session_metadata_dialog.cc:763
+#: session_metadata_dialog.cc:766
 msgid "Arranger"
 msgstr ""
 
-#: session_metadata_dialog.cc:766
+#: session_metadata_dialog.cc:769
 msgid "Engineer"
 msgstr ""
 
-#: session_metadata_dialog.cc:769
+#: session_metadata_dialog.cc:772
 msgid "Producer"
 msgstr ""
 
-#: session_metadata_dialog.cc:772
+#: session_metadata_dialog.cc:775
 msgid "DJ Mixer"
 msgstr ""
 
-#: session_metadata_dialog.cc:775
+#: session_metadata_dialog.cc:778
 msgid "Metadata|Mixer"
 msgstr ""
 
-#: session_metadata_dialog.cc:783
+#: session_metadata_dialog.cc:786
 msgid "School"
 msgstr ""
 
-#: session_metadata_dialog.cc:788
+#: session_metadata_dialog.cc:791
 msgid "Instructor"
 msgstr ""
 
-#: session_metadata_dialog.cc:791
+#: session_metadata_dialog.cc:794
 msgid "Course"
 msgstr ""
 
-#: session_metadata_dialog.cc:799
+#: session_metadata_dialog.cc:802
 msgid "Edit Session Metadata"
 msgstr ""
 
-#: session_metadata_dialog.cc:830
+#: session_metadata_dialog.cc:833
 msgid "Import session metadata"
 msgstr ""
 
-#: session_metadata_dialog.cc:851
+#: session_metadata_dialog.cc:854
 msgid "Choose session to import metadata from"
 msgstr ""
 
-#: session_metadata_dialog.cc:889
+#: session_metadata_dialog.cc:892
 msgid "This session file could not be read!"
 msgstr ""
 
-#: session_metadata_dialog.cc:899
+#: session_metadata_dialog.cc:902
 msgid ""
 "The session file didn't contain metadata!\n"
 "Maybe this is an old session format?"
 msgstr ""
 
-#: session_metadata_dialog.cc:918
+#: session_metadata_dialog.cc:921
 msgid "Import all from:"
 msgstr ""
 
@@ -10793,209 +12827,230 @@ msgid "Destructive crossfade length"
 msgstr ""
 
 #: session_option_editor.cc:146
-msgid "Region fades active"
+msgid "Declick when transport starts and stops"
 msgstr ""
 
 #: session_option_editor.cc:153
+msgid "Declick when monitor state changes"
+msgstr ""
+
+#: session_option_editor.cc:160
+msgid "Region fades active"
+msgstr ""
+
+#: session_option_editor.cc:167
 msgid "Region fades visible"
 msgstr ""
 
-#: session_option_editor.cc:160 session_option_editor.cc:173
-#: session_option_editor.cc:187
+#: session_option_editor.cc:174 session_option_editor.cc:187
+#: session_option_editor.cc:208
 msgid "Media"
 msgstr ""
 
-#: session_option_editor.cc:160
+#: session_option_editor.cc:174
 msgid "Audio file format"
 msgstr ""
 
-#: session_option_editor.cc:164
+#: session_option_editor.cc:178
 msgid "Sample format"
 msgstr ""
 
-#: session_option_editor.cc:169
+#: session_option_editor.cc:183
 msgid "32-bit floating point"
 msgstr ""
 
-#: session_option_editor.cc:170
+#: session_option_editor.cc:184
 msgid "24-bit integer"
 msgstr ""
 
-#: session_option_editor.cc:171
+#: session_option_editor.cc:185
 msgid "16-bit integer"
 msgstr ""
 
-#: session_option_editor.cc:177
+#: session_option_editor.cc:191
 msgid "File type"
 msgstr ""
 
-#: session_option_editor.cc:182
-msgid "Broadcast WAVE"
+#: session_option_editor.cc:196
+msgid "Broadcast WAVE (4GB size limit)"
 msgstr ""
 
-#: session_option_editor.cc:183
-msgid "WAVE"
+#: session_option_editor.cc:198
+msgid "Broadcast RF64"
 msgstr ""
 
-#: session_option_editor.cc:184
+#: session_option_editor.cc:200
+msgid "WAVE (4GB size limit)"
+msgstr ""
+
+#: session_option_editor.cc:201
 msgid "WAVE-64"
 msgstr ""
 
-#: session_option_editor.cc:189
+#: session_option_editor.cc:205
+msgid "RF64 (WAV compatible)"
+msgstr ""
+
+#: session_option_editor.cc:210 session_option_editor.cc:216
+#: session_option_editor.cc:223
+msgid "Files|Locations"
+msgstr ""
+
+#: session_option_editor.cc:210
 msgid "File locations"
 msgstr ""
 
-#: session_option_editor.cc:191
+#: session_option_editor.cc:212
 msgid "Search for audio files in:"
 msgstr ""
 
-#: session_option_editor.cc:197
+#: session_option_editor.cc:218
 msgid "Search for MIDI files in:"
 msgstr ""
 
-#: session_option_editor.cc:206 session_option_editor.cc:218
-#: session_option_editor.cc:228 session_option_editor.cc:239
+#: session_option_editor.cc:227 session_option_editor.cc:239
+#: session_option_editor.cc:249 session_option_editor.cc:260
 msgid "Filenames"
 msgstr ""
 
-#: session_option_editor.cc:206
+#: session_option_editor.cc:227
 msgid "File Naming"
 msgstr ""
 
-#: session_option_editor.cc:212
+#: session_option_editor.cc:233
 msgid "Prefix Track number"
 msgstr ""
 
-#: session_option_editor.cc:217
+#: session_option_editor.cc:238
 msgid ""
 "Adds the current track number to the beginning of the recorded file name."
 msgstr ""
 
-#: session_option_editor.cc:222
+#: session_option_editor.cc:243
 msgid "Prefix Take Name"
 msgstr ""
 
-#: session_option_editor.cc:227
+#: session_option_editor.cc:248
 msgid "Adds the Take Name to the beginning of the recorded file name."
 msgstr ""
 
-#: session_option_editor.cc:232
+#: session_option_editor.cc:253
 msgid "Take Name"
 msgstr ""
 
-#: session_option_editor.cc:245
+#: session_option_editor.cc:266
 msgid ""
 "Track Input Monitoring automatically follows transport state (\"auto-input\")"
 msgstr ""
 
-#: session_option_editor.cc:252
+#: session_option_editor.cc:273
 msgid "Use monitor section in this session"
 msgstr ""
 
-#: session_option_editor.cc:257 session_option_editor.cc:259
-#: session_option_editor.cc:266 session_option_editor.cc:273
-#: session_option_editor.cc:280 session_option_editor.cc:282
-#: session_option_editor.cc:289 session_option_editor.cc:296
-#: session_option_editor.cc:303 session_option_editor.cc:310
-#: session_option_editor.cc:312
+#: session_option_editor.cc:278 session_option_editor.cc:280
+#: session_option_editor.cc:287 session_option_editor.cc:294
+#: session_option_editor.cc:301 session_option_editor.cc:303
+#: session_option_editor.cc:310 session_option_editor.cc:317
+#: session_option_editor.cc:324 session_option_editor.cc:331
+#: session_option_editor.cc:333
 msgid "Meterbridge"
 msgstr ""
 
-#: session_option_editor.cc:257
+#: session_option_editor.cc:278
 msgid "Route Display"
 msgstr ""
 
-#: session_option_editor.cc:261
+#: session_option_editor.cc:282
 msgid "Show Midi Tracks"
 msgstr ""
 
-#: session_option_editor.cc:268
+#: session_option_editor.cc:289
 msgid "Show Busses"
 msgstr ""
 
-#: session_option_editor.cc:275
+#: session_option_editor.cc:296
 msgid "Include Master Bus"
 msgstr ""
 
-#: session_option_editor.cc:280
+#: session_option_editor.cc:301
 msgid "Button Area"
 msgstr ""
 
-#: session_option_editor.cc:284
+#: session_option_editor.cc:305
 msgid "Rec-enable Button"
 msgstr ""
 
-#: session_option_editor.cc:291
+#: session_option_editor.cc:312
 msgid "Mute Button"
 msgstr ""
 
-#: session_option_editor.cc:298
+#: session_option_editor.cc:319
 msgid "Solo Button"
 msgstr ""
 
-#: session_option_editor.cc:305
+#: session_option_editor.cc:326
 msgid "Monitor Buttons"
 msgstr ""
 
-#: session_option_editor.cc:310
+#: session_option_editor.cc:331
 msgid "Name Labels"
 msgstr ""
 
-#: session_option_editor.cc:314
+#: session_option_editor.cc:335
 msgid "Track Name"
 msgstr ""
 
-#: session_option_editor.cc:325
+#: session_option_editor.cc:346
 msgid "MIDI region copies are independent"
 msgstr ""
 
-#: session_option_editor.cc:332
+#: session_option_editor.cc:353
 msgid ""
 "Policy for handling overlapping notes\n"
 " on the same MIDI channel"
 msgstr ""
 
-#: session_option_editor.cc:337
+#: session_option_editor.cc:358
 msgid "never allow them"
 msgstr ""
 
-#: session_option_editor.cc:338
+#: session_option_editor.cc:359
 msgid "don't do anything in particular"
 msgstr ""
 
-#: session_option_editor.cc:339
+#: session_option_editor.cc:360
 msgid "replace any overlapped existing note"
 msgstr ""
 
-#: session_option_editor.cc:340
+#: session_option_editor.cc:361
 msgid "shorten the overlapped existing note"
 msgstr ""
 
-#: session_option_editor.cc:341
+#: session_option_editor.cc:362
 msgid "shorten the overlapping new note"
 msgstr ""
 
-#: session_option_editor.cc:342
+#: session_option_editor.cc:363
 msgid "replace both overlapping notes with a single note"
 msgstr ""
 
-#: session_option_editor.cc:346
+#: session_option_editor.cc:367
 msgid "Glue to bars and beats"
 msgstr ""
 
-#: session_option_editor.cc:350
+#: session_option_editor.cc:371
 msgid "Glue new markers to bars and beats"
 msgstr ""
 
-#: session_option_editor.cc:357
+#: session_option_editor.cc:378
 msgid "Glue new regions to bars and beats"
 msgstr ""
 
-#: session_option_editor.cc:362
+#: session_option_editor.cc:383
 msgid "Defaults"
 msgstr ""
 
-#: session_option_editor.cc:364
+#: session_option_editor.cc:385
 msgid "Use these settings as defaults"
 msgstr ""
 
@@ -11031,26 +13086,14 @@ msgstr ""
 msgid "Timestamp:"
 msgstr ""
 
-#: sfdb_ui.cc:149
-msgid "Format:"
-msgstr ""
-
-#: sfdb_ui.cc:188 sfdb_ui.cc:653
+#: sfdb_ui.cc:188 sfdb_ui.cc:659
 msgid "Tags:"
 msgstr ""
 
-#: sfdb_ui.cc:293 sfdb_ui.cc:409
-msgid "Could not read file: %1 (%2)."
-msgstr "Não foi possível ler o ficheiro: %1 (%2)."
-
 #: sfdb_ui.cc:297
 msgid "<b>Midi File Information</b>"
 msgstr ""
 
-#: sfdb_ui.cc:458
-msgid "Could not access soundfile: "
-msgstr "Não foi possível aceder ao ficheiros audio: "
-
 #: sfdb_ui.cc:530
 msgid "SoundFileBox: Could not tokenize string: "
 msgstr ""
@@ -11059,284 +13102,280 @@ msgstr ""
 msgid "Search"
 msgstr ""
 
-#: sfdb_ui.cc:576
+#: sfdb_ui.cc:581
 msgid "Audio and MIDI files"
 msgstr ""
 
-#: sfdb_ui.cc:579
+#: sfdb_ui.cc:584
 msgid "Audio files"
 msgstr ""
 
-#: sfdb_ui.cc:582
+#: sfdb_ui.cc:587
 msgid "MIDI files"
 msgstr ""
 
-#: sfdb_ui.cc:585 add_video_dialog.cc:123
+#: sfdb_ui.cc:590 add_video_dialog.cc:123
 msgid "All files"
 msgstr ""
 
-#: sfdb_ui.cc:604 add_video_dialog.cc:246
+#: sfdb_ui.cc:609 add_video_dialog.cc:246
 msgid "Browse Files"
 msgstr ""
 
-#: sfdb_ui.cc:633
+#: sfdb_ui.cc:638
 msgid "Paths"
 msgstr "Directórios"
 
-#: sfdb_ui.cc:642
+#: sfdb_ui.cc:647
 msgid "Search Tags"
 msgstr ""
 
-#: sfdb_ui.cc:658
+#: sfdb_ui.cc:664
 msgid "Sort:"
 msgstr ""
 
-#: sfdb_ui.cc:666
+#: sfdb_ui.cc:672
 msgid "Longest"
 msgstr ""
 
-#: sfdb_ui.cc:667
+#: sfdb_ui.cc:673
 msgid "Shortest"
 msgstr ""
 
-#: sfdb_ui.cc:668
+#: sfdb_ui.cc:674
 msgid "Newest"
 msgstr ""
 
-#: sfdb_ui.cc:669
+#: sfdb_ui.cc:675
 msgid "Oldest"
 msgstr ""
 
-#: sfdb_ui.cc:670
+#: sfdb_ui.cc:676
 msgid "Most downloaded"
 msgstr ""
 
-#: sfdb_ui.cc:671
+#: sfdb_ui.cc:677
 msgid "Least downloaded"
 msgstr ""
 
-#: sfdb_ui.cc:672
+#: sfdb_ui.cc:678
 msgid "Highest rated"
 msgstr ""
 
-#: sfdb_ui.cc:673
+#: sfdb_ui.cc:679
 msgid "Lowest rated"
 msgstr ""
 
-#: sfdb_ui.cc:678
+#: sfdb_ui.cc:684
 msgid "More"
 msgstr ""
 
-#: sfdb_ui.cc:682
+#: sfdb_ui.cc:688
 msgid "Similar"
 msgstr ""
 
-#: sfdb_ui.cc:694
+#: sfdb_ui.cc:700
 msgid "ID"
 msgstr ""
 
-#: sfdb_ui.cc:695 add_video_dialog.cc:83
+#: sfdb_ui.cc:701 add_video_dialog.cc:83
 msgid "Filename"
 msgstr ""
 
-#: sfdb_ui.cc:697
+#: sfdb_ui.cc:703 time_fx_dialog.cc:154
 msgid "Duration"
 msgstr ""
 
-#: sfdb_ui.cc:698
+#: sfdb_ui.cc:704
 msgid "Size"
 msgstr ""
 
-#: sfdb_ui.cc:699
+#: sfdb_ui.cc:705
 msgid "Samplerate"
 msgstr ""
 
-#: sfdb_ui.cc:700
+#: sfdb_ui.cc:706
 msgid "License"
 msgstr ""
 
-#: sfdb_ui.cc:718
+#: sfdb_ui.cc:724
 msgid "Search Freesound"
 msgstr ""
 
-#: sfdb_ui.cc:738
-msgid "Press to import selected files and close this window"
-msgstr ""
-
-#: sfdb_ui.cc:739
-msgid "Press to import selected files and leave this window open"
+#: sfdb_ui.cc:741
+msgid "Press to import selected files"
 msgstr ""
 
-#: sfdb_ui.cc:740
+#: sfdb_ui.cc:742
 msgid "Press to close this window without importing any files"
 msgstr ""
 
-#: sfdb_ui.cc:936
+#: sfdb_ui.cc:937
 msgid "SoundFileBrowser: Could not tokenize string: "
 msgstr ""
 
-#: sfdb_ui.cc:1136
+#: sfdb_ui.cc:1137
 msgid "%1 more page of 100 results available"
 msgid_plural "%1 more pages of 100 results available"
 msgstr[0] ""
 msgstr[1] ""
 
-#: sfdb_ui.cc:1141
+#: sfdb_ui.cc:1142
 msgid "No more results available"
 msgstr ""
 
-#: sfdb_ui.cc:1205
+#: sfdb_ui.cc:1206
 msgid "B"
 msgstr ""
 
-#: sfdb_ui.cc:1207
+#: sfdb_ui.cc:1208
 msgid "kB"
 msgstr ""
 
-#: sfdb_ui.cc:1209 sfdb_ui.cc:1211
+#: sfdb_ui.cc:1210 sfdb_ui.cc:1212
 msgid "MB"
 msgstr ""
 
-#: sfdb_ui.cc:1213
+#: sfdb_ui.cc:1214
 msgid "GB"
 msgstr ""
 
-#: sfdb_ui.cc:1425 sfdb_ui.cc:1738 sfdb_ui.cc:1801 sfdb_ui.cc:1819
+#: sfdb_ui.cc:1431 sfdb_ui.cc:1728 sfdb_ui.cc:1764 sfdb_ui.cc:1782
 msgid "one track per file"
 msgstr ""
 
-#: sfdb_ui.cc:1428 sfdb_ui.cc:1802 sfdb_ui.cc:1820
+#: sfdb_ui.cc:1434 sfdb_ui.cc:1765 sfdb_ui.cc:1783
 msgid "one track per channel"
 msgstr ""
 
-#: sfdb_ui.cc:1436 sfdb_ui.cc:1804 sfdb_ui.cc:1821
+#: sfdb_ui.cc:1442 sfdb_ui.cc:1767 sfdb_ui.cc:1784
 msgid "sequence files"
 msgstr ""
 
-#: sfdb_ui.cc:1439 sfdb_ui.cc:1809
+#: sfdb_ui.cc:1445 sfdb_ui.cc:1772
 msgid "all files in one track"
 msgstr ""
 
-#: sfdb_ui.cc:1440 sfdb_ui.cc:1803
+#: sfdb_ui.cc:1446 sfdb_ui.cc:1766
 msgid "merge files"
 msgstr ""
 
-#: sfdb_ui.cc:1446 sfdb_ui.cc:1806
+#: sfdb_ui.cc:1452 sfdb_ui.cc:1769
 msgid "one region per file"
 msgstr ""
 
-#: sfdb_ui.cc:1449 sfdb_ui.cc:1807
+#: sfdb_ui.cc:1455 sfdb_ui.cc:1770
 msgid "one region per channel"
 msgstr ""
 
-#: sfdb_ui.cc:1454 sfdb_ui.cc:1808 sfdb_ui.cc:1822
+#: sfdb_ui.cc:1460 sfdb_ui.cc:1771 sfdb_ui.cc:1785
 msgid "all files in one region"
 msgstr ""
 
-#: sfdb_ui.cc:1521
+#: sfdb_ui.cc:1527
 msgid ""
 "One or more of the selected files\n"
 "cannot be used by %1"
 msgstr ""
 
-#: sfdb_ui.cc:1665
+#: sfdb_ui.cc:1671
 msgid "Copy files to session"
 msgstr ""
 
-#: sfdb_ui.cc:1682 sfdb_ui.cc:1859
+#: sfdb_ui.cc:1686 sfdb_ui.cc:1825
 msgid "file timestamp"
 msgstr ""
 
-#: sfdb_ui.cc:1683 sfdb_ui.cc:1861
+#: sfdb_ui.cc:1687 sfdb_ui.cc:1827
 msgid "edit point"
 msgstr ""
 
-#: sfdb_ui.cc:1684 sfdb_ui.cc:1863
+#: sfdb_ui.cc:1688 sfdb_ui.cc:1829
 msgid "playhead"
 msgstr ""
 
-#: sfdb_ui.cc:1685
+#: sfdb_ui.cc:1689
 msgid "session start"
 msgstr ""
 
-#: sfdb_ui.cc:1691
-msgid "<b>Add files as ...</b>"
+#: sfdb_ui.cc:1695
+msgid "<b>Add files ...</b>"
 msgstr ""
 
-#: sfdb_ui.cc:1713
+#: sfdb_ui.cc:1700
 msgid "<b>Insert at</b>"
 msgstr ""
 
-#: sfdb_ui.cc:1726
+#: sfdb_ui.cc:1705
 msgid "<b>Mapping</b>"
 msgstr ""
 
-#: sfdb_ui.cc:1744
+#: sfdb_ui.cc:1710
 msgid "<b>Conversion quality</b>"
 msgstr ""
 
-#: sfdb_ui.cc:1756
+#: sfdb_ui.cc:1715
 msgid "<b>Instrument</b>"
 msgstr ""
 
-#: sfdb_ui.cc:1768 sfdb_ui.cc:1875
+#: sfdb_ui.cc:1734 sfdb_ui.cc:1841
 msgid "Best"
 msgstr ""
 
-#: sfdb_ui.cc:1769 sfdb_ui.cc:1877
+#: sfdb_ui.cc:1735 sfdb_ui.cc:1843
 msgid "Good"
 msgstr ""
 
-#: sfdb_ui.cc:1770 sfdb_ui.cc:1879
+#: sfdb_ui.cc:1736 sfdb_ui.cc:1845
 msgid "Quick"
 msgstr ""
 
-#: sfdb_ui.cc:1772
+#: sfdb_ui.cc:1738
 msgid "Fastest"
 msgstr "Mais rápido"
 
-#: shuttle_control.cc:56
+#: shuttle_control.cc:64
 msgid "Shuttle speed control (Context-click for options)"
 msgstr ""
 
-#: shuttle_control.cc:174
+#: shuttle_control.cc:201 time_fx_dialog.cc:164
 msgid "Percent"
 msgstr ""
 
-#: shuttle_control.cc:182
+#: shuttle_control.cc:209
 msgid "Units"
 msgstr ""
 
-#: shuttle_control.cc:188 shuttle_control.cc:609
+#: shuttle_control.cc:215 shuttle_control.cc:671
 msgid "Sprung"
 msgstr "Salto"
 
-#: shuttle_control.cc:192 shuttle_control.cc:612
+#: shuttle_control.cc:219 shuttle_control.cc:674
 msgid "Wheel"
 msgstr "Roda"
 
-#: shuttle_control.cc:226
+#: shuttle_control.cc:253
 msgid "Maximum speed"
 msgstr "Velocidade máxima"
 
-#: shuttle_control.cc:568
+#: shuttle_control.cc:256
+msgid "Reset to 100%"
+msgstr ""
+
+#: shuttle_control.cc:633
 msgid "Playing"
 msgstr ""
 
-#: shuttle_control.cc:583
+#: shuttle_control.cc:648
 #, c-format
 msgid "<<< %+d semitones"
 msgstr ""
 
-#: shuttle_control.cc:585
+#: shuttle_control.cc:650
 #, c-format
 msgid ">>> %+d semitones"
 msgstr ""
 
-#: shuttle_control.cc:590
-msgid "Stopped"
-msgstr ""
-
 #: soundcloud_export_selector.cc:44
 msgid "User Email"
 msgstr ""
@@ -11361,7 +13400,7 @@ msgstr ""
 msgid "%1: %2 of %3 bytes uploaded"
 msgstr ""
 
-#: splash.cc:73
+#: splash.cc:78
 msgid "%1 loading ..."
 msgstr ""
 
@@ -11377,17 +13416,17 @@ msgstr ""
 msgid "Azimuth:"
 msgstr ""
 
-#: startup.cc:67
+#: startup.cc:71
 msgid ""
 "Use an external mixer or the hardware mixer of your audio interface.\n"
 "%1 will play NO role in monitoring"
 msgstr ""
 
-#: startup.cc:69
+#: startup.cc:73
 msgid "Ask %1 to play back material as it is being recorded"
 msgstr ""
 
-#: startup.cc:142
+#: startup.cc:146
 msgid ""
 "<span size=\"larger\">%1 is a digital audio workstation. You can use it to "
 "record, edit and mix multi-track audio. You can produce your own CDs, mix "
@@ -11397,15 +13436,15 @@ msgid ""
 "program.</span> "
 msgstr ""
 
-#: startup.cc:168
+#: startup.cc:172
 msgid "Welcome to %1"
 msgstr ""
 
-#: startup.cc:191
+#: startup.cc:195
 msgid "Default folder for %1 sessions"
 msgstr ""
 
-#: startup.cc:197
+#: startup.cc:201
 msgid ""
 "Each project that you work on with %1 has its own folder.\n"
 "These can require a lot of disk space if you are recording audio.\n"
@@ -11415,11 +13454,11 @@ msgid ""
 "<i>(You can put new sessions anywhere, this is just a default)</i>"
 msgstr ""
 
-#: startup.cc:220
+#: startup.cc:224
 msgid "Default folder for new sessions"
 msgstr ""
 
-#: startup.cc:241
+#: startup.cc:245
 msgid ""
 "While recording instruments or vocals, you probably want to listen to the\n"
 "signal as well as record it. This is called \"monitoring\". There are\n"
@@ -11433,31 +13472,31 @@ msgid ""
 "<i>If you do not understand what this is about, just accept the default.</i>"
 msgstr ""
 
-#: startup.cc:262
+#: startup.cc:266
 msgid "Monitoring Choices"
 msgstr ""
 
-#: startup.cc:285
+#: startup.cc:289
 msgid "Use a Master bus directly"
 msgstr ""
 
-#: startup.cc:287
+#: startup.cc:291
 msgid ""
 "Connect the Master bus directly to your hardware outputs. This is preferable "
 "for simple usage."
 msgstr ""
 
-#: startup.cc:296
+#: startup.cc:300
 msgid "Use an additional Monitor bus"
 msgstr ""
 
-#: startup.cc:299
+#: startup.cc:303
 msgid ""
 "Use a Monitor bus between Master bus and hardware outputs for \n"
 "greater control in monitoring without affecting the mix."
 msgstr ""
 
-#: startup.cc:321
+#: startup.cc:325
 msgid ""
 "<i>You can change this preference at any time via the Preferences dialog.\n"
 "You can also add or remove the monitor section to/from any session.</i>\n"
@@ -11465,46 +13504,42 @@ msgid ""
 "<i>If you do not understand what this is about, just accept the default.</i>"
 msgstr ""
 
-#: startup.cc:332
+#: startup.cc:336
 msgid "Monitor Section"
 msgstr ""
 
-#: step_entry.cc:60
+#: step_entry.cc:59
 msgid "Step Entry: %1"
 msgstr ""
 
-#: step_entry.cc:65
+#: step_entry.cc:64
 msgid ">beat"
 msgstr ""
 
-#: step_entry.cc:66
+#: step_entry.cc:65
 msgid ">bar"
 msgstr ""
 
-#: step_entry.cc:67
+#: step_entry.cc:66
 msgid ">EP"
 msgstr ""
 
-#: step_entry.cc:68
+#: step_entry.cc:67
 msgid "sustain"
 msgstr ""
 
-#: step_entry.cc:69
+#: step_entry.cc:68
 msgid "rest"
 msgstr ""
 
-#: step_entry.cc:70
+#: step_entry.cc:69
 msgid "g-rest"
 msgstr ""
 
-#: step_entry.cc:71
+#: step_entry.cc:70
 msgid "back"
 msgstr ""
 
-#: step_entry.cc:82 step_entry.cc:85
-msgid "+"
-msgstr ""
-
 #: step_entry.cc:191
 msgid "Set note length to a whole note"
 msgstr ""
@@ -11613,11 +13648,11 @@ msgstr ""
 msgid "Insert a program change message"
 msgstr ""
 
-#: step_entry.cc:343 step_entry.cc:700
+#: step_entry.cc:343 step_entry.cc:645
 msgid "Move Insert Position Back by Note Length"
 msgstr ""
 
-#: step_entry.cc:344 step_entry.cc:698
+#: step_entry.cc:344 step_entry.cc:643
 msgid "Move Insert Position to Edit Point"
 msgstr ""
 
@@ -11629,240 +13664,244 @@ msgstr ""
 msgid "Octave"
 msgstr ""
 
-#: step_entry.cc:598
+#: step_entry.cc:592
 msgid "Insert Note A"
 msgstr ""
 
-#: step_entry.cc:599
+#: step_entry.cc:593
 msgid "Insert Note A-sharp"
 msgstr ""
 
-#: step_entry.cc:600
+#: step_entry.cc:594
 msgid "Insert Note B"
 msgstr ""
 
-#: step_entry.cc:601
+#: step_entry.cc:595
 msgid "Insert Note C"
 msgstr ""
 
-#: step_entry.cc:602
+#: step_entry.cc:596
 msgid "Insert Note C-sharp"
 msgstr ""
 
-#: step_entry.cc:603
+#: step_entry.cc:597
 msgid "Insert Note D"
 msgstr ""
 
-#: step_entry.cc:604
+#: step_entry.cc:598
 msgid "Insert Note D-sharp"
 msgstr ""
 
-#: step_entry.cc:605
+#: step_entry.cc:599
 msgid "Insert Note E"
 msgstr ""
 
-#: step_entry.cc:606
+#: step_entry.cc:600
 msgid "Insert Note F"
 msgstr ""
 
-#: step_entry.cc:607
+#: step_entry.cc:601
 msgid "Insert Note F-sharp"
 msgstr ""
 
-#: step_entry.cc:608
+#: step_entry.cc:602
 msgid "Insert Note G"
 msgstr ""
 
-#: step_entry.cc:609
+#: step_entry.cc:603
 msgid "Insert Note G-sharp"
 msgstr ""
 
-#: step_entry.cc:611
+#: step_entry.cc:605
 msgid "Insert a Note-length Rest"
 msgstr ""
 
-#: step_entry.cc:612
+#: step_entry.cc:606
 msgid "Insert a Snap-length Rest"
 msgstr ""
 
-#: step_entry.cc:614 step_entry.cc:615
+#: step_entry.cc:608 step_entry.cc:609
 msgid "Move to next octave"
 msgstr ""
 
-#: step_entry.cc:617
+#: step_entry.cc:611
 msgid "Move to Next Note Length"
 msgstr ""
 
-#: step_entry.cc:618
+#: step_entry.cc:612
 msgid "Move to Previous Note Length"
 msgstr ""
 
-#: step_entry.cc:620
+#: step_entry.cc:614
 msgid "Increase Note Length"
 msgstr ""
 
-#: step_entry.cc:621
+#: step_entry.cc:615
 msgid "Decrease Note Length"
 msgstr ""
 
-#: step_entry.cc:623
+#: step_entry.cc:617
 msgid "Move to Next Note Velocity"
 msgstr ""
 
-#: step_entry.cc:624
+#: step_entry.cc:618
 msgid "Move to Previous Note Velocity"
 msgstr ""
 
-#: step_entry.cc:626
+#: step_entry.cc:620
 msgid "Increase Note Velocity"
 msgstr ""
 
-#: step_entry.cc:627
+#: step_entry.cc:621
 msgid "Decrease Note Velocity"
 msgstr ""
 
-#: step_entry.cc:629
+#: step_entry.cc:623
 msgid "Switch to the 1st octave"
 msgstr ""
 
-#: step_entry.cc:630
+#: step_entry.cc:624
 msgid "Switch to the 2nd octave"
 msgstr ""
 
-#: step_entry.cc:631
+#: step_entry.cc:625
 msgid "Switch to the 3rd octave"
 msgstr ""
 
-#: step_entry.cc:632
+#: step_entry.cc:626
 msgid "Switch to the 4th octave"
 msgstr ""
 
-#: step_entry.cc:633
+#: step_entry.cc:627
 msgid "Switch to the 5th octave"
 msgstr ""
 
-#: step_entry.cc:634
+#: step_entry.cc:628
 msgid "Switch to the 6th octave"
 msgstr ""
 
-#: step_entry.cc:635
+#: step_entry.cc:629
 msgid "Switch to the 7th octave"
 msgstr ""
 
-#: step_entry.cc:636
+#: step_entry.cc:630
 msgid "Switch to the 8th octave"
 msgstr ""
 
-#: step_entry.cc:637
+#: step_entry.cc:631
 msgid "Switch to the 9th octave"
 msgstr ""
 
-#: step_entry.cc:638
+#: step_entry.cc:632
 msgid "Switch to the 10th octave"
 msgstr ""
 
-#: step_entry.cc:639
+#: step_entry.cc:633
 msgid "Switch to the 11th octave"
 msgstr ""
 
-#: step_entry.cc:644
+#: step_entry.cc:635
+msgid "Toggle Triple Notes"
+msgstr ""
+
+#: step_entry.cc:638
+msgid "Toggle Chord Entry"
+msgstr ""
+
+#: step_entry.cc:640
+msgid "Sustain Selected Notes by Note Length"
+msgstr ""
+
+#: step_entry.cc:650
 msgid "Set Note Length to Whole"
 msgstr ""
 
-#: step_entry.cc:646
+#: step_entry.cc:652
 msgid "Set Note Length to 1/2"
 msgstr ""
 
-#: step_entry.cc:648
+#: step_entry.cc:654
 msgid "Set Note Length to 1/3"
 msgstr ""
 
-#: step_entry.cc:650
+#: step_entry.cc:656
 msgid "Set Note Length to 1/4"
 msgstr ""
 
-#: step_entry.cc:652
+#: step_entry.cc:658
 msgid "Set Note Length to 1/8"
 msgstr ""
 
-#: step_entry.cc:654
+#: step_entry.cc:660
 msgid "Set Note Length to 1/16"
 msgstr ""
 
-#: step_entry.cc:656
+#: step_entry.cc:662
 msgid "Set Note Length to 1/32"
 msgstr ""
 
-#: step_entry.cc:658
+#: step_entry.cc:664
 msgid "Set Note Length to 1/64"
 msgstr ""
 
-#: step_entry.cc:663
+#: step_entry.cc:669
 msgid "Set Note Velocity to Pianississimo"
 msgstr ""
 
-#: step_entry.cc:665
+#: step_entry.cc:671
 msgid "Set Note Velocity to Pianissimo"
 msgstr ""
 
-#: step_entry.cc:667
+#: step_entry.cc:673
 msgid "Set Note Velocity to Piano"
 msgstr ""
 
-#: step_entry.cc:669
+#: step_entry.cc:675
 msgid "Set Note Velocity to Mezzo-Piano"
 msgstr ""
 
-#: step_entry.cc:671
+#: step_entry.cc:677
 msgid "Set Note Velocity to Mezzo-Forte"
 msgstr ""
 
-#: step_entry.cc:673
+#: step_entry.cc:679
 msgid "Set Note Velocity to Forte"
 msgstr ""
 
-#: step_entry.cc:675 step_entry.cc:677
+#: step_entry.cc:681 step_entry.cc:683
 msgid "Set Note Velocity to Fortississimo"
 msgstr ""
 
-#: step_entry.cc:679
-msgid "Toggle Triple Notes"
-msgstr ""
-
-#: step_entry.cc:684
+#: step_entry.cc:688
 msgid "No Dotted Notes"
 msgstr ""
 
-#: step_entry.cc:686
+#: step_entry.cc:689
 msgid "Toggled Dotted Notes"
 msgstr ""
 
-#: step_entry.cc:688
+#: step_entry.cc:690
 msgid "Toggled Double-Dotted Notes"
 msgstr ""
 
-#: step_entry.cc:690
+#: step_entry.cc:691
 msgid "Toggled Triple-Dotted Notes"
 msgstr ""
 
-#: step_entry.cc:693
-msgid "Toggle Chord Entry"
-msgstr ""
-
-#: step_entry.cc:695
-msgid "Sustain Selected Notes by Note Length"
-msgstr ""
-
-#: stereo_panner.cc:133
+#: stereo_panner.cc:129
 #, c-format
 msgid "L:%3d R:%3d Width:%d%%"
 msgstr ""
 
-#: stereo_panner_editor.cc:35
+#: stereo_panner.cc:272
+msgid "Panner|M"
+msgstr ""
+
+#: stereo_panner_editor.cc:37
 msgid "Stereo Panner"
 msgstr ""
 
-#: stereo_panner_editor.cc:49
+#: stereo_panner_editor.cc:51
 msgid "Width"
 msgstr ""
 
@@ -11870,176 +13909,189 @@ msgstr ""
 msgid "Strip Silence"
 msgstr ""
 
-#: strip_silence_dialog.cc:75
+#: strip_silence_dialog.cc:65
+msgid "Threshold"
+msgstr ""
+
+#: strip_silence_dialog.cc:76
 msgid "Minimum length"
 msgstr ""
 
-#: strip_silence_dialog.cc:83
+#: strip_silence_dialog.cc:84
 msgid "Fade length"
 msgstr ""
 
-#: tempo_dialog.cc:41 tempo_dialog.cc:57
+#: strip_silence_dialog.cc:111 strip_silence_dialog.cc:298
+msgid "Analyzing"
+msgstr ""
+
+#: tempo_dialog.cc:43 tempo_dialog.cc:60
 msgid "bar:"
 msgstr ""
 
-#: tempo_dialog.cc:42 tempo_dialog.cc:58
+#: tempo_dialog.cc:44 tempo_dialog.cc:61
 msgid "beat:"
 msgstr ""
 
-#: tempo_dialog.cc:43 tempo_dialog.cc:59
+#: tempo_dialog.cc:45 tempo_dialog.cc:62
 msgid "Pulse note"
 msgstr ""
 
-#: tempo_dialog.cc:44 tempo_dialog.cc:60
+#: tempo_dialog.cc:46 tempo_dialog.cc:63
 msgid "Tap tempo"
 msgstr ""
 
-#: tempo_dialog.cc:54
-msgid "Edit Tempo"
-msgstr ""
-
-#: tempo_dialog.cc:77 tempo_dialog.cc:78 tempo_dialog.cc:324
-#: tempo_dialog.cc:325
+#: tempo_dialog.cc:81 tempo_dialog.cc:82 tempo_dialog.cc:448
+#: tempo_dialog.cc:449
 msgid "whole"
 msgstr ""
 
-#: tempo_dialog.cc:79 tempo_dialog.cc:80 tempo_dialog.cc:326
-#: tempo_dialog.cc:327
+#: tempo_dialog.cc:83 tempo_dialog.cc:84 tempo_dialog.cc:450
+#: tempo_dialog.cc:451
 msgid "second"
 msgstr ""
 
-#: tempo_dialog.cc:81 tempo_dialog.cc:82 tempo_dialog.cc:328
-#: tempo_dialog.cc:329
+#: tempo_dialog.cc:85 tempo_dialog.cc:86 tempo_dialog.cc:452
+#: tempo_dialog.cc:453
 msgid "third"
 msgstr ""
 
-#: tempo_dialog.cc:83 tempo_dialog.cc:84 tempo_dialog.cc:330
-#: tempo_dialog.cc:331
+#: tempo_dialog.cc:87 tempo_dialog.cc:88 tempo_dialog.cc:454
+#: tempo_dialog.cc:455
 msgid "quarter"
 msgstr ""
 
-#: tempo_dialog.cc:85 tempo_dialog.cc:86 tempo_dialog.cc:332
-#: tempo_dialog.cc:333
+#: tempo_dialog.cc:89 tempo_dialog.cc:90 tempo_dialog.cc:456
+#: tempo_dialog.cc:457
 msgid "eighth"
 msgstr ""
 
-#: tempo_dialog.cc:87 tempo_dialog.cc:88 tempo_dialog.cc:334
-#: tempo_dialog.cc:335
+#: tempo_dialog.cc:91 tempo_dialog.cc:92 tempo_dialog.cc:458
+#: tempo_dialog.cc:459
 msgid "sixteenth"
 msgstr ""
 
-#: tempo_dialog.cc:89 tempo_dialog.cc:90 tempo_dialog.cc:336
-#: tempo_dialog.cc:337
+#: tempo_dialog.cc:93 tempo_dialog.cc:94 tempo_dialog.cc:460
+#: tempo_dialog.cc:461
 msgid "thirty-second"
 msgstr ""
 
-#: tempo_dialog.cc:91 tempo_dialog.cc:92 tempo_dialog.cc:338
-#: tempo_dialog.cc:339
+#: tempo_dialog.cc:95 tempo_dialog.cc:96 tempo_dialog.cc:462
+#: tempo_dialog.cc:463
 msgid "sixty-fourth"
 msgstr ""
 
-#: tempo_dialog.cc:93 tempo_dialog.cc:94 tempo_dialog.cc:340
-#: tempo_dialog.cc:341
+#: tempo_dialog.cc:97 tempo_dialog.cc:98 tempo_dialog.cc:464
+#: tempo_dialog.cc:465
 msgid "one-hundred-twenty-eighth"
 msgstr ""
 
-#: tempo_dialog.cc:121
+#: tempo_dialog.cc:115 tempo_dialog.cc:116
+msgid "ramped"
+msgstr ""
+
+#: tempo_dialog.cc:117 tempo_dialog.cc:118
+msgid "constant"
+msgstr ""
+
+#: tempo_dialog.cc:133 tempo_dialog.cc:134 tempo_dialog.cc:482
+#: tempo_dialog.cc:483
+msgid "music"
+msgstr ""
+
+#: tempo_dialog.cc:161
 msgid "Beats per minute:"
 msgstr ""
 
-#: tempo_dialog.cc:155
+#: tempo_dialog.cc:195
 msgid "Tempo begins at"
 msgstr ""
 
-#: tempo_dialog.cc:251
+#: tempo_dialog.cc:201
+msgid "Lock Style:"
+msgstr ""
+
+#: tempo_dialog.cc:209
+msgid "Tempo Type:"
+msgstr ""
+
+#: tempo_dialog.cc:321
 msgid "incomprehensible pulse note type (%1)"
 msgstr ""
 
-#: tempo_dialog.cc:307
-msgid "Edit Meter"
+#: tempo_dialog.cc:334
+msgid "incomprehensible tempo type (%1)"
 msgstr ""
 
-#: tempo_dialog.cc:356
-msgid "Note value:"
+#: tempo_dialog.cc:347
+msgid "incomprehensible lock style (%1)"
 msgstr ""
 
-#: tempo_dialog.cc:357
-msgid "Beats per bar:"
+#: tempo_dialog.cc:498
+msgid "Note value:"
 msgstr ""
 
-#: tempo_dialog.cc:371
-msgid "Meter begins at bar:"
+#: tempo_dialog.cc:499
+msgid "Lock style:"
 msgstr ""
 
-#: tempo_dialog.cc:484
-msgid "incomprehensible meter note type (%1)"
+#: tempo_dialog.cc:500
+msgid "Beats per bar:"
 msgstr ""
 
-#: theme_manager.cc:65
-msgid "Dark Theme"
+#: tempo_dialog.cc:514
+msgid "Meter begins at bar:"
 msgstr ""
 
-#: theme_manager.cc:66
-msgid "Light Theme"
+#: tempo_dialog.cc:638
+msgid "incomprehensible meter note type (%1)"
 msgstr ""
 
-#: theme_manager.cc:67
-msgid "Restore Defaults"
+#: tempo_dialog.cc:651
+msgid "incomprehensible meter lock style (%1)"
 msgstr ""
 
-#: theme_manager.cc:68
+#: theme_manager.cc:53
 msgid "Draw \"flat\" buttons"
 msgstr ""
 
-#: theme_manager.cc:69
+#: theme_manager.cc:54
 msgid "Blink Rec-Arm buttons"
 msgstr ""
 
-#: theme_manager.cc:70
+#: theme_manager.cc:55
 msgid "Color regions using their track's color"
 msgstr ""
 
-#: theme_manager.cc:71
+#: theme_manager.cc:56
 msgid "Show waveform clipping"
 msgstr ""
 
-#: theme_manager.cc:73
+#: theme_manager.cc:58
 msgid "Waveforms color gradient depth"
 msgstr ""
 
-#: theme_manager.cc:75
+#: theme_manager.cc:60
 msgid "Timeline item gradient depth"
 msgstr ""
 
-#: theme_manager.cc:76
+#: theme_manager.cc:61
 msgid "All floating windows are dialogs"
 msgstr ""
 
-#: theme_manager.cc:77
+#: theme_manager.cc:62
 msgid "Transient windows follow front window."
 msgstr ""
 
-#: theme_manager.cc:78
-msgid "Icon Set"
-msgstr ""
-
-#: theme_manager.cc:87
-msgid "Object"
-msgstr "Objecto"
-
-#: theme_manager.cc:163
-msgid "Items"
+#: theme_manager.cc:63
+msgid "Float detached monitor-section window"
 msgstr ""
 
-#: theme_manager.cc:164
-msgid "Palette"
-msgstr ""
-
-#: theme_manager.cc:165
-msgid "Transparency"
+#: theme_manager.cc:64
+msgid "Icon Set"
 msgstr ""
 
-#: theme_manager.cc:195
+#: theme_manager.cc:132
 msgid ""
 "Mark all floating windows to be type \"Dialog\" rather than using \"Utility"
 "\" for some.\n"
@@ -12047,92 +14099,95 @@ msgid ""
 "take effect"
 msgstr ""
 
-#: theme_manager.cc:199
+#: theme_manager.cc:136
 msgid ""
 "Make transient windows follow the front window when toggling between the "
 "editor and mixer.\n"
 "This requires a restart of %1 to take effect"
 msgstr ""
 
-#: theme_manager.cc:620
-msgid "Color Palette"
+#: theme_manager.cc:139
+msgid ""
+"When detaching the monitoring section, mark it as \"Utility\" window to stay "
+"in front.\n"
+"This requires a restart of %1 to take effect"
 msgstr ""
 
 #: time_axis_view.cc:148
 msgid "Track/Bus name (double click to edit)"
 msgstr ""
 
-#: time_axis_view_item.cc:345
+#: time_axis_view_item.cc:326
 msgid "new duration %1 frame is out of bounds for %2"
 msgid_plural "new duration of %1 frames is out of bounds for %2"
 msgstr[0] ""
 msgstr[1] ""
 
-#: time_fx_dialog.cc:62
+#: time_fx_dialog.cc:60
 msgid "Quick but Ugly"
 msgstr "Rápido e feio"
 
-#: time_fx_dialog.cc:63
+#: time_fx_dialog.cc:61
 msgid "Skip Anti-aliasing"
 msgstr "Ignorar anti-aliasing"
 
-#: time_fx_dialog.cc:64
-msgid "Contents:"
+#: time_fx_dialog.cc:62
+msgid "Contents"
 msgstr ""
 
-#: time_fx_dialog.cc:65
+#: time_fx_dialog.cc:63
 msgid "Minimize time distortion"
 msgstr ""
 
-#: time_fx_dialog.cc:66
+#: time_fx_dialog.cc:64
 msgid "Preserve Formants"
 msgstr ""
 
-#: time_fx_dialog.cc:71
+#: time_fx_dialog.cc:81
 msgid "TimeFXDialog"
 msgstr ""
 
-#: time_fx_dialog.cc:74
+#: time_fx_dialog.cc:84
 msgid "Pitch Shift Audio"
 msgstr ""
 
-#: time_fx_dialog.cc:76
+#: time_fx_dialog.cc:86
 msgid "Time Stretch Audio"
 msgstr ""
 
-#: time_fx_dialog.cc:104 transpose_dialog.cc:41
+#: time_fx_dialog.cc:114 transpose_dialog.cc:41
 msgid "Octaves:"
 msgstr ""
 
-#: time_fx_dialog.cc:109 transpose_dialog.cc:46
+#: time_fx_dialog.cc:119 transpose_dialog.cc:46
 msgid "Semitones:"
 msgstr ""
 
-#: time_fx_dialog.cc:114
+#: time_fx_dialog.cc:124
 msgid "Cents:"
 msgstr ""
 
-#: time_fx_dialog.cc:122
+#: time_fx_dialog.cc:132
 msgid "Time|Shift"
 msgstr ""
 
-#: time_fx_dialog.cc:146 time_fx_dialog.cc:149
+#: time_fx_dialog.cc:184 time_fx_dialog.cc:188
 msgid "TimeFXButton"
 msgstr ""
 
-#: time_fx_dialog.cc:154
+#: time_fx_dialog.cc:193
 msgid "Stretch/Shrink"
 msgstr ""
 
-#: time_fx_dialog.cc:164
+#: time_fx_dialog.cc:203
 msgid "<b>Progress</b>"
 msgstr ""
 
-#: time_info_box.cc:124
+#: time_info_box.cc:118
 msgid "Start recording at auto-punch start"
 msgstr "Iniciar gravação na posição inicial de inserção automática"
 
-#: time_info_box.cc:125
+#: time_info_box.cc:119
 msgid "Stop recording at auto-punch end"
 msgstr "Parar gravação na posição final de inserção automática"
 
@@ -12200,94 +14255,130 @@ msgstr ""
 msgid "Transpose"
 msgstr ""
 
-#: ui_config.cc:163 ui_config.cc:300
+#: ui_config.cc:233 ui_config.cc:416
 msgid "Loading default ui configuration file %1"
 msgstr ""
 
-#: ui_config.cc:166 ui_config.cc:303
+#: ui_config.cc:236 ui_config.cc:419
 msgid "cannot read default ui configuration file \"%1\""
 msgstr ""
 
-#: ui_config.cc:169 ui_config.cc:308
+#: ui_config.cc:239 ui_config.cc:424
 msgid "default ui configuration file \"%1\" not loaded successfully."
 msgstr ""
 
-#: ui_config.cc:177
+#: ui_config.cc:247
 msgid "Could not find default UI configuration file %1"
 msgstr ""
 
-#: ui_config.cc:219
+#: ui_config.cc:330
+msgid "Color file for %1 not found along %2"
+msgstr ""
+
+#: ui_config.cc:337
 msgid "Loading color file %1"
 msgstr ""
 
-#: ui_config.cc:222
+#: ui_config.cc:340
 msgid "cannot read color file \"%1\""
 msgstr ""
 
-#: ui_config.cc:227
+#: ui_config.cc:345
 msgid "color file \"%1\" not loaded successfully."
 msgstr ""
 
-#: ui_config.cc:233
-msgid "Color file %1 not found"
-msgstr ""
-
-#: ui_config.cc:282 ui_config.cc:361
+#: ui_config.cc:397 ui_config.cc:480
 msgid "Color file %1 not saved"
 msgstr ""
 
-#: ui_config.cc:317
+#: ui_config.cc:433
 msgid "Loading user ui configuration file %1"
 msgstr ""
 
-#: ui_config.cc:320
+#: ui_config.cc:436
 msgid "cannot read ui configuration file \"%1\""
 msgstr ""
 
-#: ui_config.cc:325
+#: ui_config.cc:441
 msgid "user ui configuration file \"%1\" not loaded successfully."
 msgstr ""
 
-#: ui_config.cc:333
+#: ui_config.cc:449
 msgid "could not find any ui configuration file, canvas will look broken."
 msgstr ""
 
-#: ui_config.cc:351
+#: ui_config.cc:470
 msgid "Config file %1 not saved"
 msgstr ""
 
-#: ui_config.cc:592
+#: ui_config.cc:715
 msgid "Color %1 not found"
 msgstr ""
 
-#: ui_config.cc:662
+#: ui_config.cc:785
 msgid "Unable to find UI style file %1 in search path %2. %3 will look strange"
 msgstr ""
 
-#: utils.cc:117 utils.cc:160
+#: utils.cc:118 utils.cc:161
 msgid "bad XPM header %1"
 msgstr ""
 
-#: utils.cc:577
+#: utils.cc:424
 msgid "cannot find XPM file for %1"
 msgstr ""
 
-#: utils.cc:597 utils.cc:627 utils.cc:641
+#: utils.cc:477 utils.cc:507 utils.cc:527
 msgid "default"
 msgstr ""
 
-#: utils.cc:642
+#: utils.cc:528
 msgid "icon \"%1\" not found for icon set \"%2\", fallback to default"
 msgstr ""
 
-#: utils.cc:649
+#: utils.cc:535
 msgid "cannot find icon image for %1 using %2"
 msgstr ""
 
-#: utils.cc:666 utils.cc:682
+#: utils.cc:552 utils.cc:568
 msgid "Caught exception while loading icon named %1"
 msgstr ""
 
+#: utils.cc:818
+msgid "Overwrite"
+msgstr ""
+
+#: vca_master_strip.cc:74 vca_time_axis.cc:49
+msgid "Solo slaves"
+msgstr ""
+
+#: vca_master_strip.cc:79 vca_time_axis.cc:55
+msgid "Mute slaves"
+msgstr ""
+
+#: vca_master_strip.cc:83
+msgid "Hide this VCA strip"
+msgstr ""
+
+#: vca_master_strip.cc:108 vca_master_strip.cc:418
+msgid "Click to show slaves only"
+msgstr ""
+
+#: vca_master_strip.cc:293
+msgid "A"
+msgstr ""
+
+#: vca_master_strip.cc:300
+msgid "S"
+msgstr ""
+
+#: vca_master_strip.cc:398
+msgid "Drop All Slaves"
+msgstr ""
+
+#: vca_master_strip.cc:421
+msgid "Click to show normal mixer"
+msgstr ""
+
 #: add_video_dialog.cc:54
 msgid "Set Video Track"
 msgstr ""
@@ -12332,32 +14423,48 @@ msgstr ""
 msgid " %1 fps"
 msgstr ""
 
-#: video_timeline.cc:468
+#: vca_time_axis.cc:60
+msgid "D"
+msgstr ""
+
+#: vca_time_axis.cc:61
+msgid "Unassign all slaves"
+msgstr ""
+
+#: vca_time_axis.cc:65
+msgid "V"
+msgstr ""
+
+#: vca_time_axis.cc:66
+msgid "Show only slaves"
+msgstr ""
+
+#: video_timeline.cc:472
 msgid ""
 "Parsing video file info failed. Is the Video Server running? Is the file "
 "readable by the Video Server? Does the docroot match? Is it a video file?"
 msgstr ""
 
-#: video_timeline.cc:506
+#: video_timeline.cc:510
 msgid ""
 "Failed to set session-framerate: '%1' does not have a corresponding option "
 "setting in %2."
 msgstr ""
 
-#: video_timeline.cc:514
+#: video_timeline.cc:518
 msgid ""
 "Video file's framerate is not equal to %1 session timecode's framerate: '%2' "
 "vs '%3'"
 msgstr ""
 
-#: video_timeline.cc:587
+#: video_timeline.cc:591
 msgid ""
 "Video-server docroot mismatch. %1: '%2', video-server: '%3'. This usually "
 "means that the video server was not started by %1 and uses a different "
 "document-root."
 msgstr ""
 
-#: video_timeline.cc:724
+#: video_timeline.cc:728
 msgid ""
 "Video-monitor 'xjadeo' was not found. Please install http://xjadeo.sf.net/ "
 "(a custom path to xjadeo can be specified by setting the XJREMOTE "
@@ -12367,25 +14474,25 @@ msgid ""
 "see also http://manual.ardour.org/video-timeline/setup/"
 msgstr ""
 
-#: video_timeline.cc:739
+#: video_timeline.cc:743
 msgid "Video-monitor 'xjadeo' cannot be launched."
 msgstr ""
 
-#: video_timeline.cc:766
+#: video_timeline.cc:775
 msgid ""
 "Video-monitor 'xjadeo' is too old. Please install xjadeo version 0.7.7 or "
 "later. http://xjadeo.sf.net/"
 msgstr ""
 
-#: video_monitor.cc:285
+#: video_monitor.cc:283
 msgid "Video Monitor: File Not Found."
 msgstr ""
 
 #: transcode_ffmpeg.cc:56
 msgid ""
-"No ffprobe or ffmpeg executables could be found on this system.\n"
-"Video import and export is not possible until you install those tools.\n"
+"ffmpeg installation was not found on this system.\n"
 "%1 requires ffmpeg and ffprobe from ffmpeg.org - version 1.1 or newer.\n"
+"Video import and export is not possible until you install tools.\n"
 "\n"
 "The tools are included with the %1 releases from ardour.org and also "
 "available with the video-server at http://x42.github.com/harvid/\n"
@@ -12407,7 +14514,7 @@ msgstr ""
 msgid "Output File:"
 msgstr ""
 
-#: transcode_video_dialog.cc:61 export_video_dialog.cc:85
+#: transcode_video_dialog.cc:61 export_video_dialog.cc:81
 msgid "Abort"
 msgstr ""
 
@@ -12416,10 +14523,14 @@ msgid "Height = "
 msgstr ""
 
 #: transcode_video_dialog.cc:66
+msgid "Extract LTC from audio and align video"
+msgstr ""
+
+#: transcode_video_dialog.cc:67
 msgid "Manual Override"
 msgstr ""
 
-#: transcode_video_dialog.cc:70 export_video_dialog.cc:103
+#: transcode_video_dialog.cc:71 export_video_dialog.cc:99
 msgid "Debug Mode: Print ffmpeg command and output to stdout."
 msgstr ""
 
@@ -12429,9 +14540,8 @@ msgstr ""
 
 #: transcode_video_dialog.cc:113
 msgid ""
-"No ffprobe or ffmpeg executables could be found on this system. Video Import "
-"is not possible until you install those tools. See the Log window for more "
-"information."
+"ffmpeg installation was not found. Video Import is not possible. See the Log "
+"window for more information."
 msgstr ""
 
 #: transcode_video_dialog.cc:120
@@ -12440,83 +14550,83 @@ msgid ""
 "unsupported video codec or format."
 msgstr ""
 
-#: transcode_video_dialog.cc:134
+#: transcode_video_dialog.cc:137
 msgid "FPS:"
 msgstr ""
 
-#: transcode_video_dialog.cc:136
-msgid "Duration:"
-msgstr ""
-
-#: transcode_video_dialog.cc:138
+#: transcode_video_dialog.cc:141
 msgid "Codec:"
 msgstr ""
 
-#: transcode_video_dialog.cc:140
+#: transcode_video_dialog.cc:143
 msgid "Geometry:"
 msgstr ""
 
-#: transcode_video_dialog.cc:155
+#: transcode_video_dialog.cc:158
 msgid "??"
 msgstr ""
 
-#: transcode_video_dialog.cc:176
+#: transcode_video_dialog.cc:179
 msgid "<b>Import Settings</b>"
 msgstr ""
 
-#: transcode_video_dialog.cc:181
-msgid "Reference From Current Location (Previously Transcoded Files Only)"
+#: transcode_video_dialog.cc:184
+msgid "Reference from Current Location (Previously Transcoded Files Only)"
 msgstr ""
 
-#: transcode_video_dialog.cc:183
+#: transcode_video_dialog.cc:185
 msgid "Import/Transcode Video to Session"
 msgstr ""
 
-#: transcode_video_dialog.cc:191
+#: transcode_video_dialog.cc:188 transcode_video_dialog.cc:198
 msgid "Do Not Import Video (Audio Import Only)"
 msgstr ""
 
-#: transcode_video_dialog.cc:200
+#: transcode_video_dialog.cc:208
+msgid "Do Not Import Video"
+msgstr ""
+
+#: transcode_video_dialog.cc:224
 msgid "Scale Video: Width = "
 msgstr ""
 
-#: transcode_video_dialog.cc:207
+#: transcode_video_dialog.cc:230
 msgid "Original Width"
 msgstr ""
 
-#: transcode_video_dialog.cc:222
+#: transcode_video_dialog.cc:245
 msgid "Bitrate (KBit/s):"
 msgstr ""
 
-#: transcode_video_dialog.cc:227
+#: transcode_video_dialog.cc:250
 msgid "Extract Audio:"
 msgstr ""
 
-#: transcode_video_dialog.cc:232
+#: transcode_video_dialog.cc:255
 msgid "No Audio Track Present"
 msgstr ""
 
-#: transcode_video_dialog.cc:235
+#: transcode_video_dialog.cc:258
 msgid "Do Not Extract Audio"
 msgstr ""
 
-#: transcode_video_dialog.cc:350
+#: transcode_video_dialog.cc:374
 msgid "Extracting Audio.."
 msgstr ""
 
-#: transcode_video_dialog.cc:353
+#: transcode_video_dialog.cc:377
 msgid "Audio Extraction Failed."
 msgstr ""
 
-#: transcode_video_dialog.cc:379
+#: transcode_video_dialog.cc:403
 msgid "Transcoding Video.."
 msgstr ""
 
-#: transcode_video_dialog.cc:413
+#: transcode_video_dialog.cc:437
 msgid "Transcoding Failed."
 msgstr ""
 
-#: transcode_video_dialog.cc:503
+#: transcode_video_dialog.cc:541
 msgid "Save Transcoded Video File"
 msgstr ""
 
@@ -12536,7 +14646,7 @@ msgstr ""
 msgid "Don't show this dialog again. (Reset in Edit->Preferences)."
 msgstr ""
 
-#: video_server_dialog.cc:97
+#: video_server_dialog.cc:94
 msgid ""
 "The external video server 'harvid' can not be found.\n"
 "The tool is included with the %1 releases from ardour.org, alternatively you "
@@ -12546,239 +14656,230 @@ msgid ""
 "see also http://manual.ardour.org/video-timeline/setup/"
 msgstr ""
 
-#: video_server_dialog.cc:129
+#: video_server_dialog.cc:126
 msgid "Listen Address:"
 msgstr ""
 
-#: video_server_dialog.cc:134
+#: video_server_dialog.cc:131
 msgid "Listen Port:"
 msgstr ""
 
-#: video_server_dialog.cc:139
+#: video_server_dialog.cc:136
 msgid "Cache Size:"
 msgstr ""
 
-#: video_server_dialog.cc:145
+#: video_server_dialog.cc:142
 msgid ""
 "%1 relies on an external video server for the videotimeline.\n"
 "The server configured in Edit -> Preferences -> Video is not reachable.\n"
 "Do you want %1 to launch 'harvid' on this machine?"
 msgstr ""
 
-#: video_server_dialog.cc:189
+#: video_server_dialog.cc:186
 msgid "Set Video Server Executable"
 msgstr ""
 
-#: video_server_dialog.cc:209
+#: video_server_dialog.cc:206
 msgid "Server docroot"
 msgstr ""
 
-#: utils_videotl.cc:60
+#: utils_videotl.cc:61
 msgid "Destination is outside Video Server's docroot. "
 msgstr ""
 
-#: utils_videotl.cc:61
+#: utils_videotl.cc:62
 msgid ""
 "The destination file path is outside of the Video Server's docroot. The file "
 "will not be readable by the Video Server. Do you still want to continue?"
 msgstr ""
 
-#: utils_videotl.cc:64
+#: utils_videotl.cc:65
 msgid "Continue"
 msgstr ""
 
-#: utils_videotl.cc:70
+#: utils_videotl.cc:72
 msgid "Confirm Overwrite"
 msgstr ""
 
-#: utils_videotl.cc:71
-msgid "A file with the same name already exists.  Do you want to overwrite it?"
-msgstr ""
-
-#: utils_videotl.cc:81 utils_videotl.cc:97
+#: utils_videotl.cc:82 utils_videotl.cc:98
 msgid "Cannot create video folder \"%1\" (%2)"
 msgstr ""
 
-#: export_video_dialog.cc:71
+#: export_video_dialog.cc:67
 msgid "Export Video File "
 msgstr ""
 
-#: export_video_dialog.cc:82
+#: export_video_dialog.cc:78
 msgid "Video:"
 msgstr ""
 
-#: export_video_dialog.cc:87
+#: export_video_dialog.cc:83
 msgid "Scale Video (W x H):"
 msgstr ""
 
-#: export_video_dialog.cc:88
+#: export_video_dialog.cc:84
 msgid "Retain Aspect"
 msgstr ""
 
-#: export_video_dialog.cc:93
+#: export_video_dialog.cc:89
 msgid "Set Aspect Ratio:"
 msgstr ""
 
-#: export_video_dialog.cc:94
+#: export_video_dialog.cc:90
 msgid "Normalize Audio"
 msgstr ""
 
-#: export_video_dialog.cc:95
+#: export_video_dialog.cc:91
 msgid "2 Pass Encoding"
 msgstr ""
 
-#: export_video_dialog.cc:96
+#: export_video_dialog.cc:92
 msgid "Codec Optimizations:"
 msgstr ""
 
-#: export_video_dialog.cc:98
+#: export_video_dialog.cc:94
 msgid "Deinterlace"
 msgstr ""
 
-#: export_video_dialog.cc:99
+#: export_video_dialog.cc:95
 msgid "Use [2] B-frames (MPEG 2 or 4 only)"
 msgstr ""
 
-#: export_video_dialog.cc:100
+#: export_video_dialog.cc:96
 msgid "Override FPS (Default is to retain FPS from the input video file):"
 msgstr ""
 
-#: export_video_dialog.cc:101
+#: export_video_dialog.cc:97
 msgid "Include Session Metadata"
 msgstr ""
 
-#: export_video_dialog.cc:119
+#: export_video_dialog.cc:115
 msgid ""
-"No ffprobe or ffmpeg executables could be found on this system. Video Export "
-"is not possible until you install those tools. See the Log window for more "
-"information."
+"ffmpeg installation was not found. Video Export is not possible. See the Log "
+"window for more information."
 msgstr ""
 
-#: export_video_dialog.cc:130
+#: export_video_dialog.cc:126
 msgid "<b>Output:</b> (file extension defines format)"
 msgstr ""
 
-#: export_video_dialog.cc:140
+#: export_video_dialog.cc:136
 msgid "<b>Input Video:</b>"
 msgstr ""
 
-#: export_video_dialog.cc:151
+#: export_video_dialog.cc:147
 msgid "Audio:"
 msgstr ""
 
-#: export_video_dialog.cc:153
+#: export_video_dialog.cc:149
 msgid "Master Bus"
 msgstr ""
 
-#: export_video_dialog.cc:158
+#: export_video_dialog.cc:153
 msgid "from the %1 session's start to the session's end"
 msgstr ""
 
-#: export_video_dialog.cc:161
+#: export_video_dialog.cc:156
 msgid "<b>Settings:</b>"
 msgstr ""
 
-#: export_video_dialog.cc:169
+#: export_video_dialog.cc:164
 msgid "Range:"
 msgstr ""
 
-#: export_video_dialog.cc:172
-msgid "Preset:"
-msgstr ""
-
-#: export_video_dialog.cc:175
+#: export_video_dialog.cc:170
 msgid "Video Codec:"
 msgstr ""
 
-#: export_video_dialog.cc:178
+#: export_video_dialog.cc:173
 msgid "Video KBit/s:"
 msgstr ""
 
-#: export_video_dialog.cc:181
+#: export_video_dialog.cc:176
 msgid "Audio Codec:"
 msgstr ""
 
-#: export_video_dialog.cc:184
+#: export_video_dialog.cc:179
 msgid "Audio KBit/s:"
 msgstr ""
 
-#: export_video_dialog.cc:187
+#: export_video_dialog.cc:182
 msgid "Audio Samplerate:"
 msgstr ""
 
-#: export_video_dialog.cc:222 export_video_dialog.cc:231
-#: export_video_dialog.cc:830 export_video_dialog.cc:833
+#: export_video_dialog.cc:215 export_video_dialog.cc:223
+#: export_video_dialog.cc:814 export_video_dialog.cc:817
 msgid "(default for format)"
 msgstr ""
 
-#: export_video_dialog.cc:242 export_video_dialog.cc:255
-#: export_video_dialog.cc:837 export_video_dialog.cc:846
+#: export_video_dialog.cc:233 export_video_dialog.cc:244
+#: export_video_dialog.cc:821 export_video_dialog.cc:830
 msgid "(default)"
 msgstr ""
 
-#: export_video_dialog.cc:256 export_video_dialog.cc:840
+#: export_video_dialog.cc:245 export_video_dialog.cc:824
 msgid "(retain)"
 msgstr ""
 
-#: export_video_dialog.cc:348
+#: export_video_dialog.cc:335
 msgid "from 00:00:00:00 to the video's end"
 msgstr ""
 
-#: export_video_dialog.cc:350
+#: export_video_dialog.cc:337
 msgid "from the video's start to the video's end"
 msgstr ""
 
-#: export_video_dialog.cc:353
+#: export_video_dialog.cc:340
 msgid "Selected range"
 msgstr ""
 
-#: export_video_dialog.cc:589
+#: export_video_dialog.cc:561
 msgid "Normalizing audio"
 msgstr ""
 
-#: export_video_dialog.cc:593
+#: export_video_dialog.cc:566 export_video_dialog.cc:571
 msgid "Exporting audio"
 msgstr ""
 
-#: export_video_dialog.cc:648
+#: export_video_dialog.cc:632
 msgid "Exporting Audio..."
 msgstr ""
 
-#: export_video_dialog.cc:705
+#: export_video_dialog.cc:689
 msgid ""
 "Export Video: Cannot query duration of video-file, using duration from "
 "timeline instead."
 msgstr ""
 
-#: export_video_dialog.cc:735
+#: export_video_dialog.cc:719
 msgid "Export Video: export-range does not include video."
 msgstr ""
 
-#: export_video_dialog.cc:748
+#: export_video_dialog.cc:732
 msgid "Export Video: No Master Out Ports to Connect for Audio Export"
 msgstr ""
 
-#: export_video_dialog.cc:790
+#: export_video_dialog.cc:774
 msgid "Encoding Video..."
 msgstr ""
 
-#: export_video_dialog.cc:810
+#: export_video_dialog.cc:794
 msgid "Export Video: Video input file cannot be read."
 msgstr ""
 
-#: export_video_dialog.cc:916
+#: export_video_dialog.cc:900
 msgid "Encoding Video.. Pass 1/2"
 msgstr ""
 
-#: export_video_dialog.cc:928
+#: export_video_dialog.cc:912
 msgid "Encoding Video.. Pass 2/2"
 msgstr ""
 
-#: export_video_dialog.cc:1031
+#: export_video_dialog.cc:1015
 msgid "Transcoding failed."
 msgstr ""
 
-#: export_video_dialog.cc:1267 export_video_dialog.cc:1287
+#: export_video_dialog.cc:1251 export_video_dialog.cc:1271
 msgid "Save Exported Video File"
 msgstr ""
 
@@ -12796,13 +14897,40 @@ msgstr ""
 
 #: export_video_infobox.cc:51
 msgid ""
+"%1 does not include commercial licenses for encoding audio/video. Visit "
+"mpegla.com for information about licensing various audio/video codecs.\n"
+"\n"
 "Video encoding is a non-trivial task with many details.\n"
 "\n"
-"Please see the manual at %1/video-timeline/operations/#export.\n"
+"Please see the manual at %2/video-timeline/operations/#export.\n"
 "\n"
 "Open Manual in Browser? "
 msgstr ""
 
+#~ msgid "Locations"
+#~ msgstr "Localizações"
+
+#~ msgid "End point trim"
+#~ msgstr "Ponto final de corte"
+
+#~ msgid "duplicate selection"
+#~ msgstr "duplicar selecção"
+
+#~ msgid "I"
+#~ msgstr "E"
+
+#~ msgid "*Comments*"
+#~ msgstr "*Comentários*"
+
+#~ msgid "Click to Add/Edit Comments"
+#~ msgstr "Clicar para acrescentar/editar comentários"
+
+#~ msgid "Update available plugins"
+#~ msgstr "Actualizar efeitos/plug-ins disponíveis"
+
+#~ msgid "Remote Control ID"
+#~ msgstr "ID controlo remoto"
+
 #~ msgid "Gain Tool"
 #~ msgstr "Ferramenta/ganho"
 
diff --git a/gtk2_ardour/po/ru.mo b/gtk2_ardour/po/ru.mo
new file mode 100644
index 0000000..14eaaf3
Binary files /dev/null and b/gtk2_ardour/po/ru.mo differ
diff --git a/gtk2_ardour/po/ru.po b/gtk2_ardour/po/ru.po
index 1593470..3a542d4 100644
--- a/gtk2_ardour/po/ru.po
+++ b/gtk2_ardour/po/ru.po
@@ -3,15 +3,15 @@
 # This file is distributed under the same license as the gtk-ardour package.
 #
 # Igor Blinov pitstop at nm.ru, 2004.
-# Александр Кольцов <ag1455 at mail.ru>, 2014, 2015.
-# Alexandre Prokoudine <alexandre.prokoudine at gmail.com>, 2006, 2007, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016.
+# Александр Кольцов <ag1455 at mail.ru>, 2014-2016
+# Alexandre Prokoudine <alexandre.prokoudine at gmail.com>, 2006-2016, 2016.
 #
 msgid ""
 msgstr ""
 "Project-Id-Version: Ardour 4\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-01-07 03:46+0300\n"
-"PO-Revision-Date: 2016-01-07 04:01+0300\n"
+"POT-Creation-Date: 2016-08-08 21:13+0300\n"
+"PO-Revision-Date: 2016-08-09 00:59+0300\n"
 "Last-Translator: Alexandre Prokoudine <alexandre.prokoudine at gmail.com>\n"
 "Language-Team: русский <>\n"
 "Language: ru\n"
@@ -24,270 +24,286 @@ msgstr ""
 "%100>=20) ? 1: 2);\n"
 
 #: about.cc:127
+msgid "Fons Adriaensen"
+msgstr "Fons Adriaensen"
+
+#: about.cc:128
 msgid "Brian Ahr"
 msgstr "Brian Ahr"
 
-#: about.cc:128
+#: about.cc:129
 msgid "John Anderson"
 msgstr "John Anderson"
 
-#: about.cc:129
+#: about.cc:130
 msgid "Marcus Andersson"
 msgstr "Marcus Andersson"
 
-#: about.cc:130
+#: about.cc:131
 msgid "Nedko Arnaudov"
 msgstr "Nedko Arnaudov"
 
-#: about.cc:131
+#: about.cc:132
 msgid "Hans Baier"
 msgstr "Hans Baier"
 
-#: about.cc:132
+#: about.cc:133
 msgid "Ben Bell"
 msgstr "Ben Bell"
 
-#: about.cc:133
+#: about.cc:134
 msgid "Sakari Bergen"
 msgstr "Sakari Bergen"
 
-#: about.cc:134
+#: about.cc:135
 msgid "Christian Borss"
 msgstr "Christian Borss"
 
-#: about.cc:135
+#: about.cc:136
 msgid "Chris Cannam"
 msgstr "Chris Cannam"
 
-#: about.cc:136
+#: about.cc:137
 msgid "Jeremy Carter"
 msgstr "Jeremy Carter"
 
-#: about.cc:137
+#: about.cc:138
 msgid "Jesse Chappell"
 msgstr "Jesse Chappell"
 
-#: about.cc:138
+#: about.cc:139
 msgid "Thomas Charbonnel"
 msgstr "Thomas Charbonnel"
 
-#: about.cc:139
+#: about.cc:140
 msgid "Sam Chessman"
 msgstr "Sam Chessman"
 
-#: about.cc:140
+#: about.cc:141
 msgid "André Colomb"
 msgstr "André Colomb"
 
-#: about.cc:141
+#: about.cc:142
 msgid "Paul Davis"
 msgstr "Paul Davis"
 
-#: about.cc:142
+#: about.cc:143
 msgid "Gerard van Dongen"
 msgstr "Gerard van Dongen"
 
-#: about.cc:143
+#: about.cc:144
 msgid "John Emmas"
 msgstr "John Emmas"
 
-#: about.cc:144
+#: about.cc:145
 msgid "Colin Fletcher"
 msgstr "Colin Fletcher"
 
-#: about.cc:145
+#: about.cc:146
 msgid "Dave Flick"
 msgstr "Dave Flick"
 
-#: about.cc:146
+#: about.cc:147
 msgid "Hans Fugal"
 msgstr "Hans Fugal"
 
-#: about.cc:147
+#: about.cc:148
 msgid "Robin Gareus"
 msgstr "Robin Gareus"
 
-#: about.cc:148
+#: about.cc:149
 msgid "Nil Geisweiller"
 msgstr "Nil Geisweiller"
 
-#: about.cc:149
+#: about.cc:150
 msgid "Christopher George"
 msgstr "Christopher George"
 
-#: about.cc:150
+#: about.cc:151
 msgid "Chris Goddard"
 msgstr "Chris Goddard"
 
-#: about.cc:151
+#: about.cc:152
 msgid "J. Abelardo Gutierrez"
 msgstr "J. Abelardo Gutierrez"
 
-#: about.cc:152
+#: about.cc:153
 msgid "Jeremy Hall"
 msgstr "Jeremy Hall"
 
-#: about.cc:153
+#: about.cc:154
 msgid "Audun Halland"
 msgstr "Audun Halland"
 
-#: about.cc:154
+#: about.cc:155
 msgid "David Halter"
 msgstr "David Halter"
 
-#: about.cc:155
+#: about.cc:156
 msgid "Steve Harris"
 msgstr "Steve Harris"
 
-#: about.cc:156
+#: about.cc:157
 msgid "Melvin Ray Herr"
 msgstr "Melvin Ray Herr"
 
-#: about.cc:157
+#: about.cc:158
 msgid "Carl Hetherington"
 msgstr "Carl Hetherington"
 
-#: about.cc:158
+#: about.cc:159
 msgid "Rob Holland"
 msgstr "Rob Holland"
 
-#: about.cc:159
+#: about.cc:160
 msgid "Robert Jordens"
 msgstr "Robert Jordens"
 
-#: about.cc:160
+#: about.cc:161
 msgid "Stefan Kersten"
 msgstr "Stefan Kersten"
 
-#: about.cc:161
+#: about.cc:162
 msgid "Armand Klenk"
 msgstr "Armand Klenk"
 
-#: about.cc:162
+#: about.cc:163
 msgid "Julien de Kozak"
 msgstr "Julien de Kozak"
 
-#: about.cc:163
+#: about.cc:164
 msgid "Matt Krai"
 msgstr "Matt Krai"
 
-#: about.cc:164
+#: about.cc:165
 msgid "Georg Krause"
 msgstr "Georg Krause"
 
-#: about.cc:165
+#: about.cc:166
 msgid "Nick Lanham"
 msgstr "Nick Lanham"
 
-#: about.cc:166
+#: about.cc:167
 msgid "Colin Law"
 msgstr "Colin Law"
 
-#: about.cc:167
+#: about.cc:168
 msgid "Joshua Leach"
 msgstr "Joshua Leach"
 
-#: about.cc:168
+#: about.cc:169
 msgid "Ben Loftis"
 msgstr "Ben Loftis"
 
-#: about.cc:169
+#: about.cc:170
 msgid "Nick Mainsbridge"
 msgstr "Nick Mainsbridge"
 
-#: about.cc:170
+#: about.cc:171
 msgid "Tim Mayberry"
 msgstr "Tim Mayberry"
 
-#: about.cc:171
+#: about.cc:172
 msgid "Doug Mclain"
 msgstr "Doug Mclain"
 
-#: about.cc:172
+#: about.cc:173
 msgid "Todd Naugle"
 msgstr "Todd Naugle"
 
-#: about.cc:173
+#: about.cc:174
 msgid "André Nusser"
 msgstr "André Nusser"
 
-#: about.cc:174
+#: about.cc:175
 msgid "Bent Bisballe Nyeng"
 msgstr "Bent Bisballe Nyeng"
 
-#: about.cc:175
+#: about.cc:176
 msgid "Jack O'Quin"
 msgstr "Jack O'Quin"
 
-#: about.cc:176
+#: about.cc:177
+msgid "Pavel Potocek"
+msgstr "Pavel Potocek"
+
+#: about.cc:178
 msgid "Nimal Ratnayake"
 msgstr "Nimal Ratnayake"
 
-#: about.cc:177
+#: about.cc:179
+msgid "Julien Rivaud"
+msgstr "Julien Rivaud"
+
+#: about.cc:180
 msgid "David Robillard"
 msgstr "David Robillard"
 
-#: about.cc:178
+#: about.cc:181
+msgid "Julien Roger"
+msgstr "Julien Roger"
+
+#: about.cc:182
 msgid "Taybin Rutkin"
 msgstr "Taybin Rutkin"
 
-#: about.cc:179
+#: about.cc:183
 msgid "Andreas Ruge"
 msgstr "Andreas Ruge"
 
-#: about.cc:180
+#: about.cc:184
 msgid "Sampo Savolainen"
 msgstr "Sampo Savolainen"
 
-#: about.cc:181
+#: about.cc:185
 msgid "Rodrigo Severo"
 msgstr "Rodrigo Severo"
 
-#: about.cc:182
+#: about.cc:186
 msgid "Per Sigmond"
 msgstr "Per Sigmond"
 
-#: about.cc:183
+#: about.cc:187
 msgid "Lincoln Spiteri"
 msgstr "Lincoln Spiteri"
 
-#: about.cc:184
+#: about.cc:188
 msgid "Mike Start"
 msgstr "Mike Start"
 
-#: about.cc:185
+#: about.cc:189
 msgid "Mark Stewart"
 msgstr "Mark Stewart"
 
-#: about.cc:186
+#: about.cc:190
 msgid "Roland Stigge"
 msgstr "Roland Stigge"
 
-#: about.cc:187
+#: about.cc:191
 msgid "Petter Sundlöf"
 msgstr "Petter Sundlöf"
 
-#: about.cc:188
+#: about.cc:192
 msgid "Mike Täht"
 msgstr "Mike Täht"
 
-#: about.cc:189
+#: about.cc:193
 msgid "Roy Vegard"
 msgstr "Roy Vegard"
 
-#: about.cc:190
+#: about.cc:194
 msgid "Thorsten Wilms"
 msgstr "Thorsten Wilms"
 
-#: about.cc:191
+#: about.cc:195
 msgid "Damien Zammit"
 msgstr "Damien Zammit"
 
-#: about.cc:192
+#: about.cc:196
 msgid "Grygorii Zharun"
 msgstr "Grygorii Zharun"
 
-#: about.cc:197
+#: about.cc:201
 msgid ""
 "French:\n"
 "\tAlain Fréhel <alain.frehel at free.fr>\n"
@@ -301,7 +317,7 @@ msgstr ""
 "\tMartin Blanchard\n"
 "\tRomain Arnaud <roming22 at gmail.com>\n"
 
-#: about.cc:198
+#: about.cc:202
 msgid ""
 "German:\n"
 "\tKarsten Petersen <kapet at kapet.de>\n"
@@ -321,7 +337,7 @@ msgstr ""
 "\tRichard Oax <richard at pagliacciempire.de>\n"
 "\tRobin Gloster <robin at loc-com.de>\n"
 
-#: about.cc:205
+#: about.cc:209
 msgid ""
 "Italian:\n"
 "\tFilippo Pappalardo <filippo at email.it>\n"
@@ -331,7 +347,7 @@ msgstr ""
 "\tFilippo Pappalardo <filippo at email.it>\n"
 "\tRaffaele Morelli <raffaele.morelli at gmail.com>\n"
 
-#: about.cc:206
+#: about.cc:210
 msgid ""
 "Portuguese:\n"
 "\tRui Nuno Capela <rncbc at rncbc.org>\n"
@@ -339,7 +355,7 @@ msgstr ""
 "Португальский:\n"
 "\tRui Nuno Capela <rncbc at rncbc.org>\n"
 
-#: about.cc:207
+#: about.cc:211
 msgid ""
 "Brazilian Portuguese:\n"
 "\tAlexander da Franca Fernandes <alexander at nautae.eti.br>\n"
@@ -349,7 +365,7 @@ msgstr ""
 "\tAlexander da Franca Fernandes <alexander at nautae.eti.br>\n"
 "\tChris Ross <chris at tebibyte.org>\n"
 
-#: about.cc:209
+#: about.cc:213
 msgid ""
 "Spanish:\n"
 "\t Alex Krohn <alexkrohn at fastmail.fm>\n"
@@ -359,7 +375,7 @@ msgstr ""
 "\t Alex Krohn <alexkrohn at fastmail.fm>\n"
 "\tPablo Fernández <pablo.fbus at gmail.com>\n"
 
-#: about.cc:210
+#: about.cc:214
 msgid ""
 "Russian:\n"
 "\t Igor Blinov <pitstop at nm.ru>\n"
@@ -368,9 +384,9 @@ msgstr ""
 "Русский:\n"
 "\tИгорь Блинов <pitstop at nm.ru>\n"
 "\tАлександр Прокудин <alexandre.prokoudine at gmail.com>\n"
-"\tАлександр Кольцов <ag1455 at mail.ru>"
+"\tАлександр Кольцов <ag1455 at mail.ru>\n"
 
-#: about.cc:212
+#: about.cc:216
 msgid ""
 "Greek:\n"
 "\t Klearchos Gourgourinis <muadib at in.gr>\n"
@@ -378,7 +394,7 @@ msgstr ""
 "Греческий:\n"
 "\t Klearchos Gourgourinis <muadib at in.gr>\n"
 
-#: about.cc:213
+#: about.cc:217
 msgid ""
 "Swedish:\n"
 "\t Petter Sundlöf <petter.sundlof at gmail.com>\n"
@@ -386,7 +402,7 @@ msgstr ""
 "Шведский:\n"
 "\t Petter Sundlöf <petter.sundlof at gmail.com>\n"
 
-#: about.cc:214
+#: about.cc:218
 msgid ""
 "Polish:\n"
 "\t Piotr Zaryk <pzaryk at gmail.com>\n"
@@ -394,7 +410,7 @@ msgstr ""
 "Польский:\n"
 "\t Piotr Zaryk <pzaryk at gmail.com>\n"
 
-#: about.cc:215
+#: about.cc:219
 msgid ""
 "Czech:\n"
 "\t Pavel Fric <pavelfric at seznam.cz>\n"
@@ -402,7 +418,7 @@ msgstr ""
 "Чешский:\n"
 "\t Pavel Fric <pavelfric at seznam.cz>\n"
 
-#: about.cc:216
+#: about.cc:220
 msgid ""
 "Norwegian:\n"
 "\t Eivind Ødegård\n"
@@ -410,7 +426,7 @@ msgstr ""
 "Норвежский:\n"
 "\t Eivind Ødegård\n"
 
-#: about.cc:217
+#: about.cc:221
 msgid ""
 "Chinese:\n"
 "\t Rui-huai Zhang <zrhzrh at mail.ustc.edu.cn>\n"
@@ -418,49 +434,53 @@ msgstr ""
 "Китайский:\n"
 "\t Rui-huai Zhang <zrhzrh at mail.ustc.edu.cn>\n"
 
-#: about.cc:597
+#: about.cc:601
 msgid "Intel 64-bit"
 msgstr "Intel 64-bit"
 
-#: about.cc:599
+#: about.cc:603
 msgid "Intel 32-bit"
 msgstr "Intel 32-bit"
 
-#: about.cc:601
+#: about.cc:605
 msgid "PowerPC 64-bit"
 msgstr "PowerPC 64-bit"
 
-#: about.cc:603
+#: about.cc:607
 msgid "PowerPC 32-bit"
 msgstr "PowerPC 32-bit"
 
-#: about.cc:605
+#: about.cc:609
 msgid "64-bit"
 msgstr "64-bit"
 
-#: about.cc:607
+#: about.cc:611
 msgid "32-bit"
 msgstr "32-bit"
 
-#: about.cc:615
+#: about.cc:619
+msgid " - debug"
+msgstr " - отладка"
+
+#: about.cc:625
 msgid "Copyright (C) 1999-2015 Paul Davis\n"
 msgstr "Авторские права (C) 1999-2015 Paul Davis\n"
 
-#: about.cc:619
+#: about.cc:629
 msgid "http://ardour.org/"
 msgstr "http://ardour.org/"
 
-#: about.cc:620
+#: about.cc:630
 msgid ""
 "%1%2\n"
-"(built from revision %3)\n"
-"%4"
+"(rev %3)\n"
+"%4%5"
 msgstr ""
 "%1%2\n"
-"(собрано из редакции %3)\n"
-"%4"
+"(редакция %3)\n"
+"%4%5"
 
-#: about.cc:625
+#: about.cc:635
 msgid "Config"
 msgstr "Конфигурация сборки"
 
@@ -480,108 +500,134 @@ msgstr "Файл определения меню %1 не найден"
 msgid "%1 will not work without a valid menu definition file"
 msgstr "%1 не будет работать без правильного меню описания файла"
 
-#: add_route_dialog.cc:54 route_params_ui.cc:524
-msgid "Add Track or Bus"
-msgstr "Добавить дорожку или шину"
+#: add_route_dialog.cc:58
+msgid "Add Track/Bus/VCA"
+msgstr "Добавить дорожки/шины/VCA"
 
-#: add_route_dialog.cc:57
+#: add_route_dialog.cc:61
 msgid "Configuration:"
 msgstr "Конфигурация:"
 
-#: add_route_dialog.cc:58
+#: add_route_dialog.cc:62
 msgid "Record Mode:"
 msgstr "Режим записи:"
 
-#: add_route_dialog.cc:59
+#: add_route_dialog.cc:63
 msgid "Instrument:"
 msgstr "Инструмент:"
 
-#: add_route_dialog.cc:77
+#: add_route_dialog.cc:77 add_route_dialog.cc:228
 msgid "Audio Tracks"
 msgstr "Звуковые дорожки"
 
-#: add_route_dialog.cc:78 add_route_dialog.cc:209
+#: add_route_dialog.cc:78 add_route_dialog.cc:224
 msgid "MIDI Tracks"
 msgstr "MIDI-дорожки"
 
-#: add_route_dialog.cc:79 add_route_dialog.cc:211
+#: add_route_dialog.cc:79 add_route_dialog.cc:226
 msgid "Audio+MIDI Tracks"
 msgstr "Смешанные дорожки (Звук+MIDI)"
 
-#: add_route_dialog.cc:80 add_route_dialog.cc:207
-msgid "Busses"
-msgstr "Шины"
+#: add_route_dialog.cc:80 add_route_dialog.cc:220
+msgid "Audio Busses"
+msgstr "Аудиошины"
+
+#: add_route_dialog.cc:81 add_route_dialog.cc:222
+msgid "MIDI Busses"
+msgstr "MIDI-шины"
+
+#: add_route_dialog.cc:82
+msgid "VCA Masters"
+msgstr "VCA-мастер"
 
-#: add_route_dialog.cc:83 add_route_dialog.cc:554
+#: add_route_dialog.cc:85 add_route_dialog.cc:622
 msgid "First"
 msgstr "В начало"
 
-#: add_route_dialog.cc:84 add_route_dialog.cc:558
+#: add_route_dialog.cc:86 add_route_dialog.cc:626
 msgid "Before Selection"
 msgstr "Перед выделенным"
 
-#: add_route_dialog.cc:85 add_route_dialog.cc:556
+#: add_route_dialog.cc:87 add_route_dialog.cc:624
 msgid "After Selection"
 msgstr "После выделенного"
 
-#: add_route_dialog.cc:86
+#: add_route_dialog.cc:88
 msgid "Last"
 msgstr "В конец"
 
-#: add_route_dialog.cc:103
+#: add_route_dialog.cc:91
+msgid "Flexible-I/O"
+msgstr "Гибкий I/O"
+
+#: add_route_dialog.cc:92
+msgid "Strict-I/O"
+msgstr "Строгий I/O"
+
+#: add_route_dialog.cc:108
 msgid "Add:"
 msgstr "Добавить:"
 
-#: add_route_dialog.cc:116 time_fx_dialog.cc:91 add_video_dialog.cc:135
+#: add_route_dialog.cc:121 time_fx_dialog.cc:101 add_video_dialog.cc:136
 #: video_server_dialog.cc:118
 msgid "<b>Options</b>"
 msgstr "<b>Параметры</b>"
 
-#: add_route_dialog.cc:126 bundle_manager.cc:193 region_editor.cc:52
-#: route_group_dialog.cc:71
+#: add_route_dialog.cc:131 bundle_manager.cc:193 region_editor.cc:52
+#: route_group_dialog.cc:70
 msgid "Name:"
 msgstr "Имя:"
 
-#: add_route_dialog.cc:156
+#: add_route_dialog.cc:155
 msgid "Group:"
 msgstr "Группа:"
 
-#: add_route_dialog.cc:162
+#: add_route_dialog.cc:161
 msgid "Insert:"
 msgstr "Вставить:"
 
-#: add_route_dialog.cc:223 add_route_dialog.cc:232 add_route_dialog.cc:306
-#: ardour_ui_ed.cc:574 engine_dialog.cc:242 rc_option_editor.cc:2257
-#: rc_option_editor.cc:2259 rc_option_editor.cc:2261 rc_option_editor.cc:2279
-#: rc_option_editor.cc:2281 rc_option_editor.cc:2290 rc_option_editor.cc:2292
-#: rc_option_editor.cc:2310 rc_option_editor.cc:2323 rc_option_editor.cc:2326
-#: rc_option_editor.cc:2328 rc_option_editor.cc:2373 rc_option_editor.cc:2375
-#: rc_option_editor.cc:2377 rc_option_editor.cc:2385 rc_option_editor.cc:2393
-#: rc_option_editor.cc:2395 rc_option_editor.cc:2403
+#: add_route_dialog.cc:171
+msgid "Output Ports:"
+msgstr "Порты выхода:"
+
+#: add_route_dialog.cc:176 rc_option_editor.cc:2474
+msgid ""
+"With strict-i/o enabled, Effect Processors will not modify the number of "
+"channels on a track. The number of output channels will always match the "
+"number of input channels."
+msgstr ""
+"С включенным строгим I/O эффект-процессоры не будут изменять число каналов в "
+"дорожке. Количество выходных каналов всегда будет соответствовать количеству "
+"входных каналов."
+
+#: add_route_dialog.cc:240 add_route_dialog.cc:351 ardour_ui_ed.cc:625
+#: engine_dialog.cc:244 plugin_pin_dialog.cc:67 rc_option_editor.cc:2397
+#: rc_option_editor.cc:2399 rc_option_editor.cc:2401 rc_option_editor.cc:2419
+#: rc_option_editor.cc:2421 rc_option_editor.cc:2429 rc_option_editor.cc:2432
+#: rc_option_editor.cc:2450 rc_option_editor.cc:2463 rc_option_editor.cc:2472
+#: rc_option_editor.cc:2478 rc_option_editor.cc:2480 rc_option_editor.cc:2525
+#: rc_option_editor.cc:2527 rc_option_editor.cc:2529 rc_option_editor.cc:2537
 msgid "Audio"
 msgstr "Аудио"
 
-#: add_route_dialog.cc:224 add_route_dialog.cc:235 add_route_dialog.cc:307
-#: editor_actions.cc:110 engine_dialog.cc:244 missing_file_dialog.cc:60
-#: rc_option_editor.cc:2536 rc_option_editor.cc:2538 rc_option_editor.cc:2548
-#: rc_option_editor.cc:2557 rc_option_editor.cc:2565 rc_option_editor.cc:2573
-#: rc_option_editor.cc:2581 rc_option_editor.cc:2589 rc_option_editor.cc:2591
-#: rc_option_editor.cc:2599 rc_option_editor.cc:2601 rc_option_editor.cc:2609
-#: rc_option_editor.cc:2618 rc_option_editor.cc:2620 rc_option_editor.cc:2628
-#: rc_option_editor.cc:2636 rc_option_editor.cc:2645 rc_option_editor.cc:2654
-#: rc_option_editor.cc:2677
+#: add_route_dialog.cc:243 add_route_dialog.cc:352 editor_actions.cc:112
+#: engine_dialog.cc:246 missing_file_dialog.cc:60 mixer_ui.cc:1895
+#: plugin_pin_dialog.cc:68 rc_option_editor.cc:2672 rc_option_editor.cc:2674
+#: rc_option_editor.cc:2684 rc_option_editor.cc:2693 rc_option_editor.cc:2701
+#: rc_option_editor.cc:2709 rc_option_editor.cc:2717 rc_option_editor.cc:2790
+#: rc_option_editor.cc:2813
 msgid "MIDI"
 msgstr "MIDI"
 
-#: add_route_dialog.cc:225 add_route_dialog.cc:238 add_route_dialog.cc:308
+#: add_route_dialog.cc:246 add_route_dialog.cc:353
 msgid "Audio+MIDI"
 msgstr "Аудио+MIDI"
 
-#: add_route_dialog.cc:226 add_route_dialog.cc:241 add_route_dialog.cc:309
+#: add_route_dialog.cc:250 add_route_dialog.cc:354
 msgid "Bus"
 msgstr "Шина"
 
-#: add_route_dialog.cc:268
+#: add_route_dialog.cc:286
 msgid ""
 "Audio+MIDI tracks are intended for use <b>ONLY</b> with plugins that use "
 "both audio and MIDI input data\n"
@@ -596,60 +642,61 @@ msgstr ""
 "Если вы не собираетесь использовать такие плагины, используйте обычные "
 "звуковые и MIDI-дорожки."
 
-#: add_route_dialog.cc:327 add_route_dialog.cc:346 editor_actions.cc:438
-#: editor_rulers.cc:250 time_axis_view.cc:1383
+#: add_route_dialog.cc:373 add_route_dialog.cc:385 editor_actions.cc:456
+#: editor_rulers.cc:250 time_axis_view.cc:1294
 msgid "Normal"
 msgstr "Обычный"
 
-#: add_route_dialog.cc:330 add_route_dialog.cc:348
+#: add_route_dialog.cc:374 add_route_dialog.cc:387
 msgid "Non Layered"
 msgstr "Бесслойный"
 
-#: add_route_dialog.cc:331 add_route_dialog.cc:350
+#: add_route_dialog.cc:375 add_route_dialog.cc:389
 msgid "Tape"
 msgstr "Плёночный"
 
-#: add_route_dialog.cc:431 monitor_section.cc:272
+#: add_route_dialog.cc:476 monitor_section.cc:273 plugin_pin_dialog.cc:509
+#: plugin_setup_dialog.cc:202
 msgid "Mono"
 msgstr "Моно"
 
-#: add_route_dialog.cc:435
+#: add_route_dialog.cc:480 plugin_pin_dialog.cc:512 plugin_setup_dialog.cc:205
 msgid "Stereo"
 msgstr "Стерео"
 
-#: add_route_dialog.cc:459
+#: add_route_dialog.cc:503
 msgid "3 Channel"
 msgstr "3 канала"
 
-#: add_route_dialog.cc:463
+#: add_route_dialog.cc:507
 msgid "4 Channel"
 msgstr "4 канала"
 
-#: add_route_dialog.cc:467
+#: add_route_dialog.cc:511
 msgid "5 Channel"
 msgstr "5 каналов"
 
-#: add_route_dialog.cc:471
+#: add_route_dialog.cc:515
 msgid "6 Channel"
 msgstr "6 каналов"
 
-#: add_route_dialog.cc:475
+#: add_route_dialog.cc:519
 msgid "8 Channel"
 msgstr "8 каналов"
 
-#: add_route_dialog.cc:479
+#: add_route_dialog.cc:523
 msgid "12 Channel"
 msgstr "3 канала"
 
-#: add_route_dialog.cc:483 mixer_strip.cc:1918 mixer_strip.cc:2351
+#: add_route_dialog.cc:527 mixer_strip.cc:2017 mixer_strip.cc:2463
 msgid "Custom"
 msgstr "На заказ"
 
-#: add_route_dialog.cc:516 add_route_dialog.cc:532 route_group_menu.cc:81
+#: add_route_dialog.cc:569 add_route_dialog.cc:585 route_group_menu.cc:85
 msgid "New Group..."
 msgstr "Создать группу..."
 
-#: add_route_dialog.cc:520 route_group_menu.cc:85
+#: add_route_dialog.cc:573 route_group_menu.cc:89
 msgid "No Group"
 msgstr "Нет группы"
 
@@ -679,67 +726,68 @@ msgstr ""
 msgid "Done"
 msgstr "Готово"
 
-#: analysis_window.cc:46
+#: analysis_window.cc:45
 msgid "Signal source"
 msgstr "Источник сигнала"
 
-#: analysis_window.cc:47
+#: analysis_window.cc:46
 msgid "Selected ranges"
 msgstr "Выбранные выделения"
 
-#: analysis_window.cc:48
+#: analysis_window.cc:47
 msgid "Selected regions"
 msgstr "Выделенные области"
 
-#: analysis_window.cc:50
-msgid "Display model"
-msgstr "Модель отображения"
-
-#: analysis_window.cc:51
-msgid "Composite graphs for each track"
-msgstr "Составной график для каждой дорожки"
-
-#: analysis_window.cc:52
-msgid "Composite graph of all tracks"
-msgstr "Составной график для всех дорожек"
-
-#: analysis_window.cc:54
+#: analysis_window.cc:48
 msgid "Show frequency power range"
 msgstr "Показ диапазона частотной мощности"
 
-#: analysis_window.cc:55
-msgid "Normalize values"
-msgstr "Нормировать значения"
+#: analysis_window.cc:49
+msgid "Fit dB range"
+msgstr ""
+
+#: analysis_window.cc:50
+msgid "Proportional Spectrum, -18dB"
+msgstr ""
 
-#: analysis_window.cc:59
+#: analysis_window.cc:53
 msgid "FFT analysis window"
 msgstr "Спектральный анализ"
 
-#: analysis_window.cc:60 editor.cc:1848
+#: analysis_window.cc:54 editor.cc:1954
 msgid "Spectral Analysis"
 msgstr "Спектральный анализ"
 
-#: analysis_window.cc:67 editor_actions.cc:143 session_metadata_dialog.cc:667
+#: analysis_window.cc:61 editor_actions.cc:145 session_metadata_dialog.cc:670
 msgid "Track"
 msgstr "Дорожка"
 
-#: analysis_window.cc:68 editor_actions.cc:664 mixer_ui.cc:135 mixer_ui.cc:2040
+#: analysis_window.cc:62 ardour_ui_ed.cc:254 ardour_ui_ed.cc:255
+#: ardour_ui_ed.cc:256 editor_actions.cc:689 mixer_ui.cc:151 mixer_ui.cc:2134
 msgid "Show"
 msgstr "Показать"
 
-#: analysis_window.cc:135
+#: analysis_window.cc:107
 msgid "Re-analyze data"
 msgstr "Повторно проанализировать данные"
 
-#: ardour_button.cc:820
+#: ardour_button.cc:876
 msgid "button cannot watch state of non-existing Controllable\n"
 msgstr "Кнопка не может видеть состояние несуществующего управляемого\n"
 
-#: ardour_button.cc:1088
+#: ardour_button.cc:1144
 msgid "ABCDEFGHIJLKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
 msgstr "ABCDEFGHIJLKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
 
-#: ardour_ui.cc:174
+#: ardour_http.cc:165 ardour_http.cc:179
+msgid "HTTP request failed: (%1) %2"
+msgstr ""
+
+#: ardour_http.cc:169 ardour_http.cc:182
+msgid "HTTP request status: %1"
+msgstr ""
+
+#: ardour_ui.cc:198
 msgid ""
 "%1 %2.x has discovered configuration files from %1 %3.x.\n"
 "\n"
@@ -751,84 +799,153 @@ msgstr ""
 "\n"
 "Вы хотите, чтобы %1 %2.x использовал эти настройки?\n"
 "\n"
-"(%1 придётся перезапустить.)\n"
+"(%1 придётся перезапустить.)"
 
-#: ardour_ui.cc:253 editor_actions.cc:658 region_editor.cc:53
+#: ardour_ui.cc:283 editor_actions.cc:683 region_editor.cc:53
 msgid "Audition"
 msgstr "Контроль"
 
-#: ardour_ui.cc:254 editor_actions.cc:137 mixer_strip.cc:2101
-#: monitor_section.cc:328 rc_option_editor.cc:2413 route_time_axis.cc:255
-#: route_time_axis.cc:2748
+#: ardour_ui.cc:284 editor_actions.cc:139 mixer_strip.cc:2213
+#: monitor_section.cc:329 rc_option_editor.cc:2547 route_time_axis.cc:263
+#: route_time_axis.cc:2740 vca_master_strip.cc:212 vca_time_axis.cc:237
 msgid "Solo"
 msgstr "Соло"
 
-#: ardour_ui.cc:255 rc_option_editor.cc:1356
+#: ardour_ui.cc:285 rc_option_editor.cc:1357
 msgid "Feedback"
 msgstr "Отклик"
 
-#: ardour_ui.cc:264 speaker_dialog.cc:36
+#: ardour_ui.cc:296 speaker_dialog.cc:36
 msgid "Speaker Configuration"
 msgstr "Конфигурация громкоговорителей"
 
-#: ardour_ui.cc:265 keyeditor.cc:53
-msgid "Key Bindings"
-msgstr "Клавиатурные комбинации"
-
-#: ardour_ui.cc:266
-msgid "Preferences"
-msgstr "Параметры"
-
-#: ardour_ui.cc:267 ardour_ui.cc:274
+#: ardour_ui.cc:297
 msgid "Add Tracks/Busses"
 msgstr "Добавить дорожки/шины"
 
-#: ardour_ui.cc:268
+#: ardour_ui.cc:298
 msgid "About"
 msgstr "О программе"
 
-#: ardour_ui.cc:269 location_ui.cc:1143 session_option_editor.cc:210
-#: session_option_editor.cc:216 session_option_editor.cc:223
-msgid "Locations"
+#: ardour_ui.cc:299 location_ui.cc:1167
+msgid "Ranges|Locations"
 msgstr "Позиции"
 
-#: ardour_ui.cc:270 route_params_ui.cc:59 route_params_ui.cc:630
+#: ardour_ui.cc:300 route_params_ui.cc:59 route_params_ui.cc:620
 msgid "Tracks and Busses"
 msgstr "Дорожки и шины"
 
-#: ardour_ui.cc:271 engine_dialog.cc:73
+#: ardour_ui.cc:301 engine_dialog.cc:73
 msgid "Audio/MIDI Setup"
 msgstr "Настройка звука и MIDI"
 
-#: ardour_ui.cc:272
+#: ardour_ui.cc:302
 msgid "Video Export Dialog"
 msgstr "Диалог экспорта видео"
 
-#: ardour_ui.cc:273
+#: ardour_ui.cc:303 lua_script_manager.cc:30
+msgid "Script Manager"
+msgstr "Управление скриптами"
+
+#: ardour_ui.cc:304
 msgid "Properties"
 msgstr "Свойства"
 
-#: ardour_ui.cc:275 bundle_manager.cc:264
+#: ardour_ui.cc:305
+msgid "Add Video"
+msgstr "Добавить видео"
+
+#: ardour_ui.cc:306 bundle_manager.cc:264
 msgid "Bundle Manager"
 msgstr "Управление пакетами"
 
-#: ardour_ui.cc:276 big_clock_window.cc:37
+#: ardour_ui.cc:307 big_clock_window.cc:37
 msgid "Big Clock"
 msgstr "Большой счётчик"
 
-#: ardour_ui.cc:277
+#: ardour_ui.cc:308
 msgid "Audio Connections"
 msgstr "Звуковые соединения"
 
-#: ardour_ui.cc:278
+#: ardour_ui.cc:309
 msgid "MIDI Connections"
 msgstr "Соединения MIDI"
 
-#: ardour_ui.cc:295
+#: ardour_ui.cc:310
+msgid "Bindings Editor"
+msgstr "Редактор клавиатурных комбинаций"
+
+#: ardour_ui.cc:321 editor.cc:1289
+msgid "Window|Editor"
+msgstr "Редактор"
+
+#: ardour_ui.cc:322 mixer_ui.cc:2210 mixer_ui.cc:2216
+msgid "Window|Mixer"
+msgstr "Микшер"
+
+#: ardour_ui.cc:323
+msgid "Window|Preferences"
+msgstr "Параметры"
+
+#: ardour_ui.cc:330
 msgid "Your configuration files were copied. You can now restart %1."
 msgstr "Ваши файлы с настройками скопированы. Можно перезапустить %1."
 
-#: ardour_ui.cc:527
+#: ardour_ui.cc:509
+msgid "Pre-Release Warning"
+msgstr ""
+
+#: ardour_ui.cc:513
+msgid ""
+"<b>Welcome to this pre-release build of %1 %2</b>\n"
+"\n"
+"There are still several issues and bugs to be worked on,\n"
+"as well as general workflow improvements, before this can be considered\n"
+"release software. So, a few guidelines:\n"
+"\n"
+"1) Please do <b>NOT</b> use this software with the expectation that it is "
+"stable or reliable\n"
+"   though it may be so, depending on your workflow.\n"
+"2) Please wait for a helpful writeup of new features.\n"
+"3) <b>Please do NOT use the forums at ardour.org to report issues</b>.\n"
+"4) Please <b>DO</b> use the bugtracker at http://tracker.ardour.org/ to "
+"report issues\n"
+"   making sure to note the product version number as 5.0-pre.\n"
+"5) Please <b>DO</b> use the ardour-users mailing list to discuss ideas and "
+"pass on comments.\n"
+"6) Please <b>DO</b> join us on IRC for real time discussions about %1 %2. "
+"You\n"
+"   can get there directly from within the program via the Help->Chat menu "
+"option.\n"
+"\n"
+"Full information on all the above can be found on the support page at\n"
+"\n"
+"                http://ardour.org/support\n"
+msgstr ""
+"<b>Перед вами БЕТА-версия %1 %2</b>\n"
+"\n"
+"Версия для Linux уже выпущена, но за отсутствием достаточного количества\n"
+"тестировщиков версия для OS X является бетой. Отсюда — несколько советов:\n"
+"\n"
+"1) Пожалуйста,  <b>НЕ</b> используйте программу в надежде на то, что она\n"
+"   достаточно стабильна для повседневного использования, хотя для кого-то\n"
+"   это и может быть так.\n"
+"2) <b>Пожалуйста, НЕ используйте форум на ardour.org для сообщения об "
+"ошибках</b>.\n"
+"3) Пожалуйста, <b>ИСПОЛЬЗУЙТЕ</b> трекер на http://tracker.ardour.org/ для\n"
+"   сообщения об ошибках, не забыв указать, что они относятся к 5.0-pre.\n"
+"4) Пожалуйста, <b>ПИШИТЕ</b> в список рассылки ardour-users свои "
+"комментарии\n"
+"   и идеи касательно новой версии.\n"
+"5) Пожалуйста, <b>ИСПОЛЬЗУЙТЕ</b>  наш канал IRC для обсуждения ardour3\n"
+"   с разработчиками программы в режиме реального времени. Вы можете\n"
+"   сделать это, выбрав в главном меню пункт «Справка > Пообщаться».\n"
+"\n"
+"Более подробную информацию обо всём этом можно получить на странице\n"
+"\n"
+"                http://ardour.org/support\n"
+
+#: ardour_ui.cc:613
 msgid ""
 "The audio backend was shutdown because:\n"
 "\n"
@@ -838,7 +955,7 @@ msgstr ""
 "\n"
 "%1"
 
-#: ardour_ui.cc:529
+#: ardour_ui.cc:615
 msgid ""
 "The audio backend has either been shutdown or it\n"
 "disconnected %1 because %1\n"
@@ -850,7 +967,7 @@ msgstr ""
 "работал недостаточно быстро. Попробуйте снова\n"
 "запустить подсистему и сохранить сессию."
 
-#: ardour_ui.cc:553
+#: ardour_ui.cc:639
 msgid ""
 "Audio Unit Plugin Scan Failed. Automatic AU scanning has been disabled. "
 "Please see the log window for further details."
@@ -858,39 +975,39 @@ msgstr ""
 "Не удалось просканировать плагины Audio Unit. Автоматическое сканирование AU "
 "выключено. Подробности указаны в окне журнала."
 
-#: ardour_ui.cc:554
+#: ardour_ui.cc:640
 msgid "Audio Unit Plugin Scan Failed:"
 msgstr "Не удалось просканировать плагины Audio Unit:"
 
-#: ardour_ui.cc:903
+#: ardour_ui.cc:1008
 msgid "NSM server did not announce itself"
 msgstr "Сервер NSM не объявлял о себе"
 
-#: ardour_ui.cc:916
+#: ardour_ui.cc:1021
 msgid "NSM: no client ID provided"
 msgstr "NSM: не предоставлен ни один ID-клиент"
 
-#: ardour_ui.cc:923
+#: ardour_ui.cc:1028
 msgid "NSM: no session created"
 msgstr "NSM: нет созданной сессии"
 
-#: ardour_ui.cc:946
+#: ardour_ui.cc:1051
 msgid "NSM: initialization failed"
 msgstr "NSM: сбой инициализации"
 
-#: ardour_ui.cc:978
+#: ardour_ui.cc:1083
 msgid "Free/Demo Version Warning"
 msgstr "Предупреждение демоверсии"
 
-#: ardour_ui.cc:980
+#: ardour_ui.cc:1085
 msgid "Subscribe and support development of %1"
 msgstr "Подписаться и поддержать разработку %1"
 
-#: ardour_ui.cc:981
+#: ardour_ui.cc:1086
 msgid "Don't warn me about this again"
 msgstr "Больше не предупреждать"
 
-#: ardour_ui.cc:983
+#: ardour_ui.cc:1088
 msgid ""
 "<span weight=\"bold\" size=\"large\">%1</span>\n"
 "\n"
@@ -908,15 +1025,15 @@ msgstr ""
 "\n"
 "%4"
 
-#: ardour_ui.cc:984
+#: ardour_ui.cc:1089
 msgid "This is a free/demo version of %1"
 msgstr "Это демонстрационная версия %1"
 
-#: ardour_ui.cc:985
+#: ardour_ui.cc:1090
 msgid "It will not restore OR save any plugin settings"
 msgstr "Она не сохраняет и не восстанавливает параметры плагинов."
 
-#: ardour_ui.cc:986
+#: ardour_ui.cc:1091
 msgid ""
 "If you load an existing session with plugin settings\n"
 "they will not be used and will be lost."
@@ -924,7 +1041,7 @@ msgstr ""
 "Если вы загрузите существующую сессию, все собственные \n"
 "параметры плагинов будут сброшены и потеряны при сохранении."
 
-#: ardour_ui.cc:988 plugin_ui.cc:579
+#: ardour_ui.cc:1093 plugin_ui.cc:586
 msgid ""
 "To get full access to updates without this limitation\n"
 "consider becoming a subscriber for a low cost every month."
@@ -932,19 +1049,19 @@ msgstr ""
 "Чтобы получить полный доступ к обновлениям без ограничений,\n"
 "необходима ежемесячная подписка по низкой цене."
 
-#: ardour_ui.cc:998
+#: ardour_ui.cc:1103
 msgid "Quit now"
 msgstr "Выйти"
 
-#: ardour_ui.cc:999
+#: ardour_ui.cc:1104
 msgid "Continue using %1"
 msgstr "Продолжить работу"
 
-#: ardour_ui.cc:1032 startup.cc:348
+#: ardour_ui.cc:1135 startup.cc:349
 msgid "%1 is ready for use"
 msgstr "%1 готов к работе"
 
-#: ardour_ui.cc:1074
+#: ardour_ui.cc:1185
 msgid ""
 "WARNING: Your system has a limit for maximum amount of locked memory. This "
 "might cause %1 to run out of memory before your system runs out of memory. \n"
@@ -959,23 +1076,23 @@ msgstr ""
 "Вы можете узнать установленный предел при помощи команды 'ulimit -l'. Обычно "
 "это контролируется в %2."
 
-#: ardour_ui.cc:1091
+#: ardour_ui.cc:1202
 msgid "Do not show this window again"
 msgstr "Больше не показывать это окно"
 
-#: ardour_ui.cc:1135
+#: ardour_ui.cc:1245
 msgid "Don't quit"
 msgstr "Не выходить"
 
-#: ardour_ui.cc:1136
+#: ardour_ui.cc:1246
 msgid "Just quit"
 msgstr "Просто выйти"
 
-#: ardour_ui.cc:1137 ardour_ui.cc:5010
+#: ardour_ui.cc:1247 ardour_ui.cc:5362
 msgid "Save and quit"
 msgstr "Сохранить и выйти"
 
-#: ardour_ui.cc:1147
+#: ardour_ui.cc:1257
 msgid ""
 "%1 was unable to save your session.\n"
 "\n"
@@ -990,11 +1107,11 @@ msgstr ""
 "\n"
 "«Просто выйти»."
 
-#: ardour_ui.cc:1197
+#: ardour_ui.cc:1307
 msgid "Unsaved Session"
 msgstr "Сессия не сохранена"
 
-#: ardour_ui.cc:1218
+#: ardour_ui.cc:1328
 msgid ""
 "The session \"%1\"\n"
 "has not been saved.\n"
@@ -1012,7 +1129,7 @@ msgstr ""
 "\n"
 "Что вы хотите сделать?"
 
-#: ardour_ui.cc:1221
+#: ardour_ui.cc:1331
 msgid ""
 "The snapshot \"%1\"\n"
 "has not been saved.\n"
@@ -1030,106 +1147,107 @@ msgstr ""
 "\n"
 "Что вы хотите сделать?"
 
-#: ardour_ui.cc:1235
+#: ardour_ui.cc:1345
 msgid "Prompter"
 msgstr "Суфлер"
 
-#: ardour_ui.cc:1349 ardour_ui.cc:1357
+#: ardour_ui.cc:1459 ardour_ui.cc:1467
 msgid "Audio: <span foreground=\"red\">none</span>"
 msgstr "Звук: <span foreground=\"red\">нет</span>"
 
-#: ardour_ui.cc:1361
+#: ardour_ui.cc:1471
 #, c-format
 msgid "Audio: <span foreground=\"green\">%.1f kHz / %4.1f ms</span>"
 msgstr "Звук: <span foreground=\"green\">%.1f КГц / %4.1f мс</span>"
 
-#: ardour_ui.cc:1365
+#: ardour_ui.cc:1475
 #, c-format
 msgid "Audio: <span foreground=\"green\">%<PRId64> kHz / %4.1f ms</span>"
 msgstr "Звук: <span foreground=\"green\">%<PRId64> КГц / %4.1f мс</span>"
 
-#: ardour_ui.cc:1383 export_video_dialog.cc:76
+#: ardour_ui.cc:1493 export_report.cc:108 export_report.cc:323
+#: export_video_dialog.cc:76
 msgid "File:"
 msgstr "Файл:"
 
-#: ardour_ui.cc:1387
+#: ardour_ui.cc:1497
 msgid "BWF"
 msgstr "BWF"
 
-#: ardour_ui.cc:1390
+#: ardour_ui.cc:1500
 msgid "WAV"
 msgstr "WAV"
 
-#: ardour_ui.cc:1393
+#: ardour_ui.cc:1503
 msgid "WAV64"
 msgstr "WAV64"
 
-#: ardour_ui.cc:1396 session_option_editor.cc:202
+#: ardour_ui.cc:1506 session_option_editor.cc:202
 msgid "CAF"
 msgstr "CAF"
 
-#: ardour_ui.cc:1399
+#: ardour_ui.cc:1509
 msgid "AIFF"
 msgstr "AIFF"
 
-#: ardour_ui.cc:1402
+#: ardour_ui.cc:1512
 msgid "iXML"
 msgstr "iXML"
 
-#: ardour_ui.cc:1405 session_option_editor.cc:203
+#: ardour_ui.cc:1515 session_option_editor.cc:203
 msgid "RF64"
 msgstr "RF64"
 
-#: ardour_ui.cc:1408
+#: ardour_ui.cc:1518
 msgid "RF64/WAV"
 msgstr "RF64/WAV"
 
-#: ardour_ui.cc:1411
+#: ardour_ui.cc:1521
 msgid "MBWF"
 msgstr "MBWF"
 
-#: ardour_ui.cc:1419
+#: ardour_ui.cc:1529
 msgid "32-float"
 msgstr "32-float"
 
-#: ardour_ui.cc:1422
+#: ardour_ui.cc:1532
 msgid "24-int"
 msgstr "24-int"
 
-#: ardour_ui.cc:1425
+#: ardour_ui.cc:1535
 msgid "16-int"
 msgstr "16-int"
 
-#: ardour_ui.cc:1446
+#: ardour_ui.cc:1556
 #, c-format
 msgid "X: <span foreground=\"%s\">>10K</span>"
 msgstr ""
 
-#: ardour_ui.cc:1448
+#: ardour_ui.cc:1558
 #, c-format
 msgid "X: <span foreground=\"%s\">%u</span>"
 msgstr "X: <span foreground=\"%s\">%u</span>"
 
-#: ardour_ui.cc:1451
+#: ardour_ui.cc:1561
 #, c-format
 msgid "X: <span foreground=\"%s\">?</span>"
 msgstr "X: <span foreground=\"%s\">?</span>"
 
-#: ardour_ui.cc:1454
+#: ardour_ui.cc:1564
 msgid "Audio dropouts. Shift+click to reset"
 msgstr ""
 
-#: ardour_ui.cc:1467
+#: ardour_ui.cc:1577
 #, c-format
 msgid "DSP: <span foreground=\"%s\">%5.1f%%</span>"
 msgstr "ЦП: <span foreground=\"%s\">%5.1f%%</span>"
 
-#: ardour_ui.cc:1477
+#: ardour_ui.cc:1587
 #, c-format
 msgid "PkBld: <span foreground=\"%s\">%d</span>"
 msgstr ""
 
-#: ardour_ui.cc:1499
+#: ardour_ui.cc:1609
 #, c-format
 msgid ""
 "Buffers: <span foreground=\"green\">p:</span><span foreground=\"%s\">"
@@ -1140,29 +1258,29 @@ msgstr ""
 "%%</span> <span foreground=\"green\">c:</span><span foreground=\"%s\">"
 "%<PRIu32>%%</span>"
 
-#: ardour_ui.cc:1540
+#: ardour_ui.cc:1650
 msgid "Disk: <span foreground=\"green\">Unknown</span>"
 msgstr "На диске: <span foreground=\"green\">неизвестно</span>"
 
-#: ardour_ui.cc:1542
+#: ardour_ui.cc:1652
 msgid "Disk: <span foreground=\"green\">24hrs+</span>"
 msgstr "На диске: <span foreground=\"green\">24ч+</span>"
 
-#: ardour_ui.cc:1560
+#: ardour_ui.cc:1670
 msgid "Disk: <span foreground=\"green\">>24 hrs</span>"
 msgstr "На диске: <span foreground=\"green\">>24ч</span>"
 
-#: ardour_ui.cc:1571
+#: ardour_ui.cc:1681
 #, c-format
 msgid "Disk: <span foreground=\"%s\">%02dh:%02dm:%02ds</span>"
 msgstr "На диске:  <span foreground=\"%s\">%02dч:%02dм:%02dс</span>"
 
-#: ardour_ui.cc:1597
+#: ardour_ui.cc:1707
 #, c-format
 msgid "Timecode|TC: <span foreground=\"%s\">%s</span>"
 msgstr "ТК: <span foreground=\"%s\">%s</span>"
 
-#: ardour_ui.cc:1675
+#: ardour_ui.cc:1789
 msgid ""
 "%1 is not connected to any audio backend.\n"
 "You cannot open or close sessions in this condition"
@@ -1170,56 +1288,63 @@ msgstr ""
 "%1 не соединен с какой-либо звуковой подсистемой.\n"
 "Открытие и закрытие сессий невозможно."
 
-#: ardour_ui.cc:1693
+#: ardour_ui.cc:1807
 msgid "Open Session"
 msgstr "Открыть сессию"
 
-#: ardour_ui.cc:1717 session_dialog.cc:407 session_import_dialog.cc:170
-#: session_metadata_dialog.cc:858
+#: ardour_ui.cc:1831 session_dialog.cc:410 session_import_dialog.cc:170
+#: session_metadata_dialog.cc:861
 msgid "%1 sessions"
 msgstr "Cеансы %1"
 
-#: ardour_ui.cc:1748
+#: ardour_ui.cc:1879 ardour_ui.cc:1916
 msgid "You cannot add a track without a session already loaded."
 msgstr "Вы не можете добавить дорожку без загруженной сессии."
 
-#: ardour_ui.cc:1756
+#: ardour_ui.cc:1887
 msgid "could not create %1 new mixed track"
 msgid_plural "could not create %1 new mixed tracks"
-msgstr[0] "Не удалось создать %1 новую смешанную дорожку"
-msgstr[1] "Не удалось создать %1 новых смешанных дорожки"
-msgstr[2] "Не удалось создать %1 новых смешанных дорожек"
-
-#: ardour_ui.cc:1762 ardour_ui.cc:1823
-msgid ""
-"There are insufficient ports available\n"
-"to create a new track or bus.\n"
-"You should save %1, exit and\n"
-"restart with more ports."
-msgstr ""
-"Недостаточно доступных портов для создания новой дорожки или шины.\n"
-"Вам необходимо сохранить %1 и \n"
-"перезапустить программу с большим количеством портов."
-
-#: ardour_ui.cc:1797
+msgstr[0] "Не удалось создать %1 смешанную дорожку"
+msgstr[1] "Не удалось создать %1 смешанных дорожки"
+msgstr[2] "Не удалось создать %1 смешанных дорожек"
+
+#: ardour_ui.cc:1924
+msgid "could not create %1 new Midi Bus"
+msgid_plural "could not create %1 new Midi Busses"
+msgstr[0] "Не удалось создать %1 MIDI-шину"
+msgstr[1] "Не удалось создать %1 MIDI-шины"
+msgstr[2] "Не удалось создать %1 MIDI-шин"
+
+#: ardour_ui.cc:1977
 msgid "You cannot add a track or bus without a session already loaded."
 msgstr "Вы не можете добавить дорожку или шину без открытой сессии."
 
-#: ardour_ui.cc:1806
+#: ardour_ui.cc:1986
 msgid "could not create %1 new audio track"
 msgid_plural "could not create %1 new audio tracks"
 msgstr[0] "Не удалось создать %1 новую звуковую дорожку"
 msgstr[1] "Не удалось создать %2 новых звуковых дорожки"
 msgstr[2] "Не удалось создать %2 новых звуковых дорожек"
 
-#: ardour_ui.cc:1815
+#: ardour_ui.cc:1995
 msgid "could not create %1 new audio bus"
 msgid_plural "could not create %1 new audio busses"
 msgstr[0] "Не удалось создать %1 новую звуковую шину"
 msgstr[1] "Не удалось создать %1 новых звуковых шины"
 msgstr[2] "Не удалось создать %1 новых звуковых шин"
 
-#: ardour_ui.cc:1968
+#: ardour_ui.cc:2020
+msgid ""
+"There are insufficient ports available\n"
+"to create a new track or bus.\n"
+"You should save %1, exit and\n"
+"restart with more ports."
+msgstr ""
+"Недостаточно доступных портов для создания новой дорожки или шины.\n"
+"Вам необходимо сохранить %1 и \n"
+"перезапустить программу с большим количеством портов."
+
+#: ardour_ui.cc:2164
 msgid ""
 "Please create one or more tracks before trying to record.\n"
 "You can do this with the \"Add Track or Bus\" option in the Session menu."
@@ -1228,20 +1353,20 @@ msgstr ""
 "как пытаться что-либо записать.\n"
 "Используйте меню «Сессия > Добавить дорожку/шину»."
 
-#: ardour_ui.cc:2359
+#: ardour_ui.cc:2565
 #, c-format
 msgid "Copied %<PRId64> of %<PRId64>"
 msgstr "Скопировано %<PRId64> из %<PRId64>"
 
-#: ardour_ui.cc:2413 save_as_dialog.cc:33
+#: ardour_ui.cc:2619 save_as_dialog.cc:33
 msgid "Save As"
 msgstr "Сохранить как"
 
-#: ardour_ui.cc:2441
+#: ardour_ui.cc:2647
 msgid "Save As failed: %1"
 msgstr "Не удалось сохранить под другим именем: %1"
 
-#: ardour_ui.cc:2463
+#: ardour_ui.cc:2684
 msgid ""
 "To ensure compatibility with various systems\n"
 "snapshot names may not contain a '%1' character"
@@ -1249,35 +1374,35 @@ msgstr ""
 "Для обеспечения совместимости с различными системами\n"
 "названия снимков не могут содержать символ '%1'."
 
-#: ardour_ui.cc:2477
+#: ardour_ui.cc:2698
 msgid "Confirm Snapshot Overwrite"
 msgstr "Подтвердите перезапись снимка"
 
-#: ardour_ui.cc:2478
+#: ardour_ui.cc:2699
 msgid "A snapshot already exists with that name. Do you want to overwrite it?"
 msgstr "Снимок с таким названием уже существует. Перезаписать его?"
 
-#: ardour_ui.cc:2503
-msgid "Save as..."
-msgstr "Сохранить как..."
+#: ardour_ui.cc:2724
+msgid "Snapshot and switch"
+msgstr ""
 
-#: ardour_ui.cc:2504 ardour_ui.cc:2555
+#: ardour_ui.cc:2725 ardour_ui.cc:2776
 msgid "New session name"
 msgstr "Новое название сессии"
 
-#: ardour_ui.cc:2506
+#: ardour_ui.cc:2727
 msgid "Take Snapshot"
 msgstr "Создать снимок"
 
-#: ardour_ui.cc:2507
+#: ardour_ui.cc:2728
 msgid "Name of new snapshot"
 msgstr "Название нового снимка"
 
-#: ardour_ui.cc:2554
+#: ardour_ui.cc:2775
 msgid "Rename Session"
 msgstr "Переименовать сессию"
 
-#: ardour_ui.cc:2569 ardour_ui.cc:3049 ardour_ui.cc:3087
+#: ardour_ui.cc:2790 ardour_ui.cc:3267 ardour_ui.cc:3305
 msgid ""
 "To ensure compatibility with various systems\n"
 "session names may not contain a '%1' character"
@@ -1285,12 +1410,12 @@ msgstr ""
 "Для обеспечения совместимости с различными системами\n"
 "названия сессий не могут содержать символ '%1'."
 
-#: ardour_ui.cc:2577
+#: ardour_ui.cc:2798
 msgid ""
 "That name is already in use by another directory/folder. Please try again."
 msgstr "Папка с таким названием уже есть. Укажите другое."
 
-#: ardour_ui.cc:2586
+#: ardour_ui.cc:2807
 msgid ""
 "Renaming this session failed.\n"
 "Things could be seriously messed up at this point"
@@ -1298,27 +1423,27 @@ msgstr ""
 "Не удалось переименовать эту сессию.\n"
 "Всё может быть очень, очень плохо."
 
-#: ardour_ui.cc:2702 route_ui.cc:1871
+#: ardour_ui.cc:2923 route_ui.cc:1871
 msgid "Confirm Template Overwrite"
 msgstr "Подтвердите перезапись шаблона"
 
-#: ardour_ui.cc:2703 route_ui.cc:1872
+#: ardour_ui.cc:2924 route_ui.cc:1872
 msgid "A template already exists with that name. Do you want to overwrite it?"
 msgstr "Шаблон с таким названием уже существует. Перезаписать его?"
 
-#: ardour_ui.cc:2727
+#: ardour_ui.cc:2948
 msgid "Save Template"
 msgstr "Сохранить шаблон"
 
-#: ardour_ui.cc:2728
+#: ardour_ui.cc:2949
 msgid "Name for template:"
 msgstr "Название шаблона:"
 
-#: ardour_ui.cc:2729
+#: ardour_ui.cc:2950
 msgid "-template"
 msgstr "-шаблон"
 
-#: ardour_ui.cc:2766
+#: ardour_ui.cc:2987
 msgid ""
 "This session\n"
 "%1\n"
@@ -1328,39 +1453,39 @@ msgstr ""
 "%1\n"
 "уже существует. Открыть её?"
 
-#: ardour_ui.cc:2776
+#: ardour_ui.cc:2997
 msgid "Open Existing Session"
 msgstr "Открыть существующую сессю"
 
-#: ardour_ui.cc:3077
+#: ardour_ui.cc:3295
 msgid "There is no existing session at \"%1\""
 msgstr "По адресу \"%1\" не существующей сессии"
 
-#: ardour_ui.cc:3171
+#: ardour_ui.cc:3391
 msgid "Please wait while %1 loads your session"
 msgstr "Дождитесь завершения загрузки сессии в %1"
 
-#: ardour_ui.cc:3186
+#: ardour_ui.cc:3406
 msgid "Port Registration Error"
 msgstr "Ошибка регистрации порта"
 
-#: ardour_ui.cc:3187
+#: ardour_ui.cc:3407
 msgid "Click the Close button to try again."
 msgstr "Щелкните кнопку «Закрыть» для возврата к предыдущему диалогу."
 
-#: ardour_ui.cc:3206
+#: ardour_ui.cc:3426
 msgid "Session \"%1 (snapshot %2)\" did not load successfully: %3"
 msgstr "Не удалось успешно загрузить сеанс \"%1 (снимок %2)\": %3"
 
-#: ardour_ui.cc:3212 ardour_ui.cc:3233 ardour_ui.cc:3330 ardour_ui.cc:3339
+#: ardour_ui.cc:3432 ardour_ui.cc:3453 ardour_ui.cc:3548 ardour_ui.cc:3557
 msgid "Loading Error"
 msgstr "Ошибка при загрузке"
 
-#: ardour_ui.cc:3227
+#: ardour_ui.cc:3447
 msgid "Session \"%1 (snapshot %2)\" did not load successfully"
 msgstr "Не удалось загрузить сессию \"%1 (снимок %2)\""
 
-#: ardour_ui.cc:3255
+#: ardour_ui.cc:3475
 msgid ""
 "This session has been opened in read-only mode.\n"
 "\n"
@@ -1370,19 +1495,19 @@ msgstr ""
 "\n"
 "Вы не сможете записывать или сохранять."
 
-#: ardour_ui.cc:3260
+#: ardour_ui.cc:3480
 msgid "Read-only Session"
 msgstr "Сессия в режиме чтения"
 
-#: ardour_ui.cc:3329
+#: ardour_ui.cc:3547
 msgid "Could not create session in \"%1\": %2"
 msgstr "Не удалось создать сессию в \"%1\": %2"
 
-#: ardour_ui.cc:3338
+#: ardour_ui.cc:3556
 msgid "Could not create session in \"%1\""
 msgstr "Не удалось создать сессию «%1»"
 
-#: ardour_ui.cc:3378
+#: ardour_ui.cc:3601
 msgid ""
 "<b>Just ask and wait for an answer.\n"
 "It may take from minutes to hours.</b>"
@@ -1390,11 +1515,11 @@ msgstr ""
 "<b>Просто спросите и терпеливо подождите ответа.\n"
 "Это может занять от нескольких минут до пары часов.</b>"
 
-#: ardour_ui.cc:3380
+#: ardour_ui.cc:3603
 msgid "About the Chat"
 msgstr "О чате"
 
-#: ardour_ui.cc:3381
+#: ardour_ui.cc:3604
 msgid ""
 "When you're inside the chat just ask your question and wait for an answer. "
 "The chat is occupied by real people with real lives so many of them are "
@@ -1413,16 +1538,16 @@ msgstr ""
 "Оставьте окно чата открытым и периодически заглядывайте туда, чтобы узнать, "
 "не ответил ли вам кто."
 
-#: ardour_ui.cc:3500
+#: ardour_ui.cc:3723
 msgid "No files were ready for clean-up"
 msgstr "Нет готовых к удалению звуковых файлов"
 
-#: ardour_ui.cc:3504 ardour_ui.cc:3514 ardour_ui.cc:3647 ardour_ui.cc:3654
-#: ardour_ui_ed.cc:104
+#: ardour_ui.cc:3727 ardour_ui.cc:3737 ardour_ui.cc:3870 ardour_ui.cc:3877
+#: ardour_ui_ed.cc:129
 msgid "Clean-up"
 msgstr "Очистить"
 
-#: ardour_ui.cc:3505
+#: ardour_ui.cc:3728
 msgid ""
 "If this seems suprising, \n"
 "check for any existing snapshots.\n"
@@ -1434,19 +1559,19 @@ msgstr ""
 "Они могут включать области, которым\n"
 "нужны неиспользуемые файлы."
 
-#: ardour_ui.cc:3564
+#: ardour_ui.cc:3787
 msgid "kilo"
 msgstr "Кило"
 
-#: ardour_ui.cc:3567
+#: ardour_ui.cc:3790
 msgid "mega"
 msgstr "Мега"
 
-#: ardour_ui.cc:3570
+#: ardour_ui.cc:3793
 msgid "giga"
 msgstr "Гига"
 
-#: ardour_ui.cc:3575
+#: ardour_ui.cc:3798
 msgid ""
 "The following file was deleted from %2,\n"
 "releasing %3 %4bytes of disk space"
@@ -1466,7 +1591,7 @@ msgstr[2] ""
 "освободив при этом %3 %4байт\n"
 "дискового пространства."
 
-#: ardour_ui.cc:3582
+#: ardour_ui.cc:3805
 msgid ""
 "The following file was not in use and \n"
 "has been moved to: %2\n"
@@ -1513,11 +1638,11 @@ msgstr[2] ""
 "\n"
 "дополнительно освободит %3 %4байт дискового пространства.\n"
 
-#: ardour_ui.cc:3642
+#: ardour_ui.cc:3865
 msgid "Are you sure you want to clean-up?"
 msgstr "Вы уверены, что хотите выполнить очистку?"
 
-#: ardour_ui.cc:3649
+#: ardour_ui.cc:3872
 msgid ""
 "Clean-up is a destructive operation.\n"
 "ALL undo/redo information will be lost if you clean-up.\n"
@@ -1528,39 +1653,63 @@ msgstr ""
 "неиспользуемые звуковые файлы\n"
 "будут перемещены в «мертвую» зону."
 
-#: ardour_ui.cc:3657
+#: ardour_ui.cc:3880
 msgid "CleanupDialog"
 msgstr "Очистка"
 
-#: ardour_ui.cc:3687
+#: ardour_ui.cc:3910
 msgid "Cleaned Files"
 msgstr "Очищенные файлы"
 
-#: ardour_ui.cc:3704
+#: ardour_ui.cc:3927
 msgid "deleted file"
 msgstr "Удалён файл"
 
-#: ardour_ui.cc:3897
+#: ardour_ui.cc:4133
+msgid "Cannot read session script '%1': %2"
+msgstr "Невозможно прочитать скрипт сеанса '%1': %2"
+
+#: ardour_ui.cc:4142 luainstance.cc:1104
+msgid "Set Script Parameters"
+msgstr "Установить параметры скрипта"
+
+#: ardour_ui.cc:4153
+msgid "Session script '%1' instantiation failed: %2"
+msgstr "Не удалось инициализовать скрипт сеанса '%1': %2"
+
+#: ardour_ui.cc:4157
+msgid "Loading Session script '%1' failed: %2"
+msgstr "Не удалось загрузить скрипт сеанса '%1': %2"
+
+#: ardour_ui.cc:4170
+msgid "There are no active Lua session scripts present in this session."
+msgstr "В этой сессии нет активных скриптов сессии."
+
+#: ardour_ui.cc:4187
+msgid "Session script '%1' removal failed: %2"
+msgstr "Удаление сценария сессии '%1' закончилась неудачей: %2"
+
+#: ardour_ui.cc:4197
 msgid "Video-Server was not launched by %1. The request to stop it is ignored."
 msgstr "Видеосервер не был запущен %1. Запрос его остановки игнорируется."
 
-#: ardour_ui.cc:3901
+#: ardour_ui.cc:4201
 msgid "Stop Video-Server"
 msgstr "Остановить видеосервер"
 
-#: ardour_ui.cc:3902
+#: ardour_ui.cc:4202
 msgid "Do you really want to stop the Video Server?"
 msgstr "Вы действительно хотите остановить видеосервер?"
 
-#: ardour_ui.cc:3905
+#: ardour_ui.cc:4205
 msgid "Yes, Stop It"
 msgstr "Да, остановить"
 
-#: ardour_ui.cc:3931
+#: ardour_ui.cc:4231
 msgid "The Video Server is already started."
 msgstr "Видеосервер уже запущен."
 
-#: ardour_ui.cc:3933
+#: ardour_ui.cc:4233
 msgid ""
 "An external Video Server is configured and can be reached. Not starting a "
 "new instance."
@@ -1568,7 +1717,7 @@ msgstr ""
 "Внешний видеосервер настроен и может быть доступен, не начиная новый "
 "экземпляр."
 
-#: ardour_ui.cc:3941 ardour_ui.cc:4046
+#: ardour_ui.cc:4241 ardour_ui.cc:4346
 msgid ""
 "Could not connect to the Video Server. Start it or configure its access URL "
 "in Preferences."
@@ -1576,47 +1725,47 @@ msgstr ""
 "Не удалось соединиться с видеосервером. Запустите его, либо укажите URL "
 "доступа к нему в диалоге параметров программы."
 
-#: ardour_ui.cc:3971
+#: ardour_ui.cc:4271
 msgid "Specified docroot is not an existing directory."
 msgstr "Указан DOC-корень не существующего каталога."
 
-#: ardour_ui.cc:3977 ardour_ui.cc:3983
+#: ardour_ui.cc:4277 ardour_ui.cc:4283
 msgid "Given Video Server is not an executable file."
 msgstr "Данный видеосервер не является исполняемым файлом."
 
-#: ardour_ui.cc:4017
+#: ardour_ui.cc:4317
 msgid "Cannot launch the video-server"
 msgstr "Не удалось запустить видеосервер"
 
-#: ardour_ui.cc:4027
+#: ardour_ui.cc:4327
 msgid "Video-server was started but does not respond to requests..."
 msgstr "Видеосервер запущен, но не откликается."
 
-#: ardour_ui.cc:4072 editor_audio_import.cc:644
+#: ardour_ui.cc:4372 editor_audio_import.cc:647
 msgid "could not open %1"
 msgstr "Не удалось открыть %1"
 
-#: ardour_ui.cc:4076
+#: ardour_ui.cc:4376
 msgid "no video-file selected"
 msgstr "Не выбран видеофайл"
 
-#: ardour_ui.cc:4172
+#: ardour_ui.cc:4472
 msgid "No LTC detected, video will not be aligned."
 msgstr ""
 
-#: ardour_ui.cc:4178
+#: ardour_ui.cc:4478
 msgid "Align video-start to %1 [samples]"
 msgstr ""
 
-#: ardour_ui.cc:4312
+#: ardour_ui.cc:4654
 msgid "xrun"
 msgstr ""
 
-#: ardour_ui.cc:4321
+#: ardour_ui.cc:4663
 msgid "Recording was stopped because your system could not keep up."
 msgstr "Запись остановлена из-за недостаточного быстродействия системы"
 
-#: ardour_ui.cc:4350
+#: ardour_ui.cc:4692
 msgid ""
 "The disk system on your computer\n"
 "was not able to keep up with %1.\n"
@@ -1630,23 +1779,23 @@ msgstr ""
 "В частности ей не удалось записать данные на диск\n"
 "достаточно быстро для фиксации захваченных данных.\n"
 
-#: ardour_ui.cc:4423
+#: ardour_ui.cc:4765
 msgid "Scanning for plugins"
 msgstr "Сканирование плагинов"
 
-#: ardour_ui.cc:4425
+#: ardour_ui.cc:4767
 msgid "Cancel plugin scan"
 msgstr "Отменить сканирование плагинов"
 
-#: ardour_ui.cc:4434
+#: ardour_ui.cc:4776
 msgid "Stop Timeout"
 msgstr "Тайм-аут остановки"
 
-#: ardour_ui.cc:4441
+#: ardour_ui.cc:4783
 msgid "Scan Timeout"
 msgstr "Тайм-аут сканирования"
 
-#: ardour_ui.cc:4485
+#: ardour_ui.cc:4827
 msgid ""
 "The disk system on your computer\n"
 "was not able to keep up with %1.\n"
@@ -1660,11 +1809,11 @@ msgstr ""
 "В частности ей не удалось прочитать данные\n"
 "с диска достаточно быстро для воспроизведения.\n"
 
-#: ardour_ui.cc:4525
+#: ardour_ui.cc:4862
 msgid "Crash Recovery"
 msgstr "Восстановление данных"
 
-#: ardour_ui.cc:4526
+#: ardour_ui.cc:4863
 msgid ""
 "This session appears to have been in the\n"
 "middle of recording when %1 or\n"
@@ -1680,19 +1829,19 @@ msgstr ""
 "%1 может восстановить записанные данные,\n"
 "либо проигнорировать их. Примите решение.\n"
 
-#: ardour_ui.cc:4538
+#: ardour_ui.cc:4875
 msgid "Ignore crash data"
 msgstr "Проигнорировать"
 
-#: ardour_ui.cc:4539
+#: ardour_ui.cc:4876
 msgid "Recover from crash"
 msgstr "Восстановить данные"
 
-#: ardour_ui.cc:4559
+#: ardour_ui.cc:4896
 msgid "Sample Rate Mismatch"
 msgstr "Несовпадение частот сэмплирования"
 
-#: ardour_ui.cc:4560
+#: ardour_ui.cc:4897
 msgid ""
 "This session was created with a sample rate of %1 Hz, but\n"
 "%2 is currently running at %3 Hz.  If you load this session,\n"
@@ -1704,15 +1853,28 @@ msgstr ""
 "Если вы загрузите эту сессию, звуковые данные могут быть\n"
 "воспроизведены с некорректной частотой сэмплирования.\n"
 
-#: ardour_ui.cc:4569
+#: ardour_ui.cc:4906
 msgid "Do not load session"
 msgstr "Не загружать сессию"
 
-#: ardour_ui.cc:4570
+#: ardour_ui.cc:4907
 msgid "Load session anyway"
 msgstr "Все равно загрузить"
 
-#: ardour_ui.cc:4862
+#: ardour_ui.cc:4927
+msgid ""
+"This session was created with a sample rate of %1 Hz, but\n"
+"%2 is currently running at %3 Hz.\n"
+"Audio will be recorded and played at the wrong sample rate.\n"
+"Re-Configure the Audio Engine in\n"
+"Menu > Window > Audio/Midi Setup"
+msgstr ""
+"Эта сессия была создана с частотой дискретизации %1 Гц, но\n"
+"%2 в настоящее время работает на %3 Гц.\n"
+"Звук будет записан и воспроизведен c неправильной частотой дискретизации.\n"
+"Настройте звуковой движок через «Меню > Окно > Настройка Аудио/MIDI»."
+
+#: ardour_ui.cc:5209
 msgid ""
 "%4This is a session from an older version of %3%5\n"
 "\n"
@@ -1724,7 +1886,7 @@ msgid ""
 "\n"
 "%6%2%7\n"
 "\n"
-"From now on, use the -2000 version with older versions of %3"
+"From now on, use the backup copy with older versions of %3"
 msgstr ""
 "%4Эта сессия от более старой версии %3%5\n"
 "\n"
@@ -1736,84 +1898,76 @@ msgstr ""
 "\n"
 "%6%2%7\n"
 "\n"
-"Отныне, используйте 2-х версии со старыми сессиями %3"
+"С этого момента открывайте архивную копию только в более ранних версиях %3."
 
-#: ardour_ui.cc:4979
+#: ardour_ui.cc:5331
 msgid "This is a free/demo copy of %1. It has just switched to silent mode."
 msgstr ""
 "Демонстрационная версия %1 только что переключилась в беззвучный режим."
 
-#: ardour_ui.cc:4985
+#: ardour_ui.cc:5337
 msgid "%1 is now silent"
 msgstr "%1 переключился в беззвучный режим"
 
-#: ardour_ui.cc:4987
+#: ardour_ui.cc:5339
 msgid ""
 "Please consider paying for a copy of %1 - you can pay whatever you want."
 msgstr ""
 "Возможно, вы хотите заплатить за копию %1 — цену вы можете установить сами."
 
-#: ardour_ui.cc:4988
+#: ardour_ui.cc:5340
 msgid "Better yet become a subscriber - subscriptions start at US$1 per month."
 msgstr "Вы также можете выбрать подписку (от US$1 в месяц)."
 
-#: ardour_ui.cc:4989
+#: ardour_ui.cc:5341
 msgid "Pay for a copy (via the web)"
 msgstr "Заплатить один раз"
 
-#: ardour_ui.cc:4990
+#: ardour_ui.cc:5342
 msgid "Become a subscriber (via the web)"
 msgstr "Стать подписчиком"
 
-#: ardour_ui.cc:5009
+#: ardour_ui.cc:5361
 msgid "Remain silent"
 msgstr "Оставить беззвучным"
 
-#: ardour_ui.cc:5011
+#: ardour_ui.cc:5363
 msgid "Give me more time"
 msgstr "Дайте ещё поработать"
 
-#: ardour_ui2.cc:73
-msgid "UI: cannot setup editor"
-msgstr "Интерфейс: не удалось инициализировать редактор"
-
-#: ardour_ui2.cc:78
-msgid "UI: cannot setup mixer"
-msgstr "Интерфейс: не удалось инициализировать микшер"
-
-#: ardour_ui2.cc:83
-msgid "UI: cannot setup meterbridge"
-msgstr "Интерфейс: не удалось настроить панель индикаторов"
+#: ardour_ui.cc:5656
+msgid "Global keybindings are missing"
+msgstr "Глобальные клавиатурные комбинации отсутствуют"
 
-#: ardour_ui2.cc:128
+#: ardour_ui2.cc:79
 msgid "Play from playhead"
 msgstr "Воспроизвести от указателя"
 
-#: ardour_ui2.cc:129
+#: ardour_ui2.cc:80
 msgid "Stop playback"
 msgstr "Стоп"
 
-#: ardour_ui2.cc:130
+#: ardour_ui2.cc:81
 msgid "Toggle record"
 msgstr "Переключить готовность к записи"
 
-#: ardour_ui2.cc:131
+#: ardour_ui2.cc:82
 msgid "Play range/selection"
 msgstr "Воспроизвести выделение"
 
-#: ardour_ui2.cc:132
+#: ardour_ui2.cc:83
 msgid "Go to start of session"
 msgstr "В начало сессии"
 
-#: ardour_ui2.cc:133
+#: ardour_ui2.cc:84
 msgid "Go to end of session"
 msgstr "В конец сессии"
 
-#: ardour_ui2.cc:134
+#: ardour_ui2.cc:85
 msgid "Play loop range"
 msgstr "Воспроизвести выделение в петле"
 
-#: ardour_ui2.cc:135
+#: ardour_ui2.cc:86
 msgid ""
 "MIDI Panic\n"
 "Send note off and reset controller messages on all MIDI channels"
@@ -1821,23 +1975,23 @@ msgstr ""
 "MIDI паника\n"
 "Отправлено сообщение off и сброса сообщений контролера на всех MIDI каналах"
 
-#: ardour_ui2.cc:136
+#: ardour_ui2.cc:87
 msgid "Return to last playback start when stopped"
 msgstr "Вернуться к точке начала воспроизведения"
 
-#: ardour_ui2.cc:137
+#: ardour_ui2.cc:88
 msgid "Playhead follows range selections and edits"
 msgstr ""
 
-#: ardour_ui2.cc:138
+#: ardour_ui2.cc:89
 msgid "Be sensible about input monitoring"
 msgstr "Будьте разумны насчёт входного мониторинга"
 
-#: ardour_ui2.cc:139
+#: ardour_ui2.cc:90
 msgid "Enable/Disable audio click"
 msgstr "Включить или выключить метроном"
 
-#: ardour_ui2.cc:140 monitor_section.cc:127
+#: ardour_ui2.cc:91 monitor_section.cc:129
 msgid ""
 "When active, something is soloed.\n"
 "Click to de-solo everything"
@@ -1845,17 +1999,19 @@ msgstr ""
 "Включено, если какие-то дорожки солируют.\n"
 "Щёлкните, чтобы снять солирование везде."
 
-#: ardour_ui2.cc:141
+#: ardour_ui2.cc:92
 msgid ""
 "When active, auditioning is taking place.\n"
 "Click to stop the audition"
 msgstr ""
+"Когда активно, выполняется прослушивание.\n"
+"Нажмите для остановки прослушивания."
 
-#: ardour_ui2.cc:142
+#: ardour_ui2.cc:93
 msgid "When active, there is a feedback loop."
 msgstr "Включена, когда есть петля отклика (feedback loop)"
 
-#: ardour_ui2.cc:143
+#: ardour_ui2.cc:94
 msgid ""
 "<b>Primary Clock</b> right-click to set display mode. Click to edit, click"
 "+drag a digit or mouse-over+scroll wheel to modify.\n"
@@ -1868,7 +2024,7 @@ msgstr ""
 "Прямой ввод: <tt>Esc</tt>: отмена; <tt>Enter</tt>: подтверждение; постфикс "
 "'+' или '-' вводит разницу во времени.\n"
 
-#: ardour_ui2.cc:144
+#: ardour_ui2.cc:95
 msgid ""
 "<b>Secondary Clock</b> right-click to set display mode. Click to edit, click"
 "+drag a digit or mouse-over+scroll wheel to modify.\n"
@@ -1881,488 +2037,552 @@ msgstr ""
 "Прямой ввод: <tt>Esc</tt>: отмена; <tt>Enter</tt>: подтверждение; постфикс "
 "'+' или '-' вводит разницу во времени.\n"
 
-#: ardour_ui2.cc:145
+#: ardour_ui2.cc:96
 msgid "Reset All Peak Indicators"
 msgstr "Сбросить все пиковые значения"
 
-#: ardour_ui2.cc:146
+#: ardour_ui2.cc:97
 msgid "Show Error Log and acknowledge warnings"
 msgstr "Показать журнал ошибок и предупреждений"
 
-#: ardour_ui2.cc:179
+#: ardour_ui2.cc:130
 msgid "[ERROR]: "
 msgstr "[ОШИБКА]: "
 
-#: ardour_ui2.cc:182
+#: ardour_ui2.cc:133
 msgid "[WARNING]: "
 msgstr "[ПРЕДУПРЕЖДЕНИЕ]:"
 
-#: ardour_ui2.cc:185
+#: ardour_ui2.cc:136
 msgid "[INFO]: "
 msgstr "[СПРАВКА]:"
 
-#: ardour_ui2.cc:255 ardour_ui_ed.cc:430
+#: ardour_ui2.cc:197 ardour_ui_ed.cc:509
 msgid "Auto Return"
 msgstr "Автовозврат"
 
-#: ardour_ui2.cc:257 ardour_ui_ed.cc:433
+#: ardour_ui2.cc:199 ardour_ui_ed.cc:512
 msgid "Follow Edits"
 msgstr "Следовать правкам"
 
-#: ardour_ui2.cc:704 rc_option_editor.cc:2895
+#: ardour_ui2.cc:422 ardour_ui2.cc:426 ardour_ui2.cc:430
+msgid ""
+"Drag this tab to the desktop to show %1 in its own window\n"
+"\n"
+"To put the window back, use the Window > %1 > Attach menu action"
+msgstr ""
+
+#: ardour_ui2.cc:638
 msgid "GUI"
 msgstr "Интерфейс"
 
-#: ardour_ui2.cc:721 rc_option_editor.cc:1734 rc_option_editor.cc:1752
-#: rc_option_editor.cc:1755 rc_option_editor.cc:1757 rc_option_editor.cc:1759
-#: rc_option_editor.cc:1767 rc_option_editor.cc:1769 rc_option_editor.cc:1777
-#: rc_option_editor.cc:1785 rc_option_editor.cc:1792 rc_option_editor.cc:1801
-#: rc_option_editor.cc:1803 rc_option_editor.cc:1805 rc_option_editor.cc:1813
-#: rc_option_editor.cc:1815 rc_option_editor.cc:1824
-#: session_option_editor.cc:342 session_option_editor.cc:344
-#: session_option_editor.cc:365 session_option_editor.cc:367
-#: session_option_editor.cc:369 session_option_editor.cc:376
-#: session_option_editor.cc:383 session_option_editor.cc:387
-msgid "Misc"
-msgstr "Прочее"
+#: ardour_ui2.cc:651 rc_option_editor.cc:1941 rc_option_editor.cc:1943
+#: rc_option_editor.cc:1945
+msgid "Misc/Click"
+msgstr "Прочее/Метроном"
 
-#: ardour_ui_dependents.cc:77
+#: ardour_ui_dependents.cc:118
 msgid "Setup Editor"
 msgstr "Настройка редактора"
 
-#: ardour_ui_dependents.cc:79
+#: ardour_ui_dependents.cc:120
 msgid "Setup Mixer"
 msgstr "Настройка микшера"
 
-#: ardour_ui_dependents.cc:85
+#: ardour_ui_dependents.cc:127
 msgid "Reload Session History"
 msgstr "Повторная загрузка истории сессий"
 
-#: ardour_ui_dialogs.cc:251
+#: ardour_ui_dependents.cc:248
+msgid "UI: cannot setup editor"
+msgstr "Интерфейс: не удалось инициализировать редактор"
+
+#: ardour_ui_dependents.cc:253
+msgid "UI: cannot setup mixer"
+msgstr "Интерфейс: не удалось инициализировать микшер"
+
+#: ardour_ui_dependents.cc:258
+msgid "UI: cannot setup meterbridge"
+msgstr "Интерфейс: не удалось настроить панель индикаторов"
+
+#: ardour_ui_dependents.cc:263
+msgid "UI: cannot setup luawindow"
+msgstr ""
+
+#: ardour_ui_dependents.cc:269 ardour_ui_ed.cc:136 ardour_ui_ed.cc:257
+#: rc_option_editor.cc:1853 rc_option_editor.cc:3494
+msgid "Preferences"
+msgstr "Параметры"
+
+#: ardour_ui_dependents.cc:270 ardour_ui_ed.cc:134 mixer_ui.cc:100
+#: mixer_ui.cc:410
+msgid "Mixer"
+msgstr "Микшер"
+
+#: ardour_ui_dependents.cc:271 ardour_ui_ed.cc:135 editor.cc:5791
+#: editor.cc:6063 public_editor.cc:34 rc_option_editor.cc:2201
+#: rc_option_editor.cc:2215 rc_option_editor.cc:2219 rc_option_editor.cc:2227
+#: rc_option_editor.cc:2236 rc_option_editor.cc:2244 rc_option_editor.cc:2253
+#: rc_option_editor.cc:2261 rc_option_editor.cc:2269 rc_option_editor.cc:2279
+#: rc_option_editor.cc:2281 rc_option_editor.cc:2305 rc_option_editor.cc:2317
+#: rc_option_editor.cc:2328 rc_option_editor.cc:2346
+msgid "Editor"
+msgstr "Редактор"
+
+#: ardour_ui_dialogs.cc:263
 msgid "Don't close"
 msgstr "Не закрывать"
 
-#: ardour_ui_dialogs.cc:252
+#: ardour_ui_dialogs.cc:264
 msgid "Just close"
 msgstr "Просто закрыть"
 
-#: ardour_ui_dialogs.cc:253
+#: ardour_ui_dialogs.cc:265
 msgid "Save and close"
 msgstr "Сохранить и закрыть"
 
-#: ardour_ui_dialogs.cc:363
-msgid "This screen is not tall enough to display the mixer window"
-msgstr "Экран недостаточно высок, чтобы показать окно микшера"
+#: ardour_ui_ed.cc:124
+msgid "Escape"
+msgstr ""
 
-#: ardour_ui_ed.cc:103
+#: ardour_ui_ed.cc:128
 msgid "Session"
 msgstr "Сессия"
 
-#: ardour_ui_ed.cc:106 editor_actions.cc:139 editor_regions.cc:119
-#: port_group.cc:468 session_option_editor.cc:82 session_option_editor.cc:89
+#: ardour_ui_ed.cc:131 editor_actions.cc:141 editor_regions.cc:163
+#: port_group.cc:469 session_option_editor.cc:82 session_option_editor.cc:89
 msgid "Sync"
 msgstr "Синхронизация"
 
-#: ardour_ui_ed.cc:107
+#: ardour_ui_ed.cc:132
 msgid "Options"
 msgstr "Параметры"
 
-#: ardour_ui_ed.cc:108
+#: ardour_ui_ed.cc:133
 msgid "Window"
 msgstr "Окна"
 
-#: ardour_ui_ed.cc:109
+#: ardour_ui_ed.cc:137 ardour_ui_ed.cc:267 ardour_ui_ed.cc:268
+#: ardour_ui_ed.cc:269
+msgid "Detach"
+msgstr "Открепить"
+
+#: ardour_ui_ed.cc:138
 msgid "Help"
 msgstr "Справка"
 
-#: ardour_ui_ed.cc:110
+#: ardour_ui_ed.cc:139
 msgid "Misc. Shortcuts"
 msgstr "Прочие действия"
 
-#: ardour_ui_ed.cc:111
+#: ardour_ui_ed.cc:140
 msgid "Audio File Format"
 msgstr "Формат звуковых файлов"
 
-#: ardour_ui_ed.cc:112
+#: ardour_ui_ed.cc:141
 msgid "File Type"
 msgstr "Тип файла"
 
-#: ardour_ui_ed.cc:113 export_format_dialog.cc:67
+#: ardour_ui_ed.cc:142 export_format_dialog.cc:75
 msgid "Sample Format"
 msgstr "Формат сэмпла"
 
-#: ardour_ui_ed.cc:114 rc_option_editor.cc:2705 rc_option_editor.cc:2717
+#: ardour_ui_ed.cc:143 rc_option_editor.cc:2841
 msgid "Control Surfaces"
 msgstr "Устройства управления"
 
-#: ardour_ui_ed.cc:115 rc_option_editor.cc:2375 rc_option_editor.cc:2723
-#: rc_option_editor.cc:2725 rc_option_editor.cc:2735 rc_option_editor.cc:2742
-#: rc_option_editor.cc:2750 rc_option_editor.cc:2762 rc_option_editor.cc:2767
-#: rc_option_editor.cc:2769 rc_option_editor.cc:2774 rc_option_editor.cc:2781
-#: rc_option_editor.cc:2786 rc_option_editor.cc:2795 rc_option_editor.cc:2799
-#: rc_option_editor.cc:2808 rc_option_editor.cc:2816 rc_option_editor.cc:2820
-#: rc_option_editor.cc:2825 rc_option_editor.cc:2832 rc_option_editor.cc:2833
+#: ardour_ui_ed.cc:144 rc_option_editor.cc:2847 rc_option_editor.cc:2853
+#: rc_option_editor.cc:2862 rc_option_editor.cc:2873 rc_option_editor.cc:2883
+#: rc_option_editor.cc:2948 rc_option_editor.cc:2969 rc_option_editor.cc:2985
+#: rc_option_editor.cc:2986 rc_option_editor.cc:2995 rc_option_editor.cc:3009
+#: rc_option_editor.cc:3012 rc_option_editor.cc:3020 rc_option_editor.cc:3028
 msgid "Plugins"
 msgstr "Плагины"
 
-#: ardour_ui_ed.cc:116 rc_option_editor.cc:2969
+#: ardour_ui_ed.cc:145 rc_option_editor.cc:3176
 msgid "Metering"
 msgstr "Индикаторы"
 
-#: ardour_ui_ed.cc:117
+#: ardour_ui_ed.cc:146
 msgid "Fall Off Rate"
 msgstr "Частота спада"
 
-#: ardour_ui_ed.cc:118
+#: ardour_ui_ed.cc:147
 msgid "Hold Time"
 msgstr "Время задержки"
 
-#: ardour_ui_ed.cc:119
+#: ardour_ui_ed.cc:148
 msgid "Denormal Handling"
 msgstr "Обработка отклонений"
 
-#: ardour_ui_ed.cc:123 route_time_axis.cc:1694
+#: ardour_ui_ed.cc:152 route_time_axis.cc:1683
 msgid "New..."
 msgstr "Создать..."
 
-#: ardour_ui_ed.cc:125
+#: ardour_ui_ed.cc:154
 msgid "Open..."
 msgstr "Открыть..."
 
-#: ardour_ui_ed.cc:126
+#: ardour_ui_ed.cc:155
 msgid "Recent..."
 msgstr "Недавние сессии..."
 
-#: ardour_ui_ed.cc:127 panner_editor.cc:29 playlist_selector.cc:64
+#: ardour_ui_ed.cc:156 panner_editor.cc:29 playlist_selector.cc:64
 msgid "Close"
 msgstr "Закрыть"
 
-#: ardour_ui_ed.cc:130
+#: ardour_ui_ed.cc:159
 msgid "Add Track or Bus..."
 msgstr "Добавить дорожку или шину..."
 
-#: ardour_ui_ed.cc:135
+#: ardour_ui_ed.cc:163
 msgid "Duplicate Tracks/Busses..."
 msgstr "Создать копии дорожек и шин..."
 
-#: ardour_ui_ed.cc:141
+#: ardour_ui_ed.cc:169
 msgid "Cancel Solo"
-msgstr ""
+msgstr "Отменить соло"
 
-#: ardour_ui_ed.cc:146
-msgid "Open Video"
-msgstr "Добавить видео"
+#: ardour_ui_ed.cc:173
+msgid "Session|Scripting"
+msgstr "Скрипты"
 
-#: ardour_ui_ed.cc:149
+#: ardour_ui_ed.cc:176
+msgid "Add Lua Script..."
+msgstr "Добавить скрипт на Lua..."
+
+#: ardour_ui_ed.cc:180
+msgid "Remove Lua Script"
+msgstr "Удалить скрипт Lua"
+
+#: ardour_ui_ed.cc:184
+msgid "Open Video..."
+msgstr "Открыть видео..."
+
+#: ardour_ui_ed.cc:187
 msgid "Remove Video"
 msgstr "Удалить видео"
 
-#: ardour_ui_ed.cc:152
-msgid "Export to Video File"
-msgstr "Экспортировать в видеофайл"
+#: ardour_ui_ed.cc:190
+msgid "Export to Video File..."
+msgstr "Экспортировать видеофайл..."
 
-#: ardour_ui_ed.cc:156
+#: ardour_ui_ed.cc:194
 msgid "Snapshot (& keep working on current version) ..."
 msgstr "Сделать снимок и работать с текущей версией..."
 
-#: ardour_ui_ed.cc:160
+#: ardour_ui_ed.cc:197
 msgid "Snapshot (& switch to new version) ..."
 msgstr "Сделать снимок и перейти к новой версии..."
 
-#: ardour_ui_ed.cc:164
+#: ardour_ui_ed.cc:200
+msgid "Quick Snapshot (& keep working on current version) ..."
+msgstr ""
+
+#: ardour_ui_ed.cc:203
+msgid "Quick Snapshot (& switch to new version) ..."
+msgstr ""
+
+#: ardour_ui_ed.cc:207
 msgid "Save As..."
 msgstr "Сохранить как..."
 
-#: ardour_ui_ed.cc:168 editor_actions.cc:1790 editor_markers.cc:903
-#: editor_snapshots.cc:136 mixer_strip.cc:1578 route_time_axis.cc:1690
+#: ardour_ui_ed.cc:210 editor_actions.cc:1788 editor_markers.cc:908
+#: editor_snapshots.cc:136 mixer_strip.cc:1661 route_time_axis.cc:1679
 msgid "Rename..."
 msgstr "Переименовать..."
 
-#: ardour_ui_ed.cc:172
+#: ardour_ui_ed.cc:214
 msgid "Save Template..."
 msgstr "Сохранить шаблон..."
 
-#: ardour_ui_ed.cc:175
+#: ardour_ui_ed.cc:217
 msgid "Metadata"
 msgstr "Метаданные"
 
-#: ardour_ui_ed.cc:178
+#: ardour_ui_ed.cc:220
 msgid "Edit Metadata..."
 msgstr "Изменить метаданные..."
 
-#: ardour_ui_ed.cc:181
+#: ardour_ui_ed.cc:223
 msgid "Import Metadata..."
 msgstr "Импортировать метаданные..."
 
-#: ardour_ui_ed.cc:184
+#: ardour_ui_ed.cc:226
 msgid "Export to Audio File(s)..."
 msgstr "Экспортировать в звуковые файлы..."
 
-#: ardour_ui_ed.cc:187
+#: ardour_ui_ed.cc:229
 msgid "Stem export..."
 msgstr "Каждую дорожку в свой файл..."
 
-#: ardour_ui_ed.cc:190 editor_export_audio.cc:66 export_channel_selector.cc:190
-#: export_channel_selector.cc:576 export_dialog.cc:129
+#: ardour_ui_ed.cc:232 editor_export_audio.cc:66 export_channel_selector.cc:190
+#: export_channel_selector.cc:578 export_dialog.cc:136
 #: export_video_dialog.cc:80
 msgid "Export"
 msgstr "Экспортировать"
 
-#: ardour_ui_ed.cc:193
+#: ardour_ui_ed.cc:235
 msgid "Clean-up Unused Sources..."
 msgstr "Очистить неиспользуемые источники..."
 
-#: ardour_ui_ed.cc:197
+#: ardour_ui_ed.cc:239
 msgid "Reset Peak Files"
 msgstr ""
 
-#: ardour_ui_ed.cc:201
+#: ardour_ui_ed.cc:243
 msgid "Flush Wastebasket"
 msgstr "Очистить корзину"
 
-#: ardour_ui_ed.cc:208
+#: ardour_ui_ed.cc:251
 msgid "Quit"
 msgstr "Выход"
 
-#: ardour_ui_ed.cc:209 automation_time_axis.cc:543 editor_actions.cc:661
-#: editor_markers.cc:902 location_ui.cc:59 plugin_selector.cc:97
-#: route_time_axis.cc:866
+#: ardour_ui_ed.cc:252 ardour_ui_ed.cc:259 ardour_ui_ed.cc:260
+#: ardour_ui_ed.cc:261 automation_time_axis.cc:545 editor_actions.cc:686
+#: editor_markers.cc:907 location_ui.cc:61 plugin_selector.cc:97
+#: route_time_axis.cc:864
 msgid "Hide"
 msgstr "Скрыть"
 
-#: ardour_ui_ed.cc:213
+#: ardour_ui_ed.cc:263 ardour_ui_ed.cc:264 ardour_ui_ed.cc:265
+msgid "Attach"
+msgstr "Прикрепить"
+
+#: ardour_ui_ed.cc:275 ardour_ui_ed.cc:276 ardour_ui_ed.cc:277
+#: ardour_ui_ed.cc:283 ardour_ui_ed.cc:284 ardour_ui_ed.cc:285
+msgid "Change"
+msgstr "Изменить"
+
+#: ardour_ui_ed.cc:287
+msgid "Previous Tab"
+msgstr "Предыдущая вкладка"
+
+#: ardour_ui_ed.cc:288
+msgid "Next Tab"
+msgstr "Следующая вкладка"
+
+#: ardour_ui_ed.cc:290
+msgid "Toggle Editor & Mixer"
+msgstr "Переключиться между редактором и микшером"
+
+#: ardour_ui_ed.cc:294
 msgid "Maximise Editor Space"
 msgstr "Редактор на полный экран"
 
-#: ardour_ui_ed.cc:214
+#: ardour_ui_ed.cc:295
 msgid "Maximise Mixer Space"
 msgstr "Развернуть окно микшера"
 
-#: ardour_ui_ed.cc:215
-msgid "Show Toolbars"
-msgstr "Показывать панели"
-
-#: ardour_ui_ed.cc:218
+#: ardour_ui_ed.cc:298
 msgid "Toggle Mixer List"
-msgstr ""
+msgstr "Показывать боковую панель микшера"
 
-#: ardour_ui_ed.cc:221
+#: ardour_ui_ed.cc:301
 msgid "Toggle Monitor Section Visibility"
 msgstr "Переключить видимость секции мониторинга"
 
-#: ardour_ui_ed.cc:225
+#: ardour_ui_ed.cc:305
 msgid "Show more UI preferences"
 msgstr "Показать больше предустановок UI"
 
-#: ardour_ui_ed.cc:227 mixer_ui.cc:2112 mixer_ui.cc:2118
-msgid "Window|Mixer"
-msgstr "Микшер"
+#: ardour_ui_ed.cc:308
+msgid "Window|Scripting"
+msgstr "Скрипты"
 
-#: ardour_ui_ed.cc:228
-msgid "Toggle Editor+Mixer"
-msgstr "Редактор или микшер на переднем плане"
-
-#: ardour_ui_ed.cc:229 meterbridge.cc:216 meterbridge.cc:222
+#: ardour_ui_ed.cc:309 meterbridge.cc:214 meterbridge.cc:220
 msgid "Window|Meterbridge"
 msgstr "Панель индикаторов"
 
-#: ardour_ui_ed.cc:231
-msgid "Reattach All Tearoffs"
-msgstr "Заново прикрепить разрывы"
-
-#: ardour_ui_ed.cc:233 midi_tracer.cc:45
+#: ardour_ui_ed.cc:311 midi_tracer.cc:45
 msgid "MIDI Tracer"
 msgstr "Журнал MIDI-событий"
 
-#: ardour_ui_ed.cc:235
+#: ardour_ui_ed.cc:314
 msgid "Chat"
 msgstr "Пообщаться"
 
-#: ardour_ui_ed.cc:237
+#: ardour_ui_ed.cc:316
 msgid "Help|Manual"
 msgstr "Справка"
 
-#: ardour_ui_ed.cc:238
+#: ardour_ui_ed.cc:317
 msgid "Manual|Reference"
-msgstr ""
+msgstr "Справка"
 
-#: ardour_ui_ed.cc:239
+#: ardour_ui_ed.cc:318
 msgid "Report a Bug"
 msgstr "Сообщить об ошибке"
 
-#: ardour_ui_ed.cc:240
+#: ardour_ui_ed.cc:319
 msgid "Cheat Sheet"
 msgstr "Шпаргалка"
 
-#: ardour_ui_ed.cc:241
+#: ardour_ui_ed.cc:320
 msgid "Ardour Website"
 msgstr "Сайт Ardour"
 
-#: ardour_ui_ed.cc:242
+#: ardour_ui_ed.cc:321
 msgid "Ardour Development"
 msgstr "Разработка Ardour"
 
-#: ardour_ui_ed.cc:243
+#: ardour_ui_ed.cc:322
 msgid "User Forums"
 msgstr "Форумы для пользователей"
 
-#: ardour_ui_ed.cc:244
+#: ardour_ui_ed.cc:323
 msgid "How to Report a Bug"
 msgstr "Как сообщить об ошибке"
 
-#: ardour_ui_ed.cc:246 plugin_ui.cc:419
+#: ardour_ui_ed.cc:325 luawindow.cc:100 luawindow.cc:654 plugin_ui.cc:420
 msgid "Save"
 msgstr "Сохранить"
 
-#: ardour_ui_ed.cc:254 rc_option_editor.cc:1835 rc_option_editor.cc:1846
-#: rc_option_editor.cc:1857 rc_option_editor.cc:1868 rc_option_editor.cc:1877
-#: rc_option_editor.cc:1890 rc_option_editor.cc:1903 rc_option_editor.cc:1912
-#: rc_option_editor.cc:1922 rc_option_editor.cc:1939 rc_option_editor.cc:1941
-#: rc_option_editor.cc:1950 rc_option_editor.cc:1966 rc_option_editor.cc:1987
-#: rc_option_editor.cc:2005 rc_option_editor.cc:2007 rc_option_editor.cc:2024
-#: rc_option_editor.cc:2027 rc_option_editor.cc:2029 rc_option_editor.cc:2046
-#: rc_option_editor.cc:2057
+#: ardour_ui_ed.cc:333 rc_option_editor.cc:1975 rc_option_editor.cc:1986
+#: rc_option_editor.cc:1997 rc_option_editor.cc:2008 rc_option_editor.cc:2017
+#: rc_option_editor.cc:2030 rc_option_editor.cc:2043 rc_option_editor.cc:2052
+#: rc_option_editor.cc:2062 rc_option_editor.cc:2079 rc_option_editor.cc:2186
 msgid "Transport"
 msgstr "Транспорт"
 
-#: ardour_ui_ed.cc:260 engine_dialog.cc:88
+#: ardour_ui_ed.cc:339 engine_dialog.cc:88
 msgid "Stop"
 msgstr "Стоп"
 
-#: ardour_ui_ed.cc:263
+#: ardour_ui_ed.cc:342
 msgid "Roll"
 msgstr "Перевернуть"
 
-#: ardour_ui_ed.cc:267 ardour_ui_ed.cc:270
+#: ardour_ui_ed.cc:346 ardour_ui_ed.cc:349
 msgid "Start/Stop"
 msgstr "Старт/Стоп"
 
-#: ardour_ui_ed.cc:273
+#: ardour_ui_ed.cc:352
 msgid "Start/Continue/Stop"
 msgstr "Старт/Продолжить/Стоп"
 
-#: ardour_ui_ed.cc:276
+#: ardour_ui_ed.cc:355
 msgid "Stop and Forget Capture"
 msgstr "Остановиться и забыть захват"
 
-#: ardour_ui_ed.cc:286
+#: ardour_ui_ed.cc:365
 msgid "Transition to Roll"
-msgstr ""
+msgstr "Перейти к прокрутке"
 
-#: ardour_ui_ed.cc:290
+#: ardour_ui_ed.cc:369
 msgid "Transition to Reverse"
-msgstr ""
+msgstr "Перейти к реверсу"
 
-#: ardour_ui_ed.cc:294
+#: ardour_ui_ed.cc:373
 msgid "Play Loop Range"
 msgstr "Воспроизвести петлю"
 
-#: ardour_ui_ed.cc:297
+#: ardour_ui_ed.cc:376
 msgid "Play Selection"
 msgstr "Воспроизводить выделение"
 
-#: ardour_ui_ed.cc:300
+#: ardour_ui_ed.cc:379
 msgid "Play Selection w/Preroll"
 msgstr "Играть выбранный w/Preroll"
 
-#: ardour_ui_ed.cc:304
+#: ardour_ui_ed.cc:383
 msgid "Enable Record"
 msgstr "Разрешить запись"
 
-#: ardour_ui_ed.cc:307 ardour_ui_ed.cc:311
+#: ardour_ui_ed.cc:386 ardour_ui_ed.cc:390
 msgid "Start Recording"
 msgstr "Начать запись"
 
-#: ardour_ui_ed.cc:315
+#: ardour_ui_ed.cc:394
 msgid "Rewind"
 msgstr "Перемотать назад"
 
-#: ardour_ui_ed.cc:318
+#: ardour_ui_ed.cc:397
 msgid "Rewind (Slow)"
 msgstr "Перемотать назад (медленно)"
 
-#: ardour_ui_ed.cc:321
+#: ardour_ui_ed.cc:400
 msgid "Rewind (Fast)"
 msgstr "Перемотать назад (быстро)"
 
-#: ardour_ui_ed.cc:324
+#: ardour_ui_ed.cc:403
 msgid "Forward"
 msgstr "Перемотать вперёд"
 
-#: ardour_ui_ed.cc:327
+#: ardour_ui_ed.cc:406
 msgid "Forward (Slow)"
 msgstr "Перемотать вперёд (медленно)"
 
-#: ardour_ui_ed.cc:330
+#: ardour_ui_ed.cc:409
 msgid "Forward (Fast)"
 msgstr "Перемотать вперёд (быстро)"
 
-#: ardour_ui_ed.cc:333
+#: ardour_ui_ed.cc:412
 msgid "Go to Zero"
 msgstr "К нулевой отметке"
 
-#: ardour_ui_ed.cc:336 ardour_ui_ed.cc:339
+#: ardour_ui_ed.cc:415 ardour_ui_ed.cc:418
 msgid "Go to Start"
 msgstr "К началу"
 
-#: ardour_ui_ed.cc:342
+#: ardour_ui_ed.cc:421
 msgid "Go to End"
 msgstr "В конец"
 
-#: ardour_ui_ed.cc:345
+#: ardour_ui_ed.cc:424
 msgid "Go to Wall Clock"
 msgstr "К  текущему времени"
 
-#: ardour_ui_ed.cc:350 ardour_ui_ed.cc:353
+#: ardour_ui_ed.cc:429 ardour_ui_ed.cc:432
 msgid "Numpad Decimal"
 msgstr "Десятичный разделитель на цифровой клавиатуре"
 
-#: ardour_ui_ed.cc:356
+#: ardour_ui_ed.cc:435
 msgid "Numpad 0"
 msgstr "Numpad 0"
 
-#: ardour_ui_ed.cc:359
+#: ardour_ui_ed.cc:438
 msgid "Numpad 1"
 msgstr "Numpad 1"
 
-#: ardour_ui_ed.cc:362
+#: ardour_ui_ed.cc:441
 msgid "Numpad 2"
 msgstr "Numpad 2"
 
-#: ardour_ui_ed.cc:365
+#: ardour_ui_ed.cc:444
 msgid "Numpad 3"
 msgstr "Numpad 3"
 
-#: ardour_ui_ed.cc:368
+#: ardour_ui_ed.cc:447
 msgid "Numpad 4"
 msgstr "Numpad 3"
 
-#: ardour_ui_ed.cc:371
+#: ardour_ui_ed.cc:450
 msgid "Numpad 5"
 msgstr "Numpad 5"
 
-#: ardour_ui_ed.cc:374
+#: ardour_ui_ed.cc:453
 msgid "Numpad 6"
 msgstr "Numpad 6"
 
-#: ardour_ui_ed.cc:377
+#: ardour_ui_ed.cc:456
 msgid "Numpad 7"
 msgstr "Numpad 7"
 
-#: ardour_ui_ed.cc:380
+#: ardour_ui_ed.cc:459
 msgid "Numpad 8"
 msgstr "Numpad 8"
 
-#: ardour_ui_ed.cc:383
+#: ardour_ui_ed.cc:462
 msgid "Numpad 9"
 msgstr "Numpad 9"
 
-#: ardour_ui_ed.cc:387
+#: ardour_ui_ed.cc:466
 msgid "Focus On Clock"
 msgstr "Изменить время вручную"
 
-#: ardour_ui_ed.cc:391 ardour_ui_ed.cc:400 audio_clock.cc:2116 editor.cc:261
-#: editor_actions.cc:585 editor_actions.cc:594 export_timespan_selector.cc:85
+#: ardour_ui_ed.cc:470 ardour_ui_ed.cc:479 audio_clock.cc:2122 editor.cc:321
+#: editor_actions.cc:610 editor_actions.cc:619 export_timespan_selector.cc:95
 #: session_option_editor.cc:41 session_option_editor.cc:61
 #: session_option_editor.cc:80 session_option_editor.cc:96
 #: session_option_editor.cc:109 session_option_editor.cc:122
@@ -2370,137 +2590,137 @@ msgstr "Изменить время вручную"
 msgid "Timecode"
 msgstr "Тайм-код"
 
-#: ardour_ui_ed.cc:393 ardour_ui_ed.cc:402 editor_actions.cc:583
+#: ardour_ui_ed.cc:472 ardour_ui_ed.cc:481 editor_actions.cc:608
 msgid "Bars & Beats"
 msgstr "Такты и доли"
 
-#: ardour_ui_ed.cc:395 ardour_ui_ed.cc:404
+#: ardour_ui_ed.cc:474 ardour_ui_ed.cc:483
 msgid "Minutes & Seconds"
 msgstr "Минуты и секунды"
 
-#: ardour_ui_ed.cc:397 ardour_ui_ed.cc:406 audio_clock.cc:2120 editor.cc:262
-#: editor_actions.cc:584
+#: ardour_ui_ed.cc:476 ardour_ui_ed.cc:485 audio_clock.cc:2125 editor.cc:322
+#: editor_actions.cc:609
 msgid "Samples"
 msgstr "Сэмплы"
 
-#: ardour_ui_ed.cc:409
+#: ardour_ui_ed.cc:488
 msgid "Punch In"
 msgstr "Начало врезки"
 
-#: ardour_ui_ed.cc:410 mixer_strip.cc:1901 mixer_strip.cc:2089 route_ui.cc:175
-#: time_info_box.cc:116
+#: ardour_ui_ed.cc:489 mixer_strip.cc:2000 mixer_strip.cc:2201 route_ui.cc:191
+#: time_info_box.cc:110
 msgid "In"
 msgstr "Вход"
 
-#: ardour_ui_ed.cc:413
+#: ardour_ui_ed.cc:492
 msgid "Punch Out"
 msgstr "Конец врезки"
 
-#: ardour_ui_ed.cc:414 mixer_strip.cc:1913 time_info_box.cc:117
+#: ardour_ui_ed.cc:493 mixer_strip.cc:2012 time_info_box.cc:111
 msgid "Out"
 msgstr "Выход"
 
-#: ardour_ui_ed.cc:417
+#: ardour_ui_ed.cc:496
 msgid "Punch In/Out"
 msgstr "Врезка"
 
-#: ardour_ui_ed.cc:418
+#: ardour_ui_ed.cc:497
 msgid "In/Out"
 msgstr "Ð’Ñ…/Ð’Ñ‹Ñ…"
 
-#: ardour_ui_ed.cc:421 rc_option_editor.cc:1801
+#: ardour_ui_ed.cc:500 rc_option_editor.cc:1941
 msgid "Click"
 msgstr "Метроном"
 
-#: ardour_ui_ed.cc:424
+#: ardour_ui_ed.cc:503
 msgid "Auto Input"
 msgstr "Автовход"
 
-#: ardour_ui_ed.cc:427
+#: ardour_ui_ed.cc:506
 msgid "Auto Play"
 msgstr "Автовоспр."
 
-#: ardour_ui_ed.cc:438
+#: ardour_ui_ed.cc:517
 msgid "Sync Startup to Video"
 msgstr "Синхронизировать начало с видео"
 
-#: ardour_ui_ed.cc:440
+#: ardour_ui_ed.cc:519
 msgid "Time Master"
 msgstr "Ведущий времени"
 
-#: ardour_ui_ed.cc:442
+#: ardour_ui_ed.cc:521
 msgid "Use External Positional Sync Source"
-msgstr ""
+msgstr "Использовать внешний источник позиционной синхронизации"
 
-#: ardour_ui_ed.cc:447
+#: ardour_ui_ed.cc:526
 msgid "Toggle Record Enable Track %1"
 msgstr "Переключить записываемость дорожки %1"
 
-#: ardour_ui_ed.cc:454
+#: ardour_ui_ed.cc:533
 msgid "Percentage"
 msgstr "Проценты"
 
-#: ardour_ui_ed.cc:455 shuttle_control.cc:188
+#: ardour_ui_ed.cc:534 shuttle_control.cc:206
 msgid "Semitones"
 msgstr "Полутона"
 
-#: ardour_ui_ed.cc:459
+#: ardour_ui_ed.cc:538
 msgid "Send MTC"
 msgstr "Передавать MTC"
 
-#: ardour_ui_ed.cc:461
+#: ardour_ui_ed.cc:540
 msgid "Send MMC"
 msgstr "Передавать MMC"
 
-#: ardour_ui_ed.cc:463
+#: ardour_ui_ed.cc:542
 msgid "Use MMC"
 msgstr "Использовать MMC"
 
-#: ardour_ui_ed.cc:465 rc_option_editor.cc:2594
+#: ardour_ui_ed.cc:544 rc_option_editor.cc:2730
 msgid "Send MIDI Clock"
 msgstr "Отправлять MIDI Clock"
 
-#: ardour_ui_ed.cc:467
+#: ardour_ui_ed.cc:546
 msgid "Send MIDI Feedback"
 msgstr "Отправлять MIDI Feedback"
 
-#: ardour_ui_ed.cc:473
+#: ardour_ui_ed.cc:552
 msgid "Panic"
 msgstr "Паника"
 
-#: ardour_ui_ed.cc:567
+#: ardour_ui_ed.cc:618
 msgid "Wall Clock"
 msgstr "Текущее время"
 
-#: ardour_ui_ed.cc:569
+#: ardour_ui_ed.cc:620
 msgid "Disk Space"
 msgstr "Диск. пространство"
 
-#: ardour_ui_ed.cc:570
+#: ardour_ui_ed.cc:621
 msgid "DSP"
 msgstr "DSP"
 
-#: ardour_ui_ed.cc:571
+#: ardour_ui_ed.cc:622
 msgid "X-run"
 msgstr ""
 
-#: ardour_ui_ed.cc:572
+#: ardour_ui_ed.cc:623
 msgid "Active Peak-file Work"
 msgstr ""
 
-#: ardour_ui_ed.cc:573
+#: ardour_ui_ed.cc:624
 msgid "Buffers"
 msgstr "Буферы"
 
-#: ardour_ui_ed.cc:575
+#: ardour_ui_ed.cc:626
 msgid "Timecode Format"
 msgstr "Формат тайм-кода"
 
-#: ardour_ui_ed.cc:576
+#: ardour_ui_ed.cc:627
 msgid "File Format"
 msgstr "Формат файлов"
 
-#: ardour_ui_options.cc:63
+#: ardour_ui_options.cc:55
 msgid ""
 "It is not possible to use JACK as the the sync source\n"
 "when the pull up/down setting is non-zero."
@@ -2508,133 +2728,137 @@ msgstr ""
 "Не возможно использовать JACK, как синхронизатор источника,\n"
 "когда установки растяжки вверх/вниз не равны нулю."
 
-#: ardour_ui_options.cc:317
+#: ardour_ui_options.cc:309
 msgid "Internal"
 msgstr "Внутр. синхронизация"
 
-#: ardour_ui_options.cc:509
+#: ardour_ui_options.cc:518
 msgid "Enable/Disable external positional sync"
 msgstr "Включить или выключить внешнюю синхронизацию позиционирования"
 
-#: ardour_ui_options.cc:511
+#: ardour_ui_options.cc:520
 msgid "Sync to JACK is not possible: video pull up/down is set"
 msgstr ""
 "Синхронизация с JACK не возможна: установлена растяжка видео вверх/вниз"
 
-#: audio_clock.cc:1051 audio_clock.cc:1070
+#: audio_clock.cc:1057 audio_clock.cc:1076
 msgid "--pending--"
 msgstr "--в ожидании--"
 
-#: audio_clock.cc:1122
+#: audio_clock.cc:1128
 msgid "SR"
 msgstr "SR"
 
-#: audio_clock.cc:1128 audio_clock.cc:1132
+#: audio_clock.cc:1134 audio_clock.cc:1138
 msgid "Pull"
 msgstr "Подтягивание"
 
-#: audio_clock.cc:1130
+#: audio_clock.cc:1136
 #, c-format
 msgid "%+.4f%%"
 msgstr "%+.4f%%"
 
-#: audio_clock.cc:1286 editor.cc:263 editor_actions.cc:140
-#: editor_actions.cc:577
+#: audio_clock.cc:1292 editor.cc:323 editor_actions.cc:142
+#: editor_actions.cc:602
 msgid "Tempo"
 msgstr "Темп"
 
-#: audio_clock.cc:1290 editor.cc:264 editor_actions.cc:578
+#: audio_clock.cc:1296 editor.cc:324 editor_actions.cc:603
 msgid "Meter"
 msgstr "Размер"
 
-#: audio_clock.cc:1871 audio_streamview.cc:116 editor_actions.cc:1108
-#: session_metadata_dialog.cc:452 session_metadata_dialog.cc:500
-#: session_metadata_dialog.cc:556 session_metadata_dialog.cc:845
-#: streamview.cc:469
+#: audio_clock.cc:1878 audio_streamview.cc:117 editor_actions.cc:1092
+#: luainstance.cc:967 luainstance.cc:1593 plugin_pin_dialog.cc:859
+#: plugin_selector.cc:995 plugin_selector.cc:1016
+#: session_metadata_dialog.cc:455 session_metadata_dialog.cc:503
+#: session_metadata_dialog.cc:559 session_metadata_dialog.cc:848
+#: streamview.cc:474
 msgid "programming error: %1"
 msgstr "Ошибка в программе: %1"
 
-#: audio_clock.cc:2004 audio_clock.cc:2032
+#: audio_clock.cc:2011 audio_clock.cc:2039
 msgid "programming error: %1 %2"
 msgstr "Ошибка в программе: %1 %2"
 
-#: audio_clock.cc:2118 editor.cc:260 export_timespan_selector.cc:95
+#: audio_clock.cc:2123 editor.cc:320 export_timespan_selector.cc:105
 msgid "Bars:Beats"
 msgstr "Такты : Доли"
 
-#: audio_clock.cc:2119 export_timespan_selector.cc:90
+#: audio_clock.cc:2124 export_timespan_selector.cc:100
 msgid "Minutes:Seconds"
-msgstr "Минуты : Секунды"
+msgstr "Минуты:Секунды"
 
-#: audio_clock.cc:2124
+#: audio_clock.cc:2129
 msgid "Set from Playhead"
-msgstr ""
+msgstr "По указателю воспроизведения"
 
-#: audio_clock.cc:2125
+#: audio_clock.cc:2130
 msgid "Locate to This Time"
 msgstr "Перейти к этой позиции"
 
-#: audio_clock.cc:2128
+#: audio_clock.cc:2133
 msgid "Copy to clipboard"
 msgstr "Скопировать в буфер обмена"
 
-#: audio_region_editor.cc:65 control_point_dialog.cc:49 rhythm_ferret.cc:124
-#: rhythm_ferret.cc:129 rhythm_ferret.cc:134
+#: audio_region_editor.cc:60 control_point_dialog.cc:49 rhythm_ferret.cc:137
+#: rhythm_ferret.cc:154
 msgid "dB"
 msgstr "Дб"
 
-#: audio_region_editor.cc:68
+#: audio_region_editor.cc:63
 msgid "Region gain:"
 msgstr "Усиление области:"
 
-#: audio_region_editor.cc:78 export_format_dialog.cc:43
+#: audio_region_editor.cc:73 export_format_dialog.cc:49 export_report.cc:772
+#: export_report.cc:1185 fft_graph.cc:497 normalize_dialog.cc:49
+#: strip_silence_dialog.cc:67
 msgid "dBFS"
 msgstr "dBFS"
 
-#: audio_region_editor.cc:81
+#: audio_region_editor.cc:76
 msgid "Peak amplitude:"
 msgstr "Пиковая амплитуда:"
 
-#: audio_region_editor.cc:92
+#: audio_region_editor.cc:87
 msgid "Calculating..."
 msgstr "Производится вычисление..."
 
-#: audio_region_view.cc:1371
+#: audio_region_view.cc:1385
 msgid "add gain control point"
 msgstr "Добавление точки контроля усиления"
 
-#: automation_controller.cc:292 automation_controller.cc:308
+#: automation_controller.cc:304 automation_controller.cc:320
 msgid "Select Note..."
 msgstr "Выбрать ноту..."
 
-#: automation_controller.cc:299
+#: automation_controller.cc:311
 msgid "Halve"
 msgstr "Половина"
 
-#: automation_controller.cc:302
+#: automation_controller.cc:314
 msgid "Double"
 msgstr "Двойной"
 
-#: automation_controller.cc:313
+#: automation_controller.cc:325
 msgid "Set to %1 beat"
 msgid_plural "Set to %1 beats"
 msgstr[0] "Сделать равным %1 удару"
 msgstr[1] "Сделать равным %1 ударам"
 msgstr[2] "Сделать равным %1 ударам"
 
-#: automation_line.cc:285 editor_drag.cc:4255
+#: automation_line.cc:292 editor_drag.cc:4387
 msgid "automation event move"
 msgstr "Смещение события автоматизации"
 
-#: automation_line.cc:881 region_gain_line.cc:75
+#: automation_line.cc:888 region_gain_line.cc:75
 msgid "remove control point"
 msgstr "Удаление контрольной точки"
 
-#: automation_line.cc:1006
+#: automation_line.cc:1013
 msgid "Ignoring illegal points on AutomationLine \"%1\""
 msgstr "Игнорирование некорреткных точек на линии автоматизации \"%1\""
 
-#: automation_region_view.cc:193 automation_time_axis.cc:647
+#: automation_region_view.cc:193 automation_time_axis.cc:649
 msgid "add automation event"
 msgstr "Новое событие автоматизации"
 
@@ -2650,59 +2874,59 @@ msgstr "Состояние автоматизации"
 msgid "hide track"
 msgstr "Скрыть дорожку"
 
-#: automation_time_axis.cc:308 automation_time_axis.cc:360
-#: automation_time_axis.cc:554 gain_meter.cc:222 generic_pluginui.cc:526
-#: generic_pluginui.cc:820 panner_ui.cc:151
+#: automation_time_axis.cc:310 automation_time_axis.cc:362
+#: automation_time_axis.cc:556 gain_meter.cc:230 generic_pluginui.cc:601
+#: generic_pluginui.cc:949 panner_ui.cc:151
 msgid "Automation|Manual"
 msgstr "Вручную"
 
-#: automation_time_axis.cc:310 automation_time_axis.cc:371
-#: automation_time_axis.cc:559 editor.cc:1928 editor.cc:2006
-#: editor_actions.cc:123 editor_actions.cc:1939 gain_meter.cc:225
-#: generic_pluginui.cc:102 generic_pluginui.cc:529 generic_pluginui.cc:822
-#: midi_time_axis.cc:1614 midi_time_axis.cc:1617 midi_time_axis.cc:1620
+#: automation_time_axis.cc:312 automation_time_axis.cc:373
+#: automation_time_axis.cc:561 editor.cc:2034 editor.cc:2112
+#: editor_actions.cc:125 editor_actions.cc:1937 gain_meter.cc:232
+#: generic_pluginui.cc:101 generic_pluginui.cc:604 generic_pluginui.cc:951
+#: midi_time_axis.cc:1610 midi_time_axis.cc:1613 midi_time_axis.cc:1616
 #: panner_ui.cc:154
 msgid "Play"
 msgstr "Проигрывание"
 
-#: automation_time_axis.cc:312 automation_time_axis.cc:382
-#: automation_time_axis.cc:564 gain_meter.cc:228 generic_pluginui.cc:104
-#: generic_pluginui.cc:532 generic_pluginui.cc:824 panner_ui.cc:157
+#: automation_time_axis.cc:314 automation_time_axis.cc:384
+#: automation_time_axis.cc:566 gain_meter.cc:234 generic_pluginui.cc:103
+#: generic_pluginui.cc:607 generic_pluginui.cc:953 panner_ui.cc:157
 msgid "Write"
 msgstr "Запись"
 
-#: automation_time_axis.cc:314 automation_time_axis.cc:393
-#: automation_time_axis.cc:569 gain_meter.cc:231 generic_pluginui.cc:106
-#: generic_pluginui.cc:535 generic_pluginui.cc:826 panner_ui.cc:160
+#: automation_time_axis.cc:316 automation_time_axis.cc:395
+#: automation_time_axis.cc:571 gain_meter.cc:236 generic_pluginui.cc:105
+#: generic_pluginui.cc:610 generic_pluginui.cc:955 panner_ui.cc:160
 msgid "Touch"
 msgstr "Касание"
 
-#: automation_time_axis.cc:404 generic_pluginui.cc:538 meter_patterns.cc:118
+#: automation_time_axis.cc:406 generic_pluginui.cc:613 meter_patterns.cc:118
 msgid "???"
 msgstr "???"
 
-#: automation_time_axis.cc:445
+#: automation_time_axis.cc:447
 msgid "clear automation"
 msgstr "Очистить автоматизацию"
 
-#: automation_time_axis.cc:545 rc_option_editor.cc:2770
-#: rc_option_editor.cc:2775 rc_option_editor.cc:2821 rc_option_editor.cc:2826
+#: automation_time_axis.cc:547 rc_option_editor.cc:2919
+#: rc_option_editor.cc:2924 rc_option_editor.cc:2974 rc_option_editor.cc:2979
 msgid "Clear"
 msgstr "Очистить"
 
-#: automation_time_axis.cc:576
+#: automation_time_axis.cc:578
 msgid "State"
 msgstr "Состояние"
 
-#: automation_time_axis.cc:592
+#: automation_time_axis.cc:594
 msgid "Discrete"
 msgstr "Дискретный"
 
-#: automation_time_axis.cc:598 export_format_dialog.cc:489
+#: automation_time_axis.cc:600 export_format_dialog.cc:552
 msgid "Linear"
 msgstr "Линейная"
 
-#: automation_time_axis.cc:604 rhythm_ferret.cc:109 shuttle_control.cc:207
+#: automation_time_axis.cc:606 rhythm_ferret.cc:118 shuttle_control.cc:225
 msgid "Mode"
 msgstr "Режим"
 
@@ -2718,35 +2942,38 @@ msgstr "Изменение пакета"
 msgid "Direction:"
 msgstr "Направление:"
 
-#: bundle_manager.cc:206 bundle_manager.cc:210 engine_dialog.cc:949
-#: mixer_strip.cc:168 mixer_strip.cc:382 mixer_strip.cc:2347
-#: rc_option_editor.cc:2944
+#: bundle_manager.cc:206 bundle_manager.cc:210 engine_dialog.cc:976
+#: mixer_strip.cc:175 mixer_strip.cc:392 mixer_strip.cc:2459
+#: rc_option_editor.cc:3142
 msgid "Input"
 msgstr "Вход"
 
 #: bundle_manager.cc:207 bundle_manager.cc:212 bundle_manager.cc:246
-#: engine_dialog.cc:951 mixer_strip.cc:172 mixer_strip.cc:386
-#: mixer_strip.cc:2350 monitor_section.cc:295 monitor_section.cc:299
-#: rc_option_editor.cc:2948
+#: engine_dialog.cc:978 mixer_strip.cc:179 mixer_strip.cc:396
+#: mixer_strip.cc:2462 monitor_section.cc:296 monitor_section.cc:300
+#: rc_option_editor.cc:3146
 msgid "Output"
 msgstr "Выход"
 
-#: bundle_manager.cc:265 editor.cc:1970 editor_actions.cc:95
-#: editor_actions.cc:105 rc_option_editor.cc:2782 rc_option_editor.cc:2796
+#: bundle_manager.cc:265 editor.cc:2076 editor_actions.cc:97
+#: editor_actions.cc:107 lua_script_manager.cc:33 rc_option_editor.cc:2931
+#: rc_option_editor.cc:2945
 msgid "Edit"
 msgstr "Правка"
 
-#: bundle_manager.cc:266 editor.cc:5948 editor.cc:5978 editor_actions.cc:346
-#: editor_actions.cc:347 plugin_ui.cc:420 processor_box.cc:2832
+#: bundle_manager.cc:266 editor.cc:5963 editor.cc:5993 editor_actions.cc:360
+#: editor_actions.cc:361 luawindow.cc:101 plugin_ui.cc:421
+#: processor_box.cc:3681 processor_box.cc:3683
 msgid "Delete"
 msgstr "Удалить"
 
 #: bundle_manager.cc:272 bundle_manager.cc:439 editor_route_groups.cc:98
-#: editor_routes.cc:208 midi_list_editor.cc:107 session_metadata_dialog.cc:646
+#: editor_routes.cc:233 lua_script_manager.cc:42 lua_script_manager.cc:76
+#: midi_list_editor.cc:107 session_metadata_dialog.cc:649
 msgid "Name"
 msgstr "Имя"
 
-#: bundle_manager.cc:283
+#: bundle_manager.cc:283 luawindow.cc:566
 msgid "New"
 msgstr "Создать"
 
@@ -2762,6 +2989,38 @@ msgstr "Добавить канал"
 msgid "Rename Channel"
 msgstr "Переименовать канал"
 
+#: color_theme_manager.cc:58
+msgid "Restore Defaults"
+msgstr "Восстановить исходные значения"
+
+#: color_theme_manager.cc:62
+msgid "Color Theme"
+msgstr "Тема цветового оформления"
+
+#: color_theme_manager.cc:118
+msgid "Object"
+msgstr "Объект"
+
+#: color_theme_manager.cc:121 route_group_dialog.cc:53 route_group_dialog.cc:81
+msgid "Color"
+msgstr "Цвет"
+
+#: color_theme_manager.cc:143
+msgid "Items"
+msgstr "Элементы"
+
+#: color_theme_manager.cc:144
+msgid "Palette"
+msgstr "Палитра"
+
+#: color_theme_manager.cc:145
+msgid "Transparency"
+msgstr "Прозрачность"
+
+#: color_theme_manager.cc:467
+msgid "Color Palette"
+msgstr "Цветовая палитра"
+
 #: configinfo.cc:28
 msgid "Build Configuration"
 msgstr "Конфигурация сборки"
@@ -2774,6 +3033,19 @@ msgstr "Контрольная точка"
 msgid "Value"
 msgstr "Значение"
 
+#: control_slave_ui.cc:50 mixer_ui.cc:254
+msgid "Control Masters"
+msgstr "Ведущие каналы"
+
+#: control_slave_ui.cc:54
+msgid "-vca-"
+msgstr ""
+
+#: control_slave_ui.cc:211
+#, fuzzy
+msgid "Unassign All"
+msgstr "Не назначен"
+
 #: duplicate_routes_dialog.cc:35
 msgid "Duplicate Tracks & Busses"
 msgstr "Создать копии дорожек и шин"
@@ -2835,593 +3107,599 @@ msgstr "Высота тона"
 msgid "Velocity"
 msgstr "Сила нажатия"
 
-#: edit_note_dialog.cc:88 patch_change_dialog.cc:66
+#: edit_note_dialog.cc:88 export_report.cc:246 export_report.cc:688
+#: patch_change_dialog.cc:66
 msgid "Time"
 msgstr "Время"
 
-#: edit_note_dialog.cc:98 editor_regions.cc:118 export_timespan_selector.cc:375
-#: export_timespan_selector.cc:437 location_ui.cc:322 midi_list_editor.cc:115
-#: time_info_box.cc:108
+#: edit_note_dialog.cc:99 editor_regions.cc:162 export_timespan_selector.cc:415
+#: export_timespan_selector.cc:506 location_ui.cc:322 midi_list_editor.cc:115
+#: time_info_box.cc:102
 msgid "Length"
 msgstr "Длительность"
 
-#: edit_note_dialog.cc:165
+#: edit_note_dialog.cc:166
 msgid "edit note"
 msgstr "Правка ноты"
 
-#: editor.cc:150
+#: editor.cc:160
 msgid "CD Frames"
 msgstr "Выборки CD"
 
-#: editor.cc:151
+#: editor.cc:161
 msgid "TC Frames"
 msgstr "TC кадры"
 
-#: editor.cc:152
+#: editor.cc:162
 msgid "TC Seconds"
 msgstr "TC секунды"
 
-#: editor.cc:153
+#: editor.cc:163
 msgid "TC Minutes"
 msgstr "TC минуты"
 
-#: editor.cc:154
+#: editor.cc:164
 msgid "Seconds"
 msgstr "Секунды"
 
-#: editor.cc:155
+#: editor.cc:165
 msgid "Minutes"
 msgstr "Минуты"
 
-#: editor.cc:156 quantize_dialog.cc:37 quantize_dialog.cc:141
+#: editor.cc:166 quantize_dialog.cc:37
 msgid "Beats/128"
 msgstr "Доли/128"
 
-#: editor.cc:157 quantize_dialog.cc:38 quantize_dialog.cc:143
+#: editor.cc:167 quantize_dialog.cc:38
 msgid "Beats/64"
 msgstr "Доли/64"
 
-#: editor.cc:158 quantize_dialog.cc:39 quantize_dialog.cc:145
+#: editor.cc:168 quantize_dialog.cc:39
 msgid "Beats/32"
 msgstr "Доли/32"
 
-#: editor.cc:159
+#: editor.cc:169 quantize_dialog.cc:40
 msgid "Beats/28"
 msgstr "Доли/28"
 
-#: editor.cc:160
+#: editor.cc:170 quantize_dialog.cc:41
 msgid "Beats/24"
 msgstr "Доли/24"
 
-#: editor.cc:161
+#: editor.cc:171 quantize_dialog.cc:42
 msgid "Beats/20"
 msgstr "Доли/20"
 
-#: editor.cc:162 quantize_dialog.cc:40 quantize_dialog.cc:147
+#: editor.cc:172 quantize_dialog.cc:43
 msgid "Beats/16"
 msgstr "Доли/16"
 
-#: editor.cc:163
+#: editor.cc:173 quantize_dialog.cc:44
 msgid "Beats/14"
 msgstr "Доли/14"
 
-#: editor.cc:164
+#: editor.cc:174 quantize_dialog.cc:45
 msgid "Beats/12"
 msgstr "Доли/12"
 
-#: editor.cc:165
+#: editor.cc:175 quantize_dialog.cc:46
 msgid "Beats/10"
 msgstr "Доли/10"
 
-#: editor.cc:166 quantize_dialog.cc:41 quantize_dialog.cc:149
+#: editor.cc:176 quantize_dialog.cc:47
 msgid "Beats/8"
 msgstr "Доли/8"
 
-#: editor.cc:167
+#: editor.cc:177 quantize_dialog.cc:48
 msgid "Beats/7"
 msgstr "Доли/7"
 
-#: editor.cc:168
+#: editor.cc:178 quantize_dialog.cc:49
 msgid "Beats/6"
 msgstr "Доли/6"
 
-#: editor.cc:169
+#: editor.cc:179 quantize_dialog.cc:50
 msgid "Beats/5"
 msgstr "Доли/5"
 
-#: editor.cc:170 quantize_dialog.cc:42 quantize_dialog.cc:151
+#: editor.cc:180 quantize_dialog.cc:51
 msgid "Beats/4"
 msgstr "Доли/4"
 
-#: editor.cc:171 quantize_dialog.cc:43 quantize_dialog.cc:153
+#: editor.cc:181 quantize_dialog.cc:52
 msgid "Beats/3"
 msgstr "Доли/3"
 
-#: editor.cc:172 quantize_dialog.cc:44 quantize_dialog.cc:155
+#: editor.cc:182 quantize_dialog.cc:53
 msgid "Beats/2"
 msgstr "Доли/2"
 
-#: editor.cc:173 quantize_dialog.cc:45 quantize_dialog.cc:157
+#: editor.cc:183 quantize_dialog.cc:54
 msgid "Beats"
 msgstr "Доли"
 
-#: editor.cc:174
+#: editor.cc:184
 msgid "Bars"
 msgstr "Такты"
 
-#: editor.cc:175
+#: editor.cc:185
 msgid "Marks"
 msgstr "Маркеры"
 
-#: editor.cc:176
+#: editor.cc:186
 msgid "Region starts"
 msgstr "Начала областей"
 
-#: editor.cc:177
+#: editor.cc:187
 msgid "Region ends"
 msgstr "Концы областей"
 
-#: editor.cc:178
+#: editor.cc:188
 msgid "Region syncs"
 msgstr "Синхр. областей"
 
-#: editor.cc:179
+#: editor.cc:189
 msgid "Region bounds"
 msgstr "Границы областей"
 
-#: editor.cc:184 editor_actions.cc:526
+#: editor.cc:194 editor_actions.cc:551
 msgid "No Grid"
 msgstr "Без сетки"
 
-#: editor.cc:185 editor_actions.cc:527
+#: editor.cc:195 editor_actions.cc:552
 msgid "Grid"
 msgstr "По сетке"
 
-#: editor.cc:186 editor_actions.cc:528
+#: editor.cc:196 editor_actions.cc:553
 msgid "Magnetic"
 msgstr "Магнит"
 
-#: editor.cc:191 editor.cc:209 editor_actions.cc:122 editor_actions.cc:509
+#: editor.cc:201 editor.cc:219 editor_actions.cc:124 editor_actions.cc:534
 msgid "Playhead"
 msgstr "Указатель воспроизведения"
 
-#: editor.cc:192 editor_actions.cc:511
+#: editor.cc:202 editor_actions.cc:536
 msgid "Marker"
 msgstr "Маркер"
 
-#: editor.cc:193 editor.cc:210 editor_actions.cc:510
+#: editor.cc:203 editor.cc:220 editor_actions.cc:535
 msgid "Mouse"
 msgstr "Мышь"
 
-#: editor.cc:198 editor_actions.cc:518
+#: editor.cc:208 editor_actions.cc:543
 msgid "Slide"
 msgstr "Слайд"
 
-#: editor.cc:199
+#: editor.cc:209
 msgid "Splice"
 msgstr "Стыковка"
 
-#: editor.cc:200 editor_actions.cc:517
+#: editor.cc:210 editor_actions.cc:542
 msgid "Ripple"
 msgstr "Рябь"
 
-#: editor.cc:201 editor_actions.cc:1808 editor_markers.cc:905
-#: editor_rulers.cc:259 location_ui.cc:60
+#: editor.cc:211 editor_actions.cc:1806 editor_markers.cc:910
+#: editor_rulers.cc:259 location_ui.cc:62
 msgid "Lock"
 msgstr "Блок"
 
-#: editor.cc:206 mono_panner_editor.cc:44
+#: editor.cc:216 mono_panner_editor.cc:44
 msgid "Left"
 msgstr "Влево"
 
-#: editor.cc:207 mono_panner_editor.cc:49
+#: editor.cc:217 mono_panner_editor.cc:49
 msgid "Right"
 msgstr "Вправо"
 
-#: editor.cc:208
+#: editor.cc:218
 msgid "Center"
 msgstr "По центру"
 
-#: editor.cc:211
+#: editor.cc:221
 msgid "Edit point"
 msgstr "Курсор редактора"
 
-#: editor.cc:217
+#: editor.cc:227
 msgid "Mushy"
 msgstr "Мягкое"
 
-#: editor.cc:218
+#: editor.cc:228
 msgid "Smooth"
 msgstr "Сглаживание"
 
-#: editor.cc:219
+#: editor.cc:229
 msgid "Balanced multitimbral mixture"
 msgstr "Сбалансированный многотембральный микс"
 
-#: editor.cc:220
+#: editor.cc:230
 msgid "Unpitched percussion with stable notes"
 msgstr "Перкуссионное соло без коррекции высоты тона с выделяющимися нотами"
 
-#: editor.cc:221
+#: editor.cc:231
 msgid "Crisp monophonic instrumental"
 msgstr "Чистое монофоническое инструментальное соло"
 
-#: editor.cc:222
+#: editor.cc:232
 msgid "Unpitched solo percussion"
 msgstr "Перкуссионное соло без коррекции высоты тона"
 
-#: editor.cc:223
+#: editor.cc:233
 msgid "Resample without preserving pitch"
 msgstr "Ресэмплировать, не сохраняя высоту тона"
 
-#: editor.cc:259
+#: editor.cc:319
 msgid "Mins:Secs"
 msgstr "Минуты:Секунды"
 
-#: editor.cc:265
+#: editor.cc:325
 msgid "Location Markers"
 msgstr "Маркеры позиций"
 
-#: editor.cc:266
+#: editor.cc:326
 msgid "Range Markers"
 msgstr "Маркеры выделений"
 
-#: editor.cc:267
+#: editor.cc:327
 msgid "Loop/Punch Ranges"
 msgstr "Диапазоны петель/врезок"
 
-#: editor.cc:268 editor_actions.cc:581
+#: editor.cc:328 editor_actions.cc:606
 msgid "CD Markers"
 msgstr "Маркеры CD"
 
-#: editor.cc:269
+#: editor.cc:329
 msgid "Video Timeline"
 msgstr "Видеолинейка"
 
-#: editor.cc:286
+#: editor.cc:386
 msgid "mode"
 msgstr "Режим"
 
-#: editor.cc:465 editor_actions.cc:115 editor_actions.cc:580
+#: editor.cc:535 editor_actions.cc:117 editor_actions.cc:605
 msgid "Markers"
 msgstr "Маркеры"
 
-#: editor.cc:583 rc_option_editor.cc:2393
+#: editor.cc:653 rc_option_editor.cc:2527
 msgid "Regions"
 msgstr "Области"
 
-#: editor.cc:584
+#: editor.cc:654
 msgid "Tracks & Busses"
 msgstr "Дорожки и шины"
 
-#: editor.cc:585
+#: editor.cc:655
 msgid "Snapshots"
 msgstr "Снимки"
 
-#: editor.cc:586
+#: editor.cc:656
 msgid "Track & Bus Groups"
 msgstr "Группы дорожек и шин"
 
-#: editor.cc:587
+#: editor.cc:657
 msgid "Ranges & Marks"
 msgstr "Области и маркеры"
 
-#: editor.cc:734 editor.cc:5800 rc_option_editor.cc:2061
-#: rc_option_editor.cc:2075 rc_option_editor.cc:2079 rc_option_editor.cc:2087
-#: rc_option_editor.cc:2095 rc_option_editor.cc:2104 rc_option_editor.cc:2113
-#: rc_option_editor.cc:2121 rc_option_editor.cc:2129 rc_option_editor.cc:2139
-#: rc_option_editor.cc:2141 rc_option_editor.cc:2165 rc_option_editor.cc:2177
-#: rc_option_editor.cc:2188 rc_option_editor.cc:2206 rc_option_editor.cc:2208
-#: rc_option_editor.cc:2211 rc_option_editor.cc:2220 rc_option_editor.cc:2238
-#: rc_option_editor.cc:2250 rc_option_editor.cc:2252
-msgid "Editor"
-msgstr "Редактор"
-
-#: editor.cc:1348 editor.cc:4783 editor_actions.cc:135 editor_actions.cc:1884
+#: editor.cc:1334 editor.cc:4738 editor_actions.cc:137 editor_actions.cc:1882
 msgid "Loop"
 msgstr "Петля"
 
-#: editor.cc:1354 editor.cc:4810 editor_actions.cc:136 time_info_box.cc:68
+#: editor.cc:1340 editor.cc:4765 editor_actions.cc:138 time_info_box.cc:62
 msgid "Punch"
 msgstr "Врезка"
 
-#: editor.cc:1466 rc_option_editor.cc:2159
+#: editor.cc:1475 rc_option_editor.cc:2299
 msgid "Linear (for highly correlated material)"
 msgstr "Линейно (для схожего материала)"
 
-#: editor.cc:1476 rc_option_editor.cc:2160
+#: editor.cc:1485 rc_option_editor.cc:2300
 msgid "Constant power"
 msgstr "С постоянной силой"
 
-#: editor.cc:1485 rc_option_editor.cc:2161
+#: editor.cc:1494 rc_option_editor.cc:2301
 msgid "Symmetric"
 msgstr "Симметрично"
 
-#: editor.cc:1495 rc_option_editor.cc:2162
+#: editor.cc:1504 rc_option_editor.cc:2302
 msgid "Slow"
 msgstr "Медленно"
 
-#: editor.cc:1504 rc_option_editor.cc:2163 sfdb_ui.cc:1767 sfdb_ui.cc:1878
+#: editor.cc:1513 rc_option_editor.cc:2303 sfdb_ui.cc:1737 sfdb_ui.cc:1847
 msgid "Fast"
 msgstr "Быстро"
 
-#: editor.cc:1526 editor.cc:1551
+#: editor.cc:1535 editor.cc:1560
 msgid "Deactivate"
 msgstr "Деактивировать"
 
-#: editor.cc:1528 editor.cc:1553
+#: editor.cc:1537 editor.cc:1562
 msgid "Activate"
 msgstr "Активировать"
 
-#: editor.cc:1654 editor.cc:1662 editor_ops.cc:3855
+#: editor.cc:1663 editor.cc:1671 editor_ops.cc:3921
 msgid "Freeze"
 msgstr "Заморозить"
 
-#: editor.cc:1658
+#: editor.cc:1667
 msgid "Unfreeze"
 msgstr "Разморозить"
 
-#: editor.cc:1797
+#: editor.cc:1767
+msgid "Region Loudness Analysis"
+msgstr "Анализ громкости области"
+
+#: editor.cc:1786 editor.cc:1835
+msgid "Audio Report/Analysis"
+msgstr "Анализ звука"
+
+#: editor.cc:1816
+msgid "Range Loudness Analysis"
+msgstr "Анализ громкости выделения"
+
+#: editor.cc:1902
 msgid "Selected Regions"
 msgstr "Выделенные области"
 
-#: editor.cc:1841 editor_markers.cc:940
+#: editor.cc:1946 editor_markers.cc:945
 msgid "Play Range"
 msgstr "Воспроизвести выделение"
 
-#: editor.cc:1842 editor_markers.cc:943
+#: editor.cc:1947 editor_markers.cc:948
 msgid "Loop Range"
 msgstr "Создать петлю из выделения"
 
-#: editor.cc:1845 editor_markers.cc:950
+#: editor.cc:1950 editor_markers.cc:953
 msgid "Zoom to Range"
 msgstr "Масштабировать в выделение"
 
-#: editor.cc:1854 editor_actions.cc:383
+#: editor.cc:1953
+msgid "Loudness Analysis"
+msgstr "Анализ громкости"
+
+#: editor.cc:1960 editor_actions.cc:401
 msgid "Move Range Start to Previous Region Boundary"
 msgstr "Переместить начало выделения к границе предыдущей области"
 
-#: editor.cc:1861 editor_actions.cc:390
+#: editor.cc:1967 editor_actions.cc:408
 msgid "Move Range Start to Next Region Boundary"
 msgstr "Переместить начало выделения к границе следующей области"
 
-#: editor.cc:1868 editor_actions.cc:397
+#: editor.cc:1974 editor_actions.cc:415
 msgid "Move Range End to Previous Region Boundary"
 msgstr "Переместить конец выделения к границе предыдущей области"
 
-#: editor.cc:1875 editor_actions.cc:404
+#: editor.cc:1981 editor_actions.cc:422
 msgid "Move Range End to Next Region Boundary"
 msgstr "Переместить конец выделения к границе следующей области"
 
-#: editor.cc:1881 editor_actions.cc:134 editor_actions.cc:333
+#: editor.cc:1987 editor_actions.cc:136 editor_actions.cc:347
 msgid "Separate"
 msgstr "Разделить"
 
-#: editor.cc:1882
+#: editor.cc:1988
 msgid "Convert to Region in Region List"
 msgstr "Преобразовать в область в списке областей"
 
-#: editor.cc:1885 editor_markers.cc:970
+#: editor.cc:1991 editor_markers.cc:973
 msgid "Select All in Range"
 msgstr "Выбрать всё в выделении"
 
-#: editor.cc:1888 editor_actions.cc:305
+#: editor.cc:1994 editor_actions.cc:319
 msgid "Set Loop from Selection"
 msgstr "Создать петлю из выделения"
 
-#: editor.cc:1889 editor_actions.cc:306
+#: editor.cc:1995 editor_actions.cc:320
 msgid "Set Punch from Selection"
 msgstr "Создать врезку из выделения"
 
-#: editor.cc:1890 editor_actions.cc:307
+#: editor.cc:1996 editor_actions.cc:321
 msgid "Set Session Start/End from Selection"
 msgstr "Задать начало и конец по выделению"
 
-#: editor.cc:1893
+#: editor.cc:1999
 msgid "Add Range Markers"
 msgstr "Добавить маркеры областей"
 
-#: editor.cc:1896
+#: editor.cc:2002
 msgid "Crop Region to Range"
 msgstr "Обрезать область по выделению"
 
-#: editor.cc:1897 editor_actions.cc:319
+#: editor.cc:2003 editor_actions.cc:333
 msgid "Duplicate Range"
 msgstr "Продублировать диапазон"
 
-#: editor.cc:1900
+#: editor.cc:2006
 msgid "Consolidate Range"
 msgstr "Объединить диапазон"
 
-#: editor.cc:1901
+#: editor.cc:2007
 msgid "Consolidate Range with Processing"
-msgstr ""
+msgstr "0бъединить диапазон с постобработкой"
 
-#: editor.cc:1902
+#: editor.cc:2008
 msgid "Bounce Range to Region List"
 msgstr "Свести диапазон в список областей"
 
-#: editor.cc:1903
+#: editor.cc:2009
 msgid "Bounce Range to Region List with Processing"
 msgstr ""
 
-#: editor.cc:1904 editor_markers.cc:953
+#: editor.cc:2010 editor_markers.cc:956
 msgid "Export Range..."
 msgstr "Экспортировать выделение…"
 
-#: editor.cc:1906
+#: editor.cc:2012
 msgid "Export Video Range..."
 msgstr "Экспортировать фрагмент видео..."
 
-#: editor.cc:1922 editor.cc:2004 editor_actions.cc:311
+#: editor.cc:2028 editor.cc:2110 editor_actions.cc:325
 msgid "Play from Edit Point"
 msgstr "Воспроизвести от точки редактирования"
 
-#: editor.cc:1923 editor.cc:2005
+#: editor.cc:2029 editor.cc:2111
 msgid "Play from Start"
 msgstr "Воспроизвести от начала"
 
-#: editor.cc:1924
+#: editor.cc:2030
 msgid "Play Region"
 msgstr "Воспроизвести область"
 
-#: editor.cc:1926
+#: editor.cc:2032
 msgid "Loop Region"
 msgstr "Создать петлю из области"
 
-#: editor.cc:1936 editor.cc:2014
+#: editor.cc:2042 editor.cc:2120
 msgid "Select All in Track"
 msgstr "Выделить всё на дорожке"
 
-#: editor.cc:1937 editor.cc:2015 editor_actions.cc:195
+#: editor.cc:2043 editor.cc:2121 editor_actions.cc:196
 msgid "Select All Objects"
 msgstr "Выделить все объекты"
 
-#: editor.cc:1938 editor.cc:2016
+#: editor.cc:2044 editor.cc:2122
 msgid "Invert Selection in Track"
 msgstr "Обратить выделение на дорожке"
 
-#: editor.cc:1939 editor.cc:2017 editor_actions.cc:198
+#: editor.cc:2045 editor.cc:2123 editor_actions.cc:199
 msgid "Invert Selection"
 msgstr "Обратить выделение"
 
-#: editor.cc:1941 editor_actions.cc:200
+#: editor.cc:2047 editor_actions.cc:201
 msgid "Set Range to Loop Range"
 msgstr "Установить диапазон по диапазону петли"
 
-#: editor.cc:1942 editor_actions.cc:201
+#: editor.cc:2048 editor_actions.cc:202
 msgid "Set Range to Punch Range"
 msgstr "Установить диапазон по диапазону врезки"
 
-#: editor.cc:1943 editor_actions.cc:202
+#: editor.cc:2049 editor_actions.cc:203
 msgid "Set Range to Selected Regions"
-msgstr ""
+msgstr "Установить диапазон по выбранным областям"
 
-#: editor.cc:1945 editor.cc:2019 editor_actions.cc:204 editor_actions.cc:205
+#: editor.cc:2051 editor.cc:2125 editor_actions.cc:205 editor_actions.cc:206
 msgid "Select All After Edit Point"
 msgstr "Выделить всё после курсора редактора"
 
-#: editor.cc:1946 editor.cc:2020 editor_actions.cc:206 editor_actions.cc:207
+#: editor.cc:2052 editor.cc:2126 editor_actions.cc:207 editor_actions.cc:208
 msgid "Select All Before Edit Point"
 msgstr "Выделить всё до курсора редактора"
 
-#: editor.cc:1947 editor.cc:2021
+#: editor.cc:2053 editor.cc:2127
 msgid "Select All After Playhead"
 msgstr "Выделить всё после указателя"
 
-#: editor.cc:1948 editor.cc:2022
+#: editor.cc:2054 editor.cc:2128
 msgid "Select All Before Playhead"
 msgstr "Выделить всё до указателя"
 
-#: editor.cc:1949
+#: editor.cc:2055
 msgid "Select All Between Playhead and Edit Point"
 msgstr "Выделить всё между указателем и курсором редактора"
 
-#: editor.cc:1950
+#: editor.cc:2056
 msgid "Select All Within Playhead and Edit Point"
 msgstr "Выделить всё между указателем и точкой редактирования"
 
-#: editor.cc:1951
+#: editor.cc:2057
 msgid "Select Range Between Playhead and Edit Point"
 msgstr "Создать выделение между указателем и курсором редактора"
 
-#: editor.cc:1953 editor.cc:2024 editor_actions.cc:132 editor_actions.cc:133
+#: editor.cc:2059 editor.cc:2130 editor_actions.cc:134 editor_actions.cc:135
 msgid "Select"
 msgstr "Выделить"
 
-#: editor.cc:1961 editor.cc:2032 editor_actions.cc:345 processor_box.cc:2828
+#: editor.cc:2067 editor.cc:2138 editor_actions.cc:359 processor_box.cc:3677
 msgid "Cut"
 msgstr "Вырезать"
 
-#: editor.cc:1962 editor.cc:2033 editor_actions.cc:349 processor_box.cc:2830
+#: editor.cc:2068 editor.cc:2139 editor_actions.cc:363 processor_box.cc:3679
 msgid "Copy"
 msgstr "Копировать"
 
-#: editor.cc:1963 editor.cc:2034 editor_actions.cc:350 processor_box.cc:2835
+#: editor.cc:2069 editor.cc:2140 editor_actions.cc:364 processor_box.cc:3691
 msgid "Paste"
 msgstr "Вставить"
 
-#: editor.cc:1967 editor_actions.cc:92
+#: editor.cc:2073 editor_actions.cc:94
 msgid "Align"
 msgstr "Выровнять"
 
-#: editor.cc:1968
+#: editor.cc:2074
 msgid "Align Relative"
 msgstr "Выровнять относительно"
 
-#: editor.cc:1975
+#: editor.cc:2081
 msgid "Insert Selected Region"
 msgstr "Вставить выделенную область"
 
-#: editor.cc:1976
+#: editor.cc:2082
 msgid "Insert Existing Media"
 msgstr "Вставить существующие данные"
 
-#: editor.cc:1985 editor.cc:2041
+#: editor.cc:2091 editor.cc:2147
 msgid "Nudge Entire Track Later"
 msgstr "Толкнуть всю дорожку вперёд"
 
-#: editor.cc:1986 editor.cc:2042
+#: editor.cc:2092 editor.cc:2148
 msgid "Nudge Track After Edit Point Later"
 msgstr "Толкнуть дорожку вперёд после курсора редактора"
 
-#: editor.cc:1987 editor.cc:2043
+#: editor.cc:2093 editor.cc:2149
 msgid "Nudge Entire Track Earlier"
 msgstr "Толкнуть всю дорожку назад"
 
-#: editor.cc:1988 editor.cc:2044
+#: editor.cc:2094 editor.cc:2150
 msgid "Nudge Track After Edit Point Earlier"
 msgstr "Толкнуть дорожку назад после курсора редактора"
 
-#: editor.cc:1990 editor.cc:2046
+#: editor.cc:2096 editor.cc:2152
 msgid "Nudge"
 msgstr "Толкнуть"
 
-#: editor.cc:2261
+#: editor.cc:2354
 msgid ""
 "Playhead position stored with a negative value - ignored (use zero instead)"
 msgstr ""
 "Позиция указателя воспроизведения сохранена с негативным значением и будет "
 "проигнорирована. Вместо неё будет использовано начало сеанса."
 
-#: editor.cc:3039 editor.cc:3738 editor.cc:3809 midi_channel_selector.cc:157
+#: editor.cc:3116 editor.cc:3776 editor.cc:3847 midi_channel_selector.cc:157
 #: midi_channel_selector.cc:395 midi_channel_selector.cc:431
 msgid "All"
 msgstr "Все"
 
-#: editor.cc:3239
+#: editor.cc:3281
 msgid "Smart Mode (add range functions to Grab Mode)"
 msgstr ""
 
-#: editor.cc:3240
+#: editor.cc:3282
 msgid "Grab Mode (select/move objects)"
 msgstr "Захват (выделение и перемещение объектов)"
 
-#: editor.cc:3241
+#: editor.cc:3283
 msgid "Cut Mode (split regions)"
 msgstr "Нарезка (разделение областей)"
 
-#: editor.cc:3242
+#: editor.cc:3284
 msgid "Range Mode (select time ranges)"
 msgstr "Диапазоны (выделение диапазонов времени)"
 
-#: editor.cc:3243
+#: editor.cc:3285
 msgid "Draw Mode (draw and edit gain/notes/automation)"
 msgstr "Рисование (рисование и правка усиления, нот и автоматизации)"
 
-#: editor.cc:3244
+#: editor.cc:3286
 msgid "Stretch Mode (time-stretch audio and midi regions, preserving pitch)"
 msgstr "Растягивание (аудио и MIDI во времени с сохранением высоты тона)"
 
-#: editor.cc:3245
+#: editor.cc:3287
 msgid "Audition Mode (listen to regions)"
 msgstr "Прослушивание (областей)"
 
-#: editor.cc:3246
+#: editor.cc:3288
 msgid "Internal Edit Mode (edit notes and automation points)"
 msgstr "Правка содержимого областей (правка нот и точек автоматизации)"
 
-#: editor.cc:3247
+#: editor.cc:3289
 msgid ""
 "Groups: click to (de)activate\n"
 "Context-click for other operations"
@@ -3429,63 +3707,63 @@ msgstr ""
 "Группы: щёлкните для (де)активации\n"
 "Щелчок другой клавишей вызывает контекстное меню"
 
-#: editor.cc:3248
+#: editor.cc:3290
 msgid "Nudge Region/Selection Later"
 msgstr "Толкнуть область или выделение вперёд"
 
-#: editor.cc:3249
+#: editor.cc:3291
 msgid "Nudge Region/Selection Earlier"
 msgstr "Толкнуть область или выделение назад"
 
-#: editor.cc:3250 editor_actions.cc:270
+#: editor.cc:3292 editor_actions.cc:272
 msgid "Zoom In"
 msgstr "Увеличить"
 
-#: editor.cc:3251 editor_actions.cc:269
+#: editor.cc:3293 editor_actions.cc:271
 msgid "Zoom Out"
 msgstr "Уменьшить"
 
-#: editor.cc:3252
+#: editor.cc:3294
 msgid "Zoom to Time Scale"
 msgstr "Увеличить до шкалы времени"
 
-#: editor.cc:3253 editor.cc:3760 editor_actions.cc:271
+#: editor.cc:3295 editor.cc:3798 editor_actions.cc:273
 msgid "Zoom to Session"
 msgstr "Показать всё"
 
-#: editor.cc:3254 editor_actions.cc:113 editor_actions.cc:146
+#: editor.cc:3296 editor_actions.cc:115 editor_actions.cc:148
 msgid "Zoom Focus"
 msgstr "Фокус при масштабировании"
 
-#: editor.cc:3255
+#: editor.cc:3297
 msgid "Expand Tracks"
 msgstr "Увеличить дорожки по высоте"
 
-#: editor.cc:3256
+#: editor.cc:3298
 msgid "Shrink Tracks"
 msgstr "Уменьшить дорожки по высоте"
 
-#: editor.cc:3257
+#: editor.cc:3299
 msgid "Number of visible tracks"
 msgstr "Количество видимых дорожек"
 
-#: editor.cc:3258
+#: editor.cc:3300
 msgid "Snap/Grid Units"
 msgstr "Единица привязки/сетки"
 
-#: editor.cc:3259
+#: editor.cc:3301
 msgid "Snap/Grid Mode"
 msgstr "Режим привязки/сетки"
 
-#: editor.cc:3260 editor_actions.cc:99
+#: editor.cc:3302 editor_actions.cc:101
 msgid "Edit Point"
 msgstr "Точка редактирования"
 
-#: editor.cc:3261
+#: editor.cc:3303
 msgid "Edit Mode"
 msgstr "Режим редактирования"
 
-#: editor.cc:3262
+#: editor.cc:3304
 msgid ""
 "Nudge Clock\n"
 "(controls distance used to nudge regions and selections)"
@@ -3493,124 +3771,124 @@ msgstr ""
 "Сдвиг часов\n"
 "(расстояние, на которое подтолкнуть области и выделения)"
 
-#: editor.cc:3530 editor_actions.cc:321
+#: editor.cc:3572 editor_actions.cc:335
 msgid "Command|Undo"
 msgstr "Отменить"
 
-#: editor.cc:3532
+#: editor.cc:3574
 msgid "Command|Undo (%1)"
 msgstr "Отменить (%1)"
 
-#: editor.cc:3539 editor_actions.cc:323 editor_actions.cc:324
-#: editor_actions.cc:325
+#: editor.cc:3581 editor_actions.cc:337 editor_actions.cc:338
+#: editor_actions.cc:339
 msgid "Redo"
 msgstr "Вернуть"
 
-#: editor.cc:3542
+#: editor.cc:3584
 msgid "Redo (%1)"
 msgstr "Вернуть (%1)"
 
-#: editor.cc:3562 editor.cc:3586 editor_actions.cc:111 editor_actions.cc:1865
+#: editor.cc:3604 editor.cc:3628 editor_actions.cc:113 editor_actions.cc:1863
 msgid "Duplicate"
 msgstr "Продублировать"
 
-#: editor.cc:3563
+#: editor.cc:3605
 msgid "Number of duplications:"
 msgstr "Количество копий:"
 
-#: editor.cc:3737 route_group_dialog.cc:51 time_info_box.cc:67
+#: editor.cc:3775 route_group_dialog.cc:51 time_info_box.cc:61
 msgid "Selection"
 msgstr "Выделение"
 
-#: editor.cc:3740
+#: editor.cc:3778
 msgid "Fit 1 track"
 msgstr "Уместить 1 дорожку"
 
-#: editor.cc:3741
+#: editor.cc:3779
 msgid "Fit 2 tracks"
 msgstr "Уместить 2 дорожки"
 
-#: editor.cc:3742
+#: editor.cc:3780
 msgid "Fit 4 tracks"
 msgstr "Уместить 4 дорожки"
 
-#: editor.cc:3743
+#: editor.cc:3781
 msgid "Fit 8 tracks"
 msgstr "Уместить 8 дорожек"
 
-#: editor.cc:3744
+#: editor.cc:3782
 msgid "Fit 16 tracks"
 msgstr "Уместить 16 дорожек"
 
-#: editor.cc:3745
+#: editor.cc:3783
 msgid "Fit 24 tracks"
 msgstr "Уместить 24 дорожки"
 
-#: editor.cc:3746
+#: editor.cc:3784
 msgid "Fit 32 tracks"
 msgstr "Уместить 32 дорожки"
 
-#: editor.cc:3747
+#: editor.cc:3785
 msgid "Fit 48 tracks"
 msgstr "Уместить 48 дорожек"
 
-#: editor.cc:3748
+#: editor.cc:3786
 msgid "Fit All tracks"
 msgstr "Уместить все дорожки"
 
-#: editor.cc:3749
+#: editor.cc:3787
 msgid "Fit Selection"
 msgstr "Уместить выделение"
 
-#: editor.cc:3751
+#: editor.cc:3789 editor_actions.cc:288
 msgid "Zoom to 10 ms"
 msgstr "Отмасштабировать до 10 мс"
 
-#: editor.cc:3752
+#: editor.cc:3790 editor_actions.cc:289
 msgid "Zoom to 100 ms"
 msgstr "Отмасштабировать до 100 мс"
 
-#: editor.cc:3753
+#: editor.cc:3791 editor_actions.cc:290
 msgid "Zoom to 1 sec"
 msgstr "Отмасштабировать до 1 сек"
 
-#: editor.cc:3754
+#: editor.cc:3792 editor_actions.cc:291
 msgid "Zoom to 10 sec"
 msgstr "Отмасштабировать до 10 сек"
 
-#: editor.cc:3755
+#: editor.cc:3793 editor_actions.cc:292
 msgid "Zoom to 1 min"
 msgstr "Отмасштабировать до 1 мин"
 
-#: editor.cc:3756
+#: editor.cc:3794 editor_actions.cc:294
 msgid "Zoom to 10 min"
 msgstr "Отмасштабировать до 10 мин"
 
-#: editor.cc:3757
+#: editor.cc:3795
 msgid "Zoom to 1 hour"
 msgstr "Отмасштабировать до 1 часа"
 
-#: editor.cc:3758
+#: editor.cc:3796
 msgid "Zoom to 8 hours"
 msgstr "Отмасштабировать до 8 час"
 
-#: editor.cc:3759
+#: editor.cc:3797
 msgid "Zoom to 24 hours"
 msgstr "Отмасштабировать до 24 час"
 
-#: editor.cc:3761
+#: editor.cc:3799
 msgid "Zoom to Range/Region Selection"
 msgstr "Отмасштабировать до выбранного диапазона/области"
 
-#: editor.cc:3831
+#: editor.cc:3869
 msgid "*"
 msgstr "*"
 
-#: editor.cc:4151
+#: editor.cc:4136
 msgid "Playlist Deletion"
 msgstr "Удаление списка воспроизведения"
 
-#: editor.cc:4152
+#: editor.cc:4137
 msgid ""
 "Playlist %1 is currently unused.\n"
 "If it is kept, its audio files will not be cleaned.\n"
@@ -3620,1330 +3898,1373 @@ msgstr ""
 "Если его оставить, связанные звуковые файлы не будут подчищены.\n"
 "Если его удалить, будут подчищены и связанные звуковые файлы."
 
-#: editor.cc:4162
+#: editor.cc:4147
 msgid "Delete All Unused"
 msgstr "Удалить все неиспользуемые"
 
-#: editor.cc:4163
+#: editor.cc:4148
 msgid "Delete Playlist"
 msgstr "Удалить список"
 
-#: editor.cc:4164
+#: editor.cc:4149
 msgid "Keep Playlist"
 msgstr "Сохранить список"
 
-#: editor.cc:4165
+#: editor.cc:4150
 msgid "Keep Remaining"
 msgstr ""
 
-#: editor.cc:4166 editor_audio_import.cc:597 editor_ops.cc:6456
-#: engine_dialog.cc:2909 sfdb_freesound_mootcher.cc:69 processor_box.cc:2596
-#: processor_box.cc:2621
+#: editor.cc:4151 editor_audio_import.cc:600 editor_ops.cc:6530
+#: engine_dialog.cc:2986 sfdb_freesound_mootcher.cc:69 processor_box.cc:3443
+#: processor_box.cc:3468
 msgid "Cancel"
 msgstr "Отмена"
 
-#: editor.cc:4318
+#: editor.cc:4293
 msgid "new playlists"
 msgstr "Создать списки воспроизведения"
 
-#: editor.cc:4334
+#: editor.cc:4309
 msgid "copy playlists"
 msgstr "Скопировать списки воспроизведения"
 
-#: editor.cc:4349
+#: editor.cc:4324
 msgid "clear playlists"
 msgstr "Очистить списки воспроизведения"
 
-#: editor.cc:5095
+#: editor.cc:5049
 msgid "Please wait while %1 loads visual data."
 msgstr "Дождитесь загрузки визуальных данных в %1."
 
-#: editor.cc:5947 editor.cc:5982 editor_markers.cc:985 panner_ui.cc:412
-#: processor_box.cc:2855
+#: editor.cc:5812 editor_actions.cc:479
+msgid "Unset #%1"
+msgstr ""
+
+#: editor.cc:5813 editor_actions.cc:481
+msgid "no action bound"
+msgstr ""
+
+#: editor.cc:5962 editor.cc:5997 editor_markers.cc:998 editor_markers.cc:1018
+#: panner_ui.cc:412 processor_box.cc:3715
 msgid "Edit..."
 msgstr "Изменить"
 
-#: editor.cc:5988 editor_actions.cc:1844
+#: editor.cc:6003 editor_actions.cc:1842
 msgid "Transpose..."
 msgstr "Транспозиция…"
 
-#: editor.cc:5992 editor_actions.cc:1960
+#: editor.cc:6007 editor_actions.cc:1959
 msgid "Legatize"
 msgstr "Добавить легато"
 
-#: editor.cc:5998 editor_actions.cc:1959
+#: editor.cc:6013 editor_actions.cc:1958
 msgid "Quantize..."
 msgstr "Квантование..."
 
-#: editor.cc:6001 editor_actions.cc:1962
+#: editor.cc:6016 editor_actions.cc:1961
 msgid "Remove Overlap"
 msgstr "Убрать перекрытие"
 
-#: editor.cc:6007 editor_actions.cc:1961
+#: editor.cc:6022 editor_actions.cc:1960
 msgid "Transform..."
 msgstr "Преобразовать..."
 
-#: editor_actions.cc:93
+#: editor_actions.cc:95
 msgid "Autoconnect"
 msgstr "Автосоединение"
 
-#: editor_actions.cc:94
+#: editor_actions.cc:96
 msgid "Crossfades"
 msgstr "Кроссфейды"
 
-#: editor_actions.cc:96
+#: editor_actions.cc:98
 msgid "Move Selected Marker"
 msgstr "Переместить выделенный маркер"
 
-#: editor_actions.cc:97
+#: editor_actions.cc:99
 msgid "Select Range Operations"
 msgstr "Выбор диапазона циклов"
 
-#: editor_actions.cc:98
+#: editor_actions.cc:100
 msgid "Select Regions"
 msgstr "Выбор областей"
 
-#: editor_actions.cc:100
+#: editor_actions.cc:102
 msgid "Fade"
 msgstr "Фейд"
 
-#: editor_actions.cc:101
+#: editor_actions.cc:103
 msgid "Latch"
 msgstr "Запирание"
 
-#: editor_actions.cc:102 editor_regions.cc:115 region_editor.cc:48
+#: editor_actions.cc:104 editor_regions.cc:159 region_editor.cc:48
 msgid "Region"
 msgstr "Область"
 
-#: editor_actions.cc:103
+#: editor_actions.cc:105
 msgid "Layering"
 msgstr "Слои"
 
-#: editor_actions.cc:104 editor_regions.cc:116 stereo_panner_editor.cc:46
+#: editor_actions.cc:106 editor_regions.cc:160 stereo_panner_editor.cc:46
 msgid "Position"
 msgstr "Положение"
 
-#: editor_actions.cc:106 gain_meter.cc:158 gain_meter.cc:827 panner_ui.cc:178
-#: panner_ui.cc:637 route_time_axis.cc:529
+#: editor_actions.cc:108 gain_meter.cc:161 gain_meter.cc:848 panner_ui.cc:178
+#: panner_ui.cc:637 route_time_axis.cc:541
 msgid "Trim"
 msgstr "Обрезать"
 
-#: editor_actions.cc:107 editor_actions.cc:127 route_group_dialog.cc:46
+#: editor_actions.cc:109 editor_actions.cc:129 route_group_dialog.cc:46
 msgid "Gain"
 msgstr "Усиление"
 
-#: editor_actions.cc:108 editor_actions.cc:579
+#: editor_actions.cc:110 editor_actions.cc:604
 msgid "Ranges"
 msgstr "Выделения"
 
-#: editor_actions.cc:109 editor_actions.cc:1861 session_option_editor.cc:135
+#: editor_actions.cc:111 editor_actions.cc:1859 session_option_editor.cc:135
 #: session_option_editor.cc:144 session_option_editor.cc:151
 #: session_option_editor.cc:158 session_option_editor.cc:165
 msgid "Fades"
 msgstr "Фейды"
 
-#: editor_actions.cc:112
+#: editor_actions.cc:114
 msgid "Link"
 msgstr "Связь"
 
-#: editor_actions.cc:114
+#: editor_actions.cc:116
 msgid "Locate to Markers"
 msgstr "Перейти к маркерам"
 
-#: editor_actions.cc:116
+#: editor_actions.cc:118
 msgid "Meter falloff"
 msgstr "Спад индикатора"
 
-#: editor_actions.cc:117
+#: editor_actions.cc:119
 msgid "Meter hold"
 msgstr "Задержка индикатора"
 
-#: editor_actions.cc:118 session_option_editor.cc:342
+#: editor_actions.cc:120 session_option_editor.cc:342
 msgid "MIDI Options"
 msgstr "Параметры MIDI"
 
-#: editor_actions.cc:119
+#: editor_actions.cc:121
 msgid "Misc Options"
 msgstr "Прочие параметры"
 
-#: editor_actions.cc:120 rc_option_editor.cc:2261 route_group_dialog.cc:54
+#: editor_actions.cc:122 rc_option_editor.cc:2401 route_group_dialog.cc:54
 #: session_option_editor.cc:264 session_option_editor.cc:271
 msgid "Monitoring"
 msgstr "Мониторинг"
 
-#: editor_actions.cc:121
+#: editor_actions.cc:123
 msgid "Active Mark"
 msgstr "Активный маркер"
 
-#: editor_actions.cc:124
+#: editor_actions.cc:126
 msgid "Primary Clock"
 msgstr "Основной счётчик"
 
-#: editor_actions.cc:125
+#: editor_actions.cc:127
 msgid "Pullup / Pulldown"
 msgstr "Вверх/вниз"
 
-#: editor_actions.cc:126
+#: editor_actions.cc:128
 msgid "Region operations"
 msgstr "Действия с областями"
 
-#: editor_actions.cc:128 ruler_dialog.cc:28
+#: editor_actions.cc:130 ruler_dialog.cc:28
 msgid "Rulers"
 msgstr "Линейки"
 
-#: editor_actions.cc:129
+#: editor_actions.cc:131
 msgid "Views"
 msgstr "Виды"
 
-#: editor_actions.cc:130
+#: editor_actions.cc:132
 msgid "Scroll"
 msgstr "Прокрутка"
 
-#: editor_actions.cc:131
+#: editor_actions.cc:133
 msgid "Secondary Clock"
 msgstr "Дополнительный счётчик"
 
-#: editor_actions.cc:138
+#: editor_actions.cc:140
 msgid "Subframes"
 msgstr "Подвыборки"
 
-#: editor_actions.cc:141
+#: editor_actions.cc:143
 msgid "Timecode fps"
 msgstr "Скорость (FPS) тайм-кода"
 
-#: editor_actions.cc:142 route_time_axis.cc:587
+#: editor_actions.cc:144 route_time_axis.cc:599
 msgid "Height"
 msgstr "Высота"
 
-#: editor_actions.cc:144
+#: editor_actions.cc:146
 msgid "Tools"
 msgstr "Инструменты"
 
-#: editor_actions.cc:145
+#: editor_actions.cc:147
 msgid "View"
 msgstr "Вид"
 
-#: editor_actions.cc:147
+#: editor_actions.cc:149
 msgid "Zoom"
 msgstr "Масштаб"
 
-#: editor_actions.cc:153
-msgid "Break drag or deselect all"
-msgstr "Прервать перетаскивания или отменить все"
+#: editor_actions.cc:150
+msgid "Scripted Actions"
+msgstr "Заскриптованные действия"
 
-#: editor_actions.cc:158
+#: editor_actions.cc:159
 msgid "Session|Lock"
 msgstr "Заблокировать"
 
-#: editor_actions.cc:160
+#: editor_actions.cc:161
 msgid "Show Editor Mixer"
 msgstr "Показывать микшер редактора"
 
-#: editor_actions.cc:161
+#: editor_actions.cc:162
 msgid "Show Editor List"
 msgstr "Показывать список редактирования"
 
-#: editor_actions.cc:163
+#: editor_actions.cc:164
 msgid "Playhead to Next Region Boundary"
 msgstr "К следующей границе области"
 
-#: editor_actions.cc:164
+#: editor_actions.cc:165
 msgid "Playhead to Next Region Boundary (No Track Selection)"
 msgstr "К следующей границе области (без выделения дорожки)"
 
-#: editor_actions.cc:165
+#: editor_actions.cc:166
 msgid "Playhead to Previous Region Boundary"
 msgstr "К предыдущей границе области"
 
-#: editor_actions.cc:166
+#: editor_actions.cc:167
 msgid "Playhead to Previous Region Boundary (No Track Selection)"
 msgstr "К предыдущей границе области (без выделения дорожки)"
 
-#: editor_actions.cc:168
+#: editor_actions.cc:169
 msgid "Playhead to Next Region Start"
 msgstr "К началу следующей области"
 
-#: editor_actions.cc:169
+#: editor_actions.cc:170
 msgid "Playhead to Next Region End"
 msgstr "К концу следующей области"
 
-#: editor_actions.cc:170
+#: editor_actions.cc:171
 msgid "Playhead to Next Region Sync"
 msgstr "К следующему синхронизатору областей"
 
-#: editor_actions.cc:172
+#: editor_actions.cc:173
 msgid "Playhead to Previous Region Start"
 msgstr "К началу предыдущей области"
 
-#: editor_actions.cc:173
+#: editor_actions.cc:174
 msgid "Playhead to Previous Region End"
 msgstr "К концу предыдущей области"
 
-#: editor_actions.cc:174
+#: editor_actions.cc:175
 msgid "Playhead to Previous Region Sync"
 msgstr "К предыдущему синхронизатору областей"
 
-#: editor_actions.cc:176
+#: editor_actions.cc:177
 msgid "To Next Region Boundary"
 msgstr "К следующей границе области"
 
-#: editor_actions.cc:177
+#: editor_actions.cc:178
 msgid "To Next Region Boundary (No Track Selection)"
 msgstr "К следующей границе области (без выделения дорожки)"
 
-#: editor_actions.cc:178
+#: editor_actions.cc:179
 msgid "To Previous Region Boundary"
 msgstr "К предыдущей границе области"
 
-#: editor_actions.cc:179
+#: editor_actions.cc:180
 msgid "To Previous Region Boundary (No Track Selection)"
 msgstr "К предыдущей границе области (без выделения дорожки)"
 
-#: editor_actions.cc:181
+#: editor_actions.cc:182
 msgid "To Next Region Start"
 msgstr "К началу следующей области"
 
-#: editor_actions.cc:182
+#: editor_actions.cc:183
 msgid "To Next Region End"
 msgstr "К концу следующей области"
 
-#: editor_actions.cc:183
+#: editor_actions.cc:184
 msgid "To Next Region Sync"
 msgstr "К следующему синхронизатору области"
 
-#: editor_actions.cc:185
+#: editor_actions.cc:186
 msgid "To Previous Region Start"
 msgstr "К началу предыдущей области"
 
-#: editor_actions.cc:186
+#: editor_actions.cc:187
 msgid "To Previous Region End"
 msgstr "К концу предыдущей области"
 
-#: editor_actions.cc:187
+#: editor_actions.cc:188
 msgid "To Previous Region Sync"
 msgstr "К предыдущему синхронизатору области"
 
-#: editor_actions.cc:189
+#: editor_actions.cc:190
 msgid "To Range Start"
 msgstr "К началу области"
 
-#: editor_actions.cc:190
+#: editor_actions.cc:191
 msgid "To Range End"
 msgstr "К концу области"
 
-#: editor_actions.cc:192
+#: editor_actions.cc:193
 msgid "Playhead to Range Start"
-msgstr "К началу области"
+msgstr "К началу диапазона"
 
-#: editor_actions.cc:193
+#: editor_actions.cc:194
 msgid "Playhead to Range End"
-msgstr "К концу области"
+msgstr "К концу диапазона"
 
-#: editor_actions.cc:196
+#: editor_actions.cc:197
 msgid "Select All Tracks"
 msgstr "Выбрать все дорожки"
 
-#: editor_actions.cc:197 export_timespan_selector.cc:59 processor_box.cc:2841
+#: editor_actions.cc:198 export_timespan_selector.cc:62 processor_box.cc:3697
 msgid "Deselect All"
 msgstr "Снять все выделения"
 
-#: editor_actions.cc:209
+#: editor_actions.cc:210
 msgid "Select All Overlapping Edit Range"
 msgstr "Выделить всю пересекающуюся область правки"
 
-#: editor_actions.cc:210
+#: editor_actions.cc:211
 msgid "Select All Inside Edit Range"
 msgstr "Выделить всё внутри области правки"
 
-#: editor_actions.cc:212
+#: editor_actions.cc:213
 msgid "Select Edit Range"
 msgstr "Выделить область правки"
 
-#: editor_actions.cc:214
+#: editor_actions.cc:215
 msgid "Select All in Punch Range"
 msgstr "Выделить все в области врезки"
 
-#: editor_actions.cc:215
+#: editor_actions.cc:216
 msgid "Select All in Loop Range"
 msgstr "Выделить всё в закольцованной области"
 
-#: editor_actions.cc:217
+#: editor_actions.cc:218
 msgid "Select Next Track or Bus"
 msgstr "Выбрать следующую дорожку или шину"
 
-#: editor_actions.cc:218
+#: editor_actions.cc:219
 msgid "Select Previous Track or Bus"
 msgstr "Выбрать предыдущую дорожку или шину"
 
-#: editor_actions.cc:220
+#: editor_actions.cc:221
 msgid "Toggle Record Enable"
 msgstr "Переключить готовность к записи"
 
-#: editor_actions.cc:222
+#: editor_actions.cc:223
 msgid "Toggle Solo"
 msgstr "Переключить соло"
 
-#: editor_actions.cc:224
+#: editor_actions.cc:225
 msgid "Toggle Mute"
 msgstr "Переключить приглушение"
 
-#: editor_actions.cc:226
+#: editor_actions.cc:227
 msgid "Toggle Solo Isolate"
 msgstr "Переключить изолирование солирования"
 
-#: editor_actions.cc:231
+#: editor_actions.cc:232
 msgid "Save View %1"
 msgstr "Сохранить вид %1"
 
-#: editor_actions.cc:237
+#: editor_actions.cc:238
 msgid "Go to View %1"
 msgstr "Перейти к виду %1"
 
-#: editor_actions.cc:243
+#: editor_actions.cc:244
 msgid "Locate to Mark %1"
 msgstr "Перейти к маркеру %1"
 
-#: editor_actions.cc:247 editor_actions.cc:248
+#: editor_actions.cc:249 editor_actions.cc:250
 msgid "Jump to Next Mark"
 msgstr "К следующему маркеру"
 
-#: editor_actions.cc:249 editor_actions.cc:250
+#: editor_actions.cc:251 editor_actions.cc:252
 msgid "Jump to Previous Mark"
 msgstr "К предыдущему маркеру"
 
-#: editor_actions.cc:252
+#: editor_actions.cc:254
 msgid "Set Session Start from Playhead"
-msgstr ""
+msgstr "Начало сессии по указателю воспроизведения"
 
-#: editor_actions.cc:253
+#: editor_actions.cc:255
 msgid "Set Session End from Playhead"
-msgstr ""
+msgstr "Конец сессии по указателю воспроизведения"
 
-#: editor_actions.cc:255 editor_actions.cc:256
+#: editor_actions.cc:257 editor_actions.cc:258
 msgid "Add Mark from Playhead"
 msgstr "Добавить маркер по указателю"
 
-#: editor_actions.cc:258 editor_actions.cc:259
+#: editor_actions.cc:260 editor_actions.cc:261
 msgid "Remove Mark at Playhead"
-msgstr "Удалить маркер воспроизведения"
+msgstr "Удалить маркер по указателю воспроизведения"
 
-#: editor_actions.cc:261
+#: editor_actions.cc:263
 msgid "Nudge Next Later"
 msgstr "Сдвиг следующего позже"
 
-#: editor_actions.cc:262
+#: editor_actions.cc:264
 msgid "Nudge Next Earlier"
 msgstr "Сдвиг следующего раньше"
 
-#: editor_actions.cc:264
+#: editor_actions.cc:266
 msgid "Nudge Playhead Forward"
 msgstr "Толкнуть указатель вперёд"
 
-#: editor_actions.cc:265
+#: editor_actions.cc:267
 msgid "Nudge Playhead Backward"
 msgstr "Толкнуть указатель назад"
 
-#: editor_actions.cc:266
+#: editor_actions.cc:268
 msgid "Playhead to Next Grid"
-msgstr ""
+msgstr "Указатель к следующей сетке"
 
-#: editor_actions.cc:267
+#: editor_actions.cc:269
 msgid "Playhead to Previous Grid"
-msgstr ""
+msgstr "Указатель к предыдущей сетке"
 
-#: editor_actions.cc:272
+#: editor_actions.cc:274
 msgid "Zoom to Selection"
 msgstr "Масштабировать до выделения"
 
-#: editor_actions.cc:273
+#: editor_actions.cc:275
 msgid "Toggle Zoom State"
 msgstr "Переключить состояния масштаба"
 
-#: editor_actions.cc:275
+#: editor_actions.cc:277
 msgid "Expand Track Height"
 msgstr "Увеличить высоту дорожки"
 
-#: editor_actions.cc:276
+#: editor_actions.cc:278
 msgid "Shrink Track Height"
 msgstr "Уменьшить высоту дорожки"
 
-#: editor_actions.cc:278
+#: editor_actions.cc:280
+msgid "Fit 1 Track"
+msgstr "Уместить 1 дорожку"
+
+#: editor_actions.cc:281
+msgid "Fit 2 Tracks"
+msgstr "Уместить 2 дорожки"
+
+#: editor_actions.cc:282
+msgid "Fit 4 Tracks"
+msgstr "Уместить 4 дорожки"
+
+#: editor_actions.cc:283
+msgid "Fit 8 Tracks"
+msgstr "Уместить 8 дорожек"
+
+#: editor_actions.cc:284
+msgid "Fit 16 Tracks"
+msgstr "Уместить 16 дорожек"
+
+#: editor_actions.cc:285
+msgid "Fit 32 Tracks"
+msgstr "Уместить 32 дорожки"
+
+#: editor_actions.cc:286
+msgid "Fit All Tracks"
+msgstr "Уместить все дорожки"
+
+#: editor_actions.cc:293
+msgid "Zoom to 5 min"
+msgstr ""
+
+#: editor_actions.cc:296
 msgid "Move Selected Tracks Up"
 msgstr "Поднять выбранные дорожки"
 
-#: editor_actions.cc:280
+#: editor_actions.cc:298
 msgid "Move Selected Tracks Down"
 msgstr "Опустить выбранные дорожки"
 
-#: editor_actions.cc:283
+#: editor_actions.cc:301
 msgid "Scroll Tracks Up"
 msgstr "Прокрутить дорожки вверх"
 
-#: editor_actions.cc:285
+#: editor_actions.cc:302
 msgid "Scroll Tracks Down"
 msgstr "Прокрутить дорожки вниз"
 
-#: editor_actions.cc:287
+#: editor_actions.cc:303
 msgid "Step Tracks Up"
 msgstr "Перейти на дорожку выше"
 
-#: editor_actions.cc:289
+#: editor_actions.cc:304
 msgid "Step Tracks Down"
 msgstr "Перейти на дорожку ниже"
 
-#: editor_actions.cc:292
+#: editor_actions.cc:306
 msgid "Scroll Backward"
 msgstr "Прокрутить назад"
 
-#: editor_actions.cc:293
+#: editor_actions.cc:307
 msgid "Scroll Forward"
 msgstr "Прокрутить вперёд"
 
-#: editor_actions.cc:294
+#: editor_actions.cc:308
 msgid "Center Playhead"
 msgstr "Указатель по центру"
 
-#: editor_actions.cc:295
+#: editor_actions.cc:309
 msgid "Center Edit Point"
 msgstr "Центрировать точку редактирования"
 
-#: editor_actions.cc:297
+#: editor_actions.cc:311
 msgid "Playhead Forward"
 msgstr "Указатель вперёд"
 
-#: editor_actions.cc:298
+#: editor_actions.cc:312
 msgid "Playhead Backward"
 msgstr "Указатель назад"
 
-#: editor_actions.cc:300
+#: editor_actions.cc:314
 msgid "Playhead to Active Mark"
 msgstr "Указатель к активному маркеру"
 
-#: editor_actions.cc:301
+#: editor_actions.cc:315
 msgid "Active Mark to Playhead"
-msgstr "Активный маркер к указателю воспроизведения"
+msgstr "Активный маркер к указателю"
 
-#: editor_actions.cc:303
+#: editor_actions.cc:317
 msgid "Use Skip Ranges"
 msgstr "Исп. пропуск диапазонов"
 
-#: editor_actions.cc:310
+#: editor_actions.cc:324
 msgid "Play Selected Regions"
 msgstr "Воспроизвести выбранные области"
 
-#: editor_actions.cc:312
+#: editor_actions.cc:326
 msgid "Play from Edit Point and Return"
 msgstr "Воспроизвести от курсора редактора и вернуться"
 
-#: editor_actions.cc:314
+#: editor_actions.cc:328
 msgid "Play Edit Range"
 msgstr "Воспроизвести изменяемое выделение"
 
-#: editor_actions.cc:316
+#: editor_actions.cc:330
 msgid "Playhead to Mouse"
 msgstr "Указатель к курсору мыши"
 
-#: editor_actions.cc:317
+#: editor_actions.cc:331
 msgid "Active Marker to Mouse"
 msgstr "Активный маркер к указателю мыши"
 
-#: editor_actions.cc:327
+#: editor_actions.cc:341
 msgid "Undo Selection Change"
 msgstr "Отменить смену выделения"
 
-#: editor_actions.cc:328
+#: editor_actions.cc:342
 msgid "Redo Selection Change"
 msgstr "Повторить смену выделения"
 
-#: editor_actions.cc:330
+#: editor_actions.cc:344
 msgid "Export Audio"
 msgstr "Экспортировать звук"
 
-#: editor_actions.cc:331 export_dialog.cc:394
+#: editor_actions.cc:345 export_dialog.cc:476
 msgid "Export Range"
 msgstr "Экспортировать область"
 
-#: editor_actions.cc:336
+#: editor_actions.cc:350
 msgid "Separate Using Punch Range"
 msgstr "Разделить по выделению врезки"
 
-#: editor_actions.cc:339
+#: editor_actions.cc:353
 msgid "Separate Using Loop Range"
 msgstr "Разделить по выделению петли"
 
-#: editor_actions.cc:342 editor_actions.cc:364
+#: editor_actions.cc:356 editor_actions.cc:379
 msgid "Crop"
 msgstr "Обрезать"
 
-#: editor_actions.cc:352
+#: editor_actions.cc:366
 msgid "Fade Range Selection"
 msgstr "Диапазон появления"
 
-#: editor_actions.cc:354
+#: editor_actions.cc:368
 msgid "Set Tempo from Edit Range = Bar"
 msgstr "Установить темп, считая что диапазон редактирования = такт"
 
-#: editor_actions.cc:356
+#: editor_actions.cc:371
 msgid "Log"
 msgstr "Журнал"
 
-#: editor_actions.cc:359 editor_actions.cc:361
+#: editor_actions.cc:374 editor_actions.cc:376
 msgid "Move to Next Transient"
 msgstr "Перейти к следующей переменной"
 
-#: editor_actions.cc:360 editor_actions.cc:362
+#: editor_actions.cc:375 editor_actions.cc:377
 msgid "Move to Previous Transient"
 msgstr "Перейти к предыдущей переменной"
 
-#: editor_actions.cc:366 editor_actions.cc:375
+#: editor_actions.cc:381
+msgid "Start Range from Playhead"
+msgstr "Начать диапазон от указателя"
+
+#: editor_actions.cc:382
+msgid "Finish Range from Playhead"
+msgstr "Закончить диапазон по указателю"
+
+#: editor_actions.cc:384 editor_actions.cc:393
 msgid "Start Range"
 msgstr "Начать выделение"
 
-#: editor_actions.cc:367 editor_actions.cc:376
+#: editor_actions.cc:385 editor_actions.cc:394
 msgid "Finish Range"
 msgstr "Закончить выделение"
 
-#: editor_actions.cc:369
+#: editor_actions.cc:387
 msgid "Start Punch Range"
 msgstr "Начать врезку"
 
-#: editor_actions.cc:370
+#: editor_actions.cc:388
 msgid "Finish Punch Range"
 msgstr "Закрыть врезку"
 
-#: editor_actions.cc:372
+#: editor_actions.cc:390
 msgid "Start Loop Range"
 msgstr "Начать петлю"
 
-#: editor_actions.cc:373
+#: editor_actions.cc:391
 msgid "Finish Loop Range"
 msgstr "Закрыть петлю"
 
-#: editor_actions.cc:408
+#: editor_actions.cc:426
 msgid "Follow Playhead"
 msgstr "Следовать за указателем"
 
-#: editor_actions.cc:409
+#: editor_actions.cc:427
 msgid "Remove Last Capture"
 msgstr "Удалить последнюю запись"
 
-#: editor_actions.cc:411
+#: editor_actions.cc:429
 msgid "Stationary Playhead"
 msgstr "Неподвижный указатель"
 
-#: editor_actions.cc:413 insert_remove_time_dialog.cc:32
+#: editor_actions.cc:431 insert_remove_time_dialog.cc:32
 msgid "Insert Time"
 msgstr "Вставить промежуток времени"
 
-#: editor_actions.cc:415 insert_remove_time_dialog.cc:32
+#: editor_actions.cc:433 insert_remove_time_dialog.cc:32
 msgid "Remove Time"
-msgstr ""
+msgstr "Удалить промежуток времени"
 
-#: editor_actions.cc:420
+#: editor_actions.cc:438
 msgid "Toggle Active"
 msgstr "Переключить активность"
 
-#: editor_actions.cc:422 editor_actions.cc:1787 editor_markers.cc:921
-#: editor_markers.cc:986 editor_snapshots.cc:134 mixer_strip.cc:1621
-#: route_time_axis.cc:872
+#: editor_actions.cc:440 editor_actions.cc:1785 editor_markers.cc:926
+#: editor_markers.cc:999 editor_markers.cc:1019 editor_snapshots.cc:134
+#: lua_script_manager.cc:32 lua_script_manager.cc:36 mixer_strip.cc:1713
+#: route_time_axis.cc:870 vca_master_strip.cc:400
 msgid "Remove"
 msgstr "Удалить"
 
-#: editor_actions.cc:427
+#: editor_actions.cc:445
 msgid "Fit Selection (Vertical)"
 msgstr "Уместить выделение по вертикали"
 
-#: editor_actions.cc:429 time_axis_view.cc:1380
+#: editor_actions.cc:447 time_axis_view.cc:1291
 msgid "Largest"
 msgstr "Огромная"
 
-#: editor_actions.cc:432 time_axis_view.cc:1381
+#: editor_actions.cc:450 time_axis_view.cc:1292
 msgid "Larger"
 msgstr "Больше"
 
-#: editor_actions.cc:435 editor_rulers.cc:248 time_axis_view.cc:1382
+#: editor_actions.cc:453 editor_rulers.cc:248 time_axis_view.cc:1293
 msgid "Large"
 msgstr "Большая"
 
-#: editor_actions.cc:441 editor_rulers.cc:252 time_axis_view.cc:1384
+#: editor_actions.cc:459 editor_rulers.cc:252 time_axis_view.cc:1295
 msgid "Small"
 msgstr "Маленькая"
 
-#: editor_actions.cc:445
+#: editor_actions.cc:463
 msgid "Sound Selected MIDI Notes"
 msgstr "Воспроизводить выделяемые MIDI-ноты"
 
-#: editor_actions.cc:450
+#: editor_actions.cc:468
 msgid "Zoom Focus Left"
 msgstr "Влево"
 
-#: editor_actions.cc:451
+#: editor_actions.cc:469
 msgid "Zoom Focus Right"
 msgstr "Вправо"
 
-#: editor_actions.cc:452
+#: editor_actions.cc:470
 msgid "Zoom Focus Center"
 msgstr "По центру"
 
-#: editor_actions.cc:453
+#: editor_actions.cc:471
 msgid "Zoom Focus Playhead"
 msgstr "По указателю"
 
-#: editor_actions.cc:454
+#: editor_actions.cc:472
 msgid "Zoom Focus Mouse"
 msgstr "По курсору мыши"
 
-#: editor_actions.cc:455
+#: editor_actions.cc:473
 msgid "Zoom Focus Edit Point"
 msgstr "По точке редактирования"
 
-#: editor_actions.cc:457
+#: editor_actions.cc:475
 msgid "Next Zoom Focus"
 msgstr "Следующий вариант фокуса"
 
-#: editor_actions.cc:463
+#: editor_actions.cc:488
 msgid "Smart Object Mode"
 msgstr "Универсальный режим"
 
-#: editor_actions.cc:466
+#: editor_actions.cc:491
 msgid "Smart"
 msgstr "Универсальный"
 
-#: editor_actions.cc:469
+#: editor_actions.cc:494
 msgid "Object Tool"
 msgstr "Объект"
 
-#: editor_actions.cc:474
+#: editor_actions.cc:499
 msgid "Range Tool"
 msgstr "Выделение"
 
-#: editor_actions.cc:479
+#: editor_actions.cc:504
 msgid "Note Drawing Tool"
 msgstr "Инструмент рисования нот"
 
-#: editor_actions.cc:484
+#: editor_actions.cc:509
 msgid "Audition Tool"
 msgstr "Инструмент прослушивания"
 
-#: editor_actions.cc:489
+#: editor_actions.cc:514
 msgid "Time FX Tool"
 msgstr "Растяжение во времени"
 
-#: editor_actions.cc:494
+#: editor_actions.cc:519
 msgid "Content Tool"
 msgstr "Правка содержимого"
 
-#: editor_actions.cc:500
+#: editor_actions.cc:525
 msgid "Cut Tool"
 msgstr "Инструмент обрезки"
 
-#: editor_actions.cc:506
+#: editor_actions.cc:531
 msgid "Step Mouse Mode"
 msgstr "Режим шага мыши"
 
-#: editor_actions.cc:513
+#: editor_actions.cc:538
 msgid "Change Edit Point"
 msgstr "Изменить точку редактирования"
 
-#: editor_actions.cc:514
+#: editor_actions.cc:539
 msgid "Change Edit Point Including Marker"
 msgstr "Изменить точку редактирования, включая маркер"
 
-#: editor_actions.cc:519
+#: editor_actions.cc:544
 msgid "EditMode|Lock"
 msgstr "Блок"
 
-#: editor_actions.cc:520
+#: editor_actions.cc:545
 msgid "Cycle Edit Mode"
 msgstr "Циклически менять режим редактирования"
 
-#: editor_actions.cc:522
+#: editor_actions.cc:547
 msgid "Snap to"
 msgstr "Привязка"
 
-#: editor_actions.cc:523
+#: editor_actions.cc:548
 msgid "Snap Mode"
 msgstr "Режим привязки"
 
-#: editor_actions.cc:530
+#: editor_actions.cc:555
 msgid "Next Snap Mode"
 msgstr "Следующий режим привязки"
 
-#: editor_actions.cc:531
+#: editor_actions.cc:556
 msgid "Next Snap Choice"
 msgstr "Следующий выбор привязки"
 
-#: editor_actions.cc:532
+#: editor_actions.cc:557
 msgid "Next Musical Snap Choice"
 msgstr "Следующий вариант привязки (такты, доли)"
 
-#: editor_actions.cc:533
+#: editor_actions.cc:558
 msgid "Previous Snap Choice"
 msgstr "Предыдущий вариант привязки"
 
-#: editor_actions.cc:534
+#: editor_actions.cc:559
 msgid "Previous Musical Snap Choice"
 msgstr "Предыдущий вариант привязки (такты, доли)"
 
-#: editor_actions.cc:539
+#: editor_actions.cc:564
 msgid "Snap to CD Frame"
 msgstr "К выборкам CD"
 
-#: editor_actions.cc:540
+#: editor_actions.cc:565
 msgid "Snap to Timecode Frame"
 msgstr "К кадрам таймкода"
 
-#: editor_actions.cc:541
+#: editor_actions.cc:566
 msgid "Snap to Timecode Seconds"
 msgstr "К секундам таймкода"
 
-#: editor_actions.cc:542
+#: editor_actions.cc:567
 msgid "Snap to Timecode Minutes"
 msgstr "К минутам таймкода"
 
-#: editor_actions.cc:543
+#: editor_actions.cc:568
 msgid "Snap to Seconds"
 msgstr "К секундам"
 
-#: editor_actions.cc:544
+#: editor_actions.cc:569
 msgid "Snap to Minutes"
 msgstr "К минутам"
 
-#: editor_actions.cc:546
+#: editor_actions.cc:571
 msgid "Snap to One Twenty Eighths"
 msgstr "К 1/28"
 
-#: editor_actions.cc:547
+#: editor_actions.cc:572
 msgid "Snap to Sixty Fourths"
 msgstr "К 1/24"
 
-#: editor_actions.cc:548
+#: editor_actions.cc:573
 msgid "Snap to Thirty Seconds"
 msgstr "К 30 секундам"
 
-#: editor_actions.cc:549
+#: editor_actions.cc:574
 msgid "Snap to Twenty Eighths"
 msgstr "К 1/28"
 
-#: editor_actions.cc:550
+#: editor_actions.cc:575
 msgid "Snap to Twenty Fourths"
 msgstr "К 1/24"
 
-#: editor_actions.cc:551
+#: editor_actions.cc:576
 msgid "Snap to Twentieths"
 msgstr "К 1/20"
 
-#: editor_actions.cc:552
+#: editor_actions.cc:577
 msgid "Snap to Sixteenths"
 msgstr "К 1/16"
 
-#: editor_actions.cc:553
+#: editor_actions.cc:578
 msgid "Snap to Fourteenths"
 msgstr "К 1/14"
 
-#: editor_actions.cc:554
+#: editor_actions.cc:579
 msgid "Snap to Twelfths"
 msgstr "К 1/12"
 
-#: editor_actions.cc:555
+#: editor_actions.cc:580
 msgid "Snap to Tenths"
 msgstr "К 1/10"
 
-#: editor_actions.cc:556
+#: editor_actions.cc:581
 msgid "Snap to Eighths"
 msgstr "К 1/8"
 
-#: editor_actions.cc:557
+#: editor_actions.cc:582
 msgid "Snap to Sevenths"
 msgstr "К 1/7"
 
-#: editor_actions.cc:558
+#: editor_actions.cc:583
 msgid "Snap to Sixths"
 msgstr "К 1/6"
 
-#: editor_actions.cc:559
+#: editor_actions.cc:584
 msgid "Snap to Fifths"
 msgstr "К 1/5"
 
-#: editor_actions.cc:560
+#: editor_actions.cc:585
 msgid "Snap to Quarters"
 msgstr "К 1/4"
 
-#: editor_actions.cc:561
+#: editor_actions.cc:586
 msgid "Snap to Thirds"
 msgstr "К 1/3"
 
-#: editor_actions.cc:562
+#: editor_actions.cc:587
 msgid "Snap to Halves"
 msgstr "К 1/2"
 
-#: editor_actions.cc:564
+#: editor_actions.cc:589
 msgid "Snap to Beat"
 msgstr "К долям"
 
-#: editor_actions.cc:565
+#: editor_actions.cc:590
 msgid "Snap to Bar"
 msgstr "К тактам"
 
-#: editor_actions.cc:566
+#: editor_actions.cc:591
 msgid "Snap to Mark"
 msgstr "К маркерам"
 
-#: editor_actions.cc:567
+#: editor_actions.cc:592
 msgid "Snap to Region Start"
 msgstr "К началам областей"
 
-#: editor_actions.cc:568
+#: editor_actions.cc:593
 msgid "Snap to Region End"
 msgstr "К концам областей"
 
-#: editor_actions.cc:569
+#: editor_actions.cc:594
 msgid "Snap to Region Sync"
 msgstr "К синхронизаторам областей"
 
-#: editor_actions.cc:570
+#: editor_actions.cc:595
 msgid "Snap to Region Boundary"
 msgstr "К границам областей"
 
-#: editor_actions.cc:572
+#: editor_actions.cc:597
 msgid "Show Marker Lines"
 msgstr "Показывать линии маркеров"
 
-#: editor_actions.cc:582
+#: editor_actions.cc:607
 msgid "Loop/Punch"
 msgstr "Петли/Врезки"
 
-#: editor_actions.cc:586
+#: editor_actions.cc:611
 msgid "Min:Sec"
 msgstr "Мин:С"
 
-#: editor_actions.cc:588 editor_actions.cc:591 editor_rulers.cc:270
+#: editor_actions.cc:613 editor_actions.cc:616 editor_rulers.cc:270
+#: rc_option_editor.cc:1592
 msgid "Video Monitor"
 msgstr "Видеомонитор"
 
-#: editor_actions.cc:590 rc_option_editor.cc:2720
+#: editor_actions.cc:615 rc_option_editor.cc:2844
 msgid "Video"
 msgstr "Видео"
 
-#: editor_actions.cc:593
+#: editor_actions.cc:618
 msgid "Always on Top"
 msgstr "Всегда сверху"
 
-#: editor_actions.cc:595
+#: editor_actions.cc:620
 msgid "Frame number"
 msgstr "Номер кадра"
 
-#: editor_actions.cc:596
+#: editor_actions.cc:621
 msgid "Timecode Background"
 msgstr "Фон тайм-кода"
 
-#: editor_actions.cc:597
+#: editor_actions.cc:622
 msgid "Fullscreen"
 msgstr "Во весь экран"
 
-#: editor_actions.cc:598
+#: editor_actions.cc:623
 msgid "Letterbox"
 msgstr "Уместить в окно"
 
-#: editor_actions.cc:599
+#: editor_actions.cc:624
 msgid "Original Size"
 msgstr "Исходный размер"
 
-#: editor_actions.cc:656
+#: editor_actions.cc:681
 msgid "Sort"
 msgstr "Сортировать"
 
-#: editor_actions.cc:667 editor_routes.cc:485 mixer_ui.cc:1258
+#: editor_actions.cc:692 editor_routes.cc:549 mixer_ui.cc:1497
 msgid "Show All"
 msgstr "Показать всё"
 
-#: editor_actions.cc:668
+#: editor_actions.cc:693
 msgid "Show Automatic Regions"
 msgstr "Показать автомат. области"
 
-#: editor_actions.cc:670
+#: editor_actions.cc:695
 msgid "Ascending"
 msgstr "По возрастанию"
 
-#: editor_actions.cc:672
+#: editor_actions.cc:697
 msgid "Descending"
 msgstr "По убыванию"
 
-#: editor_actions.cc:675
+#: editor_actions.cc:700
 msgid "By Region Name"
 msgstr "По имени области"
 
-#: editor_actions.cc:677
+#: editor_actions.cc:702
 msgid "By Region Length"
 msgstr "По длительности области"
 
-#: editor_actions.cc:679
+#: editor_actions.cc:704
 msgid "By Region Position"
 msgstr "По расположению области"
 
-#: editor_actions.cc:681
+#: editor_actions.cc:706
 msgid "By Region Timestamp"
 msgstr "По времени создания области"
 
-#: editor_actions.cc:683
+#: editor_actions.cc:708
 msgid "By Region Start in File"
 msgstr "По началу области в файле"
 
-#: editor_actions.cc:685
+#: editor_actions.cc:710
 msgid "By Region End in File"
 msgstr "По концу области в файле"
 
-#: editor_actions.cc:687
+#: editor_actions.cc:712
 msgid "By Source File Name"
 msgstr "По имени исходного файла"
 
-#: editor_actions.cc:689
+#: editor_actions.cc:714
 msgid "By Source File Length"
 msgstr "По длительности исходного файла"
 
-#: editor_actions.cc:691
+#: editor_actions.cc:716
 msgid "By Source File Creation Date"
 msgstr "По дате создания исходного файла"
 
-#: editor_actions.cc:693
+#: editor_actions.cc:718
 msgid "By Source Filesystem"
 msgstr "По исходной файловой системе"
 
-#: editor_actions.cc:696
+#: editor_actions.cc:721
 msgid "Remove Unused"
 msgstr "Удаление неиспользуемых"
 
-#: editor_actions.cc:698
+#: editor_actions.cc:723
 msgid "Import PT session"
 msgstr "Импортировать сессию PT"
 
-#: editor_actions.cc:703 editor_audio_import.cc:282 editor_pt_import.cc:148
-#: session_import_dialog.cc:75 session_import_dialog.cc:95
-#: session_metadata_dialog.cc:418 sfdb_ui.cc:558 editor_videotimeline.cc:91
+#: editor_actions.cc:728 editor_audio_import.cc:282 editor_pt_import.cc:149
+#: luawindow.cc:99 session_import_dialog.cc:75 session_import_dialog.cc:95
+#: session_metadata_dialog.cc:421 sfdb_ui.cc:558 editor_videotimeline.cc:91
 msgid "Import"
 msgstr "Импортировать"
 
-#: editor_actions.cc:706
+#: editor_actions.cc:731
 msgid "Import to Region List..."
 msgstr "Импортировать в список областей…"
 
-#: editor_actions.cc:709 session_import_dialog.cc:44
+#: editor_actions.cc:734 session_import_dialog.cc:44
 #: session_import_dialog.cc:65
 msgid "Import from Session"
 msgstr "Импортировать из сессии"
 
-#: editor_actions.cc:713
+#: editor_actions.cc:738
 msgid "Bring all media into session folder"
 msgstr "Занести все медиа в папку сессии"
 
-#: editor_actions.cc:716
+#: editor_actions.cc:741
 msgid "Show Summary"
 msgstr "Показывать сводку"
 
-#: editor_actions.cc:718
+#: editor_actions.cc:743
 msgid "Show Group Tabs"
 msgstr "Показывать вкладки групп"
 
-#: editor_actions.cc:720
+#: editor_actions.cc:745
 msgid "Show Measure Lines"
 msgstr "Показывать линии тактов и долей"
 
-#: editor_actions.cc:724
-msgid "Show Logo"
-msgstr "Показать логотип"
-
-#: editor_actions.cc:728
+#: editor_actions.cc:747
 msgid "Toggle MIDI Input Active for Editor-Selected Tracks/Busses"
 msgstr "Переключить активный вход MIDI для редактора выбранных дорожек/шин"
 
-#: editor_actions.cc:751
-msgid "Loaded editor bindings from %1"
-msgstr "Загруженный редактор привязки от %1"
-
-#: editor_actions.cc:753
-msgid "Could not find editor.bindings in search path %1"
-msgstr "Не удалось найти редактор привязок в пути поиска %1"
-
-#: editor_actions.cc:1097 editor_actions.cc:1493 editor_actions.cc:1504
-#: editor_actions.cc:1557 editor_actions.cc:1568 editor_actions.cc:1615
-#: editor_actions.cc:1625 editor_regions.cc:1575
+#: editor_actions.cc:1081 editor_actions.cc:1477 editor_actions.cc:1488
+#: editor_actions.cc:1541 editor_actions.cc:1552 editor_actions.cc:1599
+#: editor_actions.cc:1609 editor_regions.cc:1657 luainstance.cc:330
+#: luainstance.cc:1714
 msgid "programming error: %1: %2"
 msgstr "Ошибка в программе: %1: %2"
 
-#: editor_actions.cc:1793
+#: editor_actions.cc:1791
 msgid "Raise"
 msgstr "Поднять"
 
-#: editor_actions.cc:1796
+#: editor_actions.cc:1794
 msgid "Raise to Top"
 msgstr "На самый верх"
 
-#: editor_actions.cc:1799
+#: editor_actions.cc:1797
 msgid "Lower"
 msgstr "Опустить"
 
-#: editor_actions.cc:1802
+#: editor_actions.cc:1800
 msgid "Lower to Bottom"
 msgstr "В самый низ"
 
-#: editor_actions.cc:1805
+#: editor_actions.cc:1803
 msgid "Move to Original Position"
 msgstr "К исходной позиции"
 
-#: editor_actions.cc:1810
+#: editor_actions.cc:1808
 msgid "Lock to Video"
 msgstr "Прикрепить к видео"
 
-#: editor_actions.cc:1815 editor_markers.cc:912
+#: editor_actions.cc:1813 editor_markers.cc:917
 msgid "Glue to Bars and Beats"
 msgstr "Прикрепить к тактам и долям"
 
-#: editor_actions.cc:1820
+#: editor_actions.cc:1818
 msgid "Remove Sync"
 msgstr "Удалить синхронизатор"
 
-#: editor_actions.cc:1823 mixer_strip.cc:2088 monitor_section.cc:252
-#: monitor_section.cc:320 route_time_axis.cc:256 route_time_axis.cc:538
+#: editor_actions.cc:1821 mixer_strip.cc:2200 monitor_section.cc:253
+#: monitor_section.cc:321 route_time_axis.cc:264 route_time_axis.cc:550
 msgid "Mute"
 msgstr "Молча"
 
-#: editor_actions.cc:1826
+#: editor_actions.cc:1824
 msgid "Normalize..."
 msgstr "Нормировать сигнал..."
 
-#: editor_actions.cc:1829
+#: editor_actions.cc:1827
 msgid "Reverse"
 msgstr "Развернуть"
 
-#: editor_actions.cc:1832
+#: editor_actions.cc:1830
 msgid "Make Mono Regions"
 msgstr "Создать моно-области"
 
-#: editor_actions.cc:1835
+#: editor_actions.cc:1833
 msgid "Boost Gain"
 msgstr "Повысить громкость области"
 
-#: editor_actions.cc:1838
+#: editor_actions.cc:1836
 msgid "Cut Gain"
 msgstr "Понизить громкость области"
 
-#: editor_actions.cc:1841
+#: editor_actions.cc:1839
 msgid "Pitch Shift..."
 msgstr "Сменить высоту тона…"
 
-#: editor_actions.cc:1847
+#: editor_actions.cc:1845
 msgid "Opaque"
 msgstr "Непрозрачно"
 
-#: editor_actions.cc:1851 editor_regions.cc:120
+#: editor_actions.cc:1849 editor_regions.cc:164
 msgid "Fade In"
 msgstr "Нарастание"
 
-#: editor_actions.cc:1856 editor_regions.cc:121
+#: editor_actions.cc:1854 editor_regions.cc:165
 msgid "Fade Out"
 msgstr "Затухание"
 
-#: editor_actions.cc:1871
+#: editor_actions.cc:1869
 msgid "Multi-Duplicate..."
 msgstr "Продублировать многократно..."
 
-#: editor_actions.cc:1876
+#: editor_actions.cc:1874
 msgid "Fill Track"
 msgstr "Заполнить дорожку"
 
-#: editor_actions.cc:1880 editor_markers.cc:1000
+#: editor_actions.cc:1878 editor_markers.cc:1033
 msgid "Set Loop Range"
 msgstr "Установить область петли"
 
-#: editor_actions.cc:1887
+#: editor_actions.cc:1885
 msgid "Set Punch"
 msgstr "Установить врезку"
 
-#: editor_actions.cc:1891
+#: editor_actions.cc:1889
 msgid "Add Single Range Marker"
 msgstr "Добавить маркер текущей области"
 
-#: editor_actions.cc:1896
+#: editor_actions.cc:1894
 msgid "Add Range Marker Per Region"
 msgstr "Добавить по маркеру на каждую область"
 
-#: editor_actions.cc:1900
+#: editor_actions.cc:1898
 msgid "Snap Position to Grid"
-msgstr ""
+msgstr "Привязывать позицию к сетке"
 
-#: editor_actions.cc:1903
+#: editor_actions.cc:1901
 msgid "Close Gaps"
 msgstr "Закрыть интервалы"
 
-#: editor_actions.cc:1906
+#: editor_actions.cc:1904
 msgid "Rhythm Ferret..."
 msgstr "Ритмический хорёк..."
 
-#: editor_actions.cc:1909
+#: editor_actions.cc:1907
 msgid "Export..."
 msgstr "Экспортировать..."
 
-#: editor_actions.cc:1915
+#: editor_actions.cc:1913
 msgid "Separate Under"
 msgstr "Разделить под"
 
-#: editor_actions.cc:1919 editor_actions.cc:1920
+#: editor_actions.cc:1917 editor_actions.cc:1918
 msgid "Set Fade In Length"
 msgstr "Установить длительность нарастания"
 
-#: editor_actions.cc:1921 editor_actions.cc:1922
+#: editor_actions.cc:1919 editor_actions.cc:1920
 msgid "Set Fade Out Length"
 msgstr "Установить длительность затухания"
 
-#: editor_actions.cc:1924
+#: editor_actions.cc:1922
 msgid "Set Tempo from Region = Bar"
 msgstr "Установить темп, считая что область = такт"
 
-#: editor_actions.cc:1929
+#: editor_actions.cc:1927
 msgid "Split at Percussion Onsets"
 msgstr "Разделить по атакам перкуссии"
 
-#: editor_actions.cc:1934
+#: editor_actions.cc:1932
 msgid "List Editor..."
 msgstr "Редактор списка событий"
 
-#: editor_actions.cc:1937
+#: editor_actions.cc:1935
 msgid "Properties..."
 msgstr "Свойства..."
 
-#: editor_actions.cc:1941
+#: editor_actions.cc:1939
 msgid "Bounce (with processing)"
 msgstr "Свести (с обработкой)"
 
-#: editor_actions.cc:1942
+#: editor_actions.cc:1940
 msgid "Bounce (without processing)"
 msgstr "Свести (без обработки)"
 
-#: editor_actions.cc:1943
+#: editor_actions.cc:1941
 msgid "Combine"
 msgstr "Объединить"
 
-#: editor_actions.cc:1944
+#: editor_actions.cc:1942
 msgid "Uncombine"
 msgstr "Снять объединение"
 
-#: editor_actions.cc:1946
+#: editor_actions.cc:1944
+msgid "Loudness Analysis..."
+msgstr "Анализ громкости..."
+
+#: editor_actions.cc:1945
 msgid "Spectral Analysis..."
 msgstr "Спектральный анализ..."
 
-#: editor_actions.cc:1948
+#: editor_actions.cc:1947
 msgid "Reset Envelope"
 msgstr "Сбросить огибающую"
 
-#: editor_actions.cc:1950
+#: editor_actions.cc:1949
 msgid "Reset Gain"
 msgstr "Сбросить усиление"
 
-#: editor_actions.cc:1955
+#: editor_actions.cc:1954
 msgid "Envelope Active"
 msgstr "Огибающая активна"
 
-#: editor_actions.cc:1963 editor_actions.cc:1964
+#: editor_actions.cc:1962 editor_actions.cc:1963
 msgid "Insert Patch Change..."
 msgstr "Вставить смену программы..."
 
-#: editor_actions.cc:1965
+#: editor_actions.cc:1964
 msgid "Unlink from other copies"
 msgstr "Отсоединить от других копий"
 
-#: editor_actions.cc:1966
+#: editor_actions.cc:1965
 msgid "Strip Silence..."
 msgstr "Вырезать тишину..."
 
-#: editor_actions.cc:1967
+#: editor_actions.cc:1966
 msgid "Set Range Selection"
 msgstr "Создать выделение из области"
 
-#: editor_actions.cc:1969 editor_actions.cc:1970
+#: editor_actions.cc:1968 editor_actions.cc:1969
 msgid "Nudge Later"
 msgstr "Толкнуть вперёд"
 
-#: editor_actions.cc:1971 editor_actions.cc:1972
+#: editor_actions.cc:1970 editor_actions.cc:1971
 msgid "Nudge Earlier"
 msgstr "Толкнуть назад"
 
-#: editor_actions.cc:1974
+#: editor_actions.cc:1973
 msgid "Sequence Regions"
 msgstr "Выстроить области встык"
 
-#: editor_actions.cc:1979
+#: editor_actions.cc:1978
 msgid "Nudge Later by Capture Offset"
 msgstr "Толкнуть вперёд на смещение захвата"
 
-#: editor_actions.cc:1986
+#: editor_actions.cc:1985
 msgid "Nudge Earlier by Capture Offset"
 msgstr "Толкнуть назад на смещение захвата"
 
-#: editor_actions.cc:1990
+#: editor_actions.cc:1989
 msgid "Trim to Loop"
 msgstr "В петлю"
 
-#: editor_actions.cc:1991
+#: editor_actions.cc:1990
 msgid "Trim to Punch"
 msgstr "Во врезку"
 
-#: editor_actions.cc:1993
+#: editor_actions.cc:1992
 msgid "Trim to Previous"
 msgstr "До предыдущей области"
 
-#: editor_actions.cc:1994
+#: editor_actions.cc:1993
 msgid "Trim to Next"
 msgstr "До следующей области"
 
-#: editor_actions.cc:2001
+#: editor_actions.cc:2000
 msgid "Insert Region from Region List"
-msgstr ""
+msgstr "Вставить область из списка областей"
 
-#: editor_actions.cc:2007
+#: editor_actions.cc:2006
 msgid "Set Sync Position"
 msgstr "Установить синхронизатор области"
 
-#: editor_actions.cc:2008
+#: editor_actions.cc:2007
 msgid "Place Transient"
 msgstr "Место переходных"
 
-#: editor_actions.cc:2009
+#: editor_actions.cc:2008
 msgid "Split/Separate"
 msgstr "Разбить"
 
-#: editor_actions.cc:2010
+#: editor_actions.cc:2009
 msgid "Trim Start at Edit Point"
 msgstr "Начало по курсору редактора"
 
-#: editor_actions.cc:2011
+#: editor_actions.cc:2010
 msgid "Trim End at Edit Point"
 msgstr "Конец по курсору редактора"
 
-#: editor_actions.cc:2016
+#: editor_actions.cc:2015
 msgid "Align Start"
 msgstr "Выровнять начала областей"
 
-#: editor_actions.cc:2023
+#: editor_actions.cc:2022
 msgid "Align Start Relative"
 msgstr "Выровнять относительно начал областей"
 
-#: editor_actions.cc:2027
+#: editor_actions.cc:2026
 msgid "Align End"
 msgstr "Выровнять концы областей"
 
-#: editor_actions.cc:2032
+#: editor_actions.cc:2031
 msgid "Align End Relative"
 msgstr "Выровнять относительно концов областей"
 
-#: editor_actions.cc:2039
+#: editor_actions.cc:2038
 msgid "Align Sync"
 msgstr "Выровнять по синхронизаторам областей"
 
-#: editor_actions.cc:2046
+#: editor_actions.cc:2045
 msgid "Align Sync Relative"
 msgstr "Выровнять относительно синхронизаторов областей"
 
-#: editor_actions.cc:2050 editor_actions.cc:2053
+#: editor_actions.cc:2049 editor_actions.cc:2050
 msgid "Choose Top..."
 msgstr "Выбрать верхнюю область..."
 
@@ -4971,33 +5292,33 @@ msgstr ""
 "В этой сессии уже есть исходный файл с именем %1. Вы хотите импортировать %2 "
 "как новый источник или пропустить его?"
 
-#: editor_audio_import.cc:282 editor_pt_import.cc:148
+#: editor_audio_import.cc:282 editor_pt_import.cc:149
 #: editor_videotimeline.cc:91
 msgid "Cancel Import"
 msgstr "Отменить импорт"
 
-#: editor_audio_import.cc:562
+#: editor_audio_import.cc:565
 msgid "Editor: cannot open file \"%1\", (%2)"
 msgstr "Редактор: не удаётся открыть файл \"%1\", (%2)"
 
-#: editor_audio_import.cc:570
+#: editor_audio_import.cc:573
 msgid "Cancel entire import"
 msgstr "Отменить весь импорт"
 
-#: editor_audio_import.cc:571
+#: editor_audio_import.cc:574
 msgid "Don't embed it"
 msgstr "Не встраивать"
 
-#: editor_audio_import.cc:572
+#: editor_audio_import.cc:575
 msgid "Embed all without questions"
 msgstr "Встроить без лишних вопросов"
 
-#: editor_audio_import.cc:575 editor_audio_import.cc:601
-#: export_format_dialog.cc:60
+#: editor_audio_import.cc:578 editor_audio_import.cc:604
+#: export_format_dialog.cc:68
 msgid "Sample rate"
 msgstr "Частота сэмплирования"
 
-#: editor_audio_import.cc:576 editor_audio_import.cc:602
+#: editor_audio_import.cc:579 editor_audio_import.cc:605
 msgid ""
 "%1\n"
 "This audiofile's sample rate doesn't match the session sample rate!"
@@ -5006,27 +5327,27 @@ msgstr ""
 "Выбранный звуковой файл имеет частоту сэмплирования,\n"
 "отличную от частоты активной сессии!"
 
-#: editor_audio_import.cc:598
+#: editor_audio_import.cc:601
 msgid "Embed it anyway"
 msgstr "Всё равно встроить"
 
 #: editor_pt_import.cc:81
 msgid "You can't import a PT session until you have a session loaded."
-msgstr ""
+msgstr "Вы не можете импортировать сессию ProTools, пока сессия не загружена."
 
 #: editor_pt_import.cc:86
 msgid "Import PT Session"
-msgstr "Импортировать сессию PT"
+msgstr "Импортировать сессию ProTools"
 
 #: editor_pt_import.cc:97
 msgid "%1: this is only the directory/folder name, not the filename.\n"
 msgstr "%1: это лишь название папки или каталога, а не имя файла.\n"
 
-#: editor_pt_import.cc:131
+#: editor_pt_import.cc:132
 msgid "Doesn't seem to be a valid PT session file"
 msgstr "Этот файл не похож на корректный файл сеанса PT"
 
-#: editor_pt_import.cc:135
+#: editor_pt_import.cc:136
 msgid ""
 "PT v%1 Session @ %2Hz\n"
 "\n"
@@ -5044,28 +5365,44 @@ msgstr ""
 "\n"
 "Продолжить..."
 
-#: editor_canvas_events.cc:1308 editor_drag.cc:1418
+#: editor_pt_import.cc:175
+msgid ""
+"Failed to load one or more of the audio files, but continuing to attempt "
+"import."
+msgstr ""
+"Не удалось загрузить один или несколько звуковых файлов,но попытка импорта "
+"продолжена."
+
+#: editor_pt_import.cc:178
+msgid "Success! Import should complete soon."
+msgstr "Успешно! Импорт должен скоро завершиться."
+
+#: editor_pt_import.cc:263
+msgid "PTImport: UINT_MAX routes? impossible!"
+msgstr ""
+
+#: editor_canvas_events.cc:1296 editor_drag.cc:1418
 msgid "Could not create new track after region placed in the drop zone"
 msgstr ""
 "Не удалось создать новую дорожку после области, помещённой в рабочую зону"
 
-#: editor_drag.cc:1310
+#: editor_drag.cc:1306
 msgid "fixed time region drag"
 msgstr "Фиксированная временная область перетаскивания"
 
-#: editor_drag.cc:2245
+#: editor_drag.cc:2249
 msgid "Ripple drag"
 msgstr "Перетаскивание ряби"
 
-#: editor_drag.cc:2307
+#: editor_drag.cc:2311
 msgid "create region"
-msgstr ""
+msgstr "создание области"
 
-#: editor_drag.cc:2426 midi_region_view.cc:2834
+#: editor_drag.cc:2430 midi_region_view.cc:2857
 msgid "resize notes"
 msgstr "Смена размера ноты"
 
-#: editor_drag.cc:2609 editor_drag.cc:2644
+#: editor_drag.cc:2613 editor_drag.cc:2648
 msgid ""
 "One or more Audio Regions\n"
 "are both Locked and\n"
@@ -5073,79 +5410,87 @@ msgid ""
 "The video cannot me moved."
 msgstr ""
 
-#: editor_drag.cc:2679
+#: editor_drag.cc:2683
 msgid "Video Start:"
 msgstr "Начало видеофайла"
 
-#: editor_drag.cc:2681
+#: editor_drag.cc:2685
 msgid "Diff:"
 msgstr "Разница:"
 
-#: editor_drag.cc:2703
+#: editor_drag.cc:2707
 msgid "Move Video"
 msgstr "Переместить видео"
 
-#: editor_drag.cc:3212
+#: editor_drag.cc:3176
+msgid "move meter mark"
+msgstr "Переместить маркер счетчика"
+
+#: editor_drag.cc:3178
 msgid "copy meter mark"
 msgstr "Скопировать маркер счетчика"
 
-#: editor_drag.cc:3220
-msgid "move meter mark"
-msgstr "Переместить маркер счетчика"
+#: editor_drag.cc:3278
+msgid "inactive"
+msgstr ""
 
-#: editor_drag.cc:3308
+#: editor_drag.cc:3323
 msgid "move tempo mark"
 msgstr "Переместить маркер темпа"
 
-#: editor_drag.cc:3345
+#: editor_drag.cc:3330
 msgid "copy tempo mark"
 msgstr "Скопировать маркер темпа"
 
-#: editor_drag.cc:3609
+#: editor_drag.cc:3461
+msgid "dilate tempo"
+msgstr ""
+
+#: editor_drag.cc:3735
 msgid "change fade in length"
 msgstr "Смена длительности фейда нарастания"
 
-#: editor_drag.cc:3734
+#: editor_drag.cc:3860
 msgid "change fade out length"
 msgstr "Смена длительности фейда затухания"
 
-#: editor_drag.cc:4110
+#: editor_drag.cc:4238
 msgid "move marker"
 msgstr "Смещение маркера"
 
-#: editor_drag.cc:4373 editor_drag.cc:5694
+#: editor_drag.cc:4505 editor_drag.cc:5832
 msgid "automation range move"
 msgstr "Смещение выделения автоматизации"
 
-#: editor_drag.cc:4747
+#: editor_drag.cc:4889
 msgid "An error occurred while executing time stretch operation"
 msgstr "Произошла ошибка при выполнении операции растяжения времени"
 
-#: editor_drag.cc:5208
+#: editor_drag.cc:5350
 msgid "programming_error: %1"
 msgstr "Ошибка в программе: %1"
 
-#: editor_drag.cc:5277 editor_drag.cc:5287
+#: editor_drag.cc:5419 editor_drag.cc:5429
 msgid "new skip marker"
 msgstr "Новый маркер пропуска"
 
-#: editor_drag.cc:5278
+#: editor_drag.cc:5420
 msgid "skip"
 msgstr "Пропустить"
 
-#: editor_drag.cc:5282 location_ui.cc:58
+#: editor_drag.cc:5424 location_ui.cc:60
 msgid "CD"
 msgstr "CD"
 
-#: editor_drag.cc:5283
+#: editor_drag.cc:5425
 msgid "new CD marker"
 msgstr "Новый CD маркер"
 
-#: editor_drag.cc:5288 editor_route_groups.cc:438 mixer_ui.cc:1593
+#: editor_drag.cc:5430 editor_route_groups.cc:439 mixer_ui.cc:1840
 msgid "unnamed"
 msgstr "Безымянный"
 
-#: editor_drag.cc:5601
+#: editor_drag.cc:5739
 msgid "Automation range drag created for invalid region type"
 msgstr ""
 "Перетаскивание области автоматизации предпринято для неправильного типа "
@@ -5163,7 +5508,7 @@ msgstr "Цвет вкладки группы"
 msgid "Name of Group"
 msgstr "Название группы"
 
-#: editor_route_groups.cc:99 editor_routes.cc:209
+#: editor_route_groups.cc:99 editor_routes.cc:234
 msgid "Visible|V"
 msgstr "Ð’"
 
@@ -5195,9 +5540,9 @@ msgstr "Отн."
 msgid "Relative Gain Changes?"
 msgstr "Относительны ли изменения в усилении"
 
-#: editor_route_groups.cc:103 editor_regions.cc:124 editor_routes.cc:213
-#: mixer_strip.cc:2117 meter_strip.cc:367 route_time_axis.cc:2750
-#: time_axis_view.cc:1199
+#: editor_route_groups.cc:103 editor_regions.cc:168 editor_routes.cc:239
+#: mixer_strip.cc:2229 meter_strip.cc:365 route_time_axis.cc:2742
+#: time_axis_view.cc:1110
 msgid "Mute|M"
 msgstr "М"
 
@@ -5205,8 +5550,9 @@ msgstr "М"
 msgid "Sharing Mute?"
 msgstr "Разделяется ли приглушение"
 
-#: editor_route_groups.cc:104 editor_routes.cc:214 mixer_strip.cc:2130
-#: meter_strip.cc:375 route_time_axis.cc:2747
+#: editor_route_groups.cc:104 editor_routes.cc:240 mixer_strip.cc:2242
+#: meter_strip.cc:373 route_time_axis.cc:2739 vca_master_strip.cc:211
+#: vca_time_axis.cc:236
 msgid "Solo|S"
 msgstr "С"
 
@@ -5214,8 +5560,8 @@ msgstr "С"
 msgid "Sharing Solo?"
 msgstr "Разделяется ли солирование"
 
-#: editor_route_groups.cc:105 midi_time_axis.cc:1630 midi_time_axis.cc:1633
-#: midi_time_axis.cc:1636
+#: editor_route_groups.cc:105 midi_time_axis.cc:1626 midi_time_axis.cc:1629
+#: midi_time_axis.cc:1632
 msgid "Rec"
 msgstr "Зап"
 
@@ -5239,7 +5585,7 @@ msgstr "Выд."
 msgid "Sharing Selected/Editing Status?"
 msgstr "Разделять статус выделенности"
 
-#: editor_route_groups.cc:108 editor_routes.cc:210
+#: editor_route_groups.cc:108 editor_routes.cc:235
 msgid "Active|A"
 msgstr "А"
 
@@ -5247,13 +5593,13 @@ msgstr "А"
 msgid "Sharing Active Status?"
 msgstr "Разделяется ли активный статус"
 
-#: editor_export_audio.cc:93 editor_markers.cc:733 editor_markers.cc:827
-#: editor_markers.cc:1012 editor_markers.cc:1030 editor_markers.cc:1048
-#: editor_markers.cc:1067 editor_markers.cc:1086 editor_markers.cc:1116
-#: editor_markers.cc:1147 editor_markers.cc:1177 editor_markers.cc:1205
-#: editor_markers.cc:1236 editor_markers.cc:1261 editor_markers.cc:1312
-#: editor_markers.cc:1356 editor_markers.cc:1382 editor_markers.cc:1576
-#: editor_mouse.cc:2248
+#: editor_export_audio.cc:93 editor_markers.cc:733 editor_markers.cc:832
+#: editor_markers.cc:1045 editor_markers.cc:1063 editor_markers.cc:1081
+#: editor_markers.cc:1100 editor_markers.cc:1119 editor_markers.cc:1149
+#: editor_markers.cc:1180 editor_markers.cc:1210 editor_markers.cc:1238
+#: editor_markers.cc:1269 editor_markers.cc:1294 editor_markers.cc:1345
+#: editor_markers.cc:1458 editor_markers.cc:1484 editor_markers.cc:1678
+#: editor_mouse.cc:2255
 msgid "programming error: marker canvas item has no marker object pointer!"
 msgstr "Ошибка в программе: marker canvas item has no marker object pointer!"
 
@@ -5261,7 +5607,7 @@ msgstr "Ошибка в программе: marker canvas item has no marker obj
 msgid "Confirm MIDI File Overwrite"
 msgstr "Подтвердить перезапись файла MIDI"
 
-#: editor_export_audio.cc:115 utils_videotl.cc:73
+#: editor_export_audio.cc:115 utils_videotl.cc:75
 msgid "A file with the same name already exists. Do you want to overwrite it?"
 msgstr "Файл с таким именем уже существует. Перезаписать его?"
 
@@ -5281,20 +5627,20 @@ msgstr "Конец"
 msgid "mark"
 msgstr ""
 
-#: editor_markers.cc:650 editor_ops.cc:2102 editor_ops.cc:2124
-#: editor_ops.cc:2240 editor_ops.cc:2277 location_ui.cc:1025
+#: editor_markers.cc:650 editor_ops.cc:2164 editor_ops.cc:2186
+#: editor_ops.cc:2304 editor_ops.cc:2341 location_ui.cc:1049
 msgid "add marker"
 msgstr "Добавка маркера"
 
-#: editor_markers.cc:682 editor_markers.cc:1456
+#: editor_markers.cc:682 editor_markers.cc:1558
 msgid "set loop range"
 msgstr "Создать петлю из области"
 
-#: editor_markers.cc:698 editor_markers.cc:1462
+#: editor_markers.cc:698 editor_markers.cc:1564
 msgid "set punch range"
 msgstr "Создание выделения врезки"
 
-#: editor_markers.cc:715 editor_ops.cc:4092
+#: editor_markers.cc:715 editor_ops.cc:4159
 msgid "range"
 msgstr "диапазон"
 
@@ -5302,106 +5648,135 @@ msgstr "диапазон"
 msgid "new range marker"
 msgstr "Новый маркер диапазона"
 
-#: editor_markers.cc:751 editor_ops.cc:2208 location_ui.cc:861
+#: editor_markers.cc:751 editor_ops.cc:2272 location_ui.cc:885
 msgid "remove marker"
 msgstr "Удаление маркера"
 
-#: editor_markers.cc:894
+#: editor_markers.cc:899
 msgid "Locate to Here"
 msgstr "Переместить сюда указатель"
 
-#: editor_markers.cc:895
+#: editor_markers.cc:900
 msgid "Play from Here"
 msgstr "Воспроизвести отсюда"
 
-#: editor_markers.cc:896
+#: editor_markers.cc:901
 msgid "Move Mark to Playhead"
 msgstr "Маркер к указателю воспроизведения"
 
-#: editor_markers.cc:900
+#: editor_markers.cc:905
 msgid "Create Range to Next Marker"
 msgstr "Создать выделение до след. маркера"
 
-#: editor_markers.cc:941
+#: editor_markers.cc:946
 msgid "Locate to Marker"
 msgstr "Перейти к маркеру"
 
-#: editor_markers.cc:942
+#: editor_markers.cc:947
 msgid "Play from Marker"
 msgstr "Воспроизвести от маркера"
 
-#: editor_markers.cc:945
+#: editor_markers.cc:950
 msgid "Set Marker from Playhead"
 msgstr "Установить маркер по указателю"
 
-#: editor_markers.cc:947
+#: editor_markers.cc:951
 msgid "Set Range from Selection"
 msgstr "Установить диапазон по выделению"
 
-#: editor_markers.cc:957
+#: editor_markers.cc:960
 msgid "Hide Range"
 msgstr "Скрыть выделение"
 
-#: editor_markers.cc:958
+#: editor_markers.cc:961
 msgid "Rename Range..."
 msgstr "Переименовать область…"
 
-#: editor_markers.cc:962
+#: editor_markers.cc:965
 msgid "Remove Range"
 msgstr "Удалить выделение"
 
-#: editor_markers.cc:969
+#: editor_markers.cc:972
 msgid "Separate Regions in Range"
 msgstr "Разделить области в выделении"
 
-#: editor_markers.cc:972
+#: editor_markers.cc:974
 msgid "Select Range"
 msgstr "Выбрать выделение"
 
-#: editor_markers.cc:1001
+#: editor_markers.cc:987
+msgid "Make Ramped"
+msgstr ""
+
+#: editor_markers.cc:989
+msgid "Make Constant"
+msgstr ""
+
+#: editor_markers.cc:993 editor_markers.cc:1013
+msgid "Lock to Music"
+msgstr ""
+
+#: editor_markers.cc:995 editor_markers.cc:1015
+msgid "Lock to Audio"
+msgstr ""
+
+#: editor_markers.cc:1034
 msgid "Set Punch Range"
 msgstr "Установить область врезки"
 
-#: editor_markers.cc:1407 editor_ops.cc:2057
+#: editor_markers.cc:1391
+msgid "change meter lock style"
+msgstr ""
+
+#: editor_markers.cc:1414
+msgid "change tempo lock style"
+msgstr ""
+
+#: editor_markers.cc:1441
+msgid "change tempo type"
+msgstr ""
+
+#: editor_markers.cc:1509 editor_ops.cc:2119
 msgid "New Name:"
 msgstr "Новое название:"
 
-#: editor_markers.cc:1410
+#: editor_markers.cc:1512
 msgid "Rename Mark"
 msgstr "Переименовать маркер"
 
-#: editor_markers.cc:1412
+#: editor_markers.cc:1514
 msgid "Rename Range"
 msgstr "Переименовать выделение"
 
-#: editor_markers.cc:1419 editor_mouse.cc:2265 processor_box.cc:2370
-#: processor_box.cc:2837 route_time_axis.cc:1112 route_ui.cc:1616
+#: editor_markers.cc:1521 editor_mouse.cc:2272 processor_box.cc:3204
+#: processor_box.cc:3693 route_time_axis.cc:1110 route_ui.cc:1641
+#: vca_master_strip.cc:395
 msgid "Rename"
 msgstr "Переименовать"
 
-#: editor_markers.cc:1432
+#: editor_markers.cc:1534
 msgid "rename marker"
 msgstr "Переименование маркера"
 
-#: editor_mixer.cc:91
+#: editor_mixer.cc:98
 msgid "This screen is not tall enough to display the editor mixer"
 msgstr "Экран недостаточно высок, чтобы показать окно редактора"
 
-#: editor_mouse.cc:1343 editor_mouse.cc:1361 editor_tempodisplay.cc:270
+#: editor_mouse.cc:1345 editor_mouse.cc:1363 editor_tempodisplay.cc:384
 msgid ""
 "programming error: tempo marker canvas item has no marker object pointer!"
 msgstr ""
 "Ошибка в программе: tempo marker canvas item has no marker object pointer!"
 
-#: editor_mouse.cc:1348 editor_tempodisplay.cc:275
+#: editor_mouse.cc:1350 editor_tempodisplay.cc:389
 msgid "programming error: marker for tempo is not a tempo marker!"
 msgstr "Ошибка в программе: marker for tempo is not a tempo marker!"
 
-#: editor_mouse.cc:1366 editor_tempodisplay.cc:375
+#: editor_mouse.cc:1368 editor_tempodisplay.cc:507
 msgid "programming error: marker for meter is not a meter marker!"
 msgstr "Ошибка в программе: маркер размера таковым не является!"
 
-#: editor_mouse.cc:2013 editor_mouse.cc:2038 editor_mouse.cc:2051
+#: editor_mouse.cc:2016 editor_mouse.cc:2041 editor_mouse.cc:2054
 msgid ""
 "programming error: control point canvas item has no control point object "
 "pointer!"
@@ -5409,179 +5784,184 @@ msgstr ""
 "ошибка в программе: у контр. точки пункта события нет управления точкой "
 "объектауказатель!"
 
-#: editor_mouse.cc:2186
+#: editor_mouse.cc:2085
+#, fuzzy
+msgid "edit note(s)"
+msgstr "Правка ноты"
+
+#: editor_mouse.cc:2193
 msgid "start point trim"
 msgstr "Обрезка начальной точки"
 
-#: editor_mouse.cc:2211
+#: editor_mouse.cc:2218
 msgid "end point trim"
 msgstr ""
 
-#: editor_mouse.cc:2263
+#: editor_mouse.cc:2270
 msgid "Name for region:"
 msgstr "Название области: "
 
-#: editor_ops.cc:167
+#: editor_ops.cc:168
 msgid "split"
 msgstr "Разделение"
 
-#: editor_ops.cc:341
+#: editor_ops.cc:342
 msgid "alter selection"
 msgstr "Изменение выделения"
 
-#: editor_ops.cc:383
+#: editor_ops.cc:384
 msgid "nudge regions forward"
 msgstr "Толчок областей вперед"
 
-#: editor_ops.cc:437 editor_ops.cc:528
+#: editor_ops.cc:441 editor_ops.cc:535
 msgid "nudge location forward"
 msgstr "Толчок позиции вперед"
 
-#: editor_ops.cc:468
+#: editor_ops.cc:472
 msgid "nudge regions backward"
 msgstr "Толчок областей назад"
 
-#: editor_ops.cc:560
+#: editor_ops.cc:567
 msgid "nudge forward"
 msgstr "Толчок вперед"
 
-#: editor_ops.cc:584
+#: editor_ops.cc:591
 msgid "nudge backward"
 msgstr "Толчок назад"
 
-#: editor_ops.cc:649
+#: editor_ops.cc:656
 msgid "sequence regions"
 msgstr "выстраивание областей встык"
 
-#: editor_ops.cc:711
+#: editor_ops.cc:718
 msgid "build_region_boundary_cache called with snap_type = %1"
 msgstr "Функция build_region_boundary_cache вызвана с snap_type = %1"
 
-#: editor_ops.cc:2059
+#: editor_ops.cc:2121
 msgid "New Location Marker"
 msgstr "Новый маркер позиции"
 
-#: editor_ops.cc:2150 editor_ops.cc:2174
+#: editor_ops.cc:2212 editor_ops.cc:2236
 msgid "Set session start"
-msgstr ""
+msgstr "Установить начало сессии"
 
-#: editor_ops.cc:2240
+#: editor_ops.cc:2304
 msgid "add markers"
 msgstr "Добавка маркера"
 
-#: editor_ops.cc:2336
+#: editor_ops.cc:2400
 msgid "clear markers"
 msgstr "Очистка маркеров"
 
-#: editor_ops.cc:2351
+#: editor_ops.cc:2415
 msgid "clear ranges"
 msgstr "Очистка диапазонов"
 
-#: editor_ops.cc:2367
+#: editor_ops.cc:2431
 msgid "clear locations"
 msgstr "Очистка позиций"
 
-#: editor_ops.cc:2430
+#: editor_ops.cc:2494
 msgid "insert region"
 msgstr "Вставка области"
 
-#: editor_ops.cc:2621
+#: editor_ops.cc:2685
 msgid "raise regions"
 msgstr "Поднятие областей"
 
-#: editor_ops.cc:2623
+#: editor_ops.cc:2687
 msgid "raise region"
 msgstr "Поднятие области"
 
-#: editor_ops.cc:2629
+#: editor_ops.cc:2693
 msgid "raise regions to top"
 msgstr "Поднятие областей наверх"
 
-#: editor_ops.cc:2631
+#: editor_ops.cc:2695
 msgid "raise region to top"
 msgstr "Поднятие области наверх"
 
-#: editor_ops.cc:2637
+#: editor_ops.cc:2701
 msgid "lower regions"
 msgstr "Опускание областей"
 
-#: editor_ops.cc:2639 editor_ops.cc:2647
+#: editor_ops.cc:2703 editor_ops.cc:2711
 msgid "lower region"
 msgstr "Опускание области"
 
-#: editor_ops.cc:2645
+#: editor_ops.cc:2709
 msgid "lower regions to bottom"
 msgstr "Опускание областей вниз"
 
-#: editor_ops.cc:2730
+#: editor_ops.cc:2794
 msgid "Rename Region"
 msgstr "Переименовать область..."
 
-#: editor_ops.cc:2732 processor_box.cc:2368 route_ui.cc:1614
+#: editor_ops.cc:2796 processor_box.cc:3202 route_ui.cc:1639
 msgid "New name:"
 msgstr "Новое название:"
 
-#: editor_ops.cc:3030
+#: editor_ops.cc:3097
 msgid "separate"
 msgstr "разделение"
 
-#: editor_ops.cc:3142
+#: editor_ops.cc:3207
 msgid "separate region under"
 msgstr "разделение области под курсором"
 
-#: editor_ops.cc:3294
+#: editor_ops.cc:3360
 msgid "trim to selection"
 msgstr "Обрезание по выделению"
 
-#: editor_ops.cc:3376
+#: editor_ops.cc:3442
 msgid "set sync point"
 msgstr "Установка точки синхронизации"
 
-#: editor_ops.cc:3400
+#: editor_ops.cc:3466
 msgid "remove region sync"
 msgstr "Удаление синхронизатора области"
 
-#: editor_ops.cc:3422
+#: editor_ops.cc:3488
 msgid "move regions to original position"
 msgstr "Перемещение областей в исходную позицию"
 
-#: editor_ops.cc:3424
+#: editor_ops.cc:3490
 msgid "move region to original position"
 msgstr "Перемещение области в исходную позицию"
 
-#: editor_ops.cc:3445
+#: editor_ops.cc:3511
 msgid "align selection"
 msgstr "Выравнивание выделения"
 
-#: editor_ops.cc:3519
+#: editor_ops.cc:3585
 msgid "align selection (relative)"
 msgstr "Выравнивание выделения (относительное)"
 
-#: editor_ops.cc:3553
+#: editor_ops.cc:3619
 msgid "align region"
 msgstr "Выравнивание области"
 
-#: editor_ops.cc:3604
+#: editor_ops.cc:3670
 msgid "trim front"
 msgstr "Обрезка впереди"
 
-#: editor_ops.cc:3604
+#: editor_ops.cc:3670
 msgid "trim back"
 msgstr "Обрезка сзади"
 
-#: editor_ops.cc:3634
+#: editor_ops.cc:3700
 msgid "trim to loop"
 msgstr "Обрезка в петлю"
 
-#: editor_ops.cc:3644
+#: editor_ops.cc:3710
 msgid "trim to punch"
 msgstr "Обрезка во врезку"
 
-#: editor_ops.cc:3766
+#: editor_ops.cc:3832
 msgid "trim to region"
 msgstr "Обрезка в область"
 
-#: editor_ops.cc:3825
+#: editor_ops.cc:3891
 msgid ""
 "This track/bus cannot be frozen because the signal adds or loses channels "
 "before reaching the outputs.\n"
@@ -5593,11 +5973,11 @@ msgstr ""
 "Это, как правило, вызвано плагинами, которые генерируют выходной "
 "стереосигнал из моновхода или наоборот."
 
-#: editor_ops.cc:3828
+#: editor_ops.cc:3894
 msgid "Cannot freeze"
 msgstr "Невозможно заморозить"
 
-#: editor_ops.cc:3834
+#: editor_ops.cc:3900
 msgid ""
 "<b>%1</b>\n"
 "\n"
@@ -5613,23 +5993,23 @@ msgstr ""
 "Замораживание будет только обрабатывать сигнал как первый посыл/вставку/"
 "возврат."
 
-#: editor_ops.cc:3838
+#: editor_ops.cc:3904
 msgid "Freeze anyway"
 msgstr "Всё равно заморозить"
 
-#: editor_ops.cc:3839
+#: editor_ops.cc:3905
 msgid "Don't freeze"
 msgstr "Не замораживать"
 
-#: editor_ops.cc:3840
+#: editor_ops.cc:3906
 msgid "Freeze Limits"
 msgstr "Пределы заморозки"
 
-#: editor_ops.cc:3855
+#: editor_ops.cc:3921
 msgid "Cancel Freeze"
 msgstr "Отменить замораживание"
 
-#: editor_ops.cc:3885
+#: editor_ops.cc:3952
 msgid ""
 "You can't perform this operation because the processing of the signal will "
 "cause one or more of the tracks to end up with a region with more channels "
@@ -5643,47 +6023,47 @@ msgstr ""
 "\n"
 "Вы можете сделать это без обработки, и это уже другая операция."
 
-#: editor_ops.cc:3889
+#: editor_ops.cc:3956
 msgid "Cannot bounce"
 msgstr "Невозможно выполнить сведение"
 
-#: editor_ops.cc:3940
+#: editor_ops.cc:4007
 msgid "bounce range"
 msgstr "Сведение области"
 
-#: editor_ops.cc:4007
+#: editor_ops.cc:4074
 msgid "delete"
 msgstr "Удаление"
 
-#: editor_ops.cc:4010
+#: editor_ops.cc:4077
 msgid "cut"
 msgstr "Вырезать"
 
-#: editor_ops.cc:4013
+#: editor_ops.cc:4080
 msgid "copy"
 msgstr "Копировать"
 
-#: editor_ops.cc:4016
+#: editor_ops.cc:4083
 msgid "clear"
 msgstr "Очистить"
 
-#: editor_ops.cc:4065
+#: editor_ops.cc:4132
 msgid "objects"
 msgstr "объекты"
 
-#: editor_ops.cc:4275 editor_ops.cc:4360
+#: editor_ops.cc:4342 editor_ops.cc:4427
 msgid "remove region"
 msgstr "Удаление области"
 
-#: editor_ops.cc:4787
-msgid "duplicate selection"
-msgstr "Дублирование выделения"
+#: editor_ops.cc:4844
+msgid "duplicate range selection"
+msgstr ""
 
-#: editor_ops.cc:4873
+#: editor_ops.cc:4938
 msgid "nudge track"
 msgstr "Смещение дорожки"
 
-#: editor_ops.cc:4900
+#: editor_ops.cc:4965
 msgid ""
 "Do you really want to destroy the last capture?\n"
 "(This is destructive and cannot be undone)"
@@ -5691,156 +6071,156 @@ msgstr ""
 "Последнюю запись будет удалена. Вы уверены?\n"
 "(отмена операции невозможна)"
 
-#: editor_ops.cc:4903 editor_ops.cc:7127 editor_regions.cc:466
+#: editor_ops.cc:4968 editor_ops.cc:7202 editor_regions.cc:503
 #: editor_snapshots.cc:171
 msgid "No, do nothing."
 msgstr "Нет"
 
-#: editor_ops.cc:4904
+#: editor_ops.cc:4969
 msgid "Yes, destroy it."
 msgstr "Да"
 
-#: editor_ops.cc:4906
+#: editor_ops.cc:4971
 msgid "Destroy last capture"
 msgstr "Уничтожение последней записи"
 
-#: editor_ops.cc:4982
+#: editor_ops.cc:5047
 msgid "normalize"
 msgstr "Нормализация"
 
-#: editor_ops.cc:5080
+#: editor_ops.cc:5145
 msgid "reverse regions"
 msgstr "Разворот областей"
 
-#: editor_ops.cc:5116
+#: editor_ops.cc:5182
 msgid "strip silence"
 msgstr "Удаление тишины"
 
-#: editor_ops.cc:5197
+#: editor_ops.cc:5263
 msgid "Fork Region(s)"
 msgstr "Ответвление областей"
 
-#: editor_ops.cc:5204
+#: editor_ops.cc:5270
 msgid "Could not unlink %1"
 msgstr "Не удалось отсоединить %1"
 
-#: editor_ops.cc:5465
+#: editor_ops.cc:5532
 msgid "reset region gain"
 msgstr "Сброс усиления области"
 
-#: editor_ops.cc:5523
+#: editor_ops.cc:5590
 msgid "region gain envelope active"
 msgstr "Огибающая области активна"
 
-#: editor_ops.cc:5548
+#: editor_ops.cc:5615
 msgid "toggle region lock"
 msgstr "Переключение блокировки области"
 
-#: editor_ops.cc:5572
+#: editor_ops.cc:5639
 msgid "Toggle Video Lock"
 msgstr "Переключить видеоблокировку"
 
-#: editor_ops.cc:5596
+#: editor_ops.cc:5663
 msgid "region lock style"
 msgstr "Способ блокировки области"
 
-#: editor_ops.cc:5621
+#: editor_ops.cc:5688
 msgid "change region opacity"
 msgstr "Смена прозрачности области"
 
-#: editor_ops.cc:5714
+#: editor_ops.cc:5781
 msgid "fade range"
 msgstr "Диапазон фейда"
 
-#: editor_ops.cc:5752
+#: editor_ops.cc:5819
 msgid "set fade in length"
 msgstr "Установка длины фейда нарастания"
 
-#: editor_ops.cc:5759
+#: editor_ops.cc:5826
 msgid "set fade out length"
 msgstr "Установка длины фейда затухания"
 
-#: editor_ops.cc:5824
+#: editor_ops.cc:5891
 msgid "set fade in shape"
 msgstr "Установка формы фейда нарастания"
 
-#: editor_ops.cc:5859
+#: editor_ops.cc:5926
 msgid "set fade out shape"
 msgstr "Установка формы фейда затухания"
 
-#: editor_ops.cc:5895
+#: editor_ops.cc:5962
 msgid "set fade in active"
 msgstr "Установка активности фейда нарастания"
 
-#: editor_ops.cc:5929
+#: editor_ops.cc:5996
 msgid "set fade out active"
 msgstr "Установка активности фейда затухания"
 
-#: editor_ops.cc:5989
+#: editor_ops.cc:6056
 msgid "toggle fade active"
-msgstr ""
+msgstr "переключение активности фейда"
 
-#: editor_ops.cc:6179
+#: editor_ops.cc:6249
 msgid "set loop range from selection"
 msgstr "Установка петли из выделения"
 
-#: editor_ops.cc:6193
+#: editor_ops.cc:6263
 msgid "set loop range from region"
 msgstr "Установка петли из области"
 
-#: editor_ops.cc:6212
+#: editor_ops.cc:6282
 msgid "set punch range from selection"
 msgstr "Установка врезки из выделения"
 
-#: editor_ops.cc:6236
+#: editor_ops.cc:6306
 msgid "set session start/end from selection"
 msgstr "Установка начала/конца сессии из выделения"
 
-#: editor_ops.cc:6272
+#: editor_ops.cc:6344
 msgid "set punch start from EP"
 msgstr ""
 
-#: editor_ops.cc:6300
+#: editor_ops.cc:6372
 msgid "set punch end from EP"
 msgstr ""
 
-#: editor_ops.cc:6333
+#: editor_ops.cc:6405
 msgid "set loop start from EP"
 msgstr ""
 
-#: editor_ops.cc:6361
+#: editor_ops.cc:6433
 msgid "set loop end from EP"
 msgstr ""
 
-#: editor_ops.cc:6372
+#: editor_ops.cc:6444
 msgid "set punch range from region"
 msgstr "Установка врезки из области"
 
-#: editor_ops.cc:6457
+#: editor_ops.cc:6531
 msgid "Add new marker"
 msgstr "Создать маркер"
 
-#: editor_ops.cc:6458
+#: editor_ops.cc:6532
 msgid "Set global tempo"
 msgstr "Установить общий темп"
 
-#: editor_ops.cc:6461
+#: editor_ops.cc:6535
 msgid "Define one bar"
 msgstr "Определение такта"
 
-#: editor_ops.cc:6462
+#: editor_ops.cc:6536
 msgid "Do you want to set the global tempo or add a new tempo marker?"
 msgstr "Вы хотите установить общий темп или добавить новый маркер темпа?"
 
-#: editor_ops.cc:6488
+#: editor_ops.cc:6562
 msgid "set tempo from region"
 msgstr "Установка темпа из области"
 
-#: editor_ops.cc:6518
+#: editor_ops.cc:6591
 msgid "split regions"
 msgstr "Разделение выделений"
 
-#: editor_ops.cc:6560
+#: editor_ops.cc:6633
 msgid ""
 "You are about to split\n"
 "%1\n"
@@ -5852,11 +6232,11 @@ msgstr ""
 "на %2 частей.\n"
 "Это может занять много времени."
 
-#: editor_ops.cc:6567
+#: editor_ops.cc:6640
 msgid "Call for the Ferret!"
 msgstr "(?)Призвать Ферре!"
 
-#: editor_ops.cc:6568
+#: editor_ops.cc:6641
 msgid ""
 "Press OK to continue with this split operation\n"
 "or ask the Ferret dialog to tune the analysis"
@@ -5864,52 +6244,52 @@ msgstr ""
 "Нажмите OK для выполнения разделения\n"
 "или попросите Хорька скорректировать анализ."
 
-#: editor_ops.cc:6570
+#: editor_ops.cc:6643
 msgid "Press OK to continue with this split operation"
 msgstr "Нажмите OK для выполнения разделения"
 
-#: editor_ops.cc:6573
+#: editor_ops.cc:6646
 msgid "Excessive split?"
 msgstr "Массовое разделение?"
 
-#: editor_ops.cc:6725
+#: editor_ops.cc:6800
 msgid "place transient"
 msgstr "Разместить переходные"
 
-#: editor_ops.cc:6760
+#: editor_ops.cc:6834
 msgid "snap regions to grid"
 msgstr "привязка областей к сетке"
 
-#: editor_ops.cc:6799
+#: editor_ops.cc:6873
 msgid "Close Region Gaps"
 msgstr "Закрытие интервалов между областями"
 
-#: editor_ops.cc:6804
+#: editor_ops.cc:6878
 msgid "Crossfade length"
 msgstr "Длительность кроссфейда"
 
-#: editor_ops.cc:6813 editor_ops.cc:6824 rhythm_ferret.cc:119
-#: session_option_editor.cc:141
+#: editor_ops.cc:6887 editor_ops.cc:6898 rhythm_ferret.cc:128
+#: rhythm_ferret.cc:143 session_option_editor.cc:141
 msgid "ms"
 msgstr "мс"
 
-#: editor_ops.cc:6815
+#: editor_ops.cc:6889
 msgid "Pull-back length"
 msgstr "Растяжка длины назад"
 
-#: editor_ops.cc:6828
+#: editor_ops.cc:6902 keyeditor.cc:71
 msgid "Ok"
 msgstr "ОК"
 
-#: editor_ops.cc:6843
+#: editor_ops.cc:6917
 msgid "close region gaps"
 msgstr "устранение пробелов области"
 
-#: editor_ops.cc:7085
+#: editor_ops.cc:7160
 msgid "That would be bad news ...."
 msgstr "Это было бы плохой новостью..."
 
-#: editor_ops.cc:7090
+#: editor_ops.cc:7165
 msgid ""
 "Removing the master or monitor bus is such a bad idea\n"
 "that %1 is not going to allow it.\n"
@@ -5925,21 +6305,21 @@ msgstr ""
 "подобные вещи, в файле ardour.rc измените значение параметра\n"
 "\"allow-special-bus-removal\" на \"yes\""
 
-#: editor_ops.cc:7106 route_ui.cc:2009
+#: editor_ops.cc:7181
 msgid "track"
 msgid_plural "tracks"
 msgstr[0] "дорожка"
 msgstr[1] "дорожки"
 msgstr[2] "дорожек"
 
-#: editor_ops.cc:7107 route_ui.cc:2009
+#: editor_ops.cc:7182
 msgid "bus"
 msgid_plural "busses"
 msgstr[0] "шина"
 msgstr[1] "шины"
 msgstr[2] "шин"
 
-#: editor_ops.cc:7111
+#: editor_ops.cc:7186
 msgid ""
 "Do you really want to remove %1 %2 and %3 %4?\n"
 "(You may also lose the playlists associated with the %2)\n"
@@ -5951,7 +6331,7 @@ msgstr ""
 "\n"
 "Это действие невозможно отменить, файл сессии будет перезаписан."
 
-#: editor_ops.cc:7116
+#: editor_ops.cc:7191
 msgid ""
 "Do you really want to remove %1 %2?\n"
 "(You may also lose the playlists associated with the %2)\n"
@@ -5963,7 +6343,7 @@ msgstr ""
 "\n"
 "Это действие невозможно отменить, файл сессии будет перезаписан."
 
-#: editor_ops.cc:7122
+#: editor_ops.cc:7197
 msgid ""
 "Do you really want to remove %1 %2?\n"
 "\n"
@@ -5973,144 +6353,140 @@ msgstr ""
 "\n"
 "Это действие не может быть отменено и файл сессии будут перезаписан"
 
-#: editor_ops.cc:7129
+#: editor_ops.cc:7204
 msgid "Yes, remove them."
 msgstr "Да, удалить их."
 
-#: editor_ops.cc:7131 editor_snapshots.cc:172
+#: editor_ops.cc:7206 editor_snapshots.cc:172
 msgid "Yes, remove it."
 msgstr "Да, удалить"
 
-#: editor_ops.cc:7136 editor_ops.cc:7138
+#: editor_ops.cc:7211 editor_ops.cc:7213
 msgid "Remove %1"
 msgstr "Удалить %1"
 
-#: editor_ops.cc:7240 editor_ops.cc:7254 editor_ops.cc:7294 editor_ops.cc:7304
+#: editor_ops.cc:7319 editor_ops.cc:7333 editor_ops.cc:7373 editor_ops.cc:7383
 msgid "insert time"
 msgstr "Вставка времени"
 
-#: editor_ops.cc:7357
+#: editor_ops.cc:7436
 msgid "Cannot insert or delete time when in Lock edit."
 msgstr ""
 
-#: editor_ops.cc:7377 editor_ops.cc:7389 editor_ops.cc:7462
-msgid "cut time"
-msgstr ""
-
-#: editor_ops.cc:7475
+#: editor_ops.cc:7456 editor_ops.cc:7468 editor_ops.cc:7541 editor_ops.cc:7554
 msgid "remove time"
 msgstr ""
 
-#: editor_ops.cc:7549
+#: editor_ops.cc:7628
 msgid "There are too many tracks to fit in the current window"
 msgstr "Такое количество дорожек в окне не поместится"
 
-#: editor_ops.cc:7610
+#: editor_ops.cc:7689
 msgid "Sel"
 msgstr "Выб."
 
-#: editor_ops.cc:7649
+#: editor_ops.cc:7728
 #, c-format
 msgid "Saved view %u"
 msgstr "Сохраненный вид %u"
 
-#: editor_ops.cc:7674
+#: editor_ops.cc:7753
 msgid "mute regions"
 msgstr "Приглушение областей"
 
-#: editor_ops.cc:7676
+#: editor_ops.cc:7755
 msgid "mute region"
 msgstr "Приглушение области"
 
-#: editor_ops.cc:7713
+#: editor_ops.cc:7792
 msgid "combine regions"
 msgstr "Объединение областей"
 
-#: editor_ops.cc:7751
+#: editor_ops.cc:7830
 msgid "uncombine regions"
 msgstr "Разъединение областей"
 
-#: editor_ops.cc:7788
+#: editor_ops.cc:7867
 msgid "%1: Locked"
 msgstr "%1: заблокировано"
 
-#: editor_ops.cc:7795
+#: editor_ops.cc:7874
 msgid "Click to unlock"
 msgstr "Снять замок"
 
-#: editor_ops.cc:7844
+#: editor_ops.cc:7923
 msgid "Moving embedded files into session folder"
 msgstr "Перемещение встроенных файлов в папке сессии"
 
-#: editor_regions.cc:115
+#: editor_regions.cc:159
 msgid "Region name, with number of channels in []'s"
 msgstr "Название региона с числом каналов в []'с"
 
-#: editor_regions.cc:116
+#: editor_regions.cc:160
 msgid "Position of start of region"
 msgstr "Положение начала области"
 
-#: editor_regions.cc:117 editor_regions.cc:863 time_info_box.cc:101
+#: editor_regions.cc:161 editor_regions.cc:935 time_info_box.cc:95
 msgid "End"
 msgstr "Конец"
 
-#: editor_regions.cc:117
+#: editor_regions.cc:161
 msgid "Position of end of region"
 msgstr "Положение конца области"
 
-#: editor_regions.cc:118
+#: editor_regions.cc:162
 msgid "Length of the region"
 msgstr "Длительность области"
 
-#: editor_regions.cc:119
+#: editor_regions.cc:163
 msgid "Position of region sync point, relative to start of the region"
 msgstr "Положение точки области синхронизации относительно начала региона"
 
-#: editor_regions.cc:120
+#: editor_regions.cc:164
 msgid "Length of region fade-in (units: secondary clock), () if disabled"
 msgstr "Длина области нарастания (единицы: второй счётчик), (), если отключен"
 
-#: editor_regions.cc:121
+#: editor_regions.cc:165
 msgid "Length of region fade-out (units: secondary clock), () if disabled"
 msgstr "Длина области затухания (единицы: второй счётчик), (), если отключены"
 
-#: editor_regions.cc:122
+#: editor_regions.cc:166
 msgid "Lock|L"
 msgstr "Б"
 
-#: editor_regions.cc:122
+#: editor_regions.cc:166
 msgid "Region position locked?"
 msgstr "Позиция области заблокирована?"
 
-#: editor_regions.cc:123
+#: editor_regions.cc:167
 msgid "Gain|G"
 msgstr "У"
 
-#: editor_regions.cc:123
+#: editor_regions.cc:167
 msgid "Region position glued to Bars|Beats time?"
 msgstr "Приклеить позицию региона к времени Бар|Бит?"
 
-#: editor_regions.cc:124
+#: editor_regions.cc:168
 msgid "Region muted?"
 msgstr "Область приглушена?"
 
-#: editor_regions.cc:125
+#: editor_regions.cc:169
 msgid "Opaque|O"
 msgstr "Н"
 
-#: editor_regions.cc:125
+#: editor_regions.cc:169
 msgid "Region opaque (blocks regions below it from being heard)?"
 msgstr "Непрозрачность региона (блоки регионов под ним слышимы)?"
 
-#: editor_regions.cc:315 editor_regions.cc:320 editor_regions.cc:322
+#: editor_regions.cc:360 editor_regions.cc:365 editor_regions.cc:367
 msgid "Hidden"
 msgstr "Скрытый"
 
-#: editor_regions.cc:395
+#: editor_regions.cc:432
 msgid "(MISSING) "
 msgstr "(ОТСУТСТВУЕТ) "
 
-#: editor_regions.cc:463
+#: editor_regions.cc:500
 msgid ""
 "Do you really want to remove unused regions?\n"
 "(This is destructive and cannot be undone)"
@@ -6118,121 +6494,133 @@ msgstr ""
 "Вы действительно хотите удалить неиспользуемые области?\n"
 "Отменить это действие будет невозможно."
 
-#: editor_regions.cc:467
+#: editor_regions.cc:504
 msgid "Yes, remove."
 msgstr "Да, удалить"
 
-#: editor_regions.cc:469
+#: editor_regions.cc:506
 msgid "Remove unused regions"
 msgstr "Удалить неиспользуемые области"
 
-#: editor_regions.cc:698
+#: editor_regions.cc:735
 msgid "EditorRegions::format_position: negative timecode position: %1"
-msgstr ""
+msgstr "EditorRegions::format_position: негативная позиция тайм-кода: %1"
 
-#: editor_regions.cc:828 editor_regions.cc:844 editor_regions.cc:858
+#: editor_regions.cc:900 editor_regions.cc:916 editor_regions.cc:930
 msgid "Mult."
 msgstr "Неск."
 
-#: editor_regions.cc:861 midi_list_editor.cc:104 time_info_box.cc:94
+#: editor_regions.cc:933 midi_list_editor.cc:104 time_info_box.cc:88
 msgid "Start"
 msgstr "Начало"
 
-#: editor_regions.cc:879 editor_regions.cc:895
+#: editor_regions.cc:951 editor_regions.cc:967
 msgid "Multiple"
 msgstr "Несколько"
 
-#: editor_regions.cc:964
+#: editor_regions.cc:1036
 msgid "MISSING "
 msgstr "(ОТСУТСТВУЕТ) "
 
-#: editor_routes.cc:184
+#: editor_routes.cc:126
+msgid "RS"
+msgstr ""
+
+#: editor_routes.cc:208
 msgid "SS"
 msgstr "СС"
 
-#: editor_routes.cc:208
+#: editor_routes.cc:233
 msgid "Track/Bus Name"
 msgstr "Название дорожи/шины"
 
-#: editor_routes.cc:209
+#: editor_routes.cc:234
 msgid "Track/Bus visible ?"
 msgstr "Дорожка или шина видима?"
 
-#: editor_routes.cc:210
+#: editor_routes.cc:235
 msgid "Track/Bus active ?"
 msgstr "Дорожка или шина активна?"
 
-#: editor_routes.cc:211
+#: editor_routes.cc:236
 msgid "MidiInput|I"
 msgstr "Ð’Ñ…"
 
-#: editor_routes.cc:211
+#: editor_routes.cc:236
 msgid "MIDI input enabled"
 msgstr "Вход MIDI включен"
 
-#: editor_routes.cc:212
+#: editor_routes.cc:237
 msgid "Rec|R"
 msgstr "З"
 
-#: editor_routes.cc:212
+#: editor_routes.cc:237
 msgid "Record enabled"
 msgstr "Готовность к записи"
 
-#: editor_routes.cc:213
+#: editor_routes.cc:238
+msgid "Rec|RS"
+msgstr ""
+
+#: editor_routes.cc:238
+msgid "Record Safe"
+msgstr ""
+
+#: editor_routes.cc:239
 msgid "Muted"
 msgstr "Пригл."
 
-#: editor_routes.cc:214
+#: editor_routes.cc:240
 msgid "Soloed"
 msgstr "Солир."
 
-#: editor_routes.cc:215
+#: editor_routes.cc:241
 msgid "SoloIso|SI"
 msgstr "ИС"
 
-#: editor_routes.cc:215
+#: editor_routes.cc:241
 msgid "Solo Isolated"
 msgstr "Изолирование соло"
 
-#: editor_routes.cc:216
+#: editor_routes.cc:242
 msgid "SoloLock|SS"
 msgstr "БС"
 
-#: editor_routes.cc:216
+#: editor_routes.cc:242
 msgid "Solo Safe (Locked)"
 msgstr "Сохр. соло (закрыт)"
 
-#: editor_routes.cc:486 mixer_ui.cc:1259
+#: editor_routes.cc:550 mixer_ui.cc:1498
 msgid "Hide All"
 msgstr "Скрыть всё"
 
-#: editor_routes.cc:487 mixer_ui.cc:1260
+#: editor_routes.cc:551 mixer_ui.cc:1499
 msgid "Show All Audio Tracks"
 msgstr "Показать все звуковые дорожки"
 
-#: editor_routes.cc:488 mixer_ui.cc:1261
+#: editor_routes.cc:552 mixer_ui.cc:1500
 msgid "Hide All Audio Tracks"
 msgstr "Скрыть все звуковые дорожки"
 
-#: editor_routes.cc:489 mixer_ui.cc:1262
+#: editor_routes.cc:553 mixer_ui.cc:1501
 msgid "Show All Audio Busses"
 msgstr "Показать все звуковые шины"
 
-#: editor_routes.cc:490 mixer_ui.cc:1263
+#: editor_routes.cc:554 mixer_ui.cc:1502
 msgid "Hide All Audio Busses"
 msgstr "Скрыть все звуковые шины"
 
-#: editor_routes.cc:491 mixer_ui.cc:1264
+#: editor_routes.cc:555 mixer_ui.cc:1503
 msgid "Show All Midi Tracks"
 msgstr "Показать все MIDI-дорожки"
 
-#: editor_routes.cc:492 mixer_ui.cc:1265
+#: editor_routes.cc:556 mixer_ui.cc:1504
 msgid "Hide All Midi Tracks"
 msgstr "Скрыть все MIDI-дорожки"
 
-#: editor_routes.cc:493
+#: editor_routes.cc:557
 msgid "Only Show Tracks with Regions Under Playhead"
-msgstr ""
+msgstr "Показывать только дорожки с областями под указателем"
 
 #: editor_rulers.cc:212
 msgid "New location marker"
@@ -6274,7 +6662,7 @@ msgstr "Создать маркер дорожки CD"
 msgid "New Tempo"
 msgstr "Вставить новый темп"
 
-#: editor_rulers.cc:238 tempo_dialog.cc:315
+#: editor_rulers.cc:238 tempo_dialog.cc:419
 msgid "New Meter"
 msgstr "Вставить новый размер"
 
@@ -6298,31 +6686,35 @@ msgstr ""
 msgid "Remove snapshot"
 msgstr "Удалить снимок"
 
-#: editor_tempodisplay.cc:194 editor_tempodisplay.cc:234
-msgid "add"
-msgstr "Добавить"
-
-#: editor_tempodisplay.cc:215
+#: editor_tempodisplay.cc:318
 msgid "add tempo mark"
 msgstr "Добавка маркер темпа"
 
-#: editor_tempodisplay.cc:254
+#: editor_tempodisplay.cc:343
+msgid "add"
+msgstr "Добавить"
+
+#: editor_tempodisplay.cc:362
 msgid "add meter mark"
 msgstr "Добавка маркера размера"
 
-#: editor_tempodisplay.cc:287 editor_tempodisplay.cc:315
+#: editor_tempodisplay.cc:401 editor_tempodisplay.cc:435
 msgid "done"
 msgstr "Готово"
 
-#: editor_tempodisplay.cc:304 editor_tempodisplay.cc:330
+#: editor_tempodisplay.cc:422
+msgid "replace meter mark"
+msgstr ""
+
+#: editor_tempodisplay.cc:454
 msgid "replace tempo mark"
 msgstr "Замена маркера темпа"
 
-#: editor_tempodisplay.cc:353 editor_tempodisplay.cc:387
+#: editor_tempodisplay.cc:485 editor_tempodisplay.cc:519
 msgid "remove tempo mark"
 msgstr "Удаление маркера темпа"
 
-#: editor_tempodisplay.cc:370
+#: editor_tempodisplay.cc:502
 msgid ""
 "programming error: meter marker canvas item has no marker object pointer!"
 msgstr ""
@@ -6336,7 +6728,7 @@ msgstr "Растянуть или сжать"
 msgid "pitch shift"
 msgstr "Смена высоты тона"
 
-#: editor_timefx.cc:304
+#: editor_timefx.cc:282
 msgid "timefx cannot be started - thread creation error"
 msgstr "Timefx не может быть запущен, ошибка при создании потока"
 
@@ -6352,27 +6744,31 @@ msgstr "Настройка MIDI-устройства"
 msgid "Refresh Devices"
 msgstr "Обновить список устройств"
 
-#: engine_dialog.cc:90 engine_dialog.cc:2923
+#: engine_dialog.cc:90
+msgid "Use Buffered I/O"
+msgstr ""
+
+#: engine_dialog.cc:91 engine_dialog.cc:3000
 msgid "Measure"
 msgstr "Измерить"
 
-#: engine_dialog.cc:91
+#: engine_dialog.cc:92
 msgid "Use results"
 msgstr "Использовать результаты"
 
-#: engine_dialog.cc:92
+#: engine_dialog.cc:93
 msgid "Back to settings ... (ignore results)"
 msgstr "Закрыть и не использовать"
 
-#: engine_dialog.cc:93
+#: engine_dialog.cc:94
 msgid "Calibrate Audio"
 msgstr "Калибровка аудио"
 
-#: engine_dialog.cc:97
+#: engine_dialog.cc:98
 msgid "Back to settings"
 msgstr "Возврат к настройкам"
 
-#: engine_dialog.cc:118
+#: engine_dialog.cc:120
 msgid ""
 "No audio/MIDI backends detected. %1 cannot run\n"
 "\n"
@@ -6382,11 +6778,11 @@ msgstr ""
 "\n"
 "(Это ошибка сборки/упаковки/системы, она никогда не должна происходить.)"
 
-#: engine_dialog.cc:143
+#: engine_dialog.cc:145
 msgid "Latency Measurement Tool"
 msgstr "Тестирование задержки отклика"
 
-#: engine_dialog.cc:155
+#: engine_dialog.cc:157
 msgid ""
 "<span weight=\"bold\">Turn down the volume on your audio equipment to a very "
 "low level.</span>"
@@ -6394,98 +6790,99 @@ msgstr ""
 "<span weight=\"bold\">Уберите громкость выхода вашей звуковой карты до "
 "минимума </span>"
 
-#: engine_dialog.cc:164
+#: engine_dialog.cc:166
 msgid "Select two channels below and connect them using a cable."
 msgstr "Выберите два канала ниже и соединить их с помощью кабеля"
 
-#: engine_dialog.cc:169
+#: engine_dialog.cc:171
 msgid "Output channel"
 msgstr "Канал выхода"
 
-#: engine_dialog.cc:177
+#: engine_dialog.cc:179
 msgid "Input channel"
 msgstr "Канал входа"
 
-#: engine_dialog.cc:211
+#: engine_dialog.cc:213
 msgid "Once the channels are connected, click the \"Measure\" button."
 msgstr "Соединив каналы, нажмите кнопку «Измерить»."
 
-#: engine_dialog.cc:218
+#: engine_dialog.cc:220
 msgid "When satisfied with the results, click the \"Use results\" button."
 msgstr ""
 "Если результат вас устраивает, нажмите кнопку «Использовать результаты»."
 
-#: engine_dialog.cc:233 engine_dialog.cc:3058 engine_dialog.cc:3068
+#: engine_dialog.cc:235 engine_dialog.cc:3138 engine_dialog.cc:3148
 msgid "No measurement results yet"
 msgstr "Пока нет результатов измерения"
 
-#: engine_dialog.cc:243 route_params_ui.cc:106
+#: engine_dialog.cc:245 route_params_ui.cc:106
 msgid "Latency"
 msgstr "Задержка отклика"
 
-#: engine_dialog.cc:497
+#: engine_dialog.cc:520
 msgid "Audio System:"
 msgstr "Звуковая подсистема:"
 
-#: engine_dialog.cc:540
+#: engine_dialog.cc:564
 msgid "Driver:"
 msgstr "Драйвер:"
 
-#: engine_dialog.cc:547
+#: engine_dialog.cc:571
 msgid "Input Device:"
 msgstr "Устройство записи:"
 
-#: engine_dialog.cc:551
+#: engine_dialog.cc:575
 msgid "Output Device:"
 msgstr "Устройство вывода:"
 
-#: engine_dialog.cc:558
+#: engine_dialog.cc:582
 msgid "Device:"
 msgstr "Устройство:"
 
-#: engine_dialog.cc:567 engine_dialog.cc:681 sfdb_ui.cc:153 sfdb_ui.cc:348
-#: sfdb_ui.cc:353
+#: engine_dialog.cc:591 engine_dialog.cc:699 export_report.cc:164
+#: export_report.cc:328 sfdb_ui.cc:153 sfdb_ui.cc:348 sfdb_ui.cc:353
 msgid "Sample rate:"
 msgstr "Частота сэмплирования:"
 
-#: engine_dialog.cc:573 engine_dialog.cc:688
+#: engine_dialog.cc:597 engine_dialog.cc:706
 msgid "Buffer size:"
 msgstr "Размер буфера:"
 
-#: engine_dialog.cc:582
+#: engine_dialog.cc:606
 msgid "Periods:"
 msgstr "Периодов:"
 
-#: engine_dialog.cc:600
+#: engine_dialog.cc:624
 msgid "Input Channels:"
 msgstr "Каналов входа:"
 
-#: engine_dialog.cc:613
+#: engine_dialog.cc:637
 msgid "Output Channels:"
 msgstr "Каналов выхода:"
 
-#: engine_dialog.cc:625
+#: engine_dialog.cc:649
 msgid "Hardware input latency:"
 msgstr "Задержка аппаратных входов:"
 
-#: engine_dialog.cc:628 engine_dialog.cc:641
+#: engine_dialog.cc:652 engine_dialog.cc:665
 msgid "samples"
 msgstr "сэмплов"
 
-#: engine_dialog.cc:638
+#: engine_dialog.cc:662
 msgid "Hardware output latency:"
 msgstr "Задержка аппаратных выходов:"
 
-#: engine_dialog.cc:649
+#: engine_dialog.cc:673
 msgid "MIDI System:"
 msgstr "Подсистема MIDI:"
 
-#: engine_dialog.cc:673
+#: engine_dialog.cc:691
 msgid ""
 "%1 is already running. %2 will connect to it and use the existing settings."
 msgstr ""
+"%1 уже запущен. %2 будет подключен к нему, используя существующие настройки."
 
-#: engine_dialog.cc:726
+#: engine_dialog.cc:744
 msgid ""
 "Failed to start or connect to audio-engine.\n"
 "\n"
@@ -6495,7 +6892,7 @@ msgstr ""
 "\n"
 "Калибровка задержки требует рабочий аудиоинтерфейс."
 
-#: engine_dialog.cc:732
+#: engine_dialog.cc:750
 msgid ""
 "Your selected audio configuration is playback- or capture-only.\n"
 "\n"
@@ -6505,156 +6902,163 @@ msgstr ""
 "\n"
 "Калибровка задержки требует воспроизведение и захват"
 
-#: engine_dialog.cc:938
+#: engine_dialog.cc:965
 msgid "MIDI Devices"
 msgstr "MIDI устройства"
 
-#: engine_dialog.cc:944
+#: engine_dialog.cc:971
 msgid "Device"
 msgstr "Устройство"
 
-#: engine_dialog.cc:946
+#: engine_dialog.cc:973
 msgid "Hardware Latencies"
 msgstr "Аппаратные задержки"
 
-#: engine_dialog.cc:987
+#: engine_dialog.cc:1014
 msgid "Calibrate"
 msgstr "Калибровка"
 
-#: engine_dialog.cc:1090
+#: engine_dialog.cc:1117
 msgid "all available channels"
 msgstr "Все доступные каналы"
 
-#: engine_dialog.cc:1576 latency_gui.cc:39
-msgid "sample"
-msgid_plural "samples"
-msgstr[0] "сэмпл"
-msgstr[1] "сэмпла"
-msgstr[2] "сэмплов"
+#: engine_dialog.cc:1599 latency_gui.cc:55
+msgid "%1 sample"
+msgid_plural "%1 samples"
+msgstr[0] "%1 сэмпл"
+msgstr[1] "%1 сэмпла"
+msgstr[2] "%1 сэмплов"
 
-#: engine_dialog.cc:1640
+#: engine_dialog.cc:1662
 #, c-format
 msgid "(%.1f ms)"
 msgstr "(%.1f мс)"
 
-#: engine_dialog.cc:2371
+#: engine_dialog.cc:2413
 msgid "Could not start backend engine %1"
 msgstr "Не удалось запустить движок бекенда %1"
 
-#: engine_dialog.cc:2403
+#: engine_dialog.cc:2445
 msgid "Cannot set driver to %1"
 msgstr "Невозможно использовать %1 в качестве драйвера."
 
-#: engine_dialog.cc:2408
+#: engine_dialog.cc:2450
 msgid "Cannot set input device name to %1"
 msgstr ""
 
-#: engine_dialog.cc:2412
+#: engine_dialog.cc:2454
 msgid "Cannot set output device name to %1"
 msgstr ""
 
-#: engine_dialog.cc:2417
+#: engine_dialog.cc:2459
 msgid "Cannot set device name to %1"
 msgstr "Невозможно %1 в имени устройства."
 
-#: engine_dialog.cc:2422
+#: engine_dialog.cc:2464
 msgid "Cannot set sample rate to %1"
 msgstr "Невозможно использовать %1 в частоты сэмплирования."
 
-#: engine_dialog.cc:2426
+#: engine_dialog.cc:2468
 msgid "Cannot set buffer size to %1"
 msgstr "Невозможно использовать %1 в размера буфера."
 
-#: engine_dialog.cc:2430
+#: engine_dialog.cc:2472
 msgid "Cannot set periods to %1"
 msgstr ""
 
-#: engine_dialog.cc:2436
+#: engine_dialog.cc:2478
 msgid "Cannot set input channels to %1"
 msgstr "Не удается установить входные каналы в %1"
 
-#: engine_dialog.cc:2440
+#: engine_dialog.cc:2482
 msgid "Cannot set output channels to %1"
 msgstr "Не удается установить выходные каналы в %1"
 
-#: engine_dialog.cc:2446
+#: engine_dialog.cc:2488
 msgid "Cannot set input latency to %1"
 msgstr "Не удается установить задержку входа в %1"
 
-#: engine_dialog.cc:2450
+#: engine_dialog.cc:2492
 msgid "Cannot set output latency to %1"
 msgstr "Не удается установить задержку выхода в %1"
 
-#: engine_dialog.cc:2781 engine_dialog.cc:2840
+#: engine_dialog.cc:2851 engine_dialog.cc:2917
 msgid "No signal detected "
 msgstr "Сигнал не обнаружен"
 
-#: engine_dialog.cc:2794 engine_dialog.cc:2848 port_insert_ui.cc:70
+#: engine_dialog.cc:2858
+msgid ""
+"Input signal is > -3dBFS. Lower the signal level (output gain, input gain) "
+"on the audio-interface."
+msgstr ""
+
+#: engine_dialog.cc:2871 engine_dialog.cc:2925 port_insert_ui.cc:70
 #: port_insert_ui.cc:98
 msgid "Disconnected from audio engine"
 msgstr "Выполнено отсоединение от звукового движка"
 
-#: engine_dialog.cc:2803 engine_dialog.cc:2856
+#: engine_dialog.cc:2880 engine_dialog.cc:2933
 msgid "Detected roundtrip latency: "
 msgstr "Определены следующие задержки:"
 
-#: engine_dialog.cc:2805 engine_dialog.cc:2858
+#: engine_dialog.cc:2882 engine_dialog.cc:2935
 msgid "Systemic latency: "
 msgstr "Системная задержка:"
 
-#: engine_dialog.cc:2812
+#: engine_dialog.cc:2889
 msgid "(signal detection error)"
 msgstr "(ошибка обнаружения сигнала)"
 
-#: engine_dialog.cc:2818
+#: engine_dialog.cc:2895
 msgid "(inverted - bad wiring)"
 msgstr "(инвертировано - плохая проводка)"
 
-#: engine_dialog.cc:2865
+#: engine_dialog.cc:2942
 msgid "(averaging)"
 msgstr "(усреднение)"
 
-#: engine_dialog.cc:2871
+#: engine_dialog.cc:2948
 msgid "(too large jitter)"
 msgstr "(слишком большое дрожание)"
 
-#: engine_dialog.cc:2875
+#: engine_dialog.cc:2952
 msgid "(large jitter)"
 msgstr "(большое дрожание)"
 
-#: engine_dialog.cc:2887
+#: engine_dialog.cc:2964
 msgid "Timeout - large MIDI jitter."
 msgstr "Тайм-аут - большой MIDI джиттер."
 
-#: engine_dialog.cc:2903 port_insert_ui.cc:134
+#: engine_dialog.cc:2980 port_insert_ui.cc:134
 msgid "Detecting ..."
 msgstr "Выполняется определение..."
 
-#: engine_dialog.cc:3004
+#: engine_dialog.cc:3081
 msgid "Disconnect from %1"
 msgstr "Отсоединить от %1"
 
-#: engine_dialog.cc:3009
+#: engine_dialog.cc:3086
 msgid "Running"
-msgstr ""
+msgstr "Работает"
 
-#: engine_dialog.cc:3011
+#: engine_dialog.cc:3088
 msgid "Connected"
-msgstr ""
+msgstr "Соединено"
 
-#: engine_dialog.cc:3022
+#: engine_dialog.cc:3099
 msgid "Connect to %1"
 msgstr "Соединить с %1"
 
-#: engine_dialog.cc:3026 shuttle_control.cc:614
+#: engine_dialog.cc:3103 shuttle_control.cc:663
 msgid "Stopped"
 msgstr "Остановлено"
 
-#: export_channel_selector.cc:51 sfdb_ui.cc:151
+#: export_channel_selector.cc:46 export_report.cc:159 export_report.cc:324
+#: sfdb_ui.cc:151
 msgid "Channels:"
 msgstr "Каналов:"
 
-#: export_channel_selector.cc:52
+#: export_channel_selector.cc:47
 msgid "Split to mono files"
 msgstr "Разделить на монофонические файлы"
 
@@ -6662,39 +7066,39 @@ msgstr "Разделить на монофонические файлы"
 msgid "Bus or Track"
 msgstr "Шина или дорожка"
 
-#: export_channel_selector.cc:473
+#: export_channel_selector.cc:474
 msgid "Region contents without fades nor region gain (channels: %1)"
 msgstr "Содержание области без фейдов и усиления области (каналов: %1)"
 
-#: export_channel_selector.cc:477
+#: export_channel_selector.cc:478
 msgid "Region contents with fades and region gain (channels: %1)"
 msgstr "Содержание области с фейдами и усилением области (каналов: %1)"
 
-#: export_channel_selector.cc:481
+#: export_channel_selector.cc:482
 msgid "Track output (channels: %1)"
 msgstr "Выход дорожки (каналов: %1)"
 
-#: export_channel_selector.cc:550
+#: export_channel_selector.cc:552
 msgid "Apply track/bus processing"
 msgstr "Применить обработку в дорожках и шинах"
 
-#: export_channel_selector.cc:551
+#: export_channel_selector.cc:553
 msgid "Select all tracks"
 msgstr "Выбрать все дорожки"
 
-#: export_channel_selector.cc:552
+#: export_channel_selector.cc:554
 msgid "Select all busses"
 msgstr "Выбрать все шины"
 
-#: export_channel_selector.cc:553
+#: export_channel_selector.cc:555
 msgid "Deselect all"
 msgstr "Снять выделение"
 
-#: export_channel_selector.cc:587
+#: export_channel_selector.cc:589
 msgid "Track name"
 msgstr "Название дорожки"
 
-#: export_dialog.cc:46
+#: export_dialog.cc:49
 msgid ""
 "<span color=\"#ffa755\">Some already existing files will be overwritten.</"
 "span>"
@@ -6702,24 +7106,24 @@ msgstr ""
 "<span color=\"#ffa755\">Некоторые уже существующие файлы будут перезаписаны."
 "</span>"
 
-#: export_dialog.cc:47
+#: export_dialog.cc:50
 msgid "List files"
 msgstr "Список файлов"
 
-#: export_dialog.cc:156 export_format_dialog.cc:59
+#: export_dialog.cc:163 export_format_dialog.cc:67
 msgid "File format"
 msgstr "Формат"
 
-#: export_dialog.cc:157 export_timespan_selector.cc:371
-#: export_timespan_selector.cc:433
+#: export_dialog.cc:164 export_timespan_selector.cc:411
+#: export_timespan_selector.cc:502
 msgid "Time Span"
 msgstr "Отрезок времени"
 
-#: export_dialog.cc:158
+#: export_dialog.cc:165
 msgid "Channels"
 msgstr "Каналы"
 
-#: export_dialog.cc:180
+#: export_dialog.cc:187
 msgid ""
 "Export has been aborted due to an error!\n"
 "See the Log for details."
@@ -6727,39 +7131,56 @@ msgstr ""
 "Экспорт был прерван из-за ошибки!\n"
 "См. вывод для деталей."
 
-#: export_dialog.cc:249
+#: export_dialog.cc:298
 msgid "Files that will be overwritten"
 msgstr "Файлы будут перезаписаны"
 
-#: export_dialog.cc:294
+#: export_dialog.cc:343
 msgid "Export initialization failed: %1"
 msgstr "Сбой инициализации экспорта: %1"
 
-#: export_dialog.cc:304
+#: export_dialog.cc:353
 msgid "Stop Export"
 msgstr "Остановить экспорт"
 
-#: export_dialog.cc:325
+#: export_dialog.cc:383
 msgid "export"
 msgstr "Экспорт"
 
-#: export_dialog.cc:344
+#: export_dialog.cc:402
+msgid "Exporting '%3' (timespan %1 of %2)"
+msgstr "Экспортируется '%3' (отрезок времени %1 из %2)"
+
+#: export_dialog.cc:407
 msgid "Normalizing '%3' (timespan %1 of %2)"
 msgstr "Выполняется нормировка '%3' (временной отрезок %1 из %2)"
 
-#: export_dialog.cc:348
-msgid "Exporting '%3' (timespan %1 of %2)"
+#: export_dialog.cc:412
+#, fuzzy
+msgid "Encoding '%3' (timespan %1 of %2)"
 msgstr "Экспортируется '%3' (отрезок времени %1 из %2)"
 
-#: export_dialog.cc:371 export_dialog.cc:373
+#: export_dialog.cc:417
+msgid "Tagging '%3' (timespan %1 of %2)"
+msgstr ""
+
+#: export_dialog.cc:421
+msgid "Uploading '%3' (timespan %1 of %2)"
+msgstr ""
+
+#: export_dialog.cc:425
+msgid "Running Post Export Command for '%1'"
+msgstr ""
+
+#: export_dialog.cc:453 export_dialog.cc:455
 msgid "<span color=\"#ffa755\">Error: "
 msgstr "<span color=\"#ffa755\">Ошибка: "
 
-#: export_dialog.cc:383
+#: export_dialog.cc:465
 msgid "<span color=\"#ffa755\">Warning: "
 msgstr "<span color=\"#ffa755\">Предупреждение: "
 
-#: export_dialog.cc:385
+#: export_dialog.cc:467
 msgid ""
 "\n"
 "<span color=\"#ffa755\">Warning: "
@@ -6767,19 +7188,19 @@ msgstr ""
 "\n"
 "<span color=\"#ffa755\">Предупреждение: "
 
-#: export_dialog.cc:409
+#: export_dialog.cc:491
 msgid "Export Selection"
 msgstr "Экспортировать выделение"
 
-#: export_dialog.cc:423
+#: export_dialog.cc:505
 msgid "Export Region"
 msgstr "Экспортировать область"
 
-#: export_dialog.cc:432
+#: export_dialog.cc:514
 msgid "Source"
 msgstr "Источник"
 
-#: export_dialog.cc:448
+#: export_dialog.cc:530
 msgid "Stem Export"
 msgstr "Экспортировать каждую дорожку в свой файл"
 
@@ -6787,177 +7208,271 @@ msgstr "Экспортировать каждую дорожку в свой ф
 msgid "Add another format"
 msgstr "Добавить другой формат"
 
-#: export_file_notebook.cc:193
+#: export_file_notebook.cc:198
 msgid "Format"
 msgstr "Формат"
 
-#: export_file_notebook.cc:194
+#: export_file_notebook.cc:199
 msgid "Location"
 msgstr "Расположение"
 
-#: export_file_notebook.cc:195
+#: export_file_notebook.cc:200
 msgid "Upload to Soundcloud"
-msgstr "Загрузка на Soundcloud"
+msgstr "Загрузить на Soundcloud"
 
-#: export_file_notebook.cc:273
+#: export_file_notebook.cc:201
+msgid "Analyze Exported Audio"
+msgstr "Проанализировать экспортированные данные"
+
+#: export_file_notebook.cc:286
 msgid "No format!"
 msgstr "Формат не выбран!"
 
-#: export_file_notebook.cc:291
+#: export_file_notebook.cc:304
 msgid "Format %1: %2"
 msgstr "Формат %1: %2"
 
-#: export_filename_selector.cc:32
+#: export_filename_selector.cc:33
 msgid "Label:"
 msgstr "Метка:"
 
-#: export_filename_selector.cc:33 session_dialog.cc:310
+#: export_filename_selector.cc:34 session_dialog.cc:310
 msgid "Session Name"
 msgstr "Название сессии"
 
-#: export_filename_selector.cc:34
+#: export_filename_selector.cc:35
+msgid "Timespan Name"
+msgstr "Отрезок времени"
+
+#: export_filename_selector.cc:36
 msgid "Revision:"
 msgstr "Редакция:"
 
-#: export_filename_selector.cc:36
+#: export_filename_selector.cc:38
 msgid "Folder:"
 msgstr "Папка:"
 
-#: export_filename_selector.cc:37 session_import_dialog.cc:45
+#: export_filename_selector.cc:39 session_import_dialog.cc:45
 #: transcode_video_dialog.cc:59 video_server_dialog.cc:54
 #: video_server_dialog.cc:56 export_video_dialog.cc:77
 #: export_video_dialog.cc:79
 msgid "Browse"
 msgstr "Указать"
 
-#: export_filename_selector.cc:41
-msgid "<i>Build filename(s) from these components:</i>"
-msgstr "<i>Сформировать имена файлов из следующих компонентов:</i>"
+#: export_filename_selector.cc:40 export_report.cc:118
+msgid "Open Folder"
+msgstr "Открыть папку"
+
+#: export_filename_selector.cc:45
+msgid "Build filename(s) from these components:"
+msgstr "Собрать имена файлов из следующих составных частей:"
 
-#: export_filename_selector.cc:208
+#: export_filename_selector.cc:217
 msgid ""
 "<small><i>Sorry, no example filename can be shown at the moment</i></small>"
 msgstr ""
 "<small><i>Извините, показать пример имени файла сейчас невозможно</i></small>"
 
-#: export_filename_selector.cc:210
-msgid "<small><i>Current (approximate) filename: \"%1\"</i></small>"
-msgstr "<small><i>Текущее предполагаемое имя файла: \"%1\"</i></small>"
+#: export_filename_selector.cc:219
+msgid "<i>Current (approximate) filename</i>: \"%1\""
+msgstr "<i>Текущее (приблизительное) имя файла</i>: \"%1\""
 
-#: export_filename_selector.cc:246 export_filename_selector.cc:332
+#: export_filename_selector.cc:255 export_filename_selector.cc:402
 msgid ""
 "%1: this is only the directory/folder name, not the filename.\n"
 "The filename will be chosen from the information just above the folder "
 "selector."
 msgstr ""
 "%1: это только имя каталога/папки, но не имя файла. \n"
-"Имя файла будет выбрано из информации чуть выше папки Селектор."
+"Имя файла будет выбрано из информации чуть выше выборщика папки."
 
-#: export_filename_selector.cc:318
+#: export_filename_selector.cc:378
+msgid "%1: this is not a valid directory/folder."
+msgstr "%1: некорректное имя папки или каталога"
+
+#: export_filename_selector.cc:388
 msgid "Choose export folder"
 msgstr "Выберите папку для экспорта данных"
 
-#: export_format_dialog.cc:31
+#: export_format_dialog.cc:32
 msgid "New Export Format Profile"
 msgstr "Создать профиль формата экспорта"
 
-#: export_format_dialog.cc:31
+#: export_format_dialog.cc:32
 msgid "Edit Export Format Profile"
 msgstr "Изменить профиль формата экспорта"
 
-#: export_format_dialog.cc:38
+#: export_format_dialog.cc:39
 msgid "Label: "
-msgstr "Название:"
+msgstr "Название: "
 
-#: export_format_dialog.cc:41 normalize_dialog.cc:42
-msgid "Normalize to:"
-msgstr "Нормировать до:"
+#: export_format_dialog.cc:42
+msgid "Normalize:"
+msgstr "Нормировка:"
+
+#: export_format_dialog.cc:43
+msgid "Peak"
+msgstr "Пиковое значение"
+
+#: export_format_dialog.cc:44
+msgid "Loudness"
+msgstr "Громкость"
+
+#: export_format_dialog.cc:50
+msgid "LUFS"
+msgstr "LUFS"
+
+#: export_format_dialog.cc:51
+msgid "dBTP"
+msgstr "dBTP"
 
-#: export_format_dialog.cc:46
+#: export_format_dialog.cc:54
 msgid "Trim silence at start"
 msgstr "Отрезать тишину в начале"
 
-#: export_format_dialog.cc:47
+#: export_format_dialog.cc:55
 msgid "Add silence at start:"
 msgstr "Добавить тишину в начало:"
 
-#: export_format_dialog.cc:50
+#: export_format_dialog.cc:58
 msgid "Trim silence at end"
 msgstr "Отрезать тишину в начале"
 
-#: export_format_dialog.cc:51
+#: export_format_dialog.cc:59
 msgid "Add silence at end:"
 msgstr "Добавить тишину в конец:"
 
-#: export_format_dialog.cc:54
+#: export_format_dialog.cc:62
+#, fuzzy
 msgid ""
 "Command to run post-export\n"
-"(%f=full path & filename, %d=directory, %b=basename):"
+"(%f=file path, %d=directory, %b=basename, see tooltip for more):"
 msgstr ""
 "Команда для запуска после экспорта\n"
 "(%f=полный путь и имя файла, %d=каталог, %b=базовое имя):"
 
-#: export_format_dialog.cc:57
+#: export_format_dialog.cc:65
 msgid "Compatibility"
 msgstr "Совместимость"
 
-#: export_format_dialog.cc:58
+#: export_format_dialog.cc:66
 msgid "Quality"
 msgstr "Качество"
 
-#: export_format_dialog.cc:61
+#: export_format_dialog.cc:69
 msgid "Sample rate conversion quality:"
 msgstr "Качество преобразования частоты сэмплирования:"
 
-#: export_format_dialog.cc:68
+#: export_format_dialog.cc:76
 msgid "Dithering"
 msgstr "Подмешивание шума"
 
-#: export_format_dialog.cc:70
+#: export_format_dialog.cc:78
 msgid "Create CUE file for disk-at-once CD/DVD creation"
 msgstr "Записать файл CUE для создания CD/DVD"
 
-#: export_format_dialog.cc:71
+#: export_format_dialog.cc:79
 msgid "Create TOC file for disk-at-once CD/DVD creation"
 msgstr "Записать файл TOC для создания CD/DVD"
 
-#: export_format_dialog.cc:72
+#: export_format_dialog.cc:80
 msgid "Create chapter mark file for MP4 chapter marks"
 msgstr ""
 
-#: export_format_dialog.cc:74
+#: export_format_dialog.cc:82
 msgid "Tag file with session's metadata"
 msgstr "Добавить в файла метаданные сессии"
 
-#: export_format_dialog.cc:474
+#: export_format_dialog.cc:119
+msgid "∧"
+msgstr "∧"
+
+#: export_format_dialog.cc:124
+msgid ""
+"Normalize to EBU-R128 LUFS target loudness without exceeding the given true-"
+"peak limit. EBU-R128 normalization is only available for mono and stereo "
+"targets, true-peak works for any channel layout."
+msgstr ""
+
+#: export_format_dialog.cc:152
+msgid ""
+"%a Artist name\n"
+"%b File's base-name\n"
+"%c Copyright\n"
+"%d File's directory\n"
+"%f File's full absolute path\n"
+"%l Lyricist\n"
+"%n Session name\n"
+"%o Conductor\n"
+"%t Title\n"
+"%z Organization\n"
+"%A Album\n"
+"%C Comment\n"
+"%E Engineer\n"
+"%G Genre\n"
+"%L Total track count\n"
+"%M Mixer\n"
+"%N Timespan name\n"
+"%O Composer\n"
+"%P Producer\n"
+"%S Disc subtitle\n"
+"%T Track number\n"
+"%Y Year\n"
+"%Z Country"
+msgstr ""
+"%a Имя исполнителя\n"
+"%b Базовое имя файла\n"
+"%c Авторские права\n"
+"%d Каталог файла\n"
+"%f Полный абсолютный путь к файлу\n"
+"%l Автор либретто/текста песни\n"
+"%n Имя сессии\n"
+"%o Дирижёр\n"
+"%t Название\n"
+"%z Организация\n"
+"%A Альбом\n"
+"%C Комментарий\n"
+"%E Инженер по звуку\n"
+"%G Жанр\n"
+"%L Общее число дорожек\n"
+"%M Mixer\n"
+"%N Timespan name\n"
+"%O Composer\n"
+"%P Producer\n"
+"%S Disc subtitle\n"
+"%T Track number\n"
+"%Y Year\n"
+"%Z Country"
+
+#: export_format_dialog.cc:537
 msgid "Best (sinc)"
 msgstr "Наилучшее (sinc)"
 
-#: export_format_dialog.cc:479
+#: export_format_dialog.cc:542
 msgid "Medium (sinc)"
 msgstr "Среднее (sinc)"
 
-#: export_format_dialog.cc:484
+#: export_format_dialog.cc:547
 msgid "Fast (sinc)"
 msgstr "Быстро (sinc)"
 
-#: export_format_dialog.cc:494
+#: export_format_dialog.cc:557
 msgid "Zero order hold"
 msgstr "Нулевой порядок удержания"
 
-#: export_format_dialog.cc:904
+#: export_format_dialog.cc:981
 msgid "Linear encoding options"
 msgstr "Параметры линейного кодирования"
 
-#: export_format_dialog.cc:920
+#: export_format_dialog.cc:997
 msgid "Ogg Vorbis options"
 msgstr "Параметры Ogg Vorbis"
 
-#: export_format_dialog.cc:931
+#: export_format_dialog.cc:1008
 msgid "FLAC options"
 msgstr "Параметры FLAC"
 
-#: export_format_dialog.cc:948
+#: export_format_dialog.cc:1025
 msgid "Broadcast Wave options"
 msgstr "Параметры Broadcast Wave"
 
@@ -6981,19 +7496,200 @@ msgstr ""
 msgid "Do you really want to remove this preset?"
 msgstr "Вы действительно хотите удалить этот профиль?"
 
-#: export_timespan_selector.cc:44
+#: export_report.cc:56
+msgid "Export Report/Analysis"
+msgstr "Анализ экспортированных файлов"
+
+#: export_report.cc:147 export_report.cc:327 sfdb_ui.cc:149
+msgid "Format:"
+msgstr "Формат:"
+
+#: export_report.cc:166 export_report.cc:328
+msgid "%1 Hz"
+msgstr "%1 Гц"
+
+#: export_report.cc:169 export_report.cc:336 transcode_video_dialog.cc:139
+msgid "Duration:"
+msgstr "Длительность:"
+
+#: export_report.cc:177 export_report.cc:334
+msgid "Timecode:"
+msgstr "Тайм-код:"
+
+#: export_report.cc:185
+msgid "Error:"
+msgstr "Ошибка:"
+
+#: export_report.cc:220 export_report.cc:440
+msgid "(too short integration time)"
+msgstr ""
+
+#: export_report.cc:222
+msgid "-888"
+msgstr ""
+
+#: export_report.cc:227 export_report.cc:353
+msgid "Peak:"
+msgstr "Пик по сэмплам:"
+
+#: export_report.cc:228 export_report.cc:360
+msgid "%1 dBFS"
+msgstr "%1 dBFS"
+
+#: export_report.cc:229 export_report.cc:369
+msgid "True Peak:"
+msgstr "Пик между сэмплами:"
+
+#: export_report.cc:230 export_report.cc:376
+msgid "%1 dBTP"
+msgstr "%1 dBTP"
+
+#: export_report.cc:231 export_report.cc:387
+msgid "Normalization Gain:"
+msgstr "Усиление при нормировке:"
+
+#: export_report.cc:232
+msgid "+888.88 dB"
+msgstr "+888.88 Дб"
+
+#: export_report.cc:234 export_report.cc:448
+msgid "Integrated Loudness:"
+msgstr "Средняя громкость:"
+
+#: export_report.cc:235 export_report.cc:454
+msgid "%1 LUFS"
+msgstr "%1 LUFS"
+
+#: export_report.cc:236 export_report.cc:460
+msgid "Loudness Range:"
+msgstr "Диапазон громкости:"
+
+#: export_report.cc:237 export_report.cc:466
+msgid "%1 LU"
+msgstr "%1 LU"
+
+#: export_report.cc:247 export_report.cc:754
+msgid "100"
+msgstr "100"
+
+#: export_report.cc:282 export_report.cc:650
+msgid "00:00:00.000"
+msgstr "00:00:00.000"
+
+#: export_report.cc:288
+msgid "0|A8"
+msgstr ""
+
+#: export_report.cc:394
+msgid "%1 dB"
+msgstr "%1 Дб"
+
+#: export_report.cc:425 export_report.cc:433 export_report.cc:553
+msgid ""
+"Not\n"
+"Available"
+msgstr ""
+
+#: export_report.cc:493
+msgid ""
+"LUFS\n"
+"(short)"
+msgstr ""
+
+#: export_report.cc:503
+msgid "Multiplicity"
+msgstr ""
+
+#: export_report.cc:603
+msgid "Logscale|Lg"
+msgstr "Лг"
+
+#: export_report.cc:604
+msgid "Rectified|Rf"
+msgstr ""
+
+#: export_report.cc:605
+msgid "Logscale"
+msgstr ""
+
+#: export_report.cc:606
+msgid "Rectified"
+msgstr ""
+
+#: export_report.cc:738
+msgid "Hz"
+msgstr "Гц"
+
+#: export_report.cc:755
+msgid "500"
+msgstr "500"
+
+#: export_report.cc:756
+msgid "1K"
+msgstr "1К"
+
+#: export_report.cc:757
+msgid "5K"
+msgstr "5К"
+
+#: export_report.cc:758
+msgid "10K"
+msgstr "10К"
+
+#: export_report.cc:844
+msgid "Writing Export Analysis Image: %1."
+msgstr "Записывается изображение анализа: %1."
+
+#: export_report.cc:941 sfdb_ui.cc:293 sfdb_ui.cc:409
+msgid "Could not read file: %1 (%2)."
+msgstr "Не удалось прочитать файл: %1 (%2)"
+
+#: export_report.cc:967 sfdb_ui.cc:458
+msgid "Could not access soundfile: "
+msgstr "Файл недоступен: "
+
+#: export_report.cc:1203
+msgid "-36"
+msgstr "-36"
+
+#: export_report.cc:1204 export_report.cc:1208 export_report.cc:1214
+#: export_report.cc:1217
+msgid "-18"
+msgstr "-18"
+
+#: export_report.cc:1205 export_report.cc:1209 export_report.cc:1215
+#: export_report.cc:1218 export_report.cc:1221 export_report.cc:1222
+msgid "-9"
+msgstr "-9"
+
+#: export_report.cc:1206 export_report.cc:1210 export_report.cc:1216
+#: export_report.cc:1219 export_report.cc:1223 export_report.cc:1224
+msgid "-3"
+msgstr "-3"
+
+#: export_timespan_selector.cc:45
 msgid "Show Times as:"
 msgstr "Показать время как:"
 
-#: export_timespan_selector.cc:51 processor_box.cc:2839
+#: export_timespan_selector.cc:46
+#, fuzzy
+msgid "Realtime Export"
+msgstr "Экспортировать каждую дорожку в свой файл"
+
+#: export_timespan_selector.cc:54 processor_box.cc:3695
 msgid "Select All"
 msgstr "Выделить всё"
 
-#: export_timespan_selector.cc:220 transform_dialog.cc:93
+#: export_timespan_selector.cc:255 transform_dialog.cc:93
 msgid " to "
 msgstr " до "
 
-#: export_timespan_selector.cc:364 export_timespan_selector.cc:423
+#: export_timespan_selector.cc:399 export_timespan_selector.cc:488
+#, fuzzy
+msgid "RT"
+msgstr "К"
+
+#: export_timespan_selector.cc:400 export_timespan_selector.cc:489
 msgid "Range"
 msgstr "Диапазон"
 
@@ -7009,87 +7705,92 @@ msgstr "getSoundResourceFile: Нет правильного корня в фай
 msgid "getSoundResourceFile: root = %1, != response"
 msgstr "getSoundResourceFile: корень = %1, != ответ"
 
-#: sfdb_freesound_mootcher.cc:410 rc_option_editor.cc:2276
+#: sfdb_freesound_mootcher.cc:410 rc_option_editor.cc:2416
 msgid "%1"
 msgstr "%1"
 
-#: gain_meter.cc:134 gain_meter.cc:402 gain_meter.cc:507 gain_meter.cc:898
+#: gain_meter.cc:137 gain_meter.cc:422 gain_meter.cc:527 gain_meter.cc:919
 msgid "-inf"
 msgstr "-inf"
 
-#: gain_meter.cc:149 gain_meter.cc:962
+#: gain_meter.cc:152 gain_meter.cc:983
 msgid "Fader automation mode"
 msgstr "Режим автоматизации фейдера"
 
-#: gain_meter.cc:150 gain_meter.cc:963
+#: gain_meter.cc:153 gain_meter.cc:984
 msgid "Fader automation type"
 msgstr "Тип автоматизации фейдера"
 
-#: gain_meter.cc:159 gain_meter.cc:831 panner_ui.cc:179 panner_ui.cc:641
+#: gain_meter.cc:162 gain_meter.cc:852 panner_ui.cc:179 panner_ui.cc:641
 msgid "Abs"
 msgstr "Абс"
 
-#: gain_meter.cc:795
+#: gain_meter.cc:816 vca_master_strip.cc:78 vca_time_axis.cc:54
 msgid "M"
 msgstr "М"
 
-#: gain_meter.cc:798
+#: gain_meter.cc:819 vca_master_strip.cc:296
 msgid "P"
 msgstr "Сп"
 
-#: gain_meter.cc:801
+#: gain_meter.cc:822
 msgid "T"
 msgstr "К"
 
-#: gain_meter.cc:804
+#: gain_meter.cc:825
 msgid "W"
 msgstr "З"
 
-#: generic_pluginui.cc:85
+#: generic_pluginui.cc:83
 msgid "<span size=\"large\">Presets</span>"
 msgstr "<span size=\"large\">Профили</span>"
 
-#: generic_pluginui.cc:100
+#: generic_pluginui.cc:99 plugin_pin_dialog.cc:333
 msgid "Manual"
 msgstr "Вручную"
 
-#: generic_pluginui.cc:109
+#: generic_pluginui.cc:108
 msgid "All Automation"
 msgstr "Вся автоматизация"
 
-#: generic_pluginui.cc:253
-msgid "Switches"
-msgstr "Переключатели"
-
-#: generic_pluginui.cc:263 generic_pluginui.cc:439 processor_box.cc:2817
-msgid "Controls"
-msgstr "Управление"
-
-#: generic_pluginui.cc:296
+#: generic_pluginui.cc:259
 msgid "Plugin Editor: could not build control element for port %1"
 msgstr "Редактор плагинов: невозможно создать управляющий элемент для порта %1"
 
-#: generic_pluginui.cc:321
+#: generic_pluginui.cc:290
 msgid "Plugin Editor: no control for property %1"
 msgstr "Редактор плагинов: нет регулятора для свойства %1"
 
-#: generic_pluginui.cc:327
+#: generic_pluginui.cc:296
 msgid "Plugin Editor: could not build control element for property %1"
 msgstr ""
 "Редаткор плагина: не удалось создать контрольный элемент для свойства %1"
 
-#: generic_pluginui.cc:471
+#: generic_pluginui.cc:370
+msgid "Switches"
+msgstr "Переключатели"
+
+#: generic_pluginui.cc:380 generic_pluginui.cc:486 processor_box.cc:3665
+msgid "Controls"
+msgstr "Управление"
+
+#: generic_pluginui.cc:521
 msgid "Meters"
 msgstr "Индикаторы уровня"
 
-#: generic_pluginui.cc:493
+#: generic_pluginui.cc:559
 msgid "Automation control"
 msgstr "Контроль автоматизации"
 
-#: generic_pluginui.cc:500
+#: generic_pluginui.cc:566
 msgid "Mgnual"
 msgstr "Mgnual"
 
+#: generic_pluginui.cc:831
+#, fuzzy
+msgid "This control cannot be automated"
+msgstr "Этот порт не может быть удалён."
+
 #: global_port_matrix.cc:158
 msgid "Audio Connection Manager"
 msgstr "Управление звуковыми соединениями"
@@ -7098,8 +7799,9 @@ msgstr "Управление звуковыми соединениями"
 msgid "MIDI Connection Manager"
 msgstr "Управление MIDI-соединениями"
 
-#: global_port_matrix.cc:201 io_selector.cc:211 mixer_strip.cc:840
-#: mixer_strip.cc:941 monitor_section.cc:1341 monitor_selector.cc:189
+#: global_port_matrix.cc:201 io_selector.cc:211 mixer_strip.cc:870
+#: mixer_strip.cc:973 monitor_section.cc:1430 monitor_selector.cc:189
+#: plugin_pin_dialog.cc:1757
 msgid "Disconnect"
 msgstr "Отсоединить"
 
@@ -7107,59 +7809,83 @@ msgstr "Отсоединить"
 msgid "port"
 msgstr "порт"
 
-#: group_tabs.cc:312
+#: group_tabs.cc:312 group_tabs.cc:321
 msgid "Selection..."
 msgstr "Выделения..."
 
-#: group_tabs.cc:313
+#: group_tabs.cc:313 group_tabs.cc:322
 msgid "Record Enabled..."
 msgstr "Готовых к записи..."
 
-#: group_tabs.cc:314
+#: group_tabs.cc:314 group_tabs.cc:323
 msgid "Soloed..."
 msgstr "Солирующих..."
 
-#: group_tabs.cc:321
+#: group_tabs.cc:316
+msgid "Create New Group From..."
+msgstr "Создать группу из..."
+
+#: group_tabs.cc:325
+msgid "Create New Group with Master From..."
+msgstr "Создать группу с ведущим каналом из..."
+
+#: group_tabs.cc:344
 msgid "Create New Group ..."
 msgstr "Создать группу..."
 
-#: group_tabs.cc:324
-msgid "Create New Group From"
-msgstr "Создать группу из"
+#: group_tabs.cc:345
+msgid "Create New Group with Control Master ..."
+msgstr "Создать группу с ведущим каналом из..."
 
-#: group_tabs.cc:327
+#: group_tabs.cc:355
 msgid "Edit Group..."
 msgstr "Изменить группу..."
 
-#: group_tabs.cc:328
+#: group_tabs.cc:356
 msgid "Collect Group"
 msgstr "Собрать группу"
 
-#: group_tabs.cc:329
+#: group_tabs.cc:357
 msgid "Remove Group"
 msgstr "Удалить группу"
 
-#: group_tabs.cc:332
+#: group_tabs.cc:368
+msgid "Assign Group to Control Master..."
+msgstr "Назначить группу ведущему каналу..."
+
+#: group_tabs.cc:374
 msgid "Remove Subgroup Bus"
 msgstr "Удалить шину подгруппы"
 
-#: group_tabs.cc:334
+#: group_tabs.cc:376
 msgid "Add New Subgroup Bus"
 msgstr "Добавить новую шину подгруппы"
 
-#: group_tabs.cc:336
+#: group_tabs.cc:378
 msgid "Add New Aux Bus (pre-fader)"
 msgstr "Добавить новую внешнюю шину (до фейдера)"
 
-#: group_tabs.cc:337
+#: group_tabs.cc:379
 msgid "Add New Aux Bus (post-fader)"
 msgstr "Добавить новую внешнюю шину (после фейдера)"
 
-#: group_tabs.cc:343
+#: group_tabs.cc:404
+msgid "Assign Selection to Control Master..."
+msgstr "Назначить выделение ведущему каналу..."
+
+#: group_tabs.cc:415
+msgid "Assign Record Enabled to Control Master..."
+msgstr "Назначить готовые к записи ведущему каналу..."
+
+#: group_tabs.cc:426
+msgid "Assign Soloed to Control Master..."
+msgstr "Назначить солирующие ведущему каналу..."
+
+#: group_tabs.cc:429
 msgid "Enable All Groups"
 msgstr "Включить все группы"
 
-#: group_tabs.cc:344
+#: group_tabs.cc:430
 msgid "Disable All Groups"
 msgstr "Отключить все группы"
 
@@ -7223,11 +7949,15 @@ msgstr ""
 msgid "Insert time"
 msgstr "Вставить"
 
-#: instrument_selector.cc:62
+#: insert_remove_time_dialog.cc:174
+msgid "Invalid or zero duration entered. Please enter a valid duration"
+msgstr ""
+
+#: instrument_selector.cc:92
 msgid "-none-"
 msgstr "-нет-"
 
-#: interthread_progress_window.cc:104
+#: interthread_progress_window.cc:114
 msgid "Importing file: %1 of %2"
 msgstr "Импортируется  файл: %1 из %2"
 
@@ -7243,58 +7973,87 @@ msgstr "%1 вход"
 msgid "%1 output"
 msgstr "%1 выход"
 
-#: keyboard.cc:82
+#: keyboard.cc:93
 msgid "your own"
 msgstr "Ваш собс."
 
-#: keyboard.cc:145 keyboard.cc:169
+#: keyboard.cc:157 keyboard.cc:181
 msgid "Default keybindings not found - %1 will be hard to use!"
 msgstr ""
 "Конфигурация комбинаций клавиш недоступна - работать с %1 будет непросто!"
 
-#: keyboard.cc:148
+#: keyboard.cc:160
 msgid "Key bindings file \"%1\" not found. Default bindings used instead"
 msgstr "Файл привязки клавиш \"%1\" не найден. Исп. привязки по умолчанию"
 
-#: keyeditor.cc:54
+#: keyboard.cc:193
+msgid "Loading keybindings from %1"
+msgstr "Загрузка комбинаций клавиш из %1"
+
+#: keyeditor.cc:67
+msgid "Colliding keybindings"
+msgstr "Конфликт клавиатурных комбинаций"
+
+#: keyeditor.cc:68
+msgid ""
+"The key sequence is already bound. Please remove the other binding first."
+msgstr ""
+"Это сочетание клавиш уже используется. Сначала удалите существующую "
+"комбинацию."
+
+#: keyeditor.cc:77
+msgid "Key Bindings"
+msgstr "Клавиатурные комбинации"
+
+#: keyeditor.cc:78
 msgid "Remove shortcut"
 msgstr "Удалить комбинацию"
 
-#: keyeditor.cc:63
-msgid "Action"
-msgstr "Действие"
+#: keyeditor.cc:80
+msgid "Search..."
+msgstr "Искать..."
 
-#: keyeditor.cc:64
-msgid "Shortcut"
-msgstr "Комбинация клавиш"
+#: keyeditor.cc:82
+msgid "Print"
+msgstr ""
+
+#: keyeditor.cc:93
+msgid "Click to reset search string"
+msgstr "Нажмите для сброса строки поиска"
 
-#: keyeditor.cc:84
-msgid "Select an action, then press the key(s) to (re)set its shortcut"
-msgstr "Выберите действие и нажмите комбинацию клавиш для него"
+#: keyeditor.cc:97
+msgid "To remove a shortcut select an action then press this: "
+msgstr ""
 
-#: keyeditor.cc:98
+#: keyeditor.cc:109
 msgid "Reset Bindings to Defaults"
 msgstr "Вернуть исходные клавиатурные комбинации"
 
-#: keyeditor.cc:263
-msgid "Main_menu"
-msgstr "Главное меню"
-
-#: keyeditor.cc:265
-msgid "redirectmenu"
-msgstr "Меню перенаправления"
+#: keyeditor.cc:227 lua_script_manager.cc:41
+msgid "Action"
+msgstr "Действие"
 
-#: keyeditor.cc:267
-msgid "Editor_menus"
-msgstr "Редактор меню"
+#: keyeditor.cc:228
+msgid "Shortcut"
+msgstr "Комбинация клавиш"
 
-#: keyeditor.cc:269
+#: keyeditor.cc:370
 msgid "RegionList"
 msgstr "Список областей"
 
-#: keyeditor.cc:271
-msgid "ProcessorMenu"
-msgstr "Меню обработчика"
+#: keyeditor.cc:543
+msgid "Could not open temporary file to print bindings (%1)"
+msgstr ""
+
+#: keyeditor.cc:561
+#, fuzzy
+msgid "Could not save bindings to file (%1)"
+msgstr "Не удалось запустить движок бекенда %1"
+
+#: latency_gui.cc:39
+#, fuzzy
+msgid "sample"
+msgstr "сэмпл"
 
 #: latency_gui.cc:40
 msgid "msec"
@@ -7304,38 +8063,35 @@ msgstr "мс"
 msgid "period"
 msgstr "Период"
 
-#: latency_gui.cc:55
-msgid "%1 sample"
-msgid_plural "%1 samples"
-msgstr[0] "%1 сэмпл"
-msgstr[1] "%1 сэмпла"
-msgstr[2] "%1 сэмплов"
-
-#: latency_gui.cc:72 panner_ui.cc:411 plugin_ui.cc:421
+#: latency_gui.cc:72 panner_ui.cc:411 plugin_pin_dialog.cc:109 plugin_ui.cc:422
 msgid "Reset"
 msgstr "Сбросить"
 
-#: latency_gui.cc:149 rhythm_ferret.cc:273 sfdb_ui.cc:1909
+#: latency_gui.cc:149 rhythm_ferret.cc:295 sfdb_ui.cc:1878
 msgid "programming error: %1 (%2)"
 msgstr "Ошибка в программе: %1 (%2)"
 
-#: location_ui.cc:54 location_ui.cc:56
+#: location_ui.cc:54 location_ui.cc:57
 msgid "Use PH"
 msgstr "По указателю"
 
-#: location_ui.cc:61
+#: location_ui.cc:55 location_ui.cc:58
+msgid "Goto"
+msgstr "Перейти"
+
+#: location_ui.cc:63
 msgid "Glue"
 msgstr "Приклеить"
 
-#: location_ui.cc:89
+#: location_ui.cc:88
 msgid "Performer:"
 msgstr "Исполнитель:"
 
-#: location_ui.cc:90
+#: location_ui.cc:89
 msgid "Composer:"
 msgstr "Композитор:"
 
-#: location_ui.cc:92
+#: location_ui.cc:91
 msgid "Pre-Emphasis"
 msgstr "Пред. акцент"
 
@@ -7371,43 +8127,153 @@ msgstr "Позиция - средний клик, чтобы разместит
 msgid "Set marker time from playhead location"
 msgstr "Установить маркер времени по месту воспроизведения"
 
-#: location_ui.cc:501
+#: location_ui.cc:524
 msgid "You cannot put a CD marker at the start of the session"
 msgstr "Размещение маркера CD в начале сессии невозможно"
 
-#: location_ui.cc:727
+#: location_ui.cc:750
 msgid "New Marker"
 msgstr "Создать маркер"
 
-#: location_ui.cc:728
+#: location_ui.cc:751
 msgid "New Range"
 msgstr "Создать диапазон"
 
-#: location_ui.cc:741
+#: location_ui.cc:764
 msgid "<b>Loop/Punch Ranges</b>"
 msgstr "<b>Диапазоны петель/врезок</b>"
 
-#: location_ui.cc:766
+#: location_ui.cc:790
 msgid "<b>Markers (Including CD Index)</b>"
 msgstr "<b>Маркеры (включая индекс CD)</b>"
 
-#: location_ui.cc:801
+#: location_ui.cc:825
 msgid "<b>Ranges (Including CD Track Ranges)</b>"
 msgstr "<b>Диапазоны (включая диапазоны дорожек CD)</b>"
 
-#: location_ui.cc:1044
+#: location_ui.cc:1068
 msgid "add range marker"
 msgstr "Добавка маркера выделения"
 
-#: main.cc:86
+#: lua_script_manager.cc:31
+msgid "Add/Set"
+msgstr "Добавить/Установить"
+
+#: lua_script_manager.cc:34
+msgid "Call"
+msgstr "Вызов"
+
+#: lua_script_manager.cc:35
+msgid "New Hook"
+msgstr ""
+
+#: lua_script_manager.cc:77
+msgid "Signal(s)"
+msgstr "Сигналы"
+
+#: lua_script_manager.cc:127
+msgid "Action %1"
+msgstr "Действие %1"
+
+#: lua_script_manager.cc:132 lua_script_manager.cc:227
+msgid "Unset"
+msgstr ""
+
+#: luainstance.cc:1096
+msgid "Cannot read script '%1': %2"
+msgstr "Не удалось прочитать скрипт '%1': %2"
+
+#: luawindow.cc:97
+msgid "Run"
+msgstr "Выполнить"
+
+#: luawindow.cc:98
+msgid "Clear Output"
+msgstr "Очистить вывод"
+
+#: luawindow.cc:102
+msgid "Revert"
+msgstr "Вернуть"
+
+#: luawindow.cc:166
+msgid "Select Editor Buffer"
+msgstr ""
+
+#: luawindow.cc:253 luawindow.cc:258
+msgid "Window|Lua"
+msgstr "Lua"
+
+#: luawindow.cc:286 luawindow.cc:304
+msgid "LuaException: %1"
+msgstr ""
+
+#: luawindow.cc:342
+msgid "Deleted %1"
+msgstr "Удалён %1"
+
+#: luawindow.cc:345
+msgid "Failed to delete %1"
+msgstr "Не удалось удалить %1"
+
+#: luawindow.cc:411
+msgid ""
+"Missing script header.\n"
+"The script requires an '{ardour}' info table and a 'factory' function."
+msgstr ""
+
+#: luawindow.cc:416
+msgid "Script fails to compile."
+msgstr "Не удалось скомпилировать скрипт."
+
+#: luawindow.cc:423
+msgid "Invalid or missing script-name or script-type."
+msgstr "Некорректно или отсутствует имя или тип скрипта."
+
+#: luawindow.cc:428
+msgid ""
+"Invalid script-type.\n"
+"Valid types are 'EditorAction' and 'Snippet'."
+msgstr ""
+
+#: luawindow.cc:439 luawindow.cc:490
+msgid "Saved as %1"
+msgstr "Сохранено как %1"
+
+#: luawindow.cc:442 luawindow.cc:493
+msgid "Error saving file: %1"
+msgstr "Ошибка при сохранении файла: %1"
+
+#: luawindow.cc:452
+msgid ""
+"Script with given name '%1' already exists.\n"
+"Use a different name in the descriptor."
+msgstr ""
+
+#: luawindow.cc:636
+msgid "Scratch Buffer %1"
+msgstr ""
+
+#: luawindow.cc:638
+msgid "Action: '%1'"
+msgstr "Действие: '%1'"
+
+#: luawindow.cc:640
+msgid "Snippet: %1"
+msgstr "Фрагмент: %1"
+
+#: luawindow.cc:652
+msgid "Save as"
+msgstr "Сохранить как"
+
+#: main.cc:88
 msgid "%1 could not connect to the audio backend."
 msgstr "%1 не удалось соединиться со звуковой подсистемой."
 
-#: main.cc:133 main.cc:149
+#: main.cc:135 main.cc:151
 msgid "The audio backend (%1) has failed, or terminated"
 msgstr "Ошибка аудиодвижка (%1), либо он был остановлен"
 
-#: main.cc:136
+#: main.cc:138
 msgid ""
 "%2 exited unexpectedly, and without notifying %1.\n"
 "\n"
@@ -7422,11 +8288,11 @@ msgstr ""
 "\n"
 "Нажмите OK, чтобы выйти из %1."
 
-#: main.cc:150
+#: main.cc:152
 msgid "%2 exited unexpectedly, and without notifying %1."
 msgstr "%2 вышел неожиданно и без уведомления %1."
 
-#: main.cc:245
+#: main.cc:247
 msgid ""
 "\n"
 "   %1 could not understand your command line      "
@@ -7434,23 +8300,23 @@ msgstr ""
 "\n"
 "   %1 не удалось разобрать переданные вами аргументы командной строки      "
 
-#: main.cc:247
+#: main.cc:249
 msgid "An error was encountered while launching %1"
 msgstr "Произошла ошибка при запуске %1"
 
-#: main.cc:340
+#: main.cc:350
 msgid " (built using "
 msgstr " (собран, используя "
 
-#: main.cc:343
+#: main.cc:353
 msgid " and GCC version "
 msgstr ", при помощи GCC версии "
 
-#: main.cc:353
+#: main.cc:363
 msgid "Copyright (C) 1999-2015 Paul Davis"
 msgstr "Авторские права (C) 1999-2015 Paul Davis"
 
-#: main.cc:354
+#: main.cc:364
 msgid ""
 "Some portions Copyright (C) Steve Harris, Ari Johnson, Brett Viren, Joel "
 "Baker, Robin Gareus"
@@ -7458,35 +8324,35 @@ msgstr ""
 "Частичные авторские права © Steve Harris, Ari Johnson, Brett Viren, Joel "
 "Baker, Robin Gareus"
 
-#: main.cc:356
+#: main.cc:366
 msgid "%1 comes with ABSOLUTELY NO WARRANTY"
 msgstr "%1 распространяется БЕЗО ВСЯКИХ ГАРАНТИЙ"
 
-#: main.cc:357
+#: main.cc:367
 msgid "not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
 msgstr "Даже не для КОММЕРЦИИ или ПРИГОДНОСТИ К КОНКРЕТНЫМ ЦЕЛЯМ."
 
-#: main.cc:358
+#: main.cc:368
 msgid "This is free software, and you are welcome to redistribute it "
 msgstr "Это свободное программное обеспечение, Вы можете распространять его"
 
-#: main.cc:359
+#: main.cc:369
 msgid "under certain conditions; see the source for copying conditions."
 msgstr "На определённых условиях; подробнее об этом читайте в файле COPYING."
 
-#: main.cc:364
+#: main.cc:374
 msgid "could not initialize %1."
 msgstr "Не удалось инициализировать %1."
 
-#: main.cc:374
+#: main.cc:384
 msgid "Cannot xinstall SIGPIPE error handler"
 msgstr "Сбой установки обработчика ошибок SIGPIPE"
 
-#: main.cc:379
+#: main.cc:391
 msgid "Could not complete pre-GUI initialization"
 msgstr ""
 
-#: main.cc:386
+#: main.cc:398
 msgid "could not create %1 GUI"
 msgstr "Не удалось создать графический интерфейс для %1"
 
@@ -7494,11 +8360,11 @@ msgstr "Не удалось создать графический интерфе
 msgid "Display delta to edit cursor"
 msgstr "Показывать разницу с курсором редактора"
 
-#: main_clock.cc:66 tempo_dialog.cc:54
+#: main_clock.cc:66 tempo_dialog.cc:55
 msgid "Edit Tempo"
 msgstr "Изменить темп"
 
-#: main_clock.cc:67 tempo_dialog.cc:326
+#: main_clock.cc:67 tempo_dialog.cc:429
 msgid "Edit Meter"
 msgstr "Изменить размер"
 
@@ -7515,8 +8381,8 @@ msgid "MarkerText"
 msgstr ""
 
 #: midi_channel_selector.cc:161 midi_channel_selector.cc:400
-#: midi_channel_selector.cc:436 rc_option_editor.cc:2017
-#: rc_option_editor.cc:2663 sfdb_ui.cc:670
+#: midi_channel_selector.cc:436 rc_option_editor.cc:2157
+#: rc_option_editor.cc:2799 sfdb_ui.cc:671
 msgid "None"
 msgstr "Нет"
 
@@ -7705,83 +8571,79 @@ msgstr "Название порта:"
 msgid "MidiPortDialog"
 msgstr "MidiPortDialog"
 
-#: midi_region_view.cc:849
+#: midi_region_view.cc:855
 msgid "channel edit"
 msgstr "Правка канала"
 
-#: midi_region_view.cc:885
+#: midi_region_view.cc:891
 msgid "velocity edit"
 msgstr "Правка силы нажатия"
 
-#: midi_region_view.cc:944
+#: midi_region_view.cc:958
 msgid "add note"
 msgstr "Добавка ноты"
 
-#: midi_region_view.cc:1872
+#: midi_region_view.cc:1902
 msgid "step add"
 msgstr "Добавить шаг"
 
-#: midi_region_view.cc:1966 midi_region_view.cc:1989
+#: midi_region_view.cc:1996 midi_region_view.cc:2019
 msgid "alter patch change"
 msgstr "Смена изменения патча"
 
-#: midi_region_view.cc:2025
+#: midi_region_view.cc:2055
 msgid "add patch change"
 msgstr "Добавка смены программы"
 
-#: midi_region_view.cc:2047 midi_region_view.cc:2048
+#: midi_region_view.cc:2077 midi_region_view.cc:2078
 msgid "move patch change"
 msgstr "Перемещение смены программы"
 
-#: midi_region_view.cc:2060 midi_region_view.cc:2061
+#: midi_region_view.cc:2090 midi_region_view.cc:2091
 msgid "delete patch change"
 msgstr "Удаление смены программы"
 
-#: midi_region_view.cc:2099
+#: midi_region_view.cc:2129
 msgid "delete selection"
 msgstr "Удаление выделения"
 
-#: midi_region_view.cc:2116
+#: midi_region_view.cc:2146
 msgid "delete note"
 msgstr "Удаление ноты"
 
-#: midi_region_view.cc:2575
+#: midi_region_view.cc:2587
 msgid "move notes"
 msgstr "Перемещение ноты"
 
-#: midi_region_view.cc:3110
+#: midi_region_view.cc:3137
 msgid "change velocities"
 msgstr "Смена силы нажатия"
 
-#: midi_region_view.cc:3176
+#: midi_region_view.cc:3203
 msgid "transpose"
 msgstr "Транспозиция"
 
-#: midi_region_view.cc:3204
+#: midi_region_view.cc:3231
 msgid "change note lengths"
 msgstr "Смена длительности нот"
 
-#: midi_region_view.cc:3280
+#: midi_region_view.cc:3307
 msgid "nudge"
 msgstr "Толчок"
 
-#: midi_region_view.cc:3295
+#: midi_region_view.cc:3322
 msgid "change channel"
 msgstr "Смена канала"
 
-#: midi_region_view.cc:3333
+#: midi_region_view.cc:3370
 msgid "Bank "
 msgstr "Банк"
 
-#: midi_region_view.cc:3334
-msgid "Program "
-msgstr "Программа"
-
-#: midi_region_view.cc:3335
+#: midi_region_view.cc:3372
 msgid "Channel "
 msgstr "Канал"
 
-#: midi_region_view.cc:3522
+#: midi_region_view.cc:3559
 msgid "paste"
 msgstr "Вставка"
 
@@ -7797,108 +8659,108 @@ msgstr "пытаться показать MIDI-область без модел
 msgid "failed to create MIDI region"
 msgstr "Не удалось создать MIDI-область"
 
-#: midi_time_axis.cc:316
+#: midi_time_axis.cc:306
 msgid "External MIDI Device"
 msgstr "Внешнее MIDI-устройство"
 
-#: midi_time_axis.cc:317
+#: midi_time_axis.cc:307
 msgid "External Device Mode"
 msgstr "Режим внешнего устройства"
 
-#: midi_time_axis.cc:325
+#: midi_time_axis.cc:315
 msgid "Chns"
 msgstr "Кнл"
 
-#: midi_time_axis.cc:327
+#: midi_time_axis.cc:317
 msgid "Click to edit channel settings"
 msgstr "Щёлкните для изменения параметров каналов"
 
-#: midi_time_axis.cc:526
+#: midi_time_axis.cc:516
 msgid "Show Full Range"
 msgstr "Показать все октавы"
 
-#: midi_time_axis.cc:531
+#: midi_time_axis.cc:521
 msgid "Fit Contents"
 msgstr "Уместить содержимое"
 
-#: midi_time_axis.cc:535
+#: midi_time_axis.cc:525
 msgid "Note Range"
 msgstr "Нотный диапазон"
 
-#: midi_time_axis.cc:536
+#: midi_time_axis.cc:526
 msgid "Note Mode"
 msgstr "Режим представления нот"
 
-#: midi_time_axis.cc:537
+#: midi_time_axis.cc:527
 msgid "Channel Selector"
 msgstr "Выбор каналов"
 
-#: midi_time_axis.cc:542
+#: midi_time_axis.cc:532
 msgid "Color Mode"
 msgstr "Режим раскрашивания"
 
-#: midi_time_axis.cc:601
+#: midi_time_axis.cc:591
 msgid "Bender"
 msgstr "Высота тона"
 
-#: midi_time_axis.cc:605
+#: midi_time_axis.cc:595
 msgid "Pressure"
 msgstr "Сила нажатия"
 
-#: midi_time_axis.cc:617
+#: midi_time_axis.cc:607
 msgid "Controllers"
 msgstr "Контроллеры"
 
-#: midi_time_axis.cc:622
+#: midi_time_axis.cc:612
 msgid "No MIDI Channels selected"
 msgstr "Нет выбранных каналов MIDI"
 
-#: midi_time_axis.cc:679 midi_time_axis.cc:808
+#: midi_time_axis.cc:669 midi_time_axis.cc:798
 msgid "Hide all channels"
 msgstr "Скрыть все каналы"
 
-#: midi_time_axis.cc:683 midi_time_axis.cc:812
+#: midi_time_axis.cc:673 midi_time_axis.cc:802
 msgid "Show all channels"
 msgstr "Показать все каналы"
 
-#: midi_time_axis.cc:694 midi_time_axis.cc:823
+#: midi_time_axis.cc:684 midi_time_axis.cc:813
 msgid "Channel %1"
 msgstr "Канал %1"
 
-#: midi_time_axis.cc:949 midi_time_axis.cc:981
+#: midi_time_axis.cc:939 midi_time_axis.cc:971
 msgid "Controllers %1-%2"
 msgstr "Контроллеры %1-%2"
 
-#: midi_time_axis.cc:972 midi_time_axis.cc:975
+#: midi_time_axis.cc:962 midi_time_axis.cc:965
 msgid "Controller %1"
 msgstr "Контроллер %1"
 
-#: midi_time_axis.cc:998
+#: midi_time_axis.cc:988
 msgid "Sustained"
 msgstr "Хроматические"
 
-#: midi_time_axis.cc:1005
+#: midi_time_axis.cc:995
 msgid "Percussive"
 msgstr "Перкуссия"
 
-#: midi_time_axis.cc:1025
+#: midi_time_axis.cc:1015
 msgid "Meter Colors"
 msgstr "Цвета силы нажатия"
 
-#: midi_time_axis.cc:1032
+#: midi_time_axis.cc:1022
 msgid "Channel Colors"
 msgstr "Цвета канала"
 
-#: midi_time_axis.cc:1039
+#: midi_time_axis.cc:1029
 msgid "Track Color"
 msgstr "Цвет дорожки"
 
-#: midi_time_axis.cc:1614 midi_time_axis.cc:1620 midi_time_axis.cc:1630
-#: midi_time_axis.cc:1636
+#: midi_time_axis.cc:1610 midi_time_axis.cc:1616 midi_time_axis.cc:1626
+#: midi_time_axis.cc:1632
 msgid "all"
 msgstr "Все"
 
-#: midi_time_axis.cc:1617 midi_time_axis.cc:1633
+#: midi_time_axis.cc:1613 midi_time_axis.cc:1629
 msgid "some"
 msgstr "Не все"
 
@@ -7914,7 +8776,7 @@ msgstr "Автопрокрутка"
 msgid "Decimal"
 msgstr "Десятичный"
 
-#: midi_tracer.cc:57 rc_option_editor.cc:1355
+#: midi_tracer.cc:57 rc_option_editor.cc:1356
 msgid "Enabled"
 msgstr "Включено"
 
@@ -7954,7 +8816,8 @@ msgstr "Пропустить все отсутствующие файлы"
 msgid "Skip this file"
 msgstr "Пропустить этот файл"
 
-#: missing_file_dialog.cc:57
+#: missing_file_dialog.cc:57 tempo_dialog.cc:135 tempo_dialog.cc:136
+#: tempo_dialog.cc:484 tempo_dialog.cc:485
 msgid "audio"
 msgstr "Звуковой"
 
@@ -7982,100 +8845,51 @@ msgstr ""
 msgid "Click to choose an additional folder"
 msgstr "Выберите дополнительную папку:"
 
-#: missing_plugin_dialog.cc:29
-msgid "Missing Plugins"
-msgstr "Отсутствующие плагины"
-
-#: missing_plugin_dialog.cc:36 transcode_video_dialog.cc:60
-msgid "OK"
-msgstr "ОК"
-
-#: mixer_actor.cc:55
-msgid "Toggle Solo on Mixer-Selected Tracks/Busses"
-msgstr "Переключить соло в выбранных в микшере дорожках/шинах"
-
-#: mixer_actor.cc:56
-msgid "Toggle Mute on Mixer-Selected Tracks/Busses"
-msgstr "Перекл. глушение в выбранных в микшере дорожках/шинах"
-
-#: mixer_actor.cc:57
-msgid "Toggle Rec-enable on Mixer-Selected Tracks/Busses"
-msgstr "Перекл. использоание записи в выбранных в микшере дорожках/шинах"
-
-#: mixer_actor.cc:58
-msgid "Decrease Gain on Mixer-Selected Tracks/Busses"
-msgstr "Уменьшить усиление в выбранных в микшере дорожках/шинах"
-
-#: mixer_actor.cc:59
-msgid "Increase Gain on Mixer-Selected Tracks/Busses"
-msgstr "Увеличить усиление в выбранных в микшере дорожках/шинах"
-
-#: mixer_actor.cc:60
-msgid "Set Gain to 0dB on Mixer-Selected Tracks/Busses"
-msgstr "Установить усиление на 0 усиление в выбранных в микшере дорожках/шинах"
-
-#: mixer_actor.cc:63
-msgid "Copy Selected Processors"
-msgstr "Скопировать выбранные обработчики"
-
-#: mixer_actor.cc:64
-msgid "Cut Selected Processors"
-msgstr "Вырезать выбранные обработчики"
-
-#: mixer_actor.cc:65
-msgid "Paste Selected Processors"
-msgstr "Вставить выбранные обработчики"
-
-#: mixer_actor.cc:66
-msgid "Delete Selected Processors"
-msgstr "Удалить выбранные обработчики"
-
-#: mixer_actor.cc:67
-msgid "Select All (visible) Processors"
-msgstr "Выбрать все (видимые) обработчики"
-
-#: mixer_actor.cc:68
-msgid "Toggle Selected Processors"
-msgstr "Переключить выбранные обработчики"
-
-#: mixer_actor.cc:69
-msgid "Toggle Selected Plugins"
-msgstr "Переключить выбранные плагины"
-
-#: mixer_actor.cc:70
-msgid "Deselect all strips and processors"
-msgstr "Снять выделение с полос и обработчиков"
-
-#: mixer_actor.cc:72 mixer_actor.cc:73
-msgid "Scroll Mixer Window to the left"
-msgstr "Список окон микшера влево"
+#: missing_plugin_dialog.cc:29
+msgid "Missing Plugins"
+msgstr "Отсутствующие плагины"
 
-#: mixer_actor.cc:75
-msgid "Toggle MIDI Input Active for Mixer-Selected Tracks/Busses"
-msgstr "Переключить активный MIDIвход  в выбранных в микшере дорожках/шинах"
+#: missing_plugin_dialog.cc:36 transcode_video_dialog.cc:60
+msgid "OK"
+msgstr "ОК"
 
-#: mixer_actor.cc:90
-msgid "Loaded mixer bindings from %1"
-msgstr "Загруженные привязки микшера от %1"
+#: missing_plugin_dialog.cc:42
+msgid ""
+"This session contains the following plugins that cannot be found on this "
+"system:\n"
+"\n"
+msgstr ""
+"В этой сессии используются плагины, которые сейчас отсутствуют в системе:\n"
+"\n"
 
-#: mixer_actor.cc:92
-msgid "Could not find mixer.bindings in search path %1"
-msgstr "Не удалось найти привязки микшера в пути поиска %1"
+#: missing_plugin_dialog.cc:48
+msgid ""
+"\n"
+"Those plugins will be replaced with inactive stubs.\n"
+"It is recommended that you install the missing plugins and re-load the "
+"session.\n"
+"(also check the blacklist, Window > Log and Preferences > Plugins)"
+msgstr ""
+"\n"
+"На место этих плагинов вставлены неактивные заглушки.\n"
+"Рекомендуется установить отсутствующие плагины и заново загрузить сессию.\n"
+"Кроме того, проверьте чёрный список, диалоги \"Окна > Журнал\" и \n"
+"\"Правка > Параметры > Плагины\"."
 
-#: mixer_strip.cc:98 mixer_strip.cc:129
+#: mixer_strip.cc:100 mixer_strip.cc:133
 msgid "pre"
 msgstr "До"
 
-#: mixer_strip.cc:101 mixer_strip.cc:132 mixer_strip.cc:387 mixer_strip.cc:1470
-#: rc_option_editor.cc:2949
+#: mixer_strip.cc:104 mixer_strip.cc:136 mixer_strip.cc:397 mixer_strip.cc:1548
+#: mixer_strip.cc:1559 rc_option_editor.cc:3147
 msgid "Comments"
 msgstr "Комментарии"
 
-#: mixer_strip.cc:155
+#: mixer_strip.cc:160
 msgid "Click to toggle the width of this mixer strip."
 msgstr "Щёлкните для переключения ширины полоски микшера"
 
-#: mixer_strip.cc:157
+#: mixer_strip.cc:162
 msgid ""
 "\n"
 "%1-%2-click to toggle the width of all strips."
@@ -8083,325 +8897,396 @@ msgstr ""
 "\n"
 "%1-%2-щелчок для изменения ширины всех полос."
 
-#: mixer_strip.cc:164
+#: mixer_strip.cc:171
 msgid "Hide this mixer strip"
 msgstr "Скрыть полоску микшера"
 
-#: mixer_strip.cc:175
+#: mixer_strip.cc:182
 msgid "Click to select metering point"
 msgstr "Щёлкните для выбора точки замера"
 
-#: mixer_strip.cc:191
+#: mixer_strip.cc:198
 msgid "Isolate Solo"
 msgstr "Изолировать соло"
 
-#: mixer_strip.cc:199
+#: mixer_strip.cc:206
 msgid "Lock Solo Status"
 msgstr "Статус блокировки солирования"
 
-#: mixer_strip.cc:201 mixer_strip.cc:2113
+#: mixer_strip.cc:208 mixer_strip.cc:2225
 msgid "SoloLock|Lock"
 msgstr "Блок"
 
-#: mixer_strip.cc:202 mixer_strip.cc:2112
+#: mixer_strip.cc:209 mixer_strip.cc:2224
 msgid "Iso"
 msgstr "Изо."
 
-#: mixer_strip.cc:256
+#: mixer_strip.cc:263
 msgid "Mix group"
 msgstr "Группа микса"
 
-#: mixer_strip.cc:266
+#: mixer_strip.cc:275
 msgid "Trim: "
 msgstr "Усиление: "
 
-#: mixer_strip.cc:383 rc_option_editor.cc:2945
+#: mixer_strip.cc:393 rc_option_editor.cc:3143
 msgid "Phase Invert"
 msgstr "Инверсия фазы"
 
-#: mixer_strip.cc:384 rc_option_editor.cc:2946
+#: mixer_strip.cc:394 rc_option_editor.cc:3144
 msgid "Record & Monitor"
 msgstr "Запись и монитор"
 
-#: mixer_strip.cc:385 rc_option_editor.cc:2947
+#: mixer_strip.cc:395 rc_option_editor.cc:3145
 msgid "Solo Iso / Lock"
 msgstr "Соло Iso / Блок"
 
-#: mixer_strip.cc:507
+#: mixer_strip.cc:398 rc_option_editor.cc:3148
+msgid "VCA Assigns"
+msgstr "Привязка к VCA"
+
+#: mixer_strip.cc:545
 msgid "Show/Hide Monitoring Section"
 msgstr "Показать или скрыть панель мониторинга"
 
-#: mixer_strip.cc:559
+#: mixer_strip.cc:590
 msgid "Enable/Disable MIDI input"
 msgstr "Включить или выключить MIDI-вход"
 
-#: mixer_strip.cc:726
+#: mixer_strip.cc:756
 msgid "Aux"
 msgstr "Ð’Ñ‹Ñ…"
 
-#: mixer_strip.cc:752
+#: mixer_strip.cc:782
 msgid "Snd"
 msgstr "Псл"
 
-#: mixer_strip.cc:823 mixer_strip.cc:926 processor_box.cc:2759
+#: mixer_strip.cc:853 mixer_strip.cc:958 processor_box.cc:3606
 msgid "Not connected to audio engine - no I/O changes are possible"
 msgstr ""
 "Нет соединения со звуковой подсистемой, любые изменения входа-выхода "
 "невозможны."
 
-#: mixer_strip.cc:880 mixer_strip.cc:982
+#: mixer_strip.cc:911 mixer_strip.cc:1014
 msgid "Add %1 port"
 msgstr "Добавить %1-порт"
 
-#: mixer_strip.cc:887 mixer_strip.cc:989 monitor_section.cc:1377
+#: mixer_strip.cc:919 mixer_strip.cc:1021 monitor_section.cc:1466
+#: plugin_pin_dialog.cc:1782
 msgid "Routing Grid"
 msgstr "Матрица маршрутизации"
 
-#: mixer_strip.cc:1218
+#: mixer_strip.cc:1298
 msgid "MIDI "
 msgstr "MIDI "
 
-#: mixer_strip.cc:1223
+#: mixer_strip.cc:1302
 msgid "<b>INPUT</b> to %1"
 msgstr "<b>ВХОД</b> в %1"
 
-#: mixer_strip.cc:1226 monitor_section.cc:1422
+#: mixer_strip.cc:1304 monitor_section.cc:1511
 msgid "<b>OUTPUT</b> from %1"
 msgstr "<b>ВЫХОД</b> из %1"
 
-#: mixer_strip.cc:1344 monitor_section.cc:1509
+#: mixer_strip.cc:1417 monitor_section.cc:1598
 msgid "Disconnected"
 msgstr "Нет соединения"
 
-#: mixer_strip.cc:1473
-msgid "*Comments*"
-msgstr "*Кмт*"
+#: mixer_strip.cc:1544
+msgid "Click to add/edit comments"
+msgstr "Щёлкните, чтобы добавить или изменить комментарий"
 
-#: mixer_strip.cc:1480
+#: mixer_strip.cc:1548 mixer_strip.cc:1559
 msgid "Cmt"
 msgstr "Кмт"
 
-#: mixer_strip.cc:1483
-msgid "*Cmt*"
-msgstr "*Кмт*"
-
-#: mixer_strip.cc:1489
-msgid "Click to add/edit comments"
-msgstr "Щёлкните, чтобы добавить или изменить комментарий"
-
-#: mixer_strip.cc:1533
+#: mixer_strip.cc:1604
 msgid "Grp"
 msgstr "Грп"
 
-#: mixer_strip.cc:1536
+#: mixer_strip.cc:1607
 msgid "~G"
 msgstr "нГр"
 
-#: mixer_strip.cc:1565 route_time_axis.cc:573
+#: mixer_strip.cc:1648 route_time_axis.cc:585 vca_master_strip.cc:396
 msgid "Color..."
 msgstr "Цвет..."
 
-#: mixer_strip.cc:1567 route_time_axis.cc:575
+#: mixer_strip.cc:1650 route_time_axis.cc:587
 msgid "Comments..."
 msgstr "Комментарии..."
 
-#: mixer_strip.cc:1569 route_time_axis.cc:577
+#: mixer_strip.cc:1652 route_time_axis.cc:589
 msgid "Inputs..."
 msgstr "Входы..."
 
-#: mixer_strip.cc:1571 route_time_axis.cc:579
+#: mixer_strip.cc:1654 route_time_axis.cc:591
 msgid "Outputs..."
 msgstr "Выходы..."
 
-#: mixer_strip.cc:1576
+#: mixer_strip.cc:1659
 msgid "Save As Template..."
 msgstr "Сохранить как шаблон..."
 
-#: mixer_strip.cc:1582 route_group_dialog.cc:45 route_time_axis.cc:853
+#: mixer_strip.cc:1665 route_group_dialog.cc:45 route_time_axis.cc:851
 msgid "Active"
 msgstr "Активно"
 
-#: mixer_strip.cc:1590
+#: mixer_strip.cc:1673 plugin_pin_dialog.cc:1011
+msgid "Strict I/O"
+msgstr "Строгий ввод/вывод"
+
+#: mixer_strip.cc:1683 plugin_ui.cc:424 processor_box.cc:3710
+msgid "Pin Connections..."
+msgstr "Порты плагина..."
+
+#: mixer_strip.cc:1687
 msgid "Adjust Latency..."
 msgstr "Скорректировать задержку..."
 
-#: mixer_strip.cc:1593
+#: mixer_strip.cc:1690
 msgid "Protect Against Denormals"
 msgstr "Защищать от отклонений"
 
-#: mixer_strip.cc:1599 route_time_axis.cc:592
-msgid "Remote Control ID..."
-msgstr "ID для удалённого управления..."
-
-#: mixer_strip.cc:1617 route_time_axis.cc:869
+#: mixer_strip.cc:1709 route_time_axis.cc:867
 msgid "Duplicate..."
 msgstr "Продублировать..."
 
-#: mixer_strip.cc:1905
+#: mixer_strip.cc:2004
 msgid "Pre"
 msgstr "До"
 
-#: mixer_strip.cc:1909
+#: mixer_strip.cc:2008
 msgid "Post"
 msgstr "После"
 
-#: mixer_strip.cc:1925
+#: mixer_strip.cc:2024
 msgid "Meter|In"
 msgstr "Ð’Ñ…"
 
-#: mixer_strip.cc:1929
+#: mixer_strip.cc:2028
 msgid "Meter|Pr"
 msgstr "Прд"
 
-#: mixer_strip.cc:1933
+#: mixer_strip.cc:2032
 msgid "Meter|Po"
 msgstr "Псл"
 
-#: mixer_strip.cc:1937
+#: mixer_strip.cc:2036
 msgid "Meter|O"
 msgstr "Ð’Ñ‹Ñ…"
 
-#: mixer_strip.cc:1942
+#: mixer_strip.cc:2041
 msgid "Meter|C"
 msgstr "З"
 
-#: mixer_strip.cc:2090 route_ui.cc:181
+#: mixer_strip.cc:2202 route_ui.cc:197
 msgid "Disk"
 msgstr "Диск"
 
-#: mixer_strip.cc:2092
+#: mixer_strip.cc:2204
 msgid "Mon"
 msgstr ""
 
-#: mixer_strip.cc:2105 monitor_section.cc:81
+#: mixer_strip.cc:2217 monitor_section.cc:81
 msgid "AFL"
 msgstr "AFL"
 
-#: mixer_strip.cc:2108 monitor_section.cc:82
+#: mixer_strip.cc:2220 monitor_section.cc:82
 msgid "PFL"
 msgstr "PFL"
 
-#: mixer_strip.cc:2118 meter_strip.cc:387
+#: mixer_strip.cc:2230 meter_strip.cc:385
 msgid "MonitorInput|I"
 msgstr "Ð’Ñ…"
 
-#: mixer_strip.cc:2119 meter_strip.cc:388
+#: mixer_strip.cc:2231 meter_strip.cc:386
 msgid "MonitorDisk|D"
 msgstr "Д"
 
-#: mixer_strip.cc:2121
+#: mixer_strip.cc:2233
 msgid "Mon|O"
 msgstr ""
 
-#: mixer_strip.cc:2134 meter_strip.cc:379 route_time_axis.cc:2738
+#: mixer_strip.cc:2246 meter_strip.cc:377 route_time_axis.cc:2730
+#: vca_master_strip.cc:202 vca_time_axis.cc:227
 msgid "AfterFader|A"
 msgstr "П"
 
-#: mixer_strip.cc:2137
+#: mixer_strip.cc:2249
 msgid "Prefader|P"
 msgstr "Д"
 
-#: mixer_strip.cc:2142
+#: mixer_strip.cc:2254
 msgid "SoloIso|I"
 msgstr "И"
 
-#: mixer_strip.cc:2143
+#: mixer_strip.cc:2255
 msgid "SoloLock|L"
 msgstr "Б"
 
-#: mixer_strip.cc:2348
+#: mixer_strip.cc:2460
 msgid "Pre Fader"
 msgstr "Предфейдер"
 
-#: mixer_strip.cc:2349
+#: mixer_strip.cc:2461
 msgid "Post Fader"
 msgstr "Послефейдер"
 
-#: mixer_strip.cc:2394 meter_strip.cc:860
+#: mixer_strip.cc:2506 meter_strip.cc:858
 msgid "Change all in Group to %1"
 msgstr "Поменять все в группе на %1"
 
-#: mixer_strip.cc:2396 meter_strip.cc:862
+#: mixer_strip.cc:2508 meter_strip.cc:860
 msgid "Change all to %1"
 msgstr "Поменять все на %1"
 
-#: mixer_strip.cc:2398 meter_strip.cc:864
+#: mixer_strip.cc:2510 meter_strip.cc:862
 msgid "Change same track-type to %1"
 msgstr "Поменять дорожки одного типа на %1"
 
-#: mixer_ui.cc:134 route_time_axis.cc:830
+#: mixer_ui.cc:152 route_time_axis.cc:828
 msgid "Group"
 msgstr "Группа"
 
-#: mixer_ui.cc:199
+#: mixer_ui.cc:221
 msgid "Favorite Plugins"
 msgstr "Избранные плагины"
 
-#: mixer_ui.cc:1288
+#: mixer_ui.cc:627
+msgid "Error adding GUI elements for new tracks/busses %1"
+msgstr "Ошибка добавления элементов UI в новые дорожки/шины %1"
+
+#: mixer_ui.cc:1542
 msgid "track display list item for renamed strip not found!"
 msgstr "Элемент списка для переименованного канала микшера не найден!"
 
-#: mixer_ui.cc:1382
+#: mixer_ui.cc:1636
 msgid "-all-"
 msgstr "-все-"
 
-#: mixer_ui.cc:2039
+#: mixer_ui.cc:2135
 msgid "Strips"
 msgstr "Каналы"
 
-#: mixer_ui.cc:2346
+#: mixer_ui.cc:2479
 msgid "No Track/Bus is selected."
-msgstr ""
+msgstr "Нет выбранных дорожек/шин"
 
-#: mixer_ui.cc:2348
+#: mixer_ui.cc:2481
 msgid "Add at the top"
 msgstr "Добавить в начало"
 
-#: mixer_ui.cc:2350
+#: mixer_ui.cc:2483
 msgid "Add Pre-Fader"
 msgstr "Добавить перед фейдером"
 
-#: mixer_ui.cc:2352
+#: mixer_ui.cc:2485
 msgid "Add Post-Fader"
 msgstr "Добавить после фейдера"
 
-#: mixer_ui.cc:2354
+#: mixer_ui.cc:2487
 msgid "Add at the end"
 msgstr "Добавить в конец"
 
-#: mixer_ui.cc:2360
+#: mixer_ui.cc:2493
 msgid "Remove from favorites"
 msgstr "Удалить из избранных"
 
-#: mixer_ui.cc:2364
+#: mixer_ui.cc:2499
 msgid "Delete Preset"
 msgstr "Удалить предустановку"
 
-#: meter_strip.cc:161
+#: mixer_ui.cc:2739
+msgid "Toggle Solo on Mixer-Selected Tracks/Busses"
+msgstr "Переключить соло в выбранных в микшере дорожках/шинах"
+
+#: mixer_ui.cc:2740
+msgid "Toggle Mute on Mixer-Selected Tracks/Busses"
+msgstr "Перекл. глушение в выбранных в микшере дорожках/шинах"
+
+#: mixer_ui.cc:2741
+msgid "Toggle Rec-enable on Mixer-Selected Tracks/Busses"
+msgstr "Перекл. использоание записи в выбранных в микшере дорожках/шинах"
+
+#: mixer_ui.cc:2742
+msgid "Decrease Gain on Mixer-Selected Tracks/Busses"
+msgstr "Уменьшить усиление в выбранных в микшере дорожках/шинах"
+
+#: mixer_ui.cc:2743
+msgid "Increase Gain on Mixer-Selected Tracks/Busses"
+msgstr "Увеличить усиление в выбранных в микшере дорожках/шинах"
+
+#: mixer_ui.cc:2744
+msgid "Set Gain to 0dB on Mixer-Selected Tracks/Busses"
+msgstr "Установить усиление на 0 усиление в выбранных в микшере дорожках/шинах"
+
+#: mixer_ui.cc:2747
+msgid "Copy Selected Processors"
+msgstr "Скопировать выбранные обработчики"
+
+#: mixer_ui.cc:2748
+msgid "Cut Selected Processors"
+msgstr "Вырезать выбранные обработчики"
+
+#: mixer_ui.cc:2749
+msgid "Paste Selected Processors"
+msgstr "Вставить выбранные обработчики"
+
+#: mixer_ui.cc:2750
+msgid "Delete Selected Processors"
+msgstr "Удалить выбранные обработчики"
+
+#: mixer_ui.cc:2751
+msgid "Select All (visible) Processors"
+msgstr "Выбрать все (видимые) обработчики"
+
+#: mixer_ui.cc:2752
+msgid "Toggle Selected Processors"
+msgstr "Переключить выбранные обработчики"
+
+#: mixer_ui.cc:2753
+msgid "Toggle Selected Plugins"
+msgstr "Переключить выбранные плагины"
+
+#: mixer_ui.cc:2754
+msgid "Deselect all strips and processors"
+msgstr "Снять выделение с полос и обработчиков"
+
+#: mixer_ui.cc:2756 mixer_ui.cc:2757
+msgid "Scroll Mixer Window to the left"
+msgstr "Список окон микшера влево"
+
+#: mixer_ui.cc:2759
+msgid "Toggle MIDI Input Active for Mixer-Selected Tracks/Busses"
+msgstr "Переключить активный MIDIвход  в выбранных в микшере дорожках/шинах"
+
+#: meter_strip.cc:160
 msgid "Reset Peak"
 msgstr "Сброс пик"
 
-#: meter_strip.cc:382 route_time_axis.cc:2742
+#: meter_strip.cc:380 route_time_axis.cc:2734 vca_master_strip.cc:206
+#: vca_time_axis.cc:231
 msgid "PreFader|P"
 msgstr "Д"
 
-#: meter_strip.cc:896
+#: meter_strip.cc:894
 msgid "Variable height"
 msgstr "Переменная высота"
 
-#: meter_strip.cc:897
+#: meter_strip.cc:895
 msgid "Short"
 msgstr "Короткий"
 
-#: meter_strip.cc:898
+#: meter_strip.cc:896
 msgid "Tall"
 msgstr "Высокий"
 
-#: meter_strip.cc:899
+#: meter_strip.cc:897
 msgid "Grande"
 msgstr "Grande"
 
-#: meter_strip.cc:900
+#: meter_strip.cc:898
 msgid "Venti"
 msgstr "Venti"
 
@@ -8453,19 +9338,19 @@ msgstr "VU"
 msgid "SiP"
 msgstr "SiP"
 
-#: monitor_section.cc:111 route_group_dialog.cc:49
+#: monitor_section.cc:113 route_group_dialog.cc:49
 msgid "Soloing"
 msgstr "Солирование"
 
-#: monitor_section.cc:115
+#: monitor_section.cc:117
 msgid "Isolated"
 msgstr "Изолировано"
 
-#: monitor_section.cc:119
+#: monitor_section.cc:121
 msgid "Auditioning"
 msgstr "Прослушивание"
 
-#: monitor_section.cc:130
+#: monitor_section.cc:132
 msgid ""
 "When active, something is solo-isolated.\n"
 "Click to de-isolate everything"
@@ -8473,7 +9358,7 @@ msgstr ""
 "Если активно, то что-то будет соло-изолировано.\n"
 "Нажмите, чтобы де-изолировать все"
 
-#: monitor_section.cc:133
+#: monitor_section.cc:135
 msgid ""
 "When active, auditioning is active.\n"
 "Click to stop the audition"
@@ -8481,31 +9366,31 @@ msgstr ""
 "Если включено, выполняется прослушивание.\n"
 "Щёлкните, чтобы прекратить его."
 
-#: monitor_section.cc:150
+#: monitor_section.cc:152
 msgid "Solo controls affect solo-in-place"
 msgstr "Управление солированием затрагивает солирование на месте"
 
-#: monitor_section.cc:156
+#: monitor_section.cc:158
 msgid "Solo controls toggle after-fader-listen"
 msgstr "Управление солированием переключает послефейдерное прослушивание"
 
-#: monitor_section.cc:162
+#: monitor_section.cc:164
 msgid "Solo controls toggle pre-fader-listen"
 msgstr "Управление солированием переключает предфейдерное прослушивание"
 
-#: monitor_section.cc:168
+#: monitor_section.cc:170
 msgid "Excl. Solo"
 msgstr "Экскл. соло"
 
-#: monitor_section.cc:170
+#: monitor_section.cc:172
 msgid "Exclusive solo means that only 1 solo is active at a time"
 msgstr "Одновременно может быть активным только одно соло"
 
-#: monitor_section.cc:177
+#: monitor_section.cc:179
 msgid "Solo » Mute"
 msgstr "Соло » Выкл"
 
-#: monitor_section.cc:179
+#: monitor_section.cc:181
 msgid ""
 "If enabled, solo will override mute\n"
 "(a soloed & muted track or bus will be audible)"
@@ -8513,40 +9398,40 @@ msgstr ""
 "Если включено, то соло заменит приглушение\n"
 "(соло и приглушенная дорожка/шина будут слышны)"
 
-#: monitor_section.cc:187
+#: monitor_section.cc:189
 msgid "Processors"
 msgstr "Обработчики"
 
-#: monitor_section.cc:189
-msgid "Allow to add monitor effect processors"
+#: monitor_section.cc:191
+msgid "Allow one to add monitor effect processors"
 msgstr ""
 
-#: monitor_section.cc:205
+#: monitor_section.cc:206
 msgid "Gain increase for soloed signals (0dB is normal)"
 msgstr "Усиление солируемого сигнала (0dB является нормой)"
 
-#: monitor_section.cc:209 monitor_section.cc:226 monitor_section.cc:243
-#: monitor_section.cc:288
+#: monitor_section.cc:210 monitor_section.cc:227 monitor_section.cc:244
+#: monitor_section.cc:289
 msgid "0 dB"
 msgstr "0 Дб"
 
-#: monitor_section.cc:210
+#: monitor_section.cc:211
 msgid "3 dB"
 msgstr "3 Дб"
 
-#: monitor_section.cc:211
+#: monitor_section.cc:212
 msgid "6 dB"
 msgstr "6 Дб"
 
-#: monitor_section.cc:212
+#: monitor_section.cc:213
 msgid "10 dB"
 msgstr "10 Дб"
 
-#: monitor_section.cc:214
+#: monitor_section.cc:215
 msgid "Solo Boost"
 msgstr "Усиление соло"
 
-#: monitor_section.cc:221
+#: monitor_section.cc:222
 msgid ""
 "Gain reduction non-soloed signals\n"
 "A value above -inf dB causes \"solo-in-front\""
@@ -8554,99 +9439,103 @@ msgstr ""
 "Снижение усиления не-солированных сигналов \n"
 "Значение выше -инф дБ вызывает \"solo-in-front\""
 
-#: monitor_section.cc:227 monitor_section.cc:245 monitor_section.cc:290
+#: monitor_section.cc:228 monitor_section.cc:246 monitor_section.cc:291
 msgid "-6 dB"
 msgstr "-6 Дб"
 
-#: monitor_section.cc:228 monitor_section.cc:246 monitor_section.cc:291
+#: monitor_section.cc:229 monitor_section.cc:247 monitor_section.cc:292
 msgid "-12 dB"
 msgstr "-12 Дб"
 
-#: monitor_section.cc:229 monitor_section.cc:247 monitor_section.cc:292
+#: monitor_section.cc:230 monitor_section.cc:248 monitor_section.cc:293
 msgid "-20 dB"
 msgstr "-20 Дб"
 
-#: monitor_section.cc:230
+#: monitor_section.cc:231
 msgid "OFF"
 msgstr "ВЫКЛ"
 
-#: monitor_section.cc:232
+#: monitor_section.cc:233
 msgid "SiP Cut"
 msgstr "SiP Обр."
 
-#: monitor_section.cc:239
+#: monitor_section.cc:240
 msgid "Gain reduction to use when dimming monitor outputs"
 msgstr "Снижение усиленеия для исп. при затемнении мониторов выходов"
 
-#: monitor_section.cc:244 monitor_section.cc:289
+#: monitor_section.cc:245 monitor_section.cc:290
 msgid "-3 dB"
 msgstr "-3 Дб"
 
-#: monitor_section.cc:249 monitor_section.cc:263 monitor_section.cc:324
+#: monitor_section.cc:250 monitor_section.cc:264 monitor_section.cc:325
 msgid "Dim"
 msgstr "Тише"
 
-#: monitor_section.cc:293
+#: monitor_section.cc:294
 msgid "-30 dB"
 msgstr "-30 Дб"
 
-#: monitor_section.cc:332
+#: monitor_section.cc:333
 msgid "Inv"
 msgstr "Инв."
 
-#: monitor_section.cc:398
+#: monitor_section.cc:399 port_group.cc:552
 msgid "Monitor"
 msgstr "Монитор"
 
-#: monitor_section.cc:862
+#: monitor_section.cc:897
 msgid "Switch monitor to mono"
 msgstr "Переключить мониторинг в монофонический режим"
 
-#: monitor_section.cc:865
+#: monitor_section.cc:900
 msgid "Cut monitor"
 msgstr "Выключить мониторинг"
 
-#: monitor_section.cc:868
+#: monitor_section.cc:903
 msgid "Dim monitor"
 msgstr "Приглушить мониторинг"
 
-#: monitor_section.cc:871
+#: monitor_section.cc:906
 msgid "Toggle exclusive solo mode"
 msgstr "Переключить эксклюзивное солирование"
 
-#: monitor_section.cc:877
+#: monitor_section.cc:912
 msgid "Toggle mute overrides solo mode"
 msgstr "Переключение глушения перекрывает соло-режим"
 
-#: monitor_section.cc:887
+#: monitor_section.cc:921
 msgid "Cut monitor channel %1"
 msgstr "Вырезать канал %1 мониторинга"
 
-#: monitor_section.cc:892
+#: monitor_section.cc:926
 msgid "Dim monitor channel %1"
 msgstr "Приглушить канал %1 мониторинга"
 
-#: monitor_section.cc:897
+#: monitor_section.cc:931
 msgid "Solo monitor channel %1"
 msgstr "Солировать каналом %1 мониторинга"
 
-#: monitor_section.cc:902
+#: monitor_section.cc:936
 msgid "Invert monitor channel %1"
 msgstr "Инвертировать канал %1 мониторинга"
 
-#: monitor_section.cc:912
+#: monitor_section.cc:946
 msgid "In-place solo"
 msgstr "На месте соло"
 
-#: monitor_section.cc:914
+#: monitor_section.cc:948
 msgid "After Fade Listen (AFL) solo"
 msgstr "Прослушивание солирования после фейдера (AFL)"
 
-#: monitor_section.cc:916
+#: monitor_section.cc:950
 msgid "Pre Fade Listen (PFL) solo"
 msgstr "Прослушивание солирования до фейдера (PFL)"
 
-#: monitor_section.cc:1324
+#: monitor_section.cc:953
+msgid "Toggle Monitor Section Processor Box"
+msgstr ""
+
+#: monitor_section.cc:1413
 msgid "No session - no I/O changes are possible"
 msgstr ""
 
@@ -8773,9 +9662,9 @@ msgstr "Нормировка областей"
 msgid "Normalize region"
 msgstr "Нормировка области"
 
-#: normalize_dialog.cc:49 strip_silence_dialog.cc:67
-msgid "dbFS"
-msgstr "dbFS"
+#: normalize_dialog.cc:42
+msgid "Normalize to:"
+msgstr "Нормировать до:"
 
 #: normalize_dialog.cc:56
 msgid "Normalize each region using its own peak value"
@@ -8906,7 +9795,7 @@ msgstr ""
 msgid "Panner (2D)"
 msgstr "Панорамирование (2D)"
 
-#: panner2d.cc:898 panner_ui.cc:402 plugin_ui.cc:458
+#: panner2d.cc:898 panner_ui.cc:402 plugin_ui.cc:465
 msgid "Bypass"
 msgstr "Обход"
 
@@ -8962,39 +9851,162 @@ msgstr "Не назначен"
 msgid "Imported"
 msgstr "Импортировано"
 
-#: plugin_eq_gui.cc:83 plugin_eq_gui.cc:107
+#: plugin_eq_gui.cc:93 plugin_eq_gui.cc:117
 msgid "dB scale"
 msgstr "Масштаб в  Дб"
 
-#: plugin_eq_gui.cc:114
+#: plugin_eq_gui.cc:124
 msgid "Show phase"
 msgstr "Показывать фазу"
 
-#: plugin_selector.cc:54 plugin_selector.cc:311
+#: plugin_pin_dialog.cc:55
+msgid "Manual Config"
+msgstr "Настройка вручную"
+
+#: plugin_pin_dialog.cc:56
+msgid "Sidechain"
+msgstr "Боковая цепь"
+
+#: plugin_pin_dialog.cc:57 plugin_pin_dialog.cc:59 plugin_pin_dialog.cc:61
+#: plugin_pin_dialog.cc:63 plugin_pin_dialog.cc:65 step_entry.cc:81
+#: step_entry.cc:84
+msgid "+"
+msgstr "+"
+
+#: plugin_pin_dialog.cc:58 plugin_pin_dialog.cc:60 plugin_pin_dialog.cc:62
+#: plugin_pin_dialog.cc:64 plugin_pin_dialog.cc:66
+msgid "-"
+msgstr ""
+
+#: plugin_pin_dialog.cc:148
+msgid "Audio Input Pins"
+msgstr ""
+
+#: plugin_pin_dialog.cc:157
+msgid "MIDI Input Pins"
+msgstr "MIDI-порты входа"
+
+#: plugin_pin_dialog.cc:166
+msgid "Instances"
+msgstr "Экземпляры"
+
+#: plugin_pin_dialog.cc:176
+msgid "Audio Out"
+msgstr "Аудиовыход"
+
+#: plugin_pin_dialog.cc:185
+msgid "MIDI Out"
+msgstr "MIDI-выход"
+
+#: plugin_pin_dialog.cc:192
+msgid "Output Presets"
+msgstr "Предустановки выхода"
+
+#: plugin_pin_dialog.cc:208
+msgid "Add Sidechain Input"
+msgstr "Добавить вход боковой цепи"
+
+#: plugin_pin_dialog.cc:478 plugin_pin_dialog.cc:482 plugin_pin_dialog.cc:486
+#: plugin_setup_dialog.cc:115 plugin_setup_dialog.cc:199
+msgid "Automatic"
+msgstr "Автоматически"
+
+#: plugin_pin_dialog.cc:515 plugin_setup_dialog.cc:208
+msgid "%1 Channel"
+msgid_plural "%1 Channels"
+msgstr[0] "%1 канал"
+msgstr[1] "%1 канала"
+msgstr[2] "%1 каналов"
+
+#: plugin_pin_dialog.cc:641 processor_box.cc:224
+msgid "Send"
+msgstr "Послать"
+
+#: plugin_pin_dialog.cc:997
+msgid "Latency %1 spl%2 %3"
+msgstr ""
+
+#: plugin_pin_dialog.cc:997 plugin_pin_dialog.cc:1001
+msgid "no-inplace"
+msgstr ""
+
+#: plugin_pin_dialog.cc:999
+msgid "Latency %1 spl"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1055
+msgid "Instance #%1"
+msgstr "Экземпляр #%1"
+
+#: plugin_pin_dialog.cc:1700 processor_box.cc:2520
+msgid "Cannot set up new send: %1"
+msgstr "Невозможно настроить новый посыл: %1"
+
+#: plugin_pin_dialog.cc:1707
+msgid "SC %1 (%2)"
+msgstr "БЦ %1 (%2)"
+
+#: plugin_pin_dialog.cc:1963 plugin_pin_dialog.cc:1971
+msgid "Pin Configuration: %1"
+msgstr "Порты плагина: %1"
+
+#: plugin_setup_dialog.cc:30
+msgid "Plugin Setup"
+msgstr "Настройка плагина"
+
+#: plugin_setup_dialog.cc:33
+msgid "Copy I/O Map"
+msgstr "Скопировать конфигурацию входа-выхода"
+
+#: plugin_setup_dialog.cc:50
+msgid "An Instrument plugin is already present."
+msgstr "Виртуальный инструмент уже добавлен."
+
+#: plugin_setup_dialog.cc:54
+msgid "Replace"
+msgstr "Заменить"
+
+#: plugin_setup_dialog.cc:60
+msgid "with"
+msgstr "на"
+
+#: plugin_setup_dialog.cc:70
+msgid "I/O Pin Mapping"
+msgstr "Конфигурация портов плагина"
+
+#: plugin_setup_dialog.cc:79
+msgid "Configure Plugin '%1'"
+msgstr "Настроить плагин '%1'"
+
+#: plugin_setup_dialog.cc:90
+msgid "Output Configuration"
+msgstr "Настройка выхода"
+
+#: plugin_selector.cc:54 plugin_selector.cc:322
 msgid "Name contains"
 msgstr "Название содержит"
 
-#: plugin_selector.cc:55 plugin_selector.cc:315
+#: plugin_selector.cc:55 plugin_selector.cc:326
 msgid "Type contains"
 msgstr "Тип содержит"
 
-#: plugin_selector.cc:56 plugin_selector.cc:313
+#: plugin_selector.cc:56 plugin_selector.cc:324
 msgid "Category contains"
 msgstr "Название категории содержит"
 
-#: plugin_selector.cc:57 plugin_selector.cc:335
+#: plugin_selector.cc:57 plugin_selector.cc:349
 msgid "Author contains"
 msgstr "Имя автора содержит"
 
-#: plugin_selector.cc:58 plugin_selector.cc:337
+#: plugin_selector.cc:58 plugin_selector.cc:351
 msgid "Library contains"
 msgstr "Библиотека содержит"
 
-#: plugin_selector.cc:59 plugin_selector.cc:267 plugin_selector.cc:613
+#: plugin_selector.cc:59 plugin_selector.cc:278 plugin_selector.cc:639
 msgid "Favorites only"
 msgstr "Только любимые"
 
-#: plugin_selector.cc:60 plugin_selector.cc:271 plugin_selector.cc:613
+#: plugin_selector.cc:60 plugin_selector.cc:282 plugin_selector.cc:639
 msgid "Hidden only"
 msgstr "Только скрытые"
 
@@ -9086,16 +10098,16 @@ msgstr ""
 msgid "Filter"
 msgstr "Фильтр"
 
-#: plugin_selector.cc:221
+#: plugin_selector.cc:232
 msgid "Insert Plugin(s)"
 msgstr "Вставить плагины"
 
-#: plugin_selector.cc:419 plugin_selector.cc:420 plugin_selector.cc:421
-#: plugin_selector.cc:422
+#: plugin_selector.cc:439 plugin_selector.cc:440 plugin_selector.cc:441
+#: plugin_selector.cc:442
 msgid "variable"
 msgstr "Переменная"
 
-#: plugin_selector.cc:572
+#: plugin_selector.cc:598
 msgid ""
 "The plugin \"%1\" could not be loaded\n"
 "\n"
@@ -9105,38 +10117,38 @@ msgstr ""
 "\n"
 "Смотреть окно отчёта для большей информации (возможно)"
 
-#: plugin_selector.cc:730
+#: plugin_selector.cc:757
 msgid "Favorites"
 msgstr "Избранные"
 
-#: plugin_selector.cc:732
+#: plugin_selector.cc:759
 msgid "Plugin Manager..."
 msgstr "Управление плагинами..."
 
-#: plugin_selector.cc:736
+#: plugin_selector.cc:763
 msgid "By Creator"
 msgstr "По создателю"
 
-#: plugin_selector.cc:739
+#: plugin_selector.cc:766
 msgid "By Category"
 msgstr "По категории"
 
-#: plugin_ui.cc:113
+#: plugin_ui.cc:115
 msgid "Eh? LADSPA plugins don't have editors!"
 msgstr "У плагинов LADSPA нет собственного интерфейса."
 
-#: plugin_ui.cc:122 plugin_ui.cc:227
+#: plugin_ui.cc:124 plugin_ui.cc:229
 msgid ""
 "unknown type of editor-supplying plugin (note: no VST support in this "
 "version of %1)"
 msgstr ""
 "Неизвестный тип редактора плагина (примечание: нет поддержки VST в версии %1)"
 
-#: plugin_ui.cc:125
+#: plugin_ui.cc:127
 msgid "unknown type of editor-supplying plugin"
 msgstr "неизвестный тип редактора плагина"
 
-#: plugin_ui.cc:257
+#: plugin_ui.cc:259
 msgid ""
 "unknown type of editor-supplying plugin (note: no linuxVST support in this "
 "version of %1)"
@@ -9144,23 +10156,23 @@ msgstr ""
 "Неизвестный тип редактора плагина (примечание: нет поддержки linuxVST в этой "
 "версии %1)"
 
-#: plugin_ui.cc:329
+#: plugin_ui.cc:331
 msgid "create_lv2_editor called on non-LV2 plugin"
 msgstr "Редактор создания lv2, называемый не-LV2 плагин"
 
-#: plugin_ui.cc:418
+#: plugin_ui.cc:419
 msgid "Add"
 msgstr "Добавить"
 
-#: plugin_ui.cc:423
+#: plugin_ui.cc:425
 msgid "Description"
 msgstr "Описание"
 
-#: plugin_ui.cc:424
+#: plugin_ui.cc:426
 msgid "Plugin analysis"
 msgstr "Частотный анализ плагина"
 
-#: plugin_ui.cc:431
+#: plugin_ui.cc:433
 msgid ""
 "Presets (if any) for this plugin\n"
 "(Both factory and user-created)"
@@ -9168,28 +10180,32 @@ msgstr ""
 "Все доступные профили этого плагина,\n"
 "как «заводские», так и собственные"
 
-#: plugin_ui.cc:432
+#: plugin_ui.cc:434
 msgid "Save a new preset"
 msgstr "Сохранить новый профиль"
 
-#: plugin_ui.cc:433
+#: plugin_ui.cc:435
 msgid "Save the current preset"
 msgstr "Сохранить текущий профиль"
 
-#: plugin_ui.cc:434
+#: plugin_ui.cc:436
 msgid "Delete the current preset"
 msgstr "Удалить текущий профиль"
 
-#: plugin_ui.cc:435
+#: plugin_ui.cc:437
 msgid ""
 "Reset parameters to default (if no parameters are in automation play mode)"
 msgstr ""
 
-#: plugin_ui.cc:436
+#: plugin_ui.cc:439
+msgid "Show Plugin Pin Management Dialog"
+msgstr "Показать диалог настройки портов плагина"
+
+#: plugin_ui.cc:441
 msgid "Disable signal processing by the plugin"
 msgstr "Выключить обработку сигнала этим плагином"
 
-#: plugin_ui.cc:473 plugin_ui.cc:685
+#: plugin_ui.cc:480 plugin_ui.cc:699
 msgid ""
 "Click to allow the plugin to receive keyboard events that %1 would normally "
 "use as a shortcut"
@@ -9197,26 +10213,26 @@ msgstr ""
 "Щёлкните, чтобы разрешить этому плагину получать клавиатурные события, "
 "которые %1 обычно использует как горячие клавиши"
 
-#: plugin_ui.cc:474
+#: plugin_ui.cc:481
 msgid "Click to enable/disable this plugin"
 msgstr "Щелкните, чтобы включить или отключить этот плагин"
 
-#: plugin_ui.cc:517
+#: plugin_ui.cc:524
 msgid "latency (%1 sample)"
 msgid_plural "latency (%1 samples)"
 msgstr[0] "Задержка (%1 сэмпл)"
 msgstr[1] "Задержка (%1 сэмпла)"
 msgstr[2] "Задержка (%1 сэмплов)"
 
-#: plugin_ui.cc:519
+#: plugin_ui.cc:526
 msgid "latency (%1 ms)"
 msgstr "Задержка (%1 мс)"
 
-#: plugin_ui.cc:530
+#: plugin_ui.cc:537
 msgid "Edit Latency"
 msgstr "Изменить задержку"
 
-#: plugin_ui.cc:576
+#: plugin_ui.cc:583
 msgid ""
 "Plugin presets are not supported in this build of %1. Consider paying for a "
 "full version"
@@ -9224,7 +10240,7 @@ msgstr ""
 "Пресеты плагинов не поддерживаются в этой сборке %1. Рассмотрите оплату за "
 "полную версию"
 
-#: plugin_ui.cc:584
+#: plugin_ui.cc:591
 msgid ""
 "Plugin presets are not supported in this build, see the Log window for more "
 "information."
@@ -9232,16 +10248,16 @@ msgstr ""
 "В этой сборке нет поддержки предустановок плагинов. См. подробнее в окне "
 "журнала."
 
-#: plugin_ui.cc:592
+#: plugin_ui.cc:599
 msgid "New Preset"
 msgstr "Создать профиль"
 
-#: plugin_ui.cc:692
+#: plugin_ui.cc:706
 msgid "Click to allow normal use of %1 keyboard shortcuts"
 msgstr ""
 "Щёлкните, чтобы переключиться на обычное использование горячих клавиш %1"
 
-#: plugin_ui.cc:789
+#: plugin_ui.cc:813
 msgid "(none)"
 msgstr "(нет)"
 
@@ -9265,63 +10281,47 @@ msgstr "Прочее"
 msgid "Other"
 msgstr "Прочее"
 
-#: port_group.cc:434 port_group.cc:435
+#: port_group.cc:435 port_group.cc:436
 msgid "LTC Out"
 msgstr "LTC Out"
 
-#: port_group.cc:438 port_group.cc:439
+#: port_group.cc:439 port_group.cc:440
 msgid "LTC In"
 msgstr "LTC In"
 
-#: port_group.cc:473
+#: port_group.cc:474
 msgid "MTC in"
 msgstr "MTC in"
 
-#: port_group.cc:476
+#: port_group.cc:477
 msgid "MIDI control in"
 msgstr "MIDI control in"
 
-#: port_group.cc:479
+#: port_group.cc:480
 msgid "MIDI clock in"
 msgstr "MIDI clock in"
 
-#: port_group.cc:482
+#: port_group.cc:483
 msgid "MMC in"
 msgstr "MMC in"
 
-#: port_group.cc:486
+#: port_group.cc:487
 msgid "MTC out"
 msgstr "MTC out"
 
-#: port_group.cc:489
+#: port_group.cc:490
 msgid "MIDI control out"
 msgstr "MIDI control out"
 
-#: port_group.cc:492
+#: port_group.cc:493
 msgid "MIDI clock out"
 msgstr "MIDI clock out"
 
-#: port_group.cc:495
+#: port_group.cc:496
 msgid "MMC out"
 msgstr "MMC out"
 
-#: port_group.cc:543
-msgid ":monitor"
-msgstr ": монитор"
-
-#: port_group.cc:559
-msgid "system:"
-msgstr "Система:"
-
-#: port_group.cc:560
-msgid "alsa_pcm:"
-msgstr "alsa_pcm:"
-
-#: port_group.cc:561
-msgid "alsa_midi:"
-msgstr "alsa_midi:"
-
-#: port_group.cc:566
+#: port_group.cc:579
 msgid "Scene "
 msgstr "Сцена"
 
@@ -9385,42 +10385,36 @@ msgid "Flip"
 msgstr "Повернуть матрицу"
 
 #: port_matrix.cc:732
-msgid ""
-"It is not possible to add a port here, as the first processor in the track "
-"or buss cannot support the new configuration."
+msgid "It is not possible to add a port here."
 msgstr ""
-"Невозможно добавить сюда порт, поскольку первый обработчик дорожки или шины "
-"не может поддерживать новую конфигурацию."
 
-#: port_matrix.cc:735
+#: port_matrix.cc:733
 msgid "Cannot add port"
 msgstr "Невозможно добавить порт"
 
 #: port_matrix.cc:757
+msgid "The last port cannot be removed"
+msgstr "Последний порт не может быть удалён"
+
+#: port_matrix.cc:760
+msgid "This port cannot be removed."
+msgstr "Этот порт не может быть удалён."
+
+#: port_matrix.cc:765
 msgid "Port removal not allowed"
 msgstr "Удаление портов не разрешено"
 
-#: port_matrix.cc:758
-msgid ""
-"This port cannot be removed.\n"
-"Either the first plugin in the track or buss cannot accept\n"
-"the new number of inputs or the last plugin has more outputs."
-msgstr ""
-"Этот порт не может быть удален.\n"
-"Либо первый плагин в дорожке или шине не может принять новое\n"
-"количество входов, либо у последнего плагина больше выходов."
-
-#: port_matrix.cc:975
+#: port_matrix.cc:981
 #, c-format
 msgid "Remove '%s'"
 msgstr "Удалить '%s'"
 
-#: port_matrix.cc:990
+#: port_matrix.cc:996
 #, c-format
 msgid "%s all from '%s'"
 msgstr "%s все из '%s'"
 
-#: port_matrix.cc:1056 transform_dialog.cc:62
+#: port_matrix.cc:1062 transform_dialog.cc:62
 msgid "channel"
 msgstr "Канал"
 
@@ -9432,19 +10426,15 @@ msgstr "Нет доступных портов."
 msgid "There are no %1 ports to connect."
 msgstr "Нет соединяемых портов %1."
 
-#: processor_box.cc:169
-msgid "Send"
-msgstr "Послать"
-
-#: processor_box.cc:171
+#: processor_box.cc:226
 msgid "Return"
 msgstr "Возврат"
 
-#: processor_box.cc:239
+#: processor_box.cc:323
 msgid "New Favorite Preset for \"%1\""
 msgstr "Новая избранная предустановка для \"%1\""
 
-#: processor_box.cc:414
+#: processor_box.cc:501
 msgid ""
 "\n"
 "This mono plugin has been replicated %1 times."
@@ -9452,7 +10442,7 @@ msgstr ""
 "\n"
 "Этот моноплагин был копирован %1 раз."
 
-#: processor_box.cc:418
+#: processor_box.cc:505 processor_box.cc:1528
 msgid ""
 "<b>%1</b>\n"
 "Double-click to show GUI.\n"
@@ -9462,7 +10452,7 @@ msgstr ""
 "Двойной щелчок открывает интерфейс плагина.\n"
 "%2+двойной щелчок открывает рисуемый хостом интерфейс.%3"
 
-#: processor_box.cc:421
+#: processor_box.cc:508 processor_box.cc:1531
 msgid ""
 "<b>%1</b>\n"
 "Double-click to show generic GUI.%2"
@@ -9470,7 +10460,7 @@ msgstr ""
 "<b>%1</b>\n"
 "Двойной щелчок, чтобы показать общий GUI.%2"
 
-#: processor_box.cc:427
+#: processor_box.cc:514
 msgid ""
 "<b>%1</b>\n"
 "The Plugin is not available on this system\n"
@@ -9480,32 +10470,36 @@ msgstr ""
 "Этот плагин недоступен в \n"
 "системе и заменён на заглушку."
 
-#: processor_box.cc:470
+#: processor_box.cc:600
 #, c-format
 msgid "(%1x1) "
 msgstr "(%1x1) "
 
-#: processor_box.cc:546
+#: processor_box.cc:695
+msgid "Inline Display"
+msgstr ""
+
+#: processor_box.cc:703
 msgid "Show All Controls"
 msgstr "Показать все регуляторы"
 
-#: processor_box.cc:550
+#: processor_box.cc:707
 msgid "Hide All Controls"
 msgstr "Скрыть все регуляторы"
 
-#: processor_box.cc:584
+#: processor_box.cc:752
 msgid "Link panner controls"
 msgstr "Связать регуляторы панорамирования"
 
-#: processor_box.cc:691
+#: processor_box.cc:859
 msgid "on"
 msgstr "Вкл"
 
-#: processor_box.cc:691 rc_option_editor.cc:2978 rc_option_editor.cc:2992
+#: processor_box.cc:859 rc_option_editor.cc:3185 rc_option_editor.cc:3199
 msgid "off"
 msgstr "Выкл"
 
-#: processor_box.cc:1177
+#: processor_box.cc:1819
 msgid ""
 "Right-click to add/remove/edit\n"
 "plugins,inserts,sends and more"
@@ -9513,22 +10507,22 @@ msgstr ""
 "Щелчком правой клавишей мыши можно добавлять, \n"
 "изменять и удалять плагины, посылы, возвраты и пр."
 
-#: processor_box.cc:1326
+#: processor_box.cc:1968
 msgid ""
 "Processor Drag/Drop failed. Probably because\n"
 "the I/O configuration of the plugins could\n"
 "not match the configuration of this track."
 msgstr ""
 
-#: processor_box.cc:1769 processor_box.cc:2164
+#: processor_box.cc:2455 processor_box.cc:2998
 msgid "Plugin Incompatibility"
 msgstr "Несовместимость плагинов"
 
-#: processor_box.cc:1772
+#: processor_box.cc:2458
 msgid "You attempted to add the plugin \"%1\" in slot %2.\n"
 msgstr "Вы пытались добавить плагин \"%1\" в слот %2.\n"
 
-#: processor_box.cc:1778
+#: processor_box.cc:2464
 msgid ""
 "\n"
 "This plugin has:\n"
@@ -9536,21 +10530,21 @@ msgstr ""
 "\n"
 "У этого плагина:\n"
 
-#: processor_box.cc:1781
+#: processor_box.cc:2467
 msgid "\t%1 MIDI input\n"
 msgid_plural "\t%1 MIDI inputs\n"
 msgstr[0] "\t%1 MIDI-вход\n"
 msgstr[1] "\t%1 MIDI-входа\n"
 msgstr[2] "\t%1 MIDI-входов\n"
 
-#: processor_box.cc:1785
+#: processor_box.cc:2471
 msgid "\t%1 audio input\n"
 msgid_plural "\t%1 audio inputs\n"
 msgstr[0] "\t%1 звуковой вход\n"
 msgstr[1] "\t%1 звуковых входа\n"
 msgstr[2] "\t%1 звуковых входов\n"
 
-#: processor_box.cc:1788
+#: processor_box.cc:2474
 msgid ""
 "\n"
 "but at the insertion point, there are:\n"
@@ -9558,21 +10552,21 @@ msgstr ""
 "\n"
 "но в точке вставки сейчас:\n"
 
-#: processor_box.cc:1791
+#: processor_box.cc:2477
 msgid "\t%1 MIDI channel\n"
 msgid_plural "\t%1 MIDI channels\n"
 msgstr[0] "\t%1 MIDI-канал\n"
 msgstr[1] "\t%1 MIDI-канала\n"
 msgstr[2] "\t%1 MIDI-каналов\n"
 
-#: processor_box.cc:1795
+#: processor_box.cc:2481
 msgid "\t%1 audio channel\n"
 msgid_plural "\t%1 audio channels\n"
 msgstr[0] "\t%1 звуковой канал\n"
 msgstr[1] "\t%1 звуковых канала\n"
 msgstr[2] "\t%1 звуковых каналов\n"
 
-#: processor_box.cc:1798
+#: processor_box.cc:2484
 msgid ""
 "\n"
 "%1 is unable to insert this plugin here.\n"
@@ -9580,11 +10574,7 @@ msgstr ""
 "\n"
 "%1 не может вставить сюда этот плагин.\n"
 
-#: processor_box.cc:1835
-msgid "Cannot set up new send: %1"
-msgstr "Невозможно настроить новый посыл: %1"
-
-#: processor_box.cc:2167
+#: processor_box.cc:3001
 msgid ""
 "You cannot reorder these plugins/sends/inserts\n"
 "in that way because the inputs and\n"
@@ -9594,20 +10584,20 @@ msgstr ""
 "посылы и возвраты подобным образом, поскольку \n"
 "входы и выходы перестанут корректно работать."
 
-#: processor_box.cc:2367
+#: processor_box.cc:3201
 msgid "Rename Processor"
 msgstr "Переименовать обработчик"
 
-#: processor_box.cc:2398
+#: processor_box.cc:3232
 msgid "At least 100 IO objects exist with a name like %1 - name not changed"
 msgstr ""
 "Существует по крайней мере 100 объектов IO с именем, как %1 - имя не изменено"
 
-#: processor_box.cc:2536
+#: processor_box.cc:3383
 msgid "plugin insert constructor failed"
 msgstr "Сбой конструктора вставки плагина"
 
-#: processor_box.cc:2547
+#: processor_box.cc:3394
 msgid ""
 "Copying the set of processors on the clipboard failed,\n"
 "probably because the I/O configuration of the plugins\n"
@@ -9617,7 +10607,7 @@ msgstr ""
 "буфер обмена. Вероятно, конфигурация входа и выхода\n"
 "плагинов не совпала с конфигурацией этой дорожки."
 
-#: processor_box.cc:2593
+#: processor_box.cc:3440
 msgid ""
 "Do you really want to remove all processors from %1?\n"
 "(this cannot be undone)"
@@ -9626,15 +10616,15 @@ msgstr ""
 "обработчики из \"%1\" ?\n"
 "(отмена невозможна)"
 
-#: processor_box.cc:2597 processor_box.cc:2622
+#: processor_box.cc:3444 processor_box.cc:3469
 msgid "Yes, remove them all"
 msgstr "Да, удалить их все"
 
-#: processor_box.cc:2599 processor_box.cc:2624
+#: processor_box.cc:3446 processor_box.cc:3471
 msgid "Remove processors"
 msgstr "Удалить обработчики"
 
-#: processor_box.cc:2614
+#: processor_box.cc:3461
 msgid ""
 "Do you really want to remove all pre-fader processors from %1?\n"
 "(this cannot be undone)"
@@ -9643,7 +10633,7 @@ msgstr ""
 "предфейдерные обработчики из \"%1\" ?\n"
 "(отмена невозможна)"
 
-#: processor_box.cc:2617
+#: processor_box.cc:3464
 msgid ""
 "Do you really want to remove all post-fader processors from %1?\n"
 "(this cannot be undone)"
@@ -9652,59 +10642,59 @@ msgstr ""
 "послефейдерные обработчики из \"%1\" ?\n"
 "(отмена невозможна)"
 
-#: processor_box.cc:2805
+#: processor_box.cc:3653
 msgid "New Plugin"
 msgstr "Добавить плагин"
 
-#: processor_box.cc:2808
+#: processor_box.cc:3656
 msgid "New Insert"
 msgstr "Добавить возврат"
 
-#: processor_box.cc:2811
+#: processor_box.cc:3659
 msgid "New External Send ..."
 msgstr "Добавить внешний посыл с портом JACK..."
 
-#: processor_box.cc:2815
+#: processor_box.cc:3663
 msgid "New Aux Send ..."
 msgstr "Добавить внешний посыл без порта JACK..."
 
-#: processor_box.cc:2818
+#: processor_box.cc:3666
 msgid "Send Options"
 msgstr "Параметры отправки"
 
-#: processor_box.cc:2820
+#: processor_box.cc:3668
 msgid "Clear (all)"
 msgstr "Очистить (всё)"
 
-#: processor_box.cc:2822
+#: processor_box.cc:3670
 msgid "Clear (pre-fader)"
 msgstr "Очистить (до фейдера)"
 
-#: processor_box.cc:2824
+#: processor_box.cc:3672
 msgid "Clear (post-fader)"
 msgstr "Очистить (после фейдера)"
 
-#: processor_box.cc:2846
+#: processor_box.cc:3702
 msgid "Activate All"
 msgstr "Активировать все"
 
-#: processor_box.cc:2848
+#: processor_box.cc:3704
 msgid "Deactivate All"
 msgstr "Деактивировать все"
 
-#: processor_box.cc:2850
+#: processor_box.cc:3706
 msgid "A/B Plugins"
 msgstr "Отключить все"
 
-#: processor_box.cc:2859
+#: processor_box.cc:3719
 msgid "Edit with generic controls..."
 msgstr "Изменить с интерфейсом хоста..."
 
-#: processor_box.cc:3162
+#: processor_box.cc:4051
 msgid "%1: %2 (by %3)"
 msgstr "%1: %2 (автор — %3)"
 
-#: processor_box.cc:3164
+#: processor_box.cc:4053
 msgid "%1 (by %2)"
 msgstr "%1 (на %2)"
 
@@ -9732,292 +10722,296 @@ msgstr "Банк"
 msgid "main grid"
 msgstr "Основная сетка"
 
-#: quantize_dialog.cc:52 quantize_dialog.cc:109
+#: quantize_dialog.cc:61 quantize_dialog.cc:118
 msgid "Quantize"
 msgstr "Квантование"
 
-#: quantize_dialog.cc:56
+#: quantize_dialog.cc:65
 msgid "Strength"
 msgstr "Сила"
 
-#: quantize_dialog.cc:59
+#: quantize_dialog.cc:68
 msgid "Swing"
 msgstr "Свинг"
 
-#: quantize_dialog.cc:62
+#: quantize_dialog.cc:71
 msgid "Threshold (ticks)"
 msgstr "Порог (в тиках)"
 
-#: quantize_dialog.cc:63
+#: quantize_dialog.cc:72
 msgid "Snap note start"
 msgstr "Начало привязки ноты"
 
-#: quantize_dialog.cc:64
+#: quantize_dialog.cc:73
 msgid "Snap note end"
 msgstr "Конец привязки ноты"
 
-#: rc_option_editor.cc:81 rc_option_editor.cc:82
+#: rc_option_editor.cc:83 rc_option_editor.cc:84 rc_option_editor.cc:1550
 msgid "Browse..."
 msgstr "Просмотр..."
 
-#: rc_option_editor.cc:87
+#: rc_option_editor.cc:89
 msgid "Emphasis on first beat:"
 msgstr "Усиление на первой доле:"
 
-#: rc_option_editor.cc:93
+#: rc_option_editor.cc:95
 msgid "Use default Click:"
 msgstr "Использовать обычный щелчок:"
 
-#: rc_option_editor.cc:99
+#: rc_option_editor.cc:101
 msgid "Click audio file:"
 msgstr "Файл щелчка доли:"
 
-#: rc_option_editor.cc:106
+#: rc_option_editor.cc:108
 msgid "Click emphasis audio file:"
 msgstr "Файл щелчка сильной доли:"
 
-#: rc_option_editor.cc:152
+#: rc_option_editor.cc:154
 msgid "Choose Click"
 msgstr "Выберите щелчок метронома"
 
-#: rc_option_editor.cc:175
+#: rc_option_editor.cc:177
 msgid "Choose Click Emphasis"
 msgstr "Выберите акцентирующий щелчок метронома"
 
-#: rc_option_editor.cc:236
+#: rc_option_editor.cc:238
 msgid "Limit undo history to"
 msgstr "Ограничивать историю действий"
 
-#: rc_option_editor.cc:237
+#: rc_option_editor.cc:239
 msgid "Save undo history of"
 msgstr "Ограничивать сохранение истории действий"
 
-#: rc_option_editor.cc:246 rc_option_editor.cc:253
+#: rc_option_editor.cc:248 rc_option_editor.cc:255
 msgid "commands"
 msgstr "командами"
 
-#: rc_option_editor.cc:376
+#: rc_option_editor.cc:378
 msgid ""
 "\n"
 "Changes to this setting will only persist after your project has been saved."
 msgstr ""
 
-#: rc_option_editor.cc:387 rc_option_editor.cc:449
+#: rc_option_editor.cc:389 rc_option_editor.cc:451
 msgid "<b>Recommended Setting: %1 + button 3 (right mouse button)</b>%2"
 msgstr "<b>Рекомендуется: %1 + клавиша 3 (правая клавиша мыши)</b>%2"
 
-#: rc_option_editor.cc:401
+#: rc_option_editor.cc:403
 msgid "Select Keyboard layout:"
 msgstr "Раскладка клавиатуры:"
 
-#: rc_option_editor.cc:420
+#: rc_option_editor.cc:422
 msgid "When Clicking:"
 msgstr "При щелчке:"
 
-#: rc_option_editor.cc:427
+#: rc_option_editor.cc:429
 msgid "Edit using:"
 msgstr "Редактировать с:"
 
-#: rc_option_editor.cc:433 rc_option_editor.cc:463 rc_option_editor.cc:493
+#: rc_option_editor.cc:435 rc_option_editor.cc:465 rc_option_editor.cc:495
 msgid "+ button"
 msgstr "+ клавиша"
 
-#: rc_option_editor.cc:457
+#: rc_option_editor.cc:459
 msgid "Delete using:"
 msgstr "Удалять с:"
 
-#: rc_option_editor.cc:479
+#: rc_option_editor.cc:481
 msgid "<b>Recommended Setting: %1 + button 1 (left mouse button)</b>%2"
 msgstr "<b>Рекомендуется: %1 + клавиша 1 (левая клавиша мыши)</b>%2"
 
-#: rc_option_editor.cc:487
+#: rc_option_editor.cc:489
 msgid "Insert note using:"
 msgstr "Вставлять ноты с:"
 
-#: rc_option_editor.cc:505
+#: rc_option_editor.cc:507
 msgid "When Beginning a Drag:"
 msgstr "В начале перетаскивания:"
 
-#: rc_option_editor.cc:516 rc_option_editor.cc:543 rc_option_editor.cc:576
-#: rc_option_editor.cc:597 rc_option_editor.cc:641 rc_option_editor.cc:674
-#: rc_option_editor.cc:700 rc_option_editor.cc:728 rc_option_editor.cc:757
-#: rc_option_editor.cc:779
+#: rc_option_editor.cc:518 rc_option_editor.cc:545 rc_option_editor.cc:578
+#: rc_option_editor.cc:599 rc_option_editor.cc:643 rc_option_editor.cc:676
+#: rc_option_editor.cc:702 rc_option_editor.cc:730 rc_option_editor.cc:759
+#: rc_option_editor.cc:781
 msgid "<b>Recommended Setting: %1</b>%2"
 msgstr "<b>Рекомендуется: %1</b>%2"
 
-#: rc_option_editor.cc:530
+#: rc_option_editor.cc:532
 msgid "Copy items using:"
 msgstr "Копировать объекты с:"
 
-#: rc_option_editor.cc:557
+#: rc_option_editor.cc:559
 msgid "Constrain drag using:"
 msgstr "Ограничить перемещение с:"
 
-#: rc_option_editor.cc:565
+#: rc_option_editor.cc:567
 msgid "When Beginning a Trim:"
-msgstr ""
+msgstr "В начале обрезки:"
 
-#: rc_option_editor.cc:584
+#: rc_option_editor.cc:586
 msgid "Trim contents using:"
 msgstr ""
 
-#: rc_option_editor.cc:605
+#: rc_option_editor.cc:607
 msgid "Anchored trim using:"
 msgstr ""
 
-#: rc_option_editor.cc:649
+#: rc_option_editor.cc:651
 msgid "Resize notes relatively using:"
 msgstr ""
 
-#: rc_option_editor.cc:658
+#: rc_option_editor.cc:660
 msgid "While Dragging:"
 msgstr "При перетаскивании:"
 
-#: rc_option_editor.cc:682
+#: rc_option_editor.cc:684
 msgid "Ignore snap using:"
 msgstr "Игнорировать привязку с:"
 
-#: rc_option_editor.cc:708
+#: rc_option_editor.cc:710
 msgid "Snap relatively using:"
 msgstr ""
 
-#: rc_option_editor.cc:716
+#: rc_option_editor.cc:718
 msgid "While Trimming:"
-msgstr ""
+msgstr "При обрезке:"
 
-#: rc_option_editor.cc:736
+#: rc_option_editor.cc:738
 msgid "Resize overlapped regions using:"
 msgstr ""
 
-#: rc_option_editor.cc:744
+#: rc_option_editor.cc:746
 msgid "While Dragging Control Points:"
 msgstr "При перетаскивании контрольных точек:"
 
-#: rc_option_editor.cc:765
+#: rc_option_editor.cc:767
 msgid "Fine adjust using:"
 msgstr ""
 
-#: rc_option_editor.cc:787
+#: rc_option_editor.cc:789
 msgid "Push points using:"
 msgstr ""
 
-#: rc_option_editor.cc:1027
+#: rc_option_editor.cc:1029
 msgid "GUI and Font scaling:"
 msgstr "Масштаб интерфейса и шрифта:"
 
-#: rc_option_editor.cc:1030
+#: rc_option_editor.cc:1032
 msgid "Default"
 msgstr "По умолчанию"
 
-#: rc_option_editor.cc:1056
+#: rc_option_editor.cc:1058
 msgid "Adjusting the scale requires an application restart to re-layout."
 msgstr ""
 
-#: rc_option_editor.cc:1098
+#: rc_option_editor.cc:1100
 msgid "∞"
 msgstr "∞"
 
-#: rc_option_editor.cc:1099
+#: rc_option_editor.cc:1101
 msgid "30 sec"
 msgstr "30 с"
 
-#: rc_option_editor.cc:1100
+#: rc_option_editor.cc:1102
 msgid "1 min"
 msgstr "1 мин"
 
-#: rc_option_editor.cc:1101
+#: rc_option_editor.cc:1103
 msgid "2 mins"
 msgstr "2 мин"
 
-#: rc_option_editor.cc:1102
+#: rc_option_editor.cc:1104
 msgid "3 mins"
 msgstr "3 мин"
 
-#: rc_option_editor.cc:1103
+#: rc_option_editor.cc:1105
 msgid "4 mins"
 msgstr "4 мин"
 
-#: rc_option_editor.cc:1104
+#: rc_option_editor.cc:1106
 msgid "5 mins"
 msgstr "5 мин"
 
-#: rc_option_editor.cc:1107
+#: rc_option_editor.cc:1109
 msgid ""
 "Specify the default timeout for plugin instantiation. Plugins that require "
 "more time to load will be blacklisted. A value of 0 disables the timeout."
 msgstr ""
 
-#: rc_option_editor.cc:1109
+#: rc_option_editor.cc:1111
 msgid "Scan Time Out:"
 msgstr "Как быстро прекратить сканирование, если нет результатов:"
 
-#: rc_option_editor.cc:1157
+#: rc_option_editor.cc:1159
 msgid "Waveform Clip Level (dBFS):"
 msgstr "Уровень обрезки волновой формы (dBFS):"
 
-#: rc_option_editor.cc:1210
+#: rc_option_editor.cc:1212
 msgid "Small sessions (4-16 tracks)"
 msgstr "Небольшие сессии (4—16 дорожек)"
 
-#: rc_option_editor.cc:1211
+#: rc_option_editor.cc:1213
 msgid "Medium sessions (16-64 tracks)"
 msgstr "Средние сессии (16—64 дорожек)"
 
-#: rc_option_editor.cc:1212
+#: rc_option_editor.cc:1214
 msgid "Large sessions (64+ tracks)"
 msgstr "Большие сессии (от 64 дорожек и больше)"
 
-#: rc_option_editor.cc:1213
+#: rc_option_editor.cc:1215
 msgid "Custom (set by sliders below)"
 msgstr ""
 
-#: rc_option_editor.cc:1217 export_video_dialog.cc:167
+#: rc_option_editor.cc:1219 export_video_dialog.cc:167
 msgid "Preset:"
 msgstr "Профиль:"
 
-#: rc_option_editor.cc:1229
+#: rc_option_editor.cc:1231
 msgid "Playback (seconds of buffering):"
 msgstr "Воспроизведение (в секундах буферизации):"
 
-#: rc_option_editor.cc:1242
+#: rc_option_editor.cc:1244
 msgid "Recording (seconds of buffering):"
 msgstr "Запись (в секундах буферизации):"
 
-#: rc_option_editor.cc:1320
+#: rc_option_editor.cc:1322
 msgid "programming error: unknown buffering preset string, index = %1"
 msgstr ""
 
-#: rc_option_editor.cc:1352
+#: rc_option_editor.cc:1353
 msgid "Control Surface Protocol"
 msgstr "Устройства управления"
 
-#: rc_option_editor.cc:1366
+#: rc_option_editor.cc:1367
 msgid ""
 "Click to edit the settings for selected protocol ( it must be ENABLED "
 "first ):"
 msgstr "Нажмите для настройки управления (протокол должен быть включен):"
 
-#: rc_option_editor.cc:1370
+#: rc_option_editor.cc:1371
 msgid "Show Protocol Settings"
 msgstr "Показать параметры протокола"
 
-#: rc_option_editor.cc:1493
+#: rc_option_editor.cc:1494
 msgid "Configuration"
 msgstr "Настройка"
 
-#: rc_option_editor.cc:1546
+#: rc_option_editor.cc:1547
 msgid "Show Video Export Info before export"
 msgstr "Показывать диалог со справкой об экспорте видео"
 
-#: rc_option_editor.cc:1547
+#: rc_option_editor.cc:1548
 msgid "Show Video Server Startup Dialog"
 msgstr "Показывать диалог с параметрами видеосервера"
 
-#: rc_option_editor.cc:1548
+#: rc_option_editor.cc:1549
 msgid "Advanced Setup (remote video server)"
 msgstr "Дополнительные параметры удалённого видеосервера"
 
 #: rc_option_editor.cc:1556
+msgid "Video Server"
+msgstr "Видеосервер"
+
+#: rc_option_editor.cc:1565
 msgid ""
 "<b>When enabled</b> you can speficify a custom video-server URL and docroot. "
 "- Do not enable this option unless you know what you are doing."
@@ -10026,11 +11020,11 @@ msgstr ""
 "корневой каталог данных. Не используйте эту функцию, если точно не знаете, "
 "что делаете."
 
-#: rc_option_editor.cc:1558
+#: rc_option_editor.cc:1567
 msgid "Video Server URL:"
 msgstr "URL видеосервера:"
 
-#: rc_option_editor.cc:1563
+#: rc_option_editor.cc:1572
 msgid ""
 "Base URL of the video-server including http prefix. This is usually 'http://"
 "hostname.example.org:1554/' and defaults to 'http://localhost:1554/' when "
@@ -10040,11 +11034,11 @@ msgstr ""
 "example.org: 1554/' и по умолчанию 'http://localhost:1554/', когда "
 "видеосервер работает локально"
 
-#: rc_option_editor.cc:1565
+#: rc_option_editor.cc:1574
 msgid "Video Folder:"
 msgstr "Папка с видео:"
 
-#: rc_option_editor.cc:1570
+#: rc_option_editor.cc:1579
 msgid ""
 "Local path to the video-server document-root. Only files below this "
 "directory will be accessible by the video-server. If the server run on a "
@@ -10059,7 +11053,7 @@ msgstr ""
 "используется для местного видео - просмотра и выбора файлов при открытии/"
 "добавлении видеофайла."
 
-#: rc_option_editor.cc:1577
+#: rc_option_editor.cc:1584
 msgid ""
 "<b>When enabled</b> an information window with details is displayed before "
 "the video-export dialog."
@@ -10067,7 +11061,7 @@ msgstr ""
 "<b>Когда включено,</b> перед экспортом видео показывается окно со справочной "
 "информацией"
 
-#: rc_option_editor.cc:1582
+#: rc_option_editor.cc:1589
 msgid ""
 "<b>When enabled</b> the video server is never launched automatically without "
 "confirmation"
@@ -10075,91 +11069,123 @@ msgstr ""
 "<b>Если включено,</b> видеосервер никогда автоматически не запускается без "
 "подтверждения"
 
-#: rc_option_editor.cc:1723
+#: rc_option_editor.cc:1598
+msgid "Custom Path to Video Monitor (%1) - leave empty for default:"
+msgstr ""
+"Другой каталог с приложением видеомониторинга (%1) — не заполнять, если всё "
+"и так работает:"
+
+#: rc_option_editor.cc:1610
+msgid ""
+"Set a custom path to the Video Monitor Executable, changing this requires a "
+"restart."
+msgstr ""
+
+#: rc_option_editor.cc:1661
+msgid "Set Video Monitor Executable"
+msgstr ""
+
+#: rc_option_editor.cc:1734
+msgid "Column %1"
+msgstr "Столбец %1"
+
+#: rc_option_editor.cc:1852
 msgid "%1 Preferences"
 msgstr "Параметры %1"
 
-#: rc_option_editor.cc:1734
+#: rc_option_editor.cc:1874 rc_option_editor.cc:1892 rc_option_editor.cc:1895
+#: rc_option_editor.cc:1897 rc_option_editor.cc:1899 rc_option_editor.cc:1907
+#: rc_option_editor.cc:1909 rc_option_editor.cc:1917 rc_option_editor.cc:1925
+#: rc_option_editor.cc:1932 rc_option_editor.cc:1953 rc_option_editor.cc:1955
+#: rc_option_editor.cc:1964 session_option_editor.cc:342
+#: session_option_editor.cc:344 session_option_editor.cc:365
+#: session_option_editor.cc:367 session_option_editor.cc:369
+#: session_option_editor.cc:376 session_option_editor.cc:383
+#: session_option_editor.cc:387
+msgid "Misc"
+msgstr "Прочее"
+
+#: rc_option_editor.cc:1874
 msgid "DSP CPU Utilization"
 msgstr "Использование ЦП"
 
-#: rc_option_editor.cc:1738
+#: rc_option_editor.cc:1878
 msgid "Signal processing uses"
 msgstr "При обработке используются"
 
-#: rc_option_editor.cc:1743
+#: rc_option_editor.cc:1883
 msgid "all but one processor"
 msgstr "Все процессоры кроме одного"
 
-#: rc_option_editor.cc:1744
+#: rc_option_editor.cc:1884
 msgid "all available processors"
 msgstr "Все доступные процессоры"
 
-#: rc_option_editor.cc:1747
+#: rc_option_editor.cc:1887
 msgid "%1 processors"
 msgstr "%1 процессора"
 
-#: rc_option_editor.cc:1750
+#: rc_option_editor.cc:1890
 msgid "This setting will only take effect when %1 is restarted."
 msgstr "Это изменение вступит в силу при следующем запуске %1."
 
-#: rc_option_editor.cc:1755
+#: rc_option_editor.cc:1895
 msgid "Options|Undo"
 msgstr "История действий"
 
-#: rc_option_editor.cc:1762
+#: rc_option_editor.cc:1902
 msgid "Verify removal of last capture"
 msgstr "Проверять удаление последней записи"
 
-#: rc_option_editor.cc:1767
+#: rc_option_editor.cc:1907
 msgid "Session Management"
 msgstr "Управление сессиями"
 
-#: rc_option_editor.cc:1772
+#: rc_option_editor.cc:1912
 msgid "Make periodic backups of the session file"
 msgstr "Периодически создавать резервные копии файла сессии"
 
-#: rc_option_editor.cc:1780
+#: rc_option_editor.cc:1920
 msgid "Always copy imported files"
 msgstr "Всегда копировать импортируемые файлы"
 
-#: rc_option_editor.cc:1787
+#: rc_option_editor.cc:1927
 msgid "Default folder for new sessions:"
 msgstr "Папка для новых сессий по умолчанию:"
 
-#: rc_option_editor.cc:1795
+#: rc_option_editor.cc:1935
 msgid "Maximum number of recent sessions"
 msgstr "Максимальное число недавних сессий"
 
-#: rc_option_editor.cc:1808
+#: rc_option_editor.cc:1948
 msgid "Click gain level"
 msgstr "Уровень щелчка метронома"
 
-#: rc_option_editor.cc:1813 route_time_axis.cc:269 route_time_axis.cc:833
+#: rc_option_editor.cc:1953 route_time_axis.cc:277 route_time_axis.cc:831
 msgid "Automation"
 msgstr "Автоматизация"
 
-#: rc_option_editor.cc:1818
+#: rc_option_editor.cc:1958
 msgid "Thinning factor (larger value => less data)"
 msgstr "Фактор разведения (большее значение => меньше данных)"
 
-#: rc_option_editor.cc:1827
+#: rc_option_editor.cc:1967
 msgid "Automation sampling interval (milliseconds)"
 msgstr "Интервал сэмплирования для автоматизации (мс)"
 
-#: rc_option_editor.cc:1835
+#: rc_option_editor.cc:1975
 msgid "Transport Options"
 msgstr "Параметры транспорта"
 
-#: rc_option_editor.cc:1841
+#: rc_option_editor.cc:1981
 msgid "Keep record-enable engaged on stop"
 msgstr "Готовность к записи сохраняется после остановки"
 
-#: rc_option_editor.cc:1850
+#: rc_option_editor.cc:1990
 msgid "Play loop is a transport mode"
 msgstr "Петля воспроизведения как режим транспорта"
 
-#: rc_option_editor.cc:1855
+#: rc_option_editor.cc:1995
 msgid ""
 "<b>When enabled</b> the loop button does not start playback but forces "
 "playback to always play the loop\n"
@@ -10173,11 +11199,11 @@ msgstr ""
 "<b>Когда выключено,</b> кнопка петли запускает воспроизведение, но при "
 "остановке режим циклического воспроизведения отключается."
 
-#: rc_option_editor.cc:1861
+#: rc_option_editor.cc:2001
 msgid "Stop recording when an xrun occurs"
 msgstr "Останавливать запись при рассинхронизации"
 
-#: rc_option_editor.cc:1866
+#: rc_option_editor.cc:2006
 msgid ""
 "<b>When enabled</b> %1 will stop recording if an over- or underrun is "
 "detected by the audio engine"
@@ -10185,15 +11211,15 @@ msgstr ""
 "<b>Когда включено,</b> %1 остановит запись, если звуковым движком обнаружено "
 "переполнение или опустошение буфера"
 
-#: rc_option_editor.cc:1872
+#: rc_option_editor.cc:2012
 msgid "Create markers where xruns occur"
 msgstr "Создавать маркеры в точках рассинхронизации"
 
-#: rc_option_editor.cc:1881
+#: rc_option_editor.cc:2021
 msgid "Stop at the end of the session"
 msgstr "Останавливаться в конце сессии"
 
-#: rc_option_editor.cc:1886
+#: rc_option_editor.cc:2026
 msgid ""
 "<b>When enabled</b> if %1 is <b>not recording</b>, it will stop the "
 "transport when it reaches the current session end marker\n"
@@ -10206,13 +11232,13 @@ msgstr ""
 "\n"
 "<b>Когда выключено</b>, %1 будет воспроизводить дальше маркера конца сессии."
 
-#: rc_option_editor.cc:1894
+#: rc_option_editor.cc:2034
 msgid "Do seamless looping (not possible when slaved to MTC, LTC etc)"
 msgstr ""
 "Бесшовное циклическое воспроизведение (невозможно, когда Ardour ведом по "
 "MTC, LTC и т.д.)"
 
-#: rc_option_editor.cc:1899
+#: rc_option_editor.cc:2039
 msgid ""
 "<b>When enabled</b> this will loop by reading ahead and wrapping around at "
 "the loop point, preventing any need to do a transport locate at the end of "
@@ -10229,11 +11255,11 @@ msgstr ""
 "обратно в начало цикла, когда %1 достигает конца, что будет часто приводить "
 "к небольшим щелчкам или задержке."
 
-#: rc_option_editor.cc:1907
+#: rc_option_editor.cc:2047
 msgid "Disable per-track record disarm while rolling"
 msgstr "Сделать невозможным отключение готовности к записи при захвате"
 
-#: rc_option_editor.cc:1911
+#: rc_option_editor.cc:2051
 msgid ""
 "<b>When enabled</b> this will prevent you from accidentally stopping "
 "specific tracks recording during a take"
@@ -10241,11 +11267,11 @@ msgstr ""
 "<b>Если включено</b>, вы не сможете нечаянно выключить готовность к записи "
 "во время захвата сигнала"
 
-#: rc_option_editor.cc:1916
+#: rc_option_editor.cc:2056
 msgid "12dB gain reduction during fast-forward and fast-rewind"
 msgstr "Приглушение громкости на 12Дб при перемотке"
 
-#: rc_option_editor.cc:1920
+#: rc_option_editor.cc:2060
 msgid ""
 "This will reduce the unpleasant increase in perceived volume that occurs "
 "when fast-forwarding or rewinding through some kinds of audio"
@@ -10253,11 +11279,11 @@ msgstr ""
 "При перемотке воспринимаемое на слух резкое увеличение громкости будет "
 "нивелировано"
 
-#: rc_option_editor.cc:1926
+#: rc_option_editor.cc:2066
 msgid "Preroll"
 msgstr ""
 
-#: rc_option_editor.cc:1931
+#: rc_option_editor.cc:2071
 msgid ""
 "The amount of preroll (in seconds) to apply when <b>Play with Preroll</b> is "
 "initiated.\n"
@@ -10266,43 +11292,50 @@ msgid ""
 "position when a region is selected or trimmed."
 msgstr ""
 
-#: rc_option_editor.cc:1933
+#: rc_option_editor.cc:2073
 msgid "0 (no pre-roll)"
 msgstr ""
 
-#: rc_option_editor.cc:1934
+#: rc_option_editor.cc:2074
 msgid "0.1 second"
 msgstr "0,1 с"
 
-#: rc_option_editor.cc:1935
+#: rc_option_editor.cc:2075
 msgid "0.25 second"
 msgstr "0,25 с"
 
-#: rc_option_editor.cc:1936
+#: rc_option_editor.cc:2076
 msgid "0.5 second"
 msgstr "0,5 с"
 
-#: rc_option_editor.cc:1937
+#: rc_option_editor.cc:2077
 msgid "1.0 second"
 msgstr "1 с"
 
-#: rc_option_editor.cc:1938
+#: rc_option_editor.cc:2078
 msgid "2.0 seconds"
 msgstr "2 с"
 
-#: rc_option_editor.cc:1941
-msgid "Sync/Slave"
-msgstr "Синхронизация и ведомый режим"
+#: rc_option_editor.cc:2081 rc_option_editor.cc:2090 rc_option_editor.cc:2106
+#: rc_option_editor.cc:2127 rc_option_editor.cc:2145 rc_option_editor.cc:2147
+#: rc_option_editor.cc:2164 rc_option_editor.cc:2167 rc_option_editor.cc:2169
+#: rc_option_editor.cc:2197
+msgid "Transport/Sync"
+msgstr "Транспорт/Синхронизация"
+
+#: rc_option_editor.cc:2081
+msgid "Synchronization and Slave Options"
+msgstr "Синхронизация и параметры ведомого режима"
 
-#: rc_option_editor.cc:1945
+#: rc_option_editor.cc:2085
 msgid "External timecode source"
 msgstr "Внешний источник синхросигнала"
 
-#: rc_option_editor.cc:1954
+#: rc_option_editor.cc:2094
 msgid "Match session video frame rate to external timecode"
 msgstr "Адаптировать частоту кадров видео в сессии к внешнему тайм-коду"
 
-#: rc_option_editor.cc:1960
+#: rc_option_editor.cc:2100
 msgid ""
 "This option controls the value of the video frame rate <i>while chasing</i> "
 "an external timecode source.\n"
@@ -10325,11 +11358,11 @@ msgstr ""
 "этого индикатор частоты кадров в основном счётчике будет мерцать красным, а "
 "%1 будет конвертировать внешний тайм-код в тайм-код сессии."
 
-#: rc_option_editor.cc:1970
+#: rc_option_editor.cc:2110
 msgid "Sync-lock timecode to clock (disable drift compensation)"
 msgstr "Привязать тайм-код к часам (отключить компенсацию смещения)"
 
-#: rc_option_editor.cc:1976
+#: rc_option_editor.cc:2116
 msgid ""
 "<b>When enabled</b> %1 will never varispeed when slaved to external "
 "timecode. Sync Lock indicates that the selected external timecode source "
@@ -10350,11 +11383,11 @@ msgstr ""
 "<b>Когда выключено,</b> %1 компенсирует потенциальное смещение вне "
 "зависимости от того, разделяет ли источник тайм-кода синхронизацию часов."
 
-#: rc_option_editor.cc:1991
+#: rc_option_editor.cc:2131
 msgid "Lock to 29.9700 fps instead of 30000/1001"
 msgstr "Принудительно использовать 29,9700 к/с вместо 30000/1001"
 
-#: rc_option_editor.cc:1997
+#: rc_option_editor.cc:2137
 msgid ""
 "<b>When enabled</b> the external timecode source is assumed to use 29.97 fps "
 "instead of 30000/1001.\n"
@@ -10377,27 +11410,27 @@ msgstr ""
 "несмотря на её противоречие спецификации, потому что использование именно "
 "29,97 кадров в секунду имеет нулевое смещение тайм-кода.\n"
 
-#: rc_option_editor.cc:2007
+#: rc_option_editor.cc:2147
 msgid "LTC Reader"
 msgstr "Чтение LTC"
 
-#: rc_option_editor.cc:2011
+#: rc_option_editor.cc:2151
 msgid "LTC incoming port"
 msgstr "Порт чтения LTC"
 
-#: rc_option_editor.cc:2027
+#: rc_option_editor.cc:2167
 msgid "LTC Generator"
 msgstr "Генератор LTC"
 
-#: rc_option_editor.cc:2032
+#: rc_option_editor.cc:2172
 msgid "Enable LTC generator"
 msgstr "Включить генератор LTC"
 
-#: rc_option_editor.cc:2039
+#: rc_option_editor.cc:2179
 msgid "Send LTC while stopped"
 msgstr "Отправлять LTC в остановленном состоянии"
 
-#: rc_option_editor.cc:2045
+#: rc_option_editor.cc:2185
 msgid ""
 "<b>When enabled</b> %1 will continue to send LTC information even when the "
 "transport (playhead) is not moving"
@@ -10405,27 +11438,28 @@ msgstr ""
 "<b>Когда включено,</b> %1 продолжит передавать LTC даже когда транспорт "
 "(воспроизведение) не движется"
 
-#: rc_option_editor.cc:2051
+#: rc_option_editor.cc:2191
 msgid "LTC generator level"
 msgstr "Уровень генератора LTC"
 
-#: rc_option_editor.cc:2055
+#: rc_option_editor.cc:2195
+#, fuzzy
 msgid ""
-"Specify the Peak Volume of the generated LTC signal in dbFS. A good value "
-"is  0dBu ^= -18dbFS in an EBU calibrated system"
+"Specify the Peak Volume of the generated LTC signal in dBFS. A good value "
+"is  0dBu ^= -18dBFS in an EBU calibrated system"
 msgstr ""
 "Укажите пиковую громкость генерируемого сигнала LTC в dbFS. Хорошее качество "
 "это 0dBu ^ =-18dbFS в выщеуказанной EBU калиброванной системе"
 
-#: rc_option_editor.cc:2064
+#: rc_option_editor.cc:2204
 msgid "Make rubberband selection rectangle snap to the grid"
 msgstr "Прямоугольное выделение привязывается к сетке"
 
-#: rc_option_editor.cc:2071
+#: rc_option_editor.cc:2211
 msgid "Name new markers"
 msgstr "Спрашивать об имени каждого нового маркера"
 
-#: rc_option_editor.cc:2076
+#: rc_option_editor.cc:2216
 msgid ""
 "If enabled, popup a dialog when a new marker is created to allow its name to "
 "be set as it is created.\n"
@@ -10438,397 +11472,407 @@ msgstr ""
 "Вы всегда можете позднее переименовать маркеры, щелкнув по ним правой "
 "кнопкой мыши."
 
-#: rc_option_editor.cc:2082
+#: rc_option_editor.cc:2222
 msgid "Allow dragging of playhead"
 msgstr "Разрешить перетаскивание указателя воспроизведения"
 
-#: rc_option_editor.cc:2090
-msgid "Show meters on tracks in the editor"
-msgstr "Показывать индикаторы громкости в дорожках"
-
-#: rc_option_editor.cc:2098
+#: rc_option_editor.cc:2230
 msgid "Display master-meter in the toolbar"
 msgstr "Показывать индикатор громкости мастер-шины в панели"
 
-#: rc_option_editor.cc:2107
+#: rc_option_editor.cc:2239
 msgid "Show zoom toolbar (if torn off)"
 msgstr "Показывать панель масштаба (если она откреплена)"
 
-#: rc_option_editor.cc:2116
+#: rc_option_editor.cc:2247
+msgid ""
+"Always use mouse cursor position as zoom focus when zooming using mouse "
+"scroll wheel"
+msgstr ""
+
+#: rc_option_editor.cc:2256
 msgid "Update editor window during drags of the summary"
 msgstr "Обновлять окно редактора при изменениях в панели сводки"
 
-#: rc_option_editor.cc:2124
+#: rc_option_editor.cc:2264
 msgid "Auto-scroll editor window when dragging near its edges"
 msgstr ""
 "Автоматически прокручивать окно редактора при перетаскивании близко к краям"
 
-#: rc_option_editor.cc:2132
+#: rc_option_editor.cc:2272
 msgid "Show gain envelopes in audio regions"
 msgstr "Показывать огибающие усиления"
 
-#: rc_option_editor.cc:2133
+#: rc_option_editor.cc:2273
 msgid "in all modes"
 msgstr "Во всех режимах"
 
-#: rc_option_editor.cc:2134
+#: rc_option_editor.cc:2274
 msgid "only in Draw and Internal Edit modes"
 msgstr "Только в режимах рисования и правки содержимого"
 
-#: rc_option_editor.cc:2139
+#: rc_option_editor.cc:2279
 msgid "Editor Behavior"
 msgstr "Поведение редактора"
 
-#: rc_option_editor.cc:2144
+#: rc_option_editor.cc:2284
 msgid "Move relevant automation when audio regions are moved"
 msgstr "Перемещать автоматизацию вместе с областями"
 
-#: rc_option_editor.cc:2151
+#: rc_option_editor.cc:2291
 msgid "Default fade shape"
 msgstr "Форма фейда по умолчанию"
 
-#: rc_option_editor.cc:2170
+#: rc_option_editor.cc:2310
 msgid "Regions in active edit groups are edited together"
 msgstr "Области в активных редактируемых группах меняются вместе"
 
-#: rc_option_editor.cc:2171
+#: rc_option_editor.cc:2311
 msgid "whenever they overlap in time"
 msgstr "Когда пересекаются по времени"
 
-#: rc_option_editor.cc:2172
+#: rc_option_editor.cc:2312
 msgid "only if they have identical length, position and origin"
 msgstr "При одинаковой длительности, позиции и происхождении"
 
-#: rc_option_editor.cc:2181
+#: rc_option_editor.cc:2321
 msgid "Layering model"
 msgstr "Способ наслаивания"
 
-#: rc_option_editor.cc:2186
+#: rc_option_editor.cc:2326
 msgid "later is higher"
 msgstr "Более поздние — сверху"
 
-#: rc_option_editor.cc:2187
+#: rc_option_editor.cc:2327
 msgid "manual layering"
 msgstr "Наслаивание вручную"
 
-#: rc_option_editor.cc:2192
+#: rc_option_editor.cc:2332
 msgid "After splitting selected regions, select"
 msgstr "После разделения выбранных областей выбирать"
 
-#: rc_option_editor.cc:2197
+#: rc_option_editor.cc:2337
 msgid "no regions"
 msgstr "Не выбирать области"
 
-#: rc_option_editor.cc:2200
+#: rc_option_editor.cc:2340
 msgid "newly-created regions"
 msgstr "Только что созданные области"
 
-#: rc_option_editor.cc:2204
+#: rc_option_editor.cc:2344
 msgid "existing selection and newly-created regions"
 msgstr "Как выбранные ранее, так и только что созданные области"
 
-#: rc_option_editor.cc:2208
+#: rc_option_editor.cc:2348 rc_option_editor.cc:2351 rc_option_editor.cc:2360
+#: rc_option_editor.cc:2378 rc_option_editor.cc:2390 rc_option_editor.cc:2392
+msgid "Editor/Waveforms"
+msgstr "Редактор/Волновая форма"
+
+#: rc_option_editor.cc:2348
 msgid "Waveforms"
 msgstr "Волновая форма сигнала"
 
-#: rc_option_editor.cc:2214
+#: rc_option_editor.cc:2354
 msgid "Show waveforms in regions"
 msgstr "Показывать форму сигнала в областях"
 
-#: rc_option_editor.cc:2223
+#: rc_option_editor.cc:2363
 msgid "Show waveforms for audio while it is being recorded"
 msgstr "Показывать форму записываемого сигнала при захвате"
 
-#: rc_option_editor.cc:2230
+#: rc_option_editor.cc:2370
 msgid "Waveform scale"
 msgstr "Масштаб сигнала"
 
-#: rc_option_editor.cc:2235
+#: rc_option_editor.cc:2375
 msgid "linear"
 msgstr "Линейный"
 
-#: rc_option_editor.cc:2236
+#: rc_option_editor.cc:2376
 msgid "logarithmic"
 msgstr "Логарифмический"
 
-#: rc_option_editor.cc:2242
+#: rc_option_editor.cc:2382
 msgid "Waveform shape"
 msgstr "Форма сигнала"
 
-#: rc_option_editor.cc:2247
+#: rc_option_editor.cc:2387
 msgid "traditional"
 msgstr "Обычная"
 
-#: rc_option_editor.cc:2248
+#: rc_option_editor.cc:2388
 msgid "rectified"
 msgstr "От низа"
 
-#: rc_option_editor.cc:2257
+#: rc_option_editor.cc:2397
 msgid "Buffering"
 msgstr "Буферизация"
 
-#: rc_option_editor.cc:2265
+#: rc_option_editor.cc:2405
 msgid "Record monitoring handled by"
 msgstr "Мониторинг записи выполняется"
 
-#: rc_option_editor.cc:2271
+#: rc_option_editor.cc:2411
 msgid "via Audio Driver"
 msgstr "Через аудиодрайвер"
 
-#: rc_option_editor.cc:2277
+#: rc_option_editor.cc:2417
 msgid "audio hardware"
 msgstr "Аппаратным обеспечением"
 
-#: rc_option_editor.cc:2284
+#: rc_option_editor.cc:2424
 msgid "Tape machine mode"
 msgstr "Режим плёночного магнитофона"
 
-#: rc_option_editor.cc:2290
+#: rc_option_editor.cc:2429
 msgid "Connection of tracks and busses"
 msgstr "Соединение дорожек и шин"
 
-#: rc_option_editor.cc:2295
+#: rc_option_editor.cc:2435
 msgid "Auto-connect master/monitor busses"
 msgstr "Автоматически соединять шины master/monitor"
 
-#: rc_option_editor.cc:2302
+#: rc_option_editor.cc:2442
 msgid "Connect track inputs"
 msgstr "Соединять входы дорожек"
 
-#: rc_option_editor.cc:2307
+#: rc_option_editor.cc:2447
 msgid "automatically to physical inputs"
 msgstr "Автоматически с физическими входами"
 
-#: rc_option_editor.cc:2308 rc_option_editor.cc:2321
+#: rc_option_editor.cc:2448 rc_option_editor.cc:2461
 msgid "manually"
 msgstr "Вручную"
 
-#: rc_option_editor.cc:2314
+#: rc_option_editor.cc:2454
 msgid "Connect track and bus outputs"
 msgstr "Соединять выходы дорожек и шин"
 
-#: rc_option_editor.cc:2319
+#: rc_option_editor.cc:2459
 msgid "automatically to physical outputs"
 msgstr "Автоматически с физическими выходами"
 
-#: rc_option_editor.cc:2320
+#: rc_option_editor.cc:2460
 msgid "automatically to master bus"
 msgstr "Автоматически с общей шиной"
 
-#: rc_option_editor.cc:2326
+#: rc_option_editor.cc:2467
+msgid "Use 'Strict-I/O' for new tracks or Busses"
+msgstr ""
+
+#: rc_option_editor.cc:2478
 msgid "Denormals"
 msgstr "Отклонения сигнала"
 
-#: rc_option_editor.cc:2331
+#: rc_option_editor.cc:2483
 msgid "Use DC bias to protect against denormals"
 msgstr "Использовать смещение для защиты от денормализации"
 
-#: rc_option_editor.cc:2338
+#: rc_option_editor.cc:2490
 msgid "Processor handling"
 msgstr "Что делать с обработчиками"
 
-#: rc_option_editor.cc:2344
+#: rc_option_editor.cc:2496
 msgid "no processor handling"
 msgstr "Ничего не делать"
 
-#: rc_option_editor.cc:2350
+#: rc_option_editor.cc:2502
 msgid "use FlushToZero"
 msgstr "Использовать FlushToZero"
 
-#: rc_option_editor.cc:2357
+#: rc_option_editor.cc:2509
 msgid "use DenormalsAreZero"
 msgstr "Использовать DenormalsAreZero"
 
-#: rc_option_editor.cc:2364
+#: rc_option_editor.cc:2516
 msgid "use FlushToZero and DenormalsAreZero"
 msgstr "Использовать FlushToZero и DenormalsAreZero"
 
-#: rc_option_editor.cc:2380
-msgid "Silence plugins when the transport is stopped"
-msgstr "Приглушать плагины при остановке транспорта"
-
-#: rc_option_editor.cc:2388
-msgid "Make new plugins active"
-msgstr "Делать новые плагины активными"
-
-#: rc_option_editor.cc:2398
+#: rc_option_editor.cc:2532
 msgid "Enable automatic analysis of audio"
 msgstr "Включить автоматический анализ звука"
 
-#: rc_option_editor.cc:2406
+#: rc_option_editor.cc:2540
 msgid "Replicate missing region channels"
 msgstr "Воссоздавать отсутствующие каналы области"
 
-#: rc_option_editor.cc:2413 rc_option_editor.cc:2422 rc_option_editor.cc:2424
-#: rc_option_editor.cc:2432 rc_option_editor.cc:2440 rc_option_editor.cc:2448
-#: rc_option_editor.cc:2466 rc_option_editor.cc:2478 rc_option_editor.cc:2490
-#: rc_option_editor.cc:2492 rc_option_editor.cc:2494 rc_option_editor.cc:2502
-#: rc_option_editor.cc:2510 rc_option_editor.cc:2518 rc_option_editor.cc:2526
-#: rc_option_editor.cc:2528
-msgid "Solo / mute"
-msgstr "Соло/Приглушение"
+#: rc_option_editor.cc:2547 rc_option_editor.cc:2556 rc_option_editor.cc:2558
+#: rc_option_editor.cc:2566 rc_option_editor.cc:2574 rc_option_editor.cc:2582
+#: rc_option_editor.cc:2600 rc_option_editor.cc:2612 rc_option_editor.cc:2624
+#: rc_option_editor.cc:2626 rc_option_editor.cc:2628 rc_option_editor.cc:2636
+#: rc_option_editor.cc:2644 rc_option_editor.cc:2652 rc_option_editor.cc:2662
+#: rc_option_editor.cc:2663
+msgid "Solo & mute"
+msgstr "Солирование и приглушение"
 
-#: rc_option_editor.cc:2417
+#: rc_option_editor.cc:2551
 msgid "Solo controls are Listen controls"
 msgstr "Управление солированием работает как управление прослушиванием"
 
-#: rc_option_editor.cc:2427
+#: rc_option_editor.cc:2561
 msgid "Exclusive solo"
 msgstr "Эксклюзивное солирование"
 
-#: rc_option_editor.cc:2435
+#: rc_option_editor.cc:2569
 msgid "Show solo muting"
 msgstr "Показывать приглушение при солировании"
 
-#: rc_option_editor.cc:2443
+#: rc_option_editor.cc:2577
 msgid "Soloing overrides muting"
 msgstr "Солирование приоритетнее приглушения"
 
-#: rc_option_editor.cc:2451
+#: rc_option_editor.cc:2585
 msgid "Solo-in-place mute cut (dB)"
 msgstr "Приглушение сигнала при солировании (dB)"
 
-#: rc_option_editor.cc:2458
+#: rc_option_editor.cc:2592
 msgid "Listen Position"
 msgstr "Положение прослушивания"
 
-#: rc_option_editor.cc:2463
+#: rc_option_editor.cc:2597
 msgid "after-fader (AFL)"
 msgstr "После фейдера (AFL)"
 
-#: rc_option_editor.cc:2464
+#: rc_option_editor.cc:2598
 msgid "pre-fader (PFL)"
 msgstr "До фейдера (PFL)"
 
-#: rc_option_editor.cc:2470
+#: rc_option_editor.cc:2604
 msgid "PFL signals come from"
 msgstr "Источник сигнала PFL"
 
-#: rc_option_editor.cc:2475
+#: rc_option_editor.cc:2609
 msgid "before pre-fader processors"
 msgstr "До послефейдерных обработчиков"
 
-#: rc_option_editor.cc:2476
+#: rc_option_editor.cc:2610
 msgid "pre-fader but after pre-fader processors"
 msgstr "До фейдера, но после предфейдерных обработчиков"
 
-#: rc_option_editor.cc:2482
+#: rc_option_editor.cc:2616
 msgid "AFL signals come from"
 msgstr "Источник сигнала AFL"
 
-#: rc_option_editor.cc:2487
+#: rc_option_editor.cc:2621
 msgid "immediately post-fader"
 msgstr "Сразу после фейдера"
 
-#: rc_option_editor.cc:2488
+#: rc_option_editor.cc:2622
 msgid "after post-fader processors (before pan)"
 msgstr "За послефейдерными обработчиками и до панорамирования"
 
-#: rc_option_editor.cc:2492
+#: rc_option_editor.cc:2626
 msgid "Default track / bus muting options"
 msgstr "Приглушение дорожек и шин по умолчанию затрагивает"
 
-#: rc_option_editor.cc:2497
+#: rc_option_editor.cc:2631
 msgid "Mute affects pre-fader sends"
 msgstr "Предфейдерные посылы"
 
-#: rc_option_editor.cc:2505
+#: rc_option_editor.cc:2639
 msgid "Mute affects post-fader sends"
 msgstr "Послефейдерные посылы"
 
-#: rc_option_editor.cc:2513
+#: rc_option_editor.cc:2647
 msgid "Mute affects control outputs"
 msgstr "Выходы мониторинга"
 
-#: rc_option_editor.cc:2521
+#: rc_option_editor.cc:2655
 msgid "Mute affects main outputs"
 msgstr "Основные выходы"
 
-#: rc_option_editor.cc:2526
+#: rc_option_editor.cc:2662
 msgid "Send Routing"
 msgstr "Маршрутизация посылов"
 
-#: rc_option_editor.cc:2531
+#: rc_option_editor.cc:2666
 msgid "Link panners of Aux and External Sends with main panner by default"
 msgstr "По умолчанию связывать внешние посылы с основным регулятором панорамы"
 
-#: rc_option_editor.cc:2536
+#: rc_option_editor.cc:2672
 msgid "MIDI Preferences"
 msgstr "Параметры MIDI"
 
-#: rc_option_editor.cc:2541
+#: rc_option_editor.cc:2677
 msgid "MIDI read-ahead time (seconds)"
 msgstr "Чтение MIDI с упреждением (в секундах)"
 
-#: rc_option_editor.cc:2551
+#: rc_option_editor.cc:2687
 msgid "Initial program change"
 msgstr "Исходная смена программы"
 
-#: rc_option_editor.cc:2560
+#: rc_option_editor.cc:2696
 msgid "Display first MIDI bank/program as 0"
 msgstr "Показывать первый банк/программу MIDI как 0"
 
-#: rc_option_editor.cc:2568
+#: rc_option_editor.cc:2704
 msgid "Never display periodic MIDI messages (MTC, MIDI Clock)"
 msgstr "Никогда не показывать периодические сообщения MIDI (MTC, MIDI Clock)"
 
-#: rc_option_editor.cc:2576
+#: rc_option_editor.cc:2712
 msgid "Sound MIDI notes as they are selected in the editor"
 msgstr "Воспроизводить выбираемые в редакторе ноты MIDI"
 
-#: rc_option_editor.cc:2584
+#: rc_option_editor.cc:2720
 msgid "Send MIDI control feedback"
 msgstr "Отправлять отклик на контрольные события MIDI"
 
-#: rc_option_editor.cc:2589
+#: rc_option_editor.cc:2725 rc_option_editor.cc:2727 rc_option_editor.cc:2735
+#: rc_option_editor.cc:2737 rc_option_editor.cc:2745 rc_option_editor.cc:2754
+#: rc_option_editor.cc:2756 rc_option_editor.cc:2764 rc_option_editor.cc:2772
+#: rc_option_editor.cc:2781
+msgid "MIDI/Sync"
+msgstr "MIDI/Синхронизация"
+
+#: rc_option_editor.cc:2725
 msgid "MIDI Clock"
 msgstr "MIDI Clock"
 
-#: rc_option_editor.cc:2599
+#: rc_option_editor.cc:2735
 msgid "MIDI Time Code (MTC)"
-msgstr "Там-код MIDI (MTC)"
+msgstr "Тайм-код MIDI (MTC)"
 
-#: rc_option_editor.cc:2604
+#: rc_option_editor.cc:2740
 msgid "Send MIDI Time Code"
 msgstr "Передавать MIDI Time Code"
 
-#: rc_option_editor.cc:2612
+#: rc_option_editor.cc:2748
 msgid "Percentage either side of normal transport speed to transmit MTC"
 msgstr "Процент по обе стороны от нормальной трансп. скорости для передачи MTC"
 
-#: rc_option_editor.cc:2618
+#: rc_option_editor.cc:2754
 msgid "Midi Machine Control (MMC)"
 msgstr "Midi Machine Control (MMC)"
 
-#: rc_option_editor.cc:2623
+#: rc_option_editor.cc:2759
 msgid "Obey MIDI Machine Control commands"
 msgstr "Выполнять команды MIDI Machine Control"
 
-#: rc_option_editor.cc:2631
+#: rc_option_editor.cc:2767
 msgid "Send MIDI Machine Control commands"
 msgstr "Отправлять команды MIDI Machine Control"
 
-#: rc_option_editor.cc:2639
+#: rc_option_editor.cc:2775
 msgid "Inbound MMC device ID"
 msgstr "Идентификатор входящего устройства MMC"
 
-#: rc_option_editor.cc:2648
+#: rc_option_editor.cc:2784
 msgid "Outbound MMC device ID"
 msgstr "Идентификатор выходящего устройства MMC"
 
-#: rc_option_editor.cc:2654
+#: rc_option_editor.cc:2790
 msgid "Midi Audition"
 msgstr "Прослушивание MIDI"
 
-#: rc_option_editor.cc:2658
+#: rc_option_editor.cc:2794
 msgid "Midi Audition Synth (LV2)"
 msgstr "Инструмент для прослушивания MIDI (LV2)"
 
-#: rc_option_editor.cc:2689 rc_option_editor.cc:2699 rc_option_editor.cc:2701
+#: rc_option_editor.cc:2825 rc_option_editor.cc:2835 rc_option_editor.cc:2837
 msgid "User interaction"
 msgstr "Взаимодействие с пользователем"
 
-#: rc_option_editor.cc:2692
+#: rc_option_editor.cc:2828
 msgid ""
 "Use translations of %1 messages\n"
 "   <i>(requires a restart of %1 to take effect)</i>\n"
@@ -10838,35 +11882,24 @@ msgstr ""
 "   <i>(вступает в силу после перезапуска %1)</i>\n"
 "   <i>(если локализация для вашего языка доступна)</i>"
 
-#: rc_option_editor.cc:2699
+#: rc_option_editor.cc:2835
 msgid "Keyboard"
 msgstr "Клавиатура"
 
-#: rc_option_editor.cc:2709
-msgid "Control surface remote ID"
-msgstr "ID для удалённого управления"
-
-#: rc_option_editor.cc:2714
-msgid "assigned by user"
-msgstr "Назначенные пользователем"
-
-#: rc_option_editor.cc:2715
-msgid "follows order of mixer"
-msgstr "Следуют порядку микшера"
+#: rc_option_editor.cc:2848 rc_option_editor.cc:2890 rc_option_editor.cc:2960
+#: startup.cc:352
+msgid "Scan for Plugins"
+msgstr "Просканировать плагины"
 
-#: rc_option_editor.cc:2723
+#: rc_option_editor.cc:2853
 msgid "General"
 msgstr "Главное"
 
-#: rc_option_editor.cc:2726 startup.cc:351
-msgid "Scan for Plugins"
-msgstr "Просканировать плагины"
-
-#: rc_option_editor.cc:2731
+#: rc_option_editor.cc:2858
 msgid "Always Display Plugin Scan Progress"
 msgstr "Всегда показывать прогресс сканирования плагинов"
 
-#: rc_option_editor.cc:2737
+#: rc_option_editor.cc:2864
 msgid ""
 "<b>When enabled</b> a popup window showing plugin scan progress is displayed "
 "for indexing (cache load) and discovery (detect new plugins)"
@@ -10874,15 +11907,45 @@ msgstr ""
 "<b>Когда включено,</b> всплывающее окно показывает прогресс поиска и "
 "индексации звуковых плагинов в системе"
 
-#: rc_option_editor.cc:2742
+#: rc_option_editor.cc:2869
+msgid "Silence plugins when the transport is stopped"
+msgstr "Приглушать плагины при остановке транспорта"
+
+#: rc_option_editor.cc:2875
+msgid ""
+"<b>When enabled</b> plugins will be reset at transport stop. When disabled "
+"plugins will be left unchanged at transport stop.\n"
+"\n"
+"This mostly affects plugins with a \"tail\" like Reverbs."
+msgstr ""
+
+#: rc_option_editor.cc:2879
+msgid "Make new plugins active"
+msgstr "Делать новые плагины активными"
+
+#: rc_option_editor.cc:2885
+msgid ""
+"<b>When enabled</b> plugins will be activated when they are added to tracks/"
+"busses. When disabled plugins will be left inactive when they are added to "
+"tracks/busses"
+msgstr ""
+
+#: rc_option_editor.cc:2888 rc_option_editor.cc:2889 rc_option_editor.cc:2899
+#: rc_option_editor.cc:2911 rc_option_editor.cc:2916 rc_option_editor.cc:2918
+#: rc_option_editor.cc:2923 rc_option_editor.cc:2930 rc_option_editor.cc:2935
+#: rc_option_editor.cc:2944
+msgid "Plugins/VST"
+msgstr "Плагины/VST"
+
+#: rc_option_editor.cc:2888
 msgid "VST"
 msgstr "VST"
 
-#: rc_option_editor.cc:2746
+#: rc_option_editor.cc:2895
 msgid "Scan for [new] VST Plugins on Application Start"
 msgstr "Искать новые плагины VST при запуске приложения"
 
-#: rc_option_editor.cc:2752
+#: rc_option_editor.cc:2901
 msgid ""
 "<b>When enabled</b> new VST plugins are searched, tested and added to the "
 "cache index on application start. When disabled new plugins will only be "
@@ -10892,11 +11955,11 @@ msgstr ""
 "тестирование и добавление новых плагинов VST в индекс кэша. Когда отключено, "
 "новые плагины становятся доступными лишь после запуска сканирования вручную."
 
-#: rc_option_editor.cc:2758
+#: rc_option_editor.cc:2907
 msgid "Verbose Plugin Scan"
-msgstr ""
+msgstr "Подробное сканирование плагинов"
 
-#: rc_option_editor.cc:2764
+#: rc_option_editor.cc:2913
 msgid ""
 "<b>When enabled</b> additional information for every plugin is added to the "
 "Log Window."
@@ -10904,35 +11967,40 @@ msgstr ""
 "<b>Если включено</b>, дополнительная информация о каждом плагине выводится в "
 "окно журнала."
 
-#: rc_option_editor.cc:2772
+#: rc_option_editor.cc:2921
 msgid "VST Cache:"
 msgstr "Кэш VST:"
 
-#: rc_option_editor.cc:2777
+#: rc_option_editor.cc:2926
 msgid "VST Blacklist:"
 msgstr "Чёрный список VST:"
 
-#: rc_option_editor.cc:2784
+#: rc_option_editor.cc:2933
 msgid "Linux VST Path:"
 msgstr "Размещение Linux VST:"
 
-#: rc_option_editor.cc:2789 rc_option_editor.cc:2802
+#: rc_option_editor.cc:2938 rc_option_editor.cc:2951
 msgid "Path:"
 msgstr "Расположение:"
 
-#: rc_option_editor.cc:2798
+#: rc_option_editor.cc:2947
 msgid "Windows VST Path:"
 msgstr "Размещение Windows VST:"
 
-#: rc_option_editor.cc:2808
+#: rc_option_editor.cc:2958 rc_option_editor.cc:2959 rc_option_editor.cc:2973
+#: rc_option_editor.cc:2978
+msgid "Plugins/Audio Unit"
+msgstr "Плагины/Audio Unit"
+
+#: rc_option_editor.cc:2958
 msgid "Audio Unit"
 msgstr "Audio Unit"
 
-#: rc_option_editor.cc:2812
+#: rc_option_editor.cc:2965
 msgid "Scan for AudioUnit Plugins on Application Start"
 msgstr "Искать новые плагины AudioUnit при запуске приложения"
 
-#: rc_option_editor.cc:2818
+#: rc_option_editor.cc:2971
 msgid ""
 "<b>When enabled</b> Audio Unit Plugins are discovered on application start. "
 "When disabled AU plugins will only be available after triggering a 'Scan' "
@@ -10945,167 +12013,208 @@ msgstr ""
 "включено автоматическое сканирование плагинов AU. При любом падении "
 "программы во время сканирования автоматическое сканирование будет отключено."
 
-#: rc_option_editor.cc:2823
+#: rc_option_editor.cc:2976
 msgid "AU Cache:"
 msgstr "Кэш AU:"
 
-#: rc_option_editor.cc:2828
+#: rc_option_editor.cc:2981
 msgid "AU Blacklist:"
 msgstr "Чёрный список AU:"
 
-#: rc_option_editor.cc:2832
+#: rc_option_editor.cc:2985
 msgid "Plugin GUI"
 msgstr "Интерфейс плагинов"
 
-#: rc_option_editor.cc:2836
+#: rc_option_editor.cc:2989
 msgid "Automatically open the plugin GUI when adding a new plugin"
 msgstr "Автоматически открывать окно плагина после его добавления"
 
-#: rc_option_editor.cc:2847
+#: rc_option_editor.cc:2998
+msgid "Show Plugin Inline Display on Mixerstrip by default"
+msgstr "Показывать встраиваемый интерфейс плагинов в микшере по умолчанию"
+
+#: rc_option_editor.cc:3005
+msgid ""
+"Don't automatically open the plugin GUI when the plugin has an inline "
+"display mode"
+msgstr ""
+"Не открывать GUI плагина автоматически, если у плагина есть встраиваемый "
+"интерфейс"
+
+#: rc_option_editor.cc:3012
+msgid "Instrument"
+msgstr "Виртуальные инструменты"
+
+#: rc_option_editor.cc:3016
+msgid "Ask to replace existing instrument plugin"
+msgstr "Спрашивать о замене уже добавленного плагина виртуального инструмента"
+
+#: rc_option_editor.cc:3024
+msgid "Interactively configure instrument plugins on insert"
+msgstr "Запрашивать параметры виртуальных инструментов на возврате"
+
+#: rc_option_editor.cc:3030
+msgid ""
+"<b>When enabled</b> show a dialog to select instrument channel configuration "
+"before adding a multichannel plugin."
+msgstr ""
+
+#: rc_option_editor.cc:3039
 msgid "Disable Graphics Hardware Acceleration (requires restart)"
 msgstr "Отключить аппаратное ускорение графики (требует перезапуска)"
 
-#: rc_option_editor.cc:2853
+#: rc_option_editor.cc:3045
 msgid ""
 "Render large parts of the application user-interface in software, instead of "
 "using 2D-graphics acceleration.\n"
 "This requires restarting %1 before having an effect"
 msgstr ""
 
-#: rc_option_editor.cc:2854 rc_option_editor.cc:2866 rc_option_editor.cc:2869
-#: rc_option_editor.cc:2878 rc_option_editor.cc:2887 rc_option_editor.cc:2906
-#: rc_option_editor.cc:2922 rc_option_editor.cc:2938 rc_option_editor.cc:2952
-#: rc_option_editor.cc:2961
+#: rc_option_editor.cc:3046 rc_option_editor.cc:3058 rc_option_editor.cc:3061
+#: rc_option_editor.cc:3069 rc_option_editor.cc:3077 rc_option_editor.cc:3085
+#: rc_option_editor.cc:3093 rc_option_editor.cc:3104 rc_option_editor.cc:3120
+#: rc_option_editor.cc:3136 rc_option_editor.cc:3151 rc_option_editor.cc:3160
+#: rc_option_editor.cc:3168
 msgid "Preferences|GUI"
 msgstr "Интерфейс"
 
-#: rc_option_editor.cc:2860
+#: rc_option_editor.cc:3052
 msgid "Possibly improve slow graphical performance (requires restart)"
 msgstr ""
 
-#: rc_option_editor.cc:2865
+#: rc_option_editor.cc:3057
 msgid ""
 "Disables hardware gradient rendering on buggy video drivers (\"buggy "
 "gradients patch\").\n"
 "This requires restarting %1 before having an effect"
 msgstr ""
 
-#: rc_option_editor.cc:2872
+#: rc_option_editor.cc:3064
+msgid "Use Window Manager/Desktop visibility information"
+msgstr ""
+
+#: rc_option_editor.cc:3072
 msgid "Graphically indicate mouse pointer hovering over various widgets"
 msgstr "Подсвечивать элементы интерфейса под указателем мыши"
 
-#: rc_option_editor.cc:2881
+#: rc_option_editor.cc:3080
 msgid "Show tooltips if mouse hovers over a control"
 msgstr "Показывать всплывающие подсказки к элементам интерфейса"
 
-#: rc_option_editor.cc:2890
+#: rc_option_editor.cc:3088
 msgid "Use name highlight bars in region displays (requires a restart)"
 msgstr "Подсвечивать названия областей (требует перезапуска)"
 
-#: rc_option_editor.cc:2898
+#: rc_option_editor.cc:3096
 msgid "Update transport clock display at FPS instead of every 100ms"
 msgstr "Обновлять счётчик транспорта по FPS, а не каждые 100 мс"
 
-#: rc_option_editor.cc:2913
+#: rc_option_editor.cc:3111
 msgid "Waveform image cache size (megabytes)"
 msgstr "Размер кэша для графики волновой формы (МБ)"
 
-#: rc_option_editor.cc:2921
+#: rc_option_editor.cc:3119
 msgid ""
 "Increasing the cache size uses more memory to store waveform images, which "
 "can improve graphical performance."
 msgstr ""
 
-#: rc_option_editor.cc:2929
+#: rc_option_editor.cc:3127
 msgid "Lock timeout (seconds)"
 msgstr "Тайм-аут блокировки (секунды)"
 
-#: rc_option_editor.cc:2937
+#: rc_option_editor.cc:3135
 msgid "Lock GUI after this many idle seconds (zero to never lock)"
 msgstr ""
 "Блокировка GUI после этого количества секунд простоя\n"
 "(0 - никогда не блокировать)"
 
-#: rc_option_editor.cc:2954
+#: rc_option_editor.cc:3153
 msgid "Mixer Strip"
 msgstr "Полоса микшера"
 
-#: rc_option_editor.cc:2964
+#: rc_option_editor.cc:3163
 msgid "Use narrow strips in the mixer by default"
 msgstr "Использовать тонкие полоски в микшере по умолчанию"
 
-#: rc_option_editor.cc:2969 rc_option_editor.cc:2983 rc_option_editor.cc:3000
-#: rc_option_editor.cc:3016 rc_option_editor.cc:3032 rc_option_editor.cc:3046
-#: rc_option_editor.cc:3072 rc_option_editor.cc:3090 rc_option_editor.cc:3101
-#: rc_option_editor.cc:3108 rc_option_editor.cc:3110
+#: rc_option_editor.cc:3170
+msgid "Action Script Button Visibility"
+msgstr ""
+
+#: rc_option_editor.cc:3176 rc_option_editor.cc:3190 rc_option_editor.cc:3207
+#: rc_option_editor.cc:3223 rc_option_editor.cc:3239 rc_option_editor.cc:3253
+#: rc_option_editor.cc:3279 rc_option_editor.cc:3297 rc_option_editor.cc:3308
+#: rc_option_editor.cc:3315 rc_option_editor.cc:3317 rc_option_editor.cc:3325
+#: rc_option_editor.cc:3327 rc_option_editor.cc:3335 rc_option_editor.cc:3343
+#: rc_option_editor.cc:3345
 msgid "Preferences|Metering"
 msgstr "Замер"
 
-#: rc_option_editor.cc:2973
+#: rc_option_editor.cc:3180
 msgid "Peak hold time"
 msgstr "Удерживание пика"
 
-#: rc_option_editor.cc:2979
+#: rc_option_editor.cc:3186
 msgid "short"
 msgstr "Короткое"
 
-#: rc_option_editor.cc:2980
+#: rc_option_editor.cc:3187
 msgid "medium"
 msgstr "Среднее"
 
-#: rc_option_editor.cc:2981
+#: rc_option_editor.cc:3188
 msgid "long"
 msgstr "Долгое"
 
-#: rc_option_editor.cc:2987
+#: rc_option_editor.cc:3194
 msgid "DPM fall-off"
 msgstr "Скорость спадания"
 
-#: rc_option_editor.cc:2993
+#: rc_option_editor.cc:3200
 msgid "slowest [6.6dB/sec]"
 msgstr "Самое медленное [6,6 Дб/с]"
 
-#: rc_option_editor.cc:2994
+#: rc_option_editor.cc:3201
 msgid "slow [8.6dB/sec] (BBC PPM, EBU PPM)"
 msgstr "Медленное [8,6 Дб/с] (BBC PPM, EBU PPM)"
 
-#: rc_option_editor.cc:2995
+#: rc_option_editor.cc:3202
 msgid "moderate [12.0dB/sec] (DIN)"
 msgstr "Умеренное [12 Дб/с] (DIN)"
 
-#: rc_option_editor.cc:2996
+#: rc_option_editor.cc:3203
 msgid "medium [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"
 msgstr "Среднее [13,3 Дб/с] (EBU Digi PPM, IRT Digi PPM)"
 
-#: rc_option_editor.cc:2997
+#: rc_option_editor.cc:3204
 msgid "fast [20dB/sec]"
 msgstr "Быстрое [20 Дб/с]"
 
-#: rc_option_editor.cc:2998
+#: rc_option_editor.cc:3205
 msgid "very fast [32dB/sec]"
 msgstr "Очень быстрое [32 Дб/с]"
 
-#: rc_option_editor.cc:3004
+#: rc_option_editor.cc:3211
 msgid "Meter line-up level; 0dBu"
 msgstr "Точка выравнивания индикатора; 0dBu"
 
-#: rc_option_editor.cc:3009 rc_option_editor.cc:3025
+#: rc_option_editor.cc:3216 rc_option_editor.cc:3232
 msgid "-24dBFS (SMPTE US: 4dBu = -20dBFS)"
 msgstr "-24dBFS (SMPTE US: 4dBu = -20dBFS)"
 
-#: rc_option_editor.cc:3010 rc_option_editor.cc:3026
+#: rc_option_editor.cc:3217 rc_option_editor.cc:3233
 msgid "-20dBFS (SMPTE RP.0155)"
 msgstr "-20dBFS (SMPTE RP.0155)"
 
-#: rc_option_editor.cc:3011 rc_option_editor.cc:3027
+#: rc_option_editor.cc:3218 rc_option_editor.cc:3234
 msgid "-18dBFS (EBU, BBC)"
 msgstr "-18dBFS (EBU, BBC)"
 
-#: rc_option_editor.cc:3012 rc_option_editor.cc:3028
+#: rc_option_editor.cc:3219 rc_option_editor.cc:3235
 msgid "-15dBFS (DIN)"
 msgstr "-15dBFS (DIN)"
 
-#: rc_option_editor.cc:3014
+#: rc_option_editor.cc:3221
 msgid ""
 "Configure meter-marks and color-knee point for dBFS scale DPM, set reference "
 "level for IEC1/Nordic, IEC2 PPM and VU meter."
@@ -11113,71 +12222,97 @@ msgstr ""
 "Настройка измер. маркеров и цвета точки узла для dBFS масштабирования шкалы "
 "DPM, установка эталонного уровня для IEC1/Nordic, PPM и VU-метра."
 
-#: rc_option_editor.cc:3020
+#: rc_option_editor.cc:3227
 msgid "IEC1/DIN Meter line-up level; 0dBu"
 msgstr "Точка выравнивания индикатора IEC1/DIN; 0dBu"
 
-#: rc_option_editor.cc:3030
+#: rc_option_editor.cc:3237
 msgid "Reference level for IEC1/DIN meter."
 msgstr "Референсный уровень индикатора IEC1/DIN"
 
-#: rc_option_editor.cc:3036
+#: rc_option_editor.cc:3243
 msgid "VU Meter standard"
 msgstr "Стандарт индикатора VU"
 
-#: rc_option_editor.cc:3041
+#: rc_option_editor.cc:3248
 msgid "0VU = -2dBu (France)"
 msgstr "0VU = -2dBu (Франция)"
 
-#: rc_option_editor.cc:3042
+#: rc_option_editor.cc:3249
 msgid "0VU = 0dBu (North America, Australia)"
 msgstr "0VU = 0dBu (Северная Америка, Австралия)"
 
-#: rc_option_editor.cc:3043
+#: rc_option_editor.cc:3250
 msgid "0VU = +4dBu (standard)"
 msgstr "0VU = +4dBu (стандарт)"
 
-#: rc_option_editor.cc:3044
+#: rc_option_editor.cc:3251
 msgid "0VU = +8dBu"
 msgstr "0VU = +8dBu"
 
-#: rc_option_editor.cc:3050
+#: rc_option_editor.cc:3257
 msgid "Peak threshold [dBFS]"
 msgstr "Порог пика (dbFS)"
 
-#: rc_option_editor.cc:3059
+#: rc_option_editor.cc:3266
 msgid "Default Meter Type for Master Bus"
 msgstr "Тип индикатора по умолчанию для мастер-шины"
 
-#: rc_option_editor.cc:3077
+#: rc_option_editor.cc:3284
 msgid "Default Meter Type for Busses"
 msgstr "Тип индикатора по умолчанию для шин"
 
-#: rc_option_editor.cc:3094
+#: rc_option_editor.cc:3301
 msgid "Default Meter Type for Tracks"
 msgstr "Тип индикатора по умолчанию для дорожек"
 
-#: rc_option_editor.cc:3106
+#: rc_option_editor.cc:3313
+#, fuzzy
 msgid ""
-"Specify the audio signal level in dbFS at and above which the meter-peak "
+"Specify the audio signal level in dBFS at and above which the meter-peak "
 "indicator will flash red."
 msgstr ""
 "Укажите в dbFS номинальный уровень звукового сигнала и пикового, когда "
 "индикатор мигает красным цветом."
 
-#: rc_option_editor.cc:3113
+#: rc_option_editor.cc:3320
 msgid "LED meter style"
 msgstr "Индикатор в стиле LED"
 
-#: rc_option_editor.cc:3121
+#: rc_option_editor.cc:3325
+msgid "Editor Meters"
+msgstr "Индикаторы в редакторе"
+
+#: rc_option_editor.cc:3330
+msgid "Show meters on tracks in the editor"
+msgstr "Показывать индикаторы громкости в дорожках"
+
+#: rc_option_editor.cc:3338
+msgid "Show at most stereo meters in the track-header"
+msgstr ""
+"Показывать в боковой панели редактора индикатор не более чем двух каналов"
+
+#: rc_option_editor.cc:3343
+msgid "Post Export Analysis"
+msgstr "Анализ после экспорта"
+
+#: rc_option_editor.cc:3348
+msgid "Save loudness analysis as image file"
+msgstr "Сохранить график громкости как изображение"
+
+#: rc_option_editor.cc:3356
 msgid "Theme"
 msgstr "Тема"
 
-#: rc_option_editor.cc:3194
+#: rc_option_editor.cc:3358
+msgid "Theme/Colors"
+msgstr "Тема/Цвета"
+
+#: rc_option_editor.cc:3436
 msgid "Set Linux VST Search Path"
 msgstr "Установка пути поиска Linux VST"
 
-#: rc_option_editor.cc:3208
+#: rc_option_editor.cc:3450
 msgid "Set Windows VST Search Path"
 msgstr "Установка пути поиска Windows VST"
 
@@ -11189,7 +12324,7 @@ msgstr "Прослушивание области"
 msgid "Position:"
 msgstr "Позиция:"
 
-#: region_editor.cc:92 add_video_dialog.cc:155
+#: region_editor.cc:92 add_video_dialog.cc:156
 msgid "End:"
 msgstr "Конец:"
 
@@ -11253,34 +12388,34 @@ msgstr "Дорожка:"
 msgid "Choose Top Region"
 msgstr "Выбрать верхнюю область"
 
-#: region_view.cc:270
+#: region_view.cc:271
 msgid "SilenceText"
 msgstr "Текст без сведений"
 
-#: region_view.cc:285 region_view.cc:304
+#: region_view.cc:286 region_view.cc:305
 msgid "minutes"
 msgstr "минут"
 
-#: region_view.cc:288 region_view.cc:307
+#: region_view.cc:289 region_view.cc:308
 msgid "msecs"
 msgstr "мс"
 
-#: region_view.cc:291 region_view.cc:310
+#: region_view.cc:292 region_view.cc:311
 msgid "secs"
 msgstr "с"
 
-#: region_view.cc:294
+#: region_view.cc:295
 msgid "%1 silent segment"
 msgid_plural "%1 silent segments"
 msgstr[0] "%1 тихий сегмент"
 msgstr[1] "%1 тихих сегмента"
 msgstr[2] "%1 тихих сегментов"
 
-#: region_view.cc:296
+#: region_view.cc:297
 msgid "shortest = %1 %2"
 msgstr "кратчайший = %1 %2"
 
-#: region_view.cc:313
+#: region_view.cc:314
 msgid ""
 "\n"
 "  (shortest audible segment = %1 %2)"
@@ -11328,55 +12463,63 @@ msgstr "Кулбека-Либлера"
 msgid "Modified Kullback-Liebler"
 msgstr "Изменённая Кулбека-Либлера"
 
-#: rhythm_ferret.cc:65
+#: rhythm_ferret.cc:62
+msgid "Spectral Flux"
+msgstr "Спектральная переменчивость"
+
+#: rhythm_ferret.cc:68
 msgid "Split region"
 msgstr "Разделить область"
 
-#: rhythm_ferret.cc:66
+#: rhythm_ferret.cc:70
 msgid "Snap regions"
 msgstr "Приклеить области к сетке"
 
-#: rhythm_ferret.cc:67
+#: rhythm_ferret.cc:71
 msgid "Conform regions"
 msgstr "Согласовать области"
 
-#: rhythm_ferret.cc:72
+#: rhythm_ferret.cc:77
 msgid "Rhythm Ferret"
 msgstr "Ритмический хорёк"
 
-#: rhythm_ferret.cc:78
+#: rhythm_ferret.cc:83
 msgid "Analyze"
 msgstr "Проанализировать"
 
-#: rhythm_ferret.cc:113
+#: rhythm_ferret.cc:122
 msgid "Detection function"
 msgstr "Функция определения"
 
-#: rhythm_ferret.cc:117
-msgid "Trigger gap"
-msgstr "Интервал триггера"
-
-#: rhythm_ferret.cc:122 strip_silence_dialog.cc:65
-msgid "Threshold"
-msgstr "Порог"
+#: rhythm_ferret.cc:126
+msgid "Trigger gap (postproc)"
+msgstr ""
 
-#: rhythm_ferret.cc:127
+#: rhythm_ferret.cc:131
 msgid "Peak threshold"
 msgstr "Порог пика"
 
-#: rhythm_ferret.cc:132
+#: rhythm_ferret.cc:135
 msgid "Silence threshold"
 msgstr "Порог тишины"
 
-#: rhythm_ferret.cc:137
+#: rhythm_ferret.cc:141
+msgid "Min Inter-Onset Time"
+msgstr ""
+
+#: rhythm_ferret.cc:148
 msgid "Sensitivity"
 msgstr "Чувствительность"
 
-#: rhythm_ferret.cc:141
+#: rhythm_ferret.cc:152
+msgid "Cut Pos Threshold"
+msgstr ""
+
+#: rhythm_ferret.cc:157
 msgid "Operation"
 msgstr "Действие"
 
-#: rhythm_ferret.cc:355
+#: rhythm_ferret.cc:382
 msgid "split regions (rhythm ferret)"
 msgstr "Разделение областей (ритм Ferret)"
 
@@ -11400,19 +12543,15 @@ msgstr "Готовность к записи"
 msgid "Active state"
 msgstr "Активное состояние"
 
-#: route_group_dialog.cc:53 route_group_dialog.cc:82 theme_manager.cc:87
-msgid "Color"
-msgstr "Цвет"
-
-#: route_group_dialog.cc:59
+#: route_group_dialog.cc:58
 msgid "RouteGroupDialog"
 msgstr "RouteGroupDialog"
 
-#: route_group_dialog.cc:100
+#: route_group_dialog.cc:99
 msgid "<b>Sharing</b>"
 msgstr "<b>Разделяются:</b>"
 
-#: route_group_dialog.cc:200
+#: route_group_dialog.cc:192
 msgid "The group name is not unique. Please use a different name."
 msgstr "Название группы не является уникальным. Используйте другое имя."
 
@@ -11432,84 +12571,88 @@ msgstr "Выходы"
 msgid "Plugins, Inserts & Sends"
 msgstr "Плагины, возвраты и посылы"
 
-#: route_params_ui.cc:209
+#: route_params_ui.cc:201
 msgid "route display list item for renamed route not found!"
 msgstr "Маршрут вывода списка пунктов для переименованного маршрута не найден!"
 
-#: route_params_ui.cc:279 route_params_ui.cc:307
+#: route_params_ui.cc:271 route_params_ui.cc:299
 #, c-format
 msgid "Playback delay: %<PRId64> samples"
 msgstr "Задержка воспроизведения: %<PRId64> сэмплов"
 
-#: route_params_ui.cc:499
+#: route_params_ui.cc:491
 msgid "NO TRACK"
 msgstr "НЕТ ДОРОЖЕК"
 
-#: route_params_ui.cc:637 route_params_ui.cc:638
+#: route_params_ui.cc:515
+msgid "Add Track or Bus"
+msgstr "Добавить дорожку или шину"
+
+#: route_params_ui.cc:627 route_params_ui.cc:628
 msgid "No Track or Bus Selected"
 msgstr "Нет выбранных дорожек или шин"
 
-#: route_time_axis.cc:105
+#: route_time_axis.cc:104
 msgid "RTAV|G"
 msgstr "Г"
 
-#: route_time_axis.cc:106
+#: route_time_axis.cc:105
 msgid "RTAV|P"
 msgstr "П"
 
-#: route_time_axis.cc:107
+#: route_time_axis.cc:106
 msgid "RTAV|A"
 msgstr "А"
 
-#: route_time_axis.cc:184
+#: route_time_axis.cc:194
 msgid "Record (Right-click for Step Edit)"
 msgstr "Запись (правая клавиша мыши активирует пошаговый ввод)"
 
-#: route_time_axis.cc:187
+#: route_time_axis.cc:197
 msgid "Record"
 msgstr "Запись"
 
-#: route_time_axis.cc:257
+#: route_time_axis.cc:265
 msgid "Route Group"
 msgstr "Группа маршрутизации"
 
-#: route_time_axis.cc:267
+#: route_time_axis.cc:275
 msgid "MIDI Controllers and Automation"
 msgstr "MIDI-контроллеры и автоматизация"
 
-#: route_time_axis.cc:498
+#: route_time_axis.cc:510
 msgid "Show All Automation"
 msgstr "Показать всю автоматизацию"
 
-#: route_time_axis.cc:501
+#: route_time_axis.cc:513
 msgid "Show Existing Automation"
 msgstr "Показать существующую автоматизацию"
 
-#: route_time_axis.cc:504
+#: route_time_axis.cc:516
 msgid "Hide All Automation"
 msgstr "Скрыть всю автоматизацию"
 
-#: route_time_axis.cc:513
+#: route_time_axis.cc:525
 msgid "Processor automation"
 msgstr "Автоматизация обработчика"
 
-#: route_time_axis.cc:520
+#: route_time_axis.cc:532
 msgid "Fader"
 msgstr "Фейдер"
 
-#: route_time_axis.cc:547
+#: route_time_axis.cc:559
 msgid "Pan"
 msgstr "Панорама"
 
-#: route_time_axis.cc:638
+#: route_time_axis.cc:643
 msgid "Overlaid"
 msgstr "Перекрывают друг друга"
 
-#: route_time_axis.cc:644
+#: route_time_axis.cc:649
 msgid "Stacked"
 msgstr "В стопке"
 
-#: route_time_axis.cc:652
+#: route_time_axis.cc:657
 msgid "Layers"
 msgstr "Слои"
 
@@ -11526,12 +12669,12 @@ msgid "(Currently: Capture Time)"
 msgstr "(Сейчас: по времени захвата)"
 
 #: route_time_axis.cc:741
-msgid "Align with Existing Material"
-msgstr ""
+msgid "Align With Existing Material"
+msgstr "С записанным материалом"
 
 #: route_time_axis.cc:746
-msgid "Align with Capture Time"
-msgstr ""
+msgid "Align With Capture Time"
+msgstr "По времени захвата"
 
 #: route_time_axis.cc:751
 msgid "Alignment"
@@ -11553,188 +12696,191 @@ msgstr "Бесслойный режим"
 msgid "Record Mode"
 msgstr "Режим записи"
 
-#: route_time_axis.cc:811 route_time_axis.cc:1806
+#: route_time_axis.cc:809 route_time_axis.cc:1795
 msgid "Playlist"
 msgstr "Список"
 
-#: route_time_axis.cc:1109
+#: route_time_axis.cc:1107
 msgid "Rename Playlist"
 msgstr "Переименовать список воспроизведения"
 
-#: route_time_axis.cc:1110
+#: route_time_axis.cc:1108
 msgid "New name for playlist:"
 msgstr "Новое название списка воспроизведения:"
 
-#: route_time_axis.cc:1195
+#: route_time_axis.cc:1193
 msgid "New Copy Playlist"
 msgstr "Новая копия списка воспроизведения"
 
-#: route_time_axis.cc:1196 route_time_axis.cc:1249
+#: route_time_axis.cc:1194 route_time_axis.cc:1247
 msgid "Name for new playlist:"
 msgstr "Название нового списка воспроизведения:"
 
-#: route_time_axis.cc:1248
+#: route_time_axis.cc:1246
 msgid "New Playlist"
 msgstr "Новый список воспроизведения"
 
-#: route_time_axis.cc:1452
-msgid "You cannot create a track with that name as it is reserved for %1"
+#: route_time_axis.cc:1441
+msgid "The name \"%1\" is reserved for %2"
 msgstr ""
-"Вы не можете добавить дорожку с названием, которое зарезервировано для %1"
 
-#: route_time_axis.cc:1695
+#: route_time_axis.cc:1684
 msgid "New Copy..."
 msgstr "Создать копию..."
 
-#: route_time_axis.cc:1699
+#: route_time_axis.cc:1688
 msgid "New Take"
 msgstr "Новый дубль"
 
-#: route_time_axis.cc:1700
+#: route_time_axis.cc:1689
 msgid "Copy Take"
 msgstr "Скопировать дубль"
 
-#: route_time_axis.cc:1705
+#: route_time_axis.cc:1694
 msgid "Clear Current"
 msgstr "Очистить текущий"
 
-#: route_time_axis.cc:1708
+#: route_time_axis.cc:1697
 msgid "Select from All..."
 msgstr ""
 
-#: route_time_axis.cc:1796
+#: route_time_axis.cc:1785
 msgid "Take: %1.%2"
 msgstr "Дубль: %1.%2"
 
-#: route_time_axis.cc:2202 selection.cc:1009 selection.cc:1063
+#: route_time_axis.cc:2190 selection.cc:1042 selection.cc:1096
 msgid "programming error: "
 msgstr "Ошибка в программе: "
 
-#: route_time_axis.cc:2622
+#: route_time_axis.cc:2614
 msgid "Underlays"
 msgstr "Подслойка"
 
-#: route_time_axis.cc:2625
+#: route_time_axis.cc:2617
 msgid "Remove \"%1\""
 msgstr "Удалить «%1»"
 
-#: route_time_axis.cc:2675 route_time_axis.cc:2712
+#: route_time_axis.cc:2667 route_time_axis.cc:2704
 msgid "programming error: underlay reference pointer pairs are inconsistent!"
 msgstr "Ошибка в программе: пары подложка и указатель ссылки несовместимы!"
 
-#: route_time_axis.cc:2739
+#: route_time_axis.cc:2731 vca_master_strip.cc:203 vca_time_axis.cc:228
 msgid "After-fade listen (AFL)"
 msgstr "Прослушивание после фейдера (AFL)"
 
-#: route_time_axis.cc:2743
+#: route_time_axis.cc:2735 vca_master_strip.cc:207 vca_time_axis.cc:232
 msgid "Pre-fade listen (PFL)"
 msgstr "Прослушивание до фейдера (PFL)"
 
-#: route_ui.cc:153
+#: route_ui.cc:169
 msgid "Mute this track"
 msgstr "Приглушить эту дорожку"
 
-#: route_ui.cc:157
+#: route_ui.cc:173
 msgid "Mute other (non-soloed) tracks"
 msgstr "Приглушить другие (не солирующие) дорожки"
 
-#: route_ui.cc:163
+#: route_ui.cc:179
 msgid "Enable recording on this track"
 msgstr "Включить готовность к записи этой дорожки"
 
-#: route_ui.cc:171
+#: route_ui.cc:187
 msgid "make mixer strips show sends to this bus"
 msgstr "Показывать в полосках микшера посылы к этой шине"
 
-#: route_ui.cc:176
+#: route_ui.cc:192
 msgid "Monitor input"
 msgstr "Мониторинг входа"
 
-#: route_ui.cc:182
+#: route_ui.cc:198
 msgid "Monitor playback"
 msgstr "Мониторинг воспроизведения"
 
-#: route_ui.cc:691
+#: route_ui.cc:710
 msgid "Not connected to AudioEngine - cannot engage record"
 msgstr "Не подключено к AudioEngine.  Нельзя записывать."
 
-#: route_ui.cc:890
+#: route_ui.cc:887
+msgid "Rec-Safe"
+msgstr ""
+
+#: route_ui.cc:892
 msgid "Step Entry"
 msgstr "Пошаговый ввод"
 
-#: route_ui.cc:963
+#: route_ui.cc:991
 msgid "Assign all tracks (prefader)"
 msgstr "Назначить всем дорожкам (до фейдера)"
 
-#: route_ui.cc:967
+#: route_ui.cc:995
 msgid "Assign all tracks and buses (prefader)"
 msgstr "Назначить всем дорожкам и шинам (до фейдера)"
 
-#: route_ui.cc:971
+#: route_ui.cc:999
 msgid "Assign all tracks (postfader)"
 msgstr "Назначить всем дорожкам (после фейдера)"
 
-#: route_ui.cc:975
+#: route_ui.cc:1003
 msgid "Assign all tracks and buses (postfader)"
 msgstr "Назначить всем дорожкам и шинам (после фейдера)"
 
-#: route_ui.cc:979
+#: route_ui.cc:1007
 msgid "Assign selected tracks (prefader)"
 msgstr "Назначить выбранным дорожкам (до фейдера)"
 
-#: route_ui.cc:983
+#: route_ui.cc:1011
 msgid "Assign selected tracks and buses (prefader)"
 msgstr "Назначить выбранным дорожкам и шинам (до фейдера)"
 
-#: route_ui.cc:986
+#: route_ui.cc:1014
 msgid "Assign selected tracks (postfader)"
 msgstr "Назначить выбранным дорожкам (после фейдера)"
 
-#: route_ui.cc:990
+#: route_ui.cc:1018
 msgid "Assign selected tracks and buses (postfader)"
 msgstr "Назначить выбранным дорожкам и шинам (после фейдера)"
 
-#: route_ui.cc:993
+#: route_ui.cc:1021
 msgid "Copy track/bus gains to sends"
 msgstr "Скопировать фейдеры дорожки/шины в посылы"
 
-#: route_ui.cc:994
+#: route_ui.cc:1022
 msgid "Set sends gain to -inf"
 msgstr "Установка посылает усиление на -inf"
 
-#: route_ui.cc:995
+#: route_ui.cc:1023
 msgid "Set sends gain to 0dB"
 msgstr "Установка посылает усиление на 0dB"
 
-#: route_ui.cc:1314
+#: route_ui.cc:1361
 msgid "Solo Isolate"
 msgstr "Изолировать соло"
 
-#: route_ui.cc:1321
+#: route_ui.cc:1368
 msgid "Solo Safe"
 msgstr "Блокировка солирования"
 
-#: route_ui.cc:1343
+#: route_ui.cc:1390
 msgid "Pre Fader Sends"
 msgstr "Посылки префейдера"
 
-#: route_ui.cc:1349
+#: route_ui.cc:1396
 msgid "Post Fader Sends"
 msgstr "Посылки постфейдера"
 
-#: route_ui.cc:1355
+#: route_ui.cc:1402
 msgid "Control Outs"
 msgstr "Контрольные выходы"
 
-#: route_ui.cc:1361
+#: route_ui.cc:1408
 msgid "Main Outs"
 msgstr "Главные выходы"
 
-#: route_ui.cc:1527
+#: route_ui.cc:1575
 msgid "Color Selection"
 msgstr "Выбор цвета"
 
-#: route_ui.cc:1592
+#: route_ui.cc:1617
 msgid ""
 "The use of colons (':') is discouraged in track and bus names.\n"
 "Do you want to use this new name?"
@@ -11742,23 +12888,23 @@ msgstr ""
 "Использование двоеточия в названиях дорожек и шин не поощряется.\n"
 "Вы точно хотите оставить двоеточие?"
 
-#: route_ui.cc:1596
+#: route_ui.cc:1621
 msgid "Use the new name"
 msgstr "Использовать новое имя"
 
-#: route_ui.cc:1597
+#: route_ui.cc:1622
 msgid "Re-edit the name"
 msgstr "Повторно изменить название"
 
-#: route_ui.cc:1610
+#: route_ui.cc:1635
 msgid "Rename Track"
 msgstr "Переименование дорожки"
 
-#: route_ui.cc:1612
+#: route_ui.cc:1637
 msgid "Rename Bus"
 msgstr "Переименование шины"
 
-#: route_ui.cc:1680
+#: route_ui.cc:1697
 msgid ": comment editor"
 msgstr ": Редактор комментариев"
 
@@ -11778,63 +12924,18 @@ msgstr "Сохранить как шаблон"
 msgid "Template name:"
 msgstr "Название шаблона:"
 
-#: route_ui.cc:1976
-msgid "Remote Control ID"
-msgstr "ID для удалённого управления"
-
-#: route_ui.cc:1986
-msgid "Remote control ID:"
-msgstr "ID для удалённого управления:"
-
-#: route_ui.cc:2000
-msgid ""
-"The remote control ID of %1 is: %2\n"
-"\n"
-"\n"
-"The remote control ID of %3 cannot be changed."
-msgstr ""
-"ID для удалённого управления %1: %2\n"
-"\n"
-"\n"
-"%3 не может получить другой ID."
-
-#: route_ui.cc:2004
-msgid "the master bus"
-msgstr "Мастер-шина"
-
-#: route_ui.cc:2004
-msgid "the monitor bus"
-msgstr "Шина мониторинга"
-
-#: route_ui.cc:2006
+#: route_ui.cc:2023
+#, fuzzy
 msgid ""
-"The remote control ID of %5 is: %2\n"
-"\n"
-"\n"
-"Remote Control IDs are currently determined by track/bus ordering in %6.\n"
-"\n"
-"%3Use the User Interaction tab of the Preferences window if you want to "
-"change this%4"
-msgstr ""
-"ID дистанционного управления %5 это: %2\n"
-"\n"
-"\n"
-"Идентификаторы дистанционного управления в настоящее время определены "
-"порядком дорожки/шины в %6.\n"
-"\n"
-"%3Используйте вкладку пользовательской интеракции  окна Установки, если вы "
-"хотите изменить это %4"
-
-#: route_ui.cc:2063
-msgid ""
-"Left-click to invert (phase reverse) channel %1 of this track.  Right-click "
-"to show menu."
+"Left-click to invert polarity of channel %1 of this track. Right-click to "
+"show menu."
 msgstr ""
 "Щелчком левой клавиши мыши инвертируется (инверсия фазы) \n"
 "канал %1 этой дорожки. По правой клавише вызывается меню."
 
-#: route_ui.cc:2065
-msgid "Click to show a menu of channels for inversion (phase reverse)"
+#: route_ui.cc:2025
+#, fuzzy
+msgid "Click to show a menu of channels to invert polarity"
 msgstr "Кликните для проказа меню каналов для инверсии (реверс фазы)"
 
 #: save_as_dialog.cc:34
@@ -11873,6 +12974,30 @@ msgstr "Щёлкните для добавления нового располо
 msgid "the session folder"
 msgstr "В папке сессии"
 
+#: script_selector.cc:43
+msgid "<b>Type:</b>"
+msgstr "<b>Тип:</b>"
+
+#: script_selector.cc:49
+msgid "<b>Author:</b>"
+msgstr ""
+
+#: script_selector.cc:55
+msgid "<b>Description:</b>"
+msgstr ""
+
+#: script_selector.cc:131
+msgid "Select Script to unload"
+msgstr ""
+
+#: script_selector.cc:165
+msgid "<b>Name:</b>"
+msgstr "<b>Название:</b>"
+
+#: script_selector.cc:172
+msgid "<b>Instance Parameters</b>"
+msgstr "<b>Параметры экземпляра</b>"
+
 #: send_ui.cc:134
 msgid "Send "
 msgstr "Посыл"
@@ -11885,7 +13010,7 @@ msgstr "Настройка сессии"
 msgid "Advanced options ..."
 msgstr "Дополнительные параметры"
 
-#: session_dialog.cc:163 session_dialog.cc:394
+#: session_dialog.cc:163 session_dialog.cc:397
 msgid "Recent Sessions"
 msgstr "Недавние сессии"
 
@@ -11905,99 +13030,99 @@ msgstr "Дата модификации"
 msgid "New Session"
 msgstr "Создать сессию"
 
-#: session_dialog.cc:376
+#: session_dialog.cc:379
 msgid "Check the website for more..."
 msgstr "Проверьте веб-сайт для более..."
 
-#: session_dialog.cc:379
+#: session_dialog.cc:382
 msgid "Click to open the program website in your web browser"
 msgstr "Нажмите, чтобы открыть веб-сайт программы в веб-браузере"
 
-#: session_dialog.cc:401
+#: session_dialog.cc:404
 msgid "Select session file"
 msgstr "Выберите файл сессии"
 
-#: session_dialog.cc:414
+#: session_dialog.cc:417
 msgid "Other Sessions"
 msgstr "Другие сессии"
 
-#: session_dialog.cc:421
+#: session_dialog.cc:424
 msgid "Safe Mode: Disable all Plugins"
 msgstr "Безопасный режим: отключить все плагины"
 
-#: session_dialog.cc:451
+#: session_dialog.cc:454
 msgid "Open"
 msgstr "Открыть"
 
-#: session_dialog.cc:518
+#: session_dialog.cc:521
 msgid "Session name:"
 msgstr "Название сессии:"
 
-#: session_dialog.cc:540
+#: session_dialog.cc:543
 msgid "Create session folder in:"
 msgstr "Создать папку сессии в:"
 
-#: session_dialog.cc:561
+#: session_dialog.cc:564
 msgid "Select folder for session"
 msgstr "Выберите папку для сессии"
 
-#: session_dialog.cc:588
+#: session_dialog.cc:591
 msgid "Use this template"
 msgstr "Использовать этот шаблон"
 
-#: session_dialog.cc:591
+#: session_dialog.cc:594
 msgid "no template"
 msgstr "Без шаблона"
 
-#: session_dialog.cc:743 session_dialog.cc:790
+#: session_dialog.cc:746 session_dialog.cc:793
 msgid "32-bit float"
 msgstr "32-bit float"
 
-#: session_dialog.cc:746 session_dialog.cc:793
+#: session_dialog.cc:749 session_dialog.cc:796
 msgid "24-bit"
 msgstr "24-bit"
 
-#: session_dialog.cc:749 session_dialog.cc:796
+#: session_dialog.cc:752 session_dialog.cc:799
 msgid "16-bit"
 msgstr "16-bit"
 
-#: session_dialog.cc:874 session_dialog.cc:875 session_dialog.cc:876
+#: session_dialog.cc:877 session_dialog.cc:878 session_dialog.cc:879
 msgid "channels"
 msgstr "канал(-ов)"
 
-#: session_dialog.cc:890
+#: session_dialog.cc:893
 msgid "<b>Busses</b>"
 msgstr "<b>Шины</b>"
 
-#: session_dialog.cc:891
+#: session_dialog.cc:894
 msgid "<b>Inputs</b>"
 msgstr "<b>Входы</b>"
 
-#: session_dialog.cc:892
+#: session_dialog.cc:895
 msgid "<b>Outputs</b>"
 msgstr "<b>Выходы</b>"
 
-#: session_dialog.cc:900
+#: session_dialog.cc:903
 msgid "Create master bus"
 msgstr "Создать мастер-шину"
 
-#: session_dialog.cc:910
+#: session_dialog.cc:913
 msgid "Automatically connect to physical inputs"
 msgstr "Автоматически подключить к физическим входам"
 
-#: session_dialog.cc:917 session_dialog.cc:976
+#: session_dialog.cc:920 session_dialog.cc:979
 msgid "Use only"
 msgstr "Использовать только"
 
-#: session_dialog.cc:970
+#: session_dialog.cc:973
 msgid "Automatically connect outputs"
 msgstr "Автоматически подключить выходы"
 
-#: session_dialog.cc:992
+#: session_dialog.cc:995
 msgid "... to master bus"
 msgstr "... к мастер-шине"
 
-#: session_dialog.cc:1002
+#: session_dialog.cc:1005
 msgid "... to physical outputs"
 msgstr "... к физическим выходам"
 
@@ -12021,191 +13146,191 @@ msgstr "Импортировать из сессии"
 msgid "This will select all elements of this type!"
 msgstr "Будут выбраны все элементы этого типа!"
 
-#: session_metadata_dialog.cc:285
+#: session_metadata_dialog.cc:288
 msgid "EAN Check digit OK"
 msgstr "Проверка EAN успешно пройдена"
 
-#: session_metadata_dialog.cc:289
+#: session_metadata_dialog.cc:292
 msgid "EAN Check digit error"
 msgstr "Ошибка при проверке EAN"
 
-#: session_metadata_dialog.cc:289
+#: session_metadata_dialog.cc:292
 msgid "expected"
 msgstr "ожидалось"
 
-#: session_metadata_dialog.cc:294
+#: session_metadata_dialog.cc:297
 msgid "EAN Length error"
 msgstr "Ошибка в длине штрих-кода EAN"
 
-#: session_metadata_dialog.cc:423
+#: session_metadata_dialog.cc:426
 msgid "Field"
 msgstr "Поле"
 
-#: session_metadata_dialog.cc:427
+#: session_metadata_dialog.cc:430
 msgid "Values (current value on top)"
 msgstr "Значения (текущее ­— сверху)"
 
-#: session_metadata_dialog.cc:641
+#: session_metadata_dialog.cc:644
 msgid "User"
 msgstr "Пользователь"
 
-#: session_metadata_dialog.cc:649
+#: session_metadata_dialog.cc:652
 msgid "Email"
 msgstr "Эл. почта"
 
-#: session_metadata_dialog.cc:652
+#: session_metadata_dialog.cc:655
 msgid "Web"
 msgstr "Веб-сайт"
 
-#: session_metadata_dialog.cc:655
+#: session_metadata_dialog.cc:658
 msgid "Organization"
 msgstr "Организация"
 
-#: session_metadata_dialog.cc:658
+#: session_metadata_dialog.cc:661
 msgid "Country"
 msgstr "Страна"
 
-#: session_metadata_dialog.cc:672
+#: session_metadata_dialog.cc:675
 msgid "Title"
 msgstr "Название"
 
-#: session_metadata_dialog.cc:675
+#: session_metadata_dialog.cc:678
 msgid "Track Number"
 msgstr "Номер дорожки"
 
-#: session_metadata_dialog.cc:678
+#: session_metadata_dialog.cc:681
 msgid "Subtitle"
 msgstr "Подзаголовок"
 
-#: session_metadata_dialog.cc:681
+#: session_metadata_dialog.cc:684
 msgid "Grouping"
 msgstr "Группирование"
 
-#: session_metadata_dialog.cc:684
+#: session_metadata_dialog.cc:687
 msgid "Artist"
 msgstr "Исполнитель"
 
-#: session_metadata_dialog.cc:687
+#: session_metadata_dialog.cc:690
 msgid "Genre"
 msgstr "Жанр"
 
-#: session_metadata_dialog.cc:690
+#: session_metadata_dialog.cc:693
 msgid "Comment"
 msgstr "Комментарий"
 
-#: session_metadata_dialog.cc:693
+#: session_metadata_dialog.cc:696
 msgid "Copyright"
 msgstr "Авторские права"
 
-#: session_metadata_dialog.cc:701 session_metadata_dialog.cc:706
+#: session_metadata_dialog.cc:704 session_metadata_dialog.cc:709
 msgid "Album"
 msgstr "Альбом"
 
-#: session_metadata_dialog.cc:709
+#: session_metadata_dialog.cc:712
 msgid "Year"
 msgstr "Год"
 
-#: session_metadata_dialog.cc:712
+#: session_metadata_dialog.cc:715
 msgid "Album Artist"
 msgstr "Исполнитель альбома"
 
-#: session_metadata_dialog.cc:715
+#: session_metadata_dialog.cc:718
 msgid "Total Tracks"
 msgstr "Всего дорожек"
 
-#: session_metadata_dialog.cc:718
+#: session_metadata_dialog.cc:721
 msgid "Disc Subtitle"
 msgstr "Подзаголовок диска"
 
-#: session_metadata_dialog.cc:721
+#: session_metadata_dialog.cc:724
 msgid "Disc Number"
 msgstr "Номер диска"
 
-#: session_metadata_dialog.cc:724
+#: session_metadata_dialog.cc:727
 msgid "Total Discs"
 msgstr "Всего дисков"
 
-#: session_metadata_dialog.cc:727
+#: session_metadata_dialog.cc:730
 msgid "Compilation"
 msgstr "Сборник"
 
-#: session_metadata_dialog.cc:730
+#: session_metadata_dialog.cc:733
 msgid "ISRC"
 msgstr "ISRC"
 
-#: session_metadata_dialog.cc:733
+#: session_metadata_dialog.cc:736
 msgid "EAN barcode"
 msgstr "Штрих-код EAN"
 
-#: session_metadata_dialog.cc:746
+#: session_metadata_dialog.cc:749
 msgid "People"
 msgstr "Люди"
 
-#: session_metadata_dialog.cc:751
+#: session_metadata_dialog.cc:754
 msgid "Lyricist"
 msgstr "Автор слов"
 
-#: session_metadata_dialog.cc:754
+#: session_metadata_dialog.cc:757
 msgid "Composer"
 msgstr "Композитор"
 
-#: session_metadata_dialog.cc:757
+#: session_metadata_dialog.cc:760
 msgid "Conductor"
 msgstr "Дирижер"
 
-#: session_metadata_dialog.cc:760
+#: session_metadata_dialog.cc:763
 msgid "Remixer"
 msgstr "Автор ремикса"
 
-#: session_metadata_dialog.cc:763
+#: session_metadata_dialog.cc:766
 msgid "Arranger"
 msgstr "Аранжировщик"
 
-#: session_metadata_dialog.cc:766
+#: session_metadata_dialog.cc:769
 msgid "Engineer"
 msgstr "Звукоинженер"
 
-#: session_metadata_dialog.cc:769
+#: session_metadata_dialog.cc:772
 msgid "Producer"
 msgstr "Продюсер"
 
-#: session_metadata_dialog.cc:772
+#: session_metadata_dialog.cc:775
 msgid "DJ Mixer"
 msgstr "Диджей"
 
-#: session_metadata_dialog.cc:775
+#: session_metadata_dialog.cc:778
 msgid "Metadata|Mixer"
 msgstr "Звукооператор"
 
-#: session_metadata_dialog.cc:783
+#: session_metadata_dialog.cc:786
 msgid "School"
 msgstr "Обучение"
 
-#: session_metadata_dialog.cc:788
+#: session_metadata_dialog.cc:791
 msgid "Instructor"
 msgstr "Инструктор"
 
-#: session_metadata_dialog.cc:791
+#: session_metadata_dialog.cc:794
 msgid "Course"
 msgstr "Курс"
 
-#: session_metadata_dialog.cc:799
+#: session_metadata_dialog.cc:802
 msgid "Edit Session Metadata"
 msgstr "Метаданные сессии"
 
-#: session_metadata_dialog.cc:830
+#: session_metadata_dialog.cc:833
 msgid "Import session metadata"
 msgstr "Импортировать метаданные сессии"
 
-#: session_metadata_dialog.cc:851
+#: session_metadata_dialog.cc:854
 msgid "Choose session to import metadata from"
 msgstr "Выберите сессию, из которой будут импортированы метаданные"
 
-#: session_metadata_dialog.cc:889
+#: session_metadata_dialog.cc:892
 msgid "This session file could not be read!"
 msgstr "Не удалось прочитать файл сессии!"
 
-#: session_metadata_dialog.cc:899
+#: session_metadata_dialog.cc:902
 msgid ""
 "The session file didn't contain metadata!\n"
 "Maybe this is an old session format?"
@@ -12213,7 +13338,7 @@ msgstr ""
 "В этом файле сессии нет метаданных!\n"
 "Возможно, это файл в старом формате?"
 
-#: session_metadata_dialog.cc:918
+#: session_metadata_dialog.cc:921
 msgid "Import all from:"
 msgstr "Импортировать все из:"
 
@@ -12431,6 +13556,12 @@ msgstr "WAVE-64"
 msgid "RF64 (WAV compatible)"
 msgstr "RF64 (совместим с WAV)"
 
+#: session_option_editor.cc:210 session_option_editor.cc:216
+#: session_option_editor.cc:223
+#, fuzzy
+msgid "Files|Locations"
+msgstr "Расположение файлов"
+
 #: session_option_editor.cc:210
 msgid "File locations"
 msgstr "Расположение файлов"
@@ -12625,26 +13756,14 @@ msgstr "<b>Информация о файле</b>"
 msgid "Timestamp:"
 msgstr "Отметка времени:"
 
-#: sfdb_ui.cc:149
-msgid "Format:"
-msgstr "Формат:"
-
-#: sfdb_ui.cc:188 sfdb_ui.cc:658
+#: sfdb_ui.cc:188 sfdb_ui.cc:659
 msgid "Tags:"
 msgstr "Метки:"
 
-#: sfdb_ui.cc:293 sfdb_ui.cc:409
-msgid "Could not read file: %1 (%2)."
-msgstr "Не удалось прочитать файл: %1 (%2)"
-
 #: sfdb_ui.cc:297
 msgid "<b>Midi File Information</b>"
 msgstr "<b>Сведения о MIDI файле<b>"
 
-#: sfdb_ui.cc:458
-msgid "Could not access soundfile: "
-msgstr "Файл недоступен: "
-
 #: sfdb_ui.cc:530
 msgid "SoundFileBox: Could not tokenize string: "
 msgstr "SoundFileBox: Не удалось разметить строку: "
@@ -12665,11 +13784,11 @@ msgstr "Звуковые файлы"
 msgid "MIDI files"
 msgstr "Файлы MIDI"
 
-#: sfdb_ui.cc:590 add_video_dialog.cc:123
+#: sfdb_ui.cc:590 add_video_dialog.cc:124
 msgid "All files"
 msgstr "Все файлы"
 
-#: sfdb_ui.cc:609 add_video_dialog.cc:246
+#: sfdb_ui.cc:609 add_video_dialog.cc:247
 msgid "Browse Files"
 msgstr "Обзор файлов"
 
@@ -12681,150 +13800,150 @@ msgstr "Расположения"
 msgid "Search Tags"
 msgstr "Поиск по меткам"
 
-#: sfdb_ui.cc:663
+#: sfdb_ui.cc:664
 msgid "Sort:"
 msgstr "Критерий сортировки:"
 
-#: sfdb_ui.cc:671
+#: sfdb_ui.cc:672
 msgid "Longest"
 msgstr "Более длинные"
 
-#: sfdb_ui.cc:672
+#: sfdb_ui.cc:673
 msgid "Shortest"
 msgstr "Более короткие"
 
-#: sfdb_ui.cc:673
+#: sfdb_ui.cc:674
 msgid "Newest"
 msgstr "Более новые"
 
-#: sfdb_ui.cc:674
+#: sfdb_ui.cc:675
 msgid "Oldest"
 msgstr "Более старые"
 
-#: sfdb_ui.cc:675
+#: sfdb_ui.cc:676
 msgid "Most downloaded"
 msgstr "Чаще скачиваемые"
 
-#: sfdb_ui.cc:676
+#: sfdb_ui.cc:677
 msgid "Least downloaded"
 msgstr "Реже скачиваемые"
 
-#: sfdb_ui.cc:677
+#: sfdb_ui.cc:678
 msgid "Highest rated"
 msgstr "Выше оценённые"
 
-#: sfdb_ui.cc:678
+#: sfdb_ui.cc:679
 msgid "Lowest rated"
 msgstr "Ниже оценённые"
 
-#: sfdb_ui.cc:683
+#: sfdb_ui.cc:684
 msgid "More"
 msgstr "Ещё"
 
-#: sfdb_ui.cc:687
+#: sfdb_ui.cc:688
 msgid "Similar"
 msgstr "Дубликат"
 
-#: sfdb_ui.cc:699
+#: sfdb_ui.cc:700
 msgid "ID"
 msgstr "ID"
 
-#: sfdb_ui.cc:700 add_video_dialog.cc:83
+#: sfdb_ui.cc:701 add_video_dialog.cc:84
 msgid "Filename"
 msgstr "Имя файла"
 
-#: sfdb_ui.cc:702
+#: sfdb_ui.cc:703 time_fx_dialog.cc:154
 msgid "Duration"
 msgstr "Длительность"
 
-#: sfdb_ui.cc:703
+#: sfdb_ui.cc:704
 msgid "Size"
 msgstr "Размер"
 
-#: sfdb_ui.cc:704
+#: sfdb_ui.cc:705
 msgid "Samplerate"
 msgstr "Частота сэмплирования"
 
-#: sfdb_ui.cc:705
+#: sfdb_ui.cc:706
 msgid "License"
 msgstr "Лицензия"
 
-#: sfdb_ui.cc:723
+#: sfdb_ui.cc:724
 msgid "Search Freesound"
 msgstr "Поиск по Freesound"
 
-#: sfdb_ui.cc:739
+#: sfdb_ui.cc:741
 msgid "Press to import selected files"
 msgstr "Нажмите для импорта выбранных файлов"
 
-#: sfdb_ui.cc:740
+#: sfdb_ui.cc:742
 msgid "Press to close this window without importing any files"
 msgstr "Нажмите, чтобы закрыть это окно, ничего не импортируя"
 
-#: sfdb_ui.cc:935
+#: sfdb_ui.cc:937
 msgid "SoundFileBrowser: Could not tokenize string: "
 msgstr "SoundFileBrowser: Не удалось разметить строку:"
 
-#: sfdb_ui.cc:1135
+#: sfdb_ui.cc:1137
 msgid "%1 more page of 100 results available"
 msgid_plural "%1 more pages of 100 results available"
 msgstr[0] "Ещё %1 страница из 100 доступных"
 msgstr[1] "Ещё %1 страницы из 100 доступных"
 msgstr[2] "Ещё %1 страниц из 100 доступных"
 
-#: sfdb_ui.cc:1140
+#: sfdb_ui.cc:1142
 msgid "No more results available"
 msgstr "Больше результатов нет"
 
-#: sfdb_ui.cc:1204
+#: sfdb_ui.cc:1206
 msgid "B"
 msgstr "Б"
 
-#: sfdb_ui.cc:1206
+#: sfdb_ui.cc:1208
 msgid "kB"
 msgstr "КБ"
 
-#: sfdb_ui.cc:1208 sfdb_ui.cc:1210
+#: sfdb_ui.cc:1210 sfdb_ui.cc:1212
 msgid "MB"
 msgstr "МБ"
 
-#: sfdb_ui.cc:1212
+#: sfdb_ui.cc:1214
 msgid "GB"
 msgstr "ГБ"
 
-#: sfdb_ui.cc:1429 sfdb_ui.cc:1734 sfdb_ui.cc:1795 sfdb_ui.cc:1813
+#: sfdb_ui.cc:1431 sfdb_ui.cc:1728 sfdb_ui.cc:1764 sfdb_ui.cc:1782
 msgid "one track per file"
 msgstr "Одна дорожка на файл"
 
-#: sfdb_ui.cc:1432 sfdb_ui.cc:1796 sfdb_ui.cc:1814
+#: sfdb_ui.cc:1434 sfdb_ui.cc:1765 sfdb_ui.cc:1783
 msgid "one track per channel"
 msgstr "Одна дорожка на канал"
 
-#: sfdb_ui.cc:1440 sfdb_ui.cc:1798 sfdb_ui.cc:1815
+#: sfdb_ui.cc:1442 sfdb_ui.cc:1767 sfdb_ui.cc:1784
 msgid "sequence files"
 msgstr "Файлы последовательности"
 
-#: sfdb_ui.cc:1443 sfdb_ui.cc:1803
+#: sfdb_ui.cc:1445 sfdb_ui.cc:1772
 msgid "all files in one track"
 msgstr "Все файлы в одну дорожку"
 
-#: sfdb_ui.cc:1444 sfdb_ui.cc:1797
+#: sfdb_ui.cc:1446 sfdb_ui.cc:1766
 msgid "merge files"
 msgstr "Объединить файлы"
 
-#: sfdb_ui.cc:1450 sfdb_ui.cc:1800
+#: sfdb_ui.cc:1452 sfdb_ui.cc:1769
 msgid "one region per file"
 msgstr "Одна область на файл"
 
-#: sfdb_ui.cc:1453 sfdb_ui.cc:1801
+#: sfdb_ui.cc:1455 sfdb_ui.cc:1770
 msgid "one region per channel"
 msgstr "Одна область на канал"
 
-#: sfdb_ui.cc:1458 sfdb_ui.cc:1802 sfdb_ui.cc:1816
+#: sfdb_ui.cc:1460 sfdb_ui.cc:1771 sfdb_ui.cc:1785
 msgid "all files in one region"
 msgstr "Все файлы в одной области"
 
-#: sfdb_ui.cc:1525
+#: sfdb_ui.cc:1527
 msgid ""
 "One or more of the selected files\n"
 "cannot be used by %1"
@@ -12832,100 +13951,100 @@ msgstr ""
 "Один или более выбранных файлов\n"
 "не могут быть использованы в %1"
 
-#: sfdb_ui.cc:1669
+#: sfdb_ui.cc:1671
 msgid "Copy files to session"
 msgstr "Скопировать файлы в сессию"
 
-#: sfdb_ui.cc:1688 sfdb_ui.cc:1856
+#: sfdb_ui.cc:1686 sfdb_ui.cc:1825
 msgid "file timestamp"
 msgstr "По отметке времени файла"
 
-#: sfdb_ui.cc:1689 sfdb_ui.cc:1858
+#: sfdb_ui.cc:1687 sfdb_ui.cc:1827
 msgid "edit point"
 msgstr "По курсору редактора"
 
-#: sfdb_ui.cc:1690 sfdb_ui.cc:1860
+#: sfdb_ui.cc:1688 sfdb_ui.cc:1829
 msgid "playhead"
 msgstr "По указателю воспр."
 
-#: sfdb_ui.cc:1691
+#: sfdb_ui.cc:1689
 msgid "session start"
 msgstr "В начало сессии"
 
-#: sfdb_ui.cc:1697
+#: sfdb_ui.cc:1695
 msgid "<b>Add files ...</b>"
 msgstr "<b>Добавить файлы...</b>"
 
-#: sfdb_ui.cc:1709
+#: sfdb_ui.cc:1700
 msgid "<b>Insert at</b>"
 msgstr "<b>Куда вставить</b>"
 
-#: sfdb_ui.cc:1722
+#: sfdb_ui.cc:1705
 msgid "<b>Mapping</b>"
 msgstr "<b>Способ вставки</b>"
 
-#: sfdb_ui.cc:1740
+#: sfdb_ui.cc:1710
 msgid "<b>Conversion quality</b>"
 msgstr "<b>Качество преобразования:</b>"
 
-#: sfdb_ui.cc:1752
+#: sfdb_ui.cc:1715
 msgid "<b>Instrument</b>"
 msgstr "<b>Инструмент</b>"
 
-#: sfdb_ui.cc:1764 sfdb_ui.cc:1872
+#: sfdb_ui.cc:1734 sfdb_ui.cc:1841
 msgid "Best"
 msgstr "Наилучшее"
 
-#: sfdb_ui.cc:1765 sfdb_ui.cc:1874
+#: sfdb_ui.cc:1735 sfdb_ui.cc:1843
 msgid "Good"
 msgstr "Хорошее"
 
-#: sfdb_ui.cc:1766 sfdb_ui.cc:1876
+#: sfdb_ui.cc:1736 sfdb_ui.cc:1845
 msgid "Quick"
 msgstr "Быстрое"
 
-#: sfdb_ui.cc:1768
+#: sfdb_ui.cc:1738
 msgid "Fastest"
 msgstr "Быстрее всего"
 
-#: shuttle_control.cc:57
+#: shuttle_control.cc:64
 msgid "Shuttle speed control (Context-click for options)"
 msgstr "Контроль скорости воспроизведения (параметры — в контекстном меню)"
 
-#: shuttle_control.cc:184
+#: shuttle_control.cc:202 time_fx_dialog.cc:164
 msgid "Percent"
 msgstr "Проценты"
 
-#: shuttle_control.cc:192
+#: shuttle_control.cc:210
 msgid "Units"
 msgstr "Единица измерения"
 
-#: shuttle_control.cc:198 shuttle_control.cc:633
+#: shuttle_control.cc:216 shuttle_control.cc:679
 msgid "Sprung"
 msgstr "Прыжок"
 
-#: shuttle_control.cc:202 shuttle_control.cc:636
+#: shuttle_control.cc:220 shuttle_control.cc:682
 msgid "Wheel"
 msgstr "Переход"
 
-#: shuttle_control.cc:236
+#: shuttle_control.cc:254
 msgid "Maximum speed"
 msgstr "Макс. скорость"
 
-#: shuttle_control.cc:239
+#: shuttle_control.cc:257
 msgid "Reset to 100%"
 msgstr "Вернуться к 100%"
 
-#: shuttle_control.cc:592
+#: shuttle_control.cc:641
 msgid "Playing"
 msgstr "Воспроизведение"
 
-#: shuttle_control.cc:607
+#: shuttle_control.cc:656
 #, c-format
 msgid "<<< %+d semitones"
 msgstr "<<< %+d полутон"
 
-#: shuttle_control.cc:609
+#: shuttle_control.cc:658
 #, c-format
 msgid ">>> %+d semitones"
 msgstr ">>> %+d полутон"
@@ -12954,7 +14073,7 @@ msgstr "Сделать файлы скачиваемыми"
 msgid "%1: %2 of %3 bytes uploaded"
 msgstr "%1: %2 из %3 байт загружено"
 
-#: splash.cc:75
+#: splash.cc:78
 msgid "%1 loading ..."
 msgstr "Загружается %1..."
 
@@ -12970,7 +14089,7 @@ msgstr "Удалить громкоговоритель"
 msgid "Azimuth:"
 msgstr "Азимут:"
 
-#: startup.cc:70
+#: startup.cc:71
 msgid ""
 "Use an external mixer or the hardware mixer of your audio interface.\n"
 "%1 will play NO role in monitoring"
@@ -12978,11 +14097,11 @@ msgstr ""
 "Использовать внешний микшер или микшер звукового интерфейса.\n"
 "%1 никак не будет участвовать в мониторинге."
 
-#: startup.cc:72
+#: startup.cc:73
 msgid "Ask %1 to play back material as it is being recorded"
 msgstr "Дать %1 воспроизводить материал при его записи"
 
-#: startup.cc:145
+#: startup.cc:146
 msgid ""
 "<span size=\"larger\">%1 is a digital audio workstation. You can use it to "
 "record, edit and mix multi-track audio. You can produce your own CDs, mix "
@@ -12999,15 +14118,15 @@ msgstr ""
 "\n"
 "Перед началом работы с программой необходимо кое-что настроить.</span>"
 
-#: startup.cc:171
+#: startup.cc:172
 msgid "Welcome to %1"
 msgstr "Приветствуем вас в %1"
 
-#: startup.cc:194
+#: startup.cc:195
 msgid "Default folder for %1 sessions"
 msgstr "Папка для сессий %1 по умолчанию"
 
-#: startup.cc:200
+#: startup.cc:201
 msgid ""
 "Each project that you work on with %1 has its own folder.\n"
 "These can require a lot of disk space if you are recording audio.\n"
@@ -13025,11 +14144,11 @@ msgstr ""
 "<i>(Сохранять сессии можно будет где угодно, просто указанная\n"
 "папка будет использоваться по умолчанию)</i>"
 
-#: startup.cc:223
+#: startup.cc:224
 msgid "Default folder for new sessions"
 msgstr "Папка для новых сессий по умолчанию"
 
-#: startup.cc:244
+#: startup.cc:245
 msgid ""
 "While recording instruments or vocals, you probably want to listen to the\n"
 "signal as well as record it. This is called \"monitoring\". There are\n"
@@ -13054,15 +14173,15 @@ msgstr ""
 "<i>Если вы не понимаете смысл этого параметра, просто используйте \n"
 "предлагаемый по умолчанию вариант.</i>"
 
-#: startup.cc:265
+#: startup.cc:266
 msgid "Monitoring Choices"
 msgstr "Способ мониторинга"
 
-#: startup.cc:288
+#: startup.cc:289
 msgid "Use a Master bus directly"
 msgstr "Использовать мастер-шину напрямую"
 
-#: startup.cc:290
+#: startup.cc:291
 msgid ""
 "Connect the Master bus directly to your hardware outputs. This is preferable "
 "for simple usage."
@@ -13070,11 +14189,11 @@ msgstr ""
 "Соединить мастер-шину напрямую с выходами звукового интерфейса.\n"
 "Предпочтительно для простого использования."
 
-#: startup.cc:299
+#: startup.cc:300
 msgid "Use an additional Monitor bus"
 msgstr "Использовать дополнительную шину мониторинга"
 
-#: startup.cc:302
+#: startup.cc:303
 msgid ""
 "Use a Monitor bus between Master bus and hardware outputs for \n"
 "greater control in monitoring without affecting the mix."
@@ -13082,7 +14201,7 @@ msgstr ""
 "Использовать шину мониторинга между мастер-шиной и выходами \n"
 "звукового интерфейса для полного контроля без вмешательства в микс."
 
-#: startup.cc:324
+#: startup.cc:325
 msgid ""
 "<i>You can change this preference at any time via the Preferences dialog.\n"
 "You can also add or remove the monitor section to/from any session.</i>\n"
@@ -13095,45 +14214,41 @@ msgstr ""
 "<i>Если вы не понимаете смысл этого параметра, просто используйте\n"
 "предлагаемое по умолчанию.</i>"
 
-#: startup.cc:335
+#: startup.cc:336
 msgid "Monitor Section"
 msgstr "Секция монитора"
 
-#: step_entry.cc:60
+#: step_entry.cc:59
 msgid "Step Entry: %1"
 msgstr "Пошаговый ввод: %1"
 
-#: step_entry.cc:65
+#: step_entry.cc:64
 msgid ">beat"
 msgstr ">доля"
 
-#: step_entry.cc:66
+#: step_entry.cc:65
 msgid ">bar"
 msgstr ">такт"
 
-#: step_entry.cc:67
+#: step_entry.cc:66
 msgid ">EP"
 msgstr ">ТР"
 
-#: step_entry.cc:68
+#: step_entry.cc:67
 msgid "sustain"
 msgstr "Подтверждать"
 
-#: step_entry.cc:69
+#: step_entry.cc:68
 msgid "rest"
 msgstr "Пауза"
 
-#: step_entry.cc:70
+#: step_entry.cc:69
 msgid "g-rest"
 msgstr "g-пауза"
 
-#: step_entry.cc:71
-msgid "back"
-msgstr "Назад"
-
-#: step_entry.cc:82 step_entry.cc:85
-msgid "+"
-msgstr "+"
+#: step_entry.cc:70
+msgid "back"
+msgstr "Назад"
 
 #: step_entry.cc:191
 msgid "Set note length to a whole note"
@@ -13243,11 +14358,11 @@ msgstr "Вставить смену банка"
 msgid "Insert a program change message"
 msgstr "Вставить смену программы"
 
-#: step_entry.cc:343 step_entry.cc:700
+#: step_entry.cc:343 step_entry.cc:645
 msgid "Move Insert Position Back by Note Length"
 msgstr "Переместить позицию ввода назад на длительность ноты"
 
-#: step_entry.cc:344 step_entry.cc:698
+#: step_entry.cc:344 step_entry.cc:643
 msgid "Move Insert Position to Edit Point"
 msgstr "Переместить позицию ввода к точке редактирования"
 
@@ -13259,230 +14374,230 @@ msgstr "1/Нота"
 msgid "Octave"
 msgstr "Октава"
 
-#: step_entry.cc:598
+#: step_entry.cc:592
 msgid "Insert Note A"
 msgstr "Вставить ноту ля"
 
-#: step_entry.cc:599
+#: step_entry.cc:593
 msgid "Insert Note A-sharp"
 msgstr "Вставить ноту ля-диез"
 
-#: step_entry.cc:600
+#: step_entry.cc:594
 msgid "Insert Note B"
 msgstr "Вставить ноту си"
 
-#: step_entry.cc:601
+#: step_entry.cc:595
 msgid "Insert Note C"
 msgstr "Вставить ноту до"
 
-#: step_entry.cc:602
+#: step_entry.cc:596
 msgid "Insert Note C-sharp"
 msgstr "Вставить ноту до-диез"
 
-#: step_entry.cc:603
+#: step_entry.cc:597
 msgid "Insert Note D"
 msgstr "Вставить ноту ре"
 
-#: step_entry.cc:604
+#: step_entry.cc:598
 msgid "Insert Note D-sharp"
 msgstr "Вставить ноту ре-диез"
 
-#: step_entry.cc:605
+#: step_entry.cc:599
 msgid "Insert Note E"
 msgstr "Вставить ноту ми"
 
-#: step_entry.cc:606
+#: step_entry.cc:600
 msgid "Insert Note F"
 msgstr "Вставить ноту фа"
 
-#: step_entry.cc:607
+#: step_entry.cc:601
 msgid "Insert Note F-sharp"
 msgstr "Вставить ноту фа-диез"
 
-#: step_entry.cc:608
+#: step_entry.cc:602
 msgid "Insert Note G"
 msgstr "Вставить ноту соль"
 
-#: step_entry.cc:609
+#: step_entry.cc:603
 msgid "Insert Note G-sharp"
 msgstr "Вставить ноту соль-диез"
 
-#: step_entry.cc:611
+#: step_entry.cc:605
 msgid "Insert a Note-length Rest"
 msgstr "Вставить паузу длиной в ноту"
 
-#: step_entry.cc:612
+#: step_entry.cc:606
 msgid "Insert a Snap-length Rest"
 msgstr "Вставить паузу длиной в захваченное"
 
-#: step_entry.cc:614 step_entry.cc:615
+#: step_entry.cc:608 step_entry.cc:609
 msgid "Move to next octave"
 msgstr "Перейти к следующей октаве"
 
-#: step_entry.cc:617
+#: step_entry.cc:611
 msgid "Move to Next Note Length"
 msgstr "Перейти к следующей длительности нот"
 
-#: step_entry.cc:618
+#: step_entry.cc:612
 msgid "Move to Previous Note Length"
 msgstr "Перейти к предыдущей длительности нот"
 
-#: step_entry.cc:620
+#: step_entry.cc:614
 msgid "Increase Note Length"
 msgstr "Увеличить длительность ноты"
 
-#: step_entry.cc:621
+#: step_entry.cc:615
 msgid "Decrease Note Length"
 msgstr "Уменьшить длительность ноты"
 
-#: step_entry.cc:623
+#: step_entry.cc:617
 msgid "Move to Next Note Velocity"
 msgstr "Перейти к следующей силе нажатия"
 
-#: step_entry.cc:624
+#: step_entry.cc:618
 msgid "Move to Previous Note Velocity"
 msgstr "Перейти к предыдущей силе нажатия"
 
-#: step_entry.cc:626
+#: step_entry.cc:620
 msgid "Increase Note Velocity"
 msgstr "Увеличить силу нажатия для ноты"
 
-#: step_entry.cc:627
+#: step_entry.cc:621
 msgid "Decrease Note Velocity"
 msgstr "Уменьшить силу нажатия для ноты"
 
-#: step_entry.cc:629
+#: step_entry.cc:623
 msgid "Switch to the 1st octave"
 msgstr "Переключиться на 1-ю октаву"
 
-#: step_entry.cc:630
+#: step_entry.cc:624
 msgid "Switch to the 2nd octave"
 msgstr "Переключиться на 2-ю октаву"
 
-#: step_entry.cc:631
+#: step_entry.cc:625
 msgid "Switch to the 3rd octave"
 msgstr "Переключиться на 3-ю октаву"
 
-#: step_entry.cc:632
+#: step_entry.cc:626
 msgid "Switch to the 4th octave"
 msgstr "Переключиться на 4-ю октаву"
 
-#: step_entry.cc:633
+#: step_entry.cc:627
 msgid "Switch to the 5th octave"
 msgstr "Переключиться на 5-ю октаву"
 
-#: step_entry.cc:634
+#: step_entry.cc:628
 msgid "Switch to the 6th octave"
 msgstr "Переключиться на 6-ю октаву"
 
-#: step_entry.cc:635
+#: step_entry.cc:629
 msgid "Switch to the 7th octave"
 msgstr "Переключиться на 7-ю октаву"
 
-#: step_entry.cc:636
+#: step_entry.cc:630
 msgid "Switch to the 8th octave"
 msgstr "Переключиться на 8-ю октаву"
 
-#: step_entry.cc:637
+#: step_entry.cc:631
 msgid "Switch to the 9th octave"
 msgstr "Переключиться на 9-ю октаву"
 
-#: step_entry.cc:638
+#: step_entry.cc:632
 msgid "Switch to the 10th octave"
 msgstr "Переключиться на 10-ю октаву"
 
-#: step_entry.cc:639
+#: step_entry.cc:633
 msgid "Switch to the 11th octave"
 msgstr "Переключиться на 11-ю октаву"
 
-#: step_entry.cc:644
+#: step_entry.cc:635
+msgid "Toggle Triple Notes"
+msgstr "Перекл. тройных нот"
+
+#: step_entry.cc:638
+msgid "Toggle Chord Entry"
+msgstr "Переключить ввод аккордов"
+
+#: step_entry.cc:640
+msgid "Sustain Selected Notes by Note Length"
+msgstr "Выдерживать выбранные ноты по длине"
+
+#: step_entry.cc:650
 msgid "Set Note Length to Whole"
 msgstr "Установить длину ноты равной целой ноте"
 
-#: step_entry.cc:646
+#: step_entry.cc:652
 msgid "Set Note Length to 1/2"
 msgstr "Установить длину ноты равной 1/2"
 
-#: step_entry.cc:648
+#: step_entry.cc:654
 msgid "Set Note Length to 1/3"
 msgstr "Установить длину ноты равной 1/3"
 
-#: step_entry.cc:650
+#: step_entry.cc:656
 msgid "Set Note Length to 1/4"
 msgstr "Установить длину ноты равной 1/4"
 
-#: step_entry.cc:652
+#: step_entry.cc:658
 msgid "Set Note Length to 1/8"
 msgstr "Установить длину ноты равной 1/8"
 
-#: step_entry.cc:654
+#: step_entry.cc:660
 msgid "Set Note Length to 1/16"
 msgstr "Установить длину ноты равной 1/16"
 
-#: step_entry.cc:656
+#: step_entry.cc:662
 msgid "Set Note Length to 1/32"
 msgstr "Установить длину ноты равной 1/32"
 
-#: step_entry.cc:658
+#: step_entry.cc:664
 msgid "Set Note Length to 1/64"
 msgstr "Установить длину ноты равной 1/64"
 
-#: step_entry.cc:663
+#: step_entry.cc:669
 msgid "Set Note Velocity to Pianississimo"
 msgstr "Поменять силу нажатия ноты на пиано-пианиссимо"
 
-#: step_entry.cc:665
+#: step_entry.cc:671
 msgid "Set Note Velocity to Pianissimo"
 msgstr "Поменять силу нажатия ноты на пианиссимо"
 
-#: step_entry.cc:667
+#: step_entry.cc:673
 msgid "Set Note Velocity to Piano"
 msgstr "Поменять силу нажатия ноты на пиано"
 
-#: step_entry.cc:669
+#: step_entry.cc:675
 msgid "Set Note Velocity to Mezzo-Piano"
 msgstr "Поменять силу нажатия ноты на меццо-пиано"
 
-#: step_entry.cc:671
+#: step_entry.cc:677
 msgid "Set Note Velocity to Mezzo-Forte"
 msgstr "Поменять силу нажатия ноты на меццо-форте"
 
-#: step_entry.cc:673
+#: step_entry.cc:679
 msgid "Set Note Velocity to Forte"
 msgstr "Поменять силу нажатия ноты на форте"
 
-#: step_entry.cc:675 step_entry.cc:677
+#: step_entry.cc:681 step_entry.cc:683
 msgid "Set Note Velocity to Fortississimo"
 msgstr "Поменять силу нажатия ноты на форте-фортиссимо"
 
-#: step_entry.cc:679
-msgid "Toggle Triple Notes"
-msgstr "Перекл. тройных нот"
-
-#: step_entry.cc:684
+#: step_entry.cc:688
 msgid "No Dotted Notes"
 msgstr "Нет пунктирных нот"
 
-#: step_entry.cc:686
+#: step_entry.cc:689
 msgid "Toggled Dotted Notes"
 msgstr "Подключенные пунктирные ноты"
 
-#: step_entry.cc:688
+#: step_entry.cc:690
 msgid "Toggled Double-Dotted Notes"
 msgstr "Подключенные двойные пунктирные ноты"
 
-#: step_entry.cc:690
+#: step_entry.cc:691
 msgid "Toggled Triple-Dotted Notes"
 msgstr "Подключенные тройные пунктирные ноты"
 
-#: step_entry.cc:693
-msgid "Toggle Chord Entry"
-msgstr "Переключить ввод аккордов"
-
-#: step_entry.cc:695
-msgid "Sustain Selected Notes by Note Length"
-msgstr "Выдерживать выбранные ноты по длине"
-
 #: stereo_panner.cc:129
 #, c-format
 msgid "L:%3d R:%3d Width:%d%%"
@@ -13504,6 +14619,10 @@ msgstr "Ширина"
 msgid "Strip Silence"
 msgstr "Вырезать тишину"
 
+#: strip_silence_dialog.cc:65
+msgid "Threshold"
+msgstr "Порог"
+
 #: strip_silence_dialog.cc:76
 msgid "Minimum length"
 msgstr "Минимальная длина"
@@ -13516,164 +14635,173 @@ msgstr "Длина фейда"
 msgid "Analyzing"
 msgstr "Выполняется анализ"
 
-#: tempo_dialog.cc:41 tempo_dialog.cc:57
+#: tempo_dialog.cc:43 tempo_dialog.cc:60
 msgid "bar:"
 msgstr "в такте:"
 
-#: tempo_dialog.cc:42 tempo_dialog.cc:58
+#: tempo_dialog.cc:44 tempo_dialog.cc:61
 msgid "beat:"
 msgstr "в доле:"
 
-#: tempo_dialog.cc:43 tempo_dialog.cc:59
+#: tempo_dialog.cc:45 tempo_dialog.cc:62
 msgid "Pulse note"
 msgstr "Пульсирующая нота"
 
-#: tempo_dialog.cc:44 tempo_dialog.cc:60
+#: tempo_dialog.cc:46 tempo_dialog.cc:63
 msgid "Tap tempo"
 msgstr "TAP время"
 
-#: tempo_dialog.cc:77 tempo_dialog.cc:78 tempo_dialog.cc:343
-#: tempo_dialog.cc:344
+#: tempo_dialog.cc:81 tempo_dialog.cc:82 tempo_dialog.cc:448
+#: tempo_dialog.cc:449
 msgid "whole"
 msgstr "целая"
 
-#: tempo_dialog.cc:79 tempo_dialog.cc:80 tempo_dialog.cc:345
-#: tempo_dialog.cc:346
+#: tempo_dialog.cc:83 tempo_dialog.cc:84 tempo_dialog.cc:450
+#: tempo_dialog.cc:451
 msgid "second"
 msgstr "1/2"
 
-#: tempo_dialog.cc:81 tempo_dialog.cc:82 tempo_dialog.cc:347
-#: tempo_dialog.cc:348
+#: tempo_dialog.cc:85 tempo_dialog.cc:86 tempo_dialog.cc:452
+#: tempo_dialog.cc:453
 msgid "third"
 msgstr "1/3"
 
-#: tempo_dialog.cc:83 tempo_dialog.cc:84 tempo_dialog.cc:349
-#: tempo_dialog.cc:350
+#: tempo_dialog.cc:87 tempo_dialog.cc:88 tempo_dialog.cc:454
+#: tempo_dialog.cc:455
 msgid "quarter"
 msgstr "1/4"
 
-#: tempo_dialog.cc:85 tempo_dialog.cc:86 tempo_dialog.cc:351
-#: tempo_dialog.cc:352
+#: tempo_dialog.cc:89 tempo_dialog.cc:90 tempo_dialog.cc:456
+#: tempo_dialog.cc:457
 msgid "eighth"
 msgstr "1/8"
 
-#: tempo_dialog.cc:87 tempo_dialog.cc:88 tempo_dialog.cc:353
-#: tempo_dialog.cc:354
+#: tempo_dialog.cc:91 tempo_dialog.cc:92 tempo_dialog.cc:458
+#: tempo_dialog.cc:459
 msgid "sixteenth"
 msgstr "1/16"
 
-#: tempo_dialog.cc:89 tempo_dialog.cc:90 tempo_dialog.cc:355
-#: tempo_dialog.cc:356
+#: tempo_dialog.cc:93 tempo_dialog.cc:94 tempo_dialog.cc:460
+#: tempo_dialog.cc:461
 msgid "thirty-second"
 msgstr "1/32"
 
-#: tempo_dialog.cc:91 tempo_dialog.cc:92 tempo_dialog.cc:357
-#: tempo_dialog.cc:358
+#: tempo_dialog.cc:95 tempo_dialog.cc:96 tempo_dialog.cc:462
+#: tempo_dialog.cc:463
 msgid "sixty-fourth"
 msgstr "1/64"
 
-#: tempo_dialog.cc:93 tempo_dialog.cc:94 tempo_dialog.cc:359
-#: tempo_dialog.cc:360
+#: tempo_dialog.cc:97 tempo_dialog.cc:98 tempo_dialog.cc:464
+#: tempo_dialog.cc:465
 msgid "one-hundred-twenty-eighth"
 msgstr "1/128"
 
-#: tempo_dialog.cc:121
+#: tempo_dialog.cc:115 tempo_dialog.cc:116
+msgid "ramped"
+msgstr "Плавно меняющийся"
+
+#: tempo_dialog.cc:117 tempo_dialog.cc:118
+msgid "constant"
+msgstr "Постоянный"
+
+#: tempo_dialog.cc:133 tempo_dialog.cc:134 tempo_dialog.cc:482
+#: tempo_dialog.cc:483
+msgid "music"
+msgstr "Музыкальный"
+
+#: tempo_dialog.cc:161
 msgid "Beats per minute:"
 msgstr "Долей в минуту:"
 
-#: tempo_dialog.cc:155
+#: tempo_dialog.cc:195
 msgid "Tempo begins at"
 msgstr "Темп начинается"
 
-#: tempo_dialog.cc:254
+#: tempo_dialog.cc:201
+msgid "Lock Style:"
+msgstr "Стиль привязки:"
+
+#: tempo_dialog.cc:209
+msgid "Tempo Type:"
+msgstr "Тип темпа:"
+
+#: tempo_dialog.cc:321
 msgid "incomprehensible pulse note type (%1)"
 msgstr "непонятный тип пульсирующей ноты (%1)"
 
-#: tempo_dialog.cc:375
+#: tempo_dialog.cc:334
+msgid "incomprehensible tempo type (%1)"
+msgstr ""
+
+#: tempo_dialog.cc:347
+msgid "incomprehensible lock style (%1)"
+msgstr ""
+
+#: tempo_dialog.cc:498
 msgid "Note value:"
 msgstr "Значение ноты: "
 
-#: tempo_dialog.cc:376
+#: tempo_dialog.cc:499
+msgid "Lock style:"
+msgstr "Стиль привязки:"
+
+#: tempo_dialog.cc:500
 msgid "Beats per bar:"
 msgstr "Долей на такт:"
 
-#: tempo_dialog.cc:390
+#: tempo_dialog.cc:514
 msgid "Meter begins at bar:"
 msgstr "Размер начинается в такте:"
 
-#: tempo_dialog.cc:503
+#: tempo_dialog.cc:638
 msgid "incomprehensible meter note type (%1)"
 msgstr "непонятный тип нотного ритма (%1)"
 
-#: theme_manager.cc:61
-msgid "Dark Theme"
-msgstr "Тёмная тема"
-
-#: theme_manager.cc:62
-msgid "Light Theme"
-msgstr "Светлая тема"
-
-#: theme_manager.cc:63
-msgid "Restore Defaults"
-msgstr "Восстановить исходные значения"
+#: tempo_dialog.cc:651
+msgid "incomprehensible meter lock style (%1)"
+msgstr ""
 
-#: theme_manager.cc:64
+#: theme_manager.cc:53
 msgid "Draw \"flat\" buttons"
 msgstr "Рисовать кнопки плоскими"
 
-#: theme_manager.cc:65
+#: theme_manager.cc:54
 msgid "Blink Rec-Arm buttons"
 msgstr "Мигать кнопками готовности к записи"
 
-#: theme_manager.cc:66
+#: theme_manager.cc:55
 msgid "Color regions using their track's color"
 msgstr "Раскрашивать области цветом дорожки"
 
-#: theme_manager.cc:67
+#: theme_manager.cc:56
 msgid "Show waveform clipping"
 msgstr "Показывать клиппинг волновой формы"
 
-#: theme_manager.cc:69
+#: theme_manager.cc:58
 msgid "Waveforms color gradient depth"
 msgstr "Глубина градиента волновой формы сигнала"
 
-#: theme_manager.cc:71
+#: theme_manager.cc:60
 msgid "Timeline item gradient depth"
 msgstr "Глубина градиента объектов на таймлайне"
 
-#: theme_manager.cc:72
+#: theme_manager.cc:61
 msgid "All floating windows are dialogs"
 msgstr "Все плавающие окна являются диалогами"
 
-#: theme_manager.cc:73
+#: theme_manager.cc:62
 msgid "Transient windows follow front window."
 msgstr "Временные окна следуют за получающим фокус основным окном"
 
-#: theme_manager.cc:74
+#: theme_manager.cc:63
 msgid "Float detached monitor-section window"
 msgstr ""
 
-#: theme_manager.cc:75
+#: theme_manager.cc:64
 msgid "Icon Set"
 msgstr "Набор значков:"
 
-#: theme_manager.cc:84
-msgid "Object"
-msgstr "Объект"
-
-#: theme_manager.cc:162
-msgid "Items"
-msgstr "Элементы"
-
-#: theme_manager.cc:163
-msgid "Palette"
-msgstr "Палитра"
-
-#: theme_manager.cc:164
-msgid "Transparency"
-msgstr "Прозрачность"
-
-#: theme_manager.cc:195
+#: theme_manager.cc:132
 msgid ""
 "Mark all floating windows to be type \"Dialog\" rather than using \"Utility"
 "\" for some.\n"
@@ -13684,7 +14812,7 @@ msgstr ""
 "Это может помочь с некоторыми оконными менеджерами.\n"
 "Изменения вступят в силу после перезапуска %1."
 
-#: theme_manager.cc:199
+#: theme_manager.cc:136
 msgid ""
 "Make transient windows follow the front window when toggling between the "
 "editor and mixer.\n"
@@ -13694,18 +14822,14 @@ msgstr ""
 "при переключении между редактором и микшером.\n"
 "Это изменение вступит в силу после перезапуска %1."
 
-#: theme_manager.cc:202
+#: theme_manager.cc:139
 msgid ""
 "When detaching the monitoring section, mark it as \"Utility\" window to stay "
 "in front.\n"
 "This requires a restart of %1 to take effect"
 msgstr ""
 
-#: theme_manager.cc:643
-msgid "Color Palette"
-msgstr "Цветовая палитра"
-
-#: time_axis_view.cc:150
+#: time_axis_view.cc:148
 msgid "Track/Bus name (double click to edit)"
 msgstr "Имя дорожки/шины (двойной клик для редактирования)"
 
@@ -13716,71 +14840,71 @@ msgstr[0] "Новая длительность размером %1 кадр на
 msgstr[1] "Новая длительность размером %1 кадра находится за пределами %2"
 msgstr[2] "Новая длительность размером %1 кадров находится за пределами %2"
 
-#: time_fx_dialog.cc:62
+#: time_fx_dialog.cc:60
 msgid "Quick but Ugly"
 msgstr "Быстро и грубо"
 
-#: time_fx_dialog.cc:63
+#: time_fx_dialog.cc:61
 msgid "Skip Anti-aliasing"
 msgstr "Без фильтрации"
 
-#: time_fx_dialog.cc:64
-msgid "Contents:"
-msgstr "Содержит:"
+#: time_fx_dialog.cc:62
+msgid "Contents"
+msgstr ""
 
-#: time_fx_dialog.cc:65
+#: time_fx_dialog.cc:63
 msgid "Minimize time distortion"
 msgstr "Минимизировать искажения"
 
-#: time_fx_dialog.cc:66
+#: time_fx_dialog.cc:64
 msgid "Preserve Formants"
 msgstr "Сохранить форманты"
 
-#: time_fx_dialog.cc:71
+#: time_fx_dialog.cc:81
 msgid "TimeFXDialog"
 msgstr "TimeFXDialog"
 
-#: time_fx_dialog.cc:74
+#: time_fx_dialog.cc:84
 msgid "Pitch Shift Audio"
 msgstr "Смена высоты тона"
 
-#: time_fx_dialog.cc:76
+#: time_fx_dialog.cc:86
 msgid "Time Stretch Audio"
 msgstr "Растягивание во времени"
 
-#: time_fx_dialog.cc:104 transpose_dialog.cc:41
+#: time_fx_dialog.cc:114 transpose_dialog.cc:41
 msgid "Octaves:"
 msgstr "Октавы:"
 
-#: time_fx_dialog.cc:109 transpose_dialog.cc:46
+#: time_fx_dialog.cc:119 transpose_dialog.cc:46
 msgid "Semitones:"
 msgstr "Полутона:"
 
-#: time_fx_dialog.cc:114
+#: time_fx_dialog.cc:124
 msgid "Cents:"
 msgstr "Сотые:"
 
-#: time_fx_dialog.cc:122
+#: time_fx_dialog.cc:132
 msgid "Time|Shift"
 msgstr "Сдвиг"
 
-#: time_fx_dialog.cc:146 time_fx_dialog.cc:149
+#: time_fx_dialog.cc:184 time_fx_dialog.cc:188
 msgid "TimeFXButton"
 msgstr "TimeFXButton"
 
-#: time_fx_dialog.cc:154
+#: time_fx_dialog.cc:193
 msgid "Stretch/Shrink"
 msgstr "Изменить"
 
-#: time_fx_dialog.cc:164
+#: time_fx_dialog.cc:203
 msgid "<b>Progress</b>"
 msgstr "<b>Прогресс</b>"
 
-#: time_info_box.cc:124
+#: time_info_box.cc:118
 msgid "Start recording at auto-punch start"
 msgstr "Начать запись с начала автоврезки"
 
-#: time_info_box.cc:125
+#: time_info_box.cc:119
 msgid "Stop recording at auto-punch end"
 msgstr "Остановить запись в конце автоврезки"
 
@@ -13848,146 +14972,195 @@ msgstr "Транспонировать MIDI"
 msgid "Transpose"
 msgstr "Транспонировать"
 
-#: ui_config.cc:230 ui_config.cc:368
+#: ui_config.cc:234 ui_config.cc:422
 msgid "Loading default ui configuration file %1"
 msgstr "Загрузка файла конфигурации UI по умолчанию %1"
 
-#: ui_config.cc:233 ui_config.cc:371
+#: ui_config.cc:237 ui_config.cc:425
 msgid "cannot read default ui configuration file \"%1\""
 msgstr "Невозможно прочитать основной файл конфигурации интерфейса \"%1\""
 
-#: ui_config.cc:236 ui_config.cc:376
+#: ui_config.cc:240 ui_config.cc:430
 msgid "default ui configuration file \"%1\" not loaded successfully."
 msgstr "Основной файл конфигурации интерфейса \"%1\" не был успешно загружен"
 
-#: ui_config.cc:244
+#: ui_config.cc:248
 msgid "Could not find default UI configuration file %1"
 msgstr "Не удалось найти конфигурационный файл %1 для интерфейса"
 
-#: ui_config.cc:287
+#: ui_config.cc:289
 msgid "Loading color file %1"
 msgstr "Загружается файл %1 с описанием цветовой схемы"
 
-#: ui_config.cc:290
+#: ui_config.cc:292
 msgid "cannot read color file \"%1\""
 msgstr "Невозможно прочитать файл %1 с описанием цветовой схемы"
 
-#: ui_config.cc:295
+#: ui_config.cc:297
 msgid "color file \"%1\" not loaded successfully."
 msgstr "Файл %1 с описанием цветовой схемы не был успешно загружен."
 
-#: ui_config.cc:301
-msgid "Color file %1 not found"
+#: ui_config.cc:325
+#, fuzzy
+msgid "Color file for %1 not found along %2"
 msgstr "Файл %1 с описанием цветовой схемы не найден"
 
-#: ui_config.cc:350 ui_config.cc:429
+#: ui_config.cc:403 ui_config.cc:486
 msgid "Color file %1 not saved"
 msgstr "Файл %1 с описанием цветовой схемы не сохранён"
 
-#: ui_config.cc:385
+#: ui_config.cc:439
 msgid "Loading user ui configuration file %1"
 msgstr "Загрузка файла пользовательской конфигурации UI %1"
 
-#: ui_config.cc:388
+#: ui_config.cc:442
 msgid "cannot read ui configuration file \"%1\""
 msgstr "Невозможно прочитать файл конфигурации UI \"%1\""
 
-#: ui_config.cc:393
+#: ui_config.cc:447
 msgid "user ui configuration file \"%1\" not loaded successfully."
 msgstr "Конфигурация UI интерфейса файлa \"%1\" не загружена успешно."
 
-#: ui_config.cc:401
+#: ui_config.cc:455
 msgid "could not find any ui configuration file, canvas will look broken."
 msgstr "Невозможно найти файл конфигурации UI, это будет выглядеть сломаным."
 
-#: ui_config.cc:419
+#: ui_config.cc:476
 msgid "Config file %1 not saved"
 msgstr "Конфигурационный файл %1 не сохранён"
 
-#: ui_config.cc:660
+#: ui_config.cc:720
 msgid "Color %1 not found"
 msgstr "Цвет %1 не обнаружен"
 
-#: ui_config.cc:730
+#: ui_config.cc:790
 msgid "Unable to find UI style file %1 in search path %2. %3 will look strange"
 msgstr ""
 "Не удается найти файл стилей пользовательского интерфейса %1 в пути поиска "
 "%2. % 3 будет выглядеть странно"
 
-#: utils.cc:114 utils.cc:157
+#: utils.cc:118 utils.cc:161
 msgid "bad XPM header %1"
 msgstr "Плохой заголовок XPM %1"
 
-#: utils.cc:574
+#: utils.cc:365
 msgid "cannot find XPM file for %1"
 msgstr "Невозможно найти файл XPM для %1"
 
-#: utils.cc:594 utils.cc:624 utils.cc:638
+#: utils.cc:418 utils.cc:448 utils.cc:468
 msgid "default"
 msgstr "по умолчанию"
 
-#: utils.cc:639
+#: utils.cc:469
 msgid "icon \"%1\" not found for icon set \"%2\", fallback to default"
 msgstr ""
 "значок \"%1\" не найден для набора \"%2\", возврат к установкам по умолчанию"
 
-#: utils.cc:646
+#: utils.cc:476
 msgid "cannot find icon image for %1 using %2"
 msgstr "Невозможно найти файл значка для %1 с помощью %2"
 
-#: utils.cc:663 utils.cc:679
+#: utils.cc:493 utils.cc:509
 msgid "Caught exception while loading icon named %1"
 msgstr "Получено исключение при загрузке значка с именем %1"
 
-#: utils.cc:939
+#: utils.cc:759
 msgid "Overwrite"
 msgstr "Перезаписать"
 
-#: add_video_dialog.cc:54
+#: vca_master_strip.cc:74 vca_time_axis.cc:49
+msgid "Solo slaves"
+msgstr "Сделать ведомые солирующими"
+
+#: vca_master_strip.cc:79 vca_time_axis.cc:55
+msgid "Mute slaves"
+msgstr "Приглушить ведомые"
+
+#: vca_master_strip.cc:83
+msgid "Hide this VCA strip"
+msgstr "Скрыть этот канал VCA"
+
+#: vca_master_strip.cc:108 vca_master_strip.cc:418
+msgid "Click to show slaves only"
+msgstr "Щёлкните, чтобы показать только ведомые каналы"
+
+#: vca_master_strip.cc:293
+msgid "A"
+msgstr "A"
+
+#: vca_master_strip.cc:300
+msgid "S"
+msgstr "C"
+
+#: vca_master_strip.cc:398
+msgid "Drop All Slaves"
+msgstr "Отсоединить все ведомые"
+
+#: vca_master_strip.cc:421
+msgid "Click to show normal mixer"
+msgstr "Щёлкните, чтобы показать обычный микшер"
+
+#: add_video_dialog.cc:55
 msgid "Set Video Track"
 msgstr "Установка видеодорожки"
 
-#: add_video_dialog.cc:62
+#: add_video_dialog.cc:63
 msgid "Open Video Monitor Window"
 msgstr "Открыть окно видеомонитора"
 
-#: add_video_dialog.cc:63
+#: add_video_dialog.cc:64
 msgid "Adjust Session Framerate to Match Video Framerate"
 msgstr "Подогнать частоту кадров сессии к частоте кадров видео"
 
-#: add_video_dialog.cc:65
+#: add_video_dialog.cc:66
 msgid "Reload docroot"
 msgstr "Перезагрузка корня каталога с данными"
 
-#: add_video_dialog.cc:120
+#: add_video_dialog.cc:121
 msgid "Video files"
 msgstr "Видеофайлы"
 
-#: add_video_dialog.cc:149
+#: add_video_dialog.cc:150
 msgid "<b>Video Information</b>"
 msgstr "<b>Информация о видеофайле</b>"
 
-#: add_video_dialog.cc:152
+#: add_video_dialog.cc:153
 msgid "Start:"
 msgstr "Начало:"
 
-#: add_video_dialog.cc:158
+#: add_video_dialog.cc:159
 msgid "Frame rate:"
 msgstr "Частота кадров::"
 
-#: add_video_dialog.cc:161
+#: add_video_dialog.cc:162
 msgid "Aspect Ratio:"
 msgstr "Соотношение сторон:"
 
-#: add_video_dialog.cc:244
+#: add_video_dialog.cc:245
 msgid "VideoServerIndex"
 msgstr "Индекс видеосервера"
 
-#: add_video_dialog.cc:675
+#: add_video_dialog.cc:676
 msgid " %1 fps"
 msgstr " %1 к/с"
 
-#: video_timeline.cc:472
+#: vca_time_axis.cc:60
+msgid "D"
+msgstr "Диск"
+
+#: vca_time_axis.cc:61
+msgid "Unassign all slaves"
+msgstr "Отсоединить все ведомые"
+
+#: vca_time_axis.cc:65
+msgid "V"
+msgstr "V"
+
+#: vca_time_axis.cc:66
+msgid "Show only slaves"
+msgstr "Показывать только ведомые"
+
+#: video_timeline.cc:473
 msgid ""
 "Parsing video file info failed. Is the Video Server running? Is the file "
 "readable by the Video Server? Does the docroot match? Is it a video file?"
@@ -13995,7 +15168,7 @@ msgstr ""
 "Разбор информация видеофайл не удался. Работает ли видеосервер? Доступен ли "
 "файл для чтения с видеосервера? Совпадает ли docroot? Это видеофайл?"
 
-#: video_timeline.cc:510
+#: video_timeline.cc:511
 msgid ""
 "Failed to set session-framerate: '%1' does not have a corresponding option "
 "setting in %2."
@@ -14003,7 +15176,7 @@ msgstr ""
 "Не удалось установить чатоту кадров сессии: '%1' не имеет соответствующей "
 "опции настройки в %2."
 
-#: video_timeline.cc:518
+#: video_timeline.cc:519
 msgid ""
 "Video file's framerate is not equal to %1 session timecode's framerate: '%2' "
 "vs '%3'"
@@ -14011,7 +15184,7 @@ msgstr ""
 "Частота кадров видеофайла не равна частоте кадров таймкода сессии %1: '%2' "
 "против '%3'"
 
-#: video_timeline.cc:591
+#: video_timeline.cc:592
 msgid ""
 "Video-server docroot mismatch. %1: '%2', video-server: '%3'. This usually "
 "means that the video server was not started by %1 and uses a different "
@@ -14021,7 +15194,7 @@ msgstr ""
 "видеосервер: '%3'. Как правило, это означает, что видеосервер не был запущен "
 "от имени Ardour и используется другие различные корневые документы."
 
-#: video_timeline.cc:728
+#: video_timeline.cc:729
 msgid ""
 "Video-monitor 'xjadeo' was not found. Please install http://xjadeo.sf.net/ "
 "(a custom path to xjadeo can be specified by setting the XJREMOTE "
@@ -14037,11 +15210,11 @@ msgstr ""
 "\n"
 "См. так же:  http://manual.ardour.org/video-timeline/setup/"
 
-#: video_timeline.cc:743
+#: video_timeline.cc:744
 msgid "Video-monitor 'xjadeo' cannot be launched."
 msgstr "Видеомонитор 'xjadeo' не может быть запущен."
 
-#: video_timeline.cc:770
+#: video_timeline.cc:776
 msgid ""
 "Video-monitor 'xjadeo' is too old. Please install xjadeo version 0.7.7 or "
 "later. http://xjadeo.sf.net/"
@@ -14049,7 +15222,7 @@ msgstr ""
 "Видеомонитор 'xjadeo' слишком стар. Пожалуйста, установите xjadeo версию "
 "0.7.7 или более позднюю. http://xjadeo.sf.net/"
 
-#: video_monitor.cc:285
+#: video_monitor.cc:283
 msgid "Video Monitor: File Not Found."
 msgstr "Видеомонитор: файл не найден"
 
@@ -14121,10 +15294,6 @@ msgstr ""
 msgid "FPS:"
 msgstr "ф/с:"
 
-#: transcode_video_dialog.cc:139
-msgid "Duration:"
-msgstr "Длительность:"
-
 #: transcode_video_dialog.cc:141
 msgid "Codec:"
 msgstr "Кодек:"
@@ -14264,12 +15433,12 @@ msgstr "Установить видеосервер исполняемым"
 msgid "Server docroot"
 msgstr "Корневая папка документов видеосервера"
 
-#: utils_videotl.cc:61
+#: utils_videotl.cc:63
 msgid "Destination is outside Video Server's docroot. "
 msgstr ""
 "Направление находится за пределами корневой папки документов видеосервера."
 
-#: utils_videotl.cc:62
+#: utils_videotl.cc:64
 msgid ""
 "The destination file path is outside of the Video Server's docroot. The file "
 "will not be readable by the Video Server. Do you still want to continue?"
@@ -14278,15 +15447,15 @@ msgstr ""
 "видеосервера. Файл будет недоступен на видеосервере. Вы все еще хотите "
 "продолжить?"
 
-#: utils_videotl.cc:65
+#: utils_videotl.cc:67
 msgid "Continue"
 msgstr "Дальше"
 
-#: utils_videotl.cc:72
+#: utils_videotl.cc:74
 msgid "Confirm Overwrite"
 msgstr "Подтвердите перезапись"
 
-#: utils_videotl.cc:82 utils_videotl.cc:98
+#: utils_videotl.cc:84 utils_videotl.cc:100
 msgid "Cannot create video folder \"%1\" (%2)"
 msgstr "Не удалось создать папку для видео: \"%1\" (%2)"
 
@@ -14393,16 +15562,16 @@ msgid "Audio Samplerate:"
 msgstr "Частота сэмплирования звука:"
 
 #: export_video_dialog.cc:215 export_video_dialog.cc:223
-#: export_video_dialog.cc:801 export_video_dialog.cc:804
+#: export_video_dialog.cc:814 export_video_dialog.cc:817
 msgid "(default for format)"
 msgstr "(по умолчанию для контейнера)"
 
 #: export_video_dialog.cc:233 export_video_dialog.cc:244
-#: export_video_dialog.cc:808 export_video_dialog.cc:817
+#: export_video_dialog.cc:821 export_video_dialog.cc:830
 msgid "(default)"
 msgstr "(по умолчанию)"
 
-#: export_video_dialog.cc:245 export_video_dialog.cc:811
+#: export_video_dialog.cc:245 export_video_dialog.cc:824
 msgid "(retain)"
 msgstr "(исходная)"
 
@@ -14418,19 +15587,19 @@ msgstr "от начала до конца видео"
 msgid "Selected range"
 msgstr "Выбранный диапазон"
 
-#: export_video_dialog.cc:560
+#: export_video_dialog.cc:561
 msgid "Normalizing audio"
 msgstr "Выполняется нормировка звука"
 
-#: export_video_dialog.cc:564
+#: export_video_dialog.cc:566 export_video_dialog.cc:571
 msgid "Exporting audio"
 msgstr "Экспорт звука"
 
-#: export_video_dialog.cc:619
+#: export_video_dialog.cc:632
 msgid "Exporting Audio..."
 msgstr "Экспортируется звук..."
 
-#: export_video_dialog.cc:676
+#: export_video_dialog.cc:689
 msgid ""
 "Export Video: Cannot query duration of video-file, using duration from "
 "timeline instead."
@@ -14438,36 +15607,36 @@ msgstr ""
 "Экспорт видео: невозможно запросить длительность видеофайла, вместо неё "
 "используется длительность проекта."
 
-#: export_video_dialog.cc:706
+#: export_video_dialog.cc:719
 msgid "Export Video: export-range does not include video."
 msgstr "Экспорт видео: экспортный диапазон не содержит видео."
 
-#: export_video_dialog.cc:719
+#: export_video_dialog.cc:732
 msgid "Export Video: No Master Out Ports to Connect for Audio Export"
 msgstr ""
 "Экспорт видео: нет соединяемых портов выхода мастер-шины для экспорта звука"
 
-#: export_video_dialog.cc:761
+#: export_video_dialog.cc:774
 msgid "Encoding Video..."
 msgstr "Кодируется видео..."
 
-#: export_video_dialog.cc:781
+#: export_video_dialog.cc:794
 msgid "Export Video: Video input file cannot be read."
 msgstr "Экспорт видео: не удалось прочитать используемый видеофайл"
 
-#: export_video_dialog.cc:887
+#: export_video_dialog.cc:900
 msgid "Encoding Video.. Pass 1/2"
 msgstr "Выполняется кодирование видео. Проход 1/2."
 
-#: export_video_dialog.cc:899
+#: export_video_dialog.cc:912
 msgid "Encoding Video.. Pass 2/2"
 msgstr "Выполняется кодирование видео. Проход 2/2."
 
-#: export_video_dialog.cc:1002
+#: export_video_dialog.cc:1015
 msgid "Transcoding failed."
 msgstr "Не удалось выполнить перекодировку."
 
-#: export_video_dialog.cc:1238 export_video_dialog.cc:1258
+#: export_video_dialog.cc:1251 export_video_dialog.cc:1271
 msgid "Save Exported Video File"
 msgstr "Сохранить экспортированный видеофайл"
 
@@ -14495,6 +15664,208 @@ msgid ""
 "Open Manual in Browser? "
 msgstr ""
 
+#~ msgid "Break drag or deselect all"
+#~ msgstr "Прервать перетаскивания или отменить все"
+
+#~ msgid "Select an action, then press the key(s) to (re)set its shortcut"
+#~ msgstr "Выберите действие и нажмите комбинацию клавиш для него"
+
+#~ msgid "Program "
+#~ msgstr "Программа"
+
+#~ msgid "*Comments*"
+#~ msgstr "*Кмт*"
+
+#~ msgid "*Cmt*"
+#~ msgstr "*Кмт*"
+
+#~ msgid "Remote Control ID..."
+#~ msgstr "ID для удалённого управления..."
+
+#~ msgid "dbFS"
+#~ msgstr "dbFS"
+
+#~ msgid ":monitor"
+#~ msgstr ": монитор"
+
+#~ msgid "system:"
+#~ msgstr "Система:"
+
+#~ msgid "alsa_pcm:"
+#~ msgstr "alsa_pcm:"
+
+#~ msgid "alsa_midi:"
+#~ msgstr "alsa_midi:"
+
+#~ msgid "Control surface remote ID"
+#~ msgstr "ID для удалённого управления"
+
+#~ msgid "assigned by user"
+#~ msgstr "Назначенные пользователем"
+
+#~ msgid "follows order of mixer"
+#~ msgstr "Следуют порядку микшера"
+
+#~ msgid "You cannot create a track with that name as it is reserved for %1"
+#~ msgstr ""
+#~ "Вы не можете добавить дорожку с названием, которое зарезервировано для %1"
+
+#~ msgid "Remote Control ID"
+#~ msgstr "ID для удалённого управления"
+
+#~ msgid "Remote control ID:"
+#~ msgstr "ID для удалённого управления:"
+
+#~ msgid ""
+#~ "The remote control ID of %1 is: %2\n"
+#~ "\n"
+#~ "\n"
+#~ "The remote control ID of %3 cannot be changed."
+#~ msgstr ""
+#~ "ID для удалённого управления %1: %2\n"
+#~ "\n"
+#~ "\n"
+#~ "%3 не может получить другой ID."
+
+#~ msgid "the master bus"
+#~ msgstr "Мастер-шина"
+
+#~ msgid "the monitor bus"
+#~ msgstr "Шина мониторинга"
+
+#~ msgid ""
+#~ "The remote control ID of %5 is: %2\n"
+#~ "\n"
+#~ "\n"
+#~ "Remote Control IDs are currently determined by track/bus ordering in %6.\n"
+#~ "\n"
+#~ "%3Use the User Interaction tab of the Preferences window if you want to "
+#~ "change this%4"
+#~ msgstr ""
+#~ "ID дистанционного управления %5 это: %2\n"
+#~ "\n"
+#~ "\n"
+#~ "Идентификаторы дистанционного управления в настоящее время определены "
+#~ "порядком дорожки/шины в %6.\n"
+#~ "\n"
+#~ "%3Используйте вкладку пользовательской интеракции  окна Установки, если "
+#~ "вы хотите изменить это %4"
+
+#~ msgid "Dark Theme"
+#~ msgstr "Тёмная тема"
+
+#~ msgid "Light Theme"
+#~ msgstr "Светлая тема"
+
+#~ msgid "Display model"
+#~ msgstr "Модель отображения"
+
+#~ msgid "Composite graphs for each track"
+#~ msgstr "Составной график для каждой дорожки"
+
+#~ msgid "Composite graph of all tracks"
+#~ msgstr "Составной график для всех дорожек"
+
+#~ msgid "Normalize values"
+#~ msgstr "Нормировать значения"
+
+#~ msgid "Open Video"
+#~ msgstr "Добавить видео"
+
+#~ msgid "Export to Video File"
+#~ msgstr "Экспортировать в видеофайл"
+
+#~ msgid "Add Lua Script"
+#~ msgstr "Добавить скрипт Lua"
+
+#~ msgid "Save as..."
+#~ msgstr "Сохранить как..."
+
+#~ msgid "Trigger gap"
+#~ msgstr "Интервал триггера"
+
+#~ msgid ""
+#~ "%1%2\n"
+#~ "(built from revision %3)\n"
+#~ "%4"
+#~ msgstr ""
+#~ "%1%2\n"
+#~ "(собрано из редакции %3)\n"
+#~ "%4"
+
+#~ msgid "Busses"
+#~ msgstr "Шины"
+
+#~ msgid "This screen is not tall enough to display the mixer window"
+#~ msgstr "Экран недостаточно высок, чтобы показать окно микшера"
+
+#~ msgid "Toggle Editor+Mixer"
+#~ msgstr "Редактор или микшер на переднем плане"
+
+#~ msgid "Reattach All Tearoffs"
+#~ msgstr "Заново прикрепить разрывы"
+
+#~ msgid "Show Logo"
+#~ msgstr "Показать логотип"
+
+#~ msgid "Loaded editor bindings from %1"
+#~ msgstr "Загруженный редактор привязки от %1"
+
+#~ msgid "Could not find editor.bindings in search path %1"
+#~ msgstr "Не удалось найти редактор привязок в пути поиска %1"
+
+#~ msgid "duplicate selection"
+#~ msgstr "Дублирование выделения"
+
+#~ msgid "<i>Build filename(s) from these components:</i>"
+#~ msgstr "<i>Сформировать имена файлов из следующих компонентов:</i>"
+
+#~ msgid "<small><i>Current (approximate) filename: \"%1\"</i></small>"
+#~ msgstr "<small><i>Текущее предполагаемое имя файла: \"%1\"</i></small>"
+
+#~ msgid "Main_menu"
+#~ msgstr "Главное меню"
+
+#~ msgid "redirectmenu"
+#~ msgstr "Меню перенаправления"
+
+#~ msgid "Editor_menus"
+#~ msgstr "Редактор меню"
+
+#~ msgid "ProcessorMenu"
+#~ msgstr "Меню обработчика"
+
+#~ msgid "Loaded mixer bindings from %1"
+#~ msgstr "Загруженные привязки микшера от %1"
+
+#~ msgid "Could not find mixer.bindings in search path %1"
+#~ msgstr "Не удалось найти привязки микшера в пути поиска %1"
+
+#~ msgid ""
+#~ "It is not possible to add a port here, as the first processor in the "
+#~ "track or buss cannot support the new configuration."
+#~ msgstr ""
+#~ "Невозможно добавить сюда порт, поскольку первый обработчик дорожки или "
+#~ "шины не может поддерживать новую конфигурацию."
+
+#~ msgid ""
+#~ "This port cannot be removed.\n"
+#~ "Either the first plugin in the track or buss cannot accept\n"
+#~ "the new number of inputs or the last plugin has more outputs."
+#~ msgstr ""
+#~ "Этот порт не может быть удален.\n"
+#~ "Либо первый плагин в дорожке или шине не может принять новое\n"
+#~ "количество входов, либо у последнего плагина больше выходов."
+
+#~ msgid "Sync/Slave"
+#~ msgstr "Синхронизация и ведомый режим"
+
+#~ msgid "Solo / mute"
+#~ msgstr "Соло/Приглушение"
+
+#~ msgid "Contents:"
+#~ msgstr "Содержит:"
+
 #~ msgid "Adjusting the scale require an application restart to re-layout."
 #~ msgstr "После коррекции масштаба необходимо перезапустить приложение"
 
@@ -14715,12 +16086,6 @@ msgstr ""
 #~ msgid "update transport clock display at FPS instead of every 100ms"
 #~ msgstr "Обновлять часы транспорта по FPS, а не каждые 100 мс"
 
-#~ msgid "Align With Existing Material"
-#~ msgstr "С записанным материалом"
-
-#~ msgid "Align With Capture Time"
-#~ msgstr "По времени захвата"
-
 #~ msgid "Select From All..."
 #~ msgstr "Выбрать из всех..."
 
@@ -14774,9 +16139,6 @@ msgstr ""
 #~ msgid "Export track output"
 #~ msgstr "Экспортировать выходы дорожки"
 
-#~ msgid "Peak"
-#~ msgstr "Пиковое значение"
-
 #~ msgid "K20"
 #~ msgstr "K20"
 
@@ -14896,9 +16258,6 @@ msgstr ""
 #~ msgid "Remove bus"
 #~ msgstr "Удаление шины"
 
-#~ msgid "V"
-#~ msgstr "V"
-
 #~ msgid "group|G"
 #~ msgstr "Гр"
 
@@ -14929,18 +16288,12 @@ msgstr ""
 #~ msgid "O"
 #~ msgstr "O"
 
-#~ msgid "A"
-#~ msgstr "A"
-
 #~ msgid "I"
 #~ msgstr "Вход"
 
 #~ msgid "R"
 #~ msgstr "R"
 
-#~ msgid "S"
-#~ msgstr "C"
-
 #~ msgid "SI"
 #~ msgstr "SI"
 
@@ -14953,9 +16306,6 @@ msgstr ""
 #~ msgid "C"
 #~ msgstr "C"
 
-#~ msgid "D"
-#~ msgstr "Диск"
-
 #~ msgid "Sync lock timecode to clock - Disable drift compensation."
 #~ msgstr "Привязать тайм-код к часам (отключить компенсацию смещения)"
 
@@ -15015,56 +16365,6 @@ msgstr ""
 #~ msgid "%u samples"
 #~ msgstr "%u сэмплов"
 
-#~ msgid ""
-#~ "<b>Welcome to this BETA release of Ardour %1</b>\n"
-#~ "\n"
-#~ "Ardour %1 has been released for Linux but because of the lack of "
-#~ "testers,\n"
-#~ "it is still at the beta stage on OS X. So, a few guidelines:\n"
-#~ "\n"
-#~ "1) Please do <b>NOT</b> use this software with the expectation that it is "
-#~ "stable or reliable\n"
-#~ "   though it may be so, depending on your workflow.\n"
-#~ "2) <b>Please do NOT use the forums at ardour.org to report issues</b>.\n"
-#~ "3) Please <b>DO</b> use the bugtracker at http://tracker.ardour.org/ to "
-#~ "report issues\n"
-#~ "   making sure to note the product version number as %1-beta.\n"
-#~ "4) Please <b>DO</b> use the ardour-users mailing list to discuss ideas "
-#~ "and pass on comments.\n"
-#~ "5) Please <b>DO</b> join us on IRC for real time discussions about "
-#~ "ardour3. You\n"
-#~ "   can get there directly from Ardour via the Help->Chat menu option.\n"
-#~ "\n"
-#~ "Full information on all the above can be found on the support page at\n"
-#~ "\n"
-#~ "                http://ardour.org/support\n"
-#~ msgstr ""
-#~ "<b>Перед вами БЕТА-версия Ardour %1</b>\n"
-#~ "\n"
-#~ "Версия для Linux уже выпущена, но за отсутствием достаточного количества\n"
-#~ "тестировщиков версия для OS X является бетой. Отсюда — несколько "
-#~ "советов:\n"
-#~ "\n"
-#~ "1) Пожалуйста,  <b>НЕ</b> используйте программу в надежде на то, что она\n"
-#~ "   достаточно стабильна для повседневного использования, хотя для кого-"
-#~ "то\n"
-#~ "   это и может быть так.\n"
-#~ "2) <b>Пожалуйста, НЕ используйте форум на ardour.org для сообщения об "
-#~ "ошибках</b>.\n"
-#~ "3) Пожалуйста, <b>ИСПОЛЬЗУЙТЕ</b> трекер на http://tracker.ardour.org/ "
-#~ "для\n"
-#~ "   сообщения об ошибках, не забыв указать, что они относятся к 3.0-beta.\n"
-#~ "4) Пожалуйста, <b>ПИШИТЕ</b> в список рассылки ardour-users свои "
-#~ "комментарии\n"
-#~ "   и идеи касательно новой версии.\n"
-#~ "5) Пожалуйста, <b>ИСПОЛЬЗУЙТЕ</b>  наш канал IRC для обсуждения ardour3\n"
-#~ "   с разработчиками программы в режиме реального времени. Вы можете\n"
-#~ "   сделать это, выбрав в главном меню пункт «Справка > Пообщаться».\n"
-#~ "\n"
-#~ "Более подробную информацию обо всём этом можно получить на странице\n"
-#~ "\n"
-#~ "                http://ardour.org/support\n"
-
 #~ msgid "This is a BETA RELEASE"
 #~ msgstr "Это БЕТА-версия программы"
 
diff --git a/gtk2_ardour/po/sv.mo b/gtk2_ardour/po/sv.mo
new file mode 100644
index 0000000..8f207b5
Binary files /dev/null and b/gtk2_ardour/po/sv.mo differ
diff --git a/gtk2_ardour/po/sv.po b/gtk2_ardour/po/sv.po
index 833d087..939f158 100644
--- a/gtk2_ardour/po/sv.po
+++ b/gtk2_ardour/po/sv.po
@@ -7,264 +7,297 @@ msgid ""
 msgstr ""
 "Project-Id-Version: ardour-gtk 1.0.2\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-03-31 20:13-0400\n"
+"POT-Creation-Date: 2016-07-14 06:20-0400\n"
 "PO-Revision-Date: 2006-06-26 23:57+GMT+1\n"
 "Last-Translator: Petter Sundlöf <petter.sundlof at findus.dhs.org>\n"
 "Language-Team: Svenska <sv at li.org>\n"
-"Language: \n"
+"Language: Swedish\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: about.cc:125
+#: about.cc:127
+msgid "Fons Adriaensen"
+msgstr ""
+
+#: about.cc:128
 msgid "Brian Ahr"
 msgstr ""
 
-#: about.cc:126
+#: about.cc:129
 msgid "John Anderson"
 msgstr ""
 
-#: about.cc:127
+#: about.cc:130
 msgid "Marcus Andersson"
 msgstr ""
 
-#: about.cc:128
+#: about.cc:131
 msgid "Nedko Arnaudov"
 msgstr ""
 
-#: about.cc:129
+#: about.cc:132
 msgid "Hans Baier"
 msgstr ""
 
-#: about.cc:130
+#: about.cc:133
 msgid "Ben Bell"
 msgstr ""
 
-#: about.cc:131
+#: about.cc:134
 msgid "Sakari Bergen"
 msgstr ""
 
-#: about.cc:132
+#: about.cc:135
 msgid "Christian Borss"
 msgstr ""
 
-#: about.cc:133
+#: about.cc:136
 msgid "Chris Cannam"
 msgstr ""
 
-#: about.cc:134
+#: about.cc:137
 msgid "Jeremy Carter"
 msgstr ""
 
-#: about.cc:135
+#: about.cc:138
 msgid "Jesse Chappell"
 msgstr ""
 
-#: about.cc:136
+#: about.cc:139
 msgid "Thomas Charbonnel"
 msgstr ""
 
-#: about.cc:137
+#: about.cc:140
 msgid "Sam Chessman"
 msgstr ""
 
-#: about.cc:138
+#: about.cc:141
 msgid "André Colomb"
 msgstr ""
 
-#: about.cc:139
+#: about.cc:142
 msgid "Paul Davis"
 msgstr ""
 
-#: about.cc:140
+#: about.cc:143
 msgid "Gerard van Dongen"
 msgstr ""
 
-#: about.cc:141
+#: about.cc:144
 msgid "John Emmas"
 msgstr ""
 
-#: about.cc:142
+#: about.cc:145
 msgid "Colin Fletcher"
 msgstr ""
 
-#: about.cc:143
+#: about.cc:146
 msgid "Dave Flick"
 msgstr ""
 
-#: about.cc:144
+#: about.cc:147
 msgid "Hans Fugal"
 msgstr ""
 
-#: about.cc:145
+#: about.cc:148
 msgid "Robin Gareus"
 msgstr ""
 
-#: about.cc:146
+#: about.cc:149
+msgid "Nil Geisweiller"
+msgstr ""
+
+#: about.cc:150
 msgid "Christopher George"
 msgstr ""
 
-#: about.cc:147
+#: about.cc:151
 msgid "Chris Goddard"
 msgstr ""
 
-#: about.cc:148
+#: about.cc:152
 msgid "J. Abelardo Gutierrez"
 msgstr ""
 
-#: about.cc:149
+#: about.cc:153
 msgid "Jeremy Hall"
 msgstr ""
 
-#: about.cc:150
+#: about.cc:154
 msgid "Audun Halland"
 msgstr ""
 
-#: about.cc:151
+#: about.cc:155
 msgid "David Halter"
 msgstr ""
 
-#: about.cc:152
+#: about.cc:156
 msgid "Steve Harris"
 msgstr ""
 
-#: about.cc:153
+#: about.cc:157
 msgid "Melvin Ray Herr"
 msgstr ""
 
-#: about.cc:154
+#: about.cc:158
 msgid "Carl Hetherington"
 msgstr ""
 
-#: about.cc:155
+#: about.cc:159
 msgid "Rob Holland"
 msgstr ""
 
-#: about.cc:156
+#: about.cc:160
 msgid "Robert Jordens"
 msgstr ""
 
-#: about.cc:157
+#: about.cc:161
 msgid "Stefan Kersten"
 msgstr ""
 
-#: about.cc:158
+#: about.cc:162
 msgid "Armand Klenk"
 msgstr ""
 
-#: about.cc:159
+#: about.cc:163
 msgid "Julien de Kozak"
 msgstr ""
 
-#: about.cc:160
+#: about.cc:164
 msgid "Matt Krai"
 msgstr ""
 
-#: about.cc:161
+#: about.cc:165
 msgid "Georg Krause"
 msgstr ""
 
-#: about.cc:162
+#: about.cc:166
 msgid "Nick Lanham"
 msgstr ""
 
-#: about.cc:163
+#: about.cc:167
 msgid "Colin Law"
 msgstr ""
 
-#: about.cc:164
+#: about.cc:168
 msgid "Joshua Leach"
 msgstr ""
 
-#: about.cc:165
+#: about.cc:169
 msgid "Ben Loftis"
 msgstr ""
 
-#: about.cc:166
+#: about.cc:170
 msgid "Nick Mainsbridge"
 msgstr ""
 
-#: about.cc:167
+#: about.cc:171
 msgid "Tim Mayberry"
 msgstr ""
 
-#: about.cc:168
+#: about.cc:172
 msgid "Doug Mclain"
 msgstr ""
 
-#: about.cc:169
+#: about.cc:173
 msgid "Todd Naugle"
 msgstr ""
 
-#: about.cc:170
+#: about.cc:174
+msgid "André Nusser"
+msgstr ""
+
+#: about.cc:175
+msgid "Bent Bisballe Nyeng"
+msgstr ""
+
+#: about.cc:176
 msgid "Jack O'Quin"
 msgstr ""
 
-#: about.cc:171
+#: about.cc:177
+msgid "Pavel Potocek"
+msgstr ""
+
+#: about.cc:178
 msgid "Nimal Ratnayake"
 msgstr ""
 
-#: about.cc:172
+#: about.cc:179
+msgid "Julien Rivaud"
+msgstr ""
+
+#: about.cc:180
 msgid "David Robillard"
 msgstr ""
 
-#: about.cc:173
+#: about.cc:181
+msgid "Julien Roger"
+msgstr ""
+
+#: about.cc:182
 msgid "Taybin Rutkin"
 msgstr ""
 
-#: about.cc:174
+#: about.cc:183
 msgid "Andreas Ruge"
 msgstr ""
 
-#: about.cc:175
+#: about.cc:184
 msgid "Sampo Savolainen"
 msgstr ""
 
-#: about.cc:176
+#: about.cc:185
 msgid "Rodrigo Severo"
 msgstr ""
 
-#: about.cc:177
+#: about.cc:186
 msgid "Per Sigmond"
 msgstr ""
 
-#: about.cc:178
+#: about.cc:187
 msgid "Lincoln Spiteri"
 msgstr ""
 
-#: about.cc:179
+#: about.cc:188
 msgid "Mike Start"
 msgstr ""
 
-#: about.cc:180
+#: about.cc:189
 msgid "Mark Stewart"
 msgstr ""
 
-#: about.cc:181
+#: about.cc:190
 msgid "Roland Stigge"
 msgstr ""
 
-#: about.cc:182
+#: about.cc:191
 msgid "Petter Sundlöf"
 msgstr ""
 
-#: about.cc:183
+#: about.cc:192
 msgid "Mike Täht"
 msgstr ""
 
-#: about.cc:184
+#: about.cc:193
 msgid "Roy Vegard"
 msgstr ""
 
-#: about.cc:185
+#: about.cc:194
 msgid "Thorsten Wilms"
 msgstr ""
 
-#: about.cc:186
+#: about.cc:195
+msgid "Damien Zammit"
+msgstr ""
+
+#: about.cc:196
 msgid "Grygorii Zharun"
 msgstr ""
 
-#: about.cc:191
+#: about.cc:201
 msgid ""
 "French:\n"
 "\tAlain Fréhel <alain.frehel at free.fr>\n"
@@ -273,7 +306,7 @@ msgid ""
 "\tRomain Arnaud <roming22 at gmail.com>\n"
 msgstr ""
 
-#: about.cc:192
+#: about.cc:202
 msgid ""
 "German:\n"
 "\tKarsten Petersen <kapet at kapet.de>\n"
@@ -285,210 +318,264 @@ msgid ""
 "\tRobin Gloster <robin at loc-com.de>\n"
 msgstr ""
 
-#: about.cc:199
+#: about.cc:209
 msgid ""
 "Italian:\n"
 "\tFilippo Pappalardo <filippo at email.it>\n"
 "\tRaffaele Morelli <raffaele.morelli at gmail.com>\n"
 msgstr ""
 
-#: about.cc:200
+#: about.cc:210
 msgid ""
 "Portuguese:\n"
 "\tRui Nuno Capela <rncbc at rncbc.org>\n"
 msgstr ""
 
-#: about.cc:201
+#: about.cc:211
 msgid ""
 "Brazilian Portuguese:\n"
 "\tAlexander da Franca Fernandes <alexander at nautae.eti.br>\n"
 "\tChris Ross <chris at tebibyte.org>\n"
 msgstr ""
 
-#: about.cc:203
+#: about.cc:213
 msgid ""
 "Spanish:\n"
 "\t Alex Krohn <alexkrohn at fastmail.fm>\n"
 "\tPablo Fernández <pablo.fbus at gmail.com>\n"
 msgstr ""
 
-#: about.cc:204
+#: about.cc:214
 msgid ""
 "Russian:\n"
 "\t Igor Blinov <pitstop at nm.ru>\n"
 "\tAlexandre Prokoudine <alexandre.prokoudine at gmail.com>\n"
 msgstr ""
 
-#: about.cc:206
+#: about.cc:216
 msgid ""
 "Greek:\n"
 "\t Klearchos Gourgourinis <muadib at in.gr>\n"
 msgstr ""
 
-#: about.cc:207
+#: about.cc:217
 msgid ""
 "Swedish:\n"
 "\t Petter Sundlöf <petter.sundlof at gmail.com>\n"
 msgstr ""
 
-#: about.cc:208
+#: about.cc:218
 msgid ""
 "Polish:\n"
 "\t Piotr Zaryk <pzaryk at gmail.com>\n"
 msgstr ""
 
-#: about.cc:209
+#: about.cc:219
 msgid ""
 "Czech:\n"
 "\t Pavel Fric <pavelfric at seznam.cz>\n"
 msgstr ""
 
-#: about.cc:210
+#: about.cc:220
 msgid ""
 "Norwegian:\n"
 "\t Eivind Ødegård\n"
 msgstr ""
 
-#: about.cc:211
+#: about.cc:221
 msgid ""
 "Chinese:\n"
 "\t Rui-huai Zhang <zrhzrh at mail.ustc.edu.cn>\n"
 msgstr ""
 
-#: about.cc:591
+#: about.cc:601
+msgid "Intel 64-bit"
+msgstr ""
+
+#: about.cc:603
+msgid "Intel 32-bit"
+msgstr ""
+
+#: about.cc:605
+msgid "PowerPC 64-bit"
+msgstr ""
+
+#: about.cc:607
+msgid "PowerPC 32-bit"
+msgstr ""
+
+#: about.cc:609
+msgid "64-bit"
+msgstr ""
+
+#: about.cc:611
+msgid "32-bit"
+msgstr ""
+
+#: about.cc:619
+msgid " - debug"
+msgstr ""
+
+#: about.cc:625
 msgid "Copyright (C) 1999-2015 Paul Davis\n"
 msgstr ""
 
-#: about.cc:595
+#: about.cc:629
 msgid "http://ardour.org/"
 msgstr ""
 
-#: about.cc:596
+#: about.cc:630
 msgid ""
 "%1%2\n"
-"(built from revision %3)"
+"(rev %3)\n"
+"%4%5"
 msgstr ""
 
-#: about.cc:600
+#: about.cc:635
 msgid "Config"
 msgstr ""
 
-#: actions.cc:85
+#: actions.cc:83
 msgid "Loading menus from %1"
 msgstr ""
 
-#: actions.cc:88 actions.cc:89
+#: actions.cc:86 actions.cc:87
 msgid "badly formatted menu definition file: %1"
 msgstr ""
 
-#: actions.cc:91
+#: actions.cc:89
 msgid "%1 menu definition file not found"
 msgstr ""
 
-#: actions.cc:95 actions.cc:96
+#: actions.cc:93 actions.cc:94
 msgid "%1 will not work without a valid menu definition file"
 msgstr ""
 
-#: add_route_dialog.cc:54 route_params_ui.cc:524
-msgid "Add Track or Bus"
-msgstr "Lägg till spår eller buss"
+#: add_route_dialog.cc:58
+msgid "Add Track/Bus/VCA"
+msgstr ""
 
-#: add_route_dialog.cc:57
+#: add_route_dialog.cc:61
 msgid "Configuration:"
 msgstr "Konfiguration:"
 
-#: add_route_dialog.cc:58
+#: add_route_dialog.cc:62
 msgid "Record Mode:"
 msgstr ""
 
-#: add_route_dialog.cc:59
+#: add_route_dialog.cc:63
 msgid "Instrument:"
 msgstr ""
 
-#: add_route_dialog.cc:77
+#: add_route_dialog.cc:77 add_route_dialog.cc:228
 msgid "Audio Tracks"
 msgstr "Ljudspår"
 
-#: add_route_dialog.cc:78 add_route_dialog.cc:209
+#: add_route_dialog.cc:78 add_route_dialog.cc:224
 msgid "MIDI Tracks"
 msgstr ""
 
-#: add_route_dialog.cc:79 add_route_dialog.cc:211
+#: add_route_dialog.cc:79 add_route_dialog.cc:226
 msgid "Audio+MIDI Tracks"
 msgstr ""
 
-#: add_route_dialog.cc:80 add_route_dialog.cc:207
-msgid "Busses"
+#: add_route_dialog.cc:80 add_route_dialog.cc:220
+msgid "Audio Busses"
+msgstr ""
+
+#: add_route_dialog.cc:81 add_route_dialog.cc:222
+msgid "MIDI Busses"
+msgstr ""
+
+#: add_route_dialog.cc:82
+msgid "VCA Masters"
 msgstr ""
 
-#: add_route_dialog.cc:83 add_route_dialog.cc:559
+#: add_route_dialog.cc:85 add_route_dialog.cc:622
 msgid "First"
 msgstr ""
 
-#: add_route_dialog.cc:84 add_route_dialog.cc:561
-msgid "After Editor Selection"
+#: add_route_dialog.cc:86 add_route_dialog.cc:626
+msgid "Before Selection"
 msgstr ""
 
-#: add_route_dialog.cc:85 add_route_dialog.cc:563
-msgid "After Mixer Selection"
+#: add_route_dialog.cc:87 add_route_dialog.cc:624
+msgid "After Selection"
 msgstr ""
 
-#: add_route_dialog.cc:86
+#: add_route_dialog.cc:88
 msgid "Last"
 msgstr ""
 
-#: add_route_dialog.cc:103
+#: add_route_dialog.cc:91
+msgid "Flexible-I/O"
+msgstr ""
+
+#: add_route_dialog.cc:92
+msgid "Strict-I/O"
+msgstr ""
+
+#: add_route_dialog.cc:108
 msgid "Add:"
 msgstr "Lägg till"
 
-#: add_route_dialog.cc:116 time_fx_dialog.cc:91 add_video_dialog.cc:135
-#: video_server_dialog.cc:121
+#: add_route_dialog.cc:121 time_fx_dialog.cc:101 add_video_dialog.cc:135
+#: video_server_dialog.cc:118
 msgid "<b>Options</b>"
 msgstr "<b>Alternativ</b>"
 
-#: add_route_dialog.cc:126 bundle_manager.cc:193 region_editor.cc:50
-#: route_group_dialog.cc:71
+#: add_route_dialog.cc:131 bundle_manager.cc:193 region_editor.cc:52
+#: route_group_dialog.cc:70
 msgid "Name:"
 msgstr "Namn:"
 
-#: add_route_dialog.cc:156
+#: add_route_dialog.cc:155
 msgid "Group:"
 msgstr "Grupp:"
 
-#: add_route_dialog.cc:162
+#: add_route_dialog.cc:161
 msgid "Insert:"
 msgstr ""
 
-#: add_route_dialog.cc:223 add_route_dialog.cc:232 add_route_dialog.cc:306
-#: ardour_ui_ed.cc:539 engine_dialog.cc:237 rc_option_editor.cc:1805
-#: rc_option_editor.cc:1807 rc_option_editor.cc:1809 rc_option_editor.cc:1827
-#: rc_option_editor.cc:1829 rc_option_editor.cc:1837 rc_option_editor.cc:1839
-#: rc_option_editor.cc:1857 rc_option_editor.cc:1870 rc_option_editor.cc:1872
-#: rc_option_editor.cc:1874 rc_option_editor.cc:1919 rc_option_editor.cc:1921
-#: rc_option_editor.cc:1923 rc_option_editor.cc:1931 rc_option_editor.cc:1939
-#: rc_option_editor.cc:1941 rc_option_editor.cc:1949
+#: add_route_dialog.cc:171
+msgid "Output Ports:"
+msgstr ""
+
+#: add_route_dialog.cc:176 rc_option_editor.cc:2474
+msgid ""
+"With strict-i/o enabled, Effect Processors will not modify the number of "
+"channels on a track. The number of output channels will always match the "
+"number of input channels."
+msgstr ""
+
+#: add_route_dialog.cc:240 add_route_dialog.cc:351 ardour_ui_ed.cc:636
+#: engine_dialog.cc:244 plugin_pin_dialog.cc:67 rc_option_editor.cc:2397
+#: rc_option_editor.cc:2399 rc_option_editor.cc:2401 rc_option_editor.cc:2419
+#: rc_option_editor.cc:2421 rc_option_editor.cc:2429 rc_option_editor.cc:2432
+#: rc_option_editor.cc:2450 rc_option_editor.cc:2463 rc_option_editor.cc:2472
+#: rc_option_editor.cc:2478 rc_option_editor.cc:2480 rc_option_editor.cc:2525
+#: rc_option_editor.cc:2527 rc_option_editor.cc:2529 rc_option_editor.cc:2537
 msgid "Audio"
 msgstr "Ljudspår"
 
-#: add_route_dialog.cc:224 add_route_dialog.cc:235 add_route_dialog.cc:307
-#: editor_actions.cc:109 engine_dialog.cc:239 missing_file_dialog.cc:56
-#: rc_option_editor.cc:2084 rc_option_editor.cc:2094 rc_option_editor.cc:2102
-#: rc_option_editor.cc:2110 rc_option_editor.cc:2119 rc_option_editor.cc:2127
-#: rc_option_editor.cc:2135 rc_option_editor.cc:2143 rc_option_editor.cc:2152
-#: rc_option_editor.cc:2161 rc_option_editor.cc:2170 rc_option_editor.cc:2178
-#: rc_option_editor.cc:2186 rc_option_editor.cc:2194 rc_option_editor.cc:2217
+#: add_route_dialog.cc:243 add_route_dialog.cc:352 editor_actions.cc:112
+#: engine_dialog.cc:246 missing_file_dialog.cc:60 mixer_ui.cc:1895
+#: plugin_pin_dialog.cc:68 rc_option_editor.cc:2672 rc_option_editor.cc:2674
+#: rc_option_editor.cc:2684 rc_option_editor.cc:2693 rc_option_editor.cc:2701
+#: rc_option_editor.cc:2709 rc_option_editor.cc:2717 rc_option_editor.cc:2790
+#: rc_option_editor.cc:2813
 msgid "MIDI"
 msgstr ""
 
-#: add_route_dialog.cc:225 add_route_dialog.cc:238 add_route_dialog.cc:308
+#: add_route_dialog.cc:246 add_route_dialog.cc:353
 msgid "Audio+MIDI"
 msgstr ""
 
-#: add_route_dialog.cc:226 add_route_dialog.cc:241 add_route_dialog.cc:309
+#: add_route_dialog.cc:250 add_route_dialog.cc:354
 msgid "Bus"
 msgstr ""
 
-#: add_route_dialog.cc:268
+#: add_route_dialog.cc:286
 msgid ""
 "Audio+MIDI tracks are intended for use <b>ONLY</b> with plugins that use "
 "both audio and MIDI input data\n"
@@ -497,60 +584,61 @@ msgid ""
 "track instead."
 msgstr ""
 
-#: add_route_dialog.cc:327 add_route_dialog.cc:346 editor_actions.cc:422
-#: editor_rulers.cc:251 time_axis_view.cc:1374
+#: add_route_dialog.cc:373 add_route_dialog.cc:385 editor_actions.cc:456
+#: editor_rulers.cc:250 time_axis_view.cc:1290
 msgid "Normal"
 msgstr ""
 
-#: add_route_dialog.cc:330 add_route_dialog.cc:348
+#: add_route_dialog.cc:374 add_route_dialog.cc:387
 msgid "Non Layered"
 msgstr "Ej lagerläge"
 
-#: add_route_dialog.cc:331 add_route_dialog.cc:350
+#: add_route_dialog.cc:375 add_route_dialog.cc:389
 msgid "Tape"
 msgstr "Band"
 
-#: add_route_dialog.cc:431 monitor_section.cc:290
+#: add_route_dialog.cc:476 monitor_section.cc:273 plugin_pin_dialog.cc:509
+#: plugin_setup_dialog.cc:202
 msgid "Mono"
 msgstr ""
 
-#: add_route_dialog.cc:435
+#: add_route_dialog.cc:480 plugin_pin_dialog.cc:512 plugin_setup_dialog.cc:205
 msgid "Stereo"
 msgstr ""
 
-#: add_route_dialog.cc:459
+#: add_route_dialog.cc:503
 msgid "3 Channel"
 msgstr "3 kanaler"
 
-#: add_route_dialog.cc:463
+#: add_route_dialog.cc:507
 msgid "4 Channel"
 msgstr "4 kanaler"
 
-#: add_route_dialog.cc:467
+#: add_route_dialog.cc:511
 msgid "5 Channel"
 msgstr "5 kanaler"
 
-#: add_route_dialog.cc:471
+#: add_route_dialog.cc:515
 msgid "6 Channel"
 msgstr "6 kanaler"
 
-#: add_route_dialog.cc:475
+#: add_route_dialog.cc:519
 msgid "8 Channel"
 msgstr "8 kanaler"
 
-#: add_route_dialog.cc:479
+#: add_route_dialog.cc:523
 msgid "12 Channel"
 msgstr "12 kanaler"
 
-#: add_route_dialog.cc:483 mixer_strip.cc:1836 mixer_strip.cc:2244
+#: add_route_dialog.cc:527 mixer_strip.cc:2009 mixer_strip.cc:2455
 msgid "Custom"
 msgstr "Manuellt"
 
-#: add_route_dialog.cc:516 add_route_dialog.cc:532 route_group_menu.cc:81
+#: add_route_dialog.cc:569 add_route_dialog.cc:585 route_group_menu.cc:85
 msgid "New Group..."
 msgstr ""
 
-#: add_route_dialog.cc:520 route_group_menu.cc:85
+#: add_route_dialog.cc:573 route_group_menu.cc:89
 msgid "No Group"
 msgstr ""
 
@@ -558,177 +646,215 @@ msgstr ""
 msgid "Ambiguous File"
 msgstr ""
 
-#: ambiguous_file_dialog.cc:35
+#: ambiguous_file_dialog.cc:37
 msgid ""
 "%1 has found the file <i>%2</i> in the following places:\n"
 "\n"
 msgstr ""
 
-#: ambiguous_file_dialog.cc:44
+#: ambiguous_file_dialog.cc:46
 msgid ""
 "\n"
 "\n"
 "Please select the path that you want to get the file from."
 msgstr ""
 
-#: ambiguous_file_dialog.cc:46 missing_file_dialog.cc:46
+#: ambiguous_file_dialog.cc:48 missing_file_dialog.cc:50
 msgid "Done"
 msgstr ""
 
-#: analysis_window.cc:46
+#: analysis_window.cc:45
 msgid "Signal source"
 msgstr "Signalkälla"
 
-#: analysis_window.cc:47
+#: analysis_window.cc:46
 msgid "Selected ranges"
 msgstr "Valda omfång"
 
-#: analysis_window.cc:48
+#: analysis_window.cc:47
 msgid "Selected regions"
 msgstr "Valda regioner"
 
-#: analysis_window.cc:50
-msgid "Display model"
-msgstr "Visningsmodell"
-
-#: analysis_window.cc:51
-msgid "Composite graphs for each track"
-msgstr "Sammansatt graf för varje spår"
-
-#: analysis_window.cc:52
-msgid "Composite graph of all tracks"
-msgstr "Sammansatt graf för alla spår"
-
-#: analysis_window.cc:54
+#: analysis_window.cc:48
 msgid "Show frequency power range"
 msgstr "Visa frekvenskraftsomfång"
 
-#: analysis_window.cc:55
-msgid "Normalize values"
-msgstr "Normalisera värden"
+#: analysis_window.cc:49
+msgid "Fit dB range"
+msgstr ""
+
+#: analysis_window.cc:50
+msgid "Proportional Spectrum, -18dB"
+msgstr ""
 
-#: analysis_window.cc:59
+#: analysis_window.cc:53
 msgid "FFT analysis window"
 msgstr "FFT-analysfönster"
 
-#: analysis_window.cc:60 editor.cc:1823
+#: analysis_window.cc:54 editor.cc:1953
 msgid "Spectral Analysis"
 msgstr "Spektralanalys"
 
-#: analysis_window.cc:67 editor_actions.cc:142 export_channel_selector.cc:557
-#: session_metadata_dialog.cc:667
+#: analysis_window.cc:61 editor_actions.cc:145 session_metadata_dialog.cc:670
 msgid "Track"
 msgstr "Spår"
 
-#: analysis_window.cc:68 editor_actions.cc:648 mixer_ui.cc:131
-#: mixer_ui.cc:1854
+#: analysis_window.cc:62 ardour_ui_ed.cc:254 ardour_ui_ed.cc:255
+#: ardour_ui_ed.cc:256 editor_actions.cc:689 mixer_ui.cc:151 mixer_ui.cc:2134
 msgid "Show"
 msgstr "Visa"
 
-#: analysis_window.cc:135
+#: analysis_window.cc:107
 msgid "Re-analyze data"
 msgstr "Ã…teranalysera data"
 
-#: ardour_button.cc:887
+#: ardour_button.cc:876
 msgid "button cannot watch state of non-existing Controllable\n"
 msgstr ""
 
-#: ardour_button.cc:1155
+#: ardour_button.cc:1144
 msgid "ABCDEFGHIJLKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
 msgstr ""
 
-#: ardour_ui.cc:164
+#: ardour_ui.cc:198
 msgid ""
 "%1 %2.x has discovered configuration files from %1 %3.x.\n"
 "\n"
-"Would you like to copy the relevant files before starting to use the "
-"program?\n"
+"Would you like these files to be copied and used for %1 %2.x?\n"
 "\n"
 "(This will require you to restart %1.)"
 msgstr ""
 
-#: ardour_ui.cc:211 editor_actions.cc:642 region_editor.cc:51
+#: ardour_ui.cc:283 editor_actions.cc:683 region_editor.cc:53
 msgid "Audition"
 msgstr "Avlyssna"
 
-#: ardour_ui.cc:212 editor_actions.cc:136 mixer_strip.cc:2016
-#: rc_option_editor.cc:1959 route_time_axis.cc:252 route_time_axis.cc:2711
+#: ardour_ui.cc:284 editor_actions.cc:139 mixer_strip.cc:2205
+#: monitor_section.cc:329 rc_option_editor.cc:2547 route_time_axis.cc:263
+#: route_time_axis.cc:2740 vca_master_strip.cc:212 vca_time_axis.cc:237
 msgid "Solo"
 msgstr ""
 
-#: ardour_ui.cc:213 rc_option_editor.cc:741
+#: ardour_ui.cc:285 rc_option_editor.cc:1357
 msgid "Feedback"
 msgstr "Gensvar"
 
-#: ardour_ui.cc:219 speaker_dialog.cc:36
+#: ardour_ui.cc:296 speaker_dialog.cc:36
 msgid "Speaker Configuration"
 msgstr ""
 
-#: ardour_ui.cc:220 keyeditor.cc:53
-msgid "Key Bindings"
-msgstr "Kortkommandon"
-
-#: ardour_ui.cc:221
-msgid "Preferences"
-msgstr "Inställningar"
-
-#: ardour_ui.cc:222 ardour_ui.cc:229
+#: ardour_ui.cc:297
 msgid "Add Tracks/Busses"
 msgstr ""
 
-#: ardour_ui.cc:223
+#: ardour_ui.cc:298
 msgid "About"
 msgstr "Om"
 
-#: ardour_ui.cc:224 location_ui.cc:1141 session_option_editor.cc:189
-#: session_option_editor.cc:195 session_option_editor.cc:202
-msgid "Locations"
-msgstr "Platser"
+#: ardour_ui.cc:299 location_ui.cc:1167
+msgid "Ranges|Locations"
+msgstr ""
 
-#: ardour_ui.cc:225 route_params_ui.cc:59 route_params_ui.cc:630
+#: ardour_ui.cc:300 route_params_ui.cc:59 route_params_ui.cc:620
 msgid "Tracks and Busses"
 msgstr "Spår och bussar"
 
-#: ardour_ui.cc:226 engine_dialog.cc:70
+#: ardour_ui.cc:301 engine_dialog.cc:73
 msgid "Audio/MIDI Setup"
 msgstr ""
 
-#: ardour_ui.cc:227
+#: ardour_ui.cc:302
 msgid "Video Export Dialog"
 msgstr ""
 
-#: ardour_ui.cc:228
+#: ardour_ui.cc:303 lua_script_manager.cc:30
+msgid "Script Manager"
+msgstr ""
+
+#: ardour_ui.cc:304
 msgid "Properties"
 msgstr "Egenskaper"
 
-#: ardour_ui.cc:230 bundle_manager.cc:264
+#: ardour_ui.cc:305
+msgid "Add Video"
+msgstr ""
+
+#: ardour_ui.cc:306 bundle_manager.cc:264
 msgid "Bundle Manager"
 msgstr "Buntar"
 
-#: ardour_ui.cc:231 big_clock_window.cc:37
+#: ardour_ui.cc:307 big_clock_window.cc:37
 msgid "Big Clock"
 msgstr "Stor klocka"
 
-#: ardour_ui.cc:232
+#: ardour_ui.cc:308
 msgid "Audio Connections"
 msgstr ""
 
-#: ardour_ui.cc:233
+#: ardour_ui.cc:309
 msgid "MIDI Connections"
 msgstr ""
 
-#: ardour_ui.cc:242
+#: ardour_ui.cc:310
+msgid "Bindings Editor"
+msgstr ""
+
+#: ardour_ui.cc:321 editor.cc:1288
+msgid "Window|Editor"
+msgstr ""
+
+#: ardour_ui.cc:322 mixer_ui.cc:2210 mixer_ui.cc:2216
+msgid "Window|Mixer"
+msgstr ""
+
+#: ardour_ui.cc:323
+msgid "Window|Preferences"
+msgstr ""
+
+#: ardour_ui.cc:330
 msgid "Your configuration files were copied. You can now restart %1."
 msgstr ""
 
-#: ardour_ui.cc:481
+#: ardour_ui.cc:509
+msgid "Pre-Release Warning"
+msgstr ""
+
+#: ardour_ui.cc:513
+msgid ""
+"<b>Welcome to this pre-release build of %1 %2</b>\n"
+"\n"
+"There are still several issues and bugs to be worked on,\n"
+"as well as general workflow improvements, before this can be considered\n"
+"release software. So, a few guidelines:\n"
+"\n"
+"1) Please do <b>NOT</b> use this software with the expectation that it is "
+"stable or reliable\n"
+"   though it may be so, depending on your workflow.\n"
+"2) Please wait for a helpful writeup of new features.\n"
+"3) <b>Please do NOT use the forums at ardour.org to report issues</b>.\n"
+"4) Please <b>DO</b> use the bugtracker at http://tracker.ardour.org/ to "
+"report issues\n"
+"   making sure to note the product version number as 5.0-pre.\n"
+"5) Please <b>DO</b> use the ardour-users mailing list to discuss ideas and "
+"pass on comments.\n"
+"6) Please <b>DO</b> join us on IRC for real time discussions about %1 %2. "
+"You\n"
+"   can get there directly from within the program via the Help->Chat menu "
+"option.\n"
+"\n"
+"Full information on all the above can be found on the support page at\n"
+"\n"
+"                http://ardour.org/support\n"
+msgstr ""
+
+#: ardour_ui.cc:613
 msgid ""
 "The audio backend was shutdown because:\n"
 "\n"
 "%1"
 msgstr ""
 
-#: ardour_ui.cc:483
+#: ardour_ui.cc:615
 msgid ""
 "The audio backend has either been shutdown or it\n"
 "disconnected %1 because %1\n"
@@ -736,45 +862,45 @@ msgid ""
 "the audio backend and save the session."
 msgstr ""
 
-#: ardour_ui.cc:507
+#: ardour_ui.cc:639
 msgid ""
 "Audio Unit Plugin Scan Failed. Automatic AU scanning has been disabled. "
 "Please see the log window for further details."
 msgstr ""
 
-#: ardour_ui.cc:508
+#: ardour_ui.cc:640
 msgid "Audio Unit Plugin Scan Failed:"
 msgstr ""
 
-#: ardour_ui.cc:827
+#: ardour_ui.cc:1008
 msgid "NSM server did not announce itself"
 msgstr ""
 
-#: ardour_ui.cc:840
+#: ardour_ui.cc:1021
 msgid "NSM: no client ID provided"
 msgstr ""
 
-#: ardour_ui.cc:847
+#: ardour_ui.cc:1028
 msgid "NSM: no session created"
 msgstr ""
 
-#: ardour_ui.cc:870
+#: ardour_ui.cc:1051
 msgid "NSM: initialization failed"
 msgstr ""
 
-#: ardour_ui.cc:900
+#: ardour_ui.cc:1083
 msgid "Free/Demo Version Warning"
 msgstr ""
 
-#: ardour_ui.cc:902
+#: ardour_ui.cc:1085
 msgid "Subscribe and support development of %1"
 msgstr ""
 
-#: ardour_ui.cc:903
+#: ardour_ui.cc:1086
 msgid "Don't warn me about this again"
 msgstr ""
 
-#: ardour_ui.cc:905
+#: ardour_ui.cc:1088
 msgid ""
 "<span weight=\"bold\" size=\"large\">%1</span>\n"
 "\n"
@@ -785,39 +911,39 @@ msgid ""
 "%4"
 msgstr ""
 
-#: ardour_ui.cc:906
+#: ardour_ui.cc:1089
 msgid "This is a free/demo version of %1"
 msgstr ""
 
-#: ardour_ui.cc:907
+#: ardour_ui.cc:1090
 msgid "It will not restore OR save any plugin settings"
 msgstr ""
 
-#: ardour_ui.cc:908
+#: ardour_ui.cc:1091
 msgid ""
 "If you load an existing session with plugin settings\n"
 "they will not be used and will be lost."
 msgstr ""
 
-#: ardour_ui.cc:910 plugin_ui.cc:569
+#: ardour_ui.cc:1093 plugin_ui.cc:579
 msgid ""
 "To get full access to updates without this limitation\n"
 "consider becoming a subscriber for a low cost every month."
 msgstr ""
 
-#: ardour_ui.cc:920
+#: ardour_ui.cc:1103
 msgid "Quit now"
 msgstr ""
 
-#: ardour_ui.cc:921
+#: ardour_ui.cc:1104
 msgid "Continue using %1"
 msgstr ""
 
-#: ardour_ui.cc:954 startup.cc:345
+#: ardour_ui.cc:1135 startup.cc:349
 msgid "%1 is ready for use"
 msgstr ""
 
-#: ardour_ui.cc:996
+#: ardour_ui.cc:1185
 msgid ""
 "WARNING: Your system has a limit for maximum amount of locked memory. This "
 "might cause %1 to run out of memory before your system runs out of memory. \n"
@@ -826,23 +952,23 @@ msgid ""
 "controlled by %2"
 msgstr ""
 
-#: ardour_ui.cc:1013
+#: ardour_ui.cc:1202
 msgid "Do not show this window again"
 msgstr ""
 
-#: ardour_ui.cc:1057
+#: ardour_ui.cc:1245
 msgid "Don't quit"
 msgstr ""
 
-#: ardour_ui.cc:1058
+#: ardour_ui.cc:1246
 msgid "Just quit"
 msgstr ""
 
-#: ardour_ui.cc:1059
+#: ardour_ui.cc:1247 ardour_ui.cc:5362
 msgid "Save and quit"
 msgstr ""
 
-#: ardour_ui.cc:1069
+#: ardour_ui.cc:1257
 msgid ""
 "%1 was unable to save your session.\n"
 "\n"
@@ -851,11 +977,11 @@ msgid ""
 "\"Just quit\" option."
 msgstr ""
 
-#: ardour_ui.cc:1119
+#: ardour_ui.cc:1307
 msgid "Unsaved Session"
 msgstr ""
 
-#: ardour_ui.cc:1140
+#: ardour_ui.cc:1328
 msgid ""
 "The session \"%1\"\n"
 "has not been saved.\n"
@@ -866,7 +992,7 @@ msgid ""
 "What do you want to do?"
 msgstr ""
 
-#: ardour_ui.cc:1143
+#: ardour_ui.cc:1331
 msgid ""
 "The snapshot \"%1\"\n"
 "has not been saved.\n"
@@ -877,74 +1003,107 @@ msgid ""
 "What do you want to do?"
 msgstr ""
 
-#: ardour_ui.cc:1157
+#: ardour_ui.cc:1345
 msgid "Prompter"
 msgstr "Fråga"
 
-#: ardour_ui.cc:1269 ardour_ui.cc:1277
+#: ardour_ui.cc:1459 ardour_ui.cc:1467
 msgid "Audio: <span foreground=\"red\">none</span>"
 msgstr ""
 
-#: ardour_ui.cc:1281
+#: ardour_ui.cc:1471
 #, c-format
 msgid "Audio: <span foreground=\"green\">%.1f kHz / %4.1f ms</span>"
 msgstr ""
 
-#: ardour_ui.cc:1285
+#: ardour_ui.cc:1475
 #, c-format
 msgid "Audio: <span foreground=\"green\">%<PRId64> kHz / %4.1f ms</span>"
 msgstr ""
 
-#: ardour_ui.cc:1303 export_video_dialog.cc:80
+#: ardour_ui.cc:1493 export_report.cc:108 export_report.cc:323
+#: export_video_dialog.cc:76
 msgid "File:"
 msgstr ""
 
-#: ardour_ui.cc:1307
+#: ardour_ui.cc:1497
 msgid "BWF"
 msgstr ""
 
-#: ardour_ui.cc:1310
+#: ardour_ui.cc:1500
 msgid "WAV"
 msgstr ""
 
-#: ardour_ui.cc:1313
+#: ardour_ui.cc:1503
 msgid "WAV64"
 msgstr ""
 
-#: ardour_ui.cc:1316 session_option_editor.cc:185
+#: ardour_ui.cc:1506 session_option_editor.cc:202
 msgid "CAF"
 msgstr ""
 
-#: ardour_ui.cc:1319
+#: ardour_ui.cc:1509
 msgid "AIFF"
 msgstr ""
 
-#: ardour_ui.cc:1322
+#: ardour_ui.cc:1512
 msgid "iXML"
 msgstr ""
 
-#: ardour_ui.cc:1325
+#: ardour_ui.cc:1515 session_option_editor.cc:203
 msgid "RF64"
 msgstr ""
 
-#: ardour_ui.cc:1333
+#: ardour_ui.cc:1518
+msgid "RF64/WAV"
+msgstr ""
+
+#: ardour_ui.cc:1521
+msgid "MBWF"
+msgstr ""
+
+#: ardour_ui.cc:1529
 msgid "32-float"
 msgstr ""
 
-#: ardour_ui.cc:1336
+#: ardour_ui.cc:1532
 msgid "24-int"
 msgstr ""
 
-#: ardour_ui.cc:1339
+#: ardour_ui.cc:1535
 msgid "16-int"
 msgstr ""
 
-#: ardour_ui.cc:1358
+#: ardour_ui.cc:1556
+#, c-format
+msgid "X: <span foreground=\"%s\">>10K</span>"
+msgstr ""
+
+#: ardour_ui.cc:1558
+#, c-format
+msgid "X: <span foreground=\"%s\">%u</span>"
+msgstr ""
+
+#: ardour_ui.cc:1561
+#, c-format
+msgid "X: <span foreground=\"%s\">?</span>"
+msgstr ""
+
+#: ardour_ui.cc:1564
+msgid "Audio dropouts. Shift+click to reset"
+msgstr ""
+
+#: ardour_ui.cc:1577
 #, c-format
 msgid "DSP: <span foreground=\"%s\">%5.1f%%</span>"
 msgstr ""
 
-#: ardour_ui.cc:1377
+#: ardour_ui.cc:1587
+#, c-format
+msgid "PkBld: <span foreground=\"%s\">%d</span>"
+msgstr ""
+
+#: ardour_ui.cc:1609
 #, c-format
 msgid ""
 "Buffers: <span foreground=\"green\">p:</span><span foreground=\"%s\">"
@@ -952,215 +1111,263 @@ msgid ""
 "\">%<PRIu32>%%</span>"
 msgstr ""
 
-#: ardour_ui.cc:1418
+#: ardour_ui.cc:1650
 msgid "Disk: <span foreground=\"green\">Unknown</span>"
 msgstr ""
 
-#: ardour_ui.cc:1420
+#: ardour_ui.cc:1652
 msgid "Disk: <span foreground=\"green\">24hrs+</span>"
 msgstr ""
 
-#: ardour_ui.cc:1438
+#: ardour_ui.cc:1670
 msgid "Disk: <span foreground=\"green\">>24 hrs</span>"
 msgstr ""
 
-#: ardour_ui.cc:1449
+#: ardour_ui.cc:1681
 #, c-format
 msgid "Disk: <span foreground=\"%s\">%02dh:%02dm:%02ds</span>"
 msgstr ""
 
-#: ardour_ui.cc:1475
+#: ardour_ui.cc:1707
 #, c-format
 msgid "Timecode|TC: <span foreground=\"%s\">%s</span>"
 msgstr ""
 
-#: ardour_ui.cc:1596 ardour_ui.cc:1605 session_dialog.cc:318
-#: session_dialog.cc:323
-msgid "Recent Sessions"
-msgstr "Tidigare Sessioner"
-
-#: ardour_ui.cc:1684
+#: ardour_ui.cc:1789
 msgid ""
 "%1 is not connected to any audio backend.\n"
 "You cannot open or close sessions in this condition"
 msgstr ""
 
-#: ardour_ui.cc:1708
+#: ardour_ui.cc:1807
 msgid "Open Session"
 msgstr "Öppna session"
 
-#: ardour_ui.cc:1733 session_dialog.cc:349 session_import_dialog.cc:170
-#: session_metadata_dialog.cc:858
+#: ardour_ui.cc:1831 session_dialog.cc:410 session_import_dialog.cc:170
+#: session_metadata_dialog.cc:861
 msgid "%1 sessions"
 msgstr ""
 
-#: ardour_ui.cc:1770
+#: ardour_ui.cc:1879 ardour_ui.cc:1916
 msgid "You cannot add a track without a session already loaded."
 msgstr "Du kan inte lägga till ett spår utan en session laddad."
 
-#: ardour_ui.cc:1778
+#: ardour_ui.cc:1887
 msgid "could not create %1 new mixed track"
 msgid_plural "could not create %1 new mixed tracks"
 msgstr[0] ""
 msgstr[1] ""
 
-#: ardour_ui.cc:1784 ardour_ui.cc:1845
-msgid ""
-"There are insufficient ports available\n"
-"to create a new track or bus.\n"
-"You should save %1, exit and\n"
-"restart with more ports."
-msgstr ""
+#: ardour_ui.cc:1924
+msgid "could not create %1 new Midi Bus"
+msgid_plural "could not create %1 new Midi Busses"
+msgstr[0] ""
+msgstr[1] ""
 
-#: ardour_ui.cc:1819
+#: ardour_ui.cc:1977
 msgid "You cannot add a track or bus without a session already loaded."
 msgstr ""
 
-#: ardour_ui.cc:1828
+#: ardour_ui.cc:1986
 msgid "could not create %1 new audio track"
 msgid_plural "could not create %1 new audio tracks"
 msgstr[0] ""
 msgstr[1] ""
 
-#: ardour_ui.cc:1837
+#: ardour_ui.cc:1995
 msgid "could not create %1 new audio bus"
 msgid_plural "could not create %1 new audio busses"
 msgstr[0] ""
 msgstr[1] ""
 
-#: ardour_ui.cc:1990
+#: ardour_ui.cc:2020
+msgid ""
+"There are insufficient ports available\n"
+"to create a new track or bus.\n"
+"You should save %1, exit and\n"
+"restart with more ports."
+msgstr ""
+
+#: ardour_ui.cc:2164
 msgid ""
 "Please create one or more tracks before trying to record.\n"
 "You can do this with the \"Add Track or Bus\" option in the Session menu."
 msgstr ""
 
-#: ardour_ui.cc:2376
-msgid "Save as..."
+#: ardour_ui.cc:2565
+#, c-format
+msgid "Copied %<PRId64> of %<PRId64>"
 msgstr ""
 
-#: ardour_ui.cc:2377 ardour_ui.cc:2456
-msgid "New session name"
+#: ardour_ui.cc:2619 save_as_dialog.cc:33
+msgid "Save As"
 msgstr ""
 
-#: ardour_ui.cc:2379
-msgid "Take Snapshot"
-msgstr "Gör ögonblickskopia"
-
-#: ardour_ui.cc:2380
-msgid "Name of new snapshot"
-msgstr "Namnge ny ögonblickskopia"
+#: ardour_ui.cc:2647
+msgid "Save As failed: %1"
+msgstr ""
 
-#: ardour_ui.cc:2405
+#: ardour_ui.cc:2684
 msgid ""
 "To ensure compatibility with various systems\n"
 "snapshot names may not contain a '%1' character"
 msgstr ""
 
-#: ardour_ui.cc:2417
+#: ardour_ui.cc:2698
 msgid "Confirm Snapshot Overwrite"
 msgstr ""
 
-#: ardour_ui.cc:2418
-msgid "A snapshot already exists with that name.  Do you want to overwrite it?"
+#: ardour_ui.cc:2699
+msgid "A snapshot already exists with that name. Do you want to overwrite it?"
 msgstr ""
 
-#: ardour_ui.cc:2421 utils_videotl.cc:74
-msgid "Overwrite"
+#: ardour_ui.cc:2724
+msgid "Snapshot and switch"
 msgstr ""
 
-#: ardour_ui.cc:2455
+#: ardour_ui.cc:2725 ardour_ui.cc:2776
+msgid "New session name"
+msgstr ""
+
+#: ardour_ui.cc:2727
+msgid "Take Snapshot"
+msgstr "Gör ögonblickskopia"
+
+#: ardour_ui.cc:2728
+msgid "Name of new snapshot"
+msgstr "Namnge ny ögonblickskopia"
+
+#: ardour_ui.cc:2775
 msgid "Rename Session"
 msgstr ""
 
-#: ardour_ui.cc:2470 ardour_ui.cc:2886 ardour_ui.cc:2924
+#: ardour_ui.cc:2790 ardour_ui.cc:3267 ardour_ui.cc:3305
 msgid ""
 "To ensure compatibility with various systems\n"
 "session names may not contain a '%1' character"
 msgstr ""
 
-#: ardour_ui.cc:2478
+#: ardour_ui.cc:2798
 msgid ""
 "That name is already in use by another directory/folder. Please try again."
 msgstr ""
 
-#: ardour_ui.cc:2487
+#: ardour_ui.cc:2807
 msgid ""
 "Renaming this session failed.\n"
 "Things could be seriously messed up at this point"
 msgstr ""
 
-#: ardour_ui.cc:2602
+#: ardour_ui.cc:2923 route_ui.cc:1867
+msgid "Confirm Template Overwrite"
+msgstr ""
+
+#: ardour_ui.cc:2924 route_ui.cc:1868
+msgid "A template already exists with that name. Do you want to overwrite it?"
+msgstr ""
+
+#: ardour_ui.cc:2948
 msgid "Save Template"
 msgstr ""
 
-#: ardour_ui.cc:2603
+#: ardour_ui.cc:2949
 msgid "Name for template:"
 msgstr ""
 
-#: ardour_ui.cc:2604
+#: ardour_ui.cc:2950
 msgid "-template"
 msgstr "-mall"
 
-#: ardour_ui.cc:2643
+#: ardour_ui.cc:2987
 msgid ""
 "This session\n"
 "%1\n"
 "already exists. Do you want to open it?"
 msgstr ""
 
-#: ardour_ui.cc:2653
+#: ardour_ui.cc:2997
 msgid "Open Existing Session"
 msgstr ""
 
-#: ardour_ui.cc:2914
+#: ardour_ui.cc:3295
 msgid "There is no existing session at \"%1\""
 msgstr ""
 
-#: ardour_ui.cc:3006
+#: ardour_ui.cc:3391
 msgid "Please wait while %1 loads your session"
 msgstr ""
 
-#: ardour_ui.cc:3021
+#: ardour_ui.cc:3406
 msgid "Port Registration Error"
 msgstr ""
 
-#: ardour_ui.cc:3022
+#: ardour_ui.cc:3407
 msgid "Click the Close button to try again."
 msgstr ""
 
-#: ardour_ui.cc:3043
-msgid "Session \"%1 (snapshot %2)\" did not load successfully"
-msgstr "Session \"%1 (ögonblickskopia %2)\" kunde inte laddas"
+#: ardour_ui.cc:3426
+msgid "Session \"%1 (snapshot %2)\" did not load successfully: %3"
+msgstr ""
 
-#: ardour_ui.cc:3049
+#: ardour_ui.cc:3432 ardour_ui.cc:3453 ardour_ui.cc:3548 ardour_ui.cc:3557
 msgid "Loading Error"
 msgstr ""
 
-#: ardour_ui.cc:3068
+#: ardour_ui.cc:3447
+msgid "Session \"%1 (snapshot %2)\" did not load successfully"
+msgstr "Session \"%1 (ögonblickskopia %2)\" kunde inte laddas"
+
+#: ardour_ui.cc:3475
 msgid ""
 "This session has been opened in read-only mode.\n"
 "\n"
 "You will not be able to record or save."
 msgstr ""
 
-#: ardour_ui.cc:3073
+#: ardour_ui.cc:3480
 msgid "Read-only Session"
 msgstr ""
 
-#: ardour_ui.cc:3139
+#: ardour_ui.cc:3547
+msgid "Could not create session in \"%1\": %2"
+msgstr ""
+
+#: ardour_ui.cc:3556
 msgid "Could not create session in \"%1\""
 msgstr ""
 
-#: ardour_ui.cc:3288
+#: ardour_ui.cc:3601
+msgid ""
+"<b>Just ask and wait for an answer.\n"
+"It may take from minutes to hours.</b>"
+msgstr ""
+
+#: ardour_ui.cc:3603
+msgid "About the Chat"
+msgstr ""
+
+#: ardour_ui.cc:3604
+msgid ""
+"When you're inside the chat just ask your question and wait for an answer. "
+"The chat is occupied by real people with real lives so many of them are "
+"passively online and might not read your question before minutes or hours "
+"later.\n"
+"So please be patient and wait for an answer.\n"
+"\n"
+"You should just leave the chat window open and check back regularly until "
+"someone has answered your question."
+msgstr ""
+
+#: ardour_ui.cc:3723
 msgid "No files were ready for clean-up"
 msgstr ""
 
-#: ardour_ui.cc:3292 ardour_ui.cc:3302 ardour_ui.cc:3435 ardour_ui.cc:3442
-#: ardour_ui_ed.cc:103
+#: ardour_ui.cc:3727 ardour_ui.cc:3737 ardour_ui.cc:3870 ardour_ui.cc:3877
+#: ardour_ui_ed.cc:129
 msgid "Clean-up"
 msgstr ""
 
-#: ardour_ui.cc:3293
+#: ardour_ui.cc:3728
 msgid ""
 "If this seems suprising, \n"
 "check for any existing snapshots.\n"
@@ -1171,19 +1378,19 @@ msgstr ""
 "ögonblickskopior. Dessa kan använda regioner som\n"
 "använder oanvända filer för att kunna fungera."
 
-#: ardour_ui.cc:3352
+#: ardour_ui.cc:3787
 msgid "kilo"
 msgstr ""
 
-#: ardour_ui.cc:3355
+#: ardour_ui.cc:3790
 msgid "mega"
 msgstr ""
 
-#: ardour_ui.cc:3358
+#: ardour_ui.cc:3793
 msgid "giga"
 msgstr ""
 
-#: ardour_ui.cc:3363
+#: ardour_ui.cc:3798
 msgid ""
 "The following file was deleted from %2,\n"
 "releasing %3 %4bytes of disk space"
@@ -1193,7 +1400,7 @@ msgid_plural ""
 msgstr[0] ""
 msgstr[1] ""
 
-#: ardour_ui.cc:3370
+#: ardour_ui.cc:3805
 msgid ""
 "The following file was not in use and \n"
 "has been moved to: %2\n"
@@ -1215,90 +1422,126 @@ msgid_plural ""
 msgstr[0] ""
 msgstr[1] ""
 
-#: ardour_ui.cc:3430
+#: ardour_ui.cc:3865
 msgid "Are you sure you want to clean-up?"
 msgstr ""
 
-#: ardour_ui.cc:3437
+#: ardour_ui.cc:3872
 msgid ""
 "Clean-up is a destructive operation.\n"
 "ALL undo/redo information will be lost if you clean-up.\n"
 "Clean-up will move all unused files to a \"dead\" location."
 msgstr ""
 
-#: ardour_ui.cc:3445
+#: ardour_ui.cc:3880
 msgid "CleanupDialog"
 msgstr "Rensadialog"
 
-#: ardour_ui.cc:3475
+#: ardour_ui.cc:3910
 msgid "Cleaned Files"
 msgstr ""
 
-#: ardour_ui.cc:3492
+#: ardour_ui.cc:3927
 msgid "deleted file"
 msgstr "raderad fil"
 
-#: ardour_ui.cc:3637
+#: ardour_ui.cc:4133
+msgid "Cannot read session script '%1': %2"
+msgstr ""
+
+#: ardour_ui.cc:4142 luainstance.cc:1087
+msgid "Set Script Parameters"
+msgstr ""
+
+#: ardour_ui.cc:4153
+msgid "Session script '%1' instantiation failed: %2"
+msgstr ""
+
+#: ardour_ui.cc:4157
+msgid "Loading Session script '%1' failed: %2"
+msgstr ""
+
+#: ardour_ui.cc:4170
+msgid "There are no active Lua session scripts present in this session."
+msgstr ""
+
+#: ardour_ui.cc:4187
+msgid "Session script '%1' removal failed: %2"
+msgstr ""
+
+#: ardour_ui.cc:4197
 msgid "Video-Server was not launched by %1. The request to stop it is ignored."
 msgstr ""
 
-#: ardour_ui.cc:3641
+#: ardour_ui.cc:4201
 msgid "Stop Video-Server"
 msgstr ""
 
-#: ardour_ui.cc:3642
+#: ardour_ui.cc:4202
 msgid "Do you really want to stop the Video Server?"
 msgstr ""
 
-#: ardour_ui.cc:3645
+#: ardour_ui.cc:4205
 msgid "Yes, Stop It"
 msgstr ""
 
-#: ardour_ui.cc:3671
+#: ardour_ui.cc:4231
 msgid "The Video Server is already started."
 msgstr ""
 
-#: ardour_ui.cc:3673
+#: ardour_ui.cc:4233
 msgid ""
 "An external Video Server is configured and can be reached. Not starting a "
 "new instance."
 msgstr ""
 
-#: ardour_ui.cc:3681 ardour_ui.cc:3786
+#: ardour_ui.cc:4241 ardour_ui.cc:4346
 msgid ""
 "Could not connect to the Video Server. Start it or configure its access URL "
 "in Preferences."
 msgstr ""
 
-#: ardour_ui.cc:3711
+#: ardour_ui.cc:4271
 msgid "Specified docroot is not an existing directory."
 msgstr ""
 
-#: ardour_ui.cc:3717 ardour_ui.cc:3723
+#: ardour_ui.cc:4277 ardour_ui.cc:4283
 msgid "Given Video Server is not an executable file."
 msgstr ""
 
-#: ardour_ui.cc:3757
+#: ardour_ui.cc:4317
 msgid "Cannot launch the video-server"
 msgstr ""
 
-#: ardour_ui.cc:3767
+#: ardour_ui.cc:4327
 msgid "Video-server was started but does not respond to requests..."
 msgstr ""
 
-#: ardour_ui.cc:3812 editor_audio_import.cc:641
+#: ardour_ui.cc:4372 editor_audio_import.cc:647
 msgid "could not open %1"
 msgstr "kunde inte öppna %1"
 
-#: ardour_ui.cc:3816
+#: ardour_ui.cc:4376
 msgid "no video-file selected"
 msgstr ""
 
-#: ardour_ui.cc:4014
+#: ardour_ui.cc:4472
+msgid "No LTC detected, video will not be aligned."
+msgstr ""
+
+#: ardour_ui.cc:4478
+msgid "Align video-start to %1 [samples]"
+msgstr ""
+
+#: ardour_ui.cc:4654
+msgid "xrun"
+msgstr ""
+
+#: ardour_ui.cc:4663
 msgid "Recording was stopped because your system could not keep up."
 msgstr "Inspelningen stoppades eftersom ditt system inte kunde hänga med."
 
-#: ardour_ui.cc:4043
+#: ardour_ui.cc:4692
 msgid ""
 "The disk system on your computer\n"
 "was not able to keep up with %1.\n"
@@ -1307,23 +1550,23 @@ msgid ""
 "quickly enough to keep up with recording.\n"
 msgstr ""
 
-#: ardour_ui.cc:4113
+#: ardour_ui.cc:4765
 msgid "Scanning for plugins"
 msgstr ""
 
-#: ardour_ui.cc:4115
+#: ardour_ui.cc:4767
 msgid "Cancel plugin scan"
 msgstr ""
 
-#: ardour_ui.cc:4124
+#: ardour_ui.cc:4776
 msgid "Stop Timeout"
 msgstr ""
 
-#: ardour_ui.cc:4131
+#: ardour_ui.cc:4783
 msgid "Scan Timeout"
 msgstr ""
 
-#: ardour_ui.cc:4174
+#: ardour_ui.cc:4827
 msgid ""
 "The disk system on your computer\n"
 "was not able to keep up with %1.\n"
@@ -1332,11 +1575,11 @@ msgid ""
 "quickly enough to keep up with playback.\n"
 msgstr ""
 
-#: ardour_ui.cc:4214
+#: ardour_ui.cc:4862
 msgid "Crash Recovery"
 msgstr ""
 
-#: ardour_ui.cc:4215
+#: ardour_ui.cc:4863
 msgid ""
 "This session appears to have been in the\n"
 "middle of recording when %1 or\n"
@@ -1347,42 +1590,43 @@ msgid ""
 "what you would like to do.\n"
 msgstr ""
 
-#: ardour_ui.cc:4227
+#: ardour_ui.cc:4875
 msgid "Ignore crash data"
 msgstr "Ignorera kraschdata"
 
-#: ardour_ui.cc:4228
+#: ardour_ui.cc:4876
 msgid "Recover from crash"
 msgstr "Återhämta från krasch"
 
-#: ardour_ui.cc:4248
+#: ardour_ui.cc:4896
 msgid "Sample Rate Mismatch"
 msgstr ""
 
-#: ardour_ui.cc:4249
+#: ardour_ui.cc:4897
 msgid ""
 "This session was created with a sample rate of %1 Hz, but\n"
 "%2 is currently running at %3 Hz.  If you load this session,\n"
 "audio may be played at the wrong sample rate.\n"
 msgstr ""
 
-#: ardour_ui.cc:4258
+#: ardour_ui.cc:4906
 msgid "Do not load session"
 msgstr ""
 
-#: ardour_ui.cc:4259
+#: ardour_ui.cc:4907
 msgid "Load session anyway"
 msgstr ""
 
-#: ardour_ui.cc:4286
-msgid "Could not disconnect from Audio/MIDI engine"
-msgstr ""
-
-#: ardour_ui.cc:4303 ardour_ui.cc:4306
-msgid "Could not reconnect to the Audio/MIDI engine"
+#: ardour_ui.cc:4927
+msgid ""
+"This session was created with a sample rate of %1 Hz, but\n"
+"%2 is currently running at %3 Hz.\n"
+"Audio will be recorded and played at the wrong sample rate.\n"
+"Re-Configure the Audio Engine in\n"
+"Menu > Window > Audio/Midi Setup"
 msgstr ""
 
-#: ardour_ui.cc:4590
+#: ardour_ui.cc:5209
 msgid ""
 "%4This is a session from an older version of %3%5\n"
 "\n"
@@ -1394,72 +1638,97 @@ msgid ""
 "\n"
 "%6%2%7\n"
 "\n"
-"From now on, use the -2000 version with older versions of %3"
+"From now on, use the backup copy with older versions of %3"
 msgstr ""
 
-#: ardour_ui2.cc:73
-msgid "UI: cannot setup editor"
-msgstr "Gränssnitt: kan ej konfigurera editorn"
+#: ardour_ui.cc:5331
+msgid "This is a free/demo copy of %1. It has just switched to silent mode."
+msgstr ""
 
-#: ardour_ui2.cc:78
-msgid "UI: cannot setup mixer"
-msgstr "Gränssnitt: kan inte konfigurera mixern"
+#: ardour_ui.cc:5337
+msgid "%1 is now silent"
+msgstr ""
 
-#: ardour_ui2.cc:83
-msgid "UI: cannot setup meterbridge"
+#: ardour_ui.cc:5339
+msgid ""
+"Please consider paying for a copy of %1 - you can pay whatever you want."
 msgstr ""
 
-#: ardour_ui2.cc:128
+#: ardour_ui.cc:5340
+msgid "Better yet become a subscriber - subscriptions start at US$1 per month."
+msgstr ""
+
+#: ardour_ui.cc:5341
+msgid "Pay for a copy (via the web)"
+msgstr ""
+
+#: ardour_ui.cc:5342
+msgid "Become a subscriber (via the web)"
+msgstr ""
+
+#: ardour_ui.cc:5361
+msgid "Remain silent"
+msgstr ""
+
+#: ardour_ui.cc:5363
+msgid "Give me more time"
+msgstr ""
+
+#: ardour_ui.cc:5656
+msgid "Global keybindings are missing"
+msgstr ""
+
+#: ardour_ui2.cc:79
 msgid "Play from playhead"
 msgstr "Spela från startmarkören"
 
-#: ardour_ui2.cc:129
+#: ardour_ui2.cc:80
 msgid "Stop playback"
 msgstr "Stanna uppspelning"
 
-#: ardour_ui2.cc:130
+#: ardour_ui2.cc:81
 msgid "Toggle record"
 msgstr "Växla inspelningläge"
 
-#: ardour_ui2.cc:131
+#: ardour_ui2.cc:82
 msgid "Play range/selection"
 msgstr "Spela omfång/markering"
 
-#: ardour_ui2.cc:132
+#: ardour_ui2.cc:83
 msgid "Go to start of session"
 msgstr "Gå till början av sessionen"
 
-#: ardour_ui2.cc:133
+#: ardour_ui2.cc:84
 msgid "Go to end of session"
 msgstr "GÃ¥ till slutet av sessionen"
 
-#: ardour_ui2.cc:134
+#: ardour_ui2.cc:85
 msgid "Play loop range"
 msgstr "Spela loop-omfång"
 
-#: ardour_ui2.cc:135
+#: ardour_ui2.cc:86
 msgid ""
 "MIDI Panic\n"
 "Send note off and reset controller messages on all MIDI channels"
 msgstr ""
 
-#: ardour_ui2.cc:136
+#: ardour_ui2.cc:87
 msgid "Return to last playback start when stopped"
 msgstr "Återvänd till senaste startmarkörpunkten vid stopp"
 
-#: ardour_ui2.cc:137
-msgid "Playhead follows Range Selections and Edits"
+#: ardour_ui2.cc:88
+msgid "Playhead follows range selections and edits"
 msgstr ""
 
-#: ardour_ui2.cc:138
+#: ardour_ui2.cc:89
 msgid "Be sensible about input monitoring"
 msgstr "Rimlig inljudsmedhörning"
 
-#: ardour_ui2.cc:139
+#: ardour_ui2.cc:90
 msgid "Enable/Disable audio click"
 msgstr "Slå på/av audio-klick"
 
-#: ardour_ui2.cc:140 monitor_section.cc:111
+#: ardour_ui2.cc:91 monitor_section.cc:129
 msgid ""
 "When active, something is soloed.\n"
 "Click to de-solo everything"
@@ -1467,19 +1736,17 @@ msgstr ""
 "I aktivt läge är valda kanaler i sololäge.\n"
 "Klicka för att stänga av"
 
-#: ardour_ui2.cc:141
+#: ardour_ui2.cc:92
 msgid ""
-"When active, auditioning is taking place\n"
+"When active, auditioning is taking place.\n"
 "Click to stop the audition"
 msgstr ""
-"I aktivt läge avlyssnas något\n"
-"Klicka för att stoppa avlyssningen"
 
-#: ardour_ui2.cc:142
+#: ardour_ui2.cc:93
 msgid "When active, there is a feedback loop."
 msgstr ""
 
-#: ardour_ui2.cc:143
+#: ardour_ui2.cc:94
 msgid ""
 "<b>Primary Clock</b> right-click to set display mode. Click to edit, click"
 "+drag a digit or mouse-over+scroll wheel to modify.\n"
@@ -1487,7 +1754,7 @@ msgid ""
 "confirm; postfix the edit with '+' or '-' to enter delta times.\n"
 msgstr ""
 
-#: ardour_ui2.cc:144
+#: ardour_ui2.cc:95
 msgid ""
 "<b>Secondary Clock</b> right-click to set display mode. Click to edit, click"
 "+drag a digit or mouse-over+scroll wheel to modify.\n"
@@ -1495,450 +1762,559 @@ msgid ""
 "confirm; postfix the edit with '+' or '-' to enter delta times.\n"
 msgstr ""
 
-#: ardour_ui2.cc:145
+#: ardour_ui2.cc:96
 msgid "Reset All Peak Indicators"
 msgstr ""
 
-#: ardour_ui2.cc:146
+#: ardour_ui2.cc:97
 msgid "Show Error Log and acknowledge warnings"
 msgstr ""
 
-#: ardour_ui2.cc:179
+#: ardour_ui2.cc:130
 msgid "[ERROR]: "
 msgstr ""
 
-#: ardour_ui2.cc:182
+#: ardour_ui2.cc:133
 msgid "[WARNING]: "
 msgstr ""
 
-#: ardour_ui2.cc:185
+#: ardour_ui2.cc:136
 msgid "[INFO]: "
 msgstr ""
 
-#: ardour_ui2.cc:253 ardour_ui_ed.cc:403
+#: ardour_ui2.cc:197 ardour_ui_ed.cc:509
 msgid "Auto Return"
 msgstr "Autoåtervänd"
 
-#: ardour_ui2.cc:255 ardour_ui_ed.cc:406
+#: ardour_ui2.cc:199 ardour_ui_ed.cc:512
 msgid "Follow Edits"
 msgstr ""
 
-#: ardour_ui2.cc:716 rc_option_editor.cc:2300
+#: ardour_ui2.cc:422 ardour_ui2.cc:426 ardour_ui2.cc:430
+msgid ""
+"Drag this tab to the desktop to show %1 in its own window\n"
+"\n"
+"To put the window back, use the Window > %1 > Attach menu action"
+msgstr ""
+
+#: ardour_ui2.cc:638
 msgid "GUI"
 msgstr ""
 
-#: ardour_ui2.cc:733 rc_option_editor.cc:1309 rc_option_editor.cc:1327
-#: rc_option_editor.cc:1330 rc_option_editor.cc:1332 rc_option_editor.cc:1334
-#: rc_option_editor.cc:1342 rc_option_editor.cc:1350 rc_option_editor.cc:1352
-#: rc_option_editor.cc:1360 rc_option_editor.cc:1367 rc_option_editor.cc:1376
-#: rc_option_editor.cc:1378 rc_option_editor.cc:1380 rc_option_editor.cc:1388
-#: rc_option_editor.cc:1390 rc_option_editor.cc:1399
-#: session_option_editor.cc:321 session_option_editor.cc:323
-#: session_option_editor.cc:344 session_option_editor.cc:346
-#: session_option_editor.cc:348 session_option_editor.cc:355
-#: session_option_editor.cc:362 session_option_editor.cc:366
+#: ardour_ui2.cc:651 rc_option_editor.cc:1874 rc_option_editor.cc:1892
+#: rc_option_editor.cc:1895 rc_option_editor.cc:1897 rc_option_editor.cc:1899
+#: rc_option_editor.cc:1907 rc_option_editor.cc:1909 rc_option_editor.cc:1917
+#: rc_option_editor.cc:1925 rc_option_editor.cc:1932 rc_option_editor.cc:1953
+#: rc_option_editor.cc:1955 rc_option_editor.cc:1964
+#: session_option_editor.cc:342 session_option_editor.cc:344
+#: session_option_editor.cc:365 session_option_editor.cc:367
+#: session_option_editor.cc:369 session_option_editor.cc:376
+#: session_option_editor.cc:383 session_option_editor.cc:387
 msgid "Misc"
 msgstr "Diverse"
 
-#: ardour_ui_dependents.cc:76
+#: ardour_ui_dependents.cc:118
 msgid "Setup Editor"
 msgstr "Förbereder redigeraren..."
 
-#: ardour_ui_dependents.cc:78
+#: ardour_ui_dependents.cc:120
 msgid "Setup Mixer"
 msgstr "Förbereder mixern..."
 
-#: ardour_ui_dependents.cc:84
+#: ardour_ui_dependents.cc:127
 msgid "Reload Session History"
 msgstr "Laddar sessionshistoriken..."
 
-#: ardour_ui_dialogs.cc:250
+#: ardour_ui_dependents.cc:248
+msgid "UI: cannot setup editor"
+msgstr "Gränssnitt: kan ej konfigurera editorn"
+
+#: ardour_ui_dependents.cc:253
+msgid "UI: cannot setup mixer"
+msgstr "Gränssnitt: kan inte konfigurera mixern"
+
+#: ardour_ui_dependents.cc:258
+msgid "UI: cannot setup meterbridge"
+msgstr ""
+
+#: ardour_ui_dependents.cc:263
+msgid "UI: cannot setup luawindow"
+msgstr ""
+
+#: ardour_ui_dependents.cc:269 ardour_ui_ed.cc:136 ardour_ui_ed.cc:257
+#: rc_option_editor.cc:1853 rc_option_editor.cc:3487
+msgid "Preferences"
+msgstr "Inställningar"
+
+#: ardour_ui_dependents.cc:270 ardour_ui_ed.cc:134 mixer_ui.cc:100
+#: mixer_ui.cc:410
+msgid "Mixer"
+msgstr ""
+
+#: ardour_ui_dependents.cc:271 ardour_ui_ed.cc:135 editor.cc:5790
+#: editor.cc:6062 public_editor.cc:34 rc_option_editor.cc:2201
+#: rc_option_editor.cc:2215 rc_option_editor.cc:2219 rc_option_editor.cc:2227
+#: rc_option_editor.cc:2236 rc_option_editor.cc:2244 rc_option_editor.cc:2253
+#: rc_option_editor.cc:2261 rc_option_editor.cc:2269 rc_option_editor.cc:2279
+#: rc_option_editor.cc:2281 rc_option_editor.cc:2305 rc_option_editor.cc:2317
+#: rc_option_editor.cc:2328 rc_option_editor.cc:2346
+msgid "Editor"
+msgstr "Redigerare"
+
+#: ardour_ui_dialogs.cc:263
 msgid "Don't close"
 msgstr ""
 
-#: ardour_ui_dialogs.cc:251
+#: ardour_ui_dialogs.cc:264
 msgid "Just close"
 msgstr ""
 
-#: ardour_ui_dialogs.cc:252
+#: ardour_ui_dialogs.cc:265
 msgid "Save and close"
 msgstr ""
 
-#: ardour_ui_dialogs.cc:362
-msgid "This screen is not tall enough to display the mixer window"
+#: ardour_ui_ed.cc:124
+msgid "Escape"
 msgstr ""
 
-#: ardour_ui_ed.cc:102
+#: ardour_ui_ed.cc:128
 msgid "Session"
 msgstr ""
 
-#: ardour_ui_ed.cc:105 editor_actions.cc:138 editor_regions.cc:116
-#: port_group.cc:458 session_option_editor.cc:82 session_option_editor.cc:89
+#: ardour_ui_ed.cc:131 editor_actions.cc:141 editor_regions.cc:163
+#: port_group.cc:468 session_option_editor.cc:82 session_option_editor.cc:89
 msgid "Sync"
 msgstr "Synk."
 
-#: ardour_ui_ed.cc:106
+#: ardour_ui_ed.cc:132
 msgid "Options"
 msgstr "Inställningar"
 
-#: ardour_ui_ed.cc:107
+#: ardour_ui_ed.cc:133
 msgid "Window"
 msgstr "Fönster"
 
-#: ardour_ui_ed.cc:108
+#: ardour_ui_ed.cc:137 ardour_ui_ed.cc:267 ardour_ui_ed.cc:268
+#: ardour_ui_ed.cc:269
+msgid "Detach"
+msgstr ""
+
+#: ardour_ui_ed.cc:138
 msgid "Help"
 msgstr "Hjälp"
 
-#: ardour_ui_ed.cc:109
+#: ardour_ui_ed.cc:139
 msgid "Misc. Shortcuts"
 msgstr "Diverse kortkommandon"
 
-#: ardour_ui_ed.cc:110
+#: ardour_ui_ed.cc:140
 msgid "Audio File Format"
 msgstr "Ljudfilsformat"
 
-#: ardour_ui_ed.cc:111
+#: ardour_ui_ed.cc:141
 msgid "File Type"
 msgstr "Filtyp"
 
-#: ardour_ui_ed.cc:112 export_format_dialog.cc:67
+#: ardour_ui_ed.cc:142 export_format_dialog.cc:75
 msgid "Sample Format"
 msgstr "Samplingsformat"
 
-#: ardour_ui_ed.cc:113 rc_option_editor.cc:2245 rc_option_editor.cc:2257
+#: ardour_ui_ed.cc:143 rc_option_editor.cc:2841
 msgid "Control Surfaces"
 msgstr "Kontrollytor"
 
-#: ardour_ui_ed.cc:114 rc_option_editor.cc:1921 rc_option_editor.cc:2264
+#: ardour_ui_ed.cc:144 rc_option_editor.cc:2847 rc_option_editor.cc:2853
+#: rc_option_editor.cc:2862 rc_option_editor.cc:2873 rc_option_editor.cc:2883
+#: rc_option_editor.cc:2945 rc_option_editor.cc:2962 rc_option_editor.cc:2978
+#: rc_option_editor.cc:2979 rc_option_editor.cc:2988 rc_option_editor.cc:3002
+#: rc_option_editor.cc:3005 rc_option_editor.cc:3013 rc_option_editor.cc:3021
 msgid "Plugins"
 msgstr "Insticksprogram"
 
-#: ardour_ui_ed.cc:115 rc_option_editor.cc:2351
+#: ardour_ui_ed.cc:145 rc_option_editor.cc:3169
 msgid "Metering"
 msgstr "Nivåmätning"
 
-#: ardour_ui_ed.cc:116
+#: ardour_ui_ed.cc:146
 msgid "Fall Off Rate"
 msgstr ""
 
-#: ardour_ui_ed.cc:117
+#: ardour_ui_ed.cc:147
 msgid "Hold Time"
 msgstr "Hållningslängd"
 
-#: ardour_ui_ed.cc:118
+#: ardour_ui_ed.cc:148
 msgid "Denormal Handling"
 msgstr "Denormal-hantering"
 
-#: ardour_ui_ed.cc:122 route_time_axis.cc:1677
+#: ardour_ui_ed.cc:152 route_time_axis.cc:1683
 msgid "New..."
 msgstr "Ny..."
 
-#: ardour_ui_ed.cc:124
+#: ardour_ui_ed.cc:154
 msgid "Open..."
 msgstr "Öppna..."
 
-#: ardour_ui_ed.cc:125
+#: ardour_ui_ed.cc:155
 msgid "Recent..."
 msgstr "Tidigare..."
 
-#: ardour_ui_ed.cc:126 panner_editor.cc:29 playlist_selector.cc:64
+#: ardour_ui_ed.cc:156 panner_editor.cc:29 playlist_selector.cc:64
 msgid "Close"
 msgstr "Stäng"
 
-#: ardour_ui_ed.cc:129
+#: ardour_ui_ed.cc:159
 msgid "Add Track or Bus..."
 msgstr "Lägg till spår eller buss..."
 
-#: ardour_ui_ed.cc:134
-msgid "Open Video"
+#: ardour_ui_ed.cc:163
+msgid "Duplicate Tracks/Busses..."
+msgstr ""
+
+#: ardour_ui_ed.cc:169
+msgid "Cancel Solo"
+msgstr ""
+
+#: ardour_ui_ed.cc:173
+msgid "Session|Scripting"
+msgstr ""
+
+#: ardour_ui_ed.cc:176
+msgid "Add Lua Script..."
 msgstr ""
 
-#: ardour_ui_ed.cc:137
+#: ardour_ui_ed.cc:180
+msgid "Remove Lua Script"
+msgstr ""
+
+#: ardour_ui_ed.cc:184
+msgid "Open Video..."
+msgstr ""
+
+#: ardour_ui_ed.cc:187
 msgid "Remove Video"
 msgstr ""
 
-#: ardour_ui_ed.cc:140
-msgid "Export To Video File"
+#: ardour_ui_ed.cc:190
+msgid "Export to Video File..."
 msgstr ""
 
-#: ardour_ui_ed.cc:144
-msgid "Snapshot..."
-msgstr "Ögonblickskopia..."
+#: ardour_ui_ed.cc:194
+msgid "Snapshot (& keep working on current version) ..."
+msgstr ""
 
-#: ardour_ui_ed.cc:148
+#: ardour_ui_ed.cc:197
+msgid "Snapshot (& switch to new version) ..."
+msgstr ""
+
+#: ardour_ui_ed.cc:200
+msgid "Quick Snapshot (& keep working on current version) ..."
+msgstr ""
+
+#: ardour_ui_ed.cc:203
+msgid "Quick Snapshot (& switch to new version) ..."
+msgstr ""
+
+#: ardour_ui_ed.cc:207
 msgid "Save As..."
 msgstr "Spara som..."
 
-#: ardour_ui_ed.cc:152 editor_actions.cc:1771 editor_markers.cc:903
-#: editor_snapshots.cc:124 mixer_strip.cc:1518 route_time_axis.cc:1673
+#: ardour_ui_ed.cc:210 editor_actions.cc:1788 editor_markers.cc:908
+#: editor_snapshots.cc:136 mixer_strip.cc:1653 route_time_axis.cc:1679
 msgid "Rename..."
 msgstr "Byt namn..."
 
-#: ardour_ui_ed.cc:156
+#: ardour_ui_ed.cc:214
 msgid "Save Template..."
 msgstr "Spara mall..."
 
-#: ardour_ui_ed.cc:159
+#: ardour_ui_ed.cc:217
 msgid "Metadata"
 msgstr ""
 
-#: ardour_ui_ed.cc:162
+#: ardour_ui_ed.cc:220
 msgid "Edit Metadata..."
 msgstr "Redigera metadata..."
 
-#: ardour_ui_ed.cc:165
+#: ardour_ui_ed.cc:223
 msgid "Import Metadata..."
 msgstr "Importera metadata..."
 
-#: ardour_ui_ed.cc:168
-msgid "Export To Audio File(s)..."
-msgstr "Exportera till ljudfil(er)..."
+#: ardour_ui_ed.cc:226
+msgid "Export to Audio File(s)..."
+msgstr ""
 
-#: ardour_ui_ed.cc:171
+#: ardour_ui_ed.cc:229
 msgid "Stem export..."
 msgstr ""
 
-#: ardour_ui_ed.cc:174 editor_export_audio.cc:65 export_dialog.cc:129
-#: export_video_dialog.cc:84
+#: ardour_ui_ed.cc:232 editor_export_audio.cc:66
+#: export_channel_selector.cc:190 export_channel_selector.cc:578
+#: export_dialog.cc:131 export_video_dialog.cc:80
 msgid "Export"
 msgstr "Exportera"
 
-#: ardour_ui_ed.cc:177
+#: ardour_ui_ed.cc:235
 msgid "Clean-up Unused Sources..."
 msgstr ""
 
-#: ardour_ui_ed.cc:181
+#: ardour_ui_ed.cc:239
+msgid "Reset Peak Files"
+msgstr ""
+
+#: ardour_ui_ed.cc:243
 msgid "Flush Wastebasket"
 msgstr "Töm papperskorgen"
 
-#: ardour_ui_ed.cc:188
+#: ardour_ui_ed.cc:251
 msgid "Quit"
 msgstr "Avsluta"
 
-#: ardour_ui_ed.cc:192
+#: ardour_ui_ed.cc:252 ardour_ui_ed.cc:259 ardour_ui_ed.cc:260
+#: ardour_ui_ed.cc:261 automation_time_axis.cc:545 editor_actions.cc:686
+#: editor_markers.cc:907 location_ui.cc:61 plugin_selector.cc:97
+#: route_time_axis.cc:864
+msgid "Hide"
+msgstr "Göm"
+
+#: ardour_ui_ed.cc:263 ardour_ui_ed.cc:264 ardour_ui_ed.cc:265
+msgid "Attach"
+msgstr ""
+
+#: ardour_ui_ed.cc:275 ardour_ui_ed.cc:276 ardour_ui_ed.cc:277
+#: ardour_ui_ed.cc:283 ardour_ui_ed.cc:284 ardour_ui_ed.cc:285
+msgid "Change"
+msgstr ""
+
+#: ardour_ui_ed.cc:287
+msgid "Previous Tab"
+msgstr ""
+
+#: ardour_ui_ed.cc:288
+msgid "Next Tab"
+msgstr ""
+
+#: ardour_ui_ed.cc:290
+msgid "Toggle Editor & Mixer"
+msgstr ""
+
+#: ardour_ui_ed.cc:294
 msgid "Maximise Editor Space"
 msgstr "Helskärmsläge"
 
-#: ardour_ui_ed.cc:193
+#: ardour_ui_ed.cc:295
 msgid "Maximise Mixer Space"
 msgstr ""
 
-#: ardour_ui_ed.cc:194
-msgid "Show Toolbars"
+#: ardour_ui_ed.cc:298
+msgid "Toggle Mixer List"
 msgstr ""
 
-#: ardour_ui_ed.cc:198
-msgid "Show more UI preferences"
+#: ardour_ui_ed.cc:301
+msgid "Toggle Monitor Section Visibility"
 msgstr ""
 
-#: ardour_ui_ed.cc:200 mixer_ui.cc:1924 mixer_ui.cc:1930
-msgid "Window|Mixer"
+#: ardour_ui_ed.cc:305
+msgid "Show more UI preferences"
 msgstr ""
 
-#: ardour_ui_ed.cc:201
-msgid "Toggle Editor+Mixer"
+#: ardour_ui_ed.cc:308
+msgid "Window|Scripting"
 msgstr ""
 
-#: ardour_ui_ed.cc:202 meterbridge.cc:218 meterbridge.cc:224
+#: ardour_ui_ed.cc:309 meterbridge.cc:214 meterbridge.cc:220
 msgid "Window|Meterbridge"
 msgstr ""
 
-#: ardour_ui_ed.cc:204
-msgid "Reattach All Tearoffs"
-msgstr ""
-
-#: ardour_ui_ed.cc:206 midi_tracer.cc:45
+#: ardour_ui_ed.cc:311 midi_tracer.cc:45
 msgid "MIDI Tracer"
 msgstr "MIDI-spårare"
 
-#: ardour_ui_ed.cc:208
+#: ardour_ui_ed.cc:314
 msgid "Chat"
 msgstr "Chatt"
 
-#: ardour_ui_ed.cc:210
+#: ardour_ui_ed.cc:316
 msgid "Help|Manual"
 msgstr ""
 
-#: ardour_ui_ed.cc:211
-msgid "Reference"
-msgstr "Referens"
+#: ardour_ui_ed.cc:317
+msgid "Manual|Reference"
+msgstr ""
 
-#: ardour_ui_ed.cc:212
-msgid "Report A Bug"
+#: ardour_ui_ed.cc:318
+msgid "Report a Bug"
 msgstr ""
 
-#: ardour_ui_ed.cc:213
+#: ardour_ui_ed.cc:319
 msgid "Cheat Sheet"
 msgstr ""
 
-#: ardour_ui_ed.cc:214
+#: ardour_ui_ed.cc:320
 msgid "Ardour Website"
 msgstr ""
 
-#: ardour_ui_ed.cc:215
+#: ardour_ui_ed.cc:321
 msgid "Ardour Development"
 msgstr ""
 
-#: ardour_ui_ed.cc:216
+#: ardour_ui_ed.cc:322
 msgid "User Forums"
 msgstr ""
 
-#: ardour_ui_ed.cc:217
-msgid "How to report a bug"
+#: ardour_ui_ed.cc:323
+msgid "How to Report a Bug"
 msgstr ""
 
-#: ardour_ui_ed.cc:219 plugin_ui.cc:419
+#: ardour_ui_ed.cc:325 luawindow.cc:100 luawindow.cc:654 plugin_ui.cc:419
 msgid "Save"
 msgstr "Spara"
 
-#: ardour_ui_ed.cc:227 rc_option_editor.cc:1419 rc_option_editor.cc:1430
-#: rc_option_editor.cc:1441 rc_option_editor.cc:1450 rc_option_editor.cc:1463
-#: rc_option_editor.cc:1476 rc_option_editor.cc:1485 rc_option_editor.cc:1495
-#: rc_option_editor.cc:1497 rc_option_editor.cc:1506 rc_option_editor.cc:1522
-#: rc_option_editor.cc:1543 rc_option_editor.cc:1561 rc_option_editor.cc:1563
-#: rc_option_editor.cc:1579 rc_option_editor.cc:1582 rc_option_editor.cc:1584
-#: rc_option_editor.cc:1601 rc_option_editor.cc:1612
+#: ardour_ui_ed.cc:333 rc_option_editor.cc:1975 rc_option_editor.cc:1986
+#: rc_option_editor.cc:1997 rc_option_editor.cc:2008 rc_option_editor.cc:2017
+#: rc_option_editor.cc:2030 rc_option_editor.cc:2043 rc_option_editor.cc:2052
+#: rc_option_editor.cc:2062 rc_option_editor.cc:2079 rc_option_editor.cc:2186
 msgid "Transport"
 msgstr "Uppspelning"
 
-#: ardour_ui_ed.cc:233
+#: ardour_ui_ed.cc:339 engine_dialog.cc:88
 msgid "Stop"
 msgstr "Stopp"
 
-#: ardour_ui_ed.cc:236
+#: ardour_ui_ed.cc:342
 msgid "Roll"
 msgstr ""
 
-#: ardour_ui_ed.cc:240 ardour_ui_ed.cc:243
+#: ardour_ui_ed.cc:346 ardour_ui_ed.cc:349
 msgid "Start/Stop"
 msgstr "Start/Stopp"
 
-#: ardour_ui_ed.cc:246
+#: ardour_ui_ed.cc:352
 msgid "Start/Continue/Stop"
 msgstr "Start/Fortsätt/Stopp"
 
-#: ardour_ui_ed.cc:249
+#: ardour_ui_ed.cc:355
 msgid "Stop and Forget Capture"
 msgstr "Stoppa och glöm inspelning"
 
-#: ardour_ui_ed.cc:259
-msgid "Transition To Roll"
-msgstr "Övergång till Rullning"
+#: ardour_ui_ed.cc:365
+msgid "Transition to Roll"
+msgstr ""
 
-#: ardour_ui_ed.cc:263
-msgid "Transition To Reverse"
-msgstr "Övergång till Motsatt riktning"
+#: ardour_ui_ed.cc:369
+msgid "Transition to Reverse"
+msgstr ""
 
-#: ardour_ui_ed.cc:267
+#: ardour_ui_ed.cc:373
 msgid "Play Loop Range"
 msgstr "Spela loop-omfång"
 
-#: ardour_ui_ed.cc:270
+#: ardour_ui_ed.cc:376
 msgid "Play Selection"
 msgstr ""
 
-#: ardour_ui_ed.cc:273
+#: ardour_ui_ed.cc:379
 msgid "Play Selection w/Preroll"
 msgstr ""
 
-#: ardour_ui_ed.cc:277
+#: ardour_ui_ed.cc:383
 msgid "Enable Record"
 msgstr "Tillåt inspelning"
 
-#: ardour_ui_ed.cc:280 ardour_ui_ed.cc:284
+#: ardour_ui_ed.cc:386 ardour_ui_ed.cc:390
 msgid "Start Recording"
 msgstr "Börja inspelning"
 
-#: ardour_ui_ed.cc:288
+#: ardour_ui_ed.cc:394
 msgid "Rewind"
 msgstr "Bakåtspolning"
 
-#: ardour_ui_ed.cc:291
+#: ardour_ui_ed.cc:397
 msgid "Rewind (Slow)"
 msgstr "Bakåtspolning (långsam)"
 
-#: ardour_ui_ed.cc:294
+#: ardour_ui_ed.cc:400
 msgid "Rewind (Fast)"
 msgstr "Bakåtspolning (snabb)"
 
-#: ardour_ui_ed.cc:297
+#: ardour_ui_ed.cc:403
 msgid "Forward"
 msgstr "Framåtspolning"
 
-#: ardour_ui_ed.cc:300
+#: ardour_ui_ed.cc:406
 msgid "Forward (Slow)"
 msgstr "Framåtspolning (långsam)"
 
-#: ardour_ui_ed.cc:303
+#: ardour_ui_ed.cc:409
 msgid "Forward (Fast)"
 msgstr "Framåtspolning (snabb)"
 
-#: ardour_ui_ed.cc:306
+#: ardour_ui_ed.cc:412
 msgid "Go to Zero"
 msgstr "GÃ¥ till noll"
 
-#: ardour_ui_ed.cc:309 ardour_ui_ed.cc:312
+#: ardour_ui_ed.cc:415 ardour_ui_ed.cc:418
 msgid "Go to Start"
 msgstr "Gå till början"
 
-#: ardour_ui_ed.cc:315
+#: ardour_ui_ed.cc:421
 msgid "Go to End"
 msgstr "GÃ¥ till slutet"
 
-#: ardour_ui_ed.cc:318
+#: ardour_ui_ed.cc:424
 msgid "Go to Wall Clock"
 msgstr "Gå till väggklocka"
 
-#: ardour_ui_ed.cc:323 ardour_ui_ed.cc:326
+#: ardour_ui_ed.cc:429 ardour_ui_ed.cc:432
 msgid "Numpad Decimal"
 msgstr ""
 
-#: ardour_ui_ed.cc:329
+#: ardour_ui_ed.cc:435
 msgid "Numpad 0"
 msgstr ""
 
-#: ardour_ui_ed.cc:332
+#: ardour_ui_ed.cc:438
 msgid "Numpad 1"
 msgstr ""
 
-#: ardour_ui_ed.cc:335
+#: ardour_ui_ed.cc:441
 msgid "Numpad 2"
 msgstr ""
 
-#: ardour_ui_ed.cc:338
+#: ardour_ui_ed.cc:444
 msgid "Numpad 3"
 msgstr ""
 
-#: ardour_ui_ed.cc:341
+#: ardour_ui_ed.cc:447
 msgid "Numpad 4"
 msgstr ""
 
-#: ardour_ui_ed.cc:344
+#: ardour_ui_ed.cc:450
 msgid "Numpad 5"
 msgstr ""
 
-#: ardour_ui_ed.cc:347
+#: ardour_ui_ed.cc:453
 msgid "Numpad 6"
 msgstr ""
 
-#: ardour_ui_ed.cc:350
+#: ardour_ui_ed.cc:456
 msgid "Numpad 7"
 msgstr ""
 
-#: ardour_ui_ed.cc:353
+#: ardour_ui_ed.cc:459
 msgid "Numpad 8"
 msgstr ""
 
-#: ardour_ui_ed.cc:356
+#: ardour_ui_ed.cc:462
 msgid "Numpad 9"
 msgstr ""
 
-#: ardour_ui_ed.cc:360
+#: ardour_ui_ed.cc:466
 msgid "Focus On Clock"
 msgstr "Fokus på klockan"
 
-#: ardour_ui_ed.cc:364 ardour_ui_ed.cc:373 audio_clock.cc:2091 editor.cc:258
-#: editor_actions.cc:569 editor_actions.cc:578 export_timespan_selector.cc:88
+#: ardour_ui_ed.cc:470 ardour_ui_ed.cc:479 audio_clock.cc:2122 editor.cc:321
+#: editor_actions.cc:610 editor_actions.cc:619 export_timespan_selector.cc:85
 #: session_option_editor.cc:41 session_option_editor.cc:61
 #: session_option_editor.cc:80 session_option_editor.cc:96
 #: session_option_editor.cc:109 session_option_editor.cc:122
@@ -1946,257 +2322,274 @@ msgstr "Fokus på klockan"
 msgid "Timecode"
 msgstr "Tidskod"
 
-#: ardour_ui_ed.cc:366 ardour_ui_ed.cc:375 editor_actions.cc:567
+#: ardour_ui_ed.cc:472 ardour_ui_ed.cc:481 editor_actions.cc:608
 msgid "Bars & Beats"
 msgstr "Takter & slag"
 
-#: ardour_ui_ed.cc:368 ardour_ui_ed.cc:377
+#: ardour_ui_ed.cc:474 ardour_ui_ed.cc:483
 msgid "Minutes & Seconds"
 msgstr "Minuter & sekunder"
 
-#: ardour_ui_ed.cc:370 ardour_ui_ed.cc:379 audio_clock.cc:2095 editor.cc:259
-#: editor_actions.cc:568
+#: ardour_ui_ed.cc:476 ardour_ui_ed.cc:485 audio_clock.cc:2125 editor.cc:322
+#: editor_actions.cc:609
 msgid "Samples"
 msgstr "Samplingar"
 
-#: ardour_ui_ed.cc:382
+#: ardour_ui_ed.cc:488
 msgid "Punch In"
 msgstr "Inslag"
 
-#: ardour_ui_ed.cc:383 mixer_strip.cc:1819 mixer_strip.cc:1843
-#: mixer_strip.cc:2007 route_ui.cc:162 time_info_box.cc:116
+#: ardour_ui_ed.cc:489 mixer_strip.cc:1992 mixer_strip.cc:2193 route_ui.cc:187
+#: time_info_box.cc:110
 msgid "In"
 msgstr ""
 
-#: ardour_ui_ed.cc:386
+#: ardour_ui_ed.cc:492
 msgid "Punch Out"
 msgstr "Utslag"
 
-#: ardour_ui_ed.cc:387 mixer_strip.cc:1831 time_info_box.cc:117
+#: ardour_ui_ed.cc:493 mixer_strip.cc:2004 time_info_box.cc:111
 msgid "Out"
 msgstr "Ut"
 
-#: ardour_ui_ed.cc:390
+#: ardour_ui_ed.cc:496
 msgid "Punch In/Out"
 msgstr "Inslag/utslag"
 
-#: ardour_ui_ed.cc:391
+#: ardour_ui_ed.cc:497
 msgid "In/Out"
 msgstr ""
 
-#: ardour_ui_ed.cc:394 rc_option_editor.cc:1376
+#: ardour_ui_ed.cc:500 rc_option_editor.cc:1941
 msgid "Click"
 msgstr "Klick"
 
-#: ardour_ui_ed.cc:397
+#: ardour_ui_ed.cc:503
 msgid "Auto Input"
 msgstr "Autoinljud"
 
-#: ardour_ui_ed.cc:400
+#: ardour_ui_ed.cc:506
 msgid "Auto Play"
 msgstr "Autospela"
 
-#: ardour_ui_ed.cc:411
+#: ardour_ui_ed.cc:517
 msgid "Sync Startup to Video"
 msgstr ""
 
-#: ardour_ui_ed.cc:413
+#: ardour_ui_ed.cc:519
 msgid "Time Master"
 msgstr "Huvudklocka"
 
-#: ardour_ui_ed.cc:420
+#: ardour_ui_ed.cc:521
+msgid "Use External Positional Sync Source"
+msgstr ""
+
+#: ardour_ui_ed.cc:526
 msgid "Toggle Record Enable Track %1"
 msgstr ""
 
-#: ardour_ui_ed.cc:427
+#: ardour_ui_ed.cc:533
 msgid "Percentage"
 msgstr "Procent"
 
-#: ardour_ui_ed.cc:428 shuttle_control.cc:178
+#: ardour_ui_ed.cc:534 shuttle_control.cc:205
 msgid "Semitones"
 msgstr "Halvtoner"
 
-#: ardour_ui_ed.cc:432
+#: ardour_ui_ed.cc:538
 msgid "Send MTC"
 msgstr "Skicka MTC"
 
-#: ardour_ui_ed.cc:434
+#: ardour_ui_ed.cc:540
 msgid "Send MMC"
 msgstr "Skicka MMC"
 
-#: ardour_ui_ed.cc:436
+#: ardour_ui_ed.cc:542
 msgid "Use MMC"
 msgstr "Använd MMC"
 
-#: ardour_ui_ed.cc:438 rc_option_editor.cc:2097
+#: ardour_ui_ed.cc:544 rc_option_editor.cc:2730
 msgid "Send MIDI Clock"
 msgstr "Skicka MIDI-klocka"
 
-#: ardour_ui_ed.cc:440
+#: ardour_ui_ed.cc:546
 msgid "Send MIDI Feedback"
 msgstr ""
 
-#: ardour_ui_ed.cc:446
+#: ardour_ui_ed.cc:552
 msgid "Panic"
 msgstr "Panik!"
 
-#: ardour_ui_ed.cc:534
+#: ardour_ui_ed.cc:629
 msgid "Wall Clock"
 msgstr ""
 
-#: ardour_ui_ed.cc:536
+#: ardour_ui_ed.cc:631
 msgid "Disk Space"
 msgstr ""
 
-#: ardour_ui_ed.cc:537
+#: ardour_ui_ed.cc:632
 msgid "DSP"
 msgstr ""
 
-#: ardour_ui_ed.cc:538
+#: ardour_ui_ed.cc:633
+msgid "X-run"
+msgstr ""
+
+#: ardour_ui_ed.cc:634
+msgid "Active Peak-file Work"
+msgstr ""
+
+#: ardour_ui_ed.cc:635
 msgid "Buffers"
 msgstr ""
 
-#: ardour_ui_ed.cc:540
+#: ardour_ui_ed.cc:637
 msgid "Timecode Format"
 msgstr ""
 
-#: ardour_ui_ed.cc:541
+#: ardour_ui_ed.cc:638
 msgid "File Format"
 msgstr ""
 
-#: ardour_ui_options.cc:63
+#: ardour_ui_options.cc:55
 msgid ""
 "It is not possible to use JACK as the the sync source\n"
 "when the pull up/down setting is non-zero."
 msgstr ""
 
-#: ardour_ui_options.cc:317
+#: ardour_ui_options.cc:309
 msgid "Internal"
 msgstr "Intern"
 
-#: ardour_ui_options.cc:498
+#: ardour_ui_options.cc:518
 msgid "Enable/Disable external positional sync"
 msgstr "Välj extern positionssynkronisering"
 
-#: ardour_ui_options.cc:500
+#: ardour_ui_options.cc:520
 msgid "Sync to JACK is not possible: video pull up/down is set"
 msgstr ""
 
-#: audio_clock.cc:1047 audio_clock.cc:1066
+#: audio_clock.cc:1057 audio_clock.cc:1076
 msgid "--pending--"
 msgstr ""
 
-#: audio_clock.cc:1118
+#: audio_clock.cc:1128
 msgid "SR"
 msgstr ""
 
-#: audio_clock.cc:1124 audio_clock.cc:1128
+#: audio_clock.cc:1134 audio_clock.cc:1138
 msgid "Pull"
 msgstr ""
 
-#: audio_clock.cc:1126
+#: audio_clock.cc:1136
 #, c-format
 msgid "%+.4f%%"
 msgstr ""
 
-#: audio_clock.cc:1282 editor.cc:260 editor_actions.cc:139
-#: editor_actions.cc:561
+#: audio_clock.cc:1292 editor.cc:323 editor_actions.cc:142
+#: editor_actions.cc:602
 msgid "Tempo"
 msgstr ""
 
-#: audio_clock.cc:1286 editor.cc:261 editor_actions.cc:562
+#: audio_clock.cc:1296 editor.cc:324 editor_actions.cc:603
 msgid "Meter"
 msgstr "Taktart"
 
-#: audio_clock.cc:1864 audio_streamview.cc:115 editor_actions.cc:1089
-#: session_metadata_dialog.cc:452 session_metadata_dialog.cc:500
-#: session_metadata_dialog.cc:556 session_metadata_dialog.cc:845
-#: streamview.cc:470
+#: audio_clock.cc:1878 audio_streamview.cc:117 editor_actions.cc:1092
+#: luainstance.cc:959 luainstance.cc:1575 plugin_pin_dialog.cc:859
+#: plugin_selector.cc:995 plugin_selector.cc:1016
+#: session_metadata_dialog.cc:455 session_metadata_dialog.cc:503
+#: session_metadata_dialog.cc:559 session_metadata_dialog.cc:848
+#: streamview.cc:474
 msgid "programming error: %1"
 msgstr ""
 
-#: audio_clock.cc:1997 audio_clock.cc:2025
+#: audio_clock.cc:2011 audio_clock.cc:2039
 msgid "programming error: %1 %2"
 msgstr ""
 
-#: audio_clock.cc:2093 editor.cc:257 export_timespan_selector.cc:98
+#: audio_clock.cc:2123 editor.cc:320 export_timespan_selector.cc:95
 msgid "Bars:Beats"
 msgstr "Takt:Slag"
 
-#: audio_clock.cc:2094 export_timespan_selector.cc:93
+#: audio_clock.cc:2124 export_timespan_selector.cc:90
 msgid "Minutes:Seconds"
 msgstr "Minuter:Sekunder"
 
-#: audio_clock.cc:2099
-msgid "Set From Playhead"
+#: audio_clock.cc:2129
+msgid "Set from Playhead"
 msgstr ""
 
-#: audio_clock.cc:2100
+#: audio_clock.cc:2130
 msgid "Locate to This Time"
 msgstr ""
 
-#: audio_region_editor.cc:64 control_point_dialog.cc:49 rhythm_ferret.cc:124
-#: rhythm_ferret.cc:129 rhythm_ferret.cc:134
+#: audio_clock.cc:2133
+msgid "Copy to clipboard"
+msgstr ""
+
+#: audio_region_editor.cc:60 control_point_dialog.cc:49 rhythm_ferret.cc:137
+#: rhythm_ferret.cc:154
 msgid "dB"
 msgstr ""
 
-#: audio_region_editor.cc:67
+#: audio_region_editor.cc:63
 msgid "Region gain:"
 msgstr "Regionens volym:"
 
-#: audio_region_editor.cc:77 export_format_dialog.cc:43
+#: audio_region_editor.cc:73 export_format_dialog.cc:49 export_report.cc:772
+#: export_report.cc:1185 fft_graph.cc:370
 msgid "dBFS"
 msgstr ""
 
-#: audio_region_editor.cc:80
+#: audio_region_editor.cc:76
 msgid "Peak amplitude:"
 msgstr "Toppamplitud:"
 
-#: audio_region_editor.cc:91
+#: audio_region_editor.cc:87
 msgid "Calculating..."
 msgstr "Räknar ut..."
 
-#: audio_region_view.cc:1243
+#: audio_region_view.cc:1385
 msgid "add gain control point"
 msgstr "lägg till volymkontrollspunkt"
 
-#: automation_controller.cc:286 automation_controller.cc:302
+#: automation_controller.cc:304 automation_controller.cc:320
 msgid "Select Note..."
 msgstr ""
 
-#: automation_controller.cc:293
+#: automation_controller.cc:311
 msgid "Halve"
 msgstr ""
 
-#: automation_controller.cc:296
+#: automation_controller.cc:314
 msgid "Double"
 msgstr ""
 
-#: automation_controller.cc:307
-msgid "Set to %1 beat(s)"
-msgstr ""
+#: automation_controller.cc:325
+msgid "Set to %1 beat"
+msgid_plural "Set to %1 beats"
+msgstr[0] ""
+msgstr[1] ""
 
-#: automation_line.cc:286 automation_line.cc:462
+#: automation_line.cc:292 editor_drag.cc:4388
 msgid "automation event move"
 msgstr "automatiseringshändelse: förflyttning"
 
-#: automation_line.cc:488 automation_line.cc:508
-msgid "automation range move"
-msgstr ""
-
-#: automation_line.cc:880 region_gain_line.cc:72
+#: automation_line.cc:888 region_gain_line.cc:75
 msgid "remove control point"
 msgstr "ta bort kontrollpunkt"
 
-#: automation_line.cc:1003
+#: automation_line.cc:1013
 msgid "Ignoring illegal points on AutomationLine \"%1\""
 msgstr ""
 
-#: automation_region_view.cc:190 automation_time_axis.cc:644
+#: automation_region_view.cc:193 automation_time_axis.cc:649
 msgid "add automation event"
 msgstr ""
 
-#: automation_streamview.cc:95
+#: automation_streamview.cc:94
 msgid "unable to display automation region for control without list"
 msgstr ""
 
@@ -2208,63 +2601,59 @@ msgstr "automatiseringstillstånd"
 msgid "hide track"
 msgstr "dölj spår"
 
-#: automation_time_axis.cc:308 automation_time_axis.cc:360
-#: automation_time_axis.cc:554 gain_meter.cc:220 generic_pluginui.cc:523
-#: generic_pluginui.cc:817 panner_ui.cc:151
+#: automation_time_axis.cc:310 automation_time_axis.cc:362
+#: automation_time_axis.cc:556 gain_meter.cc:230 generic_pluginui.cc:590
+#: generic_pluginui.cc:934 panner_ui.cc:151
 msgid "Automation|Manual"
 msgstr ""
 
-#: automation_time_axis.cc:310 automation_time_axis.cc:371
-#: automation_time_axis.cc:559 editor.cc:1904 editor.cc:1981
-#: editor_actions.cc:122 editor_actions.cc:1920 gain_meter.cc:223
-#: generic_pluginui.cc:99 generic_pluginui.cc:526 generic_pluginui.cc:819
-#: midi_time_axis.cc:1606 midi_time_axis.cc:1609 midi_time_axis.cc:1612
+#: automation_time_axis.cc:312 automation_time_axis.cc:373
+#: automation_time_axis.cc:561 editor.cc:2033 editor.cc:2111
+#: editor_actions.cc:125 editor_actions.cc:1937 gain_meter.cc:232
+#: generic_pluginui.cc:100 generic_pluginui.cc:593 generic_pluginui.cc:936
+#: midi_time_axis.cc:1610 midi_time_axis.cc:1613 midi_time_axis.cc:1616
 #: panner_ui.cc:154
 msgid "Play"
 msgstr "Uppspelning"
 
-#: automation_time_axis.cc:312 automation_time_axis.cc:382
-#: automation_time_axis.cc:564 gain_meter.cc:226 generic_pluginui.cc:101
-#: generic_pluginui.cc:529 generic_pluginui.cc:821 panner_ui.cc:157
+#: automation_time_axis.cc:314 automation_time_axis.cc:384
+#: automation_time_axis.cc:566 gain_meter.cc:234 generic_pluginui.cc:102
+#: generic_pluginui.cc:596 generic_pluginui.cc:938 panner_ui.cc:157
 msgid "Write"
 msgstr "Skriv"
 
-#: automation_time_axis.cc:314 automation_time_axis.cc:393
-#: automation_time_axis.cc:569 gain_meter.cc:229 generic_pluginui.cc:103
-#: generic_pluginui.cc:532 generic_pluginui.cc:823 panner_ui.cc:160
+#: automation_time_axis.cc:316 automation_time_axis.cc:395
+#: automation_time_axis.cc:571 gain_meter.cc:236 generic_pluginui.cc:104
+#: generic_pluginui.cc:599 generic_pluginui.cc:940 panner_ui.cc:160
 msgid "Touch"
 msgstr "Beröring"
 
-#: automation_time_axis.cc:404 generic_pluginui.cc:535 meter_patterns.cc:112
+#: automation_time_axis.cc:406 generic_pluginui.cc:602 meter_patterns.cc:118
 msgid "???"
 msgstr ""
 
-#: automation_time_axis.cc:445
+#: automation_time_axis.cc:447
 msgid "clear automation"
 msgstr "rensa automatisering"
 
-#: automation_time_axis.cc:543 editor_actions.cc:645 editor_markers.cc:902
-#: location_ui.cc:57 plugin_selector.cc:86 route_time_axis.cc:854
-msgid "Hide"
-msgstr "Göm"
-
-#: automation_time_axis.cc:545
+#: automation_time_axis.cc:547 rc_option_editor.cc:2916
+#: rc_option_editor.cc:2921 rc_option_editor.cc:2967 rc_option_editor.cc:2972
 msgid "Clear"
 msgstr "Rensa"
 
-#: automation_time_axis.cc:576
+#: automation_time_axis.cc:578
 msgid "State"
 msgstr "Tillstånd"
 
-#: automation_time_axis.cc:592
+#: automation_time_axis.cc:594
 msgid "Discrete"
 msgstr ""
 
-#: automation_time_axis.cc:598 export_format_dialog.cc:485
+#: automation_time_axis.cc:600 export_format_dialog.cc:552
 msgid "Linear"
 msgstr "Linjär"
 
-#: automation_time_axis.cc:604 rhythm_ferret.cc:109 shuttle_control.cc:197
+#: automation_time_axis.cc:606 rhythm_ferret.cc:118 shuttle_control.cc:224
 msgid "Mode"
 msgstr "Visningsläge"
 
@@ -2280,35 +2669,38 @@ msgstr "Redigera bunt"
 msgid "Direction:"
 msgstr "Riktning:"
 
-#: bundle_manager.cc:206 bundle_manager.cc:210 engine_dialog.cc:662
-#: mixer_strip.cc:162 mixer_strip.cc:367 mixer_strip.cc:2240
-#: rc_option_editor.cc:2326
+#: bundle_manager.cc:206 bundle_manager.cc:210 engine_dialog.cc:976
+#: mixer_strip.cc:175 mixer_strip.cc:392 mixer_strip.cc:2451
+#: rc_option_editor.cc:3135
 msgid "Input"
 msgstr "Ingång"
 
 #: bundle_manager.cc:207 bundle_manager.cc:212 bundle_manager.cc:246
-#: engine_dialog.cc:664 mixer_strip.cc:166 mixer_strip.cc:371
-#: mixer_strip.cc:2243 rc_option_editor.cc:2330
+#: engine_dialog.cc:978 mixer_strip.cc:179 mixer_strip.cc:396
+#: mixer_strip.cc:2454 monitor_section.cc:296 monitor_section.cc:300
+#: rc_option_editor.cc:3139
 msgid "Output"
 msgstr "Utgång"
 
-#: bundle_manager.cc:265 editor.cc:1945 editor_actions.cc:94
-#: editor_actions.cc:104 rc_option_editor.cc:1087 rc_option_editor.cc:1094
+#: bundle_manager.cc:265 editor.cc:2075 editor_actions.cc:97
+#: editor_actions.cc:107 lua_script_manager.cc:33 rc_option_editor.cc:2928
+#: rc_option_editor.cc:2942
 msgid "Edit"
 msgstr "Redigera"
 
-#: bundle_manager.cc:266 editor.cc:5902 editor.cc:5930 editor_actions.cc:338
-#: editor_actions.cc:339 editor_actions.cc:405 plugin_ui.cc:420
-#: processor_box.cc:2458 route_time_axis.cc:859
+#: bundle_manager.cc:266 editor.cc:5962 editor.cc:5992 editor_actions.cc:360
+#: editor_actions.cc:361 luawindow.cc:101 plugin_ui.cc:420
+#: processor_box.cc:3669 processor_box.cc:3671
 msgid "Delete"
 msgstr "Radera"
 
-#: bundle_manager.cc:272 bundle_manager.cc:439 editor_route_groups.cc:97
-#: editor_routes.cc:206 midi_list_editor.cc:107 session_metadata_dialog.cc:646
+#: bundle_manager.cc:272 bundle_manager.cc:439 editor_route_groups.cc:98
+#: editor_routes.cc:233 lua_script_manager.cc:42 lua_script_manager.cc:76
+#: midi_list_editor.cc:107 session_metadata_dialog.cc:649
 msgid "Name"
 msgstr "Namn"
 
-#: bundle_manager.cc:283
+#: bundle_manager.cc:283 luawindow.cc:566
 msgid "New"
 msgstr "Ny"
 
@@ -2324,6 +2716,39 @@ msgstr ""
 msgid "Rename Channel"
 msgstr "Byt namn på kanal"
 
+#: color_theme_manager.cc:58
+msgid "Restore Defaults"
+msgstr "Nollställ"
+
+#: color_theme_manager.cc:62
+msgid "Color Theme"
+msgstr ""
+
+#: color_theme_manager.cc:126
+msgid "Object"
+msgstr "Objekt"
+
+#: color_theme_manager.cc:129 route_group_dialog.cc:53
+#: route_group_dialog.cc:81
+msgid "Color"
+msgstr "Färg"
+
+#: color_theme_manager.cc:151
+msgid "Items"
+msgstr ""
+
+#: color_theme_manager.cc:152
+msgid "Palette"
+msgstr ""
+
+#: color_theme_manager.cc:153
+msgid "Transparency"
+msgstr ""
+
+#: color_theme_manager.cc:475
+msgid "Color Palette"
+msgstr ""
+
 #: configinfo.cc:28
 msgid "Build Configuration"
 msgstr ""
@@ -2336,6 +2761,42 @@ msgstr ""
 msgid "Value"
 msgstr "Värde"
 
+#: control_slave_ui.cc:50 mixer_ui.cc:254
+msgid "Control Masters"
+msgstr ""
+
+#: control_slave_ui.cc:54
+msgid "-vca-"
+msgstr ""
+
+#: control_slave_ui.cc:211
+msgid "Unassign All"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:35
+msgid "Duplicate Tracks & Busses"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:36
+msgid "Copy playlists"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:37
+msgid "Create new (empty) playlists"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:38
+msgid "Share playlists"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:41
+msgid "Duplicate each track/bus this number of times:"
+msgstr ""
+
+#: duplicate_routes_dialog.cc:176
+msgid "1 or more tracks/busses could not be duplicated"
+msgstr ""
+
 #: edit_note_dialog.cc:42
 msgid "Note"
 msgstr ""
@@ -2373,2064 +2834,2159 @@ msgstr ""
 msgid "Velocity"
 msgstr ""
 
-#: edit_note_dialog.cc:88 patch_change_dialog.cc:66
+#: edit_note_dialog.cc:88 export_report.cc:246 export_report.cc:688
+#: patch_change_dialog.cc:66
 msgid "Time"
 msgstr ""
 
-#: edit_note_dialog.cc:98 editor_regions.cc:115
-#: export_timespan_selector.cc:378 export_timespan_selector.cc:440
-#: location_ui.cc:320 midi_list_editor.cc:115 time_info_box.cc:108
+#: edit_note_dialog.cc:99 editor_regions.cc:162
+#: export_timespan_selector.cc:375 export_timespan_selector.cc:437
+#: location_ui.cc:322 midi_list_editor.cc:115 time_info_box.cc:102
 msgid "Length"
 msgstr "Längd"
 
-#: edit_note_dialog.cc:165
+#: edit_note_dialog.cc:166
 msgid "edit note"
 msgstr ""
 
-#: editor.cc:147
+#: editor.cc:160
 msgid "CD Frames"
 msgstr "CD-frames"
 
-#: editor.cc:148
+#: editor.cc:161
 msgid "TC Frames"
 msgstr ""
 
-#: editor.cc:149
+#: editor.cc:162
 msgid "TC Seconds"
 msgstr ""
 
-#: editor.cc:150
+#: editor.cc:163
 msgid "TC Minutes"
 msgstr ""
 
-#: editor.cc:151
+#: editor.cc:164
 msgid "Seconds"
 msgstr "Sekunder"
 
-#: editor.cc:152
+#: editor.cc:165
 msgid "Minutes"
 msgstr "Minuter"
 
-#: editor.cc:153 quantize_dialog.cc:37 quantize_dialog.cc:141
+#: editor.cc:166 quantize_dialog.cc:37
 msgid "Beats/128"
 msgstr "Slag/128"
 
-#: editor.cc:154 quantize_dialog.cc:38 quantize_dialog.cc:143
+#: editor.cc:167 quantize_dialog.cc:38
 msgid "Beats/64"
 msgstr "Slag/64"
 
-#: editor.cc:155 quantize_dialog.cc:39 quantize_dialog.cc:145
+#: editor.cc:168 quantize_dialog.cc:39
 msgid "Beats/32"
 msgstr "Slag/32"
 
-#: editor.cc:156
+#: editor.cc:169 quantize_dialog.cc:40
 msgid "Beats/28"
 msgstr "Slag/28"
 
-#: editor.cc:157
+#: editor.cc:170 quantize_dialog.cc:41
 msgid "Beats/24"
 msgstr "Slag/24"
 
-#: editor.cc:158
+#: editor.cc:171 quantize_dialog.cc:42
 msgid "Beats/20"
 msgstr "Slag/20"
 
-#: editor.cc:159 quantize_dialog.cc:40 quantize_dialog.cc:147
+#: editor.cc:172 quantize_dialog.cc:43
 msgid "Beats/16"
 msgstr "Slag/16"
 
-#: editor.cc:160
+#: editor.cc:173 quantize_dialog.cc:44
 msgid "Beats/14"
 msgstr "Slag/14"
 
-#: editor.cc:161
+#: editor.cc:174 quantize_dialog.cc:45
 msgid "Beats/12"
 msgstr "Slag/12"
 
-#: editor.cc:162
+#: editor.cc:175 quantize_dialog.cc:46
 msgid "Beats/10"
 msgstr "Slag/10"
 
-#: editor.cc:163 quantize_dialog.cc:41 quantize_dialog.cc:149
+#: editor.cc:176 quantize_dialog.cc:47
 msgid "Beats/8"
 msgstr "Slag/8"
 
-#: editor.cc:164
+#: editor.cc:177 quantize_dialog.cc:48
 msgid "Beats/7"
 msgstr "Slag/7"
 
-#: editor.cc:165
+#: editor.cc:178 quantize_dialog.cc:49
 msgid "Beats/6"
 msgstr "Slag/6"
 
-#: editor.cc:166
+#: editor.cc:179 quantize_dialog.cc:50
 msgid "Beats/5"
 msgstr "Slag/5"
 
-#: editor.cc:167 quantize_dialog.cc:42 quantize_dialog.cc:151
+#: editor.cc:180 quantize_dialog.cc:51
 msgid "Beats/4"
 msgstr "Slag/4"
 
-#: editor.cc:168 quantize_dialog.cc:43 quantize_dialog.cc:153
+#: editor.cc:181 quantize_dialog.cc:52
 msgid "Beats/3"
 msgstr "Slag/3"
 
-#: editor.cc:169 quantize_dialog.cc:44 quantize_dialog.cc:155
+#: editor.cc:182 quantize_dialog.cc:53
 msgid "Beats/2"
 msgstr "Slag/2"
 
-#: editor.cc:170 quantize_dialog.cc:45 quantize_dialog.cc:157
+#: editor.cc:183 quantize_dialog.cc:54
 msgid "Beats"
 msgstr "Slag"
 
-#: editor.cc:171
+#: editor.cc:184
 msgid "Bars"
 msgstr "Takter"
 
-#: editor.cc:172
+#: editor.cc:185
 msgid "Marks"
 msgstr "Markörer"
 
-#: editor.cc:173
+#: editor.cc:186
 msgid "Region starts"
 msgstr "Region börjar"
 
-#: editor.cc:174
+#: editor.cc:187
 msgid "Region ends"
 msgstr "Region slutar"
 
-#: editor.cc:175
+#: editor.cc:188
 msgid "Region syncs"
 msgstr "Region synkar"
 
-#: editor.cc:176
+#: editor.cc:189
 msgid "Region bounds"
 msgstr "Region gränsar"
 
-#: editor.cc:181 editor_actions.cc:510
+#: editor.cc:194 editor_actions.cc:551
 msgid "No Grid"
 msgstr "Inget rutnät"
 
-#: editor.cc:182 editor_actions.cc:511
+#: editor.cc:195 editor_actions.cc:552
 msgid "Grid"
 msgstr "Rutnät"
 
-#: editor.cc:183 editor_actions.cc:512
+#: editor.cc:196 editor_actions.cc:553
 msgid "Magnetic"
 msgstr "Magnetisk"
 
-#: editor.cc:188 editor.cc:206 editor_actions.cc:121 editor_actions.cc:493
+#: editor.cc:201 editor.cc:219 editor_actions.cc:124 editor_actions.cc:534
 msgid "Playhead"
 msgstr "Startmarkören"
 
-#: editor.cc:189 editor_actions.cc:495
+#: editor.cc:202 editor_actions.cc:536
 msgid "Marker"
 msgstr "Markör"
 
-#: editor.cc:190 editor.cc:207 editor_actions.cc:494
+#: editor.cc:203 editor.cc:220 editor_actions.cc:535
 msgid "Mouse"
 msgstr "Mus"
 
-#: editor.cc:195 editor_actions.cc:502
+#: editor.cc:208 editor_actions.cc:543
 msgid "Slide"
 msgstr "Glid"
 
-#: editor.cc:196
+#: editor.cc:209
 msgid "Splice"
 msgstr "Skarv"
 
-#: editor.cc:197 editor_actions.cc:501
+#: editor.cc:210 editor_actions.cc:542
 msgid "Ripple"
 msgstr ""
 
-#: editor.cc:198 editor_actions.cc:157 editor_actions.cc:503
-#: editor_actions.cc:1789 editor_markers.cc:905 editor_rulers.cc:260
-#: location_ui.cc:58 mixer_strip.cc:195 mixer_strip.cc:2028
+#: editor.cc:211 editor_actions.cc:1806 editor_markers.cc:910
+#: editor_rulers.cc:259 location_ui.cc:62
 msgid "Lock"
 msgstr "LÃ¥s"
 
-#: editor.cc:203 mono_panner_editor.cc:42
+#: editor.cc:216 mono_panner_editor.cc:44
 msgid "Left"
 msgstr "Vänster"
 
-#: editor.cc:204 mono_panner_editor.cc:47
+#: editor.cc:217 mono_panner_editor.cc:49
 msgid "Right"
 msgstr "Höger"
 
-#: editor.cc:205
+#: editor.cc:218
 msgid "Center"
 msgstr "Mitten"
 
-#: editor.cc:208 editor.cc:3231
+#: editor.cc:221
 msgid "Edit point"
 msgstr "redigeringspunkten"
 
-#: editor.cc:214
+#: editor.cc:227
 msgid "Mushy"
 msgstr "Mossig"
 
-#: editor.cc:215
+#: editor.cc:228
 msgid "Smooth"
 msgstr "Mjuk"
 
-#: editor.cc:216
+#: editor.cc:229
 msgid "Balanced multitimbral mixture"
 msgstr "Balanserad flerröstig mix"
 
-#: editor.cc:217
+#: editor.cc:230
 msgid "Unpitched percussion with stable notes"
 msgstr "Ej tonhöjdsändrat slagverk med stabila noter"
 
-#: editor.cc:218
+#: editor.cc:231
 msgid "Crisp monophonic instrumental"
 msgstr "Skarpt monofoniskt"
 
-#: editor.cc:219
+#: editor.cc:232
 msgid "Unpitched solo percussion"
 msgstr "EJ tonhöjdsändrat soloslagverk"
 
-#: editor.cc:220
+#: editor.cc:233
 msgid "Resample without preserving pitch"
 msgstr ""
 
-#: editor.cc:256
+#: editor.cc:319
 msgid "Mins:Secs"
 msgstr "Min:Sek"
 
-#: editor.cc:262
+#: editor.cc:325
 msgid "Location Markers"
 msgstr "Platsmarkörer"
 
-#: editor.cc:263
+#: editor.cc:326
 msgid "Range Markers"
 msgstr "Omfångsmarkörer"
 
-#: editor.cc:264
+#: editor.cc:327
 msgid "Loop/Punch Ranges"
 msgstr "Loop-/inslagsmarkörer"
 
-#: editor.cc:265 editor_actions.cc:565
+#: editor.cc:328 editor_actions.cc:606
 msgid "CD Markers"
 msgstr "CD-markörer"
 
-#: editor.cc:266
+#: editor.cc:329
 msgid "Video Timeline"
 msgstr ""
 
-#: editor.cc:283
+#: editor.cc:386
 msgid "mode"
 msgstr "läge"
 
-#: editor.cc:459 editor_actions.cc:114 editor_actions.cc:564
+#: editor.cc:535 editor_actions.cc:117 editor_actions.cc:605
 msgid "Markers"
 msgstr "Markörer"
 
-#: editor.cc:577 rc_option_editor.cc:1939
+#: editor.cc:653 rc_option_editor.cc:2527
 msgid "Regions"
 msgstr "Regioner"
 
-#: editor.cc:578
+#: editor.cc:654
 msgid "Tracks & Busses"
 msgstr "Spår & bussar"
 
-#: editor.cc:579
+#: editor.cc:655
 msgid "Snapshots"
 msgstr "Ögonblickskopior"
 
-#: editor.cc:580
+#: editor.cc:656
 msgid "Track & Bus Groups"
 msgstr ""
 
-#: editor.cc:581
+#: editor.cc:657
 msgid "Ranges & Marks"
 msgstr "Omfång & markörer"
 
-#: editor.cc:728 editor.cc:5754 rc_option_editor.cc:1619
-#: rc_option_editor.cc:1627 rc_option_editor.cc:1635 rc_option_editor.cc:1643
-#: rc_option_editor.cc:1667 rc_option_editor.cc:1679 rc_option_editor.cc:1681
-#: rc_option_editor.cc:1689 rc_option_editor.cc:1697 rc_option_editor.cc:1717
-#: rc_option_editor.cc:1729 rc_option_editor.cc:1731 rc_option_editor.cc:1733
-#: rc_option_editor.cc:1741 rc_option_editor.cc:1749 rc_option_editor.cc:1757
-#: rc_option_editor.cc:1772 rc_option_editor.cc:1776 rc_option_editor.cc:1800
-msgid "Editor"
-msgstr "Redigerare"
-
-#: editor.cc:1331 editor.cc:4735 editor_actions.cc:134 editor_actions.cc:1865
+#: editor.cc:1333 editor.cc:4737 editor_actions.cc:137 editor_actions.cc:1882
 msgid "Loop"
 msgstr "Loop"
 
-#: editor.cc:1337 editor.cc:4762 editor_actions.cc:135 time_info_box.cc:68
+#: editor.cc:1339 editor.cc:4764 editor_actions.cc:138 time_info_box.cc:62
 msgid "Punch"
 msgstr "Inslag"
 
-#: editor.cc:1449 rc_option_editor.cc:1661
+#: editor.cc:1474 rc_option_editor.cc:2299
 msgid "Linear (for highly correlated material)"
 msgstr ""
 
-#: editor.cc:1459 rc_option_editor.cc:1662
+#: editor.cc:1484 rc_option_editor.cc:2300
 msgid "Constant power"
 msgstr ""
 
-#: editor.cc:1468 rc_option_editor.cc:1663
+#: editor.cc:1493 rc_option_editor.cc:2301
 msgid "Symmetric"
 msgstr ""
 
-#: editor.cc:1478 rc_option_editor.cc:1664
+#: editor.cc:1503 rc_option_editor.cc:2302
 msgid "Slow"
 msgstr "LÃ¥ngsam"
 
-#: editor.cc:1487 rc_option_editor.cc:1665 sfdb_ui.cc:1771 sfdb_ui.cc:1881
+#: editor.cc:1512 rc_option_editor.cc:2303 sfdb_ui.cc:1737 sfdb_ui.cc:1847
 msgid "Fast"
 msgstr "Snabb"
 
-#: editor.cc:1509 editor.cc:1534
+#: editor.cc:1534 editor.cc:1559
 msgid "Deactivate"
 msgstr "Avaktivera"
 
-#: editor.cc:1511 editor.cc:1536
+#: editor.cc:1536 editor.cc:1561
 msgid "Activate"
 msgstr "Aktivera"
 
-#: editor.cc:1637 editor.cc:1645 editor_ops.cc:3824
+#: editor.cc:1662 editor.cc:1670 editor_ops.cc:3921
 msgid "Freeze"
 msgstr "Frys"
 
-#: editor.cc:1641
+#: editor.cc:1666
 msgid "Unfreeze"
 msgstr "Ofrys"
 
-#: editor.cc:1780
+#: editor.cc:1766
+msgid "Region Loudness Analysis"
+msgstr ""
+
+#: editor.cc:1785 editor.cc:1834
+msgid "Audio Report/Analysis"
+msgstr ""
+
+#: editor.cc:1815
+msgid "Range Loudness Analysis"
+msgstr ""
+
+#: editor.cc:1901
 msgid "Selected Regions"
 msgstr "Markerade regioner"
 
-#: editor.cc:1816 editor_markers.cc:940
+#: editor.cc:1945 editor_markers.cc:945
 msgid "Play Range"
 msgstr "Spela omfång"
 
-#: editor.cc:1817 editor_markers.cc:943
+#: editor.cc:1946 editor_markers.cc:948
 msgid "Loop Range"
 msgstr "Loopa omfång"
 
-#: editor.cc:1820 editor_markers.cc:950
+#: editor.cc:1949 editor_markers.cc:953
 msgid "Zoom to Range"
 msgstr ""
 
-#: editor.cc:1829 editor_actions.cc:369
+#: editor.cc:1952
+msgid "Loudness Analysis"
+msgstr ""
+
+#: editor.cc:1959 editor_actions.cc:401
 msgid "Move Range Start to Previous Region Boundary"
 msgstr ""
 
-#: editor.cc:1836 editor_actions.cc:376
+#: editor.cc:1966 editor_actions.cc:408
 msgid "Move Range Start to Next Region Boundary"
 msgstr ""
 
-#: editor.cc:1843 editor_actions.cc:383
+#: editor.cc:1973 editor_actions.cc:415
 msgid "Move Range End to Previous Region Boundary"
 msgstr ""
 
-#: editor.cc:1850 editor_actions.cc:390
+#: editor.cc:1980 editor_actions.cc:422
 msgid "Move Range End to Next Region Boundary"
 msgstr ""
 
 # msgid "Locate to Mark"
 # msgstr "Flytta startmarkören till platsmarkör"
-#: editor.cc:1856 editor_actions.cc:133 editor_actions.cc:325
+#: editor.cc:1986 editor_actions.cc:136 editor_actions.cc:347
 msgid "Separate"
 msgstr "Separera"
 
-#: editor.cc:1857
+#: editor.cc:1987
 msgid "Convert to Region in Region List"
 msgstr ""
 
-#: editor.cc:1860 editor_markers.cc:970
+#: editor.cc:1990 editor_markers.cc:973
 msgid "Select All in Range"
 msgstr "Markera allt i omfånget"
 
-#: editor.cc:1863 editor_actions.cc:297
+#: editor.cc:1993 editor_actions.cc:319
 msgid "Set Loop from Selection"
 msgstr ""
 
-#: editor.cc:1864 editor_actions.cc:298
+#: editor.cc:1994 editor_actions.cc:320
 msgid "Set Punch from Selection"
 msgstr ""
 
-#: editor.cc:1865 editor_actions.cc:299
+#: editor.cc:1995 editor_actions.cc:321
 msgid "Set Session Start/End from Selection"
 msgstr ""
 
-#: editor.cc:1868
+#: editor.cc:1998
 msgid "Add Range Markers"
 msgstr "Lägg till omfångsmarkörer"
 
-#: editor.cc:1871
+#: editor.cc:2001
 msgid "Crop Region to Range"
 msgstr ""
 
-#: editor.cc:1872
-msgid "Fill Range with Region"
-msgstr ""
-
-#: editor.cc:1873 editor_actions.cc:311
+#: editor.cc:2002 editor_actions.cc:333
 msgid "Duplicate Range"
 msgstr "Duplicera omfång"
 
-#: editor.cc:1876
+#: editor.cc:2005
 msgid "Consolidate Range"
 msgstr ""
 
-#: editor.cc:1877
-msgid "Consolidate Range With Processing"
+#: editor.cc:2006
+msgid "Consolidate Range with Processing"
 msgstr ""
 
-#: editor.cc:1878
+#: editor.cc:2007
 msgid "Bounce Range to Region List"
 msgstr ""
 
-#: editor.cc:1879
-msgid "Bounce Range to Region List With Processing"
+#: editor.cc:2008
+msgid "Bounce Range to Region List with Processing"
 msgstr ""
 
-#: editor.cc:1880 editor_markers.cc:953
+#: editor.cc:2009 editor_markers.cc:956
 msgid "Export Range..."
 msgstr ""
 
-#: editor.cc:1882
+#: editor.cc:2011
 msgid "Export Video Range..."
 msgstr ""
 
-#: editor.cc:1898 editor.cc:1979 editor_actions.cc:303
-msgid "Play From Edit Point"
-msgstr "Spela från redigeringspunkten"
+#: editor.cc:2027 editor.cc:2109 editor_actions.cc:325
+msgid "Play from Edit Point"
+msgstr ""
 
-#: editor.cc:1899 editor.cc:1980
-msgid "Play From Start"
-msgstr "Spela från starten"
+#: editor.cc:2028 editor.cc:2110
+msgid "Play from Start"
+msgstr ""
 
-#: editor.cc:1900
+#: editor.cc:2029
 msgid "Play Region"
 msgstr "Spela region"
 
-#: editor.cc:1902
+#: editor.cc:2031
 msgid "Loop Region"
 msgstr "Loopa region"
 
-#: editor.cc:1912 editor.cc:1989
+#: editor.cc:2041 editor.cc:2119
 msgid "Select All in Track"
 msgstr "Välj allt i spåret"
 
-#: editor.cc:1913 editor.cc:1990 editor_actions.cc:194
+#: editor.cc:2042 editor.cc:2120 editor_actions.cc:196
 msgid "Select All Objects"
 msgstr ""
 
-#: editor.cc:1914 editor.cc:1991
+#: editor.cc:2043 editor.cc:2121
 msgid "Invert Selection in Track"
 msgstr "Invertera markeringen i spåret"
 
-#: editor.cc:1915 editor.cc:1992 editor_actions.cc:197
+#: editor.cc:2044 editor.cc:2122 editor_actions.cc:199
 msgid "Invert Selection"
 msgstr "Invertera"
 
-#: editor.cc:1917
+#: editor.cc:2046 editor_actions.cc:201
 msgid "Set Range to Loop Range"
 msgstr "Ställ in omfång till loop-omfånget"
 
-#: editor.cc:1918
+#: editor.cc:2047 editor_actions.cc:202
 msgid "Set Range to Punch Range"
 msgstr "Ställ in omfång till inslagsomfånget"
 
-#: editor.cc:1920 editor.cc:1994 editor_actions.cc:199 editor_actions.cc:200
+#: editor.cc:2048 editor_actions.cc:203
+msgid "Set Range to Selected Regions"
+msgstr ""
+
+#: editor.cc:2050 editor.cc:2124 editor_actions.cc:205 editor_actions.cc:206
 msgid "Select All After Edit Point"
 msgstr "Markera allt efter redigeringspunkten"
 
-#: editor.cc:1921 editor.cc:1995 editor_actions.cc:201 editor_actions.cc:202
+#: editor.cc:2051 editor.cc:2125 editor_actions.cc:207 editor_actions.cc:208
 msgid "Select All Before Edit Point"
 msgstr "Markera allt före redigeringspunkten"
 
-#: editor.cc:1922 editor.cc:1996
+#: editor.cc:2052 editor.cc:2126
 msgid "Select All After Playhead"
 msgstr "Markera allt efter startmarkören"
 
-#: editor.cc:1923 editor.cc:1997
+#: editor.cc:2053 editor.cc:2127
 msgid "Select All Before Playhead"
 msgstr "Markera allt innan startmarkören"
 
-#: editor.cc:1924
+#: editor.cc:2054
 msgid "Select All Between Playhead and Edit Point"
 msgstr "Markera allt mellan startmarkören och redigeringspunkten"
 
-#: editor.cc:1925
+#: editor.cc:2055
 msgid "Select All Within Playhead and Edit Point"
 msgstr "Markera allt inom startmarkör och redigeringspunkten"
 
-#: editor.cc:1926
+#: editor.cc:2056
 msgid "Select Range Between Playhead and Edit Point"
 msgstr "Markera omfång mellan startmarkören och redigeringspunkten"
 
-#: editor.cc:1928 editor.cc:1999 editor_actions.cc:131 editor_actions.cc:132
+#: editor.cc:2058 editor.cc:2129 editor_actions.cc:134 editor_actions.cc:135
 msgid "Select"
 msgstr "Markera"
 
-#: editor.cc:1936 editor.cc:2007 editor_actions.cc:337 processor_box.cc:2451
+#: editor.cc:2066 editor.cc:2137 editor_actions.cc:359 processor_box.cc:3665
 msgid "Cut"
 msgstr "Klipp ut"
 
-#: editor.cc:1937 editor.cc:2008 editor_actions.cc:341 processor_box.cc:2454
+#: editor.cc:2067 editor.cc:2138 editor_actions.cc:363 processor_box.cc:3667
 msgid "Copy"
 msgstr "Kopiera"
 
-#: editor.cc:1938 editor.cc:2009 editor_actions.cc:342 processor_box.cc:2462
+#: editor.cc:2068 editor.cc:2139 editor_actions.cc:364 processor_box.cc:3679
 msgid "Paste"
 msgstr "Klistra in"
 
-#: editor.cc:1942 editor_actions.cc:91
+#: editor.cc:2072 editor_actions.cc:94
 msgid "Align"
 msgstr "Justera"
 
-#: editor.cc:1943
+#: editor.cc:2073
 msgid "Align Relative"
 msgstr "Justera relativt"
 
-#: editor.cc:1950
+#: editor.cc:2080
 msgid "Insert Selected Region"
 msgstr "Infoga vald region"
 
-#: editor.cc:1951
+#: editor.cc:2081
 msgid "Insert Existing Media"
 msgstr "Infoga existerande media"
 
-#: editor.cc:1960 editor.cc:2016
+#: editor.cc:2090 editor.cc:2146
 msgid "Nudge Entire Track Later"
 msgstr ""
 
-#: editor.cc:1961 editor.cc:2017
+#: editor.cc:2091 editor.cc:2147
 msgid "Nudge Track After Edit Point Later"
 msgstr ""
 
-#: editor.cc:1962 editor.cc:2018
+#: editor.cc:2092 editor.cc:2148
 msgid "Nudge Entire Track Earlier"
 msgstr ""
 
-#: editor.cc:1963 editor.cc:2019
+#: editor.cc:2093 editor.cc:2149
 msgid "Nudge Track After Edit Point Earlier"
 msgstr ""
 
-#: editor.cc:1965 editor.cc:2021
+#: editor.cc:2095 editor.cc:2151
 msgid "Nudge"
 msgstr "Knuffa"
 
-#: editor.cc:2235
+#: editor.cc:2353
 msgid ""
 "Playhead position stored with a negative value - ignored (use zero instead)"
 msgstr ""
 
-#: editor.cc:3006 editor.cc:3707 editor.cc:3778 midi_channel_selector.cc:157
+#: editor.cc:3115 editor.cc:3775 editor.cc:3846 midi_channel_selector.cc:157
 #: midi_channel_selector.cc:395 midi_channel_selector.cc:431
 msgid "All"
 msgstr "Alla"
 
-#: editor.cc:3210
-msgid "Smart Mode (add Range functions to Grab mode)"
+#: editor.cc:3280
+msgid "Smart Mode (add range functions to Grab Mode)"
 msgstr ""
 
-#: editor.cc:3211
+#: editor.cc:3281
 msgid "Grab Mode (select/move objects)"
 msgstr ""
 
-#: editor.cc:3212
+#: editor.cc:3282
 msgid "Cut Mode (split regions)"
 msgstr ""
 
-#: editor.cc:3213
+#: editor.cc:3283
 msgid "Range Mode (select time ranges)"
 msgstr ""
 
-#: editor.cc:3214
+#: editor.cc:3284
 msgid "Draw Mode (draw and edit gain/notes/automation)"
 msgstr ""
 
-#: editor.cc:3215
+#: editor.cc:3285
 msgid "Stretch Mode (time-stretch audio and midi regions, preserving pitch)"
 msgstr ""
 
-#: editor.cc:3216
+#: editor.cc:3286
 msgid "Audition Mode (listen to regions)"
 msgstr ""
 
-#: editor.cc:3217
-msgid "Internal Edit Mode (edit notes and gain curves inside regions)"
+#: editor.cc:3287
+msgid "Internal Edit Mode (edit notes and automation points)"
 msgstr ""
 
-#: editor.cc:3218
+#: editor.cc:3288
 msgid ""
 "Groups: click to (de)activate\n"
 "Context-click for other operations"
 msgstr ""
 
-#: editor.cc:3219
+#: editor.cc:3289
 msgid "Nudge Region/Selection Later"
 msgstr ""
 
-#: editor.cc:3220
+#: editor.cc:3290
 msgid "Nudge Region/Selection Earlier"
 msgstr ""
 
-#: editor.cc:3221 editor_actions.cc:262
+#: editor.cc:3291 editor_actions.cc:272
 msgid "Zoom In"
 msgstr "Zooma in"
 
-#: editor.cc:3222 editor_actions.cc:261
+#: editor.cc:3292 editor_actions.cc:271
 msgid "Zoom Out"
 msgstr "Zooma ut"
 
-#: editor.cc:3223
+#: editor.cc:3293
 msgid "Zoom to Time Scale"
 msgstr ""
 
-#: editor.cc:3224 editor.cc:3729 editor_actions.cc:263
+#: editor.cc:3294 editor.cc:3797 editor_actions.cc:273
 msgid "Zoom to Session"
 msgstr "Zooma in/ut till hela sessionen"
 
-#: editor.cc:3225
-msgid "Zoom focus"
-msgstr "Zoom-fokus"
+#: editor.cc:3295 editor_actions.cc:115 editor_actions.cc:148
+msgid "Zoom Focus"
+msgstr "Zoomfokus"
 
-#: editor.cc:3226
+#: editor.cc:3296
 msgid "Expand Tracks"
 msgstr "Expandera spår"
 
-#: editor.cc:3227
+#: editor.cc:3297
 msgid "Shrink Tracks"
 msgstr "Krymp spår"
 
-#: editor.cc:3228
+#: editor.cc:3298
 msgid "Number of visible tracks"
 msgstr ""
 
-#: editor.cc:3229
+#: editor.cc:3299
 msgid "Snap/Grid Units"
 msgstr "Fästläge/rutnätsenheter"
 
-#: editor.cc:3230
+#: editor.cc:3300
 msgid "Snap/Grid Mode"
 msgstr "Fästläge/rutnätsläge"
 
-#: editor.cc:3232
+#: editor.cc:3301 editor_actions.cc:101
+msgid "Edit Point"
+msgstr "Redigeringspunkten"
+
+#: editor.cc:3302
 msgid "Edit Mode"
 msgstr "Redigeringsläge"
 
-#: editor.cc:3233
+#: editor.cc:3303
 msgid ""
 "Nudge Clock\n"
 "(controls distance used to nudge regions and selections)"
 msgstr ""
 
-#: editor.cc:3501 editor_actions.cc:313
+#: editor.cc:3571 editor_actions.cc:335
 msgid "Command|Undo"
 msgstr ""
 
-#: editor.cc:3503
+#: editor.cc:3573
 msgid "Command|Undo (%1)"
 msgstr ""
 
-#: editor.cc:3510 editor_actions.cc:315 editor_actions.cc:316
-#: editor_actions.cc:317
+#: editor.cc:3580 editor_actions.cc:337 editor_actions.cc:338
+#: editor_actions.cc:339
 msgid "Redo"
 msgstr "Gör om"
 
-#: editor.cc:3512
+#: editor.cc:3583
 msgid "Redo (%1)"
 msgstr "Gör om (%1)"
 
-#: editor.cc:3531 editor.cc:3555 editor_actions.cc:110 editor_actions.cc:1846
+#: editor.cc:3603 editor.cc:3627 editor_actions.cc:113 editor_actions.cc:1863
 msgid "Duplicate"
 msgstr "Duplicera"
 
-#: editor.cc:3532
+#: editor.cc:3604
 msgid "Number of duplications:"
 msgstr ""
 
-#: editor.cc:3706 route_group_dialog.cc:51 time_info_box.cc:67
+#: editor.cc:3774 route_group_dialog.cc:51 time_info_box.cc:61
 msgid "Selection"
 msgstr "Markering"
 
-#: editor.cc:3709
+#: editor.cc:3777
 msgid "Fit 1 track"
 msgstr ""
 
-#: editor.cc:3710
+#: editor.cc:3778
 msgid "Fit 2 tracks"
 msgstr ""
 
-#: editor.cc:3711
+#: editor.cc:3779
 msgid "Fit 4 tracks"
 msgstr ""
 
-#: editor.cc:3712
+#: editor.cc:3780
 msgid "Fit 8 tracks"
 msgstr ""
 
-#: editor.cc:3713
+#: editor.cc:3781
 msgid "Fit 16 tracks"
 msgstr ""
 
-#: editor.cc:3714
+#: editor.cc:3782
 msgid "Fit 24 tracks"
 msgstr ""
 
-#: editor.cc:3715
+#: editor.cc:3783
 msgid "Fit 32 tracks"
 msgstr ""
 
-#: editor.cc:3716
+#: editor.cc:3784
 msgid "Fit 48 tracks"
 msgstr ""
 
-#: editor.cc:3717
+#: editor.cc:3785
 msgid "Fit All tracks"
 msgstr ""
 
-#: editor.cc:3718
+#: editor.cc:3786
 msgid "Fit Selection"
 msgstr ""
 
-#: editor.cc:3720
+#: editor.cc:3788 editor_actions.cc:288
 msgid "Zoom to 10 ms"
 msgstr ""
 
-#: editor.cc:3721
+#: editor.cc:3789 editor_actions.cc:289
 msgid "Zoom to 100 ms"
 msgstr ""
 
-#: editor.cc:3722
+#: editor.cc:3790 editor_actions.cc:290
 msgid "Zoom to 1 sec"
 msgstr ""
 
-#: editor.cc:3723
+#: editor.cc:3791 editor_actions.cc:291
 msgid "Zoom to 10 sec"
 msgstr ""
 
-#: editor.cc:3724
+#: editor.cc:3792 editor_actions.cc:292
 msgid "Zoom to 1 min"
 msgstr ""
 
-#: editor.cc:3725
+#: editor.cc:3793 editor_actions.cc:294
 msgid "Zoom to 10 min"
 msgstr ""
 
-#: editor.cc:3726
+#: editor.cc:3794
 msgid "Zoom to 1 hour"
 msgstr ""
 
-#: editor.cc:3727
+#: editor.cc:3795
 msgid "Zoom to 8 hours"
 msgstr ""
 
-#: editor.cc:3728
+#: editor.cc:3796
 msgid "Zoom to 24 hours"
 msgstr ""
 
-#: editor.cc:3730
+#: editor.cc:3798
 msgid "Zoom to Range/Region Selection"
 msgstr ""
 
-#: editor.cc:3800
+#: editor.cc:3868
 msgid "*"
 msgstr ""
 
-#: editor.cc:4120
+#: editor.cc:4135
 msgid "Playlist Deletion"
 msgstr ""
 
-#: editor.cc:4121
+#: editor.cc:4136
 msgid ""
 "Playlist %1 is currently unused.\n"
 "If it is kept, its audio files will not be cleaned.\n"
 "If it is deleted, audio files used by it alone will be cleaned."
 msgstr ""
 
-#: editor.cc:4131
+#: editor.cc:4146
+msgid "Delete All Unused"
+msgstr ""
+
+#: editor.cc:4147
 msgid "Delete Playlist"
 msgstr ""
 
-#: editor.cc:4132
+#: editor.cc:4148
 msgid "Keep Playlist"
 msgstr ""
 
-#: editor.cc:4133 editor_audio_import.cc:594 editor_ops.cc:6174
-#: engine_dialog.cc:2083 sfdb_freesound_mootcher.cc:69 processor_box.cc:2219
-#: processor_box.cc:2244
+#: editor.cc:4149
+msgid "Keep Remaining"
+msgstr ""
+
+#: editor.cc:4150 editor_audio_import.cc:600 editor_ops.cc:6530
+#: engine_dialog.cc:2986 sfdb_freesound_mootcher.cc:69 processor_box.cc:3431
+#: processor_box.cc:3456
 msgid "Cancel"
 msgstr "Avbryt"
 
-#: editor.cc:4275
+#: editor.cc:4292
 msgid "new playlists"
 msgstr "nya spellistor"
 
-#: editor.cc:4291
+#: editor.cc:4308
 msgid "copy playlists"
 msgstr "kopiera spellistor"
 
-#: editor.cc:4306
+#: editor.cc:4323
 msgid "clear playlists"
 msgstr "rensa spellistor"
 
-#: editor.cc:5046
+#: editor.cc:5048
 msgid "Please wait while %1 loads visual data."
 msgstr ""
 
-#: editor.cc:5901 editor.cc:5932 editor_markers.cc:985 panner_ui.cc:410
-#: processor_box.cc:2482
+#: editor.cc:5811 editor_actions.cc:479
+msgid "Unset #%1"
+msgstr ""
+
+#: editor.cc:5812 editor_actions.cc:481
+msgid "no action bound"
+msgstr ""
+
+#: editor.cc:5961 editor.cc:5996 editor_markers.cc:998 editor_markers.cc:1018
+#: panner_ui.cc:412 processor_box.cc:3703
 msgid "Edit..."
 msgstr "Redigera..."
 
-#: editor.cc:5934 editor_actions.cc:1941
+#: editor.cc:6002 editor_actions.cc:1842
+msgid "Transpose..."
+msgstr ""
+
+#: editor.cc:6006 editor_actions.cc:1959
 msgid "Legatize"
 msgstr ""
 
-#: editor.cc:5936 editor_actions.cc:1940
+#: editor.cc:6012 editor_actions.cc:1958
 msgid "Quantize..."
 msgstr ""
 
-#: editor.cc:5938 editor_actions.cc:1943
+#: editor.cc:6015 editor_actions.cc:1961
 msgid "Remove Overlap"
 msgstr ""
 
-#: editor.cc:5940 editor_actions.cc:1942
+#: editor.cc:6021 editor_actions.cc:1960
 msgid "Transform..."
 msgstr ""
 
-#: editor_actions.cc:92
+#: editor_actions.cc:95
 msgid "Autoconnect"
 msgstr "Automatisk anslutning"
 
-#: editor_actions.cc:93
+#: editor_actions.cc:96
 msgid "Crossfades"
 msgstr "Övertoningar"
 
 # msgid "Delete"
 # msgstr "Radera"
-#: editor_actions.cc:95
+#: editor_actions.cc:98
 msgid "Move Selected Marker"
 msgstr "Flytta vald platsmarkör"
 
-#: editor_actions.cc:96
+#: editor_actions.cc:99
 msgid "Select Range Operations"
 msgstr ""
 
-#: editor_actions.cc:97
+#: editor_actions.cc:100
 msgid "Select Regions"
 msgstr ""
 
-#: editor_actions.cc:98
-msgid "Edit Point"
-msgstr "Redigeringspunkten"
-
-#: editor_actions.cc:99
+#: editor_actions.cc:102
 msgid "Fade"
 msgstr "Tona"
 
-#: editor_actions.cc:100
+#: editor_actions.cc:103
 msgid "Latch"
 msgstr ""
 
-#: editor_actions.cc:101 editor_regions.cc:112 region_editor.cc:46
+#: editor_actions.cc:104 editor_regions.cc:159 region_editor.cc:48
 msgid "Region"
 msgstr ""
 
-#: editor_actions.cc:102
+#: editor_actions.cc:105
 msgid "Layering"
 msgstr "Lager"
 
-#: editor_actions.cc:103 editor_regions.cc:113 stereo_panner_editor.cc:44
+#: editor_actions.cc:106 editor_regions.cc:160 stereo_panner_editor.cc:46
 msgid "Position"
 msgstr ""
 
-#: editor_actions.cc:105 gain_meter.cc:156 gain_meter.cc:825 panner_ui.cc:178
-#: panner_ui.cc:635
+#: editor_actions.cc:108 gain_meter.cc:161 gain_meter.cc:848 panner_ui.cc:178
+#: panner_ui.cc:637 route_time_axis.cc:541
 msgid "Trim"
 msgstr "Beskär"
 
-#: editor_actions.cc:106 editor_actions.cc:126 route_group_dialog.cc:46
+#: editor_actions.cc:109 editor_actions.cc:129 route_group_dialog.cc:46
 msgid "Gain"
 msgstr "Volym"
 
-#: editor_actions.cc:107 editor_actions.cc:563
+#: editor_actions.cc:110 editor_actions.cc:604
 msgid "Ranges"
 msgstr "Omfång"
 
-#: editor_actions.cc:108 editor_actions.cc:1842 session_option_editor.cc:135
+#: editor_actions.cc:111 editor_actions.cc:1859 session_option_editor.cc:135
 #: session_option_editor.cc:144 session_option_editor.cc:151
+#: session_option_editor.cc:158 session_option_editor.cc:165
 msgid "Fades"
 msgstr "Övertoningar"
 
-#: editor_actions.cc:111
+#: editor_actions.cc:114
 msgid "Link"
 msgstr ""
 
-#: editor_actions.cc:112 editor_actions.cc:145
-msgid "Zoom Focus"
-msgstr "Zoomfokus"
-
-#: editor_actions.cc:113
+#: editor_actions.cc:116
 msgid "Locate to Markers"
 msgstr ""
 
-#: editor_actions.cc:115
+#: editor_actions.cc:118
 msgid "Meter falloff"
 msgstr "Nivåmätarnedfall"
 
-#: editor_actions.cc:116
+#: editor_actions.cc:119
 msgid "Meter hold"
 msgstr "Nivåmätartopphållning"
 
-#: editor_actions.cc:117 session_option_editor.cc:321
+#: editor_actions.cc:120 session_option_editor.cc:342
 msgid "MIDI Options"
 msgstr ""
 
-#: editor_actions.cc:118
+#: editor_actions.cc:121
 msgid "Misc Options"
 msgstr "Diverse inställningar"
 
-#: editor_actions.cc:119 rc_option_editor.cc:1809 route_group_dialog.cc:54
-#: session_option_editor.cc:243 session_option_editor.cc:250
+#: editor_actions.cc:122 rc_option_editor.cc:2401 route_group_dialog.cc:54
+#: session_option_editor.cc:264 session_option_editor.cc:271
 msgid "Monitoring"
 msgstr "Medhörning"
 
-#: editor_actions.cc:120
+#: editor_actions.cc:123
 msgid "Active Mark"
 msgstr "Aktiv markör"
 
-#: editor_actions.cc:123
+#: editor_actions.cc:126
 msgid "Primary Clock"
 msgstr "Primär klocka"
 
-#: editor_actions.cc:124
+#: editor_actions.cc:127
 msgid "Pullup / Pulldown"
 msgstr "Uppåtdrag / Nedåtdrag"
 
-#: editor_actions.cc:125
+#: editor_actions.cc:128
 msgid "Region operations"
 msgstr "Regionsåtgärder"
 
-#: editor_actions.cc:127 ruler_dialog.cc:28
+#: editor_actions.cc:130 ruler_dialog.cc:28
 msgid "Rulers"
 msgstr "Tidslinjevisning"
 
-#: editor_actions.cc:128
+#: editor_actions.cc:131
 msgid "Views"
 msgstr "Visningslägen"
 
-#: editor_actions.cc:129
+#: editor_actions.cc:132
 msgid "Scroll"
 msgstr "Skrollning"
 
-#: editor_actions.cc:130
+#: editor_actions.cc:133
 msgid "Secondary Clock"
 msgstr "Sekundär klocka"
 
-#: editor_actions.cc:137
+#: editor_actions.cc:140
 msgid "Subframes"
 msgstr "Underrutor"
 
-#: editor_actions.cc:140
+#: editor_actions.cc:143
 msgid "Timecode fps"
 msgstr "Tidskod-FPS"
 
-#: editor_actions.cc:141 route_time_axis.cc:575
+#: editor_actions.cc:144 route_time_axis.cc:599
 msgid "Height"
 msgstr "Höjd"
 
-#: editor_actions.cc:143
+#: editor_actions.cc:146
 msgid "Tools"
 msgstr "Verktyg"
 
-#: editor_actions.cc:144
+#: editor_actions.cc:147
 msgid "View"
 msgstr "Visa"
 
-#: editor_actions.cc:146
+#: editor_actions.cc:149
 msgid "Zoom"
 msgstr ""
 
-#: editor_actions.cc:152
-msgid "Break drag or deselect all"
-msgstr "Avbryt dragmanöver eller välj ingenting"
+#: editor_actions.cc:150
+msgid "Scripted Actions"
+msgstr ""
 
 #: editor_actions.cc:159
+msgid "Session|Lock"
+msgstr ""
+
+#: editor_actions.cc:161
 msgid "Show Editor Mixer"
 msgstr "Visa redigeringsmixer"
 
-#: editor_actions.cc:160
+#: editor_actions.cc:162
 msgid "Show Editor List"
 msgstr "Visa redigeringspanel"
 
-#: editor_actions.cc:162
+#: editor_actions.cc:164
 msgid "Playhead to Next Region Boundary"
 msgstr "Startmarkören till nästa regiongränsen"
 
-#: editor_actions.cc:163
+#: editor_actions.cc:165
 msgid "Playhead to Next Region Boundary (No Track Selection)"
 msgstr "Startmarkören till nästa regiongräns (ingen spårmarkering)"
 
-#: editor_actions.cc:164
+#: editor_actions.cc:166
 msgid "Playhead to Previous Region Boundary"
 msgstr "Startmarkören till föregående regiongränsen"
 
-#: editor_actions.cc:165
+#: editor_actions.cc:167
 msgid "Playhead to Previous Region Boundary (No Track Selection)"
 msgstr "Startmarkören till tidigare regiongränsen (inget spårval)"
 
-#: editor_actions.cc:167
+#: editor_actions.cc:169
 msgid "Playhead to Next Region Start"
 msgstr "Startmarkören till nästa regionstart"
 
-#: editor_actions.cc:168
+#: editor_actions.cc:170
 msgid "Playhead to Next Region End"
 msgstr "Startmarkören till nästa regionslut"
 
-#: editor_actions.cc:169
+#: editor_actions.cc:171
 msgid "Playhead to Next Region Sync"
 msgstr "Startmarkören till nästa regionsynk.-punkten"
 
-#: editor_actions.cc:171
+#: editor_actions.cc:173
 msgid "Playhead to Previous Region Start"
 msgstr "Startmarkören till föregående regionstarten"
 
-#: editor_actions.cc:172
+#: editor_actions.cc:174
 msgid "Playhead to Previous Region End"
 msgstr "Startmarkören till föregående regionslutet"
 
-#: editor_actions.cc:173
+#: editor_actions.cc:175
 msgid "Playhead to Previous Region Sync"
 msgstr "Startmarkören till föregående regionsynk.-punkten"
 
-#: editor_actions.cc:175
+#: editor_actions.cc:177
 msgid "To Next Region Boundary"
 msgstr "Till nästa regiongränsen"
 
-#: editor_actions.cc:176
+#: editor_actions.cc:178
 msgid "To Next Region Boundary (No Track Selection)"
 msgstr "Till nästa regiongräns (inget spårval)"
 
-#: editor_actions.cc:177
+#: editor_actions.cc:179
 msgid "To Previous Region Boundary"
 msgstr "Till förra regiongränsen"
 
-#: editor_actions.cc:178
+#: editor_actions.cc:180
 msgid "To Previous Region Boundary (No Track Selection)"
 msgstr ""
 
-#: editor_actions.cc:180
+#: editor_actions.cc:182
 msgid "To Next Region Start"
 msgstr ""
 
-#: editor_actions.cc:181
+#: editor_actions.cc:183
 msgid "To Next Region End"
 msgstr ""
 
-#: editor_actions.cc:182
+#: editor_actions.cc:184
 msgid "To Next Region Sync"
 msgstr "Till nästa regionsynk."
 
-#: editor_actions.cc:184
+#: editor_actions.cc:186
 msgid "To Previous Region Start"
 msgstr "Till förra regionstart"
 
-#: editor_actions.cc:185
+#: editor_actions.cc:187
 msgid "To Previous Region End"
 msgstr ""
 
-#: editor_actions.cc:186
+#: editor_actions.cc:188
 msgid "To Previous Region Sync"
 msgstr ""
 
-#: editor_actions.cc:188
+#: editor_actions.cc:190
 msgid "To Range Start"
 msgstr ""
 
-#: editor_actions.cc:189
+#: editor_actions.cc:191
 msgid "To Range End"
 msgstr ""
 
-#: editor_actions.cc:191
+#: editor_actions.cc:193
 msgid "Playhead to Range Start"
 msgstr "Startmarkören till omfångstarten"
 
-#: editor_actions.cc:192
+#: editor_actions.cc:194
 msgid "Playhead to Range End"
 msgstr "Startmarkören till omfångslutet"
 
-#: editor_actions.cc:195
+#: editor_actions.cc:197
 msgid "Select All Tracks"
 msgstr ""
 
-#: editor_actions.cc:196 export_timespan_selector.cc:61 processor_box.cc:2468
+#: editor_actions.cc:198 export_timespan_selector.cc:59 processor_box.cc:3685
 msgid "Deselect All"
 msgstr "Avmarkera allt"
 
-#: editor_actions.cc:204
+#: editor_actions.cc:210
 msgid "Select All Overlapping Edit Range"
 msgstr "Välj allt som överlappar redigeringsomfånget"
 
-#: editor_actions.cc:205
+#: editor_actions.cc:211
 msgid "Select All Inside Edit Range"
 msgstr "Välj allt inom redigeringsomfånget"
 
-#: editor_actions.cc:207
+#: editor_actions.cc:213
 msgid "Select Edit Range"
 msgstr "Välj redigeringsomfång"
 
-#: editor_actions.cc:209
+#: editor_actions.cc:215
 msgid "Select All in Punch Range"
 msgstr "Markera allt i inslagsomfånget"
 
-#: editor_actions.cc:210
+#: editor_actions.cc:216
 msgid "Select All in Loop Range"
 msgstr "Markera allt i loop-omfånget"
 
-#: editor_actions.cc:212
+#: editor_actions.cc:218
 msgid "Select Next Track or Bus"
 msgstr "Välj nästa spår eller buss"
 
-#: editor_actions.cc:213
+#: editor_actions.cc:219
 msgid "Select Previous Track or Bus"
 msgstr "Välj föregående spår eller buss"
 
-#: editor_actions.cc:215
+#: editor_actions.cc:221
 msgid "Toggle Record Enable"
 msgstr "Växla tillåt inspelning"
 
-#: editor_actions.cc:217
+#: editor_actions.cc:223
 msgid "Toggle Solo"
 msgstr ""
 
-#: editor_actions.cc:219
+#: editor_actions.cc:225
 msgid "Toggle Mute"
 msgstr ""
 
-#: editor_actions.cc:221
+#: editor_actions.cc:227
 msgid "Toggle Solo Isolate"
 msgstr ""
 
-#: editor_actions.cc:226
+#: editor_actions.cc:232
 msgid "Save View %1"
 msgstr "Spara vy %1"
 
-#: editor_actions.cc:232
+#: editor_actions.cc:238
 msgid "Go to View %1"
 msgstr "GÃ¥ till vy %1"
 
-#: editor_actions.cc:238
+#: editor_actions.cc:244
 msgid "Locate to Mark %1"
 msgstr "Hoppa till markör %1"
 
-#: editor_actions.cc:242 editor_actions.cc:243
+#: editor_actions.cc:249 editor_actions.cc:250
 msgid "Jump to Next Mark"
 msgstr ""
 
-#: editor_actions.cc:244 editor_actions.cc:245
+#: editor_actions.cc:251 editor_actions.cc:252
 msgid "Jump to Previous Mark"
 msgstr ""
 
-#: editor_actions.cc:247 editor_actions.cc:248
+#: editor_actions.cc:254
+msgid "Set Session Start from Playhead"
+msgstr ""
+
+#: editor_actions.cc:255
+msgid "Set Session End from Playhead"
+msgstr ""
+
+#: editor_actions.cc:257 editor_actions.cc:258
 msgid "Add Mark from Playhead"
 msgstr "Lägg till markör utifrån startmarkören"
 
-#: editor_actions.cc:250 editor_actions.cc:251
+#: editor_actions.cc:260 editor_actions.cc:261
 msgid "Remove Mark at Playhead"
 msgstr ""
 
-#: editor_actions.cc:253
+#: editor_actions.cc:263
 msgid "Nudge Next Later"
 msgstr ""
 
-#: editor_actions.cc:254
+#: editor_actions.cc:264
 msgid "Nudge Next Earlier"
 msgstr ""
 
-#: editor_actions.cc:256
+#: editor_actions.cc:266
 msgid "Nudge Playhead Forward"
 msgstr "Knuffa startmarkören framåt"
 
-#: editor_actions.cc:257
+#: editor_actions.cc:267
 msgid "Nudge Playhead Backward"
 msgstr "Knuffa startmarkören bakåt"
 
-#: editor_actions.cc:258
-msgid "Playhead To Next Grid"
+#: editor_actions.cc:268
+msgid "Playhead to Next Grid"
 msgstr ""
 
-#: editor_actions.cc:259
-msgid "Playhead To Previous Grid"
+#: editor_actions.cc:269
+msgid "Playhead to Previous Grid"
 msgstr ""
 
-#: editor_actions.cc:264
+#: editor_actions.cc:274
 msgid "Zoom to Selection"
 msgstr ""
 
-#: editor_actions.cc:265
+#: editor_actions.cc:275
 msgid "Toggle Zoom State"
 msgstr "Växla zoomtillstånd"
 
-#: editor_actions.cc:267
+#: editor_actions.cc:277
 msgid "Expand Track Height"
 msgstr ""
 
-#: editor_actions.cc:268
+#: editor_actions.cc:278
 msgid "Shrink Track Height"
 msgstr ""
 
-#: editor_actions.cc:270
+#: editor_actions.cc:280
+msgid "Fit 1 Track"
+msgstr ""
+
+#: editor_actions.cc:281
+msgid "Fit 2 Tracks"
+msgstr ""
+
+#: editor_actions.cc:282
+msgid "Fit 4 Tracks"
+msgstr ""
+
+#: editor_actions.cc:283
+msgid "Fit 8 Tracks"
+msgstr ""
+
+#: editor_actions.cc:284
+msgid "Fit 16 Tracks"
+msgstr ""
+
+#: editor_actions.cc:285
+msgid "Fit 32 Tracks"
+msgstr ""
+
+#: editor_actions.cc:286
+msgid "Fit All Tracks"
+msgstr ""
+
+#: editor_actions.cc:293
+msgid "Zoom to 5 min"
+msgstr ""
+
+#: editor_actions.cc:296
 msgid "Move Selected Tracks Up"
 msgstr "Flytta valda spår uppåt"
 
-#: editor_actions.cc:272
+#: editor_actions.cc:298
 msgid "Move Selected Tracks Down"
 msgstr "Flytta valda spår neråt"
 
-#: editor_actions.cc:275
+#: editor_actions.cc:301
 msgid "Scroll Tracks Up"
 msgstr "Skrolla spår uppåt"
 
-#: editor_actions.cc:277
+#: editor_actions.cc:302
 msgid "Scroll Tracks Down"
 msgstr "Skrolla spår ner"
 
-#: editor_actions.cc:279
+#: editor_actions.cc:303
 msgid "Step Tracks Up"
 msgstr "Stega spår uppåt"
 
-#: editor_actions.cc:281
+#: editor_actions.cc:304
 msgid "Step Tracks Down"
 msgstr "Stega spår neråt"
 
-#: editor_actions.cc:284
+#: editor_actions.cc:306
 msgid "Scroll Backward"
 msgstr "Skrolla bakåt"
 
-#: editor_actions.cc:285
+#: editor_actions.cc:307
 msgid "Scroll Forward"
 msgstr "Skrolla framåt"
 
-#: editor_actions.cc:286
+#: editor_actions.cc:308
 msgid "Center Playhead"
 msgstr "Centrera startmarkören"
 
-#: editor_actions.cc:287
+#: editor_actions.cc:309
 msgid "Center Edit Point"
 msgstr "Redigeringspunktens mitt"
 
-#: editor_actions.cc:289
+#: editor_actions.cc:311
 msgid "Playhead Forward"
 msgstr "Startmarkören framåt"
 
-#: editor_actions.cc:290
+#: editor_actions.cc:312
 msgid "Playhead Backward"
 msgstr "Startmarkören bakåt"
 
-#: editor_actions.cc:292
+#: editor_actions.cc:314
 msgid "Playhead to Active Mark"
 msgstr "Startmarkören till aktiv markör"
 
-#: editor_actions.cc:293
+#: editor_actions.cc:315
 msgid "Active Mark to Playhead"
 msgstr "Aktiv markör till startmarkören"
 
-#: editor_actions.cc:295
+#: editor_actions.cc:317
 msgid "Use Skip Ranges"
 msgstr ""
 
-#: editor_actions.cc:302
+#: editor_actions.cc:324
 msgid "Play Selected Regions"
 msgstr ""
 
-#: editor_actions.cc:304
+#: editor_actions.cc:326
 msgid "Play from Edit Point and Return"
 msgstr ""
 
-#: editor_actions.cc:306
+#: editor_actions.cc:328
 msgid "Play Edit Range"
 msgstr "Spela redigeringsomfånget"
 
-#: editor_actions.cc:308
+#: editor_actions.cc:330
 msgid "Playhead to Mouse"
 msgstr "Startmarkören till mus"
 
-#: editor_actions.cc:309
+#: editor_actions.cc:331
 msgid "Active Marker to Mouse"
 msgstr "Aktiv markör till musen"
 
-#: editor_actions.cc:319
+#: editor_actions.cc:341
 msgid "Undo Selection Change"
 msgstr ""
 
-#: editor_actions.cc:320
+#: editor_actions.cc:342
 msgid "Redo Selection Change"
 msgstr ""
 
-#: editor_actions.cc:322
+#: editor_actions.cc:344
 msgid "Export Audio"
 msgstr ""
 
-#: editor_actions.cc:323 export_dialog.cc:396
+#: editor_actions.cc:345 export_dialog.cc:424
 msgid "Export Range"
 msgstr "Exportera omfång"
 
-#: editor_actions.cc:328
+#: editor_actions.cc:350
 msgid "Separate Using Punch Range"
 msgstr "Separera utifrån in-/utslagsomfånget"
 
-#: editor_actions.cc:331
+#: editor_actions.cc:353
 msgid "Separate Using Loop Range"
 msgstr "Separera utifrån loopomfånget"
 
-#: editor_actions.cc:334 editor_actions.cc:356
+#: editor_actions.cc:356 editor_actions.cc:379
 msgid "Crop"
 msgstr "Beskär"
 
-#: editor_actions.cc:344
+#: editor_actions.cc:366
 msgid "Fade Range Selection"
 msgstr ""
 
-#: editor_actions.cc:346
+#: editor_actions.cc:368
 msgid "Set Tempo from Edit Range = Bar"
 msgstr ""
 
-#: editor_actions.cc:348
+#: editor_actions.cc:371
 msgid "Log"
 msgstr "Logg"
 
-#: editor_actions.cc:351 editor_actions.cc:353
+#: editor_actions.cc:374 editor_actions.cc:376
 msgid "Move to Next Transient"
 msgstr ""
 
-#: editor_actions.cc:352 editor_actions.cc:354
+#: editor_actions.cc:375 editor_actions.cc:377
 msgid "Move to Previous Transient"
 msgstr ""
 
-#: editor_actions.cc:358 editor_actions.cc:361
+#: editor_actions.cc:381
+msgid "Start Range from Playhead"
+msgstr ""
+
+#: editor_actions.cc:382
+msgid "Finish Range from Playhead"
+msgstr ""
+
+#: editor_actions.cc:384 editor_actions.cc:393
 msgid "Start Range"
 msgstr "Börja omfång"
 
-#: editor_actions.cc:359 editor_actions.cc:362
+#: editor_actions.cc:385 editor_actions.cc:394
 msgid "Finish Range"
 msgstr "Avsluta omfång"
 
-#: editor_actions.cc:394
+#: editor_actions.cc:387
+msgid "Start Punch Range"
+msgstr ""
+
+#: editor_actions.cc:388
+msgid "Finish Punch Range"
+msgstr ""
+
+#: editor_actions.cc:390
+msgid "Start Loop Range"
+msgstr ""
+
+#: editor_actions.cc:391
+msgid "Finish Loop Range"
+msgstr ""
+
+#: editor_actions.cc:426
 msgid "Follow Playhead"
 msgstr "Följ startmarkören"
 
-#: editor_actions.cc:395
+#: editor_actions.cc:427
 msgid "Remove Last Capture"
 msgstr "Ta bort senaste inspelningen"
 
-#: editor_actions.cc:397
+#: editor_actions.cc:429
 msgid "Stationary Playhead"
 msgstr "Stationär startmarkör"
 
-#: editor_actions.cc:399 insert_time_dialog.cc:32
+#: editor_actions.cc:431 insert_remove_time_dialog.cc:32
 msgid "Insert Time"
 msgstr "Infoga tid"
 
-#: editor_actions.cc:402
+#: editor_actions.cc:433 insert_remove_time_dialog.cc:32
+msgid "Remove Time"
+msgstr ""
+
+#: editor_actions.cc:438
 msgid "Toggle Active"
 msgstr "Växla aktiv"
 
-#: editor_actions.cc:407 editor_actions.cc:1768 editor_markers.cc:921
-#: editor_markers.cc:986 editor_snapshots.cc:122 mixer_strip.cc:1543
-#: route_time_axis.cc:856
+#: editor_actions.cc:440 editor_actions.cc:1785 editor_markers.cc:926
+#: editor_markers.cc:999 editor_markers.cc:1019 editor_snapshots.cc:134
+#: lua_script_manager.cc:32 lua_script_manager.cc:36 mixer_strip.cc:1705
+#: route_time_axis.cc:870 vca_master_strip.cc:400
 msgid "Remove"
 msgstr "Ta bort"
 
-#: editor_actions.cc:411
+#: editor_actions.cc:445
 msgid "Fit Selection (Vertical)"
 msgstr ""
 
-#: editor_actions.cc:413 time_axis_view.cc:1371
+#: editor_actions.cc:447 time_axis_view.cc:1287
 msgid "Largest"
 msgstr "Störst"
 
-#: editor_actions.cc:416 time_axis_view.cc:1372
+#: editor_actions.cc:450 time_axis_view.cc:1288
 msgid "Larger"
 msgstr "Stor"
 
-#: editor_actions.cc:419 editor_rulers.cc:249 time_axis_view.cc:1373
+#: editor_actions.cc:453 editor_rulers.cc:248 time_axis_view.cc:1289
 msgid "Large"
 msgstr "Större"
 
-#: editor_actions.cc:425 editor_rulers.cc:253 time_axis_view.cc:1375
+#: editor_actions.cc:459 editor_rulers.cc:252 time_axis_view.cc:1291
 msgid "Small"
 msgstr "Liten"
 
-#: editor_actions.cc:429
+#: editor_actions.cc:463
 msgid "Sound Selected MIDI Notes"
 msgstr ""
 
-#: editor_actions.cc:434
+#: editor_actions.cc:468
 msgid "Zoom Focus Left"
 msgstr "Zoomfokus: vänster"
 
-#: editor_actions.cc:435
+#: editor_actions.cc:469
 msgid "Zoom Focus Right"
 msgstr "Zoomfokus: höger"
 
-#: editor_actions.cc:436
+#: editor_actions.cc:470
 msgid "Zoom Focus Center"
 msgstr "Zoomfokus: center"
 
-#: editor_actions.cc:437
+#: editor_actions.cc:471
 msgid "Zoom Focus Playhead"
 msgstr "Zoomfokus: startmarkören"
 
-#: editor_actions.cc:438
+#: editor_actions.cc:472
 msgid "Zoom Focus Mouse"
 msgstr "Zoomfokus: mus"
 
-#: editor_actions.cc:439
+#: editor_actions.cc:473
 msgid "Zoom Focus Edit Point"
 msgstr "Zoomfokus: redigeringspunkten"
 
-#: editor_actions.cc:441
+#: editor_actions.cc:475
 msgid "Next Zoom Focus"
 msgstr ""
 
-#: editor_actions.cc:447
+#: editor_actions.cc:488
 msgid "Smart Object Mode"
 msgstr ""
 
-#: editor_actions.cc:450
+#: editor_actions.cc:491
 msgid "Smart"
 msgstr ""
 
-#: editor_actions.cc:453
+#: editor_actions.cc:494
 msgid "Object Tool"
 msgstr "Objektverktyg"
 
-#: editor_actions.cc:458
+#: editor_actions.cc:499
 msgid "Range Tool"
 msgstr "Omfångsverktyg"
 
-#: editor_actions.cc:463
+#: editor_actions.cc:504
 msgid "Note Drawing Tool"
 msgstr ""
 
-#: editor_actions.cc:468
+#: editor_actions.cc:509
 msgid "Audition Tool"
 msgstr ""
 
-#: editor_actions.cc:473
+#: editor_actions.cc:514
 msgid "Time FX Tool"
 msgstr "TidsFX-verktyg"
 
-#: editor_actions.cc:478
+#: editor_actions.cc:519
 msgid "Content Tool"
 msgstr ""
 
-#: editor_actions.cc:484
+#: editor_actions.cc:525
 msgid "Cut Tool"
 msgstr ""
 
-#: editor_actions.cc:490
+#: editor_actions.cc:531
 msgid "Step Mouse Mode"
 msgstr "Stega musläge"
 
-#: editor_actions.cc:497
+#: editor_actions.cc:538
 msgid "Change Edit Point"
 msgstr "Ändra redigeringspunkt"
 
-#: editor_actions.cc:498
+#: editor_actions.cc:539
 msgid "Change Edit Point Including Marker"
 msgstr "Ändra redigeringspunkt samt markör"
 
-#: editor_actions.cc:504
+#: editor_actions.cc:544
+msgid "EditMode|Lock"
+msgstr ""
+
+#: editor_actions.cc:545
 msgid "Cycle Edit Mode"
 msgstr ""
 
-#: editor_actions.cc:506
+#: editor_actions.cc:547
 msgid "Snap to"
 msgstr "Fäst mot"
 
-#: editor_actions.cc:507
+#: editor_actions.cc:548
 msgid "Snap Mode"
 msgstr "Fästläge"
 
-#: editor_actions.cc:514
+#: editor_actions.cc:555
 msgid "Next Snap Mode"
 msgstr "Nästa fästläge"
 
-#: editor_actions.cc:515
+#: editor_actions.cc:556
 msgid "Next Snap Choice"
 msgstr "Nästa fästlägealternativ"
 
-#: editor_actions.cc:516
+#: editor_actions.cc:557
 msgid "Next Musical Snap Choice"
 msgstr ""
 
-#: editor_actions.cc:517
+#: editor_actions.cc:558
 msgid "Previous Snap Choice"
 msgstr ""
 
-#: editor_actions.cc:518
+#: editor_actions.cc:559
 msgid "Previous Musical Snap Choice"
 msgstr ""
 
-#: editor_actions.cc:523
+#: editor_actions.cc:564
 msgid "Snap to CD Frame"
 msgstr "CD-rutor"
 
-#: editor_actions.cc:524
+#: editor_actions.cc:565
 msgid "Snap to Timecode Frame"
 msgstr "Tidskod"
 
-#: editor_actions.cc:525
+#: editor_actions.cc:566
 msgid "Snap to Timecode Seconds"
 msgstr "Tidskod: sekunder"
 
-#: editor_actions.cc:526
+#: editor_actions.cc:567
 msgid "Snap to Timecode Minutes"
 msgstr "Tidskod: minuter"
 
-#: editor_actions.cc:527
+#: editor_actions.cc:568
 msgid "Snap to Seconds"
 msgstr "Sekunder"
 
-#: editor_actions.cc:528
+#: editor_actions.cc:569
 msgid "Snap to Minutes"
 msgstr "Minuter"
 
-#: editor_actions.cc:530
+#: editor_actions.cc:571
 msgid "Snap to One Twenty Eighths"
 msgstr ""
 
-#: editor_actions.cc:531
+#: editor_actions.cc:572
 msgid "Snap to Sixty Fourths"
 msgstr ""
 
-#: editor_actions.cc:532
+#: editor_actions.cc:573
 msgid "Snap to Thirty Seconds"
 msgstr "Trettio sekunder"
 
-#: editor_actions.cc:533
+#: editor_actions.cc:574
 msgid "Snap to Twenty Eighths"
 msgstr ""
 
-#: editor_actions.cc:534
+#: editor_actions.cc:575
 msgid "Snap to Twenty Fourths"
 msgstr ""
 
-#: editor_actions.cc:535
+#: editor_actions.cc:576
 msgid "Snap to Twentieths"
 msgstr ""
 
-#: editor_actions.cc:536
+#: editor_actions.cc:577
 msgid "Snap to Sixteenths"
 msgstr "Sextondelar"
 
-#: editor_actions.cc:537
+#: editor_actions.cc:578
 msgid "Snap to Fourteenths"
 msgstr "Fjortondelar"
 
-#: editor_actions.cc:538
+#: editor_actions.cc:579
 msgid "Snap to Twelfths"
 msgstr ""
 
-#: editor_actions.cc:539
+#: editor_actions.cc:580
 msgid "Snap to Tenths"
 msgstr "Tiondelar"
 
-#: editor_actions.cc:540
+#: editor_actions.cc:581
 msgid "Snap to Eighths"
 msgstr "Ã…ttondelar"
 
-#: editor_actions.cc:541
+#: editor_actions.cc:582
 msgid "Snap to Sevenths"
 msgstr "Sjundedelar"
 
-#: editor_actions.cc:542
+#: editor_actions.cc:583
 msgid "Snap to Sixths"
 msgstr "Sjättedelar"
 
-#: editor_actions.cc:543
+#: editor_actions.cc:584
 msgid "Snap to Fifths"
 msgstr "Femtedelar"
 
-#: editor_actions.cc:544
+#: editor_actions.cc:585
 msgid "Snap to Quarters"
 msgstr "Fjärdedelar"
 
-#: editor_actions.cc:545
+#: editor_actions.cc:586
 msgid "Snap to Thirds"
 msgstr "Tredjedelar"
 
-#: editor_actions.cc:546
+#: editor_actions.cc:587
 msgid "Snap to Halves"
 msgstr "Halvsteg"
 
-#: editor_actions.cc:548
+#: editor_actions.cc:589
 msgid "Snap to Beat"
 msgstr "Slag"
 
-#: editor_actions.cc:549
+#: editor_actions.cc:590
 msgid "Snap to Bar"
 msgstr "Takt"
 
-#: editor_actions.cc:550
+#: editor_actions.cc:591
 msgid "Snap to Mark"
 msgstr "Markör"
 
-#: editor_actions.cc:551
+#: editor_actions.cc:592
 msgid "Snap to Region Start"
 msgstr "Regionstart"
 
-#: editor_actions.cc:552
+#: editor_actions.cc:593
 msgid "Snap to Region End"
 msgstr "Regionslut"
 
-#: editor_actions.cc:553
+#: editor_actions.cc:594
 msgid "Snap to Region Sync"
 msgstr "Regionsynk."
 
-#: editor_actions.cc:554
+#: editor_actions.cc:595
 msgid "Snap to Region Boundary"
 msgstr "Regiongräns"
 
-#: editor_actions.cc:556
+#: editor_actions.cc:597
 msgid "Show Marker Lines"
 msgstr "Visa vertikala markörlinjer"
 
-#: editor_actions.cc:566
+#: editor_actions.cc:607
 msgid "Loop/Punch"
 msgstr "Loop-/inslagsmarkörer"
 
-#: editor_actions.cc:570
+#: editor_actions.cc:611
 msgid "Min:Sec"
 msgstr "Min:sek"
 
-#: editor_actions.cc:572 editor_actions.cc:575 editor_rulers.cc:271
+#: editor_actions.cc:613 editor_actions.cc:616 editor_rulers.cc:270
+#: rc_option_editor.cc:1592
 msgid "Video Monitor"
 msgstr ""
 
-#: editor_actions.cc:574 rc_option_editor.cc:2260
+#: editor_actions.cc:615 rc_option_editor.cc:2844
 msgid "Video"
 msgstr ""
 
-#: editor_actions.cc:577
+#: editor_actions.cc:618
 msgid "Always on Top"
 msgstr ""
 
-#: editor_actions.cc:579
+#: editor_actions.cc:620
 msgid "Frame number"
 msgstr ""
 
-#: editor_actions.cc:580
+#: editor_actions.cc:621
 msgid "Timecode Background"
 msgstr ""
 
-#: editor_actions.cc:581
+#: editor_actions.cc:622
 msgid "Fullscreen"
 msgstr ""
 
-#: editor_actions.cc:582
+#: editor_actions.cc:623
 msgid "Letterbox"
 msgstr ""
 
-#: editor_actions.cc:583
+#: editor_actions.cc:624
 msgid "Original Size"
 msgstr ""
 
-#: editor_actions.cc:640
+#: editor_actions.cc:681
 msgid "Sort"
 msgstr "Sortera"
 
-#: editor_actions.cc:651 editor_routes.cc:476 mixer_ui.cc:1196
+#: editor_actions.cc:692 editor_routes.cc:549 mixer_ui.cc:1497
 msgid "Show All"
 msgstr "Visa Alla"
 
-#: editor_actions.cc:652
+#: editor_actions.cc:693
 msgid "Show Automatic Regions"
 msgstr "Visa automatiska regioner"
 
-#: editor_actions.cc:654
+#: editor_actions.cc:695
 msgid "Ascending"
 msgstr "Stigande"
 
-#: editor_actions.cc:656
+#: editor_actions.cc:697
 msgid "Descending"
 msgstr "Fallande"
 
-#: editor_actions.cc:659
+#: editor_actions.cc:700
 msgid "By Region Name"
 msgstr "utifrån Regionens namn"
 
-#: editor_actions.cc:661
+#: editor_actions.cc:702
 msgid "By Region Length"
 msgstr "utifrån Regionens längd"
 
-#: editor_actions.cc:663
+#: editor_actions.cc:704
 msgid "By Region Position"
 msgstr "utifrån Regionens position"
 
-#: editor_actions.cc:665
+#: editor_actions.cc:706
 msgid "By Region Timestamp"
 msgstr "utifrån Regionens tidstämpel"
 
-#: editor_actions.cc:667
+#: editor_actions.cc:708
 msgid "By Region Start in File"
 msgstr "utifrån Regionens start i filen"
 
-#: editor_actions.cc:669
+#: editor_actions.cc:710
 msgid "By Region End in File"
 msgstr "utifrån Regionens slut i filen"
 
-#: editor_actions.cc:671
+#: editor_actions.cc:712
 msgid "By Source File Name"
 msgstr "utifrån Källfilens namn"
 
-#: editor_actions.cc:673
+#: editor_actions.cc:714
 msgid "By Source File Length"
 msgstr "utifrån Källfilens längd"
 
-#: editor_actions.cc:675
+#: editor_actions.cc:716
 msgid "By Source File Creation Date"
 msgstr "utifrån Källfilens skapelsedatum"
 
-#: editor_actions.cc:677
+#: editor_actions.cc:718
 msgid "By Source Filesystem"
 msgstr "utifrån Källfilsystemet"
 
-#: editor_actions.cc:680
+#: editor_actions.cc:721
 msgid "Remove Unused"
 msgstr ""
 
-#: editor_actions.cc:684 editor_audio_import.cc:282
-#: session_import_dialog.cc:75 session_import_dialog.cc:95
-#: session_metadata_dialog.cc:418 editor_videotimeline.cc:91
+#: editor_actions.cc:723
+msgid "Import PT session"
+msgstr ""
+
+#: editor_actions.cc:728 editor_audio_import.cc:282 editor_pt_import.cc:149
+#: luawindow.cc:99 session_import_dialog.cc:75 session_import_dialog.cc:95
+#: session_metadata_dialog.cc:421 sfdb_ui.cc:558 editor_videotimeline.cc:91
 msgid "Import"
 msgstr "Importera"
 
-#: editor_actions.cc:687
+#: editor_actions.cc:731
 msgid "Import to Region List..."
 msgstr "Importera till regionslistan..."
 
-#: editor_actions.cc:690 session_import_dialog.cc:44
-msgid "Import From Session"
-msgstr "Importera från session"
+#: editor_actions.cc:734 session_import_dialog.cc:44
+#: session_import_dialog.cc:65
+msgid "Import from Session"
+msgstr ""
 
-#: editor_actions.cc:694
+#: editor_actions.cc:738
 msgid "Bring all media into session folder"
 msgstr ""
 
-#: editor_actions.cc:697
+#: editor_actions.cc:741
 msgid "Show Summary"
 msgstr "Visa sammanfattande vy"
 
-#: editor_actions.cc:699
+#: editor_actions.cc:743
 msgid "Show Group Tabs"
 msgstr "Visa grupptabbar"
 
-#: editor_actions.cc:701
+#: editor_actions.cc:745
 msgid "Show Measure Lines"
 msgstr ""
 
-#: editor_actions.cc:705
-msgid "Show Logo"
-msgstr ""
-
-#: editor_actions.cc:709
+#: editor_actions.cc:747
 msgid "Toggle MIDI Input Active for Editor-Selected Tracks/Busses"
 msgstr ""
 
-#: editor_actions.cc:732
-msgid "Loaded editor bindings from %1"
+#: editor_actions.cc:1081 editor_actions.cc:1477 editor_actions.cc:1488
+#: editor_actions.cc:1541 editor_actions.cc:1552 editor_actions.cc:1599
+#: editor_actions.cc:1609 editor_regions.cc:1657 luainstance.cc:327
+#: luainstance.cc:1690
+msgid "programming error: %1: %2"
 msgstr ""
 
-#: editor_actions.cc:734
-msgid "Could not find editor.bindings in search path %1"
-msgstr ""
-
-#: editor_actions.cc:1078 editor_actions.cc:1474 editor_actions.cc:1485
-#: editor_actions.cc:1538 editor_actions.cc:1549 editor_actions.cc:1596
-#: editor_actions.cc:1606 editor_regions.cc:1563
-msgid "programming error: %1: %2"
-msgstr ""
-
-#: editor_actions.cc:1774
+#: editor_actions.cc:1791
 msgid "Raise"
 msgstr "Högre"
 
-#: editor_actions.cc:1777
+#: editor_actions.cc:1794
 msgid "Raise to Top"
 msgstr "Placera överst"
 
-#: editor_actions.cc:1780
+#: editor_actions.cc:1797
 msgid "Lower"
 msgstr "Lägre"
 
-#: editor_actions.cc:1783
+#: editor_actions.cc:1800
 msgid "Lower to Bottom"
 msgstr "Placera underst"
 
-#: editor_actions.cc:1786
+#: editor_actions.cc:1803
 msgid "Move to Original Position"
 msgstr "Flytta till ursprunglig position"
 
-#: editor_actions.cc:1791
+#: editor_actions.cc:1808
 msgid "Lock to Video"
 msgstr ""
 
-#: editor_actions.cc:1796 editor_markers.cc:912
+#: editor_actions.cc:1813 editor_markers.cc:917
 msgid "Glue to Bars and Beats"
 msgstr "Klistra mot takt & slag"
 
-#: editor_actions.cc:1801
+#: editor_actions.cc:1818
 msgid "Remove Sync"
 msgstr "Ta bort synk."
 
-#: editor_actions.cc:1804 mixer_strip.cc:2006 monitor_section.cc:272
-#: route_time_axis.cc:253 route_time_axis.cc:526
+#: editor_actions.cc:1821 mixer_strip.cc:2192 monitor_section.cc:253
+#: monitor_section.cc:321 route_time_axis.cc:264 route_time_axis.cc:550
 msgid "Mute"
 msgstr "Tysta"
 
-#: editor_actions.cc:1807
+#: editor_actions.cc:1824
 msgid "Normalize..."
 msgstr "Normalisera..."
 
-#: editor_actions.cc:1810
+#: editor_actions.cc:1827
 msgid "Reverse"
 msgstr "Motsatt riktning"
 
-#: editor_actions.cc:1813
+#: editor_actions.cc:1830
 msgid "Make Mono Regions"
 msgstr "Skapa monoregioner"
 
-#: editor_actions.cc:1816
+#: editor_actions.cc:1833
 msgid "Boost Gain"
 msgstr "Öka volym"
 
-#: editor_actions.cc:1819
+#: editor_actions.cc:1836
 msgid "Cut Gain"
 msgstr "Sänk volym"
 
-#: editor_actions.cc:1822
+#: editor_actions.cc:1839
 msgid "Pitch Shift..."
 msgstr ""
 
-#: editor_actions.cc:1825
-msgid "Transpose..."
-msgstr ""
-
-#: editor_actions.cc:1828
+#: editor_actions.cc:1845
 msgid "Opaque"
 msgstr "Ogenomskinlig"
 
-#: editor_actions.cc:1832 editor_regions.cc:117
+#: editor_actions.cc:1849 editor_regions.cc:164
 msgid "Fade In"
 msgstr "Tona In"
 
-#: editor_actions.cc:1837 editor_regions.cc:118
+#: editor_actions.cc:1854 editor_regions.cc:165
 msgid "Fade Out"
 msgstr "Tona Ut"
 
-#: editor_actions.cc:1852
+#: editor_actions.cc:1869
 msgid "Multi-Duplicate..."
 msgstr "Multiduplicera..."
 
-#: editor_actions.cc:1857
+#: editor_actions.cc:1874
 msgid "Fill Track"
 msgstr "Fyll spåret"
 
-#: editor_actions.cc:1861 editor_markers.cc:1000
+#: editor_actions.cc:1878 editor_markers.cc:1033
 msgid "Set Loop Range"
 msgstr "Sätt loop-omfång här"
 
-#: editor_actions.cc:1868
+#: editor_actions.cc:1885
 msgid "Set Punch"
 msgstr "Ställ in inslag"
 
-#: editor_actions.cc:1872
+#: editor_actions.cc:1889
 msgid "Add Single Range Marker"
 msgstr ""
 
-#: editor_actions.cc:1877
+#: editor_actions.cc:1894
 msgid "Add Range Marker Per Region"
 msgstr ""
 
-#: editor_actions.cc:1881
-msgid "Snap Position To Grid"
+#: editor_actions.cc:1898
+msgid "Snap Position to Grid"
 msgstr ""
 
-#: editor_actions.cc:1884
+#: editor_actions.cc:1901
 msgid "Close Gaps"
 msgstr "Stäng luckor"
 
-#: editor_actions.cc:1887
+#: editor_actions.cc:1904
 msgid "Rhythm Ferret..."
 msgstr ""
 
-#: editor_actions.cc:1890
+#: editor_actions.cc:1907
 msgid "Export..."
 msgstr "Exportera..."
 
-#: editor_actions.cc:1896
+#: editor_actions.cc:1913
 msgid "Separate Under"
 msgstr "Separera under"
 
-#: editor_actions.cc:1900 editor_actions.cc:1901
+#: editor_actions.cc:1917 editor_actions.cc:1918
 msgid "Set Fade In Length"
 msgstr "Välj intoningslängd"
 
-#: editor_actions.cc:1902 editor_actions.cc:1903
+#: editor_actions.cc:1919 editor_actions.cc:1920
 msgid "Set Fade Out Length"
 msgstr "Välj uttoningslängd"
 
-#: editor_actions.cc:1905
+#: editor_actions.cc:1922
 msgid "Set Tempo from Region = Bar"
 msgstr "Sätt tempo från region = takt"
 
-#: editor_actions.cc:1910
+#: editor_actions.cc:1927
 msgid "Split at Percussion Onsets"
 msgstr "Dela vid perkussiva anslag"
 
-#: editor_actions.cc:1915
+#: editor_actions.cc:1932
 msgid "List Editor..."
 msgstr "Listredigerare..."
 
-#: editor_actions.cc:1918
+#: editor_actions.cc:1935
 msgid "Properties..."
 msgstr "Egenskaper..."
 
-#: editor_actions.cc:1922
+#: editor_actions.cc:1939
 msgid "Bounce (with processing)"
 msgstr ""
 
-#: editor_actions.cc:1923
+#: editor_actions.cc:1940
 msgid "Bounce (without processing)"
 msgstr ""
 
-#: editor_actions.cc:1924
+#: editor_actions.cc:1941
 msgid "Combine"
 msgstr "Kombinera"
 
-#: editor_actions.cc:1925
+#: editor_actions.cc:1942
 msgid "Uncombine"
 msgstr "Okombinera"
 
-#: editor_actions.cc:1927
+#: editor_actions.cc:1944
+msgid "Loudness Analysis..."
+msgstr ""
+
+#: editor_actions.cc:1945
 msgid "Spectral Analysis..."
 msgstr "Spektralanalys..."
 
-#: editor_actions.cc:1929
+#: editor_actions.cc:1947
 msgid "Reset Envelope"
 msgstr "Nollställ konvolut"
 
-#: editor_actions.cc:1931
+#: editor_actions.cc:1949
 msgid "Reset Gain"
 msgstr ""
 
-#: editor_actions.cc:1936
+#: editor_actions.cc:1954
 msgid "Envelope Active"
 msgstr "Konvolut aktivt"
 
-#: editor_actions.cc:1944 editor_actions.cc:1945
+#: editor_actions.cc:1962 editor_actions.cc:1963
 msgid "Insert Patch Change..."
 msgstr "Infoga patchändring..."
 
-#: editor_actions.cc:1946
+#: editor_actions.cc:1964
 msgid "Unlink from other copies"
 msgstr ""
 
-#: editor_actions.cc:1947
+#: editor_actions.cc:1965
 msgid "Strip Silence..."
 msgstr "Klipp ut tystnad..."
 
-#: editor_actions.cc:1948
+#: editor_actions.cc:1966
 msgid "Set Range Selection"
 msgstr "Definiera omfångsmarkering"
 
-#: editor_actions.cc:1950 editor_actions.cc:1951
+#: editor_actions.cc:1968 editor_actions.cc:1969
 msgid "Nudge Later"
 msgstr ""
 
-#: editor_actions.cc:1952 editor_actions.cc:1953
+#: editor_actions.cc:1970 editor_actions.cc:1971
 msgid "Nudge Earlier"
 msgstr ""
 
-#: editor_actions.cc:1955
+#: editor_actions.cc:1973
 msgid "Sequence Regions"
 msgstr ""
 
-#: editor_actions.cc:1960
+#: editor_actions.cc:1978
 msgid "Nudge Later by Capture Offset"
 msgstr ""
 
-#: editor_actions.cc:1967
+#: editor_actions.cc:1985
 msgid "Nudge Earlier by Capture Offset"
 msgstr ""
 
-#: editor_actions.cc:1971
+#: editor_actions.cc:1989
 msgid "Trim to Loop"
 msgstr "Beskär till loop"
 
-#: editor_actions.cc:1972
+#: editor_actions.cc:1990
 msgid "Trim to Punch"
 msgstr "Beskär till inslag"
 
-#: editor_actions.cc:1974
+#: editor_actions.cc:1992
 msgid "Trim to Previous"
 msgstr "Beskär till föregående"
 
-#: editor_actions.cc:1975
+#: editor_actions.cc:1993
 msgid "Trim to Next"
 msgstr "Beskär till nästa"
 
-#: editor_actions.cc:1982
-msgid "Insert Region From Region List"
-msgstr "Infoga region från regionlistan"
+#: editor_actions.cc:2000
+msgid "Insert Region from Region List"
+msgstr ""
 
-#: editor_actions.cc:1988
+#: editor_actions.cc:2006
 msgid "Set Sync Position"
 msgstr "Ställ in synk.-position"
 
-#: editor_actions.cc:1989
+#: editor_actions.cc:2007
 msgid "Place Transient"
 msgstr "Placera transient"
 
-#: editor_actions.cc:1990
+#: editor_actions.cc:2008
 msgid "Split/Separate"
 msgstr ""
 
-#: editor_actions.cc:1991
+#: editor_actions.cc:2009
 msgid "Trim Start at Edit Point"
 msgstr "Beskär början vid redigeringspunkten"
 
-#: editor_actions.cc:1992
+#: editor_actions.cc:2010
 msgid "Trim End at Edit Point"
 msgstr "Beskär slutet vid redigeringspunkten"
 
-#: editor_actions.cc:1997
+#: editor_actions.cc:2015
 msgid "Align Start"
 msgstr "Justera början"
 
-#: editor_actions.cc:2004
+#: editor_actions.cc:2022
 msgid "Align Start Relative"
 msgstr "Juster början relativt"
 
-#: editor_actions.cc:2008
+#: editor_actions.cc:2026
 msgid "Align End"
 msgstr "Justera slutet"
 
-#: editor_actions.cc:2013
+#: editor_actions.cc:2031
 msgid "Align End Relative"
 msgstr "Justa slutet relativt"
 
-#: editor_actions.cc:2020
+#: editor_actions.cc:2038
 msgid "Align Sync"
 msgstr "Justera synk."
 
-#: editor_actions.cc:2027
+#: editor_actions.cc:2045
 msgid "Align Sync Relative"
 msgstr "Justera synk. relativt"
 
-#: editor_actions.cc:2031 editor_actions.cc:2034
+#: editor_actions.cc:2049 editor_actions.cc:2050
 msgid "Choose Top..."
 msgstr ""
 
@@ -4454,32 +5010,33 @@ msgid ""
 "%2 as a new source, or skip it?"
 msgstr ""
 
-#: editor_audio_import.cc:282 editor_videotimeline.cc:91
+#: editor_audio_import.cc:282 editor_pt_import.cc:149
+#: editor_videotimeline.cc:91
 msgid "Cancel Import"
 msgstr "Avbryt importering"
 
-#: editor_audio_import.cc:559
+#: editor_audio_import.cc:565
 msgid "Editor: cannot open file \"%1\", (%2)"
 msgstr "Redigerare: kan inte öppna filen \"%1\" (%2)"
 
-#: editor_audio_import.cc:567
+#: editor_audio_import.cc:573
 msgid "Cancel entire import"
 msgstr "Avbryt hela importen"
 
-#: editor_audio_import.cc:568
+#: editor_audio_import.cc:574
 msgid "Don't embed it"
 msgstr "Infoga inte"
 
-#: editor_audio_import.cc:569
+#: editor_audio_import.cc:575
 msgid "Embed all without questions"
 msgstr "Infoga alla"
 
-#: editor_audio_import.cc:572 editor_audio_import.cc:598
-#: export_format_dialog.cc:60
+#: editor_audio_import.cc:578 editor_audio_import.cc:604
+#: export_format_dialog.cc:68
 msgid "Sample rate"
 msgstr ""
 
-#: editor_audio_import.cc:573 editor_audio_import.cc:599
+#: editor_audio_import.cc:579 editor_audio_import.cc:605
 msgid ""
 "%1\n"
 "This audiofile's sample rate doesn't match the session sample rate!"
@@ -4487,207 +5044,276 @@ msgstr ""
 "%1\n"
 "Denna ljudfils samplingsfrekvens matchar inte sessionens!"
 
-#: editor_audio_import.cc:595
+#: editor_audio_import.cc:601
 msgid "Embed it anyway"
 msgstr "Infoga ändå"
 
-#: editor_canvas_events.cc:1306 editor_drag.cc:1381
+#: editor_pt_import.cc:81
+msgid "You can't import a PT session until you have a session loaded."
+msgstr ""
+
+#: editor_pt_import.cc:86
+msgid "Import PT Session"
+msgstr ""
+
+#: editor_pt_import.cc:97
+msgid "%1: this is only the directory/folder name, not the filename.\n"
+msgstr ""
+
+#: editor_pt_import.cc:132
+msgid "Doesn't seem to be a valid PT session file"
+msgstr ""
+
+#: editor_pt_import.cc:136
+msgid ""
+"PT v%1 Session @ %2Hz\n"
+"\n"
+"%3 audio files\n"
+"%4 regions\n"
+"%5 active regions\n"
+"\n"
+"Continue..."
+msgstr ""
+
+#: editor_pt_import.cc:175
+msgid ""
+"Failed to load one or more of the audio files, but continuing to attempt "
+"import."
+msgstr ""
+
+#: editor_pt_import.cc:178
+msgid "Success! Import should complete soon."
+msgstr ""
+
+#: editor_pt_import.cc:263
+msgid "PTImport: UINT_MAX routes? impossible!"
+msgstr ""
+
+#: editor_canvas_events.cc:1296 editor_drag.cc:1418
 msgid "Could not create new track after region placed in the drop zone"
 msgstr ""
 
-#: editor_drag.cc:1266
+#: editor_drag.cc:1306
 msgid "fixed time region drag"
 msgstr ""
 
-#: editor_drag.cc:2214
+#: editor_drag.cc:2249
 msgid "Ripple drag"
 msgstr ""
 
-#: editor_drag.cc:2365 midi_region_view.cc:2813
+#: editor_drag.cc:2311
+msgid "create region"
+msgstr ""
+
+#: editor_drag.cc:2430 midi_region_view.cc:2859
 msgid "resize notes"
 msgstr ""
 
-#: editor_drag.cc:2517
+#: editor_drag.cc:2613 editor_drag.cc:2648
+msgid ""
+"One or more Audio Regions\n"
+"are both Locked and\n"
+"Locked to Video.\n"
+"The video cannot me moved."
+msgstr ""
+
+#: editor_drag.cc:2683
 msgid "Video Start:"
 msgstr ""
 
-#: editor_drag.cc:2519
+#: editor_drag.cc:2685
 msgid "Diff:"
 msgstr ""
 
-#: editor_drag.cc:2538
+#: editor_drag.cc:2707
 msgid "Move Video"
 msgstr ""
 
-#: editor_drag.cc:3046
+#: editor_drag.cc:3177
+msgid "move meter mark"
+msgstr "flytta taktartsmarkör"
+
+#: editor_drag.cc:3179
 msgid "copy meter mark"
 msgstr "kopiera taktartsmarkör"
 
-#: editor_drag.cc:3054
-msgid "move meter mark"
-msgstr "flytta taktartsmarkör"
+#: editor_drag.cc:3279
+msgid "inactive"
+msgstr ""
 
-#: editor_drag.cc:3177
+#: editor_drag.cc:3324
+msgid "move tempo mark"
+msgstr "flytta tempomarkör"
+
+#: editor_drag.cc:3331
 msgid "copy tempo mark"
 msgstr "kopiera tempomarkör"
 
-#: editor_drag.cc:3185
-msgid "move tempo mark"
-msgstr "flytta tempomarkör"
+#: editor_drag.cc:3462
+msgid "dilate tempo"
+msgstr ""
 
-#: editor_drag.cc:3412
+#: editor_drag.cc:3736
 msgid "change fade in length"
 msgstr "ändra intoningslängd"
 
-#: editor_drag.cc:3526
+#: editor_drag.cc:3861
 msgid "change fade out length"
 msgstr "ändra uttoningslängd"
 
-#: editor_drag.cc:3880
+#: editor_drag.cc:4239
 msgid "move marker"
 msgstr "flytta markör"
 
-#: editor_drag.cc:4490
+#: editor_drag.cc:4506 editor_drag.cc:5833
+msgid "automation range move"
+msgstr ""
+
+#: editor_drag.cc:4890
 msgid "An error occurred while executing time stretch operation"
 msgstr ""
 
-#: editor_drag.cc:4947
+#: editor_drag.cc:5351
 msgid "programming_error: %1"
 msgstr ""
 
-#: editor_drag.cc:5016 editor_drag.cc:5026
+#: editor_drag.cc:5420 editor_drag.cc:5430
 msgid "new skip marker"
 msgstr ""
 
-#: editor_drag.cc:5017
+#: editor_drag.cc:5421
 msgid "skip"
 msgstr ""
 
-#: editor_drag.cc:5021 location_ui.cc:56
+#: editor_drag.cc:5425 location_ui.cc:60
 msgid "CD"
 msgstr ""
 
-#: editor_drag.cc:5022
+#: editor_drag.cc:5426
 msgid "new CD marker"
 msgstr ""
 
-#: editor_drag.cc:5027 editor_route_groups.cc:437 mixer_ui.cc:1493
+#: editor_drag.cc:5431 editor_route_groups.cc:439 mixer_ui.cc:1840
 msgid "unnamed"
 msgstr "namnlös"
 
-#: editor_drag.cc:5309
+#: editor_drag.cc:5740
 msgid "Automation range drag created for invalid region type"
 msgstr ""
 
-#: editor_route_groups.cc:96
+#: editor_route_groups.cc:97
 msgid "Col"
 msgstr ""
 
-#: editor_route_groups.cc:96
+#: editor_route_groups.cc:97
 msgid "Group Tab Color"
 msgstr ""
 
-#: editor_route_groups.cc:97
+#: editor_route_groups.cc:98
 msgid "Name of Group"
 msgstr ""
 
-#: editor_route_groups.cc:98 editor_routes.cc:207
-msgid "V"
+#: editor_route_groups.cc:99 editor_routes.cc:234
+msgid "Visible|V"
 msgstr ""
 
-#: editor_route_groups.cc:98
+#: editor_route_groups.cc:99
 msgid "Group is visible?"
 msgstr ""
 
-#: editor_route_groups.cc:99
+#: editor_route_groups.cc:100
 msgid "On"
 msgstr ""
 
-#: editor_route_groups.cc:99
+#: editor_route_groups.cc:100
 msgid "Group is enabled?"
 msgstr ""
 
-#: editor_route_groups.cc:100
-msgid "group|G"
+#: editor_route_groups.cc:101
+msgid "Group|G"
 msgstr ""
 
-#: editor_route_groups.cc:100
+#: editor_route_groups.cc:101
 msgid "Sharing Gain?"
 msgstr ""
 
-#: editor_route_groups.cc:101
-msgid "relative|Rel"
+#: editor_route_groups.cc:102
+msgid "Relative|Rel"
 msgstr ""
 
-#: editor_route_groups.cc:101
+#: editor_route_groups.cc:102
 msgid "Relative Gain Changes?"
 msgstr ""
 
-#: editor_route_groups.cc:102
-msgid "mute|M"
+#: editor_route_groups.cc:103 editor_regions.cc:168 editor_routes.cc:239
+#: mixer_strip.cc:2221 meter_strip.cc:365 route_time_axis.cc:2742
+#: time_axis_view.cc:1106
+msgid "Mute|M"
 msgstr ""
 
-#: editor_route_groups.cc:102
+#: editor_route_groups.cc:103
 msgid "Sharing Mute?"
 msgstr ""
 
-#: editor_route_groups.cc:103
-msgid "solo|S"
+#: editor_route_groups.cc:104 editor_routes.cc:240 mixer_strip.cc:2234
+#: meter_strip.cc:373 route_time_axis.cc:2739 vca_master_strip.cc:211
+#: vca_time_axis.cc:236
+msgid "Solo|S"
 msgstr ""
 
-#: editor_route_groups.cc:103
+#: editor_route_groups.cc:104
 msgid "Sharing Solo?"
 msgstr ""
 
-#: editor_route_groups.cc:104 midi_time_axis.cc:1622 midi_time_axis.cc:1625
-#: midi_time_axis.cc:1628
+#: editor_route_groups.cc:105 midi_time_axis.cc:1626 midi_time_axis.cc:1629
+#: midi_time_axis.cc:1632
 msgid "Rec"
 msgstr "Spela in"
 
-#: editor_route_groups.cc:104
+#: editor_route_groups.cc:105
 msgid "Sharing Record-enable Status?"
 msgstr ""
 
-#: editor_route_groups.cc:105
-msgid "monitoring|Mon"
+#: editor_route_groups.cc:106
+msgid "Monitoring|Mon"
 msgstr ""
 
-#: editor_route_groups.cc:105
+#: editor_route_groups.cc:106
 msgid "Sharing Monitoring Choice?"
 msgstr ""
 
-#: editor_route_groups.cc:106
-msgid "selection|Sel"
+#: editor_route_groups.cc:107
+msgid "Selection|Sel"
 msgstr ""
 
-#: editor_route_groups.cc:106
+#: editor_route_groups.cc:107
 msgid "Sharing Selected/Editing Status?"
 msgstr ""
 
-#: editor_route_groups.cc:107
-msgid "active|A"
+#: editor_route_groups.cc:108 editor_routes.cc:235
+msgid "Active|A"
 msgstr ""
 
-#: editor_route_groups.cc:107
+#: editor_route_groups.cc:108
 msgid "Sharing Active Status?"
 msgstr ""
 
-#: editor_export_audio.cc:92 editor_markers.cc:740 editor_markers.cc:827
-#: editor_markers.cc:1012 editor_markers.cc:1030 editor_markers.cc:1048
-#: editor_markers.cc:1067 editor_markers.cc:1086 editor_markers.cc:1116
-#: editor_markers.cc:1147 editor_markers.cc:1177 editor_markers.cc:1205
-#: editor_markers.cc:1236 editor_markers.cc:1261 editor_markers.cc:1312
-#: editor_markers.cc:1356 editor_markers.cc:1382 editor_markers.cc:1576
-#: editor_mouse.cc:2120
+#: editor_export_audio.cc:93 editor_markers.cc:733 editor_markers.cc:832
+#: editor_markers.cc:1045 editor_markers.cc:1063 editor_markers.cc:1081
+#: editor_markers.cc:1100 editor_markers.cc:1119 editor_markers.cc:1149
+#: editor_markers.cc:1180 editor_markers.cc:1210 editor_markers.cc:1238
+#: editor_markers.cc:1269 editor_markers.cc:1294 editor_markers.cc:1345
+#: editor_markers.cc:1458 editor_markers.cc:1484 editor_markers.cc:1678
+#: editor_mouse.cc:2255
 msgid "programming error: marker canvas item has no marker object pointer!"
 msgstr ""
 
-#: editor_export_audio.cc:145 editor_export_audio.cc:150
-msgid "File Exists!"
+#: editor_export_audio.cc:114
+msgid "Confirm MIDI File Overwrite"
 msgstr ""
 
-#: editor_export_audio.cc:153
-msgid "Overwrite Existing File"
+#: editor_export_audio.cc:115 utils_videotl.cc:73
+msgid "A file with the same name already exists. Do you want to overwrite it?"
 msgstr ""
 
 #: editor_group_tabs.cc:176
@@ -4702,300 +5328,341 @@ msgstr ""
 msgid "end"
 msgstr ""
 
-#: editor_markers.cc:657 editor_ops.cc:2085 editor_ops.cc:2107
-#: editor_ops.cc:2164 editor_ops.cc:2193 location_ui.cc:1023
+#: editor_markers.cc:645
+msgid "mark"
+msgstr ""
+
+#: editor_markers.cc:650 editor_ops.cc:2164 editor_ops.cc:2186
+#: editor_ops.cc:2304 editor_ops.cc:2341 location_ui.cc:1049
 msgid "add marker"
 msgstr ""
 
-#: editor_markers.cc:689 editor_markers.cc:1456
+#: editor_markers.cc:682 editor_markers.cc:1558
 msgid "set loop range"
 msgstr "ställ in loop-omfång"
 
-#: editor_markers.cc:705 editor_markers.cc:1462
+#: editor_markers.cc:698 editor_markers.cc:1564
 msgid "set punch range"
 msgstr "ställ in inslagsomfång"
 
-#: editor_markers.cc:722 editor_ops.cc:4055
+#: editor_markers.cc:715 editor_ops.cc:4159
 msgid "range"
 msgstr "omfång"
 
-#: editor_markers.cc:725
+#: editor_markers.cc:718
 msgid "new range marker"
 msgstr "ny omfångsmarkör"
 
-#: editor_markers.cc:758 editor_ops.cc:2129 location_ui.cc:859
+#: editor_markers.cc:751 editor_ops.cc:2272 location_ui.cc:885
 msgid "remove marker"
 msgstr "ta bort markör"
 
-#: editor_markers.cc:894
+#: editor_markers.cc:899
 msgid "Locate to Here"
 msgstr ""
 
-#: editor_markers.cc:895
+#: editor_markers.cc:900
 msgid "Play from Here"
 msgstr ""
 
-#: editor_markers.cc:896
+#: editor_markers.cc:901
 msgid "Move Mark to Playhead"
 msgstr "Flytta markör till startmarkören"
 
-#: editor_markers.cc:900
+#: editor_markers.cc:905
 msgid "Create Range to Next Marker"
 msgstr ""
 
-#: editor_markers.cc:941
+#: editor_markers.cc:946
 msgid "Locate to Marker"
 msgstr ""
 
-#: editor_markers.cc:942
+#: editor_markers.cc:947
 msgid "Play from Marker"
 msgstr ""
 
-#: editor_markers.cc:945
+#: editor_markers.cc:950
 msgid "Set Marker from Playhead"
 msgstr ""
 
-#: editor_markers.cc:947
+#: editor_markers.cc:951
 msgid "Set Range from Selection"
 msgstr ""
 
-#: editor_markers.cc:957
+#: editor_markers.cc:960
 msgid "Hide Range"
 msgstr "Göm omfång"
 
-#: editor_markers.cc:958
+#: editor_markers.cc:961
 msgid "Rename Range..."
 msgstr ""
 
-#: editor_markers.cc:962
+#: editor_markers.cc:965
 msgid "Remove Range"
 msgstr "Ta bort omfång"
 
-#: editor_markers.cc:969
+#: editor_markers.cc:972
 msgid "Separate Regions in Range"
 msgstr "Separera regioner i omfånget"
 
-#: editor_markers.cc:972
+#: editor_markers.cc:974
 msgid "Select Range"
 msgstr "Markera omfång"
 
-#: editor_markers.cc:1001
+#: editor_markers.cc:987
+msgid "Make Ramped"
+msgstr ""
+
+#: editor_markers.cc:989
+msgid "Make Constant"
+msgstr ""
+
+#: editor_markers.cc:993 editor_markers.cc:1013
+msgid "Lock to Music"
+msgstr ""
+
+#: editor_markers.cc:995 editor_markers.cc:1015
+msgid "Lock to Audio"
+msgstr ""
+
+#: editor_markers.cc:1034
 msgid "Set Punch Range"
 msgstr "Sätt inslagsomfång här"
 
-#: editor_markers.cc:1407 editor_ops.cc:2040
+#: editor_markers.cc:1391
+msgid "change meter lock style"
+msgstr ""
+
+#: editor_markers.cc:1414
+msgid "change tempo lock style"
+msgstr ""
+
+#: editor_markers.cc:1441
+msgid "change tempo type"
+msgstr ""
+
+#: editor_markers.cc:1509 editor_ops.cc:2119
 msgid "New Name:"
 msgstr "Nytt namn:"
 
-#: editor_markers.cc:1410
+#: editor_markers.cc:1512
 msgid "Rename Mark"
 msgstr "Byt namn på markör"
 
-#: editor_markers.cc:1412
+#: editor_markers.cc:1514
 msgid "Rename Range"
 msgstr "Byt namn på omfång"
 
-#: editor_markers.cc:1419 editor_mouse.cc:2137 processor_box.cc:1994
-#: processor_box.cc:2464 route_time_axis.cc:1100 route_ui.cc:1628
+#: editor_markers.cc:1521 editor_mouse.cc:2272 processor_box.cc:3192
+#: processor_box.cc:3681 route_time_axis.cc:1110 route_ui.cc:1637
+#: vca_master_strip.cc:395
 msgid "Rename"
 msgstr "Döp om"
 
-#: editor_markers.cc:1432
+#: editor_markers.cc:1534
 msgid "rename marker"
 msgstr "byt namn på markör"
 
-#: editor_mixer.cc:90
+#: editor_mixer.cc:98
 msgid "This screen is not tall enough to display the editor mixer"
 msgstr ""
 
-#: editor_mouse.cc:1223 editor_mouse.cc:1241 editor_tempodisplay.cc:270
+#: editor_mouse.cc:1345 editor_mouse.cc:1363 editor_tempodisplay.cc:384
 msgid ""
 "programming error: tempo marker canvas item has no marker object pointer!"
 msgstr ""
 
-#: editor_mouse.cc:1228 editor_tempodisplay.cc:275
+#: editor_mouse.cc:1350 editor_tempodisplay.cc:389
 msgid "programming error: marker for tempo is not a tempo marker!"
 msgstr ""
 
-#: editor_mouse.cc:1246 editor_tempodisplay.cc:375
+#: editor_mouse.cc:1368 editor_tempodisplay.cc:507
 msgid "programming error: marker for meter is not a meter marker!"
 msgstr ""
 
-#: editor_mouse.cc:1885 editor_mouse.cc:1910 editor_mouse.cc:1923
+#: editor_mouse.cc:2016 editor_mouse.cc:2041 editor_mouse.cc:2054
 msgid ""
 "programming error: control point canvas item has no control point object "
 "pointer!"
 msgstr ""
 
-#: editor_mouse.cc:2058
+#: editor_mouse.cc:2085
+msgid "edit note(s)"
+msgstr ""
+
+#: editor_mouse.cc:2193
 msgid "start point trim"
 msgstr ""
 
-#: editor_mouse.cc:2083
-msgid "End point trim"
-msgstr "Beskär slutpunkt"
+#: editor_mouse.cc:2218
+msgid "end point trim"
+msgstr ""
 
-#: editor_mouse.cc:2135
+#: editor_mouse.cc:2270
 msgid "Name for region:"
 msgstr "Namnge region:"
 
-#: editor_ops.cc:165
+#: editor_ops.cc:168
 msgid "split"
 msgstr "dela"
 
-#: editor_ops.cc:339
+#: editor_ops.cc:342
 msgid "alter selection"
 msgstr ""
 
-#: editor_ops.cc:381
+#: editor_ops.cc:384
 msgid "nudge regions forward"
 msgstr ""
 
-#: editor_ops.cc:404 editor_ops.cc:489
+#: editor_ops.cc:441 editor_ops.cc:535
 msgid "nudge location forward"
 msgstr ""
 
-#: editor_ops.cc:462
+#: editor_ops.cc:472
 msgid "nudge regions backward"
 msgstr ""
 
-#: editor_ops.cc:551
+#: editor_ops.cc:567
 msgid "nudge forward"
 msgstr "knuffa framåt"
 
-#: editor_ops.cc:575
+#: editor_ops.cc:591
 msgid "nudge backward"
 msgstr ""
 
-#: editor_ops.cc:618
+#: editor_ops.cc:656
 msgid "sequence regions"
 msgstr ""
 
-#: editor_ops.cc:694
+#: editor_ops.cc:718
 msgid "build_region_boundary_cache called with snap_type = %1"
 msgstr ""
 
-#: editor_ops.cc:2042
+#: editor_ops.cc:2121
 msgid "New Location Marker"
 msgstr ""
 
-#: editor_ops.cc:2164
+#: editor_ops.cc:2212 editor_ops.cc:2236
+msgid "Set session start"
+msgstr ""
+
+#: editor_ops.cc:2304
 msgid "add markers"
 msgstr ""
 
-#: editor_ops.cc:2274
+#: editor_ops.cc:2400
 msgid "clear markers"
 msgstr "rensa markörer"
 
-#: editor_ops.cc:2289
+#: editor_ops.cc:2415
 msgid "clear ranges"
 msgstr "rensa omfång"
 
-#: editor_ops.cc:2305
+#: editor_ops.cc:2431
 msgid "clear locations"
 msgstr "rensa platser"
 
-#: editor_ops.cc:2368
+#: editor_ops.cc:2494
 msgid "insert region"
 msgstr "infoga region"
 
-#: editor_ops.cc:2559
+#: editor_ops.cc:2685
 msgid "raise regions"
 msgstr ""
 
-#: editor_ops.cc:2561
+#: editor_ops.cc:2687
 msgid "raise region"
 msgstr ""
 
-#: editor_ops.cc:2567
+#: editor_ops.cc:2693
 msgid "raise regions to top"
 msgstr ""
 
-#: editor_ops.cc:2569
+#: editor_ops.cc:2695
 msgid "raise region to top"
 msgstr ""
 
-#: editor_ops.cc:2575
+#: editor_ops.cc:2701
 msgid "lower regions"
 msgstr ""
 
-#: editor_ops.cc:2577 editor_ops.cc:2585
+#: editor_ops.cc:2703 editor_ops.cc:2711
 msgid "lower region"
 msgstr ""
 
-#: editor_ops.cc:2583
+#: editor_ops.cc:2709
 msgid "lower regions to bottom"
 msgstr ""
 
-#: editor_ops.cc:2668
+#: editor_ops.cc:2794
 msgid "Rename Region"
 msgstr "Byt namn på region"
 
-#: editor_ops.cc:2670 processor_box.cc:1992 route_ui.cc:1626
+#: editor_ops.cc:2796 processor_box.cc:3190 route_ui.cc:1635
 msgid "New name:"
 msgstr "Nytt namn:"
 
-#: editor_ops.cc:2987
+#: editor_ops.cc:3097
 msgid "separate"
 msgstr "separera"
 
-#: editor_ops.cc:3099
+#: editor_ops.cc:3207
 msgid "separate region under"
 msgstr ""
 
-#: editor_ops.cc:3220
+#: editor_ops.cc:3360
 msgid "trim to selection"
 msgstr "beskär till markeringen"
 
-#: editor_ops.cc:3356
+#: editor_ops.cc:3442
 msgid "set sync point"
 msgstr ""
 
-#: editor_ops.cc:3380
+#: editor_ops.cc:3466
 msgid "remove region sync"
 msgstr ""
 
-#: editor_ops.cc:3402
+#: editor_ops.cc:3488
 msgid "move regions to original position"
 msgstr ""
 
-#: editor_ops.cc:3404
+#: editor_ops.cc:3490
 msgid "move region to original position"
 msgstr ""
 
-#: editor_ops.cc:3425
+#: editor_ops.cc:3511
 msgid "align selection"
 msgstr "justera markering"
 
-#: editor_ops.cc:3499
+#: editor_ops.cc:3585
 msgid "align selection (relative)"
 msgstr "justera markering (relativt)"
 
-#: editor_ops.cc:3533
+#: editor_ops.cc:3619
 msgid "align region"
 msgstr "justera region"
 
-#: editor_ops.cc:3584
+#: editor_ops.cc:3670
 msgid "trim front"
 msgstr ""
 
-#: editor_ops.cc:3584
+#: editor_ops.cc:3670
 msgid "trim back"
 msgstr ""
 
-#: editor_ops.cc:3614
+#: editor_ops.cc:3700
 msgid "trim to loop"
 msgstr ""
 
-#: editor_ops.cc:3624
+#: editor_ops.cc:3710
 msgid "trim to punch"
 msgstr ""
 
-#: editor_ops.cc:3686
+#: editor_ops.cc:3832
 msgid "trim to region"
 msgstr ""
 
-#: editor_ops.cc:3794
+#: editor_ops.cc:3891
 msgid ""
 "This track/bus cannot be frozen because the signal adds or loses channels "
 "before reaching the outputs.\n"
@@ -5003,11 +5670,11 @@ msgid ""
 "input or vice versa."
 msgstr ""
 
-#: editor_ops.cc:3797
+#: editor_ops.cc:3894
 msgid "Cannot freeze"
 msgstr ""
 
-#: editor_ops.cc:3803
+#: editor_ops.cc:3900
 msgid ""
 "<b>%1</b>\n"
 "\n"
@@ -5016,23 +5683,23 @@ msgid ""
 "Freezing will only process the signal as far as the first send/insert/return."
 msgstr ""
 
-#: editor_ops.cc:3807
+#: editor_ops.cc:3904
 msgid "Freeze anyway"
 msgstr ""
 
-#: editor_ops.cc:3808
+#: editor_ops.cc:3905
 msgid "Don't freeze"
 msgstr ""
 
-#: editor_ops.cc:3809
+#: editor_ops.cc:3906
 msgid "Freeze Limits"
 msgstr ""
 
-#: editor_ops.cc:3824
+#: editor_ops.cc:3921
 msgid "Cancel Freeze"
 msgstr "Avbryt frysning"
 
-#: editor_ops.cc:3854
+#: editor_ops.cc:3952
 msgid ""
 "You can't perform this operation because the processing of the signal will "
 "cause one or more of the tracks to end up with a region with more channels "
@@ -5041,47 +5708,47 @@ msgid ""
 "You can do this without processing, which is a different operation."
 msgstr ""
 
-#: editor_ops.cc:3858
+#: editor_ops.cc:3956
 msgid "Cannot bounce"
 msgstr ""
 
-#: editor_ops.cc:3869
+#: editor_ops.cc:4007
 msgid "bounce range"
 msgstr "omfång till disk"
 
-#: editor_ops.cc:3971
+#: editor_ops.cc:4074
 msgid "delete"
 msgstr ""
 
-#: editor_ops.cc:3974
+#: editor_ops.cc:4077
 msgid "cut"
 msgstr "klipp ut"
 
-#: editor_ops.cc:3977
+#: editor_ops.cc:4080
 msgid "copy"
 msgstr "kopiera"
 
-#: editor_ops.cc:3980
+#: editor_ops.cc:4083
 msgid "clear"
 msgstr "Rensa"
 
-#: editor_ops.cc:4028
+#: editor_ops.cc:4132
 msgid "objects"
 msgstr ""
 
-#: editor_ops.cc:4238 editor_ops.cc:4270
+#: editor_ops.cc:4342 editor_ops.cc:4427
 msgid "remove region"
 msgstr "ta bort region"
 
-#: editor_ops.cc:4719
-msgid "duplicate selection"
-msgstr "duplicera markering"
+#: editor_ops.cc:4844
+msgid "duplicate range selection"
+msgstr ""
 
-#: editor_ops.cc:4803
+#: editor_ops.cc:4938
 msgid "nudge track"
 msgstr "knuffa spår"
 
-#: editor_ops.cc:4840
+#: editor_ops.cc:4965
 msgid ""
 "Do you really want to destroy the last capture?\n"
 "(This is destructive and cannot be undone)"
@@ -5089,136 +5756,156 @@ msgstr ""
 "Vill du verkligen radera den senaste inspelningen?\n"
 "(Detta är en destruktiv handling och kan ej ångras)"
 
-#: editor_ops.cc:4843 editor_ops.cc:6838 editor_regions.cc:462
-#: editor_snapshots.cc:159 route_ui.cc:1569
+#: editor_ops.cc:4968 editor_ops.cc:7202 editor_regions.cc:503
+#: editor_snapshots.cc:171
 msgid "No, do nothing."
 msgstr "Nej, gör ingenting."
 
-#: editor_ops.cc:4844
+#: editor_ops.cc:4969
 msgid "Yes, destroy it."
 msgstr "Ja, radera den."
 
-#: editor_ops.cc:4846
+#: editor_ops.cc:4971
 msgid "Destroy last capture"
 msgstr ""
 
-#: editor_ops.cc:4906
+#: editor_ops.cc:5047
 msgid "normalize"
 msgstr "normalisera"
 
-#: editor_ops.cc:5000
+#: editor_ops.cc:5145
 msgid "reverse regions"
 msgstr "regioner till motsatt riktning"
 
-#: editor_ops.cc:5034
+#: editor_ops.cc:5182
 msgid "strip silence"
 msgstr ""
 
-#: editor_ops.cc:5091
+#: editor_ops.cc:5263
 msgid "Fork Region(s)"
 msgstr ""
 
-#: editor_ops.cc:5112
+#: editor_ops.cc:5270
 msgid "Could not unlink %1"
 msgstr ""
 
-#: editor_ops.cc:5326
+#: editor_ops.cc:5532
 msgid "reset region gain"
 msgstr ""
 
-#: editor_ops.cc:5379
+#: editor_ops.cc:5590
 msgid "region gain envelope active"
 msgstr ""
 
-#: editor_ops.cc:5406
+#: editor_ops.cc:5615
 msgid "toggle region lock"
 msgstr ""
 
-#: editor_ops.cc:5430
+#: editor_ops.cc:5639
 msgid "Toggle Video Lock"
 msgstr ""
 
-#: editor_ops.cc:5454
+#: editor_ops.cc:5663
 msgid "region lock style"
 msgstr ""
 
-#: editor_ops.cc:5479
+#: editor_ops.cc:5688
 msgid "change region opacity"
 msgstr ""
 
-#: editor_ops.cc:5572
+#: editor_ops.cc:5781
 msgid "fade range"
 msgstr ""
 
-#: editor_ops.cc:5610
+#: editor_ops.cc:5819
 msgid "set fade in length"
 msgstr ""
 
-#: editor_ops.cc:5617
+#: editor_ops.cc:5826
 msgid "set fade out length"
 msgstr ""
 
-#: editor_ops.cc:5662
+#: editor_ops.cc:5891
 msgid "set fade in shape"
 msgstr ""
 
-#: editor_ops.cc:5693
+#: editor_ops.cc:5926
 msgid "set fade out shape"
 msgstr ""
 
-#: editor_ops.cc:5723
+#: editor_ops.cc:5962
 msgid "set fade in active"
 msgstr ""
 
-#: editor_ops.cc:5752
+#: editor_ops.cc:5996
 msgid "set fade out active"
 msgstr ""
 
-#: editor_ops.cc:5994
+#: editor_ops.cc:6056
+msgid "toggle fade active"
+msgstr ""
+
+#: editor_ops.cc:6249
 msgid "set loop range from selection"
 msgstr ""
 
-#: editor_ops.cc:6008
+#: editor_ops.cc:6263
 msgid "set loop range from region"
 msgstr ""
 
-#: editor_ops.cc:6027
+#: editor_ops.cc:6282
 msgid "set punch range from selection"
 msgstr ""
 
-#: editor_ops.cc:6041
+#: editor_ops.cc:6306
 msgid "set session start/end from selection"
 msgstr ""
 
-#: editor_ops.cc:6066
+#: editor_ops.cc:6344
+msgid "set punch start from EP"
+msgstr ""
+
+#: editor_ops.cc:6372
+msgid "set punch end from EP"
+msgstr ""
+
+#: editor_ops.cc:6405
+msgid "set loop start from EP"
+msgstr ""
+
+#: editor_ops.cc:6433
+msgid "set loop end from EP"
+msgstr ""
+
+#: editor_ops.cc:6444
 msgid "set punch range from region"
 msgstr ""
 
-#: editor_ops.cc:6175
+#: editor_ops.cc:6531
 msgid "Add new marker"
 msgstr ""
 
-#: editor_ops.cc:6176
+#: editor_ops.cc:6532
 msgid "Set global tempo"
 msgstr ""
 
-#: editor_ops.cc:6179
+#: editor_ops.cc:6535
 msgid "Define one bar"
 msgstr ""
 
-#: editor_ops.cc:6180
+#: editor_ops.cc:6536
 msgid "Do you want to set the global tempo or add a new tempo marker?"
 msgstr ""
 
-#: editor_ops.cc:6206
+#: editor_ops.cc:6562
 msgid "set tempo from region"
 msgstr ""
 
-#: editor_ops.cc:6236
+#: editor_ops.cc:6591
 msgid "split regions"
 msgstr ""
 
-#: editor_ops.cc:6278
+#: editor_ops.cc:6633
 msgid ""
 "You are about to split\n"
 "%1\n"
@@ -5226,62 +5913,62 @@ msgid ""
 "This could take a long time."
 msgstr ""
 
-#: editor_ops.cc:6285
+#: editor_ops.cc:6640
 msgid "Call for the Ferret!"
 msgstr ""
 
-#: editor_ops.cc:6286
+#: editor_ops.cc:6641
 msgid ""
 "Press OK to continue with this split operation\n"
 "or ask the Ferret dialog to tune the analysis"
 msgstr ""
 
-#: editor_ops.cc:6288
+#: editor_ops.cc:6643
 msgid "Press OK to continue with this split operation"
 msgstr ""
 
-#: editor_ops.cc:6291
+#: editor_ops.cc:6646
 msgid "Excessive split?"
 msgstr ""
 
-#: editor_ops.cc:6443
+#: editor_ops.cc:6800
 msgid "place transient"
 msgstr ""
 
-#: editor_ops.cc:6478
+#: editor_ops.cc:6834
 msgid "snap regions to grid"
 msgstr ""
 
-#: editor_ops.cc:6517
+#: editor_ops.cc:6873
 msgid "Close Region Gaps"
 msgstr ""
 
-#: editor_ops.cc:6522
+#: editor_ops.cc:6878
 msgid "Crossfade length"
 msgstr ""
 
-#: editor_ops.cc:6531 editor_ops.cc:6542 rhythm_ferret.cc:119
-#: session_option_editor.cc:141
+#: editor_ops.cc:6887 editor_ops.cc:6898 rhythm_ferret.cc:128
+#: rhythm_ferret.cc:143 session_option_editor.cc:141
 msgid "ms"
 msgstr ""
 
-#: editor_ops.cc:6533
+#: editor_ops.cc:6889
 msgid "Pull-back length"
 msgstr ""
 
-#: editor_ops.cc:6546
+#: editor_ops.cc:6902 keyeditor.cc:71
 msgid "Ok"
 msgstr ""
 
-#: editor_ops.cc:6561
+#: editor_ops.cc:6917
 msgid "close region gaps"
 msgstr ""
 
-#: editor_ops.cc:6786 route_ui.cc:1543
+#: editor_ops.cc:7160
 msgid "That would be bad news ...."
 msgstr ""
 
-#: editor_ops.cc:6791 route_ui.cc:1548
+#: editor_ops.cc:7165
 msgid ""
 "Removing the master or monitor bus is such a bad idea\n"
 "that %1 is not going to allow it.\n"
@@ -5291,23 +5978,19 @@ msgid ""
 "\"allow-special-bus-removal\" option to be \"yes\""
 msgstr ""
 
-#: editor_ops.cc:6809
-msgid "tracks"
-msgstr "spår"
-
-#: editor_ops.cc:6811 route_ui.cc:1992
+#: editor_ops.cc:7181
 msgid "track"
-msgstr ""
-
-#: editor_ops.cc:6815
-msgid "busses"
-msgstr "buss(ar)"
+msgid_plural "tracks"
+msgstr[0] ""
+msgstr[1] ""
 
-#: editor_ops.cc:6817 route_ui.cc:1992
+#: editor_ops.cc:7182
 msgid "bus"
-msgstr ""
+msgid_plural "busses"
+msgstr[0] ""
+msgstr[1] ""
 
-#: editor_ops.cc:6822
+#: editor_ops.cc:7186
 msgid ""
 "Do you really want to remove %1 %2 and %3 %4?\n"
 "(You may also lose the playlists associated with the %2)\n"
@@ -5315,7 +5998,7 @@ msgid ""
 "This action cannot be undone, and the session file will be overwritten!"
 msgstr ""
 
-#: editor_ops.cc:6827
+#: editor_ops.cc:7191
 msgid ""
 "Do you really want to remove %1 %2?\n"
 "(You may also lose the playlists associated with the %2)\n"
@@ -5323,358 +6006,371 @@ msgid ""
 "This action cannot be undone, and the session file will be overwritten!"
 msgstr ""
 
-#: editor_ops.cc:6833
+#: editor_ops.cc:7197
 msgid ""
 "Do you really want to remove %1 %2?\n"
 "\n"
 "This action cannot be undone, and the session file will be overwritten"
 msgstr ""
 
-#: editor_ops.cc:6840
+#: editor_ops.cc:7204
 msgid "Yes, remove them."
 msgstr ""
 
-#: editor_ops.cc:6842 editor_snapshots.cc:160 route_ui.cc:1570
+#: editor_ops.cc:7206 editor_snapshots.cc:172
 msgid "Yes, remove it."
 msgstr "Ja, ta bort den."
 
-#: editor_ops.cc:6847 editor_ops.cc:6849
+#: editor_ops.cc:7211 editor_ops.cc:7213
 msgid "Remove %1"
 msgstr ""
 
-#: editor_ops.cc:6912
+#: editor_ops.cc:7319 editor_ops.cc:7333 editor_ops.cc:7373 editor_ops.cc:7383
 msgid "insert time"
 msgstr ""
 
-#: editor_ops.cc:7076
+#: editor_ops.cc:7436
+msgid "Cannot insert or delete time when in Lock edit."
+msgstr ""
+
+#: editor_ops.cc:7456 editor_ops.cc:7468 editor_ops.cc:7541 editor_ops.cc:7554
+msgid "remove time"
+msgstr ""
+
+#: editor_ops.cc:7628
 msgid "There are too many tracks to fit in the current window"
 msgstr ""
 
-#: editor_ops.cc:7137
+#: editor_ops.cc:7689
 msgid "Sel"
 msgstr ""
 
-#: editor_ops.cc:7176
+#: editor_ops.cc:7728
 #, c-format
 msgid "Saved view %u"
 msgstr ""
 
-#: editor_ops.cc:7201
+#: editor_ops.cc:7753
 msgid "mute regions"
 msgstr ""
 
-#: editor_ops.cc:7203
+#: editor_ops.cc:7755
 msgid "mute region"
 msgstr "tysta region"
 
-#: editor_ops.cc:7240
+#: editor_ops.cc:7792
 msgid "combine regions"
 msgstr ""
 
-#: editor_ops.cc:7278
+#: editor_ops.cc:7830
 msgid "uncombine regions"
 msgstr ""
 
-#: editor_ops.cc:7315
+#: editor_ops.cc:7867
 msgid "%1: Locked"
 msgstr ""
 
-#: editor_ops.cc:7322
+#: editor_ops.cc:7874
 msgid "Click to unlock"
 msgstr ""
 
-#: editor_ops.cc:7376
+#: editor_ops.cc:7923
 msgid "Moving embedded files into session folder"
 msgstr ""
 
-#: editor_regions.cc:112
+#: editor_regions.cc:159
 msgid "Region name, with number of channels in []'s"
 msgstr ""
 
-#: editor_regions.cc:113
+#: editor_regions.cc:160
 msgid "Position of start of region"
 msgstr ""
 
-#: editor_regions.cc:114 editor_regions.cc:851 time_info_box.cc:101
+#: editor_regions.cc:161 editor_regions.cc:935 time_info_box.cc:95
 msgid "End"
 msgstr "Slut"
 
-#: editor_regions.cc:114
+#: editor_regions.cc:161
 msgid "Position of end of region"
 msgstr ""
 
-#: editor_regions.cc:115
+#: editor_regions.cc:162
 msgid "Length of the region"
 msgstr ""
 
-#: editor_regions.cc:116
+#: editor_regions.cc:163
 msgid "Position of region sync point, relative to start of the region"
 msgstr ""
 
-#: editor_regions.cc:117
+#: editor_regions.cc:164
 msgid "Length of region fade-in (units: secondary clock), () if disabled"
 msgstr ""
 
-#: editor_regions.cc:118
+#: editor_regions.cc:165
 msgid "Length of region fade-out (units: secondary clock), () if disabled"
 msgstr ""
 
-#: editor_regions.cc:119 mixer_strip.cc:2055 mono_panner.cc:203
-#: panner2d.cc:240 stereo_panner.cc:251 stereo_panner.cc:274
-msgid "L"
-msgstr "V"
+#: editor_regions.cc:166
+msgid "Lock|L"
+msgstr ""
 
-#: editor_regions.cc:119
+#: editor_regions.cc:166
 msgid "Region position locked?"
 msgstr ""
 
-#: editor_regions.cc:120 route_time_axis.cc:103
-msgid "G"
+#: editor_regions.cc:167
+msgid "Gain|G"
 msgstr ""
 
-#: editor_regions.cc:120
+#: editor_regions.cc:167
 msgid "Region position glued to Bars|Beats time?"
 msgstr ""
 
-#: editor_regions.cc:121 editor_routes.cc:211 gain_meter.cc:793
-#: mixer_strip.cc:2032 meter_strip.cc:359 panner_ui.cc:603
-#: route_time_axis.cc:2713 stereo_panner.cc:271 time_axis_view.cc:1190
-msgid "M"
-msgstr ""
-
-#: editor_regions.cc:121
+#: editor_regions.cc:168
 msgid "Region muted?"
 msgstr ""
 
-#: editor_regions.cc:122 mixer_strip.cc:1855
-msgid "O"
-msgstr "A"
+#: editor_regions.cc:169
+msgid "Opaque|O"
+msgstr ""
 
-#: editor_regions.cc:122
+#: editor_regions.cc:169
 msgid "Region opaque (blocks regions below it from being heard)?"
 msgstr ""
 
-#: editor_regions.cc:311 editor_regions.cc:316 editor_regions.cc:318
+#: editor_regions.cc:360 editor_regions.cc:365 editor_regions.cc:367
 msgid "Hidden"
 msgstr "Dold"
 
-#: editor_regions.cc:391
+#: editor_regions.cc:432
 msgid "(MISSING) "
 msgstr ""
 
-#: editor_regions.cc:459
+#: editor_regions.cc:500
 msgid ""
 "Do you really want to remove unused regions?\n"
 "(This is destructive and cannot be undone)"
 msgstr ""
 
-#: editor_regions.cc:463
+#: editor_regions.cc:504
 msgid "Yes, remove."
 msgstr ""
 
-#: editor_regions.cc:465
+#: editor_regions.cc:506
 msgid "Remove unused regions"
 msgstr ""
 
-#: editor_regions.cc:818 editor_regions.cc:832 editor_regions.cc:846
+#: editor_regions.cc:735
+msgid "EditorRegions::format_position: negative timecode position: %1"
+msgstr ""
+
+#: editor_regions.cc:900 editor_regions.cc:916 editor_regions.cc:930
 msgid "Mult."
 msgstr ""
 
-#: editor_regions.cc:849 midi_list_editor.cc:104 time_info_box.cc:94
+#: editor_regions.cc:933 midi_list_editor.cc:104 time_info_box.cc:88
 msgid "Start"
 msgstr ""
 
-#: editor_regions.cc:867 editor_regions.cc:883
+#: editor_regions.cc:951 editor_regions.cc:967
 msgid "Multiple"
 msgstr ""
 
-#: editor_regions.cc:952
+#: editor_regions.cc:1036
 msgid "MISSING "
 msgstr ""
 
-#: editor_routes.cc:182 editor_routes.cc:214
+#: editor_routes.cc:126
+msgid "RS"
+msgstr ""
+
+#: editor_routes.cc:208
 msgid "SS"
 msgstr ""
 
-#: editor_routes.cc:206
+#: editor_routes.cc:233
 msgid "Track/Bus Name"
 msgstr ""
 
-#: editor_routes.cc:207
+#: editor_routes.cc:234
 msgid "Track/Bus visible ?"
 msgstr ""
 
-#: editor_routes.cc:208 mixer_strip.cc:2046 meter_strip.cc:371
-#: route_time_axis.cc:105 route_time_axis.cc:2701
-msgid "A"
-msgstr ""
-
-#: editor_routes.cc:208
+#: editor_routes.cc:235
 msgid "Track/Bus active ?"
 msgstr ""
 
-#: editor_routes.cc:209 mixer_strip.cc:2033 mixer_strip.cc:2054
-#: meter_strip.cc:379
-msgid "I"
+#: editor_routes.cc:236
+msgid "MidiInput|I"
 msgstr ""
 
-#: editor_routes.cc:209
+#: editor_routes.cc:236
 msgid "MIDI input enabled"
 msgstr ""
 
-#: editor_routes.cc:210 mono_panner.cc:220 panner2d.cc:241
-#: stereo_panner.cc:249 stereo_panner.cc:276
-msgid "R"
-msgstr "H"
+#: editor_routes.cc:237
+msgid "Rec|R"
+msgstr ""
 
-#: editor_routes.cc:210
+#: editor_routes.cc:237
 msgid "Record enabled"
 msgstr ""
 
-#: editor_routes.cc:211
-msgid "Muted"
+#: editor_routes.cc:238
+msgid "Rec|RS"
 msgstr ""
 
-#: editor_routes.cc:212 mixer_strip.cc:2042 meter_strip.cc:367
-#: route_time_axis.cc:2710
-msgid "S"
+#: editor_routes.cc:238
+msgid "Record Safe"
 msgstr ""
 
-#: editor_routes.cc:212
+#: editor_routes.cc:239
+msgid "Muted"
+msgstr ""
+
+#: editor_routes.cc:240
 msgid "Soloed"
 msgstr ""
 
-#: editor_routes.cc:213
-msgid "SI"
+#: editor_routes.cc:241
+msgid "SoloIso|SI"
 msgstr ""
 
-#: editor_routes.cc:213
+#: editor_routes.cc:241
 msgid "Solo Isolated"
 msgstr ""
 
-#: editor_routes.cc:214
+#: editor_routes.cc:242
+msgid "SoloLock|SS"
+msgstr ""
+
+#: editor_routes.cc:242
 msgid "Solo Safe (Locked)"
 msgstr ""
 
-#: editor_routes.cc:477 mixer_ui.cc:1197
+#: editor_routes.cc:550 mixer_ui.cc:1498
 msgid "Hide All"
 msgstr "Dölj Alla"
 
-#: editor_routes.cc:478 mixer_ui.cc:1198
+#: editor_routes.cc:551 mixer_ui.cc:1499
 msgid "Show All Audio Tracks"
 msgstr "Visa alla spår"
 
-#: editor_routes.cc:479 mixer_ui.cc:1199
+#: editor_routes.cc:552 mixer_ui.cc:1500
 msgid "Hide All Audio Tracks"
 msgstr "Dölj alla spår"
 
-#: editor_routes.cc:480 mixer_ui.cc:1200
+#: editor_routes.cc:553 mixer_ui.cc:1501
 msgid "Show All Audio Busses"
 msgstr "Visa alla bussar"
 
-#: editor_routes.cc:481 mixer_ui.cc:1201
+#: editor_routes.cc:554 mixer_ui.cc:1502
 msgid "Hide All Audio Busses"
 msgstr "Dölj alla bussar"
 
-#: editor_routes.cc:482
+#: editor_routes.cc:555 mixer_ui.cc:1503
 msgid "Show All Midi Tracks"
 msgstr "Visa alla MIDI-spår"
 
-#: editor_routes.cc:483
+#: editor_routes.cc:556 mixer_ui.cc:1504
 msgid "Hide All Midi Tracks"
 msgstr "Göm alla MIDI-spår"
 
-#: editor_routes.cc:484
-msgid "Show Tracks With Regions Under Playhead"
-msgstr "Visa spår med regioner under startmarkören"
+#: editor_routes.cc:557
+msgid "Only Show Tracks with Regions Under Playhead"
+msgstr ""
 
-#: editor_rulers.cc:211
+#: editor_rulers.cc:212
 msgid "New location marker"
 msgstr "Ny platsmarkör"
 
-#: editor_rulers.cc:212
+#: editor_rulers.cc:213
 msgid "Clear all locations"
 msgstr "Rensa alla platsmarkörer"
 
-#: editor_rulers.cc:213
+#: editor_rulers.cc:214
 msgid "Unhide locations"
 msgstr "Visa platsmarkörer"
 
-#: editor_rulers.cc:217
+#: editor_rulers.cc:218
 msgid "New range"
 msgstr ""
 
-#: editor_rulers.cc:218
+#: editor_rulers.cc:219
 msgid "Clear all ranges"
 msgstr "Rensa alla omfång"
 
-#: editor_rulers.cc:219
+#: editor_rulers.cc:220
 msgid "Unhide ranges"
 msgstr "Visa omfång"
 
 #: editor_rulers.cc:224
-msgid "Make Loop range"
+msgid "New Loop range"
 msgstr ""
 
 #: editor_rulers.cc:225
-msgid "Make Punch range"
+msgid "New Punch range"
 msgstr ""
 
 #: editor_rulers.cc:230
 msgid "New CD track marker"
 msgstr "Ny CD-spårsmarkör"
 
-#: editor_rulers.cc:235 tempo_dialog.cc:38
+#: editor_rulers.cc:234 tempo_dialog.cc:38
 msgid "New Tempo"
 msgstr "Nytt tempo"
 
-#: editor_rulers.cc:239 tempo_dialog.cc:296
+#: editor_rulers.cc:238 tempo_dialog.cc:419
 msgid "New Meter"
 msgstr "Ny taktart"
 
-#: editor_snapshots.cc:137
+#: editor_snapshots.cc:149
 msgid "Rename Snapshot"
 msgstr ""
 
-#: editor_snapshots.cc:139
+#: editor_snapshots.cc:151
 msgid "New name of snapshot"
 msgstr ""
 
-#: editor_snapshots.cc:157
+#: editor_snapshots.cc:169
 msgid ""
 "Do you really want to remove snapshot \"%1\" ?\n"
 "(which cannot be undone)"
 msgstr ""
 
-#: editor_snapshots.cc:162
+#: editor_snapshots.cc:174
 msgid "Remove snapshot"
 msgstr ""
 
-#: editor_tempodisplay.cc:194 editor_tempodisplay.cc:234
-msgid "add"
-msgstr "lägg till"
-
-#: editor_tempodisplay.cc:215
+#: editor_tempodisplay.cc:318
 msgid "add tempo mark"
 msgstr "lägg till tempomarkör"
 
-#: editor_tempodisplay.cc:254
+#: editor_tempodisplay.cc:343
+msgid "add"
+msgstr "lägg till"
+
+#: editor_tempodisplay.cc:362
 msgid "add meter mark"
 msgstr "lägg till taktartsmarkör"
 
-#: editor_tempodisplay.cc:287 editor_tempodisplay.cc:315
+#: editor_tempodisplay.cc:401 editor_tempodisplay.cc:435
 msgid "done"
 msgstr "klar"
 
-#: editor_tempodisplay.cc:304 editor_tempodisplay.cc:330
+#: editor_tempodisplay.cc:422
+msgid "replace meter mark"
+msgstr ""
+
+#: editor_tempodisplay.cc:454
 msgid "replace tempo mark"
 msgstr "ersätt tempomarkör"
 
-#: editor_tempodisplay.cc:353 editor_tempodisplay.cc:387
+#: editor_tempodisplay.cc:485 editor_tempodisplay.cc:519
 msgid "remove tempo mark"
 msgstr "ta bort tempomarkör"
 
-#: editor_tempodisplay.cc:370
+#: editor_tempodisplay.cc:502
 msgid ""
 "programming error: meter marker canvas item has no marker object pointer!"
 msgstr ""
@@ -5683,330 +6379,382 @@ msgstr ""
 msgid "stretch/shrink"
 msgstr ""
 
-#: editor_timefx.cc:129
+#: editor_timefx.cc:130
 msgid "pitch shift"
 msgstr ""
 
-#: editor_timefx.cc:301
+#: editor_timefx.cc:282
 msgid "timefx cannot be started - thread creation error"
 msgstr ""
 
-#: engine_dialog.cc:83
+#: engine_dialog.cc:86
 msgid "Device Control Panel"
 msgstr ""
 
-#: engine_dialog.cc:84
+#: engine_dialog.cc:87
 msgid "Midi Device Setup"
 msgstr ""
 
-#: engine_dialog.cc:85 engine_dialog.cc:2097
+#: engine_dialog.cc:89
+msgid "Refresh Devices"
+msgstr ""
+
+#: engine_dialog.cc:90
+msgid "Use Buffered I/O"
+msgstr ""
+
+#: engine_dialog.cc:91 engine_dialog.cc:3000
 msgid "Measure"
 msgstr ""
 
-#: engine_dialog.cc:86
+#: engine_dialog.cc:92
 msgid "Use results"
 msgstr ""
 
-#: engine_dialog.cc:87
+#: engine_dialog.cc:93
 msgid "Back to settings ... (ignore results)"
 msgstr ""
 
-#: engine_dialog.cc:88
+#: engine_dialog.cc:94
 msgid "Calibrate Audio"
 msgstr ""
 
-#: engine_dialog.cc:92
+#: engine_dialog.cc:98
 msgid "Back to settings"
 msgstr ""
 
-#: engine_dialog.cc:111
+#: engine_dialog.cc:120
 msgid ""
 "No audio/MIDI backends detected. %1 cannot run\n"
 "\n"
 "(This is a build/packaging/system error. It should never happen.)"
 msgstr ""
 
-#: engine_dialog.cc:137
+#: engine_dialog.cc:145
 msgid "Latency Measurement Tool"
 msgstr ""
 
-#: engine_dialog.cc:149
+#: engine_dialog.cc:157
 msgid ""
 "<span weight=\"bold\">Turn down the volume on your audio equipment to a very "
 "low level.</span>"
 msgstr ""
 
-#: engine_dialog.cc:158
+#: engine_dialog.cc:166
 msgid "Select two channels below and connect them using a cable."
 msgstr ""
 
-#: engine_dialog.cc:163
+#: engine_dialog.cc:171
 msgid "Output channel"
 msgstr ""
 
-#: engine_dialog.cc:171
+#: engine_dialog.cc:179
 msgid "Input channel"
 msgstr ""
 
-#: engine_dialog.cc:206
+#: engine_dialog.cc:213
 msgid "Once the channels are connected, click the \"Measure\" button."
 msgstr ""
 
-#: engine_dialog.cc:213
+#: engine_dialog.cc:220
 msgid "When satisfied with the results, click the \"Use results\" button."
 msgstr ""
 
-#: engine_dialog.cc:228 engine_dialog.cc:2217 engine_dialog.cc:2227
+#: engine_dialog.cc:235 engine_dialog.cc:3138 engine_dialog.cc:3148
 msgid "No measurement results yet"
 msgstr ""
 
-#: engine_dialog.cc:238 route_params_ui.cc:106
+#: engine_dialog.cc:245 route_params_ui.cc:106
 msgid "Latency"
 msgstr "Fördröjning"
 
-#: engine_dialog.cc:372
+#: engine_dialog.cc:520
 msgid "Audio System:"
 msgstr ""
 
-#: engine_dialog.cc:409
+#: engine_dialog.cc:564
 msgid "Driver:"
 msgstr "Drivrutin:"
 
-#: engine_dialog.cc:415
+#: engine_dialog.cc:571
+msgid "Input Device:"
+msgstr ""
+
+#: engine_dialog.cc:575
+msgid "Output Device:"
+msgstr ""
+
+#: engine_dialog.cc:582
 msgid "Device:"
 msgstr ""
 
-#: engine_dialog.cc:420 engine_dialog.cc:519 sfdb_ui.cc:153 sfdb_ui.cc:348
-#: sfdb_ui.cc:353
+#: engine_dialog.cc:591 engine_dialog.cc:699 export_report.cc:164
+#: export_report.cc:328 sfdb_ui.cc:153 sfdb_ui.cc:348 sfdb_ui.cc:353
 msgid "Sample rate:"
 msgstr "Samplingsfrekvens:"
 
-#: engine_dialog.cc:426 engine_dialog.cc:526
+#: engine_dialog.cc:597 engine_dialog.cc:706
 msgid "Buffer size:"
 msgstr "Buffertstorlek:"
 
-#: engine_dialog.cc:444
+#: engine_dialog.cc:606
+msgid "Periods:"
+msgstr ""
+
+#: engine_dialog.cc:624
 msgid "Input Channels:"
 msgstr ""
 
-#: engine_dialog.cc:457
+#: engine_dialog.cc:637
 msgid "Output Channels:"
 msgstr ""
 
-#: engine_dialog.cc:469
+#: engine_dialog.cc:649
 msgid "Hardware input latency:"
 msgstr "Hårdvarans ingångsfördröjning"
 
-#: engine_dialog.cc:472 engine_dialog.cc:485
+#: engine_dialog.cc:652 engine_dialog.cc:665
 msgid "samples"
 msgstr "samplingar"
 
-#: engine_dialog.cc:482
+#: engine_dialog.cc:662
 msgid "Hardware output latency:"
 msgstr "Hårdvarans utgångsfördröjning"
 
-#: engine_dialog.cc:493
+#: engine_dialog.cc:673
 msgid "MIDI System:"
 msgstr ""
 
-#: engine_dialog.cc:511
+#: engine_dialog.cc:691
 msgid ""
-"The %1 audio backend was configured and started externally.\n"
-"This limits your control over it."
+"%1 is already running. %2 will connect to it and use the existing settings."
 msgstr ""
 
-#: engine_dialog.cc:564
+#: engine_dialog.cc:744
 msgid ""
 "Failed to start or connect to audio-engine.\n"
 "\n"
 "Latency calibration requires a working audio interface."
 msgstr ""
 
-#: engine_dialog.cc:570
+#: engine_dialog.cc:750
 msgid ""
 "Your selected audio configuration is playback- or capture-only.\n"
 "\n"
 "Latency calibration requires playback and capture"
 msgstr ""
 
-#: engine_dialog.cc:651
+#: engine_dialog.cc:965
 msgid "MIDI Devices"
 msgstr ""
 
-#: engine_dialog.cc:657
+#: engine_dialog.cc:971
 msgid "Device"
 msgstr "Enhet"
 
-#: engine_dialog.cc:659
+#: engine_dialog.cc:973
 msgid "Hardware Latencies"
 msgstr ""
 
-#: engine_dialog.cc:700
+#: engine_dialog.cc:1014
 msgid "Calibrate"
 msgstr ""
 
-#: engine_dialog.cc:800
+#: engine_dialog.cc:1117
 msgid "all available channels"
 msgstr ""
 
-#: engine_dialog.cc:1039 latency_gui.cc:39
-#, fuzzy
-msgid "sample"
-msgid_plural "samples"
-msgstr[0] "sampling"
-msgstr[1] "sampling"
+#: engine_dialog.cc:1599 latency_gui.cc:55
+msgid "%1 sample"
+msgid_plural "%1 samples"
+msgstr[0] ""
+msgstr[1] ""
 
-#: engine_dialog.cc:1090
+#: engine_dialog.cc:1662
 #, c-format
 msgid "(%.1f ms)"
 msgstr ""
 
-#: engine_dialog.cc:1593
+#: engine_dialog.cc:2413
 msgid "Could not start backend engine %1"
 msgstr ""
 
-#: engine_dialog.cc:1644
+#: engine_dialog.cc:2445
 msgid "Cannot set driver to %1"
 msgstr ""
 
-#: engine_dialog.cc:1648
+#: engine_dialog.cc:2450
+msgid "Cannot set input device name to %1"
+msgstr ""
+
+#: engine_dialog.cc:2454
+msgid "Cannot set output device name to %1"
+msgstr ""
+
+#: engine_dialog.cc:2459
 msgid "Cannot set device name to %1"
 msgstr ""
 
-#: engine_dialog.cc:1652
+#: engine_dialog.cc:2464
 msgid "Cannot set sample rate to %1"
 msgstr ""
 
-#: engine_dialog.cc:1656
+#: engine_dialog.cc:2468
 msgid "Cannot set buffer size to %1"
 msgstr ""
 
-#: engine_dialog.cc:1662
+#: engine_dialog.cc:2472
+msgid "Cannot set periods to %1"
+msgstr ""
+
+#: engine_dialog.cc:2478
 msgid "Cannot set input channels to %1"
 msgstr ""
 
-#: engine_dialog.cc:1666
+#: engine_dialog.cc:2482
 msgid "Cannot set output channels to %1"
 msgstr ""
 
-#: engine_dialog.cc:1672
+#: engine_dialog.cc:2488
 msgid "Cannot set input latency to %1"
 msgstr ""
 
-#: engine_dialog.cc:1676
+#: engine_dialog.cc:2492
 msgid "Cannot set output latency to %1"
 msgstr ""
 
-#: engine_dialog.cc:1955 engine_dialog.cc:2014
+#: engine_dialog.cc:2851 engine_dialog.cc:2917
 msgid "No signal detected "
 msgstr ""
 
-#: engine_dialog.cc:1968 engine_dialog.cc:2022 port_insert_ui.cc:70
+#: engine_dialog.cc:2858
+msgid ""
+"Input signal is > -3dBFS. Lower the signal level (output gain, input gain) "
+"on the audio-interface."
+msgstr ""
+
+#: engine_dialog.cc:2871 engine_dialog.cc:2925 port_insert_ui.cc:70
 #: port_insert_ui.cc:98
 msgid "Disconnected from audio engine"
 msgstr ""
 
-#: engine_dialog.cc:1977 engine_dialog.cc:2030
+#: engine_dialog.cc:2880 engine_dialog.cc:2933
 msgid "Detected roundtrip latency: "
 msgstr ""
 
-#: engine_dialog.cc:1979 engine_dialog.cc:2032
+#: engine_dialog.cc:2882 engine_dialog.cc:2935
 msgid "Systemic latency: "
 msgstr ""
 
-#: engine_dialog.cc:1986
+#: engine_dialog.cc:2889
 msgid "(signal detection error)"
 msgstr ""
 
-#: engine_dialog.cc:1992
+#: engine_dialog.cc:2895
 msgid "(inverted - bad wiring)"
 msgstr ""
 
-#: engine_dialog.cc:2039
+#: engine_dialog.cc:2942
 msgid "(averaging)"
 msgstr ""
 
-#: engine_dialog.cc:2045
+#: engine_dialog.cc:2948
 msgid "(too large jitter)"
 msgstr ""
 
-#: engine_dialog.cc:2049
+#: engine_dialog.cc:2952
 msgid "(large jitter)"
 msgstr ""
 
-#: engine_dialog.cc:2061
+#: engine_dialog.cc:2964
 msgid "Timeout - large MIDI jitter."
 msgstr ""
 
-#: engine_dialog.cc:2077 port_insert_ui.cc:134
+#: engine_dialog.cc:2980 port_insert_ui.cc:134
 msgid "Detecting ..."
 msgstr ""
 
-#: engine_dialog.cc:2171
+#: engine_dialog.cc:3081
 msgid "Disconnect from %1"
 msgstr ""
 
-#: engine_dialog.cc:2175 mixer_strip.cc:1522 route_group_dialog.cc:45
-#: route_time_axis.cc:841
-msgid "Active"
-msgstr "Aktiv"
+#: engine_dialog.cc:3086
+msgid "Running"
+msgstr ""
 
-#: engine_dialog.cc:2185
+#: engine_dialog.cc:3088
+msgid "Connected"
+msgstr ""
+
+#: engine_dialog.cc:3099
 msgid "Connect to %1"
 msgstr ""
 
-#: engine_dialog.cc:2190
-msgid "Inactive"
+#: engine_dialog.cc:3103 shuttle_control.cc:655
+msgid "Stopped"
 msgstr ""
 
-#: export_channel_selector.cc:45 sfdb_ui.cc:151
+#: export_channel_selector.cc:46 export_report.cc:159 export_report.cc:324
+#: sfdb_ui.cc:151
 msgid "Channels:"
 msgstr "Kanaler:"
 
-#: export_channel_selector.cc:46
+#: export_channel_selector.cc:47
 msgid "Split to mono files"
 msgstr "Dela upp i monofiler"
 
-#: export_channel_selector.cc:182
+#: export_channel_selector.cc:197
 msgid "Bus or Track"
 msgstr ""
 
-#: export_channel_selector.cc:459
+#: export_channel_selector.cc:474
 msgid "Region contents without fades nor region gain (channels: %1)"
 msgstr ""
 
-#: export_channel_selector.cc:463
+#: export_channel_selector.cc:478
 msgid "Region contents with fades and region gain (channels: %1)"
 msgstr ""
 
-#: export_channel_selector.cc:467
+#: export_channel_selector.cc:482
 msgid "Track output (channels: %1)"
 msgstr ""
 
-#: export_channel_selector.cc:536
-msgid "Export region contents"
+#: export_channel_selector.cc:552
+msgid "Apply track/bus processing"
+msgstr ""
+
+#: export_channel_selector.cc:553
+msgid "Select all tracks"
+msgstr ""
+
+#: export_channel_selector.cc:554
+msgid "Select all busses"
+msgstr ""
+
+#: export_channel_selector.cc:555
+msgid "Deselect all"
 msgstr ""
 
-#: export_channel_selector.cc:537
-msgid "Export track output"
+#: export_channel_selector.cc:589
+msgid "Track name"
 msgstr ""
 
-#: export_dialog.cc:46
+#: export_dialog.cc:48
 msgid ""
 "<span color=\"#ffa755\">Some already existing files will be overwritten.</"
 "span>"
 msgstr ""
 
-#: export_dialog.cc:47
+#: export_dialog.cc:49
 msgid "List files"
 msgstr ""
 
-#: export_dialog.cc:158 export_format_dialog.cc:59
+#: export_dialog.cc:158 export_format_dialog.cc:67
 msgid "File format"
 msgstr ""
 
-#: export_dialog.cc:159 export_timespan_selector.cc:374
-#: export_timespan_selector.cc:436
+#: export_dialog.cc:159 export_timespan_selector.cc:371
+#: export_timespan_selector.cc:433
 msgid "Time Span"
 msgstr "Tidsspann"
 
@@ -6032,45 +6780,57 @@ msgstr ""
 msgid "Stop Export"
 msgstr "Avbryt Export"
 
-#: export_dialog.cc:327
+#: export_dialog.cc:336
 msgid "export"
 msgstr ""
 
-#: export_dialog.cc:346
+#: export_dialog.cc:355
+msgid "Exporting '%3' (timespan %1 of %2)"
+msgstr ""
+
+#: export_dialog.cc:360
 msgid "Normalizing '%3' (timespan %1 of %2)"
 msgstr ""
 
-#: export_dialog.cc:350
-msgid "Exporting '%3' (timespan %1 of %2)"
+#: export_dialog.cc:365
+msgid "Tagging '%3' (timespan %1 of %2)"
 msgstr ""
 
-#: export_dialog.cc:373 export_dialog.cc:375
-msgid "<span color=\"#ffa755\">Error: "
+#: export_dialog.cc:369
+msgid "Uploading '%3' (timespan %1 of %2)"
 msgstr ""
 
-#: export_dialog.cc:385
-msgid "<span color=\"#ffa755\">Warning: "
+#: export_dialog.cc:373
+msgid "Running Post Export Command for '%1'"
 msgstr ""
 
-#: export_dialog.cc:387
-msgid ""
+#: export_dialog.cc:401 export_dialog.cc:403
+msgid "<span color=\"#ffa755\">Error: "
+msgstr ""
+
+#: export_dialog.cc:413
+msgid "<span color=\"#ffa755\">Warning: "
+msgstr ""
+
+#: export_dialog.cc:415
+msgid ""
 "\n"
 "<span color=\"#ffa755\">Warning: "
 msgstr ""
 
-#: export_dialog.cc:411
+#: export_dialog.cc:439
 msgid "Export Selection"
 msgstr ""
 
-#: export_dialog.cc:425
+#: export_dialog.cc:453
 msgid "Export Region"
 msgstr ""
 
-#: export_dialog.cc:434
+#: export_dialog.cc:462
 msgid "Source"
 msgstr ""
 
-#: export_dialog.cc:450
+#: export_dialog.cc:478
 msgid "Stem Export"
 msgstr ""
 
@@ -6078,172 +6838,246 @@ msgstr ""
 msgid "Add another format"
 msgstr ""
 
-#: export_file_notebook.cc:193
+#: export_file_notebook.cc:198
 msgid "Format"
 msgstr ""
 
-#: export_file_notebook.cc:194
+#: export_file_notebook.cc:199
 msgid "Location"
 msgstr "Plats"
 
-#: export_file_notebook.cc:195
+#: export_file_notebook.cc:200
 msgid "Upload to Soundcloud"
 msgstr ""
 
-#: export_file_notebook.cc:273
+#: export_file_notebook.cc:201
+msgid "Analyze Exported Audio"
+msgstr ""
+
+#: export_file_notebook.cc:286
 msgid "No format!"
 msgstr ""
 
-#: export_file_notebook.cc:291
+#: export_file_notebook.cc:304
 msgid "Format %1: %2"
 msgstr ""
 
-#: export_filename_selector.cc:32
+#: export_filename_selector.cc:33
 msgid "Label:"
 msgstr ""
 
-#: export_filename_selector.cc:33
+#: export_filename_selector.cc:34 session_dialog.cc:310
 msgid "Session Name"
 msgstr ""
 
-#: export_filename_selector.cc:34
-msgid "Revision:"
+#: export_filename_selector.cc:35
+msgid "Timespan Name"
 msgstr ""
 
 #: export_filename_selector.cc:36
+msgid "Revision:"
+msgstr ""
+
+#: export_filename_selector.cc:38
 msgid "Folder:"
 msgstr "Mapp:"
 
-#: export_filename_selector.cc:37 session_import_dialog.cc:45
+#: export_filename_selector.cc:39 session_import_dialog.cc:45
 #: transcode_video_dialog.cc:59 video_server_dialog.cc:54
-#: video_server_dialog.cc:56 export_video_dialog.cc:81
-#: export_video_dialog.cc:83
+#: video_server_dialog.cc:56 export_video_dialog.cc:77
+#: export_video_dialog.cc:79
 msgid "Browse"
 msgstr "Bläddra"
 
-#: export_filename_selector.cc:41
-msgid "<i>Build filename(s) from these components:</i>"
+#: export_filename_selector.cc:40 export_report.cc:118
+msgid "Open Folder"
 msgstr ""
 
-#: export_filename_selector.cc:212
+#: export_filename_selector.cc:45
+msgid "Build filename(s) from these components:"
+msgstr ""
+
+#: export_filename_selector.cc:217
 msgid ""
 "<small><i>Sorry, no example filename can be shown at the moment</i></small>"
 msgstr ""
 
-#: export_filename_selector.cc:214
-msgid "<small><i>Current (approximate) filename: \"%1\"</i></small>"
+#: export_filename_selector.cc:219
+msgid "<i>Current (approximate) filename</i>: \"%1\""
 msgstr ""
 
-#: export_filename_selector.cc:250 export_filename_selector.cc:336
+#: export_filename_selector.cc:255 export_filename_selector.cc:402
 msgid ""
 "%1: this is only the directory/folder name, not the filename.\n"
 "The filename will be chosen from the information just above the folder "
 "selector."
 msgstr ""
 
-#: export_filename_selector.cc:322
+#: export_filename_selector.cc:378
+msgid "%1: this is not a valid directory/folder."
+msgstr ""
+
+#: export_filename_selector.cc:388
 msgid "Choose export folder"
 msgstr ""
 
-#: export_format_dialog.cc:31
+#: export_format_dialog.cc:32
 msgid "New Export Format Profile"
 msgstr ""
 
-#: export_format_dialog.cc:31
+#: export_format_dialog.cc:32
 msgid "Edit Export Format Profile"
 msgstr ""
 
-#: export_format_dialog.cc:38
+#: export_format_dialog.cc:39
 msgid "Label: "
 msgstr "Etikett: "
 
-#: export_format_dialog.cc:41 normalize_dialog.cc:42
-msgid "Normalize to:"
-msgstr "Normalisera till"
+#: export_format_dialog.cc:42
+msgid "Normalize:"
+msgstr ""
+
+#: export_format_dialog.cc:43
+msgid "Peak"
+msgstr ""
+
+#: export_format_dialog.cc:44
+msgid "Loudness"
+msgstr ""
+
+#: export_format_dialog.cc:50
+msgid "LUFS"
+msgstr ""
+
+#: export_format_dialog.cc:51
+msgid "dBTP"
+msgstr ""
 
-#: export_format_dialog.cc:46
+#: export_format_dialog.cc:54
 msgid "Trim silence at start"
 msgstr "Beskär tystnad i början"
 
-#: export_format_dialog.cc:47
+#: export_format_dialog.cc:55
 msgid "Add silence at start:"
 msgstr "Lägg till tystnad i början:"
 
-#: export_format_dialog.cc:50
+#: export_format_dialog.cc:58
 msgid "Trim silence at end"
 msgstr "Beskär tystnad i slutet"
 
-#: export_format_dialog.cc:51
+#: export_format_dialog.cc:59
 msgid "Add silence at end:"
 msgstr "Lägg till tystnad i slutet:"
 
-#: export_format_dialog.cc:54
+#: export_format_dialog.cc:62
 msgid ""
 "Command to run post-export\n"
-"(%f=full path & filename, %d=directory, %b=basename):"
+"(%f=file path, %d=directory, %b=basename, see tooltip for more):"
 msgstr ""
 
-#: export_format_dialog.cc:57
+#: export_format_dialog.cc:65
 msgid "Compatibility"
 msgstr "Kompatibilitet"
 
-#: export_format_dialog.cc:58
+#: export_format_dialog.cc:66
 msgid "Quality"
 msgstr "Kvalitet"
 
-#: export_format_dialog.cc:61
+#: export_format_dialog.cc:69
 msgid "Sample rate conversion quality:"
 msgstr ""
 
-#: export_format_dialog.cc:68
+#: export_format_dialog.cc:76
 msgid "Dithering"
 msgstr ""
 
-#: export_format_dialog.cc:70
+#: export_format_dialog.cc:78
 msgid "Create CUE file for disk-at-once CD/DVD creation"
 msgstr ""
 
-#: export_format_dialog.cc:71
+#: export_format_dialog.cc:79
 msgid "Create TOC file for disk-at-once CD/DVD creation"
 msgstr ""
 
-#: export_format_dialog.cc:73
+#: export_format_dialog.cc:80
+msgid "Create chapter mark file for MP4 chapter marks"
+msgstr ""
+
+#: export_format_dialog.cc:82
 msgid "Tag file with session's metadata"
 msgstr ""
 
-#: export_format_dialog.cc:470
+#: export_format_dialog.cc:119
+msgid "∧"
+msgstr ""
+
+#: export_format_dialog.cc:124
+msgid ""
+"Normalize to EBU-R128 LUFS target loudness without exceeding the given true-"
+"peak limit. EBU-R128 normalization is only available for mono and stereo "
+"targets, true-peak works for any channel layout."
+msgstr ""
+
+#: export_format_dialog.cc:152
+msgid ""
+"%a Artist name\n"
+"%b File's base-name\n"
+"%c Copyright\n"
+"%d File's directory\n"
+"%f File's full absolute path\n"
+"%l Lyricist\n"
+"%n Session name\n"
+"%o Conductor\n"
+"%t Title\n"
+"%z Organization\n"
+"%A Album\n"
+"%C Comment\n"
+"%E Engineer\n"
+"%G Genre\n"
+"%L Total track count\n"
+"%M Mixer\n"
+"%N Timespan name\n"
+"%O Composer\n"
+"%P Producer\n"
+"%S Disc subtitle\n"
+"%T Track number\n"
+"%Y Year\n"
+"%Z Country"
+msgstr ""
+
+#: export_format_dialog.cc:537
 msgid "Best (sinc)"
 msgstr ""
 
-#: export_format_dialog.cc:475
+#: export_format_dialog.cc:542
 msgid "Medium (sinc)"
 msgstr ""
 
-#: export_format_dialog.cc:480
+#: export_format_dialog.cc:547
 msgid "Fast (sinc)"
 msgstr ""
 
-#: export_format_dialog.cc:490
+#: export_format_dialog.cc:557
 msgid "Zero order hold"
 msgstr ""
 
-#: export_format_dialog.cc:895
+#: export_format_dialog.cc:981
 msgid "Linear encoding options"
 msgstr ""
 
-#: export_format_dialog.cc:911
+#: export_format_dialog.cc:997
 msgid "Ogg Vorbis options"
 msgstr ""
 
-#: export_format_dialog.cc:922
+#: export_format_dialog.cc:1008
 msgid "FLAC options"
 msgstr ""
 
-#: export_format_dialog.cc:939
+#: export_format_dialog.cc:1025
 msgid "Broadcast Wave options"
 msgstr ""
 
-#: export_format_selector.cc:136
+#: export_format_selector.cc:131
 msgid "Do you really want to remove the format?"
 msgstr ""
 
@@ -6251,29 +7085,200 @@ msgstr ""
 msgid "Preset"
 msgstr ""
 
-#: export_preset_selector.cc:104
+#: export_preset_selector.cc:99
 msgid ""
 "The selected preset did not load successfully!\n"
 "Perhaps it references a format that has been removed?"
 msgstr ""
 
-#: export_preset_selector.cc:156
+#: export_preset_selector.cc:151
 msgid "Do you really want to remove this preset?"
 msgstr ""
 
-#: export_timespan_selector.cc:46
+#: export_report.cc:56
+msgid "Export Report/Analysis"
+msgstr ""
+
+#: export_report.cc:147 export_report.cc:327 sfdb_ui.cc:149
+msgid "Format:"
+msgstr ""
+
+#: export_report.cc:166 export_report.cc:328
+msgid "%1 Hz"
+msgstr ""
+
+#: export_report.cc:169 export_report.cc:336 transcode_video_dialog.cc:139
+msgid "Duration:"
+msgstr ""
+
+#: export_report.cc:177 export_report.cc:334
+msgid "Timecode:"
+msgstr ""
+
+#: export_report.cc:185
+msgid "Error:"
+msgstr ""
+
+#: export_report.cc:220 export_report.cc:440
+msgid "(too short integration time)"
+msgstr ""
+
+#: export_report.cc:222
+msgid "-888"
+msgstr ""
+
+#: export_report.cc:227 export_report.cc:353
+msgid "Peak:"
+msgstr ""
+
+#: export_report.cc:228 export_report.cc:360
+msgid "%1 dBFS"
+msgstr ""
+
+#: export_report.cc:229 export_report.cc:369
+msgid "True Peak:"
+msgstr ""
+
+#: export_report.cc:230 export_report.cc:376
+msgid "%1 dBTP"
+msgstr ""
+
+#: export_report.cc:231 export_report.cc:387
+msgid "Normalization Gain:"
+msgstr ""
+
+#: export_report.cc:232
+msgid "+888.88 dB"
+msgstr ""
+
+#: export_report.cc:234 export_report.cc:448
+msgid "Integrated Loudness:"
+msgstr ""
+
+#: export_report.cc:235 export_report.cc:454
+msgid "%1 LUFS"
+msgstr ""
+
+#: export_report.cc:236 export_report.cc:460
+msgid "Loudness Range:"
+msgstr ""
+
+#: export_report.cc:237 export_report.cc:466
+msgid "%1 LU"
+msgstr ""
+
+#: export_report.cc:247 export_report.cc:754
+msgid "100"
+msgstr ""
+
+#: export_report.cc:282 export_report.cc:650
+msgid "00:00:00.000"
+msgstr ""
+
+#: export_report.cc:288
+msgid "0|A8"
+msgstr ""
+
+#: export_report.cc:394
+msgid "%1 dB"
+msgstr ""
+
+#: export_report.cc:425 export_report.cc:433 export_report.cc:553
+msgid ""
+"Not\n"
+"Available"
+msgstr ""
+
+#: export_report.cc:493
+msgid ""
+"LUFS\n"
+"(short)"
+msgstr ""
+
+#: export_report.cc:503
+msgid "Multiplicity"
+msgstr ""
+
+#: export_report.cc:603
+msgid "Logscale|Lg"
+msgstr ""
+
+#: export_report.cc:604
+msgid "Rectified|Rf"
+msgstr ""
+
+#: export_report.cc:605
+msgid "Logscale"
+msgstr ""
+
+#: export_report.cc:606
+msgid "Rectified"
+msgstr ""
+
+#: export_report.cc:738
+msgid "Hz"
+msgstr ""
+
+#: export_report.cc:755
+msgid "500"
+msgstr ""
+
+#: export_report.cc:756
+msgid "1K"
+msgstr ""
+
+#: export_report.cc:757
+msgid "5K"
+msgstr ""
+
+#: export_report.cc:758
+msgid "10K"
+msgstr ""
+
+#: export_report.cc:844
+msgid "Writing Export Analysis Image: %1."
+msgstr ""
+
+#: export_report.cc:941 sfdb_ui.cc:293 sfdb_ui.cc:409
+msgid "Could not read file: %1 (%2)."
+msgstr "Kunde inte läsa fil: %1 (%2)."
+
+#: export_report.cc:967 sfdb_ui.cc:458
+msgid "Could not access soundfile: "
+msgstr "Dela kanaler"
+
+#: export_report.cc:1203
+msgid "-36"
+msgstr ""
+
+#: export_report.cc:1204 export_report.cc:1208 export_report.cc:1214
+#: export_report.cc:1217
+msgid "-18"
+msgstr ""
+
+#: export_report.cc:1205 export_report.cc:1209 export_report.cc:1215
+#: export_report.cc:1218 export_report.cc:1221 export_report.cc:1222
+msgid "-9"
+msgstr ""
+
+#: export_report.cc:1206 export_report.cc:1210 export_report.cc:1216
+#: export_report.cc:1219 export_report.cc:1223 export_report.cc:1224
+msgid "-3"
+msgstr ""
+
+#: export_timespan_selector.cc:44
 msgid "Show Times as:"
 msgstr "Visa tider som:"
 
-#: export_timespan_selector.cc:53 processor_box.cc:2466
+#: export_timespan_selector.cc:51 processor_box.cc:3683
 msgid "Select All"
 msgstr "Markera allt"
 
-#: export_timespan_selector.cc:223 transform_dialog.cc:93
+#: export_timespan_selector.cc:220 transform_dialog.cc:93
 msgid " to "
 msgstr ""
 
-#: export_timespan_selector.cc:367 export_timespan_selector.cc:426
+#: export_timespan_selector.cc:364 export_timespan_selector.cc:423
 msgid "Range"
 msgstr "Omfång"
 
@@ -6289,36 +7294,39 @@ msgstr ""
 msgid "getSoundResourceFile: root = %1, != response"
 msgstr ""
 
-#: sfdb_freesound_mootcher.cc:410 rc_option_editor.cc:1824
+#: sfdb_freesound_mootcher.cc:410 rc_option_editor.cc:2416
 msgid "%1"
 msgstr ""
 
-#: gain_meter.cc:132 gain_meter.cc:400 gain_meter.cc:505 gain_meter.cc:896
+#: gain_meter.cc:137 gain_meter.cc:422 gain_meter.cc:527 gain_meter.cc:919
 msgid "-inf"
 msgstr ""
 
-#: gain_meter.cc:147 gain_meter.cc:958
+#: gain_meter.cc:152 gain_meter.cc:983
 msgid "Fader automation mode"
 msgstr "Automatiseringsläge för reglage"
 
-#: gain_meter.cc:148 gain_meter.cc:959
+#: gain_meter.cc:153 gain_meter.cc:984
 msgid "Fader automation type"
 msgstr "Automatiseringstyp för reglage"
 
-#: gain_meter.cc:157 gain_meter.cc:829 panner_ui.cc:179 panner_ui.cc:639
+#: gain_meter.cc:162 gain_meter.cc:852 panner_ui.cc:179 panner_ui.cc:641
 msgid "Abs"
 msgstr ""
 
-#: gain_meter.cc:796 mixer_strip.cc:2049 meter_strip.cc:374 panner_ui.cc:606
-#: route_time_axis.cc:104 route_time_axis.cc:2705
+#: gain_meter.cc:816 vca_master_strip.cc:78 vca_time_axis.cc:54
+msgid "M"
+msgstr ""
+
+#: gain_meter.cc:819 vca_master_strip.cc:296
 msgid "P"
 msgstr "U"
 
-#: gain_meter.cc:799 panner_ui.cc:609
+#: gain_meter.cc:822
 msgid "T"
 msgstr "B"
 
-#: gain_meter.cc:802 panner_ui.cc:612
+#: gain_meter.cc:825
 msgid "W"
 msgstr "S"
 
@@ -6326,47 +7334,51 @@ msgstr "S"
 msgid "<span size=\"large\">Presets</span>"
 msgstr "<span size=\"large\">Förinställningar</span>"
 
-#: generic_pluginui.cc:97
+#: generic_pluginui.cc:98 plugin_pin_dialog.cc:333
 msgid "Manual"
 msgstr ""
 
-#: generic_pluginui.cc:106
+#: generic_pluginui.cc:107
 msgid "All Automation"
 msgstr ""
 
 #: generic_pluginui.cc:250
-msgid "Switches"
-msgstr ""
-
-#: generic_pluginui.cc:260 generic_pluginui.cc:436 processor_box.cc:2440
-msgid "Controls"
-msgstr "Kontroller"
-
-#: generic_pluginui.cc:293
 msgid "Plugin Editor: could not build control element for port %1"
 msgstr ""
 "Insticksprogramsredigerare: kunde inte bygga kontrollelement för port%1"
 
-#: generic_pluginui.cc:318
+#: generic_pluginui.cc:282
 msgid "Plugin Editor: no control for property %1"
 msgstr ""
 
-#: generic_pluginui.cc:324
+#: generic_pluginui.cc:288
 msgid "Plugin Editor: could not build control element for property %1"
 msgstr ""
 
-#: generic_pluginui.cc:468
+#: generic_pluginui.cc:359
+msgid "Switches"
+msgstr ""
+
+#: generic_pluginui.cc:369 generic_pluginui.cc:475 processor_box.cc:3653
+msgid "Controls"
+msgstr "Kontroller"
+
+#: generic_pluginui.cc:510
 msgid "Meters"
 msgstr ""
 
-#: generic_pluginui.cc:490
+#: generic_pluginui.cc:548
 msgid "Automation control"
 msgstr "Automatiseringskontroll"
 
-#: generic_pluginui.cc:497
+#: generic_pluginui.cc:555
 msgid "Mgnual"
 msgstr ""
 
+#: generic_pluginui.cc:828
+msgid "This control cannot be automated"
+msgstr ""
+
 #: global_port_matrix.cc:158
 msgid "Audio Connection Manager"
 msgstr "Ljudspårsanslutningar"
@@ -6375,126 +7387,163 @@ msgstr "Ljudspårsanslutningar"
 msgid "MIDI Connection Manager"
 msgstr "MIDI-spåranslutningar"
 
-#: global_port_matrix.cc:201 io_selector.cc:211 mixer_strip.cc:793
-#: mixer_strip.cc:894
+#: global_port_matrix.cc:201 io_selector.cc:211 mixer_strip.cc:863
+#: mixer_strip.cc:966 monitor_section.cc:1430 monitor_selector.cc:189
+#: plugin_pin_dialog.cc:1757
 msgid "Disconnect"
 msgstr "Koppla från"
 
-#: global_port_matrix.cc:207 io_selector.cc:217
+#: global_port_matrix.cc:207 io_selector.cc:217 monitor_selector.cc:195
 msgid "port"
 msgstr ""
 
-#: group_tabs.cc:312
+#: group_tabs.cc:312 group_tabs.cc:321
 msgid "Selection..."
 msgstr "Markering..."
 
-#: group_tabs.cc:313
+#: group_tabs.cc:313 group_tabs.cc:322
 msgid "Record Enabled..."
 msgstr "Inspelningsläge"
 
-#: group_tabs.cc:314
+#: group_tabs.cc:314 group_tabs.cc:323
 msgid "Soloed..."
 msgstr "Solad..."
 
-#: group_tabs.cc:320
+#: group_tabs.cc:316
+msgid "Create New Group From..."
+msgstr ""
+
+#: group_tabs.cc:325
+msgid "Create New Group with Master From..."
+msgstr ""
+
+#: group_tabs.cc:344
 msgid "Create New Group ..."
 msgstr ""
 
-#: group_tabs.cc:321
-msgid "Create New Group From"
+#: group_tabs.cc:345
+msgid "Create New Group with Control Master ..."
 msgstr ""
 
-#: group_tabs.cc:324
+#: group_tabs.cc:355
 msgid "Edit Group..."
 msgstr ""
 
-#: group_tabs.cc:325
+#: group_tabs.cc:356
 msgid "Collect Group"
 msgstr ""
 
-#: group_tabs.cc:326
+#: group_tabs.cc:357
 msgid "Remove Group"
 msgstr ""
 
-#: group_tabs.cc:329
+#: group_tabs.cc:368
+msgid "Assign Group to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:374
 msgid "Remove Subgroup Bus"
 msgstr ""
 
-#: group_tabs.cc:331
+#: group_tabs.cc:376
 msgid "Add New Subgroup Bus"
 msgstr ""
 
-#: group_tabs.cc:333
+#: group_tabs.cc:378
 msgid "Add New Aux Bus (pre-fader)"
 msgstr ""
 
-#: group_tabs.cc:334
+#: group_tabs.cc:379
 msgid "Add New Aux Bus (post-fader)"
 msgstr ""
 
-#: group_tabs.cc:340
+#: group_tabs.cc:404
+msgid "Assign Selection to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:415
+msgid "Assign Record Enabled to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:426
+msgid "Assign Soloed to Control Master..."
+msgstr ""
+
+#: group_tabs.cc:429
 msgid "Enable All Groups"
 msgstr ""
 
-#: group_tabs.cc:341
+#: group_tabs.cc:430
 msgid "Disable All Groups"
 msgstr ""
 
-#: insert_time_dialog.cc:46
+#: insert_remove_time_dialog.cc:52
+msgid "Time to remove"
+msgstr ""
+
+#: insert_remove_time_dialog.cc:52
 msgid "Time to insert:"
 msgstr ""
 
-#: insert_time_dialog.cc:54
+#: insert_remove_time_dialog.cc:61
 msgid "Intersected regions should:"
 msgstr ""
 
-#: insert_time_dialog.cc:57
+#: insert_remove_time_dialog.cc:64
 msgid "stay in position"
 msgstr ""
 
-#: insert_time_dialog.cc:58
+#: insert_remove_time_dialog.cc:65
 msgid "move"
 msgstr ""
 
-#: insert_time_dialog.cc:59
+#: insert_remove_time_dialog.cc:66
 msgid "be split"
 msgstr ""
 
-#: insert_time_dialog.cc:65
-msgid "Insert time on all the track's playlists"
+#: insert_remove_time_dialog.cc:73
+msgid "Apply to all the track's playlists"
 msgstr ""
 
-#: insert_time_dialog.cc:68
+#: insert_remove_time_dialog.cc:76
 msgid "Move glued regions"
 msgstr ""
 
-#: insert_time_dialog.cc:70
+#: insert_remove_time_dialog.cc:78
 msgid "Move markers"
 msgstr ""
 
-#: insert_time_dialog.cc:73
+#: insert_remove_time_dialog.cc:81
 msgid "Move glued markers"
 msgstr ""
 
-#: insert_time_dialog.cc:78
+#: insert_remove_time_dialog.cc:86
 msgid "Move locked markers"
 msgstr ""
 
-#: insert_time_dialog.cc:83
+#: insert_remove_time_dialog.cc:91
 msgid ""
 "Move tempo and meter changes\n"
 "<i>(may cause oddities in the tempo map)</i>"
 msgstr ""
 
-#: insert_time_dialog.cc:91
+#: insert_remove_time_dialog.cc:99
+msgid "Remove time"
+msgstr ""
+
+#: insert_remove_time_dialog.cc:99
 msgid "Insert time"
 msgstr ""
 
-#: instrument_selector.cc:62
+#: insert_remove_time_dialog.cc:174
+msgid "Invalid or zero duration entered. Please enter a valid duration"
+msgstr ""
+
+#: instrument_selector.cc:92
 msgid "-none-"
 msgstr ""
 
-#: interthread_progress_window.cc:103
+#: interthread_progress_window.cc:114
 msgid "Importing file: %1 of %2"
 msgstr ""
 
@@ -6502,66 +7551,92 @@ msgstr ""
 msgid "I/O selector"
 msgstr ""
 
-#: io_selector.cc:266
+#: io_selector.cc:266 monitor_selector.cc:244
 msgid "%1 input"
 msgstr "%1-ingång"
 
-#: io_selector.cc:268
+#: io_selector.cc:268 monitor_selector.cc:246
 msgid "%1 output"
 msgstr "%1-utgång"
 
-#: keyboard.cc:70
+#: keyboard.cc:93
 msgid "your own"
 msgstr "egen"
 
-#: keyboard.cc:133 keyboard.cc:157
+#: keyboard.cc:157 keyboard.cc:181
 msgid "Default keybindings not found - %1 will be hard to use!"
 msgstr ""
 
-#: keyboard.cc:136
+#: keyboard.cc:160
 msgid "Key bindings file \"%1\" not found. Default bindings used instead"
 msgstr ""
 
-#: keyeditor.cc:54
-msgid "Remove shortcut"
-msgstr "Ta bort kortkommando"
+#: keyboard.cc:193
+msgid "Loading keybindings from %1"
+msgstr ""
 
-#: keyeditor.cc:63
-msgid "Action"
-msgstr "Händelse"
+#: keyeditor.cc:67
+msgid "Colliding keybindings"
+msgstr ""
 
-#: keyeditor.cc:64
-msgid "Shortcut"
-msgstr "Kortkommando"
+#: keyeditor.cc:68
+msgid ""
+"The key sequence is already bound. Please remove the other binding first."
+msgstr ""
+
+#: keyeditor.cc:77
+msgid "Key Bindings"
+msgstr "Kortkommandon"
 
-#: keyeditor.cc:84
-msgid "Select an action, then press the key(s) to (re)set its shortcut"
-msgstr "Välj en händelse och tryck tangentkombinationen du vill använda"
+#: keyeditor.cc:78
+msgid "Remove shortcut"
+msgstr "Ta bort kortkommando"
 
-#: keyeditor.cc:98
-msgid "Reset Bindings to Defaults"
+#: keyeditor.cc:80
+msgid "Search..."
 msgstr ""
 
-#: keyeditor.cc:263
-msgid "Main_menu"
+#: keyeditor.cc:82
+msgid "Print"
 msgstr ""
 
-#: keyeditor.cc:265
-msgid "redirectmenu"
+#: keyeditor.cc:93
+msgid "Click to reset search string"
 msgstr ""
 
-#: keyeditor.cc:267
-msgid "Editor_menus"
+#: keyeditor.cc:97
+msgid "To remove a shortcut select an action then press this: "
 msgstr ""
 
-#: keyeditor.cc:269
+#: keyeditor.cc:109
+msgid "Reset Bindings to Defaults"
+msgstr ""
+
+#: keyeditor.cc:227 lua_script_manager.cc:41
+msgid "Action"
+msgstr "Händelse"
+
+#: keyeditor.cc:228
+msgid "Shortcut"
+msgstr "Kortkommando"
+
+#: keyeditor.cc:370
 msgid "RegionList"
 msgstr ""
 
-#: keyeditor.cc:271
-msgid "ProcessorMenu"
+#: keyeditor.cc:543
+msgid "Could not open temporary file to print bindings (%1)"
+msgstr ""
+
+#: keyeditor.cc:561
+msgid "Could not save bindings to file (%1)"
 msgstr ""
 
+#: latency_gui.cc:39
+#, fuzzy
+msgid "sample"
+msgstr "sample"
+
 #: latency_gui.cc:40
 msgid "msec"
 msgstr "msek"
@@ -6570,188 +7645,317 @@ msgstr "msek"
 msgid "period"
 msgstr ""
 
-#: latency_gui.cc:55
-msgid "%1 sample"
-msgid_plural "%1 samples"
-msgstr[0] ""
-msgstr[1] ""
-
-#: latency_gui.cc:72 panner_ui.cc:409
+#: latency_gui.cc:72 panner_ui.cc:411 plugin_pin_dialog.cc:109
+#: plugin_ui.cc:421
 msgid "Reset"
 msgstr "Nollställ"
 
-#: latency_gui.cc:149 rhythm_ferret.cc:273 sfdb_ui.cc:1912
+#: latency_gui.cc:149 rhythm_ferret.cc:295 sfdb_ui.cc:1878
 msgid "programming error: %1 (%2)"
 msgstr ""
 
-#: location_ui.cc:52 location_ui.cc:54
+#: location_ui.cc:54 location_ui.cc:57
 msgid "Use PH"
 msgstr "Använd SM"
 
-#: location_ui.cc:59
+#: location_ui.cc:55 location_ui.cc:58
+msgid "Goto"
+msgstr ""
+
+#: location_ui.cc:63
 msgid "Glue"
 msgstr "Klistra"
 
-#: location_ui.cc:87
+#: location_ui.cc:88
 msgid "Performer:"
 msgstr ""
 
-#: location_ui.cc:88
+#: location_ui.cc:89
 msgid "Composer:"
 msgstr ""
 
-#: location_ui.cc:90
+#: location_ui.cc:91
 msgid "Pre-Emphasis"
 msgstr ""
 
-#: location_ui.cc:317
+#: location_ui.cc:319
 msgid "Remove this range"
 msgstr ""
 
-#: location_ui.cc:318
+#: location_ui.cc:320
 msgid "Start time - middle click to locate here"
 msgstr ""
 
-#: location_ui.cc:319
+#: location_ui.cc:321
 msgid "End time - middle click to locate here"
 msgstr ""
 
-#: location_ui.cc:322
+#: location_ui.cc:324
 msgid "Set range start from playhead location"
 msgstr ""
 
-#: location_ui.cc:323
+#: location_ui.cc:325
 msgid "Set range end from playhead location"
 msgstr ""
 
-#: location_ui.cc:327
+#: location_ui.cc:329
 msgid "Remove this marker"
 msgstr ""
 
-#: location_ui.cc:328
+#: location_ui.cc:330
 msgid "Position - middle click to locate here"
 msgstr ""
 
-#: location_ui.cc:330
+#: location_ui.cc:332
 msgid "Set marker time from playhead location"
 msgstr ""
 
-#: location_ui.cc:499
+#: location_ui.cc:524
 msgid "You cannot put a CD marker at the start of the session"
 msgstr ""
 
-#: location_ui.cc:725
+#: location_ui.cc:750
 msgid "New Marker"
 msgstr "Ny markör"
 
-#: location_ui.cc:726
+#: location_ui.cc:751
 msgid "New Range"
 msgstr "Nytt omfång"
 
-#: location_ui.cc:739
+#: location_ui.cc:764
 msgid "<b>Loop/Punch Ranges</b>"
 msgstr "<b>Loop-/inslagsomfång</b>"
 
-#: location_ui.cc:764
+#: location_ui.cc:790
 msgid "<b>Markers (Including CD Index)</b>"
 msgstr "<b>Markörer (inkl CD-index)</b>"
 
-#: location_ui.cc:799
+#: location_ui.cc:825
 msgid "<b>Ranges (Including CD Track Ranges)</b>"
 msgstr "<b>Omfång (inkl CD-spårsomfång)</b>"
 
-#: location_ui.cc:1042
+#: location_ui.cc:1068
 msgid "add range marker"
 msgstr "lägg till omfångsmarkör"
 
-#: main.cc:82
-msgid "%1 could not connect to the audio backend."
+#: lua_script_manager.cc:31
+msgid "Add/Set"
 msgstr ""
 
-#: main.cc:107 main.cc:123
-msgid "The audio backend (%1) has failed, or terminated"
+#: lua_script_manager.cc:34
+msgid "Call"
 msgstr ""
 
-#: main.cc:110
-msgid ""
-"%2 exited unexpectedly, and without notifying %1.\n"
-"\n"
-"This could be due to misconfiguration or to an error inside %2.\n"
-"\n"
-"Click OK to exit %1."
+#: lua_script_manager.cc:35
+msgid "New Hook"
 msgstr ""
 
-#: main.cc:124
-msgid "%2 exited unexpectedly, and without notifying %1."
+#: lua_script_manager.cc:77
+msgid "Signal(s)"
 msgstr ""
 
-#: main.cc:219
-msgid ""
-"\n"
-"   %1 could not understand your command line      "
+#: lua_script_manager.cc:127
+msgid "Action %1"
 msgstr ""
 
-#: main.cc:221
-msgid "An error was encountered while launching %1"
+#: lua_script_manager.cc:132 lua_script_manager.cc:227
+msgid "Unset"
 msgstr ""
 
-#: main.cc:310
-msgid " (built using "
+#: luainstance.cc:1079
+msgid "Cannot read script '%1': %2"
 msgstr ""
 
-#: main.cc:313
-msgid " and GCC version "
-msgstr " och GCC version "
+#: luawindow.cc:97
+msgid "Run"
+msgstr ""
 
-#: main.cc:323
-msgid "Copyright (C) 1999-2012 Paul Davis"
+#: luawindow.cc:98
+msgid "Clear Output"
 msgstr ""
 
-#: main.cc:324
-msgid ""
-"Some portions Copyright (C) Steve Harris, Ari Johnson, Brett Viren, Joel "
-"Baker, Robin Gareus"
+#: luawindow.cc:102
+msgid "Revert"
 msgstr ""
 
-#: main.cc:326
-msgid "%1 comes with ABSOLUTELY NO WARRANTY"
+#: luawindow.cc:166
+msgid "Select Editor Buffer"
 msgstr ""
 
-#: main.cc:327
-msgid "not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+#: luawindow.cc:253 luawindow.cc:258
+msgid "Window|Lua"
 msgstr ""
 
-#: main.cc:328
-msgid "This is free software, and you are welcome to redistribute it "
+#: luawindow.cc:286 luawindow.cc:304
+msgid "LuaException: %1"
 msgstr ""
 
-#: main.cc:329
-msgid "under certain conditions; see the source for copying conditions."
+#: luawindow.cc:342
+msgid "Deleted %1"
 msgstr ""
 
-#: main.cc:334
-msgid "could not initialize %1."
+#: luawindow.cc:345
+msgid "Failed to delete %1"
 msgstr ""
 
-#: main.cc:344
-msgid "Cannot xinstall SIGPIPE error handler"
+#: luawindow.cc:411
+msgid ""
+"Missing script header.\n"
+"The script requires an '{ardour}' info table and a 'factory' function."
 msgstr ""
 
-#: main.cc:351
-msgid "could not create %1 GUI"
+#: luawindow.cc:416
+msgid "Script fails to compile."
 msgstr ""
 
-#: main_clock.cc:52
-msgid "Display delta to edit cursor"
+#: luawindow.cc:423
+msgid "Invalid or missing script-name or script-type."
 msgstr ""
 
-#: marker.cc:273
-msgid "MarkerText"
-msgstr "MarkörText"
+#: luawindow.cc:428
+msgid ""
+"Invalid script-type.\n"
+"Valid types are 'EditorAction' and 'Snippet'."
+msgstr ""
 
-#: midi_channel_selector.cc:161 midi_channel_selector.cc:400
-#: midi_channel_selector.cc:436 rc_option_editor.cc:1573
-#: rc_option_editor.cc:2203 sfdb_ui.cc:665
+#: luawindow.cc:439 luawindow.cc:490
+msgid "Saved as %1"
+msgstr ""
+
+#: luawindow.cc:442 luawindow.cc:493
+msgid "Error saving file: %1"
+msgstr ""
+
+#: luawindow.cc:452
+msgid ""
+"Script with given name '%1' already exists.\n"
+"Use a different name in the descriptor."
+msgstr ""
+
+#: luawindow.cc:636
+msgid "Scratch Buffer %1"
+msgstr ""
+
+#: luawindow.cc:638
+msgid "Action: '%1'"
+msgstr ""
+
+#: luawindow.cc:640
+msgid "Snippet: %1"
+msgstr ""
+
+#: luawindow.cc:652
+msgid "Save as"
+msgstr ""
+
+#: main.cc:88
+msgid "%1 could not connect to the audio backend."
+msgstr ""
+
+#: main.cc:135 main.cc:151
+msgid "The audio backend (%1) has failed, or terminated"
+msgstr ""
+
+#: main.cc:138
+msgid ""
+"%2 exited unexpectedly, and without notifying %1.\n"
+"\n"
+"This could be due to misconfiguration or to an error inside %2.\n"
+"\n"
+"Click OK to exit %1."
+msgstr ""
+
+#: main.cc:152
+msgid "%2 exited unexpectedly, and without notifying %1."
+msgstr ""
+
+#: main.cc:247
+msgid ""
+"\n"
+"   %1 could not understand your command line      "
+msgstr ""
+
+#: main.cc:249
+msgid "An error was encountered while launching %1"
+msgstr ""
+
+#: main.cc:344
+msgid " (built using "
+msgstr ""
+
+#: main.cc:347
+msgid " and GCC version "
+msgstr " och GCC version "
+
+#: main.cc:357
+msgid "Copyright (C) 1999-2015 Paul Davis"
+msgstr ""
+
+#: main.cc:358
+msgid ""
+"Some portions Copyright (C) Steve Harris, Ari Johnson, Brett Viren, Joel "
+"Baker, Robin Gareus"
+msgstr ""
+
+#: main.cc:360
+msgid "%1 comes with ABSOLUTELY NO WARRANTY"
+msgstr ""
+
+#: main.cc:361
+msgid "not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+msgstr ""
+
+#: main.cc:362
+msgid "This is free software, and you are welcome to redistribute it "
+msgstr ""
+
+#: main.cc:363
+msgid "under certain conditions; see the source for copying conditions."
+msgstr ""
+
+#: main.cc:368
+msgid "could not initialize %1."
+msgstr ""
+
+#: main.cc:378
+msgid "Cannot xinstall SIGPIPE error handler"
+msgstr ""
+
+#: main.cc:385
+msgid "Could not complete pre-GUI initialization"
+msgstr ""
+
+#: main.cc:392
+msgid "could not create %1 GUI"
+msgstr ""
+
+#: main_clock.cc:51
+msgid "Display delta to edit cursor"
+msgstr ""
+
+#: main_clock.cc:66 tempo_dialog.cc:55
+msgid "Edit Tempo"
+msgstr ""
+
+#: main_clock.cc:67 tempo_dialog.cc:429
+msgid "Edit Meter"
+msgstr ""
+
+#: main_clock.cc:68
+msgid "Insert Tempo Change"
+msgstr ""
+
+#: main_clock.cc:69
+msgid "Insert Meter Change"
+msgstr ""
+
+#: marker.cc:280
+msgid "MarkerText"
+msgstr "MarkörText"
+
+#: midi_channel_selector.cc:161 midi_channel_selector.cc:400
+#: midi_channel_selector.cc:436 rc_option_editor.cc:2157
+#: rc_option_editor.cc:2799 sfdb_ui.cc:671
 msgid "None"
 msgstr "Ingen"
 
@@ -6832,11 +8036,11 @@ msgstr ""
 msgid "Click to force all MIDI channel messages to channel %1"
 msgstr ""
 
-#: midi_channel_selector.cc:718
+#: midi_channel_selector.cc:720
 msgid "Click to toggle recording of channel %1"
 msgstr ""
 
-#: midi_channel_selector.cc:726
+#: midi_channel_selector.cc:728
 msgid "Click to force all recorded channels to %1"
 msgstr ""
 
@@ -6948,192 +8152,188 @@ msgstr ""
 msgid "velocity edit"
 msgstr ""
 
-#: midi_region_view.cc:954
+#: midi_region_view.cc:962
 msgid "add note"
 msgstr ""
 
-#: midi_region_view.cc:1885
+#: midi_region_view.cc:1904
 msgid "step add"
 msgstr ""
 
-#: midi_region_view.cc:1979 midi_region_view.cc:2002
+#: midi_region_view.cc:1998 midi_region_view.cc:2021
 msgid "alter patch change"
 msgstr ""
 
-#: midi_region_view.cc:2038
+#: midi_region_view.cc:2057
 msgid "add patch change"
 msgstr ""
 
-#: midi_region_view.cc:2060 midi_region_view.cc:2061
+#: midi_region_view.cc:2079 midi_region_view.cc:2080
 msgid "move patch change"
 msgstr ""
 
-#: midi_region_view.cc:2073 midi_region_view.cc:2074
+#: midi_region_view.cc:2092 midi_region_view.cc:2093
 msgid "delete patch change"
 msgstr ""
 
-#: midi_region_view.cc:2112
+#: midi_region_view.cc:2131
 msgid "delete selection"
 msgstr ""
 
-#: midi_region_view.cc:2128
+#: midi_region_view.cc:2148
 msgid "delete note"
 msgstr ""
 
-#: midi_region_view.cc:2587
+#: midi_region_view.cc:2589
 msgid "move notes"
 msgstr ""
 
-#: midi_region_view.cc:3070
+#: midi_region_view.cc:3139
 msgid "change velocities"
 msgstr ""
 
-#: midi_region_view.cc:3136
+#: midi_region_view.cc:3205
 msgid "transpose"
 msgstr ""
 
-#: midi_region_view.cc:3164
+#: midi_region_view.cc:3233
 msgid "change note lengths"
 msgstr ""
 
-#: midi_region_view.cc:3240
+#: midi_region_view.cc:3309
 msgid "nudge"
 msgstr ""
 
-#: midi_region_view.cc:3255
+#: midi_region_view.cc:3324
 msgid "change channel"
 msgstr ""
 
-#: midi_region_view.cc:3295
+#: midi_region_view.cc:3372
 msgid "Bank "
 msgstr ""
 
-#: midi_region_view.cc:3296
-msgid "Program "
-msgstr ""
-
-#: midi_region_view.cc:3297
+#: midi_region_view.cc:3374
 msgid "Channel "
 msgstr ""
 
-#: midi_region_view.cc:3484
+#: midi_region_view.cc:3561
 msgid "paste"
 msgstr "klistra"
 
-#: midi_streamview.cc:185
+#: midi_streamview.cc:184
 msgid "attempt to display MIDI region with no source"
 msgstr ""
 
-#: midi_streamview.cc:195
+#: midi_streamview.cc:194
 msgid "attempt to display MIDI region with no model"
 msgstr ""
 
-#: midi_streamview.cc:506
+#: midi_streamview.cc:505
 msgid "failed to create MIDI region"
 msgstr ""
 
-#: midi_time_axis.cc:309
+#: midi_time_axis.cc:306
 msgid "External MIDI Device"
 msgstr ""
 
-#: midi_time_axis.cc:310
+#: midi_time_axis.cc:307
 msgid "External Device Mode"
 msgstr ""
 
-#: midi_time_axis.cc:318
+#: midi_time_axis.cc:315
 msgid "Chns"
 msgstr ""
 
-#: midi_time_axis.cc:320
+#: midi_time_axis.cc:317
 msgid "Click to edit channel settings"
 msgstr ""
 
-#: midi_time_axis.cc:519
+#: midi_time_axis.cc:516
 msgid "Show Full Range"
 msgstr "Visa hela omfånget"
 
-#: midi_time_axis.cc:524
+#: midi_time_axis.cc:521
 msgid "Fit Contents"
 msgstr "Anpassa innehållet"
 
-#: midi_time_axis.cc:528
+#: midi_time_axis.cc:525
 msgid "Note Range"
 msgstr ""
 
-#: midi_time_axis.cc:529
+#: midi_time_axis.cc:526
 msgid "Note Mode"
 msgstr ""
 
-#: midi_time_axis.cc:530
+#: midi_time_axis.cc:527
 msgid "Channel Selector"
 msgstr ""
 
-#: midi_time_axis.cc:535
+#: midi_time_axis.cc:532
 msgid "Color Mode"
 msgstr ""
 
-#: midi_time_axis.cc:594
+#: midi_time_axis.cc:591
 msgid "Bender"
 msgstr ""
 
-#: midi_time_axis.cc:598
+#: midi_time_axis.cc:595
 msgid "Pressure"
 msgstr ""
 
-#: midi_time_axis.cc:610
+#: midi_time_axis.cc:607
 msgid "Controllers"
 msgstr ""
 
-#: midi_time_axis.cc:615
+#: midi_time_axis.cc:612
 msgid "No MIDI Channels selected"
 msgstr ""
 
-#: midi_time_axis.cc:672 midi_time_axis.cc:801
+#: midi_time_axis.cc:669 midi_time_axis.cc:798
 msgid "Hide all channels"
 msgstr ""
 
-#: midi_time_axis.cc:676 midi_time_axis.cc:805
+#: midi_time_axis.cc:673 midi_time_axis.cc:802
 msgid "Show all channels"
 msgstr ""
 
-#: midi_time_axis.cc:687 midi_time_axis.cc:816
+#: midi_time_axis.cc:684 midi_time_axis.cc:813
 msgid "Channel %1"
 msgstr ""
 
-#: midi_time_axis.cc:942 midi_time_axis.cc:974
+#: midi_time_axis.cc:939 midi_time_axis.cc:971
 msgid "Controllers %1-%2"
 msgstr ""
 
-#: midi_time_axis.cc:965 midi_time_axis.cc:968
+#: midi_time_axis.cc:962 midi_time_axis.cc:965
 msgid "Controller %1"
 msgstr ""
 
-#: midi_time_axis.cc:991
+#: midi_time_axis.cc:988
 msgid "Sustained"
 msgstr ""
 
-#: midi_time_axis.cc:998
+#: midi_time_axis.cc:995
 msgid "Percussive"
 msgstr ""
 
-#: midi_time_axis.cc:1018
+#: midi_time_axis.cc:1015
 msgid "Meter Colors"
 msgstr ""
 
-#: midi_time_axis.cc:1025
+#: midi_time_axis.cc:1022
 msgid "Channel Colors"
 msgstr ""
 
-#: midi_time_axis.cc:1032
+#: midi_time_axis.cc:1029
 msgid "Track Color"
 msgstr ""
 
-#: midi_time_axis.cc:1606 midi_time_axis.cc:1612 midi_time_axis.cc:1622
-#: midi_time_axis.cc:1628
+#: midi_time_axis.cc:1610 midi_time_axis.cc:1616 midi_time_axis.cc:1626
+#: midi_time_axis.cc:1632
 msgid "all"
 msgstr ""
 
-#: midi_time_axis.cc:1609 midi_time_axis.cc:1625
+#: midi_time_axis.cc:1613 midi_time_axis.cc:1629
 msgid "some"
 msgstr ""
 
@@ -7149,7 +8349,7 @@ msgstr ""
 msgid "Decimal"
 msgstr ""
 
-#: midi_tracer.cc:57 rc_option_editor.cc:740
+#: midi_tracer.cc:57 rc_option_editor.cc:1356
 msgid "Enabled"
 msgstr "Aktiverad"
 
@@ -7165,35 +8365,36 @@ msgstr ""
 msgid "New velocity"
 msgstr ""
 
-#: missing_file_dialog.cc:35
+#: missing_file_dialog.cc:36
 msgid "Missing File"
 msgstr ""
 
-#: missing_file_dialog.cc:37
+#: missing_file_dialog.cc:38
 msgid "Select a folder to search"
 msgstr ""
 
-#: missing_file_dialog.cc:38
+#: missing_file_dialog.cc:39
 msgid "Add chosen folder to search path, and try again"
 msgstr ""
 
-#: missing_file_dialog.cc:40
+#: missing_file_dialog.cc:41
 msgid "Stop loading this session"
 msgstr ""
 
-#: missing_file_dialog.cc:41
+#: missing_file_dialog.cc:42
 msgid "Skip all missing files"
 msgstr ""
 
-#: missing_file_dialog.cc:42
+#: missing_file_dialog.cc:43
 msgid "Skip this file"
 msgstr ""
 
-#: missing_file_dialog.cc:53
+#: missing_file_dialog.cc:57 tempo_dialog.cc:135 tempo_dialog.cc:136
+#: tempo_dialog.cc:484 tempo_dialog.cc:485
 msgid "audio"
 msgstr "ljud"
 
-#: missing_file_dialog.cc:70
+#: missing_file_dialog.cc:74
 msgid ""
 "%1 cannot find the %2 file\n"
 "\n"
@@ -7205,7 +8406,7 @@ msgid ""
 "\n"
 msgstr ""
 
-#: missing_file_dialog.cc:104
+#: missing_file_dialog.cc:108
 msgid "Click to choose an additional folder"
 msgstr ""
 
@@ -7213,516 +8414,706 @@ msgstr ""
 msgid "Missing Plugins"
 msgstr ""
 
-#: missing_plugin_dialog.cc:33 transcode_video_dialog.cc:60
+#: missing_plugin_dialog.cc:36 transcode_video_dialog.cc:60
 msgid "OK"
 msgstr ""
 
-#: mixer_actor.cc:55
-msgid "Toggle Solo on Mixer-Selected Tracks/Busses"
-msgstr ""
-
-#: mixer_actor.cc:56
-msgid "Toggle Mute on Mixer-Selected Tracks/Busses"
-msgstr ""
-
-#: mixer_actor.cc:57
-msgid "Toggle Rec-enable on Mixer-Selected Tracks/Busses"
-msgstr ""
-
-#: mixer_actor.cc:58
-msgid "Decrease Gain on Mixer-Selected Tracks/Busses"
-msgstr ""
-
-#: mixer_actor.cc:59
-msgid "Increase Gain on Mixer-Selected Tracks/Busses"
-msgstr ""
-
-#: mixer_actor.cc:60
-msgid "Set Gain to 0dB on Mixer-Selected Tracks/Busses"
-msgstr ""
-
-#: mixer_actor.cc:63
-msgid "Copy Selected Processors"
-msgstr ""
-
-#: mixer_actor.cc:64
-msgid "Cut Selected Processors"
-msgstr ""
-
-#: mixer_actor.cc:65
-msgid "Paste Selected Processors"
-msgstr ""
-
-#: mixer_actor.cc:66
-msgid "Delete Selected Processors"
-msgstr ""
-
-#: mixer_actor.cc:67
-msgid "Select All (visible) Processors"
-msgstr ""
-
-#: mixer_actor.cc:68
-msgid "Toggle Selected Processors"
-msgstr ""
-
-#: mixer_actor.cc:69
-msgid "Toggle Selected Plugins"
-msgstr ""
-
-#: mixer_actor.cc:70
-msgid "Deselect all strips and processors"
-msgstr ""
-
-#: mixer_actor.cc:72 mixer_actor.cc:73
-msgid "Scroll Mixer Window to the left"
-msgstr ""
-
-#: mixer_actor.cc:75
-msgid "Toggle MIDI Input Active for Mixer-Selected Tracks/Busses"
-msgstr ""
-
-#: mixer_actor.cc:90
-msgid "Loaded mixer bindings from %1"
+#: missing_plugin_dialog.cc:42
+msgid ""
+"This session contains the following plugins that cannot be found on this "
+"system:\n"
+"\n"
 msgstr ""
 
-#: mixer_actor.cc:92
-msgid "Could not find mixer.bindings in search path %1"
+#: missing_plugin_dialog.cc:48
+msgid ""
+"\n"
+"Those plugins will be replaced with inactive stubs.\n"
+"It is recommended that you install the missing plugins and re-load the "
+"session.\n"
+"(also check the blacklist, Window > Log and Preferences > Plugins)"
 msgstr ""
 
-#: mixer_strip.cc:96 mixer_strip.cc:125
+#: mixer_strip.cc:100 mixer_strip.cc:133
 msgid "pre"
 msgstr "pre"
 
-#: mixer_strip.cc:98 mixer_strip.cc:127 mixer_strip.cc:372 mixer_strip.cc:1410
-#: rc_option_editor.cc:2331
+#: mixer_strip.cc:104 mixer_strip.cc:136 mixer_strip.cc:397
+#: mixer_strip.cc:1540 mixer_strip.cc:1551 rc_option_editor.cc:3140
 msgid "Comments"
 msgstr ""
 
-#: mixer_strip.cc:149
+#: mixer_strip.cc:160
 msgid "Click to toggle the width of this mixer strip."
 msgstr ""
 
-#: mixer_strip.cc:151
+#: mixer_strip.cc:162
 msgid ""
 "\n"
 "%1-%2-click to toggle the width of all strips."
 msgstr ""
 
-#: mixer_strip.cc:158
+#: mixer_strip.cc:171
 msgid "Hide this mixer strip"
 msgstr ""
 
-#: mixer_strip.cc:169
+#: mixer_strip.cc:182
 msgid "Click to select metering point"
 msgstr ""
 
-#: mixer_strip.cc:185
+#: mixer_strip.cc:198
 msgid "Isolate Solo"
 msgstr ""
 
-#: mixer_strip.cc:193
+#: mixer_strip.cc:206
 msgid "Lock Solo Status"
 msgstr ""
 
-#: mixer_strip.cc:196 mixer_strip.cc:2027
+#: mixer_strip.cc:208 mixer_strip.cc:2217
+msgid "SoloLock|Lock"
+msgstr ""
+
+#: mixer_strip.cc:209 mixer_strip.cc:2216
 msgid "Iso"
 msgstr ""
 
-#: mixer_strip.cc:250
+#: mixer_strip.cc:263
 msgid "Mix group"
 msgstr "Mixgrupp"
 
-#: mixer_strip.cc:368 rc_option_editor.cc:2327
+#: mixer_strip.cc:275
+msgid "Trim: "
+msgstr ""
+
+#: mixer_strip.cc:393 rc_option_editor.cc:3136
 msgid "Phase Invert"
 msgstr ""
 
-#: mixer_strip.cc:369 rc_option_editor.cc:2328
+#: mixer_strip.cc:394 rc_option_editor.cc:3137
 msgid "Record & Monitor"
 msgstr ""
 
-#: mixer_strip.cc:370 rc_option_editor.cc:2329
+#: mixer_strip.cc:395 rc_option_editor.cc:3138
 msgid "Solo Iso / Lock"
 msgstr ""
 
-#: mixer_strip.cc:524
+#: mixer_strip.cc:398 rc_option_editor.cc:3141
+msgid "VCA Assigns"
+msgstr ""
+
+#: mixer_strip.cc:531
+msgid "Show/Hide Monitoring Section"
+msgstr ""
+
+#: mixer_strip.cc:583
 msgid "Enable/Disable MIDI input"
 msgstr ""
 
-#: mixer_strip.cc:688
+#: mixer_strip.cc:749
 msgid "Aux"
 msgstr ""
 
-#: mixer_strip.cc:710
+#: mixer_strip.cc:775
 msgid "Snd"
 msgstr ""
 
-#: mixer_strip.cc:776 mixer_strip.cc:879 processor_box.cc:2382
+#: mixer_strip.cc:846 mixer_strip.cc:951 processor_box.cc:3594
 msgid "Not connected to audio engine - no I/O changes are possible"
 msgstr ""
 
-#: mixer_strip.cc:833 mixer_strip.cc:935
+#: mixer_strip.cc:904 mixer_strip.cc:1007
 msgid "Add %1 port"
 msgstr ""
 
-#: mixer_strip.cc:840 mixer_strip.cc:942
+#: mixer_strip.cc:912 mixer_strip.cc:1014 monitor_section.cc:1466
+#: plugin_pin_dialog.cc:1782
 msgid "Routing Grid"
 msgstr ""
 
-#: mixer_strip.cc:1171
+#: mixer_strip.cc:1291
+msgid "MIDI "
+msgstr ""
+
+#: mixer_strip.cc:1295
 msgid "<b>INPUT</b> to %1"
 msgstr ""
 
-#: mixer_strip.cc:1174
+#: mixer_strip.cc:1297 monitor_section.cc:1511
 msgid "<b>OUTPUT</b> from %1"
 msgstr ""
 
-#: mixer_strip.cc:1287
+#: mixer_strip.cc:1410 monitor_section.cc:1598
 msgid "Disconnected"
 msgstr ""
 
-#: mixer_strip.cc:1413
-msgid "*Comments*"
-msgstr "*Kommentarer"
+#: mixer_strip.cc:1536
+msgid "Click to add/edit comments"
+msgstr ""
 
-#: mixer_strip.cc:1420
+#: mixer_strip.cc:1540 mixer_strip.cc:1551
 msgid "Cmt"
 msgstr "Kmt"
 
-#: mixer_strip.cc:1423
-msgid "*Cmt*"
-msgstr "*Kmt*"
-
-#: mixer_strip.cc:1429
-msgid "Click to Add/Edit Comments"
-msgstr "Klicka för att lägga till/redigera kommentarer"
-
-#: mixer_strip.cc:1473
+#: mixer_strip.cc:1596
 msgid "Grp"
 msgstr ""
 
-#: mixer_strip.cc:1476
+#: mixer_strip.cc:1599
 msgid "~G"
 msgstr ""
 
-#: mixer_strip.cc:1505 route_time_axis.cc:561
+#: mixer_strip.cc:1640 route_time_axis.cc:585 vca_master_strip.cc:396
 msgid "Color..."
 msgstr "Färg..."
 
-#: mixer_strip.cc:1507 route_time_axis.cc:563
+#: mixer_strip.cc:1642 route_time_axis.cc:587
 msgid "Comments..."
 msgstr ""
 
-#: mixer_strip.cc:1509 route_time_axis.cc:565
+#: mixer_strip.cc:1644 route_time_axis.cc:589
 msgid "Inputs..."
 msgstr ""
 
-#: mixer_strip.cc:1511 route_time_axis.cc:567
+#: mixer_strip.cc:1646 route_time_axis.cc:591
 msgid "Outputs..."
 msgstr ""
 
-#: mixer_strip.cc:1516
+#: mixer_strip.cc:1651
 msgid "Save As Template..."
 msgstr "Spara som spårmall..."
 
-#: mixer_strip.cc:1530
+#: mixer_strip.cc:1657 route_group_dialog.cc:45 route_time_axis.cc:851
+msgid "Active"
+msgstr "Aktiv"
+
+#: mixer_strip.cc:1665 plugin_pin_dialog.cc:1011
+msgid "Strict I/O"
+msgstr ""
+
+#: mixer_strip.cc:1675 processor_box.cc:3698
+msgid "Pin Connections..."
+msgstr ""
+
+#: mixer_strip.cc:1679
 msgid "Adjust Latency..."
 msgstr "Justera fördröjning..."
 
-#: mixer_strip.cc:1533
+#: mixer_strip.cc:1682
 msgid "Protect Against Denormals"
 msgstr "Skydda mot denormals"
 
-#: mixer_strip.cc:1539 route_time_axis.cc:580
-msgid "Remote Control ID..."
-msgstr "Fjärr-ID..."
+#: mixer_strip.cc:1701 route_time_axis.cc:867
+msgid "Duplicate..."
+msgstr ""
 
-#: mixer_strip.cc:1823
+#: mixer_strip.cc:1996
 msgid "Pre"
 msgstr ""
 
-#: mixer_strip.cc:1827
+#: mixer_strip.cc:2000
 msgid "Post"
 msgstr ""
 
-#: mixer_strip.cc:1847
-msgid "Pr"
+#: mixer_strip.cc:2016
+msgid "Meter|In"
+msgstr ""
+
+#: mixer_strip.cc:2020
+msgid "Meter|Pr"
+msgstr ""
+
+#: mixer_strip.cc:2024
+msgid "Meter|Po"
 msgstr ""
 
-#: mixer_strip.cc:1851
-msgid "Po"
+#: mixer_strip.cc:2028
+msgid "Meter|O"
 msgstr ""
 
-#: mixer_strip.cc:1860
-msgid "C"
+#: mixer_strip.cc:2033
+msgid "Meter|C"
 msgstr ""
 
-#: mixer_strip.cc:2008 route_ui.cc:168
+#: mixer_strip.cc:2194 route_ui.cc:193
 msgid "Disk"
 msgstr ""
 
-#: mixer_strip.cc:2020 monitor_section.cc:70
+#: mixer_strip.cc:2196
+msgid "Mon"
+msgstr ""
+
+#: mixer_strip.cc:2209 monitor_section.cc:81
 msgid "AFL"
 msgstr ""
 
-#: mixer_strip.cc:2023 monitor_section.cc:71
+#: mixer_strip.cc:2212 monitor_section.cc:82
 msgid "PFL"
 msgstr ""
 
-#: mixer_strip.cc:2034 meter_strip.cc:380
-msgid "D"
+#: mixer_strip.cc:2222 meter_strip.cc:385
+msgid "MonitorInput|I"
+msgstr ""
+
+#: mixer_strip.cc:2223 meter_strip.cc:386
+msgid "MonitorDisk|D"
+msgstr ""
+
+#: mixer_strip.cc:2225
+msgid "Mon|O"
+msgstr ""
+
+#: mixer_strip.cc:2238 meter_strip.cc:377 route_time_axis.cc:2730
+#: vca_master_strip.cc:202 vca_time_axis.cc:227
+msgid "AfterFader|A"
 msgstr ""
 
 #: mixer_strip.cc:2241
+msgid "Prefader|P"
+msgstr ""
+
+#: mixer_strip.cc:2246
+msgid "SoloIso|I"
+msgstr ""
+
+#: mixer_strip.cc:2247
+msgid "SoloLock|L"
+msgstr ""
+
+#: mixer_strip.cc:2452
 msgid "Pre Fader"
 msgstr "Före-nivåreglage"
 
-#: mixer_strip.cc:2242
+#: mixer_strip.cc:2453
 msgid "Post Fader"
 msgstr "Efter-nivåreglage"
 
-#: mixer_strip.cc:2286 meter_strip.cc:847
+#: mixer_strip.cc:2498 meter_strip.cc:858
 msgid "Change all in Group to %1"
 msgstr ""
 
-#: mixer_strip.cc:2288 meter_strip.cc:849
+#: mixer_strip.cc:2500 meter_strip.cc:860
 msgid "Change all to %1"
 msgstr ""
 
-#: mixer_strip.cc:2290 meter_strip.cc:851
+#: mixer_strip.cc:2502 meter_strip.cc:862
 msgid "Change same track-type to %1"
 msgstr ""
 
-#: mixer_ui.cc:130 route_time_axis.cc:818
+#: mixer_ui.cc:152 route_time_axis.cc:828
 msgid "Group"
 msgstr "Grupp"
 
-#: mixer_ui.cc:1224
+#: mixer_ui.cc:221
+msgid "Favorite Plugins"
+msgstr ""
+
+#: mixer_ui.cc:627
+msgid "Error adding GUI elements for new tracks/busses %1"
+msgstr ""
+
+#: mixer_ui.cc:1542
 msgid "track display list item for renamed strip not found!"
 msgstr "hittade inte spårvisningslisteobjekt för omdöpt remsor!"
 
-#: mixer_ui.cc:1316
+#: mixer_ui.cc:1636
 msgid "-all-"
 msgstr "-alla-"
 
-#: mixer_ui.cc:1853
+#: mixer_ui.cc:2135
 msgid "Strips"
 msgstr "Remsor"
 
-#: meter_strip.cc:157
-msgid "Reset Peak"
+#: mixer_ui.cc:2479
+msgid "No Track/Bus is selected."
 msgstr ""
 
-#: meter_strip.cc:883
-msgid "Variable height"
+#: mixer_ui.cc:2481
+msgid "Add at the top"
 msgstr ""
 
-#: meter_strip.cc:884
-msgid "Short"
+#: mixer_ui.cc:2483
+msgid "Add Pre-Fader"
 msgstr ""
 
-#: meter_strip.cc:885
-msgid "Tall"
+#: mixer_ui.cc:2485
+msgid "Add Post-Fader"
 msgstr ""
 
-#: meter_strip.cc:886
-msgid "Grande"
+#: mixer_ui.cc:2487
+msgid "Add at the end"
 msgstr ""
 
-#: meter_strip.cc:887
-msgid "Venti"
+#: mixer_ui.cc:2493
+msgid "Remove from favorites"
 msgstr ""
 
-#: meter_patterns.cc:82
-msgid "Peak"
+#: mixer_ui.cc:2499
+msgid "Delete Preset"
 msgstr ""
 
-#: meter_patterns.cc:85
-msgid "RMS + Peak"
+#: mixer_ui.cc:2739
+msgid "Toggle Solo on Mixer-Selected Tracks/Busses"
 msgstr ""
 
-#: meter_patterns.cc:88
-msgid "IEC1/DIN"
+#: mixer_ui.cc:2740
+msgid "Toggle Mute on Mixer-Selected Tracks/Busses"
 msgstr ""
 
-#: meter_patterns.cc:91
-msgid "IEC1/Nordic"
+#: mixer_ui.cc:2741
+msgid "Toggle Rec-enable on Mixer-Selected Tracks/Busses"
 msgstr ""
 
-#: meter_patterns.cc:94
-msgid "IEC2/BBC"
+#: mixer_ui.cc:2742
+msgid "Decrease Gain on Mixer-Selected Tracks/Busses"
 msgstr ""
 
-#: meter_patterns.cc:97
-msgid "IEC2/EBU"
+#: mixer_ui.cc:2743
+msgid "Increase Gain on Mixer-Selected Tracks/Busses"
 msgstr ""
 
-#: meter_patterns.cc:100
-msgid "K20"
+#: mixer_ui.cc:2744
+msgid "Set Gain to 0dB on Mixer-Selected Tracks/Busses"
 msgstr ""
 
-#: meter_patterns.cc:103
-msgid "K14"
+#: mixer_ui.cc:2747
+msgid "Copy Selected Processors"
 msgstr ""
 
-#: meter_patterns.cc:106
-msgid "K12"
+#: mixer_ui.cc:2748
+msgid "Cut Selected Processors"
 msgstr ""
 
-#: meter_patterns.cc:109
-msgid "VU"
+#: mixer_ui.cc:2749
+msgid "Paste Selected Processors"
 msgstr ""
 
-#: monitor_section.cc:69
-msgid "SiP"
+#: mixer_ui.cc:2750
+msgid "Delete Selected Processors"
 msgstr ""
 
-#: monitor_section.cc:96 route_group_dialog.cc:49
-msgid "Soloing"
-msgstr "Sololäge"
+#: mixer_ui.cc:2751
+msgid "Select All (visible) Processors"
+msgstr ""
 
-#: monitor_section.cc:100
-msgid "Isolated"
+#: mixer_ui.cc:2752
+msgid "Toggle Selected Processors"
 msgstr ""
 
-#: monitor_section.cc:104
-msgid "Auditioning"
+#: mixer_ui.cc:2753
+msgid "Toggle Selected Plugins"
 msgstr ""
 
-#: monitor_section.cc:114
-msgid ""
-"When active, something is solo-isolated.\n"
-"Click to de-isolate everything"
+#: mixer_ui.cc:2754
+msgid "Deselect all strips and processors"
 msgstr ""
 
-#: monitor_section.cc:117
-msgid ""
-"When active, auditioning is active.\n"
-"Click to stop the audition"
+#: mixer_ui.cc:2756 mixer_ui.cc:2757
+msgid "Scroll Mixer Window to the left"
 msgstr ""
 
-#: monitor_section.cc:134
-msgid "Solo controls affect solo-in-place"
+#: mixer_ui.cc:2759
+msgid "Toggle MIDI Input Active for Mixer-Selected Tracks/Busses"
 msgstr ""
 
-#: monitor_section.cc:140
-msgid "Solo controls toggle after-fader-listen"
+#: meter_strip.cc:160
+msgid "Reset Peak"
 msgstr ""
 
-#: monitor_section.cc:146
-msgid "Solo controls toggle pre-fader-listen"
+#: meter_strip.cc:380 route_time_axis.cc:2734 vca_master_strip.cc:206
+#: vca_time_axis.cc:231
+msgid "PreFader|P"
 msgstr ""
 
-#: monitor_section.cc:156
-msgid "Gain increase for soloed signals (0dB is normal)"
+#: meter_strip.cc:894
+msgid "Variable height"
 msgstr ""
 
-#: monitor_section.cc:170
-msgid "Solo Boost"
+#: meter_strip.cc:895
+msgid "Short"
 msgstr ""
 
-#: monitor_section.cc:185
-msgid ""
-"Gain reduction non-soloed signals\n"
-"A value above -inf dB causes \"solo-in-front\""
+#: meter_strip.cc:896
+msgid "Tall"
 msgstr ""
 
-#: monitor_section.cc:196
-msgid "SiP Cut"
+#: meter_strip.cc:897
+msgid "Grande"
 msgstr ""
 
-#: monitor_section.cc:211
-msgid "Gain reduction to use when dimming monitor outputs"
+#: meter_strip.cc:898
+msgid "Venti"
 msgstr ""
 
-#: monitor_section.cc:225 monitor_section.cc:283
-msgid "Dim"
+#: meter_patterns.cc:84
+msgid "Peak (+6dBFS)"
+msgstr ""
+
+#: meter_patterns.cc:87
+msgid "Peak (0dBFS)"
+msgstr ""
+
+#: meter_patterns.cc:90
+msgid "RMS + Peak"
+msgstr ""
+
+#: meter_patterns.cc:93
+msgid "IEC1/DIN"
+msgstr ""
+
+#: meter_patterns.cc:96
+msgid "IEC1/Nordic"
+msgstr ""
+
+#: meter_patterns.cc:99
+msgid "IEC2/BBC"
+msgstr ""
+
+#: meter_patterns.cc:102
+msgid "IEC2/EBU"
+msgstr ""
+
+#: meter_patterns.cc:105
+msgid "K20/RMS"
+msgstr ""
+
+#: meter_patterns.cc:108
+msgid "K14/RMS"
+msgstr ""
+
+#: meter_patterns.cc:111
+msgid "K12/RMS"
+msgstr ""
+
+#: meter_patterns.cc:114
+msgid "VU"
+msgstr ""
+
+#: monitor_section.cc:80
+msgid "SiP"
 msgstr ""
 
-#: monitor_section.cc:235
+#: monitor_section.cc:113 route_group_dialog.cc:49
+msgid "Soloing"
+msgstr "Sololäge"
+
+#: monitor_section.cc:117
+msgid "Isolated"
+msgstr ""
+
+#: monitor_section.cc:121
+msgid "Auditioning"
+msgstr ""
+
+#: monitor_section.cc:132
+msgid ""
+"When active, something is solo-isolated.\n"
+"Click to de-isolate everything"
+msgstr ""
+
+#: monitor_section.cc:135
+msgid ""
+"When active, auditioning is active.\n"
+"Click to stop the audition"
+msgstr ""
+
+#: monitor_section.cc:152
+msgid "Solo controls affect solo-in-place"
+msgstr ""
+
+#: monitor_section.cc:158
+msgid "Solo controls toggle after-fader-listen"
+msgstr ""
+
+#: monitor_section.cc:164
+msgid "Solo controls toggle pre-fader-listen"
+msgstr ""
+
+#: monitor_section.cc:170
 msgid "Excl. Solo"
 msgstr ""
 
-#: monitor_section.cc:237
+#: monitor_section.cc:172
 msgid "Exclusive solo means that only 1 solo is active at a time"
 msgstr ""
 
-#: monitor_section.cc:244
+#: monitor_section.cc:179
 msgid "Solo » Mute"
 msgstr ""
 
-#: monitor_section.cc:246
+#: monitor_section.cc:181
 msgid ""
 "If enabled, solo will override mute\n"
 "(a soloed & muted track or bus will be audible)"
 msgstr ""
 
-#: monitor_section.cc:323
+#: monitor_section.cc:189
+msgid "Processors"
+msgstr ""
+
+#: monitor_section.cc:191
+msgid "Allow one to add monitor effect processors"
+msgstr ""
+
+#: monitor_section.cc:206
+msgid "Gain increase for soloed signals (0dB is normal)"
+msgstr ""
+
+#: monitor_section.cc:210 monitor_section.cc:227 monitor_section.cc:244
+#: monitor_section.cc:289
+msgid "0 dB"
+msgstr ""
+
+#: monitor_section.cc:211
+msgid "3 dB"
+msgstr ""
+
+#: monitor_section.cc:212
+msgid "6 dB"
+msgstr ""
+
+#: monitor_section.cc:213
+msgid "10 dB"
+msgstr ""
+
+#: monitor_section.cc:215
+msgid "Solo Boost"
+msgstr ""
+
+#: monitor_section.cc:222
+msgid ""
+"Gain reduction non-soloed signals\n"
+"A value above -inf dB causes \"solo-in-front\""
+msgstr ""
+
+#: monitor_section.cc:228 monitor_section.cc:246 monitor_section.cc:291
+msgid "-6 dB"
+msgstr ""
+
+#: monitor_section.cc:229 monitor_section.cc:247 monitor_section.cc:292
+msgid "-12 dB"
+msgstr ""
+
+#: monitor_section.cc:230 monitor_section.cc:248 monitor_section.cc:293
+msgid "-20 dB"
+msgstr ""
+
+#: monitor_section.cc:231
+msgid "OFF"
+msgstr ""
+
+#: monitor_section.cc:233
+msgid "SiP Cut"
+msgstr ""
+
+#: monitor_section.cc:240
+msgid "Gain reduction to use when dimming monitor outputs"
+msgstr ""
+
+#: monitor_section.cc:245 monitor_section.cc:290
+msgid "-3 dB"
+msgstr ""
+
+#: monitor_section.cc:250 monitor_section.cc:264 monitor_section.cc:325
+msgid "Dim"
+msgstr ""
+
+#: monitor_section.cc:294
+msgid "-30 dB"
+msgstr ""
+
+#: monitor_section.cc:333
+msgid "Inv"
+msgstr ""
+
+#: monitor_section.cc:399
 msgid "Monitor"
 msgstr ""
 
-#: monitor_section.cc:744
+#: monitor_section.cc:897
 msgid "Switch monitor to mono"
 msgstr ""
 
-#: monitor_section.cc:747
+#: monitor_section.cc:900
 msgid "Cut monitor"
 msgstr ""
 
-#: monitor_section.cc:750
+#: monitor_section.cc:903
 msgid "Dim monitor"
 msgstr ""
 
-#: monitor_section.cc:753
+#: monitor_section.cc:906
 msgid "Toggle exclusive solo mode"
 msgstr ""
 
-#: monitor_section.cc:759
+#: monitor_section.cc:912
 msgid "Toggle mute overrides solo mode"
 msgstr ""
 
-#: monitor_section.cc:771
+#: monitor_section.cc:921
 msgid "Cut monitor channel %1"
 msgstr ""
 
-#: monitor_section.cc:776
+#: monitor_section.cc:926
 msgid "Dim monitor channel %1"
 msgstr ""
 
-#: monitor_section.cc:781
+#: monitor_section.cc:931
 msgid "Solo monitor channel %1"
 msgstr ""
 
-#: monitor_section.cc:786
+#: monitor_section.cc:936
 msgid "Invert monitor channel %1"
 msgstr ""
 
-#: monitor_section.cc:796
+#: monitor_section.cc:946
 msgid "In-place solo"
 msgstr ""
 
-#: monitor_section.cc:798
+#: monitor_section.cc:948
 msgid "After Fade Listen (AFL) solo"
 msgstr ""
 
-#: monitor_section.cc:800
+#: monitor_section.cc:950
 msgid "Pre Fade Listen (PFL) solo"
 msgstr ""
 
-#: mono_panner.cc:109 stereo_panner.cc:119
+#: monitor_section.cc:953
+msgid "Toggle Monitor Section Processor Box"
+msgstr ""
+
+#: monitor_section.cc:1413
+msgid "No session - no I/O changes are possible"
+msgstr ""
+
+#: monitor_selector.cc:199
+msgid "Monitor output selector"
+msgstr ""
+
+#: mono_panner.cc:105 stereo_panner.cc:115
 msgid "bypassed"
 msgstr ""
 
-#: mono_panner.cc:123
+#: mono_panner.cc:119
 #, c-format
 msgid "L:%3d R:%3d"
 msgstr ""
 
-#: mono_panner_editor.cc:33
+#: mono_panner.cc:203 panner2d.cc:276 stereo_panner.cc:252
+#: stereo_panner.cc:275
+msgid "Panner|L"
+msgstr ""
+
+#: mono_panner.cc:220 panner2d.cc:277 stereo_panner.cc:250
+#: stereo_panner.cc:277
+msgid "Panner|R"
+msgstr ""
+
+#: mono_panner_editor.cc:35
 msgid "Mono Panner"
 msgstr ""
 
-#: mono_panner_editor.cc:44 mono_panner_editor.cc:49
-#: stereo_panner_editor.cc:46 stereo_panner_editor.cc:51
+#: mono_panner_editor.cc:46 mono_panner_editor.cc:51
+#: stereo_panner_editor.cc:48 stereo_panner_editor.cc:53
 msgid "%"
 msgstr ""
 
@@ -7777,10 +9168,6 @@ msgid ""
 "relies on a stable, sustainable income stream. Thanks for using Ardour!"
 msgstr ""
 
-#: new_plugin_preset_dialog.cc:29
-msgid "New Preset"
-msgstr "Ny förinställning"
-
 #: new_plugin_preset_dialog.cc:30
 msgid "Replace existing preset with this name"
 msgstr "Ersätt existerande förinställning med samma namn"
@@ -7789,6 +9176,10 @@ msgstr "Ersätt existerande förinställning med samma namn"
 msgid "Name of new preset"
 msgstr "Namnge ny förinställning"
 
+#: new_plugin_preset_dialog.cc:44
+msgid "New Favorite Only"
+msgstr ""
+
 #: normalize_dialog.cc:34
 msgid "Normalize regions"
 msgstr "Normalisera regioner"
@@ -7797,7 +9188,11 @@ msgstr "Normalisera regioner"
 msgid "Normalize region"
 msgstr "Normalisera region"
 
-#: normalize_dialog.cc:49 strip_silence_dialog.cc:66
+#: normalize_dialog.cc:42
+msgid "Normalize to:"
+msgstr "Normalisera till"
+
+#: normalize_dialog.cc:49 strip_silence_dialog.cc:67
 msgid "dbFS"
 msgstr ""
 
@@ -7817,103 +9212,106 @@ msgstr "Normalisera"
 msgid "Select Note"
 msgstr ""
 
-#: opts.cc:57
+#: opts.cc:61
 msgid "Usage: "
 msgstr "Användning: "
 
-#: opts.cc:58
+#: opts.cc:62
 msgid "  [SESSION_NAME]              Name of session to load\n"
 msgstr ""
 
-#: opts.cc:59
+#: opts.cc:63
 msgid "  -v, --version               Show version information\n"
 msgstr ""
 
-#: opts.cc:60
+#: opts.cc:64
 msgid "  -h, --help                  Print this message\n"
 msgstr ""
 
-#: opts.cc:61
+#: opts.cc:65
 msgid ""
 "  -a, --no-announcements      Do not contact website for announcements\n"
 msgstr ""
 
-#: opts.cc:62
+#: opts.cc:66
 msgid ""
 "  -b, --bindings              Print all possible keyboard binding names\n"
 msgstr ""
 
-#: opts.cc:63
+#: opts.cc:67
+msgid ""
+"  -B, --bypass-plugins        Bypass all plugins in an existing session\n"
+msgstr ""
+
+#: opts.cc:68
 msgid ""
 "  -c, --name <name>           Use a specific backend client name, default is "
 "ardour\n"
 msgstr ""
 
-#: opts.cc:64
+#: opts.cc:69
 msgid ""
 "  -d, --disable-plugins       Disable all plugins in an existing session\n"
 msgstr ""
 
-#: opts.cc:65
+#: opts.cc:70
 msgid ""
 "  -D, --debug <options>       Set debug flags. Use \"-D list\" to see "
 "available options\n"
 msgstr ""
 
-#: opts.cc:66
+#: opts.cc:71
 msgid "  -n, --no-splash             Do not show splash screen\n"
 msgstr ""
 
-#: opts.cc:67
+#: opts.cc:72
 msgid "  -m, --menus file            Use \"file\" to define menus\n"
 msgstr ""
 
-#: opts.cc:68
+#: opts.cc:73
 msgid ""
 "  -N, --new session-name      Create a new session from the command line\n"
 msgstr ""
 
-#: opts.cc:69
+#: opts.cc:74
 msgid "  -O, --no-hw-optimizations   Disable h/w specific optimizations\n"
 msgstr ""
 
-#: opts.cc:70
+#: opts.cc:75
 msgid "  -P, --no-connect-ports      Do not connect any ports at startup\n"
 msgstr ""
 
-#: opts.cc:71
+#: opts.cc:76
 msgid "  -S, --sync                  Draw the gui synchronously \n"
 msgstr ""
 
-#: opts.cc:73
+#: opts.cc:78
 msgid "  -V, --novst                 Do not use VST support\n"
 msgstr ""
 
-#: opts.cc:75
+#: opts.cc:80
 msgid ""
 "  -E, --save <file>           Load the specified session, save it to <file> "
 "and then quit\n"
 msgstr ""
 
-#: opts.cc:76
+#: opts.cc:81
 msgid "  -C, --curvetest filename    Curve algorithm debugger\n"
 msgstr ""
 
-#: opts.cc:77
-msgid ""
-"  -k, --keybindings filename  Name of key bindings to load (default is ~/."
-"ardour3/ardour.bindings)\n"
+#: opts.cc:82
+msgid "  -k, --keybindings filename  Name of key bindings to load\n"
 msgstr ""
 
-#: panner2d.cc:854
+#: panner2d.cc:896
 msgid "Panner (2D)"
 msgstr ""
 
-#: panner2d.cc:856 panner_ui.cc:400 plugin_ui.cc:452
+#: panner2d.cc:898 panner_ui.cc:402 plugin_ui.cc:458
 msgid "Bypass"
 msgstr "Förbigå"
 
-#: panner2d.cc:862
+#: panner2d.cc:904
 msgid "Panner"
 msgstr "Panorerare"
 
@@ -7925,6 +9323,22 @@ msgstr "panoreringsautomatiseringsläge"
 msgid "Pan automation type"
 msgstr "panoreringsuatomtiseringstyp"
 
+#: panner_ui.cc:605
+msgid "Manual|M"
+msgstr ""
+
+#: panner_ui.cc:608
+msgid "Play|P"
+msgstr ""
+
+#: panner_ui.cc:611
+msgid "Touch|T"
+msgstr ""
+
+#: panner_ui.cc:614
+msgid "Write|W"
+msgstr ""
+
 #: playlist_selector.cc:43
 msgid "Playlists"
 msgstr ""
@@ -7957,143 +9371,297 @@ msgstr "dB-skala"
 msgid "Show phase"
 msgstr "Visa fas"
 
-#: plugin_selector.cc:53 plugin_selector.cc:229
+#: plugin_pin_dialog.cc:55
+msgid "Manual Config"
+msgstr ""
+
+#: plugin_pin_dialog.cc:56
+msgid "Sidechain"
+msgstr ""
+
+#: plugin_pin_dialog.cc:57 plugin_pin_dialog.cc:59 plugin_pin_dialog.cc:61
+#: plugin_pin_dialog.cc:63 plugin_pin_dialog.cc:65 step_entry.cc:81
+#: step_entry.cc:84
+msgid "+"
+msgstr ""
+
+#: plugin_pin_dialog.cc:58 plugin_pin_dialog.cc:60 plugin_pin_dialog.cc:62
+#: plugin_pin_dialog.cc:64 plugin_pin_dialog.cc:66
+msgid "-"
+msgstr ""
+
+#: plugin_pin_dialog.cc:148
+msgid "Audio Input Pins"
+msgstr ""
+
+#: plugin_pin_dialog.cc:157
+msgid "MIDI Input Pins"
+msgstr ""
+
+#: plugin_pin_dialog.cc:166
+msgid "Instances"
+msgstr ""
+
+#: plugin_pin_dialog.cc:176
+msgid "Audio Out"
+msgstr ""
+
+#: plugin_pin_dialog.cc:185
+msgid "MIDI Out"
+msgstr ""
+
+#: plugin_pin_dialog.cc:192
+msgid "Output Presets"
+msgstr ""
+
+#: plugin_pin_dialog.cc:208
+msgid "Add Sidechain Input"
+msgstr ""
+
+#: plugin_pin_dialog.cc:478 plugin_pin_dialog.cc:482 plugin_pin_dialog.cc:486
+#: plugin_setup_dialog.cc:115 plugin_setup_dialog.cc:199
+msgid "Automatic"
+msgstr ""
+
+#: plugin_pin_dialog.cc:515 plugin_setup_dialog.cc:208
+msgid "%1 Channel"
+msgid_plural "%1 Channels"
+msgstr[0] ""
+msgstr[1] ""
+
+#: plugin_pin_dialog.cc:641 processor_box.cc:224
+msgid "Send"
+msgstr ""
+
+#: plugin_pin_dialog.cc:997
+msgid "Latency %1 spl%2 %3"
+msgstr ""
+
+#: plugin_pin_dialog.cc:997 plugin_pin_dialog.cc:1001
+msgid "no-inplace"
+msgstr ""
+
+#: plugin_pin_dialog.cc:999
+msgid "Latency %1 spl"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1055
+msgid "Instance #%1"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1700 processor_box.cc:2508
+msgid "Cannot set up new send: %1"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1707
+msgid "SC %1 (%2)"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1963 plugin_pin_dialog.cc:1971
+msgid "Pin Configuration: %1"
+msgstr ""
+
+#: plugin_setup_dialog.cc:30
+msgid "Plugin Setup"
+msgstr ""
+
+#: plugin_setup_dialog.cc:33
+msgid "Copy I/O Map"
+msgstr ""
+
+#: plugin_setup_dialog.cc:50
+msgid "An Instrument plugin is already present."
+msgstr ""
+
+#: plugin_setup_dialog.cc:54
+msgid "Replace"
+msgstr ""
+
+#: plugin_setup_dialog.cc:60
+msgid "with"
+msgstr ""
+
+#: plugin_setup_dialog.cc:70
+msgid "I/O Pin Mapping"
+msgstr ""
+
+#: plugin_setup_dialog.cc:79
+msgid "Configure Plugin '%1'"
+msgstr ""
+
+#: plugin_setup_dialog.cc:90
+msgid "Output Configuration"
+msgstr ""
+
+#: plugin_selector.cc:54 plugin_selector.cc:322
 msgid "Name contains"
 msgstr "Namn innehåller"
 
-#: plugin_selector.cc:54 plugin_selector.cc:233
+#: plugin_selector.cc:55 plugin_selector.cc:326
 msgid "Type contains"
 msgstr "Typ innehåller"
 
-#: plugin_selector.cc:55 plugin_selector.cc:231
+#: plugin_selector.cc:56 plugin_selector.cc:324
 msgid "Category contains"
 msgstr "Kategori innehåller"
 
-#: plugin_selector.cc:56 plugin_selector.cc:253
+#: plugin_selector.cc:57 plugin_selector.cc:349
 msgid "Author contains"
 msgstr "Upphovsperson innehåller"
 
-#: plugin_selector.cc:57 plugin_selector.cc:255
+#: plugin_selector.cc:58 plugin_selector.cc:351
 msgid "Library contains"
 msgstr "Bibliotek innehåller"
 
-#: plugin_selector.cc:58 plugin_selector.cc:219 plugin_selector.cc:537
+#: plugin_selector.cc:59 plugin_selector.cc:278 plugin_selector.cc:639
 msgid "Favorites only"
 msgstr "Endast favoriter"
 
-#: plugin_selector.cc:59 plugin_selector.cc:223 plugin_selector.cc:537
+#: plugin_selector.cc:60 plugin_selector.cc:282 plugin_selector.cc:639
 msgid "Hidden only"
 msgstr "Endast dolda"
 
-#: plugin_selector.cc:64
+#: plugin_selector.cc:65
 msgid "Plugin Manager"
 msgstr "Insticksprogram"
 
-#: plugin_selector.cc:85
+#: plugin_selector.cc:96
 msgid "Fav"
 msgstr ""
 
-#: plugin_selector.cc:87
+#: plugin_selector.cc:98
 msgid "Available Plugins"
 msgstr "Tillgängliga insticksprogram"
 
-#: plugin_selector.cc:88
+#: plugin_selector.cc:99
 msgid "Type"
 msgstr "Typ"
 
-#: plugin_selector.cc:89
+#: plugin_selector.cc:100
 msgid "Category"
 msgstr "Kategori"
 
-#: plugin_selector.cc:90
+#: plugin_selector.cc:101
 msgid "Creator"
 msgstr "Upphovsman"
 
-#: plugin_selector.cc:91
+#: plugin_selector.cc:102
 msgid "# Audio In"
 msgstr ""
 
-#: plugin_selector.cc:92
+#: plugin_selector.cc:103
 msgid "# Audio Out"
 msgstr ""
 
-#: plugin_selector.cc:93
+#: plugin_selector.cc:104
 msgid "# MIDI In"
 msgstr ""
 
-#: plugin_selector.cc:94
+#: plugin_selector.cc:105
 msgid "# MIDI Out"
 msgstr ""
 
-#: plugin_selector.cc:116
+#: plugin_selector.cc:132
 msgid "Plugins to be connected"
 msgstr "Insticksprogram att ansluta"
 
-#: plugin_selector.cc:129
+#: plugin_selector.cc:145
 msgid "Add a plugin to the effect list"
 msgstr "Lägg till ett insticksprogram till effektlistan"
 
-#: plugin_selector.cc:133
+#: plugin_selector.cc:149
 msgid "Remove a plugin from the effect list"
 msgstr "Ta bort ett insticksprogram från effektlistan"
 
-#: plugin_selector.cc:135
-msgid "Update available plugins"
-msgstr "Uppdatera tillgängliga insticksprogram"
+#: plugin_selector.cc:161
+msgid "Show Hidden"
+msgstr ""
+
+#: plugin_selector.cc:163
+msgid "Include hidden plugins in list."
+msgstr ""
+
+#: plugin_selector.cc:166
+msgid "Instruments"
+msgstr ""
+
+#: plugin_selector.cc:168
+msgid "Cycle display of instrument plugins (if any)."
+msgstr ""
+
+#: plugin_selector.cc:171
+msgid "Analyzers"
+msgstr ""
+
+#: plugin_selector.cc:173
+msgid "Cycle display of analysis plugins (if any)."
+msgstr ""
+
+#: plugin_selector.cc:176
+msgid "Utils"
+msgstr ""
+
+#: plugin_selector.cc:178
+msgid "Cycle display of utility plugins (if any)."
+msgstr ""
+
+#: plugin_selector.cc:208
+msgid "Filter"
+msgstr ""
 
-#: plugin_selector.cc:172
+#: plugin_selector.cc:232
 msgid "Insert Plugin(s)"
 msgstr "Infoga"
 
-#: plugin_selector.cc:337 plugin_selector.cc:338 plugin_selector.cc:339
-#: plugin_selector.cc:340
+#: plugin_selector.cc:439 plugin_selector.cc:440 plugin_selector.cc:441
+#: plugin_selector.cc:442
 msgid "variable"
 msgstr ""
 
-#: plugin_selector.cc:496
+#: plugin_selector.cc:598
 msgid ""
 "The plugin \"%1\" could not be loaded\n"
 "\n"
 "See the Log window for more details (maybe)"
 msgstr ""
 
-#: plugin_selector.cc:644
+#: plugin_selector.cc:757
 msgid "Favorites"
 msgstr "Favoriter"
 
-#: plugin_selector.cc:646
+#: plugin_selector.cc:759
 msgid "Plugin Manager..."
 msgstr "Insticksprogram..."
 
-#: plugin_selector.cc:650
+#: plugin_selector.cc:763
 msgid "By Creator"
 msgstr "Upphovsman"
 
-#: plugin_selector.cc:653
+#: plugin_selector.cc:766
 msgid "By Category"
 msgstr "Kategori"
 
-#: plugin_ui.cc:113
+#: plugin_ui.cc:114
 msgid "Eh? LADSPA plugins don't have editors!"
 msgstr ""
 
-#: plugin_ui.cc:122 plugin_ui.cc:227
+#: plugin_ui.cc:123 plugin_ui.cc:228
 msgid ""
 "unknown type of editor-supplying plugin (note: no VST support in this "
 "version of %1)"
 msgstr ""
 
-#: plugin_ui.cc:125
+#: plugin_ui.cc:126
 msgid "unknown type of editor-supplying plugin"
 msgstr ""
 
-#: plugin_ui.cc:257
+#: plugin_ui.cc:258
 msgid ""
 "unknown type of editor-supplying plugin (note: no linuxVST support in this "
 "version of %1)"
 msgstr ""
 
-#: plugin_ui.cc:329
+#: plugin_ui.cc:330
 msgid "create_lv2_editor called on non-LV2 plugin"
 msgstr ""
 
@@ -8101,37 +9669,42 @@ msgstr ""
 msgid "Add"
 msgstr "Lägg till"
 
-#: plugin_ui.cc:422
+#: plugin_ui.cc:423
 msgid "Description"
 msgstr ""
 
-#: plugin_ui.cc:423
+#: plugin_ui.cc:424
 msgid "Plugin analysis"
 msgstr "Analys av insticksprogram"
 
-#: plugin_ui.cc:430
+#: plugin_ui.cc:431
 msgid ""
 "Presets (if any) for this plugin\n"
 "(Both factory and user-created)"
 msgstr ""
 
-#: plugin_ui.cc:431
+#: plugin_ui.cc:432
 msgid "Save a new preset"
 msgstr ""
 
-#: plugin_ui.cc:432
+#: plugin_ui.cc:433
 msgid "Save the current preset"
 msgstr ""
 
-#: plugin_ui.cc:433
+#: plugin_ui.cc:434
 msgid "Delete the current preset"
 msgstr ""
 
-#: plugin_ui.cc:434
+#: plugin_ui.cc:435
+msgid ""
+"Reset parameters to default (if no parameters are in automation play mode)"
+msgstr ""
+
+#: plugin_ui.cc:436
 msgid "Disable signal processing by the plugin"
 msgstr ""
 
-#: plugin_ui.cc:467 plugin_ui.cc:663
+#: plugin_ui.cc:473 plugin_ui.cc:681
 msgid ""
 "Click to allow the plugin to receive keyboard events that %1 would normally "
 "use as a shortcut"
@@ -8139,110 +9712,126 @@ msgstr ""
 "Tryck här för att tillåta att insticksprogrammet mottar tangentbordsgenvägar "
 "som %1 vanligtvis skulle använda"
 
-#: plugin_ui.cc:468
+#: plugin_ui.cc:474
 msgid "Click to enable/disable this plugin"
 msgstr "Tryck för att slå på/av insticksprogrammet"
 
-#: plugin_ui.cc:507
+#: plugin_ui.cc:517
 msgid "latency (%1 sample)"
 msgid_plural "latency (%1 samples)"
 msgstr[0] ""
 msgstr[1] ""
 
-#: plugin_ui.cc:509
+#: plugin_ui.cc:519
 msgid "latency (%1 ms)"
 msgstr "fördröjning (%1 msek)"
 
-#: plugin_ui.cc:520
+#: plugin_ui.cc:530
 msgid "Edit Latency"
 msgstr "Ställ in fördröjning"
 
-#: plugin_ui.cc:566
+#: plugin_ui.cc:576
 msgid ""
 "Plugin presets are not supported in this build of %1. Consider paying for a "
 "full version"
 msgstr ""
 
-#: plugin_ui.cc:574
+#: plugin_ui.cc:584
 msgid ""
 "Plugin presets are not supported in this build, see the Log window for more "
 "information."
 msgstr ""
 
-#: plugin_ui.cc:670
+#: plugin_ui.cc:592
+msgid "New Preset"
+msgstr "Ny förinställning"
+
+#: plugin_ui.cc:688
 msgid "Click to allow normal use of %1 keyboard shortcuts"
 msgstr "Tryck här för att återställa normala tangentbordsgenvägar"
 
-#: port_group.cc:337
+#: plugin_ui.cc:785
+msgid "(none)"
+msgstr ""
+
+#: port_group.cc:338
 msgid "%1 Busses"
 msgstr "%1-bussar"
 
-#: port_group.cc:338
+#: port_group.cc:339
 msgid "%1 Tracks"
 msgstr "%1-spår"
 
-#: port_group.cc:339
+#: port_group.cc:340
 msgid "Hardware"
 msgstr "HÃ¥rdvara"
 
-#: port_group.cc:340
+#: port_group.cc:341
 msgid "%1 Misc"
 msgstr ""
 
-#: port_group.cc:341
+#: port_group.cc:342
 msgid "Other"
 msgstr ""
 
-#: port_group.cc:432 port_group.cc:433
+#: port_group.cc:434 port_group.cc:435
 msgid "LTC Out"
 msgstr ""
 
-#: port_group.cc:436 port_group.cc:437
+#: port_group.cc:438 port_group.cc:439
 msgid "LTC In"
 msgstr ""
 
-#: port_group.cc:463
+#: port_group.cc:473
 msgid "MTC in"
 msgstr ""
 
-#: port_group.cc:466
+#: port_group.cc:476
 msgid "MIDI control in"
 msgstr ""
 
-#: port_group.cc:469
+#: port_group.cc:479
 msgid "MIDI clock in"
 msgstr ""
 
-#: port_group.cc:472
+#: port_group.cc:482
 msgid "MMC in"
 msgstr ""
 
-#: port_group.cc:476
+#: port_group.cc:486
 msgid "MTC out"
 msgstr ""
 
-#: port_group.cc:479
+#: port_group.cc:489
 msgid "MIDI control out"
 msgstr ""
 
-#: port_group.cc:482
+#: port_group.cc:492
 msgid "MIDI clock out"
 msgstr ""
 
-#: port_group.cc:485
+#: port_group.cc:495
 msgid "MMC out"
 msgstr ""
 
-#: port_group.cc:532
+#: port_group.cc:554
 msgid ":monitor"
 msgstr ""
 
-#: port_group.cc:544
+#: port_group.cc:570
 msgid "system:"
 msgstr ""
 
-#: port_group.cc:545
-msgid "alsa_pcm"
+#: port_group.cc:571
+msgid "alsa_pcm:"
+msgstr ""
+
+#: port_group.cc:572
+msgid "alsa_midi:"
+msgstr ""
+
+#: port_group.cc:577
+msgid "Scene "
 msgstr ""
 
 #: port_insert_ui.cc:39
@@ -8265,78 +9854,77 @@ msgstr ""
 msgid "Port Insert "
 msgstr ""
 
-#: port_matrix.cc:331 port_matrix.cc:357
+#: port_matrix.cc:341 port_matrix.cc:367
 msgid "<b>Sources</b>"
 msgstr "<b>Källor</b>"
 
-#: port_matrix.cc:332 port_matrix.cc:358
+#: port_matrix.cc:342 port_matrix.cc:368
 msgid "<b>Destinations</b>"
 msgstr "<b>Destinationer</b>"
 
-#: port_matrix.cc:440 port_matrix.cc:448
+#: port_matrix.cc:450 port_matrix.cc:458
 #, c-format
 msgid "Add %s %s"
 msgstr "Lägg till %s-%s"
 
 #
-#: port_matrix.cc:456
+#: port_matrix.cc:466
 #, c-format
 msgid "Rename '%s'..."
 msgstr "Byt namn på '%s'..."
 
-#: port_matrix.cc:472
+#: port_matrix.cc:482
 msgid "Remove all"
 msgstr "Ta bort alla"
 
-#: port_matrix.cc:492 port_matrix.cc:504
+#: port_matrix.cc:502 port_matrix.cc:514
 #, c-format
 msgid "%s all"
 msgstr ""
 
-#: port_matrix.cc:527
+#: port_matrix.cc:537
 msgid "Rescan"
 msgstr "Uppdatera"
 
-#: port_matrix.cc:529
+#: port_matrix.cc:539
 msgid "Show individual ports"
 msgstr "Visa enskilda portar"
 
-#: port_matrix.cc:535
+#: port_matrix.cc:545
 msgid "Flip"
 msgstr ""
 
-#: port_matrix.cc:722
-msgid ""
-"It is not possible to add a port here, as the first processor in the track "
-"or buss cannot support the new configuration."
+#: port_matrix.cc:732
+msgid "It is not possible to add a port here."
 msgstr ""
 
-#: port_matrix.cc:725
+#: port_matrix.cc:733
 msgid "Cannot add port"
 msgstr ""
 
-#: port_matrix.cc:747
-msgid "Port removal not allowed"
+#: port_matrix.cc:757
+msgid "The last port cannot be removed"
 msgstr ""
 
-#: port_matrix.cc:748
-msgid ""
-"This port cannot be removed.\n"
-"Either the first plugin in the track or buss cannot accept\n"
-"the new number of inputs or the last plugin has more outputs."
+#: port_matrix.cc:760
+msgid "This port cannot be removed."
+msgstr ""
+
+#: port_matrix.cc:765
+msgid "Port removal not allowed"
 msgstr ""
 
-#: port_matrix.cc:965
+#: port_matrix.cc:981
 #, c-format
 msgid "Remove '%s'"
 msgstr "Ta bort '%s'"
 
-#: port_matrix.cc:980
+#: port_matrix.cc:996
 #, c-format
 msgid "%s all from '%s'"
 msgstr "%s alla från '%s'"
 
-#: port_matrix.cc:1046 transform_dialog.cc:62
+#: port_matrix.cc:1062 transform_dialog.cc:62
 msgid "channel"
 msgstr "kanal"
 
@@ -8348,223 +9936,237 @@ msgstr ""
 msgid "There are no %1 ports to connect."
 msgstr ""
 
-#: processor_box.cc:150
-msgid "Send"
+#: processor_box.cc:226
+msgid "Return"
 msgstr ""
 
-#: processor_box.cc:152
-msgid "Return"
+#: processor_box.cc:323
+msgid "New Favorite Preset for \"%1\""
 msgstr ""
 
-#: processor_box.cc:310
+#: processor_box.cc:501
 msgid ""
 "\n"
 "This mono plugin has been replicated %1 times."
 msgstr ""
 
-#: processor_box.cc:314
+#: processor_box.cc:505 processor_box.cc:1527
 msgid ""
 "<b>%1</b>\n"
 "Double-click to show GUI.\n"
-"Alt+double-click to show generic GUI.%2"
+"%2+double-click to show generic GUI.%3"
 msgstr ""
 
-#: processor_box.cc:317
+#: processor_box.cc:508 processor_box.cc:1530
 msgid ""
 "<b>%1</b>\n"
 "Double-click to show generic GUI.%2"
 msgstr ""
 
-#: processor_box.cc:361
+#: processor_box.cc:514
+msgid ""
+"<b>%1</b>\n"
+"The Plugin is not available on this system\n"
+"and has been replaced by a stub."
+msgstr ""
+
+#: processor_box.cc:600
 #, c-format
 msgid "(%1x1) "
 msgstr ""
 
-#: processor_box.cc:437
+#: processor_box.cc:695
+msgid "Inline Display"
+msgstr ""
+
+#: processor_box.cc:703
 msgid "Show All Controls"
 msgstr ""
 
-#: processor_box.cc:441
+#: processor_box.cc:707
 msgid "Hide All Controls"
 msgstr ""
 
-#: processor_box.cc:475
+#: processor_box.cc:752
 msgid "Link panner controls"
 msgstr ""
 
-#: processor_box.cc:575
+#: processor_box.cc:859
 msgid "on"
 msgstr ""
 
-#: processor_box.cc:575 rc_option_editor.cc:2360 rc_option_editor.cc:2374
+#: processor_box.cc:859 rc_option_editor.cc:3178 rc_option_editor.cc:3192
 msgid "off"
 msgstr "av"
 
-#: processor_box.cc:957
+#: processor_box.cc:1817
 msgid ""
 "Right-click to add/remove/edit\n"
 "plugins,inserts,sends and more"
 msgstr ""
 
-#: processor_box.cc:1429 processor_box.cc:1804
+#: processor_box.cc:1966
+msgid ""
+"Processor Drag/Drop failed. Probably because\n"
+"the I/O configuration of the plugins could\n"
+"not match the configuration of this track."
+msgstr ""
+
+#: processor_box.cc:2443 processor_box.cc:2986
 msgid "Plugin Incompatibility"
 msgstr ""
 
-#: processor_box.cc:1432
+#: processor_box.cc:2446
 msgid "You attempted to add the plugin \"%1\" in slot %2.\n"
 msgstr ""
 
-#: processor_box.cc:1438
+#: processor_box.cc:2452
 msgid ""
 "\n"
 "This plugin has:\n"
 msgstr ""
 
-#: processor_box.cc:1441
+#: processor_box.cc:2455
 msgid "\t%1 MIDI input\n"
 msgid_plural "\t%1 MIDI inputs\n"
 msgstr[0] ""
 msgstr[1] ""
 
-#: processor_box.cc:1445
+#: processor_box.cc:2459
 msgid "\t%1 audio input\n"
 msgid_plural "\t%1 audio inputs\n"
 msgstr[0] ""
 msgstr[1] ""
 
-#: processor_box.cc:1448
+#: processor_box.cc:2462
 msgid ""
 "\n"
 "but at the insertion point, there are:\n"
 msgstr ""
 
-#: processor_box.cc:1451
+#: processor_box.cc:2465
 msgid "\t%1 MIDI channel\n"
 msgid_plural "\t%1 MIDI channels\n"
 msgstr[0] ""
 msgstr[1] ""
 
-#: processor_box.cc:1455
+#: processor_box.cc:2469
 msgid "\t%1 audio channel\n"
 msgid_plural "\t%1 audio channels\n"
 msgstr[0] ""
 msgstr[1] ""
 
-#: processor_box.cc:1458
+#: processor_box.cc:2472
 msgid ""
 "\n"
 "%1 is unable to insert this plugin here.\n"
 msgstr ""
 
-#: processor_box.cc:1495
-msgid "Cannot set up new send: %1"
-msgstr ""
-
-#: processor_box.cc:1807
+#: processor_box.cc:2989
 msgid ""
 "You cannot reorder these plugins/sends/inserts\n"
 "in that way because the inputs and\n"
 "outputs will not work correctly."
 msgstr ""
 
-#: processor_box.cc:1991
+#: processor_box.cc:3189
 msgid "Rename Processor"
 msgstr ""
 
-#: processor_box.cc:2022
+#: processor_box.cc:3220
 msgid "At least 100 IO objects exist with a name like %1 - name not changed"
 msgstr ""
 
-#: processor_box.cc:2159
+#: processor_box.cc:3371
 msgid "plugin insert constructor failed"
 msgstr ""
 
-#: processor_box.cc:2170
+#: processor_box.cc:3382
 msgid ""
 "Copying the set of processors on the clipboard failed,\n"
 "probably because the I/O configuration of the plugins\n"
 "could not match the configuration of this track."
 msgstr ""
 
-#: processor_box.cc:2216
+#: processor_box.cc:3428
 msgid ""
 "Do you really want to remove all processors from %1?\n"
 "(this cannot be undone)"
 msgstr ""
 
-#: processor_box.cc:2220 processor_box.cc:2245
+#: processor_box.cc:3432 processor_box.cc:3457
 msgid "Yes, remove them all"
 msgstr "Ja, ta bort alla"
 
-#: processor_box.cc:2222 processor_box.cc:2247
+#: processor_box.cc:3434 processor_box.cc:3459
 msgid "Remove processors"
 msgstr ""
 
-#: processor_box.cc:2237
+#: processor_box.cc:3449
 msgid ""
 "Do you really want to remove all pre-fader processors from %1?\n"
 "(this cannot be undone)"
 msgstr ""
 
-#: processor_box.cc:2240
+#: processor_box.cc:3452
 msgid ""
 "Do you really want to remove all post-fader processors from %1?\n"
 "(this cannot be undone)"
 msgstr ""
 
-#: processor_box.cc:2428
+#: processor_box.cc:3641
 msgid "New Plugin"
 msgstr "Nytt insticksprogram"
 
-#: processor_box.cc:2431
+#: processor_box.cc:3644
 msgid "New Insert"
 msgstr "Ny Anslutningspunkt"
 
-#: processor_box.cc:2434
+#: processor_box.cc:3647
 msgid "New External Send ..."
 msgstr ""
 
-#: processor_box.cc:2438
+#: processor_box.cc:3651
 msgid "New Aux Send ..."
 msgstr "Ny auxilliär sänd..."
 
-#: processor_box.cc:2441
+#: processor_box.cc:3654
 msgid "Send Options"
 msgstr ""
 
-#: processor_box.cc:2443
+#: processor_box.cc:3656
 msgid "Clear (all)"
 msgstr "Rensa (alla)"
 
-#: processor_box.cc:2445
+#: processor_box.cc:3658
 msgid "Clear (pre-fader)"
 msgstr "Rensa (förreglage)"
 
-#: processor_box.cc:2447
+#: processor_box.cc:3660
 msgid "Clear (post-fader)"
 msgstr "Rensa (efterreglage)"
 
-#: processor_box.cc:2473
+#: processor_box.cc:3690
 msgid "Activate All"
 msgstr "Aktivera alla"
 
-#: processor_box.cc:2475
+#: processor_box.cc:3692
 msgid "Deactivate All"
 msgstr ""
 
-#: processor_box.cc:2477
+#: processor_box.cc:3694
 msgid "A/B Plugins"
 msgstr "A/B:a insticksprogram"
 
-#: processor_box.cc:2486
+#: processor_box.cc:3707
 msgid "Edit with generic controls..."
 msgstr ""
 
-#: processor_box.cc:2789
+#: processor_box.cc:4039
 msgid "%1: %2 (by %3)"
 msgstr ""
 
-#: processor_box.cc:2791
+#: processor_box.cc:4041
 msgid "%1 (by %2)"
 msgstr ""
 
@@ -8592,345 +10194,444 @@ msgstr ""
 msgid "main grid"
 msgstr "rutnät"
 
-#: quantize_dialog.cc:52 quantize_dialog.cc:109
+#: quantize_dialog.cc:61 quantize_dialog.cc:118
 msgid "Quantize"
 msgstr "Kvantisera"
 
-#: quantize_dialog.cc:56
+#: quantize_dialog.cc:65
 msgid "Strength"
 msgstr "Styrka"
 
-#: quantize_dialog.cc:59
+#: quantize_dialog.cc:68
 msgid "Swing"
 msgstr "Sving"
 
-#: quantize_dialog.cc:62
+#: quantize_dialog.cc:71
 msgid "Threshold (ticks)"
 msgstr "Tröskel (ticks)"
 
-#: quantize_dialog.cc:63
+#: quantize_dialog.cc:72
 msgid "Snap note start"
 msgstr "Fäst notstart mot"
 
-#: quantize_dialog.cc:64
+#: quantize_dialog.cc:73
 msgid "Snap note end"
 msgstr "Fäst notslut mot"
 
-#: rc_option_editor.cc:77
-msgid "Click audio file:"
-msgstr "Klickljudfil"
-
-#: rc_option_editor.cc:80 rc_option_editor.cc:87
+#: rc_option_editor.cc:83 rc_option_editor.cc:84 rc_option_editor.cc:1550
 msgid "Browse..."
 msgstr "Bläddra..."
 
-#: rc_option_editor.cc:84
+#: rc_option_editor.cc:89
+msgid "Emphasis on first beat:"
+msgstr ""
+
+#: rc_option_editor.cc:95
+msgid "Use default Click:"
+msgstr ""
+
+#: rc_option_editor.cc:101
+msgid "Click audio file:"
+msgstr "Klickljudfil"
+
+#: rc_option_editor.cc:108
 msgid "Click emphasis audio file:"
 msgstr "Betoning:"
 
-#: rc_option_editor.cc:116
+#: rc_option_editor.cc:154
 msgid "Choose Click"
 msgstr "Markera klick"
 
-#: rc_option_editor.cc:139
+#: rc_option_editor.cc:177
 msgid "Choose Click Emphasis"
 msgstr "Markera klickbetoning"
 
-#: rc_option_editor.cc:170
+#: rc_option_editor.cc:238
 msgid "Limit undo history to"
 msgstr "Begränsa ångrahistoriken till"
 
-#: rc_option_editor.cc:171
+#: rc_option_editor.cc:239
 msgid "Save undo history of"
 msgstr "Spara ångrahistorik för"
 
-#: rc_option_editor.cc:180 rc_option_editor.cc:187
+#: rc_option_editor.cc:248 rc_option_editor.cc:255
 msgid "commands"
 msgstr "kommandon"
 
-#: rc_option_editor.cc:325
+#: rc_option_editor.cc:378
+msgid ""
+"\n"
+"Changes to this setting will only persist after your project has been saved."
+msgstr ""
+
+#: rc_option_editor.cc:389 rc_option_editor.cc:451
+msgid "<b>Recommended Setting: %1 + button 3 (right mouse button)</b>%2"
+msgstr ""
+
+#: rc_option_editor.cc:403
+msgid "Select Keyboard layout:"
+msgstr ""
+
+#: rc_option_editor.cc:422
+msgid "When Clicking:"
+msgstr ""
+
+#: rc_option_editor.cc:429
 msgid "Edit using:"
 msgstr "Redigera med:"
 
-#: rc_option_editor.cc:331 rc_option_editor.cc:357 rc_option_editor.cc:384
+#: rc_option_editor.cc:435 rc_option_editor.cc:465 rc_option_editor.cc:495
 msgid "+ button"
 msgstr "+ musknapp"
 
-#: rc_option_editor.cc:351
+#: rc_option_editor.cc:459
 msgid "Delete using:"
 msgstr "Radera med:"
 
-#: rc_option_editor.cc:378
+#: rc_option_editor.cc:481
+msgid "<b>Recommended Setting: %1 + button 1 (left mouse button)</b>%2"
+msgstr ""
+
+#: rc_option_editor.cc:489
 msgid "Insert note using:"
 msgstr ""
 
-#: rc_option_editor.cc:405
-msgid "Ignore snap using:"
+#: rc_option_editor.cc:507
+msgid "When Beginning a Drag:"
 msgstr ""
 
-#: rc_option_editor.cc:421
-msgid "Keyboard layout:"
-msgstr "Tangentbordslayout:"
+#: rc_option_editor.cc:518 rc_option_editor.cc:545 rc_option_editor.cc:578
+#: rc_option_editor.cc:599 rc_option_editor.cc:643 rc_option_editor.cc:676
+#: rc_option_editor.cc:702 rc_option_editor.cc:730 rc_option_editor.cc:759
+#: rc_option_editor.cc:781
+msgid "<b>Recommended Setting: %1</b>%2"
+msgstr ""
 
-#: rc_option_editor.cc:544
-msgid "Font scaling:"
-msgstr "Typsnittskalning"
+#: rc_option_editor.cc:532
+msgid "Copy items using:"
+msgstr ""
 
-#: rc_option_editor.cc:547
-msgid "Default"
+#: rc_option_editor.cc:559
+msgid "Constrain drag using:"
 msgstr ""
 
-#: rc_option_editor.cc:573
-msgid "Major font-scale changes require an application restart to re-layout."
+#: rc_option_editor.cc:567
+msgid "When Beginning a Trim:"
 msgstr ""
 
-#: rc_option_editor.cc:614
-msgid "Waveform Clip Level (dBFS):"
+#: rc_option_editor.cc:586
+msgid "Trim contents using:"
 msgstr ""
 
-#: rc_option_editor.cc:666
-msgid "Playback (seconds of buffering):"
-msgstr "Uppspelning (sekunder buffert):"
+#: rc_option_editor.cc:607
+msgid "Anchored trim using:"
+msgstr ""
 
-#: rc_option_editor.cc:679
-msgid "Recording (seconds of buffering):"
-msgstr "Inspelning (sekunder buffert):"
+#: rc_option_editor.cc:651
+msgid "Resize notes relatively using:"
+msgstr ""
 
-#: rc_option_editor.cc:737
-msgid "Control Surface Protocol"
+#: rc_option_editor.cc:660
+msgid "While Dragging:"
+msgstr ""
+
+#: rc_option_editor.cc:684
+msgid "Ignore snap using:"
+msgstr ""
+
+#: rc_option_editor.cc:710
+msgid "Snap relatively using:"
+msgstr ""
+
+#: rc_option_editor.cc:718
+msgid "While Trimming:"
+msgstr ""
+
+#: rc_option_editor.cc:738
+msgid "Resize overlapped regions using:"
 msgstr ""
 
 #: rc_option_editor.cc:746
-msgid "Double-click on a name to edit settings for an enabled protocol"
-msgstr "Dubbleklicka aktiverad kontrollytas namn för inställningar"
+msgid "While Dragging Control Points:"
+msgstr ""
 
-#: rc_option_editor.cc:903
-msgid "Show Video Export Info before export"
+#: rc_option_editor.cc:767
+msgid "Fine adjust using:"
 msgstr ""
 
-#: rc_option_editor.cc:904
-msgid "Show Video Server Startup Dialog"
+#: rc_option_editor.cc:789
+msgid "Push points using:"
 msgstr ""
 
-#: rc_option_editor.cc:905
-msgid "Advanced Setup (remote video server)"
+#: rc_option_editor.cc:1029
+msgid "GUI and Font scaling:"
 msgstr ""
 
-#: rc_option_editor.cc:913
-msgid ""
-"<b>When enabled</b> you can speficify a custom video-server URL and docroot. "
-"- Do not enable this option unless you know what you are doing."
+#: rc_option_editor.cc:1032
+msgid "Default"
 msgstr ""
 
-#: rc_option_editor.cc:915
-msgid "Video Server URL:"
+#: rc_option_editor.cc:1058
+msgid "Adjusting the scale requires an application restart to re-layout."
 msgstr ""
 
-#: rc_option_editor.cc:920
-msgid ""
-"Base URL of the video-server including http prefix. This is usually 'http://"
-"hostname.example.org:1554/' and defaults to 'http://localhost:1554/' when "
-"the video-server is running locally"
+#: rc_option_editor.cc:1100
+msgid "∞"
 msgstr ""
 
-#: rc_option_editor.cc:922
-msgid "Video Folder:"
+#: rc_option_editor.cc:1101
+msgid "30 sec"
 msgstr ""
 
-#: rc_option_editor.cc:927
-msgid ""
-"Local path to the video-server document-root. Only files below this "
-"directory will be accessible by the video-server. If the server run on a "
-"remote host, it should point to a network mounted folder of the server's "
-"docroot or be left empty if it is unvailable. It is used for the local video-"
-"monitor and file-browsing when opening/adding a video file."
+#: rc_option_editor.cc:1102
+msgid "1 min"
 msgstr ""
 
-#: rc_option_editor.cc:934
-msgid ""
-"<b>When enabled</b> an information window with details is displayed before "
-"the video-export dialog."
+#: rc_option_editor.cc:1103
+msgid "2 mins"
+msgstr ""
+
+#: rc_option_editor.cc:1104
+msgid "3 mins"
+msgstr ""
+
+#: rc_option_editor.cc:1105
+msgid "4 mins"
 msgstr ""
 
-#: rc_option_editor.cc:939
+#: rc_option_editor.cc:1106
+msgid "5 mins"
+msgstr ""
+
+#: rc_option_editor.cc:1109
 msgid ""
-"<b>When enabled</b> the video server is never launched automatically without "
-"confirmation"
+"Specify the default timeout for plugin instantiation. Plugins that require "
+"more time to load will be blacklisted. A value of 0 disables the timeout."
 msgstr ""
 
-#: rc_option_editor.cc:1022
-msgid "Always Display Plugin Scan Progress"
+#: rc_option_editor.cc:1111
+msgid "Scan Time Out:"
 msgstr ""
 
-#: rc_option_editor.cc:1023
-msgid "Scan for [new] VST Plugins on Application Start"
+#: rc_option_editor.cc:1159
+msgid "Waveform Clip Level (dBFS):"
 msgstr ""
 
-#: rc_option_editor.cc:1024
-msgid "Scan for AudioUnit Plugins on Application Start"
+#: rc_option_editor.cc:1212
+msgid "Small sessions (4-16 tracks)"
 msgstr ""
 
-#: rc_option_editor.cc:1035
-msgid "General"
+#: rc_option_editor.cc:1213
+msgid "Medium sessions (16-64 tracks)"
 msgstr ""
 
-#: rc_option_editor.cc:1041
-msgid "Scan for Plugins"
+#: rc_option_editor.cc:1214
+msgid "Large sessions (64+ tracks)"
 msgstr ""
 
-#: rc_option_editor.cc:1048
-msgid ""
-"<b>When enabled</b> a popup window showing plugin scan progress is displayed "
-"for indexing (cache load) and discovery (detect new plugins)"
+#: rc_option_editor.cc:1215
+msgid "Custom (set by sliders below)"
+msgstr ""
+
+#: rc_option_editor.cc:1219 export_video_dialog.cc:167
+msgid "Preset:"
+msgstr ""
+
+#: rc_option_editor.cc:1231
+msgid "Playback (seconds of buffering):"
+msgstr "Uppspelning (sekunder buffert):"
+
+#: rc_option_editor.cc:1244
+msgid "Recording (seconds of buffering):"
+msgstr "Inspelning (sekunder buffert):"
+
+#: rc_option_editor.cc:1322
+msgid "programming error: unknown buffering preset string, index = %1"
+msgstr ""
+
+#: rc_option_editor.cc:1353
+msgid "Control Surface Protocol"
 msgstr ""
 
-#: rc_option_editor.cc:1055
+#: rc_option_editor.cc:1367
 msgid ""
-"Specify the default timeout for plugin instantiation in 1/10 seconds. "
-"Plugins that require more time to load will be blacklisted. A value of 0 "
-"disables the timeout."
+"Click to edit the settings for selected protocol ( it must be ENABLED "
+"first ):"
 msgstr ""
 
-#: rc_option_editor.cc:1057
-msgid "Scan Time Out [deciseconds]"
+#: rc_option_editor.cc:1371
+msgid "Show Protocol Settings"
 msgstr ""
 
-#: rc_option_editor.cc:1065
-msgid "VST"
+#: rc_option_editor.cc:1494
+msgid "Configuration"
+msgstr ""
+
+#: rc_option_editor.cc:1547
+msgid "Show Video Export Info before export"
+msgstr ""
+
+#: rc_option_editor.cc:1548
+msgid "Show Video Server Startup Dialog"
 msgstr ""
 
-#: rc_option_editor.cc:1071
-msgid "Clear VST Cache"
+#: rc_option_editor.cc:1549
+msgid "Advanced Setup (remote video server)"
 msgstr ""
 
-#: rc_option_editor.cc:1075
-msgid "Clear VST Blacklist"
+#: rc_option_editor.cc:1556
+msgid "Video Server"
 msgstr ""
 
-#: rc_option_editor.cc:1083
+#: rc_option_editor.cc:1565
 msgid ""
-"<b>When enabled</b> new VST plugins are searched, tested and added to the "
-"cache index on application start. When disabled new plugins will only be "
-"available after triggering a 'Scan' manually"
+"<b>When enabled</b> you can speficify a custom video-server URL and docroot. "
+"- Do not enable this option unless you know what you are doing."
 msgstr ""
 
-#: rc_option_editor.cc:1086
-msgid "Linux VST Path:"
+#: rc_option_editor.cc:1567
+msgid "Video Server URL:"
 msgstr ""
 
-#: rc_option_editor.cc:1093
-msgid "Windows VST Path:"
+#: rc_option_editor.cc:1572
+msgid ""
+"Base URL of the video-server including http prefix. This is usually 'http://"
+"hostname.example.org:1554/' and defaults to 'http://localhost:1554/' when "
+"the video-server is running locally"
 msgstr ""
 
-#: rc_option_editor.cc:1102
-msgid "Audio Unit"
+#: rc_option_editor.cc:1574
+msgid "Video Folder:"
 msgstr ""
 
-#: rc_option_editor.cc:1111
+#: rc_option_editor.cc:1579
 msgid ""
-"<b>When enabled</b> Audio Unit Plugins are discovered on application start. "
-"When disabled AU plugins will only be available after triggering a 'Scan' "
-"manually. The first successful scan will enable AU auto-scan, Any crash "
-"during plugin discovery will disable it."
+"Local path to the video-server document-root. Only files below this "
+"directory will be accessible by the video-server. If the server run on a "
+"remote host, it should point to a network mounted folder of the server's "
+"docroot or be left empty if it is unvailable. It is used for the local video-"
+"monitor and file-browsing when opening/adding a video file."
 msgstr ""
 
-#: rc_option_editor.cc:1114
-msgid "Clear AU Cache"
+#: rc_option_editor.cc:1584
+msgid ""
+"<b>When enabled</b> an information window with details is displayed before "
+"the video-export dialog."
 msgstr ""
 
-#: rc_option_editor.cc:1118
-msgid "Clear AU Blacklist"
+#: rc_option_editor.cc:1589
+msgid ""
+"<b>When enabled</b> the video server is never launched automatically without "
+"confirmation"
 msgstr ""
 
-#: rc_option_editor.cc:1201
-msgid "Set Windows VST Search Path"
+#: rc_option_editor.cc:1598
+msgid "Custom Path to Video Monitor (%1) - leave empty for default:"
 msgstr ""
 
-#: rc_option_editor.cc:1216
-msgid "Set Linux VST Search Path"
+#: rc_option_editor.cc:1610
+msgid ""
+"Set a custom path to the Video Monitor Executable, changing this requires a "
+"restart."
+msgstr ""
+
+#: rc_option_editor.cc:1661
+msgid "Set Video Monitor Executable"
 msgstr ""
 
-#: rc_option_editor.cc:1297
+#: rc_option_editor.cc:1734
+msgid "Column %1"
+msgstr ""
+
+#: rc_option_editor.cc:1852
 msgid "%1 Preferences"
 msgstr "%1-inställningar"
 
-#: rc_option_editor.cc:1309
+#: rc_option_editor.cc:1874
 msgid "DSP CPU Utilization"
 msgstr "DSP CPU-användning"
 
-#: rc_option_editor.cc:1313
+#: rc_option_editor.cc:1878
 msgid "Signal processing uses"
 msgstr "Signalprocessering använder"
 
-#: rc_option_editor.cc:1318
+#: rc_option_editor.cc:1883
 msgid "all but one processor"
 msgstr "alla förutom en processor"
 
-#: rc_option_editor.cc:1319
+#: rc_option_editor.cc:1884
 msgid "all available processors"
 msgstr "alla tillgängliga processorer"
 
-#: rc_option_editor.cc:1322
+#: rc_option_editor.cc:1887
 msgid "%1 processors"
 msgstr "%1 processor(er)"
 
-#: rc_option_editor.cc:1325
+#: rc_option_editor.cc:1890
 msgid "This setting will only take effect when %1 is restarted."
 msgstr ""
 
-#: rc_option_editor.cc:1330
+#: rc_option_editor.cc:1895
 msgid "Options|Undo"
 msgstr ""
 
-#: rc_option_editor.cc:1337
+#: rc_option_editor.cc:1902
 msgid "Verify removal of last capture"
 msgstr "Bekräfta borttagning av senaste inspelningen"
 
-#: rc_option_editor.cc:1345
-msgid "Make periodic backups of the session file"
-msgstr "Gör periodiska säkerhetskopior"
-
-#: rc_option_editor.cc:1350
+#: rc_option_editor.cc:1907
 msgid "Session Management"
 msgstr ""
 
-#: rc_option_editor.cc:1355
+#: rc_option_editor.cc:1912
+msgid "Make periodic backups of the session file"
+msgstr "Gör periodiska säkerhetskopior"
+
+#: rc_option_editor.cc:1920
 msgid "Always copy imported files"
 msgstr "Kopiera alltid importerade filer"
 
-#: rc_option_editor.cc:1362
+#: rc_option_editor.cc:1927
 msgid "Default folder for new sessions:"
 msgstr ""
 
-#: rc_option_editor.cc:1370
+#: rc_option_editor.cc:1935
 msgid "Maximum number of recent sessions"
 msgstr ""
 
-#: rc_option_editor.cc:1383
+#: rc_option_editor.cc:1941 rc_option_editor.cc:1943 rc_option_editor.cc:1945
+msgid "Misc/Click"
+msgstr ""
+
+#: rc_option_editor.cc:1948
 msgid "Click gain level"
 msgstr ""
 
-#: rc_option_editor.cc:1388 route_time_axis.cc:266 route_time_axis.cc:821
+#: rc_option_editor.cc:1953 route_time_axis.cc:277 route_time_axis.cc:831
 msgid "Automation"
 msgstr "Automatisering"
 
-#: rc_option_editor.cc:1393
+#: rc_option_editor.cc:1958
 msgid "Thinning factor (larger value => less data)"
 msgstr ""
 
-#: rc_option_editor.cc:1402
+#: rc_option_editor.cc:1967
 msgid "Automation sampling interval (milliseconds)"
 msgstr ""
 
-#: rc_option_editor.cc:1414
+#: rc_option_editor.cc:1975
+msgid "Transport Options"
+msgstr ""
+
+#: rc_option_editor.cc:1981
 msgid "Keep record-enable engaged on stop"
 msgstr "Behåll inspelningsläge på vid stopp"
 
-#: rc_option_editor.cc:1423
+#: rc_option_editor.cc:1990
 msgid "Play loop is a transport mode"
 msgstr ""
 
-#: rc_option_editor.cc:1428
+#: rc_option_editor.cc:1995
 msgid ""
 "<b>When enabled</b> the loop button does not start playback but forces "
 "playback to always play the loop\n"
@@ -8939,25 +10640,25 @@ msgid ""
 "cancels loop playback"
 msgstr ""
 
-#: rc_option_editor.cc:1434
+#: rc_option_editor.cc:2001
 msgid "Stop recording when an xrun occurs"
 msgstr "Stoppa inspelningen när en xrun inträffar"
 
-#: rc_option_editor.cc:1439
+#: rc_option_editor.cc:2006
 msgid ""
 "<b>When enabled</b> %1 will stop recording if an over- or underrun is "
 "detected by the audio engine"
 msgstr ""
 
-#: rc_option_editor.cc:1445
+#: rc_option_editor.cc:2012
 msgid "Create markers where xruns occur"
 msgstr "Skapa en markör där en xrun inträffar"
 
-#: rc_option_editor.cc:1454
+#: rc_option_editor.cc:2021
 msgid "Stop at the end of the session"
 msgstr "Stoppa vid slutet av sessionen"
 
-#: rc_option_editor.cc:1459
+#: rc_option_editor.cc:2026
 msgid ""
 "<b>When enabled</b> if %1 is <b>not recording</b>, it will stop the "
 "transport when it reaches the current session end marker\n"
@@ -8966,11 +10667,11 @@ msgid ""
 "all times"
 msgstr ""
 
-#: rc_option_editor.cc:1467
+#: rc_option_editor.cc:2034
 msgid "Do seamless looping (not possible when slaved to MTC, LTC etc)"
 msgstr ""
 
-#: rc_option_editor.cc:1472
+#: rc_option_editor.cc:2039
 msgid ""
 "<b>When enabled</b> this will loop by reading ahead and wrapping around at "
 "the loop point, preventing any need to do a transport locate at the end of "
@@ -8980,39 +10681,83 @@ msgid ""
 "loop when %1 reaches the end which will often cause a small click or delay"
 msgstr ""
 
-#: rc_option_editor.cc:1480
+#: rc_option_editor.cc:2047
 msgid "Disable per-track record disarm while rolling"
 msgstr "Omöjliggör spårspecifik inspelningslägesändring i rullande läge"
 
-#: rc_option_editor.cc:1484
+#: rc_option_editor.cc:2051
 msgid ""
 "<b>When enabled</b> this will prevent you from accidentally stopping "
 "specific tracks recording during a take"
 msgstr ""
 
-#: rc_option_editor.cc:1489
+#: rc_option_editor.cc:2056
 msgid "12dB gain reduction during fast-forward and fast-rewind"
 msgstr "12dB volymreduktion för snabbspolning"
 
-#: rc_option_editor.cc:1493
+#: rc_option_editor.cc:2060
 msgid ""
 "This will reduce the unpleasant increase in perceived volume that occurs "
 "when fast-forwarding or rewinding through some kinds of audio"
 msgstr ""
 
-#: rc_option_editor.cc:1497
-msgid "Sync/Slave"
+#: rc_option_editor.cc:2066
+msgid "Preroll"
+msgstr ""
+
+#: rc_option_editor.cc:2071
+msgid ""
+"The amount of preroll (in seconds) to apply when <b>Play with Preroll</b> is "
+"initiated.\n"
+"\n"
+"If <b>Follow Edits</b> is enabled, the preroll is applied to the playhead "
+"position when a region is selected or trimmed."
+msgstr ""
+
+#: rc_option_editor.cc:2073
+msgid "0 (no pre-roll)"
+msgstr ""
+
+#: rc_option_editor.cc:2074
+msgid "0.1 second"
+msgstr ""
+
+#: rc_option_editor.cc:2075
+msgid "0.25 second"
+msgstr ""
+
+#: rc_option_editor.cc:2076
+msgid "0.5 second"
+msgstr ""
+
+#: rc_option_editor.cc:2077
+msgid "1.0 second"
+msgstr ""
+
+#: rc_option_editor.cc:2078
+msgid "2.0 seconds"
+msgstr ""
+
+#: rc_option_editor.cc:2081 rc_option_editor.cc:2090 rc_option_editor.cc:2106
+#: rc_option_editor.cc:2127 rc_option_editor.cc:2145 rc_option_editor.cc:2147
+#: rc_option_editor.cc:2164 rc_option_editor.cc:2167 rc_option_editor.cc:2169
+#: rc_option_editor.cc:2197
+msgid "Transport/Sync"
+msgstr ""
+
+#: rc_option_editor.cc:2081
+msgid "Synchronization and Slave Options"
 msgstr ""
 
-#: rc_option_editor.cc:1501
+#: rc_option_editor.cc:2085
 msgid "External timecode source"
 msgstr ""
 
-#: rc_option_editor.cc:1510
+#: rc_option_editor.cc:2094
 msgid "Match session video frame rate to external timecode"
 msgstr ""
 
-#: rc_option_editor.cc:1516
+#: rc_option_editor.cc:2100
 msgid ""
 "This option controls the value of the video frame rate <i>while chasing</i> "
 "an external timecode source.\n"
@@ -9026,27 +10771,27 @@ msgid ""
 "external timecode standard and the session standard."
 msgstr ""
 
-#: rc_option_editor.cc:1526
-msgid "Sync lock timecode to clock - Disable drift compensation."
+#: rc_option_editor.cc:2110
+msgid "Sync-lock timecode to clock (disable drift compensation)"
 msgstr ""
 
-#: rc_option_editor.cc:1532
+#: rc_option_editor.cc:2116
 msgid ""
 "<b>When enabled</b> %1 will never varispeed when slaved to external "
 "timecode. Sync Lock indicates that the selected external timecode source "
 "shares clock-sync (Black & Burst, Wordclock, etc) with the audio "
 "interface. This option disables drift compensation. The transport speed is "
-"fixed at 1.0.Varispeed LTC will be ignored and cause drift.\n"
+"fixed at 1.0. Vari-speed LTC will be ignored and cause drift.\n"
 "\n"
 "<b>When disabled</b> %1 will compensate for potential drift, regardless if "
 "the timecode sources shares clock sync."
 msgstr ""
 
-#: rc_option_editor.cc:1547
+#: rc_option_editor.cc:2131
 msgid "Lock to 29.9700 fps instead of 30000/1001"
 msgstr ""
 
-#: rc_option_editor.cc:1553
+#: rc_option_editor.cc:2137
 msgid ""
 "<b>When enabled</b> the external timecode source is assumed to use 29.97 fps "
 "instead of 30000/1001.\n"
@@ -9059,659 +10804,926 @@ msgid ""
 "variant of using exactly 29.97 fps has zero timecode drift.\n"
 msgstr ""
 
-#: rc_option_editor.cc:1563
+#: rc_option_editor.cc:2147
 msgid "LTC Reader"
 msgstr ""
 
-#: rc_option_editor.cc:1567
+#: rc_option_editor.cc:2151
 msgid "LTC incoming port"
 msgstr ""
 
-#: rc_option_editor.cc:1582
+#: rc_option_editor.cc:2167
 msgid "LTC Generator"
 msgstr ""
 
-#: rc_option_editor.cc:1587
+#: rc_option_editor.cc:2172
 msgid "Enable LTC generator"
 msgstr ""
 
-#: rc_option_editor.cc:1594
+#: rc_option_editor.cc:2179
 msgid "Send LTC while stopped"
 msgstr ""
 
-#: rc_option_editor.cc:1600
+#: rc_option_editor.cc:2185
 msgid ""
 "<b>When enabled</b> %1 will continue to send LTC information even when the "
 "transport (playhead) is not moving"
 msgstr ""
 
-#: rc_option_editor.cc:1606
+#: rc_option_editor.cc:2191
 msgid "LTC generator level"
 msgstr ""
 
-#: rc_option_editor.cc:1610
+#: rc_option_editor.cc:2195
 msgid ""
 "Specify the Peak Volume of the generated LTC signal in dbFS. A good value "
 "is  0dBu ^= -18dbFS in an EBU calibrated system"
 msgstr ""
 
-#: rc_option_editor.cc:1622
-msgid "Allow dragging of playhead"
-msgstr ""
+#: rc_option_editor.cc:2204
+msgid "Make rubberband selection rectangle snap to the grid"
+msgstr "Gummibandsmarkeringen fäster mot rutnätet"
 
-#: rc_option_editor.cc:1630
-msgid "Move relevant automation when audio regions are moved"
-msgstr "Flytta automation tillsammans med regioner"
+#: rc_option_editor.cc:2211
+msgid "Name new markers"
+msgstr "Namnge nya markörer"
 
-#: rc_option_editor.cc:1638
-msgid "Show meters on tracks in the editor"
-msgstr "Visa nivåmätning vid spåren i redigeraren"
+#: rc_option_editor.cc:2216
+msgid ""
+"If enabled, popup a dialog when a new marker is created to allow its name to "
+"be set as it is created.\n"
+"\n"
+"You can always rename markers by right-clicking on them"
+msgstr ""
 
-#: rc_option_editor.cc:1646
-msgid "Display master-meter in the toolbar"
+#: rc_option_editor.cc:2222
+msgid "Allow dragging of playhead"
 msgstr ""
 
-#: rc_option_editor.cc:1653
-msgid "Default fade shape"
+#: rc_option_editor.cc:2230
+msgid "Display master-meter in the toolbar"
 msgstr ""
 
-#: rc_option_editor.cc:1672
-msgid "Regions in active edit groups are edited together"
+#: rc_option_editor.cc:2239
+msgid "Show zoom toolbar (if torn off)"
 msgstr ""
 
-#: rc_option_editor.cc:1673
-msgid "whenever they overlap in time"
+#: rc_option_editor.cc:2247
+msgid ""
+"Always use mouse cursor position as zoom focus when zooming using mouse "
+"scroll wheel"
 msgstr ""
 
-#: rc_option_editor.cc:1674
-msgid "only if they have identical length, position and origin"
+#: rc_option_editor.cc:2256
+msgid "Update editor window during drags of the summary"
 msgstr ""
 
-#: rc_option_editor.cc:1684
-msgid "Make rubberband selection rectangle snap to the grid"
-msgstr "Gummibandsmarkeringen fäster mot rutnätet"
-
-#: rc_option_editor.cc:1692
-msgid "Show waveforms in regions"
-msgstr "Visa vågformer i regioner"
+#: rc_option_editor.cc:2264
+msgid "Auto-scroll editor window when dragging near its edges"
+msgstr ""
 
-#: rc_option_editor.cc:1700
+#: rc_option_editor.cc:2272
 msgid "Show gain envelopes in audio regions"
 msgstr ""
 
-#: rc_option_editor.cc:1701
+#: rc_option_editor.cc:2273
 msgid "in all modes"
 msgstr ""
 
-#: rc_option_editor.cc:1702
-msgid "only in region gain mode"
+#: rc_option_editor.cc:2274
+msgid "only in Draw and Internal Edit modes"
 msgstr ""
 
-#: rc_option_editor.cc:1709
-msgid "Waveform scale"
-msgstr "VÃ¥gformsskala"
-
-#: rc_option_editor.cc:1714
-msgid "linear"
-msgstr "linjär"
-
-#: rc_option_editor.cc:1715
-msgid "logarithmic"
-msgstr "logaritmisk"
-
-#: rc_option_editor.cc:1721
-msgid "Waveform shape"
-msgstr "VÃ¥gformsutseende"
-
-#: rc_option_editor.cc:1726
-msgid "traditional"
-msgstr "traditionell"
+#: rc_option_editor.cc:2279
+msgid "Editor Behavior"
+msgstr ""
 
-#: rc_option_editor.cc:1727
-msgid "rectified"
-msgstr "korrigerad"
+#: rc_option_editor.cc:2284
+msgid "Move relevant automation when audio regions are moved"
+msgstr "Flytta automation tillsammans med regioner"
 
-#: rc_option_editor.cc:1736
-msgid "Show waveforms for audio while it is being recorded"
-msgstr "Visa vågformer vid inspelning"
+#: rc_option_editor.cc:2291
+msgid "Default fade shape"
+msgstr ""
 
-#: rc_option_editor.cc:1744
-msgid "Show zoom toolbar"
-msgstr "Visa zoom-verktygsraden"
+#: rc_option_editor.cc:2310
+msgid "Regions in active edit groups are edited together"
+msgstr ""
 
-#: rc_option_editor.cc:1752
-msgid "Update editor window during drags of the summary"
+#: rc_option_editor.cc:2311
+msgid "whenever they overlap in time"
 msgstr ""
 
-#: rc_option_editor.cc:1760
-msgid "Synchronise editor and mixer selection"
+#: rc_option_editor.cc:2312
+msgid "only if they have identical length, position and origin"
 msgstr ""
 
-#: rc_option_editor.cc:1767
-msgid "Name new markers"
-msgstr "Namnge nya markörer"
+#: rc_option_editor.cc:2321
+msgid "Layering model"
+msgstr ""
 
-#: rc_option_editor.cc:1773
-msgid ""
-"If enabled, popup a dialog when a new marker is created to allow its name to "
-"be set as it is created.\n"
-"\n"
-"You can always rename markers by right-clicking on them"
+#: rc_option_editor.cc:2326
+msgid "later is higher"
 msgstr ""
 
-#: rc_option_editor.cc:1779
-msgid "Auto-scroll editor window when dragging near its edges"
+#: rc_option_editor.cc:2327
+msgid "manual layering"
 msgstr ""
 
-#: rc_option_editor.cc:1786
+#: rc_option_editor.cc:2332
 msgid "After splitting selected regions, select"
 msgstr ""
 
-#: rc_option_editor.cc:1791
+#: rc_option_editor.cc:2337
 msgid "no regions"
 msgstr ""
 
-#: rc_option_editor.cc:1794
+#: rc_option_editor.cc:2340
 msgid "newly-created regions"
 msgstr ""
 
-#: rc_option_editor.cc:1798
+#: rc_option_editor.cc:2344
 msgid "existing selection and newly-created regions"
 msgstr ""
 
-#: rc_option_editor.cc:1805
+#: rc_option_editor.cc:2348 rc_option_editor.cc:2351 rc_option_editor.cc:2360
+#: rc_option_editor.cc:2378 rc_option_editor.cc:2390 rc_option_editor.cc:2392
+msgid "Editor/Waveforms"
+msgstr ""
+
+#: rc_option_editor.cc:2348
+msgid "Waveforms"
+msgstr ""
+
+#: rc_option_editor.cc:2354
+msgid "Show waveforms in regions"
+msgstr "Visa vågformer i regioner"
+
+#: rc_option_editor.cc:2363
+msgid "Show waveforms for audio while it is being recorded"
+msgstr "Visa vågformer vid inspelning"
+
+#: rc_option_editor.cc:2370
+msgid "Waveform scale"
+msgstr "VÃ¥gformsskala"
+
+#: rc_option_editor.cc:2375
+msgid "linear"
+msgstr "linjär"
+
+#: rc_option_editor.cc:2376
+msgid "logarithmic"
+msgstr "logaritmisk"
+
+#: rc_option_editor.cc:2382
+msgid "Waveform shape"
+msgstr "VÃ¥gformsutseende"
+
+#: rc_option_editor.cc:2387
+msgid "traditional"
+msgstr "traditionell"
+
+#: rc_option_editor.cc:2388
+msgid "rectified"
+msgstr "korrigerad"
+
+#: rc_option_editor.cc:2397
 msgid "Buffering"
 msgstr "Buffertar"
 
-#: rc_option_editor.cc:1813
+#: rc_option_editor.cc:2405
 msgid "Record monitoring handled by"
 msgstr ""
 
-#: rc_option_editor.cc:1819
+#: rc_option_editor.cc:2411
 msgid "via Audio Driver"
 msgstr ""
 
-#: rc_option_editor.cc:1825
+#: rc_option_editor.cc:2417
 msgid "audio hardware"
 msgstr "ljudhårdvaran"
 
-#: rc_option_editor.cc:1832
+#: rc_option_editor.cc:2424
 msgid "Tape machine mode"
 msgstr "Bandmaskingläge"
 
-#: rc_option_editor.cc:1837
+#: rc_option_editor.cc:2429
 msgid "Connection of tracks and busses"
 msgstr "Spår- och bussanslutning"
 
-#: rc_option_editor.cc:1842
+#: rc_option_editor.cc:2435
 msgid "Auto-connect master/monitor busses"
 msgstr "Anslut master/medhörningsbussar automatiskt"
 
-#: rc_option_editor.cc:1849
+#: rc_option_editor.cc:2442
 msgid "Connect track inputs"
 msgstr "Anslut spåringångar"
 
-#: rc_option_editor.cc:1854
+#: rc_option_editor.cc:2447
 msgid "automatically to physical inputs"
 msgstr "automatiskt till fysiska ingångar"
 
-#: rc_option_editor.cc:1855 rc_option_editor.cc:1868
+#: rc_option_editor.cc:2448 rc_option_editor.cc:2461
 msgid "manually"
 msgstr "manuellt"
 
-#: rc_option_editor.cc:1861
+#: rc_option_editor.cc:2454
 msgid "Connect track and bus outputs"
 msgstr "Anslut spår- och bussutgångar"
 
-#: rc_option_editor.cc:1866
+#: rc_option_editor.cc:2459
 msgid "automatically to physical outputs"
 msgstr "automatiskt till fysiska utgångar"
 
-#: rc_option_editor.cc:1867
+#: rc_option_editor.cc:2460
 msgid "automatically to master bus"
 msgstr "automatiskt till master-bussen"
 
-#: rc_option_editor.cc:1872
+#: rc_option_editor.cc:2467
+msgid "Use 'Strict-I/O' for new tracks or Busses"
+msgstr ""
+
+#: rc_option_editor.cc:2478
 msgid "Denormals"
 msgstr ""
 
-#: rc_option_editor.cc:1877
+#: rc_option_editor.cc:2483
 msgid "Use DC bias to protect against denormals"
 msgstr "Använd DC-bias för att skydda mot denormals"
 
-#: rc_option_editor.cc:1884
+#: rc_option_editor.cc:2490
 msgid "Processor handling"
 msgstr "Processorhantering"
 
-#: rc_option_editor.cc:1890
+#: rc_option_editor.cc:2496
 msgid "no processor handling"
 msgstr "ingen processorhantering"
 
-#: rc_option_editor.cc:1896
+#: rc_option_editor.cc:2502
 msgid "use FlushToZero"
 msgstr "använd FlushToZero"
 
-#: rc_option_editor.cc:1903
+#: rc_option_editor.cc:2509
 msgid "use DenormalsAreZero"
 msgstr "använd DenormalsAreZero"
 
-#: rc_option_editor.cc:1910
+#: rc_option_editor.cc:2516
 msgid "use FlushToZero and DenormalsAreZero"
 msgstr ""
 
-#: rc_option_editor.cc:1926
-msgid "Silence plugins when the transport is stopped"
-msgstr ""
-
-#: rc_option_editor.cc:1934
-msgid "Make new plugins active"
-msgstr "Aktivera nya insticksprogram automatiskt"
-
-#: rc_option_editor.cc:1944
+#: rc_option_editor.cc:2532
 msgid "Enable automatic analysis of audio"
 msgstr "Analysera ljudfiler automatiskt"
 
-#: rc_option_editor.cc:1952
+#: rc_option_editor.cc:2540
 msgid "Replicate missing region channels"
 msgstr "Ã…terskapa saknade regioners kanaler"
 
-#: rc_option_editor.cc:1959 rc_option_editor.cc:1961 rc_option_editor.cc:1976
-#: rc_option_editor.cc:1988 rc_option_editor.cc:2000 rc_option_editor.cc:2012
-#: rc_option_editor.cc:2016 rc_option_editor.cc:2024 rc_option_editor.cc:2032
-#: rc_option_editor.cc:2040 rc_option_editor.cc:2042 rc_option_editor.cc:2050
-#: rc_option_editor.cc:2058 rc_option_editor.cc:2066 rc_option_editor.cc:2074
-#: rc_option_editor.cc:2076
-msgid "Solo / mute"
-msgstr "Solo / tysta"
-
-#: rc_option_editor.cc:1964
-msgid "Solo-in-place mute cut (dB)"
+#: rc_option_editor.cc:2547 rc_option_editor.cc:2556 rc_option_editor.cc:2558
+#: rc_option_editor.cc:2566 rc_option_editor.cc:2574 rc_option_editor.cc:2582
+#: rc_option_editor.cc:2600 rc_option_editor.cc:2612 rc_option_editor.cc:2624
+#: rc_option_editor.cc:2626 rc_option_editor.cc:2628 rc_option_editor.cc:2636
+#: rc_option_editor.cc:2644 rc_option_editor.cc:2652 rc_option_editor.cc:2662
+#: rc_option_editor.cc:2663
+msgid "Solo & mute"
 msgstr ""
 
-#: rc_option_editor.cc:1971
+#: rc_option_editor.cc:2551
 msgid "Solo controls are Listen controls"
 msgstr "Solokontroller är avlyssningskontroller"
 
-#: rc_option_editor.cc:1980
+#: rc_option_editor.cc:2561
+msgid "Exclusive solo"
+msgstr "Avskild solo"
+
+#: rc_option_editor.cc:2569
+msgid "Show solo muting"
+msgstr "Visa solotystning"
+
+#: rc_option_editor.cc:2577
+msgid "Soloing overrides muting"
+msgstr "Solo åsidosätter tystning"
+
+#: rc_option_editor.cc:2585
+msgid "Solo-in-place mute cut (dB)"
+msgstr ""
+
+#: rc_option_editor.cc:2592
 msgid "Listen Position"
 msgstr "Avlyssningsposition"
 
-#: rc_option_editor.cc:1985
+#: rc_option_editor.cc:2597
 msgid "after-fader (AFL)"
 msgstr ""
 
-#: rc_option_editor.cc:1986
+#: rc_option_editor.cc:2598
 msgid "pre-fader (PFL)"
 msgstr ""
 
-#: rc_option_editor.cc:1992
+#: rc_option_editor.cc:2604
 msgid "PFL signals come from"
 msgstr "PFL-signaler kommer från"
 
-#: rc_option_editor.cc:1997
+#: rc_option_editor.cc:2609
 msgid "before pre-fader processors"
 msgstr "innan för-nivåreglageprocessorer"
 
-#: rc_option_editor.cc:1998
+#: rc_option_editor.cc:2610
 msgid "pre-fader but after pre-fader processors"
 msgstr "för-nivåreglage men efter för-nivåreglageprocessorer"
 
-#: rc_option_editor.cc:2004
+#: rc_option_editor.cc:2616
 msgid "AFL signals come from"
 msgstr "AFL-signaler kommer från"
 
-#: rc_option_editor.cc:2009
+#: rc_option_editor.cc:2621
 msgid "immediately post-fader"
 msgstr ""
 
-#: rc_option_editor.cc:2010
+#: rc_option_editor.cc:2622
 msgid "after post-fader processors (before pan)"
 msgstr ""
 
-#: rc_option_editor.cc:2019
-msgid "Exclusive solo"
-msgstr "Avskild solo"
-
-#: rc_option_editor.cc:2027
-msgid "Show solo muting"
-msgstr "Visa solotystning"
-
-#: rc_option_editor.cc:2035
-msgid "Soloing overrides muting"
-msgstr "Solo åsidosätter tystning"
-
-#: rc_option_editor.cc:2040
+#: rc_option_editor.cc:2626
 msgid "Default track / bus muting options"
 msgstr "Standardinställningar för spår-/busstystning"
 
-#: rc_option_editor.cc:2045
+#: rc_option_editor.cc:2631
 msgid "Mute affects pre-fader sends"
 msgstr "Tystning påverkar för-reglagesändningar"
 
-#: rc_option_editor.cc:2053
+#: rc_option_editor.cc:2639
 msgid "Mute affects post-fader sends"
 msgstr "Tystning påverkar efter-reglagesändningar"
 
-#: rc_option_editor.cc:2061
+#: rc_option_editor.cc:2647
 msgid "Mute affects control outputs"
 msgstr "Tystning påverkar kontrollutgångar"
 
-#: rc_option_editor.cc:2069
+#: rc_option_editor.cc:2655
 msgid "Mute affects main outputs"
 msgstr "Tystning påverkar huvudutgångarna"
 
-#: rc_option_editor.cc:2074
+#: rc_option_editor.cc:2662
 msgid "Send Routing"
 msgstr ""
 
-#: rc_option_editor.cc:2079
+#: rc_option_editor.cc:2666
 msgid "Link panners of Aux and External Sends with main panner by default"
 msgstr ""
 
-#: rc_option_editor.cc:2087
+#: rc_option_editor.cc:2672
+msgid "MIDI Preferences"
+msgstr ""
+
+#: rc_option_editor.cc:2677
 msgid "MIDI read-ahead time (seconds)"
 msgstr ""
 
-#: rc_option_editor.cc:2105
+#: rc_option_editor.cc:2687
+msgid "Initial program change"
+msgstr "Initiell programändring"
+
+#: rc_option_editor.cc:2696
+msgid "Display first MIDI bank/program as 0"
+msgstr ""
+
+#: rc_option_editor.cc:2704
+msgid "Never display periodic MIDI messages (MTC, MIDI Clock)"
+msgstr ""
+
+#: rc_option_editor.cc:2712
+msgid "Sound MIDI notes as they are selected in the editor"
+msgstr ""
+
+#: rc_option_editor.cc:2720
+msgid "Send MIDI control feedback"
+msgstr "Skicka MIDI-kontrollgensvar"
+
+#: rc_option_editor.cc:2725 rc_option_editor.cc:2727 rc_option_editor.cc:2735
+#: rc_option_editor.cc:2737 rc_option_editor.cc:2745 rc_option_editor.cc:2754
+#: rc_option_editor.cc:2756 rc_option_editor.cc:2764 rc_option_editor.cc:2772
+#: rc_option_editor.cc:2781
+msgid "MIDI/Sync"
+msgstr ""
+
+#: rc_option_editor.cc:2725
+msgid "MIDI Clock"
+msgstr ""
+
+#: rc_option_editor.cc:2735
+msgid "MIDI Time Code (MTC)"
+msgstr ""
+
+#: rc_option_editor.cc:2740
 msgid "Send MIDI Time Code"
 msgstr "Skicka MIDI-tidskod"
 
-#: rc_option_editor.cc:2113
+#: rc_option_editor.cc:2748
 msgid "Percentage either side of normal transport speed to transmit MTC"
 msgstr ""
 
-#: rc_option_editor.cc:2122
+#: rc_option_editor.cc:2754
+msgid "Midi Machine Control (MMC)"
+msgstr ""
+
+#: rc_option_editor.cc:2759
 msgid "Obey MIDI Machine Control commands"
 msgstr "Lyd MIDI Machine Control-kommandon"
 
-#: rc_option_editor.cc:2130
+#: rc_option_editor.cc:2767
 msgid "Send MIDI Machine Control commands"
 msgstr "Skicka MIDI Machine Control-kommandon"
 
-#: rc_option_editor.cc:2138
-msgid "Send MIDI control feedback"
-msgstr "Skicka MIDI-kontrollgensvar"
-
-#: rc_option_editor.cc:2146
+#: rc_option_editor.cc:2775
 msgid "Inbound MMC device ID"
 msgstr "Inkommande MMC-enhets-ID"
 
-#: rc_option_editor.cc:2155
+#: rc_option_editor.cc:2784
 msgid "Outbound MMC device ID"
 msgstr "Utgående MMC-enhets-ID"
 
-#: rc_option_editor.cc:2164
-msgid "Initial program change"
-msgstr "Initiell programändring"
-
-#: rc_option_editor.cc:2173
-msgid "Display first MIDI bank/program as 0"
-msgstr ""
-
-#: rc_option_editor.cc:2181
-msgid "Never display periodic MIDI messages (MTC, MIDI Clock)"
-msgstr ""
-
-#: rc_option_editor.cc:2189
-msgid "Sound MIDI notes as they are selected"
-msgstr ""
-
-#: rc_option_editor.cc:2194
+#: rc_option_editor.cc:2790
 msgid "Midi Audition"
 msgstr ""
 
-#: rc_option_editor.cc:2198
+#: rc_option_editor.cc:2794
 msgid "Midi Audition Synth (LV2)"
 msgstr ""
 
-#: rc_option_editor.cc:2229 rc_option_editor.cc:2239 rc_option_editor.cc:2241
+#: rc_option_editor.cc:2825 rc_option_editor.cc:2835 rc_option_editor.cc:2837
 msgid "User interaction"
 msgstr ""
 
-#: rc_option_editor.cc:2232
+#: rc_option_editor.cc:2828
 msgid ""
 "Use translations of %1 messages\n"
 "   <i>(requires a restart of %1 to take effect)</i>\n"
 "   <i>(if available for your language preferences)</i>"
 msgstr ""
 
-#: rc_option_editor.cc:2239
+#: rc_option_editor.cc:2835
 msgid "Keyboard"
 msgstr "Tangentbord"
 
-#: rc_option_editor.cc:2249
-msgid "Control surface remote ID"
-msgstr "Kontrollytans fjärr-ID"
+#: rc_option_editor.cc:2848 startup.cc:352
+msgid "Scan for Plugins"
+msgstr ""
+
+#: rc_option_editor.cc:2853
+msgid "General"
+msgstr ""
+
+#: rc_option_editor.cc:2858
+msgid "Always Display Plugin Scan Progress"
+msgstr ""
+
+#: rc_option_editor.cc:2864
+msgid ""
+"<b>When enabled</b> a popup window showing plugin scan progress is displayed "
+"for indexing (cache load) and discovery (detect new plugins)"
+msgstr ""
+
+#: rc_option_editor.cc:2869
+msgid "Silence plugins when the transport is stopped"
+msgstr ""
+
+#: rc_option_editor.cc:2875
+msgid ""
+"<b>When enabled</b> plugins will be reset at transport stop. When disabled "
+"plugins will be left unchanged at transport stop.\n"
+"\n"
+"This mostly affects plugins with a \"tail\" like Reverbs."
+msgstr ""
+
+#: rc_option_editor.cc:2879
+msgid "Make new plugins active"
+msgstr "Aktivera nya insticksprogram automatiskt"
+
+#: rc_option_editor.cc:2885
+msgid ""
+"<b>When enabled</b> plugins will be activated when they are added to tracks/"
+"busses. When disabled plugins will be left inactive when they are added to "
+"tracks/busses"
+msgstr ""
+
+#: rc_option_editor.cc:2888 rc_option_editor.cc:2896 rc_option_editor.cc:2908
+#: rc_option_editor.cc:2913 rc_option_editor.cc:2915 rc_option_editor.cc:2920
+#: rc_option_editor.cc:2927 rc_option_editor.cc:2932 rc_option_editor.cc:2941
+msgid "Plugins/VST"
+msgstr ""
+
+#: rc_option_editor.cc:2888
+msgid "VST"
+msgstr ""
+
+#: rc_option_editor.cc:2892
+msgid "Scan for [new] VST Plugins on Application Start"
+msgstr ""
+
+#: rc_option_editor.cc:2898
+msgid ""
+"<b>When enabled</b> new VST plugins are searched, tested and added to the "
+"cache index on application start. When disabled new plugins will only be "
+"available after triggering a 'Scan' manually"
+msgstr ""
+
+#: rc_option_editor.cc:2904
+msgid "Verbose Plugin Scan"
+msgstr ""
+
+#: rc_option_editor.cc:2910
+msgid ""
+"<b>When enabled</b> additional information for every plugin is added to the "
+"Log Window."
+msgstr ""
+
+#: rc_option_editor.cc:2918
+msgid "VST Cache:"
+msgstr ""
+
+#: rc_option_editor.cc:2923
+msgid "VST Blacklist:"
+msgstr ""
+
+#: rc_option_editor.cc:2930
+msgid "Linux VST Path:"
+msgstr ""
+
+#: rc_option_editor.cc:2935 rc_option_editor.cc:2948
+msgid "Path:"
+msgstr ""
+
+#: rc_option_editor.cc:2944
+msgid "Windows VST Path:"
+msgstr ""
+
+#: rc_option_editor.cc:2954 rc_option_editor.cc:2966 rc_option_editor.cc:2971
+msgid "Plugins/Audio Unit"
+msgstr ""
+
+#: rc_option_editor.cc:2954
+msgid "Audio Unit"
+msgstr ""
+
+#: rc_option_editor.cc:2958
+msgid "Scan for AudioUnit Plugins on Application Start"
+msgstr ""
+
+#: rc_option_editor.cc:2964
+msgid ""
+"<b>When enabled</b> Audio Unit Plugins are discovered on application start. "
+"When disabled AU plugins will only be available after triggering a 'Scan' "
+"manually. The first successful scan will enable AU auto-scan, Any crash "
+"during plugin discovery will disable it."
+msgstr ""
+
+#: rc_option_editor.cc:2969
+msgid "AU Cache:"
+msgstr ""
+
+#: rc_option_editor.cc:2974
+msgid "AU Blacklist:"
+msgstr ""
+
+#: rc_option_editor.cc:2978
+msgid "Plugin GUI"
+msgstr ""
+
+#: rc_option_editor.cc:2982
+msgid "Automatically open the plugin GUI when adding a new plugin"
+msgstr ""
+
+#: rc_option_editor.cc:2991
+msgid "Show Plugin Inline Display on Mixerstrip by default"
+msgstr ""
+
+#: rc_option_editor.cc:2998
+msgid ""
+"Don't automatically open the plugin GUI when the plugin has an inline "
+"display mode"
+msgstr ""
 
-#: rc_option_editor.cc:2254
-msgid "assigned by user"
-msgstr "användardefinierat"
+#: rc_option_editor.cc:3005
+msgid "Instrument"
+msgstr ""
+
+#: rc_option_editor.cc:3009
+msgid "Ask to replace existing instrument plugin"
+msgstr ""
+
+#: rc_option_editor.cc:3017
+msgid "Interactively configure instrument plugins on insert"
+msgstr ""
+
+#: rc_option_editor.cc:3023
+msgid ""
+"<b>When enabled</b> show a dialog to select instrument channel configuration "
+"before adding a multichannel plugin."
+msgstr ""
+
+#: rc_option_editor.cc:3032
+msgid "Disable Graphics Hardware Acceleration (requires restart)"
+msgstr ""
 
-#: rc_option_editor.cc:2255
-msgid "follows order of mixer"
-msgstr "följer mixerns ordning"
+#: rc_option_editor.cc:3038
+msgid ""
+"Render large parts of the application user-interface in software, instead of "
+"using 2D-graphics acceleration.\n"
+"This requires restarting %1 before having an effect"
+msgstr ""
 
-#: rc_option_editor.cc:2269 rc_option_editor.cc:2278 rc_option_editor.cc:2287
-#: rc_option_editor.cc:2297 rc_option_editor.cc:2321 rc_option_editor.cc:2334
-#: rc_option_editor.cc:2343
+#: rc_option_editor.cc:3039 rc_option_editor.cc:3051 rc_option_editor.cc:3054
+#: rc_option_editor.cc:3062 rc_option_editor.cc:3070 rc_option_editor.cc:3078
+#: rc_option_editor.cc:3086 rc_option_editor.cc:3097 rc_option_editor.cc:3113
+#: rc_option_editor.cc:3129 rc_option_editor.cc:3144 rc_option_editor.cc:3153
+#: rc_option_editor.cc:3161
 msgid "Preferences|GUI"
 msgstr ""
 
-#: rc_option_editor.cc:2272
+#: rc_option_editor.cc:3045
+msgid "Possibly improve slow graphical performance (requires restart)"
+msgstr ""
+
+#: rc_option_editor.cc:3050
+msgid ""
+"Disables hardware gradient rendering on buggy video drivers (\"buggy "
+"gradients patch\").\n"
+"This requires restarting %1 before having an effect"
+msgstr ""
+
+#: rc_option_editor.cc:3057
+msgid "Use Window Manager/Desktop visibility information"
+msgstr ""
+
+#: rc_option_editor.cc:3065
 msgid "Graphically indicate mouse pointer hovering over various widgets"
 msgstr ""
 
-#: rc_option_editor.cc:2281
+#: rc_option_editor.cc:3073
 msgid "Show tooltips if mouse hovers over a control"
 msgstr ""
 
-#: rc_option_editor.cc:2290
+#: rc_option_editor.cc:3081
 msgid "Use name highlight bars in region displays (requires a restart)"
 msgstr ""
 
-#: rc_option_editor.cc:2303
-msgid "update transport clock display at FPS instead of every 100ms"
+#: rc_option_editor.cc:3089
+msgid "Update transport clock display at FPS instead of every 100ms"
 msgstr ""
 
-#: rc_option_editor.cc:2312
+#: rc_option_editor.cc:3104
+msgid "Waveform image cache size (megabytes)"
+msgstr ""
+
+#: rc_option_editor.cc:3112
+msgid ""
+"Increasing the cache size uses more memory to store waveform images, which "
+"can improve graphical performance."
+msgstr ""
+
+#: rc_option_editor.cc:3120
 msgid "Lock timeout (seconds)"
 msgstr ""
 
-#: rc_option_editor.cc:2320
+#: rc_option_editor.cc:3128
 msgid "Lock GUI after this many idle seconds (zero to never lock)"
 msgstr ""
 
-#: rc_option_editor.cc:2336
+#: rc_option_editor.cc:3146
 msgid "Mixer Strip"
 msgstr ""
 
-#: rc_option_editor.cc:2346
+#: rc_option_editor.cc:3156
 msgid "Use narrow strips in the mixer by default"
 msgstr ""
 
-#: rc_option_editor.cc:2351 rc_option_editor.cc:2365 rc_option_editor.cc:2384
-#: rc_option_editor.cc:2400 rc_option_editor.cc:2416 rc_option_editor.cc:2430
-#: rc_option_editor.cc:2444 rc_option_editor.cc:2446
+#: rc_option_editor.cc:3163
+msgid "Action Script Button Visibility"
+msgstr ""
+
+#: rc_option_editor.cc:3169 rc_option_editor.cc:3183 rc_option_editor.cc:3200
+#: rc_option_editor.cc:3216 rc_option_editor.cc:3232 rc_option_editor.cc:3246
+#: rc_option_editor.cc:3272 rc_option_editor.cc:3290 rc_option_editor.cc:3301
+#: rc_option_editor.cc:3308 rc_option_editor.cc:3310 rc_option_editor.cc:3318
+#: rc_option_editor.cc:3320 rc_option_editor.cc:3328 rc_option_editor.cc:3336
+#: rc_option_editor.cc:3338
 msgid "Preferences|Metering"
 msgstr ""
 
-#: rc_option_editor.cc:2355
+#: rc_option_editor.cc:3173
 msgid "Peak hold time"
 msgstr ""
 
-#: rc_option_editor.cc:2361
+#: rc_option_editor.cc:3179
 msgid "short"
 msgstr "kort"
 
-#: rc_option_editor.cc:2362
+#: rc_option_editor.cc:3180
 msgid "medium"
 msgstr ""
 
-#: rc_option_editor.cc:2363
+#: rc_option_editor.cc:3181
 msgid "long"
 msgstr "lång"
 
-#: rc_option_editor.cc:2369
+#: rc_option_editor.cc:3187
 msgid "DPM fall-off"
 msgstr ""
 
-#: rc_option_editor.cc:2375
+#: rc_option_editor.cc:3193
 msgid "slowest [6.6dB/sec]"
 msgstr ""
 
-#: rc_option_editor.cc:2376
+#: rc_option_editor.cc:3194
 msgid "slow [8.6dB/sec] (BBC PPM, EBU PPM)"
 msgstr ""
 
-#: rc_option_editor.cc:2377
-msgid "slowish [12.0dB/sec] (DIN)"
-msgstr ""
-
-#: rc_option_editor.cc:2378
-msgid "moderate [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"
-msgstr ""
-
-#: rc_option_editor.cc:2379
-msgid "medium [20dB/sec]"
+#: rc_option_editor.cc:3195
+msgid "moderate [12.0dB/sec] (DIN)"
 msgstr ""
 
-#: rc_option_editor.cc:2380
-msgid "fast [32dB/sec]"
+#: rc_option_editor.cc:3196
+msgid "medium [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"
 msgstr ""
 
-#: rc_option_editor.cc:2381
-msgid "faster [46dB/sec]"
+#: rc_option_editor.cc:3197
+msgid "fast [20dB/sec]"
 msgstr ""
 
-#: rc_option_editor.cc:2382
-msgid "fastest [70dB/sec]"
+#: rc_option_editor.cc:3198
+msgid "very fast [32dB/sec]"
 msgstr ""
 
-#: rc_option_editor.cc:2388
+#: rc_option_editor.cc:3204
 msgid "Meter line-up level; 0dBu"
 msgstr ""
 
-#: rc_option_editor.cc:2393 rc_option_editor.cc:2409
+#: rc_option_editor.cc:3209 rc_option_editor.cc:3225
 msgid "-24dBFS (SMPTE US: 4dBu = -20dBFS)"
 msgstr ""
 
-#: rc_option_editor.cc:2394 rc_option_editor.cc:2410
+#: rc_option_editor.cc:3210 rc_option_editor.cc:3226
 msgid "-20dBFS (SMPTE RP.0155)"
 msgstr ""
 
-#: rc_option_editor.cc:2395 rc_option_editor.cc:2411
+#: rc_option_editor.cc:3211 rc_option_editor.cc:3227
 msgid "-18dBFS (EBU, BBC)"
 msgstr ""
 
-#: rc_option_editor.cc:2396 rc_option_editor.cc:2412
+#: rc_option_editor.cc:3212 rc_option_editor.cc:3228
 msgid "-15dBFS (DIN)"
 msgstr ""
 
-#: rc_option_editor.cc:2398
+#: rc_option_editor.cc:3214
 msgid ""
 "Configure meter-marks and color-knee point for dBFS scale DPM, set reference "
 "level for IEC1/Nordic, IEC2 PPM and VU meter."
 msgstr ""
 
-#: rc_option_editor.cc:2404
+#: rc_option_editor.cc:3220
 msgid "IEC1/DIN Meter line-up level; 0dBu"
 msgstr ""
 
-#: rc_option_editor.cc:2414
+#: rc_option_editor.cc:3230
 msgid "Reference level for IEC1/DIN meter."
 msgstr ""
 
-#: rc_option_editor.cc:2420
+#: rc_option_editor.cc:3236
 msgid "VU Meter standard"
 msgstr ""
 
-#: rc_option_editor.cc:2425
+#: rc_option_editor.cc:3241
 msgid "0VU = -2dBu (France)"
 msgstr ""
 
-#: rc_option_editor.cc:2426
+#: rc_option_editor.cc:3242
 msgid "0VU = 0dBu (North America, Australia)"
 msgstr ""
 
-#: rc_option_editor.cc:2427
+#: rc_option_editor.cc:3243
 msgid "0VU = +4dBu (standard)"
 msgstr ""
 
-#: rc_option_editor.cc:2428
+#: rc_option_editor.cc:3244
 msgid "0VU = +8dBu"
 msgstr ""
 
-#: rc_option_editor.cc:2434
+#: rc_option_editor.cc:3250
 msgid "Peak threshold [dBFS]"
 msgstr ""
 
-#: rc_option_editor.cc:2442
+#: rc_option_editor.cc:3259
+msgid "Default Meter Type for Master Bus"
+msgstr ""
+
+#: rc_option_editor.cc:3277
+msgid "Default Meter Type for Busses"
+msgstr ""
+
+#: rc_option_editor.cc:3294
+msgid "Default Meter Type for Tracks"
+msgstr ""
+
+#: rc_option_editor.cc:3306
 msgid ""
 "Specify the audio signal level in dbFS at and above which the meter-peak "
 "indicator will flash red."
 msgstr ""
 
-#: rc_option_editor.cc:2449
+#: rc_option_editor.cc:3313
 msgid "LED meter style"
 msgstr ""
 
-#: rc_option_editor.cc:2457
+#: rc_option_editor.cc:3318
+msgid "Editor Meters"
+msgstr ""
+
+#: rc_option_editor.cc:3323
+msgid "Show meters on tracks in the editor"
+msgstr "Visa nivåmätning vid spåren i redigeraren"
+
+#: rc_option_editor.cc:3331
+msgid "Show at most stereo meters in the track-header"
+msgstr ""
+
+#: rc_option_editor.cc:3336
+msgid "Post Export Analysis"
+msgstr ""
+
+#: rc_option_editor.cc:3341
+msgid "Save loudness analysis as image file"
+msgstr ""
+
+#: rc_option_editor.cc:3349
 msgid "Theme"
 msgstr ""
 
-#: region_editor.cc:79
+#: rc_option_editor.cc:3351
+msgid "Theme/Colors"
+msgstr ""
+
+#: rc_option_editor.cc:3429
+msgid "Set Linux VST Search Path"
+msgstr ""
+
+#: rc_option_editor.cc:3443
+msgid "Set Windows VST Search Path"
+msgstr ""
+
+#: region_editor.cc:81
 msgid "audition this region"
 msgstr "avlyssna denna region"
 
-#: region_editor.cc:88 region_layering_order_editor.cc:75
+#: region_editor.cc:90 region_layering_order_editor.cc:75
 msgid "Position:"
 msgstr ""
 
-#: region_editor.cc:90 add_video_dialog.cc:155
+#: region_editor.cc:92 add_video_dialog.cc:155
 msgid "End:"
 msgstr "Slut:"
 
-#: region_editor.cc:92 sfdb_ui.cc:145
+#: region_editor.cc:94 sfdb_ui.cc:145
 msgid "Length:"
 msgstr "Längd:"
 
-#: region_editor.cc:94
+#: region_editor.cc:96
 msgid "Sync point (relative to region):"
 msgstr "Synk.-punkt (relativt mot region):"
 
-#: region_editor.cc:96
+#: region_editor.cc:98
 msgid "Sync point (absolute):"
 msgstr "Synk.-punkt (absolut):"
 
-#: region_editor.cc:98
+#: region_editor.cc:100
 msgid "File start:"
 msgstr "Fil börjar:"
 
-#: region_editor.cc:102
+#: region_editor.cc:104
 msgid "Sources:"
 msgstr "Källor:"
 
-#: region_editor.cc:104
+#: region_editor.cc:106
 msgid "Source:"
 msgstr "Källa:"
 
-#: region_editor.cc:166
+#: region_editor.cc:168
 msgid "Region '%1'"
 msgstr ""
 
-#: region_editor.cc:273
+#: region_editor.cc:279
 msgid "change region start position"
 msgstr ""
 
-#: region_editor.cc:289
+#: region_editor.cc:299
 msgid "change region end position"
 msgstr ""
 
-#: region_editor.cc:309
+#: region_editor.cc:322
 msgid "change region length"
 msgstr ""
 
-#: region_editor.cc:403 region_editor.cc:415
+#: region_editor.cc:416 region_editor.cc:428
 msgid "change region sync point"
 msgstr ""
 
@@ -9731,33 +11743,33 @@ msgstr ""
 msgid "Choose Top Region"
 msgstr ""
 
-#: region_view.cc:277
+#: region_view.cc:271
 msgid "SilenceText"
 msgstr ""
 
-#: region_view.cc:292 region_view.cc:311
+#: region_view.cc:286 region_view.cc:305
 msgid "minutes"
 msgstr ""
 
-#: region_view.cc:295 region_view.cc:314
+#: region_view.cc:289 region_view.cc:308
 msgid "msecs"
 msgstr "msek"
 
-#: region_view.cc:298 region_view.cc:317
+#: region_view.cc:292 region_view.cc:311
 msgid "secs"
 msgstr ""
 
-#: region_view.cc:301
+#: region_view.cc:295
 msgid "%1 silent segment"
 msgid_plural "%1 silent segments"
 msgstr[0] ""
 msgstr[1] ""
 
-#: region_view.cc:303
+#: region_view.cc:297
 msgid "shortest = %1 %2"
 msgstr ""
 
-#: region_view.cc:320
+#: region_view.cc:314
 msgid ""
 "\n"
 "  (shortest audible segment = %1 %2)"
@@ -9803,55 +11815,63 @@ msgstr ""
 msgid "Modified Kullback-Liebler"
 msgstr ""
 
-#: rhythm_ferret.cc:65
+#: rhythm_ferret.cc:62
+msgid "Spectral Flux"
+msgstr ""
+
+#: rhythm_ferret.cc:68
 msgid "Split region"
 msgstr "Dela region"
 
-#: rhythm_ferret.cc:66
+#: rhythm_ferret.cc:70
 msgid "Snap regions"
 msgstr ""
 
-#: rhythm_ferret.cc:67
+#: rhythm_ferret.cc:71
 msgid "Conform regions"
 msgstr ""
 
-#: rhythm_ferret.cc:72
+#: rhythm_ferret.cc:77
 msgid "Rhythm Ferret"
 msgstr ""
 
-#: rhythm_ferret.cc:78
+#: rhythm_ferret.cc:83
 msgid "Analyze"
 msgstr "Analysera"
 
-#: rhythm_ferret.cc:113
+#: rhythm_ferret.cc:122
 msgid "Detection function"
 msgstr "Upptäcktsfunktion"
 
-#: rhythm_ferret.cc:117
-msgid "Trigger gap"
-msgstr "Utlösningsglapp"
-
-#: rhythm_ferret.cc:122 strip_silence_dialog.cc:64
-msgid "Threshold"
-msgstr "Tröskel"
+#: rhythm_ferret.cc:126
+msgid "Trigger gap (postproc)"
+msgstr ""
 
-#: rhythm_ferret.cc:127
+#: rhythm_ferret.cc:131
 msgid "Peak threshold"
 msgstr "Topptröskel"
 
-#: rhythm_ferret.cc:132
+#: rhythm_ferret.cc:135
 msgid "Silence threshold"
 msgstr "Tystnadströskel"
 
-#: rhythm_ferret.cc:137
+#: rhythm_ferret.cc:141
+msgid "Min Inter-Onset Time"
+msgstr ""
+
+#: rhythm_ferret.cc:148
 msgid "Sensitivity"
 msgstr "Känslighet"
 
-#: rhythm_ferret.cc:141
+#: rhythm_ferret.cc:152
+msgid "Cut Pos Threshold"
+msgstr ""
+
+#: rhythm_ferret.cc:157
 msgid "Operation"
 msgstr "Hantering"
 
-#: rhythm_ferret.cc:355
+#: rhythm_ferret.cc:382
 msgid "split regions (rhythm ferret)"
 msgstr ""
 
@@ -9875,19 +11895,15 @@ msgstr "Inspelningsläge"
 msgid "Active state"
 msgstr ""
 
-#: route_group_dialog.cc:53 route_group_dialog.cc:82 theme_manager.cc:90
-msgid "Color"
-msgstr "Färg"
-
-#: route_group_dialog.cc:59
+#: route_group_dialog.cc:58
 msgid "RouteGroupDialog"
 msgstr ""
 
-#: route_group_dialog.cc:100
+#: route_group_dialog.cc:99
 msgid "<b>Sharing</b>"
 msgstr "<b>Gemensamt</b>"
 
-#: route_group_dialog.cc:200
+#: route_group_dialog.cc:192
 msgid "The group name is not unique. Please use a different name."
 msgstr ""
 
@@ -9907,406 +11923,389 @@ msgstr "Utgångar"
 msgid "Plugins, Inserts & Sends"
 msgstr "Insticksprogram, anslutningspunkter & sändningar"
 
-#: route_params_ui.cc:209
+#: route_params_ui.cc:201
 msgid "route display list item for renamed route not found!"
 msgstr "ruttvisningslisteobjekt för omdöpt rutt hittades inte!"
 
-#: route_params_ui.cc:279 route_params_ui.cc:307
+#: route_params_ui.cc:271 route_params_ui.cc:299
 #, c-format
 msgid "Playback delay: %<PRId64> samples"
 msgstr "Uppspelningsfördröjning: %<PRId64> samplingar"
 
-#: route_params_ui.cc:499
+#: route_params_ui.cc:491
 msgid "NO TRACK"
 msgstr "INGET SPÃ…R"
 
-#: route_params_ui.cc:637 route_params_ui.cc:638
+#: route_params_ui.cc:515
+msgid "Add Track or Bus"
+msgstr "Lägg till spår eller buss"
+
+#: route_params_ui.cc:627 route_params_ui.cc:628
 msgid "No Track or Bus Selected"
 msgstr "Inget spår eller buss vald"
 
-#: route_time_axis.cc:181
+#: route_time_axis.cc:104
+msgid "RTAV|G"
+msgstr ""
+
+#: route_time_axis.cc:105
+msgid "RTAV|P"
+msgstr ""
+
+#: route_time_axis.cc:106
+msgid "RTAV|A"
+msgstr ""
+
+#: route_time_axis.cc:194
 msgid "Record (Right-click for Step Edit)"
 msgstr ""
 
-#: route_time_axis.cc:184
+#: route_time_axis.cc:197
 msgid "Record"
 msgstr "Spela in"
 
-#: route_time_axis.cc:254
+#: route_time_axis.cc:265
 msgid "Route Group"
 msgstr "Ruttgrupp"
 
-#: route_time_axis.cc:264
+#: route_time_axis.cc:275
 msgid "MIDI Controllers and Automation"
 msgstr ""
 
-#: route_time_axis.cc:495
+#: route_time_axis.cc:510
 msgid "Show All Automation"
 msgstr "Visa all automatisering"
 
-#: route_time_axis.cc:498
+#: route_time_axis.cc:513
 msgid "Show Existing Automation"
 msgstr "Visa existerande automatisering"
 
-#: route_time_axis.cc:501
+#: route_time_axis.cc:516
 msgid "Hide All Automation"
 msgstr "Göm all automatisering"
 
-#: route_time_axis.cc:510
+#: route_time_axis.cc:525
 msgid "Processor automation"
 msgstr ""
 
-#: route_time_axis.cc:517
+#: route_time_axis.cc:532
 msgid "Fader"
 msgstr "Volym"
 
-#: route_time_axis.cc:535
+#: route_time_axis.cc:559
 msgid "Pan"
 msgstr "Panorering"
 
-#: route_time_axis.cc:626
+#: route_time_axis.cc:643
 msgid "Overlaid"
 msgstr "Överlappande"
 
-#: route_time_axis.cc:632
+#: route_time_axis.cc:649
 msgid "Stacked"
 msgstr "I trappa"
 
-#: route_time_axis.cc:640
+#: route_time_axis.cc:657
 msgid "Layers"
 msgstr "Lager"
 
-#: route_time_axis.cc:709
+#: route_time_axis.cc:721
 msgid "Automatic (based on I/O connections)"
 msgstr ""
 
-#: route_time_axis.cc:718
+#: route_time_axis.cc:730
 msgid "(Currently: Existing Material)"
 msgstr ""
 
-#: route_time_axis.cc:721
+#: route_time_axis.cc:733
 msgid "(Currently: Capture Time)"
 msgstr ""
 
-#: route_time_axis.cc:729
+#: route_time_axis.cc:741
 msgid "Align With Existing Material"
 msgstr "Efter existerande material"
 
-#: route_time_axis.cc:734
+#: route_time_axis.cc:746
 msgid "Align With Capture Time"
 msgstr "Efter inspelningstiden"
 
-#: route_time_axis.cc:739
+#: route_time_axis.cc:751
 msgid "Alignment"
 msgstr "Justera"
 
-#: route_time_axis.cc:774
+#: route_time_axis.cc:786
 msgid "Normal Mode"
 msgstr "Normalt"
 
-#: route_time_axis.cc:780
+#: route_time_axis.cc:792
 msgid "Tape Mode"
 msgstr "Bandläge"
 
-#: route_time_axis.cc:786
+#: route_time_axis.cc:798
 msgid "Non-Layered Mode"
 msgstr "Ej i lager"
 
-#: route_time_axis.cc:792
+#: route_time_axis.cc:804
 msgid "Record Mode"
 msgstr ""
 
-#: route_time_axis.cc:799 route_time_axis.cc:1789
+#: route_time_axis.cc:809 route_time_axis.cc:1795
 msgid "Playlist"
 msgstr "Spellista"
 
-#: route_time_axis.cc:1097
+#: route_time_axis.cc:1107
 msgid "Rename Playlist"
 msgstr ""
 
-#: route_time_axis.cc:1098
+#: route_time_axis.cc:1108
 msgid "New name for playlist:"
 msgstr ""
 
-#: route_time_axis.cc:1183
+#: route_time_axis.cc:1193
 msgid "New Copy Playlist"
 msgstr ""
 
-#: route_time_axis.cc:1184 route_time_axis.cc:1237
+#: route_time_axis.cc:1194 route_time_axis.cc:1247
 msgid "Name for new playlist:"
 msgstr ""
 
-#: route_time_axis.cc:1236
+#: route_time_axis.cc:1246
 msgid "New Playlist"
 msgstr ""
 
-#: route_time_axis.cc:1436
-msgid "You cannot create a track with that name as it is reserved for %1"
+#: route_time_axis.cc:1441
+msgid "The name \"%1\" is reserved for %2"
 msgstr ""
 
-#: route_time_axis.cc:1678
+#: route_time_axis.cc:1684
 msgid "New Copy..."
 msgstr "Ny kopia..."
 
-#: route_time_axis.cc:1682
+#: route_time_axis.cc:1688
 msgid "New Take"
 msgstr ""
 
-#: route_time_axis.cc:1683
+#: route_time_axis.cc:1689
 msgid "Copy Take"
 msgstr ""
 
-#: route_time_axis.cc:1688
+#: route_time_axis.cc:1694
 msgid "Clear Current"
 msgstr "Rensa aktuell"
 
-#: route_time_axis.cc:1691
-msgid "Select From All..."
+#: route_time_axis.cc:1697
+msgid "Select from All..."
 msgstr ""
 
-#: route_time_axis.cc:1779
+#: route_time_axis.cc:1785
 msgid "Take: %1.%2"
 msgstr ""
 
-#: route_time_axis.cc:2169 selection.cc:1007 selection.cc:1061
+#: route_time_axis.cc:2190 selection.cc:1042 selection.cc:1096
 msgid "programming error: "
 msgstr "programmeringsfel: "
 
-#: route_time_axis.cc:2585
+#: route_time_axis.cc:2614
 msgid "Underlays"
 msgstr ""
 
-#: route_time_axis.cc:2588
+#: route_time_axis.cc:2617
 msgid "Remove \"%1\""
 msgstr ""
 
-#: route_time_axis.cc:2638 route_time_axis.cc:2675
+#: route_time_axis.cc:2667 route_time_axis.cc:2704
 msgid "programming error: underlay reference pointer pairs are inconsistent!"
 msgstr ""
 
-#: route_time_axis.cc:2702
+#: route_time_axis.cc:2731 vca_master_strip.cc:203 vca_time_axis.cc:228
 msgid "After-fade listen (AFL)"
 msgstr ""
 
-#: route_time_axis.cc:2706
+#: route_time_axis.cc:2735 vca_master_strip.cc:207 vca_time_axis.cc:232
 msgid "Pre-fade listen (PFL)"
 msgstr ""
 
-#: route_ui.cc:140
+#: route_ui.cc:165
 msgid "Mute this track"
 msgstr "Tysta detta spår"
 
-#: route_ui.cc:144
+#: route_ui.cc:169
 msgid "Mute other (non-soloed) tracks"
 msgstr "Tysta andra (icke-solade) spår"
 
-#: route_ui.cc:150
+#: route_ui.cc:175
 msgid "Enable recording on this track"
 msgstr ""
 
-#: route_ui.cc:158
+#: route_ui.cc:183
 msgid "make mixer strips show sends to this bus"
 msgstr ""
 
-#: route_ui.cc:163
+#: route_ui.cc:188
 msgid "Monitor input"
 msgstr ""
 
-#: route_ui.cc:169
+#: route_ui.cc:194
 msgid "Monitor playback"
 msgstr ""
 
-#: route_ui.cc:676
+#: route_ui.cc:706
 msgid "Not connected to AudioEngine - cannot engage record"
 msgstr ""
 
-#: route_ui.cc:875
+#: route_ui.cc:883
+msgid "Rec-Safe"
+msgstr ""
+
+#: route_ui.cc:888
 msgid "Step Entry"
 msgstr ""
 
-#: route_ui.cc:948
+#: route_ui.cc:987
 msgid "Assign all tracks (prefader)"
 msgstr ""
 
-#: route_ui.cc:952
+#: route_ui.cc:991
 msgid "Assign all tracks and buses (prefader)"
 msgstr ""
 
-#: route_ui.cc:956
+#: route_ui.cc:995
 msgid "Assign all tracks (postfader)"
 msgstr ""
 
-#: route_ui.cc:960
+#: route_ui.cc:999
 msgid "Assign all tracks and buses (postfader)"
 msgstr ""
 
-#: route_ui.cc:964
+#: route_ui.cc:1003
 msgid "Assign selected tracks (prefader)"
 msgstr ""
 
-#: route_ui.cc:968
+#: route_ui.cc:1007
 msgid "Assign selected tracks and buses (prefader)"
 msgstr ""
 
-#: route_ui.cc:971
+#: route_ui.cc:1010
 msgid "Assign selected tracks (postfader)"
 msgstr ""
 
-#: route_ui.cc:975
+#: route_ui.cc:1014
 msgid "Assign selected tracks and buses (postfader)"
 msgstr ""
 
-#: route_ui.cc:978
+#: route_ui.cc:1017
 msgid "Copy track/bus gains to sends"
 msgstr ""
 
-#: route_ui.cc:979
+#: route_ui.cc:1018
 msgid "Set sends gain to -inf"
 msgstr ""
 
-#: route_ui.cc:980
+#: route_ui.cc:1019
 msgid "Set sends gain to 0dB"
 msgstr ""
 
-#: route_ui.cc:1300
+#: route_ui.cc:1357
 msgid "Solo Isolate"
 msgstr ""
 
-#: route_ui.cc:1307
+#: route_ui.cc:1364
 msgid "Solo Safe"
 msgstr ""
 
-#: route_ui.cc:1329
+#: route_ui.cc:1386
 msgid "Pre Fader Sends"
 msgstr ""
 
-#: route_ui.cc:1335
+#: route_ui.cc:1392
 msgid "Post Fader Sends"
 msgstr ""
 
-#: route_ui.cc:1341
+#: route_ui.cc:1398
 msgid "Control Outs"
 msgstr "Kontrollutgångar"
 
-#: route_ui.cc:1347
+#: route_ui.cc:1404
 msgid "Main Outs"
 msgstr "Huvudutgångar"
 
-#: route_ui.cc:1479
+#: route_ui.cc:1571
 msgid "Color Selection"
 msgstr "Färgval"
 
-#: route_ui.cc:1564
-msgid ""
-"Do you really want to remove track \"%1\" ?\n"
-"\n"
-"You may also lose the playlist used by this track.\n"
-"\n"
-"(This action cannot be undone, and the session file will be overwritten)"
-msgstr ""
-
-#: route_ui.cc:1566
-msgid ""
-"Do you really want to remove bus \"%1\" ?\n"
-"\n"
-"(This action cannot be undone, and the session file will be overwritten)"
-msgstr ""
-
-#: route_ui.cc:1574
-msgid "Remove track"
-msgstr ""
-
-#: route_ui.cc:1576
-msgid "Remove bus"
-msgstr ""
-
-#: route_ui.cc:1604
+#: route_ui.cc:1613
 msgid ""
 "The use of colons (':') is discouraged in track and bus names.\n"
 "Do you want to use this new name?"
 msgstr ""
 
-#: route_ui.cc:1608
+#: route_ui.cc:1617
 msgid "Use the new name"
 msgstr ""
 
-#: route_ui.cc:1609
+#: route_ui.cc:1618
 msgid "Re-edit the name"
 msgstr ""
 
-#: route_ui.cc:1622
+#: route_ui.cc:1631
 msgid "Rename Track"
 msgstr "Döp om spår"
 
-#: route_ui.cc:1624
+#: route_ui.cc:1633
 msgid "Rename Bus"
 msgstr "Byt namn på buss"
 
-#: route_ui.cc:1692
+#: route_ui.cc:1693
 msgid ": comment editor"
 msgstr ": kommentar"
 
-#: route_ui.cc:1858
+#: route_ui.cc:1848
 msgid " latency"
 msgstr "-fördröjning"
 
-#: route_ui.cc:1871
+#: route_ui.cc:1888
 msgid "Cannot create route template directory %1"
 msgstr ""
 
-#: route_ui.cc:1877
+#: route_ui.cc:1894
 msgid "Save As Template"
 msgstr "Spara som spårmall"
 
-#: route_ui.cc:1878
+#: route_ui.cc:1895
 msgid "Template name:"
 msgstr "Namn på spårmall:"
 
-#: route_ui.cc:1959
-msgid "Remote Control ID"
-msgstr "Fjärrstyrnings-ID"
+#: route_ui.cc:2019
+msgid ""
+"Left-click to invert polarity of channel %1 of this track. Right-click to "
+"show menu."
+msgstr ""
 
-#: route_ui.cc:1969
-msgid "Remote control ID:"
-msgstr "Fjärr-ID:"
+#: route_ui.cc:2021
+msgid "Click to show a menu of channels to invert polarity"
+msgstr ""
 
-#: route_ui.cc:1983
-msgid ""
-"The remote control ID of %1 is: %2\n"
-"\n"
-"\n"
-"The remote control ID of %3 cannot be changed."
+#: save_as_dialog.cc:34
+msgid "Switch to newly-saved version"
 msgstr ""
 
-#: route_ui.cc:1987
-msgid "the master bus"
+#: save_as_dialog.cc:35
+msgid "Copy media to new session"
 msgstr ""
 
-#: route_ui.cc:1987
-msgid "the monitor bus"
+#: save_as_dialog.cc:36
+msgid "Copy external media into new session"
 msgstr ""
 
-#: route_ui.cc:1989
-msgid ""
-"The remote control ID of %5 is: %2\n"
-"\n"
-"\n"
-"Remote Control IDs are currently determined by track/bus ordering in %6.\n"
-"\n"
-"%3Use the User Interaction tab of the Preferences window if you want to "
-"change this%4"
+#: save_as_dialog.cc:37
+msgid "Newly-saved session should be empty"
 msgstr ""
 
-#: route_ui.cc:2046
-msgid ""
-"Left-click to invert (phase reverse) channel %1 of this track.  Right-click "
-"to show menu."
+#: save_as_dialog.cc:48
+msgid "Save as session name"
 msgstr ""
-"Vänsterklicka för att invertera (fasinvers) kanal %1 i detta spår. "
-"Högerklicka för att visa menyn"
 
-#: route_ui.cc:2048
-msgid "Click to show a menu of channels for inversion (phase reverse)"
+#: save_as_dialog.cc:55
+msgid "Parent directory/folder"
 msgstr ""
 
 #: search_path_option.cc:35
@@ -10321,126 +12320,158 @@ msgstr ""
 msgid "the session folder"
 msgstr ""
 
+#: script_selector.cc:43
+msgid "<b>Type:</b>"
+msgstr ""
+
+#: script_selector.cc:49
+msgid "<b>Author:</b>"
+msgstr ""
+
+#: script_selector.cc:55
+msgid "<b>Description:</b>"
+msgstr ""
+
+#: script_selector.cc:131
+msgid "Select Script to unload"
+msgstr ""
+
+#: script_selector.cc:165
+msgid "<b>Name:</b>"
+msgstr ""
+
+#: script_selector.cc:172
+msgid "<b>Instance Parameters</b>"
+msgstr ""
+
 #: send_ui.cc:134
 msgid "Send "
 msgstr ""
 
-#: session_dialog.cc:61
+#: session_dialog.cc:71
 msgid "Session Setup"
 msgstr ""
 
-#: session_dialog.cc:66
+#: session_dialog.cc:76
 msgid "Advanced options ..."
 msgstr ""
 
-#: session_dialog.cc:263
-msgid "New Session"
-msgstr "Ny session"
+#: session_dialog.cc:163 session_dialog.cc:397
+msgid "Recent Sessions"
+msgstr "Tidigare Sessioner"
 
-#: session_dialog.cc:301
-msgid "Check the website for more..."
+#: session_dialog.cc:311
+msgid "Sample Rate"
 msgstr ""
 
-#: session_dialog.cc:304
-msgid "Click to open the program website in your web browser"
+#: session_dialog.cc:312
+msgid "File Resolution"
 msgstr ""
 
-#: session_dialog.cc:324
-msgid "Sample Rate"
+#: session_dialog.cc:313
+msgid "Last Modified"
+msgstr ""
+
+#: session_dialog.cc:338
+msgid "New Session"
+msgstr "Ny session"
+
+#: session_dialog.cc:379
+msgid "Check the website for more..."
 msgstr ""
 
-#: session_dialog.cc:325
-msgid "Disk Format"
+#: session_dialog.cc:382
+msgid "Click to open the program website in your web browser"
 msgstr ""
 
-#: session_dialog.cc:343
+#: session_dialog.cc:404
 msgid "Select session file"
 msgstr "Välj sessionsfil"
 
-#: session_dialog.cc:358
+#: session_dialog.cc:417
 msgid "Other Sessions"
 msgstr ""
 
-#: session_dialog.cc:384
+#: session_dialog.cc:424
+msgid "Safe Mode: Disable all Plugins"
+msgstr ""
+
+#: session_dialog.cc:454
 msgid "Open"
 msgstr "Öppna"
 
-#: session_dialog.cc:451
+#: session_dialog.cc:521
 msgid "Session name:"
 msgstr "Sessionens namn:"
 
-#: session_dialog.cc:473
+#: session_dialog.cc:543
 msgid "Create session folder in:"
 msgstr "Skapa sessionsmappen i:"
 
-#: session_dialog.cc:496
+#: session_dialog.cc:564
 msgid "Select folder for session"
 msgstr "Välj mapp för sessionen"
 
-#: session_dialog.cc:525
+#: session_dialog.cc:591
 msgid "Use this template"
 msgstr "Använd denna mall"
 
-#: session_dialog.cc:528
+#: session_dialog.cc:594
 msgid "no template"
 msgstr "ingen mall"
 
-#: session_dialog.cc:663 session_dialog.cc:699
-msgid "32 bit float"
+#: session_dialog.cc:746 session_dialog.cc:793
+msgid "32-bit float"
 msgstr ""
 
-#: session_dialog.cc:666 session_dialog.cc:702
-msgid "24 bit"
+#: session_dialog.cc:749 session_dialog.cc:796
+msgid "24-bit"
 msgstr ""
 
-#: session_dialog.cc:669 session_dialog.cc:705
-msgid "16 bit"
+#: session_dialog.cc:752 session_dialog.cc:799
+msgid "16-bit"
 msgstr ""
 
-#: session_dialog.cc:747 session_dialog.cc:748 session_dialog.cc:749
+#: session_dialog.cc:877 session_dialog.cc:878 session_dialog.cc:879
 msgid "channels"
 msgstr "kanaler"
 
-#: session_dialog.cc:763
+#: session_dialog.cc:893
 msgid "<b>Busses</b>"
 msgstr "<b>Bussar</b>"
 
-#: session_dialog.cc:764
+#: session_dialog.cc:894
 msgid "<b>Inputs</b>"
 msgstr "<b>Ingångar</b>"
 
-#: session_dialog.cc:765
+#: session_dialog.cc:895
 msgid "<b>Outputs</b>"
 msgstr "<b>Utgångar</b>"
 
-#: session_dialog.cc:773
+#: session_dialog.cc:903
 msgid "Create master bus"
 msgstr "Skapa master-buss"
 
-#: session_dialog.cc:783
+#: session_dialog.cc:913
 msgid "Automatically connect to physical inputs"
 msgstr ""
 
-#: session_dialog.cc:790 session_dialog.cc:849
+#: session_dialog.cc:920 session_dialog.cc:979
 msgid "Use only"
 msgstr "Använd endast"
 
-#: session_dialog.cc:843
+#: session_dialog.cc:973
 msgid "Automatically connect outputs"
 msgstr "Anslut automatiskt utgångar"
 
-#: session_dialog.cc:865
+#: session_dialog.cc:995
 msgid "... to master bus"
 msgstr "...till master-bussen"
 
-#: session_dialog.cc:875
+#: session_dialog.cc:1005
 msgid "... to physical outputs"
 msgstr "...till fysiska utgångar"
 
-#: session_import_dialog.cc:65
-msgid "Import from Session"
-msgstr ""
-
 #: session_import_dialog.cc:74
 msgid "Elements"
 msgstr "Beståndsdelar"
@@ -10461,197 +12492,197 @@ msgstr ""
 msgid "This will select all elements of this type!"
 msgstr "Detta väljer alla beståndsdelar av denna typen!"
 
-#: session_metadata_dialog.cc:285
+#: session_metadata_dialog.cc:288
 msgid "EAN Check digit OK"
 msgstr ""
 
-#: session_metadata_dialog.cc:289
+#: session_metadata_dialog.cc:292
 msgid "EAN Check digit error"
 msgstr ""
 
-#: session_metadata_dialog.cc:289
+#: session_metadata_dialog.cc:292
 msgid "expected"
 msgstr ""
 
-#: session_metadata_dialog.cc:294
+#: session_metadata_dialog.cc:297
 msgid "EAN Length error"
 msgstr ""
 
-#: session_metadata_dialog.cc:423
+#: session_metadata_dialog.cc:426
 msgid "Field"
 msgstr "Fält"
 
-#: session_metadata_dialog.cc:427
+#: session_metadata_dialog.cc:430
 msgid "Values (current value on top)"
 msgstr "Värden (aktuellt värde längst upp)"
 
-#: session_metadata_dialog.cc:641
+#: session_metadata_dialog.cc:644
 msgid "User"
 msgstr ""
 
-#: session_metadata_dialog.cc:649
+#: session_metadata_dialog.cc:652
 msgid "Email"
 msgstr ""
 
-#: session_metadata_dialog.cc:652
+#: session_metadata_dialog.cc:655
 msgid "Web"
 msgstr ""
 
-#: session_metadata_dialog.cc:655
+#: session_metadata_dialog.cc:658
 msgid "Organization"
 msgstr ""
 
-#: session_metadata_dialog.cc:658
+#: session_metadata_dialog.cc:661
 msgid "Country"
 msgstr ""
 
-#: session_metadata_dialog.cc:672
+#: session_metadata_dialog.cc:675
 msgid "Title"
 msgstr "Titel"
 
-#: session_metadata_dialog.cc:675
+#: session_metadata_dialog.cc:678
 msgid "Track Number"
 msgstr "Spårnummer"
 
-#: session_metadata_dialog.cc:678
+#: session_metadata_dialog.cc:681
 msgid "Subtitle"
 msgstr "Undertitel"
 
-#: session_metadata_dialog.cc:681
+#: session_metadata_dialog.cc:684
 msgid "Grouping"
 msgstr "Gruppering"
 
-#: session_metadata_dialog.cc:684
+#: session_metadata_dialog.cc:687
 msgid "Artist"
 msgstr ""
 
-#: session_metadata_dialog.cc:687
+#: session_metadata_dialog.cc:690
 msgid "Genre"
 msgstr ""
 
-#: session_metadata_dialog.cc:690
+#: session_metadata_dialog.cc:693
 msgid "Comment"
 msgstr "Kommentar"
 
-#: session_metadata_dialog.cc:693
+#: session_metadata_dialog.cc:696
 msgid "Copyright"
 msgstr "Upphovsrätt"
 
-#: session_metadata_dialog.cc:701 session_metadata_dialog.cc:706
+#: session_metadata_dialog.cc:704 session_metadata_dialog.cc:709
 msgid "Album"
 msgstr ""
 
-#: session_metadata_dialog.cc:709
+#: session_metadata_dialog.cc:712
 msgid "Year"
 msgstr "Ã…r"
 
-#: session_metadata_dialog.cc:712
+#: session_metadata_dialog.cc:715
 msgid "Album Artist"
 msgstr "Albumartist"
 
-#: session_metadata_dialog.cc:715
+#: session_metadata_dialog.cc:718
 msgid "Total Tracks"
 msgstr "Totalt antal spår"
 
-#: session_metadata_dialog.cc:718
+#: session_metadata_dialog.cc:721
 msgid "Disc Subtitle"
 msgstr "Skivans undertitel"
 
-#: session_metadata_dialog.cc:721
+#: session_metadata_dialog.cc:724
 msgid "Disc Number"
 msgstr "Skivans nummer"
 
-#: session_metadata_dialog.cc:724
+#: session_metadata_dialog.cc:727
 msgid "Total Discs"
 msgstr "Total antal skivor"
 
-#: session_metadata_dialog.cc:727
+#: session_metadata_dialog.cc:730
 msgid "Compilation"
 msgstr "Samling"
 
-#: session_metadata_dialog.cc:730
+#: session_metadata_dialog.cc:733
 msgid "ISRC"
 msgstr ""
 
-#: session_metadata_dialog.cc:733
+#: session_metadata_dialog.cc:736
 msgid "EAN barcode"
 msgstr ""
 
-#: session_metadata_dialog.cc:746
+#: session_metadata_dialog.cc:749
 msgid "People"
 msgstr "Människor"
 
-#: session_metadata_dialog.cc:751
+#: session_metadata_dialog.cc:754
 msgid "Lyricist"
 msgstr "Textförfattare"
 
-#: session_metadata_dialog.cc:754
+#: session_metadata_dialog.cc:757
 msgid "Composer"
 msgstr "Kompositör"
 
-#: session_metadata_dialog.cc:757
+#: session_metadata_dialog.cc:760
 msgid "Conductor"
 msgstr "Dirigent"
 
-#: session_metadata_dialog.cc:760
+#: session_metadata_dialog.cc:763
 msgid "Remixer"
 msgstr "Remixare"
 
-#: session_metadata_dialog.cc:763
+#: session_metadata_dialog.cc:766
 msgid "Arranger"
 msgstr "Arrangör"
 
-#: session_metadata_dialog.cc:766
+#: session_metadata_dialog.cc:769
 msgid "Engineer"
 msgstr "Ljudtekniker"
 
-#: session_metadata_dialog.cc:769
+#: session_metadata_dialog.cc:772
 msgid "Producer"
 msgstr "Producent"
 
-#: session_metadata_dialog.cc:772
+#: session_metadata_dialog.cc:775
 msgid "DJ Mixer"
 msgstr "DJ-mixer"
 
-#: session_metadata_dialog.cc:775
+#: session_metadata_dialog.cc:778
 msgid "Metadata|Mixer"
 msgstr ""
 
-#: session_metadata_dialog.cc:783
+#: session_metadata_dialog.cc:786
 msgid "School"
 msgstr ""
 
-#: session_metadata_dialog.cc:788
+#: session_metadata_dialog.cc:791
 msgid "Instructor"
 msgstr ""
 
-#: session_metadata_dialog.cc:791
+#: session_metadata_dialog.cc:794
 msgid "Course"
 msgstr ""
 
-#: session_metadata_dialog.cc:799
+#: session_metadata_dialog.cc:802
 msgid "Edit Session Metadata"
 msgstr "Redigera sessionens metadata"
 
-#: session_metadata_dialog.cc:830
+#: session_metadata_dialog.cc:833
 msgid "Import session metadata"
 msgstr "Importa sessionsmetadata"
 
-#: session_metadata_dialog.cc:851
+#: session_metadata_dialog.cc:854
 msgid "Choose session to import metadata from"
 msgstr ""
 
-#: session_metadata_dialog.cc:889
+#: session_metadata_dialog.cc:892
 msgid "This session file could not be read!"
 msgstr ""
 
-#: session_metadata_dialog.cc:899
+#: session_metadata_dialog.cc:902
 msgid ""
 "The session file didn't contain metadata!\n"
 "Maybe this is an old session format?"
 msgstr ""
 
-#: session_metadata_dialog.cc:918
+#: session_metadata_dialog.cc:921
 msgid "Import all from:"
 msgstr ""
 
@@ -10798,209 +12829,230 @@ msgid "Destructive crossfade length"
 msgstr "Destruktiv övertonings längd"
 
 #: session_option_editor.cc:146
+msgid "Declick when transport starts and stops"
+msgstr ""
+
+#: session_option_editor.cc:153
+msgid "Declick when monitor state changes"
+msgstr ""
+
+#: session_option_editor.cc:160
 msgid "Region fades active"
 msgstr "Regiontoningar aktiva"
 
-#: session_option_editor.cc:153
+#: session_option_editor.cc:167
 msgid "Region fades visible"
 msgstr "Regiontoningar synliga"
 
-#: session_option_editor.cc:160 session_option_editor.cc:173
-#: session_option_editor.cc:187
+#: session_option_editor.cc:174 session_option_editor.cc:187
+#: session_option_editor.cc:208
 msgid "Media"
 msgstr ""
 
-#: session_option_editor.cc:160
+#: session_option_editor.cc:174
 msgid "Audio file format"
 msgstr "Ljudfilsformat"
 
-#: session_option_editor.cc:164
+#: session_option_editor.cc:178
 msgid "Sample format"
 msgstr "Sampleformat"
 
-#: session_option_editor.cc:169
+#: session_option_editor.cc:183
 msgid "32-bit floating point"
 msgstr ""
 
-#: session_option_editor.cc:170
+#: session_option_editor.cc:184
 msgid "24-bit integer"
 msgstr ""
 
-#: session_option_editor.cc:171
+#: session_option_editor.cc:185
 msgid "16-bit integer"
 msgstr ""
 
-#: session_option_editor.cc:177
+#: session_option_editor.cc:191
 msgid "File type"
 msgstr "Filtyp"
 
-#: session_option_editor.cc:182
-msgid "Broadcast WAVE"
+#: session_option_editor.cc:196
+msgid "Broadcast WAVE (4GB size limit)"
 msgstr ""
 
-#: session_option_editor.cc:183
-msgid "WAVE"
+#: session_option_editor.cc:198
+msgid "Broadcast RF64"
 msgstr ""
 
-#: session_option_editor.cc:184
+#: session_option_editor.cc:200
+msgid "WAVE (4GB size limit)"
+msgstr ""
+
+#: session_option_editor.cc:201
 msgid "WAVE-64"
 msgstr ""
 
-#: session_option_editor.cc:189
+#: session_option_editor.cc:205
+msgid "RF64 (WAV compatible)"
+msgstr ""
+
+#: session_option_editor.cc:210 session_option_editor.cc:216
+#: session_option_editor.cc:223
+msgid "Files|Locations"
+msgstr ""
+
+#: session_option_editor.cc:210
 msgid "File locations"
 msgstr "Filplatser"
 
-#: session_option_editor.cc:191
+#: session_option_editor.cc:212
 msgid "Search for audio files in:"
 msgstr "Sök efter ljudfiler i:"
 
-#: session_option_editor.cc:197
+#: session_option_editor.cc:218
 msgid "Search for MIDI files in:"
 msgstr "Sök efter MIDI-filer i:"
 
-#: session_option_editor.cc:206 session_option_editor.cc:218
-#: session_option_editor.cc:228 session_option_editor.cc:239
+#: session_option_editor.cc:227 session_option_editor.cc:239
+#: session_option_editor.cc:249 session_option_editor.cc:260
 msgid "Filenames"
 msgstr ""
 
-#: session_option_editor.cc:206
+#: session_option_editor.cc:227
 msgid "File Naming"
 msgstr ""
 
-#: session_option_editor.cc:212
+#: session_option_editor.cc:233
 msgid "Prefix Track number"
 msgstr ""
 
-#: session_option_editor.cc:217
+#: session_option_editor.cc:238
 msgid ""
 "Adds the current track number to the beginning of the recorded file name."
 msgstr ""
 
-#: session_option_editor.cc:222
+#: session_option_editor.cc:243
 msgid "Prefix Take Name"
 msgstr ""
 
-#: session_option_editor.cc:227
+#: session_option_editor.cc:248
 msgid "Adds the Take Name to the beginning of the recorded file name."
 msgstr ""
 
-#: session_option_editor.cc:232
+#: session_option_editor.cc:253
 msgid "Take Name"
 msgstr ""
 
-#: session_option_editor.cc:245
+#: session_option_editor.cc:266
 msgid ""
 "Track Input Monitoring automatically follows transport state (\"auto-input\")"
 msgstr ""
 
-#: session_option_editor.cc:252
+#: session_option_editor.cc:273
 msgid "Use monitor section in this session"
 msgstr ""
 
-#: session_option_editor.cc:257 session_option_editor.cc:259
-#: session_option_editor.cc:266 session_option_editor.cc:273
-#: session_option_editor.cc:280 session_option_editor.cc:282
-#: session_option_editor.cc:289 session_option_editor.cc:296
-#: session_option_editor.cc:303 session_option_editor.cc:310
-#: session_option_editor.cc:312
+#: session_option_editor.cc:278 session_option_editor.cc:280
+#: session_option_editor.cc:287 session_option_editor.cc:294
+#: session_option_editor.cc:301 session_option_editor.cc:303
+#: session_option_editor.cc:310 session_option_editor.cc:317
+#: session_option_editor.cc:324 session_option_editor.cc:331
+#: session_option_editor.cc:333
 msgid "Meterbridge"
 msgstr ""
 
-#: session_option_editor.cc:257
+#: session_option_editor.cc:278
 msgid "Route Display"
 msgstr ""
 
-#: session_option_editor.cc:261
+#: session_option_editor.cc:282
 msgid "Show Midi Tracks"
 msgstr ""
 
-#: session_option_editor.cc:268
+#: session_option_editor.cc:289
 msgid "Show Busses"
 msgstr ""
 
-#: session_option_editor.cc:275
+#: session_option_editor.cc:296
 msgid "Include Master Bus"
 msgstr ""
 
-#: session_option_editor.cc:280
+#: session_option_editor.cc:301
 msgid "Button Area"
 msgstr ""
 
-#: session_option_editor.cc:284
+#: session_option_editor.cc:305
 msgid "Rec-enable Button"
 msgstr ""
 
-#: session_option_editor.cc:291
+#: session_option_editor.cc:312
 msgid "Mute Button"
 msgstr ""
 
-#: session_option_editor.cc:298
+#: session_option_editor.cc:319
 msgid "Solo Button"
 msgstr ""
 
-#: session_option_editor.cc:305
+#: session_option_editor.cc:326
 msgid "Monitor Buttons"
 msgstr ""
 
-#: session_option_editor.cc:310
+#: session_option_editor.cc:331
 msgid "Name Labels"
 msgstr ""
 
-#: session_option_editor.cc:314
+#: session_option_editor.cc:335
 msgid "Track Name"
 msgstr ""
 
-#: session_option_editor.cc:325
+#: session_option_editor.cc:346
 msgid "MIDI region copies are independent"
 msgstr ""
 
-#: session_option_editor.cc:332
+#: session_option_editor.cc:353
 msgid ""
 "Policy for handling overlapping notes\n"
 " on the same MIDI channel"
 msgstr ""
 
-#: session_option_editor.cc:337
+#: session_option_editor.cc:358
 msgid "never allow them"
 msgstr "tillåter inte"
 
-#: session_option_editor.cc:338
+#: session_option_editor.cc:359
 msgid "don't do anything in particular"
 msgstr "gör inget särskilt"
 
-#: session_option_editor.cc:339
+#: session_option_editor.cc:360
 msgid "replace any overlapped existing note"
 msgstr "ersätt existerande överlappande not"
 
-#: session_option_editor.cc:340
+#: session_option_editor.cc:361
 msgid "shorten the overlapped existing note"
 msgstr "förkorta den existerande överlappande not"
 
-#: session_option_editor.cc:341
+#: session_option_editor.cc:362
 msgid "shorten the overlapping new note"
 msgstr "förkorta den nya överlappande noten"
 
-#: session_option_editor.cc:342
+#: session_option_editor.cc:363
 msgid "replace both overlapping notes with a single note"
 msgstr "ersätt båda överlappande noter med en enstaka not"
 
-#: session_option_editor.cc:346
+#: session_option_editor.cc:367
 msgid "Glue to bars and beats"
 msgstr ""
 
-#: session_option_editor.cc:350
+#: session_option_editor.cc:371
 msgid "Glue new markers to bars and beats"
 msgstr ""
 
-#: session_option_editor.cc:357
+#: session_option_editor.cc:378
 msgid "Glue new regions to bars and beats"
 msgstr ""
 
-#: session_option_editor.cc:362
+#: session_option_editor.cc:383
 msgid "Defaults"
 msgstr ""
 
-#: session_option_editor.cc:364
+#: session_option_editor.cc:385
 msgid "Use these settings as defaults"
 msgstr ""
 
@@ -11036,26 +13088,14 @@ msgstr ""
 msgid "Timestamp:"
 msgstr ""
 
-#: sfdb_ui.cc:149
-msgid "Format:"
-msgstr ""
-
-#: sfdb_ui.cc:188 sfdb_ui.cc:653
+#: sfdb_ui.cc:188 sfdb_ui.cc:659
 msgid "Tags:"
 msgstr "Taggar:"
 
-#: sfdb_ui.cc:293 sfdb_ui.cc:409
-msgid "Could not read file: %1 (%2)."
-msgstr "Kunde inte läsa fil: %1 (%2)."
-
 #: sfdb_ui.cc:297
 msgid "<b>Midi File Information</b>"
 msgstr ""
 
-#: sfdb_ui.cc:458
-msgid "Could not access soundfile: "
-msgstr "Dela kanaler"
-
 #: sfdb_ui.cc:530
 msgid "SoundFileBox: Could not tokenize string: "
 msgstr ""
@@ -11064,284 +13104,280 @@ msgstr ""
 msgid "Search"
 msgstr "Sök"
 
-#: sfdb_ui.cc:576
+#: sfdb_ui.cc:581
 msgid "Audio and MIDI files"
 msgstr ""
 
-#: sfdb_ui.cc:579
+#: sfdb_ui.cc:584
 msgid "Audio files"
 msgstr "Ljudfiler"
 
-#: sfdb_ui.cc:582
+#: sfdb_ui.cc:587
 msgid "MIDI files"
 msgstr "MIDI-filer"
 
-#: sfdb_ui.cc:585 add_video_dialog.cc:123
+#: sfdb_ui.cc:590 add_video_dialog.cc:123
 msgid "All files"
 msgstr "Alla filer"
 
-#: sfdb_ui.cc:604 add_video_dialog.cc:246
+#: sfdb_ui.cc:609 add_video_dialog.cc:246
 msgid "Browse Files"
 msgstr "Bläddra"
 
-#: sfdb_ui.cc:633
+#: sfdb_ui.cc:638
 msgid "Paths"
 msgstr "Sökvägar"
 
-#: sfdb_ui.cc:642
+#: sfdb_ui.cc:647
 msgid "Search Tags"
 msgstr "Sök taggar"
 
-#: sfdb_ui.cc:658
+#: sfdb_ui.cc:664
 msgid "Sort:"
 msgstr ""
 
-#: sfdb_ui.cc:666
+#: sfdb_ui.cc:672
 msgid "Longest"
 msgstr ""
 
-#: sfdb_ui.cc:667
+#: sfdb_ui.cc:673
 msgid "Shortest"
 msgstr ""
 
-#: sfdb_ui.cc:668
+#: sfdb_ui.cc:674
 msgid "Newest"
 msgstr ""
 
-#: sfdb_ui.cc:669
+#: sfdb_ui.cc:675
 msgid "Oldest"
 msgstr ""
 
-#: sfdb_ui.cc:670
+#: sfdb_ui.cc:676
 msgid "Most downloaded"
 msgstr ""
 
-#: sfdb_ui.cc:671
+#: sfdb_ui.cc:677
 msgid "Least downloaded"
 msgstr ""
 
-#: sfdb_ui.cc:672
+#: sfdb_ui.cc:678
 msgid "Highest rated"
 msgstr ""
 
-#: sfdb_ui.cc:673
+#: sfdb_ui.cc:679
 msgid "Lowest rated"
 msgstr ""
 
-#: sfdb_ui.cc:678
+#: sfdb_ui.cc:684
 msgid "More"
 msgstr ""
 
-#: sfdb_ui.cc:682
+#: sfdb_ui.cc:688
 msgid "Similar"
 msgstr ""
 
-#: sfdb_ui.cc:694
+#: sfdb_ui.cc:700
 msgid "ID"
 msgstr ""
 
-#: sfdb_ui.cc:695 add_video_dialog.cc:83
+#: sfdb_ui.cc:701 add_video_dialog.cc:83
 msgid "Filename"
 msgstr ""
 
-#: sfdb_ui.cc:697
+#: sfdb_ui.cc:703 time_fx_dialog.cc:154
 msgid "Duration"
 msgstr ""
 
-#: sfdb_ui.cc:698
+#: sfdb_ui.cc:704
 msgid "Size"
 msgstr ""
 
-#: sfdb_ui.cc:699
+#: sfdb_ui.cc:705
 msgid "Samplerate"
 msgstr ""
 
-#: sfdb_ui.cc:700
+#: sfdb_ui.cc:706
 msgid "License"
 msgstr ""
 
-#: sfdb_ui.cc:718
+#: sfdb_ui.cc:724
 msgid "Search Freesound"
 msgstr "Sök i Freesound"
 
-#: sfdb_ui.cc:738
-msgid "Press to import selected files and close this window"
-msgstr ""
-
-#: sfdb_ui.cc:739
-msgid "Press to import selected files and leave this window open"
+#: sfdb_ui.cc:741
+msgid "Press to import selected files"
 msgstr ""
 
-#: sfdb_ui.cc:740
+#: sfdb_ui.cc:742
 msgid "Press to close this window without importing any files"
 msgstr ""
 
-#: sfdb_ui.cc:936
+#: sfdb_ui.cc:937
 msgid "SoundFileBrowser: Could not tokenize string: "
 msgstr ""
 
-#: sfdb_ui.cc:1136
+#: sfdb_ui.cc:1137
 msgid "%1 more page of 100 results available"
 msgid_plural "%1 more pages of 100 results available"
 msgstr[0] ""
 msgstr[1] ""
 
-#: sfdb_ui.cc:1141
+#: sfdb_ui.cc:1142
 msgid "No more results available"
 msgstr ""
 
-#: sfdb_ui.cc:1205
+#: sfdb_ui.cc:1206
 msgid "B"
 msgstr ""
 
-#: sfdb_ui.cc:1207
+#: sfdb_ui.cc:1208
 msgid "kB"
 msgstr ""
 
-#: sfdb_ui.cc:1209 sfdb_ui.cc:1211
+#: sfdb_ui.cc:1210 sfdb_ui.cc:1212
 msgid "MB"
 msgstr ""
 
-#: sfdb_ui.cc:1213
+#: sfdb_ui.cc:1214
 msgid "GB"
 msgstr ""
 
-#: sfdb_ui.cc:1425 sfdb_ui.cc:1738 sfdb_ui.cc:1801 sfdb_ui.cc:1819
+#: sfdb_ui.cc:1431 sfdb_ui.cc:1728 sfdb_ui.cc:1764 sfdb_ui.cc:1782
 msgid "one track per file"
 msgstr "ett spår per fil"
 
-#: sfdb_ui.cc:1428 sfdb_ui.cc:1802 sfdb_ui.cc:1820
+#: sfdb_ui.cc:1434 sfdb_ui.cc:1765 sfdb_ui.cc:1783
 msgid "one track per channel"
 msgstr ""
 
-#: sfdb_ui.cc:1436 sfdb_ui.cc:1804 sfdb_ui.cc:1821
+#: sfdb_ui.cc:1442 sfdb_ui.cc:1767 sfdb_ui.cc:1784
 msgid "sequence files"
 msgstr ""
 
-#: sfdb_ui.cc:1439 sfdb_ui.cc:1809
+#: sfdb_ui.cc:1445 sfdb_ui.cc:1772
 msgid "all files in one track"
 msgstr ""
 
-#: sfdb_ui.cc:1440 sfdb_ui.cc:1803
+#: sfdb_ui.cc:1446 sfdb_ui.cc:1766
 msgid "merge files"
 msgstr ""
 
-#: sfdb_ui.cc:1446 sfdb_ui.cc:1806
+#: sfdb_ui.cc:1452 sfdb_ui.cc:1769
 msgid "one region per file"
 msgstr ""
 
-#: sfdb_ui.cc:1449 sfdb_ui.cc:1807
+#: sfdb_ui.cc:1455 sfdb_ui.cc:1770
 msgid "one region per channel"
 msgstr ""
 
-#: sfdb_ui.cc:1454 sfdb_ui.cc:1808 sfdb_ui.cc:1822
+#: sfdb_ui.cc:1460 sfdb_ui.cc:1771 sfdb_ui.cc:1785
 msgid "all files in one region"
 msgstr ""
 
-#: sfdb_ui.cc:1521
+#: sfdb_ui.cc:1527
 msgid ""
 "One or more of the selected files\n"
 "cannot be used by %1"
 msgstr ""
 
-#: sfdb_ui.cc:1665
+#: sfdb_ui.cc:1671
 msgid "Copy files to session"
 msgstr "Kopiera filer till sessionen"
 
-#: sfdb_ui.cc:1682 sfdb_ui.cc:1859
+#: sfdb_ui.cc:1686 sfdb_ui.cc:1825
 msgid "file timestamp"
 msgstr "filens timestamp"
 
-#: sfdb_ui.cc:1683 sfdb_ui.cc:1861
+#: sfdb_ui.cc:1687 sfdb_ui.cc:1827
 msgid "edit point"
 msgstr "redigeringspunkten"
 
-#: sfdb_ui.cc:1684 sfdb_ui.cc:1863
+#: sfdb_ui.cc:1688 sfdb_ui.cc:1829
 msgid "playhead"
 msgstr "startmarkören"
 
-#: sfdb_ui.cc:1685
+#: sfdb_ui.cc:1689
 msgid "session start"
 msgstr "sessionens start"
 
-#: sfdb_ui.cc:1691
-msgid "<b>Add files as ...</b>"
+#: sfdb_ui.cc:1695
+msgid "<b>Add files ...</b>"
 msgstr ""
 
-#: sfdb_ui.cc:1713
+#: sfdb_ui.cc:1700
 msgid "<b>Insert at</b>"
 msgstr ""
 
-#: sfdb_ui.cc:1726
+#: sfdb_ui.cc:1705
 msgid "<b>Mapping</b>"
 msgstr ""
 
-#: sfdb_ui.cc:1744
+#: sfdb_ui.cc:1710
 msgid "<b>Conversion quality</b>"
 msgstr ""
 
-#: sfdb_ui.cc:1756
+#: sfdb_ui.cc:1715
 msgid "<b>Instrument</b>"
 msgstr ""
 
-#: sfdb_ui.cc:1768 sfdb_ui.cc:1875
+#: sfdb_ui.cc:1734 sfdb_ui.cc:1841
 msgid "Best"
 msgstr "Bäst"
 
-#: sfdb_ui.cc:1769 sfdb_ui.cc:1877
+#: sfdb_ui.cc:1735 sfdb_ui.cc:1843
 msgid "Good"
 msgstr "Bra"
 
-#: sfdb_ui.cc:1770 sfdb_ui.cc:1879
+#: sfdb_ui.cc:1736 sfdb_ui.cc:1845
 msgid "Quick"
 msgstr "Snabb"
 
-#: sfdb_ui.cc:1772
+#: sfdb_ui.cc:1738
 msgid "Fastest"
 msgstr "Snabbast"
 
-#: shuttle_control.cc:56
+#: shuttle_control.cc:64
 msgid "Shuttle speed control (Context-click for options)"
 msgstr ""
 
-#: shuttle_control.cc:174
+#: shuttle_control.cc:201 time_fx_dialog.cc:164
 msgid "Percent"
 msgstr ""
 
-#: shuttle_control.cc:182
+#: shuttle_control.cc:209
 msgid "Units"
 msgstr "Enheter"
 
-#: shuttle_control.cc:188 shuttle_control.cc:609
+#: shuttle_control.cc:215 shuttle_control.cc:671
 msgid "Sprung"
 msgstr ""
 
-#: shuttle_control.cc:192 shuttle_control.cc:612
+#: shuttle_control.cc:219 shuttle_control.cc:674
 msgid "Wheel"
 msgstr ""
 
-#: shuttle_control.cc:226
+#: shuttle_control.cc:253
 msgid "Maximum speed"
 msgstr "Maxhastighet"
 
-#: shuttle_control.cc:568
+#: shuttle_control.cc:256
+msgid "Reset to 100%"
+msgstr ""
+
+#: shuttle_control.cc:633
 msgid "Playing"
 msgstr ""
 
-#: shuttle_control.cc:583
+#: shuttle_control.cc:648
 #, c-format
 msgid "<<< %+d semitones"
 msgstr ""
 
-#: shuttle_control.cc:585
+#: shuttle_control.cc:650
 #, c-format
 msgid ">>> %+d semitones"
 msgstr ""
 
-#: shuttle_control.cc:590
-msgid "Stopped"
-msgstr ""
-
 #: soundcloud_export_selector.cc:44
 msgid "User Email"
 msgstr ""
@@ -11366,7 +13402,7 @@ msgstr ""
 msgid "%1: %2 of %3 bytes uploaded"
 msgstr ""
 
-#: splash.cc:73
+#: splash.cc:78
 msgid "%1 loading ..."
 msgstr ""
 
@@ -11382,17 +13418,17 @@ msgstr ""
 msgid "Azimuth:"
 msgstr ""
 
-#: startup.cc:67
+#: startup.cc:71
 msgid ""
 "Use an external mixer or the hardware mixer of your audio interface.\n"
 "%1 will play NO role in monitoring"
 msgstr ""
 
-#: startup.cc:69
+#: startup.cc:73
 msgid "Ask %1 to play back material as it is being recorded"
 msgstr ""
 
-#: startup.cc:142
+#: startup.cc:146
 msgid ""
 "<span size=\"larger\">%1 is a digital audio workstation. You can use it to "
 "record, edit and mix multi-track audio. You can produce your own CDs, mix "
@@ -11402,15 +13438,15 @@ msgid ""
 "program.</span> "
 msgstr ""
 
-#: startup.cc:168
+#: startup.cc:172
 msgid "Welcome to %1"
 msgstr "Välkommen till %1"
 
-#: startup.cc:191
+#: startup.cc:195
 msgid "Default folder for %1 sessions"
 msgstr "Standardplatsen för %1-sessioner"
 
-#: startup.cc:197
+#: startup.cc:201
 msgid ""
 "Each project that you work on with %1 has its own folder.\n"
 "These can require a lot of disk space if you are recording audio.\n"
@@ -11427,11 +13463,11 @@ msgstr ""
 "<i>(Du kan så klart placera sessioner var du vill, detta är bara "
 "stanardplatsen)</i>"
 
-#: startup.cc:220
+#: startup.cc:224
 msgid "Default folder for new sessions"
 msgstr "Standardplats för nya sessioner"
 
-#: startup.cc:241
+#: startup.cc:245
 msgid ""
 "While recording instruments or vocals, you probably want to listen to the\n"
 "signal as well as record it. This is called \"monitoring\". There are\n"
@@ -11445,25 +13481,25 @@ msgid ""
 "<i>If you do not understand what this is about, just accept the default.</i>"
 msgstr ""
 
-#: startup.cc:262
+#: startup.cc:266
 msgid "Monitoring Choices"
 msgstr "Medhörningsalternativ"
 
-#: startup.cc:285
+#: startup.cc:289
 msgid "Use a Master bus directly"
 msgstr "Använd master-bussen"
 
-#: startup.cc:287
+#: startup.cc:291
 msgid ""
 "Connect the Master bus directly to your hardware outputs. This is preferable "
 "for simple usage."
 msgstr ""
 
-#: startup.cc:296
+#: startup.cc:300
 msgid "Use an additional Monitor bus"
 msgstr "Använd en ytterligare medhörningsbuss"
 
-#: startup.cc:299
+#: startup.cc:303
 msgid ""
 "Use a Monitor bus between Master bus and hardware outputs for \n"
 "greater control in monitoring without affecting the mix."
@@ -11471,7 +13507,7 @@ msgstr ""
 "Använd en medhörningsbuss mellan mater-bussen och hårdvaruutgångarna för \n"
 "större kontroll av medhörning, utan att påverka mixen."
 
-#: startup.cc:321
+#: startup.cc:325
 msgid ""
 "<i>You can change this preference at any time via the Preferences dialog.\n"
 "You can also add or remove the monitor section to/from any session.</i>\n"
@@ -11479,44 +13515,40 @@ msgid ""
 "<i>If you do not understand what this is about, just accept the default.</i>"
 msgstr ""
 
-#: startup.cc:332
+#: startup.cc:336
 msgid "Monitor Section"
 msgstr "Medhörningssektion"
 
-#: step_entry.cc:60
+#: step_entry.cc:59
 msgid "Step Entry: %1"
 msgstr ""
 
-#: step_entry.cc:65
+#: step_entry.cc:64
 msgid ">beat"
 msgstr ""
 
-#: step_entry.cc:66
+#: step_entry.cc:65
 msgid ">bar"
 msgstr ""
 
-#: step_entry.cc:67
+#: step_entry.cc:66
 msgid ">EP"
 msgstr ""
 
-#: step_entry.cc:68
+#: step_entry.cc:67
 msgid "sustain"
 msgstr ""
 
-#: step_entry.cc:69
+#: step_entry.cc:68
 msgid "rest"
 msgstr ""
 
-#: step_entry.cc:70
+#: step_entry.cc:69
 msgid "g-rest"
 msgstr ""
 
-#: step_entry.cc:71
-msgid "back"
-msgstr ""
-
-#: step_entry.cc:82 step_entry.cc:85
-msgid "+"
+#: step_entry.cc:70
+msgid "back"
 msgstr ""
 
 #: step_entry.cc:191
@@ -11627,11 +13659,11 @@ msgstr ""
 msgid "Insert a program change message"
 msgstr ""
 
-#: step_entry.cc:343 step_entry.cc:700
+#: step_entry.cc:343 step_entry.cc:645
 msgid "Move Insert Position Back by Note Length"
 msgstr ""
 
-#: step_entry.cc:344 step_entry.cc:698
+#: step_entry.cc:344 step_entry.cc:643
 msgid "Move Insert Position to Edit Point"
 msgstr ""
 
@@ -11643,240 +13675,244 @@ msgstr ""
 msgid "Octave"
 msgstr ""
 
-#: step_entry.cc:598
+#: step_entry.cc:592
 msgid "Insert Note A"
 msgstr ""
 
-#: step_entry.cc:599
+#: step_entry.cc:593
 msgid "Insert Note A-sharp"
 msgstr ""
 
-#: step_entry.cc:600
+#: step_entry.cc:594
 msgid "Insert Note B"
 msgstr ""
 
-#: step_entry.cc:601
+#: step_entry.cc:595
 msgid "Insert Note C"
 msgstr ""
 
-#: step_entry.cc:602
+#: step_entry.cc:596
 msgid "Insert Note C-sharp"
 msgstr ""
 
-#: step_entry.cc:603
+#: step_entry.cc:597
 msgid "Insert Note D"
 msgstr ""
 
-#: step_entry.cc:604
+#: step_entry.cc:598
 msgid "Insert Note D-sharp"
 msgstr ""
 
-#: step_entry.cc:605
+#: step_entry.cc:599
 msgid "Insert Note E"
 msgstr ""
 
-#: step_entry.cc:606
+#: step_entry.cc:600
 msgid "Insert Note F"
 msgstr ""
 
-#: step_entry.cc:607
+#: step_entry.cc:601
 msgid "Insert Note F-sharp"
 msgstr ""
 
-#: step_entry.cc:608
+#: step_entry.cc:602
 msgid "Insert Note G"
 msgstr ""
 
-#: step_entry.cc:609
+#: step_entry.cc:603
 msgid "Insert Note G-sharp"
 msgstr ""
 
-#: step_entry.cc:611
+#: step_entry.cc:605
 msgid "Insert a Note-length Rest"
 msgstr ""
 
-#: step_entry.cc:612
+#: step_entry.cc:606
 msgid "Insert a Snap-length Rest"
 msgstr ""
 
-#: step_entry.cc:614 step_entry.cc:615
+#: step_entry.cc:608 step_entry.cc:609
 msgid "Move to next octave"
 msgstr ""
 
-#: step_entry.cc:617
+#: step_entry.cc:611
 msgid "Move to Next Note Length"
 msgstr ""
 
-#: step_entry.cc:618
+#: step_entry.cc:612
 msgid "Move to Previous Note Length"
 msgstr ""
 
-#: step_entry.cc:620
+#: step_entry.cc:614
 msgid "Increase Note Length"
 msgstr ""
 
-#: step_entry.cc:621
+#: step_entry.cc:615
 msgid "Decrease Note Length"
 msgstr ""
 
-#: step_entry.cc:623
+#: step_entry.cc:617
 msgid "Move to Next Note Velocity"
 msgstr ""
 
-#: step_entry.cc:624
+#: step_entry.cc:618
 msgid "Move to Previous Note Velocity"
 msgstr ""
 
-#: step_entry.cc:626
+#: step_entry.cc:620
 msgid "Increase Note Velocity"
 msgstr ""
 
-#: step_entry.cc:627
+#: step_entry.cc:621
 msgid "Decrease Note Velocity"
 msgstr ""
 
-#: step_entry.cc:629
+#: step_entry.cc:623
 msgid "Switch to the 1st octave"
 msgstr ""
 
-#: step_entry.cc:630
+#: step_entry.cc:624
 msgid "Switch to the 2nd octave"
 msgstr ""
 
-#: step_entry.cc:631
+#: step_entry.cc:625
 msgid "Switch to the 3rd octave"
 msgstr ""
 
-#: step_entry.cc:632
+#: step_entry.cc:626
 msgid "Switch to the 4th octave"
 msgstr ""
 
-#: step_entry.cc:633
+#: step_entry.cc:627
 msgid "Switch to the 5th octave"
 msgstr ""
 
-#: step_entry.cc:634
+#: step_entry.cc:628
 msgid "Switch to the 6th octave"
 msgstr ""
 
-#: step_entry.cc:635
+#: step_entry.cc:629
 msgid "Switch to the 7th octave"
 msgstr ""
 
-#: step_entry.cc:636
+#: step_entry.cc:630
 msgid "Switch to the 8th octave"
 msgstr ""
 
-#: step_entry.cc:637
+#: step_entry.cc:631
 msgid "Switch to the 9th octave"
 msgstr ""
 
-#: step_entry.cc:638
+#: step_entry.cc:632
 msgid "Switch to the 10th octave"
 msgstr ""
 
-#: step_entry.cc:639
+#: step_entry.cc:633
 msgid "Switch to the 11th octave"
 msgstr ""
 
-#: step_entry.cc:644
+#: step_entry.cc:635
+msgid "Toggle Triple Notes"
+msgstr ""
+
+#: step_entry.cc:638
+msgid "Toggle Chord Entry"
+msgstr ""
+
+#: step_entry.cc:640
+msgid "Sustain Selected Notes by Note Length"
+msgstr ""
+
+#: step_entry.cc:650
 msgid "Set Note Length to Whole"
 msgstr ""
 
-#: step_entry.cc:646
+#: step_entry.cc:652
 msgid "Set Note Length to 1/2"
 msgstr ""
 
-#: step_entry.cc:648
+#: step_entry.cc:654
 msgid "Set Note Length to 1/3"
 msgstr ""
 
-#: step_entry.cc:650
+#: step_entry.cc:656
 msgid "Set Note Length to 1/4"
 msgstr ""
 
-#: step_entry.cc:652
+#: step_entry.cc:658
 msgid "Set Note Length to 1/8"
 msgstr ""
 
-#: step_entry.cc:654
+#: step_entry.cc:660
 msgid "Set Note Length to 1/16"
 msgstr ""
 
-#: step_entry.cc:656
+#: step_entry.cc:662
 msgid "Set Note Length to 1/32"
 msgstr ""
 
-#: step_entry.cc:658
+#: step_entry.cc:664
 msgid "Set Note Length to 1/64"
 msgstr ""
 
-#: step_entry.cc:663
+#: step_entry.cc:669
 msgid "Set Note Velocity to Pianississimo"
 msgstr ""
 
-#: step_entry.cc:665
+#: step_entry.cc:671
 msgid "Set Note Velocity to Pianissimo"
 msgstr ""
 
-#: step_entry.cc:667
+#: step_entry.cc:673
 msgid "Set Note Velocity to Piano"
 msgstr ""
 
-#: step_entry.cc:669
+#: step_entry.cc:675
 msgid "Set Note Velocity to Mezzo-Piano"
 msgstr ""
 
-#: step_entry.cc:671
+#: step_entry.cc:677
 msgid "Set Note Velocity to Mezzo-Forte"
 msgstr ""
 
-#: step_entry.cc:673
+#: step_entry.cc:679
 msgid "Set Note Velocity to Forte"
 msgstr ""
 
-#: step_entry.cc:675 step_entry.cc:677
+#: step_entry.cc:681 step_entry.cc:683
 msgid "Set Note Velocity to Fortississimo"
 msgstr ""
 
-#: step_entry.cc:679
-msgid "Toggle Triple Notes"
-msgstr ""
-
-#: step_entry.cc:684
+#: step_entry.cc:688
 msgid "No Dotted Notes"
 msgstr ""
 
-#: step_entry.cc:686
+#: step_entry.cc:689
 msgid "Toggled Dotted Notes"
 msgstr ""
 
-#: step_entry.cc:688
+#: step_entry.cc:690
 msgid "Toggled Double-Dotted Notes"
 msgstr ""
 
-#: step_entry.cc:690
+#: step_entry.cc:691
 msgid "Toggled Triple-Dotted Notes"
 msgstr ""
 
-#: step_entry.cc:693
-msgid "Toggle Chord Entry"
-msgstr ""
-
-#: step_entry.cc:695
-msgid "Sustain Selected Notes by Note Length"
-msgstr ""
-
-#: stereo_panner.cc:133
+#: stereo_panner.cc:129
 #, c-format
 msgid "L:%3d R:%3d Width:%d%%"
 msgstr ""
 
-#: stereo_panner_editor.cc:35
+#: stereo_panner.cc:272
+msgid "Panner|M"
+msgstr ""
+
+#: stereo_panner_editor.cc:37
 msgid "Stereo Panner"
 msgstr ""
 
-#: stereo_panner_editor.cc:49
+#: stereo_panner_editor.cc:51
 msgid "Width"
 msgstr ""
 
@@ -11884,176 +13920,189 @@ msgstr ""
 msgid "Strip Silence"
 msgstr ""
 
-#: strip_silence_dialog.cc:75
+#: strip_silence_dialog.cc:65
+msgid "Threshold"
+msgstr "Tröskel"
+
+#: strip_silence_dialog.cc:76
 msgid "Minimum length"
 msgstr ""
 
-#: strip_silence_dialog.cc:83
+#: strip_silence_dialog.cc:84
 msgid "Fade length"
 msgstr ""
 
-#: tempo_dialog.cc:41 tempo_dialog.cc:57
+#: strip_silence_dialog.cc:111 strip_silence_dialog.cc:298
+msgid "Analyzing"
+msgstr ""
+
+#: tempo_dialog.cc:43 tempo_dialog.cc:60
 msgid "bar:"
 msgstr ""
 
-#: tempo_dialog.cc:42 tempo_dialog.cc:58
+#: tempo_dialog.cc:44 tempo_dialog.cc:61
 msgid "beat:"
 msgstr ""
 
-#: tempo_dialog.cc:43 tempo_dialog.cc:59
+#: tempo_dialog.cc:45 tempo_dialog.cc:62
 msgid "Pulse note"
 msgstr ""
 
-#: tempo_dialog.cc:44 tempo_dialog.cc:60
+#: tempo_dialog.cc:46 tempo_dialog.cc:63
 msgid "Tap tempo"
 msgstr ""
 
-#: tempo_dialog.cc:54
-msgid "Edit Tempo"
-msgstr ""
-
-#: tempo_dialog.cc:77 tempo_dialog.cc:78 tempo_dialog.cc:324
-#: tempo_dialog.cc:325
+#: tempo_dialog.cc:81 tempo_dialog.cc:82 tempo_dialog.cc:448
+#: tempo_dialog.cc:449
 msgid "whole"
 msgstr ""
 
-#: tempo_dialog.cc:79 tempo_dialog.cc:80 tempo_dialog.cc:326
-#: tempo_dialog.cc:327
+#: tempo_dialog.cc:83 tempo_dialog.cc:84 tempo_dialog.cc:450
+#: tempo_dialog.cc:451
 msgid "second"
 msgstr ""
 
-#: tempo_dialog.cc:81 tempo_dialog.cc:82 tempo_dialog.cc:328
-#: tempo_dialog.cc:329
+#: tempo_dialog.cc:85 tempo_dialog.cc:86 tempo_dialog.cc:452
+#: tempo_dialog.cc:453
 msgid "third"
 msgstr ""
 
-#: tempo_dialog.cc:83 tempo_dialog.cc:84 tempo_dialog.cc:330
-#: tempo_dialog.cc:331
+#: tempo_dialog.cc:87 tempo_dialog.cc:88 tempo_dialog.cc:454
+#: tempo_dialog.cc:455
 msgid "quarter"
 msgstr ""
 
-#: tempo_dialog.cc:85 tempo_dialog.cc:86 tempo_dialog.cc:332
-#: tempo_dialog.cc:333
+#: tempo_dialog.cc:89 tempo_dialog.cc:90 tempo_dialog.cc:456
+#: tempo_dialog.cc:457
 msgid "eighth"
 msgstr ""
 
-#: tempo_dialog.cc:87 tempo_dialog.cc:88 tempo_dialog.cc:334
-#: tempo_dialog.cc:335
+#: tempo_dialog.cc:91 tempo_dialog.cc:92 tempo_dialog.cc:458
+#: tempo_dialog.cc:459
 msgid "sixteenth"
 msgstr ""
 
-#: tempo_dialog.cc:89 tempo_dialog.cc:90 tempo_dialog.cc:336
-#: tempo_dialog.cc:337
+#: tempo_dialog.cc:93 tempo_dialog.cc:94 tempo_dialog.cc:460
+#: tempo_dialog.cc:461
 msgid "thirty-second"
 msgstr ""
 
-#: tempo_dialog.cc:91 tempo_dialog.cc:92 tempo_dialog.cc:338
-#: tempo_dialog.cc:339
+#: tempo_dialog.cc:95 tempo_dialog.cc:96 tempo_dialog.cc:462
+#: tempo_dialog.cc:463
 msgid "sixty-fourth"
 msgstr ""
 
-#: tempo_dialog.cc:93 tempo_dialog.cc:94 tempo_dialog.cc:340
-#: tempo_dialog.cc:341
+#: tempo_dialog.cc:97 tempo_dialog.cc:98 tempo_dialog.cc:464
+#: tempo_dialog.cc:465
 msgid "one-hundred-twenty-eighth"
 msgstr ""
 
-#: tempo_dialog.cc:121
+#: tempo_dialog.cc:115 tempo_dialog.cc:116
+msgid "ramped"
+msgstr ""
+
+#: tempo_dialog.cc:117 tempo_dialog.cc:118
+msgid "constant"
+msgstr ""
+
+#: tempo_dialog.cc:133 tempo_dialog.cc:134 tempo_dialog.cc:482
+#: tempo_dialog.cc:483
+msgid "music"
+msgstr ""
+
+#: tempo_dialog.cc:161
 msgid "Beats per minute:"
 msgstr "Slag per minut:"
 
-#: tempo_dialog.cc:155
+#: tempo_dialog.cc:195
 msgid "Tempo begins at"
 msgstr ""
 
-#: tempo_dialog.cc:251
+#: tempo_dialog.cc:201
+msgid "Lock Style:"
+msgstr ""
+
+#: tempo_dialog.cc:209
+msgid "Tempo Type:"
+msgstr ""
+
+#: tempo_dialog.cc:321
 msgid "incomprehensible pulse note type (%1)"
 msgstr ""
 
-#: tempo_dialog.cc:307
-msgid "Edit Meter"
+#: tempo_dialog.cc:334
+msgid "incomprehensible tempo type (%1)"
+msgstr ""
+
+#: tempo_dialog.cc:347
+msgid "incomprehensible lock style (%1)"
 msgstr ""
 
-#: tempo_dialog.cc:356
+#: tempo_dialog.cc:498
 msgid "Note value:"
 msgstr "Notvärde:"
 
-#: tempo_dialog.cc:357
+#: tempo_dialog.cc:499
+msgid "Lock style:"
+msgstr ""
+
+#: tempo_dialog.cc:500
 msgid "Beats per bar:"
 msgstr "Slag per takt:"
 
-#: tempo_dialog.cc:371
+#: tempo_dialog.cc:514
 msgid "Meter begins at bar:"
 msgstr ""
 
-#: tempo_dialog.cc:484
+#: tempo_dialog.cc:638
 msgid "incomprehensible meter note type (%1)"
 msgstr ""
 
-#: theme_manager.cc:65
-msgid "Dark Theme"
-msgstr "Mörkt tema"
-
-#: theme_manager.cc:66
-msgid "Light Theme"
-msgstr "Ljust tema"
-
-#: theme_manager.cc:67
-msgid "Restore Defaults"
-msgstr "Nollställ"
+#: tempo_dialog.cc:651
+msgid "incomprehensible meter lock style (%1)"
+msgstr ""
 
-#: theme_manager.cc:68
+#: theme_manager.cc:53
 msgid "Draw \"flat\" buttons"
 msgstr ""
 
-#: theme_manager.cc:69
+#: theme_manager.cc:54
 msgid "Blink Rec-Arm buttons"
 msgstr ""
 
-#: theme_manager.cc:70
+#: theme_manager.cc:55
 msgid "Color regions using their track's color"
 msgstr "Färglägg regioner med spårets färg"
 
-#: theme_manager.cc:71
+#: theme_manager.cc:56
 msgid "Show waveform clipping"
 msgstr ""
 
-#: theme_manager.cc:73
+#: theme_manager.cc:58
 msgid "Waveforms color gradient depth"
 msgstr ""
 
-#: theme_manager.cc:75
+#: theme_manager.cc:60
 msgid "Timeline item gradient depth"
 msgstr ""
 
-#: theme_manager.cc:76
+#: theme_manager.cc:61
 msgid "All floating windows are dialogs"
 msgstr ""
 
-#: theme_manager.cc:77
+#: theme_manager.cc:62
 msgid "Transient windows follow front window."
 msgstr ""
 
-#: theme_manager.cc:78
-msgid "Icon Set"
-msgstr ""
-
-#: theme_manager.cc:87
-msgid "Object"
-msgstr "Objekt"
-
-#: theme_manager.cc:163
-msgid "Items"
-msgstr ""
-
-#: theme_manager.cc:164
-msgid "Palette"
+#: theme_manager.cc:63
+msgid "Float detached monitor-section window"
 msgstr ""
 
-#: theme_manager.cc:165
-msgid "Transparency"
+#: theme_manager.cc:64
+msgid "Icon Set"
 msgstr ""
 
-#: theme_manager.cc:195
+#: theme_manager.cc:132
 msgid ""
 "Mark all floating windows to be type \"Dialog\" rather than using \"Utility"
 "\" for some.\n"
@@ -12061,92 +14110,95 @@ msgid ""
 "take effect"
 msgstr ""
 
-#: theme_manager.cc:199
+#: theme_manager.cc:136
 msgid ""
 "Make transient windows follow the front window when toggling between the "
 "editor and mixer.\n"
 "This requires a restart of %1 to take effect"
 msgstr ""
 
-#: theme_manager.cc:620
-msgid "Color Palette"
+#: theme_manager.cc:139
+msgid ""
+"When detaching the monitoring section, mark it as \"Utility\" window to stay "
+"in front.\n"
+"This requires a restart of %1 to take effect"
 msgstr ""
 
 #: time_axis_view.cc:148
 msgid "Track/Bus name (double click to edit)"
 msgstr ""
 
-#: time_axis_view_item.cc:345
+#: time_axis_view_item.cc:326
 msgid "new duration %1 frame is out of bounds for %2"
 msgid_plural "new duration of %1 frames is out of bounds for %2"
 msgstr[0] ""
 msgstr[1] ""
 
-#: time_fx_dialog.cc:62
+#: time_fx_dialog.cc:60
 msgid "Quick but Ugly"
 msgstr "Snabbt men fult"
 
-#: time_fx_dialog.cc:63
+#: time_fx_dialog.cc:61
 msgid "Skip Anti-aliasing"
 msgstr "Hoppa över Anti-aliasing"
 
-#: time_fx_dialog.cc:64
-msgid "Contents:"
-msgstr "Innehåll"
+#: time_fx_dialog.cc:62
+msgid "Contents"
+msgstr ""
 
-#: time_fx_dialog.cc:65
+#: time_fx_dialog.cc:63
 msgid "Minimize time distortion"
 msgstr ""
 
-#: time_fx_dialog.cc:66
+#: time_fx_dialog.cc:64
 msgid "Preserve Formants"
 msgstr ""
 
-#: time_fx_dialog.cc:71
+#: time_fx_dialog.cc:81
 msgid "TimeFXDialog"
 msgstr ""
 
-#: time_fx_dialog.cc:74
+#: time_fx_dialog.cc:84
 msgid "Pitch Shift Audio"
 msgstr ""
 
-#: time_fx_dialog.cc:76
+#: time_fx_dialog.cc:86
 msgid "Time Stretch Audio"
 msgstr ""
 
-#: time_fx_dialog.cc:104 transpose_dialog.cc:41
+#: time_fx_dialog.cc:114 transpose_dialog.cc:41
 msgid "Octaves:"
 msgstr ""
 
-#: time_fx_dialog.cc:109 transpose_dialog.cc:46
+#: time_fx_dialog.cc:119 transpose_dialog.cc:46
 msgid "Semitones:"
 msgstr ""
 
-#: time_fx_dialog.cc:114
+#: time_fx_dialog.cc:124
 msgid "Cents:"
 msgstr ""
 
-#: time_fx_dialog.cc:122
+#: time_fx_dialog.cc:132
 msgid "Time|Shift"
 msgstr ""
 
-#: time_fx_dialog.cc:146 time_fx_dialog.cc:149
+#: time_fx_dialog.cc:184 time_fx_dialog.cc:188
 msgid "TimeFXButton"
 msgstr ""
 
-#: time_fx_dialog.cc:154
+#: time_fx_dialog.cc:193
 msgid "Stretch/Shrink"
 msgstr "Förläng/Förkorta"
 
-#: time_fx_dialog.cc:164
+#: time_fx_dialog.cc:203
 msgid "<b>Progress</b>"
 msgstr ""
 
-#: time_info_box.cc:124
+#: time_info_box.cc:118
 msgid "Start recording at auto-punch start"
 msgstr "Starta inspelning vid autoinslagsstart"
 
-#: time_info_box.cc:125
+#: time_info_box.cc:119
 msgid "Stop recording at auto-punch end"
 msgstr "Stanna inspelning vid autoinslagsslut"
 
@@ -12214,94 +14266,130 @@ msgstr ""
 msgid "Transpose"
 msgstr "Transponera"
 
-#: ui_config.cc:163 ui_config.cc:300
+#: ui_config.cc:233 ui_config.cc:416
 msgid "Loading default ui configuration file %1"
 msgstr ""
 
-#: ui_config.cc:166 ui_config.cc:303
+#: ui_config.cc:236 ui_config.cc:419
 msgid "cannot read default ui configuration file \"%1\""
 msgstr ""
 
-#: ui_config.cc:169 ui_config.cc:308
+#: ui_config.cc:239 ui_config.cc:424
 msgid "default ui configuration file \"%1\" not loaded successfully."
 msgstr ""
 
-#: ui_config.cc:177
+#: ui_config.cc:247
 msgid "Could not find default UI configuration file %1"
 msgstr ""
 
-#: ui_config.cc:219
+#: ui_config.cc:330
+msgid "Color file for %1 not found along %2"
+msgstr ""
+
+#: ui_config.cc:337
 msgid "Loading color file %1"
 msgstr ""
 
-#: ui_config.cc:222
+#: ui_config.cc:340
 msgid "cannot read color file \"%1\""
 msgstr ""
 
-#: ui_config.cc:227
+#: ui_config.cc:345
 msgid "color file \"%1\" not loaded successfully."
 msgstr ""
 
-#: ui_config.cc:233
-msgid "Color file %1 not found"
-msgstr ""
-
-#: ui_config.cc:282 ui_config.cc:361
+#: ui_config.cc:397 ui_config.cc:480
 msgid "Color file %1 not saved"
 msgstr ""
 
-#: ui_config.cc:317
+#: ui_config.cc:433
 msgid "Loading user ui configuration file %1"
 msgstr ""
 
-#: ui_config.cc:320
+#: ui_config.cc:436
 msgid "cannot read ui configuration file \"%1\""
 msgstr ""
 
-#: ui_config.cc:325
+#: ui_config.cc:441
 msgid "user ui configuration file \"%1\" not loaded successfully."
 msgstr ""
 
-#: ui_config.cc:333
+#: ui_config.cc:449
 msgid "could not find any ui configuration file, canvas will look broken."
 msgstr ""
 
-#: ui_config.cc:351
+#: ui_config.cc:470
 msgid "Config file %1 not saved"
 msgstr ""
 
-#: ui_config.cc:592
+#: ui_config.cc:715
 msgid "Color %1 not found"
 msgstr ""
 
-#: ui_config.cc:662
+#: ui_config.cc:785
 msgid "Unable to find UI style file %1 in search path %2. %3 will look strange"
 msgstr ""
 
-#: utils.cc:117 utils.cc:160
+#: utils.cc:118 utils.cc:161
 msgid "bad XPM header %1"
 msgstr ""
 
-#: utils.cc:577
+#: utils.cc:424
 msgid "cannot find XPM file for %1"
 msgstr ""
 
-#: utils.cc:597 utils.cc:627 utils.cc:641
+#: utils.cc:477 utils.cc:507 utils.cc:527
 msgid "default"
 msgstr ""
 
-#: utils.cc:642
+#: utils.cc:528
 msgid "icon \"%1\" not found for icon set \"%2\", fallback to default"
 msgstr ""
 
-#: utils.cc:649
+#: utils.cc:535
 msgid "cannot find icon image for %1 using %2"
 msgstr ""
 
-#: utils.cc:666 utils.cc:682
+#: utils.cc:552 utils.cc:568
 msgid "Caught exception while loading icon named %1"
 msgstr ""
 
+#: utils.cc:818
+msgid "Overwrite"
+msgstr ""
+
+#: vca_master_strip.cc:74 vca_time_axis.cc:49
+msgid "Solo slaves"
+msgstr ""
+
+#: vca_master_strip.cc:79 vca_time_axis.cc:55
+msgid "Mute slaves"
+msgstr ""
+
+#: vca_master_strip.cc:83
+msgid "Hide this VCA strip"
+msgstr ""
+
+#: vca_master_strip.cc:108 vca_master_strip.cc:418
+msgid "Click to show slaves only"
+msgstr ""
+
+#: vca_master_strip.cc:293
+msgid "A"
+msgstr ""
+
+#: vca_master_strip.cc:300
+msgid "S"
+msgstr ""
+
+#: vca_master_strip.cc:398
+msgid "Drop All Slaves"
+msgstr ""
+
+#: vca_master_strip.cc:421
+msgid "Click to show normal mixer"
+msgstr ""
+
 #: add_video_dialog.cc:54
 msgid "Set Video Track"
 msgstr ""
@@ -12346,32 +14434,48 @@ msgstr ""
 msgid " %1 fps"
 msgstr ""
 
-#: video_timeline.cc:468
+#: vca_time_axis.cc:60
+msgid "D"
+msgstr ""
+
+#: vca_time_axis.cc:61
+msgid "Unassign all slaves"
+msgstr ""
+
+#: vca_time_axis.cc:65
+msgid "V"
+msgstr ""
+
+#: vca_time_axis.cc:66
+msgid "Show only slaves"
+msgstr ""
+
+#: video_timeline.cc:472
 msgid ""
 "Parsing video file info failed. Is the Video Server running? Is the file "
 "readable by the Video Server? Does the docroot match? Is it a video file?"
 msgstr ""
 
-#: video_timeline.cc:506
+#: video_timeline.cc:510
 msgid ""
 "Failed to set session-framerate: '%1' does not have a corresponding option "
 "setting in %2."
 msgstr ""
 
-#: video_timeline.cc:514
+#: video_timeline.cc:518
 msgid ""
 "Video file's framerate is not equal to %1 session timecode's framerate: '%2' "
 "vs '%3'"
 msgstr ""
 
-#: video_timeline.cc:587
+#: video_timeline.cc:591
 msgid ""
 "Video-server docroot mismatch. %1: '%2', video-server: '%3'. This usually "
 "means that the video server was not started by %1 and uses a different "
 "document-root."
 msgstr ""
 
-#: video_timeline.cc:724
+#: video_timeline.cc:728
 msgid ""
 "Video-monitor 'xjadeo' was not found. Please install http://xjadeo.sf.net/ "
 "(a custom path to xjadeo can be specified by setting the XJREMOTE "
@@ -12381,25 +14485,25 @@ msgid ""
 "see also http://manual.ardour.org/video-timeline/setup/"
 msgstr ""
 
-#: video_timeline.cc:739
+#: video_timeline.cc:743
 msgid "Video-monitor 'xjadeo' cannot be launched."
 msgstr ""
 
-#: video_timeline.cc:766
+#: video_timeline.cc:775
 msgid ""
 "Video-monitor 'xjadeo' is too old. Please install xjadeo version 0.7.7 or "
 "later. http://xjadeo.sf.net/"
 msgstr ""
 
-#: video_monitor.cc:285
+#: video_monitor.cc:283
 msgid "Video Monitor: File Not Found."
 msgstr ""
 
 #: transcode_ffmpeg.cc:56
 msgid ""
-"No ffprobe or ffmpeg executables could be found on this system.\n"
-"Video import and export is not possible until you install those tools.\n"
+"ffmpeg installation was not found on this system.\n"
 "%1 requires ffmpeg and ffprobe from ffmpeg.org - version 1.1 or newer.\n"
+"Video import and export is not possible until you install tools.\n"
 "\n"
 "The tools are included with the %1 releases from ardour.org and also "
 "available with the video-server at http://x42.github.com/harvid/\n"
@@ -12421,7 +14525,7 @@ msgstr ""
 msgid "Output File:"
 msgstr ""
 
-#: transcode_video_dialog.cc:61 export_video_dialog.cc:85
+#: transcode_video_dialog.cc:61 export_video_dialog.cc:81
 msgid "Abort"
 msgstr ""
 
@@ -12430,10 +14534,14 @@ msgid "Height = "
 msgstr ""
 
 #: transcode_video_dialog.cc:66
+msgid "Extract LTC from audio and align video"
+msgstr ""
+
+#: transcode_video_dialog.cc:67
 msgid "Manual Override"
 msgstr ""
 
-#: transcode_video_dialog.cc:70 export_video_dialog.cc:103
+#: transcode_video_dialog.cc:71 export_video_dialog.cc:99
 msgid "Debug Mode: Print ffmpeg command and output to stdout."
 msgstr ""
 
@@ -12443,9 +14551,8 @@ msgstr ""
 
 #: transcode_video_dialog.cc:113
 msgid ""
-"No ffprobe or ffmpeg executables could be found on this system. Video Import "
-"is not possible until you install those tools. See the Log window for more "
-"information."
+"ffmpeg installation was not found. Video Import is not possible. See the Log "
+"window for more information."
 msgstr ""
 
 #: transcode_video_dialog.cc:120
@@ -12454,83 +14561,83 @@ msgid ""
 "unsupported video codec or format."
 msgstr ""
 
-#: transcode_video_dialog.cc:134
+#: transcode_video_dialog.cc:137
 msgid "FPS:"
 msgstr ""
 
-#: transcode_video_dialog.cc:136
-msgid "Duration:"
-msgstr ""
-
-#: transcode_video_dialog.cc:138
+#: transcode_video_dialog.cc:141
 msgid "Codec:"
 msgstr ""
 
-#: transcode_video_dialog.cc:140
+#: transcode_video_dialog.cc:143
 msgid "Geometry:"
 msgstr ""
 
-#: transcode_video_dialog.cc:155
+#: transcode_video_dialog.cc:158
 msgid "??"
 msgstr ""
 
-#: transcode_video_dialog.cc:176
+#: transcode_video_dialog.cc:179
 msgid "<b>Import Settings</b>"
 msgstr ""
 
-#: transcode_video_dialog.cc:181
-msgid "Reference From Current Location (Previously Transcoded Files Only)"
+#: transcode_video_dialog.cc:184
+msgid "Reference from Current Location (Previously Transcoded Files Only)"
 msgstr ""
 
-#: transcode_video_dialog.cc:183
+#: transcode_video_dialog.cc:185
 msgid "Import/Transcode Video to Session"
 msgstr ""
 
-#: transcode_video_dialog.cc:191
+#: transcode_video_dialog.cc:188 transcode_video_dialog.cc:198
 msgid "Do Not Import Video (Audio Import Only)"
 msgstr ""
 
-#: transcode_video_dialog.cc:200
+#: transcode_video_dialog.cc:208
+msgid "Do Not Import Video"
+msgstr ""
+
+#: transcode_video_dialog.cc:224
 msgid "Scale Video: Width = "
 msgstr ""
 
-#: transcode_video_dialog.cc:207
+#: transcode_video_dialog.cc:230
 msgid "Original Width"
 msgstr ""
 
-#: transcode_video_dialog.cc:222
+#: transcode_video_dialog.cc:245
 msgid "Bitrate (KBit/s):"
 msgstr ""
 
-#: transcode_video_dialog.cc:227
+#: transcode_video_dialog.cc:250
 msgid "Extract Audio:"
 msgstr ""
 
-#: transcode_video_dialog.cc:232
+#: transcode_video_dialog.cc:255
 msgid "No Audio Track Present"
 msgstr ""
 
-#: transcode_video_dialog.cc:235
+#: transcode_video_dialog.cc:258
 msgid "Do Not Extract Audio"
 msgstr ""
 
-#: transcode_video_dialog.cc:350
+#: transcode_video_dialog.cc:374
 msgid "Extracting Audio.."
 msgstr ""
 
-#: transcode_video_dialog.cc:353
+#: transcode_video_dialog.cc:377
 msgid "Audio Extraction Failed."
 msgstr ""
 
-#: transcode_video_dialog.cc:379
+#: transcode_video_dialog.cc:403
 msgid "Transcoding Video.."
 msgstr ""
 
-#: transcode_video_dialog.cc:413
+#: transcode_video_dialog.cc:437
 msgid "Transcoding Failed."
 msgstr ""
 
-#: transcode_video_dialog.cc:503
+#: transcode_video_dialog.cc:541
 msgid "Save Transcoded Video File"
 msgstr ""
 
@@ -12550,7 +14657,7 @@ msgstr ""
 msgid "Don't show this dialog again. (Reset in Edit->Preferences)."
 msgstr ""
 
-#: video_server_dialog.cc:97
+#: video_server_dialog.cc:94
 msgid ""
 "The external video server 'harvid' can not be found.\n"
 "The tool is included with the %1 releases from ardour.org, alternatively you "
@@ -12560,239 +14667,230 @@ msgid ""
 "see also http://manual.ardour.org/video-timeline/setup/"
 msgstr ""
 
-#: video_server_dialog.cc:129
+#: video_server_dialog.cc:126
 msgid "Listen Address:"
 msgstr ""
 
-#: video_server_dialog.cc:134
+#: video_server_dialog.cc:131
 msgid "Listen Port:"
 msgstr ""
 
-#: video_server_dialog.cc:139
+#: video_server_dialog.cc:136
 msgid "Cache Size:"
 msgstr ""
 
-#: video_server_dialog.cc:145
+#: video_server_dialog.cc:142
 msgid ""
 "%1 relies on an external video server for the videotimeline.\n"
 "The server configured in Edit -> Preferences -> Video is not reachable.\n"
 "Do you want %1 to launch 'harvid' on this machine?"
 msgstr ""
 
-#: video_server_dialog.cc:189
+#: video_server_dialog.cc:186
 msgid "Set Video Server Executable"
 msgstr ""
 
-#: video_server_dialog.cc:209
+#: video_server_dialog.cc:206
 msgid "Server docroot"
 msgstr ""
 
-#: utils_videotl.cc:60
+#: utils_videotl.cc:61
 msgid "Destination is outside Video Server's docroot. "
 msgstr ""
 
-#: utils_videotl.cc:61
+#: utils_videotl.cc:62
 msgid ""
 "The destination file path is outside of the Video Server's docroot. The file "
 "will not be readable by the Video Server. Do you still want to continue?"
 msgstr ""
 
-#: utils_videotl.cc:64
+#: utils_videotl.cc:65
 msgid "Continue"
 msgstr ""
 
-#: utils_videotl.cc:70
+#: utils_videotl.cc:72
 msgid "Confirm Overwrite"
 msgstr ""
 
-#: utils_videotl.cc:71
-msgid "A file with the same name already exists.  Do you want to overwrite it?"
-msgstr ""
-
-#: utils_videotl.cc:81 utils_videotl.cc:97
+#: utils_videotl.cc:82 utils_videotl.cc:98
 msgid "Cannot create video folder \"%1\" (%2)"
 msgstr ""
 
-#: export_video_dialog.cc:71
+#: export_video_dialog.cc:67
 msgid "Export Video File "
 msgstr ""
 
-#: export_video_dialog.cc:82
+#: export_video_dialog.cc:78
 msgid "Video:"
 msgstr ""
 
-#: export_video_dialog.cc:87
+#: export_video_dialog.cc:83
 msgid "Scale Video (W x H):"
 msgstr ""
 
-#: export_video_dialog.cc:88
+#: export_video_dialog.cc:84
 msgid "Retain Aspect"
 msgstr ""
 
-#: export_video_dialog.cc:93
+#: export_video_dialog.cc:89
 msgid "Set Aspect Ratio:"
 msgstr ""
 
-#: export_video_dialog.cc:94
+#: export_video_dialog.cc:90
 msgid "Normalize Audio"
 msgstr ""
 
-#: export_video_dialog.cc:95
+#: export_video_dialog.cc:91
 msgid "2 Pass Encoding"
 msgstr ""
 
-#: export_video_dialog.cc:96
+#: export_video_dialog.cc:92
 msgid "Codec Optimizations:"
 msgstr ""
 
-#: export_video_dialog.cc:98
+#: export_video_dialog.cc:94
 msgid "Deinterlace"
 msgstr ""
 
-#: export_video_dialog.cc:99
+#: export_video_dialog.cc:95
 msgid "Use [2] B-frames (MPEG 2 or 4 only)"
 msgstr ""
 
-#: export_video_dialog.cc:100
+#: export_video_dialog.cc:96
 msgid "Override FPS (Default is to retain FPS from the input video file):"
 msgstr ""
 
-#: export_video_dialog.cc:101
+#: export_video_dialog.cc:97
 msgid "Include Session Metadata"
 msgstr ""
 
-#: export_video_dialog.cc:119
+#: export_video_dialog.cc:115
 msgid ""
-"No ffprobe or ffmpeg executables could be found on this system. Video Export "
-"is not possible until you install those tools. See the Log window for more "
-"information."
+"ffmpeg installation was not found. Video Export is not possible. See the Log "
+"window for more information."
 msgstr ""
 
-#: export_video_dialog.cc:130
+#: export_video_dialog.cc:126
 msgid "<b>Output:</b> (file extension defines format)"
 msgstr ""
 
-#: export_video_dialog.cc:140
+#: export_video_dialog.cc:136
 msgid "<b>Input Video:</b>"
 msgstr ""
 
-#: export_video_dialog.cc:151
+#: export_video_dialog.cc:147
 msgid "Audio:"
 msgstr ""
 
-#: export_video_dialog.cc:153
+#: export_video_dialog.cc:149
 msgid "Master Bus"
 msgstr ""
 
-#: export_video_dialog.cc:158
+#: export_video_dialog.cc:153
 msgid "from the %1 session's start to the session's end"
 msgstr ""
 
-#: export_video_dialog.cc:161
+#: export_video_dialog.cc:156
 msgid "<b>Settings:</b>"
 msgstr ""
 
-#: export_video_dialog.cc:169
+#: export_video_dialog.cc:164
 msgid "Range:"
 msgstr ""
 
-#: export_video_dialog.cc:172
-msgid "Preset:"
-msgstr ""
-
-#: export_video_dialog.cc:175
+#: export_video_dialog.cc:170
 msgid "Video Codec:"
 msgstr ""
 
-#: export_video_dialog.cc:178
+#: export_video_dialog.cc:173
 msgid "Video KBit/s:"
 msgstr ""
 
-#: export_video_dialog.cc:181
+#: export_video_dialog.cc:176
 msgid "Audio Codec:"
 msgstr ""
 
-#: export_video_dialog.cc:184
+#: export_video_dialog.cc:179
 msgid "Audio KBit/s:"
 msgstr ""
 
-#: export_video_dialog.cc:187
+#: export_video_dialog.cc:182
 msgid "Audio Samplerate:"
 msgstr ""
 
-#: export_video_dialog.cc:222 export_video_dialog.cc:231
-#: export_video_dialog.cc:830 export_video_dialog.cc:833
+#: export_video_dialog.cc:215 export_video_dialog.cc:223
+#: export_video_dialog.cc:814 export_video_dialog.cc:817
 msgid "(default for format)"
 msgstr ""
 
-#: export_video_dialog.cc:242 export_video_dialog.cc:255
-#: export_video_dialog.cc:837 export_video_dialog.cc:846
+#: export_video_dialog.cc:233 export_video_dialog.cc:244
+#: export_video_dialog.cc:821 export_video_dialog.cc:830
 msgid "(default)"
 msgstr ""
 
-#: export_video_dialog.cc:256 export_video_dialog.cc:840
+#: export_video_dialog.cc:245 export_video_dialog.cc:824
 msgid "(retain)"
 msgstr ""
 
-#: export_video_dialog.cc:348
+#: export_video_dialog.cc:335
 msgid "from 00:00:00:00 to the video's end"
 msgstr ""
 
-#: export_video_dialog.cc:350
+#: export_video_dialog.cc:337
 msgid "from the video's start to the video's end"
 msgstr ""
 
-#: export_video_dialog.cc:353
+#: export_video_dialog.cc:340
 msgid "Selected range"
 msgstr ""
 
-#: export_video_dialog.cc:589
+#: export_video_dialog.cc:561
 msgid "Normalizing audio"
 msgstr ""
 
-#: export_video_dialog.cc:593
+#: export_video_dialog.cc:566 export_video_dialog.cc:571
 msgid "Exporting audio"
 msgstr ""
 
-#: export_video_dialog.cc:648
+#: export_video_dialog.cc:632
 msgid "Exporting Audio..."
 msgstr ""
 
-#: export_video_dialog.cc:705
+#: export_video_dialog.cc:689
 msgid ""
 "Export Video: Cannot query duration of video-file, using duration from "
 "timeline instead."
 msgstr ""
 
-#: export_video_dialog.cc:735
+#: export_video_dialog.cc:719
 msgid "Export Video: export-range does not include video."
 msgstr ""
 
-#: export_video_dialog.cc:748
+#: export_video_dialog.cc:732
 msgid "Export Video: No Master Out Ports to Connect for Audio Export"
 msgstr ""
 
-#: export_video_dialog.cc:790
+#: export_video_dialog.cc:774
 msgid "Encoding Video..."
 msgstr ""
 
-#: export_video_dialog.cc:810
+#: export_video_dialog.cc:794
 msgid "Export Video: Video input file cannot be read."
 msgstr ""
 
-#: export_video_dialog.cc:916
+#: export_video_dialog.cc:900
 msgid "Encoding Video.. Pass 1/2"
 msgstr ""
 
-#: export_video_dialog.cc:928
+#: export_video_dialog.cc:912
 msgid "Encoding Video.. Pass 2/2"
 msgstr ""
 
-#: export_video_dialog.cc:1031
+#: export_video_dialog.cc:1015
 msgid "Transcoding failed."
 msgstr ""
 
-#: export_video_dialog.cc:1267 export_video_dialog.cc:1287
+#: export_video_dialog.cc:1251 export_video_dialog.cc:1271
 msgid "Save Exported Video File"
 msgstr ""
 
@@ -12810,13 +14908,162 @@ msgstr ""
 
 #: export_video_infobox.cc:51
 msgid ""
+"%1 does not include commercial licenses for encoding audio/video. Visit "
+"mpegla.com for information about licensing various audio/video codecs.\n"
+"\n"
 "Video encoding is a non-trivial task with many details.\n"
 "\n"
-"Please see the manual at %1/video-timeline/operations/#export.\n"
+"Please see the manual at %2/video-timeline/operations/#export.\n"
 "\n"
 "Open Manual in Browser? "
 msgstr ""
 
+#~ msgid "Display model"
+#~ msgstr "Visningsmodell"
+
+#~ msgid "Composite graphs for each track"
+#~ msgstr "Sammansatt graf för varje spår"
+
+#~ msgid "Composite graph of all tracks"
+#~ msgstr "Sammansatt graf för alla spår"
+
+#~ msgid "Normalize values"
+#~ msgstr "Normalisera värden"
+
+#~ msgid "Locations"
+#~ msgstr "Platser"
+
+#~ msgid ""
+#~ "When active, auditioning is taking place\n"
+#~ "Click to stop the audition"
+#~ msgstr ""
+#~ "I aktivt läge avlyssnas något\n"
+#~ "Klicka för att stoppa avlyssningen"
+
+#~ msgid "Snapshot..."
+#~ msgstr "Ögonblickskopia..."
+
+#~ msgid "Export To Audio File(s)..."
+#~ msgstr "Exportera till ljudfil(er)..."
+
+#~ msgid "Reference"
+#~ msgstr "Referens"
+
+#~ msgid "Transition To Roll"
+#~ msgstr "Övergång till Rullning"
+
+#~ msgid "Transition To Reverse"
+#~ msgstr "Övergång till Motsatt riktning"
+
+#~ msgid "Play From Edit Point"
+#~ msgstr "Spela från redigeringspunkten"
+
+#~ msgid "Play From Start"
+#~ msgstr "Spela från starten"
+
+#~ msgid "Zoom focus"
+#~ msgstr "Zoom-fokus"
+
+#~ msgid "Break drag or deselect all"
+#~ msgstr "Avbryt dragmanöver eller välj ingenting"
+
+#~ msgid "Import From Session"
+#~ msgstr "Importera från session"
+
+#~ msgid "Insert Region From Region List"
+#~ msgstr "Infoga region från regionlistan"
+
+#~ msgid "End point trim"
+#~ msgstr "Beskär slutpunkt"
+
+#~ msgid "duplicate selection"
+#~ msgstr "duplicera markering"
+
+#~ msgid "tracks"
+#~ msgstr "spår"
+
+#~ msgid "busses"
+#~ msgstr "buss(ar)"
+
+#~ msgid "L"
+#~ msgstr "V"
+
+#~ msgid "O"
+#~ msgstr "A"
+
+#~ msgid "R"
+#~ msgstr "H"
+
+#~ msgid "Show Tracks With Regions Under Playhead"
+#~ msgstr "Visa spår med regioner under startmarkören"
+
+#~ msgid "Select an action, then press the key(s) to (re)set its shortcut"
+#~ msgstr "Välj en händelse och tryck tangentkombinationen du vill använda"
+
+#~ msgid "*Comments*"
+#~ msgstr "*Kommentarer"
+
+#~ msgid "*Cmt*"
+#~ msgstr "*Kmt*"
+
+#~ msgid "Click to Add/Edit Comments"
+#~ msgstr "Klicka för att lägga till/redigera kommentarer"
+
+#~ msgid "Remote Control ID..."
+#~ msgstr "Fjärr-ID..."
+
+#~ msgid "Update available plugins"
+#~ msgstr "Uppdatera tillgängliga insticksprogram"
+
+#~ msgid "Keyboard layout:"
+#~ msgstr "Tangentbordslayout:"
+
+#~ msgid "Font scaling:"
+#~ msgstr "Typsnittskalning"
+
+#~ msgid "Double-click on a name to edit settings for an enabled protocol"
+#~ msgstr "Dubbleklicka aktiverad kontrollytas namn för inställningar"
+
+#~ msgid "Show zoom toolbar"
+#~ msgstr "Visa zoom-verktygsraden"
+
+#~ msgid "Solo / mute"
+#~ msgstr "Solo / tysta"
+
+#~ msgid "Control surface remote ID"
+#~ msgstr "Kontrollytans fjärr-ID"
+
+#~ msgid "assigned by user"
+#~ msgstr "användardefinierat"
+
+#~ msgid "follows order of mixer"
+#~ msgstr "följer mixerns ordning"
+
+#~ msgid "Trigger gap"
+#~ msgstr "Utlösningsglapp"
+
+#~ msgid "Remote Control ID"
+#~ msgstr "Fjärrstyrnings-ID"
+
+#~ msgid "Remote control ID:"
+#~ msgstr "Fjärr-ID:"
+
+#~ msgid ""
+#~ "Left-click to invert (phase reverse) channel %1 of this track.  Right-"
+#~ "click to show menu."
+#~ msgstr ""
+#~ "Vänsterklicka för att invertera (fasinvers) kanal %1 i detta spår. "
+#~ "Högerklicka för att visa menyn"
+
+#~ msgid "Dark Theme"
+#~ msgstr "Mörkt tema"
+
+#~ msgid "Light Theme"
+#~ msgstr "Ljust tema"
+
+#~ msgid "Contents:"
+#~ msgstr "Innehåll"
+
 #~ msgid ""
 #~ "%1\n"
 #~ "(built from revision %2)"
diff --git a/gtk2_ardour/po/zh.mo b/gtk2_ardour/po/zh.mo
new file mode 100644
index 0000000..2e3ac3f
Binary files /dev/null and b/gtk2_ardour/po/zh.mo differ
diff --git a/gtk2_ardour/po/zh.po b/gtk2_ardour/po/zh.po
index 32fb0c3..8b21cf0 100644
--- a/gtk2_ardour/po/zh.po
+++ b/gtk2_ardour/po/zh.po
@@ -1,275 +1,304 @@
-# Copyright (C) YEAR Free Software Foundation, Inc.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR "Paul Davis"
+# This file is distributed under the same license as the PACKAGE package.
 # FIRST AUTHOR <EMAIL at ADDRESS>, YEAR.
-# 一善鱼 YQ-YSY at 163.com 完成翻译于 2015-12-09 在 Rui-huai Zhang <zrhzrh at mail.ustc.edu.cn> 的基础上
-#
+# 一善鱼 <YQ-YSY at 163.com> 翻译于 2016-07-29
 msgid ""
 msgstr ""
-"Project-Id-Version: Ardour 3\n"
+"Project-Id-Version: Ardour 5\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-03-31 20:13-0400\n"
-"PO-Revision-Date: 2016-01-04 23:21+0800\n"
-"Last-Translator: Rui-huai Zhang <zrhzrh>\n"
-"Language-Team: zrhzrh <zrhzrh at mail.ustc.edu.cn>\n"
-"Language: zh_CN\n"
+"POT-Creation-Date: 2016-07-25 22:30+0800\n"
+"PO-Revision-Date: 2016-07-28 22:22+0800\n"
+"Last-Translator: \n"
+"Language-Team: 一善鱼 YQ-YSY at 163.com\n"
+"Language: zh\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Poedit-KeywordsList: _;gettext;gettext_noop\n"
-"X-Poedit-Basepath: ../..\n"
-"X-Poedit-SourceCharset: utf-8\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
-"X-Generator: Poedit 1.8.4\n"
-"X-Poedit-SearchPath-0: gtk2_ardour\n"
+"X-Generator: Poedit 1.8.7.1\n"
 
-#: about.cc:125
+#: about.cc:127
+msgid "Fons Adriaensen"
+msgstr ""
+
+#: about.cc:128
 msgid "Brian Ahr"
 msgstr ""
 
-#: about.cc:126
+#: about.cc:129
 msgid "John Anderson"
 msgstr ""
 
-#: about.cc:127
+#: about.cc:130
 msgid "Marcus Andersson"
 msgstr ""
 
-#: about.cc:128
+#: about.cc:131
 msgid "Nedko Arnaudov"
 msgstr ""
 
-#: about.cc:129
+#: about.cc:132
 msgid "Hans Baier"
 msgstr ""
 
-#: about.cc:130
+#: about.cc:133
 msgid "Ben Bell"
 msgstr ""
 
-#: about.cc:131
+#: about.cc:134
 msgid "Sakari Bergen"
 msgstr ""
 
-#: about.cc:132
+#: about.cc:135
 msgid "Christian Borss"
 msgstr ""
 
-#: about.cc:133
+#: about.cc:136
 msgid "Chris Cannam"
 msgstr ""
 
-#: about.cc:134
+#: about.cc:137
 msgid "Jeremy Carter"
 msgstr ""
 
-#: about.cc:135
+#: about.cc:138
 msgid "Jesse Chappell"
 msgstr ""
 
-#: about.cc:136
+#: about.cc:139
 msgid "Thomas Charbonnel"
 msgstr ""
 
-#: about.cc:137
+#: about.cc:140
 msgid "Sam Chessman"
 msgstr ""
 
-#: about.cc:138
+#: about.cc:141
 msgid "André Colomb"
 msgstr ""
 
-#: about.cc:139
+#: about.cc:142
 msgid "Paul Davis"
 msgstr ""
 
-#: about.cc:140
+#: about.cc:143
 msgid "Gerard van Dongen"
 msgstr ""
 
-#: about.cc:141
+#: about.cc:144
 msgid "John Emmas"
 msgstr ""
 
-#: about.cc:142
+#: about.cc:145
 msgid "Colin Fletcher"
 msgstr ""
 
-#: about.cc:143
+#: about.cc:146
 msgid "Dave Flick"
 msgstr ""
 
-#: about.cc:144
+#: about.cc:147
 msgid "Hans Fugal"
 msgstr ""
 
-#: about.cc:145
+#: about.cc:148
 msgid "Robin Gareus"
 msgstr ""
 
-#: about.cc:146
+#: about.cc:149
+msgid "Nil Geisweiller"
+msgstr ""
+
+#: about.cc:150
 msgid "Christopher George"
 msgstr ""
 
-#: about.cc:147
+#: about.cc:151
 msgid "Chris Goddard"
 msgstr ""
 
-#: about.cc:148
+#: about.cc:152
 msgid "J. Abelardo Gutierrez"
 msgstr ""
 
-#: about.cc:149
+#: about.cc:153
 msgid "Jeremy Hall"
 msgstr ""
 
-#: about.cc:150
+#: about.cc:154
 msgid "Audun Halland"
 msgstr ""
 
-#: about.cc:151
+#: about.cc:155
 msgid "David Halter"
 msgstr ""
 
-#: about.cc:152
+#: about.cc:156
 msgid "Steve Harris"
 msgstr ""
 
-#: about.cc:153
+#: about.cc:157
 msgid "Melvin Ray Herr"
 msgstr ""
 
-#: about.cc:154
+#: about.cc:158
 msgid "Carl Hetherington"
 msgstr ""
 
-#: about.cc:155
+#: about.cc:159
 msgid "Rob Holland"
 msgstr ""
 
-#: about.cc:156
+#: about.cc:160
 msgid "Robert Jordens"
 msgstr ""
 
-#: about.cc:157
+#: about.cc:161
 msgid "Stefan Kersten"
 msgstr ""
 
-#: about.cc:158
+#: about.cc:162
 msgid "Armand Klenk"
 msgstr ""
 
-#: about.cc:159
+#: about.cc:163
 msgid "Julien de Kozak"
 msgstr ""
 
-#: about.cc:160
+#: about.cc:164
 msgid "Matt Krai"
 msgstr ""
 
-#: about.cc:161
+#: about.cc:165
 msgid "Georg Krause"
 msgstr ""
 
-#: about.cc:162
+#: about.cc:166
 msgid "Nick Lanham"
 msgstr ""
 
-#: about.cc:163
+#: about.cc:167
 msgid "Colin Law"
 msgstr ""
 
-#: about.cc:164
+#: about.cc:168
 msgid "Joshua Leach"
 msgstr ""
 
-#: about.cc:165
+#: about.cc:169
 msgid "Ben Loftis"
 msgstr ""
 
-#: about.cc:166
+#: about.cc:170
 msgid "Nick Mainsbridge"
 msgstr ""
 
-#: about.cc:167
+#: about.cc:171
 msgid "Tim Mayberry"
 msgstr ""
 
-#: about.cc:168
+#: about.cc:172
 msgid "Doug Mclain"
 msgstr ""
 
-#: about.cc:169
+#: about.cc:173
 msgid "Todd Naugle"
 msgstr ""
 
-#: about.cc:170
+#: about.cc:174
+msgid "André Nusser"
+msgstr ""
+
+#: about.cc:175
+msgid "Bent Bisballe Nyeng"
+msgstr ""
+
+#: about.cc:176
 msgid "Jack O'Quin"
 msgstr ""
 
-#: about.cc:171
+#: about.cc:177
+msgid "Pavel Potocek"
+msgstr ""
+
+#: about.cc:178
 msgid "Nimal Ratnayake"
 msgstr ""
 
-#: about.cc:172
+#: about.cc:179
+msgid "Julien Rivaud"
+msgstr ""
+
+#: about.cc:180
 msgid "David Robillard"
 msgstr ""
 
-#: about.cc:173
+#: about.cc:181
+msgid "Julien Roger"
+msgstr ""
+
+#: about.cc:182
 msgid "Taybin Rutkin"
 msgstr ""
 
-#: about.cc:174
+#: about.cc:183
 msgid "Andreas Ruge"
 msgstr ""
 
-#: about.cc:175
+#: about.cc:184
 msgid "Sampo Savolainen"
 msgstr ""
 
-#: about.cc:176
+#: about.cc:185
 msgid "Rodrigo Severo"
 msgstr ""
 
-#: about.cc:177
+#: about.cc:186
 msgid "Per Sigmond"
 msgstr ""
 
-#: about.cc:178
+#: about.cc:187
 msgid "Lincoln Spiteri"
 msgstr ""
 
-#: about.cc:179
+#: about.cc:188
 msgid "Mike Start"
 msgstr ""
 
-#: about.cc:180
+#: about.cc:189
 msgid "Mark Stewart"
 msgstr ""
 
-#: about.cc:181
+#: about.cc:190
 msgid "Roland Stigge"
 msgstr ""
 
-#: about.cc:182
+#: about.cc:191
 msgid "Petter Sundlöf"
 msgstr ""
 
-#: about.cc:183
+#: about.cc:192
 msgid "Mike Täht"
 msgstr ""
 
-#: about.cc:184
+#: about.cc:193
 msgid "Roy Vegard"
 msgstr ""
 
-#: about.cc:185
+#: about.cc:194
 msgid "Thorsten Wilms"
 msgstr ""
 
-#: about.cc:186
+#: about.cc:195
+msgid "Damien Zammit"
+msgstr ""
+
+#: about.cc:196
 msgid "Grygorii Zharun"
 msgstr ""
 
-#: about.cc:191
+#: about.cc:201
 msgid ""
 "French:\n"
 "\tAlain Fréhel <alain.frehel at free.fr>\n"
@@ -283,7 +312,7 @@ msgstr ""
 "\tMartin Blanchard\n"
 "\tRomain Arnaud <roming22 at gmail.com>\n"
 
-#: about.cc:192
+#: about.cc:202
 msgid ""
 "German:\n"
 "\tKarsten Petersen <kapet at kapet.de>\n"
@@ -303,7 +332,7 @@ msgstr ""
 "\tRichard Oax <richard at pagliacciempire.de>\n"
 "\tRobin Gloster <robin at loc-com.de>\n"
 
-#: about.cc:199
+#: about.cc:209
 msgid ""
 "Italian:\n"
 "\tFilippo Pappalardo <filippo at email.it>\n"
@@ -313,7 +342,7 @@ msgstr ""
 "\tFilippo Pappalardo <filippo at email.it>\n"
 "\tRaffaele Morelli <raffaele.morelli at gmail.com>\n"
 
-#: about.cc:200
+#: about.cc:210
 msgid ""
 "Portuguese:\n"
 "\tRui Nuno Capela <rncbc at rncbc.org>\n"
@@ -321,7 +350,7 @@ msgstr ""
 "葡萄牙语:\n"
 "\tRui Nuno Capela <rncbc at rncbc.org>\n"
 
-#: about.cc:201
+#: about.cc:211
 msgid ""
 "Brazilian Portuguese:\n"
 "\tAlexander da Franca Fernandes <alexander at nautae.eti.br>\n"
@@ -331,7 +360,7 @@ msgstr ""
 "\tAlexander da Franca Fernandes <alexander at nautae.eti.br>\n"
 "\tChris Ross <chris at tebibyte.org>\n"
 
-#: about.cc:203
+#: about.cc:213
 msgid ""
 "Spanish:\n"
 "\t Alex Krohn <alexkrohn at fastmail.fm>\n"
@@ -341,7 +370,7 @@ msgstr ""
 "\t Alex Krohn <alexkrohn at fastmail.fm>\n"
 "\tPablo Fernández <pablo.fbus at gmail.com>\n"
 
-#: about.cc:204
+#: about.cc:214
 msgid ""
 "Russian:\n"
 "\t Igor Blinov <pitstop at nm.ru>\n"
@@ -351,7 +380,7 @@ msgstr ""
 "\t Igor Blinov <pitstop at nm.ru>\n"
 "\tAlexandre Prokoudine <alexandre.prokoudine at gmail.com>\n"
 
-#: about.cc:206
+#: about.cc:216
 msgid ""
 "Greek:\n"
 "\t Klearchos Gourgourinis <muadib at in.gr>\n"
@@ -359,7 +388,7 @@ msgstr ""
 "希腊语:\n"
 "\t Klearchos Gourgourinis <muadib at in.gr>\n"
 
-#: about.cc:207
+#: about.cc:217
 msgid ""
 "Swedish:\n"
 "\t Petter Sundlöf <petter.sundlof at gmail.com>\n"
@@ -367,7 +396,7 @@ msgstr ""
 "瑞典语:\n"
 "\t Petter Sundlöf <petter.sundlof at gmail.com>\n"
 
-#: about.cc:208
+#: about.cc:218
 msgid ""
 "Polish:\n"
 "\t Piotr Zaryk <pzaryk at gmail.com>\n"
@@ -375,7 +404,7 @@ msgstr ""
 "波兰语:\n"
 "\t Piotr Zaryk <pzaryk at gmail.com>\n"
 
-#: about.cc:209
+#: about.cc:219
 msgid ""
 "Czech:\n"
 "\t Pavel Fric <pavelfric at seznam.cz>\n"
@@ -383,239 +412,296 @@ msgstr ""
 "捷克语:\n"
 "\t Pavel Fric <pavelfric at seznam.cz>\n"
 
-#: about.cc:210
+#: about.cc:220
 msgid ""
 "Norwegian:\n"
 "\t Eivind Ødegård\n"
 msgstr ""
-"挪威语:\n"
+"挪威语\n"
 "\t Eivind Ødegård\n"
 
-#: about.cc:211
+#: about.cc:221
 msgid ""
 "Chinese:\n"
 "\t Rui-huai Zhang <zrhzrh at mail.ustc.edu.cn>\n"
 msgstr ""
 "汉语:\n"
 "\t Rui-huai Zhang <zrhzrh at mail.ustc.edu.cn>\n"
+"\t 一善鱼 YQ-YSY <yq-ysy at 163.com>\n"
+
+#: about.cc:601
+msgid "Intel 64-bit"
+msgstr "英特尔 64位"
+
+#: about.cc:603
+msgid "Intel 32-bit"
+msgstr "英特尔 32位"
+
+#: about.cc:605
+msgid "PowerPC 64-bit"
+msgstr "强力电脑 64位"
+
+#: about.cc:607
+msgid "PowerPC 32-bit"
+msgstr "强力电脑 32位"
 
-#: about.cc:591
+#: about.cc:609
+msgid "64-bit"
+msgstr "64位"
+
+#: about.cc:611
+msgid "32-bit"
+msgstr "32位"
+
+#: about.cc:619
+msgid " - debug"
+msgstr ""
+
+#: about.cc:625
 msgid "Copyright (C) 1999-2015 Paul Davis\n"
 msgstr "版权所有 (C) 1999-2015 Paul Davis\n"
 
-#: about.cc:595
+#: about.cc:629
 msgid "http://ardour.org/"
 msgstr ""
 
-#: about.cc:596
+#: about.cc:630
 msgid ""
 "%1%2\n"
-"(built from revision %3)"
+"(rev %3)\n"
+"%4%5"
 msgstr ""
-"%1%2\n"
-"(修订自版本 %3)"
 
-#: about.cc:600
+#: about.cc:635
 msgid "Config"
 msgstr "配置"
 
-#: actions.cc:85
+#: actions.cc:83
 msgid "Loading menus from %1"
-msgstr "正在载入菜单 %1"
+msgstr "正在从 %1 载入菜单"
 
-#: actions.cc:88 actions.cc:89
+#: actions.cc:86 actions.cc:87
 msgid "badly formatted menu definition file: %1"
 msgstr "带有错误格式的菜单定义文件: %1"
 
-#: actions.cc:91
+#: actions.cc:89
 msgid "%1 menu definition file not found"
-msgstr "%1 菜单定义文件未找到"
+msgstr "找不到 %1 菜单定义文件"
 
-#: actions.cc:95 actions.cc:96
+#: actions.cc:93 actions.cc:94
 msgid "%1 will not work without a valid menu definition file"
 msgstr "缺失有效的菜单定义文件将导致 %1 无法工作。"
 
-#: add_route_dialog.cc:54 route_params_ui.cc:524
-msgid "Add Track or Bus"
-msgstr "添加音轨或总线"
+#: add_route_dialog.cc:58
+msgid "Add Track/Bus/VCA"
+msgstr ""
 
-#: add_route_dialog.cc:57
+#: add_route_dialog.cc:61
 msgid "Configuration:"
-msgstr "配置:"
+msgstr "配置:"
 
-#: add_route_dialog.cc:58
+#: add_route_dialog.cc:62
 msgid "Record Mode:"
 msgstr "录制模式:"
 
-#: add_route_dialog.cc:59
+#: add_route_dialog.cc:63
 msgid "Instrument:"
 msgstr "乐器:"
 
-#: add_route_dialog.cc:77
+#: add_route_dialog.cc:77 add_route_dialog.cc:228
 msgid "Audio Tracks"
 msgstr "音频轨道"
 
-#: add_route_dialog.cc:78 add_route_dialog.cc:209
+#: add_route_dialog.cc:78 add_route_dialog.cc:224
 msgid "MIDI Tracks"
 msgstr "MIDI 轨道"
 
-#: add_route_dialog.cc:79 add_route_dialog.cc:211
+#: add_route_dialog.cc:79 add_route_dialog.cc:226
 msgid "Audio+MIDI Tracks"
 msgstr "音频+MIDI 轨道"
 
-#: add_route_dialog.cc:80 add_route_dialog.cc:207
-msgid "Busses"
-msgstr "总线"
+#: add_route_dialog.cc:80 add_route_dialog.cc:220
+msgid "Audio Busses"
+msgstr "音频总线"
+
+#: add_route_dialog.cc:81 add_route_dialog.cc:222
+msgid "MIDI Busses"
+msgstr "MIDI 总线"
 
-#: add_route_dialog.cc:83 add_route_dialog.cc:559
+#  压控放大器 Voltage Controlled Amplifier
+#: add_route_dialog.cc:82
+msgid "VCA Masters"
+msgstr "VCA 操作台"
+
+#: add_route_dialog.cc:85 add_route_dialog.cc:622
 msgid "First"
 msgstr "起始点"
 
-#: add_route_dialog.cc:84 add_route_dialog.cc:561
-msgid "After Editor Selection"
-msgstr "在编辑器已选择部分之后"
+#: add_route_dialog.cc:86 add_route_dialog.cc:626
+msgid "Before Selection"
+msgstr "已选择部分之前"
 
-#: add_route_dialog.cc:85 add_route_dialog.cc:563
-msgid "After Mixer Selection"
-msgstr "在混音器已选择部分之后"
+#: add_route_dialog.cc:87 add_route_dialog.cc:624
+msgid "After Selection"
+msgstr "已选择部分之后"
 
-#: add_route_dialog.cc:86
+#: add_route_dialog.cc:88
 msgid "Last"
 msgstr "结束点"
 
-#: add_route_dialog.cc:103
+#: add_route_dialog.cc:91
+msgid "Flexible-I/O"
+msgstr "弹性-输入/输出"
+
+#: add_route_dialog.cc:92
+msgid "Strict-I/O"
+msgstr "精确-输入/输出"
+
+#: add_route_dialog.cc:108
 msgid "Add:"
 msgstr "添加:"
 
-#: add_route_dialog.cc:116 time_fx_dialog.cc:91 add_video_dialog.cc:135
-#: video_server_dialog.cc:121
+#: add_route_dialog.cc:121 time_fx_dialog.cc:101 add_video_dialog.cc:136
+#: video_server_dialog.cc:118
 msgid "<b>Options</b>"
 msgstr "<b>选项</b>"
 
-#: add_route_dialog.cc:126 bundle_manager.cc:193 region_editor.cc:50
-#: route_group_dialog.cc:71
+#: add_route_dialog.cc:131 bundle_manager.cc:193 region_editor.cc:52
+#: route_group_dialog.cc:70
 msgid "Name:"
 msgstr "名称:"
 
-#: add_route_dialog.cc:156
+#: add_route_dialog.cc:155
 msgid "Group:"
 msgstr "分组:"
 
-#: add_route_dialog.cc:162
+#: add_route_dialog.cc:161
 msgid "Insert:"
 msgstr "插入:"
 
-#: add_route_dialog.cc:223 add_route_dialog.cc:232 add_route_dialog.cc:306
-#: ardour_ui_ed.cc:539 engine_dialog.cc:237 rc_option_editor.cc:1805
-#: rc_option_editor.cc:1807 rc_option_editor.cc:1809 rc_option_editor.cc:1827
-#: rc_option_editor.cc:1829 rc_option_editor.cc:1837 rc_option_editor.cc:1839
-#: rc_option_editor.cc:1857 rc_option_editor.cc:1870 rc_option_editor.cc:1872
-#: rc_option_editor.cc:1874 rc_option_editor.cc:1919 rc_option_editor.cc:1921
-#: rc_option_editor.cc:1923 rc_option_editor.cc:1931 rc_option_editor.cc:1939
-#: rc_option_editor.cc:1941 rc_option_editor.cc:1949
+#: add_route_dialog.cc:171
+msgid "Output Ports:"
+msgstr "输出端口:"
+
+#: add_route_dialog.cc:176 rc_option_editor.cc:2474
+msgid ""
+"With strict-i/o enabled, Effect Processors will not modify the number of "
+"channels on a track. The number of output channels will always match the "
+"number of input channels."
+msgstr ""
+"精确-输入/输出启用后,特效处理器将不会改动在一个音轨上的声道数量。输出声道的"
+"数量将总是与输入声道的数量相匹配。"
+
+#: add_route_dialog.cc:240 add_route_dialog.cc:351 ardour_ui_ed.cc:625
+#: engine_dialog.cc:244 plugin_pin_dialog.cc:67 rc_option_editor.cc:2397
+#: rc_option_editor.cc:2399 rc_option_editor.cc:2401 rc_option_editor.cc:2419
+#: rc_option_editor.cc:2421 rc_option_editor.cc:2429 rc_option_editor.cc:2432
+#: rc_option_editor.cc:2450 rc_option_editor.cc:2463 rc_option_editor.cc:2472
+#: rc_option_editor.cc:2478 rc_option_editor.cc:2480 rc_option_editor.cc:2525
+#: rc_option_editor.cc:2527 rc_option_editor.cc:2529 rc_option_editor.cc:2537
 msgid "Audio"
 msgstr "音频"
 
-#: add_route_dialog.cc:224 add_route_dialog.cc:235 add_route_dialog.cc:307
-#: editor_actions.cc:109 engine_dialog.cc:239 missing_file_dialog.cc:56
-#: rc_option_editor.cc:2084 rc_option_editor.cc:2094 rc_option_editor.cc:2102
-#: rc_option_editor.cc:2110 rc_option_editor.cc:2119 rc_option_editor.cc:2127
-#: rc_option_editor.cc:2135 rc_option_editor.cc:2143 rc_option_editor.cc:2152
-#: rc_option_editor.cc:2161 rc_option_editor.cc:2170 rc_option_editor.cc:2178
-#: rc_option_editor.cc:2186 rc_option_editor.cc:2194 rc_option_editor.cc:2217
+#: add_route_dialog.cc:243 add_route_dialog.cc:352 editor_actions.cc:112
+#: engine_dialog.cc:246 missing_file_dialog.cc:60 mixer_ui.cc:1895
+#: plugin_pin_dialog.cc:68 rc_option_editor.cc:2672 rc_option_editor.cc:2674
+#: rc_option_editor.cc:2684 rc_option_editor.cc:2693 rc_option_editor.cc:2701
+#: rc_option_editor.cc:2709 rc_option_editor.cc:2717 rc_option_editor.cc:2790
+#: rc_option_editor.cc:2813
 msgid "MIDI"
-msgstr "MIDI"
+msgstr ""
 
-#: add_route_dialog.cc:225 add_route_dialog.cc:238 add_route_dialog.cc:308
+#: add_route_dialog.cc:246 add_route_dialog.cc:353
 msgid "Audio+MIDI"
-msgstr "Audio+MIDI"
+msgstr "音频+MIDI"
 
-#: add_route_dialog.cc:226 add_route_dialog.cc:241 add_route_dialog.cc:309
+#: add_route_dialog.cc:250 add_route_dialog.cc:354
 msgid "Bus"
 msgstr "总线"
 
-#: add_route_dialog.cc:268
+#: add_route_dialog.cc:286
 msgid ""
-"Audio+MIDI tracks are intended for use <b>ONLY</b> with plugins that use both "
-"audio and MIDI input data\n"
+"Audio+MIDI tracks are intended for use <b>ONLY</b> with plugins that use "
+"both audio and MIDI input data\n"
 "\n"
-"If you do not plan to use such a plugin, then use a normal audio or MIDI track "
-"instead."
+"If you do not plan to use such a plugin, then use a normal audio or MIDI "
+"track instead."
 msgstr ""
 "音频+MIDI 轨道已经准备就绪 ,<b>但仅限于</b> 使用音频和MIDI输入数据的插件。\n"
 "\n"
 "如果您不打算使用这样一个插件,那么请使用普通的音频或MIDI轨道作为替代。"
 
-#: add_route_dialog.cc:327 add_route_dialog.cc:346 editor_actions.cc:422
-#: editor_rulers.cc:251 time_axis_view.cc:1374
+#: add_route_dialog.cc:373 add_route_dialog.cc:385 editor_actions.cc:456
+#: editor_rulers.cc:250 time_axis_view.cc:1290
 msgid "Normal"
 msgstr "普通"
 
-#: add_route_dialog.cc:330 add_route_dialog.cc:348
+#: add_route_dialog.cc:374 add_route_dialog.cc:387
 msgid "Non Layered"
 msgstr "不分层的"
 
-#: add_route_dialog.cc:331 add_route_dialog.cc:350
+#: add_route_dialog.cc:375 add_route_dialog.cc:389
 msgid "Tape"
 msgstr "磁带"
 
-#: add_route_dialog.cc:431 monitor_section.cc:290
+#: add_route_dialog.cc:476 monitor_section.cc:273 plugin_pin_dialog.cc:509
+#: plugin_setup_dialog.cc:202
 msgid "Mono"
 msgstr "单声道"
 
-#: add_route_dialog.cc:435
+#: add_route_dialog.cc:480 plugin_pin_dialog.cc:512 plugin_setup_dialog.cc:205
 msgid "Stereo"
 msgstr "双声道立体声"
 
-#: add_route_dialog.cc:459
+#: add_route_dialog.cc:503
 msgid "3 Channel"
 msgstr "三声道"
 
-#: add_route_dialog.cc:463
+#: add_route_dialog.cc:507
 msgid "4 Channel"
 msgstr "四声道"
 
-#: add_route_dialog.cc:467
+#: add_route_dialog.cc:511
 msgid "5 Channel"
 msgstr "五声道"
 
-#: add_route_dialog.cc:471
+#: add_route_dialog.cc:515
 msgid "6 Channel"
 msgstr "六声道"
 
-#: add_route_dialog.cc:475
+#: add_route_dialog.cc:519
 msgid "8 Channel"
 msgstr "八声道"
 
-#: add_route_dialog.cc:479
+#: add_route_dialog.cc:523
 msgid "12 Channel"
 msgstr "十二声道"
 
-#: add_route_dialog.cc:483 mixer_strip.cc:1836 mixer_strip.cc:2244
+#: add_route_dialog.cc:527 mixer_strip.cc:2017 mixer_strip.cc:2463
 msgid "Custom"
 msgstr "自定义"
 
-#: add_route_dialog.cc:516 add_route_dialog.cc:532 route_group_menu.cc:81
+#: add_route_dialog.cc:569 add_route_dialog.cc:585 route_group_menu.cc:85
 msgid "New Group..."
 msgstr "新建群组…"
 
-#: add_route_dialog.cc:520 route_group_menu.cc:85
+#: add_route_dialog.cc:573 route_group_menu.cc:89
 msgid "No Group"
-msgstr "没有群组"
+msgstr "无群组"
 
 #: ambiguous_file_dialog.cc:30
 msgid "Ambiguous File"
 msgstr "模糊的文件"
 
-#: ambiguous_file_dialog.cc:35
+#: ambiguous_file_dialog.cc:37
 msgid ""
 "%1 has found the file <i>%2</i> in the following places:\n"
 "\n"
 msgstr ""
-"%1 被发现位于文件 <i>%2</i> 的以下位置:\n"
+"%1 发现文件 <i>%2</i> 位于以下位置:\n"
 "\n"
 
-#: ambiguous_file_dialog.cc:44
+#: ambiguous_file_dialog.cc:46
 msgid ""
 "\n"
 "\n"
@@ -625,160 +711,230 @@ msgstr ""
 "\n"
 "请选择您想获取的文件所在的路径。"
 
-#: ambiguous_file_dialog.cc:46 missing_file_dialog.cc:46
+#: ambiguous_file_dialog.cc:48 missing_file_dialog.cc:50
 msgid "Done"
 msgstr "完成"
 
-#: analysis_window.cc:46
+#: analysis_window.cc:45
 msgid "Signal source"
 msgstr "信号源"
 
-#: analysis_window.cc:47
+#: analysis_window.cc:46
 msgid "Selected ranges"
-msgstr "选择范围"
+msgstr "已选择的范围"
 
-#: analysis_window.cc:48
+#: analysis_window.cc:47
 msgid "Selected regions"
-msgstr "选择区域"
-
-#: analysis_window.cc:50
-msgid "Display model"
-msgstr "显示模式"
-
-#: analysis_window.cc:51
-msgid "Composite graphs for each track"
-msgstr "每个音轨的合成图"
-
-#: analysis_window.cc:52
-msgid "Composite graph of all tracks"
-msgstr "所有音轨的合成图"
+msgstr "已选择的区域"
 
-#: analysis_window.cc:54
+#: analysis_window.cc:48
 msgid "Show frequency power range"
 msgstr "显示频率的功率范围"
 
-#: analysis_window.cc:55
-msgid "Normalize values"
-msgstr "规范化数值"
+#: analysis_window.cc:49
+msgid "Fit dB range"
+msgstr "适配分贝范围"
+
+#: analysis_window.cc:50
+msgid "Proportional Spectrum, -18dB"
+msgstr "比重频谱 -18dB"
 
-#: analysis_window.cc:59
+#: analysis_window.cc:53
 msgid "FFT analysis window"
-msgstr "FFT 快速傅立叶变换分析视窗"
+msgstr "FFT(快速傅立叶变换)分析视窗"
 
-#: analysis_window.cc:60 editor.cc:1823
+#: analysis_window.cc:54 editor.cc:1953
 msgid "Spectral Analysis"
 msgstr "频谱分析"
 
-#: analysis_window.cc:67 editor_actions.cc:142 export_channel_selector.cc:557
-#: session_metadata_dialog.cc:667
+#: analysis_window.cc:61 editor_actions.cc:145 session_metadata_dialog.cc:670
 msgid "Track"
 msgstr "音轨"
 
-#: analysis_window.cc:68 editor_actions.cc:648 mixer_ui.cc:131 mixer_ui.cc:1854
+#: analysis_window.cc:62 ardour_ui_ed.cc:254 ardour_ui_ed.cc:255
+#: ardour_ui_ed.cc:256 editor_actions.cc:689 mixer_ui.cc:151 mixer_ui.cc:2134
 msgid "Show"
 msgstr "显示"
 
-#: analysis_window.cc:135
+#: analysis_window.cc:107
 msgid "Re-analyze data"
 msgstr "重新分析数据"
 
-#: ardour_button.cc:887
+#: ardour_button.cc:876
 msgid "button cannot watch state of non-existing Controllable\n"
 msgstr "按钮无法显示不存在的操控状态\n"
 
-#: ardour_button.cc:1155
+#: ardour_button.cc:1144
 msgid "ABCDEFGHIJLKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
-msgstr "ABCDEFGHIJLKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
+msgstr ""
+
+# 超文本传输协议(Hyper Text Transport Protocol)
+#: ardour_http.cc:165 ardour_http.cc:179
+msgid "HTTP request failed: (%1) %2"
+msgstr "HTTP请求失败:(%1) %2"
 
-#: ardour_ui.cc:164
+#: ardour_http.cc:169 ardour_http.cc:182
+msgid "HTTP request status: %1"
+msgstr "HTTP请求状态:%1"
+
+#: ardour_ui.cc:198
 msgid ""
 "%1 %2.x has discovered configuration files from %1 %3.x.\n"
 "\n"
-"Would you like to copy the relevant files before starting to use the program?\n"
+"Would you like these files to be copied and used for %1 %2.x?\n"
 "\n"
 "(This will require you to restart %1.)"
 msgstr ""
 "%1 %2.x 发现配置文件来源于 %1 %3.x.\n"
 "\n"
-"在启用这个程序前,您打算复制关联文件吗?\n"
+"您打算复制这些文件并提供给 %1 %2.x 使用吗?\n"
 "\n"
 "(这将需要你重新启动 %1.)"
 
-#: ardour_ui.cc:211 editor_actions.cc:642 region_editor.cc:51
+#: ardour_ui.cc:283 editor_actions.cc:683 region_editor.cc:53
 msgid "Audition"
 msgstr "监听"
 
-#: ardour_ui.cc:212 editor_actions.cc:136 mixer_strip.cc:2016
-#: rc_option_editor.cc:1959 route_time_axis.cc:252 route_time_axis.cc:2711
+#: ardour_ui.cc:284 editor_actions.cc:139 mixer_strip.cc:2213
+#: monitor_section.cc:329 rc_option_editor.cc:2547 route_time_axis.cc:263
+#: route_time_axis.cc:2740 vca_master_strip.cc:212 vca_time_axis.cc:237
 msgid "Solo"
 msgstr "独奏"
 
-#: ardour_ui.cc:213 rc_option_editor.cc:741
+#: ardour_ui.cc:285 rc_option_editor.cc:1357
 msgid "Feedback"
 msgstr "反馈"
 
-#: ardour_ui.cc:219 speaker_dialog.cc:36
+#: ardour_ui.cc:296 speaker_dialog.cc:36
 msgid "Speaker Configuration"
 msgstr "扬声器配置"
 
-#: ardour_ui.cc:220 keyeditor.cc:53
-msgid "Key Bindings"
-msgstr "按键绑定"
-
-#: ardour_ui.cc:221
-msgid "Preferences"
-msgstr "首选项"
-
-#: ardour_ui.cc:222 ardour_ui.cc:229
+#: ardour_ui.cc:297
 msgid "Add Tracks/Busses"
 msgstr "添加音轨/总线"
 
-#: ardour_ui.cc:223
+#: ardour_ui.cc:298
 msgid "About"
 msgstr "关于"
 
-#: ardour_ui.cc:224 location_ui.cc:1141 session_option_editor.cc:189
-#: session_option_editor.cc:195 session_option_editor.cc:202
-msgid "Locations"
-msgstr "位置"
+#: ardour_ui.cc:299 location_ui.cc:1167
+msgid "Ranges|Locations"
+msgstr "范围|位置"
 
-#: ardour_ui.cc:225 route_params_ui.cc:59 route_params_ui.cc:630
+#: ardour_ui.cc:300 route_params_ui.cc:59 route_params_ui.cc:620
 msgid "Tracks and Busses"
 msgstr "音轨和总线"
 
-#: ardour_ui.cc:226 engine_dialog.cc:70
+#: ardour_ui.cc:301 engine_dialog.cc:73
 msgid "Audio/MIDI Setup"
 msgstr "音频/MIDI设置"
 
-#: ardour_ui.cc:227
+#: ardour_ui.cc:302
 msgid "Video Export Dialog"
 msgstr "视频导出对话框"
 
-#: ardour_ui.cc:228
+#: ardour_ui.cc:303 lua_script_manager.cc:30
+msgid "Script Manager"
+msgstr "脚本管理器"
+
+#: ardour_ui.cc:304
 msgid "Properties"
 msgstr "属性"
 
-#: ardour_ui.cc:230 bundle_manager.cc:264
+#: ardour_ui.cc:305
+msgid "Add Video"
+msgstr "添加视频"
+
+#: ardour_ui.cc:306 bundle_manager.cc:264
 msgid "Bundle Manager"
 msgstr "包裹管理器"
 
-#: ardour_ui.cc:231 big_clock_window.cc:37
+#: ardour_ui.cc:307 big_clock_window.cc:37
 msgid "Big Clock"
-msgstr "Big Clock 大计时器"
+msgstr "大计时器"
 
-#: ardour_ui.cc:232
+#: ardour_ui.cc:308
 msgid "Audio Connections"
 msgstr "音频连接"
 
-#: ardour_ui.cc:233
+#: ardour_ui.cc:309
 msgid "MIDI Connections"
-msgstr "MIDI 连接"
+msgstr "MIDI连接"
 
-#: ardour_ui.cc:242
+#: ardour_ui.cc:310
+msgid "Bindings Editor"
+msgstr "绑定编辑器"
+
+#: ardour_ui.cc:321 editor.cc:1288
+msgid "Window|Editor"
+msgstr "窗口|编辑器"
+
+#: ardour_ui.cc:322 mixer_ui.cc:2210 mixer_ui.cc:2216
+msgid "Window|Mixer"
+msgstr "窗口|混音器"
+
+#: ardour_ui.cc:323
+msgid "Window|Preferences"
+msgstr "窗口|首选项"
+
+#: ardour_ui.cc:330
 msgid "Your configuration files were copied. You can now restart %1."
-msgstr "您的配置文件已经备份完成。现在可以重新启动 %1 。"
+msgstr ""
+"Your configuration files were copied. 您的配置文件已经备份完成。You can now "
+"restart %1. 您现在可以重新启动 %1 。"
+
+#: ardour_ui.cc:509
+msgid "Pre-Release Warning"
+msgstr "预发布警告"
 
-#: ardour_ui.cc:481
+#: ardour_ui.cc:513
+msgid ""
+"<b>Welcome to this pre-release build of %1 %2</b>\n"
+"\n"
+"There are still several issues and bugs to be worked on,\n"
+"as well as general workflow improvements, before this can be considered\n"
+"release software. So, a few guidelines:\n"
+"\n"
+"1) Please do <b>NOT</b> use this software with the expectation that it is "
+"stable or reliable\n"
+"   though it may be so, depending on your workflow.\n"
+"2) Please wait for a helpful writeup of new features.\n"
+"3) <b>Please do NOT use the forums at ardour.org to report issues</b>.\n"
+"4) Please <b>DO</b> use the bugtracker at http://tracker.ardour.org/ to "
+"report issues\n"
+"   making sure to note the product version number as 5.0-pre.\n"
+"5) Please <b>DO</b> use the ardour-users mailing list to discuss ideas and "
+"pass on comments.\n"
+"6) Please <b>DO</b> join us on IRC for real time discussions about %1 %2. "
+"You\n"
+"   can get there directly from within the program via the Help->Chat menu "
+"option.\n"
+"\n"
+"Full information on all the above can be found on the support page at\n"
+"\n"
+"                http://ardour.org/support\n"
+msgstr ""
+"<b>欢迎使用预发布版本 %1 %2</b>\n"
+"\n"
+"这个版本也许仍有几处问题和故障需要完善,\n"
+"诸如在正式发布之前对通用工作流程的改进。\n"
+"以下是一些使用指南:\n"
+"\n"
+"1) 使用本软件时请 <b>不要</b> 过于期望这个版本很稳定或很可靠。\n"
+"   虽然它有可能会崩溃,但这取决于您的工作流。\n"
+"2) 请耐心等候发布关于新功能的介绍。\n"
+"3) <b>请不要使用 ardour.org 的论坛来报告错误故障。</b>.\n"
+"4) <b>请使用</b> 位于 http://tracker.ardour.org/ 的故障追踪器报告错误故障。\n"
+"   记住,请确认产品版本是 5.0-pre。\n"
+"5) <b>请使用</b> ardour-users 用户邮件列表来发布建议以及发表评论。\n"
+"6) <b>请使用</b> IRC 聊天室加入我们的关于 %1 %2 的实时讨论区。\n"
+"   您可以通过程序菜单选项里的“帮助 -> 聊天”直接访问到。\n"
+"\n"
+"还有更多的支持信息,请访问网页:\n"
+"\n"
+"                http://ardour.org/support\n"
+
+#: ardour_ui.cc:613
 msgid ""
 "The audio backend was shutdown because:\n"
 "\n"
@@ -788,7 +944,7 @@ msgstr ""
 "\n"
 "%1"
 
-#: ardour_ui.cc:483
+#: ardour_ui.cc:615
 msgid ""
 "The audio backend has either been shutdown or it\n"
 "disconnected %1 because %1\n"
@@ -797,49 +953,48 @@ msgid ""
 msgstr ""
 "音频后端要么已经关闭,\n"
 "要么它与 %1 失去了连接,\n"
-"因为 %1不够快。\n"
+"因为 %1 不够快。\n"
 "请尝试重新启动音频后端并保存会话。"
 
-#: ardour_ui.cc:507
+#: ardour_ui.cc:639
 msgid ""
-"Audio Unit Plugin Scan Failed. Automatic AU scanning has been disabled. Please see "
-"the log window for further details."
-msgstr "音频单元插件扫描失败。自动 AU 扫描已被禁用。详情请参阅日志窗口。"
+"Audio Unit Plugin Scan Failed. Automatic AU scanning has been disabled. "
+"Please see the log window for further details."
+msgstr "音频单元插件扫描失败。自动音频单元扫描已被禁用。详情请参阅日志窗口。"
 
-#: ardour_ui.cc:508
+#: ardour_ui.cc:640
 msgid "Audio Unit Plugin Scan Failed:"
 msgstr "音频单元插件扫描失败:"
 
-# NSM (network service manager)
-#: ardour_ui.cc:827
+#: ardour_ui.cc:1008
 msgid "NSM server did not announce itself"
-msgstr "NSM服务器没有表明身份"
+msgstr "NSM(网络服务管理)服务器没有表明身份"
 
-#: ardour_ui.cc:840
+#: ardour_ui.cc:1021
 msgid "NSM: no client ID provided"
-msgstr "NSM:没有提供客户机识别号"
+msgstr "NSM(网络服务管理): 没有提供客户机识别号"
 
-#: ardour_ui.cc:847
+#: ardour_ui.cc:1028
 msgid "NSM: no session created"
-msgstr "NSM:没有已创建的会话"
+msgstr "NSM(网络服务管理):没有已创建的会话"
 
-#: ardour_ui.cc:870
+#: ardour_ui.cc:1051
 msgid "NSM: initialization failed"
-msgstr "NSM:初始化失败"
+msgstr "NSM(网络服务管理):初始化失败"
 
-#: ardour_ui.cc:900
+#: ardour_ui.cc:1083
 msgid "Free/Demo Version Warning"
 msgstr "免费/演示版本的警告"
 
-#: ardour_ui.cc:902
+#: ardour_ui.cc:1085
 msgid "Subscribe and support development of %1"
-msgstr "订阅和支持发展 %1"
+msgstr "定期援助和资助发展 %1"
 
-#: ardour_ui.cc:903
+#: ardour_ui.cc:1086
 msgid "Don't warn me about this again"
 msgstr "不再提醒我这个"
 
-#: ardour_ui.cc:905
+#: ardour_ui.cc:1088
 msgid ""
 "<span weight=\"bold\" size=\"large\">%1</span>\n"
 "\n"
@@ -849,23 +1004,16 @@ msgid ""
 "\n"
 "%4"
 msgstr ""
-"<span weight=\"bold\" size=\"large\">%1</span>\n"
-"\n"
-"<b>%2</b>\n"
-"\n"
-"<i>%3</i>\n"
-"\n"
-"%4"
 
-#: ardour_ui.cc:906
+#: ardour_ui.cc:1089
 msgid "This is a free/demo version of %1"
-msgstr "这是一个免费/演示版本 %1"
+msgstr "这是 %1 的一个免费/演示版本"
 
-#: ardour_ui.cc:907
+#: ardour_ui.cc:1090
 msgid "It will not restore OR save any plugin settings"
 msgstr "它不会恢复或保存任何插件设置"
 
-#: ardour_ui.cc:908
+#: ardour_ui.cc:1091
 msgid ""
 "If you load an existing session with plugin settings\n"
 "they will not be used and will be lost."
@@ -873,55 +1021,56 @@ msgstr ""
 "如果您载入一个带有插件设置的已存在的会话\n"
 "它们将不会被采用并将会被丢失。"
 
-#: ardour_ui.cc:910 plugin_ui.cc:569
+#: ardour_ui.cc:1093 plugin_ui.cc:579
 msgid ""
 "To get full access to updates without this limitation\n"
 "consider becoming a subscriber for a low cost every month."
 msgstr ""
-"为了不受这个限制地升级而得到完整使用权,\n"
-"请考虑以每月极低的成本而成为一个用户。"
+"为了能够不受这个限制地升级而得到完整使用权,\n"
+"请考虑以每月极低的花费而成为一个定期援助者。"
 
-#: ardour_ui.cc:920
+#: ardour_ui.cc:1103
 msgid "Quit now"
 msgstr "立即退出"
 
-#: ardour_ui.cc:921
+#: ardour_ui.cc:1104
 msgid "Continue using %1"
 msgstr "继续使用 %1"
 
-#: ardour_ui.cc:954 startup.cc:345
+#: ardour_ui.cc:1135 startup.cc:349
 msgid "%1 is ready for use"
 msgstr "%1 准备就绪"
 
-#: ardour_ui.cc:996
+#: ardour_ui.cc:1185
 msgid ""
-"WARNING: Your system has a limit for maximum amount of locked memory. This might "
-"cause %1 to run out of memory before your system runs out of memory. \n"
+"WARNING: Your system has a limit for maximum amount of locked memory. This "
+"might cause %1 to run out of memory before your system runs out of memory. \n"
 "\n"
-"You can view the memory limit with 'ulimit -l', and it is normally controlled by %2"
+"You can view the memory limit with 'ulimit -l', and it is normally "
+"controlled by %2"
 msgstr ""
-"警告:您的系统有对于锁定内存的最大数量限制。这可能会在您的系统耗尽内存之前,首先导"
-"致 %1 无内存可用。\n"
+"警告:您的系统有对于锁定内存的最大数量限制。这可能会在您的系统耗尽内存之前,"
+"首先导致 %1 无内存可用。\n"
 "\n"
 "您可以使用“ulimit -l”命令来查看内存限制,通常它由 %2 来控制。"
 
-#: ardour_ui.cc:1013
+#: ardour_ui.cc:1202
 msgid "Do not show this window again"
 msgstr "不再显示此窗口"
 
-#: ardour_ui.cc:1057
+#: ardour_ui.cc:1245
 msgid "Don't quit"
 msgstr "不退出"
 
-#: ardour_ui.cc:1058
+#: ardour_ui.cc:1246
 msgid "Just quit"
-msgstr "不保存而退出"
+msgstr "只管退出"
 
-#: ardour_ui.cc:1059
+#: ardour_ui.cc:1247 ardour_ui.cc:5362
 msgid "Save and quit"
 msgstr "保存并退出"
 
-#: ardour_ui.cc:1069
+#: ardour_ui.cc:1257
 msgid ""
 "%1 was unable to save your session.\n"
 "\n"
@@ -933,13 +1082,13 @@ msgstr ""
 "\n"
 "如果您仍打算退出,\n"
 "\n"
-"请启用“不保存而退出”选项。"
+"请使用“只管退出”选项。"
 
-#: ardour_ui.cc:1119
+#: ardour_ui.cc:1307
 msgid "Unsaved Session"
-msgstr " 尚未保存的会话"
+msgstr " 未保存的会话"
 
-#: ardour_ui.cc:1140
+#: ardour_ui.cc:1328
 msgid ""
 "The session \"%1\"\n"
 "has not been saved.\n"
@@ -949,14 +1098,14 @@ msgid ""
 "\n"
 "What do you want to do?"
 msgstr ""
-"此会话 \"%1\" 尚未保存.\n"
+"此会话 \"%1\" 尚未保存。\n"
 "\n"
-"刚才所作的修改将会丢失\n"
+"刚才所作的任何修改都将会丢失,\n"
 "除非您保存它。\n"
 "\n"
 "您打算如何做?"
 
-#: ardour_ui.cc:1143
+#: ardour_ui.cc:1331
 msgid ""
 "The snapshot \"%1\"\n"
 "has not been saved.\n"
@@ -968,117 +1117,145 @@ msgid ""
 msgstr ""
 "此快照 \"%1\" 尚未保存。\n"
 "\n"
-"刚才所作的修改将会丢失\n"
+"刚才所作的任何修改都将会丢失,\n"
 "除非您保存它。\n"
 "\n"
 "您打算如何做?"
 
-#: ardour_ui.cc:1157
+#: ardour_ui.cc:1345
 msgid "Prompter"
 msgstr "提词机"
 
-#: ardour_ui.cc:1269 ardour_ui.cc:1277
+#: ardour_ui.cc:1459 ardour_ui.cc:1467
 msgid "Audio: <span foreground=\"red\">none</span>"
 msgstr "音频:<span foreground=\"red\">无</span>"
 
-#: ardour_ui.cc:1281
+#: ardour_ui.cc:1471
 #, c-format
 msgid "Audio: <span foreground=\"green\">%.1f kHz / %4.1f ms</span>"
-msgstr "音频: <span foreground=\"green\">%.1f kHz / %4.1f ms</span>"
+msgstr "音频:<span foreground=\"green\">%.1f kHz / %4.1f ms</span>"
 
-#: ardour_ui.cc:1285
+#: ardour_ui.cc:1475
 #, c-format
 msgid "Audio: <span foreground=\"green\">%<PRId64> kHz / %4.1f ms</span>"
-msgstr "音频:<span foreground=\"green\">%<PRId64> kHz / %4.1f ms</span>"
+msgstr "音频: <span foreground=\"green\">%<PRId64> kHz / %4.1f ms</span>"
 
-#: ardour_ui.cc:1303 export_video_dialog.cc:80
+#: ardour_ui.cc:1493 export_report.cc:108 export_report.cc:323
+#: export_video_dialog.cc:76
 msgid "File:"
 msgstr "文件:"
 
-#: ardour_ui.cc:1307
+#: ardour_ui.cc:1497
 msgid "BWF"
 msgstr ""
 
-#: ardour_ui.cc:1310
+#: ardour_ui.cc:1500
 msgid "WAV"
 msgstr ""
 
-#: ardour_ui.cc:1313
+#: ardour_ui.cc:1503
 msgid "WAV64"
 msgstr ""
 
-#: ardour_ui.cc:1316 session_option_editor.cc:185
+#: ardour_ui.cc:1506 session_option_editor.cc:202
 msgid "CAF"
 msgstr ""
 
-#: ardour_ui.cc:1319
+#: ardour_ui.cc:1509
 msgid "AIFF"
 msgstr ""
 
-#: ardour_ui.cc:1322
+#: ardour_ui.cc:1512
 msgid "iXML"
 msgstr ""
 
-#: ardour_ui.cc:1325
+#: ardour_ui.cc:1515 session_option_editor.cc:203
 msgid "RF64"
 msgstr ""
 
-#: ardour_ui.cc:1333
-msgid "32-float"
+#: ardour_ui.cc:1518
+msgid "RF64/WAV"
 msgstr ""
 
-#: ardour_ui.cc:1336
-msgid "24-int"
+#: ardour_ui.cc:1521
+msgid "MBWF"
 msgstr ""
 
-#: ardour_ui.cc:1339
+#: ardour_ui.cc:1529
+msgid "32-float"
+msgstr "32-浮点"
+
+#: ardour_ui.cc:1532
+msgid "24-int"
+msgstr "24-æ•´æ•°"
+
+#: ardour_ui.cc:1535
 msgid "16-int"
+msgstr "16-æ•´æ•°"
+
+#: ardour_ui.cc:1556
+#, c-format
+msgid "X: <span foreground=\"%s\">>10K</span>"
+msgstr ""
+
+#: ardour_ui.cc:1558
+#, c-format
+msgid "X: <span foreground=\"%s\">%u</span>"
 msgstr ""
 
-# DSP 数字信号处理器(Digital Signal Processor)
-#: ardour_ui.cc:1358
+#: ardour_ui.cc:1561
+#, c-format
+msgid "X: <span foreground=\"%s\">?</span>"
+msgstr ""
+
+#: ardour_ui.cc:1564
+msgid "Audio dropouts. Shift+click to reset"
+msgstr "音频漰溃。按 Shift+点击重置"
+
+#: ardour_ui.cc:1577
 #, c-format
 msgid "DSP: <span foreground=\"%s\">%5.1f%%</span>"
-msgstr "数字信号处理器: <span foreground=\"%s\">%5.1f%%</span>"
+msgstr "DSP(数字信号处理器): <span foreground=\"%s\">%5.1f%%</span>"
 
-#: ardour_ui.cc:1377
+#: ardour_ui.cc:1587
+#, c-format
+msgid "PkBld: <span foreground=\"%s\">%d</span>"
+msgstr ""
+
+#: ardour_ui.cc:1609
 #, c-format
 msgid ""
-"Buffers: <span foreground=\"green\">p:</span><span foreground=\"%s\">%<PRIu32>%%</"
-"span> <span foreground=\"green\">c:</span><span foreground=\"%s\">%<PRIu32>%%</"
-"span>"
+"Buffers: <span foreground=\"green\">p:</span><span foreground=\"%s\">"
+"%<PRIu32>%%</span> <span foreground=\"green\">c:</span><span foreground=\"%s"
+"\">%<PRIu32>%%</span>"
 msgstr ""
-"缓冲区: <span foreground=\"green\">p:</span><span foreground=\"%s\">%<PRIu32>%%</"
-"span> <span foreground=\"green\">c:</span><span foreground=\"%s\">%<PRIu32>%%</"
-"span>"
+"缓冲区: <span foreground=\"green\">p:</span><span foreground=\"%s\">"
+"%<PRIu32>%%</span> <span foreground=\"green\">c:</span><span foreground=\"%s"
+"\">%<PRIu32>%%</span>"
 
-#: ardour_ui.cc:1418
+#: ardour_ui.cc:1650
 msgid "Disk: <span foreground=\"green\">Unknown</span>"
 msgstr "硬盘: <span foreground=\"green\">Unknown</span>"
 
-#: ardour_ui.cc:1420
+#: ardour_ui.cc:1652
 msgid "Disk: <span foreground=\"green\">24hrs+</span>"
-msgstr "硬盘:<span foreground=\"green\">24hrs+</span>"
+msgstr "硬盘:<span foreground=\"green\">24小时+</span>"
 
-#: ardour_ui.cc:1438
+#: ardour_ui.cc:1670
 msgid "Disk: <span foreground=\"green\">>24 hrs</span>"
-msgstr "硬盘:<span foreground=\"green\">>24 hrs</span>"
+msgstr "硬盘:<span foreground=\"green\">>24小时</span>"
 
-#: ardour_ui.cc:1449
+#: ardour_ui.cc:1681
 #, c-format
 msgid "Disk: <span foreground=\"%s\">%02dh:%02dm:%02ds</span>"
-msgstr "硬盘:<span foreground=\"%s\">%02dh:%02dm:%02ds</span>"
+msgstr "硬盘:<span foreground=\"%s\">%02d小时:%02d分:%02d秒</span>"
 
-#: ardour_ui.cc:1475
+#: ardour_ui.cc:1707
 #, c-format
 msgid "Timecode|TC: <span foreground=\"%s\">%s</span>"
 msgstr "时间码|TC:<span foreground=\"%s\">%s</span>"
 
-#: ardour_ui.cc:1596 ardour_ui.cc:1605 session_dialog.cc:318 session_dialog.cc:323
-msgid "Recent Sessions"
-msgstr "最近的会话"
-
-#: ardour_ui.cc:1684
+#: ardour_ui.cc:1789
 msgid ""
 "%1 is not connected to any audio backend.\n"
 "You cannot open or close sessions in this condition"
@@ -1086,51 +1263,56 @@ msgstr ""
 "%1 没有连接到任何音频后端。\n"
 "在这种情况下您不能打开或关闭会话"
 
-#: ardour_ui.cc:1708
+#: ardour_ui.cc:1807
 msgid "Open Session"
 msgstr "打开会话"
 
-#: ardour_ui.cc:1733 session_dialog.cc:349 session_import_dialog.cc:170
-#: session_metadata_dialog.cc:858
+#: ardour_ui.cc:1831 session_dialog.cc:410 session_import_dialog.cc:170
+#: session_metadata_dialog.cc:861
 msgid "%1 sessions"
 msgstr "%1 会话"
 
-#: ardour_ui.cc:1770
+#: ardour_ui.cc:1879 ardour_ui.cc:1916
 msgid "You cannot add a track without a session already loaded."
-msgstr "在没有任何一个会话被载入之前,您不能添加音轨。"
+msgstr "在会话被载入之前,您不能添加音轨。"
 
-#: ardour_ui.cc:1778
+#: ardour_ui.cc:1887
 msgid "could not create %1 new mixed track"
 msgid_plural "could not create %1 new mixed tracks"
 msgstr[0] "无法创建 %1 新的混音轨道"
 
-#: ardour_ui.cc:1784 ardour_ui.cc:1845
-msgid ""
-"There are insufficient ports available\n"
-"to create a new track or bus.\n"
-"You should save %1, exit and\n"
-"restart with more ports."
-msgstr ""
-"没有足够可用的端口\n"
-"去创建一个新的音轨或总线。\n"
-"您应当保存 %1,\n"
-"退出并且带着更多的端口重新启动。"
+#: ardour_ui.cc:1924
+msgid "could not create %1 new Midi Bus"
+msgid_plural "could not create %1 new Midi Busses"
+msgstr[0] "无法创建 %1 新 MIDI 总线"
 
-#: ardour_ui.cc:1819
+#: ardour_ui.cc:1977
 msgid "You cannot add a track or bus without a session already loaded."
-msgstr "在没有任何一个会话被载入之前,您不能添加音轨或总线。"
+msgstr "在会话被载入之前,您不能添加音轨或总线。"
 
-#: ardour_ui.cc:1828
+#: ardour_ui.cc:1986
 msgid "could not create %1 new audio track"
 msgid_plural "could not create %1 new audio tracks"
 msgstr[0] "无法创建 %1 新的音频轨道"
 
-#: ardour_ui.cc:1837
+#: ardour_ui.cc:1995
 msgid "could not create %1 new audio bus"
 msgid_plural "could not create %1 new audio busses"
 msgstr[0] "无法创建 %1 新的音频总线"
 
-#: ardour_ui.cc:1990
+#: ardour_ui.cc:2020
+msgid ""
+"There are insufficient ports available\n"
+"to create a new track or bus.\n"
+"You should save %1, exit and\n"
+"restart with more ports."
+msgstr ""
+"没有足够可用的端口\n"
+"去创建一个新的音轨或总线。\n"
+"您应当保存 %1,\n"
+"退出并且带着更多的端口重新启动。"
+
+#: ardour_ui.cc:2164
 msgid ""
 "Please create one or more tracks before trying to record.\n"
 "You can do this with the \"Add Track or Bus\" option in the Session menu."
@@ -1138,59 +1320,69 @@ msgstr ""
 "在录制之前请先创建一条或多条音轨。\n"
 "您可以使用会话菜单中的“添加音轨或总线”选项来实现。"
 
-#: ardour_ui.cc:2376
-msgid "Save as..."
-msgstr "另存为…"
-
-#: ardour_ui.cc:2377 ardour_ui.cc:2456
-msgid "New session name"
-msgstr "新建快照的名称"
+#: ardour_ui.cc:2565
+#, c-format
+msgid "Copied %<PRId64> of %<PRId64>"
+msgstr "%<PRId64> 的 %<PRId64> 已复制"
 
-#: ardour_ui.cc:2379
-msgid "Take Snapshot"
-msgstr "生成快照"
+#: ardour_ui.cc:2619 save_as_dialog.cc:33
+msgid "Save As"
+msgstr "另存为"
 
-#: ardour_ui.cc:2380
-msgid "Name of new snapshot"
-msgstr "新建快照的名称"
+#: ardour_ui.cc:2647
+msgid "Save As failed: %1"
+msgstr "Save As failed: %1 另存已失败:%1"
 
-#: ardour_ui.cc:2405
+#: ardour_ui.cc:2684
 msgid ""
 "To ensure compatibility with various systems\n"
 "snapshot names may not contain a '%1' character"
 msgstr ""
 "为了确保在不同系统间的兼容性\n"
-"快照名称不能包含' % 1 '字符"
+"快照名称不能包含 '%1' 字符"
 
-#: ardour_ui.cc:2417
+#: ardour_ui.cc:2698
 msgid "Confirm Snapshot Overwrite"
 msgstr "确定覆盖快照"
 
-#: ardour_ui.cc:2418
-msgid "A snapshot already exists with that name.  Do you want to overwrite it?"
-msgstr "已存在相同名称的快照。您打算覆盖它?"
+#: ardour_ui.cc:2699
+msgid "A snapshot already exists with that name. Do you want to overwrite it?"
+msgstr "已存在一个相同名称的快照。您打算覆盖它?"
 
-#: ardour_ui.cc:2421 utils_videotl.cc:74
-msgid "Overwrite"
-msgstr "覆盖"
+#: ardour_ui.cc:2724
+msgid "Snapshot and switch"
+msgstr "快照和切换"
+
+#: ardour_ui.cc:2725 ardour_ui.cc:2776
+msgid "New session name"
+msgstr "新建会话的名称"
+
+#: ardour_ui.cc:2727
+msgid "Take Snapshot"
+msgstr "生成快照"
+
+#: ardour_ui.cc:2728
+msgid "Name of new snapshot"
+msgstr "新建快照的名称"
 
-#: ardour_ui.cc:2455
+#: ardour_ui.cc:2775
 msgid "Rename Session"
 msgstr "重命名会话"
 
-#: ardour_ui.cc:2470 ardour_ui.cc:2886 ardour_ui.cc:2924
+#: ardour_ui.cc:2790 ardour_ui.cc:3267 ardour_ui.cc:3305
 msgid ""
 "To ensure compatibility with various systems\n"
 "session names may not contain a '%1' character"
 msgstr ""
 "为了确保在不同系统间的兼容性\n"
-"会话名称不能包含' % 1 '字符"
+"会话名称不能包含 '%1' 字符"
 
-#: ardour_ui.cc:2478
-msgid "That name is already in use by another directory/folder. Please try again."
-msgstr "此名称已被另一个目录/文件夹使用。 请再尝试另一个。"
+#: ardour_ui.cc:2798
+msgid ""
+"That name is already in use by another directory/folder. Please try again."
+msgstr "此名称已被另一个目录/文件夹使用。请再尝试另一个。"
 
-#: ardour_ui.cc:2487
+#: ardour_ui.cc:2807
 msgid ""
 "Renaming this session failed.\n"
 "Things could be seriously messed up at this point"
@@ -1198,57 +1390,69 @@ msgstr ""
 "重命名会话失败.\n"
 "从现在开始事情真的将会变得很麻烦。"
 
-#: ardour_ui.cc:2602
+#: ardour_ui.cc:2923 route_ui.cc:1867
+msgid "Confirm Template Overwrite"
+msgstr "确认覆盖模板"
+
+#: ardour_ui.cc:2924 route_ui.cc:1868
+msgid "A template already exists with that name. Do you want to overwrite it?"
+msgstr "已存在一个相同名称的模板。您打算覆盖它?"
+
+#: ardour_ui.cc:2948
 msgid "Save Template"
-msgstr "保存模板..."
+msgstr "保存模板"
 
-#: ardour_ui.cc:2603
+#: ardour_ui.cc:2949
 msgid "Name for template:"
 msgstr "模板名:"
 
-#: ardour_ui.cc:2604
+#: ardour_ui.cc:2950
 msgid "-template"
 msgstr "-模板"
 
-#: ardour_ui.cc:2643
+#: ardour_ui.cc:2987
 msgid ""
 "This session\n"
 "%1\n"
 "already exists. Do you want to open it?"
 msgstr ""
-"会话\n"
+"此会话\n"
 "%1\n"
-"已存在。是否 打开它?"
+"已存在。您是否打算打开它?"
 
-#: ardour_ui.cc:2653
+#: ardour_ui.cc:2997
 msgid "Open Existing Session"
 msgstr "打开已存在的会话"
 
-#: ardour_ui.cc:2914
+#: ardour_ui.cc:3295
 msgid "There is no existing session at \"%1\""
 msgstr "在 \"%1\" 没有会话文件"
 
-#: ardour_ui.cc:3006
+#: ardour_ui.cc:3391
 msgid "Please wait while %1 loads your session"
 msgstr "请等待 %1 载入您的会话"
 
-#: ardour_ui.cc:3021
+#: ardour_ui.cc:3406
 msgid "Port Registration Error"
 msgstr "端口注册错误"
 
-#: ardour_ui.cc:3022
+#: ardour_ui.cc:3407
 msgid "Click the Close button to try again."
-msgstr "请单击关闭按钮,再尝试一遍"
+msgstr "请单击关闭按钮,再尝试一遍。"
 
-#: ardour_ui.cc:3043
-msgid "Session \"%1 (snapshot %2)\" did not load successfully"
-msgstr "会话  \"%1 (快照 %2)\" 载入失败"
+#: ardour_ui.cc:3426
+msgid "Session \"%1 (snapshot %2)\" did not load successfully: %3"
+msgstr "会话  \"%1(快照 %2)\" 载入失败:%3"
 
-#: ardour_ui.cc:3049
+#: ardour_ui.cc:3432 ardour_ui.cc:3453 ardour_ui.cc:3548 ardour_ui.cc:3557
 msgid "Loading Error"
 msgstr "载入错误"
 
-#: ardour_ui.cc:3068
+#: ardour_ui.cc:3447
+msgid "Session \"%1 (snapshot %2)\" did not load successfully"
+msgstr "会话  \"%1(快照 %2)\" 载入失败"
+
+#: ardour_ui.cc:3475
 msgid ""
 "This session has been opened in read-only mode.\n"
 "\n"
@@ -1258,24 +1462,59 @@ msgstr ""
 "\n"
 "您不能录制或者保存。"
 
-#: ardour_ui.cc:3073
+#: ardour_ui.cc:3480
 msgid "Read-only Session"
 msgstr "只读会话"
 
-#: ardour_ui.cc:3139
+#: ardour_ui.cc:3547
+msgid "Could not create session in \"%1\": %2"
+msgstr "在 \"%1\" 里无法创建会话:%2"
+
+#: ardour_ui.cc:3556
 msgid "Could not create session in \"%1\""
 msgstr "在 \"%1\" 无法创建会话"
 
-#: ardour_ui.cc:3288
+#: ardour_ui.cc:3601
+msgid ""
+"<b>Just ask and wait for an answer.\n"
+"It may take from minutes to hours.</b>"
+msgstr ""
+"<b>只管提问并等待回答。\n"
+"这也许要花几分钟到几小时不等。</b>"
+
+#: ardour_ui.cc:3603
+msgid "About the Chat"
+msgstr "关于聊天"
+
+#: ardour_ui.cc:3604
+msgid ""
+"When you're inside the chat just ask your question and wait for an answer. "
+"The chat is occupied by real people with real lives so many of them are "
+"passively online and might not read your question before minutes or hours "
+"later.\n"
+"So please be patient and wait for an answer.\n"
+"\n"
+"You should just leave the chat window open and check back regularly until "
+"someone has answered your question."
+msgstr ""
+"当您进入聊天室后,只需提出您的问题然后等待回答即可。聊天室里的人都是真实生活"
+"存在的真人,因此他们中的许多人不一定常常在线, 但他们或迟或早都将会看到您的问"
+"题。\n"
+"请耐心等待回答。\n"
+"\n"
+"您可以开着这个聊天窗口去做其它事情,然后时不时回来看看是否有人回答了您的问"
+"题。"
+
+#: ardour_ui.cc:3723
 msgid "No files were ready for clean-up"
 msgstr "没有可以清空的文件"
 
-#: ardour_ui.cc:3292 ardour_ui.cc:3302 ardour_ui.cc:3435 ardour_ui.cc:3442
-#: ardour_ui_ed.cc:103
+#: ardour_ui.cc:3727 ardour_ui.cc:3737 ardour_ui.cc:3870 ardour_ui.cc:3877
+#: ardour_ui_ed.cc:129
 msgid "Clean-up"
 msgstr "清空"
 
-#: ardour_ui.cc:3293
+#: ardour_ui.cc:3728
 msgid ""
 "If this seems suprising, \n"
 "check for any existing snapshots.\n"
@@ -1284,22 +1523,22 @@ msgid ""
 msgstr ""
 "如果这情况看起来有点异常,\n"
 "请检查任何已存在的快照。\n"
-"它们也许仍包括有某些范围\n"
-" 需要继续保留某些未使用的文件。"
+"它们也许仍包括有那些\n"
+"需要继续保留某些未使用文件的区域。"
 
-#: ardour_ui.cc:3352
+#: ardour_ui.cc:3787
 msgid "kilo"
 msgstr "千"
 
-#: ardour_ui.cc:3355
+#: ardour_ui.cc:3790
 msgid "mega"
 msgstr "兆(百万)"
 
-#: ardour_ui.cc:3358
+#: ardour_ui.cc:3793
 msgid "giga"
 msgstr "十亿(千兆)"
 
-#: ardour_ui.cc:3363
+#: ardour_ui.cc:3798
 msgid ""
 "The following file was deleted from %2,\n"
 "releasing %3 %4bytes of disk space"
@@ -1310,7 +1549,7 @@ msgstr[0] ""
 "以下 %1 文件被从 %2 删除,\n"
 "释放 %3 %4 字节的磁盘空间"
 
-#: ardour_ui.cc:3370
+#: ardour_ui.cc:3805
 msgid ""
 "The following file was not in use and \n"
 "has been moved to: %2\n"
@@ -1331,96 +1570,140 @@ msgid_plural ""
 "will release an additional %3 %4bytes of disk space.\n"
 msgstr[0] ""
 "以下 %1 文件未被使用\n"
-"并且被移动到: %2  \n"
+"并且已被移动到: %2  \n"
+"\n"
+"After a restart of %5 在重新启动 %5 之后\n"
+"\n"
+"<span face=\"mono\">Session 会话 -> Clean-up 清除 -> Flush Wastebasket 清空回"
+"收站</span>\n"
 "\n"
+"will release an additional %3 %4bytes of disk space. 将会释放额外的 %3 %4 字"
+"节硬盘空间。\n"
 
-#: ardour_ui.cc:3430
+#: ardour_ui.cc:3865
 msgid "Are you sure you want to clean-up?"
 msgstr "您确认要清空?"
 
-#: ardour_ui.cc:3437
+#: ardour_ui.cc:3872
 msgid ""
 "Clean-up is a destructive operation.\n"
 "ALL undo/redo information will be lost if you clean-up.\n"
 "Clean-up will move all unused files to a \"dead\" location."
 msgstr ""
-"清空是毁灭性的操作。\n"
+"清空是破坏性的操作。\n"
 "如果你清空了, 所有的撤销/重做信息将会丢失。\n"
 "清空将会把所有未使用过的文件移动到 \"死亡\" 位置。"
 
-#: ardour_ui.cc:3445
+#: ardour_ui.cc:3880
 msgid "CleanupDialog"
 msgstr "清空对话框"
 
-#: ardour_ui.cc:3475
+#: ardour_ui.cc:3910
 msgid "Cleaned Files"
-msgstr "清除文件"
+msgstr "已清除的文件"
 
-#: ardour_ui.cc:3492
+#: ardour_ui.cc:3927
 msgid "deleted file"
-msgstr "删除文件"
+msgstr "已删除的文件"
+
+#: ardour_ui.cc:4133
+msgid "Cannot read session script '%1': %2"
+msgstr "无法读取会话脚本 '%1': %2"
+
+#: ardour_ui.cc:4142 luainstance.cc:1104
+msgid "Set Script Parameters"
+msgstr "设置脚本首选项"
+
+#: ardour_ui.cc:4153
+msgid "Session script '%1' instantiation failed: %2"
+msgstr "会话脚本 '%1' 实例化失败: %2"
 
-#: ardour_ui.cc:3637
+#: ardour_ui.cc:4157
+msgid "Loading Session script '%1' failed: %2"
+msgstr "载入会话脚本 '%1' 失败:%2"
+
+#: ardour_ui.cc:4170
+msgid "There are no active Lua session scripts present in this session."
+msgstr "在本会话中没有活动的 Lua 会话脚本呈现"
+
+#: ardour_ui.cc:4187
+msgid "Session script '%1' removal failed: %2"
+msgstr "会话脚本 '%1' 移除失败:%2"
+
+#: ardour_ui.cc:4197
 msgid "Video-Server was not launched by %1. The request to stop it is ignored."
-msgstr "视频服务器未被 %1 触发。请求停止视频服务器的要求被忽略。"
+msgstr "视频服务器未被 %1 触发。请求停止视频服务器的要求已被忽略。"
 
-#: ardour_ui.cc:3641
+#: ardour_ui.cc:4201
 msgid "Stop Video-Server"
 msgstr "停止视频服务器"
 
-#: ardour_ui.cc:3642
+#: ardour_ui.cc:4202
 msgid "Do you really want to stop the Video Server?"
 msgstr "您真的打算停止视频服务器?"
 
-#: ardour_ui.cc:3645
+#: ardour_ui.cc:4205
 msgid "Yes, Stop It"
 msgstr "是的,停止它"
 
-#: ardour_ui.cc:3671
+#: ardour_ui.cc:4231
 msgid "The Video Server is already started."
 msgstr "视频服务器已经启动。"
 
-#: ardour_ui.cc:3673
+#: ardour_ui.cc:4233
 msgid ""
-"An external Video Server is configured and can be reached. Not starting a new "
-"instance."
-msgstr "一个外部视频服务器已经配置且可以实现。尚未启动一个新的实例。"
+"An external Video Server is configured and can be reached. Not starting a "
+"new instance."
+msgstr "一个外部视频服务器已经配置且可以访问到。尚未启动一个新的实例。"
 
-#: ardour_ui.cc:3681 ardour_ui.cc:3786
+#: ardour_ui.cc:4241 ardour_ui.cc:4346
 msgid ""
-"Could not connect to the Video Server. Start it or configure its access URL in "
-"Preferences."
-msgstr "无法连接到视频服务器。请启动或者配置视频服务器的访问URL网址首选项。"
+"Could not connect to the Video Server. Start it or configure its access URL "
+"in Preferences."
+msgstr ""
+"无法连接到视频服务器。请启动视频服务器或者配置视频服务器首选项里的访问网址。"
 
-#: ardour_ui.cc:3711
+#: ardour_ui.cc:4271
 msgid "Specified docroot is not an existing directory."
-msgstr "指定的文档根目录不存在。"
+msgstr "指定的文档根不是一个已存在的目录。"
 
-#: ardour_ui.cc:3717 ardour_ui.cc:3723
+#: ardour_ui.cc:4277 ardour_ui.cc:4283
 msgid "Given Video Server is not an executable file."
 msgstr "给定的视频服务器不是一个可执行文件。"
 
-#: ardour_ui.cc:3757
+#: ardour_ui.cc:4317
 msgid "Cannot launch the video-server"
 msgstr "无法启动视频服务器"
 
-#: ardour_ui.cc:3767
+#: ardour_ui.cc:4327
 msgid "Video-server was started but does not respond to requests..."
-msgstr "视频服务器已经启动但没有响应请求……"
+msgstr "视频服务器已经启动但没有响应请求…"
 
-#: ardour_ui.cc:3812 editor_audio_import.cc:641
+#: ardour_ui.cc:4372 editor_audio_import.cc:647
 msgid "could not open %1"
-msgstr "无法打开%1"
+msgstr "无法打开 %1"
 
-#: ardour_ui.cc:3816
+#: ardour_ui.cc:4376
 msgid "no video-file selected"
 msgstr "尚未选择视频文件"
 
-#: ardour_ui.cc:4014
+#: ardour_ui.cc:4472
+msgid "No LTC detected, video will not be aligned."
+msgstr "检测不到 LTC(纵向时间码),视频将无法对齐。"
+
+#: ardour_ui.cc:4478
+msgid "Align video-start to %1 [samples]"
+msgstr "对齐视频起点到 %1 [样本]"
+
+#: ardour_ui.cc:4654
+msgid "xrun"
+msgstr ""
+
+#: ardour_ui.cc:4663
 msgid "Recording was stopped because your system could not keep up."
-msgstr "由于您的系统无法继续工作导致录制停止。"
+msgstr "录制停止,因为您的系统无法持续跟进。"
 
-#: ardour_ui.cc:4043
+#: ardour_ui.cc:4692
 msgid ""
 "The disk system on your computer\n"
 "was not able to keep up with %1.\n"
@@ -1434,23 +1717,23 @@ msgstr ""
 "确切地说,失败的原因是硬盘的写入速度\n"
 "不足以持续跟上录制的速度。\n"
 
-#: ardour_ui.cc:4113
+#: ardour_ui.cc:4765
 msgid "Scanning for plugins"
 msgstr "正在扫描插件"
 
-#: ardour_ui.cc:4115
+#: ardour_ui.cc:4767
 msgid "Cancel plugin scan"
 msgstr "取消插件扫描"
 
-#: ardour_ui.cc:4124
+#: ardour_ui.cc:4776
 msgid "Stop Timeout"
 msgstr "停止超时"
 
-#: ardour_ui.cc:4131
+#: ardour_ui.cc:4783
 msgid "Scan Timeout"
 msgstr "扫描超时"
 
-#: ardour_ui.cc:4174
+#: ardour_ui.cc:4827
 msgid ""
 "The disk system on your computer\n"
 "was not able to keep up with %1.\n"
@@ -1464,11 +1747,11 @@ msgstr ""
 "确切地说,失败的原因是硬盘的读取速度\n"
 "不足以持续跟上回放的速度。\n"
 
-#: ardour_ui.cc:4214
+#: ardour_ui.cc:4862
 msgid "Crash Recovery"
 msgstr "崩溃恢复"
 
-#: ardour_ui.cc:4215
+#: ardour_ui.cc:4863
 msgid ""
 "This session appears to have been in the\n"
 "middle of recording when %1 or\n"
@@ -1479,26 +1762,26 @@ msgid ""
 "what you would like to do.\n"
 msgstr ""
 "本会话似乎是一直处在\n"
-"录制的中段,当 %1 时\n"
-"或者在计算机关闭时。\n"
+"录制的中段,\n"
+"当 %1 或者计算机关闭时。\n"
 "\n"
 " %1 可以为您恢复任何已捕获的音频,\n"
 "或者忽略它。\n"
-"请确认您的决定。\n"
+"请确认您打算做什么。\n"
 
-#: ardour_ui.cc:4227
+#: ardour_ui.cc:4875
 msgid "Ignore crash data"
 msgstr "忽略崩溃的数据"
 
-#: ardour_ui.cc:4228
+#: ardour_ui.cc:4876
 msgid "Recover from crash"
 msgstr "恢复到崩溃前"
 
-#: ardour_ui.cc:4248
+#: ardour_ui.cc:4896
 msgid "Sample Rate Mismatch"
 msgstr "采样率不匹配"
 
-#: ardour_ui.cc:4249
+#: ardour_ui.cc:4897
 msgid ""
 "This session was created with a sample rate of %1 Hz, but\n"
 "%2 is currently running at %3 Hz.  If you load this session,\n"
@@ -1508,23 +1791,29 @@ msgstr ""
 "但是 %2 目前运行在 %3 Hz。如果您加载这个会话,\n"
 "音频可能会处在错误的采样率上播放。\n"
 
-#: ardour_ui.cc:4258
+#: ardour_ui.cc:4906
 msgid "Do not load session"
 msgstr "不要载入会话"
 
-#: ardour_ui.cc:4259
+#: ardour_ui.cc:4907
 msgid "Load session anyway"
 msgstr "只管载入会话"
 
-#: ardour_ui.cc:4286
-msgid "Could not disconnect from Audio/MIDI engine"
-msgstr "无法从音频/MIDI引擎上取消连接"
-
-#: ardour_ui.cc:4303 ardour_ui.cc:4306
-msgid "Could not reconnect to the Audio/MIDI engine"
-msgstr "无法重新连接到音频/MIDI引擎"
+#: ardour_ui.cc:4927
+msgid ""
+"This session was created with a sample rate of %1 Hz, but\n"
+"%2 is currently running at %3 Hz.\n"
+"Audio will be recorded and played at the wrong sample rate.\n"
+"Re-Configure the Audio Engine in\n"
+"Menu > Window > Audio/Midi Setup"
+msgstr ""
+"本会话创建于 %1 Hz 的采样率,\n"
+"但 %2  当前运行于 %3 Hz。\n"
+"音频将被录制和回放于错误的采样率。\n"
+"重新配置音频引擎请点击菜单\n"
+"菜单 > 窗口 > 音频/Midi设置"
 
-#: ardour_ui.cc:4590
+#: ardour_ui.cc:5209
 msgid ""
 "%4This is a session from an older version of %3%5\n"
 "\n"
@@ -1536,61 +1825,86 @@ msgid ""
 "\n"
 "%6%2%7\n"
 "\n"
-"From now on, use the -2000 version with older versions of %3"
+"From now on, use the backup copy with older versions of %3"
 msgstr ""
-"%4 这是一个来源于 %3%5 旧版本的会话\n"
+"%4这是个来自 %3%5 旧版本的会话\n"
 "\n"
-"%3 已经被复制到旧的会话文件\n"
+"%3 已经复制旧会话文件\n"
 "\n"
 "%6%1%7\n"
 "\n"
-"to\n"
+"到\n"
 "\n"
 "%6%2%7\n"
 "\n"
-"从现在开始,使用连带旧版 %3 的 -2000 版本"
+"从现在开始,使用 %3 的旧版本备份副本"
 
-#: ardour_ui2.cc:73
-msgid "UI: cannot setup editor"
-msgstr "用户界面:无法设置编辑器"
+#: ardour_ui.cc:5331
+msgid "This is a free/demo copy of %1. It has just switched to silent mode."
+msgstr "这是 %1 的一个免费/演示副本。它仅能切换到无声模式。"
 
-#: ardour_ui2.cc:78
-msgid "UI: cannot setup mixer"
-msgstr "用户界面:无法设置混音器"
+#: ardour_ui.cc:5337
+msgid "%1 is now silent"
+msgstr "%1 现在无声"
 
-#: ardour_ui2.cc:83
-msgid "UI: cannot setup meterbridge"
-msgstr "用户界面:无法设置节拍桥接"
+#: ardour_ui.cc:5339
+msgid ""
+"Please consider paying for a copy of %1 - you can pay whatever you want."
+msgstr "请考虑为 %1 付费购买一个副本 - 您可以支付任意金额。"
+
+#: ardour_ui.cc:5340
+msgid "Better yet become a subscriber - subscriptions start at US$1 per month."
+msgstr "最好是成为定期资助者 - 捐献的起点是每个月一美元。"
+
+#: ardour_ui.cc:5341
+msgid "Pay for a copy (via the web)"
+msgstr "付费购买一个副本(通过网络)"
 
-#: ardour_ui2.cc:128
+#: ardour_ui.cc:5342
+msgid "Become a subscriber (via the web)"
+msgstr "成为定期资助者(通过网络)"
+
+#: ardour_ui.cc:5361
+msgid "Remain silent"
+msgstr "保持无声"
+
+#: ardour_ui.cc:5363
+msgid "Give me more time"
+msgstr "给我更多的时间"
+
+#: ardour_ui.cc:5656
+msgid "Global keybindings are missing"
+msgstr "缺失全局按键绑定"
+
+#: ardour_ui2.cc:79
 msgid "Play from playhead"
 msgstr "从指针开始播放"
 
-#: ardour_ui2.cc:129
+#: ardour_ui2.cc:80
 msgid "Stop playback"
 msgstr "停止回放"
 
-#: ardour_ui2.cc:130
+#: ardour_ui2.cc:81
 msgid "Toggle record"
 msgstr "切换录制"
 
-#: ardour_ui2.cc:131
+#: ardour_ui2.cc:82
 msgid "Play range/selection"
 msgstr "播放范围/已选择部分"
 
-#: ardour_ui2.cc:132
+#: ardour_ui2.cc:83
 msgid "Go to start of session"
 msgstr "转至会话起点"
 
-#: ardour_ui2.cc:133
+#: ardour_ui2.cc:84
 msgid "Go to end of session"
 msgstr "转至会话终点"
 
-#: ardour_ui2.cc:134
+#: ardour_ui2.cc:85
 msgid "Play loop range"
 msgstr "播放循环范围"
 
-#: ardour_ui2.cc:135
+#: ardour_ui2.cc:86
 msgid ""
 "MIDI Panic\n"
 "Send note off and reset controller messages on all MIDI channels"
@@ -1598,511 +1912,622 @@ msgstr ""
 "MIDI 终止\n"
 "发送音符关闭和复位控制器信息到所有 MIDI 通道"
 
-#: ardour_ui2.cc:136
+#: ardour_ui2.cc:87
 msgid "Return to last playback start when stopped"
 msgstr "当停止时返回至最后一次回放的起点"
 
-#: ardour_ui2.cc:137
-msgid "Playhead follows Range Selections and Edits"
+#: ardour_ui2.cc:88
+msgid "Playhead follows range selections and edits"
 msgstr "指针跟随范围已选择部分并编辑"
 
-#: ardour_ui2.cc:138
+#: ardour_ui2.cc:89
 msgid "Be sensible about input monitoring"
 msgstr "确保清晰的输入监控"
 
-#: ardour_ui2.cc:139
+#: ardour_ui2.cc:90
 msgid "Enable/Disable audio click"
 msgstr "启用/禁用音频识别声(节拍器) "
 
-#: ardour_ui2.cc:140 monitor_section.cc:111
+#: ardour_ui2.cc:91 monitor_section.cc:129
 msgid ""
 "When active, something is soloed.\n"
 "Click to de-solo everything"
 msgstr ""
 "启用时,仅独奏某部分。\n"
-"Click to de-solo everything 点击全部不独奏"
+"点击全部不独奏"
 
-#: ardour_ui2.cc:141
+#: ardour_ui2.cc:92
 msgid ""
-"When active, auditioning is taking place\n"
+"When active, auditioning is taking place.\n"
 "Click to stop the audition"
 msgstr ""
-"当启用时监听开始.\n"
-"点击停止监听."
+"启用时,监听就绪。\n"
+"点击停止监听"
 
-#: ardour_ui2.cc:142
+#: ardour_ui2.cc:93
 msgid "When active, there is a feedback loop."
-msgstr "启用时,有一个反馈回路。"
+msgstr "启用时,这是一个反馈循环。"
 
-#: ardour_ui2.cc:143
+#: ardour_ui2.cc:94
 msgid ""
-"<b>Primary Clock</b> right-click to set display mode. Click to edit, click+drag a "
-"digit or mouse-over+scroll wheel to modify.\n"
-"Text edits: right-to-left overwrite <tt>Esc</tt>: cancel; <tt>Enter</tt>: confirm; "
-"postfix the edit with '+' or '-' to enter delta times.\n"
+"<b>Primary Clock</b> right-click to set display mode. Click to edit, click"
+"+drag a digit or mouse-over+scroll wheel to modify.\n"
+"Text edits: right-to-left overwrite <tt>Esc</tt>: cancel; <tt>Enter</tt>: "
+"confirm; postfix the edit with '+' or '-' to enter delta times.\n"
 msgstr ""
-"<b>主计时器</b>右键点击设置显示模式。点击即可编辑,点击+拖动数字或者鼠标放在数字上"
-"面滚动滚轮即可修改数字。\n"
-"文本编辑:从右到左覆盖 <tt>Esc 键</tt>:取消; <tt>回车键</tt>:确认;编辑后加"
-"上“+”号或者“-”号即可进入下一级时间\n"
+"<b>主计时器</b>右键点击设置显示模式。点击即可编辑,点击+拖动数字或者鼠标放在"
+"数字上面滚动滚轮即可修改数字。\n"
+"文本编辑:从右到左覆盖 <tt>Esc 键</tt>:取消; <tt>回车键</tt>:确认;编辑后"
+"加上“+”号或者“-”号即可进入下一级时间。\n"
 
-#: ardour_ui2.cc:144
+#: ardour_ui2.cc:95
 msgid ""
-"<b>Secondary Clock</b> right-click to set display mode. Click to edit, click+drag "
-"a digit or mouse-over+scroll wheel to modify.\n"
-"Text edits: right-to-left overwrite <tt>Esc</tt>: cancel; <tt>Enter</tt>: confirm; "
-"postfix the edit with '+' or '-' to enter delta times.\n"
+"<b>Secondary Clock</b> right-click to set display mode. Click to edit, click"
+"+drag a digit or mouse-over+scroll wheel to modify.\n"
+"Text edits: right-to-left overwrite <tt>Esc</tt>: cancel; <tt>Enter</tt>: "
+"confirm; postfix the edit with '+' or '-' to enter delta times.\n"
 msgstr ""
-"<b>第二计时器</b>右键点击设置显示模式。点击即可编辑,点击+拖动数字或者鼠标放在数字"
-"上面滚动滚轮即可修改数字。\n"
-"文本编辑:从右到左覆盖 <tt>Esc 键</tt>:取消; <tt>回车键</tt>:确认;编辑后加"
-"上“+”号或者“-”号即可进入下一级时间\n"
+"<b>第二计时器</b>右键点击设置显示模式。点击即可编辑,点击+拖动数字或者鼠标放"
+"在数字上面滚动滚轮即可修改数字。\n"
+"文本编辑:从右到左覆盖 <tt>Esc 键</tt>:取消; <tt>回车键</tt>:确认;编辑后"
+"加上“+”号或者“-”号即可进入下一级时间。\n"
 
-#: ardour_ui2.cc:145
+#: ardour_ui2.cc:96
 msgid "Reset All Peak Indicators"
 msgstr "重置所有峰值指标"
 
-#: ardour_ui2.cc:146
+#: ardour_ui2.cc:97
 msgid "Show Error Log and acknowledge warnings"
 msgstr "显示错误日志并确认警报"
 
-#: ardour_ui2.cc:179
+#: ardour_ui2.cc:130
 msgid "[ERROR]: "
-msgstr "【错误】:"
+msgstr "[错误]:"
 
-#: ardour_ui2.cc:182
+#: ardour_ui2.cc:133
 msgid "[WARNING]: "
-msgstr "【警告】:"
+msgstr "[警告]:"
 
-#: ardour_ui2.cc:185
+#: ardour_ui2.cc:136
 msgid "[INFO]: "
-msgstr "【信息】:"
+msgstr "[信息]:"
 
-#: ardour_ui2.cc:253 ardour_ui_ed.cc:403
+#: ardour_ui2.cc:197 ardour_ui_ed.cc:509
 msgid "Auto Return"
 msgstr "自动返回"
 
-#: ardour_ui2.cc:255 ardour_ui_ed.cc:406
+#: ardour_ui2.cc:199 ardour_ui_ed.cc:512
 msgid "Follow Edits"
 msgstr "跟随编辑"
 
-# GUI - Graphical User Interface
-#: ardour_ui2.cc:716 rc_option_editor.cc:2300
+#: ardour_ui2.cc:422 ardour_ui2.cc:426 ardour_ui2.cc:430
+msgid ""
+"Drag this tab to the desktop to show %1 in its own window\n"
+"\n"
+"To put the window back, use the Window > %1 > Attach menu action"
+msgstr ""
+"拖拽这个标签页到桌面即可让 %1 以独立窗口显示\n"
+"\n"
+"若要把窗口放回原位,使用菜单栏的 窗口 >  %1 > 附加菜单操作"
+
+#: ardour_ui2.cc:638
 msgid "GUI"
-msgstr "图形用户界面"
-
-#: ardour_ui2.cc:733 rc_option_editor.cc:1309 rc_option_editor.cc:1327
-#: rc_option_editor.cc:1330 rc_option_editor.cc:1332 rc_option_editor.cc:1334
-#: rc_option_editor.cc:1342 rc_option_editor.cc:1350 rc_option_editor.cc:1352
-#: rc_option_editor.cc:1360 rc_option_editor.cc:1367 rc_option_editor.cc:1376
-#: rc_option_editor.cc:1378 rc_option_editor.cc:1380 rc_option_editor.cc:1388
-#: rc_option_editor.cc:1390 rc_option_editor.cc:1399 session_option_editor.cc:321
-#: session_option_editor.cc:323 session_option_editor.cc:344
-#: session_option_editor.cc:346 session_option_editor.cc:348
-#: session_option_editor.cc:355 session_option_editor.cc:362
-#: session_option_editor.cc:366
+msgstr "GUI(图形用户界面)"
+
+#: ardour_ui2.cc:651 rc_option_editor.cc:1874 rc_option_editor.cc:1892
+#: rc_option_editor.cc:1895 rc_option_editor.cc:1897 rc_option_editor.cc:1899
+#: rc_option_editor.cc:1907 rc_option_editor.cc:1909 rc_option_editor.cc:1917
+#: rc_option_editor.cc:1925 rc_option_editor.cc:1932 rc_option_editor.cc:1953
+#: rc_option_editor.cc:1955 rc_option_editor.cc:1964
+#: session_option_editor.cc:342 session_option_editor.cc:344
+#: session_option_editor.cc:365 session_option_editor.cc:367
+#: session_option_editor.cc:369 session_option_editor.cc:376
+#: session_option_editor.cc:383 session_option_editor.cc:387
 msgid "Misc"
 msgstr "杂项"
 
-#: ardour_ui_dependents.cc:76
+#: ardour_ui_dependents.cc:118
 msgid "Setup Editor"
 msgstr "设置编辑器"
 
-#: ardour_ui_dependents.cc:78
+#: ardour_ui_dependents.cc:120
 msgid "Setup Mixer"
 msgstr "设置混音器"
 
-#: ardour_ui_dependents.cc:84
+#: ardour_ui_dependents.cc:127
 msgid "Reload Session History"
-msgstr "重新装摘会话历史"
+msgstr "重新载入会话历史"
 
-#: ardour_ui_dialogs.cc:250
+#: ardour_ui_dependents.cc:248
+msgid "UI: cannot setup editor"
+msgstr "UI(用户界面):无法设置编辑器"
+
+#: ardour_ui_dependents.cc:253
+msgid "UI: cannot setup mixer"
+msgstr "UI(用户界面):无法设置混音器"
+
+#: ardour_ui_dependents.cc:258
+msgid "UI: cannot setup meterbridge"
+msgstr "UI(用户界面):无法设置节拍桥接"
+
+#: ardour_ui_dependents.cc:263
+msgid "UI: cannot setup luawindow"
+msgstr "UI(用户界面):无法设置 lua 窗口"
+
+#: ardour_ui_dependents.cc:269 ardour_ui_ed.cc:136 ardour_ui_ed.cc:257
+#: rc_option_editor.cc:1853 rc_option_editor.cc:3494
+msgid "Preferences"
+msgstr "首选项"
+
+#: ardour_ui_dependents.cc:270 ardour_ui_ed.cc:134 mixer_ui.cc:100
+#: mixer_ui.cc:410
+msgid "Mixer"
+msgstr "混音器"
+
+#: ardour_ui_dependents.cc:271 ardour_ui_ed.cc:135 editor.cc:5790
+#: editor.cc:6062 public_editor.cc:34 rc_option_editor.cc:2201
+#: rc_option_editor.cc:2215 rc_option_editor.cc:2219 rc_option_editor.cc:2227
+#: rc_option_editor.cc:2236 rc_option_editor.cc:2244 rc_option_editor.cc:2253
+#: rc_option_editor.cc:2261 rc_option_editor.cc:2269 rc_option_editor.cc:2279
+#: rc_option_editor.cc:2281 rc_option_editor.cc:2305 rc_option_editor.cc:2317
+#: rc_option_editor.cc:2328 rc_option_editor.cc:2346
+msgid "Editor"
+msgstr "编辑器"
+
+#: ardour_ui_dialogs.cc:263
 msgid "Don't close"
-msgstr "请勿关闭"
+msgstr "不关闭"
 
-#: ardour_ui_dialogs.cc:251
+#: ardour_ui_dialogs.cc:264
 msgid "Just close"
 msgstr "只管关闭"
 
-#: ardour_ui_dialogs.cc:252
+#: ardour_ui_dialogs.cc:265
 msgid "Save and close"
 msgstr "保存并关闭"
 
-#: ardour_ui_dialogs.cc:362
-msgid "This screen is not tall enough to display the mixer window"
-msgstr "这个屏幕的高度不足以显示混音器窗口"
+#: ardour_ui_ed.cc:124
+msgid "Escape"
+msgstr "取消"
 
-#: ardour_ui_ed.cc:102
+#: ardour_ui_ed.cc:128
 msgid "Session"
 msgstr "会话"
 
-#: ardour_ui_ed.cc:105 editor_actions.cc:138 editor_regions.cc:116 port_group.cc:458
-#: session_option_editor.cc:82 session_option_editor.cc:89
+#: ardour_ui_ed.cc:131 editor_actions.cc:141 editor_regions.cc:163
+#: port_group.cc:469 session_option_editor.cc:82 session_option_editor.cc:89
 msgid "Sync"
 msgstr "同步"
 
-#: ardour_ui_ed.cc:106
+#: ardour_ui_ed.cc:132
 msgid "Options"
 msgstr "选项"
 
-#: ardour_ui_ed.cc:107
+#: ardour_ui_ed.cc:133
 msgid "Window"
 msgstr "窗口"
 
-#: ardour_ui_ed.cc:108
+#: ardour_ui_ed.cc:137 ardour_ui_ed.cc:267 ardour_ui_ed.cc:268
+#: ardour_ui_ed.cc:269
+msgid "Detach"
+msgstr "分离"
+
+#: ardour_ui_ed.cc:138
 msgid "Help"
 msgstr "帮助"
 
-#: ardour_ui_ed.cc:109
+#: ardour_ui_ed.cc:139
 msgid "Misc. Shortcuts"
-msgstr "杂项、 快捷键"
+msgstr "杂项. 快捷键"
 
-#: ardour_ui_ed.cc:110
+#: ardour_ui_ed.cc:140
 msgid "Audio File Format"
 msgstr "音频文件格式"
 
-#: ardour_ui_ed.cc:111
+#: ardour_ui_ed.cc:141
 msgid "File Type"
 msgstr "文件类型"
 
-#: ardour_ui_ed.cc:112 export_format_dialog.cc:67
+#: ardour_ui_ed.cc:142 export_format_dialog.cc:75
 msgid "Sample Format"
-msgstr "采样格式"
+msgstr "样本格式"
 
-#: ardour_ui_ed.cc:113 rc_option_editor.cc:2245 rc_option_editor.cc:2257
+#: ardour_ui_ed.cc:143 rc_option_editor.cc:2841
 msgid "Control Surfaces"
 msgstr "控制面"
 
-#: ardour_ui_ed.cc:114 rc_option_editor.cc:1921 rc_option_editor.cc:2264
+#: ardour_ui_ed.cc:144 rc_option_editor.cc:2847 rc_option_editor.cc:2853
+#: rc_option_editor.cc:2862 rc_option_editor.cc:2873 rc_option_editor.cc:2883
+#: rc_option_editor.cc:2948 rc_option_editor.cc:2969 rc_option_editor.cc:2985
+#: rc_option_editor.cc:2986 rc_option_editor.cc:2995 rc_option_editor.cc:3009
+#: rc_option_editor.cc:3012 rc_option_editor.cc:3020 rc_option_editor.cc:3028
 msgid "Plugins"
 msgstr "插件"
 
-#: ardour_ui_ed.cc:115 rc_option_editor.cc:2351
+#: ardour_ui_ed.cc:145 rc_option_editor.cc:3176
 msgid "Metering"
-msgstr "节拍"
+msgstr "计量"
 
-#: ardour_ui_ed.cc:116
+#: ardour_ui_ed.cc:146
 msgid "Fall Off Rate"
 msgstr "衰减率"
 
-#: ardour_ui_ed.cc:117
+#: ardour_ui_ed.cc:147
 msgid "Hold Time"
 msgstr "持续时间"
 
-#: ardour_ui_ed.cc:118
+#: ardour_ui_ed.cc:148
 msgid "Denormal Handling"
-msgstr "非常规处理"
+msgstr "非常规处理中"
 
-#: ardour_ui_ed.cc:122 route_time_axis.cc:1677
+#: ardour_ui_ed.cc:152 route_time_axis.cc:1683
 msgid "New..."
 msgstr "新建…"
 
-#: ardour_ui_ed.cc:124
+#: ardour_ui_ed.cc:154
 msgid "Open..."
 msgstr "打开…"
 
-#: ardour_ui_ed.cc:125
+#: ardour_ui_ed.cc:155
 msgid "Recent..."
 msgstr "最近的…"
 
-#: ardour_ui_ed.cc:126 panner_editor.cc:29 playlist_selector.cc:64
+#: ardour_ui_ed.cc:156 panner_editor.cc:29 playlist_selector.cc:64
 msgid "Close"
 msgstr "关闭"
 
-#: ardour_ui_ed.cc:129
+#: ardour_ui_ed.cc:159
 msgid "Add Track or Bus..."
 msgstr "添加音轨或总线…"
 
-#: ardour_ui_ed.cc:134
-msgid "Open Video"
-msgstr "打开视频"
+#: ardour_ui_ed.cc:163
+msgid "Duplicate Tracks/Busses..."
+msgstr "复制音轨或总线…"
+
+#: ardour_ui_ed.cc:169
+msgid "Cancel Solo"
+msgstr "取消独奏"
 
-#: ardour_ui_ed.cc:137
+#: ardour_ui_ed.cc:173
+msgid "Session|Scripting"
+msgstr "会话|脚本"
+
+#: ardour_ui_ed.cc:176
+msgid "Add Lua Script..."
+msgstr "添加 Lua 脚本…"
+
+#: ardour_ui_ed.cc:180
+msgid "Remove Lua Script"
+msgstr "移除 Lua 脚本"
+
+#: ardour_ui_ed.cc:184
+msgid "Open Video..."
+msgstr "打开视频…"
+
+#: ardour_ui_ed.cc:187
 msgid "Remove Video"
 msgstr "移除视频"
 
-#: ardour_ui_ed.cc:140
-msgid "Export To Video File"
-msgstr "导出为视频文件"
+#: ardour_ui_ed.cc:190
+msgid "Export to Video File..."
+msgstr "导出到视频文件…"
+
+#: ardour_ui_ed.cc:194
+msgid "Snapshot (& keep working on current version) ..."
+msgstr "快照(并且继续在当前版本工作)…"
 
-#: ardour_ui_ed.cc:144
-msgid "Snapshot..."
-msgstr "快照…"
+#: ardour_ui_ed.cc:197
+msgid "Snapshot (& switch to new version) ..."
+msgstr "快照(并且切换到新版本)…"
 
-#: ardour_ui_ed.cc:148
+#: ardour_ui_ed.cc:200
+msgid "Quick Snapshot (& keep working on current version) ..."
+msgstr "快速快照 (并保持工作在当前版本)…"
+
+#: ardour_ui_ed.cc:203
+msgid "Quick Snapshot (& switch to new version) ..."
+msgstr "快速快照(并且切换到新版本)…"
+
+#: ardour_ui_ed.cc:207
 msgid "Save As..."
 msgstr "另存为…"
 
-#: ardour_ui_ed.cc:152 editor_actions.cc:1771 editor_markers.cc:903
-#: editor_snapshots.cc:124 mixer_strip.cc:1518 route_time_axis.cc:1673
+#: ardour_ui_ed.cc:210 editor_actions.cc:1788 editor_markers.cc:908
+#: editor_snapshots.cc:136 mixer_strip.cc:1661 route_time_axis.cc:1679
 msgid "Rename..."
 msgstr "重命名…"
 
-#: ardour_ui_ed.cc:156
+#: ardour_ui_ed.cc:214
 msgid "Save Template..."
 msgstr "保存模板…"
 
-#: ardour_ui_ed.cc:159
+#: ardour_ui_ed.cc:217
 msgid "Metadata"
 msgstr "元数据"
 
-#: ardour_ui_ed.cc:162
+#: ardour_ui_ed.cc:220
 msgid "Edit Metadata..."
 msgstr "编辑元数据…"
 
-#: ardour_ui_ed.cc:165
+#: ardour_ui_ed.cc:223
 msgid "Import Metadata..."
 msgstr "导入元数据…"
 
-#: ardour_ui_ed.cc:168
-msgid "Export To Audio File(s)..."
+#: ardour_ui_ed.cc:226
+msgid "Export to Audio File(s)..."
 msgstr "导出为音频文件…"
 
-#: ardour_ui_ed.cc:171
+#: ardour_ui_ed.cc:229
 msgid "Stem export..."
 msgstr "主体导出…"
 
-#: ardour_ui_ed.cc:174 editor_export_audio.cc:65 export_dialog.cc:129
-#: export_video_dialog.cc:84
+#: ardour_ui_ed.cc:232 editor_export_audio.cc:66 export_channel_selector.cc:190
+#: export_channel_selector.cc:578 export_dialog.cc:136
+#: export_video_dialog.cc:80
 msgid "Export"
 msgstr "导出"
 
-#: ardour_ui_ed.cc:177
+#: ardour_ui_ed.cc:235
 msgid "Clean-up Unused Sources..."
 msgstr "清空未使用的源…"
 
-#: ardour_ui_ed.cc:181
+#: ardour_ui_ed.cc:239
+msgid "Reset Peak Files"
+msgstr "重置峰值文件"
+
+#: ardour_ui_ed.cc:243
 msgid "Flush Wastebasket"
 msgstr "清空回收站"
 
-#: ardour_ui_ed.cc:188
+#: ardour_ui_ed.cc:251
 msgid "Quit"
 msgstr "退出"
 
-#: ardour_ui_ed.cc:192
+#: ardour_ui_ed.cc:252 ardour_ui_ed.cc:259 ardour_ui_ed.cc:260
+#: ardour_ui_ed.cc:261 automation_time_axis.cc:545 editor_actions.cc:686
+#: editor_markers.cc:907 location_ui.cc:61 plugin_selector.cc:97
+#: route_time_axis.cc:864
+msgid "Hide"
+msgstr "隐藏"
+
+#: ardour_ui_ed.cc:263 ardour_ui_ed.cc:264 ardour_ui_ed.cc:265
+msgid "Attach"
+msgstr "附加"
+
+#: ardour_ui_ed.cc:275 ardour_ui_ed.cc:276 ardour_ui_ed.cc:277
+#: ardour_ui_ed.cc:283 ardour_ui_ed.cc:284 ardour_ui_ed.cc:285
+msgid "Change"
+msgstr "改变"
+
+#: ardour_ui_ed.cc:287
+msgid "Previous Tab"
+msgstr "上一个标签页"
+
+#: ardour_ui_ed.cc:288
+msgid "Next Tab"
+msgstr "下一个标签页"
+
+#: ardour_ui_ed.cc:290
+msgid "Toggle Editor & Mixer"
+msgstr "切换编辑器和混音器"
+
+#: ardour_ui_ed.cc:294
 msgid "Maximise Editor Space"
 msgstr "最大化编辑器空间"
 
-#: ardour_ui_ed.cc:193
+#: ardour_ui_ed.cc:295
 msgid "Maximise Mixer Space"
 msgstr "最大化混音器空间"
 
-#: ardour_ui_ed.cc:194
-msgid "Show Toolbars"
-msgstr "显示工具栏"
+#: ardour_ui_ed.cc:298
+msgid "Toggle Mixer List"
+msgstr "切换混音器列表"
 
-#: ardour_ui_ed.cc:198
-msgid "Show more UI preferences"
-msgstr "显示更多用户界面首选项"
+#: ardour_ui_ed.cc:301
+msgid "Toggle Monitor Section Visibility"
+msgstr "Toggle Monitor Section Visibility 切换监控部分可见"
 
-#: ardour_ui_ed.cc:200 mixer_ui.cc:1924 mixer_ui.cc:1930
-msgid "Window|Mixer"
-msgstr "窗口|混音器"
+#: ardour_ui_ed.cc:305
+msgid "Show more UI preferences"
+msgstr "显示更多UI(用户界面)首选项"
 
-#: ardour_ui_ed.cc:201
-msgid "Toggle Editor+Mixer"
-msgstr "切换编辑器+混音器"
+#: ardour_ui_ed.cc:308
+msgid "Window|Scripting"
+msgstr "窗口|脚本"
 
-#: ardour_ui_ed.cc:202 meterbridge.cc:218 meterbridge.cc:224
+#: ardour_ui_ed.cc:309 meterbridge.cc:214 meterbridge.cc:220
 msgid "Window|Meterbridge"
 msgstr "窗口|节拍桥接"
 
-#: ardour_ui_ed.cc:204
-msgid "Reattach All Tearoffs"
-msgstr "重新附加所有的片段"
-
-#: ardour_ui_ed.cc:206 midi_tracer.cc:45
+#: ardour_ui_ed.cc:311 midi_tracer.cc:45
 msgid "MIDI Tracer"
-msgstr "MIDI 音轨"
+msgstr "MIDI 追踪器"
 
-#: ardour_ui_ed.cc:208
+#: ardour_ui_ed.cc:314
 msgid "Chat"
 msgstr "聊天"
 
-#: ardour_ui_ed.cc:210
+#: ardour_ui_ed.cc:316
 msgid "Help|Manual"
 msgstr "帮助|手册"
 
-#: ardour_ui_ed.cc:211
-msgid "Reference"
-msgstr "参考"
+#: ardour_ui_ed.cc:317
+msgid "Manual|Reference"
+msgstr "手册|参考"
 
-#: ardour_ui_ed.cc:212
-msgid "Report A Bug"
-msgstr "报告故障"
+#: ardour_ui_ed.cc:318
+msgid "Report a Bug"
+msgstr "报告一个故障"
 
-#: ardour_ui_ed.cc:213
+#: ardour_ui_ed.cc:319
 msgid "Cheat Sheet"
 msgstr "备忘录"
 
-#: ardour_ui_ed.cc:214
+#: ardour_ui_ed.cc:320
 msgid "Ardour Website"
 msgstr "Ardour 官网"
 
-#: ardour_ui_ed.cc:215
+#: ardour_ui_ed.cc:321
 msgid "Ardour Development"
 msgstr "Ardour 开发 "
 
-#: ardour_ui_ed.cc:216
+#: ardour_ui_ed.cc:322
 msgid "User Forums"
 msgstr "用户论坛"
 
-#: ardour_ui_ed.cc:217
-msgid "How to report a bug"
-msgstr "如何报告故障"
+#: ardour_ui_ed.cc:323
+msgid "How to Report a Bug"
+msgstr "如何报告一个故障"
 
-#: ardour_ui_ed.cc:219 plugin_ui.cc:419
+#: ardour_ui_ed.cc:325 luawindow.cc:100 luawindow.cc:654 plugin_ui.cc:419
 msgid "Save"
 msgstr "保存"
 
-#: ardour_ui_ed.cc:227 rc_option_editor.cc:1419 rc_option_editor.cc:1430
-#: rc_option_editor.cc:1441 rc_option_editor.cc:1450 rc_option_editor.cc:1463
-#: rc_option_editor.cc:1476 rc_option_editor.cc:1485 rc_option_editor.cc:1495
-#: rc_option_editor.cc:1497 rc_option_editor.cc:1506 rc_option_editor.cc:1522
-#: rc_option_editor.cc:1543 rc_option_editor.cc:1561 rc_option_editor.cc:1563
-#: rc_option_editor.cc:1579 rc_option_editor.cc:1582 rc_option_editor.cc:1584
-#: rc_option_editor.cc:1601 rc_option_editor.cc:1612
+#: ardour_ui_ed.cc:333 rc_option_editor.cc:1975 rc_option_editor.cc:1986
+#: rc_option_editor.cc:1997 rc_option_editor.cc:2008 rc_option_editor.cc:2017
+#: rc_option_editor.cc:2030 rc_option_editor.cc:2043 rc_option_editor.cc:2052
+#: rc_option_editor.cc:2062 rc_option_editor.cc:2079 rc_option_editor.cc:2186
 msgid "Transport"
 msgstr "播送"
 
-#: ardour_ui_ed.cc:233
+#: ardour_ui_ed.cc:339 engine_dialog.cc:88
 msgid "Stop"
 msgstr "停止"
 
-#: ardour_ui_ed.cc:236
+#: ardour_ui_ed.cc:342
 msgid "Roll"
 msgstr "滚动"
 
-#: ardour_ui_ed.cc:240 ardour_ui_ed.cc:243
+#: ardour_ui_ed.cc:346 ardour_ui_ed.cc:349
 msgid "Start/Stop"
 msgstr "开始/停止"
 
-#: ardour_ui_ed.cc:246
+#: ardour_ui_ed.cc:352
 msgid "Start/Continue/Stop"
 msgstr "开始/继续/停止"
 
-#: ardour_ui_ed.cc:249
+#: ardour_ui_ed.cc:355
 msgid "Stop and Forget Capture"
 msgstr "暂停并且废弃已捕获内容"
 
-#: ardour_ui_ed.cc:259
-msgid "Transition To Roll"
+#: ardour_ui_ed.cc:365
+msgid "Transition to Roll"
 msgstr "过渡到滚动"
 
-#: ardour_ui_ed.cc:263
-msgid "Transition To Reverse"
+#: ardour_ui_ed.cc:369
+msgid "Transition to Reverse"
 msgstr "过渡到反向"
 
-#: ardour_ui_ed.cc:267
+#: ardour_ui_ed.cc:373
 msgid "Play Loop Range"
 msgstr "循环播放范围"
 
-#: ardour_ui_ed.cc:270
+#: ardour_ui_ed.cc:376
 msgid "Play Selection"
 msgstr "播放已选择部分"
 
-#: ardour_ui_ed.cc:273
+#: ardour_ui_ed.cc:379
 msgid "Play Selection w/Preroll"
 msgstr "播放已选择部分预滚"
 
-#: ardour_ui_ed.cc:277
+#: ardour_ui_ed.cc:383
 msgid "Enable Record"
 msgstr "启用录制"
 
-#: ardour_ui_ed.cc:280 ardour_ui_ed.cc:284
+#: ardour_ui_ed.cc:386 ardour_ui_ed.cc:390
 msgid "Start Recording"
-msgstr "开始录制"
+msgstr "开始录制中"
 
-#: ardour_ui_ed.cc:288
+#: ardour_ui_ed.cc:394
 msgid "Rewind"
 msgstr "倒带"
 
-#: ardour_ui_ed.cc:291
+#: ardour_ui_ed.cc:397
 msgid "Rewind (Slow)"
 msgstr "倒带(慢速)"
 
-#: ardour_ui_ed.cc:294
+#: ardour_ui_ed.cc:400
 msgid "Rewind (Fast)"
 msgstr "倒带(快速)"
 
-#: ardour_ui_ed.cc:297
+#: ardour_ui_ed.cc:403
 msgid "Forward"
 msgstr "å¿«è¿›"
 
-#: ardour_ui_ed.cc:300
+#: ardour_ui_ed.cc:406
 msgid "Forward (Slow)"
 msgstr "快进(慢速)"
 
-#: ardour_ui_ed.cc:303
+#: ardour_ui_ed.cc:409
 msgid "Forward (Fast)"
 msgstr "快进(快速)"
 
-#: ardour_ui_ed.cc:306
+#: ardour_ui_ed.cc:412
 msgid "Go to Zero"
-msgstr "转到零点"
+msgstr "转至零点"
 
-#: ardour_ui_ed.cc:309 ardour_ui_ed.cc:312
+#: ardour_ui_ed.cc:415 ardour_ui_ed.cc:418
 msgid "Go to Start"
-msgstr "转到起始位置"
+msgstr "转至起点"
 
-#: ardour_ui_ed.cc:315
+#: ardour_ui_ed.cc:421
 msgid "Go to End"
-msgstr "转到末尾位置"
+msgstr "转至终点"
 
-#: ardour_ui_ed.cc:318
+#: ardour_ui_ed.cc:424
 msgid "Go to Wall Clock"
-msgstr "转到计时点"
+msgstr "转至计时点"
 
-#: ardour_ui_ed.cc:323 ardour_ui_ed.cc:326
+#: ardour_ui_ed.cc:429 ardour_ui_ed.cc:432
 msgid "Numpad Decimal"
 msgstr "数字键盘十进制"
 
-#: ardour_ui_ed.cc:329
+#: ardour_ui_ed.cc:435
 msgid "Numpad 0"
 msgstr "数字键盘 0"
 
-#: ardour_ui_ed.cc:332
+#: ardour_ui_ed.cc:438
 msgid "Numpad 1"
 msgstr "数字键盘 1"
 
-#: ardour_ui_ed.cc:335
+#: ardour_ui_ed.cc:441
 msgid "Numpad 2"
 msgstr "数字键盘 2"
 
-#: ardour_ui_ed.cc:338
+#: ardour_ui_ed.cc:444
 msgid "Numpad 3"
 msgstr "数字键盘 3"
 
-#: ardour_ui_ed.cc:341
+#: ardour_ui_ed.cc:447
 msgid "Numpad 4"
 msgstr "数字键盘 4"
 
-#: ardour_ui_ed.cc:344
+#: ardour_ui_ed.cc:450
 msgid "Numpad 5"
 msgstr "数字键盘 5"
 
-#: ardour_ui_ed.cc:347
+#: ardour_ui_ed.cc:453
 msgid "Numpad 6"
 msgstr "数字键盘 6"
 
-#: ardour_ui_ed.cc:350
+#: ardour_ui_ed.cc:456
 msgid "Numpad 7"
 msgstr "数字键盘 7"
 
-#: ardour_ui_ed.cc:353
+#: ardour_ui_ed.cc:459
 msgid "Numpad 8"
 msgstr "数字键盘 8"
 
-#: ardour_ui_ed.cc:356
+#: ardour_ui_ed.cc:462
 msgid "Numpad 9"
 msgstr "数字键盘 9"
 
-#: ardour_ui_ed.cc:360
+#: ardour_ui_ed.cc:466
 msgid "Focus On Clock"
 msgstr "聚焦于计时器"
 
-#: ardour_ui_ed.cc:364 ardour_ui_ed.cc:373 audio_clock.cc:2091 editor.cc:258
-#: editor_actions.cc:569 editor_actions.cc:578 export_timespan_selector.cc:88
+#: ardour_ui_ed.cc:470 ardour_ui_ed.cc:479 audio_clock.cc:2122 editor.cc:321
+#: editor_actions.cc:610 editor_actions.cc:619 export_timespan_selector.cc:95
 #: session_option_editor.cc:41 session_option_editor.cc:61
 #: session_option_editor.cc:80 session_option_editor.cc:96
 #: session_option_editor.cc:109 session_option_editor.cc:122
@@ -2110,125 +2535,137 @@ msgstr "聚焦于计时器"
 msgid "Timecode"
 msgstr "时间码"
 
-#: ardour_ui_ed.cc:366 ardour_ui_ed.cc:375 editor_actions.cc:567
+#: ardour_ui_ed.cc:472 ardour_ui_ed.cc:481 editor_actions.cc:608
 msgid "Bars & Beats"
 msgstr "小节 & 拍子"
 
-#: ardour_ui_ed.cc:368 ardour_ui_ed.cc:377
+#: ardour_ui_ed.cc:474 ardour_ui_ed.cc:483
 msgid "Minutes & Seconds"
-msgstr "分&秒"
+msgstr "分 & 秒"
 
-#: ardour_ui_ed.cc:370 ardour_ui_ed.cc:379 audio_clock.cc:2095 editor.cc:259
-#: editor_actions.cc:568
+#: ardour_ui_ed.cc:476 ardour_ui_ed.cc:485 audio_clock.cc:2125 editor.cc:322
+#: editor_actions.cc:609
 msgid "Samples"
-msgstr "采样"
+msgstr "样本"
 
-#: ardour_ui_ed.cc:382
+#: ardour_ui_ed.cc:488
 msgid "Punch In"
 msgstr "切入"
 
-#: ardour_ui_ed.cc:383 mixer_strip.cc:1819 mixer_strip.cc:1843 mixer_strip.cc:2007
-#: route_ui.cc:162 time_info_box.cc:116
+#: ardour_ui_ed.cc:489 mixer_strip.cc:2000 mixer_strip.cc:2201 route_ui.cc:187
+#: time_info_box.cc:110
 msgid "In"
 msgstr "å…¥"
 
-#: ardour_ui_ed.cc:386
+#: ardour_ui_ed.cc:492
 msgid "Punch Out"
 msgstr "切出"
 
-#: ardour_ui_ed.cc:387 mixer_strip.cc:1831 time_info_box.cc:117
+#: ardour_ui_ed.cc:493 mixer_strip.cc:2012 time_info_box.cc:111
 msgid "Out"
 msgstr "出"
 
-#: ardour_ui_ed.cc:390
+#: ardour_ui_ed.cc:496
 msgid "Punch In/Out"
 msgstr "切入/切出"
 
-#: ardour_ui_ed.cc:391
+#: ardour_ui_ed.cc:497
 msgid "In/Out"
 msgstr "入/出"
 
-#: ardour_ui_ed.cc:394 rc_option_editor.cc:1376
+#: ardour_ui_ed.cc:500 rc_option_editor.cc:1941
 msgid "Click"
-msgstr "点击"
+msgstr "识别声(节拍器)"
 
-#: ardour_ui_ed.cc:397
+#: ardour_ui_ed.cc:503
 msgid "Auto Input"
 msgstr "自动输入"
 
-#: ardour_ui_ed.cc:400
+#: ardour_ui_ed.cc:506
 msgid "Auto Play"
 msgstr "自动播放"
 
-#: ardour_ui_ed.cc:411
+#: ardour_ui_ed.cc:517
 msgid "Sync Startup to Video"
 msgstr "同步启动到视频"
 
-#: ardour_ui_ed.cc:413
+#: ardour_ui_ed.cc:519
 msgid "Time Master"
 msgstr "计时器主控"
 
-#: ardour_ui_ed.cc:420
+#: ardour_ui_ed.cc:521
+msgid "Use External Positional Sync Source"
+msgstr "使用外部位置同步源"
+
+#: ardour_ui_ed.cc:526
 msgid "Toggle Record Enable Track %1"
 msgstr "切换录制可用音轨 %1"
 
-#: ardour_ui_ed.cc:427
+#: ardour_ui_ed.cc:533
 msgid "Percentage"
 msgstr "百分比"
 
-#: ardour_ui_ed.cc:428 shuttle_control.cc:178
+#: ardour_ui_ed.cc:534 shuttle_control.cc:205
 msgid "Semitones"
 msgstr "半音"
 
-#: ardour_ui_ed.cc:432
+#: ardour_ui_ed.cc:538
 msgid "Send MTC"
-msgstr "发送MTC"
+msgstr "发送端 MTC(MIDI时间码)"
 
-#: ardour_ui_ed.cc:434
+#: ardour_ui_ed.cc:540
 msgid "Send MMC"
-msgstr "发送MMC"
+msgstr "发送端 MMC(MIDI时间控制)"
 
-#: ardour_ui_ed.cc:436
+#: ardour_ui_ed.cc:542
 msgid "Use MMC"
-msgstr "使用MMC"
+msgstr "使用(MIDI时间控制)"
 
-#: ardour_ui_ed.cc:438 rc_option_editor.cc:2097
+#: ardour_ui_ed.cc:544 rc_option_editor.cc:2730
 msgid "Send MIDI Clock"
-msgstr "发送MIDI计时器"
+msgstr "发送端 MIDI 计时器"
 
-#: ardour_ui_ed.cc:440
+#: ardour_ui_ed.cc:546
 msgid "Send MIDI Feedback"
-msgstr "发送MIDI反馈"
+msgstr "发送端 MIDI 反馈"
 
-#: ardour_ui_ed.cc:446
+#: ardour_ui_ed.cc:552
 msgid "Panic"
 msgstr "终止"
 
-#: ardour_ui_ed.cc:534
+#: ardour_ui_ed.cc:618
 msgid "Wall Clock"
 msgstr "计时点"
 
-#: ardour_ui_ed.cc:536
+#: ardour_ui_ed.cc:620
 msgid "Disk Space"
 msgstr "硬盘空间"
 
-#: ardour_ui_ed.cc:537
+#: ardour_ui_ed.cc:621
 msgid "DSP"
-msgstr "数字信号处理"
+msgstr "DSP(数字信号处理)"
 
-#: ardour_ui_ed.cc:538
+#: ardour_ui_ed.cc:622
+msgid "X-run"
+msgstr "X-run(X-运行)"
+
+#: ardour_ui_ed.cc:623
+msgid "Active Peak-file Work"
+msgstr "激活峰值文件工作"
+
+#: ardour_ui_ed.cc:624
 msgid "Buffers"
 msgstr "缓冲"
 
-#: ardour_ui_ed.cc:540
+#: ardour_ui_ed.cc:626
 msgid "Timecode Format"
-msgstr " 时间码格式"
+msgstr "时间码格式"
 
-#: ardour_ui_ed.cc:541
+#: ardour_ui_ed.cc:627
 msgid "File Format"
 msgstr "文件格式"
 
-#: ardour_ui_options.cc:63
+#: ardour_ui_options.cc:55
 msgid ""
 "It is not possible to use JACK as the the sync source\n"
 "when the pull up/down setting is non-zero."
@@ -2236,133 +2673,142 @@ msgstr ""
 "当拖动上/下的设置为非零时,\n"
 "不可能使用JACK作为同步源。"
 
-#: ardour_ui_options.cc:317
+#: ardour_ui_options.cc:309
 msgid "Internal"
 msgstr "内部的"
 
-#: ardour_ui_options.cc:498
+#: ardour_ui_options.cc:518
 msgid "Enable/Disable external positional sync"
 msgstr "启用/禁用外部位置同步"
 
-#: ardour_ui_options.cc:500
+#: ardour_ui_options.cc:520
 msgid "Sync to JACK is not possible: video pull up/down is set"
-msgstr "不可能同步JACK:视频拖动上/下当前设置"
+msgstr "不可能同步JACK:已设置视频拖动上/下"
 
-#: audio_clock.cc:1047 audio_clock.cc:1066
+#: audio_clock.cc:1057 audio_clock.cc:1076
 msgid "--pending--"
 msgstr "—搁置—"
 
-#: audio_clock.cc:1118
+#: audio_clock.cc:1128
 msgid "SR"
 msgstr ""
 
-#: audio_clock.cc:1124 audio_clock.cc:1128
+#: audio_clock.cc:1134 audio_clock.cc:1138
 msgid "Pull"
 msgstr "拖动"
 
-#: audio_clock.cc:1126
+#: audio_clock.cc:1136
 #, c-format
 msgid "%+.4f%%"
-msgstr "%+.4f%%"
+msgstr ""
 
-#: audio_clock.cc:1282 editor.cc:260 editor_actions.cc:139 editor_actions.cc:561
+#: audio_clock.cc:1292 editor.cc:323 editor_actions.cc:142
+#: editor_actions.cc:602
 msgid "Tempo"
 msgstr "节奏"
 
-#: audio_clock.cc:1286 editor.cc:261 editor_actions.cc:562
+#: audio_clock.cc:1296 editor.cc:324 editor_actions.cc:603
 msgid "Meter"
 msgstr "节拍"
 
-#: audio_clock.cc:1864 audio_streamview.cc:115 editor_actions.cc:1089
-#: session_metadata_dialog.cc:452 session_metadata_dialog.cc:500
-#: session_metadata_dialog.cc:556 session_metadata_dialog.cc:845 streamview.cc:470
+#: audio_clock.cc:1878 audio_streamview.cc:117 editor_actions.cc:1092
+#: luainstance.cc:967 luainstance.cc:1593 plugin_pin_dialog.cc:859
+#: plugin_selector.cc:995 plugin_selector.cc:1016
+#: session_metadata_dialog.cc:455 session_metadata_dialog.cc:503
+#: session_metadata_dialog.cc:559 session_metadata_dialog.cc:848
+#: streamview.cc:474
 msgid "programming error: %1"
-msgstr "程序错误: %1"
+msgstr "程序错误:%1"
 
-#: audio_clock.cc:1997 audio_clock.cc:2025
+#: audio_clock.cc:2011 audio_clock.cc:2039
 msgid "programming error: %1 %2"
 msgstr "程序错误:%1 %2"
 
-#: audio_clock.cc:2093 editor.cc:257 export_timespan_selector.cc:98
+#: audio_clock.cc:2123 editor.cc:320 export_timespan_selector.cc:105
 msgid "Bars:Beats"
 msgstr "小节:拍子"
 
-#: audio_clock.cc:2094 export_timespan_selector.cc:93
+#: audio_clock.cc:2124 export_timespan_selector.cc:100
 msgid "Minutes:Seconds"
 msgstr "分:秒"
 
-#: audio_clock.cc:2099
-msgid "Set From Playhead"
+#: audio_clock.cc:2129
+msgid "Set from Playhead"
 msgstr "从指针设置"
 
-#: audio_clock.cc:2100
+#: audio_clock.cc:2130
 msgid "Locate to This Time"
-msgstr "放置此时间"
+msgstr "放置在本时间"
+
+#: audio_clock.cc:2133
+msgid "Copy to clipboard"
+msgstr "复制到剪贴板"
 
-#: audio_region_editor.cc:64 control_point_dialog.cc:49 rhythm_ferret.cc:124
-#: rhythm_ferret.cc:129 rhythm_ferret.cc:134
+#: audio_region_editor.cc:60 control_point_dialog.cc:49 rhythm_ferret.cc:137
+#: rhythm_ferret.cc:154
 msgid "dB"
-msgstr ""
+msgstr "dB(分贝)"
 
-#: audio_region_editor.cc:67
+#: audio_region_editor.cc:63
 msgid "Region gain:"
 msgstr "区域增益:"
 
-#: audio_region_editor.cc:77 export_format_dialog.cc:43
+#: audio_region_editor.cc:73 export_format_dialog.cc:49 export_report.cc:772
+#: export_report.cc:1185 fft_graph.cc:497 normalize_dialog.cc:49
+#: strip_silence_dialog.cc:67
 msgid "dBFS"
-msgstr ""
+msgstr "dBFS(分贝振幅)"
 
-#: audio_region_editor.cc:80
+#: audio_region_editor.cc:76
 msgid "Peak amplitude:"
 msgstr "峰值幅度:"
 
-#: audio_region_editor.cc:91
+#: audio_region_editor.cc:87
 msgid "Calculating..."
 msgstr "计算中…"
 
-#: audio_region_view.cc:1243
+#: audio_region_view.cc:1385
 msgid "add gain control point"
 msgstr "添加增益控制点"
 
-#: automation_controller.cc:286 automation_controller.cc:302
+#: automation_controller.cc:304 automation_controller.cc:320
 msgid "Select Note..."
 msgstr "选择音符…"
 
-#: automation_controller.cc:293
+#: automation_controller.cc:311
 msgid "Halve"
 msgstr "减半"
 
-#: automation_controller.cc:296
+#: automation_controller.cc:314
 msgid "Double"
 msgstr "加倍"
 
-#: automation_controller.cc:307
-msgid "Set to %1 beat(s)"
-msgstr "设为 %1 拍"
+#: automation_controller.cc:325
+msgid "Set to %1 beat"
+msgid_plural "Set to %1 beats"
+msgstr[0] "设置为 %1 拍"
 
-#: automation_line.cc:286 automation_line.cc:462
+#: automation_line.cc:292 editor_drag.cc:4387
 msgid "automation event move"
 msgstr "自动化事件移动"
 
-#: automation_line.cc:488 automation_line.cc:508
-msgid "automation range move"
-msgstr "自动化范围移动"
-
-#: automation_line.cc:880 region_gain_line.cc:72
+#: automation_line.cc:888 region_gain_line.cc:75
 msgid "remove control point"
 msgstr "移除控制点"
 
-#: automation_line.cc:1003
+#: automation_line.cc:1013
 msgid "Ignoring illegal points on AutomationLine \"%1\""
-msgstr "忽略自动化线路上的非法点:“ %1 ”"
+msgstr ""
+"Ignoring illegal points on AutomationLine \"%1\" 忽略自动化线路上的非法"
+"点:“%1”"
 
-#: automation_region_view.cc:190 automation_time_axis.cc:644
+#: automation_region_view.cc:193 automation_time_axis.cc:649
 msgid "add automation event"
 msgstr "添加自动化事件"
 
-#: automation_streamview.cc:95
+#: automation_streamview.cc:94
 msgid "unable to display automation region for control without list"
-msgstr "无法显示没有列表的自动化区域控制"
+msgstr "无法为没有列表的控制显示自动化区域"
 
 #: automation_time_axis.cc:163
 msgid "automation state"
@@ -2372,62 +2818,59 @@ msgstr "自动化状态"
 msgid "hide track"
 msgstr "隐藏音轨"
 
-#: automation_time_axis.cc:308 automation_time_axis.cc:360
-#: automation_time_axis.cc:554 gain_meter.cc:220 generic_pluginui.cc:523
-#: generic_pluginui.cc:817 panner_ui.cc:151
+#: automation_time_axis.cc:310 automation_time_axis.cc:362
+#: automation_time_axis.cc:556 gain_meter.cc:230 generic_pluginui.cc:590
+#: generic_pluginui.cc:934 panner_ui.cc:151
 msgid "Automation|Manual"
-msgstr "自动化 | 手册"
-
-#: automation_time_axis.cc:310 automation_time_axis.cc:371
-#: automation_time_axis.cc:559 editor.cc:1904 editor.cc:1981 editor_actions.cc:122
-#: editor_actions.cc:1920 gain_meter.cc:223 generic_pluginui.cc:99
-#: generic_pluginui.cc:526 generic_pluginui.cc:819 midi_time_axis.cc:1606
-#: midi_time_axis.cc:1609 midi_time_axis.cc:1612 panner_ui.cc:154
+msgstr "自动化|手动"
+
+#: automation_time_axis.cc:312 automation_time_axis.cc:373
+#: automation_time_axis.cc:561 editor.cc:2033 editor.cc:2111
+#: editor_actions.cc:125 editor_actions.cc:1937 gain_meter.cc:232
+#: generic_pluginui.cc:100 generic_pluginui.cc:593 generic_pluginui.cc:936
+#: midi_time_axis.cc:1610 midi_time_axis.cc:1613 midi_time_axis.cc:1616
+#: panner_ui.cc:154
 msgid "Play"
 msgstr "播放"
 
-#: automation_time_axis.cc:312 automation_time_axis.cc:382
-#: automation_time_axis.cc:564 gain_meter.cc:226 generic_pluginui.cc:101
-#: generic_pluginui.cc:529 generic_pluginui.cc:821 panner_ui.cc:157
+#: automation_time_axis.cc:314 automation_time_axis.cc:384
+#: automation_time_axis.cc:566 gain_meter.cc:234 generic_pluginui.cc:102
+#: generic_pluginui.cc:596 generic_pluginui.cc:938 panner_ui.cc:157
 msgid "Write"
-msgstr "写入"
+msgstr "编写"
 
-#: automation_time_axis.cc:314 automation_time_axis.cc:393
-#: automation_time_axis.cc:569 gain_meter.cc:229 generic_pluginui.cc:103
-#: generic_pluginui.cc:532 generic_pluginui.cc:823 panner_ui.cc:160
+#: automation_time_axis.cc:316 automation_time_axis.cc:395
+#: automation_time_axis.cc:571 gain_meter.cc:236 generic_pluginui.cc:104
+#: generic_pluginui.cc:599 generic_pluginui.cc:940 panner_ui.cc:160
 msgid "Touch"
-msgstr "触碰"
+msgstr "改动"
 
-#: automation_time_axis.cc:404 generic_pluginui.cc:535 meter_patterns.cc:112
+#: automation_time_axis.cc:406 generic_pluginui.cc:602 meter_patterns.cc:118
 msgid "???"
-msgstr "???"
+msgstr ""
 
-#: automation_time_axis.cc:445
+#: automation_time_axis.cc:447
 msgid "clear automation"
 msgstr "清除自动化"
 
-#: automation_time_axis.cc:543 editor_actions.cc:645 editor_markers.cc:902
-#: location_ui.cc:57 plugin_selector.cc:86 route_time_axis.cc:854
-msgid "Hide"
-msgstr "隐藏"
-
-#: automation_time_axis.cc:545
+#: automation_time_axis.cc:547 rc_option_editor.cc:2919
+#: rc_option_editor.cc:2924 rc_option_editor.cc:2974 rc_option_editor.cc:2979
 msgid "Clear"
 msgstr "清除"
 
-#: automation_time_axis.cc:576
+#: automation_time_axis.cc:578
 msgid "State"
-msgstr "状态"
+msgstr "状态\" \""
 
-#: automation_time_axis.cc:592
+#: automation_time_axis.cc:594
 msgid "Discrete"
 msgstr "离散"
 
-#: automation_time_axis.cc:598 export_format_dialog.cc:485
+#: automation_time_axis.cc:600 export_format_dialog.cc:552
 msgid "Linear"
 msgstr "线性"
 
-#: automation_time_axis.cc:604 rhythm_ferret.cc:109 shuttle_control.cc:197
+#: automation_time_axis.cc:606 rhythm_ferret.cc:118 shuttle_control.cc:224
 msgid "Mode"
 msgstr "模式"
 
@@ -2443,35 +2886,38 @@ msgstr "编辑包裹"
 msgid "Direction:"
 msgstr "方向:"
 
-#: bundle_manager.cc:206 bundle_manager.cc:210 engine_dialog.cc:662
-#: mixer_strip.cc:162 mixer_strip.cc:367 mixer_strip.cc:2240
-#: rc_option_editor.cc:2326
+#: bundle_manager.cc:206 bundle_manager.cc:210 engine_dialog.cc:976
+#: mixer_strip.cc:175 mixer_strip.cc:392 mixer_strip.cc:2459
+#: rc_option_editor.cc:3142
 msgid "Input"
 msgstr "输入"
 
 #: bundle_manager.cc:207 bundle_manager.cc:212 bundle_manager.cc:246
-#: engine_dialog.cc:664 mixer_strip.cc:166 mixer_strip.cc:371 mixer_strip.cc:2243
-#: rc_option_editor.cc:2330
+#: engine_dialog.cc:978 mixer_strip.cc:179 mixer_strip.cc:396
+#: mixer_strip.cc:2462 monitor_section.cc:296 monitor_section.cc:300
+#: rc_option_editor.cc:3146
 msgid "Output"
 msgstr "输出"
 
-#: bundle_manager.cc:265 editor.cc:1945 editor_actions.cc:94 editor_actions.cc:104
-#: rc_option_editor.cc:1087 rc_option_editor.cc:1094
+#: bundle_manager.cc:265 editor.cc:2075 editor_actions.cc:97
+#: editor_actions.cc:107 lua_script_manager.cc:33 rc_option_editor.cc:2931
+#: rc_option_editor.cc:2945
 msgid "Edit"
 msgstr "编辑"
 
-#: bundle_manager.cc:266 editor.cc:5902 editor.cc:5930 editor_actions.cc:338
-#: editor_actions.cc:339 editor_actions.cc:405 plugin_ui.cc:420
-#: processor_box.cc:2458 route_time_axis.cc:859
+#: bundle_manager.cc:266 editor.cc:5962 editor.cc:5992 editor_actions.cc:360
+#: editor_actions.cc:361 luawindow.cc:101 plugin_ui.cc:420
+#: processor_box.cc:3681 processor_box.cc:3683
 msgid "Delete"
 msgstr "删除"
 
-#: bundle_manager.cc:272 bundle_manager.cc:439 editor_route_groups.cc:97
-#: editor_routes.cc:206 midi_list_editor.cc:107 session_metadata_dialog.cc:646
+#: bundle_manager.cc:272 bundle_manager.cc:439 editor_route_groups.cc:98
+#: editor_routes.cc:233 lua_script_manager.cc:42 lua_script_manager.cc:76
+#: midi_list_editor.cc:107 session_metadata_dialog.cc:649
 msgid "Name"
 msgstr "名称"
 
-#: bundle_manager.cc:283
+#: bundle_manager.cc:283 luawindow.cc:566
 msgid "New"
 msgstr "新建"
 
@@ -2487,6 +2933,38 @@ msgstr "添加声道"
 msgid "Rename Channel"
 msgstr "重命名声道"
 
+#: color_theme_manager.cc:58
+msgid "Restore Defaults"
+msgstr "重置恢复默认值"
+
+#: color_theme_manager.cc:62
+msgid "Color Theme"
+msgstr "颜色主题"
+
+#: color_theme_manager.cc:118
+msgid "Object"
+msgstr "对象物体"
+
+#: color_theme_manager.cc:121 route_group_dialog.cc:53 route_group_dialog.cc:81
+msgid "Color"
+msgstr "颜色"
+
+#: color_theme_manager.cc:143
+msgid "Items"
+msgstr "条目"
+
+#: color_theme_manager.cc:144
+msgid "Palette"
+msgstr "调色板"
+
+#: color_theme_manager.cc:145
+msgid "Transparency"
+msgstr "透明度"
+
+#: color_theme_manager.cc:467
+msgid "Color Palette"
+msgstr "颜料调色板"
+
 #: configinfo.cc:28
 msgid "Build Configuration"
 msgstr "创建配置"
@@ -2497,7 +2975,43 @@ msgstr "控制点"
 
 #: control_point_dialog.cc:45
 msgid "Value"
-msgstr "值"
+msgstr "数值"
+
+#: control_slave_ui.cc:50 mixer_ui.cc:254
+msgid "Control Masters"
+msgstr "控制操作台"
+
+#: control_slave_ui.cc:54
+msgid "-vca-"
+msgstr ""
+
+#: control_slave_ui.cc:211
+msgid "Unassign All"
+msgstr "撤销指定全部"
+
+#: duplicate_routes_dialog.cc:35
+msgid "Duplicate Tracks & Busses"
+msgstr "复制音轨和总线"
+
+#: duplicate_routes_dialog.cc:36
+msgid "Copy playlists"
+msgstr "复制播放列表"
+
+#: duplicate_routes_dialog.cc:37
+msgid "Create new (empty) playlists"
+msgstr "创建新的(空)播放列表"
+
+#: duplicate_routes_dialog.cc:38
+msgid "Share playlists"
+msgstr "分享播放列表"
+
+#: duplicate_routes_dialog.cc:41
+msgid "Duplicate each track/bus this number of times:"
+msgstr "复制每个音轨/总线为这个数字的倍数:"
+
+#: duplicate_routes_dialog.cc:176
+msgid "1 or more tracks/busses could not be duplicated"
+msgstr "一个或者更多的音轨/总线无法被复制"
 
 #: edit_note_dialog.cc:42
 msgid "Note"
@@ -2505,28 +3019,28 @@ msgstr "音符"
 
 #: edit_note_dialog.cc:45
 msgid "Set selected notes to this channel"
-msgstr "设置已选中的音符为本声道"
+msgstr "设置已选中的音符至本声"
 
 #: edit_note_dialog.cc:46
 msgid "Set selected notes to this pitch"
-msgstr "设置已选中的音符为本音高"
+msgstr "设置已选中的音符至本音高"
 
 #: edit_note_dialog.cc:47
 msgid "Set selected notes to this velocity"
-msgstr "设置已选中的音符为本力度"
+msgstr "设置已选中的音符至本力度"
 
 #: edit_note_dialog.cc:49
 msgid "Set selected notes to this time"
-msgstr "设置已选中的音符为本时间"
+msgstr "设置已选中的音符至本时间"
 
 #: edit_note_dialog.cc:51
 msgid "Set selected notes to this length"
-msgstr "设置已选中的音符为本长度"
+msgstr "设置已选中的音符至本长度"
 
 #: edit_note_dialog.cc:58 midi_list_editor.cc:105 patch_change_dialog.cc:90
 #: step_entry.cc:394
 msgid "Channel"
-msgstr "音轨"
+msgstr "声道"
 
 #: edit_note_dialog.cc:68
 msgid "Pitch"
@@ -2536,590 +3050,597 @@ msgstr "音高"
 msgid "Velocity"
 msgstr "力度"
 
-#: edit_note_dialog.cc:88 patch_change_dialog.cc:66
+#: edit_note_dialog.cc:88 export_report.cc:246 export_report.cc:688
+#: patch_change_dialog.cc:66
 msgid "Time"
 msgstr "时间"
 
-#: edit_note_dialog.cc:98 editor_regions.cc:115 export_timespan_selector.cc:378
-#: export_timespan_selector.cc:440 location_ui.cc:320 midi_list_editor.cc:115
-#: time_info_box.cc:108
+#: edit_note_dialog.cc:99 editor_regions.cc:162 export_timespan_selector.cc:415
+#: export_timespan_selector.cc:506 location_ui.cc:322 midi_list_editor.cc:115
+#: time_info_box.cc:102
 msgid "Length"
 msgstr "长度"
 
-#: edit_note_dialog.cc:165
+#: edit_note_dialog.cc:166
 msgid "edit note"
 msgstr "编辑音符"
 
-#: editor.cc:147
+#: editor.cc:160
 msgid "CD Frames"
 msgstr "CD 框架"
 
-#: editor.cc:148
+#: editor.cc:161
 msgid "TC Frames"
-msgstr "TC 框架"
+msgstr "TC(时间码)框架"
 
-#: editor.cc:149
+#: editor.cc:162
 msgid "TC Seconds"
-msgstr "TC 秒"
+msgstr "TC(时间码)秒"
 
-#: editor.cc:150
+#: editor.cc:163
 msgid "TC Minutes"
-msgstr "TC 分"
+msgstr "TC(时间码)分"
 
-#: editor.cc:151
+#: editor.cc:164
 msgid "Seconds"
 msgstr "秒"
 
-#: editor.cc:152
+#: editor.cc:165
 msgid "Minutes"
 msgstr "分"
 
-#: editor.cc:153 quantize_dialog.cc:37 quantize_dialog.cc:141
+#: editor.cc:166 quantize_dialog.cc:37
 msgid "Beats/128"
-msgstr "128拍"
+msgstr "每拍128分"
 
-#: editor.cc:154 quantize_dialog.cc:38 quantize_dialog.cc:143
+#: editor.cc:167 quantize_dialog.cc:38
 msgid "Beats/64"
-msgstr "64拍"
+msgstr "每拍64分"
 
-#: editor.cc:155 quantize_dialog.cc:39 quantize_dialog.cc:145
+#: editor.cc:168 quantize_dialog.cc:39
 msgid "Beats/32"
-msgstr "32拍"
+msgstr "每拍32分"
 
-#: editor.cc:156
+#: editor.cc:169 quantize_dialog.cc:40
 msgid "Beats/28"
-msgstr "28拍"
+msgstr "每拍28分"
 
-#: editor.cc:157
+#: editor.cc:170 quantize_dialog.cc:41
 msgid "Beats/24"
-msgstr "24拍"
+msgstr "每拍24分"
 
-#: editor.cc:158
+#: editor.cc:171 quantize_dialog.cc:42
 msgid "Beats/20"
-msgstr "20拍"
+msgstr "每拍20分"
 
-#: editor.cc:159 quantize_dialog.cc:40 quantize_dialog.cc:147
+#: editor.cc:172 quantize_dialog.cc:43
 msgid "Beats/16"
-msgstr "16拍"
+msgstr "每拍16分"
 
-#: editor.cc:160
+#: editor.cc:173 quantize_dialog.cc:44
 msgid "Beats/14"
-msgstr "14拍"
+msgstr "每拍14分"
 
-#: editor.cc:161
+#: editor.cc:174 quantize_dialog.cc:45
 msgid "Beats/12"
-msgstr "12拍"
+msgstr "每拍12分"
 
-#: editor.cc:162
+#: editor.cc:175 quantize_dialog.cc:46
 msgid "Beats/10"
-msgstr "10拍"
+msgstr "每拍10分"
 
-#: editor.cc:163 quantize_dialog.cc:41 quantize_dialog.cc:149
+#: editor.cc:176 quantize_dialog.cc:47
 msgid "Beats/8"
-msgstr "8拍"
+msgstr "每拍8分"
 
-#: editor.cc:164
+#: editor.cc:177 quantize_dialog.cc:48
 msgid "Beats/7"
-msgstr "7拍"
+msgstr "每拍7分"
 
-#: editor.cc:165
+#: editor.cc:178 quantize_dialog.cc:49
 msgid "Beats/6"
-msgstr "6拍"
+msgstr "每拍6分"
 
-#: editor.cc:166
+#: editor.cc:179 quantize_dialog.cc:50
 msgid "Beats/5"
-msgstr "5拍"
+msgstr "每拍5分"
 
-#: editor.cc:167 quantize_dialog.cc:42 quantize_dialog.cc:151
+#: editor.cc:180 quantize_dialog.cc:51
 msgid "Beats/4"
-msgstr "4拍"
+msgstr "每拍4分"
 
-#: editor.cc:168 quantize_dialog.cc:43 quantize_dialog.cc:153
+#: editor.cc:181 quantize_dialog.cc:52
 msgid "Beats/3"
-msgstr "3拍"
+msgstr "每拍3分"
 
-#: editor.cc:169 quantize_dialog.cc:44 quantize_dialog.cc:155
+#: editor.cc:182 quantize_dialog.cc:53
 msgid "Beats/2"
-msgstr "2拍"
+msgstr "每拍2分"
 
-#: editor.cc:170 quantize_dialog.cc:45 quantize_dialog.cc:157
+#: editor.cc:183 quantize_dialog.cc:54
 msgid "Beats"
 msgstr "1拍"
 
-#: editor.cc:171
+#: editor.cc:184
 msgid "Bars"
 msgstr "小节"
 
-#: editor.cc:172
+#: editor.cc:185
 msgid "Marks"
 msgstr "标记"
 
-#: editor.cc:173
+#: editor.cc:186
 msgid "Region starts"
-msgstr "区域开始"
+msgstr "区域起点"
 
-#: editor.cc:174
+#: editor.cc:187
 msgid "Region ends"
-msgstr "区域结束"
+msgstr "区域终点"
 
-#: editor.cc:175
+#: editor.cc:188
 msgid "Region syncs"
 msgstr "区域同步"
 
-#: editor.cc:176
+#: editor.cc:189
 msgid "Region bounds"
 msgstr "区域边界"
 
-#: editor.cc:181 editor_actions.cc:510
+#: editor.cc:194 editor_actions.cc:551
 msgid "No Grid"
 msgstr "无网格"
 
-#: editor.cc:182 editor_actions.cc:511
+#: editor.cc:195 editor_actions.cc:552
 msgid "Grid"
 msgstr "网格"
 
-#: editor.cc:183 editor_actions.cc:512
+#: editor.cc:196 editor_actions.cc:553
 msgid "Magnetic"
 msgstr "磁性吸附"
 
-#: editor.cc:188 editor.cc:206 editor_actions.cc:121 editor_actions.cc:493
+#: editor.cc:201 editor.cc:219 editor_actions.cc:124 editor_actions.cc:534
 msgid "Playhead"
 msgstr "指针"
 
-#: editor.cc:189 editor_actions.cc:495
+#: editor.cc:202 editor_actions.cc:536
 msgid "Marker"
 msgstr "标记"
 
-#: editor.cc:190 editor.cc:207 editor_actions.cc:494
+#: editor.cc:203 editor.cc:220 editor_actions.cc:535
 msgid "Mouse"
 msgstr "é¼ æ ‡"
 
-#: editor.cc:195 editor_actions.cc:502
+#: editor.cc:208 editor_actions.cc:543
 msgid "Slide"
 msgstr "滑行"
 
-#: editor.cc:196
+#: editor.cc:209
 msgid "Splice"
 msgstr "拼接"
 
-#: editor.cc:197 editor_actions.cc:501
+#: editor.cc:210 editor_actions.cc:542
 msgid "Ripple"
 msgstr "波纹"
 
-#: editor.cc:198 editor_actions.cc:157 editor_actions.cc:503 editor_actions.cc:1789
-#: editor_markers.cc:905 editor_rulers.cc:260 location_ui.cc:58 mixer_strip.cc:195
-#: mixer_strip.cc:2028
+#: editor.cc:211 editor_actions.cc:1806 editor_markers.cc:910
+#: editor_rulers.cc:259 location_ui.cc:62
 msgid "Lock"
 msgstr "锁定"
 
-#: editor.cc:203 mono_panner_editor.cc:42
+#: editor.cc:216 mono_panner_editor.cc:44
 msgid "Left"
 msgstr "å·¦"
 
-#: editor.cc:204 mono_panner_editor.cc:47
+#: editor.cc:217 mono_panner_editor.cc:49
 msgid "Right"
 msgstr "右"
 
-#: editor.cc:205
+#: editor.cc:218
 msgid "Center"
 msgstr "中"
 
-#: editor.cc:208 editor.cc:3231
+#: editor.cc:221
 msgid "Edit point"
 msgstr "编辑点"
 
-#: editor.cc:214
+#: editor.cc:227
 msgid "Mushy"
 msgstr "模糊"
 
-#: editor.cc:215
+#: editor.cc:228
 msgid "Smooth"
 msgstr "平滑"
 
-#: editor.cc:216
+#: editor.cc:229
 msgid "Balanced multitimbral mixture"
 msgstr "平衡的多重音色混响乐"
 
-#: editor.cc:217
+#: editor.cc:230
 msgid "Unpitched percussion with stable notes"
 msgstr "带有稳定音符的未定音高打击乐"
 
-#: editor.cc:218
+#: editor.cc:231
 msgid "Crisp monophonic instrumental"
 msgstr "欢快的单声调乐器"
 
-#: editor.cc:219
+#: editor.cc:232
 msgid "Unpitched solo percussion"
 msgstr "未定音高的独奏打击乐"
 
-#: editor.cc:220
+#: editor.cc:233
 msgid "Resample without preserving pitch"
 msgstr "不保持音高的重新采样"
 
-#: editor.cc:256
+#: editor.cc:319
 msgid "Mins:Secs"
 msgstr "分:秒"
 
-#: editor.cc:262
+#: editor.cc:325
 msgid "Location Markers"
 msgstr "位置标记"
 
-#: editor.cc:263
+#: editor.cc:326
 msgid "Range Markers"
 msgstr "范围标记"
 
-#: editor.cc:264
+#: editor.cc:327
 msgid "Loop/Punch Ranges"
-msgstr "循环 / 切换范围"
+msgstr "循环/切换范围"
 
-#: editor.cc:265 editor_actions.cc:565
+#: editor.cc:328 editor_actions.cc:606
 msgid "CD Markers"
 msgstr "CD标记"
 
-#: editor.cc:266
+#: editor.cc:329
 msgid "Video Timeline"
 msgstr "视频时间线"
 
-#: editor.cc:283
+#: editor.cc:386
 msgid "mode"
 msgstr "模式"
 
-#: editor.cc:459 editor_actions.cc:114 editor_actions.cc:564
+#: editor.cc:535 editor_actions.cc:117 editor_actions.cc:605
 msgid "Markers"
 msgstr "标记"
 
-#: editor.cc:577 rc_option_editor.cc:1939
+#: editor.cc:653 rc_option_editor.cc:2527
 msgid "Regions"
 msgstr "区域"
 
-#: editor.cc:578
+#: editor.cc:654
 msgid "Tracks & Busses"
 msgstr "音轨 & 总线"
 
-#: editor.cc:579
+#: editor.cc:655
 msgid "Snapshots"
 msgstr "å¿«ç…§"
 
-#: editor.cc:580
+#: editor.cc:656
 msgid "Track & Bus Groups"
 msgstr "音轨 & 总线分组"
 
-#: editor.cc:581
+#: editor.cc:657
 msgid "Ranges & Marks"
 msgstr "范围 & 标记"
 
-#: editor.cc:728 editor.cc:5754 rc_option_editor.cc:1619 rc_option_editor.cc:1627
-#: rc_option_editor.cc:1635 rc_option_editor.cc:1643 rc_option_editor.cc:1667
-#: rc_option_editor.cc:1679 rc_option_editor.cc:1681 rc_option_editor.cc:1689
-#: rc_option_editor.cc:1697 rc_option_editor.cc:1717 rc_option_editor.cc:1729
-#: rc_option_editor.cc:1731 rc_option_editor.cc:1733 rc_option_editor.cc:1741
-#: rc_option_editor.cc:1749 rc_option_editor.cc:1757 rc_option_editor.cc:1772
-#: rc_option_editor.cc:1776 rc_option_editor.cc:1800
-msgid "Editor"
-msgstr "编辑器"
-
-#: editor.cc:1331 editor.cc:4735 editor_actions.cc:134 editor_actions.cc:1865
+#: editor.cc:1333 editor.cc:4737 editor_actions.cc:137 editor_actions.cc:1882
 msgid "Loop"
 msgstr "循环"
 
-#: editor.cc:1337 editor.cc:4762 editor_actions.cc:135 time_info_box.cc:68
+#: editor.cc:1339 editor.cc:4764 editor_actions.cc:138 time_info_box.cc:62
 msgid "Punch"
 msgstr "切换"
 
-#: editor.cc:1449 rc_option_editor.cc:1661
+#: editor.cc:1474 rc_option_editor.cc:2299
 msgid "Linear (for highly correlated material)"
 msgstr "线性(高度相关的材料)"
 
-#: editor.cc:1459 rc_option_editor.cc:1662
+#: editor.cc:1484 rc_option_editor.cc:2300
 msgid "Constant power"
 msgstr "恒定功率"
 
-#: editor.cc:1468 rc_option_editor.cc:1663
+#: editor.cc:1493 rc_option_editor.cc:2301
 msgid "Symmetric"
 msgstr "对称"
 
-#: editor.cc:1478 rc_option_editor.cc:1664
+#: editor.cc:1503 rc_option_editor.cc:2302
 msgid "Slow"
 msgstr "æ…¢"
 
-#: editor.cc:1487 rc_option_editor.cc:1665 sfdb_ui.cc:1771 sfdb_ui.cc:1881
+#: editor.cc:1512 rc_option_editor.cc:2303 sfdb_ui.cc:1737 sfdb_ui.cc:1847
 msgid "Fast"
 msgstr "å¿«"
 
-#: editor.cc:1509 editor.cc:1534
+#: editor.cc:1534 editor.cc:1559
 msgid "Deactivate"
-msgstr "取消激活"
+msgstr "撤销激活"
 
-#: editor.cc:1511 editor.cc:1536
+#: editor.cc:1536 editor.cc:1561
 msgid "Activate"
 msgstr "激活"
 
-#: editor.cc:1637 editor.cc:1645 editor_ops.cc:3824
+#: editor.cc:1662 editor.cc:1670 editor_ops.cc:3921
 msgid "Freeze"
 msgstr "冻结"
 
-#: editor.cc:1641
+#: editor.cc:1666
 msgid "Unfreeze"
-msgstr "取消冻结"
+msgstr "撤销冻结"
+
+#: editor.cc:1766
+msgid "Region Loudness Analysis"
+msgstr "区域响度分析"
+
+#: editor.cc:1785 editor.cc:1834
+msgid "Audio Report/Analysis"
+msgstr "音频报告/分析"
+
+#: editor.cc:1815
+msgid "Range Loudness Analysis"
+msgstr "范围响度分析"
 
-#: editor.cc:1780
+#: editor.cc:1901
 msgid "Selected Regions"
 msgstr "已选择的区域"
 
-#: editor.cc:1816 editor_markers.cc:940
+#: editor.cc:1945 editor_markers.cc:945
 msgid "Play Range"
 msgstr "播放范围"
 
-#: editor.cc:1817 editor_markers.cc:943
+#: editor.cc:1946 editor_markers.cc:948
 msgid "Loop Range"
 msgstr "循环范围"
 
-#: editor.cc:1820 editor_markers.cc:950
+#: editor.cc:1949 editor_markers.cc:953
 msgid "Zoom to Range"
 msgstr "缩放至整个范围"
 
-#: editor.cc:1829 editor_actions.cc:369
+#: editor.cc:1952
+msgid "Loudness Analysis"
+msgstr "响度分析"
+
+#: editor.cc:1959 editor_actions.cc:401
 msgid "Move Range Start to Previous Region Boundary"
 msgstr "移动范围起点到上一个区域边界"
 
-#: editor.cc:1836 editor_actions.cc:376
+#: editor.cc:1966 editor_actions.cc:408
 msgid "Move Range Start to Next Region Boundary"
 msgstr "移动范围起点到下一个区域边界"
 
-#: editor.cc:1843 editor_actions.cc:383
+#: editor.cc:1973 editor_actions.cc:415
 msgid "Move Range End to Previous Region Boundary"
 msgstr "移动范围终点到上一个区域边界"
 
-#: editor.cc:1850 editor_actions.cc:390
+#: editor.cc:1980 editor_actions.cc:422
 msgid "Move Range End to Next Region Boundary"
 msgstr "移动范围终点到下一个区域边界"
 
-#: editor.cc:1856 editor_actions.cc:133 editor_actions.cc:325
+#: editor.cc:1986 editor_actions.cc:136 editor_actions.cc:347
 msgid "Separate"
 msgstr "分离"
 
-#: editor.cc:1857
+#: editor.cc:1987
 msgid "Convert to Region in Region List"
-msgstr "在区域列表转换至区域"
+msgstr "转换至区域列表中的区域"
 
-#: editor.cc:1860 editor_markers.cc:970
+#: editor.cc:1990 editor_markers.cc:973
 msgid "Select All in Range"
 msgstr "在范围内全选"
 
-#: editor.cc:1863 editor_actions.cc:297
+#: editor.cc:1993 editor_actions.cc:319
 msgid "Set Loop from Selection"
 msgstr "从已选择部分设置循环"
 
-#: editor.cc:1864 editor_actions.cc:298
+#: editor.cc:1994 editor_actions.cc:320
 msgid "Set Punch from Selection"
 msgstr "从已选择部分设置切换"
 
-#: editor.cc:1865 editor_actions.cc:299
+#: editor.cc:1995 editor_actions.cc:321
 msgid "Set Session Start/End from Selection"
 msgstr "从已选择部分设置会话起点/终点"
 
-#: editor.cc:1868
+#: editor.cc:1998
 msgid "Add Range Markers"
 msgstr "添加范围标记"
 
-#: editor.cc:1871
+#: editor.cc:2001
 msgid "Crop Region to Range"
-msgstr "裁剪区域到范围"
-
-#: editor.cc:1872
-msgid "Fill Range with Region"
-msgstr "用区域填充范围"
+msgstr "裁剪区域至范围"
 
-#: editor.cc:1873 editor_actions.cc:311
+#: editor.cc:2002 editor_actions.cc:333
 msgid "Duplicate Range"
 msgstr "复制范围"
 
-#: editor.cc:1876
+#: editor.cc:2005
 msgid "Consolidate Range"
 msgstr "合并范围"
 
-#: editor.cc:1877
-msgid "Consolidate Range With Processing"
+#: editor.cc:2006
+msgid "Consolidate Range with Processing"
 msgstr "合并范围并处理"
 
-#: editor.cc:1878
+#: editor.cc:2007
 msgid "Bounce Range to Region List"
-msgstr "欢跳弹奏范围到区域列表"
+msgstr "欢跳弹奏范围至区域列表"
 
-#: editor.cc:1879
-msgid "Bounce Range to Region List With Processing"
-msgstr "欢跳弹奏范围到区域列表并处理"
+#: editor.cc:2008
+msgid "Bounce Range to Region List with Processing"
+msgstr "欢跳弹奏范围至区域列表并处理"
 
-#: editor.cc:1880 editor_markers.cc:953
+#: editor.cc:2009 editor_markers.cc:956
 msgid "Export Range..."
 msgstr "导出范围…"
 
-#: editor.cc:1882
+#: editor.cc:2011
 msgid "Export Video Range..."
 msgstr "导出视频范围…"
 
-#: editor.cc:1898 editor.cc:1979 editor_actions.cc:303
-msgid "Play From Edit Point"
+#: editor.cc:2027 editor.cc:2109 editor_actions.cc:325
+msgid "Play from Edit Point"
 msgstr "从编辑点播放"
 
-#: editor.cc:1899 editor.cc:1980
-msgid "Play From Start"
+#: editor.cc:2028 editor.cc:2110
+msgid "Play from Start"
 msgstr "从起点播放"
 
-#: editor.cc:1900
+#: editor.cc:2029
 msgid "Play Region"
 msgstr "播放区域"
 
-#: editor.cc:1902
+#: editor.cc:2031
 msgid "Loop Region"
 msgstr "循环区域"
 
-#: editor.cc:1912 editor.cc:1989
+#: editor.cc:2041 editor.cc:2119
 msgid "Select All in Track"
 msgstr "在音轨上全选所有"
 
-#: editor.cc:1913 editor.cc:1990 editor_actions.cc:194
+#: editor.cc:2042 editor.cc:2120 editor_actions.cc:196
 msgid "Select All Objects"
 msgstr "全选所有对象物体"
 
-#: editor.cc:1914 editor.cc:1991
+#: editor.cc:2043 editor.cc:2121
 msgid "Invert Selection in Track"
-msgstr "在音轨反选"
+msgstr "反选音轨里的已选择部分"
 
-#: editor.cc:1915 editor.cc:1992 editor_actions.cc:197
+#: editor.cc:2044 editor.cc:2122 editor_actions.cc:199
 msgid "Invert Selection"
 msgstr "反选"
 
-#: editor.cc:1917
+#: editor.cc:2046 editor_actions.cc:201
 msgid "Set Range to Loop Range"
-msgstr "设置范围到循环范围"
+msgstr "设置范围至循环范围"
 
-#: editor.cc:1918
+#: editor.cc:2047 editor_actions.cc:202
 msgid "Set Range to Punch Range"
-msgstr "设置范围到切换区间"
+msgstr "设置范围至切换范围"
 
-#: editor.cc:1920 editor.cc:1994 editor_actions.cc:199 editor_actions.cc:200
+#: editor.cc:2048 editor_actions.cc:203
+msgid "Set Range to Selected Regions"
+msgstr "设置范围至已选中区域"
+
+#: editor.cc:2050 editor.cc:2124 editor_actions.cc:205 editor_actions.cc:206
 msgid "Select All After Edit Point"
 msgstr "全选编辑点后所有"
 
-#: editor.cc:1921 editor.cc:1995 editor_actions.cc:201 editor_actions.cc:202
+#: editor.cc:2051 editor.cc:2125 editor_actions.cc:207 editor_actions.cc:208
 msgid "Select All Before Edit Point"
-msgstr "全选编辑前所有"
+msgstr "全选编辑点前所有"
 
-#: editor.cc:1922 editor.cc:1996
+#: editor.cc:2052 editor.cc:2126
 msgid "Select All After Playhead"
 msgstr "全选指针后所有"
 
-#: editor.cc:1923 editor.cc:1997
+#: editor.cc:2053 editor.cc:2127
 msgid "Select All Before Playhead"
 msgstr "全选指针前所有"
 
-#: editor.cc:1924
+#: editor.cc:2054
 msgid "Select All Between Playhead and Edit Point"
 msgstr "全选指针和编辑点之间所有"
 
-#: editor.cc:1925
+#: editor.cc:2055
 msgid "Select All Within Playhead and Edit Point"
 msgstr "全选指针和编辑点内部所有"
 
-#: editor.cc:1926
+#: editor.cc:2056
 msgid "Select Range Between Playhead and Edit Point"
 msgstr "选择指针和编辑点之间范围"
 
-#: editor.cc:1928 editor.cc:1999 editor_actions.cc:131 editor_actions.cc:132
+#: editor.cc:2058 editor.cc:2129 editor_actions.cc:134 editor_actions.cc:135
 msgid "Select"
 msgstr "选择"
 
-#: editor.cc:1936 editor.cc:2007 editor_actions.cc:337 processor_box.cc:2451
+#: editor.cc:2066 editor.cc:2137 editor_actions.cc:359 processor_box.cc:3677
 msgid "Cut"
 msgstr "剪切"
 
-#: editor.cc:1937 editor.cc:2008 editor_actions.cc:341 processor_box.cc:2454
+#: editor.cc:2067 editor.cc:2138 editor_actions.cc:363 processor_box.cc:3679
 msgid "Copy"
 msgstr "复制"
 
-#: editor.cc:1938 editor.cc:2009 editor_actions.cc:342 processor_box.cc:2462
+#: editor.cc:2068 editor.cc:2139 editor_actions.cc:364 processor_box.cc:3691
 msgid "Paste"
 msgstr "粘贴"
 
-#: editor.cc:1942 editor_actions.cc:91
+#: editor.cc:2072 editor_actions.cc:94
 msgid "Align"
 msgstr "对齐"
 
-#: editor.cc:1943
+#: editor.cc:2073
 msgid "Align Relative"
 msgstr "对齐相关"
 
-#: editor.cc:1950
+#: editor.cc:2080
 msgid "Insert Selected Region"
 msgstr "插入已选择的区域"
 
-#: editor.cc:1951
+#: editor.cc:2081
 msgid "Insert Existing Media"
 msgstr "插入已存在的媒体"
 
-#: editor.cc:1960 editor.cc:2016
+#: editor.cc:2090 editor.cc:2146
 msgid "Nudge Entire Track Later"
 msgstr "向后微调整个音轨"
 
-#: editor.cc:1961 editor.cc:2017
+#: editor.cc:2091 editor.cc:2147
 msgid "Nudge Track After Edit Point Later"
 msgstr "向后微调编辑点以后的音轨"
 
-#: editor.cc:1962 editor.cc:2018
+#: editor.cc:2092 editor.cc:2148
 msgid "Nudge Entire Track Earlier"
 msgstr "向前微调整个音轨"
 
-#: editor.cc:1963 editor.cc:2019
+#: editor.cc:2093 editor.cc:2149
 msgid "Nudge Track After Edit Point Earlier"
 msgstr "向前微调编辑点以后的音轨"
 
-#: editor.cc:1965 editor.cc:2021
+#: editor.cc:2095 editor.cc:2151
 msgid "Nudge"
 msgstr "微调"
 
-#: editor.cc:2235
-msgid "Playhead position stored with a negative value - ignored (use zero instead)"
-msgstr "指针位置存储为一个负值——忽略(用零代替)"
+#: editor.cc:2353
+msgid ""
+"Playhead position stored with a negative value - ignored (use zero instead)"
+msgstr "指针位置存储为一个负值——已忽略(用零代替)"
 
-#: editor.cc:3006 editor.cc:3707 editor.cc:3778 midi_channel_selector.cc:157
+#: editor.cc:3115 editor.cc:3775 editor.cc:3846 midi_channel_selector.cc:157
 #: midi_channel_selector.cc:395 midi_channel_selector.cc:431
 msgid "All"
 msgstr "所有"
 
-#: editor.cc:3210
-msgid "Smart Mode (add Range functions to Grab mode)"
+#: editor.cc:3280
+msgid "Smart Mode (add range functions to Grab Mode)"
 msgstr "智能模式(添加范围功能到抓取模式)"
 
-#: editor.cc:3211
+#: editor.cc:3281
 msgid "Grab Mode (select/move objects)"
 msgstr "抓取模式(选择/移动对象物体)"
 
-#: editor.cc:3212
+#: editor.cc:3282
 msgid "Cut Mode (split regions)"
 msgstr "切割模式(拆分区域)"
 
-#: editor.cc:3213
+#: editor.cc:3283
 msgid "Range Mode (select time ranges)"
 msgstr "范围模式(选择时间范围)"
 
-#: editor.cc:3214
+#: editor.cc:3284
 msgid "Draw Mode (draw and edit gain/notes/automation)"
 msgstr "描绘模式(描绘和编辑增益/音符/自动化)"
 
-#: editor.cc:3215
+#: editor.cc:3285
 msgid "Stretch Mode (time-stretch audio and midi regions, preserving pitch)"
 msgstr "延伸模式(时间延伸音频和MIDI区域,保持音高)"
 
-#: editor.cc:3216
+#: editor.cc:3286
 msgid "Audition Mode (listen to regions)"
 msgstr "监听模式(试听区域)"
 
-#: editor.cc:3217
-msgid "Internal Edit Mode (edit notes and gain curves inside regions)"
+#: editor.cc:3287
+msgid "Internal Edit Mode (edit notes and automation points)"
 msgstr "内部编辑模式(在区域内编辑音符和增益曲线)"
 
-#: editor.cc:3218
+#: editor.cc:3288
 msgid ""
 "Groups: click to (de)activate\n"
 "Context-click for other operations"
@@ -3127,59 +3648,63 @@ msgstr ""
 "分组:点击(不)启用\n"
 "右键点击其它操作"
 
-#: editor.cc:3219
+#: editor.cc:3289
 msgid "Nudge Region/Selection Later"
 msgstr "向后微调区域/已选择部分"
 
-#: editor.cc:3220
+#: editor.cc:3290
 msgid "Nudge Region/Selection Earlier"
 msgstr "向前微调区域/已选择部分"
 
-#: editor.cc:3221 editor_actions.cc:262
+#: editor.cc:3291 editor_actions.cc:272
 msgid "Zoom In"
-msgstr "放大"
+msgstr "推近放大"
 
-#: editor.cc:3222 editor_actions.cc:261
+#: editor.cc:3292 editor_actions.cc:271
 msgid "Zoom Out"
-msgstr "缩小"
+msgstr "拉远缩小"
 
-#: editor.cc:3223
+#: editor.cc:3293
 msgid "Zoom to Time Scale"
 msgstr "缩放至时间比例"
 
-#: editor.cc:3224 editor.cc:3729 editor_actions.cc:263
+#: editor.cc:3294 editor.cc:3797 editor_actions.cc:273
 msgid "Zoom to Session"
 msgstr "缩放至整个会话"
 
-#: editor.cc:3225
-msgid "Zoom focus"
+#: editor.cc:3295 editor_actions.cc:115 editor_actions.cc:148
+msgid "Zoom Focus"
 msgstr "缩放焦点"
 
-#: editor.cc:3226
+#: editor.cc:3296
 msgid "Expand Tracks"
 msgstr "扩展音轨"
 
-#: editor.cc:3227
+#: editor.cc:3297
 msgid "Shrink Tracks"
 msgstr "收缩音轨"
 
-#: editor.cc:3228
+#: editor.cc:3298
 msgid "Number of visible tracks"
-msgstr "可见音轨数量"
+msgstr "可见音轨的数量"
 
-#: editor.cc:3229
+#: editor.cc:3299
 msgid "Snap/Grid Units"
-msgstr "吸附/网格单位"
+msgstr "吸附/网格单元"
 
-#: editor.cc:3230
+#: editor.cc:3300
 msgid "Snap/Grid Mode"
 msgstr "吸附/网格模式"
 
-#: editor.cc:3232
+#: editor.cc:3301 editor_actions.cc:101
+msgid "Edit Point"
+msgstr "编辑点"
+
+#: editor.cc:3302
 msgid "Edit Mode"
 msgstr "编辑模式"
 
-#: editor.cc:3233
+#: editor.cc:3303
 msgid ""
 "Nudge Clock\n"
 "(controls distance used to nudge regions and selections)"
@@ -3187,123 +3712,124 @@ msgstr ""
 "微调计时器\n"
 "(使用微调区域和已选择部分来控制距离)"
 
-#: editor.cc:3501 editor_actions.cc:313
+#: editor.cc:3571 editor_actions.cc:335
 msgid "Command|Undo"
 msgstr "命令|撤销"
 
-#: editor.cc:3503
+#: editor.cc:3573
 msgid "Command|Undo (%1)"
 msgstr "命令|撤销(%1)"
 
-#: editor.cc:3510 editor_actions.cc:315 editor_actions.cc:316 editor_actions.cc:317
+#: editor.cc:3580 editor_actions.cc:337 editor_actions.cc:338
+#: editor_actions.cc:339
 msgid "Redo"
 msgstr "重做"
 
-#: editor.cc:3512
+#: editor.cc:3583
 msgid "Redo (%1)"
 msgstr "重做(%1)"
 
-#: editor.cc:3531 editor.cc:3555 editor_actions.cc:110 editor_actions.cc:1846
+#: editor.cc:3603 editor.cc:3627 editor_actions.cc:113 editor_actions.cc:1863
 msgid "Duplicate"
 msgstr "复制"
 
-#: editor.cc:3532
+#: editor.cc:3604
 msgid "Number of duplications:"
-msgstr "复制数量:"
+msgstr "复制的数量:"
 
-#: editor.cc:3706 route_group_dialog.cc:51 time_info_box.cc:67
+#: editor.cc:3774 route_group_dialog.cc:51 time_info_box.cc:61
 msgid "Selection"
 msgstr "已选择部分"
 
-#: editor.cc:3709
+#: editor.cc:3777
 msgid "Fit 1 track"
-msgstr "匹配音轨"
+msgstr "匹配1音轨"
 
-#: editor.cc:3710
+#: editor.cc:3778
 msgid "Fit 2 tracks"
 msgstr "匹配2音轨"
 
-#: editor.cc:3711
+#: editor.cc:3779
 msgid "Fit 4 tracks"
 msgstr "匹配4音轨"
 
-#: editor.cc:3712
+#: editor.cc:3780
 msgid "Fit 8 tracks"
 msgstr "匹配8音轨"
 
-#: editor.cc:3713
+#: editor.cc:3781
 msgid "Fit 16 tracks"
 msgstr "匹配16音轨"
 
-#: editor.cc:3714
+#: editor.cc:3782
 msgid "Fit 24 tracks"
 msgstr "匹配24音轨"
 
-#: editor.cc:3715
+#: editor.cc:3783
 msgid "Fit 32 tracks"
 msgstr "匹配32音轨"
 
-#: editor.cc:3716
+#: editor.cc:3784
 msgid "Fit 48 tracks"
 msgstr "匹配48音轨"
 
-#: editor.cc:3717
+#: editor.cc:3785
 msgid "Fit All tracks"
 msgstr "匹配所有音轨"
 
-#: editor.cc:3718
+#: editor.cc:3786
 msgid "Fit Selection"
 msgstr "匹配已选择部分"
 
-#: editor.cc:3720
+#: editor.cc:3788 editor_actions.cc:288
 msgid "Zoom to 10 ms"
-msgstr "缩放至 10 毫秒"
+msgstr "缩放至10毫秒"
 
-#: editor.cc:3721
+#: editor.cc:3789 editor_actions.cc:289
 msgid "Zoom to 100 ms"
-msgstr "缩放至 100 毫秒"
+msgstr "缩放至100毫秒"
 
-#: editor.cc:3722
+#: editor.cc:3790 editor_actions.cc:290
 msgid "Zoom to 1 sec"
-msgstr "缩放至 1 秒"
+msgstr "缩放至1秒"
 
-#: editor.cc:3723
+#: editor.cc:3791 editor_actions.cc:291
 msgid "Zoom to 10 sec"
-msgstr "缩放至 10 秒"
+msgstr "缩放至10秒"
 
-#: editor.cc:3724
+#: editor.cc:3792 editor_actions.cc:292
 msgid "Zoom to 1 min"
-msgstr "缩放至 1 分钟"
+msgstr "缩放至1分钟"
 
-#: editor.cc:3725
+#: editor.cc:3793 editor_actions.cc:294
 msgid "Zoom to 10 min"
-msgstr "缩放至 10 分钟"
+msgstr "缩放至10分钟"
 
-#: editor.cc:3726
+#: editor.cc:3794
 msgid "Zoom to 1 hour"
-msgstr "缩放至 1 小时"
+msgstr "缩放至1小时"
 
-#: editor.cc:3727
+#: editor.cc:3795
 msgid "Zoom to 8 hours"
-msgstr "缩放至 8 小时"
+msgstr "缩放至8小时"
 
-#: editor.cc:3728
+#: editor.cc:3796
 msgid "Zoom to 24 hours"
-msgstr "缩放至 24 小时"
+msgstr "缩放至24小时"
 
-#: editor.cc:3730
+#: editor.cc:3798
 msgid "Zoom to Range/Region Selection"
 msgstr "缩放至范围/区域已选择部分"
 
-#: editor.cc:3800
+#: editor.cc:3868
 msgid "*"
 msgstr ""
 
-#: editor.cc:4120
+#: editor.cc:4135
 msgid "Playlist Deletion"
 msgstr "播放列表删除部分"
 
-#: editor.cc:4121
+#: editor.cc:4136
 msgid ""
 "Playlist %1 is currently unused.\n"
 "If it is kept, its audio files will not be cleaned.\n"
@@ -3313,1295 +3839,1380 @@ msgstr ""
 "如果保留它,它的音频文件将不会被清除。\n"
 "如果删除它,它单独使用过的音频文件将会被清除。"
 
-#: editor.cc:4131
+#: editor.cc:4146
+msgid "Delete All Unused"
+msgstr "删除所有未使用的"
+
+#: editor.cc:4147
 msgid "Delete Playlist"
 msgstr "删除播放列表"
 
-#: editor.cc:4132
+#: editor.cc:4148
 msgid "Keep Playlist"
 msgstr "保留播放列表"
 
-#: editor.cc:4133 editor_audio_import.cc:594 editor_ops.cc:6174
-#: engine_dialog.cc:2083 sfdb_freesound_mootcher.cc:69 processor_box.cc:2219
-#: processor_box.cc:2244
+#: editor.cc:4149
+msgid "Keep Remaining"
+msgstr "保留剩余的"
+
+#: editor.cc:4150 editor_audio_import.cc:600 editor_ops.cc:6530
+#: engine_dialog.cc:2986 sfdb_freesound_mootcher.cc:69 processor_box.cc:3443
+#: processor_box.cc:3468
 msgid "Cancel"
 msgstr "取消"
 
-#: editor.cc:4275
+#: editor.cc:4292
 msgid "new playlists"
 msgstr "新建播放列表"
 
-#: editor.cc:4291
+#: editor.cc:4308
 msgid "copy playlists"
 msgstr "复制播放列表"
 
-#: editor.cc:4306
+#: editor.cc:4323
 msgid "clear playlists"
 msgstr "清除播放列表"
 
-#: editor.cc:5046
+#: editor.cc:5048
 msgid "Please wait while %1 loads visual data."
-msgstr "请等候 %1 载入可见数据。"
+msgstr "请等候 %1 载入可见数据"
+
+#: editor.cc:5811 editor_actions.cc:479
+msgid "Unset #%1"
+msgstr "复位 #%1"
+
+#: editor.cc:5812 editor_actions.cc:481
+msgid "no action bound"
+msgstr "没有动作绑定"
 
-#: editor.cc:5901 editor.cc:5932 editor_markers.cc:985 panner_ui.cc:410
-#: processor_box.cc:2482
+#: editor.cc:5961 editor.cc:5996 editor_markers.cc:998 editor_markers.cc:1018
+#: panner_ui.cc:412 processor_box.cc:3715
 msgid "Edit..."
 msgstr "编辑…"
 
-#: editor.cc:5934 editor_actions.cc:1941
+#: editor.cc:6002 editor_actions.cc:1842
+msgid "Transpose..."
+msgstr "变调…"
+
+#: editor.cc:6006 editor_actions.cc:1959
 msgid "Legatize"
-msgstr " 合法化"
+msgstr "合法化"
 
-#: editor.cc:5936 editor_actions.cc:1940
+#: editor.cc:6012 editor_actions.cc:1958
 msgid "Quantize..."
 msgstr "量化…"
 
-#: editor.cc:5938 editor_actions.cc:1943
+#: editor.cc:6015 editor_actions.cc:1961
 msgid "Remove Overlap"
 msgstr "移除重叠"
 
-#: editor.cc:5940 editor_actions.cc:1942
+#: editor.cc:6021 editor_actions.cc:1960
 msgid "Transform..."
 msgstr "变换…"
 
-#: editor_actions.cc:92
+#: editor_actions.cc:95
 msgid "Autoconnect"
 msgstr "自动连接"
 
-#: editor_actions.cc:93
+#: editor_actions.cc:96
 msgid "Crossfades"
-msgstr "淡入淡出(交叉淡化)"
+msgstr "交叉淡化(淡入淡出)"
 
-#: editor_actions.cc:95
+#: editor_actions.cc:98
 msgid "Move Selected Marker"
 msgstr "移动已选择的标记"
 
-#: editor_actions.cc:96
+#: editor_actions.cc:99
 msgid "Select Range Operations"
 msgstr "选择范围操作"
 
-#: editor_actions.cc:97
+#: editor_actions.cc:100
 msgid "Select Regions"
 msgstr "选择区域"
 
-#: editor_actions.cc:98
-msgid "Edit Point"
-msgstr "编辑点"
-
-#: editor_actions.cc:99
+#: editor_actions.cc:102
 msgid "Fade"
 msgstr "淡化"
 
-#: editor_actions.cc:100
+#: editor_actions.cc:103
 msgid "Latch"
-msgstr "短锁"
+msgstr "暂锁"
 
-#: editor_actions.cc:101 editor_regions.cc:112 region_editor.cc:46
+#: editor_actions.cc:104 editor_regions.cc:159 region_editor.cc:48
 msgid "Region"
 msgstr "区域"
 
-#: editor_actions.cc:102
+#: editor_actions.cc:105
 msgid "Layering"
 msgstr "分层"
 
-#: editor_actions.cc:103 editor_regions.cc:113 stereo_panner_editor.cc:44
+#: editor_actions.cc:106 editor_regions.cc:160 stereo_panner_editor.cc:46
 msgid "Position"
 msgstr "位置"
 
-#: editor_actions.cc:105 gain_meter.cc:156 gain_meter.cc:825 panner_ui.cc:178
-#: panner_ui.cc:635
+#: editor_actions.cc:108 gain_meter.cc:161 gain_meter.cc:848 panner_ui.cc:178
+#: panner_ui.cc:637 route_time_axis.cc:541
 msgid "Trim"
 msgstr "修剪"
 
-#: editor_actions.cc:106 editor_actions.cc:126 route_group_dialog.cc:46
+#: editor_actions.cc:109 editor_actions.cc:129 route_group_dialog.cc:46
 msgid "Gain"
 msgstr "增益"
 
-#: editor_actions.cc:107 editor_actions.cc:563
+#: editor_actions.cc:110 editor_actions.cc:604
 msgid "Ranges"
 msgstr "范围"
 
-#: editor_actions.cc:108 editor_actions.cc:1842 session_option_editor.cc:135
+#: editor_actions.cc:111 editor_actions.cc:1859 session_option_editor.cc:135
 #: session_option_editor.cc:144 session_option_editor.cc:151
+#: session_option_editor.cc:158 session_option_editor.cc:165
 msgid "Fades"
 msgstr "淡化"
 
-#: editor_actions.cc:111
+#: editor_actions.cc:114
 msgid "Link"
 msgstr "链接"
 
-#: editor_actions.cc:112 editor_actions.cc:145
-msgid "Zoom Focus"
-msgstr "缩放焦点"
-
-#: editor_actions.cc:113
+#: editor_actions.cc:116
 msgid "Locate to Markers"
 msgstr "定位到标记"
 
-#: editor_actions.cc:115
+#: editor_actions.cc:118
 msgid "Meter falloff"
 msgstr "节拍衰减"
 
-#: editor_actions.cc:116
+#: editor_actions.cc:119
 msgid "Meter hold"
 msgstr "节拍保持"
 
-#: editor_actions.cc:117 session_option_editor.cc:321
+#: editor_actions.cc:120 session_option_editor.cc:342
 msgid "MIDI Options"
 msgstr "MIDI选项"
 
-#: editor_actions.cc:118
+#: editor_actions.cc:121
 msgid "Misc Options"
 msgstr "其它选项"
 
-#: editor_actions.cc:119 rc_option_editor.cc:1809 route_group_dialog.cc:54
-#: session_option_editor.cc:243 session_option_editor.cc:250
+#: editor_actions.cc:122 rc_option_editor.cc:2401 route_group_dialog.cc:54
+#: session_option_editor.cc:264 session_option_editor.cc:271
 msgid "Monitoring"
 msgstr "监控中"
 
-#: editor_actions.cc:120
+#: editor_actions.cc:123
 msgid "Active Mark"
-msgstr "启用标记"
+msgstr "激活标记"
 
-#: editor_actions.cc:123
+#: editor_actions.cc:126
 msgid "Primary Clock"
 msgstr "主计时器"
 
-#: editor_actions.cc:124
+#: editor_actions.cc:127
 msgid "Pullup / Pulldown"
-msgstr "向上拖动/向下拖动"
+msgstr "向上拖动 / 向下拖动"
 
-#: editor_actions.cc:125
+#: editor_actions.cc:128
 msgid "Region operations"
 msgstr "区域操作"
 
-#: editor_actions.cc:127 ruler_dialog.cc:28
+#: editor_actions.cc:130 ruler_dialog.cc:28
 msgid "Rulers"
 msgstr "标尺"
 
-#: editor_actions.cc:128
+#: editor_actions.cc:131
 msgid "Views"
 msgstr "视图"
 
-#: editor_actions.cc:129
+#: editor_actions.cc:132
 msgid "Scroll"
 msgstr "滚动"
 
-#: editor_actions.cc:130
+#: editor_actions.cc:133
 msgid "Secondary Clock"
 msgstr "第二计时器"
 
-#: editor_actions.cc:137
+#: editor_actions.cc:140
 msgid "Subframes"
 msgstr "子框架"
 
-#: editor_actions.cc:140
+#: editor_actions.cc:143
 msgid "Timecode fps"
-msgstr "时间码FPS"
+msgstr "时间码 fps(帧每秒)"
 
-#: editor_actions.cc:141 route_time_axis.cc:575
+#: editor_actions.cc:144 route_time_axis.cc:599
 msgid "Height"
 msgstr "高度"
 
-#: editor_actions.cc:143
+#: editor_actions.cc:146
 msgid "Tools"
 msgstr "工具"
 
-#: editor_actions.cc:144
+#: editor_actions.cc:147
 msgid "View"
 msgstr "视图"
 
-#: editor_actions.cc:146
+#: editor_actions.cc:149
 msgid "Zoom"
 msgstr "缩放"
 
-#: editor_actions.cc:152
-msgid "Break drag or deselect all"
-msgstr "终止拖拽或取消选择所有"
+#: editor_actions.cc:150
+msgid "Scripted Actions"
+msgstr "脚本化的行为"
 
 #: editor_actions.cc:159
+msgid "Session|Lock"
+msgstr "会话|锁定"
+
+#: editor_actions.cc:161
 msgid "Show Editor Mixer"
 msgstr "显示编辑器混音器"
 
-#: editor_actions.cc:160
+#: editor_actions.cc:162
 msgid "Show Editor List"
 msgstr "显示编辑器列表"
 
-#: editor_actions.cc:162
+#: editor_actions.cc:164
 msgid "Playhead to Next Region Boundary"
 msgstr "指针到下一个区域边界"
 
-#: editor_actions.cc:163
+#: editor_actions.cc:165
 msgid "Playhead to Next Region Boundary (No Track Selection)"
 msgstr "指针到下一个区域边界(无音轨已选择部分)"
 
-#: editor_actions.cc:164
+#: editor_actions.cc:166
 msgid "Playhead to Previous Region Boundary"
 msgstr "指针到上一个区域边界"
 
-#: editor_actions.cc:165
+#: editor_actions.cc:167
 msgid "Playhead to Previous Region Boundary (No Track Selection)"
 msgstr "指针到上一个区域边界(无音轨已选择部分)"
 
-#: editor_actions.cc:167
+#: editor_actions.cc:169
 msgid "Playhead to Next Region Start"
 msgstr "指针到下一个区域起点"
 
-#: editor_actions.cc:168
+#: editor_actions.cc:170
 msgid "Playhead to Next Region End"
 msgstr "指针到下一个区域终点"
 
-#: editor_actions.cc:169
+#: editor_actions.cc:171
 msgid "Playhead to Next Region Sync"
 msgstr "播放头到下一个区域同步"
 
-#: editor_actions.cc:171
+#: editor_actions.cc:173
 msgid "Playhead to Previous Region Start"
 msgstr "指针到上一个区域起点"
 
-#: editor_actions.cc:172
+#: editor_actions.cc:174
 msgid "Playhead to Previous Region End"
 msgstr "指针到上一个区域终点"
 
-#: editor_actions.cc:173
+#: editor_actions.cc:175
 msgid "Playhead to Previous Region Sync"
 msgstr "指针到下一个区域同步"
 
-#: editor_actions.cc:175
+#: editor_actions.cc:177
 msgid "To Next Region Boundary"
 msgstr "到下一个区域边界"
 
-#: editor_actions.cc:176
+#: editor_actions.cc:178
 msgid "To Next Region Boundary (No Track Selection)"
 msgstr "到下一个区域边界(无音轨已选择部分)"
 
-#: editor_actions.cc:177
+#: editor_actions.cc:179
 msgid "To Previous Region Boundary"
 msgstr "到上一个区域边界"
 
-#: editor_actions.cc:178
+#: editor_actions.cc:180
 msgid "To Previous Region Boundary (No Track Selection)"
 msgstr "到上一个区域边界(无音轨已选择部分)"
 
-#: editor_actions.cc:180
+#: editor_actions.cc:182
 msgid "To Next Region Start"
 msgstr "到下一个区域起点"
 
-#: editor_actions.cc:181
+#: editor_actions.cc:183
 msgid "To Next Region End"
 msgstr "到下一个区域终点"
 
-#: editor_actions.cc:182
+#: editor_actions.cc:184
 msgid "To Next Region Sync"
 msgstr "到下一个区域同步"
 
-#: editor_actions.cc:184
+#: editor_actions.cc:186
 msgid "To Previous Region Start"
 msgstr "到上一个区域起点"
 
-#: editor_actions.cc:185
+#: editor_actions.cc:187
 msgid "To Previous Region End"
 msgstr "到上一个区域终点"
 
-#: editor_actions.cc:186
+#: editor_actions.cc:188
 msgid "To Previous Region Sync"
 msgstr "到上一个区域同步"
 
-#: editor_actions.cc:188
+#: editor_actions.cc:190
 msgid "To Range Start"
 msgstr "到范围起点"
 
-#: editor_actions.cc:189
+#: editor_actions.cc:191
 msgid "To Range End"
 msgstr "到范围终点"
 
-#: editor_actions.cc:191
+#: editor_actions.cc:193
 msgid "Playhead to Range Start"
 msgstr "指针到范围起点"
 
-#: editor_actions.cc:192
+#: editor_actions.cc:194
 msgid "Playhead to Range End"
 msgstr "指针到范围终点"
 
-#: editor_actions.cc:195
+#: editor_actions.cc:197
 msgid "Select All Tracks"
 msgstr "选择所有音轨"
 
-#: editor_actions.cc:196 export_timespan_selector.cc:61 processor_box.cc:2468
+#: editor_actions.cc:198 export_timespan_selector.cc:62 processor_box.cc:3697
 msgid "Deselect All"
 msgstr "反选所有"
 
-#: editor_actions.cc:204
+#: editor_actions.cc:210
 msgid "Select All Overlapping Edit Range"
 msgstr "选择所有重叠的编辑范围"
 
-#: editor_actions.cc:205
+#: editor_actions.cc:211
 msgid "Select All Inside Edit Range"
 msgstr "选择所有内部的编辑范围"
 
-#: editor_actions.cc:207
+#: editor_actions.cc:213
 msgid "Select Edit Range"
 msgstr "选择编辑范围"
 
-#: editor_actions.cc:209
+#: editor_actions.cc:215
 msgid "Select All in Punch Range"
 msgstr "选择所有在切换范围内的"
 
-#: editor_actions.cc:210
+#: editor_actions.cc:216
 msgid "Select All in Loop Range"
 msgstr "选择所有在循环范围内的"
 
-#: editor_actions.cc:212
+#: editor_actions.cc:218
 msgid "Select Next Track or Bus"
 msgstr "选择下一个音轨或总线"
 
-#: editor_actions.cc:213
+#: editor_actions.cc:219
 msgid "Select Previous Track or Bus"
 msgstr "选择上一个音轨或总线"
 
-#: editor_actions.cc:215
+#: editor_actions.cc:221
 msgid "Toggle Record Enable"
 msgstr "切换录制启用"
 
-#: editor_actions.cc:217
+#: editor_actions.cc:223
 msgid "Toggle Solo"
-msgstr "切独奏"
+msgstr "切换独奏"
 
-#: editor_actions.cc:219
+#: editor_actions.cc:225
 msgid "Toggle Mute"
 msgstr "切换静音"
 
-#: editor_actions.cc:221
+#: editor_actions.cc:227
 msgid "Toggle Solo Isolate"
 msgstr "切换独奏隔离"
 
-#: editor_actions.cc:226
+#: editor_actions.cc:232
 msgid "Save View %1"
 msgstr "保存视图 %1"
 
-#: editor_actions.cc:232
+#: editor_actions.cc:238
 msgid "Go to View %1"
 msgstr "跳转到视图 %1"
 
-#: editor_actions.cc:238
+#: editor_actions.cc:244
 msgid "Locate to Mark %1"
 msgstr "定位到标记 %1"
 
-#: editor_actions.cc:242 editor_actions.cc:243
+#: editor_actions.cc:249 editor_actions.cc:250
 msgid "Jump to Next Mark"
 msgstr "跳到下一个标记"
 
-#: editor_actions.cc:244 editor_actions.cc:245
+#: editor_actions.cc:251 editor_actions.cc:252
 msgid "Jump to Previous Mark"
 msgstr "跳到上一个标记"
 
-#: editor_actions.cc:247 editor_actions.cc:248
+#: editor_actions.cc:254
+msgid "Set Session Start from Playhead"
+msgstr "从指针处设置会话起点"
+
+#: editor_actions.cc:255
+msgid "Set Session End from Playhead"
+msgstr "从指针处设置会话终点"
+
+#: editor_actions.cc:257 editor_actions.cc:258
 msgid "Add Mark from Playhead"
-msgstr "从指针起添加标记"
+msgstr "从指针处添加标记"
 
-#: editor_actions.cc:250 editor_actions.cc:251
+#: editor_actions.cc:260 editor_actions.cc:261
 msgid "Remove Mark at Playhead"
 msgstr "移除指针处的标记"
 
-#: editor_actions.cc:253
+#: editor_actions.cc:263
 msgid "Nudge Next Later"
 msgstr "向后微调下一个"
 
-#: editor_actions.cc:254
+#: editor_actions.cc:264
 msgid "Nudge Next Earlier"
 msgstr "向前微调下一个"
 
-#: editor_actions.cc:256
+#: editor_actions.cc:266
 msgid "Nudge Playhead Forward"
 msgstr "微调指针前进"
 
-#: editor_actions.cc:257
+#: editor_actions.cc:267
 msgid "Nudge Playhead Backward"
 msgstr "微调指针后退"
 
-#: editor_actions.cc:258
-msgid "Playhead To Next Grid"
+#: editor_actions.cc:268
+msgid "Playhead to Next Grid"
 msgstr "指针转到下一个网格"
 
-#: editor_actions.cc:259
-msgid "Playhead To Previous Grid"
+#: editor_actions.cc:269
+msgid "Playhead to Previous Grid"
 msgstr "指针转到上一个网格"
 
-#: editor_actions.cc:264
+#: editor_actions.cc:274
 msgid "Zoom to Selection"
 msgstr "缩放至已选择部分"
 
-#: editor_actions.cc:265
+#: editor_actions.cc:275
 msgid "Toggle Zoom State"
 msgstr "切换缩放状态"
 
-#: editor_actions.cc:267
+#: editor_actions.cc:277
 msgid "Expand Track Height"
 msgstr "扩展音轨高度"
 
-#: editor_actions.cc:268
+#: editor_actions.cc:278
 msgid "Shrink Track Height"
 msgstr "收缩扩展音轨高度"
 
-#: editor_actions.cc:270
+#: editor_actions.cc:280
+msgid "Fit 1 Track"
+msgstr "匹配1音轨"
+
+#: editor_actions.cc:281
+msgid "Fit 2 Tracks"
+msgstr "匹配2音轨"
+
+#: editor_actions.cc:282
+msgid "Fit 4 Tracks"
+msgstr "匹配4音轨"
+
+#: editor_actions.cc:283
+msgid "Fit 8 Tracks"
+msgstr "匹配8音轨"
+
+#: editor_actions.cc:284
+msgid "Fit 16 Tracks"
+msgstr "匹配16音轨"
+
+#: editor_actions.cc:285
+msgid "Fit 32 Tracks"
+msgstr "匹配32音轨"
+
+#: editor_actions.cc:286
+msgid "Fit All Tracks"
+msgstr "匹配所有音轨"
+
+#: editor_actions.cc:293
+msgid "Zoom to 5 min"
+msgstr "缩放至5分钟"
+
+#: editor_actions.cc:296
 msgid "Move Selected Tracks Up"
 msgstr "向上移动已选中音轨"
 
-#: editor_actions.cc:272
+#: editor_actions.cc:298
 msgid "Move Selected Tracks Down"
 msgstr "向下移动已选中音轨"
 
-#: editor_actions.cc:275
+#: editor_actions.cc:301
 msgid "Scroll Tracks Up"
 msgstr "向上滚动音轨"
 
-#: editor_actions.cc:277
+#: editor_actions.cc:302
 msgid "Scroll Tracks Down"
 msgstr "向下滚动音轨"
 
-#: editor_actions.cc:279
+#: editor_actions.cc:303
 msgid "Step Tracks Up"
 msgstr "向上步进音轨"
 
-#: editor_actions.cc:281
+#: editor_actions.cc:304
 msgid "Step Tracks Down"
 msgstr "向下步进音轨"
 
-#: editor_actions.cc:284
+#: editor_actions.cc:306
 msgid "Scroll Backward"
 msgstr "向后滚动"
 
-#: editor_actions.cc:285
+#: editor_actions.cc:307
 msgid "Scroll Forward"
 msgstr "向前滚动"
 
-#: editor_actions.cc:286
+#: editor_actions.cc:308
 msgid "Center Playhead"
-msgstr "指针置中"
+msgstr "指针居中"
 
-#: editor_actions.cc:287
+#: editor_actions.cc:309
 msgid "Center Edit Point"
-msgstr "编辑点置中"
+msgstr "编辑点居中"
 
-#: editor_actions.cc:289
+#: editor_actions.cc:311
 msgid "Playhead Forward"
 msgstr "指针前进"
 
-#: editor_actions.cc:290
+#: editor_actions.cc:312
 msgid "Playhead Backward"
 msgstr "指针后退"
 
-#: editor_actions.cc:292
+#: editor_actions.cc:314
 msgid "Playhead to Active Mark"
 msgstr "指针跳转到激活的标记处"
 
-#: editor_actions.cc:293
+#: editor_actions.cc:315
 msgid "Active Mark to Playhead"
 msgstr "激活的标记跳转到指针处"
 
-#: editor_actions.cc:295
+#: editor_actions.cc:317
 msgid "Use Skip Ranges"
-msgstr "使用不连续的范围"
+msgstr "使用跳跃的范围"
 
-#: editor_actions.cc:302
+#: editor_actions.cc:324
 msgid "Play Selected Regions"
 msgstr "播放已选中的区域"
 
-#: editor_actions.cc:304
+#: editor_actions.cc:326
 msgid "Play from Edit Point and Return"
 msgstr "从编辑点播放并返回"
 
-#: editor_actions.cc:306
+#: editor_actions.cc:328
 msgid "Play Edit Range"
 msgstr "播放编辑范围"
 
-#: editor_actions.cc:308
+#: editor_actions.cc:330
 msgid "Playhead to Mouse"
 msgstr "指针跳转到鼠标处"
 
-#: editor_actions.cc:309
+#: editor_actions.cc:331
 msgid "Active Marker to Mouse"
 msgstr "激活的标记跳转到鼠标处"
 
-#: editor_actions.cc:319
+#: editor_actions.cc:341
 msgid "Undo Selection Change"
-msgstr "撤销已选中部分的改动"
+msgstr "撤销已选择部分的改动"
 
-#: editor_actions.cc:320
+#: editor_actions.cc:342
 msgid "Redo Selection Change"
-msgstr "重做已选中部分的改动"
+msgstr "重做已选择部分的改动"
 
-#: editor_actions.cc:322
+#: editor_actions.cc:344
 msgid "Export Audio"
 msgstr "导出音频"
 
-#: editor_actions.cc:323 export_dialog.cc:396
+#: editor_actions.cc:345 export_dialog.cc:476
 msgid "Export Range"
 msgstr "导出范围"
 
-#: editor_actions.cc:328
+#: editor_actions.cc:350
 msgid "Separate Using Punch Range"
 msgstr "使用切换范围分离"
 
-#: editor_actions.cc:331
+#: editor_actions.cc:353
 msgid "Separate Using Loop Range"
 msgstr "使用循环范围分离"
 
-#: editor_actions.cc:334 editor_actions.cc:356
+#: editor_actions.cc:356 editor_actions.cc:379
 msgid "Crop"
 msgstr "剪裁"
 
-#: editor_actions.cc:344
+#: editor_actions.cc:366
 msgid "Fade Range Selection"
-msgstr "淡化范围已选中部分"
+msgstr "淡化范围已选择部分"
 
-#: editor_actions.cc:346
+#: editor_actions.cc:368
 msgid "Set Tempo from Edit Range = Bar"
-msgstr "从编辑范围设置节奏 = 小节"
+msgstr "从编辑范围设置节奏=小节"
 
-#: editor_actions.cc:348
+#: editor_actions.cc:371
 msgid "Log"
 msgstr "日志"
 
-#: editor_actions.cc:351 editor_actions.cc:353
+#: editor_actions.cc:374 editor_actions.cc:376
 msgid "Move to Next Transient"
 msgstr "移动到下一个过渡"
 
-#: editor_actions.cc:352 editor_actions.cc:354
+#: editor_actions.cc:375 editor_actions.cc:377
 msgid "Move to Previous Transient"
 msgstr "移动到上一个过渡"
 
-#: editor_actions.cc:358 editor_actions.cc:361
+#: editor_actions.cc:381
+msgid "Start Range from Playhead"
+msgstr "从指针处开始范围"
+
+#: editor_actions.cc:382
+msgid "Finish Range from Playhead"
+msgstr "从指针处结束范围"
+
+#: editor_actions.cc:384 editor_actions.cc:393
 msgid "Start Range"
 msgstr "开始范围"
 
-#: editor_actions.cc:359 editor_actions.cc:362
+#: editor_actions.cc:385 editor_actions.cc:394
 msgid "Finish Range"
 msgstr "结束范围"
 
-#: editor_actions.cc:394
+#: editor_actions.cc:387
+msgid "Start Punch Range"
+msgstr "开始切换范围"
+
+#: editor_actions.cc:388
+msgid "Finish Punch Range"
+msgstr "结束切换范围"
+
+#: editor_actions.cc:390
+msgid "Start Loop Range"
+msgstr "开始循环范围"
+
+#: editor_actions.cc:391
+msgid "Finish Loop Range"
+msgstr "结束循环范围"
+
+#: editor_actions.cc:426
 msgid "Follow Playhead"
 msgstr "跟随指针"
 
-#: editor_actions.cc:395
+#: editor_actions.cc:427
 msgid "Remove Last Capture"
 msgstr "移除已捕获内容"
 
-#: editor_actions.cc:397
+#: editor_actions.cc:429
 msgid "Stationary Playhead"
 msgstr "固定指针"
 
-#: editor_actions.cc:399 insert_time_dialog.cc:32
+#: editor_actions.cc:431 insert_remove_time_dialog.cc:32
 msgid "Insert Time"
 msgstr "插入时间"
 
-#: editor_actions.cc:402
+#: editor_actions.cc:433 insert_remove_time_dialog.cc:32
+msgid "Remove Time"
+msgstr "移除时间"
+
+#: editor_actions.cc:438
 msgid "Toggle Active"
 msgstr "切换激活"
 
-#: editor_actions.cc:407 editor_actions.cc:1768 editor_markers.cc:921
-#: editor_markers.cc:986 editor_snapshots.cc:122 mixer_strip.cc:1543
-#: route_time_axis.cc:856
+#: editor_actions.cc:440 editor_actions.cc:1785 editor_markers.cc:926
+#: editor_markers.cc:999 editor_markers.cc:1019 editor_snapshots.cc:134
+#: lua_script_manager.cc:32 lua_script_manager.cc:36 mixer_strip.cc:1713
+#: route_time_axis.cc:870 vca_master_strip.cc:400
 msgid "Remove"
 msgstr "移除"
 
-#: editor_actions.cc:411
+#: editor_actions.cc:445
 msgid "Fit Selection (Vertical)"
-msgstr " 匹配已选择部分(垂直)"
+msgstr "匹配已选择部分(垂直)"
 
-#: editor_actions.cc:413 time_axis_view.cc:1371
+#: editor_actions.cc:447 time_axis_view.cc:1287
 msgid "Largest"
 msgstr "最大的"
 
-#: editor_actions.cc:416 time_axis_view.cc:1372
+#: editor_actions.cc:450 time_axis_view.cc:1288
 msgid "Larger"
 msgstr "更大的"
 
-#: editor_actions.cc:419 editor_rulers.cc:249 time_axis_view.cc:1373
+#: editor_actions.cc:453 editor_rulers.cc:248 time_axis_view.cc:1289
 msgid "Large"
 msgstr "大"
 
-#: editor_actions.cc:425 editor_rulers.cc:253 time_axis_view.cc:1375
+#: editor_actions.cc:459 editor_rulers.cc:252 time_axis_view.cc:1291
 msgid "Small"
 msgstr "小"
 
-#: editor_actions.cc:429
+#: editor_actions.cc:463
 msgid "Sound Selected MIDI Notes"
-msgstr "声音已选择部分MIDI音符"
+msgstr "声音已选择MIDI音符"
 
-#: editor_actions.cc:434
+#: editor_actions.cc:468
 msgid "Zoom Focus Left"
 msgstr "以左侧为焦点缩放"
 
-#: editor_actions.cc:435
+#: editor_actions.cc:469
 msgid "Zoom Focus Right"
 msgstr "以右侧为焦点缩放"
 
-#: editor_actions.cc:436
+#: editor_actions.cc:470
 msgid "Zoom Focus Center"
 msgstr "以中央为焦点缩放"
 
-#: editor_actions.cc:437
+#: editor_actions.cc:471
 msgid "Zoom Focus Playhead"
 msgstr "以指针为焦点缩放"
 
-#: editor_actions.cc:438
+#: editor_actions.cc:472
 msgid "Zoom Focus Mouse"
 msgstr "以鼠标为焦点缩放"
 
-#: editor_actions.cc:439
+#: editor_actions.cc:473
 msgid "Zoom Focus Edit Point"
 msgstr "以编辑点为焦点缩放"
 
-#: editor_actions.cc:441
+#: editor_actions.cc:475
 msgid "Next Zoom Focus"
 msgstr "下一个缩放焦点"
 
-#: editor_actions.cc:447
+#: editor_actions.cc:488
 msgid "Smart Object Mode"
 msgstr "智能对象物体模式"
 
-#: editor_actions.cc:450
+#: editor_actions.cc:491
 msgid "Smart"
 msgstr "智能"
 
-#: editor_actions.cc:453
+#: editor_actions.cc:494
 msgid "Object Tool"
 msgstr "对象物体工具"
 
-#: editor_actions.cc:458
+#: editor_actions.cc:499
 msgid "Range Tool"
 msgstr "范围工具"
 
-#: editor_actions.cc:463
+#: editor_actions.cc:504
 msgid "Note Drawing Tool"
 msgstr "音符描绘工具"
 
-#: editor_actions.cc:468
+#: editor_actions.cc:509
 msgid "Audition Tool"
 msgstr "监听工具"
 
-#: editor_actions.cc:473
+#: editor_actions.cc:514
 msgid "Time FX Tool"
 msgstr "时间特效工具"
 
-#: editor_actions.cc:478
+#: editor_actions.cc:519
 msgid "Content Tool"
 msgstr "内容工具"
 
-#: editor_actions.cc:484
+#: editor_actions.cc:525
 msgid "Cut Tool"
-msgstr " 切割工具"
+msgstr "切割工具"
 
-#: editor_actions.cc:490
+#: editor_actions.cc:531
 msgid "Step Mouse Mode"
 msgstr "步进鼠标模式"
 
-#: editor_actions.cc:497
+#: editor_actions.cc:538
 msgid "Change Edit Point"
 msgstr "改变编辑点"
 
-#: editor_actions.cc:498
+#: editor_actions.cc:539
 msgid "Change Edit Point Including Marker"
 msgstr "改变编辑点包括标记"
 
-#: editor_actions.cc:504
+#: editor_actions.cc:544
+msgid "EditMode|Lock"
+msgstr "编辑模式|锁定"
+
+#: editor_actions.cc:545
 msgid "Cycle Edit Mode"
 msgstr "循环编辑模式"
 
-#: editor_actions.cc:506
+#: editor_actions.cc:547
 msgid "Snap to"
 msgstr "吸附到"
 
-#: editor_actions.cc:507
+#: editor_actions.cc:548
 msgid "Snap Mode"
 msgstr "吸附模式"
 
-#: editor_actions.cc:514
+#: editor_actions.cc:555
 msgid "Next Snap Mode"
 msgstr "下一个吸附模式"
 
-#: editor_actions.cc:515
+#: editor_actions.cc:556
 msgid "Next Snap Choice"
 msgstr "下一个吸附选择"
 
-#: editor_actions.cc:516
+#: editor_actions.cc:557
 msgid "Next Musical Snap Choice"
 msgstr "下一个配乐的吸附选择"
 
-#: editor_actions.cc:517
+#: editor_actions.cc:558
 msgid "Previous Snap Choice"
 msgstr "上一个吸附选择"
 
-#: editor_actions.cc:518
+#: editor_actions.cc:559
 msgid "Previous Musical Snap Choice"
 msgstr "上一个配乐的吸附选择"
 
-#: editor_actions.cc:523
+#: editor_actions.cc:564
 msgid "Snap to CD Frame"
 msgstr "吸附到CD框架"
 
-#: editor_actions.cc:524
+#: editor_actions.cc:565
 msgid "Snap to Timecode Frame"
 msgstr "吸附到时间码框架"
 
-#: editor_actions.cc:525
+#: editor_actions.cc:566
 msgid "Snap to Timecode Seconds"
 msgstr "吸附到时间码秒"
 
-#: editor_actions.cc:526
+#: editor_actions.cc:567
 msgid "Snap to Timecode Minutes"
 msgstr "吸附到时间码分"
 
-#: editor_actions.cc:527
+#: editor_actions.cc:568
 msgid "Snap to Seconds"
 msgstr "吸附到秒"
 
-#: editor_actions.cc:528
+#: editor_actions.cc:569
 msgid "Snap to Minutes"
 msgstr "吸附到分"
 
-#: editor_actions.cc:530
+#: editor_actions.cc:571
 msgid "Snap to One Twenty Eighths"
 msgstr "吸附到一百二十八分之一"
 
-#: editor_actions.cc:531
+#: editor_actions.cc:572
 msgid "Snap to Sixty Fourths"
 msgstr "吸附到六十四分之一"
 
-#: editor_actions.cc:532
+#: editor_actions.cc:573
 msgid "Snap to Thirty Seconds"
 msgstr "吸附到三十二分之一"
 
-#: editor_actions.cc:533
+#: editor_actions.cc:574
 msgid "Snap to Twenty Eighths"
 msgstr "吸附到二十八分之一"
 
-#: editor_actions.cc:534
+#: editor_actions.cc:575
 msgid "Snap to Twenty Fourths"
 msgstr "吸附到二十四分之一"
 
-#: editor_actions.cc:535
+#: editor_actions.cc:576
 msgid "Snap to Twentieths"
 msgstr "吸附到二十分之一"
 
-#: editor_actions.cc:536
+#: editor_actions.cc:577
 msgid "Snap to Sixteenths"
 msgstr "吸附到十六分之一"
 
-#: editor_actions.cc:537
+#: editor_actions.cc:578
 msgid "Snap to Fourteenths"
 msgstr "吸附到十四分之一"
 
-#: editor_actions.cc:538
+#: editor_actions.cc:579
 msgid "Snap to Twelfths"
 msgstr "吸附到十二分之一"
 
-#: editor_actions.cc:539
+#: editor_actions.cc:580
 msgid "Snap to Tenths"
 msgstr "吸附到十分之一"
 
-#: editor_actions.cc:540
+#: editor_actions.cc:581
 msgid "Snap to Eighths"
 msgstr "吸附到八分之一"
 
-#: editor_actions.cc:541
+#: editor_actions.cc:582
 msgid "Snap to Sevenths"
 msgstr "吸附到七分之一"
 
-#: editor_actions.cc:542
+#: editor_actions.cc:583
 msgid "Snap to Sixths"
 msgstr "吸附到六分之一"
 
-#: editor_actions.cc:543
+#: editor_actions.cc:584
 msgid "Snap to Fifths"
 msgstr "吸附到五分之一"
 
-#: editor_actions.cc:544
+#: editor_actions.cc:585
 msgid "Snap to Quarters"
 msgstr "吸附到四分之一"
 
-#: editor_actions.cc:545
+#: editor_actions.cc:586
 msgid "Snap to Thirds"
 msgstr "吸附到三分之一"
 
-#: editor_actions.cc:546
+#: editor_actions.cc:587
 msgid "Snap to Halves"
 msgstr "吸附到二分之一"
 
-#: editor_actions.cc:548
+#: editor_actions.cc:589
 msgid "Snap to Beat"
 msgstr "吸附到拍子"
 
-#: editor_actions.cc:549
+#: editor_actions.cc:590
 msgid "Snap to Bar"
 msgstr "吸附到小节"
 
-#: editor_actions.cc:550
+#: editor_actions.cc:591
 msgid "Snap to Mark"
 msgstr "吸附到标记"
 
-#: editor_actions.cc:551
+#: editor_actions.cc:592
 msgid "Snap to Region Start"
 msgstr "吸附到区域起点"
 
-#: editor_actions.cc:552
+#: editor_actions.cc:593
 msgid "Snap to Region End"
 msgstr "吸附到区域终点"
 
-#: editor_actions.cc:553
+#: editor_actions.cc:594
 msgid "Snap to Region Sync"
 msgstr "吸附到区域同步"
 
-#: editor_actions.cc:554
+#: editor_actions.cc:595
 msgid "Snap to Region Boundary"
 msgstr "吸附到区域边界"
 
-#: editor_actions.cc:556
+#: editor_actions.cc:597
 msgid "Show Marker Lines"
 msgstr "显示标记线条"
 
-#: editor_actions.cc:566
+#: editor_actions.cc:607
 msgid "Loop/Punch"
 msgstr "循环/切换"
 
-#: editor_actions.cc:570
+#: editor_actions.cc:611
 msgid "Min:Sec"
 msgstr "分:秒"
 
-#: editor_actions.cc:572 editor_actions.cc:575 editor_rulers.cc:271
+#: editor_actions.cc:613 editor_actions.cc:616 editor_rulers.cc:270
+#: rc_option_editor.cc:1592
 msgid "Video Monitor"
 msgstr "视频监控"
 
-#: editor_actions.cc:574 rc_option_editor.cc:2260
+#: editor_actions.cc:615 rc_option_editor.cc:2844
 msgid "Video"
 msgstr "视频"
 
-#: editor_actions.cc:577
+#: editor_actions.cc:618
 msgid "Always on Top"
 msgstr "总是置顶"
 
-#: editor_actions.cc:579
+#: editor_actions.cc:620
 msgid "Frame number"
 msgstr "帧号码"
 
-#: editor_actions.cc:580
+#: editor_actions.cc:621
 msgid "Timecode Background"
 msgstr "时间码背景"
 
-#: editor_actions.cc:581
+#: editor_actions.cc:622
 msgid "Fullscreen"
 msgstr "全屏"
 
-#: editor_actions.cc:582
+#: editor_actions.cc:623
 msgid "Letterbox"
-msgstr "宽银幕式"
+msgstr "宽荧幕"
 
-#: editor_actions.cc:583
+#: editor_actions.cc:624
 msgid "Original Size"
 msgstr "原始尺寸"
 
-#: editor_actions.cc:640
+#: editor_actions.cc:681
 msgid "Sort"
 msgstr "排序"
 
-#: editor_actions.cc:651 editor_routes.cc:476 mixer_ui.cc:1196
+#: editor_actions.cc:692 editor_routes.cc:549 mixer_ui.cc:1497
 msgid "Show All"
 msgstr "显示所有"
 
-#: editor_actions.cc:652
+#: editor_actions.cc:693
 msgid "Show Automatic Regions"
-msgstr "显示自动的区域"
+msgstr "显示自动化区域"
 
-#: editor_actions.cc:654
+#: editor_actions.cc:695
 msgid "Ascending"
 msgstr "升序"
 
-#: editor_actions.cc:656
+#: editor_actions.cc:697
 msgid "Descending"
 msgstr "降序"
 
-#: editor_actions.cc:659
+#: editor_actions.cc:700
 msgid "By Region Name"
 msgstr "以区域名称"
 
-#: editor_actions.cc:661
+#: editor_actions.cc:702
 msgid "By Region Length"
 msgstr "以区域长度"
 
-#: editor_actions.cc:663
+#: editor_actions.cc:704
 msgid "By Region Position"
 msgstr "以区域位置"
 
-#: editor_actions.cc:665
+#: editor_actions.cc:706
 msgid "By Region Timestamp"
 msgstr "以区域时间戳"
 
-#: editor_actions.cc:667
+#: editor_actions.cc:708
 msgid "By Region Start in File"
 msgstr "以文件内的区域起点"
 
-#: editor_actions.cc:669
+#: editor_actions.cc:710
 msgid "By Region End in File"
 msgstr "以文件内的区域终点"
 
-#: editor_actions.cc:671
+#: editor_actions.cc:712
 msgid "By Source File Name"
 msgstr "以源文件名称"
 
-#: editor_actions.cc:673
+#: editor_actions.cc:714
 msgid "By Source File Length"
 msgstr "以源文件长度"
 
-#: editor_actions.cc:675
+#: editor_actions.cc:716
 msgid "By Source File Creation Date"
 msgstr "以源文件创建日期"
 
-#: editor_actions.cc:677
+#: editor_actions.cc:718
 msgid "By Source Filesystem"
 msgstr "以源文件系统"
 
-#: editor_actions.cc:680
+#: editor_actions.cc:721
 msgid "Remove Unused"
 msgstr "移除未使用的"
 
-#: editor_actions.cc:684 editor_audio_import.cc:282 session_import_dialog.cc:75
-#: session_import_dialog.cc:95 session_metadata_dialog.cc:418
-#: editor_videotimeline.cc:91
+#: editor_actions.cc:723
+msgid "Import PT session"
+msgstr "导入 PT 会话"
+
+#: editor_actions.cc:728 editor_audio_import.cc:282 editor_pt_import.cc:149
+#: luawindow.cc:99 session_import_dialog.cc:75 session_import_dialog.cc:95
+#: session_metadata_dialog.cc:421 sfdb_ui.cc:558 editor_videotimeline.cc:91
 msgid "Import"
 msgstr "导入"
 
-#: editor_actions.cc:687
+#: editor_actions.cc:731
 msgid "Import to Region List..."
 msgstr "导入到区域列表…"
 
-#: editor_actions.cc:690 session_import_dialog.cc:44
-msgid "Import From Session"
+#: editor_actions.cc:734 session_import_dialog.cc:44
+#: session_import_dialog.cc:65
+msgid "Import from Session"
 msgstr "从会话导入"
 
-#: editor_actions.cc:694
+#: editor_actions.cc:738
 msgid "Bring all media into session folder"
 msgstr "将所有媒体引入会话文件夹"
 
-#: editor_actions.cc:697
+#: editor_actions.cc:741
 msgid "Show Summary"
 msgstr "显示摘要"
 
-#: editor_actions.cc:699
+#: editor_actions.cc:743
 msgid "Show Group Tabs"
 msgstr "显示群组标签页"
 
-#: editor_actions.cc:701
+#: editor_actions.cc:745
 msgid "Show Measure Lines"
 msgstr "显示测量线"
 
-#: editor_actions.cc:705
-msgid "Show Logo"
-msgstr "显示商标"
-
-#: editor_actions.cc:709
+#: editor_actions.cc:747
 msgid "Toggle MIDI Input Active for Editor-Selected Tracks/Busses"
-msgstr "切换是否为编辑器中已选择的音轨/总线激活MIDI输入"
+msgstr "为编辑器中已选择的音轨/总线切换MIDI输入激活"
 
-#: editor_actions.cc:732
-msgid "Loaded editor bindings from %1"
-msgstr "已从 %1 载入编辑器绑定"
-
-#: editor_actions.cc:734
-msgid "Could not find editor.bindings in search path %1"
-msgstr "在搜索路径 %1 找不到编辑器绑定"
-
-#: editor_actions.cc:1078 editor_actions.cc:1474 editor_actions.cc:1485
-#: editor_actions.cc:1538 editor_actions.cc:1549 editor_actions.cc:1596
-#: editor_actions.cc:1606 editor_regions.cc:1563
+#: editor_actions.cc:1081 editor_actions.cc:1477 editor_actions.cc:1488
+#: editor_actions.cc:1541 editor_actions.cc:1552 editor_actions.cc:1599
+#: editor_actions.cc:1609 editor_regions.cc:1657 luainstance.cc:330
+#: luainstance.cc:1708
 msgid "programming error: %1: %2"
 msgstr "程序错误: %1: %2"
 
-#: editor_actions.cc:1774
+#: editor_actions.cc:1791
 msgid "Raise"
 msgstr "提升"
 
-#: editor_actions.cc:1777
+#: editor_actions.cc:1794
 msgid "Raise to Top"
 msgstr "提升到顶部"
 
-#: editor_actions.cc:1780
+#: editor_actions.cc:1797
 msgid "Lower"
 msgstr "沉降"
 
-#: editor_actions.cc:1783
+#: editor_actions.cc:1800
 msgid "Lower to Bottom"
 msgstr "沉降到底部"
 
-#: editor_actions.cc:1786
+#: editor_actions.cc:1803
 msgid "Move to Original Position"
 msgstr "移动到原始位置"
 
-#: editor_actions.cc:1791
+#: editor_actions.cc:1808
 msgid "Lock to Video"
 msgstr "锁定到视频"
 
-#: editor_actions.cc:1796 editor_markers.cc:912
+#: editor_actions.cc:1813 editor_markers.cc:917
 msgid "Glue to Bars and Beats"
 msgstr "粘连到小节和拍子"
 
-#: editor_actions.cc:1801
+#: editor_actions.cc:1818
 msgid "Remove Sync"
 msgstr "移除同步"
 
-#: editor_actions.cc:1804 mixer_strip.cc:2006 monitor_section.cc:272
-#: route_time_axis.cc:253 route_time_axis.cc:526
+#: editor_actions.cc:1821 mixer_strip.cc:2200 monitor_section.cc:253
+#: monitor_section.cc:321 route_time_axis.cc:264 route_time_axis.cc:550
 msgid "Mute"
 msgstr "静音"
 
-#: editor_actions.cc:1807
+#: editor_actions.cc:1824
 msgid "Normalize..."
 msgstr "规范化…"
 
-#: editor_actions.cc:1810
+#: editor_actions.cc:1827
 msgid "Reverse"
 msgstr "反转"
 
-#: editor_actions.cc:1813
+#: editor_actions.cc:1830
 msgid "Make Mono Regions"
 msgstr "设为单声道区域"
 
-#: editor_actions.cc:1816
+#: editor_actions.cc:1833
 msgid "Boost Gain"
 msgstr "放大增益"
 
-#: editor_actions.cc:1819
+#: editor_actions.cc:1836
 msgid "Cut Gain"
 msgstr "减小增益"
 
-#: editor_actions.cc:1822
+#: editor_actions.cc:1839
 msgid "Pitch Shift..."
 msgstr "音高替换…"
 
-#: editor_actions.cc:1825
-msgid "Transpose..."
-msgstr "变调…"
-
-#: editor_actions.cc:1828
+#: editor_actions.cc:1845
 msgid "Opaque"
 msgstr "模糊度"
 
-#: editor_actions.cc:1832 editor_regions.cc:117
+#: editor_actions.cc:1849 editor_regions.cc:164
 msgid "Fade In"
 msgstr "æ·¡å…¥"
 
-#: editor_actions.cc:1837 editor_regions.cc:118
+#: editor_actions.cc:1854 editor_regions.cc:165
 msgid "Fade Out"
 msgstr "淡出"
 
-#: editor_actions.cc:1852
+#: editor_actions.cc:1869
 msgid "Multi-Duplicate..."
 msgstr "多个副本…"
 
-#: editor_actions.cc:1857
+#: editor_actions.cc:1874
 msgid "Fill Track"
 msgstr "填充音轨"
 
-#: editor_actions.cc:1861 editor_markers.cc:1000
+#: editor_actions.cc:1878 editor_markers.cc:1033
 msgid "Set Loop Range"
 msgstr "设置循环范围"
 
-#: editor_actions.cc:1868
+#: editor_actions.cc:1885
 msgid "Set Punch"
 msgstr "设置切换"
 
-#: editor_actions.cc:1872
+#: editor_actions.cc:1889
 msgid "Add Single Range Marker"
 msgstr "添加单个范围标记"
 
-#: editor_actions.cc:1877
+#: editor_actions.cc:1894
 msgid "Add Range Marker Per Region"
 msgstr "为每个区域添加范围标记"
 
-#: editor_actions.cc:1881
-msgid "Snap Position To Grid"
+#: editor_actions.cc:1898
+msgid "Snap Position to Grid"
 msgstr "吸附位置到网格"
 
-#: editor_actions.cc:1884
+#: editor_actions.cc:1901
 msgid "Close Gaps"
 msgstr "封闭间隙"
 
 # 使用方法 http://linuxaudioblog.com/?tag=rhythm-ferret
-#: editor_actions.cc:1887
+#: editor_actions.cc:1904
 msgid "Rhythm Ferret..."
 msgstr "节奏探测…"
 
-#: editor_actions.cc:1890
+#: editor_actions.cc:1907
 msgid "Export..."
-msgstr "导出..."
+msgstr "导出…"
 
-#: editor_actions.cc:1896
+#: editor_actions.cc:1913
 msgid "Separate Under"
 msgstr "分离位于"
 
-#: editor_actions.cc:1900 editor_actions.cc:1901
+#: editor_actions.cc:1917 editor_actions.cc:1918
 msgid "Set Fade In Length"
 msgstr "设置淡入长度"
 
-#: editor_actions.cc:1902 editor_actions.cc:1903
+#: editor_actions.cc:1919 editor_actions.cc:1920
 msgid "Set Fade Out Length"
 msgstr "设置淡出长度"
 
-#: editor_actions.cc:1905
+#: editor_actions.cc:1922
 msgid "Set Tempo from Region = Bar"
 msgstr "从区域设置节奏=小节"
 
-#: editor_actions.cc:1910
+#: editor_actions.cc:1927
 msgid "Split at Percussion Onsets"
 msgstr "在打击乐击发处拆分"
 
-#: editor_actions.cc:1915
+#: editor_actions.cc:1932
 msgid "List Editor..."
 msgstr "列表编辑器…"
 
-#: editor_actions.cc:1918
+#: editor_actions.cc:1935
 msgid "Properties..."
 msgstr "属性…"
 
-#: editor_actions.cc:1922
+#: editor_actions.cc:1939
 msgid "Bounce (with processing)"
 msgstr "欢跳弹奏(并处理)"
 
-#: editor_actions.cc:1923
+#: editor_actions.cc:1940
 msgid "Bounce (without processing)"
 msgstr "欢跳弹奏(不处理)"
 
-#: editor_actions.cc:1924
+#: editor_actions.cc:1941
 msgid "Combine"
 msgstr "整合"
 
-#: editor_actions.cc:1925
+#: editor_actions.cc:1942
 msgid "Uncombine"
-msgstr "不整合"
+msgstr "撤销整合"
 
-#: editor_actions.cc:1927
+#: editor_actions.cc:1944
+msgid "Loudness Analysis..."
+msgstr "响度分析…"
+
+#: editor_actions.cc:1945
 msgid "Spectral Analysis..."
 msgstr "频谱分析…"
 
-#: editor_actions.cc:1929
+#: editor_actions.cc:1947
 msgid "Reset Envelope"
 msgstr "重置封装"
 
-#: editor_actions.cc:1931
+#: editor_actions.cc:1949
 msgid "Reset Gain"
 msgstr "重置增益"
 
-#: editor_actions.cc:1936
+#: editor_actions.cc:1954
 msgid "Envelope Active"
 msgstr "封装激活"
 
-#: editor_actions.cc:1944 editor_actions.cc:1945
+#: editor_actions.cc:1962 editor_actions.cc:1963
 msgid "Insert Patch Change..."
 msgstr "插入切变音色…"
 
-#: editor_actions.cc:1946
+#: editor_actions.cc:1964
 msgid "Unlink from other copies"
-msgstr "解除链接其它拷贝"
+msgstr "撤销链接其它拷贝"
 
-#: editor_actions.cc:1947
+#: editor_actions.cc:1965
 msgid "Strip Silence..."
 msgstr "片段无声…"
 
-#: editor_actions.cc:1948
+#: editor_actions.cc:1966
 msgid "Set Range Selection"
 msgstr "设置范围已选择部分"
 
-#: editor_actions.cc:1950 editor_actions.cc:1951
+#: editor_actions.cc:1968 editor_actions.cc:1969
 msgid "Nudge Later"
 msgstr "向后微调"
 
-#: editor_actions.cc:1952 editor_actions.cc:1953
+#: editor_actions.cc:1970 editor_actions.cc:1971
 msgid "Nudge Earlier"
 msgstr "向前微调"
 
-#: editor_actions.cc:1955
+#: editor_actions.cc:1973
 msgid "Sequence Regions"
 msgstr "序列区域"
 
-#: editor_actions.cc:1960
+#: editor_actions.cc:1978
 msgid "Nudge Later by Capture Offset"
 msgstr "以捕获部分偏移向后微调"
 
-#: editor_actions.cc:1967
+#: editor_actions.cc:1985
 msgid "Nudge Earlier by Capture Offset"
 msgstr "以捕获部分偏移向前微调"
 
-#: editor_actions.cc:1971
+#: editor_actions.cc:1989
 msgid "Trim to Loop"
 msgstr "修剪到循环"
 
-#: editor_actions.cc:1972
+#: editor_actions.cc:1990
 msgid "Trim to Punch"
 msgstr "修剪到切换"
 
-#: editor_actions.cc:1974
+#: editor_actions.cc:1992
 msgid "Trim to Previous"
 msgstr "修剪到上一个"
 
-#: editor_actions.cc:1975
+#: editor_actions.cc:1993
 msgid "Trim to Next"
 msgstr "修剪到下一个"
 
-#: editor_actions.cc:1982
-msgid "Insert Region From Region List"
+#: editor_actions.cc:2000
+msgid "Insert Region from Region List"
 msgstr "从区域列表插入区域"
 
-#: editor_actions.cc:1988
+#: editor_actions.cc:2006
 msgid "Set Sync Position"
 msgstr "设置同步位置"
 
-#: editor_actions.cc:1989
+#: editor_actions.cc:2007
 msgid "Place Transient"
 msgstr "放置过渡"
 
-#: editor_actions.cc:1990
+#: editor_actions.cc:2008
 msgid "Split/Separate"
 msgstr "拆分/分离"
 
-#: editor_actions.cc:1991
+#: editor_actions.cc:2009
 msgid "Trim Start at Edit Point"
 msgstr "在编辑点修剪起点"
 
-#: editor_actions.cc:1992
+#: editor_actions.cc:2010
 msgid "Trim End at Edit Point"
 msgstr "在编辑点修剪终点"
 
-#: editor_actions.cc:1997
+#: editor_actions.cc:2015
 msgid "Align Start"
 msgstr "对齐起点"
 
-#: editor_actions.cc:2004
+#: editor_actions.cc:2022
 msgid "Align Start Relative"
 msgstr "对齐起点相关"
 
-#: editor_actions.cc:2008
+#: editor_actions.cc:2026
 msgid "Align End"
 msgstr "对齐终点"
 
-#: editor_actions.cc:2013
+#: editor_actions.cc:2031
 msgid "Align End Relative"
 msgstr "对齐终点相关"
 
-#: editor_actions.cc:2020
+#: editor_actions.cc:2038
 msgid "Align Sync"
 msgstr "对齐同步"
 
-#: editor_actions.cc:2027
+#: editor_actions.cc:2045
 msgid "Align Sync Relative"
 msgstr "对齐同步相关"
 
-#: editor_actions.cc:2031 editor_actions.cc:2034
+#: editor_actions.cc:2049 editor_actions.cc:2050
 msgid "Choose Top..."
 msgstr "选择顶部…"
 
 #: editor_audio_import.cc:77 editor_audio_import.cc:99
 msgid "You can't import or embed an audiofile until you have a session loaded."
-msgstr "无法导入嵌入的的音频文件,,除非您已经载入一个会话文件。"
+msgstr "您无法导入或者嵌入一个音频文件,除非您已经载入一个会话文件。"
 
 #: editor_audio_import.cc:83 editor_audio_import.cc:127
 msgid "Add Existing Media"
@@ -4609,43 +5220,47 @@ msgstr "添加已存在的媒体"
 
 #: editor_audio_import.cc:175
 msgid ""
-"The session already contains a source file named %1.  Do you want to import %1 as "
-"a new file, or skip it?"
+"The session already contains a source file named %1.  Do you want to import "
+"%1 as a new file, or skip it?"
 msgstr ""
-"此会话已经存在一个名为 %1 的源文件。您想把 %1 作为一个新文件导入进来,,或者跳过它?"
+"此会话已经存在一个名为 %1 的源文件。您想把 %1 作为一个新文件导入进来,或者跳"
+"过它?"
 
 #: editor_audio_import.cc:177
 msgid ""
-"The session already contains a source file named %1.  Do you want to import %2 as "
-"a new source, or skip it?"
+"The session already contains a source file named %1.  Do you want to import "
+"%2 as a new source, or skip it?"
 msgstr ""
-"此会话已经存在一个名为 %1 的源文件。您想把 %2 作为一个新的源导入进来,,或者跳过它?"
+"此会话已经存在一个名为 %1 的源文件。您想把 %2 作为一个新的源导入进来,或者跳"
+"过它?"
 
-#: editor_audio_import.cc:282 editor_videotimeline.cc:91
+#: editor_audio_import.cc:282 editor_pt_import.cc:149
+#: editor_videotimeline.cc:91
 msgid "Cancel Import"
 msgstr "取消导入"
 
-#: editor_audio_import.cc:559
+#: editor_audio_import.cc:565
 msgid "Editor: cannot open file \"%1\", (%2)"
-msgstr "编辑器: 无法打开文件 \"%1\", (%2)"
+msgstr "编辑器: 无法打开文件 \"%1\",(%2)"
 
-#: editor_audio_import.cc:567
+#: editor_audio_import.cc:573
 msgid "Cancel entire import"
 msgstr "取消整体导入"
 
-#: editor_audio_import.cc:568
+#: editor_audio_import.cc:574
 msgid "Don't embed it"
 msgstr "不嵌入它"
 
-#: editor_audio_import.cc:569
+#: editor_audio_import.cc:575
 msgid "Embed all without questions"
-msgstr "嵌入所有,不必询问"
+msgstr "全部嵌入,不必询问"
 
-#: editor_audio_import.cc:572 editor_audio_import.cc:598 export_format_dialog.cc:60
+#: editor_audio_import.cc:578 editor_audio_import.cc:604
+#: export_format_dialog.cc:68
 msgid "Sample rate"
 msgstr "采样率"
 
-#: editor_audio_import.cc:573 editor_audio_import.cc:599
+#: editor_audio_import.cc:579 editor_audio_import.cc:605
 msgid ""
 "%1\n"
 "This audiofile's sample rate doesn't match the session sample rate!"
@@ -4653,208 +5268,288 @@ msgstr ""
 "%1\n"
 "此音频文件的采样率与会话的采样率不匹配!"
 
-#: editor_audio_import.cc:595
+#: editor_audio_import.cc:601
 msgid "Embed it anyway"
 msgstr "只管嵌入它"
 
-#: editor_canvas_events.cc:1306 editor_drag.cc:1381
+#: editor_pt_import.cc:81
+msgid "You can't import a PT session until you have a session loaded."
+msgstr "您无法导入一个 PT 会话,除非您已载入有一个会话。"
+
+#: editor_pt_import.cc:86
+msgid "Import PT Session"
+msgstr "导入 PT 会话"
+
+#: editor_pt_import.cc:97
+msgid "%1: this is only the directory/folder name, not the filename.\n"
+msgstr "%1:这仅仅是目录/文件夹名称,不是文件名称\n"
+
+#: editor_pt_import.cc:132
+msgid "Doesn't seem to be a valid PT session file"
+msgstr "似乎没有一个有效的 PT 会话文件"
+
+#: editor_pt_import.cc:136
+msgid ""
+"PT v%1 Session @ %2Hz\n"
+"\n"
+"%3 audio files\n"
+"%4 regions\n"
+"%5 active regions\n"
+"\n"
+"Continue..."
+msgstr ""
+"PT v%1 会话 @ %2Hz\n"
+"\n"
+"%3 音频文件\n"
+"%4 区域\n"
+"%5 激活的区域\n"
+"\n"
+"继续…"
+
+#: editor_pt_import.cc:175
+msgid ""
+"Failed to load one or more of the audio files, but continuing to attempt "
+"import."
+msgstr "载入一个或多个音频文件失败,但仍在继续尝试导入中。"
+
+#: editor_pt_import.cc:178
+msgid "Success! Import should complete soon."
+msgstr " 成功!导入将很快完成。"
+
+#: editor_pt_import.cc:263
+msgid "PTImport: UINT_MAX routes? impossible!"
+msgstr "PT导入:UINT_MAX路由?不可能!"
+
+#: editor_canvas_events.cc:1296 editor_drag.cc:1418
 msgid "Could not create new track after region placed in the drop zone"
 msgstr "区域被放置在落选区后,无法创建新音轨"
 
-#: editor_drag.cc:1266
+#: editor_drag.cc:1306
 msgid "fixed time region drag"
 msgstr "已定型的时间区域拖拽"
 
-#: editor_drag.cc:2214
+#: editor_drag.cc:2249
 msgid "Ripple drag"
 msgstr "波纹拖拽"
 
-#: editor_drag.cc:2365 midi_region_view.cc:2813
+#: editor_drag.cc:2311
+msgid "create region"
+msgstr "创建区域"
+
+#: editor_drag.cc:2430 midi_region_view.cc:2857
 msgid "resize notes"
 msgstr "重设音符大小"
 
-#: editor_drag.cc:2517
+#: editor_drag.cc:2613 editor_drag.cc:2648
+msgid ""
+"One or more Audio Regions\n"
+"are both Locked and\n"
+"Locked to Video.\n"
+"The video cannot me moved."
+msgstr ""
+"一个或更多音频区域\n"
+"都被锁定\n"
+"并且锁定到视频。\n"
+"视频无法被移动。"
+
+#: editor_drag.cc:2683
 msgid "Video Start:"
-msgstr "视频起点:"
+msgstr "视频起点"
 
-#: editor_drag.cc:2519
+#: editor_drag.cc:2685
 msgid "Diff:"
 msgstr "差别:"
 
-#: editor_drag.cc:2538
+#: editor_drag.cc:2707
 msgid "Move Video"
 msgstr "移动视频"
 
-#: editor_drag.cc:3046
+#: editor_drag.cc:3176
+msgid "move meter mark"
+msgstr "移动节拍标记"
+
+#: editor_drag.cc:3178
 msgid "copy meter mark"
 msgstr "复制节拍标记"
 
-#: editor_drag.cc:3054
-msgid "move meter mark"
-msgstr "移动节拍标记"
+#: editor_drag.cc:3278
+msgid "inactive"
+msgstr "非激活的"
 
-#: editor_drag.cc:3177
+#: editor_drag.cc:3323
+msgid "move tempo mark"
+msgstr "移动节奏标记"
+
+#: editor_drag.cc:3330
 msgid "copy tempo mark"
 msgstr "复制节奏标记"
 
-#: editor_drag.cc:3185
-msgid "move tempo mark"
-msgstr "移动节奏标记"
+#: editor_drag.cc:3461
+msgid "dilate tempo"
+msgstr "扩展节奏"
 
-#: editor_drag.cc:3412
+#: editor_drag.cc:3735
 msgid "change fade in length"
-msgstr "改变渐入长度"
+msgstr "改变淡入长度"
 
-#: editor_drag.cc:3526
+#: editor_drag.cc:3860
 msgid "change fade out length"
-msgstr "改变渐出长度"
+msgstr "改变淡出长度"
 
-#: editor_drag.cc:3880
+#: editor_drag.cc:4238
 msgid "move marker"
 msgstr "移动标记"
 
-#: editor_drag.cc:4490
+#: editor_drag.cc:4505 editor_drag.cc:5832
+msgid "automation range move"
+msgstr "自动化范围移动"
+
+#: editor_drag.cc:4889
 msgid "An error occurred while executing time stretch operation"
 msgstr "当执行时间延伸操作时出现错误"
 
-#: editor_drag.cc:4947
+#: editor_drag.cc:5350
 msgid "programming_error: %1"
 msgstr "程序错误:%1"
 
-#: editor_drag.cc:5016 editor_drag.cc:5026
+#: editor_drag.cc:5419 editor_drag.cc:5429
 msgid "new skip marker"
 msgstr "新建跳跃标记"
 
-#: editor_drag.cc:5017
+#: editor_drag.cc:5420
 msgid "skip"
 msgstr "跳跃"
 
-#: editor_drag.cc:5021 location_ui.cc:56
+#: editor_drag.cc:5424 location_ui.cc:60
 msgid "CD"
 msgstr ""
 
-#: editor_drag.cc:5022
+#: editor_drag.cc:5425
 msgid "new CD marker"
 msgstr "新建CD标记"
 
-#: editor_drag.cc:5027 editor_route_groups.cc:437 mixer_ui.cc:1493
+#: editor_drag.cc:5430 editor_route_groups.cc:439 mixer_ui.cc:1840
 msgid "unnamed"
 msgstr "未命名的"
 
-#: editor_drag.cc:5309
+#: editor_drag.cc:5739
 msgid "Automation range drag created for invalid region type"
 msgstr "为无效的区域类型已创建自动范围拖拽"
 
-#: editor_route_groups.cc:96
+#: editor_route_groups.cc:97
 msgid "Col"
 msgstr "列"
 
-#: editor_route_groups.cc:96
+#: editor_route_groups.cc:97
 msgid "Group Tab Color"
 msgstr "分组标签页颜色"
 
-#: editor_route_groups.cc:97
+#: editor_route_groups.cc:98
 msgid "Name of Group"
 msgstr "分组名称"
 
-#: editor_route_groups.cc:98 editor_routes.cc:207
-msgid "V"
-msgstr ""
+#: editor_route_groups.cc:99 editor_routes.cc:234
+msgid "Visible|V"
+msgstr "可见|V"
 
-#: editor_route_groups.cc:98
+#: editor_route_groups.cc:99
 msgid "Group is visible?"
 msgstr "分组是否可见?"
 
-#: editor_route_groups.cc:99
+#: editor_route_groups.cc:100
 msgid "On"
 msgstr "开启"
 
-#: editor_route_groups.cc:99
+#: editor_route_groups.cc:100
 msgid "Group is enabled?"
 msgstr "分组是否可用?"
 
-#: editor_route_groups.cc:100
-msgid "group|G"
+#: editor_route_groups.cc:101
+msgid "Group|G"
 msgstr "分组|G"
 
-#: editor_route_groups.cc:100
+#: editor_route_groups.cc:101
 msgid "Sharing Gain?"
 msgstr "分享增益?"
 
-#: editor_route_groups.cc:101
-msgid "relative|Rel"
+#: editor_route_groups.cc:102
+msgid "Relative|Rel"
 msgstr "相关|Rel"
 
-#: editor_route_groups.cc:101
+#: editor_route_groups.cc:102
 msgid "Relative Gain Changes?"
 msgstr "相关增益改变?"
 
-#: editor_route_groups.cc:102
-msgid "mute|M"
+#: editor_route_groups.cc:103 editor_regions.cc:168 editor_routes.cc:239
+#: mixer_strip.cc:2229 meter_strip.cc:365 route_time_axis.cc:2742
+#: time_axis_view.cc:1106
+msgid "Mute|M"
 msgstr "静音|M"
 
-#: editor_route_groups.cc:102
+#: editor_route_groups.cc:103
 msgid "Sharing Mute?"
 msgstr "分享静音?"
 
-#: editor_route_groups.cc:103
-msgid "solo|S"
+#: editor_route_groups.cc:104 editor_routes.cc:240 mixer_strip.cc:2242
+#: meter_strip.cc:373 route_time_axis.cc:2739 vca_master_strip.cc:211
+#: vca_time_axis.cc:236
+msgid "Solo|S"
 msgstr "独奏|S"
 
-#: editor_route_groups.cc:103
+#: editor_route_groups.cc:104
 msgid "Sharing Solo?"
 msgstr "分享独奏?"
 
-#: editor_route_groups.cc:104 midi_time_axis.cc:1622 midi_time_axis.cc:1625
-#: midi_time_axis.cc:1628
+#: editor_route_groups.cc:105 midi_time_axis.cc:1626 midi_time_axis.cc:1629
+#: midi_time_axis.cc:1632
 msgid "Rec"
 msgstr "录制"
 
-#: editor_route_groups.cc:104
+#: editor_route_groups.cc:105
 msgid "Sharing Record-enable Status?"
-msgstr "分享静音?"
+msgstr "分享可录制状态?"
 
-#: editor_route_groups.cc:105
-msgid "monitoring|Mon"
+#: editor_route_groups.cc:106
+msgid "Monitoring|Mon"
 msgstr "监控|Mon"
 
-#: editor_route_groups.cc:105
+#: editor_route_groups.cc:106
 msgid "Sharing Monitoring Choice?"
 msgstr "分享监控选择?"
 
-#: editor_route_groups.cc:106
-msgid "selection|Sel"
+#: editor_route_groups.cc:107
+msgid "Selection|Sel"
 msgstr "已选择部分|Sel"
 
-#: editor_route_groups.cc:106
+#: editor_route_groups.cc:107
 msgid "Sharing Selected/Editing Status?"
 msgstr "分享已选择/编辑状态?"
 
-#: editor_route_groups.cc:107
-msgid "active|A"
-msgstr "激活"
+#: editor_route_groups.cc:108 editor_routes.cc:235
+msgid "Active|A"
+msgstr "激活|A"
 
-#: editor_route_groups.cc:107
+#: editor_route_groups.cc:108
 msgid "Sharing Active Status?"
 msgstr "分享激活状态?"
 
-#: editor_export_audio.cc:92 editor_markers.cc:740 editor_markers.cc:827
-#: editor_markers.cc:1012 editor_markers.cc:1030 editor_markers.cc:1048
-#: editor_markers.cc:1067 editor_markers.cc:1086 editor_markers.cc:1116
-#: editor_markers.cc:1147 editor_markers.cc:1177 editor_markers.cc:1205
-#: editor_markers.cc:1236 editor_markers.cc:1261 editor_markers.cc:1312
-#: editor_markers.cc:1356 editor_markers.cc:1382 editor_markers.cc:1576
-#: editor_mouse.cc:2120
+#: editor_export_audio.cc:93 editor_markers.cc:733 editor_markers.cc:832
+#: editor_markers.cc:1045 editor_markers.cc:1063 editor_markers.cc:1081
+#: editor_markers.cc:1100 editor_markers.cc:1119 editor_markers.cc:1149
+#: editor_markers.cc:1180 editor_markers.cc:1210 editor_markers.cc:1238
+#: editor_markers.cc:1269 editor_markers.cc:1294 editor_markers.cc:1345
+#: editor_markers.cc:1458 editor_markers.cc:1484 editor_markers.cc:1678
+#: editor_mouse.cc:2255
 msgid "programming error: marker canvas item has no marker object pointer!"
 msgstr "程序错误:标记版面条目没有标记对象物体指示!"
 
-#: editor_export_audio.cc:145 editor_export_audio.cc:150
-msgid "File Exists!"
-msgstr "文件已存在!"
+#: editor_export_audio.cc:114
+msgid "Confirm MIDI File Overwrite"
+msgstr "确认 MIDI 文件覆盖"
 
-#: editor_export_audio.cc:153
-msgid "Overwrite Existing File"
-msgstr "覆盖已存在文件"
+#: editor_export_audio.cc:115 utils_videotl.cc:75
+msgid "A file with the same name already exists. Do you want to overwrite it?"
+msgstr "已经有一个相同名称的文件存在。您是否打算覆盖它?"
 
 #: editor_group_tabs.cc:176
 msgid "Fit to Window"
@@ -4862,318 +5557,361 @@ msgstr "匹配适合窗口"
 
 #: editor_markers.cc:139
 msgid "start"
-msgstr "start"
+msgstr "起点"
 
 #: editor_markers.cc:140
 msgid "end"
 msgstr "终点"
 
-#: editor_markers.cc:657 editor_ops.cc:2085 editor_ops.cc:2107 editor_ops.cc:2164
-#: editor_ops.cc:2193 location_ui.cc:1023
+#: editor_markers.cc:645
+msgid "mark"
+msgstr "标记"
+
+#: editor_markers.cc:650 editor_ops.cc:2164 editor_ops.cc:2186
+#: editor_ops.cc:2304 editor_ops.cc:2341 location_ui.cc:1049
 msgid "add marker"
 msgstr "添加标记"
 
-#: editor_markers.cc:689 editor_markers.cc:1456
+#: editor_markers.cc:682 editor_markers.cc:1558
 msgid "set loop range"
-msgstr "设置切换范围"
+msgstr "设置循环范围"
 
-#: editor_markers.cc:705 editor_markers.cc:1462
+#: editor_markers.cc:698 editor_markers.cc:1564
 msgid "set punch range"
 msgstr "设置切换范围"
 
-#: editor_markers.cc:722 editor_ops.cc:4055
+#: editor_markers.cc:715 editor_ops.cc:4159
 msgid "range"
 msgstr "范围"
 
-#: editor_markers.cc:725
+#: editor_markers.cc:718
 msgid "new range marker"
 msgstr "新建范围标记"
 
-#: editor_markers.cc:758 editor_ops.cc:2129 location_ui.cc:859
+#: editor_markers.cc:751 editor_ops.cc:2272 location_ui.cc:885
 msgid "remove marker"
 msgstr "移除标记"
 
-#: editor_markers.cc:894
+#: editor_markers.cc:899
 msgid "Locate to Here"
 msgstr "定位到此处"
 
-#: editor_markers.cc:895
+#: editor_markers.cc:900
 msgid "Play from Here"
 msgstr "从此处开始播放"
 
-#: editor_markers.cc:896
+#: editor_markers.cc:901
 msgid "Move Mark to Playhead"
 msgstr "移动标记到指针"
 
-#: editor_markers.cc:900
+#: editor_markers.cc:905
 msgid "Create Range to Next Marker"
 msgstr "创建范围到下一个标记"
 
-#: editor_markers.cc:941
+#: editor_markers.cc:946
 msgid "Locate to Marker"
 msgstr "定位到标记"
 
-#: editor_markers.cc:942
+#: editor_markers.cc:947
 msgid "Play from Marker"
 msgstr "从标记开始播放"
 
-#: editor_markers.cc:945
+#: editor_markers.cc:950
 msgid "Set Marker from Playhead"
 msgstr "从指针起设置标记"
 
-#: editor_markers.cc:947
+#: editor_markers.cc:951
 msgid "Set Range from Selection"
 msgstr "从已选择部分起设置范围"
 
-#: editor_markers.cc:957
+#: editor_markers.cc:960
 msgid "Hide Range"
 msgstr "隐藏范围"
 
-#: editor_markers.cc:958
+#: editor_markers.cc:961
 msgid "Rename Range..."
 msgstr "重命名范围…"
 
-#: editor_markers.cc:962
+#: editor_markers.cc:965
 msgid "Remove Range"
 msgstr "移除范围"
 
-#: editor_markers.cc:969
+#: editor_markers.cc:972
 msgid "Separate Regions in Range"
 msgstr "在范围中分离区域"
 
-#: editor_markers.cc:972
+#: editor_markers.cc:974
 msgid "Select Range"
 msgstr "选择范围"
 
-#: editor_markers.cc:1001
+#: editor_markers.cc:987
+msgid "Make Ramped"
+msgstr "形成渐变"
+
+#: editor_markers.cc:989
+msgid "Make Constant"
+msgstr "形成恒量"
+
+#: editor_markers.cc:993 editor_markers.cc:1013
+msgid "Lock to Music"
+msgstr "锁定到音乐"
+
+#: editor_markers.cc:995 editor_markers.cc:1015
+msgid "Lock to Audio"
+msgstr "锁定到音频"
+
+#: editor_markers.cc:1034
 msgid "Set Punch Range"
 msgstr "设置切换范围"
 
-#: editor_markers.cc:1407 editor_ops.cc:2040
+#: editor_markers.cc:1391
+msgid "change meter lock style"
+msgstr "改变节拍锁定类型"
+
+#: editor_markers.cc:1414
+msgid "change tempo lock style"
+msgstr "改变节奏锁定类型"
+
+#: editor_markers.cc:1441
+msgid "change tempo type"
+msgstr "改变节奏类型"
+
+#: editor_markers.cc:1509 editor_ops.cc:2119
 msgid "New Name:"
 msgstr "新名称:"
 
-#: editor_markers.cc:1410
+#: editor_markers.cc:1512
 msgid "Rename Mark"
 msgstr "重命名标记"
 
-#: editor_markers.cc:1412
+#: editor_markers.cc:1514
 msgid "Rename Range"
 msgstr "重命名范围"
 
-#: editor_markers.cc:1419 editor_mouse.cc:2137 processor_box.cc:1994
-#: processor_box.cc:2464 route_time_axis.cc:1100 route_ui.cc:1628
+#: editor_markers.cc:1521 editor_mouse.cc:2272 processor_box.cc:3204
+#: processor_box.cc:3693 route_time_axis.cc:1110 route_ui.cc:1637
+#: vca_master_strip.cc:395
 msgid "Rename"
 msgstr "重命名"
 
-#: editor_markers.cc:1432
+#: editor_markers.cc:1534
 msgid "rename marker"
 msgstr "重命名标记"
 
-#: editor_mixer.cc:90
+#: editor_mixer.cc:98
 msgid "This screen is not tall enough to display the editor mixer"
 msgstr "屏幕高度不足以显示编辑器或混音器"
 
-#: editor_mouse.cc:1223 editor_mouse.cc:1241 editor_tempodisplay.cc:270
-msgid "programming error: tempo marker canvas item has no marker object pointer!"
+#: editor_mouse.cc:1345 editor_mouse.cc:1363 editor_tempodisplay.cc:384
+msgid ""
+"programming error: tempo marker canvas item has no marker object pointer!"
 msgstr "程序错误:节奏标记版面条目没有标记对象物体指示!"
 
-#: editor_mouse.cc:1228 editor_tempodisplay.cc:275
+#: editor_mouse.cc:1350 editor_tempodisplay.cc:389
 msgid "programming error: marker for tempo is not a tempo marker!"
 msgstr "程序错误:节奏上的标记不是一个节奏标记!"
 
-#: editor_mouse.cc:1246 editor_tempodisplay.cc:375
+#: editor_mouse.cc:1368 editor_tempodisplay.cc:507
 msgid "programming error: marker for meter is not a meter marker!"
 msgstr "程序错误:节拍上的标记不是一个节拍标记!"
 
-#: editor_mouse.cc:1885 editor_mouse.cc:1910 editor_mouse.cc:1923
+#: editor_mouse.cc:2016 editor_mouse.cc:2041 editor_mouse.cc:2054
 msgid ""
-"programming error: control point canvas item has no control point object pointer!"
+"programming error: control point canvas item has no control point object "
+"pointer!"
 msgstr "程序错误:控制点版面条目没有控制点对象物体指示!"
 
-#: editor_mouse.cc:2058
+#: editor_mouse.cc:2085
+msgid "edit note(s)"
+msgstr "编辑音符"
+
+#: editor_mouse.cc:2193
 msgid "start point trim"
 msgstr "起点修剪"
 
-#: editor_mouse.cc:2083
-msgid "End point trim"
+#: editor_mouse.cc:2218
+msgid "end point trim"
 msgstr "终点修剪"
 
-#: editor_mouse.cc:2135
+#: editor_mouse.cc:2270
 msgid "Name for region:"
-msgstr "区域名:"
+msgstr "区域名称:"
 
-#: editor_ops.cc:165
+#: editor_ops.cc:168
 msgid "split"
 msgstr "拆分"
 
-#: editor_ops.cc:339
+#: editor_ops.cc:342
 msgid "alter selection"
 msgstr "更改已选择部分"
 
-#: editor_ops.cc:381
+#: editor_ops.cc:384
 msgid "nudge regions forward"
 msgstr "向前微调区域"
 
-#: editor_ops.cc:404 editor_ops.cc:489
+#: editor_ops.cc:441 editor_ops.cc:535
 msgid "nudge location forward"
 msgstr "向前微调位置"
 
-#: editor_ops.cc:462
+#: editor_ops.cc:472
 msgid "nudge regions backward"
 msgstr "向后微调区域"
 
-#: editor_ops.cc:551
+#: editor_ops.cc:567
 msgid "nudge forward"
 msgstr "向前微调"
 
-#: editor_ops.cc:575
+#: editor_ops.cc:591
 msgid "nudge backward"
 msgstr "向后微调"
 
-#: editor_ops.cc:618
+#: editor_ops.cc:656
 msgid "sequence regions"
 msgstr "序列区域"
 
-#: editor_ops.cc:694
+#: editor_ops.cc:718
 msgid "build_region_boundary_cache called with snap_type = %1"
 msgstr "构建区域边界缓存调用吸附类型 = %1"
 
-#: editor_ops.cc:2042
+#: editor_ops.cc:2121
 msgid "New Location Marker"
 msgstr "新建位置标记"
 
-#: editor_ops.cc:2164
+#: editor_ops.cc:2212 editor_ops.cc:2236
+msgid "Set session start"
+msgstr "设置会话起点"
+
+#: editor_ops.cc:2304
 msgid "add markers"
 msgstr "添加标记"
 
-#: editor_ops.cc:2274
+#: editor_ops.cc:2400
 msgid "clear markers"
-msgstr "清除表己"
+msgstr "清除标记"
 
-#: editor_ops.cc:2289
+#: editor_ops.cc:2415
 msgid "clear ranges"
 msgstr "清除范围"
 
-#: editor_ops.cc:2305
+#: editor_ops.cc:2431
 msgid "clear locations"
 msgstr "清除位置"
 
-#: editor_ops.cc:2368
+#: editor_ops.cc:2494
 msgid "insert region"
 msgstr "插入区域"
 
-#: editor_ops.cc:2559
+#: editor_ops.cc:2685
 msgid "raise regions"
 msgstr "提升区域"
 
-#: editor_ops.cc:2561
+#: editor_ops.cc:2687
 msgid "raise region"
 msgstr "提升区域"
 
-#: editor_ops.cc:2567
+#: editor_ops.cc:2693
 msgid "raise regions to top"
 msgstr "提升区域到顶部"
 
-#: editor_ops.cc:2569
+#: editor_ops.cc:2695
 msgid "raise region to top"
 msgstr "提升区域到顶部"
 
-#: editor_ops.cc:2575
+#: editor_ops.cc:2701
 msgid "lower regions"
 msgstr "沉降区域"
 
-#: editor_ops.cc:2577 editor_ops.cc:2585
+#: editor_ops.cc:2703 editor_ops.cc:2711
 msgid "lower region"
 msgstr "沉降区域"
 
-#: editor_ops.cc:2583
+#: editor_ops.cc:2709
 msgid "lower regions to bottom"
 msgstr "沉降区域到底部"
 
-#: editor_ops.cc:2668
+#: editor_ops.cc:2794
 msgid "Rename Region"
 msgstr "重命名区域"
 
-#: editor_ops.cc:2670 processor_box.cc:1992 route_ui.cc:1626
+#: editor_ops.cc:2796 processor_box.cc:3202 route_ui.cc:1635
 msgid "New name:"
 msgstr "新名称:"
 
-#: editor_ops.cc:2987
+#: editor_ops.cc:3097
 msgid "separate"
 msgstr "分离"
 
-#: editor_ops.cc:3099
+#: editor_ops.cc:3207
 msgid "separate region under"
 msgstr "分离区域位于"
 
-#: editor_ops.cc:3220
+#: editor_ops.cc:3360
 msgid "trim to selection"
-msgstr "修剪到已选中部分"
+msgstr "修剪到已选择部分"
 
-#: editor_ops.cc:3356
+#: editor_ops.cc:3442
 msgid "set sync point"
 msgstr "设置同步点"
 
-#: editor_ops.cc:3380
+#: editor_ops.cc:3466
 msgid "remove region sync"
 msgstr "移除区域同步"
 
-#: editor_ops.cc:3402
+#: editor_ops.cc:3488
 msgid "move regions to original position"
 msgstr "移动区域到原始位置"
 
-#: editor_ops.cc:3404
+#: editor_ops.cc:3490
 msgid "move region to original position"
 msgstr "移动区域到原始位置"
 
-#: editor_ops.cc:3425
+#: editor_ops.cc:3511
 msgid "align selection"
-msgstr "对齐已选中部分"
+msgstr "对齐已选择部分"
 
-#: editor_ops.cc:3499
+#: editor_ops.cc:3585
 msgid "align selection (relative)"
-msgstr "对齐已选中部分(相关)"
+msgstr "对齐已选择部分(相关)"
 
-#: editor_ops.cc:3533
+#: editor_ops.cc:3619
 msgid "align region"
 msgstr "对齐区域"
 
-#: editor_ops.cc:3584
+#: editor_ops.cc:3670
 msgid "trim front"
 msgstr "修剪前部"
 
-#: editor_ops.cc:3584
+#: editor_ops.cc:3670
 msgid "trim back"
 msgstr "修剪后部"
 
-#: editor_ops.cc:3614
+#: editor_ops.cc:3700
 msgid "trim to loop"
 msgstr "修剪到循环"
 
-#: editor_ops.cc:3624
+#: editor_ops.cc:3710
 msgid "trim to punch"
 msgstr "修剪到切换"
 
-#: editor_ops.cc:3686
+#: editor_ops.cc:3832
 msgid "trim to region"
 msgstr "修剪到区域"
 
-#: editor_ops.cc:3794
+#: editor_ops.cc:3891
 msgid ""
-"This track/bus cannot be frozen because the signal adds or loses channels before "
-"reaching the outputs.\n"
-"This is typically caused by plugins that generate stereo output from mono input or "
-"vice versa."
+"This track/bus cannot be frozen because the signal adds or loses channels "
+"before reaching the outputs.\n"
+"This is typically caused by plugins that generate stereo output from mono "
+"input or vice versa."
 msgstr ""
 "这个音轨/总线不能被冻结,因为在信号到达输出前添加或丢失了声道。\n"
 "这通常是由于从单声道输入生成立体声输出(反之亦然)的插件引起的。"
 
-#: editor_ops.cc:3797
+#: editor_ops.cc:3894
 msgid "Cannot freeze"
 msgstr "无法冻结"
 
-#: editor_ops.cc:3803
+#: editor_ops.cc:3900
 msgid ""
 "<b>%1</b>\n"
 "\n"
@@ -5181,82 +5919,82 @@ msgid ""
 "\n"
 "Freezing will only process the signal as far as the first send/insert/return."
 msgstr ""
-"<b>%1</b>\n"
+"\"\"<b>%1</b>\n"
 "\n"
-"这个音轨至少有一个发送/插入/返回作为它的信号流的一部分。\n"
+"这个音轨至少有一个发送端/插入/返回作为它的信号流的一部分。\n"
 "\n"
-"冻结将只会处理到信号的第一个发送/插入/返回为止。"
+"冻结将只会处理到信号的第一个发送端/插入/返回为止。"
 
-#: editor_ops.cc:3807
+#: editor_ops.cc:3904
 msgid "Freeze anyway"
 msgstr "只管冻结"
 
-#: editor_ops.cc:3808
+#: editor_ops.cc:3905
 msgid "Don't freeze"
-msgstr "不要冻结"
+msgstr "不冻结"
 
-#: editor_ops.cc:3809
+#: editor_ops.cc:3906
 msgid "Freeze Limits"
 msgstr "冻结限制"
 
-#: editor_ops.cc:3824
+#: editor_ops.cc:3921
 msgid "Cancel Freeze"
 msgstr "取消冻结"
 
-#: editor_ops.cc:3854
+#: editor_ops.cc:3952
 msgid ""
-"You can't perform this operation because the processing of the signal will cause "
-"one or more of the tracks to end up with a region with more channels than this "
-"track has inputs.\n"
+"You can't perform this operation because the processing of the signal will "
+"cause one or more of the tracks to end up with a region with more channels "
+"than this track has inputs.\n"
 "\n"
 "You can do this without processing, which is a different operation."
 msgstr ""
-"您不能执行此操作,因为信号的处理将导致一个或多个音轨以带着多个声道的区域结束,而不"
-"是以这个音轨拥有的输入声道结束。\n"
+"您不能执行此操作,因为信号的处理将导致一个或多个音轨以带着多个声道的区域结"
+"束,而不是以这个音轨拥有的输入声道结束。\n"
 "\n"
 "您可以不做任何处理,这是一个不同的操作。"
 
-#: editor_ops.cc:3858
+#: editor_ops.cc:3956
 msgid "Cannot bounce"
-msgstr "不能欢跳弹奏"
+msgstr "无法欢跳弹奏"
 
-#: editor_ops.cc:3869
+#: editor_ops.cc:4007
 msgid "bounce range"
 msgstr "欢跳弹奏范围"
 
-#: editor_ops.cc:3971
+#: editor_ops.cc:4074
 msgid "delete"
 msgstr "删除"
 
-#: editor_ops.cc:3974
+#: editor_ops.cc:4077
 msgid "cut"
 msgstr "剪切"
 
-#: editor_ops.cc:3977
+#: editor_ops.cc:4080
 msgid "copy"
 msgstr "复制"
 
-#: editor_ops.cc:3980
+#: editor_ops.cc:4083
 msgid "clear"
 msgstr "清除"
 
-#: editor_ops.cc:4028
+#: editor_ops.cc:4132
 msgid "objects"
 msgstr "对象物体"
 
-#: editor_ops.cc:4238 editor_ops.cc:4270
+#: editor_ops.cc:4342 editor_ops.cc:4427
 msgid "remove region"
-msgstr "删除区间"
+msgstr "移除区域"
 
-#: editor_ops.cc:4719
-msgid "duplicate selection"
-msgstr "复制已选择部分"
+#: editor_ops.cc:4844
+msgid "duplicate range selection"
+msgstr "复制范围已选择部分"
 
-#: editor_ops.cc:4803
+#: editor_ops.cc:4938
 msgid "nudge track"
 msgstr "微调音轨"
 
-#: editor_ops.cc:4840
+#: editor_ops.cc:4965
 msgid ""
 "Do you really want to destroy the last capture?\n"
 "(This is destructive and cannot be undone)"
@@ -5264,136 +6002,156 @@ msgstr ""
 "您是否确定要销毁最后已捕获内容?\n"
 "(这个操作有破坏性且不能撤销!)"
 
-#: editor_ops.cc:4843 editor_ops.cc:6838 editor_regions.cc:462
-#: editor_snapshots.cc:159 route_ui.cc:1569
+#: editor_ops.cc:4968 editor_ops.cc:7202 editor_regions.cc:503
+#: editor_snapshots.cc:171
 msgid "No, do nothing."
 msgstr "否, 什么都不做。"
 
-#: editor_ops.cc:4844
+#: editor_ops.cc:4969
 msgid "Yes, destroy it."
 msgstr "是,销毁它。"
 
-#: editor_ops.cc:4846
+#: editor_ops.cc:4971
 msgid "Destroy last capture"
 msgstr "销毁最后捕获的部分"
 
-#: editor_ops.cc:4906
+#: editor_ops.cc:5047
 msgid "normalize"
 msgstr "规范化"
 
-#: editor_ops.cc:5000
+#: editor_ops.cc:5145
 msgid "reverse regions"
 msgstr "反转区域"
 
-#: editor_ops.cc:5034
+#: editor_ops.cc:5182
 msgid "strip silence"
 msgstr "片段无声"
 
-#: editor_ops.cc:5091
+#: editor_ops.cc:5263
 msgid "Fork Region(s)"
 msgstr "分解区域"
 
-#: editor_ops.cc:5112
+#: editor_ops.cc:5270
 msgid "Could not unlink %1"
-msgstr "无法解除链接 %1"
+msgstr "无法撤销链接 %1"
 
-#: editor_ops.cc:5326
+#: editor_ops.cc:5532
 msgid "reset region gain"
-msgstr "重设区域增益"
+msgstr "重置区域增益"
 
-#: editor_ops.cc:5379
+#: editor_ops.cc:5590
 msgid "region gain envelope active"
 msgstr "区域增益封装激活"
 
-#: editor_ops.cc:5406
+#: editor_ops.cc:5615
 msgid "toggle region lock"
 msgstr "切换区域锁定"
 
-#: editor_ops.cc:5430
+#: editor_ops.cc:5639
 msgid "Toggle Video Lock"
 msgstr "切换视频锁定"
 
-#: editor_ops.cc:5454
+#: editor_ops.cc:5663
 msgid "region lock style"
 msgstr "区域锁定风格"
 
-#: editor_ops.cc:5479
+#: editor_ops.cc:5688
 msgid "change region opacity"
 msgstr "改变区域的模糊度"
 
-#: editor_ops.cc:5572
+#: editor_ops.cc:5781
 msgid "fade range"
 msgstr "淡化范围"
 
-#: editor_ops.cc:5610
+#: editor_ops.cc:5819
 msgid "set fade in length"
 msgstr "设置淡入长度"
 
-#: editor_ops.cc:5617
+#: editor_ops.cc:5826
 msgid "set fade out length"
 msgstr "设置淡出长度"
 
-#: editor_ops.cc:5662
+#: editor_ops.cc:5891
 msgid "set fade in shape"
 msgstr "设置淡入形状"
 
-#: editor_ops.cc:5693
+#: editor_ops.cc:5926
 msgid "set fade out shape"
 msgstr "设置淡出形状"
 
-#: editor_ops.cc:5723
+#: editor_ops.cc:5962
 msgid "set fade in active"
 msgstr "设置淡入启用"
 
-#: editor_ops.cc:5752
+#: editor_ops.cc:5996
 msgid "set fade out active"
-msgstr "设置淡出长度"
+msgstr "设置淡出启用"
 
-#: editor_ops.cc:5994
+#: editor_ops.cc:6056
+msgid "toggle fade active"
+msgstr "切换淡化启用"
+
+#: editor_ops.cc:6249
 msgid "set loop range from selection"
 msgstr "从已选择部分设置循环范围"
 
-#: editor_ops.cc:6008
+#: editor_ops.cc:6263
 msgid "set loop range from region"
 msgstr "从区域设置循环范围"
 
-#: editor_ops.cc:6027
+#: editor_ops.cc:6282
 msgid "set punch range from selection"
 msgstr "从已选择部分设置切换范围"
 
-#: editor_ops.cc:6041
+#: editor_ops.cc:6306
 msgid "set session start/end from selection"
 msgstr "从已选择部分设置会话起点/终点"
 
-#: editor_ops.cc:6066
+#: editor_ops.cc:6344
+msgid "set punch start from EP"
+msgstr "从 EP 设置切换起点"
+
+#: editor_ops.cc:6372
+msgid "set punch end from EP"
+msgstr "从 EP 设置切换终点"
+
+#: editor_ops.cc:6405
+msgid "set loop start from EP"
+msgstr "从 EP 设置循环起点"
+
+#: editor_ops.cc:6433
+msgid "set loop end from EP"
+msgstr "从 EP 设置循环终点"
+
+#: editor_ops.cc:6444
 msgid "set punch range from region"
 msgstr "从区域设置切换范围"
 
-#: editor_ops.cc:6175
+#: editor_ops.cc:6531
 msgid "Add new marker"
 msgstr "添加新标记"
 
-#: editor_ops.cc:6176
+#: editor_ops.cc:6532
 msgid "Set global tempo"
 msgstr "设置全局节奏"
 
-#: editor_ops.cc:6179
+#: editor_ops.cc:6535
 msgid "Define one bar"
 msgstr "定义一个小节"
 
-#: editor_ops.cc:6180
+#: editor_ops.cc:6536
 msgid "Do you want to set the global tempo or add a new tempo marker?"
-msgstr "您是否要设置全局节奏或者添加一个新的节奏标签?"
+msgstr "您是否要设置全局节奏或者添加一个新的节奏标志?"
 
-#: editor_ops.cc:6206
+#: editor_ops.cc:6562
 msgid "set tempo from region"
 msgstr "从区域设置节奏"
 
-#: editor_ops.cc:6236
+#: editor_ops.cc:6591
 msgid "split regions"
 msgstr "拆分区域"
 
-#: editor_ops.cc:6278
+#: editor_ops.cc:6633
 msgid ""
 "You are about to split\n"
 "%1\n"
@@ -5405,64 +6163,64 @@ msgstr ""
 " 成为 %2 部分。\n"
 "这需要一些时间。"
 
-#: editor_ops.cc:6285
+#: editor_ops.cc:6640
 msgid "Call for the Ferret!"
 msgstr "调用探测!"
 
-#: editor_ops.cc:6286
+#: editor_ops.cc:6641
 msgid ""
 "Press OK to continue with this split operation\n"
 "or ask the Ferret dialog to tune the analysis"
 msgstr ""
-"按OK继续拆分操作\n"
+"按下“确定”继续本次拆分操作\n"
 "或者请求探测对话框进行优化分析"
 
-#: editor_ops.cc:6288
+#: editor_ops.cc:6643
 msgid "Press OK to continue with this split operation"
-msgstr "按OK继续拆分操作"
+msgstr "按下“确定”继续本次拆分操作"
 
-#: editor_ops.cc:6291
+#: editor_ops.cc:6646
 msgid "Excessive split?"
 msgstr "过多的拆分?"
 
-#: editor_ops.cc:6443
+#: editor_ops.cc:6800
 msgid "place transient"
 msgstr "放置过渡"
 
-#: editor_ops.cc:6478
+#: editor_ops.cc:6834
 msgid "snap regions to grid"
 msgstr "吸附区域到网格"
 
-#: editor_ops.cc:6517
+#: editor_ops.cc:6873
 msgid "Close Region Gaps"
-msgstr "关闭区域空缺"
+msgstr "封闭区域间隙"
 
-#: editor_ops.cc:6522
+#: editor_ops.cc:6878
 msgid "Crossfade length"
 msgstr "交叉淡化长度"
 
-#: editor_ops.cc:6531 editor_ops.cc:6542 rhythm_ferret.cc:119
-#: session_option_editor.cc:141
+#: editor_ops.cc:6887 editor_ops.cc:6898 rhythm_ferret.cc:128
+#: rhythm_ferret.cc:143 session_option_editor.cc:141
 msgid "ms"
-msgstr ""
+msgstr "ms(毫秒)"
 
-#: editor_ops.cc:6533
+#: editor_ops.cc:6889
 msgid "Pull-back length"
 msgstr "撤回长度"
 
-#: editor_ops.cc:6546
+#: editor_ops.cc:6902 keyeditor.cc:71
 msgid "Ok"
-msgstr ""
+msgstr "确定"
 
-#: editor_ops.cc:6561
+#: editor_ops.cc:6917
 msgid "close region gaps"
-msgstr "关闭区域空缺"
+msgstr "封闭区域间隙"
 
-#: editor_ops.cc:6786 route_ui.cc:1543
+#: editor_ops.cc:7160
 msgid "That would be bad news ...."
 msgstr "这将是个坏消息…"
 
-#: editor_ops.cc:6791 route_ui.cc:1548
+#: editor_ops.cc:7165
 msgid ""
 "Removing the master or monitor bus is such a bad idea\n"
 "that %1 is not going to allow it.\n"
@@ -5478,23 +6236,17 @@ msgstr ""
 "编辑您的 ardour.rc 文件\n"
 "把\"allow-special-bus-removal\" 选项设为 \"yes\" "
 
-#: editor_ops.cc:6809
-msgid "tracks"
-msgstr "音轨"
-
-#: editor_ops.cc:6811 route_ui.cc:1992
+#: editor_ops.cc:7181
 msgid "track"
-msgstr "音轨"
+msgid_plural "tracks"
+msgstr[0] "track(s) 音轨"
 
-#: editor_ops.cc:6815
-msgid "busses"
-msgstr "总线"
-
-#: editor_ops.cc:6817 route_ui.cc:1992
+#: editor_ops.cc:7182
 msgid "bus"
-msgstr "总线"
+msgid_plural "busses"
+msgstr[0] "bus(ses) 总线"
 
-#: editor_ops.cc:6822
+#: editor_ops.cc:7186
 msgid ""
 "Do you really want to remove %1 %2 and %3 %4?\n"
 "(You may also lose the playlists associated with the %2)\n"
@@ -5504,10 +6256,10 @@ msgstr ""
 "您是否确定移除 %1 %2 和 %3 %4 ?\n"
 "(您也可能会丢失与 %2 相关的播放列表)\n"
 "\n"
-"此操作不可撤销, 而且此会话文件将会被重写覆盖!(您也可能会丢失与 %2 相关的播放列"
-"表)"
+"此操作不可撤销, 而且此会话文件将会被重写覆盖!(您也可能会丢失与 %2 相关的播"
+"放列表)"
 
-#: editor_ops.cc:6827
+#: editor_ops.cc:7191
 msgid ""
 "Do you really want to remove %1 %2?\n"
 "(You may also lose the playlists associated with the %2)\n"
@@ -5519,7 +6271,7 @@ msgstr ""
 "\n"
 "此操作不可撤销, 而且此会话文件将会被重写覆盖!"
 
-#: editor_ops.cc:6833
+#: editor_ops.cc:7197
 msgid ""
 "Do you really want to remove %1 %2?\n"
 "\n"
@@ -5529,139 +6281,140 @@ msgstr ""
 "\n"
 "此操作不可撤销, 而且此会话文件将会被重写覆盖"
 
-#: editor_ops.cc:6840
+#: editor_ops.cc:7204
 msgid "Yes, remove them."
 msgstr "是的,移除它们。"
 
-#: editor_ops.cc:6842 editor_snapshots.cc:160 route_ui.cc:1570
+#: editor_ops.cc:7206 editor_snapshots.cc:172
 msgid "Yes, remove it."
 msgstr "是的,移除它。"
 
-#: editor_ops.cc:6847 editor_ops.cc:6849
+#: editor_ops.cc:7211 editor_ops.cc:7213
 msgid "Remove %1"
 msgstr "移除 %1"
 
-#: editor_ops.cc:6912
+#: editor_ops.cc:7319 editor_ops.cc:7333 editor_ops.cc:7373 editor_ops.cc:7383
 msgid "insert time"
 msgstr "插入时间"
 
-#: editor_ops.cc:7076
+#: editor_ops.cc:7436
+msgid "Cannot insert or delete time when in Lock edit."
+msgstr "当锁定编辑时,无法插入或删除时间。"
+
+#: editor_ops.cc:7456 editor_ops.cc:7468 editor_ops.cc:7541 editor_ops.cc:7554
+msgid "remove time"
+msgstr "移除时间"
+
+#: editor_ops.cc:7628
 msgid "There are too many tracks to fit in the current window"
-msgstr "音轨太多以至于无法匹配当前窗口。"
+msgstr "音轨太多以至于无法匹配当前窗口"
 
-#: editor_ops.cc:7137
+#: editor_ops.cc:7689
 msgid "Sel"
 msgstr "选择"
 
-#: editor_ops.cc:7176
+#: editor_ops.cc:7728
 #, c-format
 msgid "Saved view %u"
-msgstr "保存视图 %u"
+msgstr "存视图 %u"
 
-#: editor_ops.cc:7201
+#: editor_ops.cc:7753
 msgid "mute regions"
 msgstr "静音区域"
 
-#: editor_ops.cc:7203
+#: editor_ops.cc:7755
 msgid "mute region"
 msgstr "静音区域"
 
-#: editor_ops.cc:7240
+#: editor_ops.cc:7792
 msgid "combine regions"
 msgstr "整合区域"
 
-#: editor_ops.cc:7278
+#: editor_ops.cc:7830
 msgid "uncombine regions"
-msgstr "解除整合区域"
+msgstr "撤销整合区域"
 
-#: editor_ops.cc:7315
+#: editor_ops.cc:7867
 msgid "%1: Locked"
 msgstr "%1: 锁定"
 
-#: editor_ops.cc:7322
+#: editor_ops.cc:7874
 msgid "Click to unlock"
-msgstr "点击解除锁定"
+msgstr "点击撤销锁定"
 
-#: editor_ops.cc:7376
+#: editor_ops.cc:7923
 msgid "Moving embedded files into session folder"
 msgstr "移动已嵌入的文件到会话文件夹"
 
-#: editor_regions.cc:112
+#: editor_regions.cc:159
 msgid "Region name, with number of channels in []'s"
-msgstr "区域名,在 [ ] 方括号内附带声道编号"
+msgstr "区域名称,在 [] 方括号内附带声道编号"
 
-#: editor_regions.cc:113
+#: editor_regions.cc:160
 msgid "Position of start of region"
 msgstr "区域起点的位置"
 
-#: editor_regions.cc:114 editor_regions.cc:851 time_info_box.cc:101
+#: editor_regions.cc:161 editor_regions.cc:935 time_info_box.cc:95
 msgid "End"
 msgstr "终点"
 
-#: editor_regions.cc:114
+#: editor_regions.cc:161
 msgid "Position of end of region"
 msgstr "区域终点的位置"
 
-#: editor_regions.cc:115
+#: editor_regions.cc:162
 msgid "Length of the region"
 msgstr "区域的长度"
 
-#: editor_regions.cc:116
+#: editor_regions.cc:163
 msgid "Position of region sync point, relative to start of the region"
 msgstr "区域同步点的位置,与区域起点相关"
 
-#: editor_regions.cc:117
+#: editor_regions.cc:164
 msgid "Length of region fade-in (units: secondary clock), () if disabled"
 msgstr "区域淡入的长度(如果无效时,加上单位:秒计时器)"
 
-#: editor_regions.cc:118
+#: editor_regions.cc:165
 msgid "Length of region fade-out (units: secondary clock), () if disabled"
 msgstr "区域淡出的长度(如果无效时,加上单位:秒计时器)"
 
-#: editor_regions.cc:119 mixer_strip.cc:2055 mono_panner.cc:203 panner2d.cc:240
-#: stereo_panner.cc:251 stereo_panner.cc:274
-msgid "L"
-msgstr ""
+#: editor_regions.cc:166
+msgid "Lock|L"
+msgstr "锁定|L"
 
-#: editor_regions.cc:119
+#: editor_regions.cc:166
 msgid "Region position locked?"
 msgstr "区域位置锁定?"
 
-#: editor_regions.cc:120 route_time_axis.cc:103
-msgid "G"
-msgstr ""
+#: editor_regions.cc:167
+msgid "Gain|G"
+msgstr "增益|G"
 
-#: editor_regions.cc:120
+#: editor_regions.cc:167
 msgid "Region position glued to Bars|Beats time?"
 msgstr "区域位置粘连到小节|拍子时间?"
 
-#: editor_regions.cc:121 editor_routes.cc:211 gain_meter.cc:793 mixer_strip.cc:2032
-#: meter_strip.cc:359 panner_ui.cc:603 route_time_axis.cc:2713 stereo_panner.cc:271
-#: time_axis_view.cc:1190
-msgid "M"
-msgstr ""
-
-#: editor_regions.cc:121
+#: editor_regions.cc:168
 msgid "Region muted?"
 msgstr "区域静音?"
 
-#: editor_regions.cc:122 mixer_strip.cc:1855
-msgid "O"
-msgstr ""
+#: editor_regions.cc:169
+msgid "Opaque|O"
+msgstr "模糊|O"
 
-#: editor_regions.cc:122
+#: editor_regions.cc:169
 msgid "Region opaque (blocks regions below it from being heard)?"
 msgstr "区域模糊(从区域块以下的部分起可以被听见)?"
 
-#: editor_regions.cc:311 editor_regions.cc:316 editor_regions.cc:318
+#: editor_regions.cc:360 editor_regions.cc:365 editor_regions.cc:367
 msgid "Hidden"
 msgstr "隐藏"
 
-#: editor_regions.cc:391
+#: editor_regions.cc:432
 msgid "(MISSING) "
 msgstr "(缺失)"
 
-#: editor_regions.cc:459
+#: editor_regions.cc:500
 msgid ""
 "Do you really want to remove unused regions?\n"
 "(This is destructive and cannot be undone)"
@@ -5669,178 +6422,187 @@ msgstr ""
 "您真的打算移除未使用的区域?\n"
 "(这是破坏性的且无法撤销)"
 
-#: editor_regions.cc:463
+#: editor_regions.cc:504
 msgid "Yes, remove."
 msgstr "是的,移除。"
 
-#: editor_regions.cc:465
+#: editor_regions.cc:506
 msgid "Remove unused regions"
 msgstr "移除未使用的区域"
 
-#: editor_regions.cc:818 editor_regions.cc:832 editor_regions.cc:846
+#: editor_regions.cc:735
+msgid "EditorRegions::format_position: negative timecode position: %1"
+msgstr "编辑器区域::格式_位置: 时间码位置负值: %1"
+
+#: editor_regions.cc:900 editor_regions.cc:916 editor_regions.cc:930
 msgid "Mult."
 msgstr "多"
 
-#: editor_regions.cc:849 midi_list_editor.cc:104 time_info_box.cc:94
+#: editor_regions.cc:933 midi_list_editor.cc:104 time_info_box.cc:88
 msgid "Start"
 msgstr "起点"
 
-#: editor_regions.cc:867 editor_regions.cc:883
+#: editor_regions.cc:951 editor_regions.cc:967
 msgid "Multiple"
 msgstr "多个"
 
-#: editor_regions.cc:952
+#: editor_regions.cc:1036
 msgid "MISSING "
 msgstr "缺失"
 
-#: editor_routes.cc:182 editor_routes.cc:214
+#: editor_routes.cc:126
+msgid "RS"
+msgstr ""
+
+#: editor_routes.cc:208
 msgid "SS"
 msgstr ""
 
-#: editor_routes.cc:206
+#: editor_routes.cc:233
 msgid "Track/Bus Name"
 msgstr "音轨/总线名称"
 
-#: editor_routes.cc:207
+#: editor_routes.cc:234
 msgid "Track/Bus visible ?"
 msgstr "音轨/总线可见?"
 
-#: editor_routes.cc:208 mixer_strip.cc:2046 meter_strip.cc:371
-#: route_time_axis.cc:105 route_time_axis.cc:2701
-msgid "A"
-msgstr ""
-
-#: editor_routes.cc:208
+#: editor_routes.cc:235
 msgid "Track/Bus active ?"
 msgstr "音轨/总线启用?"
 
-#: editor_routes.cc:209 mixer_strip.cc:2033 mixer_strip.cc:2054 meter_strip.cc:379
-msgid "I"
-msgstr ""
+#: editor_routes.cc:236
+msgid "MidiInput|I"
+msgstr "Midi 输入|I"
 
-#: editor_routes.cc:209
+#: editor_routes.cc:236
 msgid "MIDI input enabled"
 msgstr "MIDI输入已启用"
 
-#: editor_routes.cc:210 mono_panner.cc:220 panner2d.cc:241 stereo_panner.cc:249
-#: stereo_panner.cc:276
-msgid "R"
-msgstr ""
+#: editor_routes.cc:237
+msgid "Rec|R"
+msgstr "录制|R"
 
-#: editor_routes.cc:210
+#: editor_routes.cc:237
 msgid "Record enabled"
 msgstr "录制已启用"
 
-#: editor_routes.cc:211
+#: editor_routes.cc:238
+msgid "Rec|RS"
+msgstr "录制| RS"
+
+#: editor_routes.cc:238
+msgid "Record Safe"
+msgstr "录制安全"
+
+#: editor_routes.cc:239
 msgid "Muted"
 msgstr "已静音"
 
-#: editor_routes.cc:212 mixer_strip.cc:2042 meter_strip.cc:367
-#: route_time_axis.cc:2710
-msgid "S"
-msgstr ""
-
-#: editor_routes.cc:212
+#: editor_routes.cc:240
 msgid "Soloed"
 msgstr "已独奏"
 
-#: editor_routes.cc:213
-msgid "SI"
-msgstr ""
+#: editor_routes.cc:241
+msgid "SoloIso|SI"
+msgstr "独奏隔离|SI"
 
-#: editor_routes.cc:213
+#: editor_routes.cc:241
 msgid "Solo Isolated"
 msgstr "独奏已隔离"
 
-#: editor_routes.cc:214
+#: editor_routes.cc:242
+msgid "SoloLock|SS"
+msgstr "独奏锁定|SS"
+
+#: editor_routes.cc:242
 msgid "Solo Safe (Locked)"
 msgstr "独奏安全(锁定)"
 
-#: editor_routes.cc:477 mixer_ui.cc:1197
+#: editor_routes.cc:550 mixer_ui.cc:1498
 msgid "Hide All"
 msgstr "隐藏所有"
 
-#: editor_routes.cc:478 mixer_ui.cc:1198
+#: editor_routes.cc:551 mixer_ui.cc:1499
 msgid "Show All Audio Tracks"
 msgstr "显示所有音频轨道"
 
-#: editor_routes.cc:479 mixer_ui.cc:1199
+#: editor_routes.cc:552 mixer_ui.cc:1500
 msgid "Hide All Audio Tracks"
 msgstr "隐藏所有音频轨道"
 
-#: editor_routes.cc:480 mixer_ui.cc:1200
+#: editor_routes.cc:553 mixer_ui.cc:1501
 msgid "Show All Audio Busses"
 msgstr "显示所有音频总线"
 
-#: editor_routes.cc:481 mixer_ui.cc:1201
+#: editor_routes.cc:554 mixer_ui.cc:1502
 msgid "Hide All Audio Busses"
 msgstr "隐藏所有音频总线"
 
-#: editor_routes.cc:482
+#: editor_routes.cc:555 mixer_ui.cc:1503
 msgid "Show All Midi Tracks"
-msgstr "显示所有MIDI轨"
+msgstr "显示所有MIDI轨道"
 
-#: editor_routes.cc:483
+#: editor_routes.cc:556 mixer_ui.cc:1504
 msgid "Hide All Midi Tracks"
-msgstr "隐藏所有MIDI轨"
+msgstr "隐藏所有MIDI轨道"
 
-#: editor_routes.cc:484
-msgid "Show Tracks With Regions Under Playhead"
-msgstr "显示指针后面区域的轨道"
+#: editor_routes.cc:557
+msgid "Only Show Tracks with Regions Under Playhead"
+msgstr "仅显示指针后面带区域的轨道"
 
-#: editor_rulers.cc:211
+#: editor_rulers.cc:212
 msgid "New location marker"
 msgstr "新建位置标记"
 
-#: editor_rulers.cc:212
+#: editor_rulers.cc:213
 msgid "Clear all locations"
 msgstr "清除所有位置"
 
-#: editor_rulers.cc:213
+#: editor_rulers.cc:214
 msgid "Unhide locations"
-msgstr "取消隐藏位置"
+msgstr "撤销隐藏位置"
 
-#: editor_rulers.cc:217
+#: editor_rulers.cc:218
 msgid "New range"
 msgstr "新建范围"
 
-#: editor_rulers.cc:218
+#: editor_rulers.cc:219
 msgid "Clear all ranges"
 msgstr "清除所有范围"
 
-#: editor_rulers.cc:219
+#: editor_rulers.cc:220
 msgid "Unhide ranges"
-msgstr "取消隐藏范围"
+msgstr "撤销隐藏范围"
 
 #: editor_rulers.cc:224
-msgid "Make Loop range"
-msgstr "设为循环范围"
+msgid "New Loop range"
+msgstr "新建循环范围"
 
 #: editor_rulers.cc:225
-msgid "Make Punch range"
-msgstr "设为切换范围"
+msgid "New Punch range"
+msgstr "新建切换范围"
 
 #: editor_rulers.cc:230
 msgid "New CD track marker"
 msgstr "新建CD音轨标签"
 
-#: editor_rulers.cc:235 tempo_dialog.cc:38
+#: editor_rulers.cc:234 tempo_dialog.cc:38
 msgid "New Tempo"
-msgstr "新节奏"
+msgstr "新建节奏"
 
-#: editor_rulers.cc:239 tempo_dialog.cc:296
+#: editor_rulers.cc:238 tempo_dialog.cc:419
 msgid "New Meter"
-msgstr "新节拍"
+msgstr "新建节拍"
 
-#: editor_snapshots.cc:137
+#: editor_snapshots.cc:149
 msgid "Rename Snapshot"
 msgstr "重命名快照"
 
-#: editor_snapshots.cc:139
+#: editor_snapshots.cc:151
 msgid "New name of snapshot"
 msgstr "快照的新名称"
 
-#: editor_snapshots.cc:157
+#: editor_snapshots.cc:169
 msgid ""
 "Do you really want to remove snapshot \"%1\" ?\n"
 "(which cannot be undone)"
@@ -5848,180 +6610,202 @@ msgstr ""
 "您是否确定移除快照 \"%1\"?\n"
 "(此操作不可撤销)"
 
-#: editor_snapshots.cc:162
+#: editor_snapshots.cc:174
 msgid "Remove snapshot"
 msgstr "移除快照"
 
-#: editor_tempodisplay.cc:194 editor_tempodisplay.cc:234
-msgid "add"
-msgstr "添加"
-
-#: editor_tempodisplay.cc:215
+#: editor_tempodisplay.cc:318
 msgid "add tempo mark"
 msgstr "添加节奏标记"
 
-#: editor_tempodisplay.cc:254
+#: editor_tempodisplay.cc:343
+msgid "add"
+msgstr "添加"
+
+#: editor_tempodisplay.cc:362
 msgid "add meter mark"
 msgstr "添加节拍标记"
 
-#: editor_tempodisplay.cc:287 editor_tempodisplay.cc:315
+#: editor_tempodisplay.cc:401 editor_tempodisplay.cc:435
 msgid "done"
 msgstr "完成"
 
-#: editor_tempodisplay.cc:304 editor_tempodisplay.cc:330
+#: editor_tempodisplay.cc:422
+msgid "replace meter mark"
+msgstr "替换节拍标记"
+
+#: editor_tempodisplay.cc:454
 msgid "replace tempo mark"
 msgstr "替换节奏标记"
 
-#: editor_tempodisplay.cc:353 editor_tempodisplay.cc:387
+#: editor_tempodisplay.cc:485 editor_tempodisplay.cc:519
 msgid "remove tempo mark"
 msgstr "移除节奏标记"
 
-#: editor_tempodisplay.cc:370
-msgid "programming error: meter marker canvas item has no marker object pointer!"
+#: editor_tempodisplay.cc:502
+msgid ""
+"programming error: meter marker canvas item has no marker object pointer!"
 msgstr "程序错误:节拍标记版面条目没有标记对象物体指示!"
 
 #: editor_timefx.cc:68
 msgid "stretch/shrink"
 msgstr "延伸/收缩"
 
-#: editor_timefx.cc:129
+#: editor_timefx.cc:130
 msgid "pitch shift"
 msgstr "音高替换"
 
-#: editor_timefx.cc:301
+#: editor_timefx.cc:282
 msgid "timefx cannot be started - thread creation error"
 msgstr "间特效无法启动 - 线程创建错误"
 
-#: engine_dialog.cc:83
+#: engine_dialog.cc:86
 msgid "Device Control Panel"
 msgstr "设备控制面板"
 
-#: engine_dialog.cc:84
+#: engine_dialog.cc:87
 msgid "Midi Device Setup"
 msgstr "MIDI设备设置"
 
-#: engine_dialog.cc:85 engine_dialog.cc:2097
+#: engine_dialog.cc:89
+msgid "Refresh Devices"
+msgstr "刷新设备"
+
+#: engine_dialog.cc:90
+msgid "Use Buffered I/O"
+msgstr "使用已缓冲的输入/输出"
+
+#: engine_dialog.cc:91 engine_dialog.cc:3000
 msgid "Measure"
 msgstr "测量"
 
-#: engine_dialog.cc:86
+#: engine_dialog.cc:92
 msgid "Use results"
 msgstr "使用结果"
 
-#: engine_dialog.cc:87
+#: engine_dialog.cc:93
 msgid "Back to settings ... (ignore results)"
 msgstr "回到设置…(忽略结果)"
 
-#: engine_dialog.cc:88
+#: engine_dialog.cc:94
 msgid "Calibrate Audio"
 msgstr "校正音频"
 
-#: engine_dialog.cc:92
+#: engine_dialog.cc:98
 msgid "Back to settings"
 msgstr "回到设置"
 
-#: engine_dialog.cc:111
+#: engine_dialog.cc:120
 msgid ""
 "No audio/MIDI backends detected. %1 cannot run\n"
 "\n"
 "(This is a build/packaging/system error. It should never happen.)"
 msgstr ""
-"未检测到音频/MIDI后端。 %1 无法运行\n"
+"未检测到音频/MIDI后端。%1 无法运行\n"
 "\n"
 "(这是一个构建/包装/系统错误。它应该永远不会发生。)"
 
-#: engine_dialog.cc:137
+#: engine_dialog.cc:145
 msgid "Latency Measurement Tool"
 msgstr "延迟测量工具"
 
-#: engine_dialog.cc:149
+#: engine_dialog.cc:157
 msgid ""
-"<span weight=\"bold\">Turn down the volume on your audio equipment to a very low "
-"level.</span>"
+"<span weight=\"bold\">Turn down the volume on your audio equipment to a very "
+"low level.</span>"
 msgstr "<span weight=\"bold\">调低您的音频设备音量到一个非常低的水平。</span>"
 
-#: engine_dialog.cc:158
+#: engine_dialog.cc:166
 msgid "Select two channels below and connect them using a cable."
-msgstr "选择下面两个声道并和使用线条连接它们。"
+msgstr "选择下面两个声道并且使用线条连接它们。"
 
-#: engine_dialog.cc:163
+#: engine_dialog.cc:171
 msgid "Output channel"
 msgstr "输出声道"
 
-#: engine_dialog.cc:171
+#: engine_dialog.cc:179
 msgid "Input channel"
 msgstr "输入声道"
 
-#: engine_dialog.cc:206
+#: engine_dialog.cc:213
 msgid "Once the channels are connected, click the \"Measure\" button."
 msgstr "一旦声道已连接好,单击“测量”按钮。"
 
-#: engine_dialog.cc:213
+#: engine_dialog.cc:220
 msgid "When satisfied with the results, click the \"Use results\" button."
 msgstr "如果得到了令人满意的结果,请点击“使用结果”按钮。"
 
-#: engine_dialog.cc:228 engine_dialog.cc:2217 engine_dialog.cc:2227
+#: engine_dialog.cc:235 engine_dialog.cc:3138 engine_dialog.cc:3148
 msgid "No measurement results yet"
 msgstr "还没有测量结果"
 
-#: engine_dialog.cc:238 route_params_ui.cc:106
+#: engine_dialog.cc:245 route_params_ui.cc:106
 msgid "Latency"
 msgstr "延迟"
 
-#: engine_dialog.cc:372
+#: engine_dialog.cc:520
 msgid "Audio System:"
 msgstr "音频系统:"
 
-#: engine_dialog.cc:409
+#: engine_dialog.cc:564
 msgid "Driver:"
 msgstr "驱动:"
 
-#: engine_dialog.cc:415
+#: engine_dialog.cc:571
+msgid "Input Device:"
+msgstr "输入设备:"
+
+#: engine_dialog.cc:575
+msgid "Output Device:"
+msgstr "输出设备:"
+
+#: engine_dialog.cc:582
 msgid "Device:"
 msgstr "设备:"
 
-#: engine_dialog.cc:420 engine_dialog.cc:519 sfdb_ui.cc:153 sfdb_ui.cc:348
-#: sfdb_ui.cc:353
+#: engine_dialog.cc:591 engine_dialog.cc:699 export_report.cc:164
+#: export_report.cc:328 sfdb_ui.cc:153 sfdb_ui.cc:348 sfdb_ui.cc:353
 msgid "Sample rate:"
 msgstr "采样率:"
 
-#: engine_dialog.cc:426 engine_dialog.cc:526
+#: engine_dialog.cc:597 engine_dialog.cc:706
 msgid "Buffer size:"
 msgstr "缓冲区大小:"
 
-#: engine_dialog.cc:444
+#: engine_dialog.cc:606
+msgid "Periods:"
+msgstr "周期:"
+
+#: engine_dialog.cc:624
 msgid "Input Channels:"
 msgstr "输入声道:"
 
-#: engine_dialog.cc:457
+#: engine_dialog.cc:637
 msgid "Output Channels:"
 msgstr "输出声道:"
 
-#: engine_dialog.cc:469
+#: engine_dialog.cc:649
 msgid "Hardware input latency:"
 msgstr "硬件输入延迟:"
 
-#: engine_dialog.cc:472 engine_dialog.cc:485
+#: engine_dialog.cc:652 engine_dialog.cc:665
 msgid "samples"
-msgstr "采样"
+msgstr "样本"
 
-#: engine_dialog.cc:482
+#: engine_dialog.cc:662
 msgid "Hardware output latency:"
 msgstr "硬件输出延迟:"
 
-#: engine_dialog.cc:493
+#: engine_dialog.cc:673
 msgid "MIDI System:"
 msgstr "MIDI系统:"
 
-#: engine_dialog.cc:511
+#: engine_dialog.cc:691
 msgid ""
-"The %1 audio backend was configured and started externally.\n"
-"This limits your control over it."
-msgstr ""
-"音频后端已配置并已在外部启动。\n"
-"这限制了您对它的控制力。"
+"%1 is already running. %2 will connect to it and use the existing settings."
+msgstr "%1 已经在运行中。%2 将会连接到它并且使用已存在的设置。"
 
-#: engine_dialog.cc:564
+#: engine_dialog.cc:744
 msgid ""
 "Failed to start or connect to audio-engine.\n"
 "\n"
@@ -6031,7 +6815,7 @@ msgstr ""
 "\n"
 "延迟校准需要有一个音频接口在工作。"
 
-#: engine_dialog.cc:570
+#: engine_dialog.cc:750
 msgid ""
 "Your selected audio configuration is playback- or capture-only.\n"
 "\n"
@@ -6041,229 +6825,282 @@ msgstr ""
 "\n"
 "延迟校准需要回放和捕捉"
 
-#: engine_dialog.cc:651
+#: engine_dialog.cc:965
 msgid "MIDI Devices"
 msgstr "MIDI 设备"
 
-#: engine_dialog.cc:657
+#: engine_dialog.cc:971
 msgid "Device"
 msgstr "设备"
 
-#: engine_dialog.cc:659
+#: engine_dialog.cc:973
 msgid "Hardware Latencies"
 msgstr "硬件延迟"
 
-#: engine_dialog.cc:700
+#: engine_dialog.cc:1014
 msgid "Calibrate"
 msgstr "æ ¡æ­£"
 
-#: engine_dialog.cc:800
+#: engine_dialog.cc:1117
 msgid "all available channels"
 msgstr "所有可用的声道"
 
-#: engine_dialog.cc:1039 latency_gui.cc:39
-msgid "sample"
-msgid_plural "samples"
-msgstr[0] "采样"
+#: engine_dialog.cc:1599 latency_gui.cc:55
+msgid "%1 sample"
+msgid_plural "%1 samples"
+msgstr[0] "%1 样本"
 
-#: engine_dialog.cc:1090
+#: engine_dialog.cc:1662
 #, c-format
 msgid "(%.1f ms)"
-msgstr ""
+msgstr "(%.1f ms 毫秒)"
 
-#: engine_dialog.cc:1593
+#: engine_dialog.cc:2413
 msgid "Could not start backend engine %1"
 msgstr "无法启动后端引擎 %1"
 
-#: engine_dialog.cc:1644
+#: engine_dialog.cc:2445
 msgid "Cannot set driver to %1"
 msgstr "无法设置驱动到 %1"
 
-#: engine_dialog.cc:1648
+#: engine_dialog.cc:2450
+msgid "Cannot set input device name to %1"
+msgstr "无法设置输入设备名称到 %1"
+
+#: engine_dialog.cc:2454
+msgid "Cannot set output device name to %1"
+msgstr "无法设置输出设备名称到 %1"
+
+#: engine_dialog.cc:2459
 msgid "Cannot set device name to %1"
 msgstr "无法设置设备名称到 %1"
 
-#: engine_dialog.cc:1652
+#: engine_dialog.cc:2464
 msgid "Cannot set sample rate to %1"
 msgstr "无法设置采样率到 %1"
 
-#: engine_dialog.cc:1656
+#: engine_dialog.cc:2468
 msgid "Cannot set buffer size to %1"
 msgstr "无法设置缓冲区大小到 %1"
 
-#: engine_dialog.cc:1662
+#: engine_dialog.cc:2472
+msgid "Cannot set periods to %1"
+msgstr "无法设置周期到 %1"
+
+#: engine_dialog.cc:2478
 msgid "Cannot set input channels to %1"
 msgstr "无法设置输入声道到 %1"
 
-#: engine_dialog.cc:1666
+#: engine_dialog.cc:2482
 msgid "Cannot set output channels to %1"
 msgstr "无法设置输出声道到 %1"
 
-#: engine_dialog.cc:1672
+#: engine_dialog.cc:2488
 msgid "Cannot set input latency to %1"
 msgstr "无法设置输入延迟到 %1"
 
-#: engine_dialog.cc:1676
+#: engine_dialog.cc:2492
 msgid "Cannot set output latency to %1"
 msgstr "无法设置输出延迟到 %1"
 
-#: engine_dialog.cc:1955 engine_dialog.cc:2014
+#: engine_dialog.cc:2851 engine_dialog.cc:2917
 msgid "No signal detected "
 msgstr "未检测到信号"
 
-#: engine_dialog.cc:1968 engine_dialog.cc:2022 port_insert_ui.cc:70
+#: engine_dialog.cc:2858
+msgid ""
+"Input signal is > -3dBFS. Lower the signal level (output gain, input gain) "
+"on the audio-interface."
+msgstr ""
+"输入信号 > -3 dBFS 分贝振幅。在音频界面上较低的信号电平(输出增益,输入增"
+"益) 。"
+
+#: engine_dialog.cc:2871 engine_dialog.cc:2925 port_insert_ui.cc:70
 #: port_insert_ui.cc:98
 msgid "Disconnected from audio engine"
 msgstr "与音频引擎已断开连接"
 
-#: engine_dialog.cc:1977 engine_dialog.cc:2030
+#: engine_dialog.cc:2880 engine_dialog.cc:2933
 msgid "Detected roundtrip latency: "
 msgstr "检测到往返延迟:"
 
-#: engine_dialog.cc:1979 engine_dialog.cc:2032
+#: engine_dialog.cc:2882 engine_dialog.cc:2935
 msgid "Systemic latency: "
 msgstr "系统延迟:"
 
-#: engine_dialog.cc:1986
+#: engine_dialog.cc:2889
 msgid "(signal detection error)"
 msgstr "(信号检测错误)"
 
-#: engine_dialog.cc:1992
+#: engine_dialog.cc:2895
 msgid "(inverted - bad wiring)"
 msgstr "(反向 - 损坏接线)"
 
-#: engine_dialog.cc:2039
+#: engine_dialog.cc:2942
 msgid "(averaging)"
 msgstr "(平均)"
 
-#: engine_dialog.cc:2045
+#: engine_dialog.cc:2948
 msgid "(too large jitter)"
-msgstr "(振幅过大)"
+msgstr "(过大振幅)"
 
-#: engine_dialog.cc:2049
+#: engine_dialog.cc:2952
 msgid "(large jitter)"
 msgstr "(大振幅)"
 
-#: engine_dialog.cc:2061
+#: engine_dialog.cc:2964
 msgid "Timeout - large MIDI jitter."
 msgstr "超时 - 大MIDI振幅。"
 
-#: engine_dialog.cc:2077 port_insert_ui.cc:134
+#: engine_dialog.cc:2980 port_insert_ui.cc:134
 msgid "Detecting ..."
 msgstr "检测中…"
 
-#: engine_dialog.cc:2171
+#: engine_dialog.cc:3081
 msgid "Disconnect from %1"
 msgstr "与 %1 失去连接"
 
-#: engine_dialog.cc:2175 mixer_strip.cc:1522 route_group_dialog.cc:45
-#: route_time_axis.cc:841
-msgid "Active"
-msgstr "激活"
+#: engine_dialog.cc:3086
+msgid "Running"
+msgstr "运行中"
 
-#: engine_dialog.cc:2185
+#: engine_dialog.cc:3088
+msgid "Connected"
+msgstr "已连接"
+
+#: engine_dialog.cc:3099
 msgid "Connect to %1"
 msgstr "连接到 %1"
 
-#: engine_dialog.cc:2190
-msgid "Inactive"
-msgstr "未激活"
+#: engine_dialog.cc:3103 shuttle_control.cc:655
+msgid "Stopped"
+msgstr "已停止"
 
-#: export_channel_selector.cc:45 sfdb_ui.cc:151
+#: export_channel_selector.cc:46 export_report.cc:159 export_report.cc:324
+#: sfdb_ui.cc:151
 msgid "Channels:"
 msgstr "声道:"
 
-#: export_channel_selector.cc:46
+#: export_channel_selector.cc:47
 msgid "Split to mono files"
 msgstr "拆分到单声道文件"
 
-#: export_channel_selector.cc:182
+#: export_channel_selector.cc:197
 msgid "Bus or Track"
 msgstr "总线或音轨"
 
-#: export_channel_selector.cc:459
+#: export_channel_selector.cc:474
 msgid "Region contents without fades nor region gain (channels: %1)"
-msgstr "区域内容没有淡化也没有区域增益(声道: %1)"
+msgstr "区域内容没有淡化也没有区域增益(声道:%1)"
 
-#: export_channel_selector.cc:463
+#: export_channel_selector.cc:478
 msgid "Region contents with fades and region gain (channels: %1)"
-msgstr "区域内容带有淡化和区域增益(声道: %1)"
+msgstr "区域内容带有淡化和区域增益(声道:%1)"
 
-#: export_channel_selector.cc:467
+#: export_channel_selector.cc:482
 msgid "Track output (channels: %1)"
-msgstr "音轨输出 (声道: %1)"
+msgstr "音轨输出(声道:%1)"
+
+#: export_channel_selector.cc:552
+msgid "Apply track/bus processing"
+msgstr "应用音轨/总线处理"
 
-#: export_channel_selector.cc:536
-msgid "Export region contents"
-msgstr "导出区域内容"
+#: export_channel_selector.cc:553
+msgid "Select all tracks"
+msgstr "选择全部音轨"
 
-#: export_channel_selector.cc:537
-msgid "Export track output"
-msgstr "导出音轨输出"
+#: export_channel_selector.cc:554
+msgid "Select all busses"
+msgstr "选择全部总线"
 
-#: export_dialog.cc:46
+#: export_channel_selector.cc:555
+msgid "Deselect all"
+msgstr "全部不选"
+
+#: export_channel_selector.cc:589
+msgid "Track name"
+msgstr "音轨名称"
+
+#: export_dialog.cc:49
 msgid ""
-"<span color=\"#ffa755\">Some already existing files will be overwritten.</span>"
-msgstr "<span color=\"#ffa755\">一些已存在的文件将会被写入覆盖。</span>"
+"<span color=\"#ffa755\">Some already existing files will be overwritten.</"
+"span>"
+msgstr "<span color=\"#ffa755\">一些已存在的文件将会被写入覆盖。</span>\" \""
 
-#: export_dialog.cc:47
+#: export_dialog.cc:50
 msgid "List files"
 msgstr "列表文件"
 
-#: export_dialog.cc:158 export_format_dialog.cc:59
+#: export_dialog.cc:163 export_format_dialog.cc:67
 msgid "File format"
 msgstr "文件格式"
 
-#: export_dialog.cc:159 export_timespan_selector.cc:374
-#: export_timespan_selector.cc:436
+#: export_dialog.cc:164 export_timespan_selector.cc:411
+#: export_timespan_selector.cc:502
 msgid "Time Span"
 msgstr "时间跨度"
 
-#: export_dialog.cc:160
+#: export_dialog.cc:165
 msgid "Channels"
 msgstr "声道"
 
-#: export_dialog.cc:182
+#: export_dialog.cc:187
 msgid ""
 "Export has been aborted due to an error!\n"
 "See the Log for details."
 msgstr ""
 "导出意外中止,因为有个错误!\n"
-"详情请见日志。"
+"详情请参阅日志。"
 
-#: export_dialog.cc:251
+#: export_dialog.cc:298
 msgid "Files that will be overwritten"
-msgstr "将会被被写入覆盖的文件"
+msgstr "将会被写入覆盖的文件"
 
-#: export_dialog.cc:296
+#: export_dialog.cc:343
 msgid "Export initialization failed: %1"
-msgstr "导出初始化失败: %1"
+msgstr "导出初始化失败:%1"
 
-#: export_dialog.cc:306
+#: export_dialog.cc:353
 msgid "Stop Export"
-msgstr "Stop Export 停止导出"
+msgstr "停止导出"
 
-#: export_dialog.cc:327
+#: export_dialog.cc:383
 msgid "export"
 msgstr "导出"
 
-#: export_dialog.cc:346
+#: export_dialog.cc:402
+msgid "Exporting '%3' (timespan %1 of %2)"
+msgstr "正在导出 '%3' (时间跨度 %1 的 %2)"
+
+#: export_dialog.cc:407
 msgid "Normalizing '%3' (timespan %1 of %2)"
-msgstr "规范化 '%3' (时间跨度 %1 的 %2)"
+msgstr "正在规范化 '%3'(时间跨度 %1 的 %2)"
 
-#: export_dialog.cc:350
-msgid "Exporting '%3' (timespan %1 of %2)"
-msgstr "导出 '%3' (时间跨度 %1 的 %2)"
+#: export_dialog.cc:412
+msgid "Encoding '%3' (timespan %1 of %2)"
+msgstr "正在编码 '%3'(时间跨度 %1 的 %2)"
+
+#: export_dialog.cc:417
+msgid "Tagging '%3' (timespan %1 of %2)"
+msgstr "正在标注 '%3' (时间跨度 %1 的 %2)"
 
-#: export_dialog.cc:373 export_dialog.cc:375
+#: export_dialog.cc:421
+msgid "Uploading '%3' (timespan %1 of %2)"
+msgstr "正在上传 '%3' (时间跨度 %1 的 %2)"
+
+#: export_dialog.cc:425
+msgid "Running Post Export Command for '%1'"
+msgstr "正在为 '%1' 运行后置导出命令"
+
+#: export_dialog.cc:453 export_dialog.cc:455
 msgid "<span color=\"#ffa755\">Error: "
 msgstr "<span color=\"#ffa755\">错误:"
 
-#: export_dialog.cc:385
+#: export_dialog.cc:465
 msgid "<span color=\"#ffa755\">Warning: "
 msgstr "<span color=\"#ffa755\">警告:"
 
-#: export_dialog.cc:387
+#: export_dialog.cc:467
 msgid ""
 "\n"
 "<span color=\"#ffa755\">Warning: "
@@ -6271,19 +7108,19 @@ msgstr ""
 "\n"
 "<span color=\"#ffa755\">警告:"
 
-#: export_dialog.cc:411
+#: export_dialog.cc:491
 msgid "Export Selection"
 msgstr "导出已选择部分"
 
-#: export_dialog.cc:425
+#: export_dialog.cc:505
 msgid "Export Region"
 msgstr "导出区域"
 
-#: export_dialog.cc:434
+#: export_dialog.cc:514
 msgid "Source"
-msgstr "源"
+msgstr "来源"
 
-#: export_dialog.cc:450
+#: export_dialog.cc:530
 msgid "Stem Export"
 msgstr "逆向导出"
 
@@ -6291,183 +7128,286 @@ msgstr "逆向导出"
 msgid "Add another format"
 msgstr "添加另一个格式"
 
-#: export_file_notebook.cc:193
+#: export_file_notebook.cc:198
 msgid "Format"
 msgstr "格式"
 
-#: export_file_notebook.cc:194
+#: export_file_notebook.cc:199
 msgid "Location"
 msgstr "位置"
 
-#: export_file_notebook.cc:195
+#: export_file_notebook.cc:200
 msgid "Upload to Soundcloud"
 msgstr "上传到Soundcloud"
 
-#: export_file_notebook.cc:273
+#: export_file_notebook.cc:201
+msgid "Analyze Exported Audio"
+msgstr "分析已导出的音频"
+
+#: export_file_notebook.cc:286
 msgid "No format!"
 msgstr "不格式化!"
 
-#: export_file_notebook.cc:291
+#: export_file_notebook.cc:304
 msgid "Format %1: %2"
 msgstr "格式化 %1: %2"
 
-#: export_filename_selector.cc:32
+#: export_filename_selector.cc:33
 msgid "Label:"
 msgstr "标签:"
 
-#: export_filename_selector.cc:33
+#: export_filename_selector.cc:34 session_dialog.cc:310
 msgid "Session Name"
 msgstr "会话名称"
 
-#: export_filename_selector.cc:34
+#: export_filename_selector.cc:35
+msgid "Timespan Name"
+msgstr "时间跨度名称"
+
+#: export_filename_selector.cc:36
 msgid "Revision:"
 msgstr "修订版本:"
 
-#: export_filename_selector.cc:36
+#: export_filename_selector.cc:38
 msgid "Folder:"
 msgstr "文件夹:"
 
-#: export_filename_selector.cc:37 session_import_dialog.cc:45
-#: transcode_video_dialog.cc:59 video_server_dialog.cc:54 video_server_dialog.cc:56
-#: export_video_dialog.cc:81 export_video_dialog.cc:83
+#: export_filename_selector.cc:39 session_import_dialog.cc:45
+#: transcode_video_dialog.cc:59 video_server_dialog.cc:54
+#: video_server_dialog.cc:56 export_video_dialog.cc:77
+#: export_video_dialog.cc:79
 msgid "Browse"
 msgstr "浏览"
 
-#: export_filename_selector.cc:41
-msgid "<i>Build filename(s) from these components:</i>"
-msgstr "<i>从这些组件构建文件名:</i>"
+#: export_filename_selector.cc:40 export_report.cc:118
+msgid "Open Folder"
+msgstr "打开文件夹"
 
-#: export_filename_selector.cc:212
-msgid "<small><i>Sorry, no example filename can be shown at the moment</i></small>"
-msgstr "<small><i>对不起,目前没有例子文件名可以显示</i></small>"
+#: export_filename_selector.cc:45
+msgid "Build filename(s) from these components:"
+msgstr "从这些组件构建文件名:"
+
+#: export_filename_selector.cc:217
+msgid ""
+"<small><i>Sorry, no example filename can be shown at the moment</i></small>"
+msgstr "<small><i>对不起,目前没有样本文件名可供显示</i></small>"
 
-#: export_filename_selector.cc:214
-msgid "<small><i>Current (approximate) filename: \"%1\"</i></small>"
-msgstr "<small><i>当前(近似)文件名: ”%1“</i></small>"
+#: export_filename_selector.cc:219
+msgid "<i>Current (approximate) filename</i>: \"%1\""
+msgstr "<i>当前(近似)文件名</i>: \"%1\""
 
-#: export_filename_selector.cc:250 export_filename_selector.cc:336
+#: export_filename_selector.cc:255 export_filename_selector.cc:402
 msgid ""
 "%1: this is only the directory/folder name, not the filename.\n"
-"The filename will be chosen from the information just above the folder selector."
+"The filename will be chosen from the information just above the folder "
+"selector."
 msgstr ""
 "%1:这仅是目录/文件夹名称,不是文件名\n"
 "将会从刚才上面的文件选择器信息里选出文件名。"
 
-#: export_filename_selector.cc:322
+#: export_filename_selector.cc:378
+msgid "%1: this is not a valid directory/folder."
+msgstr "%1这不是一个有效的目录/文件夹。"
+
+#: export_filename_selector.cc:388
 msgid "Choose export folder"
 msgstr "选择导出文件夹"
 
-#: export_format_dialog.cc:31
+#: export_format_dialog.cc:32
 msgid "New Export Format Profile"
 msgstr "新建导出格式配置文件"
 
-#: export_format_dialog.cc:31
+#: export_format_dialog.cc:32
 msgid "Edit Export Format Profile"
 msgstr "编辑导出格式配置文件"
 
-#: export_format_dialog.cc:38
+#: export_format_dialog.cc:39
 msgid "Label: "
 msgstr "标签:"
 
-#: export_format_dialog.cc:41 normalize_dialog.cc:42
-msgid "Normalize to:"
-msgstr "规范化到:"
+#: export_format_dialog.cc:42
+msgid "Normalize:"
+msgstr "规范化:"
+
+#: export_format_dialog.cc:43
+msgid "Peak"
+msgstr "峰值"
+
+#: export_format_dialog.cc:44
+msgid "Loudness"
+msgstr "响度"
+
+# LUFS:欧洲广播联盟 (EBU) 指定的响度单位 
+#: export_format_dialog.cc:50
+msgid "LUFS"
+msgstr ""
+
+# dBTP最大真峰值电平
+#: export_format_dialog.cc:51
+msgid "dBTP"
+msgstr ""
 
-#: export_format_dialog.cc:46
+#: export_format_dialog.cc:54
 msgid "Trim silence at start"
 msgstr "在起点修剪无声"
 
-#: export_format_dialog.cc:47
+#: export_format_dialog.cc:55
 msgid "Add silence at start:"
 msgstr "在起点添加无声:"
 
-#: export_format_dialog.cc:50
+#: export_format_dialog.cc:58
 msgid "Trim silence at end"
 msgstr "在终点修剪无声"
 
-#: export_format_dialog.cc:51
+#: export_format_dialog.cc:59
 msgid "Add silence at end:"
 msgstr "在终点添加无声:"
 
-#: export_format_dialog.cc:54
+#: export_format_dialog.cc:62
 msgid ""
 "Command to run post-export\n"
-"(%f=full path & filename, %d=directory, %b=basename):"
+"(%f=file path, %d=directory, %b=basename, see tooltip for more):"
 msgstr ""
-"运行后置-导出的命令\n"
-"(%f=完整路径和文件名,%d=目录,%b=基本名称):"
+"运行后置导出的命令\n"
+"(%f=文件路径,%d=目录,%b=基本名称,,更多信息请参阅工具提示):"
 
-#: export_format_dialog.cc:57
+#: export_format_dialog.cc:65
 msgid "Compatibility"
 msgstr "兼容性"
 
-#: export_format_dialog.cc:58
+#: export_format_dialog.cc:66
 msgid "Quality"
 msgstr "质量"
 
-#: export_format_dialog.cc:61
+#: export_format_dialog.cc:69
 msgid "Sample rate conversion quality:"
 msgstr "采样率转换质量:"
 
-#: export_format_dialog.cc:68
+#: export_format_dialog.cc:76
 msgid "Dithering"
 msgstr "抖动"
 
-# CUE  cuesheet 是指光盘映像(镜像)辅助文件或称标记文件
-#: export_format_dialog.cc:70
+# CUE cuesheet 是指光盘映像(镜像)辅助文件或称标记文件
+#: export_format_dialog.cc:78
 msgid "Create CUE file for disk-at-once CD/DVD creation"
-msgstr "为创建一次性CD/DVD光盘而创建CUE文件"
+msgstr "为创建一次性CD/DVD光盘而创建 CUE(光盘映像辅助)文件"
 
-# 目录数据 (Table of Content,TOC)
-#: export_format_dialog.cc:71
+#: export_format_dialog.cc:79
 msgid "Create TOC file for disk-at-once CD/DVD creation"
-msgstr "为创建一次性CD/DVD光盘而创建TOC文件"
+msgstr "为创建一次性CD/DVD光盘而创建 TOC(目录数据)文件"
 
-#: export_format_dialog.cc:73
+#: export_format_dialog.cc:80
+msgid "Create chapter mark file for MP4 chapter marks"
+msgstr "为 MP4 章节标记创建章节标记"
+
+#: export_format_dialog.cc:82
 msgid "Tag file with session's metadata"
 msgstr "会话元数据的标签文件"
 
-#: export_format_dialog.cc:470
+#: export_format_dialog.cc:119
+msgid "∧"
+msgstr ""
+
+#: export_format_dialog.cc:124
+msgid ""
+"Normalize to EBU-R128 LUFS target loudness without exceeding the given true-"
+"peak limit. EBU-R128 normalization is only available for mono and stereo "
+"targets, true-peak works for any channel layout."
+msgstr ""
+"规范化为EBU-R128 LUFS 目标响度没有超出给定的真实峰值限制。EBU-R128 规范化仅可"
+"用于独奏和立体声目标,真实峰值适用于任何声道布局。"
+
+#: export_format_dialog.cc:152
+msgid ""
+"%a Artist name\n"
+"%b File's base-name\n"
+"%c Copyright\n"
+"%d File's directory\n"
+"%f File's full absolute path\n"
+"%l Lyricist\n"
+"%n Session name\n"
+"%o Conductor\n"
+"%t Title\n"
+"%z Organization\n"
+"%A Album\n"
+"%C Comment\n"
+"%E Engineer\n"
+"%G Genre\n"
+"%L Total track count\n"
+"%M Mixer\n"
+"%N Timespan name\n"
+"%O Composer\n"
+"%P Producer\n"
+"%S Disc subtitle\n"
+"%T Track number\n"
+"%Y Year\n"
+"%Z Country"
+msgstr ""
+"%a 艺术家名字\n"
+"%b 文件的基本名称\n"
+"%c 版权\n"
+"%d 文件的目录\n"
+"%f 文件的完整绝对路径\n"
+"%l 歌词作者\n"
+"%n 会话名称\n"
+"%o 指挥家\n"
+"%t 标题\n"
+"%z 组织\n"
+"%A 专辑\n"
+"%C 注释\n"
+"%E 工程师\n"
+"%G 流派\n"
+"%L 轨道数总计\n"
+"%M 混音师\n"
+"%N 时间跨度名称\n"
+"%O 作曲家\n"
+"%P 制作人\n"
+"%S 碟片副标题\n"
+"%T 轨道数量\n"
+"%Y 年份\n"
+"%Z 国家"
+
+#: export_format_dialog.cc:537
 msgid "Best (sinc)"
 msgstr "最佳(sinc)"
 
-#: export_format_dialog.cc:475
+#: export_format_dialog.cc:542
 msgid "Medium (sinc)"
 msgstr "中等(sinc)"
 
-#: export_format_dialog.cc:480
+#: export_format_dialog.cc:547
 msgid "Fast (sinc)"
 msgstr "快速(sinc)"
 
-#: export_format_dialog.cc:490
+#: export_format_dialog.cc:557
 msgid "Zero order hold"
 msgstr "零阶保持"
 
-#: export_format_dialog.cc:895
+#: export_format_dialog.cc:981
 msgid "Linear encoding options"
 msgstr "线性编码选项"
 
-#: export_format_dialog.cc:911
+#: export_format_dialog.cc:997
 msgid "Ogg Vorbis options"
 msgstr "Ogg Vorbis 选项"
 
-#: export_format_dialog.cc:922
+#: export_format_dialog.cc:1008
 msgid "FLAC options"
 msgstr "FLAC 选项"
 
-#: export_format_dialog.cc:939
+#: export_format_dialog.cc:1025
 msgid "Broadcast Wave options"
 msgstr "广播Wave选项"
 
-#: export_format_selector.cc:136
+#: export_format_selector.cc:131
 msgid "Do you really want to remove the format?"
-msgstr "您是否真的要移除这个格式?"
+msgstr "您是否真的打算移除这个格式?"
 
 #: export_preset_selector.cc:28
 msgid "Preset"
 msgstr "预设"
 
-#: export_preset_selector.cc:104
+#: export_preset_selector.cc:99
 msgid ""
 "The selected preset did not load successfully!\n"
 "Perhaps it references a format that has been removed?"
@@ -6475,245 +7415,472 @@ msgstr ""
 "被选中的预设载入失败!\n"
 "也许它引用了一个已被删除的格式?"
 
-#: export_preset_selector.cc:156
+#: export_preset_selector.cc:151
 msgid "Do you really want to remove this preset?"
 msgstr "您是否真的要移除这个预设?"
 
-#: export_timespan_selector.cc:46
-msgid "Show Times as:"
-msgstr "显示时间为:"
+#: export_report.cc:56
+msgid "Export Report/Analysis"
+msgstr "导出报告/分析"
 
-#: export_timespan_selector.cc:53 processor_box.cc:2466
-msgid "Select All"
-msgstr "选择所有"
+#: export_report.cc:147 export_report.cc:327 sfdb_ui.cc:149
+msgid "Format:"
+msgstr "格式:"
 
-#: export_timespan_selector.cc:223 transform_dialog.cc:93
-msgid " to "
-msgstr "到"
+#: export_report.cc:166 export_report.cc:328
+msgid "%1 Hz"
+msgstr ""
 
-#: export_timespan_selector.cc:367 export_timespan_selector.cc:426
-msgid "Range"
-msgstr "范围"
+#: export_report.cc:169 export_report.cc:336 transcode_video_dialog.cc:139
+msgid "Duration:"
+msgstr "音长:"
 
-#: sfdb_freesound_mootcher.cc:189 sfdb_freesound_mootcher.cc:324
-msgid "curl error %1 (%2)"
-msgstr "回旋错误 %1 (%2)"
+#: export_report.cc:177 export_report.cc:334
+msgid "Timecode:"
+msgstr "时间码:"
 
-#: sfdb_freesound_mootcher.cc:266
-msgid "getSoundResourceFile: There is no valid root in the xml file"
-msgstr "获取声音资源文件:在 xml 文件里没有正确的根"
+#: export_report.cc:185
+msgid "Error:"
+msgstr "错误:"
 
-#: sfdb_freesound_mootcher.cc:271
-msgid "getSoundResourceFile: root = %1, != response"
-msgstr "获取声音资源文件:根 = %1, ! = 响应"
+#: export_report.cc:220 export_report.cc:440
+msgid "(too short integration time)"
+msgstr "(集成时间太短)"
 
-#: sfdb_freesound_mootcher.cc:410 rc_option_editor.cc:1824
-msgid "%1"
+#: export_report.cc:222
+msgid "-888"
 msgstr ""
 
-#: gain_meter.cc:132 gain_meter.cc:400 gain_meter.cc:505 gain_meter.cc:896
-msgid "-inf"
+#: export_report.cc:227 export_report.cc:353
+msgid "Peak:"
+msgstr "峰值:"
+
+#: export_report.cc:228 export_report.cc:360
+msgid "%1 dBFS"
 msgstr ""
 
-#: gain_meter.cc:147 gain_meter.cc:958
-msgid "Fader automation mode"
-msgstr "淡化器自动模式"
+#: export_report.cc:229 export_report.cc:369
+msgid "True Peak:"
+msgstr "真实峰值:"
 
-#: gain_meter.cc:148 gain_meter.cc:959
-msgid "Fader automation type"
-msgstr "淡化器自动类型"
+#: export_report.cc:230 export_report.cc:376
+msgid "%1 dBTP"
+msgstr ""
 
-#: gain_meter.cc:157 gain_meter.cc:829 panner_ui.cc:179 panner_ui.cc:639
-msgid "Abs"
+#: export_report.cc:231 export_report.cc:387
+msgid "Normalization Gain:"
+msgstr "规范化增益:"
+
+#: export_report.cc:232
+msgid "+888.88 dB"
 msgstr ""
 
-#: gain_meter.cc:796 mixer_strip.cc:2049 meter_strip.cc:374 panner_ui.cc:606
-#: route_time_axis.cc:104 route_time_axis.cc:2705
-msgid "P"
+#: export_report.cc:234 export_report.cc:448
+msgid "Integrated Loudness:"
+msgstr "已集成的响度:"
+
+#: export_report.cc:235 export_report.cc:454
+msgid "%1 LUFS"
 msgstr ""
 
-#: gain_meter.cc:799 panner_ui.cc:609
-msgid "T"
+#: export_report.cc:236 export_report.cc:460
+msgid "Loudness Range:"
+msgstr "响度范围:"
+
+#: export_report.cc:237 export_report.cc:466
+msgid "%1 LU"
 msgstr ""
 
-#: gain_meter.cc:802 panner_ui.cc:612
-msgid "W"
+#: export_report.cc:247 export_report.cc:754
+msgid "100"
 msgstr ""
 
-#: generic_pluginui.cc:83
-msgid "<span size=\"large\">Presets</span>"
-msgstr "<span size=\"large\">预设</span>"
+#: export_report.cc:282 export_report.cc:650
+msgid "00:00:00.000"
+msgstr ""
 
-#: generic_pluginui.cc:97
-msgid "Manual"
-msgstr "手册"
+#: export_report.cc:288
+msgid "0|A8"
+msgstr ""
 
-#: generic_pluginui.cc:106
-msgid "All Automation"
-msgstr "全部自动化"
+#: export_report.cc:394
+msgid "%1 dB"
+msgstr ""
 
-#: generic_pluginui.cc:250
-msgid "Switches"
-msgstr "转换"
+#: export_report.cc:425 export_report.cc:433 export_report.cc:553
+msgid ""
+"Not\n"
+"Available"
+msgstr ""
+"不\n"
+"可用"
 
-#: generic_pluginui.cc:260 generic_pluginui.cc:436 processor_box.cc:2440
-msgid "Controls"
-msgstr "控制"
+#: export_report.cc:493
+msgid ""
+"LUFS\n"
+"(short)"
+msgstr ""
+"LUFS\n"
+"(短)"
 
-#: generic_pluginui.cc:293
-msgid "Plugin Editor: could not build control element for port %1"
-msgstr "插件编辑器:无法为端口 %1 建立控制元素"
+#: export_report.cc:503
+msgid "Multiplicity"
+msgstr "多重"
 
-#: generic_pluginui.cc:318
-msgid "Plugin Editor: no control for property %1"
-msgstr "插件编辑器:无法控制 %1 属性"
+#: export_report.cc:603
+msgid "Logscale|Lg"
+msgstr " 对数标尺|Lg"
 
-#: generic_pluginui.cc:324
-msgid "Plugin Editor: could not build control element for property %1"
-msgstr "插件编辑器:无法为 %1 属性建立控制元素"
+#: export_report.cc:604
+msgid "Rectified|Rf"
+msgstr "已矫正的|Rf"
 
-#: generic_pluginui.cc:468
-msgid "Meters"
-msgstr "节拍"
+#: export_report.cc:605
+msgid "Logscale"
+msgstr " 对数分度"
 
-#: generic_pluginui.cc:490
-msgid "Automation control"
-msgstr "自动控制"
+#: export_report.cc:606
+msgid "Rectified"
+msgstr "已矫正"
 
-#: generic_pluginui.cc:497
-msgid "Mgnual"
+#: export_report.cc:738
+msgid "Hz"
 msgstr ""
 
-#: global_port_matrix.cc:158
+#: export_report.cc:755
+msgid "500"
+msgstr ""
+
+#: export_report.cc:756
+msgid "1K"
+msgstr ""
+
+#: export_report.cc:757
+msgid "5K"
+msgstr ""
+
+#: export_report.cc:758
+msgid "10K"
+msgstr ""
+
+#: export_report.cc:844
+msgid "Writing Export Analysis Image: %1."
+msgstr "正在写入导出分析映像:%1。"
+
+#: export_report.cc:941 sfdb_ui.cc:293 sfdb_ui.cc:409
+msgid "Could not read file: %1 (%2)."
+msgstr "无法读取文件: %1 (%2)。"
+
+#: export_report.cc:967 sfdb_ui.cc:458
+msgid "Could not access soundfile: "
+msgstr "无法访问声音文件:"
+
+#: export_report.cc:1203
+msgid "-36"
+msgstr ""
+
+#: export_report.cc:1204 export_report.cc:1208 export_report.cc:1214
+#: export_report.cc:1217
+msgid "-18"
+msgstr ""
+
+#: export_report.cc:1205 export_report.cc:1209 export_report.cc:1215
+#: export_report.cc:1218 export_report.cc:1221 export_report.cc:1222
+msgid "-9"
+msgstr ""
+
+#: export_report.cc:1206 export_report.cc:1210 export_report.cc:1216
+#: export_report.cc:1219 export_report.cc:1223 export_report.cc:1224
+msgid "-3"
+msgstr ""
+
+#: export_timespan_selector.cc:45
+msgid "Show Times as:"
+msgstr "显示时间为:"
+
+#: export_timespan_selector.cc:46
+msgid "Realtime Export"
+msgstr "实时导出"
+
+#: export_timespan_selector.cc:54 processor_box.cc:3695
+msgid "Select All"
+msgstr "选择所有"
+
+#: export_timespan_selector.cc:255 transform_dialog.cc:93
+msgid " to "
+msgstr "到"
+
+#: export_timespan_selector.cc:399 export_timespan_selector.cc:488
+msgid "RT"
+msgstr ""
+
+#: export_timespan_selector.cc:400 export_timespan_selector.cc:489
+msgid "Range"
+msgstr "范围"
+
+#: sfdb_freesound_mootcher.cc:189 sfdb_freesound_mootcher.cc:324
+msgid "curl error %1 (%2)"
+msgstr "回旋错误 %1 (%2)"
+
+#: sfdb_freesound_mootcher.cc:266
+msgid "getSoundResourceFile: There is no valid root in the xml file"
+msgstr "获取声音资源文件:在 xml 文件里没有正确的根"
+
+#: sfdb_freesound_mootcher.cc:271
+msgid "getSoundResourceFile: root = %1, != response"
+msgstr "获取声音资源文件:根 = %1, ! = 响应"
+
+#: sfdb_freesound_mootcher.cc:410 rc_option_editor.cc:2416
+msgid "%1"
+msgstr ""
+
+#: gain_meter.cc:137 gain_meter.cc:422 gain_meter.cc:527 gain_meter.cc:919
+msgid "-inf"
+msgstr ""
+
+#: gain_meter.cc:152 gain_meter.cc:983
+msgid "Fader automation mode"
+msgstr "淡化器自动模式"
+
+#: gain_meter.cc:153 gain_meter.cc:984
+msgid "Fader automation type"
+msgstr "淡化器自动类型"
+
+#: gain_meter.cc:162 gain_meter.cc:852 panner_ui.cc:179 panner_ui.cc:641
+msgid "Abs"
+msgstr ""
+
+#: gain_meter.cc:816 vca_master_strip.cc:78 vca_time_axis.cc:54
+msgid "M"
+msgstr ""
+
+#: gain_meter.cc:819 vca_master_strip.cc:296
+msgid "P"
+msgstr ""
+
+#: gain_meter.cc:822
+msgid "T"
+msgstr ""
+
+#: gain_meter.cc:825
+msgid "W"
+msgstr ""
+
+#: generic_pluginui.cc:83
+msgid "<span size=\"large\">Presets</span>"
+msgstr "<span size=\"large\">预设</span>"
+
+#: generic_pluginui.cc:98 plugin_pin_dialog.cc:333
+msgid "Manual"
+msgstr "手动"
+
+#: generic_pluginui.cc:107
+msgid "All Automation"
+msgstr "全部自动化"
+
+#: generic_pluginui.cc:250
+msgid "Plugin Editor: could not build control element for port %1"
+msgstr "插件编辑器:无法为端口 %1 建立控制元素"
+
+#: generic_pluginui.cc:282
+msgid "Plugin Editor: no control for property %1"
+msgstr "插件编辑器:无法控制 %1 属性"
+
+#: generic_pluginui.cc:288
+msgid "Plugin Editor: could not build control element for property %1"
+msgstr "插件编辑器:无法为 %1 属性建立控制元素"
+
+#: generic_pluginui.cc:359
+msgid "Switches"
+msgstr "转换"
+
+#: generic_pluginui.cc:369 generic_pluginui.cc:475 processor_box.cc:3665
+msgid "Controls"
+msgstr "控制"
+
+#: generic_pluginui.cc:510
+msgid "Meters"
+msgstr "节拍"
+
+#: generic_pluginui.cc:548
+msgid "Automation control"
+msgstr "自动化控制"
+
+#: generic_pluginui.cc:555
+msgid "Mgnual"
+msgstr ""
+
+#: generic_pluginui.cc:828
+msgid "This control cannot be automated"
+msgstr "这个控制不能被自动化。"
+
+#: global_port_matrix.cc:158
 msgid "Audio Connection Manager"
-msgstr "音频连结管理器"
+msgstr "音频连接管理器"
 
 #: global_port_matrix.cc:161
 msgid "MIDI Connection Manager"
 msgstr "MIDI连接管理器"
 
-#: global_port_matrix.cc:201 io_selector.cc:211 mixer_strip.cc:793
-#: mixer_strip.cc:894
+#: global_port_matrix.cc:201 io_selector.cc:211 mixer_strip.cc:870
+#: mixer_strip.cc:973 monitor_section.cc:1430 monitor_selector.cc:189
+#: plugin_pin_dialog.cc:1757
 msgid "Disconnect"
-msgstr "取消连接"
+msgstr "撤销连接"
 
-#: global_port_matrix.cc:207 io_selector.cc:217
+#: global_port_matrix.cc:207 io_selector.cc:217 monitor_selector.cc:195
 msgid "port"
 msgstr "端口"
 
-#: group_tabs.cc:312
+#: group_tabs.cc:312 group_tabs.cc:321
 msgid "Selection..."
 msgstr "已选择部分…"
 
-#: group_tabs.cc:313
+#: group_tabs.cc:313 group_tabs.cc:322
 msgid "Record Enabled..."
-msgstr "启用录制…"
+msgstr "已启用录制…"
 
-#: group_tabs.cc:314
+#: group_tabs.cc:314 group_tabs.cc:323
 msgid "Soloed..."
-msgstr "独奏…"
+msgstr "已独奏…"
 
-#: group_tabs.cc:320
+#: group_tabs.cc:316
+msgid "Create New Group From..."
+msgstr "创建新分组来自于…"
+
+#: group_tabs.cc:325
+msgid "Create New Group with Master From..."
+msgstr "创建带操作台的新分组来自于…"
+
+#: group_tabs.cc:344
 msgid "Create New Group ..."
 msgstr "创建新的分组…"
 
-#: group_tabs.cc:321
-msgid "Create New Group From"
-msgstr "创建新的分组来自于"
+#: group_tabs.cc:345
+msgid "Create New Group with Control Master ..."
+msgstr "创建带控制操作台的新分组…"
 
-#: group_tabs.cc:324
+#: group_tabs.cc:355
 msgid "Edit Group..."
 msgstr "编辑分组…"
 
-#: group_tabs.cc:325
+#: group_tabs.cc:356
 msgid "Collect Group"
 msgstr "收集分组"
 
-#: group_tabs.cc:326
+#: group_tabs.cc:357
 msgid "Remove Group"
 msgstr "移除分组"
 
-#: group_tabs.cc:329
+#: group_tabs.cc:368
+msgid "Assign Group to Control Master..."
+msgstr "指定分组到控制操作台…"
+
+#: group_tabs.cc:374
 msgid "Remove Subgroup Bus"
 msgstr "移除次级分组总线"
 
-#: group_tabs.cc:331
+#: group_tabs.cc:376
 msgid "Add New Subgroup Bus"
 msgstr "添加新的次级分组总线"
 
-#: group_tabs.cc:333
+#: group_tabs.cc:378
 msgid "Add New Aux Bus (pre-fader)"
-msgstr "添加新的辅助总线(前置淡化)"
+msgstr "添加新的辅助总线(前置于淡化器)"
 
-#: group_tabs.cc:334
+#: group_tabs.cc:379
 msgid "Add New Aux Bus (post-fader)"
-msgstr "添加新的辅助总线(后置淡化)"
+msgstr "添加新的辅助总线(后置于淡化器)"
+
+#: group_tabs.cc:404
+msgid "Assign Selection to Control Master..."
+msgstr "指定已选择部分到控制操作台…"
+
+#: group_tabs.cc:415
+msgid "Assign Record Enabled to Control Master..."
+msgstr "指定录制已启用到控制操作台…"
+
+#: group_tabs.cc:426
+msgid "Assign Soloed to Control Master..."
+msgstr "指定已独奏到控制操作台…"
 
-#: group_tabs.cc:340
+#: group_tabs.cc:429
 msgid "Enable All Groups"
 msgstr "启用所有分组"
 
-#: group_tabs.cc:341
+#: group_tabs.cc:430
 msgid "Disable All Groups"
 msgstr "禁用所有分组"
 
-#: insert_time_dialog.cc:46
+#: insert_remove_time_dialog.cc:52
+msgid "Time to remove"
+msgstr "要移除的时间位置:"
+
+#: insert_remove_time_dialog.cc:52
 msgid "Time to insert:"
 msgstr "要插入的时间位置:"
 
-#: insert_time_dialog.cc:54
+#: insert_remove_time_dialog.cc:61
 msgid "Intersected regions should:"
 msgstr "相交的区域应该:"
 
-#: insert_time_dialog.cc:57
+#: insert_remove_time_dialog.cc:64
 msgid "stay in position"
 msgstr "停留在原位"
 
-#: insert_time_dialog.cc:58
+#: insert_remove_time_dialog.cc:65
 msgid "move"
 msgstr "移动"
 
-#: insert_time_dialog.cc:59
+#: insert_remove_time_dialog.cc:66
 msgid "be split"
 msgstr "拆分"
 
-#: insert_time_dialog.cc:65
-msgid "Insert time on all the track's playlists"
-msgstr "在所有的音轨播放列表上插入时间"
+#: insert_remove_time_dialog.cc:73
+msgid "Apply to all the track's playlists"
+msgstr "应用到所有音轨的播放列表"
 
-#: insert_time_dialog.cc:68
+#: insert_remove_time_dialog.cc:76
 msgid "Move glued regions"
 msgstr "移动被粘连的区域"
 
-#: insert_time_dialog.cc:70
+#: insert_remove_time_dialog.cc:78
 msgid "Move markers"
 msgstr "移动标记"
 
-#: insert_time_dialog.cc:73
+#: insert_remove_time_dialog.cc:81
 msgid "Move glued markers"
 msgstr "移动被粘连的标记"
 
-#: insert_time_dialog.cc:78
+#: insert_remove_time_dialog.cc:86
 msgid "Move locked markers"
 msgstr "移动被锁定的标记"
 
-#: insert_time_dialog.cc:83
+#: insert_remove_time_dialog.cc:91
 msgid ""
 "Move tempo and meter changes\n"
 "<i>(may cause oddities in the tempo map)</i>"
 msgstr ""
 "移动节奏和节拍变化\n"
-"(也许会在节奏图中引发异常)"
+"<i>(也许会在节奏映射中引发异常)</i>"
+
+#: insert_remove_time_dialog.cc:99
+msgid "Remove time"
+msgstr "移除时间"
 
-#: insert_time_dialog.cc:91
+#: insert_remove_time_dialog.cc:99
 msgid "Insert time"
 msgstr "插入时间"
 
-#: instrument_selector.cc:62
+#: insert_remove_time_dialog.cc:174
+msgid "Invalid or zero duration entered. Please enter a valid duration"
+msgstr "所输入的音长无效或为零。请输入一个有效的音长"
+
+#: instrument_selector.cc:92
 msgid "-none-"
 msgstr "— 无 —"
 
-#: interthread_progress_window.cc:103
+#: interthread_progress_window.cc:114
 msgid "Importing file: %1 of %2"
 msgstr "导入文件: %2 的 %1"
 
@@ -6721,65 +7888,90 @@ msgstr "导入文件: %2 的 %1"
 msgid "I/O selector"
 msgstr "输入/输出选择器"
 
-#: io_selector.cc:266
+#: io_selector.cc:266 monitor_selector.cc:244
 msgid "%1 input"
 msgstr "%1 输入"
 
-#: io_selector.cc:268
+#: io_selector.cc:268 monitor_selector.cc:246
 msgid "%1 output"
 msgstr "%1 输出"
 
-#: keyboard.cc:70
+#: keyboard.cc:93
 msgid "your own"
 msgstr "您自己的"
 
-#: keyboard.cc:133 keyboard.cc:157
+#: keyboard.cc:157 keyboard.cc:181
 msgid "Default keybindings not found - %1 will be hard to use!"
 msgstr "找不到默认的按键绑定—— %1 将很难使用!"
 
-#: keyboard.cc:136
+#: keyboard.cc:160
 msgid "Key bindings file \"%1\" not found. Default bindings used instead"
 msgstr "找不到按键绑定文件 \"%1\"。使用默认绑定替代。"
 
-#: keyeditor.cc:54
+#: keyboard.cc:193
+msgid "Loading keybindings from %1"
+msgstr "正在从 %1 载入按键绑定"
+
+#: keyeditor.cc:67
+msgid "Colliding keybindings"
+msgstr "按键绑定冲突"
+
+#: keyeditor.cc:68
+msgid ""
+"The key sequence is already bound. Please remove the other binding first."
+msgstr "该按键序列已经被绑定过了。请先移除其它绑定。"
+
+#: keyeditor.cc:77
+msgid "Key Bindings"
+msgstr "按键绑定"
+
+#: keyeditor.cc:78
 msgid "Remove shortcut"
 msgstr "移除快捷键"
 
-#: keyeditor.cc:63
-msgid "Action"
-msgstr "操作"
+#: keyeditor.cc:80
+msgid "Search..."
+msgstr "搜索…"
 
-#: keyeditor.cc:64
-msgid "Shortcut"
-msgstr "快捷键"
+#: keyeditor.cc:82
+msgid "Print"
+msgstr "打印"
 
-#: keyeditor.cc:84
-msgid "Select an action, then press the key(s) to (re)set its shortcut"
-msgstr "选择一个操作,然后按下按键来(重新)设置快捷键"
+#: keyeditor.cc:93
+msgid "Click to reset search string"
+msgstr "点击重置搜索字符串"
 
-#: keyeditor.cc:98
+#: keyeditor.cc:97
+msgid "To remove a shortcut select an action then press this: "
+msgstr "要移除一个快捷键请选择一个动作然后按下这个:"
+
+#: keyeditor.cc:109
 msgid "Reset Bindings to Defaults"
 msgstr "重置为默认绑定"
 
-#: keyeditor.cc:263
-msgid "Main_menu"
-msgstr "主菜单"
-
-#: keyeditor.cc:265
-msgid "redirectmenu"
-msgstr "重定向菜单"
+#: keyeditor.cc:227 lua_script_manager.cc:41
+msgid "Action"
+msgstr "操作"
 
-#: keyeditor.cc:267
-msgid "Editor_menus"
-msgstr "编辑器菜单"
+#: keyeditor.cc:228
+msgid "Shortcut"
+msgstr "快捷键"
 
-#: keyeditor.cc:269
+#: keyeditor.cc:370
 msgid "RegionList"
 msgstr "区域列表"
 
-#: keyeditor.cc:271
-msgid "ProcessorMenu"
-msgstr "处理器菜单"
+#: keyeditor.cc:543
+msgid "Could not open temporary file to print bindings (%1)"
+msgstr "无法打开临时文件用来打印绑定 (%1)"
+
+#: keyeditor.cc:561
+msgid "Could not save bindings to file (%1)"
+msgstr "无法保存绑定到文件 (%1)"
+
+#: latency_gui.cc:39
+msgid "sample"
+msgstr "样本"
 
 #: latency_gui.cc:40
 msgid "msec"
@@ -6789,108 +7981,223 @@ msgstr "毫秒"
 msgid "period"
 msgstr "周期"
 
-#: latency_gui.cc:55
-msgid "%1 sample"
-msgid_plural "%1 samples"
-msgstr[0] "%1 采样"
-
-#: latency_gui.cc:72 panner_ui.cc:409
+#: latency_gui.cc:72 panner_ui.cc:411 plugin_pin_dialog.cc:109 plugin_ui.cc:421
 msgid "Reset"
 msgstr "预设"
 
-#: latency_gui.cc:149 rhythm_ferret.cc:273 sfdb_ui.cc:1912
+#: latency_gui.cc:149 rhythm_ferret.cc:295 sfdb_ui.cc:1878
 msgid "programming error: %1 (%2)"
 msgstr "程序错误: %1 (%2)"
 
-#: location_ui.cc:52 location_ui.cc:54
+#: location_ui.cc:54 location_ui.cc:57
 msgid "Use PH"
 msgstr "使用 PH"
 
-#: location_ui.cc:59
+#: location_ui.cc:55 location_ui.cc:58
+msgid "Goto"
+msgstr "跳到"
+
+#: location_ui.cc:63
 msgid "Glue"
 msgstr "粘连"
 
-#: location_ui.cc:87
+#: location_ui.cc:88
 msgid "Performer:"
 msgstr "演奏者:"
 
-#: location_ui.cc:88
+#: location_ui.cc:89
 msgid "Composer:"
 msgstr "作曲家:"
 
-#: location_ui.cc:90
+#: location_ui.cc:91
 msgid "Pre-Emphasis"
 msgstr "预加重"
 
-#: location_ui.cc:317
+#: location_ui.cc:319
 msgid "Remove this range"
 msgstr "移除这个范围"
 
-#: location_ui.cc:318
+#: location_ui.cc:320
 msgid "Start time - middle click to locate here"
-msgstr "起点时间——鼠标中键点击放置在此处"
+msgstr "起点时间 —— 鼠标中键点击放置在此处"
 
-#: location_ui.cc:319
+#: location_ui.cc:321
 msgid "End time - middle click to locate here"
-msgstr "终点时间——鼠标中键点击放置在此处"
+msgstr "终点时间 —— 鼠标中键点击放置在此处"
 
-#: location_ui.cc:322
+#: location_ui.cc:324
 msgid "Set range start from playhead location"
 msgstr "从指针位置设置范围起点"
 
-#: location_ui.cc:323
+#: location_ui.cc:325
 msgid "Set range end from playhead location"
 msgstr "从指针位置设置范围终点"
 
-#: location_ui.cc:327
+#: location_ui.cc:329
 msgid "Remove this marker"
 msgstr "移除这个标记"
 
-#: location_ui.cc:328
+#: location_ui.cc:330
 msgid "Position - middle click to locate here"
-msgstr "位置——鼠标中键点击放置在此处"
+msgstr "位置 —— 鼠标中键点击放置在此处"
 
-#: location_ui.cc:330
+#: location_ui.cc:332
 msgid "Set marker time from playhead location"
 msgstr "从指针位置设置标记时间"
 
-#: location_ui.cc:499
+#: location_ui.cc:524
 msgid "You cannot put a CD marker at the start of the session"
 msgstr "您不能在会话起点处放置CD标记"
 
-#: location_ui.cc:725
+#: location_ui.cc:750
 msgid "New Marker"
 msgstr "新建标记"
 
-#: location_ui.cc:726
+#: location_ui.cc:751
 msgid "New Range"
 msgstr "新建范围"
 
-#: location_ui.cc:739
+#: location_ui.cc:764
 msgid "<b>Loop/Punch Ranges</b>"
 msgstr "<b>循环/切换范围</b>"
 
-#: location_ui.cc:764
+#: location_ui.cc:790
 msgid "<b>Markers (Including CD Index)</b>"
 msgstr "<b>标记(包括CD索引)</b>"
 
-#: location_ui.cc:799
+#: location_ui.cc:825
 msgid "<b>Ranges (Including CD Track Ranges)</b>"
 msgstr "<b>范围(包括CD音轨范围)</b>"
 
-#: location_ui.cc:1042
+#: location_ui.cc:1068
 msgid "add range marker"
 msgstr "添加范围标记"
 
-#: main.cc:82
+#: lua_script_manager.cc:31
+msgid "Add/Set"
+msgstr "添加/设置"
+
+#: lua_script_manager.cc:34
+msgid "Call"
+msgstr "调用"
+
+#: lua_script_manager.cc:35
+msgid "New Hook"
+msgstr "新建牵引钩"
+
+#: lua_script_manager.cc:77
+msgid "Signal(s)"
+msgstr "信号"
+
+#: lua_script_manager.cc:127
+msgid "Action %1"
+msgstr "动作 %1"
+
+#: lua_script_manager.cc:132 lua_script_manager.cc:227
+msgid "Unset"
+msgstr "复位"
+
+#: luainstance.cc:1096
+msgid "Cannot read script '%1': %2"
+msgstr "无法读取脚本 '%1': %2"
+
+#: luawindow.cc:97
+msgid "Run"
+msgstr "运行"
+
+#: luawindow.cc:98
+msgid "Clear Output"
+msgstr "清除输出"
+
+#: luawindow.cc:102
+msgid "Revert"
+msgstr "重置"
+
+#: luawindow.cc:166
+msgid "Select Editor Buffer"
+msgstr "选择编辑器缓冲"
+
+#: luawindow.cc:253 luawindow.cc:258
+msgid "Window|Lua"
+msgstr "窗口|Lua"
+
+#: luawindow.cc:286 luawindow.cc:304
+msgid "LuaException: %1"
+msgstr "Lua除外:%1"
+
+#: luawindow.cc:342
+msgid "Deleted %1"
+msgstr "删除 %1"
+
+#: luawindow.cc:345
+msgid "Failed to delete %1"
+msgstr "删除 %1 失败"
+
+#: luawindow.cc:411
+msgid ""
+"Missing script header.\n"
+"The script requires an '{ardour}' info table and a 'factory' function."
+msgstr ""
+"缺失脚本文件头。\n"
+"脚本要求一个 '{ardour}' 信息表以及一个 'factory' 函数。"
+
+#: luawindow.cc:416
+msgid "Script fails to compile."
+msgstr "脚本编译失败。"
+
+#: luawindow.cc:423
+msgid "Invalid or missing script-name or script-type."
+msgstr "无效或者缺失脚本名称或者脚本类型。"
+
+#: luawindow.cc:428
+msgid ""
+"Invalid script-type.\n"
+"Valid types are 'EditorAction' and 'Snippet'."
+msgstr ""
+"无效的脚本类型。\n"
+"有效的类型是 'EditorAction' 以及 'Snippet'。"
+
+#: luawindow.cc:439 luawindow.cc:490
+msgid "Saved as %1"
+msgstr "保存为 %1"
+
+#: luawindow.cc:442 luawindow.cc:493
+msgid "Error saving file: %1"
+msgstr "保存文件出错:%1"
+
+#: luawindow.cc:452
+msgid ""
+"Script with given name '%1' already exists.\n"
+"Use a different name in the descriptor."
+msgstr ""
+"带有给定名称 '%1' 的脚本已经存在。\n"
+"请在描述中使用一个不同的名称。"
+
+#: luawindow.cc:636
+msgid "Scratch Buffer %1"
+msgstr "抓取缓冲 %1"
+
+#: luawindow.cc:638
+msgid "Action: '%1'"
+msgstr "动作:'%1'"
+
+#: luawindow.cc:640
+msgid "Snippet: %1"
+msgstr "片段:%1"
+
+#: luawindow.cc:652
+msgid "Save as"
+msgstr "另存为"
+
+#: main.cc:88
 msgid "%1 could not connect to the audio backend."
-msgstr "%1无法连接到音频后端。"
+msgstr "%1 无法连接到音频后端。"
 
-#: main.cc:107 main.cc:123
+#: main.cc:135 main.cc:151
 msgid "The audio backend (%1) has failed, or terminated"
 msgstr "音频后端(%1)失效或者中止。"
 
-#: main.cc:110
+#: main.cc:138
 msgid ""
 "%2 exited unexpectedly, and without notifying %1.\n"
 "\n"
@@ -6901,13 +8208,13 @@ msgstr ""
 "%2 意外退出,且没有通知 %1 。\n"
 "\n"
 "这可能是由于错误配置或者定向到错误 %2 内部错误。\n"
-"点击 OK 退出 %1。"
+"点击“确定”退出 %1。"
 
-#: main.cc:124
+#: main.cc:152
 msgid "%2 exited unexpectedly, and without notifying %1."
-msgstr "%2 exited unexpectedly, and without notifying %1."
+msgstr "%2 意外退出,且没有通知 %1 。"
 
-#: main.cc:219
+#: main.cc:247
 msgid ""
 "\n"
 "   %1 could not understand your command line      "
@@ -6915,68 +8222,88 @@ msgstr ""
 "\n"
 "   %1 无法识别您的命令行      "
 
-#: main.cc:221
+#: main.cc:249
 msgid "An error was encountered while launching %1"
 msgstr "启动 %1 时遇到一个意外错误"
 
-#: main.cc:310
+#: main.cc:350
 msgid " (built using "
 msgstr "(构建使用 "
 
-#: main.cc:313
+#: main.cc:353
 msgid " and GCC version "
-msgstr "和 GCC 版本 "
+msgstr " 和 GCC 版本 "
 
-#: main.cc:323
-msgid "Copyright (C) 1999-2012 Paul Davis"
-msgstr " 版权 (C) 1999-2012 Paul Davis"
+#: main.cc:363
+msgid "Copyright (C) 1999-2015 Paul Davis"
+msgstr "版权 (C) 1999-2012 Paul Davis"
 
-#: main.cc:324
+#: main.cc:364
 msgid ""
-"Some portions Copyright (C) Steve Harris, Ari Johnson, Brett Viren, Joel Baker, "
-"Robin Gareus"
+"Some portions Copyright (C) Steve Harris, Ari Johnson, Brett Viren, Joel "
+"Baker, Robin Gareus"
 msgstr ""
 "部分版权 (C) Steve Harris, Ari Johnson, Brett Viren, Joel Baker, Robin Gareus"
 
-#: main.cc:326
+#: main.cc:366
 msgid "%1 comes with ABSOLUTELY NO WARRANTY"
 msgstr "%1 绝对不附带任何担保"
 
-#: main.cc:327
+#: main.cc:367
 msgid "not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
-msgstr " 甚至不包括可销售性质和适用于任何特定目的的保证。"
+msgstr "甚至不包括可销售性质和适用于任何特定目的的保证。"
 
-#: main.cc:328
+#: main.cc:368
 msgid "This is free software, and you are welcome to redistribute it "
 msgstr "这是自由软件,且欢迎您分发推广它,"
 
-#: main.cc:329
+#: main.cc:369
 msgid "under certain conditions; see the source for copying conditions."
 msgstr "在一定条件下;请参阅复制协议的源文件。"
 
-#: main.cc:334
+#: main.cc:374
 msgid "could not initialize %1."
 msgstr "无法初始化 %1 。"
 
-#: main.cc:344
+#: main.cc:384
 msgid "Cannot xinstall SIGPIPE error handler"
 msgstr "无法安装卸载 SIGPIPE 错误处理程序"
 
-#: main.cc:351
+#: main.cc:391
+msgid "Could not complete pre-GUI initialization"
+msgstr "无法完成先导-用户图形界面初始化"
+
+#: main.cc:398
 msgid "could not create %1 GUI"
 msgstr "无法创建  %1 图形用户界面"
 
-#: main_clock.cc:52
+#: main_clock.cc:51
 msgid "Display delta to edit cursor"
 msgstr "显示次级以编辑游标"
 
-#: marker.cc:273
+#: main_clock.cc:66 tempo_dialog.cc:55
+msgid "Edit Tempo"
+msgstr "编辑节奏"
+
+#: main_clock.cc:67 tempo_dialog.cc:429
+msgid "Edit Meter"
+msgstr "编辑节拍"
+
+#: main_clock.cc:68
+msgid "Insert Tempo Change"
+msgstr "插入节奏变换"
+
+#: main_clock.cc:69
+msgid "Insert Meter Change"
+msgstr "插入节拍变换"
+
+#: marker.cc:280
 msgid "MarkerText"
 msgstr "标记文本"
 
 #: midi_channel_selector.cc:161 midi_channel_selector.cc:400
-#: midi_channel_selector.cc:436 rc_option_editor.cc:1573 rc_option_editor.cc:2203
-#: sfdb_ui.cc:665
+#: midi_channel_selector.cc:436 rc_option_editor.cc:2157
+#: rc_option_editor.cc:2799 sfdb_ui.cc:671
 msgid "None"
 msgstr "æ— "
 
@@ -7015,7 +8342,7 @@ msgstr "仅录制已选中的声道"
 
 #: midi_channel_selector.cc:335
 msgid "Force all channels to 1 channel"
-msgstr "强制所有声道为 1 声道"
+msgstr "强制所有声道到 1 声道"
 
 #: midi_channel_selector.cc:376
 msgid "Inbound"
@@ -7055,19 +8382,19 @@ msgstr "点击切换回放声道 %1"
 
 #: midi_channel_selector.cc:628
 msgid "Click to force all MIDI channel messages to channel %1"
-msgstr "点击强制所有MIDI声道发送信息到声道 %1"
+msgstr "击强制所有MIDI声道发送信息到声道 %1"
 
-#: midi_channel_selector.cc:718
+#: midi_channel_selector.cc:720
 msgid "Click to toggle recording of channel %1"
 msgstr "点击切换录制声道 %1"
 
-#: midi_channel_selector.cc:726
+#: midi_channel_selector.cc:728
 msgid "Click to force all recorded channels to %1"
 msgstr "点击强制所有已录制声道到 %1"
 
 #: midi_export_dialog.cc:35
 msgid "Export MIDI: %1"
-msgstr "导出MIDI: %1"
+msgstr "导出MIDI:%1"
 
 #: midi_list_editor.cc:56
 msgid "Whole"
@@ -7103,7 +8430,7 @@ msgstr "六十四分之一"
 
 #: midi_list_editor.cc:106
 msgid "Num"
-msgstr "数值"
+msgstr "编号"
 
 #: midi_list_editor.cc:108
 msgid "Vel"
@@ -7139,19 +8466,19 @@ msgstr "删除音符(从列表中)"
 
 #: midi_list_editor.cc:602
 msgid "change note channel"
-msgstr "切换音符声道"
+msgstr "改变音符声道"
 
 #: midi_list_editor.cc:610
 msgid "change note number"
-msgstr "切换音符编号"
+msgstr "改变音符编号"
 
 #: midi_list_editor.cc:620
 msgid "change note velocity"
-msgstr "切换音符力度"
+msgstr "改变音符力度"
 
 #: midi_list_editor.cc:690
 msgid "change note length"
-msgstr "切换音符长度"
+msgstr "改变音符长度"
 
 #: midi_port_dialog.cc:39
 msgid "Add MIDI Port"
@@ -7165,43 +8492,43 @@ msgstr "端口名称:"
 msgid "MidiPortDialog"
 msgstr "MIDI端口对话框"
 
-#: midi_region_view.cc:859
+#: midi_region_view.cc:855
 msgid "channel edit"
 msgstr "声道编辑"
 
-#: midi_region_view.cc:895
+#: midi_region_view.cc:891
 msgid "velocity edit"
 msgstr "力度编辑"
 
-#: midi_region_view.cc:954
+#: midi_region_view.cc:958
 msgid "add note"
 msgstr "添加音符"
 
-#: midi_region_view.cc:1885
+#: midi_region_view.cc:1902
 msgid "step add"
 msgstr "步进添加"
 
-#: midi_region_view.cc:1979 midi_region_view.cc:2002
+#: midi_region_view.cc:1996 midi_region_view.cc:2019
 msgid "alter patch change"
 msgstr "更改音色变换"
 
-#: midi_region_view.cc:2038
+#: midi_region_view.cc:2055
 msgid "add patch change"
 msgstr "添加音色变换"
 
-#: midi_region_view.cc:2060 midi_region_view.cc:2061
+#: midi_region_view.cc:2077 midi_region_view.cc:2078
 msgid "move patch change"
 msgstr "移动音色变换"
 
-#: midi_region_view.cc:2073 midi_region_view.cc:2074
+#: midi_region_view.cc:2090 midi_region_view.cc:2091
 msgid "delete patch change"
 msgstr "删除音色变换"
 
-#: midi_region_view.cc:2112
+#: midi_region_view.cc:2129
 msgid "delete selection"
 msgstr "删除已选取部分"
 
-#: midi_region_view.cc:2128
+#: midi_region_view.cc:2146
 msgid "delete note"
 msgstr "删除音符"
 
@@ -7209,162 +8536,158 @@ msgstr "删除音符"
 msgid "move notes"
 msgstr "移动音符"
 
-#: midi_region_view.cc:3070
+#: midi_region_view.cc:3137
 msgid "change velocities"
 msgstr "改变力度"
 
-#: midi_region_view.cc:3136
+#: midi_region_view.cc:3203
 msgid "transpose"
 msgstr "变调"
 
-#: midi_region_view.cc:3164
+#: midi_region_view.cc:3231
 msgid "change note lengths"
 msgstr "改变音符长度"
 
-#: midi_region_view.cc:3240
+#: midi_region_view.cc:3307
 msgid "nudge"
 msgstr "微调"
 
-#: midi_region_view.cc:3255
+#: midi_region_view.cc:3322
 msgid "change channel"
 msgstr "改变声道"
 
-#: midi_region_view.cc:3295
+#: midi_region_view.cc:3370
 msgid "Bank "
 msgstr "库"
 
-#: midi_region_view.cc:3296
-msgid "Program "
-msgstr "程序"
-
-#: midi_region_view.cc:3297
+#: midi_region_view.cc:3372
 msgid "Channel "
 msgstr "声道"
 
-#: midi_region_view.cc:3484
+#: midi_region_view.cc:3559
 msgid "paste"
 msgstr "粘贴"
 
-#: midi_streamview.cc:185
+#: midi_streamview.cc:184
 msgid "attempt to display MIDI region with no source"
 msgstr "尝试显示无来源的 MIDI 区域"
 
-#: midi_streamview.cc:195
+#: midi_streamview.cc:194
 msgid "attempt to display MIDI region with no model"
 msgstr "尝试显示无模式的 MIDI 区域"
 
-#: midi_streamview.cc:506
+#: midi_streamview.cc:505
 msgid "failed to create MIDI region"
 msgstr "创建 MIDI 区域失败"
 
-#: midi_time_axis.cc:309
+#: midi_time_axis.cc:306
 msgid "External MIDI Device"
 msgstr "外部 MIDI 设备"
 
-#: midi_time_axis.cc:310
+#: midi_time_axis.cc:307
 msgid "External Device Mode"
 msgstr "外部设备模式"
 
-#: midi_time_axis.cc:318
+#: midi_time_axis.cc:315
 msgid "Chns"
 msgstr "声道"
 
-#: midi_time_axis.cc:320
+#: midi_time_axis.cc:317
 msgid "Click to edit channel settings"
 msgstr "点击编辑声道设置"
 
-#: midi_time_axis.cc:519
+#: midi_time_axis.cc:516
 msgid "Show Full Range"
 msgstr "显示全部范围"
 
-#: midi_time_axis.cc:524
+#: midi_time_axis.cc:521
 msgid "Fit Contents"
 msgstr "匹配内容"
 
-#: midi_time_axis.cc:528
+#: midi_time_axis.cc:525
 msgid "Note Range"
 msgstr "音符范围"
 
-#: midi_time_axis.cc:529
+#: midi_time_axis.cc:526
 msgid "Note Mode"
 msgstr "音符模式"
 
-#: midi_time_axis.cc:530
+#: midi_time_axis.cc:527
 msgid "Channel Selector"
 msgstr "声道选择器"
 
-#: midi_time_axis.cc:535
+#: midi_time_axis.cc:532
 msgid "Color Mode"
 msgstr "颜色模式"
 
-#: midi_time_axis.cc:594
+#: midi_time_axis.cc:591
 msgid "Bender"
 msgstr "滑音器"
 
-#: midi_time_axis.cc:598
+#: midi_time_axis.cc:595
 msgid "Pressure"
 msgstr "压力"
 
-#: midi_time_axis.cc:610
+#: midi_time_axis.cc:607
 msgid "Controllers"
-msgstr "控制器 "
+msgstr "控制器"
 
-#: midi_time_axis.cc:615
+#: midi_time_axis.cc:612
 msgid "No MIDI Channels selected"
 msgstr "未选择 MIDI 声道"
 
-#: midi_time_axis.cc:672 midi_time_axis.cc:801
+#: midi_time_axis.cc:669 midi_time_axis.cc:798
 msgid "Hide all channels"
 msgstr "隐藏所有声道"
 
-#: midi_time_axis.cc:676 midi_time_axis.cc:805
+#: midi_time_axis.cc:673 midi_time_axis.cc:802
 msgid "Show all channels"
 msgstr "显示所有声道"
 
-#: midi_time_axis.cc:687 midi_time_axis.cc:816
+#: midi_time_axis.cc:684 midi_time_axis.cc:813
 msgid "Channel %1"
 msgstr "声道 %1"
 
-#: midi_time_axis.cc:942 midi_time_axis.cc:974
+#: midi_time_axis.cc:939 midi_time_axis.cc:971
 msgid "Controllers %1-%2"
 msgstr "控制器 %1-%2"
 
-#: midi_time_axis.cc:965 midi_time_axis.cc:968
+#: midi_time_axis.cc:962 midi_time_axis.cc:965
 msgid "Controller %1"
 msgstr "控制器 %1"
 
-#: midi_time_axis.cc:991
+#: midi_time_axis.cc:988
 msgid "Sustained"
 msgstr "持续"
 
-#: midi_time_axis.cc:998
+#: midi_time_axis.cc:995
 msgid "Percussive"
 msgstr "敲击"
 
-#: midi_time_axis.cc:1018
+#: midi_time_axis.cc:1015
 msgid "Meter Colors"
 msgstr "节拍颜色"
 
-#: midi_time_axis.cc:1025
+#: midi_time_axis.cc:1022
 msgid "Channel Colors"
-msgstr " 声道颜色"
+msgstr "声道颜色"
 
-#: midi_time_axis.cc:1032
+#: midi_time_axis.cc:1029
 msgid "Track Color"
 msgstr "音轨颜色"
 
-#: midi_time_axis.cc:1606 midi_time_axis.cc:1612 midi_time_axis.cc:1622
-#: midi_time_axis.cc:1628
+#: midi_time_axis.cc:1610 midi_time_axis.cc:1616 midi_time_axis.cc:1626
+#: midi_time_axis.cc:1632
 msgid "all"
 msgstr "所有"
 
-#: midi_time_axis.cc:1609 midi_time_axis.cc:1625
+#: midi_time_axis.cc:1613 midi_time_axis.cc:1629
 msgid "some"
 msgstr "一些"
 
 #: midi_tracer.cc:48
 msgid "Line history: "
-msgstr "线条历史:"
+msgstr "线条片段历史:"
 
 #: midi_tracer.cc:55
 msgid "Auto-Scroll"
@@ -7374,7 +8697,7 @@ msgstr "自动滚动"
 msgid "Decimal"
 msgstr "十进制"
 
-#: midi_tracer.cc:57 rc_option_editor.cc:740
+#: midi_tracer.cc:57 rc_option_editor.cc:1356
 msgid "Enabled"
 msgstr "启用"
 
@@ -7390,35 +8713,36 @@ msgstr "端口:"
 msgid "New velocity"
 msgstr "新建力度"
 
-#: missing_file_dialog.cc:35
+#: missing_file_dialog.cc:36
 msgid "Missing File"
-msgstr "缺失文件"
+msgstr "缺失的文件"
 
-#: missing_file_dialog.cc:37
+#: missing_file_dialog.cc:38
 msgid "Select a folder to search"
 msgstr "选择一个要搜索的文件夹"
 
-#: missing_file_dialog.cc:38
+#: missing_file_dialog.cc:39
 msgid "Add chosen folder to search path, and try again"
 msgstr "请添加已选择的文件夹到搜索路径,然后再试一次"
 
-#: missing_file_dialog.cc:40
+#: missing_file_dialog.cc:41
 msgid "Stop loading this session"
 msgstr "停止载入此会话"
 
-#: missing_file_dialog.cc:41
+#: missing_file_dialog.cc:42
 msgid "Skip all missing files"
 msgstr "跳过所有缺失的文件"
 
-#: missing_file_dialog.cc:42
+#: missing_file_dialog.cc:43
 msgid "Skip this file"
 msgstr "跳过这个文件"
 
-#: missing_file_dialog.cc:53
+#: missing_file_dialog.cc:57 tempo_dialog.cc:135 tempo_dialog.cc:136
+#: tempo_dialog.cc:484 tempo_dialog.cc:485
 msgid "audio"
 msgstr "音频"
 
-#: missing_file_dialog.cc:70
+#: missing_file_dialog.cc:74
 msgid ""
 "%1 cannot find the %2 file\n"
 "\n"
@@ -7438,394 +8762,515 @@ msgstr ""
 "<tt>%4</tt>\n"
 "\n"
 
-#: missing_file_dialog.cc:104
+#: missing_file_dialog.cc:108
 msgid "Click to choose an additional folder"
 msgstr "点击选择一个额外的文件夹"
 
 #: missing_plugin_dialog.cc:29
 msgid "Missing Plugins"
-msgstr "缺失插件"
+msgstr "缺失的插件"
 
-#: missing_plugin_dialog.cc:33 transcode_video_dialog.cc:60
+#: missing_plugin_dialog.cc:36 transcode_video_dialog.cc:60
 msgid "OK"
+msgstr "确定"
+
+#: missing_plugin_dialog.cc:42
+msgid ""
+"This session contains the following plugins that cannot be found on this "
+"system:\n"
+"\n"
 msgstr ""
+"本会话包含下列无法在本系统找到的插件:\n"
+"\n"
 
-#: mixer_actor.cc:55
-msgid "Toggle Solo on Mixer-Selected Tracks/Busses"
-msgstr "在混音器已选中的音轨/总线上切换独奏"
+#: missing_plugin_dialog.cc:48
+msgid ""
+"\n"
+"Those plugins will be replaced with inactive stubs.\n"
+"It is recommended that you install the missing plugins and re-load the "
+"session.\n"
+"(also check the blacklist, Window > Log and Preferences > Plugins)"
+msgstr ""
+"\n"
+"那些插件将被替代为非激活的占位符。\n"
+"建议您安装缺失的插件并重新加载会话\n"
+"(也应该检查黑名单,窗口 > 日志 以及 首选项 > 插件)"
 
-#: mixer_actor.cc:56
-msgid "Toggle Mute on Mixer-Selected Tracks/Busses"
-msgstr "在混音器已选中的音轨/总线上切换静音"
+#: mixer_strip.cc:100 mixer_strip.cc:133
+msgid "pre"
+msgstr "前置"
 
-#: mixer_actor.cc:57
-msgid "Toggle Rec-enable on Mixer-Selected Tracks/Busses"
-msgstr "在混音器已选中的音轨/总线上切换可录制"
+#: mixer_strip.cc:104 mixer_strip.cc:136 mixer_strip.cc:397 mixer_strip.cc:1548
+#: mixer_strip.cc:1559 rc_option_editor.cc:3147
+msgid "Comments"
+msgstr "注释"
 
-#: mixer_actor.cc:58
-msgid "Decrease Gain on Mixer-Selected Tracks/Busses"
-msgstr "在混音器已选中的音轨/总线上减小增益"
+#: mixer_strip.cc:160
+msgid "Click to toggle the width of this mixer strip."
+msgstr "点击切换此混音器片段的宽度。"
 
-#: mixer_actor.cc:59
-msgid "Increase Gain on Mixer-Selected Tracks/Busses"
-msgstr "在混音器已选中的音轨/总线上加大增益"
+#: mixer_strip.cc:162
+msgid ""
+"\n"
+"%1-%2-click to toggle the width of all strips."
+msgstr ""
+"\n"
+"%1-%2 —— 点击切换所有片段的宽度。"
 
-#: mixer_actor.cc:60
-msgid "Set Gain to 0dB on Mixer-Selected Tracks/Busses"
-msgstr "在混音器已选中的音轨/总线上设置增益为 0dB"
+#: mixer_strip.cc:171
+msgid "Hide this mixer strip"
+msgstr "隐藏此混音器片段"
 
-#: mixer_actor.cc:63
-msgid "Copy Selected Processors"
-msgstr "复制已选中的处理器"
+#: mixer_strip.cc:182
+msgid "Click to select metering point"
+msgstr "点击选择计量点"
 
-#: mixer_actor.cc:64
-msgid "Cut Selected Processors"
-msgstr "剪切已选中的处理器"
+#: mixer_strip.cc:198
+msgid "Isolate Solo"
+msgstr "隔离独奏"
 
-#: mixer_actor.cc:65
-msgid "Paste Selected Processors"
-msgstr "粘贴已选中的处理器"
+#: mixer_strip.cc:206
+msgid "Lock Solo Status"
+msgstr "锁定独奏状态"
 
-#: mixer_actor.cc:66
-msgid "Delete Selected Processors"
-msgstr "删除已选中的处理器"
+#: mixer_strip.cc:208 mixer_strip.cc:2225
+msgid "SoloLock|Lock"
+msgstr "独奏锁定|锁定"
 
-#: mixer_actor.cc:67
-msgid "Select All (visible) Processors"
-msgstr "选择所有(可见的)处理器"
+#: mixer_strip.cc:209 mixer_strip.cc:2224
+msgid "Iso"
+msgstr "隔离"
 
-#: mixer_actor.cc:68
-msgid "Toggle Selected Processors"
-msgstr "切换已选中的处理器"
-
-#: mixer_actor.cc:69
-msgid "Toggle Selected Plugins"
-msgstr "切换已选中的插件"
-
-#: mixer_actor.cc:70
-msgid "Deselect all strips and processors"
-msgstr "不选中所有片段和处理器"
-
-#: mixer_actor.cc:72 mixer_actor.cc:73
-msgid "Scroll Mixer Window to the left"
-msgstr "滚动混音器窗口到左侧"
-
-#: mixer_actor.cc:75
-msgid "Toggle MIDI Input Active for Mixer-Selected Tracks/Busses"
-msgstr "为混音器已选中的音轨/总线激活切换 MIDI 输入"
-
-#: mixer_actor.cc:90
-msgid "Loaded mixer bindings from %1"
-msgstr "从 %1 载入混音器绑定"
-
-#: mixer_actor.cc:92
-msgid "Could not find mixer.bindings in search path %1"
-msgstr "在搜索路径 %1 找不到混音器绑定"
-
-#: mixer_strip.cc:96 mixer_strip.cc:125
-msgid "pre"
-msgstr "预先"
-
-#: mixer_strip.cc:98 mixer_strip.cc:127 mixer_strip.cc:372 mixer_strip.cc:1410
-#: rc_option_editor.cc:2331
-msgid "Comments"
-msgstr "注释"
-
-#: mixer_strip.cc:149
-msgid "Click to toggle the width of this mixer strip."
-msgstr "点击切换此混音器片段的宽度。"
-
-#: mixer_strip.cc:151
-msgid ""
-"\n"
-"%1-%2-click to toggle the width of all strips."
-msgstr ""
-"\n"
-"%1-%2-点击切换所有片段的宽度。"
-
-#: mixer_strip.cc:158
-msgid "Hide this mixer strip"
-msgstr "隐藏此混音器片段"
-
-#: mixer_strip.cc:169
-msgid "Click to select metering point"
-msgstr "点击选择节拍点"
-
-#: mixer_strip.cc:185
-msgid "Isolate Solo"
-msgstr "隔离独奏"
-
-#: mixer_strip.cc:193
-msgid "Lock Solo Status"
-msgstr "锁定独奏状态"
-
-#: mixer_strip.cc:196 mixer_strip.cc:2027
-msgid "Iso"
-msgstr "隔离"
-
-#: mixer_strip.cc:250
+#: mixer_strip.cc:263
 msgid "Mix group"
 msgstr "混合分组"
 
-#: mixer_strip.cc:368 rc_option_editor.cc:2327
+#: mixer_strip.cc:275
+msgid "Trim: "
+msgstr "修剪:"
+
+#: mixer_strip.cc:393 rc_option_editor.cc:3143
 msgid "Phase Invert"
 msgstr "相位反转"
 
-#: mixer_strip.cc:369 rc_option_editor.cc:2328
+#: mixer_strip.cc:394 rc_option_editor.cc:3144
 msgid "Record & Monitor"
 msgstr "录制和监控"
 
-#: mixer_strip.cc:370 rc_option_editor.cc:2329
+#: mixer_strip.cc:395 rc_option_editor.cc:3145
 msgid "Solo Iso / Lock"
-msgstr "独奏隔离/锁定"
+msgstr "独奏隔离 / 锁定"
+
+#: mixer_strip.cc:398 rc_option_editor.cc:3148
+msgid "VCA Assigns"
+msgstr "VCA 指定"
+
+#: mixer_strip.cc:545
+msgid "Show/Hide Monitoring Section"
+msgstr "显示/隐藏监控中的部分"
 
-#: mixer_strip.cc:524
+#: mixer_strip.cc:590
 msgid "Enable/Disable MIDI input"
-msgstr "启用/禁用 MIDI 输入"
+msgstr "用/禁用 MIDI 输入"
 
-#: mixer_strip.cc:688
+#: mixer_strip.cc:756
 msgid "Aux"
 msgstr "辅助"
 
-#: mixer_strip.cc:710
+#: mixer_strip.cc:782
 msgid "Snd"
 msgstr "声音"
 
-#: mixer_strip.cc:776 mixer_strip.cc:879 processor_box.cc:2382
+#: mixer_strip.cc:853 mixer_strip.cc:958 processor_box.cc:3606
 msgid "Not connected to audio engine - no I/O changes are possible"
-msgstr "未连接到音频引擎——不可能改变输入/输出"
+msgstr "未连接到音频引擎 —— 不可能改变输入/输出"
 
-#: mixer_strip.cc:833 mixer_strip.cc:935
+#: mixer_strip.cc:911 mixer_strip.cc:1014
 msgid "Add %1 port"
 msgstr "添加 %1 端口"
 
-#: mixer_strip.cc:840 mixer_strip.cc:942
+#: mixer_strip.cc:919 mixer_strip.cc:1021 monitor_section.cc:1466
+#: plugin_pin_dialog.cc:1782
 msgid "Routing Grid"
 msgstr "路由网格"
 
-#: mixer_strip.cc:1171
+#: mixer_strip.cc:1298
+msgid "MIDI "
+msgstr ""
+
+#: mixer_strip.cc:1302
 msgid "<b>INPUT</b> to %1"
 msgstr "<b>输入</b> 到 %1"
 
-#: mixer_strip.cc:1174
+#: mixer_strip.cc:1304 monitor_section.cc:1511
 msgid "<b>OUTPUT</b> from %1"
 msgstr "<b>输出</b> 来自 %1"
 
-#: mixer_strip.cc:1287
+#: mixer_strip.cc:1417 monitor_section.cc:1598
 msgid "Disconnected"
 msgstr "失去连接"
 
-#: mixer_strip.cc:1413
-msgid "*Comments*"
-msgstr "*注释*"
+#: mixer_strip.cc:1544
+msgid "Click to add/edit comments"
+msgstr "点击添加/编辑注释"
 
-#: mixer_strip.cc:1420
+#: mixer_strip.cc:1548 mixer_strip.cc:1559
 msgid "Cmt"
 msgstr "注释"
 
-#: mixer_strip.cc:1423
-msgid "*Cmt*"
-msgstr "*注释*"
-
-#: mixer_strip.cc:1429
-msgid "Click to Add/Edit Comments"
-msgstr "点击添加/编辑注释"
-
-#: mixer_strip.cc:1473
+#: mixer_strip.cc:1604
 msgid "Grp"
 msgstr "分组"
 
-#: mixer_strip.cc:1476
+#: mixer_strip.cc:1607
 msgid "~G"
-msgstr "~G"
+msgstr ""
 
-#: mixer_strip.cc:1505 route_time_axis.cc:561
+#: mixer_strip.cc:1648 route_time_axis.cc:585 vca_master_strip.cc:396
 msgid "Color..."
 msgstr "颜色…"
 
-#: mixer_strip.cc:1507 route_time_axis.cc:563
+#: mixer_strip.cc:1650 route_time_axis.cc:587
 msgid "Comments..."
 msgstr "注释…"
 
-#: mixer_strip.cc:1509 route_time_axis.cc:565
+#: mixer_strip.cc:1652 route_time_axis.cc:589
 msgid "Inputs..."
 msgstr "输入…"
 
-#: mixer_strip.cc:1511 route_time_axis.cc:567
+#: mixer_strip.cc:1654 route_time_axis.cc:591
 msgid "Outputs..."
 msgstr "输出…"
 
-#: mixer_strip.cc:1516
+#: mixer_strip.cc:1659
 msgid "Save As Template..."
-msgstr "保存为模板..."
+msgstr "保存为模板…"
+
+#: mixer_strip.cc:1665 route_group_dialog.cc:45 route_time_axis.cc:851
+msgid "Active"
+msgstr "激活"
+
+#: mixer_strip.cc:1673 plugin_pin_dialog.cc:1011
+msgid "Strict I/O"
+msgstr "精确输入/输出"
+
+#: mixer_strip.cc:1683 processor_box.cc:3710
+msgid "Pin Connections..."
+msgstr "接口连接…"
 
-#: mixer_strip.cc:1530
+#: mixer_strip.cc:1687
 msgid "Adjust Latency..."
-msgstr "调整延迟..."
+msgstr "调整延迟…"
 
-#: mixer_strip.cc:1533
+#: mixer_strip.cc:1690
 msgid "Protect Against Denormals"
-msgstr "防止异常违反"
+msgstr "防止违背非规格化数"
 
-#: mixer_strip.cc:1539 route_time_axis.cc:580
-msgid "Remote Control ID..."
-msgstr "远程控制 ID…"
+#: mixer_strip.cc:1709 route_time_axis.cc:867
+msgid "Duplicate..."
+msgstr "复制…"
 
-#: mixer_strip.cc:1823
+#: mixer_strip.cc:2004
 msgid "Pre"
-msgstr "预先"
+msgstr "前置"
 
-#: mixer_strip.cc:1827
+#: mixer_strip.cc:2008
 msgid "Post"
 msgstr "后置"
 
-#: mixer_strip.cc:1847
-msgid "Pr"
-msgstr "预先"
+#: mixer_strip.cc:2024
+msgid "Meter|In"
+msgstr "节拍|入"
 
-#: mixer_strip.cc:1851
-msgid "Po"
-msgstr "后置"
+#: mixer_strip.cc:2028
+msgid "Meter|Pr"
+msgstr "节拍|预先"
 
-#: mixer_strip.cc:1860
-msgid "C"
-msgstr ""
+#: mixer_strip.cc:2032
+msgid "Meter|Po"
+msgstr "节拍|后置"
+
+#: mixer_strip.cc:2036
+msgid "Meter|O"
+msgstr "节拍|O"
 
-#: mixer_strip.cc:2008 route_ui.cc:168
+#: mixer_strip.cc:2041
+msgid "Meter|C"
+msgstr "节拍|C"
+
+#: mixer_strip.cc:2202 route_ui.cc:193
 msgid "Disk"
 msgstr "硬盘"
 
+#: mixer_strip.cc:2204
+msgid "Mon"
+msgstr "监控"
+
 # AFL - Aside Fade Listen. 衰减后监听
-#: mixer_strip.cc:2020 monitor_section.cc:70
+#: mixer_strip.cc:2217 monitor_section.cc:81
 msgid "AFL"
-msgstr "后置淡化试听"
+msgstr "后置于淡化器试听"
 
 # PFL Pre-Fader-Listen衰减前监听
-#: mixer_strip.cc:2023 monitor_section.cc:71
+#: mixer_strip.cc:2220 monitor_section.cc:82
 msgid "PFL"
-msgstr "前置淡化试听"
+msgstr "前置于淡化器试听"
 
-#: mixer_strip.cc:2034 meter_strip.cc:380
-msgid "D"
-msgstr ""
+#: mixer_strip.cc:2230 meter_strip.cc:385
+msgid "MonitorInput|I"
+msgstr "监控器输入|I"
+
+#: mixer_strip.cc:2231 meter_strip.cc:386
+msgid "MonitorDisk|D"
+msgstr "监控器硬盘|D"
+
+#: mixer_strip.cc:2233
+msgid "Mon|O"
+msgstr "监控|O"
+
+#: mixer_strip.cc:2246 meter_strip.cc:377 route_time_axis.cc:2730
+#: vca_master_strip.cc:202 vca_time_axis.cc:227
+msgid "AfterFader|A"
+msgstr "后置于淡化器|A"
+
+#: mixer_strip.cc:2249
+msgid "Prefader|P"
+msgstr "前置于淡化器|P"
+
+#: mixer_strip.cc:2254
+msgid "SoloIso|I"
+msgstr "独奏隔离|I"
+
+#: mixer_strip.cc:2255
+msgid "SoloLock|L"
+msgstr "独奏锁定|L"
 
-#: mixer_strip.cc:2241
+#: mixer_strip.cc:2460
 msgid "Pre Fader"
-msgstr "前置淡化"
+msgstr "前置于淡化器"
 
-#: mixer_strip.cc:2242
+#: mixer_strip.cc:2461
 msgid "Post Fader"
-msgstr "后置淡化"
+msgstr "后置于淡化器"
 
-#: mixer_strip.cc:2286 meter_strip.cc:847
+#: mixer_strip.cc:2506 meter_strip.cc:858
 msgid "Change all in Group to %1"
 msgstr "改变分组里所有的到 %1"
 
-#: mixer_strip.cc:2288 meter_strip.cc:849
+#: mixer_strip.cc:2508 meter_strip.cc:860
 msgid "Change all to %1"
 msgstr "改变所有的到 %1"
 
-#: mixer_strip.cc:2290 meter_strip.cc:851
+#: mixer_strip.cc:2510 meter_strip.cc:862
 msgid "Change same track-type to %1"
 msgstr "改变相同轨道类型的到 %1"
 
-#: mixer_ui.cc:130 route_time_axis.cc:818
+#: mixer_ui.cc:152 route_time_axis.cc:828
 msgid "Group"
 msgstr "分组"
 
-#: mixer_ui.cc:1224
+#: mixer_ui.cc:221
+msgid "Favorite Plugins"
+msgstr "最喜爱的插件"
+
+#: mixer_ui.cc:627
+msgid "Error adding GUI elements for new tracks/busses %1"
+msgstr "为音轨/总线 %1 添加 GUI(图形用户界面)元素时出错"
+
+#: mixer_ui.cc:1542
 msgid "track display list item for renamed strip not found!"
 msgstr "未找到音轨显示列表的重命名片段条目!"
 
-#: mixer_ui.cc:1316
+#: mixer_ui.cc:1636
 msgid "-all-"
-msgstr "—所有—"
+msgstr "— 所有 —"
 
-#: mixer_ui.cc:1853
+#: mixer_ui.cc:2135
 msgid "Strips"
 msgstr "片段"
 
-#: meter_strip.cc:157
+#: mixer_ui.cc:2479
+msgid "No Track/Bus is selected."
+msgstr "尚未选择音轨/总线。"
+
+#: mixer_ui.cc:2481
+msgid "Add at the top"
+msgstr "添加在顶部"
+
+#: mixer_ui.cc:2483
+msgid "Add Pre-Fader"
+msgstr "添加前置于淡化器"
+
+#: mixer_ui.cc:2485
+msgid "Add Post-Fader"
+msgstr "添加后置于淡化器"
+
+#: mixer_ui.cc:2487
+msgid "Add at the end"
+msgstr "添加在尾部"
+
+#: mixer_ui.cc:2493
+msgid "Remove from favorites"
+msgstr "从最喜爱中移除"
+
+#: mixer_ui.cc:2499
+msgid "Delete Preset"
+msgstr "删除预置"
+
+#: mixer_ui.cc:2739
+msgid "Toggle Solo on Mixer-Selected Tracks/Busses"
+msgstr "在混音器已选中的音轨/总线上切换独奏"
+
+#: mixer_ui.cc:2740
+msgid "Toggle Mute on Mixer-Selected Tracks/Busses"
+msgstr "在混音器已选中的音轨/总线上切换静音"
+
+#: mixer_ui.cc:2741
+msgid "Toggle Rec-enable on Mixer-Selected Tracks/Busses"
+msgstr "在混音器已选中的音轨/总线上切换可录制"
+
+#: mixer_ui.cc:2742
+msgid "Decrease Gain on Mixer-Selected Tracks/Busses"
+msgstr "在混音器已选中的音轨/总线上减小增益"
+
+#: mixer_ui.cc:2743
+msgid "Increase Gain on Mixer-Selected Tracks/Busses"
+msgstr "在混音器已选中的音轨/总线上加大增益\" \""
+
+#: mixer_ui.cc:2744
+msgid "Set Gain to 0dB on Mixer-Selected Tracks/Busses"
+msgstr "在混音器已选中的音轨/总线上设置增益为 0dB"
+
+#: mixer_ui.cc:2747
+msgid "Copy Selected Processors"
+msgstr "复制已选中的处理器"
+
+#: mixer_ui.cc:2748
+msgid "Cut Selected Processors"
+msgstr "剪切已选中的处理器"
+
+#: mixer_ui.cc:2749
+msgid "Paste Selected Processors"
+msgstr "粘贴已选中的处理器"
+
+#: mixer_ui.cc:2750
+msgid "Delete Selected Processors"
+msgstr "删除已选中的处理器"
+
+#: mixer_ui.cc:2751
+msgid "Select All (visible) Processors"
+msgstr "选择所有(可见的)处理器"
+
+#: mixer_ui.cc:2752
+msgid "Toggle Selected Processors"
+msgstr "切换已选中的处理器"
+
+#: mixer_ui.cc:2753
+msgid "Toggle Selected Plugins"
+msgstr "切换已选中的插件"
+
+#: mixer_ui.cc:2754
+msgid "Deselect all strips and processors"
+msgstr "不选中所有片段和处理器"
+
+#: mixer_ui.cc:2756 mixer_ui.cc:2757
+msgid "Scroll Mixer Window to the left"
+msgstr "滚动混音器窗口到左侧"
+
+#: mixer_ui.cc:2759
+msgid "Toggle MIDI Input Active for Mixer-Selected Tracks/Busses"
+msgstr "为混音器已选中的音轨/总线激活切换 MIDI 输入"
+
+#: meter_strip.cc:160
 msgid "Reset Peak"
 msgstr "重置峰值"
 
-#: meter_strip.cc:883
+#: meter_strip.cc:380 route_time_axis.cc:2734 vca_master_strip.cc:206
+#: vca_time_axis.cc:231
+msgid "PreFader|P"
+msgstr "前置于淡化器|P"
+
+#: meter_strip.cc:894
 msgid "Variable height"
 msgstr "变量高度"
 
-#: meter_strip.cc:884
+#: meter_strip.cc:895
 msgid "Short"
-msgstr "短小的"
+msgstr "短小"
 
-#: meter_strip.cc:885
+#: meter_strip.cc:896
 msgid "Tall"
-msgstr "高大的"
+msgstr "高大"
 
-#: meter_strip.cc:886
+#: meter_strip.cc:897
 msgid "Grande"
-msgstr ""
+msgstr "庞大"
 
-#: meter_strip.cc:887
+#: meter_strip.cc:898
 msgid "Venti"
-msgstr ""
+msgstr "宏大"
 
-#: meter_patterns.cc:82
-msgid "Peak"
-msgstr "峰值"
+#: meter_patterns.cc:84
+msgid "Peak (+6dBFS)"
+msgstr "峰值(+6dBFS)"
+
+#: meter_patterns.cc:87
+msgid "Peak (0dBFS)"
+msgstr "峰值(0dBFS)"
 
-#: meter_patterns.cc:85
+#: meter_patterns.cc:90
 msgid "RMS + Peak"
 msgstr "均方根 + 峰值"
 
-#: meter_patterns.cc:88
+#: meter_patterns.cc:93
 msgid "IEC1/DIN"
 msgstr ""
 
-#: meter_patterns.cc:91
+#: meter_patterns.cc:96
 msgid "IEC1/Nordic"
 msgstr ""
 
-#: meter_patterns.cc:94
+#: meter_patterns.cc:99
 msgid "IEC2/BBC"
 msgstr ""
 
-#: meter_patterns.cc:97
+#: meter_patterns.cc:102
 msgid "IEC2/EBU"
 msgstr ""
 
-#: meter_patterns.cc:100
-msgid "K20"
+#: meter_patterns.cc:105
+msgid "K20/RMS"
 msgstr ""
 
-#: meter_patterns.cc:103
-msgid "K14"
+#: meter_patterns.cc:108
+msgid "K14/RMS"
 msgstr ""
 
-#: meter_patterns.cc:106
-msgid "K12"
+#: meter_patterns.cc:111
+msgid "K12/RMS"
 msgstr ""
 
-#: meter_patterns.cc:109
+#: meter_patterns.cc:114
 msgid "VU"
 msgstr ""
 
-#: monitor_section.cc:69
+#: monitor_section.cc:80
 msgid "SiP"
 msgstr ""
 
-#: monitor_section.cc:96 route_group_dialog.cc:49
+#: monitor_section.cc:113 route_group_dialog.cc:49
 msgid "Soloing"
 msgstr "独奏中"
 
-#: monitor_section.cc:100
+#: monitor_section.cc:117
 msgid "Isolated"
 msgstr "已隔离"
 
-#: monitor_section.cc:104
+#: monitor_section.cc:121
 msgid "Auditioning"
 msgstr "监听中"
 
-#: monitor_section.cc:114
+#: monitor_section.cc:132
 msgid ""
 "When active, something is solo-isolated.\n"
 "Click to de-isolate everything"
@@ -7833,141 +9278,214 @@ msgstr ""
 "启用时,某些被独奏隔离。\n"
 "点击解除所有的隔离"
 
-#: monitor_section.cc:117
+#: monitor_section.cc:135
 msgid ""
 "When active, auditioning is active.\n"
 "Click to stop the audition"
 msgstr ""
 "启用时,监听激活。\n"
-"点击停止监听."
+"点击停止监听"
 
-#: monitor_section.cc:134
+#: monitor_section.cc:152
 msgid "Solo controls affect solo-in-place"
 msgstr "独奏控制影响独奏入位"
 
-#: monitor_section.cc:140
+#: monitor_section.cc:158
 msgid "Solo controls toggle after-fader-listen"
-msgstr "独奏控制切换后置淡化试听"
+msgstr "独奏控制切换后置于淡化器试听"
 
-#: monitor_section.cc:146
+#: monitor_section.cc:164
 msgid "Solo controls toggle pre-fader-listen"
-msgstr "独奏控制切换前置淡化试听"
+msgstr "独奏控制切换前置于淡化器试听"
+
+#: monitor_section.cc:170
+msgid "Excl. Solo"
+msgstr "专属独奏"
+
+#: monitor_section.cc:172
+msgid "Exclusive solo means that only 1 solo is active at a time"
+msgstr "专属独奏意味着在同一时间仅有一个独奏是激活的"
+
+#: monitor_section.cc:179
+msgid "Solo » Mute"
+msgstr "独奏 » 静音"
+
+#: monitor_section.cc:181
+msgid ""
+"If enabled, solo will override mute\n"
+"(a soloed & muted track or bus will be audible)"
+msgstr ""
+"如果启用,独奏将覆盖静音\n"
+"(一个独奏且静音的音轨或总线将成为可听见)"
+
+#: monitor_section.cc:189
+msgid "Processors"
+msgstr "处理器"
+
+#: monitor_section.cc:191
+msgid "Allow one to add monitor effect processors"
+msgstr "允许一个以添加监控效果处理器"
 
-#: monitor_section.cc:156
+#: monitor_section.cc:206
 msgid "Gain increase for soloed signals (0dB is normal)"
 msgstr "为独奏信号加大增益(正常值为 0dB)"
 
-#: monitor_section.cc:170
+#: monitor_section.cc:210 monitor_section.cc:227 monitor_section.cc:244
+#: monitor_section.cc:289
+msgid "0 dB"
+msgstr ""
+
+#: monitor_section.cc:211
+msgid "3 dB"
+msgstr ""
+
+#: monitor_section.cc:212
+msgid "6 dB"
+msgstr ""
+
+#: monitor_section.cc:213
+msgid "10 dB"
+msgstr ""
+
+#: monitor_section.cc:215
 msgid "Solo Boost"
 msgstr "独奏提升"
 
-#: monitor_section.cc:185
+#: monitor_section.cc:222
 msgid ""
 "Gain reduction non-soloed signals\n"
 "A value above -inf dB causes \"solo-in-front\""
 msgstr ""
 "增益减少非独奏信号\n"
-"一个数值高于 -inf dB 引起”独奏在前“"
+"一个数值高于 -inf dB 引起“独奏在前”"
+
+#: monitor_section.cc:228 monitor_section.cc:246 monitor_section.cc:291
+msgid "-6 dB"
+msgstr ""
+
+#: monitor_section.cc:229 monitor_section.cc:247 monitor_section.cc:292
+msgid "-12 dB"
+msgstr ""
+
+#: monitor_section.cc:230 monitor_section.cc:248 monitor_section.cc:293
+msgid "-20 dB"
+msgstr ""
+
+#: monitor_section.cc:231
+msgid "OFF"
+msgstr "关闭"
 
-#: monitor_section.cc:196
+#: monitor_section.cc:233
 msgid "SiP Cut"
 msgstr "SiP 剪切"
 
-#: monitor_section.cc:211
+#: monitor_section.cc:240
 msgid "Gain reduction to use when dimming monitor outputs"
 msgstr "当减弱监控输出时,减小增益的使用"
 
-#: monitor_section.cc:225 monitor_section.cc:283
+#: monitor_section.cc:245 monitor_section.cc:290
+msgid "-3 dB"
+msgstr ""
+
+#: monitor_section.cc:250 monitor_section.cc:264 monitor_section.cc:325
 msgid "Dim"
 msgstr "减弱"
 
-#: monitor_section.cc:235
-msgid "Excl. Solo"
-msgstr "把独奏排除在外"
-
-#: monitor_section.cc:237
-msgid "Exclusive solo means that only 1 solo is active at a time"
-msgstr "专属独奏意味着在同一时间仅有一个独奏是激活的"
-
-#: monitor_section.cc:244
-msgid "Solo » Mute"
-msgstr "独奏 » 静音"
-
-#: monitor_section.cc:246
-msgid ""
-"If enabled, solo will override mute\n"
-"(a soloed & muted track or bus will be audible)"
+#: monitor_section.cc:294
+msgid "-30 dB"
 msgstr ""
-"如果启用,独奏将覆盖静音\n"
-"(一个独奏且静音的音轨或总线将成为可听见)"
 
-#: monitor_section.cc:323
+#: monitor_section.cc:333
+msgid "Inv"
+msgstr "反转"
+
+#: monitor_section.cc:399
 msgid "Monitor"
 msgstr "监控"
 
-#: monitor_section.cc:744
+#: monitor_section.cc:897
 msgid "Switch monitor to mono"
 msgstr "转换监控到单声道"
 
-#: monitor_section.cc:747
+#: monitor_section.cc:900
 msgid "Cut monitor"
 msgstr "剪切监控"
 
-#: monitor_section.cc:750
+#: monitor_section.cc:903
 msgid "Dim monitor"
 msgstr "减弱监控"
 
-#: monitor_section.cc:753
+#: monitor_section.cc:906
 msgid "Toggle exclusive solo mode"
 msgstr "切换专属的独奏模式"
 
-#: monitor_section.cc:759
+#: monitor_section.cc:912
 msgid "Toggle mute overrides solo mode"
 msgstr "切换静音覆盖独奏模式"
 
-#: monitor_section.cc:771
+#: monitor_section.cc:921
 msgid "Cut monitor channel %1"
 msgstr "剪切监控声道 %1"
 
-#: monitor_section.cc:776
+#: monitor_section.cc:926
 msgid "Dim monitor channel %1"
 msgstr "减弱监控声道 %1"
 
-#: monitor_section.cc:781
+#: monitor_section.cc:931
 msgid "Solo monitor channel %1"
 msgstr "独奏监控声道 %1"
 
-#: monitor_section.cc:786
+#: monitor_section.cc:936
 msgid "Invert monitor channel %1"
 msgstr "反转监控声道 %1"
 
-#: monitor_section.cc:796
+#: monitor_section.cc:946
 msgid "In-place solo"
 msgstr "入位独奏"
 
-#: monitor_section.cc:798
+#: monitor_section.cc:948
 msgid "After Fade Listen (AFL) solo"
-msgstr "衰减后监听(AFL)独奏"
+msgstr "后置于淡化器试听(AFL)独奏"
 
-#: monitor_section.cc:800
+#: monitor_section.cc:950
 msgid "Pre Fade Listen (PFL) solo"
-msgstr "衰减前监听(PFL)独奏"
+msgstr "前置于淡化器试听(PFL)独奏"
 
-#: mono_panner.cc:109 stereo_panner.cc:119
+#: monitor_section.cc:953
+msgid "Toggle Monitor Section Processor Box"
+msgstr "切换监控部分处理器框"
+
+#: monitor_section.cc:1413
+msgid "No session - no I/O changes are possible"
+msgstr "无会话 —— 不可能改变输入/输出"
+
+#: monitor_selector.cc:199
+msgid "Monitor output selector"
+msgstr "监控输出选择器"
+
+#: mono_panner.cc:105 stereo_panner.cc:115
 msgid "bypassed"
-msgstr "支路"
+msgstr "略过"
 
-#: mono_panner.cc:123
+#: mono_panner.cc:119
 #, c-format
 msgid "L:%3d R:%3d"
 msgstr "左:%3d 右:%3d"
 
-#: mono_panner_editor.cc:33
+#: mono_panner.cc:203 panner2d.cc:276 stereo_panner.cc:252 stereo_panner.cc:275
+msgid "Panner|L"
+msgstr "声相器|左"
+
+#: mono_panner.cc:220 panner2d.cc:277 stereo_panner.cc:250 stereo_panner.cc:277
+msgid "Panner|R"
+msgstr "声相器|右"
+
+#: mono_panner_editor.cc:35
 msgid "Mono Panner"
-msgstr "单声道面板"
+msgstr "单声道声相器"
 
-#: mono_panner_editor.cc:44 mono_panner_editor.cc:49 stereo_panner_editor.cc:46
-#: stereo_panner_editor.cc:51
+#: mono_panner_editor.cc:46 mono_panner_editor.cc:51 stereo_panner_editor.cc:48
+#: stereo_panner_editor.cc:53
 msgid "%"
 msgstr ""
 
@@ -8000,7 +9518,8 @@ msgid ""
 "Congratulations on your session export.\n"
 "\n"
 "It looks as if you may already be a subscriber. If so, thanks, and sorry\n"
-"to bother you again about this - I'm working on improving our subscriber system\n"
+"to bother you again about this - I'm working on improving our subscriber "
+"system\n"
 "so that I don't have to keep annoying you with this message.\n"
 "\n"
 "If you're not a subscriber, perhaps you might consider supporting my work\n"
@@ -8023,9 +9542,11 @@ msgstr ""
 msgid ""
 "Congratulations on your session export.\n"
 "\n"
-"I hope you find Ardour a useful tool. I'd like to ask you to consider supporting\n"
+"I hope you find Ardour a useful tool. I'd like to ask you to consider "
+"supporting\n"
 "its development with either a one-time donation or subscription. Nothing\n"
-"will happen if you choose not to do so. However Ardour's continuing development\n"
+"will happen if you choose not to do so. However Ardour's continuing "
+"development\n"
 "relies on a stable, sustainable income stream. Thanks for using Ardour!"
 msgstr ""
 "恭喜!你的会话已导出。\n"
@@ -8035,10 +9556,6 @@ msgstr ""
 "不管怎样, Ardour后续的开发需要一个稳定、持续的资金来源。\n"
 "感谢使用Ardour!"
 
-#: new_plugin_preset_dialog.cc:29
-msgid "New Preset"
-msgstr "新建预设"
-
 #: new_plugin_preset_dialog.cc:30
 msgid "Replace existing preset with this name"
 msgstr "用这个名称替代已存在的预设"
@@ -8047,6 +9564,10 @@ msgstr "用这个名称替代已存在的预设"
 msgid "Name of new preset"
 msgstr "新建预设的名称"
 
+#: new_plugin_preset_dialog.cc:44
+msgid "New Favorite Only"
+msgstr "仅新建最喜爱的"
+
 #: normalize_dialog.cc:34
 msgid "Normalize regions"
 msgstr "规范化区域"
@@ -8055,17 +9576,17 @@ msgstr "规范化区域"
 msgid "Normalize region"
 msgstr "规范化区域"
 
-#: normalize_dialog.cc:49 strip_silence_dialog.cc:66
-msgid "dbFS"
-msgstr ""
+#: normalize_dialog.cc:42
+msgid "Normalize to:"
+msgstr "规范化到:"
 
 #: normalize_dialog.cc:56
 msgid "Normalize each region using its own peak value"
-msgstr "用每个区域它自己的峰值数值规范化每个区域"
+msgstr "使用每个区域它自己的峰值数值规范化每个区域"
 
 #: normalize_dialog.cc:58
 msgid "Normalize each region using the peak value of all regions"
-msgstr "用所有区域的峰值数值规范化每个区域"
+msgstr "使用所有区域的峰值数值规范化每个区域"
 
 #: normalize_dialog.cc:73
 msgid "Normalize"
@@ -8075,113 +9596,138 @@ msgstr "规范化"
 msgid "Select Note"
 msgstr "选择音符"
 
-#: opts.cc:57
+#: opts.cc:61
 msgid "Usage: "
 msgstr "用法:"
 
-#: opts.cc:58
+#: opts.cc:62
 msgid "  [SESSION_NAME]              Name of session to load\n"
 msgstr "  [SESSION_NAME]              要载入的会话的名称\n"
 
-#: opts.cc:59
+#: opts.cc:63
 msgid "  -v, --version               Show version information\n"
 msgstr "  -v, --version               显示版本信息\n"
 
-#: opts.cc:60
+#: opts.cc:64
 msgid "  -h, --help                  Print this message\n"
 msgstr "  -h, --help                  打印本信息\n"
 
-#: opts.cc:61
-msgid "  -a, --no-announcements      Do not contact website for announcements\n"
+#: opts.cc:65
+msgid ""
+"  -a, --no-announcements      Do not contact website for announcements\n"
 msgstr "  -a, --no-announcements      不联系网站公告\n"
 
-#: opts.cc:62
-msgid "  -b, --bindings              Print all possible keyboard binding names\n"
+#: opts.cc:66
+msgid ""
+"  -b, --bindings              Print all possible keyboard binding names\n"
 msgstr "  -b, --bindings              打印所有可能的键盘绑定名称\n"
 
-#: opts.cc:63
+#: opts.cc:67
+msgid ""
+"  -B, --bypass-plugins        Bypass all plugins in an existing session\n"
+msgstr "  -B, --bypass-plugins        略过在已存在会话中的所有插件\n"
+
+#: opts.cc:68
 msgid ""
 "  -c, --name <name>           Use a specific backend client name, default is "
 "ardour\n"
-msgstr "  -c, --name <name>           使用一个特定的后端客户名称,默认是ardour\n"
+msgstr ""
+"  -c, --name <name>           使用一个特定的后端客户名称,默认是ardour\n"
 
-#: opts.cc:64
-msgid "  -d, --disable-plugins       Disable all plugins in an existing session\n"
+#: opts.cc:69
+msgid ""
+"  -d, --disable-plugins       Disable all plugins in an existing session\n"
 msgstr "  -d, --disable-plugins       在一个已存在的会话中禁用所有插件\n"
 
-#: opts.cc:65
+#: opts.cc:70
 msgid ""
-"  -D, --debug <options>       Set debug flags. Use \"-D list\" to see available "
-"options\n"
+"  -D, --debug <options>       Set debug flags. Use \"-D list\" to see "
+"available options\n"
 msgstr ""
 "  -D, --debug <options>       设置调试标志. 使用 \"-D list\" 显示可用的选项\n"
 
-#: opts.cc:66
+#: opts.cc:71
 msgid "  -n, --no-splash             Do not show splash screen\n"
 msgstr "  -n, --no-splash             不显示闪屏\n"
 
-#: opts.cc:67
+#: opts.cc:72
 msgid "  -m, --menus file            Use \"file\" to define menus\n"
 msgstr "  -m, --menus file            使用 \"file\" (文件)来定义菜单\n"
 
-#: opts.cc:68
-msgid "  -N, --new session-name      Create a new session from the command line\n"
+#: opts.cc:73
+msgid ""
+"  -N, --new session-name      Create a new session from the command line\n"
 msgstr "  -N, --new session-name      从命令行创建一个新的会话\n"
 
-#: opts.cc:69
+#: opts.cc:74
 msgid "  -O, --no-hw-optimizations   Disable h/w specific optimizations\n"
 msgstr "  -O, --no-hw-optimizations   禁用 h/w 特殊的优化\n"
 
-#: opts.cc:70
+#: opts.cc:75
 msgid "  -P, --no-connect-ports      Do not connect any ports at startup\n"
-msgstr "  -P, --no-connect-ports     在启动时不连接任何端口 \n"
+msgstr "  -P, --no-connect-ports     在启动时不连接任何端口\n"
 
-#: opts.cc:71
+#: opts.cc:76
 msgid "  -S, --sync                  Draw the gui synchronously \n"
 msgstr "  -S, --sync                  同步绘制用户图形界面 \n"
 
-#: opts.cc:73
+#: opts.cc:78
 msgid "  -V, --novst                 Do not use VST support\n"
 msgstr "  -V, --novst                 不使用VST支持\n"
 
-#: opts.cc:75
+#: opts.cc:80
 msgid ""
-"  -E, --save <file>           Load the specified session, save it to <file> and "
-"then quit\n"
+"  -E, --save <file>           Load the specified session, save it to <file> "
+"and then quit\n"
 msgstr ""
-"  -E, --save <file>           载入指定的会话, 保存它在 <file 文件> 中并退出\n"
+"  -E, --save <file>           载入指定的会话, 保存它在 <file 文件> 中并退"
+"出\n"
 
-#: opts.cc:76
+#: opts.cc:81
 msgid "  -C, --curvetest filename    Curve algorithm debugger\n"
 msgstr "  -C, --curvetest filename    曲线算法调试器\n"
 
-#: opts.cc:77
-msgid ""
-"  -k, --keybindings filename  Name of key bindings to load (default is ~/.ardour3/"
-"ardour.bindings)\n"
+#: opts.cc:82
+msgid "  -k, --keybindings filename  Name of key bindings to load\n"
 msgstr ""
 "  -k, --keybindings 文件名  要载入的按键绑定名称(默认是 ~/.ardour3/ardour."
 "bindings)\n"
 
-#: panner2d.cc:854
+#: panner2d.cc:896
 msgid "Panner (2D)"
-msgstr "面板(2D)"
+msgstr "声相器(2D)"
 
-#: panner2d.cc:856 panner_ui.cc:400 plugin_ui.cc:452
+#: panner2d.cc:898 panner_ui.cc:402 plugin_ui.cc:458
 msgid "Bypass"
-msgstr "支路"
+msgstr "略过"
 
-#: panner2d.cc:862
+#: panner2d.cc:904
 msgid "Panner"
-msgstr "面板"
+msgstr "声相器"
 
 #: panner_ui.cc:72
 msgid "Pan automation mode"
-msgstr "筛选自动模式"
+msgstr "声相自动模式"
 
 #: panner_ui.cc:73
 msgid "Pan automation type"
-msgstr "筛选自动类型"
+msgstr "声相自动类型"
+
+#: panner_ui.cc:605
+msgid "Manual|M"
+msgstr "手动|M"
+
+#: panner_ui.cc:608
+msgid "Play|P"
+msgstr "播放|P"
+
+#: panner_ui.cc:611
+msgid "Touch|T"
+msgstr "改动|T"
+
+#: panner_ui.cc:614
+msgid "Write|W"
+msgstr "编写|W"
 
 #: playlist_selector.cc:43
 msgid "Playlists"
@@ -8201,114 +9747,267 @@ msgstr "其他音轨"
 
 #: playlist_selector.cc:139
 msgid "unassigned"
-msgstr "未指定"
+msgstr "撤销已指定"
 
 #: playlist_selector.cc:194
 msgid "Imported"
 msgstr "已导入"
 
-#: plugin_eq_gui.cc:85 plugin_eq_gui.cc:109
+#: plugin_eq_gui.cc:93 plugin_eq_gui.cc:117
 msgid "dB scale"
 msgstr "dB 比例"
 
-#: plugin_eq_gui.cc:116
+#: plugin_eq_gui.cc:124
 msgid "Show phase"
 msgstr "显示相位"
 
-#: plugin_selector.cc:53 plugin_selector.cc:229
+#: plugin_pin_dialog.cc:55
+msgid "Manual Config"
+msgstr "手动设定"
+
+#: plugin_pin_dialog.cc:56
+msgid "Sidechain"
+msgstr "边链电路"
+
+#: plugin_pin_dialog.cc:57 plugin_pin_dialog.cc:59 plugin_pin_dialog.cc:61
+#: plugin_pin_dialog.cc:63 plugin_pin_dialog.cc:65 step_entry.cc:81
+#: step_entry.cc:84
+msgid "+"
+msgstr ""
+
+#: plugin_pin_dialog.cc:58 plugin_pin_dialog.cc:60 plugin_pin_dialog.cc:62
+#: plugin_pin_dialog.cc:64 plugin_pin_dialog.cc:66
+msgid "-"
+msgstr ""
+
+#: plugin_pin_dialog.cc:148
+msgid "Audio Input Pins"
+msgstr "音频输入接口"
+
+#: plugin_pin_dialog.cc:157
+msgid "MIDI Input Pins"
+msgstr "MIDI 输入接口"
+
+#: plugin_pin_dialog.cc:166
+msgid "Instances"
+msgstr "实例"
+
+#: plugin_pin_dialog.cc:176
+msgid "Audio Out"
+msgstr "音频输出"
+
+#: plugin_pin_dialog.cc:185
+msgid "MIDI Out"
+msgstr "MIDI 输出"
+
+#: plugin_pin_dialog.cc:192
+msgid "Output Presets"
+msgstr "输出预设"
+
+#: plugin_pin_dialog.cc:208
+msgid "Add Sidechain Input"
+msgstr "添加边链电路输入"
+
+#: plugin_pin_dialog.cc:478 plugin_pin_dialog.cc:482 plugin_pin_dialog.cc:486
+#: plugin_setup_dialog.cc:115 plugin_setup_dialog.cc:199
+msgid "Automatic"
+msgstr "自动化"
+
+#: plugin_pin_dialog.cc:515 plugin_setup_dialog.cc:208
+msgid "%1 Channel"
+msgid_plural "%1 Channels"
+msgstr[0] "%1 声道"
+
+#: plugin_pin_dialog.cc:641 processor_box.cc:224
+msgid "Send"
+msgstr "发送端"
+
+#: plugin_pin_dialog.cc:997
+msgid "Latency %1 spl%2 %3"
+msgstr "延迟 %1 spl%2 %3"
+
+#: plugin_pin_dialog.cc:997 plugin_pin_dialog.cc:1001
+msgid "no-inplace"
+msgstr "非原所在地"
+
+#: plugin_pin_dialog.cc:999
+msgid "Latency %1 spl"
+msgstr "延迟 %1 spl"
+
+#: plugin_pin_dialog.cc:1055
+msgid "Instance #%1"
+msgstr "实例 #%1"
+
+#: plugin_pin_dialog.cc:1700 processor_box.cc:2520
+msgid "Cannot set up new send: %1"
+msgstr "无法建立新的发送端: %1"
+
+#: plugin_pin_dialog.cc:1707
+msgid "SC %1 (%2)"
+msgstr ""
+
+#: plugin_pin_dialog.cc:1963 plugin_pin_dialog.cc:1971
+msgid "Pin Configuration: %1"
+msgstr "接口配置:%1"
+
+#: plugin_setup_dialog.cc:30
+msgid "Plugin Setup"
+msgstr "插件设置"
+
+#: plugin_setup_dialog.cc:33
+msgid "Copy I/O Map"
+msgstr "复制输入/输出映射图"
+
+#: plugin_setup_dialog.cc:50
+msgid "An Instrument plugin is already present."
+msgstr "一个乐器插件已准备就绪。"
+
+#: plugin_setup_dialog.cc:54
+msgid "Replace"
+msgstr "替换"
+
+#: plugin_setup_dialog.cc:60
+msgid "with"
+msgstr "附带"
+
+#: plugin_setup_dialog.cc:70
+msgid "I/O Pin Mapping"
+msgstr "输入/输出接口映射"
+
+#: plugin_setup_dialog.cc:79
+msgid "Configure Plugin '%1'"
+msgstr "配置插件 '%1'"
+
+#: plugin_setup_dialog.cc:90
+msgid "Output Configuration"
+msgstr "输出配置"
+
+#: plugin_selector.cc:54 plugin_selector.cc:322
 msgid "Name contains"
 msgstr "名称包含"
 
-#: plugin_selector.cc:54 plugin_selector.cc:233
+#: plugin_selector.cc:55 plugin_selector.cc:326
 msgid "Type contains"
 msgstr "类型包含"
 
-#: plugin_selector.cc:55 plugin_selector.cc:231
+#: plugin_selector.cc:56 plugin_selector.cc:324
 msgid "Category contains"
-msgstr "类型包含"
+msgstr "类别包含"
 
-#: plugin_selector.cc:56 plugin_selector.cc:253
+#: plugin_selector.cc:57 plugin_selector.cc:349
 msgid "Author contains"
 msgstr "作者包含"
 
-#: plugin_selector.cc:57 plugin_selector.cc:255
+#: plugin_selector.cc:58 plugin_selector.cc:351
 msgid "Library contains"
 msgstr "库包含"
 
-#: plugin_selector.cc:58 plugin_selector.cc:219 plugin_selector.cc:537
+#: plugin_selector.cc:59 plugin_selector.cc:278 plugin_selector.cc:639
 msgid "Favorites only"
-msgstr "仅收藏"
+msgstr "仅最喜爱的"
 
-#: plugin_selector.cc:59 plugin_selector.cc:223 plugin_selector.cc:537
+#: plugin_selector.cc:60 plugin_selector.cc:282 plugin_selector.cc:639
 msgid "Hidden only"
 msgstr "仅隐藏"
 
-#: plugin_selector.cc:64
+#: plugin_selector.cc:65
 msgid "Plugin Manager"
 msgstr "插件管理"
 
-#: plugin_selector.cc:85
+#: plugin_selector.cc:96
 msgid "Fav"
-msgstr "收藏"
+msgstr "最喜爱的"
 
-#: plugin_selector.cc:87
+#: plugin_selector.cc:98
 msgid "Available Plugins"
 msgstr "可用插件"
 
-#: plugin_selector.cc:88
+#: plugin_selector.cc:99
 msgid "Type"
 msgstr "类型"
 
-#: plugin_selector.cc:89
+#: plugin_selector.cc:100
 msgid "Category"
 msgstr "类别"
 
-#: plugin_selector.cc:90
+#: plugin_selector.cc:101
 msgid "Creator"
 msgstr "创建者"
 
-#: plugin_selector.cc:91
+#: plugin_selector.cc:102
 msgid "# Audio In"
 msgstr "# 音频输入"
 
-#: plugin_selector.cc:92
+#: plugin_selector.cc:103
 msgid "# Audio Out"
 msgstr "# 音频输出"
 
-#: plugin_selector.cc:93
+#: plugin_selector.cc:104
 msgid "# MIDI In"
 msgstr "# MIDI输入"
 
-#: plugin_selector.cc:94
+#: plugin_selector.cc:105
 msgid "# MIDI Out"
 msgstr "# MIDI输出"
 
-#: plugin_selector.cc:116
+#: plugin_selector.cc:132
 msgid "Plugins to be connected"
 msgstr "被连接的插件"
 
-#: plugin_selector.cc:129
+#: plugin_selector.cc:145
 msgid "Add a plugin to the effect list"
 msgstr "添加一个插件到效果列表"
 
-#: plugin_selector.cc:133
+#: plugin_selector.cc:149
 msgid "Remove a plugin from the effect list"
 msgstr "从效果列表中移除一个插件"
 
-#: plugin_selector.cc:135
-msgid "Update available plugins"
-msgstr "更新可用插件"
+#: plugin_selector.cc:161
+msgid "Show Hidden"
+msgstr "显示已隐藏的"
+
+#: plugin_selector.cc:163
+msgid "Include hidden plugins in list."
+msgstr "包括列表中隐藏的插件。"
 
-#: plugin_selector.cc:172
+#: plugin_selector.cc:166
+msgid "Instruments"
+msgstr "乐器"
+
+#: plugin_selector.cc:168
+msgid "Cycle display of instrument plugins (if any)."
+msgstr "循环显示乐器插件(如果有的话)。"
+
+#: plugin_selector.cc:171
+msgid "Analyzers"
+msgstr "分析仪"
+
+#: plugin_selector.cc:173
+msgid "Cycle display of analysis plugins (if any)."
+msgstr "循环显示分析仪插件(如果有的话)。"
+
+#: plugin_selector.cc:176
+msgid "Utils"
+msgstr "工具"
+
+#: plugin_selector.cc:178
+msgid "Cycle display of utility plugins (if any)."
+msgstr "循环显示工具插件(如果有的话)。"
+
+#: plugin_selector.cc:208
+msgid "Filter"
+msgstr "滤镜"
+
+#: plugin_selector.cc:232
 msgid "Insert Plugin(s)"
 msgstr "插入插件"
 
-#: plugin_selector.cc:337 plugin_selector.cc:338 plugin_selector.cc:339
-#: plugin_selector.cc:340
+#: plugin_selector.cc:439 plugin_selector.cc:440 plugin_selector.cc:441
+#: plugin_selector.cc:442
 msgid "variable"
 msgstr "变量"
 
-#: plugin_selector.cc:496
+#: plugin_selector.cc:598
 msgid ""
 "The plugin \"%1\" could not be loaded\n"
 "\n"
@@ -8318,43 +10017,43 @@ msgstr ""
 "\n"
 "更多的信息(也许可以)参阅日志窗口"
 
-#: plugin_selector.cc:644
+#: plugin_selector.cc:757
 msgid "Favorites"
-msgstr "收藏"
+msgstr "最喜爱的"
 
-#: plugin_selector.cc:646
+#: plugin_selector.cc:759
 msgid "Plugin Manager..."
 msgstr "插件管理器…"
 
-#: plugin_selector.cc:650
+#: plugin_selector.cc:763
 msgid "By Creator"
-msgstr "根据创建者"
+msgstr "按创建者"
 
-#: plugin_selector.cc:653
+#: plugin_selector.cc:766
 msgid "By Category"
-msgstr "根据类别"
+msgstr "按类别"
 
-#: plugin_ui.cc:113
+#: plugin_ui.cc:114
 msgid "Eh? LADSPA plugins don't have editors!"
 msgstr "噢?LADSPA插件没有编辑器!"
 
-#: plugin_ui.cc:122 plugin_ui.cc:227
+#: plugin_ui.cc:123 plugin_ui.cc:228
 msgid ""
-"unknown type of editor-supplying plugin (note: no VST support in this version of "
-"%1)"
+"unknown type of editor-supplying plugin (note: no VST support in this "
+"version of %1)"
 msgstr "未知的编辑器应用插件类型(注意:在这个 %1 版本无 VST 支持)"
 
-#: plugin_ui.cc:125
+#: plugin_ui.cc:126
 msgid "unknown type of editor-supplying plugin"
 msgstr "未知的编辑器应用插件类型"
 
-#: plugin_ui.cc:257
+#: plugin_ui.cc:258
 msgid ""
-"unknown type of editor-supplying plugin (note: no linuxVST support in this version "
-"of %1)"
+"unknown type of editor-supplying plugin (note: no linuxVST support in this "
+"version of %1)"
 msgstr "未知的编辑器应用插件类型(注意:在这个 %1 版本无 linuxVST 支持)"
 
-#: plugin_ui.cc:329
+#: plugin_ui.cc:330
 msgid "create_lv2_editor called on non-LV2 plugin"
 msgstr "创建_lv2_编辑器调用 non-LV2 插件"
 
@@ -8362,15 +10061,15 @@ msgstr "创建_lv2_编辑器调用 non-LV2 插件"
 msgid "Add"
 msgstr "添加"
 
-#: plugin_ui.cc:422
+#: plugin_ui.cc:423
 msgid "Description"
 msgstr "说明"
 
-#: plugin_ui.cc:423
+#: plugin_ui.cc:424
 msgid "Plugin analysis"
 msgstr "插件分析"
 
-#: plugin_ui.cc:430
+#: plugin_ui.cc:431
 msgid ""
 "Presets (if any) for this plugin\n"
 "(Both factory and user-created)"
@@ -8378,140 +10077,162 @@ msgstr ""
 "预设这个插件(如果有的话)\n"
 "(包括出厂设置和用户创建的设置)"
 
-#: plugin_ui.cc:431
+#: plugin_ui.cc:432
 msgid "Save a new preset"
 msgstr "保存一个新的预设"
 
-#: plugin_ui.cc:432
+#: plugin_ui.cc:433
 msgid "Save the current preset"
 msgstr "保存当前预设"
 
-#: plugin_ui.cc:433
+#: plugin_ui.cc:434
 msgid "Delete the current preset"
 msgstr "删除当前预设"
 
-#: plugin_ui.cc:434
+#: plugin_ui.cc:435
+msgid ""
+"Reset parameters to default (if no parameters are in automation play mode)"
+msgstr "参数重置为默认(如果没有参数处在自动化模式)"
+
+#: plugin_ui.cc:436
 msgid "Disable signal processing by the plugin"
 msgstr "按插件禁用信号处理"
 
-#: plugin_ui.cc:467 plugin_ui.cc:663
+#: plugin_ui.cc:473 plugin_ui.cc:681
 msgid ""
-"Click to allow the plugin to receive keyboard events that %1 would normally use as "
-"a shortcut"
+"Click to allow the plugin to receive keyboard events that %1 would normally "
+"use as a shortcut"
 msgstr "单击允许此插件接受键盘事件,以便 %1 可以正常地作为一个快捷键使用"
 
-#: plugin_ui.cc:468
+#: plugin_ui.cc:474
 msgid "Click to enable/disable this plugin"
 msgstr "单击启用/禁用此插件"
 
-#: plugin_ui.cc:507
+#: plugin_ui.cc:517
 msgid "latency (%1 sample)"
 msgid_plural "latency (%1 samples)"
-msgstr[0] "延迟(%1 采样)"
+msgstr[0] "延迟(%1 样本)"
 
-#: plugin_ui.cc:509
+#: plugin_ui.cc:519
 msgid "latency (%1 ms)"
 msgstr "延迟(%1 毫秒)"
 
-#: plugin_ui.cc:520
+#: plugin_ui.cc:530
 msgid "Edit Latency"
 msgstr "编辑延迟"
 
-#: plugin_ui.cc:566
+#: plugin_ui.cc:576
 msgid ""
-"Plugin presets are not supported in this build of %1. Consider paying for a full "
-"version"
-msgstr "插件预设在本个 %1 构建中不支持。请考虑为完整版本付"
+"Plugin presets are not supported in this build of %1. Consider paying for a "
+"full version"
+msgstr "插件预设在本个 %1 构建中不支持。请考虑为完整版本付费"
 
-#: plugin_ui.cc:574
+#: plugin_ui.cc:584
 msgid ""
 "Plugin presets are not supported in this build, see the Log window for more "
 "information."
 msgstr "插件预设在本构建中不支持,更多信息请参阅日志窗口。"
 
-#: plugin_ui.cc:670
+#: plugin_ui.cc:592
+msgid "New Preset"
+msgstr "新建预设"
+
+#: plugin_ui.cc:688
 msgid "Click to allow normal use of %1 keyboard shortcuts"
 msgstr "单击允许正常使用 %1 键盘快捷键"
 
-#: port_group.cc:337
+#: plugin_ui.cc:795
+msgid "(none)"
+msgstr "(无)"
+
+#: port_group.cc:338
 msgid "%1 Busses"
 msgstr "%1 总线"
 
-#: port_group.cc:338
+#: port_group.cc:339
 msgid "%1 Tracks"
 msgstr "%1 音轨"
 
-#: port_group.cc:339
+#: port_group.cc:340
 msgid "Hardware"
 msgstr "硬件"
 
-#: port_group.cc:340
+#: port_group.cc:341
 msgid "%1 Misc"
 msgstr "%1 杂项"
 
-#: port_group.cc:341
+#: port_group.cc:342
 msgid "Other"
 msgstr "其它"
 
-#: port_group.cc:432 port_group.cc:433
+# 纵向时间码(LTC,Longitidinal time code)
+#: port_group.cc:435 port_group.cc:436
 msgid "LTC Out"
-msgstr "LTC 输出"
+msgstr "LTC(纵向时间码)输出"
 
-#: port_group.cc:436 port_group.cc:437
+#: port_group.cc:439 port_group.cc:440
 msgid "LTC In"
-msgstr "LTC 输入"
+msgstr "LTC(纵向时间码)输入"
 
-#: port_group.cc:463
+#: port_group.cc:474
 msgid "MTC in"
-msgstr "MTC 输入"
+msgstr "MTC(MIDI时间码)输入"
 
-#: port_group.cc:466
+#: port_group.cc:477
 msgid "MIDI control in"
 msgstr "MIDI 控制输入"
 
-#: port_group.cc:469
+#: port_group.cc:480
 msgid "MIDI clock in"
 msgstr "MIDI 计时器输入"
 
-#: port_group.cc:472
+#: port_group.cc:483
 msgid "MMC in"
-msgstr "MMC 输入"
+msgstr "MMC(MIDI时间控制)输入"
 
-#: port_group.cc:476
+#: port_group.cc:487
 msgid "MTC out"
-msgstr "MTC 输出"
+msgstr "MTC(MIDI时间码)输出"
 
-#: port_group.cc:479
+#: port_group.cc:490
 msgid "MIDI control out"
 msgstr "MIDI 控制输出"
 
-#: port_group.cc:482
+#: port_group.cc:493
 msgid "MIDI clock out"
 msgstr "MIDI 计时器输出"
 
-#: port_group.cc:485
+#: port_group.cc:496
 msgid "MMC out"
-msgstr "MMC 输出"
+msgstr "MMC(MIDI时间控制)输出"
 
-#: port_group.cc:532
+#: port_group.cc:555
 msgid ":monitor"
 msgstr ":监控"
 
-#: port_group.cc:544
+#: port_group.cc:571
 msgid "system:"
 msgstr "系统:"
 
-#: port_group.cc:545
-msgid "alsa_pcm"
+#: port_group.cc:572
+msgid "alsa_pcm:"
+msgstr ""
+
+#: port_group.cc:573
+msgid "alsa_midi:"
 msgstr ""
 
+#: port_group.cc:578
+msgid "Scene "
+msgstr "场景"
+
 #: port_insert_ui.cc:39
 msgid "Measure Latency"
 msgstr "测量延迟"
 
 #: port_insert_ui.cc:50
 msgid "Send/Output"
-msgstr "发送/输出"
+msgstr "发送端/输出"
 
 #: port_insert_ui.cc:51
 msgid "Return/Input"
@@ -8525,80 +10246,76 @@ msgstr "未检测到信号"
 msgid "Port Insert "
 msgstr "端口插入"
 
-#: port_matrix.cc:331 port_matrix.cc:357
+#: port_matrix.cc:341 port_matrix.cc:367
 msgid "<b>Sources</b>"
-msgstr "<b>源</b>"
+msgstr "<b>来源</b>"
 
-#: port_matrix.cc:332 port_matrix.cc:358
+#: port_matrix.cc:342 port_matrix.cc:368
 msgid "<b>Destinations</b>"
-msgstr "<b>目的地</b>"
+msgstr "<b>目标</b>"
 
-#: port_matrix.cc:440 port_matrix.cc:448
+#: port_matrix.cc:450 port_matrix.cc:458
 #, c-format
 msgid "Add %s %s"
 msgstr "添加 %s %s"
 
-#: port_matrix.cc:456
+#: port_matrix.cc:466
 #, c-format
 msgid "Rename '%s'..."
 msgstr "重命名 '%s'..."
 
-#: port_matrix.cc:472
+#: port_matrix.cc:482
 msgid "Remove all"
 msgstr "移除所有"
 
-#: port_matrix.cc:492 port_matrix.cc:504
+#: port_matrix.cc:502 port_matrix.cc:514
 #, c-format
 msgid "%s all"
 msgstr "%s 所有"
 
-#: port_matrix.cc:527
+#: port_matrix.cc:537
 msgid "Rescan"
 msgstr "重新扫描"
 
-#: port_matrix.cc:529
+#: port_matrix.cc:539
 msgid "Show individual ports"
 msgstr "显示各个端口"
 
-#: port_matrix.cc:535
+#: port_matrix.cc:545
 msgid "Flip"
 msgstr "轻弹"
 
-#: port_matrix.cc:722
-msgid ""
-"It is not possible to add a port here, as the first processor in the track or buss "
-"cannot support the new configuration."
-msgstr "不可能在此添加一个端口,作为在音轨或总线里的第一个处理器无法支持新的配置。"
+#: port_matrix.cc:732
+msgid "It is not possible to add a port here."
+msgstr "不可能在这里添加一个端口。"
 
-#: port_matrix.cc:725
+#: port_matrix.cc:733
 msgid "Cannot add port"
 msgstr "无法添加端口"
 
-#: port_matrix.cc:747
+#: port_matrix.cc:757
+msgid "The last port cannot be removed"
+msgstr "最后的端口不能被移除"
+
+#: port_matrix.cc:760
+msgid "This port cannot be removed."
+msgstr "这个端口不能被移除。"
+
+#: port_matrix.cc:765
 msgid "Port removal not allowed"
 msgstr "不允许移除端口"
 
-#: port_matrix.cc:748
-msgid ""
-"This port cannot be removed.\n"
-"Either the first plugin in the track or buss cannot accept\n"
-"the new number of inputs or the last plugin has more outputs."
-msgstr ""
-"该端口不能被移除。\n"
-"不论是新的输入号码或者最后一个插件有更多的输出,\n"
-"在音轨或总线里的第一个插件都无法接受。"
-
-#: port_matrix.cc:965
+#: port_matrix.cc:981
 #, c-format
 msgid "Remove '%s'"
 msgstr "移除 '%s'"
 
-#: port_matrix.cc:980
+#: port_matrix.cc:996
 #, c-format
 msgid "%s all from '%s'"
 msgstr "%s 所有来自于 '%s'"
 
-#: port_matrix.cc:1046 transform_dialog.cc:62
+#: port_matrix.cc:1062 transform_dialog.cc:62
 msgid "channel"
 msgstr "声道"
 
@@ -8608,17 +10325,17 @@ msgstr "没有端口可连接。"
 
 #: port_matrix_body.cc:84
 msgid "There are no %1 ports to connect."
-msgstr "没有 %1 端口可连接."
+msgstr "没有 %1 端口可连接。"
 
-#: processor_box.cc:150
-msgid "Send"
-msgstr "发送"
-
-#: processor_box.cc:152
+#: processor_box.cc:226
 msgid "Return"
 msgstr "返回"
 
-#: processor_box.cc:310
+#: processor_box.cc:323
+msgid "New Favorite Preset for \"%1\""
+msgstr "为 \"%1\" 新建最喜爱的预设"
+
+#: processor_box.cc:501
 msgid ""
 "\n"
 "This mono plugin has been replicated %1 times."
@@ -8626,17 +10343,17 @@ msgstr ""
 "\n"
 "这个单声道插件已经被复制了 %1 次。"
 
-#: processor_box.cc:314
+#: processor_box.cc:505 processor_box.cc:1528
 msgid ""
 "<b>%1</b>\n"
 "Double-click to show GUI.\n"
-"Alt+double-click to show generic GUI.%2"
+"%2+double-click to show generic GUI.%3"
 msgstr ""
 "<b>%1</b>\n"
 "双击显示图形用户界面。\n"
-"Alt+双击显示通用图形用户界面。%2"
+"%2+双击显示通用图形用户界面。%3"
 
-#: processor_box.cc:317
+#: processor_box.cc:508 processor_box.cc:1531
 msgid ""
 "<b>%1</b>\n"
 "Double-click to show generic GUI.%2"
@@ -8644,48 +10361,72 @@ msgstr ""
 "<b>%1</b>\n"
 "双击显示通用图形用户界面。%2"
 
-#: processor_box.cc:361
+#: processor_box.cc:514
+msgid ""
+"<b>%1</b>\n"
+"The Plugin is not available on this system\n"
+"and has been replaced by a stub."
+msgstr ""
+"<b>%1</b>\n"
+"插件在本系统上不可用\n"
+"并且已经被一个占位符取而代之。"
+
+#: processor_box.cc:600
 #, c-format
 msgid "(%1x1) "
 msgstr ""
 
-#: processor_box.cc:437
+#: processor_box.cc:695
+msgid "Inline Display"
+msgstr "内联显示"
+
+#: processor_box.cc:703
 msgid "Show All Controls"
 msgstr "显示所有控制"
 
-#: processor_box.cc:441
+#: processor_box.cc:707
 msgid "Hide All Controls"
 msgstr "隐藏所有控制"
 
-#: processor_box.cc:475
+#: processor_box.cc:752
 msgid "Link panner controls"
-msgstr "链接面板控制"
+msgstr "链接声相器控制"
 
-#: processor_box.cc:575
+#: processor_box.cc:859
 msgid "on"
 msgstr "开启"
 
-#: processor_box.cc:575 rc_option_editor.cc:2360 rc_option_editor.cc:2374
+#: processor_box.cc:859 rc_option_editor.cc:3185 rc_option_editor.cc:3199
 msgid "off"
 msgstr "关闭"
 
-#: processor_box.cc:957
+#: processor_box.cc:1819
 msgid ""
 "Right-click to add/remove/edit\n"
 "plugins,inserts,sends and more"
 msgstr ""
 "右键点击添加/移除/编辑\n"
-"插件、插入、发送以及更多"
+"插件、插入、发送端以及更多"
+
+#: processor_box.cc:1968
+msgid ""
+"Processor Drag/Drop failed. Probably because\n"
+"the I/O configuration of the plugins could\n"
+"not match the configuration of this track."
+msgstr ""
+"处理器拖/放失败。\n"
+"可能是因为插件的输入/输出配置\n"
+"无法匹配这条音轨的配置。"
 
-#: processor_box.cc:1429 processor_box.cc:1804
+#: processor_box.cc:2455 processor_box.cc:2998
 msgid "Plugin Incompatibility"
 msgstr "插件不兼容"
 
-#: processor_box.cc:1432
+#: processor_box.cc:2458
 msgid "You attempted to add the plugin \"%1\" in slot %2.\n"
 msgstr "您试图在空位 %2 中添加插件 \"%1\" 。\n"
 
-#: processor_box.cc:1438
+#: processor_box.cc:2464
 msgid ""
 "\n"
 "This plugin has:\n"
@@ -8693,17 +10434,17 @@ msgstr ""
 "\n"
 "此插件有:\n"
 
-#: processor_box.cc:1441
+#: processor_box.cc:2467
 msgid "\t%1 MIDI input\n"
 msgid_plural "\t%1 MIDI inputs\n"
 msgstr[0] "\t%1 MIDI 输入\n"
 
-#: processor_box.cc:1445
+#: processor_box.cc:2471
 msgid "\t%1 audio input\n"
 msgid_plural "\t%1 audio inputs\n"
 msgstr[0] "\t%1 音频输出\n"
 
-#: processor_box.cc:1448
+#: processor_box.cc:2474
 msgid ""
 "\n"
 "but at the insertion point, there are:\n"
@@ -8711,17 +10452,17 @@ msgstr ""
 "\n"
 "但在插入点那里有:\n"
 
-#: processor_box.cc:1451
+#: processor_box.cc:2477
 msgid "\t%1 MIDI channel\n"
 msgid_plural "\t%1 MIDI channels\n"
 msgstr[0] "\t%1 MIDI 声道\n"
 
-#: processor_box.cc:1455
+#: processor_box.cc:2481
 msgid "\t%1 audio channel\n"
 msgid_plural "\t%1 audio channels\n"
 msgstr[0] "\t%1 音频声道\n"
 
-#: processor_box.cc:1458
+#: processor_box.cc:2484
 msgid ""
 "\n"
 "%1 is unable to insert this plugin here.\n"
@@ -8729,33 +10470,29 @@ msgstr ""
 "\n"
 "%1 无法在此处再次插入插件.\n"
 
-#: processor_box.cc:1495
-msgid "Cannot set up new send: %1"
-msgstr "无法建立新的发送: %1"
-
-#: processor_box.cc:1807
+#: processor_box.cc:3001
 msgid ""
 "You cannot reorder these plugins/sends/inserts\n"
 "in that way because the inputs and\n"
 "outputs will not work correctly."
 msgstr ""
 "您不能以这种方式\n"
-"要求这些插件/发送/插入\n"
+"要求这些插件/发送端/插入\n"
 "因为输入和输出将无法正确工作。"
 
-#: processor_box.cc:1991
+#: processor_box.cc:3201
 msgid "Rename Processor"
 msgstr "重命名处理器"
 
-#: processor_box.cc:2022
+#: processor_box.cc:3232
 msgid "At least 100 IO objects exist with a name like %1 - name not changed"
 msgstr "至少有100个输入输出对象物体存在着像 %1这样的名称——名称没有改变"
 
-#: processor_box.cc:2159
+#: processor_box.cc:3383
 msgid "plugin insert constructor failed"
 msgstr "插件插入构造函数失败"
 
-#: processor_box.cc:2170
+#: processor_box.cc:3394
 msgid ""
 "Copying the set of processors on the clipboard failed,\n"
 "probably because the I/O configuration of the plugins\n"
@@ -8765,7 +10502,7 @@ msgstr ""
 "可能是因为插件的输入/输出配置\n"
 "无法匹配这条音轨的配置。"
 
-#: processor_box.cc:2216
+#: processor_box.cc:3440
 msgid ""
 "Do you really want to remove all processors from %1?\n"
 "(this cannot be undone)"
@@ -8773,83 +10510,83 @@ msgstr ""
 "您是否真的要从 %1 移除所有的处理器?\n"
 "(此操作不可撤销)"
 
-#: processor_box.cc:2220 processor_box.cc:2245
+#: processor_box.cc:3444 processor_box.cc:3469
 msgid "Yes, remove them all"
 msgstr "是的,全部移除它们"
 
-#: processor_box.cc:2222 processor_box.cc:2247
+#: processor_box.cc:3446 processor_box.cc:3471
 msgid "Remove processors"
 msgstr "移除处理器"
 
-#: processor_box.cc:2237
+#: processor_box.cc:3461
 msgid ""
 "Do you really want to remove all pre-fader processors from %1?\n"
 "(this cannot be undone)"
 msgstr ""
-"您是否真的要从 %1 移除所有的前置淡化处理器?\n"
+"您是否真的要从 %1 移除所有的前置于淡化器处理器?\n"
 "(此操作不可撤销)"
 
-#: processor_box.cc:2240
+#: processor_box.cc:3464
 msgid ""
 "Do you really want to remove all post-fader processors from %1?\n"
 "(this cannot be undone)"
 msgstr ""
-"您是否真的要从 %1 移除所有的后置淡化处理器?\n"
+"您是否真的要从 %1 移除所有的后置于淡化器处理器?\n"
 "(此操作不可撤销)"
 
-#: processor_box.cc:2428
+#: processor_box.cc:3653
 msgid "New Plugin"
 msgstr "新建插件"
 
-#: processor_box.cc:2431
+#: processor_box.cc:3656
 msgid "New Insert"
 msgstr "新建插入"
 
-#: processor_box.cc:2434
+#: processor_box.cc:3659
 msgid "New External Send ..."
-msgstr "新建外部发送…"
+msgstr "新建外部发送端…"
 
-#: processor_box.cc:2438
+#: processor_box.cc:3663
 msgid "New Aux Send ..."
-msgstr "新建辅助发送"
+msgstr "新建辅助发送端…"
 
-#: processor_box.cc:2441
+#: processor_box.cc:3666
 msgid "Send Options"
-msgstr "发送选项"
+msgstr "发送端选项"
 
-#: processor_box.cc:2443
+#: processor_box.cc:3668
 msgid "Clear (all)"
 msgstr "清除(所有)"
 
-#: processor_box.cc:2445
+#: processor_box.cc:3670
 msgid "Clear (pre-fader)"
-msgstr "清除(前置淡化)"
+msgstr "清除(前置于淡化器)"
 
-#: processor_box.cc:2447
+#: processor_box.cc:3672
 msgid "Clear (post-fader)"
-msgstr "清除(后置淡化)"
+msgstr "清除(后置于淡化器)"
 
-#: processor_box.cc:2473
+#: processor_box.cc:3702
 msgid "Activate All"
 msgstr "激活所有"
 
-#: processor_box.cc:2475
+#: processor_box.cc:3704
 msgid "Deactivate All"
 msgstr "不激活所有"
 
-#: processor_box.cc:2477
+#: processor_box.cc:3706
 msgid "A/B Plugins"
 msgstr "A/B 插件"
 
-#: processor_box.cc:2486
+#: processor_box.cc:3719
 msgid "Edit with generic controls..."
 msgstr "以通用控制编辑…"
 
-#: processor_box.cc:2789
+#: processor_box.cc:4051
 msgid "%1: %2 (by %3)"
 msgstr "%1: %2(通过 %3)"
 
-#: processor_box.cc:2791
+#: processor_box.cc:4053
 msgid "%1 (by %2)"
 msgstr "%1(通过 %2)"
 
@@ -8877,363 +10614,458 @@ msgstr "库"
 msgid "main grid"
 msgstr "主要网格"
 
-#: quantize_dialog.cc:52 quantize_dialog.cc:109
+#: quantize_dialog.cc:61 quantize_dialog.cc:118
 msgid "Quantize"
-msgstr "数字转换"
+msgstr "量化"
 
-#: quantize_dialog.cc:56
+#: quantize_dialog.cc:65
 msgid "Strength"
 msgstr "强度"
 
-#: quantize_dialog.cc:59
+#: quantize_dialog.cc:68
 msgid "Swing"
 msgstr "摆动"
 
-#: quantize_dialog.cc:62
+#: quantize_dialog.cc:71
 msgid "Threshold (ticks)"
 msgstr "临界值(识别声)"
 
-#: quantize_dialog.cc:63
+#: quantize_dialog.cc:72
 msgid "Snap note start"
-msgstr "对齐音符起点"
+msgstr "吸附音符起点"
 
-#: quantize_dialog.cc:64
+#: quantize_dialog.cc:73
 msgid "Snap note end"
-msgstr "对齐音符终点"
-
-#: rc_option_editor.cc:77
-msgid "Click audio file:"
-msgstr "单击音频文件:"
+msgstr "吸附音符终点"
 
-#: rc_option_editor.cc:80 rc_option_editor.cc:87
+#: rc_option_editor.cc:83 rc_option_editor.cc:84 rc_option_editor.cc:1550
 msgid "Browse..."
 msgstr "浏览…"
 
-#: rc_option_editor.cc:84
+#: rc_option_editor.cc:89
+msgid "Emphasis on first beat:"
+msgstr "加重第一拍:"
+
+#: rc_option_editor.cc:95
+msgid "Use default Click:"
+msgstr "使用默认识别声:"
+
+#: rc_option_editor.cc:101
+msgid "Click audio file:"
+msgstr "点击音频文件:"
+
+#: rc_option_editor.cc:108
 msgid "Click emphasis audio file:"
 msgstr "点击加重音频文件:"
 
-#: rc_option_editor.cc:116
+#: rc_option_editor.cc:154
 msgid "Choose Click"
 msgstr "选择点击"
 
-#: rc_option_editor.cc:139
+#: rc_option_editor.cc:177
 msgid "Choose Click Emphasis"
 msgstr "选择点击加重"
 
-#: rc_option_editor.cc:170
+#: rc_option_editor.cc:238
 msgid "Limit undo history to"
 msgstr "限制撤销历史到"
 
-#: rc_option_editor.cc:171
+#: rc_option_editor.cc:239
 msgid "Save undo history of"
 msgstr "保存撤销历史"
 
-#: rc_option_editor.cc:180 rc_option_editor.cc:187
+#: rc_option_editor.cc:248 rc_option_editor.cc:255
 msgid "commands"
 msgstr "命令"
 
-#: rc_option_editor.cc:325
+#: rc_option_editor.cc:378
+msgid ""
+"\n"
+"Changes to this setting will only persist after your project has been saved."
+msgstr ""
+"\n"
+"此处设置的改变将会仅持续到您的项目被保存为止。"
+
+#: rc_option_editor.cc:389 rc_option_editor.cc:451
+msgid "<b>Recommended Setting: %1 + button 3 (right mouse button)</b>%2"
+msgstr "<b>推荐设置:%1 + 按键 3 (鼠标右键)</b>%2"
+
+#: rc_option_editor.cc:403
+msgid "Select Keyboard layout:"
+msgstr "选择键盘布局:"
+
+#: rc_option_editor.cc:422
+msgid "When Clicking:"
+msgstr "当点击时:"
+
+#: rc_option_editor.cc:429
 msgid "Edit using:"
 msgstr "编辑使用:"
 
-#: rc_option_editor.cc:331 rc_option_editor.cc:357 rc_option_editor.cc:384
+#: rc_option_editor.cc:435 rc_option_editor.cc:465 rc_option_editor.cc:495
 msgid "+ button"
 msgstr "+按钮"
 
-#: rc_option_editor.cc:351
+#: rc_option_editor.cc:459
 msgid "Delete using:"
 msgstr "删除使用:"
 
-#: rc_option_editor.cc:378
+#: rc_option_editor.cc:481
+msgid "<b>Recommended Setting: %1 + button 1 (left mouse button)</b>%2"
+msgstr "<b>推荐设置:%1 + 按键 1 (鼠标左键)</b>%2"
+
+#: rc_option_editor.cc:489
 msgid "Insert note using:"
 msgstr "插入音符使用:"
 
-#: rc_option_editor.cc:405
+#: rc_option_editor.cc:507
+msgid "When Beginning a Drag:"
+msgstr "当开始一个拖拽时:"
+
+#: rc_option_editor.cc:518 rc_option_editor.cc:545 rc_option_editor.cc:578
+#: rc_option_editor.cc:599 rc_option_editor.cc:643 rc_option_editor.cc:676
+#: rc_option_editor.cc:702 rc_option_editor.cc:730 rc_option_editor.cc:759
+#: rc_option_editor.cc:781
+msgid "<b>Recommended Setting: %1</b>%2"
+msgstr "<b>推荐设置:%1</b>%2"
+
+#: rc_option_editor.cc:532
+msgid "Copy items using:"
+msgstr "复制项目使用:"
+
+#: rc_option_editor.cc:559
+msgid "Constrain drag using:"
+msgstr "约束拖拽使用:"
+
+#: rc_option_editor.cc:567
+msgid "When Beginning a Trim:"
+msgstr "当开始一个修剪:"
+
+#: rc_option_editor.cc:586
+msgid "Trim contents using:"
+msgstr "修剪内容使用:"
+
+#: rc_option_editor.cc:607
+msgid "Anchored trim using:"
+msgstr "锚定修剪使用:"
+
+#: rc_option_editor.cc:651
+msgid "Resize notes relatively using:"
+msgstr "调整音符相对大小使用:"
+
+#: rc_option_editor.cc:660
+msgid "While Dragging:"
+msgstr "在拖拽过程中:"
+
+#: rc_option_editor.cc:684
 msgid "Ignore snap using:"
-msgstr "忽略音符使用:"
+msgstr "忽略吸附使用:"
+
+#: rc_option_editor.cc:710
+msgid "Snap relatively using:"
+msgstr "相对吸附使用:"
+
+#: rc_option_editor.cc:718
+msgid "While Trimming:"
+msgstr "在修剪时:"
+
+#: rc_option_editor.cc:738
+msgid "Resize overlapped regions using:"
+msgstr "调整重叠区域的大小使用:"
+
+#: rc_option_editor.cc:746
+msgid "While Dragging Control Points:"
+msgstr "在拖拽控制点时:"
+
+#: rc_option_editor.cc:767
+msgid "Fine adjust using:"
+msgstr "细微调整使用:"
 
-#: rc_option_editor.cc:421
-msgid "Keyboard layout:"
-msgstr "键盘布局:"
+#: rc_option_editor.cc:789
+msgid "Push points using:"
+msgstr "推动点使用:"
 
-#: rc_option_editor.cc:544
-msgid "Font scaling:"
-msgstr "字体缩放:"
+#: rc_option_editor.cc:1029
+msgid "GUI and Font scaling:"
+msgstr "用户图形界面和字体缩放:"
 
-#: rc_option_editor.cc:547
+#: rc_option_editor.cc:1032
 msgid "Default"
 msgstr "默认"
 
-#: rc_option_editor.cc:573
-msgid "Major font-scale changes require an application restart to re-layout."
-msgstr "重要的字体缩放变化要求应用程序重新启动以便于重新布局。"
+#: rc_option_editor.cc:1058
+msgid "Adjusting the scale requires an application restart to re-layout."
+msgstr "调整缩放需要一个应用程序重启以便重新布局。"
+
+#: rc_option_editor.cc:1100
+msgid "∞"
+msgstr "∞(无穷)"
+
+#: rc_option_editor.cc:1101
+msgid "30 sec"
+msgstr "30 秒"
+
+#: rc_option_editor.cc:1102
+msgid "1 min"
+msgstr "1 分"
+
+#: rc_option_editor.cc:1103
+msgid "2 mins"
+msgstr "2 分"
+
+#: rc_option_editor.cc:1104
+msgid "3 mins"
+msgstr "3 分"
 
-#: rc_option_editor.cc:614
+#: rc_option_editor.cc:1105
+msgid "4 mins"
+msgstr "4 分"
+
+#: rc_option_editor.cc:1106
+msgid "5 mins"
+msgstr "5 分"
+
+#: rc_option_editor.cc:1109
+msgid ""
+"Specify the default timeout for plugin instantiation. Plugins that require "
+"more time to load will be blacklisted. A value of 0 disables the timeout."
+msgstr ""
+"为插件实例化指定默认超时。需要更多时间载入的插件将会被列入黑名单。数值 0 禁用"
+"超时。"
+
+#: rc_option_editor.cc:1111
+msgid "Scan Time Out:"
+msgstr "扫描超时:"
+
+#: rc_option_editor.cc:1159
 msgid "Waveform Clip Level (dBFS):"
 msgstr "波形截波电平(dBFS):"
 
-#: rc_option_editor.cc:666
+#: rc_option_editor.cc:1212
+msgid "Small sessions (4-16 tracks)"
+msgstr "小型会话(4-16 音轨)"
+
+#: rc_option_editor.cc:1213
+msgid "Medium sessions (16-64 tracks)"
+msgstr "中型会话(16 - 64 音轨)"
+
+#: rc_option_editor.cc:1214
+msgid "Large sessions (64+ tracks)"
+msgstr "大型会话(64+ 音轨)"
+
+#: rc_option_editor.cc:1215
+msgid "Custom (set by sliders below)"
+msgstr "定制(使用下方的滑块设置)"
+
+#: rc_option_editor.cc:1219 export_video_dialog.cc:167
+msgid "Preset:"
+msgstr "预设:"
+
+#: rc_option_editor.cc:1231
 msgid "Playback (seconds of buffering):"
 msgstr "回放(缓冲的秒数):"
 
-#: rc_option_editor.cc:679
+#: rc_option_editor.cc:1244
 msgid "Recording (seconds of buffering):"
 msgstr "录制(缓冲的秒数):"
 
-#: rc_option_editor.cc:737
+#: rc_option_editor.cc:1322
+msgid "programming error: unknown buffering preset string, index = %1"
+msgstr "程序错误:未知的缓冲预设字符串,索引 = %1"
+
+#: rc_option_editor.cc:1353
 msgid "Control Surface Protocol"
 msgstr "控制面协议"
 
-#: rc_option_editor.cc:746
-msgid "Double-click on a name to edit settings for an enabled protocol"
-msgstr "双击名称以便编辑已启用协议的设置"
+#: rc_option_editor.cc:1367
+msgid ""
+"Click to edit the settings for selected protocol ( it must be ENABLED "
+"first ):"
+msgstr "点击为已选中的协议编辑设置(它必须是首先被启用的):"
+
+#: rc_option_editor.cc:1371
+msgid "Show Protocol Settings"
+msgstr "显示协议设置"
+
+#: rc_option_editor.cc:1494
+msgid "Configuration"
+msgstr "配置"
 
-#: rc_option_editor.cc:903
+#: rc_option_editor.cc:1547
 msgid "Show Video Export Info before export"
 msgstr "导出前显示视频导出信息"
 
-#: rc_option_editor.cc:904
+#: rc_option_editor.cc:1548
 msgid "Show Video Server Startup Dialog"
 msgstr "显示视频服务启动对话框"
 
-#: rc_option_editor.cc:905
+#: rc_option_editor.cc:1549
 msgid "Advanced Setup (remote video server)"
 msgstr "高级设置(远程视频服务)"
 
-#: rc_option_editor.cc:913
+#: rc_option_editor.cc:1556
+msgid "Video Server"
+msgstr "视频服务器"
+
+#: rc_option_editor.cc:1565
 msgid ""
-"<b>When enabled</b> you can speficify a custom video-server URL and docroot. - Do "
-"not enable this option unless you know what you are doing."
+"<b>When enabled</b> you can speficify a custom video-server URL and docroot. "
+"- Do not enable this option unless you know what you are doing."
 msgstr ""
-"<b>启用时</b> 您可以指定一个定制的视频服务器网址和文档根。——不要启用该选项,除非您"
-"知道您正在做什么。"
+"<b>启用时</b> 您可以指定一个定制的视频服务器网址和文档根。—— 不要启用该选项,"
+"除非您知道您正在做什么。"
 
-#: rc_option_editor.cc:915
+#: rc_option_editor.cc:1567
 msgid "Video Server URL:"
 msgstr "视频服务器网址:"
 
-#: rc_option_editor.cc:920
+#: rc_option_editor.cc:1572
 msgid ""
 "Base URL of the video-server including http prefix. This is usually 'http://"
-"hostname.example.org:1554/' and defaults to 'http://localhost:1554/' when the "
-"video-server is running locally"
+"hostname.example.org:1554/' and defaults to 'http://localhost:1554/' when "
+"the video-server is running locally"
 msgstr ""
-"基于网址的视频服务包括 http 前缀。当视频服务器是运行在本地时,这网址通常是 “http://"
-"hostname.example.org:1554/” 以及默认是 “http://localhost:1554/” 。"
+"基于网址的视频服务包括 http 前缀。当视频服务器是运行在本地时,这网址通常是 "
+"“http://hostname.example.org:1554/” 以及默认是 “http://localhost:1554/” 。"
 
-#: rc_option_editor.cc:922
+#: rc_option_editor.cc:1574
 msgid "Video Folder:"
 msgstr "视频文件夹:"
 
-#: rc_option_editor.cc:927
+#: rc_option_editor.cc:1579
 msgid ""
-"Local path to the video-server document-root. Only files below this directory will "
-"be accessible by the video-server. If the server run on a remote host, it should "
-"point to a network mounted folder of the server's docroot or be left empty if it "
-"is unvailable. It is used for the local video-monitor and file-browsing when "
-"opening/adding a video file."
+"Local path to the video-server document-root. Only files below this "
+"directory will be accessible by the video-server. If the server run on a "
+"remote host, it should point to a network mounted folder of the server's "
+"docroot or be left empty if it is unvailable. It is used for the local video-"
+"monitor and file-browsing when opening/adding a video file."
 msgstr ""
-"视频服务器文档根的本地路径。视频服务器仅访问这个目录下的文件。如果服务器运行在远程"
-"主机上,它将指向服务器文档根的一个网络挂载文件夹,或者如果它不可用就留着空白。这是"
-"用于在打开/添加一个视频文件时的本地视频监控以及文件浏览。"
+"视频服务器文档根的本地路径。视频服务器仅访问这个目录下的文件。如果服务器运行"
+"在远程主机上,它将指向服务器文档根的一个网络挂载文件夹,或者如果它不可用就留"
+"着空白。这是用于在打开/添加一个视频文件时的本地视频监控以及文件浏览。"
 
-#: rc_option_editor.cc:934
+#: rc_option_editor.cc:1584
 msgid ""
-"<b>When enabled</b> an information window with details is displayed before the "
-"video-export dialog."
+"<b>When enabled</b> an information window with details is displayed before "
+"the video-export dialog."
 msgstr "<b>启用时</b> 在视频输出对话框前显示一个细节信息窗口。"
 
-#: rc_option_editor.cc:939
+#: rc_option_editor.cc:1589
 msgid ""
 "<b>When enabled</b> the video server is never launched automatically without "
 "confirmation"
 msgstr "<b>启用时</b> 视频服务器在没有得到确认前不会自动启动。"
 
-#: rc_option_editor.cc:1022
-msgid "Always Display Plugin Scan Progress"
-msgstr "总是显示插件扫描程序"
-
-#: rc_option_editor.cc:1023
-msgid "Scan for [new] VST Plugins on Application Start"
-msgstr "在应用起点扫描 [新] VST 插件"
-
-#: rc_option_editor.cc:1024
-msgid "Scan for AudioUnit Plugins on Application Start"
-msgstr "在应用起点扫描音频单位插件"
-
-#: rc_option_editor.cc:1035
-msgid "General"
-msgstr "通用"
-
-#: rc_option_editor.cc:1041
-msgid "Scan for Plugins"
-msgstr "扫描插件"
-
-#: rc_option_editor.cc:1048
-msgid ""
-"<b>When enabled</b> a popup window showing plugin scan progress is displayed for "
-"indexing (cache load) and discovery (detect new plugins)"
-msgstr ""
-"<b>启用时</b> 一个弹出窗口显示插件扫描程序,以展示索引(缓存载入)和发现(探测新插"
-"件)。"
-
-#: rc_option_editor.cc:1055
-msgid ""
-"Specify the default timeout for plugin instantiation in 1/10 seconds. Plugins that "
-"require more time to load will be blacklisted. A value of 0 disables the timeout."
-msgstr ""
-"插件实例化指定的默认超时在 1/10 以内。需要更多时间载入的插件将被列入黑名单。数值为 "
-"0 则禁用超时。"
-
-#: rc_option_editor.cc:1057
-msgid "Scan Time Out [deciseconds]"
-msgstr "扫描超时 [十分之一秒]"
-
-#: rc_option_editor.cc:1065
-msgid "VST"
-msgstr ""
-
-#: rc_option_editor.cc:1071
-msgid "Clear VST Cache"
-msgstr "清除 VST 缓存"
-
-#: rc_option_editor.cc:1075
-msgid "Clear VST Blacklist"
-msgstr "清除 VST 黑名单"
-
-#: rc_option_editor.cc:1083
-msgid ""
-"<b>When enabled</b> new VST plugins are searched, tested and added to the cache "
-"index on application start. When disabled new plugins will only be available after "
-"triggering a 'Scan' manually"
-msgstr ""
-"<b>启用时</b> 新的 VST 插件被搜索、测试以及添加到应用起点的缓存索引中。当禁用新插件"
-"时,仅在手动触发“扫描”时可用。"
-
-#: rc_option_editor.cc:1086
-msgid "Linux VST Path:"
-msgstr "Linux VST 路径:"
-
-#: rc_option_editor.cc:1093
-msgid "Windows VST Path:"
-msgstr "Windows VST 路径:"
-
-#: rc_option_editor.cc:1102
-msgid "Audio Unit"
-msgstr "音频单位"
+#: rc_option_editor.cc:1598
+msgid "Custom Path to Video Monitor (%1) - leave empty for default:"
+msgstr "定制视频监控(%1)路径——空白则使用默认设置:"
 
-#: rc_option_editor.cc:1111
+#: rc_option_editor.cc:1610
 msgid ""
-"<b>When enabled</b> Audio Unit Plugins are discovered on application start. When "
-"disabled AU plugins will only be available after triggering a 'Scan' manually. The "
-"first successful scan will enable AU auto-scan, Any crash during plugin discovery "
-"will disable it."
-msgstr ""
-"<b>启用时</b> 音频单位插件被应用起点发现。当禁用音频单位插件时,仅在手动触发“扫"
-"描”时可用。第一次成功的扫描将启用音频单位自动扫描,若插件发现任何崩溃的情况都将禁用"
-"自动扫描。"
-
-#: rc_option_editor.cc:1114
-msgid "Clear AU Cache"
-msgstr "清除音频单位缓存"
+"Set a custom path to the Video Monitor Executable, changing this requires a "
+"restart."
+msgstr "设置一个定制的路径以指向可执行的视频监控。更改本项需要重启。"
 
-#: rc_option_editor.cc:1118
-msgid "Clear AU Blacklist"
-msgstr "清除音频单位黑名单"
-
-#: rc_option_editor.cc:1201
-msgid "Set Windows VST Search Path"
-msgstr "设置 Windows VST 搜索路径"
+#: rc_option_editor.cc:1661
+msgid "Set Video Monitor Executable"
+msgstr "设置可执行的视频监控"
 
-#: rc_option_editor.cc:1216
-msgid "Set Linux VST Search Path"
-msgstr "设置 Linux VST 搜索路径"
+#: rc_option_editor.cc:1734
+msgid "Column %1"
+msgstr "列 %1"
 
-#: rc_option_editor.cc:1297
+#: rc_option_editor.cc:1852
 msgid "%1 Preferences"
 msgstr "%1 首选项"
 
-#: rc_option_editor.cc:1309
+#: rc_option_editor.cc:1874
 msgid "DSP CPU Utilization"
-msgstr "DSP 的 CPU 利用率"
+msgstr "DSP(数字信号处理器)CPU使用率"
 
-#: rc_option_editor.cc:1313
+#: rc_option_editor.cc:1878
 msgid "Signal processing uses"
 msgstr "信号处理使用"
 
-#: rc_option_editor.cc:1318
+#: rc_option_editor.cc:1883
 msgid "all but one processor"
 msgstr "除了一个处理器外所有的"
 
-#: rc_option_editor.cc:1319
+#: rc_option_editor.cc:1884
 msgid "all available processors"
 msgstr "所有可用的处理器"
 
-#: rc_option_editor.cc:1322
+#: rc_option_editor.cc:1887
 msgid "%1 processors"
-msgstr "%1 处理器"
+msgstr "%1 处理器"
 
-#: rc_option_editor.cc:1325
+#: rc_option_editor.cc:1890
 msgid "This setting will only take effect when %1 is restarted."
 msgstr "该设置将仅仅在 %1 重新启动时起作用"
 
-#: rc_option_editor.cc:1330
+#: rc_option_editor.cc:1895
 msgid "Options|Undo"
 msgstr "选项|撤销"
 
-#: rc_option_editor.cc:1337
+#: rc_option_editor.cc:1902
 msgid "Verify removal of last capture"
 msgstr "确认移除最后的捕获部分"
 
-#: rc_option_editor.cc:1345
-msgid "Make periodic backups of the session file"
-msgstr "定期备份会话文件"
-
-#: rc_option_editor.cc:1350
+#: rc_option_editor.cc:1907
 msgid "Session Management"
 msgstr "会话管理"
 
-#: rc_option_editor.cc:1355
+#: rc_option_editor.cc:1912
+msgid "Make periodic backups of the session file"
+msgstr "定期备份会话文件"
+
+#: rc_option_editor.cc:1920
 msgid "Always copy imported files"
 msgstr "总是复制导入的文件"
 
-#: rc_option_editor.cc:1362
+#: rc_option_editor.cc:1927
 msgid "Default folder for new sessions:"
-msgstr "新会话的默认文件夹:"
+msgstr "新会话的默认文件夹"
 
-#: rc_option_editor.cc:1370
+#: rc_option_editor.cc:1935
 msgid "Maximum number of recent sessions"
 msgstr "当前会话的最大数量"
 
-#: rc_option_editor.cc:1383
+#: rc_option_editor.cc:1941 rc_option_editor.cc:1943 rc_option_editor.cc:1945
+msgid "Misc/Click"
+msgstr "杂项/识别声"
+
+#: rc_option_editor.cc:1948
 msgid "Click gain level"
 msgstr "点击增益电平"
 
-#: rc_option_editor.cc:1388 route_time_axis.cc:266 route_time_axis.cc:821
+#: rc_option_editor.cc:1953 route_time_axis.cc:277 route_time_axis.cc:831
 msgid "Automation"
 msgstr "自动化"
 
-#: rc_option_editor.cc:1393
+#: rc_option_editor.cc:1958
 msgid "Thinning factor (larger value => less data)"
-msgstr " 稀释参数(较大的数值 => 较少的数据)"
+msgstr "稀释参数(较大的数值 => 较少的数据)"
 
-#: rc_option_editor.cc:1402
+#: rc_option_editor.cc:1967
 msgid "Automation sampling interval (milliseconds)"
 msgstr "自动化样本间隔(毫秒)"
 
-#: rc_option_editor.cc:1414
+#: rc_option_editor.cc:1975
+msgid "Transport Options"
+msgstr "播送选项"
+
+#: rc_option_editor.cc:1981
 msgid "Keep record-enable engaged on stop"
 msgstr "停止时,保持启用的录制仍在启用中"
 
-#: rc_option_editor.cc:1423
+#: rc_option_editor.cc:1990
 msgid "Play loop is a transport mode"
 msgstr "播放循环是一个播送模式"
 
-#: rc_option_editor.cc:1428
+#: rc_option_editor.cc:1995
 msgid ""
-"<b>When enabled</b> the loop button does not start playback but forces playback to "
-"always play the loop\n"
+"<b>When enabled</b> the loop button does not start playback but forces "
+"playback to always play the loop\n"
 "\n"
 "<b>When disabled</b> the loop button starts playing the loop, but stop then "
 "cancels loop playback"
@@ -9242,565 +11074,661 @@ msgstr ""
 "\n"
 "<b>禁用时</b> 循环按钮启动播放循环,但停止也取消循环回放"
 
-#: rc_option_editor.cc:1434
+#: rc_option_editor.cc:2001
 msgid "Stop recording when an xrun occurs"
-msgstr "在x运行出现时停止录制"
+msgstr "在xrun出现时停止录制"
 
-#: rc_option_editor.cc:1439
+#: rc_option_editor.cc:2006
 msgid ""
-"<b>When enabled</b> %1 will stop recording if an over- or underrun is detected by "
-"the audio engine"
+"<b>When enabled</b> %1 will stop recording if an over- or underrun is "
+"detected by the audio engine"
 msgstr "<b>启用时</b> 如果音频引擎检测到一个超载或者欠载运行 %1 将停止录制"
 
-#: rc_option_editor.cc:1445
+#: rc_option_editor.cc:2012
 msgid "Create markers where xruns occur"
 msgstr "在x运行出现时创建标记"
 
-#: rc_option_editor.cc:1454
+#: rc_option_editor.cc:2021
 msgid "Stop at the end of the session"
 msgstr "在会话终点停止"
 
-#: rc_option_editor.cc:1459
+#: rc_option_editor.cc:2026
 msgid ""
-"<b>When enabled</b> if %1 is <b>not recording</b>, it will stop the transport when "
-"it reaches the current session end marker\n"
+"<b>When enabled</b> if %1 is <b>not recording</b>, it will stop the "
+"transport when it reaches the current session end marker\n"
 "\n"
-"<b>When disabled</b> %1 will continue to roll past the session end marker at all "
-"times"
+"<b>When disabled</b> %1 will continue to roll past the session end marker at "
+"all times"
 msgstr ""
-"<b>启用时</b> 如果 %1 是 <b>非录制中</b>,当它达到当前会话的终点标记时它将停止播"
-"送\n"
+"<b>启用时</b> 如果 %1 是 <b>非录制中</b>,当它达到当前会话的终点标记时它将停"
+"止播送\n"
 "\n"
 "<b>禁用时</b> %1 将继续一直滚动运行到会话终点标记"
 
-#: rc_option_editor.cc:1467
+#: rc_option_editor.cc:2034
 msgid "Do seamless looping (not possible when slaved to MTC, LTC etc)"
-msgstr "做无缝循环(当从属于 MTC,LTC 诸如此类时不可能实现)"
+msgstr ""
+"做无缝循环(当从属于 MTC,LTC “MIDI时间码,纵向时间码”诸如此类时不可能实现)"
 
-#: rc_option_editor.cc:1472
+#: rc_option_editor.cc:2039
 msgid ""
-"<b>When enabled</b> this will loop by reading ahead and wrapping around at the "
-"loop point, preventing any need to do a transport locate at the end of the loop\n"
+"<b>When enabled</b> this will loop by reading ahead and wrapping around at "
+"the loop point, preventing any need to do a transport locate at the end of "
+"the loop\n"
 "\n"
-"<b>When disabled</b> looping is done by locating back to the start of the loop "
-"when %1 reaches the end which will often cause a small click or delay"
+"<b>When disabled</b> looping is done by locating back to the start of the "
+"loop when %1 reaches the end which will often cause a small click or delay"
 msgstr ""
-"<b>启用时</b>这将通过预先读取来循环并且在循环点围绕,防止任何需要把播送定位在循环的"
-"终点的情况\n"
+"<b>启用时</b>这将通过预先读取来循环并且在循环点围绕,防止任何需要把播送定位在"
+"循环的终点的情况\n"
 "\n"
-"<b>禁用时</b> 当 %1 到达会经常引起一个轻微识别声或延迟的终点时,通过定位回到循环的"
-"起点而完成循环"
+"<b>禁用时</b> 当 %1 到达会经常引起一个轻微识别声或延迟的终点时,通过定位回到"
+"循环的起点而完成循环"
 
-#: rc_option_editor.cc:1480
+#: rc_option_editor.cc:2047
 msgid "Disable per-track record disarm while rolling"
-msgstr "当滚动时禁用预先音轨录制解除"
+msgstr "当滚动时禁用预先音轨录制解除预备"
 
-#: rc_option_editor.cc:1484
+#: rc_option_editor.cc:2051
 msgid ""
-"<b>When enabled</b> this will prevent you from accidentally stopping specific "
-"tracks recording during a take"
+"<b>When enabled</b> this will prevent you from accidentally stopping "
+"specific tracks recording during a take"
 msgstr "<b>启用时</b> 这将防止您在这过程中意外停止指定的音轨录制"
 
-#: rc_option_editor.cc:1489
+#: rc_option_editor.cc:2056
 msgid "12dB gain reduction during fast-forward and fast-rewind"
 msgstr "快进和倒带时有 12dB 的增益减少"
 
-#: rc_option_editor.cc:1493
+#: rc_option_editor.cc:2060
+msgid ""
+"This will reduce the unpleasant increase in perceived volume that occurs "
+"when fast-forwarding or rewinding through some kinds of audio"
+msgstr ""
+"当快进或倒带通过某些音频类型时,这将减少令人感到不适的可感知音量增加的现像"
+
+#: rc_option_editor.cc:2066
+msgid "Preroll"
+msgstr "预滚"
+
+#: rc_option_editor.cc:2071
 msgid ""
-"This will reduce the unpleasant increase in perceived volume that occurs when fast-"
-"forwarding or rewinding through some kinds of audio"
-msgstr "当快进或倒带通过某些音频类型时,这将减少令人感到不适的可感知音量增加的现像"
+"The amount of preroll (in seconds) to apply when <b>Play with Preroll</b> is "
+"initiated.\n"
+"\n"
+"If <b>Follow Edits</b> is enabled, the preroll is applied to the playhead "
+"position when a region is selected or trimmed."
+msgstr ""
+"当<b>带着预滚播放</b>时,要应用的预滚数量(秒)会被启动。\n"
+"\n"
+"如果<b>随后的编辑</b>被启用,当一个区域被选中或被修剪时,预滚会被应用到指针位"
+"置。"
+
+#: rc_option_editor.cc:2073
+msgid "0 (no pre-roll)"
+msgstr "0(无预滚)"
+
+#: rc_option_editor.cc:2074
+msgid "0.1 second"
+msgstr "0.1 秒"
+
+#: rc_option_editor.cc:2075
+msgid "0.25 second"
+msgstr "0.25 秒"
+
+#: rc_option_editor.cc:2076
+msgid "0.5 second"
+msgstr "0.5 秒"
+
+#: rc_option_editor.cc:2077
+msgid "1.0 second"
+msgstr "1.0 秒"
+
+#: rc_option_editor.cc:2078
+msgid "2.0 seconds"
+msgstr "2.0 秒"
+
+#: rc_option_editor.cc:2081 rc_option_editor.cc:2090 rc_option_editor.cc:2106
+#: rc_option_editor.cc:2127 rc_option_editor.cc:2145 rc_option_editor.cc:2147
+#: rc_option_editor.cc:2164 rc_option_editor.cc:2167 rc_option_editor.cc:2169
+#: rc_option_editor.cc:2197
+msgid "Transport/Sync"
+msgstr "播送/同步"
 
-#: rc_option_editor.cc:1497
-msgid "Sync/Slave"
-msgstr "同步/从属"
+#: rc_option_editor.cc:2081
+msgid "Synchronization and Slave Options"
+msgstr "同步和从属选项"
 
-#: rc_option_editor.cc:1501
+#: rc_option_editor.cc:2085
 msgid "External timecode source"
 msgstr "外部时间码源"
 
-#: rc_option_editor.cc:1510
+#: rc_option_editor.cc:2094
 msgid "Match session video frame rate to external timecode"
 msgstr "匹配会话视频帧率到外部时间码"
 
-#: rc_option_editor.cc:1516
+#: rc_option_editor.cc:2100
 msgid ""
-"This option controls the value of the video frame rate <i>while chasing</i> an "
-"external timecode source.\n"
+"This option controls the value of the video frame rate <i>while chasing</i> "
+"an external timecode source.\n"
 "\n"
-"<b>When enabled</b> the session video frame rate will be changed to match that of "
-"the selected external timecode source.\n"
+"<b>When enabled</b> the session video frame rate will be changed to match "
+"that of the selected external timecode source.\n"
 "\n"
-"<b>When disabled</b> the session video frame rate will not be changed to match "
-"that of the selected external timecode source.Instead the frame rate indication in "
-"the main clock will flash red and %1 will convert between the external timecode "
-"standard and the session standard."
+"<b>When disabled</b> the session video frame rate will not be changed to "
+"match that of the selected external timecode source.Instead the frame rate "
+"indication in the main clock will flash red and %1 will convert between the "
+"external timecode standard and the session standard."
 msgstr ""
 "这个选项控制视频帧率的数值<i>当追随</i>一个外部时间码源时\n"
 "\n"
 "<b>启用时</b> 会话视频帧率将被改变为匹配到已选中的外部时间码源。\n"
 "\n"
-"<b>禁用时</b> 会话视频帧率将不会被改变为匹配到已选中的外部时间码源。取而代之的是,"
-"帧率在主计时器里的指示将在转换外部时间代码标准和会话标准两者间转换。"
+"<b>禁用时</b> 会话视频帧率将不会被改变为匹配到已选中的外部时间码源。取而代之"
+"的是,帧率在主计时器里的指示将在转换外部时间代码标准和会话标准两者间转换。"
 
-#: rc_option_editor.cc:1526
-msgid "Sync lock timecode to clock - Disable drift compensation."
-msgstr "同步时间代码到计时器——禁用漂移补偿。"
+#: rc_option_editor.cc:2110
+msgid "Sync-lock timecode to clock (disable drift compensation)"
+msgstr "同步时间代码到计时器(禁用漂移补偿)"
 
-#: rc_option_editor.cc:1532
+#: rc_option_editor.cc:2116
 msgid ""
-"<b>When enabled</b> %1 will never varispeed when slaved to external timecode. Sync "
-"Lock indicates that the selected external timecode source shares clock-sync (Black "
-"& Burst, Wordclock, etc) with the audio interface. This option disables drift "
-"compensation. The transport speed is fixed at 1.0.Varispeed LTC will be ignored "
-"and cause drift.\n"
+"<b>When enabled</b> %1 will never varispeed when slaved to external "
+"timecode. Sync Lock indicates that the selected external timecode source "
+"shares clock-sync (Black & Burst, Wordclock, etc) with the audio "
+"interface. This option disables drift compensation. The transport speed is "
+"fixed at 1.0. Vari-speed LTC will be ignored and cause drift.\n"
 "\n"
-"<b>When disabled</b> %1 will compensate for potential drift, regardless if the "
-"timecode sources shares clock sync."
+"<b>When disabled</b> %1 will compensate for potential drift, regardless if "
+"the timecode sources shares clock sync."
 msgstr ""
-"<b>启用时</b> 在从属于外部时间码时 %1 将不会变速。同步锁定表明已选中的外部时间码源"
-"与音频界面共享计时器同步( Black & Burst, Wordclock,等等)。这个选项禁用漂移"
-"补偿。播送速度被修正于 1.0.Varispeed LTC 将被忽略且引起漂移。\n"
+"<b>启用时</b> 在从属于外部时间码时 %1 将不会变速。同步锁定表明已选中的外部时"
+"间码源与音频界面共享计时器同步( Black & Burst, Wordclock,等等)。这个"
+"选项禁用漂移补偿。播送速度被修正于 1.0。 Varispeed LTC (纵向时间码)将被忽略"
+"且引起漂移。\n"
 "\n"
 "<b>禁用时</b> %1 将补偿潜在的漂移,不论时间码源是否共享时间同步。"
 
-#: rc_option_editor.cc:1547
+#: rc_option_editor.cc:2131
 msgid "Lock to 29.9700 fps instead of 30000/1001"
 msgstr "锁定到 29.9700 fps 以替代 30000/1001"
 
-#: rc_option_editor.cc:1553
+#: rc_option_editor.cc:2137
 msgid ""
 "<b>When enabled</b> the external timecode source is assumed to use 29.97 fps "
 "instead of 30000/1001.\n"
-"SMPTE 12M-1999 specifies 29.97df as 30000/1001. The spec further mentions that "
-"drop-frame timecode has an accumulated error of -86ms over a 24-hour period.\n"
-"Drop-frame timecode would compensate exactly for a NTSC color frame rate of 30 * "
-"0.9990 (ie 29.970000). That is not the actual rate. However, some vendors use that "
-"rate - despite it being against the specs - because the variant of using exactly "
-"29.97 fps has zero timecode drift.\n"
+"SMPTE 12M-1999 specifies 29.97df as 30000/1001. The spec further mentions "
+"that drop-frame timecode has an accumulated error of -86ms over a 24-hour "
+"period.\n"
+"Drop-frame timecode would compensate exactly for a NTSC color frame rate of "
+"30 * 0.9990 (ie 29.970000). That is not the actual rate. However, some "
+"vendors use that rate - despite it being against the specs - because the "
+"variant of using exactly 29.97 fps has zero timecode drift.\n"
 msgstr ""
 "<b>启用时</b> 外部时间码源被假定使用 29.97 fps 以替代 30000/1001 。\n"
-"SMPTE 12M-1999 指定 29.97df 为 30000/1001 。进一步的规范提到丢帧时间码有一个在 24 "
-"小时内 -86ms 的累积错误。\n"
-"丢帧时间码将完全补偿 30 * 0.9990 (ie 29.970000)的 NTSC 色彩帧率。那不是实际帧率。"
-"然而,某些厂商使用这帧率——尽管它违背规范——因为使用实际 29.97 fps 的时间码漂移变化"
-"为 0 。\n"
+"SMPTE 12M-1999 指定 29.97df 为 30000/1001 。进一步的规范提到丢帧时间码有一个"
+"在 24 小时内 -86ms 的累积错误。\n"
+"丢帧时间码将完全补偿 30 * 0.9990 (ie 29.970000)的 NTSC 色彩帧率。那不是实际"
+"帧率。然而,某些厂商使用这帧率——尽管它违背规范——因为使用实际 29.97 fps 的时间"
+"码漂移变化为 0 。\n"
 
-#: rc_option_editor.cc:1563
+#: rc_option_editor.cc:2147
 msgid "LTC Reader"
-msgstr "LTC 阅读器"
+msgstr "LTC(纵向时间码)阅读器"
 
-#: rc_option_editor.cc:1567
+#: rc_option_editor.cc:2151
 msgid "LTC incoming port"
-msgstr "LTC 导入端口"
+msgstr "LTC(纵向时间码)导入端口"
 
-#: rc_option_editor.cc:1582
+#: rc_option_editor.cc:2167
 msgid "LTC Generator"
-msgstr "LTC 生成器"
+msgstr "LTC(纵向时间码)生成器"
 
-#: rc_option_editor.cc:1587
+#: rc_option_editor.cc:2172
 msgid "Enable LTC generator"
-msgstr "启用 LTC 生成器"
+msgstr "启用 LTC(纵向时间码)生成器"
 
-#: rc_option_editor.cc:1594
+#: rc_option_editor.cc:2179
 msgid "Send LTC while stopped"
-msgstr "停止时发送 LTC "
+msgstr "停止时发送 LTC(纵向时间码)"
 
-#: rc_option_editor.cc:1600
+#: rc_option_editor.cc:2185
 msgid ""
 "<b>When enabled</b> %1 will continue to send LTC information even when the "
 "transport (playhead) is not moving"
-msgstr "<b>启用时</b> %1 将继续发送 LTC 信息,即使当播送(指针)不再移动"
+msgstr ""
+"<b>启用时</b> %1 将继续发送 LTC(纵向时间码)信息,即使当播送(指针)不再移动"
 
-#: rc_option_editor.cc:1606
+#: rc_option_editor.cc:2191
 msgid "LTC generator level"
-msgstr "LTC 生成器电平"
+msgstr "LTC(纵向时间码)生成器电平"
 
-#: rc_option_editor.cc:1610
+#: rc_option_editor.cc:2195
 msgid ""
-"Specify the Peak Volume of the generated LTC signal in dbFS. A good value is  0dBu "
-"^= -18dbFS in an EBU calibrated system"
+"Specify the Peak Volume of the generated LTC signal in dBFS. A good value "
+"is  0dBu ^= -18dBFS in an EBU calibrated system"
 msgstr ""
-"以 dbFS 指定生成 LTC 信号音量的峰值。建议的数值是 0dBu ^= -18dbFS 在一个 EBU 校准系"
-"统里"
+"以 dBFS 指定生成的 LTC(纵向时间码)信号峰值音量。在一个 EBU 校正过的系统里较"
+"好的数值是 0dBu ^= -18dBFS"
 
-#: rc_option_editor.cc:1622
-msgid "Allow dragging of playhead"
-msgstr "允许拖拽指针"
+#: rc_option_editor.cc:2204
+msgid "Make rubberband selection rectangle snap to the grid"
+msgstr "使橡皮带已选择部分矩形吸附到网格"
 
-#: rc_option_editor.cc:1630
-msgid "Move relevant automation when audio regions are moved"
-msgstr "当音频区域移动时,也移动相关的自动化"
+#: rc_option_editor.cc:2211
+msgid "Name new markers"
+msgstr "命名新标签"
 
-#: rc_option_editor.cc:1638
-msgid "Show meters on tracks in the editor"
-msgstr "在编辑器的音轨上显示节拍"
+#: rc_option_editor.cc:2216
+msgid ""
+"If enabled, popup a dialog when a new marker is created to allow its name to "
+"be set as it is created.\n"
+"\n"
+"You can always rename markers by right-clicking on them"
+msgstr ""
+"如果启用,当创建一个新标记时会弹出一个对话框,允许为创建它而设置它的名称。\n"
+"\n"
+"您总是可以通过右键单击它们来重命名标志"
 
-#: rc_option_editor.cc:1646
+#: rc_option_editor.cc:2222
+msgid "Allow dragging of playhead"
+msgstr "允许拖拽指针"
+
+#: rc_option_editor.cc:2230
 msgid "Display master-meter in the toolbar"
 msgstr "在工具栏里显示主控节拍"
 
-#: rc_option_editor.cc:1653
+#: rc_option_editor.cc:2239
+msgid "Show zoom toolbar (if torn off)"
+msgstr "显示缩放工具栏(如果撕裂)"
+
+#: rc_option_editor.cc:2247
+msgid ""
+"Always use mouse cursor position as zoom focus when zooming using mouse "
+"scroll wheel"
+msgstr "当缩放使用鼠标滚轮时,始终使用鼠标指针位置作为缩放焦点"
+
+#: rc_option_editor.cc:2256
+msgid "Update editor window during drags of the summary"
+msgstr "当拖拽摘要时,更新编辑器窗口"
+
+#: rc_option_editor.cc:2264
+msgid "Auto-scroll editor window when dragging near its edges"
+msgstr "当拖动边缘附近时,自动滚动编辑器窗口"
+
+#: rc_option_editor.cc:2272
+msgid "Show gain envelopes in audio regions"
+msgstr "在音频区域内显示增益封装"
+
+#: rc_option_editor.cc:2273
+msgid "in all modes"
+msgstr "在所有模式内"
+
+#: rc_option_editor.cc:2274
+msgid "only in Draw and Internal Edit modes"
+msgstr "仅在描绘和内部编辑模式内"
+
+#: rc_option_editor.cc:2279
+msgid "Editor Behavior"
+msgstr "编辑器行为"
+
+#: rc_option_editor.cc:2284
+msgid "Move relevant automation when audio regions are moved"
+msgstr "当音频区域移动时,也移动相关的自动化"
+
+#: rc_option_editor.cc:2291
 msgid "Default fade shape"
 msgstr "默认淡化形状"
 
-#: rc_option_editor.cc:1672
+#: rc_option_editor.cc:2310
 msgid "Regions in active edit groups are edited together"
 msgstr "区域位于激活编辑的分组里会被彼此编辑"
 
-#: rc_option_editor.cc:1673
+#: rc_option_editor.cc:2311
 msgid "whenever they overlap in time"
 msgstr "不论何时都及时重叠它们"
 
-#: rc_option_editor.cc:1674
+#: rc_option_editor.cc:2312
 msgid "only if they have identical length, position and origin"
 msgstr "仅在当它们拥有完全相同的长度、位置和原点时"
 
-#: rc_option_editor.cc:1684
-msgid "Make rubberband selection rectangle snap to the grid"
-msgstr "使橡皮带已选择部分矩形吸附到网格对齐"
+#: rc_option_editor.cc:2321
+msgid "Layering model"
+msgstr "分层模型"
 
-#: rc_option_editor.cc:1692
-msgid "Show waveforms in regions"
-msgstr "在区域内显示波形"
+#: rc_option_editor.cc:2326
+msgid "later is higher"
+msgstr "后来的更高"
 
-#: rc_option_editor.cc:1700
-msgid "Show gain envelopes in audio regions"
-msgstr "在音频区域内显示增益封装"
+#: rc_option_editor.cc:2327
+msgid "manual layering"
+msgstr "手动分层"
 
-#: rc_option_editor.cc:1701
-msgid "in all modes"
-msgstr "在所有模式内"
+#: rc_option_editor.cc:2332
+msgid "After splitting selected regions, select"
+msgstr "在拆分已选中区域之后,选择"
+
+#: rc_option_editor.cc:2337
+msgid "no regions"
+msgstr "无区域"
+
+#: rc_option_editor.cc:2340
+msgid "newly-created regions"
+msgstr "新创建的区域"
+
+#: rc_option_editor.cc:2344
+msgid "existing selection and newly-created regions"
+msgstr "已存在的已选择部分和新创建的区域"
+
+#: rc_option_editor.cc:2348 rc_option_editor.cc:2351 rc_option_editor.cc:2360
+#: rc_option_editor.cc:2378 rc_option_editor.cc:2390 rc_option_editor.cc:2392
+msgid "Editor/Waveforms"
+msgstr "编辑器/波形"
+
+#: rc_option_editor.cc:2348
+msgid "Waveforms"
+msgstr "波形"
+
+#: rc_option_editor.cc:2354
+msgid "Show waveforms in regions"
+msgstr "在区域内显示波形"
 
-#: rc_option_editor.cc:1702
-msgid "only in region gain mode"
-msgstr "仅在区域增益模式内"
+#: rc_option_editor.cc:2363
+msgid "Show waveforms for audio while it is being recorded"
+msgstr "在音频区域内显示增益封装"
 
-#: rc_option_editor.cc:1709
+#: rc_option_editor.cc:2370
 msgid "Waveform scale"
 msgstr "波形比例"
 
-#: rc_option_editor.cc:1714
+#: rc_option_editor.cc:2375
 msgid "linear"
 msgstr "线性"
 
-#: rc_option_editor.cc:1715
+#: rc_option_editor.cc:2376
 msgid "logarithmic"
 msgstr "对数"
 
-#: rc_option_editor.cc:1721
+#: rc_option_editor.cc:2382
 msgid "Waveform shape"
 msgstr "波形形状"
 
-#: rc_option_editor.cc:1726
+#: rc_option_editor.cc:2387
 msgid "traditional"
 msgstr "传统的"
 
-#: rc_option_editor.cc:1727
+#: rc_option_editor.cc:2388
 msgid "rectified"
 msgstr "已矫正的"
 
-#: rc_option_editor.cc:1736
-msgid "Show waveforms for audio while it is being recorded"
-msgstr "在音频被录制时显示它的波形"
-
-#: rc_option_editor.cc:1744
-msgid "Show zoom toolbar"
-msgstr "显示缩放工具栏"
-
-#: rc_option_editor.cc:1752
-msgid "Update editor window during drags of the summary"
-msgstr "当拖拽摘要时,更新编辑器窗口"
-
-#: rc_option_editor.cc:1760
-msgid "Synchronise editor and mixer selection"
-msgstr "同步编辑器和混音器已选中部分"
-
-#: rc_option_editor.cc:1767
-msgid "Name new markers"
-msgstr "命名新标签"
-
-#: rc_option_editor.cc:1773
-msgid ""
-"If enabled, popup a dialog when a new marker is created to allow its name to be "
-"set as it is created.\n"
-"\n"
-"You can always rename markers by right-clicking on them"
-msgstr ""
-"如果启用,当创建一个新标记时会弹出一个对话框,允许为创建它而设置它的名称。\n"
-"\n"
-"您总是可以通过右键单击它们来重命名标志"
-
-#: rc_option_editor.cc:1779
-msgid "Auto-scroll editor window when dragging near its edges"
-msgstr "当拖动边缘附近时,自动滚动编辑器窗口"
-
-#: rc_option_editor.cc:1786
-msgid "After splitting selected regions, select"
-msgstr "在拆分已选中区域之后,选择"
-
-#: rc_option_editor.cc:1791
-msgid "no regions"
-msgstr "无区域"
-
-#: rc_option_editor.cc:1794
-msgid "newly-created regions"
-msgstr "新创建的区域"
-
-#: rc_option_editor.cc:1798
-msgid "existing selection and newly-created regions"
-msgstr "已存在的已选中部分和新创建的区域"
-
-#: rc_option_editor.cc:1805
+#: rc_option_editor.cc:2397
 msgid "Buffering"
 msgstr "缓冲中"
 
-#: rc_option_editor.cc:1813
+#: rc_option_editor.cc:2405
 msgid "Record monitoring handled by"
 msgstr "录制监控的处理是通过"
 
-#: rc_option_editor.cc:1819
+#: rc_option_editor.cc:2411
 msgid "via Audio Driver"
 msgstr "via 音频驱动"
 
-#: rc_option_editor.cc:1825
+#: rc_option_editor.cc:2417
 msgid "audio hardware"
 msgstr "音频硬件"
 
-#: rc_option_editor.cc:1832
+#: rc_option_editor.cc:2424
 msgid "Tape machine mode"
 msgstr "磁带机器模式"
 
-#: rc_option_editor.cc:1837
+#: rc_option_editor.cc:2429
 msgid "Connection of tracks and busses"
 msgstr "音轨和总线的连接"
 
-#: rc_option_editor.cc:1842
+#: rc_option_editor.cc:2435
 msgid "Auto-connect master/monitor busses"
 msgstr "自动连接主控/监控总线"
 
-#: rc_option_editor.cc:1849
+#: rc_option_editor.cc:2442
 msgid "Connect track inputs"
 msgstr "连接音轨输入"
 
-#: rc_option_editor.cc:1854
+#: rc_option_editor.cc:2447
 msgid "automatically to physical inputs"
 msgstr "自动化物理输入"
 
-#: rc_option_editor.cc:1855 rc_option_editor.cc:1868
+#: rc_option_editor.cc:2448 rc_option_editor.cc:2461
 msgid "manually"
 msgstr "手动"
 
-#: rc_option_editor.cc:1861
+#: rc_option_editor.cc:2454
 msgid "Connect track and bus outputs"
 msgstr "连接音轨和总线输出"
 
-#: rc_option_editor.cc:1866
+#: rc_option_editor.cc:2459
 msgid "automatically to physical outputs"
 msgstr "自动化物理输出"
 
-#: rc_option_editor.cc:1867
+#: rc_option_editor.cc:2460
 msgid "automatically to master bus"
 msgstr "自动化主控总线"
 
-#: rc_option_editor.cc:1872
+#: rc_option_editor.cc:2467
+msgid "Use 'Strict-I/O' for new tracks or Busses"
+msgstr "为新的轨道或总线使用“精确输入/输出”"
+
+#: rc_option_editor.cc:2478
 msgid "Denormals"
 msgstr "异常"
 
-#: rc_option_editor.cc:1877
+#: rc_option_editor.cc:2483
 msgid "Use DC bias to protect against denormals"
-msgstr "使用直流偏压针对异常防护"
+msgstr "使用 DC bias(直流偏压)针对异常防护"
 
-#: rc_option_editor.cc:1884
+#: rc_option_editor.cc:2490
 msgid "Processor handling"
 msgstr "处理器处理"
 
-#: rc_option_editor.cc:1890
+#: rc_option_editor.cc:2496
 msgid "no processor handling"
 msgstr "无处理器处理"
 
-#: rc_option_editor.cc:1896
+#: rc_option_editor.cc:2502
 msgid "use FlushToZero"
 msgstr "使用齐平为零"
 
-#: rc_option_editor.cc:1903
+#: rc_option_editor.cc:2509
 msgid "use DenormalsAreZero"
 msgstr "使用异常齐平为零"
 
-#: rc_option_editor.cc:1910
+#: rc_option_editor.cc:2516
 msgid "use FlushToZero and DenormalsAreZero"
 msgstr "使用齐平为零和异常齐平为零"
 
-#: rc_option_editor.cc:1926
-msgid "Silence plugins when the transport is stopped"
-msgstr "当播送停止时插件也无声"
-
-#: rc_option_editor.cc:1934
-msgid "Make new plugins active"
-msgstr "启用新插件"
-
-#: rc_option_editor.cc:1944
+#: rc_option_editor.cc:2532
 msgid "Enable automatic analysis of audio"
 msgstr "启用音频自动分析"
 
-#: rc_option_editor.cc:1952
+#: rc_option_editor.cc:2540
 msgid "Replicate missing region channels"
 msgstr "复制缺失的区域声道"
 
-#: rc_option_editor.cc:1959 rc_option_editor.cc:1961 rc_option_editor.cc:1976
-#: rc_option_editor.cc:1988 rc_option_editor.cc:2000 rc_option_editor.cc:2012
-#: rc_option_editor.cc:2016 rc_option_editor.cc:2024 rc_option_editor.cc:2032
-#: rc_option_editor.cc:2040 rc_option_editor.cc:2042 rc_option_editor.cc:2050
-#: rc_option_editor.cc:2058 rc_option_editor.cc:2066 rc_option_editor.cc:2074
-#: rc_option_editor.cc:2076
-msgid "Solo / mute"
-msgstr "独奏 / 静音"
-
-#: rc_option_editor.cc:1964
-msgid "Solo-in-place mute cut (dB)"
-msgstr "适当的独奏削减静音(dB)"
+#: rc_option_editor.cc:2547 rc_option_editor.cc:2556 rc_option_editor.cc:2558
+#: rc_option_editor.cc:2566 rc_option_editor.cc:2574 rc_option_editor.cc:2582
+#: rc_option_editor.cc:2600 rc_option_editor.cc:2612 rc_option_editor.cc:2624
+#: rc_option_editor.cc:2626 rc_option_editor.cc:2628 rc_option_editor.cc:2636
+#: rc_option_editor.cc:2644 rc_option_editor.cc:2652 rc_option_editor.cc:2662
+#: rc_option_editor.cc:2663
+msgid "Solo & mute"
+msgstr "独奏和静音"
 
-#: rc_option_editor.cc:1971
+#: rc_option_editor.cc:2551
 msgid "Solo controls are Listen controls"
 msgstr "单独控制即是试听控制"
 
-#: rc_option_editor.cc:1980
+#: rc_option_editor.cc:2561
+msgid "Exclusive solo"
+msgstr "专属独奏"
+
+#: rc_option_editor.cc:2569
+msgid "Show solo muting"
+msgstr "显示独奏静音"
+
+#: rc_option_editor.cc:2577
+msgid "Soloing overrides muting"
+msgstr "独奏覆盖静音"
+
+#: rc_option_editor.cc:2585
+msgid "Solo-in-place mute cut (dB)"
+msgstr "适当的独奏削减静音(dB)"
+
+#: rc_option_editor.cc:2592
 msgid "Listen Position"
 msgstr "试听位置"
 
-#: rc_option_editor.cc:1985
+#: rc_option_editor.cc:2597
 msgid "after-fader (AFL)"
-msgstr "后置淡化(AFL)"
+msgstr "后置于淡化器(AFL 后置于淡化器试听)"
 
-#: rc_option_editor.cc:1986
+#: rc_option_editor.cc:2598
 msgid "pre-fader (PFL)"
-msgstr "前置淡化(PFL)"
+msgstr "前置于淡化器(PFL 前置于淡化器试听)"
 
-#: rc_option_editor.cc:1992
+#: rc_option_editor.cc:2604
 msgid "PFL signals come from"
-msgstr "前置淡化信号来自"
+msgstr "PFL(前置于淡化器试听)信号来自"
 
-#: rc_option_editor.cc:1997
+#: rc_option_editor.cc:2609
 msgid "before pre-fader processors"
-msgstr "在前置淡化处理器之前"
+msgstr "在前置于淡化器处理器之前"
 
-#: rc_option_editor.cc:1998
+#: rc_option_editor.cc:2610
 msgid "pre-fader but after pre-fader processors"
-msgstr "前置淡化但在前置淡化处理器之后"
+msgstr "前置于淡化器但在前置于淡化器处理器之后"
 
-#: rc_option_editor.cc:2004
+#: rc_option_editor.cc:2616
 msgid "AFL signals come from"
-msgstr "后置淡化信号来自于"
+msgstr "AFL(后置于淡化器试听)信号来自于"
 
-#: rc_option_editor.cc:2009
+#: rc_option_editor.cc:2621
 msgid "immediately post-fader"
-msgstr "立即后置淡化"
+msgstr "立即后置于淡化器"
 
-#: rc_option_editor.cc:2010
+#: rc_option_editor.cc:2622
 msgid "after post-fader processors (before pan)"
-msgstr "后置淡化处理器之后(平移之前)"
-
-#: rc_option_editor.cc:2019
-msgid "Exclusive solo"
-msgstr "专属独奏"
-
-#: rc_option_editor.cc:2027
-msgid "Show solo muting"
-msgstr "显示独奏静音"
+msgstr "后置于淡化器处理器之后(声相之前)"
 
-#: rc_option_editor.cc:2035
-msgid "Soloing overrides muting"
-msgstr "独奏覆盖静音"
-
-#: rc_option_editor.cc:2040
+#: rc_option_editor.cc:2626
 msgid "Default track / bus muting options"
 msgstr "默认音轨 / 总线静音选项"
 
-#: rc_option_editor.cc:2045
+#: rc_option_editor.cc:2631
 msgid "Mute affects pre-fader sends"
-msgstr "静音效果前置淡化发送"
+msgstr "静音效果前置于淡化器发送端"
 
-#: rc_option_editor.cc:2053
+#: rc_option_editor.cc:2639
 msgid "Mute affects post-fader sends"
-msgstr "静音效果后置淡化发送"
+msgstr "静音效果后置于淡化器发送端"
 
-#: rc_option_editor.cc:2061
+#: rc_option_editor.cc:2647
 msgid "Mute affects control outputs"
 msgstr "静音效果控制输出"
 
-#: rc_option_editor.cc:2069
+#: rc_option_editor.cc:2655
 msgid "Mute affects main outputs"
 msgstr "静音效果主要输出"
 
-#: rc_option_editor.cc:2074
+#: rc_option_editor.cc:2662
 msgid "Send Routing"
-msgstr "发送路由"
+msgstr "发送端路由"
 
-#: rc_option_editor.cc:2079
+#: rc_option_editor.cc:2666
 msgid "Link panners of Aux and External Sends with main panner by default"
-msgstr "链接辅助和外部发送面板和默认的主要面板"
+msgstr "链接带有默认主要声相器辅助和外部发送端的声相器"
 
-#: rc_option_editor.cc:2087
+#: rc_option_editor.cc:2672
+msgid "MIDI Preferences"
+msgstr "MIDI 首选项"
+
+#: rc_option_editor.cc:2677
 msgid "MIDI read-ahead time (seconds)"
 msgstr "MIDI 预先读取时间(秒)"
 
-#: rc_option_editor.cc:2105
+#: rc_option_editor.cc:2687
+msgid "Initial program change"
+msgstr "初始程序改变"
+
+#: rc_option_editor.cc:2696
+msgid "Display first MIDI bank/program as 0"
+msgstr "显示第一个 MIDI 库/程序为 0"
+
+#: rc_option_editor.cc:2704
+msgid "Never display periodic MIDI messages (MTC, MIDI Clock)"
+msgstr "不再显示定期 MIDI 信息(MTC MIDI时间码, MIDI 计时器)"
+
+#: rc_option_editor.cc:2712
+msgid "Sound MIDI notes as they are selected in the editor"
+msgstr "不再显示定期 MIDI 信息(MTC “音乐设备数字接口时间码”, MIDI 计时器)"
+
+#: rc_option_editor.cc:2720
+msgid "Send MIDI control feedback"
+msgstr "发送端 MIDI 控制反馈"
+
+#: rc_option_editor.cc:2725 rc_option_editor.cc:2727 rc_option_editor.cc:2735
+#: rc_option_editor.cc:2737 rc_option_editor.cc:2745 rc_option_editor.cc:2754
+#: rc_option_editor.cc:2756 rc_option_editor.cc:2764 rc_option_editor.cc:2772
+#: rc_option_editor.cc:2781
+msgid "MIDI/Sync"
+msgstr "MIDI/同步"
+
+#: rc_option_editor.cc:2725
+msgid "MIDI Clock"
+msgstr "MIDI 计时器"
+
+#: rc_option_editor.cc:2735
+msgid "MIDI Time Code (MTC)"
+msgstr "MIDI 时间码(MTC)"
+
+#: rc_option_editor.cc:2740
 msgid "Send MIDI Time Code"
-msgstr "发送 MIDI 时间码"
+msgstr "发送端 MIDI 时间码"
 
-#: rc_option_editor.cc:2113
+#: rc_option_editor.cc:2748
 msgid "Percentage either side of normal transport speed to transmit MTC"
-msgstr "正常播送速度与传输 MTC 之间的百分比"
+msgstr "正常播送速度与传输 MTC(MIDI 时间码)之间的百分比"
+
+#: rc_option_editor.cc:2754
+msgid "Midi Machine Control (MMC)"
+msgstr "Midi 机器控制(MMC)"
 
-#: rc_option_editor.cc:2122
+#: rc_option_editor.cc:2759
 msgid "Obey MIDI Machine Control commands"
 msgstr "遵守 MIDI 机器控制命令"
 
-#: rc_option_editor.cc:2130
+#: rc_option_editor.cc:2767
 msgid "Send MIDI Machine Control commands"
-msgstr "发送 MIDI 机器控制命令"
+msgstr "发送端 MIDI 机器控制命令"
 
-#: rc_option_editor.cc:2138
-msgid "Send MIDI control feedback"
-msgstr "发送 MIDI 控制反馈"
-
-#: rc_option_editor.cc:2146
+#: rc_option_editor.cc:2775
 msgid "Inbound MMC device ID"
-msgstr "进场的 MMC 设备 ID"
+msgstr "进场的 MMC(Midi 机器控制)设备 ID"
 
-#: rc_option_editor.cc:2155
+#: rc_option_editor.cc:2784
 msgid "Outbound MMC device ID"
-msgstr "出场的 MMC 设备 ID"
-
-#: rc_option_editor.cc:2164
-msgid "Initial program change"
-msgstr "初始程序改变"
-
-#: rc_option_editor.cc:2173
-msgid "Display first MIDI bank/program as 0"
-msgstr "显示第一个 MIDI 库/程序为 0"
+msgstr "出场的 MMC(Midi 机器控制)设备 ID"
 
-#: rc_option_editor.cc:2181
-msgid "Never display periodic MIDI messages (MTC, MIDI Clock)"
-msgstr "不再显示定期 MIDI 信息(MTC, MIDI 计时器)"
-
-#: rc_option_editor.cc:2189
-msgid "Sound MIDI notes as they are selected"
-msgstr "当 MIDI 音符被选中时发出声音"
-
-#: rc_option_editor.cc:2194
+#: rc_option_editor.cc:2790
 msgid "Midi Audition"
 msgstr "Midi 监听"
 
-#: rc_option_editor.cc:2198
+#: rc_option_editor.cc:2794
 msgid "Midi Audition Synth (LV2)"
 msgstr "Midi 监听合成(LV2)"
 
-#: rc_option_editor.cc:2229 rc_option_editor.cc:2239 rc_option_editor.cc:2241
+#: rc_option_editor.cc:2825 rc_option_editor.cc:2835 rc_option_editor.cc:2837
 msgid "User interaction"
 msgstr "用户交互"
 
-#: rc_option_editor.cc:2232
+#: rc_option_editor.cc:2828
 msgid ""
 "Use translations of %1 messages\n"
 "   <i>(requires a restart of %1 to take effect)</i>\n"
@@ -9810,245 +11738,491 @@ msgstr ""
 "    <i>(要求重启 %1 以生效)</i>\n"
 "     <i>(如果您的语言首选项可用)</i>"
 
-#: rc_option_editor.cc:2239
+#: rc_option_editor.cc:2835
 msgid "Keyboard"
 msgstr "键盘"
 
-#: rc_option_editor.cc:2249
-msgid "Control surface remote ID"
-msgstr "控制面远程 ID"
+#: rc_option_editor.cc:2848 rc_option_editor.cc:2890 rc_option_editor.cc:2960
+#: startup.cc:352
+msgid "Scan for Plugins"
+msgstr "扫描插件"
+
+#: rc_option_editor.cc:2853
+msgid "General"
+msgstr "通用"
+
+#: rc_option_editor.cc:2858
+msgid "Always Display Plugin Scan Progress"
+msgstr "总是显示插件扫描程序"
+
+#: rc_option_editor.cc:2864
+msgid ""
+"<b>When enabled</b> a popup window showing plugin scan progress is displayed "
+"for indexing (cache load) and discovery (detect new plugins)"
+msgstr ""
+"<b>启用时</b> 一个弹出窗口显示插件扫描程序,以展示索引(缓存载入)和发现(探"
+"测新插件)。"
+
+#: rc_option_editor.cc:2869
+msgid "Silence plugins when the transport is stopped"
+msgstr "当播送停止时插件也无声"
+
+#: rc_option_editor.cc:2875
+msgid ""
+"<b>When enabled</b> plugins will be reset at transport stop. When disabled "
+"plugins will be left unchanged at transport stop.\n"
+"\n"
+"This mostly affects plugins with a \"tail\" like Reverbs."
+msgstr ""
+"<b>当启用时</b> 在播送停止时,插件将被重置。 在播送停止时,被禁用的插件时将保"
+"持不变。\n"
+"\n"
+"这主要会影响到带有一个“小尾巴”的插件,诸如混响器。"
+
+#: rc_option_editor.cc:2879
+msgid "Make new plugins active"
+msgstr "启用新插件"
+
+#: rc_option_editor.cc:2885
+msgid ""
+"<b>When enabled</b> plugins will be activated when they are added to tracks/"
+"busses. When disabled plugins will be left inactive when they are added to "
+"tracks/busses"
+msgstr ""
+"<b>当启用时</b> 当插件被添加到音轨/总线时,插件将被激活。当禁用插件时,添加到"
+"音轨/总线的插件将保持非活动状态。"
+
+#: rc_option_editor.cc:2888 rc_option_editor.cc:2889 rc_option_editor.cc:2899
+#: rc_option_editor.cc:2911 rc_option_editor.cc:2916 rc_option_editor.cc:2918
+#: rc_option_editor.cc:2923 rc_option_editor.cc:2930 rc_option_editor.cc:2935
+#: rc_option_editor.cc:2944
+msgid "Plugins/VST"
+msgstr "插件/VST"
+
+#: rc_option_editor.cc:2888
+msgid "VST"
+msgstr ""
+
+#: rc_option_editor.cc:2895
+msgid "Scan for [new] VST Plugins on Application Start"
+msgstr "在应用起点扫描 [新] VST 插件"
+
+#: rc_option_editor.cc:2901
+msgid ""
+"<b>When enabled</b> new VST plugins are searched, tested and added to the "
+"cache index on application start. When disabled new plugins will only be "
+"available after triggering a 'Scan' manually"
+msgstr ""
+"<b>启用时</b> 新的 VST 插件被搜索、测试以及添加到应用起点的缓存索引中。当禁用"
+"新插件时,仅在手动触发“扫描”时可用。"
+
+#: rc_option_editor.cc:2907
+msgid "Verbose Plugin Scan"
+msgstr "冗长的插件扫描"
+
+#: rc_option_editor.cc:2913
+msgid ""
+"<b>When enabled</b> additional information for every plugin is added to the "
+"Log Window."
+msgstr "<b>启用时</b>每个插件额外的信息会被添加到日志窗口。"
+
+#: rc_option_editor.cc:2921
+msgid "VST Cache:"
+msgstr "VST 缓存:"
+
+#: rc_option_editor.cc:2926
+msgid "VST Blacklist:"
+msgstr "VST 黑名单:"
+
+#: rc_option_editor.cc:2933
+msgid "Linux VST Path:"
+msgstr "Linux VST 路径:"
+
+#: rc_option_editor.cc:2938 rc_option_editor.cc:2951
+msgid "Path:"
+msgstr "路径:"
+
+#: rc_option_editor.cc:2947
+msgid "Windows VST Path:"
+msgstr "Windows VST 路径:"
+
+#: rc_option_editor.cc:2958 rc_option_editor.cc:2959 rc_option_editor.cc:2973
+#: rc_option_editor.cc:2978
+msgid "Plugins/Audio Unit"
+msgstr "插件/音频单元"
+
+#: rc_option_editor.cc:2958
+msgid "Audio Unit"
+msgstr "音频单元"
+
+#: rc_option_editor.cc:2965
+msgid "Scan for AudioUnit Plugins on Application Start"
+msgstr "在应用起点扫描音频单位插件"
+
+#: rc_option_editor.cc:2971
+msgid ""
+"<b>When enabled</b> Audio Unit Plugins are discovered on application start. "
+"When disabled AU plugins will only be available after triggering a 'Scan' "
+"manually. The first successful scan will enable AU auto-scan, Any crash "
+"during plugin discovery will disable it."
+msgstr ""
+"<b>启用时</b> 音频单位插件被应用起点发现。当禁用音频单位插件时,仅在手动触"
+"发“扫描”时可用。第一次成功的扫描将启用音频单位自动扫描,若插件发现任何崩溃的"
+"情况都将禁用自动扫描。"
+
+#: rc_option_editor.cc:2976
+msgid "AU Cache:"
+msgstr "AU 缓存:"
+
+#: rc_option_editor.cc:2981
+msgid "AU Blacklist:"
+msgstr "AU 黑名单:"
+
+#: rc_option_editor.cc:2985
+msgid "Plugin GUI"
+msgstr "插件用户图形界面"
+
+#: rc_option_editor.cc:2989
+msgid "Automatically open the plugin GUI when adding a new plugin"
+msgstr "添加新的插件时自动打开插件用户图形界面"
+
+#: rc_option_editor.cc:2998
+msgid "Show Plugin Inline Display on Mixerstrip by default"
+msgstr "在混音器工具栏上默认显示插件内联显示"
+
+#: rc_option_editor.cc:3005
+msgid ""
+"Don't automatically open the plugin GUI when the plugin has an inline "
+"display mode"
+msgstr "当插件有一个内联显示模式时,不要自动打开插件 GUI(图形用户界面)"
+
+#: rc_option_editor.cc:3012
+msgid "Instrument"
+msgstr "乐器"
 
-#: rc_option_editor.cc:2254
-msgid "assigned by user"
-msgstr "由用户指定"
+#: rc_option_editor.cc:3016
+msgid "Ask to replace existing instrument plugin"
+msgstr "问询是否替换已存在的乐器插件"
 
-#: rc_option_editor.cc:2255
-msgid "follows order of mixer"
-msgstr "混音器按如下排序"
+#: rc_option_editor.cc:3024
+msgid "Interactively configure instrument plugins on insert"
+msgstr "插入时交互式配置乐器插件"
 
-#: rc_option_editor.cc:2269 rc_option_editor.cc:2278 rc_option_editor.cc:2287
-#: rc_option_editor.cc:2297 rc_option_editor.cc:2321 rc_option_editor.cc:2334
-#: rc_option_editor.cc:2343
+#: rc_option_editor.cc:3030
+msgid ""
+"<b>When enabled</b> show a dialog to select instrument channel configuration "
+"before adding a multichannel plugin."
+msgstr ""
+"<b>当启用时</b>显示一个对话框以便于在添加一个复合声道插件前选择乐器声道配置。"
+
+#: rc_option_editor.cc:3039
+msgid "Disable Graphics Hardware Acceleration (requires restart)"
+msgstr "禁止图形硬件加速(需要重新启动)"
+
+#: rc_option_editor.cc:3045
+msgid ""
+"Render large parts of the application user-interface in software, instead of "
+"using 2D-graphics acceleration.\n"
+"This requires restarting %1 before having an effect"
+msgstr ""
+"在软件中渲染大部分应用程序用户界面,而不是使用2D图形加速。\n"
+"在生效前需要重新启动 %1"
+
+#: rc_option_editor.cc:3046 rc_option_editor.cc:3058 rc_option_editor.cc:3061
+#: rc_option_editor.cc:3069 rc_option_editor.cc:3077 rc_option_editor.cc:3085
+#: rc_option_editor.cc:3093 rc_option_editor.cc:3104 rc_option_editor.cc:3120
+#: rc_option_editor.cc:3136 rc_option_editor.cc:3151 rc_option_editor.cc:3160
+#: rc_option_editor.cc:3168
 msgid "Preferences|GUI"
 msgstr "首选项|图形用户界面"
 
-#: rc_option_editor.cc:2272
+#: rc_option_editor.cc:3052
+msgid "Possibly improve slow graphical performance (requires restart)"
+msgstr "可能提高缓慢的图形性能(需要重新启动)"
+
+#: rc_option_editor.cc:3057
+msgid ""
+"Disables hardware gradient rendering on buggy video drivers (\"buggy "
+"gradients patch\").\n"
+"This requires restarting %1 before having an effect"
+msgstr ""
+"在有缺陷的视频驱动上禁用硬件梯度渲染 (\"缺陷梯度补丁\").\n"
+"在生效前需要重新启动 %1"
+
+#: rc_option_editor.cc:3064
+msgid "Use Window Manager/Desktop visibility information"
+msgstr "使用窗口管理器/桌面可视化信息"
+
+#: rc_option_editor.cc:3072
 msgid "Graphically indicate mouse pointer hovering over various widgets"
 msgstr "当悬停在各种小部件上面时显示鼠标指针"
 
-#: rc_option_editor.cc:2281
+#: rc_option_editor.cc:3080
 msgid "Show tooltips if mouse hovers over a control"
 msgstr "如果鼠标悬停在一个控件上面时显示工具提示"
 
-#: rc_option_editor.cc:2290
+#: rc_option_editor.cc:3088
 msgid "Use name highlight bars in region displays (requires a restart)"
 msgstr "在区域显示中使用名称突出显示栏(需要重新启动)"
 
-#: rc_option_editor.cc:2303
-msgid "update transport clock display at FPS instead of every 100ms"
+#: rc_option_editor.cc:3096
+msgid "Update transport clock display at FPS instead of every 100ms"
 msgstr "以 FPS 替代每 100ms 更新播送计时器显示"
 
-#: rc_option_editor.cc:2312
+#: rc_option_editor.cc:3111
+msgid "Waveform image cache size (megabytes)"
+msgstr "波形图像缓存尺寸(兆字节)"
+
+#: rc_option_editor.cc:3119
+msgid ""
+"Increasing the cache size uses more memory to store waveform images, which "
+"can improve graphical performance."
+msgstr "增加缓存大小会使用更多的内存来存储波形图像,可以提高图形性能。"
+
+#: rc_option_editor.cc:3127
 msgid "Lock timeout (seconds)"
 msgstr "锁定超时(秒)"
 
-#: rc_option_editor.cc:2320
+#: rc_option_editor.cc:3135
 msgid "Lock GUI after this many idle seconds (zero to never lock)"
 msgstr "在空闲这么多秒之后锁定图形用户界面(零则永不锁定)"
 
-#: rc_option_editor.cc:2336
+#: rc_option_editor.cc:3153
 msgid "Mixer Strip"
-msgstr "混音器栏"
+msgstr "混音器工具栏"
 
-#: rc_option_editor.cc:2346
+#: rc_option_editor.cc:3163
 msgid "Use narrow strips in the mixer by default"
-msgstr "默认在混音器里使用细长栏"
-
-#: rc_option_editor.cc:2351 rc_option_editor.cc:2365 rc_option_editor.cc:2384
-#: rc_option_editor.cc:2400 rc_option_editor.cc:2416 rc_option_editor.cc:2430
-#: rc_option_editor.cc:2444 rc_option_editor.cc:2446
+msgstr "默认在混音器里使用细长条工具栏"
+
+#: rc_option_editor.cc:3170
+msgid "Action Script Button Visibility"
+msgstr "动作脚本按钮可见"
+
+#: rc_option_editor.cc:3176 rc_option_editor.cc:3190 rc_option_editor.cc:3207
+#: rc_option_editor.cc:3223 rc_option_editor.cc:3239 rc_option_editor.cc:3253
+#: rc_option_editor.cc:3279 rc_option_editor.cc:3297 rc_option_editor.cc:3308
+#: rc_option_editor.cc:3315 rc_option_editor.cc:3317 rc_option_editor.cc:3325
+#: rc_option_editor.cc:3327 rc_option_editor.cc:3335 rc_option_editor.cc:3343
+#: rc_option_editor.cc:3345
 msgid "Preferences|Metering"
-msgstr "首选项|节拍"
+msgstr "首选项|计量"
 
-#: rc_option_editor.cc:2355
+#: rc_option_editor.cc:3180
 msgid "Peak hold time"
 msgstr "峰值停留时间"
 
-#: rc_option_editor.cc:2361
+#: rc_option_editor.cc:3186
 msgid "short"
 msgstr "短"
 
-#: rc_option_editor.cc:2362
+#: rc_option_editor.cc:3187
 msgid "medium"
 msgstr "中"
 
-#: rc_option_editor.cc:2363
+#: rc_option_editor.cc:3188
 msgid "long"
 msgstr "é•¿"
 
-#: rc_option_editor.cc:2369
+#: rc_option_editor.cc:3194
 msgid "DPM fall-off"
 msgstr "DPM 衰减"
 
-#: rc_option_editor.cc:2375
+#: rc_option_editor.cc:3200
 msgid "slowest [6.6dB/sec]"
 msgstr "最慢 [6.6dB/sec]"
 
-#: rc_option_editor.cc:2376
+#: rc_option_editor.cc:3201
 msgid "slow [8.6dB/sec] (BBC PPM, EBU PPM)"
 msgstr "æ…¢ [8.6dB/sec] (BBC PPM, EBU PPM)"
 
-#: rc_option_editor.cc:2377
-msgid "slowish [12.0dB/sec] (DIN)"
-msgstr "稍慢 [12.0dB/sec] (DIN)"
-
-#: rc_option_editor.cc:2378
-msgid "moderate [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"
-msgstr "稳健 [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"
+#: rc_option_editor.cc:3202
+msgid "moderate [12.0dB/sec] (DIN)"
+msgstr "稳健 [12.0dB/sec] (DIN)"
 
-#: rc_option_editor.cc:2379
-msgid "medium [20dB/sec]"
-msgstr "中等 [20dB/sec]"
+#: rc_option_editor.cc:3203
+msgid "medium [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"
+msgstr "中等 [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"
 
-#: rc_option_editor.cc:2380
-msgid "fast [32dB/sec]"
-msgstr "å¿« [32dB/sec]"
+#: rc_option_editor.cc:3204
+msgid "fast [20dB/sec]"
+msgstr "å¿« [20dB/sec]"
 
-#: rc_option_editor.cc:2381
-msgid "faster [46dB/sec]"
-msgstr "较快 [46dB/sec]"
-
-#: rc_option_editor.cc:2382
-msgid "fastest [70dB/sec]"
-msgstr "最快 [70dB/sec]"
+#: rc_option_editor.cc:3205
+msgid "very fast [32dB/sec]"
+msgstr "很快 [32dB/sec]"
 
-#: rc_option_editor.cc:2388
+#: rc_option_editor.cc:3211
 msgid "Meter line-up level; 0dBu"
-msgstr "节拍排队电平;0dBu"
+msgstr "计量排队电平;0dBu"
 
-#: rc_option_editor.cc:2393 rc_option_editor.cc:2409
+#: rc_option_editor.cc:3216 rc_option_editor.cc:3232
 msgid "-24dBFS (SMPTE US: 4dBu = -20dBFS)"
-msgstr ""
+msgstr "-24dBFS(音视频同步码 美国:4dBu = -20dBFS)"
 
-#: rc_option_editor.cc:2394 rc_option_editor.cc:2410
+#: rc_option_editor.cc:3217 rc_option_editor.cc:3233
 msgid "-20dBFS (SMPTE RP.0155)"
-msgstr ""
+msgstr "-20dBFS(音视频同步码 RP.0155)"
 
-#: rc_option_editor.cc:2395 rc_option_editor.cc:2411
+#: rc_option_editor.cc:3218 rc_option_editor.cc:3234
 msgid "-18dBFS (EBU, BBC)"
-msgstr ""
+msgstr "-18dBFS(欧洲广播联盟,英国广播公司)"
 
-#: rc_option_editor.cc:2396 rc_option_editor.cc:2412
+#: rc_option_editor.cc:3219 rc_option_editor.cc:3235
 msgid "-15dBFS (DIN)"
-msgstr ""
+msgstr "-15dBFS(德国工业标准)"
 
-#: rc_option_editor.cc:2398
+#: rc_option_editor.cc:3221
 msgid ""
-"Configure meter-marks and color-knee point for dBFS scale DPM, set reference level "
-"for IEC1/Nordic, IEC2 PPM and VU meter."
+"Configure meter-marks and color-knee point for dBFS scale DPM, set reference "
+"level for IEC1/Nordic, IEC2 PPM and VU meter."
 msgstr ""
-"配置节拍标志和转角颜色点用于 dBFS 缩放 DPM,为 IEC1/Nordic、IEC2 PPM 和 VU 节拍设置"
-"参考电平。"
+"配置节拍标志和转角颜色点用于 dBFS 缩放 DPM,为 IEC1/Nordic、IEC2 PPM 和 VU 节"
+"拍设置参考电平。"
 
-#: rc_option_editor.cc:2404
+#: rc_option_editor.cc:3227
 msgid "IEC1/DIN Meter line-up level; 0dBu"
-msgstr "IEC1/DIN 节拍排队电平;0dBu"
+msgstr "IEC1/DIN 计量排队电平;0dBu"
 
-#: rc_option_editor.cc:2414
+#: rc_option_editor.cc:3237
 msgid "Reference level for IEC1/DIN meter."
-msgstr "IEC1/DIN 节拍参考电平。"
+msgstr "IEC1/DIN 计量参考电平。"
 
-#: rc_option_editor.cc:2420
+#: rc_option_editor.cc:3243
 msgid "VU Meter standard"
-msgstr "VU 节拍标准"
+msgstr "VU 计量标准"
 
-#: rc_option_editor.cc:2425
+#: rc_option_editor.cc:3248
 msgid "0VU = -2dBu (France)"
 msgstr "0VU = -2dBu (法国)"
 
-#: rc_option_editor.cc:2426
+#: rc_option_editor.cc:3249
 msgid "0VU = 0dBu (North America, Australia)"
 msgstr "0VU = 0dBu (北美,澳洲)"
 
-#: rc_option_editor.cc:2427
+#: rc_option_editor.cc:3250
 msgid "0VU = +4dBu (standard)"
 msgstr "0VU = +4dBu (标准)"
 
-#: rc_option_editor.cc:2428
+#: rc_option_editor.cc:3251
 msgid "0VU = +8dBu"
 msgstr ""
 
-#: rc_option_editor.cc:2434
+#: rc_option_editor.cc:3257
 msgid "Peak threshold [dBFS]"
 msgstr "峰值临界值 [dBFS]"
 
-#: rc_option_editor.cc:2442
+#: rc_option_editor.cc:3266
+msgid "Default Meter Type for Master Bus"
+msgstr "主控总线的默认节拍类型"
+
+#: rc_option_editor.cc:3284
+msgid "Default Meter Type for Busses"
+msgstr "总线的默认节拍类型"
+
+#: rc_option_editor.cc:3301
+msgid "Default Meter Type for Tracks"
+msgstr "音轨的默认节拍类型"
+
+#: rc_option_editor.cc:3313
 msgid ""
-"Specify the audio signal level in dbFS at and above which the meter-peak indicator "
-"will flash red."
-msgstr "以 dbFS 指定音频信号电平,达到以及超过节拍峰时,值指示器将闪烁红灯。"
+"Specify the audio signal level in dBFS at and above which the meter-peak "
+"indicator will flash red."
+msgstr "以 dBFS 指定音频信号电平,高于计量峰值指标将闪烁红色。"
 
-#: rc_option_editor.cc:2449
+#: rc_option_editor.cc:3320
 msgid "LED meter style"
-msgstr "LED 节拍类型"
+msgstr "LED 计量类型"
+
+#: rc_option_editor.cc:3325
+msgid "Editor Meters"
+msgstr "编辑器节拍"
+
+#: rc_option_editor.cc:3330
+msgid "Show meters on tracks in the editor"
+msgstr "在编辑器的音轨上显示节拍"
+
+#: rc_option_editor.cc:3338
+msgid "Show at most stereo meters in the track-header"
+msgstr "在音轨头部显示大部分立体声节拍"
+
+#: rc_option_editor.cc:3343
+msgid "Post Export Analysis"
+msgstr "后置导出分析"
+
+#: rc_option_editor.cc:3348
+msgid "Save loudness analysis as image file"
+msgstr "保存响度分析为图像文件"
 
-#: rc_option_editor.cc:2457
+#: rc_option_editor.cc:3356
 msgid "Theme"
 msgstr "主题"
 
-#: region_editor.cc:79
+#: rc_option_editor.cc:3358
+msgid "Theme/Colors"
+msgstr "主题/颜色"
+
+#: rc_option_editor.cc:3436
+msgid "Set Linux VST Search Path"
+msgstr "设置 Linux VST 搜索路径"
+
+#: rc_option_editor.cc:3450
+msgid "Set Windows VST Search Path"
+msgstr "设置 Windows VST 搜索路径"
+
+#: region_editor.cc:81
 msgid "audition this region"
 msgstr "监听此区域"
 
-#: region_editor.cc:88 region_layering_order_editor.cc:75
+#: region_editor.cc:90 region_layering_order_editor.cc:75
 msgid "Position:"
 msgstr "位置:"
 
-#: region_editor.cc:90 add_video_dialog.cc:155
+#: region_editor.cc:92 add_video_dialog.cc:156
 msgid "End:"
 msgstr "终点:"
 
-#: region_editor.cc:92 sfdb_ui.cc:145
+#: region_editor.cc:94 sfdb_ui.cc:145
 msgid "Length:"
 msgstr "长度:"
 
-#: region_editor.cc:94
+#: region_editor.cc:96
 msgid "Sync point (relative to region):"
 msgstr "同步点(相对于区域):"
 
-#: region_editor.cc:96
+#: region_editor.cc:98
 msgid "Sync point (absolute):"
-msgstr "同步点(绝对):"
+msgstr "同步点(绝对)"
 
-#: region_editor.cc:98
+#: region_editor.cc:100
 msgid "File start:"
 msgstr "文件起点:"
 
-#: region_editor.cc:102
+#: region_editor.cc:104
 msgid "Sources:"
-msgstr "源:"
+msgstr "来源:"
 
-#: region_editor.cc:104
+#: region_editor.cc:106
 msgid "Source:"
-msgstr "源:"
+msgstr "来源:"
 
-#: region_editor.cc:166
+#: region_editor.cc:168
 msgid "Region '%1'"
 msgstr "区域 '%1'"
 
-#: region_editor.cc:273
+#: region_editor.cc:279
 msgid "change region start position"
 msgstr "改变区域起点位置"
 
-#: region_editor.cc:289
+#: region_editor.cc:299
 msgid "change region end position"
 msgstr "改变区域终点位置"
 
-#: region_editor.cc:309
+#: region_editor.cc:322
 msgid "change region length"
 msgstr "改变区域长度"
 
-#: region_editor.cc:403 region_editor.cc:415
+#: region_editor.cc:416 region_editor.cc:428
 msgid "change region sync point"
 msgstr "改变区域同步点"
 
@@ -10068,32 +12242,32 @@ msgstr "音轨:"
 msgid "Choose Top Region"
 msgstr "选择顶部区域"
 
-#: region_view.cc:277
+#: region_view.cc:271
 msgid "SilenceText"
 msgstr "无声文本"
 
-#: region_view.cc:292 region_view.cc:311
+#: region_view.cc:286 region_view.cc:305
 msgid "minutes"
 msgstr "分钟"
 
-#: region_view.cc:295 region_view.cc:314
+#: region_view.cc:289 region_view.cc:308
 msgid "msecs"
 msgstr "毫秒"
 
-#: region_view.cc:298 region_view.cc:317
+#: region_view.cc:292 region_view.cc:311
 msgid "secs"
 msgstr "秒"
 
-#: region_view.cc:301
+#: region_view.cc:295
 msgid "%1 silent segment"
 msgid_plural "%1 silent segments"
 msgstr[0] "%1 无声片段"
 
-#: region_view.cc:303
+#: region_view.cc:297
 msgid "shortest = %1 %2"
 msgstr "最短 = %1 %2"
 
-#: region_view.cc:320
+#: region_view.cc:314
 msgid ""
 "\n"
 "  (shortest audible segment = %1 %2)"
@@ -10141,55 +12315,63 @@ msgstr ""
 msgid "Modified Kullback-Liebler"
 msgstr "改良的 Kullback-Liebler"
 
-#: rhythm_ferret.cc:65
+#: rhythm_ferret.cc:62
+msgid "Spectral Flux"
+msgstr "频谱流量"
+
+#: rhythm_ferret.cc:68
 msgid "Split region"
 msgstr "拆分区域"
 
-#: rhythm_ferret.cc:66
+#: rhythm_ferret.cc:70
 msgid "Snap regions"
 msgstr "吸附区域"
 
-#: rhythm_ferret.cc:67
+#: rhythm_ferret.cc:71
 msgid "Conform regions"
 msgstr "适应区域"
 
-#: rhythm_ferret.cc:72
+#: rhythm_ferret.cc:77
 msgid "Rhythm Ferret"
 msgstr "节奏探测"
 
-#: rhythm_ferret.cc:78
+#: rhythm_ferret.cc:83
 msgid "Analyze"
 msgstr "分析"
 
-#: rhythm_ferret.cc:113
+#: rhythm_ferret.cc:122
 msgid "Detection function"
 msgstr "检测功能"
 
-#: rhythm_ferret.cc:117
-msgid "Trigger gap"
-msgstr "触发间隙"
+#: rhythm_ferret.cc:126
+msgid "Trigger gap (postproc)"
+msgstr "触发器间隙(后期处理)"
 
-#: rhythm_ferret.cc:122 strip_silence_dialog.cc:64
-msgid "Threshold"
-msgstr "临界值"
-
-#: rhythm_ferret.cc:127
+#: rhythm_ferret.cc:131
 msgid "Peak threshold"
 msgstr "峰值临界值"
 
-#: rhythm_ferret.cc:132
+#: rhythm_ferret.cc:135
 msgid "Silence threshold"
 msgstr "无声临界值"
 
-#: rhythm_ferret.cc:137
+#: rhythm_ferret.cc:141
+msgid "Min Inter-Onset Time"
+msgstr "最小内在启动时间"
+
+#: rhythm_ferret.cc:148
 msgid "Sensitivity"
 msgstr "灵敏度"
 
-#: rhythm_ferret.cc:141
+#: rhythm_ferret.cc:152
+msgid "Cut Pos Threshold"
+msgstr "剪切 Pos 临界值"
+
+#: rhythm_ferret.cc:157
 msgid "Operation"
 msgstr "操作"
 
-#: rhythm_ferret.cc:355
+#: rhythm_ferret.cc:382
 msgid "split regions (rhythm ferret)"
 msgstr "拆分区域(节奏探测)"
 
@@ -10213,19 +12395,15 @@ msgstr "启用录制"
 msgid "Active state"
 msgstr "激活状态"
 
-#: route_group_dialog.cc:53 route_group_dialog.cc:82 theme_manager.cc:90
-msgid "Color"
-msgstr "颜色"
-
-#: route_group_dialog.cc:59
+#: route_group_dialog.cc:58
 msgid "RouteGroupDialog"
 msgstr "路由分组对话框"
 
-#: route_group_dialog.cc:100
+#: route_group_dialog.cc:99
 msgid "<b>Sharing</b>"
 msgstr "<b>共享中</b>"
 
-#: route_group_dialog.cc:200
+#: route_group_dialog.cc:192
 msgid "The group name is not unique. Please use a different name."
 msgstr "分组名称有重复。请使用另一个名称。"
 
@@ -10243,427 +12421,394 @@ msgstr "输出"
 
 #: route_params_ui.cc:105
 msgid "Plugins, Inserts & Sends"
-msgstr "插件,插入和发送"
+msgstr "插件,插入和发送端"
 
-#: route_params_ui.cc:209
+#: route_params_ui.cc:201
 msgid "route display list item for renamed route not found!"
 msgstr "未找到已重命名路由的路由显示列表条目!"
 
-#: route_params_ui.cc:279 route_params_ui.cc:307
+#: route_params_ui.cc:271 route_params_ui.cc:299
 #, c-format
 msgid "Playback delay: %<PRId64> samples"
-msgstr "回放延迟: %<PRId64> 采样"
+msgstr "回放延迟: %<PRId64> 样本"
 
-#: route_params_ui.cc:499
+#: route_params_ui.cc:491
 msgid "NO TRACK"
 msgstr "没有音轨"
 
-#: route_params_ui.cc:637 route_params_ui.cc:638
+#: route_params_ui.cc:515
+msgid "Add Track or Bus"
+msgstr "添加音轨或总线"
+
+#: route_params_ui.cc:627 route_params_ui.cc:628
 msgid "No Track or Bus Selected"
 msgstr "没有音轨或总线被选中"
 
-#: route_time_axis.cc:181
+#: route_time_axis.cc:104
+msgid "RTAV|G"
+msgstr ""
+
+#: route_time_axis.cc:105
+msgid "RTAV|P"
+msgstr ""
+
+#: route_time_axis.cc:106
+msgid "RTAV|A"
+msgstr ""
+
+#: route_time_axis.cc:194
 msgid "Record (Right-click for Step Edit)"
 msgstr "录制(右键点击步进编辑)"
 
-#: route_time_axis.cc:184
+#: route_time_axis.cc:197
 msgid "Record"
 msgstr "录制"
 
-#: route_time_axis.cc:254
+#: route_time_axis.cc:265
 msgid "Route Group"
 msgstr "路由分组"
 
-#: route_time_axis.cc:264
+#: route_time_axis.cc:275
 msgid "MIDI Controllers and Automation"
 msgstr "MIDI 控制器和自动化"
 
-#: route_time_axis.cc:495
+#: route_time_axis.cc:510
 msgid "Show All Automation"
 msgstr "显示所有的自动化"
 
-#: route_time_axis.cc:498
+#: route_time_axis.cc:513
 msgid "Show Existing Automation"
 msgstr "显示已有的自动化"
 
-#: route_time_axis.cc:501
+#: route_time_axis.cc:516
 msgid "Hide All Automation"
 msgstr "隐藏所有自动化"
 
-#: route_time_axis.cc:510
+#: route_time_axis.cc:525
 msgid "Processor automation"
 msgstr "处理器自动化"
 
-#: route_time_axis.cc:517
+#: route_time_axis.cc:532
 msgid "Fader"
-msgstr "淡化"
+msgstr "淡化器"
 
-#: route_time_axis.cc:535
+#: route_time_axis.cc:559
 msgid "Pan"
-msgstr "平移"
+msgstr "声相"
 
-#: route_time_axis.cc:626
+#: route_time_axis.cc:643
 msgid "Overlaid"
 msgstr "重叠"
 
-#: route_time_axis.cc:632
+#: route_time_axis.cc:649
 msgid "Stacked"
 msgstr "堆栈"
 
-#: route_time_axis.cc:640
+#: route_time_axis.cc:657
 msgid "Layers"
 msgstr "层"
 
-#: route_time_axis.cc:709
+#: route_time_axis.cc:721
 msgid "Automatic (based on I/O connections)"
 msgstr "自动的(基于输入/输出连接)"
 
-#: route_time_axis.cc:718
+#: route_time_axis.cc:730
 msgid "(Currently: Existing Material)"
 msgstr "(当前:现有材料)"
 
-#: route_time_axis.cc:721
+#: route_time_axis.cc:733
 msgid "(Currently: Capture Time)"
 msgstr "(当前:捕获时间)"
 
-#: route_time_axis.cc:729
+#: route_time_axis.cc:741
 msgid "Align With Existing Material"
-msgstr "与现有材料对齐"
+msgstr "对齐已存在的材料"
 
-#: route_time_axis.cc:734
+#: route_time_axis.cc:746
 msgid "Align With Capture Time"
-msgstr "与捕获时间对齐"
+msgstr "对齐捕获时间"
 
-#: route_time_axis.cc:739
+#: route_time_axis.cc:751
 msgid "Alignment"
 msgstr "对齐"
 
-#: route_time_axis.cc:774
+#: route_time_axis.cc:786
 msgid "Normal Mode"
 msgstr "正常模式"
 
-#: route_time_axis.cc:780
+#: route_time_axis.cc:792
 msgid "Tape Mode"
 msgstr "磁带模式"
 
-#: route_time_axis.cc:786
+#: route_time_axis.cc:798
 msgid "Non-Layered Mode"
 msgstr "不分层模式"
 
-#: route_time_axis.cc:792
+#: route_time_axis.cc:804
 msgid "Record Mode"
 msgstr "录制模式"
 
-#: route_time_axis.cc:799 route_time_axis.cc:1789
+#: route_time_axis.cc:809 route_time_axis.cc:1795
 msgid "Playlist"
 msgstr "播放列表"
 
-#: route_time_axis.cc:1097
+#: route_time_axis.cc:1107
 msgid "Rename Playlist"
 msgstr "重命名播放列表"
 
-#: route_time_axis.cc:1098
+#: route_time_axis.cc:1108
 msgid "New name for playlist:"
 msgstr "播放列表的新名称:"
 
-#: route_time_axis.cc:1183
+#: route_time_axis.cc:1193
 msgid "New Copy Playlist"
 msgstr "新建播放列表拷贝"
 
-#: route_time_axis.cc:1184 route_time_axis.cc:1237
+#: route_time_axis.cc:1194 route_time_axis.cc:1247
 msgid "Name for new playlist:"
 msgstr "新播放列表名称:"
 
-#: route_time_axis.cc:1236
+#: route_time_axis.cc:1246
 msgid "New Playlist"
 msgstr "新建播放列表"
 
-#: route_time_axis.cc:1436
-msgid "You cannot create a track with that name as it is reserved for %1"
-msgstr "无法以此名称创建音轨,因为它被 %1 保留使用"
+#: route_time_axis.cc:1441
+msgid "The name \"%1\" is reserved for %2"
+msgstr "名称 \"%1\" 已经被预留给 %2"
 
-#: route_time_axis.cc:1678
+#: route_time_axis.cc:1684
 msgid "New Copy..."
 msgstr "新建拷贝…"
 
-#: route_time_axis.cc:1682
+#: route_time_axis.cc:1688
 msgid "New Take"
 msgstr "新建磁带"
 
-#: route_time_axis.cc:1683
+#: route_time_axis.cc:1689
 msgid "Copy Take"
 msgstr "拷贝磁带"
 
-#: route_time_axis.cc:1688
+#: route_time_axis.cc:1694
 msgid "Clear Current"
 msgstr "清除当前"
 
-#: route_time_axis.cc:1691
-msgid "Select From All..."
+#: route_time_axis.cc:1697
+msgid "Select from All..."
 msgstr "选择所有…"
 
-#: route_time_axis.cc:1779
+#: route_time_axis.cc:1785
 msgid "Take: %1.%2"
 msgstr "磁带:%1.%2"
 
-#: route_time_axis.cc:2169 selection.cc:1007 selection.cc:1061
+#: route_time_axis.cc:2190 selection.cc:1042 selection.cc:1096
 msgid "programming error: "
 msgstr "程序错误:"
 
-#: route_time_axis.cc:2585
+#: route_time_axis.cc:2614
 msgid "Underlays"
 msgstr "底层"
 
-#: route_time_axis.cc:2588
+#: route_time_axis.cc:2617
 msgid "Remove \"%1\""
 msgstr "移除 \"%1\""
 
-#: route_time_axis.cc:2638 route_time_axis.cc:2675
+#: route_time_axis.cc:2667 route_time_axis.cc:2704
 msgid "programming error: underlay reference pointer pairs are inconsistent!"
 msgstr "程序错误:底层参考指针搭配不一致!"
 
-#: route_time_axis.cc:2702
+#: route_time_axis.cc:2731 vca_master_strip.cc:203 vca_time_axis.cc:228
 msgid "After-fade listen (AFL)"
-msgstr "后置淡化试听(AFL)"
+msgstr "后置于淡化器试听(AFL)"
 
-#: route_time_axis.cc:2706
+#: route_time_axis.cc:2735 vca_master_strip.cc:207 vca_time_axis.cc:232
 msgid "Pre-fade listen (PFL)"
-msgstr "前置淡化试听(PFL)"
+msgstr "前置于淡化器试听(PFL)"
 
-#: route_ui.cc:140
+#: route_ui.cc:165
 msgid "Mute this track"
 msgstr "静音此音轨"
 
-#: route_ui.cc:144
+#: route_ui.cc:169
 msgid "Mute other (non-soloed) tracks"
-msgstr "静音其它(非独奏)音轨"
+msgstr "静音其它(非已独奏)音轨"
 
-#: route_ui.cc:150
+#: route_ui.cc:175
 msgid "Enable recording on this track"
 msgstr "在此音轨启用录制"
 
-#: route_ui.cc:158
+#: route_ui.cc:183
 msgid "make mixer strips show sends to this bus"
-msgstr "让混音器栏显示发送到该总线"
+msgstr "让混音器栏显示发送端到该总线"
 
-#: route_ui.cc:163
+#: route_ui.cc:188
 msgid "Monitor input"
 msgstr "监控输入"
 
-#: route_ui.cc:169
+#: route_ui.cc:194
 msgid "Monitor playback"
 msgstr "监控回放"
 
-#: route_ui.cc:676
+#: route_ui.cc:706
 msgid "Not connected to AudioEngine - cannot engage record"
-msgstr "未连接到音频引擎——无法从事录制"
+msgstr "未连接到音频引擎 —— 无法从事录制"
 
-#: route_ui.cc:875
+#: route_ui.cc:883
+msgid "Rec-Safe"
+msgstr "录制-安全"
+
+#: route_ui.cc:888
 msgid "Step Entry"
 msgstr "步进入口"
 
-#: route_ui.cc:948
+#: route_ui.cc:987
 msgid "Assign all tracks (prefader)"
-msgstr "指定所有音轨(前置淡化)"
+msgstr "指定所有音轨(前置于淡化器)"
 
-#: route_ui.cc:952
+#: route_ui.cc:991
 msgid "Assign all tracks and buses (prefader)"
-msgstr "指定所有音轨和总线(前置淡化)"
+msgstr "指定所有音轨和总线(前置于淡化器)"
 
-#: route_ui.cc:956
+#: route_ui.cc:995
 msgid "Assign all tracks (postfader)"
-msgstr "指定所有音轨(后置淡化)"
+msgstr "指定所有音轨(后置于淡化器)"
 
-#: route_ui.cc:960
+#: route_ui.cc:999
 msgid "Assign all tracks and buses (postfader)"
-msgstr "指定所有音轨和总线(后置淡化)"
+msgstr "指定所有音轨和总线(后置于淡化器)"
 
-#: route_ui.cc:964
+#: route_ui.cc:1003
 msgid "Assign selected tracks (prefader)"
-msgstr "指定已选中的音轨(前置淡化)"
+msgstr "指定已选中的音轨(前置于淡化器)"
 
-#: route_ui.cc:968
+#: route_ui.cc:1007
 msgid "Assign selected tracks and buses (prefader)"
-msgstr "指定已选中的音轨和总线(前置淡化)"
+msgstr "指定已选中的音轨和总线(前置于淡化器)"
 
-#: route_ui.cc:971
+#: route_ui.cc:1010
 msgid "Assign selected tracks (postfader)"
-msgstr "指定已选中的音轨(后置淡化)"
+msgstr "指定已选中的音轨(后置于淡化器)"
 
-#: route_ui.cc:975
+#: route_ui.cc:1014
 msgid "Assign selected tracks and buses (postfader)"
-msgstr "指定已选中的音轨和总线(后置淡化)"
+msgstr "指定已选中的音轨和总线(后置于淡化器)"
 
-#: route_ui.cc:978
+#: route_ui.cc:1017
 msgid "Copy track/bus gains to sends"
-msgstr "复制音轨/总线增益到发送"
+msgstr "复制音轨/总线增益到发送端"
 
-#: route_ui.cc:979
+#: route_ui.cc:1018
 msgid "Set sends gain to -inf"
-msgstr "设置发送增益到 -inf"
+msgstr "设置发送端增益到 -inf"
 
-#: route_ui.cc:980
+#: route_ui.cc:1019
 msgid "Set sends gain to 0dB"
-msgstr "设置发送增益到 0dB"
+msgstr "设置发送端增益到 0dB"
 
-#: route_ui.cc:1300
+#: route_ui.cc:1357
 msgid "Solo Isolate"
 msgstr "独奏隔离"
 
-#: route_ui.cc:1307
+#: route_ui.cc:1364
 msgid "Solo Safe"
 msgstr "独奏安全"
 
-#: route_ui.cc:1329
+#: route_ui.cc:1386
 msgid "Pre Fader Sends"
-msgstr "前置淡化发送"
+msgstr "前置于淡化器发送端"
 
-#: route_ui.cc:1335
+#: route_ui.cc:1392
 msgid "Post Fader Sends"
-msgstr "后置淡化发送"
+msgstr "后置于淡化器发送端"
 
-#: route_ui.cc:1341
+#: route_ui.cc:1398
 msgid "Control Outs"
 msgstr "控制输出"
 
-#: route_ui.cc:1347
+#: route_ui.cc:1404
 msgid "Main Outs"
 msgstr "主要输出"
 
-#: route_ui.cc:1479
+#: route_ui.cc:1571
 msgid "Color Selection"
 msgstr "颜色已选择部分"
 
-#: route_ui.cc:1564
-msgid ""
-"Do you really want to remove track \"%1\" ?\n"
-"\n"
-"You may also lose the playlist used by this track.\n"
-"\n"
-"(This action cannot be undone, and the session file will be overwritten)"
-msgstr ""
-"您是否真的要移除音轨 \"%1\"?\n"
-"\n"
-"您也可能会失去使用此音轨使用的播放列表。\n"
-"\n"
-"(此操作不可撤销,而且此会话文件将会被重写覆盖)"
-
-#: route_ui.cc:1566
-msgid ""
-"Do you really want to remove bus \"%1\" ?\n"
-"\n"
-"(This action cannot be undone, and the session file will be overwritten)"
-msgstr ""
-"您是否真的要移除总线\"%1\" ?\n"
-"\n"
-"(此操作不可撤销,而且此会话文件将会被重写覆盖)"
-
-#: route_ui.cc:1574
-msgid "Remove track"
-msgstr "移除音轨"
-
-#: route_ui.cc:1576
-msgid "Remove bus"
-msgstr "移除总线"
-
-#: route_ui.cc:1604
+#: route_ui.cc:1613
 msgid ""
 "The use of colons (':') is discouraged in track and bus names.\n"
 "Do you want to use this new name?"
 msgstr ""
-"建议不要在音轨和总线名称中使用冒号(“ : ”)。\n"
-"您是否确定使用这个新名称?"
+"建议不要在音轨和总线名称中使用冒号(“:”)。\n"
+"您是否打算使用这个新名称?"
 
-#: route_ui.cc:1608
+#: route_ui.cc:1617
 msgid "Use the new name"
 msgstr "使用新名称"
 
-#: route_ui.cc:1609
+#: route_ui.cc:1618
 msgid "Re-edit the name"
 msgstr "重新编辑名称"
 
-#: route_ui.cc:1622
+#: route_ui.cc:1631
 msgid "Rename Track"
 msgstr "重命名音轨"
 
-#: route_ui.cc:1624
+#: route_ui.cc:1633
 msgid "Rename Bus"
 msgstr "重命名总线"
 
-#: route_ui.cc:1692
+#: route_ui.cc:1693
 msgid ": comment editor"
 msgstr ":注释编辑器"
 
-#: route_ui.cc:1858
+#: route_ui.cc:1848
 msgid " latency"
 msgstr "延迟"
 
-#: route_ui.cc:1871
+#: route_ui.cc:1888
 msgid "Cannot create route template directory %1"
 msgstr "无法创建路由模板目录 %1"
 
-#: route_ui.cc:1877
+#: route_ui.cc:1894
 msgid "Save As Template"
 msgstr "另存为模板"
 
-#: route_ui.cc:1878
+#: route_ui.cc:1895
 msgid "Template name:"
 msgstr "模板名称:"
 
-#: route_ui.cc:1959
-msgid "Remote Control ID"
-msgstr "移除控制 ID"
+#: route_ui.cc:2019
+msgid ""
+"Left-click to invert polarity of channel %1 of this track. Right-click to "
+"show menu."
+msgstr "左键点击以反转这音轨的声道 %1 的两极。右键点击显示菜单。"
 
-#: route_ui.cc:1969
-msgid "Remote control ID:"
-msgstr "移除控制 ID:"
+#: route_ui.cc:2021
+msgid "Click to show a menu of channels to invert polarity"
+msgstr "点击显示反转两极的声道菜单"
 
-#: route_ui.cc:1983
-msgid ""
-"The remote control ID of %1 is: %2\n"
-"\n"
-"\n"
-"The remote control ID of %3 cannot be changed."
-msgstr ""
-" %1 的远程控制 ID 是:%2\n"
-"\n"
-"\n"
-"%3 的远程控制 ID 无法改变。"
+#: save_as_dialog.cc:34
+msgid "Switch to newly-saved version"
+msgstr "切换到新保存的版本"
 
-#: route_ui.cc:1987
-msgid "the master bus"
-msgstr "主控总线"
+#: save_as_dialog.cc:35
+msgid "Copy media to new session"
+msgstr "复制媒体到新会话"
 
-#: route_ui.cc:1987
-msgid "the monitor bus"
-msgstr "监控总线"
+#: save_as_dialog.cc:36
+msgid "Copy external media into new session"
+msgstr "复制外部媒体到新会话"
 
-#: route_ui.cc:1989
-msgid ""
-"The remote control ID of %5 is: %2\n"
-"\n"
-"\n"
-"Remote Control IDs are currently determined by track/bus ordering in %6.\n"
-"\n"
-"%3Use the User Interaction tab of the Preferences window if you want to change this"
-"%4"
-msgstr ""
-"%5 的远程控制 ID 是:%2\n"
-"\n"
-"\n"
-"远程控制 IDs 是由当前音轨/总线在 %6 里的排序所决定的。\n"
-"\n"
-"如果您想改变 %4,%3 使用首选项窗口的用户交互选项卡"
+#: save_as_dialog.cc:37
+msgid "Newly-saved session should be empty"
+msgstr "新保存的会话应该是空的"
 
-#: route_ui.cc:2046
-msgid ""
-"Left-click to invert (phase reverse) channel %1 of this track.  Right-click to "
-"show menu."
-msgstr "左键点击反转(相位反转)该音轨的声道 %1 。右键点击显示菜单。"
+#: save_as_dialog.cc:48
+msgid "Save as session name"
+msgstr "另存为会话的名称"
 
-#: route_ui.cc:2048
-msgid "Click to show a menu of channels for inversion (phase reverse)"
-msgstr "点击显示声道反转(相位反转)菜单"
+#: save_as_dialog.cc:55
+msgid "Parent directory/folder"
+msgstr "父目录/文件夹"
 
 #: search_path_option.cc:35
 msgid "Select folder to search for media"
@@ -10677,126 +12822,158 @@ msgstr "点击添加一个新位置"
 msgid "the session folder"
 msgstr "会话文件夹"
 
+#: script_selector.cc:43
+msgid "<b>Type:</b>"
+msgstr "<b>类型:</b>"
+
+#: script_selector.cc:49
+msgid "<b>Author:</b>"
+msgstr "<b>作者:</b>"
+
+#: script_selector.cc:55
+msgid "<b>Description:</b>"
+msgstr "<b>说明:</b>"
+
+#: script_selector.cc:131
+msgid "Select Script to unload"
+msgstr "选择脚本上传"
+
+#: script_selector.cc:165
+msgid "<b>Name:</b>"
+msgstr "<b>名称:</b>"
+
+#: script_selector.cc:172
+msgid "<b>Instance Parameters</b>"
+msgstr "<b>实例参数</b>"
+
 #: send_ui.cc:134
 msgid "Send "
-msgstr "发送"
+msgstr "发送端 "
 
-#: session_dialog.cc:61
+#: session_dialog.cc:71
 msgid "Session Setup"
-msgstr "发送设置"
+msgstr "会话设置"
 
-#: session_dialog.cc:66
+#: session_dialog.cc:76
 msgid "Advanced options ..."
 msgstr "高级选项…"
 
-#: session_dialog.cc:263
+#: session_dialog.cc:163 session_dialog.cc:397
+msgid "Recent Sessions"
+msgstr "最近的会话"
+
+#: session_dialog.cc:311
+msgid "Sample Rate"
+msgstr "采样率"
+
+#: session_dialog.cc:312
+msgid "File Resolution"
+msgstr "文件分辨率"
+
+#: session_dialog.cc:313
+msgid "Last Modified"
+msgstr "上次修改的"
+
+#: session_dialog.cc:338
 msgid "New Session"
 msgstr "新建会话"
 
-#: session_dialog.cc:301
+#: session_dialog.cc:379
 msgid "Check the website for more..."
-msgstr "查询网站以得到更多…"
+msgstr "查询网站以获取更多…"
 
-#: session_dialog.cc:304
+#: session_dialog.cc:382
 msgid "Click to open the program website in your web browser"
 msgstr "点击以便在您的网页浏览器打开程序网站"
 
-#: session_dialog.cc:324
-msgid "Sample Rate"
-msgstr "采样率"
-
-#: session_dialog.cc:325
-msgid "Disk Format"
-msgstr "硬盘格式化"
-
-#: session_dialog.cc:343
+#: session_dialog.cc:404
 msgid "Select session file"
 msgstr "选择会话文件"
 
-#: session_dialog.cc:358
+#: session_dialog.cc:417
 msgid "Other Sessions"
 msgstr "其它会话"
 
-#: session_dialog.cc:384
+#: session_dialog.cc:424
+msgid "Safe Mode: Disable all Plugins"
+msgstr "安全模式:禁用全部插件"
+
+#: session_dialog.cc:454
 msgid "Open"
 msgstr "打开"
 
-#: session_dialog.cc:451
+#: session_dialog.cc:521
 msgid "Session name:"
 msgstr "会话名称:"
 
-#: session_dialog.cc:473
+#: session_dialog.cc:543
 msgid "Create session folder in:"
-msgstr "创建会话文件夹在:"
+msgstr "创建会话文件夹位于:"
 
-#: session_dialog.cc:496
+#: session_dialog.cc:564
 msgid "Select folder for session"
 msgstr "为会话选择文件夹"
 
-#: session_dialog.cc:525
+#: session_dialog.cc:591
 msgid "Use this template"
 msgstr "使用此模板"
 
-#: session_dialog.cc:528
+#: session_dialog.cc:594
 msgid "no template"
 msgstr "没有模板"
 
-#: session_dialog.cc:663 session_dialog.cc:699
-msgid "32 bit float"
+#: session_dialog.cc:746 session_dialog.cc:793
+msgid "32-bit float"
 msgstr "32 位浮点"
 
-#: session_dialog.cc:666 session_dialog.cc:702
-msgid "24 bit"
-msgstr "24 位"
+#: session_dialog.cc:749 session_dialog.cc:796
+msgid "24-bit"
+msgstr "24位"
 
-#: session_dialog.cc:669 session_dialog.cc:705
-msgid "16 bit"
-msgstr "16 位"
+#: session_dialog.cc:752 session_dialog.cc:799
+msgid "16-bit"
+msgstr "16位"
 
-#: session_dialog.cc:747 session_dialog.cc:748 session_dialog.cc:749
+#: session_dialog.cc:877 session_dialog.cc:878 session_dialog.cc:879
 msgid "channels"
 msgstr "声道"
 
-#: session_dialog.cc:763
+#: session_dialog.cc:893
 msgid "<b>Busses</b>"
 msgstr "<b>总线</b>"
 
-#: session_dialog.cc:764
+#: session_dialog.cc:894
 msgid "<b>Inputs</b>"
 msgstr "<b>输入</b>"
 
-#: session_dialog.cc:765
+#: session_dialog.cc:895
 msgid "<b>Outputs</b>"
 msgstr "<b>输出</b>"
 
-#: session_dialog.cc:773
+#: session_dialog.cc:903
 msgid "Create master bus"
 msgstr "创建主控总线"
 
-#: session_dialog.cc:783
+#: session_dialog.cc:913
 msgid "Automatically connect to physical inputs"
 msgstr "自动连接到物理输入"
 
-#: session_dialog.cc:790 session_dialog.cc:849
+#: session_dialog.cc:920 session_dialog.cc:979
 msgid "Use only"
 msgstr "仅使用"
 
-#: session_dialog.cc:843
+#: session_dialog.cc:973
 msgid "Automatically connect outputs"
 msgstr "自动连接到输出"
 
-#: session_dialog.cc:865
+#: session_dialog.cc:995
 msgid "... to master bus"
 msgstr "…到主控总线"
 
-#: session_dialog.cc:875
+#: session_dialog.cc:1005
 msgid "... to physical outputs"
 msgstr "…到物理输出"
 
-#: session_import_dialog.cc:65
-msgid "Import from Session"
-msgstr "从会话导入"
-
 #: session_import_dialog.cc:74
 msgid "Elements"
 msgstr "元素"
@@ -10817,191 +12994,192 @@ msgstr "从会话导入"
 msgid "This will select all elements of this type!"
 msgstr "这将选择此类型的所有元素!"
 
-#: session_metadata_dialog.cc:285
+# EAN 国际条形码(International Article Number)
+#: session_metadata_dialog.cc:288
 msgid "EAN Check digit OK"
-msgstr "EAN 校验数位正常"
+msgstr "EAN(条形码)校验数位正常"
 
-#: session_metadata_dialog.cc:289
+#: session_metadata_dialog.cc:292
 msgid "EAN Check digit error"
-msgstr "EAN 校验数位出错"
+msgstr "EAN(条形码)校验数位出错"
 
-#: session_metadata_dialog.cc:289
+#: session_metadata_dialog.cc:292
 msgid "expected"
 msgstr "期望"
 
-#: session_metadata_dialog.cc:294
+#: session_metadata_dialog.cc:297
 msgid "EAN Length error"
-msgstr "EAN 长度错误"
+msgstr "EAN(条形码)长度错误"
 
-#: session_metadata_dialog.cc:423
+#: session_metadata_dialog.cc:426
 msgid "Field"
 msgstr "字段"
 
-#: session_metadata_dialog.cc:427
+#: session_metadata_dialog.cc:430
 msgid "Values (current value on top)"
 msgstr "数值(当前数值位于顶部)"
 
-#: session_metadata_dialog.cc:641
+#: session_metadata_dialog.cc:644
 msgid "User"
 msgstr "用户"
 
-#: session_metadata_dialog.cc:649
+#: session_metadata_dialog.cc:652
 msgid "Email"
 msgstr "电子邮件"
 
-#: session_metadata_dialog.cc:652
+#: session_metadata_dialog.cc:655
 msgid "Web"
 msgstr "网站"
 
-#: session_metadata_dialog.cc:655
+#: session_metadata_dialog.cc:658
 msgid "Organization"
 msgstr "组织"
 
-#: session_metadata_dialog.cc:658
+#: session_metadata_dialog.cc:661
 msgid "Country"
 msgstr "国家"
 
-#: session_metadata_dialog.cc:672
+#: session_metadata_dialog.cc:675
 msgid "Title"
 msgstr "标题"
 
-#: session_metadata_dialog.cc:675
+#: session_metadata_dialog.cc:678
 msgid "Track Number"
 msgstr "音轨序号"
 
-#: session_metadata_dialog.cc:678
+#: session_metadata_dialog.cc:681
 msgid "Subtitle"
 msgstr "副标题"
 
-#: session_metadata_dialog.cc:681
+#: session_metadata_dialog.cc:684
 msgid "Grouping"
 msgstr "组合"
 
-#: session_metadata_dialog.cc:684
+#: session_metadata_dialog.cc:687
 msgid "Artist"
 msgstr "艺术家"
 
-#: session_metadata_dialog.cc:687
+#: session_metadata_dialog.cc:690
 msgid "Genre"
 msgstr "流派"
 
-#: session_metadata_dialog.cc:690
+#: session_metadata_dialog.cc:693
 msgid "Comment"
 msgstr "注释"
 
-#: session_metadata_dialog.cc:693
+#: session_metadata_dialog.cc:696
 msgid "Copyright"
 msgstr "版权"
 
-#: session_metadata_dialog.cc:701 session_metadata_dialog.cc:706
+#: session_metadata_dialog.cc:704 session_metadata_dialog.cc:709
 msgid "Album"
 msgstr "专辑"
 
-#: session_metadata_dialog.cc:709
+#: session_metadata_dialog.cc:712
 msgid "Year"
 msgstr "年份"
 
-#: session_metadata_dialog.cc:712
+#: session_metadata_dialog.cc:715
 msgid "Album Artist"
 msgstr "专辑艺术家"
 
-#: session_metadata_dialog.cc:715
+#: session_metadata_dialog.cc:718
 msgid "Total Tracks"
 msgstr "音轨总数"
 
-#: session_metadata_dialog.cc:718
+#: session_metadata_dialog.cc:721
 msgid "Disc Subtitle"
 msgstr "光盘副标题"
 
-#: session_metadata_dialog.cc:721
+#: session_metadata_dialog.cc:724
 msgid "Disc Number"
 msgstr "光盘编号"
 
-#: session_metadata_dialog.cc:724
+#: session_metadata_dialog.cc:727
 msgid "Total Discs"
 msgstr "光盘总数"
 
-#: session_metadata_dialog.cc:727
+#: session_metadata_dialog.cc:730
 msgid "Compilation"
 msgstr "编纂"
 
-#: session_metadata_dialog.cc:730
+#: session_metadata_dialog.cc:733
 msgid "ISRC"
-msgstr "ISRC 国际标准音像制品编码"
+msgstr "ISRC(国际标准音像制品编码)"
 
-#: session_metadata_dialog.cc:733
+#: session_metadata_dialog.cc:736
 msgid "EAN barcode"
-msgstr "EAN 条形码"
+msgstr "EAN 国际条形码"
 
-#: session_metadata_dialog.cc:746
+#: session_metadata_dialog.cc:749
 msgid "People"
 msgstr "民族"
 
-#: session_metadata_dialog.cc:751
+#: session_metadata_dialog.cc:754
 msgid "Lyricist"
 msgstr "作词"
 
-#: session_metadata_dialog.cc:754
+#: session_metadata_dialog.cc:757
 msgid "Composer"
 msgstr "作曲家"
 
-#: session_metadata_dialog.cc:757
+#: session_metadata_dialog.cc:760
 msgid "Conductor"
 msgstr "指挥家"
 
-#: session_metadata_dialog.cc:760
+#: session_metadata_dialog.cc:763
 msgid "Remixer"
 msgstr "混音师"
 
-#: session_metadata_dialog.cc:763
+#: session_metadata_dialog.cc:766
 msgid "Arranger"
 msgstr "编曲者"
 
-#: session_metadata_dialog.cc:766
+#: session_metadata_dialog.cc:769
 msgid "Engineer"
 msgstr "工程师"
 
-#: session_metadata_dialog.cc:769
+#: session_metadata_dialog.cc:772
 msgid "Producer"
 msgstr "制片人"
 
-#: session_metadata_dialog.cc:772
+#: session_metadata_dialog.cc:775
 msgid "DJ Mixer"
 msgstr "DJ 混音器"
 
-#: session_metadata_dialog.cc:775
+#: session_metadata_dialog.cc:778
 msgid "Metadata|Mixer"
 msgstr "元数据|混音器"
 
-#: session_metadata_dialog.cc:783
+#: session_metadata_dialog.cc:786
 msgid "School"
 msgstr "院校"
 
-#: session_metadata_dialog.cc:788
+#: session_metadata_dialog.cc:791
 msgid "Instructor"
-msgstr "指导员"
+msgstr "导师"
 
-#: session_metadata_dialog.cc:791
+#: session_metadata_dialog.cc:794
 msgid "Course"
 msgstr "过程"
 
-#: session_metadata_dialog.cc:799
+#: session_metadata_dialog.cc:802
 msgid "Edit Session Metadata"
-msgstr "标记会话元数据"
+msgstr "编辑会话元数据"
 
-#: session_metadata_dialog.cc:830
+#: session_metadata_dialog.cc:833
 msgid "Import session metadata"
 msgstr "导入会话元数据"
 
-#: session_metadata_dialog.cc:851
+#: session_metadata_dialog.cc:854
 msgid "Choose session to import metadata from"
 msgstr "选择导入元数据的来源会话"
 
-#: session_metadata_dialog.cc:889
+#: session_metadata_dialog.cc:892
 msgid "This session file could not be read!"
 msgstr "此会话文件无法读取!"
 
-#: session_metadata_dialog.cc:899
+#: session_metadata_dialog.cc:902
 msgid ""
 "The session file didn't contain metadata!\n"
 "Maybe this is an old session format?"
@@ -11009,13 +13187,13 @@ msgstr ""
 "此会话文件不包含元数据!\n"
 "也许这是一个旧的会话格式?"
 
-#: session_metadata_dialog.cc:918
+#: session_metadata_dialog.cc:921
 msgid "Import all from:"
-msgstr "导入所有从:"
+msgstr "导入所有来自于:"
 
 #: session_option_editor.cc:32
 msgid "Session Properties"
-msgstr "会话属性 "
+msgstr "会话属性"
 
 #: session_option_editor.cc:41
 msgid "Timecode Settings"
@@ -11107,13 +13285,15 @@ msgstr ""
 
 #: session_option_editor.cc:84
 msgid ""
-"Use Video File's FPS Instead of Timecode Value for Timeline and Video Monitor."
-msgstr "为时间线和视频监控使用视频文件的 FPS 替代时间码数值。"
+"Use Video File's FPS Instead of Timecode Value for Timeline and Video "
+"Monitor."
+msgstr "为时间线和视频监控使用视频文件的 FPS(帧率)替代时间码数值。"
 
 #: session_option_editor.cc:91
 msgid ""
-"Apply Pull-Up/Down to Video Timeline and Video Monitor (Unless using JACK-sync)."
-msgstr "应用上拉/下拉到视频时间线和视频监控(除非使用 JACK-同步)"
+"Apply Pull-Up/Down to Video Timeline and Video Monitor (Unless using JACK-"
+"sync)."
+msgstr "应用上拉/下拉到视频时间线和视频监控(除非使用 JACK-同步)。"
 
 #: session_option_editor.cc:96
 msgid "Ext Timecode Offsets"
@@ -11125,234 +13305,260 @@ msgstr "从属时间码偏移"
 
 #: session_option_editor.cc:107
 msgid "The specified offset is added to the received timecode (MTC or LTC)."
-msgstr "指定的偏移已被添加到已接收的时间码(MTC 或 LTC)。"
+msgstr ""
+"指定的偏移已被添加到已接收的时间码(MTC “时间码”或 LTC “纵向时间码”)。"
 
 #: session_option_editor.cc:113
 msgid "Timecode Generator offset"
 msgstr "时间码生成器偏移"
 
 #: session_option_editor.cc:120
-msgid "Specify an offset which is added to the generated timecode (so far only LTC)."
-msgstr "指定一个已被添加到通用时间码的偏移(迄今为止仅有 LTC)。"
+msgid ""
+"Specify an offset which is added to the generated timecode (so far only LTC)."
+msgstr "指定一个已被添加到通用时间码的偏移(迄今为止仅有 LTC “纵向时间码”)。"
 
 #: session_option_editor.cc:124
 msgid "JACK Transport/Time Settings"
 msgstr "JACK 播送/时间设置"
 
 #: session_option_editor.cc:128
-msgid "%1 is JACK Time Master (provides Bar|Beat|Tick and other information to JACK)"
+msgid ""
+"%1 is JACK Time Master (provides Bar|Beat|Tick and other information to JACK)"
 msgstr "%1 是 JACK 时间主控(提供小节|拍子|识别声以及其它信息给 JACK)"
 
 #: session_option_editor.cc:136
 msgid "destructive-xfade-seconds"
-msgstr "销毁前置后置淡化秒数"
+msgstr "销毁xfade(前置后置于淡化器)秒数"
 
 #: session_option_editor.cc:137
 msgid "Destructive crossfade length"
 msgstr "销毁交叉淡化长度"
 
 #: session_option_editor.cc:146
+msgid "Declick when transport starts and stops"
+msgstr "播送启动和停止时不发出按键音"
+
+#: session_option_editor.cc:153
+msgid "Declick when monitor state changes"
+msgstr "监控状态改变时不发出按键音"
+
+#: session_option_editor.cc:160
 msgid "Region fades active"
 msgstr "区域淡化激活"
 
-#: session_option_editor.cc:153
+#: session_option_editor.cc:167
 msgid "Region fades visible"
 msgstr "区域淡化可见"
 
-#: session_option_editor.cc:160 session_option_editor.cc:173
-#: session_option_editor.cc:187
+#: session_option_editor.cc:174 session_option_editor.cc:187
+#: session_option_editor.cc:208
 msgid "Media"
 msgstr "媒体"
 
-#: session_option_editor.cc:160
+#: session_option_editor.cc:174
 msgid "Audio file format"
 msgstr "音频文件格式"
 
-#: session_option_editor.cc:164
+#: session_option_editor.cc:178
 msgid "Sample format"
-msgstr "采样格式"
+msgstr "样本格式"
 
-#: session_option_editor.cc:169
+#: session_option_editor.cc:183
 msgid "32-bit floating point"
-msgstr "32 位浮点"
+msgstr "32位浮点"
 
-#: session_option_editor.cc:170
+#: session_option_editor.cc:184
 msgid "24-bit integer"
-msgstr "24 位整数"
+msgstr "24位整数"
 
-#: session_option_editor.cc:171
+#: session_option_editor.cc:185
 msgid "16-bit integer"
-msgstr "16 位整数"
+msgstr "16位整数"
 
-#: session_option_editor.cc:177
+#: session_option_editor.cc:191
 msgid "File type"
 msgstr "文件类型"
 
-#: session_option_editor.cc:182
-msgid "Broadcast WAVE"
-msgstr "广播 WAVE"
+#: session_option_editor.cc:196
+msgid "Broadcast WAVE (4GB size limit)"
+msgstr "广播 WAVE(4GB 大小限制)"
 
-#: session_option_editor.cc:183
-msgid "WAVE"
-msgstr ""
+#: session_option_editor.cc:198
+msgid "Broadcast RF64"
+msgstr "广播 RF64"
 
-#: session_option_editor.cc:184
+#: session_option_editor.cc:200
+msgid "WAVE (4GB size limit)"
+msgstr "WAVE(4GB 大小限制)"
+
+#: session_option_editor.cc:201
 msgid "WAVE-64"
 msgstr ""
 
-#: session_option_editor.cc:189
+#: session_option_editor.cc:205
+msgid "RF64 (WAV compatible)"
+msgstr "RF64(WAV 兼容)"
+
+#: session_option_editor.cc:210 session_option_editor.cc:216
+#: session_option_editor.cc:223
+msgid "Files|Locations"
+msgstr "文件|位置"
+
+#: session_option_editor.cc:210
 msgid "File locations"
 msgstr "文件位置"
 
-#: session_option_editor.cc:191
+#: session_option_editor.cc:212
 msgid "Search for audio files in:"
 msgstr "搜索音频文件于:"
 
-#: session_option_editor.cc:197
+#: session_option_editor.cc:218
 msgid "Search for MIDI files in:"
 msgstr "搜索 MIDI 文件于:"
 
-#: session_option_editor.cc:206 session_option_editor.cc:218
-#: session_option_editor.cc:228 session_option_editor.cc:239
+#: session_option_editor.cc:227 session_option_editor.cc:239
+#: session_option_editor.cc:249 session_option_editor.cc:260
 msgid "Filenames"
 msgstr "文件名"
 
-#: session_option_editor.cc:206
+#: session_option_editor.cc:227
 msgid "File Naming"
-msgstr "文件命名"
+msgstr "文件命名中"
 
-#: session_option_editor.cc:212
+#: session_option_editor.cc:233
 msgid "Prefix Track number"
 msgstr "音轨编号前缀"
 
-#: session_option_editor.cc:217
-msgid "Adds the current track number to the beginning of the recorded file name."
+#: session_option_editor.cc:238
+msgid ""
+"Adds the current track number to the beginning of the recorded file name."
 msgstr "添加当前音轨编号到已录制文件名的前端。"
 
-#: session_option_editor.cc:222
+#: session_option_editor.cc:243
 msgid "Prefix Take Name"
 msgstr "磁带名称前缀"
 
-#: session_option_editor.cc:227
+#: session_option_editor.cc:248
 msgid "Adds the Take Name to the beginning of the recorded file name."
 msgstr "添加磁带名称到已录制文件名的前端。"
 
-#: session_option_editor.cc:232
+#: session_option_editor.cc:253
 msgid "Take Name"
 msgstr "磁带名称"
 
-#: session_option_editor.cc:245
-msgid "Track Input Monitoring automatically follows transport state (\"auto-input\")"
+#: session_option_editor.cc:266
+msgid ""
+"Track Input Monitoring automatically follows transport state (\"auto-input\")"
 msgstr "音轨输入监控自动化跟随播送状态(“自动输入”)"
 
-#: session_option_editor.cc:252
+#: session_option_editor.cc:273
 msgid "Use monitor section in this session"
-msgstr "在该会话中使用的监控面"
-
-#: session_option_editor.cc:257 session_option_editor.cc:259
-#: session_option_editor.cc:266 session_option_editor.cc:273
-#: session_option_editor.cc:280 session_option_editor.cc:282
-#: session_option_editor.cc:289 session_option_editor.cc:296
-#: session_option_editor.cc:303 session_option_editor.cc:310
-#: session_option_editor.cc:312
+msgstr "在该会话中使用的监控部分"
+
+#: session_option_editor.cc:278 session_option_editor.cc:280
+#: session_option_editor.cc:287 session_option_editor.cc:294
+#: session_option_editor.cc:301 session_option_editor.cc:303
+#: session_option_editor.cc:310 session_option_editor.cc:317
+#: session_option_editor.cc:324 session_option_editor.cc:331
+#: session_option_editor.cc:333
 msgid "Meterbridge"
 msgstr "节拍桥接"
 
-#: session_option_editor.cc:257
+#: session_option_editor.cc:278
 msgid "Route Display"
 msgstr "路由显示"
 
-#: session_option_editor.cc:261
+#: session_option_editor.cc:282
 msgid "Show Midi Tracks"
 msgstr "显示 MIDI 音轨"
 
-#: session_option_editor.cc:268
+#: session_option_editor.cc:289
 msgid "Show Busses"
 msgstr "显示总线"
 
-#: session_option_editor.cc:275
+#: session_option_editor.cc:296
 msgid "Include Master Bus"
 msgstr "包括主控总线"
 
-#: session_option_editor.cc:280
+#: session_option_editor.cc:301
 msgid "Button Area"
 msgstr "按钮区域"
 
-#: session_option_editor.cc:284
+#: session_option_editor.cc:305
 msgid "Rec-enable Button"
 msgstr "可录制按钮"
 
-#: session_option_editor.cc:291
+#: session_option_editor.cc:312
 msgid "Mute Button"
 msgstr "静音按钮"
 
-#: session_option_editor.cc:298
+#: session_option_editor.cc:319
 msgid "Solo Button"
 msgstr "独奏按钮"
 
-#: session_option_editor.cc:305
+#: session_option_editor.cc:326
 msgid "Monitor Buttons"
 msgstr "监控按钮"
 
-#: session_option_editor.cc:310
+#: session_option_editor.cc:331
 msgid "Name Labels"
 msgstr "名称标签"
 
-#: session_option_editor.cc:314
+#: session_option_editor.cc:335
 msgid "Track Name"
 msgstr "音轨名称"
 
-#: session_option_editor.cc:325
+#: session_option_editor.cc:346
 msgid "MIDI region copies are independent"
 msgstr "MIDI 区域拷贝不受约束"
 
-#: session_option_editor.cc:332
+#: session_option_editor.cc:353
 msgid ""
 "Policy for handling overlapping notes\n"
 " on the same MIDI channel"
 msgstr "处理位于同一个 MIDI 声道上的重叠音符的策略"
 
-#: session_option_editor.cc:337
+#: session_option_editor.cc:358
 msgid "never allow them"
 msgstr "从不允许它们"
 
-#: session_option_editor.cc:338
+#: session_option_editor.cc:359
 msgid "don't do anything in particular"
 msgstr "不做任何特殊处理"
 
-#: session_option_editor.cc:339
+#: session_option_editor.cc:360
 msgid "replace any overlapped existing note"
 msgstr "替换所有已存在的重叠音符"
 
-#: session_option_editor.cc:340
+#: session_option_editor.cc:361
 msgid "shorten the overlapped existing note"
 msgstr "缩短已存在的重叠音符"
 
-#: session_option_editor.cc:341
+#: session_option_editor.cc:362
 msgid "shorten the overlapping new note"
-msgstr "缩短已存在的新音符"
+msgstr "缩短重叠的新音符"
 
-#: session_option_editor.cc:342
+#: session_option_editor.cc:363
 msgid "replace both overlapping notes with a single note"
-msgstr "把重叠的音符替换为一个单个音符"
+msgstr "把重叠的音符替换为一个单独音符"
 
-#: session_option_editor.cc:346
+#: session_option_editor.cc:367
 msgid "Glue to bars and beats"
 msgstr "粘连到小节和拍子"
 
-#: session_option_editor.cc:350
+#: session_option_editor.cc:371
 msgid "Glue new markers to bars and beats"
 msgstr "粘连新的标记到小节和拍子"
 
-#: session_option_editor.cc:357
+#: session_option_editor.cc:378
 msgid "Glue new regions to bars and beats"
 msgstr "粘连新的区域到小节和拍子"
 
-#: session_option_editor.cc:362
+#: session_option_editor.cc:383
 msgid "Defaults"
 msgstr "默认"
 
-#: session_option_editor.cc:364
+#: session_option_editor.cc:385
 msgid "Use these settings as defaults"
 msgstr "使用这些设置作为默认"
 
@@ -11382,214 +13588,198 @@ msgstr "自动播放"
 
 #: sfdb_ui.cc:135 sfdb_ui.cc:324
 msgid "<b>Sound File Information</b>"
-msgstr "<b>声音文件信息</b>"
+msgstr "<b>声音文件信息</b"
 
 #: sfdb_ui.cc:147
 msgid "Timestamp:"
 msgstr "时间戳:"
 
-#: sfdb_ui.cc:149
-msgid "Format:"
-msgstr "格式:"
-
-#: sfdb_ui.cc:188 sfdb_ui.cc:653
+#: sfdb_ui.cc:188 sfdb_ui.cc:659
 msgid "Tags:"
 msgstr "标签:"
 
-#: sfdb_ui.cc:293 sfdb_ui.cc:409
-msgid "Could not read file: %1 (%2)."
-msgstr "无法读取文件: %1 (%2)."
-
 #: sfdb_ui.cc:297
 msgid "<b>Midi File Information</b>"
 msgstr "<b>Midi 文件信息</b>"
 
-#: sfdb_ui.cc:458
-msgid "Could not access soundfile: "
-msgstr "无法访问声音文件: "
-
 #: sfdb_ui.cc:530
 msgid "SoundFileBox: Could not tokenize string: "
-msgstr "声音文件盒:无法令牌化字符串: "
+msgstr "声音文件盒:无法令牌化字符串:"
 
 #: sfdb_ui.cc:550 sfdb_ui.cc:552
 msgid "Search"
 msgstr "搜索"
 
-#: sfdb_ui.cc:576
+#: sfdb_ui.cc:581
 msgid "Audio and MIDI files"
 msgstr "音频和 MIDI 文件"
 
-#: sfdb_ui.cc:579
+#: sfdb_ui.cc:584
 msgid "Audio files"
 msgstr "音频文件"
 
-#: sfdb_ui.cc:582
+#: sfdb_ui.cc:587
 msgid "MIDI files"
 msgstr "MIDI 文件"
 
-#: sfdb_ui.cc:585 add_video_dialog.cc:123
+#: sfdb_ui.cc:590 add_video_dialog.cc:124
 msgid "All files"
 msgstr "所有文件"
 
-#: sfdb_ui.cc:604 add_video_dialog.cc:246
+#: sfdb_ui.cc:609 add_video_dialog.cc:247
 msgid "Browse Files"
 msgstr "浏览文件"
 
-#: sfdb_ui.cc:633
+#: sfdb_ui.cc:638
 msgid "Paths"
 msgstr "路径"
 
-#: sfdb_ui.cc:642
+#: sfdb_ui.cc:647
 msgid "Search Tags"
 msgstr "搜索标签"
 
-#: sfdb_ui.cc:658
+#: sfdb_ui.cc:664
 msgid "Sort:"
 msgstr "排序:"
 
-#: sfdb_ui.cc:666
+#: sfdb_ui.cc:672
 msgid "Longest"
 msgstr "最长"
 
-#: sfdb_ui.cc:667
+#: sfdb_ui.cc:673
 msgid "Shortest"
 msgstr "最短"
 
-#: sfdb_ui.cc:668
+#: sfdb_ui.cc:674
 msgid "Newest"
 msgstr "最新"
 
-#: sfdb_ui.cc:669
+#: sfdb_ui.cc:675
 msgid "Oldest"
 msgstr "最旧"
 
-#: sfdb_ui.cc:670
+#: sfdb_ui.cc:676
 msgid "Most downloaded"
 msgstr "最多下载"
 
-#: sfdb_ui.cc:671
+#: sfdb_ui.cc:677
 msgid "Least downloaded"
 msgstr "最新下载"
 
-#: sfdb_ui.cc:672
+#: sfdb_ui.cc:678
 msgid "Highest rated"
 msgstr "最高评价"
 
-#: sfdb_ui.cc:673
+#: sfdb_ui.cc:679
 msgid "Lowest rated"
 msgstr "最低评价"
 
-#: sfdb_ui.cc:678
+#: sfdb_ui.cc:684
 msgid "More"
 msgstr "更多"
 
-#: sfdb_ui.cc:682
+#: sfdb_ui.cc:688
 msgid "Similar"
 msgstr "类似的"
 
-#: sfdb_ui.cc:694
+#: sfdb_ui.cc:700
 msgid "ID"
 msgstr ""
 
-#: sfdb_ui.cc:695 add_video_dialog.cc:83
+#: sfdb_ui.cc:701 add_video_dialog.cc:84
 msgid "Filename"
 msgstr "文件名"
 
-#: sfdb_ui.cc:697
+#: sfdb_ui.cc:703 time_fx_dialog.cc:154
 msgid "Duration"
 msgstr "音长"
 
-#: sfdb_ui.cc:698
+#: sfdb_ui.cc:704
 msgid "Size"
-msgstr "尺寸"
+msgstr "尺寸大小"
 
-#: sfdb_ui.cc:699
+#: sfdb_ui.cc:705
 msgid "Samplerate"
 msgstr "采样率"
 
-#: sfdb_ui.cc:700
+#: sfdb_ui.cc:706
 msgid "License"
 msgstr "许可证"
 
-#: sfdb_ui.cc:718
+#: sfdb_ui.cc:724
 msgid "Search Freesound"
-msgstr "搜索自由声音"
+msgstr "搜索 Freesound(自由声音)"
 
-#: sfdb_ui.cc:738
-msgid "Press to import selected files and close this window"
-msgstr "按下插入已选中的文件并且关闭此窗口"
+#: sfdb_ui.cc:741
+msgid "Press to import selected files"
+msgstr "按下插入已选中的文件"
 
-#: sfdb_ui.cc:739
-msgid "Press to import selected files and leave this window open"
-msgstr "按下插入已选中的文件并且保留此窗口"
-
-#: sfdb_ui.cc:740
+#: sfdb_ui.cc:742
 msgid "Press to close this window without importing any files"
-msgstr "按下关闭此窗口并且不插入任何文件"
+msgstr "按下关闭此窗口并且不导入任何文件"
 
-#: sfdb_ui.cc:936
+#: sfdb_ui.cc:937
 msgid "SoundFileBrowser: Could not tokenize string: "
-msgstr "声音文件浏览器:无法令牌化字符串: "
+msgstr "声音文件浏览器:无法令牌化字符串:"
 
-#: sfdb_ui.cc:1136
+#: sfdb_ui.cc:1137
 msgid "%1 more page of 100 results available"
 msgid_plural "%1 more pages of 100 results available"
 msgstr[0] "%1 有 100 多页结果可用"
 
-#: sfdb_ui.cc:1141
+#: sfdb_ui.cc:1142
 msgid "No more results available"
 msgstr "无更多结果可用"
 
-#: sfdb_ui.cc:1205
+#: sfdb_ui.cc:1206
 msgid "B"
 msgstr ""
 
-#: sfdb_ui.cc:1207
+#: sfdb_ui.cc:1208
 msgid "kB"
 msgstr ""
 
-#: sfdb_ui.cc:1209 sfdb_ui.cc:1211
+#: sfdb_ui.cc:1210 sfdb_ui.cc:1212
 msgid "MB"
 msgstr ""
 
-#: sfdb_ui.cc:1213
+#: sfdb_ui.cc:1214
 msgid "GB"
 msgstr ""
 
-#: sfdb_ui.cc:1425 sfdb_ui.cc:1738 sfdb_ui.cc:1801 sfdb_ui.cc:1819
+#: sfdb_ui.cc:1431 sfdb_ui.cc:1728 sfdb_ui.cc:1764 sfdb_ui.cc:1782
 msgid "one track per file"
 msgstr "每个文件一个音轨"
 
-#: sfdb_ui.cc:1428 sfdb_ui.cc:1802 sfdb_ui.cc:1820
+#: sfdb_ui.cc:1434 sfdb_ui.cc:1765 sfdb_ui.cc:1783
 msgid "one track per channel"
 msgstr "每个声道一个音轨"
 
-#: sfdb_ui.cc:1436 sfdb_ui.cc:1804 sfdb_ui.cc:1821
+#: sfdb_ui.cc:1442 sfdb_ui.cc:1767 sfdb_ui.cc:1784
 msgid "sequence files"
 msgstr "序列文件"
 
-#: sfdb_ui.cc:1439 sfdb_ui.cc:1809
+#: sfdb_ui.cc:1445 sfdb_ui.cc:1772
 msgid "all files in one track"
 msgstr "所有文件在一个音轨上"
 
-#: sfdb_ui.cc:1440 sfdb_ui.cc:1803
+#: sfdb_ui.cc:1446 sfdb_ui.cc:1766
 msgid "merge files"
 msgstr "合并文件"
 
-#: sfdb_ui.cc:1446 sfdb_ui.cc:1806
+#: sfdb_ui.cc:1452 sfdb_ui.cc:1769
 msgid "one region per file"
 msgstr "每个文件一个区域"
 
-#: sfdb_ui.cc:1449 sfdb_ui.cc:1807
+#: sfdb_ui.cc:1455 sfdb_ui.cc:1770
 msgid "one region per channel"
 msgstr "每个声道一个区域"
 
-#: sfdb_ui.cc:1454 sfdb_ui.cc:1808 sfdb_ui.cc:1822
+#: sfdb_ui.cc:1460 sfdb_ui.cc:1771 sfdb_ui.cc:1785
 msgid "all files in one region"
 msgstr "所有文件在一个区域里"
 
-#: sfdb_ui.cc:1521
+#: sfdb_ui.cc:1527
 msgid ""
 "One or more of the selected files\n"
 "cannot be used by %1"
@@ -11597,104 +13787,104 @@ msgstr ""
 "一个或多个已选中的文件\n"
 "不能被用于 %1"
 
-#: sfdb_ui.cc:1665
+#: sfdb_ui.cc:1671
 msgid "Copy files to session"
 msgstr "复制文件到会话"
 
-#: sfdb_ui.cc:1682 sfdb_ui.cc:1859
+#: sfdb_ui.cc:1686 sfdb_ui.cc:1825
 msgid "file timestamp"
 msgstr "文件时间戳"
 
-#: sfdb_ui.cc:1683 sfdb_ui.cc:1861
+#: sfdb_ui.cc:1687 sfdb_ui.cc:1827
 msgid "edit point"
 msgstr "编辑点"
 
-#: sfdb_ui.cc:1684 sfdb_ui.cc:1863
+#: sfdb_ui.cc:1688 sfdb_ui.cc:1829
 msgid "playhead"
 msgstr "指针"
 
-#: sfdb_ui.cc:1685
+#: sfdb_ui.cc:1689
 msgid "session start"
 msgstr "会话起点"
 
-#: sfdb_ui.cc:1691
-msgid "<b>Add files as ...</b>"
+#: sfdb_ui.cc:1695
+msgid "<b>Add files ...</b>"
 msgstr "<b>添加文件为…</b>"
 
-#: sfdb_ui.cc:1713
+#: sfdb_ui.cc:1700
 msgid "<b>Insert at</b>"
 msgstr "<b>插入于</b>"
 
-#: sfdb_ui.cc:1726
+#: sfdb_ui.cc:1705
 msgid "<b>Mapping</b>"
 msgstr "<b>映射</b>"
 
-#: sfdb_ui.cc:1744
+#: sfdb_ui.cc:1710
 msgid "<b>Conversion quality</b>"
 msgstr "<b>转换质量</b>"
 
-#: sfdb_ui.cc:1756
+#: sfdb_ui.cc:1715
 msgid "<b>Instrument</b>"
 msgstr "<b>乐器</b>"
 
-#: sfdb_ui.cc:1768 sfdb_ui.cc:1875
+#: sfdb_ui.cc:1734 sfdb_ui.cc:1841
 msgid "Best"
 msgstr "最佳"
 
-#: sfdb_ui.cc:1769 sfdb_ui.cc:1877
+#: sfdb_ui.cc:1735 sfdb_ui.cc:1843
 msgid "Good"
 msgstr "好"
 
-#: sfdb_ui.cc:1770 sfdb_ui.cc:1879
+#: sfdb_ui.cc:1736 sfdb_ui.cc:1845
 msgid "Quick"
 msgstr "å¿«"
 
-#: sfdb_ui.cc:1772
+#: sfdb_ui.cc:1738
 msgid "Fastest"
 msgstr "最快"
 
-#: shuttle_control.cc:56
+#: shuttle_control.cc:64
 msgid "Shuttle speed control (Context-click for options)"
 msgstr "往复速度控制(右键点击查看更多选项)"
 
-#: shuttle_control.cc:174
+#: shuttle_control.cc:201 time_fx_dialog.cc:164
 msgid "Percent"
 msgstr "百分比"
 
-#: shuttle_control.cc:182
+#: shuttle_control.cc:209
 msgid "Units"
 msgstr "单位"
 
-#: shuttle_control.cc:188 shuttle_control.cc:609
+#: shuttle_control.cc:215 shuttle_control.cc:671
 msgid "Sprung"
 msgstr "弹动"
 
-#: shuttle_control.cc:192 shuttle_control.cc:612
+#: shuttle_control.cc:219 shuttle_control.cc:674
 msgid "Wheel"
 msgstr "轮转"
 
-#: shuttle_control.cc:226
+#: shuttle_control.cc:253
 msgid "Maximum speed"
 msgstr "最大速度"
 
-#: shuttle_control.cc:568
+#: shuttle_control.cc:256
+msgid "Reset to 100%"
+msgstr "重置到 100%"
+
+#: shuttle_control.cc:633
 msgid "Playing"
 msgstr "播放中"
 
-#: shuttle_control.cc:583
+#: shuttle_control.cc:648
 #, c-format
 msgid "<<< %+d semitones"
 msgstr "<<< %+d 半音"
 
-#: shuttle_control.cc:585
+#: shuttle_control.cc:650
 #, c-format
 msgid ">>> %+d semitones"
 msgstr ">>> %+d 半音"
 
-#: shuttle_control.cc:590
-msgid "Stopped"
-msgstr "已停止"
-
 #: soundcloud_export_selector.cc:44
 msgid "User Email"
 msgstr "用户电子信箱"
@@ -11705,7 +13895,7 @@ msgstr "密码"
 
 #: soundcloud_export_selector.cc:46
 msgid "Make files public"
-msgstr "文件公开"
+msgstr "公开文件"
 
 #: soundcloud_export_selector.cc:47
 msgid "Open uploaded files in browser"
@@ -11719,7 +13909,7 @@ msgstr "文件可下载"
 msgid "%1: %2 of %3 bytes uploaded"
 msgstr "%1: %2 的 %3 字节已上传"
 
-#: splash.cc:73
+#: splash.cc:78
 msgid "%1 loading ..."
 msgstr "%1 载入中…"
 
@@ -11735,41 +13925,42 @@ msgstr "移除扬声器"
 msgid "Azimuth:"
 msgstr "方位角:"
 
-#: startup.cc:67
+#: startup.cc:71
 msgid ""
 "Use an external mixer or the hardware mixer of your audio interface.\n"
 "%1 will play NO role in monitoring"
 msgstr ""
 "使用一个外部混音器或您的音频接口硬件混音器。\n"
-"%1 将不会出现在监控中"
+"%1 在监控中将不会起作用"
 
-#: startup.cc:69
+#: startup.cc:73
 msgid "Ask %1 to play back material as it is being recorded"
 msgstr "当 %1 被录制时请求其回放材料"
 
-#: startup.cc:142
+#: startup.cc:146
 msgid ""
-"<span size=\"larger\">%1 is a digital audio workstation. You can use it to record, "
-"edit and mix multi-track audio. You can produce your own CDs, mix video "
-"soundtracks, or experiment with new ideas about music and sound. \n"
+"<span size=\"larger\">%1 is a digital audio workstation. You can use it to "
+"record, edit and mix multi-track audio. You can produce your own CDs, mix "
+"video soundtracks, or experiment with new ideas about music and sound. \n"
 "\n"
 "There are a few things that need to be configured before you start using the "
 "program.</span> "
 msgstr ""
-"<span size=\"larger\">%1 是一个数字音频工作站。您可以用它录制、编辑并混合多声道音"
-"频。您可以创作自己的CD光盘、混合视频音轨、或者试验与音乐和声音有关的新想法。\n"
+"<span size=\"larger\">%1 是一个数字音频工作站。您可以用它录制、编辑并混合多声"
+"道音频。您可以创作自己的CD光盘、混合视频音轨、或者试验与音乐和声音有关的新想"
+"法。\n"
 "\n"
 "在您开始使用这个程序之前,需要完成一些配置。</span> "
 
-#: startup.cc:168
+#: startup.cc:172
 msgid "Welcome to %1"
 msgstr "欢迎使用 %1"
 
-#: startup.cc:191
+#: startup.cc:195
 msgid "Default folder for %1 sessions"
 msgstr "会话 %1 的默认文件夹"
 
-#: startup.cc:197
+#: startup.cc:201
 msgid ""
 "Each project that you work on with %1 has its own folder.\n"
 "These can require a lot of disk space if you are recording audio.\n"
@@ -11785,11 +13976,11 @@ msgstr ""
 "\n"
 "<i>(您可以把新的会话存放在任何位置,这里只是默认文件夹)</i>"
 
-#: startup.cc:220
+#: startup.cc:224
 msgid "Default folder for new sessions"
 msgstr "新会话的默认文件夹"
 
-#: startup.cc:241
+#: startup.cc:245
 msgid ""
 "While recording instruments or vocals, you probably want to listen to the\n"
 "signal as well as record it. This is called \"monitoring\". There are\n"
@@ -11797,7 +13988,8 @@ msgid ""
 "configuration of that equipment. The two most common are presented here.\n"
 "Please choose whichever one is right for your setup.\n"
 "\n"
-"<i>(You can change this preference at any time, via the Preferences dialog)</i>\n"
+"<i>(You can change this preference at any time, via the Preferences dialog)</"
+"i>\n"
 "\n"
 "<i>If you do not understand what this is about, just accept the default.</i>"
 msgstr ""
@@ -11811,25 +14003,25 @@ msgstr ""
 "\n"
 "<i>如果您不大了解这方面的信息,保持默认即可。</i>"
 
-#: startup.cc:262
+#: startup.cc:266
 msgid "Monitoring Choices"
-msgstr "监控选择"
+msgstr "监控中选择"
 
-#: startup.cc:285
+#: startup.cc:289
 msgid "Use a Master bus directly"
 msgstr "直接使用主控总线"
 
-#: startup.cc:287
+#: startup.cc:291
 msgid ""
-"Connect the Master bus directly to your hardware outputs. This is preferable for "
-"simple usage."
+"Connect the Master bus directly to your hardware outputs. This is preferable "
+"for simple usage."
 msgstr "直接连接主控总线到您的硬件输出。这可能更简单易用。"
 
-#: startup.cc:296
+#: startup.cc:300
 msgid "Use an additional Monitor bus"
 msgstr "使用一个额外的监控总线"
 
-#: startup.cc:299
+#: startup.cc:303
 msgid ""
 "Use a Monitor bus between Master bus and hardware outputs for \n"
 "greater control in monitoring without affecting the mix."
@@ -11837,7 +14029,7 @@ msgstr ""
 "在主控总线和硬件输入之间使用一个监控总线\n"
 "监控时可更好的控制,不会影响混音。"
 
-#: startup.cc:321
+#: startup.cc:325
 msgid ""
 "<i>You can change this preference at any time via the Preferences dialog.\n"
 "You can also add or remove the monitor section to/from any session.</i>\n"
@@ -11845,50 +14037,46 @@ msgid ""
 "<i>If you do not understand what this is about, just accept the default.</i>"
 msgstr ""
 "<i>您可以在任何时候改变这个首选项,就在首选项对话框里。\n"
-"您也可以添加监控面到任何会话,或着从任何会话移除监控面。</i>\n"
+"您也可以添加监控部分到任何会话,或着从任何会话移除监控面。</i>\n"
 "\n"
 "<i>如果您不大了解这方面的信息,保持默认即可。</i>"
 
-#: startup.cc:332
+#: startup.cc:336
 msgid "Monitor Section"
-msgstr "监控面"
+msgstr "监控部分"
 
-#: step_entry.cc:60
+#: step_entry.cc:59
 msgid "Step Entry: %1"
 msgstr "步进入口:%1"
 
-#: step_entry.cc:65
+#: step_entry.cc:64
 msgid ">beat"
 msgstr ">拍子"
 
-#: step_entry.cc:66
+#: step_entry.cc:65
 msgid ">bar"
 msgstr ">小节"
 
-#: step_entry.cc:67
+#: step_entry.cc:66
 msgid ">EP"
 msgstr ">采样"
 
-#: step_entry.cc:68
+#: step_entry.cc:67
 msgid "sustain"
 msgstr "持续"
 
-#: step_entry.cc:69
+#: step_entry.cc:68
 msgid "rest"
 msgstr "休止"
 
-#: step_entry.cc:70
+#: step_entry.cc:69
 msgid "g-rest"
 msgstr "g-休止"
 
-#: step_entry.cc:71
+#: step_entry.cc:70
 msgid "back"
 msgstr "后退"
 
-#: step_entry.cc:82 step_entry.cc:85
-msgid "+"
-msgstr ""
-
 #: step_entry.cc:191
 msgid "Set note length to a whole note"
 msgstr "设置音符长度为全音符"
@@ -11997,11 +14185,11 @@ msgstr "插入一个库变换信息"
 msgid "Insert a program change message"
 msgstr "插入一个程式变换信息"
 
-#: step_entry.cc:343 step_entry.cc:700
+#: step_entry.cc:343 step_entry.cc:645
 msgid "Move Insert Position Back by Note Length"
 msgstr "按音符长度向后移动插入位置"
 
-#: step_entry.cc:344 step_entry.cc:698
+#: step_entry.cc:344 step_entry.cc:643
 msgid "Move Insert Position to Edit Point"
 msgstr "移动插入位置到编辑位置"
 
@@ -12013,240 +14201,244 @@ msgstr "1/音符"
 msgid "Octave"
 msgstr "八度"
 
-#: step_entry.cc:598
+#: step_entry.cc:592
 msgid "Insert Note A"
-msgstr "插入音符A"
+msgstr "插入音符 A"
 
-#: step_entry.cc:599
+#: step_entry.cc:593
 msgid "Insert Note A-sharp"
-msgstr "插入音符A#"
+msgstr "插入音符 A#"
 
-#: step_entry.cc:600
+#: step_entry.cc:594
 msgid "Insert Note B"
-msgstr "插入音符B"
+msgstr "插入音符 B"
 
-#: step_entry.cc:601
+#: step_entry.cc:595
 msgid "Insert Note C"
-msgstr "插入音符C"
+msgstr "插入音符 C"
 
-#: step_entry.cc:602
+#: step_entry.cc:596
 msgid "Insert Note C-sharp"
-msgstr "插入音符C#"
+msgstr "插入音符 C#"
 
-#: step_entry.cc:603
+#: step_entry.cc:597
 msgid "Insert Note D"
-msgstr "插入音符D"
+msgstr "插入音符 D"
 
-#: step_entry.cc:604
+#: step_entry.cc:598
 msgid "Insert Note D-sharp"
-msgstr "插入音符D#"
+msgstr "插入音符 D#"
 
-#: step_entry.cc:605
+#: step_entry.cc:599
 msgid "Insert Note E"
-msgstr "插入音符E"
+msgstr "插入音符 E"
 
-#: step_entry.cc:606
+#: step_entry.cc:600
 msgid "Insert Note F"
-msgstr "插入音符F"
+msgstr "插入音符 F"
 
-#: step_entry.cc:607
+#: step_entry.cc:601
 msgid "Insert Note F-sharp"
-msgstr "插入音符F#"
+msgstr "插入音符 F#"
 
-#: step_entry.cc:608
+#: step_entry.cc:602
 msgid "Insert Note G"
 msgstr "插入音符G"
 
-#: step_entry.cc:609
+#: step_entry.cc:603
 msgid "Insert Note G-sharp"
-msgstr "插入音符G#"
+msgstr "插入音符 G#"
 
-#: step_entry.cc:611
+#: step_entry.cc:605
 msgid "Insert a Note-length Rest"
 msgstr "插入一个全休止符"
 
-#: step_entry.cc:612
+#: step_entry.cc:606
 msgid "Insert a Snap-length Rest"
 msgstr "插入一个吸附长度的休止符"
 
-#: step_entry.cc:614 step_entry.cc:615
+#: step_entry.cc:608 step_entry.cc:609
 msgid "Move to next octave"
 msgstr "移动到下一个八度"
 
-#: step_entry.cc:617
+#: step_entry.cc:611
 msgid "Move to Next Note Length"
 msgstr "移动到下一个音符长度"
 
-#: step_entry.cc:618
+#: step_entry.cc:612
 msgid "Move to Previous Note Length"
 msgstr "移动到上一个音符长度"
 
-#: step_entry.cc:620
+#: step_entry.cc:614
 msgid "Increase Note Length"
 msgstr "增加音符长度"
 
-#: step_entry.cc:621
+#: step_entry.cc:615
 msgid "Decrease Note Length"
 msgstr "减少音符长度"
 
-#: step_entry.cc:623
+#: step_entry.cc:617
 msgid "Move to Next Note Velocity"
 msgstr "移动到下一个音符力度"
 
-#: step_entry.cc:624
+#: step_entry.cc:618
 msgid "Move to Previous Note Velocity"
 msgstr "移动到上一个音符力度"
 
-#: step_entry.cc:626
+#: step_entry.cc:620
 msgid "Increase Note Velocity"
 msgstr "增加音符力度"
 
-#: step_entry.cc:627
+#: step_entry.cc:621
 msgid "Decrease Note Velocity"
 msgstr "减少音符力度"
 
-#: step_entry.cc:629
+#: step_entry.cc:623
 msgid "Switch to the 1st octave"
 msgstr "切换到第一个八度"
 
-#: step_entry.cc:630
+#: step_entry.cc:624
 msgid "Switch to the 2nd octave"
 msgstr "切换到第二个八度"
 
-#: step_entry.cc:631
+#: step_entry.cc:625
 msgid "Switch to the 3rd octave"
 msgstr "切换到第三个八度"
 
-#: step_entry.cc:632
+#: step_entry.cc:626
 msgid "Switch to the 4th octave"
 msgstr "切换到第四个八度"
 
-#: step_entry.cc:633
+#: step_entry.cc:627
 msgid "Switch to the 5th octave"
 msgstr "切换到第五个八度"
 
-#: step_entry.cc:634
+#: step_entry.cc:628
 msgid "Switch to the 6th octave"
 msgstr "切换到第六个八度"
 
-#: step_entry.cc:635
+#: step_entry.cc:629
 msgid "Switch to the 7th octave"
 msgstr "切换到第七个八度"
 
-#: step_entry.cc:636
+#: step_entry.cc:630
 msgid "Switch to the 8th octave"
 msgstr "切换到第八个八度"
 
-#: step_entry.cc:637
+#: step_entry.cc:631
 msgid "Switch to the 9th octave"
 msgstr "切换到第九个八度"
 
-#: step_entry.cc:638
+#: step_entry.cc:632
 msgid "Switch to the 10th octave"
 msgstr "切换到第十个八度"
 
-#: step_entry.cc:639
+#: step_entry.cc:633
 msgid "Switch to the 11th octave"
 msgstr "切换到第十一个八度"
 
-#: step_entry.cc:644
+#: step_entry.cc:635
+msgid "Toggle Triple Notes"
+msgstr "切换三分音符"
+
+#: step_entry.cc:638
+msgid "Toggle Chord Entry"
+msgstr "切换和弦入口"
+
+#: step_entry.cc:640
+msgid "Sustain Selected Notes by Note Length"
+msgstr "通过音符长度持续已选择的音符"
+
+#: step_entry.cc:650
 msgid "Set Note Length to Whole"
-msgstr "设置为全音符"
+msgstr "设置音符长度为全音符"
 
-#: step_entry.cc:646
+#: step_entry.cc:652
 msgid "Set Note Length to 1/2"
-msgstr "设置为二分音符"
+msgstr "设置音符长度为二分音符"
 
-#: step_entry.cc:648
+#: step_entry.cc:654
 msgid "Set Note Length to 1/3"
-msgstr "设置为三分音符"
+msgstr "设置音符长度为三分音符"
 
-#: step_entry.cc:650
+#: step_entry.cc:656
 msgid "Set Note Length to 1/4"
-msgstr "设置为四分音符"
+msgstr "设置音符长度为四分音符"
 
-#: step_entry.cc:652
+#: step_entry.cc:658
 msgid "Set Note Length to 1/8"
-msgstr "设置为八分音符"
+msgstr "设置音符长度为八分音符"
 
-#: step_entry.cc:654
+#: step_entry.cc:660
 msgid "Set Note Length to 1/16"
-msgstr "设置为十六分音符"
+msgstr "设置音符长度为十六分音符"
 
-#: step_entry.cc:656
+#: step_entry.cc:662
 msgid "Set Note Length to 1/32"
-msgstr "设置为三十二分音符"
+msgstr "设置音符长度为三十二分音符"
 
-#: step_entry.cc:658
+#: step_entry.cc:664
 msgid "Set Note Length to 1/64"
-msgstr "设置为六十四分音符"
+msgstr "设置音符长度为六十四分音符"
 
-#: step_entry.cc:663
+#: step_entry.cc:669
 msgid "Set Note Velocity to Pianississimo"
 msgstr "设置音符力度为最弱音"
 
-#: step_entry.cc:665
+#: step_entry.cc:671
 msgid "Set Note Velocity to Pianissimo"
 msgstr "设置音符力度为极弱音"
 
-#: step_entry.cc:667
+#: step_entry.cc:673
 msgid "Set Note Velocity to Piano"
 msgstr "设置音符力度为弱音"
 
-#: step_entry.cc:669
+#: step_entry.cc:675
 msgid "Set Note Velocity to Mezzo-Piano"
 msgstr "设置音符力度为中弱音"
 
-#: step_entry.cc:671
+#: step_entry.cc:677
 msgid "Set Note Velocity to Mezzo-Forte"
 msgstr "设置音符力度为中强音"
 
-#: step_entry.cc:673
+#: step_entry.cc:679
 msgid "Set Note Velocity to Forte"
 msgstr "设置音符力度为强音"
 
-#: step_entry.cc:675 step_entry.cc:677
+#: step_entry.cc:681 step_entry.cc:683
 msgid "Set Note Velocity to Fortississimo"
 msgstr "设置音符力度为最强音"
 
-#: step_entry.cc:679
-msgid "Toggle Triple Notes"
-msgstr "切换三分音符"
-
-#: step_entry.cc:684
+#: step_entry.cc:688
 msgid "No Dotted Notes"
 msgstr "无带点音符"
 
-#: step_entry.cc:686
+#: step_entry.cc:689
 msgid "Toggled Dotted Notes"
 msgstr "切换带点音符"
 
-#: step_entry.cc:688
+#: step_entry.cc:690
 msgid "Toggled Double-Dotted Notes"
 msgstr "切换带双点音符"
 
-#: step_entry.cc:690
+#: step_entry.cc:691
 msgid "Toggled Triple-Dotted Notes"
 msgstr "切换带三点音符"
 
-#: step_entry.cc:693
-msgid "Toggle Chord Entry"
-msgstr "切换和弦入口"
-
-#: step_entry.cc:695
-msgid "Sustain Selected Notes by Note Length"
-msgstr "通过音符长度持续已选择的音符"
-
-#: stereo_panner.cc:133
+#: stereo_panner.cc:129
 #, c-format
 msgid "L:%3d R:%3d Width:%d%%"
 msgstr "左:%3d 右:%3d 宽度:%d%%"
 
-#: stereo_panner_editor.cc:35
+#: stereo_panner.cc:272
+msgid "Panner|M"
+msgstr "声相器|M"
+
+#: stereo_panner_editor.cc:37
 msgid "Stereo Panner"
-msgstr "立体声面板"
+msgstr "立体声声相器"
 
-#: stereo_panner_editor.cc:49
+#: stereo_panner_editor.cc:51
 msgid "Width"
 msgstr "宽度"
 
@@ -12254,263 +14446,290 @@ msgstr "宽度"
 msgid "Strip Silence"
 msgstr "片段无声"
 
-#: strip_silence_dialog.cc:75
+#: strip_silence_dialog.cc:65
+msgid "Threshold"
+msgstr "临界值"
+
+#: strip_silence_dialog.cc:76
 msgid "Minimum length"
 msgstr "最小长度"
 
-#: strip_silence_dialog.cc:83
+#: strip_silence_dialog.cc:84
 msgid "Fade length"
 msgstr "淡化长度"
 
-#: tempo_dialog.cc:41 tempo_dialog.cc:57
+#: strip_silence_dialog.cc:111 strip_silence_dialog.cc:298
+msgid "Analyzing"
+msgstr "分析中"
+
+#: tempo_dialog.cc:43 tempo_dialog.cc:60
 msgid "bar:"
 msgstr "小节:"
 
-#: tempo_dialog.cc:42 tempo_dialog.cc:58
+#: tempo_dialog.cc:44 tempo_dialog.cc:61
 msgid "beat:"
 msgstr "拍子:"
 
-#: tempo_dialog.cc:43 tempo_dialog.cc:59
+#: tempo_dialog.cc:45 tempo_dialog.cc:62
 msgid "Pulse note"
 msgstr "脉冲音符"
 
-#: tempo_dialog.cc:44 tempo_dialog.cc:60
+#: tempo_dialog.cc:46 tempo_dialog.cc:63
 msgid "Tap tempo"
 msgstr "节拍节奏"
 
-#: tempo_dialog.cc:54
-msgid "Edit Tempo"
-msgstr "编辑节奏"
-
-#: tempo_dialog.cc:77 tempo_dialog.cc:78 tempo_dialog.cc:324 tempo_dialog.cc:325
+#: tempo_dialog.cc:81 tempo_dialog.cc:82 tempo_dialog.cc:448
+#: tempo_dialog.cc:449
 msgid "whole"
 msgstr "å…¨"
 
-#: tempo_dialog.cc:79 tempo_dialog.cc:80 tempo_dialog.cc:326 tempo_dialog.cc:327
+#: tempo_dialog.cc:83 tempo_dialog.cc:84 tempo_dialog.cc:450
+#: tempo_dialog.cc:451
 msgid "second"
 msgstr "二分之一"
 
-#: tempo_dialog.cc:81 tempo_dialog.cc:82 tempo_dialog.cc:328 tempo_dialog.cc:329
+#: tempo_dialog.cc:85 tempo_dialog.cc:86 tempo_dialog.cc:452
+#: tempo_dialog.cc:453
 msgid "third"
 msgstr "三分之一"
 
-#: tempo_dialog.cc:83 tempo_dialog.cc:84 tempo_dialog.cc:330 tempo_dialog.cc:331
+#: tempo_dialog.cc:87 tempo_dialog.cc:88 tempo_dialog.cc:454
+#: tempo_dialog.cc:455
 msgid "quarter"
 msgstr "四分之一"
 
-#: tempo_dialog.cc:85 tempo_dialog.cc:86 tempo_dialog.cc:332 tempo_dialog.cc:333
+#: tempo_dialog.cc:89 tempo_dialog.cc:90 tempo_dialog.cc:456
+#: tempo_dialog.cc:457
 msgid "eighth"
 msgstr "八分之一"
 
-#: tempo_dialog.cc:87 tempo_dialog.cc:88 tempo_dialog.cc:334 tempo_dialog.cc:335
+#: tempo_dialog.cc:91 tempo_dialog.cc:92 tempo_dialog.cc:458
+#: tempo_dialog.cc:459
 msgid "sixteenth"
 msgstr "十六分之一"
 
-#: tempo_dialog.cc:89 tempo_dialog.cc:90 tempo_dialog.cc:336 tempo_dialog.cc:337
+#: tempo_dialog.cc:93 tempo_dialog.cc:94 tempo_dialog.cc:460
+#: tempo_dialog.cc:461
 msgid "thirty-second"
 msgstr "三十二分之一"
 
-#: tempo_dialog.cc:91 tempo_dialog.cc:92 tempo_dialog.cc:338 tempo_dialog.cc:339
+#: tempo_dialog.cc:95 tempo_dialog.cc:96 tempo_dialog.cc:462
+#: tempo_dialog.cc:463
 msgid "sixty-fourth"
 msgstr "六十四分之一"
 
-#: tempo_dialog.cc:93 tempo_dialog.cc:94 tempo_dialog.cc:340 tempo_dialog.cc:341
+#: tempo_dialog.cc:97 tempo_dialog.cc:98 tempo_dialog.cc:464
+#: tempo_dialog.cc:465
 msgid "one-hundred-twenty-eighth"
 msgstr "一百二十八分之一"
 
-#: tempo_dialog.cc:121
+#: tempo_dialog.cc:115 tempo_dialog.cc:116
+msgid "ramped"
+msgstr "渐变"
+
+#: tempo_dialog.cc:117 tempo_dialog.cc:118
+msgid "constant"
+msgstr "恒量"
+
+#: tempo_dialog.cc:133 tempo_dialog.cc:134 tempo_dialog.cc:482
+#: tempo_dialog.cc:483
+msgid "music"
+msgstr "音乐"
+
+#: tempo_dialog.cc:161
 msgid "Beats per minute:"
 msgstr "每分钟拍子数:"
 
-#: tempo_dialog.cc:155
+#: tempo_dialog.cc:195
 msgid "Tempo begins at"
 msgstr "节奏开始位于"
 
-#: tempo_dialog.cc:251
+#: tempo_dialog.cc:201
+msgid "Lock Style:"
+msgstr "锁定类型:"
+
+#: tempo_dialog.cc:209
+msgid "Tempo Type:"
+msgstr "节奏类型:"
+
+#: tempo_dialog.cc:321
 msgid "incomprehensible pulse note type (%1)"
 msgstr "不可理解的脉冲音符类型(%1)"
 
-#: tempo_dialog.cc:307
-msgid "Edit Meter"
-msgstr "编辑节拍"
+#: tempo_dialog.cc:334
+msgid "incomprehensible tempo type (%1)"
+msgstr "不可理解的节奏类型 (%1)"
 
-#: tempo_dialog.cc:356
+#: tempo_dialog.cc:347
+msgid "incomprehensible lock style (%1)"
+msgstr "不可理解的锁定类型 (%1)"
+
+#: tempo_dialog.cc:498
 msgid "Note value:"
 msgstr "音符值:"
 
-#: tempo_dialog.cc:357
+#: tempo_dialog.cc:499
+msgid "Lock style:"
+msgstr "锁定类型:"
+
+#: tempo_dialog.cc:500
 msgid "Beats per bar:"
 msgstr "每小节拍子数:"
 
-#: tempo_dialog.cc:371
+#: tempo_dialog.cc:514
 msgid "Meter begins at bar:"
 msgstr "节拍开始位于小节:"
 
-#: tempo_dialog.cc:484
+#: tempo_dialog.cc:638
 msgid "incomprehensible meter note type (%1)"
 msgstr "不可理解的节拍音符类型(%1)"
 
-#: theme_manager.cc:65
-msgid "Dark Theme"
-msgstr "深暗主题"
+#: tempo_dialog.cc:651
+msgid "incomprehensible meter lock style (%1)"
+msgstr "不可理解的节拍锁定类型 (%1)"
 
-#: theme_manager.cc:66
-msgid "Light Theme"
-msgstr "明亮主题"
-
-#: theme_manager.cc:67
-msgid "Restore Defaults"
-msgstr "重置恢复默认值"
-
-#: theme_manager.cc:68
+#: theme_manager.cc:53
 msgid "Draw \"flat\" buttons"
 msgstr "描绘“降调”按钮"
 
-#: theme_manager.cc:69
+#: theme_manager.cc:54
 msgid "Blink Rec-Arm buttons"
-msgstr "闪光录制臂按钮"
+msgstr "闪亮录制预备按钮"
 
-#: theme_manager.cc:70
+#: theme_manager.cc:55
 msgid "Color regions using their track's color"
 msgstr "使用区域的音轨颜色作为区域色"
 
-#: theme_manager.cc:71
+#: theme_manager.cc:56
 msgid "Show waveform clipping"
 msgstr "显示波形截波"
 
-#: theme_manager.cc:73
+#: theme_manager.cc:58
 msgid "Waveforms color gradient depth"
 msgstr "波形颜色梯度深度"
 
-#: theme_manager.cc:75
+#: theme_manager.cc:60
 msgid "Timeline item gradient depth"
 msgstr "时间线条目梯度深度"
 
-#: theme_manager.cc:76
+#: theme_manager.cc:61
 msgid "All floating windows are dialogs"
 msgstr "所有浮动窗口都是对话框"
 
-#: theme_manager.cc:77
+#: theme_manager.cc:62
 msgid "Transient windows follow front window."
 msgstr "临时窗口跟随前方窗口。"
 
-#: theme_manager.cc:78
+#: theme_manager.cc:63
+msgid "Float detached monitor-section window"
+msgstr "浮动分离监控部分窗口"
+
+#: theme_manager.cc:64
 msgid "Icon Set"
 msgstr "图标集"
 
-#: theme_manager.cc:87
-msgid "Object"
-msgstr "对象物体"
-
-#: theme_manager.cc:163
-msgid "Items"
-msgstr "条目"
-
-#: theme_manager.cc:164
-msgid "Palette"
-msgstr "调色板"
-
-#: theme_manager.cc:165
-msgid "Transparency"
-msgstr "透明度"
-
-#: theme_manager.cc:195
+#: theme_manager.cc:132
 msgid ""
-"Mark all floating windows to be type \"Dialog\" rather than using \"Utility\" for "
-"some.\n"
-"This may help with some window managers. This requires a restart of %1 to take "
-"effect"
+"Mark all floating windows to be type \"Dialog\" rather than using \"Utility"
+"\" for some.\n"
+"This may help with some window managers. This requires a restart of %1 to "
+"take effect"
 msgstr ""
 "标记所有窗口类型为“对话框”,而不是把某些窗口标记为“工具”。\n"
 "这也许对于某些窗口管理有所帮助。这需要重新启动 %1以生效。"
 
-#: theme_manager.cc:199
+#: theme_manager.cc:136
 msgid ""
-"Make transient windows follow the front window when toggling between the editor "
-"and mixer.\n"
+"Make transient windows follow the front window when toggling between the "
+"editor and mixer.\n"
 "This requires a restart of %1 to take effect"
 msgstr ""
 "在编辑器和混音器之间切换时,让临时窗口跟随前方窗口。\n"
-"这需要重新启动 %1以生效。"
+"这需要重新启动 %1 以生效。"
 
-#: theme_manager.cc:620
-msgid "Color Palette"
-msgstr "颜料调色板"
+#: theme_manager.cc:139
+msgid ""
+"When detaching the monitoring section, mark it as \"Utility\" window to stay "
+"in front.\n"
+"This requires a restart of %1 to take effect"
+msgstr ""
+"分离监控部分时,标记它为 \"工具\"窗口并放在前面。 \n"
+"需要重新启动 %1 以生效"
 
 #: time_axis_view.cc:148
 msgid "Track/Bus name (double click to edit)"
 msgstr "音轨/总线名称(双击即可编辑)"
 
-#: time_axis_view_item.cc:345
+#: time_axis_view_item.cc:326
 msgid "new duration %1 frame is out of bounds for %2"
 msgid_plural "new duration of %1 frames is out of bounds for %2"
 msgstr[0] "新的音长 %1 帧超出了 %2 的边界"
 
-#: time_fx_dialog.cc:62
+#: time_fx_dialog.cc:60
 msgid "Quick but Ugly"
-msgstr "快速(但不优美)"
+msgstr "快速但不优美"
 
-#: time_fx_dialog.cc:63
+#: time_fx_dialog.cc:61
 msgid "Skip Anti-aliasing"
 msgstr "跳过自动对齐"
 
-#: time_fx_dialog.cc:64
-msgid "Contents:"
-msgstr "内容:"
+#: time_fx_dialog.cc:62
+msgid "Contents"
+msgstr "内容"
 
-#: time_fx_dialog.cc:65
+#: time_fx_dialog.cc:63
 msgid "Minimize time distortion"
 msgstr "减少时间扭曲"
 
-#: time_fx_dialog.cc:66
+#: time_fx_dialog.cc:64
 msgid "Preserve Formants"
 msgstr "保持共振峰"
 
-#: time_fx_dialog.cc:71
+#: time_fx_dialog.cc:81
 msgid "TimeFXDialog"
 msgstr "时间特效对话框"
 
-#: time_fx_dialog.cc:74
+#: time_fx_dialog.cc:84
 msgid "Pitch Shift Audio"
 msgstr "音高替换音频"
 
-#: time_fx_dialog.cc:76
+#: time_fx_dialog.cc:86
 msgid "Time Stretch Audio"
 msgstr "时间延伸音频"
 
-#: time_fx_dialog.cc:104 transpose_dialog.cc:41
+#: time_fx_dialog.cc:114 transpose_dialog.cc:41
 msgid "Octaves:"
 msgstr "八度:"
 
-#: time_fx_dialog.cc:109 transpose_dialog.cc:46
+#: time_fx_dialog.cc:119 transpose_dialog.cc:46
 msgid "Semitones:"
 msgstr "半音:"
 
-#: time_fx_dialog.cc:114
+#: time_fx_dialog.cc:124
 msgid "Cents:"
 msgstr "音分:"
 
-#: time_fx_dialog.cc:122
+#: time_fx_dialog.cc:132
 msgid "Time|Shift"
 msgstr "时间|替换"
 
-#: time_fx_dialog.cc:146 time_fx_dialog.cc:149
+#: time_fx_dialog.cc:184 time_fx_dialog.cc:188
 msgid "TimeFXButton"
 msgstr "时间特效按钮"
 
-#: time_fx_dialog.cc:154
+#: time_fx_dialog.cc:193
 msgid "Stretch/Shrink"
 msgstr "延伸/收缩"
 
-#: time_fx_dialog.cc:164
+#: time_fx_dialog.cc:203
 msgid "<b>Progress</b>"
 msgstr "<b>进程</b>"
 
-#: time_info_box.cc:124
+#: time_info_box.cc:118
 msgid "Start recording at auto-punch start"
 msgstr "在自动切换起点开始录制"
 
-#: time_info_box.cc:125
+#: time_info_box.cc:119
 msgid "Stop recording at auto-punch end"
 msgstr "在自动切换终点停止录制"
 
@@ -12532,7 +14751,7 @@ msgstr "这个音符的索引"
 
 #: transform_dialog.cc:42
 msgid "the number of notes"
-msgstr "音符的数目"
+msgstr "音符的编号"
 
 #: transform_dialog.cc:43
 msgid "exactly"
@@ -12578,224 +14797,278 @@ msgstr "变调 MIDI"
 msgid "Transpose"
 msgstr "变调"
 
-#: ui_config.cc:163 ui_config.cc:300
+#: ui_config.cc:234 ui_config.cc:422
 msgid "Loading default ui configuration file %1"
 msgstr "载入默认用户界面配置文件 %1"
 
-#: ui_config.cc:166 ui_config.cc:303
+#: ui_config.cc:237 ui_config.cc:425
 msgid "cannot read default ui configuration file \"%1\""
 msgstr "无法读取默认用户界面配置文件 \"%1\""
 
-#: ui_config.cc:169 ui_config.cc:308
+#: ui_config.cc:240 ui_config.cc:430
 msgid "default ui configuration file \"%1\" not loaded successfully."
 msgstr "默认用户界面配置文件 \"%1\" 载入不成功。"
 
-#: ui_config.cc:177
+#: ui_config.cc:248
 msgid "Could not find default UI configuration file %1"
 msgstr "无法找到默认用户界面配置文件\"%1\""
 
-#: ui_config.cc:219
+#: ui_config.cc:289
 msgid "Loading color file %1"
 msgstr "载入颜色文件 %1"
 
-#: ui_config.cc:222
+#: ui_config.cc:292
 msgid "cannot read color file \"%1\""
-msgstr "无法读取颜色文件 %1"
+msgstr "无法读取颜色文件 %"
 
-#: ui_config.cc:227
+#: ui_config.cc:297
 msgid "color file \"%1\" not loaded successfully."
-msgstr "颜色文件 %1载入不成功"
+msgstr "颜色文件 %1 载入不成功。"
 
-#: ui_config.cc:233
-msgid "Color file %1 not found"
-msgstr "找不到颜色文件 %1"
+#: ui_config.cc:325
+msgid "Color file for %1 not found along %2"
+msgstr "沿着 %2 找不到用于 %1 的颜色文件"
 
-#: ui_config.cc:282 ui_config.cc:361
+#: ui_config.cc:403 ui_config.cc:486
 msgid "Color file %1 not saved"
 msgstr "尚未保存颜色文件 %1"
 
-#: ui_config.cc:317
+#: ui_config.cc:439
 msgid "Loading user ui configuration file %1"
 msgstr "载入用户界面配置文件 %1"
 
-#: ui_config.cc:320
+#: ui_config.cc:442
 msgid "cannot read ui configuration file \"%1\""
 msgstr "无法读取用户界面配置文件 \"%1\""
 
-#: ui_config.cc:325
+#: ui_config.cc:447
 msgid "user ui configuration file \"%1\" not loaded successfully."
 msgstr "用户的用户界面配置文件 \"%1\" 载入不成功。"
 
-#: ui_config.cc:333
+#: ui_config.cc:455
 msgid "could not find any ui configuration file, canvas will look broken."
 msgstr "找不到任何用户界面配置文件,版面看起来将不大美观。"
 
-#: ui_config.cc:351
+#: ui_config.cc:476
 msgid "Config file %1 not saved"
 msgstr "尚未保存配置文件 %1"
 
-#: ui_config.cc:592
+#: ui_config.cc:720
 msgid "Color %1 not found"
 msgstr "找不到颜色 %1"
 
-#: ui_config.cc:662
+#: ui_config.cc:790
 msgid "Unable to find UI style file %1 in search path %2. %3 will look strange"
 msgstr "在搜索路径 %2 下找不到用户界面样式文件 %1。%3 看起来将不大美观。"
 
-#: utils.cc:117 utils.cc:160
+#: utils.cc:118 utils.cc:161
 msgid "bad XPM header %1"
 msgstr "损坏的 XPM 报头 %1"
 
-#: utils.cc:577
+#: utils.cc:365
 msgid "cannot find XPM file for %1"
 msgstr "找不到 XPM 文件提供给 %1"
 
-#: utils.cc:597 utils.cc:627 utils.cc:641
+#: utils.cc:418 utils.cc:448 utils.cc:468
 msgid "default"
 msgstr "默认"
 
-#: utils.cc:642
+#: utils.cc:469
 msgid "icon \"%1\" not found for icon set \"%2\", fallback to default"
 msgstr "找不到图标 \"%1\" 提供给图标集 \"%2\",退回默认状态"
 
-#: utils.cc:649
+#: utils.cc:476
 msgid "cannot find icon image for %1 using %2"
 msgstr "找不到图标图像提供给 %1 使用 %2"
 
-#: utils.cc:666 utils.cc:682
+#: utils.cc:493 utils.cc:509
 msgid "Caught exception while loading icon named %1"
 msgstr "载入命名为 %1 的图标时遇到异常"
 
-#: add_video_dialog.cc:54
+#: utils.cc:759
+msgid "Overwrite"
+msgstr "覆盖写入"
+
+#: vca_master_strip.cc:74 vca_time_axis.cc:49
+msgid "Solo slaves"
+msgstr "独奏从属"
+
+#: vca_master_strip.cc:79 vca_time_axis.cc:55
+msgid "Mute slaves"
+msgstr "静音从属"
+
+#: vca_master_strip.cc:83
+msgid "Hide this VCA strip"
+msgstr "隐藏这个 VCA 片段"
+
+#: vca_master_strip.cc:108 vca_master_strip.cc:418
+msgid "Click to show slaves only"
+msgstr "点击仅显示从属"
+
+#: vca_master_strip.cc:293
+msgid "A"
+msgstr ""
+
+#: vca_master_strip.cc:300
+msgid "S"
+msgstr ""
+
+#: vca_master_strip.cc:398
+msgid "Drop All Slaves"
+msgstr "丢弃全部从属"
+
+#: vca_master_strip.cc:421
+msgid "Click to show normal mixer"
+msgstr "点击显示普通混音器"
+
+#: add_video_dialog.cc:55
 msgid "Set Video Track"
 msgstr "设置视频轨道"
 
-#: add_video_dialog.cc:62
+#: add_video_dialog.cc:63
 msgid "Open Video Monitor Window"
 msgstr "打开视频监控窗口"
 
-#: add_video_dialog.cc:63
+#: add_video_dialog.cc:64
 msgid "Adjust Session Framerate to Match Video Framerate"
 msgstr "调整会话帧率匹配视频帧率"
 
-#: add_video_dialog.cc:65
+#: add_video_dialog.cc:66
 msgid "Reload docroot"
 msgstr "重新载入文档根"
 
-#: add_video_dialog.cc:120
+#: add_video_dialog.cc:121
 msgid "Video files"
 msgstr "视频文件"
 
-#: add_video_dialog.cc:149
+#: add_video_dialog.cc:150
 msgid "<b>Video Information</b>"
 msgstr "<b>视频信息</b>"
 
-#: add_video_dialog.cc:152
+#: add_video_dialog.cc:153
 msgid "Start:"
 msgstr "起点:"
 
-#: add_video_dialog.cc:158
+#: add_video_dialog.cc:159
 msgid "Frame rate:"
 msgstr "帧率:"
 
-#: add_video_dialog.cc:161
+#: add_video_dialog.cc:162
 msgid "Aspect Ratio:"
 msgstr "长宽比:"
 
-#: add_video_dialog.cc:244
+#: add_video_dialog.cc:245
 msgid "VideoServerIndex"
 msgstr "视频服务索引"
 
-#: add_video_dialog.cc:675
+#: add_video_dialog.cc:676
 msgid " %1 fps"
 msgstr ""
 
-#: video_timeline.cc:468
+#: vca_time_axis.cc:60
+msgid "D"
+msgstr ""
+
+#: vca_time_axis.cc:61
+msgid "Unassign all slaves"
+msgstr "不指定全部从属"
+
+#: vca_time_axis.cc:65
+msgid "V"
+msgstr ""
+
+#: vca_time_axis.cc:66
+msgid "Show only slaves"
+msgstr "仅显示从属"
+
+#: video_timeline.cc:473
 msgid ""
-"Parsing video file info failed. Is the Video Server running? Is the file readable "
-"by the Video Server? Does the docroot match? Is it a video file?"
+"Parsing video file info failed. Is the Video Server running? Is the file "
+"readable by the Video Server? Does the docroot match? Is it a video file?"
 msgstr ""
-"解析视频文件信息失败。视频服务器是否正在运行吗?视频服务器是否可辨识该文件?文档根"
-"是否匹配?这是一个视频文件吗?"
+"解析视频文件信息失败。视频服务器是否正在运行吗?视频服务器是否可辨识该文件?"
+"文档根是否匹配?这是一个视频文件吗?"
 
-#: video_timeline.cc:506
+#: video_timeline.cc:511
 msgid ""
-"Failed to set session-framerate: '%1' does not have a corresponding option setting "
-"in %2."
+"Failed to set session-framerate: '%1' does not have a corresponding option "
+"setting in %2."
 msgstr "设置会话帧率失败:'%1' 的选项设置与在 %2 里的不一致。"
 
-#: video_timeline.cc:514
+#: video_timeline.cc:519
 msgid ""
-"Video file's framerate is not equal to %1 session timecode's framerate: '%2' vs "
-"'%3'"
+"Video file's framerate is not equal to %1 session timecode's framerate: '%2' "
+"vs '%3'"
 msgstr "视频文件的帧率不等于 %1 会话时间码帧率: '%2' vs '%3'"
 
-#: video_timeline.cc:587
+#: video_timeline.cc:592
 msgid ""
-"Video-server docroot mismatch. %1: '%2', video-server: '%3'. This usually means "
-"that the video server was not started by %1 and uses a different document-root."
+"Video-server docroot mismatch. %1: '%2', video-server: '%3'. This usually "
+"means that the video server was not started by %1 and uses a different "
+"document-root."
 msgstr ""
-"视频文件文档根不匹配。%1: '%2',视频服务器:'%3'。这通常意味着视频服务器未能通过 "
-"%1 启动,并且使用着一个不同的文档根。"
+"视频文件文档根不匹配。%1: '%2',视频服务器:'%3'。这通常意味着视频服务器未能"
+"通过 %1 启动,并且使用着一个不同的文档根。"
 
-#: video_timeline.cc:724
+#: video_timeline.cc:729
 msgid ""
-"Video-monitor 'xjadeo' was not found. Please install http://xjadeo.sf.net/ (a "
-"custom path to xjadeo can be specified by setting the XJREMOTE environment "
-"variable. It should point to an application compatible with xjadeo's remote-"
-"control interface 'xjremote').\n"
+"Video-monitor 'xjadeo' was not found. Please install http://xjadeo.sf.net/ "
+"(a custom path to xjadeo can be specified by setting the XJREMOTE "
+"environment variable. It should point to an application compatible with "
+"xjadeo's remote-control interface 'xjremote').\n"
 "\n"
 "see also http://manual.ardour.org/video-timeline/setup/"
 msgstr ""
-"视频监控 'xjadeo' 未找到。请安装 http://xjadeo.sf.net/ (可以通过设置 XJREMOTE 环境"
-"变量来指定一个到 xjadeo 的定制路径。它应该指向一个兼容 xjadeo 遥控界面  'xjremote' "
-"的应用程序)。\n"
+"视频监控 'xjadeo' 未找到。请安装 http://xjadeo.sf.net/ (可以通过设置 "
+"XJREMOTE 环境变量来指定一个到 xjadeo 的定制路径。它应该指向一个兼容 xjadeo 遥"
+"控界面  'xjremote' 的应用程序)。\n"
 "\n"
 "请参阅 http://manual.ardour.org/video-timeline/setup/"
 
-#: video_timeline.cc:739
+#: video_timeline.cc:744
 msgid "Video-monitor 'xjadeo' cannot be launched."
 msgstr "视频监控 'xjadeo' 无法启动。"
 
-#: video_timeline.cc:766
+#: video_timeline.cc:776
 msgid ""
-"Video-monitor 'xjadeo' is too old. Please install xjadeo version 0.7.7 or later. "
-"http://xjadeo.sf.net/"
+"Video-monitor 'xjadeo' is too old. Please install xjadeo version 0.7.7 or "
+"later. http://xjadeo.sf.net/"
 msgstr ""
-"视频监控 'xjadeo' 太过老旧。请安装 xjadeo 0.7.7 或者更新的版本。 http://xjadeo.sf."
-"net/"
+"视频监控 'xjadeo' 太过老旧。请安装 xjadeo 0.7.7 或者更新的版本。 http://"
+"xjadeo.sf.net/"
 
-#: video_monitor.cc:285
+#: video_monitor.cc:283
 msgid "Video Monitor: File Not Found."
 msgstr "视频监控:找不到文件。"
 
 #: transcode_ffmpeg.cc:56
 msgid ""
-"No ffprobe or ffmpeg executables could be found on this system.\n"
-"Video import and export is not possible until you install those tools.\n"
+"ffmpeg installation was not found on this system.\n"
 "%1 requires ffmpeg and ffprobe from ffmpeg.org - version 1.1 or newer.\n"
+"Video import and export is not possible until you install tools.\n"
 "\n"
-"The tools are included with the %1 releases from ardour.org and also available "
-"with the video-server at http://x42.github.com/harvid/\n"
+"The tools are included with the %1 releases from ardour.org and also "
+"available with the video-server at http://x42.github.com/harvid/\n"
 "\n"
-"Important: the files need to be installed in $PATH and named ffmpeg_harvid and "
-"ffprobe_harvid.\n"
-"If you already have a suitable ffmpeg installation on your system, we recommend "
-"creating symbolic links from ffmpeg to ffmpeg_harvid and from ffprobe to "
-"ffprobe_harvid.\n"
+"Important: the files need to be installed in $PATH and named ffmpeg_harvid "
+"and ffprobe_harvid.\n"
+"If you already have a suitable ffmpeg installation on your system, we "
+"recommend creating symbolic links from ffmpeg to ffmpeg_harvid and from "
+"ffprobe to ffprobe_harvid.\n"
 "\n"
 "see also http://manual.ardour.org/video-timeline/setup/"
 msgstr ""
-"在这个系统上没找到 ffprobe 或者 ffmpeg 可执行文件。\n"
+"在这个系统上找不到 ffprobe 安装的文件。\n"
 "视频导入和导出无法进行,除非您安装这些工具。\n"
 "%1 需要 ffmpeg 和 ffprobe,来自 ffmpeg.org 1.1 或者更新的版本。\n"
 "\n"
-"这工具包括来自 ardour.org 的 %1,并且也可用于 http://x42.github.com/harvid/  上的视"
-"频服务。\n"
+"这工具包括来自 ardour.org 的 %1,并且也可用于 http://x42.github.com/harvid/  "
+"上的视频服务。\n"
 "\n"
-"注意:这些文件需要安装在 $PATH 并且命名为 ffmpeg_harvid 和 ffprobe_harvid 。\n"
-"如果您在您的系统上已经安装有一个合适的 ffmpeg,我们建议给 ffmpeg 创建符号链接为 "
-"ffmpeg_harvid,给 ffprobe 创建符号链接为  ffprobe_harvid 。\n"
+"注意:这些文件需要安装在 $PATH 并且命名为 ffmpeg_harvid 和 "
+"ffprobe_harvid 。\n"
+"如果您在您的系统上已经安装有一个合适的 ffmpeg,我们建议给 ffmpeg 创建符号链接"
+"为 ffmpeg_harvid,给 ffprobe 创建符号链接为  ffprobe_harvid 。\n"
 "\n"
 "请参阅 http://manual.ardour.org/video-timeline/setup/"
 
@@ -12807,7 +15080,7 @@ msgstr "转码/导入视频文件"
 msgid "Output File:"
 msgstr "导出文件:"
 
-#: transcode_video_dialog.cc:61 export_video_dialog.cc:85
+#: transcode_video_dialog.cc:61 export_video_dialog.cc:81
 msgid "Abort"
 msgstr "中止"
 
@@ -12816,10 +15089,14 @@ msgid "Height = "
 msgstr "高度 = "
 
 #: transcode_video_dialog.cc:66
+msgid "Extract LTC from audio and align video"
+msgstr "从音频和对齐的视频中提取 LTC(纵向时间码)"
+
+#: transcode_video_dialog.cc:67
 msgid "Manual Override"
 msgstr "手动覆盖"
 
-#: transcode_video_dialog.cc:70 export_video_dialog.cc:103
+#: transcode_video_dialog.cc:71 export_video_dialog.cc:99
 msgid "Debug Mode: Print ffmpeg command and output to stdout."
 msgstr "调试模式:打印 ffmpeg 命令并输出到标准输出。"
 
@@ -12829,98 +15106,96 @@ msgstr "<b>文件信息</b>"
 
 #: transcode_video_dialog.cc:113
 msgid ""
-"No ffprobe or ffmpeg executables could be found on this system. Video Import is "
-"not possible until you install those tools. See the Log window for more "
-"information."
+"ffmpeg installation was not found. Video Import is not possible. See the Log "
+"window for more information."
 msgstr ""
-"在这个系统上没找到 ffprobe 或者 ffmpeg 可执行文件。视频导入无法进行,除非您安装这些"
-"工具。更多的信息请参阅日志窗口。"
+"找不到 ffprobe 安装的文件。视频导入无法进行。更多的信息请参阅日志窗口。"
 
 #: transcode_video_dialog.cc:120
 msgid ""
 "File-info can not be read. Most likely '%1' is not a valid video-file or an "
 "unsupported video codec or format."
 msgstr ""
-"无法读取文件信息。极有可能 '‘% 1' 不是一个有效的视频文件,或者是一个不支持的视频编"
-"解码器或格式。"
+"无法读取文件信息。极有可能 '‘% 1' 不是一个有效的视频文件,或者是一个不支持的"
+"视频编解码器或格式。"
 
-#: transcode_video_dialog.cc:134
+#: transcode_video_dialog.cc:137
 msgid "FPS:"
-msgstr ""
-
-#: transcode_video_dialog.cc:136
-msgid "Duration:"
-msgstr "音长:"
+msgstr "FPS(帧率):"
 
-#: transcode_video_dialog.cc:138
+#: transcode_video_dialog.cc:141
 msgid "Codec:"
 msgstr "编码:"
 
-#: transcode_video_dialog.cc:140
+#: transcode_video_dialog.cc:143
 msgid "Geometry:"
 msgstr "几何形状:"
 
-#: transcode_video_dialog.cc:155
+#: transcode_video_dialog.cc:158
 msgid "??"
 msgstr ""
 
-#: transcode_video_dialog.cc:176
+#: transcode_video_dialog.cc:179
 msgid "<b>Import Settings</b>"
 msgstr "<b>导入设置</b>"
 
-#: transcode_video_dialog.cc:181
-msgid "Reference From Current Location (Previously Transcoded Files Only)"
+#: transcode_video_dialog.cc:184
+msgid "Reference from Current Location (Previously Transcoded Files Only)"
 msgstr "从当前位置引用(仅上一个已转码文件)"
 
-#: transcode_video_dialog.cc:183
+#: transcode_video_dialog.cc:185
 msgid "Import/Transcode Video to Session"
 msgstr "导入/转码视频到会话"
 
-#: transcode_video_dialog.cc:191
+#: transcode_video_dialog.cc:188 transcode_video_dialog.cc:198
 msgid "Do Not Import Video (Audio Import Only)"
 msgstr "不要导入视频(仅导入音频)"
 
-#: transcode_video_dialog.cc:200
+#: transcode_video_dialog.cc:208
+msgid "Do Not Import Video"
+msgstr "不要导入视频"
+
+#: transcode_video_dialog.cc:224
 msgid "Scale Video: Width = "
 msgstr "缩放视频:宽度 = "
 
-#: transcode_video_dialog.cc:207
+#: transcode_video_dialog.cc:230
 msgid "Original Width"
 msgstr "原始宽度"
 
-#: transcode_video_dialog.cc:222
+#: transcode_video_dialog.cc:245
 msgid "Bitrate (KBit/s):"
 msgstr "比特率(码率 KBit/s):"
 
-#: transcode_video_dialog.cc:227
+#: transcode_video_dialog.cc:250
 msgid "Extract Audio:"
 msgstr "提取音频:"
 
-#: transcode_video_dialog.cc:232
+#: transcode_video_dialog.cc:255
 msgid "No Audio Track Present"
 msgstr "无音频轨道呈现"
 
-#: transcode_video_dialog.cc:235
+#: transcode_video_dialog.cc:258
 msgid "Do Not Extract Audio"
 msgstr "无法提取音频"
 
-#: transcode_video_dialog.cc:350
+#: transcode_video_dialog.cc:374
 msgid "Extracting Audio.."
 msgstr "音频提取中…"
 
-#: transcode_video_dialog.cc:353
+#: transcode_video_dialog.cc:377
 msgid "Audio Extraction Failed."
 msgstr "音频提取失败。"
 
-#: transcode_video_dialog.cc:379
+#: transcode_video_dialog.cc:403
 msgid "Transcoding Video.."
 msgstr "视频转码中…"
 
-#: transcode_video_dialog.cc:413
+#: transcode_video_dialog.cc:437
 msgid "Transcoding Failed."
 msgstr "转码失败。"
 
-#: transcode_video_dialog.cc:503
+#: transcode_video_dialog.cc:541
 msgid "Save Transcoded Video File"
 msgstr "保存已转码视频文件"
 
@@ -12940,34 +15215,34 @@ msgstr "服务器文档根:"
 msgid "Don't show this dialog again. (Reset in Edit->Preferences)."
 msgstr "不再显示这个对话框。(可在 编辑 -> 首选项 里重置)。"
 
-#: video_server_dialog.cc:97
+#: video_server_dialog.cc:94
 msgid ""
 "The external video server 'harvid' can not be found.\n"
-"The tool is included with the %1 releases from ardour.org, alternatively you can "
-"download it from http://x42.github.com/harvid/ or acquire it from your "
+"The tool is included with the %1 releases from ardour.org, alternatively you "
+"can download it from http://x42.github.com/harvid/ or acquire it from your "
 "distribution.\n"
 "\n"
 "see also http://manual.ardour.org/video-timeline/setup/"
 msgstr ""
 "找不到外部视频服务器 'harvid' 。\n"
-"这工具包括来自 ardour.org 的 %1,另外您可以从 http://x42.github.com/harvid/ 下载"
-"它,或者从您的发行版获得它。\n"
+"这工具包括来自 ardour.org 的 %1,另外您可以从 http://x42.github.com/harvid/ "
+"下载它,或者从您的发行版获得它。\n"
 "\n"
 "请参阅 http://manual.ardour.org/video-timeline/setup/"
 
-#: video_server_dialog.cc:129
+#: video_server_dialog.cc:126
 msgid "Listen Address:"
 msgstr "试听地址:"
 
-#: video_server_dialog.cc:134
+#: video_server_dialog.cc:131
 msgid "Listen Port:"
 msgstr "试听端口:"
 
-#: video_server_dialog.cc:139
+#: video_server_dialog.cc:136
 msgid "Cache Size:"
 msgstr "缓存大小:"
 
-#: video_server_dialog.cc:145
+#: video_server_dialog.cc:142
 msgid ""
 "%1 relies on an external video server for the videotimeline.\n"
 "The server configured in Edit -> Preferences -> Video is not reachable.\n"
@@ -12975,226 +15250,215 @@ msgid ""
 msgstr ""
 "%1 依赖于外部视频服务器以获取视频时间线。\n"
 "这个已配置在 编辑 -> 首选项 -> 视频 的服务器无法访问。\n"
-"您是否要 %1 在这台机器上启动 'harvid' ?"
+"您是否要 %1 在这台机器上启动 'harvid'?"
 
-#: video_server_dialog.cc:189
+#: video_server_dialog.cc:186
 msgid "Set Video Server Executable"
 msgstr "设置视频服务器可执行"
 
-#: video_server_dialog.cc:209
+#: video_server_dialog.cc:206
 msgid "Server docroot"
 msgstr "服务器文档根"
 
-#: utils_videotl.cc:60
+#: utils_videotl.cc:63
 msgid "Destination is outside Video Server's docroot. "
-msgstr "目的地是视频服务器的文档根之外。"
+msgstr "目的地是视频服务器的文档根之外"
 
-#: utils_videotl.cc:61
+#: utils_videotl.cc:64
 msgid ""
-"The destination file path is outside of the Video Server's docroot. The file will "
-"not be readable by the Video Server. Do you still want to continue?"
+"The destination file path is outside of the Video Server's docroot. The file "
+"will not be readable by the Video Server. Do you still want to continue?"
 msgstr ""
-"目的地文件路径是处在视频服务器文档根之外。这个文件将无法被视频服务器读取。您是否要"
-"继续?"
+"目的地文件路径是处在视频服务器文档根之外。这个文件将无法被视频服务器读取。您"
+"是否要继续?"
 
-#: utils_videotl.cc:64
+#: utils_videotl.cc:67
 msgid "Continue"
 msgstr "继续"
 
-#: utils_videotl.cc:70
+#: utils_videotl.cc:74
 msgid "Confirm Overwrite"
 msgstr "确认覆盖"
 
-#: utils_videotl.cc:71
-msgid "A file with the same name already exists.  Do you want to overwrite it?"
-msgstr "已有相同名称的文件存在。您是否要重写覆盖它?"
-
-#: utils_videotl.cc:81 utils_videotl.cc:97
+#: utils_videotl.cc:84 utils_videotl.cc:100
 msgid "Cannot create video folder \"%1\" (%2)"
 msgstr "无法创建视频文件夹 \"%1\" (%2)"
 
-#: export_video_dialog.cc:71
+#: export_video_dialog.cc:67
 msgid "Export Video File "
 msgstr "导出视频文件"
 
-#: export_video_dialog.cc:82
+#: export_video_dialog.cc:78
 msgid "Video:"
 msgstr "视频:"
 
-#: export_video_dialog.cc:87
+#: export_video_dialog.cc:83
 msgid "Scale Video (W x H):"
 msgstr "缩放视频(宽 x 高):"
 
-#: export_video_dialog.cc:88
+#: export_video_dialog.cc:84
 msgid "Retain Aspect"
 msgstr "保持长宽比"
 
-#: export_video_dialog.cc:93
+#: export_video_dialog.cc:89
 msgid "Set Aspect Ratio:"
 msgstr "设置长宽比:"
 
-#: export_video_dialog.cc:94
+#: export_video_dialog.cc:90
 msgid "Normalize Audio"
 msgstr "规范化音频"
 
-#: export_video_dialog.cc:95
+#: export_video_dialog.cc:91
 msgid "2 Pass Encoding"
 msgstr "二次编码"
 
-#: export_video_dialog.cc:96
+#: export_video_dialog.cc:92
 msgid "Codec Optimizations:"
 msgstr "解码器优化:"
 
-#: export_video_dialog.cc:98
+#: export_video_dialog.cc:94
 msgid "Deinterlace"
 msgstr "反交错"
 
-#: export_video_dialog.cc:99
+#: export_video_dialog.cc:95
 msgid "Use [2] B-frames (MPEG 2 or 4 only)"
 msgstr "使用 [2] B-帧(仅 MPEG 2 或 4)"
 
-#: export_video_dialog.cc:100
+#: export_video_dialog.cc:96
 msgid "Override FPS (Default is to retain FPS from the input video file):"
-msgstr "覆盖 FPS(默认是覆盖到从输入视频文件保留的 FPS):"
+msgstr "覆盖 FPS “帧率”(默认是覆盖到从输入视频文件保留的 FPS):"
 
-#: export_video_dialog.cc:101
+#: export_video_dialog.cc:97
 msgid "Include Session Metadata"
 msgstr "包括会话元数据"
 
-#: export_video_dialog.cc:119
+#: export_video_dialog.cc:115
 msgid ""
-"No ffprobe or ffmpeg executables could be found on this system. Video Export is "
-"not possible until you install those tools. See the Log window for more "
-"information."
-msgstr ""
-"在这个系统上没找到 ffprobe 或者 ffmpeg 可执行文件。视频导出无法进行,除非您安装这些"
-"工具。更多的信息请参阅日志窗口。"
+"ffmpeg installation was not found. Video Export is not possible. See the Log "
+"window for more information."
+msgstr "找不到 ffmpeg 安装的文件。视频导出无法进行。更多的信息请参阅日志窗口。"
 
-#: export_video_dialog.cc:130
+#: export_video_dialog.cc:126
 msgid "<b>Output:</b> (file extension defines format)"
 msgstr "<b>导出:</b>(以文件扩展名决定格式)"
 
-#: export_video_dialog.cc:140
+#: export_video_dialog.cc:136
 msgid "<b>Input Video:</b>"
 msgstr "<b>导入视频</b>"
 
-#: export_video_dialog.cc:151
+#: export_video_dialog.cc:147
 msgid "Audio:"
 msgstr "音频:"
 
-#: export_video_dialog.cc:153
+#: export_video_dialog.cc:149
 msgid "Master Bus"
 msgstr "主控总线"
 
-#: export_video_dialog.cc:158
+#: export_video_dialog.cc:153
 msgid "from the %1 session's start to the session's end"
 msgstr "从 %1 会话的起点到会话的终点"
 
-#: export_video_dialog.cc:161
+#: export_video_dialog.cc:156
 msgid "<b>Settings:</b>"
-msgstr "<b>设置</b>"
+msgstr "<b>设置:</b>"
 
-#: export_video_dialog.cc:169
+#: export_video_dialog.cc:164
 msgid "Range:"
 msgstr "范围:"
 
-#: export_video_dialog.cc:172
-msgid "Preset:"
-msgstr "预设:"
-
-#: export_video_dialog.cc:175
+#: export_video_dialog.cc:170
 msgid "Video Codec:"
-msgstr "视频编码:"
+msgstr "预设:"
 
-#: export_video_dialog.cc:178
+#: export_video_dialog.cc:173
 msgid "Video KBit/s:"
 msgstr "视频 KBit/s:"
 
-#: export_video_dialog.cc:181
+#: export_video_dialog.cc:176
 msgid "Audio Codec:"
 msgstr "音频编码:"
 
-#: export_video_dialog.cc:184
+#: export_video_dialog.cc:179
 msgid "Audio KBit/s:"
 msgstr "音频 KBit/s:"
 
-#: export_video_dialog.cc:187
+#: export_video_dialog.cc:182
 msgid "Audio Samplerate:"
 msgstr "音频采样率:"
 
-#: export_video_dialog.cc:222 export_video_dialog.cc:231 export_video_dialog.cc:830
-#: export_video_dialog.cc:833
+#: export_video_dialog.cc:215 export_video_dialog.cc:223
+#: export_video_dialog.cc:814 export_video_dialog.cc:817
 msgid "(default for format)"
 msgstr "(默认格式)"
 
-#: export_video_dialog.cc:242 export_video_dialog.cc:255 export_video_dialog.cc:837
-#: export_video_dialog.cc:846
+#: export_video_dialog.cc:233 export_video_dialog.cc:244
+#: export_video_dialog.cc:821 export_video_dialog.cc:830
 msgid "(default)"
 msgstr "(默认)"
 
-#: export_video_dialog.cc:256 export_video_dialog.cc:840
+#: export_video_dialog.cc:245 export_video_dialog.cc:824
 msgid "(retain)"
 msgstr "(保留)"
 
-#: export_video_dialog.cc:348
+#: export_video_dialog.cc:335
 msgid "from 00:00:00:00 to the video's end"
 msgstr "从 00:00:00:00 到视频终点"
 
-#: export_video_dialog.cc:350
+#: export_video_dialog.cc:337
 msgid "from the video's start to the video's end"
 msgstr "从视频起点到视频终点"
 
-#: export_video_dialog.cc:353
+#: export_video_dialog.cc:340
 msgid "Selected range"
 msgstr "已选择的范围"
 
-#: export_video_dialog.cc:589
+#: export_video_dialog.cc:561
 msgid "Normalizing audio"
-msgstr "规范化音频"
+msgstr "音频规范化中"
 
-#: export_video_dialog.cc:593
+#: export_video_dialog.cc:566 export_video_dialog.cc:571
 msgid "Exporting audio"
 msgstr "音频导出中"
 
-#: export_video_dialog.cc:648
+#: export_video_dialog.cc:632
 msgid "Exporting Audio..."
 msgstr "音频导出中…"
 
-#: export_video_dialog.cc:705
+#: export_video_dialog.cc:689
 msgid ""
-"Export Video: Cannot query duration of video-file, using duration from timeline "
-"instead."
+"Export Video: Cannot query duration of video-file, using duration from "
+"timeline instead."
 msgstr "导出视频:无法查询视频文件长度,视频时间线长度代替。"
 
-#: export_video_dialog.cc:735
+#: export_video_dialog.cc:719
 msgid "Export Video: export-range does not include video."
 msgstr "导出视频:导出范围无法包括视频。"
 
-#: export_video_dialog.cc:748
+#: export_video_dialog.cc:732
 msgid "Export Video: No Master Out Ports to Connect for Audio Export"
 msgstr "导出视频:没有主控输出端口可连接给音频导出"
 
-#: export_video_dialog.cc:790
+#: export_video_dialog.cc:774
 msgid "Encoding Video..."
 msgstr "视频编码中…"
 
-#: export_video_dialog.cc:810
+#: export_video_dialog.cc:794
 msgid "Export Video: Video input file cannot be read."
-msgstr "导出视频:无法读取视频导入文件。"
+msgstr "导出视频:无法读取视频导入文件"
 
-#: export_video_dialog.cc:916
+#: export_video_dialog.cc:900
 msgid "Encoding Video.. Pass 1/2"
 msgstr "视频编码中…通过 1/2"
 
-#: export_video_dialog.cc:928
+#: export_video_dialog.cc:912
 msgid "Encoding Video.. Pass 2/2"
 msgstr "视频编码中…通过 2/2"
 
-#: export_video_dialog.cc:1031
+#: export_video_dialog.cc:1015
 msgid "Transcoding failed."
 msgstr "转码失败。"
 
-#: export_video_dialog.cc:1267 export_video_dialog.cc:1287
+#: export_video_dialog.cc:1251 export_video_dialog.cc:1271
 msgid "Save Exported Video File"
 msgstr "保存已导出的视频文件"
 
@@ -13212,475 +15476,20 @@ msgstr "<b>视频导出信息</b>"
 
 #: export_video_infobox.cc:51
 msgid ""
+"%1 does not include commercial licenses for encoding audio/video. Visit "
+"mpegla.com for information about licensing various audio/video codecs.\n"
+"\n"
 "Video encoding is a non-trivial task with many details.\n"
 "\n"
-"Please see the manual at %1/video-timeline/operations/#export.\n"
+"Please see the manual at %2/video-timeline/operations/#export.\n"
 "\n"
 "Open Manual in Browser? "
 msgstr ""
+"%1 不包含音频/视频编码的商业许可证。关于各种音频/视频编码的许可证信息,请访"
+"问 mpegla.com 。\n"
+"\n"
 "视频编码是一项带有许多细节的不简单的任务。\n"
 "\n"
 "请参阅手册,位于 %1/video-timeline/operations/#export 。\n"
 "\n"
 "在浏览器里打开手册?"
-
-#~ msgid "Track mode:"
-#~ msgstr "音轨模式:"
-
-#~ msgid "Theme Manager"
-#~ msgstr "主题管理"
-
-#~ msgid "Errors"
-#~ msgstr "错误"
-
-#~ msgid "Play Selected Range"
-#~ msgstr "播放已选择的范围"
-
-#~ msgid "Convert to Region In-Place"
-#~ msgstr "在此转换至区域"
-
-#~ msgid "Set Loop from Range"
-#~ msgstr "从范围设置循环"
-
-#~ msgid "Set Punch from Range"
-#~ msgstr "从范围设置Punch"
-
-#~ msgid "Draw/Edit MIDI Notes"
-#~ msgstr "绘画/编辑MIDI音符"
-
-#~ msgid "Draw Region Gain"
-#~ msgstr "绘制区域增益"
-
-#~ msgid "Select Zoom Range"
-#~ msgstr "选择变焦范围"
-
-#~ msgid "Stretch/Shrink Regions and MIDI Notes"
-#~ msgstr "伸/缩区域和MIDI音符"
-
-#~ msgid "Listen to Specific Regions"
-#~ msgstr "听特定区域"
-
-#~ msgid "Set Punch from Edit Range"
-#~ msgstr "在编辑范围设置Punch"
-
-#~ msgid "Edit MIDI"
-#~ msgstr "编辑MIDI"
-
-#~ msgid "Show Measures"
-#~ msgstr "显示测量"
-
-#~ msgid " range"
-#~ msgstr "范围"
-
-#~ msgid "set loop range from edit range"
-#~ msgstr "从编辑范围设置循环范围"
-
-#~ msgid "set punch range from edit range"
-#~ msgstr "从编辑范围设置punch区间"
-
-#~ msgid ""
-#~ "Do you really want to remove %1 %2?\n"
-#~ "\n"
-#~ "This action cannot be undon, and the session file will be overwritten"
-#~ msgstr ""
-#~ "你确定移除 %1 %2?\n"
-#~ "\n"
-#~ "此动作不可撤销, 而且此会话文件将会被重新写入!"
-
-#~ msgid "set selected regions"
-#~ msgstr "设置所选区域"
-
-#~ msgid "select all"
-#~ msgstr "选择所有"
-
-#~ msgid "select all within"
-#~ msgstr "在内选择所有"
-
-#~ msgid "set selection from range"
-#~ msgstr "从范围设置选区"
-
-#~ msgid "select all from range"
-#~ msgstr "从范围选择所有"
-
-#~ msgid "select all from punch"
-#~ msgstr "从punch选择所有"
-
-#~ msgid "select all from loop"
-#~ msgstr "从循环选择所有"
-
-#~ msgid "select all after cursor"
-#~ msgstr "在光标后选择所有"
-
-#~ msgid "select all before cursor"
-#~ msgstr "在光标前选择所有"
-
-#~ msgid "select all after edit"
-#~ msgstr "编辑后选择所有"
-
-#~ msgid "select all before edit"
-#~ msgstr "编辑前选择所有"
-
-#~ msgid "Plugin preset %1 not found"
-#~ msgstr "未找到插件预设%1"
-
-#~ msgid "Set volume (velocity) to forteissimo"
-#~ msgstr "设置音量(力度)为极强音"
-
-#~ msgid "Set volume (velocity) to forteississimo"
-#~ msgstr "设置音量(力度)为最强音"
-
-#~ msgid "badly formatted UI definition file: %1"
-#~ msgstr "错误的用户界面格式文件 %1"
-
-#~ msgid ""
-#~ "There are insufficient JACK ports available\n"
-#~ "to create a new track or bus.\n"
-#~ "You should save %1, exit and\n"
-#~ "restart JACK with more ports."
-#~ msgstr ""
-#~ "JACK端口(port)不足\n"
-#~ "无法继续新建音轨或总线\n"
-#~ "请保存 %1,重新启动JACK带来更多的端口.\n"
-
-#~ msgid "Timecode Frames"
-#~ msgstr "时间码框架"
-
-#~ msgid "Timecode Seconds"
-#~ msgstr "时间码秒"
-
-#~ msgid "Timecode Minutes"
-#~ msgstr "时间码分"
-
-#~ msgid "Slowest"
-#~ msgstr "最慢"
-
-#~ msgid "insert dragged region"
-#~ msgstr "插入拖拽区域"
-
-#~ msgid " objects"
-#~ msgstr "对象"
-
-#~ msgid "No edit range defined"
-#~ msgstr "没有定义的编辑范围"
-
-#~ msgid ""
-#~ "the edit point is Selected Marker\n"
-#~ "but there is no selected marker."
-#~ msgstr ""
-#~ "这个编辑点是已选择的标记,\n"
-#~ "但是没有已选择的标记."
-
-#~ msgid "Position of mark on the ruler"
-#~ msgstr "标尺的标记位置"
-
-#~ msgid "Max Size"
-#~ msgstr "最大化尺寸"
-
-#~ msgid "Maximum size of the ruler"
-#~ msgstr "标尺的最大化尺寸"
-
-#~ msgid "Show Position"
-#~ msgstr "显示位置"
-
-#~ msgid "Draw current ruler position"
-#~ msgstr "绘制当前标尺位置"
-
-#~ msgid "cannot open pango.rc file %1"
-#~ msgstr "无法打开pango.rc 文件 %1"
-
-#~ msgid "Missing File!"
-#~ msgstr "找不到文件!"
-
-#~ msgid "auditioning"
-#~ msgstr "监听中"
-
-#~ msgid "mono"
-#~ msgstr "单声道"
-
-#~ msgid "Link selection of regions and tracks"
-#~ msgstr "链接所选的区域和音轨"
-
-#~ msgid "ardour"
-#~ msgstr "ardour"
-
-#~ msgid "x1"
-#~ msgstr "x1"
-
-#~ msgid "x coordinate of upper left corner of rect"
-#~ msgstr "x与矩形的左上角相关"
-
-#~ msgid "y1"
-#~ msgstr "y1"
-
-#~ msgid "y coordinate of upper left corner of rect "
-#~ msgstr "y与矩形的右下角相关"
-
-#~ msgid "x2"
-#~ msgstr "x1"
-
-#~ msgid "x coordinate of lower right corner of rect"
-#~ msgstr "x与矩形的右下角相关"
-
-#~ msgid "y coordinate of lower right corner of rect "
-#~ msgstr "y与矩形的右下角相关"
-
-#~ msgid "color rgba"
-#~ msgstr "RGBA颜色"
-
-#~ msgid "color of line"
-#~ msgstr "线条颜色"
-
-#~ msgid "outline pixels"
-#~ msgstr "轮廓像素"
-
-#~ msgid "width in pixels of outline"
-#~ msgstr "轮廓的像素宽度"
-
-#~ msgid "fill"
-#~ msgstr "å¡«å……"
-
-#~ msgid "fill rectangle"
-#~ msgstr "填充矩形"
-
-#~ msgid "draw"
-#~ msgstr "绘制"
-
-#~ msgid "draw rectangle"
-#~ msgstr "绘制矩形"
-
-#~ msgid "outline color rgba"
-#~ msgstr "RGBA轮廓颜色"
-
-#~ msgid "color of outline"
-#~ msgstr "落括的颜色"
-
-#~ msgid "fill color rgba"
-#~ msgstr "填充RGBA颜色"
-
-#~ msgid "color of fill"
-#~ msgstr "填充的颜色"
-
-#~ msgid "Auditioning of MIDI files is not yet supported"
-#~ msgstr "暂不支持监听MIDI文件"
-
-#~ msgid "Starting audio engine"
-#~ msgstr "启动音频引擎"
-
-#~ msgid "disconnected"
-#~ msgstr "取消连接"
-
-#~ msgid ""
-#~ "%1 is not connected to JACK\n"
-#~ "You cannot open or close sessions in this condition"
-#~ msgstr ""
-#~ "%1 未连接到 JACK.\n"
-#~ "再此情况下,你无法打开或关闭会话"
-
-#~ msgid ""
-#~ "The audio backend (JACK) was shutdown because:\n"
-#~ "\n"
-#~ "%1"
-#~ msgstr ""
-#~ "音频后台(JACK)关闭了,原因如下:\n"
-#~ "\n"
-#~ "%1"
-
-#~ msgid ""
-#~ "JACK has either been shutdown or it\n"
-#~ "disconnected %1 because %1\n"
-#~ "was not fast enough. Try to restart\n"
-#~ "JACK, reconnect and save the session."
-#~ msgstr ""
-#~ "JACK 被关闭了,或与 %1 失去了连接\n"
-#~ "原因是 %1 不够快.\n"
-#~ "尝试重启JACK,重新连接并且保存会话."
-
-#~ msgid "Unable to start the session running"
-#~ msgstr "无法启动会话"
-
-#~ msgid "Click the Refresh button to try again."
-#~ msgstr "单击刷新按钮,再尝试一遍"
-
-#~ msgid "Could not disconnect from JACK"
-#~ msgstr "无法断开JACK的连接"
-
-#~ msgid "Could not reconnect to JACK"
-#~ msgstr "无法重新连接到JACK"
-
-#~ msgid "JACK"
-#~ msgstr "JACK"
-
-#~ msgid "Reconnect"
-#~ msgstr "重新链接"
-
-#~ msgid "JACK Sampling Rate and Latency"
-#~ msgstr "JACK采样率和延迟"
-
-#~ msgid "Realtime"
-#~ msgstr "实时"
-
-#~ msgid "Do not lock memory"
-#~ msgstr "不锁内存"
-
-#~ msgid "Unlock memory"
-#~ msgstr "解锁内存"
-
-#~ msgid "8000Hz"
-#~ msgstr "8000 Hz"
-
-#~ msgid "22050Hz"
-#~ msgstr "22050 Hz"
-
-#~ msgid "44100Hz"
-#~ msgstr "44100 Hz"
-
-#~ msgid "48000Hz"
-#~ msgstr "48000 Hz"
-
-#~ msgid "88200Hz"
-#~ msgstr "88200 Hz"
-
-#~ msgid "96000Hz"
-#~ msgstr "96000 Hz"
-
-#~ msgid "192000Hz"
-#~ msgstr "192000 Hz"
-
-#~ msgid "Triangular"
-#~ msgstr "三角形"
-
-#~ msgid "Rectangular"
-#~ msgstr "矩形"
-
-#~ msgid "Shaped"
-#~ msgstr "形状"
-
-#~ msgid "Playback/recording on 1 device"
-#~ msgstr "在设备1 播放/录音"
-
-#~ msgid "Playback/recording on 2 devices"
-#~ msgstr "在设备2 播放/录音"
-
-#~ msgid "Playback only"
-#~ msgstr "仅播放"
-
-#~ msgid "Recording only"
-#~ msgstr "仅录音"
-
-#~ msgid "Number of buffers:"
-#~ msgstr "缓冲区数量:"
-
-#~ msgid "Approximate latency:"
-#~ msgstr "大约延迟:"
-
-#~ msgid "Audio mode:"
-#~ msgstr "音频模式:"
-
-#~ msgid "Ignore"
-#~ msgstr "忽略"
-
-#~ msgid "Client timeout"
-#~ msgstr "客户端超时"
-
-#~ msgid "Number of ports:"
-#~ msgstr "端口数量:"
-
-#~ msgid "MIDI driver:"
-#~ msgstr "MIDI驱动:"
-
-#~ msgid ""
-#~ "No JACK server found anywhere on this system. Please install JACK and restart"
-#~ msgstr ""
-#~ "No JACK server found anywhere on this system. Please install JACK and restart"
-
-#~ msgid "Server:"
-#~ msgstr "服务器:"
-
-#~ msgid "Input device:"
-#~ msgstr "输入设备:"
-
-#~ msgid "Output device:"
-#~ msgstr "输出设备:"
-
-#~ msgid "Advanced"
-#~ msgstr "高级"
-
-#~ msgid "cannot open JACK rc file %1 to store parameters"
-#~ msgstr "无法打开JACK的rc文件%1来储存参数"
-
-#~ msgid "No suitable audio devices"
-#~ msgstr "没有合适的音频设备"
-
-#~ msgid "JACK appears to be missing from the %1 bundle"
-#~ msgstr "JACK%1"
-
-#~ msgid "You need to choose an audio device first."
-#~ msgstr "你需要先选择一个音频设备"
-
-#~ msgid "Audio device \"%1\" not known on this computer."
-#~ msgstr "电脑无法识别音频设备 %1"
-
-#~ msgid "%1 could not connect to JACK."
-#~ msgstr "%1 无法连接到JACK"
-
-#~ msgid "JACK exited"
-#~ msgstr "JACK已经退出"
-
-#~ msgid ""
-#~ "JACK exited unexpectedly, and without notifying %1.\n"
-#~ "\n"
-#~ "This could be due to misconfiguration or to an error inside JACK.\n"
-#~ "\n"
-#~ "Click OK to exit %1."
-#~ msgstr ""
-#~ "JACK出乎意料地退出了, 没有任何报告 %1.\n"
-#~ "\n"
-#~ "这可能是微配置或JACK里面的错误.\n"
-#~ "\n"
-#~ "单击OK退出 %1."
-
-#~ msgid ""
-#~ "JACK exited unexpectedly, and without notifying %1.\n"
-#~ "\n"
-#~ "This is probably due to an error inside JACK. You should restart JACK\n"
-#~ "and reconnect %1 to it, or exit %1 now. You cannot save your\n"
-#~ "session at this time, because we would lose your connection information.\n"
-#~ msgstr ""
-#~ "JACK出乎意料地退出了, 没有任何报告 %1.\n"
-#~ "\n"
-#~ "这可能是JACK里面的错误. 你最好重启JACK\n"
-#~ "然后连接到%1, 或者现在退出%1.\n"
-#~ "现在你没办法保存会话, 因为你的连接信息可能会丢失.\n"
-
-#~ msgid ""
-#~ "  -c, --name <name>           Use a specific jack client name, default is "
-#~ "ardour\n"
-#~ msgstr ""
-#~ "  -c, --name <name>           用一个特殊的JACK用户名称, 默认名称是: ardour\n"
-
-#~ msgid "follows order of editor"
-#~ msgstr "编辑器的如下顺序"
-
-#~ msgid "Open an existing session"
-#~ msgstr "打开一个已存在的会话"
-
-#~ msgid "I'd like more options for this session"
-#~ msgstr "我想要关于这个会话的更多选项"
-
-#~ msgid "Audio / MIDI Setup"
-#~ msgstr "音频/MIDI设置"
-
-#~ msgid "Use an existing session as a template:"
-#~ msgstr "使用一个存在的会话当作模板"
-
-#~ msgid "Select template"
-#~ msgstr "选择模板"
-
-#~ msgid "Browse:"
-#~ msgstr "浏览:"
-
-#~ msgid "Select a session"
-#~ msgstr "选择一个会话"
-
-#~ msgid "Advanced Session Options"
-#~ msgstr "高级会话选项"
diff --git a/gtk2_ardour/port_group.cc b/gtk2_ardour/port_group.cc
index d02171a..093e307 100644
--- a/gtk2_ardour/port_group.cc
+++ b/gtk2_ardour/port_group.cc
@@ -43,7 +43,7 @@
 #include "time_axis_view.h"
 #include "public_editor.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace Gtk;
@@ -316,7 +316,7 @@ struct RouteIOs {
 class RouteIOsComparator {
 public:
 	bool operator() (RouteIOs const & a, RouteIOs const & b) {
-		return a.route->order_key () < b.route->order_key ();
+		return a.route->presentation_info ().order() < b.route->presentation_info().order();
 	}
 };
 
@@ -375,13 +375,10 @@ PortGroupList::gather (ARDOUR::Session* session, ARDOUR::DataType type, bool inp
 	/* Sort RouteIOs by the routes' editor order keys */
 	route_ios.sort (RouteIOsComparator ());
 
-	/* Now put the bundles that belong to these sorted RouteIOs into the PortGroup.
-	   Note that if the RouteIO's bundles are multi-type, we may make new Bundles
-	   with only the ports of one type.
-	*/
+	/* Now put the bundles that belong to these sorted RouteIOs into the PortGroup. */
 
 	for (list<RouteIOs>::iterator i = route_ios.begin(); i != route_ios.end(); ++i) {
-		TimeAxisView* tv = PublicEditor::instance().axis_view_from_route (i->route);
+		TimeAxisView* tv = PublicEditor::instance().axis_view_from_stripable (i->route);
 
 		/* Work out which group to put these IOs' bundles in */
 		boost::shared_ptr<PortGroup> g;
@@ -392,10 +389,14 @@ PortGroupList::gather (ARDOUR::Session* session, ARDOUR::DataType type, bool inp
 		}
 
 		for (list<boost::shared_ptr<IO> >::iterator j = i->ios.begin(); j != i->ios.end(); ++j) {
-			if (tv) {
-				g->add_bundle ((*j)->bundle(), *j, tv->color ());
-			} else {
-				g->add_bundle ((*j)->bundle(), *j);
+			/* Only add the bundle if there is at least one port
+			 * with a type that's been asked for */
+			if (type == DataType::NIL || (*j)->bundle()->nchannels().n(type) > 0) {
+				if (tv) {
+					g->add_bundle ((*j)->bundle(), *j, tv->color ());
+				} else {
+					g->add_bundle ((*j)->bundle(), *j);
+				}
 			}
 		}
 	}
@@ -511,7 +512,18 @@ PortGroupList::gather (ARDOUR::Session* session, ARDOUR::DataType type, bool inp
         lpnc += ':';
 
 	vector<string> ports;
-	if (AudioEngine::instance()->get_ports ("", type, inputs ? IsInput : IsOutput, ports) > 0) {
+	if (type == DataType::NIL) {
+		vector<string> p1;
+		AudioEngine::instance()->get_ports ("", DataType::AUDIO, inputs ? IsInput : IsOutput, ports);
+		AudioEngine::instance()->get_ports ("", DataType::MIDI, inputs ? IsInput : IsOutput, p1);
+		for (vector<string>::const_iterator s = p1.begin(); s != p1.end(); ++s) {
+			ports.push_back (*s);
+		}
+	} else {
+		AudioEngine::instance()->get_ports ("", type, inputs ? IsInput : IsOutput, ports);
+	}
+
+	if (ports.size () > 0) {
 
 		for (vector<string>::const_iterator s = ports.begin(); s != ports.end(); ) {
 
@@ -537,10 +549,11 @@ PortGroupList::gather (ARDOUR::Session* session, ARDOUR::DataType type, bool inp
                                    we excluded them earlier.
                                 */
 
-                                string lp = p;
+                                string lp = p, monitor = _("Monitor");
                                 boost::to_lower (lp);
+                                boost::to_lower (monitor);
 
-                                if ((lp.find (N_(":monitor")) != string::npos) &&
+                                if ((lp.find (monitor) != string::npos) &&
                                     (lp.find (lpn) != string::npos)) {
                                         ++s;
                                         continue;
@@ -556,9 +569,9 @@ PortGroupList::gather (ARDOUR::Session* session, ARDOUR::DataType type, bool inp
 				if (ph) {
 					DataType t (AudioEngine::instance()->port_engine().port_data_type (ph));
 					if (t != DataType::NIL) {
-						if (port_has_prefix (p, N_("system:")) ||
-						    port_has_prefix (p, N_("alsa_pcm:")) ||
-						    port_has_prefix (p, N_("alsa_midi:"))) {
+						if (port_has_prefix (p, X_("system:")) ||
+						    port_has_prefix (p, X_("alsa_pcm:")) ||
+						    port_has_prefix (p, X_("alsa_midi:"))) {
 							extra_system[t].push_back (p);
 						} else if (port_has_prefix (p, lpnc)) {
 							/* Hide scene ports from non-Tracks Live builds */
@@ -622,9 +635,7 @@ PortGroupList::gather (ARDOUR::Session* session, ARDOUR::DataType type, bool inp
 	}
 
 	add_group_if_not_empty (other);
-	if (type != DataType::MIDI) {
-		add_group_if_not_empty (bus);
-	}
+	add_group_if_not_empty (bus);
 	add_group_if_not_empty (track);
 	add_group_if_not_empty (program);
 	add_group_if_not_empty (system);
diff --git a/gtk2_ardour/port_insert_ui.cc b/gtk2_ardour/port_insert_ui.cc
index a742740..0bf8653 100644
--- a/gtk2_ardour/port_insert_ui.cc
+++ b/gtk2_ardour/port_insert_ui.cc
@@ -29,7 +29,7 @@
 
 #include "port_insert_ui.h"
 #include "gui_thread.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 using namespace Gtk;
diff --git a/gtk2_ardour/port_matrix.cc b/gtk2_ardour/port_matrix.cc
index 34e0f68..1b58851 100644
--- a/gtk2_ardour/port_matrix.cc
+++ b/gtk2_ardour/port_matrix.cc
@@ -37,7 +37,7 @@
 #include "port_matrix_body.h"
 #include "port_matrix_component.h"
 #include "ardour_dialog.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
 #include "gui_thread.h"
 #include "utils.h"
 
@@ -159,7 +159,7 @@ PortMatrix::init ()
 	_session->engine().PortRegisteredOrUnregistered.connect (_session_connections, invalidator (*this), boost::bind (&PortMatrix::setup_global_ports, this), gui_context());
 
 	/* watch for route order keys changing, which changes the order of things in our global ports list(s) */
-	Route::SyncOrderKeys.connect (_session_connections, invalidator (*this), boost::bind (&PortMatrix::setup_global_ports_proxy, this), gui_context());
+	PresentationInfo::Change.connect (_session_connections, invalidator (*this), boost::bind (&PortMatrix::setup_global_ports_proxy, this), gui_context());
 
 	/* Part 3: other stuff */
 
@@ -729,9 +729,7 @@ PortMatrix::add_channel (boost::shared_ptr<Bundle> b, DataType t)
 	if (io) {
 		int const r = io->add_port ("", this, t);
 		if (r == -1) {
-			Gtk::MessageDialog msg (_("It is not possible to add a port here, as the first processor in the track or buss cannot "
-						  "support the new configuration."
-							));
+			Gtk::MessageDialog msg (_("It is not possible to add a port here."));
 			msg.set_title (_("Cannot add port"));
 			msg.run ();
 		}
@@ -747,23 +745,31 @@ PortMatrix::can_remove_channels (boost::shared_ptr<Bundle> b) const
 void
 PortMatrix::remove_channel (ARDOUR::BundleChannel b)
 {
+	std::string errmsg;
 	boost::shared_ptr<IO> io = io_from_bundle (b.bundle);
+	boost::shared_ptr<Port> p = io->nth (b.channel);
 
-	if (io) {
-		boost::shared_ptr<Port> p = io->nth (b.channel);
-		if (p) {
-			int const r = io->remove_port (p, this);
-			if (r == -1) {
-				ArdourDialog d (_("Port removal not allowed"));
-				Label l (_("This port cannot be removed.\nEither the first plugin in the track or buss cannot accept\nthe new number of inputs or the last plugin has more outputs."));
-				d.get_vbox()->pack_start (l);
-				d.add_button (Stock::OK, RESPONSE_ACCEPT);
-				d.set_modal (true);
-				d.show_all ();
-				d.run ();
-			}
+	if (!io || !p) {
+		return;
+	}
+
+	if (io->n_ports ().n_total () == 1) {
+		errmsg = _("The last port cannot be removed");
+	} else {
+		if (-1 == io->remove_port (p, this)) {
+			errmsg = _("This port cannot be removed.");
 		}
 	}
+
+	if (!errmsg.empty ()) {
+		ArdourDialog d (_("Port removal not allowed"));
+		Label l (errmsg);
+		d.get_vbox()->pack_start (l);
+		d.add_button (Stock::OK, RESPONSE_ACCEPT);
+		d.set_modal (true);
+		d.show_all ();
+		d.run ();
+	}
 }
 
 void
diff --git a/gtk2_ardour/port_matrix_body.cc b/gtk2_ardour/port_matrix_body.cc
index 83864a6..24fb575 100644
--- a/gtk2_ardour/port_matrix_body.cc
+++ b/gtk2_ardour/port_matrix_body.cc
@@ -28,7 +28,7 @@
 #include "port_matrix_row_labels.h"
 #include "port_matrix_grid.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 
diff --git a/gtk2_ardour/port_matrix_column_labels.cc b/gtk2_ardour/port_matrix_column_labels.cc
index cf591f8..4cf12b5 100644
--- a/gtk2_ardour/port_matrix_column_labels.cc
+++ b/gtk2_ardour/port_matrix_column_labels.cc
@@ -26,7 +26,7 @@
 #include "port_matrix.h"
 #include "port_matrix_body.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 
diff --git a/gtk2_ardour/port_matrix_row_labels.cc b/gtk2_ardour/port_matrix_row_labels.cc
index 507e9fc..c6b02eb 100644
--- a/gtk2_ardour/port_matrix_row_labels.cc
+++ b/gtk2_ardour/port_matrix_row_labels.cc
@@ -27,7 +27,7 @@
 #include "port_matrix_row_labels.h"
 #include "port_matrix.h"
 #include "port_matrix_body.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 
diff --git a/gtk2_ardour/processor_box.bindings b/gtk2_ardour/processor_box.bindings
new file mode 100644
index 0000000..eb64457
--- /dev/null
+++ b/gtk2_ardour/processor_box.bindings
@@ -0,0 +1,6 @@
+<Bindings name="Processor Box">
+  <Press>
+     <Binding key="Delete" action="ProcessorMenu/delete"/>
+     <Binding key="BackSpace" action="ProcessorMenu/backspace"/>
+  </Press>
+</Bindings>
diff --git a/gtk2_ardour/processor_box.cc b/gtk2_ardour/processor_box.cc
index 68beac4..3590c28 100644
--- a/gtk2_ardour/processor_box.cc
+++ b/gtk2_ardour/processor_box.cc
@@ -28,8 +28,10 @@
 #include <sigc++/bind.h>
 
 #include "pbd/convert.h"
+#include "canvas/utils.h"
 
 #include <glibmm/miscutils.h>
+#include <glibmm/fileutils.h>
 
 #include <gtkmm/messagedialog.h>
 
@@ -45,6 +47,8 @@
 #include "ardour/audioengine.h"
 #include "ardour/internal_return.h"
 #include "ardour/internal_send.h"
+#include "ardour/luaproc.h"
+#include "ardour/luascripting.h"
 #include "ardour/meter.h"
 #include "ardour/panner_shell.h"
 #include "ardour/plugin_insert.h"
@@ -57,14 +61,18 @@
 #include "ardour/session.h"
 #include "ardour/types.h"
 
+#include "LuaBridge/LuaBridge.h"
+
 #include "actions.h"
 #include "ardour_dialog.h"
 #include "ardour_ui.h"
 #include "gui_thread.h"
 #include "io_selector.h"
 #include "keyboard.h"
+#include "luainstance.h"
 #include "mixer_ui.h"
 #include "mixer_strip.h"
+#include "plugin_pin_dialog.h"
 #include "plugin_selector.h"
 #include "plugin_ui.h"
 #include "port_insert_ui.h"
@@ -72,12 +80,13 @@
 #include "public_editor.h"
 #include "return_ui.h"
 #include "route_processor_selection.h"
+#include "script_selector.h"
 #include "send_ui.h"
 #include "timers.h"
 #include "tooltips.h"
 #include "new_plugin_preset_dialog.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 #ifdef AUDIOUNIT_SUPPORT
 class AUPluginUI;
@@ -94,29 +103,54 @@ using namespace Gtk;
 using namespace Glib;
 using namespace Gtkmm2ext;
 
-ProcessorBox* ProcessorBox::_current_processor_box = 0;
+ProcessorBox*  ProcessorBox::_current_processor_box = 0;
 RefPtr<Action> ProcessorBox::paste_action;
 RefPtr<Action> ProcessorBox::cut_action;
 RefPtr<Action> ProcessorBox::copy_action;
 RefPtr<Action> ProcessorBox::rename_action;
 RefPtr<Action> ProcessorBox::delete_action;
+RefPtr<Action> ProcessorBox::backspace_action;
+RefPtr<Action> ProcessorBox::manage_pins_action;
 RefPtr<Action> ProcessorBox::edit_action;
 RefPtr<Action> ProcessorBox::edit_generic_action;
+RefPtr<ActionGroup> ProcessorBox::processor_box_actions;
+Gtkmm2ext::ActionMap ProcessorBox::myactions (X_("processor box"));
+Gtkmm2ext::Bindings* ProcessorBox::bindings = 0;
+
+
+// TODO consolidate with PluginPinDialog::set_color
+static void set_routing_color (cairo_t* cr, bool midi)
+{
+	static const uint32_t audio_port_color = 0x4A8A0EFF; // Green
+	static const uint32_t midi_port_color = 0x960909FF; //Red
 
-static const uint32_t audio_port_color = 0x4A8A0EFF; // Green
-static const uint32_t midi_port_color = 0x960909FF; //Red
+	if (midi) {
+		cairo_set_source_rgb (cr,
+				UINT_RGBA_R_FLT(midi_port_color),
+				UINT_RGBA_G_FLT(midi_port_color),
+				UINT_RGBA_B_FLT(midi_port_color));
+	} else {
+		cairo_set_source_rgb (cr,
+				UINT_RGBA_R_FLT(audio_port_color),
+				UINT_RGBA_G_FLT(audio_port_color),
+				UINT_RGBA_B_FLT(audio_port_color));
+	}
+}
 
 ProcessorEntry::ProcessorEntry (ProcessorBox* parent, boost::shared_ptr<Processor> p, Width w)
 	: _button (ArdourButton::led_default_elements)
 	, _position (PreFader)
 	, _position_num(0)
+	, _parent (parent)
 	, _selectable(true)
 	, _unknown_processor(false)
-	, _parent (parent)
 	, _processor (p)
 	, _width (w)
-	, _input_icon(true)
-	, _output_icon(false)
+	, input_icon(true)
+	, output_icon(false)
+	, routing_icon(true)
+	, output_routing_icon(false)
+	, _plugin_display(0)
 {
 	_vbox.show ();
 
@@ -141,20 +175,41 @@ ProcessorEntry::ProcessorEntry (ProcessorBox* parent, boost::shared_ptr<Processo
 	}
 	if (_processor) {
 
-		_vbox.pack_start (_routing_icon);
-		_vbox.pack_start (_input_icon);
+		_vbox.pack_start (routing_icon);
+		_vbox.pack_start (input_icon);
 		_vbox.pack_start (_button, true, true);
-		_vbox.pack_end (_output_icon);
 
-		_button.set_active (_processor->active());
+		boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert> (_processor);
+		if (pi && pi->plugin() && pi->plugin()->has_inline_display()) {
+			if (pi->plugin()->get_info()->type != ARDOUR::Lua) {
+				_plugin_display = new PluginDisplay (*this, pi->plugin(),
+						std::max (60.f, rintf(112.f * UIConfiguration::instance().get_ui_scale())));
+			} else {
+				assert (boost::dynamic_pointer_cast<LuaProc>(pi->plugin()));
+				_plugin_display = new LuaPluginDisplay (*this, boost::dynamic_pointer_cast<LuaProc>(pi->plugin()),
+						std::max (60.f, rintf(112.f * UIConfiguration::instance().get_ui_scale())));
+			}
+			_vbox.pack_start (*_plugin_display);
+			_plugin_display->set_no_show_all (true);
+			if (UIConfiguration::instance().get_show_inline_display_by_default ()) {
+				_plugin_display->show ();
+			}
+		}
+		_vbox.pack_end (output_routing_icon);
+		_vbox.pack_end (output_icon);
+
+		_button.set_active (_processor->enabled ());
 
-		_routing_icon.set_no_show_all(true);
-		_input_icon.set_no_show_all(true);
+		input_icon.set_no_show_all(true);
+		routing_icon.set_no_show_all(true);
+		output_icon.set_no_show_all(true);
+		output_routing_icon.set_no_show_all(true);
 
 		_button.show ();
-		_routing_icon.set_visible(false);
-		_input_icon.hide();
-		_output_icon.show();
+		input_icon.hide();
+		output_icon.show();
+		routing_icon.hide();
+		output_routing_icon.hide();
 
 		_processor->ActiveChanged.connect (active_connection, invalidator (*this), boost::bind (&ProcessorEntry::processor_active_changed, this), gui_context());
 		_processor->PropertyChanged.connect (name_connection, invalidator (*this), boost::bind (&ProcessorEntry::processor_property_changed, this, _1), gui_context());
@@ -181,12 +236,6 @@ ProcessorEntry::ProcessorEntry (ProcessorBox* parent, boost::shared_ptr<Processo
 			}
 		}
 
-		_input_icon.set_ports(_processor->input_streams());
-		_output_icon.set_ports(_processor->output_streams());
-
-		_routing_icon.set_sources(_processor->input_streams());
-		_routing_icon.set_sinks(_processor->output_streams());
-
 		setup_tooltip ();
 		setup_visuals ();
 	} else {
@@ -199,6 +248,7 @@ ProcessorEntry::~ProcessorEntry ()
 	for (list<Control*>::iterator i = _controls.begin(); i != _controls.end(); ++i) {
 		delete *i;
 	}
+	delete _plugin_display;
 }
 
 EventBox&
@@ -218,6 +268,40 @@ ProcessorEntry::drag_text () const
 {
 	return name (Wide);
 }
+
+bool
+ProcessorEntry::can_copy_state (Gtkmm2ext::DnDVBoxChild* o) const
+{
+	ProcessorEntry *other = dynamic_cast<ProcessorEntry*> (o);
+	if (!other) {
+		return false;
+	}
+	boost::shared_ptr<ARDOUR::Processor> otherproc = other->processor();
+	boost::shared_ptr<PluginInsert> my_pi = boost::dynamic_pointer_cast<PluginInsert> (_processor);
+	boost::shared_ptr<PluginInsert> ot_pi = boost::dynamic_pointer_cast<PluginInsert> (otherproc);
+	if (boost::dynamic_pointer_cast<UnknownProcessor> (_processor)) {
+		return false;
+	}
+	if (boost::dynamic_pointer_cast<UnknownProcessor> (otherproc)) {
+		return false;
+	}
+	if (!my_pi || !ot_pi) {
+		return false;
+	}
+	if (my_pi->type() != ot_pi->type()) {
+		return false;
+	}
+	boost::shared_ptr<Plugin> my_p = my_pi->plugin();
+	boost::shared_ptr<Plugin> ot_p = ot_pi->plugin();
+	if (!my_p || !ot_p) {
+		return false;
+	}
+	if (my_p->unique_id() != ot_p->unique_id()) {
+		return false;
+	}
+	return true;
+}
+
 bool
 ProcessorEntry::drag_data_get (Glib::RefPtr<Gdk::DragContext> const, Gtk::SelectionData &data)
 {
@@ -278,13 +362,6 @@ ProcessorEntry::set_position (Position p, uint32_t num)
 {
 	_position = p;
 	_position_num = num;
-
-	if (_position_num == 0 || _routing_icon.get_visible()) {
-		_input_icon.show();
-	} else {
-		_input_icon.hide();
-	}
-
 	setup_visuals ();
 }
 
@@ -305,9 +382,17 @@ ProcessorEntry::setup_visuals ()
 		_button.set_name ("processor stub");
 		return;
 	}
+	boost::shared_ptr<Send> send;
+	if ((send = boost::dynamic_pointer_cast<Send> (_processor))) {
+		if (send->remove_on_disconnect ()) {
+			_button.set_name ("processor sidechain");
+			return;
+		}
+	}
 
 	switch (_position) {
 	case PreFader:
+		if (_plugin_display) { _plugin_display->set_name ("processor prefader"); }
 		_button.set_name ("processor prefader");
 		break;
 
@@ -316,6 +401,7 @@ ProcessorEntry::setup_visuals ()
 		break;
 
 	case PostFader:
+		if (_plugin_display) { _plugin_display->set_name ("processor postfader"); }
 		_button.set_name ("processor postfader");
 		break;
 	}
@@ -325,6 +411,9 @@ ProcessorEntry::setup_visuals ()
 boost::shared_ptr<Processor>
 ProcessorEntry::processor () const
 {
+	if (!_processor) {
+		return boost::shared_ptr<Processor>();
+	}
 	return _processor;
 }
 
@@ -351,11 +440,11 @@ ProcessorEntry::led_clicked(GdkEventButton *ev)
 				_parent->all_visible_processors_active(false);
 
 				if (_position == Fader) {
-					_processor->deactivate ();
+					_processor->enable (false);
 				}
 			}
 			else {
-				_processor->deactivate ();
+				_processor->enable (false);
 			}
 
 		} else {
@@ -363,11 +452,11 @@ ProcessorEntry::led_clicked(GdkEventButton *ev)
 				_parent->all_visible_processors_active(true);
 
 				if (_position == Fader) {
-					_processor->activate ();
+					_processor->enable (true);
 				}
 			}
 			else {
-				_processor->activate ();
+				_processor->enable (true);
 			}
 		}
 	}
@@ -377,7 +466,7 @@ void
 ProcessorEntry::processor_active_changed ()
 {
 	if (_processor) {
-		_button.set_active (_processor->active());
+		_button.set_active (_processor->enabled ());
 	}
 }
 
@@ -393,13 +482,11 @@ ProcessorEntry::processor_property_changed (const PropertyChange& what_changed)
 void
 ProcessorEntry::processor_configuration_changed (const ChanCount in, const ChanCount out)
 {
-	_input_icon.set_ports(in);
-	_output_icon.set_ports(out);
-	_routing_icon.set_sources(in);
-	_routing_icon.set_sinks(out);
-	_input_icon.queue_draw();
-	_output_icon.queue_draw();
-	_routing_icon.queue_draw();
+	_parent->setup_routing_feeds ();
+	input_icon.queue_draw();
+	output_icon.queue_draw();
+	routing_icon.queue_draw();
+	output_routing_icon.queue_draw();
 }
 
 void
@@ -427,6 +514,16 @@ ProcessorEntry::setup_tooltip ()
 					string_compose (_("<b>%1</b>\nThe Plugin is not available on this system\nand has been replaced by a stub."), name (Wide)));
 			return;
 		}
+		boost::shared_ptr<Send> send;
+		if ((send = boost::dynamic_pointer_cast<Send> (_processor)) != 0 &&
+				!boost::dynamic_pointer_cast<InternalSend>(_processor)) {
+			if (send->remove_on_disconnect ()) {
+				ARDOUR_UI_UTILS::set_tooltip (_button, string_compose ("<b>> %1</b>\nThis (sidechain) send will be removed when disconnected.", _processor->name()));
+			} else {
+				ARDOUR_UI_UTILS::set_tooltip (_button, string_compose ("<b>> %1</b>", _processor->name()));
+			}
+			return;
+		}
 	}
 	ARDOUR_UI_UTILS::set_tooltip (_button, string_compose ("<b>%1</b>", name (Wide)));
 }
@@ -445,19 +542,52 @@ ProcessorEntry::name (Width w) const
 	    !boost::dynamic_pointer_cast<InternalSend>(_processor)) {
 
 		name_display += '>';
+		std::string send_name;
+		bool pretty_ok = true;
+
+		if (send->remove_on_disconnect ()) {
+			// assume it's a sidechain, find pretty name of connected port(s)
+			PortSet& ps (send->output ()->ports ());
+			for (PortSet::iterator i = ps.begin (); i != ps.end () && pretty_ok; ++i) {
+				vector<string> connections;
+				if (i->get_connections (connections)) {
+					vector<string>::const_iterator ci;
+					for (ci = connections.begin(); ci != connections.end(); ++ci) {
+						std::string pn = AudioEngine::instance()->get_pretty_name_by_name (*ci);
+						if (pn.empty ()) {
+							continue;
+						}
+						if (send_name.empty ()) {
+							send_name = pn;
+						} else if (send_name != pn) {
+							// pretty names don't match
+							pretty_ok = false;
+							break;
+						}
+					}
+				}
+			}
+		}
 
-		/* grab the send name out of its overall name */
+		if (!pretty_ok) {
+			send_name = "";
+		}
 
-		string::size_type lbracket, rbracket;
-		lbracket = send->name().find ('[');
-		rbracket = send->name().find (']');
+		/* grab the send name out of its overall name */
+		if (send_name.empty()) {
+			send_name = send->name();
+			string::size_type lbracket, rbracket;
+			lbracket = send_name.find ('[');
+			rbracket = send_name.find (']');
+			send_name = send_name.substr (lbracket+1, lbracket-rbracket-1);
+		}
 
 		switch (w) {
 		case Wide:
-			name_display += send->name().substr (lbracket+1, lbracket-rbracket-1);
+			name_display += send_name;
 			break;
 		case Narrow:
-			name_display += PBD::short_version (send->name().substr (lbracket+1, lbracket-rbracket-1), 4);
+			name_display += PBD::short_version (send_name, 5);
 			break;
 		}
 
@@ -510,6 +640,13 @@ ProcessorEntry::add_control_state (XMLNode* node) const
 	for (list<Control*>::const_iterator i = _controls.begin(); i != _controls.end(); ++i) {
 		(*i)->add_state (node);
 	}
+
+	if (_plugin_display) {
+		XMLNode* c = new XMLNode (X_("Object"));
+		c->add_property (X_("id"), X_("InlineDisplay"));
+		c->add_property (X_("visible"), _plugin_display->is_visible ());
+		node->add_child_nocopy (*c);
+	}
 }
 
 void
@@ -518,6 +655,18 @@ ProcessorEntry::set_control_state (XMLNode const * node)
 	for (list<Control*>::const_iterator i = _controls.begin(); i != _controls.end(); ++i) {
 		(*i)->set_state (node);
 	}
+
+	if (_plugin_display) {
+		XMLNode* n = GUIObjectState::get_node (node, X_("InlineDisplay"));
+		XMLProperty const * p = n ? n->property (X_("visible")) : NULL;
+		if (p) {
+			if (string_is_affirmative (p->value ())) {
+				_plugin_display->show();
+			} else {
+				_plugin_display->hide();
+			}
+		}
+	}
 }
 
 string
@@ -542,6 +691,14 @@ ProcessorEntry::build_controls_menu ()
 	Menu* menu = manage (new Menu);
 	MenuList& items = menu->items ();
 
+	if (_plugin_display) {
+		items.push_back (CheckMenuElem (_("Inline Display")));
+		Gtk::CheckMenuItem* c = dynamic_cast<Gtk::CheckMenuItem*> (&items.back ());
+		c->set_active (_plugin_display->is_visible ());
+		c->signal_toggled().connect (sigc::mem_fun (*this, &ProcessorEntry::toggle_inline_display_visibility));
+		items.push_back (SeparatorElem ());
+	}
+
 	items.push_back (
 		MenuElem (_("Show All Controls"), sigc::mem_fun (*this, &ProcessorEntry::show_all_controls))
 		);
@@ -565,6 +722,17 @@ ProcessorEntry::build_controls_menu ()
 }
 
 void
+ProcessorEntry::toggle_inline_display_visibility ()
+{
+	if (_plugin_display->is_visible ()) {
+		_plugin_display->hide();
+	} else {
+		_plugin_display->show();
+	}
+	_parent->update_gui_object_state (this);
+}
+
+void
 ProcessorEntry::toggle_control_visibility (Control* c)
 {
 	c->set_visible (!c->visible ());
@@ -780,7 +948,7 @@ ProcessorEntry::Control::set_state (XMLNode const * node)
 {
 	XMLNode* n = GUIObjectState::get_node (node, state_id ());
 	if (n) {
-		XMLProperty* p = n->property (X_("visible"));
+		XMLProperty const * p = n->property (X_("visible"));
 		set_visible (p && string_is_affirmative (p->value ()));
 	} else {
 		set_visible (false);
@@ -824,94 +992,28 @@ PluginInsertProcessorEntry::PluginInsertProcessorEntry (ProcessorBox* b, boost::
 	, _plugin_insert (p)
 {
 	p->PluginIoReConfigure.connect (
-		_splitting_connection, invalidator (*this), boost::bind (&PluginInsertProcessorEntry::plugin_insert_splitting_changed, this), gui_context()
+		_iomap_connection, invalidator (*this), boost::bind (&PluginInsertProcessorEntry::iomap_changed, this), gui_context()
+		);
+	p->PluginMapChanged.connect (
+		_iomap_connection, invalidator (*this), boost::bind (&PluginInsertProcessorEntry::iomap_changed, this), gui_context()
+		);
+	p->PluginConfigChanged.connect (
+		_iomap_connection, invalidator (*this), boost::bind (&PluginInsertProcessorEntry::iomap_changed, this), gui_context()
 		);
-
-	plugin_insert_splitting_changed ();
 }
 
 void
-PluginInsertProcessorEntry::plugin_insert_splitting_changed ()
+PluginInsertProcessorEntry::iomap_changed ()
 {
-	ChanCount in, out; // actual configured i/o
-	_plugin_insert->configured_io (in, out);
-
-	/* get number of input ports */
-	ChanCount sinks = _plugin_insert->natural_input_streams();
-	if (!_plugin_insert->splitting () && _plugin_insert->get_count() > 1) {
-		/* replicated instances */
-		for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
-			sinks.set(*t, sinks.get(*t) * _plugin_insert->get_count());
-		}
-	}
-	/* MIDI bypass */
-	if (_plugin_insert->natural_output_streams().n_midi() == 0 &&
-			_plugin_insert->output_streams().n_midi() == 1) {
-		in.set(DataType::MIDI, 1);
-		out.set(DataType::MIDI, 1);
-		sinks.set(DataType::MIDI, 1);
-	}
-
-	/* the Input streams available (*valid* outputs from prev. plugin)
-	 * this will be <= sinks. Some input-ports of this processor
-	 * may be unconnected.
-	 */
-	_routing_icon.set_sources(in);
-
-	/* the actual input ports of this processor */
-	_input_icon.set_ports(sinks);
-	_routing_icon.set_sinks(sinks);
-
-	/* set/override plugin-output ports to actual outputs-streams.
-	 *
-	 * This plugin may have unconnected output-ports (currently only in Mixbus,
-	 * e.g channelstrip-EQ at the top of a MIDI-channel before the synth).
-	 *
-	 * The *next* processor below this one will only see the
-	 * actual available streams (it cannot know the real outputs
-	 * of this plugin).
-	 *
-	 * There is currently no API to query the ports of the previous (or next)
-	 * processor.
-	 *
-	 * (normally - iff configuration succeeds - this is set during
-	 * ProcessorEntry::processor_configuration_changed() and should
-	 * equal _plugin_insert->output_streams())
-	 */
-	_output_icon.set_ports(out);
-#ifndef NDEBUG
-	if (out != _plugin_insert->output_streams()) {
-		std::cerr << "Processor Wiring: " <<  processor()->name()
-			<< " out-ports: " << _plugin_insert->output_streams() // NB. does not include midi-bypass
-			<< " out-connections: " << out
-			<< endmsg;
-	}
-#endif
-
-	_routing_icon.set_splitting(_plugin_insert->splitting ());
-
-	if (_plugin_insert->splitting () ||  in != sinks)
-	{
-		_routing_icon.set_size_request (-1, std::max (7.f, rintf(7.f * UIConfiguration::instance().get_ui_scale())));
-		_routing_icon.set_visible(true);
-		_input_icon.show();
-	} else {
-		_routing_icon.set_visible(false);
-		if (_position_num != 0) {
-			_input_icon.hide();
-		}
-	}
-
-	_input_icon.queue_draw();
-	_output_icon.queue_draw();
-	_routing_icon.queue_draw();
+	_parent->setup_routing_feeds ();
+	routing_icon.queue_draw();
+	output_routing_icon.queue_draw();
 }
 
 void
 PluginInsertProcessorEntry::hide_things ()
 {
 	ProcessorEntry::hide_things ();
-	plugin_insert_splitting_changed ();
 }
 
 ProcessorEntry::PortIcon::PortIcon(bool input) {
@@ -939,45 +1041,224 @@ ProcessorEntry::PortIcon::on_expose_event (GdkEventExpose* ev)
 	cairo_fill (cr);
 
 	const double dx = rint(max(2., 2. * UIConfiguration::instance().get_ui_scale()));
-	if (_ports.n_total() > 1) {
-		for (uint32_t i = 0; i < _ports.n_total(); ++i) {
-			if (i < _ports.n_midi()) {
-				cairo_set_source_rgb (cr,
-						UINT_RGBA_R_FLT(midi_port_color),
-						UINT_RGBA_G_FLT(midi_port_color),
-						UINT_RGBA_B_FLT(midi_port_color));
-			} else {
-				cairo_set_source_rgb (cr,
-						UINT_RGBA_R_FLT(audio_port_color),
-						UINT_RGBA_G_FLT(audio_port_color),
-						UINT_RGBA_B_FLT(audio_port_color));
-			}
-			const float x = rintf(width * (.2f + .6f * i / (_ports.n_total() - 1.f)));
-			cairo_rectangle (cr, x-dx * .5, 0, 1+dx, height);
-			cairo_fill(cr);
-		}
-	} else if (_ports.n_total() == 1) {
-		if (_ports.n_midi() == 1) {
-			cairo_set_source_rgb (cr,
-					UINT_RGBA_R_FLT(midi_port_color),
-					UINT_RGBA_G_FLT(midi_port_color),
-					UINT_RGBA_B_FLT(midi_port_color));
-		} else {
-			cairo_set_source_rgb (cr,
-					UINT_RGBA_R_FLT(audio_port_color),
-					UINT_RGBA_G_FLT(audio_port_color),
-					UINT_RGBA_B_FLT(audio_port_color));
-		}
-		const float x = rintf(width * .5);
-		cairo_rectangle (cr, x-dx * .5, 0, 1+dx, height);
+	for (uint32_t i = 0; i < _ports.n_total(); ++i) {
+		set_routing_color (cr, i < _ports.n_midi());
+		const double x = ProcessorEntry::RoutingIcon::pin_x_pos (i, width, _ports.n_total(), 0 , false);
+		cairo_rectangle (cr, x - .5 - dx * .5, 0, 1 + dx, height);
 		cairo_fill(cr);
-		cairo_stroke(cr);
 	}
 
 	cairo_destroy(cr);
 	return true;
 }
 
+ProcessorEntry::RoutingIcon::RoutingIcon (bool input)
+	: _fed_by (false)
+	, _input (input)
+{
+	set_terminal (false);
+}
+
+void
+ProcessorEntry::RoutingIcon::set_terminal (bool b) {
+	_terminal = b;
+	int h = std::max (8.f, rintf(8.f * sqrt (UIConfiguration::instance().get_ui_scale())));
+	if (_terminal) {
+		h += std::max (4.f, rintf(4.f * sqrt (UIConfiguration::instance().get_ui_scale())));
+	}
+	set_size_request (-1, h);
+}
+
+void
+ProcessorEntry::RoutingIcon::set (
+		const ARDOUR::ChanCount& in,
+		const ARDOUR::ChanCount& out,
+		const ARDOUR::ChanCount& sinks,
+		const ARDOUR::ChanCount& sources,
+		const ARDOUR::ChanMapping& in_map,
+		const ARDOUR::ChanMapping& out_map,
+		const ARDOUR::ChanMapping& thru_map)
+{
+	_in       = in;
+	_out      = out;
+	_sources  = sources;
+	_sinks    = sinks;
+	_in_map   = in_map;
+	_out_map  = out_map;
+	_thru_map = thru_map;
+}
+
+bool
+ProcessorEntry::RoutingIcon::in_identity () const {
+	if (_thru_map.n_total () > 0) {
+		return false;
+	}
+	if (!_in_map.is_monotonic () || !_in_map.is_identity ()) {
+		return false;
+	}
+	if (_in_map.n_total () != _sinks.n_total () || _in.n_total () != _sinks.n_total ()) {
+		return false;
+	}
+	return true;
+}
+
+bool
+ProcessorEntry::RoutingIcon::out_identity () const {
+	if (_thru_map.n_total () > 0) {
+		// TODO skip if trhu is not connected to any of next's inputs
+		return false;
+	}
+	if (!_out_map.is_monotonic () || !_out_map.is_identity ()) {
+		return false;
+	}
+	if (_out_map.n_total () != _sources.n_total () || _out.n_total () != _sources.n_total ()) {
+		return false;
+	}
+	return true;
+}
+
+bool
+ProcessorEntry::RoutingIcon::can_coalesce () const {
+	if (_thru_map.n_total () > 0) {
+		return false;
+	}
+	if (_fed_by && _f_out != _f_sources) {
+		return false;
+	}
+	if (_fed_by && !_f_out_map.is_identity () && !_in_map.is_identity ()) {
+		return false;
+	}
+	if (_input && _sinks == _in && (!_fed_by || _f_out == _in)) {
+		return true;
+	}
+	return false;
+}
+
+void
+ProcessorEntry::RoutingIcon::set_fed_by (
+				const ARDOUR::ChanCount& out,
+				const ARDOUR::ChanCount& sources,
+				const ARDOUR::ChanMapping& out_map,
+				const ARDOUR::ChanMapping& thru_map)
+{
+	_f_out      = out;
+	_f_sources  = sources;
+	_f_out_map  = out_map;
+	_f_thru_map = thru_map;
+	_fed_by     = true;
+}
+
+void
+ProcessorEntry::RoutingIcon::set_feeding (
+				const ARDOUR::ChanCount& in,
+				const ARDOUR::ChanCount& sinks,
+				const ARDOUR::ChanMapping& in_map,
+				const ARDOUR::ChanMapping& thru_map)
+{
+	_i_in       = in;
+	_i_sinks    = sinks;
+	_i_in_map   = in_map;
+	_i_thru_map = thru_map;
+	_feeding    = true;
+}
+
+double
+ProcessorEntry::RoutingIcon::pin_x_pos (uint32_t i, double width, uint32_t n_total, uint32_t n_midi, bool midi)
+{
+	if (!midi) { i += n_midi; }
+	if (n_total == 1) {
+		assert (i == 0);
+		return rint (width * .5) +.5;
+	}
+	return rint (width * (.15 + .7 * i / (n_total - 1))) + .5;
+}
+
+void
+ProcessorEntry::RoutingIcon::draw_gnd (cairo_t* cr, double x0, double y0, double height, bool midi)
+{
+	const double dx = 1 + rint (max(2., 2. * UIConfiguration::instance().get_ui_scale()));
+	const double y1 = rint (height * .66) + .5;
+
+	cairo_save (cr);
+	cairo_translate (cr, x0, y0);
+	cairo_move_to (cr, 0, height);
+	cairo_line_to (cr, 0, y1);
+	cairo_move_to (cr, 0 - dx, y1);
+	cairo_line_to (cr, 0 + dx, y1);
+
+	set_routing_color (cr, midi);
+	cairo_set_line_width (cr, 1.0);
+	cairo_stroke (cr);
+	cairo_restore (cr);
+}
+
+void
+ProcessorEntry::RoutingIcon::draw_sidechain (cairo_t* cr, double x0, double y0, double height, bool midi)
+{
+	const double dx = 1 + rint (max(2., 2. * UIConfiguration::instance().get_ui_scale()));
+	const double y1 = rint (height * .5) - .5;
+
+	cairo_save (cr);
+	cairo_translate (cr, x0, y0);
+	cairo_move_to (cr, 0 - dx, height);
+	cairo_line_to (cr, 0, y1);
+	cairo_line_to (cr, 0 + dx, height);
+	cairo_close_path (cr);
+
+	set_routing_color (cr, midi);
+	cairo_fill (cr);
+	cairo_restore (cr);
+}
+
+void
+ProcessorEntry::RoutingIcon::draw_thru_src (cairo_t* cr, double x0, double y0, double height, bool midi)
+{
+	const double rad = 1;
+	const double y1 = height - rad - 1.5;
+
+	cairo_arc (cr, x0, y0 + y1, rad, 0, 2. * M_PI);
+	cairo_move_to (cr, x0, y0 + height - 1.5);
+	cairo_line_to (cr, x0, y0 + height);
+	set_routing_color (cr, midi);
+	cairo_set_line_width  (cr, 1.0);
+	cairo_stroke (cr);
+}
+
+void
+ProcessorEntry::RoutingIcon::draw_thru_sink (cairo_t* cr, double x0, double y0, double height, bool midi)
+{
+	const double rad = 1;
+	const double y1 = rad + 1;
+
+	cairo_arc (cr, x0, y0 + y1, rad, 0, 2. * M_PI);
+	cairo_move_to (cr, x0, y0);
+	cairo_line_to (cr, x0, y0 + 1);
+	set_routing_color (cr, midi);
+	cairo_set_line_width  (cr, 1.0);
+	cairo_stroke (cr);
+}
+
+void
+ProcessorEntry::RoutingIcon::draw_connection (cairo_t* cr, double x0, double x1, double y0, double y1, bool midi, bool dashed)
+{
+	double bz = abs (y1 - y0);
+
+	cairo_move_to (cr, x0, y0);
+	cairo_curve_to (cr, x0, y0 + bz, x1, y1 - bz, x1, y1);
+	cairo_set_line_width  (cr, 1.0);
+	cairo_set_line_cap  (cr,  CAIRO_LINE_CAP_ROUND);
+	cairo_set_source_rgb (cr, 1, 0, 0);
+	if (dashed) {
+		const double dashes[] = { 2, 3 };
+		cairo_set_dash (cr, dashes, 2, 0);
+	}
+	set_routing_color (cr, midi);
+	cairo_stroke (cr);
+	if (dashed) {
+		cairo_set_dash (cr, 0, 0, 0);
+	}
+}
+
 bool
 ProcessorEntry::RoutingIcon::on_expose_event (GdkEventExpose* ev)
 {
@@ -986,7 +1267,6 @@ ProcessorEntry::RoutingIcon::on_expose_event (GdkEventExpose* ev)
 	cairo_rectangle (cr, ev->area.x, ev->area.y, ev->area.width, ev->area.height);
 	cairo_clip (cr);
 
-	cairo_set_line_width (cr, max (1.f, UIConfiguration::instance().get_ui_scale()));
 	cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND);
 
 	Gtk::Allocation a = get_allocation();
@@ -999,115 +1279,471 @@ ProcessorEntry::RoutingIcon::on_expose_event (GdkEventExpose* ev)
 	cairo_rectangle (cr, 0, 0, width, height);
 	cairo_fill (cr);
 
-	Gdk::Color const fg = get_style()->get_fg (STATE_NORMAL);
-	cairo_set_source_rgb (cr, fg.get_red_p (), fg.get_green_p (), fg.get_blue_p ());
-
-	const uint32_t sources = _sources.n_total();
-	const uint32_t sinks = _sinks.n_total();
-
-	const uint32_t midi_sources = _sources.n_midi();
-	const uint32_t midi_sinks = _sinks.n_midi();
-	const uint32_t audio_sources = _sources.n_audio();
-	const uint32_t audio_sinks = _sinks.n_audio();
-
-	/* MIDI */
-	cairo_set_source_rgb (cr,
-			UINT_RGBA_R_FLT(midi_port_color),
-			UINT_RGBA_G_FLT(midi_port_color),
-			UINT_RGBA_B_FLT(midi_port_color));
-	if (midi_sources > 0 && midi_sinks > 0 && sinks > 1 && sources > 1) {
-		for (uint32_t i = 0 ; i < midi_sources; ++i) {
-			const float si_x  = rintf(width * (.2f + .6f * i  / (sinks - 1.f))) + .5f;
-			const float si_x0 = rintf(width * (.2f + .6f * i / (sources - 1.f))) + .5f;
-			cairo_move_to (cr, si_x, height);
-			cairo_curve_to (cr, si_x, 0, si_x0, height, si_x0, 0);
-			cairo_stroke (cr);
+	if (_input) {
+		if (can_coalesce ()) {
+			expose_coalesced_input_map (cr, width, height);
+		} else {
+			expose_input_map (cr, width, height);
 		}
-	} else if (midi_sources == 1 && midi_sinks == 1 && sinks == 1 && sources == 1) {
-		const float si_x = rintf(width * .5f) + .5f;
-		cairo_move_to (cr, si_x, height);
-		cairo_line_to (cr, si_x, 0);
-		cairo_stroke (cr);
-	} else if (midi_sources == 1 && midi_sinks == 1) {
-		/* unusual cases -- removed synth, midi-track w/audio plugins */
-		const float si_x  = rintf(width * (sinks   > 1 ? .2f : .5f)) + .5f;
-		const float si_x0 = rintf(width * (sources > 1 ? .2f : .5f)) + .5f;
-		cairo_move_to (cr, si_x, height);
-		cairo_curve_to (cr, si_x, 0, si_x0, height, si_x0, 0);
-		cairo_stroke (cr);
-	} else if (midi_sources == 0 && midi_sinks == 1) {
-		const double dx = 1 + rint(max(2., 2. * UIConfiguration::instance().get_ui_scale()));
-		// draw "T"
-		//  TODO connect back to track-input of last midi-out if any, otherwise draw "X"
-		const float si_x  = rintf(width * .2f) + .5f;
-		cairo_move_to (cr, si_x, height);
-		cairo_line_to (cr, si_x, height * .66);
-		cairo_move_to (cr, si_x - dx, height * .66);
-		cairo_line_to (cr, si_x + dx, height * .66);
-		cairo_stroke (cr);
-#ifndef NDEBUG
-	} else if (midi_sources != 0 && midi_sinks != 0) {
-		PBD::warning << string_compose("Programming error: midi routing display: A %1 -> %2 | M %3 -> %4 | T %5 -> %6",
-				audio_sources, audio_sinks, midi_sources, midi_sinks, sources, sinks) << endmsg;
-#endif
+	} else {
+		expose_output_map (cr, width, height);
 	}
 
-	/* AUDIO */
-	cairo_set_source_rgb (cr,
-			UINT_RGBA_R_FLT(audio_port_color),
-			UINT_RGBA_G_FLT(audio_port_color),
-			UINT_RGBA_B_FLT(audio_port_color));
-
-	if (_splitting) {
-		assert(audio_sources < 2);
-		assert(audio_sinks > 1);
-		/* assume there is only ever one MIDI port */
-		const float si_x0 = rintf(width * (midi_sources > 0 ? .8f : .5f)) + .5f;
-		for (uint32_t i = midi_sinks; i < sinks; ++i) {
-			const float si_x = rintf(width * (.2f + .6f * i / (sinks - 1.f))) + .5f;
-			cairo_move_to (cr, si_x, height);
-			cairo_curve_to (cr, si_x, 0, si_x0, height, si_x0, 0);
-			cairo_stroke (cr);
+	cairo_destroy(cr);
+	return true;
+}
+
+void
+ProcessorEntry::RoutingIcon::expose_coalesced_input_map (cairo_t* cr, const double width, const double height)
+{
+	const uint32_t pc_in = _sinks.n_total();
+	const uint32_t pc_in_midi = _sinks.n_midi();
+
+	for (uint32_t i = 0; i < pc_in; ++i) {
+		const bool is_midi = i < pc_in_midi;
+		bool valid_in;
+		uint32_t pn = is_midi ? i : i - pc_in_midi;
+		DataType dt = is_midi ? DataType::MIDI : DataType::AUDIO;
+		uint32_t idx = _in_map.get (dt, pn, &valid_in);
+		if (!valid_in) {
+			double x = pin_x_pos (i, width, pc_in, 0, is_midi);
+			draw_gnd (cr, x, 0, height, is_midi);
+			continue;
 		}
-	} else if (audio_sources > 1 && sinks > 1) {
-		for (uint32_t i = 0 ; i < audio_sources; ++i) {
-			const float si_x = rintf(width * (.2f + .6f * (i + midi_sinks) / (sinks - 1.f))) + .5f;
-			const float si_x0 = rintf(width * (.2f + .6f * (i + midi_sources) / (sources - 1.f))) + .5f;
-			cairo_move_to (cr, si_x, height);
-			cairo_curve_to (cr, si_x, 0, si_x0, height, si_x0, 0);
-			cairo_stroke (cr);
+		if (idx >= _in.get (dt)) {
+			// side-chain, probably
+			double x = pin_x_pos (i, width, pc_in, 0, is_midi);
+			draw_sidechain (cr, x, 0, height, is_midi);
+			continue;
 		}
-	} else if (audio_sources == 1 && audio_sinks > 0) {
-		float si_x, si_x0;
-		if (sinks == 1) {
-			si_x = rintf(width * .5f) + .5f;
+		double c_x0;
+		double c_x1 = pin_x_pos (i, width, pc_in, 0, false);
+
+		if (_fed_by) {
+			bool valid_src;
+			uint32_t src = _f_out_map.get_src (dt, idx, &valid_src);
+			if (!valid_src) {
+				double x = pin_x_pos (i, width, pc_in, 0, false);
+				bool valid_thru;
+				_f_thru_map.get (dt, idx, &valid_thru);
+				if (valid_thru) {
+					draw_thru_src (cr, x, 0, height, is_midi);
+				} else {
+					draw_gnd (cr, x, 0, height, is_midi);
+				}
+				continue;
+			}
+			c_x0 = pin_x_pos (src, width, _f_sources.n_total(), _f_sources.n_midi(), is_midi);
 		} else {
-			si_x = rintf(width * (.2f + .6f * midi_sinks / (sinks - 1.f))) + .5f;
+			c_x0 = pin_x_pos (idx, width, _in.n_total(), _in.n_midi(), is_midi);
+		}
+		draw_connection (cr, c_x0, c_x1, 0, height, is_midi);
+	}
+}
+
+void
+ProcessorEntry::RoutingIcon::expose_input_map (cairo_t* cr, const double width, const double height)
+{
+	const uint32_t n_in = _in.n_total();
+	const uint32_t n_in_midi = _in.n_midi();
+	const uint32_t pc_in = _sinks.n_total();
+	const uint32_t pc_in_midi = _sinks.n_midi();
+
+	// draw inputs to this
+	for (uint32_t i = 0; i < pc_in; ++i) {
+		const bool is_midi = i < pc_in_midi;
+		bool valid_in;
+		uint32_t pn = is_midi ? i : i - pc_in_midi;
+		DataType dt = is_midi ? DataType::MIDI : DataType::AUDIO;
+		uint32_t idx = _in_map.get (dt, pn, &valid_in);
+		// check if it's fed
+		bool valid_src = true;
+		if (valid_in && idx < _in.get (dt) && _fed_by) {
+			bool valid_out;
+			bool valid_thru;
+			_f_out_map.get_src (dt, idx, &valid_out);
+			_f_thru_map.get (dt, idx, &valid_thru);
+			if (!valid_out && !valid_thru) {
+				valid_src = false;
+			}
+		}
+		if (!valid_in || !valid_src) {
+			double x = pin_x_pos (i, width, pc_in, 0, is_midi);
+			draw_gnd (cr, x, 0, height, is_midi);
+			continue;
+		}
+		if (idx >= _in.get (dt)) {
+			// side-chain, probably
+			double x = pin_x_pos (i, width, pc_in, 0, is_midi);
+			draw_sidechain (cr, x, 0, height, is_midi);
+			continue;
+		}
+		double c_x1 = pin_x_pos (i, width, pc_in, 0, false);
+		double c_x0 = pin_x_pos (idx, width, n_in, n_in_midi, is_midi);
+		draw_connection (cr, c_x0, c_x1, 0, height, is_midi);
+	}
+
+	// draw reverse thru
+	for (uint32_t i = 0; i < n_in; ++i) {
+		const bool is_midi = i < n_in_midi;
+		bool valid_thru;
+		uint32_t pn = is_midi ? i : i - n_in_midi;
+		DataType dt = is_midi ? DataType::MIDI : DataType::AUDIO;
+		_thru_map.get_src (dt, pn, &valid_thru);
+		if (!valid_thru) {
+			continue;
 		}
-		if (sources == 1) {
-			si_x0 = rintf(width * .5f) + .5f;
+		double x = pin_x_pos (i, width, n_in, 0, is_midi);
+		draw_thru_sink (cr, x, 0, height, is_midi);
+	}
+}
+
+void
+ProcessorEntry::RoutingIcon::expose_output_map (cairo_t* cr, const double width, const double height)
+{
+	int dh = std::max (4.f, rintf(4.f * UIConfiguration::instance().get_ui_scale()));
+	double ht = _terminal ? height - dh : height;
+
+	// draw outputs of this
+	const uint32_t pc_out = _sources.n_total();
+	const uint32_t pc_out_midi = _sources.n_midi();
+	const uint32_t n_out = _out.n_total();
+	const uint32_t n_out_midi = _out.n_midi();
+
+	for (uint32_t i = 0; i < pc_out; ++i) {
+		const bool is_midi = i < pc_out_midi;
+		bool valid_out;
+		uint32_t pn = is_midi ? i : i - pc_out_midi;
+		DataType dt = is_midi ? DataType::MIDI : DataType::AUDIO;
+		uint32_t idx = _out_map.get (dt, pn, &valid_out);
+		if (!valid_out) {
+			continue;
+		}
+		// skip connections that are not used in the next's input
+		if (_feeding) {
+			bool valid_thru, valid_sink;
+			_i_in_map.get_src (dt, idx, &valid_sink);
+			_i_thru_map.get_src (dt, idx, &valid_thru);
+			if (!valid_thru && !valid_sink) {
+				if (!is_midi || i != 0) { // special case midi-bypass
+					continue;
+				}
+			}
+		}
+		double c_x0 = pin_x_pos (i, width, pc_out, 0, false);
+		double c_x1 = pin_x_pos (idx, width, n_out, n_out_midi, is_midi);
+		draw_connection (cr, c_x0, c_x1, 0, ht, is_midi);
+	}
+
+	for (uint32_t i = 0; i < n_out; ++i) {
+		const bool is_midi = i < n_out_midi;
+		uint32_t pn = is_midi ? i : i - n_out_midi;
+		DataType dt = is_midi ? DataType::MIDI : DataType::AUDIO;
+		double x = pin_x_pos (i, width, n_out, 0, is_midi);
+
+		if (!_terminal) {
+			bool valid_thru_f = false;
+			// skip connections that are not used in the next's input
+			if (_feeding) {
+				bool valid_sink;
+				_i_in_map.get_src (dt, pn, &valid_sink);
+				_i_thru_map.get_src (dt, pn, &valid_thru_f);
+				if (!valid_thru_f && !valid_sink) {
+					if (!is_midi || i != 0) { // special case midi-bypass
+						continue;
+					}
+				}
+			}
+
+			bool valid_src;
+			_out_map.get_src (dt, pn, &valid_src);
+			if (!valid_src) {
+				bool valid_thru;
+				uint32_t idx = _thru_map.get (dt, pn, &valid_thru);
+				if (valid_thru) {
+					if (idx >= _in.get (dt)) {
+						draw_sidechain (cr, x, 0, height, is_midi);
+					} else {
+						draw_thru_src (cr, x, 0, height, is_midi);
+					}
+				} else if (valid_thru_f){
+					// gnd is part of input, unless it's a thru input
+					// (also only true if !coalesced into one small display)
+					draw_gnd (cr, x, 0, height, is_midi);
+				}
+			}
 		} else {
-			si_x0 = rintf(width * (.2f + .6f * midi_sources / (sources - 1.f))) + .5f;
+			// terminal node, add arrows
+			bool valid_src;
+			_out_map.get_src (dt, pn, &valid_src);
+			if (!valid_src) {
+				bool valid_thru;
+				uint32_t idx = _thru_map.get (dt, pn, &valid_thru);
+				if (valid_thru) {
+					if (idx >= _in.get (dt)) {
+						draw_sidechain (cr, x, 0, height - dh, is_midi);
+					} else {
+						draw_thru_src (cr, x, 0, height - dh, is_midi);
+					}
+				} else {
+					draw_gnd (cr, x, 0, height - dh, is_midi);
+				}
+			}
+
+			set_routing_color (cr, is_midi);
+			cairo_set_line_width (cr, 1.0);
+			cairo_move_to (cr, x, height - dh);
+			cairo_line_to (cr, x, height - 2);
+			cairo_stroke (cr);
+
+			const double ar = dh - 1;
+			cairo_move_to (cr, x - ar, height - ar);
+			cairo_line_to (cr, x     , height - .5);
+			cairo_line_to (cr, x + ar, height - ar);
+			cairo_line_to (cr, x     , height - ar * .5);
+			cairo_close_path (cr);
+			cairo_fill_preserve (cr);
+			cairo_stroke (cr);
 		}
-		cairo_move_to (cr, si_x, height);
-		cairo_curve_to (cr, si_x, 0, si_x0, height, si_x0, 0);
-		cairo_stroke (cr);
-#ifndef NDEBUG
-	} else if (audio_sources != 0 && audio_sinks != 0) {
-		PBD::warning << string_compose("Programming error: audio routing display: A %1 -> %2 | M %3 -> %4 | T %5 -> %6",
-				audio_sources, audio_sinks, midi_sources, midi_sinks, sources, sinks) << endmsg;
-#endif
 	}
+}
+
+ProcessorEntry::PluginDisplay::PluginDisplay (ProcessorEntry& e, boost::shared_ptr<ARDOUR::Plugin> p, uint32_t max_height)
+	: _entry (e)
+	, _plug (p)
+	, _surf (0)
+	, _max_height (max_height)
+	, _cur_height (1)
+	, _scroll (false)
+{
+	set_name ("processor prefader");
+	add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK);
+	_plug->DropReferences.connect (_death_connection, invalidator (*this), boost::bind (&PluginDisplay::plugin_going_away, this), gui_context());
+	_plug->QueueDraw.connect (_qdraw_connection, invalidator (*this),
+			boost::bind (&Gtk::Widget::queue_draw, this), gui_context ());
+
+	std::string postfix = "";
+	if (_plug->has_editor()) {
+		ARDOUR_UI_UTILS::set_tooltip (*this,
+				string_compose (_("<b>%1</b>\nDouble-click to show GUI.\n%2+double-click to show generic GUI.%3"), e.name (Wide), Keyboard::primary_modifier_name (), postfix));
+	} else {
+		ARDOUR_UI_UTILS::set_tooltip (*this,
+				string_compose (_("<b>%1</b>\nDouble-click to show generic GUI.%2"), e.name (Wide), postfix));
+	}
+}
+
+ProcessorEntry::PluginDisplay::~PluginDisplay ()
+{
+	if (_surf) {
+		cairo_surface_destroy (_surf);
+	}
+}
+
+bool
+ProcessorEntry::PluginDisplay::on_button_press_event (GdkEventButton *ev)
+{
+	assert (_entry.processor ());
+
+	// consider some tweaks to pass this up to the DnDVBox somehow:
+	// select processor, then call (private)
+	//_entry._parent->processor_button_press_event (ev, &_entry);
+	if (Keyboard::is_edit_event (ev) || (ev->button == 1 && ev->type == GDK_2BUTTON_PRESS)) {
+		if (Keyboard::modifier_state_equals (ev->state, Keyboard::SecondaryModifier)) {
+			_entry._parent->generic_edit_processor (_entry.processor ());
+		} else {
+			_entry._parent->edit_processor (_entry.processor ());
+		}
+		return true;
+	}
+	return false;
+}
+
+bool
+ProcessorEntry::PluginDisplay::on_button_release_event (GdkEventButton *ev)
+{
+	return false;
+}
+
+void
+ProcessorEntry::PluginDisplay::on_size_request (Requisition* req)
+{
+	req->width = 56;
+	req->height = _cur_height;
+}
+
+
+void
+ProcessorEntry::PluginDisplay::update_height_alloc (uint32_t inline_height)
+{
+	/* work-around scroll-bar + aspect ratio
+	 * show inline-view -> height changes -> scrollbar gets added
+	 * -> width changes -> inline-view, fixed aspect ratio -> height changes
+	 * -> scroll bar is removed [-> width changes ; repeat ]
+	 */
+	uint32_t shm = std::min (_max_height, inline_height);
+	bool sc = false;
+	Gtk::Container* pr = get_parent();
+	for (uint32_t i = 0; i < 4 && pr; ++i) {
+		// VBox, EventBox, ViewPort, ScrolledWindow
+		pr = pr->get_parent();
+	}
+	Gtk::ScrolledWindow* sw = dynamic_cast<Gtk::ScrolledWindow*> (pr);
+	if (sw) {
+		const Gtk::VScrollbar* vsb = sw->get_vscrollbar();
+		sc = vsb && vsb->is_visible();
+	}
+
+	if (shm != _cur_height) {
+		if (_scroll == sc || _cur_height < shm) {
+			queue_resize ();
+		}
+		_cur_height = shm;
+	}
+	_scroll = sc;
+}
+
+uint32_t
+ProcessorEntry::PluginDisplay::render_inline (cairo_t* cr, uint32_t width)
+{
+	Plugin::Display_Image_Surface* dis = _plug->render_inline_display (width, _max_height);
+	if (!dis) {
+		return 0;
+	}
+
+	/* allocate a local image-surface,
+	 * We cannot re-use the data via cairo_image_surface_create_for_data(),
+	 * since pixman keeps a reference to it.
+	 * we'd need to hand over the data and ha cairo_surface_destroy to free it.
+	 * it might be possible to work around via cairo_surface_set_user_data().
+	 */
+	if (!_surf
+			|| dis->width !=  cairo_image_surface_get_width (_surf)
+			|| dis->height !=  cairo_image_surface_get_height (_surf)
+		 ) {
+		if (_surf) {
+			cairo_surface_destroy (_surf);
+		}
+		_surf = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, dis->width, dis->height);
+	}
+
+	if (cairo_image_surface_get_stride (_surf) == dis->stride) {
+		memcpy (cairo_image_surface_get_data (_surf), dis->data, dis->stride * dis->height);
+	} else {
+		unsigned char *src = dis->data;
+		unsigned char *dst = cairo_image_surface_get_data (_surf);
+		const int dst_stride =  cairo_image_surface_get_stride (_surf);
+		for (int y = 0; y < dis->height; ++y) {
+			memcpy (dst, src, dis->width * 4 /*ARGB32*/);
+			src += dis->stride;
+			dst += dst_stride;
+		}
+	}
+
+	cairo_surface_flush(_surf);
+	cairo_surface_mark_dirty(_surf);
+	const double xc = floor ((width - dis->width) * .5);
+	cairo_set_source_surface(cr, _surf, xc, 0);
+	cairo_paint (cr);
+
+	return dis->height;
+}
+
+bool
+ProcessorEntry::PluginDisplay::on_expose_event (GdkEventExpose* ev)
+{
+	Gtk::Allocation a = get_allocation();
+	double const width = a.get_width();
+	double const height = a.get_height();
+
+	cairo_t* cr = gdk_cairo_create (get_window()->gobj());
+	cairo_rectangle (cr, ev->area.x, ev->area.y, ev->area.width, ev->area.height);
+	cairo_clip (cr);
+
+	Gdk::Color const bg = get_style()->get_bg (STATE_NORMAL);
+	cairo_set_source_rgb (cr, bg.get_red_p (), bg.get_green_p (), bg.get_blue_p ());
+	cairo_rectangle (cr, 0, 0, width, height);
+	cairo_fill (cr);
+
+	cairo_save (cr);
+	cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
+	Gtkmm2ext::rounded_rectangle (cr, .5, -1.5, width - 1, height + 1, 7);
+	cairo_clip (cr);
+	cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
+
+	uint32_t ht = render_inline (cr, width);
+	cairo_restore (cr);
+
+	if (ht == 0) {
+		hide ();
+		if (_cur_height != 1) {
+			_cur_height = 1;
+			queue_resize ();
+		}
+		cairo_destroy (cr);
+		return true;
+	} else {
+		update_height_alloc (ht);
+	}
+
+	bool failed = false;
+	std::string name = get_name();
+	ArdourCanvas::Color fill_color = UIConfiguration::instance().color (string_compose ("%1: fill active", name), &failed);
+
+	Gtkmm2ext::rounded_rectangle (cr, .5, -1.5, width - 1, height + 1, 7);
+	cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
+	cairo_set_line_width(cr, 1.0);
+	ArdourCanvas::set_source_rgb_a (cr, fill_color, 1.0);
+	cairo_stroke (cr);
+
 	cairo_destroy(cr);
 	return true;
 }
 
+ProcessorEntry::LuaPluginDisplay::LuaPluginDisplay (ProcessorEntry& e, boost::shared_ptr<ARDOUR::LuaProc> p, uint32_t max_height)
+	: PluginDisplay (e, p, max_height)
+	, _luaproc (p)
+	, _lua_render_inline (0)
+{
+	p->setup_lua_inline_gui (&lua_gui);
+
+	lua_State* LG = lua_gui.getState ();
+	LuaInstance::bind_cairo (LG);
+	luabridge::LuaRef lua_render = luabridge::getGlobal (LG, "render_inline");
+	assert (lua_render.isFunction ());
+	_lua_render_inline = new luabridge::LuaRef (lua_render);
+}
+
+ProcessorEntry::LuaPluginDisplay::~LuaPluginDisplay ()
+{
+	delete (_lua_render_inline);
+}
+
+uint32_t
+ProcessorEntry::LuaPluginDisplay::render_inline (cairo_t *cr, uint32_t width)
+{
+	Cairo::Context ctx (cr);
+	try {
+		luabridge::LuaRef rv = (*_lua_render_inline)((Cairo::Context *)&ctx, width, _max_height);
+		lua_gui.collect_garbage_step ();
+		if (rv.isTable ()) {
+			uint32_t h = rv[2];
+			return h;
+		}
+	} catch (luabridge::LuaException const& e) {
+#ifndef NDEBUG
+		cerr << "LuaException:" << e.what () << endl;
+#endif
+	}
+	return 0;
+}
+
+
 static std::list<Gtk::TargetEntry> drop_targets()
 {
 	std::list<Gtk::TargetEntry> tmp;
 	tmp.push_back (Gtk::TargetEntry ("processor")); // from processor-box to processor-box
 	tmp.push_back (Gtk::TargetEntry ("PluginInfoPtr")); // from plugin-manager
-	tmp.push_back (Gtk::TargetEntry ("PluginPresetPtr")); // from sidebar
+	tmp.push_back (Gtk::TargetEntry ("PluginFavoritePtr")); // from sidebar
 	return tmp;
 }
 
@@ -1137,10 +1773,16 @@ ProcessorBox::ProcessorBox (ARDOUR::Session* sess, boost::function<PluginSelecto
 	, _rr_selection(rsel)
 	, processor_display (drop_targets())
 	, _redisplay_pending (false)
-
 {
 	set_session (sess);
 
+	/* ProcessorBox actions and bindings created statically by call to
+	 * ProcessorBox::register_actions(), made by ARDOUR_UI so that actions
+	 * are available for context menus.
+	 */
+
+	processor_display.set_data ("ardour-bindings", bindings);
+
 	_width = Wide;
 	processor_menu = 0;
 	no_processor_redisplay = false;
@@ -1271,7 +1913,7 @@ ProcessorBox::_drop_plugin_preset (Gtk::SelectionData const &data, Route::Proces
 
 			boost::shared_ptr<Processor> processor (new PluginInsert (*_session, p));
 			if (Config->get_new_plugins_active ()) {
-				processor->activate ();
+				processor->enable (true);
 			}
 			pl.push_back (processor);
 		}
@@ -1294,7 +1936,7 @@ ProcessorBox::_drop_plugin (Gtk::SelectionData const &data, Route::ProcessorList
 			}
 			boost::shared_ptr<Processor> processor (new PluginInsert (*_session, p));
 			if (Config->get_new_plugins_active ()) {
-				processor->activate ();
+				processor->enable (true);
 			}
 			pl.push_back (processor);
 		}
@@ -1313,7 +1955,7 @@ ProcessorBox::plugin_drop (Gtk::SelectionData const &data, ProcessorEntry* posit
 	if (data.get_target() == "PluginInfoPtr") {
 		_drop_plugin (data, pl);
 	}
-	else if (data.get_target() == "PluginPresetPtr") {
+	else if (data.get_target() == "PluginFavoritePtr") {
 		_drop_plugin_preset (data, pl);
 	}
 	else {
@@ -1334,6 +1976,28 @@ not match the configuration of this track.");
 void
 ProcessorBox::object_drop (DnDVBox<ProcessorEntry>* source, ProcessorEntry* position, Glib::RefPtr<Gdk::DragContext> const & context)
 {
+	if (Gdk::ACTION_LINK == context->get_selected_action()) {
+		list<ProcessorEntry*> children = source->selection ();
+		assert (children.size() == 1);
+		ProcessorEntry* other = *children.begin();
+		assert (other->can_copy_state (position));
+		boost::shared_ptr<ARDOUR::Processor> otherproc = other->processor();
+		boost::shared_ptr<ARDOUR::Processor> proc = position->processor();
+		boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert> (proc);
+		assert (otherproc && proc && pi);
+
+		PBD::ID id = pi->id();
+		XMLNode& state = otherproc->get_state ();
+		/* strip side-chain state (processor inside processor must be a side-chain)
+		 * otherwise we'll end up with duplicate ports-names.
+		 * (this needs a better solution which retains connections)
+		 */
+		state.remove_nodes ("Processor");
+		proc->set_state (state, Stateful::loading_state_version);
+		boost::dynamic_pointer_cast<PluginInsert>(proc)->update_id (id);
+		return;
+	}
+
 	boost::shared_ptr<Processor> p = find_drop_position (position);
 
 	list<ProcessorEntry*> children = source->selection ();
@@ -1470,19 +2134,22 @@ ProcessorBox::show_processor_menu (int arg)
 		}
 	}
 
-	Gtk::MenuItem* send_menu_item = dynamic_cast<Gtk::MenuItem*>(ActionManager::get_widget("/ProcessorMenu/send_options"));
-	if (send_menu_item) {
-		if (single_selection && !_route->is_monitor()) {
-			Menu* m = single_selection->build_send_options_menu ();
-			if (m && !m->items().empty()) {
-				send_menu_item->set_submenu (*m);
-				send_menu_item->set_sensitive (true);
+
+	if (!ARDOUR::Profile->get_mixbus()) {
+		Gtk::MenuItem* send_menu_item = dynamic_cast<Gtk::MenuItem*>(ActionManager::get_widget("/ProcessorMenu/send_options"));
+		if (send_menu_item) {
+			if (single_selection && !_route->is_monitor()) {
+				Menu* m = single_selection->build_send_options_menu ();
+				if (m && !m->items().empty()) {
+					send_menu_item->set_submenu (*m);
+					send_menu_item->set_sensitive (true);
+				} else {
+					gtk_menu_item_set_submenu (send_menu_item->gobj(), 0);
+					send_menu_item->set_sensitive (false);
+				}
 			} else {
-				gtk_menu_item_set_submenu (send_menu_item->gobj(), 0);
 				send_menu_item->set_sensitive (false);
 			}
-		} else {
-			send_menu_item->set_sensitive (false);
 		}
 	}
 
@@ -1495,6 +2162,7 @@ ProcessorBox::show_processor_menu (int arg)
 	cut_action->set_sensitive (sensitive && can_cut ());
 	copy_action->set_sensitive (sensitive);
 	delete_action->set_sensitive (sensitive || stub_processor_selected ());
+	backspace_action->set_sensitive (sensitive || stub_processor_selected ());
 
 	edit_action->set_sensitive (one_processor_can_be_edited ());
 	edit_generic_action->set_sensitive (one_processor_can_be_edited ());
@@ -1504,6 +2172,8 @@ ProcessorBox::show_processor_menu (int arg)
 		pi = boost::dynamic_pointer_cast<PluginInsert> (single_selection->processor ());
 	}
 
+	manage_pins_action->set_sensitive (pi != 0);
+
 	/* allow editing with an Ardour-generated UI for plugin inserts with editors */
 	edit_action->set_sensitive (pi && pi->plugin()->has_editor ());
 
@@ -1530,13 +2200,25 @@ ProcessorBox::show_processor_menu (int arg)
 bool
 ProcessorBox::enter_notify (GdkEventCrossing*)
 {
+	processor_display.grab_focus ();
 	_current_processor_box = this;
 	return false;
 }
 
 bool
-ProcessorBox::leave_notify (GdkEventCrossing*)
+ProcessorBox::leave_notify (GdkEventCrossing* ev)
 {
+	if (ev->detail == GDK_NOTIFY_INFERIOR) {
+		return false;
+	}
+
+	Widget* top = get_toplevel();
+
+	if (top->is_toplevel()) {
+		Window* win = dynamic_cast<Window*> (top);
+		gtk_window_set_focus (win->gobj(), 0);
+	}
+
 	return false;
 }
 
@@ -1560,8 +2242,9 @@ ProcessorBox::processor_operation (ProcessorOperation op)
 	}
 */
 
-	if ( (op == ProcessorsDelete) && targets.empty() )
+	if ((op == ProcessorsDelete) && targets.empty()) {
 		return false;  //nothing to delete.  return false so the editor-mixer, because the user was probably intending to delete something in the editor
+	}
 
 	switch (op) {
 	case ProcessorsSelectAll:
@@ -1602,11 +2285,7 @@ ProcessorBox::processor_operation (ProcessorOperation op)
 
 	case ProcessorsToggleActive:
 		for (ProcSelection::iterator i = targets.begin(); i != targets.end(); ++i) {
-			if ((*i)->active()) {
-				(*i)->deactivate ();
-			} else {
-				(*i)->activate ();
-			}
+			(*i)->enable (!(*i)->enabled ());
 		}
 		break;
 
@@ -1692,18 +2371,13 @@ ProcessorBox::processor_button_release_event (GdkEventButton *ev, ProcessorEntry
 				boost::weak_ptr<Processor>(processor)));
 
 	} else if (processor && Keyboard::is_button2_event (ev)
-#ifndef GTKOSX
+#ifndef __APPLE__
 		   && (Keyboard::no_modifier_keys_pressed (ev) && ((ev->state & Gdk::BUTTON2_MASK) == Gdk::BUTTON2_MASK))
 #endif
 		) {
 
 		/* button2-click with no/appropriate modifiers */
-
-		if (processor->active()) {
-			processor->deactivate ();
-		} else {
-			processor->activate ();
-		}
+		processor->enable (!processor->enabled ());
 	}
 
 	return false;
@@ -1749,8 +2423,10 @@ ProcessorBox::use_plugins (const SelectedPlugins& plugins)
 			weird_plugin_dialog (**p, err_streams);
 			return true;
 			// XXX SHAREDPTR delete plugin here .. do we even need to care?
-		} else if (plugins.size() == 1 && Config->get_open_gui_after_adding_plugin()) {
-			if (_session->engine().connected () && processor_can_be_edited (processor)) {
+		} else if (plugins.size() == 1 && UIConfiguration::instance().get_open_gui_after_adding_plugin()) {
+			if (boost::dynamic_pointer_cast<PluginInsert>(processor)->plugin()->has_inline_display() && UIConfiguration::instance().get_prefer_inline_over_gui()) {
+				;
+			} else if (_session->engine().connected () && processor_can_be_edited (processor)) {
 				if ((*p)->has_editor ()) {
 					edit_processor (processor);
 				} else {
@@ -1766,6 +2442,16 @@ ProcessorBox::use_plugins (const SelectedPlugins& plugins)
 void
 ProcessorBox::weird_plugin_dialog (Plugin& p, Route::ProcessorStreams streams)
 {
+	/* XXX this needs to be re-worked!
+	 *
+	 * With new pin-management "streams" is no longer correct.
+	 * p.get_info () is also incorrect for variable i/o plugins (always -1,-1).
+	 *
+	 * Since pin-management was added, this dialog will only show in a very rare
+	 * condition (non-replicated variable i/o configuration failed).
+	 *
+	 * TODO: simplify the message after the string-freeze is lifted.
+	 */
 	ArdourDialog dialog (_("Plugin Incompatibility"));
 	Label label;
 
@@ -1819,11 +2505,10 @@ ProcessorBox::choose_insert ()
 void
 ProcessorBox::choose_send ()
 {
-	boost::shared_ptr<Pannable> sendpan(new Pannable (*_session));
-	boost::shared_ptr<Send> send (new Send (*_session, sendpan, _route->mute_master()));
+	boost::shared_ptr<Send> send (new Send (*_session, _route->pannable (), _route->mute_master()));
 
 	/* make an educated guess at the initial number of outputs for the send */
-	ChanCount outs = (_session->master_out())
+	ChanCount outs = (_route->n_outputs().n_audio() && _session->master_out())
 			? _session->master_out()->n_outputs()
 			: _route->n_outputs();
 
@@ -1876,9 +2561,6 @@ ProcessorBox::send_io_finished (IOSelector::Result r, boost::weak_ptr<Processor>
 
 	case IOSelector::Accepted:
 		_route->add_processor_by_index (processor, _placement);
-		if (Profile->get_sae()) {
-			processor->activate ();
-		}
 		break;
 	}
 
@@ -1904,9 +2586,6 @@ ProcessorBox::return_io_finished (IOSelector::Result r, boost::weak_ptr<Processo
 
 	case IOSelector::Accepted:
 		_route->add_processor_by_index (processor, _placement);
-		if (Profile->get_sae()) {
-			processor->activate ();
-		}
 		break;
 	}
 
@@ -1960,6 +2639,8 @@ ProcessorBox::redisplay_processors ()
 
 	_route->foreach_processor (sigc::mem_fun (*this, &ProcessorBox::add_processor_to_display));
 	_route->foreach_processor (sigc::mem_fun (*this, &ProcessorBox::maybe_add_processor_to_ui_list));
+	_route->foreach_processor (sigc::mem_fun (*this, &ProcessorBox::maybe_add_processor_pin_mgr));
+
 	setup_entry_positions ();
 }
 
@@ -2002,7 +2683,7 @@ ProcessorBox::maybe_add_processor_to_ui_list (boost::weak_ptr<Processor> w)
 	const XMLNode* ui_xml = _session->extra_xml (X_("UI"));
 
 	if (ui_xml) {
-		wp->set_state (*ui_xml);
+		wp->set_state (*ui_xml, 0);
 	}
 
         void* existing_ui = p->get_ui ();
@@ -2016,6 +2697,26 @@ ProcessorBox::maybe_add_processor_to_ui_list (boost::weak_ptr<Processor> w)
 }
 
 void
+ProcessorBox::maybe_add_processor_pin_mgr (boost::weak_ptr<Processor> w)
+{
+	boost::shared_ptr<Processor> p = w.lock ();
+	if (!p || p->pinmgr_proxy ()) {
+		return;
+	}
+
+	PluginPinWindowProxy* wp = new PluginPinWindowProxy (
+			string_compose ("PM-%2-%3", _route->id(), p->id()), w);
+	wp->set_session (_session);
+
+	const XMLNode* ui_xml = _session->extra_xml (X_("UI"));
+	if (ui_xml) {
+		wp->set_state (*ui_xml, 0);
+	}
+
+	p->set_pingmgr_proxy (wp);
+	WM::Manager::instance().register_window (wp);
+}
+void
 ProcessorBox::help_count_visible_prefader_processors (boost::weak_ptr<Processor> p, uint32_t* cnt, bool* amp_seen)
 {
 	boost::shared_ptr<Processor> processor (p.lock ());
@@ -2027,7 +2728,7 @@ ProcessorBox::help_count_visible_prefader_processors (boost::weak_ptr<Processor>
 	                 )
 	   ) {
 
-		if (boost::dynamic_pointer_cast<Amp>(processor) && 
+		if (boost::dynamic_pointer_cast<Amp>(processor) &&
 		    boost::dynamic_pointer_cast<Amp>(processor)->gain_control()->parameter().type() == GainAutomation) {
 			*amp_seen = true;
 		} else {
@@ -2111,6 +2812,136 @@ ProcessorBox::reordered ()
 }
 
 void
+ProcessorBox::setup_routing_feeds ()
+{
+	list<ProcessorEntry*> children = processor_display.children ();
+	/* first set the i/o maps for every processor */
+	list<ProcessorEntry*>::iterator prev = children.begin();
+
+	for (list<ProcessorEntry*>::iterator i = children.begin(); i != children.end(); ++i) {
+		boost::shared_ptr<ARDOUR::Processor> p = (*i)->processor();
+		boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert> (p);
+
+		list<ProcessorEntry*>::iterator next = i;
+		next++;
+
+		if (pi) {
+			ChanCount sinks = pi->natural_input_streams ();
+			ChanCount sources = pi->natural_output_streams ();
+			uint32_t count = pi->get_count ();
+			ChanCount in, out;
+			pi->configured_io (in, out);
+
+			ChanCount midi_thru;
+			ChanCount midi_bypass;
+			ChanMapping input_map (pi->input_map ());
+			if (pi->has_midi_thru ()) {
+				 midi_thru.set(DataType::MIDI, 1);
+				 input_map.set (DataType::MIDI, 0, 0);
+			}
+			if (pi->has_midi_bypass ()) {
+				 midi_bypass.set(DataType::MIDI, 1);
+			}
+
+			(*i)->input_icon.set_ports (sinks * count + midi_thru);
+			(*i)->output_icon.set_ports (sources * count + midi_bypass);
+
+			(*i)->routing_icon.set (
+					in, out,
+					sinks * count + midi_thru,
+					sources * count + midi_bypass,
+					input_map,
+					pi->output_map (),
+					pi->thru_map ());
+
+			if (next != children.end()) {
+				(*next)->routing_icon.set_fed_by (out, sources * count + midi_bypass,
+						pi->output_map (), pi->thru_map ());
+			}
+
+			if (prev != i) {
+				(*prev)->routing_icon.set_feeding (in, sinks * count + midi_thru,
+						pi->input_map (), pi->thru_map ());
+			}
+
+		} else {
+			(*i)->input_icon.set_ports (p->input_streams());
+			(*i)->output_icon.set_ports (p->output_streams());
+			ChanMapping inmap (p->input_streams ());
+			ChanMapping outmap (p->input_streams ());
+			ChanMapping thrumap;
+			(*i)->routing_icon.set (
+					p->input_streams(),
+					p->output_streams(),
+					p->input_streams(),
+					p->output_streams(),
+					inmap, outmap, thrumap);
+
+			if (next != children.end()) {
+				(*next)->routing_icon.set_fed_by (
+						p->output_streams(),
+						p->output_streams(),
+						outmap, thrumap);
+			}
+			if (prev != i) {
+				(*prev)->routing_icon.set_feeding (
+						p->input_streams(),
+						p->output_streams(),
+						inmap, thrumap);
+			}
+		}
+
+		if (i == children.begin()) {
+			(*i)->routing_icon.unset_fed_by ();
+		}
+		prev = i;
+		(*i)->input_icon.hide();
+	}
+
+	/* now set which icons need to be displayed */
+	for (list<ProcessorEntry*>::iterator i = children.begin(); i != children.end(); ++i) {
+		(*i)->output_routing_icon.copy_state ((*i)->routing_icon);
+
+		if ((*i)->routing_icon.in_identity ()) {
+			(*i)->routing_icon.hide();
+			if (i == children.begin()) {
+				(*i)->input_icon.show();
+			}
+		} else {
+			(*i)->routing_icon.show();
+			(*i)->routing_icon.queue_draw();
+			(*i)->input_icon.show();
+		}
+
+		list<ProcessorEntry*>::iterator next = i;
+		if (++next == children.end()) {
+			// last processor in the chain
+			(*i)->output_routing_icon.set_terminal(true);
+			(*i)->output_routing_icon.unset_feeding ();
+			if ((*i)->routing_icon.out_identity ()) {
+				(*i)->output_routing_icon.hide();
+			} else {
+				(*i)->output_routing_icon.show();
+				(*i)->output_routing_icon.queue_draw();
+			}
+		} else {
+			(*i)->output_routing_icon.set_terminal(false);
+			if (   !(*i)->routing_icon.out_identity ()
+					&& !(*next)->routing_icon.in_identity ()
+					&&  (*next)->routing_icon.can_coalesce ()) {
+				(*i)->output_routing_icon.hide();
+			} else if (!(*i)->routing_icon.out_identity ()) {
+				(*i)->output_routing_icon.show();
+				(*i)->output_routing_icon.queue_draw();
+				(*next)->input_icon.show();
+			} else {
+				(*i)->output_routing_icon.hide();
+			}
+		}
+	}
+}
+
+void
 ProcessorBox::setup_entry_positions ()
 {
 	list<ProcessorEntry*> children = processor_display.children ();
@@ -2118,7 +2949,7 @@ ProcessorBox::setup_entry_positions ()
 
 	uint32_t num = 0;
 	for (list<ProcessorEntry*>::iterator i = children.begin(); i != children.end(); ++i) {
-		if (boost::dynamic_pointer_cast<Amp>((*i)->processor()) && 
+		if (boost::dynamic_pointer_cast<Amp>((*i)->processor()) &&
 		    boost::dynamic_pointer_cast<Amp>((*i)->processor())->gain_control()->parameter().type() == GainAutomation) {
 			pre_fader = false;
 			(*i)->set_position (ProcessorEntry::Fader, num++);
@@ -2130,6 +2961,7 @@ ProcessorBox::setup_entry_positions ()
 			}
 		}
 	}
+	setup_routing_feeds ();
 }
 
 void
@@ -2292,7 +3124,7 @@ ProcessorBox::copy_processors (const ProcSelection& to_be_copied)
 		    (boost::dynamic_pointer_cast<Return>((*i)) != 0)) {
 			node->add_child_nocopy ((*i)->get_state());
 		}
-  	}
+	}
 
 	_rr_selection.set (node);
 }
@@ -2520,14 +3352,27 @@ ProcessorBox::paste_processor_state (const XMLNodeList& nlist, boost::shared_ptr
 				}
 
 				p.reset (pi);
-
 			} else {
 				/* XXX its a bit limiting to assume that everything else
 				   is a plugin.
 				*/
 				p.reset (new PluginInsert (*_session));
+				/* we can't use RAII Stateful::ForceIDRegeneration
+				 * because that'd void copying the state and wrongly bump
+				 * the state-version counter.
+				 * we need to load the state (incl external files) first and
+				 * only then update the ID)
+				 */
 				PBD::ID id = p->id();
-				p->set_state (**niter, Stateful::current_state_version);
+				/* strip side-chain state (processor inside processor must be a side-chain)
+				 * otherwise we'll end up with duplicate ports-names.
+				 * (this needs a better solution which retains connections)
+				 * We really would want Stateful::ForceIDRegeneration here :(
+				 */
+				XMLNode state (**niter);
+				state.remove_nodes ("Processor");
+
+				p->set_state (state, Stateful::current_state_version);
 				boost::dynamic_pointer_cast<PluginInsert>(p)->update_id (id);
 			}
 
@@ -2800,68 +3645,81 @@ ProcessorBox::get_generic_editor_window (boost::shared_ptr<Processor> processor)
 void
 ProcessorBox::register_actions ()
 {
-	Glib::RefPtr<Gtk::ActionGroup> popup_act_grp = Gtk::ActionGroup::create(X_("ProcessorMenu"));
+	processor_box_actions = myactions.create_action_group (X_("ProcessorMenu"));
+
 	Glib::RefPtr<Action> act;
 
 	/* new stuff */
-	ActionManager::register_action (popup_act_grp, X_("newplugin"), _("New Plugin"),
+	myactions.register_action (processor_box_actions, X_("newplugin"), _("New Plugin"),
 			sigc::ptr_fun (ProcessorBox::rb_choose_plugin));
 
-	act = ActionManager::register_action (popup_act_grp, X_("newinsert"), _("New Insert"),
+	act = myactions.register_action (processor_box_actions, X_("newinsert"), _("New Insert"),
 			sigc::ptr_fun (ProcessorBox::rb_choose_insert));
 	ActionManager::engine_sensitive_actions.push_back (act);
-	act = ActionManager::register_action (popup_act_grp, X_("newsend"), _("New External Send ..."),
+	act = myactions.register_action (processor_box_actions, X_("newsend"), _("New External Send ..."),
 			sigc::ptr_fun (ProcessorBox::rb_choose_send));
 	ActionManager::engine_sensitive_actions.push_back (act);
 
-	ActionManager::register_action (popup_act_grp, X_("newaux"), _("New Aux Send ..."));
+	myactions.register_action (processor_box_actions, X_("newaux"), _("New Aux Send ..."));
 
-	ActionManager::register_action (popup_act_grp, X_("controls"), _("Controls"));
-	ActionManager::register_action (popup_act_grp, X_("send_options"), _("Send Options"));
+	myactions.register_action (processor_box_actions, X_("controls"), _("Controls"));
+	myactions.register_action (processor_box_actions, X_("send_options"), _("Send Options"));
 
-	ActionManager::register_action (popup_act_grp, X_("clear"), _("Clear (all)"),
+	myactions.register_action (processor_box_actions, X_("clear"), _("Clear (all)"),
 			sigc::ptr_fun (ProcessorBox::rb_clear));
-	ActionManager::register_action (popup_act_grp, X_("clear_pre"), _("Clear (pre-fader)"),
+	myactions.register_action (processor_box_actions, X_("clear_pre"), _("Clear (pre-fader)"),
 			sigc::ptr_fun (ProcessorBox::rb_clear_pre));
-	ActionManager::register_action (popup_act_grp, X_("clear_post"), _("Clear (post-fader)"),
+	myactions.register_action (processor_box_actions, X_("clear_post"), _("Clear (post-fader)"),
 			sigc::ptr_fun (ProcessorBox::rb_clear_post));
 
 	/* standard editing stuff */
-	cut_action = ActionManager::register_action (popup_act_grp, X_("cut"), _("Cut"),
-                                                     sigc::ptr_fun (ProcessorBox::rb_cut));
-	copy_action = ActionManager::register_action (popup_act_grp, X_("copy"), _("Copy"),
-			sigc::ptr_fun (ProcessorBox::rb_copy));
-	delete_action = ActionManager::register_action (popup_act_grp, X_("delete"), _("Delete"),
-			sigc::ptr_fun (ProcessorBox::rb_delete));
-
-	paste_action = ActionManager::register_action (popup_act_grp, X_("paste"), _("Paste"),
+
+	cut_action = myactions.register_action (processor_box_actions, X_("cut"), _("Cut"),
+	                                                    sigc::ptr_fun (ProcessorBox::rb_cut));
+	copy_action = myactions.register_action (processor_box_actions, X_("copy"), _("Copy"),
+	                                                     sigc::ptr_fun (ProcessorBox::rb_copy));
+	delete_action = myactions.register_action (processor_box_actions, X_("delete"), _("Delete"),
+	                                                       sigc::ptr_fun (ProcessorBox::rb_delete));
+	backspace_action = myactions.register_action (processor_box_actions, X_("backspace"), _("Delete"),
+	                                                       sigc::ptr_fun (ProcessorBox::rb_delete));
+
+	ActionManager::plugin_selection_sensitive_actions.push_back (cut_action);
+	ActionManager::plugin_selection_sensitive_actions.push_back (copy_action);
+	ActionManager::plugin_selection_sensitive_actions.push_back (delete_action);
+	ActionManager::plugin_selection_sensitive_actions.push_back (backspace_action);
+
+	paste_action = myactions.register_action (processor_box_actions, X_("paste"), _("Paste"),
 			sigc::ptr_fun (ProcessorBox::rb_paste));
-	rename_action = ActionManager::register_action (popup_act_grp, X_("rename"), _("Rename"),
+	rename_action = myactions.register_action (processor_box_actions, X_("rename"), _("Rename"),
 			sigc::ptr_fun (ProcessorBox::rb_rename));
-	ActionManager::register_action (popup_act_grp, X_("selectall"), _("Select All"),
+	myactions.register_action (processor_box_actions, X_("selectall"), _("Select All"),
 			sigc::ptr_fun (ProcessorBox::rb_select_all));
-	ActionManager::register_action (popup_act_grp, X_("deselectall"), _("Deselect All"),
+	myactions.register_action (processor_box_actions, X_("deselectall"), _("Deselect All"),
 			sigc::ptr_fun (ProcessorBox::rb_deselect_all));
 
 	/* activation etc. */
 
-	ActionManager::register_action (popup_act_grp, X_("activate_all"), _("Activate All"),
+	myactions.register_action (processor_box_actions, X_("activate_all"), _("Activate All"),
 			sigc::ptr_fun (ProcessorBox::rb_activate_all));
-	ActionManager::register_action (popup_act_grp, X_("deactivate_all"), _("Deactivate All"),
+	myactions.register_action (processor_box_actions, X_("deactivate_all"), _("Deactivate All"),
 			sigc::ptr_fun (ProcessorBox::rb_deactivate_all));
-	ActionManager::register_action (popup_act_grp, X_("ab_plugins"), _("A/B Plugins"),
+	myactions.register_action (processor_box_actions, X_("ab_plugins"), _("A/B Plugins"),
 			sigc::ptr_fun (ProcessorBox::rb_ab_plugins));
 
+	manage_pins_action = myactions.register_action (
+		processor_box_actions, X_("manage-pins"), _("Pin Connections..."),
+		sigc::ptr_fun (ProcessorBox::rb_manage_pins));
+
 	/* show editors */
-	edit_action = ActionManager::register_action (
-		popup_act_grp, X_("edit"), _("Edit..."),
+	edit_action = myactions.register_action (
+		processor_box_actions, X_("edit"), _("Edit..."),
 		sigc::ptr_fun (ProcessorBox::rb_edit));
 
-	edit_generic_action = ActionManager::register_action (
-		popup_act_grp, X_("edit-generic"), _("Edit with generic controls..."),
+	edit_generic_action = myactions.register_action (
+		processor_box_actions, X_("edit-generic"), _("Edit with generic controls..."),
 		sigc::ptr_fun (ProcessorBox::rb_edit_generic));
 
-	ActionManager::add_action_group (popup_act_grp);
+	load_bindings ();
 }
 
 void
@@ -2885,6 +3743,15 @@ ProcessorBox::rb_ab_plugins ()
 }
 
 void
+ProcessorBox::rb_manage_pins ()
+{
+	if (_current_processor_box == 0) {
+		return;
+	}
+
+	_current_processor_box->for_selected_processors (&ProcessorBox::manage_pins);
+}
+void
 ProcessorBox::rb_choose_plugin ()
 {
 	if (_current_processor_box == 0) {
@@ -3077,12 +3944,15 @@ ProcessorBox::edit_processor (boost::shared_ptr<Processor> processor)
 	if (edit_aux_send (processor)) {
 		return;
 	}
+	if (!_session->engine().connected()) {
+		return;
+	}
 
 	ProcessorWindowProxy* proxy = find_window_proxy (processor);
 
 	if (proxy) {
 		proxy->set_custom_ui_mode (true);
-		proxy->toggle ();
+		proxy->show_the_right_window ();
 	}
 }
 
@@ -3095,15 +3965,32 @@ ProcessorBox::generic_edit_processor (boost::shared_ptr<Processor> processor)
 	if (edit_aux_send (processor)) {
 		return;
 	}
+	if (!_session->engine().connected()) {
+		return;
+	}
 
 	ProcessorWindowProxy* proxy = find_window_proxy (processor);
 
 	if (proxy) {
 		proxy->set_custom_ui_mode (false);
-		proxy->toggle ();
+		proxy->show_the_right_window ();
+	}
+}
+
+void
+ProcessorBox::manage_pins (boost::shared_ptr<Processor> processor)
+{
+	if (!processor) {
+		return;
+	}
+	PluginPinWindowProxy* proxy = processor->pinmgr_proxy ();
+	if (proxy) {
+		proxy->get (true);
+		proxy->present();
 	}
 }
 
+
 void
 ProcessorBox::route_property_changed (const PropertyChange& what_changed)
 {
@@ -3121,7 +4008,7 @@ ProcessorBox::route_property_changed (const PropertyChange& what_changed)
 
 	for (list<ProcessorEntry*>::iterator iter = children.begin(); iter != children.end(); ++iter) {
 
-  		processor = (*iter)->processor ();
+		processor = (*iter)->processor ();
 
 		if (!processor) {
 			continue;
@@ -3227,6 +4114,10 @@ void
 ProcessorBox::processor_menu_unmapped ()
 {
 	processor_display.remove_placeholder ();
+	/* make all possibly-desensitized actions sensitive again so that
+	   they be activated by other means (e.g. bindings)
+	*/
+	ActionManager::set_sensitive (ActionManager::plugin_selection_sensitive_actions, true);
 }
 
 XMLNode *
@@ -3305,7 +4196,7 @@ ProcessorWindowProxy::session_handle()
 }
 
 XMLNode&
-ProcessorWindowProxy::get_state () const
+ProcessorWindowProxy::get_state ()
 {
 	XMLNode *node;
 	node = &ProxyBase::get_state();
@@ -3313,13 +4204,13 @@ ProcessorWindowProxy::get_state () const
 	return *node;
 }
 
-void
-ProcessorWindowProxy::set_state (const XMLNode& node)
+int
+ProcessorWindowProxy::set_state (const XMLNode& node, int /*version*/)
 {
 	XMLNodeList children = node.children ();
 	XMLNodeList::const_iterator i = children.begin ();
 	while (i != children.end()) {
-		XMLProperty* prop = (*i)->property (X_("name"));
+		XMLProperty const * prop = (*i)->property (X_("name"));
 		if ((*i)->name() == X_("Window") && prop && prop->value() == _name) {
 			break;
 		}
@@ -3327,13 +4218,13 @@ ProcessorWindowProxy::set_state (const XMLNode& node)
 	}
 
 	if (i != children.end()) {
-		XMLProperty* prop;
+		XMLProperty const * prop;
 		if ((prop = (*i)->property (X_("custom-ui"))) != 0) {
 			want_custom = PBD::string_is_affirmative (prop->value ());
 		}
 	}
 
-	ProxyBase::set_state(node);
+	return ProxyBase::set_state (node, 0);
 }
 
 Gtk::Window*
@@ -3360,19 +4251,80 @@ ProcessorWindowProxy::get (bool create)
 		if (_window) {
 			setup ();
 		}
+		_window->show_all ();
 	}
-
 	return _window;
 }
 
 void
-ProcessorWindowProxy::toggle ()
+ProcessorWindowProxy::show_the_right_window ()
 {
 	if (_window && (is_custom != want_custom)) {
 		/* drop existing window - wrong type */
 		drop_window ();
 	}
-	is_custom = want_custom;
+	toggle ();
+}
+
+
+PluginPinWindowProxy::PluginPinWindowProxy(std::string const &name, boost::weak_ptr<ARDOUR::Processor> processor)
+	: WM::ProxyBase (name, string())
+	, _processor (processor)
+{
+	boost::shared_ptr<Processor> p = _processor.lock ();
+	if (!p) {
+		return;
+	}
+	p->DropReferences.connect (going_away_connection, MISSING_INVALIDATOR, boost::bind (&PluginPinWindowProxy::processor_going_away, this), gui_context());
+}
+
+PluginPinWindowProxy::~PluginPinWindowProxy()
+{
+	_window = 0;
+}
+
+ARDOUR::SessionHandlePtr*
+PluginPinWindowProxy::session_handle ()
+{
+	ArdourWindow* aw = dynamic_cast<ArdourWindow*> (_window);
+	if (aw) { return aw; }
+	return 0;
+}
+
+Gtk::Window*
+PluginPinWindowProxy::get (bool create)
+{
+	boost::shared_ptr<Processor> p = _processor.lock ();
+	boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert> (p);
+	if (!p || !pi) {
+		return 0;
+	}
 
-	WM::ProxyBase::toggle ();
+	if (!_window) {
+		if (!create) {
+			return 0;
+		}
+		_window = new PluginPinDialog (pi);
+		ArdourWindow* aw = dynamic_cast<ArdourWindow*> (_window);
+		if (aw) {
+			aw->set_session (_session);
+		}
+		_window->show_all ();
+	}
+	return _window;
+}
+
+void
+PluginPinWindowProxy::processor_going_away ()
+{
+	delete _window;
+	_window = 0;
+	WM::Manager::instance().remove (this);
+	going_away_connection.disconnect();
+}
+
+void
+ProcessorBox::load_bindings ()
+{
+	bindings = Bindings::get_bindings (X_("Processor Box"), myactions);
 }
diff --git a/gtk2_ardour/processor_box.h b/gtk2_ardour/processor_box.h
index d904e13..5dd7483 100644
--- a/gtk2_ardour/processor_box.h
+++ b/gtk2_ardour/processor_box.h
@@ -29,9 +29,11 @@
 #include <gtkmm/eventbox.h>
 #include <gtkmm/menu.h>
 #include <gtkmm/scrolledwindow.h>
-#include "gtkmm2ext/dndtreeview.h"
+
 #include "gtkmm2ext/auto_spin.h"
+#include "gtkmm2ext/bindings.h"
 #include "gtkmm2ext/click_box.h"
+#include "gtkmm2ext/dndtreeview.h"
 #include "gtkmm2ext/dndvbox.h"
 #include "gtkmm2ext/pixfader.h"
 #include "gtkmm2ext/persistent_tooltip.h"
@@ -42,6 +44,7 @@
 #include "ardour/types.h"
 #include "ardour/ardour.h"
 #include "ardour/plugin_insert.h"
+#include "ardour/luaproc.h"
 #include "ardour/port_insert.h"
 #include "ardour/processor.h"
 #include "ardour/route.h"
@@ -78,33 +81,52 @@ class ProcessorBox;
 class ProcessorWindowProxy : public WM::ProxyBase
 {
   public:
-    ProcessorWindowProxy (std::string const &, ProcessorBox *, boost::weak_ptr<ARDOUR::Processor>);
-    ~ProcessorWindowProxy();
+	ProcessorWindowProxy (std::string const &, ProcessorBox *, boost::weak_ptr<ARDOUR::Processor>);
+	~ProcessorWindowProxy();
 
-    Gtk::Window* get (bool create = false);
+	Gtk::Window* get (bool create = false);
 
-    boost::weak_ptr<ARDOUR::Processor> processor () const {
-	    return _processor;
-    }
+	boost::weak_ptr<ARDOUR::Processor> processor () const {
+		return _processor;
+	}
 
-    ARDOUR::SessionHandlePtr* session_handle();
-    void toggle();
-    void set_custom_ui_mode(bool use_custom) { want_custom = use_custom; }
+	ARDOUR::SessionHandlePtr* session_handle();
+	void show_the_right_window ();
+	void set_custom_ui_mode(bool use_custom) { want_custom = use_custom; }
 
-    void set_state (const XMLNode&);
-    XMLNode& get_state () const;
+	int set_state (const XMLNode&, int);
+	XMLNode& get_state ();
 
   private:
-    ProcessorBox* _processor_box;
-    boost::weak_ptr<ARDOUR::Processor> _processor;
-    bool is_custom;
-    bool want_custom;
-    bool _valid;
-
-    void processor_going_away ();
-    PBD::ScopedConnection going_away_connection;
+	ProcessorBox* _processor_box;
+	boost::weak_ptr<ARDOUR::Processor> _processor;
+	bool is_custom;
+	bool want_custom;
+
+	void processor_going_away ();
+	PBD::ScopedConnection going_away_connection;
 };
 
+
+class PluginPinWindowProxy : public WM::ProxyBase
+{
+  public:
+	PluginPinWindowProxy (std::string const &, boost::weak_ptr<ARDOUR::Processor>);
+	~PluginPinWindowProxy();
+
+	Gtk::Window* get (bool create = false);
+	ARDOUR::SessionHandlePtr* session_handle();
+
+  private:
+	ProcessorBox* _processor_box;
+	boost::weak_ptr<ARDOUR::Processor> _processor;
+
+	void processor_going_away ();
+	PBD::ScopedConnection going_away_connection;
+};
+
+
+
 class ProcessorEntry : public Gtkmm2ext::DnDVBoxChild, public sigc::trackable
 {
 public:
@@ -120,6 +142,7 @@ public:
 	void set_selectable(bool s) { _selectable = s; }
 
 	bool drag_data_get (Glib::RefPtr<Gdk::DragContext> const, Gtk::SelectionData &);
+	bool can_copy_state (Gtkmm2ext::DnDVBoxChild*) const;
 
 	enum Position {
 		PreFader,
@@ -148,6 +171,7 @@ protected:
 	Gtk::VBox _vbox;
 	Position _position;
 	uint32_t _position_num;
+	ProcessorBox* _parent;
 
 	virtual void setup_visuals ();
 
@@ -161,7 +185,6 @@ private:
 	std::string name (Width) const;
 	void setup_tooltip ();
 
-	ProcessorBox* _parent;
 	boost::shared_ptr<ARDOUR::Processor> _processor;
 	Width _width;
 	PBD::ScopedConnection active_connection;
@@ -213,9 +236,49 @@ private:
 
 	std::list<Control*> _controls;
 
+	void toggle_inline_display_visibility ();
 	void toggle_control_visibility (Control *);
 	void toggle_panner_link ();
 
+	class PluginDisplay : public Gtk::DrawingArea {
+	public:
+		PluginDisplay(ProcessorEntry&, boost::shared_ptr<ARDOUR::Plugin>, uint32_t max_height = 80);
+		virtual ~PluginDisplay();
+	protected:
+		bool on_expose_event (GdkEventExpose *);
+		void on_size_request (Gtk::Requisition* req);
+		bool on_button_press_event (GdkEventButton *ev);
+		bool on_button_release_event (GdkEventButton *ev);
+
+		void plugin_going_away () {
+			_qdraw_connection.disconnect ();
+		}
+
+		void update_height_alloc (uint32_t inline_height);
+		virtual uint32_t render_inline (cairo_t *, uint32_t width);
+
+		ProcessorEntry& _entry;
+		boost::shared_ptr<ARDOUR::Plugin> _plug;
+		PBD::ScopedConnection _qdraw_connection;
+		PBD::ScopedConnection _death_connection;
+		cairo_surface_t* _surf;
+		uint32_t _max_height;
+		uint32_t _cur_height;
+		bool _scroll;
+	};
+
+	class LuaPluginDisplay : public PluginDisplay {
+	public:
+		LuaPluginDisplay(ProcessorEntry&, boost::shared_ptr<ARDOUR::LuaProc>, uint32_t max_height = 80);
+		~LuaPluginDisplay();
+	protected:
+		virtual uint32_t render_inline (cairo_t *, uint32_t width);
+	private:
+		boost::shared_ptr<ARDOUR::LuaProc> _luaproc;
+		LuaState lua_gui;
+		luabridge::LuaRef * _lua_render_inline;
+	};
+
 	class PortIcon : public Gtk::DrawingArea {
 	public:
 		PortIcon(bool input);
@@ -228,27 +291,97 @@ private:
 
 	class RoutingIcon : public Gtk::DrawingArea {
 	public:
-		RoutingIcon() {
-			_sources = ARDOUR::ChanCount(ARDOUR::DataType::AUDIO, 1);
-			_sinks = ARDOUR::ChanCount(ARDOUR::DataType::AUDIO, 1);
-			_splitting = false;
-			set_size_request (-1, 4);
+		RoutingIcon(bool inputrouting = true);
+		void set (
+				const ARDOUR::ChanCount&,
+				const ARDOUR::ChanCount&,
+				const ARDOUR::ChanCount&,
+				const ARDOUR::ChanCount&,
+				const ARDOUR::ChanMapping&,
+				const ARDOUR::ChanMapping&,
+				const ARDOUR::ChanMapping&);
+		void set_fed_by (
+				const ARDOUR::ChanCount&,
+				const ARDOUR::ChanCount&,
+				const ARDOUR::ChanMapping&,
+				const ARDOUR::ChanMapping&);
+
+		void set_feeding (
+				const ARDOUR::ChanCount&,
+				const ARDOUR::ChanCount&,
+				const ARDOUR::ChanMapping&,
+				const ARDOUR::ChanMapping&);
+
+		void set_terminal (bool b);
+
+		void copy_state (const RoutingIcon& other) {
+			_in         = other._in;
+			_out        = other._out;
+			_sources    = other._sources;
+			_sinks      = other._sinks;
+			_in_map     = other._in_map;
+			_out_map    = other._out_map;
+			_thru_map   = other._thru_map;
+			_f_out      = other._f_out;
+			_f_out_map  = other._f_out_map;
+			_f_thru_map = other._f_thru_map;
+			_f_sources  = other._f_sources;
+			_i_in       = other._i_in;
+			_i_in_map   = other._i_in_map;
+			_i_thru_map = other._i_thru_map;
+			_i_sinks    = other._i_sinks;
+			_fed_by     = other._fed_by;
+			_feeding    = other._feeding;
 		}
-		void set_sources(ARDOUR::ChanCount const sources) { _sources = sources; }
-		void set_sinks(ARDOUR::ChanCount const sinks) { _sinks = sinks; }
-		void set_splitting(const bool splitting) { _splitting = splitting; }
+
+		void unset_fed_by () { _fed_by  = false ; }
+		void unset_feeding () { _feeding  = false ; }
+		bool in_identity () const;
+		bool out_identity () const;
+		bool can_coalesce () const;
+
+		static double pin_x_pos (uint32_t, double, uint32_t, uint32_t, bool);
+		static void draw_connection (cairo_t*, double, double, double, double, bool, bool dashed = false);
+		static void draw_gnd (cairo_t*, double, double, double, bool);
+		static void draw_sidechain (cairo_t*, double, double, double, bool);
+		static void draw_thru_src (cairo_t*, double, double, double, bool);
+		static void draw_thru_sink (cairo_t*, double, double, double, bool);
+
 	private:
 		bool on_expose_event (GdkEventExpose *);
-		/* the wire icon sits on top of every processor if needed */
-		ARDOUR::ChanCount _sources; // signals available (valid outputs from prev. processor)
-		ARDOUR::ChanCount _sinks;   // actual inputs of this processor
-		bool _splitting;
+		void expose_input_map (cairo_t*, const double, const double);
+		void expose_coalesced_input_map (cairo_t*, const double, const double);
+		void expose_output_map (cairo_t*, const double, const double);
+
+		ARDOUR::ChanCount   _in;
+		ARDOUR::ChanCount   _out;
+		ARDOUR::ChanCount   _sources;
+		ARDOUR::ChanCount   _sinks;
+		ARDOUR::ChanMapping _in_map;
+		ARDOUR::ChanMapping _out_map;
+		ARDOUR::ChanMapping _thru_map;
+		ARDOUR::ChanCount   _f_out;
+		ARDOUR::ChanMapping _f_out_map;
+		ARDOUR::ChanMapping _f_thru_map;
+		ARDOUR::ChanCount   _f_sources;
+		ARDOUR::ChanCount   _i_in;
+		ARDOUR::ChanMapping _i_in_map;
+		ARDOUR::ChanMapping _i_thru_map;
+		ARDOUR::ChanCount   _i_sinks;
+		bool _fed_by;
+		bool _feeding;
+		bool _input;
+		bool _terminal;
 	};
 
+public:
+	PortIcon input_icon;
+	PortIcon output_icon;
+	RoutingIcon routing_icon; // sits on top of every processor (input routing)
+	RoutingIcon output_routing_icon; // only used by last processor in the chain
+
 protected:
-	RoutingIcon _routing_icon;
-	PortIcon _input_icon;
-	PortIcon _output_icon;
+	PluginDisplay *_plugin_display ;
 };
 
 class PluginInsertProcessorEntry : public ProcessorEntry
@@ -259,10 +392,10 @@ public:
 	void hide_things ();
 
 private:
-	void plugin_insert_splitting_changed ();
+	void iomap_changed ();
 	boost::shared_ptr<ARDOUR::PluginInsert> _plugin_insert;
 
-	PBD::ScopedConnection _splitting_connection;
+	PBD::ScopedConnectionList _iomap_connection;
 };
 
 class ProcessorBox : public Gtk::HBox, public PluginInterestedObject, public ARDOUR::SessionHandlePtr
@@ -295,6 +428,7 @@ class ProcessorBox : public Gtk::HBox, public PluginInterestedObject, public ARD
 	void select_all_sends ();
 
 	void all_visible_processors_active(bool state);
+	void setup_routing_feeds ();
 
 	void hide_things ();
 
@@ -307,6 +441,7 @@ class ProcessorBox : public Gtk::HBox, public PluginInterestedObject, public ARD
         Gtk::Window* get_editor_window (boost::shared_ptr<ARDOUR::Processor>, bool);
         Gtk::Window* get_generic_editor_window (boost::shared_ptr<ARDOUR::Processor>);
 
+        void manage_pins (boost::shared_ptr<ARDOUR::Processor>);
         void edit_processor (boost::shared_ptr<ARDOUR::Processor>);
         void generic_edit_processor (boost::shared_ptr<ARDOUR::Processor>);
 
@@ -315,13 +450,15 @@ class ProcessorBox : public Gtk::HBox, public PluginInterestedObject, public ARD
 	sigc::signal<void,boost::shared_ptr<ARDOUR::Processor> > ProcessorSelected;
 	sigc::signal<void,boost::shared_ptr<ARDOUR::Processor> > ProcessorUnselected;
 
+	static Glib::RefPtr<Gtk::ActionGroup> processor_box_actions;
+	static Gtkmm2ext::Bindings* bindings;
 	static void register_actions();
+
 #ifndef NDEBUG
 	static bool show_all_processors;
 #endif
 
   private:
-
 	/* prevent copy construction */
 	ProcessorBox (ProcessorBox const &);
 
@@ -343,6 +480,9 @@ class ProcessorBox : public Gtk::HBox, public PluginInterestedObject, public ARD
 	uint32_t                  _visible_prefader_processors;
 
 	RouteProcessorSelection& _rr_selection;
+	static Gtkmm2ext::ActionMap myactions;
+
+	static void load_bindings ();
 
 	void route_going_away ();
 
@@ -419,6 +559,8 @@ class ProcessorBox : public Gtk::HBox, public PluginInterestedObject, public ARD
 	static Glib::RefPtr<Gtk::Action> paste_action;
 	static Glib::RefPtr<Gtk::Action> rename_action;
 	static Glib::RefPtr<Gtk::Action> delete_action;
+	static Glib::RefPtr<Gtk::Action> backspace_action;
+	static Glib::RefPtr<Gtk::Action> manage_pins_action;
 	static Glib::RefPtr<Gtk::Action> edit_action;
 	static Glib::RefPtr<Gtk::Action> edit_generic_action;
 	void paste_processor_state (const XMLNodeList&, boost::shared_ptr<ARDOUR::Processor>);
@@ -451,6 +593,7 @@ class ProcessorBox : public Gtk::HBox, public PluginInterestedObject, public ARD
 	static void rb_activate_all ();
 	static void rb_deactivate_all ();
 	static void rb_ab_plugins ();
+	static void rb_manage_pins ();
 	static void rb_edit ();
 	static void rb_edit_generic ();
 
@@ -464,6 +607,7 @@ class ProcessorBox : public Gtk::HBox, public PluginInterestedObject, public ARD
 
 	void set_processor_ui (boost::shared_ptr<ARDOUR::Processor>, Gtk::Window *);
 	void maybe_add_processor_to_ui_list (boost::weak_ptr<ARDOUR::Processor>);
+	void maybe_add_processor_pin_mgr (boost::weak_ptr<ARDOUR::Processor>);
 
 	bool one_processor_can_be_edited ();
 	bool processor_can_be_edited (boost::shared_ptr<ARDOUR::Processor>);
diff --git a/gtk2_ardour/public_editor.cc b/gtk2_ardour/public_editor.cc
index e88f273..6ac0ba3 100644
--- a/gtk2_ardour/public_editor.cc
+++ b/gtk2_ardour/public_editor.cc
@@ -19,6 +19,8 @@
 
 #include "public_editor.h"
 
+#include "pbd/i18n.h"
+
 PublicEditor* PublicEditor::_instance = 0;
 
 const int PublicEditor::window_border_width = 12;
@@ -28,9 +30,8 @@ const int PublicEditor::horizontal_spacing = 6;
 
 sigc::signal<void> PublicEditor::DropDownKeys;
 
-PublicEditor::PublicEditor ()
-  	: Window (Gtk::WINDOW_TOPLEVEL)
-	, VisibilityTracker (*((Gtk::Window*)this))
+PublicEditor::PublicEditor (Gtk::Widget& content)
+	: Tabbable (content, _("Editor"))
 	, _suspend_route_redisplay_counter (0)
 {
 }
diff --git a/gtk2_ardour/public_editor.h b/gtk2_ardour/public_editor.h
index bcf98db..69c081b 100644
--- a/gtk2_ardour/public_editor.h
+++ b/gtk2_ardour/public_editor.h
@@ -32,16 +32,19 @@
 #include <gtkmm/box.h>
 #include <gtkmm/window.h>
 #include <gtkmm/actiongroup.h>
+#include <gtkmm/notebook.h>
 #include <sigc++/signal.h>
 
+#include "evoral/Beats.hpp"
 #include "evoral/Note.hpp"
-#include "evoral/types.hpp"
 
 #include "pbd/statefuldestructible.h"
 
 #include "canvas/fwd.h"
 
 #include "gtkmm2ext/actions.h"
+#include "gtkmm2ext/bindings.h"
+#include "gtkmm2ext/tabbable.h"
 #include "gtkmm2ext/visibility_tracker.h"
 
 #include "editing.h"
@@ -54,6 +57,7 @@ namespace ARDOUR {
 	class RouteGroup;
         class Trimmable;
         class Movable;
+        class Stripable;
 }
 
 namespace Gtk {
@@ -61,10 +65,6 @@ namespace Gtk {
 	class Menu;
 }
 
-namespace Gtkmm2ext {
-        class TearOff;
-}
-
 class AudioRegionView;
 class AutomationLine;
 class AutomationTimeAxisView;
@@ -80,6 +80,7 @@ class PluginUIWindow;
 class RegionView;
 class RouteTimeAxisView;
 class Selection;
+class TempoCurve;
 class TempoMarker;
 class TimeAxisView;
 class TimeAxisViewItem;
@@ -104,9 +105,9 @@ using ARDOUR::framecnt_t;
  * of PublicEditor need not be recompiled if private methods or member variables
  * change.
  */
-class PublicEditor : public Gtk::Window, public PBD::StatefulDestructible, public Gtkmm2ext::VisibilityTracker {
+class PublicEditor : public Gtkmm2ext::Tabbable {
   public:
-	PublicEditor ();
+	PublicEditor (Gtk::Widget& content);
 	virtual ~PublicEditor ();
 
 	/** @return Singleton PublicEditor instance */
@@ -199,6 +200,7 @@ class PublicEditor : public Gtk::Window, public PBD::StatefulDestructible, publi
 	virtual double sample_to_pixel (framepos_t frame) const = 0;
 	virtual double sample_to_pixel_unrounded (framepos_t frame) const = 0;
 	virtual Selection& get_selection () const = 0;
+	virtual bool get_selection_extents (framepos_t &start, framepos_t &end) const = 0;
 	virtual Selection& get_cut_buffer () const = 0;
 	virtual void track_mixer_selection () = 0;
 	virtual bool extend_selection_to_track (TimeAxisView&) = 0;
@@ -206,11 +208,14 @@ class PublicEditor : public Gtk::Window, public PBD::StatefulDestructible, publi
 	virtual void play_with_preroll () = 0;
 	virtual void maybe_locate_with_edit_preroll (framepos_t location) = 0;
 	virtual void goto_nth_marker (int nth) = 0;
+	virtual void trigger_script (int nth) = 0;
 	virtual void add_location_from_playhead_cursor () = 0;
 	virtual void remove_location_at_playhead_cursor () = 0;
 	virtual void set_show_measures (bool yn) = 0;
 	virtual bool show_measures () const = 0;
 	virtual void remove_tracks () = 0;
+	virtual void set_loop_range (framepos_t start, framepos_t end, std::string cmd) = 0;
+	virtual void set_punch_range (framepos_t start, framepos_t end, std::string cmd) = 0;
 
 	virtual Editing::MouseMode effective_mouse_mode () const = 0;
 
@@ -231,8 +236,6 @@ class PublicEditor : public Gtk::Window, public PBD::StatefulDestructible, publi
 	virtual void export_range () = 0;
 
 	virtual void register_actions () = 0;
-	virtual void add_transport_frame (Gtk::Container&) = 0;
-	virtual void add_toplevel_menu (Gtk::Container&) = 0;
 	virtual void set_zoom_focus (Editing::ZoomFocus) = 0;
 	virtual Editing::ZoomFocus get_zoom_focus () const = 0;
 	virtual framecnt_t get_current_zoom () const = 0;
@@ -266,8 +269,6 @@ class PublicEditor : public Gtk::Window, public PBD::StatefulDestructible, publi
 
 	/** @return true if the playhead is currently being dragged, otherwise false */
 	virtual bool dragging_playhead () const = 0;
-	virtual void ensure_float (Gtk::Window&) = 0;
-	virtual void show_window () = 0;
 	virtual framepos_t leftmost_sample() const = 0;
 	virtual framecnt_t current_page_samples() const = 0;
 	virtual double visible_canvas_height () const = 0;
@@ -286,11 +287,9 @@ class PublicEditor : public Gtk::Window, public PBD::StatefulDestructible, publi
 	virtual void remove_last_capture () = 0;
 	virtual void maximise_editing_space () = 0;
 	virtual void restore_editing_space () = 0;
-	virtual void update_tearoff_visibility () = 0;
-	virtual void reattach_all_tearoffs () = 0;
 	virtual framepos_t get_preferred_edit_position (Editing::EditIgnoreOption = Editing::EDIT_IGNORE_NONE, bool from_context_menu = false, bool from_outside_canvas = false) = 0;
 	virtual void toggle_meter_updating() = 0;
-	virtual void split_regions_at (framepos_t, RegionSelection&) = 0;
+	virtual void split_regions_at (framepos_t, RegionSelection&, const int32_t sub_num) = 0;
 	virtual void split_region_at_points (boost::shared_ptr<ARDOUR::Region>, ARDOUR::AnalysisFeatureList&, bool can_ferret, bool select_new = false) = 0;
 	virtual void mouse_add_new_marker (framepos_t where, bool is_cd=false) = 0;
 	virtual void foreach_time_axis_view (sigc::slot<void,TimeAxisView&>) = 0;
@@ -299,6 +298,7 @@ class PublicEditor : public Gtk::Window, public PBD::StatefulDestructible, publi
 	virtual framecnt_t get_paste_offset (framepos_t pos, unsigned paste_count, framecnt_t duration) = 0;
 	virtual unsigned get_grid_beat_divisions(framepos_t position) = 0;
 	virtual Evoral::Beats get_grid_type_as_beats (bool& success, framepos_t position) = 0;
+	virtual unsigned get_grid_music_divisions (uint32_t event_state) = 0;
 	virtual void edit_notes (MidiRegionView*) = 0;
 
 	virtual void queue_visual_videotimeline_update () = 0;
@@ -325,7 +325,7 @@ class PublicEditor : public Gtk::Window, public PBD::StatefulDestructible, publi
 	Glib::RefPtr<Gtk::ActionGroup> editor_menu_actions;
 	Glib::RefPtr<Gtk::ActionGroup> _region_actions;
 
-	virtual void reset_focus () = 0;
+	virtual void reset_focus (Gtk::Widget*) = 0;
 
 	virtual bool canvas_scroll_event (GdkEventScroll* event, bool from_canvas) = 0;
 	virtual bool canvas_control_point_event (GdkEvent* event, ArdourCanvas::Item*, ControlPoint*) = 0;
@@ -349,6 +349,7 @@ class PublicEditor : public Gtk::Window, public PBD::StatefulDestructible, publi
 	virtual bool canvas_marker_event (GdkEvent* event, ArdourCanvas::Item*, ArdourMarker*) = 0;
 	virtual bool canvas_videotl_bar_event (GdkEvent* event, ArdourCanvas::Item*) = 0;
 	virtual bool canvas_tempo_marker_event (GdkEvent* event, ArdourCanvas::Item*, TempoMarker*) = 0;
+	virtual bool canvas_tempo_curve_event (GdkEvent* event, ArdourCanvas::Item*, TempoCurve*) = 0;
 	virtual bool canvas_meter_marker_event (GdkEvent* event, ArdourCanvas::Item*, MeterMarker*) = 0;
 	virtual bool canvas_automation_track_event(GdkEvent* event, ArdourCanvas::Item*, AutomationTimeAxisView*) = 0;
 
@@ -364,15 +365,6 @@ class PublicEditor : public Gtk::Window, public PBD::StatefulDestructible, publi
 	static const int vertical_spacing;
 	static const int horizontal_spacing;
 
-#ifdef TOP_MENUBAR
-	/*
-	 * This is needed for OS X primarily
-	 * but also any other OS that uses a single
-	 * top menubar instead of per window menus
-	 */
-	virtual Gtk::HBox& get_status_bar_packer() = 0;
-#endif
-
 	virtual ArdourCanvas::Container* get_trackview_group () const = 0;
 	virtual ArdourCanvas::ScrollGroup* get_hscroll_group () const = 0;
 	virtual ArdourCanvas::ScrollGroup* get_hvscroll_group () const = 0;
@@ -380,7 +372,7 @@ class PublicEditor : public Gtk::Window, public PBD::StatefulDestructible, publi
 
         virtual ArdourCanvas::GtkCanvasViewport* get_track_canvas() const = 0;
 
-	virtual TimeAxisView* axis_view_from_route (boost::shared_ptr<ARDOUR::Route>) const = 0;
+	virtual TimeAxisView* axis_view_from_stripable (boost::shared_ptr<ARDOUR::Stripable>) const = 0;
 
         virtual void set_current_trimmable (boost::shared_ptr<ARDOUR::Trimmable>) = 0;
         virtual void set_current_movable (boost::shared_ptr<ARDOUR::Movable>) = 0;
@@ -390,9 +382,6 @@ class PublicEditor : public Gtk::Window, public PBD::StatefulDestructible, publi
 	virtual TrackViewList axis_views_from_routes (boost::shared_ptr<ARDOUR::RouteList>) const = 0;
 	virtual TrackViewList const & get_track_views () = 0;
 
-	virtual Gtkmm2ext::TearOff* mouse_mode_tearoff () const = 0;
-	virtual Gtkmm2ext::TearOff* tools_tearoff () const = 0;
-
 	virtual DragManager* drags () const = 0;
         virtual void maybe_autoscroll (bool, bool, bool from_headers) = 0;
 	virtual void stop_canvas_autoscroll () = 0;
@@ -405,6 +394,8 @@ class PublicEditor : public Gtk::Window, public PBD::StatefulDestructible, publi
 	virtual void abort_reversible_command () = 0;
 	virtual void commit_reversible_command () = 0;
 
+	virtual void access_action (std::string,std::string) = 0;
+
 	virtual MouseCursors const * cursors () const = 0;
 	virtual VerboseCursor * verbose_cursor () const = 0;
 
@@ -441,6 +432,8 @@ class PublicEditor : public Gtk::Window, public PBD::StatefulDestructible, publi
 	PBD::Signal0<void> SnapChanged;
 	PBD::Signal0<void> MouseModeChanged;
 
+	Gtkmm2ext::Bindings* bindings;
+
   protected:
 	friend class DisplaySuspender;
 	virtual void suspend_route_redisplay () = 0;
diff --git a/gtk2_ardour/quantize_dialog.cc b/gtk2_ardour/quantize_dialog.cc
index 82e3a1a..591d801 100644
--- a/gtk2_ardour/quantize_dialog.cc
+++ b/gtk2_ardour/quantize_dialog.cc
@@ -25,7 +25,7 @@
 #include "quantize_dialog.h"
 #include "public_editor.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace Gtk;
@@ -37,8 +37,17 @@ static const gchar *_grid_strings[] = {
 	N_("Beats/128"),
 	N_("Beats/64"),
 	N_("Beats/32"),
+	N_("Beats/28"),
+	N_("Beats/24"),
+	N_("Beats/20"),
 	N_("Beats/16"),
+	N_("Beats/14"),
+	N_("Beats/12"),
+	N_("Beats/10"),
 	N_("Beats/8"),
+	N_("Beats/7"),
+	N_("Beats/6"),
+	N_("Beats/5"),
 	N_("Beats/4"),
 	N_("Beats/3"),
 	N_("Beats/2"),
@@ -138,24 +147,15 @@ QuantizeDialog::grid_size_to_musical_time (const string& txt) const
 		return b.to_double();
 	}
 
-	if (txt == _("Beats/128")) {
-		return 1.0/128.0;
-	} else if (txt == _("Beats/64")) {
-		return 1.0/64.0;
-	} else if (txt == _("Beats/32")) {
-		return 1.0/32.0;
-	} else if (txt == _("Beats/16")) {
-		return 1.0/16.0;
-	} if (txt == _("Beats/8")) {
-		return 1.0/8.0;
-	} else if (txt == _("Beats/4")) {
-		return 1.0/4.0;
-	} else if (txt == _("Beats/3")) {
-		return 1.0/3.0;
-	} else if (txt == _("Beats/2")) {
-		return 1.0/2.0;
-	} else if (txt == _("Beats")) {
-		return 1.0;
+	string::size_type slash;
+
+	if ((slash = txt.find ('/')) != string::npos) {
+		if (slash < txt.length() - 1) {
+			double divisor = PBD::atof (txt.substr (slash+1));
+			if (divisor != 0.0) {
+				return 1.0/divisor;
+			}
+		}
 	}
 
 	return 1.0;
diff --git a/gtk2_ardour/quantize_dialog.h b/gtk2_ardour/quantize_dialog.h
index 8203875..f162dd0 100644
--- a/gtk2_ardour/quantize_dialog.h
+++ b/gtk2_ardour/quantize_dialog.h
@@ -27,7 +27,6 @@
 #include <gtkmm/checkbutton.h>
 #include <gtkmm/spinbutton.h>
 
-#include "evoral/types.hpp"
 #include "ardour/types.h"
 
 #include "ardour_dialog.h"
diff --git a/gtk2_ardour/rc_option_editor.cc b/gtk2_ardour/rc_option_editor.cc
index 421e4c5..4d34b62 100644
--- a/gtk2_ardour/rc_option_editor.cc
+++ b/gtk2_ardour/rc_option_editor.cc
@@ -54,6 +54,8 @@
 
 #include "ardour_window.h"
 #include "ardour_dialog.h"
+#include "ardour_ui.h"
+#include "color_theme_manager.h"
 #include "gui_thread.h"
 #include "meter_patterns.h"
 #include "midi_tracer.h"
@@ -64,7 +66,7 @@
 #include "keyboard.h"
 #include "theme_manager.h"
 #include "ui_config.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace Gtk;
@@ -76,7 +78,7 @@ using namespace ARDOUR_UI_UTILS;
 class ClickOptions : public OptionEditorBox
 {
 public:
-	ClickOptions (RCConfiguration* c, Gtk::Window* p)
+	ClickOptions (RCConfiguration* c)
 		: _rc_config (c)
 		, _click_browse_button (_("Browse..."))
 		, _click_emphasis_browse_button (_("Browse..."))
@@ -110,7 +112,7 @@ public:
 		    sigc::mem_fun (*this, &ClickOptions::click_emphasis_browse_clicked));
 		t->attach (_click_emphasis_browse_button, 2, 3, 3, 4, FILL);
 
-		_box->pack_start (*t, false, false);
+		_box->pack_start (*t, true, false);
 
 		_click_path_entry.signal_activate().connect (sigc::mem_fun (*this, &ClickOptions::click_changed));
 		_click_emphasis_path_entry.signal_activate().connect (sigc::mem_fun (*this, &ClickOptions::click_emphasis_changed));
@@ -326,7 +328,7 @@ static const struct {
 
 	{ "Unmodified", 0 },
 
-#ifdef GTKOSX
+#ifdef __APPLE__
 
 	/* Command = Meta
 	   Option/Alt = Mod1
@@ -373,7 +375,7 @@ public:
 		  _insert_note_button_adjustment (3, 1, 5),
 		  _insert_note_button_spin (_insert_note_button_adjustment)
 	{
-		const Glib::ustring restart_msg = _("\nChanges to this setting will only persist after your project has been saved.");
+		const std::string restart_msg = _("\nChanges to this setting will only persist after your project has been saved.");
 		/* internationalize and prepare for use with combos */
 
 		vector<string> dumb;
@@ -514,7 +516,7 @@ public:
 		_copy_modifier_combo.signal_changed().connect (sigc::mem_fun(*this, &KeyboardOptions::copy_modifier_chosen));
 		Gtkmm2ext::UI::instance()->set_tip (_copy_modifier_combo,
 						    (string_compose (_("<b>Recommended Setting: %1</b>%2"),
-#ifdef GTKOSX
+#ifdef __APPLE__
 								     Keyboard::secondary_modifier_name (),
 #else
 								     Keyboard::primary_modifier_name (),
@@ -541,7 +543,7 @@ public:
 		_constraint_modifier_combo.signal_changed().connect (sigc::mem_fun(*this, &KeyboardOptions::constraint_modifier_chosen));
 		Gtkmm2ext::UI::instance()->set_tip (_constraint_modifier_combo,
 						    (string_compose (_("<b>Recommended Setting: %1</b>%2"),
-#ifdef GTKOSX
+#ifdef __APPLE__
 								     Keyboard::primary_modifier_name (),
 #else
 								     Keyboard::secondary_modifier_name (),
@@ -665,10 +667,10 @@ public:
 		/* ignore snap */
 		set_popdown_strings (_snap_modifier_combo, dumb);
 		_snap_modifier_combo.signal_changed().connect (sigc::mem_fun(*this, &KeyboardOptions::snap_modifier_chosen));
-#ifdef GTKOSX
-		Glib::ustring mod_str = string_compose (X_("%1-%2"), Keyboard::level4_modifier_name (), Keyboard::tertiary_modifier_name ());
+#ifdef __APPLE__
+		std::string mod_str = string_compose (X_("%1-%2"), Keyboard::level4_modifier_name (), Keyboard::tertiary_modifier_name ());
 #else
-		Glib::ustring mod_str = Keyboard::secondary_modifier_name();
+		std::string mod_str = Keyboard::secondary_modifier_name();
 #endif
 		Gtkmm2ext::UI::instance()->set_tip (_snap_modifier_combo,
 						    (string_compose (_("<b>Recommended Setting: %1</b>%2"), mod_str, restart_msg)));
@@ -691,7 +693,7 @@ public:
 		/* snap delta */
 		set_popdown_strings (_snap_delta_combo, dumb);
 		_snap_delta_combo.signal_changed().connect (sigc::mem_fun(*this, &KeyboardOptions::snap_delta_modifier_chosen));
-#ifdef GTKOSX
+#ifdef __APPLE__
 		mod_str = Keyboard::level4_modifier_name ();
 #else
 		mod_str = string_compose (X_("%1-%2"), Keyboard::secondary_modifier_name (), Keyboard::level4_modifier_name ());
@@ -825,7 +827,7 @@ private:
 		string const txt = _edit_modifier_combo.get_active_text();
 
 		for (int i = 0; modifiers[i].name; ++i) {
-			if (txt == _(modifiers[i].name)) {
+			if (txt == S_(modifiers[i].name)) {
 				Keyboard::set_edit_modifier (modifiers[i].modifier);
 				break;
 			}
@@ -837,7 +839,7 @@ private:
 		string const txt = _delete_modifier_combo.get_active_text();
 
 		for (int i = 0; modifiers[i].name; ++i) {
-			if (txt == _(modifiers[i].name)) {
+			if (txt == S_(modifiers[i].name)) {
 				Keyboard::set_delete_modifier (modifiers[i].modifier);
 				break;
 			}
@@ -849,7 +851,7 @@ private:
 		string const txt = _copy_modifier_combo.get_active_text();
 
 		for (int i = 0; modifiers[i].name; ++i) {
-			if (txt == _(modifiers[i].name)) {
+			if (txt == S_(modifiers[i].name)) {
 				Keyboard::set_copy_modifier (modifiers[i].modifier);
 				break;
 			}
@@ -861,7 +863,7 @@ private:
 		string const txt = _insert_note_modifier_combo.get_active_text();
 
 		for (int i = 0; modifiers[i].name; ++i) {
-			if (txt == _(modifiers[i].name)) {
+			if (txt == S_(modifiers[i].name)) {
 				Keyboard::set_insert_note_modifier (modifiers[i].modifier);
 				break;
 			}
@@ -873,7 +875,7 @@ private:
 		string const txt = _snap_modifier_combo.get_active_text();
 
 		for (int i = 0; modifiers[i].name; ++i) {
-			if (txt == _(modifiers[i].name)) {
+			if (txt == S_(modifiers[i].name)) {
 				Keyboard::set_snap_modifier (modifiers[i].modifier);
 				break;
 			}
@@ -885,7 +887,7 @@ private:
 		string const txt = _snap_delta_combo.get_active_text();
 
 		for (int i = 0; modifiers[i].name; ++i) {
-			if (txt == _(modifiers[i].name)) {
+			if (txt == S_(modifiers[i].name)) {
 				Keyboard::set_snap_delta_modifier (modifiers[i].modifier);
 				break;
 			}
@@ -897,7 +899,7 @@ private:
 		string const txt = _constraint_modifier_combo.get_active_text();
 
 		for (int i = 0; modifiers[i].name; ++i) {
-			if (txt == _(modifiers[i].name)) {
+			if (txt == S_(modifiers[i].name)) {
 				ArdourKeyboard::set_constraint_modifier (modifiers[i].modifier);
 				break;
 			}
@@ -909,7 +911,7 @@ private:
 		string const txt = _trim_contents_combo.get_active_text();
 
 		for (int i = 0; modifiers[i].name; ++i) {
-			if (txt == _(modifiers[i].name)) {
+			if (txt == S_(modifiers[i].name)) {
 				ArdourKeyboard::set_trim_contents_modifier (modifiers[i].modifier);
 				break;
 			}
@@ -921,7 +923,7 @@ private:
 		string const txt = _trim_overlap_combo.get_active_text();
 
 		for (int i = 0; modifiers[i].name; ++i) {
-			if (txt == _(modifiers[i].name)) {
+			if (txt == S_(modifiers[i].name)) {
 				ArdourKeyboard::set_trim_overlap_modifier (modifiers[i].modifier);
 				break;
 			}
@@ -933,7 +935,7 @@ private:
 		string const txt = _trim_anchored_combo.get_active_text();
 
 		for (int i = 0; modifiers[i].name; ++i) {
-			if (txt == _(modifiers[i].name)) {
+			if (txt == S_(modifiers[i].name)) {
 				ArdourKeyboard::set_trim_anchored_modifier (modifiers[i].modifier);
 				break;
 			}
@@ -945,7 +947,7 @@ private:
 		string const txt = _fine_adjust_combo.get_active_text();
 
 		for (int i = 0; modifiers[i].name; ++i) {
-			if (txt == _(modifiers[i].name)) {
+			if (txt == S_(modifiers[i].name)) {
 				ArdourKeyboard::set_fine_adjust_modifier (modifiers[i].modifier);
 				break;
 			}
@@ -957,7 +959,7 @@ private:
 		string const txt = _push_points_combo.get_active_text();
 
 		for (int i = 0; modifiers[i].name; ++i) {
-			if (txt == _(modifiers[i].name)) {
+			if (txt == S_(modifiers[i].name)) {
 				ArdourKeyboard::set_push_points_modifier (modifiers[i].modifier);
 				break;
 			}
@@ -969,7 +971,7 @@ private:
 		string const txt = _note_size_relative_combo.get_active_text();
 
 		for (int i = 0; modifiers[i].name; ++i) {
-			if (txt == _(modifiers[i].name)) {
+			if (txt == S_(modifiers[i].name)) {
 				ArdourKeyboard::set_note_size_relative_modifier (modifiers[i].modifier);
 				break;
 			}
@@ -1027,8 +1029,8 @@ public:
 		Label* l = manage (new Label (_("GUI and Font scaling:")));
 		l->set_name ("OptionsLabel");
 
-		 const Glib::ustring dflt = _("Default");
-		 const Glib::ustring empty = X_(""); // despite gtk-doc saying so, NULL does not work as reference
+		const std::string dflt = _("Default");
+		const std::string empty = X_(""); // despite gtk-doc saying so, NULL does not work as reference
 
 		_dpi_slider.set_name("FontScaleSlider");
 		_dpi_slider.set_update_policy (UPDATE_DISCONTINUOUS);
@@ -1343,9 +1345,8 @@ private:
 class ControlSurfacesOptions : public OptionEditorBox
 {
 public:
-	ControlSurfacesOptions (Gtk::Window& parent)
-		: _parent (parent)
-		, _ignore_view_change (0)
+	ControlSurfacesOptions ()
+		: _ignore_view_change (0)
 	{
 		_store = ListStore::create (_model);
 		_view.set_model (_store);
@@ -1361,7 +1362,7 @@ public:
 		edit_box->set_spacing(3);
 		_box->pack_start (*edit_box, false, false);
 		edit_box->show ();
-		
+
 		Label* label = manage (new Label);
 		label->set_text (_("Click to edit the settings for selected protocol ( it must be ENABLED first ):"));
 		edit_box->pack_start (*label, false, false);
@@ -1431,7 +1432,7 @@ private:
 		else
 			edit_button->set_sensitive (false);
 	}
-	
+
 	void view_changed (TreeModel::Path const &, TreeModel::iterator const & i)
 	{
 		TreeModel::Row r = *i;
@@ -1496,7 +1497,8 @@ private:
 		 * or re-initializing a surface.
 		 * tear_down_gui() hides an deletes the Window if it exists.
 		 */
-		ArdourWindow* win = new ArdourWindow (_parent, title.get_string());
+		ArdourWindow* win = new ArdourWindow (*((Gtk::Window*) _view.get_toplevel()), title.get_string());
+		win->set_title ("Control Protocol Options");
 		win->add (*box);
 		box->show ();
 		win->present ();
@@ -1532,7 +1534,6 @@ private:
 	Glib::RefPtr<ListStore> _store;
 	ControlSurfacesModelColumns _model;
 	TreeView _view;
-        Gtk::Window& _parent;
         PBD::ScopedConnection protocol_status_connection;
         uint32_t _ignore_view_change;
 	Gtk::Button* edit_button;
@@ -1546,45 +1547,78 @@ public:
 		, _show_video_export_info_button (_("Show Video Export Info before export"))
 		, _show_video_server_dialog_button (_("Show Video Server Startup Dialog"))
 		, _video_advanced_setup_button (_("Advanced Setup (remote video server)"))
+		, _xjadeo_browse_button (_("Browse..."))
 	{
-		Table* t = manage (new Table (2, 6));
+		Table* t = manage (new Table (8, 4));
 		t->set_spacings (4);
 
-		t->attach (_video_advanced_setup_button, 0, 2, 0, 1);
+		std::stringstream s;
+		s << "<b>" << _("Video Server") << "</b>";
+		Label* l = manage (new Label (s.str()));
+		l->set_use_markup (true);
+		l->set_alignment (0, 0.5);
+		t->attach (*l, 0, 4, 0, 1, EXPAND | FILL, FILL | EXPAND, 0, 8);
+
+		t->attach (_video_advanced_setup_button, 1, 4, 1, 2);
 		_video_advanced_setup_button.signal_toggled().connect (sigc::mem_fun (*this, &VideoTimelineOptions::video_advanced_setup_toggled));
 		Gtkmm2ext::UI::instance()->set_tip (_video_advanced_setup_button,
 					    _("<b>When enabled</b> you can speficify a custom video-server URL and docroot. - Do not enable this option unless you know what you are doing."));
 
-		Label* l = manage (new Label (_("Video Server URL:")));
+		l = manage (new Label (_("Video Server URL:")));
 		l->set_alignment (0, 0.5);
-		t->attach (*l, 0, 1, 1, 2, FILL);
-		t->attach (_video_server_url_entry, 1, 2, 1, 2, FILL);
+		t->attach (*l, 1, 2, 2, 3, FILL);
+		t->attach (_video_server_url_entry, 2, 4, 2, 3, FILL);
 		Gtkmm2ext::UI::instance()->set_tip (_video_server_url_entry,
 					    _("Base URL of the video-server including http prefix. This is usually 'http://hostname.example.org:1554/' and defaults to 'http://localhost:1554/' when the video-server is running locally"));
 
 		l = manage (new Label (_("Video Folder:")));
 		l->set_alignment (0, 0.5);
-		t->attach (*l, 0, 1, 2, 3, FILL);
-		t->attach (_video_server_docroot_entry, 1, 2, 2, 3);
+		t->attach (*l, 1, 2, 3, 4, FILL);
+		t->attach (_video_server_docroot_entry, 2, 4, 3, 4);
 		Gtkmm2ext::UI::instance()->set_tip (_video_server_docroot_entry,
 					    _("Local path to the video-server document-root. Only files below this directory will be accessible by the video-server. If the server run on a remote host, it should point to a network mounted folder of the server's docroot or be left empty if it is unvailable. It is used for the local video-monitor and file-browsing when opening/adding a video file."));
 
-		/* small vspace  y=3..4 */
-
-		t->attach (_show_video_export_info_button, 0, 2, 4, 5);
+		t->attach (_show_video_export_info_button, 1, 4, 4, 5);
 		_show_video_export_info_button.signal_toggled().connect (sigc::mem_fun (*this, &VideoTimelineOptions::show_video_export_info_toggled));
 		Gtkmm2ext::UI::instance()->set_tip (_show_video_export_info_button,
 					    _("<b>When enabled</b> an information window with details is displayed before the video-export dialog."));
 
-		t->attach (_show_video_server_dialog_button, 0, 2, 5, 6);
+		t->attach (_show_video_server_dialog_button, 1, 4, 5, 6);
 		_show_video_server_dialog_button.signal_toggled().connect (sigc::mem_fun (*this, &VideoTimelineOptions::show_video_server_dialog_toggled));
 		Gtkmm2ext::UI::instance()->set_tip (_show_video_server_dialog_button,
 					    _("<b>When enabled</b> the video server is never launched automatically without confirmation"));
 
+		s.str (std::string ());
+		s << "<b>" << _("Video Monitor") << "</b>";
+		l = manage (new Label (s.str()));
+		l->set_use_markup (true);
+		l->set_alignment (0, 0.5);
+		t->attach (*l, 0, 4, 6, 7, EXPAND | FILL, FILL | EXPAND, 0, 8);
+
+		l = manage (new Label (string_compose (_("Custom Path to Video Monitor (%1) - leave empty for default:"),
+#ifdef __APPLE__
+						"Jadeo.app"
+#elif defined PLATFORM_WINDOWS
+						"xjadeo.exe"
+#else
+						"xjadeo"
+#endif
+						)));
+		l->set_alignment (0, 0.5);
+		t->attach (*l, 1, 4, 7, 8, FILL);
+		t->attach (_custom_xjadeo_path, 2, 3, 8, 9);
+		Gtkmm2ext::UI::instance()->set_tip (_custom_xjadeo_path, _("Set a custom path to the Video Monitor Executable, changing this requires a restart."));
+		t->attach (_xjadeo_browse_button, 3, 4, 8, 9, FILL);
+
 		_video_server_url_entry.signal_changed().connect (sigc::mem_fun(*this, &VideoTimelineOptions::server_url_changed));
 		_video_server_url_entry.signal_activate().connect (sigc::mem_fun(*this, &VideoTimelineOptions::server_url_changed));
 		_video_server_docroot_entry.signal_changed().connect (sigc::mem_fun(*this, &VideoTimelineOptions::server_docroot_changed));
 		_video_server_docroot_entry.signal_activate().connect (sigc::mem_fun(*this, &VideoTimelineOptions::server_docroot_changed));
+		_custom_xjadeo_path.signal_changed().connect (sigc::mem_fun (*this, &VideoTimelineOptions::custom_xjadeo_path_changed));
+		_xjadeo_browse_button.signal_clicked ().connect (sigc::mem_fun (*this, &VideoTimelineOptions::xjadeo_browse_clicked));
+
+		// xjadeo-path is a UIConfig parameter
+		UIConfiguration::instance().ParameterChanged.connect (sigc::mem_fun (*this, &VideoTimelineOptions::parameter_changed));
 
 		_box->pack_start (*t,true,true);
 	}
@@ -1617,6 +1651,30 @@ public:
 		_rc_config->set_video_advanced_setup(x);
 	}
 
+	void custom_xjadeo_path_changed ()
+	{
+		UIConfiguration::instance().set_xjadeo_binary (_custom_xjadeo_path.get_text());
+	}
+
+	void xjadeo_browse_clicked ()
+	{
+		Gtk::FileChooserDialog dialog(_("Set Video Monitor Executable"), Gtk::FILE_CHOOSER_ACTION_OPEN);
+		dialog.set_filename (UIConfiguration::instance().get_xjadeo_binary());
+		dialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
+		dialog.add_button(Gtk::Stock::OK, Gtk::RESPONSE_OK);
+		if (dialog.run () == Gtk::RESPONSE_OK) {
+			const std::string& filename = dialog.get_filename();
+			if (!filename.empty() && (
+#ifdef __APPLE__
+					Glib::file_test (filename + "/Contents/MacOS/xjadeo", Glib::FILE_TEST_EXISTS|Glib::FILE_TEST_IS_EXECUTABLE) ||
+#endif
+					Glib::file_test (filename, Glib::FILE_TEST_EXISTS|Glib::FILE_TEST_IS_EXECUTABLE)
+					)) {
+				UIConfiguration::instance().set_xjadeo_binary (filename);
+			}
+		}
+	}
+
 	void parameter_changed (string const & p)
 	{
 		if (p == "video-server-url") {
@@ -1634,6 +1692,8 @@ public:
 			_video_advanced_setup_button.set_active(x);
 			_video_server_docroot_entry.set_sensitive(x);
 			_video_server_url_entry.set_sensitive(x);
+		} else if (p == "xjadeo-binary") {
+			_custom_xjadeo_path.set_text (UIConfiguration::instance().get_xjadeo_binary());
 		}
 	}
 
@@ -1645,15 +1705,84 @@ public:
 		parameter_changed ("show-video-export-info");
 		parameter_changed ("show-video-server-dialog");
 		parameter_changed ("video-advanced-setup");
+		parameter_changed ("xjadeo-binary");
 	}
 
 private:
 	RCConfiguration* _rc_config;
 	Entry _video_server_url_entry;
 	Entry _video_server_docroot_entry;
+	Entry _custom_xjadeo_path;
 	CheckButton _show_video_export_info_button;
 	CheckButton _show_video_server_dialog_button;
 	CheckButton _video_advanced_setup_button;
+	Button _xjadeo_browse_button;
+};
+
+class ColumVisibilityOption : public Option
+{
+	public:
+	ColumVisibilityOption (string id, string name, uint32_t n_col, sigc::slot<uint32_t> get, sigc::slot<bool, uint32_t> set)
+		: Option (id, name)
+		, _heading (name)
+		, _n_col (n_col)
+		, _get (get)
+		, _set (set)
+	{
+		cb = (CheckButton**) malloc (sizeof (CheckButton*) * n_col);
+		for (uint32_t i = 0; i < n_col; ++i) {
+			CheckButton* col = manage (new CheckButton (string_compose (_("Column %1"), i + 1)));
+			col->signal_toggled().connect (sigc::bind (sigc::mem_fun (*this, &ColumVisibilityOption::column_toggled), i));
+			_hbox.pack_start (*col);
+			cb[i] = col;
+		}
+		parameter_changed (id);
+	}
+
+	~ColumVisibilityOption () {
+		free (cb);
+	}
+
+	Gtk::Widget& tip_widget() { return _hbox; }
+
+	void set_state_from_config ()
+	{
+		uint32_t c = _get();
+		for (uint32_t i = 0; i < _n_col; ++i) {
+			bool en = (c & (1<<i)) ? true : false;
+			if (cb[i]->get_active () != en) {
+				cb[i]->set_active (en);
+			}
+		}
+	}
+
+	void add_to_page (OptionEditorPage* p)
+	{
+		_heading.add_to_page (p);
+		add_widget_to_page (p, &_hbox);
+	}
+	private:
+
+	void column_toggled (int b) {
+		uint32_t c = _get();
+		uint32_t cc = c;
+		if (cb[b]->get_active ()) {
+			c |= (1<<b);
+		} else {
+			c &= ~(1<<b);
+		}
+		if (cc != c) {
+			_set (c);
+		}
+	}
+
+	HBox _hbox;
+	OptionEditorHeading _heading;
+
+	CheckButton** cb;
+	uint32_t _n_col;
+	sigc::slot<uint32_t> _get;
+	sigc::slot<bool, uint32_t> _set;
 };
 
 
@@ -1720,10 +1849,21 @@ private:
 
 
 RCOptionEditor::RCOptionEditor ()
-	: OptionEditor (Config, string_compose (_("%1 Preferences"), PROGRAM_NAME))
+	: OptionEditorContainer (Config, string_compose (_("%1 Preferences"), PROGRAM_NAME))
+	, Tabbable (*this, _("Preferences")) /* pack self-as-vbox into tabbable */
         , _rc_config (Config)
 	, _mixer_strip_visibility ("mixer-element-visibility")
 {
+	XMLNode* node = ARDOUR_UI::instance()->preferences_settings();
+	if (node) {
+		/* gcc4 complains about ambiguity with Gtk::Widget::set_state
+		   (Gtk::StateType) here !!!
+		*/
+		Tabbable::set_state (*node, Stateful::loading_state_version);
+	}
+
+	UIConfiguration::instance().ParameterChanged.connect (sigc::mem_fun (*this, &RCOptionEditor::parameter_changed));
+
 	/* MISC */
 
         uint32_t hwcpus = hardware_concurrency ();
@@ -1798,11 +1938,11 @@ RCOptionEditor::RCOptionEditor ()
 		     0, 1000, 1, 20
 		     ));
 
-	add_option (_("Misc"), new OptionEditorHeading (_("Click")));
+	add_option (_("Misc/Click"), new OptionEditorHeading (_("Click")));
 
-	add_option (_("Misc"), new ClickOptions (_rc_config, this));
+	add_option (_("Misc/Click"), new ClickOptions (_rc_config));
 
-	add_option (_("Misc"),
+	add_option (_("Misc/Click"),
 	     new FaderOption (
 		     "click-gain",
 		     _("Click gain level"),
@@ -1937,8 +2077,8 @@ RCOptionEditor::RCOptionEditor ()
 	psc->add (1.0, _("1.0 second"));
 	psc->add (2.0, _("2.0 seconds"));
 	add_option (_("Transport"), psc);
-	
-	add_option (_("Transport"), new OptionEditorHeading (S_("Sync/Slave")));
+
+	add_option (_("Transport/Sync"), new OptionEditorHeading (S_("Synchronization and Slave Options")));
 
 	_sync_source = new ComboOption<SyncSource> (
 		"sync-source",
@@ -1947,7 +2087,7 @@ RCOptionEditor::RCOptionEditor ()
 		sigc::mem_fun (*_rc_config, &RCConfiguration::set_sync_source)
 		);
 
-	add_option (_("Transport"), _sync_source);
+	add_option (_("Transport/Sync"), _sync_source);
 
 	_sync_framerate = new BoolOption (
 		     "timecode-sync-frame-rate",
@@ -1963,7 +2103,7 @@ RCOptionEditor::RCOptionEditor ()
 				   "Instead the frame rate indication in the main clock will flash red and %1 will convert between the external "
 				   "timecode standard and the session standard."), PROGRAM_NAME));
 
-	add_option (_("Transport"), _sync_framerate);
+	add_option (_("Transport/Sync"), _sync_framerate);
 
 	_sync_genlock = new BoolOption (
 		"timecode-source-is-synced",
@@ -1984,7 +2124,7 @@ RCOptionEditor::RCOptionEditor ()
 				  ), PROGRAM_NAME));
 
 
-	add_option (_("Transport"), _sync_genlock);
+	add_option (_("Transport/Sync"), _sync_genlock);
 
 	_sync_source_2997 = new BoolOption (
 		"timecode-source-2997",
@@ -2002,9 +2142,9 @@ RCOptionEditor::RCOptionEditor ()
 			 "because the variant of using exactly 29.97 fps has zero timecode drift.\n"
 			 ));
 
-	add_option (_("Transport"), _sync_source_2997);
+	add_option (_("Transport/Sync"), _sync_source_2997);
 
-	add_option (_("Transport"), new OptionEditorHeading (S_("LTC Reader")));
+	add_option (_("Transport/Sync"), new OptionEditorHeading (S_("LTC Reader")));
 
 	_ltc_port = new ComboStringOption (
 		"ltc-source-port",
@@ -2021,12 +2161,12 @@ RCOptionEditor::RCOptionEditor ()
 	populate_sync_options ();
 	AudioEngine::instance()->Running.connect (engine_started_connection, MISSING_INVALIDATOR, boost::bind (&RCOptionEditor::populate_sync_options, this), gui_context());
 
-	add_option (_("Transport"), _ltc_port);
+	add_option (_("Transport/Sync"), _ltc_port);
 
 	// TODO; rather disable this button than not compile it..
-	add_option (_("Transport"), new OptionEditorHeading (S_("LTC Generator")));
+	add_option (_("Transport/Sync"), new OptionEditorHeading (S_("LTC Generator")));
 
-	add_option (_("Transport"),
+	add_option (_("Transport/Sync"),
 		    new BoolOption (
 			    "send-ltc",
 			    _("Enable LTC generator"),
@@ -2052,9 +2192,9 @@ RCOptionEditor::RCOptionEditor ()
 
 	Gtkmm2ext::UI::instance()->set_tip
 		(_ltc_volume_slider->tip_widget(),
-		 _("Specify the Peak Volume of the generated LTC signal in dbFS. A good value is  0dBu ^= -18dbFS in an EBU calibrated system"));
+		 _("Specify the Peak Volume of the generated LTC signal in dBFS. A good value is  0dBu ^= -18dBFS in an EBU calibrated system"));
 
-	add_option (_("Transport"), _ltc_volume_slider);
+	add_option (_("Transport/Sync"), _ltc_volume_slider);
 
 	/* EDITOR */
 
@@ -2086,14 +2226,6 @@ RCOptionEditor::RCOptionEditor ()
 
 	add_option (_("Editor"),
 	     new BoolOption (
-		     "show-track-meters",
-		     _("Show meters on tracks in the editor"),
-		     sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_show_track_meters),
-		     sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_show_track_meters)
-		     ));
-
-	add_option (_("Editor"),
-	     new BoolOption (
 		     "show-editor-meter",
 		     _("Display master-meter in the toolbar"),
 		     sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_show_editor_meter),
@@ -2212,11 +2344,11 @@ if (!Profile->get_mixbus()) {
 	rsas->add(ExistingNewlyCreatedBoth, _("existing selection and newly-created regions"));
 
 	add_option (_("Editor"), rsas);
-	
-	add_option (_("Editor"), new OptionEditorHeading (_("Waveforms")));
+
+	add_option (_("Editor/Waveforms"), new OptionEditorHeading (_("Waveforms")));
 
 if (!Profile->get_mixbus()) {
-	add_option (_("Editor"),
+	add_option (_("Editor/Waveforms"),
 	     new BoolOption (
 		     "show-waveforms",
 		     _("Show waveforms in regions"),
@@ -2225,7 +2357,7 @@ if (!Profile->get_mixbus()) {
 		     ));
 }  // !mixbus
 
-	add_option (_("Editor"),
+	add_option (_("Editor/Waveforms"),
 	     new BoolOption (
 		     "show-waveforms-while-recording",
 		     _("Show waveforms for audio while it is being recorded"),
@@ -2243,7 +2375,7 @@ if (!Profile->get_mixbus()) {
 	wfs->add (Linear, _("linear"));
 	wfs->add (Logarithmic, _("logarithmic"));
 
-	add_option (_("Editor"), wfs);
+	add_option (_("Editor/Waveforms"), wfs);
 
 	ComboOption<WaveformShape>* wfsh = new ComboOption<WaveformShape> (
 		"waveform-shape",
@@ -2255,9 +2387,9 @@ if (!Profile->get_mixbus()) {
 	wfsh->add (Traditional, _("traditional"));
 	wfsh->add (Rectified, _("rectified"));
 
-	add_option (_("Editor"), wfsh);
+	add_option (_("Editor/Waveforms"), wfsh);
 
-	add_option (_("Editor"), new ClipLevelOptions ());
+	add_option (_("Editor/Waveforms"), new ClipLevelOptions ());
 
 
 	/* AUDIO */
@@ -2294,8 +2426,8 @@ if (!Profile->get_mixbus()) {
 		     sigc::mem_fun (*_rc_config, &RCConfiguration::set_tape_machine_mode)
 		     ));
 
-if (!Profile->get_mixbus()) {
 	add_option (_("Audio"), new OptionEditorHeading (_("Connection of tracks and busses")));
+if (!Profile->get_mixbus()) {
 
 	add_option (_("Audio"),
 		    new BoolOption (
@@ -2329,6 +2461,18 @@ if (!Profile->get_mixbus()) {
 	oac->add (ManualConnect, _("manually"));
 
 	add_option (_("Audio"), oac);
+
+	bo = new BoolOption (
+			"strict-io",
+			_("Use 'Strict-I/O' for new tracks or Busses"),
+			sigc::mem_fun (*_rc_config, &RCConfiguration::get_strict_io),
+			sigc::mem_fun (*_rc_config, &RCConfiguration::set_strict_io)
+			);
+
+	add_option (_("Audio"), bo);
+	Gtkmm2ext::UI::instance()->set_tip (bo->tip_widget(),
+			_("With strict-i/o enabled, Effect Processors will not modify the number of channels on a track. The number of output channels will always match the number of input channels."));
+
 }  // !mixbus
 
 	add_option (_("Audio"), new OptionEditorHeading (_("Denormals")));
@@ -2380,24 +2524,6 @@ if (!Profile->get_mixbus()) {
 
 	add_option (_("Audio"), dm);
 
-	add_option (_("Audio"), new OptionEditorHeading (_("Plugins")));
-
-	add_option (_("Audio"),
-	     new BoolOption (
-		     "plugins-stop-with-transport",
-		     _("Silence plugins when the transport is stopped"),
-		     sigc::mem_fun (*_rc_config, &RCConfiguration::get_plugins_stop_with_transport),
-		     sigc::mem_fun (*_rc_config, &RCConfiguration::set_plugins_stop_with_transport)
-		     ));
-
-	add_option (_("Audio"),
-	     new BoolOption (
-		     "new-plugins-active",
-		     _("Make new plugins active"),
-		     sigc::mem_fun (*_rc_config, &RCConfiguration::get_new_plugins_active),
-		     sigc::mem_fun (*_rc_config, &RCConfiguration::set_new_plugins_active)
-		     ));
-
 	add_option (_("Audio"), new OptionEditorHeading (_("Regions")));
 
 	add_option (_("Audio"),
@@ -2418,7 +2544,7 @@ if (!Profile->get_mixbus()) {
 
 	/* SOLO AND MUTE */
 
-	add_option (_("Solo / mute"), new OptionEditorHeading (_("Solo")));
+	add_option (_("Solo & mute"), new OptionEditorHeading (_("Solo")));
 
 	_solo_control_is_listen_control = new BoolOption (
 		"solo-control-is-listen-control",
@@ -2427,9 +2553,9 @@ if (!Profile->get_mixbus()) {
 		sigc::mem_fun (*_rc_config, &RCConfiguration::set_solo_control_is_listen_control)
 		);
 
-	add_option (_("Solo / mute"), _solo_control_is_listen_control);
+	add_option (_("Solo & mute"), _solo_control_is_listen_control);
 
-	add_option (_("Solo / mute"),
+	add_option (_("Solo & mute"),
 	     new BoolOption (
 		     "exclusive-solo",
 		     _("Exclusive solo"),
@@ -2437,7 +2563,7 @@ if (!Profile->get_mixbus()) {
 		     sigc::mem_fun (*_rc_config, &RCConfiguration::set_exclusive_solo)
 		     ));
 
-	add_option (_("Solo / mute"),
+	add_option (_("Solo & mute"),
 	     new BoolOption (
 		     "show-solo-mutes",
 		     _("Show solo muting"),
@@ -2445,7 +2571,7 @@ if (!Profile->get_mixbus()) {
 		     sigc::mem_fun (*_rc_config, &RCConfiguration::set_show_solo_mutes)
 		     ));
 
-	add_option (_("Solo / mute"),
+	add_option (_("Solo & mute"),
 	     new BoolOption (
 		     "solo-mute-override",
 		     _("Soloing overrides muting"),
@@ -2453,7 +2579,7 @@ if (!Profile->get_mixbus()) {
 		     sigc::mem_fun (*_rc_config, &RCConfiguration::set_solo_mute_override)
 		     ));
 
-	add_option (_("Solo / mute"),
+	add_option (_("Solo & mute"),
 	     new FaderOption (
 		     "solo-mute-gain",
 		     _("Solo-in-place mute cut (dB)"),
@@ -2471,7 +2597,7 @@ if (!Profile->get_mixbus()) {
 	_listen_position->add (AfterFaderListen, _("after-fader (AFL)"));
 	_listen_position->add (PreFaderListen, _("pre-fader (PFL)"));
 
-	add_option (_("Solo / mute"), _listen_position);
+	add_option (_("Solo & mute"), _listen_position);
 
 	ComboOption<PFLPosition>* pp = new ComboOption<PFLPosition> (
 		"pfl-position",
@@ -2483,7 +2609,7 @@ if (!Profile->get_mixbus()) {
 	pp->add (PFLFromBeforeProcessors, _("before pre-fader processors"));
 	pp->add (PFLFromAfterProcessors, _("pre-fader but after pre-fader processors"));
 
-	add_option (_("Solo / mute"), pp);
+	add_option (_("Solo & mute"), pp);
 
 	ComboOption<AFLPosition>* pa = new ComboOption<AFLPosition> (
 		"afl-position",
@@ -2495,11 +2621,11 @@ if (!Profile->get_mixbus()) {
 	pa->add (AFLFromBeforeProcessors, _("immediately post-fader"));
 	pa->add (AFLFromAfterProcessors, _("after post-fader processors (before pan)"));
 
-	add_option (_("Solo / mute"), pa);
+	add_option (_("Solo & mute"), pa);
 
-	add_option (_("Solo / mute"), new OptionEditorHeading (_("Default track / bus muting options")));
+	add_option (_("Solo & mute"), new OptionEditorHeading (_("Default track / bus muting options")));
 
-	add_option (_("Solo / mute"),
+	add_option (_("Solo & mute"),
 	     new BoolOption (
 		     "mute-affects-pre-fader",
 		     _("Mute affects pre-fader sends"),
@@ -2507,7 +2633,7 @@ if (!Profile->get_mixbus()) {
 		     sigc::mem_fun (*_rc_config, &RCConfiguration::set_mute_affects_pre_fader)
 		     ));
 
-	add_option (_("Solo / mute"),
+	add_option (_("Solo & mute"),
 	     new BoolOption (
 		     "mute-affects-post-fader",
 		     _("Mute affects post-fader sends"),
@@ -2515,7 +2641,7 @@ if (!Profile->get_mixbus()) {
 		     sigc::mem_fun (*_rc_config, &RCConfiguration::set_mute_affects_post_fader)
 		     ));
 
-	add_option (_("Solo / mute"),
+	add_option (_("Solo & mute"),
 	     new BoolOption (
 		     "mute-affects-control-outs",
 		     _("Mute affects control outputs"),
@@ -2523,7 +2649,7 @@ if (!Profile->get_mixbus()) {
 		     sigc::mem_fun (*_rc_config, &RCConfiguration::set_mute_affects_control_outs)
 		     ));
 
-	add_option (_("Solo / mute"),
+	add_option (_("Solo & mute"),
 	     new BoolOption (
 		     "mute-affects-main-outs",
 		     _("Mute affects main outputs"),
@@ -2531,15 +2657,17 @@ if (!Profile->get_mixbus()) {
 		     sigc::mem_fun (*_rc_config, &RCConfiguration::set_mute_affects_main_outs)
 		     ));
 
-	add_option (_("Solo / mute"), new OptionEditorHeading (_("Send Routing")));
 
-	add_option (_("Solo / mute"),
+if (!ARDOUR::Profile->get_mixbus()) {
+	add_option (_("Solo & mute"), new OptionEditorHeading (_("Send Routing")));
+	add_option (_("Solo & mute"),
 	     new BoolOption (
 		     "link-send-and-route-panner",
 		     _("Link panners of Aux and External Sends with main panner by default"),
 		     sigc::mem_fun (*_rc_config, &RCConfiguration::get_link_send_and_route_panner),
 		     sigc::mem_fun (*_rc_config, &RCConfiguration::set_link_send_and_route_panner)
 		     ));
+}
 
 	add_option (_("MIDI"), new OptionEditorHeading (_("MIDI Preferences")));
 
@@ -2594,9 +2722,9 @@ if (!Profile->get_mixbus()) {
 			    sigc::mem_fun (*_rc_config, &RCConfiguration::set_midi_feedback)
 			    ));
 
-	add_option (_("MIDI"), new OptionEditorHeading (_("MIDI Clock")));
+	add_option (_("MIDI/Sync"), new OptionEditorHeading (_("MIDI Clock")));
 
-	add_option (_("MIDI"),
+	add_option (_("MIDI/Sync"),
 		    new BoolOption (
 			    "send-midi-clock",
 			    _("Send MIDI Clock"),
@@ -2604,9 +2732,9 @@ if (!Profile->get_mixbus()) {
 			    sigc::mem_fun (*_rc_config, &RCConfiguration::set_send_midi_clock)
 			    ));
 
-	add_option (_("MIDI"), new OptionEditorHeading (_("MIDI Time Code (MTC)")));
+	add_option (_("MIDI/Sync"), new OptionEditorHeading (_("MIDI Time Code (MTC)")));
 
-	add_option (_("MIDI"),
+	add_option (_("MIDI/Sync"),
 		    new BoolOption (
 			    "send-mtc",
 			    _("Send MIDI Time Code"),
@@ -2614,7 +2742,7 @@ if (!Profile->get_mixbus()) {
 			    sigc::mem_fun (*_rc_config, &RCConfiguration::set_send_mtc)
 			    ));
 
-	add_option (_("MIDI"),
+	add_option (_("MIDI/Sync"),
 		    new SpinOption<int> (
 			    "mtc-qf-speed-tolerance",
 			    _("Percentage either side of normal transport speed to transmit MTC"),
@@ -2623,9 +2751,9 @@ if (!Profile->get_mixbus()) {
 			    0, 20, 1, 5
 			    ));
 
-	add_option (_("MIDI"), new OptionEditorHeading (_("Midi Machine Control (MMC)")));
+	add_option (_("MIDI/Sync"), new OptionEditorHeading (_("Midi Machine Control (MMC)")));
 
-	add_option (_("MIDI"),
+	add_option (_("MIDI/Sync"),
 		    new BoolOption (
 			    "mmc-control",
 			    _("Obey MIDI Machine Control commands"),
@@ -2633,7 +2761,7 @@ if (!Profile->get_mixbus()) {
 			    sigc::mem_fun (*_rc_config, &RCConfiguration::set_mmc_control)
 			    ));
 
-	add_option (_("MIDI"),
+	add_option (_("MIDI/Sync"),
 		    new BoolOption (
 			    "send-mmc",
 			    _("Send MIDI Machine Control commands"),
@@ -2641,7 +2769,7 @@ if (!Profile->get_mixbus()) {
 			    sigc::mem_fun (*_rc_config, &RCConfiguration::set_send_mmc)
 			    ));
 
-	add_option (_("MIDI"),
+	add_option (_("MIDI/Sync"),
 	     new SpinOption<uint8_t> (
 		     "mmc-receive-device-id",
 		     _("Inbound MMC device ID"),
@@ -2650,7 +2778,7 @@ if (!Profile->get_mixbus()) {
 		     0, 128, 1, 10
 		     ));
 
-	add_option (_("MIDI"),
+	add_option (_("MIDI/Sync"),
 	     new SpinOption<uint8_t> (
 		     "mmc-send-device-id",
 		     _("Outbound MMC device ID"),
@@ -2710,30 +2838,21 @@ if (!Profile->get_mixbus()) {
 
 	/* Control Surfaces */
 
-	add_option (_("Control Surfaces"), new ControlSurfacesOptions (*this));
-
-	ComboOption<RemoteModel>* rm = new ComboOption<RemoteModel> (
-		"remote-model",
-		_("Control surface remote ID"),
-		sigc::mem_fun (*_rc_config, &RCConfiguration::get_remote_model),
-		sigc::mem_fun (*_rc_config, &RCConfiguration::set_remote_model)
-		);
-
-	rm->add (UserOrdered, _("assigned by user"));
-	rm->add (MixerOrdered, _("follows order of mixer"));
-
-	add_option (_("Control Surfaces"), rm);
+	add_option (_("Control Surfaces"), new ControlSurfacesOptions);
 
 	/* VIDEO Timeline */
 	add_option (_("Video"), new VideoTimelineOptions (_rc_config));
 
 #if (defined WINDOWS_VST_SUPPORT || defined LXVST_SUPPORT || defined AUDIOUNIT_SUPPORT)
-	add_option (_("Plugins"), new OptionEditorHeading (_("General")));
-
 	add_option (_("Plugins"),
 			new RcActionButton (_("Scan for Plugins"),
 				sigc::mem_fun (*this, &RCOptionEditor::plugin_scan_refresh)));
 
+#endif
+
+	add_option (_("Plugins"), new OptionEditorHeading (_("General")));
+
+#if (defined WINDOWS_VST_SUPPORT || defined LXVST_SUPPORT || defined AUDIOUNIT_SUPPORT)
 	bo = new BoolOption (
 			"show-plugin-scan-window",
 			_("Always Display Plugin Scan Progress"),
@@ -2743,11 +2862,33 @@ if (!Profile->get_mixbus()) {
 	add_option (_("Plugins"), bo);
 	Gtkmm2ext::UI::instance()->set_tip (bo->tip_widget(),
 			_("<b>When enabled</b> a popup window showing plugin scan progress is displayed for indexing (cache load) and discovery (detect new plugins)"));
-
 #endif
 
+	bo = new BoolOption (
+		"plugins-stop-with-transport",
+		_("Silence plugins when the transport is stopped"),
+		sigc::mem_fun (*_rc_config, &RCConfiguration::get_plugins_stop_with_transport),
+		sigc::mem_fun (*_rc_config, &RCConfiguration::set_plugins_stop_with_transport)
+		);
+	add_option (_("Plugins"), bo);
+	Gtkmm2ext::UI::instance()->set_tip (bo->tip_widget(),
+					    _("<b>When enabled</b> plugins will be reset at transport stop. When disabled plugins will be left unchanged at transport stop.\n\nThis mostly affects plugins with a \"tail\" like Reverbs."));
+
+	bo = new BoolOption (
+		"new-plugins-active",
+			_("Make new plugins active"),
+			sigc::mem_fun (*_rc_config, &RCConfiguration::get_new_plugins_active),
+			sigc::mem_fun (*_rc_config, &RCConfiguration::set_new_plugins_active)
+			);
+	add_option (_("Plugins"), bo);
+	Gtkmm2ext::UI::instance()->set_tip (bo->tip_widget(),
+					    _("<b>When enabled</b> plugins will be activated when they are added to tracks/busses. When disabled plugins will be left inactive when they are added to tracks/busses"));
+
 #if (defined WINDOWS_VST_SUPPORT || defined LXVST_SUPPORT)
-	add_option (_("Plugins"), new OptionEditorHeading (_("VST")));
+	add_option (_("Plugins/VST"), new OptionEditorHeading (_("VST")));
+	add_option (_("Plugins/VST"),
+			new RcActionButton (_("Scan for Plugins"),
+				sigc::mem_fun (*this, &RCOptionEditor::plugin_scan_refresh)));
 
 	bo = new BoolOption (
 			"discover-vst-on-start",
@@ -2755,7 +2896,7 @@ if (!Profile->get_mixbus()) {
 			sigc::mem_fun (*_rc_config, &RCConfiguration::get_discover_vst_on_start),
 			sigc::mem_fun (*_rc_config, &RCConfiguration::set_discover_vst_on_start)
 			);
-	add_option (_("Plugins"), bo);
+	add_option (_("Plugins/VST"), bo);
 	Gtkmm2ext::UI::instance()->set_tip (bo->tip_widget(),
 					    _("<b>When enabled</b> new VST plugins are searched, tested and added to the cache index on application start. When disabled new plugins will only be available after triggering a 'Scan' manually"));
 
@@ -2767,40 +2908,40 @@ if (!Profile->get_mixbus()) {
 			sigc::mem_fun (*_rc_config, &RCConfiguration::get_verbose_plugin_scan),
 			sigc::mem_fun (*_rc_config, &RCConfiguration::set_verbose_plugin_scan)
 			);
-	add_option (_("Plugins"), bo);
+	add_option (_("Plugins/VST"), bo);
 	Gtkmm2ext::UI::instance()->set_tip (bo->tip_widget(),
 					    _("<b>When enabled</b> additional information for every plugin is added to the Log Window."));
 #endif
 
-	add_option (_("Plugins"), new VstTimeOutSliderOption (_rc_config));
+	add_option (_("Plugins/VST"), new VstTimeOutSliderOption (_rc_config));
 
-	add_option (_("Plugins"),
+	add_option (_("Plugins/VST"),
 			new RcActionButton (_("Clear"),
 				sigc::mem_fun (*this, &RCOptionEditor::clear_vst_cache),
 				_("VST Cache:")));
 
-	add_option (_("Plugins"),
+	add_option (_("Plugins/VST"),
 			new RcActionButton (_("Clear"),
 				sigc::mem_fun (*this, &RCOptionEditor::clear_vst_blacklist),
 				_("VST Blacklist:")));
 #endif
 
 #ifdef LXVST_SUPPORT
-	add_option (_("Plugins"),
+	add_option (_("Plugins/VST"),
 			new RcActionButton (_("Edit"),
 				sigc::mem_fun (*this, &RCOptionEditor::edit_lxvst_path),
 			_("Linux VST Path:")));
 
-	add_option (_("Plugins"),
+	add_option (_("Plugins/VST"),
 			new RcConfigDisplay (
 				"plugin-path-lxvst",
 				_("Path:"),
 				sigc::mem_fun (*_rc_config, &RCConfiguration::get_plugin_path_lxvst),
-				':'));
+				0));
 #endif
 
 #ifdef WINDOWS_VST_SUPPORT
-	add_option (_("Plugins"),
+	add_option (_("Plugins/VST"),
 			new RcActionButton (_("Edit"),
 				sigc::mem_fun (*this, &RCOptionEditor::edit_vst_path),
 			_("Windows VST Path:")));
@@ -2813,7 +2954,11 @@ if (!Profile->get_mixbus()) {
 #endif
 
 #ifdef AUDIOUNIT_SUPPORT
-	add_option (_("Plugins"), new OptionEditorHeading (_("Audio Unit")));
+
+	add_option (_("Plugins/Audio Unit"), new OptionEditorHeading (_("Audio Unit")));
+	add_option (_("Plugins/Audio Unit"),
+			new RcActionButton (_("Scan for Plugins"),
+				sigc::mem_fun (*this, &RCOptionEditor::plugin_scan_refresh)));
 
 	bo = new BoolOption (
 			"discover-audio-units",
@@ -2825,12 +2970,12 @@ if (!Profile->get_mixbus()) {
 	Gtkmm2ext::UI::instance()->set_tip (bo->tip_widget(),
 					    _("<b>When enabled</b> Audio Unit Plugins are discovered on application start. When disabled AU plugins will only be available after triggering a 'Scan' manually. The first successful scan will enable AU auto-scan, Any crash during plugin discovery will disable it."));
 
-	add_option (_("Plugins"),
+	add_option (_("Plugins/Audio Unit"),
 			new RcActionButton (_("Clear"),
 				sigc::mem_fun (*this, &RCOptionEditor::clear_au_cache),
 				_("AU Cache:")));
 
-	add_option (_("Plugins"),
+	add_option (_("Plugins/Audio Unit"),
 			new RcActionButton (_("Clear"),
 				sigc::mem_fun (*this, &RCOptionEditor::clear_au_blacklist),
 				_("AU Blacklist:")));
@@ -2842,9 +2987,48 @@ if (!Profile->get_mixbus()) {
 	     new BoolOption (
 		     "open-gui-after-adding-plugin",
 		     _("Automatically open the plugin GUI when adding a new plugin"),
-		     sigc::mem_fun (*_rc_config, &RCConfiguration::get_open_gui_after_adding_plugin),
-		     sigc::mem_fun (*_rc_config, &RCConfiguration::set_open_gui_after_adding_plugin)
+		     sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_open_gui_after_adding_plugin),
+		     sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_open_gui_after_adding_plugin)
 		     ));
+
+#if (defined LV2_SUPPORT && defined LV2_EXTENDED)
+	add_option (_("Plugins"),
+	     new BoolOption (
+		     "show-inline-display-by-default",
+		     _("Show Plugin Inline Display on Mixerstrip by default"),
+		     sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_show_inline_display_by_default),
+		     sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_show_inline_display_by_default)
+		     ));
+
+	_plugin_prefer_inline = new BoolOption (
+			"prefer-inline-over-gui",
+			_("Don't automatically open the plugin GUI when the plugin has an inline display mode"),
+			sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_prefer_inline_over_gui),
+			sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_prefer_inline_over_gui)
+			);
+	add_option (_("Plugins"), _plugin_prefer_inline);
+#endif
+
+	add_option (_("Plugins"), new OptionEditorHeading (_("Instrument")));
+
+	bo = new BoolOption (
+			"ask-replace-instrument",
+			_("Ask to replace existing instrument plugin"),
+			sigc::mem_fun (*_rc_config, &RCConfiguration::get_ask_replace_instrument),
+			sigc::mem_fun (*_rc_config, &RCConfiguration::set_ask_replace_instrument)
+			);
+	add_option (_("Plugins"), bo);
+
+	bo = new BoolOption (
+			"ask-setup_instrument",
+			_("Interactively configure instrument plugins on insert"),
+			sigc::mem_fun (*_rc_config, &RCConfiguration::get_ask_setup_instrument),
+			sigc::mem_fun (*_rc_config, &RCConfiguration::set_ask_setup_instrument)
+			);
+	add_option (_("Plugins"), bo);
+	Gtkmm2ext::UI::instance()->set_tip (bo->tip_widget(),
+			_("<b>When enabled</b> show a dialog to select instrument channel configuration before adding a multichannel plugin."));
+
 #endif
 
 	/* INTERFACE */
@@ -2876,13 +3060,20 @@ if (!Profile->get_mixbus()) {
 
 	add_option (S_("Preferences|GUI"),
 	     new BoolOption (
+		     "use-wm-visibility",
+		     _("Use Window Manager/Desktop visibility information"),
+		     sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_use_wm_visibility),
+		     sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_use_wm_visibility)
+		     ));
+
+	add_option (S_("Preferences|GUI"),
+	     new BoolOption (
 		     "widget-prelight",
 		     _("Graphically indicate mouse pointer hovering over various widgets"),
 		     sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_widget_prelight),
 		     sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_widget_prelight)
 		     ));
 
-#ifdef TOOLTIPS_GOT_FIXED
 	add_option (S_("Preferences|GUI"),
 	     new BoolOption (
 		     "use-tooltips",
@@ -2890,7 +3081,6 @@ if (!Profile->get_mixbus()) {
 		     sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_use_tooltips),
 		     sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_use_tooltips)
 		     ));
-#endif
 
 	add_option (S_("Preferences|GUI"),
 	     new BoolOption (
@@ -2900,7 +3090,7 @@ if (!Profile->get_mixbus()) {
 		     sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_show_name_highlight)
 		     ));
 
-	add_option (S_("GUI"),
+	add_option (S_("Preferences|GUI"),
 		    new BoolOption (
 			    "super-rapid-clock-update",
 			    _("Update transport clock display at FPS instead of every 100ms"),
@@ -2909,7 +3099,7 @@ if (!Profile->get_mixbus()) {
 			    ));
 
 
-#ifndef GTKOSX
+#ifndef __APPLE__
 	/* font scaling does nothing with GDK/Quartz */
 	add_option (S_("Preferences|GUI"), new FontScalingOptions ());
 #endif
@@ -2955,6 +3145,7 @@ if (!ARDOUR::Profile->get_mixbus()) {
 	_mixer_strip_visibility.add (0, X_("SoloIsoLock"), _("Solo Iso / Lock"));
 	_mixer_strip_visibility.add (0, X_("Output"), _("Output"));
 	_mixer_strip_visibility.add (0, X_("Comments"), _("Comments"));
+	_mixer_strip_visibility.add (0, X_("VCA"), _("VCA Assigns"));
 
 	add_option (
 		S_("Preferences|GUI"),
@@ -2974,6 +3165,14 @@ if (!ARDOUR::Profile->get_mixbus()) {
 		     sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_default_narrow_ms)
 		     ));
 
+	add_option (S_("Preferences|GUI"),
+			new ColumVisibilityOption (
+				"action-table-columns", _("Action Script Button Visibility"), 3,
+				sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_action_table_columns),
+				sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_action_table_columns)
+				)
+			);
+
 	add_option (S_("Preferences|Metering"), new OptionEditorHeading (_("Metering")));
 
 	ComboOption<float>* mht = new ComboOption<float> (
@@ -3111,7 +3310,7 @@ if (!ARDOUR::Profile->get_mixbus()) {
 
 	Gtkmm2ext::UI::instance()->set_tip
 		(mpks->tip_widget(),
-		 _("Specify the audio signal level in dbFS at and above which the meter-peak indicator will flash red."));
+		 _("Specify the audio signal level in dBFS at and above which the meter-peak indicator will flash red."));
 
 	add_option (S_("Preferences|Metering"), mpks);
 
@@ -3123,15 +3322,46 @@ if (!ARDOUR::Profile->get_mixbus()) {
 		     sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_meter_style_led)
 		     ));
 
+	add_option (S_("Preferences|Metering"), new OptionEditorHeading (_("Editor Meters")));
+
+	add_option (S_("Preferences|Metering"),
+	     new BoolOption (
+		     "show-track-meters",
+		     _("Show meters on tracks in the editor"),
+		     sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_show_track_meters),
+		     sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_show_track_meters)
+		     ));
+
+	add_option (S_("Preferences|Metering"),
+	     new BoolOption (
+		     "editor-stereo-only-meters",
+		     _("Show at most stereo meters in the track-header"),
+		     sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_editor_stereo_only_meters),
+		     sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_editor_stereo_only_meters)
+		     ));
+
+	add_option (S_("Preferences|Metering"), new OptionEditorHeading (_("Post Export Analysis")));
+
+	add_option (S_("Preferences|Metering"),
+	     new BoolOption (
+		     "save-export-analysis-image",
+		     _("Save loudness analysis as image file"),
+		     sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::get_save_export_analysis_image),
+		     sigc::mem_fun (UIConfiguration::instance(), &UIConfiguration::set_save_export_analysis_image)
+		     ));
+
 	/* and now the theme manager */
 
 	ThemeManager* tm = manage (new ThemeManager);
 	add_page (_("Theme"), *tm);
 
+	add_option (_("Theme/Colors"), new ColorThemeManager);
+
 	//trigger some parameter-changed messages which affect widget-visibility or -sensitivity
 	parameter_changed ("send-ltc");
 	parameter_changed ("sync-source");
 	parameter_changed ("use-monitor-bus");
+	parameter_changed ("open-gui-after-adding-plugin");
 }
 
 void
@@ -3169,6 +3399,10 @@ RCOptionEditor::parameter_changed (string const & p)
 		bool const s = Config->get_send_ltc ();
 		_ltc_send_continuously->set_sensitive (s);
 		_ltc_volume_slider->set_sensitive (s);
+	} else if (p == "open-gui-after-adding-plugin" || p == "show-inline-display-by-default") {
+#if (defined LV2_SUPPORT && defined LV2_EXTENDED)
+		_plugin_prefer_inline->set_sensitive (UIConfiguration::instance().get_open_gui_after_adding_plugin() && UIConfiguration::instance().get_show_inline_display_by_default());
+#endif
 	}
 }
 
@@ -3199,10 +3433,10 @@ void RCOptionEditor::clear_au_blacklist () {
 void RCOptionEditor::edit_lxvst_path () {
 	Glib::RefPtr<Gdk::Window> win = get_parent_window ();
 	Gtkmm2ext::PathsDialog *pd = new Gtkmm2ext::PathsDialog (
-			*this, _("Set Linux VST Search Path"),
-			_rc_config->get_plugin_path_lxvst(),
-			PluginManager::instance().get_default_lxvst_path()
-			);
+		*current_toplevel(), _("Set Linux VST Search Path"),
+		_rc_config->get_plugin_path_lxvst(),
+		PluginManager::instance().get_default_lxvst_path()
+		);
 	ResponseType r = (ResponseType) pd->run ();
 	pd->hide();
 	if (r == RESPONSE_ACCEPT) {
@@ -3213,10 +3447,10 @@ void RCOptionEditor::edit_lxvst_path () {
 
 void RCOptionEditor::edit_vst_path () {
 	Gtkmm2ext::PathsDialog *pd = new Gtkmm2ext::PathsDialog (
-			*this, _("Set Windows VST Search Path"),
-			_rc_config->get_plugin_path_vst(),
-			PluginManager::instance().get_default_windows_vst_path()
-			);
+		*current_toplevel(), _("Set Windows VST Search Path"),
+		_rc_config->get_plugin_path_vst(),
+		PluginManager::instance().get_default_windows_vst_path()
+		);
 	ResponseType r = (ResponseType) pd->run ();
 	pd->hide();
 	if (r == RESPONSE_ACCEPT) {
@@ -3247,3 +3481,26 @@ RCOptionEditor::populate_sync_options ()
 
 	parameter_changed ("sync-source");
 }
+
+Gtk::Window*
+RCOptionEditor::use_own_window (bool and_fill_it)
+{
+	bool new_window = !own_window();
+
+	Gtk::Window* win = Tabbable::use_own_window (and_fill_it);
+
+	if (win && new_window) {
+		win->set_name ("PreferencesWindow");
+		ARDOUR_UI::instance()->setup_toplevel_window (*win, _("Preferences"), this);
+	}
+
+	return win;
+}
+
+XMLNode&
+RCOptionEditor::get_state ()
+{
+	XMLNode* node = new XMLNode (X_("Preferences"));
+	node->add_child_nocopy (Tabbable::get_state());
+	return *node;
+}
diff --git a/gtk2_ardour/rc_option_editor.h b/gtk2_ardour/rc_option_editor.h
index 1b543e3..d6c5bed 100644
--- a/gtk2_ardour/rc_option_editor.h
+++ b/gtk2_ardour/rc_option_editor.h
@@ -20,6 +20,8 @@
 #ifndef __gtk_ardour_rc_option_editor_h__
 #define __gtk_ardour_rc_option_editor_h__
 
+#include "gtkmm2ext/tabbable.h"
+
 #include "option_editor.h"
 #include "visibility_group.h"
 
@@ -32,13 +34,16 @@
  */
 
 /** Editor for options which are obtained from and written back to one of the .rc files. */
-class RCOptionEditor : public OptionEditor
+class RCOptionEditor : public OptionEditorContainer, public ARDOUR::SessionHandlePtr, public Gtkmm2ext::Tabbable
 {
 public:
 	RCOptionEditor ();
 
 	void populate_sync_options ();
 
+	Gtk::Window* use_own_window (bool and_fill_it);
+	XMLNode& get_state ();
+
 private:
 	void parameter_changed (std::string const &);
 	void ltc_generator_volume_changed ();
@@ -54,6 +59,7 @@ private:
 	HSliderOption* _ltc_volume_slider;
 	Gtk::Adjustment* _ltc_volume_adjustment;
 	BoolOption* _ltc_send_continuously;
+	BoolOption* _plugin_prefer_inline;
 
 	PBD::ScopedConnection parameter_change_connection;
 	PBD::ScopedConnection engine_started_connection;
diff --git a/gtk2_ardour/region_editor.cc b/gtk2_ardour/region_editor.cc
index 725e5c3..596f600 100644
--- a/gtk2_ardour/region_editor.cc
+++ b/gtk2_ardour/region_editor.cc
@@ -36,7 +36,7 @@
 #include "public_editor.h"
 #include "tooltips.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 using namespace PBD;
diff --git a/gtk2_ardour/region_gain_line.cc b/gtk2_ardour/region_gain_line.cc
index dc1c14e..fd09119 100644
--- a/gtk2_ardour/region_gain_line.cc
+++ b/gtk2_ardour/region_gain_line.cc
@@ -32,7 +32,7 @@
 #include "editor.h"
 #include "gui_thread.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
diff --git a/gtk2_ardour/region_layering_order_editor.cc b/gtk2_ardour/region_layering_order_editor.cc
index 759b69f..e58c7c9 100644
--- a/gtk2_ardour/region_layering_order_editor.cc
+++ b/gtk2_ardour/region_layering_order_editor.cc
@@ -31,7 +31,7 @@
 #include "region_layering_order_editor.h"
 #include "region_view.h"
 #include "utils.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace Gtk;
@@ -128,7 +128,7 @@ RegionLayeringOrderEditor::row_selected ()
 	RegionView* rv = row[layering_order_columns.region_view];
 
 	vector<RegionView*> eq;
-	editor.get_equivalent_regions (rv, eq, Properties::select.property_id);
+	editor.get_equivalent_regions (rv, eq, Properties::group_select.property_id);
 
 	/* XXX this should be reversible, really */
 
@@ -222,7 +222,7 @@ RegionLayeringOrderEditor::on_key_press_event (GdkEventKey* ev)
 	}
 
 	if (!handled) {
-		handled = key_press_focus_accelerator_handler (editor, ev);
+		handled = relay_key_press (ev, this);
 	}
 
 	if (!handled) {
diff --git a/gtk2_ardour/region_selection.cc b/gtk2_ardour/region_selection.cc
index 1536dd6..2a3a307 100644
--- a/gtk2_ardour/region_selection.cc
+++ b/gtk2_ardour/region_selection.cc
@@ -303,3 +303,13 @@ RegionSelection::n_midi_regions () const
 
 	return count;
 }
+
+ARDOUR::RegionList
+RegionSelection::regionlist () const
+{
+	ARDOUR::RegionList rl;
+	for (const_iterator r = begin (); r != end (); ++r) {
+		rl.push_back ((*r)->region ());
+	}
+	return rl;
+}
diff --git a/gtk2_ardour/region_selection.h b/gtk2_ardour/region_selection.h
index 062557e..3bbbe8c 100644
--- a/gtk2_ardour/region_selection.h
+++ b/gtk2_ardour/region_selection.h
@@ -66,6 +66,8 @@ class RegionSelection : public std::list<RegionView*>
 	std::set<boost::shared_ptr<ARDOUR::Playlist> > playlists () const;
 	std::list<PBD::ID> pending;
 
+	ARDOUR::RegionList regionlist () const;
+
   private:
 	void remove_it (RegionView*);
 
diff --git a/gtk2_ardour/region_view.cc b/gtk2_ardour/region_view.cc
index 3312fc3..27e1611 100644
--- a/gtk2_ardour/region_view.cc
+++ b/gtk2_ardour/region_view.cc
@@ -48,7 +48,7 @@
 #include "rgb_macros.h"
 #include "gui_thread.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
@@ -178,13 +178,14 @@ RegionView::init (bool wfd)
 		_enable_display = true;
 	}
 
-	set_height (trackview.current_height());
+	/* derived class calls set_height () including RegionView::set_height() in ::init() */
+	//set_height (trackview.current_height());
 
 	_region->PropertyChanged.connect (*this, invalidator (*this), boost::bind (&RegionView::region_changed, this, _1), gui_context());
 
-	set_colors ();
-
-	UIConfiguration::instance().ColorsChanged.connect (sigc::mem_fun (*this, &RegionView::color_handler));
+	/* derived class calls set_colors () including RegionView::set_colors() in ::init() */
+	//set_colors ();
+	//UIConfiguration::instance().ColorsChanged.connect (sigc::mem_fun (*this, &RegionView::color_handler));
 
 	/* XXX sync mark drag? */
 }
@@ -381,10 +382,6 @@ RegionView::region_changed (const PropertyChange& what_changed)
 	if (what_changed.contains (ARDOUR::Properties::locked)) {
 		region_locked ();
 	}
-	if (what_changed.contains (ARDOUR::Properties::locked)) {
-		/* name will show locked status */
-		region_renamed ();
-	}
 }
 
 void
@@ -592,7 +589,6 @@ RegionView::region_renamed ()
 
 	set_item_name (str, this);
 	set_name_text (str);
-	reset_width_dependent_items (_pixel_width);
 }
 
 void
@@ -779,13 +775,13 @@ RegionView::update_coverage_frames (LayerDisplay d)
 	/* the color that will be used to show parts of regions that will not be heard */
 	uint32_t const non_playing_color = UIConfiguration::instance().color_mod ("covered region", "covered region base");
 
+
 	while (t < end) {
 
 		t++;
 
 		/* is this region is on top at time t? */
 		bool const new_me = (pl->top_unmuted_region_at (t) == _region);
-
 		/* finish off any old rect, if required */
 		if (cr && me != new_me) {
 			cr->set_x1 (trackview.editor().sample_to_pixel (t - position));
@@ -806,11 +802,15 @@ RegionView::update_coverage_frames (LayerDisplay d)
 				cr->set_fill_color (non_playing_color);
 			}
 		}
-
 		t = pl->find_next_region_boundary (t, 1);
+		if (t < 0) {
+			break;
+		}
 		me = new_me;
 	}
 
+	t = pl->find_next_region_boundary (t, 1);
+
 	if (cr) {
 		/* finish off the last rectangle */
 		cr->set_x1 (trackview.editor().sample_to_pixel (end - position));
@@ -834,7 +834,7 @@ RegionView::update_coverage_frames (LayerDisplay d)
 }
 
 bool
-RegionView::trim_front (framepos_t new_bound, bool no_overlap)
+RegionView::trim_front (framepos_t new_bound, bool no_overlap, const int32_t sub_num)
 {
 	if (_region->locked()) {
 		return false;
@@ -845,7 +845,13 @@ RegionView::trim_front (framepos_t new_bound, bool no_overlap)
 
 	framepos_t const pre_trim_first_frame = _region->first_frame();
 
-	_region->trim_front ((framepos_t) (new_bound * speed));
+	const framepos_t speed_bound = (framepos_t) (new_bound * speed);
+
+	if (_region->position() == speed_bound) {
+		return false;
+	}
+
+	_region->trim_front (speed_bound, sub_num);
 
 	if (no_overlap) {
 		// Get the next region on the left of this region and shrink/expand it.
@@ -870,7 +876,7 @@ RegionView::trim_front (framepos_t new_bound, bool no_overlap)
 }
 
 bool
-RegionView::trim_end (framepos_t new_bound, bool no_overlap)
+RegionView::trim_end (framepos_t new_bound, bool no_overlap, const int32_t sub_num)
 {
 	if (_region->locked()) {
 		return false;
@@ -881,7 +887,7 @@ RegionView::trim_end (framepos_t new_bound, bool no_overlap)
 
 	framepos_t const pre_trim_last_frame = _region->last_frame();
 
-	_region->trim_end ((framepos_t) (new_bound * speed));
+	_region->trim_end ((framepos_t) (new_bound * speed), sub_num);
 
 	if (no_overlap) {
 		// Get the next region on the right of this region and shrink/expand it.
@@ -896,7 +902,7 @@ RegionView::trim_end (framepos_t new_bound, bool no_overlap)
 
 		// Only trim region on the right if the last frame has gone beyond the right region's first frame.
 		if (region_right != 0 && (region_right->first_frame() < _region->last_frame() || regions_touching)) {
-			region_right->trim_front (_region->last_frame() + 1);
+			region_right->trim_front (_region->last_frame() + 1, sub_num);
 		}
 
 		region_changed (ARDOUR::bounds_change);
diff --git a/gtk2_ardour/region_view.h b/gtk2_ardour/region_view.h
index f17e37a..7fad731 100644
--- a/gtk2_ardour/region_view.h
+++ b/gtk2_ardour/region_view.h
@@ -102,12 +102,12 @@ class RegionView : public TimeAxisViewItem
 	/** Called when a front trim is about to begin */
 	virtual void trim_front_starting () {}
 
-	bool trim_front (framepos_t, bool);
+	bool trim_front (framepos_t, bool, const int32_t sub_num);
 
 	/** Called when a start trim has finished */
 	virtual void trim_front_ending () {}
 
-	bool trim_end (framepos_t, bool);
+	bool trim_end (framepos_t, bool, const int32_t sub_num);
         void move_contents (ARDOUR::frameoffset_t);
 	virtual void thaw_after_trim ();
 
diff --git a/gtk2_ardour/icons/ardour_icon_16px.png b/gtk2_ardour/resources/Ardour-icon_16px.png
similarity index 100%
rename from gtk2_ardour/icons/ardour_icon_16px.png
rename to gtk2_ardour/resources/Ardour-icon_16px.png
diff --git a/gtk2_ardour/icons/ardour_icon_22px.png b/gtk2_ardour/resources/Ardour-icon_22px.png
similarity index 100%
rename from gtk2_ardour/icons/ardour_icon_22px.png
rename to gtk2_ardour/resources/Ardour-icon_22px.png
diff --git a/gtk2_ardour/icons/ardour_icon_256px.png b/gtk2_ardour/resources/Ardour-icon_256px.png
similarity index 100%
rename from gtk2_ardour/icons/ardour_icon_256px.png
rename to gtk2_ardour/resources/Ardour-icon_256px.png
diff --git a/gtk2_ardour/icons/ardour_icon_32px.png b/gtk2_ardour/resources/Ardour-icon_32px.png
similarity index 100%
rename from gtk2_ardour/icons/ardour_icon_32px.png
rename to gtk2_ardour/resources/Ardour-icon_32px.png
diff --git a/gtk2_ardour/icons/ardour_icon_48px.png b/gtk2_ardour/resources/Ardour-icon_48px.png
similarity index 100%
rename from gtk2_ardour/icons/ardour_icon_48px.png
rename to gtk2_ardour/resources/Ardour-icon_48px.png
diff --git a/gtk2_ardour/icons/ardour_icon_512px.png b/gtk2_ardour/resources/Ardour-icon_512px.png
similarity index 100%
rename from gtk2_ardour/icons/ardour_icon_512px.png
rename to gtk2_ardour/resources/Ardour-icon_512px.png
diff --git a/gtk2_ardour/small-splash.png b/gtk2_ardour/resources/Ardour-small-splash.png
similarity index 100%
rename from gtk2_ardour/small-splash.png
rename to gtk2_ardour/resources/Ardour-small-splash.png
diff --git a/gtk2_ardour/splash.png b/gtk2_ardour/resources/Ardour-splash.png
similarity index 100%
rename from gtk2_ardour/splash.png
rename to gtk2_ardour/resources/Ardour-splash.png
diff --git a/gtk2_ardour/return_ui.cc b/gtk2_ardour/return_ui.cc
index 301ecda..a6b27f7 100644
--- a/gtk2_ardour/return_ui.cc
+++ b/gtk2_ardour/return_ui.cc
@@ -28,7 +28,7 @@
 #include "gui_thread.h"
 #include "timers.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
diff --git a/gtk2_ardour/rhythm_ferret.cc b/gtk2_ardour/rhythm_ferret.cc
index 57e7632..4d39232 100644
--- a/gtk2_ardour/rhythm_ferret.cc
+++ b/gtk2_ardour/rhythm_ferret.cc
@@ -33,7 +33,7 @@
 #include "editor.h"
 #include "time_axis_view.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace Gtk;
@@ -58,20 +58,25 @@ static const gchar * _onset_function_strings[] = {
 	N_("Phase Deviation"),
 	N_("Kullback-Liebler"),
 	N_("Modified Kullback-Liebler"),
+#ifdef HAVE_AUBIO4
+	N_("Spectral Flux"),
+#endif
 	0
 };
 
 static const gchar * _operation_strings[] = {
 	N_("Split region"),
+#if 0 // these don't do what a user expects
 	N_("Snap regions"),
 	N_("Conform regions"),
+#endif
 	0
 };
 
 RhythmFerret::RhythmFerret (Editor& e)
 	: ArdourDialog (_("Rhythm Ferret"))
 	, editor (e)
-	, detection_threshold_adjustment (0.015, 0.0, 0.1, 0.001, 0.1)
+	, detection_threshold_adjustment (-35, -80, -6, 1, 6)
 	, detection_threshold_scale (detection_threshold_adjustment)
 	, sensitivity_adjustment (40, 0, 100, 1, 10)
 	, sensitivity_scale (sensitivity_adjustment)
@@ -80,6 +85,10 @@ RhythmFerret::RhythmFerret (Editor& e)
 	, peak_picker_threshold_scale (peak_picker_threshold_adjustment)
 	, silence_threshold_adjustment (-90.0, -120.0, 0.0, 1, 10)
 	, silence_threshold_scale (silence_threshold_adjustment)
+#ifdef HAVE_AUBIO4
+	, minioi_adjustment (4, 0, 40, 1, 5)
+	, minioi_scale (minioi_adjustment)
+#endif
 	, trigger_gap_adjustment (3, 0, 100, 1, 10)
 	, trigger_gap_spinner (trigger_gap_adjustment)
 	, action_button (Stock::APPLY)
@@ -114,19 +123,13 @@ RhythmFerret::RhythmFerret (Editor& e)
 	t->attach (onset_detection_function_selector, 1, 2, n, n + 1, FILL);
 	++n;
 
-	t->attach (*manage (new Label (_("Trigger gap"), 1, 0.5)), 0, 1, n, n + 1, FILL);
+	t->attach (*manage (new Label (_("Trigger gap (postproc)"), 1, 0.5)), 0, 1, n, n + 1, FILL);
 	t->attach (trigger_gap_spinner, 1, 2, n, n + 1, FILL);
 	t->attach (*manage (new Label (_("ms"))), 2, 3, n, n + 1, FILL);
 	++n;
 
-	t->attach (*manage (new Label (_("Threshold"), 1, 0.5)), 0, 1, n, n + 1, FILL);
-	t->attach (detection_threshold_scale, 1, 2, n, n + 1, FILL);
-	t->attach (*manage (new Label (_("dB"))), 2, 3, n, n + 1, FILL);
-	++n;
-
 	t->attach (*manage (new Label (_("Peak threshold"), 1, 0.5)), 0, 1, n, n + 1, FILL);
 	t->attach (peak_picker_threshold_scale, 1, 2, n, n + 1, FILL);
-	t->attach (*manage (new Label (_("dB"))), 2, 3, n, n + 1, FILL);
 	++n;
 
 	t->attach (*manage (new Label (_("Silence threshold"), 1, 0.5)), 0, 1, n, n + 1, FILL);
@@ -134,10 +137,23 @@ RhythmFerret::RhythmFerret (Editor& e)
 	t->attach (*manage (new Label (_("dB"))), 2, 3, n, n + 1, FILL);
 	++n;
 
+#ifdef HAVE_AUBIO4
+	t->attach (*manage (new Label (_("Min Inter-Onset Time"), 1, 0.5)), 0, 1, n, n + 1, FILL);
+	t->attach (minioi_scale, 1, 2, n, n + 1, FILL);
+	t->attach (*manage (new Label (_("ms"))), 2, 3, n, n + 1, FILL);
+	++n;
+#endif
+
+
 	t->attach (*manage (new Label (_("Sensitivity"), 1, 0.5)), 0, 1, n, n + 1, FILL);
 	t->attach (sensitivity_scale, 1, 2, n, n + 1, FILL);
 	++n;
 
+	t->attach (*manage (new Label (_("Cut Pos Threshold"), 1, 0.5)), 0, 1, n, n + 1, FILL);
+	t->attach (detection_threshold_scale, 1, 2, n, n + 1, FILL);
+	t->attach (*manage (new Label (_("dB"))), 2, 3, n, n + 1, FILL);
+	++n;
+
 	t->attach (*manage (new Label (_("Operation"), 1, 0.5)), 0, 1, n, n + 1, FILL);
 	t->attach (operation_selector, 1, 2, n, n + 1, FILL);
 	++n;
@@ -161,12 +177,16 @@ RhythmFerret::analysis_mode_changed ()
 {
 	bool const perc = get_analysis_mode() == PercussionOnset;
 
-	trigger_gap_spinner.set_sensitive (!perc);
+	// would be nice to actually hide/show the rows.
 	detection_threshold_scale.set_sensitive (perc);
 	sensitivity_scale.set_sensitive (perc);
+	trigger_gap_spinner.set_sensitive (!perc);
 	onset_detection_function_selector.set_sensitive (!perc);
 	peak_picker_threshold_scale.set_sensitive (!perc);
 	silence_threshold_scale.set_sensitive (!perc);
+#ifdef HAVE_AUBIO4
+	minioi_scale.set_sensitive (!perc);
+#endif
 }
 
 RhythmFerret::AnalysisMode
@@ -225,7 +245,7 @@ RhythmFerret::run_analysis ()
 			break;
 		}
 
-		(*i)->region()->set_transients (current_results);
+		(*i)->region()->set_onsets (current_results);
 		current_results.clear();
 	}
 }
@@ -240,8 +260,10 @@ RhythmFerret::run_percussion_onset_analysis (boost::shared_ptr<Readable> readabl
 		AnalysisFeatureList these_results;
 
 		t.reset ();
-		t.set_threshold (detection_threshold_adjustment.get_value());
-		t.set_sensitivity (sensitivity_adjustment.get_value());
+		float dB = detection_threshold_adjustment.get_value();
+		float coeff = dB > -80.0f ? pow (10.0f, dB * 0.05f) : 0.0f;
+		t.set_threshold (coeff);
+		t.set_sensitivity (4, sensitivity_adjustment.get_value());
 
 		if (t.run ("", readable.get(), i, these_results)) {
 			continue;
@@ -287,11 +309,15 @@ RhythmFerret::run_note_onset_analysis (boost::shared_ptr<Readable> readable, fra
 
 			AnalysisFeatureList these_results;
 
-			t.reset ();
-
 			t.set_function (get_note_onset_function());
 			t.set_silence_threshold (silence_threshold_adjustment.get_value());
 			t.set_peak_threshold (peak_picker_threshold_adjustment.get_value());
+#ifdef HAVE_AUBIO4
+			t.set_minioi (minioi_adjustment.get_value());
+#endif
+
+			// aubio-vamp only picks up new settings on reset.
+			t.reset ();
 
 			if (t.run ("", readable.get(), i, these_results)) {
 				continue;
@@ -327,6 +353,7 @@ RhythmFerret::do_action ()
 		do_split_action ();
 		break;
 	case SnapRegionsToGrid:
+		// split first, select all.. ?!
 		editor.snap_regions_to_grid();
 		break;
 	case ConformRegion:
@@ -360,7 +387,7 @@ RhythmFerret::do_split_action ()
 	for (RegionSelection::iterator i = regions.begin(); i != regions.end(); ++i) {
 
 		AnalysisFeatureList features;
-		features = (*i)->region()->transients();
+		(*i)->region()->transients(features);
 
 		merged_features.insert (merged_features.end(), features.begin(), features.end());
 	}
@@ -407,7 +434,7 @@ RhythmFerret::clear_transients ()
 	current_results.clear ();
 
 	for (RegionSelection::iterator i = regions_with_transients.begin(); i != regions_with_transients.end(); ++i) {
-		(*i)->region()->set_transients (current_results);
+		(*i)->region()->set_onsets (current_results);
 	}
 
 	regions_with_transients.clear ();
diff --git a/gtk2_ardour/rhythm_ferret.h b/gtk2_ardour/rhythm_ferret.h
index 84b5cc5..f091916 100644
--- a/gtk2_ardour/rhythm_ferret.h
+++ b/gtk2_ardour/rhythm_ferret.h
@@ -85,6 +85,10 @@ class RhythmFerret : public ArdourDialog {
 	Gtk::HScale peak_picker_threshold_scale;
 	Gtk::Adjustment silence_threshold_adjustment;
 	Gtk::HScale silence_threshold_scale;
+#ifdef HAVE_AUBIO4
+	Gtk::Adjustment minioi_adjustment;
+	Gtk::HScale minioi_scale;
+#endif
 
 	/* generic stuff */
 
diff --git a/gtk2_ardour/route_group_dialog.cc b/gtk2_ardour/route_group_dialog.cc
index f55281f..d7fb115 100644
--- a/gtk2_ardour/route_group_dialog.cc
+++ b/gtk2_ardour/route_group_dialog.cc
@@ -30,7 +30,7 @@
 #include "group_tabs.h"
 #include "utils.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace Gtk;
 using namespace ARDOUR;
@@ -126,12 +126,12 @@ RouteGroupDialog::RouteGroupDialog (RouteGroup* g, bool creating_new)
 	_active.signal_toggled().connect (sigc::mem_fun (*this, &RouteGroupDialog::update));
 	_color.signal_color_set().connect (sigc::mem_fun (*this, &RouteGroupDialog::update));
 	_gain.signal_toggled().connect (sigc::mem_fun (*this, &RouteGroupDialog::update));
- 	_relative.signal_toggled().connect (sigc::mem_fun (*this, &RouteGroupDialog::update));
- 	_mute.signal_toggled().connect (sigc::mem_fun (*this, &RouteGroupDialog::update));
- 	_solo.signal_toggled().connect (sigc::mem_fun (*this, &RouteGroupDialog::update));
- 	_rec_enable.signal_toggled().connect (sigc::mem_fun (*this, &RouteGroupDialog::update));
- 	_select.signal_toggled().connect (sigc::mem_fun (*this, &RouteGroupDialog::update));
- 	_route_active.signal_toggled().connect (sigc::mem_fun (*this, &RouteGroupDialog::update));
+	_relative.signal_toggled().connect (sigc::mem_fun (*this, &RouteGroupDialog::update));
+	_mute.signal_toggled().connect (sigc::mem_fun (*this, &RouteGroupDialog::update));
+	_solo.signal_toggled().connect (sigc::mem_fun (*this, &RouteGroupDialog::update));
+	_rec_enable.signal_toggled().connect (sigc::mem_fun (*this, &RouteGroupDialog::update));
+	_select.signal_toggled().connect (sigc::mem_fun (*this, &RouteGroupDialog::update));
+	_route_active.signal_toggled().connect (sigc::mem_fun (*this, &RouteGroupDialog::update));
 	_share_color.signal_toggled().connect (sigc::mem_fun (*this, &RouteGroupDialog::update));
 	_share_monitoring.signal_toggled().connect (sigc::mem_fun (*this, &RouteGroupDialog::update));
 
@@ -178,35 +178,27 @@ RouteGroupDialog::RouteGroupDialog (RouteGroup* g, bool creating_new)
 	show_all_children ();
 }
 
-/** @return true if the route group edit was cancelled, otherwise false */
 bool
-RouteGroupDialog::do_run ()
+RouteGroupDialog::name_check () const
 {
-	while (1) {
-		int const r = run ();
-		if (r == Gtk::RESPONSE_CANCEL) {
-			/* cancel, so just bail now */
-			return Gtk::RESPONSE_CANCEL;
-		}
+	if (unique_name (_name.get_text())) {
+		/* not cancelled and the name is ok, so all is well */
+		return true;
+	}
 
-		if (unique_name (_name.get_text())) {
-			/* not cancelled and the name is ok, so all is well */
-			return false;
-		}
+	_group->set_name (_initial_name);
 
-		_group->set_name (_initial_name);
-		MessageDialog msg (
-			_("The group name is not unique. Please use a different name."),
-			false,
-			Gtk::MESSAGE_ERROR,
-			Gtk::BUTTONS_OK,
-			true
-			);
+	MessageDialog msg (
+		_("The group name is not unique. Please use a different name."),
+		false,
+		Gtk::MESSAGE_ERROR,
+		Gtk::BUTTONS_OK,
+		true
+		);
 
-		msg.run ();
-	}
+	msg.set_position (WIN_POS_MOUSE);
+	msg.run ();
 
-	abort(); /* NOTREACHED */
 	return false;
 }
 
@@ -215,17 +207,17 @@ RouteGroupDialog::update ()
 {
 	PropertyList plist;
 
-	plist.add (Properties::gain, _gain.get_active());
-	plist.add (Properties::recenable, _rec_enable.get_active());
-	plist.add (Properties::mute, _mute.get_active());
-	plist.add (Properties::solo, _solo.get_active ());
-	plist.add (Properties::select, _select.get_active());
-	plist.add (Properties::route_active, _route_active.get_active());
-	plist.add (Properties::relative, _relative.get_active());
+	plist.add (Properties::group_gain, _gain.get_active());
+	plist.add (Properties::group_recenable, _rec_enable.get_active());
+	plist.add (Properties::group_mute, _mute.get_active());
+	plist.add (Properties::group_solo, _solo.get_active ());
+	plist.add (Properties::group_select, _select.get_active());
+	plist.add (Properties::group_route_active, _route_active.get_active());
+	plist.add (Properties::group_relative, _relative.get_active());
+	plist.add (Properties::group_color, _share_color.get_active());
+	plist.add (Properties::group_monitoring, _share_monitoring.get_active());
 	plist.add (Properties::active, _active.get_active());
 	plist.add (Properties::name, string (_name.get_text()));
-	plist.add (Properties::color, _share_color.get_active());
-	plist.add (Properties::monitoring, _share_monitoring.get_active());
 
 	_group->apply_changes (plist);
 
diff --git a/gtk2_ardour/route_group_dialog.h b/gtk2_ardour/route_group_dialog.h
index 5e2521d..5489cd2 100644
--- a/gtk2_ardour/route_group_dialog.h
+++ b/gtk2_ardour/route_group_dialog.h
@@ -32,7 +32,8 @@ class RouteGroupDialog : public ArdourDialog
 public:
 	RouteGroupDialog (ARDOUR::RouteGroup *, bool);
 
-	bool do_run ();
+	ARDOUR::RouteGroup* group() const { return _group; }
+	bool name_check () const;
 
 private:
 	ARDOUR::RouteGroup* _group;
diff --git a/gtk2_ardour/route_group_menu.cc b/gtk2_ardour/route_group_menu.cc
index f4c7611..5ccafae 100644
--- a/gtk2_ardour/route_group_menu.cc
+++ b/gtk2_ardour/route_group_menu.cc
@@ -19,13 +19,17 @@
 
 #include <gtkmm/menu.h>
 #include <gtkmm/stock.h>
+
 #include "gtkmm2ext/utils.h"
+#include "gtkmm2ext/doi.h"
+
 #include "ardour/session.h"
 #include "ardour/route_group.h"
 #include "ardour/route.h"
 #include "route_group_menu.h"
 #include "route_group_dialog.h"
-#include "i18n.h"
+
+#include "pbd/i18n.h"
 
 using namespace Gtk;
 using namespace ARDOUR;
@@ -158,14 +162,23 @@ RouteGroupMenu::new_group ()
 	}
 
 	RouteGroup* g = new RouteGroup (*_session, "");
-	RouteGroupDialog d (g, true);
+	RouteGroupDialog* d = new RouteGroupDialog (g, true);
+
+	d->signal_response().connect (sigc::bind (sigc::mem_fun (*this, &RouteGroupMenu::new_group_dialog_finished), d));
+	d->present ();
+}
 
-	if (d.do_run ()) {
-		delete g;
+void
+RouteGroupMenu::new_group_dialog_finished (int r, RouteGroupDialog* d)
+{
+	if (r == RESPONSE_OK) {
+		_session->add_route_group (d->group());
+		set_group (d->group());
 	} else {
-		_session->add_route_group (g);
-		set_group (g);
+		delete d->group ();
 	}
+
+	delete_when_idle (d);
 }
 
 Gtk::Menu *
diff --git a/gtk2_ardour/route_group_menu.h b/gtk2_ardour/route_group_menu.h
index 5d711ff..334a3b5 100644
--- a/gtk2_ardour/route_group_menu.h
+++ b/gtk2_ardour/route_group_menu.h
@@ -23,6 +23,8 @@
 #include "ardour/route_group.h"
 #include "ardour/session_handle.h"
 
+class RouteGroupDialog;
+
 class RouteGroupMenu : public ARDOUR::SessionHandlePtr
 {
 public:
@@ -37,8 +39,10 @@ public:
 	void add_item (ARDOUR::RouteGroup *, std::set<ARDOUR::RouteGroup*> const &, Gtk::RadioMenuItem::Group*);
 	void new_group ();
 	void set_group (ARDOUR::RouteGroup *);
+	void new_group_dialog_finished (int, RouteGroupDialog*);
 
 	Gtk::Menu* _menu;
+
 	PBD::PropertyList* _default_properties;
 	bool _inhibit_group_selected;
 	ARDOUR::WeakRouteList _subject;
diff --git a/gtk2_ardour/route_params_ui.cc b/gtk2_ardour/route_params_ui.cc
index 82e6f10..a8ddc02 100644
--- a/gtk2_ardour/route_params_ui.cc
+++ b/gtk2_ardour/route_params_ui.cc
@@ -48,7 +48,7 @@
 #include "send_ui.h"
 #include "timers.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 using namespace PBD;
@@ -124,19 +124,11 @@ RouteParams_UI::RouteParams_UI ()
 	route_vpacker.pack_start (title_label, false, false);
 	route_vpacker.pack_start (route_hpacker, true, true);
 
+	list_hpane.add (list_vpacker);
+	list_hpane.add (route_vpacker);
 
-	list_hpane.pack1 (list_vpacker);
-	list_hpane.add2 (route_vpacker);
-
-	list_hpane.set_position(110);
-
-	redir_hpane.set_position(110);
-
-	//global_vpacker.pack_start (list_hpane, true, true);
-	//get_vbox()->pack_start (global_vpacker);
 	add (list_hpane);
 
-
 	set_name ("RouteParamsWindow");
 	set_default_size (620,370);
 	set_wmclass (X_("ardour_route_parameters"), PROGRAM_NAME);
@@ -250,7 +242,7 @@ RouteParams_UI::setup_processor_boxes()
 		if (at) {
 			at->FreezeChange.connect (route_connections, invalidator (*this), boost::bind (&RouteParams_UI::map_frozen, this), gui_context());
 		}
-		redir_hpane.pack1 (*insert_box);
+		redir_hpane.add (*insert_box);
 
 		insert_box->ProcessorSelected.connect (sigc::mem_fun(*this, &RouteParams_UI::redirect_selected));  //note:  this indicates a double-click activation, not just a "selection"
 		insert_box->ProcessorUnselected.connect (sigc::mem_fun(*this, &RouteParams_UI::redirect_selected));
@@ -520,9 +512,7 @@ RouteParams_UI::show_track_menu()
 	if (track_menu == 0) {
 		track_menu = new Menu;
 		track_menu->set_name ("ArdourContextMenu");
-		track_menu->items().push_back
-				(MenuElem (_("Add Track or Bus"),
-					   sigc::bind (sigc::mem_fun (*(ARDOUR_UI::instance()), &ARDOUR_UI::add_route), (Gtk::Window*) 0)));
+		track_menu->items().push_back (MenuElem (_("Add Track or Bus"), sigc::mem_fun (*(ARDOUR_UI::instance()), &ARDOUR_UI::add_route)));
 	}
 	track_menu->popup (1, gtk_get_current_event_time());
 }
@@ -548,7 +538,7 @@ RouteParams_UI::redirect_selected (boost::shared_ptr<ARDOUR::Processor> proc)
 		send->DropReferences.connect (_processor_going_away_connection, invalidator (*this), boost::bind (&RouteParams_UI::processor_going_away, this, boost::weak_ptr<Processor>(proc)), gui_context());
 		_active_view = send_ui;
 
-		redir_hpane.add2 (*_active_view);
+		redir_hpane.add (*_active_view);
 		redir_hpane.show_all();
 
 	} else if ((retrn = boost::dynamic_pointer_cast<Return> (proc)) != 0) {
@@ -559,7 +549,7 @@ RouteParams_UI::redirect_selected (boost::shared_ptr<ARDOUR::Processor> proc)
 		retrn->DropReferences.connect (_processor_going_away_connection, invalidator (*this), boost::bind (&RouteParams_UI::processor_going_away, this, boost::weak_ptr<Processor>(proc)), gui_context());
 		_active_view = return_ui;
 
-		redir_hpane.add2 (*_active_view);
+		redir_hpane.add (*_active_view);
 		redir_hpane.show_all();
 
 	} else if ((plugin_insert = boost::dynamic_pointer_cast<PluginInsert> (proc)) != 0) {
@@ -571,7 +561,7 @@ RouteParams_UI::redirect_selected (boost::shared_ptr<ARDOUR::Processor> proc)
 		plugin_ui->start_updating (0);
 		_active_view = plugin_ui;
 
-		redir_hpane.pack2 (*_active_view);
+		redir_hpane.add (*_active_view);
 		redir_hpane.show_all();
 
 	} else if ((port_insert = boost::dynamic_pointer_cast<PortInsert> (proc)) != 0) {
@@ -582,7 +572,7 @@ RouteParams_UI::redirect_selected (boost::shared_ptr<ARDOUR::Processor> proc)
 		port_insert->DropReferences.connect (_processor_going_away_connection, invalidator (*this), boost::bind (&RouteParams_UI::processor_going_away, this, boost::weak_ptr<Processor> (proc)), gui_context());
 		_active_view = portinsert_ui;
 
-		redir_hpane.pack2 (*_active_view);
+		redir_hpane.add (*_active_view);
 		portinsert_ui->redisplay();
 		redir_hpane.show_all();
 	}
diff --git a/gtk2_ardour/route_params_ui.h b/gtk2_ardour/route_params_ui.h
index 65bef26..83ddf27 100644
--- a/gtk2_ardour/route_params_ui.h
+++ b/gtk2_ardour/route_params_ui.h
@@ -27,7 +27,6 @@
 #include <gtkmm/eventbox.h>
 #include <gtkmm/frame.h>
 #include <gtkmm/label.h>
-#include <gtkmm/paned.h>
 #include <gtkmm/scrolledwindow.h>
 #include <gtkmm/togglebutton.h>
 #include <gtkmm/treeview.h>
@@ -37,6 +36,8 @@
 
 #include "ardour/ardour.h"
 
+#include <gtkmm2ext/pane.h>
+
 #include "ardour_window.h"
 #include "processor_box.h"
 #include "route_processor_selection.h"
@@ -66,22 +67,13 @@ class RouteParams_UI : public ArdourWindow, public PBD::ScopedConnectionList
 	PluginSelector* plugin_selector() { return _plugin_selector; }
 
   private:
-	Gtk::HBox                global_hpacker;
-	Gtk::VBox                global_vpacker;
-	Gtk::ScrolledWindow      scroller;
-	Gtk::EventBox            scroller_base;
-	Gtk::HBox                scroller_hpacker;
-	Gtk::VBox                mixer_scroller_vpacker;
-
 	Gtk::VBox                list_vpacker;
-	Gtk::Label               route_list_button_label;
-	Gtk::Button              route_list_button;
 	Gtk::ScrolledWindow      route_select_scroller;
 
 	Gtk::Notebook            notebook;
 	Gtk::Frame		 input_frame;
 	Gtk::Frame		 output_frame;
-	Gtk::HPaned		 redir_hpane;
+	Gtkmm2ext::HPane	 redir_hpane;
 
 	Gtk::Frame		 route_select_frame;
 
@@ -90,11 +82,9 @@ class RouteParams_UI : public ArdourWindow, public PBD::ScopedConnectionList
 
 	ProcessorBox*            insert_box;
 
-	Gtk::HPaned		 list_hpane;
-
-	Gtk::HPaned		 right_hpane;
+	Gtkmm2ext::HPane	 list_hpane;
 
-	Gtk::Frame		 route_choice_frame;
+	Gtkmm2ext::HPane	 right_hpane;
 
 	Gtk::Frame		 route_param_frame;
 
diff --git a/gtk2_ardour/route_processor_selection.cc b/gtk2_ardour/route_processor_selection.cc
index 30943e2..729032e 100644
--- a/gtk2_ardour/route_processor_selection.cc
+++ b/gtk2_ardour/route_processor_selection.cc
@@ -26,7 +26,7 @@
 #include "route_processor_selection.h"
 #include "route_ui.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
@@ -42,7 +42,7 @@ RouteProcessorSelection::operator= (const RouteProcessorSelection& other)
 {
 	if (&other != this) {
 		processors = other.processors;
-		routes = other.routes;
+		axes = other.axes;
 	}
 	return *this;
 }
@@ -51,7 +51,7 @@ bool
 operator== (const RouteProcessorSelection& a, const RouteProcessorSelection& b)
 {
 	// XXX MUST TEST PROCESSORS SOMEHOW
-	return a.routes == b.routes;
+	return a.axes == b.axes;
 }
 
 void
@@ -71,10 +71,10 @@ RouteProcessorSelection::clear_processors ()
 void
 RouteProcessorSelection::clear_routes ()
 {
-	for (RouteUISelection::iterator i = routes.begin(); i != routes.end(); ++i) {
+	for (AxisViewSelection::iterator i = axes.begin(); i != axes.end(); ++i) {
 		(*i)->set_selected (false);
 	}
-	routes.clear ();
+	axes.clear ();
 	drop_connections ();
 	if (!_no_route_change_signal) {
 		RoutesChanged ();
@@ -98,34 +98,33 @@ RouteProcessorSelection::set (XMLNode* node)
 }
 
 void
-RouteProcessorSelection::add (RouteUI* r)
+RouteProcessorSelection::add (AxisView* r)
 {
-	if (find (routes.begin(), routes.end(), r) == routes.end()) {
-		if (routes.insert (r).second) {
-			r->set_selected (true);
+	if (axes.insert (r).second) {
 
-			MixerStrip* ms = dynamic_cast<MixerStrip*> (r);
+		r->set_selected (true);
 
-			if (ms) {
-				ms->CatchDeletion.connect (*this, invalidator (*this), boost::bind (&RouteProcessorSelection::remove, this, _1), gui_context());
-			}
+		MixerStrip* ms = dynamic_cast<MixerStrip*> (r);
 
-			if (!_no_route_change_signal) {
-				RoutesChanged();
-			}
+		if (ms) {
+			ms->CatchDeletion.connect (*this, invalidator (*this), boost::bind (&RouteProcessorSelection::remove, this, _1), gui_context());
+		}
+
+		if (!_no_route_change_signal) {
+			RoutesChanged();
 		}
 	}
 }
 
 void
-RouteProcessorSelection::remove (RouteUI* r)
+RouteProcessorSelection::remove (AxisView* r)
 {
 	ENSURE_GUI_THREAD (*this, &RouteProcessorSelection::remove, r);
 
-	RouteUISelection::iterator i;
-	if ((i = find (routes.begin(), routes.end(), r)) != routes.end()) {
+	AxisViewSelection::iterator i;
+	if ((i = find (axes.begin(), axes.end(), r)) != axes.end()) {
 		(*i)->set_selected (false);
-		routes.erase (i);
+		axes.erase (i);
 		if (!_no_route_change_signal) {
 			RoutesChanged ();
 		}
@@ -133,22 +132,22 @@ RouteProcessorSelection::remove (RouteUI* r)
 }
 
 void
-RouteProcessorSelection::set (RouteUI* r)
+RouteProcessorSelection::set (AxisView* r)
 {
 	clear_routes ();
 	add (r);
 }
 
 bool
-RouteProcessorSelection::selected (RouteUI* r)
+RouteProcessorSelection::selected (AxisView* r)
 {
-	return find (routes.begin(), routes.end(), r) != routes.end();
+	return find (axes.begin(), axes.end(), r) != axes.end();
 }
 
 bool
 RouteProcessorSelection::empty ()
 {
-	return processors.empty () && routes.empty ();
+	return processors.empty () && axes.empty ();
 }
 
 void
diff --git a/gtk2_ardour/route_processor_selection.h b/gtk2_ardour/route_processor_selection.h
index 3f8bb1a..6c037d7 100644
--- a/gtk2_ardour/route_processor_selection.h
+++ b/gtk2_ardour/route_processor_selection.h
@@ -30,7 +30,7 @@ class RouteProcessorSelection : public PBD::ScopedConnectionList, public sigc::t
 {
   public:
 	ProcessorSelection processors;
-	RouteUISelection     routes;
+	AxisViewSelection  axes;
 
 	RouteProcessorSelection();
 
@@ -47,17 +47,17 @@ class RouteProcessorSelection : public PBD::ScopedConnectionList, public sigc::t
 	void set (XMLNode* node);
 	void add (XMLNode* node);
 
-	void set (RouteUI*);
-	void add (RouteUI*);
-	void remove (RouteUI*);
+	void set (AxisView*);
+	void add (AxisView*);
+	void remove (AxisView*);
 
 	void clear_processors ();
 	void clear_routes ();
 
-	bool selected (RouteUI*);
+	bool selected (AxisView*);
 
   private:
-	void removed (RouteUI*);
+	void removed (AxisView*);
 	bool _no_route_change_signal;
 
 };
diff --git a/gtk2_ardour/route_sorter.h b/gtk2_ardour/route_sorter.h
index c203afa..e847882 100644
--- a/gtk2_ardour/route_sorter.h
+++ b/gtk2_ardour/route_sorter.h
@@ -24,27 +24,29 @@
 #include <stdint.h>
 #include <vector>
 
-namespace ARDOUR {
-	class Route;
-}
+#include "ardour/stripable.h"
 
-struct RoutePlusOrderKey {
-    boost::shared_ptr<ARDOUR::Route> route; /* we don't really need this, but its handy to keep around */
+struct OrderKeys {
     uint32_t old_display_order;
     uint32_t new_display_order;
 
-    RoutePlusOrderKey (boost::shared_ptr<ARDOUR::Route> r, uint32_t ok, uint32_t nk)
-	    : route (r)
-	    , old_display_order (ok)
-	    , new_display_order (nk) {}
+	OrderKeys (uint32_t ok, uint32_t nk)
+		: old_display_order (ok)
+		, new_display_order (nk) {}
 };
 
-typedef std::vector<RoutePlusOrderKey> OrderKeySortedRoutes;
+typedef std::vector<OrderKeys> OrderingKeys;
 
 struct SortByNewDisplayOrder {
-    bool operator() (const RoutePlusOrderKey& a, const RoutePlusOrderKey& b) {
+    bool operator() (const OrderKeys& a, const OrderKeys& b) {
 	    return a.new_display_order < b.new_display_order;
     }
 };
 
+struct StripablePresentationInfoSorter {
+	bool operator() (boost::shared_ptr<ARDOUR::Stripable> a, boost::shared_ptr<ARDOUR::Stripable> b) {
+		return a->presentation_info().order () < b->presentation_info().order ();
+	}
+};
+
 #endif /* __gtk2_ardour_route_sorter_h__ */
diff --git a/gtk2_ardour/route_time_axis.cc b/gtk2_ardour/route_time_axis.cc
index 4db19bd..9bf84f8 100644
--- a/gtk2_ardour/route_time_axis.cc
+++ b/gtk2_ardour/route_time_axis.cc
@@ -83,7 +83,7 @@
 
 #include "ardour/track.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 using namespace ARDOUR_UI_UTILS;
@@ -95,8 +95,7 @@ using namespace std;
 using std::list;
 
 RouteTimeAxisView::RouteTimeAxisView (PublicEditor& ed, Session* sess, ArdourCanvas::Canvas& canvas)
-	: AxisView(sess)
-	, RouteUI(sess)
+	: RouteUI(sess)
 	, TimeAxisView(sess,ed,(TimeAxisView*) 0, canvas)
 	, _view (0)
 	, parent_canvas (canvas)
@@ -124,6 +123,17 @@ RouteTimeAxisView::RouteTimeAxisView (PublicEditor& ed, Session* sess, ArdourCan
 	number_label.set_fallthrough_to_parent (true);
 
 	sess->config.ParameterChanged.connect (*this, invalidator (*this), boost::bind (&RouteTimeAxisView::parameter_changed, this, _1), gui_context());
+	UIConfiguration::instance().ParameterChanged.connect (sigc::mem_fun (*this, &RouteTimeAxisView::parameter_changed));
+
+	parameter_changed ("editor-stereo-only-meters");
+}
+
+void
+RouteTimeAxisView::route_property_changed (const PBD::PropertyChange& what_changed)
+{
+	if (what_changed.contains (ARDOUR::Properties::name)) {
+		label_view ();
+	}
 }
 
 void
@@ -168,7 +178,7 @@ RouteTimeAxisView::set_route (boost::shared_ptr<Route> rt)
 	playlist_button.set_name ("route button");
 	automation_button.set_name ("route button");
 
- 	route_group_button.signal_button_release_event().connect (sigc::mem_fun(*this, &RouteTimeAxisView::route_group_click), false);
+	route_group_button.signal_button_release_event().connect (sigc::mem_fun(*this, &RouteTimeAxisView::route_group_click), false);
 	playlist_button.signal_clicked.connect (sigc::mem_fun(*this, &RouteTimeAxisView::playlist_click));
 	automation_button.signal_clicked.connect (sigc::mem_fun(*this, &RouteTimeAxisView::automation_click));
 
@@ -188,8 +198,6 @@ RouteTimeAxisView::set_route (boost::shared_ptr<Route> rt)
 			gm.set_fader_name ("AudioTrackFader");
                 }
 
-		rec_enable_button->set_sensitive (_session->writable());
-
 		/* set playlist button tip to the current playlist, and make it update when it changes */
 		update_playlist_tip ();
 		track()->PlaylistChanged.connect (*this, invalidator (*this), ui_bind(&RouteTimeAxisView::update_playlist_tip, this), gui_context());
@@ -291,7 +299,6 @@ RouteTimeAxisView::set_route (boost::shared_ptr<Route> rt)
 	_y_position = -1;
 
 	_route->processors_changed.connect (*this, invalidator (*this), boost::bind (&RouteTimeAxisView::processors_changed, this, _1), gui_context());
-	_route->PropertyChanged.connect (*this, invalidator (*this), boost::bind (&RouteTimeAxisView::route_property_changed, this, _1), gui_context());
 
 	if (is_track()) {
 
@@ -313,8 +320,8 @@ RouteTimeAxisView::set_route (boost::shared_ptr<Route> rt)
 
 	PropertyList* plist = new PropertyList();
 
-	plist->add (ARDOUR::Properties::mute, true);
-	plist->add (ARDOUR::Properties::solo, true);
+	plist->add (ARDOUR::Properties::group_mute, true);
+	plist->add (ARDOUR::Properties::group_solo, true);
 
 	route_group_menu = new RouteGroupMenu (_session, plist);
 
@@ -341,6 +348,15 @@ RouteTimeAxisView::~RouteTimeAxisView ()
 	CatchDeletion (this);
 }
 
+string
+RouteTimeAxisView::name() const
+{
+	if (_route) {
+		return _route->name();
+	}
+	return string();
+}
+
 void
 RouteTimeAxisView::post_construct ()
 {
@@ -429,10 +445,8 @@ RouteTimeAxisView::update_track_number_visibility ()
 		if (tnw & 1) --tnw;
 		number_label.set_size_request(tnw, -1);
 		number_label.show ();
-		name_hbox.set_size_request(TimeAxisView::name_width_px - 2 - tnw, -1); // -2 = cellspacing
 	} else {
 		number_label.hide ();
-		name_hbox.set_size_request(TimeAxisView::name_width_px, -1);
 	}
 }
 
@@ -441,14 +455,12 @@ RouteTimeAxisView::parameter_changed (string const & p)
 {
 	if (p == "track-name-number") {
 		update_track_number_visibility();
-	}
-}
-
-void
-RouteTimeAxisView::route_property_changed (const PropertyChange& what_changed)
-{
-	if (what_changed.contains (ARDOUR::Properties::name)) {
-		label_view ();
+	} else if (p == "editor-stereo-only-meters") {
+		if (UIConfiguration::instance().get_editor_stereo_only_meters()) {
+			gm.get_level_meter().set_max_audio_meter_count (2);
+		} else {
+			gm.get_level_meter().set_max_audio_meter_count (0);
+		}
 	}
 }
 
@@ -463,7 +475,7 @@ RouteTimeAxisView::take_name_changed (void *src)
 void
 RouteTimeAxisView::playlist_click ()
 {
- 	build_playlist_menu ();
+	build_playlist_menu ();
 	conditionally_add_to_selection ();
 	playlist_action_menu->popup (1, gtk_get_current_event_time());
 }
@@ -585,15 +597,8 @@ RouteTimeAxisView::build_display_menu ()
 	}
 	build_size_menu ();
 	items.push_back (MenuElem (_("Height"), *_size_menu));
-
 	items.push_back (SeparatorElem());
 
-	if (!Profile->get_sae()) {
-		items.push_back (MenuElem (_("Remote Control ID..."), sigc::mem_fun (*this, &RouteUI::open_remote_control_id_dialog)));
-		items.back().set_sensitive (_editor.get_selection().tracks.size() <= 1);
-		items.push_back (SeparatorElem());
-	}
-
 	// Hook for derived classes to add type specific stuff
 	append_extra_display_menu_items ();
 
@@ -651,159 +656,152 @@ RouteTimeAxisView::build_display_menu ()
 
 		items.push_back (MenuElem (_("Layers"), *layers_menu));
 
-		if (!Profile->get_sae()) {
-
-			Menu* alignment_menu = manage (new Menu);
-			MenuList& alignment_items = alignment_menu->items();
-			alignment_menu->set_name ("ArdourContextMenu");
+		Menu* alignment_menu = manage (new Menu);
+		MenuList& alignment_items = alignment_menu->items();
+		alignment_menu->set_name ("ArdourContextMenu");
 
-			RadioMenuItem::Group align_group;
+		RadioMenuItem::Group align_group;
 
-			/* Same verbose hacks as for the layering options above */
+		/* Same verbose hacks as for the layering options above */
 
-			int existing = 0;
-			int capture = 0;
-                        int automatic = 0;
-                        int styles = 0;
-                        boost::shared_ptr<Track> first_track;
+		int existing = 0;
+		int capture = 0;
+		int automatic = 0;
+		int styles = 0;
+		boost::shared_ptr<Track> first_track;
 
-			TrackSelection const & s = _editor.get_selection().tracks;
-			for (TrackSelection::const_iterator i = s.begin(); i != s.end(); ++i) {
-				RouteTimeAxisView* r = dynamic_cast<RouteTimeAxisView*> (*i);
-				if (!r || !r->is_track ()) {
-					continue;
-				}
+		for (TrackSelection::const_iterator t = s.begin(); t != s.end(); ++t) {
+			RouteTimeAxisView* r = dynamic_cast<RouteTimeAxisView*> (*t);
+			if (!r || !r->is_track ()) {
+				continue;
+			}
 
-                                if (!first_track) {
-                                        first_track = r->track();
-                                }
-
-                                switch (r->track()->alignment_choice()) {
-                                case Automatic:
-                                        ++automatic;
-                                        styles |= 0x1;
-                                        switch (r->track()->alignment_style()) {
-                                        case ExistingMaterial:
-                                                ++existing;
-                                                break;
-                                        case CaptureTime:
-                                                ++capture;
-                                                break;
-                                        }
-                                        break;
-                                case UseExistingMaterial:
-                                        ++existing;
-                                        styles |= 0x2;
-                                        break;
-                                case UseCaptureTime:
-                                        ++capture;
-                                        styles |= 0x4;
-                                        break;
-                                }
+			if (!first_track) {
+				first_track = r->track();
 			}
 
-                        bool inconsistent;
-                        switch (styles) {
-                        case 1:
-                        case 2:
-                        case 4:
-                                inconsistent = false;
-                                break;
-                        default:
-                                inconsistent = true;
-                                break;
-                        }
-
-                        RadioMenuItem* i;
-
-                        if (!inconsistent && first_track) {
-
-                                alignment_items.push_back (RadioMenuElem (align_group, _("Automatic (based on I/O connections)")));
-                                i = dynamic_cast<RadioMenuItem*> (&alignment_items.back());
-                                i->set_active (automatic != 0 && existing == 0 && capture == 0);
-                                i->signal_activate().connect (sigc::bind (sigc::mem_fun(*this, &RouteTimeAxisView::set_align_choice), i, Automatic, true));
-
-                                switch (first_track->alignment_choice()) {
-                                case Automatic:
-                                        switch (first_track->alignment_style()) {
-                                        case ExistingMaterial:
-                                                alignment_items.push_back (MenuElem (_("(Currently: Existing Material)")));
-                                                break;
-                                        case CaptureTime:
-                                                alignment_items.push_back (MenuElem (_("(Currently: Capture Time)")));
-                                                break;
-                                        }
-                                        break;
-                                default:
-                                        break;
-                                }
-
-                                alignment_items.push_back (RadioMenuElem (align_group, _("Align with Existing Material")));
-                                i = dynamic_cast<RadioMenuItem*> (&alignment_items.back());
-                                i->set_active (existing != 0 && capture == 0 && automatic == 0);
-                                i->signal_activate().connect (sigc::bind (sigc::mem_fun(*this, &RouteTimeAxisView::set_align_choice), i, UseExistingMaterial, true));
-
-                                alignment_items.push_back (RadioMenuElem (align_group, _("Align with Capture Time")));
-                                i = dynamic_cast<RadioMenuItem*> (&alignment_items.back());
-                                i->set_active (existing == 0 && capture != 0 && automatic == 0);
-                                i->signal_activate().connect (sigc::bind (sigc::mem_fun(*this, &RouteTimeAxisView::set_align_choice), i, UseCaptureTime, true));
-
-                                items.push_back (MenuElem (_("Alignment"), *alignment_menu));
-
-                        } else {
-                                /* show nothing */
-                        }
-
-			Menu* mode_menu = manage (new Menu);
-			MenuList& mode_items = mode_menu->items ();
-			mode_menu->set_name ("ArdourContextMenu");
-
-			RadioMenuItem::Group mode_group;
-
-			int normal = 0;
-			int tape = 0;
-			int non_layered = 0;
-
-			for (TrackSelection::const_iterator i = s.begin(); i != s.end(); ++i) {
-				RouteTimeAxisView* r = dynamic_cast<RouteTimeAxisView*> (*i);
-				if (!r || !r->is_track ()) {
-					continue;
+			switch (r->track()->alignment_choice()) {
+			case Automatic:
+				++automatic;
+				styles |= 0x1;
+				switch (r->track()->alignment_style()) {
+				case ExistingMaterial:
+					++existing;
+					break;
+				case CaptureTime:
+					++capture;
+					break;
 				}
+				break;
+			case UseExistingMaterial:
+				++existing;
+				styles |= 0x2;
+				break;
+			case UseCaptureTime:
+				++capture;
+				styles |= 0x4;
+				break;
+			}
+		}
 
-				switch (r->track()->mode()) {
-				case Normal:
-					++normal;
-					break;
-				case Destructive:
-					++tape;
+		bool inconsistent;
+		switch (styles) {
+		case 1:
+		case 2:
+		case 4:
+			inconsistent = false;
+			break;
+		default:
+			inconsistent = true;
+			break;
+		}
+
+		if (!inconsistent && first_track) {
+
+			alignment_items.push_back (RadioMenuElem (align_group, _("Automatic (based on I/O connections)")));
+			i = dynamic_cast<RadioMenuItem*> (&alignment_items.back());
+			i->set_active (automatic != 0 && existing == 0 && capture == 0);
+			i->signal_activate().connect (sigc::bind (sigc::mem_fun(*this, &RouteTimeAxisView::set_align_choice), i, Automatic, true));
+
+			switch (first_track->alignment_choice()) {
+			case Automatic:
+				switch (first_track->alignment_style()) {
+				case ExistingMaterial:
+					alignment_items.push_back (MenuElem (_("(Currently: Existing Material)")));
 					break;
-				case NonLayered:
-					++non_layered;
+				case CaptureTime:
+					alignment_items.push_back (MenuElem (_("(Currently: Capture Time)")));
 					break;
 				}
+				break;
+			default:
+				break;
 			}
 
-			mode_items.push_back (RadioMenuElem (mode_group, _("Normal Mode")));
-			i = dynamic_cast<RadioMenuItem*> (&mode_items.back ());
-			i->signal_activate().connect (sigc::bind (sigc::mem_fun (*this, &RouteTimeAxisView::set_track_mode), ARDOUR::Normal, true));
-			i->set_active (normal != 0 && tape == 0 && non_layered == 0);
-			i->set_inconsistent (normal != 0 && (tape != 0 || non_layered != 0));
+			alignment_items.push_back (RadioMenuElem (align_group, _("Align With Existing Material")));
+			i = dynamic_cast<RadioMenuItem*> (&alignment_items.back());
+			i->set_active (existing != 0 && capture == 0 && automatic == 0);
+			i->signal_activate().connect (sigc::bind (sigc::mem_fun(*this, &RouteTimeAxisView::set_align_choice), i, UseExistingMaterial, true));
+
+			alignment_items.push_back (RadioMenuElem (align_group, _("Align With Capture Time")));
+			i = dynamic_cast<RadioMenuItem*> (&alignment_items.back());
+			i->set_active (existing == 0 && capture != 0 && automatic == 0);
+			i->signal_activate().connect (sigc::bind (sigc::mem_fun(*this, &RouteTimeAxisView::set_align_choice), i, UseCaptureTime, true));
+
+			items.push_back (MenuElem (_("Alignment"), *alignment_menu));
+
+		} else {
+			/* show nothing */
+		}
+
+		Menu* mode_menu = manage (new Menu);
+		MenuList& mode_items = mode_menu->items ();
+		mode_menu->set_name ("ArdourContextMenu");
+
+		RadioMenuItem::Group mode_group;
 
-			mode_items.push_back (RadioMenuElem (mode_group, _("Tape Mode")));
-			i = dynamic_cast<RadioMenuItem*> (&mode_items.back ());
-			i->signal_activate().connect (sigc::bind (sigc::mem_fun (*this, &RouteTimeAxisView::set_track_mode), ARDOUR::Destructive, true));
-			i->set_active (normal == 0 && tape != 0 && non_layered == 0);
-			i->set_inconsistent (tape != 0 && (normal != 0 || non_layered != 0));
+		int normal = 0;
+		int tape = 0;
+		int non_layered = 0;
 
- 			mode_items.push_back (RadioMenuElem (mode_group, _("Non-Layered Mode")));
-			i = dynamic_cast<RadioMenuItem*> (&mode_items.back ());
-			i->signal_activate().connect (sigc::bind (sigc::mem_fun (*this, &RouteTimeAxisView::set_track_mode), ARDOUR::NonLayered, true));
-			i->set_active (normal == 0 && tape == 0 && non_layered != 0);
-			i->set_inconsistent (non_layered != 0 && (normal != 0 || tape != 0));
+		for (TrackSelection::const_iterator t = s.begin(); t != s.end(); ++t) {
+			RouteTimeAxisView* r = dynamic_cast<RouteTimeAxisView*> (*t);
+			if (!r || !r->is_track ()) {
+				continue;
+			}
 
-			items.push_back (MenuElem (_("Record Mode"), *mode_menu));
+			switch (r->track()->mode()) {
+			case Normal:
+				++normal;
+				break;
+			case Destructive:
+				++tape;
+				break;
+			case NonLayered:
+				++non_layered;
+				break;
+			}
 		}
 
+		mode_items.push_back (RadioMenuElem (mode_group, _("Normal Mode")));
+		i = dynamic_cast<RadioMenuItem*> (&mode_items.back ());
+		i->signal_activate().connect (sigc::bind (sigc::mem_fun (*this, &RouteTimeAxisView::set_track_mode), ARDOUR::Normal, true));
+		i->set_active (normal != 0 && tape == 0 && non_layered == 0);
+		i->set_inconsistent (normal != 0 && (tape != 0 || non_layered != 0));
+
+		mode_items.push_back (RadioMenuElem (mode_group, _("Tape Mode")));
+		i = dynamic_cast<RadioMenuItem*> (&mode_items.back ());
+		i->signal_activate().connect (sigc::bind (sigc::mem_fun (*this, &RouteTimeAxisView::set_track_mode), ARDOUR::Destructive, true));
+		i->set_active (normal == 0 && tape != 0 && non_layered == 0);
+		i->set_inconsistent (tape != 0 && (normal != 0 || non_layered != 0));
+
+		mode_items.push_back (RadioMenuElem (mode_group, _("Non-Layered Mode")));
+		i = dynamic_cast<RadioMenuItem*> (&mode_items.back ());
+		i->signal_activate().connect (sigc::bind (sigc::mem_fun (*this, &RouteTimeAxisView::set_track_mode), ARDOUR::NonLayered, true));
+		i->set_active (normal == 0 && tape == 0 && non_layered != 0);
+		i->set_inconsistent (non_layered != 0 && (normal != 0 || tape != 0));
+
+		items.push_back (MenuElem (_("Record Mode"), *mode_menu));
 
 		items.push_back (SeparatorElem());
 
@@ -1177,7 +1175,7 @@ RouteTimeAxisView::use_copy_playlist (bool prompt, vector<boost::shared_ptr<Play
 
 	name = pl->name();
 
-	if (route_group() && route_group()->is_active() && route_group()->enabled_property (ARDOUR::Properties::select.property_id)) {
+	if (route_group() && route_group()->is_active() && route_group()->enabled_property (ARDOUR::Properties::group_select.property_id)) {
 		name = resolve_new_group_playlist_name(name, playlists_before_op);
 	}
 
@@ -1232,7 +1230,7 @@ RouteTimeAxisView::use_new_playlist (bool prompt, vector<boost::shared_ptr<Playl
 
 	name = pl->name();
 
-	if (route_group() && route_group()->is_active() && route_group()->enabled_property (ARDOUR::Properties::select.property_id)) {
+	if (route_group() && route_group()->is_active() && route_group()->enabled_property (ARDOUR::Properties::group_select.property_id)) {
 		name = resolve_new_group_playlist_name(name,playlists_before_op);
 	}
 
@@ -1412,12 +1410,6 @@ RouteTimeAxisView::route_group () const
 	return _route->route_group();
 }
 
-string
-RouteTimeAxisView::name() const
-{
-	return _route->name();
-}
-
 boost::shared_ptr<Playlist>
 RouteTimeAxisView::playlist () const
 {
@@ -1430,33 +1422,30 @@ RouteTimeAxisView::playlist () const
 	}
 }
 
-void
-RouteTimeAxisView::name_entry_changed ()
+bool
+RouteTimeAxisView::name_entry_changed (string const& str)
 {
-	TimeAxisView::name_entry_changed ();
-
-	string x = name_entry->get_text ();
-
-	if (x == _route->name()) {
-		return;
+	if (str == _route->name()) {
+		return true;
 	}
 
+	string x = str;
+	
 	strip_whitespace_edges (x);
 
-	if (x.length() == 0) {
-		name_entry->set_text (_route->name());
-		return;
+	if (x.empty()) {
+		return false;
 	}
 
 	if (_session->route_name_internal (x)) {
-		ARDOUR_UI::instance()->popup_error (string_compose (_("You cannot create a track with that name as it is reserved for %1"),
-								    PROGRAM_NAME));
-		name_entry->grab_focus ();
+		ARDOUR_UI::instance()->popup_error (string_compose (_("The name \"%1\" is reserved for %2"), x, PROGRAM_NAME));
+		return false;
 	} else if (RouteUI::verify_new_route_name (x)) {
 		_route->set_name (x);
-	} else {
-		name_entry->grab_focus ();
+		return true;
 	}
+
+	return false;
 }
 
 boost::shared_ptr<Region>
@@ -1596,7 +1585,7 @@ RouteTimeAxisView::cut_copy_clear (Selection& selection, CutCopyOp op)
 }
 
 bool
-RouteTimeAxisView::paste (framepos_t pos, const Selection& selection, PasteContext& ctx)
+RouteTimeAxisView::paste (framepos_t pos, const Selection& selection, PasteContext& ctx, const int32_t sub_num)
 {
 	if (!is_track()) {
 		return false;
@@ -1630,7 +1619,7 @@ RouteTimeAxisView::paste (framepos_t pos, const Selection& selection, PasteConte
 		framecnt_t amount = extent.second - extent.first;
 		pl->ripple(pos, amount * ctx.times, boost::shared_ptr<Region>());
 	}
-	pl->paste (*p, pos, ctx.times);
+	pl->paste (*p, pos, ctx.times, sub_num);
 
 	vector<Command*> cmds;
 	pl->rdiff (cmds);
@@ -1690,7 +1679,7 @@ RouteTimeAxisView::build_playlist_menu ()
 	playlist_items.push_back (MenuElem (_("Rename..."), sigc::mem_fun(*this, &RouteTimeAxisView::rename_current_playlist)));
 	playlist_items.push_back (SeparatorElem());
 
-	if (!route_group() || !route_group()->is_active() || !route_group()->enabled_property (ARDOUR::Properties::select.property_id)) {
+	if (!route_group() || !route_group()->is_active() || !route_group()->enabled_property (ARDOUR::Properties::group_select.property_id)) {
 		playlist_items.push_back (MenuElem (_("New..."), sigc::bind(sigc::mem_fun(_editor, &PublicEditor::new_playlists), this)));
 		playlist_items.push_back (MenuElem (_("New Copy..."), sigc::bind(sigc::mem_fun(_editor, &PublicEditor::copy_playlists), this)));
 
@@ -1734,7 +1723,7 @@ RouteTimeAxisView::use_playlist (RadioMenuItem *item, boost::weak_ptr<Playlist>
 
 	RouteGroup* rg = route_group();
 
-	if (rg && rg->is_active() && rg->enabled_property (ARDOUR::Properties::select.property_id)) {
+	if (rg && rg->is_active() && rg->enabled_property (ARDOUR::Properties::group_select.property_id)) {
 		std::string group_string = "." + rg->name() + ".";
 
 		std::string take_name = pl->name();
@@ -1780,7 +1769,7 @@ void
 RouteTimeAxisView::update_playlist_tip ()
 {
 	RouteGroup* rg = route_group ();
-	if (rg && rg->is_active() && rg->enabled_property (ARDOUR::Properties::select.property_id)) {
+	if (rg && rg->is_active() && rg->enabled_property (ARDOUR::Properties::group_select.property_id)) {
 		string group_string = "." + rg->name() + ".";
 
 		string take_name = track()->playlist()->name();
@@ -1825,13 +1814,12 @@ RouteTimeAxisView::map_frozen ()
 	switch (track()->freeze_state()) {
 	case Track::Frozen:
 		playlist_button.set_sensitive (false);
-		rec_enable_button->set_sensitive (false);
 		break;
 	default:
 		playlist_button.set_sensitive (true);
-		rec_enable_button->set_sensitive (true);
 		break;
 	}
+	RouteUI::map_frozen ();
 }
 
 void
@@ -2088,7 +2076,7 @@ RouteTimeAxisView::show_existing_automation (bool apply_to_selection)
 
 		for (list<ProcessorAutomationInfo*>::iterator i = processor_automation.begin(); i != processor_automation.end(); ++i) {
 			for (vector<ProcessorAutomationNode*>::iterator ii = (*i)->lines.begin(); ii != (*i)->lines.end(); ++ii) {
-				if ((*ii)->view != 0 && (*i)->processor->control((*ii)->what)->list()->size() > 0) {
+				if ((*i)->processor->control((*ii)->what)->list()->size() > 0) {
 					(*ii)->menu_item->set_active (true);
 				}
 			}
@@ -2496,7 +2484,11 @@ RouteTimeAxisView::can_edit_name () const
 {
 	/* we do not allow track name changes if it is record enabled
 	 */
-	return !_route->record_enabled();
+	boost::shared_ptr<Track> trk (boost::dynamic_pointer_cast<Track> (_route));
+	if (!trk) {
+		return true;
+	}
+	return !trk->rec_enable_control()->get_value();
 }
 
 void
@@ -2646,7 +2638,7 @@ RouteTimeAxisView::set_underlay_state()
 			continue;
 		}
 
-		XMLProperty* prop = child_node->property ("id");
+		XMLProperty const * prop = child_node->property ("id");
 		if (prop) {
 			PBD::ID id (prop->value());
 
@@ -2688,7 +2680,7 @@ RouteTimeAxisView::add_underlay (StreamView* v, bool /*update_xml*/)
 			}
 
 			XMLNode* node = underlay_xml_node->add_child("Underlay");
-			XMLProperty* prop = node->add_property("id");
+			XMLProperty const * prop = node->add_property("id");
 			prop->set_value(v->trackview().route()->id().to_s());
 		}
 #endif
@@ -2727,7 +2719,7 @@ RouteTimeAxisView::remove_underlay (StreamView* v)
 void
 RouteTimeAxisView::set_button_names ()
 {
-	if (_route && _route->solo_safe()) {
+	if (_route && _route->solo_safe_control()->solo_safe()) {
 		solo_button->set_visual_state (Gtkmm2ext::VisualState (solo_button->visual_state() | Gtkmm2ext::Insensitive));
 	} else {
 		solo_button->set_visual_state (Gtkmm2ext::VisualState (solo_button->visual_state() & ~Gtkmm2ext::Insensitive));
@@ -2928,3 +2920,22 @@ RouteTimeAxisView::remove_child (boost::shared_ptr<TimeAxisView> c)
 		}
 	}
 }
+
+Gdk::Color
+RouteTimeAxisView::color () const
+{
+	return route_color ();
+}
+
+bool
+RouteTimeAxisView::marked_for_display () const
+{
+	return !_route->presentation_info().hidden();
+}
+
+bool
+RouteTimeAxisView::set_marked_for_display (bool yn)
+{
+	return RouteUI::mark_hidden (!yn);
+}
+
diff --git a/gtk2_ardour/route_time_axis.h b/gtk2_ardour/route_time_axis.h
index 57b2bbb..0634890 100644
--- a/gtk2_ardour/route_time_axis.h
+++ b/gtk2_ardour/route_time_axis.h
@@ -75,8 +75,15 @@ class ItemCounts;
 class RouteTimeAxisView : public RouteUI, public TimeAxisView
 {
 public:
- 	RouteTimeAxisView (PublicEditor&, ARDOUR::Session*, ArdourCanvas::Canvas& canvas);
- 	virtual ~RouteTimeAxisView ();
+	RouteTimeAxisView (PublicEditor&, ARDOUR::Session*, ArdourCanvas::Canvas& canvas);
+	virtual ~RouteTimeAxisView ();
+
+	std::string name()  const;
+	Gdk::Color color () const;
+	bool marked_for_display () const;
+	bool set_marked_for_display (bool);
+
+	boost::shared_ptr<ARDOUR::Stripable> stripable() const { return RouteUI::stripable(); }
 
 	void set_route (boost::shared_ptr<ARDOUR::Route>);
 
@@ -84,7 +91,7 @@ public:
 	void set_button_names ();
 
 	void set_samples_per_pixel (double);
- 	void set_height (uint32_t h, TrackHeightMode m = OnlySelf);
+	void set_height (uint32_t h, TrackHeightMode m = OnlySelf);
 	void show_timestretch (framepos_t start, framepos_t end, int layers, int layer);
 	void hide_timestretch ();
 	void selection_click (GdkEventButton*);
@@ -100,7 +107,7 @@ public:
 
 	/* Editing operations */
 	void cut_copy_clear (Selection&, Editing::CutCopyOp);
-	bool paste (ARDOUR::framepos_t, const Selection&, PasteContext& ctx);
+	bool paste (ARDOUR::framepos_t, const Selection&, PasteContext& ctx, const int32_t sub_num);
 	RegionView* combine_regions ();
 	void uncombine_regions ();
 	void uncombine_region (RegionView*);
@@ -131,7 +138,6 @@ public:
 	boost::shared_ptr<AutomationTimeAxisView> automation_child(Evoral::Parameter param);
 	virtual Gtk::CheckMenuItem* automation_child_menu_item (Evoral::Parameter);
 
-	std::string         name() const;
 	StreamView*         view() const { return _view; }
 	ARDOUR::RouteGroup* route_group() const;
 	boost::shared_ptr<ARDOUR::Playlist> playlist() const;
@@ -207,7 +213,7 @@ protected:
 
 	void take_name_changed (void *src);
 	void route_property_changed (const PBD::PropertyChange&);
-	void name_entry_changed ();
+	bool name_entry_changed (std::string const&);
 
 	void blink_rec_display (bool onoff);
 
@@ -333,4 +339,3 @@ private:
 };
 
 #endif /* __ardour_route_time_axis_h__ */
-
diff --git a/gtk2_ardour/route_ui.cc b/gtk2_ardour/route_ui.cc
index 402e37d..3f2f39d 100644
--- a/gtk2_ardour/route_ui.cc
+++ b/gtk2_ardour/route_ui.cc
@@ -27,42 +27,51 @@
 #include <gtkmm2ext/gtk_ui.h>
 #include <gtkmm2ext/utils.h>
 
-#include "ardour/route_group.h"
-#include "ardour/dB.h"
 #include "pbd/memento_command.h"
 #include "pbd/stacktrace.h"
 #include "pbd/controllable.h"
 #include "pbd/enumwriter.h"
 
-#include "ardour_ui.h"
-#include "editor.h"
-#include "route_ui.h"
-#include "ardour_button.h"
-#include "keyboard.h"
-#include "utils.h"
-#include "prompter.h"
-#include "gui_thread.h"
-#include "ardour_dialog.h"
-#include "latency_gui.h"
-#include "mixer_strip.h"
-#include "automation_time_axis.h"
-#include "route_time_axis.h"
-#include "group_tabs.h"
-#include "timers.h"
-#include "ui_config.h"
-
+#include "ardour/dB.h"
+#include "ardour/route_group.h"
+#include "ardour/solo_isolate_control.h"
+#include "ardour/vca.h"
+#include "ardour/vca_manager.h"
 #include "ardour/audio_track.h"
 #include "ardour/audioengine.h"
 #include "ardour/filename_extensions.h"
 #include "ardour/midi_track.h"
+#include "ardour/monitor_control.h"
 #include "ardour/internal_send.h"
 #include "ardour/profile.h"
+#include "ardour/phase_control.h"
 #include "ardour/send.h"
 #include "ardour/route.h"
 #include "ardour/session.h"
 #include "ardour/template_utils.h"
 
-#include "i18n.h"
+#include "ardour_button.h"
+#include "ardour_dialog.h"
+#include "ardour_ui.h"
+#include "automation_time_axis.h"
+#include "editor.h"
+#include "group_tabs.h"
+#include "gui_object.h"
+#include "gui_thread.h"
+#include "keyboard.h"
+#include "latency_gui.h"
+#include "mixer_strip.h"
+#include "plugin_pin_dialog.h"
+#include "prompter.h"
+#include "rgb_macros.h"
+#include "route_time_axis.h"
+#include "route_ui.h"
+#include "timers.h"
+#include "ui_config.h"
+#include "utils.h"
+
+
+#include "pbd/i18n.h"
 using namespace Gtk;
 using namespace Gtkmm2ext;
 using namespace ARDOUR;
@@ -76,7 +85,8 @@ boost::weak_ptr<Route> RouteUI::_showing_sends_to;
 std::string RouteUI::program_port_prefix;
 
 RouteUI::RouteUI (ARDOUR::Session* sess)
-	: AxisView(sess)
+	: monitor_input_button (0)
+	, monitor_disk_button (0)
 	, mute_menu(0)
 	, solo_menu(0)
 	, sends_menu(0)
@@ -93,13 +103,16 @@ RouteUI::RouteUI (ARDOUR::Session* sess)
 		boost::to_lower (lpn);
 		program_port_prefix = lpn + ":"; // e.g. "ardour:"
 	}
-	if (sess) init ();
+
+	if (sess) {
+		init ();
+	}
 }
 
 RouteUI::~RouteUI()
 {
 	if (_route) {
-		gui_object_state().remove_node (route_state_id());
+		ARDOUR_UI::instance()->gui_object_state->remove_node (route_state_id());
 	}
 
 	_route.reset (); /* drop reference to route, so that it can be cleaned up */
@@ -108,10 +121,12 @@ RouteUI::~RouteUI()
 	delete solo_menu;
 	delete mute_menu;
 	delete sends_menu;
-        delete record_menu;
+	delete record_menu;
 	delete comment_window;
 	delete input_selector;
 	delete output_selector;
+	delete monitor_input_button;
+	delete monitor_disk_button;
 	delete _invert_menu;
 
 	send_blink_connection.disconnect ();
@@ -125,20 +140,21 @@ RouteUI::init ()
 	mute_menu = 0;
 	solo_menu = 0;
 	sends_menu = 0;
-        record_menu = 0;
+	record_menu = 0;
 	_invert_menu = 0;
 	pre_fader_mute_check = 0;
 	post_fader_mute_check = 0;
 	listen_mute_check = 0;
 	main_mute_check = 0;
-        solo_safe_check = 0;
-        solo_isolated_check = 0;
-        solo_isolated_led = 0;
-        solo_safe_led = 0;
+	solo_safe_check = 0;
+	solo_isolated_check = 0;
+	solo_isolated_led = 0;
+	solo_safe_led = 0;
 	_solo_release = 0;
 	_mute_release = 0;
 	denormal_menu_item = 0;
-        step_edit_item = 0;
+	step_edit_item = 0;
+	rec_safe_item = 0;
 	multiple_mute_change = false;
 	multiple_solo_change = false;
 	_i_am_the_modifier = 0;
@@ -170,13 +186,13 @@ RouteUI::init ()
 	show_sends_button->set_name ("send alert button");
 	UI::instance()->set_tip (show_sends_button, _("make mixer strips show sends to this bus"), "");
 
-	monitor_input_button = manage (new ArdourButton (ArdourButton::default_elements));
+	monitor_input_button = new ArdourButton (ArdourButton::default_elements);
 	monitor_input_button->set_name ("monitor button");
 	monitor_input_button->set_text (_("In"));
 	UI::instance()->set_tip (monitor_input_button, _("Monitor input"), "");
 	monitor_input_button->set_no_show_all (true);
 
-	monitor_disk_button = manage (new ArdourButton (ArdourButton::default_elements));
+	monitor_disk_button = new ArdourButton (ArdourButton::default_elements);
 	monitor_disk_button->set_name ("monitor button");
 	monitor_disk_button->set_text (_("Disk"));
 	UI::instance()->set_tip (monitor_disk_button, _("Monitor playback"), "");
@@ -240,7 +256,7 @@ RouteUI::set_route (boost::shared_ptr<Route> rp)
 	_route = rp;
 
 	if (set_color_from_route()) {
-		set_color (unique_random_color());
+		set_color (gdk_color_to_rgba (AxisView::unique_random_color ()));
 	}
 
 	if (self_destruct) {
@@ -257,29 +273,32 @@ RouteUI::set_route (boost::shared_ptr<Route> rp)
 	solo_button->set_controllable (_route->solo_control());
 
 	_route->active_changed.connect (route_connections, invalidator (*this), boost::bind (&RouteUI::route_active_changed, this), gui_context());
-	_route->mute_changed.connect (route_connections, invalidator (*this), boost::bind (&RouteUI::update_mute_display, this), gui_context());
 
 	_route->comment_changed.connect (route_connections, invalidator (*this), boost::bind (&RouteUI::comment_changed, this), gui_context());
 
-	_route->solo_changed.connect (route_connections, invalidator (*this), boost::bind (&RouteUI::update_solo_display, this), gui_context());
-	_route->solo_safe_changed.connect (route_connections, invalidator (*this), boost::bind (&RouteUI::update_solo_display, this), gui_context());
-	_route->listen_changed.connect (route_connections, invalidator (*this), boost::bind (&RouteUI::update_solo_display, this), gui_context());
-	_route->solo_isolated_changed.connect (route_connections, invalidator (*this), boost::bind (&RouteUI::update_solo_display, this), gui_context());
+	_route->mute_control()->Changed.connect (route_connections, invalidator (*this), boost::bind (&RouteUI::update_mute_display, this), gui_context());
+	_route->solo_control()->Changed.connect (route_connections, invalidator (*this), boost::bind (&RouteUI::update_solo_display, this), gui_context());
+	_route->solo_safe_control()->Changed.connect (route_connections, invalidator (*this), boost::bind (&RouteUI::update_solo_display, this), gui_context());
+	_route->solo_isolate_control()->Changed.connect (route_connections, invalidator (*this), boost::bind (&RouteUI::update_solo_display, this), gui_context());
+	_route->phase_control()->Changed.connect (route_connections, invalidator (*this), boost::bind (&RouteUI::polarity_changed, this), gui_context());
+
 	if (is_track()) {
+		track()->FreezeChange.connect (*this, invalidator (*this), boost::bind (&RouteUI::map_frozen, this), gui_context());
 		track()->TrackModeChanged.connect (route_connections, invalidator (*this), boost::bind (&RouteUI::track_mode_changed, this), gui_context());
 		track_mode_changed();
 	}
 
-	_route->phase_invert_changed.connect (route_connections, invalidator (*this), boost::bind (&RouteUI::polarity_changed, this), gui_context());
-	_route->PropertyChanged.connect (route_connections, invalidator (*this), boost::bind (&RouteUI::property_changed, this, _1), gui_context());
+
+	_route->PropertyChanged.connect (route_connections, invalidator (*this), boost::bind (&RouteUI::route_property_changed, this, _1), gui_context());
+	_route->presentation_info().PropertyChanged.connect (route_connections, invalidator (*this), boost::bind (&RouteUI::route_gui_changed, this, _1), gui_context ());
 
 	_route->io_changed.connect (route_connections, invalidator (*this), boost::bind (&RouteUI::setup_invert_buttons, this), gui_context ());
-	_route->gui_changed.connect (route_connections, invalidator (*this), boost::bind (&RouteUI::route_gui_changed, this, _1), gui_context ());
 
 	if (_session->writable() && is_track()) {
 		boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track>(_route);
 
-		t->RecordEnableChanged.connect (route_connections, invalidator (*this), boost::bind (&RouteUI::route_rec_enable_changed, this), gui_context());
+		t->rec_enable_control()->Changed.connect (route_connections, invalidator (*this), boost::bind (&RouteUI::route_rec_enable_changed, this), gui_context());
+		t->rec_safe_control()->Changed.connect (route_connections, invalidator (*this), boost::bind (&RouteUI::route_rec_enable_changed, this), gui_context());
 
 		rec_enable_button->show();
 		rec_enable_button->set_controllable (t->rec_enable_control());
@@ -297,7 +316,7 @@ RouteUI::set_route (boost::shared_ptr<Route> rp)
 
 	if (is_track()) {
 		boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track>(_route);
-		t->MonitoringChanged.connect (route_connections, invalidator (*this), boost::bind (&RouteUI::monitoring_changed, this), gui_context());
+		t->monitoring_control()->Changed.connect (route_connections, invalidator (*this), boost::bind (&RouteUI::update_monitoring_display, this), gui_context());
 
 		update_monitoring_display ();
 	}
@@ -328,7 +347,10 @@ RouteUI::set_route (boost::shared_ptr<Route> rp)
 		blink_rec_display(true); // set initial rec-en button state
 	}
 
+	check_rec_enable_sensitivity ();
+	maybe_add_route_print_mgr ();
 	route_color_changed();
+	route_gui_changed (PropertyChange (Properties::selected));
 }
 
 void
@@ -369,7 +391,7 @@ RouteUI::mute_press (GdkEventButton* ev)
 		if (Keyboard::is_button2_event (ev)) {
 			// button2-click is "momentary"
 
-			_mute_release = new SoloMuteRelease (_route->muted ());
+			_mute_release = new SoloMuteRelease (_route->mute_control()->muted ());
 		}
 
 		if (ev->button == 1 || Keyboard::is_button2_event (ev)) {
@@ -401,7 +423,7 @@ RouteUI::mute_press (GdkEventButton* ev)
 				}
 
 				DisplaySuspender ds;
-				_session->set_mute (copy, !_route->muted());
+				_session->set_controls (route_list_to_control_list (copy, &Stripable::mute_control), _route->muted_by_self() ? 0.0 : 1.0, Controllable::UseGroup);
 
 			} else if (Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier)) {
 
@@ -430,7 +452,7 @@ RouteUI::mute_press (GdkEventButton* ev)
 					}
 
 					DisplaySuspender ds;
-					_session->set_mute (rl, !_route->muted(), Session::rt_cleanup, Controllable::InverseGroup);
+					_session->set_controls (route_list_to_control_list (rl, &Stripable::mute_control), _route->muted_by_self() ? 0.0 : 1.0, Controllable::InverseGroup);
 				}
 
 			} else {
@@ -444,8 +466,7 @@ RouteUI::mute_press (GdkEventButton* ev)
 					_mute_release->routes = rl;
 				}
 
-				_session->set_mute (rl, !_route->muted());
-
+				_route->mute_control()->set_value (!_route->muted_by_self(), Controllable::UseGroup);
 			}
 		}
 	}
@@ -458,7 +479,7 @@ RouteUI::mute_release (GdkEventButton* /*ev*/)
 {
 	if (_mute_release){
 		DisplaySuspender ds;
-		_session->set_mute (_mute_release->routes, _mute_release->active, Session::rt_cleanup, Controllable::UseGroup);
+		_session->set_controls (route_list_to_control_list (_mute_release->routes, &Stripable::mute_control), _mute_release->active, Controllable::UseGroup);
 		delete _mute_release;
 		_mute_release = 0;
 	}
@@ -558,11 +579,7 @@ RouteUI::solo_press(GdkEventButton* ev)
 				}
 
 				DisplaySuspender ds;
-				if (Config->get_solo_control_is_listen_control()) {
-					_session->set_listen (_session->get_routes(), !_route->listening_via_monitor(),  Session::rt_cleanup, Controllable::NoGroup);
-				} else {
-					_session->set_solo (_session->get_routes(), !_route->self_soloed(),  Session::rt_cleanup, Controllable::NoGroup);
-				}
+				_session->set_controls (route_list_to_control_list (_session->get_routes(), &Stripable::solo_control), !_route->solo_control()->get_value(), Controllable::UseGroup);
 
 			} else if (Keyboard::modifier_state_contains (ev->state, Keyboard::ModifierMask (Keyboard::PrimaryModifier|Keyboard::SecondaryModifier))) {
 
@@ -586,14 +603,14 @@ RouteUI::solo_press(GdkEventButton* ev)
 					/* ??? we need a just_one_listen() method */
 				} else {
 					DisplaySuspender ds;
-					_session->set_just_one_solo (_route, true);
+					_route->solo_control()->set_value (1.0, Controllable::NoGroup);
 				}
 
 			} else if (Keyboard::modifier_state_equals (ev->state, Keyboard::TertiaryModifier)) {
 
 				// shift-click: toggle solo isolated status
 
-				_route->set_solo_isolated (!_route->solo_isolated(), Controllable::UseGroup);
+				_route->solo_isolate_control()->set_value (_route->solo_isolate_control()->get_value() ? 0.0 : 1.0, Controllable::UseGroup);
 				delete _solo_release;
 				_solo_release = 0;
 
@@ -633,11 +650,7 @@ RouteUI::solo_press(GdkEventButton* ev)
 
 					DisplaySuspender ds;
 
-					if (Config->get_solo_control_is_listen_control()) {
-						_session->set_listen (rl, !_route->listening_via_monitor(),  Session::rt_cleanup, Controllable::InverseGroup);
-					} else {
-						_session->set_solo (rl, !_route->self_soloed(),  Session::rt_cleanup, Controllable::InverseGroup);
-					}
+					_session->set_controls (route_list_to_control_list (rl, &Stripable::solo_control), !_route->self_soloed(), Controllable::InverseGroup);
 				}
 
 				delete _solo_release;
@@ -655,11 +668,7 @@ RouteUI::solo_press(GdkEventButton* ev)
 				}
 
 				DisplaySuspender ds;
-				if (Config->get_solo_control_is_listen_control()) {
-					_session->set_listen (rl, !_route->listening_via_monitor());
-				} else {
-					_session->set_solo (rl, !_route->self_soloed());
-				}
+				_session->set_controls (route_list_to_control_list (rl, &Stripable::solo_control), !_route->self_soloed(), Controllable::UseGroup);
 			}
 		}
 	}
@@ -676,11 +685,7 @@ RouteUI::solo_release (GdkEventButton* /*ev*/)
 
 		} else {
 			DisplaySuspender ds;
-			if (Config->get_solo_control_is_listen_control()) {
-				_session->set_listen (_solo_release->routes, _solo_release->active, Session::rt_cleanup, Controllable::UseGroup);
-			} else {
-				_session->set_solo (_solo_release->routes, _solo_release->active, Session::rt_cleanup, Controllable::UseGroup);
-			}
+			_session->set_controls (route_list_to_control_list (_solo_release->routes, &Stripable::solo_control), _solo_release->active ? 1.0 : 0.0, Controllable::UseGroup);
 		}
 
 		delete _solo_release;
@@ -727,7 +732,7 @@ RouteUI::rec_enable_press(GdkEventButton* ev)
 		} else if (Keyboard::modifier_state_equals (ev->state, Keyboard::ModifierMask (Keyboard::PrimaryModifier|Keyboard::TertiaryModifier))) {
 
 			DisplaySuspender ds;
-			_session->set_record_enabled (_session->get_routes(), !_route->record_enabled());
+			_session->set_controls (route_list_to_control_list (_session->get_routes(), &Stripable::rec_enable_control), !track()->rec_enable_control()->get_value(), Controllable::NoGroup);
 
 		} else if (Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier)) {
 
@@ -743,7 +748,7 @@ RouteUI::rec_enable_press(GdkEventButton* ev)
 				rl->push_back (_route);
 
 				DisplaySuspender ds;
-				_session->set_record_enabled (rl, !_route->record_enabled(), Session::rt_cleanup, Controllable::InverseGroup);
+				_session->set_controls (route_list_to_control_list (rl, &Stripable::rec_enable_control), !track()->rec_enable_control()->get_value(), Controllable::InverseGroup);
 			}
 
 		} else if (Keyboard::is_context_menu_event (ev)) {
@@ -752,10 +757,8 @@ RouteUI::rec_enable_press(GdkEventButton* ev)
 
 		} else {
 
-			boost::shared_ptr<RouteList> rl (new RouteList);
-			rl->push_back (route());
-			DisplaySuspender ds;
-			_session->set_record_enabled (rl, !_route->record_enabled());
+			boost::shared_ptr<Track> trk = track();
+			trk->rec_enable_control()->set_value (!trk->rec_enable_control()->get_value(), Controllable::UseGroup);
 		}
 	}
 
@@ -763,12 +766,6 @@ RouteUI::rec_enable_press(GdkEventButton* ev)
 }
 
 void
-RouteUI::monitoring_changed ()
-{
-	update_monitoring_display ();
-}
-
-void
 RouteUI::update_monitoring_display ()
 {
 	if (!_route) {
@@ -783,7 +780,7 @@ RouteUI::update_monitoring_display ()
 
 	MonitorState ms = t->monitoring_state();
 
-	if (t->monitoring_choice() & MonitorInput) {
+	if (t->monitoring_control()->monitoring_choice() & MonitorInput) {
 		monitor_input_button->set_active_state (Gtkmm2ext::ExplicitActive);
 	} else {
 		if (ms & MonitoringInput) {
@@ -793,7 +790,7 @@ RouteUI::update_monitoring_display ()
 		}
 	}
 
-	if (t->monitoring_choice() & MonitorDisk) {
+	if (t->monitoring_control()->monitoring_choice() & MonitorDisk) {
 		monitor_disk_button->set_active_state (Gtkmm2ext::ExplicitActive);
 	} else {
 		if (ms & MonitoringDisk) {
@@ -849,8 +846,8 @@ RouteUI::monitor_release (GdkEventButton* ev, MonitorChoice monitor_choice)
 	   signal together, which requires yet more buffers.
 	*/
 
-	if (t->monitoring_choice() & monitor_choice) {
-		mc = MonitorChoice (t->monitoring_choice() & ~monitor_choice);
+	if (t->monitoring_control()->monitoring_choice() & monitor_choice) {
+		mc = MonitorChoice (t->monitoring_control()->monitoring_choice() & ~monitor_choice);
 	} else {
 		/* this line will change when the options are non-orthogonal */
 		// mc = MonitorChoice (t->monitoring_choice() | monitor_choice);
@@ -873,7 +870,7 @@ RouteUI::monitor_release (GdkEventButton* ev, MonitorChoice monitor_choice)
 	}
 
 	DisplaySuspender ds;
-	_session->set_monitoring (rl, mc, Session::rt_cleanup, Controllable::UseGroup);
+	_session->set_controls (route_list_to_control_list (rl, &Stripable::monitoring_control), (double) mc, Controllable::UseGroup);
 
 	return false;
 }
@@ -881,35 +878,38 @@ RouteUI::monitor_release (GdkEventButton* ev, MonitorChoice monitor_choice)
 void
 RouteUI::build_record_menu ()
 {
-	if (record_menu) {
-		return;
-	}
-
-	/* no rec-button context menu for non-MIDI tracks
-	 */
-
-	if (is_midi_track()) {
+	if (!record_menu) {
 		record_menu = new Menu;
 		record_menu->set_name ("ArdourContextMenu");
-
 		using namespace Menu_Helpers;
 		MenuList& items = record_menu->items();
 
-		items.push_back (CheckMenuElem (_("Step Entry"), sigc::mem_fun (*this, &RouteUI::toggle_step_edit)));
-		step_edit_item = dynamic_cast<Gtk::CheckMenuItem*> (&items.back());
+		items.push_back (CheckMenuElem (_("Rec-Safe"), sigc::mem_fun (*this, &RouteUI::toggle_rec_safe)));
+		rec_safe_item = dynamic_cast<Gtk::CheckMenuItem*> (&items.back());
 
-		if (_route->record_enabled()) {
-			step_edit_item->set_sensitive (false);
+		if (is_midi_track()) {
+			items.push_back (SeparatorElem());
+			items.push_back (CheckMenuElem (_("Step Entry"), sigc::mem_fun (*this, &RouteUI::toggle_step_edit)));
+			step_edit_item = dynamic_cast<Gtk::CheckMenuItem*> (&items.back());
 		}
+	}
 
+	if (step_edit_item) {
+		if (track()->rec_enable_control()->get_value()) {
+			step_edit_item->set_sensitive (false);
+		}
 		step_edit_item->set_active (midi_track()->step_editing());
 	}
+	if (rec_safe_item) {
+		rec_safe_item->set_sensitive (!_route->rec_enable_control()->get_value());
+		rec_safe_item->set_active (_route->rec_safe_control()->get_value());
+	}
 }
 
 void
 RouteUI::toggle_step_edit ()
 {
-	if (!is_midi_track() || _route->record_enabled()) {
+	if (!is_midi_track() || track()->rec_enable_control()->get_value()) {
 		return;
 	}
 
@@ -917,6 +917,26 @@ RouteUI::toggle_step_edit ()
 }
 
 void
+RouteUI::toggle_rec_safe ()
+{
+	boost::shared_ptr<AutomationControl> rs = _route->rec_safe_control();
+
+	if (!rs) {
+		return;
+	}
+
+	/* This check is made inside the control too, but dong it here can't
+	 * hurt.
+	 */
+
+	if (_route->rec_enable_control()->get_value()) {
+		return;
+	}
+
+	rs->set_value (rec_safe_item->get_active (), Controllable::UseGroup);
+}
+
+void
 RouteUI::step_edit_changed (bool yn)
 {
 	if (yn) {
@@ -1107,41 +1127,42 @@ RouteUI::send_blink (bool onoff)
 }
 
 Gtkmm2ext::ActiveState
-RouteUI::solo_active_state (boost::shared_ptr<Route> r)
+RouteUI::solo_active_state (boost::shared_ptr<Stripable> s)
 {
-	if (r->is_master() || r->is_monitor()) {
+	boost::shared_ptr<SoloControl> sc = s->solo_control();
+
+	if (!sc) {
 		return Gtkmm2ext::Off;
 	}
 
-	if (Config->get_solo_control_is_listen_control()) {
-
-		if (r->listening_via_monitor()) {
-			return Gtkmm2ext::ExplicitActive;
-		} else {
-			return Gtkmm2ext::Off;
-		}
-
+	if (!sc->can_solo()) {
+		return Gtkmm2ext::Off;
 	}
 
-	if (r->soloed()) {
-                if (!r->self_soloed()) {
-                        return Gtkmm2ext::ImplicitActive;
-                } else {
-                        return Gtkmm2ext::ExplicitActive;
-                }
+
+	if (sc->self_soloed()) {
+		return Gtkmm2ext::ExplicitActive;
+	} else if (sc->soloed_by_others()) {
+		return Gtkmm2ext::ImplicitActive;
 	} else {
 		return Gtkmm2ext::Off;
 	}
 }
 
 Gtkmm2ext::ActiveState
-RouteUI::solo_isolate_active_state (boost::shared_ptr<Route> r)
+RouteUI::solo_isolate_active_state (boost::shared_ptr<Stripable> s)
 {
-	if (r->is_master() || r->is_monitor()) {
+	boost::shared_ptr<SoloIsolateControl> sc = s->solo_isolate_control();
+
+	if (!sc) {
+		return Gtkmm2ext::Off;
+	}
+
+	if (s->is_master() || s->is_monitor()) {
 		return Gtkmm2ext::Off;
 	}
 
-	if (r->solo_isolated()) {
+	if (sc->solo_isolated()) {
 		return Gtkmm2ext::ExplicitActive;
 	} else {
 		return Gtkmm2ext::Off;
@@ -1149,13 +1170,19 @@ RouteUI::solo_isolate_active_state (boost::shared_ptr<Route> r)
 }
 
 Gtkmm2ext::ActiveState
-RouteUI::solo_safe_active_state (boost::shared_ptr<Route> r)
+RouteUI::solo_safe_active_state (boost::shared_ptr<Stripable> s)
 {
-	if (r->is_master() || r->is_monitor()) {
+	boost::shared_ptr<SoloSafeControl> sc = s->solo_safe_control();
+
+	if (!sc) {
 		return Gtkmm2ext::Off;
 	}
 
-	if (r->solo_safe()) {
+	if (s->is_master() || s->is_monitor()) {
+		return Gtkmm2ext::Off;
+	}
+
+	if (sc->solo_safe()) {
 		return Gtkmm2ext::ExplicitActive;
 	} else {
 		return Gtkmm2ext::Off;
@@ -1165,13 +1192,13 @@ RouteUI::solo_safe_active_state (boost::shared_ptr<Route> r)
 void
 RouteUI::update_solo_display ()
 {
-	bool yn = _route->solo_safe ();
+	bool yn = _route->solo_safe_control()->solo_safe ();
 
 	if (solo_safe_check && solo_safe_check->get_active() != yn) {
 		solo_safe_check->set_active (yn);
 	}
 
-	yn = _route->solo_isolated ();
+	yn = _route->solo_isolate_control()->solo_isolated ();
 
 	if (solo_isolated_check && solo_isolated_check->get_active() != yn) {
 		solo_isolated_check->set_active (yn);
@@ -1180,7 +1207,7 @@ RouteUI::update_solo_display ()
         set_button_names ();
 
         if (solo_isolated_led) {
-		if (_route->solo_isolated()) {
+	        if (_route->solo_isolate_control()->solo_isolated()) {
 			solo_isolated_led->set_active_state (Gtkmm2ext::ExplicitActive);
 		} else {
 			solo_isolated_led->unset_active_state ();
@@ -1188,7 +1215,7 @@ RouteUI::update_solo_display ()
         }
 
         if (solo_safe_led) {
-		if (_route->solo_safe()) {
+	        if (_route->solo_safe_control()->solo_safe()) {
 			solo_safe_led->set_active_state (Gtkmm2ext::ExplicitActive);
 		} else {
 			solo_safe_led->unset_active_state ();
@@ -1200,7 +1227,7 @@ RouteUI::update_solo_display ()
         /* some changes to solo status can affect mute display, so catch up
          */
 
-        update_mute_display ();
+	update_mute_display ();
 }
 
 void
@@ -1210,19 +1237,25 @@ RouteUI::solo_changed_so_update_mute ()
 }
 
 ActiveState
-RouteUI::mute_active_state (Session* s, boost::shared_ptr<Route> r)
+RouteUI::mute_active_state (Session*, boost::shared_ptr<Stripable> s)
 {
-	if (r->is_monitor()) {
-		return ActiveState(0);
+	boost::shared_ptr<MuteControl> mc = s->mute_control();
+
+	if (s->is_monitor()) {
+		return Gtkmm2ext::Off;
 	}
 
+	if (!mc) {
+		return Gtkmm2ext::Off;
+	}
 
 	if (Config->get_show_solo_mutes() && !Config->get_solo_control_is_listen_control ()) {
 
-		if (r->muted ()) {
+		if (mc->muted_by_self ()) {
 			/* full mute */
 			return Gtkmm2ext::ExplicitActive;
-		} else if (r->muted_by_others()) {
+		} else if (mc->muted_by_others_soloing () || mc->muted_by_masters ()) {
+			/* this will reflect both solo mutes AND master mutes */
 			return Gtkmm2ext::ImplicitActive;
 		} else {
 			/* no mute at all */
@@ -1231,9 +1264,12 @@ RouteUI::mute_active_state (Session* s, boost::shared_ptr<Route> r)
 
 	} else {
 
-		if (r->muted()) {
+		if (mc->muted_by_self()) {
 			/* full mute */
 			return Gtkmm2ext::ExplicitActive;
+		} else if (mc->muted_by_masters ()) {
+			/* this shows only master mutes, not mute-by-others-soloing */
+			return Gtkmm2ext::ImplicitActive;
 		} else {
 			/* no mute at all */
 			return Gtkmm2ext::Off;
@@ -1253,18 +1289,17 @@ RouteUI::update_mute_display ()
         mute_button->set_active_state (mute_active_state (_session, _route));
 }
 
+
 void
 RouteUI::route_rec_enable_changed ()
 {
-	blink_rec_display(true);  //this lets the button change "immediately" rather than wait for the next blink
-	update_monitoring_display ();
+	blink_rec_display (true);  //this lets the button change "immediately" rather than wait for the next blink
 }
 
 void
 RouteUI::session_rec_enable_changed ()
 {
-	blink_rec_display(true);  //this lets the button change "immediately" rather than wait for the next blink
-	update_monitoring_display ();
+	blink_rec_display (true);  //this lets the button change "immediately" rather than wait for the next blink
 }
 
 void
@@ -1273,11 +1308,16 @@ RouteUI::blink_rec_display (bool blinkOn)
 	if (!rec_enable_button || !_route) {
 		return;
 	}
+
 	if (boost::dynamic_pointer_cast<Send>(_current_delivery)) {
 		return;
 	}
 
-	if (_route->record_enabled()) {
+	if (!is_track()) {
+		return;
+	}
+
+	if (track()->rec_enable_control()->get_value()) {
                 switch (_session->record_status ()) {
                 case Session::Recording:
                         rec_enable_button->set_active_state (Gtkmm2ext::ExplicitActive);
@@ -1285,12 +1325,12 @@ RouteUI::blink_rec_display (bool blinkOn)
 
                 case Session::Disabled:
                 case Session::Enabled:
-                        if ( UIConfiguration::instance().get_blink_rec_arm() )
-							rec_enable_button->set_active_state ( blinkOn ? Gtkmm2ext::ExplicitActive : Gtkmm2ext::Off );
-						else
-							rec_enable_button->set_active_state ( ImplicitActive );
+	                if (UIConfiguration::instance().get_blink_rec_arm()) {
+	                        rec_enable_button->set_active_state ( blinkOn ? Gtkmm2ext::ExplicitActive : Gtkmm2ext::Off );
+	                } else {
+	                        rec_enable_button->set_active_state ( ImplicitActive );
+	                }
                         break;
-
                 }
 
                 if (step_edit_item) {
@@ -1305,7 +1345,6 @@ RouteUI::blink_rec_display (bool blinkOn)
                 }
 	}
 
-
 	check_rec_enable_sensitivity ();
 }
 
@@ -1320,14 +1359,14 @@ RouteUI::build_solo_menu (void)
 	Gtk::CheckMenuItem* check;
 
 	check = new Gtk::CheckMenuItem(_("Solo Isolate"));
-	check->set_active (_route->solo_isolated());
+	check->set_active (_route->solo_isolate_control()->solo_isolated());
 	check->signal_toggled().connect (sigc::bind (sigc::mem_fun (*this, &RouteUI::toggle_solo_isolated), check));
 	items.push_back (CheckMenuElem(*check));
         solo_isolated_check = dynamic_cast<Gtk::CheckMenuItem*>(&items.back());
 	check->show_all();
 
 	check = new Gtk::CheckMenuItem(_("Solo Safe"));
-	check->set_active (_route->solo_safe());
+	check->set_active (_route->solo_safe_control()->solo_safe());
 	check->signal_toggled().connect (sigc::bind (sigc::mem_fun (*this, &RouteUI::toggle_solo_safe), check));
 	items.push_back (CheckMenuElem(*check));
         solo_safe_check = dynamic_cast<Gtk::CheckMenuItem*>(&items.back());
@@ -1381,16 +1420,16 @@ RouteUI::build_mute_menu(void)
 void
 RouteUI::init_mute_menu(MuteMaster::MutePoint mp, Gtk::CheckMenuItem* check)
 {
-	check->set_active (_route->mute_points() & mp);
+	check->set_active (_route->mute_control()->mute_points() & mp);
 }
 
 void
 RouteUI::toggle_mute_menu(MuteMaster::MutePoint mp, Gtk::CheckMenuItem* check)
 {
 	if (check->get_active()) {
-		_route->set_mute_points (MuteMaster::MutePoint (_route->mute_points() | mp));
+		_route->mute_control()->set_mute_points (MuteMaster::MutePoint (_route->mute_control()->mute_points() | mp));
 	} else {
-		_route->set_mute_points (MuteMaster::MutePoint (_route->mute_points() & ~mp));
+		_route->mute_control()->set_mute_points (MuteMaster::MutePoint (_route->mute_control()->mute_points() & ~mp));
 	}
 }
 
@@ -1400,7 +1439,7 @@ RouteUI::muting_change ()
 	ENSURE_GUI_THREAD (*this, &RouteUI::muting_change)
 
 	bool yn;
-	MuteMaster::MutePoint current = _route->mute_points ();
+	MuteMaster::MutePoint current = _route->mute_control()->mute_points ();
 
 	yn = (current & MuteMaster::PreFader);
 
@@ -1435,7 +1474,7 @@ RouteUI::solo_isolate_button_release (GdkEventButton* ev)
 	}
 
 	bool view = solo_isolated_led->active_state();
-	bool model = _route->solo_isolated();
+	bool model = _route->solo_isolate_control()->solo_isolated();
 
 	/* called BEFORE the view has changed */
 
@@ -1445,11 +1484,11 @@ RouteUI::solo_isolate_button_release (GdkEventButton* ev)
 			if (model) {
 				/* disable isolate for all routes */
 				DisplaySuspender ds;
-				_session->set_solo_isolated (_session->get_routes(), false, Session::rt_cleanup, Controllable::NoGroup);
+				_session->set_controls (route_list_to_control_list (_session->get_routes(), &Stripable::solo_isolate_control), 0.0, Controllable::NoGroup);
 			} else {
 				/* enable isolate for all routes */
 				DisplaySuspender ds;
-				_session->set_solo_isolated (_session->get_routes(), true, Session::rt_cleanup, Controllable::NoGroup);
+				_session->set_controls (route_list_to_control_list (_session->get_routes(), &Stripable::solo_isolate_control), 1.0, Controllable::NoGroup);
 			}
 
 		} else {
@@ -1461,7 +1500,7 @@ RouteUI::solo_isolate_button_release (GdkEventButton* ev)
 				boost::shared_ptr<RouteList> rl (new RouteList);
 				rl->push_back (_route);
 				DisplaySuspender ds;
-				_session->set_solo_isolated (rl, !view, Session::rt_cleanup, Controllable::NoGroup);
+				_session->set_controls (route_list_to_control_list (rl, &Stripable::solo_isolate_control), view ? 0.0 : 1.0, Controllable::NoGroup);
 			}
 		}
 	}
@@ -1477,7 +1516,7 @@ RouteUI::solo_safe_button_release (GdkEventButton* ev)
 	}
 
 	bool view = solo_safe_led->active_state();
-	bool model = _route->solo_safe();
+	bool model = _route->solo_safe_control()->solo_safe();
 
 	if (ev->button == 1) {
 		if (Keyboard::modifier_state_equals (ev->state, Keyboard::ModifierMask (Keyboard::PrimaryModifier|Keyboard::TertiaryModifier))) {
@@ -1486,20 +1525,20 @@ RouteUI::solo_safe_button_release (GdkEventButton* ev)
 				/* disable solo safe for all routes */
 				DisplaySuspender ds;
 				for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
-					(*i)->set_solo_safe (false, Controllable::NoGroup);
+					(*i)->solo_safe_control()->set_value (0.0, Controllable::NoGroup);
 				}
 			} else {
 				/* enable solo safe for all routes */
 				DisplaySuspender ds;
 				for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
-					(*i)->set_solo_safe (true, Controllable::NoGroup);
+					(*i)->solo_safe_control()->set_value (1.0, Controllable::NoGroup);
 				}
 			}
 		}
 		else {
 			if (model == view) {
 				/* flip just this route */
-				_route->set_solo_safe (!view, Controllable::NoGroup);
+				_route->solo_safe_control()->set_value (view ? 0.0 : 1.0, Controllable::NoGroup);
 			}
 		}
 	}
@@ -1511,19 +1550,19 @@ void
 RouteUI::toggle_solo_isolated (Gtk::CheckMenuItem* check)
 {
         bool view = check->get_active();
-        bool model = _route->solo_isolated();
+        bool model = _route->solo_isolate_control()->solo_isolated();
 
         /* called AFTER the view has changed */
 
         if (model != view) {
-	        _route->set_solo_isolated (view, Controllable::UseGroup);
+	        _route->solo_isolate_control()->set_value (view ? 1.0 : 0.0, Controllable::UseGroup);
         }
 }
 
 void
 RouteUI::toggle_solo_safe (Gtk::CheckMenuItem* check)
 {
-	_route->set_solo_safe (check->get_active(), Controllable::UseGroup);
+	_route->solo_safe_control()->set_value (check->get_active() ? 1.0 : 0.0, Controllable::UseGroup);
 }
 
 /** Ask the user to choose a colour, and then apply that color to my route
@@ -1532,10 +1571,11 @@ void
 RouteUI::choose_color ()
 {
 	bool picked;
-	Gdk::Color const color = Gtkmm2ext::UI::instance()->get_color (_("Color Selection"), picked, &_color);
+	Gdk::Color c (gdk_color_from_rgb (_route->presentation_info().color()));
+	Gdk::Color const color = Gtkmm2ext::UI::instance()->get_color (_("Color Selection"), picked, &c);
 
 	if (picked) {
-		set_color(color);
+		set_color (gdk_color_to_rgba (color));
 	}
 }
 
@@ -1543,22 +1583,9 @@ RouteUI::choose_color ()
  *  the route is in a group which shares its color with its routes.
  */
 void
-RouteUI::set_color (const Gdk::Color & c)
+RouteUI::set_color (uint32_t c)
 {
-	/* leave _color alone in the group case so that tracks can retain their
-	 * own pre-group colors.
-	 */
-
-	char buf[64];
-	_color = c;
-	snprintf (buf, sizeof (buf), "%d:%d:%d", c.get_red(), c.get_green(), c.get_blue());
-
-	/* note: we use the route state ID here so that color is the same for both
-	   the time axis view and the mixer strip
-	*/
-
-	gui_object_state().set_property<string> (route_state_id(), X_("color"), buf);
-	_route->gui_changed ("color", (void *) 0); /* EMIT_SIGNAL */
+	_route->presentation_info().set_color (c);
 }
 
 /** @return GUI state ID for things that are common to the route in all its representations */
@@ -1571,21 +1598,11 @@ RouteUI::route_state_id () const
 int
 RouteUI::set_color_from_route ()
 {
-	const string str = gui_object_state().get_string (route_state_id(), X_("color"));
-
-	if (str.empty()) {
-		return 1;
+	if (_route->presentation_info().color_set()) {
+		return 0; /* nothing to do */
 	}
 
-	int r, g, b;
-
-	sscanf (str.c_str(), "%d:%d:%d", &r, &g, &b);
-
-	_color.set_red (r);
-	_color.set_green (g);
-	_color.set_blue (b);
-
-	return 0;
+	return 1; /* pick a color */
 }
 
 /** @return true if this name should be used for the route, otherwise false */
@@ -1654,14 +1671,6 @@ RouteUI::route_rename ()
 }
 
 void
-RouteUI::property_changed (const PropertyChange& what_changed)
-{
-	if (what_changed.contains (ARDOUR::Properties::name)) {
-		name_label.set_text (_route->name());
-	}
-}
-
-void
 RouteUI::toggle_comment_editor ()
 {
 //	if (ignore_toggle) {
@@ -1825,12 +1834,6 @@ RouteUI::has_audio_outputs () const
 	return (_route->n_outputs().n_audio() > 0);
 }
 
-string
-RouteUI::name() const
-{
-	return _route->name();
-}
-
 void
 RouteUI::map_frozen ()
 {
@@ -1839,14 +1842,7 @@ RouteUI::map_frozen ()
 	AudioTrack* at = dynamic_cast<AudioTrack*>(_route.get());
 
 	if (at) {
-		switch (at->freeze_state()) {
-		case AudioTrack::Frozen:
-			rec_enable_button->set_sensitive (false);
-			break;
-		default:
-			rec_enable_button->set_sensitive (true);
-			break;
-		}
+		check_rec_enable_sensitivity ();
 	}
 }
 
@@ -1919,12 +1915,27 @@ RouteUI::save_as_template ()
 void
 RouteUI::check_rec_enable_sensitivity ()
 {
+	if (!rec_enable_button) {
+		assert (0); // This should not happen
+		return;
+	}
+	if (!_session->writable()) {
+		rec_enable_button->set_sensitive (false);
+		return;
+	}
+
 	if (_session->transport_rolling() && rec_enable_button->active_state() && Config->get_disable_disarm_during_roll()) {
 		rec_enable_button->set_sensitive (false);
+	} else if (is_audio_track ()  && track()->freeze_state() == AudioTrack::Frozen) {
+		rec_enable_button->set_sensitive (false);
 	} else {
 		rec_enable_button->set_sensitive (true);
 	}
-
+	if (_route && _route->rec_safe_control () && _route->rec_safe_control()->get_value()) {
+		rec_enable_button->set_visual_state (Gtkmm2ext::VisualState (solo_button->visual_state() | Gtkmm2ext::Insensitive));
+	} else {
+		rec_enable_button->set_visual_state (Gtkmm2ext::VisualState (solo_button->visual_state() & ~Gtkmm2ext::Insensitive));
+	}
 	update_monitoring_display ();
 }
 
@@ -1953,80 +1964,25 @@ RouteUI::parameter_changed (string const & p)
 void
 RouteUI::step_gain_up ()
 {
-	_route->set_gain (dB_to_coefficient (accurate_coefficient_to_dB (_route->gain_control()->get_value()) + 0.1), Controllable::UseGroup);
+	_route->gain_control()->set_value (dB_to_coefficient (accurate_coefficient_to_dB (_route->gain_control()->get_value()) + 0.1), Controllable::UseGroup);
 }
 
 void
 RouteUI::page_gain_up ()
 {
-	_route->set_gain (dB_to_coefficient (accurate_coefficient_to_dB (_route->gain_control()->get_value()) + 0.5), Controllable::UseGroup);
+	_route->gain_control()->set_value (dB_to_coefficient (accurate_coefficient_to_dB (_route->gain_control()->get_value()) + 0.5), Controllable::UseGroup);
 }
 
 void
 RouteUI::step_gain_down ()
 {
-	_route->set_gain (dB_to_coefficient (accurate_coefficient_to_dB (_route->gain_control()->get_value()) - 0.1), Controllable::UseGroup);
+	_route->gain_control()->set_value (dB_to_coefficient (accurate_coefficient_to_dB (_route->gain_control()->get_value()) - 0.1), Controllable::UseGroup);
 }
 
 void
 RouteUI::page_gain_down ()
 {
-	_route->set_gain (dB_to_coefficient (accurate_coefficient_to_dB (_route->gain_control()->get_value()) - 0.5), Controllable::UseGroup);
-}
-
-void
-RouteUI::open_remote_control_id_dialog ()
-{
-	ArdourDialog dialog (_("Remote Control ID"));
-	SpinButton* spin = 0;
-
-	dialog.get_vbox()->set_border_width (18);
-
-	if (Config->get_remote_model() == UserOrdered) {
-		uint32_t const limit = _session->ntracks() + _session->nbusses () + 4;
-
-		HBox* hbox = manage (new HBox);
-		hbox->set_spacing (6);
-		hbox->pack_start (*manage (new Label (_("Remote control ID:"))));
-		spin = manage (new SpinButton);
-		spin->set_digits (0);
-		spin->set_increments (1, 10);
-		spin->set_range (0, limit);
-		spin->set_value (_route->remote_control_id());
-		hbox->pack_start (*spin);
-		dialog.get_vbox()->pack_start (*hbox);
-
-		dialog.add_button (Stock::CANCEL, RESPONSE_CANCEL);
-		dialog.add_button (Stock::APPLY, RESPONSE_ACCEPT);
-	} else {
-		Label* l = manage (new Label());
-		if (_route->is_master() || _route->is_monitor()) {
-			l->set_markup (string_compose (_("The remote control ID of %1 is: %2\n\n\n"
-							 "The remote control ID of %3 cannot be changed."),
-						       Gtkmm2ext::markup_escape_text (_route->name()),
-						       _route->remote_control_id(),
-						       (_route->is_master() ? _("the master bus") : _("the monitor bus"))));
-		} else {
-			l->set_markup (string_compose (_("The remote control ID of %5 is: %2\n\n\n"
-							 "Remote Control IDs are currently determined by track/bus ordering in %6.\n\n"
-							 "%3Use the User Interaction tab of the Preferences window if you want to change this%4"),
-						       (is_track() ? _("track") : _("bus")),
-						       _route->remote_control_id(),
-						       "<span size=\"small\" style=\"italic\">",
-						       "</span>",
-						       Gtkmm2ext::markup_escape_text (_route->name()),
-						       PROGRAM_NAME));
-		}
-		dialog.get_vbox()->pack_start (*l);
-		dialog.add_button (Stock::OK, RESPONSE_CANCEL);
-	}
-
-	dialog.show_all ();
-	int const r = dialog.run ();
-
-	if (r == RESPONSE_ACCEPT && spin) {
-		_route->set_remote_control_id (spin->get_value_as_int ());
-	}
+	_route->gain_control()->set_value (dB_to_coefficient (accurate_coefficient_to_dB (_route->gain_control()->get_value()) - 0.5), Controllable::UseGroup);
 }
 
 void
@@ -2064,9 +2020,9 @@ RouteUI::setup_invert_buttons ()
 		}
 
 		if (N <= _max_invert_buttons) {
-			UI::instance()->set_tip (*b, string_compose (_("Left-click to invert (phase reverse) channel %1 of this track.  Right-click to show menu."), i + 1));
+			UI::instance()->set_tip (*b, string_compose (_("Left-click to invert polarity of channel %1 of this track. Right-click to show menu."), i + 1));
 		} else {
-			UI::instance()->set_tip (*b, _("Click to show a menu of channels for inversion (phase reverse)"));
+			UI::instance()->set_tip (*b, _("Click to show a menu of channels to invert polarity"));
 		}
 
 		_invert_buttons.push_back (b);
@@ -2089,9 +2045,9 @@ RouteUI::set_invert_button_state ()
 
 		ArdourButton* b = _invert_buttons.front ();
 
-		if (_route->phase_invert().count() == _route->phase_invert().size()) {
+		if (_route->phase_control()->count() == _route->phase_control()->size()) {
 			b->set_active_state (Gtkmm2ext::ExplicitActive);
-		} else if (_route->phase_invert().any()) {
+		} else if (_route->phase_control()->any()) {
 			b->set_active_state (Gtkmm2ext::ImplicitActive);
 		} else {
 			b->set_active_state (Gtkmm2ext::Off);
@@ -2103,7 +2059,7 @@ RouteUI::set_invert_button_state ()
 
 		int j = 0;
 		for (vector<ArdourButton*>::iterator i = _invert_buttons.begin(); i != _invert_buttons.end(); ++i, ++j) {
-			(*i)->set_active (_route->phase_invert (j));
+			(*i)->set_active (_route->phase_control()->inverted (j));
 		}
 
 	}
@@ -2116,7 +2072,7 @@ RouteUI::invert_release (GdkEventButton* ev, uint32_t i)
 		uint32_t const N = _route->input()->n_ports().n_audio ();
 		if (N <= _max_invert_buttons) {
 			/* left-click inverts phase so long as we have a button per channel */
-			_route->set_phase_invert (i, !_invert_buttons[i]->get_active());
+			_route->phase_control()->set_phase_invert (i, !_invert_buttons[i]->get_active());
 			return false;
 		}
 	}
@@ -2147,7 +2103,7 @@ RouteUI::invert_press (GdkEventButton* ev)
 		items.push_back (CheckMenuElem (string_compose (X_("Ø%1"), i + 1), sigc::bind (sigc::mem_fun (*this, &RouteUI::invert_menu_toggled), i)));
 		Gtk::CheckMenuItem* e = dynamic_cast<Gtk::CheckMenuItem*> (&items.back ());
 		++_i_am_the_modifier;
-		e->set_active (_route->phase_invert (i));
+		e->set_active (_route->phase_control()->inverted (i));
 		--_i_am_the_modifier;
 	}
 
@@ -2163,7 +2119,8 @@ RouteUI::invert_menu_toggled (uint32_t c)
 		return;
 	}
 
-	_route->set_phase_invert (c, !_route->phase_invert (c));
+
+	_route->phase_control()->set_phase_invert (c, !_route->phase_control()->inverted (c));
 }
 
 void
@@ -2184,9 +2141,9 @@ RouteUI::request_redraw ()
 
 /** The Route's gui_changed signal has been emitted */
 void
-RouteUI::route_gui_changed (string what_changed)
+RouteUI::route_gui_changed (PropertyChange const& what_changed)
 {
-	if (what_changed == "color") {
+	if (what_changed.contains (Properties::color)) {
 		if (set_color_from_route () == 0) {
 			route_color_changed ();
 		}
@@ -2212,18 +2169,55 @@ RouteUI::track_mode_changed (void)
 /** @return the color that this route should use; it maybe its own,
     or it maybe that of its route group.
 */
+
 Gdk::Color
-RouteUI::color () const
+RouteUI::route_color () const
 {
+	Gdk::Color c;
 	RouteGroup* g = _route->route_group ();
+	string p;
 
 	if (g && g->is_color()) {
-		Gdk::Color c;
 		set_color_from_rgba (c, GroupTabs::group_color (g));
-		return c;
+	} else {
+
+		/* deal with older 4.x color, which was stored in the GUI object state */
+
+		string p = ARDOUR_UI::instance()->gui_object_state->get_string (route_state_id(), X_("color"));
+
+		if (!p.empty()) {
+
+			/* old v4.x or earlier session. Use this information */
+
+			int red, green, blue;
+			char colon;
+
+			stringstream ss (p);
+
+			/* old color format version was:
+
+			   16bit value for red:16 bit value for green:16 bit value for blue
+
+			   decode to rgb ..
+			*/
+
+			ss >> red;
+			ss >> colon;
+			ss >> green;
+			ss >> colon;
+			ss >> blue;
+
+			red >>= 2;
+			green >>= 2;
+			blue >>= 2;
+
+			_route->presentation_info().set_color (RGBA_TO_UINT (red, green, blue, 255));
+		}
+
+		set_color_from_rgba (c, _route->presentation_info().color());
 	}
 
-	return _color;
+	return c;
 }
 
 void
@@ -2250,3 +2244,108 @@ RouteUI::route_group() const
 {
 	return _route->route_group();
 }
+
+
+RoutePinWindowProxy::RoutePinWindowProxy(std::string const &name, boost::shared_ptr<ARDOUR::Route> route)
+	: WM::ProxyBase (name, string())
+	, _route (boost::weak_ptr<Route> (route))
+{
+	route->DropReferences.connect (going_away_connection, MISSING_INVALIDATOR, boost::bind (&RoutePinWindowProxy::route_going_away, this), gui_context());
+}
+
+RoutePinWindowProxy::~RoutePinWindowProxy()
+{
+	_window = 0;
+}
+
+ARDOUR::SessionHandlePtr*
+RoutePinWindowProxy::session_handle ()
+{
+	ArdourWindow* aw = dynamic_cast<ArdourWindow*> (_window);
+	if (aw) { return aw; }
+	return 0;
+}
+
+Gtk::Window*
+RoutePinWindowProxy::get (bool create)
+{
+	boost::shared_ptr<Route> r = _route.lock ();
+	if (!r) {
+		return 0;
+	}
+
+	if (!_window) {
+		if (!create) {
+			return 0;
+		}
+		_window = new PluginPinDialog (r);
+		ArdourWindow* aw = dynamic_cast<ArdourWindow*> (_window);
+		if (aw) {
+			aw->set_session (_session);
+		}
+		_window->show_all ();
+	}
+	return _window;
+}
+
+void
+RoutePinWindowProxy::route_going_away ()
+{
+	delete _window;
+	_window = 0;
+	WM::Manager::instance().remove (this);
+	going_away_connection.disconnect();
+}
+
+void
+RouteUI::maybe_add_route_print_mgr ()
+{
+	if (_route->pinmgr_proxy ()) {
+		return;
+	}
+	RoutePinWindowProxy* wp = new RoutePinWindowProxy (
+			string_compose ("RPM-%1", _route->id()), _route);
+	wp->set_session (_session);
+
+	const XMLNode* ui_xml = _session->extra_xml (X_("UI"));
+	if (ui_xml) {
+		wp->set_state (*ui_xml, 0);
+	}
+
+#if 0
+	void* existing_ui = _route->pinmgr_proxy ();
+	if (existing_ui) {
+		wp->use_window (*(reinterpret_cast<Gtk::Window*>(existing_ui)));
+	}
+#endif
+	_route->set_pingmgr_proxy (wp);
+
+	WM::Manager::instance().register_window (wp);
+}
+
+void
+RouteUI::manage_pins ()
+{
+	RoutePinWindowProxy* proxy = _route->pinmgr_proxy ();
+	if (proxy) {
+		proxy->get (true);
+		proxy->present();
+	}
+}
+
+bool
+RouteUI::mark_hidden (bool yn)
+{
+	if (yn != _route->presentation_info().hidden()) {
+		_route->presentation_info().set_hidden (yn);
+		return true; // things changed
+	}
+	return false;
+}
+
+boost::shared_ptr<Stripable>
+RouteUI::stripable () const
+{
+	return _route;
+}
+
diff --git a/gtk2_ardour/route_ui.h b/gtk2_ardour/route_ui.h
index 461419c..e05db7f 100644
--- a/gtk2_ardour/route_ui.h
+++ b/gtk2_ardour/route_ui.h
@@ -31,14 +31,16 @@
 
 #include "ardour/ardour.h"
 #include "ardour/mute_master.h"
-#include "ardour/session_event.h"
 #include "ardour/session.h"
+#include "ardour/session_event.h"
+#include "ardour/session_handle.h"
 #include "ardour/route.h"
 #include "ardour/route_group.h"
 #include "ardour/track.h"
 
 #include "axis_view.h"
 #include "selectable.h"
+#include "window_manager.h"
 
 namespace ARDOUR {
 	class AudioTrack;
@@ -54,16 +56,32 @@ namespace Gtk {
 class ArdourButton;
 class ArdourWindow;
 class IOSelectorWindow;
+class ControlSlaveUI;
+
+class RoutePinWindowProxy : public WM::ProxyBase
+{
+  public:
+	RoutePinWindowProxy (std::string const &, boost::shared_ptr<ARDOUR::Route>);
+	~RoutePinWindowProxy();
+
+	Gtk::Window* get (bool create = false);
+	ARDOUR::SessionHandlePtr* session_handle();
+
+  private:
+	boost::weak_ptr<ARDOUR::Route> _route;
+
+	void route_going_away ();
+	PBD::ScopedConnection going_away_connection;
+};
 
-class RouteUI : public virtual AxisView
+class RouteUI : public virtual ARDOUR::SessionHandlePtr, public virtual PBD::ScopedConnectionList, public virtual Selectable, public virtual sigc::trackable
 {
   public:
-	RouteUI(ARDOUR::Session*);
-	RouteUI(boost::shared_ptr<ARDOUR::Route>, ARDOUR::Session*);
+	RouteUI (ARDOUR::Session*);
 
 	virtual ~RouteUI();
 
-	Gdk::Color color () const;
+	boost::shared_ptr<ARDOUR::Stripable> stripable() const;
 
 	virtual void set_route (boost::shared_ptr<ARDOUR::Route>);
 	virtual void set_button_names () = 0;
@@ -80,15 +98,14 @@ class RouteUI : public virtual AxisView
 	boost::shared_ptr<ARDOUR::AudioTrack> audio_track() const;
 	boost::shared_ptr<ARDOUR::MidiTrack>  midi_track() const;
 
-	std::string name() const;
-
 	// protected: XXX sigh this should be here
 
 	boost::shared_ptr<ARDOUR::Route> _route;
 
 	void request_redraw ();
 
-	virtual void set_color (const Gdk::Color & c);
+	virtual void set_color (uint32_t c);
+	Gdk::Color route_color () const;
 	void choose_color ();
 
 	bool ignore_toggle;
@@ -109,6 +126,7 @@ class RouteUI : public virtual AxisView
         ArdourButton* solo_safe_led;
         ArdourButton* solo_isolated_led;
 
+
 	Gtk::Label monitor_input_button_label;
 	Gtk::Label monitor_disk_button_label;
 
@@ -137,7 +155,6 @@ class RouteUI : public virtual AxisView
 	bool monitor_input_release(GdkEventButton*);
 	bool monitor_disk_press(GdkEventButton*);
 	bool monitor_disk_release(GdkEventButton*);
-	void monitoring_changed ();
 	void update_monitoring_display ();
 
 	void edit_input_configuration ();
@@ -189,7 +206,10 @@ class RouteUI : public virtual AxisView
 
 	void route_rename();
 
-	virtual void property_changed (const PBD::PropertyChange&);
+	void manage_pins ();
+	void maybe_add_route_print_mgr ();
+
+	virtual void route_property_changed (const PBD::PropertyChange&) = 0;
 	void route_removed ();
 
 	virtual void route_active_changed () {}
@@ -203,6 +223,9 @@ class RouteUI : public virtual AxisView
 	void toggle_step_edit ();
 	virtual void step_edit_changed (bool);
 
+	Gtk::CheckMenuItem *rec_safe_item;
+	void toggle_rec_safe ();
+
 	virtual void polarity_changed ();
 
 	Gtk::CheckMenuItem *denormal_menu_item;
@@ -222,12 +245,11 @@ class RouteUI : public virtual AxisView
 	void adjust_latency ();
 	bool process_save_template_prompter (ArdourPrompter& prompter, const std::string& dir);
 	void save_as_template ();
-	void open_remote_control_id_dialog ();
 
-	static Gtkmm2ext::ActiveState solo_active_state (boost::shared_ptr<ARDOUR::Route>);
-	static Gtkmm2ext::ActiveState solo_isolate_active_state (boost::shared_ptr<ARDOUR::Route>);
-	static Gtkmm2ext::ActiveState solo_safe_active_state (boost::shared_ptr<ARDOUR::Route>);
-	static Gtkmm2ext::ActiveState mute_active_state (ARDOUR::Session*, boost::shared_ptr<ARDOUR::Route>);
+	static Gtkmm2ext::ActiveState solo_active_state (boost::shared_ptr<ARDOUR::Stripable>);
+	static Gtkmm2ext::ActiveState solo_isolate_active_state (boost::shared_ptr<ARDOUR::Stripable>);
+	static Gtkmm2ext::ActiveState solo_safe_active_state (boost::shared_ptr<ARDOUR::Stripable>);
+	static Gtkmm2ext::ActiveState mute_active_state (ARDOUR::Session*, boost::shared_ptr<ARDOUR::Stripable>);
 
 	/** Emitted when a bus has been set or unset from `display sends to this bus' mode
 	 *  by a click on the `Sends' button.  The parameter is the route that the sends are
@@ -255,8 +277,8 @@ class RouteUI : public virtual AxisView
 	PBD::ScopedConnectionList route_connections;
 	bool self_destruct;
 
- 	void init ();
- 	void reset ();
+	void init ();
+	void reset ();
 
 	void self_delete ();
         virtual void start_step_editing () {}
@@ -265,21 +287,25 @@ class RouteUI : public virtual AxisView
         void set_invert_sensitive (bool);
 	bool verify_new_route_name (const std::string& name);
 
-	void route_gui_changed (std::string);
+	void route_gui_changed (PBD::PropertyChange const&);
 	virtual void route_color_changed () {}
 
+	void check_rec_enable_sensitivity ();
+
 	virtual void bus_send_display_changed (boost::shared_ptr<ARDOUR::Route>);
 
 	static std::string program_port_prefix;
 
+	bool mark_hidden (bool yn);
+
   private:
-	void check_rec_enable_sensitivity ();
 	void parameter_changed (std::string const &);
 	void relabel_solo_button ();
 	void track_mode_changed ();
 
 	std::string route_state_id () const;
 
+  protected:
 	struct SoloMuteRelease {
 	    SoloMuteRelease (bool was_active)
 	    : active (was_active)
@@ -296,6 +322,9 @@ class RouteUI : public virtual AxisView
 	SoloMuteRelease* _solo_release;
 	SoloMuteRelease* _mute_release;
 
+	ControlSlaveUI* csu;
+
+private:
 	void setup_invert_buttons ();
 	void set_invert_button_state ();
 	void invert_menu_toggled (uint32_t);
diff --git a/gtk2_ardour/route_ui_selection.h b/gtk2_ardour/route_ui_selection.h
index b26e1c6..03935aa 100644
--- a/gtk2_ardour/route_ui_selection.h
+++ b/gtk2_ardour/route_ui_selection.h
@@ -23,8 +23,8 @@
 
 #include <set>
 
-class RouteUI;
+class AxisView;
 
-struct RouteUISelection : std::set<RouteUI*> {};
+struct AxisViewSelection : std::set<AxisView*> {};
 
 #endif /* __ardour_gtk_route_ui_selection_h__ */
diff --git a/gtk2_ardour/ruler_dialog.cc b/gtk2_ardour/ruler_dialog.cc
index ce34d70..cee831f 100644
--- a/gtk2_ardour/ruler_dialog.cc
+++ b/gtk2_ardour/ruler_dialog.cc
@@ -22,7 +22,7 @@
 #include "actions.h"
 #include "ruler_dialog.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 RulerDialog::RulerDialog ()
 	: ArdourDialog (_("Rulers"))
diff --git a/gtk2_ardour/save_as_dialog.cc b/gtk2_ardour/save_as_dialog.cc
index 9c8d3cb..eaee077 100644
--- a/gtk2_ardour/save_as_dialog.cc
+++ b/gtk2_ardour/save_as_dialog.cc
@@ -23,7 +23,7 @@
 
 #include "save_as_dialog.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace Gtk;
@@ -85,7 +85,7 @@ SaveAsDialog::SaveAsDialog ()
 	no_include_media_button.signal_toggled ().connect (sigc::mem_fun (*this, &SaveAsDialog::no_include_toggled));
 
 	new_parent_folder_selector.set_action (FILE_CHOOSER_ACTION_SELECT_FOLDER);
-	new_parent_folder_selector.set_current_folder (Glib::get_home_dir()); // Why $HOME and not poor_mans_glob (Config->get_default_session_parent_dir ()) ??
+	new_parent_folder_selector.set_current_folder (Config->get_default_session_parent_dir ());
 	new_name_entry.signal_changed().connect (sigc::mem_fun (*this, &SaveAsDialog::name_entry_changed));
 	new_parent_folder_selector.signal_current_folder_changed().connect (sigc::mem_fun (*this, &SaveAsDialog::name_entry_changed));
 	new_parent_folder_selector.signal_selection_changed().connect (sigc::mem_fun (*this, &SaveAsDialog::name_entry_changed));
diff --git a/gtk2_ardour/script_selector.cc b/gtk2_ardour/script_selector.cc
new file mode 100644
index 0000000..4a26973
--- /dev/null
+++ b/gtk2_ardour/script_selector.cc
@@ -0,0 +1,234 @@
+/*
+ * Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+
+#include "gtkmm2ext/utils.h"
+
+#include "script_selector.h"
+#include "pbd/i18n.h"
+
+using namespace std;
+using namespace Gtk;
+using namespace ARDOUR;
+
+ScriptSelector::ScriptSelector (std::string title, LuaScriptInfo::ScriptType type)
+	: ArdourDialog (title)
+	, _type ("", Gtk::ALIGN_START, Gtk::ALIGN_CENTER)
+	, _author ("", Gtk::ALIGN_START, Gtk::ALIGN_CENTER)
+	, _description ("", Gtk::ALIGN_START, Gtk::ALIGN_START)
+	, _scripts (LuaScripting::instance ().scripts (type))
+	, _script_type (type)
+{
+	Gtk::Label* l;
+
+	Table* t = manage (new Table (3, 2));
+	t->set_spacings (6);
+
+	int ty = 0;
+
+	l = manage (new Label (_("<b>Type:</b>"), Gtk::ALIGN_END, Gtk::ALIGN_CENTER, false));
+	l->set_use_markup ();
+	t->attach (*l, 0, 1, ty, ty+1);
+	t->attach (_type, 1, 2, ty, ty+1);
+	++ty;
+
+	l = manage (new Label (_("<b>Author:</b>"), Gtk::ALIGN_END, Gtk::ALIGN_CENTER, false));
+	l->set_use_markup ();
+	t->attach (*l, 0, 1, ty, ty+1);
+	t->attach (_author, 1, 2, ty, ty+1);
+	++ty;
+
+	l = manage (new Label (_("<b>Description:</b>"), Gtk::ALIGN_END, Gtk::ALIGN_CENTER, false));
+	l->set_use_markup ();
+	t->attach (*l, 0, 1, ty, ty+1);
+	t->attach (_description, 1, 2, ty, ty+1);
+	++ty;
+
+	_description.set_line_wrap();
+
+	get_vbox()->set_spacing (6);
+	get_vbox()->pack_start (_script_combo, false, false);
+	get_vbox()->pack_start (*t, true, true);
+
+	Button *r = Gtk::manage (new Gtk::Button (Stock::REFRESH));
+	r->signal_clicked().connect (sigc::mem_fun (*this, &ScriptSelector::refresh));
+	get_action_area()->pack_start(*r);
+
+	add_button (Stock::CANCEL, RESPONSE_CANCEL);
+	_add = add_button (Stock::ADD, RESPONSE_ACCEPT);
+	set_default_response (RESPONSE_ACCEPT);
+
+	_add->set_sensitive (false);
+	_combocon = _script_combo.signal_changed().connect (sigc::mem_fun (*this, &ScriptSelector::script_combo_changed));
+
+	setup_list ();
+	show_all ();
+}
+
+void
+ScriptSelector::setup_list ()
+{
+	_combocon.block();
+	vector<string> script_names;
+	for (LuaScriptList::const_iterator s = _scripts.begin(); s != _scripts.end(); ++s) {
+		script_names.push_back ((*s)->name);
+	}
+
+	Gtkmm2ext::set_popdown_strings (_script_combo, script_names);
+	if (script_names.size() > 0) {
+		_script_combo.set_active(0);
+		script_combo_changed ();
+	}
+	_combocon.unblock();
+}
+
+void
+ScriptSelector::script_combo_changed ()
+{
+	int i = _script_combo.get_active_row_number();
+	_script = _scripts[i];
+
+	_type.set_text(LuaScriptInfo::type2str (_script->type));
+	_author.set_text (_script->author);
+	_description.set_text (_script->description);
+
+	_add->set_sensitive (Glib::file_test(_script->path, Glib::FILE_TEST_EXISTS));
+}
+
+void
+ScriptSelector::refresh ()
+{
+	LuaScripting::instance ().refresh ();
+	_script.reset ();
+	_scripts = LuaScripting::instance ().scripts (_script_type);
+	setup_list ();
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+SessionScriptManager::SessionScriptManager (std::string title, const std::vector<std::string> &names)
+	: ArdourDialog (title)
+{
+	assert (names.size() > 0);
+	Gtkmm2ext::set_popdown_strings (_names_combo, names);
+	_names_combo.set_active(0);
+
+	Gtk::Label* l;
+	l = manage (new Label (_("Select Script to unload")));
+
+	get_vbox()->set_spacing (6);
+	get_vbox()->pack_start (*l, false, false);
+	get_vbox()->pack_start (_names_combo, false, false);
+
+	add_button (Stock::CANCEL, RESPONSE_CANCEL);
+	add_button (Stock::REMOVE, RESPONSE_ACCEPT);
+	set_default_response (RESPONSE_CANCEL);
+
+	show_all ();
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+
+ScriptParameterDialog::ScriptParameterDialog (std::string title,
+		const LuaScriptInfoPtr& spi,
+		const std::vector<std::string> &names,
+		LuaScriptParamList& lsp)
+	: ArdourDialog (title)
+	, _existing_names (names)
+	, _lsp (lsp)
+{
+	Gtk::Label* l;
+
+	Table* t = manage (new Table (4, 3));
+	t->set_spacings (6);
+
+	_name_entry.set_text (spi->name);
+	_name_entry.signal_changed().connect (sigc::mem_fun (*this, &ScriptParameterDialog::update_sensitivity));
+
+	int ty = 0;
+
+	l = manage (new Label (_("<b>Name:</b>"), Gtk::ALIGN_END, Gtk::ALIGN_CENTER, false));
+	l->set_use_markup ();
+	t->attach (*l, 0, 1, ty, ty+1);
+	t->attach (_name_entry, 1, 2, ty, ty+1);
+	++ty;
+
+	if (_lsp.size () > 0) {
+		l = manage (new Label (_("<b>Instance Parameters</b>"), Gtk::ALIGN_LEFT, Gtk::ALIGN_CENTER, false));
+		l->set_use_markup ();
+		t->attach (*l, 0, 2, ty, ty+1);
+		++ty;
+	}
+
+	for (size_t i = 0; i < _lsp.size (); ++i) {
+		CheckButton* c = manage (new CheckButton (_lsp[i]->title));
+		Entry* e = manage (new Entry());
+		c->set_active (!_lsp[i]->optional); // also if default ??
+		c->set_sensitive (_lsp[i]->optional);
+		e->set_text (_lsp[i]->dflt);
+		e->set_sensitive (c->get_active ());
+
+		c->signal_toggled().connect (sigc::bind (sigc::mem_fun (*this, &ScriptParameterDialog::active_changed), i, c, e));
+		e->signal_changed().connect (sigc::bind (sigc::mem_fun (*this, &ScriptParameterDialog::value_changed), i, e));
+
+		t->attach (*c, 0, 1, ty, ty+1);
+		t->attach (*e, 1, 2, ty, ty+1);
+		++ty;
+	}
+
+	add_button (Stock::CANCEL, RESPONSE_CANCEL);
+	_add = add_button (Stock::ADD, RESPONSE_ACCEPT);
+	set_default_response (RESPONSE_ACCEPT);
+
+	get_vbox()->pack_start (*t, true, true);
+	show_all ();
+	update_sensitivity ();
+}
+
+void
+ScriptParameterDialog::update_sensitivity ()
+{
+	std::string n = _name_entry.get_text ();
+	if (n.empty() || std::find (_existing_names.begin(), _existing_names.end(), n) != _existing_names.end()) {
+		_add->set_sensitive (false);
+		return;
+	}
+
+	for (size_t i = 0; i < _lsp.size(); ++i) {
+		if (!_lsp[i]->optional && _lsp[i]->value.empty()) {
+			_add->set_sensitive (false);
+			return;
+		}
+	}
+
+	_add->set_sensitive (true);
+}
+
+void
+ScriptParameterDialog::active_changed (int i, Gtk::CheckButton* c, Gtk::Entry* e)
+{
+	bool en = c->get_active ();
+	_lsp[i]->is_set = en;
+	e->set_sensitive (en);
+}
+
+void
+ScriptParameterDialog::value_changed (int i, Gtk::Entry* e)
+{
+	_lsp[i]->value = e->get_text ();
+}
diff --git a/gtk2_ardour/script_selector.h b/gtk2_ardour/script_selector.h
new file mode 100644
index 0000000..b249cfe
--- /dev/null
+++ b/gtk2_ardour/script_selector.h
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+
+#include <gtkmm.h>
+#include "ardour/luascripting.h"
+
+#include "ardour_dialog.h"
+
+class ScriptSelector : public ArdourDialog
+{
+public:
+	ScriptSelector (std::string title, ARDOUR::LuaScriptInfo::ScriptType t);
+	ARDOUR::LuaScriptInfoPtr script() const { return _script; }
+
+private:
+	void setup_list ();
+	void refresh ();
+	void script_combo_changed ();
+
+	Gtk::Button* _add;
+	Gtk::ComboBoxText _script_combo;
+
+	Gtk::Label  _type;
+	Gtk::Label  _author;
+	Gtk::Label  _description;
+
+	ARDOUR::LuaScriptList _scripts;
+	ARDOUR::LuaScriptInfoPtr _script;
+	ARDOUR::LuaScriptInfo::ScriptType _script_type;
+	sigc::connection _combocon;
+};
+
+class SessionScriptManager : public ArdourDialog
+{
+public:
+	SessionScriptManager (std::string title, const std::vector<std::string>&);
+	std::string name () { return _names_combo.get_active_text (); }
+
+private:
+	Gtk::ComboBoxText _names_combo;
+};
+
+class ScriptParameterDialog : public ArdourDialog
+{
+public:
+	ScriptParameterDialog (std::string title, const ARDOUR::LuaScriptInfoPtr&, const std::vector<std::string>&, ARDOUR::LuaScriptParamList&);
+	std::string name () { return _name_entry.get_text (); }
+
+private:
+	void update_sensitivity ();
+	void active_changed (int, Gtk::CheckButton*, Gtk::Entry*);
+	void value_changed (int, Gtk::Entry*);
+
+	Gtk::Entry _name_entry;
+	Gtk::Button* _add;
+	const std::vector<std::string> &_existing_names;
+	ARDOUR::LuaScriptParamList& _lsp;
+};
diff --git a/gtk2_ardour/search_path_option.cc b/gtk2_ardour/search_path_option.cc
index 9aea617..925b983 100644
--- a/gtk2_ardour/search_path_option.cc
+++ b/gtk2_ardour/search_path_option.cc
@@ -21,7 +21,7 @@
 #include "pbd/shortpath.h"
 
 #include "search_path_option.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace Gtk;
diff --git a/gtk2_ardour/selectable.h b/gtk2_ardour/selectable.h
index 2d31dbf..2ffac87 100644
--- a/gtk2_ardour/selectable.h
+++ b/gtk2_ardour/selectable.h
@@ -37,7 +37,7 @@ class Selectable : public virtual sigc::trackable
 		}
 	}
 
-	bool get_selected() const {
+	virtual bool selected() const {
 		return _selected;
 	}
 
diff --git a/gtk2_ardour/selection.cc b/gtk2_ardour/selection.cc
index aa12e4f..f7eb676 100644
--- a/gtk2_ardour/selection.cc
+++ b/gtk2_ardour/selection.cc
@@ -26,6 +26,8 @@
 #include "ardour/playlist.h"
 #include "ardour/rc_configuration.h"
 
+#include "control_protocol/control_protocol.h"
+
 #include "audio_region_view.h"
 #include "debug.h"
 #include "gui_thread.h"
@@ -39,7 +41,7 @@
 #include "public_editor.h"
 #include "control_point.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
@@ -620,10 +622,14 @@ Selection::add (boost::shared_ptr<Evoral::ControlList> cl)
 		warning << "Programming error: Selected list is not an ARDOUR::AutomationList" << endmsg;
 		return;
 	}
-	if (find (lines.begin(), lines.end(), al) == lines.end()) {
-		lines.push_back (al);
-		LinesChanged();
-	}
+
+	/* The original may change so we must store a copy (not a pointer) here.
+	 * e.g AutomationLine rewrites the list with gain mapping.
+	 * the downside is that we can't perfom duplicate checks.
+	 * This code was changed in response to #6842
+	 */
+	lines.push_back (boost::shared_ptr<ARDOUR::AutomationList> (new ARDOUR::AutomationList(*al)));
+	LinesChanged();
 }
 
 void
@@ -633,6 +639,7 @@ Selection::remove (TimeAxisView* track)
 	if ((i = find (tracks.begin(), tracks.end(), track)) != tracks.end()) {
 		track->set_selected (false);
 		tracks.erase (i);
+
 		if (!_no_tracks_changed) {
 			TracksChanged();
 		}
@@ -947,7 +954,7 @@ Selection::selected (ArdourMarker* m)
 bool
 Selection::selected (TimeAxisView* tv)
 {
-	return tv->get_selected ();
+	return tv->selected ();
 }
 
 bool
@@ -993,7 +1000,7 @@ Selection::toggle (ControlPoint* cp)
 	clear_time();  //enforce region/object exclusivity
 	clear_tracks();  //enforce object/track exclusivity
 
-	cp->set_selected (!cp->get_selected ());
+	cp->set_selected (!cp->selected ());
 	PointSelection::iterator i = find (points.begin(), points.end(), cp);
 	if (i == points.end()) {
 		points.push_back (cp);
@@ -1143,7 +1150,7 @@ Selection::set (ControlPoint* cp)
 	clear_time ();  //enforce region/object exclusivity
 	clear_tracks();  //enforce object/track exclusivity
 
-	if (cp->get_selected () && points.size () == 1) {
+	if (cp->selected () && points.size () == 1) {
 		return;
 	}
 
@@ -1361,7 +1368,7 @@ Selection::set_state (XMLNode const & node, int)
 	for (XMLNodeList::const_iterator i = children.begin(); i != children.end(); ++i) {
 		if ((*i)->name() == X_("RouteView")) {
 
-			XMLProperty* prop_id = (*i)->property (X_("id"));
+			XMLProperty const * prop_id = (*i)->property (X_("id"));
 			assert (prop_id);
 			PBD::ID id (prop_id->value ());
 			RouteTimeAxisView* rtv = editor->get_route_view_by_route_id (id);
@@ -1370,7 +1377,7 @@ Selection::set_state (XMLNode const & node, int)
 			}
 
 		} else if ((*i)->name() == X_("Region")) {
-			XMLProperty* prop_id = (*i)->property (X_("id"));
+			XMLProperty const * prop_id = (*i)->property (X_("id"));
 			assert (prop_id);
 			PBD::ID id (prop_id->value ());
 
@@ -1388,7 +1395,7 @@ Selection::set_state (XMLNode const & node, int)
 			}
 
 		} else if ((*i)->name() == X_("MIDINote")) {
-			XMLProperty* prop_region_id = (*i)->property (X_("region-id"));
+			XMLProperty const * prop_region_id = (*i)->property (X_("region-id"));
 
 			assert (prop_region_id);
 
@@ -1401,12 +1408,12 @@ Selection::set_state (XMLNode const & node, int)
 			XMLNodeList children = (*i)->children ();
 
 			for (XMLNodeList::const_iterator ci = children.begin(); ci != children.end(); ++ci) {
-				XMLProperty* prop_channel = (*ci)->property (X_("channel"));
-				XMLProperty* prop_time = (*ci)->property (X_("time"));
-				XMLProperty* prop_note = (*ci)->property (X_("note"));
-				XMLProperty* prop_length = (*ci)->property (X_("length"));
-				XMLProperty* prop_velocity = (*ci)->property (X_("velocity"));
-				XMLProperty* prop_off_velocity = (*ci)->property (X_("off-velocity"));
+				XMLProperty const * prop_channel = (*ci)->property (X_("channel"));
+				XMLProperty const * prop_time = (*ci)->property (X_("time"));
+				XMLProperty const * prop_note = (*ci)->property (X_("note"));
+				XMLProperty const * prop_length = (*ci)->property (X_("length"));
+				XMLProperty const * prop_velocity = (*ci)->property (X_("velocity"));
+				XMLProperty const * prop_off_velocity = (*ci)->property (X_("off-velocity"));
 
 				assert (prop_channel);
 				assert (prop_time);
@@ -1441,16 +1448,16 @@ Selection::set_state (XMLNode const & node, int)
 			}
 
 		} else if  ((*i)->name() == X_("ControlPoint")) {
-			XMLProperty* prop_type = (*i)->property (X_("type"));
+			XMLProperty const * prop_type = (*i)->property (X_("type"));
 
 			assert(prop_type);
 
 			if (prop_type->value () == "track") {
 
-				XMLProperty* prop_route_id = (*i)->property (X_("route-id"));
-				XMLProperty* prop_alist_id = (*i)->property (X_("automation-list-id"));
-				XMLProperty* prop_parameter = (*i)->property (X_("parameter"));
-				XMLProperty* prop_view_index = (*i)->property (X_("view-index"));
+				XMLProperty const * prop_route_id = (*i)->property (X_("route-id"));
+				XMLProperty const * prop_alist_id = (*i)->property (X_("automation-list-id"));
+				XMLProperty const * prop_parameter = (*i)->property (X_("parameter"));
+				XMLProperty const * prop_view_index = (*i)->property (X_("view-index"));
 
 				assert (prop_route_id);
 				assert (prop_alist_id);
@@ -1480,8 +1487,8 @@ Selection::set_state (XMLNode const & node, int)
 					add (cps);
 				}
 			} else if (prop_type->value () == "region") {
-				XMLProperty* prop_region_id = (*i)->property (X_("region-id"));
-				XMLProperty* prop_view_index = (*i)->property (X_("view-index"));
+				XMLProperty const * prop_region_id = (*i)->property (X_("region-id"));
+				XMLProperty const * prop_view_index = (*i)->property (X_("view-index"));
 
 				if (!prop_region_id || !prop_view_index) {
 					continue;
@@ -1511,8 +1518,8 @@ Selection::set_state (XMLNode const & node, int)
 			}
 
 		} else if  ((*i)->name() == X_("AudioRange")) {
-			XMLProperty* prop_start = (*i)->property (X_("start"));
-			XMLProperty* prop_end = (*i)->property (X_("end"));
+			XMLProperty const * prop_start = (*i)->property (X_("start"));
+			XMLProperty const * prop_end = (*i)->property (X_("end"));
 
 			assert (prop_start);
 			assert (prop_end);
@@ -1524,8 +1531,8 @@ Selection::set_state (XMLNode const & node, int)
 
 		} else if ((*i)->name() == X_("AutomationView")) {
 
-			XMLProperty* prop_id = (*i)->property (X_("id"));
-			XMLProperty* prop_parameter = (*i)->property (X_("parameter"));
+			XMLProperty const * prop_id = (*i)->property (X_("id"));
+			XMLProperty const * prop_parameter = (*i)->property (X_("parameter"));
 
 			assert (prop_id);
 			assert (prop_parameter);
@@ -1548,8 +1555,8 @@ Selection::set_state (XMLNode const & node, int)
 
 		} else if ((*i)->name() == X_("Marker")) {
 
-			XMLProperty* prop_id = (*i)->property (X_("id"));
-			XMLProperty* prop_start = (*i)->property (X_("start"));
+			XMLProperty const * prop_id = (*i)->property (X_("id"));
+			XMLProperty const * prop_start = (*i)->property (X_("start"));
 			assert (prop_id);
 			assert (prop_start);
 
diff --git a/gtk2_ardour/selection.h b/gtk2_ardour/selection.h
index aa9510b..c9f5edd 100644
--- a/gtk2_ardour/selection.h
+++ b/gtk2_ardour/selection.h
@@ -107,6 +107,11 @@ class Selection : public sigc::trackable, public PBD::ScopedConnectionList
 	void block_tracks_changed (bool);
 
 	void clear ();
+
+	/** check if all selections are empty
+	 * @param internal_selection also check object internals (e.g midi notes, automation points), when false only check objects.
+	 * @return true if nothing is selected.
+	 */
 	bool empty (bool internal_selection = false);
 
 	void dump_region_layers();
diff --git a/gtk2_ardour/selection_memento.cc b/gtk2_ardour/selection_memento.cc
index ae3ad73..f122de3 100644
--- a/gtk2_ardour/selection_memento.cc
+++ b/gtk2_ardour/selection_memento.cc
@@ -22,7 +22,7 @@
 #include "editing.h"
 #include "public_editor.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 SelectionMemento::SelectionMemento ()
 {
@@ -54,7 +54,7 @@ SelectionMemento::get_state () {
 int
 SelectionMemento::set_state (const XMLNode& node, int /*version*/) {
 
-	const XMLProperty* prop;
+	XMLProperty const * prop;
 	PublicEditor& editor = PublicEditor::instance();
 	if (node.name() != X_("SelectionMemento")) {
 		return -1;
diff --git a/gtk2_ardour/send_ui.cc b/gtk2_ardour/send_ui.cc
index 7f87f2d..364e44c 100644
--- a/gtk2_ardour/send_ui.cc
+++ b/gtk2_ardour/send_ui.cc
@@ -29,7 +29,7 @@
 #include "timers.h"
 #include "gui_thread.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
diff --git a/gtk2_ardour/session_dialog.cc b/gtk2_ardour/session_dialog.cc
index 9ba479e..225b02d 100644
--- a/gtk2_ardour/session_dialog.cc
+++ b/gtk2_ardour/session_dialog.cc
@@ -54,7 +54,7 @@
 #include "session_dialog.h"
 #include "opts.h"
 #include "engine_dialog.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
 #include "tooltips.h"
 #include "ui_config.h"
 #include "utils.h"
@@ -348,7 +348,10 @@ SessionDialog::setup_initial_choice_box ()
 
 	string image_path;
 
-	if (find_file (ardour_data_search_path(), "small-splash.png", image_path)) {
+	Searchpath rc (ARDOUR::ardour_data_search_path());
+	rc.add_subdirectory_to_paths ("resources");
+
+	if (find_file (rc, PROGRAM_NAME "-small-splash.png", image_path)) {
 		Gtk::Image* image;
 		if ((image = manage (new Gtk::Image (image_path))) != 0) {
 			hbox->pack_start (*image, false, false);
diff --git a/gtk2_ardour/session_import_dialog.cc b/gtk2_ardour/session_import_dialog.cc
index 5783c83..b528f91 100644
--- a/gtk2_ardour/session_import_dialog.cc
+++ b/gtk2_ardour/session_import_dialog.cc
@@ -33,7 +33,7 @@
 
 #include "gui_thread.h"
 #include "prompter.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
diff --git a/gtk2_ardour/session_metadata_dialog.cc b/gtk2_ardour/session_metadata_dialog.cc
index 7973d03..a4cfee2 100644
--- a/gtk2_ardour/session_metadata_dialog.cc
+++ b/gtk2_ardour/session_metadata_dialog.cc
@@ -30,7 +30,7 @@
 #include "ardour/session.h"
 #include "ardour/session_utils.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace Glib;
@@ -270,15 +270,18 @@ EAN13MetadataField::update_status ()
 		// calculate EAN-13 modulo 10 check digit
 		int sum = 0;
 		const char *p = _value.c_str();
-		for (int i =0; i < 12; i++) {
+		for (int i = 0; i < 12; i++) {
 			char c = p[i] - '0';
 			if (i % 2) {
-				sum += c;
-			} else {
 				sum += c * 3;
+			} else {
+				sum += c;
 			}
 		}
 		sum %= 10;
+		if (sum)
+			sum = 10 - sum;
+
 		if (sum == p[12] - '0') {
 			status_label->set_markup (string_compose(
 						"<span color=\"green\">%1: %2</span>",
diff --git a/gtk2_ardour/session_option_editor.cc b/gtk2_ardour/session_option_editor.cc
index fa02278..baadcef 100644
--- a/gtk2_ardour/session_option_editor.cc
+++ b/gtk2_ardour/session_option_editor.cc
@@ -22,14 +22,14 @@
 #include "gui_thread.h"
 #include "session_option_editor.h"
 #include "search_path_option.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
 using namespace Timecode;
 
 SessionOptionEditor::SessionOptionEditor (Session* s)
-	: OptionEditor (&(s->config), _("Session Properties"))
+	: OptionEditorWindow (&(s->config), _("Session Properties"))
 	, _session_config (&(s->config))
 {
 	set_session (s);
@@ -207,20 +207,20 @@ SessionOptionEditor::SessionOptionEditor (Session* s)
 
 	add_option (_("Media"), hf);
 
-	add_option (_("Locations"), new OptionEditorHeading (_("File locations")));
+	add_option (S_("Files|Locations"), new OptionEditorHeading (_("File locations")));
 
         SearchPathOption* spo = new SearchPathOption ("audio-search-path", _("Search for audio files in:"),
 						      _session->path(),
                                                       sigc::mem_fun (*_session_config, &SessionConfiguration::get_audio_search_path),
                                                       sigc::mem_fun (*_session_config, &SessionConfiguration::set_audio_search_path));
-        add_option (_("Locations"), spo);
+        add_option (S_("Files|Locations"), spo);
 
         spo = new SearchPathOption ("midi-search-path", _("Search for MIDI files in:"),
 				    _session->path(),
                                     sigc::mem_fun (*_session_config, &SessionConfiguration::get_midi_search_path),
                                     sigc::mem_fun (*_session_config, &SessionConfiguration::set_midi_search_path));
 
-        add_option (_("Locations"), spo);
+        add_option (S_("Files|Locations"), spo);
 
 	/* File Naming  */
 
diff --git a/gtk2_ardour/session_option_editor.h b/gtk2_ardour/session_option_editor.h
index 425ec37..759f28f 100644
--- a/gtk2_ardour/session_option_editor.h
+++ b/gtk2_ardour/session_option_editor.h
@@ -27,7 +27,7 @@ namespace ARDOUR {
 	class SessionConfiguration;
 }
 
-class SessionOptionEditor : public OptionEditor
+class SessionOptionEditor : public OptionEditorWindow
 {
 public:
 	SessionOptionEditor (ARDOUR::Session* s);
diff --git a/gtk2_ardour/sfdb_freesound_mootcher.cc b/gtk2_ardour/sfdb_freesound_mootcher.cc
index 94e0058..74290df 100644
--- a/gtk2_ardour/sfdb_freesound_mootcher.cc
+++ b/gtk2_ardour/sfdb_freesound_mootcher.cc
@@ -50,7 +50,7 @@
 #include <glib.h>
 #include "pbd/gstdio_compat.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 #include "ardour/audio_library.h"
 #include "ardour/rc_configuration.h"
diff --git a/gtk2_ardour/sfdb_ui.cc b/gtk2_ardour/sfdb_ui.cc
index 104d091..f94c584 100644
--- a/gtk2_ardour/sfdb_ui.cc
+++ b/gtk2_ardour/sfdb_ui.cc
@@ -21,7 +21,7 @@
 #include "gtk2ardour-config.h"
 #endif
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 #include <map>
 #include <cerrno>
@@ -560,7 +560,7 @@ SoundFileBrowser::SoundFileBrowser (string title, ARDOUR::Session* s, bool persi
 	, gm (0)
 {
 
-#ifdef GTKOSX
+#ifdef __APPLE__
 	try {
 		/* add_shortcut_folder throws an exception if the folder being added already has a shortcut */
 		chooser.add_shortcut_folder_uri("file:///Library/GarageBand/Apple Loops");
@@ -597,7 +597,7 @@ SoundFileBrowser::SoundFileBrowser (string title, ARDOUR::Session* s, bool persi
 	chooser.signal_update_preview().connect(sigc::mem_fun(*this, &SoundFileBrowser::update_preview));
 	chooser.signal_file_activated().connect (sigc::mem_fun (*this, &SoundFileBrowser::chooser_file_activated));
 
-#ifdef GTKOSX
+#ifdef __APPLE__
 	/* some broken redraw behaviour - this is a bandaid */
 	chooser.signal_selection_changed().connect (mem_fun (chooser, &Widget::queue_draw));
 #endif
@@ -647,6 +647,7 @@ SoundFileBrowser::SoundFileBrowser (string title, ARDOUR::Session* s, bool persi
 	notebook.append_page (*vbox, _("Search Tags"));
 
 	//add freesound search
+#ifdef FREESOUND_GOT_FIXED
 
 	HBox* passbox;
 	Label* label;
@@ -721,6 +722,7 @@ SoundFileBrowser::SoundFileBrowser (string title, ARDOUR::Session* s, bool persi
 	freesound_more_btn.signal_clicked().connect(sigc::mem_fun(*this, &SoundFileBrowser::freesound_more_clicked));
 	freesound_similar_btn.signal_clicked().connect(sigc::mem_fun(*this, &SoundFileBrowser::freesound_similar_clicked));
 	notebook.append_page (*vbox, _("Search Freesound"));
+#endif
 
 	notebook.set_size_request (500, -1);
 	notebook.signal_switch_page().connect (sigc::hide_return (sigc::hide (sigc::hide (sigc::mem_fun (*this, &SoundFileBrowser::reset_options)))));
@@ -1091,7 +1093,7 @@ SoundFileBrowser::freesound_search()
 	std::string theString = mootcher.searchText(
 			search_string,
 			freesound_page,
-#ifdef GTKOSX
+#ifdef __APPLE__
 			"", // OSX eats anything incl mp3
 #else
 			"type:wav OR type:aiff OR type:flac OR type:aif OR type:ogg OR type:oga",
@@ -1672,63 +1674,55 @@ SoundFileOmega::SoundFileOmega (string title, ARDOUR::Session* s,
 	, _import_active (false)
 	, _reset_post_import (false)
 {
-	VBox* vbox;
-	HBox* hbox;
 	vector<string> str;
 
-	set_size_request (-1, 450);
+	set_size_request (-1, 550);
 
 	block_two.set_border_width (12);
 	block_three.set_border_width (12);
 	block_four.set_border_width (12);
 
-	options.set_spacing (12);
-
 	str.clear ();
 	str.push_back (_("file timestamp"));
 	str.push_back (_("edit point"));
 	str.push_back (_("playhead"));
 	str.push_back (_("session start"));
 	set_popdown_strings (where_combo, str);
-	where_combo.set_active_text (str.front());
+	where_combo.set_active_text (str.back());
 	where_combo.signal_changed().connect (sigc::mem_fun (*this, &SoundFileOmega::where_combo_changed));
 
 	Label* l = manage (new Label);
 	l->set_markup (_("<b>Add files ...</b>"));
-
-	vbox = manage (new VBox);
-	vbox->set_border_width (12);
-	vbox->set_spacing (6);
-	vbox->pack_start (*l, false, false);
-	vbox->pack_start (action_combo, false, false);
-	hbox = manage (new HBox);
-	hbox->pack_start (*vbox, false, false);
-	options.pack_start (*hbox, false, false);
+	options.attach (*l, 0, 1, 0, 1, FILL, SHRINK, 8, 0);
+	options.attach (action_combo, 0, 1, 1, 2, FILL, SHRINK, 8, 0);
 
 	l = manage (new Label);
 	l->set_markup (_("<b>Insert at</b>"));
+	options.attach (*l, 0, 1, 3, 4, FILL, SHRINK, 8, 0);
+	options.attach (where_combo, 0, 1, 4, 5, FILL, SHRINK, 8, 0);
 
-	vbox = manage (new VBox);
-	vbox->set_border_width (12);
-	vbox->set_spacing (6);
-	vbox->pack_start (*l, false, false);
-	vbox->pack_start (where_combo, false, false);
-	hbox = manage (new HBox);
-	hbox->pack_start (*vbox, false, false);
-	options.pack_start (*hbox, false, false);
+	l = manage (new Label);
+	l->set_markup (_("<b>Mapping</b>"));
+	options.attach (*l, 1, 2, 0, 1, FILL, SHRINK, 8, 0);
+	options.attach (channel_combo, 1, 2, 1, 2, FILL, SHRINK, 8, 0);
 
+	l = manage (new Label);
+	l->set_markup (_("<b>Conversion quality</b>"));
+	options.attach (*l, 1, 2, 3, 4, FILL, SHRINK, 8, 0);
+	options.attach (src_combo, 1, 2, 4, 5, FILL, SHRINK, 8, 0);
 
 	l = manage (new Label);
-	l->set_markup (_("<b>Mapping</b>"));
+	l->set_markup (_("<b>Instrument</b>"));
+	options.attach (*l, 3, 4, 0, 1, FILL, SHRINK, 8, 0);
+	options.attach (instrument_combo, 3, 4, 1, 2, FILL, SHRINK, 8, 0);
 
-	vbox = manage (new VBox);
-	vbox->set_border_width (12);
-	vbox->set_spacing (6);
-	vbox->pack_start (*l, false, false);
-	vbox->pack_start (channel_combo, false, false);
-	hbox = manage (new HBox);
-	hbox->pack_start (*vbox, false, false);
-	options.pack_start (*hbox, false, false);
+	Alignment *hspace = manage (new Alignment ());
+	hspace->set_size_request (2, 2);
+	options.attach (*hspace, 0, 3, 2, 3, FILL, SHRINK, 0, 8);
+
+	Alignment *vspace = manage (new Alignment ());
+	vspace->set_size_request (2, 2);
+	options.attach (*vspace, 2, 3, 0, 3, EXPAND, SHRINK, 0, 0);
 
 	str.clear ();
 	str.push_back (_("one track per file"));
@@ -1736,30 +1730,6 @@ SoundFileOmega::SoundFileOmega (string title, ARDOUR::Session* s,
 	channel_combo.set_active_text (str.front());
 	channel_combo.set_sensitive (false);
 
-	l = manage (new Label);
-	l->set_markup (_("<b>Conversion quality</b>"));
-
-	vbox = manage (new VBox);
-	vbox->set_border_width (12);
-	vbox->set_spacing (6);
-	vbox->pack_start (*l, false, false);
-	vbox->pack_start (src_combo, false, false);
-	hbox = manage (new HBox);
-	hbox->pack_start (*vbox, false, false);
-	options.pack_start (*hbox, false, false);
-
-	l = manage (new Label);
-	l->set_markup (_("<b>Instrument</b>"));
-
-	vbox = manage (new VBox);
-	vbox->set_border_width (12);
-	vbox->set_spacing (6);
-	vbox->pack_start (*l, false, false);
-	vbox->pack_start (instrument_combo, false, false);
-	hbox = manage (new HBox);
-	hbox->pack_start (*vbox, false, false);
-	options.pack_start (*hbox, false, false);
-
 	str.clear ();
 	str.push_back (_("Best"));
 	str.push_back (_("Good"));
@@ -1785,10 +1755,9 @@ SoundFileOmega::SoundFileOmega (string title, ARDOUR::Session* s,
 	}
 
 	block_four.pack_start (copy_files_btn, false, false);
+	options.attach (block_four, 3, 4, 4, 5, FILL, SHRINK, 8, 0);
 
-	options.pack_start (block_four, false, false);
-
-	vpacker.pack_start (options, false, false);
+	vpacker.pack_start (options, false, true);
 
 	/* setup disposition map */
 
diff --git a/gtk2_ardour/sfdb_ui.h b/gtk2_ardour/sfdb_ui.h
index fcdce2a..f070d36 100644
--- a/gtk2_ardour/sfdb_ui.h
+++ b/gtk2_ardour/sfdb_ui.h
@@ -303,7 +303,7 @@ class SoundFileOmega : public SoundFileBrowser
 	typedef std::map<std::string,Editing::ImportDisposition> DispositionMap;
 	DispositionMap disposition_map;
 
-	Gtk::HBox options;
+	Gtk::Table options;
 	Gtk::VBox block_two;
 	Gtk::VBox block_three;
 	Gtk::VBox block_four;
diff --git a/gtk2_ardour/shuttle_control.cc b/gtk2_ardour/shuttle_control.cc
index 4616b76..fec3547 100644
--- a/gtk2_ardour/shuttle_control.cc
+++ b/gtk2_ardour/shuttle_control.cc
@@ -36,7 +36,7 @@
 #include "shuttle_control.h"
 #include "tooltips.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace Gtk;
 using namespace Gtkmm2ext;
@@ -53,7 +53,14 @@ gboolean qt (gboolean, gint, gint, gboolean, Gtk::Tooltip*, gpointer)
 ShuttleControl::ShuttleControl ()
 	: _controllable (new ShuttleControllable (*this))
 	, binding_proxy (_controllable)
+	, text_color (0)
 {
+	left_text = Pango::Layout::create (get_pango_context());
+	right_text = Pango::Layout::create (get_pango_context());
+
+	right_text->set_attributes (text_attributes);
+	left_text->set_attributes (text_attributes);
+
 	set_tooltip (*this, _("Shuttle speed control (Context-click for options)"));
 
 	pattern = 0;
@@ -84,6 +91,9 @@ ShuttleControl::ShuttleControl ()
 	else                               { shuttle_max_speed = 1.5f; }
 
 	Config->ParameterChanged.connect (parameter_connection, MISSING_INVALIDATOR, boost::bind (&ShuttleControl::parameter_changed, this, _1), gui_context());
+	UIConfiguration::instance().ColorsChanged.connect (sigc::mem_fun (*this, &ShuttleControl::set_colors));
+
+	set_colors ();
 
 	/* gtkmm 2.4: the C++ wrapper doesn't work */
 	g_signal_connect ((GObject*) gobj(), "query-tooltip", G_CALLBACK (qt), NULL);
@@ -94,6 +104,7 @@ ShuttleControl::~ShuttleControl ()
 {
 	cairo_pattern_destroy (pattern);
 	cairo_pattern_destroy (shine_pattern);
+	delete text_color;
 }
 
 void
@@ -135,6 +146,13 @@ ShuttleControl::on_size_allocate (Gtk::Allocation& alloc)
 	cairo_pattern_add_color_stop_rgba (shine_pattern, 0, 1,1,1,0.0);
 	cairo_pattern_add_color_stop_rgba (shine_pattern, 0.2, 1,1,1,0.4);
 	cairo_pattern_add_color_stop_rgba (shine_pattern, 1, 1,1,1,0.1);
+
+	Pango::AttrFontDesc* font_attr;
+
+	font_attr = new Pango::AttrFontDesc (Pango::Attribute::create_attr_font_desc (UIConfiguration::instance().get_NormalBoldFont()));
+	text_attributes.change (*font_attr);
+
+	delete font_attr;
 }
 
 void
@@ -143,9 +161,9 @@ ShuttleControl::map_transport_state ()
 	float speed = _session->transport_speed ();
 
 	if ( (fabsf( speed - last_speed_displayed) < 0.005f) // dead-zone
-			&& !( speed == 1.f && last_speed_displayed != 1.f)
-			&& !( speed == 0.f && last_speed_displayed != 0.f)
-	   )
+	     && !( speed == 1.f && last_speed_displayed != 1.f)
+	     && !( speed == 0.f && last_speed_displayed != 0.f)
+		)
 	{
 		return; // nothing to see here, move along.
 	}
@@ -293,10 +311,11 @@ ShuttleControl::on_button_press_event (GdkEventButton* ev)
 			add_modal_grab ();
 			shuttle_grabbed = true;
 			shuttle_speed_on_grab = _session->transport_speed ();
+			requested_speed = shuttle_speed_on_grab;
 			mouse_shuttle (ev->x, true);
 			gdk_pointer_grab(ev->window,false,
-					GdkEventMask( Gdk::POINTER_MOTION_MASK | Gdk::BUTTON_PRESS_MASK |Gdk::BUTTON_RELEASE_MASK),
-					NULL,NULL,ev->time);
+			                 GdkEventMask( Gdk::POINTER_MOTION_MASK | Gdk::BUTTON_PRESS_MASK |Gdk::BUTTON_RELEASE_MASK),
+			                 NULL,NULL,ev->time);
 		}
 		break;
 
@@ -538,6 +557,7 @@ ShuttleControl::use_shuttle_fract (bool force, bool zero_ok)
 		speed = shuttle_max_speed * shuttle_fract;
 	}
 
+	requested_speed = speed;
 	if (zero_ok) {
 		_session->request_transport_speed (speed, Config->get_shuttle_behaviour() == Wheel);
 	} else {
@@ -546,19 +566,48 @@ ShuttleControl::use_shuttle_fract (bool force, bool zero_ok)
 }
 
 void
-ShuttleControl::render (cairo_t* cr, cairo_rectangle_t*)
+ShuttleControl::set_colors ()
 {
-	cairo_text_extents_t extents;
+	int r, g, b, a;
+
+	uint32_t bg_color = UIConfiguration::instance().color (X_("shuttle bg"));
+	uint32_t text = UIConfiguration::instance().color (X_("shuttle text"));
+
+	UINT_TO_RGBA (bg_color, &r, &g, &b, &a);
+	bg_r = r/255.0;
+	bg_g = g/255.0;
+	bg_b = b/255.0;
+
+	UINT_TO_RGBA (text, &r, &g, &b, &a);
 
+	/* rescale for Pango colors ... sigh */
+
+	r = lrint (r * 65535.0);
+	g = lrint (g * 65535.0);
+	b = lrint (b * 65535.0);
+
+	delete text_color;
+	text_color = new Pango::AttrColor (Pango::Attribute::create_attr_foreground (r, g, b));
+	text_attributes.change (*text_color);
+}
+
+void
+ShuttleControl::render (cairo_t* cr, cairo_rectangle_t*)
+{
 	//black border
-	cairo_set_source_rgb (cr, 0, 0.0, 0.0);
+	cairo_set_source_rgb (cr, bg_r, bg_g, bg_b);
 	rounded_rectangle (cr, 0, 0, get_width(), get_height(), 4);
 	cairo_fill (cr);
 
 	float speed = 0.0;
+	float acutal_speed = 0.0;
 
 	if (_session) {
 		speed = _session->transport_speed ();
+		acutal_speed = speed;
+		if (shuttle_grabbed) {
+			speed = requested_speed;
+		}
 	}
 
 	/* Marker */
@@ -584,24 +633,24 @@ ShuttleControl::render (cairo_t* cr, cairo_rectangle_t*)
 
 	char buf[32];
 
-	if (speed != 0) {
+	if (acutal_speed != 0) {
 
 		if (Config->get_shuttle_units() == Percentage) {
 
-			if (speed == 1.0) {
+			if (acutal_speed == 1.0) {
 				snprintf (buf, sizeof (buf), "%s", _("Playing"));
 			} else {
-				if (speed < 0.0) {
-					snprintf (buf, sizeof (buf), "<<< %.1f%%", -speed * 100.f);
+				if (acutal_speed < 0.0) {
+					snprintf (buf, sizeof (buf), "<<< %.1f%%", -acutal_speed * 100.f);
 				} else {
-					snprintf (buf, sizeof (buf), ">>> %.1f%%", speed * 100.f);
+					snprintf (buf, sizeof (buf), ">>> %.1f%%", acutal_speed * 100.f);
 				}
 			}
 
 		} else {
 
 			bool reversed;
-			int semi = speed_as_semitones (speed, reversed);
+			int semi = speed_as_semitones (acutal_speed, reversed);
 
 			if (reversed) {
 				snprintf (buf, sizeof (buf), _("<<< %+d semitones"), semi);
@@ -614,20 +663,17 @@ ShuttleControl::render (cairo_t* cr, cairo_rectangle_t*)
 		snprintf (buf, sizeof (buf), "%s", _("Stopped"));
 	}
 
-	last_speed_displayed = speed;
+	last_speed_displayed = acutal_speed;
 
-	// TODO use a proper pango layout, scale font
-	cairo_set_source_rgb (cr, 0.6, 0.6, 0.6);
-	cairo_set_font_size (cr, 13.0);
-	cairo_text_extents (cr, "0|", &extents); // note the descender
-	const float text_ypos = (get_height() + extents.height - 1.) * .5;
+	const float top_text_margin = 3.0f;
+	const float side_text_margin = 5.0f;
 
-	cairo_move_to (cr, 10, text_ypos);
-	cairo_show_text (cr, buf);
+	left_text->set_text (buf);
+	cairo_move_to (cr, side_text_margin, top_text_margin);
+	pango_cairo_show_layout (cr, left_text->gobj());
 
 	/* style text */
 
-
 	switch (Config->get_shuttle_behaviour()) {
 	case Sprung:
 		snprintf (buf, sizeof (buf), "%s", _("Sprung"));
@@ -637,14 +683,15 @@ ShuttleControl::render (cairo_t* cr, cairo_rectangle_t*)
 		break;
 	}
 
-	cairo_text_extents (cr, buf, &extents);
-	cairo_move_to (cr, get_width() - (fabs(extents.x_advance) + 5), text_ypos);
-	cairo_show_text (cr, buf);
+	right_text->set_text (buf);
+	Pango::Rectangle r = right_text->get_ink_extents ();
+	cairo_move_to (cr, get_width() - ((r.get_width()/PANGO_SCALE) + side_text_margin), top_text_margin);
+	pango_cairo_show_layout (cr, right_text->gobj());
 
 	if (UIConfiguration::instance().get_widget_prelight()) {
 		if (_hovering) {
 			rounded_rectangle (cr, 1, 1, get_width()-2, get_height()-2, 4.0);
-			cairo_set_source_rgba (cr, 1, 1, 1, 0.2);
+			cairo_set_source_rgba (cr, 1, 1, 1, 0.15);
 			cairo_fill (cr);
 		}
 	}
diff --git a/gtk2_ardour/shuttle_control.h b/gtk2_ardour/shuttle_control.h
index 20fe460..e506e7b 100644
--- a/gtk2_ardour/shuttle_control.h
+++ b/gtk2_ardour/shuttle_control.h
@@ -56,6 +56,7 @@ class ShuttleControl : public CairoWidget, public ARDOUR::SessionHandlePtr
 	};
 
 	boost::shared_ptr<ShuttleControllable> controllable() const { return _controllable; }
+	void set_colors ();
 
   protected:
 	bool _hovering;
@@ -63,6 +64,7 @@ class ShuttleControl : public CairoWidget, public ARDOUR::SessionHandlePtr
 	float  last_speed_displayed;
 	bool   shuttle_grabbed;
 	double shuttle_speed_on_grab;
+	double requested_speed;
 	float shuttle_fract;
 	boost::shared_ptr<ShuttleControllable> _controllable;
 	cairo_pattern_t* pattern;
@@ -73,7 +75,11 @@ class ShuttleControl : public CairoWidget, public ARDOUR::SessionHandlePtr
 	Gtk::Menu*        shuttle_style_menu;
 	Gtk::Menu*        shuttle_context_menu;
 	BindingProxy      binding_proxy;
-
+	Glib::RefPtr<Pango::Layout> left_text;
+	Glib::RefPtr<Pango::Layout> right_text;
+	Pango::AttrList text_attributes;
+	Pango::AttrColor* text_color;
+	float bg_r, bg_g, bg_b;
 	void build_shuttle_context_menu ();
 	void show_shuttle_context_menu ();
 	void shuttle_style_changed();
diff --git a/gtk2_ardour/simple_progress_dialog.h b/gtk2_ardour/simple_progress_dialog.h
new file mode 100644
index 0000000..1e76f6b
--- /dev/null
+++ b/gtk2_ardour/simple_progress_dialog.h
@@ -0,0 +1,39 @@
+#ifndef _ardour_gtk_simpple_progress_dialog_h_
+#define _ardour_gtk_simpple_progress_dialog_h_
+
+#include <gtkmm/messagedialog.h>
+#include <gtkmm/button.h>
+#include <gtkmm/progressbar.h>
+
+#include "ardour/types.h"
+
+class SimpleProgressDialog : public Gtk::MessageDialog
+{
+public:
+	SimpleProgressDialog (std::string title, const Glib::SignalProxy0< void >::SlotType & cancel)
+		: MessageDialog (title, false, MESSAGE_OTHER, BUTTONS_NONE, true)
+	{
+		get_vbox()->set_size_request(400,-1);
+		set_title (title);
+		pbar = manage (new Gtk::ProgressBar());
+		pbar->show();
+		get_vbox()->pack_start (*pbar, PACK_SHRINK, 4);
+
+		Gtk::Button *cancel_button = add_button (Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
+		cancel_button->signal_clicked().connect (cancel);
+		cancel_button->show();
+		get_vbox()->pack_start (*cancel_button, PACK_SHRINK);
+	}
+
+	void update_progress (framecnt_t c, framecnt_t t) {
+		pbar->set_fraction ((float) c / (float) t);
+		// see also ARDOUR_UI::gui_idle_handler();
+		int timeout = 30;
+		while (gtk_events_pending() && --timeout) {
+			gtk_main_iteration ();
+		}
+	}
+private:
+	Gtk::ProgressBar *pbar;
+};
+#endif
diff --git a/gtk2_ardour/soundcloud_export_selector.cc b/gtk2_ardour/soundcloud_export_selector.cc
index 524c462..e7e43ad 100644
--- a/gtk2_ardour/soundcloud_export_selector.cc
+++ b/gtk2_ardour/soundcloud_export_selector.cc
@@ -32,7 +32,7 @@
 #include <iostream>
 #include "pbd/gstdio_compat.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace PBD;
 
diff --git a/gtk2_ardour/speaker_dialog.cc b/gtk2_ardour/speaker_dialog.cc
index 3578682..3831094 100644
--- a/gtk2_ardour/speaker_dialog.cc
+++ b/gtk2_ardour/speaker_dialog.cc
@@ -24,7 +24,7 @@
 #include "speaker_dialog.h"
 #include "gui_thread.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 using namespace PBD;
diff --git a/gtk2_ardour/splash.cc b/gtk2_ardour/splash.cc
index c252247..1784ac8 100644
--- a/gtk2_ardour/splash.cc
+++ b/gtk2_ardour/splash.cc
@@ -34,7 +34,7 @@
 #include "gui_thread.h"
 #include "splash.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace Gtk;
 using namespace Glib;
@@ -50,7 +50,10 @@ Splash::Splash ()
 
 	std::string splash_file;
 
-	if (!find_file (ardour_data_search_path(), "splash.png", splash_file)) {
+	Searchpath rc (ARDOUR::ardour_data_search_path());
+	rc.add_subdirectory_to_paths ("resources");
+
+	if (!find_file (rc, PROGRAM_NAME "-splash.png", splash_file)) {
                 cerr << "Cannot find splash screen image file\n";
 		throw failed_constructor();
 	}
@@ -111,9 +114,9 @@ Splash::pop_back_for (Gtk::Window& win)
 
            So for OS X, we just hide ourselves.
 
-					 Oct 2014: The Windows situation is similar, although it should be possible
-					 to play tricks with gdk's set_type_hint() or directly hack things using
-					 SetWindowLong() and UpdateLayeredWindow()
+           Oct 2014: The Windows situation is similar, although it should be possible
+           to play tricks with gdk's set_type_hint() or directly hack things using
+           SetWindowLong() and UpdateLayeredWindow()
         */
         (void) win;
         hide();
diff --git a/gtk2_ardour/startup.cc b/gtk2_ardour/startup.cc
index 40dbc73..12f9891 100644
--- a/gtk2_ardour/startup.cc
+++ b/gtk2_ardour/startup.cc
@@ -46,11 +46,12 @@
 #include "ardour/session.h"
 #include "ardour/session_state_utils.h"
 #include "ardour/template_utils.h"
+#include "ardour/profile.h"
 
 #include "startup.h"
 #include "opts.h"
 #include "engine_dialog.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
 #include "utils.h"
 
 using namespace std;
@@ -79,23 +80,23 @@ ArdourStartup::ArdourStartup ()
 	set_position (WIN_POS_CENTER);
 	set_border_width (12);
 
-	if ((icon_pixbuf = ::get_icon ("ardour_icon_48px")) == 0) {
+	if (! (icon_pixbuf = ::get_icon (PROGRAM_NAME "-icon_48px"))) {
 		throw failed_constructor();
 	}
 
 	list<Glib::RefPtr<Gdk::Pixbuf> > window_icons;
 	Glib::RefPtr<Gdk::Pixbuf> icon;
 
-	if ((icon = ::get_icon ("ardour_icon_16px")) != 0) {
+	if ((icon = ::get_icon (PROGRAM_NAME "-icon_16px"))) {
 		window_icons.push_back (icon);
 	}
-	if ((icon = ::get_icon ("ardour_icon_22px")) != 0) {
+	if ((icon = ::get_icon (PROGRAM_NAME "-icon_22px"))) {
 		window_icons.push_back (icon);
 	}
-	if ((icon = ::get_icon ("ardour_icon_32px")) != 0) {
+	if ((icon = ::get_icon (PROGRAM_NAME "-icon_32px"))) {
 		window_icons.push_back (icon);
 	}
-	if ((icon = ::get_icon ("ardour_icon_48px")) != 0) {
+	if ((icon = ::get_icon (PROGRAM_NAME "-icon_48px"))) {
 		window_icons.push_back (icon);
 	}
 	if (!window_icons.empty ()) {
@@ -357,7 +358,9 @@ ArdourStartup::setup_final_page ()
 
 	VBox* vbox = manage (new VBox);
 	vbox->pack_start (*final_label, true, true);
-	vbox->pack_start (plugin_disco_button, true, false);
+	if (!Profile->get_mixbus()) {
+		vbox->pack_start (plugin_disco_button, true, false);
+	}
 	vbox->show ();
 
 	final_page_index = append_page (*vbox);
diff --git a/gtk2_ardour/startup.h b/gtk2_ardour/startup.h
index 74e0aee..e27b1c1 100644
--- a/gtk2_ardour/startup.h
+++ b/gtk2_ardour/startup.h
@@ -69,6 +69,7 @@ class ArdourStartup : public Gtk::Assistant {
 
 	Glib::RefPtr<Gdk::Pixbuf> icon_pixbuf;
 
+	void setup_prerelease_page ();
 	void setup_new_user_page ();
 	Glib::RefPtr<Gdk::Pixbuf> splash_pixbuf;
 	Gtk::DrawingArea splash_area;
diff --git a/gtk2_ardour/step_editing.bindings b/gtk2_ardour/step_editing.bindings
index 313bee3..ee41ab4 100644
--- a/gtk2_ardour/step_editing.bindings
+++ b/gtk2_ardour/step_editing.bindings
@@ -1,5 +1,4 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<Bindings name="logic">
+<Bindings name="Step Editing">
   <Press>
      <Binding key="grave" action="StepEditing/octave-0"/>
      <Binding key="1" action="StepEditing/octave-1"/>
diff --git a/gtk2_ardour/step_editor.cc b/gtk2_ardour/step_editor.cc
index e19f89f..3ea3bb4 100644
--- a/gtk2_ardour/step_editor.cc
+++ b/gtk2_ardour/step_editor.cc
@@ -115,10 +115,14 @@ StepEditor::prepare_step_edit_region ()
 
 	} else {
 
-		const Meter& m = _mtv.session()->tempo_map().meter_at (step_edit_insert_position);
-		const Tempo& t = _mtv.session()->tempo_map().tempo_at (step_edit_insert_position);
+		const Meter& m = _mtv.session()->tempo_map().meter_at_frame (step_edit_insert_position);
 
-		step_edit_region = _mtv.add_region (step_edit_insert_position, floor (m.frames_per_bar (t, _mtv.session()->frame_rate())), true);
+		double baf = _mtv.session()->tempo_map().beat_at_frame (step_edit_insert_position);
+		double next_bar_in_beats =  baf + m.divisions_per_bar();
+		framecnt_t next_bar_pos = _mtv.session()->tempo_map().frame_at_beat (next_bar_in_beats);
+		framecnt_t len = next_bar_pos - step_edit_insert_position;
+
+		step_edit_region = _mtv.add_region (step_edit_insert_position, len, true, _editor.get_grid_music_divisions (0));
 
 		RegionView* rv = _mtv.midi_view()->find_view (step_edit_region);
 		step_edit_region_view = dynamic_cast<MidiRegionView*>(rv);
@@ -320,6 +324,8 @@ StepEditor::step_add_note (uint8_t channel, uint8_t pitch, uint8_t velocity, Evo
 		_step_edit_chord_duration = max (_step_edit_chord_duration, beat_duration);
 	}
 
+	step_edit_region_view->set_step_edit_cursor_width (step_editor->note_length());
+
 	return 0;
 }
 
diff --git a/gtk2_ardour/step_editor.h b/gtk2_ardour/step_editor.h
index 31632a8..b16cd8f 100644
--- a/gtk2_ardour/step_editor.h
+++ b/gtk2_ardour/step_editor.h
@@ -25,7 +25,7 @@
 #include <sigc++/trackable.h>
 
 #include "pbd/signals.h"
-#include "evoral/types.hpp"
+#include "evoral/Beats.hpp"
 
 namespace ARDOUR {
 class MidiTrack;
diff --git a/gtk2_ardour/step_entry.cc b/gtk2_ardour/step_entry.cc
index 366a9e1..855766b 100644
--- a/gtk2_ardour/step_entry.cc
+++ b/gtk2_ardour/step_entry.cc
@@ -21,9 +21,8 @@
 
 #include "pbd/file_utils.h"
 
-#include "gtkmm2ext/keyboard.h"
 #include "gtkmm2ext/actions.h"
-#include "gtkmm2ext/bindings.h"
+#include "gtkmm2ext/keyboard.h"
 
 #include "ardour/filesystem_paths.h"
 
@@ -34,7 +33,7 @@
 #include "tooltips.h"
 #include "utils.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace Gtk;
@@ -86,6 +85,7 @@ StepEntry::StepEntry (StepEditor& seditor)
 	, _piano (0)
 	, piano (0)
 	, se (&seditor)
+	, myactions (X_("step entry"))
 {
         register_actions ();
         load_bindings ();
@@ -496,26 +496,18 @@ StepEntry::on_key_press_event (GdkEventKey* ev)
            forward to main window
         */
 
-	if (!gtk_window_propagate_key_event (GTK_WINDOW(gobj()), ev)) {
-                KeyboardKey k (ev->state, ev->keyval);
-
-                if (bindings.activate (k, Bindings::Press)) {
-                        return true;
-                }
+	if (gtk_window_propagate_key_event (GTK_WINDOW(gobj()), ev)) {
+		return true;
 	}
 
-        return forward_key_press (ev);
+	return relay_key_press (ev, this);
 }
 
 bool
 StepEntry::on_key_release_event (GdkEventKey* ev)
 {
-	if (!gtk_window_propagate_key_event (GTK_WINDOW(gobj()), ev)) {
-                KeyboardKey k (ev->state, ev->keyval);
-
-                if (bindings.activate (k, Bindings::Release)) {
-                        return true;
-                }
+	if (gtk_window_propagate_key_event (GTK_WINDOW(gobj()), ev)) {
+		return true;
 	}
 
         /* don't forward releases */
@@ -593,126 +585,117 @@ StepEntry::bar_resync_click ()
 void
 StepEntry::register_actions ()
 {
-	/* add named actions for the editor */
-
-	myactions.register_action ("StepEditing", "insert-a", _("Insert Note A"), sigc::mem_fun (*this, &StepEntry::insert_a));
-	myactions.register_action ("StepEditing", "insert-asharp", _("Insert Note A-sharp"), sigc::mem_fun (*this, &StepEntry::insert_asharp));
-	myactions.register_action ("StepEditing", "insert-b", _("Insert Note B"), sigc::mem_fun (*this, &StepEntry::insert_b));
-	myactions.register_action ("StepEditing", "insert-c", _("Insert Note C"), sigc::mem_fun (*this, &StepEntry::insert_c));
-	myactions.register_action ("StepEditing", "insert-csharp", _("Insert Note C-sharp"), sigc::mem_fun (*this, &StepEntry::insert_csharp));
-	myactions.register_action ("StepEditing", "insert-d", _("Insert Note D"), sigc::mem_fun (*this, &StepEntry::insert_d));
-	myactions.register_action ("StepEditing", "insert-dsharp", _("Insert Note D-sharp"), sigc::mem_fun (*this, &StepEntry::insert_dsharp));
-	myactions.register_action ("StepEditing", "insert-e", _("Insert Note E"), sigc::mem_fun (*this, &StepEntry::insert_e));
-	myactions.register_action ("StepEditing", "insert-f", _("Insert Note F"), sigc::mem_fun (*this, &StepEntry::insert_f));
-	myactions.register_action ("StepEditing", "insert-fsharp", _("Insert Note F-sharp"), sigc::mem_fun (*this, &StepEntry::insert_fsharp));
-	myactions.register_action ("StepEditing", "insert-g", _("Insert Note G"), sigc::mem_fun (*this, &StepEntry::insert_g));
-	myactions.register_action ("StepEditing", "insert-gsharp", _("Insert Note G-sharp"), sigc::mem_fun (*this, &StepEntry::insert_gsharp));
-
-	myactions.register_action ("StepEditing", "insert-rest", _("Insert a Note-length Rest"), sigc::mem_fun (*this, &StepEntry::insert_rest));
-	myactions.register_action ("StepEditing", "insert-snap-rest", _("Insert a Snap-length Rest"), sigc::mem_fun (*this, &StepEntry::insert_grid_rest));
-
-	myactions.register_action ("StepEditing", "next-octave", _("Move to next octave"), sigc::mem_fun (*this, &StepEntry::next_octave));
-	myactions.register_action ("StepEditing", "prev-octave", _("Move to next octave"), sigc::mem_fun (*this, &StepEntry::prev_octave));
-
-	myactions.register_action ("StepEditing", "next-note-length", _("Move to Next Note Length"), sigc::mem_fun (*this, &StepEntry::next_note_length));
-	myactions.register_action ("StepEditing", "prev-note-length", _("Move to Previous Note Length"), sigc::mem_fun (*this, &StepEntry::prev_note_length));
-
-	myactions.register_action ("StepEditing", "inc-note-length", _("Increase Note Length"), sigc::mem_fun (*this, &StepEntry::inc_note_length));
-	myactions.register_action ("StepEditing", "dec-note-length", _("Decrease Note Length"), sigc::mem_fun (*this, &StepEntry::dec_note_length));
-
-	myactions.register_action ("StepEditing", "next-note-velocity", _("Move to Next Note Velocity"), sigc::mem_fun (*this, &StepEntry::next_note_velocity));
-	myactions.register_action ("StepEditing", "prev-note-velocity", _("Move to Previous Note Velocity"), sigc::mem_fun (*this, &StepEntry::prev_note_velocity));
-
-	myactions.register_action ("StepEditing", "inc-note-velocity", _("Increase Note Velocity"), sigc::mem_fun (*this, &StepEntry::inc_note_velocity));
-	myactions.register_action ("StepEditing", "dec-note-velocity", _("Decrease Note Velocity"), sigc::mem_fun (*this, &StepEntry::dec_note_velocity));
-
-	myactions.register_action ("StepEditing", "octave-0", _("Switch to the 1st octave"), sigc::mem_fun (*this, &StepEntry::octave_0));
-	myactions.register_action ("StepEditing", "octave-1", _("Switch to the 2nd octave"), sigc::mem_fun (*this, &StepEntry::octave_1));
-	myactions.register_action ("StepEditing", "octave-2", _("Switch to the 3rd octave"), sigc::mem_fun (*this, &StepEntry::octave_2));
-	myactions.register_action ("StepEditing", "octave-3", _("Switch to the 4th octave"), sigc::mem_fun (*this, &StepEntry::octave_3));
-	myactions.register_action ("StepEditing", "octave-4", _("Switch to the 5th octave"), sigc::mem_fun (*this, &StepEntry::octave_4));
-	myactions.register_action ("StepEditing", "octave-5", _("Switch to the 6th octave"), sigc::mem_fun (*this, &StepEntry::octave_5));
-	myactions.register_action ("StepEditing", "octave-6", _("Switch to the 7th octave"), sigc::mem_fun (*this, &StepEntry::octave_6));
-	myactions.register_action ("StepEditing", "octave-7", _("Switch to the 8th octave"), sigc::mem_fun (*this, &StepEntry::octave_7));
-	myactions.register_action ("StepEditing", "octave-8", _("Switch to the 9th octave"), sigc::mem_fun (*this, &StepEntry::octave_8));
-	myactions.register_action ("StepEditing", "octave-9", _("Switch to the 10th octave"), sigc::mem_fun (*this, &StepEntry::octave_9));
-	myactions.register_action ("StepEditing", "octave-10", _("Switch to the 11th octave"), sigc::mem_fun (*this, &StepEntry::octave_10));
+	/* add named actions for the step editor */
+
+	Glib::RefPtr<ActionGroup> group = myactions.create_action_group (X_("StepEditing"));
+
+	myactions.register_action (group, "insert-a", _("Insert Note A"), sigc::mem_fun (*this, &StepEntry::insert_a));
+	myactions.register_action (group, "insert-asharp", _("Insert Note A-sharp"), sigc::mem_fun (*this, &StepEntry::insert_asharp));
+	myactions.register_action (group, "insert-b", _("Insert Note B"), sigc::mem_fun (*this, &StepEntry::insert_b));
+	myactions.register_action (group, "insert-c", _("Insert Note C"), sigc::mem_fun (*this, &StepEntry::insert_c));
+	myactions.register_action (group, "insert-csharp", _("Insert Note C-sharp"), sigc::mem_fun (*this, &StepEntry::insert_csharp));
+	myactions.register_action (group, "insert-d", _("Insert Note D"), sigc::mem_fun (*this, &StepEntry::insert_d));
+	myactions.register_action (group, "insert-dsharp", _("Insert Note D-sharp"), sigc::mem_fun (*this, &StepEntry::insert_dsharp));
+	myactions.register_action (group, "insert-e", _("Insert Note E"), sigc::mem_fun (*this, &StepEntry::insert_e));
+	myactions.register_action (group, "insert-f", _("Insert Note F"), sigc::mem_fun (*this, &StepEntry::insert_f));
+	myactions.register_action (group, "insert-fsharp", _("Insert Note F-sharp"), sigc::mem_fun (*this, &StepEntry::insert_fsharp));
+	myactions.register_action (group, "insert-g", _("Insert Note G"), sigc::mem_fun (*this, &StepEntry::insert_g));
+	myactions.register_action (group, "insert-gsharp", _("Insert Note G-sharp"), sigc::mem_fun (*this, &StepEntry::insert_gsharp));
+
+	myactions.register_action (group, "insert-rest", _("Insert a Note-length Rest"), sigc::mem_fun (*this, &StepEntry::insert_rest));
+	myactions.register_action (group, "insert-snap-rest", _("Insert a Snap-length Rest"), sigc::mem_fun (*this, &StepEntry::insert_grid_rest));
+
+	myactions.register_action (group, "next-octave", _("Move to next octave"), sigc::mem_fun (*this, &StepEntry::next_octave));
+	myactions.register_action (group, "prev-octave", _("Move to next octave"), sigc::mem_fun (*this, &StepEntry::prev_octave));
+
+	myactions.register_action (group, "next-note-length", _("Move to Next Note Length"), sigc::mem_fun (*this, &StepEntry::next_note_length));
+	myactions.register_action (group, "prev-note-length", _("Move to Previous Note Length"), sigc::mem_fun (*this, &StepEntry::prev_note_length));
+
+	myactions.register_action (group, "inc-note-length", _("Increase Note Length"), sigc::mem_fun (*this, &StepEntry::inc_note_length));
+	myactions.register_action (group, "dec-note-length", _("Decrease Note Length"), sigc::mem_fun (*this, &StepEntry::dec_note_length));
+
+	myactions.register_action (group, "next-note-velocity", _("Move to Next Note Velocity"), sigc::mem_fun (*this, &StepEntry::next_note_velocity));
+	myactions.register_action (group, "prev-note-velocity", _("Move to Previous Note Velocity"), sigc::mem_fun (*this, &StepEntry::prev_note_velocity));
+
+	myactions.register_action (group, "inc-note-velocity", _("Increase Note Velocity"), sigc::mem_fun (*this, &StepEntry::inc_note_velocity));
+	myactions.register_action (group, "dec-note-velocity", _("Decrease Note Velocity"), sigc::mem_fun (*this, &StepEntry::dec_note_velocity));
+
+	myactions.register_action (group, "octave-0", _("Switch to the 1st octave"), sigc::mem_fun (*this, &StepEntry::octave_0));
+	myactions.register_action (group, "octave-1", _("Switch to the 2nd octave"), sigc::mem_fun (*this, &StepEntry::octave_1));
+	myactions.register_action (group, "octave-2", _("Switch to the 3rd octave"), sigc::mem_fun (*this, &StepEntry::octave_2));
+	myactions.register_action (group, "octave-3", _("Switch to the 4th octave"), sigc::mem_fun (*this, &StepEntry::octave_3));
+	myactions.register_action (group, "octave-4", _("Switch to the 5th octave"), sigc::mem_fun (*this, &StepEntry::octave_4));
+	myactions.register_action (group, "octave-5", _("Switch to the 6th octave"), sigc::mem_fun (*this, &StepEntry::octave_5));
+	myactions.register_action (group, "octave-6", _("Switch to the 7th octave"), sigc::mem_fun (*this, &StepEntry::octave_6));
+	myactions.register_action (group, "octave-7", _("Switch to the 8th octave"), sigc::mem_fun (*this, &StepEntry::octave_7));
+	myactions.register_action (group, "octave-8", _("Switch to the 9th octave"), sigc::mem_fun (*this, &StepEntry::octave_8));
+	myactions.register_action (group, "octave-9", _("Switch to the 10th octave"), sigc::mem_fun (*this, &StepEntry::octave_9));
+	myactions.register_action (group, "octave-10", _("Switch to the 11th octave"), sigc::mem_fun (*this, &StepEntry::octave_10));
+
+        myactions.register_toggle_action (group, "toggle-triplet", _("Toggle Triple Notes"),
+                                          sigc::mem_fun (*this, &StepEntry::toggle_triplet));
+
+        myactions.register_toggle_action (group, "toggle-chord", _("Toggle Chord Entry"),
+                                          sigc::mem_fun (*this, &StepEntry::toggle_chord));
+        myactions.register_action (group, "sustain", _("Sustain Selected Notes by Note Length"),
+                                   sigc::mem_fun (*this, &StepEntry::do_sustain));
 
+        myactions.register_action (group, "sync-to-edit-point", _("Move Insert Position to Edit Point"),
+                                   sigc::mem_fun (*this, &StepEntry::sync_to_edit_point));
+        myactions.register_action (group, "back", _("Move Insert Position Back by Note Length"),
+                                   sigc::mem_fun (*this, &StepEntry::back));
         RadioAction::Group note_length_group;
 
-        myactions.register_radio_action ("StepEditing", note_length_group, "note-length-whole",
+        myactions.register_radio_action (group, note_length_group, "note-length-whole",
                                          _("Set Note Length to Whole"), sigc::mem_fun (*this, &StepEntry::note_length_change), 1);
-        myactions.register_radio_action ("StepEditing", note_length_group, "note-length-half",
+        myactions.register_radio_action (group, note_length_group, "note-length-half",
                                          _("Set Note Length to 1/2"), sigc::mem_fun (*this, &StepEntry::note_length_change), 2);
-        myactions.register_radio_action ("StepEditing", note_length_group, "note-length-third",
+        myactions.register_radio_action (group, note_length_group, "note-length-third",
                                          _("Set Note Length to 1/3"), sigc::mem_fun (*this, &StepEntry::note_length_change), 3);
-        myactions.register_radio_action ("StepEditing", note_length_group, "note-length-quarter",
+        myactions.register_radio_action (group, note_length_group, "note-length-quarter",
                                          _("Set Note Length to 1/4"), sigc::mem_fun (*this, &StepEntry::note_length_change), 4);
-        myactions.register_radio_action ("StepEditing", note_length_group, "note-length-eighth",
+        myactions.register_radio_action (group, note_length_group, "note-length-eighth",
                                          _("Set Note Length to 1/8"), sigc::mem_fun (*this, &StepEntry::note_length_change), 8);
-        myactions.register_radio_action ("StepEditing", note_length_group, "note-length-sixteenth",
+        myactions.register_radio_action (group, note_length_group, "note-length-sixteenth",
                                          _("Set Note Length to 1/16"), sigc::mem_fun (*this, &StepEntry::note_length_change), 16);
-        myactions.register_radio_action ("StepEditing", note_length_group, "note-length-thirtysecond",
+        myactions.register_radio_action (group, note_length_group, "note-length-thirtysecond",
                                          _("Set Note Length to 1/32"), sigc::mem_fun (*this, &StepEntry::note_length_change), 32);
-        myactions.register_radio_action ("StepEditing", note_length_group, "note-length-sixtyfourth",
+        myactions.register_radio_action (group, note_length_group, "note-length-sixtyfourth",
                                          _("Set Note Length to 1/64"), sigc::mem_fun (*this, &StepEntry::note_length_change), 64);
 
         RadioAction::Group note_velocity_group;
 
-	myactions.register_radio_action ("StepEditing", note_velocity_group, "note-velocity-ppp",
+        myactions.register_radio_action (group, note_velocity_group, "note-velocity-ppp",
                                          _("Set Note Velocity to Pianississimo"), sigc::mem_fun (*this, &StepEntry::note_velocity_change), 1);
-	myactions.register_radio_action ("StepEditing", note_velocity_group, "note-velocity-pp",
+        myactions.register_radio_action (group, note_velocity_group, "note-velocity-pp",
                                          _("Set Note Velocity to Pianissimo"), sigc::mem_fun (*this, &StepEntry::note_velocity_change), 16);
-	myactions.register_radio_action ("StepEditing", note_velocity_group, "note-velocity-p",
+        myactions.register_radio_action (group, note_velocity_group, "note-velocity-p",
                                          _("Set Note Velocity to Piano"), sigc::mem_fun (*this, &StepEntry::note_velocity_change), 32);
-	myactions.register_radio_action ("StepEditing", note_velocity_group, "note-velocity-mp",
+        myactions.register_radio_action (group, note_velocity_group, "note-velocity-mp",
                                          _("Set Note Velocity to Mezzo-Piano"), sigc::mem_fun (*this, &StepEntry::note_velocity_change), 64);
-	myactions.register_radio_action ("StepEditing", note_velocity_group, "note-velocity-mf",
+        myactions.register_radio_action (group, note_velocity_group, "note-velocity-mf",
                                          _("Set Note Velocity to Mezzo-Forte"), sigc::mem_fun (*this, &StepEntry::note_velocity_change), 80);
-	myactions.register_radio_action ("StepEditing", note_velocity_group, "note-velocity-f",
+        myactions.register_radio_action (group, note_velocity_group, "note-velocity-f",
                                          _("Set Note Velocity to Forte"), sigc::mem_fun (*this, &StepEntry::note_velocity_change), 96);
-	myactions.register_radio_action ("StepEditing", note_velocity_group, "note-velocity-ff",
+        myactions.register_radio_action (group, note_velocity_group, "note-velocity-ff",
                                          _("Set Note Velocity to Fortississimo"), sigc::mem_fun (*this, &StepEntry::note_velocity_change), 112);
-	myactions.register_radio_action ("StepEditing", note_velocity_group, "note-velocity-fff",
+        myactions.register_radio_action (group, note_velocity_group, "note-velocity-fff",
                                          _("Set Note Velocity to Fortississimo"), sigc::mem_fun (*this, &StepEntry::note_velocity_change), 127);
 
-        myactions.register_toggle_action ("StepEditing", "toggle-triplet", _("Toggle Triple Notes"),
-                                          sigc::mem_fun (*this, &StepEntry::toggle_triplet));
 
         RadioAction::Group dot_group;
 
-        myactions.register_radio_action ("StepEditing", dot_group, "no-dotted", _("No Dotted Notes"),
-                                         sigc::mem_fun (*this, &StepEntry::dot_change), 0);
-        myactions.register_radio_action ("StepEditing", dot_group, "toggle-dotted", _("Toggled Dotted Notes"),
-                                         sigc::mem_fun (*this, &StepEntry::dot_change), 1);
-        myactions.register_radio_action ("StepEditing", dot_group, "toggle-double-dotted", _("Toggled Double-Dotted Notes"),
-                                         sigc::mem_fun (*this, &StepEntry::dot_change), 2);
-        myactions.register_radio_action ("StepEditing", dot_group, "toggle-triple-dotted", _("Toggled Triple-Dotted Notes"),
-                                         sigc::mem_fun (*this, &StepEntry::dot_change), 3);
-
-        myactions.register_toggle_action ("StepEditing", "toggle-chord", _("Toggle Chord Entry"),
-                                          sigc::mem_fun (*this, &StepEntry::toggle_chord));
-        myactions.register_action ("StepEditing", "sustain", _("Sustain Selected Notes by Note Length"),
-                                   sigc::mem_fun (*this, &StepEntry::do_sustain));
-
-        myactions.register_action ("StepEditing", "sync-to-edit-point", _("Move Insert Position to Edit Point"),
-                                   sigc::mem_fun (*this, &StepEntry::sync_to_edit_point));
-        myactions.register_action ("StepEditing", "back", _("Move Insert Position Back by Note Length"),
-                                   sigc::mem_fun (*this, &StepEntry::back));
+        myactions.register_radio_action (group, dot_group, "no-dotted", _("No Dotted Notes"), sigc::mem_fun (*this, &StepEntry::dot_change), 0);
+        myactions.register_radio_action (group, dot_group, "toggle-dotted", _("Toggled Dotted Notes"), sigc::mem_fun (*this, &StepEntry::dot_change), 1);
+        myactions.register_radio_action (group, dot_group, "toggle-double-dotted", _("Toggled Double-Dotted Notes"), sigc::mem_fun (*this, &StepEntry::dot_change), 2);
+        myactions.register_radio_action (group, dot_group, "toggle-triple-dotted", _("Toggled Triple-Dotted Notes"), sigc::mem_fun (*this, &StepEntry::dot_change), 3);
 }
 
 void
 StepEntry::load_bindings ()
 {
-        /* XXX move this to a better place */
-
-        bindings.set_action_map (myactions);
-
-	std::string binding_file;
-
-	if (find_file (ardour_config_search_path(), "step_editing.bindings", binding_file)) {
-                bindings.load (binding_file);
-        }
+	bindings = Bindings::get_bindings (X_("Step Editing"), myactions);
+        set_data ("ardour-bindings", bindings);
 }
 
 void
diff --git a/gtk2_ardour/step_entry.h b/gtk2_ardour/step_entry.h
index bd354f3..26c46d5 100644
--- a/gtk2_ardour/step_entry.h
+++ b/gtk2_ardour/step_entry.h
@@ -140,7 +140,6 @@ class StepEntry : public ArdourWindow
         /* actions */
 
         void register_actions ();
-        Gtkmm2ext::ActionMap myactions;
 
         void insert_note (uint8_t);
         void insert_rest ();
@@ -166,7 +165,8 @@ class StepEntry : public ArdourWindow
         bool radio_button_release (GdkEventButton*, Gtk::RadioButton*, int);
 
         void load_bindings ();
-        Gtkmm2ext::Bindings  bindings;
+	Gtkmm2ext::ActionMap myactions;
+	Gtkmm2ext::Bindings*  bindings;
 
         void inc_note_velocity ();
         void dec_note_velocity ();
diff --git a/gtk2_ardour/stereo_panner.cc b/gtk2_ardour/stereo_panner.cc
index 304300f..d528cb1 100644
--- a/gtk2_ardour/stereo_panner.cc
+++ b/gtk2_ardour/stereo_panner.cc
@@ -45,7 +45,7 @@
 #include "utils.h"
 #include "ui_config.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace Gtk;
diff --git a/gtk2_ardour/stereo_panner_editor.cc b/gtk2_ardour/stereo_panner_editor.cc
index 477a665..9154b37 100644
--- a/gtk2_ardour/stereo_panner_editor.cc
+++ b/gtk2_ardour/stereo_panner_editor.cc
@@ -25,7 +25,7 @@
 #include "pbd/controllable.h"
 #include "stereo_panner_editor.h"
 #include "stereo_panner.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace Gtk;
diff --git a/gtk2_ardour/streamview.cc b/gtk2_ardour/streamview.cc
index c737f78..bcab05b 100644
--- a/gtk2_ardour/streamview.cc
+++ b/gtk2_ardour/streamview.cc
@@ -45,7 +45,7 @@
 #include "ui_config.h"
 #include "utils.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
@@ -78,7 +78,7 @@ StreamView::StreamView (RouteTimeAxisView& tv, ArdourCanvas::Container* canvas_g
 
 	if (_trackview.is_track()) {
 		_trackview.track()->DiskstreamChanged.connect (*this, invalidator (*this), boost::bind (&StreamView::diskstream_changed, this), gui_context());
-		_trackview.track()->RecordEnableChanged.connect (*this, invalidator (*this), boost::bind (&StreamView::rec_enable_changed, this), gui_context());
+		_trackview.track()->rec_enable_control()->Changed.connect (*this, invalidator (*this), boost::bind (&StreamView::rec_enable_changed, this), gui_context());
 
 		_trackview.session()->TransportStateChange.connect (*this, invalidator (*this), boost::bind (&StreamView::transport_changed, this), gui_context());
 		_trackview.session()->TransportLooped.connect (*this, invalidator (*this), boost::bind (&StreamView::transport_looped, this), gui_context());
@@ -119,7 +119,7 @@ StreamView::set_height (double h)
 		return -1;
 	}
 
-	if (canvas_rect->y1() == h) {
+	if (height == h) {
 		return 0;
 	}
 
@@ -139,6 +139,10 @@ StreamView::set_samples_per_pixel (double fpp)
 		return -1;
 	}
 
+	if (fpp == _samples_per_pixel) {
+		return 0;
+	}
+
 	_samples_per_pixel = fpp;
 
 	for (i = region_views.begin(); i != region_views.end(); ++i) {
@@ -292,6 +296,7 @@ StreamView::playlist_layered (boost::weak_ptr<Track> wtr)
 
 	if (_layer_display == Stacked) {
 		update_contents_height ();
+		/* tricky. playlist_changed() does this as well, and its really inefficient. */
 		update_coverage_frames ();
 	} else {
 		/* layering has probably been modified. reflect this in the canvas. */
@@ -311,12 +316,12 @@ StreamView::playlist_switched (boost::weak_ptr<Track> wtr)
 	/* disconnect from old playlist */
 
 	playlist_connections.drop_connections ();
-	undisplay_track ();
+	//undisplay_track ();
 
 	/* draw it */
-
+	tr->playlist()->freeze();
 	redisplay_track ();
-
+	tr->playlist()->thaw();
 	/* update layers count and the y positions and heights of our regions */
 	_layers = tr->playlist()->top_layer() + 1;
 	update_contents_height ();
@@ -494,7 +499,7 @@ StreamView::num_selected_regionviews () const
 	uint32_t cnt = 0;
 
 	for (list<RegionView*>::const_iterator i = region_views.begin(); i != region_views.end(); ++i) {
-		if ((*i)->get_selected()) {
+		if ((*i)->selected()) {
 			++cnt;
 		}
 	}
@@ -513,7 +518,7 @@ void
 StreamView::foreach_selected_regionview (sigc::slot<void,RegionView*> slot)
 {
 	for (list<RegionView*>::iterator i = region_views.begin(); i != region_views.end(); ++i) {
-		if ((*i)->get_selected()) {
+		if ((*i)->selected()) {
 			slot (*i);
 		}
 	}
diff --git a/gtk2_ardour/strip_silence_dialog.cc b/gtk2_ardour/strip_silence_dialog.cc
index cd41950..823138e 100644
--- a/gtk2_ardour/strip_silence_dialog.cc
+++ b/gtk2_ardour/strip_silence_dialog.cc
@@ -32,7 +32,7 @@
 #include "strip_silence_dialog.h"
 #include "region_view.h"
 #include "rgb_macros.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
 #include "logmeter.h"
 
 using namespace ARDOUR;
@@ -64,7 +64,7 @@ StripSilenceDialog::StripSilenceDialog (Session* s, list<RegionView*> const & v)
 
 	table->attach (*Gtk::manage (new Gtk::Label (_("Threshold"), 1, 0.5)), 0, 1, n, n + 1, Gtk::FILL);
 	table->attach (_threshold, 1, 2, n, n + 1, Gtk::FILL);
-	table->attach (*Gtk::manage (new Gtk::Label (_("dbFS"))), 2, 3, n, n + 1, Gtk::FILL);
+	table->attach (*Gtk::manage (new Gtk::Label (_("dBFS"))), 2, 3, n, n + 1, Gtk::FILL);
 	++n;
 
 	_threshold.set_digits (1);
diff --git a/gtk2_ardour/tape_region_view.cc b/gtk2_ardour/tape_region_view.cc
index 2d71bdf..214686e 100644
--- a/gtk2_ardour/tape_region_view.cc
+++ b/gtk2_ardour/tape_region_view.cc
@@ -31,7 +31,7 @@
 #include "audio_time_axis.h"
 #include "gui_thread.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 using namespace PBD;
diff --git a/gtk2_ardour/tempo_curve.cc b/gtk2_ardour/tempo_curve.cc
new file mode 100644
index 0000000..db675c9
--- /dev/null
+++ b/gtk2_ardour/tempo_curve.cc
@@ -0,0 +1,181 @@
+#include <sigc++/bind.h>
+#include "ardour/tempo.h"
+
+#include "canvas/rectangle.h"
+#include "canvas/container.h"
+#include "canvas/curve.h"
+#include "canvas/canvas.h"
+#include "canvas/debug.h"
+
+#include "ui_config.h"
+
+#include "tempo_curve.h"
+#include "public_editor.h"
+#include "utils.h"
+#include "rgb_macros.h"
+
+#include <gtkmm2ext/utils.h>
+
+#include "pbd/i18n.h"
+
+PBD::Signal1<void,TempoCurve*> TempoCurve::CatchDeletion;
+
+static double curve_height = 13.0;
+
+void TempoCurve::setup_sizes(const double timebar_height)
+{
+	curve_height = floor (timebar_height) - 2.5;
+}
+
+TempoCurve::TempoCurve (PublicEditor& ed, ArdourCanvas::Container& parent, guint32 rgba, ARDOUR::TempoSection& temp, framepos_t frame, bool handle_events)
+
+	: editor (ed)
+	, _parent (&parent)
+	, _curve (0)
+	, _shown (false)
+	, _color (rgba)
+	, _min_tempo (temp.beats_per_minute())
+	, _max_tempo (temp.beats_per_minute())
+	, _tempo (temp)
+
+{
+	frame_position = frame;
+	unit_position = editor.sample_to_pixel (frame);
+
+	group = new ArdourCanvas::Container (&parent, ArdourCanvas::Duple (unit_position, 1));
+#ifdef CANVAS_DEBUG
+	group->name = string_compose ("TempoCurve::group for %1", _tempo.beats_per_minute());
+#endif
+
+	_curve = new ArdourCanvas::FramedCurve (group);
+#ifdef CANVAS_DEBUG
+	_curve->name = string_compose ("TempoCurve::curve for %1", _tempo.beats_per_minute());
+#endif
+	_curve->set_fill_mode (ArdourCanvas::FramedCurve::Inside);
+	_curve->set_points_per_segment (3);
+
+	points = new ArdourCanvas::Points ();
+	points->push_back (ArdourCanvas::Duple (0.0, 0.0));
+	points->push_back (ArdourCanvas::Duple (1.0, 0.0));
+	points->push_back (ArdourCanvas::Duple (1.0, curve_height));
+	points->push_back (ArdourCanvas::Duple (0.0, curve_height));
+
+	_curve->set (*points);
+
+	set_color_rgba (rgba);
+
+	editor.ZoomChanged.connect (sigc::mem_fun (*this, &TempoCurve::reposition));
+
+	/* events will be handled by both the group and the mark itself, so
+	 * make sure they can both be used to lookup this object.
+	 */
+
+	_curve->set_data ("tempo curve", this);
+
+	if (handle_events) {
+		//group->Event.connect (sigc::bind (sigc::mem_fun (editor, &PublicEditor::canvas_marker_event), group, this));
+	}
+
+	set_position (_tempo.frame(), UINT32_MAX);
+	_curve->Event.connect (sigc::bind (sigc::mem_fun (editor, &PublicEditor::canvas_tempo_curve_event), _curve, this));
+
+}
+
+TempoCurve::~TempoCurve ()
+{
+	CatchDeletion (this); /* EMIT SIGNAL */
+
+	/* destroying the parent group destroys its contents, namely any polygons etc. that we added */
+	delete group;
+}
+
+void TempoCurve::reparent(ArdourCanvas::Container & parent)
+{
+	group->reparent (&parent);
+	_parent = &parent;
+}
+
+void
+TempoCurve::canvas_height_set (double h)
+{
+	_canvas_height = h;
+}
+
+ArdourCanvas::Item&
+TempoCurve::the_item() const
+{
+	return *group;
+}
+
+void
+TempoCurve::set_position (framepos_t frame, framepos_t end_frame)
+{
+	unit_position = editor.sample_to_pixel (frame);
+	group->set_x_position (unit_position);
+	frame_position = frame;
+	_end_frame = end_frame;
+
+	points->clear();
+
+	points = new ArdourCanvas::Points ();
+	points->push_back (ArdourCanvas::Duple (0.0, curve_height));
+
+	if (end_frame == UINT32_MAX) {
+		const double tempo_at = _tempo.tempo_at_frame (frame, editor.session()->frame_rate()) * _tempo.note_type();
+		const double y_pos =  (curve_height) - (((tempo_at - _min_tempo) / (_max_tempo - _min_tempo)) * curve_height);
+
+		points->push_back (ArdourCanvas::Duple (0.0, y_pos));
+		points->push_back (ArdourCanvas::Duple (ArdourCanvas::COORD_MAX - 5.0, y_pos));
+
+	} else {
+		const framepos_t frame_step = max ((end_frame - frame) / 5, (framepos_t) 1);
+		framepos_t current_frame = frame;
+
+		while (current_frame < (end_frame - frame_step)) {
+			const double tempo_at = _tempo.tempo_at_frame (current_frame, editor.session()->frame_rate()) * _tempo.note_type();
+			const double y_pos = max ((curve_height) - (((tempo_at - _min_tempo) / (_max_tempo - _min_tempo)) * curve_height), 0.0);
+
+			points->push_back (ArdourCanvas::Duple (editor.sample_to_pixel (current_frame - frame), min (y_pos, curve_height)));
+
+			current_frame += frame_step;
+		}
+
+		const double tempo_at = _tempo.tempo_at_frame (end_frame, editor.session()->frame_rate()) * _tempo.note_type();
+		const double y_pos = max ((curve_height) - (((tempo_at - _min_tempo) / (_max_tempo - _min_tempo)) * curve_height), 0.0);
+
+		points->push_back (ArdourCanvas::Duple (editor.sample_to_pixel ((end_frame - 1) - frame), min (y_pos, curve_height)));
+	}
+
+	_curve->set (*points);
+}
+
+void
+TempoCurve::reposition ()
+{
+	set_position (frame_position, _end_frame);
+}
+
+void
+TempoCurve::show ()
+{
+	_shown = true;
+
+        group->show ();
+}
+
+void
+TempoCurve::hide ()
+{
+	_shown = false;
+
+	group->hide ();
+}
+
+void
+TempoCurve::set_color_rgba (uint32_t c)
+{
+	_color = c;
+	_curve->set_fill_color (UIConfiguration::instance().color_mod ("tempo curve", "selection rect"));
+	_curve->set_outline_color (_color);
+
+}
diff --git a/gtk2_ardour/tempo_curve.h b/gtk2_ardour/tempo_curve.h
new file mode 100644
index 0000000..dc678e4
--- /dev/null
+++ b/gtk2_ardour/tempo_curve.h
@@ -0,0 +1,73 @@
+#ifndef __gtk_ardour_tempo_curve_h__
+#define __gtk_ardour_tempo_curve_h__
+
+#include <string>
+#include <glib.h>
+
+#include <sigc++/signal.h>
+
+#include "ardour/ardour.h"
+#include "pbd/signals.h"
+
+#include "canvas/types.h"
+#include "canvas/framed_curve.h"
+
+namespace ARDOUR {
+	class TempoSection;
+}
+class PublicEditor;
+
+class TempoCurve : public sigc::trackable
+{
+  public:
+	TempoCurve (PublicEditor& editor, ArdourCanvas::Container &, guint32 rgba, ARDOUR::TempoSection& temp, framepos_t frame, bool handle_events);
+	~TempoCurve ();
+
+	static PBD::Signal1<void,TempoCurve*> CatchDeletion;
+
+	static void setup_sizes (const double timebar_height);
+
+	ArdourCanvas::Item& the_item() const;
+	void canvas_height_set (double);
+
+	void set_position (framepos_t lower, framepos_t upper);
+	void set_color_rgba (uint32_t rgba);
+	framepos_t position() const { return frame_position; }
+
+	ArdourCanvas::Container * get_parent() { return _parent; }
+	void reparent (ArdourCanvas::Container & parent);
+
+	void hide ();
+	void show ();
+
+	ARDOUR::TempoSection& tempo () { return _tempo; }
+
+	void set_max_tempo (const double& max) { _max_tempo = max; }
+	void set_min_tempo (const double& min) { _min_tempo = min; }
+
+protected:
+	PublicEditor& editor;
+
+	ArdourCanvas::Container* _parent;
+	ArdourCanvas::Container *group;
+	ArdourCanvas::Points *points;
+	ArdourCanvas::FramedCurve* _curve;
+
+	double        unit_position;
+	framepos_t    frame_position;
+	framepos_t    _end_frame;
+	bool         _shown;
+	double       _canvas_height;
+	uint32_t     _color;
+
+	void reposition ();
+private:
+	double       _min_tempo;
+	double       _max_tempo;
+	/* disallow copy construction */
+	TempoCurve (TempoCurve const &);
+	TempoCurve & operator= (TempoCurve const &);
+	ARDOUR::TempoSection& _tempo;
+
+};
+#endif /* __gtk_ardour_tempo_curve_h__ */
diff --git a/gtk2_ardour/tempo_dialog.cc b/gtk2_ardour/tempo_dialog.cc
index a7a6f4a..436acfa 100644
--- a/gtk2_ardour/tempo_dialog.cc
+++ b/gtk2_ardour/tempo_dialog.cc
@@ -26,7 +26,7 @@
 #include "tempo_dialog.h"
 #include "ui_config.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace Gtk;
@@ -36,6 +36,8 @@ using namespace PBD;
 
 TempoDialog::TempoDialog (TempoMap& map, framepos_t frame, const string&)
 	: ArdourDialog (_("New Tempo"))
+	, _map (&map)
+	, _section (0)
 	, bpm_adjustment (60.0, 1.0, 999.9, 0.1, 1.0)
 	, bpm_spinner (bpm_adjustment)
 	, when_bar_label (_("bar:"), ALIGN_LEFT, ALIGN_CENTER)
@@ -43,15 +45,16 @@ TempoDialog::TempoDialog (TempoMap& map, framepos_t frame, const string&)
 	, pulse_selector_label (_("Pulse note"), ALIGN_LEFT, ALIGN_CENTER)
 	, tap_tempo_button (_("Tap tempo"))
 {
-	Timecode::BBT_Time when;
-	Tempo tempo (map.tempo_at (frame));
-	map.bbt_time (frame, when);
+	Tempo tempo (map.tempo_at_frame (frame));
+	Timecode::BBT_Time when (map.bbt_at_frame (frame));
 
-	init (when, tempo.beats_per_minute(), tempo.note_type(), true);
+	init (when, tempo.beats_per_minute(), tempo.note_type(), TempoSection::Constant, true, MusicTime);
 }
 
-TempoDialog::TempoDialog (TempoSection& section, const string&)
+TempoDialog::TempoDialog (TempoMap& map, TempoSection& section, const string&)
 	: ArdourDialog (_("Edit Tempo"))
+	, _map (&map)
+	, _section (&section)
 	, bpm_adjustment (60.0, 1.0, 999.9, 0.1, 1.0)
 	, bpm_spinner (bpm_adjustment)
 	, when_bar_label (_("bar:"), ALIGN_LEFT, ALIGN_CENTER)
@@ -59,11 +62,12 @@ TempoDialog::TempoDialog (TempoSection& section, const string&)
 	, pulse_selector_label (_("Pulse note"), ALIGN_LEFT, ALIGN_CENTER)
 	, tap_tempo_button (_("Tap tempo"))
 {
-	init (section.start(), section.beats_per_minute(), section.note_type(), section.movable());
+	Timecode::BBT_Time when (map.bbt_at_frame (section.frame()));
+	init (when, section.beats_per_minute(), section.note_type(), section.type(), section.movable(), section.position_lock_style());
 }
 
 void
-TempoDialog::init (const Timecode::BBT_Time& when, double bpm, double note_type, bool movable)
+TempoDialog::init (const Timecode::BBT_Time& when, double bpm, double note_type, TempoSection::Type type, bool movable, PositionLockStyle style)
 {
 	vector<string> strings;
 	NoteTypes::iterator x;
@@ -106,12 +110,48 @@ TempoDialog::init (const Timecode::BBT_Time& when, double bpm, double note_type,
 		pulse_selector.set_active_text (strings[3]); // "quarter"
 	}
 
+	strings.clear();
+
+	tempo_types.insert (make_pair (_("ramped"), TempoSection::Ramp));
+	strings.push_back (_("ramped"));
+	tempo_types.insert (make_pair (_("constant"), TempoSection::Constant));
+	strings.push_back (_("constant"));
+	set_popdown_strings (tempo_type, strings);
+	TempoTypes::iterator tt;
+	for (tt = tempo_types.begin(); tt != tempo_types.end(); ++tt) {
+		if (tt->second == type) {
+			tempo_type.set_active_text (tt->first);
+			break;
+		}
+	}
+	if (tt == tempo_types.end()) {
+		tempo_type.set_active_text (strings[1]); // "constant"
+	}
+
+	strings.clear();
+
+	lock_styles.insert (make_pair (_("music"), MusicTime));
+	strings.push_back (_("music"));
+	lock_styles.insert (make_pair (_("audio"), AudioTime));
+	strings.push_back (_("audio"));
+	set_popdown_strings (lock_style, strings);
+	LockStyles::iterator ls;
+	for (ls = lock_styles.begin(); ls != lock_styles.end(); ++ls) {
+		if (ls->second == style) {
+			lock_style.set_active_text (ls->first);
+			break;
+		}
+	}
+	if (ls == lock_styles.end()) {
+		lock_style.set_active_text (strings[0]); // "music"
+	}
+
 	Table* table;
 
 	if (UIConfiguration::instance().get_allow_non_quarter_pulse()) {
-		table = manage (new Table (5, 5));
+		table = manage (new Table (5, 7));
 	} else {
-		table = manage (new Table (5, 4));
+		table = manage (new Table (5, 6));
 	}
 
 	table->set_spacings (6);
@@ -154,10 +194,27 @@ TempoDialog::init (const Timecode::BBT_Time& when, double bpm, double note_type,
 
 		Label* when_label = manage (new Label(_("Tempo begins at"), ALIGN_LEFT, ALIGN_CENTER));
 		table->attach (*when_label, 0, 1, row, row+1);
+
+		++row;
+		++row;
+
+		Label* lock_style_label = manage (new Label(_("Lock Style:"), ALIGN_LEFT, ALIGN_CENTER));
+		table->attach (*lock_style_label, 0, 1, row, row + 1);
+		table->attach (lock_style, 1, 5, row, row + 1);
+
+		--row;
 	}
 
+
+	Label* tempo_type_label = manage (new Label(_("Tempo Type:"), ALIGN_LEFT, ALIGN_CENTER));
+	table->attach (*tempo_type_label, 0, 1, row, row + 1);
+	table->attach (tempo_type, 1, 5, row, row + 1);
+
+	++row;
+
 	get_vbox()->set_border_width (12);
 	get_vbox()->pack_end (*table);
+
 	table->show_all ();
 
 	add_button (Stock::CANCEL, RESPONSE_CANCEL);
@@ -181,6 +238,8 @@ TempoDialog::init (const Timecode::BBT_Time& when, double bpm, double note_type,
 	when_beat_entry.signal_activate().connect (sigc::bind (sigc::mem_fun (*this, &TempoDialog::response), RESPONSE_ACCEPT));
 	when_beat_entry.signal_key_release_event().connect (sigc::mem_fun (*this, &TempoDialog::entry_key_release), false);
 	pulse_selector.signal_changed().connect (sigc::mem_fun (*this, &TempoDialog::pulse_change));
+	tempo_type.signal_changed().connect (sigc::mem_fun (*this, &TempoDialog::tempo_type_change));
+	lock_style.signal_changed().connect (sigc::mem_fun (*this, &TempoDialog::lock_style_change));
 	tap_tempo_button.signal_button_press_event().connect (sigc::mem_fun (*this, &TempoDialog::tap_tempo_button_press), false);
 	tap_tempo_button.signal_focus_out_event().connect (sigc::mem_fun (*this, &TempoDialog::tap_tempo_focus_out));
 
@@ -219,7 +278,15 @@ TempoDialog::bpm_button_release (GdkEventButton*)
 bool
 TempoDialog::entry_key_release (GdkEventKey*)
 {
-	set_response_sensitive (RESPONSE_ACCEPT, is_user_input_valid());
+	Timecode::BBT_Time bbt;
+	get_bbt_time (bbt);
+
+	if (_section && is_user_input_valid()) {
+		set_response_sensitive (RESPONSE_ACCEPT, _map->can_solve_bbt (_section, bbt));
+	} else {
+		set_response_sensitive (RESPONSE_ACCEPT, is_user_input_valid());
+	}
+
 	return false;
 }
 
@@ -258,12 +325,50 @@ TempoDialog::get_note_type ()
 	return x->second;
 }
 
+TempoSection::Type
+TempoDialog::get_tempo_type ()
+{
+	TempoTypes::iterator x = tempo_types.find (tempo_type.get_active_text());
+
+	if (x == tempo_types.end()) {
+		error << string_compose(_("incomprehensible tempo type (%1)"), tempo_type.get_active_text()) << endmsg;
+		return TempoSection::Constant;
+	}
+
+	return x->second;
+}
+
+PositionLockStyle
+TempoDialog::get_lock_style ()
+{
+	LockStyles::iterator x = lock_styles.find (lock_style.get_active_text());
+
+	if (x == lock_styles.end()) {
+		error << string_compose(_("incomprehensible lock style (%1)"), lock_style.get_active_text()) << endmsg;
+		return MusicTime;
+	}
+
+	return x->second;
+}
+
 void
 TempoDialog::pulse_change ()
 {
 	set_response_sensitive (RESPONSE_ACCEPT, is_user_input_valid());
 }
 
+void
+TempoDialog::tempo_type_change ()
+{
+	set_response_sensitive (RESPONSE_ACCEPT, is_user_input_valid());
+}
+
+void
+TempoDialog::lock_style_change ()
+{
+	set_response_sensitive (RESPONSE_ACCEPT, is_user_input_valid());
+}
+
 bool
 TempoDialog::tap_tempo_button_press (GdkEventButton *ev)
 {
@@ -313,22 +418,23 @@ TempoDialog::tap_tempo_focus_out (GdkEventFocus* )
 MeterDialog::MeterDialog (TempoMap& map, framepos_t frame, const string&)
 	: ArdourDialog (_("New Meter"))
 {
-	Timecode::BBT_Time when;
 	frame = map.round_to_bar(frame, RoundNearest);
-	Meter meter (map.meter_at(frame));
+	Timecode::BBT_Time when (map.bbt_at_frame (frame));
+	Meter meter (map.meter_at_frame (frame));
 
-	map.bbt_time (frame, when);
-	init (when, meter.divisions_per_bar(), meter.note_divisor(), true);
+	init (when, meter.divisions_per_bar(), meter.note_divisor(), true, MusicTime);
 }
 
-MeterDialog::MeterDialog (MeterSection& section, const string&)
+MeterDialog::MeterDialog (TempoMap& map, MeterSection& section, const string&)
 	: ArdourDialog (_("Edit Meter"))
 {
-	init (section.start(), section.divisions_per_bar(), section.note_divisor(), section.movable());
+	Timecode::BBT_Time when (map.bbt_at_frame (section.frame()));
+
+	init (when, section.divisions_per_bar(), section.note_divisor(), section.movable(), section.position_lock_style());
 }
 
 void
-MeterDialog::init (const Timecode::BBT_Time& when, double bpb, double divisor, bool movable)
+MeterDialog::init (const Timecode::BBT_Time& when, double bpb, double divisor, bool movable, PositionLockStyle style)
 {
 	char buf[64];
 	vector<string> strings;
@@ -371,15 +477,34 @@ MeterDialog::init (const Timecode::BBT_Time& when, double bpb, double divisor, b
 		note_type.set_active_text (strings[3]); // "quarter"
 	}
 
+	strings.clear();
+
+	lock_styles.insert (make_pair (_("music"), MusicTime));
+	strings.push_back (_("music"));
+	lock_styles.insert (make_pair (_("audio"), AudioTime));
+	strings.push_back (_("audio"));
+	set_popdown_strings (lock_style, strings);
+	LockStyles::iterator ls;
+	for (ls = lock_styles.begin(); ls != lock_styles.end(); ++ls) {
+		if (ls->second == style) {
+			lock_style.set_active_text (ls->first);
+			break;
+		}
+	}
+	if (ls == lock_styles.end()) {
+		lock_style.set_active_text (strings[0]); // "music"
+	}
+
 	Label* note_label = manage (new Label (_("Note value:"), ALIGN_LEFT, ALIGN_CENTER));
+	Label* lock_label = manage (new Label (_("Lock style:"), ALIGN_LEFT, ALIGN_CENTER));
 	Label* bpb_label = manage (new Label (_("Beats per bar:"), ALIGN_LEFT, ALIGN_CENTER));
-	Table* table = manage (new Table (3, 2));
+	Table* table = manage (new Table (3, 3));
 	table->set_spacings (6);
 
 	table->attach (*bpb_label, 0, 1, 0, 1, FILL|EXPAND, FILL|EXPAND);
 	table->attach (bpb_entry, 1, 2, 0, 1, FILL|EXPAND, FILL|EXPAND);
 	table->attach (*note_label, 0, 1, 1, 2, FILL|EXPAND, FILL|EXPAND);
-	table->attach (note_type, 1, 2, 1, 2, FILL|EXPAND, SHRINK);
+	table->attach (note_type, 1, 2, 1, 2, FILL|EXPAND, FILL|EXPAND);
 
 	snprintf (buf, sizeof (buf), "%" PRIu32, when.bars);
 	when_bar_entry.set_text (buf);
@@ -390,6 +515,9 @@ MeterDialog::init (const Timecode::BBT_Time& when, double bpb, double divisor, b
 
 		table->attach (*when_label, 0, 1, 2, 3, FILL | EXPAND, FILL | EXPAND);
 		table->attach (when_bar_entry, 1, 2, 2, 3, FILL | EXPAND, FILL | EXPAND);
+
+		table->attach (*lock_label, 0, 1, 3, 4, FILL|EXPAND, FILL|EXPAND);
+		table->attach (lock_style, 1, 2, 3, 4, FILL|EXPAND, SHRINK);
 	}
 
 	get_vbox()->set_border_width (12);
@@ -410,6 +538,8 @@ MeterDialog::init (const Timecode::BBT_Time& when, double bpb, double divisor, b
 	when_bar_entry.signal_key_press_event().connect (sigc::mem_fun (*this, &MeterDialog::entry_key_press), false);
 	when_bar_entry.signal_key_release_event().connect (sigc::mem_fun (*this, &MeterDialog::entry_key_release));
 	note_type.signal_changed().connect (sigc::mem_fun (*this, &MeterDialog::note_type_change));
+	lock_style.signal_changed().connect (sigc::mem_fun (*this, &MeterDialog::lock_style_change));
+
 }
 
 bool
@@ -481,6 +611,12 @@ MeterDialog::note_type_change ()
         set_response_sensitive (RESPONSE_ACCEPT, is_user_input_valid());
 }
 
+void
+MeterDialog::lock_style_change ()
+{
+        set_response_sensitive (RESPONSE_ACCEPT, is_user_input_valid());
+}
+
 double
 MeterDialog::get_bpb ()
 {
@@ -506,6 +642,19 @@ MeterDialog::get_note_type ()
 	return x->second;
 }
 
+PositionLockStyle
+MeterDialog::get_lock_style ()
+{
+	LockStyles::iterator x = lock_styles.find (lock_style.get_active_text());
+
+	if (x == lock_styles.end()) {
+		error << string_compose(_("incomprehensible meter lock style (%1)"), lock_style.get_active_text()) << endmsg;
+		return MusicTime;
+	}
+
+	return x->second;
+}
+
 bool
 MeterDialog::get_bbt_time (Timecode::BBT_Time& requested)
 {
diff --git a/gtk2_ardour/tempo_dialog.h b/gtk2_ardour/tempo_dialog.h
index 06c5db1..38c14e8 100644
--- a/gtk2_ardour/tempo_dialog.h
+++ b/gtk2_ardour/tempo_dialog.h
@@ -39,32 +39,45 @@ class TempoDialog : public ArdourDialog
 {
 public:
 	TempoDialog (ARDOUR::TempoMap&, framepos_t, const std::string & action);
-	TempoDialog (ARDOUR::TempoSection&, const std::string & action);
+	TempoDialog (ARDOUR::TempoMap&, ARDOUR::TempoSection&, const std::string & action);
 
 	double get_bpm ();
 	double get_note_type ();
 	bool   get_bbt_time (Timecode::BBT_Time&);
+	ARDOUR::TempoSection::Type get_tempo_type ();
+	ARDOUR::PositionLockStyle get_lock_style ();
 
 private:
-	void init (const Timecode::BBT_Time& start, double, double, bool);
+	void init (const Timecode::BBT_Time& start, double bpm , double note_type, ARDOUR::TempoSection::Type type, bool movable, ARDOUR::PositionLockStyle style);
 	bool is_user_input_valid() const;
 	void bpm_changed ();
 	bool bpm_button_press (GdkEventButton* );
 	bool bpm_button_release (GdkEventButton* );
 	bool entry_key_release (GdkEventKey* );
 	void pulse_change ();
+	void tempo_type_change ();
+	void lock_style_change ();
 	bool tap_tempo_button_press (GdkEventButton* );
 	bool tap_tempo_focus_out (GdkEventFocus* );
 
 	typedef std::map<std::string,float> NoteTypes;
 	NoteTypes note_types;
 
+	typedef std::map<std::string, ARDOUR::TempoSection::Type> TempoTypes;
+	TempoTypes tempo_types;
+
+	typedef std::map<std::string, ARDOUR::PositionLockStyle> LockStyles;
+	LockStyles lock_styles;
+
 	bool tapped;      // whether the tap-tempo button has been clicked
 	double sum_x, sum_xx, sum_xy, sum_y;
 	double tap_count;
 	double last_t;
 	gint64 first_t;
 
+	ARDOUR::TempoMap* _map;
+	ARDOUR::TempoSection* _section;
+
 	Gtk::ComboBoxText pulse_selector;
 	Gtk::Adjustment   bpm_adjustment;
 	Gtk::SpinButton   bpm_spinner;
@@ -74,6 +87,8 @@ private:
 	Gtk::Label   when_beat_label;
 	Gtk::Label   pulse_selector_label;
 	Gtk::Button  tap_tempo_button;
+	Gtk::ComboBoxText tempo_type;
+	Gtk::ComboBoxText lock_style;
 };
 
 class MeterDialog : public ArdourDialog
@@ -81,24 +96,30 @@ class MeterDialog : public ArdourDialog
 public:
 
 	MeterDialog (ARDOUR::TempoMap&, framepos_t, const std::string & action);
-	MeterDialog (ARDOUR::MeterSection&, const std::string & action);
+	MeterDialog (ARDOUR::TempoMap&, ARDOUR::MeterSection&, const std::string & action);
 
 	double get_bpb ();
 	double get_note_type ();
+	ARDOUR::PositionLockStyle get_lock_style ();
 	bool   get_bbt_time (Timecode::BBT_Time&);
 
 private:
-	void init (const Timecode::BBT_Time&, double, double, bool);
+	void init (const Timecode::BBT_Time&, double, double, bool, ARDOUR::PositionLockStyle style);
 	bool is_user_input_valid() const;
 	bool entry_key_press (GdkEventKey* );
 	bool entry_key_release (GdkEventKey* );
 	void note_type_change ();
+	void lock_style_change ();
 
 	typedef std::map<std::string,float> NoteTypes;
 	NoteTypes note_types;
 
+	typedef std::map<std::string, ARDOUR::PositionLockStyle> LockStyles;
+	LockStyles lock_styles;
+
 	Gtk::Entry   bpb_entry;
 	Gtk::ComboBoxText note_type;
+	Gtk::ComboBoxText lock_style;
 	std::vector<std::string> strings;
 	Gtk::Button  ok_button;
 	Gtk::Button  cancel_button;
diff --git a/gtk2_ardour/tempo_lines.cc b/gtk2_ardour/tempo_lines.cc
index bb86011..630e476 100644
--- a/gtk2_ardour/tempo_lines.cc
+++ b/gtk2_ardour/tempo_lines.cc
@@ -54,12 +54,11 @@ TempoLines::hide ()
 }
 
 void
-TempoLines::draw_ticks (const ARDOUR::TempoMap::BBTPointList::const_iterator& b,
-                        unsigned                                              divisions,
+TempoLines::draw_ticks (std::vector<ARDOUR::TempoMap::BBTPoint>& grid,
+			unsigned                                              divisions,
                         framecnt_t                                            leftmost_frame,
                         framecnt_t                                            frame_rate)
 {
-	const double   fpb  = b->tempo->frames_per_beat(frame_rate);
 	const uint32_t base = UIConfiguration::instance().color_mod("measure line beat", "measure line beat");
 
 	for (unsigned l = 1; l < divisions; ++l) {
@@ -70,11 +69,23 @@ TempoLines::draw_ticks (const ARDOUR::TempoMap::BBTPointList::const_iterator& b,
 				level = d;
 			}
 		}
-
 		/* draw line with alpha corresponding to coarsest level */
 		const uint8_t    a = max(8, (int)rint(UINT_RGBA_A(base) / (0.8 * log2(level))));
 		const uint32_t   c = UINT_RGBA_CHANGE_A(base, a);
-		const framepos_t f = b->frame + (l * (fpb / (double)divisions));
+		framepos_t f = 0;
+
+		if (grid.begin()->c != 0.0) {
+			const double beat_divisions = (l / ((double) divisions)) * (grid.begin()->tempo.note_type() / grid.begin()->meter.note_divisor());
+			const double time_at_division = log (((grid.begin()->c * (beat_divisions)) /
+							   grid.begin()->tempo.beats_per_minute()) + 1) / grid.begin()->c;
+
+			f = grid.begin()->frame + (framecnt_t) floor ((time_at_division * 60.0 * frame_rate) + 0.5);
+		} else {
+			const double fpb  = grid.begin()->tempo.frames_per_beat (frame_rate)
+				* (grid.begin()->tempo.note_type() / grid.begin()->meter.note_divisor());
+
+			f = grid.begin()->frame + (l * (fpb / (double) divisions));
+		}
 		if (f > leftmost_frame) {
 			lines.add (PublicEditor::instance().sample_to_pixel_unrounded (f), 1.0, c);
 		}
@@ -82,13 +93,12 @@ TempoLines::draw_ticks (const ARDOUR::TempoMap::BBTPointList::const_iterator& b,
 }
 
 void
-TempoLines::draw (const ARDOUR::TempoMap::BBTPointList::const_iterator& begin,
-                  const ARDOUR::TempoMap::BBTPointList::const_iterator& end,
-                  unsigned                                              divisions,
+TempoLines::draw (std::vector<ARDOUR::TempoMap::BBTPoint>& grid,
+		  unsigned                                              divisions,
                   framecnt_t                                            leftmost_frame,
                   framecnt_t                                            frame_rate)
 {
-	ARDOUR::TempoMap::BBTPointList::const_iterator i;
+	std::vector<ARDOUR::TempoMap::BBTPoint>::const_iterator i;
 	double  beat_density;
 
 	uint32_t beats = 0;
@@ -97,10 +107,10 @@ TempoLines::draw (const ARDOUR::TempoMap::BBTPointList::const_iterator& begin,
 
 	/* get the first bar spacing */
 
-	i = end;
+	i = grid.end();
 	i--;
-	bars = (*i).bar - (*begin).bar;
-	beats = distance (begin, end) - bars;
+	bars = (*i).bar - (*grid.begin()).bar;
+	beats = distance (grid.begin(), grid.end()) - bars;
 
 	beat_density = (beats * 10.0f) / lines.canvas()->width();
 
@@ -116,15 +126,14 @@ TempoLines::draw (const ARDOUR::TempoMap::BBTPointList::const_iterator& begin,
 	}
 
 	lines.clear ();
-
-	if (beat_density <= 0.12 && begin != end && begin->frame > 0) {
-		/* draw subdivisions of the beat before the first visible beat line */
-		ARDOUR::TempoMap::BBTPointList::const_iterator prev = begin;
-		--prev;
-		draw_ticks(prev, divisions, leftmost_frame, frame_rate);
+	if (beat_density <= 0.12 && grid.begin() != grid.end() && grid.begin()->frame > 0) {
+		/* draw subdivisions of the beat before the first visible beat line XX this shouldn't happen now */
+		std::vector<ARDOUR::TempoMap::BBTPoint> vec;
+		vec.push_back (*i);
+		draw_ticks (vec, divisions, leftmost_frame, frame_rate);
 	}
 
-	for (i = begin; i != end; ++i) {
+	for (i = grid.begin(); i != grid.end(); ++i) {
 
 		if ((*i).is_bar()) {
 			color = UIConfiguration::instance().color ("measure line bar");
@@ -141,7 +150,9 @@ TempoLines::draw (const ARDOUR::TempoMap::BBTPointList::const_iterator& begin,
 
 		if (beat_density <= 0.12) {
 			/* draw subdivisions of this beat */
-			draw_ticks(i, divisions, leftmost_frame, frame_rate);
+			std::vector<ARDOUR::TempoMap::BBTPoint> vec;
+			vec.push_back (*i);
+			draw_ticks (vec, divisions, leftmost_frame, frame_rate);
 		}
 	}
 }
diff --git a/gtk2_ardour/tempo_lines.h b/gtk2_ardour/tempo_lines.h
index 6d40a2d..7096028 100644
--- a/gtk2_ardour/tempo_lines.h
+++ b/gtk2_ardour/tempo_lines.h
@@ -29,9 +29,8 @@ public:
 
 	void tempo_map_changed();
 
-	void draw (const ARDOUR::TempoMap::BBTPointList::const_iterator& begin,
-	           const ARDOUR::TempoMap::BBTPointList::const_iterator& end,
-	           unsigned                                              divisions,
+	void draw (std::vector<ARDOUR::TempoMap::BBTPoint>& grid,
+		   unsigned                                              divisions,
 	           ARDOUR::framecnt_t                                    leftmost_frame,
 	           ARDOUR::framecnt_t                                    frame_rate);
 
@@ -39,8 +38,8 @@ public:
 	void hide();
 
 private:
-	void draw_ticks (const ARDOUR::TempoMap::BBTPointList::const_iterator& b,
-	                 unsigned                                              divisions,
+	void draw_ticks (std::vector<ARDOUR::TempoMap::BBTPoint>& grid,
+			 unsigned                                              divisions,
 	                 ARDOUR::framecnt_t                                    leftmost_frame,
 	                 ARDOUR::framecnt_t                                    frame_rate);
 
diff --git a/gtk2_ardour/theme_manager.cc b/gtk2_ardour/theme_manager.cc
index e1daeab..aa90885 100644
--- a/gtk2_ardour/theme_manager.cc
+++ b/gtk2_ardour/theme_manager.cc
@@ -24,32 +24,24 @@
 
 #include "pbd/gstdio_compat.h"
 
-#include <gtkmm/stock.h>
 #include <gtkmm/settings.h>
 
 #include "gtkmm2ext/gtk_ui.h"
-#include "gtkmm2ext/cell_renderer_color_selector.h"
 #include "gtkmm2ext/utils.h"
 
-#include "pbd/file_utils.h"
 #include "pbd/compose.h"
 
-#include "ardour/filesystem_paths.h"
 #include "ardour/profile.h"
 
-#include "canvas/container.h"
-#include "canvas/rectangle.h"
-#include "canvas/scroll_group.h"
 #include "canvas/wave_view.h"
 
 #include "ardour_button.h"
 #include "ardour_dialog.h"
 #include "theme_manager.h"
-#include "rgb_macros.h"
 #include "ui_config.h"
 #include "utils.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace Gtk;
@@ -58,10 +50,7 @@ using namespace ARDOUR;
 using namespace ARDOUR_UI_UTILS;
 
 ThemeManager::ThemeManager()
-        : dark_button (_("Dark Theme"))
-	, light_button (_("Light Theme"))
-	, reset_button (_("Restore Defaults"))
-	, flat_buttons (_("Draw \"flat\" buttons"))
+	: flat_buttons (_("Draw \"flat\" buttons"))
 	, blink_rec_button (_("Blink Rec-Arm buttons"))
 	, region_color_button (_("Color regions using their track's color"))
 	, show_clipping_button (_("Show waveform clipping"))
@@ -73,45 +62,14 @@ ThemeManager::ThemeManager()
 	, transients_follow_front (_("Transient windows follow front window."))
 	, floating_monitor_section (_("Float detached monitor-section window"))
 	, icon_set_label (_("Icon Set"))
-	, palette_viewport (*palette_scroller.get_hadjustment(), *palette_scroller.get_vadjustment())
-	, palette_group (0)
-	, palette_window (0)
 {
-	/* Now the alias list */
-
-	alias_list = TreeStore::create (alias_columns);
-	alias_display.set_model (alias_list);
-	alias_display.append_column (_("Object"), alias_columns.name);
-
-	Gtkmm2ext::CellRendererColorSelector* color_renderer = manage (new Gtkmm2ext::CellRendererColorSelector);
-	TreeViewColumn* color_column = manage (new TreeViewColumn (_("Color"), *color_renderer));
-	color_column->add_attribute (color_renderer->property_color(), alias_columns.color);
-	alias_display.append_column (*color_column);
-
-	alias_display.get_column (0)->set_data (X_("colnum"), GUINT_TO_POINTER(0));
-	alias_display.get_column (0)->set_expand (true);
-	alias_display.get_column (1)->set_data (X_("colnum"), GUINT_TO_POINTER(1));
-	alias_display.get_column (1)->set_expand (false);
-	alias_display.set_reorderable (false);
-	alias_display.set_headers_visible (true);
-
-	alias_display.signal_button_press_event().connect (sigc::mem_fun (*this, &ThemeManager::alias_button_press_event), false);
-
-	alias_scroller.add (alias_display);
+	Gtk::HBox* hbox;
 
 	/* various buttons */
 
-	RadioButton::Group group = dark_button.get_group();
-	light_button.set_group(group);
-	theme_selection_hbox.set_homogeneous(false);
-	theme_selection_hbox.pack_start (dark_button);
-	theme_selection_hbox.pack_start (light_button);
-
 	set_homogeneous (false);
-#if 0 // disable light/dark theme choice. until the 'light theme gets some attention.
-	pack_start (theme_selection_hbox, PACK_SHRINK);
-#endif
-	pack_start (reset_button, PACK_SHRINK);
+
+
 #ifndef __APPLE__
 	pack_start (all_dialogs, PACK_SHRINK);
 	pack_start (transients_follow_front, PACK_SHRINK);
@@ -124,8 +82,6 @@ ThemeManager::ThemeManager()
 	pack_start (region_color_button, PACK_SHRINK);
 	pack_start (show_clipping_button, PACK_SHRINK);
 
-	Gtk::HBox* hbox;
-
 	vector<string> icon_sets = ::get_icon_sets ();
 
 	if (icon_sets.size() > 1) {
@@ -134,12 +90,14 @@ ThemeManager::ThemeManager()
 
 		hbox = Gtk::manage (new Gtk::HBox());
 		hbox->set_spacing (6);
+		Gtk::Alignment* align = Gtk::manage (new Gtk::Alignment);
+		align->set (0, 0.5);
+		align->add (icon_set_dropdown);
 		hbox->pack_start (icon_set_label, false, false);
-		hbox->pack_start (icon_set_dropdown, true, true);
+		hbox->pack_start (*align, true, true);
 		pack_start (*hbox, PACK_SHRINK);
 	}
 
-
 	hbox = Gtk::manage (new Gtk::HBox());
 	hbox->set_spacing (6);
 	hbox->pack_start (waveform_gradient_depth, true, true);
@@ -152,34 +110,13 @@ ThemeManager::ThemeManager()
 	hbox->pack_start (timeline_item_gradient_depth_label, false, false);
 	pack_start (*hbox, PACK_SHRINK);
 
-	palette_group = initialize_palette_canvas (*palette_viewport.canvas());
-	palette_viewport.signal_size_allocate().connect (sigc::bind (sigc::mem_fun (*this, &ThemeManager::palette_canvas_allocated), palette_group, palette_viewport.canvas(),
-								     sigc::mem_fun (*this, &ThemeManager::palette_event)));
-	palette_scroller.add (palette_viewport);
-
-	modifier_scroller.add (modifier_vbox);
-
-	notebook.append_page (alias_scroller, _("Items"));
-	notebook.append_page (palette_scroller, _("Palette"));
-	notebook.append_page (modifier_scroller, _("Transparency"));
-
-	pack_start (notebook);
-
 	show_all ();
 
 	waveform_gradient_depth.set_update_policy (Gtk::UPDATE_DELAYED);
 	timeline_item_gradient_depth.set_update_policy (Gtk::UPDATE_DELAYED);
 
-	color_dialog.get_colorsel()->set_has_opacity_control (true);
-	color_dialog.get_colorsel()->set_has_palette (true);
-
 	set_ui_to_state();
 
-	color_dialog.get_ok_button()->signal_clicked().connect (sigc::bind (sigc::mem_fun (color_dialog, &Gtk::Dialog::response), RESPONSE_ACCEPT));
-	color_dialog.get_cancel_button()->signal_clicked().connect (sigc::bind (sigc::mem_fun (color_dialog, &Gtk::Dialog::response), RESPONSE_CANCEL));
-	dark_button.signal_toggled().connect (sigc::mem_fun (*this, &ThemeManager::on_dark_theme_button_toggled));
-	light_button.signal_toggled().connect (sigc::mem_fun (*this, &ThemeManager::on_light_theme_button_toggled));
-	reset_button.signal_clicked().connect (sigc::mem_fun (*this, &ThemeManager::reset_canvas_colors));
 	flat_buttons.signal_toggled().connect (sigc::mem_fun (*this, &ThemeManager::on_flat_buttons_toggled));
 	blink_rec_button.signal_toggled().connect (sigc::mem_fun (*this, &ThemeManager::on_blink_rec_arm_toggled));
 	region_color_button.signal_toggled().connect (sigc::mem_fun (*this, &ThemeManager::on_region_color_toggled));
@@ -202,74 +139,6 @@ ThemeManager::ThemeManager()
 					    string_compose (_("When detaching the monitoring section, mark it as \"Utility\" window to stay in front.\n"
 							      "This requires a restart of %1 to take effect"), PROGRAM_NAME));
 
-	set_size_request (-1, 400);
-	/* no need to call setup_palette() here, it will be done when its size is allocated */
-	setup_aliases ();
-	setup_modifiers ();
-
-	UIConfiguration::instance().ColorsChanged.connect (sigc::mem_fun (*this, &ThemeManager::colors_changed));
-}
-
-ThemeManager::~ThemeManager()
-{
-}
-
-void
-ThemeManager::setup_modifiers ()
-{
-	UIConfiguration* uic (&UIConfiguration::instance());
-	UIConfiguration::Modifiers& modifiers (uic->modifiers);
-	Gtk::HBox* mod_hbox;
-	Gtk::Label* mod_label;
-	Gtk::HScale* mod_scale;
-
-	Gtkmm2ext::container_clear (modifier_vbox);
-
-	for (UIConfiguration::Modifiers::const_iterator m = modifiers.begin(); m != modifiers.end(); ++m) {
-		mod_hbox = manage (new HBox);
-
-		mod_scale = manage (new HScale (0.0, 1.0, 0.01));
-		mod_scale->set_draw_value (false);
-		mod_scale->set_value (m->second.a());
-		mod_scale->set_update_policy (Gtk::UPDATE_DISCONTINUOUS);
-		mod_scale->signal_value_changed().connect (sigc::bind (sigc::mem_fun (*this, &ThemeManager::modifier_edited), mod_scale, m->first));
-
-		mod_label = manage (new Label (m->first));
-		mod_label->set_alignment (1.0, 0.5);
-		mod_label->set_size_request (150, -1); /* 150 pixels should be enough for anyone */
-
-		mod_hbox->pack_start (*mod_label, false, true, 12);
-		mod_hbox->pack_start (*mod_scale, true, true);
-
-		modifier_vbox.pack_start (*mod_hbox, false, false);
-	}
-
-	modifier_vbox.show_all ();
-
-}
-
-void
-ThemeManager::modifier_edited (Gtk::Range* range, string name)
-{
-	using namespace ArdourCanvas;
-
-	double alpha = range->get_value();
-	SVAModifier svam (SVAModifier::Assign, -1.0, -1.0, alpha);
-	UIConfiguration::instance().set_modifier (name, svam);
-}
-
-void
-ThemeManager::colors_changed ()
-{
-	setup_palette ();
-	setup_aliases ();
-	setup_modifiers ();
-}
-
-int
-ThemeManager::save (string /*path*/)
-{
-	return 0;
 }
 
 void
@@ -345,39 +214,8 @@ ThemeManager::on_icon_set_changed ()
 }
 
 void
-ThemeManager::on_dark_theme_button_toggled()
-{
-	if (!dark_button.get_active()) return;
-
-	UIConfiguration* uic (&UIConfiguration::instance());
-
-        uic->set_color_file("dark");
-}
-
-void
-ThemeManager::on_light_theme_button_toggled()
-{
-	if (!light_button.get_active()) return;
-
-	UIConfiguration* uic (&UIConfiguration::instance());
-
-        uic->set_color_file("light");
-}
-
-void
 ThemeManager::set_ui_to_state()
 {
-	/* there is no way these values can change individually
-	 * by themselves (w/o user-interaction)
-	 * hence a common combined update function suffices
-	 */
-
-	if (UIConfiguration::instance().get_color_file() == "light") {
-		light_button.set_active(true);
-	} else {
-		dark_button.set_active(true);
-	}
-
 	/* there is no need to block signal handlers, here,
 	 * all elements check if the value has changed and ignore NOOPs
 	 */
@@ -392,369 +230,3 @@ ThemeManager::set_ui_to_state()
 	timeline_item_gradient_depth.set_value(UIConfiguration::instance().get_timeline_item_gradient_depth());
 }
 
-void
-ThemeManager::reset_canvas_colors()
-{
-	string cfile;
-	string basename;
-
-	basename = "my-";
-	basename += UIConfiguration::instance().get_color_file();
-	basename += ".colors";
-
-	if (find_file (ardour_config_search_path(), basename, cfile)) {
-		string backup = cfile + string (X_(".old"));
-		g_rename (cfile.c_str(), backup.c_str());
-		/* don't really care if it fails */
-	}
-
-	UIConfiguration::instance().load_defaults();
-	UIConfiguration::instance().save_state ();
-	set_ui_to_state();
-}
-
-ArdourCanvas::Container*
-ThemeManager::initialize_palette_canvas (ArdourCanvas::Canvas& canvas)
-{
-	using namespace ArdourCanvas;
-
-	/* hide background */
-	canvas.set_background_color (rgba_to_color (0.0, 0.0, 1.0, 0.0));
-
-	/* bi-directional scroll group */
-
-	ScrollGroup* scroll_group = new ScrollGroup (canvas.root(), ScrollGroup::ScrollSensitivity (ScrollGroup::ScrollsVertically|ScrollGroup::ScrollsHorizontally));
-	canvas.add_scroller (*scroll_group);
-
-	/* new container to hold everything */
-
-	return new ArdourCanvas::Container (scroll_group);
-}
-
-void
-ThemeManager::palette_canvas_allocated (Gtk::Allocation& alloc, ArdourCanvas::Container* group, ArdourCanvas::Canvas* canvas, sigc::slot<bool,GdkEvent*,std::string> event_handler)
-{
-	build_palette_canvas (*canvas, *group, event_handler);
-}
-
-struct NamedColor {
-	string name;
-	ArdourCanvas::HSV    color;
-	NamedColor (string s, ArdourCanvas::HSV c) : name (s), color (c) {}
-};
-
-struct SortByHue {
-	bool operator() (NamedColor const & a, NamedColor const & b) {
-		using namespace ArdourCanvas;
-		const HSV black (0, 0, 0);
-		if (a.color.is_gray() || b.color.is_gray()) {
-			return black.distance (a.color) < black.distance (b.color);
-		} else {
-			return a.color.h < b.color.h;
-			// const HSV red (rgba_to_color (1.0, 0.0, 0.0, 1.0));
-			// return red.distance (a.color) < red.distance (b.color);
-		}
-	}
-};
-
-
-void
-ThemeManager::build_palette_canvas (ArdourCanvas::Canvas& canvas, ArdourCanvas::Container& group, sigc::slot<bool,GdkEvent*,std::string> event_handler)
-{
-	using namespace ArdourCanvas;
-
-	/* we want the colors sorted by hue, with their name */
-
-	UIConfiguration::Colors& colors (UIConfiguration::instance().colors);
-	vector<NamedColor> nc;
-	for (UIConfiguration::Colors::const_iterator x = colors.begin(); x != colors.end(); ++x) {
-		nc.push_back (NamedColor (x->first, HSV (x->second)));
-	}
-	SortByHue sorter;
-	sort (nc.begin(), nc.end(), sorter);
-
-	const uint32_t color_limit = nc.size();
-	const double box_size = 20.0;
-	const double width = canvas.width();
-	const double height = canvas.height();
-
-	uint32_t color_num = 0;
-
-	/* clear existing rects and delete them */
-
-	group.clear (true);
-
-	for (uint32_t y = 0; y < height - box_size && color_num < color_limit; y += box_size) {
-		for (uint32_t x = 0; x < width - box_size && color_num < color_limit; x += box_size) {
-			ArdourCanvas::Rectangle* r = new ArdourCanvas::Rectangle (&group, ArdourCanvas::Rect (x, y, x + box_size, y + box_size));
-
-			string name = nc[color_num++].name;
-
-			UIConfiguration::Colors::iterator c = colors.find (name);
-
-			if (c != colors.end()) {
-				Color color = c->second;
-				r->set_fill_color (color);
-				r->set_outline_color (rgba_to_color (0.0, 0.0, 0.0, 1.0));
-				r->set_tooltip (name);
-				r->Event.connect (sigc::bind (event_handler, name));
-			}
-		}
-	}
-}
-
-void
-ThemeManager::palette_size_request (Gtk::Requisition* req)
-{
-	uint32_t ncolors = UIConfiguration::instance().colors.size();
-	const int box_size = 20;
-
-	double c = sqrt ((double)ncolors);
-	req->width = (int) floor (c * box_size);
-	req->height = (int) floor (c * box_size);
-
-	/* add overflow row if necessary */
-
-	if (fmod (ncolors, c) != 0.0) {
-		req->height += box_size;
-	}
-}
-
-void
-ThemeManager::setup_palette ()
-{
-	build_palette_canvas (*palette_viewport.canvas(), *palette_group, sigc::mem_fun (*this, &ThemeManager::palette_event));
-}
-
-bool
-ThemeManager::palette_event (GdkEvent* ev, string name)
-{
-	switch (ev->type) {
-	case GDK_BUTTON_RELEASE:
-		edit_palette_color (name);
-		return true;
-	default:
-		break;
-	}
-	return true;
-}
-
-void
-ThemeManager::edit_palette_color (std::string name)
-{
-	using namespace ArdourCanvas;
-	double r,g, b, a;
-	UIConfiguration* uic (&UIConfiguration::instance());
-	ArdourCanvas::Color c = uic->color (name);
-	Gdk::Color gdkcolor;
-
-	color_to_rgba (c, r, g, b, a);
-
-	gdkcolor.set_rgb_p (r, g, b);
-	color_dialog.get_colorsel()->set_previous_color (gdkcolor);
-	color_dialog.get_colorsel()->set_current_color (gdkcolor);
-	color_dialog.get_colorsel()->set_previous_alpha ((guint16) (a * 65535));
-	color_dialog.get_colorsel()->set_current_alpha ((guint16) (a * 65535));
-
-	color_dialog_connection.disconnect ();
-	color_dialog_connection = color_dialog.signal_response().connect (sigc::bind (sigc::mem_fun (*this, &ThemeManager::palette_color_response), name));
-	color_dialog.present();
-}
-
-void
-ThemeManager::palette_color_response (int result, std::string name)
-{
-	using namespace ArdourCanvas;
-
-	color_dialog_connection.disconnect ();
-
-	UIConfiguration* uic (&UIConfiguration::instance());
-	Gdk::Color gdkcolor;
-	double r,g, b, a;
-
-	switch (result) {
-	case RESPONSE_ACCEPT:
-	case RESPONSE_OK:
-		gdkcolor = color_dialog.get_colorsel()->get_current_color();
-		a = color_dialog.get_colorsel()->get_current_alpha() / 65535.0;
-		r = gdkcolor.get_red_p();
-		g = gdkcolor.get_green_p();
-		b = gdkcolor.get_blue_p();
-
-		uic->set_color (name, rgba_to_color (r, g, b, a));
-		break;
-
-	default:
-		break;
-	}
-
-	color_dialog.hide ();
-}
-
-bool
-ThemeManager::alias_palette_event (GdkEvent* ev, string new_alias, string target_name)
-{
-	switch (ev->type) {
-	case GDK_BUTTON_RELEASE:
-		UIConfiguration::instance().set_alias (target_name, new_alias);
-		return true;
-		break;
-	default:
-		break;
-	}
-	return false;
-}
-
-void
-ThemeManager::alias_palette_response (int response, std::string target_name, std::string old_alias)
-{
-	switch (response) {
-	case GTK_RESPONSE_OK:
-	case GTK_RESPONSE_ACCEPT:
-		/* rebuild alias list with new color: inefficient but simple */
-		setup_aliases ();
-		break;
-
-	case GTK_RESPONSE_REJECT:
-		/* revert choice */
-		UIConfiguration::instance().set_alias (target_name, old_alias);
-		break;
-
-	default:
-		/* do nothing */
-		break;
-	}
-
-	palette_window->hide ();
-}
-
-void
-ThemeManager::choose_color_from_palette (string const & name)
-{
-	UIConfiguration* uic (&UIConfiguration::instance());
-	UIConfiguration::ColorAliases::iterator i = uic->color_aliases.find (name);
-
-	if (i == uic->color_aliases.end()) {
-		return;
-	}
-
-	delete palette_window;
-
-	palette_window = new ArdourDialog (_("Color Palette"));
-	palette_window->add_button (Stock::CANCEL, RESPONSE_REJECT); /* using CANCEL causes confusion if dialog is closed via CloseAllDialogs */
-	palette_window->add_button (Stock::OK, RESPONSE_OK);
-
-	ArdourCanvas::GtkCanvas* canvas = new ArdourCanvas::GtkCanvas ();
-	ArdourCanvas::Container* group = initialize_palette_canvas (*canvas);
-
-	canvas->signal_size_request().connect (sigc::mem_fun (*this, &ThemeManager::palette_size_request));
-	canvas->signal_size_allocate().connect (sigc::bind (sigc::mem_fun (*this, &ThemeManager::palette_canvas_allocated), group, canvas,
-							    sigc::bind (sigc::mem_fun (*this, &ThemeManager::alias_palette_event), name)));
-
-	palette_window->get_vbox()->pack_start (*canvas);
-	palette_window->show_all ();
-
-	palette_response_connection = palette_window->signal_response().connect (sigc::bind (sigc::mem_fun (*this, &ThemeManager::alias_palette_response), name, i->second));
-
-	palette_window->set_position (WIN_POS_MOUSE);
-	palette_window->present ();
-}
-
-void
-ThemeManager::setup_aliases ()
-{
-	using namespace ArdourCanvas;
-
-	UIConfiguration* uic (&UIConfiguration::instance());
-	UIConfiguration::ColorAliases& aliases (uic->color_aliases);
-
-	alias_list->clear ();
-
-	for (UIConfiguration::ColorAliases::iterator i = aliases.begin(); i != aliases.end(); ++i) {
-		TreeModel::Children rows = alias_list->children();
-		TreeModel::Row row;
-		string::size_type colon;
-
-		if ((colon = i->first.find (':')) != string::npos) {
-
-			/* this is supposed to be a child node, so find the
-			 * parent
-			 */
-
-			string parent = i->first.substr (0, colon);
-			TreeModel::iterator ri;
-
-			for (ri = rows.begin(); ri != rows.end(); ++ri) {
-				string s = (*ri)[alias_columns.name];
-				if (s == parent) {
-					break;
-				}
-			}
-
-			if (ri == rows.end()) {
-				/* not found, add the parent as new top level row */
-				row = *(alias_list->append());
-				row[alias_columns.name] = parent;
-				row[alias_columns.alias] = "";
-
-				/* now add the child as a child of this one */
-
-				row = *(alias_list->insert (row->children().end()));
-				row[alias_columns.name] = i->first.substr (colon+1);
-			} else {
-				row = *(alias_list->insert ((*ri)->children().end()));
-				row[alias_columns.name] = i->first.substr (colon+1);
-			}
-
-		} else {
-			/* add as a child */
-			row = *(alias_list->append());
-			row[alias_columns.name] = i->first;
-			row[alias_columns.key] = i->first;
-		}
-
-		row[alias_columns.key] = i->first;
-		row[alias_columns.alias] = i->second;
-
-		Gdk::Color col;
-		double r, g, b, a;
-		Color c (uic->color (i->second));
-		color_to_rgba (c, r, g, b, a);
-		col.set_rgb_p (r, g, b);
-
-		row[alias_columns.color] = col;
-	}
-}
-
-bool
-ThemeManager::alias_button_press_event (GdkEventButton* ev)
-{
-	TreeIter iter;
-	TreeModel::Path path;
-	TreeViewColumn* column;
-	int cellx;
-	int celly;
-
-	if (!alias_display.get_path_at_pos ((int)ev->x, (int)ev->y, path, column, cellx, celly)) {
-		return false;
-	}
-
-	guint32 colnum = GPOINTER_TO_UINT (column->get_data (X_("colnum")));
-
-	switch (colnum) {
-	case 0:
-		/* allow normal processing to occur */
-		return false;
-
-	case 1: /* color */
-		if ((iter = alias_list->get_iter (path))) {
-			string target_color_alias = (*iter)[alias_columns.key];
-			if (!target_color_alias.empty()) {
-				choose_color_from_palette (target_color_alias);
-			}
-		}
-		break;
-	}
-
-	return true;
-}
diff --git a/gtk2_ardour/theme_manager.h b/gtk2_ardour/theme_manager.h
index 36e85e5..75a7d10 100644
--- a/gtk2_ardour/theme_manager.h
+++ b/gtk2_ardour/theme_manager.h
@@ -17,41 +17,26 @@
 
 */
 
-#ifndef __ardour_gtk_color_manager_h__
-#define __ardour_gtk_color_manager_h__
+#ifndef __ardour_gtk_theme_manager_h__
+#define __ardour_gtk_theme_manager_h__
 
 #include <gtkmm/treeview.h>
 #include <gtkmm/treestore.h>
 #include <gtkmm/scrolledwindow.h>
-#include <gtkmm/colorselection.h>
 #include <gtkmm/radiobutton.h>
 #include <gtkmm/button.h>
 #include <gtkmm/scale.h>
 #include <gtkmm/rc.h>
 
-#include "canvas/types.h"
-#include "canvas/canvas.h"
-
 #include "ui_config.h"
 
-namespace ArdourCanvas {
-	class Container;
-	class ScrollGroup;
-}
-
 class ArdourDialog;
 
 class ThemeManager : public Gtk::VBox
 {
   public:
 	ThemeManager();
-	~ThemeManager();
-
-	int save (std::string path);
-	void reset_canvas_colors();
 
-	void on_dark_theme_button_toggled ();
-	void on_light_theme_button_toggled ();
 	void on_flat_buttons_toggled ();
 	void on_blink_rec_arm_toggled ();
         void on_region_color_toggled ();
@@ -64,25 +49,6 @@ class ThemeManager : public Gtk::VBox
 	void on_icon_set_changed ();
 
   private:
-	Gtk::Notebook notebook;
-
-	struct BasicColorDisplayModelColumns : public Gtk::TreeModel::ColumnRecord {
-		BasicColorDisplayModelColumns() {
-			add (name);
-			add (gdkcolor);
-		}
-
-		Gtk::TreeModelColumn<std::string>  name;
-		Gtk::TreeModelColumn<Gdk::Color>   gdkcolor;
-	};
-
-	Gtk::ColorSelectionDialog color_dialog;
-	sigc::connection color_dialog_connection;
-
-	Gtk::HBox theme_selection_hbox;
-	Gtk::RadioButton dark_button;
-	Gtk::RadioButton light_button;
-	Gtk::Button reset_button;
 	Gtk::CheckButton flat_buttons;
 	Gtk::CheckButton blink_rec_button;
 	Gtk::CheckButton region_color_button;
@@ -98,82 +64,8 @@ class ThemeManager : public Gtk::VBox
 	Gtk::Label icon_set_label;
 	Gtk::ComboBoxText icon_set_dropdown;
 
-	/* handls response from color dialog when it is used to
-	   edit a derived color.
-	*/
-	void palette_color_response (int, std::string);
-
-	Gtk::ScrolledWindow palette_scroller;
-	ArdourCanvas::GtkCanvasViewport palette_viewport;
-	ArdourCanvas::Container* palette_group;
-
-	/* these methods create and manage a canvas for use in either the
-	   palette tab or in a separate dialog. Different behaviour is
-	   accomplished by changing the event handler passed into the
-	   allocation handler. We do it there because we have to rebuild
-	   the canvas on allocation events, and during the rebuild, connect
-	   each rectangle to the event handler.
-
-	   the alternative is one event handler for the canvas and a map
-	   of where each color rectangle is. nothing wrong with this
-	   but the per-rect event setup is simpler and avoids building
-	   and looking up the map information.
-	*/
-	ArdourCanvas::Container* initialize_palette_canvas (ArdourCanvas::Canvas& canvas);
-	void build_palette_canvas (ArdourCanvas::Canvas&, ArdourCanvas::Container&, sigc::slot<bool,GdkEvent*,std::string> event_handler);
-	void palette_canvas_allocated (Gtk::Allocation& alloc, ArdourCanvas::Container* group, ArdourCanvas::Canvas* canvas, sigc::slot<bool,GdkEvent*,std::string> event_handler);
-	void palette_size_request (Gtk::Requisition*);
-
-	/* handles events from a palette canvas inside the palette (derived
-	   colors) tab
-	*/
-	bool palette_event (GdkEvent*, std::string name);
-	/* allows user to edit a named color (e.g. "color 3") after clicking
-	   on it inside the palette tab.
-	*/
-	void edit_palette_color (std::string);
-
-	struct ColorAliasModelColumns : public Gtk::TreeModel::ColumnRecord {
-		ColorAliasModelColumns() {
-			add (name);
-			add (alias);
-			add (color);
-			add (key);
-		}
-
-		Gtk::TreeModelColumn<std::string>  name;
-		Gtk::TreeModelColumn<std::string>  alias;
-		Gtk::TreeModelColumn<Gdk::Color>   color;
-		Gtk::TreeModelColumn<std::string>  key;
-	};
-
-	ColorAliasModelColumns       alias_columns;
-	Gtk::TreeView                alias_display;
-	Glib::RefPtr<Gtk::TreeStore> alias_list;
-	Gtk::ScrolledWindow          alias_scroller;
-
-	bool alias_button_press_event (GdkEventButton*);
-
-	ArdourDialog* palette_window;
-	sigc::connection palette_response_connection;
-
-	void choose_color_from_palette (std::string const &target_name);
-
-	bool alias_palette_event (GdkEvent*, std::string, std::string);
-	void alias_palette_response (int, std::string, std::string);
-
-	void setup_aliases ();
-	void setup_palette ();
-
-	Gtk::ScrolledWindow modifier_scroller;
-	Gtk::VBox modifier_vbox;
-
-	void setup_modifiers ();
-	void modifier_edited (Gtk::Range*, std::string);
-
 	void colors_changed ();
 	void set_ui_to_state ();
 };
 
-#endif /* __ardour_gtk_color_manager_h__ */
-
+#endif /* __ardour_gtk_theme_manager_h__ */
diff --git a/gtk2_ardour/themes/blueberry-milk-ardour.colors b/gtk2_ardour/themes/blueberry-milk-ardour.colors
new file mode 100644
index 0000000..af542ef
--- /dev/null
+++ b/gtk2_ardour/themes/blueberry-milk-ardour.colors
@@ -0,0 +1,524 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Ardour theme-name="Blueberry Milk">
+  <Colors>
+    <Color name="color 1" value="0x20b2b2ff"/>
+    <Color name="color 10" value="0xe3dedeff"/>
+    <Color name="color 100" value="0xe49c9cff"/>
+    <Color name="color 101" value="0xa06000ff"/>
+    <Color name="color 103" value="0x1e7727ff"/>
+    <Color name="color 104" value="0x676767ff"/>
+    <Color name="color 11" value="0x9496a3ff"/>
+    <Color name="color 12" value="0x18ab27ff"/>
+    <Color name="color 13" value="0xe8e8e8ff"/>
+    <Color name="color 14" value="0xb0cacaff"/>
+    <Color name="color 15" value="0x282b49ff"/>
+    <Color name="color 16" value="0x7a99c7ff"/>
+    <Color name="color 17" value="0x00ff1aff"/>
+    <Color name="color 18" value="0x969ab2ff"/>
+    <Color name="color 19" value="0xdd6363ff"/>
+    <Color name="color 2" value="0x464646ff"/>
+    <Color name="color 20" value="0x684d4dff"/>
+    <Color name="color 21" value="0x565656ff"/>
+    <Color name="color 22" value="0xe0e0e0ff"/>
+    <Color name="color 23" value="0xa581c8ff"/>
+    <Color name="color 24" value="0x9fbca2ff"/>
+    <Color name="color 25" value="0x525252ff"/>
+    <Color name="color 26" value="0xc7c9d8ff"/>
+    <Color name="color 27" value="0x333333ff"/>
+    <Color name="color 28" value="0x79688bff"/>
+    <Color name="color 29" value="0x7b7878ff"/>
+    <Color name="color 3" value="0x738299ff"/>
+    <Color name="color 30" value="0xbb60b3ff"/>
+    <Color name="color 31" value="0xddddd8ff"/>
+    <Color name="color 32" value="0xeddc3d77"/>
+    <Color name="color 33" value="0xbbbbbbff"/>
+    <Color name="color 34" value="0x3c3c3cff"/>
+    <Color name="color 35" value="0x757aa5ff"/>
+    <Color name="color 36" value="0x473212ff"/>
+    <Color name="color 37" value="0x637160ff"/>
+    <Color name="color 38" value="0x8dc9b7ff"/>
+    <Color name="color 39" value="0x35965cff"/>
+    <Color name="color 4" value="0x717171ff"/>
+    <Color name="color 40" value="0x7c3a3aff"/>
+    <Color name="color 41" value="0x497a5dff"/>
+    <Color name="color 42" value="0x404145ff"/>
+    <Color name="color 43" value="0x686c92ff"/>
+    <Color name="color 44" value="0x004f08ff"/>
+    <Color name="color 45" value="0xa29e9eff"/>
+    <Color name="color 46" value="0x666464ff"/>
+    <Color name="color 47" value="0x00880eff"/>
+    <Color name="color 48" value="0x396b3eff"/>
+    <Color name="color 49" value="0x00660aff"/>
+    <Color name="color 5" value="0x9dadc4ff"/>
+    <Color name="color 50" value="0xeeeeecff"/>
+    <Color name="color 51" value="0x383d37ff"/>
+    <Color name="color 52" value="0xe8faa1ff"/>
+    <Color name="color 53" value="0xa1927cff"/>
+    <Color name="color 54" value="0xf48352ff"/>
+    <Color name="color 55" value="0xf85813ff"/>
+    <Color name="color 56" value="0x8ec794ff"/>
+    <Color name="color 57" value="0x7ea854ff"/>
+    <Color name="color 58" value="0x474f3fff"/>
+    <Color name="color 59" value="0xaeb0c4ff"/>
+    <Color name="color 6" value="0x91a993ff"/>
+    <Color name="color 60" value="0x50545aff"/>
+    <Color name="color 61" value="0x4a4b4dff"/>
+    <Color name="color 62" value="0xaaaed4ff"/>
+    <Color name="color 63" value="0x8a90ccff"/>
+    <Color name="color 64" value="0xb7b8c1ff"/>
+    <Color name="color 65" value="0xb8cca3ff"/>
+    <Color name="color 66" value="0x4f2f00ff"/>
+    <Color name="color 67" value="0x272727ff"/>
+    <Color name="color 68" value="0xc57805ff"/>
+    <Color name="color 69" value="0x660000ff"/>
+    <Color name="color 7" value="0x5f5f5fff"/>
+    <Color name="color 70" value="0x304057ff"/>
+    <Color name="color 71" value="0x5f5a58ff"/>
+    <Color name="color 72" value="0xe58b05ff"/>
+    <Color name="color 73" value="0x8487a5ff"/>
+    <Color name="color 74" value="0x899ab4ff"/>
+    <Color name="color 75" value="0xbba900ff"/>
+    <Color name="color 76" value="0x6c6e6aff"/>
+    <Color name="color 77" value="0x8ea8cfff"/>
+    <Color name="color 78" value="0xb5bec2ff"/>
+    <Color name="color 79" value="0x254528ff"/>
+    <Color name="color 8" value="0xff9900ff"/>
+    <Color name="color 80" value="0x603535ff"/>
+    <Color name="color 81" value="0xa5a5a5ff"/>
+    <Color name="color 82" value="0xd8d8d8ff"/>
+    <Color name="color 83" value="0xa80000ff"/>
+    <Color name="color 84" value="0x7b354aff"/>
+    <Color name="color 85" value="0x1e90ffff"/>
+    <Color name="color 86" value="0x794c4cff"/>
+    <Color name="color 87" value="0x242222ff"/>
+    <Color name="color 88" value="0xc6c6c6ff"/>
+    <Color name="color 89" value="0xb6e8fdff"/>
+    <Color name="color 9" value="0xf10000ff"/>
+    <Color name="color 90" value="0x222020ff"/>
+    <Color name="color 91" value="0x8ef823ff"/>
+    <Color name="color 92" value="0xcfdee4ff"/>
+    <Color name="color 93" value="0x51578aff"/>
+    <Color name="color 94" value="0x636363ff"/>
+    <Color name="color 95" value="0xe4f4d3ff"/>
+    <Color name="color 96" value="0x85e524ff"/>
+    <Color name="color 97" value="0xccccccff"/>
+    <Color name="color 98" value="0x9989a3ff"/>
+    <Color name="color 99" value="0xaeb8bcff"/>
+    <Color name="meter color0" value="0x402e6bff"/>
+    <Color name="meter color1" value="0x29ffeeff"/>
+    <Color name="meter color2" value="0x57ffc3ff"/>
+    <Color name="meter color3" value="0xc1ffedff"/>
+    <Color name="meter color4" value="0xf5fed8ff"/>
+    <Color name="meter color5" value="0xfff000ff"/>
+    <Color name="meter color6" value="0xffe23eff"/>
+    <Color name="meter color7" value="0xff8700ff"/>
+    <Color name="meter color8" value="0xff0000ff"/>
+    <Color name="meter color9" value="0xff0000ff"/>
+  </Colors>
+  <ColorAliases>
+    <ColorAlias name="active crossfade" alias="color 1"/>
+    <ColorAlias name="arrange base" alias="color 82"/>
+    <ColorAlias name="audio automation track fill" alias="color 70"/>
+    <ColorAlias name="audio bus base" alias="color 3"/>
+    <ColorAlias name="audio master bus base" alias="color 4"/>
+    <ColorAlias name="audio track base" alias="color 77"/>
+    <ColorAlias name="automation line" alias="meter color0"/>
+    <ColorAlias name="automation track outline" alias="color 7"/>
+    <ColorAlias name="big clock active: background" alias="color 4"/>
+    <ColorAlias name="big clock active: cursor" alias="color 8"/>
+    <ColorAlias name="big clock active: edited text" alias="color 8"/>
+    <ColorAlias name="big clock active: text" alias="color 9"/>
+    <ColorAlias name="big clock: background" alias="color 15"/>
+    <ColorAlias name="big clock: cursor" alias="color 8"/>
+    <ColorAlias name="big clock: edited text" alias="color 8"/>
+    <ColorAlias name="big clock: text" alias="color 10"/>
+    <ColorAlias name="border color" alias="color 4"/>
+    <ColorAlias name="cd marker bar" alias="color 87"/>
+    <ColorAlias name="clipped waveform" alias="color 9"/>
+    <ColorAlias name="clock: background" alias="color 104"/>
+    <ColorAlias name="clock: cursor" alias="color 8"/>
+    <ColorAlias name="clock: edited text" alias="color 8"/>
+    <ColorAlias name="clock: text" alias="color 13"/>
+    <ColorAlias name="comment button: fill" alias="color 20"/>
+    <ColorAlias name="control point fill" alias="color 17"/>
+    <ColorAlias name="control point outline" alias="meter color3"/>
+    <ColorAlias name="control point selected fill" alias="color 62"/>
+    <ColorAlias name="control point selected outline" alias="color 9"/>
+    <ColorAlias name="covered region" alias="color 87"/>
+    <ColorAlias name="crossfade editor base" alias="color 15"/>
+    <ColorAlias name="crossfade editor line" alias="color 4"/>
+    <ColorAlias name="crossfade editor line shading" alias="color 16"/>
+    <ColorAlias name="crossfade editor point fill" alias="color 17"/>
+    <ColorAlias name="crossfade editor point outline" alias="color 18"/>
+    <ColorAlias name="crossfade editor wave" alias="color 13"/>
+    <ColorAlias name="crossfade line" alias="color 4"/>
+    <ColorAlias name="edit point" alias="color 18"/>
+    <ColorAlias name="entered automation line" alias="color 19"/>
+    <ColorAlias name="entered gain line" alias="color 19"/>
+    <ColorAlias name="entered marker" alias="color 19"/>
+    <ColorAlias name="feedback alert: fill" alias="color 20"/>
+    <ColorAlias name="feedback alert: fill active" alias="color 9"/>
+    <ColorAlias name="feedback alert: led active" alias="color 4"/>
+    <ColorAlias name="frame handle" alias="color 23"/>
+    <ColorAlias name="gain line" alias="color 6"/>
+    <ColorAlias name="gain line inactive" alias="color 24"/>
+    <ColorAlias name="generic button: fill" alias="color 25"/>
+    <ColorAlias name="generic button: fill active" alias="color 9"/>
+    <ColorAlias name="generic button: led active" alias="color 18"/>
+    <ColorAlias name="ghost track base" alias="color 46"/>
+    <ColorAlias name="ghost track midi outline" alias="color 4"/>
+    <ColorAlias name="ghost track wave" alias="color 29"/>
+    <ColorAlias name="ghost track wave clip" alias="color 29"/>
+    <ColorAlias name="ghost track wave fill" alias="color 29"/>
+    <ColorAlias name="ghost track zero line" alias="color 30"/>
+    <ColorAlias name="gtk_arm" alias="color 9"/>
+    <ColorAlias name="gtk_audio_bus" alias="color 2"/>
+    <ColorAlias name="gtk_audio_track" alias="color 16"/>
+    <ColorAlias name="gtk_automation_track_header" alias="color 13"/>
+    <ColorAlias name="gtk_background" alias="color 22"/>
+    <ColorAlias name="gtk_bases" alias="color 88"/>
+    <ColorAlias name="gtk_bg_selected" alias="color 99"/>
+    <ColorAlias name="gtk_bg_tooltip" alias="color 52"/>
+    <ColorAlias name="gtk_bright_color" alias="color 74"/>
+    <ColorAlias name="gtk_bright_indicator" alias="color 9"/>
+    <ColorAlias name="gtk_contrasting_indicator" alias="color 91"/>
+    <ColorAlias name="gtk_control_master" alias="color 64"/>
+    <ColorAlias name="gtk_control_text" alias="color 29"/>
+    <ColorAlias name="gtk_control_text2" alias="color 83"/>
+    <ColorAlias name="gtk_darkest" alias="color 81"/>
+    <ColorAlias name="gtk_entry_cursor" alias="color 9"/>
+    <ColorAlias name="gtk_fg_selected" alias="color 67"/>
+    <ColorAlias name="gtk_fg_tooltip" alias="color 29"/>
+    <ColorAlias name="gtk_foreground" alias="color 93"/>
+    <ColorAlias name="gtk_light_text_on_dark" alias="color 104"/>
+    <ColorAlias name="gtk_lightest" alias="color 22"/>
+    <ColorAlias name="gtk_midi_channel_selector" alias="color 44"/>
+    <ColorAlias name="gtk_midi_track" alias="color 64"/>
+    <ColorAlias name="gtk_monitor" alias="color 8"/>
+    <ColorAlias name="gtk_mono" alias="color 95"/>
+    <ColorAlias name="gtk_mute" alias="color 52"/>
+    <ColorAlias name="gtk_not_so_bright_indicator" alias="color 32"/>
+    <ColorAlias name="gtk_processor_fader" alias="color 94"/>
+    <ColorAlias name="gtk_processor_fader_frame" alias="color 104"/>
+    <ColorAlias name="gtk_processor_frame_selected" alias="color 32"/>
+    <ColorAlias name="gtk_processor_postfader" alias="color 79"/>
+    <ColorAlias name="gtk_processor_postfader_frame" alias="color 103"/>
+    <ColorAlias name="gtk_processor_prefader" alias="color 23"/>
+    <ColorAlias name="gtk_processor_prefader_frame" alias="color 23"/>
+    <ColorAlias name="gtk_send_bg" alias="color 38"/>
+    <ColorAlias name="gtk_send_fg" alias="color 24"/>
+    <ColorAlias name="gtk_solo" alias="color 91"/>
+    <ColorAlias name="gtk_somewhat_bright_indicator" alias="color 89"/>
+    <ColorAlias name="gtk_texts" alias="color 7"/>
+    <ColorAlias name="gtk_track_header_inactive" alias="color 34"/>
+    <ColorAlias name="gtk_track_header_selected" alias="color 59"/>
+    <ColorAlias name="image track" alias="color 31"/>
+    <ColorAlias name="inactive crossfade" alias="color 32"/>
+    <ColorAlias name="inactive fade handle" alias="color 33"/>
+    <ColorAlias name="inactive group tab" alias="color 34"/>
+    <ColorAlias name="invert button: fill active" alias="color 35"/>
+    <ColorAlias name="invert button: led active" alias="color 37"/>
+    <ColorAlias name="location cd marker" alias="color 38"/>
+    <ColorAlias name="location loop" alias="color 33"/>
+    <ColorAlias name="location marker" alias="color 32"/>
+    <ColorAlias name="location punch" alias="color 23"/>
+    <ColorAlias name="location range" alias="color 41"/>
+    <ColorAlias name="lock button: fill active" alias="color 42"/>
+    <ColorAlias name="lock button: led active" alias="color 4"/>
+    <ColorAlias name="marker bar" alias="color 2"/>
+    <ColorAlias name="marker bar separator" alias="color 27"/>
+    <ColorAlias name="marker drag line" alias="meter color1"/>
+    <ColorAlias name="marker label" alias="color 4"/>
+    <ColorAlias name="marker track" alias="color 31"/>
+    <ColorAlias name="master monitor section button active: fill" alias="color 40"/>
+    <ColorAlias name="master monitor section button active: fill active" alias="color 54"/>
+    <ColorAlias name="master monitor section button normal: fill active" alias="color 42"/>
+    <ColorAlias name="measure line bar" alias="color 67"/>
+    <ColorAlias name="measure line beat" alias="color 81"/>
+    <ColorAlias name="meter background bottom" alias="color 67"/>
+    <ColorAlias name="meter background top" alias="color 67"/>
+    <ColorAlias name="meter bar" alias="color 7"/>
+    <ColorAlias name="meter color BBC" alias="color 8"/>
+    <ColorAlias name="meter marker" alias="color 19"/>
+    <ColorAlias name="meterbridge label: fill" alias="color 34"/>
+    <ColorAlias name="meterbridge label: fill active" alias="color 46"/>
+    <ColorAlias name="meterbridge label: led" alias="color 9"/>
+    <ColorAlias name="meterbridge label: led active" alias="color 9"/>
+    <ColorAlias name="meterbridge peakindicator: fill" alias="color 34"/>
+    <ColorAlias name="meterbridge peakindicator: fill active" alias="color 9"/>
+    <ColorAlias name="meterbridge peakindicator: led" alias="color 9"/>
+    <ColorAlias name="meterbridge peakindicator: led active" alias="color 9"/>
+    <ColorAlias name="meterbridge peaklabel" alias="color 9"/>
+    <ColorAlias name="meterstrip dpm bg" alias="color 27"/>
+    <ColorAlias name="meterstrip dpm fg" alias="color 31"/>
+    <ColorAlias name="meterstrip ppm bg" alias="color 27"/>
+    <ColorAlias name="meterstrip ppm fg" alias="color 31"/>
+    <ColorAlias name="meterstrip vu bg" alias="color 32"/>
+    <ColorAlias name="meterstrip vu fg" alias="color 4"/>
+    <ColorAlias name="midi automation track fill" alias="color 22"/>
+    <ColorAlias name="midi bus base" alias="color 15"/>
+    <ColorAlias name="midi device: fill" alias="color 25"/>
+    <ColorAlias name="midi device: fill active" alias="color 42"/>
+    <ColorAlias name="midi device: led active" alias="color 17"/>
+    <ColorAlias name="midi frame base" alias="color 81"/>
+    <ColorAlias name="midi input button: fill active" alias="color 63"/>
+    <ColorAlias name="midi input button: led active" alias="color 4"/>
+    <ColorAlias name="midi meter color0" alias="color 52"/>
+    <ColorAlias name="midi meter color1" alias="color 53"/>
+    <ColorAlias name="midi meter color2" alias="color 53"/>
+    <ColorAlias name="midi meter color3" alias="color 54"/>
+    <ColorAlias name="midi meter color4" alias="color 54"/>
+    <ColorAlias name="midi meter color5" alias="color 55"/>
+    <ColorAlias name="midi meter color6" alias="color 55"/>
+    <ColorAlias name="midi meter color7" alias="color 56"/>
+    <ColorAlias name="midi meter color8" alias="color 56"/>
+    <ColorAlias name="midi meter color9" alias="color 17"/>
+    <ColorAlias name="midi note inactive channel" alias="color 4"/>
+    <ColorAlias name="midi note max" alias="color 17"/>
+    <ColorAlias name="midi note mid" alias="color 62"/>
+    <ColorAlias name="midi note min" alias="color 93"/>
+    <ColorAlias name="midi note selected" alias="color 25"/>
+    <ColorAlias name="midi note selected outline" alias="color 85"/>
+    <ColorAlias name="midi note velocity text" alias="color 32"/>
+    <ColorAlias name="midi patch change fill" alias="color 60"/>
+    <ColorAlias name="midi patch change outline" alias="color 26"/>
+    <ColorAlias name="midi select rect outline" alias="color 63"/>
+    <ColorAlias name="midi sysex fill" alias="color 32"/>
+    <ColorAlias name="midi sysex outline" alias="color 64"/>
+    <ColorAlias name="midi track base" alias="color 82"/>
+    <ColorAlias name="mixer strip button: fill active" alias="color 8"/>
+    <ColorAlias name="mixer strip button: led active" alias="color 8"/>
+    <ColorAlias name="mixer strip name button: fill active" alias="color 67"/>
+    <ColorAlias name="mixer strip name button: led active" alias="color 8"/>
+    <ColorAlias name="monitor button: fill active" alias="color 68"/>
+    <ColorAlias name="monitor button: led active" alias="color 9"/>
+    <ColorAlias name="monitor section dim: fill" alias="color 71"/>
+    <ColorAlias name="monitor section dim: fill active" alias="color 72"/>
+    <ColorAlias name="monitor section dim: led active" alias="color 37"/>
+    <ColorAlias name="monitor section knob" alias="color 60"/>
+    <ColorAlias name="monitor section knob: arc end" alias="color 70"/>
+    <ColorAlias name="monitor section knob: arc start" alias="color 16"/>
+    <ColorAlias name="monitor section mono: fill" alias="color 71"/>
+    <ColorAlias name="monitor section mono: fill active" alias="color 73"/>
+    <ColorAlias name="monitor section mono: led active" alias="color 37"/>
+    <ColorAlias name="monitor section processors present: fill" alias="color 20"/>
+    <ColorAlias name="monitor section processors toggle: fill active" alias="color 42"/>
+    <ColorAlias name="monitor section solo model: fill" alias="color 71"/>
+    <ColorAlias name="monitor section solo model: fill active" alias="color 42"/>
+    <ColorAlias name="monitor section solo model: led active" alias="color 8"/>
+    <ColorAlias name="monitor section solo option: fill" alias="color 71"/>
+    <ColorAlias name="monitor section solo option: fill active" alias="color 42"/>
+    <ColorAlias name="monitor section solo option: led active" alias="color 8"/>
+    <ColorAlias name="mono panner bg" alias="color 67"/>
+    <ColorAlias name="mono panner fill" alias="color 74"/>
+    <ColorAlias name="mono panner outline" alias="color 70"/>
+    <ColorAlias name="mono panner position fill" alias="color 11"/>
+    <ColorAlias name="mono panner position outline" alias="color 70"/>
+    <ColorAlias name="mono panner text" alias="color 34"/>
+    <ColorAlias name="mouse mode button: fill active" alias="color 59"/>
+    <ColorAlias name="mouse mode button: led active" alias="color 8"/>
+    <ColorAlias name="mute button: fill active" alias="color 75"/>
+    <ColorAlias name="mute button: led active" alias="color 4"/>
+    <ColorAlias name="name highlight fill" alias="color 18"/>
+    <ColorAlias name="name highlight outline" alias="color 23"/>
+    <ColorAlias name="nudge button: fill" alias="color 35"/>
+    <ColorAlias name="nudge button: fill active" alias="color 42"/>
+    <ColorAlias name="nudge button: led active" alias="color 8"/>
+    <ColorAlias name="nudge clock: background" alias="color 46"/>
+    <ColorAlias name="nudge clock: cursor" alias="color 8"/>
+    <ColorAlias name="nudge clock: edited text" alias="color 8"/>
+    <ColorAlias name="nudge clock: text" alias="color 62"/>
+    <ColorAlias name="page switch button: fill" alias="color 94"/>
+    <ColorAlias name="page switch button: fill active" alias="color 92"/>
+    <ColorAlias name="piano roll black" alias="color 76"/>
+    <ColorAlias name="piano roll black outline" alias="color 33"/>
+    <ColorAlias name="piano roll white" alias="color 13"/>
+    <ColorAlias name="play head" alias="color 70"/>
+    <ColorAlias name="plugin bypass button: led active" alias="meter color4"/>
+    <ColorAlias name="pluginlist filter button: fill active" alias="color 14"/>
+    <ColorAlias name="pluginlist hide button: led active" alias="color 14"/>
+    <ColorAlias name="processor automation line" alias="color 77"/>
+    <ColorAlias name="processor control button: fill" alias="color 29"/>
+    <ColorAlias name="processor control button: fill active" alias="color 46"/>
+    <ColorAlias name="processor control button: led active" alias="color 62"/>
+    <ColorAlias name="processor fader: fill" alias="color 16"/>
+    <ColorAlias name="processor fader: fill active" alias="color 78"/>
+    <ColorAlias name="processor fader: led active" alias="color 52"/>
+    <ColorAlias name="processor postfader: fill" alias="color 58"/>
+    <ColorAlias name="processor postfader: fill active" alias="color 79"/>
+    <ColorAlias name="processor postfader: led active" alias="color 52"/>
+    <ColorAlias name="processor prefader: fill" alias="color 73"/>
+    <ColorAlias name="processor prefader: fill active" alias="color 62"/>
+    <ColorAlias name="processor prefader: led active" alias="color 52"/>
+    <ColorAlias name="processor stub: fill" alias="color 46"/>
+    <ColorAlias name="processor stub: fill active" alias="color 46"/>
+    <ColorAlias name="punch button: fill" alias="color 20"/>
+    <ColorAlias name="punch button: fill active" alias="color 23"/>
+    <ColorAlias name="punch button: led active" alias="color 4"/>
+    <ColorAlias name="punch clock: background" alias="color 87"/>
+    <ColorAlias name="punch clock: cursor" alias="color 9"/>
+    <ColorAlias name="punch clock: edited text" alias="color 9"/>
+    <ColorAlias name="punch clock: text" alias="color 32"/>
+    <ColorAlias name="punch line" alias="color 83"/>
+    <ColorAlias name="range drag bar rect" alias="color 21"/>
+    <ColorAlias name="range drag rect" alias="color 56"/>
+    <ColorAlias name="range marker bar" alias="color 34"/>
+    <ColorAlias name="record enable button: fill active" alias="color 83"/>
+    <ColorAlias name="record enable button: led active" alias="color 85"/>
+    <ColorAlias name="recording rect" alias="color 86"/>
+    <ColorAlias name="recording waveform fill" alias="color 13"/>
+    <ColorAlias name="recording waveform outline" alias="color 43"/>
+    <ColorAlias name="region list automatic" alias="color 73"/>
+    <ColorAlias name="region list missing source" alias="color 9"/>
+    <ColorAlias name="region list whole file" alias="color 1"/>
+    <ColorAlias name="route button: fill active" alias="color 67"/>
+    <ColorAlias name="route button: led active" alias="color 8"/>
+    <ColorAlias name="rubber band rect" alias="color 88"/>
+    <ColorAlias name="rude audition: fill" alias="color 20"/>
+    <ColorAlias name="rude audition: fill active" alias="color 86"/>
+    <ColorAlias name="rude audition: led active" alias="color 4"/>
+    <ColorAlias name="rude isolate: fill" alias="color 42"/>
+    <ColorAlias name="rude isolate: fill active" alias="color 89"/>
+    <ColorAlias name="rude isolate: led active" alias="color 4"/>
+    <ColorAlias name="rude solo: fill" alias="color 20"/>
+    <ColorAlias name="rude solo: fill active" alias="color 17"/>
+    <ColorAlias name="rude solo: led active" alias="color 17"/>
+    <ColorAlias name="ruler base" alias="color 74"/>
+    <ColorAlias name="ruler text" alias="color 22"/>
+    <ColorAlias name="secondary clock: background" alias="color 67"/>
+    <ColorAlias name="secondary clock: cursor" alias="color 8"/>
+    <ColorAlias name="secondary clock: edited text" alias="color 8"/>
+    <ColorAlias name="secondary clock: text" alias="color 32"/>
+    <ColorAlias name="secondary delta clock: background" alias="color 21"/>
+    <ColorAlias name="secondary delta clock: cursor" alias="color 9"/>
+    <ColorAlias name="secondary delta clock: edited text" alias="color 9"/>
+    <ColorAlias name="secondary delta clock: text" alias="color 92"/>
+    <ColorAlias name="selected midi note frame" alias="color 63"/>
+    <ColorAlias name="selected region base" alias="color 22"/>
+    <ColorAlias name="selected time axis frame" alias="color 86"/>
+    <ColorAlias name="selected waveform fill" alias="color 21"/>
+    <ColorAlias name="selected waveform outline" alias="color 67"/>
+    <ColorAlias name="selection" alias="color 94"/>
+    <ColorAlias name="selection clock: background" alias="color 2"/>
+    <ColorAlias name="selection clock: cursor" alias="color 9"/>
+    <ColorAlias name="selection clock: edited text" alias="color 9"/>
+    <ColorAlias name="selection clock: text" alias="color 8"/>
+    <ColorAlias name="selection rect" alias="color 95"/>
+    <ColorAlias name="send alert button: fill" alias="color 71"/>
+    <ColorAlias name="send alert button: fill active" alias="color 38"/>
+    <ColorAlias name="send alert button: led active" alias="color 4"/>
+    <ColorAlias name="send bg" alias="color 38"/>
+    <ColorAlias name="shuttle" alias="color 12"/>
+    <ColorAlias name="shuttle bg" alias="color 4"/>
+    <ColorAlias name="shuttle text" alias="color 13"/>
+    <ColorAlias name="silence" alias="color 98"/>
+    <ColorAlias name="silence text" alias="color 29"/>
+    <ColorAlias name="solo button: fill active" alias="color 12"/>
+    <ColorAlias name="solo button: led active" alias="color 4"/>
+    <ColorAlias name="solo isolate: fill" alias="color 25"/>
+    <ColorAlias name="solo isolate: fill active" alias="color 42"/>
+    <ColorAlias name="solo isolate: led active" alias="color 9"/>
+    <ColorAlias name="solo safe: fill" alias="color 25"/>
+    <ColorAlias name="solo safe: fill active" alias="color 42"/>
+    <ColorAlias name="solo safe: led active" alias="color 9"/>
+    <ColorAlias name="stereo panner bg" alias="color 67"/>
+    <ColorAlias name="stereo panner fill" alias="color 74"/>
+    <ColorAlias name="stereo panner inverted bg" alias="color 61"/>
+    <ColorAlias name="stereo panner inverted fill" alias="color 100"/>
+    <ColorAlias name="stereo panner inverted outline" alias="color 83"/>
+    <ColorAlias name="stereo panner inverted text" alias="color 4"/>
+    <ColorAlias name="stereo panner mono bg" alias="color 67"/>
+    <ColorAlias name="stereo panner mono fill" alias="color 54"/>
+    <ColorAlias name="stereo panner mono outline" alias="color 101"/>
+    <ColorAlias name="stereo panner mono text" alias="color 4"/>
+    <ColorAlias name="stereo panner outline" alias="color 70"/>
+    <ColorAlias name="stereo panner rule" alias="color 70"/>
+    <ColorAlias name="stereo panner text" alias="color 34"/>
+    <ColorAlias name="stretch clock: background" alias="color 81"/>
+    <ColorAlias name="stretch clock: cursor" alias="color 8"/>
+    <ColorAlias name="stretch clock: edited text" alias="color 8"/>
+    <ColorAlias name="stretch clock: text" alias="color 91"/>
+    <ColorAlias name="sync mark" alias="color 75"/>
+    <ColorAlias name="tempo bar" alias="color 52"/>
+    <ColorAlias name="tempo curve" alias="color 62"/>
+    <ColorAlias name="tempo marker" alias="color 19"/>
+    <ColorAlias name="tempo marker music" alias="color 5"/>
+    <ColorAlias name="time axis frame" alias="color 4"/>
+    <ColorAlias name="time axis view item base" alias="color 94"/>
+    <ColorAlias name="time stretch fill" alias="color 100"/>
+    <ColorAlias name="time stretch outline" alias="color 94"/>
+    <ColorAlias name="tracknumber label: fill" alias="color 34"/>
+    <ColorAlias name="tracknumber label: fill active" alias="color 46"/>
+    <ColorAlias name="tracknumber label: led active" alias="color 9"/>
+    <ColorAlias name="transport active option button: fill active" alias="color 63"/>
+    <ColorAlias name="transport active option button: led active" alias="color 8"/>
+    <ColorAlias name="transport button: fill active" alias="color 18"/>
+    <ColorAlias name="transport button: led active" alias="color 4"/>
+    <ColorAlias name="transport clock: background" alias="color 34"/>
+    <ColorAlias name="transport clock: cursor" alias="color 8"/>
+    <ColorAlias name="transport clock: edited text" alias="color 8"/>
+    <ColorAlias name="transport clock: text" alias="color 13"/>
+    <ColorAlias name="transport delta clock: background" alias="color 27"/>
+    <ColorAlias name="transport delta clock: cursor" alias="color 9"/>
+    <ColorAlias name="transport delta clock: edited text" alias="color 9"/>
+    <ColorAlias name="transport delta clock: text" alias="color 92"/>
+    <ColorAlias name="transport drag rect" alias="color 21"/>
+    <ColorAlias name="transport loop rect" alias="color 63"/>
+    <ColorAlias name="transport marker bar" alias="color 25"/>
+    <ColorAlias name="transport option button: fill active" alias="color 42"/>
+    <ColorAlias name="transport option button: led active" alias="color 8"/>
+    <ColorAlias name="transport punch rect" alias="color 23"/>
+    <ColorAlias name="transport recenable button: fill" alias="color 20"/>
+    <ColorAlias name="transport recenable button: fill active" alias="color 83"/>
+    <ColorAlias name="transport recenable button: led active" alias="color 9"/>
+    <ColorAlias name="trim handle" alias="color 18"/>
+    <ColorAlias name="trim handle locked" alias="color 86"/>
+    <ColorAlias name="trim knob" alias="color 60"/>
+    <ColorAlias name="trim knob: arc end" alias="color 81"/>
+    <ColorAlias name="trim knob: arc start" alias="color 82"/>
+    <ColorAlias name="verbose canvas cursor" alias="color 32"/>
+    <ColorAlias name="video timeline bar" alias="color 46"/>
+    <ColorAlias name="waveform fill" alias="color 13"/>
+    <ColorAlias name="waveform outline" alias="color 4"/>
+    <ColorAlias name="zero line" alias="color 104"/>
+    <ColorAlias name="zoom button: fill active" alias="color 63"/>
+    <ColorAlias name="zoom button: led active" alias="color 8"/>
+  </ColorAliases>
+  <Modifiers>
+    <Modifier name="audio bus base" modifier="= alpha:0.3"/>
+    <Modifier name="audio track base" modifier="= alpha:0.3"/>
+    <Modifier name="automation track fill" modifier="= alpha:0.3"/>
+    <Modifier name="covered region base" modifier="= alpha:0.7"/>
+    <Modifier name="crossfade alpha" modifier="= alpha:0.1803"/>
+    <Modifier name="dragging region" modifier="= alpha:0.9"/>
+    <Modifier name="editable region" modifier="= alpha:0.0752019"/>
+    <Modifier name="gain line inactive" modifier="= alpha:0.7725"/>
+    <Modifier name="ghost track base" modifier="= alpha:0.640782"/>
+    <Modifier name="ghost track midi fill" modifier="= alpha:0.3"/>
+    <Modifier name="inactive crossfade" modifier="= alpha:0.4666"/>
+    <Modifier name="loop rectangle" modifier="= alpha:0.5"/>
+    <Modifier name="marker bar" modifier="= alpha:0.5"/>
+    <Modifier name="measure line beat" modifier="= alpha:1"/>
+    <Modifier name="midi frame base" modifier="= alpha:0.814846"/>
+    <Modifier name="midi note" modifier="= alpha:0.8"/>
+    <Modifier name="midi note velocity text" modifier="= alpha:0.4666"/>
+    <Modifier name="midi patch change fill" modifier="= alpha:0.6274"/>
+    <Modifier name="midi sysex fill" modifier="= alpha:0.4666"/>
+    <Modifier name="midi track base" modifier="= alpha:0.3"/>
+    <Modifier name="mono panner position fill" modifier="= alpha:0.8"/>
+    <Modifier name="opaque region base" modifier="= alpha:0.949034"/>
+    <Modifier name="panner fill" modifier="= alpha:0.7882"/>
+    <Modifier name="piano roll black" modifier="= alpha:0.2"/>
+    <Modifier name="piano roll white" modifier="= alpha:0.2"/>
+    <Modifier name="recording rect" modifier="= alpha:0.25"/>
+    <Modifier name="selected midi note" modifier="= alpha:0.7529"/>
+    <Modifier name="selection rect" modifier="= alpha:0.507192"/>
+    <Modifier name="silence" modifier="= alpha:0.4784"/>
+    <Modifier name="stereo panner inverted" modifier="= alpha:0.7882"/>
+    <Modifier name="stereo panner inverted bg" modifier="= alpha:0.7529"/>
+    <Modifier name="time axis view item base" modifier="= alpha:0.7"/>
+    <Modifier name="time stretch fill" modifier="= alpha:0.5"/>
+    <Modifier name="transparent region base" modifier="= alpha:0.99"/>
+    <Modifier name="verbose canvas cursor" modifier="= alpha:0.4666"/>
+  </Modifiers>
+</Ardour>
diff --git a/gtk2_ardour/themes/caineville-ardour.colors b/gtk2_ardour/themes/caineville-ardour.colors
new file mode 100644
index 0000000..b80b1dc
--- /dev/null
+++ b/gtk2_ardour/themes/caineville-ardour.colors
@@ -0,0 +1,518 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Ardour theme-name="Caineville">
+  <Colors>
+    <Color name="color 1" value="0x20b2b2ff"/>
+    <Color name="color 10" value="0xf0f0f0ff"/>
+    <Color name="color 100" value="0xe49c9cff"/>
+    <Color name="color 101" value="0xa06000ff"/>
+    <Color name="color 103" value="0x1e7753ff"/>
+    <Color name="color 104" value="0x7f7f7fff"/>
+    <Color name="color 11" value="0x9496a3ff"/>
+    <Color name="color 12" value="0xfdc705ff"/>
+    <Color name="color 13" value="0xffffffff"/>
+    <Color name="color 14" value="0x55ccccff"/>
+    <Color name="color 15" value="0x282b49ff"/>
+    <Color name="color 16" value="0x4e8099ff"/>
+    <Color name="color 17" value="0x00ffdfff"/>
+    <Color name="color 18" value="0x001affff"/>
+    <Color name="color 19" value="0xff0000ff"/>
+    <Color name="color 2" value="0x595959ff"/>
+    <Color name="color 20" value="0x684d4dff"/>
+    <Color name="color 21" value="0x969696ff"/>
+    <Color name="color 22" value="0xe5e5e5ff"/>
+    <Color name="color 23" value="0xff0000ff"/>
+    <Color name="color 24" value="0x9fbca2ff"/>
+    <Color name="color 25" value="0x444444ff"/>
+    <Color name="color 26" value="0xc7c9d8ff"/>
+    <Color name="color 27" value="0x191919ff"/>
+    <Color name="color 28" value="0x5d3e7cff"/>
+    <Color name="color 29" value="0x202020ff"/>
+    <Color name="color 3" value="0x738299ff"/>
+    <Color name="color 30" value="0xe500cfff"/>
+    <Color name="color 31" value="0xddddd8ff"/>
+    <Color name="color 32" value="0xeddc3d77"/>
+    <Color name="color 33" value="0x9e9e9eff"/>
+    <Color name="color 34" value="0x8d8d8dff"/>
+    <Color name="color 35" value="0x4250d0ff"/>
+    <Color name="color 36" value="0x7f7a73ff"/>
+    <Color name="color 37" value="0x00fff6ff"/>
+    <Color name="color 38" value="0x1ee8acff"/>
+    <Color name="color 39" value="0xcececeff"/>
+    <Color name="color 4" value="0x000000ff"/>
+    <Color name="color 40" value="0xb5b2b1ff"/>
+    <Color name="color 41" value="0x497a5dff"/>
+    <Color name="color 42" value="0x404145ff"/>
+    <Color name="color 43" value="0x000424ff"/>
+    <Color name="color 44" value="0x004f3cff"/>
+    <Color name="color 45" value="0xa29e9eff"/>
+    <Color name="color 46" value="0x8d8d8dff"/>
+    <Color name="color 47" value="0x008852ff"/>
+    <Color name="color 48" value="0xddddddff"/>
+    <Color name="color 49" value="0xdbd4d4ff"/>
+    <Color name="color 5" value="0x9dadc4ff"/>
+    <Color name="color 50" value="0xeeeeecff"/>
+    <Color name="color 51" value="0x383d37ff"/>
+    <Color name="color 52" value="0xbba34cff"/>
+    <Color name="color 53" value="0xf2c37dff"/>
+    <Color name="color 54" value="0xf48352ff"/>
+    <Color name="color 55" value="0xf85813ff"/>
+    <Color name="color 56" value="0x8ec794ff"/>
+    <Color name="color 57" value="0x7ea854ff"/>
+    <Color name="color 58" value="0x696e64ff"/>
+    <Color name="color 59" value="0xb2baffff"/>
+    <Color name="color 6" value="0xe11111ff"/>
+    <Color name="color 60" value="0x50545aff"/>
+    <Color name="color 61" value="0x383333ff"/>
+    <Color name="color 62" value="0xffa500ff"/>
+    <Color name="color 63" value="0xfdc705ff"/>
+    <Color name="color 64" value="0xa7acd4ff"/>
+    <Color name="color 65" value="0xb8cca3ff"/>
+    <Color name="color 66" value="0x4f2f00ff"/>
+    <Color name="color 67" value="0x121212ff"/>
+    <Color name="color 68" value="0xc57805ff"/>
+    <Color name="color 69" value="0x030207ff"/>
+    <Color name="color 7" value="0x515151ff"/>
+    <Color name="color 70" value="0x304057ff"/>
+    <Color name="color 71" value="0x5f5a58ff"/>
+    <Color name="color 72" value="0xe58b05ff"/>
+    <Color name="color 73" value="0x3240c0ff"/>
+    <Color name="color 74" value="0xff4c15ff"/>
+    <Color name="color 75" value="0xe6bb3bff"/>
+    <Color name="color 76" value="0x6c6e6aff"/>
+    <Color name="color 77" value="0x7aadf9ff"/>
+    <Color name="color 78" value="0x2e769cff"/>
+    <Color name="color 79" value="0x6b806dff"/>
+    <Color name="color 8" value="0xe70b18ff"/>
+    <Color name="color 80" value="0x704d4dff"/>
+    <Color name="color 81" value="0xa5a5a5ff"/>
+    <Color name="color 82" value="0x0f4ab8ff"/>
+    <Color name="color 83" value="0xa80000ff"/>
+    <Color name="color 84" value="0x7b354aff"/>
+    <Color name="color 85" value="0xffa3bfff"/>
+    <Color name="color 86" value="0xcc2828ff"/>
+    <Color name="color 87" value="0x505050ff"/>
+    <Color name="color 88" value="0xc6c6c6ff"/>
+    <Color name="color 89" value="0xb6e8fdff"/>
+    <Color name="color 9" value="0xff6100ff"/>
+    <Color name="color 90" value="0x2c2121ff"/>
+    <Color name="color 91" value="0xf36363ff"/>
+    <Color name="color 92" value="0x8cd8f8ff"/>
+    <Color name="color 93" value="0x51578aff"/>
+    <Color name="color 94" value="0x636363ff"/>
+    <Color name="color 95" value="0xe4f4d3ff"/>
+    <Color name="color 96" value="0x24e59cff"/>
+    <Color name="color 97" value="0xccccccff"/>
+    <Color name="color 98" value="0x9e00ffff"/>
+    <Color name="color 99" value="0x8d8d8dff"/>
+    <Color name="meter color0" value="0x05ff6bff"/>
+    <Color name="meter color1" value="0x39ff00ff"/>
+    <Color name="meter color2" value="0x29ff17ff"/>
+    <Color name="meter color3" value="0xb2ff52ff"/>
+    <Color name="meter color4" value="0xe3ff00ff"/>
+    <Color name="meter color5" value="0xfff000ff"/>
+    <Color name="meter color6" value="0xff8800ff"/>
+    <Color name="meter color7" value="0xff8800ff"/>
+    <Color name="meter color8" value="0xff0000ff"/>
+    <Color name="meter color9" value="0xff0000ff"/>
+  </Colors>
+  <ColorAliases>
+    <ColorAlias name="active crossfade" alias="color 1"/>
+    <ColorAlias name="arrange base" alias="color 34"/>
+    <ColorAlias name="audio automation track fill" alias="color 70"/>
+    <ColorAlias name="audio bus base" alias="color 3"/>
+    <ColorAlias name="audio master bus base" alias="color 4"/>
+    <ColorAlias name="audio track base" alias="color 77"/>
+    <ColorAlias name="automation line" alias="color 23"/>
+    <ColorAlias name="automation track outline" alias="color 7"/>
+    <ColorAlias name="big clock active: background" alias="color 4"/>
+    <ColorAlias name="big clock active: cursor" alias="color 8"/>
+    <ColorAlias name="big clock active: edited text" alias="color 8"/>
+    <ColorAlias name="big clock active: text" alias="color 9"/>
+    <ColorAlias name="big clock: background" alias="color 67"/>
+    <ColorAlias name="big clock: cursor" alias="color 8"/>
+    <ColorAlias name="big clock: edited text" alias="color 8"/>
+    <ColorAlias name="big clock: text" alias="color 10"/>
+    <ColorAlias name="border color" alias="color 4"/>
+    <ColorAlias name="cd marker bar" alias="color 87"/>
+    <ColorAlias name="clipped waveform" alias="color 9"/>
+    <ColorAlias name="clock: background" alias="color 67"/>
+    <ColorAlias name="clock: cursor" alias="color 8"/>
+    <ColorAlias name="clock: edited text" alias="color 8"/>
+    <ColorAlias name="clock: text" alias="color 12"/>
+    <ColorAlias name="comment button: fill" alias="color 20"/>
+    <ColorAlias name="control point fill" alias="color 97"/>
+    <ColorAlias name="control point outline" alias="meter color8"/>
+    <ColorAlias name="control point selected fill" alias="color 13"/>
+    <ColorAlias name="control point selected outline" alias="color 91"/>
+    <ColorAlias name="covered region" alias="color 87"/>
+    <ColorAlias name="crossfade editor base" alias="color 15"/>
+    <ColorAlias name="crossfade editor line" alias="color 4"/>
+    <ColorAlias name="crossfade editor line shading" alias="color 16"/>
+    <ColorAlias name="crossfade editor point fill" alias="color 17"/>
+    <ColorAlias name="crossfade editor point outline" alias="color 18"/>
+    <ColorAlias name="crossfade editor wave" alias="color 13"/>
+    <ColorAlias name="crossfade line" alias="color 4"/>
+    <ColorAlias name="edit point" alias="color 18"/>
+    <ColorAlias name="entered automation line" alias="color 19"/>
+    <ColorAlias name="entered gain line" alias="color 19"/>
+    <ColorAlias name="entered marker" alias="color 19"/>
+    <ColorAlias name="feedback alert: fill" alias="color 63"/>
+    <ColorAlias name="feedback alert: fill active" alias="color 9"/>
+    <ColorAlias name="feedback alert: led active" alias="color 4"/>
+    <ColorAlias name="frame handle" alias="color 23"/>
+    <ColorAlias name="gain line" alias="color 6"/>
+    <ColorAlias name="gain line inactive" alias="color 24"/>
+    <ColorAlias name="generic button: fill" alias="color 33"/>
+    <ColorAlias name="generic button: fill active" alias="color 9"/>
+    <ColorAlias name="generic button: led active" alias="color 18"/>
+    <ColorAlias name="ghost track base" alias="color 46"/>
+    <ColorAlias name="ghost track midi outline" alias="color 4"/>
+    <ColorAlias name="ghost track wave" alias="color 29"/>
+    <ColorAlias name="ghost track wave clip" alias="color 29"/>
+    <ColorAlias name="ghost track wave fill" alias="color 29"/>
+    <ColorAlias name="ghost track zero line" alias="color 30"/>
+    <ColorAlias name="gtk_arm" alias="color 9"/>
+    <ColorAlias name="gtk_audio_bus" alias="color 42"/>
+    <ColorAlias name="gtk_audio_track" alias="color 46"/>
+    <ColorAlias name="gtk_automation_track_header" alias="color 42"/>
+    <ColorAlias name="gtk_background" alias="color 7"/>
+    <ColorAlias name="gtk_bases" alias="color 7"/>
+    <ColorAlias name="gtk_bg_selected" alias="color 99"/>
+    <ColorAlias name="gtk_bg_tooltip" alias="color 52"/>
+    <ColorAlias name="gtk_bright_color" alias="color 74"/>
+    <ColorAlias name="gtk_bright_indicator" alias="color 9"/>
+    <ColorAlias name="gtk_contrasting_indicator" alias="color 91"/>
+    <ColorAlias name="gtk_control_master" alias="color 64"/>
+    <ColorAlias name="gtk_control_text" alias="color 26"/>
+    <ColorAlias name="gtk_control_text2" alias="color 83"/>
+    <ColorAlias name="gtk_darkest" alias="color 67"/>
+    <ColorAlias name="gtk_entry_cursor" alias="color 9"/>
+    <ColorAlias name="gtk_fg_selected" alias="color 67"/>
+    <ColorAlias name="gtk_fg_tooltip" alias="color 29"/>
+    <ColorAlias name="gtk_foreground" alias="color 50"/>
+    <ColorAlias name="gtk_light_text_on_dark" alias="color 31"/>
+    <ColorAlias name="gtk_lightest" alias="color 13"/>
+    <ColorAlias name="gtk_midi_channel_selector" alias="color 44"/>
+    <ColorAlias name="gtk_midi_track" alias="color 46"/>
+    <ColorAlias name="gtk_monitor" alias="color 8"/>
+    <ColorAlias name="gtk_mono" alias="color 95"/>
+    <ColorAlias name="gtk_mute" alias="color 52"/>
+    <ColorAlias name="gtk_not_so_bright_indicator" alias="color 32"/>
+    <ColorAlias name="gtk_processor_fader" alias="color 94"/>
+    <ColorAlias name="gtk_processor_fader_frame" alias="color 104"/>
+    <ColorAlias name="gtk_processor_frame_selected" alias="color 32"/>
+    <ColorAlias name="gtk_processor_postfader" alias="color 79"/>
+    <ColorAlias name="gtk_processor_postfader_frame" alias="color 103"/>
+    <ColorAlias name="gtk_processor_prefader" alias="color 69"/>
+    <ColorAlias name="gtk_processor_prefader_frame" alias="color 69"/>
+    <ColorAlias name="gtk_send_bg" alias="color 38"/>
+    <ColorAlias name="gtk_send_fg" alias="color 24"/>
+    <ColorAlias name="gtk_solo" alias="color 91"/>
+    <ColorAlias name="gtk_somewhat_bright_indicator" alias="color 89"/>
+    <ColorAlias name="gtk_texts" alias="color 4"/>
+    <ColorAlias name="gtk_track_header_inactive" alias="color 34"/>
+    <ColorAlias name="gtk_track_header_selected" alias="color 40"/>
+    <ColorAlias name="image track" alias="color 31"/>
+    <ColorAlias name="inactive crossfade" alias="color 32"/>
+    <ColorAlias name="inactive fade handle" alias="color 33"/>
+    <ColorAlias name="inactive group tab" alias="color 34"/>
+    <ColorAlias name="invert button: fill active" alias="color 35"/>
+    <ColorAlias name="invert button: led active" alias="color 37"/>
+    <ColorAlias name="location cd marker" alias="color 38"/>
+    <ColorAlias name="location loop" alias="color 39"/>
+    <ColorAlias name="location marker" alias="color 32"/>
+    <ColorAlias name="location punch" alias="color 40"/>
+    <ColorAlias name="location range" alias="color 41"/>
+    <ColorAlias name="lock button: fill active" alias="color 42"/>
+    <ColorAlias name="lock button: led active" alias="color 4"/>
+    <ColorAlias name="marker bar" alias="color 2"/>
+    <ColorAlias name="marker bar separator" alias="color 27"/>
+    <ColorAlias name="marker drag line" alias="color 44"/>
+    <ColorAlias name="marker label" alias="color 4"/>
+    <ColorAlias name="marker track" alias="color 31"/>
+    <ColorAlias name="master monitor section button active: fill" alias="color 40"/>
+    <ColorAlias name="master monitor section button active: fill active" alias="color 54"/>
+    <ColorAlias name="master monitor section button normal: fill active" alias="color 42"/>
+    <ColorAlias name="measure line bar" alias="color 4"/>
+    <ColorAlias name="measure line beat" alias="color 94"/>
+    <ColorAlias name="meter background bottom" alias="color 4"/>
+    <ColorAlias name="meter background top" alias="color 4"/>
+    <ColorAlias name="meter bar" alias="color 7"/>
+    <ColorAlias name="meter color BBC" alias="color 8"/>
+    <ColorAlias name="meter marker" alias="color 19"/>
+    <ColorAlias name="meterbridge label: fill" alias="color 34"/>
+    <ColorAlias name="meterbridge label: fill active" alias="color 46"/>
+    <ColorAlias name="meterbridge label: led" alias="color 9"/>
+    <ColorAlias name="meterbridge label: led active" alias="color 9"/>
+    <ColorAlias name="meterbridge peakindicator: fill" alias="color 34"/>
+    <ColorAlias name="meterbridge peakindicator: fill active" alias="color 9"/>
+    <ColorAlias name="meterbridge peakindicator: led" alias="color 9"/>
+    <ColorAlias name="meterbridge peakindicator: led active" alias="color 9"/>
+    <ColorAlias name="meterbridge peaklabel" alias="color 9"/>
+    <ColorAlias name="meterstrip dpm bg" alias="color 27"/>
+    <ColorAlias name="meterstrip dpm fg" alias="color 31"/>
+    <ColorAlias name="meterstrip ppm bg" alias="color 27"/>
+    <ColorAlias name="meterstrip ppm fg" alias="color 31"/>
+    <ColorAlias name="meterstrip vu bg" alias="color 32"/>
+    <ColorAlias name="meterstrip vu fg" alias="color 4"/>
+    <ColorAlias name="midi automation track fill" alias="color 58"/>
+    <ColorAlias name="midi bus base" alias="color 4"/>
+    <ColorAlias name="midi device: fill" alias="color 25"/>
+    <ColorAlias name="midi device: fill active" alias="color 42"/>
+    <ColorAlias name="midi device: led active" alias="color 17"/>
+    <ColorAlias name="midi frame base" alias="color 87"/>
+    <ColorAlias name="midi input button: fill active" alias="color 48"/>
+    <ColorAlias name="midi input button: led active" alias="color 4"/>
+    <ColorAlias name="midi meter color0" alias="color 52"/>
+    <ColorAlias name="midi meter color1" alias="color 53"/>
+    <ColorAlias name="midi meter color2" alias="color 53"/>
+    <ColorAlias name="midi meter color3" alias="color 54"/>
+    <ColorAlias name="midi meter color4" alias="color 54"/>
+    <ColorAlias name="midi meter color5" alias="color 55"/>
+    <ColorAlias name="midi meter color6" alias="color 55"/>
+    <ColorAlias name="midi meter color7" alias="color 56"/>
+    <ColorAlias name="midi meter color8" alias="color 56"/>
+    <ColorAlias name="midi meter color9" alias="meter color3"/>
+    <ColorAlias name="midi note inactive channel" alias="color 4"/>
+    <ColorAlias name="midi note max" alias="color 8"/>
+    <ColorAlias name="midi note mid" alias="color 91"/>
+    <ColorAlias name="midi note min" alias="color 49"/>
+    <ColorAlias name="midi note selected" alias="color 80"/>
+    <ColorAlias name="midi note selected outline" alias="color 67"/>
+    <ColorAlias name="midi note velocity text" alias="color 32"/>
+    <ColorAlias name="midi patch change fill" alias="color 60"/>
+    <ColorAlias name="midi patch change outline" alias="color 26"/>
+    <ColorAlias name="midi select rect outline" alias="color 63"/>
+    <ColorAlias name="midi sysex fill" alias="color 32"/>
+    <ColorAlias name="midi sysex outline" alias="color 64"/>
+    <ColorAlias name="midi track base" alias="color 39"/>
+    <ColorAlias name="mixer strip button: fill active" alias="color 8"/>
+    <ColorAlias name="mixer strip button: led active" alias="color 8"/>
+    <ColorAlias name="mixer strip name button: fill active" alias="color 67"/>
+    <ColorAlias name="mixer strip name button: led active" alias="color 8"/>
+    <ColorAlias name="monitor button: fill active" alias="color 68"/>
+    <ColorAlias name="monitor button: led active" alias="color 9"/>
+    <ColorAlias name="monitor section dim: fill" alias="color 71"/>
+    <ColorAlias name="monitor section dim: fill active" alias="color 72"/>
+    <ColorAlias name="monitor section dim: led active" alias="color 37"/>
+    <ColorAlias name="monitor section knob" alias="color 60"/>
+    <ColorAlias name="monitor section knob: arc end" alias="color 9"/>
+    <ColorAlias name="monitor section knob: arc start" alias="meter color6"/>
+    <ColorAlias name="monitor section mono: fill" alias="color 71"/>
+    <ColorAlias name="monitor section mono: fill active" alias="color 73"/>
+    <ColorAlias name="monitor section mono: led active" alias="color 37"/>
+    <ColorAlias name="monitor section processors present: fill" alias="color 20"/>
+    <ColorAlias name="monitor section processors toggle: fill active" alias="color 42"/>
+    <ColorAlias name="monitor section solo model: fill" alias="color 71"/>
+    <ColorAlias name="monitor section solo model: fill active" alias="color 42"/>
+    <ColorAlias name="monitor section solo model: led active" alias="color 8"/>
+    <ColorAlias name="monitor section solo option: fill" alias="color 71"/>
+    <ColorAlias name="monitor section solo option: fill active" alias="color 42"/>
+    <ColorAlias name="monitor section solo option: led active" alias="color 8"/>
+    <ColorAlias name="mono panner bg" alias="color 67"/>
+    <ColorAlias name="mono panner fill" alias="color 74"/>
+    <ColorAlias name="mono panner outline" alias="color 70"/>
+    <ColorAlias name="mono panner position fill" alias="color 11"/>
+    <ColorAlias name="mono panner position outline" alias="color 70"/>
+    <ColorAlias name="mono panner text" alias="color 4"/>
+    <ColorAlias name="mouse mode button: fill active" alias="color 12"/>
+    <ColorAlias name="mouse mode button: led active" alias="color 8"/>
+    <ColorAlias name="mute button: fill active" alias="color 75"/>
+    <ColorAlias name="mute button: led active" alias="color 4"/>
+    <ColorAlias name="name highlight fill" alias="color 18"/>
+    <ColorAlias name="name highlight outline" alias="color 23"/>
+    <ColorAlias name="nudge button: fill" alias="color 63"/>
+    <ColorAlias name="nudge button: fill active" alias="color 42"/>
+    <ColorAlias name="nudge button: led active" alias="color 8"/>
+    <ColorAlias name="nudge clock: background" alias="color 67"/>
+    <ColorAlias name="nudge clock: cursor" alias="color 8"/>
+    <ColorAlias name="nudge clock: edited text" alias="color 8"/>
+    <ColorAlias name="nudge clock: text" alias="color 12"/>
+    <ColorAlias name="piano roll black" alias="color 76"/>
+    <ColorAlias name="piano roll black outline" alias="color 33"/>
+    <ColorAlias name="piano roll white" alias="color 45"/>
+    <ColorAlias name="play head" alias="color 9"/>
+    <ColorAlias name="plugin bypass button: led active" alias="color 8"/>
+    <ColorAlias name="pluginlist filter button: fill active" alias="color 14"/>
+    <ColorAlias name="pluginlist hide button: led active" alias="color 14"/>
+    <ColorAlias name="processor automation line" alias="color 77"/>
+    <ColorAlias name="processor control button: fill" alias="color 29"/>
+    <ColorAlias name="processor control button: fill active" alias="color 46"/>
+    <ColorAlias name="processor control button: led active" alias="color 62"/>
+    <ColorAlias name="processor fader: fill" alias="color 87"/>
+    <ColorAlias name="processor fader: fill active" alias="color 21"/>
+    <ColorAlias name="processor fader: led active" alias="color 9"/>
+    <ColorAlias name="processor postfader: fill" alias="color 58"/>
+    <ColorAlias name="processor postfader: fill active" alias="color 79"/>
+    <ColorAlias name="processor postfader: led active" alias="color 9"/>
+    <ColorAlias name="processor prefader: fill" alias="color 40"/>
+    <ColorAlias name="processor prefader: fill active" alias="color 80"/>
+    <ColorAlias name="processor prefader: led active" alias="color 9"/>
+    <ColorAlias name="processor stub: fill" alias="color 46"/>
+    <ColorAlias name="processor stub: fill active" alias="color 46"/>
+    <ColorAlias name="punch button: fill" alias="color 63"/>
+    <ColorAlias name="punch button: fill active" alias="color 9"/>
+    <ColorAlias name="punch button: led active" alias="color 4"/>
+    <ColorAlias name="punch clock: background" alias="color 67"/>
+    <ColorAlias name="punch clock: cursor" alias="color 9"/>
+    <ColorAlias name="punch clock: edited text" alias="color 9"/>
+    <ColorAlias name="punch clock: text" alias="color 12"/>
+    <ColorAlias name="punch line" alias="color 83"/>
+    <ColorAlias name="range drag bar rect" alias="color 21"/>
+    <ColorAlias name="range drag rect" alias="color 56"/>
+    <ColorAlias name="range marker bar" alias="color 34"/>
+    <ColorAlias name="record enable button: fill active" alias="color 83"/>
+    <ColorAlias name="record enable button: led active" alias="color 85"/>
+    <ColorAlias name="recording rect" alias="color 86"/>
+    <ColorAlias name="recording waveform fill" alias="color 13"/>
+    <ColorAlias name="recording waveform outline" alias="color 43"/>
+    <ColorAlias name="region list automatic" alias="color 53"/>
+    <ColorAlias name="region list missing source" alias="color 9"/>
+    <ColorAlias name="region list whole file" alias="color 1"/>
+    <ColorAlias name="route button: fill active" alias="color 67"/>
+    <ColorAlias name="route button: led active" alias="color 8"/>
+    <ColorAlias name="rubber band rect" alias="color 88"/>
+    <ColorAlias name="rude audition: fill" alias="color 63"/>
+    <ColorAlias name="rude audition: fill active" alias="color 86"/>
+    <ColorAlias name="rude audition: led active" alias="color 4"/>
+    <ColorAlias name="rude isolate: fill" alias="color 42"/>
+    <ColorAlias name="rude isolate: fill active" alias="color 89"/>
+    <ColorAlias name="rude isolate: led active" alias="color 4"/>
+    <ColorAlias name="rude solo: fill" alias="color 63"/>
+    <ColorAlias name="rude solo: fill active" alias="color 82"/>
+    <ColorAlias name="rude solo: led active" alias="color 4"/>
+    <ColorAlias name="ruler base" alias="color 25"/>
+    <ColorAlias name="ruler text" alias="color 4"/>
+    <ColorAlias name="secondary clock: background" alias="color 67"/>
+    <ColorAlias name="secondary clock: cursor" alias="color 8"/>
+    <ColorAlias name="secondary clock: edited text" alias="color 8"/>
+    <ColorAlias name="secondary clock: text" alias="color 88"/>
+    <ColorAlias name="secondary delta clock: background" alias="color 67"/>
+    <ColorAlias name="secondary delta clock: cursor" alias="color 9"/>
+    <ColorAlias name="secondary delta clock: edited text" alias="color 9"/>
+    <ColorAlias name="secondary delta clock: text" alias="color 92"/>
+    <ColorAlias name="selected midi note frame" alias="color 4"/>
+    <ColorAlias name="selected region base" alias="meter color5"/>
+    <ColorAlias name="selected time axis frame" alias="color 86"/>
+    <ColorAlias name="selected waveform fill" alias="color 94"/>
+    <ColorAlias name="selected waveform outline" alias="color 67"/>
+    <ColorAlias name="selection" alias="color 13"/>
+    <ColorAlias name="selection clock: background" alias="color 67"/>
+    <ColorAlias name="selection clock: cursor" alias="color 9"/>
+    <ColorAlias name="selection clock: edited text" alias="color 9"/>
+    <ColorAlias name="selection clock: text" alias="color 12"/>
+    <ColorAlias name="selection rect" alias="color 37"/>
+    <ColorAlias name="send alert button: fill" alias="color 71"/>
+    <ColorAlias name="send alert button: fill active" alias="color 38"/>
+    <ColorAlias name="send alert button: led active" alias="color 4"/>
+    <ColorAlias name="send bg" alias="color 38"/>
+    <ColorAlias name="shuttle" alias="color 12"/>
+    <ColorAlias name="shuttle bg" alias="color 4"/>
+    <ColorAlias name="shuttle text" alias="color 13"/>
+    <ColorAlias name="silence" alias="color 98"/>
+    <ColorAlias name="silence text" alias="color 10"/>
+    <ColorAlias name="solo button: fill active" alias="color 82"/>
+    <ColorAlias name="solo button: led active" alias="color 4"/>
+    <ColorAlias name="solo isolate: fill" alias="color 25"/>
+    <ColorAlias name="solo isolate: fill active" alias="color 42"/>
+    <ColorAlias name="solo isolate: led active" alias="color 9"/>
+    <ColorAlias name="solo safe: fill" alias="color 25"/>
+    <ColorAlias name="solo safe: fill active" alias="color 42"/>
+    <ColorAlias name="solo safe: led active" alias="color 9"/>
+    <ColorAlias name="stereo panner bg" alias="color 67"/>
+    <ColorAlias name="stereo panner fill" alias="color 74"/>
+    <ColorAlias name="stereo panner inverted bg" alias="color 61"/>
+    <ColorAlias name="stereo panner inverted fill" alias="color 100"/>
+    <ColorAlias name="stereo panner inverted outline" alias="color 83"/>
+    <ColorAlias name="stereo panner inverted text" alias="color 4"/>
+    <ColorAlias name="stereo panner mono bg" alias="color 67"/>
+    <ColorAlias name="stereo panner mono fill" alias="color 54"/>
+    <ColorAlias name="stereo panner mono outline" alias="color 101"/>
+    <ColorAlias name="stereo panner mono text" alias="color 4"/>
+    <ColorAlias name="stereo panner outline" alias="color 70"/>
+    <ColorAlias name="stereo panner rule" alias="color 70"/>
+    <ColorAlias name="stereo panner text" alias="color 4"/>
+    <ColorAlias name="sync mark" alias="color 75"/>
+    <ColorAlias name="tempo bar" alias="color 46"/>
+    <ColorAlias name="tempo curve" alias="color 62"/>
+    <ColorAlias name="tempo marker" alias="color 19"/>
+    <ColorAlias name="tempo marker music" alias="color 5"/>
+    <ColorAlias name="time axis frame" alias="color 4"/>
+    <ColorAlias name="time axis view item base" alias="color 94"/>
+    <ColorAlias name="time stretch fill" alias="color 100"/>
+    <ColorAlias name="time stretch outline" alias="color 94"/>
+    <ColorAlias name="tracknumber label: fill" alias="color 34"/>
+    <ColorAlias name="tracknumber label: fill active" alias="color 46"/>
+    <ColorAlias name="tracknumber label: led active" alias="color 9"/>
+    <ColorAlias name="transport active option button: fill active" alias="color 48"/>
+    <ColorAlias name="transport active option button: led active" alias="color 8"/>
+    <ColorAlias name="transport button: fill active" alias="color 12"/>
+    <ColorAlias name="transport button: led active" alias="color 4"/>
+    <ColorAlias name="transport clock: background" alias="color 67"/>
+    <ColorAlias name="transport clock: cursor" alias="color 8"/>
+    <ColorAlias name="transport clock: edited text" alias="color 8"/>
+    <ColorAlias name="transport clock: text" alias="color 9"/>
+    <ColorAlias name="transport delta clock: background" alias="color 67"/>
+    <ColorAlias name="transport delta clock: cursor" alias="color 9"/>
+    <ColorAlias name="transport delta clock: edited text" alias="color 9"/>
+    <ColorAlias name="transport delta clock: text" alias="color 92"/>
+    <ColorAlias name="transport drag rect" alias="color 21"/>
+    <ColorAlias name="transport loop rect" alias="color 48"/>
+    <ColorAlias name="transport marker bar" alias="color 25"/>
+    <ColorAlias name="transport option button: fill active" alias="color 42"/>
+    <ColorAlias name="transport option button: led active" alias="color 8"/>
+    <ColorAlias name="transport punch rect" alias="color 62"/>
+    <ColorAlias name="transport recenable button: fill" alias="color 20"/>
+    <ColorAlias name="transport recenable button: fill active" alias="color 83"/>
+    <ColorAlias name="transport recenable button: led active" alias="color 4"/>
+    <ColorAlias name="trim handle" alias="color 18"/>
+    <ColorAlias name="trim handle locked" alias="color 86"/>
+    <ColorAlias name="trim knob" alias="color 60"/>
+    <ColorAlias name="trim knob: arc end" alias="meter color6"/>
+    <ColorAlias name="trim knob: arc start" alias="color 9"/>
+    <ColorAlias name="verbose canvas cursor" alias="color 32"/>
+    <ColorAlias name="video timeline bar" alias="color 46"/>
+    <ColorAlias name="waveform fill" alias="color 13"/>
+    <ColorAlias name="waveform outline" alias="color 4"/>
+    <ColorAlias name="zero line" alias="color 104"/>
+    <ColorAlias name="zoom button: fill active" alias="color 48"/>
+    <ColorAlias name="zoom button: led active" alias="color 8"/>
+  </ColorAliases>
+  <Modifiers>
+    <Modifier name="audio bus base" modifier="= alpha:0.3"/>
+    <Modifier name="audio track base" modifier="= alpha:0.32"/>
+    <Modifier name="automation track fill" modifier="= alpha:0.3"/>
+    <Modifier name="covered region base" modifier="= alpha:0.680625"/>
+    <Modifier name="crossfade alpha" modifier="= alpha:0.1803"/>
+    <Modifier name="dragging region" modifier="= alpha:0.92"/>
+    <Modifier name="editable region" modifier="= alpha:0"/>
+    <Modifier name="gain line inactive" modifier="= alpha:0.7725"/>
+    <Modifier name="ghost track base" modifier="= alpha:0.640782"/>
+    <Modifier name="ghost track midi fill" modifier="= alpha:0.3"/>
+    <Modifier name="inactive crossfade" modifier="= alpha:0.4666"/>
+    <Modifier name="loop rectangle" modifier="= alpha:0.5"/>
+    <Modifier name="marker bar" modifier="= alpha:0.5"/>
+    <Modifier name="measure line beat" modifier="= alpha:1"/>
+    <Modifier name="midi frame base" modifier="= alpha:0.720606"/>
+    <Modifier name="midi note" modifier="= alpha:0.8"/>
+    <Modifier name="midi note velocity text" modifier="= alpha:0.4666"/>
+    <Modifier name="midi patch change fill" modifier="= alpha:0.6274"/>
+    <Modifier name="midi sysex fill" modifier="= alpha:0.4666"/>
+    <Modifier name="midi track base" modifier="= alpha:0.3"/>
+    <Modifier name="mono panner position fill" modifier="= alpha:0.8"/>
+    <Modifier name="opaque region base" modifier="= alpha:0.75"/>
+    <Modifier name="panner fill" modifier="= alpha:0.7882"/>
+    <Modifier name="piano roll black" modifier="= alpha:0.2"/>
+    <Modifier name="piano roll white" modifier="= alpha:0.2"/>
+    <Modifier name="recording rect" modifier="= alpha:0.275106"/>
+    <Modifier name="selected midi note" modifier="= alpha:0.7529"/>
+    <Modifier name="selection rect" modifier="= alpha:0.791048"/>
+    <Modifier name="silence" modifier="= alpha:0.4784"/>
+    <Modifier name="stereo panner inverted" modifier="= alpha:0.7882"/>
+    <Modifier name="stereo panner inverted bg" modifier="= alpha:0.7529"/>
+    <Modifier name="time axis view item base" modifier="= alpha:0.7"/>
+    <Modifier name="time stretch fill" modifier="= alpha:0.5"/>
+    <Modifier name="transparent region base" modifier="= alpha:0.693"/>
+    <Modifier name="verbose canvas cursor" modifier="= alpha:0.4666"/>
+  </Modifiers>
+</Ardour>
diff --git a/gtk2_ardour/themes/clear-gray-ardour.colors b/gtk2_ardour/themes/clear-gray-ardour.colors
new file mode 100644
index 0000000..ad9f3f6
--- /dev/null
+++ b/gtk2_ardour/themes/clear-gray-ardour.colors
@@ -0,0 +1,514 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Ardour theme-name="Clear Gray">
+  <Colors>
+    <Color name="color 1" value="0x20b2b2ff"/>
+    <Color name="color 10" value="0xf0f0f0ff"/>
+    <Color name="color 100" value="0xe49c9cff"/>
+    <Color name="color 101" value="0xa06000ff"/>
+    <Color name="color 103" value="0x1e7753ff"/>
+    <Color name="color 104" value="0x7f7f7fff"/>
+    <Color name="color 11" value="0x9496a3ff"/>
+    <Color name="color 12" value="0xfdc705ff"/>
+    <Color name="color 13" value="0xffffffff"/>
+    <Color name="color 14" value="0x55ccccff"/>
+    <Color name="color 15" value="0x282b49ff"/>
+    <Color name="color 16" value="0x4e8099ff"/>
+    <Color name="color 17" value="0x00ffdfff"/>
+    <Color name="color 18" value="0x001affff"/>
+    <Color name="color 19" value="0xff0000ff"/>
+    <Color name="color 2" value="0x595959ff"/>
+    <Color name="color 20" value="0x684d4dff"/>
+    <Color name="color 21" value="0x969696ff"/>
+    <Color name="color 22" value="0xe5e5e5ff"/>
+    <Color name="color 23" value="0xff0000ff"/>
+    <Color name="color 24" value="0x9fbca2ff"/>
+    <Color name="color 25" value="0x333333ff"/>
+    <Color name="color 26" value="0xc7c9d8ff"/>
+    <Color name="color 27" value="0x191919ff"/>
+    <Color name="color 28" value="0x5d3e7cff"/>
+    <Color name="color 29" value="0x202020ff"/>
+    <Color name="color 3" value="0x738299ff"/>
+    <Color name="color 30" value="0xe500cfff"/>
+    <Color name="color 31" value="0xddddd8ff"/>
+    <Color name="color 32" value="0xeddc3d77"/>
+    <Color name="color 33" value="0x9e9e9eff"/>
+    <Color name="color 34" value="0x8d8d8dff"/>
+    <Color name="color 35" value="0x4250d0ff"/>
+    <Color name="color 36" value="0x7f7a73ff"/>
+    <Color name="color 37" value="0x00fff6ff"/>
+    <Color name="color 38" value="0x1ee8acff"/>
+    <Color name="color 39" value="0xcececeff"/>
+    <Color name="color 4" value="0x000000ff"/>
+    <Color name="color 40" value="0xb5b2b1ff"/>
+    <Color name="color 41" value="0x497a5dff"/>
+    <Color name="color 42" value="0x404145ff"/>
+    <Color name="color 43" value="0x000424ff"/>
+    <Color name="color 44" value="0x004f3cff"/>
+    <Color name="color 45" value="0xa29e9eff"/>
+    <Color name="color 46" value="0x8d8d8dff"/>
+    <Color name="color 47" value="0x008852ff"/>
+    <Color name="color 48" value="0xddddddff"/>
+    <Color name="color 49" value="0xdbd4d4ff"/>
+    <Color name="color 5" value="0x9dadc4ff"/>
+    <Color name="color 50" value="0xeeeeecff"/>
+    <Color name="color 51" value="0x383d37ff"/>
+    <Color name="color 52" value="0xbba34cff"/>
+    <Color name="color 53" value="0xf2c37dff"/>
+    <Color name="color 54" value="0xf48352ff"/>
+    <Color name="color 55" value="0xf82613ff"/>
+    <Color name="color 56" value="0x8ec794ff"/>
+    <Color name="color 57" value="0x7ea854ff"/>
+    <Color name="color 58" value="0x696e64ff"/>
+    <Color name="color 59" value="0xb2baffff"/>
+    <Color name="color 6" value="0xe11111ff"/>
+    <Color name="color 60" value="0x50545aff"/>
+    <Color name="color 61" value="0x383333ff"/>
+    <Color name="color 62" value="0xffa500ff"/>
+    <Color name="color 63" value="0xfdc705ff"/>
+    <Color name="color 64" value="0xa7acd4ff"/>
+    <Color name="color 65" value="0xb8cca3ff"/>
+    <Color name="color 66" value="0x4f2f00ff"/>
+    <Color name="color 67" value="0x121212ff"/>
+    <Color name="color 68" value="0xc57805ff"/>
+    <Color name="color 69" value="0x030207ff"/>
+    <Color name="color 7" value="0x515151ff"/>
+    <Color name="color 70" value="0x304057ff"/>
+    <Color name="color 71" value="0x5f5a58ff"/>
+    <Color name="color 72" value="0xe58b05ff"/>
+    <Color name="color 73" value="0x3240c0ff"/>
+    <Color name="color 74" value="0xffffffff"/>
+    <Color name="color 75" value="0xe6bb3bff"/>
+    <Color name="color 76" value="0x6c6e6aff"/>
+    <Color name="color 77" value="0x7aadf9ff"/>
+    <Color name="color 78" value="0x2e769cff"/>
+    <Color name="color 79" value="0x6b806dff"/>
+    <Color name="color 8" value="0xe70b18ff"/>
+    <Color name="color 80" value="0x704d4dff"/>
+    <Color name="color 81" value="0xa5a5a5ff"/>
+    <Color name="color 82" value="0x0f4ab8ff"/>
+    <Color name="color 83" value="0xa80000ff"/>
+    <Color name="color 84" value="0x7b354aff"/>
+    <Color name="color 85" value="0xffa3bfff"/>
+    <Color name="color 86" value="0xcc2828ff"/>
+    <Color name="color 87" value="0x505050ff"/>
+    <Color name="color 88" value="0xc6c6c6ff"/>
+    <Color name="color 89" value="0xb6e8fdff"/>
+    <Color name="color 9" value="0xff2900ff"/>
+    <Color name="color 90" value="0x2c2121ff"/>
+    <Color name="color 91" value="0xf36363ff"/>
+    <Color name="color 92" value="0x8cd8f8ff"/>
+    <Color name="color 93" value="0x51578aff"/>
+    <Color name="color 94" value="0x636363ff"/>
+    <Color name="color 95" value="0xe4f4d3ff"/>
+    <Color name="color 96" value="0x24e59cff"/>
+    <Color name="color 97" value="0xccccccff"/>
+    <Color name="color 98" value="0x9e00ffff"/>
+    <Color name="color 99" value="0x8d8d8dff"/>
+    <Color name="meter color0" value="0x05ff6bff"/>
+    <Color name="meter color1" value="0x39ff00ff"/>
+    <Color name="meter color2" value="0x29ff17ff"/>
+    <Color name="meter color3" value="0xb2ff52ff"/>
+    <Color name="meter color4" value="0xe3ff00ff"/>
+    <Color name="meter color5" value="0xfff000ff"/>
+    <Color name="meter color6" value="0xff8800ff"/>
+    <Color name="meter color7" value="0xff8800ff"/>
+    <Color name="meter color8" value="0xff0000ff"/>
+    <Color name="meter color9" value="0xff0000ff"/>
+  </Colors>
+  <ColorAliases>
+    <ColorAlias name="active crossfade" alias="color 1"/>
+    <ColorAlias name="arrange base" alias="color 74"/>
+    <ColorAlias name="audio automation track fill" alias="color 97"/>
+    <ColorAlias name="audio bus base" alias="color 104"/>
+    <ColorAlias name="audio master bus base" alias="color 4"/>
+    <ColorAlias name="audio track base" alias="color 10"/>
+    <ColorAlias name="automation line" alias="color 67"/>
+    <ColorAlias name="automation track outline" alias="color 7"/>
+    <ColorAlias name="big clock active: background" alias="color 4"/>
+    <ColorAlias name="big clock active: cursor" alias="color 8"/>
+    <ColorAlias name="big clock active: edited text" alias="color 8"/>
+    <ColorAlias name="big clock active: text" alias="color 13"/>
+    <ColorAlias name="big clock: background" alias="color 67"/>
+    <ColorAlias name="big clock: cursor" alias="color 8"/>
+    <ColorAlias name="big clock: edited text" alias="color 8"/>
+    <ColorAlias name="big clock: text" alias="color 10"/>
+    <ColorAlias name="border color" alias="color 4"/>
+    <ColorAlias name="cd marker bar" alias="color 87"/>
+    <ColorAlias name="clipped waveform" alias="color 19"/>
+    <ColorAlias name="clock: background" alias="color 67"/>
+    <ColorAlias name="clock: cursor" alias="color 8"/>
+    <ColorAlias name="clock: edited text" alias="color 8"/>
+    <ColorAlias name="clock: text" alias="color 13"/>
+    <ColorAlias name="control point fill" alias="color 97"/>
+    <ColorAlias name="control point outline" alias="color 27"/>
+    <ColorAlias name="control point selected fill" alias="color 13"/>
+    <ColorAlias name="control point selected outline" alias="color 23"/>
+    <ColorAlias name="covered region" alias="color 87"/>
+    <ColorAlias name="crossfade editor base" alias="color 15"/>
+    <ColorAlias name="crossfade editor line" alias="color 4"/>
+    <ColorAlias name="crossfade editor line shading" alias="color 16"/>
+    <ColorAlias name="crossfade editor point fill" alias="color 17"/>
+    <ColorAlias name="crossfade editor point outline" alias="color 18"/>
+    <ColorAlias name="crossfade editor wave" alias="color 13"/>
+    <ColorAlias name="crossfade line" alias="color 4"/>
+    <ColorAlias name="edit point" alias="color 18"/>
+    <ColorAlias name="entered automation line" alias="color 13"/>
+    <ColorAlias name="entered gain line" alias="color 13"/>
+    <ColorAlias name="entered marker" alias="color 19"/>
+    <ColorAlias name="feedback alert: fill" alias="color 10"/>
+    <ColorAlias name="feedback alert: fill active" alias="color 9"/>
+    <ColorAlias name="feedback alert: led active" alias="color 4"/>
+    <ColorAlias name="frame handle" alias="color 13"/>
+    <ColorAlias name="gain line" alias="color 6"/>
+    <ColorAlias name="gain line inactive" alias="color 24"/>
+    <ColorAlias name="generic button: fill" alias="color 33"/>
+    <ColorAlias name="generic button: fill active" alias="color 9"/>
+    <ColorAlias name="generic button: led active" alias="color 18"/>
+    <ColorAlias name="ghost track base" alias="color 46"/>
+    <ColorAlias name="ghost track midi outline" alias="color 4"/>
+    <ColorAlias name="ghost track wave" alias="color 29"/>
+    <ColorAlias name="ghost track wave clip" alias="color 29"/>
+    <ColorAlias name="ghost track wave fill" alias="color 29"/>
+    <ColorAlias name="ghost track zero line" alias="color 30"/>
+    <ColorAlias name="gtk_arm" alias="color 13"/>
+    <ColorAlias name="gtk_audio_bus" alias="color 29"/>
+    <ColorAlias name="gtk_audio_track" alias="color 25"/>
+    <ColorAlias name="gtk_automation_track_header" alias="color 48"/>
+    <ColorAlias name="gtk_background" alias="color 87"/>
+    <ColorAlias name="gtk_bases" alias="color 22"/>
+    <ColorAlias name="gtk_bg_selected" alias="color 81"/>
+    <ColorAlias name="gtk_bg_tooltip" alias="color 74"/>
+    <ColorAlias name="gtk_bright_color" alias="color 74"/>
+    <ColorAlias name="gtk_bright_indicator" alias="meter color8"/>
+    <ColorAlias name="gtk_contrasting_indicator" alias="color 91"/>
+    <ColorAlias name="gtk_control_base" alias="color 13"/>
+    <ColorAlias name="gtk_control_master" alias="color 64"/>
+    <ColorAlias name="gtk_control_text" alias="color 26"/>
+    <ColorAlias name="gtk_control_text2" alias="color 83"/>
+    <ColorAlias name="gtk_darkest" alias="color 67"/>
+    <ColorAlias name="gtk_entry_cursor" alias="color 9"/>
+    <ColorAlias name="gtk_fg_selected" alias="color 67"/>
+    <ColorAlias name="gtk_fg_tooltip" alias="color 29"/>
+    <ColorAlias name="gtk_foreground" alias="color 13"/>
+    <ColorAlias name="gtk_light_text_on_dark" alias="color 31"/>
+    <ColorAlias name="gtk_lightest" alias="color 13"/>
+    <ColorAlias name="gtk_midi_channel_selector" alias="color 13"/>
+    <ColorAlias name="gtk_midi_track" alias="color 21"/>
+    <ColorAlias name="gtk_monitor" alias="color 50"/>
+    <ColorAlias name="gtk_mono" alias="color 95"/>
+    <ColorAlias name="gtk_mute" alias="meter color4"/>
+    <ColorAlias name="gtk_not_so_bright_indicator" alias="color 32"/>
+    <ColorAlias name="gtk_processor_fader" alias="color 94"/>
+    <ColorAlias name="gtk_processor_fader_frame" alias="color 104"/>
+    <ColorAlias name="gtk_processor_frame_selected" alias="color 13"/>
+    <ColorAlias name="gtk_processor_postfader" alias="color 79"/>
+    <ColorAlias name="gtk_processor_postfader_frame" alias="color 50"/>
+    <ColorAlias name="gtk_processor_prefader" alias="color 69"/>
+    <ColorAlias name="gtk_processor_prefader_frame" alias="color 69"/>
+    <ColorAlias name="gtk_send_bg" alias="color 38"/>
+    <ColorAlias name="gtk_send_fg" alias="color 24"/>
+    <ColorAlias name="gtk_solo" alias="color 91"/>
+    <ColorAlias name="gtk_somewhat_bright_indicator" alias="color 89"/>
+    <ColorAlias name="gtk_texts" alias="color 4"/>
+    <ColorAlias name="gtk_track_header_inactive" alias="color 34"/>
+    <ColorAlias name="gtk_track_header_selected" alias="color 22"/>
+    <ColorAlias name="image track" alias="color 31"/>
+    <ColorAlias name="inactive crossfade" alias="color 32"/>
+    <ColorAlias name="inactive fade handle" alias="color 33"/>
+    <ColorAlias name="inactive group tab" alias="color 34"/>
+    <ColorAlias name="invert button: fill active" alias="color 35"/>
+    <ColorAlias name="invert button: led active" alias="color 37"/>
+    <ColorAlias name="location cd marker" alias="color 38"/>
+    <ColorAlias name="location loop" alias="color 39"/>
+    <ColorAlias name="location marker" alias="color 32"/>
+    <ColorAlias name="location punch" alias="color 40"/>
+    <ColorAlias name="location range" alias="color 41"/>
+    <ColorAlias name="lock button: fill active" alias="color 42"/>
+    <ColorAlias name="lock button: led active" alias="color 4"/>
+    <ColorAlias name="marker bar" alias="color 33"/>
+    <ColorAlias name="marker bar separator" alias="color 27"/>
+    <ColorAlias name="marker drag line" alias="color 13"/>
+    <ColorAlias name="marker label" alias="color 4"/>
+    <ColorAlias name="marker track" alias="color 31"/>
+    <ColorAlias name="master monitor section button active: fill" alias="color 40"/>
+    <ColorAlias name="master monitor section button active: fill active" alias="color 13"/>
+    <ColorAlias name="master monitor section button normal: fill active" alias="color 42"/>
+    <ColorAlias name="measure line bar" alias="color 4"/>
+    <ColorAlias name="measure line beat" alias="color 94"/>
+    <ColorAlias name="meter background bottom" alias="color 4"/>
+    <ColorAlias name="meter background top" alias="color 4"/>
+    <ColorAlias name="meter bar" alias="color 7"/>
+    <ColorAlias name="meter color BBC" alias="color 8"/>
+    <ColorAlias name="meter marker" alias="color 19"/>
+    <ColorAlias name="meterbridge label: fill" alias="color 81"/>
+    <ColorAlias name="meterbridge label: fill active" alias="color 48"/>
+    <ColorAlias name="meterbridge label: led" alias="meter color8"/>
+    <ColorAlias name="meterbridge label: led active" alias="color 9"/>
+    <ColorAlias name="meterbridge peakindicator: fill" alias="color 81"/>
+    <ColorAlias name="meterbridge peakindicator: fill active" alias="meter color8"/>
+    <ColorAlias name="meterbridge peakindicator: led" alias="meter color8"/>
+    <ColorAlias name="meterbridge peakindicator: led active" alias="meter color8"/>
+    <ColorAlias name="meterbridge peaklabel" alias="meter color8"/>
+    <ColorAlias name="meterstrip dpm bg" alias="color 27"/>
+    <ColorAlias name="meterstrip dpm fg" alias="color 31"/>
+    <ColorAlias name="meterstrip ppm bg" alias="color 27"/>
+    <ColorAlias name="meterstrip ppm fg" alias="color 31"/>
+    <ColorAlias name="meterstrip vu bg" alias="color 32"/>
+    <ColorAlias name="meterstrip vu fg" alias="color 4"/>
+    <ColorAlias name="midi automation track fill" alias="color 74"/>
+    <ColorAlias name="midi bus base" alias="color 4"/>
+    <ColorAlias name="midi device: fill" alias="color 25"/>
+    <ColorAlias name="midi device: fill active" alias="color 42"/>
+    <ColorAlias name="midi device: led active" alias="color 17"/>
+    <ColorAlias name="midi frame base" alias="color 87"/>
+    <ColorAlias name="midi input button: fill active" alias="color 48"/>
+    <ColorAlias name="midi input button: led active" alias="color 4"/>
+    <ColorAlias name="midi meter color0" alias="color 52"/>
+    <ColorAlias name="midi meter color1" alias="color 53"/>
+    <ColorAlias name="midi meter color2" alias="color 53"/>
+    <ColorAlias name="midi meter color3" alias="color 54"/>
+    <ColorAlias name="midi meter color4" alias="color 54"/>
+    <ColorAlias name="midi meter color5" alias="color 55"/>
+    <ColorAlias name="midi meter color6" alias="color 55"/>
+    <ColorAlias name="midi meter color7" alias="color 56"/>
+    <ColorAlias name="midi meter color8" alias="color 56"/>
+    <ColorAlias name="midi meter color9" alias="meter color3"/>
+    <ColorAlias name="midi note inactive channel" alias="color 4"/>
+    <ColorAlias name="midi note max" alias="color 67"/>
+    <ColorAlias name="midi note mid" alias="color 87"/>
+    <ColorAlias name="midi note min" alias="color 49"/>
+    <ColorAlias name="midi note selected" alias="color 91"/>
+    <ColorAlias name="midi note selected outline" alias="color 67"/>
+    <ColorAlias name="midi note velocity text" alias="color 13"/>
+    <ColorAlias name="midi patch change fill" alias="color 60"/>
+    <ColorAlias name="midi patch change outline" alias="color 26"/>
+    <ColorAlias name="midi select rect outline" alias="color 13"/>
+    <ColorAlias name="midi sysex fill" alias="color 10"/>
+    <ColorAlias name="midi sysex outline" alias="color 64"/>
+    <ColorAlias name="midi track base" alias="color 74"/>
+    <ColorAlias name="mixer strip button: fill active" alias="color 8"/>
+    <ColorAlias name="mixer strip button: led active" alias="color 8"/>
+    <ColorAlias name="mixer strip name button: fill active" alias="color 67"/>
+    <ColorAlias name="mixer strip name button: led active" alias="color 8"/>
+    <ColorAlias name="monitor button: fill active" alias="color 92"/>
+    <ColorAlias name="monitor button: led active" alias="color 13"/>
+    <ColorAlias name="monitor section dim: fill" alias="color 71"/>
+    <ColorAlias name="monitor section dim: fill active" alias="color 100"/>
+    <ColorAlias name="monitor section dim: led active" alias="color 37"/>
+    <ColorAlias name="monitor section knob" alias="color 60"/>
+    <ColorAlias name="monitor section knob: arc end" alias="color 81"/>
+    <ColorAlias name="monitor section knob: arc start" alias="color 13"/>
+    <ColorAlias name="monitor section mono: fill" alias="color 71"/>
+    <ColorAlias name="monitor section mono: fill active" alias="color 73"/>
+    <ColorAlias name="monitor section mono: led active" alias="color 37"/>
+    <ColorAlias name="monitor section processors present: fill" alias="color 20"/>
+    <ColorAlias name="monitor section processors toggle: fill active" alias="color 42"/>
+    <ColorAlias name="monitor section solo model: fill" alias="color 71"/>
+    <ColorAlias name="monitor section solo model: fill active" alias="color 42"/>
+    <ColorAlias name="monitor section solo model: led active" alias="color 8"/>
+    <ColorAlias name="monitor section solo option: fill" alias="color 71"/>
+    <ColorAlias name="monitor section solo option: fill active" alias="color 42"/>
+    <ColorAlias name="monitor section solo option: led active" alias="color 8"/>
+    <ColorAlias name="mono panner bg" alias="color 67"/>
+    <ColorAlias name="mono panner fill" alias="color 74"/>
+    <ColorAlias name="mono panner outline" alias="color 70"/>
+    <ColorAlias name="mono panner position fill" alias="color 11"/>
+    <ColorAlias name="mono panner position outline" alias="color 70"/>
+    <ColorAlias name="mono panner text" alias="color 4"/>
+    <ColorAlias name="mouse mode button: fill active" alias="color 13"/>
+    <ColorAlias name="mouse mode button: led active" alias="color 8"/>
+    <ColorAlias name="mute button: fill active" alias="color 53"/>
+    <ColorAlias name="mute button: led active" alias="color 4"/>
+    <ColorAlias name="name highlight fill" alias="color 18"/>
+    <ColorAlias name="name highlight outline" alias="color 23"/>
+    <ColorAlias name="nudge button: fill" alias="color 39"/>
+    <ColorAlias name="nudge button: fill active" alias="color 42"/>
+    <ColorAlias name="nudge button: led active" alias="color 8"/>
+    <ColorAlias name="nudge clock: background" alias="color 67"/>
+    <ColorAlias name="nudge clock: cursor" alias="color 8"/>
+    <ColorAlias name="nudge clock: edited text" alias="color 8"/>
+    <ColorAlias name="nudge clock: text" alias="color 13"/>
+    <ColorAlias name="piano roll black" alias="color 76"/>
+    <ColorAlias name="piano roll black outline" alias="color 33"/>
+    <ColorAlias name="piano roll white" alias="color 45"/>
+    <ColorAlias name="play head" alias="color 13"/>
+    <ColorAlias name="plugin bypass button: led active" alias="color 8"/>
+    <ColorAlias name="pluginlist filter button: fill active" alias="color 10"/>
+    <ColorAlias name="pluginlist hide button: led active" alias="color 14"/>
+    <ColorAlias name="processor automation line" alias="color 77"/>
+    <ColorAlias name="processor control button: fill" alias="color 29"/>
+    <ColorAlias name="processor control button: fill active" alias="color 46"/>
+    <ColorAlias name="processor control button: led active" alias="color 13"/>
+    <ColorAlias name="processor fader: fill" alias="color 87"/>
+    <ColorAlias name="processor fader: fill active" alias="color 21"/>
+    <ColorAlias name="processor fader: led active" alias="color 13"/>
+    <ColorAlias name="processor postfader: fill" alias="color 58"/>
+    <ColorAlias name="processor postfader: fill active" alias="color 79"/>
+    <ColorAlias name="processor postfader: led active" alias="color 13"/>
+    <ColorAlias name="processor prefader: fill" alias="color 40"/>
+    <ColorAlias name="processor prefader: fill active" alias="color 80"/>
+    <ColorAlias name="processor prefader: led active" alias="color 13"/>
+    <ColorAlias name="processor stub: fill" alias="color 46"/>
+    <ColorAlias name="processor stub: fill active" alias="color 46"/>
+    <ColorAlias name="punch button: fill" alias="color 10"/>
+    <ColorAlias name="punch button: fill active" alias="meter color8"/>
+    <ColorAlias name="punch button: led active" alias="color 4"/>
+    <ColorAlias name="punch clock: background" alias="color 67"/>
+    <ColorAlias name="punch clock: cursor" alias="color 100"/>
+    <ColorAlias name="punch clock: edited text" alias="color 100"/>
+    <ColorAlias name="punch clock: text" alias="color 13"/>
+    <ColorAlias name="punch line" alias="color 83"/>
+    <ColorAlias name="range drag bar rect" alias="color 21"/>
+    <ColorAlias name="range drag rect" alias="color 56"/>
+    <ColorAlias name="range marker bar" alias="color 34"/>
+    <ColorAlias name="record enable button: fill active" alias="color 83"/>
+    <ColorAlias name="record enable button: led active" alias="color 85"/>
+    <ColorAlias name="recording rect" alias="color 86"/>
+    <ColorAlias name="recording waveform fill" alias="color 13"/>
+    <ColorAlias name="recording waveform outline" alias="color 43"/>
+    <ColorAlias name="region list automatic" alias="color 53"/>
+    <ColorAlias name="region list missing source" alias="color 9"/>
+    <ColorAlias name="region list whole file" alias="color 1"/>
+    <ColorAlias name="route button: fill active" alias="color 67"/>
+    <ColorAlias name="route button: led active" alias="color 8"/>
+    <ColorAlias name="rubber band rect" alias="color 88"/>
+    <ColorAlias name="rude audition: fill" alias="color 10"/>
+    <ColorAlias name="rude audition: fill active" alias="color 86"/>
+    <ColorAlias name="rude audition: led active" alias="color 4"/>
+    <ColorAlias name="rude isolate: fill" alias="color 42"/>
+    <ColorAlias name="rude isolate: fill active" alias="color 89"/>
+    <ColorAlias name="rude isolate: led active" alias="color 4"/>
+    <ColorAlias name="rude solo: fill" alias="color 10"/>
+    <ColorAlias name="rude solo: fill active" alias="color 103"/>
+    <ColorAlias name="rude solo: led active" alias="color 4"/>
+    <ColorAlias name="ruler base" alias="color 25"/>
+    <ColorAlias name="ruler text" alias="color 13"/>
+    <ColorAlias name="secondary clock: background" alias="color 67"/>
+    <ColorAlias name="secondary clock: cursor" alias="color 8"/>
+    <ColorAlias name="secondary clock: edited text" alias="color 8"/>
+    <ColorAlias name="secondary clock: text" alias="color 88"/>
+    <ColorAlias name="secondary delta clock: background" alias="color 67"/>
+    <ColorAlias name="secondary delta clock: cursor" alias="color 9"/>
+    <ColorAlias name="secondary delta clock: edited text" alias="color 9"/>
+    <ColorAlias name="secondary delta clock: text" alias="color 92"/>
+    <ColorAlias name="selected midi note frame" alias="color 4"/>
+    <ColorAlias name="selected region base" alias="color 13"/>
+    <ColorAlias name="selected time axis frame" alias="color 86"/>
+    <ColorAlias name="selected waveform fill" alias="color 94"/>
+    <ColorAlias name="selected waveform outline" alias="color 67"/>
+    <ColorAlias name="selection" alias="color 13"/>
+    <ColorAlias name="selection clock: background" alias="color 67"/>
+    <ColorAlias name="selection clock: cursor" alias="color 9"/>
+    <ColorAlias name="selection clock: edited text" alias="color 9"/>
+    <ColorAlias name="selection clock: text" alias="color 13"/>
+    <ColorAlias name="selection rect" alias="color 13"/>
+    <ColorAlias name="send alert button: fill" alias="color 71"/>
+    <ColorAlias name="send alert button: fill active" alias="color 38"/>
+    <ColorAlias name="send alert button: led active" alias="color 4"/>
+    <ColorAlias name="send bg" alias="color 38"/>
+    <ColorAlias name="shuttle" alias="color 10"/>
+    <ColorAlias name="silence" alias="color 98"/>
+    <ColorAlias name="silence text" alias="color 10"/>
+    <ColorAlias name="solo button: fill active" alias="color 103"/>
+    <ColorAlias name="solo button: led active" alias="color 4"/>
+    <ColorAlias name="solo isolate: fill" alias="color 25"/>
+    <ColorAlias name="solo isolate: fill active" alias="color 42"/>
+    <ColorAlias name="solo isolate: led active" alias="meter color3"/>
+    <ColorAlias name="solo safe: fill" alias="color 25"/>
+    <ColorAlias name="solo safe: fill active" alias="color 42"/>
+    <ColorAlias name="solo safe: led active" alias="meter color3"/>
+    <ColorAlias name="stereo panner bg" alias="color 67"/>
+    <ColorAlias name="stereo panner fill" alias="color 74"/>
+    <ColorAlias name="stereo panner inverted bg" alias="color 61"/>
+    <ColorAlias name="stereo panner inverted fill" alias="color 100"/>
+    <ColorAlias name="stereo panner inverted outline" alias="color 83"/>
+    <ColorAlias name="stereo panner inverted text" alias="color 4"/>
+    <ColorAlias name="stereo panner mono bg" alias="color 67"/>
+    <ColorAlias name="stereo panner mono fill" alias="color 54"/>
+    <ColorAlias name="stereo panner mono outline" alias="color 101"/>
+    <ColorAlias name="stereo panner mono text" alias="color 4"/>
+    <ColorAlias name="stereo panner outline" alias="color 70"/>
+    <ColorAlias name="stereo panner rule" alias="color 70"/>
+    <ColorAlias name="stereo panner text" alias="color 4"/>
+    <ColorAlias name="sync mark" alias="color 75"/>
+    <ColorAlias name="tempo bar" alias="color 46"/>
+    <ColorAlias name="tempo marker" alias="color 19"/>
+    <ColorAlias name="time axis frame" alias="color 4"/>
+    <ColorAlias name="time axis view item base" alias="color 94"/>
+    <ColorAlias name="time stretch fill" alias="color 100"/>
+    <ColorAlias name="time stretch outline" alias="color 94"/>
+    <ColorAlias name="tracknumber label: fill" alias="color 34"/>
+    <ColorAlias name="tracknumber label: fill active" alias="color 46"/>
+    <ColorAlias name="tracknumber label: led active" alias="color 13"/>
+    <ColorAlias name="transport active option button: fill active" alias="color 48"/>
+    <ColorAlias name="transport active option button: led active" alias="color 8"/>
+    <ColorAlias name="transport button: fill active" alias="color 13"/>
+    <ColorAlias name="transport button: led active" alias="color 4"/>
+    <ColorAlias name="transport clock: background" alias="color 67"/>
+    <ColorAlias name="transport clock: cursor" alias="color 8"/>
+    <ColorAlias name="transport clock: edited text" alias="color 8"/>
+    <ColorAlias name="transport clock: text" alias="color 13"/>
+    <ColorAlias name="transport delta clock: background" alias="color 67"/>
+    <ColorAlias name="transport delta clock: cursor" alias="color 100"/>
+    <ColorAlias name="transport delta clock: edited text" alias="color 100"/>
+    <ColorAlias name="transport delta clock: text" alias="color 92"/>
+    <ColorAlias name="transport drag rect" alias="color 21"/>
+    <ColorAlias name="transport loop rect" alias="color 92"/>
+    <ColorAlias name="transport marker bar" alias="color 25"/>
+    <ColorAlias name="transport option button: fill active" alias="color 42"/>
+    <ColorAlias name="transport option button: led active" alias="color 8"/>
+    <ColorAlias name="transport punch rect" alias="meter color9"/>
+    <ColorAlias name="transport recenable button: fill" alias="color 20"/>
+    <ColorAlias name="transport recenable button: fill active" alias="color 83"/>
+    <ColorAlias name="transport recenable button: led active" alias="color 4"/>
+    <ColorAlias name="trim handle" alias="color 18"/>
+    <ColorAlias name="trim handle locked" alias="color 86"/>
+    <ColorAlias name="trim knob" alias="color 60"/>
+    <ColorAlias name="trim knob: arc end" alias="color 13"/>
+    <ColorAlias name="trim knob: arc start" alias="color 9"/>
+    <ColorAlias name="verbose canvas cursor" alias="color 32"/>
+    <ColorAlias name="video timeline bar" alias="color 46"/>
+    <ColorAlias name="waveform fill" alias="color 13"/>
+    <ColorAlias name="waveform outline" alias="color 4"/>
+    <ColorAlias name="zero line" alias="color 104"/>
+    <ColorAlias name="zoom button: fill active" alias="color 48"/>
+    <ColorAlias name="zoom button: led active" alias="color 8"/>
+  </ColorAliases>
+  <Modifiers>
+    <Modifier name="audio bus base" modifier="= alpha:0.3"/>
+    <Modifier name="audio track base" modifier="= alpha:0.32"/>
+    <Modifier name="automation track fill" modifier="= alpha:0.3"/>
+    <Modifier name="covered region base" modifier="= alpha:0.680625"/>
+    <Modifier name="crossfade alpha" modifier="= alpha:0.1803"/>
+    <Modifier name="dragging region" modifier="= alpha:0.92"/>
+    <Modifier name="editable region" modifier="= alpha:0"/>
+    <Modifier name="gain line inactive" modifier="= alpha:0.7725"/>
+    <Modifier name="ghost track base" modifier="= alpha:0.640782"/>
+    <Modifier name="ghost track midi fill" modifier="= alpha:0.3"/>
+    <Modifier name="inactive crossfade" modifier="= alpha:0.4666"/>
+    <Modifier name="loop rectangle" modifier="= alpha:0.5"/>
+    <Modifier name="marker bar" modifier="= alpha:0.5"/>
+    <Modifier name="measure line beat" modifier="= alpha:1"/>
+    <Modifier name="midi frame base" modifier="= alpha:0.720606"/>
+    <Modifier name="midi note" modifier="= alpha:0.8"/>
+    <Modifier name="midi note velocity text" modifier="= alpha:0.4666"/>
+    <Modifier name="midi patch change fill" modifier="= alpha:0.6274"/>
+    <Modifier name="midi sysex fill" modifier="= alpha:0.4666"/>
+    <Modifier name="midi track base" modifier="= alpha:0.3"/>
+    <Modifier name="mono panner position fill" modifier="= alpha:0.8"/>
+    <Modifier name="opaque region base" modifier="= alpha:0.75"/>
+    <Modifier name="panner fill" modifier="= alpha:0.7882"/>
+    <Modifier name="piano roll black" modifier="= alpha:0.2"/>
+    <Modifier name="piano roll white" modifier="= alpha:0.2"/>
+    <Modifier name="recording rect" modifier="= alpha:0.275106"/>
+    <Modifier name="selected midi note" modifier="= alpha:0.7529"/>
+    <Modifier name="selection rect" modifier="= alpha:0.791048"/>
+    <Modifier name="silence" modifier="= alpha:0.4784"/>
+    <Modifier name="stereo panner inverted" modifier="= alpha:0.7882"/>
+    <Modifier name="stereo panner inverted bg" modifier="= alpha:0.7529"/>
+    <Modifier name="time axis view item base" modifier="= alpha:0.7"/>
+    <Modifier name="time stretch fill" modifier="= alpha:0.5"/>
+    <Modifier name="transparent region base" modifier="= alpha:0.693"/>
+    <Modifier name="verbose canvas cursor" modifier="= alpha:0.4666"/>
+  </Modifiers>
+</Ardour>
diff --git a/gtk2_ardour/themes/cubasish-ardour.colors b/gtk2_ardour/themes/cubasish-ardour.colors
new file mode 100644
index 0000000..2e33bbd
--- /dev/null
+++ b/gtk2_ardour/themes/cubasish-ardour.colors
@@ -0,0 +1,518 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Ardour theme-name="Cubasish">
+  <Colors>
+    <Color name="color 1" value="0x31c9b2ff"/>
+    <Color name="color 10" value="0xf0f0f0ff"/>
+    <Color name="color 100" value="0xe49c9cff"/>
+    <Color name="color 101" value="0xa06000ff"/>
+    <Color name="color 103" value="0x1e7753ff"/>
+    <Color name="color 104" value="0x7f7f7fff"/>
+    <Color name="color 11" value="0x9496a3ff"/>
+    <Color name="color 12" value="0xe0e2e5ff"/>
+    <Color name="color 13" value="0xffffffff"/>
+    <Color name="color 14" value="0x55ccccff"/>
+    <Color name="color 15" value="0x282b49ff"/>
+    <Color name="color 16" value="0xdde1e4ff"/>
+    <Color name="color 17" value="0x00ffdfff"/>
+    <Color name="color 18" value="0x001affff"/>
+    <Color name="color 19" value="0xdd6363ff"/>
+    <Color name="color 2" value="0x595959ff"/>
+    <Color name="color 20" value="0x684d4dff"/>
+    <Color name="color 21" value="0x969696ff"/>
+    <Color name="color 22" value="0xe5e5e5ff"/>
+    <Color name="color 23" value="0x6024d1ff"/>
+    <Color name="color 24" value="0x9fbca2ff"/>
+    <Color name="color 25" value="0x4a4a4aff"/>
+    <Color name="color 26" value="0xc7c9d8ff"/>
+    <Color name="color 27" value="0x191919ff"/>
+    <Color name="color 28" value="0x5d3e7cff"/>
+    <Color name="color 29" value="0x202020ff"/>
+    <Color name="color 3" value="0x738299ff"/>
+    <Color name="color 30" value="0xe500cfff"/>
+    <Color name="color 31" value="0xddddd8ff"/>
+    <Color name="color 32" value="0xeddc3d77"/>
+    <Color name="color 33" value="0xc0c4c9ff"/>
+    <Color name="color 34" value="0xcbd6daff"/>
+    <Color name="color 35" value="0x4250d0ff"/>
+    <Color name="color 36" value="0x473212ff"/>
+    <Color name="color 37" value="0x76b8e8ff"/>
+    <Color name="color 38" value="0x1ee8acff"/>
+    <Color name="color 39" value="0xcececeff"/>
+    <Color name="color 4" value="0x000000ff"/>
+    <Color name="color 40" value="0xacb3b9ff"/>
+    <Color name="color 41" value="0x497a5dff"/>
+    <Color name="color 42" value="0x404145ff"/>
+    <Color name="color 43" value="0x000424ff"/>
+    <Color name="color 44" value="0x004f3cff"/>
+    <Color name="color 45" value="0xa29e9eff"/>
+    <Color name="color 46" value="0x2f3841ff"/>
+    <Color name="color 47" value="0x008852ff"/>
+    <Color name="color 48" value="0x4495e3ff"/>
+    <Color name="color 49" value="0x0f0797ff"/>
+    <Color name="color 5" value="0x9dadc4ff"/>
+    <Color name="color 50" value="0xeeeeecff"/>
+    <Color name="color 51" value="0x383d37ff"/>
+    <Color name="color 52" value="0xbba34cff"/>
+    <Color name="color 53" value="0xf2c37dff"/>
+    <Color name="color 54" value="0xf48352ff"/>
+    <Color name="color 55" value="0xf85813ff"/>
+    <Color name="color 56" value="0x8ec794ff"/>
+    <Color name="color 57" value="0x7ea854ff"/>
+    <Color name="color 58" value="0x3e3e3eff"/>
+    <Color name="color 59" value="0xb2baffff"/>
+    <Color name="color 6" value="0x5d3bd6ff"/>
+    <Color name="color 60" value="0x50545aff"/>
+    <Color name="color 61" value="0x20242aff"/>
+    <Color name="color 62" value="0x8894ffff"/>
+    <Color name="color 63" value="0x5566ffff"/>
+    <Color name="color 64" value="0xa7acd4ff"/>
+    <Color name="color 65" value="0xb8cca3ff"/>
+    <Color name="color 66" value="0x4f2f00ff"/>
+    <Color name="color 67" value="0x121212ff"/>
+    <Color name="color 68" value="0xc57805ff"/>
+    <Color name="color 69" value="0x030207ff"/>
+    <Color name="color 7" value="0x282b30ff"/>
+    <Color name="color 70" value="0x304057ff"/>
+    <Color name="color 71" value="0x5f5a58ff"/>
+    <Color name="color 72" value="0xe58b05ff"/>
+    <Color name="color 73" value="0x3240c0ff"/>
+    <Color name="color 74" value="0x7a9bccff"/>
+    <Color name="color 75" value="0xe6bb3bff"/>
+    <Color name="color 76" value="0x6c6e6aff"/>
+    <Color name="color 77" value="0x7aadf9ff"/>
+    <Color name="color 78" value="0x2e769cff"/>
+    <Color name="color 79" value="0x6b806dff"/>
+    <Color name="color 8" value="0xc20020ff"/>
+    <Color name="color 80" value="0x603535ff"/>
+    <Color name="color 81" value="0xa5a5a5ff"/>
+    <Color name="color 82" value="0x00c73eff"/>
+    <Color name="color 83" value="0xa80000ff"/>
+    <Color name="color 84" value="0x7b354aff"/>
+    <Color name="color 85" value="0xffa3bfff"/>
+    <Color name="color 86" value="0xcc2828ff"/>
+    <Color name="color 87" value="0x505050ff"/>
+    <Color name="color 88" value="0xc6c6c6ff"/>
+    <Color name="color 89" value="0xb6e8fdff"/>
+    <Color name="color 9" value="0xffffffff"/>
+    <Color name="color 90" value="0x2c2121ff"/>
+    <Color name="color 91" value="0x921fccff"/>
+    <Color name="color 92" value="0x8cd8f8ff"/>
+    <Color name="color 93" value="0x51578aff"/>
+    <Color name="color 94" value="0x636363ff"/>
+    <Color name="color 95" value="0xe4f4d3ff"/>
+    <Color name="color 96" value="0x24e59cff"/>
+    <Color name="color 97" value="0xccccccff"/>
+    <Color name="color 98" value="0x9e00ffff"/>
+    <Color name="color 99" value="0xacb3b9ff"/>
+    <Color name="meter color0" value="0x086154ff"/>
+    <Color name="meter color1" value="0x26dad4ff"/>
+    <Color name="meter color2" value="0x09e8abff"/>
+    <Color name="meter color3" value="0x0de784ff"/>
+    <Color name="meter color4" value="0x6aff00ff"/>
+    <Color name="meter color5" value="0xffff00ff"/>
+    <Color name="meter color6" value="0xff8800ff"/>
+    <Color name="meter color7" value="0xff8800ff"/>
+    <Color name="meter color8" value="0xff0000ff"/>
+    <Color name="meter color9" value="0xff0000ff"/>
+  </Colors>
+  <ColorAliases>
+    <ColorAlias name="active crossfade" alias="color 1"/>
+    <ColorAlias name="arrange base" alias="color 34"/>
+    <ColorAlias name="audio automation track fill" alias="color 70"/>
+    <ColorAlias name="audio bus base" alias="color 3"/>
+    <ColorAlias name="audio master bus base" alias="color 4"/>
+    <ColorAlias name="audio track base" alias="color 77"/>
+    <ColorAlias name="automation line" alias="color 23"/>
+    <ColorAlias name="automation track outline" alias="color 7"/>
+    <ColorAlias name="big clock active: background" alias="color 4"/>
+    <ColorAlias name="big clock active: cursor" alias="color 8"/>
+    <ColorAlias name="big clock active: edited text" alias="color 8"/>
+    <ColorAlias name="big clock active: text" alias="color 9"/>
+    <ColorAlias name="big clock: background" alias="color 67"/>
+    <ColorAlias name="big clock: cursor" alias="color 8"/>
+    <ColorAlias name="big clock: edited text" alias="color 8"/>
+    <ColorAlias name="big clock: text" alias="color 10"/>
+    <ColorAlias name="border color" alias="color 4"/>
+    <ColorAlias name="cd marker bar" alias="color 87"/>
+    <ColorAlias name="clipped waveform" alias="color 9"/>
+    <ColorAlias name="clock: background" alias="color 67"/>
+    <ColorAlias name="clock: cursor" alias="color 8"/>
+    <ColorAlias name="clock: edited text" alias="color 8"/>
+    <ColorAlias name="clock: text" alias="color 12"/>
+    <ColorAlias name="comment button: fill" alias="color 20"/>
+    <ColorAlias name="control point fill" alias="color 4"/>
+    <ColorAlias name="control point outline" alias="color 58"/>
+    <ColorAlias name="control point selected fill" alias="color 13"/>
+    <ColorAlias name="control point selected outline" alias="color 4"/>
+    <ColorAlias name="covered region" alias="color 87"/>
+    <ColorAlias name="crossfade editor base" alias="color 15"/>
+    <ColorAlias name="crossfade editor line" alias="color 4"/>
+    <ColorAlias name="crossfade editor line shading" alias="color 16"/>
+    <ColorAlias name="crossfade editor point fill" alias="color 17"/>
+    <ColorAlias name="crossfade editor point outline" alias="color 18"/>
+    <ColorAlias name="crossfade editor wave" alias="color 13"/>
+    <ColorAlias name="crossfade line" alias="color 4"/>
+    <ColorAlias name="edit point" alias="color 18"/>
+    <ColorAlias name="entered automation line" alias="color 19"/>
+    <ColorAlias name="entered gain line" alias="color 19"/>
+    <ColorAlias name="entered marker" alias="color 19"/>
+    <ColorAlias name="feedback alert: fill" alias="color 62"/>
+    <ColorAlias name="feedback alert: fill active" alias="color 9"/>
+    <ColorAlias name="feedback alert: led active" alias="color 4"/>
+    <ColorAlias name="frame handle" alias="color 23"/>
+    <ColorAlias name="gain line" alias="color 6"/>
+    <ColorAlias name="gain line inactive" alias="color 24"/>
+    <ColorAlias name="generic button: fill" alias="color 33"/>
+    <ColorAlias name="generic button: fill active" alias="color 9"/>
+    <ColorAlias name="generic button: led active" alias="color 18"/>
+    <ColorAlias name="ghost track base" alias="color 46"/>
+    <ColorAlias name="ghost track midi outline" alias="color 4"/>
+    <ColorAlias name="ghost track wave" alias="color 29"/>
+    <ColorAlias name="ghost track wave clip" alias="color 29"/>
+    <ColorAlias name="ghost track wave fill" alias="color 29"/>
+    <ColorAlias name="ghost track zero line" alias="color 30"/>
+    <ColorAlias name="gtk_arm" alias="color 9"/>
+    <ColorAlias name="gtk_audio_bus" alias="color 61"/>
+    <ColorAlias name="gtk_audio_track" alias="color 46"/>
+    <ColorAlias name="gtk_automation_track_header" alias="color 42"/>
+    <ColorAlias name="gtk_background" alias="color 7"/>
+    <ColorAlias name="gtk_bases" alias="color 7"/>
+    <ColorAlias name="gtk_bg_selected" alias="color 99"/>
+    <ColorAlias name="gtk_bg_tooltip" alias="color 52"/>
+    <ColorAlias name="gtk_bright_color" alias="color 74"/>
+    <ColorAlias name="gtk_bright_indicator" alias="color 9"/>
+    <ColorAlias name="gtk_contrasting_indicator" alias="color 91"/>
+    <ColorAlias name="gtk_control_master" alias="color 64"/>
+    <ColorAlias name="gtk_control_text" alias="color 26"/>
+    <ColorAlias name="gtk_control_text2" alias="color 83"/>
+    <ColorAlias name="gtk_darkest" alias="color 67"/>
+    <ColorAlias name="gtk_entry_cursor" alias="color 9"/>
+    <ColorAlias name="gtk_fg_selected" alias="color 67"/>
+    <ColorAlias name="gtk_fg_tooltip" alias="color 29"/>
+    <ColorAlias name="gtk_foreground" alias="color 50"/>
+    <ColorAlias name="gtk_light_text_on_dark" alias="color 31"/>
+    <ColorAlias name="gtk_lightest" alias="color 13"/>
+    <ColorAlias name="gtk_midi_channel_selector" alias="color 44"/>
+    <ColorAlias name="gtk_midi_track" alias="color 46"/>
+    <ColorAlias name="gtk_monitor" alias="color 8"/>
+    <ColorAlias name="gtk_mono" alias="color 95"/>
+    <ColorAlias name="gtk_mute" alias="color 52"/>
+    <ColorAlias name="gtk_not_so_bright_indicator" alias="color 32"/>
+    <ColorAlias name="gtk_processor_fader" alias="color 94"/>
+    <ColorAlias name="gtk_processor_fader_frame" alias="color 104"/>
+    <ColorAlias name="gtk_processor_frame_selected" alias="color 32"/>
+    <ColorAlias name="gtk_processor_postfader" alias="color 79"/>
+    <ColorAlias name="gtk_processor_postfader_frame" alias="color 103"/>
+    <ColorAlias name="gtk_processor_prefader" alias="color 69"/>
+    <ColorAlias name="gtk_processor_prefader_frame" alias="color 69"/>
+    <ColorAlias name="gtk_send_bg" alias="color 38"/>
+    <ColorAlias name="gtk_send_fg" alias="color 24"/>
+    <ColorAlias name="gtk_solo" alias="color 91"/>
+    <ColorAlias name="gtk_somewhat_bright_indicator" alias="color 89"/>
+    <ColorAlias name="gtk_texts" alias="color 50"/>
+    <ColorAlias name="gtk_track_header_inactive" alias="color 34"/>
+    <ColorAlias name="gtk_track_header_selected" alias="color 40"/>
+    <ColorAlias name="image track" alias="color 31"/>
+    <ColorAlias name="inactive crossfade" alias="color 32"/>
+    <ColorAlias name="inactive fade handle" alias="color 33"/>
+    <ColorAlias name="inactive group tab" alias="color 34"/>
+    <ColorAlias name="invert button: fill active" alias="color 35"/>
+    <ColorAlias name="invert button: led active" alias="color 37"/>
+    <ColorAlias name="location cd marker" alias="color 38"/>
+    <ColorAlias name="location loop" alias="color 39"/>
+    <ColorAlias name="location marker" alias="color 32"/>
+    <ColorAlias name="location punch" alias="color 40"/>
+    <ColorAlias name="location range" alias="color 41"/>
+    <ColorAlias name="lock button: fill active" alias="color 42"/>
+    <ColorAlias name="lock button: led active" alias="color 4"/>
+    <ColorAlias name="marker bar" alias="color 2"/>
+    <ColorAlias name="marker bar separator" alias="color 27"/>
+    <ColorAlias name="marker drag line" alias="color 44"/>
+    <ColorAlias name="marker label" alias="color 4"/>
+    <ColorAlias name="marker track" alias="color 31"/>
+    <ColorAlias name="master monitor section button active: fill" alias="color 40"/>
+    <ColorAlias name="master monitor section button active: fill active" alias="color 54"/>
+    <ColorAlias name="master monitor section button normal: fill active" alias="color 42"/>
+    <ColorAlias name="measure line bar" alias="color 13"/>
+    <ColorAlias name="measure line beat" alias="color 33"/>
+    <ColorAlias name="meter background bottom" alias="color 4"/>
+    <ColorAlias name="meter background top" alias="color 4"/>
+    <ColorAlias name="meter bar" alias="color 7"/>
+    <ColorAlias name="meter color BBC" alias="color 8"/>
+    <ColorAlias name="meter marker" alias="color 19"/>
+    <ColorAlias name="meterbridge label: fill" alias="color 34"/>
+    <ColorAlias name="meterbridge label: fill active" alias="color 46"/>
+    <ColorAlias name="meterbridge label: led" alias="color 9"/>
+    <ColorAlias name="meterbridge label: led active" alias="color 9"/>
+    <ColorAlias name="meterbridge peakindicator: fill" alias="color 34"/>
+    <ColorAlias name="meterbridge peakindicator: fill active" alias="color 9"/>
+    <ColorAlias name="meterbridge peakindicator: led" alias="color 9"/>
+    <ColorAlias name="meterbridge peakindicator: led active" alias="color 9"/>
+    <ColorAlias name="meterbridge peaklabel" alias="color 9"/>
+    <ColorAlias name="meterstrip dpm bg" alias="color 27"/>
+    <ColorAlias name="meterstrip dpm fg" alias="color 31"/>
+    <ColorAlias name="meterstrip ppm bg" alias="color 27"/>
+    <ColorAlias name="meterstrip ppm fg" alias="color 31"/>
+    <ColorAlias name="meterstrip vu bg" alias="color 32"/>
+    <ColorAlias name="meterstrip vu fg" alias="color 4"/>
+    <ColorAlias name="midi automation track fill" alias="color 58"/>
+    <ColorAlias name="midi bus base" alias="color 4"/>
+    <ColorAlias name="midi device: fill" alias="color 25"/>
+    <ColorAlias name="midi device: fill active" alias="color 42"/>
+    <ColorAlias name="midi device: led active" alias="color 17"/>
+    <ColorAlias name="midi frame base" alias="color 87"/>
+    <ColorAlias name="midi input button: fill active" alias="color 48"/>
+    <ColorAlias name="midi input button: led active" alias="color 4"/>
+    <ColorAlias name="midi meter color0" alias="color 52"/>
+    <ColorAlias name="midi meter color1" alias="color 53"/>
+    <ColorAlias name="midi meter color2" alias="color 53"/>
+    <ColorAlias name="midi meter color3" alias="color 54"/>
+    <ColorAlias name="midi meter color4" alias="color 54"/>
+    <ColorAlias name="midi meter color5" alias="color 55"/>
+    <ColorAlias name="midi meter color6" alias="color 55"/>
+    <ColorAlias name="midi meter color7" alias="color 56"/>
+    <ColorAlias name="midi meter color8" alias="color 56"/>
+    <ColorAlias name="midi meter color9" alias="meter color3"/>
+    <ColorAlias name="midi note inactive channel" alias="color 4"/>
+    <ColorAlias name="midi note max" alias="color 8"/>
+    <ColorAlias name="midi note mid" alias="color 91"/>
+    <ColorAlias name="midi note min" alias="color 49"/>
+    <ColorAlias name="midi note selected" alias="color 29"/>
+    <ColorAlias name="midi note selected outline" alias="color 67"/>
+    <ColorAlias name="midi note velocity text" alias="color 32"/>
+    <ColorAlias name="midi patch change fill" alias="color 60"/>
+    <ColorAlias name="midi patch change outline" alias="color 26"/>
+    <ColorAlias name="midi select rect outline" alias="color 63"/>
+    <ColorAlias name="midi sysex fill" alias="color 32"/>
+    <ColorAlias name="midi sysex outline" alias="color 64"/>
+    <ColorAlias name="midi track base" alias="color 39"/>
+    <ColorAlias name="mixer strip button: fill active" alias="color 8"/>
+    <ColorAlias name="mixer strip button: led active" alias="color 8"/>
+    <ColorAlias name="mixer strip name button: fill active" alias="color 67"/>
+    <ColorAlias name="mixer strip name button: led active" alias="color 8"/>
+    <ColorAlias name="monitor button: fill active" alias="color 68"/>
+    <ColorAlias name="monitor button: led active" alias="color 9"/>
+    <ColorAlias name="monitor section dim: fill" alias="color 71"/>
+    <ColorAlias name="monitor section dim: fill active" alias="color 72"/>
+    <ColorAlias name="monitor section dim: led active" alias="color 37"/>
+    <ColorAlias name="monitor section knob" alias="color 60"/>
+    <ColorAlias name="monitor section knob: arc end" alias="color 70"/>
+    <ColorAlias name="monitor section knob: arc start" alias="color 16"/>
+    <ColorAlias name="monitor section mono: fill" alias="color 71"/>
+    <ColorAlias name="monitor section mono: fill active" alias="color 73"/>
+    <ColorAlias name="monitor section mono: led active" alias="color 37"/>
+    <ColorAlias name="monitor section processors present: fill" alias="color 20"/>
+    <ColorAlias name="monitor section processors toggle: fill active" alias="color 42"/>
+    <ColorAlias name="monitor section solo model: fill" alias="color 71"/>
+    <ColorAlias name="monitor section solo model: fill active" alias="color 42"/>
+    <ColorAlias name="monitor section solo model: led active" alias="color 8"/>
+    <ColorAlias name="monitor section solo option: fill" alias="color 71"/>
+    <ColorAlias name="monitor section solo option: fill active" alias="color 42"/>
+    <ColorAlias name="monitor section solo option: led active" alias="color 8"/>
+    <ColorAlias name="mono panner bg" alias="color 67"/>
+    <ColorAlias name="mono panner fill" alias="color 74"/>
+    <ColorAlias name="mono panner outline" alias="color 70"/>
+    <ColorAlias name="mono panner position fill" alias="color 11"/>
+    <ColorAlias name="mono panner position outline" alias="color 70"/>
+    <ColorAlias name="mono panner text" alias="color 4"/>
+    <ColorAlias name="mouse mode button: fill active" alias="color 13"/>
+    <ColorAlias name="mouse mode button: led active" alias="color 8"/>
+    <ColorAlias name="mute button: fill active" alias="color 75"/>
+    <ColorAlias name="mute button: led active" alias="color 4"/>
+    <ColorAlias name="name highlight fill" alias="color 18"/>
+    <ColorAlias name="name highlight outline" alias="color 23"/>
+    <ColorAlias name="nudge button: fill" alias="color 63"/>
+    <ColorAlias name="nudge button: fill active" alias="color 42"/>
+    <ColorAlias name="nudge button: led active" alias="color 8"/>
+    <ColorAlias name="nudge clock: background" alias="color 67"/>
+    <ColorAlias name="nudge clock: cursor" alias="color 8"/>
+    <ColorAlias name="nudge clock: edited text" alias="color 8"/>
+    <ColorAlias name="nudge clock: text" alias="color 12"/>
+    <ColorAlias name="piano roll black" alias="color 76"/>
+    <ColorAlias name="piano roll black outline" alias="color 33"/>
+    <ColorAlias name="piano roll white" alias="color 45"/>
+    <ColorAlias name="play head" alias="color 9"/>
+    <ColorAlias name="plugin bypass button: led active" alias="color 8"/>
+    <ColorAlias name="pluginlist filter button: fill active" alias="color 14"/>
+    <ColorAlias name="pluginlist hide button: led active" alias="color 14"/>
+    <ColorAlias name="processor automation line" alias="color 77"/>
+    <ColorAlias name="processor control button: fill" alias="color 29"/>
+    <ColorAlias name="processor control button: fill active" alias="color 46"/>
+    <ColorAlias name="processor control button: led active" alias="color 62"/>
+    <ColorAlias name="processor fader: fill" alias="color 16"/>
+    <ColorAlias name="processor fader: fill active" alias="color 78"/>
+    <ColorAlias name="processor fader: led active" alias="color 37"/>
+    <ColorAlias name="processor postfader: fill" alias="color 58"/>
+    <ColorAlias name="processor postfader: fill active" alias="color 79"/>
+    <ColorAlias name="processor postfader: led active" alias="color 37"/>
+    <ColorAlias name="processor prefader: fill" alias="color 40"/>
+    <ColorAlias name="processor prefader: fill active" alias="color 80"/>
+    <ColorAlias name="processor prefader: led active" alias="color 37"/>
+    <ColorAlias name="processor stub: fill" alias="color 46"/>
+    <ColorAlias name="processor stub: fill active" alias="color 46"/>
+    <ColorAlias name="punch button: fill" alias="color 62"/>
+    <ColorAlias name="punch button: fill active" alias="color 9"/>
+    <ColorAlias name="punch button: led active" alias="color 4"/>
+    <ColorAlias name="punch clock: background" alias="color 67"/>
+    <ColorAlias name="punch clock: cursor" alias="color 9"/>
+    <ColorAlias name="punch clock: edited text" alias="color 9"/>
+    <ColorAlias name="punch clock: text" alias="color 12"/>
+    <ColorAlias name="punch line" alias="color 83"/>
+    <ColorAlias name="range drag bar rect" alias="color 21"/>
+    <ColorAlias name="range drag rect" alias="color 56"/>
+    <ColorAlias name="range marker bar" alias="color 34"/>
+    <ColorAlias name="record enable button: fill active" alias="color 83"/>
+    <ColorAlias name="record enable button: led active" alias="color 85"/>
+    <ColorAlias name="recording rect" alias="color 86"/>
+    <ColorAlias name="recording waveform fill" alias="color 13"/>
+    <ColorAlias name="recording waveform outline" alias="color 43"/>
+    <ColorAlias name="region list automatic" alias="color 53"/>
+    <ColorAlias name="region list missing source" alias="color 9"/>
+    <ColorAlias name="region list whole file" alias="color 1"/>
+    <ColorAlias name="route button: fill active" alias="color 67"/>
+    <ColorAlias name="route button: led active" alias="color 8"/>
+    <ColorAlias name="rubber band rect" alias="color 88"/>
+    <ColorAlias name="rude audition: fill" alias="color 62"/>
+    <ColorAlias name="rude audition: fill active" alias="color 86"/>
+    <ColorAlias name="rude audition: led active" alias="color 4"/>
+    <ColorAlias name="rude isolate: fill" alias="color 42"/>
+    <ColorAlias name="rude isolate: fill active" alias="color 89"/>
+    <ColorAlias name="rude isolate: led active" alias="color 4"/>
+    <ColorAlias name="rude solo: fill" alias="color 62"/>
+    <ColorAlias name="rude solo: fill active" alias="color 82"/>
+    <ColorAlias name="rude solo: led active" alias="color 4"/>
+    <ColorAlias name="ruler base" alias="color 67"/>
+    <ColorAlias name="ruler text" alias="color 22"/>
+    <ColorAlias name="secondary clock: background" alias="color 67"/>
+    <ColorAlias name="secondary clock: cursor" alias="color 8"/>
+    <ColorAlias name="secondary clock: edited text" alias="color 8"/>
+    <ColorAlias name="secondary clock: text" alias="color 88"/>
+    <ColorAlias name="secondary delta clock: background" alias="color 67"/>
+    <ColorAlias name="secondary delta clock: cursor" alias="color 9"/>
+    <ColorAlias name="secondary delta clock: edited text" alias="color 9"/>
+    <ColorAlias name="secondary delta clock: text" alias="color 92"/>
+    <ColorAlias name="selected midi note frame" alias="color 86"/>
+    <ColorAlias name="selected region base" alias="color 9"/>
+    <ColorAlias name="selected time axis frame" alias="color 86"/>
+    <ColorAlias name="selected waveform fill" alias="color 94"/>
+    <ColorAlias name="selected waveform outline" alias="color 67"/>
+    <ColorAlias name="selection" alias="color 13"/>
+    <ColorAlias name="selection clock: background" alias="color 67"/>
+    <ColorAlias name="selection clock: cursor" alias="color 9"/>
+    <ColorAlias name="selection clock: edited text" alias="color 9"/>
+    <ColorAlias name="selection clock: text" alias="color 12"/>
+    <ColorAlias name="selection rect" alias="color 95"/>
+    <ColorAlias name="send alert button: fill" alias="color 71"/>
+    <ColorAlias name="send alert button: fill active" alias="color 38"/>
+    <ColorAlias name="send alert button: led active" alias="color 4"/>
+    <ColorAlias name="send bg" alias="color 38"/>
+    <ColorAlias name="shuttle" alias="color 12"/>
+    <ColorAlias name="shuttle bg" alias="color 4"/>
+    <ColorAlias name="shuttle text" alias="color 13"/>
+    <ColorAlias name="silence" alias="color 98"/>
+    <ColorAlias name="silence text" alias="color 10"/>
+    <ColorAlias name="solo button: fill active" alias="color 82"/>
+    <ColorAlias name="solo button: led active" alias="color 4"/>
+    <ColorAlias name="solo isolate: fill" alias="color 25"/>
+    <ColorAlias name="solo isolate: fill active" alias="color 42"/>
+    <ColorAlias name="solo isolate: led active" alias="color 9"/>
+    <ColorAlias name="solo safe: fill" alias="color 25"/>
+    <ColorAlias name="solo safe: fill active" alias="color 42"/>
+    <ColorAlias name="solo safe: led active" alias="color 9"/>
+    <ColorAlias name="stereo panner bg" alias="color 67"/>
+    <ColorAlias name="stereo panner fill" alias="color 74"/>
+    <ColorAlias name="stereo panner inverted bg" alias="color 61"/>
+    <ColorAlias name="stereo panner inverted fill" alias="color 100"/>
+    <ColorAlias name="stereo panner inverted outline" alias="color 83"/>
+    <ColorAlias name="stereo panner inverted text" alias="color 4"/>
+    <ColorAlias name="stereo panner mono bg" alias="color 67"/>
+    <ColorAlias name="stereo panner mono fill" alias="color 54"/>
+    <ColorAlias name="stereo panner mono outline" alias="color 101"/>
+    <ColorAlias name="stereo panner mono text" alias="color 4"/>
+    <ColorAlias name="stereo panner outline" alias="color 70"/>
+    <ColorAlias name="stereo panner rule" alias="color 70"/>
+    <ColorAlias name="stereo panner text" alias="color 4"/>
+    <ColorAlias name="sync mark" alias="color 75"/>
+    <ColorAlias name="tempo bar" alias="color 46"/>
+    <ColorAlias name="tempo curve" alias="color 62"/>
+    <ColorAlias name="tempo marker" alias="color 19"/>
+    <ColorAlias name="tempo marker music" alias="color 5"/>
+    <ColorAlias name="time axis frame" alias="color 4"/>
+    <ColorAlias name="time axis view item base" alias="color 94"/>
+    <ColorAlias name="time stretch fill" alias="color 100"/>
+    <ColorAlias name="time stretch outline" alias="color 94"/>
+    <ColorAlias name="tracknumber label: fill" alias="color 34"/>
+    <ColorAlias name="tracknumber label: fill active" alias="color 46"/>
+    <ColorAlias name="tracknumber label: led active" alias="color 9"/>
+    <ColorAlias name="transport active option button: fill active" alias="color 48"/>
+    <ColorAlias name="transport active option button: led active" alias="color 8"/>
+    <ColorAlias name="transport button: fill active" alias="color 23"/>
+    <ColorAlias name="transport button: led active" alias="color 4"/>
+    <ColorAlias name="transport clock: background" alias="color 67"/>
+    <ColorAlias name="transport clock: cursor" alias="color 8"/>
+    <ColorAlias name="transport clock: edited text" alias="color 8"/>
+    <ColorAlias name="transport clock: text" alias="color 9"/>
+    <ColorAlias name="transport delta clock: background" alias="color 67"/>
+    <ColorAlias name="transport delta clock: cursor" alias="color 9"/>
+    <ColorAlias name="transport delta clock: edited text" alias="color 9"/>
+    <ColorAlias name="transport delta clock: text" alias="color 92"/>
+    <ColorAlias name="transport drag rect" alias="color 21"/>
+    <ColorAlias name="transport loop rect" alias="color 48"/>
+    <ColorAlias name="transport marker bar" alias="color 25"/>
+    <ColorAlias name="transport option button: fill active" alias="color 42"/>
+    <ColorAlias name="transport option button: led active" alias="color 8"/>
+    <ColorAlias name="transport punch rect" alias="color 77"/>
+    <ColorAlias name="transport recenable button: fill" alias="color 20"/>
+    <ColorAlias name="transport recenable button: fill active" alias="color 83"/>
+    <ColorAlias name="transport recenable button: led active" alias="color 4"/>
+    <ColorAlias name="trim handle" alias="color 18"/>
+    <ColorAlias name="trim handle locked" alias="color 86"/>
+    <ColorAlias name="trim knob" alias="color 60"/>
+    <ColorAlias name="trim knob: arc end" alias="color 81"/>
+    <ColorAlias name="trim knob: arc start" alias="color 82"/>
+    <ColorAlias name="verbose canvas cursor" alias="color 32"/>
+    <ColorAlias name="video timeline bar" alias="color 46"/>
+    <ColorAlias name="waveform fill" alias="color 13"/>
+    <ColorAlias name="waveform outline" alias="color 4"/>
+    <ColorAlias name="zero line" alias="color 104"/>
+    <ColorAlias name="zoom button: fill active" alias="color 48"/>
+    <ColorAlias name="zoom button: led active" alias="color 8"/>
+  </ColorAliases>
+  <Modifiers>
+    <Modifier name="audio bus base" modifier="= alpha:0.201808"/>
+    <Modifier name="audio track base" modifier="= alpha:0.205615"/>
+    <Modifier name="automation track fill" modifier="= alpha:0.3"/>
+    <Modifier name="covered region base" modifier="= alpha:0.700615"/>
+    <Modifier name="crossfade alpha" modifier="= alpha:0.423606"/>
+    <Modifier name="dragging region" modifier="= alpha:0.99"/>
+    <Modifier name="editable region" modifier="= alpha:0"/>
+    <Modifier name="gain line inactive" modifier="= alpha:0.7725"/>
+    <Modifier name="ghost track base" modifier="= alpha:0.640782"/>
+    <Modifier name="ghost track midi fill" modifier="= alpha:0.182769"/>
+    <Modifier name="inactive crossfade" modifier="= alpha:0.4666"/>
+    <Modifier name="loop rectangle" modifier="= alpha:0.219904"/>
+    <Modifier name="marker bar" modifier="= alpha:0.5"/>
+    <Modifier name="measure line beat" modifier="= alpha:1"/>
+    <Modifier name="midi frame base" modifier="= alpha:0.817702"/>
+    <Modifier name="midi note" modifier="= alpha:0.863394"/>
+    <Modifier name="midi note velocity text" modifier="= alpha:0.4666"/>
+    <Modifier name="midi patch change fill" modifier="= alpha:0.6274"/>
+    <Modifier name="midi sysex fill" modifier="= alpha:0.4666"/>
+    <Modifier name="midi track base" modifier="= alpha:0.3"/>
+    <Modifier name="mono panner position fill" modifier="= alpha:0.8"/>
+    <Modifier name="opaque region base" modifier="= alpha:0.832933"/>
+    <Modifier name="panner fill" modifier="= alpha:0.7882"/>
+    <Modifier name="piano roll black" modifier="= alpha:0.2"/>
+    <Modifier name="piano roll white" modifier="= alpha:0.2"/>
+    <Modifier name="recording rect" modifier="= alpha:0.25"/>
+    <Modifier name="selected midi note" modifier="= alpha:0.484529"/>
+    <Modifier name="selection rect" modifier="= alpha:0.757731"/>
+    <Modifier name="silence" modifier="= alpha:0.4784"/>
+    <Modifier name="stereo panner inverted" modifier="= alpha:0.7882"/>
+    <Modifier name="stereo panner inverted bg" modifier="= alpha:0.7529"/>
+    <Modifier name="time axis view item base" modifier="= alpha:0.7"/>
+    <Modifier name="time stretch fill" modifier="= alpha:0.5"/>
+    <Modifier name="transparent region base" modifier="= alpha:0.99"/>
+    <Modifier name="verbose canvas cursor" modifier="= alpha:0.4666"/>
+  </Modifiers>
+</Ardour>
diff --git a/gtk2_ardour/themes/dark-ardour.colors b/gtk2_ardour/themes/dark-ardour.colors
new file mode 100644
index 0000000..557647e
--- /dev/null
+++ b/gtk2_ardour/themes/dark-ardour.colors
@@ -0,0 +1,533 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Ardour theme-name="dark">
+  <Colors>
+    <Color name="color 1" value="0x20b2b2ff"/>
+    <Color name="color 10" value="0xf0f0f0ff"/>
+    <Color name="color 100" value="0xe49c9cff"/>
+    <Color name="color 101" value="0xa06000ff"/>
+    <Color name="color 103" value="0x1e7727ff"/>
+    <Color name="color 104" value="0x7f7f7fff"/>
+    <Color name="color 11" value="0x9496a3ff"/>
+    <Color name="color 12" value="0x18ab27ff"/>
+    <Color name="color 13" value="0xffffffff"/>
+    <Color name="color 14" value="0x55ccccff"/>
+    <Color name="color 15" value="0x282b49ff"/>
+    <Color name="color 16" value="0x526d94ff"/>
+    <Color name="color 17" value="0x00ff1aff"/>
+    <Color name="color 18" value="0x001affff"/>
+    <Color name="color 19" value="0xdd6363ff"/>
+    <Color name="color 2" value="0x595959ff"/>
+    <Color name="color 20" value="0x684d4dff"/>
+    <Color name="color 21" value="0x969696ff"/>
+    <Color name="color 22" value="0xe5e5e5ff"/>
+    <Color name="color 23" value="0x8000ffff"/>
+    <Color name="color 24" value="0x9fbca2ff"/>
+    <Color name="color 25" value="0x4a4a4aff"/>
+    <Color name="color 26" value="0xc7c9d8ff"/>
+    <Color name="color 27" value="0x191919ff"/>
+    <Color name="color 28" value="0x5d3e7cff"/>
+    <Color name="color 29" value="0x202020ff"/>
+    <Color name="color 3" value="0x738299ff"/>
+    <Color name="color 30" value="0xe500cfff"/>
+    <Color name="color 31" value="0xddddd8ff"/>
+    <Color name="color 32" value="0xeddc3d77"/>
+    <Color name="color 33" value="0xbbbbbbff"/>
+    <Color name="color 34" value="0x3d3d3dff"/>
+    <Color name="color 35" value="0x4250d0ff"/>
+    <Color name="color 36" value="0x473212ff"/>
+    <Color name="color 37" value="0x67cb4eff"/>
+    <Color name="color 38" value="0x1ee8acff"/>
+    <Color name="color 39" value="0x35965cff"/>
+    <Color name="color 4" value="0x000000ff"/>
+    <Color name="color 40" value="0x7c3a3aff"/>
+    <Color name="color 41" value="0x497a5dff"/>
+    <Color name="color 42" value="0x404145ff"/>
+    <Color name="color 43" value="0x000424ff"/>
+    <Color name="color 44" value="0x004f08ff"/>
+    <Color name="color 45" value="0xa29e9eff"/>
+    <Color name="color 46" value="0x333333ff"/>
+    <Color name="color 47" value="0x00880eff"/>
+    <Color name="color 48" value="0x00aa11ff"/>
+    <Color name="color 49" value="0x00660aff"/>
+    <Color name="color 5" value="0x9dadc4ff"/>
+    <Color name="color 50" value="0xeeeeecff"/>
+    <Color name="color 51" value="0x383d37ff"/>
+    <Color name="color 52" value="0xe8faa1ff"/>
+    <Color name="color 53" value="0xf2c37dff"/>
+    <Color name="color 54" value="0xf48352ff"/>
+    <Color name="color 55" value="0xf85813ff"/>
+    <Color name="color 56" value="0x8ec794ff"/>
+    <Color name="color 57" value="0x7ea854ff"/>
+    <Color name="color 58" value="0x474f3fff"/>
+    <Color name="color 59" value="0xb2baffff"/>
+    <Color name="color 6" value="0x44bc50ff"/>
+    <Color name="color 60" value="0x50545aff"/>
+    <Color name="color 61" value="0x20242aff"/>
+    <Color name="color 62" value="0x8894ffff"/>
+    <Color name="color 63" value="0x5566ffff"/>
+    <Color name="color 64" value="0xa7acd4ff"/>
+    <Color name="color 65" value="0xb8cca3ff"/>
+    <Color name="color 66" value="0x4f2f00ff"/>
+    <Color name="color 67" value="0x121212ff"/>
+    <Color name="color 68" value="0xc57805ff"/>
+    <Color name="color 69" value="0x660000ff"/>
+    <Color name="color 7" value="0x282828ff"/>
+    <Color name="color 70" value="0x304057ff"/>
+    <Color name="color 71" value="0x5f5a58ff"/>
+    <Color name="color 72" value="0xe58b05ff"/>
+    <Color name="color 73" value="0x3240c0ff"/>
+    <Color name="color 74" value="0x7a9bccff"/>
+    <Color name="color 75" value="0xbba900ff"/>
+    <Color name="color 76" value="0x6c6e6aff"/>
+    <Color name="color 77" value="0x7aadf9ff"/>
+    <Color name="color 78" value="0x256f8fff"/>
+    <Color name="color 79" value="0x254528ff"/>
+    <Color name="color 8" value="0xff9900ff"/>
+    <Color name="color 80" value="0x603535ff"/>
+    <Color name="color 81" value="0xa5a5a5ff"/>
+    <Color name="color 82" value="0xd8d8d8ff"/>
+    <Color name="color 83" value="0xa80000ff"/>
+    <Color name="color 84" value="0x7b354aff"/>
+    <Color name="color 85" value="0xffa3bfff"/>
+    <Color name="color 86" value="0xcc2828ff"/>
+    <Color name="color 87" value="0x505050ff"/>
+    <Color name="color 88" value="0xc6c6c6ff"/>
+    <Color name="color 89" value="0xb6e8fdff"/>
+    <Color name="color 9" value="0xf10000ff"/>
+    <Color name="color 90" value="0x2c2121ff"/>
+    <Color name="color 91" value="0x8ef823ff"/>
+    <Color name="color 92" value="0x8cd8f8ff"/>
+    <Color name="color 93" value="0x51578aff"/>
+    <Color name="color 94" value="0x636363ff"/>
+    <Color name="color 95" value="0xe4f4d3ff"/>
+    <Color name="color 96" value="0x85e524ff"/>
+    <Color name="color 97" value="0xccccccff"/>
+    <Color name="color 98" value="0x9e00ffff"/>
+    <Color name="color 99" value="0x5da3c1ff"/>
+    <Color name="meter color0" value="0x008800ff"/>
+    <Color name="meter color1" value="0x00aa00ff"/>
+    <Color name="meter color2" value="0x00ff00ff"/>
+    <Color name="meter color3" value="0x00ff00ff"/>
+    <Color name="meter color4" value="0xfff000ff"/>
+    <Color name="meter color5" value="0xfff000ff"/>
+    <Color name="meter color6" value="0xff8800ff"/>
+    <Color name="meter color7" value="0xff8800ff"/>
+    <Color name="meter color8" value="0xff0000ff"/>
+    <Color name="meter color9" value="0xff0000ff"/>
+  </Colors>
+  <ColorAliases>
+    <ColorAlias name="active crossfade" alias="color 1"/>
+    <ColorAlias name="arrange base" alias="color 34"/>
+    <ColorAlias name="audio automation track fill" alias="color 70"/>
+    <ColorAlias name="audio bus base" alias="color 3"/>
+    <ColorAlias name="audio master bus base" alias="color 4"/>
+    <ColorAlias name="audio track base" alias="color 77"/>
+    <ColorAlias name="automation line" alias="color 6"/>
+    <ColorAlias name="automation track outline" alias="color 7"/>
+    <ColorAlias name="big clock active: background" alias="color 4"/>
+    <ColorAlias name="big clock active: cursor" alias="color 8"/>
+    <ColorAlias name="big clock active: edited text" alias="color 8"/>
+    <ColorAlias name="big clock active: text" alias="color 9"/>
+    <ColorAlias name="big clock: background" alias="color 67"/>
+    <ColorAlias name="big clock: cursor" alias="color 8"/>
+    <ColorAlias name="big clock: edited text" alias="color 8"/>
+    <ColorAlias name="big clock: text" alias="color 10"/>
+    <ColorAlias name="border color" alias="color 4"/>
+    <ColorAlias name="cd marker bar" alias="color 87"/>
+    <ColorAlias name="clipped waveform" alias="color 9"/>
+    <ColorAlias name="clock: background" alias="color 67"/>
+    <ColorAlias name="clock: cursor" alias="color 8"/>
+    <ColorAlias name="clock: edited text" alias="color 8"/>
+    <ColorAlias name="clock: text" alias="color 12"/>
+    <ColorAlias name="comment button: fill" alias="color 20"/>
+    <ColorAlias name="control point fill" alias="color 17"/>
+    <ColorAlias name="control point outline" alias="meter color3"/>
+    <ColorAlias name="control point selected fill" alias="color 72"/>
+    <ColorAlias name="control point selected outline" alias="color 9"/>
+    <ColorAlias name="covered region" alias="color 87"/>
+    <ColorAlias name="crossfade editor base" alias="color 15"/>
+    <ColorAlias name="crossfade editor line" alias="color 4"/>
+    <ColorAlias name="crossfade editor line shading" alias="color 16"/>
+    <ColorAlias name="crossfade editor point fill" alias="color 17"/>
+    <ColorAlias name="crossfade editor point outline" alias="color 18"/>
+    <ColorAlias name="crossfade editor wave" alias="color 13"/>
+    <ColorAlias name="crossfade line" alias="color 4"/>
+    <ColorAlias name="edit point" alias="color 18"/>
+    <ColorAlias name="entered automation line" alias="color 19"/>
+    <ColorAlias name="entered gain line" alias="color 19"/>
+    <ColorAlias name="entered marker" alias="color 19"/>
+    <ColorAlias name="feedback alert: fill" alias="color 20"/>
+    <ColorAlias name="feedback alert: fill active" alias="color 9"/>
+    <ColorAlias name="feedback alert: led active" alias="color 4"/>
+    <ColorAlias name="frame handle" alias="color 23"/>
+    <ColorAlias name="gain line" alias="color 6"/>
+    <ColorAlias name="gain line inactive" alias="color 24"/>
+    <ColorAlias name="generic button: fill" alias="color 25"/>
+    <ColorAlias name="generic button: fill active" alias="color 9"/>
+    <ColorAlias name="generic button: led active" alias="color 18"/>
+    <ColorAlias name="ghost track base" alias="color 46"/>
+    <ColorAlias name="ghost track midi outline" alias="color 4"/>
+    <ColorAlias name="ghost track wave" alias="color 29"/>
+    <ColorAlias name="ghost track wave clip" alias="color 29"/>
+    <ColorAlias name="ghost track wave fill" alias="color 29"/>
+    <ColorAlias name="ghost track zero line" alias="color 30"/>
+    <ColorAlias name="gtk_arm" alias="color 9"/>
+    <ColorAlias name="gtk_audio_bus" alias="color 61"/>
+    <ColorAlias name="gtk_audio_track" alias="color 70"/>
+    <ColorAlias name="gtk_control_master" alias="color 5"/>
+    <ColorAlias name="gtk_automation_track_header" alias="color 42"/>
+    <ColorAlias name="gtk_background" alias="color 34"/>
+    <ColorAlias name="gtk_bases" alias="color 27"/>
+    <ColorAlias name="gtk_entry_cursor" alias="color 9"/>
+    <ColorAlias name="gtk_bg_selected" alias="color 99"/>
+    <ColorAlias name="gtk_bg_tooltip" alias="color 52"/>
+    <ColorAlias name="gtk_bright_color" alias="color 74"/>
+    <ColorAlias name="gtk_bright_indicator" alias="color 9"/>
+    <ColorAlias name="gtk_contrasting_indicator" alias="color 91"/>
+    <ColorAlias name="gtk_control_text" alias="color 26"/>
+    <ColorAlias name="gtk_control_text2" alias="color 83"/>
+    <ColorAlias name="gtk_darkest" alias="color 67"/>
+    <ColorAlias name="gtk_fg_selected" alias="color 67"/>
+    <ColorAlias name="gtk_fg_tooltip" alias="color 29"/>
+    <ColorAlias name="gtk_foreground" alias="color 50"/>
+    <ColorAlias name="gtk_light_text_on_dark" alias="color 31"/>
+    <ColorAlias name="gtk_lightest" alias="color 13"/>
+    <ColorAlias name="gtk_midi_channel_selector" alias="color 44"/>
+    <ColorAlias name="gtk_midi_track" alias="color 58"/>
+    <ColorAlias name="gtk_monitor" alias="color 8"/>
+    <ColorAlias name="gtk_mono" alias="color 95"/>
+    <ColorAlias name="gtk_mute" alias="color 52"/>
+    <ColorAlias name="gtk_not_so_bright_indicator" alias="color 32"/>
+    <ColorAlias name="gtk_processor_fader" alias="color 94"/>
+    <ColorAlias name="gtk_processor_fader_frame" alias="color 104"/>
+    <ColorAlias name="gtk_processor_frame_selected" alias="color 32"/>
+    <ColorAlias name="gtk_processor_postfader" alias="color 79"/>
+    <ColorAlias name="gtk_processor_postfader_frame" alias="color 103"/>
+    <ColorAlias name="gtk_processor_prefader" alias="color 69"/>
+    <ColorAlias name="gtk_processor_prefader_frame" alias="color 69"/>
+    <ColorAlias name="gtk_send_bg" alias="color 38"/>
+    <ColorAlias name="gtk_send_fg" alias="color 24"/>
+    <ColorAlias name="gtk_solo" alias="color 91"/>
+    <ColorAlias name="gtk_somewhat_bright_indicator" alias="color 89"/>
+    <ColorAlias name="gtk_texts" alias="color 50"/>
+    <ColorAlias name="gtk_track_header_inactive" alias="color 34"/>
+    <ColorAlias name="gtk_track_header_selected" alias="color 40"/>
+    <ColorAlias name="image track" alias="color 31"/>
+    <ColorAlias name="inactive crossfade" alias="color 32"/>
+    <ColorAlias name="inactive fade handle" alias="color 33"/>
+    <ColorAlias name="inactive group tab" alias="color 34"/>
+    <ColorAlias name="invert button: fill active" alias="color 35"/>
+    <ColorAlias name="invert button: led active" alias="color 37"/>
+    <ColorAlias name="location cd marker" alias="color 38"/>
+    <ColorAlias name="location loop" alias="color 39"/>
+    <ColorAlias name="location marker" alias="color 32"/>
+    <ColorAlias name="location punch" alias="color 40"/>
+    <ColorAlias name="location range" alias="color 41"/>
+    <ColorAlias name="lock button: fill active" alias="color 42"/>
+    <ColorAlias name="lock button: led active" alias="color 4"/>
+    <ColorAlias name="marker bar" alias="color 2"/>
+    <ColorAlias name="marker bar separator" alias="color 27"/>
+    <ColorAlias name="marker drag line" alias="color 44"/>
+    <ColorAlias name="marker label" alias="color 4"/>
+    <ColorAlias name="marker track" alias="color 31"/>
+    <ColorAlias name="master monitor section button normal: fill active" alias="color 42"/>
+    <ColorAlias name="master monitor section button active: fill"        alias="color 40"/>
+    <ColorAlias name="master monitor section button active: fill active" alias="color 54"/>
+    <ColorAlias name="measure line bar" alias="color 13"/>
+    <ColorAlias name="measure line beat" alias="color 33"/>
+    <ColorAlias name="meter background bottom" alias="color 46"/>
+    <ColorAlias name="meter background top" alias="color 34"/>
+    <ColorAlias name="meter bar" alias="color 7"/>
+    <ColorAlias name="meter color BBC" alias="color 8"/>
+    <ColorAlias name="meter marker" alias="color 19"/>
+    <ColorAlias name="meterbridge label: fill" alias="color 34"/>
+    <ColorAlias name="meterbridge label: fill active" alias="color 46"/>
+    <ColorAlias name="meterbridge label: led" alias="color 9"/>
+    <ColorAlias name="meterbridge label: led active" alias="color 9"/>
+    <ColorAlias name="meterbridge peakindicator: fill" alias="color 34"/>
+    <ColorAlias name="meterbridge peakindicator: fill active" alias="color 9"/>
+    <ColorAlias name="meterbridge peakindicator: led" alias="color 9"/>
+    <ColorAlias name="meterbridge peakindicator: led active" alias="color 9"/>
+    <ColorAlias name="meterbridge peaklabel" alias="color 9"/>
+    <ColorAlias name="meterstrip dpm bg" alias="color 27"/>
+    <ColorAlias name="meterstrip dpm fg" alias="color 31"/>
+    <ColorAlias name="meterstrip ppm bg" alias="color 27"/>
+    <ColorAlias name="meterstrip ppm fg" alias="color 31"/>
+    <ColorAlias name="meterstrip vu bg" alias="color 32"/>
+    <ColorAlias name="meterstrip vu fg" alias="color 4"/>
+    <ColorAlias name="midi automation track fill" alias="color 58"/>
+    <ColorAlias name="midi bus base" alias="color 4"/>
+    <ColorAlias name="midi device: fill" alias="color 25"/>
+    <ColorAlias name="midi device: fill active" alias="color 42"/>
+    <ColorAlias name="midi device: led active" alias="color 17"/>
+    <ColorAlias name="midi frame base" alias="color 87"/>
+    <ColorAlias name="midi input button: fill active" alias="color 48"/>
+    <ColorAlias name="midi input button: led active" alias="color 4"/>
+    <ColorAlias name="midi meter color0" alias="color 52"/>
+    <ColorAlias name="midi meter color1" alias="color 53"/>
+    <ColorAlias name="midi meter color2" alias="color 53"/>
+    <ColorAlias name="midi meter color3" alias="color 54"/>
+    <ColorAlias name="midi meter color4" alias="color 54"/>
+    <ColorAlias name="midi meter color5" alias="color 55"/>
+    <ColorAlias name="midi meter color6" alias="color 55"/>
+    <ColorAlias name="midi meter color7" alias="color 56"/>
+    <ColorAlias name="midi meter color8" alias="color 56"/>
+    <ColorAlias name="midi meter color9" alias="color 17"/>
+    <ColorAlias name="midi note inactive channel" alias="color 4"/>
+    <ColorAlias name="midi note max" alias="color 8"/>
+    <ColorAlias name="midi note mid" alias="color 96"/>
+    <ColorAlias name="midi note min" alias="color 103"/>
+    <ColorAlias name="midi note selected" alias="color 40"/>
+    <ColorAlias name="midi note selected outline" alias="color 9"/>
+    <ColorAlias name="midi note velocity text" alias="color 32"/>
+    <ColorAlias name="midi patch change fill" alias="color 60"/>
+    <ColorAlias name="midi patch change outline" alias="color 26"/>
+    <ColorAlias name="midi select rect outline" alias="color 63"/>
+    <ColorAlias name="midi sysex fill" alias="color 32"/>
+    <ColorAlias name="midi sysex outline" alias="color 64"/>
+    <ColorAlias name="midi track base" alias="color 41"/>
+    <ColorAlias name="mixer strip button: fill active" alias="color 8"/>
+    <ColorAlias name="mixer strip button: led active" alias="color 8"/>
+    <ColorAlias name="mixer strip name button: fill active" alias="color 67"/>
+    <ColorAlias name="mixer strip name button: led active" alias="color 8"/>
+    <ColorAlias name="monitor button: fill active" alias="color 68"/>
+    <ColorAlias name="monitor button: led active" alias="color 9"/>
+    <ColorAlias name="monitor section knob" alias="color 60"/>
+    <ColorAlias name="monitor section knob: arc end" alias="color 70"/>
+    <ColorAlias name="monitor section knob: arc start" alias="color 16"/>
+    <ColorAlias name="monitor section mono: fill" alias="color 71"/>
+    <ColorAlias name="monitor section mono: fill active" alias="color 73"/>
+    <ColorAlias name="monitor section mono: led active" alias="color 37"/>
+    <ColorAlias name="monitor section dim: fill" alias="color 71"/>
+    <ColorAlias name="monitor section dim: fill active" alias="color 72"/>
+    <ColorAlias name="monitor section dim: led active" alias="color 37"/>
+    <ColorAlias name="monitor section solo model: fill" alias="color 71"/>
+    <ColorAlias name="monitor section solo model: fill active" alias="color 42"/>
+    <ColorAlias name="monitor section solo model: led active" alias="color 8"/>
+    <ColorAlias name="monitor section solo option: fill" alias="color 71"/>
+    <ColorAlias name="monitor section solo option: fill active" alias="color 42"/>
+    <ColorAlias name="monitor section solo option: led active" alias="color 8"/>
+    <ColorAlias name="monitor section processors toggle: fill active" alias="color 42"/>
+    <ColorAlias name="monitor section processors present: fill" alias="color 20"/>
+    <ColorAlias name="mono panner bg" alias="color 67"/>
+    <ColorAlias name="mono panner fill" alias="color 74"/>
+    <ColorAlias name="mono panner outline" alias="color 70"/>
+    <ColorAlias name="mono panner position fill" alias="color 11"/>
+    <ColorAlias name="mono panner position outline" alias="color 70"/>
+    <ColorAlias name="mono panner text" alias="color 4"/>
+    <ColorAlias name="mouse mode button: fill active" alias="color 12"/>
+    <ColorAlias name="mouse mode button: led active" alias="color 8"/>
+    <ColorAlias name="mute button: fill active" alias="color 75"/>
+    <ColorAlias name="mute button: led active" alias="color 4"/>
+    <ColorAlias name="name highlight fill" alias="color 18"/>
+    <ColorAlias name="name highlight outline" alias="color 23"/>
+    <ColorAlias name="nudge button: fill" alias="color 20"/>
+    <ColorAlias name="nudge button: fill active" alias="color 42"/>
+    <ColorAlias name="nudge button: led active" alias="color 8"/>
+    <ColorAlias name="nudge clock: background" alias="color 67"/>
+    <ColorAlias name="nudge clock: cursor" alias="color 8"/>
+    <ColorAlias name="nudge clock: edited text" alias="color 8"/>
+    <ColorAlias name="nudge clock: text" alias="color 12"/>
+    <ColorAlias name="page switch button: fill active" alias="color 92"/>
+    <ColorAlias name="page switch button: fill" alias="color 94"/>
+    <ColorAlias name="piano roll black" alias="color 76"/>
+    <ColorAlias name="piano roll black outline" alias="color 33"/>
+    <ColorAlias name="piano roll white" alias="color 45"/>
+    <ColorAlias name="play head" alias="color 9"/>
+    <ColorAlias name="plugin bypass button: led active" alias="color 8"/>
+    <ColorAlias name="pluginlist hide button: led active" alias="color 14"/>
+    <ColorAlias name="pluginlist filter button: fill active" alias="color 14"/>
+    <ColorAlias name="pluginui toggle: fill" alias="color 71"/>
+    <ColorAlias name="pluginui toggle: fill active" alias="color 9"/>
+    <ColorAlias name="processor automation line" alias="color 77"/>
+    <ColorAlias name="processor control button: fill" alias="color 29"/>
+    <ColorAlias name="processor control button: fill active" alias="color 46"/>
+    <ColorAlias name="processor control button: led active" alias="color 62"/>
+    <ColorAlias name="processor control knob" alias="color 60"/>
+    <ColorAlias name="processor control knob: arc end" alias="color 70"/>
+    <ColorAlias name="processor control knob: arc start" alias="color 16"/>
+    <ColorAlias name="processor fader: fill" alias="color 16"/>
+    <ColorAlias name="processor fader: fill active" alias="color 78"/>
+    <ColorAlias name="processor fader: led active" alias="color 37"/>
+    <ColorAlias name="processor postfader: fill" alias="color 58"/>
+    <ColorAlias name="processor postfader: fill active" alias="color 79"/>
+    <ColorAlias name="processor postfader: led active" alias="color 37"/>
+    <ColorAlias name="processor prefader: fill" alias="color 40"/>
+    <ColorAlias name="processor prefader: fill active" alias="color 80"/>
+    <ColorAlias name="processor prefader: led active" alias="color 37"/>
+    <ColorAlias name="processor stub: fill" alias="color 46"/>
+    <ColorAlias name="processor stub: fill active" alias="color 46"/>
+    <ColorAlias name="processor sidechain: fill" alias="color 68"/>
+    <ColorAlias name="processor sidechain: led active" alias="color 37"/>
+    <ColorAlias name="pinrouting custom: led active" alias="color 86"/>
+    <ColorAlias name="pinrouting sidechain: led active" alias="color 50"/>
+    <ColorAlias name="punch button: fill" alias="color 20"/>
+    <ColorAlias name="punch button: fill active" alias="color 9"/>
+    <ColorAlias name="punch button: led active" alias="color 4"/>
+    <ColorAlias name="punch clock: background" alias="color 67"/>
+    <ColorAlias name="punch clock: cursor" alias="color 9"/>
+    <ColorAlias name="punch clock: edited text" alias="color 9"/>
+    <ColorAlias name="punch clock: text" alias="color 12"/>
+    <ColorAlias name="punch line" alias="color 83"/>
+    <ColorAlias name="range drag bar rect" alias="color 21"/>
+    <ColorAlias name="range drag rect" alias="color 56"/>
+    <ColorAlias name="range marker bar" alias="color 34"/>
+    <ColorAlias name="record enable button: fill active" alias="color 83"/>
+    <ColorAlias name="record enable button: led active" alias="color 85"/>
+    <ColorAlias name="recording rect" alias="color 86"/>
+    <ColorAlias name="recording waveform fill" alias="color 13"/>
+    <ColorAlias name="recording waveform outline" alias="color 43"/>
+    <ColorAlias name="region list automatic" alias="color 53"/>
+    <ColorAlias name="region list missing source" alias="color 9"/>
+    <ColorAlias name="region list whole file" alias="color 1"/>
+    <ColorAlias name="route button: fill active" alias="color 67"/>
+    <ColorAlias name="route button: led active" alias="color 8"/>
+    <ColorAlias name="rubber band rect" alias="color 88"/>
+    <ColorAlias name="rude audition: fill" alias="color 20"/>
+    <ColorAlias name="rude audition: fill active" alias="color 86"/>
+    <ColorAlias name="rude audition: led active" alias="color 4"/>
+    <ColorAlias name="rude isolate: fill" alias="color 42"/>
+    <ColorAlias name="rude isolate: fill active" alias="color 89"/>
+    <ColorAlias name="rude isolate: led active" alias="color 4"/>
+    <ColorAlias name="rude solo: fill" alias="color 20"/>
+    <ColorAlias name="rude solo: fill active" alias="color 86"/>
+    <ColorAlias name="rude solo: led active" alias="color 4"/>
+    <ColorAlias name="ruler base" alias="color 67"/>
+    <ColorAlias name="ruler text" alias="color 22"/>
+    <ColorAlias name="secondary clock: background" alias="color 67"/>
+    <ColorAlias name="secondary clock: cursor" alias="color 8"/>
+    <ColorAlias name="secondary clock: edited text" alias="color 8"/>
+    <ColorAlias name="secondary clock: text" alias="color 91"/>
+    <ColorAlias name="secondary delta clock: background" alias="color 67"/>
+    <ColorAlias name="secondary delta clock: cursor" alias="color 9"/>
+    <ColorAlias name="secondary delta clock: edited text" alias="color 9"/>
+    <ColorAlias name="secondary delta clock: text" alias="color 92"/>
+    <ColorAlias name="selected midi note frame" alias="color 86"/>
+    <ColorAlias name="selected region base" alias="color 25"/>
+    <ColorAlias name="selected time axis frame" alias="color 86"/>
+    <ColorAlias name="selected waveform fill" alias="color 8"/>
+    <ColorAlias name="selected waveform outline" alias="color 67"/>
+    <ColorAlias name="selection" alias="color 94"/>
+    <ColorAlias name="selection clock: background" alias="color 67"/>
+    <ColorAlias name="selection clock: cursor" alias="color 9"/>
+    <ColorAlias name="selection clock: edited text" alias="color 9"/>
+    <ColorAlias name="selection clock: text" alias="color 12"/>
+    <ColorAlias name="selection rect" alias="color 95"/>
+    <ColorAlias name="send alert button: fill" alias="color 71"/>
+    <ColorAlias name="send alert button: fill active" alias="color 38"/>
+    <ColorAlias name="send alert button: led active" alias="color 4"/>
+    <ColorAlias name="send bg" alias="color 38"/>
+    <ColorAlias name="shuttle" alias="color 12"/>
+    <ColorAlias name="shuttle bg" alias="color 4"/>
+    <ColorAlias name="shuttle text" alias="color 13"/>
+    <ColorAlias name="silence" alias="color 98"/>
+    <ColorAlias name="silence text" alias="color 10"/>
+    <ColorAlias name="solo button: fill active" alias="color 12"/>
+    <ColorAlias name="solo button: led active" alias="color 4"/>
+    <ColorAlias name="solo isolate: fill" alias="color 25"/>
+    <ColorAlias name="solo isolate: fill active" alias="color 42"/>
+    <ColorAlias name="solo isolate: led active" alias="color 9"/>
+    <ColorAlias name="solo safe: fill" alias="color 25"/>
+    <ColorAlias name="solo safe: fill active" alias="color 42"/>
+    <ColorAlias name="solo safe: led active" alias="color 9"/>
+    <ColorAlias name="stereo panner bg" alias="color 67"/>
+    <ColorAlias name="stereo panner fill" alias="color 74"/>
+    <ColorAlias name="stereo panner inverted bg" alias="color 61"/>
+    <ColorAlias name="stereo panner inverted fill" alias="color 100"/>
+    <ColorAlias name="stereo panner inverted outline" alias="color 83"/>
+    <ColorAlias name="stereo panner inverted text" alias="color 4"/>
+    <ColorAlias name="stereo panner mono bg" alias="color 67"/>
+    <ColorAlias name="stereo panner mono fill" alias="color 54"/>
+    <ColorAlias name="stereo panner mono outline" alias="color 101"/>
+    <ColorAlias name="stereo panner mono text" alias="color 4"/>
+    <ColorAlias name="stereo panner outline" alias="color 70"/>
+    <ColorAlias name="stereo panner rule" alias="color 70"/>
+    <ColorAlias name="stereo panner text" alias="color 4"/>
+    <ColorAlias name="stretch clock: background" alias="color 67"/>
+    <ColorAlias name="stretch clock: cursor" alias="color 8"/>
+    <ColorAlias name="stretch clock: edited text" alias="color 8"/>
+    <ColorAlias name="stretch clock: text" alias="color 91"/>
+    <ColorAlias name="sync mark" alias="color 75"/>
+    <ColorAlias name="tempo bar" alias="color 46"/>
+    <ColorAlias name="tempo curve" alias="color 62"/>
+    <ColorAlias name="tempo marker" alias="color 19"/>
+    <ColorAlias name="tempo marker music" alias="color 5"/>
+    <ColorAlias name="time axis frame" alias="color 4"/>
+    <ColorAlias name="time axis view item base" alias="color 94"/>
+    <ColorAlias name="time stretch fill" alias="color 100"/>
+    <ColorAlias name="time stretch outline" alias="color 94"/>
+    <ColorAlias name="tracknumber label: fill" alias="color 34"/>
+    <ColorAlias name="tracknumber label: fill active" alias="color 46"/>
+    <ColorAlias name="tracknumber label: led active" alias="color 9"/>
+    <ColorAlias name="transport active option button: fill active" alias="color 48"/>
+    <ColorAlias name="transport active option button: led active" alias="color 8"/>
+    <ColorAlias name="transport button: fill active" alias="color 48"/>
+    <ColorAlias name="transport button: led active" alias="color 4"/>
+    <ColorAlias name="transport clock: background" alias="color 67"/>
+    <ColorAlias name="transport clock: cursor" alias="color 8"/>
+    <ColorAlias name="transport clock: edited text" alias="color 8"/>
+    <ColorAlias name="transport clock: text" alias="color 91"/>
+    <ColorAlias name="transport delta clock: background" alias="color 67"/>
+    <ColorAlias name="transport delta clock: cursor" alias="color 9"/>
+    <ColorAlias name="transport delta clock: edited text" alias="color 9"/>
+    <ColorAlias name="transport delta clock: text" alias="color 92"/>
+    <ColorAlias name="transport drag rect" alias="color 21"/>
+    <ColorAlias name="transport loop rect" alias="color 103"/>
+    <ColorAlias name="transport marker bar" alias="color 25"/>
+    <ColorAlias name="transport option button: fill active" alias="color 42"/>
+    <ColorAlias name="transport option button: led active" alias="color 8"/>
+    <ColorAlias name="transport punch rect" alias="color 80"/>
+    <ColorAlias name="transport recenable button: fill" alias="color 20"/>
+    <ColorAlias name="transport recenable button: fill active" alias="color 83"/>
+    <ColorAlias name="transport recenable button: led active" alias="color 4"/>
+    <ColorAlias name="trim handle" alias="color 18"/>
+    <ColorAlias name="trim handle locked" alias="color 86"/>
+    <ColorAlias name="trim knob" alias="color 60"/>
+    <ColorAlias name="trim knob: arc end" alias="color 81"/>
+    <ColorAlias name="trim knob: arc start" alias="color 82"/>
+    <ColorAlias name="verbose canvas cursor" alias="color 32"/>
+    <ColorAlias name="video timeline bar" alias="color 46"/>
+    <ColorAlias name="waveform fill" alias="color 13"/>
+    <ColorAlias name="waveform outline" alias="color 4"/>
+    <ColorAlias name="zero line" alias="color 104"/>
+    <ColorAlias name="zoom button: fill active" alias="color 48"/>
+    <ColorAlias name="zoom button: led active" alias="color 8"/>
+  </ColorAliases>
+  <Modifiers>
+    <Modifier name="audio bus base" modifier="= alpha:0.3"/>
+    <Modifier name="audio track base" modifier="= alpha:0.3"/>
+    <Modifier name="automation track fill" modifier="= alpha:0.3"/>
+    <Modifier name="covered region base" modifier="= alpha:0.7"/>
+    <Modifier name="crossfade alpha" modifier="= alpha:0.1803"/>
+    <Modifier name="dragging region" modifier="= alpha:0.9"/>
+    <Modifier name="editable region" modifier="= alpha:0.25"/>
+    <Modifier name="gain line inactive" modifier="= alpha:0.7725"/>
+    <Modifier name="ghost track base" modifier="= alpha:0.640782"/>
+    <Modifier name="ghost track midi fill" modifier="= alpha:0.3"/>
+    <Modifier name="inactive crossfade" modifier="= alpha:0.4666"/>
+    <Modifier name="loop rectangle" modifier="= alpha:0.5"/>
+    <Modifier name="marker bar" modifier="= alpha:0.5"/>
+    <Modifier name="measure line beat" modifier="= alpha:1.0"/>
+    <Modifier name="midi frame base" modifier="= alpha:0.4"/>
+    <Modifier name="midi note" modifier="= alpha:0.8"/>
+    <Modifier name="midi note velocity text" modifier="= alpha:0.4666"/>
+    <Modifier name="midi patch change fill" modifier="= alpha:0.6274"/>
+    <Modifier name="midi sysex fill" modifier="= alpha:0.4666"/>
+    <Modifier name="midi track base" modifier="= alpha:0.3"/>
+    <Modifier name="mono panner position fill" modifier="= alpha:0.8"/>
+    <Modifier name="opaque region base" modifier="= alpha:0.75"/>
+    <Modifier name="panner fill" modifier="= alpha:0.7882"/>
+    <Modifier name="piano roll black" modifier="= alpha:0.2"/>
+    <Modifier name="piano roll white" modifier="= alpha:0.2"/>
+    <Modifier name="recording rect" modifier="= alpha:0.25"/>
+    <Modifier name="selected midi note" modifier="= alpha:0.7529"/>
+    <Modifier name="selection rect" modifier="= alpha:0.4666"/>
+    <Modifier name="silence" modifier="= alpha:0.4784"/>
+    <Modifier name="stereo panner inverted" modifier="= alpha:0.7882"/>
+    <Modifier name="stereo panner inverted bg" modifier="= alpha:0.7529"/>
+    <Modifier name="time axis view item base" modifier="= alpha:0.7"/>
+    <Modifier name="transparent region base" modifier="= alpha:0.6"/>
+   <Modifier name="time stretch fill" modifier="= alpha:0.5"/>
+    <Modifier name="verbose canvas cursor" modifier="= alpha:0.4666"/>
+  </Modifiers>
+</Ardour>
diff --git a/gtk2_ardour/themes/unastudia-ardour.colors b/gtk2_ardour/themes/unastudia-ardour.colors
new file mode 100644
index 0000000..fd0c148
--- /dev/null
+++ b/gtk2_ardour/themes/unastudia-ardour.colors
@@ -0,0 +1,523 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Ardour  theme-name="UnaStudia">
+	<Colors>
+		<Color name="color 109" value="0x5e656bff"/>
+		<Color name="color 108" value="0xcccdceff"/>
+		<Color name="color 107" value="0x565c64ff"/>
+		<Color name="color 106" value="0x000000ff"/>
+		<Color name="color 105" value="0x3e464eff"/>
+		<Color name="color 1" value="0x4e7e9cff"/>
+		<Color name="color 10" value="0xf0f0f0ff"/>
+		<Color name="color 100" value="0xe49c9cff"/>
+		<Color name="color 101" value="0xa06000ff"/>
+		<Color name="color 103" value="0x1e7753ff"/>
+		<Color name="color 104" value="0x7f7f7fff"/>
+		<Color name="color 11" value="0x9496a3ff"/>
+		<Color name="color 12" value="0xe0e2e5ff"/>
+		<Color name="color 13" value="0xffffffff"/>
+		<Color name="color 14" value="0x3c688aff"/>
+		<Color name="color 15" value="0x282b49ff"/>
+		<Color name="color 16" value="0x4e8099ff"/>
+		<Color name="color 17" value="0x00ffdfff"/>
+		<Color name="color 18" value="0x001affff"/>
+		<Color name="color 19" value="0xdd6363ff"/>
+		<Color name="color 2" value="0x595959ff"/>
+		<Color name="color 20" value="0x684d4dff"/>
+		<Color name="color 21" value="0x969696ff"/>
+		<Color name="color 22" value="0xe5e5e5ff"/>
+		<Color name="color 23" value="0x404145ff"/>
+		<Color name="color 24" value="0x9fbca2ff"/>
+		<Color name="color 25" value="0x4a4a4aff"/>
+		<Color name="color 26" value="0xc7c9d8ff"/>
+		<Color name="color 27" value="0x272a2eff"/>
+		<Color name="color 28" value="0x404145ff"/>
+		<Color name="color 29" value="0x202020ff"/>
+		<Color name="color 3" value="0x738299ff"/>
+		<Color name="color 30" value="0x404145ff"/>
+		<Color name="color 31" value="0xddddd8ff"/>
+		<Color name="color 32" value="0xeddc3dff"/>
+		<Color name="color 33" value="0xc0c4c9ff"/>
+		<Color name="color 34" value="0xcbd6daff"/>
+		<Color name="color 35" value="0x4250d0ff"/>
+		<Color name="color 36" value="0x473212ff"/>
+		<Color name="color 37" value="0x76b8e8ff"/>
+		<Color name="color 38" value="0x1ee8acff"/>
+		<Color name="color 39" value="0xcececeff"/>
+		<Color name="color 4" value="0x000000ff"/>
+		<Color name="color 40" value="0xacb3b9ff"/>
+		<Color name="color 41" value="0x497a5dff"/>
+		<Color name="color 42" value="0x404145ff"/>
+		<Color name="color 43" value="0x000424ff"/>
+		<Color name="color 44" value="0x004f3cff"/>
+		<Color name="color 45" value="0xa29e9eff"/>
+		<Color name="color 46" value="0x2f3841ff"/>
+		<Color name="color 47" value="0x008852ff"/>
+		<Color name="color 48" value="0x4495e3ff"/>
+		<Color name="color 49" value="0x0f0797ff"/>
+		<Color name="color 5" value="0x9dadc4ff"/>
+		<Color name="color 50" value="0xeeeeecff"/>
+		<Color name="color 51" value="0x383d37ff"/>
+		<Color name="color 52" value="0xbba34cff"/>
+		<Color name="color 53" value="0xf2c37dff"/>
+		<Color name="color 54" value="0xf48352ff"/>
+		<Color name="color 55" value="0xf85813ff"/>
+		<Color name="color 56" value="0x8ec794ff"/>
+		<Color name="color 57" value="0x7ea854ff"/>
+		<Color name="color 58" value="0x696e64ff"/>
+		<Color name="color 59" value="0xb2baffff"/>
+		<Color name="color 6" value="0x404145ff"/>
+		<Color name="color 60" value="0x50545aff"/>
+		<Color name="color 61" value="0x20242aff"/>
+		<Color name="color 62" value="0x8894ffff"/>
+		<Color name="color 63" value="0x5566ffff"/>
+		<Color name="color 64" value="0xa7acd4ff"/>
+		<Color name="color 65" value="0xb8cca3ff"/>
+		<Color name="color 66" value="0x4f2f00ff"/>
+		<Color name="color 67" value="0x282a2bff"/>
+		<Color name="color 68" value="0xc57805ff"/>
+		<Color name="color 69" value="0x030207ff"/>
+		<Color name="color 7" value="0x282b30ff"/>
+		<Color name="color 70" value="0x304057ff"/>
+		<Color name="color 71" value="0x5f5a58ff"/>
+		<Color name="color 72" value="0x5991A6ff"/>
+		<Color name="color 73" value="0x3240c0ff"/>
+		<Color name="color 74" value="0x7a9bccff"/>
+		<Color name="color 75" value="0xe6bb3bff"/>
+		<Color name="color 76" value="0x6c6e6aff"/>
+		<Color name="color 77" value="0x7aadf9ff"/>
+		<Color name="color 78" value="0x2e769cff"/>
+		<Color name="color 79" value="0x6b806dff"/>
+		<Color name="color 8" value="0xc20020ff"/>
+		<Color name="color 80" value="0x603535ff"/>
+		<Color name="color 81" value="0xa5a5a5ff"/>
+		<Color name="color 82" value="0x00c73eff"/>
+		<Color name="color 83" value="0xa80000ff"/>
+		<Color name="color 84" value="0x7b354aff"/>
+		<Color name="color 85" value="0xffa3bfff"/>
+		<Color name="color 86" value="0xcc2828ff"/>
+		<Color name="color 87" value="0x505050ff"/>
+		<Color name="color 88" value="0xc6c6c6ff"/>
+		<Color name="color 89" value="0xb6e8fdff"/>
+		<Color name="color 9" value="0xffffffff"/>
+		<Color name="color 90" value="0x2c2121ff"/>
+		<Color name="color 91" value="0x404145ff"/>
+		<Color name="color 92" value="0x8cd8f8ff"/>
+		<Color name="color 93" value="0x51578aff"/>
+		<Color name="color 94" value="0x636363ff"/>
+		<Color name="color 95" value="0xe4f4d3ff"/>
+		<Color name="color 96" value="0x24e59cff"/>
+		<Color name="color 97" value="0xccccccff"/>
+		<Color name="color 98" value="0x404145ff"/>
+		<Color name="color 99" value="0xacb3b9ff"/>
+		<Color name="meter color0" value="0x418cb1ff"/>
+		<Color name="meter color1" value="0x418cb1ff"/>
+		<Color name="meter color2" value="0x418cb1ff"/>
+		<Color name="meter color3" value="0x418cb1ff"/>
+		<Color name="meter color4" value="0x418cb1ff"/>
+		<Color name="meter color5" value="0x418cb1ff"/>
+		<Color name="meter color6" value="0x418cb1ff"/>
+		<Color name="meter color7" value="0x418cb1ff"/>
+		<Color name="meter color8" value="0x418cb1ff"/>
+		<Color name="meter color9" value="0x418cb1ff"/>
+	</Colors>
+	<ColorAliases>
+		<ColorAlias name="active crossfade" alias="color 105"/>
+		<ColorAlias name="arrange base" alias="color 67"/>
+		<ColorAlias name="audio automation track fill" alias="color 27"/>
+		<ColorAlias name="audio bus base" alias="color 27"/>
+		<ColorAlias name="audio master bus base" alias="color 27"/>
+		<ColorAlias name="audio track base" alias="color 107"/>
+		<ColorAlias name="automation line" alias="meter color1"/>
+		<ColorAlias name="automation track outline" alias="color 7"/>
+		<ColorAlias name="big clock active: background" alias="color 4"/>
+		<ColorAlias name="big clock active: cursor" alias="color 8"/>
+		<ColorAlias name="big clock active: edited text" alias="color 8"/>
+		<ColorAlias name="big clock active: text" alias="color 1"/>
+		<ColorAlias name="big clock: background" alias="color 67"/>
+		<ColorAlias name="big clock: cursor" alias="color 8"/>
+		<ColorAlias name="big clock: edited text" alias="color 8"/>
+		<ColorAlias name="big clock: text" alias="color 1"/>
+		<ColorAlias name="border color" alias="color 4"/>
+		<ColorAlias name="cd marker bar" alias="color 87"/>
+		<ColorAlias name="clipped waveform" alias="color 9"/>
+		<ColorAlias name="clock: background" alias="color 67"/>
+		<ColorAlias name="clock: cursor" alias="color 8"/>
+		<ColorAlias name="clock: edited text" alias="color 8"/>
+		<ColorAlias name="clock: text" alias="color 1"/>
+		<ColorAlias name="comment button: fill" alias="color 20"/>
+		<ColorAlias name="control point fill" alias="color 17"/>
+		<ColorAlias name="control point outline" alias="meter color3"/>
+		<ColorAlias name="control point selected fill" alias="color 72"/>
+		<ColorAlias name="control point selected outline" alias="color 9"/>
+		<ColorAlias name="covered region" alias="color 87"/>
+		<ColorAlias name="crossfade editor base" alias="color 15"/>
+		<ColorAlias name="crossfade editor line" alias="color 4"/>
+		<ColorAlias name="crossfade editor line shading" alias="color 16"/>
+		<ColorAlias name="crossfade editor point fill" alias="color 17"/>
+		<ColorAlias name="crossfade editor point outline" alias="color 1"/>
+		<ColorAlias name="crossfade editor wave" alias="color 13"/>
+		<ColorAlias name="crossfade line" alias="color 4"/>
+		<ColorAlias name="edit point" alias="color 1"/>
+		<ColorAlias name="entered automation line" alias="color 19"/>
+		<ColorAlias name="entered gain line" alias="color 19"/>
+		<ColorAlias name="entered marker" alias="color 19"/>
+		<ColorAlias name="feedback alert: fill" alias="color 25"/>
+		<ColorAlias name="feedback alert: fill active" alias="color 1"/>
+		<ColorAlias name="feedback alert: led active" alias="color 1"/>
+		<ColorAlias name="frame handle" alias="color 23"/>
+		<ColorAlias name="gain line" alias="color 6"/>
+		<ColorAlias name="gain line inactive" alias="color 24"/>
+		<ColorAlias name="generic button: fill" alias="color 42"/>
+		<ColorAlias name="generic button: fill active" alias="color 14"/>
+		<ColorAlias name="generic button: led active" alias="color 1"/>
+		<ColorAlias name="ghost track base" alias="color 46"/>
+		<ColorAlias name="ghost track midi outline" alias="color 4"/>
+		<ColorAlias name="ghost track wave" alias="color 29"/>
+		<ColorAlias name="ghost track wave clip" alias="color 29"/>
+		<ColorAlias name="ghost track wave fill" alias="color 29"/>
+		<ColorAlias name="ghost track zero line" alias="color 30"/>
+		<ColorAlias name="gtk_arm" alias="color 2"/>
+		<ColorAlias name="gtk_audio_bus" alias="color 27"/>
+		<ColorAlias name="gtk_audio_track" alias="color 107"/>
+		<ColorAlias name="gtk_automation_track_header" alias="color 27"/>
+		<ColorAlias name="gtk_background" alias="color 27"/>
+		<ColorAlias name="gtk_bases" alias="color 7"/>
+		<ColorAlias name="gtk_bg_selected" alias="color 99"/>
+		<ColorAlias name="gtk_bg_tooltip" alias="color 52"/>
+		<ColorAlias name="gtk_bright_color" alias="color 74"/>
+		<ColorAlias name="gtk_bright_indicator" alias="color 1"/>
+		<ColorAlias name="gtk_contrasting_indicator" alias="color 91"/>
+		<ColorAlias name="gtk_control_master" alias="color 64"/>
+		<ColorAlias name="gtk_control_text" alias="color 26"/>
+		<ColorAlias name="gtk_control_text2" alias="color 83"/>
+		<ColorAlias name="gtk_darkest" alias="color 67"/>
+		<ColorAlias name="gtk_entry_cursor" alias="color 9"/>
+		<ColorAlias name="gtk_fg_selected" alias="color 67"/>
+		<ColorAlias name="gtk_fg_tooltip" alias="color 29"/>
+		<ColorAlias name="gtk_foreground" alias="color 50"/>
+		<ColorAlias name="gtk_light_text_on_dark" alias="color 31"/>
+		<ColorAlias name="gtk_lightest" alias="color 13"/>
+		<ColorAlias name="gtk_midi_channel_selector" alias="color 15"/>
+		<ColorAlias name="gtk_midi_track" alias="color 105"/>
+		<ColorAlias name="gtk_monitor" alias="color 8"/>
+		<ColorAlias name="gtk_mono" alias="color 95"/>
+		<ColorAlias name="gtk_mute" alias="color 52"/>
+		<ColorAlias name="gtk_not_so_bright_indicator" alias="color 1"/>
+		<ColorAlias name="gtk_processor_fader" alias="color 94"/>
+		<ColorAlias name="gtk_processor_fader_frame" alias="color 104"/>
+		<ColorAlias name="gtk_processor_frame_selected" alias="color 1"/>
+		<ColorAlias name="gtk_processor_postfader" alias="color 79"/>
+		<ColorAlias name="gtk_processor_postfader_frame" alias="color 103"/>
+		<ColorAlias name="gtk_processor_prefader" alias="color 69"/>
+		<ColorAlias name="gtk_processor_prefader_frame" alias="color 69"/>
+		<ColorAlias name="gtk_send_bg" alias="color 27"/>
+		<ColorAlias name="gtk_send_fg" alias="color 14"/>
+		<ColorAlias name="gtk_solo" alias="color 91"/>
+		<ColorAlias name="gtk_somewhat_bright_indicator" alias="color 1"/>
+		<ColorAlias name="gtk_texts" alias="color 50"/>
+		<ColorAlias name="gtk_track_header_inactive" alias="color 34"/>
+		<ColorAlias name="gtk_track_header_selected" alias="color 40"/>
+		<ColorAlias name="image track" alias="color 31"/>
+		<ColorAlias name="inactive crossfade" alias="color 1"/>
+		<ColorAlias name="inactive fade handle" alias="color 33"/>
+		<ColorAlias name="inactive group tab" alias="color 34"/>
+		<ColorAlias name="invert button: fill active" alias="color 1"/>
+		<ColorAlias name="invert button: led active" alias="color 37"/>
+		<ColorAlias name="location cd marker" alias="color 108"/>
+		<ColorAlias name="location loop" alias="color 108"/>
+		<ColorAlias name="location marker" alias="color 108"/>
+		<ColorAlias name="location punch" alias="color 108"/>
+		<ColorAlias name="location range" alias="color 108"/>
+		<ColorAlias name="lock button: fill active" alias="color 42"/>
+		<ColorAlias name="lock button: led active" alias="color 1"/>
+		<ColorAlias name="marker bar" alias="color 2"/>
+		<ColorAlias name="marker bar separator" alias="color 4"/>
+		<ColorAlias name="marker drag line" alias="color 1"/>
+		<ColorAlias name="marker label" alias="color 108"/>
+		<ColorAlias name="marker track" alias="color 31"/>
+		<ColorAlias name="master monitor section button active: fill" alias="color 42"/>
+		<ColorAlias name="master monitor section button active: fill active" alias="color 1"/>
+		<ColorAlias name="master monitor section button normal: fill active" alias="color 42"/>
+		<ColorAlias name="measure line bar" alias="color 105"/>
+		<ColorAlias name="measure line beat" alias="color 105"/>
+		<ColorAlias name="meter background bottom" alias="color 4"/>
+		<ColorAlias name="meter background top" alias="color 4"/>
+		<ColorAlias name="meter bar" alias="color 67"/>
+		<ColorAlias name="meter color BBC" alias="color 1"/>
+		<ColorAlias name="meter marker" alias="color 108"/>
+		<ColorAlias name="meterbridge label: fill" alias="color 42"/>
+		<ColorAlias name="meterbridge label: fill active" alias="color 1"/>
+		<ColorAlias name="meterbridge label: led" alias="color 9"/>
+		<ColorAlias name="meterbridge label: led active" alias="color 1"/>
+		<ColorAlias name="meterbridge peakindicator: fill" alias="color 34"/>
+		<ColorAlias name="meterbridge peakindicator: fill active" alias="color 1"/>
+		<ColorAlias name="meterbridge peakindicator: led" alias="color 9"/>
+		<ColorAlias name="meterbridge peakindicator: led active" alias="color 1"/>
+		<ColorAlias name="meterbridge peaklabel" alias="color 1"/>
+		<ColorAlias name="meterstrip dpm bg" alias="color 4"/>
+		<ColorAlias name="meterstrip dpm fg" alias="color 1"/>
+		<ColorAlias name="meterstrip ppm bg" alias="color 27"/>
+		<ColorAlias name="meterstrip ppm fg" alias="color 1"/>
+		<ColorAlias name="meterstrip vu bg" alias="color 67"/>
+		<ColorAlias name="meterstrip vu fg" alias="color 1"/>
+		<ColorAlias name="midi automation track fill" alias="color 29"/>
+		<ColorAlias name="midi bus base" alias="color 107"/>
+		<ColorAlias name="midi device: fill" alias="color 25"/>
+		<ColorAlias name="midi device: fill active" alias="color 1"/>
+		<ColorAlias name="midi device: led active" alias="color 1"/>
+		<ColorAlias name="midi frame base" alias="color 27"/>
+		<ColorAlias name="midi input button: fill active" alias="color 1"/>
+		<ColorAlias name="midi input button: led active" alias="color 1"/>
+		<ColorAlias name="midi meter color0" alias="meter color0"/>
+		<ColorAlias name="midi meter color1" alias="meter color1"/>
+		<ColorAlias name="midi meter color2" alias="meter color2"/>
+		<ColorAlias name="midi meter color3" alias="meter color3"/>
+		<ColorAlias name="midi meter color4" alias="meter color4"/>
+		<ColorAlias name="midi meter color5" alias="meter color5"/>
+		<ColorAlias name="midi meter color6" alias="meter color6"/>
+		<ColorAlias name="midi meter color7" alias="meter color7"/>
+		<ColorAlias name="midi meter color8" alias="meter color8"/>
+		<ColorAlias name="midi meter color9" alias="meter color9"/>
+		<ColorAlias name="midi note inactive channel" alias="color 4"/>
+		<ColorAlias name="midi note max" alias="color 108"/>
+		<ColorAlias name="midi note mid" alias="color 108"/>
+		<ColorAlias name="midi note min" alias="color 108"/>
+		<ColorAlias name="midi note selected" alias="meter color7"/>
+		<ColorAlias name="midi note selected outline" alias="color 105"/>
+		<ColorAlias name="midi note velocity text" alias="color 2"/>
+		<ColorAlias name="midi patch change fill" alias="color 105"/>
+		<ColorAlias name="midi patch change outline" alias="color 17"/>
+		<ColorAlias name="midi select rect outline" alias="color 105"/>
+		<ColorAlias name="midi sysex fill" alias="color 105"/>
+		<ColorAlias name="midi sysex outline" alias="color 17"/>
+		<ColorAlias name="midi track base" alias="color 27"/>
+		<ColorAlias name="mixer strip button: fill active" alias="color 1"/>
+		<ColorAlias name="mixer strip button: led active" alias="color 1"/>
+		<ColorAlias name="mixer strip name button: fill active" alias="color 67"/>
+		<ColorAlias name="mixer strip name button: led active" alias="color 1"/>
+		<ColorAlias name="monitor button: fill active" alias="color 1"/>
+		<ColorAlias name="monitor button: led active" alias="color 1"/>
+		<ColorAlias name="monitor section dim: fill" alias="color 71"/>
+		<ColorAlias name="monitor section dim: fill active" alias="color 1"/>
+		<ColorAlias name="monitor section dim: led active" alias="color 37"/>
+		<ColorAlias name="monitor section knob" alias="color 60"/>
+		<ColorAlias name="monitor section knob: arc end" alias="color 70"/>
+		<ColorAlias name="monitor section knob: arc start" alias="color 1"/>
+		<ColorAlias name="monitor section mono: fill" alias="color 71"/>
+		<ColorAlias name="monitor section mono: fill active" alias="color 1"/>
+		<ColorAlias name="monitor section mono: led active" alias="color 1"/>
+		<ColorAlias name="monitor section processors present: fill" alias="color 1"/>
+		<ColorAlias name="monitor section processors toggle: fill active" alias="color 42"/>
+		<ColorAlias name="monitor section solo model: fill" alias="color 71"/>
+		<ColorAlias name="monitor section solo model: fill active" alias="color 42"/>
+		<ColorAlias name="monitor section solo model: led active" alias="color 1"/>
+		<ColorAlias name="monitor section solo option: fill" alias="color 71"/>
+		<ColorAlias name="monitor section solo option: fill active" alias="color 42"/>
+		<ColorAlias name="monitor section solo option: led active" alias="color 1"/>
+		<ColorAlias name="mono panner bg" alias="color 67"/>
+		<ColorAlias name="mono panner fill" alias="color 1"/>
+		<ColorAlias name="mono panner outline" alias="color 70"/>
+		<ColorAlias name="mono panner position fill" alias="color 1"/>
+		<ColorAlias name="mono panner position outline" alias="color 70"/>
+		<ColorAlias name="mono panner text" alias="color 4"/>
+		<ColorAlias name="mouse mode button: fill active" alias="color 1"/>
+		<ColorAlias name="mouse mode button: led active" alias="color 1"/>
+		<ColorAlias name="mute button: fill active" alias="color 14"/>
+		<ColorAlias name="mute button: led active" alias="color 4"/>
+		<ColorAlias name="name highlight fill" alias="color 1"/>
+		<ColorAlias name="name highlight outline" alias="color 23"/>
+		<ColorAlias name="nudge button: fill" alias="color 42"/>
+		<ColorAlias name="nudge button: fill active" alias="color 14"/>
+		<ColorAlias name="nudge button: led active" alias="color 8"/>
+		<ColorAlias name="nudge clock: background" alias="color 67"/>
+		<ColorAlias name="nudge clock: cursor" alias="color 8"/>
+		<ColorAlias name="nudge clock: edited text" alias="color 8"/>
+		<ColorAlias name="nudge clock: text" alias="color 1"/>
+		<ColorAlias name="piano roll black" alias="color 4"/>
+		<ColorAlias name="piano roll black outline" alias="color 4"/>
+		<ColorAlias name="piano roll white" alias="meter color7"/>
+		<ColorAlias name="play head" alias="color 108"/>
+		<ColorAlias name="plugin bypass button: led active" alias="color 1"/>
+		<ColorAlias name="pluginlist filter button: fill active" alias="color 14"/>
+		<ColorAlias name="pluginlist hide button: led active" alias="color 14"/>
+		<ColorAlias name="processor automation line" alias="color 1"/>
+		<ColorAlias name="processor control button: fill" alias="color 1"/>
+		<ColorAlias name="processor control button: fill active" alias="color 46"/>
+		<ColorAlias name="processor control button: led active" alias="color 1"/>
+		<ColorAlias name="processor fader: fill" alias="color 1"/>
+		<ColorAlias name="processor fader: fill active" alias="color 78"/>
+		<ColorAlias name="processor fader: led active" alias="color 1"/>
+		<ColorAlias name="processor postfader: fill" alias="color 78"/>
+		<ColorAlias name="processor postfader: fill active" alias="color 79"/>
+		<ColorAlias name="processor postfader: led active" alias="color 1"/>
+		<ColorAlias name="processor prefader: fill" alias="color 48"/>
+		<ColorAlias name="processor prefader: fill active" alias="color 80"/>
+		<ColorAlias name="processor prefader: led active" alias="color 1"/>
+		<ColorAlias name="processor stub: fill" alias="color 1"/>
+		<ColorAlias name="processor stub: fill active" alias="color 46"/>
+		<ColorAlias name="punch button: fill" alias="color 25"/>
+		<ColorAlias name="punch button: fill active" alias="color 1"/>
+		<ColorAlias name="punch button: led active" alias="color 4"/>
+		<ColorAlias name="punch clock: background" alias="color 67"/>
+		<ColorAlias name="punch clock: cursor" alias="color 9"/>
+		<ColorAlias name="punch clock: edited text" alias="color 1"/>
+		<ColorAlias name="punch clock: text" alias="color 1"/>
+		<ColorAlias name="punch line" alias="color 1"/>
+		<ColorAlias name="range drag bar rect" alias="color 21"/>
+		<ColorAlias name="range drag rect" alias="color 1"/>
+		<ColorAlias name="range marker bar" alias="color 29"/>
+		<ColorAlias name="record enable button: fill active" alias="color 1"/>
+		<ColorAlias name="record enable button: led active" alias="color 42"/>
+		<ColorAlias name="recording rect" alias="meter color6"/>
+		<ColorAlias name="recording waveform fill" alias="meter color2"/>
+		<ColorAlias name="recording waveform outline" alias="color 1"/>
+		<ColorAlias name="region list automatic" alias="color 53"/>
+		<ColorAlias name="region list missing source" alias="color 9"/>
+		<ColorAlias name="region list whole file" alias="color 1"/>
+		<ColorAlias name="route button: fill active" alias="color 1"/>
+		<ColorAlias name="route button: led active" alias="color 1"/>
+		<ColorAlias name="rubber band rect" alias="color 88"/>
+		<ColorAlias name="rude audition: fill" alias="color 25"/>
+		<ColorAlias name="rude audition: fill active" alias="color 1"/>
+		<ColorAlias name="rude audition: led active" alias="color 1"/>
+		<ColorAlias name="rude isolate: fill" alias="color 42"/>
+		<ColorAlias name="rude isolate: fill active" alias="color 1"/>
+		<ColorAlias name="rude isolate: led active" alias="color 1"/>
+		<ColorAlias name="rude solo: fill" alias="color 25"/>
+		<ColorAlias name="rude solo: fill active" alias="color 1"/>
+		<ColorAlias name="rude solo: led active" alias="color 1"/>
+		<ColorAlias name="ruler base" alias="color 67"/>
+		<ColorAlias name="ruler text" alias="color 108"/>
+		<ColorAlias name="secondary clock: background" alias="color 67"/>
+		<ColorAlias name="secondary clock: cursor" alias="color 8"/>
+		<ColorAlias name="secondary clock: edited text" alias="color 8"/>
+		<ColorAlias name="secondary clock: text" alias="color 1"/>
+		<ColorAlias name="secondary delta clock: background" alias="color 67"/>
+		<ColorAlias name="secondary delta clock: cursor" alias="color 9"/>
+		<ColorAlias name="secondary delta clock: edited text" alias="color 9"/>
+		<ColorAlias name="secondary delta clock: text" alias="color 92"/>
+		<ColorAlias name="selected midi note frame" alias="color 1"/>
+		<ColorAlias name="selected region base" alias="color 1"/>
+		<ColorAlias name="selected time axis frame" alias="color 1"/>
+		<ColorAlias name="selected waveform fill" alias="color 1"/>
+		<ColorAlias name="selected waveform outline" alias="color 1"/>
+		<ColorAlias name="selection" alias="color 1"/>
+		<ColorAlias name="selection clock: background" alias="color 67"/>
+		<ColorAlias name="selection clock: cursor" alias="color 9"/>
+		<ColorAlias name="selection clock: edited text" alias="color 1"/>
+		<ColorAlias name="selection clock: text" alias="color 1"/>
+		<ColorAlias name="selection rect" alias="color 1"/>
+		<ColorAlias name="send alert button: fill" alias="color 71"/>
+		<ColorAlias name="send alert button: fill active" alias="color 38"/>
+		<ColorAlias name="send alert button: led active" alias="color 4"/>
+		<ColorAlias name="send bg" alias="color 14"/>
+		<ColorAlias name="shuttle" alias="color 12"/>
+		<ColorAlias name="shuttle bg" alias="color 4"/>
+		<ColorAlias name="shuttle text" alias="color 13"/>
+		<ColorAlias name="silence" alias="color 98"/>
+		<ColorAlias name="silence text" alias="color 10"/>
+		<ColorAlias name="solo button: fill active" alias="color 1"/>
+		<ColorAlias name="solo button: led active" alias="color 4"/>
+		<ColorAlias name="solo isolate: fill" alias="color 25"/>
+		<ColorAlias name="solo isolate: fill active" alias="color 42"/>
+		<ColorAlias name="solo isolate: led active" alias="color 1"/>
+		<ColorAlias name="solo safe: fill" alias="color 25"/>
+		<ColorAlias name="solo safe: fill active" alias="color 42"/>
+		<ColorAlias name="solo safe: led active" alias="color 1"/>
+		<ColorAlias name="stereo panner bg" alias="color 67"/>
+		<ColorAlias name="stereo panner fill" alias="color 1"/>
+		<ColorAlias name="stereo panner inverted bg" alias="color 61"/>
+		<ColorAlias name="stereo panner inverted fill" alias="color 48"/>
+		<ColorAlias name="stereo panner inverted outline" alias="meter color1"/>
+		<ColorAlias name="stereo panner inverted text" alias="color 4"/>
+		<ColorAlias name="stereo panner mono bg" alias="color 67"/>
+		<ColorAlias name="stereo panner mono fill" alias="color 1"/>
+		<ColorAlias name="stereo panner mono outline" alias="meter color1"/>
+		<ColorAlias name="stereo panner mono text" alias="color 4"/>
+		<ColorAlias name="stereo panner outline" alias="color 14"/>
+		<ColorAlias name="stereo panner rule" alias="color 70"/>
+		<ColorAlias name="stereo panner text" alias="color 4"/>
+		<ColorAlias name="sync mark" alias="color 1"/>
+		<ColorAlias name="tempo bar" alias="color 27"/>
+		<ColorAlias name="tempo curve" alias="color 62"/>
+		<ColorAlias name="tempo marker" alias="color 108"/>
+		<ColorAlias name="tempo marker music" alias="color 5"/>
+		<ColorAlias name="time axis frame" alias="color 4"/>
+		<ColorAlias name="time axis view item base" alias="color 94"/>
+		<ColorAlias name="time stretch fill" alias="color 100"/>
+		<ColorAlias name="time stretch outline" alias="color 94"/>
+		<ColorAlias name="tracknumber label: fill" alias="color 34"/>
+		<ColorAlias name="tracknumber label: fill active" alias="color 46"/>
+		<ColorAlias name="tracknumber label: led active" alias="color 9"/>
+		<ColorAlias name="transport active option button: fill active" alias="color 48"/>
+		<ColorAlias name="transport active option button: led active" alias="color 1"/>
+		<ColorAlias name="transport button: fill active" alias="color 1"/>
+		<ColorAlias name="transport button: led active" alias="color 4"/>
+		<ColorAlias name="transport clock: background" alias="color 67"/>
+		<ColorAlias name="transport clock: cursor" alias="color 8"/>
+		<ColorAlias name="transport clock: edited text" alias="color 8"/>
+		<ColorAlias name="transport clock: text" alias="color 1"/>
+		<ColorAlias name="transport delta clock: background" alias="color 67"/>
+		<ColorAlias name="transport delta clock: cursor" alias="color 9"/>
+		<ColorAlias name="transport delta clock: edited text" alias="color 9"/>
+		<ColorAlias name="transport delta clock: text" alias="color 92"/>
+		<ColorAlias name="transport drag rect" alias="color 21"/>
+		<ColorAlias name="transport loop rect" alias="color 1"/>
+		<ColorAlias name="transport marker bar" alias="color 25"/>
+		<ColorAlias name="transport option button: fill active" alias="color 42"/>
+		<ColorAlias name="transport option button: led active" alias="color 1"/>
+		<ColorAlias name="transport punch rect" alias="color 1"/>
+		<ColorAlias name="transport recenable button: fill" alias="color 94"/>
+		<ColorAlias name="transport recenable button: fill active" alias="meter color1"/>
+		<ColorAlias name="transport recenable button: led active" alias="color 4"/>
+		<ColorAlias name="trim handle" alias="color 1"/>
+		<ColorAlias name="trim handle locked" alias="color 86"/>
+		<ColorAlias name="trim knob" alias="color 60"/>
+		<ColorAlias name="trim knob: arc end" alias="color 81"/>
+		<ColorAlias name="trim knob: arc start" alias="color 1"/>
+		<ColorAlias name="verbose canvas cursor" alias="color 1"/>
+		<ColorAlias name="video timeline bar" alias="color 46"/>
+		<ColorAlias name="waveform fill" alias="color 106"/>
+		<ColorAlias name="waveform outline" alias="color 4"/>
+		<ColorAlias name="zero line" alias="color 106"/>
+		<ColorAlias name="zoom button: fill active" alias="color 48"/>
+		<ColorAlias name="zoom button: led active" alias="color 1"/>
+	</ColorAliases>
+	<Modifiers>
+		<Modifier name="audio bus base" modifier="= alpha:0.3"/>
+		<Modifier name="audio track base" modifier="= alpha:0.4"/>
+		<Modifier name="automation track fill" modifier="= alpha:0.3"/>
+		<Modifier name="covered region base" modifier="= alpha:0.7"/>
+		<Modifier name="crossfade alpha" modifier="= alpha:0.1803"/>
+		<Modifier name="dragging region" modifier="= alpha:0.9"/>
+		<Modifier name="editable region" modifier="= alpha:0.9"/>
+		<Modifier name="gain line inactive" modifier="= alpha:0.782113"/>
+		<Modifier name="ghost track base" modifier="= alpha:0.640782"/>
+		<Modifier name="ghost track midi fill" modifier="= alpha:0.3"/>
+		<Modifier name="inactive crossfade" modifier="= alpha:0.4666"/>
+		<Modifier name="loop rectangle" modifier="= alpha:0.3"/>
+		<Modifier name="marker bar" modifier="= alpha:0.5"/>
+		<Modifier name="measure line beat" modifier="= alpha:1"/>
+		<Modifier name="midi frame base" modifier="= alpha:0.4"/>
+		<Modifier name="midi note" modifier="= alpha:1"/>
+		<Modifier name="midi note velocity text" modifier="= alpha:0.4666"/>
+		<Modifier name="midi patch change fill" modifier="= alpha:0.6274"/>
+		<Modifier name="midi sysex fill" modifier="= alpha:0.4666"/>
+		<Modifier name="midi track base" modifier="= alpha:0.3"/>
+		<Modifier name="mono panner position fill" modifier="= alpha:0.8"/>
+		<Modifier name="opaque region base" modifier="= alpha:0.75"/>
+		<Modifier name="panner fill" modifier="= alpha:0.7882"/>
+		<Modifier name="piano roll black" modifier="= alpha:0.2"/>
+		<Modifier name="piano roll white" modifier="= alpha:0.52366"/>
+		<Modifier name="recording rect" modifier="= alpha:0.25"/>
+		<Modifier name="selected midi note" modifier="= alpha:0.7529"/>
+		<Modifier name="selection rect" modifier="= alpha:0.282575"/>
+		<Modifier name="silence" modifier="= alpha:0.4784"/>
+		<Modifier name="stereo panner inverted" modifier="= alpha:0.7882"/>
+		<Modifier name="stereo panner inverted bg" modifier="= alpha:0.7529"/>
+		<Modifier name="time axis view item base" modifier="= alpha:0.7"/>
+		<Modifier name="time stretch fill" modifier="= alpha:0.5"/>
+		<Modifier name="transparent region base" modifier="= alpha:0.6"/>
+		<Modifier name="verbose canvas cursor" modifier="= alpha:0.30"/>
+	</Modifiers>
+</Ardour>
diff --git a/gtk2_ardour/time_axis_view.cc b/gtk2_ardour/time_axis_view.cc
index 27db10c..540dddc 100644
--- a/gtk2_ardour/time_axis_view.cc
+++ b/gtk2_ardour/time_axis_view.cc
@@ -42,6 +42,7 @@
 #include "ardour/profile.h"
 
 #include "ardour_dialog.h"
+#include "floating_text_entry.h"
 #include "gui_thread.h"
 #include "public_editor.h"
 #include "time_axis_view.h"
@@ -57,7 +58,7 @@
 #include "tooltips.h"
 #include "ui_config.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace Gtk;
@@ -87,8 +88,7 @@ TimeAxisView::setup_sizes()
 }
 
 TimeAxisView::TimeAxisView (ARDOUR::Session* sess, PublicEditor& ed, TimeAxisView* rent, Canvas& /*canvas*/)
-	: AxisView (sess)
-	, controls_table (3, 3)
+	: controls_table (5, 4)
 	, controls_button_size_group (Gtk::SizeGroup::create (Gtk::SIZE_GROUP_BOTH))
 	, _name_editing (false)
 	, height (0)
@@ -96,15 +96,12 @@ TimeAxisView::TimeAxisView (ARDOUR::Session* sess, PublicEditor& ed, TimeAxisVie
 	, parent (rent)
 	, selection_group (0)
 	, _ghost_group (0)
-	, _hidden (false)
+	, _hidden (true)
 	, in_destructor (false)
 	, _size_menu (0)
 	, _canvas_display (0)
 	, _y_position (0)
 	, _editor (ed)
-	, name_entry (0)
-	, ending_name_edit (false)
-	, by_popup_menu (false)
 	, control_parent (0)
 	, _order (0)
 	, _effective_height (0)
@@ -145,25 +142,24 @@ TimeAxisView::TimeAxisView (ARDOUR::Session* sess, PublicEditor& ed, TimeAxisVie
 	_ghost_group->lower_to_bottom();
 	_ghost_group->show();
 
-	name_label.set_name ("TrackLabel");
+	name_label.set_name (X_("TrackNameEditor"));
 	name_label.set_alignment (0.0, 0.5);
 	name_label.set_width_chars (12);
 	set_tooltip (name_label, _("Track/Bus name (double click to edit)"));
 
-	Gtk::Entry* an_entry = new Gtkmm2ext::FocusEntry;
-	an_entry->set_name ("EditorTrackNameDisplay");
-	Gtk::Requisition req;
-	an_entry->size_request (req);
-	name_label.set_size_request (-1, req.height);
-	name_label.set_ellipsize (Pango::ELLIPSIZE_MIDDLE);
-	delete an_entry;
+	{
+		std::auto_ptr<Gtk::Entry> an_entry (new Gtkmm2ext::FocusEntry);
+		an_entry->set_name (X_("TrackNameEditor"));
+		Gtk::Requisition req;
+		an_entry->size_request (req);
 
-	name_hbox.pack_end (name_label, true, true);
+		name_label.set_size_request (-1, req.height);
+		name_label.set_ellipsize (Pango::ELLIPSIZE_MIDDLE);
+	}
 
 	// set min. track-header width if fader is not visible
-	name_hbox.set_size_request(name_width_px, -1);
+	name_label.set_size_request(name_width_px, -1);
 
-	name_hbox.show ();
 	name_label.show ();
 
 	controls_table.set_row_spacings (2);
@@ -171,10 +167,11 @@ TimeAxisView::TimeAxisView (ARDOUR::Session* sess, PublicEditor& ed, TimeAxisVie
 	controls_table.set_border_width (2);
 
 	if (ARDOUR::Profile->get_mixbus() ) {
-		controls_table.attach (name_hbox, 4, 5, 0, 2,  Gtk::FILL|Gtk::EXPAND, Gtk::SHRINK, 0, 0);
+		controls_table.attach (name_label, 4, 5, 0, 1,  Gtk::FILL|Gtk::EXPAND, Gtk::SHRINK, 0, 0);
 	} else {
-		controls_table.attach (name_hbox, 1, 2, 0, 2,  Gtk::FILL|Gtk::EXPAND, Gtk::SHRINK, 0, 0);
+		controls_table.attach (name_label, 1, 2, 0, 1,  Gtk::FILL|Gtk::EXPAND, Gtk::SHRINK, 0, 0);
 	}
+
 	controls_table.show_all ();
 	controls_table.set_no_show_all ();
 
@@ -296,6 +293,7 @@ TimeAxisView::hide ()
 * @param y y position.
 * @param nth index for this TimeAxisView, increased if this view has children.
 * @param parent parent component.
+*
 * @return height of this TimeAxisView.
 */
 guint32
@@ -510,7 +508,9 @@ TimeAxisView::controls_ebox_button_release (GdkEventButton* ev)
 
 	switch (ev->button) {
 	case 1:
-		selection_click (ev);
+		if (selectable()) {
+			selection_click (ev);
+		}
 		break;
 
 	case 3:
@@ -608,148 +608,42 @@ TimeAxisView::set_height (uint32_t h, TrackHeightMode m)
 	_editor.override_visible_track_count ();
 }
 
-bool
-TimeAxisView::name_entry_key_press (GdkEventKey* ev)
-{
-	/* steal escape, tabs from GTK */
-
-	switch (ev->keyval) {
-	case GDK_Escape:
-	case GDK_ISO_Left_Tab:
-	case GDK_Tab:
-		return true;
-	}
-	return false;
-}
-
-bool
-TimeAxisView::name_entry_key_release (GdkEventKey* ev)
-{
-	TrackViewList::iterator i;
-
-	switch (ev->keyval) {
-	case GDK_Escape:
-		end_name_edit (RESPONSE_CANCEL);
-		return true;
-
-	/* Shift+Tab Keys Pressed. Note that for Shift+Tab, GDK actually
-	 * generates a different ev->keyval, rather than setting
-	 * ev->state.
-	 */
-	case GDK_ISO_Left_Tab:
-		end_name_edit (RESPONSE_APPLY);
-		return true;
-
-	case GDK_Tab:
-		end_name_edit (RESPONSE_ACCEPT);
-		return true;
-	default:
-		break;
-	}
-
-	return false;
-}
-
-bool
-TimeAxisView::name_entry_focus_out (GdkEventFocus*)
-{
-	if (by_popup_menu) {
-		by_popup_menu = false;
-		return false;
-	}
-	end_name_edit (RESPONSE_OK);
-	return false;
-}
-
-void
-TimeAxisView::name_entry_populate_popup (Gtk::Menu *)
-{
-	by_popup_menu = true;
-}
-
 void
 TimeAxisView::begin_name_edit ()
 {
-	if (name_entry) {
+	if (!can_edit_name()) {
 		return;
 	}
 
-	if (can_edit_name()) {
-
-		name_entry = manage (new Gtkmm2ext::FocusEntry);
+	Gtk::Window* toplevel = (Gtk::Window*) control_parent->get_toplevel();
+	FloatingTextEntry* fte = new FloatingTextEntry (toplevel, name_label.get_text ());
 
-		name_entry->set_width_chars(8); // min width, entry expands
+	fte->set_name ("TrackNameEditor");
+	fte->use_text.connect (sigc::mem_fun (*this, &TimeAxisView::end_name_edit));
 
-		name_entry->set_name ("EditorTrackNameDisplay");
-		name_entry->signal_key_press_event().connect (sigc::mem_fun (*this, &TimeAxisView::name_entry_key_press), false);
-		name_entry->signal_key_release_event().connect (sigc::mem_fun (*this, &TimeAxisView::name_entry_key_release), false);
-		name_entry->signal_focus_out_event().connect (sigc::mem_fun (*this, &TimeAxisView::name_entry_focus_out));
-		name_entry->set_text (name_label.get_text());
-		name_entry->signal_activate().connect (sigc::bind (sigc::mem_fun (*this, &TimeAxisView::end_name_edit), RESPONSE_OK));
-		name_entry->signal_populate_popup().connect (sigc::mem_fun (*this, &TimeAxisView::name_entry_populate_popup));
+	/* We want to new toplevel window to overlay the name label, so
+	 * translate the coordinates of the upper left corner of the name label
+	 * into the coordinate space of the top level window.
+	 */
 
-		if (name_label.is_ancestor (name_hbox)) {
-			name_hbox.remove (name_label);
-		}
+	int x, y;
+        int wx, wy;
 
-		name_hbox.pack_end (*name_entry, true, true);
-		name_entry->show ();
+        name_label.translate_coordinates (*toplevel, 0, 0, x, y);
+        toplevel->get_window()->get_origin (wx, wy);
 
-		name_entry->select_region (0, -1);
-		name_entry->set_state (STATE_SELECTED);
-		name_entry->grab_focus ();
-		name_entry->start_editing (0);
-	}
+        fte->move (wx + x, wy + y);
+	fte->present ();
 }
 
 void
-TimeAxisView::end_name_edit (int response)
+TimeAxisView::end_name_edit (std::string str, int next_dir)
 {
-	if (!name_entry) {
-		return;
+	if (!name_entry_changed (str)) {
+		next_dir = 0;
 	}
 
-	if (ending_name_edit) {
-		/* already doing this, and focus out or other event has caused
-		   us to re-enter this code.
-		*/
-		return;
-	}
-
-	PBD::Unwinder<bool> uw (ending_name_edit, true);
-
-	bool edit_next = false;
-	bool edit_prev = false;
-
-	switch (response) {
-	case RESPONSE_CANCEL:
-		break;
-	case RESPONSE_OK:
-		name_entry_changed ();
-		break;
-	case RESPONSE_ACCEPT:
-		name_entry_changed ();
-		edit_next = true;
-	case RESPONSE_APPLY:
-		name_entry_changed ();
-		edit_prev = true;
-	}
-
-	/* this will delete the name_entry. but it will also drop focus, which
-	 * will cause another callback to this function, so set name_entry = 0
-	 * first to ensure we don't double-remove etc. etc.
-	 */
-
-	Gtk::Entry* tmp = name_entry;
-	name_entry = 0;
-	name_hbox.remove (*tmp);
-
-	/* put the name label back */
-
-	name_hbox.pack_end (name_label);
-	name_label.show ();
-
-	if (edit_next) {
+	if (next_dir > 0) {
 
 		TrackViewList const & allviews = _editor.get_track_views ();
 		TrackViewList::const_iterator i = find (allviews.begin(), allviews.end(), this);
@@ -763,7 +657,7 @@ TimeAxisView::end_name_edit (int response)
 
 				RouteTimeAxisView* rtav = dynamic_cast<RouteTimeAxisView*>(*i);
 
-				if (rtav && rtav->route()->record_enabled()) {
+				if (rtav && (!rtav->is_track() || rtav->track()->rec_enable_control()->get_value())) {
 					continue;
 				}
 
@@ -779,7 +673,7 @@ TimeAxisView::end_name_edit (int response)
 			(*i)->begin_name_edit ();
 		}
 
-	} else if (edit_prev) {
+	} else if (next_dir < 0) {
 
 		TrackViewList const & allviews = _editor.get_track_views ();
 		TrackViewList::const_iterator i = find (allviews.begin(), allviews.end(), this);
@@ -794,7 +688,7 @@ TimeAxisView::end_name_edit (int response)
 
 				RouteTimeAxisView* rtav = dynamic_cast<RouteTimeAxisView*>(*i);
 
-				if (rtav && rtav->route()->record_enabled()) {
+				if (rtav && (!rtav->is_track() || rtav->track()->rec_enable_control()->get_value())) {
 					continue;
 				}
 
@@ -812,9 +706,10 @@ TimeAxisView::end_name_edit (int response)
 	}
 }
 
-void
-TimeAxisView::name_entry_changed ()
+bool
+TimeAxisView::name_entry_changed (string const&)
 {
+	return true;
 }
 
 bool
@@ -826,6 +721,10 @@ TimeAxisView::can_edit_name () const
 void
 TimeAxisView::conditionally_add_to_selection ()
 {
+	if (!selectable()) {
+		return;
+	}
+
 	Selection& s (_editor.get_selection ());
 
 	if (!s.selected (this)) {
@@ -845,11 +744,7 @@ TimeAxisView::popup_display_menu (guint32 when)
 void
 TimeAxisView::set_selected (bool yn)
 {
-	if (can_edit_name() && name_entry && name_entry->get_visible()) {
-		end_name_edit (RESPONSE_CANCEL);
-	}
-
-	if (yn == _selected) {
+	if (yn == selected()) {
 		return;
 	}
 
@@ -1034,6 +929,8 @@ TimeAxisView::order_selection_trims (ArdourCanvas::Item *item, bool put_start_on
 	}
 }
 
+// retuned rect is pushed back into the used_selection_rects list
+// in TimeAxisView::show_selection() which is the only caller.
 SelectionRect *
 TimeAxisView::get_selection_rect (uint32_t id)
 {
@@ -1043,7 +940,9 @@ TimeAxisView::get_selection_rect (uint32_t id)
 
 	for (list<SelectionRect*>::iterator i = used_selection_rects.begin(); i != used_selection_rects.end(); ++i) {
 		if ((*i)->id == id) {
-			return (*i);
+			SelectionRect* ret = (*i);
+			used_selection_rects.erase (i);
+			return ret;
 		}
 	}
 
diff --git a/gtk2_ardour/time_axis_view.h b/gtk2_ardour/time_axis_view.h
index 4be2380..f33379e 100644
--- a/gtk2_ardour/time_axis_view.h
+++ b/gtk2_ardour/time_axis_view.h
@@ -39,7 +39,9 @@
 #include "pbd/signals.h"
 
 #include "ardour/types.h"
+#include "ardour/presentation_info.h"
 #include "ardour/region.h"
+
 #include "evoral/Parameter.hpp"
 
 #include "canvas/line.h"
@@ -55,6 +57,7 @@ namespace ARDOUR {
 	class Session;
 	class RouteGroup;
 	class Playlist;
+	class Stripable;
 }
 
 namespace Gtk {
@@ -135,6 +138,8 @@ class TimeAxisView : public virtual AxisView
 
 	void set_selected (bool);
 
+	virtual bool selectable() const { return true; }
+
 	/**
 	 * potential handler for entered events
 	 */
@@ -180,7 +185,8 @@ class TimeAxisView : public virtual AxisView
 	 */
 	virtual bool paste (ARDOUR::framepos_t pos,
 	                    const Selection&   selection,
-	                    PasteContext&      ctx) { return false; }
+	                    PasteContext&      ctx,
+			    const int32_t sub_num) { return false; }
 
 	virtual void set_selected_regionviews (RegionSelection&) {}
 	virtual void set_selected_points (PointSelection&) {}
@@ -213,8 +219,6 @@ class TimeAxisView : public virtual AxisView
 	typedef std::vector<boost::shared_ptr<TimeAxisView> > Children;
 	Children get_child_list ();
 
-	SelectionRect* get_selection_rect(uint32_t id);
-
 	static uint32_t preset_height (Height);
 
 	protected:
@@ -229,9 +233,7 @@ class TimeAxisView : public virtual AxisView
 	Gtk::VBox              time_axis_vbox;
 	Gtk::HBox              time_axis_hbox;
 	Gtk::Frame             time_axis_frame;
-	Gtk::HBox              name_hbox;
 	Gtk::HBox              top_hbox;
-	Gtk::Label             name_label;
 	Gtk::Fixed             scroomer_placeholder;
 	bool                  _name_editing;
 	uint32_t               height;  /* in canvas units */
@@ -254,20 +256,12 @@ class TimeAxisView : public virtual AxisView
 
 	virtual bool can_edit_name() const;
 
-	bool name_entry_key_release (GdkEventKey *ev);
-	bool name_entry_key_press (GdkEventKey *ev);
-	bool name_entry_focus_out (GdkEventFocus *ev);
-	void name_entry_populate_popup (Gtk::Menu *);
-
-	Gtk::Entry* name_entry;
-	bool ending_name_edit;
-	bool by_popup_menu;
 	void begin_name_edit ();
-	void end_name_edit (int);
+	void end_name_edit (std::string, int);
 
 	/* derived classes can override these */
 
-	virtual void name_entry_changed ();
+	virtual bool name_entry_changed (std::string const&);
 
 	/** Handle mouse relaese on our LHS control name ebox.
 	 *
@@ -310,7 +304,7 @@ class TimeAxisView : public virtual AxisView
 
 	void build_size_menu ();
 
-private:
+  private:
 	Gtk::VBox*            control_parent;
 	int                  _order;
 	uint32_t             _effective_height;
@@ -324,6 +318,8 @@ private:
 	static uint32_t extra_height;
 	static int const _max_order;
 
+	SelectionRect* get_selection_rect(uint32_t id);
+
 	void compute_heights ();
 	bool maybe_set_cursor (int y);
 
diff --git a/gtk2_ardour/time_axis_view_item.cc b/gtk2_ardour/time_axis_view_item.cc
index 008dfab..61ac728 100644
--- a/gtk2_ardour/time_axis_view_item.cc
+++ b/gtk2_ardour/time_axis_view_item.cc
@@ -43,7 +43,7 @@
 #include "utils.h"
 #include "rgb_macros.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace Editing;
@@ -160,7 +160,6 @@ TimeAxisViewItem::init (ArdourCanvas::Item* parent, double fpp, uint32_t base_co
 {
 	group = new ArdourCanvas::Container (parent);
 	CANVAS_DEBUG_NAME (group, string_compose ("TAVI group for %1", get_item_name()));
-	group->Event.connect (sigc::mem_fun (*this, &TimeAxisViewItem::canvas_group_event));
 
 	fill_color = base_color;
 	fill_color_name = "time axis view item base";
@@ -247,13 +246,14 @@ TimeAxisViewItem::init (ArdourCanvas::Item* parent, double fpp, uint32_t base_co
 		frame_handle_start = frame_handle_end = 0;
 	}
 
-	set_color (base_color);
+	//set_color (base_color);
 
-	set_duration (item_duration, this);
-	set_position (start, this);
+	//set_duration (item_duration, this);
+	//set_position (start, this);
 
-	Config->ParameterChanged.connect (*this, invalidator (*this), boost::bind (&TimeAxisViewItem::parameter_changed, this, _1), gui_context ());
-	UIConfiguration::instance().ParameterChanged.connect (sigc::mem_fun (*this, &TimeAxisViewItem::parameter_changed));
+	group->Event.connect (sigc::mem_fun (*this, &TimeAxisViewItem::canvas_group_event));
+	//Config->ParameterChanged.connect (*this, invalidator (*this), boost::bind (&TimeAxisViewItem::parameter_changed, this, _1), gui_context ());
+	//UIConfiguration::instance().ParameterChanged.connect (sigc::mem_fun (*this, &TimeAxisViewItem::parameter_changed));
 }
 
 TimeAxisViewItem::~TimeAxisViewItem()
@@ -532,7 +532,7 @@ TimeAxisViewItem::set_name_text(const string& new_name)
 	name_text_width = pixel_width (new_name, NAME_FONT) + 2;
 	name_text->set (new_name);
 	manage_name_text ();
-
+	manage_name_highlight ();
 }
 
 /**
@@ -569,8 +569,6 @@ TimeAxisViewItem::set_height (double height)
 			selection_frame->set (frame->get().shrink (1.0));
 		}
 	}
-
-	set_colors ();
 }
 
 void
diff --git a/gtk2_ardour/time_axis_view_item.h b/gtk2_ardour/time_axis_view_item.h
index 63cc564..749df46 100644
--- a/gtk2_ardour/time_axis_view_item.h
+++ b/gtk2_ardour/time_axis_view_item.h
@@ -235,9 +235,9 @@ class TimeAxisViewItem : public Selectable, public PBD::ScopedConnectionList
 	bool _recregion;
 	bool _automation; ///< true if this is an automation region view
 	bool _dragging;
+        double _width;
 
 private:
-        double _width;
 
 	void parameter_changed (std::string);
         void manage_name_highlight ();
diff --git a/gtk2_ardour/time_fx_dialog.cc b/gtk2_ardour/time_fx_dialog.cc
index 7efabc9..be2140d 100644
--- a/gtk2_ardour/time_fx_dialog.cc
+++ b/gtk2_ardour/time_fx_dialog.cc
@@ -17,7 +17,6 @@
 
 */
 
-#include "time_fx_dialog.h"
 
 #include <iostream>
 #include <cstdlib>
@@ -28,20 +27,25 @@
 #include "pbd/error.h"
 #include "pbd/pthread_utils.h"
 #include "pbd/memento_command.h"
+#include "pbd/unwind.h"
+#include "pbd/stacktrace.h"
 
 #include <gtkmm2ext/utils.h>
 
+#include "audio_clock.h"
 #include "editor.h"
 #include "audio_time_axis.h"
 #include "audio_region_view.h"
 #include "region_selection.h"
+#include "time_fx_dialog.h"
+#include "timers.h"
 
 #ifdef USE_RUBBERBAND
 #include <rubberband/RubberBandStretcher.h>
 using namespace RubberBand;
 #endif
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
@@ -49,21 +53,27 @@ using namespace PBD;
 using namespace Gtk;
 using namespace Gtkmm2ext;
 
-TimeFXDialog::TimeFXDialog (Editor& e, bool pitch)
+TimeFXDialog::TimeFXDialog (Editor& e, bool pitch, framecnt_t oldlen, framecnt_t new_length, framepos_t position)
 	: ArdourDialog (X_("time fx dialog"))
 	, editor (e)
 	, pitching (pitch)
+	, quick_button (_("Quick but Ugly"))
+	, antialias_button (_("Skip Anti-aliasing"))
+	, stretch_opts_label (_("Contents"))
+	, precise_button (_("Minimize time distortion"))
+	, preserve_formants_button(_("Preserve Formants"))
+	, original_length (oldlen)
 	, pitch_octave_adjustment (0.0, -4.0, 4.0, 1, 2.0)
 	, pitch_semitone_adjustment (0.0, -12.0, 12.0, 1.0, 4.0)
 	, pitch_cent_adjustment (0.0, -499.0, 500.0, 5.0, 15.0)
 	, pitch_octave_spinner (pitch_octave_adjustment)
 	, pitch_semitone_spinner (pitch_semitone_adjustment)
 	, pitch_cent_spinner (pitch_cent_adjustment)
-	, quick_button (_("Quick but Ugly"))
-	, antialias_button (_("Skip Anti-aliasing"))
-	, stretch_opts_label (_("Contents:"))
-	, precise_button (_("Minimize time distortion"))
-	, preserve_formants_button(_("Preserve Formants"))
+	, duration_adjustment (100.0, -1000.0, 1000.0, 1.0, 10.0)
+	, duration_clock (0)
+	, ignore_adjustment_change (false)
+	, ignore_clock_change (false)
+	, progress (0.0f)
 {
 	set_modal (true);
 	set_skip_taskbar_hint (true);
@@ -123,31 +133,60 @@ TimeFXDialog::TimeFXDialog (Editor& e, bool pitch)
 
 		upper_button_box.pack_start (*table, false, true);
 	} else {
-		Table* table = manage (new Table (2, 3, false));
+		Table* table = manage (new Table (4, 2, false));
+		int row = 0;
+
 		table->set_row_spacings	(6);
-		table->set_col_spacing	(1, 6);
-		l = manage (new Label ("", Gtk::ALIGN_LEFT, Gtk::ALIGN_CENTER, false ));
-		l->set_padding (8, 0);
-		table->attach (*l, 0, 1, 0, 2, Gtk::FILL, Gtk::FILL, 0, 0);
+		table->set_col_spacings	(12);
 
 #ifdef USE_RUBBERBAND
 		vector<string> strings;
+		duration_clock = manage (new AudioClock (X_("stretch"), true, X_("stretch"), true, false, true, false, true));
+		duration_clock->set_session (e.session());
+		duration_clock->set (new_length, true);
+		duration_clock->set_mode (AudioClock::BBT);
+		duration_clock->set_bbt_reference (position);
+
+		Gtk::Alignment* clock_align = manage (new Gtk::Alignment);
+		clock_align->add (*duration_clock);
+		clock_align->set (0.0, 0.5, 0.0, 1.0);
+
+		l = manage (new Gtk::Label (_("Duration")));
+		table->attach (*l, 0, 1, row, row+1, Gtk::FILL, Gtk::FILL, 0, 0);
+		table->attach (*clock_align, 1, 2, row, row+1, Gtk::AttachOptions (Gtk::EXPAND|Gtk::FILL), Gtk::FILL, 0, 0);
+		row++;
 
-		table->attach (stretch_opts_label, 1, 2, 0, 1, Gtk::FILL, Gtk::EXPAND, 0, 0);
+		const double fract = ((double) new_length) / original_length;
+		/* note the *100.0 to convert fract into a percentage */
+		duration_adjustment.set_value (fract*100.0);
+		Gtk::SpinButton* spinner = manage (new Gtk::SpinButton (duration_adjustment, 1.0, 3));
+
+		l = manage (new Gtk::Label (_("Percent")));
+		table->attach (*l, 0, 1, row, row+1, Gtk::FILL, Gtk::FILL, 0, 0);
+		table->attach (*spinner, 1, 2, row, row+1, Gtk::FILL, Gtk::FILL, 0, 0);
+		row++;
+
+		table->attach (stretch_opts_label, 0, 1, row, row+1, Gtk::FILL, Gtk::EXPAND, 0, 0);
 
 		set_popdown_strings (stretch_opts_selector, editor.rb_opt_strings);
 		/* set default */
 		stretch_opts_selector.set_active_text (editor.rb_opt_strings[editor.rb_current_opt]);
-		table->attach (stretch_opts_selector, 2, 3, 0, 1, Gtk::FILL, Gtk::EXPAND & Gtk::FILL, 0, 0);
+		table->attach (stretch_opts_selector, 1, 2, row, row+1, Gtk::FILL, Gtk::EXPAND & Gtk::FILL, 0, 0);
+		row++;
 
-		table->attach (precise_button, 1, 3, 1, 2, Gtk::FILL, Gtk::EXPAND, 0, 0);
+		table->attach (precise_button, 0, 2, row, row+1, Gtk::FILL, Gtk::EXPAND, 0, 0);
+		row++;
+
+		duration_clock->ValueChanged.connect (sigc::mem_fun (*this, &TimeFXDialog::duration_clock_changed));
+		duration_adjustment.signal_value_changed().connect (sigc::mem_fun (*this, &TimeFXDialog::duration_adjustment_changed));
 
 #else
 		quick_button.set_name (N_("TimeFXButton"));
-		table->attach (quick_button, 1, 3, 0, 1, Gtk::FILL, Gtk::EXPAND, 0, 0);
+		table->attach (quick_button, 1, 3, row, row+1, Gtk::FILL, Gtk::EXPAND, 0, 0);
+		row++;
 
 		antialias_button.set_name (N_("TimeFXButton"));
-		table->attach (antialias_button, 1, 3, 1, 2, Gtk::FILL, Gtk::EXPAND, 0, 0);
+		table->attach (antialias_button, 1, 3, row, row+1, Gtk::FILL, Gtk::EXPAND, 0, 0);
 
 #endif
 
@@ -177,9 +216,30 @@ TimeFXDialog::TimeFXDialog (Editor& e, bool pitch)
 }
 
 void
+TimeFXDialog::start_updates ()
+{
+	update_connection = Timers::rapid_connect (sigc::mem_fun (*this, &TimeFXDialog::timer_update));
+}
+
+void
 TimeFXDialog::update_progress_gui (float p)
 {
-	progress_bar.set_fraction (p);
+	/* time/pitch FX are applied in a dedicated thread, so we cannot just
+	   update the GUI when notified about progress. That is deferred to a
+	   timer-driven callback which will ensure that the visual progress
+	   indicator is updated.
+	*/
+	progress = p;
+}
+
+void
+TimeFXDialog::timer_update ()
+{
+	progress_bar.set_fraction (progress);
+
+	if (request.done || request.cancel) {
+		update_connection.disconnect ();
+	}
 }
 
 void
@@ -199,3 +259,59 @@ TimeFXDialog::delete_in_progress (GdkEventAny*)
 	return TRUE;
 }
 
+float
+TimeFXDialog::get_time_fraction () const
+{
+	if (pitching) {
+		return 1.0;
+	}
+
+	return duration_adjustment.get_value() / 100.0;
+}
+
+float
+TimeFXDialog::get_pitch_fraction () const
+{
+	if (!pitching) {
+		return 1.0;
+	}
+
+	float cents = pitch_octave_adjustment.get_value() * 1200.0;
+
+	cents += pitch_semitone_adjustment.get_value() * 100.0;
+	cents += pitch_cent_adjustment.get_value();
+
+	if (cents == 0.0) {
+		return 1.0;
+	}
+
+	// one octave == 1200 cents
+	// adding one octave doubles the frequency
+	// ratio is 2^^octaves
+
+	return pow(2, cents/1200);
+}
+
+void
+TimeFXDialog::duration_adjustment_changed ()
+{
+	if (ignore_adjustment_change) {
+		return;
+	}
+
+	PBD::Unwinder<bool> uw (ignore_clock_change, true);
+
+	duration_clock->set ((framecnt_t) (original_length * (duration_adjustment.get_value()/ 100.0)));
+}
+
+void
+TimeFXDialog::duration_clock_changed ()
+{
+	if (ignore_clock_change) {
+		return;
+	}
+
+	PBD::Unwinder<bool> uw (ignore_adjustment_change, true);
+
+	duration_adjustment.set_value (100.0 * (duration_clock->current_duration() / (double) original_length));
+}
diff --git a/gtk2_ardour/time_fx_dialog.h b/gtk2_ardour/time_fx_dialog.h
index a7e4a7a..03e0ccf 100644
--- a/gtk2_ardour/time_fx_dialog.h
+++ b/gtk2_ardour/time_fx_dialog.h
@@ -1,26 +1,32 @@
 /*
-    Copyright (C) 2000-2009 Paul Davis
+  Copyright (C) 2000-2009 Paul Davis
 
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
+  This program is free software; you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation; either version 2 of the License, or
+  (at your option) any later version.
 
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
 
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 
 */
 
 #ifndef __ardour_time_fx_dialog_h__
 #define __ardour_time_fx_dialog_h__
 
-#include <gtkmm.h>
+#include <gtkmm/adjustment.h>
+#include <gtkmm/spinbutton.h>
+#include <gtkmm/progressbar.h>
+#include <gtkmm/box.h>
+#include <gtkmm/comboboxtext.h>
+#include <gtkmm/label.h>
+#include <gtkmm/button.h>
 
 #include "ardour/timefx_request.h"
 
@@ -28,48 +34,65 @@
 #include "progress_reporter.h"
 
 class Editor;
+class AudioClock;
 
 class TimeFXDialog : public ArdourDialog, public ProgressReporter
 {
-public:
-    ARDOUR::TimeFXRequest request;
-    Editor&               editor;
-    bool                  pitching;
-    Gtk::Adjustment       pitch_octave_adjustment;
-    Gtk::Adjustment       pitch_semitone_adjustment;
-    Gtk::Adjustment       pitch_cent_adjustment;
-    Gtk::SpinButton       pitch_octave_spinner;
-    Gtk::SpinButton       pitch_semitone_spinner;
-    Gtk::SpinButton       pitch_cent_spinner;
-    Gtk::ProgressBar      progress_bar;
-    ARDOUR::RegionList    regions;
-
-    /* SoundTouch */
-    Gtk::CheckButton      quick_button;
-    Gtk::CheckButton      antialias_button;
-    Gtk::VBox             upper_button_box;
-
-    /* RubberBand */
-    Gtk::ComboBoxText     stretch_opts_selector;
-    Gtk::Label            stretch_opts_label;
-    Gtk::CheckButton      precise_button;
-    Gtk::CheckButton      preserve_formants_button;
-
-    Gtk::Button*          cancel_button;
-    Gtk::Button*          action_button;
-    Gtk::VBox             packer;
-    int                   status;
-
-    TimeFXDialog (Editor& e, bool for_pitch);
-
-    sigc::connection first_cancel;
-    sigc::connection first_delete;
-    void cancel_in_progress ();
-    gint delete_in_progress (GdkEventAny*);
-
-private:
-
-    void update_progress_gui (float);
+  public:
+	/* We need a position so that BBT mode in the clock can function */
+	TimeFXDialog (Editor& e, bool for_pitch, ARDOUR::framecnt_t old_length, ARDOUR::framecnt_t new_length, ARDOUR::framepos_t position);
+
+	ARDOUR::TimeFXRequest request;
+	Editor&               editor;
+	bool                  pitching;
+	Gtk::ProgressBar      progress_bar;
+	ARDOUR::RegionList    regions;
+
+	/* SoundTouch */
+	Gtk::CheckButton      quick_button;
+	Gtk::CheckButton      antialias_button;
+	Gtk::VBox             upper_button_box;
+
+	/* RubberBand */
+	Gtk::ComboBoxText     stretch_opts_selector;
+	Gtk::Label            stretch_opts_label;
+	Gtk::CheckButton      precise_button;
+	Gtk::CheckButton      preserve_formants_button;
+
+	Gtk::Button*          cancel_button;
+	Gtk::Button*          action_button;
+	Gtk::VBox             packer;
+	int                   status;
+
+	sigc::connection first_cancel;
+	sigc::connection first_delete;
+	void cancel_in_progress ();
+	gint delete_in_progress (GdkEventAny*);
+
+	float get_time_fraction () const;
+	float get_pitch_fraction () const;
+
+	void start_updates ();
+
+  private:
+	ARDOUR::framecnt_t      original_length;
+	Gtk::Adjustment pitch_octave_adjustment;
+	Gtk::Adjustment pitch_semitone_adjustment;
+	Gtk::Adjustment pitch_cent_adjustment;
+	Gtk::SpinButton pitch_octave_spinner;
+	Gtk::SpinButton pitch_semitone_spinner;
+	Gtk::SpinButton pitch_cent_spinner;
+	Gtk::Adjustment duration_adjustment;
+	AudioClock*     duration_clock;
+	bool            ignore_adjustment_change;
+	bool            ignore_clock_change;
+	sigc::connection update_connection;
+	float           progress;
+
+	void update_progress_gui (float);
+	void duration_clock_changed ();
+	void duration_adjustment_changed ();
+	void timer_update ();
 };
 
 #endif /* __ardour_time_fx_dialog_h__ */
diff --git a/gtk2_ardour/time_info_box.cc b/gtk2_ardour/time_info_box.cc
index a26ec50..d0d6871 100644
--- a/gtk2_ardour/time_info_box.cc
+++ b/gtk2_ardour/time_info_box.cc
@@ -36,7 +36,7 @@
 #include "control_point.h"
 #include "automation_line.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace Gtk;
 using namespace ARDOUR;
@@ -58,12 +58,6 @@ TimeInfoBox::TimeInfoBox ()
 	punch_start = new AudioClock ("punch-start", false, "punch", false, false, false, false);
 	punch_end = new AudioClock ("punch-end", false, "punch", false, false, false, false);
 
-	selection_start->set_draw_background (false);
-	selection_end->set_draw_background (false);
-	selection_length->set_draw_background (false);
-	punch_start->set_draw_background (false);
-	punch_end->set_draw_background (false);
-
 	selection_title.set_text (_("Selection"));
 	punch_title.set_text (_("Punch"));
 
@@ -193,7 +187,7 @@ TimeInfoBox::region_property_change (boost::shared_ptr<ARDOUR::Region> /* r */,
 	 * RegionView (not Region itself).
 	 */
 
-	selection_changed ();
+	//selection_changed ();
 }
 
 bool
diff --git a/gtk2_ardour/time_selection.cc b/gtk2_ardour/time_selection.cc
index 8545a34..2f40dcb 100644
--- a/gtk2_ardour/time_selection.cc
+++ b/gtk2_ardour/time_selection.cc
@@ -24,7 +24,7 @@
 
 #include "time_selection.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 using namespace PBD;
diff --git a/gtk2_ardour/timecode_tester.cc b/gtk2_ardour/timecode_tester.cc
deleted file mode 100644
index 9856231..0000000
--- a/gtk2_ardour/timecode_tester.cc
+++ /dev/null
@@ -1,392 +0,0 @@
-/*
-    Copyright (C) 2012 Paul Davis
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-*/
-
-void
-AudioClock::timecode_tester ()
-{
-#if 0
-#define Timecode_SAMPLE_TEST_1
-#define Timecode_SAMPLE_TEST_2
-#define Timecode_SAMPLE_TEST_3
-#define Timecode_SAMPLE_TEST_4
-#define Timecode_SAMPLE_TEST_5
-#define Timecode_SAMPLE_TEST_6
-#define Timecode_SAMPLE_TEST_7
-
-	// Testcode for timecode<->sample conversions (P.S.)
-	Timecode::Time timecode1;
-	framepos_t sample1;
-	framepos_t oldsample = 0;
-	Timecode::Time timecode2;
-	framecnt_t sample_increment;
-
-	sample_increment = (framecnt_t)rint(_session->frame_rate() / _session->timecode_frames_per_second);
-
-#ifdef Timecode_SAMPLE_TEST_1
-	// Test 1: use_offset = false, use_subframes = false
-	cout << "use_offset = false, use_subframes = false" << endl;
-	for (int i = 0; i < 108003; i++) {
-		_session->timecode_to_sample( timecode1, sample1, false /* use_offset */, false /* use_subframes */ );
-		_session->sample_to_timecode( sample1, timecode2, false /* use_offset */, false /* use_subframes */ );
-
-		if ((i > 0) && ( ((sample1 - oldsample) != sample_increment) && ((sample1 - oldsample) != (sample_increment + 1)) && ((sample1 - oldsample) != (sample_increment - 1)))) {
-			cout << "ERROR: sample increment not right: " << (sample1 - oldsample) << " != " << sample_increment << endl;
-			cout << "timecode1: " << timecode1.hours << ":" << timecode1.minutes << ":" << timecode1.seconds << ":" << timecode1.frames << "::" << timecode1.subframes << " -> ";
-			cout << "sample: " << sample1 << endl;
-			cout << "sample: " << sample1 << " -> ";
-			cout << "timecode2: " << timecode2.hours << ":" << timecode2.minutes << ":" << timecode2.seconds << ":" << timecode2.frames << "::" << timecode2.subframes << endl;
-			break;
-		}
-
-		if (timecode2.hours != timecode1.hours || timecode2.minutes != timecode1.minutes || timecode2.seconds != timecode2.seconds || timecode2.frames != timecode1.frames) {
-			cout << "ERROR: timecode2 not equal timecode1" << endl;
-			cout << "timecode1: " << timecode1.hours << ":" << timecode1.minutes << ":" << timecode1.seconds << ":" << timecode1.frames << "::" << timecode1.subframes << " -> ";
-			cout << "sample: " << sample1 << endl;
-			cout << "sample: " << sample1 << " -> ";
-			cout << "timecode2: " << timecode2.hours << ":" << timecode2.minutes << ":" << timecode2.seconds << ":" << timecode2.frames << "::" << timecode2.subframes << endl;
-			break;
-		}
-		oldsample = sample1;
-		_session->timecode_increment( timecode1 );
-	}
-
-	cout << "sample_increment: " << sample_increment << endl;
-	cout << "sample: " << sample1 << " -> ";
-	cout << "timecode: " << timecode2.hours << ":" << timecode2.minutes << ":" << timecode2.seconds << ":" << timecode2.frames << "::" << timecode2.subframes << endl;
-#endif
-
-#ifdef Timecode_SAMPLE_TEST_2
-	// Test 2: use_offset = true, use_subframes = false
-	cout << "use_offset = true, use_subframes = false" << endl;
-
-	timecode1.hours = 0;
-	timecode1.minutes = 0;
-	timecode1.seconds = 0;
-	timecode1.frames = 0;
-	timecode1.subframes = 0;
-	sample1 = oldsample = 0;
-
-	_session->sample_to_timecode( sample1, timecode1, true /* use_offset */, false /* use_subframes */ );
-	cout << "Starting at sample: " << sample1 << " -> ";
-	cout << "timecode: " << (timecode1.negative ? "-" : "") << timecode1.hours << ":" << timecode1.minutes << ":" << timecode1.seconds << ":" << timecode1.frames << "::" << timecode1.subframes << endl;
-
-	for (int i = 0; i < 108003; i++) {
-		_session->timecode_to_sample( timecode1, sample1, true /* use_offset */, false /* use_subframes */ );
-		_session->sample_to_timecode( sample1, timecode2, true /* use_offset */, false /* use_subframes */ );
-
-//     cout << "timecode: " << (timecode1.negative ? "-" : "") << timecode1.hours << ":" << timecode1.minutes << ":" << timecode1.seconds << ":" << timecode1.frames << "::" << timecode1.subframes << " -> ";
-//     cout << "sample: " << sample1 << endl;
-//     cout << "sample: " << sample1 << " -> ";
-//     cout << "timecode: " << (timecode2.negative ? "-" : "") << timecode2.hours << ":" << timecode2.minutes << ":" << timecode2.seconds << ":" << timecode2.frames << "::" << timecode2.subframes << endl;
-
-		if ((i > 0) && ( ((sample1 - oldsample) != sample_increment) && ((sample1 - oldsample) != (sample_increment + 1)) && ((sample1 - oldsample) != (sample_increment - 1)))) {
-			cout << "ERROR: sample increment not right: " << (sample1 - oldsample) << " != " << sample_increment << endl;
-			cout << "timecode1: " << (timecode1.negative ? "-" : "") << timecode1.hours << ":" << timecode1.minutes << ":" << timecode1.seconds << ":" << timecode1.frames << "::" << timecode1.subframes << " -> ";
-			cout << "sample: " << sample1 << endl;
-			cout << "sample: " << sample1 << " -> ";
-			cout << "timecode2: " << (timecode2.negative ? "-" : "") << timecode2.hours << ":" << timecode2.minutes << ":" << timecode2.seconds << ":" << timecode2.frames << "::" << timecode2.subframes << endl;
-			break;
-		}
-
-		if (timecode2.hours != timecode1.hours || timecode2.minutes != timecode1.minutes || timecode2.seconds != timecode2.seconds || timecode2.frames != timecode1.frames) {
-			cout << "ERROR: timecode2 not equal timecode1" << endl;
-			cout << "timecode1: " << (timecode1.negative ? "-" : "") << timecode1.hours << ":" << timecode1.minutes << ":" << timecode1.seconds << ":" << timecode1.frames << "::" << timecode1.subframes << " -> ";
-			cout << "sample: " << sample1 << endl;
-			cout << "sample: " << sample1 << " -> ";
-			cout << "timecode2: " << (timecode2.negative ? "-" : "") << timecode2.hours << ":" << timecode2.minutes << ":" << timecode2.seconds << ":" << timecode2.frames << "::" << timecode2.subframes << endl;
-			break;
-		}
-		oldsample = sample1;
-		_session->timecode_increment( timecode1 );
-	}
-
-	cout << "sample_increment: " << sample_increment << endl;
-	cout << "sample: " << sample1 << " -> ";
-	cout << "timecode: " << (timecode2.negative ? "-" : "") << timecode2.hours << ":" << timecode2.minutes << ":" << timecode2.seconds << ":" << timecode2.frames << "::" << timecode2.subframes << endl;
-#endif
-
-#ifdef Timecode_SAMPLE_TEST_3
-	// Test 3: use_offset = true, use_subframes = false, decrement
-	cout << "use_offset = true, use_subframes = false, decrement" << endl;
-
-	_session->sample_to_timecode( sample1, timecode1, true /* use_offset */, false /* use_subframes */ );
-	cout << "Starting at sample: " << sample1 << " -> ";
-	cout << "timecode: " << (timecode1.negative ? "-" : "") << timecode1.hours << ":" << timecode1.minutes << ":" << timecode1.seconds << ":" << timecode1.frames << "::" << timecode1.subframes << endl;
-
-	for (int i = 0; i < 108003; i++) {
-		_session->timecode_to_sample( timecode1, sample1, true /* use_offset */, false /* use_subframes */ );
-		_session->sample_to_timecode( sample1, timecode2, true /* use_offset */, false /* use_subframes */ );
-
-//     cout << "timecode: " << (timecode1.negative ? "-" : "") << timecode1.hours << ":" << timecode1.minutes << ":" << timecode1.seconds << ":" << timecode1.frames << "::" << timecode1.subframes << " -> ";
-//     cout << "sample: " << sample1 << endl;
-//     cout << "sample: " << sample1 << " -> ";
-//     cout << "timecode: " << (timecode2.negative ? "-" : "") << timecode2.hours << ":" << timecode2.minutes << ":" << timecode2.seconds << ":" << timecode2.frames << "::" << timecode2.subframes << endl;
-
-		if ((i > 0) && ( ((oldsample - sample1) != sample_increment) && ((oldsample - sample1) != (sample_increment + 1)) && ((oldsample - sample1) != (sample_increment - 1)))) {
-			cout << "ERROR: sample increment not right: " << (oldsample - sample1) << " != " << sample_increment << endl;
-			cout << "timecode1: " << (timecode1.negative ? "-" : "") << timecode1.hours << ":" << timecode1.minutes << ":" << timecode1.seconds << ":" << timecode1.frames << "::" << timecode1.subframes << " -> ";
-			cout << "sample: " << sample1 << endl;
-			cout << "sample: " << sample1 << " -> ";
-			cout << "timecode2: " << (timecode2.negative ? "-" : "") << timecode2.hours << ":" << timecode2.minutes << ":" << timecode2.seconds << ":" << timecode2.frames << "::" << timecode2.subframes << endl;
-			break;
-		}
-
-		if (timecode2.hours != timecode1.hours || timecode2.minutes != timecode1.minutes || timecode2.seconds != timecode2.seconds || timecode2.frames != timecode1.frames) {
-			cout << "ERROR: timecode2 not equal timecode1" << endl;
-			cout << "timecode1: " << (timecode1.negative ? "-" : "") << timecode1.hours << ":" << timecode1.minutes << ":" << timecode1.seconds << ":" << timecode1.frames << "::" << timecode1.subframes << " -> ";
-			cout << "sample: " << sample1 << endl;
-			cout << "sample: " << sample1 << " -> ";
-			cout << "timecode2: " << (timecode2.negative ? "-" : "") << timecode2.hours << ":" << timecode2.minutes << ":" << timecode2.seconds << ":" << timecode2.frames << "::" << timecode2.subframes << endl;
-			break;
-		}
-		oldsample = sample1;
-		_session->timecode_decrement( timecode1 );
-	}
-
-	cout << "sample_decrement: " << sample_increment << endl;
-	cout << "sample: " << sample1 << " -> ";
-	cout << "timecode: " << (timecode2.negative ? "-" : "") << timecode2.hours << ":" << timecode2.minutes << ":" << timecode2.seconds << ":" << timecode2.frames << "::" << timecode2.subframes << endl;
-#endif
-
-
-#ifdef Timecode_SAMPLE_TEST_4
-	// Test 4: use_offset = true, use_subframes = true
-	cout << "use_offset = true, use_subframes = true" << endl;
-
-	for (long sub = 5; sub < 80; sub += 5) {
-		timecode1.hours = 0;
-		timecode1.minutes = 0;
-		timecode1.seconds = 0;
-		timecode1.frames = 0;
-		timecode1.subframes = 0;
-		sample1 = oldsample = (sample_increment * sub) / 80;
-
-		_session->sample_to_timecode( sample1, timecode1, true /* use_offset */, true /* use_subframes */ );
-
-		cout << "starting at sample: " << sample1 << " -> ";
-		cout << "timecode: " << (timecode1.negative ? "-" : "") << timecode1.hours << ":" << timecode1.minutes << ":" << timecode1.seconds << ":" << timecode1.frames << "::" << timecode1.subframes << endl;
-
-		for (int i = 0; i < 108003; i++) {
-			_session->timecode_to_sample( timecode1, sample1, true /* use_offset */, true /* use_subframes */ );
-			_session->sample_to_timecode( sample1, timecode2, true /* use_offset */, true /* use_subframes */ );
-
-			if ((i > 0) && ( ((sample1 - oldsample) != sample_increment) && ((sample1 - oldsample) != (sample_increment + 1)) && ((sample1 - oldsample) != (sample_increment - 1)))) {
-				cout << "ERROR: sample increment not right: " << (sample1 - oldsample) << " != " << sample_increment << endl;
-				cout << "timecode1: " << (timecode1.negative ? "-" : "") << timecode1.hours << ":" << timecode1.minutes << ":" << timecode1.seconds << ":" << timecode1.frames << "::" << timecode1.subframes << " -> ";
-				cout << "sample: " << sample1 << endl;
-				cout << "sample: " << sample1 << " -> ";
-				cout << "timecode2: " << (timecode2.negative ? "-" : "") << timecode2.hours << ":" << timecode2.minutes << ":" << timecode2.seconds << ":" << timecode2.frames << "::" << timecode2.subframes << endl;
-				//break;
-			}
-
-			if (timecode2.hours != timecode1.hours || timecode2.minutes != timecode1.minutes || timecode2.seconds != timecode2.seconds || timecode2.frames != timecode1.frames || timecode2.subframes != timecode1.subframes) {
-				cout << "ERROR: timecode2 not equal timecode1" << endl;
-				cout << "timecode1: " << (timecode1.negative ? "-" : "") << timecode1.hours << ":" << timecode1.minutes << ":" << timecode1.seconds << ":" << timecode1.frames << "::" << timecode1.subframes << " -> ";
-				cout << "sample: " << sample1 << endl;
-				cout << "sample: " << sample1 << " -> ";
-				cout << "timecode2: " << (timecode2.negative ? "-" : "") << timecode2.hours << ":" << timecode2.minutes << ":" << timecode2.seconds << ":" << timecode2.frames << "::" << timecode2.subframes << endl;
-				break;
-			}
-			oldsample = sample1;
-			_session->timecode_increment( timecode1 );
-		}
-
-		cout << "sample_increment: " << sample_increment << endl;
-		cout << "sample: " << sample1 << " -> ";
-		cout << "timecode: " << (timecode2.negative ? "-" : "") << timecode2.hours << ":" << timecode2.minutes << ":" << timecode2.seconds << ":" << timecode2.frames << "::" << timecode2.subframes << endl;
-
-		for (int i = 0; i < 108003; i++) {
-			_session->timecode_to_sample( timecode1, sample1, true /* use_offset */, true /* use_subframes */ );
-			_session->sample_to_timecode( sample1, timecode2, true /* use_offset */, true /* use_subframes */ );
-
-			if ((i > 0) && ( ((oldsample - sample1) != sample_increment) && ((oldsample - sample1) != (sample_increment + 1)) && ((oldsample - sample1) != (sample_increment - 1)))) {
-				cout << "ERROR: sample increment not right: " << (oldsample - sample1) << " != " << sample_increment << endl;
-				cout << "timecode1: " << (timecode1.negative ? "-" : "") << timecode1.hours << ":" << timecode1.minutes << ":" << timecode1.seconds << ":" << timecode1.frames << "::" << timecode1.subframes << " -> ";
-				cout << "sample: " << sample1 << endl;
-				cout << "sample: " << sample1 << " -> ";
-				cout << "timecode2: " << (timecode2.negative ? "-" : "") << timecode2.hours << ":" << timecode2.minutes << ":" << timecode2.seconds << ":" << timecode2.frames << "::" << timecode2.subframes << endl;
-				//break;
-			}
-
-			if (timecode2.hours != timecode1.hours || timecode2.minutes != timecode1.minutes || timecode2.seconds != timecode2.seconds || timecode2.frames != timecode1.frames || timecode2.subframes != timecode1.subframes) {
-				cout << "ERROR: timecode2 not equal timecode1" << endl;
-				cout << "timecode1: " << (timecode1.negative ? "-" : "") << timecode1.hours << ":" << timecode1.minutes << ":" << timecode1.seconds << ":" << timecode1.frames << "::" << timecode1.subframes << " -> ";
-				cout << "sample: " << sample1 << endl;
-				cout << "sample: " << sample1 << " -> ";
-				cout << "timecode2: " << (timecode2.negative ? "-" : "") << timecode2.hours << ":" << timecode2.minutes << ":" << timecode2.seconds << ":" << timecode2.frames << "::" << timecode2.subframes << endl;
-				break;
-			}
-			oldsample = sample1;
-			_session->timecode_decrement( timecode1 );
-		}
-
-		cout << "sample_decrement: " << sample_increment << endl;
-		cout << "sample: " << sample1 << " -> ";
-		cout << "timecode: " << (timecode2.negative ? "-" : "") << timecode2.hours << ":" << timecode2.minutes << ":" << timecode2.seconds << ":" << timecode2.frames << "::" << timecode2.subframes << endl;
-	}
-#endif
-
-
-#ifdef Timecode_SAMPLE_TEST_5
-	// Test 5: use_offset = true, use_subframes = false, increment seconds
-	cout << "use_offset = true, use_subframes = false, increment seconds" << endl;
-
-	timecode1.hours = 0;
-	timecode1.minutes = 0;
-	timecode1.seconds = 0;
-	timecode1.frames = 0;
-	timecode1.subframes = 0;
-	sample1 = oldsample = 0;
-	sample_increment = _session->frame_rate();
-
-	_session->sample_to_timecode( sample1, timecode1, true /* use_offset */, false /* use_subframes */ );
-	cout << "Starting at sample: " << sample1 << " -> ";
-	cout << "timecode: " << (timecode1.negative ? "-" : "") << timecode1.hours << ":" << timecode1.minutes << ":" << timecode1.seconds << ":" << timecode1.frames << "::" << timecode1.subframes << endl;
-
-	for (int i = 0; i < 3600; i++) {
-		_session->timecode_to_sample( timecode1, sample1, true /* use_offset */, false /* use_subframes */ );
-		_session->sample_to_timecode( sample1, timecode2, true /* use_offset */, false /* use_subframes */ );
-
-//     cout << "timecode: " << (timecode1.negative ? "-" : "") << timecode1.hours << ":" << timecode1.minutes << ":" << timecode1.seconds << ":" << timecode1.frames << "::" << timecode1.subframes << " -> ";
-//     cout << "sample: " << sample1 << endl;
-//     cout << "sample: " << sample1 << " -> ";
-//     cout << "timecode: " << (timecode2.negative ? "-" : "") << timecode2.hours << ":" << timecode2.minutes << ":" << timecode2.seconds << ":" << timecode2.frames << "::" << timecode2.subframes << endl;
-
-//     if ((i > 0) && ( ((sample1 - oldsample) != sample_increment) && ((sample1 - oldsample) != (sample_increment + 1)) && ((sample1 - oldsample) != (sample_increment - 1))))
-//     {
-//       cout << "ERROR: sample increment not right: " << (sample1 - oldsample) << " != " << sample_increment << endl;
-//       break;
-//     }
-
-		if (timecode2.hours != timecode1.hours || timecode2.minutes != timecode1.minutes || timecode2.seconds != timecode2.seconds || timecode2.frames != timecode1.frames) {
-			cout << "ERROR: timecode2 not equal timecode1" << endl;
-			cout << "timecode: " << (timecode1.negative ? "-" : "") << timecode1.hours << ":" << timecode1.minutes << ":" << timecode1.seconds << ":" << timecode1.frames << "::" << timecode1.subframes << " -> ";
-			cout << "sample: " << sample1 << endl;
-			cout << "sample: " << sample1 << " -> ";
-			cout << "timecode: " << (timecode2.negative ? "-" : "") << timecode2.hours << ":" << timecode2.minutes << ":" << timecode2.seconds << ":" << timecode2.frames << "::" << timecode2.subframes << endl;
-			break;
-		}
-		oldsample = sample1;
-		_session->timecode_increment_seconds( timecode1 );
-	}
-
-	cout << "sample_increment: " << sample_increment << endl;
-	cout << "sample: " << sample1 << " -> ";
-	cout << "timecode: " << (timecode2.negative ? "-" : "") << timecode2.hours << ":" << timecode2.minutes << ":" << timecode2.seconds << ":" << timecode2.frames << "::" << timecode2.subframes << endl;
-#endif
-
-
-#ifdef Timecode_SAMPLE_TEST_6
-	// Test 6: use_offset = true, use_subframes = false, increment minutes
-	cout << "use_offset = true, use_subframes = false, increment minutes" << endl;
-
-	timecode1.hours = 0;
-	timecode1.minutes = 0;
-	timecode1.seconds = 0;
-	timecode1.frames = 0;
-	timecode1.subframes = 0;
-	sample1 = oldsample = 0;
-	sample_increment = _session->frame_rate() * 60;
-
-	_session->sample_to_timecode( sample1, timecode1, true /* use_offset */, false /* use_subframes */ );
-	cout << "Starting at sample: " << sample1 << " -> ";
-	cout << "timecode: " << (timecode1.negative ? "-" : "") << timecode1.hours << ":" << timecode1.minutes << ":" << timecode1.seconds << ":" << timecode1.frames << "::" << timecode1.subframes << endl;
-
-	for (int i = 0; i < 60; i++) {
-		_session->timecode_to_sample( timecode1, sample1, true /* use_offset */, false /* use_subframes */ );
-		_session->sample_to_timecode( sample1, timecode2, true /* use_offset */, false /* use_subframes */ );
-
-//     cout << "timecode: " << (timecode1.negative ? "-" : "") << timecode1.hours << ":" << timecode1.minutes << ":" << timecode1.seconds << ":" << timecode1.frames << "::" << timecode1.subframes << " -> ";
-//     cout << "sample: " << sample1 << endl;
-//     cout << "sample: " << sample1 << " -> ";
-//     cout << "timecode: " << (timecode2.negative ? "-" : "") << timecode2.hours << ":" << timecode2.minutes << ":" << timecode2.seconds << ":" << timecode2.frames << "::" << timecode2.subframes << endl;
-
-//     if ((i > 0) && ( ((sample1 - oldsample) != sample_increment) && ((sample1 - oldsample) != (sample_increment + 1)) && ((sample1 - oldsample) != (sample_increment - 1))))
-//     {
-//       cout << "ERROR: sample increment not right: " << (sample1 - oldsample) << " != " << sample_increment << endl;
-//       break;
-//     }
-
-		if (timecode2.hours != timecode1.hours || timecode2.minutes != timecode1.minutes || timecode2.seconds != timecode2.seconds || timecode2.frames != timecode1.frames) {
-			cout << "ERROR: timecode2 not equal timecode1" << endl;
-			cout << "timecode: " << (timecode1.negative ? "-" : "") << timecode1.hours << ":" << timecode1.minutes << ":" << timecode1.seconds << ":" << timecode1.frames << "::" << timecode1.subframes << " -> ";
-			cout << "sample: " << sample1 << endl;
-			cout << "sample: " << sample1 << " -> ";
-			cout << "timecode: " << (timecode2.negative ? "-" : "") << timecode2.hours << ":" << timecode2.minutes << ":" << timecode2.seconds << ":" << timecode2.frames << "::" << timecode2.subframes << endl;
-			break;
-		}
-		oldsample = sample1;
-		_session->timecode_increment_minutes( timecode1 );
-	}
-
-	cout << "sample_increment: " << sample_increment << endl;
-	cout << "sample: " << sample1 << " -> ";
-	cout << "timecode: " << (timecode2.negative ? "-" : "") << timecode2.hours << ":" << timecode2.minutes << ":" << timecode2.seconds << ":" << timecode2.frames << "::" << timecode2.subframes << endl;
-#endif
-
-#ifdef Timecode_SAMPLE_TEST_7
-	// Test 7: use_offset = true, use_subframes = false, increment hours
-	cout << "use_offset = true, use_subframes = false, increment hours" << endl;
-
-	timecode1.hours = 0;
-	timecode1.minutes = 0;
-	timecode1.seconds = 0;
-	timecode1.frames = 0;
-	timecode1.subframes = 0;
-	sample1 = oldsample = 0;
-	sample_increment = _session->frame_rate() * 60 * 60;
-
-	_session->sample_to_timecode( sample1, timecode1, true /* use_offset */, false /* use_subframes */ );
-	cout << "Starting at sample: " << sample1 << " -> ";
-	cout << "timecode: " << (timecode1.negative ? "-" : "") << timecode1.hours << ":" << timecode1.minutes << ":" << timecode1.seconds << ":" << timecode1.frames << "::" << timecode1.subframes << endl;
-
-	for (int i = 0; i < 10; i++) {
-		_session->timecode_to_sample( timecode1, sample1, true /* use_offset */, false /* use_subframes */ );
-		_session->sample_to_timecode( sample1, timecode2, true /* use_offset */, false /* use_subframes */ );
-
-//     cout << "timecode: " << (timecode1.negative ? "-" : "") << timecode1.hours << ":" << timecode1.minutes << ":" << timecode1.seconds << ":" << timecode1.frames << "::" << timecode1.subframes << " -> ";
-//     cout << "sample: " << sample1 << endl;
-//     cout << "sample: " << sample1 << " -> ";
-//     cout << "timecode: " << (timecode2.negative ? "-" : "") << timecode2.hours << ":" << timecode2.minutes << ":" << timecode2.seconds << ":" << timecode2.frames << "::" << timecode2.subframes << endl;
-
-//     if ((i > 0) && ( ((sample1 - oldsample) != sample_increment) && ((sample1 - oldsample) != (sample_increment + 1)) && ((sample1 - oldsample) != (sample_increment - 1))))
-//     {
-//       cout << "ERROR: sample increment not right: " << (sample1 - oldsample) << " != " << sample_increment << endl;
-//       break;
-//     }
-
-		if (timecode2.hours != timecode1.hours || timecode2.minutes != timecode1.minutes || timecode2.seconds != timecode2.seconds || timecode2.frames != timecode1.frames) {
-			cout << "ERROR: timecode2 not equal timecode1" << endl;
-			cout << "timecode: " << (timecode1.negative ? "-" : "") << timecode1.hours << ":" << timecode1.minutes << ":" << timecode1.seconds << ":" << timecode1.frames << "::" << timecode1.subframes << " -> ";
-			cout << "sample: " << sample1 << endl;
-			cout << "sample: " << sample1 << " -> ";
-			cout << "timecode: " << (timecode2.negative ? "-" : "") << timecode2.hours << ":" << timecode2.minutes << ":" << timecode2.seconds << ":" << timecode2.frames << "::" << timecode2.subframes << endl;
-			break;
-		}
-		oldsample = sample1;
-		_session->timecode_increment_hours( timecode1 );
-	}
-
-	cout << "sample_increment: " << sample_increment << endl;
-	cout << "sample: " << sample1 << " -> ";
-	cout << "timecode: " << (timecode2.negative ? "-" : "") << timecode2.hours << ":" << timecode2.minutes << ":" << timecode2.seconds << ":" << timecode2.frames << "::" << timecode2.subframes << endl;
-#endif
-
-#endif
-}
diff --git a/gtk2_ardour/track_selection.cc b/gtk2_ardour/track_selection.cc
index 92efbd4..6937eb6 100644
--- a/gtk2_ardour/track_selection.cc
+++ b/gtk2_ardour/track_selection.cc
@@ -18,7 +18,10 @@
 */
 
 #include <algorithm>
+
 #include "ardour/route_group.h"
+#include "control_protocol/control_protocol.h"
+
 #include "track_selection.h"
 #include "time_axis_view.h"
 #include "public_editor.h"
@@ -57,4 +60,3 @@ TrackSelection::add (TrackViewList const & t)
 
 	return added;
 }
-
diff --git a/gtk2_ardour/track_view_list.cc b/gtk2_ardour/track_view_list.cc
index cc29a57..a89565c 100644
--- a/gtk2_ardour/track_view_list.cc
+++ b/gtk2_ardour/track_view_list.cc
@@ -19,6 +19,7 @@
 
 #include <algorithm>
 #include "track_view_list.h"
+#include "route_time_axis.h"
 
 using namespace std;
 
@@ -51,3 +52,16 @@ TrackViewList::add (TrackViewList const & t)
 
 	return added;
 }
+
+ARDOUR::RouteList
+TrackViewList::routelist () const
+{
+	ARDOUR::RouteList rl;
+	for (TrackViewList::const_iterator i = begin (); i != end (); ++i) {
+		RouteTimeAxisView* rtv = dynamic_cast<RouteTimeAxisView*> (*i);
+		if (rtv) {
+			rl.push_back (rtv->route ());
+		}
+	}
+	return rl;
+}
diff --git a/gtk2_ardour/track_view_list.h b/gtk2_ardour/track_view_list.h
index 24f2646..227cb16 100644
--- a/gtk2_ardour/track_view_list.h
+++ b/gtk2_ardour/track_view_list.h
@@ -20,6 +20,7 @@
 #ifndef __ardour_gtk_track_view_list_h__
 #define __ardour_gtk_track_view_list_h__
 
+#include "ardour/types.h"
 #include <list>
 #include <set>
 
@@ -37,6 +38,7 @@ public:
 	bool contains (TimeAxisView const *) const;
 
 	TrackViewList filter_to_unique_playlists ();
+	ARDOUR::RouteList routelist () const;
 };
 
 #endif
diff --git a/gtk2_ardour/transcode_ffmpeg.cc b/gtk2_ardour/transcode_ffmpeg.cc
index 2883f87..6b66123 100644
--- a/gtk2_ardour/transcode_ffmpeg.cc
+++ b/gtk2_ardour/transcode_ffmpeg.cc
@@ -31,7 +31,7 @@
 #include "utils_videotl.h"
 #include "video_tool_paths.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace PBD;
 using namespace VideoUtils;
diff --git a/gtk2_ardour/transcode_video_dialog.cc b/gtk2_ardour/transcode_video_dialog.cc
index 146ca0c..50e4740 100644
--- a/gtk2_ardour/transcode_video_dialog.cc
+++ b/gtk2_ardour/transcode_video_dialog.cc
@@ -44,7 +44,7 @@
 #include "opts.h"
 #include "transcode_video_dialog.h"
 #include "utils_videotl.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace Gtk;
 using namespace std;
diff --git a/gtk2_ardour/transform_dialog.cc b/gtk2_ardour/transform_dialog.cc
index 0c21de1..7199b2a 100644
--- a/gtk2_ardour/transform_dialog.cc
+++ b/gtk2_ardour/transform_dialog.cc
@@ -23,7 +23,7 @@
 
 #include "transform_dialog.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace Gtk;
diff --git a/gtk2_ardour/transform_dialog.h b/gtk2_ardour/transform_dialog.h
index 5111aa7..df7a1c8 100644
--- a/gtk2_ardour/transform_dialog.h
+++ b/gtk2_ardour/transform_dialog.h
@@ -31,7 +31,6 @@
 #include "ardour/midi_model.h"
 #include "ardour/transform.h"
 #include "ardour/types.h"
-#include "evoral/types.hpp"
 
 #include "ardour_dialog.h"
 
diff --git a/gtk2_ardour/transpose_dialog.cc b/gtk2_ardour/transpose_dialog.cc
index 0913102..b5f17ab 100644
--- a/gtk2_ardour/transpose_dialog.cc
+++ b/gtk2_ardour/transpose_dialog.cc
@@ -22,7 +22,7 @@
 #include <gtkmm/label.h>
 #include <gtkmm/stock.h>
 #include "transpose_dialog.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace Gtk;
 
diff --git a/gtk2_ardour/ui_config.cc b/gtk2_ardour/ui_config.cc
index c001e5c..c6e538b 100644
--- a/gtk2_ardour/ui_config.cc
+++ b/gtk2_ardour/ui_config.cc
@@ -32,28 +32,30 @@
 #include <pango/pangoft2.h> // for fontmap resolution control for GnomeCanvas
 #include <pango/pangocairo.h> // for fontmap resolution control for GnomeCanvas
 
-#include "pbd/gstdio_compat.h"
 #include <glibmm/miscutils.h>
 
 #include <gtkmm/settings.h>
 
 #include "pbd/convert.h"
+#include "pbd/error.h"
 #include "pbd/failed_constructor.h"
-#include "pbd/xml++.h"
 #include "pbd/file_utils.h"
+#include "pbd/gstdio_compat.h"
 #include "pbd/locale_guard.h"
-#include "pbd/error.h"
-#include "pbd/stacktrace.h"
-
-#include "gtkmm2ext/rgb_macros.h"
-#include "gtkmm2ext/gtk_ui.h"
+#include "pbd/unwind.h"
+#include "pbd/xml++.h"
 
 #include "ardour/filesystem_paths.h"
+#include "ardour/search_paths.h"
+#include "ardour/revision.h"
 #include "ardour/utils.h"
 
+#include "gtkmm2ext/rgb_macros.h"
+#include "gtkmm2ext/gtk_ui.h"
+
 #include "ui_config.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace PBD;
@@ -64,6 +66,7 @@ static const char* ui_config_file_name = "ui_config";
 static const char* default_ui_config_file_name = "default_ui_config";
 
 static const double hue_width = 18.0;
+std::string UIConfiguration::color_file_suffix = X_(".colors");
 
 UIConfiguration&
 UIConfiguration::instance ()
@@ -124,7 +127,7 @@ UIConfiguration::parameter_changed (string param)
 	if (param == "ui-rc-file") {
 		load_rc_file (true);
 	} else if (param == "color-file") {
-		load_color_theme ();
+		load_color_theme (true);
 	}
 
 	save_state ();
@@ -133,6 +136,7 @@ UIConfiguration::parameter_changed (string param)
 void
 UIConfiguration::reset_gtk_theme ()
 {
+	LocaleGuard lg;
 	stringstream ss;
 
 	ss << "gtk_color_scheme = \"" << hex;
@@ -214,7 +218,7 @@ UIConfiguration::pre_gui_init ()
 UIConfiguration*
 UIConfiguration::post_gui_init ()
 {
-	load_color_theme ();
+	load_color_theme (true);
 	return this;
 }
 
@@ -248,59 +252,108 @@ UIConfiguration::load_defaults ()
 	if (ret == 0) {
 		/* reload color theme */
 		load_color_theme (false);
-		ColorsChanged (); /* EMIT SIGNAL */
 	}
 
 	return ret;
 }
 
+std::string
+UIConfiguration::color_file_name (bool use_my, bool with_version) const
+{
+	string basename;
+
+	if (use_my) {
+		basename += "my-";
+	}
+
+	//this is the overall theme file, e.g. "dark" plus "-downcase(PROGRAM_NAME)"
+	basename += color_file.get();  
+
+	std::string rev (revision);
+	std::size_t pos = rev.find_first_of("-");
+
+	if (with_version && pos != string::npos && pos > 0) {
+		basename += "-";
+		basename += rev.substr (0, pos); // COLORFILE_VERSION - program major.minor
+	}
+
+	basename += color_file_suffix;
+	return basename;
+}
+
+int
+UIConfiguration::load_color_file (string const & path)
+{
+	XMLTree tree;
+
+	info << string_compose (_("Loading color file %1"), path) << endmsg;
+
+	if (!tree.read (path.c_str())) {
+		error << string_compose(_("cannot read color file \"%1\""), path) << endmsg;
+		return -1;
+	}
+
+	if (set_state (*tree.root(), Stateful::loading_state_version)) {
+		error << string_compose(_("color file \"%1\" not loaded successfully."), path) << endmsg;
+		return -1;
+	}
+
+	return 0;
+}
+
 int
 UIConfiguration::load_color_theme (bool allow_own)
 {
 	std::string cfile;
-	string basename;
 	bool found = false;
+	/* ColorsChanged() will trigger a  parameter_changed () which
+	 * in turn calls save_state()
+	 */
+	PBD::Unwinder<uint32_t> uw (block_save, block_save + 1);
 
-	if (allow_own) {
-		basename = "my-";
-		basename += color_file.get();
-		basename += ".colors";
+	if (find_file (theme_search_path(), color_file_name (false, true), cfile)) {
+		found = true;
+	}
 
-		if (find_file (ardour_config_search_path(), basename, cfile)) {
+	if (!found) {
+		if (find_file (theme_search_path(), color_file_name (false, false), cfile)) {
 			found = true;
 		}
 	}
 
 	if (!found) {
-		basename = color_file.get();
-		basename += ".colors";
-
-		if (find_file (ardour_config_search_path(), basename, cfile)) {
-			found = true;
-		}
+		warning << string_compose (_("Color file for %1 not found along %2"), color_file.get(), theme_search_path().to_string()) << endmsg;
+		return -1;
 	}
 
-	if (found) {
+	(void) load_color_file (cfile);
 
-		XMLTree tree;
+	if (allow_own) {
 
-		info << string_compose (_("Loading color file %1"), cfile) << endmsg;
+		found = false;
 
-		if (!tree.read (cfile.c_str())) {
-			error << string_compose(_("cannot read color file \"%1\""), cfile) << endmsg;
-			return -1;
+		PBD::Searchpath sp (user_config_directory());
+
+		/* user's own color files never have the program name in them */
+
+		if (find_file (sp, color_file_name (true, true), cfile)) {
+			found = true;
 		}
 
-		if (set_state (*tree.root(), Stateful::loading_state_version)) {
-			error << string_compose(_("color file \"%1\" not loaded successfully."), cfile) << endmsg;
-			return -1;
+		if (!found) {
+			if (find_file (sp, color_file_name (true, false), cfile)) {
+				found = true;
+			}
+		}
+
+		if (found) {
+			(void) load_color_file (cfile);
 		}
 
-		ColorsChanged ();
-	} else {
-		warning << string_compose (_("Color file %1 not found"), basename) << endmsg;
 	}
 
+	ColorsChanged ();
+
 	return 0;
 }
 
@@ -308,7 +361,7 @@ int
 UIConfiguration::store_color_theme ()
 {
 	XMLNode* root;
-	LocaleGuard lg (X_("C"));
+	LocaleGuard lg;
 
 	root = new XMLNode("Ardour");
 
@@ -342,7 +395,7 @@ UIConfiguration::store_color_theme ()
 	root->add_child_nocopy (*parent);
 
 	XMLTree tree;
-	std::string colorfile = Glib::build_filename (user_config_directory(), (string ("my-") + color_file.get() + ".colors"));
+	std::string colorfile = Glib::build_filename (user_config_directory(), color_file_name (true, true));;
 
 	tree.set_root (root);
 
@@ -357,6 +410,7 @@ UIConfiguration::store_color_theme ()
 int
 UIConfiguration::load_state ()
 {
+	LocaleGuard lg; // a single guard for all 3 configs
 	bool found = false;
 
 	std::string rcfile;
@@ -407,6 +461,9 @@ UIConfiguration::load_state ()
 int
 UIConfiguration::save_state()
 {
+	if (block_save != 0) {
+		return -1;
+	}
 
 	if (_dirty) {
 		std::string rcfile = Glib::build_filename (user_config_directory(), ui_config_file_name);
@@ -443,7 +500,7 @@ XMLNode&
 UIConfiguration::get_state ()
 {
 	XMLNode* root;
-	LocaleGuard lg (X_("C"));
+	LocaleGuard lg;
 
 	root = new XMLNode("Ardour");
 
@@ -461,7 +518,7 @@ XMLNode&
 UIConfiguration::get_variables (std::string which_node)
 {
 	XMLNode* node;
-	LocaleGuard lg (X_("C"));
+	LocaleGuard lg;
 
 	node = new XMLNode (which_node);
 
@@ -480,6 +537,7 @@ UIConfiguration::get_variables (std::string which_node)
 int
 UIConfiguration::set_state (const XMLNode& root, int /*version*/)
 {
+	LocaleGuard lg;
 	/* this can load a generic UI configuration file or a colors file */
 
 	if (root.name() != "Ardour") {
@@ -531,17 +589,16 @@ UIConfiguration::load_color_aliases (XMLNode const & node)
 	XMLProperty const *name;
 	XMLProperty const *alias;
 
-	color_aliases.clear ();
-
 	for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
-		if ((*niter)->name() != X_("ColorAlias")) {
+		XMLNode const * child = *niter;
+		if (child->name() != X_("ColorAlias")) {
 			continue;
 		}
-		name = (*niter)->property (X_("name"));
-		alias = (*niter)->property (X_("alias"));
+		name = child->property (X_("name"));
+		alias = child->property (X_("alias"));
 
 		if (name && alias) {
-			color_aliases.insert (make_pair (name->value(), alias->value()));
+			color_aliases[name->value()] = alias->value();
 		}
 	}
 }
@@ -554,19 +611,23 @@ UIConfiguration::load_colors (XMLNode const & node)
 	XMLProperty const *name;
 	XMLProperty const *color;
 
-	colors.clear ();
+	/* don't clear colors, so that we can load > 1 color file and have
+	   the subsequent ones overwrite the later ones.
+	*/
 
 	for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
-		if ((*niter)->name() != X_("Color")) {
+		XMLNode const * child = *niter;
+		if (child->name() != X_("Color")) {
 			continue;
 		}
-		name = (*niter)->property (X_("name"));
-		color = (*niter)->property (X_("value"));
+		name = child->property (X_("name"));
+		color = child->property (X_("value"));
 
 		if (name && color) {
 			ArdourCanvas::Color c;
 			c = strtoul (color->value().c_str(), 0, 16);
-			colors.insert (make_pair (name->value(), c));
+			/* insert or replace color name definition */
+			colors[name->value()] =  c;
 		}
 	}
 }
@@ -574,25 +635,24 @@ UIConfiguration::load_colors (XMLNode const & node)
 void
 UIConfiguration::load_modifiers (XMLNode const & node)
 {
-	PBD::LocaleGuard lg ("C");
+	PBD::LocaleGuard lg;
 	XMLNodeList const nlist = node.children();
 	XMLNodeConstIterator niter;
 	XMLProperty const *name;
 	XMLProperty const *mod;
 
-	modifiers.clear ();
-
 	for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
-		if ((*niter)->name() != X_("Modifier")) {
+		XMLNode const * child = *niter;
+		if (child->name() != X_("Modifier")) {
 			continue;
 		}
 
-		name = (*niter)->property (X_("name"));
-		mod = (*niter)->property (X_("modifier"));
+		name = child->property (X_("name"));
+		mod = child->property (X_("modifier"));
 
 		if (name && mod) {
 			SVAModifier svam (mod->value());
-			modifiers.insert (make_pair (name->value(), svam));
+			modifiers[name->value()] = svam;
 		}
 	}
 }
@@ -737,5 +797,3 @@ UIConfiguration::load_rc_file (bool themechange, bool allow_own)
 
 	Gtkmm2ext::UI::instance()->load_rcfile (rc_file_path, themechange);
 }
-
-
diff --git a/gtk2_ardour/ui_config.h b/gtk2_ardour/ui_config.h
index 06338aa..559c86a 100644
--- a/gtk2_ardour/ui_config.h
+++ b/gtk2_ardour/ui_config.h
@@ -46,18 +46,22 @@ private:
     public:
 	static UIConfiguration& instance();
 
+	static std::string color_file_suffix;
+
 	void load_rc_file (bool themechange, bool allow_own = true);
 
 	int load_state ();
 	int save_state ();
 	int load_defaults ();
-	int load_color_theme (bool allow_own=true);
+	int load_color_theme (bool allow_own);
 
 	int set_state (const XMLNode&, int version);
 	XMLNode& get_state (void);
 	XMLNode& get_variables (std::string);
 	void set_variables (const XMLNode&);
 
+	std::string  color_file_name (bool use_my, bool with_version) const;
+
 	typedef std::map<std::string,ArdourCanvas::Color> Colors;
 	typedef std::map<std::string,std::string> ColorAliases;
 	typedef std::map<std::string,ArdourCanvas::SVAModifier> Modifiers;
@@ -133,15 +137,15 @@ private:
 	bool colors_modified;
 	bool modifiers_modified;
 
-	int store_color_theme ();
+	int  store_color_theme ();
 	void load_color_aliases (XMLNode const &);
 	void load_colors (XMLNode const &);
 	void load_modifiers (XMLNode const &);
 	void reset_gtk_theme ();
+	int  load_color_file (std::string const &);
 	void colors_changed ();
 
 	uint32_t block_save;
 };
 
 #endif /* __ardour_ui_configuration_h__ */
-
diff --git a/gtk2_ardour/ui_config_vars.h b/gtk2_ardour/ui_config_vars.h
index e512fe3..e6cd3c1 100644
--- a/gtk2_ardour/ui_config_vars.h
+++ b/gtk2_ardour/ui_config_vars.h
@@ -35,7 +35,6 @@ UI_CONFIG_VARIABLE (std::string, keyboard_layout, "keyboard-layout", "ansi")
 UI_CONFIG_VARIABLE (std::string, keyboard_layout_name, "keyboard-layout-name", "ansi")
 UI_CONFIG_VARIABLE (std::string, default_bindings, "default-bindings", "ardour")
 UI_CONFIG_VARIABLE (bool, only_copy_imported_files, "only-copy-imported-files", false)
-UI_CONFIG_VARIABLE (bool, keep_tearoffs, "keep-tearoffs", true)
 UI_CONFIG_VARIABLE (bool, default_narrow_ms, "default-narrow_ms", false)
 UI_CONFIG_VARIABLE (bool, name_new_markers, "name-new-markers", false)
 UI_CONFIG_VARIABLE (bool, rubberbanding_snaps_to_grid, "rubberbanding-snaps-to-grid", false)
@@ -59,6 +58,7 @@ UI_CONFIG_VARIABLE (bool, show_name_highlight, "show-name-highlight", false)
 UI_CONFIG_VARIABLE (bool, primary_clock_delta_edit_cursor, "primary-clock-delta-edit-cursor", false)
 UI_CONFIG_VARIABLE (bool, secondary_clock_delta_edit_cursor, "secondary-clock-delta-edit-cursor", false)
 UI_CONFIG_VARIABLE (bool, show_track_meters, "show-track-meters", true)
+UI_CONFIG_VARIABLE (bool, editor_stereo_only_meters, "editor-stereo-only-meters", false)
 UI_CONFIG_VARIABLE (bool, follow_edits, "follow-edits", false)
 UI_CONFIG_VARIABLE (bool, super_rapid_clock_update, "super-rapid-clock-update", false)
 UI_CONFIG_VARIABLE (bool, autoscroll_editor, "autoscroll-editor", true)
@@ -77,3 +77,10 @@ UI_CONFIG_VARIABLE (bool, buggy_gradients, "buggy-gradients", false)
 UI_CONFIG_VARIABLE (bool, cairo_image_surface, "cairo-image-surface", false)
 UI_CONFIG_VARIABLE (uint64_t, waveform_cache_size, "waveform-cache-size", 100) /* units of megagbytes */
 UI_CONFIG_VARIABLE (int32_t, recent_session_sort, "recent-session-sort", 0)
+UI_CONFIG_VARIABLE (bool, save_export_analysis_image, "save-export-analysis-image", false)
+UI_CONFIG_VARIABLE (std::string, xjadeo_binary, "xjadeo-binary", "")
+UI_CONFIG_VARIABLE (bool, open_gui_after_adding_plugin, "open-gui-after-adding-plugin", true)
+UI_CONFIG_VARIABLE (bool, show_inline_display_by_default, "show-inline-display-by-default", true)
+UI_CONFIG_VARIABLE (bool, prefer_inline_over_gui, "prefer-inline-over-gui", true)
+UI_CONFIG_VARIABLE (uint32_t, action_table_columns, "action-table-columns", 0)
+UI_CONFIG_VARIABLE (bool, use_wm_visibility, "use-wm-visibility", true)
diff --git a/gtk2_ardour/utils.cc b/gtk2_ardour/utils.cc
index 60498b9..26b048f 100644
--- a/gtk2_ardour/utils.cc
+++ b/gtk2_ardour/utils.cc
@@ -36,11 +36,14 @@
 #include <gtk/gtkpaned.h>
 #include <boost/algorithm/string.hpp>
 
+#include "pbd/basename.h"
 #include "pbd/file_utils.h"
+#include "pbd/stacktrace.h"
 
 #include <gtkmm2ext/utils.h>
 
 #include "ardour/filesystem_paths.h"
+#include "ardour/search_paths.h"
 
 #include "canvas/item.h"
 #include "canvas/utils.h"
@@ -49,11 +52,12 @@
 #include "public_editor.h"
 #include "keyboard.h"
 #include "utils.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
 #include "rgb_macros.h"
 #include "gui_thread.h"
 #include "ui_config.h"
 #include "ardour_dialog.h"
+#include "ardour_ui.h"
 
 using namespace std;
 using namespace Gtk;
@@ -260,6 +264,22 @@ ARDOUR_UI_UTILS::get_font_for_style (string widgetname)
 	return Pango::FontDescription (pfd); /* make a copy */
 }
 
+Gdk::Color
+ARDOUR_UI_UTILS::gdk_color_from_rgb (uint32_t rgb)
+{
+	Gdk::Color c;
+	set_color_from_rgb (c, rgb);
+	return c;
+}
+
+Gdk::Color
+ARDOUR_UI_UTILS::gdk_color_from_rgba (uint32_t rgba)
+{
+	Gdk::Color c;
+	set_color_from_rgb (c, rgba);
+	return c;
+}
+
 void
 ARDOUR_UI_UTILS::set_color_from_rgb (Gdk::Color& c, uint32_t rgb)
 {
@@ -293,33 +313,16 @@ ARDOUR_UI_UTILS::gdk_color_to_rgba (Gdk::Color const& c)
 	return RGBA_TO_UINT (r,g,b,a);
 }
 
-
 bool
 ARDOUR_UI_UTILS::relay_key_press (GdkEventKey* ev, Gtk::Window* win)
 {
-
-	if (!key_press_focus_accelerator_handler (*win, ev)) {
-		if (!PublicEditor::_instance) {
-			/* early key press in pre-main-window-dialogs, no editor yet */
-			return false;
-		}
-		PublicEditor& ed (PublicEditor::instance());
-		return ed.on_key_press_event(ev);
-	} else {
-		return true;
-	}
-}
-
-bool
-ARDOUR_UI_UTILS::forward_key_press (GdkEventKey* ev)
-{
-	return PublicEditor::instance().on_key_press_event(ev);
+	return ARDOUR_UI::instance()->key_event_handler (ev, win);
 }
 
 bool
-ARDOUR_UI_UTILS::emulate_key_event (Gtk::Widget* w, unsigned int keyval)
+ARDOUR_UI_UTILS::emulate_key_event (unsigned int keyval)
 {
-	GdkDisplay  *display = gtk_widget_get_display (GTK_WIDGET(w->gobj()));
+	GdkDisplay  *display = gtk_widget_get_display (GTK_WIDGET(ARDOUR_UI::instance()->main_window().gobj()));
 	GdkKeymap   *keymap  = gdk_keymap_get_for_display (display);
 	GdkKeymapKey *keymapkey = NULL;
 	gint n_keys;
@@ -327,9 +330,11 @@ ARDOUR_UI_UTILS::emulate_key_event (Gtk::Widget* w, unsigned int keyval)
 	if (!gdk_keymap_get_entries_for_keyval(keymap, keyval, &keymapkey, &n_keys)) return false;
 	if (n_keys !=1) { g_free(keymapkey); return false;}
 
+	Gtk::Window& main_window (ARDOUR_UI::instance()->main_window());
+
 	GdkEventKey ev;
 	ev.type = GDK_KEY_PRESS;
-	ev.window = gtk_widget_get_window(GTK_WIDGET(w->gobj()));
+	ev.window = main_window.get_window()->gobj();
 	ev.send_event = FALSE;
 	ev.time = 0;
 	ev.state = 0;
@@ -340,223 +345,9 @@ ARDOUR_UI_UTILS::emulate_key_event (Gtk::Widget* w, unsigned int keyval)
 	ev.group = keymapkey[0].group;
 	g_free(keymapkey);
 
-	forward_key_press(&ev);
+	relay_key_press (&ev, &main_window);
 	ev.type = GDK_KEY_RELEASE;
-	return forward_key_press(&ev);
-}
-
-static string
-show_gdk_event_state (int state)
-{
-	string s;
-	if (state & GDK_SHIFT_MASK) {
-		s += "+SHIFT";
-	}
-	if (state & GDK_LOCK_MASK) {
-		s += "+LOCK";
-	}
-	if (state & GDK_CONTROL_MASK) {
-		s += "+CONTROL";
-	}
-	if (state & GDK_MOD1_MASK) {
-		s += "+MOD1";
-	}
-	if (state & GDK_MOD2_MASK) {
-		s += "+MOD2";
-	}
-	if (state & GDK_MOD3_MASK) {
-		s += "+MOD3";
-	}
-	if (state & GDK_MOD4_MASK) {
-		s += "+MOD4";
-	}
-	if (state & GDK_MOD5_MASK) {
-		s += "+MOD5";
-	}
-	if (state & GDK_BUTTON1_MASK) {
-		s += "+BUTTON1";
-	}
-	if (state & GDK_BUTTON2_MASK) {
-		s += "+BUTTON2";
-	}
-	if (state & GDK_BUTTON3_MASK) {
-		s += "+BUTTON3";
-	}
-	if (state & GDK_BUTTON4_MASK) {
-		s += "+BUTTON4";
-	}
-	if (state & GDK_BUTTON5_MASK) {
-		s += "+BUTTON5";
-	}
-	if (state & GDK_SUPER_MASK) {
-		s += "+SUPER";
-	}
-	if (state & GDK_HYPER_MASK) {
-		s += "+HYPER";
-	}
-	if (state & GDK_META_MASK) {
-		s += "+META";
-	}
-	if (state & GDK_RELEASE_MASK) {
-		s += "+RELEASE";
-	}
-
-	return s;
-}
-bool
-ARDOUR_UI_UTILS::key_press_focus_accelerator_handler (Gtk::Window& window, GdkEventKey* ev)
-{
-	GtkWindow* win = window.gobj();
-	GtkWidget* focus = gtk_window_get_focus (win);
-	bool special_handling_of_unmodified_accelerators = false;
-	bool allow_activating = true;
-	/* consider all relevant modifiers but not LOCK or SHIFT */
-	const guint mask = (Keyboard::RelevantModifierKeyMask & ~(Gdk::SHIFT_MASK|Gdk::LOCK_MASK));
-        GdkModifierType modifier = GdkModifierType (ev->state);
-        modifier = GdkModifierType (modifier & gtk_accelerator_get_default_mod_mask());
-        Gtkmm2ext::possibly_translate_mod_to_make_legal_accelerator(modifier);
-
-	if (focus) {
-		if (GTK_IS_ENTRY(focus) || Keyboard::some_magic_widget_has_focus()) {
-			special_handling_of_unmodified_accelerators = true;
-		}
-	}
-
-#ifdef GTKOSX
-        /* at one time this appeared to be necessary. As of July 2012, it does not
-           appear to be. if it ever is necessar, figure out if it should apply
-           to all platforms.
-        */
-#if 0
-	if (Keyboard::some_magic_widget_has_focus ()) {
-                allow_activating = false;
-	}
-#endif
-#endif
-
-
-        DEBUG_TRACE (DEBUG::Accelerators, string_compose ("Win = %1 focus = %7 (%8) Key event: code = %2  state = %3 special handling ? %4 magic widget focus ? %5 allow_activation ? %6\n",
-                                                          win,
-                                                          ev->keyval,
-							  show_gdk_event_state (ev->state),
-                                                          special_handling_of_unmodified_accelerators,
-                                                          Keyboard::some_magic_widget_has_focus(),
-                                                          allow_activating,
-							  focus,
-                                                          (focus ? gtk_widget_get_name (focus) : "no focus widget")));
-
-	/* This exists to allow us to override the way GTK handles
-	   key events. The normal sequence is:
-
-	   a) event is delivered to a GtkWindow
-	   b) accelerators/mnemonics are activated
-	   c) if (b) didn't handle the event, propagate to
-	       the focus widget and/or focus chain
-
-	   The problem with this is that if the accelerators include
-	   keys without modifiers, such as the space bar or the
-	   letter "e", then pressing the key while typing into
-	   a text entry widget results in the accelerator being
-	   activated, instead of the desired letter appearing
-	   in the text entry.
-
-	   There is no good way of fixing this, but this
-	   represents a compromise. The idea is that
-	   key events involving modifiers (not Shift)
-	   get routed into the activation pathway first, then
-	   get propagated to the focus widget if necessary.
-
-	   If the key event doesn't involve modifiers,
-	   we deliver to the focus widget first, thus allowing
-	   it to get "normal text" without interference
-	   from acceleration.
-
-	   Of course, this can also be problematic: if there
-	   is a widget with focus, then it will swallow
-	   all "normal text" accelerators.
-	*/
-
-	if (!special_handling_of_unmodified_accelerators) {
-
-
-		/* XXX note that for a brief moment, the conditional above
-		 * included "|| (ev->state & mask)" so as to enforce the
-		 * implication of special_handling_of_UNMODIFIED_accelerators.
-		 * however, this forces any key that GTK doesn't allow and that
-		 * we have an alternative (see next comment) for to be
-		 * automatically sent through the accel groups activation
-		 * pathway, which prevents individual widgets & canvas items
-		 * from ever seeing it if is used by a key binding.
-		 *
-		 * specifically, this hid Ctrl-down-arrow from MIDI region
-		 * views because it is also bound to an action.
-		 *
-		 * until we have a robust, clean binding system, this
-		 * quirk will have to remain in place.
-		 */
-
-		/* pretend that certain key events that GTK does not allow
-		   to be used as accelerators are actually something that
-		   it does allow. but only where there are no modifiers.
-		*/
-
-		uint32_t fakekey = ev->keyval;
-
-		if (Gtkmm2ext::possibly_translate_keyval_to_make_legal_accelerator (fakekey)) {
-			DEBUG_TRACE (DEBUG::Accelerators, string_compose ("\tactivate (was %1 now %2) without special hanlding of unmodified accels\n",
-									  ev->keyval, fakekey));
-
-			DEBUG_TRACE (DEBUG::Accelerators, string_compose ("\tmodified modifier was %1\n", show_gdk_event_state (modifier)));
-
-			if (allow_activating && gtk_accel_groups_activate(G_OBJECT(win), fakekey, modifier)) {
-				DEBUG_TRACE (DEBUG::Accelerators, "\taccel group activated by fakekey\n");
-				return true;
-			}
-		}
-	}
-
-	if (!special_handling_of_unmodified_accelerators || (ev->state & mask)) {
-
-		/* no special handling or there are modifiers in effect: accelerate first */
-
-                DEBUG_TRACE (DEBUG::Accelerators, "\tactivate, then propagate\n");
-		DEBUG_TRACE (DEBUG::Accelerators, string_compose ("\tevent send-event:%1 time:%2 length:%3 name %7 string:%4 hardware_keycode:%5 group:%6\n",
-								  ev->send_event, ev->time, ev->length, ev->string, ev->hardware_keycode, ev->group, gdk_keyval_name (ev->keyval)));
-
-		if (allow_activating) {
-			DEBUG_TRACE (DEBUG::Accelerators, "\tsending to window\n");
-                        if (gtk_accel_groups_activate (G_OBJECT(win), ev->keyval, modifier)) {
-                                DEBUG_TRACE (DEBUG::Accelerators, "\t\thandled\n");
-				return true;
-			}
-		} else {
-			DEBUG_TRACE (DEBUG::Accelerators, "\tactivation skipped\n");
-		}
-
-                DEBUG_TRACE (DEBUG::Accelerators, "\tnot accelerated, now propagate\n");
-
-		return gtk_window_propagate_key_event (win, ev);
-	}
-
-	/* no modifiers, propagate first */
-
-        DEBUG_TRACE (DEBUG::Accelerators, "\tpropagate, then activate\n");
-
-	if (!gtk_window_propagate_key_event (win, ev)) {
-                DEBUG_TRACE (DEBUG::Accelerators, "\tpropagation didn't handle, so activate\n");
-		if (allow_activating) {
-			return gtk_accel_groups_activate (G_OBJECT(win), ev->keyval, modifier);
-		} else {
-			DEBUG_TRACE (DEBUG::Accelerators, "\tactivation skipped\n");
-		}
-
-	} else {
-                DEBUG_TRACE (DEBUG::Accelerators, "\thandled by propagate\n");
-		return true;
-	}
-
-        DEBUG_TRACE (DEBUG::Accelerators, "\tnot handled\n");
-	return true;
+	return relay_key_press(&ev, &main_window);
 }
 
 Glib::RefPtr<Gdk::Pixbuf>
@@ -584,6 +375,39 @@ ARDOUR_UI_UTILS::get_xpm (std::string name)
 	return xpm_map[name];
 }
 
+void
+ARDOUR_UI_UTILS::get_color_themes (map<std::string,std::string>& themes)
+{
+	Searchpath spath(ARDOUR::theme_search_path());
+
+	for (vector<string>::iterator s = spath.begin(); s != spath.end(); ++s) {
+
+		vector<string> entries;
+
+		find_files_matching_pattern (entries, *s, string ("*") + UIConfiguration::color_file_suffix);
+
+		for (vector<string>::iterator e = entries.begin(); e != entries.end(); ++e) {
+
+			XMLTree tree;
+
+			tree.read ((*e).c_str());
+			XMLNode* root = tree.root();
+
+			if (!root || root->name() != X_("Ardour")) {
+				continue;
+			}
+
+			XMLProperty const* prop = root->property (X_("theme-name"));
+
+			if (!prop) {
+				continue;
+			}
+
+			themes.insert (make_pair (prop->value(), Glib::filename_to_utf8 (basename_nosuffix(*e))));
+		}
+	}
+}
+
 vector<string>
 ARDOUR_UI_UTILS::get_icon_sets ()
 {
@@ -633,6 +457,12 @@ ARDOUR_UI_UTILS::get_icon_path (const char* cname, string icon_set, bool is_imag
 		find_file (spath, name, data_file_path);
 	}
 
+	if (data_file_path.empty()) {
+		Searchpath rc (ARDOUR::ardour_data_search_path());
+		rc.add_subdirectory_to_paths ("resources");
+		find_file (rc, name, data_file_path);
+	}
+
 	if (is_image && data_file_path.empty()) {
 
 		if (!icon_set.empty() && icon_set != _("default")) {
@@ -828,20 +658,10 @@ ARDOUR_UI_UTILS::escape_underscores (string const & s)
 	return o;
 }
 
-/** Replace < and > with < and > respectively to make < > display correctly in markup strings */
-string
-ARDOUR_UI_UTILS::escape_angled_brackets (string const & s)
-{
-	string o = s;
-	boost::replace_all (o, "<", "<");
-	boost::replace_all (o, ">", ">");
-	return o;
-}
-
 Gdk::Color
 ARDOUR_UI_UTILS::unique_random_color (list<Gdk::Color>& used_colors)
 {
-  	Gdk::Color newcolor;
+	Gdk::Color newcolor;
 
 	while (1) {
 
@@ -947,3 +767,10 @@ ARDOUR_UI_UTILS::overwrite_file_dialog (Gtk::Window& parent, string title, strin
 		return false;
 	}
 }
+
+bool
+ARDOUR_UI_UTILS::running_from_source_tree ()
+{
+	gchar const *x = g_getenv ("ARDOUR_THEMES_PATH");
+	return x && (string (x).find ("gtk2_ardour") != string::npos);
+}
diff --git a/gtk2_ardour/utils.h b/gtk2_ardour/utils.h
index c6df938..590d817 100644
--- a/gtk2_ardour/utils.h
+++ b/gtk2_ardour/utils.h
@@ -23,6 +23,7 @@
 #include <string>
 #include <cmath>
 #include <vector>
+#include <map>
 
 #include "ardour/types.h"
 
@@ -39,7 +40,6 @@ namespace PBD {
 namespace Gtk {
 	class Window;
 	class ComboBoxText;
-	class Paned;
         class Adjustment;
 }
 
@@ -62,18 +62,22 @@ Pango::FontDescription get_font_for_style (std::string widgetname);
 
 void decorate (Gtk::Window& w, Gdk::WMDecoration d);
 
+Gdk::Color gdk_color_from_rgb (uint32_t);
+Gdk::Color gdk_color_from_rgba (uint32_t);
+uint32_t gdk_color_to_rgba (Gdk::Color const&);
+
 void set_color_from_rgb (Gdk::Color&, uint32_t);
 void set_color_from_rgba (Gdk::Color&, uint32_t);
-uint32_t gdk_color_to_rgba (Gdk::Color const&);
+
 uint32_t contrasting_text_color (uint32_t c);
 
 bool relay_key_press (GdkEventKey* ev, Gtk::Window* win);
-bool forward_key_press (GdkEventKey* ev);
 bool key_press_focus_accelerator_handler (Gtk::Window& window, GdkEventKey* ev);
-bool emulate_key_event (Gtk::Widget*, unsigned int);
+bool emulate_key_event (unsigned int);
 
 Glib::RefPtr<Gdk::Pixbuf> get_xpm (std::string);
 std::vector<std::string> get_icon_sets ();
+void get_color_themes (std::map<std::string,std::string>&);
 std::string get_icon_path (const char*, std::string icon_set = std::string(), bool is_image = true);
 Glib::RefPtr<Gdk::Pixbuf> get_icon (const char*, std::string icon_set = std::string());
 static std::map<std::string, Glib::RefPtr<Gdk::Pixbuf> > xpm_map;
@@ -84,7 +88,6 @@ bool key_is_legal_for_numeric_entry (guint keyval);
 void resize_window_to_proportion_of_monitor (Gtk::Window*, int, int);
 
 std::string escape_underscores (std::string const &);
-std::string escape_angled_brackets (std::string const &);
 
 Gdk::Color unique_random_color (std::list<Gdk::Color> &);
 
@@ -93,6 +96,7 @@ std::string rate_as_string (float r);
 bool windows_overlap (Gtk::Window *a, Gtk::Window *b);
 
 bool overwrite_file_dialog (Gtk::Window& parent, std::string title, std::string text);
+bool running_from_source_tree ();
 
 } // namespace
 #endif /* __ardour_gtk_utils_h__ */
diff --git a/gtk2_ardour/utils_videotl.cc b/gtk2_ardour/utils_videotl.cc
index b62ac94..684bbf9 100644
--- a/gtk2_ardour/utils_videotl.cc
+++ b/gtk2_ardour/utils_videotl.cc
@@ -21,14 +21,16 @@
 #include <string>
 #include <cerrno>
 #include <gtkmm.h>
-#include <curl/curl.h>
 
 #include "pbd/error.h"
+
 #include "ardour/ardour.h"
 #include "ardour/session_directory.h"
-#include "video_image_frame.h"
-#include "utils_videotl.h"
+
+#include "ardour_http.h"
 #include "utils.h"
+#include "utils_videotl.h"
+#include "video_image_frame.h"
 
 #ifdef WAF_BUILD
 #include "gtk2ardour-version.h"
@@ -37,7 +39,7 @@
 #ifndef ARDOUR_CURL_TIMEOUT
 #define ARDOUR_CURL_TIMEOUT (60)
 #endif
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace Gtk;
 using namespace std;
@@ -264,14 +266,13 @@ VideoUtils::video_query_info (
 			, video_server_url.c_str()
 			, (video_server_url.length()>0 && video_server_url.at(video_server_url.length()-1) == '/')?"":"/"
 			, filepath.c_str());
-	char *res = a3_curl_http_get(url, NULL);
-	if (!res) {
+	std::string res = ArdourCurl::http_get (url);
+	if (res.empty ()) {
 		return false;
 	}
 
 	std::vector<std::vector<std::string> > lines;
-	ParseCSV(std::string(res), lines);
-	free(res);
+	ParseCSV(res, lines);
 
 	if (lines.empty() || lines.at(0).empty() || lines.at(0).size() != 6) {
 		return false;
@@ -308,70 +309,3 @@ VideoUtils::video_draw_cross (Glib::RefPtr<Gdk::Pixbuf> img)
 	}
 }
 
-
-extern "C" {
-#include <curl/curl.h>
-
-	struct A3MemoryStruct {
-		char *data;
-		size_t size;
-	};
-
-	static size_t
-	WriteMemoryCallback(void *ptr, size_t size, size_t nmemb, void *data) {
-		size_t realsize = size * nmemb;
-		struct A3MemoryStruct *mem = (struct A3MemoryStruct *)data;
-
-		mem->data = (char *)realloc(mem->data, mem->size + realsize + 1);
-		if (mem->data) {
-			memcpy(&(mem->data[mem->size]), ptr, realsize);
-			mem->size += realsize;
-			mem->data[mem->size] = 0;
-		}
-		return realsize;
-	}
-
-	char *a3_curl_http_get (const char *u, int *status) {
-		CURL *curl;
-		CURLcode res;
-		struct A3MemoryStruct chunk;
-		long int httpstatus;
-		if (status) *status = 0;
-		//Glib::usleep(500000); return NULL; // TEST & DEBUG
-		if (strncmp("http://", u, 7)) return NULL;
-
-		chunk.data=NULL;
-		chunk.size=0;
-
-		curl = curl_easy_init();
-		if(!curl) return NULL;
-		curl_easy_setopt(curl, CURLOPT_URL, u);
-
-		curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk);
-		curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
-		curl_easy_setopt(curl, CURLOPT_USERAGENT, PROGRAM_NAME VERSIONSTRING);
-		curl_easy_setopt(curl, CURLOPT_TIMEOUT, ARDOUR_CURL_TIMEOUT);
-		curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);
-#ifdef CURLERRORDEBUG
-		char curlerror[CURL_ERROR_SIZE] = "";
-		curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, curlerror);
-#endif
-
-		res = curl_easy_perform(curl);
-		curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &httpstatus);
-		curl_easy_cleanup(curl);
-		if (status) *status = httpstatus;
-		if (res) {
-#ifdef CURLERRORDEBUG
-			printf("a3_curl_http_get() failed: %s\n", curlerror);
-#endif
-			return NULL;
-		}
-		if (httpstatus != 200) {
-			free (chunk.data);
-			chunk.data = NULL;
-		}
-		return (chunk.data);
-	}
-
-} /* end extern "C" */
diff --git a/gtk2_ardour/utils_videotl.h b/gtk2_ardour/utils_videotl.h
index a7d0908..40425fc 100644
--- a/gtk2_ardour/utils_videotl.h
+++ b/gtk2_ardour/utils_videotl.h
@@ -56,8 +56,4 @@ bool video_query_info (
 		);
 };
 
-extern "C" {
-	char *a3_curl_http_get (const char *u, int *status);
-}
-
 #endif /* __gtk_ardour_video_utils_h__ */
diff --git a/gtk2_ardour/vca_master_strip.cc b/gtk2_ardour/vca_master_strip.cc
new file mode 100644
index 0000000..8363f6d
--- /dev/null
+++ b/gtk2_ardour/vca_master_strip.cc
@@ -0,0 +1,512 @@
+/*
+    Copyright (C) 2016 Paul Davis
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#include <gtkmm/stock.h>
+#include <gtkmm/colorselection.h>
+
+#include "pbd/convert.h"
+
+#include "ardour/rc_configuration.h"
+#include "ardour/session.h"
+#include "ardour/vca.h"
+#include "ardour/vca_manager.h"
+
+#include "gtkmm2ext/doi.h"
+#include "gtkmm2ext/keyboard.h"
+
+#include "ardour_dialog.h"
+#include "floating_text_entry.h"
+#include "gui_thread.h"
+#include "mixer_ui.h"
+#include "tooltips.h"
+#include "ui_config.h"
+#include "utils.h"
+#include "vca_master_strip.h"
+
+#include "pbd/i18n.h"
+
+using namespace ARDOUR;
+using namespace ARDOUR_UI_UTILS;
+using namespace Gtkmm2ext;
+using namespace Gtk;
+using namespace PBD;
+using std::string;
+
+PBD::Signal1<void,VCAMasterStrip*> VCAMasterStrip::CatchDeletion;
+
+VCAMasterStrip::VCAMasterStrip (Session* s, boost::shared_ptr<VCA> v)
+	: SessionHandlePtr (s)
+	, _vca (v)
+	, gain_meter (s, 254) /* magic number, don't adjust blindly */
+	, context_menu (0)
+	, delete_dialog (0)
+	, control_slave_ui (s)
+{
+	/* set color for the VCA, if not already done. */
+
+	if (!_vca->presentation_info().color_set()) {
+		_vca->presentation_info().set_color (gdk_color_to_rgba (unique_random_color()));
+	}
+
+	control_slave_ui.set_stripable (boost::dynamic_pointer_cast<Stripable> (v));
+
+	gain_meter.set_controls (boost::shared_ptr<Route>(),
+	                         boost::shared_ptr<PeakMeter>(),
+	                         boost::shared_ptr<Amp>(),
+	                         _vca->gain_control());
+
+	solo_button.set_name ("solo button");
+	set_tooltip (solo_button, _("Solo slaves"));
+	solo_button.signal_button_release_event().connect (sigc::mem_fun (*this, &VCAMasterStrip::solo_release), false);
+
+	mute_button.set_name ("mute button");
+	mute_button.set_text (_("M"));
+	set_tooltip (mute_button, _("Mute slaves"));
+	mute_button.signal_button_release_event().connect (sigc::mem_fun (*this, &VCAMasterStrip::mute_release), false);
+
+	hide_button.set_icon (ArdourIcon::CloseCross);
+	set_tooltip (&hide_button, _("Hide this VCA strip"));
+
+	hide_button.signal_clicked.connect (sigc::mem_fun(*this, &VCAMasterStrip::hide_clicked));
+
+	solo_mute_box.set_spacing (2);
+	solo_mute_box.pack_start (mute_button, true, true);
+	solo_mute_box.pack_start (solo_button, true, true);
+
+	number_label.set_text (to_string (v->number(), std::dec));
+	number_label.set_elements((ArdourButton::Element)(ArdourButton::Edge|ArdourButton::Body|ArdourButton::Text|ArdourButton::Inactive));
+	number_label.set_no_show_all ();
+	number_label.set_name ("generic button");
+	number_label.set_alignment (.5, .5);
+	number_label.set_fallthrough_to_parent (true);
+
+	bottom_padding.set_size_request (-1, 55); /* this one is a hack. there's no trivial way to compute it */
+
+	//Glib::RefPtr<Pango::Layout> layout = vertical_button.get_layout ();
+	// layout->set_justify (JUSTIFY_CENTER);
+	/* horizontally centered, with a little space (5%) at the top */
+	vertical_button.set_angle (90);
+	vertical_button.set_layout_font (UIConfiguration::instance().get_NormalBoldFont());
+	vertical_button.signal_button_release_event().connect (sigc::mem_fun (*this, &VCAMasterStrip::vertical_button_press));
+	vertical_button.set_fallthrough_to_parent (true);
+	vertical_button.set_active_color (_vca->presentation_info().color ());
+	set_tooltip (vertical_button, _("Click to show slaves only")); /* tooltip updated dynamically */
+
+	global_vpacker.set_border_width (1);
+	global_vpacker.set_spacing (0);
+
+	global_vpacker.pack_start (number_label, false, false);
+	global_vpacker.pack_start (hide_button, false, false);
+	global_vpacker.pack_start (vertical_button, true, true);
+	global_vpacker.pack_start (solo_mute_box, false, false);
+	global_vpacker.pack_start (gain_meter, false, false, 2);
+	global_vpacker.pack_start (control_slave_ui, false, false);
+	global_vpacker.pack_start (bottom_padding, false, false);
+
+	global_frame.add (global_vpacker);
+	global_frame.set_shadow_type (Gtk::SHADOW_IN);
+	global_frame.set_name ("BaseFrame");
+
+	add (global_frame);
+
+	global_vpacker.show ();
+	global_frame.show ();
+	top_padding.show ();
+	bottom_padding.show ();
+	vertical_button.show ();
+	hide_button.show ();
+	number_label.show ();
+	gain_meter.show ();
+	solo_mute_box.show_all ();
+	control_slave_ui.show ();
+
+	/* force setting of visible selected status */
+
+	_selected = true;
+	set_selected (false);
+	set_solo_text ();
+	update_vca_name ();
+	solo_changed ();
+	mute_changed ();
+	spill_change (boost::shared_ptr<VCA>());
+
+	Mixer_UI::instance()->show_vca_change.connect (sigc::mem_fun (*this, &VCAMasterStrip::spill_change));
+
+	_vca->PropertyChanged.connect (vca_connections, invalidator (*this), boost::bind (&VCAMasterStrip::vca_property_changed, this, _1), gui_context());
+	_vca->presentation_info().PropertyChanged.connect (vca_connections, invalidator (*this), boost::bind (&VCAMasterStrip::vca_property_changed, this, _1), gui_context());
+	_vca->DropReferences.connect (vca_connections, invalidator (*this), boost::bind (&VCAMasterStrip::self_delete, this), gui_context());
+
+	_vca->solo_control()->Changed.connect (vca_connections, invalidator (*this), boost::bind (&VCAMasterStrip::solo_changed, this), gui_context());
+	_vca->mute_control()->Changed.connect (vca_connections, invalidator (*this), boost::bind (&VCAMasterStrip::mute_changed, this), gui_context());
+
+
+	s->config.ParameterChanged.connect (*this, invalidator (*this), boost::bind (&VCAMasterStrip::parameter_changed, this, _1), gui_context());
+	Config->ParameterChanged.connect (*this, invalidator (*this), boost::bind (&VCAMasterStrip::parameter_changed, this, _1), gui_context());
+	UIConfiguration::instance().ParameterChanged.connect (sigc::mem_fun (*this, &VCAMasterStrip::parameter_changed));
+}
+
+VCAMasterStrip::~VCAMasterStrip ()
+{
+	if ((_session && !_session->deletion_in_progress()) && Mixer_UI::instance()->showing_vca_slaves_for (_vca)) {
+		/* cancel spill for this VCA */
+		Mixer_UI::instance()->show_vca_slaves (boost::shared_ptr<VCA>());
+	}
+
+	delete delete_dialog;
+	delete context_menu;
+
+	CatchDeletion (this); /* EMIT SIGNAL */
+}
+
+void
+VCAMasterStrip::self_delete ()
+{
+	if ((_session && !_session->deletion_in_progress()) && Mixer_UI::instance()->showing_vca_slaves_for (_vca)) {
+		/* cancel spill for this VCA */
+		Mixer_UI::instance()->show_vca_slaves (boost::shared_ptr<VCA>());
+	}
+	/* Drop reference immediately, delete self when idle */
+	_vca.reset ();
+	delete_when_idle (this);
+}
+
+void
+VCAMasterStrip::parameter_changed (std::string const & p)
+{
+	if (p == "use-monitor-bus" || p == "solo-control-is-listen-control" || p == "listen-position") {
+		set_button_names ();
+	}
+}
+
+void
+VCAMasterStrip::set_button_names ()
+{
+	if (Config->get_solo_control_is_listen_control()) {
+		switch (Config->get_listen_position()) {
+		case AfterFaderListen:
+			solo_button.set_text (S_("AfterFader|A"));
+			set_tooltip (solo_button, _("After-fade listen (AFL)"));
+			break;
+		case PreFaderListen:
+			solo_button.set_text (S_("PreFader|P"));
+			set_tooltip (solo_button, _("Pre-fade listen (PFL)"));
+			break;
+		}
+	} else {
+		solo_button.set_text (S_("Solo|S"));
+		set_tooltip (solo_button, _("Solo"));
+	}
+}
+
+string
+VCAMasterStrip::name() const
+{
+	return _vca->name();
+}
+
+void
+VCAMasterStrip::hide_clicked ()
+{
+	_vca->presentation_info().set_hidden (true);
+}
+
+void
+VCAMasterStrip::hide_confirmation (int response)
+{
+	delete_dialog->hide ();
+
+	switch (response) {
+	case RESPONSE_YES:
+		/* get everything to deassign. This will also delete ourselves (when
+		 * idle) and that in turn will remove us from the Mixer GUI
+		 */
+		_session->vca_manager().remove_vca (_vca);
+		break;
+	default:
+		break;
+	}
+}
+
+bool
+VCAMasterStrip::width_button_pressed (GdkEventButton* ev)
+{
+	return false;
+}
+
+void
+VCAMasterStrip::set_selected (bool yn)
+{
+	AxisView::set_selected (yn);
+
+	if (_selected) {
+		global_frame.set_shadow_type (Gtk::SHADOW_ETCHED_OUT);
+		global_frame.set_name ("MixerStripSelectedFrame");
+	} else {
+		global_frame.set_shadow_type (Gtk::SHADOW_IN);
+		global_frame.set_name ("MixerStripFrame");
+	}
+
+	global_frame.queue_draw ();
+}
+
+bool
+VCAMasterStrip::solo_release (GdkEventButton*)
+{
+	/* We use NoGroup because VCA controls are never part of a group. This
+	   is redundant, but clear.
+	*/
+	_vca->solo_control()->set_value (_vca->solo_control()->self_soloed() ? 0.0 : 1.0, Controllable::NoGroup);
+	return true;
+}
+
+bool
+VCAMasterStrip::mute_release (GdkEventButton*)
+{
+	/* We use NoGroup because VCA controls are never part of a group. This
+	   is redundant, but clear.
+	*/
+	_vca->mute_control()->set_value (_vca->mute_control()->muted_by_self() ? 0.0 : 1.0, Controllable::NoGroup);
+	return true;
+}
+
+void
+VCAMasterStrip::set_solo_text ()
+{
+	if (Config->get_solo_control_is_listen_control ()) {
+		switch (Config->get_listen_position()) {
+		case AfterFaderListen:
+			solo_button.set_text (_("A"));
+			break;
+		case PreFaderListen:
+			solo_button.set_text (_("P"));
+			break;
+			}
+	} else {
+		solo_button.set_text (_("S"));
+	}
+}
+
+void
+VCAMasterStrip::mute_changed ()
+{
+	if (_vca->mute_control()->muted_by_self()) {
+		mute_button.set_active_state (ExplicitActive);
+	} else if (_vca->mute_control()->muted_by_masters ()) {
+		mute_button.set_active_state (ImplicitActive);
+	} else {
+		mute_button.set_active_state (Gtkmm2ext::Off);
+	}
+}
+
+void
+VCAMasterStrip::solo_changed ()
+{
+	if (_vca->solo_control()->self_soloed()) {
+		solo_button.set_active_state (ExplicitActive);
+	} else if (_vca->solo_control()->soloed_by_masters ()) {
+		solo_button.set_active_state (ImplicitActive);
+	} else {
+		solo_button.set_active_state (Gtkmm2ext::Off);
+	}
+}
+
+bool
+VCAMasterStrip::vertical_button_press (GdkEventButton* ev)
+{
+	if (ev->button == 1 && ev->type == GDK_2BUTTON_PRESS) {
+		start_name_edit ();
+		return true;
+	}
+
+	if (Keyboard::is_context_menu_event (ev)) {
+		if (!context_menu) {
+			build_context_menu ();
+		}
+		context_menu->popup (1, ev->time);
+		return true;
+	}
+
+	if (ev->button == 1) {
+		spill ();
+	}
+
+	return true;
+}
+
+void
+VCAMasterStrip::start_name_edit ()
+{
+	Gtk::Window* win = dynamic_cast<Gtk::Window*>(get_toplevel());
+	FloatingTextEntry* fte = new FloatingTextEntry (win, _vca->name());
+	fte->use_text.connect (sigc::mem_fun (*this, &VCAMasterStrip::finish_name_edit));
+	fte->present ();
+}
+
+void
+VCAMasterStrip::finish_name_edit (std::string str, int)
+{
+	_vca->set_name (str);
+}
+
+void
+VCAMasterStrip::vca_property_changed (PropertyChange const & what_changed)
+{
+	if (what_changed.contains (ARDOUR::Properties::name)) {
+		update_vca_name ();
+	}
+
+	if (what_changed.contains (ARDOUR::Properties::color)) {
+		vertical_button.set_active_color (_vca->presentation_info().color ());
+	}
+
+	if (what_changed.contains (ARDOUR::Properties::hidden)) {
+
+	}
+}
+
+void
+VCAMasterStrip::update_vca_name ()
+{
+	/* 20 is a rough guess at the number of letters we can fit. */
+	vertical_button.set_text (short_version (_vca->name(), 20));
+}
+
+void
+VCAMasterStrip::build_context_menu ()
+{
+	using namespace Gtk::Menu_Helpers;
+	context_menu = new Menu;
+	MenuList& items = context_menu->items();
+	items.push_back (MenuElem (_("Rename"), sigc::mem_fun (*this, &VCAMasterStrip::start_name_edit)));
+	items.push_back (MenuElem (_("Color..."), sigc::mem_fun (*this, &VCAMasterStrip::start_color_edit)));
+	items.push_back (SeparatorElem());
+	items.push_back (MenuElem (_("Drop All Slaves"), sigc::mem_fun (*this, &VCAMasterStrip::drop_all_slaves)));
+	items.push_back (SeparatorElem());
+	items.push_back (MenuElem (_("Remove"), sigc::mem_fun (*this, &VCAMasterStrip::remove)));
+}
+
+void
+VCAMasterStrip::spill ()
+{
+	if (Mixer_UI::instance()->showing_vca_slaves_for (_vca)) {
+		Mixer_UI::instance()->show_vca_slaves (boost::shared_ptr<VCA>());
+	} else {
+		Mixer_UI::instance()->show_vca_slaves (_vca);
+	}
+}
+
+void
+VCAMasterStrip::spill_change (boost::shared_ptr<VCA> vca)
+{
+	if (vca != _vca) {
+		vertical_button.set_active_state (Gtkmm2ext::Off);
+		set_tooltip (vertical_button, _("Click to show slaves only"));
+	} else {
+		vertical_button.set_active_state (Gtkmm2ext::ExplicitActive);
+		set_tooltip (vertical_button, _("Click to show normal mixer"));
+	}
+}
+
+void
+VCAMasterStrip::remove ()
+{
+	if (!_session) {
+		return;
+	}
+
+	_session->vca_manager().remove_vca (_vca);
+}
+
+void
+VCAMasterStrip::drop_all_slaves ()
+{
+	_vca->Drop (); /* EMIT SIGNAL */
+
+	if (Mixer_UI::instance()->showing_vca_slaves_for (_vca)) {
+		Mixer_UI::instance()->show_vca_slaves (boost::shared_ptr<VCA>());
+	}
+}
+
+Gdk::Color
+VCAMasterStrip::color () const
+{
+	return gdk_color_from_rgba (_vca->presentation_info().color ());
+}
+
+string
+VCAMasterStrip::state_id () const
+{
+	return string_compose (X_("vms-%1"), _vca->number());
+}
+
+void
+VCAMasterStrip::start_color_edit ()
+{
+	Gtk::ColorSelectionDialog* color_dialog = new Gtk::ColorSelectionDialog;
+
+	color_dialog->get_colorsel()->set_has_opacity_control (false);
+	color_dialog->get_colorsel()->set_has_palette (true);
+
+	Gdk::Color c = gdk_color_from_rgba (_vca->presentation_info().color ());
+
+	color_dialog->get_colorsel()->set_previous_color (c);
+	color_dialog->get_colorsel()->set_current_color (c);
+
+	color_dialog->signal_response().connect (sigc::bind (sigc::mem_fun (*this, &VCAMasterStrip::finish_color_edit), color_dialog));
+	color_dialog->present ();
+}
+
+void
+VCAMasterStrip::finish_color_edit (int response, Gtk::ColorSelectionDialog* dialog)
+{
+	switch (response) {
+	case RESPONSE_OK:
+		_vca->presentation_info().set_color (gdk_color_to_rgba (dialog->get_colorsel()->get_current_color()));
+		break;
+	}
+
+	delete_when_idle (dialog);
+}
+
+bool
+VCAMasterStrip::marked_for_display () const
+{
+	return !_vca->presentation_info().hidden();
+}
+
+bool
+VCAMasterStrip::set_marked_for_display (bool yn)
+{
+	if (yn == _vca->presentation_info().hidden()) {
+		_vca->presentation_info().set_hidden (!yn);
+		return true; // things changed
+	}
+	return false;
+}
+
+PresentationInfo const &
+VCAMasterStrip::presentation_info () const
+{
+	return _vca->presentation_info();
+}
+
+boost::shared_ptr<Stripable>
+VCAMasterStrip::stripable () const
+{
+	return _vca;
+}
diff --git a/gtk2_ardour/vca_master_strip.h b/gtk2_ardour/vca_master_strip.h
new file mode 100644
index 0000000..7208071
--- /dev/null
+++ b/gtk2_ardour/vca_master_strip.h
@@ -0,0 +1,110 @@
+/*
+    Copyright (C) 2016 Paul Davis
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#ifndef __ardour_vca_master_strip__
+#define __ardour_vca_master_strip__
+
+#include <boost/shared_ptr.hpp>
+
+#include <gtkmm/box.h>
+#include <gtkmm/menuitem.h>
+
+#include "ardour_button.h"
+#include "axis_view.h"
+#include "control_slave_ui.h"
+#include "gain_meter.h"
+
+namespace ARDOUR {
+	class GainControl;
+	class VCA;
+}
+
+class FloatingTextEntry;
+
+class VCAMasterStrip : public AxisView, public Gtk::EventBox
+{
+      public:
+	VCAMasterStrip (ARDOUR::Session*, boost::shared_ptr<ARDOUR::VCA>);
+	~VCAMasterStrip ();
+
+	boost::shared_ptr<ARDOUR::Stripable> stripable() const;
+	ARDOUR::PresentationInfo const & presentation_info () const;
+
+	std::string name() const;
+	Gdk::Color color () const;
+	std::string state_id() const;
+	boost::shared_ptr<ARDOUR::VCA> vca() const { return _vca; }
+
+	static PBD::Signal1<void,VCAMasterStrip*> CatchDeletion;
+
+	bool marked_for_display () const;
+	bool set_marked_for_display (bool);
+
+     private:
+	boost::shared_ptr<ARDOUR::VCA> _vca;
+	GainMeter    gain_meter;
+
+	Gtk::Frame   global_frame;
+	Gtk::VBox    global_vpacker;
+	Gtk::HBox    top_padding;
+	Gtk::HBox    bottom_padding;
+	Gtk::HBox    solo_mute_box;
+	ArdourButton width_button;
+	ArdourButton color_button;
+	ArdourButton hide_button;
+	ArdourButton number_label;
+	ArdourButton solo_button;
+	ArdourButton mute_button;
+	Gtk::Menu*   context_menu;
+	Gtk::MessageDialog* delete_dialog;
+	ArdourButton vertical_button;
+	ControlSlaveUI control_slave_ui;
+	PBD::ScopedConnectionList vca_connections;
+
+	void spill ();
+	void spill_change (boost::shared_ptr<ARDOUR::VCA>);
+	void hide_clicked();
+	bool width_button_pressed (GdkEventButton *);
+	void set_selected (bool);
+	bool solo_release (GdkEventButton*);
+	bool mute_release (GdkEventButton*);
+	void set_width (bool wide);
+	void set_solo_text ();
+	void solo_changed ();
+	void mute_changed ();
+	void unassign ();
+	void start_name_edit ();
+	void finish_name_edit (std::string, int);
+	bool vertical_button_press (GdkEventButton*);
+	void vca_property_changed (PBD::PropertyChange const & what_changed);
+	void update_vca_name ();
+	void build_context_menu ();
+	void hide_confirmation (int);
+	void self_delete ();
+	void remove ();
+	void drop_all_slaves ();
+
+	void parameter_changed (std::string const& p);
+	void set_button_names ();
+
+	void start_color_edit ();
+	void finish_color_edit (int, Gtk::ColorSelectionDialog*);
+};
+
+
+#endif /* __ardour_vca_master_strip__ */
diff --git a/gtk2_ardour/vca_time_axis.cc b/gtk2_ardour/vca_time_axis.cc
new file mode 100644
index 0000000..f98cda0
--- /dev/null
+++ b/gtk2_ardour/vca_time_axis.cc
@@ -0,0 +1,325 @@
+/*
+    Copyright (C) 2016 Paul Davis
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#include "pbd/convert.h"
+
+#include "ardour/mute_control.h"
+#include "ardour/profile.h"
+#include "ardour/session.h"
+#include "ardour/solo_control.h"
+#include "ardour/vca.h"
+
+#include "gtkmm2ext/doi.h"
+
+#include "gui_thread.h"
+#include "public_editor.h"
+#include "tooltips.h"
+#include "ui_config.h"
+#include "vca_time_axis.h"
+
+#include "pbd/i18n.h"
+
+using namespace ARDOUR;
+using namespace ARDOUR_UI_UTILS;
+using namespace Gtkmm2ext;
+using namespace PBD;
+
+VCATimeAxisView::VCATimeAxisView (PublicEditor& ed, Session* s, ArdourCanvas::Canvas& canvas)
+	: SessionHandlePtr (s)
+	, TimeAxisView (s, ed, (TimeAxisView*) 0, canvas)
+	, gain_meter (s, true, 75, 14) // XXX stupid magic numbers, match sizes in RouteTimeAxisView
+{
+	solo_button.set_name ("solo button");
+	set_tooltip (solo_button, _("Solo slaves"));
+	solo_button.signal_button_release_event().connect (sigc::mem_fun (*this, &VCATimeAxisView::solo_release), false);
+	mute_button.unset_flags (Gtk::CAN_FOCUS);
+
+	mute_button.set_name ("mute button");
+	mute_button.set_text (_("M"));
+	set_tooltip (mute_button, _("Mute slaves"));
+	mute_button.signal_button_release_event().connect (sigc::mem_fun (*this, &VCATimeAxisView::mute_release), false);
+	solo_button.unset_flags (Gtk::CAN_FOCUS);
+
+	drop_button.set_name ("mute button");
+	drop_button.set_text (_("D"));
+	set_tooltip (drop_button, _("Unassign all slaves"));
+	drop_button.signal_button_release_event().connect (sigc::mem_fun (*this, &VCATimeAxisView::drop_release), false);
+
+	spill_button.set_name ("mute button");
+	spill_button.set_text (_("V"));
+	set_tooltip (spill_button, _("Show only slaves"));
+	spill_button.signal_button_release_event().connect (sigc::mem_fun (*this, &VCATimeAxisView::spill_release), false);
+
+	mute_button.set_tweaks(ArdourButton::TrackHeader);
+	solo_button.set_tweaks(ArdourButton::TrackHeader);
+	drop_button.set_tweaks(ArdourButton::TrackHeader);
+	spill_button.set_tweaks(ArdourButton::TrackHeader);
+
+	controls_table.attach (mute_button, 2, 3, 0, 1, Gtk::SHRINK, Gtk::SHRINK, 0, 0);
+	controls_table.attach (solo_button, 3, 4, 0, 1, Gtk::SHRINK, Gtk::SHRINK, 0, 0);
+	controls_table.attach (drop_button, 2, 3, 1, 2, Gtk::SHRINK, Gtk::SHRINK, 0, 0);
+	controls_table.attach (spill_button, 3, 4, 1, 2, Gtk::SHRINK, Gtk::SHRINK, 0, 0);
+	controls_table.attach (gain_meter.get_gain_slider(), 0, 2, 1, 2, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND, 1, 0);
+
+	mute_button.show ();
+	solo_button.show ();
+	drop_button.show ();
+	spill_button.show ();
+	gain_meter.get_gain_slider().show ();
+
+	controls_ebox.set_name ("ControlMasterBaseUnselected");
+	time_axis_frame.set_name ("ControlMasterBaseUnselected");
+
+	s->config.ParameterChanged.connect (*this, invalidator (*this), boost::bind (&VCATimeAxisView::parameter_changed, this, _1), gui_context());
+	Config->ParameterChanged.connect (*this, invalidator (*this), boost::bind (&VCATimeAxisView::parameter_changed, this, _1), gui_context());
+	UIConfiguration::instance().ParameterChanged.connect (sigc::mem_fun (*this, &VCATimeAxisView::parameter_changed));
+}
+
+VCATimeAxisView::~VCATimeAxisView ()
+{
+}
+
+void
+VCATimeAxisView::self_delete ()
+{
+	/* reset reference immediately rather than deferring to idle */
+	_vca.reset ();
+	delete_when_idle (this);
+}
+
+void
+VCATimeAxisView::parameter_changed (std::string const & p)
+{
+	if (p == "track-name-number") {
+		update_track_number_visibility();
+	} else if (p == "use-monitor-bus" || p == "solo-control-is-listen-control" || p == "listen-position") {
+		set_button_names ();
+	}
+}
+
+bool
+VCATimeAxisView::solo_release (GdkEventButton*)
+{
+	/* We use NoGroup because VCA controls are never part of a group. This
+	   is redundant, but clear.
+	*/
+	_vca->solo_control()->set_value (_vca->solo_control()->self_soloed() ? 0.0 : 1.0, Controllable::NoGroup);
+	return true;
+}
+
+bool
+VCATimeAxisView::mute_release (GdkEventButton*)
+{
+	/* We use NoGroup because VCA controls are never part of a group. This
+	   is redundant, but clear.
+	*/
+	_vca->mute_control()->set_value (_vca->mute_control()->muted_by_self() ? 0.0 : 1.0, Controllable::NoGroup);
+	return true;
+}
+
+void
+VCATimeAxisView::set_vca (boost::shared_ptr<VCA> v)
+{
+	_vca = v;
+
+	gain_meter.set_controls (boost::shared_ptr<Route>(),
+	                         boost::shared_ptr<PeakMeter>(),
+	                         boost::shared_ptr<Amp>(),
+	                         _vca->gain_control());
+
+	// Mixer_UI::instance()->show_vca_change.connect (sigc::mem_fun (*this, &VCAMasterStrip::spill_change));
+
+	_vca->PropertyChanged.connect (vca_connections, invalidator (*this), boost::bind (&VCATimeAxisView::vca_property_changed, this, _1), gui_context());
+
+	_vca->solo_control()->Changed.connect (vca_connections, invalidator (*this), boost::bind (&VCATimeAxisView::update_solo_display, this), gui_context());
+	_vca->mute_control()->Changed.connect (vca_connections, invalidator (*this), boost::bind (&VCATimeAxisView::update_mute_display, this), gui_context());
+	_vca->DropReferences.connect (vca_connections, invalidator (*this), boost::bind (&VCATimeAxisView::self_delete, this), gui_context());
+
+	solo_button.set_controllable (_vca->solo_control());
+	mute_button.set_controllable (_vca->mute_control());
+
+	/* VCA number never changes */
+	number_label.set_text (to_string (_vca->number(), std::dec));
+
+	set_height (preset_height (HeightNormal));
+
+	update_vca_name ();
+	set_button_names ();
+	update_solo_display ();
+	update_mute_display ();
+	update_track_number_visibility ();
+}
+
+void
+VCATimeAxisView::vca_property_changed (PropertyChange const & what_changed)
+{
+	if (what_changed.contains (ARDOUR::Properties::name)) {
+		update_vca_name ();
+	}
+}
+
+void
+VCATimeAxisView::update_vca_name ()
+{
+	name_label.set_text (_vca->name());
+}
+
+void
+VCATimeAxisView::update_mute_display ()
+{
+	if (_vca->mute_control()->muted_by_self()) {
+		mute_button.set_active_state (ExplicitActive);
+	} else if (_vca->mute_control()->muted_by_masters ()) {
+		mute_button.set_active_state (ImplicitActive);
+	} else {
+		mute_button.set_active_state (Gtkmm2ext::Off);
+	}
+}
+
+void
+VCATimeAxisView::update_solo_display ()
+{
+	if (_vca->solo_control()->self_soloed()) {
+		solo_button.set_active_state (ExplicitActive);
+	} else if (_vca->solo_control()->soloed_by_masters ()) {
+		solo_button.set_active_state (ImplicitActive);
+	} else {
+		solo_button.set_active_state (Gtkmm2ext::Off);
+	}
+
+	update_mute_display ();
+}
+
+std::string
+VCATimeAxisView::name() const
+{
+	return _vca->name();
+}
+
+std::string
+VCATimeAxisView::state_id() const
+{
+	return string_compose ("vtv %1", _vca->id().to_s());
+}
+
+void
+VCATimeAxisView::set_button_names ()
+{
+	if (Config->get_solo_control_is_listen_control()) {
+		switch (Config->get_listen_position()) {
+		case AfterFaderListen:
+			solo_button.set_text (S_("AfterFader|A"));
+			set_tooltip (solo_button, _("After-fade listen (AFL)"));
+			break;
+		case PreFaderListen:
+			solo_button.set_text (S_("PreFader|P"));
+			set_tooltip (solo_button, _("Pre-fade listen (PFL)"));
+			break;
+		}
+	} else {
+		solo_button.set_text (S_("Solo|S"));
+		set_tooltip (solo_button, _("Solo"));
+	}
+}
+
+void
+VCATimeAxisView::update_track_number_visibility ()
+{
+	DisplaySuspender ds;
+	bool show_label = _session->config.get_track_name_number();
+
+	if (number_label.get_parent()) {
+		controls_table.remove (number_label);
+	}
+
+	if (show_label) {
+		if (ARDOUR::Profile->get_mixbus()) {
+			controls_table.attach (number_label, 3, 4, 0, 1, Gtk::SHRINK, Gtk::EXPAND|Gtk::FILL, 1, 0);
+		} else {
+			controls_table.attach (number_label, 0, 1, 0, 1, Gtk::SHRINK, Gtk::EXPAND|Gtk::FILL, 1, 0);
+		}
+
+		// see ArdourButton::on_size_request(), we should probably use a global size-group here instead.
+		// except the width of the number label is subtracted from the name-hbox, so we
+		// need to explictly calculate it anyway until the name-label & entry become ArdourWidgets.
+
+		int tnw = (2 + std::max(2u, _session->track_number_decimals())) * number_label.char_pixel_width();
+		if (tnw & 1) --tnw;
+		number_label.set_size_request(tnw, -1);
+		number_label.show ();
+	} else {
+		number_label.hide ();
+	}
+}
+
+bool
+VCATimeAxisView::spill_release (GdkEventButton*)
+{
+	return true;
+}
+
+bool
+VCATimeAxisView::drop_release (GdkEventButton*)
+{
+	_vca->Drop (); /* EMIT SIGNAL */
+
+	return true;
+}
+
+PresentationInfo const &
+VCATimeAxisView::presentation_info () const
+{
+	return _vca->presentation_info();
+}
+
+boost::shared_ptr<Stripable>
+VCATimeAxisView::stripable () const
+{
+	return _vca;
+}
+
+Gdk::Color
+VCATimeAxisView::color () const
+{
+	return gdk_color_from_rgb (_vca->presentation_info().color ());
+}
+
+void
+VCATimeAxisView::set_height (uint32_t h, TrackHeightMode m)
+{
+	TimeAxisView::set_height (h, m);
+	set_gui_property ("height", h);
+	_vca->gui_changed ("track_height", (void*) 0); /* EMIT SIGNAL */
+}
+
+bool
+VCATimeAxisView::marked_for_display () const
+{
+	return _vca && !_vca->presentation_info().hidden();
+}
+
+bool
+VCATimeAxisView::set_marked_for_display (bool yn)
+{
+	if (_vca && (yn == _vca->presentation_info().hidden())) {
+		_vca->presentation_info().set_hidden (!yn);
+		return true; // things changed
+	}
+	return false;
+}
diff --git a/gtk2_ardour/vca_time_axis.h b/gtk2_ardour/vca_time_axis.h
new file mode 100644
index 0000000..c40b1ab
--- /dev/null
+++ b/gtk2_ardour/vca_time_axis.h
@@ -0,0 +1,82 @@
+/*
+    Copyright (C) 2016 Paul Davis
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#ifndef __ardour_vca_time_axis_h__
+#define __ardour_vca_time_axis_h__
+
+#include "ardour_button.h"
+#include "time_axis_view.h"
+#include "gain_meter.h"
+
+namespace ArdourCanvas {
+	class Canvas;
+}
+
+namespace ARDOUR {
+	class Session;
+	class VCA;
+}
+
+class VCATimeAxisView : public TimeAxisView
+{
+  public:
+	VCATimeAxisView (PublicEditor&, ARDOUR::Session*, ArdourCanvas::Canvas& canvas);
+	virtual ~VCATimeAxisView ();
+
+	boost::shared_ptr<ARDOUR::Stripable> stripable() const;
+	ARDOUR::PresentationInfo const & presentation_info () const;
+
+	void set_vca (boost::shared_ptr<ARDOUR::VCA>);
+	boost::shared_ptr<ARDOUR::VCA> vca() const { return _vca; }
+
+	std::string name() const;
+	Gdk::Color color () const;
+	std::string state_id() const;
+
+	void set_height (uint32_t h, TrackHeightMode m = OnlySelf);
+
+	bool selectable() const { return false; }
+	bool marked_for_display () const;
+	bool set_marked_for_display (bool);
+
+ protected:
+	boost::shared_ptr<ARDOUR::VCA> _vca;
+	ArdourButton  solo_button;
+	ArdourButton  mute_button;
+	ArdourButton  spill_button;
+	ArdourButton  drop_button;
+	ArdourButton  number_label;
+	GainMeterBase gain_meter;
+	PBD::ScopedConnectionList vca_connections;
+
+	void parameter_changed (std::string const& p);
+	void vca_property_changed (PBD::PropertyChange const&);
+	void update_vca_name ();
+	void set_button_names ();
+	void update_solo_display ();
+	void update_mute_display ();
+	void update_track_number_visibility ();
+	bool solo_release (GdkEventButton*);
+	bool mute_release (GdkEventButton*);
+	bool spill_release (GdkEventButton*);
+	bool drop_release (GdkEventButton*);
+	void self_delete ();
+};
+
+#endif /* __ardour_route_time_axis_h__ */
diff --git a/gtk2_ardour/verbose_cursor.cc b/gtk2_ardour/verbose_cursor.cc
index 84d75d2..bf11733 100644
--- a/gtk2_ardour/verbose_cursor.cc
+++ b/gtk2_ardour/verbose_cursor.cc
@@ -34,7 +34,7 @@
 #include "ardour_ui.h"
 #include "ui_config.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
@@ -137,7 +137,7 @@ VerboseCursor::set_duration (framepos_t start, framepos_t end)
 	Timecode::Time timecode;
 	Timecode::BBT_Time sbbt;
 	Timecode::BBT_Time ebbt;
-	Meter meter_at_start (_editor->_session->tempo_map().meter_at(start));
+	Meter meter_at_start (_editor->_session->tempo_map().meter_at_frame (start));
 
 	if (_editor->_session == 0) {
 		return;
diff --git a/gtk2_ardour/video_image_frame.cc b/gtk2_ardour/video_image_frame.cc
index 8399d0b..093f235 100644
--- a/gtk2_ardour/video_image_frame.cc
+++ b/gtk2_ardour/video_image_frame.cc
@@ -20,15 +20,17 @@
 #include <sigc++/bind.h>
 #include "ardour/tempo.h"
 
-#include "video_image_frame.h"
-#include "public_editor.h"
-#include "canvas/container.h"
-#include "utils_videotl.h"
-
 #include <gtkmm2ext/utils.h>
 #include <pthread.h>
 
-#include "i18n.h"
+#include "canvas/container.h"
+
+#include "ardour_http.h"
+#include "public_editor.h"
+#include "utils_videotl.h"
+#include "video_image_frame.h"
+
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
@@ -208,7 +210,7 @@ http_get_thread (void *arg) {
 	int timeout = 1000; // * 5ms -> 5sec
 	char *res = NULL;
 	do {
-		res=a3_curl_http_get(url, &status);
+		res = ArdourCurl::http_get (url, &status);
 		if (status == 503) Glib::usleep(5000); // try-again
 	} while (status == 503 && --timeout > 0);
 
diff --git a/gtk2_ardour/video_monitor.cc b/gtk2_ardour/video_monitor.cc
index ece1856..1fe8f97 100644
--- a/gtk2_ardour/video_monitor.cc
+++ b/gtk2_ardour/video_monitor.cc
@@ -28,7 +28,7 @@
 #include "editor.h"
 #include "video_monitor.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace PBD;
@@ -255,9 +255,7 @@ VideoMonitor::is_started ()
 void
 VideoMonitor::forward_keyevent (unsigned int keyval)
 {
-	Editor* ed = dynamic_cast<Editor*>(&PublicEditor::instance());
-	if (!ed) return;
-	emulate_key_event(ed, keyval);
+	emulate_key_event (keyval);
 }
 
 void
diff --git a/gtk2_ardour/video_server_dialog.cc b/gtk2_ardour/video_server_dialog.cc
index 2bd814b..29872fc 100644
--- a/gtk2_ardour/video_server_dialog.cc
+++ b/gtk2_ardour/video_server_dialog.cc
@@ -36,7 +36,7 @@
 #include "video_server_dialog.h"
 #include "utils_videotl.h"
 #include "video_tool_paths.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 #ifdef PLATFORM_WINDOWS
 #include <windows.h>
diff --git a/gtk2_ardour/video_timeline.cc b/gtk2_ardour/video_timeline.cc
index a1dd4bc..3468ff2 100644
--- a/gtk2_ardour/video_timeline.cc
+++ b/gtk2_ardour/video_timeline.cc
@@ -26,6 +26,7 @@
 #include "ardour/session_directory.h"
 
 #include "ardour_ui.h"
+#include "ardour_http.h"
 #include "public_editor.h"
 #include "gui_thread.h"
 #include "utils_videotl.h"
@@ -37,7 +38,7 @@
 #include <pthread.h>
 #include <curl/curl.h>
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
@@ -85,7 +86,7 @@ VideoTimeLine::save_session ()
 		return;
 	}
 
-	LocaleGuard lg (X_("C"));
+	LocaleGuard lg;
 
 	XMLNode* node = new XMLNode(X_("Videomonitor"));
 	if (!node) return;
@@ -143,7 +144,7 @@ VideoTimeLine::set_session (ARDOUR::Session *s)
 	if (!_session) { return ; }
 
 	_session->SessionSaveUnderway.connect_same_thread (sessionsave, boost::bind (&VideoTimeLine::save_session, this));
-	LocaleGuard lg (X_("C"));
+	LocaleGuard lg;
 
 	XMLNode* node = _session->extra_xml (X_("Videotimeline"));
 
@@ -155,38 +156,38 @@ VideoTimeLine::set_session (ARDOUR::Session *s)
 
 	set_id(*node);
 
-	const XMLProperty* proph = node->property (X_("Height"));
+	XMLProperty const * proph = node->property (X_("Height"));
 	if (proph) {
 		editor->set_video_timeline_height(atoi(proph->value()));
 	}
 #if 0 /* TODO THINK: set FPS first time only ?! */
-	const XMLProperty* propasfps = node->property (X_("AutoFPS"));
+	XMLProperty const * propasfps = node->property (X_("AutoFPS"));
 	if (propasfps) {
 		auto_set_session_fps = atoi(propasfps->value())?true:false;
 	}
 #endif
 
-	const XMLProperty* propoffset = node->property (X_("VideoOffset"));
+	XMLProperty const * propoffset = node->property (X_("VideoOffset"));
 	if (propoffset) {
 		video_offset = atoll(propoffset->value());
 		video_offset_p = video_offset;
 	}
 
-	const XMLProperty* proplock = node->property (X_("VideoOffsetLock"));
+	XMLProperty const * proplock = node->property (X_("VideoOffsetLock"));
 	if (proplock) {
 		video_offset_lock = atoi(proplock->value())?true:false;
 	}
 
-	const XMLProperty* localfile = node->property (X_("LocalFile"));
+	XMLProperty const * localfile = node->property (X_("LocalFile"));
 	if (localfile) {
 		local_file = atoi(localfile->value())?true:false;
 	}
 
-	const XMLProperty* propf = node->property (X_("Filename"));
+	XMLProperty const * propf = node->property (X_("Filename"));
 	video_file_info(propf->value(), local_file);
 
 	if ((node = _session->extra_xml (X_("Videomonitor")))) {
-		const XMLProperty* prop = node->property (X_("active"));
+		XMLProperty const * prop = node->property (X_("active"));
 		if (prop && prop->value() == "yes" && found_xjadeo() && !video_filename.empty() && local_file) {
 			open_video_monitor();
 		}
@@ -224,8 +225,8 @@ VideoTimeLine::save_undo ()
 int
 VideoTimeLine::set_state (const XMLNode& node, int /*version*/)
 {
-	LocaleGuard lg (X_("C"));
-	const XMLProperty* propoffset = node.property (X_("VideoOffset"));
+	LocaleGuard lg;
+	XMLProperty const * propoffset = node.property (X_("VideoOffset"));
 	if (propoffset) {
 		video_offset = atoll(propoffset->value());
 	}
@@ -237,7 +238,7 @@ XMLNode&
 VideoTimeLine::get_state ()
 {
 	XMLNode* node = new XMLNode (X_("Videotimeline"));
-	LocaleGuard lg (X_("C"));
+	LocaleGuard lg;
 	node->add_property (X_("VideoOffset"), video_offset_p);
 	return *node;
 }
@@ -556,7 +557,7 @@ VideoTimeLine::check_server ()
 			, video_server_url.c_str()
 			, (video_server_url.length()>0 && video_server_url.at(video_server_url.length()-1) == '/')?"":"/"
 			);
-	char *res=a3_curl_http_get(url, NULL);
+	char* res = ArdourCurl::http_get (url, NULL);
 	if (res) {
 		if (strstr(res, "status: ok, online.")) { ok = true; }
 		free(res);
@@ -578,7 +579,7 @@ VideoTimeLine::check_server_docroot ()
 			, video_server_url.c_str()
 			, (video_server_url.length()>0 && video_server_url.at(video_server_url.length()-1) == '/')?"":"/"
 			);
-	char *res=a3_curl_http_get(url, NULL);
+	char* res = ArdourCurl::http_get (url, NULL);
 	if (!res) {
 		return false;
 	}
@@ -674,7 +675,7 @@ VideoTimeLine::flush_cache () {
 			, video_server_url.c_str()
 			, (video_server_url.length()>0 && video_server_url.at(video_server_url.length()-1) == '/')?"":"/"
 			);
-	char *res=a3_curl_http_get(url, NULL);
+	char* res = ArdourCurl::http_get (url, NULL);
 	if (res) {
 		free (res);
 	}
@@ -746,7 +747,12 @@ VideoTimeLine::find_xjadeo () {
 			return;
 		}
 
-		version_check.wait ();
+#ifdef PLATFORM_WINDOWS
+		version_check.wait (); // 40ms timeout
+#else
+		version_check.wait (WNOHANG);
+#endif
+
 		int timeout = 300;
 		while (xjadeo_version.empty() && --timeout) {
 			Glib::usleep(10000);
@@ -799,7 +805,7 @@ VideoTimeLine::open_video_monitor() {
 		/* load mask from Session */
 		XMLNode* node = _session->extra_xml (X_("XJRestoreSettings"));
 		if (node) {
-			const XMLProperty* prop = node->property (X_("mask"));
+			XMLProperty const * prop = node->property (X_("mask"));
 			if (prop) {
 				xj_settings_mask = atoi(prop->value());
 			}
@@ -820,7 +826,7 @@ VideoTimeLine::open_video_monitor() {
 		if (_session) {
 			XMLNode* node = _session->extra_xml (X_("Videomonitor"));
 			if (node) {
-				const XMLProperty* prop = node->property (X_("active"));
+				XMLProperty const * prop = node->property (X_("active"));
 				if (prop && prop->value() != "yes") _session->set_dirty ();
 			} else {
 				_session->set_dirty ();
diff --git a/gtk2_ardour/video_tool_paths.cc b/gtk2_ardour/video_tool_paths.cc
index 2ac4f4d..0126902 100644
--- a/gtk2_ardour/video_tool_paths.cc
+++ b/gtk2_ardour/video_tool_paths.cc
@@ -27,8 +27,9 @@
 #endif
 
 #include "pbd/file_utils.h"
+#include "ui_config.h"
 #include "video_tool_paths.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace PBD;
 
@@ -107,8 +108,18 @@ ArdourVideoToolPaths::xjadeo_exe (std::string &xjadeo_exe)
 	std::string reg;
 	std::string program_files = PBD::get_win_special_folder_path (CSIDL_PROGRAM_FILES);
 #endif
+	xjadeo_exe = X_("");
+
 	if (getenv("XJREMOTE")) {
 		xjadeo_exe = getenv("XJREMOTE");
+#ifdef __APPLE__
+	} else if (!UIConfiguration::instance().get_xjadeo_binary().empty()
+			&& Glib::file_test (UIConfiguration::instance().get_xjadeo_binary() + "/Contents/MacOS/xjadeo", Glib::FILE_TEST_EXISTS|Glib::FILE_TEST_IS_EXECUTABLE)) {
+		xjadeo_exe = UIConfiguration::instance().get_xjadeo_binary() + "/Contents/MacOS/xjadeo";
+#endif
+	} else if (!UIConfiguration::instance().get_xjadeo_binary().empty()
+			&& Glib::file_test (UIConfiguration::instance().get_xjadeo_binary(), Glib::FILE_TEST_EXISTS|Glib::FILE_TEST_IS_EXECUTABLE)) {
+		xjadeo_exe = UIConfiguration::instance().get_xjadeo_binary();
 	} else if (find_file (Searchpath(Glib::getenv("PATH")), X_("xjremote"), xjadeo_file_path)) {
 		xjadeo_exe = xjadeo_file_path;
 	} else if (find_file (Searchpath(Glib::getenv("PATH")), X_("xjadeo"), xjadeo_file_path)) {
@@ -139,11 +150,8 @@ ArdourVideoToolPaths::xjadeo_exe (std::string &xjadeo_exe)
 		xjadeo_exe = X_("C:\\Program Files\\xjadeo\\xjadeo.exe");
 	}
 #endif
-	else  {
-		xjadeo_exe = X_("");
-		return false;
-	}
-	return true;
+
+	return (!xjadeo_exe.empty() && Glib::file_test(xjadeo_exe, Glib::FILE_TEST_EXISTS|Glib::FILE_TEST_IS_EXECUTABLE));
 }
 
 bool
diff --git a/gtk2_ardour/visibility_group.cc b/gtk2_ardour/visibility_group.cc
index 46a941d..d0ef1dd 100644
--- a/gtk2_ardour/visibility_group.cc
+++ b/gtk2_ardour/visibility_group.cc
@@ -21,10 +21,13 @@
 #include <gtkmm/menu.h>
 #include <gtkmm/menushell.h>
 #include <gtkmm/treeview.h>
+
+#include "pbd/strsplit.h"
 #include "pbd/xml++.h"
+
 #include "visibility_group.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 
@@ -168,6 +171,52 @@ VisibilityGroup::set_state (string v)
 }
 
 string
+VisibilityGroup::remove_element (std::string const& from, std::string const& element)
+{
+	std::vector<string> s;
+	std::string ret;
+
+	split (from, s, ',');
+	for (std::vector<string>::const_iterator i = s.begin(); i != s.end(); ++i) {
+		if ((*i) == element) {
+			continue;
+		}
+		if (!ret.empty()) {
+			ret += ',';
+		}
+		ret += *i;
+	}
+
+	return ret;
+}
+
+string
+VisibilityGroup::add_element (std::string const& from, std::string const& element)
+{
+	std::vector<string> s;
+	std::string ret;
+	
+	split (from, s, ',');
+
+	for (std::vector<string>::const_iterator i = s.begin(); i != s.end(); ++i) {
+		if ((*i) == element) {
+			/* already present, just return the original */
+			return from;
+		}
+	}
+
+	ret = from;
+
+	if (!ret.empty()) {
+		ret += ',';
+	}
+
+	ret += element;
+
+	return ret;
+}
+
+string
 VisibilityGroup::get_state_name () const
 {
 	return _xml_property_name;
diff --git a/gtk2_ardour/visibility_group.h b/gtk2_ardour/visibility_group.h
index 8ac2c1d..ce1adec 100644
--- a/gtk2_ardour/visibility_group.h
+++ b/gtk2_ardour/visibility_group.h
@@ -56,6 +56,9 @@ public:
 
 	PBD::Signal0<void> VisibilityChanged;
 
+	static std::string remove_element (std::string const& from, std::string const& element);
+	static std::string add_element (std::string const& from, std::string const& element);
+
 private:
 
 	struct Member {
diff --git a/gtk2_ardour/vst_plugin_ui.cc b/gtk2_ardour/vst_plugin_ui.cc
index a964e96..c2bf2c6 100644
--- a/gtk2_ardour/vst_plugin_ui.cc
+++ b/gtk2_ardour/vst_plugin_ui.cc
@@ -45,6 +45,7 @@ VSTPluginUI::VSTPluginUI (boost::shared_ptr<ARDOUR::PluginInsert> insert, boost:
 	box->pack_end (save_button, false, false);
 	box->pack_end (add_button, false, false);
 	box->pack_end (_preset_combo, false, false);
+	box->pack_end (pin_management_button, false, false);
 
 	bypass_button.set_active (!insert->active ());
 
diff --git a/gtk2_ardour/win32/msvc_resources.rc.in b/gtk2_ardour/win32/msvc_resources.rc.in
new file mode 100644
index 0000000..0f357d6
--- /dev/null
+++ b/gtk2_ardour/win32/msvc_resources.rc.in
@@ -0,0 +1,110 @@
+// Microsoft Visual C++ generated resource script.
+//
+#include "resource."
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#include "afxres.h"
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// English (U.K.) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENG)
+#ifdef _WIN32
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_UK
+#pragma code_page(1252)
+#endif //_WIN32
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Icon
+//
+
+// Icon with lowest ID value placed first to ensure application icon
+// remains consistent on all systems.
+IDR_MAINFRAME           ICON                    "..\\icons\\ardour.ico"
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Version
+//
+
+1 VERSIONINFO
+ FILEVERSION @MSVC_MIXBUS_MAJOR@, at MSVC_MIXBUS_MINOR@, at MSVC_MIXBUS_MICRO@, at MSVC_MIXBUS_INTERFACE_AGE@
+ PRODUCTVERSION @MSVC_MIXBUS_MAJOR@, at MSVC_MIXBUS_MINOR@, at MSVC_MIXBUS_MICRO@, at MSVC_MIXBUS_INTERFACE_AGE@
+ FILEFLAGSMASK 0x3fL
+#ifdef _DEBUG
+ FILEFLAGS 0x29L
+#else
+ FILEFLAGS 0x28L
+#endif
+ FILEOS 0x4L
+ FILETYPE 0x1L
+ FILESUBTYPE 0x0L
+BEGIN
+    BLOCK "StringFileInfo"
+    BEGIN
+        BLOCK "080904b0"
+        BEGIN
+            VALUE "CompanyName", "Harrison Audio LLC"
+            VALUE "FileDescription", "Mixbus"
+            VALUE "FileVersion", "@MSVC_MIXBUS_VERSION at .@MSVC_MIXBUS_INTERFACE_AGE@"
+            VALUE "InternalName", "MixbusWin at DLL_SUFFIX@"
+            VALUE "LegalCopyright", "Copyright Paul Davis and others © 1999-2014"
+            VALUE "LegalTrademarks", "Harrison and Mixbus are trademarks of Harrison Audio LLC"
+            VALUE "OriginalFilename", "Mixbus2- at DLL_SUFFIX@"
+            VALUE "ProductName", "MSVCMixbus"
+            VALUE "ProductVersion", "@MSVC_MIXBUS_MAJOR@, @MSVC_MIXBUS_MINOR@, @MSVC_MIXBUS_MICRO@, @MSVC_MIXBUS_INTERFACE_AGE@"
+            VALUE "SpecialBuild", "Built for Microsoft Windows by John Emmas - (© 2014)"
+        END
+    END
+    BLOCK "VarFileInfo"
+    BEGIN
+        VALUE "Translation", 0x809, 1200
+    END
+END
+
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE 
+BEGIN
+    "resource.\0"
+END
+
+3 TEXTINCLUDE 
+BEGIN
+    "\r\0"
+END
+
+2 TEXTINCLUDE 
+BEGIN
+    "#include ""afxres.h""\r\0"
+END
+
+#endif    // APSTUDIO_INVOKED
+
+#endif    // English (U.K.) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+

+/////////////////////////////////////////////////////////////////////////////
+#endif    // not APSTUDIO_INVOKED
+
diff --git a/gtk2_ardour/win32/resource b/gtk2_ardour/win32/resource
new file mode 100644
index 0000000..6aa0099
--- /dev/null
+++ b/gtk2_ardour/win32/resource
@@ -0,0 +1,493 @@
+//{{NO_DEPENDENCIES}}
+// Microsoft Visual C++ generated include file.
+// Used by msvc_resources.rc
+//
+#define ID_SEPARATOR                    0
+#define VS_VERSION_INFO                 1
+#define AFX_IDC_LISTBOX                 100
+#define AFX_IDC_CHANGE                  101
+#define AFX_IDC_BROWSER                 102
+#define IDR_MAINFRAME                   128
+#define AFX_IDC_PRINT_DOCNAME           201
+#define AFX_IDC_PRINT_PRINTERNAME       202
+#define AFX_IDC_PRINT_PORTNAME          203
+#define AFX_IDC_PRINT_PAGENUM           204
+#define ID_MFCLOC_MANIFEST              1000
+#define AFX_IDC_FONTPROP                1000
+#define AFX_IDC_FONTNAMES               1001
+#define AFX_IDC_FONTSTYLES              1002
+#define AFX_IDC_FONTSIZES               1003
+#define AFX_IDC_STRIKEOUT               1004
+#define AFX_IDC_UNDERLINE               1005
+#define AFX_IDC_SAMPLEBOX               1006
+#define AFX_IDC_COLOR_BLACK             1100
+#define AFX_IDC_COLOR_WHITE             1101
+#define AFX_IDC_COLOR_RED               1102
+#define AFX_IDC_COLOR_GREEN             1103
+#define AFX_IDC_COLOR_BLUE              1104
+#define AFX_IDC_COLOR_YELLOW            1105
+#define AFX_IDC_COLOR_MAGENTA           1106
+#define AFX_IDC_COLOR_CYAN              1107
+#define AFX_IDC_COLOR_GRAY              1108
+#define AFX_IDC_COLOR_LIGHTGRAY         1109
+#define AFX_IDC_COLOR_DARKRED           1110
+#define AFX_IDC_COLOR_DARKGREEN         1111
+#define AFX_IDC_COLOR_DARKBLUE          1112
+#define AFX_IDC_COLOR_LIGHTBROWN        1113
+#define AFX_IDC_COLOR_DARKMAGENTA       1114
+#define AFX_IDC_COLOR_DARKCYAN          1115
+#define AFX_IDC_COLORPROP               1116
+#define AFX_IDC_SYSTEMCOLORS            1117
+#define AFX_IDC_PROPNAME                1201
+#define AFX_IDC_PICTURE                 1202
+#define AFX_IDC_BROWSE                  1203
+#define AFX_IDC_CLEAR                   1204
+#define AFX_IDC_TAB_CONTROL             0x3020
+#define ID_APPLY_NOW                    0x3021
+#define ID_WIZBACK                      0x3023
+#define ID_WIZNEXT                      0x3024
+#define ID_WIZFINISH                    0x3025
+#define AFX_IDD_NEWTYPEDLG              30721
+#define AFX_IDD_PRINTDLG                30722
+#define AFX_IDD_PREVIEW_TOOLBAR         30723
+#define AFX_IDD_INSERTOBJECT            30724
+#define AFX_IDD_CHANGEICON              30725
+#define AFX_IDD_CONVERT                 30726
+#define AFX_IDD_PASTESPECIAL            30727
+#define AFX_IDD_EDITLINKS               30728
+#define AFX_IDD_FILEBROWSE              30729
+#define AFX_IDD_BUSY                    30730
+#define AFX_IDD_OBJECTPROPERTIES        30732
+#define AFX_IDD_CHANGESOURCE            30733
+#define AFX_IDD_EMPTYDIALOG             30734
+#define AFX_IDC_CONTEXTHELP             30977
+#define AFX_IDC_MAGNIFY                 30978
+#define AFX_IDC_SMALLARROWS             30979
+#define AFX_IDC_HSPLITBAR               30980
+#define AFX_IDC_VSPLITBAR               30981
+#define AFX_IDC_NODROPCRSR              30982
+#define AFX_IDC_TRACKNWSE               30983
+#define AFX_IDC_TRACKNESW               30984
+#define AFX_IDC_TRACKNS                 30985
+#define AFX_IDC_TRACKWE                 30986
+#define AFX_IDC_TRACK4WAY               30987
+#define AFX_IDC_MOVE4WAY                30988
+#define AFX_IDB_MINIFRAME_MENU          30994
+#define AFX_IDB_CHECKLISTBOX_95         30996
+#define AFX_IDR_PREVIEW_ACCEL           30997
+#define AFX_IDC_MOUSE_PAN_NW            30998
+#define AFX_IDC_MOUSE_PAN_N             30999
+#define AFX_IDC_MOUSE_PAN_NE            31000
+#define AFX_IDC_MOUSE_PAN_W             31001
+#define AFX_IDC_MOUSE_PAN_HV            31002
+#define AFX_IDC_MOUSE_PAN_E             31003
+#define AFX_IDC_MOUSE_PAN_SW            31004
+#define AFX_IDC_MOUSE_PAN_S             31005
+#define AFX_IDC_MOUSE_PAN_SE            31006
+#define AFX_IDC_MOUSE_PAN_HORZ          31007
+#define AFX_IDC_MOUSE_PAN_VERT          31008
+#define AFX_IDC_MOUSE_ORG_HORZ          31009
+#define AFX_IDC_MOUSE_ORG_VERT          31010
+#define AFX_IDC_MOUSE_ORG_HV            31011
+#define AFX_IDC_MOUSE_MASK              31012
+#define AFX_IDI_STD_MDIFRAME            31233
+#define AFX_IDI_STD_FRAME               31234
+#define AFX_IDD_PROPPAGE_COLOR          32257
+#define AFX_IDD_PROPPAGE_FONT           32258
+#define AFX_IDD_PROPPAGE_PICTURE        32259
+#define AFX_IDB_TRUETYPE                32384
+#define AFX_IDS_APP_TITLE               0xE000
+#define AFX_IDS_IDLEMESSAGE             0xE001
+#define AFX_IDS_HELPMODEMESSAGE         0xE002
+#define AFX_IDS_APP_TITLE_EMBEDDING     0xE003
+#define AFX_IDS_COMPANY_NAME            0xE004
+#define AFX_IDS_OBJ_TITLE_INPLACE       0xE005
+#define ID_FILE_NEW                     0xE100
+#define ID_FILE_OPEN                    0xE101
+#define ID_FILE_CLOSE                   0xE102
+#define ID_FILE_SAVE                    0xE103
+#define ID_FILE_SAVE_AS                 0xE104
+#define ID_FILE_PAGE_SETUP              0xE105
+#define ID_FILE_PRINT_SETUP             0xE106
+#define ID_FILE_PRINT                   0xE107
+#define ID_FILE_PRINT_DIRECT            0xE108
+#define ID_FILE_PRINT_PREVIEW           0xE109
+#define ID_FILE_UPDATE                  0xE10A
+#define ID_FILE_SAVE_COPY_AS            0xE10B
+#define ID_FILE_SEND_MAIL               0xE10C
+#define ID_FILE_NEW_FRAME               0xE10D
+#define ID_FILE_MRU_FIRST               0xE110
+#define ID_FILE_MRU_FILE1               0xE110
+#define ID_FILE_MRU_FILE2               0xE111
+#define ID_FILE_MRU_FILE3               0xE112
+#define ID_FILE_MRU_FILE4               0xE113
+#define ID_FILE_MRU_FILE5               0xE114
+#define ID_FILE_MRU_FILE6               0xE115
+#define ID_FILE_MRU_FILE7               0xE116
+#define ID_FILE_MRU_FILE8               0xE117
+#define ID_FILE_MRU_FILE9               0xE118
+#define ID_FILE_MRU_FILE10              0xE119
+#define ID_FILE_MRU_FILE11              0xE11A
+#define ID_FILE_MRU_FILE12              0xE11B
+#define ID_FILE_MRU_FILE13              0xE11C
+#define ID_FILE_MRU_FILE14              0xE11D
+#define ID_FILE_MRU_FILE15              0xE11E
+#define ID_FILE_MRU_FILE16              0xE11F
+#define ID_FILE_MRU_LAST                0xE11F
+#define ID_EDIT_CLEAR                   0xE120
+#define ID_EDIT_CLEAR_ALL               0xE121
+#define ID_EDIT_COPY                    0xE122
+#define ID_EDIT_CUT                     0xE123
+#define ID_EDIT_FIND                    0xE124
+#define ID_EDIT_PASTE                   0xE125
+#define ID_EDIT_PASTE_LINK              0xE126
+#define ID_EDIT_PASTE_SPECIAL           0xE127
+#define ID_EDIT_REPEAT                  0xE128
+#define ID_EDIT_REPLACE                 0xE129
+#define ID_EDIT_SELECT_ALL              0xE12A
+#define ID_EDIT_UNDO                    0xE12B
+#define ID_EDIT_REDO                    0xE12C
+#define ID_WINDOW_NEW                   0xE130
+#define ID_WINDOW_ARRANGE               0xE131
+#define ID_WINDOW_CASCADE               0xE132
+#define ID_WINDOW_TILE_HORZ             0xE133
+#define ID_WINDOW_TILE_VERT             0xE134
+#define ID_WINDOW_SPLIT                 0xE135
+#define ID_APP_ABOUT                    0xE140
+#define ID_APP_EXIT                     0xE141
+#define ID_HELP_INDEX                   0xE142
+#define ID_HELP_FINDER                  0xE143
+#define ID_HELP_USING                   0xE144
+#define ID_CONTEXT_HELP                 0xE145
+#define ID_HELP                         0xE146
+#define ID_DEFAULT_HELP                 0xE147
+#define ID_NEXT_PANE                    0xE150
+#define ID_PREV_PANE                    0xE151
+#define ID_FORMAT_FONT                  0xE160
+#define ID_OLE_INSERT_NEW               0xE200
+#define ID_OLE_EDIT_LINKS               0xE201
+#define ID_OLE_EDIT_CONVERT             0xE202
+#define ID_OLE_EDIT_CHANGE_ICON         0xE203
+#define ID_OLE_EDIT_PROPERTIES          0xE204
+#define ID_OLE_VERB_FIRST               0xE210
+#define AFX_ID_PREVIEW_CLOSE            0xE300
+#define AFX_ID_PREVIEW_NUMPAGE          0xE301
+#define AFX_ID_PREVIEW_NEXT             0xE302
+#define AFX_ID_PREVIEW_PREV             0xE303
+#define AFX_ID_PREVIEW_PRINT            0xE304
+#define AFX_ID_PREVIEW_ZOOMIN           0xE305
+#define AFX_ID_PREVIEW_ZOOMOUT          0xE306
+#define ID_INDICATOR_EXT                0xE700
+#define ID_INDICATOR_CAPS               0xE701
+#define ID_INDICATOR_NUM                0xE702
+#define ID_INDICATOR_SCRL               0xE703
+#define ID_INDICATOR_OVR                0xE704
+#define ID_INDICATOR_REC                0xE705
+#define ID_INDICATOR_KANA               0xE706
+#define ID_VIEW_TOOLBAR                 0xE800
+#define ID_VIEW_STATUS_BAR              0xE801
+#define ID_VIEW_REBAR                   0xE804
+#define ID_VIEW_AUTOARRANGE             0xE805
+#define ID_VIEW_SMALLICON               0xE810
+#define ID_VIEW_LARGEICON               0xE811
+#define ID_VIEW_LIST                    0xE812
+#define ID_VIEW_DETAILS                 0xE813
+#define ID_VIEW_LINEUP                  0xE814
+#define ID_VIEW_BYNAME                  0xE815
+#define ID_RECORD_FIRST                 0xE900
+#define ID_RECORD_LAST                  0xE901
+#define ID_RECORD_NEXT                  0xE902
+#define ID_RECORD_PREV                  0xE903
+#define AFX_IDS_SCSIZE                  0xEF00
+#define AFX_IDS_SCMOVE                  0xEF01
+#define AFX_IDS_SCMINIMIZE              0xEF02
+#define AFX_IDS_SCMAXIMIZE              0xEF03
+#define AFX_IDS_SCNEXTWINDOW            0xEF04
+#define AFX_IDS_SCPREVWINDOW            0xEF05
+#define AFX_IDS_SCCLOSE                 0xEF06
+#define AFX_IDS_SCRESTORE               0xEF12
+#define AFX_IDS_SCTASKLIST              0xEF13
+#define AFX_IDS_MDICHILD                0xEF1F
+#define AFX_IDS_DESKACCESSORY           0xEFDA
+#define AFX_IDS_OPENFILE                0xF000
+#define AFX_IDS_SAVEFILE                0xF001
+#define AFX_IDS_ALLFILTER               0xF002
+#define AFX_IDS_UNTITLED                0xF003
+#define AFX_IDS_SAVEFILECOPY            0xF004
+#define AFX_IDS_PREVIEW_CLOSE           0xF005
+#define AFX_IDS_UNNAMED_FILE            0xF006
+#define AFX_IDS_HIDE                    0xF011
+#define AFX_IDP_NO_ERROR_AVAILABLE      0xF020
+#define AFX_IDS_NOT_SUPPORTED_EXCEPTION 0xF021
+#define AFX_IDS_RESOURCE_EXCEPTION      0xF022
+#define AFX_IDS_MEMORY_EXCEPTION        0xF023
+#define AFX_IDS_USER_EXCEPTION          0xF024
+#define AFX_IDS_INVALID_ARG_EXCEPTION   0xF025
+#define AFX_IDS_PRINTONPORT             0xF040
+#define AFX_IDS_ONEPAGE                 0xF041
+#define AFX_IDS_TWOPAGE                 0xF042
+#define AFX_IDS_PRINTPAGENUM            0xF043
+#define AFX_IDS_PREVIEWPAGEDESC         0xF044
+#define AFX_IDS_PRINTDEFAULTEXT         0xF045
+#define AFX_IDS_PRINTDEFAULT            0xF046
+#define AFX_IDS_PRINTFILTER             0xF047
+#define AFX_IDS_PRINTCAPTION            0xF048
+#define AFX_IDS_PRINTTOFILE             0xF049
+#define AFX_IDS_OBJECT_MENUITEM         0xF080
+#define AFX_IDS_EDIT_VERB               0xF081
+#define AFX_IDS_ACTIVATE_VERB           0xF082
+#define AFX_IDS_CHANGE_LINK             0xF083
+#define AFX_IDS_AUTO                    0xF084
+#define AFX_IDS_MANUAL                  0xF085
+#define AFX_IDS_FROZEN                  0xF086
+#define AFX_IDS_ALL_FILES               0xF087
+#define AFX_IDS_SAVE_MENU               0xF088
+#define AFX_IDS_UPDATE_MENU             0xF089
+#define AFX_IDS_SAVE_AS_MENU            0xF08A
+#define AFX_IDS_SAVE_COPY_AS_MENU       0xF08B
+#define AFX_IDS_EXIT_MENU               0xF08C
+#define AFX_IDS_UPDATING_ITEMS          0xF08D
+#define AFX_IDS_METAFILE_FORMAT         0xF08E
+#define AFX_IDS_DIB_FORMAT              0xF08F
+#define AFX_IDS_BITMAP_FORMAT           0xF090
+#define AFX_IDS_LINKSOURCE_FORMAT       0xF091
+#define AFX_IDS_EMBED_FORMAT            0xF092
+#define AFX_IDS_PASTELINKEDTYPE         0xF094
+#define AFX_IDS_UNKNOWNTYPE             0xF095
+#define AFX_IDS_RTF_FORMAT              0xF096
+#define AFX_IDS_TEXT_FORMAT             0xF097
+#define AFX_IDS_INVALID_CURRENCY        0xF098
+#define AFX_IDS_INVALID_DATETIME        0xF099
+#define AFX_IDS_INVALID_DATETIMESPAN    0xF09A
+#define AFX_IDP_INVALID_FILENAME        0xF100
+#define AFX_IDP_FAILED_TO_OPEN_DOC      0xF101
+#define AFX_IDP_FAILED_TO_SAVE_DOC      0xF102
+#define AFX_IDP_ASK_TO_SAVE             0xF103
+#define AFX_IDP_FAILED_TO_CREATE_DOC    0xF104
+#define AFX_IDP_FILE_TOO_LARGE          0xF105
+#define AFX_IDP_FAILED_TO_START_PRINT   0xF106
+#define AFX_IDP_FAILED_TO_LAUNCH_HELP   0xF107
+#define AFX_IDP_INTERNAL_FAILURE        0xF108
+#define AFX_IDP_COMMAND_FAILURE         0xF109
+#define AFX_IDP_FAILED_MEMORY_ALLOC     0xF10A
+#define AFX_IDP_UNREG_DONE              0xF10B
+#define AFX_IDP_UNREG_FAILURE           0xF10C
+#define AFX_IDP_DLL_LOAD_FAILED         0xF10D
+#define AFX_IDP_DLL_BAD_VERSION         0xF10E
+#define AFX_IDP_PARSE_INT               0xF110
+#define AFX_IDP_PARSE_REAL              0xF111
+#define AFX_IDP_PARSE_INT_RANGE         0xF112
+#define AFX_IDP_PARSE_REAL_RANGE        0xF113
+#define AFX_IDP_PARSE_STRING_SIZE       0xF114
+#define AFX_IDP_PARSE_RADIO_BUTTON      0xF115
+#define AFX_IDP_PARSE_BYTE              0xF116
+#define AFX_IDP_PARSE_UINT              0xF117
+#define AFX_IDP_PARSE_DATETIME          0xF118
+#define AFX_IDP_PARSE_CURRENCY          0xF119
+#define AFX_IDP_PARSE_GUID              0xF11A
+#define AFX_IDP_PARSE_TIME              0xF11B
+#define AFX_IDP_PARSE_DATE              0xF11C
+#define AFX_IDP_FAILED_INVALID_FORMAT   0xF120
+#define AFX_IDP_FAILED_INVALID_PATH     0xF121
+#define AFX_IDP_FAILED_DISK_FULL        0xF122
+#define AFX_IDP_FAILED_ACCESS_READ      0xF123
+#define AFX_IDP_FAILED_ACCESS_WRITE     0xF124
+#define AFX_IDP_FAILED_IO_ERROR_READ    0xF125
+#define AFX_IDP_FAILED_IO_ERROR_WRITE   0xF126
+#define AFX_IDP_SCRIPT_ERROR            0xF130
+#define AFX_IDP_SCRIPT_DISPATCH_EXCEPTION 0xF131
+#define AFX_IDP_STATIC_OBJECT           0xF180
+#define AFX_IDP_FAILED_TO_CONNECT       0xF181
+#define AFX_IDP_SERVER_BUSY             0xF182
+#define AFX_IDP_BAD_VERB                0xF183
+#define AFX_IDS_NOT_DOCOBJECT           0xF184
+#define AFX_IDP_FAILED_TO_NOTIFY        0xF185
+#define AFX_IDP_FAILED_TO_LAUNCH        0xF186
+#define AFX_IDP_ASK_TO_UPDATE           0xF187
+#define AFX_IDP_FAILED_TO_UPDATE        0xF188
+#define AFX_IDP_FAILED_TO_REGISTER      0xF189
+#define AFX_IDP_FAILED_TO_AUTO_REGISTER 0xF18A
+#define AFX_IDP_FAILED_TO_CONVERT       0xF18B
+#define AFX_IDP_GET_NOT_SUPPORTED       0xF18C
+#define AFX_IDP_SET_NOT_SUPPORTED       0xF18D
+#define AFX_IDP_ASK_TO_DISCARD          0xF18E
+#define AFX_IDP_FAILED_TO_CREATE        0xF18F
+#define AFX_IDP_FAILED_MAPI_LOAD        0xF190
+#define AFX_IDP_INVALID_MAPI_DLL        0xF191
+#define AFX_IDP_FAILED_MAPI_SEND        0xF192
+#define AFX_IDP_FILE_NONE               0xF1A0
+#define AFX_IDP_FILE_GENERIC            0xF1A1
+#define AFX_IDP_FILE_NOT_FOUND          0xF1A2
+#define AFX_IDP_FILE_BAD_PATH           0xF1A3
+#define AFX_IDP_FILE_TOO_MANY_OPEN      0xF1A4
+#define AFX_IDP_FILE_ACCESS_DENIED      0xF1A5
+#define AFX_IDP_FILE_INVALID_FILE       0xF1A6
+#define AFX_IDP_FILE_REMOVE_CURRENT     0xF1A7
+#define AFX_IDP_FILE_DIR_FULL           0xF1A8
+#define AFX_IDP_FILE_BAD_SEEK           0xF1A9
+#define AFX_IDP_FILE_HARD_IO            0xF1AA
+#define AFX_IDP_FILE_SHARING            0xF1AB
+#define AFX_IDP_FILE_LOCKING            0xF1AC
+#define AFX_IDP_FILE_DISKFULL           0xF1AD
+#define AFX_IDP_FILE_EOF                0xF1AE
+#define AFX_IDP_ARCH_NONE               0xF1B0
+#define AFX_IDP_ARCH_GENERIC            0xF1B1
+#define AFX_IDP_ARCH_READONLY           0xF1B2
+#define AFX_IDP_ARCH_ENDOFFILE          0xF1B3
+#define AFX_IDP_ARCH_WRITEONLY          0xF1B4
+#define AFX_IDP_ARCH_BADINDEX           0xF1B5
+#define AFX_IDP_ARCH_BADCLASS           0xF1B6
+#define AFX_IDP_ARCH_BADSCHEMA          0xF1B7
+#define AFX_IDS_OCC_SCALEUNITS_PIXELS   0xF1C0
+#define AFX_IDS_STATUS_FONT             0xF230
+#define AFX_IDS_TOOLTIP_FONT            0xF231
+#define AFX_IDS_UNICODE_FONT            0xF232
+#define AFX_IDS_MINI_FONT               0xF233
+#define AFX_IDP_SQL_CONNECT_FAIL        0xF281
+#define AFX_IDP_SQL_RECORDSET_FORWARD_ONLY 0xF282
+#define AFX_IDP_SQL_EMPTY_COLUMN_LIST   0xF283
+#define AFX_IDP_SQL_FIELD_SCHEMA_MISMATCH 0xF284
+#define AFX_IDP_SQL_ILLEGAL_MODE        0xF285
+#define AFX_IDP_SQL_MULTIPLE_ROWS_AFFECTED 0xF286
+#define AFX_IDP_SQL_NO_CURRENT_RECORD   0xF287
+#define AFX_IDP_SQL_NO_ROWS_AFFECTED    0xF288
+#define AFX_IDP_SQL_RECORDSET_READONLY  0xF289
+#define AFX_IDP_SQL_SQL_NO_TOTAL        0xF28A
+#define AFX_IDP_SQL_ODBC_LOAD_FAILED    0xF28B
+#define AFX_IDP_SQL_DYNASET_NOT_SUPPORTED 0xF28C
+#define AFX_IDP_SQL_SNAPSHOT_NOT_SUPPORTED 0xF28D
+#define AFX_IDP_SQL_API_CONFORMANCE     0xF28E
+#define AFX_IDP_SQL_SQL_CONFORMANCE     0xF28F
+#define AFX_IDP_SQL_NO_DATA_FOUND       0xF290
+#define AFX_IDP_SQL_ROW_UPDATE_NOT_SUPPORTED 0xF291
+#define AFX_IDP_SQL_ODBC_V2_REQUIRED    0xF292
+#define AFX_IDP_SQL_NO_POSITIONED_UPDATES 0xF293
+#define AFX_IDP_SQL_LOCK_MODE_NOT_SUPPORTED 0xF294
+#define AFX_IDP_SQL_DATA_TRUNCATED      0xF295
+#define AFX_IDP_SQL_ROW_FETCH           0xF296
+#define AFX_IDP_SQL_INCORRECT_ODBC      0xF297
+#define AFX_IDP_SQL_UPDATE_DELETE_FAILED 0xF298
+#define AFX_IDP_SQL_DYNAMIC_CURSOR_NOT_SUPPORTED 0xF299
+#define AFX_IDP_SQL_FIELD_NOT_FOUND     0xF29A
+#define AFX_IDP_SQL_BOOKMARKS_NOT_SUPPORTED 0xF29B
+#define AFX_IDP_SQL_BOOKMARKS_NOT_ENABLED 0xF29C
+#define AFX_IDS_DELETED                 0xF29D
+#define AFX_IDP_DAO_ENGINE_INITIALIZATION 0xF2B0
+#define AFX_IDP_DAO_DFX_BIND            0xF2B1
+#define AFX_IDP_DAO_OBJECT_NOT_OPEN     0xF2B2
+#define AFX_IDP_DAO_ROWTOOSHORT         0xF2B3
+#define AFX_IDP_DAO_BADBINDINFO         0xF2B4
+#define AFX_IDP_DAO_COLUMNUNAVAILABLE   0xF2B5
+#define AFX_IDS_HTTP_TITLE              0xF2D1
+#define AFX_IDS_HTTP_NO_TEXT            0xF2D2
+#define AFX_IDS_HTTP_BAD_REQUEST        0xF2D3
+#define AFX_IDS_HTTP_AUTH_REQUIRED      0xF2D4
+#define AFX_IDS_HTTP_FORBIDDEN          0xF2D5
+#define AFX_IDS_HTTP_NOT_FOUND          0xF2D6
+#define AFX_IDS_HTTP_SERVER_ERROR       0xF2D7
+#define AFX_IDS_HTTP_NOT_IMPLEMENTED    0xF2D8
+#define AFX_IDS_CHECKLISTBOX_UNCHECK    0xF2E1
+#define AFX_IDS_CHECKLISTBOX_CHECK      0xF2E2
+#define AFX_IDS_CHECKLISTBOX_MIXED      0xF2E3
+#define AFX_IDS_PROPPAGE_UNKNOWN        0xFE01
+#define AFX_IDS_COLOR_DESKTOP           0xFE04
+#define AFX_IDS_COLOR_APPWORKSPACE      0xFE05
+#define AFX_IDS_COLOR_WNDBACKGND        0xFE06
+#define AFX_IDS_COLOR_WNDTEXT           0xFE07
+#define AFX_IDS_COLOR_MENUBAR           0xFE08
+#define AFX_IDS_COLOR_MENUTEXT          0xFE09
+#define AFX_IDS_COLOR_ACTIVEBAR         0xFE0A
+#define AFX_IDS_COLOR_INACTIVEBAR       0xFE0B
+#define AFX_IDS_COLOR_ACTIVETEXT        0xFE0C
+#define AFX_IDS_COLOR_INACTIVETEXT      0xFE0D
+#define AFX_IDS_COLOR_ACTIVEBORDER      0xFE0E
+#define AFX_IDS_COLOR_INACTIVEBORDER    0xFE0F
+#define AFX_IDS_COLOR_WNDFRAME          0xFE10
+#define AFX_IDS_COLOR_SCROLLBARS        0xFE11
+#define AFX_IDS_COLOR_BTNFACE           0xFE12
+#define AFX_IDS_COLOR_BTNSHADOW         0xFE13
+#define AFX_IDS_COLOR_BTNTEXT           0xFE14
+#define AFX_IDS_COLOR_BTNHIGHLIGHT      0xFE15
+#define AFX_IDS_COLOR_DISABLEDTEXT      0xFE16
+#define AFX_IDS_COLOR_HIGHLIGHT         0xFE17
+#define AFX_IDS_COLOR_HIGHLIGHTTEXT     0xFE18
+#define AFX_IDS_REGULAR                 0xFE19
+#define AFX_IDS_BOLD                    0xFE1A
+#define AFX_IDS_ITALIC                  0xFE1B
+#define AFX_IDS_BOLDITALIC              0xFE1C
+#define AFX_IDS_SAMPLETEXT              0xFE1D
+#define AFX_IDS_DISPLAYSTRING_FONT      0xFE1E
+#define AFX_IDS_DISPLAYSTRING_COLOR     0xFE1F
+#define AFX_IDS_DISPLAYSTRING_PICTURE   0xFE20
+#define AFX_IDS_PICTUREFILTER           0xFE21
+#define AFX_IDS_PICTYPE_UNKNOWN         0xFE22
+#define AFX_IDS_PICTYPE_NONE            0xFE23
+#define AFX_IDS_PICTYPE_BITMAP          0xFE24
+#define AFX_IDS_PICTYPE_METAFILE        0xFE25
+#define AFX_IDS_PICTYPE_ICON            0xFE26
+#define AFX_IDS_COLOR_PPG               0xFE28
+#define AFX_IDS_COLOR_PPG_CAPTION       0xFE29
+#define AFX_IDS_FONT_PPG                0xFE2A
+#define AFX_IDS_FONT_PPG_CAPTION        0xFE2B
+#define AFX_IDS_PICTURE_PPG             0xFE2C
+#define AFX_IDS_PICTURE_PPG_CAPTION     0xFE2D
+#define AFX_IDS_PICTUREBROWSETITLE      0xFE30
+#define AFX_IDS_BORDERSTYLE_0           0xFE31
+#define AFX_IDS_BORDERSTYLE_1           0xFE32
+#define AFX_IDS_VERB_EDIT               0xFE40
+#define AFX_IDS_VERB_PROPERTIES         0xFE41
+#define AFX_IDP_PICTURECANTOPEN         0xFE83
+#define AFX_IDP_PICTURECANTLOAD         0xFE84
+#define AFX_IDP_PICTURETOOLARGE         0xFE85
+#define AFX_IDP_PICTUREREADFAILED       0xFE86
+#define AFX_IDP_E_ILLEGALFUNCTIONCALL   0xFEA0
+#define AFX_IDP_E_OVERFLOW              0xFEA1
+#define AFX_IDP_E_OUTOFMEMORY           0xFEA2
+#define AFX_IDP_E_DIVISIONBYZERO        0xFEA3
+#define AFX_IDP_E_OUTOFSTRINGSPACE      0xFEA4
+#define AFX_IDP_E_OUTOFSTACKSPACE       0xFEA5
+#define AFX_IDP_E_BADFILENAMEORNUMBER   0xFEA6
+#define AFX_IDP_E_FILENOTFOUND          0xFEA7
+#define AFX_IDP_E_BADFILEMODE           0xFEA8
+#define AFX_IDP_E_FILEALREADYOPEN       0xFEA9
+#define AFX_IDP_E_DEVICEIOERROR         0xFEAA
+#define AFX_IDP_E_FILEALREADYEXISTS     0xFEAB
+#define AFX_IDP_E_BADRECORDLENGTH       0xFEAC
+#define AFX_IDP_E_DISKFULL              0xFEAD
+#define AFX_IDP_E_BADRECORDNUMBER       0xFEAE
+#define AFX_IDP_E_BADFILENAME           0xFEAF
+#define AFX_IDP_E_TOOMANYFILES          0xFEB0
+#define AFX_IDP_E_DEVICEUNAVAILABLE     0xFEB1
+#define AFX_IDP_E_PERMISSIONDENIED      0xFEB2
+#define AFX_IDP_E_DISKNOTREADY          0xFEB3
+#define AFX_IDP_E_PATHFILEACCESSERROR   0xFEB4
+#define AFX_IDP_E_PATHNOTFOUND          0xFEB5
+#define AFX_IDP_E_INVALIDPATTERNSTRING  0xFEB6
+#define AFX_IDP_E_INVALIDUSEOFNULL      0xFEB7
+#define AFX_IDP_E_INVALIDFILEFORMAT     0xFEB8
+#define AFX_IDP_E_INVALIDPROPERTYVALUE  0xFEB9
+#define AFX_IDP_E_INVALIDPROPERTYARRAYINDEX 0xFEBA
+#define AFX_IDP_E_SETNOTSUPPORTEDATRUNTIME 0xFEBB
+#define AFX_IDP_E_SETNOTSUPPORTED       0xFEBC
+#define AFX_IDP_E_NEEDPROPERTYARRAYINDEX 0xFEBD
+#define AFX_IDP_E_SETNOTPERMITTED       0xFEBE
+#define AFX_IDP_E_GETNOTSUPPORTEDATRUNTIME 0xFEBF
+#define AFX_IDP_E_GETNOTSUPPORTED       0xFEC0
+#define AFX_IDP_E_PROPERTYNOTFOUND      0xFEC1
+#define AFX_IDP_E_INVALIDCLIPBOARDFORMAT 0xFEC2
+#define AFX_IDP_E_INVALIDPICTURE        0xFEC3
+#define AFX_IDP_E_PRINTERERROR          0xFEC4
+#define AFX_IDP_E_CANTSAVEFILETOTEMP    0xFEC5
+#define AFX_IDP_E_SEARCHTEXTNOTFOUND    0xFEC6
+#define AFX_IDP_E_REPLACEMENTSTOOLONG   0xFEC7
+
+// Next default values for new objects
+// 
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+#define _APS_NEXT_RESOURCE_VALUE        129
+#define _APS_NEXT_COMMAND_VALUE         32001
+#define _APS_NEXT_CONTROL_VALUE         1001
+#define _APS_NEXT_SYMED_VALUE           101
+#endif
+#endif
diff --git a/gtk2_ardour/window_manager.cc b/gtk2_ardour/window_manager.cc
index b476787..b3960b0 100644
--- a/gtk2_ardour/window_manager.cc
+++ b/gtk2_ardour/window_manager.cc
@@ -22,15 +22,17 @@
 
 #include "ardour/session_handle.h"
 
+#include "gtkmm2ext/bindings.h"
 #include "gtkmm2ext/visibility_tracker.h"
 
 #include "actions.h"
 #include "ardour_dialog.h"
+#include "ardour_ui.h"
 #include "ardour_window.h"
 #include "window_manager.h"
 #include "processor_box.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using std::string;
 using namespace WM;
@@ -64,16 +66,50 @@ Manager::register_window (ProxyBase* info)
 	if (!info->menu_name().empty()) {
 
 		if (!window_actions) {
-			window_actions = Gtk::ActionGroup::create (X_("Window"));
-			ActionManager::add_action_group (window_actions);
+			window_actions = ARDOUR_UI::instance()->global_actions.create_action_group (X_("Window"));
 		}
 
-		info->set_action (ActionManager::register_action (window_actions, info->action_name().c_str(), info->menu_name().c_str(),
-								  sigc::bind (sigc::mem_fun (*this, &Manager::toggle_window), info)));
+		info->set_action (ARDOUR_UI::instance()->global_actions.register_toggle_action (window_actions,
+			 info->action_name().c_str(), info->menu_name().c_str(),
+			 sigc::bind (sigc::mem_fun (*this, &Manager::toggle_window), info)));
+
+		info->signal_map.connect (sigc::bind (sigc::mem_fun (*this, &Manager::window_proxy_was_mapped), info));
+		info->signal_unmap.connect (sigc::bind (sigc::mem_fun (*this, &Manager::window_proxy_was_unmapped), info));
+
 	}
 }
 
 void
+Manager::window_proxy_was_mapped (ProxyBase* proxy)
+{
+	Glib::RefPtr<Gtk::Action> act = ARDOUR_UI::instance()->global_actions.find_action (string_compose ("%1/%2", window_actions->get_name(), proxy->action_name()));
+	if (!act) {
+		return;
+	}
+	Glib::RefPtr<Gtk::ToggleAction> tact = Glib::RefPtr<Gtk::ToggleAction>::cast_dynamic (act);
+	if (!tact) {
+		return;
+	}
+
+	tact->set_active (true);
+}
+
+void
+Manager::window_proxy_was_unmapped (ProxyBase* proxy)
+{
+	Glib::RefPtr<Gtk::Action> act = ARDOUR_UI::instance()->global_actions.find_action (string_compose ("%1/%2", window_actions->get_name(), proxy->action_name()));
+	if (!act) {
+		return;
+	}
+	Glib::RefPtr<Gtk::ToggleAction> tact = Glib::RefPtr<Gtk::ToggleAction>::cast_dynamic (act);
+	if (!tact) {
+		return;
+	}
+
+	tact->set_active (false);
+}
+
+void
 Manager::remove (const ProxyBase* info)
 {
 	for (Windows::iterator i = _windows.begin(); i != _windows.end(); ++i) {
@@ -87,8 +123,19 @@ Manager::remove (const ProxyBase* info)
 void
 Manager::toggle_window (ProxyBase* proxy)
 {
-	if (proxy) {
-		proxy->toggle ();
+	Glib::RefPtr<Gtk::Action> act = ARDOUR_UI::instance()->global_actions.find_action (string_compose ("%1/%2", window_actions->get_name(), proxy->action_name()));
+	if (!act) {
+		return;
+	}
+	Glib::RefPtr<Gtk::ToggleAction> tact = Glib::RefPtr<Gtk::ToggleAction>::cast_dynamic (act);
+	if (!tact) {
+		return;
+	}
+
+	if (tact->get_active()) {
+		proxy->present ();
+	} else {
+		proxy->hide ();
 	}
 }
 
@@ -97,12 +144,27 @@ Manager::show_visible() const
 {
 	for (Windows::const_iterator i = _windows.begin(); i != _windows.end(); ++i) {
 		if ((*i)->visible()) {
-			if (! (*i)->get (true)) {
+			Gtk::Window* win = (*i)->get (true);
+			if (!win) {
 				/* the window may be a plugin GUI for a plugin which
 				 * is disabled or longer present.
 				 */
 				continue;
 			}
+			if (dynamic_cast<ArdourDialog*> (win)) {
+				/* do not show dialogs at startup. Most
+				 * dialogs require some signal connection work
+				 * because we are trying to avoid recursive
+				 * event loops (connecting instead to
+				 * ::signal_response(). This means we need to
+				 * destroy the window as well, so that the code
+				 * which checks if it should be created will
+				 * find that it is missing and will create it
+				 * and connect to any necessary signals.
+				 */
+				(*i)->drop_window ();
+				continue;
+			}
 			(*i)->show_all ();
 			(*i)->present ();
 		}
@@ -115,15 +177,12 @@ Manager::add_state (XMLNode& root) const
 	for (Windows::const_iterator i = _windows.begin(); i != _windows.end(); ++i) {
 		/* don't save state for temporary proxy windows
 		 */
+
 		if (dynamic_cast<ProxyTemporary*> (*i)) {
 			continue;
 		}
-		if (dynamic_cast<ProcessorWindowProxy*> (*i)) {
-			ProcessorWindowProxy *pi = dynamic_cast<ProcessorWindowProxy*> (*i);
-			root.add_child_nocopy (pi->get_state());
-		} else {
-			root.add_child_nocopy ((*i)->get_state());
-		}
+
+		root.add_child_nocopy ((*i)->get_state());
 	}
 }
 
@@ -170,269 +229,24 @@ Manager::set_transient_for (Gtk::Window* parent)
 
 /*-------------------------*/
 
-ProxyBase::ProxyBase (const string& name, const std::string& menu_name)
-	: _name (name)
-	, _menu_name (menu_name)
-	, _window (0)
-	, _visible (false)
-	, _x_off (-1)
-	, _y_off (-1)
-	, _width (-1)
-	, _height (-1)
-	, vistracker (0)
-{
-}
-
-ProxyBase::ProxyBase (const string& name, const std::string& menu_name, const XMLNode& node)
-	: _name (name)
-	, _menu_name (menu_name)
-	, _window (0)
-	, _visible (false)
-	, _x_off (-1)
-	, _y_off (-1)
-	, _width (-1)
-	, _height (-1)
-	, vistracker (0)
+ProxyBase::ProxyBase (const std::string& name, const std::string& menu_name)
+	: WindowProxy (name, menu_name)
 {
-	set_state (node);
 }
 
-ProxyBase::~ProxyBase ()
+ProxyBase::ProxyBase (const std::string& name, const std::string& menu_name, const XMLNode& node)
+	: WindowProxy (name, menu_name, node)
 {
-	delete vistracker;
-	delete _window;
-}
-
-void
-ProxyBase::set_state (const XMLNode& node)
-{
-	XMLNodeList children = node.children ();
-
-	XMLNodeList::const_iterator i = children.begin ();
-
-	while (i != children.end()) {
-		XMLProperty* prop = (*i)->property (X_("name"));
-		if ((*i)->name() == X_("Window") && prop && prop->value() == _name) {
-			break;
-		}
-
-		++i;
-	}
-
-	if (i != children.end()) {
-
-		XMLProperty* prop;
-
-		if ((prop = (*i)->property (X_("visible"))) != 0) {
-			_visible = PBD::string_is_affirmative (prop->value ());
-		}
-
-		if ((prop = (*i)->property (X_("x-off"))) != 0) {
-			_x_off = atoi (prop->value());
-		}
-		if ((prop = (*i)->property (X_("y-off"))) != 0) {
-			_y_off = atoi (prop->value());
-		}
-		if ((prop = (*i)->property (X_("x-size"))) != 0) {
-			_width = atoi (prop->value());
-		}
-		if ((prop = (*i)->property (X_("y-size"))) != 0) {
-			_height = atoi (prop->value());
-		}
-	}
-
-	/* if we have a window already, reset its properties */
-
-	if (_window) {
-		setup ();
-	}
-}
-
-void
-ProxyBase::set_action (Glib::RefPtr<Gtk::Action> act)
-{
-	_action = act;
-}
-
-std::string
-ProxyBase::action_name() const
-{
-	return string_compose (X_("toggle-%1"), _name);
-}
-
-void
-ProxyBase::toggle()
-{
-	if (!_window) {
-		(void) get (true);
-		assert (_window);
-		/* XXX this is a hack - the window object should really
-		   ensure its components are all visible. sigh.
-		*/
-		_window->show_all();
-		/* we'd like to just call this and nothing else */
-		_window->present ();
-
-		if (_width != -1 && _height != -1) {
-			_window->set_default_size (_width, _height);
-		}
-		if (_x_off != -1 && _y_off != -1) {
-			_window->move (_x_off, _y_off);
-		}
-
-	} else {
-		if (_window->is_mapped()) {
-			save_pos_and_size();
-		}
-		vistracker->cycle_visibility ();
-		if (_window->is_mapped()) {
-			if (_width != -1 && _height != -1) {
-				_window->set_default_size (_width, _height);
-			}
-			if (_x_off != -1 && _y_off != -1) {
-				_window->move (_x_off, _y_off);
-			}
-		}
-	}
-}
-
-XMLNode&
-ProxyBase::get_state () const
-{
-	XMLNode* node = new XMLNode (X_("Window"));
-	char buf[32];
-
-	node->add_property (X_("name"), _name);
-
-	if (_window && vistracker) {
-
-		/* we have a window, so use current state */
-
-		_visible = vistracker->partially_visible ();
-		if (_visible) {
-			_window->get_position (_x_off, _y_off);
-			_window->get_size (_width, _height);
-		}
-	}
-
-	node->add_property (X_("visible"), _visible? X_("yes") : X_("no"));
-
-	snprintf (buf, sizeof (buf), "%d", _x_off);
-	node->add_property (X_("x-off"), buf);
-	snprintf (buf, sizeof (buf), "%d", _y_off);
-	node->add_property (X_("y-off"), buf);
-	snprintf (buf, sizeof (buf), "%d", _width);
-	node->add_property (X_("x-size"), buf);
-	snprintf (buf, sizeof (buf), "%d", _height);
-	node->add_property (X_("y-size"), buf);
-
-	return *node;
-}
-
-void
-ProxyBase::drop_window ()
-{
-	if (_window) {
-		_window->hide ();
-		delete _window;
-		_window = 0;
-		delete vistracker;
-		vistracker = 0;
-	}
-}
-
-void
-ProxyBase::use_window (Gtk::Window& win)
-{
-	drop_window ();
-	_window = &win;
-	setup ();
 }
 
 void
 ProxyBase::setup ()
 {
-	assert (_window);
-
-	vistracker = new Gtkmm2ext::VisibilityTracker (*_window);
-	_window->signal_delete_event().connect (sigc::mem_fun (*this, &ProxyBase::delete_event_handler));
-
-	if (_width != -1 || _height != -1 || _x_off != -1 || _y_off != -1) {
-		/* cancel any mouse-based positioning */
-		_window->set_position (Gtk::WIN_POS_NONE);
-	}
-
-	if (_width != -1 && _height != -1) {
-		_window->set_default_size (_width, _height);
-	}
-
-	if (_x_off != -1 && _y_off != -1) {
-		_window->move (_x_off, _y_off);
-	}
+	WindowProxy::setup ();
 	set_session(_session);
-}
-
-void
-ProxyBase::show ()
-{
-	get (true);
-	assert (_window);
-	_window->show ();
-}
-
-void
-ProxyBase::maybe_show ()
-{
-	if (_visible) {
-		show ();
-	}
-}
-
-void
-ProxyBase::show_all ()
-{
-	get (true);
-	assert (_window);
-	_window->show_all ();
-}
 
-void
-ProxyBase::present ()
-{
-	get (true);
-	assert (_window);
-
-	_window->show_all ();
-	_window->present ();
-
-	/* turn off any mouse-based positioning */
-	_window->set_position (Gtk::WIN_POS_NONE);
-}
-
-void
-ProxyBase::hide ()
-{
-	if (_window) {
-		save_pos_and_size();
-		_window->hide ();
-	}
-}
-
-bool
-ProxyBase::delete_event_handler (GdkEventAny* /*ev*/)
-{
-	hide();
-	return true;
 }
 
-void
-ProxyBase::save_pos_and_size ()
-{
-	if (_window) {
-		_window->get_position (_x_off, _y_off);
-		_window->get_size (_width, _height);
-	}
-}
 /*-----------------------*/
 
 ProxyTemporary::ProxyTemporary (const string& name, Gtk::Window* win)
diff --git a/gtk2_ardour/window_manager.h b/gtk2_ardour/window_manager.h
index 6e89be3..9d0363e 100644
--- a/gtk2_ardour/window_manager.h
+++ b/gtk2_ardour/window_manager.h
@@ -1,19 +1,19 @@
 /*
-    Copyright (C) 2013 Paul Davis
+  Copyright (C) 2013 Paul Davis
 
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
+  This program is free software; you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation; either version 2 of the License, or
+  (at your option) any later version.
 
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
 
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 
 */
 
@@ -27,11 +27,14 @@
 #include <glibmm/refptr.h>
 #include <sigc++/trackable.h>
 
+#include "gtkmm2ext/bindings.h"
+#include "gtkmm2ext/window_proxy.h"
+
 class XMLNode;
 
 namespace Gtk {
-	class Window;
-	class Action;
+class Window;
+class Action;
 }
 
 namespace Gtkmm2ext {
@@ -50,192 +53,158 @@ class ProxyBase;
 class Manager : public ARDOUR::SessionHandlePtr
 {
   public:
-    static Manager& instance();
+	static Manager& instance();
 
-    void register_window (ProxyBase*);
-    void remove (const ProxyBase*);
-    void toggle_window (ProxyBase*);
-    void show_visible () const;
-    void set_session (ARDOUR::Session*);
-    void add_state (XMLNode&) const;
+	void register_window (ProxyBase*);
+	void remove (const ProxyBase*);
+	void toggle_window (ProxyBase*);
+	void show_visible () const;
+	void set_session (ARDOUR::Session*);
+	void add_state (XMLNode&) const;
 
-    /* HACK HACK HACK */
-    void set_transient_for (Gtk::Window*);
-    Gtk::Window* transient_parent() const { return current_transient_parent; }
+	/* HACK HACK HACK */
+	void set_transient_for (Gtk::Window*);
+	Gtk::Window* transient_parent() const { return current_transient_parent; }
 
-  private:
-    typedef std::list<ProxyBase*> Windows;
-    Windows _windows;
-    Glib::RefPtr<Gtk::ActionGroup> window_actions;
-    Gtk::Window* current_transient_parent;
+                                        private:
+	typedef std::list<ProxyBase*> Windows;
+	Windows _windows;
+	Glib::RefPtr<Gtk::ActionGroup> window_actions;
+	Gtk::Window* current_transient_parent;
 
-    Manager();
-    ~Manager();
+	Manager();
+	~Manager();
 
-    static Manager* _instance;
+	static Manager* _instance;
+  private:
+	void window_proxy_was_mapped (ProxyBase*);
+	void window_proxy_was_unmapped (ProxyBase*);
 };
 
-class ProxyBase : public ARDOUR::SessionHandlePtr, public sigc::trackable {
+class ProxyBase : public ARDOUR::SessionHandlePtr, public Gtkmm2ext::WindowProxy
+{
   public:
-    ProxyBase (const std::string& name, const std::string& menu_name);
-    ProxyBase (const std::string& name, const std::string& menu_name, const XMLNode&);
-    virtual ~ProxyBase();
-
-    void show ();
-    void show_all ();
-    void hide ();
-    void present ();
-    void maybe_show ();
-
-    bool visible() const { return _visible; }
-    const std::string& name() const { return _name; }
-    const std::string& menu_name() const { return _menu_name; }
-
-    std::string action_name() const;
-    void set_action (Glib::RefPtr<Gtk::Action>);
-    Glib::RefPtr<Gtk::Action> action() const { return _action; };
-
-    void drop_window ();
-    void use_window (Gtk::Window&);
-
-    virtual Gtk::Window* get (bool create = false) = 0;
-
-    virtual void toggle ();
-
-    void set_state (const XMLNode&);
-    XMLNode& get_state () const;
+	ProxyBase (const std::string& name, const std::string& menu_name);
+	ProxyBase (const std::string& name, const std::string& menu_name, const XMLNode&);
 
-    virtual ARDOUR::SessionHandlePtr* session_handle () = 0;
-
-    operator bool() const { return _window != 0; }
+	virtual ARDOUR::SessionHandlePtr* session_handle () = 0;
 
   protected:
-    std::string  _name;
-    std::string  _menu_name;
-    Glib::RefPtr<Gtk::Action> _action;
-    Gtk::Window* _window;
-    mutable bool _visible; ///< true if the window should be visible on startup
-    mutable int  _x_off; ///< x position
-    mutable int  _y_off; ///< y position
-    mutable int  _width; ///< width
-    mutable int  _height; ///< height
-    Gtkmm2ext::VisibilityTracker* vistracker;
-
-    void save_pos_and_size ();
-    bool delete_event_handler (GdkEventAny *ev);
-
-    void setup ();
+	void setup ();
 };
 
-class ProxyTemporary: public ProxyBase {
+class ProxyTemporary: public ProxyBase
+{
   public:
-    ProxyTemporary (const std::string& name, Gtk::Window* win);
-    ~ProxyTemporary();
+	ProxyTemporary (const std::string& name, Gtk::Window* win);
+	~ProxyTemporary();
 
-    Gtk::Window* get (bool create = false) {
-	    (void) create;
-	    return _window;
-    }
+	Gtk::Window* get (bool create = false) {
+		(void) create;
+		return _window;
+	}
 
-    Gtk::Window* operator->() {
-	    return _window;
-    }
+	Gtk::Window* operator->() {
+		return _window;
+	}
 
-    ARDOUR::SessionHandlePtr* session_handle ();
+	ARDOUR::SessionHandlePtr* session_handle ();
 };
 
 template<typename T>
-class ProxyWithConstructor: public ProxyBase {
+class ProxyWithConstructor: public ProxyBase
+{
   public:
-    ProxyWithConstructor (const std::string& name, const std::string& menu_name, const boost::function<T*()>& c)
-	    : ProxyBase (name, menu_name) , creator (c) {}
+	ProxyWithConstructor (const std::string& name, const std::string& menu_name, const boost::function<T*()>& c)
+		: ProxyBase (name, menu_name) , creator (c) {}
 
-    ProxyWithConstructor (const std::string& name, const std::string& menu_name, const boost::function<T*()>& c, const XMLNode* node)
-	    : ProxyBase (name, menu_name, *node) , creator (c) {}
+	ProxyWithConstructor (const std::string& name, const std::string& menu_name, const boost::function<T*()>& c, const XMLNode* node)
+		: ProxyBase (name, menu_name, *node) , creator (c) {}
 
-    Gtk::Window* get (bool create = false) {
-	    if (!_window) {
-		    if (!create) {
-			    return 0;
-		    }
+	Gtk::Window* get (bool create = false) {
+		if (!_window) {
+			if (!create) {
+				return 0;
+			}
 
 			_window = dynamic_cast<Gtk::Window*> (creator ());
 
-		    if (_window) {
-			    setup ();
-		    }
-	    }
-
-	    return _window;
-    }
-
-    T* operator->() {
-	    return dynamic_cast<T*> (get (true));
-    }
-
-    ARDOUR::SessionHandlePtr* session_handle () {
-	    /* may return null */
-	    return dynamic_cast<T*> (_window);
-    }
-
-    void set_session(ARDOUR::Session *s) {
-        SessionHandlePtr::set_session (s);
-        ARDOUR::SessionHandlePtr* sp = session_handle ();
-        if (sp) {
-            sp->set_session (s);
-            dynamic_cast<T*>(_window)->set_session(s);
-        }
-    }
-
-  private:
-    boost::function<T*()>	creator;
+			if (_window) {
+				setup ();
+			}
+		}
+
+		return _window;
+	}
+
+	T* operator->() {
+		return dynamic_cast<T*> (get (true));
+	}
+
+	ARDOUR::SessionHandlePtr* session_handle () {
+		/* may return null */
+		return dynamic_cast<T*> (_window);
+	}
+
+	void set_session(ARDOUR::Session *s) {
+		SessionHandlePtr::set_session (s);
+		ARDOUR::SessionHandlePtr* sp = session_handle ();
+		if (sp) {
+			sp->set_session (s);
+			dynamic_cast<T*>(_window)->set_session(s);
+		}
+	}
+
+                                        private:
+	boost::function<T*()>	creator;
 };
 
 template<typename T>
-class Proxy : public ProxyBase {
+class Proxy : public ProxyBase
+{
   public:
-    Proxy (const std::string& name, const std::string& menu_name)
-	    : ProxyBase (name, menu_name) {}
-
-    Proxy (const std::string& name, const std::string& menu_name, const XMLNode* node)
-	    : ProxyBase (name, menu_name, *node)  {}
-
-    Gtk::Window* get (bool create = false) {
-	    if (!_window) {
-		    if (!create) {
-			    return 0;
-		    }
-
-		    _window = new T ();
-
-		    if (_window) {
-			    setup ();
-		    }
-	    }
-
-	    return _window;
-    }
-
-    T* operator->() {
-	    return dynamic_cast<T*> (get(true));
-    }
-
-    ARDOUR::SessionHandlePtr* session_handle () {
-	    /* may return null */
-	    return dynamic_cast<T*> (_window);
-    }
-
-    void set_session(ARDOUR::Session *s) {
-        SessionHandlePtr::set_session (s);
-        ARDOUR::SessionHandlePtr* sp = session_handle ();
-        if (sp) {
-            sp->set_session (s);
-            dynamic_cast<T*>(_window)->set_session(s);
-        }
-    }
+	Proxy (const std::string& name, const std::string& menu_name)
+		: ProxyBase (name, menu_name) {}
+
+	Proxy (const std::string& name, const std::string& menu_name, const XMLNode* node)
+		: ProxyBase (name, menu_name, *node)  {}
+
+	Gtk::Window* get (bool create = false) {
+		if (!_window) {
+			if (!create) {
+				return 0;
+			}
+
+			_window = new T ();
+
+			if (_window) {
+				setup ();
+			}
+		}
+
+		return _window;
+	}
+
+	T* operator->() {
+		return dynamic_cast<T*> (get(true));
+	}
+
+	ARDOUR::SessionHandlePtr* session_handle () {
+		/* may return null */
+		return dynamic_cast<T*> (_window);
+	}
+
+	void set_session(ARDOUR::Session *s) {
+		SessionHandlePtr::set_session (s);
+		ARDOUR::SessionHandlePtr* sp = session_handle ();
+		if (sp) {
+			sp->set_session (s);
+			dynamic_cast<T*>(_window)->set_session(s);
+		}
+	}
 
   private:
-    boost::function<T*()>	creator;
+	boost::function<T*()>	creator;
 };
 
 } /* namespace */
diff --git a/gtk2_ardour/windows_icon.rc b/gtk2_ardour/windows_icon.rc
deleted file mode 100644
index 4fc17d0..0000000
--- a/gtk2_ardour/windows_icon.rc
+++ /dev/null
@@ -1 +0,0 @@
-IDI_ICON1 ICON DISCARDABLE "icons/ardour.ico"
diff --git a/gtk2_ardour/wscript b/gtk2_ardour/wscript
index 9b864be..e1c349f 100644
--- a/gtk2_ardour/wscript
+++ b/gtk2_ardour/wscript
@@ -11,11 +11,18 @@ from waflib.Task import Task
 from waflib.Tools import winres
 import subprocess
 import glob
+import copy
 
 # Mandatory variables
 top = '.'
 out = 'build'
 
+from waflib import TaskGen
+ at TaskGen.extension('.m')
+def m_hook(self, node):
+	"""Alias .m files to be compiled the same as .c files, gcc will do the right thing."""
+	return self.create_compiled_task('c', node)
+
 path_prefix = 'gtk2_ardour/'
 
 gtk2_ardour_sources = [
@@ -28,7 +35,9 @@ gtk2_ardour_sources = [
         'ardour_dialog.cc',
         'ardour_display.cc',
         'ardour_dropdown.cc',
+        'ardour_http.cc',
         'ardour_knob.cc',
+        'ardour_spinner.cc',
         'ardour_ui.cc',
         'ardour_ui2.cc',
         'ardour_ui_dependents.cc',
@@ -52,9 +61,11 @@ gtk2_ardour_sources = [
         'bundle_manager.cc',
         'button_joiner.cc',
         'clock_group.cc',
+        'color_theme_manager.cc',
         'configinfo.cc',
         'control_point.cc',
         'control_point_dialog.cc',
+        'control_slave_ui.cc',
         'cursor_context.cc',
         'curvetest.cc',
         'debug.cc',
@@ -122,6 +133,9 @@ gtk2_ardour_sources = [
         'led.cc',
         'level_meter.cc',
         'location_ui.cc',
+        'lua_script_manager.cc',
+        'luainstance.cc',
+        'luawindow.cc',
         'main.cc',
         'main_clock.cc',
         'marker.cc',
@@ -141,7 +155,6 @@ gtk2_ardour_sources = [
         'midi_velocity_dialog.cc',
         'missing_file_dialog.cc',
         'missing_plugin_dialog.cc',
-        'mixer_actor.cc',
         'mixer_group_tabs.cc',
         'mixer_strip.cc',
         'mixer_ui.cc',
@@ -173,6 +186,8 @@ gtk2_ardour_sources = [
         'pingback.cc',
         'playlist_selector.cc',
         'plugin_eq_gui.cc',
+        'plugin_pin_dialog.cc',
+        'plugin_setup_dialog.cc',
         'plugin_selector.cc',
         'plugin_ui.cc',
         'port_group.cc',
@@ -207,6 +222,7 @@ gtk2_ardour_sources = [
         'ruler_dialog.cc',
         'save_as_dialog.cc',
         'search_path_option.cc',
+        'script_selector.cc',
         'selection.cc',
         'selection_memento.cc',
         'send_ui.cc',
@@ -228,6 +244,7 @@ gtk2_ardour_sources = [
         'strip_silence_dialog.cc',
         'sys_ex.cc',
         'tape_region_view.cc',
+        'tempo_curve.cc',
         'tempo_dialog.cc',
         'tempo_lines.cc',
         'theme_manager.cc',
@@ -244,6 +261,7 @@ gtk2_ardour_sources = [
         'transpose_dialog.cc',
         'ui_config.cc',
         'utils.cc',
+        'vca_master_strip.cc',
         'verbose_cursor.cc',
         'visibility_group.cc',
         'window_manager.cc',
@@ -251,6 +269,7 @@ gtk2_ardour_sources = [
         'video_image_frame.cc',
         'add_video_dialog.cc',
         'editor_videotimeline.cc',
+        'vca_time_axis.cc',
         'video_timeline.cc',
         'video_monitor.cc',
         'transcode_ffmpeg.cc',
@@ -287,8 +306,11 @@ def enoify (major, minor):
             return "\\n\\\"Evening Star\\\""
         elif minor == 7:
             return "\\n\\\"Cluster and Eno\\\""
-        elif minor == 8:
+    elif major == 5:
+        if minor == 0:
             return "\\n\\\"Before and After Science\\\""
+        elif minor == 1:
+            return "\\n\\\"After the Heat\\\""
     return "\\\"\\\""
 
 def options(opt):
@@ -317,6 +339,23 @@ def configure(conf):
     autowaf.check_pkg(conf, 'x11', uselib_store='X11', atleast_version='1.1', mandatory=False)
     autowaf.check_pkg(conf, 'fontconfig', uselib_store='FONTCONFIG')
 
+
+    if sys.platform == 'darwin':
+        retval = conf.run_c_code (code='#include <AppKit/NSWindow.h>\n\
+        int main(void) { (void) NSWindowWillStartLiveResizeNotification; return 0; }\n',
+                                  env = conf.env.derive (),
+                                  features = [ 'c' ],
+                                  compiler = 'cc',
+                                  compile_filename='test.m',
+                                  mandatory = False,
+            )
+
+        if retval == 0:
+            autowaf.display_msg (conf, 'Checking for Cocoa live resizing constants', 'ok')
+            conf.define ('HAVE_COCOA_LIVE_RESIZING', 1)
+        else:
+            autowaf.display_msg (conf, 'Checking for Cocoa live resizing constants', 'too old - AU plugin windows will be fixed size')
+
     conf.write_config_header('gtk2ardour-config.h', remove=False)
 
     bak = conf.env['define_key']
@@ -401,6 +440,44 @@ def build(bld):
     VERSION = "%s.%s" % (bld.env['MAJOR'], bld.env['MINOR'])
     I18N_PACKAGE = 'gtk2_ardour' + bld.env['MAJOR']
 
+    # Tool to dump lua-bindings (of gtk2ardour + libs)
+    if re.search ("linux", sys.platform) != None and bld.env['LUABINDINGDOC']:
+        obj = bld (features = 'cxx c cxxprogram')
+        obj.install_path = None
+        obj.source    = list(gtk2_ardour_sources)
+        obj.target    = 'luadoc'
+        obj.includes  = ['.', '../libs']
+        obj.ldflags   = ['-no-undefined']
+        obj.use       = [
+                'libpbd',
+                'libardour',
+                'libardour_cp',
+                'libtimecode',
+                'libmidipp',
+                'libgtkmm2ext',
+                'libcanvas',
+                'libptformat',
+                ]
+        obj.defines = [
+                'NOMAIN',
+                'PACKAGE="' + I18N_PACKAGE + '"',
+                'DATA_DIR="' + os.path.normpath(bld.env['DATADIR']) + '"',
+                'CONFIG_DIR="' + os.path.normpath(bld.env['SYSCONFDIR']) + '"',
+                'LOCALEDIR="' + os.path.normpath(bld.env['LOCALEDIR']) + '"',
+                ]
+        obj.linkflags = ''
+        obj.uselib    = 'UUID FLAC FONTCONFIG GLIBMM GTHREAD GTK OGG CURL DL GTKMM CANVAS FFTW3F LO TAGLIB XML '
+        obj.source += [ 'luadoc.cc', 'bundle_env_linux.cc' ]
+        if bld.is_defined('HAVE_SUIL'):
+            obj.source += [ 'lv2_plugin_ui.cc' ]
+            obj.use += [ 'SUIL' ]
+        if bld.is_defined('LXVST_SUPPORT'):
+            obj.source += [ 'vst_plugin_ui.cc' ]
+            obj.source += [ 'linux_vst_gui_support.cc', 'lxvst_plugin_ui.cc' ]
+            obj.defines += [ 'LXVST_SUPPORT' ]
+            obj.use += [ 'X11' ]
+
+
     if bld.is_defined('WINDOWS_VST_SUPPORT') and bld.env['build_target'] != 'mingw':
         # Windows VST support w/wine
         # If we require VST support we build a stub main() and the FST library
@@ -475,13 +552,10 @@ def build(bld):
         ]
     obj.install_path = bld.env['DLLDIR']
     obj.linkflags    = ''
-    obj.uselib       = 'UUID FLAC FONTCONFIG GLIBMM GTHREAD GTK OGG CURL DL'
-    obj.uselib       += ' GTKMM CANVAS FFTW3F'
-    obj.uselib       += ' AUDIOUNITS OSX GTKOSX LO '
-    obj.uselib       += ' TAGLIB '
+    obj.uselib       = 'UUID FLAC FONTCONFIG GLIBMM GTHREAD GTK OGG CURL DL GTKMM CANVAS FFTW3F LO TAGLIB XML '
 
     if sys.platform == 'darwin':
-        obj.uselib += ' AUDIOUNITS OSX GTKOSX'
+        obj.uselib += ' AUDIOUNITS OSX '
         obj.use    += ' libappleutility'
         obj.source += [ 'cocoacarbon.mm', 'bundle_env_cocoa.cc' ]
     elif bld.env['build_target'] == 'mingw':
@@ -578,7 +652,7 @@ def build(bld):
     base_font       = ""
 
     # Set up font sizes
-    if bld.is_defined('GTKOSX'): # OS X fonts
+    if sys.platform == 'darwin':
         basefont = ""
         font_sizes = {
                 'SMALLER' : '9',
@@ -662,8 +736,8 @@ def build(bld):
 
     # Menus
     menus_argv = []
-    if bld.is_defined('GTKOSX'):
-        menus_argv = [ '-E', '-P', '-DGTKOSX', '-' ]
+    if sys.platform == 'darwin':
+        menus_argv = [ '-E', '-P', '-D__APPLE__', '-' ]
     else:
         menus_argv = [ '-E', '-P' ]
 
@@ -715,33 +789,26 @@ def build(bld):
 
     # Keybindings
 
-    # 'SAE-de-keypad', 'SAE-de-nokeypad', 'SAE-us-keypad',
-    # 'SAE-us-nokeypad', 'ergonomic-us'
-
-    #
+    # NATIVE ARDOUR BINDING FILES
     # explicitly state the use of perl here so that it works on windows too
-    #
-    a_rule = 'perl ../tools/fmt-bindings --platform="%s" --winkey="%s" --accelmap <${SRC} >${TGT}' % (sys.platform, bld.env['WINDOWS_KEY'] )
-    for b in [ 'mnemonic-us' ] :
+    # 
+    a_rule = 'perl ../tools/fmt-bindings --platform="%s" --winkey="%s" --accelmap ${SRC[0].abspath()} >${TGT}' % (sys.platform, bld.env['WINDOWS_KEY'] )
+    for b in [ 'ardour' ] :
         obj = bld(
-            target = b + '.bindings',
-            source = b + '.bindings.in',
+            target = b + '.keys',
+            source = [ b + '.keys.in', 'mixer.bindings', 'processor_box.bindings', 'step_editing.bindings', 'monitor.bindings' ],
             rule = a_rule
             )
         obj.install_path = bld.env['CONFDIR']
-
-    # not modified at present
-    bld.install_files(bld.env['CONFDIR'], 'dark.colors')
-    bld.install_files(bld.env['CONFDIR'], 'step_editing.bindings')
-    bld.install_files(bld.env['CONFDIR'], 'mixer.bindings')
-
+        
     # Icons/Images
     bld.install_files(os.path.join (bld.env['DATADIR'], 'icons'), bld.path.ant_glob('icons/*.png'))
-    bld.install_files(os.path.join (bld.env['DATADIR'], 'pixmaps'), bld.path.ant_glob('pixmaps/*.xpm'))
-    bld.install_files(bld.env['DATADIR'], 'splash.png')
-    bld.install_files(bld.env['DATADIR'], 'small-splash.png')
     bld.install_files(bld.env['DATADIR'], 'ArdourMono.ttf')
 
+    # Application/Product specific resources (icon, splash)
+    pgmname = Options.options.program_name;
+    bld.install_files(os.path.join(bld.env['DATADIR'], 'resources'), bld.path.ant_glob('resources/' + pgmname + '*'))
+
     if bld.env['build_target'] == 'mingw':
         # These icons need to overwrite the files already installed in the icons
         # directory above. Do this in the external packaging scripts for now.
@@ -750,8 +817,9 @@ def build(bld):
 
     # Default UI configuration
     bld.install_files(bld.env['CONFDIR'], 'default_ui_config')
-    # Color Themes
-    bld.install_files(bld.env['CONFDIR'], 'dark.colors')
+    # Color Themes. Find each color file for this program only
+    # and install
+    bld.install_files (os.path.join(bld.env['DATADIR'], 'themes'), bld.path.ant_glob ('themes/*-' + Options.options.program_name.lower() + '.colors'));
 
     # Default export stuff
     bld.install_files(os.path.join(bld.env['CONFDIR'], 'export'), bld.path.ant_glob('export/*.format'))
@@ -791,13 +859,16 @@ def i18n_mo(bld):
 def appdata_i18n_pot(bld):
     potfile = os.path.join(bld.top_dir, 'gtk2_ardour', 'appdata',
             'ardour.appdata.pot')
-    if bld.cmd == 'build':
+    if bld.cmd == 'i18n_pot':
         Logs.info('Generating pot file from Ardour appdata')
         itsfile = os.path.join(bld.top_dir, 'tools', 'as-metainfo.its')
         adsource = os.path.join(bld.top_dir, 'gtk2_ardour',
                 'ardour.appdata.xml.in.in')
         Logs.info('Updating ' + potfile)
-        subprocess.call(('itstool', '-i', itsfile, '-o', potfile, adsource))
+        try:
+                subprocess.call(('itstool', '-i', itsfile, '-o', potfile, adsource))
+        except:
+                print ('Error processing appdata pot file - ignored')
     elif bld.cmd == 'clean' and os.path.exists(potfile):
         Logs.info('Removing Ardour appdata pot file')
         os.remove(potfile)
diff --git a/headless/wscript b/headless/wscript
index 31a111b..675c76b 100644
--- a/headless/wscript
+++ b/headless/wscript
@@ -58,7 +58,7 @@ def build(bld):
         'LOCALEDIR="' + os.path.join(os.path.normpath(bld.env['DATADIR']), 'locale') + '"',
         ]
     obj.install_path = bld.env['LIBDIR']
-    obj.uselib       = 'UUID FLAC FONTCONFIG GLIBMM GTHREAD OGG CURL DL'
+    obj.uselib       = 'UUID FLAC FONTCONFIG GLIBMM GTHREAD OGG CURL DL XML'
     obj.uselib       += ' FFTW3F'
     obj.uselib       += ' AUDIOUNITS OSX LO '
     obj.uselib       += ' TAGLIB '
diff --git a/icons/made_with/ardour_made.png b/icons/made_with/ardour_made.png
deleted file mode 100644
index 9dd672e..0000000
Binary files a/icons/made_with/ardour_made.png and /dev/null differ
diff --git a/icons/made_with/ardour_made.xar b/icons/made_with/ardour_made.xar
deleted file mode 100644
index f349ede..0000000
Binary files a/icons/made_with/ardour_made.xar and /dev/null differ
diff --git a/icons/metronome.svg b/icons/metronome.svg
deleted file mode 100644
index 8c637ed..0000000
--- a/icons/metronome.svg
+++ /dev/null
@@ -1,136 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="24"
-   height="24"
-   id="svg2"
-   version="1.1"
-   inkscape:version="0.47 r22583"
-   sodipodi:docname="metronome.svg"
-   inkscape:export-filename="/usr/local/music/src/ardour/3.0/icons/metronome.png"
-   inkscape:export-xdpi="90.629997"
-   inkscape:export-ydpi="90.629997">
-  <defs
-     id="defs4">
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 12 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="24 : 12 : 1"
-       inkscape:persp3d-origin="12 : 8 : 1"
-       id="perspective16" />
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#54555d"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="22.627417"
-     inkscape:cx="3.8473868"
-     inkscape:cy="10.831237"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="false"
-     borderlayer="true"
-     inkscape:showpageshadow="false"
-     inkscape:window-width="1361"
-     inkscape:window-height="851"
-     inkscape:window-x="1660"
-     inkscape:window-y="15"
-     inkscape:window-maximized="0"
-     inkscape:snap-bbox="true"
-     inkscape:object-paths="true"
-     inkscape:snap-intersection-paths="true"
-     inkscape:object-nodes="true"
-     inkscape:snap-smooth-nodes="true"
-     inkscape:snap-midpoints="true"
-     inkscape:snap-object-midpoints="true"
-     inkscape:snap-center="true"
-     inkscape:snap-bbox-midpoints="true"
-     inkscape:bbox-nodes="true"
-     inkscape:bbox-paths="true"
-     inkscape:snap-bbox-edge-midpoints="true">
-    <inkscape:grid
-       type="xygrid"
-       id="grid3082"
-       empspacing="5"
-       visible="true"
-       enabled="true"
-       snapvisiblegridlinesonly="true" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(0,-1028.3622)">
-    <path
-       inkscape:connector-curvature="0"
-       id="path3863"
-       d="m 10.168027,1029.8622 -5.6055269,21 14.8749999,0 -5.605526,-21 -0.751578,0 -2.129475,0 -0.782894,0 z"
-       style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-       inkscape:export-xdpi="115.66"
-       inkscape:export-ydpi="115.66" />
-    <path
-       inkscape:connector-curvature="0"
-       id="path3865"
-       d="m 6.541341,1043.5578 10.917318,0"
-       style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
-    <path
-       inkscape:connector-curvature="0"
-       id="path3101"
-       d="M 10.668623,1043.5578 5.3644182,1030.6693"
-       style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-       sodipodi:nodetypes="cc"
-       inkscape:transform-center-y="-8.3149"
-       inkscape:transform-center-x="3.4441509" />
-    <g
-       id="g3856"
-       style="stroke:#ffffff;stroke-width:2.19440592;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none;opacity:0.66417910000000002"
-       transform="matrix(0.90977646,0,0,0.91304328,1.0826824,90.466479)">
-      <path
-         inkscape:connector-curvature="0"
-         id="path3054"
-         d="M 5.9999998,1043.8622 18,1043.8622"
-         style="fill:none;stroke:#ffffff;stroke-width:2.19440592;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
-      <g
-         id="g3962"
-         style="stroke:#ffffff;stroke-width:2.19440592;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none">
-        <path
-           style="fill:none;stroke:#ffffff;stroke-width:2.19440592;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
-           d="m 9.9863479,1028.8622 -6.1614328,23 16.3501699,0 -6.161432,-23 -0.826113,0 -2.340657,0 -0.8605351,0 z"
-           id="path3047"
-           inkscape:connector-curvature="0" />
-        <path
-           inkscape:transform-center-x="3.4441509"
-           inkscape:transform-center-y="-8.3149"
-           sodipodi:nodetypes="cc"
-           style="fill:none;stroke:#ffffff;stroke-width:2.19440592;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
-           d="M 10.609225,1044.038 5.1116982,1030.7324"
-           id="path3960"
-           inkscape:connector-curvature="0" />
-      </g>
-    </g>
-  </g>
-</svg>
diff --git a/icons/midi_panic.svg b/icons/midi_panic.svg
deleted file mode 100644
index 5c894da..0000000
--- a/icons/midi_panic.svg
+++ /dev/null
@@ -1,93 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="744.09448819"
-   height="1052.3622047"
-   id="svg2"
-   version="1.1"
-   inkscape:version="0.47 r22583"
-   inkscape:export-filename="midi_panic.png"
-   inkscape:export-xdpi="3.3178849"
-   inkscape:export-ydpi="3.3178849"
-   sodipodi:docname="midi_panic.svg">
-  <defs
-     id="defs4">
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 526.18109 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="744.09448 : 526.18109 : 1"
-       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
-       id="perspective10" />
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="0.35"
-     inkscape:cx="-727.85714"
-     inkscape:cy="502.85714"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="false"
-     inkscape:window-width="1436"
-     inkscape:window-height="949"
-     inkscape:window-x="137"
-     inkscape:window-y="86"
-     inkscape:window-maximized="0" />
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1">
-    <rect
-       style="opacity:0;color:#000000;fill:#ffffff;fill-opacity:1;stroke:#000500;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-       id="rect2816"
-       width="74.285728"
-       height="448.57144"
-       x="242.85715"
-       y="118.07647" />
-    <path
-       sodipodi:type="arc"
-       style="color:#000000;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;opacity:0.61851852"
-       id="path3600"
-       sodipodi:cx="121.42857"
-       sodipodi:cy="768.07648"
-       sodipodi:rx="38.57143"
-       sodipodi:ry="38.57143"
-       d="m 160,768.07648 a 38.57143,38.57143 0 1 1 -77.142857,0 38.57143,38.57143 0 1 1 77.142857,0 z"
-       transform="matrix(2.5060478,0,0,2.3125359,-112.56833,-836.59512)"
-       inkscape:export-filename="/usr/local/music/src/ardour/3.0/gtk2_ardour/icons/midi_panic.png"
-       inkscape:export-xdpi="2.6415093"
-       inkscape:export-ydpi="2.6415093" />
-    <path
-       style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1.26678240000000009px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;opacity:0.61851852"
-       d="m 82.984333,281.07273 9.74369,328.04567 58.462137,220.48971 82.82135,0 48.71844,-223.1786 -4.87182,-322.66789 0,0 -194.873797,-2.68889 z"
-       id="path3602"
-       inkscape:export-xdpi="2.6415093"
-       inkscape:export-ydpi="2.6415093"
-       inkscape:export-filename="/usr/local/music/src/ardour/3.0/gtk2_ardour/icons/midi_panic.png" />
-  </g>
-</svg>
diff --git a/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACBaseCodec.cpp b/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACBaseCodec.cpp
index f1ffdf7..f545edd 100644
--- a/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACBaseCodec.cpp
+++ b/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACBaseCodec.cpp
@@ -2,14 +2,14 @@
      File: ACBaseCodec.cpp
  Abstract: ACBaseCodec.h
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 //=============================================================================
 //	Includes
@@ -93,27 +93,27 @@ void	ACBaseCodec::GetPropertyInfo(AudioCodecPropertyID inPropertyID, UInt32& out
 			outPropertyDataSize = SizeOf32(CFStringRef);
 			outWritable = false;
 			break;
-			
+
 		case kAudioCodecPropertyManufacturerCFString:
 			outPropertyDataSize = SizeOf32(CFStringRef);
 			outWritable = false;
 			break;
-			
+
 		case kAudioCodecPropertyFormatCFString:
 			outPropertyDataSize = SizeOf32(CFStringRef);
 			outWritable = false;
-			break;			
+			break;
 #endif
 		case kAudioCodecPropertyRequiresPacketDescription:
 			outPropertyDataSize = SizeOf32(UInt32);
 			outWritable = false;
 			break;
-			
+
 		case kAudioCodecPropertyMinimumNumberInputPackets :
 			outPropertyDataSize = SizeOf32(UInt32);
 			outWritable = false;
 			break;
-			
+
 		case kAudioCodecPropertyMinimumNumberOutputPackets :
 			outPropertyDataSize = SizeOf32(UInt32);
 			outWritable = false;
@@ -123,39 +123,39 @@ void	ACBaseCodec::GetPropertyInfo(AudioCodecPropertyID inPropertyID, UInt32& out
 			outPropertyDataSize = SizeOf32(AudioStreamBasicDescription);
 			outWritable = true;
 			break;
-			
+
 		case kAudioCodecPropertySupportedInputFormats:
 		case kAudioCodecPropertyInputFormatsForOutputFormat:
 			outPropertyDataSize = GetNumberSupportedInputFormats() * SizeOf32(AudioStreamBasicDescription);
 			outWritable = false;
 			break;
-			
+
 		case kAudioCodecPropertyCurrentOutputFormat:
 			outPropertyDataSize = SizeOf32(AudioStreamBasicDescription);
 			outWritable = true;
 			break;
-			
+
 		case kAudioCodecPropertySupportedOutputFormats:
 		case kAudioCodecPropertyOutputFormatsForInputFormat:
 			outPropertyDataSize = GetNumberSupportedOutputFormats() * SizeOf32(AudioStreamBasicDescription);
 			outWritable = false;
 			break;
-			
+
 		case kAudioCodecPropertyMagicCookie:
 			outPropertyDataSize = GetMagicCookieByteSize();
 			outWritable = true;
 			break;
-			
+
 		case kAudioCodecPropertyInputBufferSize:
 			outPropertyDataSize = SizeOf32(UInt32);
 			outWritable = false;
 			break;
-			
+
 		case kAudioCodecPropertyUsedInputBufferSize:
 			outPropertyDataSize = SizeOf32(UInt32);
 			outWritable = false;
 			break;
-		
+
 		case kAudioCodecPropertyIsInitialized:
 			outPropertyDataSize = SizeOf32(UInt32);
 			outWritable = false;
@@ -165,7 +165,7 @@ void	ACBaseCodec::GetPropertyInfo(AudioCodecPropertyID inPropertyID, UInt32& out
 			outPropertyDataSize = SizeOf32(UInt32) * 2; // Mono, stereo
 			outWritable = false;
 			break;
-			
+
  		case kAudioCodecPropertyPrimeMethod:
 			outPropertyDataSize = SizeOf32(UInt32);
 			outWritable = false;
@@ -184,35 +184,35 @@ void	ACBaseCodec::GetPropertyInfo(AudioCodecPropertyID inPropertyID, UInt32& out
 		default:
 			CODEC_THROW(kAudioCodecUnknownPropertyError);
 			break;
-			
+
 	};
 }
 
 void	ACBaseCodec::GetProperty(AudioCodecPropertyID inPropertyID, UInt32& ioPropertyDataSize, void* outPropertyData)
 {
 	UInt32 thePacketsToGet;
-	
+
 	switch(inPropertyID)
 	{
 #if !BUILD_ADEC_LIB
 		case kAudioCodecPropertyNameCFString:
 		{
 			if (ioPropertyDataSize != SizeOf32(CFStringRef)) CODEC_THROW(kAudioCodecBadPropertySizeError);
-			
+
 			CABundleLocker lock;
 			CFStringRef name = CFCopyLocalizedStringFromTableInBundle(CFSTR("unknown codec"), CFSTR("CodecNames"), GetCodecBundle(), CFSTR(""));
 			*(CFStringRef*)outPropertyData = name;
-			break; 
+			break;
 		}
-		
+
 		case kAudioCodecPropertyManufacturerCFString:
 		{
 			if (ioPropertyDataSize != SizeOf32(CFStringRef)) CODEC_THROW(kAudioCodecBadPropertySizeError);
-			
+
 			CABundleLocker lock;
 			CFStringRef name = CFCopyLocalizedStringFromTableInBundle(CFSTR("Apple, Inc."), CFSTR("CodecNames"), GetCodecBundle(), CFSTR(""));
 			*(CFStringRef*)outPropertyData = name;
-			break; 
+			break;
 		}
 #else
 			// If called on the device these should return nothing but 0
@@ -226,24 +226,24 @@ void	ACBaseCodec::GetProperty(AudioCodecPropertyID inPropertyID, UInt32& ioPrope
         case kAudioCodecPropertyRequiresPacketDescription:
   			if(ioPropertyDataSize == SizeOf32(UInt32))
 			{
-                *reinterpret_cast<UInt32*>(outPropertyData) = 0; 
+                *reinterpret_cast<UInt32*>(outPropertyData) = 0;
             }
 			else
 			{
 				CODEC_THROW(kAudioCodecBadPropertySizeError);
 			}
             break;
-			
+
 		case kAudioCodecPropertyMinimumNumberInputPackets :
 			if(ioPropertyDataSize != SizeOf32(UInt32)) CODEC_THROW(kAudioCodecBadPropertySizeError);
 			*(UInt32*)outPropertyData = 1;
 			break;
-			
+
 		case kAudioCodecPropertyMinimumNumberOutputPackets :
 			if(ioPropertyDataSize != SizeOf32(UInt32)) CODEC_THROW(kAudioCodecBadPropertySizeError);
 			*(UInt32*)outPropertyData = 1;
 			break;
-			
+
 		case kAudioCodecPropertyCurrentInputFormat:
 			if(ioPropertyDataSize == SizeOf32(AudioStreamBasicDescription))
 			{
@@ -254,14 +254,14 @@ void	ACBaseCodec::GetProperty(AudioCodecPropertyID inPropertyID, UInt32& ioPrope
 				CODEC_THROW(kAudioCodecBadPropertySizeError);
 			}
 			break;
-			
+
 		case kAudioCodecPropertySupportedInputFormats:
 		case kAudioCodecPropertyInputFormatsForOutputFormat:
 			thePacketsToGet = ioPropertyDataSize / SizeOf32(AudioStreamBasicDescription);
 			GetSupportedInputFormats(reinterpret_cast<AudioStreamBasicDescription*>(outPropertyData), thePacketsToGet);
 			ioPropertyDataSize = thePacketsToGet * SizeOf32(AudioStreamBasicDescription);
 			break;
-			
+
 		case kAudioCodecPropertyCurrentOutputFormat:
 			if(ioPropertyDataSize == SizeOf32(AudioStreamBasicDescription))
 			{
@@ -272,14 +272,14 @@ void	ACBaseCodec::GetProperty(AudioCodecPropertyID inPropertyID, UInt32& ioPrope
 				CODEC_THROW(kAudioCodecBadPropertySizeError);
 			}
 			break;
-			
+
 		case kAudioCodecPropertySupportedOutputFormats:
 		case kAudioCodecPropertyOutputFormatsForInputFormat:
 			thePacketsToGet = ioPropertyDataSize / SizeOf32(AudioStreamBasicDescription);
 			GetSupportedOutputFormats(reinterpret_cast<AudioStreamBasicDescription*>(outPropertyData), thePacketsToGet);
 			ioPropertyDataSize = thePacketsToGet * SizeOf32(AudioStreamBasicDescription);
 			break;
-			
+
 		case kAudioCodecPropertyMagicCookie:
 			if(ioPropertyDataSize >= GetMagicCookieByteSize())
 			{
@@ -290,7 +290,7 @@ void	ACBaseCodec::GetProperty(AudioCodecPropertyID inPropertyID, UInt32& ioPrope
 				CODEC_THROW(kAudioCodecBadPropertySizeError);
 			}
 			break;
-			
+
 		case kAudioCodecPropertyInputBufferSize:
 			if(ioPropertyDataSize == SizeOf32(UInt32))
 			{
@@ -301,7 +301,7 @@ void	ACBaseCodec::GetProperty(AudioCodecPropertyID inPropertyID, UInt32& ioPrope
 				CODEC_THROW(kAudioCodecBadPropertySizeError);
 			}
 			break;
-			
+
 		case kAudioCodecPropertyUsedInputBufferSize:
 			if(ioPropertyDataSize == SizeOf32(UInt32))
 			{
@@ -312,7 +312,7 @@ void	ACBaseCodec::GetProperty(AudioCodecPropertyID inPropertyID, UInt32& ioPrope
 				CODEC_THROW(kAudioCodecBadPropertySizeError);
 			}
 			break;
-			
+
 		case kAudioCodecPropertyIsInitialized:
 			if(ioPropertyDataSize == SizeOf32(UInt32))
 			{
@@ -323,7 +323,7 @@ void	ACBaseCodec::GetProperty(AudioCodecPropertyID inPropertyID, UInt32& ioPrope
 				CODEC_THROW(kAudioCodecBadPropertySizeError);
 			}
 			break;
-			
+
         case kAudioCodecPropertyAvailableNumberChannels:
   			if(ioPropertyDataSize == SizeOf32(UInt32) * 2)
 			{
@@ -373,7 +373,7 @@ void	ACBaseCodec::GetProperty(AudioCodecPropertyID inPropertyID, UInt32& ioPrope
 		default:
 			CODEC_THROW(kAudioCodecUnknownPropertyError);
 			break;
-			
+
 	};
 }
 
@@ -384,7 +384,7 @@ void	ACBaseCodec::SetProperty(AudioCodecPropertyID inPropertyID, UInt32 inProper
 	{
 		CODEC_THROW(kAudioCodecIllegalOperationError);
 	}
-	
+
 	switch(inPropertyID)
 	{
 		case kAudioCodecPropertyCurrentInputFormat:
@@ -397,7 +397,7 @@ void	ACBaseCodec::SetProperty(AudioCodecPropertyID inPropertyID, UInt32 inProper
 				CODEC_THROW(kAudioCodecBadPropertySizeError);
 			}
 			break;
-			
+
 		case kAudioCodecPropertyCurrentOutputFormat:
 			if(inPropertyDataSize == SizeOf32(AudioStreamBasicDescription))
 			{
@@ -408,11 +408,11 @@ void	ACBaseCodec::SetProperty(AudioCodecPropertyID inPropertyID, UInt32 inProper
 				CODEC_THROW(kAudioCodecBadPropertySizeError);
 			}
 			break;
-			
+
 		case kAudioCodecPropertyMagicCookie:
 			SetMagicCookie(inPropertyData, inPropertyDataSize);
 			break;
-			
+
 		case kAudioCodecPropertyMinimumNumberOutputPackets :
 		case kAudioCodecPropertyMinimumNumberInputPackets :
 		case kAudioCodecPropertyInputBufferSize:
@@ -432,7 +432,7 @@ void	ACBaseCodec::SetProperty(AudioCodecPropertyID inPropertyID, UInt32 inProper
 		case kAudioCodecPropertyRequiresPacketDescription:
 			CODEC_THROW(kAudioCodecIllegalOperationError);
 			break;
-			
+
 		default:
 			CODEC_THROW(kAudioCodecUnknownPropertyError);
 			break;
@@ -462,13 +462,13 @@ void	ACBaseCodec::GetSupportedInputFormats(AudioStreamBasicDescription* outInput
 {
 	UInt32 theNumberFormats = (UInt32)mInputFormatList.size();
 	ioNumberInputFormats = (theNumberFormats < ioNumberInputFormats) ? theNumberFormats : ioNumberInputFormats;
-	
+
 	FormatList::const_iterator theIterator = mInputFormatList.begin();
 	theNumberFormats = ioNumberInputFormats;
 	while((theNumberFormats > 0) && (theIterator != mInputFormatList.end()))
 	{
 		*outInputFormats = *theIterator;
-		
+
 		++outInputFormats;
 		--theNumberFormats;
 		std::advance(theIterator, 1);
@@ -501,13 +501,13 @@ void	ACBaseCodec::GetSupportedOutputFormats(AudioStreamBasicDescription* outOutp
 {
 	UInt32 theNumberFormats = (UInt32)mOutputFormatList.size();
 	ioNumberOutputFormats = (theNumberFormats < ioNumberOutputFormats) ? theNumberFormats : ioNumberOutputFormats;
-	
+
 	FormatList::const_iterator theIterator = mOutputFormatList.begin();
 	theNumberFormats = ioNumberOutputFormats;
 	while((theNumberFormats > 0) && (theIterator != mOutputFormatList.end()))
 	{
 		*outOutputFormats = *theIterator;
-		
+
 		++outOutputFormats;
 		--theNumberFormats;
 		std::advance(theIterator, 1);
diff --git a/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACBaseCodec.h b/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACBaseCodec.h
index 6689d91..2329d94 100644
--- a/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACBaseCodec.h
+++ b/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACBaseCodec.h
@@ -2,14 +2,14 @@
      File: ACBaseCodec.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #if !defined(__ACBaseCodec_h__)
 #define __ACBaseCodec_h__
@@ -92,7 +92,7 @@ public:
 
 protected:
 	virtual void					ReallocateInputBuffer(UInt32 inInputBufferByteSize) = 0;
-	
+
 	bool							mIsInitialized;
 
 //	Format Management
@@ -102,13 +102,13 @@ public:
 
 	void							GetCurrentInputFormat(AudioStreamBasicDescription& outInputFormat);
 	virtual void					SetCurrentInputFormat(const AudioStreamBasicDescription& inInputFormat);
-	
+
 	UInt32							GetNumberSupportedOutputFormats() const;
 	void							GetSupportedOutputFormats(AudioStreamBasicDescription* outOutputFormats, UInt32& ioNumberOutputFormats) const;
-	
+
 	void							GetCurrentOutputFormat(AudioStreamBasicDescription& outOutputFormat);
 	virtual void					SetCurrentOutputFormat(const AudioStreamBasicDescription& inOutputFormat);
-	
+
 	virtual UInt32					GetMagicCookieByteSize() const;
 	virtual void					GetMagicCookie(void* outMagicCookieData, UInt32& ioMagicCookieDataByteSize) const;
 	virtual void					SetMagicCookie(const void* outMagicCookieData, UInt32 inMagicCookieDataByteSize);
@@ -119,11 +119,11 @@ public:
 protected:
 	void							AddInputFormat(const AudioStreamBasicDescription& inInputFormat);
 	void							AddOutputFormat(const AudioStreamBasicDescription& inOutputFormat);
-	
+
 	OSType							GetSubType();
-	
+
 	typedef std::vector<CAStreamBasicDescription>	FormatList;
-	
+
 	FormatList						mInputFormatList;
 #if TARGET_OS_WIN32
 	// VC 2005 screws up if this is not aligned to 8-byte boundaries
@@ -131,7 +131,7 @@ protected:
 #else
 	CAStreamBasicDescription		mInputFormat;
 #endif
-	
+
 	FormatList						mOutputFormatList;
 #if TARGET_OS_WIN32
 	// VC 2005 screws up if this is not aligned to 8-byte boundaries
diff --git a/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACCodec.cpp b/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACCodec.cpp
index 512f938..19cc0cd 100644
--- a/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACCodec.cpp
+++ b/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACCodec.cpp
@@ -2,14 +2,14 @@
      File: ACCodec.cpp
  Abstract: ACCodec.h
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 //=============================================================================
 //	Includes
@@ -83,18 +83,18 @@ ACCodec::~ACCodec()
 OSStatus	ACCodec::ComponentEntryDispatch(ComponentParameters *inParameters, ACCodec *inThis)
 {
 	OSStatus		theError = kAudioCodecNoError;
-	
+
 	try
 	{
 		switch (inParameters->what)
 		{
 				//	these selectors don't use the object pointer
-				
+
 			case kComponentOpenSelect:
 			case kComponentCloseSelect:
 				theError = ComponentBase::ComponentEntryDispatch(inParameters, inThis);
 				break;
-				
+
 			case kComponentCanDoSelect:
 			{
 				switch (GetSelectorForCanDo(inParameters))
@@ -115,7 +115,7 @@ OSStatus	ACCodec::ComponentEntryDispatch(ComponentParameters *inParameters, ACCo
 				}
 			}
 			break;
-				
+
 			default:
 				//	these selectors use the object pointer
 				if(inThis != NULL)
@@ -125,16 +125,16 @@ OSStatus	ACCodec::ComponentEntryDispatch(ComponentParameters *inParameters, ACCo
 						case kComponentVersionSelect:
 							theError = inThis->Version();
 							break;
-							
+
 						case kAudioCodecGetPropertyInfoSelect:
 						{
 							PARAM(AudioCodecPropertyID, inPropertyID, 0, 3);
 							PARAM(UInt32 *, outSize, 1, 3);
 							PARAM(Boolean *, outWritable, 2, 3);
-							
+
 							UInt32 theSize = 0;
 							Boolean isWritable = false;
-							
+
 							inThis->GetPropertyInfo(inPropertyID, theSize, isWritable);
 							if(outSize != NULL)
 							{
@@ -146,13 +146,13 @@ OSStatus	ACCodec::ComponentEntryDispatch(ComponentParameters *inParameters, ACCo
 							}
 						}
 							break;
-							
+
 						case kAudioCodecGetPropertySelect:
 						{
 							PARAM(AudioCodecPropertyID, inPropertyID, 0, 3);
 							PARAM(UInt32 *, ioPropertyDataSize, 1, 3);
 							PARAM(void *, outPropertyData, 2, 3);
-							
+
 							if((ioPropertyDataSize != NULL) && (outPropertyData != NULL))
 							{
 								inThis->GetProperty(inPropertyID, *ioPropertyDataSize, outPropertyData);
@@ -163,13 +163,13 @@ OSStatus	ACCodec::ComponentEntryDispatch(ComponentParameters *inParameters, ACCo
 							}
 						}
 							break;
-							
+
 						case kAudioCodecSetPropertySelect:
 						{
 							PARAM(AudioCodecPropertyID, inPropertyID, 0, 3);
 							PARAM(UInt32, inPropertyDataSize, 1, 3);
 							PARAM(const void *, inPropertyData, 2, 3);
-							
+
 							if(inPropertyData != NULL)
 							{
 								inThis->SetProperty(inPropertyID, inPropertyDataSize, inPropertyData);
@@ -180,31 +180,31 @@ OSStatus	ACCodec::ComponentEntryDispatch(ComponentParameters *inParameters, ACCo
 							}
 						}
 							break;
-							
+
 						case kAudioCodecInitializeSelect:
 						{
 							PARAM(const AudioStreamBasicDescription *, inInputFormat, 0, 4);
 							PARAM(const AudioStreamBasicDescription *, inOutputFormat, 1, 4);
 							PARAM(const void *, inMagicCookie, 2, 4);
 							PARAM(UInt32, inMagicCookieByteSize, 3, 4);
-							
+
 							inThis->Initialize(inInputFormat, inOutputFormat, inMagicCookie, inMagicCookieByteSize);
 						}
 							break;
-							
+
 						case kAudioCodecUninitializeSelect:
 						{
 							inThis->Uninitialize();
 						}
 							break;
-							
+
 						case kAudioCodecAppendInputDataSelect:
 						{
 							PARAM(const void *, inInputData, 0, 4);
 							PARAM(UInt32 *, ioInputDataByteSize, 1, 4);
 							PARAM(UInt32 *, ioNumberPackets, 2, 4);
 							PARAM(const AudioStreamPacketDescription *, inPacketDescription, 3, 4);
-							
+
 							if((inInputData != NULL) && (ioInputDataByteSize != NULL))
 							{
 								if(ioNumberPackets != NULL)
@@ -223,7 +223,7 @@ OSStatus	ACCodec::ComponentEntryDispatch(ComponentParameters *inParameters, ACCo
 							}
 						}
 							break;
-							
+
 						case kAudioCodecProduceOutputDataSelect:
 						{
 							PARAM(void *, outOutputData, 0, 5);
@@ -231,7 +231,7 @@ OSStatus	ACCodec::ComponentEntryDispatch(ComponentParameters *inParameters, ACCo
 							PARAM(UInt32 *, ioNumberPackets, 2, 5);
 							PARAM(AudioStreamPacketDescription *, outPacketDescription, 3, 5);
 							PARAM(UInt32 *, outStatus, 4, 5);
-							
+
 							if((outOutputData != NULL) && (ioOutputDataByteSize != NULL) && (ioNumberPackets != NULL) && (outStatus != NULL))
 							{
 								*outStatus = inThis->ProduceOutputPackets(outOutputData, *ioOutputDataByteSize, *ioNumberPackets, outPacketDescription);
@@ -246,7 +246,7 @@ OSStatus	ACCodec::ComponentEntryDispatch(ComponentParameters *inParameters, ACCo
 							}
 						}
 							break;
-							
+
 #if AC_NON_INTERLEAVED_SUPPORT
 						case kAudioCodecAppendInputBufferListSelect:
 						{
@@ -254,7 +254,7 @@ OSStatus	ACCodec::ComponentEntryDispatch(ComponentParameters *inParameters, ACCo
 							PARAM(UInt32 *, ioNumberPackets, 1, 4);
 							PARAM(const AudioStreamPacketDescription *, inPacketDescription, 2, 4);
 							PARAM(UInt32 *, outBytesConsumed, 3, 4);
-							
+
 							if((inBufferList != NULL) && (outBytesConsumed != NULL))
 							{
 								if(ioNumberPackets != NULL)
@@ -273,14 +273,14 @@ OSStatus	ACCodec::ComponentEntryDispatch(ComponentParameters *inParameters, ACCo
 							}
 						}
 							break;
-							
+
 						case kAudioCodecProduceOutputBufferListSelect:
 						{
 							PARAM(AudioBufferList *, ioBufferList, 0, 4);
 							PARAM(UInt32 *, ioNumberPackets, 1, 4);
 							PARAM(AudioStreamPacketDescription *, outPacketDescription, 2, 4);
 							PARAM(UInt32 *, outStatus, 3, 4);
-							
+
 							if((ioBufferList != NULL) && (ioNumberPackets != NULL) && (outStatus != NULL))
 							{
 								*outStatus = inThis->ProduceOutputBufferList(ioBufferList, *ioNumberPackets, outPacketDescription);
@@ -296,13 +296,13 @@ OSStatus	ACCodec::ComponentEntryDispatch(ComponentParameters *inParameters, ACCo
 						}
 							break;
 #endif	// AC_NON_INTERLEAVED_SUPPORT
-							
+
 						case kAudioCodecResetSelect:
 						{
 							inThis->Reset();
 						}
 							break;
-							
+
 						default:
 							theError = badComponentSelector;
 							break;
@@ -323,7 +323,7 @@ OSStatus	ACCodec::ComponentEntryDispatch(ComponentParameters *inParameters, ACCo
 	{
 		theError = kAudioCodecUnspecifiedError;
 	}
-	
+
 	return theError;
 }
 #endif // !CA_USE_AUDIO_PLUGIN_ONLY && !TARGET_OS_IPHONE
diff --git a/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACCodec.h b/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACCodec.h
index b0d9316..9b7fecd 100644
--- a/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACCodec.h
+++ b/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACCodec.h
@@ -2,14 +2,14 @@
      File: ACCodec.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #if !defined(__ACCodec_h__)
 #define __ACCodec_h__
@@ -75,7 +75,7 @@ class ACCodec : public ComponentBase
 public:
 					ACCodec(AudioComponentInstance inInstance);
 	virtual			~ACCodec();
-	
+
 #if !CA_USE_AUDIO_PLUGIN_ONLY && !TARGET_OS_IPHONE
 	static		OSStatus ComponentEntryDispatch(ComponentParameters *p, ACCodec *This);
 #endif
@@ -91,10 +91,10 @@ public:
 	virtual void	Initialize(const AudioStreamBasicDescription* inInputFormat, const AudioStreamBasicDescription* inOutputFormat, const void* inMagicCookie, UInt32 inMagicCookieByteSize) = 0;
 	virtual void	Uninitialize() = 0;
 	virtual void	Reset() = 0;
-	
+
 	virtual void	AppendInputData(const void* inInputData, UInt32& ioInputDataByteSize, UInt32& ioNumberPackets, const AudioStreamPacketDescription* inPacketDescription) = 0;
 	virtual void	AppendInputBufferList(const AudioBufferList *ioBufferList, UInt32& ioNumberPackets, const AudioStreamPacketDescription *inPacketDescription, UInt32 *outBytesConsumed) = 0;
-	
+
 	virtual UInt32	ProduceOutputPackets(void* outOutputData, UInt32& ioOutputDataByteSize, UInt32& ioNumberPackets, AudioStreamPacketDescription* outPacketDescription) = 0;
 	virtual UInt32	ProduceOutputBufferList(AudioBufferList *ioBufferList, UInt32& ioNumberPackets,  AudioStreamPacketDescription *outPacketDescription) = 0;
 
diff --git a/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACCodecDispatchTypes.h b/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACCodecDispatchTypes.h
index 42c2bc5..1969d74 100644
--- a/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACCodecDispatchTypes.h
+++ b/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACCodecDispatchTypes.h
@@ -2,14 +2,14 @@
      File: ACCodecDispatchTypes.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #if !defined(__ACCodecDispatchTypes_h__)
 #define __ACCodecDispatchTypes_h__
diff --git a/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACConditionalMacros.h b/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACConditionalMacros.h
index 2cff483..8d82d12 100644
--- a/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACConditionalMacros.h
+++ b/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACConditionalMacros.h
@@ -2,14 +2,14 @@
      File: ACConditionalMacros.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #if !defined(__ACConditionalMacros_h__)
 #define __ACConditionalMacros_h__
diff --git a/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACPlugInDispatch.cpp b/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACPlugInDispatch.cpp
index de9599b..e2204b8 100644
--- a/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACPlugInDispatch.cpp
+++ b/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACPlugInDispatch.cpp
@@ -2,14 +2,14 @@
      File: ACPlugInDispatch.cpp
  Abstract: ACPlugInDispatch.h
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #if AUDIOCODECS_SUPPORT_PLUGINS
 #include "ACPlugInDispatch.h"
@@ -242,10 +242,10 @@ AudioComponentMethod AudioCodecNonInterleavedEncoderLookup::Lookup (SInt16 selec
 	AudioComponentMethod method = AudioCodecLookup::Lookup(selector);
 	if (method)
 		return method;
-	
+
 	if (selector == kAudioCodecAppendInputBufferListSelect)
 		return (AudioComponentMethod)AppendInputBufferList;
-	
+
 	return NULL;
 }
 
@@ -254,10 +254,10 @@ AudioComponentMethod AudioCodecNonInterleavedDecoderLookup::Lookup (SInt16 selec
 	AudioComponentMethod method = AudioCodecLookup::Lookup(selector);
 	if (method)
 		return method;
-	
+
 	if (selector == kAudioCodecProduceOutputBufferListSelect)
 		return (AudioComponentMethod)ProduceOutputBufferList;
-	
+
 	return NULL;
 }
 #endif
@@ -269,14 +269,14 @@ AudioComponentMethod AudioCodecHWCodecLookup::Lookup (SInt16 selector)
 {
 	AudioComponentMethod method = AudioCodecLookup::Lookup(selector);
 	if (method) return method;
-	
+
 	switch (selector) {
 		case kAudioCodecAcquireHardwareSelect:			return (AudioComponentMethod)AcquireHardware;
 		case kAudioCodecReleaseHardwareSelect:			return (AudioComponentMethod)ReleaseHardware;
 		default:
 			break;
 	}
-	return NULL;	
+	return NULL;
 }
 #endif // TARGET_OS_IPHONE && AUDIOCONV_HAVE_AMC
 
diff --git a/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACPlugInDispatch.h b/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACPlugInDispatch.h
index 252a4af..7c84cac 100644
--- a/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACPlugInDispatch.h
+++ b/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACPlugInDispatch.h
@@ -2,14 +2,14 @@
      File: ACPlugInDispatch.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #ifndef __ACPlugInDispatch_h__
 #define __ACPlugInDispatch_h__
diff --git a/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACSimpleCodec.cpp b/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACSimpleCodec.cpp
index b10add9..bc78a15 100644
--- a/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACSimpleCodec.cpp
+++ b/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACSimpleCodec.cpp
@@ -2,14 +2,14 @@
      File: ACSimpleCodec.cpp
  Abstract: ACSimpleCodec.h
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 //=============================================================================
 //	Includes
@@ -81,8 +81,8 @@ void	ACSimpleCodec::Initialize(const AudioStreamBasicDescription* inInputFormat,
 	if (mInputFormat.mBytesPerPacket == 0)
 	{
 		CODEC_THROW(kAudioCodecUnsupportedFormatError);
-	}	
-	
+	}
+
 	ACBaseCodec::Initialize(inInputFormat, inOutputFormat, inMagicCookie, inMagicCookieByteSize);
 }
 
@@ -91,11 +91,11 @@ void	ACSimpleCodec::Uninitialize()
 	//	get rid of the buffer
 	delete[] mInputBuffer;
 	mInputBuffer = NULL;
-	
+
 	//	reset the ring buffer state
 	mInputBufferStart = 0;
 	mInputBufferEnd = 0;
-	
+
 	ACBaseCodec::Uninitialize();
 }
 
@@ -105,11 +105,11 @@ void	ACSimpleCodec::Reset()
 	if (mInputBuffer) { // could be called before allocated.
 		memset(mInputBuffer, 0, mInputBufferByteSize);
 	}
-	
+
 	//	reset the ring buffer state
 	mInputBufferStart = 0;
 	mInputBufferEnd = 0;
-	
+
 	ACBaseCodec::Reset();
 }
 
@@ -121,7 +121,7 @@ UInt32	ACSimpleCodec::GetInputBufferByteSize() const
 UInt32	ACSimpleCodec::GetUsedInputBufferByteSize() const
 {
 	UInt32 theAnswer = 0;
-	
+
 	//	this object uses a ring buffer
 	if(mInputBufferStart <= mInputBufferEnd)
 	{
@@ -130,10 +130,10 @@ UInt32	ACSimpleCodec::GetUsedInputBufferByteSize() const
 	}
 	else
 	{
-		//	the active region wraps around 
+		//	the active region wraps around
 		theAnswer = (mInputBufferByteSize - mInputBufferStart) + mInputBufferEnd;
 	}
-	
+
 	return theAnswer;
 }
 
@@ -142,7 +142,7 @@ void	ACSimpleCodec::AppendInputData(const void* inInputData, UInt32& ioInputData
 {
 	//	this buffer handling code doesn't care about such things as the packet descriptions
 	if(!mIsInitialized) CODEC_THROW(kAudioCodecStateError);
-	
+
 	//	this is a ring buffer we're dealing with, so we need to set up a few things
 	UInt32 theUsedByteSize = GetUsedInputBufferByteSize();
 	UInt32 theAvailableByteSize = GetInputBufferByteSize() - theUsedByteSize;
@@ -150,51 +150,51 @@ void	ACSimpleCodec::AppendInputData(const void* inInputData, UInt32& ioInputData
 	UInt32 theMaxAvailableInputBytes = ioInputDataByteSize; // we can't consume more than we get
 
 	const Byte* theInputData = static_cast<const Byte*>(inInputData);
-	
+
 	// >>jamesmcc: added this because ioNumberPackets was not being updated if less was taken than given.
 	// THIS ASSUMES CBR!
 	UInt32 bytesPerPacketOfInput = mInputFormat.mBytesPerPacket;
 	UInt32 theAvailablePacketSize = theAvailableByteSize / bytesPerPacketOfInput;
-	
+
 	UInt32 minPacketSize = ioNumberPackets < theAvailablePacketSize ? ioNumberPackets : theAvailablePacketSize;
 	UInt32 minByteSize = minPacketSize * bytesPerPacketOfInput;
-	
+
 	//	we can copy only as much data as there is or up to how much space is availiable
 	ioNumberPackets = minPacketSize;
 	ioInputDataByteSize = minByteSize;
-	
+
 	// ioInputDataByteSize had better be <= to theMaxAvailableInputBytes or we're screwed
 	if (ioInputDataByteSize > theMaxAvailableInputBytes)
 	{
 		CODEC_THROW(kAudioCodecStateError);
 	}
-	// <<jamesmcc 
-	
+	// <<jamesmcc
+
 	//	now we have to copy the data taking into account the wrap around and where the start is
 	if(mInputBufferEnd + ioInputDataByteSize < mInputBufferByteSize)
 	{
 		//	no wrap around here
 		memcpy(mInputBuffer + mInputBufferEnd, theInputData, ioInputDataByteSize);
-		
+
 		//	adjust the end point
 		mInputBufferEnd += ioInputDataByteSize;
 	}
 	else
 	{
 		//	the copy will wrap
-		
+
 		//	copy the first part
 		UInt32 theBeforeWrapByteSize = mInputBufferByteSize - mInputBufferEnd;
 		memcpy(mInputBuffer + mInputBufferEnd, theInputData, theBeforeWrapByteSize);
-		
+
 		//	and the rest
 		UInt32 theAfterWrapByteSize = ioInputDataByteSize - theBeforeWrapByteSize;
 		memcpy(mInputBuffer, theInputData + theBeforeWrapByteSize, theAfterWrapByteSize);
-		
+
 		//	adjust the end point
 		mInputBufferEnd = theAfterWrapByteSize;
 	}
-	
+
 }
 
 
@@ -202,46 +202,46 @@ void	ACSimpleCodec::ZeroPadInputData(UInt32& ioNumberPackets, const AudioStreamP
 {
 	//	this buffer handling code doesn't care about such things as the packet descriptions
 	if(!mIsInitialized) CODEC_THROW(kAudioCodecStateError);
-	
-	
+
+
 	//	this is a ring buffer we're dealing with, so we need to set up a few things
 	UInt32 theUsedByteSize = GetUsedInputBufferByteSize();
 	UInt32 theAvailableByteSize = GetInputBufferByteSize() - theUsedByteSize;
-	
+
 	// >>jamesmcc: added this because ioNumberPackets was not being updated if less was taken than given.
 	// THIS ASSUMES CBR!
 	UInt32 bytesPerPacketOfInput = mInputFormat.mBytesPerPacket;
 	UInt32 theAvailablePacketSize = theAvailableByteSize / bytesPerPacketOfInput;
-	
+
 	UInt32 minPacketSize = ioNumberPackets < theAvailablePacketSize ? ioNumberPackets : theAvailablePacketSize;
 	UInt32 minByteSize = minPacketSize * bytesPerPacketOfInput;
-	
+
 	//	we can copy only as much data as there is or up to how much space is availiable
 	ioNumberPackets = minPacketSize;
-	
-	// <<jamesmcc 
-	
+
+	// <<jamesmcc
+
 	//	now we have to copy the data taking into account the wrap around and where the start is
 	if(mInputBufferEnd + minByteSize < mInputBufferByteSize)
 	{
 		//	no wrap around here
 		memset(mInputBuffer + mInputBufferEnd, 0, minByteSize);
-		
+
 		//	adjust the end point
 		mInputBufferEnd += minByteSize;
 	}
 	else
 	{
 		//	the copy will wrap
-		
+
 		//	copy the first part
 		UInt32 theBeforeWrapByteSize = mInputBufferByteSize - mInputBufferEnd;
 		memset(mInputBuffer + mInputBufferEnd, 0, theBeforeWrapByteSize);
-		
+
 		//	and the rest
 		UInt32 theAfterWrapByteSize = minByteSize - theBeforeWrapByteSize;
 		memset(mInputBuffer, 0, theAfterWrapByteSize);
-		
+
 		//	adjust the end point
 		mInputBufferEnd = theAfterWrapByteSize;
 	}
@@ -252,32 +252,32 @@ void	ACSimpleCodec::ConsumeInputData(UInt32 inConsumedByteSize)
 {
 	//	this is a convenience routine to make maintaining the ring buffer state easy
 	UInt32 theContiguousRange = GetInputBufferContiguousByteSize();
-	
+
 	if(inConsumedByteSize > GetUsedInputBufferByteSize()) CODEC_THROW(kAudioCodecUnspecifiedError);
-	
+
 	if(inConsumedByteSize <= theContiguousRange)
 	{
 		//	the region to consume doesn't wrap
-		
+
 		//	figure out how much to consume
 		inConsumedByteSize = (theContiguousRange < inConsumedByteSize) ? theContiguousRange : inConsumedByteSize;
-		
+
 		//	clear the consumed bits
 		memset(mInputBuffer + mInputBufferStart, 0, inConsumedByteSize);
-		
+
 		//	adjust the start
 		mInputBufferStart += inConsumedByteSize;
 	}
 	else
 	{
 		//	the region to consume will wrap
-		
+
 		//	clear the bits to the end of the buffer
 		memset(mInputBuffer + mInputBufferStart, 0, theContiguousRange);
-		
+
 		//	now clear the bits left from the start
 		memset(mInputBuffer, 0, inConsumedByteSize - theContiguousRange);
-		
+
 		//	adjust the start
 		mInputBufferStart = inConsumedByteSize - theContiguousRange;
 	}
@@ -287,24 +287,24 @@ void	ACSimpleCodec::ConsumeInputData(UInt32 inConsumedByteSize)
 Byte* ACSimpleCodec::GetBytes(UInt32& ioNumberBytes) const
 {
 	// if a client's algorithm has to have contiguous data and mInputBuffer wraps, then someone has to make a copy.
-	// I can do it more efficiently than the client. 
-	
+	// I can do it more efficiently than the client.
+
 	if(!mIsInitialized) CODEC_THROW(kAudioCodecStateError);
 
 	UInt32 theUsedByteSize = GetUsedInputBufferByteSize();
 	//UInt32 theAvailableByteSize = GetInputBufferByteSize() - theUsedByteSize;
-	
+
 	if (ioNumberBytes > theUsedByteSize) ioNumberBytes = theUsedByteSize;
-		
+
 	SInt32 leftOver = mInputBufferStart + ioNumberBytes - mInputBufferByteSize;
-	
+
 	if(leftOver > 0)
 	{
-		// need to copy beginning of buffer to the end. 
+		// need to copy beginning of buffer to the end.
 		// We cleverly over allocated our buffer space to make this possible.
 		memmove(mInputBuffer + mInputBufferByteSize, mInputBuffer, leftOver);
 	}
-	
+
 	return GetInputBufferStart();
 }
 
@@ -312,17 +312,17 @@ Byte* ACSimpleCodec::GetBytes(UInt32& ioNumberBytes) const
 void	ACSimpleCodec::ReallocateInputBuffer(UInt32 inInputBufferByteSize)
 {
 	mInputBufferByteSize = inInputBufferByteSize + kBufferPad;
-	
+
 	//	toss the old buffer
 	delete[] mInputBuffer;
 	mInputBuffer = NULL;
-	
+
 	//	allocate the new one
 	// allocate extra in order to allow making contiguous data.
 	UInt32 allocSize = 2*inInputBufferByteSize + kBufferPad;
 	mInputBuffer = new Byte[allocSize];
 	memset(mInputBuffer, 0, allocSize);
-	
+
 	//	reset the ring buffer state
 	mInputBufferStart = 0;
 	mInputBufferEnd = 0;
@@ -359,6 +359,6 @@ void	ACSimpleCodec::SetProperty(AudioCodecPropertyID inPropertyID, UInt32 inProp
 			break;
 		default:
             ACBaseCodec::SetProperty(inPropertyID, inPropertyDataSize, inPropertyData);
-            break;            
+            break;
     }
 }
diff --git a/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACSimpleCodec.h b/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACSimpleCodec.h
index f41fe54..f8b5d0f 100644
--- a/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACSimpleCodec.h
+++ b/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/ACSimpleCodec.h
@@ -2,14 +2,14 @@
      File: ACSimpleCodec.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #if !defined(__ACSimpleCodec_h__)
 #define __ACSimpleCodec_h__
@@ -84,17 +84,17 @@ public:
 	virtual void		SetProperty(AudioCodecPropertyID inPropertyID, UInt32 inPropertyDataSize, const void* inPropertyData);
 
 protected:
-	void				ConsumeInputData(UInt32 inConsumedByteSize);	
+	void				ConsumeInputData(UInt32 inConsumedByteSize);
 	Byte*				GetInputBufferStart() const { return mInputBuffer + mInputBufferStart; }
 	UInt32				GetInputBufferContiguousByteSize() const { return (mInputBufferStart <= mInputBufferEnd) ? (mInputBufferEnd - mInputBufferStart) : (mInputBufferByteSize - mInputBufferStart); }
 	virtual void		ReallocateInputBuffer(UInt32 inInputBufferByteSize);
-	
-	// returns a pointer to contiguous bytes. 
+
+	// returns a pointer to contiguous bytes.
 	// will do some copying if the request wraps around the internal buffer.
 	// request must be less than available bytes
 	Byte*				GetBytes(UInt32& ioNumberBytes) const;
 
-private:	
+private:
 	Byte*				mInputBuffer;
 	UInt32				mInputBufferByteSize;
 	UInt32				mInputBufferStart;
diff --git a/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/GetCodecBundle.cpp b/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/GetCodecBundle.cpp
index 8954c8d..f0b0ef9 100644
--- a/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/GetCodecBundle.cpp
+++ b/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/GetCodecBundle.cpp
@@ -2,14 +2,14 @@
      File: GetCodecBundle.cpp
  Abstract: GetCodecBundle.h
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #include "GetCodecBundle.h"
 
@@ -59,7 +59,7 @@ const CFStringRef kCodecBundleID = CFSTR("com.apple.audio.codecs.Components");
 CFBundleRef GetCodecBundle()
 {
 	static CFBundleRef sAudioCodecBundle = 0;
-	if (!sAudioCodecBundle) 
+	if (!sAudioCodecBundle)
 	{
 	#if TARGET_OS_WIN32
 		sAudioCodecBundle = CFBundleGetBundleWithIdentifier(CFSTR(kCodecBundleID));
diff --git a/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/GetCodecBundle.h b/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/GetCodecBundle.h
index 96e3d9e..f6c501a 100644
--- a/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/GetCodecBundle.h
+++ b/libs/appleutility/CoreAudio/AudioCodecs/ACPublic/GetCodecBundle.h
@@ -2,14 +2,14 @@
      File: GetCodecBundle.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #ifndef _GetCodecBundle_
 #define _GetCodecBundle_
diff --git a/libs/appleutility/CoreAudio/AudioFile/AFPublic/AudioFileComponentBase.cpp b/libs/appleutility/CoreAudio/AudioFile/AFPublic/AudioFileComponentBase.cpp
index 053da0a..4bbc0d6 100644
--- a/libs/appleutility/CoreAudio/AudioFile/AFPublic/AudioFileComponentBase.cpp
+++ b/libs/appleutility/CoreAudio/AudioFile/AFPublic/AudioFileComponentBase.cpp
@@ -2,14 +2,14 @@
      File: AudioFileComponentBase.cpp
  Abstract: AudioFileComponentBase.h
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #if !defined(__COREAUDIO_USE_FLAT_INCLUDES__)
 	#include <AudioToolbox/AudioFileComponent.h>
@@ -84,8 +84,8 @@ static OSStatus CreateURL(
 
 static OSStatus OpenURL(
 								void *                            self,
-								CFURLRef							inFileRef, 
-								SInt8								inPermissions, 
+								CFURLRef							inFileRef,
+								SInt8								inPermissions,
 								int									inFileDescriptor)
 {
 	return AFC->AFAPI_OpenURL(inFileRef, inPermissions, inFileDescriptor);
@@ -93,9 +93,9 @@ static OSStatus OpenURL(
 
 static OSStatus OpenWithCallbacks(
 								void *                            self,
-								void *								inRefCon, 
-								AudioFile_ReadProc					inReadFunc, 
-								AudioFile_WriteProc					inWriteFunc, 
+								void *								inRefCon,
+								AudioFile_ReadProc					inReadFunc,
+								AudioFile_WriteProc					inWriteFunc,
 								AudioFile_GetSizeProc				inGetSizeFunc,
 								AudioFile_SetSizeProc				inSetSizeFunc)
 {
@@ -104,9 +104,9 @@ static OSStatus OpenWithCallbacks(
 
 static OSStatus InitializeWithCallbacks(
 								void *                            self,
-								void *								inRefCon, 
-								AudioFile_ReadProc					inReadFunc, 
-								AudioFile_WriteProc					inWriteFunc, 
+								void *								inRefCon,
+								AudioFile_ReadProc					inReadFunc,
+								AudioFile_WriteProc					inWriteFunc,
 								AudioFile_GetSizeProc				inGetSizeFunc,
 								AudioFile_SetSizeProc				inSetSizeFunc,
 								UInt32								inFileType,
@@ -131,8 +131,8 @@ static OSStatus Optimize(
 static OSStatus ReadBytes(
 								void *                            self,
 								Boolean			inUseCache,
-								SInt64			inStartingByte, 
-								UInt32			*ioNumBytes, 
+								SInt64			inStartingByte,
+								UInt32			*ioNumBytes,
 								void			*outBuffer)
 {
 	return AFC->AFAPI_ReadBytes(inUseCache, inStartingByte, ioNumBytes, outBuffer);
@@ -142,8 +142,8 @@ static OSStatus ReadBytes(
 static OSStatus WriteBytes(
 								void *         self,
 								Boolean			inUseCache,
-								SInt64			inStartingByte, 
-								UInt32			*ioNumBytes, 
+								SInt64			inStartingByte,
+								UInt32			*ioNumBytes,
 								const void		*inBuffer)
 {
 	return AFC->AFAPI_WriteBytes(inUseCache, inStartingByte, ioNumBytes, inBuffer);
@@ -155,11 +155,11 @@ static OSStatus ReadPackets(
 								Boolean							inUseCache,
 								UInt32							*outNumBytes,
 								AudioStreamPacketDescription	*outPacketDescriptions,
-								SInt64							inStartingPacket, 
-								UInt32							*ioNumPackets, 
+								SInt64							inStartingPacket,
+								UInt32							*ioNumPackets,
 								void							*outBuffer)
 {
-	return AFC->AFAPI_ReadPackets(inUseCache, outNumBytes, outPacketDescriptions, 
+	return AFC->AFAPI_ReadPackets(inUseCache, outNumBytes, outPacketDescriptions,
 		inStartingPacket, ioNumPackets, outBuffer);
 }
 
@@ -168,11 +168,11 @@ static OSStatus ReadPacketData(
 								Boolean							inUseCache,
 								UInt32							*ioNumBytes,
 								AudioStreamPacketDescription	*outPacketDescriptions,
-								SInt64							inStartingPacket, 
-								UInt32							*ioNumPackets, 
+								SInt64							inStartingPacket,
+								UInt32							*ioNumPackets,
 								void							*outBuffer)
 {
-	return AFC->AFAPI_ReadPacketData(inUseCache, ioNumBytes, outPacketDescriptions, 
+	return AFC->AFAPI_ReadPacketData(inUseCache, ioNumBytes, outPacketDescriptions,
 		inStartingPacket, ioNumPackets, outBuffer);
 }
 
@@ -182,8 +182,8 @@ static OSStatus WritePackets(
 								Boolean								inUseCache,
 								UInt32								inNumBytes,
 								AudioStreamPacketDescription		*inPacketDescriptions,
-								SInt64								inStartingPacket, 
-								UInt32								*ioNumPackets, 
+								SInt64								inStartingPacket,
+								UInt32								*ioNumPackets,
 								const void							*inBuffer)
 #else
 static OSStatus WritePackets(
@@ -191,12 +191,12 @@ static OSStatus WritePackets(
 								Boolean								inUseCache,
 								UInt32								inNumBytes,
 								const AudioStreamPacketDescription	*inPacketDescriptions,
-								SInt64								inStartingPacket, 
-								UInt32								*ioNumPackets, 
+								SInt64								inStartingPacket,
+								UInt32								*ioNumPackets,
 								const void							*inBuffer)
 #endif
 {
-	return AFC->AFAPI_WritePackets(inUseCache, inNumBytes, 
+	return AFC->AFAPI_WritePackets(inUseCache, inNumBytes,
 		(const AudioStreamPacketDescription	*)inPacketDescriptions, // this should be const (and is in 10.5 headers)
 		inStartingPacket, ioNumPackets, inBuffer);
 }
@@ -281,7 +281,7 @@ static OSStatus ExtensionIsThisFormat(
 {
 	AudioFileFormatBase* aff = AFC->GetAudioFileFormatBase();
 	if (!aff) return kAudio_ParamError;
-	
+
 	UInt32 res = aff->ExtensionIsThisFormat(inExtension);
 	if (outResult) *outResult = res;
 	return noErr;
@@ -289,13 +289,13 @@ static OSStatus ExtensionIsThisFormat(
 
 static OSStatus FileDataIsThisFormat(
 								void *                 self,
-								UInt32					inDataByteSize, 
+								UInt32					inDataByteSize,
 								const void*				inData,
 								UInt32					*outResult)
 {
 	AudioFileFormatBase* aff = AFC->GetAudioFileFormatBase();
 	if (!aff) return kAudio_ParamError;
-	
+
 	UncertainResult res = aff->FileDataIsThisFormat(inDataByteSize, inData);
 	if (outResult) *outResult = res;
 	return noErr;
@@ -346,33 +346,33 @@ AudioFileObjectComponentBase::~AudioFileObjectComponentBase()
 }
 
 OSStatus AudioFileObjectComponentBase::AFAPI_CreateURL(
-								CFURLRef							inFileRef, 
+								CFURLRef							inFileRef,
                                 const AudioStreamBasicDescription	*inFormat,
                                 UInt32								inFlags)
 {
 	if (!mAudioFileObject) return kAudio_ParamError;
-	
+
 	OSStatus result = mAudioFileObject->DoCreate (inFileRef, inFormat, inFlags);
 	return result;
 }
 
-								
+
 OSStatus AudioFileObjectComponentBase::AFAPI_OpenURL(
-									CFURLRef		inFileRef, 
+									CFURLRef		inFileRef,
 									SInt8  			inPermissions,
 									int				inFD)
 {
 	if (!mAudioFileObject) return kAudio_ParamError;
-	
+
 	OSStatus result = mAudioFileObject->DoOpen(inFileRef, inPermissions, inFD);
  	return result;
 }
 
 
 OSStatus AudioFileObjectComponentBase::AFAPI_OpenWithCallbacks(
-				void *								inRefCon, 
-				AudioFile_ReadProc					inReadFunc, 
-				AudioFile_WriteProc					inWriteFunc, 
+				void *								inRefCon,
+				AudioFile_ReadProc					inReadFunc,
+				AudioFile_WriteProc					inWriteFunc,
 				AudioFile_GetSizeProc				inGetSizeFunc,
 				AudioFile_SetSizeProc				inSetSizeFunc)
 {
@@ -382,9 +382,9 @@ OSStatus AudioFileObjectComponentBase::AFAPI_OpenWithCallbacks(
 
 
 OSStatus AudioFileObjectComponentBase::AFAPI_InitializeWithCallbacks(
-				void *								inRefCon, 
-				AudioFile_ReadProc					inReadFunc, 
-				AudioFile_WriteProc					inWriteFunc, 
+				void *								inRefCon,
+				AudioFile_ReadProc					inReadFunc,
+				AudioFile_WriteProc					inWriteFunc,
 				AudioFile_GetSizeProc				inGetSizeFunc,
 				AudioFile_SetSizeProc				inSetSizeFunc,
 				UInt32								inFileType,
@@ -392,11 +392,11 @@ OSStatus AudioFileObjectComponentBase::AFAPI_InitializeWithCallbacks(
 				UInt32								inFlags)
 {
 	if (!mAudioFileObject) return kAudio_ParamError;
-	return mAudioFileObject->DoInitializeWithCallbacks(inRefCon, inReadFunc, inWriteFunc, inGetSizeFunc, inSetSizeFunc, 
+	return mAudioFileObject->DoInitializeWithCallbacks(inRefCon, inReadFunc, inWriteFunc, inGetSizeFunc, inSetSizeFunc,
 											inFileType, inFormat, inFlags);
 }
 
-									
+
 OSStatus AudioFileObjectComponentBase::AFAPI_Close()
 {
 	if (!mAudioFileObject) return kAudio_ParamError;
@@ -409,10 +409,10 @@ OSStatus AudioFileObjectComponentBase::AFAPI_Optimize()
 	return mAudioFileObject->DoOptimize();
 }
 
-OSStatus AudioFileObjectComponentBase::AFAPI_ReadBytes(		
+OSStatus AudioFileObjectComponentBase::AFAPI_ReadBytes(
 											Boolean			inUseCache,
-											SInt64			inStartingByte, 
-											UInt32			*ioNumBytes, 
+											SInt64			inStartingByte,
+											UInt32			*ioNumBytes,
 											void			*outBuffer)
 {
 	if (!mAudioFileObject) return kAudio_ParamError;
@@ -420,10 +420,10 @@ OSStatus AudioFileObjectComponentBase::AFAPI_ReadBytes(
 }
 
 
-OSStatus AudioFileObjectComponentBase::AFAPI_WriteBytes(		
+OSStatus AudioFileObjectComponentBase::AFAPI_WriteBytes(
 											Boolean			inUseCache,
-											SInt64			inStartingByte, 
-											UInt32			*ioNumBytes, 
+											SInt64			inStartingByte,
+											UInt32			*ioNumBytes,
 											const void		*inBuffer)
 {
 	if (!mAudioFileObject) return kAudio_ParamError;
@@ -433,12 +433,12 @@ OSStatus AudioFileObjectComponentBase::AFAPI_WriteBytes(
 
 
 
-OSStatus AudioFileObjectComponentBase::AFAPI_ReadPackets(		
+OSStatus AudioFileObjectComponentBase::AFAPI_ReadPackets(
 											Boolean							inUseCache,
 											UInt32							*outNumBytes,
 											AudioStreamPacketDescription	*outPacketDescriptions,
-											SInt64							inStartingPacket, 
-											UInt32  						*ioNumPackets, 
+											SInt64							inStartingPacket,
+											UInt32  						*ioNumPackets,
 											void							*outBuffer)
 {
 	if (!mAudioFileObject) return kAudio_ParamError;
@@ -446,12 +446,12 @@ OSStatus AudioFileObjectComponentBase::AFAPI_ReadPackets(
 												inStartingPacket, ioNumPackets, outBuffer);
 }
 
-OSStatus AudioFileObjectComponentBase::AFAPI_ReadPacketData(		
+OSStatus AudioFileObjectComponentBase::AFAPI_ReadPacketData(
 											Boolean							inUseCache,
 											UInt32							*ioNumBytes,
 											AudioStreamPacketDescription	*outPacketDescriptions,
-											SInt64							inStartingPacket, 
-											UInt32  						*ioNumPackets, 
+											SInt64							inStartingPacket,
+											UInt32  						*ioNumPackets,
 											void							*outBuffer)
 {
 	if (!mAudioFileObject) return kAudio_ParamError;
@@ -459,13 +459,13 @@ OSStatus AudioFileObjectComponentBase::AFAPI_ReadPacketData(
 												inStartingPacket, ioNumPackets, outBuffer);
 }
 
-									
-OSStatus AudioFileObjectComponentBase::AFAPI_WritePackets(	
+
+OSStatus AudioFileObjectComponentBase::AFAPI_WritePackets(
 											Boolean								inUseCache,
 											UInt32								inNumBytes,
 											const AudioStreamPacketDescription	*inPacketDescriptions,
-											SInt64								inStartingPacket, 
-											UInt32								*ioNumPackets, 
+											SInt64								inStartingPacket,
+											UInt32								*ioNumPackets,
 											const void							*inBuffer)
 {
 	if (!mAudioFileObject) return kAudio_ParamError;
@@ -474,8 +474,8 @@ OSStatus AudioFileObjectComponentBase::AFAPI_WritePackets(
 }
 
 
-									
-OSStatus AudioFileObjectComponentBase::AFAPI_GetPropertyInfo(	
+
+OSStatus AudioFileObjectComponentBase::AFAPI_GetPropertyInfo(
 											AudioFilePropertyID		inPropertyID,
 											UInt32					*outDataSize,
 											UInt32					*isWritable)
@@ -484,23 +484,23 @@ OSStatus AudioFileObjectComponentBase::AFAPI_GetPropertyInfo(
 	return mAudioFileObject->GetPropertyInfo(inPropertyID, outDataSize, isWritable);
 }
 
-										
-OSStatus AudioFileObjectComponentBase::AFAPI_GetProperty(		
+
+OSStatus AudioFileObjectComponentBase::AFAPI_GetProperty(
 											AudioFilePropertyID		inPropertyID,
 											UInt32					*ioPropertySize,
 											void					*ioPropertyData)
 {
 	OSStatus err = noErr;
-	
+
 	if (!ioPropertyData) return kAudio_ParamError;
-	
+
 	if (!mAudioFileObject) return kAudio_ParamError;
 	err = mAudioFileObject->GetProperty(inPropertyID, ioPropertySize, ioPropertyData);
 	return err;
 }
 
-									
-OSStatus AudioFileObjectComponentBase::AFAPI_SetProperty(		
+
+OSStatus AudioFileObjectComponentBase::AFAPI_SetProperty(
 											AudioFilePropertyID		inPropertyID,
 											UInt32					inPropertySize,
 											const void				*inPropertyData)
@@ -510,7 +510,7 @@ OSStatus AudioFileObjectComponentBase::AFAPI_SetProperty(
 }
 
 
-OSStatus AudioFileObjectComponentBase::AFAPI_CountUserData(		
+OSStatus AudioFileObjectComponentBase::AFAPI_CountUserData(
 											UInt32				inUserDataID,
 											UInt32				*outNumberItems)
 {
@@ -518,7 +518,7 @@ OSStatus AudioFileObjectComponentBase::AFAPI_CountUserData(
 	return mAudioFileObject->CountUserData(inUserDataID, outNumberItems);
 }
 
-OSStatus AudioFileObjectComponentBase::AFAPI_GetUserDataSize(		
+OSStatus AudioFileObjectComponentBase::AFAPI_GetUserDataSize(
 											UInt32				inUserDataID,
 											UInt32				inIndex,
 											UInt32				*outUserDataSize)
@@ -527,7 +527,7 @@ OSStatus AudioFileObjectComponentBase::AFAPI_GetUserDataSize(
 	return mAudioFileObject->GetUserDataSize(inUserDataID, inIndex, outUserDataSize);
 }
 
-OSStatus AudioFileObjectComponentBase::AFAPI_GetUserData(		
+OSStatus AudioFileObjectComponentBase::AFAPI_GetUserData(
 											UInt32				inUserDataID,
 											UInt32				inIndex,
 											UInt32				*ioUserDataSize,
@@ -537,7 +537,7 @@ OSStatus AudioFileObjectComponentBase::AFAPI_GetUserData(
 	return mAudioFileObject->GetUserData(inUserDataID, inIndex, ioUserDataSize, outUserData);
 }
 
-OSStatus AudioFileObjectComponentBase::AFAPI_SetUserData(		
+OSStatus AudioFileObjectComponentBase::AFAPI_SetUserData(
 											UInt32				inUserDataID,
 											UInt32				inIndex,
 											UInt32				inUserDataSize,
@@ -547,7 +547,7 @@ OSStatus AudioFileObjectComponentBase::AFAPI_SetUserData(
 	return mAudioFileObject->SetUserData(inUserDataID, inIndex, inUserDataSize, inUserData);
 }
 
-OSStatus AudioFileObjectComponentBase::AFAPI_RemoveUserData(		
+OSStatus AudioFileObjectComponentBase::AFAPI_RemoveUserData(
 											UInt32				inUserDataID,
 											UInt32				inIndex)
 {
@@ -556,14 +556,14 @@ OSStatus AudioFileObjectComponentBase::AFAPI_RemoveUserData(
 }
 
 
-OSStatus AudioFileComponentBase::AFAPI_GetGlobalInfoSize(		
+OSStatus AudioFileComponentBase::AFAPI_GetGlobalInfoSize(
 											AudioFilePropertyID		inPropertyID,
 											UInt32					inSpecifierSize,
 											const void*				inSpecifier,
 											UInt32					*outPropertySize)
 {
 	OSStatus err = noErr;
-		
+
 	switch (inPropertyID)
 	{
 		case kAudioFileComponent_CanRead :
@@ -578,15 +578,15 @@ OSStatus AudioFileComponentBase::AFAPI_GetGlobalInfoSize(
 		case kAudioFileComponent_ExtensionsForType :
 			*outPropertySize = sizeof(CFArrayRef);
 			break;
-			
+
 		case kAudioFileComponent_UTIsForType :
 			*outPropertySize = sizeof(CFArrayRef);
 			break;
-			
+
 		case kAudioFileComponent_MIMETypesForType :
 			*outPropertySize = sizeof(CFArrayRef);
 			break;
-			
+
 		case kAudioFileComponent_AvailableFormatIDs :
 		{
 			UInt32 size = 0xFFFFFFFF;
@@ -608,7 +608,7 @@ OSStatus AudioFileComponentBase::AFAPI_GetGlobalInfoSize(
 				err = GetAudioFileFormatBase()->GetAvailableStreamDescriptions(inFormatID, outPropertySize, NULL);
 			}
 			break;
-			
+
 		default:
 			err = kAudioFileUnsupportedPropertyError;
 	}
@@ -616,7 +616,7 @@ OSStatus AudioFileComponentBase::AFAPI_GetGlobalInfoSize(
 }
 
 
-OSStatus AudioFileComponentBase::AFAPI_GetGlobalInfo(		
+OSStatus AudioFileComponentBase::AFAPI_GetGlobalInfo(
 											AudioFilePropertyID		inPropertyID,
 											UInt32					inSpecifierSize,
 											const void*				inSpecifier,
@@ -624,9 +624,9 @@ OSStatus AudioFileComponentBase::AFAPI_GetGlobalInfo(
 											void					*ioPropertyData)
 {
 	OSStatus err = noErr;
-	
+
 	if (!ioPropertyData || !ioPropertySize) return kAudio_ParamError;
-	
+
 	switch (inPropertyID)
 	{
 		case kAudioFileComponent_CanRead :
@@ -636,7 +636,7 @@ OSStatus AudioFileComponentBase::AFAPI_GetGlobalInfo(
 				*flag = GetAudioFileFormatBase()->CanRead();
 			}
 			break;
-			
+
 		case kAudioFileComponent_CanWrite :
 			{
 				if (*ioPropertySize != sizeof(UInt32)) return kAudioFileBadPropertySizeError;
@@ -644,7 +644,7 @@ OSStatus AudioFileComponentBase::AFAPI_GetGlobalInfo(
 				*flag = GetAudioFileFormatBase()->CanWrite();
 			}
 			break;
-			
+
 		case kAudioFileComponent_FileTypeName :
 			{
 				if (*ioPropertySize != sizeof(CFStringRef)) return kAudioFileBadPropertySizeError;
@@ -682,21 +682,21 @@ OSStatus AudioFileComponentBase::AFAPI_GetGlobalInfo(
 				err = GetAudioFileFormatBase()->GetHFSCodes(ioPropertySize, ioPropertyData);
 			}
 			break;
-			
+
 		case kAudioFileComponent_AvailableFormatIDs :
 			{
 				err = GetAudioFileFormatBase()->GetAvailableFormatIDs(ioPropertySize, ioPropertyData);
 			}
 			break;
-			
+
 		case kAudioFileComponent_AvailableStreamDescriptionsForFormat :
 			{
 				if (inSpecifierSize != sizeof(UInt32)) return kAudioFileBadPropertySizeError;
-				UInt32 inFormatID = *(UInt32*)inSpecifier; 
+				UInt32 inFormatID = *(UInt32*)inSpecifier;
 				err = GetAudioFileFormatBase()->GetAvailableStreamDescriptions(inFormatID, ioPropertySize, ioPropertyData);
 			}
 			break;
-						
+
 		default:
 			err = kAudioFileUnsupportedPropertyError;
 	}
@@ -709,11 +709,11 @@ OSStatus AudioFileComponentBase::ComponentEntryDispatch(ComponentParameters* par
 {
 	OSStatus		result = noErr;
 	if (inThis == NULL) return kAudio_ParamError;
-	
+
 	try
 	{
 		switch (params->what)
-		{						
+		{
 			case kComponentCanDoSelect:
 				switch (GetSelectorForCanDo(params))
 				{
@@ -734,7 +734,7 @@ OSStatus AudioFileComponentBase::ComponentEntryDispatch(ComponentParameters* par
 					case kAudioFileFileDataIsThisFormatSelect:
 					case kAudioFileGetGlobalInfoSizeSelect:
 					case kAudioFileGetGlobalInfoSelect:
-					
+
 					case kAudioFileCountUserDataSelect:
 					case kAudioFileGetUserDataSizeSelect:
 					case kAudioFileGetUserDataSelect:
@@ -756,7 +756,7 @@ OSStatus AudioFileComponentBase::ComponentEntryDispatch(ComponentParameters* par
 						PARAM(CFURLRef, inFileRef, 0, 3);
 						PARAM(const AudioStreamBasicDescription*, inFormat, 1, 3);
 						PARAM(UInt32, inFlags, 2, 3);
-						
+
 						result = inThis->AFAPI_CreateURL(inFileRef, inFormat, inFlags);
 					}
 					break;
@@ -765,7 +765,7 @@ OSStatus AudioFileComponentBase::ComponentEntryDispatch(ComponentParameters* par
 						PARAM(CFURLRef, inFileRef, 0, 3);
 						PARAM(SInt32, inPermissions, 1, 3);
 						PARAM(int, inFileDescriptor, 2, 3);
-						
+
 						result = inThis->AFAPI_OpenURL(inFileRef, inPermissions, inFileDescriptor);
 					}
 					break;
@@ -776,8 +776,8 @@ OSStatus AudioFileComponentBase::ComponentEntryDispatch(ComponentParameters* par
 						PARAM(AudioFile_WriteProc, inWriteFunc, 2, 5);
 						PARAM(AudioFile_GetSizeProc, inGetSizeFunc, 3, 5);
 						PARAM(AudioFile_SetSizeProc, inSetSizeFunc, 4, 5);
-						
-						result = inThis->AFAPI_OpenWithCallbacks(inRefCon, inReadFunc, inWriteFunc, 
+
+						result = inThis->AFAPI_OpenWithCallbacks(inRefCon, inReadFunc, inWriteFunc,
 													inGetSizeFunc, inSetSizeFunc);
 					}
 					break;
@@ -791,8 +791,8 @@ OSStatus AudioFileComponentBase::ComponentEntryDispatch(ComponentParameters* par
 						PARAM(UInt32, inFileType, 5, 8);
 						PARAM(const AudioStreamBasicDescription*, inFormat, 6, 8);
 						PARAM(UInt32, inFlags, 7, 8);
-						
-						result = inThis->AFAPI_InitializeWithCallbacks(inRefCon, inReadFunc, inWriteFunc, 
+
+						result = inThis->AFAPI_InitializeWithCallbacks(inRefCon, inReadFunc, inWriteFunc,
 													inGetSizeFunc, inSetSizeFunc,
 													inFileType, inFormat, inFlags);
 					}
@@ -813,7 +813,7 @@ OSStatus AudioFileComponentBase::ComponentEntryDispatch(ComponentParameters* par
 						PARAM(SInt64*, inStartingByte, 1, 4);
 						PARAM(UInt32*, ioNumBytes, 2, 4);
 						PARAM(void*, outBuffer, 3, 4);
-						
+
 						result = inThis->AFAPI_ReadBytes(inUseCache, *inStartingByte, ioNumBytes,
 							outBuffer);
 					}
@@ -824,7 +824,7 @@ OSStatus AudioFileComponentBase::ComponentEntryDispatch(ComponentParameters* par
 						PARAM(SInt64*, inStartingByte, 1, 4);
 						PARAM(UInt32*, ioNumBytes, 2, 4);
 						PARAM(const void*, inBuffer, 3, 4);
-						
+
 						result = inThis->AFAPI_WriteBytes(inUseCache, *inStartingByte, ioNumBytes,
 							inBuffer);
 					}
@@ -837,8 +837,8 @@ OSStatus AudioFileComponentBase::ComponentEntryDispatch(ComponentParameters* par
 						PARAM(SInt64*, inStartingPacket, 3, 6);
 						PARAM(UInt32*, ioNumPackets, 4, 6);
 						PARAM(void*, outBuffer, 5, 6);
-						
-						result = inThis->AFAPI_ReadPackets(inUseCache, outNumBytes, outPacketDescriptions, 
+
+						result = inThis->AFAPI_ReadPackets(inUseCache, outNumBytes, outPacketDescriptions,
 							*inStartingPacket, ioNumPackets, outBuffer);
 					}
 					break;
@@ -850,28 +850,28 @@ OSStatus AudioFileComponentBase::ComponentEntryDispatch(ComponentParameters* par
 						PARAM(SInt64*, inStartingPacket, 3, 6);
 						PARAM(UInt32*, ioNumPackets, 4, 6);
 						PARAM(const void*, inBuffer, 5, 6);
-						
-						result = inThis->AFAPI_WritePackets(inUseCache, inNumBytes, inPacketDescriptions, 
+
+						result = inThis->AFAPI_WritePackets(inUseCache, inNumBytes, inPacketDescriptions,
 							*inStartingPacket, ioNumPackets, inBuffer);
 					}
 					break;
-					
+
 				case kAudioFileGetPropertyInfoSelect:
 					{
 						PARAM(AudioFileComponentPropertyID, inPropertyID, 0, 3);
 						PARAM(UInt32*, outPropertySize, 1, 3);
 						PARAM(UInt32*, outWritable, 2, 3);
-						
+
 						result = inThis->AFAPI_GetPropertyInfo(inPropertyID, outPropertySize, outWritable);
 					}
 					break;
-					
+
 				case kAudioFileGetPropertySelect:
 					{
 						PARAM(AudioFileComponentPropertyID, inPropertyID, 0, 3);
 						PARAM(UInt32*, ioPropertyDataSize, 1, 3);
 						PARAM(void*, outPropertyData, 2, 3);
-						
+
 						result = inThis->AFAPI_GetProperty(inPropertyID, ioPropertyDataSize, outPropertyData);
 					}
 					break;
@@ -880,18 +880,18 @@ OSStatus AudioFileComponentBase::ComponentEntryDispatch(ComponentParameters* par
 						PARAM(AudioFileComponentPropertyID, inPropertyID, 0, 3);
 						PARAM(UInt32, inPropertyDataSize, 1, 3);
 						PARAM(const void*, inPropertyData, 2, 3);
-						
+
 						result = inThis->AFAPI_SetProperty(inPropertyID, inPropertyDataSize, inPropertyData);
 					}
 					break;
-					
+
 				case kAudioFileGetGlobalInfoSizeSelect:
 					{
 						PARAM(AudioFileComponentPropertyID, inPropertyID, 0, 4);
 						PARAM(UInt32, inSpecifierSize, 1, 4);
 						PARAM(const void*, inSpecifier, 2, 4);
 						PARAM(UInt32*, outPropertyDataSize, 3, 4);
-						
+
 						result = inThis->AFAPI_GetGlobalInfoSize(inPropertyID, inSpecifierSize, inSpecifier,
 							outPropertyDataSize);
 					}
@@ -903,34 +903,34 @@ OSStatus AudioFileComponentBase::ComponentEntryDispatch(ComponentParameters* par
 						PARAM(const void*, inSpecifier, 2, 5);
 						PARAM(UInt32*, ioPropertyDataSize, 3, 5);
 						PARAM(void*, outPropertyData, 4, 5);
-						
+
 						result = inThis->AFAPI_GetGlobalInfo(inPropertyID, inSpecifierSize, inSpecifier,
 							ioPropertyDataSize, outPropertyData);
 					}
 					break;
-					
+
 				case kAudioFileExtensionIsThisFormatSelect:
 					{
 						PARAM(CFStringRef, inExtension, 0, 2);
 						PARAM(UInt32*, outResult, 1, 2);
-						
+
 						AudioFileFormatBase* aff = inThis->GetAudioFileFormatBase();
 						if (!aff) return kAudio_ParamError;
-						
+
 						UInt32 res = aff->ExtensionIsThisFormat(inExtension);
 						if (outResult) *outResult = res;
 					}
 					break;
-					
+
 				case kAudioFileFileDataIsThisFormatSelect:
 					{
 						PARAM(UInt32, inDataByteSize, 0, 3);
 						PARAM(const void*, inData, 1, 3);
 						PARAM(UInt32*, outResult, 2, 3);
-						
+
 						AudioFileFormatBase* aff = inThis->GetAudioFileFormatBase();
 						if (!aff) return kAudio_ParamError;
-						
+
 						UncertainResult res = aff->FileDataIsThisFormat(inDataByteSize, inData);
 						if (outResult) *outResult = res;
 					}
@@ -940,55 +940,55 @@ OSStatus AudioFileComponentBase::ComponentEntryDispatch(ComponentParameters* par
 					{
 						PARAM(UInt32, inUserDataID, 0, 2);
 						PARAM(UInt32*, outNumberItems, 1, 2);
-					
+
 						result = inThis->AFAPI_CountUserData(inUserDataID, outNumberItems);
 					}
 					break;
-					
+
 				case kAudioFileGetUserDataSizeSelect:
 					{
 						PARAM(UInt32, inUserDataID, 0, 3);
 						PARAM(UInt32, inIndex, 1, 3);
 						PARAM(UInt32*, outUserDataSize, 2, 3);
-						
+
 						result = inThis->AFAPI_GetUserDataSize(inUserDataID, inIndex, outUserDataSize);
 					}
 					break;
-					
+
 				case kAudioFileGetUserDataSelect:
 					{
 						PARAM(UInt32, inUserDataID, 0, 4);
 						PARAM(UInt32, inIndex, 1, 4);
 						PARAM(UInt32*, ioUserDataSize, 2, 4);
 						PARAM(void*, outUserData, 3, 4);
-						
-						result = inThis->AFAPI_GetUserData(inUserDataID, inIndex, 
+
+						result = inThis->AFAPI_GetUserData(inUserDataID, inIndex,
 										ioUserDataSize, outUserData);
 					}
 					break;
-					
+
 				case kAudioFileSetUserDataSelect:
 					{
 						PARAM(UInt32, inUserDataID, 0, 4);
 						PARAM(UInt32, inIndex, 1, 4);
 						PARAM(UInt32, inUserDataSize, 2, 4);
 						PARAM(const void*, inUserData, 3, 4);
-						
-						result = inThis->AFAPI_SetUserData(inUserDataID, inIndex, 
+
+						result = inThis->AFAPI_SetUserData(inUserDataID, inIndex,
 										inUserDataSize, inUserData);
 					}
 					break;
-	
+
 				case kAudioFileRemoveUserDataSelect:
 					{
 						PARAM(UInt32, inUserDataID, 0, 2);
 						PARAM(UInt32, inIndex, 1, 2);
-						
+
 						result = inThis->AFAPI_RemoveUserData(inUserDataID, inIndex);
 					}
 					break;
-	
-		
+
+
 				default:
 					result = ComponentBase::ComponentEntryDispatch(params, inThis);
 					break;
@@ -996,13 +996,13 @@ OSStatus AudioFileComponentBase::ComponentEntryDispatch(ComponentParameters* par
 	}
 	COMPONENT_CATCH
 	return result;
-} 
+}
 #endif
 
 AudioComponentMethod AudioFileComponentLookup::Lookup (SInt16 selector)
 {
 	switch (selector) {
-	
+
 #define DefCase(NAME) case kAudioFile##NAME##Select: return (AudioComponentMethod)NAME
 
 		DefCase(OpenWithCallbacks);
@@ -1016,7 +1016,7 @@ AudioComponentMethod AudioFileComponentLookup::Lookup (SInt16 selector)
 		DefCase(GetPropertyInfo);
 		DefCase(GetProperty);
 		DefCase(SetProperty);
-		
+
 		DefCase(ExtensionIsThisFormat);
 		DefCase(GetGlobalInfoSize);
 		DefCase(GetGlobalInfo);
@@ -1030,7 +1030,7 @@ AudioComponentMethod AudioFileComponentLookup::Lookup (SInt16 selector)
 		DefCase(OpenURL);
 		DefCase(FileDataIsThisFormat);
 		DefCase(ReadPacketData);
-		
+
 		// These selectors are deprecated and do not appear: Create, Open, Initialize, FileIsThisFormat, DataIsThisFormat.
 
 		default:
diff --git a/libs/appleutility/CoreAudio/AudioFile/AFPublic/AudioFileComponentBase.h b/libs/appleutility/CoreAudio/AudioFile/AFPublic/AudioFileComponentBase.h
index 5a11934..50e0627 100644
--- a/libs/appleutility/CoreAudio/AudioFile/AFPublic/AudioFileComponentBase.h
+++ b/libs/appleutility/CoreAudio/AudioFile/AFPublic/AudioFileComponentBase.h
@@ -2,14 +2,14 @@
      File: AudioFileComponentBase.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #ifndef __AudioFileComponentBase_h__
 #define __AudioFileComponentBase_h__
@@ -67,7 +67,7 @@ public:
 	virtual ~AudioFileComponentBase();
 
 	virtual AudioFileFormatBase* GetAudioFileFormatBase() const = 0;
-	
+
 	/* Public API Function Support */
 	virtual OSStatus AFAPI_CreateURL(
 								CFURLRef							inFileRef,
@@ -75,96 +75,96 @@ public:
                                 UInt32								inFlags) { return kAudio_UnimplementedError; }
 
 	virtual OSStatus AFAPI_OpenURL(
-									CFURLRef		inFileRef, 
+									CFURLRef		inFileRef,
 									SInt8  			inPermissions,
 									int				inFD) { return kAudio_UnimplementedError; }
-									
+
 
 	virtual OSStatus AFAPI_Create(
-								const FSRef							*inParentRef, 
+								const FSRef							*inParentRef,
                                 CFStringRef							inFileName,
                                 const AudioStreamBasicDescription	*inFormat,
                                 UInt32								inFlags,
                                 FSRef								*outNewFileRef) { return kAudio_UnimplementedError; }
-								
+
 	virtual OSStatus AFAPI_Initialize(
 									const FSRef							*inFileRef,
                                     const AudioStreamBasicDescription	*inFormat,
                                     UInt32								inFlags) { return kAudio_UnimplementedError; }
-								
+
 	virtual OSStatus AFAPI_Open(
-									const FSRef		*inFileRef, 
+									const FSRef		*inFileRef,
 									SInt8  			inPermissions,
 									SInt16			inRefNum) { return kAudio_UnimplementedError; }
 
 	virtual OSStatus AFAPI_OpenWithCallbacks(
-				void *								inRefCon, 
-				AudioFile_ReadProc					inReadFunc, 
-				AudioFile_WriteProc					inWriteFunc, 
+				void *								inRefCon,
+				AudioFile_ReadProc					inReadFunc,
+				AudioFile_WriteProc					inWriteFunc,
 				AudioFile_GetSizeProc				inGetSizeFunc,
 				AudioFile_SetSizeProc				inSetSizeFunc)=0;
 
 	virtual OSStatus AFAPI_InitializeWithCallbacks(
-				void *								inRefCon, 
-				AudioFile_ReadProc					inReadFunc, 
-				AudioFile_WriteProc					inWriteFunc, 
+				void *								inRefCon,
+				AudioFile_ReadProc					inReadFunc,
+				AudioFile_WriteProc					inWriteFunc,
 				AudioFile_GetSizeProc				inGetSizeFunc,
 				AudioFile_SetSizeProc				inSetSizeFunc,
 				UInt32								inFileType,
 				const AudioStreamBasicDescription	*inFormat,
 				UInt32								inFlags)=0;
-									
+
 	virtual OSStatus AFAPI_Close()=0;
 	virtual OSStatus AFAPI_Optimize()=0;
 	virtual OSStatus AFAPI_ReadBytes(		Boolean			inUseCache,
-											SInt64			inStartingByte, 
-											UInt32			*ioNumBytes, 
+											SInt64			inStartingByte,
+											UInt32			*ioNumBytes,
 											void			*outBuffer)=0;
-									
+
 	virtual OSStatus AFAPI_WriteBytes(		Boolean			inUseCache,
-											SInt64			inStartingByte, 
-											UInt32			*ioNumBytes, 
+											SInt64			inStartingByte,
+											UInt32			*ioNumBytes,
 											const void		*inBuffer)=0;
-									
+
 	virtual OSStatus AFAPI_ReadPackets(		Boolean							inUseCache,
 											UInt32							*outNumBytes,
 											AudioStreamPacketDescription	*outPacketDescriptions,
-											SInt64							inStartingPacket, 
-											UInt32  						*ioNumPackets, 
+											SInt64							inStartingPacket,
+											UInt32  						*ioNumPackets,
 											void							*outBuffer)=0;
-											
+
 	virtual OSStatus AFAPI_ReadPacketData(	Boolean							inUseCache,
 											UInt32							*ioNumBytes,
 											AudioStreamPacketDescription	*outPacketDescriptions,
-											SInt64							inStartingPacket, 
-											UInt32  						*ioNumPackets, 
+											SInt64							inStartingPacket,
+											UInt32  						*ioNumPackets,
 											void							*outBuffer)=0;
-									
+
 	virtual OSStatus AFAPI_WritePackets(	Boolean								inUseCache,
 											UInt32								inNumBytes,
 											const AudioStreamPacketDescription	*inPacketDescriptions,
-											SInt64								inStartingPacket, 
-											UInt32								*ioNumPackets, 
+											SInt64								inStartingPacket,
+											UInt32								*ioNumPackets,
 											const void							*inBuffer)=0;
-									
+
 	virtual OSStatus AFAPI_GetPropertyInfo(	AudioFilePropertyID		inPropertyID,
 											UInt32					*outDataSize,
 											UInt32					*isWritable)=0;
-										
+
 	virtual OSStatus AFAPI_GetProperty(		AudioFilePropertyID		inPropertyID,
 											UInt32					*ioDataSize,
 											void					*ioPropertyData)=0;
-									
+
 	virtual OSStatus AFAPI_SetProperty(		AudioFilePropertyID		inPropertyID,
 											UInt32					inDataSize,
 											const void				*inPropertyData)=0;
-	virtual OSStatus AFAPI_GetGlobalInfoSize(		
+	virtual OSStatus AFAPI_GetGlobalInfoSize(
 											AudioFilePropertyID		inPropertyID,
 											UInt32					inSpecifierSize,
 											const void*				inSpecifier,
 											UInt32					*outPropertySize);
 
-	virtual OSStatus AFAPI_GetGlobalInfo(		
+	virtual OSStatus AFAPI_GetGlobalInfo(
 											AudioFilePropertyID		inPropertyID,
 											UInt32					inSpecifierSize,
 											const void*				inSpecifier,
@@ -173,21 +173,21 @@ public:
 
 	virtual OSStatus AFAPI_CountUserData(   UInt32					inUserDataID,
 											UInt32					*outNumberItems)=0;
-											
+
 	virtual OSStatus AFAPI_GetUserDataSize( UInt32					inUserDataID,
 											UInt32					inIndex,
 											UInt32					*outDataSize)=0;
-											
+
 	virtual OSStatus AFAPI_GetUserData(		UInt32					inUserDataID,
 											UInt32					inIndex,
 											UInt32					*ioDataSize,
 											void					*ioUserData)=0;
-											
+
 	virtual OSStatus AFAPI_SetUserData(		UInt32					inUserDataID,
 											UInt32					inIndex,
 											UInt32					inDataSize,
 											const void				*inUserData)=0;
-											
+
 	virtual OSStatus AFAPI_RemoveUserData(	UInt32				inUserDataID,
 											UInt32					inIndex)=0;
 #if !CA_USE_AUDIO_PLUGIN_ONLY
@@ -207,9 +207,9 @@ public:
 
 	virtual AudioFileFormat* GetAudioFormat() const = 0;
 	virtual AudioFileFormatBase* GetAudioFileFormatBase() const { return GetAudioFormat(); }
-	
+
 	void SetAudioFileObject(AudioFileObject* inObject) { mAudioFileObject = inObject; }
-	
+
 	/* Public API Function Support */
 
 	virtual OSStatus AFAPI_CreateURL(
@@ -218,92 +218,92 @@ public:
                                 UInt32								inFlags);
 
 	virtual OSStatus AFAPI_OpenURL(
-									CFURLRef		inFileRef, 
+									CFURLRef		inFileRef,
 									SInt8  			inPermissions,
 									int				inFD);
 
 	virtual OSStatus AFAPI_OpenWithCallbacks(
-				void *								inRefCon, 
-				AudioFile_ReadProc					inReadFunc, 
-				AudioFile_WriteProc					inWriteFunc, 
+				void *								inRefCon,
+				AudioFile_ReadProc					inReadFunc,
+				AudioFile_WriteProc					inWriteFunc,
 				AudioFile_GetSizeProc				inGetSizeFunc,
 				AudioFile_SetSizeProc				inSetSizeFunc);
 
 	virtual OSStatus AFAPI_InitializeWithCallbacks(
-				void *								inRefCon, 
-				AudioFile_ReadProc					inReadFunc, 
-				AudioFile_WriteProc					inWriteFunc, 
+				void *								inRefCon,
+				AudioFile_ReadProc					inReadFunc,
+				AudioFile_WriteProc					inWriteFunc,
 				AudioFile_GetSizeProc				inGetSizeFunc,
 				AudioFile_SetSizeProc				inSetSizeFunc,
 				UInt32								inFileType,
 				const AudioStreamBasicDescription	*inFormat,
 				UInt32								inFlags);
-									
+
 	virtual OSStatus AFAPI_Close();
 	virtual OSStatus AFAPI_Optimize();
 	virtual OSStatus AFAPI_ReadBytes(		Boolean			inUseCache,
-											SInt64			inStartingByte, 
-											UInt32			*ioNumBytes, 
+											SInt64			inStartingByte,
+											UInt32			*ioNumBytes,
 											void			*outBuffer);
-									
+
 	virtual OSStatus AFAPI_WriteBytes(		Boolean			inUseCache,
-											SInt64			inStartingByte, 
-											UInt32			*ioNumBytes, 
+											SInt64			inStartingByte,
+											UInt32			*ioNumBytes,
 											const void		*inBuffer);
-									
+
 	virtual OSStatus AFAPI_ReadPackets(		Boolean							inUseCache,
 											UInt32							*outNumBytes,
 											AudioStreamPacketDescription	*outPacketDescriptions,
-											SInt64							inStartingPacket, 
-											UInt32  						*ioNumPackets, 
+											SInt64							inStartingPacket,
+											UInt32  						*ioNumPackets,
 											void							*outBuffer);
-									
+
 	virtual OSStatus AFAPI_ReadPacketData(	Boolean							inUseCache,
 											UInt32							*ioNumBytes,
 											AudioStreamPacketDescription	*outPacketDescriptions,
-											SInt64							inStartingPacket, 
-											UInt32  						*ioNumPackets, 
+											SInt64							inStartingPacket,
+											UInt32  						*ioNumPackets,
 											void							*outBuffer);
-									
+
 	virtual OSStatus AFAPI_WritePackets(	Boolean								inUseCache,
 											UInt32								inNumBytes,
 											const AudioStreamPacketDescription	*inPacketDescriptions,
-											SInt64								inStartingPacket, 
-											UInt32								*ioNumPackets, 
+											SInt64								inStartingPacket,
+											UInt32								*ioNumPackets,
 											const void							*inBuffer);
-									
+
 	virtual OSStatus AFAPI_GetPropertyInfo(	AudioFilePropertyID		inPropertyID,
 											UInt32					*outDataSize,
 											UInt32					*isWritable);
-										
+
 	virtual OSStatus AFAPI_GetProperty(		AudioFilePropertyID		inPropertyID,
 											UInt32					*ioDataSize,
 											void					*ioPropertyData);
-									
+
 	virtual OSStatus AFAPI_SetProperty(		AudioFilePropertyID		inPropertyID,
 											UInt32					inDataSize,
 											const void				*inPropertyData);
 
 	virtual OSStatus AFAPI_CountUserData(   UInt32					inUserDataID,
 											UInt32					*outNumberItems);
-											
+
 	virtual OSStatus AFAPI_GetUserDataSize( UInt32					inUserDataID,
 											UInt32					inIndex,
 											UInt32					*outDataSize);
-											
+
 	virtual OSStatus AFAPI_GetUserData(		UInt32					inUserDataID,
 											UInt32					inIndex,
 											UInt32					*ioDataSize,
 											void					*ioUserData);
-											
+
 	virtual OSStatus AFAPI_SetUserData(		UInt32					inUserDataID,
 											UInt32					inIndex,
 											UInt32					inDataSize,
 											const void				*inUserData);
-												
+
 	virtual OSStatus AFAPI_RemoveUserData(	UInt32					inUserDataID,
 											UInt32					inIndex);
-												
+
 protected:
 	AudioFileObject* mAudioFileObject;
 };
diff --git a/libs/appleutility/CoreAudio/AudioFile/AFPublic/AudioFileFormat.cpp b/libs/appleutility/CoreAudio/AudioFile/AFPublic/AudioFileFormat.cpp
index ee6bedd..36a2bee 100644
--- a/libs/appleutility/CoreAudio/AudioFile/AFPublic/AudioFileFormat.cpp
+++ b/libs/appleutility/CoreAudio/AudioFile/AFPublic/AudioFileFormat.cpp
@@ -2,14 +2,14 @@
      File: AudioFileFormat.cpp
  Abstract: AudioFileFormat.h
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,14 +40,14 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #include "AudioFileFormat.h"
 #include "DataSource.h"
 
-AudioFileFormatBase::AudioFileFormatBase(UInt32 inFileType) 
+AudioFileFormatBase::AudioFileFormatBase(UInt32 inFileType)
 	: mFileType(inFileType)
 {
 }
@@ -61,7 +61,7 @@ OSStatus AudioFileFormatBase::GetHFSCodes(UInt32* ioDataSize, void* outPropertyD
 	return kAudioFileUnsupportedPropertyError;
 }
 
-AudioFileFormat::AudioFileFormat(UInt32 inFileType) 
+AudioFileFormat::AudioFileFormat(UInt32 inFileType)
 	: AudioFileFormatBase(inFileType)
 {
 }
diff --git a/libs/appleutility/CoreAudio/AudioFile/AFPublic/AudioFileFormat.h b/libs/appleutility/CoreAudio/AudioFile/AFPublic/AudioFileFormat.h
index 9436199..06ff857 100644
--- a/libs/appleutility/CoreAudio/AudioFile/AFPublic/AudioFileFormat.h
+++ b/libs/appleutility/CoreAudio/AudioFile/AFPublic/AudioFileFormat.h
@@ -2,14 +2,14 @@
      File: AudioFileFormat.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,18 +40,18 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #ifndef _AudioFileFormat_H_
 #define _AudioFileFormat_H_
 
 #include "AudioFileObject.h"
 
-// AudioFileFormat is a factory class for AudioFileObjects. 
+// AudioFileFormat is a factory class for AudioFileObjects.
 
-// UncertainResult is needed for DataIsThisFormat. 
+// UncertainResult is needed for DataIsThisFormat.
 // In the case of SoundDesigner 2 we can't determine if the data is SoundDesigner 2 or not.
 
 typedef int UncertainResult;
@@ -71,23 +71,23 @@ class AudioFileFormatBase
 public:
 	AudioFileFormatBase(UInt32 inFileType);
 	virtual ~AudioFileFormatBase();
-	
+
 	// return true if extension is of this format type
 	virtual Boolean ExtensionIsThisFormat(CFStringRef inExtension) = 0;
-	
+
 	virtual UncertainResult FileDataIsThisFormat(
 				UInt32								/*inDataByteSize*/,
 				const void*							/*inData*/) = 0;
-	
+
 	// support SoundDesigner II files while minimizing opening and closing files.
 	virtual Boolean ResourceIsThisFormat(const FSRef* /*inRef*/) { return false; }
 
 	UInt32 GetFileType() const { return mFileType; }
-	
+
 	virtual UInt32 CanRead() const { return 1; }
 	virtual UInt32 CanWrite() const { return 1; }
 	virtual UInt32 HasResourceFork() const { return 0; }
-	
+
 	virtual void GetExtensions(CFArrayRef *outArray) = 0;
 	virtual void GetUTIs(CFArrayRef *outArray) {}
 	virtual void GetMIMETypes(CFArrayRef *outArray) {}
@@ -95,10 +95,10 @@ public:
 	virtual OSStatus GetAvailableFormatIDs(UInt32* ioDataSize, void* outPropertyData) = 0;
 	virtual OSStatus GetAvailableStreamDescriptions(UInt32 inFormatID, UInt32* ioDataSize, void* outPropertyData) = 0;
 	virtual OSStatus GetHFSCodes(UInt32* ioDataSize, void* outPropertyData);
-	
+
 	virtual AudioFileFormat* AsAudioFileFormat() { return NULL; }
 	virtual AudioFileFormatComponent* AsAudioFileFormatComponent() { return NULL; }
-		
+
 private:
 	 UInt32 mFileType;
 };
@@ -110,13 +110,13 @@ class AudioFileFormat : public AudioFileFormatBase
 public:
 	AudioFileFormat(UInt32 inFileType);
 	virtual ~AudioFileFormat();
-	
+
 	// create an AudioFileObject for this format type.
-	virtual AudioFileObject* New() = 0; 
+	virtual AudioFileObject* New() = 0;
 	virtual AudioFileStreamObject* NewStream() { return NULL; }
-	
+
 	// return true if file is of this format type
-	virtual UncertainResult FileDataIsThisFormat(UInt32 inDataByteSize, const void* inData) = 0;				
+	virtual UncertainResult FileDataIsThisFormat(UInt32 inDataByteSize, const void* inData) = 0;
 
 	virtual AudioFileFormat* AsAudioFileFormat() { return this; }
 };
diff --git a/libs/appleutility/CoreAudio/AudioFile/AFPublic/AudioFileObject.cpp b/libs/appleutility/CoreAudio/AudioFile/AFPublic/AudioFileObject.cpp
index 1a00f96..b823147 100644
--- a/libs/appleutility/CoreAudio/AudioFile/AFPublic/AudioFileObject.cpp
+++ b/libs/appleutility/CoreAudio/AudioFile/AFPublic/AudioFileObject.cpp
@@ -2,14 +2,14 @@
      File: AudioFileObject.cpp
  Abstract: AudioFileObject.h
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #include "AudioFileObject.h"
 #include "CADebugMacros.h"
@@ -64,7 +64,7 @@ AudioFileObject::~AudioFileObject()
 
 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-OSStatus AudioFileObject::DoCreate(		
+OSStatus AudioFileObject::DoCreate(
 									CFURLRef							inFileRef,
 									const AudioStreamBasicDescription	*inFormat,
 									UInt32								inFlags)
@@ -73,27 +73,27 @@ OSStatus AudioFileObject::DoCreate(
 	if (!IsDataFormatValid(inFormat))
 		return kAudioFileUnsupportedDataFormatError;
 
-	if (!IsDataFormatSupported(inFormat)) 
+	if (!IsDataFormatSupported(inFormat))
 		return kAudioFileUnsupportedDataFormatError;
 
 	SetPermissions(kAudioFileReadWritePermission);
-	
+
 	SetAlignDataWithFillerChunks(!(inFlags & 2 /* kAudioFileFlags_DontPageAlignAudioData */ ));
-	
+
 	// call virtual method for particular format.
 	return Create(inFileRef, inFormat);
 }
 
 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-                                
-OSStatus AudioFileObject::Create(		
+
+OSStatus AudioFileObject::Create(
 									CFURLRef							inFileRef,
 									const AudioStreamBasicDescription	*inFormat)
 {
 	int fileD;
 	OSStatus err = CreateDataFile (inFileRef, fileD);
     FailIf (err != noErr, Bail, "CreateDataFile failed");
-	
+
 	SetURL (inFileRef);
 
 	err = OpenFile(kAudioFileReadWritePermission, fileD);
@@ -101,23 +101,23 @@ OSStatus AudioFileObject::Create(
 
 	err = SetDataFormat(inFormat);
     FailIf (err != noErr, Bail, "SetDataFormat failed");
-	
+
     mIsInitialized = false;
-	
+
 Bail:
 	return err;
 }
 
 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-OSStatus AudioFileObject::DoOpen(	
-									CFURLRef		inFileRef, 
+OSStatus AudioFileObject::DoOpen(
+									CFURLRef		inFileRef,
 									SInt8  			inPermissions,
 									int				inFD)
-{		
+{
 	OSStatus err = noErr;
 	SetPermissions(inPermissions);
-	
+
 	err = Open(inFileRef, inPermissions, inFD);
     FailIf (err != noErr, Bail, "Open failed");
 
@@ -130,22 +130,22 @@ Bail:
 
 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-OSStatus AudioFileObject::Open(			
-									CFURLRef		inFileRef, 
+OSStatus AudioFileObject::Open(
+									CFURLRef		inFileRef,
 									SInt8  			inPermissions,
 									int				inFD)
-{		
+{
 	if (!(inPermissions & kAudioFileReadPermission))
 		return kAudioFilePermissionsError; // file must have read permissions
- 
+
 	SetURL(inFileRef);
-	
+
 	OSStatus err = OpenFile(inPermissions, inFD);
     FailIf (err != noErr, Bail, "OpenFile failed");
-		
+
 	err = OpenFromDataSource();
     FailIf (err != noErr, Bail, "OpenFromDataSource failed");
-	
+
 Bail:
 	return err;
 }
@@ -154,17 +154,17 @@ Bail:
 
 OSStatus AudioFileObject::ValidateFormatAndData()
 {
-	
+
 
 	AudioStreamBasicDescription asbd = GetDataFormat();
 
 	if (!IsDataFormatValid(&asbd))
 		return kAudioFileInvalidFileError;
 
-	if (asbd.mFormatID == kAudioFormatLinearPCM) 
+	if (asbd.mFormatID == kAudioFormatLinearPCM)
 	{
 		SInt64 maxPackets = GetNumBytes() / asbd.mBytesPerPacket;
-		if (GetNumPackets() > maxPackets) 
+		if (GetNumPackets() > maxPackets)
 			return kAudioFileInvalidFileError;
 	}
 	return noErr;
@@ -173,24 +173,24 @@ OSStatus AudioFileObject::ValidateFormatAndData()
 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 OSStatus AudioFileObject::DoOpenWithCallbacks(
-				void *								inRefCon, 
-				AudioFile_ReadProc					inReadFunc, 
-				AudioFile_WriteProc					inWriteFunc, 
+				void *								inRefCon,
+				AudioFile_ReadProc					inReadFunc,
+				AudioFile_WriteProc					inWriteFunc,
 				AudioFile_GetSizeProc				inGetSizeFunc,
 				AudioFile_SetSizeProc				inSetSizeFunc)
 {
 	SInt8	perms = (inSetSizeFunc || inWriteFunc) ? kAudioFileReadWritePermission : kAudioFileReadPermission;
 	SetPermissions(perms);
-	
+
 	DataSource* dataSource = new Seekable_DataSource(inRefCon, inReadFunc, inWriteFunc, inGetSizeFunc, inSetSizeFunc);
 	SetDataSource(dataSource);
 	return OpenFromDataSource();
 }
 
 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-							
+
 OSStatus AudioFileObject::OpenFromDataSource(void)
-{		
+{
 	return noErr;
 }
 
@@ -198,15 +198,15 @@ OSStatus AudioFileObject::OpenFromDataSource(void)
 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 OSStatus AudioFileObject::DoInitializeWithCallbacks(
-				void *								inRefCon, 
-				AudioFile_ReadProc					inReadFunc, 
-				AudioFile_WriteProc					inWriteFunc, 
+				void *								inRefCon,
+				AudioFile_ReadProc					inReadFunc,
+				AudioFile_WriteProc					inWriteFunc,
 				AudioFile_GetSizeProc				inGetSizeFunc,
 				AudioFile_SetSizeProc				inSetSizeFunc,
                 UInt32								inFileType,
 				const AudioStreamBasicDescription	*inFormat,
 				UInt32								inFlags)
-{		
+{
 	DataSource* dataSource = new Seekable_DataSource(inRefCon, inReadFunc, inWriteFunc, inGetSizeFunc, inSetSizeFunc);
 	if (!dataSource->CanWrite()) return -54/*permErr*/;
 	dataSource->SetSize(0);
@@ -217,13 +217,13 @@ OSStatus AudioFileObject::DoInitializeWithCallbacks(
 
 	OSStatus err = SetDataFormat(inFormat);
 	if (err) return err;
-	
+
 	return InitializeDataSource(inFormat, inFlags);
 }
 
 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-					
-OSStatus AudioFileObject::DoInitialize(	
+
+OSStatus AudioFileObject::DoInitialize(
 									CFURLRef							inFileRef,
 									const AudioStreamBasicDescription	*inFormat,
 									UInt32			inFlags)
@@ -236,15 +236,15 @@ OSStatus AudioFileObject::DoInitialize(
 	return Initialize(inFileRef, inFormat, inFlags);
 }
 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-					
-OSStatus AudioFileObject::Initialize(	
+
+OSStatus AudioFileObject::Initialize(
 									CFURLRef							inFileRef,
 									const AudioStreamBasicDescription	*inFormat,
 									UInt32								inFlags)
 {
 	OSStatus err = noErr;
-		
-	UInt8 fPath[FILENAME_MAX];	
+
+	UInt8 fPath[FILENAME_MAX];
 	if (!CFURLGetFileSystemRepresentation (inFileRef, true, fPath, FILENAME_MAX))
 		return kAudio_FileNotFoundError;
 
@@ -259,10 +259,10 @@ OSStatus AudioFileObject::Initialize(
 	int fileD = open((const char*)fPath, flags, filePerms);
 	if (fileD < 0)
 		return AudioFileTranslateErrno(errno);
-	
+
 	err = OpenFile(kAudioFileReadWritePermission, fileD);
     FailIf (err != noErr, Bail, "OpenFile failed");
-	
+
 		// don't need to do this as open has an option to truncate the file
 //	GetDataSource()->SetSize(0);
 
@@ -270,15 +270,15 @@ OSStatus AudioFileObject::Initialize(
     FailIf (err != noErr, Bail, "SetDataFormat failed");
 
 	InitializeDataSource(inFormat, inFlags);
-	
-Bail:	
+
+Bail:
 	return err;
 }
 
 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-							
+
 OSStatus AudioFileObject::InitializeDataSource(const AudioStreamBasicDescription	*inFormat, UInt32 /*inFlags*/)
-{		
+{
 	return noErr;
 }
 
@@ -288,7 +288,7 @@ OSStatus AudioFileObject::DoClose()
 {
 	OSStatus err = UpdateSizeIfNeeded();
 	if (err) return err;
-	
+
 	return Close();
 }
 
@@ -313,7 +313,7 @@ OSStatus AudioFileObject::Close()
 OSStatus AudioFileObject::Optimize()
 {
 	// default is that nothing needs to be done. This happens to be true for Raw, SD2 and NeXT/Sun types.
-	SetIsOptimized(true); 
+	SetIsOptimized(true);
 	return noErr;
 }
 
@@ -326,7 +326,7 @@ OSStatus AudioFileObject::DoOptimize()
 
 	OSStatus err = UpdateSizeIfNeeded();
 	if (err) return err;
-	
+
 	if (IsOptimized()) return noErr;
 
 	err = Optimize();
@@ -335,12 +335,12 @@ OSStatus AudioFileObject::DoOptimize()
 
 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-OSStatus AudioFileObject::UpdateNumBytes(SInt64 inNumBytes)	
+OSStatus AudioFileObject::UpdateNumBytes(SInt64 inNumBytes)
 {
     OSStatus err = noErr;
 	if (inNumBytes != GetNumBytes()) {
 		SetNumBytes(inNumBytes);
-        
+
         // #warning " this will not work for vbr formats"
 		SetNumPackets(GetNumBytes() / mDataFormat.mBytesPerPacket);
 		SizeChanged();
@@ -350,7 +350,7 @@ OSStatus AudioFileObject::UpdateNumBytes(SInt64 inNumBytes)
 
 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-OSStatus AudioFileObject::UpdateNumPackets(SInt64 inNumPackets)	
+OSStatus AudioFileObject::UpdateNumPackets(SInt64 inNumPackets)
 {
     OSStatus err = noErr;
 	if (inNumPackets != GetNumPackets()) {
@@ -358,7 +358,7 @@ OSStatus AudioFileObject::UpdateNumPackets(SInt64 inNumPackets)
 		SetNeedsSizeUpdate(true);
 		UpdateSizeIfNeeded();
 		SetNumPackets(inNumPackets);
-        
+
         // #warning " this will not work for vbr formats"
 		SetNumBytes(GetNumPackets() * mDataFormat.mBytesPerFrame);
 		SizeChanged();
@@ -375,19 +375,19 @@ OSStatus AudioFileObject::PacketToFrame(SInt64 inPacket, SInt64& outFirstFrameIn
 	{
 		OSStatus err = ScanForPackets(inPacket+1); // the packet count must be one greater than the packet index
 		if (err) return err;
-		
+
 		SInt64 packetTableSize = GetPacketTableSize();
-		
+
 		if (mPacketTable && inPacket >= packetTableSize)
 			return kAudioFileEndOfFileError;
-		
+
 		CompressedPacketTable* packetTable = GetPacketTable();
 		if (!packetTable)
 			return kAudioFileInvalidPacketOffsetError;
-			
+
 		if (inPacket < 0 || inPacket >= packetTableSize)
 			return kAudioFileInvalidPacketOffsetError;
-			
+
 		outFirstFrameInPacket = (*packetTable)[(size_t)inPacket].mFrameOffset;
 	}
 	else
@@ -406,18 +406,18 @@ OSStatus AudioFileObject::FrameToPacket(SInt64 inFrame, SInt64& outPacket, UInt3
 		CompressedPacketTable* packetTable = GetPacketTable();
 		if (!packetTable)
 			return kAudioFileInvalidPacketOffsetError;
-			
+
 		// search packet table
 		AudioStreamPacketDescriptionExtended pext;
 		memset(&pext, 0, sizeof(pext));
 		pext.mFrameOffset = inFrame;
 		CompressedPacketTable::iterator iter = std::lower_bound(packetTable->begin(), packetTable->end(), pext);
-		
+
 		if (iter == packetTable->end())
 			return kAudioFileInvalidPacketOffsetError;
-		
+
 		if (iter > packetTable->begin()) --iter;
-		
+
 		outPacket = iter - packetTable->begin();
 		outFrameOffsetInPacket = (UInt32)(inFrame - iter->mFrameOffset);
 	}
@@ -435,21 +435,21 @@ OSStatus AudioFileObject::PacketToByte(AudioBytePacketTranslation* abpt)
 {
     if (abpt->mPacket < 0)
         return kAudioFileInvalidPacketOffsetError;
-    
+
 	if (mDataFormat.mBytesPerPacket == 0)
 	{
 		CompressedPacketTable* packetTable = GetPacketTable();
 		if (!packetTable)
 			return kAudioFileInvalidPacketOffsetError;
-			
+
 		if (abpt->mPacket < GetPacketTableSize()) {
 			abpt->mByte = (*packetTable)[(int)abpt->mPacket].mStartOffset;
 			abpt->mFlags = 0;
 		} else {
 			SInt64 numPackets = packetTable->size();
-			if (numPackets < 8) 
+			if (numPackets < 8)
 				return 'more' /*kAudioFileStreamError_DataUnavailable*/ ;
-				
+
 			const AudioStreamPacketDescriptionExtended lastPacket = (*packetTable)[numPackets - 1];
 			SInt64 bytesReadSoFar = lastPacket.mStartOffset + lastPacket.mDataByteSize;
 			double averageBytesPerPacket = (double)(bytesReadSoFar - GetDataOffset()) / (double)numPackets;
@@ -487,21 +487,21 @@ OSStatus AudioFileObject::ByteToPacket(AudioBytePacketTranslation* abpt)
 		memset(&pext, 0, sizeof(pext));
 		pext.mStartOffset = abpt->mByte;
 		CompressedPacketTable::iterator iter = std::lower_bound(packetTable->begin(), packetTable->end(), pext, byte_less_than);
-		
+
 		if (iter == packetTable->end()) {
 			SInt64 numPackets = packetTable->size();
-			if (numPackets < 8) 
+			if (numPackets < 8)
 				return 'more' /*kAudioFileStreamError_DataUnavailable*/ ;
-				
+
 			const AudioStreamPacketDescriptionExtended lastPacket = (*packetTable)[numPackets - 1];
 			SInt64 bytesReadSoFar = lastPacket.mStartOffset + lastPacket.mDataByteSize;
 			double averageBytesPerPacket = (double)(bytesReadSoFar - GetDataOffset()) / (double)numPackets;
-			
+
 			double fpacket = (double)abpt->mByte / averageBytesPerPacket;
 			abpt->mPacket = (SInt64)floor(fpacket);
 			abpt->mByteOffsetInPacket = (UInt32)floor((fpacket - (double)abpt->mPacket) * averageBytesPerPacket);
 			abpt->mFlags = kBytePacketTranslationFlag_IsEstimate;
-			
+
 		} else {
 			if (iter > packetTable->begin()) --iter;
 			abpt->mPacket = iter - packetTable->begin();
@@ -523,29 +523,29 @@ OSStatus AudioFileObject::ByteToPacket(AudioBytePacketTranslation* abpt)
 
 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-OSStatus AudioFileObject::ReadBytes(		
+OSStatus AudioFileObject::ReadBytes(
 								Boolean			inUseCache,
-								SInt64			inStartingByte, 
-								UInt32			*ioNumBytes, 
+								SInt64			inStartingByte,
+								UInt32			*ioNumBytes,
 								void			*outBuffer)
 {
     OSStatus		err = noErr;
     UInt16			mode = SEEK_SET;
 	SInt64 			fileOffset = mDataOffset + inStartingByte;
     bool			readingPastEnd = false;
-	
-    FailWithAction((ioNumBytes == NULL) || (outBuffer == NULL), err = kAudio_ParamError, 
+
+    FailWithAction((ioNumBytes == NULL) || (outBuffer == NULL), err = kAudio_ParamError,
 		Bail, "invalid num bytes parameter");
 
 	//printf("inStartingByte %lld  GetNumBytes %lld\n", inStartingByte, GetNumBytes());
 
-	if (inStartingByte >= GetNumBytes()) 
+	if (inStartingByte >= GetNumBytes())
 	{
 		*ioNumBytes = 0;
 		return kAudioFileEndOfFileError;
 	}
 
-	if ((fileOffset + *ioNumBytes) > (GetNumBytes() + mDataOffset)) 
+	if ((fileOffset + *ioNumBytes) > (GetNumBytes() + mDataOffset))
 	{
 		*ioNumBytes = (UInt32)(GetNumBytes() + mDataOffset - fileOffset);
 		readingPastEnd = true;
@@ -554,9 +554,9 @@ OSStatus AudioFileObject::ReadBytes(
 
     if (!inUseCache)
         mode |= kAudioFileNoCacheMask;
-	
+
     err = GetDataSource()->ReadBytes(mode, fileOffset, *ioNumBytes, outBuffer, ioNumBytes);
-	
+
 	if (readingPastEnd && err == noErr)
 		err = kAudioFileEndOfFileError;
 
@@ -567,10 +567,10 @@ Bail:
 
 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-OSStatus AudioFileObject::WriteBytes(	
+OSStatus AudioFileObject::WriteBytes(
 								Boolean			inUseCache,
-								SInt64			inStartingByte, 
-								UInt32			*ioNumBytes, 
+								SInt64			inStartingByte,
+								UInt32			*ioNumBytes,
 								const void		*inBuffer)
 {
     OSStatus		err = noErr;
@@ -586,57 +586,57 @@ OSStatus AudioFileObject::WriteBytes(
     // if so, see if file type supports this and bail if not
     err = IsValidFilePosition(inStartingByte + *ioNumBytes);
     FailIf(err != noErr, Bail, "invalid file position");
-    
+
     extendingTheAudioData = inStartingByte + *ioNumBytes > GetNumBytes();
-    
+
     // if file is not optimized, then do not write data that would overwrite chunks following the sound data chunk
-    FailWithAction(	extendingTheAudioData && !IsOptimized(), 
+    FailWithAction(	extendingTheAudioData && !IsOptimized(),
                     err = kAudioFileNotOptimizedError, Bail, "Can't write more data until the file is optimized");
 
     if (!inUseCache)
         mode |= kAudioFileNoCacheMask;
-    
-    err = GetDataSource()->WriteBytes(mode, mDataOffset + inStartingByte, *ioNumBytes, 
+
+    err = GetDataSource()->WriteBytes(mode, mDataOffset + inStartingByte, *ioNumBytes,
                         inBuffer, ioNumBytes);
-	
+
     FailIf(err != noErr, Bail, "couldn't write new data");
-    
+
     if (extendingTheAudioData) {
         SInt64		nuEOF;						// Get the total bytes of audio data
         SInt64		nuByteTotal;
 
 		err = GetDataSource()->GetSize(nuEOF);
 		FailIf(err != noErr, Bail, "GetSize failed");
-            
+
 		nuByteTotal = nuEOF - mDataOffset;
 		err = UpdateNumBytes(nuByteTotal);
     }
-    
+
 Bail:
     return err;
 }
 
 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-OSStatus AudioFileObject::ReadPackets(	
+OSStatus AudioFileObject::ReadPackets(
 								Boolean							inUseCache,
 								UInt32							*outNumBytes,
 								AudioStreamPacketDescription	*outPacketDescriptions,
-								SInt64							inStartingPacket, 
-								UInt32  						*ioNumPackets, 
+								SInt64							inStartingPacket,
+								UInt32  						*ioNumPackets,
 								void							*outBuffer)
 {
 	// This only works with CBR. To suppport VBR you must override.
     OSStatus		err = noErr;
-    
+
     FailWithAction(outBuffer == NULL, err = kAudio_ParamError, Bail, "NULL buffer");
-	
+
     FailWithAction((ioNumPackets == NULL) || (*ioNumPackets < 1), err = kAudio_ParamError, Bail, "invalid num packets parameter");
-    
+
 	{
 		UInt32			byteCount = *ioNumPackets * mDataFormat.mBytesPerPacket;
 		SInt64			startingByte = inStartingPacket * mDataFormat.mBytesPerPacket;
-			
+
 		err = ReadBytes (inUseCache, startingByte, &byteCount, outBuffer);
 		if ((err == noErr) || (err == kAudioFileEndOfFileError))
 		{
@@ -648,7 +648,7 @@ OSStatus AudioFileObject::ReadPackets(
 
 			if (outNumBytes)
 				*outNumBytes = byteCount;
-			
+
 			if (err == kAudioFileEndOfFileError)
 				err = noErr;
 		}
@@ -664,12 +664,12 @@ Bail:
 
 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-OSStatus AudioFileObject::ReadPacketData(	
+OSStatus AudioFileObject::ReadPacketData(
 								Boolean							inUseCache,
 								UInt32							*ioNumBytes,
 								AudioStreamPacketDescription	*outPacketDescriptions,
-								SInt64							inStartingPacket, 
-								UInt32  						*ioNumPackets, 
+								SInt64							inStartingPacket,
+								UInt32  						*ioNumPackets,
 								void							*outBuffer)
 {
 	OSStatus		err = noErr;
@@ -703,12 +703,12 @@ Bail:
 
 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-OSStatus AudioFileObject::ReadPacketDataVBR(	
+OSStatus AudioFileObject::ReadPacketDataVBR(
 								Boolean							inUseCache,
 								UInt32							*ioNumBytes,
 								AudioStreamPacketDescription	*outPacketDescriptions,
-								SInt64							inStartingPacket, 
-								UInt32  						*ioNumPackets, 
+								SInt64							inStartingPacket,
+								UInt32  						*ioNumPackets,
 								void							*outBuffer)
 {
 	OSStatus err = ScanForPackets(inStartingPacket+1); // need to scan packets up to start
@@ -718,7 +718,7 @@ OSStatus AudioFileObject::ReadPacketDataVBR(
 	SInt64 dataOffset = GetDataOffset();
 
 	CompressedPacketTable* packetTable = GetPacketTable();
-    if (!packetTable) 
+    if (!packetTable)
 		return kAudioFileInvalidFileError;
 
 	SInt64 packetTableSize = GetPacketTableSize();
@@ -728,7 +728,7 @@ OSStatus AudioFileObject::ReadPacketDataVBR(
 		*ioNumPackets = 0;
 		return kAudioFileEndOfFileError;
 	}
-	
+
 	if (inStartingPacket + *ioNumPackets <= packetTableSize) {
 		err = ReadPacketDataVBR_InTable(inUseCache, ioNumBytes, outPacketDescriptions, inStartingPacket, ioNumPackets, outBuffer);
 	} else {
@@ -741,21 +741,21 @@ OSStatus AudioFileObject::ReadPacketDataVBR(
 		SInt64 remainingBytesInFile = fileSize - firstPacketOffset - dataOffset;
 		if (bytesRead > remainingBytesInFile)
 			bytesRead = (UInt32)remainingBytesInFile;
-		
+
 		err = ReadBytes (inUseCache, firstPacketOffset, &bytesRead, outBuffer);
 		if (err && err != kAudioFileEndOfFileError) {
 			*ioNumBytes = 0;
 			*ioNumPackets = 0;
 			return err;
 		}
-		
+
 		Buffer_DataSource bufSrc(bytesRead, outBuffer, dataOffset + firstPacketOffset);
-		
+
 		OSStatus scanErr = ScanForPackets(kScanToEnd, &bufSrc, false);
 		if (scanErr && scanErr != kAudioFileEndOfFileError)
 			return scanErr;
 		packetTableSize = packetTable->size();
-		
+
 		UInt32 numPacketsRead = 0;
 		UInt32 endOfData = 0;
 		SInt64 packetNumber = inStartingPacket;
@@ -765,10 +765,10 @@ OSStatus AudioFileObject::ReadPacketDataVBR(
 			SInt64 endOfPacket = curPacketOffset + curPacket.mDataByteSize;
 			if (endOfPacket > bytesRead) break;
 			endOfData = (UInt32)endOfPacket;
-			outPacketDescriptions[numPacketsRead] = curPacket;				
+			outPacketDescriptions[numPacketsRead] = curPacket;
 			outPacketDescriptions[numPacketsRead].mStartOffset = curPacketOffset;
 		}
-		
+
 		*ioNumBytes = endOfData;
 		*ioNumPackets = numPacketsRead;
 	}
@@ -778,14 +778,14 @@ OSStatus AudioFileObject::ReadPacketDataVBR(
 
 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 OSStatus AudioFileObject::HowManyPacketsCanBeReadIntoBuffer(UInt32* ioNumBytes, SInt64 inStartingPacket, UInt32 *ioNumPackets)
-{		
+{
 	CompressedPacketTable*	packetTable = GetPacketTable();
 	SInt64 packetTableSize = GetPacketTableSize();
 
 	if (inStartingPacket + *ioNumPackets > (SInt64)packetTableSize) {
 		*ioNumPackets = (UInt32)(packetTableSize - inStartingPacket);
 	}
-	
+
 	AudioStreamPacketDescription firstPacket = (*packetTable)[inStartingPacket];
 
 	if (*ioNumBytes < firstPacket.mDataByteSize) {
@@ -795,28 +795,28 @@ OSStatus AudioFileObject::HowManyPacketsCanBeReadIntoBuffer(UInt32* ioNumBytes,
 	}
 
 	SInt64 lastPacketIndex = inStartingPacket + *ioNumPackets - 1;
-	if (lastPacketIndex >= packetTableSize) 
+	if (lastPacketIndex >= packetTableSize)
 		lastPacketIndex = packetTableSize - 1;
-		
+
 	AudioStreamPacketDescription lastPacket = (*packetTable)[lastPacketIndex];
-	
+
 	SInt64 readBytes = lastPacket.mStartOffset + lastPacket.mDataByteSize - firstPacket.mStartOffset;
 	if (readBytes <= *ioNumBytes) {
 		*ioNumBytes = (UInt32)readBytes;
 		return noErr;
 	}
-	
+
 	SInt64 lowBound = inStartingPacket;
 	SInt64 highBound = lastPacketIndex + 1;
 	SInt64 okIndex = lowBound;
-	while (highBound >= lowBound) {		
+	while (highBound >= lowBound) {
 		SInt64 tryBound = (lowBound + highBound) >> 1;
-		if (tryBound > lastPacketIndex) 
+		if (tryBound > lastPacketIndex)
 			break;
 		AudioStreamPacketDescription tryPacket = (*packetTable)[tryBound];
-		
+
 		SInt64 readBytes = tryPacket.mStartOffset + tryPacket.mDataByteSize - firstPacket.mStartOffset;
-		
+
 		if (readBytes > (SInt64)*ioNumBytes) {
 			highBound = tryBound - 1;
 		} else if (readBytes < (SInt64)*ioNumBytes) {
@@ -826,14 +826,14 @@ OSStatus AudioFileObject::HowManyPacketsCanBeReadIntoBuffer(UInt32* ioNumBytes,
 			okIndex = tryBound;
 			break;
 		}
-	}	
-	
+	}
+
 	SInt64 numPackets = okIndex - inStartingPacket + 1;
 	if (numPackets > *ioNumPackets) {
 		numPackets = *ioNumPackets;
 		okIndex = inStartingPacket + numPackets - 1;
 	}
-	
+
 	AudioStreamPacketDescription packet = (*packetTable)[okIndex];
 	*ioNumBytes = (UInt32)(packet.mStartOffset + packet.mDataByteSize - firstPacket.mStartOffset);
 	*ioNumPackets = (UInt32)numPackets;
@@ -846,25 +846,25 @@ OSStatus AudioFileObject::HowManyPacketsCanBeReadIntoBuffer(UInt32* ioNumBytes,
 
 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-OSStatus AudioFileObject::ReadPacketDataVBR_InTable(	
+OSStatus AudioFileObject::ReadPacketDataVBR_InTable(
 								Boolean							inUseCache,
 								UInt32							*ioNumBytes,
 								AudioStreamPacketDescription	*outPacketDescriptions,
-								SInt64							inStartingPacket, 
-								UInt32  						*ioNumPackets, 
+								SInt64							inStartingPacket,
+								UInt32  						*ioNumPackets,
 								void							*outBuffer)
 {
 	CompressedPacketTable* packetTable = GetPacketTable();
-    if (!packetTable) 
+    if (!packetTable)
 		return kAudioFileInvalidFileError;
-	
+
 	OSStatus err = HowManyPacketsCanBeReadIntoBuffer(ioNumBytes, inStartingPacket, ioNumPackets);
 	if (err) return err;
-			
+
 	AudioStreamPacketDescription firstPacket = (*packetTable)[inStartingPacket];
 	SInt64 firstPacketOffset = firstPacket.mStartOffset;
 	UInt32 bytesRead = *ioNumBytes;
-	
+
 	if (outBuffer) {
 		err = ReadBytes (inUseCache, firstPacketOffset, &bytesRead, outBuffer);
 		if (err && err != kAudioFileEndOfFileError) {
@@ -874,12 +874,12 @@ OSStatus AudioFileObject::ReadPacketDataVBR_InTable(
 		}
 		*ioNumBytes = bytesRead;
 	}
-	
+
 	// fill out packet descriptions
-	if (outPacketDescriptions) {						
+	if (outPacketDescriptions) {
 		for (UInt32 i = 0; i < *ioNumPackets; i++) {
 			AudioStreamPacketDescription curPacket = (*packetTable)[i + inStartingPacket];
-			outPacketDescriptions[i] = curPacket;				
+			outPacketDescriptions[i] = curPacket;
 			outPacketDescriptions[i].mStartOffset = curPacket.mStartOffset - firstPacketOffset;
 		}
 	}
@@ -890,20 +890,20 @@ OSStatus AudioFileObject::ReadPacketDataVBR_InTable(
 
 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-OSStatus AudioFileObject::WritePackets(	
+OSStatus AudioFileObject::WritePackets(
 									Boolean								inUseCache,
                                     UInt32								inNumBytes,
                                     const AudioStreamPacketDescription	*inPacketDescriptions,
-                                    SInt64								inStartingPacket, 
-                                    UInt32								*ioNumPackets, 
+                                    SInt64								inStartingPacket,
+                                    UInt32								*ioNumPackets,
                                     const void							*inBuffer)
 {
 	// This only works with CBR. To suppport VBR you must override.
     OSStatus		err = noErr;
-    
+
     FailWithAction(inStartingPacket > GetNumPackets(), err = kAudioFileInvalidPacketOffsetError, Bail, "write past end");
     FailWithAction((ioNumPackets == NULL) || (inBuffer == NULL), err = kAudioFileUnspecifiedError, Bail, "invalid parameter");
-	
+
 	{
 		UInt32 byteCount = *ioNumPackets * mDataFormat.mBytesPerPacket;
 		SInt64 startingByte = inStartingPacket * mDataFormat.mBytesPerPacket;
@@ -922,21 +922,21 @@ Bail:
 
 OSStatus AudioFileObject::GetBitRate(			UInt32					*outBitRate)
 {
-	
+
 	if (!outBitRate) return kAudioFileUnspecifiedError;
-    
+
 	UInt32 bytesPerPacket = GetDataFormat().mBytesPerPacket;
 	UInt32 framesPerPacket = GetDataFormat().mFramesPerPacket;
 	Float64 sampleRate = GetDataFormat().mSampleRate;
 	const Float64 bitsPerByte = 8.;
-	
+
 	if (bytesPerPacket && framesPerPacket) {
 		*outBitRate = (UInt32)(bitsPerByte * (Float64)bytesPerPacket * sampleRate / (Float64)framesPerPacket);
-	} else {		
+	} else {
 		SInt64 numPackets = GetNumPackets();
 		SInt64 numBytes = GetNumBytes();
 		SInt64 numFrames = 0;
-		
+
 		if (framesPerPacket) {
 			numFrames = numPackets * framesPerPacket;
 		} else {
@@ -953,12 +953,12 @@ OSStatus AudioFileObject::GetBitRate(			UInt32					*outBitRate)
 #endif
 				{
 					numFrames += (*packetTable)[i].mVariableFramesInPacket;
-				}		
+				}
 			} else {
 				return kAudioFileUnsupportedPropertyError;
 			}
 		}
-        
+
         if (numFrames == 0 || (sampleRate == 0.)) {
             *outBitRate = 0;
             return noErr;
@@ -1098,18 +1098,18 @@ OSStatus AudioFileObject::GetInfoDictionarySize(		UInt32						*outDataSize,
 }
 
 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-												
+
 OSStatus AudioFileObject::GetInfoDictionary(CACFDictionary  *infoDict)
-{	
+{
 	Float64 fl;
 	if (GetEstimatedDuration(&fl) == noErr)
 		return AddDurationToInfoDictionary(infoDict, fl);
-		
+
 	return kAudioFileUnsupportedPropertyError;
 }
 
 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-												
+
 OSStatus AudioFileObject::SetInfoDictionary(CACFDictionary *infoDict)
 {
 	return kAudioFileUnsupportedPropertyError;
@@ -1120,31 +1120,31 @@ OSStatus AudioFileObject::GetEstimatedDuration(Float64*		duration)
 {
 	// calculate duration
 	AudioStreamBasicDescription		ASBD = GetDataFormat();
-		
+
 	*duration  = (ASBD.mFramesPerPacket != 0) ? (GetNumPackets() * ASBD.mFramesPerPacket) / ASBD.mSampleRate : 0.0;
-	
+
 	/*
 		For now, assume that any ASBD that has zero in the frames per packet field has been subclassed for this
 		method. i.e. A CAF file has a frame count in one of it's chunks.
-		
-		MP3 has been subclassed because it guesstimates a duration so the entire file does not 
+
+		MP3 has been subclassed because it guesstimates a duration so the entire file does not
 		need to be parsed in order to calculate the total frames.
 	*/
-	
+
 	return noErr;
 
 }
 
 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-OSStatus AudioFileObject::GetPropertyInfo	(	
+OSStatus AudioFileObject::GetPropertyInfo	(
                                         AudioFilePropertyID		inPropertyID,
                                         UInt32					*outDataSize,
                                         UInt32					*isWritable)
 {
     OSStatus		err = noErr;
     UInt32			writable = 0;
-        
+
     switch (inPropertyID)
     {
 		case kAudioFilePropertyDeferSizeUpdates :
@@ -1161,11 +1161,11 @@ OSStatus AudioFileObject::GetPropertyInfo	(
             if (outDataSize) *outDataSize = sizeof(AudioStreamBasicDescription);
             writable = 1;
             break;
-                        
+
 		case kAudioFilePropertyFormatList:
 			err = GetFormatListInfo(*outDataSize, writable);
             break;
-		
+
 		case kAudioFilePropertyPacketSizeUpperBound:
         case kAudioFilePropertyIsOptimized:
         case kAudioFilePropertyMaximumPacketSize:
@@ -1184,25 +1184,25 @@ OSStatus AudioFileObject::GetPropertyInfo	(
             if (outDataSize) *outDataSize = sizeof(SInt64);
             break;
 
-		case kAudioFilePropertyBitRate:            
+		case kAudioFilePropertyBitRate:
             writable = 0;
             if (outDataSize) *outDataSize = sizeof(UInt32);
 			break;
 
-		case kAudioFilePropertyMagicCookieData:            
+		case kAudioFilePropertyMagicCookieData:
             err = GetMagicCookieDataSize(outDataSize, &writable);
 			break;
 
 		case kAudioFilePropertyMarkerList :
-            err = GetMarkerListSize(outDataSize, &writable);			
+            err = GetMarkerListSize(outDataSize, &writable);
 			break;
-			
+
 		case kAudioFilePropertyRegionList :
-            err = GetRegionListSize(outDataSize, &writable);			
+            err = GetRegionListSize(outDataSize, &writable);
 			break;
-			
+
 		case kAudioFilePropertyChannelLayout :
-            err = GetChannelLayoutSize(outDataSize, &writable);			
+            err = GetChannelLayoutSize(outDataSize, &writable);
 			break;
 
 		case kAudioFilePropertyPacketToFrame :
@@ -1218,11 +1218,11 @@ OSStatus AudioFileObject::GetPropertyInfo	(
 			break;
 
         case kAudioFilePropertyInfoDictionary :
-            err = GetInfoDictionarySize(outDataSize, &writable);			
+            err = GetInfoDictionarySize(outDataSize, &writable);
             break;
 
         case kTEMPAudioFilePropertySoundCheckDictionary :
-            err = GetSoundCheckDictionarySize(outDataSize, &writable);			
+            err = GetSoundCheckDictionarySize(outDataSize, &writable);
             break;
 
 		case kTEMPAudioFilePropertyGenerateLoudnessInfo :
@@ -1253,7 +1253,7 @@ OSStatus AudioFileObject::GetPropertyInfo	(
 			if (outDataSize) *outDataSize = sizeof(SInt32);
 			if (isWritable) *isWritable = CanWrite();
 			break;
-		
+
         default:
             writable = 0;
             err = kAudioFileUnsupportedPropertyError;
@@ -1275,109 +1275,109 @@ OSStatus	AudioFileObject::GetProperty(
     OSStatus		err = noErr;
 	UInt32			neededSize;
     UInt32			writable;
-	
+
     switch (inPropertyID)
     {
         case kAudioFilePropertyFileFormat:
-            FailWithAction(*ioDataSize != sizeof(UInt32), 
+            FailWithAction(*ioDataSize != sizeof(UInt32),
 				err = kAudioFileBadPropertySizeError, Bail, "inDataSize is wrong");
-				
+
             *(UInt32 *) ioPropertyData = GetFileType();
             break;
 
 		case kAudioFilePropertyFormatList:
 			err = GetFormatList(*ioDataSize, (AudioFormatListItem*)ioPropertyData);
             break;
-		
+
         case kAudioFilePropertyDataFormat:
-            FailWithAction(*ioDataSize != sizeof(AudioStreamBasicDescription), 
+            FailWithAction(*ioDataSize != sizeof(AudioStreamBasicDescription),
 				err = kAudioFileBadPropertySizeError, Bail, "inDataSize is wrong");
-				
+
             memcpy(ioPropertyData, &mDataFormat, sizeof(AudioStreamBasicDescription));
             break;
 		case kAudioFilePropertyDataOffset:
-            FailWithAction(*ioDataSize != sizeof(SInt64), 
+            FailWithAction(*ioDataSize != sizeof(SInt64),
 				err = kAudioFileBadPropertySizeError, Bail, "inDataSize is wrong");
             *(SInt64 *) ioPropertyData = mDataOffset;
 			break;
         case kAudioFilePropertyIsOptimized:
-            FailWithAction(*ioDataSize != sizeof(UInt32), 
+            FailWithAction(*ioDataSize != sizeof(UInt32),
 				err = kAudioFileBadPropertySizeError, Bail, "inDataSize is wrong");
             *(UInt32 *) ioPropertyData = mIsOptimized;
             break;
 
         case kAudioFilePropertyAudioDataByteCount:
-            FailWithAction(*ioDataSize != sizeof(SInt64), 
+            FailWithAction(*ioDataSize != sizeof(SInt64),
 				err = kAudioFileBadPropertySizeError, Bail, "inDataSize is wrong");
             *(SInt64 *)ioPropertyData = GetNumBytes();
             break;
 
         case kAudioFilePropertyAudioDataPacketCount:
-            FailWithAction(*ioDataSize != sizeof(SInt64), 
+            FailWithAction(*ioDataSize != sizeof(SInt64),
 				err = kAudioFileBadPropertySizeError, Bail, "inDataSize is wrong");
             *(SInt64 *)ioPropertyData = GetNumPackets();
             break;
 
 		case kAudioFilePropertyPacketSizeUpperBound:
-            FailWithAction(*ioDataSize != sizeof(UInt32), 
+            FailWithAction(*ioDataSize != sizeof(UInt32),
 				err = kAudioFileBadPropertySizeError, Bail, "inDataSize is wrong");
             *(UInt32 *)ioPropertyData = GetPacketSizeUpperBound();
             break;
-			
+
         case kAudioFilePropertyMaximumPacketSize:
-            FailWithAction(*ioDataSize != sizeof(UInt32), 
+            FailWithAction(*ioDataSize != sizeof(UInt32),
 				err = kAudioFileBadPropertySizeError, Bail, "inDataSize is wrong");
             *(UInt32 *)ioPropertyData = FindMaximumPacketSize();
             break;
 
 
-         case kAudioFilePropertyBitRate:            
-            FailWithAction(*ioDataSize != sizeof(UInt32), 
+         case kAudioFilePropertyBitRate:
+            FailWithAction(*ioDataSize != sizeof(UInt32),
 				err = kAudioFileBadPropertySizeError, Bail, "inDataSize is wrong");
 			err = GetBitRate((UInt32*)ioPropertyData);
             break;
 
-         case kAudioFilePropertyMagicCookieData:            
-            
+         case kAudioFilePropertyMagicCookieData:
+
 			err = GetMagicCookieData(ioDataSize, ioPropertyData);
             break;
 
 		case kAudioFilePropertyMarkerList :
-            err = GetMarkerList(ioDataSize, static_cast<AudioFileMarkerList*>(ioPropertyData));			
+            err = GetMarkerList(ioDataSize, static_cast<AudioFileMarkerList*>(ioPropertyData));
 			break;
-			
+
 		case kAudioFilePropertyRegionList :
 			memset(ioPropertyData, 0, *ioDataSize);
-            err = GetRegionList(ioDataSize, static_cast<AudioFileRegionList*>(ioPropertyData));			
+            err = GetRegionList(ioDataSize, static_cast<AudioFileRegionList*>(ioPropertyData));
 			break;
-			
+
 		case kAudioFilePropertyChannelLayout :
 			err = GetChannelLayoutSize(&neededSize, &writable);
             FailIf(err, Bail, "GetChannelLayoutSize failed");
             FailWithAction(*ioDataSize != neededSize, err = kAudioFileBadPropertySizeError, Bail, "inDataSize is wrong");
-			
-            err = GetChannelLayout(ioDataSize, static_cast<AudioChannelLayout*>(ioPropertyData));			
+
+            err = GetChannelLayout(ioDataSize, static_cast<AudioChannelLayout*>(ioPropertyData));
 			break;
-						
+
 		case kAudioFilePropertyDeferSizeUpdates :
-            FailWithAction(*ioDataSize != sizeof(UInt32), 
+            FailWithAction(*ioDataSize != sizeof(UInt32),
 				err = kAudioFileBadPropertySizeError, Bail, "inDataSize is wrong");
-				
+
             *(UInt32 *) ioPropertyData = DeferSizeUpdates();
             break;
 
-		case kAudioFilePropertyPacketToFrame : 
+		case kAudioFilePropertyPacketToFrame :
 		{
-            FailWithAction(*ioDataSize != sizeof(AudioFramePacketTranslation), 
+            FailWithAction(*ioDataSize != sizeof(AudioFramePacketTranslation),
 				err = kAudioFileBadPropertySizeError, Bail, "inDataSize is wrong");
-			
+
 			AudioFramePacketTranslation* afpt = (AudioFramePacketTranslation*)ioPropertyData;
 			err = PacketToFrame(afpt->mPacket, afpt->mFrame);
 			break;
-		}	
+		}
 		case kAudioFilePropertyFrameToPacket :
 		{
-            FailWithAction(*ioDataSize != sizeof(AudioFramePacketTranslation), 
+            FailWithAction(*ioDataSize != sizeof(AudioFramePacketTranslation),
 				err = kAudioFileBadPropertySizeError, Bail, "inDataSize is wrong");
 
 			AudioFramePacketTranslation* afpt = (AudioFramePacketTranslation*)ioPropertyData;
@@ -1385,18 +1385,18 @@ OSStatus	AudioFileObject::GetProperty(
 			break;
 		}
 
-		case kAudioFilePropertyPacketToByte : 
+		case kAudioFilePropertyPacketToByte :
 		{
-            FailWithAction(*ioDataSize != sizeof(AudioBytePacketTranslation), 
+            FailWithAction(*ioDataSize != sizeof(AudioBytePacketTranslation),
 				err = kAudioFileBadPropertySizeError, Bail, "inDataSize is wrong");
-			
+
 			AudioBytePacketTranslation* abpt = (AudioBytePacketTranslation*)ioPropertyData;
 			err = PacketToByte(abpt);
 			break;
-		}	
+		}
 		case kAudioFilePropertyByteToPacket :
 		{
-            FailWithAction(*ioDataSize != sizeof(AudioBytePacketTranslation), 
+            FailWithAction(*ioDataSize != sizeof(AudioBytePacketTranslation),
 				err = kAudioFileBadPropertySizeError, Bail, "inDataSize is wrong");
 
 			AudioBytePacketTranslation* abpt = (AudioBytePacketTranslation*)ioPropertyData;
@@ -1406,13 +1406,13 @@ OSStatus	AudioFileObject::GetProperty(
 
         case kAudioFilePropertyInfoDictionary :
 		{
-            FailWithAction(*ioDataSize != sizeof(CFDictionaryRef), 
+            FailWithAction(*ioDataSize != sizeof(CFDictionaryRef),
 				err = kAudioFileBadPropertySizeError, Bail, "inDataSize is wrong");
 
 			CACFDictionary		afInfoDictionary(true);
 
-            err = GetInfoDictionary(&afInfoDictionary);			
-            
+            err = GetInfoDictionary(&afInfoDictionary);
+
 			if (!err)
 			{
 				*(CFMutableDictionaryRef *)ioPropertyData = afInfoDictionary.CopyCFMutableDictionary();
@@ -1422,7 +1422,7 @@ OSStatus	AudioFileObject::GetProperty(
 
         case kTEMPAudioFilePropertySoundCheckDictionary :
 		{
-            FailWithAction(*ioDataSize != sizeof(CFDictionaryRef), 
+            FailWithAction(*ioDataSize != sizeof(CFDictionaryRef),
 				err = kAudioFileBadPropertySizeError, Bail, "inDataSize is wrong");
 
 			CACFDictionary		afInfoDictionary(true);
@@ -1432,7 +1432,7 @@ OSStatus	AudioFileObject::GetProperty(
 				OSStatus err2 = GetSoundCheckDictionaryFromLoudnessInfo(&afInfoDictionary);
 				if (err2 == noErr) err = noErr; // else report original error from GetSoundCheckDictionary.
 			}
-            
+
 			if (!err)
 			{
 				*(CFMutableDictionaryRef *)ioPropertyData = afInfoDictionary.CopyCFMutableDictionary();
@@ -1442,7 +1442,7 @@ OSStatus	AudioFileObject::GetProperty(
 
         case kTEMPAudioFilePropertyLoudnessInfo :
 		{
-            FailWithAction(*ioDataSize != sizeof(CFDictionaryRef), 
+            FailWithAction(*ioDataSize != sizeof(CFDictionaryRef),
 				err = kAudioFileBadPropertySizeError, Bail, "inDataSize is wrong");
 
 			CACFDictionary		afInfoDictionary(true);
@@ -1452,8 +1452,8 @@ OSStatus	AudioFileObject::GetProperty(
 				OSStatus err2 = GetLoudnessInfoFromSoundCheckDictionary(&afInfoDictionary);
 				if (err2 == noErr) err = noErr; // else report original error from GetLoudnessInfo.
 			}
-			
-			if (!err) 
+
+			if (!err)
 			{
 				*(CFMutableDictionaryRef *)ioPropertyData = afInfoDictionary.CopyCFMutableDictionary();
 			}
@@ -1467,8 +1467,8 @@ OSStatus	AudioFileObject::GetProperty(
 
 			CACFDictionary		afInfoDictionary(true);
 
-            err = GenerateLoudnessInfo(&afInfoDictionary);			
-            
+            err = GenerateLoudnessInfo(&afInfoDictionary);
+
 			if (!err)
 			{
 				*(CFMutableDictionaryRef *)ioPropertyData = afInfoDictionary.CopyCFMutableDictionary();
@@ -1478,10 +1478,10 @@ OSStatus	AudioFileObject::GetProperty(
 
 		case kAudioFilePropertyEstimatedDuration :
 		{
-            FailWithAction(*ioDataSize != sizeof(Float64), 
+            FailWithAction(*ioDataSize != sizeof(Float64),
 				err = kAudioFileBadPropertySizeError, Bail, "inDataSize is wrong");
-		
-			err = GetEstimatedDuration((Float64*)ioPropertyData); 
+
+			err = GetEstimatedDuration((Float64*)ioPropertyData);
 			break;
 		}
 
@@ -1492,21 +1492,21 @@ OSStatus	AudioFileObject::GetProperty(
 			*ioDataSize = sizeof(CFStringRef);
 			err = GetLyrics((CFStringRef*) ioPropertyData);
 			break;
-	
-		case 'eof?' : 
+
+		case 'eof?' :
 		{
             if (*ioDataSize != sizeof(UInt32))
                 return kAudioFileBadPropertySizeError;
-			
+
 			SInt64 pos;
 			err = GetDataSource()->GetPos(pos);
 			if (err) break;
-			
+
 			SInt64 endOfData = GetDataOffset() + GetNumBytes();
 			*(UInt32*)ioPropertyData = pos >= endOfData;
-			
+
 			break;
-		}	
+		}
 		case 'sbtd' /*kAudioFilePropertySourceBitDepth*/ :
 		{
             if (*ioDataSize != sizeof(SInt32))
@@ -1518,17 +1518,17 @@ OSStatus	AudioFileObject::GetProperty(
 				// if there was no stored source bit depth, and this file is LPCM, then report this file's bit depth.
 				err = noErr;
 				outValue = GetDataFormat().mBitsPerChannel;
-				if (GetDataFormat().mFormatFlags & kAudioFormatFlagIsFloat) 
+				if (GetDataFormat().mFormatFlags & kAudioFormatFlagIsFloat)
 					outValue = -outValue;
-			} else if (err) 
+			} else if (err)
 				break;
-			
+
 			*(SInt32 *) ioPropertyData = outValue;
-			
+
 			break;
-		}	
+		}
 		default:
-            err = kAudioFileUnsupportedPropertyError;			
+            err = kAudioFileUnsupportedPropertyError;
             break;
     }
 
@@ -1548,14 +1548,14 @@ OSStatus	AudioFileObject::SetProperty(
     switch (inPropertyID)
     {
         case kAudioFilePropertyDataFormat:
-            FailWithAction(inDataSize != sizeof(AudioStreamBasicDescription), 
+            FailWithAction(inDataSize != sizeof(AudioStreamBasicDescription),
 				err = kAudioFileBadPropertySizeError, Bail, "Incorrect data size");
             err = UpdateDataFormat((AudioStreamBasicDescription *) inPropertyData);
 			break;
 		case kAudioFilePropertyFormatList:
 			err = SetFormatList(inDataSize, (AudioFormatListItem*)inPropertyData);
             break;
-		
+
         case kAudioFilePropertyAudioDataByteCount: {
             FailWithAction(inDataSize != sizeof(SInt64), err = kAudioFileBadPropertySizeError, Bail, "Incorrect data size");
             SInt64 numBytes = *(SInt64 *) inPropertyData;
@@ -1577,82 +1577,82 @@ OSStatus	AudioFileObject::SetProperty(
 			}
 			err = UpdateNumPackets(numPackets);
 		} break;
-		
-		case kAudioFilePropertyMagicCookieData:            
+
+		case kAudioFilePropertyMagicCookieData:
 			err = SetMagicCookieData(inDataSize, inPropertyData);
 			break;
 
 
 		case kAudioFilePropertyMarkerList :
-            err = SetMarkerList(inDataSize, static_cast<const AudioFileMarkerList*>(inPropertyData));			
+            err = SetMarkerList(inDataSize, static_cast<const AudioFileMarkerList*>(inPropertyData));
 			break;
-			
+
 		case kAudioFilePropertyRegionList :
-            err = SetRegionList(inDataSize, static_cast<const AudioFileRegionList*>(inPropertyData));			
+            err = SetRegionList(inDataSize, static_cast<const AudioFileRegionList*>(inPropertyData));
 			break;
-			
+
 		case kAudioFilePropertyChannelLayout :
-            err = SetChannelLayout(inDataSize, static_cast<const AudioChannelLayout*>(inPropertyData));			
+            err = SetChannelLayout(inDataSize, static_cast<const AudioChannelLayout*>(inPropertyData));
 			break;
 
 		case kAudioFilePropertyDeferSizeUpdates :
-            FailWithAction(inDataSize != sizeof(UInt32), 
+            FailWithAction(inDataSize != sizeof(UInt32),
 				err = kAudioFileBadPropertySizeError, Bail, "inDataSize is wrong");
             SetDeferSizeUpdates(*(UInt32 *) inPropertyData);
             break;
 
         case kAudioFilePropertyInfoDictionary :
 		{
-            FailWithAction(inDataSize != sizeof(CFDictionaryRef), 
+            FailWithAction(inDataSize != sizeof(CFDictionaryRef),
 				err = kAudioFileBadPropertySizeError, Bail, "inDataSize is wrong");
 
 			// pass the SetInfoDictionary a CACFDictionary object made with the provided CFDictionaryRef
 			// Let the caller release their own CFObject so pass false for th erelease parameter
 			CACFDictionary		afInfoDictionary(*(CFDictionaryRef *)inPropertyData, false);
-            err = SetInfoDictionary(&afInfoDictionary);			
-            
+            err = SetInfoDictionary(&afInfoDictionary);
+
             break;
 		}
-			
+
         case kTEMPAudioFilePropertySoundCheckDictionary :
 		{
-            FailWithAction(inDataSize != sizeof(CFDictionaryRef), 
+            FailWithAction(inDataSize != sizeof(CFDictionaryRef),
 				err = kAudioFileBadPropertySizeError, Bail, "inDataSize is wrong");
 
 			// pass the SetInfoDictionary a CACFDictionary object made with the provided CFDictionaryRef
 			// Let the caller release their own CFObject so pass false for the release parameter
 			CACFDictionary		afInfoDictionary(*(CFDictionaryRef *)inPropertyData, false);
-            err = SetSoundCheckDictionary(&afInfoDictionary);			
-            
+            err = SetSoundCheckDictionary(&afInfoDictionary);
+
             break;
 		}
 
         case kTEMPAudioFilePropertyLoudnessInfo :
 		{
-            FailWithAction(inDataSize != sizeof(CFDictionaryRef), 
+            FailWithAction(inDataSize != sizeof(CFDictionaryRef),
 				err = kAudioFileBadPropertySizeError, Bail, "inDataSize is wrong");
 
 			// pass the SetInfoDictionary a CACFDictionary object made with the provided CFDictionaryRef
 			// Let the caller release their own CFObject so pass false for the release parameter
 			CACFDictionary		afInfoDictionary(*(CFDictionaryRef *)inPropertyData, false);
-            err = SetLoudnessInfo(&afInfoDictionary);			
-            
+            err = SetLoudnessInfo(&afInfoDictionary);
+
             break;
 		}
-			
+
   		case 'sbtd' /*kAudioFilePropertySourceBitDepth*/ :
 		{
-            FailWithAction(inDataSize != sizeof(SInt32), 
+            FailWithAction(inDataSize != sizeof(SInt32),
 				err = kAudioFileBadPropertySizeError, Bail, "inDataSize is wrong");
 
 			SInt32 inValue = *(SInt32 *)inPropertyData;
 			err = SetSourceBitDepth(inValue);
-			
+
 			break;
-		}	
+		}
 
       default:
-            err = kAudioFileUnsupportedPropertyError;			
+            err = kAudioFileUnsupportedPropertyError;
 		break;
     }
 
@@ -1666,17 +1666,17 @@ Bail:
 OSStatus AudioFileObject::SetDataFormat(const AudioStreamBasicDescription* inStreamFormat)
 {
 	OSStatus err = noErr;
-	
+
 	if (!IsDataFormatValid(inStreamFormat))
 		return kAudioFileUnsupportedDataFormatError;
 
-	if (!IsDataFormatSupported(inStreamFormat)) 
+	if (!IsDataFormatSupported(inStreamFormat))
 		return kAudioFileUnsupportedDataFormatError;
-	
+
 	UInt32 prevBytesPerPacket = mDataFormat.mBytesPerPacket;
-	
+
 	mDataFormat = *inStreamFormat;
-	
+
 	// if CBR and bytes per packet changes, we need to change the number of packets we think we have.
 	if (mDataFormat.mBytesPerPacket && mDataFormat.mBytesPerPacket != prevBytesPerPacket)
 	{
@@ -1687,9 +1687,9 @@ OSStatus AudioFileObject::SetDataFormat(const AudioStreamBasicDescription* inStr
 		if (!mFirstSetFormat)
 			SizeChanged();
 	}
-	
+
 	mFirstSetFormat = false;
-	
+
 	return err;
 }
 
@@ -1712,7 +1712,7 @@ OSStatus AudioFileObject::GetFormatList(	UInt32									&ioDataSize,
 	// default implementation is to just return the data format
 	if (ioDataSize < sizeof(AudioFormatListItem))
 		return kAudioFileBadPropertySizeError;
-	
+
 	AudioFormatListItem afli;
 	afli.mASBD = mDataFormat;
 	AudioChannelLayoutTag layoutTag = /*kAudioChannelLayoutTag_Unknown*/ 0xFFFF0000 | mDataFormat.mChannelsPerFrame;
@@ -1727,14 +1727,14 @@ OSStatus AudioFileObject::GetFormatList(	UInt32									&ioDataSize,
 			layoutTag = layout->mChannelLayoutTag;
 		}
 	}
-	afli.mChannelLayoutTag = layoutTag;	
-	
+	afli.mChannelLayoutTag = layoutTag;
+
 	memcpy(ioPropertyData, &afli, sizeof(AudioFormatListItem));
-	
+
 	ioDataSize = sizeof(AudioFormatListItem);
 	return noErr;
 }
-										
+
 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 OSStatus AudioFileObject::SetFormatList(	UInt32									inDataSize,
@@ -1765,22 +1765,22 @@ Boolean AudioFileObject::IsDataFormatValid(AudioStreamBasicDescription const* in
 		return false;
 
 	if (inDesc->mFormatID == kAudioFormatLinearPCM)
-	{			
+	{
 		if (inDesc->mBitsPerChannel < 1 || inDesc->mBitsPerChannel > 64)
 			return false;
-			
+
 		if (inDesc->mFramesPerPacket != 1)
 			return false;
-			
-		if (inDesc->mBytesPerPacket == 0) 
+
+		if (inDesc->mBytesPerPacket == 0)
 			return false;
 
 		if (inDesc->mBytesPerFrame != inDesc->mBytesPerPacket)
 			return false;
-			
+
 		// [3605260] we assume here that a packet is an integer number of frames.
 		UInt32 minimumBytesPerPacket = (inDesc->mBitsPerChannel * inDesc->mChannelsPerFrame + 7) / 8;
-		if (inDesc->mBytesPerPacket < minimumBytesPerPacket) 
+		if (inDesc->mBytesPerPacket < minimumBytesPerPacket)
 			return false;
 	}
 	return true;
@@ -1788,7 +1788,7 @@ Boolean AudioFileObject::IsDataFormatValid(AudioStreamBasicDescription const* in
 
 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-void AudioFileObject::SetDataSource(DataSource* inDataSource)	
+void AudioFileObject::SetDataSource(DataSource* inDataSource)
 {
 	if (mDataSource != inDataSource) {
 		delete mDataSource;
@@ -1811,21 +1811,21 @@ OSStatus AudioFileObject::OpenFile(SInt8 inPermissions, int inFD)
 	OSStatus err = noErr;
 
 	SetDataSource(new Cached_DataSource(new UnixFile_DataSource(inFD, inPermissions, true)));
-	
+
 	mFileD = inFD;
 	SetPermissions (inPermissions);
 
 	return err;
 }
-								
+
 OSStatus AudioFileObject::CreateDataFile (CFURLRef	inFileRef, int	&outFileD)
-{	 
-	UInt8 fPath[FILENAME_MAX];	
+{
+	UInt8 fPath[FILENAME_MAX];
 	if (!CFURLGetFileSystemRepresentation (inFileRef, true, fPath, FILENAME_MAX))
 		return kAudio_FileNotFoundError;
-	
+
 	struct stat stbuf;
-	if (stat ((const char*)fPath, &stbuf) == 0) 
+	if (stat ((const char*)fPath, &stbuf) == 0)
 		return kAudioFilePermissionsError;
 
 #if TARGET_OS_WIN32
@@ -1863,7 +1863,7 @@ OSStatus AudioFileObject::AddDurationToInfoDictionary(CACFDictionary *infoDict,
 OSStatus AudioFileObject::SizeChanged()
 {
 	OSStatus err = noErr;
-	if (mPermissions & kAudioFileWritePermission) 
+	if (mPermissions & kAudioFileWritePermission)
 	{
 		if (DeferSizeUpdates())
 			SetNeedsSizeUpdate(true);
@@ -1874,8 +1874,8 @@ OSStatus AudioFileObject::SizeChanged()
 }
 
 OSStatus AudioFileObject::UpdateSizeIfNeeded()
-{		
-	if (GetNeedsSizeUpdate()) 
+{
+	if (GetNeedsSizeUpdate())
 	{
 		OSStatus err = UpdateSize();
 		if (err) return err;
@@ -1896,7 +1896,7 @@ OSStatus AudioFileObject::GetUserDataSize(  UInt32					/*inUserDataID*/,
 {
 	return kAudioFileOperationNotSupportedError;
 }
-											
+
 OSStatus AudioFileObject::GetUserData(		UInt32					/*inUserDataID*/,
 											UInt32					/*inIndex*/,
 											UInt32*					/*ioDataSize*/,
@@ -1904,7 +1904,7 @@ OSStatus AudioFileObject::GetUserData(		UInt32					/*inUserDataID*/,
 {
 	return kAudioFileOperationNotSupportedError;
 }
-											
+
 OSStatus AudioFileObject::SetUserData(		UInt32					/*inUserDataID*/,
 											UInt32					/*inIndex*/,
 											UInt32					/*inDataSize*/,
@@ -1912,7 +1912,7 @@ OSStatus AudioFileObject::SetUserData(		UInt32					/*inUserDataID*/,
 {
 	return kAudioFileOperationNotSupportedError;
 }
-											
+
 OSStatus AudioFileObject::RemoveUserData(	UInt32					/*inUserDataID*/,
 											UInt32					/*inIndex*/)
 {
@@ -1921,7 +1921,7 @@ OSStatus AudioFileObject::RemoveUserData(	UInt32					/*inUserDataID*/,
 
 OSStatus AudioFileObject::MoveData(SInt64 fromPos, SInt64 toPos, SInt64 size)
 {
-	if (fromPos == toPos) 
+	if (fromPos == toPos)
 		return noErr;
 
 	OSStatus err = noErr;
@@ -1933,13 +1933,13 @@ OSStatus AudioFileObject::MoveData(SInt64 fromPos, SInt64 toPos, SInt64 size)
 		{
 			// read from old file
 			UInt32 byteCount;
-			SInt64 count = (bytesRemaining < kCopySoundDataBufferSize) ? bytesRemaining : kCopySoundDataBufferSize; 
+			SInt64 count = (bytesRemaining < kCopySoundDataBufferSize) ? bytesRemaining : kCopySoundDataBufferSize;
 			err = GetDataSource()->ReadBytes(SEEK_SET, fromPos+(bytesRemaining-count), (UInt32)count, audioData(), &byteCount);
 			FailIf (err != noErr, Bail, "MoveData ReadBytes failed");
 
 			err = GetDataSource()->WriteBytes(SEEK_SET, toPos+(bytesRemaining-count), (UInt32)count, audioData(), &byteCount);
 			FailIf (err != noErr, Bail, "WriteBytes failed");
-			
+
 			bytesRemaining -= count;
 		}
 	} else {
@@ -1947,17 +1947,17 @@ OSStatus AudioFileObject::MoveData(SInt64 fromPos, SInt64 toPos, SInt64 size)
 		{
 			// read from old file
 			UInt32 byteCount;
-			SInt64 count = (bytesRemaining < kCopySoundDataBufferSize) ? bytesRemaining : kCopySoundDataBufferSize; 
+			SInt64 count = (bytesRemaining < kCopySoundDataBufferSize) ? bytesRemaining : kCopySoundDataBufferSize;
 			err = GetDataSource()->ReadBytes(SEEK_SET, fromPos+(size - bytesRemaining), (UInt32)count, audioData(), &byteCount);
 			FailIf (err != noErr, Bail, "MoveData ReadBytes failed");
-			
+
 			err = GetDataSource()->WriteBytes(SEEK_SET, toPos+(size - bytesRemaining), (UInt32)count, audioData(), &byteCount);
 			FailIf (err != noErr, Bail, "WriteBytes failed");
-			
+
 			bytesRemaining -= count;
 		}
 	}
-	
+
 Bail:
 	return err;
 }
diff --git a/libs/appleutility/CoreAudio/AudioFile/AFPublic/AudioFileObject.h b/libs/appleutility/CoreAudio/AudioFile/AFPublic/AudioFileObject.h
index 6d7c868..9af04ec 100644
--- a/libs/appleutility/CoreAudio/AudioFile/AFPublic/AudioFileObject.h
+++ b/libs/appleutility/CoreAudio/AudioFile/AFPublic/AudioFileObject.h
@@ -2,14 +2,14 @@
      File: AudioFileObject.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #ifndef _AudioFileObject_H_
 #define _AudioFileObject_H_
@@ -96,12 +96,12 @@ enum {
 		//	as described by the magic cookie.
 		//	The specifier is an AudioFormatInfo struct. At a minimum formatID member of the ASBD struct must filled in. Other fields
 		//	may be filled in.
-		
+
 	kAudioFormatProperty_OutputFormatList				= 'ofls',
 		//	Returns a list of AudioFormatListItem structs describing the audio formats which may be obtained by decoding the format
 		//	described by the specifier.
 		//	The specifier is an AudioFormatInfo struct. At a minimum formatID member of the ASBD struct must filled in. Other fields
-		//	may be filled in. If there is no magic cookie, then the number of channels and sample rate should be filled in. 
+		//	may be filled in. If there is no magic cookie, then the number of channels and sample rate should be filled in.
 
 };
 
@@ -134,7 +134,7 @@ enum {
   kUpperCase_IMACompression               = 'IMA4', /*IMA 4:1*/
   kUpperCase_ULawCompression              = 'ULAW', /*µLaw 2:1*/
   kUpperCase_ALawCompression              = 'ALAW', /*aLaw 2:1*/
-  
+
   kUpperCase_Float32					  = 'FL32',
   kUpperCase_Float64					  = 'FL64'
 };
@@ -142,7 +142,7 @@ enum {
 enum
 {
 	// in what header is this defined? what is it?
-	kGSM = 'agsm', 
+	kGSM = 'agsm',
 	kUpperCase_GSM = 'GSM '
 };
 
@@ -209,9 +209,9 @@ private:
 	AudioStreamBasicDescription		mDataFormat;		// format of the audio data
 	SInt64							mDataOffset;		// position if the file where audio data begins
 	UInt32							mIsOptimized;		// 1 if there is nothing in the file following the audio data, 0 if there is
-	UInt32							mFileType;			// file type of the audio file (i.e. AIFF, WAVE, etc.)			
+	UInt32							mFileType;			// file type of the audio file (i.e. AIFF, WAVE, etc.)
 	CFURLRef						mFileRef;				// URL of the file passed to AudioFileOpen or AudioFileCreate
-	int								mFileD;			// Ref num of the file after opening within Audio File 
+	int								mFileD;			// Ref num of the file after opening within Audio File
 	SInt8							mPermissions;		// file permissions indicated by the caller, passed by AudioFileOpen or set with SetProperty function
 	Boolean							mIsInitialized;		// has the AudioFileObject for this file been intialized?
 	DataSource						*mDataSource;
@@ -221,9 +221,9 @@ private:
 	Boolean							mNeedsSizeUpdate;
 	Boolean							mFirstSetFormat;
 	Boolean							mAlignDataWithFillerChunks;
-	
-public:    
-  
+
+public:
+
 	AudioFileObject (UInt32 inFileType)
 		: mNumBytes(0),
 		  mNumPackets(0),
@@ -244,159 +244,159 @@ public:
 		  {
 			memset(&mDataFormat, 0, sizeof(mDataFormat));
 		  }
-	
+
 	virtual ~AudioFileObject();
 
-	
+
 /* Public API Function Implementation */
 	// The DoSomething() versions of these functions are wrappers that perform a standard prologue.
 	// The Something() methods are those which should be overridden in the subclasses.
-	
+
 	OSStatus DoCreate(				CFURLRef							inFileRef,
 									const AudioStreamBasicDescription	*inFormat,
 									UInt32								inFlags);
-                                
+
 	virtual OSStatus Create(		CFURLRef							inFileRef,
 									const AudioStreamBasicDescription	*inFormat);
-                                
-	OSStatus DoOpen(				CFURLRef		inFileRef, 
+
+	OSStatus DoOpen(				CFURLRef		inFileRef,
 									SInt8  			inPermissions,
 									int				inFD);
-									
-	virtual OSStatus Open(			CFURLRef		inFileRef, 
+
+	virtual OSStatus Open(			CFURLRef		inFileRef,
 									SInt8  			inPermissions,
 									int				inFD);
 
 	OSStatus DoOpenWithCallbacks(
-				void *								inRefCon, 
-				AudioFile_ReadProc					inReadFunc, 
-				AudioFile_WriteProc					inWriteFunc, 
+				void *								inRefCon,
+				AudioFile_ReadProc					inReadFunc,
+				AudioFile_WriteProc					inWriteFunc,
 				AudioFile_GetSizeProc				inGetSizeFunc,
 				AudioFile_SetSizeProc				inSetSizeFunc);
-				
-									
+
+
 	OSStatus DoInitialize(			CFURLRef							inFileRef,
 									const AudioStreamBasicDescription	*inFormat,
 									UInt32								inFlags);
-	
+
 	virtual OSStatus Initialize(	CFURLRef							inFileRef,
 									const AudioStreamBasicDescription	*inFormat,
 									UInt32								inFlags);
-										
+
 	OSStatus DoInitializeWithCallbacks(
-				void *								inRefCon, 
-				AudioFile_ReadProc					inReadFunc, 
-				AudioFile_WriteProc					inWriteFunc, 
+				void *								inRefCon,
+				AudioFile_ReadProc					inReadFunc,
+				AudioFile_WriteProc					inWriteFunc,
 				AudioFile_GetSizeProc				inGetSizeFunc,
 				AudioFile_SetSizeProc				inSetSizeFunc,
 				UInt32								inFileType,
 				const AudioStreamBasicDescription	*inFormat,
 				UInt32								inFlags);
-				
+
 	virtual OSStatus OpenFromDataSource(void);
-						
+
 	virtual OSStatus InitializeDataSource(const AudioStreamBasicDescription	*inFormat, UInt32 inFlags);
-	
+
 	OSStatus DoClose();
-	
+
 	virtual OSStatus Close();
-	
+
 	OSStatus DoOptimize();
-	
+
 	virtual OSStatus Optimize();
-	
+
 	virtual OSStatus ReadBytes(		Boolean			inUseCache,
-									SInt64			inStartingByte, 
-									UInt32			*ioNumBytes, 
+									SInt64			inStartingByte,
+									UInt32			*ioNumBytes,
 									void			*outBuffer);
-	
+
 	virtual OSStatus WriteBytes(	Boolean			inUseCache,
-									SInt64			inStartingByte, 
-									UInt32			*ioNumBytes, 
+									SInt64			inStartingByte,
+									UInt32			*ioNumBytes,
 									const void		*inBuffer);
-	
+
 	virtual OSStatus ReadPackets(	Boolean							inUseCache,
 									UInt32							*outNumBytes,
 									AudioStreamPacketDescription	*outPacketDescriptions,
-									SInt64							inStartingPacket, 
-									UInt32  						*ioNumPackets, 
+									SInt64							inStartingPacket,
+									UInt32  						*ioNumPackets,
 									void							*outBuffer);
 
-	virtual OSStatus ReadPacketData(	
+	virtual OSStatus ReadPacketData(
 									Boolean							inUseCache,
 									UInt32							*ioNumBytes,
 									AudioStreamPacketDescription	*outPacketDescriptions,
-									SInt64							inStartingPacket, 
-									UInt32  						*ioNumPackets, 
+									SInt64							inStartingPacket,
+									UInt32  						*ioNumPackets,
 									void							*outBuffer);
-	
-	virtual OSStatus ReadPacketDataVBR(	
+
+	virtual OSStatus ReadPacketDataVBR(
 									Boolean							inUseCache,
 									UInt32							*ioNumBytes,
 									AudioStreamPacketDescription	*outPacketDescriptions,
-									SInt64							inStartingPacket, 
-									UInt32  						*ioNumPackets, 
+									SInt64							inStartingPacket,
+									UInt32  						*ioNumPackets,
 									void							*outBuffer);
 
     virtual OSStatus	HowManyPacketsCanBeReadIntoBuffer(UInt32* ioNumBytes, SInt64 inStartingPacket, UInt32 *ioNumPackets);
 
-    virtual OSStatus	ReadPacketDataVBR_InTable(	
+    virtual OSStatus	ReadPacketDataVBR_InTable(
                                     Boolean							inUseCache,
                                     UInt32							*ioNumBytes,
                                     AudioStreamPacketDescription	*outPacketDescriptions,
-                                    SInt64							inStartingPacket, 
-                                    UInt32  						*ioNumPackets, 
+                                    SInt64							inStartingPacket,
+                                    UInt32  						*ioNumPackets,
                                     void							*outBuffer);
-	
+
 	virtual OSStatus WritePackets(	Boolean								inUseCache,
                                     UInt32								inNumBytes,
                                     const AudioStreamPacketDescription	*inPacketDescriptions,
-                                    SInt64								inStartingPacket, 
-                                    UInt32								*ioNumPackets, 
+                                    SInt64								inStartingPacket,
+                                    UInt32								*ioNumPackets,
                                     const void							*inBuffer);
 /* Property Support */
 
-	virtual OSStatus GetPropertyInfo	(	
+	virtual OSStatus GetPropertyInfo	(
                                         AudioFilePropertyID		inPropertyID,
                                         UInt32					*outDataSize,
                                         UInt32					*isWritable);
-										
+
 	virtual OSStatus GetProperty	(	AudioFilePropertyID		inPropertyID,
 										UInt32					*ioDataSize,
 										void					*ioPropertyData);
-										
+
 	virtual OSStatus SetProperty	(	AudioFilePropertyID		inPropertyID,
 										UInt32					inDataSize,
 										const void				*inPropertyData);
-										
+
 	UInt32 GetFileType() const { return mFileType; }
 	void SetFileType(UInt32 inFileType) { mFileType = inFileType; }
-	
+
 	// this will set the format in memory only.
 	virtual OSStatus SetDataFormat(const AudioStreamBasicDescription* inStreamFormat);
-	
+
 	// this will update the format info on disk and in memory.
 	virtual OSStatus UpdateDataFormat(const AudioStreamBasicDescription* inStreamFormat);
-	
+
 	const UInt32 GetBytesPerPacket() const { return mDataFormat.mBytesPerPacket; }
-	
+
 	const AudioStreamBasicDescription &GetDataFormat() const { return mDataFormat; }
-	
+
 	virtual OSStatus GetFormatListInfo(	UInt32				&outDataSize,
 											UInt32				&outWritable);
-										
+
 	virtual OSStatus GetFormatList(	UInt32									&ioDataSize,
 									AudioFormatListItem				*ioPropertyData);
-										
+
 	virtual OSStatus SetFormatList(	UInt32									inDataSize,
 									const AudioFormatListItem		*inPropertyData);
-	
+
 	virtual OSStatus UpdateSize() { return noErr; }
 	UInt32	DeferSizeUpdates() { return mDeferSizeUpdates; }
 	void SetDeferSizeUpdates(UInt32 inFlag) { mDeferSizeUpdates = inFlag; }
 	OSStatus UpdateSizeIfNeeded();
 	OSStatus SizeChanged();
-	
+
 	Boolean IsOptimized() const { return mIsOptimized != 0; }
 	void SetIsOptimized(Boolean inIsOptimized) { mIsOptimized = inIsOptimized ? 1 : 0; }
 
@@ -407,79 +407,79 @@ public:
 
 	// this will update the header size info on disk
 	OSStatus UpdateNumBytes(SInt64 inNumBytes);
-	
+
 	virtual SInt64 GetNumPackets(){ return mNumPackets; }
 	virtual void SetNumPackets(SInt64 inNumPackets) { mNumPackets = inNumPackets; }
-	
+
 	// this will update the header size info on disk
 	OSStatus UpdateNumPackets(SInt64 inNumPackets);
 
 	virtual OSStatus PacketToFrame(SInt64 inPacket, SInt64& outFirstFrameInPacket);
 	virtual OSStatus FrameToPacket(SInt64 inFrame, SInt64& outPacket, UInt32& outFrameOffsetInPacket);
-	
+
 	virtual OSStatus PacketToByte(AudioBytePacketTranslation* abpt);
-	
+
 	virtual OSStatus ByteToPacket(AudioBytePacketTranslation* abpt);
-	
+
 	virtual OSStatus GetBitRate(				UInt32					*outBitRate);
-		
+
 	virtual OSStatus GetMagicCookieDataSize(	UInt32					*outDataSize,
 												UInt32					*isWritable);
-	                      
+
 	virtual OSStatus GetMagicCookieData(		UInt32					*ioDataSize,
 												void					*ioPropertyData);
-	                      
+
 	virtual OSStatus SetMagicCookieData(		UInt32					inDataSize,
 												const void				*inPropertyData);
 
 	virtual OSStatus GetMarkerListSize(			UInt32						*outDataSize,
 												UInt32						*isWritable);
-	                      
+
 	virtual OSStatus GetMarkerList(				UInt32						*ioDataSize,
 												AudioFileMarkerList			*ioMarkerList);
-	                      
+
 	virtual OSStatus SetMarkerList(				UInt32						inDataSize,
 												const AudioFileMarkerList	*inMarkerList);
 
 
 	virtual OSStatus GetRegionListSize(			UInt32						*outDataSize,
 												UInt32						*isWritable);
-	                      
+
 	virtual OSStatus GetRegionList(				UInt32						*ioDataSize,
 												AudioFileRegionList			*ioRegionList);
-	                      
+
 	virtual OSStatus SetRegionList(				UInt32						inDataSize,
 												const AudioFileRegionList	*inRegionList);
 
 	virtual OSStatus GetChannelLayoutSize(		UInt32						*outDataSize,
 												UInt32						*isWritable);
-	                      
+
 	virtual OSStatus GetChannelLayout(			UInt32						*ioDataSize,
 												AudioChannelLayout			*ioChannelLayout);
-	                      
+
 	virtual OSStatus SetChannelLayout(			UInt32						inDataSize,
 												const AudioChannelLayout	*inChannelLayout);
 
 
 	virtual OSStatus GetInfoDictionarySize(		UInt32						*outDataSize,
 												UInt32						*isWritable);
-												
+
 	virtual OSStatus GetInfoDictionary(			CACFDictionary  *infoDict);
-												
+
 	virtual OSStatus SetInfoDictionary(			CACFDictionary  *infoDict);
 
 	virtual OSStatus GetSoundCheckDictionarySize(		UInt32						*outDataSize,
 														UInt32						*isWritable) { return kAudioFileUnsupportedPropertyError; }
-														
+
 	virtual OSStatus GetSoundCheckDictionary(	CACFDictionary  *infoDict) { return kAudioFileUnsupportedPropertyError; }
-												
+
 	virtual OSStatus SetSoundCheckDictionary(	CACFDictionary  *infoDict) { return kAudioFileUnsupportedPropertyError; }
-														
+
 	virtual OSStatus GetLoudnessInfo(	CACFDictionary  *infoDict) { return kAudioFileUnsupportedPropertyError; }
-	
+
 	virtual OSStatus GetSoundCheckDictionaryFromLoudnessInfo(CACFDictionary* outInfoDict) { return kAudioFileUnsupportedPropertyError; }
 	virtual OSStatus GetLoudnessInfoFromSoundCheckDictionary(CACFDictionary* outInfoDict) { return kAudioFileUnsupportedPropertyError; }
-	
+
 	virtual OSStatus SetLoudnessInfo(	CACFDictionary  *infoDict) { return kAudioFileUnsupportedPropertyError; }
 
 	virtual OSStatus GetLoudnessInfoSize(				UInt32			*outDataSize,
@@ -491,16 +491,16 @@ public:
 
 	virtual OSStatus CountUserData(			UInt32					inUserDataID,
 											UInt32					*outNumberItems);
-											
+
 	virtual OSStatus GetUserDataSize(		UInt32					inUserDataID,
 											UInt32					inIndex,
 											UInt32					*outDataSize);
-											
+
 	virtual OSStatus GetUserData(			UInt32					inUserDataID,
 											UInt32					inIndex,
 											UInt32					*ioDataSize,
 											void					*ioUserData);
-											
+
 	virtual OSStatus SetUserData(			UInt32					inUserDataID,
 											UInt32					inIndex,
 											UInt32					inDataSize,
@@ -516,14 +516,14 @@ public:
 	Boolean CanWrite() const { return mPermissions & kAudioFileWritePermission; }
 
 	void SetPermissions(SInt8 inPermissions) { mPermissions = inPermissions; }
-		
+
 /* Other Helper Methods: (some may not be necessary depending on how things are refactored) */
-	
+
 	OSStatus OpenFile(SInt8 inPermissions, int inFD);
 
 	OSStatus CreateDataFile (CFURLRef	inFileRef, int	&outFileD);
 
-	OSStatus AddDurationToInfoDictionary(CACFDictionary *infoDict, Float64 &inDuration);	
+	OSStatus AddDurationToInfoDictionary(CACFDictionary *infoDict, Float64 &inDuration);
 
 	virtual Boolean IsDataFormatSupported(const AudioStreamBasicDescription	*inFormat) = 0;
 	virtual Boolean IsDataFormatValid(const AudioStreamBasicDescription	*inFormat);
@@ -535,21 +535,21 @@ public:
 /* Accessors: */
 	Boolean IsInitialized() const { return mIsInitialized; }
 	void SetInitialized(Boolean inFlag) { mIsInitialized = inFlag; }
-			
+
 	DataSource* GetDataSource() const { return mDataSource; }
 	void SetDataSource(DataSource *inDataSource);
-    
+
 	void	SetURL (CFURLRef inURL);
-	
+
     virtual UInt32	GetMaximumPacketSize() { return mMaximumPacketSize; }
     virtual UInt32	FindMaximumPacketSize() { return mMaximumPacketSize; }
     virtual void	SetMaximumPacketSize(const UInt32 inPacketSize) { mMaximumPacketSize = inPacketSize; }
-    	
+
     virtual UInt32	GetPacketSizeUpperBound() { return GetMaximumPacketSize (); }
-    	
-	SInt64 GetDataOffset() const { return mDataOffset; }	
-	void SetDataOffset(SInt64 inOffset) { mDataOffset = inOffset; }	
-    
+
+	SInt64 GetDataOffset() const { return mDataOffset; }
+	void SetDataOffset(SInt64 inOffset) { mDataOffset = inOffset; }
+
 	// I like this idiom better than DoesPacketTableExist+NewPacketTable:
 	CompressedPacketTable* GetPacketTable(Boolean inCreateIt = false)
 	{
@@ -557,35 +557,35 @@ public:
 			mPacketTable = new CompressedPacketTable(mDataFormat.mFramesPerPacket);
 		return mPacketTable;
 	}
-	void ClearPacketTable() 
+	void ClearPacketTable()
 	{
 		DeletePacketTable();
 		GetPacketTable(true);
 	}
-	
-	virtual OSStatus ScanForPackets(SInt64  inToPacketCount, DataSource* inDataSrc = NULL, bool fullyParsedIfEndOfDataReached = true) 
+
+	virtual OSStatus ScanForPackets(SInt64  inToPacketCount, DataSource* inDataSrc = NULL, bool fullyParsedIfEndOfDataReached = true)
 	{
 		// In formats that read packets lazily, this will be overridden to scan for packets up to the index.
 		if (inToPacketCount > GetNumPackets())
 			return kAudioFileEndOfFileError;
-		
-		return noErr; 
+
+		return noErr;
 	}
-		
-    void AppendPacket(const AudioStreamPacketDescription &inPacket) 
+
+    void AppendPacket(const AudioStreamPacketDescription &inPacket)
 		{
 			CompressedPacketTable* packetTable = GetPacketTable(true);
 			UInt32 numFramesInPacket = mDataFormat.mFramesPerPacket ? mDataFormat.mFramesPerPacket : inPacket.mVariableFramesInPacket;
-			
+
 			AudioStreamPacketDescriptionExtended pext;
 			memset(&pext, 0, sizeof(pext));
 			pext.mStartOffset = inPacket.mStartOffset;
 			pext.mDataByteSize = inPacket.mDataByteSize;
 			pext.mVariableFramesInPacket = inPacket.mVariableFramesInPacket;
 			pext.mFrameOffset = numFramesInPacket + (packetTable->size() ? packetTable->back().mFrameOffset : 0);
-			
-			packetTable->push_back(pext); 
-			if (inPacket.mDataByteSize > mMaximumPacketSize) 
+
+			packetTable->push_back(pext);
+			if (inPacket.mDataByteSize > mMaximumPacketSize)
 				mMaximumPacketSize = inPacket.mDataByteSize;
 		}
     void DeletePacketTable() { delete mPacketTable; mPacketTable = NULL;}
@@ -597,9 +597,9 @@ public:
 			{
 				// only get as many packet descriptions as can fit in outPacketDescriptions
 				UInt32	count = *ioDataSize / sizeof(AudioStreamPacketDescription);
-				if (count + inStartingPacket  > GetPacketTableSize()) 
+				if (count + inStartingPacket  > GetPacketTableSize())
 					count = (UInt32)(GetPacketTableSize() - inStartingPacket);
-					
+
 				*ioDataSize = 0;
 				for (UInt32 i = inStartingPacket; i < (count + inStartingPacket); i++)
 				{
@@ -632,7 +632,7 @@ public:
 
 	Boolean GetNeedsSizeUpdate() const { return mNeedsSizeUpdate; }
 	void SetNeedsSizeUpdate(Boolean inNeedsSizeUpdate) { mNeedsSizeUpdate = inNeedsSizeUpdate; }
-	
+
 	CFURLRef GetURL () const { return mFileRef; }
 
 	virtual OSStatus			GetSourceBitDepth(SInt32& outValue) { outValue = 0; return kAudioFileUnsupportedPropertyError; }
@@ -646,7 +646,7 @@ private:
 	void SetAlignDataWithFillerChunks(Boolean inFlag) { mAlignDataWithFillerChunks = inFlag; }
 
 	OSStatus ValidateFormatAndData();
-	
+
 /* debug */
 //	virtual void PrintFile (FILE* inFile, const char *indent) = 0;
 };
diff --git a/libs/appleutility/CoreAudio/AudioFile/AFPublic/CompressedPacketTable.cpp b/libs/appleutility/CoreAudio/AudioFile/AFPublic/CompressedPacketTable.cpp
index ba07580..d2c0890 100644
--- a/libs/appleutility/CoreAudio/AudioFile/AFPublic/CompressedPacketTable.cpp
+++ b/libs/appleutility/CoreAudio/AudioFile/AFPublic/CompressedPacketTable.cpp
@@ -2,14 +2,14 @@
      File: CompressedPacketTable.cpp
  Abstract: CompressedPacketTable.h
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #include "CompressedPacketTable.h"
 #include "CAAutoDisposer.h"
@@ -66,7 +66,7 @@ void CompressedPacketTable::push_back(const AudioStreamPacketDescriptionExtended
 {
 	SInt64 baseIndex = mSize >> kShift;
 	UInt32 packetIndex = (UInt32)(mSize & kMask);
-	
+
 	if (packetIndex == 0) {
 		// first packet in a new sequence. create a new PacketBase.
 		PacketBase newBase;
@@ -75,16 +75,16 @@ void CompressedPacketTable::push_back(const AudioStreamPacketDescriptionExtended
 		newBase.mDescType = kExtendedPacketDescription;
 		mBases.push_back(newBase);
 	}
-	
+
 	PacketBase& base = mBases[(size_t)baseIndex];
 	AudioStreamPacketDescriptionExtended* descs = (AudioStreamPacketDescriptionExtended*)base.mDescs;
 	descs[packetIndex] = inDesc;
-	
+
 	if (packetIndex == kMask) {
 		// last packet in a sequence. compress the sequence.
 		Compress(base);
 	}
-	
+
 	mSize++;
 }
 
@@ -109,13 +109,13 @@ const AudioStreamPacketDescriptionExtended CompressedPacketTable::operator[](SIn
 
 	if ((size_t)baseIndex >= mBases.size())
 		throw -1;
-		
+
 	const PacketBase& base = mBases[(size_t)baseIndex];
-	
+
 	SInt64 packetOffset = 0;
 	UInt32 packetSize = 0;
-		
-	switch (base.mDescType) 
+
+	switch (base.mDescType)
 	{
 		ACCESS_TYPE(Tiny)
 		ACCESS_TYPE(Small)
@@ -123,7 +123,7 @@ const AudioStreamPacketDescriptionExtended CompressedPacketTable::operator[](SIn
 		case kExtendedPacketDescription :
 			return ((AudioStreamPacketDescriptionExtended*)base.mDescs)[packetIndex];
 	}
-	
+
 	AudioStreamPacketDescriptionExtended outDesc;
 	outDesc.mStartOffset = base.mBaseOffset + packetOffset;
 	outDesc.mDataByteSize = packetSize;
@@ -131,14 +131,14 @@ const AudioStreamPacketDescriptionExtended CompressedPacketTable::operator[](SIn
 	outDesc.mFrameOffset = mFramesPerPacket * inPacketIndex;
 
 	//printf("get %d %10qd   %10qd %2d   %10qd %6d %10qd\n", base.mDescType, inPacketIndex, baseIndex, packetIndex, outDesc.mStartOffset, outDesc.mDataByteSize, outDesc.mFrameOffset);
-	
+
 	return outDesc;
 }
 
 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 bool CompressedPacketTable::isContiguous(PacketBase& base)
-{	
+{
 	AudioStreamPacketDescriptionExtended* descs = (AudioStreamPacketDescriptionExtended*)base.mDescs;
 	SInt64 expectedOffset = descs[0].mStartOffset + descs[0].mDataByteSize;
 	for (UInt32 i = 1; i <= kMask; ++i) {
@@ -149,7 +149,7 @@ bool CompressedPacketTable::isContiguous(PacketBase& base)
 }
 
 bool CompressedPacketTable::hasVariableFrames(PacketBase& base)
-{	
+{
 	AudioStreamPacketDescriptionExtended* descs = (AudioStreamPacketDescriptionExtended*)base.mDescs;
 	for (UInt32 i = 0; i <= kMask; ++i) {
 		if (descs[i].mVariableFramesInPacket) return true;
@@ -158,7 +158,7 @@ bool CompressedPacketTable::hasVariableFrames(PacketBase& base)
 }
 
 UInt32 CompressedPacketTable::largestPacket(PacketBase& base)
-{	
+{
 	UInt32 maxPacketSize = 0;
 	AudioStreamPacketDescriptionExtended* descs = (AudioStreamPacketDescriptionExtended*)base.mDescs;
 	for (UInt32 i = 0; i <= kMask; ++i) {
@@ -193,17 +193,17 @@ UInt32 CompressedPacketTable::largestPacket(PacketBase& base)
 
 void CompressedPacketTable::Compress(PacketBase& base)
 {
-	if (hasVariableFrames(base)) 
+	if (hasVariableFrames(base))
 		return;
-	
+
 	bool contiguous = isContiguous(base);
-	
+
 	AudioStreamPacketDescriptionExtended* descs = (AudioStreamPacketDescriptionExtended*)base.mDescs;
 	SInt64 delta = descs[kMask].mStartOffset + descs[kMask].mDataByteSize - descs[0].mStartOffset;
-		
+
 	SInt64 baseOffset = descs[0].mStartOffset;
 	base.mBaseOffset = baseOffset;
-	
+
 	if (delta <= 65535LL) {
 		COMPRESS_TYPE(Tiny, UInt16)
 	} else if (delta <= 4294967295LL && largestPacket(base) <= 65535) {
diff --git a/libs/appleutility/CoreAudio/AudioFile/AFPublic/CompressedPacketTable.h b/libs/appleutility/CoreAudio/AudioFile/AFPublic/CompressedPacketTable.h
index 47e28ca..8ca0ccf 100644
--- a/libs/appleutility/CoreAudio/AudioFile/AFPublic/CompressedPacketTable.h
+++ b/libs/appleutility/CoreAudio/AudioFile/AFPublic/CompressedPacketTable.h
@@ -2,14 +2,14 @@
      File: CompressedPacketTable.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #include <iterator>
 #include <vector>
@@ -72,17 +72,17 @@ class CompressedPacketTable
 public:
 	CompressedPacketTable(UInt32 inFramesPerPacket) : mSize(0), mFramesPerPacket(inFramesPerPacket) {}
 	~CompressedPacketTable();
-	
+
 	SInt64 size() const { return mSize; }
 	void push_back(const AudioStreamPacketDescriptionExtended& inDesc);
-	
+
 	const AudioStreamPacketDescriptionExtended operator[](SInt64 inPacketIndex) const;
 	const AudioStreamPacketDescriptionExtended front() const { return (*this)[0]; }
 	const AudioStreamPacketDescriptionExtended back() const { return (*this)[mSize-1]; }
-	
+
 	//SInt64 PacketForByte(SInt64 inByteOffset) const;
 	SInt64 ByteForPacket(SInt64 inPacketIndex) const { return (*this)[inPacketIndex].mStartOffset; }
-		
+
 	class iterator {
 		public:
 			typedef std::input_iterator_tag iterator_category;
@@ -90,18 +90,18 @@ public:
 			typedef SInt64 difference_type;
 			typedef AudioStreamPacketDescriptionExtended value_type;
 			typedef value_type& reference;
-			
+
 			iterator() : mTable(NULL), mIndex(0) {}
 			iterator(const CompressedPacketTable* table, SInt64 index) : mTable(table), mIndex(index) {}
 			iterator(const iterator& that) : mTable(that.mTable), mIndex(that.mIndex) {}
-			
+
 			iterator& operator=(const iterator& that) { mTable = that.mTable; mIndex = that.mIndex; return *this; }
-			
+
 			const AudioStreamPacketDescriptionExtended operator*() const { return (*mTable)[mIndex]; }
 			const AudioStreamPacketDescriptionExtended* const operator->() { mValue = (*mTable)[mIndex]; return &mValue; }
 			iterator& operator++() { ++mIndex; return *this; }
 			iterator& operator--() { --mIndex; return *this; }
-			
+
 			SInt64 operator-(const iterator& that) { return mIndex - that.mIndex; }
 			const iterator operator-(SInt64 index) { return iterator(mTable, mIndex - index); }
 			const iterator operator+(SInt64 index) { return iterator(mTable, mIndex + index); }
@@ -114,52 +114,52 @@ public:
 			SInt64 mIndex;
 			AudioStreamPacketDescriptionExtended mValue; // in order to support operator-> .
 	};
-	
+
 	iterator begin() const { return iterator(this, 0); }
 	iterator end() const { return iterator(this, mSize); }
-	
+
 private:
 	struct TinyContiguousPacketDescription
 	{
 		UInt16 mNextOffset;
 	};
-	
+
 	struct TinyDiscontiguousPacketDescription : TinyContiguousPacketDescription
 	{
 		UInt16 mDataByteSize;
 	};
-	
-	// There could be a 24 bit packet description. But ALAC is who usually needs SmallContiguousPacketDescription and 
-	// it already uses 8x fewer packet descriptions than AAC due to the mFramesPerPacket being 8x greater. 
+
+	// There could be a 24 bit packet description. But ALAC is who usually needs SmallContiguousPacketDescription and
+	// it already uses 8x fewer packet descriptions than AAC due to the mFramesPerPacket being 8x greater.
 	// So there isn't as great a need for saving space. 4 bytes per packet is OK for ALAC.
-	
+
 	struct SmallContiguousPacketDescription
 	{
 		UInt32 mNextOffset;
 	};
-	
+
 	struct SmallDiscontiguousPacketDescription : SmallContiguousPacketDescription
 	{
 		UInt16 mDataByteSize;
 	};
-	
+
 	struct BigContiguousPacketDescription
 	{
 		UInt64 mNextOffset;
 	};
-	
+
 	struct BigDiscontiguousPacketDescription : BigContiguousPacketDescription
 	{
 		UInt32 mDataByteSize;
 	};
-	
+
 	struct PacketBase
 	{
 		SInt64 mBaseOffset;
 		UInt8 mDescType;
 		void* mDescs;
 	};
-	
+
 	enum {
 		kTinyContiguousPacketDescription,
 		kTinyDiscontiguousPacketDescription,
@@ -171,14 +171,14 @@ private:
 	};
 	static const UInt32 kShift;
 	static const UInt32 kMask;
-	
+
 	bool isContiguous(PacketBase& base);
 	bool hasVariableFrames(PacketBase& base);
 	UInt32 largestPacket(PacketBase& base);
-	
+
 	void Compress(PacketBase& base);
 
-private:	
+private:
 	std::vector<PacketBase> mBases;
 	UInt64 mSize;
 	UInt32 mFramesPerPacket;
diff --git a/libs/appleutility/CoreAudio/AudioFile/AFPublic/DataSource.cpp b/libs/appleutility/CoreAudio/AudioFile/AFPublic/DataSource.cpp
index c8a93d2..9ef9be2 100644
--- a/libs/appleutility/CoreAudio/AudioFile/AFPublic/DataSource.cpp
+++ b/libs/appleutility/CoreAudio/AudioFile/AFPublic/DataSource.cpp
@@ -2,14 +2,14 @@
      File: DataSource.cpp
  Abstract: DataSource.h
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #include "DataSource.h"
 #if TARGET_OS_WIN32
@@ -70,7 +70,7 @@ DataSource::~DataSource()
 {
 }
 
-SInt64 DataSource::CalcOffset(	UInt16 positionMode, 
+SInt64 DataSource::CalcOffset(	UInt16 positionMode,
 								SInt64 positionOffset,
 								SInt64 currentOffset,
 								SInt64 size)
@@ -120,10 +120,10 @@ OSStatus MacFile_DataSource::SetSize(SInt64 inSize)
 
 
 OSStatus MacFile_DataSource::ReadBytes(
-					UInt16 positionMode, 
-					SInt64 positionOffset, 
-					UInt32 requestCount, 
-					void *buffer, 
+					UInt16 positionMode,
+					SInt64 positionOffset,
+					UInt32 requestCount,
+					void *buffer,
 					UInt32* actualCount)
 {
 	if (actualCount) *actualCount = 0;
@@ -135,10 +135,10 @@ OSStatus MacFile_DataSource::ReadBytes(
 }
 
 OSStatus MacFile_DataSource::WriteBytes(
-					UInt16 positionMode, 
-					SInt64 positionOffset, 
-					UInt32 requestCount, 
-					const void *buffer, 
+					UInt16 positionMode,
+					SInt64 positionOffset,
+					UInt32 requestCount,
+					const void *buffer,
 					UInt32* actualCount)
 {
 	if (!buffer) return kAudio_ParamError;
@@ -162,7 +162,7 @@ UnixFile_DataSource::~UnixFile_DataSource()
 {
 	if (mCloseOnDelete) close(mFileD);
 }
-	
+
 OSStatus	UnixFile_DataSource::GetSize(SInt64& outSize)
 {
 #if 0 // 6764274 using the cached file size causes a regression for apps that play a file while writing to it.
@@ -197,31 +197,31 @@ OSStatus	UnixFile_DataSource::GetPos(SInt64& outPos) const
 	return noErr;
 }
 
-SInt64		UnixFile_DataSource::UFCurrentOffset (UInt16	positionMode, 
+SInt64		UnixFile_DataSource::UFCurrentOffset (UInt16	positionMode,
 												SInt64		positionOffset)
 {
 	SInt64 offset = -1;
-	switch (positionMode & kPositionModeMask) 
+	switch (positionMode & kPositionModeMask)
 	{
-		/*case fsAtMark : 
+		/*case fsAtMark :
 		{
 			SInt64 pos;
 			OSStatus result = GetPos (pos);
 				if (result) return result;
-			offset = pos; 
+			offset = pos;
 			break;
 		}*/
 		case SEEK_SET :
 		{
-			offset = positionOffset; 
+			offset = positionOffset;
 			break;
 		}
-		case SEEK_END : 
+		case SEEK_END :
 		{
 			SInt64 size;
 			OSStatus result = GetSize (size);
 				if (result) return result;
-			offset = size + positionOffset; 
+			offset = size + positionOffset;
 			break;
 		}
 		case SEEK_CUR :
@@ -229,23 +229,23 @@ SInt64		UnixFile_DataSource::UFCurrentOffset (UInt16	positionMode,
 			SInt64 pos;
 			OSStatus result = GetPos (pos);
 				if (result) return result;
-			offset = positionOffset + pos; 
+			offset = positionOffset + pos;
 			break;
 		}
 	}
 	return offset;
 }
-	
+
 OSStatus	UnixFile_DataSource::ReadBytes(	UInt16 positionMode,
-								SInt64 positionOffset, 
-								UInt32 requestCount, 
-								void *buffer, 
+								SInt64 positionOffset,
+								UInt32 requestCount,
+								void *buffer,
 								UInt32* actualCount)
 {
 	if (actualCount) *actualCount = 0;
 	if (!buffer) return kAudio_ParamError;
 
-		// can't use current offset as we need to go to the disk too much		
+		// can't use current offset as we need to go to the disk too much
 	SInt64 offset = UFCurrentOffset (positionMode, positionOffset);
 		if (offset < 0) return kAudioFilePositionError;
 
@@ -260,7 +260,7 @@ OSStatus	UnixFile_DataSource::ReadBytes(	UInt16 positionMode,
 		else if (requestCount > remain) requestCount = remain;
 	} while (false);
 #endif
-	
+
 	if (requestCount <= 0) {
 		if (actualCount) *actualCount = 0;
 		return noErr;
@@ -283,20 +283,20 @@ OSStatus	UnixFile_DataSource::ReadBytes(	UInt16 positionMode,
 #endif
 	if (numBytes == -1) return kAudioFilePositionError;
 	mFilePointer = offset + numBytes;
-	
+
 	if (actualCount) *actualCount = (UInt32)numBytes;
 	return noErr;
 }
-						
-OSStatus	UnixFile_DataSource::WriteBytes(UInt16 positionMode, 
-								SInt64 positionOffset, 
-								UInt32 requestCount, 
-								const void *buffer, 
+
+OSStatus	UnixFile_DataSource::WriteBytes(UInt16 positionMode,
+								SInt64 positionOffset,
+								UInt32 requestCount,
+								const void *buffer,
 								UInt32* actualCount)
 {
 	if (!buffer) return kAudio_ParamError;
 
-		// can't use current offset as we need to go to the disk too much		
+		// can't use current offset as we need to go to the disk too much
 	SInt64 offset = UFCurrentOffset (positionMode, positionOffset);
 		if (offset < 0) return kAudioFilePositionError;
 
@@ -320,7 +320,7 @@ OSStatus	UnixFile_DataSource::WriteBytes(UInt16 positionMode,
 #endif
 	if (numBytes == -1) return kAudioFilePositionError;
 	mFilePointer = offset + numBytes;
-	
+
 	if (actualCount) *actualCount = (UInt32)numBytes;
 	return noErr;
 }
@@ -330,50 +330,50 @@ OSStatus	UnixFile_DataSource::WriteBytes(UInt16 positionMode,
 #define NO_CACHE 0
 
 OSStatus Cached_DataSource::ReadFromHeaderCache(
-					SInt64 offset, 
+					SInt64 offset,
 					UInt32 requestCount,
-					void *buffer, 
+					void *buffer,
 					UInt32* actualCount)
 {
 	if (actualCount) *actualCount = 0;
 	OSStatus err = noErr;
 	ByteCount theActualCount = 0;
 
-#if VERBOSE	
+#if VERBOSE
 	printf("read from header %lld %lu   %lld %lu\n", offset, requestCount, 0LL, mHeaderCacheSize);
 #endif
 
-	if (!mHeaderCache()) 
+	if (!mHeaderCache())
 	{
 		mHeaderCache.allocBytes(mHeaderCacheSize, true);
 		err = mDataSource->ReadBytes(SEEK_SET, 0, mHeaderCacheSize, mHeaderCache(), &mHeaderCacheSize);
 		if (err == kAudioFileEndOfFileError) err = noErr;
 		if (err) return err;
 	}
-	
+
 	ByteCount firstPart = std::min((ByteCount)requestCount, (ByteCount)(mHeaderCacheSize - offset));
 	ByteCount secondPart = requestCount - firstPart;
-	
+
 	memcpy(buffer, mHeaderCache + (ByteCount)offset, firstPart);
 	theActualCount = firstPart;
-	
+
 	if (secondPart) {
 		UInt32 secondPartActualCount = 0;
 		err = mDataSource->ReadBytes(SEEK_SET, mHeaderCacheSize, static_cast<UInt32>(secondPart), (char*)buffer + firstPart, &secondPartActualCount);
 		theActualCount += secondPartActualCount;
 	}
-	
+
 	if (actualCount) *actualCount = (UInt32)theActualCount;
 	mOffset = offset + theActualCount;
-	
+
 	return err;
 }
 
 OSStatus Cached_DataSource::ReadBytes(
-					UInt16 positionMode, 
-					SInt64 positionOffset, 
-					UInt32 requestCount, 
-					void *buffer, 
+					UInt16 positionMode,
+					SInt64 positionOffset,
+					UInt32 requestCount,
+					void *buffer,
 					UInt32* actualCount)
 {
 	if (actualCount) *actualCount = 0;
@@ -384,7 +384,7 @@ OSStatus Cached_DataSource::ReadBytes(
 	if (!buffer) return kAudio_ParamError;
 
 	if ((positionMode & kPositionModeMask) != SEEK_END) size = 0; // not used in this case
-	else 
+	else
 	{
 		err = GetSize(size);
 		if (err) return err;
@@ -392,7 +392,7 @@ OSStatus Cached_DataSource::ReadBytes(
 
 	SInt64 offset = CalcOffset(positionMode, positionOffset, mOffset, size);
 	if (offset < 0) return kAudioFilePositionError;
-	
+
 	if (offset < mHeaderCacheSize) {
 		return ReadFromHeaderCache(offset, requestCount, buffer, actualCount);
 	}
@@ -405,10 +405,10 @@ OSStatus Cached_DataSource::ReadBytes(
 	SInt64 cacheEnd = mBodyCacheOffset + mBodyCacheCurSize;
 	if (mBodyCache() && requestCount < mBodyCacheSize && offset >= mBodyCacheOffset && offset < cacheEnd)
 	{
-		if (offset + requestCount <= cacheEnd) 
+		if (offset + requestCount <= cacheEnd)
 		{
 			// request is entirely within cache
-#if VERBOSE	
+#if VERBOSE
 			printf("request is entirely within cache %lld %lu   %lld %lu\n", offset, requestCount, mBodyCacheOffset, mBodyCacheCurSize);
 #endif
 			memcpy(buffer, mBodyCache + (size_t)(offset - mBodyCacheOffset), requestCount);
@@ -417,25 +417,25 @@ OSStatus Cached_DataSource::ReadBytes(
 		else
 		{
 			// part of request is within cache. copy, read next cache block, copy.
-#if VERBOSE	
+#if VERBOSE
 			printf("part of request is within cache %lld %lu   %lld %lu\n", offset, requestCount, mBodyCacheOffset, mBodyCacheCurSize);
 #endif
-			
+
 			// copy first part.
 			ByteCount firstPart = (ByteCount)(cacheEnd - offset);
 			ByteCount secondPart = requestCount - firstPart;
-#if VERBOSE	
-			printf("memcpy   offset %lld  mBodyCacheOffset %lld  offset - mBodyCacheOffset %lld  firstPart %lu   requestCount %lu\n", 
+#if VERBOSE
+			printf("memcpy   offset %lld  mBodyCacheOffset %lld  offset - mBodyCacheOffset %lld  firstPart %lu   requestCount %lu\n",
 						offset, mBodyCacheOffset, offset - mBodyCacheOffset, firstPart, requestCount);
 #endif
 			memcpy(buffer, mBodyCache + (size_t)(offset - mBodyCacheOffset), firstPart);
-			
+
 			theActualCount = static_cast<UInt32>(firstPart);
-			
+
 			// read new block
 			SInt64 nextOffset = mBodyCacheOffset + mBodyCacheCurSize;
 			err = mDataSource->ReadBytes(SEEK_SET, nextOffset, mBodyCacheSize, mBodyCache(), &mBodyCacheCurSize);
-			
+
 			if (err == kAudioFileEndOfFileError) err = noErr;
 			if (err) goto leave;
 
@@ -447,11 +447,11 @@ OSStatus Cached_DataSource::ReadBytes(
 			theActualCount = static_cast<UInt32>(firstPart + secondPart);
 		}
 	}
-	else 
+	else
 	{
 		if (requestCount > mBodyCacheSize)
 		{
-#if VERBOSE	
+#if VERBOSE
 			printf("large request %lld %lu   %lld %lu\n", offset, requestCount, mBodyCacheOffset, mBodyCacheCurSize);
 #endif
 			// the request is larger than we normally cache, just do a read and don't cache.
@@ -461,19 +461,19 @@ OSStatus Cached_DataSource::ReadBytes(
 		else
 		{
 			// request is outside cache. read new block.
-#if VERBOSE	
+#if VERBOSE
 			printf("request is outside cache %lld %lu   %lld %lu\n", offset, requestCount, mBodyCacheOffset, mBodyCacheCurSize);
 #endif
-			if (!mBodyCache()) 
+			if (!mBodyCache())
 			{
 				mBodyCache.allocBytes(mBodyCacheSize, true);
-#if VERBOSE	
+#if VERBOSE
 				printf("alloc mBodyCache %08X\n", mBodyCache());
 #endif
 			}
 			mBodyCacheOffset = offset;
 			err = mDataSource->ReadBytes(SEEK_SET, mBodyCacheOffset, mBodyCacheSize, mBodyCache(), &mBodyCacheCurSize);
-#if VERBOSE	
+#if VERBOSE
 			printf("read %08X %d    mBodyCacheOffset %lld   %lu %lu\n", err, err, mBodyCacheOffset, mBodyCacheSize, mBodyCacheCurSize);
 #endif
 			if (err == kAudioFileEndOfFileError) err = noErr;
@@ -482,32 +482,32 @@ OSStatus Cached_DataSource::ReadBytes(
 			theActualCount = std::min(requestCount, mBodyCacheCurSize);
 			memcpy(buffer, mBodyCache(), theActualCount);
 		}
-		
+
 	}
 
 leave:
 #endif
 	if (actualCount) *actualCount = (UInt32)theActualCount;
-#if VERBOSE	
+#if VERBOSE
 	printf("<<read err %d  actualCount %lu\n", err, *actualCount);
 #endif
 	return err;
 }
 
 OSStatus Cached_DataSource::WriteBytes(
-					UInt16 positionMode, 
-					SInt64 positionOffset, 
-					UInt32 requestCount, 
-					const void *buffer, 
+					UInt16 positionMode,
+					SInt64 positionOffset,
+					UInt32 requestCount,
+					const void *buffer,
 					UInt32* actualCount)
 {
 	OSStatus err = noErr;
 	SInt64 size;
 
 	if (!buffer) return kAudio_ParamError;
-	
+
 	if ((positionMode & kPositionModeMask) != SEEK_END) size = 0; // not used in this case
-	else 
+	else
 	{
 		err = GetSize(size);
 		if (err) return err;
@@ -515,18 +515,18 @@ OSStatus Cached_DataSource::WriteBytes(
 
 	SInt64 offset = CalcOffset(positionMode, positionOffset, mOffset, size);
 	if (offset < 0) return kAudioFilePositionError;
-	
-	if (mHeaderCache() && offset < mHeaderCacheSize) 
+
+	if (mHeaderCache() && offset < mHeaderCacheSize)
 	{
 		// header cache write through
 		ByteCount firstPart = std::min((ByteCount)requestCount, (ByteCount)(mHeaderCacheSize - offset));
-#if VERBOSE	
+#if VERBOSE
 		printf("header cache write through %lu %lu\n", mHeaderCacheSize, firstPart);
 #endif
 		memcpy(mHeaderCache + (size_t)offset, buffer, firstPart);
 	}
-		
-#if VERBOSE	
+
+#if VERBOSE
 	printf("write %lld %lu    %lld %d %lld\n", offset, requestCount, mOffset, positionMode, positionOffset);
 #endif
 
@@ -535,18 +535,18 @@ OSStatus Cached_DataSource::WriteBytes(
 	{
 		// body cache write through
 		ByteCount firstPart = std::min((SInt64)requestCount, cacheEnd - offset);
-#if VERBOSE	
+#if VERBOSE
 		printf("body cache write through %lld %lu  %lld %lu\n", mBodyCacheOffset, mBodyCacheCurSize, offset, firstPart);
 #endif
 		memcpy(mBodyCache + (offset - mBodyCacheOffset), buffer, firstPart);
 	}
-	
+
 	UInt32 theActualCount;
 	err = mDataSource->WriteBytes(positionMode, positionOffset, requestCount, buffer, &theActualCount);
-	
+
 	mOffset = offset + theActualCount;
 	if (actualCount) *actualCount = (UInt32)theActualCount;
-	
+
 	return err;
 }
 
@@ -555,11 +555,11 @@ OSStatus Cached_DataSource::WriteBytes(
 //////////////////////////////////////////////////////////////////////////////////////////
 
 Seekable_DataSource::Seekable_DataSource(	void * inClientData,
-							AudioFile_ReadProc					inReadFunc, 
-							AudioFile_WriteProc					inWriteFunc, 
+							AudioFile_ReadProc					inReadFunc,
+							AudioFile_WriteProc					inWriteFunc,
 							AudioFile_GetSizeProc				inGetSizeFunc,
 							AudioFile_SetSizeProc				inSetSizeFunc)
-	: DataSource(false), mClientData(inClientData), mReadFunc(inReadFunc), mWriteFunc(inWriteFunc), 
+	: DataSource(false), mClientData(inClientData), mReadFunc(inReadFunc), mWriteFunc(inWriteFunc),
 		mSizeFunc(inGetSizeFunc), mSetSizeFunc(inSetSizeFunc)
 {
 }
@@ -585,15 +585,15 @@ OSStatus Seekable_DataSource::SetSize(SInt64 inSize)
 	return (*mSetSizeFunc)(mClientData, inSize);
 }
 
-OSStatus Seekable_DataSource::ReadBytes(	
-							UInt16 positionMode, 
-							SInt64 positionOffset, 
-							UInt32 requestCount, 
-							void *buffer, 
+OSStatus Seekable_DataSource::ReadBytes(
+							UInt16 positionMode,
+							SInt64 positionOffset,
+							UInt32 requestCount,
+							void *buffer,
 							UInt32* actualCount)
 {
 	OSStatus err;
-	
+
 	if (actualCount) *actualCount = 0;
 	if (!mReadFunc) return kAudioFileOperationNotSupportedError;
 	if (!buffer) return kAudio_ParamError;
@@ -605,16 +605,16 @@ OSStatus Seekable_DataSource::ReadBytes(
 	if (err) return err;
 
 	SInt64 offset = CalcOffset(positionMode, positionOffset, mOffset, size);
-	
+
 	// request is outside bounds of file
-	if (offset < 0) 
+	if (offset < 0)
 		return kAudioFilePositionError;
-	if (offset >= size) 
+	if (offset >= size)
 		return kAudioFileEndOfFileError;
-	
+
 	// reduce request if it exceeds the amount available
 	requestCount = static_cast<UInt32>(std::min((SInt64)requestCount, size - offset));
-	
+
 	UInt32 theActualCount = 0;
 	err = (*mReadFunc)(mClientData, offset, requestCount, buffer, &theActualCount);
 	if (actualCount) *actualCount = theActualCount;
@@ -622,23 +622,23 @@ OSStatus Seekable_DataSource::ReadBytes(
 	return err;
 }
 
-					
+
 OSStatus Seekable_DataSource::WriteBytes(
-							UInt16 positionMode, 
-							SInt64 positionOffset, 
-							UInt32 requestCount, 
-							const void *buffer, 
+							UInt16 positionMode,
+							SInt64 positionOffset,
+							UInt32 requestCount,
+							const void *buffer,
 							UInt32* actualCount)
 {
 	OSStatus err;
-	
+
 	if (!mWriteFunc) return kAudioFileOperationNotSupportedError;
 	if (!buffer) return kAudio_ParamError;
 
 	SInt64 size;
 	positionMode &= kPositionModeMask;
 	if (positionMode != SEEK_END) size = 0; // not used in this case
-	else 
+	else
 	{
 		err = GetSize(size);
 		if (err) return err;
@@ -646,7 +646,7 @@ OSStatus Seekable_DataSource::WriteBytes(
 
 	SInt64 offset = CalcOffset(positionMode, positionOffset, mOffset, size);
 	if (offset < 0) return kAudioFilePositionError;
-	
+
 	UInt32 theActualCount;
 	err = (*mWriteFunc)(mClientData, offset, requestCount, buffer, &theActualCount);
 	if (err) return err;
@@ -658,16 +658,16 @@ OSStatus Seekable_DataSource::WriteBytes(
 //////////////////////////////////////////////////////////////////////////////////////////
 
 OSStatus Buffer_DataSource::ReadBytes(
-								UInt16 positionMode, 
-								SInt64 positionOffset, 
-								UInt32 requestCount, 
-								void *buffer, 
+								UInt16 positionMode,
+								SInt64 positionOffset,
+								UInt32 requestCount,
+								void *buffer,
 								UInt32* actualCount)
 {
 	if (actualCount) *actualCount = 0;
-	SInt64 offsetWithinBuffer = CalcOffset(positionMode, positionOffset, mOffset, mDataByteSize + mStartOffset) - mStartOffset;		
+	SInt64 offsetWithinBuffer = CalcOffset(positionMode, positionOffset, mOffset, mDataByteSize + mStartOffset) - mStartOffset;
 	if (offsetWithinBuffer < 0 || offsetWithinBuffer >= mDataByteSize) return kAudioFilePositionError;
-	
+
 	SInt64 bytesAfterOffset = mDataByteSize - offsetWithinBuffer;
 	SInt64 theActualCount = std::min(bytesAfterOffset, (SInt64)requestCount);
 
@@ -677,7 +677,7 @@ OSStatus Buffer_DataSource::ReadBytes(
 	}
 
 	memcpy(buffer, mData + offsetWithinBuffer, theActualCount);
-	
+
 	if (actualCount) *actualCount = static_cast<UInt32>(theActualCount);
 	mOffset = offsetWithinBuffer + theActualCount;
 
diff --git a/libs/appleutility/CoreAudio/AudioFile/AFPublic/DataSource.h b/libs/appleutility/CoreAudio/AudioFile/AFPublic/DataSource.h
index 6c79c94..916ae07 100644
--- a/libs/appleutility/CoreAudio/AudioFile/AFPublic/DataSource.h
+++ b/libs/appleutility/CoreAudio/AudioFile/AFPublic/DataSource.h
@@ -2,14 +2,14 @@
      File: DataSource.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #ifndef __DataSource_h__
 #define __DataSource_h__
@@ -63,10 +63,10 @@
 class DataSource
 {
 public:
-	
+
 	DataSource(Boolean inCloseOnDelete);
 	virtual ~DataSource();
-		
+
 	virtual OSStatus GetSize32(UInt32& outSize)
 	{
 		SInt64 size64;
@@ -76,43 +76,43 @@ public:
 		outSize = (UInt32)size64;
 		return noErr;
 	}
-	
+
 	virtual OSStatus GetSize(SInt64& outSize) =0;
-	
+
 	virtual OSStatus SetSize(SInt64 inSize)=0;
-	
-	virtual OSStatus GetPos(SInt64& outPos) const=0; 
-	
-	/* non seekable data sources should use fsAtMark for the positionMode (or SEEK_CUR with offset zero, 
-		or SEEK_SET with offset equal to the current position in the stream, in other words no seeking from the 
+
+	virtual OSStatus GetPos(SInt64& outPos) const=0;
+
+	/* non seekable data sources should use fsAtMark for the positionMode (or SEEK_CUR with offset zero,
+		or SEEK_SET with offset equal to the current position in the stream, in other words no seeking from the
 		current position is allowed.)
 	*/
-	
-	virtual OSStatus ReadBytes(	UInt16 positionMode, 
-								SInt64 positionOffset, 
-								UInt32 requestCount, 
-								void *buffer, 
+
+	virtual OSStatus ReadBytes(	UInt16 positionMode,
+								SInt64 positionOffset,
+								UInt32 requestCount,
+								void *buffer,
 								UInt32* actualCount)=0;
-						
-	virtual OSStatus WriteBytes(UInt16 positionMode, 
-								SInt64 positionOffset, 
-								UInt32 requestCount, 
-								const void *buffer, 
+
+	virtual OSStatus WriteBytes(UInt16 positionMode,
+								SInt64 positionOffset,
+								UInt32 requestCount,
+								const void *buffer,
 								UInt32* actualCount)=0;
-	
+
 	virtual void SetCloseOnDelete(Boolean inFlag) { mCloseOnDelete = inFlag; }
-	
+
 	virtual Boolean CanSeek() const=0;
 	virtual Boolean CanGetSize() const=0;
 	virtual Boolean CanSetSize() const=0;
 	virtual Boolean CanRead() const=0;
 	virtual Boolean CanWrite() const=0;
-	
+
 protected:
 	Boolean mCloseOnDelete;
-	
+
 	/* utility method */
-	SInt64 CalcOffset(	UInt16 positionMode, 
+	SInt64 CalcOffset(	UInt16 positionMode,
 						SInt64 positionOffset,
 						SInt64 currentOffset,
 						SInt64 size);
@@ -131,33 +131,33 @@ class MacFile_DataSource : public DataSource
 {
 	FSIORefNum mFileNum;
 	SInt8 mPermissions;
-	
+
 public:
 
 	MacFile_DataSource(	FSIORefNum inForkRefNum, SInt8 inPermissions, Boolean inCloseOnDelete);
 	virtual ~MacFile_DataSource();
-	
+
 	virtual OSStatus GetSize(SInt64& outSize);
-	virtual OSStatus GetPos(SInt64& outPos) const; 
-	
+	virtual OSStatus GetPos(SInt64& outPos) const;
+
 	virtual OSStatus SetSize(SInt64 inSize);
-	
-	virtual OSStatus ReadBytes(	UInt16 positionMode, 
-								SInt64 positionOffset, 
-								UInt32 requestCount, 
-								void *buffer, 
+
+	virtual OSStatus ReadBytes(	UInt16 positionMode,
+								SInt64 positionOffset,
+								UInt32 requestCount,
+								void *buffer,
 								UInt32* actualCount);
-						
-	virtual OSStatus WriteBytes(UInt16 positionMode, 
-								SInt64 positionOffset, 
-								UInt32 requestCount, 
-								const void *buffer, 
+
+	virtual OSStatus WriteBytes(UInt16 positionMode,
+								SInt64 positionOffset,
+								UInt32 requestCount,
+								const void *buffer,
 								UInt32* actualCount);
-	
+
 	virtual Boolean CanSeek() const { return true; }
 	virtual Boolean CanGetSize() const { return true; }
 	virtual Boolean CanSetSize() const { return true; }
-	
+
 	virtual Boolean CanRead() const { return mPermissions & kAudioFileReadPermission; }
 	virtual Boolean CanWrite() const { return mPermissions & kAudioFileWritePermission; }
 };
@@ -171,39 +171,39 @@ class UnixFile_DataSource : public DataSource
 	UInt32 mNoCache;
 	SInt64 mCachedSize;
 	SInt64 mFilePointer;
-	
+
 public:
 
 	UnixFile_DataSource( int inFD, SInt8 inPermissions, Boolean inCloseOnDelete);
 	virtual ~UnixFile_DataSource();
-	
+
 	virtual OSStatus GetSize(SInt64& outSize);
-	virtual OSStatus GetPos(SInt64& outPos) const; 
-	
+	virtual OSStatus GetPos(SInt64& outPos) const;
+
 	virtual OSStatus SetSize(SInt64 inSize);
-	
-	virtual OSStatus ReadBytes(	UInt16 positionMode, 
-								SInt64 positionOffset, 
-								UInt32 requestCount, 
-								void *buffer, 
+
+	virtual OSStatus ReadBytes(	UInt16 positionMode,
+								SInt64 positionOffset,
+								UInt32 requestCount,
+								void *buffer,
 								UInt32* actualCount);
-						
-	virtual OSStatus WriteBytes(UInt16 positionMode, 
-								SInt64 positionOffset, 
-								UInt32 requestCount, 
-								const void *buffer, 
+
+	virtual OSStatus WriteBytes(UInt16 positionMode,
+								SInt64 positionOffset,
+								UInt32 requestCount,
+								const void *buffer,
 								UInt32* actualCount);
-	
+
 	virtual Boolean CanSeek() const { return true; }
 	virtual Boolean CanGetSize() const { return true; }
 	virtual Boolean CanSetSize() const { return true; }
-	
+
 	virtual Boolean CanRead() const { return mPermissions & kAudioFileReadPermission; }
 	virtual Boolean CanWrite() const { return mPermissions & kAudioFileWritePermission; }
 
 private:
 
-	SInt64	UFCurrentOffset (UInt16		positionMode, 
+	SInt64	UFCurrentOffset (UInt16		positionMode,
 							SInt64		positionOffset);
 };
 
@@ -225,50 +225,50 @@ class Cached_DataSource : public DataSource
 	SInt64 mBodyCacheOffset;
 	SInt64 mOffset;
 	Boolean mOwnDataSource;
-	
+
 public:
 
 	Cached_DataSource(DataSource* inDataSource, UInt32 inHeaderCacheSize = 4096, UInt32 inBodyCacheSize = 32768, Boolean inOwnDataSource = true)
-					: DataSource(false), 
-					mDataSource(inDataSource), mHeaderCacheSize(inHeaderCacheSize), 
-					mBodyCacheSize(inBodyCacheSize), mBodyCacheCurSize(0), mBodyCacheOffset(-1), 
+					: DataSource(false),
+					mDataSource(inDataSource), mHeaderCacheSize(inHeaderCacheSize),
+					mBodyCacheSize(inBodyCacheSize), mBodyCacheCurSize(0), mBodyCacheOffset(-1),
 					mOffset(0),
 					mOwnDataSource(inOwnDataSource)
 				{
 				}
-				
+
 	virtual ~Cached_DataSource()
 				{
 					if (mOwnDataSource) delete mDataSource;
 				}
 
-	
+
 	virtual OSStatus GetSize(SInt64& outSize) { return mDataSource->GetSize(outSize); }
-	virtual OSStatus GetPos(SInt64& outPos) const { return mDataSource->GetPos(outPos); } 
-	
+	virtual OSStatus GetPos(SInt64& outPos) const { return mDataSource->GetPos(outPos); }
+
 	virtual OSStatus SetSize(SInt64 inSize) { return mDataSource->SetSize(inSize); }
-	
-	virtual OSStatus ReadBytes(		UInt16 positionMode, 
-									SInt64 positionOffset, 
-									UInt32 requestCount, 
-									void *buffer, 
+
+	virtual OSStatus ReadBytes(		UInt16 positionMode,
+									SInt64 positionOffset,
+									UInt32 requestCount,
+									void *buffer,
 									UInt32* actualCount);
-						
-	virtual OSStatus WriteBytes(	UInt16 positionMode, 
-									SInt64 positionOffset, 
-									UInt32 requestCount, 
-									const void *buffer, 
+
+	virtual OSStatus WriteBytes(	UInt16 positionMode,
+									SInt64 positionOffset,
+									UInt32 requestCount,
+									const void *buffer,
 									UInt32* actualCount);
-	
-	OSStatus ReadFromHeaderCache(	SInt64 offset, 
+
+	OSStatus ReadFromHeaderCache(	SInt64 offset,
 									UInt32 requestCount,
-									void *buffer, 
+									void *buffer,
 									UInt32* actualCount);
-	
+
 	virtual Boolean CanSeek() const { return mDataSource->CanSeek(); }
 	virtual Boolean CanGetSize() const { return mDataSource->CanGetSize(); }
 	virtual Boolean CanSetSize() const { return mDataSource->CanSetSize(); }
-	
+
 	virtual Boolean CanRead() const { return mDataSource->CanRead(); }
 	virtual Boolean CanWrite() const { return mDataSource->CanWrite(); }
 };
@@ -286,37 +286,37 @@ class Seekable_DataSource : public DataSource
 {
 	void * mClientData;
 	SInt64 mOffset;
-	
+
 	AudioFile_ReadProc mReadFunc;
 	AudioFile_WriteProc mWriteFunc;
 	AudioFile_GetSizeProc mSizeFunc;
 	AudioFile_SetSizeProc mSetSizeFunc;
-	
+
 public:
 	Seekable_DataSource(	void * 								inClientData,
-							AudioFile_ReadProc					inReadFunc, 
-							AudioFile_WriteProc					inWriteFunc, 
+							AudioFile_ReadProc					inReadFunc,
+							AudioFile_WriteProc					inWriteFunc,
 							AudioFile_GetSizeProc				inGetSizeFunc,
 							AudioFile_SetSizeProc				inSetSizeFunc
 					);
-	
+
 	virtual ~Seekable_DataSource();
-	
+
 	virtual OSStatus GetSize(SInt64& outSize);
-	virtual OSStatus GetPos(SInt64& outPos) const { outPos = mOffset; return noErr; }; 
-	
+	virtual OSStatus GetPos(SInt64& outPos) const { outPos = mOffset; return noErr; };
+
 	virtual OSStatus SetSize(SInt64 inSize);
-	
-	virtual OSStatus ReadBytes(	UInt16 positionMode, 
-								SInt64 positionOffset, 
-								UInt32 requestCount, 
-								void *buffer, 
+
+	virtual OSStatus ReadBytes(	UInt16 positionMode,
+								SInt64 positionOffset,
+								UInt32 requestCount,
+								void *buffer,
 								UInt32* actualCount);
-						
-	virtual OSStatus WriteBytes(UInt16 positionMode, 
-								SInt64 positionOffset, 
-								UInt32 requestCount, 
-								const void *buffer, 
+
+	virtual OSStatus WriteBytes(UInt16 positionMode,
+								SInt64 positionOffset,
+								UInt32 requestCount,
+								const void *buffer,
 								UInt32* actualCount);
 
 	virtual Boolean CanSeek() const { return true; }
@@ -340,24 +340,24 @@ public:
 						const void *	inData,
 						SInt64			inStartOffset = 0
 					) : DataSource(false), mDataByteSize(inDataByteSize), mData((const char*)inData), mStartOffset(inStartOffset), mOffset(mStartOffset) {}
-	
+
 	virtual ~Buffer_DataSource() {}
-	
+
 	virtual OSStatus GetSize(SInt64& outSize) { outSize = mDataByteSize + mStartOffset; return noErr; }
-	virtual OSStatus GetPos(SInt64& outPos) const { outPos = mOffset; return noErr; }; 
-	
+	virtual OSStatus GetPos(SInt64& outPos) const { outPos = mOffset; return noErr; };
+
 	virtual OSStatus SetSize(SInt64 inSize) { throw std::runtime_error("not writable"); }
-	
-	virtual OSStatus ReadBytes(	UInt16 positionMode, 
-								SInt64 positionOffset, 
-								UInt32 requestCount, 
-								void *buffer, 
+
+	virtual OSStatus ReadBytes(	UInt16 positionMode,
+								SInt64 positionOffset,
+								UInt32 requestCount,
+								void *buffer,
 								UInt32* actualCount);
-						
-	virtual OSStatus WriteBytes(UInt16 positionMode, 
-								SInt64 positionOffset, 
-								UInt32 requestCount, 
-								const void *buffer, 
+
+	virtual OSStatus WriteBytes(UInt16 positionMode,
+								SInt64 positionOffset,
+								UInt32 requestCount,
+								const void *buffer,
 								UInt32* actualCount) { throw std::runtime_error("not writable"); }
 
 	virtual Boolean CanSeek() const { return true; }
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUBase.cpp b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUBase.cpp
index 612bc4d..c77322d 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUBase.cpp
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUBase.cpp
@@ -2,14 +2,14 @@
      File: AUBase.cpp
  Abstract: AUBase.h
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #include "AUBase.h"
 #include "AUDispatch.h"
@@ -88,7 +88,7 @@ SInt32 AUBase::sVectorUnitType = kVecUninitialized;
 
 //_____________________________________________________________________________
 //
-AUBase::AUBase(	AudioComponentInstance			inInstance, 
+AUBase::AUBase(	AudioComponentInstance			inInstance,
 				UInt32							numInputElements,
 				UInt32							numOutputElements,
 				UInt32							numGroupElements) :
@@ -96,7 +96,7 @@ AUBase::AUBase(	AudioComponentInstance			inInstance,
 	mElementsCreated(false),
 	mInitialized(false),
 	mHasBegunInitializing(false),
-	mInitNumInputEls(numInputElements), mInitNumOutputEls(numOutputElements), 
+	mInitNumInputEls(numInputElements), mInitNumOutputEls(numOutputElements),
 #if !CA_BASIC_AU_FEATURES
 	mInitNumGroupEls(numGroupElements),
 #endif
@@ -115,7 +115,7 @@ AUBase::AUBase(	AudioComponentInstance			inInstance,
 	#endif
 {
 	ResetRenderTime ();
-	
+
 	if(!sAUBaseCFStringsInitialized)
 	{
 		kUntitledString = CFSTR("Untitled");
@@ -137,11 +137,11 @@ AUBase::AUBase(	AudioComponentInstance			inInstance,
 	}
 
 	mAudioUnitAPIVersion = 2;
-	
+
 	SetMaxFramesPerSlice(kAUDefaultMaxFramesPerSlice);
 
 	GlobalScope().Initialize(this, kAudioUnitScope_Global, 1);
-	
+
 #if !CA_NO_AU_UI_FEATURES
 	memset (&mHostCallbackInfo, 0, sizeof (mHostCallbackInfo));
 #endif
@@ -175,7 +175,7 @@ void	AUBase::CreateElements()
 		Groups().Initialize(this, kAudioUnitScope_Group, mInitNumGroupEls);
 #endif
 		CreateExtendedElements();
-		
+
 		mElementsCreated = true;
 	}
 }
@@ -202,7 +202,7 @@ OSStatus			AUBase::CanSetMaxFrames() const
 void				AUBase::ReallocateBuffers()
 {
 	CreateElements();
-	
+
 	UInt32 nOutputs = Outputs().GetNumberOfElements();
 	for (UInt32 i = 0; i < nOutputs; ++i) {
 		AUOutputElement *output = GetOutput(i);
@@ -241,7 +241,7 @@ void				AUBase::DeallocateIOBuffers()
 OSStatus			AUBase::DoInitialize()
 {
 	OSStatus result = noErr;
-	
+
 	if (!mInitialized) {
 		result = Initialize();
 		if (result == noErr) {
@@ -279,7 +279,7 @@ void				AUBase::DoCleanup()
 {
 	if (mInitialized)
 		Cleanup();
-	
+
 	DeallocateIOBuffers();
 	ResetRenderTime ();
 
@@ -312,22 +312,22 @@ OSStatus			AUBase::DispatchGetPropertyInfo(AudioUnitPropertyID				inID,
 {
 	OSStatus result = noErr;
 	bool validateElement = true;
-	
+
 	switch (inID) {
 	case kAudioUnitProperty_MakeConnection:
 		ca_require(inScope == kAudioUnitScope_Input || inScope == kAudioUnitScope_Global, InvalidScope);
 		outDataSize = sizeof(AudioUnitConnection);
 		outWritable = true;
 		break;
-		
-		
+
+
 	case kAudioUnitProperty_SetRenderCallback:
 		ca_require(AudioUnitAPIVersion() > 1, InvalidProperty);
 		ca_require(inScope == kAudioUnitScope_Input || inScope == kAudioUnitScope_Global, InvalidScope);
 		outDataSize = sizeof(AURenderCallbackStruct);
 		outWritable = true;
 		break;
-		
+
 	case kAudioUnitProperty_StreamFormat:
 		outDataSize = sizeof(CAStreamBasicDescription);
 		outWritable = IsStreamFormatWritable(inScope, inElement);
@@ -352,7 +352,7 @@ OSStatus			AUBase::DispatchGetPropertyInfo(AudioUnitPropertyID				inID,
 			outWritable = false;
 		}
 		break;
-		
+
 	case kAudioUnitProperty_PresentPreset:
 #if !CA_USE_AUDIO_PLUGIN_ONLY
 #ifndef __LP64__
@@ -363,23 +363,23 @@ OSStatus			AUBase::DispatchGetPropertyInfo(AudioUnitPropertyID				inID,
 		outDataSize = sizeof(AUPreset);
 		outWritable = true;
 		break;
-	
+
 	case kAudioUnitProperty_ElementName:
 		outDataSize = sizeof (CFStringRef);
 		outWritable = true;
 		break;
-	
+
 	case kAudioUnitProperty_ParameterList:
 		{
 			UInt32 nparams = 0;
 			result = GetParameterList(inScope, NULL, nparams);
-			
+
 			outDataSize = sizeof(AudioUnitParameterID) * nparams;
 			outWritable = false;
 			validateElement = false;
 		}
 		break;
-		
+
 	case kAudioUnitProperty_ParameterInfo:
 		outDataSize = sizeof(AudioUnitParameterInfo);
 		outWritable = false;
@@ -397,13 +397,13 @@ OSStatus			AUBase::DispatchGetPropertyInfo(AudioUnitPropertyID				inID,
 		outWritable = BusCountWritable(inScope);
 		validateElement = false;
 		break;
-	
+
 	case kAudioUnitProperty_Latency:
 		ca_require(inScope == kAudioUnitScope_Global, InvalidScope);
 		outDataSize = sizeof(Float64);
 		outWritable = false;
 		break;
-	
+
 	case kAudioUnitProperty_TailTime:
 		ca_require(inScope == kAudioUnitScope_Global, InvalidScope);
 		if (SupportsTail()) {
@@ -412,19 +412,19 @@ OSStatus			AUBase::DispatchGetPropertyInfo(AudioUnitPropertyID				inID,
 		} else
 			goto InvalidProperty;
 		break;
-	
+
 	case kAudioUnitProperty_MaximumFramesPerSlice:
 		ca_require(inScope == kAudioUnitScope_Global, InvalidScope);
 		outDataSize = sizeof(UInt32);
 		outWritable = true;
 		break;
-	
+
 	case kAudioUnitProperty_LastRenderError:
 		ca_require(inScope == kAudioUnitScope_Global, InvalidScope);
 		outDataSize = sizeof(OSStatus);
 		outWritable = false;
 		break;
-		
+
 	case kAudioUnitProperty_SupportedNumChannels:
 	{
 		ca_require(inScope == kAudioUnitScope_Global, InvalidScope);
@@ -437,7 +437,7 @@ OSStatus			AUBase::DispatchGetPropertyInfo(AudioUnitPropertyID				inID,
 		outWritable = false;
 		break;
 	}
-	
+
 	case kAudioUnitProperty_SupportedChannelLayoutTags:
 	{
 		UInt32 numLayouts = GetChannelLayoutTags(inScope, inElement, NULL);
@@ -450,7 +450,7 @@ OSStatus			AUBase::DispatchGetPropertyInfo(AudioUnitPropertyID				inID,
 		validateElement = false; //already done it
 		break;
 	}
-	
+
 	case kAudioUnitProperty_AudioChannelLayout:
 	{
 		outWritable = false;
@@ -490,11 +490,11 @@ OSStatus			AUBase::DispatchGetPropertyInfo(AudioUnitPropertyID				inID,
 		if (outDataSize == 0)
 			goto InvalidProperty;
 		outDataSize *= sizeof (AudioComponentDescription);
-		
+
 		outWritable = false;
 		break;
 #endif
-	
+
 	case kAudioUnitProperty_ParameterValueStrings:
 		result = GetParameterValueStrings(inScope, inElement, NULL);
 		if (result == noErr) {
@@ -517,7 +517,7 @@ OSStatus			AUBase::DispatchGetPropertyInfo(AudioUnitPropertyID				inID,
 		outDataSize = sizeof(CFStringRef);
 		outWritable = true;
 		break;
-	
+
 	case kAudioUnitProperty_IconLocation:
 		ca_require(inScope == kAudioUnitScope_Global, InvalidScope);
 		outWritable = false;
@@ -537,7 +537,7 @@ OSStatus			AUBase::DispatchGetPropertyInfo(AudioUnitPropertyID				inID,
 		outDataSize = sizeof(Float64);
 		outWritable = false;
 		break;
-	
+
     case kAudioUnitProperty_NickName:
         ca_require(inScope == kAudioUnitScope_Global, InvalidScope);
         outDataSize = sizeof(CFStringRef);
@@ -551,9 +551,9 @@ OSStatus			AUBase::DispatchGetPropertyInfo(AudioUnitPropertyID				inID,
 	}
 
 	if (result == noErr && validateElement) {
-		ca_require(GetElement(inScope, inElement) != NULL, InvalidElement);	
+		ca_require(GetElement(inScope, inElement) != NULL, InvalidElement);
 	}
-	
+
 	return result;
 InvalidProperty:
 	return kAudioUnitErr_InvalidProperty;
@@ -579,11 +579,11 @@ OSStatus			AUBase::DispatchGetProperty(	AudioUnitPropertyID 			inID,
 	case kAudioUnitProperty_StreamFormat:
 		*(CAStreamBasicDescription *)outData = GetStreamFormat(inScope, inElement);
 		break;
-	
+
 	case kAudioUnitProperty_SampleRate:
 		*(Float64 *)outData = GetStreamFormat(inScope, inElement).mSampleRate;
 		break;
-	
+
 	case kAudioUnitProperty_ParameterList:
 		{
 			UInt32 nparams = 0;
@@ -615,7 +615,7 @@ OSStatus			AUBase::DispatchGetProperty(	AudioUnitPropertyID 			inID,
 			result = GetPresets ((CFArrayRef *)outData);
 		}
 		break;
-	
+
 	case kAudioUnitProperty_PresentPreset:
 #if !CA_USE_AUDIO_PLUGIN_ONLY
 #ifndef __LP64__
@@ -624,15 +624,15 @@ OSStatus			AUBase::DispatchGetProperty(	AudioUnitPropertyID 			inID,
 #endif
 		{
 			*(AUPreset *)outData = mCurrentPreset;
-				
+
 				// retain current string (as client owns a reference to it and will release it)
-			if (inID == kAudioUnitProperty_PresentPreset && mCurrentPreset.presetName) 
+			if (inID == kAudioUnitProperty_PresentPreset && mCurrentPreset.presetName)
 				CFRetain (mCurrentPreset.presetName);
 
 			result = noErr;
 		}
 		break;
-	
+
 	case kAudioUnitProperty_ElementName:
 		{
 			AUElement * element = GetElement(inScope, inElement);
@@ -648,7 +648,7 @@ OSStatus			AUBase::DispatchGetProperty(	AudioUnitPropertyID 			inID,
 	case kAudioUnitProperty_ElementCount:
 		*(UInt32 *)outData = GetScope(inScope).GetNumberOfElements();
 		break;
-	
+
 	case kAudioUnitProperty_Latency:
 		*(Float64 *)outData = GetLatency();
 		break;
@@ -659,7 +659,7 @@ OSStatus			AUBase::DispatchGetProperty(	AudioUnitPropertyID 			inID,
 		else
 			result = kAudioUnitErr_InvalidProperty;
 		break;
-	
+
 	case kAudioUnitProperty_MaximumFramesPerSlice:
 		*(UInt32 *)outData = mMaxFramesPerSlice;
 		break;
@@ -686,9 +686,9 @@ OSStatus			AUBase::DispatchGetProperty(	AudioUnitPropertyID 			inID,
 				result = kAudioUnitErr_InvalidProperty;
 		}
 		break;
-		
+
 	case kAudioUnitProperty_AudioChannelLayout:
-	{	
+	{
 		AudioChannelLayout* ptr = outData ? static_cast<AudioChannelLayout*>(outData) : NULL;
 		Boolean writable;
 		UInt32 dataSize = GetAudioChannelLayout(inScope, inElement, ptr, writable);
@@ -710,7 +710,7 @@ OSStatus			AUBase::DispatchGetProperty(	AudioUnitPropertyID 			inID,
  	case kAudioUnitProperty_ParameterValueStrings:
 		result = GetParameterValueStrings(inScope, inElement, (CFArrayRef *)outData);
 		break;
-		
+
 #if !CA_USE_AUDIO_PLUGIN_ONLY
 	case kAudioUnitProperty_FastDispatch:
 		if (!IsCMgrObject()) result = kAudioUnitErr_InvalidProperty;
@@ -765,21 +765,21 @@ OSStatus			AUBase::DispatchGetProperty(	AudioUnitPropertyID 			inID,
 			result = kAudioUnitErr_InvalidPropertyValue;
 		}
 		break;
-		
+
 	case kAudioUnitProperty_ParameterClumpName:
 		{
 			AudioUnitParameterNameInfo * ioClumpInfo = (AudioUnitParameterNameInfo*) outData;
 			if (ioClumpInfo->inID == kAudioUnitClumpID_System)	// this ID value is reserved
 				result = kAudioUnitErr_InvalidPropertyValue;
-			else 
+			else
 			{
 				result = CopyClumpName(inScope, ioClumpInfo->inID, ioClumpInfo->inDesiredLength, &ioClumpInfo->outName);
-					
+
 					// this is provided for compatbility with existing implementations that don't know
 					// about this new mechanism
 				if (result == kAudioUnitErr_InvalidProperty)
 					result = GetProperty (inID, inScope, inElement, outData);
-			}	
+			}
 		}
 		break;
 
@@ -794,7 +794,7 @@ OSStatus			AUBase::DispatchGetProperty(	AudioUnitPropertyID 			inID,
         if (mNickName) CFRetain(mNickName);
         *(CFStringRef*)outData = mNickName;
         break;
-            
+
 	default:
 		result = GetProperty(inID, inScope, inElement, outData);
 		break;
@@ -822,7 +822,7 @@ OSStatus			AUBase::DispatchSetProperty(	AudioUnitPropertyID 			inID,
 		}
 		break;
 
-		
+
 	case kAudioUnitProperty_SetRenderCallback:
 		{
 			ca_require(inDataSize >= sizeof(AURenderCallbackStruct), InvalidPropertyValue);
@@ -840,7 +840,7 @@ OSStatus			AUBase::DispatchSetProperty(	AudioUnitPropertyID 			inID,
 			PropertyChanged(inID, inScope, inElement);
 		}
 		break;
-	
+
 	case kAudioUnitProperty_MaximumFramesPerSlice:
 		ca_require(inDataSize == sizeof(UInt32), InvalidPropertyValue);
 		result = CanSetMaxFrames();
@@ -862,14 +862,14 @@ OSStatus			AUBase::DispatchSetProperty(	AudioUnitPropertyID 			inID,
 			ca_require(ValidFormat(inScope, inElement, newDesc), InvalidFormat);
 
 			const CAStreamBasicDescription curDesc = GetStreamFormat(inScope, inElement);
-			
+
 			if ( !curDesc.IsEqual(newDesc, false) ) {
 				ca_require(IsStreamFormatWritable(inScope, inElement), NotWritable);
 				result = ChangeStreamFormat(inScope, inElement, curDesc, newDesc);
 			}
 		}
 		break;
-	
+
 	case kAudioUnitProperty_SampleRate:
 		{
 			ca_require(inDataSize == sizeof(Float64), InvalidPropertyValue);
@@ -878,9 +878,9 @@ OSStatus			AUBase::DispatchSetProperty(	AudioUnitPropertyID 			inID,
 			const CAStreamBasicDescription curDesc = GetStreamFormat(inScope, inElement);
 			CAStreamBasicDescription newDesc = curDesc;
 			newDesc.mSampleRate = *(Float64 *)inData;
-			
+
 			ca_require(ValidFormat(inScope, inElement, newDesc), InvalidFormat);
-			
+
 			if ( !curDesc.IsEqual(newDesc, false) ) {
 				ca_require(IsStreamFormatWritable(inScope, inElement), NotWritable);
 				result = ChangeStreamFormat(inScope, inElement, curDesc, newDesc);
@@ -892,14 +892,14 @@ OSStatus			AUBase::DispatchSetProperty(	AudioUnitPropertyID 			inID,
 		{
 			const AudioChannelLayout *layout = static_cast<const AudioChannelLayout *>(inData);
 			size_t headerSize = sizeof(AudioChannelLayout) - sizeof(AudioChannelDescription);
-			
+
 			ca_require(inDataSize >= headerSize + layout->mNumberChannelDescriptions * sizeof(AudioChannelDescription), InvalidPropertyValue);
 			result = SetAudioChannelLayout(inScope, inElement, layout);
 			if (result == noErr)
 				PropertyChanged(inID, inScope, inElement);
 			break;
 		}
-	
+
 	case kAudioUnitProperty_ClassInfo:
 		ca_require(inDataSize == sizeof(CFPropertyListRef *), InvalidPropertyValue);
 		ca_require(inScope == kAudioUnitScope_Global, InvalidScope);
@@ -916,7 +916,7 @@ OSStatus			AUBase::DispatchSetProperty(	AudioUnitPropertyID 			inID,
 			ca_require(inDataSize == sizeof(AUPreset), InvalidPropertyValue);
 			ca_require(inScope == kAudioUnitScope_Global, InvalidScope);
 			AUPreset & newPreset = *(AUPreset *)inData;
-			
+
 			if (newPreset.presetNumber >= 0)
 			{
 				result = NewFactoryPresetSet(newPreset);
@@ -935,7 +935,7 @@ OSStatus			AUBase::DispatchSetProperty(	AudioUnitPropertyID 			inID,
 				result = kAudioUnitErr_InvalidPropertyValue;
 		}
 		break;
-	
+
 	case kAudioUnitProperty_ElementName:
 		{
 			ca_require(GetElement(inScope, inElement) != NULL, InvalidElement);
@@ -1003,7 +1003,7 @@ OSStatus			AUBase::DispatchSetProperty(	AudioUnitPropertyID 			inID,
 		break;
 
 #endif // !CA_NO_AU_UI_FEATURES
-	
+
     case kAudioUnitProperty_NickName:
     {
 		ca_require(inScope == kAudioUnitScope_Global, InvalidScope);
@@ -1015,12 +1015,12 @@ OSStatus			AUBase::DispatchSetProperty(	AudioUnitPropertyID 			inID,
         PropertyChanged(inID, inScope, inElement);
         break;
     }
-            
+
 	default:
 		result = SetProperty(inID, inScope, inElement, inData, inDataSize);
 		if (result == noErr)
 			PropertyChanged(inID, inScope, inElement);
-		
+
 		break;
 	}
 	return result;
@@ -1062,7 +1062,7 @@ OSStatus			AUBase::DispatchRemovePropertyValue (AudioUnitPropertyID		inID,
 			PropertyChanged(inID, inScope, inElement);
 		break;
 	}
-	
+
 #if !CA_NO_AU_HOST_CALLBACKS
 	case kAudioUnitProperty_HostCallbacks:
 	{
@@ -1088,7 +1088,7 @@ OSStatus			AUBase::DispatchRemovePropertyValue (AudioUnitPropertyID		inID,
 		mContextName = NULL;
 		result = noErr;
 		break;
-	
+
 #endif // !CA_NO_AU_UI_FEATURES
 
     case kAudioUnitProperty_NickName:
@@ -1104,10 +1104,10 @@ OSStatus			AUBase::DispatchRemovePropertyValue (AudioUnitPropertyID		inID,
     }
 
 	default:
-		result = RemovePropertyValue (inID, inScope, inElement);		
+		result = RemovePropertyValue (inID, inScope, inElement);
 		break;
 	}
-		
+
 	return result;
 #if !CA_NO_AU_UI_FEATURES || !CA_NO_AU_HOST_CALLBACKS
 InvalidScope:
@@ -1157,7 +1157,7 @@ OSStatus			AUBase::RemovePropertyValue (	AudioUnitPropertyID		 		inID,
 {
 	return kAudioUnitErr_InvalidPropertyValue;
 }
-												
+
 //_____________________________________________________________________________
 //
 OSStatus			AUBase::AddPropertyListener(	AudioUnitPropertyID				inID,
@@ -1165,11 +1165,11 @@ OSStatus			AUBase::AddPropertyListener(	AudioUnitPropertyID				inID,
 													void *							inProcRefCon)
 {
 	PropertyListener pl;
-	
+
 	pl.propertyID = inID;
 	pl.listenerProc = inProc;
 	pl.listenerRefCon = inProcRefCon;
-	
+
 	if (mPropertyListeners.empty())
 		mPropertyListeners.reserve(32);
 	mPropertyListeners.push_back(pl);
@@ -1196,7 +1196,7 @@ OSStatus			AUBase::RemovePropertyListener(		AudioUnitPropertyID				inID,
 //_____________________________________________________________________________
 //
 void				AUBase::PropertyChanged(			AudioUnitPropertyID				inID,
-														AudioUnitScope					inScope, 
+														AudioUnitScope					inScope,
 														AudioUnitElement				inElement)
 {
 	for (PropertyListeners::iterator it = mPropertyListeners.begin(); it != mPropertyListeners.end(); ++it)
@@ -1239,7 +1239,7 @@ OSStatus 	AUBase::GetParameter(			AudioUnitParameterID			inID,
 	return noErr;
 }
 
-											
+
 //_____________________________________________________________________________
 //
 OSStatus 	AUBase::SetParameter(			AudioUnitParameterID			inID,
@@ -1259,22 +1259,22 @@ OSStatus 	AUBase::ScheduleParameter (	const AudioUnitParameterEvent 		*inParamet
 													UInt32							inNumEvents)
 {
 	bool canScheduleParameters = CanScheduleParameters();
-		
-	for (UInt32 i = 0; i < inNumEvents; ++i) 
+
+	for (UInt32 i = 0; i < inNumEvents; ++i)
 	{
 		if (inParameterEvent[i].eventType == kParameterEvent_Immediate)
 		{
 			SetParameter (inParameterEvent[i].parameter,
-							inParameterEvent[i].scope, 
+							inParameterEvent[i].scope,
 							inParameterEvent[i].element,
-							inParameterEvent[i].eventValues.immediate.value, 
+							inParameterEvent[i].eventValues.immediate.value,
 							inParameterEvent[i].eventValues.immediate.bufferOffset);
 		}
 		if (canScheduleParameters) {
 			mParamList.push_back (inParameterEvent[i]);
 		}
 	}
-	
+
 	return noErr;
 }
 
@@ -1297,9 +1297,9 @@ OSStatus 	AUBase::ProcessForScheduledParams(	ParameterEventList		&inParamList,
 														void					*inUserData )
 {
 	OSStatus result = noErr;
-	
+
 	int totalFramesToProcess = inFramesToProcess;
-	
+
 	int framesRemaining = totalFramesToProcess;
 
 	unsigned int currentStartFrame = 0;	// start of the whole buffer
@@ -1310,23 +1310,23 @@ OSStatus 	AUBase::ProcessForScheduledParams(	ParameterEventList		&inParamList,
 	std::sort(inParamList.begin(), inParamList.end(), SortParameterEventList);
 
 	ParameterEventList::iterator iter = inParamList.begin();
-	
-	
+
+
 	while(framesRemaining > 0 )
 	{
 		// first of all, go through the ramped automation events and find out where the next
 		// division of our whole buffer will be
-		
+
 		int currentEndFrame = totalFramesToProcess;	// start out assuming we'll process all the way to
 													// the end of the buffer
-		
+
 		iter = inParamList.begin();
-		
+
 		// find the next break point
 		while(iter != inParamList.end() )
 		{
 			AudioUnitParameterEvent &event = *iter;
-			
+
 			int offset = event.eventType == kParameterEvent_Immediate ?  event.eventValues.immediate.bufferOffset : event.eventValues.ramp.startBufferOffset;
 
 			if(offset > (int)currentStartFrame && offset < currentEndFrame )
@@ -1339,7 +1339,7 @@ OSStatus 	AUBase::ProcessForScheduledParams(	ParameterEventList		&inParamList,
 			if(event.eventType == kParameterEvent_Ramped )
 			{
 				offset = event.eventValues.ramp.startBufferOffset + event.eventValues.ramp.durationInFrames;
-	
+
 				if(offset > (int)currentStartFrame && offset < currentEndFrame )
 				{
 					currentEndFrame = offset;
@@ -1348,31 +1348,31 @@ OSStatus 	AUBase::ProcessForScheduledParams(	ParameterEventList		&inParamList,
 
 			iter++;
 		}
-	
+
 		int framesThisTime = currentEndFrame - currentStartFrame;
 
-		// next, setup the parameter maps to be current for the ramp parameters active during 
+		// next, setup the parameter maps to be current for the ramp parameters active during
 		// this time segment...
-		
+
 		for(ParameterEventList::iterator iter2 = inParamList.begin(); iter2 != inParamList.end(); iter2++ )
 		{
 			AudioUnitParameterEvent &event = *iter2;
-			
+
 			bool eventFallsInSlice;
-			
-			
+
+
 			if(event.eventType == kParameterEvent_Ramped)
-				eventFallsInSlice = event.eventValues.ramp.startBufferOffset < currentEndFrame 
+				eventFallsInSlice = event.eventValues.ramp.startBufferOffset < currentEndFrame
 					&& event.eventValues.ramp.startBufferOffset + event.eventValues.ramp.durationInFrames > currentStartFrame;
 			else /* kParameterEvent_Immediate */
 				// actually, for the same parameter, there may be future immediate events which override this one,
 				// but it's OK since the event list is sorted in time order, we're guaranteed to end up with the current one
 				eventFallsInSlice = event.eventValues.immediate.bufferOffset <= currentStartFrame;
-				
+
 			if(eventFallsInSlice)
 			{
 				AUElement *element = GetElement(event.scope, event.element );
-				
+
 				if(element) element->SetScheduledEvent(	event.parameter,
 														event,
 														currentStartFrame,
@@ -1383,18 +1383,18 @@ OSStatus 	AUBase::ProcessForScheduledParams(	ParameterEventList		&inParamList,
 
 
 		// Finally, actually do the processing for this slice.....
-		
+
 		result = ProcessScheduledSlice(	inUserData,
 										currentStartFrame,
 										framesThisTime,
 										inFramesToProcess );
-								
+
 		if(result != noErr) break;
-		
+
 		framesRemaining -= framesThisTime;
 		currentStartFrame = currentEndFrame;	// now start from where we left off last time
 	}
-	
+
 	return result;
 }
 
@@ -1402,9 +1402,9 @@ OSStatus 	AUBase::ProcessForScheduledParams(	ParameterEventList		&inParamList,
 //
 void				AUBase::SetWantsRenderThreadID (bool inFlag)
 {
-	if (inFlag == mWantsRenderThreadID)	
+	if (inFlag == mWantsRenderThreadID)
 		return;
-	
+
 	mWantsRenderThreadID = inFlag;
 	if (!mWantsRenderThreadID)
 		mRenderThreadID = NULL;
@@ -1423,10 +1423,10 @@ OSStatus			AUBase::DoRender(		AudioUnitRenderActionFlags &	ioActionFlags,
 {
 	OSStatus theError;
 	RenderCallbackList::iterator rcit;
-	
+
 	AUTRACE(kCATrace_AUBaseRenderStart, mComponentInstance, (uintptr_t)this, inBusNumber, inFramesToProcess, (uintptr_t)ioData.mBuffers[0].mData);
 	DISABLE_DENORMALS
-	
+
 	try {
 		ca_require(IsInitialized(), Uninitialized);
 		ca_require(mAudioUnitAPIVersion >= 2, ParamErr);
@@ -1468,7 +1468,7 @@ OSStatus			AUBase::DoRender(		AudioUnitRenderActionFlags &	ioActionFlags,
 				buf.mDataByteSize = expectedBufferByteSize;
 			}
 		}
-		
+
 		if (WantsRenderThreadID())
 		{
 			#if TARGET_OS_MAC
@@ -1477,7 +1477,7 @@ OSStatus			AUBase::DoRender(		AudioUnitRenderActionFlags &	ioActionFlags,
 				mRenderThreadID = GetCurrentThreadId();
 			#endif
 		}
-		
+
 		AudioUnitRenderActionFlags flags;
 		if (mRenderCallbacksTouched) {
 			mRenderCallbacks.update();
@@ -1485,26 +1485,26 @@ OSStatus			AUBase::DoRender(		AudioUnitRenderActionFlags &	ioActionFlags,
 			for (rcit = mRenderCallbacks.begin(); rcit != mRenderCallbacks.end(); ++rcit) {
 				RenderCallback &rc = *rcit;
 				AUTRACE(kCATrace_AUBaseRenderCallbackStart, mComponentInstance, (intptr_t)this, (intptr_t)rc.mRenderNotify, 1, 0);
-				(*(AURenderCallback)rc.mRenderNotify)(rc.mRenderNotifyRefCon, 
+				(*(AURenderCallback)rc.mRenderNotify)(rc.mRenderNotifyRefCon,
 								&flags,
 								&inTimeStamp, inBusNumber, inFramesToProcess, &ioData);
 				AUTRACE(kCATrace_AUBaseRenderCallbackEnd, mComponentInstance, (intptr_t)this, (intptr_t)rc.mRenderNotify, 1, 0);
 			}
 		}
-		
+
 		theError = DoRenderBus(ioActionFlags, inTimeStamp, inBusNumber, output, inFramesToProcess, ioData);
-		
+
 		if (mRenderCallbacksTouched) {
 			flags = ioActionFlags | kAudioUnitRenderAction_PostRender;
-			
+
 			if (SetRenderError (theError)) {
-				flags |= kAudioUnitRenderAction_PostRenderError;		
+				flags |= kAudioUnitRenderAction_PostRenderError;
 			}
-			
+
 			for (rcit = mRenderCallbacks.begin(); rcit != mRenderCallbacks.end(); ++rcit) {
 				RenderCallback &rc = *rcit;
 				AUTRACE(kCATrace_AUBaseRenderCallbackStart, mComponentInstance, (intptr_t)this, (intptr_t)rc.mRenderNotify, 2, 0);
-				(*(AURenderCallback)rc.mRenderNotify)(rc.mRenderNotifyRefCon, 
+				(*(AURenderCallback)rc.mRenderNotify)(rc.mRenderNotifyRefCon,
 								&flags,
 								&inTimeStamp, inBusNumber, inFramesToProcess, &ioData);
 				AUTRACE(kCATrace_AUBaseRenderCallbackEnd, mComponentInstance, (intptr_t)this, (intptr_t)rc.mRenderNotify, 2, 0);
@@ -1527,12 +1527,12 @@ OSStatus			AUBase::DoRender(		AudioUnitRenderActionFlags &	ioActionFlags,
 		theError = -1;
 		goto errexit;
 	}
-done:	
+done:
 	RESTORE_DENORMALS
 	AUTRACE(kCATrace_AUBaseRenderEnd, mComponentInstance, (intptr_t)this, theError, ioActionFlags, CATrace::ablData(ioData));
-	
+
 	return theError;
-	
+
 Uninitialized:	theError = kAudioUnitErr_Uninitialized;				goto errexit;
 ParamErr:		theError = kAudio_ParamError;						goto errexit;
 TooManyFrames:	theError = kAudioUnitErr_TooManyFramesToProcess;	goto errexit;
@@ -1553,8 +1553,8 @@ OSStatus	AUBase::DoProcess (	AudioUnitRenderActionFlags  &		ioActionFlags,
 	AUTRACE(kCATrace_AUBaseRenderStart, mComponentInstance, (intptr_t)this, -1, inFramesToProcess, 0);
 	DISABLE_DENORMALS
 
-	try {		
-	
+	try {
+
 		if (!(ioActionFlags & (1 << 9)/*kAudioUnitRenderAction_DoNotCheckRenderArgs*/)) {
 			ca_require(IsInitialized(), Uninitialized);
 			ca_require(inFramesToProcess <= mMaxFramesPerSlice, TooManyFrames);
@@ -1587,7 +1587,7 @@ OSStatus	AUBase::DoProcess (	AudioUnitRenderActionFlags  &		ioActionFlags,
 				}
 			}
 		}
-		
+
 		if (WantsRenderThreadID())
 		{
 			#if TARGET_OS_MAC
@@ -1596,12 +1596,12 @@ OSStatus	AUBase::DoProcess (	AudioUnitRenderActionFlags  &		ioActionFlags,
 				mRenderThreadID = GetCurrentThreadId();
 			#endif
 		}
-		
+
 		if (NeedsToRender (inTimeStamp)) {
 			theError = ProcessBufferLists (ioActionFlags, ioData, ioData, inFramesToProcess);
 		} else
 			theError = noErr;
-			
+
 	}
 	catch (OSStatus err) {
 		theError = err;
@@ -1611,12 +1611,12 @@ OSStatus	AUBase::DoProcess (	AudioUnitRenderActionFlags  &		ioActionFlags,
 		theError = -1;
 		goto errexit;
 	}
-done:	
+done:
 	RESTORE_DENORMALS
 	AUTRACE(kCATrace_AUBaseRenderEnd, mComponentInstance, (intptr_t)this, theError, ioActionFlags, CATrace::ablData(ioData));
-	
+
 	return theError;
-	
+
 Uninitialized:	theError = kAudioUnitErr_Uninitialized;				goto errexit;
 ParamErr:		theError = kAudio_ParamError;						goto errexit;
 TooManyFrames:	theError = kAudioUnitErr_TooManyFramesToProcess;	goto errexit;
@@ -1636,25 +1636,25 @@ OSStatus	AUBase::DoProcessMultiple (	AudioUnitRenderActionFlags  & ioActionFlags
 {
 	OSStatus theError;
 	DISABLE_DENORMALS
-	
+
 	try {
-		
+
 		if (!(ioActionFlags & (1 << 9)/*kAudioUnitRenderAction_DoNotCheckRenderArgs*/)) {
 			ca_require(IsInitialized(), Uninitialized);
 			ca_require(inFramesToProcess <= mMaxFramesPerSlice, TooManyFrames);
 			ca_require (!UsesFixedBlockSize() || inFramesToProcess == GetMaxFramesPerSlice(), ParamErr);
-			
+
 			for (unsigned ibl = 0; ibl < inNumberInputBufferLists; ++ibl) {
 				if (inInputBufferLists[ibl] != NULL) {
 					AUInputElement *input = GetInput(ibl);	// will throw if non-existant
 					unsigned expectedBufferByteSize = inFramesToProcess * input->GetStreamFormat().mBytesPerFrame;
-					
+
 					if (input->GetStreamFormat().NumberChannelStreams() != inInputBufferLists[ibl]->mNumberBuffers) {
 						DebugMessageN5("%s:%d inInputBufferLists[%u]->mNumberBuffers=%u, input->GetStreamFormat().NumberChannelStreams()=%u; kAudio_ParamError",
 									   __FILE__, __LINE__, ibl, (unsigned)inInputBufferLists[ibl]->mNumberBuffers, (unsigned)input->GetStreamFormat().NumberChannelStreams());
 						goto ParamErr;
 					}
-					
+
 					for (unsigned ibuf = 0; ibuf < inInputBufferLists[ibl]->mNumberBuffers; ++ibuf) {
 						const AudioBuffer &buf = inInputBufferLists[ibl]->mBuffers[ibuf];
 						if (buf.mData != NULL) {
@@ -1673,7 +1673,7 @@ OSStatus	AUBase::DoProcessMultiple (	AudioUnitRenderActionFlags  & ioActionFlags
 					// skip NULL input audio buffer list
 				}
 			}
-			
+
 			for (unsigned obl = 0; obl < inNumberOutputBufferLists; ++obl) {
 				if (ioOutputBufferLists[obl] != NULL) {
 					AUOutputElement *output = GetOutput(obl);	// will throw if non-existant
@@ -1684,7 +1684,7 @@ OSStatus	AUBase::DoProcessMultiple (	AudioUnitRenderActionFlags  & ioActionFlags
 									   __FILE__, __LINE__, obl, (unsigned)ioOutputBufferLists[obl]->mNumberBuffers, (unsigned)output->GetStreamFormat().NumberChannelStreams());
 						goto ParamErr;
 					}
-					
+
 					for (unsigned obuf = 0; obuf < ioOutputBufferLists[obl]->mNumberBuffers; ++obuf) {
 						AudioBuffer &buf = ioOutputBufferLists[obl]->mBuffers[obuf];
 						if (buf.mData != NULL) {
@@ -1708,7 +1708,7 @@ OSStatus	AUBase::DoProcessMultiple (	AudioUnitRenderActionFlags  & ioActionFlags
 				}
 			}
 		}
-		
+
 		if (WantsRenderThreadID())
 		{
 #if TARGET_OS_MAC
@@ -1717,7 +1717,7 @@ OSStatus	AUBase::DoProcessMultiple (	AudioUnitRenderActionFlags  & ioActionFlags
 			mRenderThreadID = GetCurrentThreadId();
 #endif
 		}
-		
+
 		if (NeedsToRender (inTimeStamp)) {
 			theError = ProcessMultipleBufferLists (ioActionFlags, inFramesToProcess, inNumberInputBufferLists, inInputBufferLists, inNumberOutputBufferLists, ioOutputBufferLists);
 		} else
@@ -1731,11 +1731,11 @@ OSStatus	AUBase::DoProcessMultiple (	AudioUnitRenderActionFlags  & ioActionFlags
 		theError = -1;
 		goto errexit;
 	}
-done:	
+done:
 	RESTORE_DENORMALS
-	
+
 	return theError;
-	
+
 Uninitialized:	theError = kAudioUnitErr_Uninitialized;				goto errexit;
 ParamErr:		theError = kAudio_ParamError;						goto errexit;
 TooManyFrames:	theError = kAudioUnitErr_TooManyFramesToProcess;	goto errexit;
@@ -1748,15 +1748,15 @@ errexit:
 //_____________________________________________________________________________
 //
 OSStatus			AUBase::SetInputCallback(		UInt32							inPropertyID,
-													AudioUnitElement 				inElement, 
+													AudioUnitElement 				inElement,
 													AURenderCallback				inProc,
 													void *							inRefCon)
 {
 	AUInputElement *input = GetInput(inElement);	// may throw
-	
+
 	input->SetInputCallback(inProc, inRefCon);
 	PropertyChanged(inPropertyID, kAudioUnitScope_Input, inElement);
-	
+
 	return noErr;
 }
 
@@ -1767,7 +1767,7 @@ OSStatus			AUBase::SetConnection(			const AudioUnitConnection &		inConnection)
 
 	OSStatus err;
 	AUInputElement *input = GetInput(inConnection.destInputNumber);	// may throw
-		
+
 	if (inConnection.sourceAudioUnit) {
 		// connecting, not disconnecting
 		CAStreamBasicDescription sourceDesc;
@@ -1779,19 +1779,19 @@ OSStatus			AUBase::SetConnection(			const AudioUnitConnection &		inConnection)
 										inConnection.sourceOutputNumber,
 										&sourceDesc,
 										&size), errexit);
-		ca_require_noerr(err = DispatchSetProperty (kAudioUnitProperty_StreamFormat, 
-								kAudioUnitScope_Input, inConnection.destInputNumber, 
+		ca_require_noerr(err = DispatchSetProperty (kAudioUnitProperty_StreamFormat,
+								kAudioUnitScope_Input, inConnection.destInputNumber,
 								&sourceDesc, sizeof(CAStreamBasicDescription)), errexit);
 	}
 	input->SetConnection(inConnection);
-		
+
 	PropertyChanged(kAudioUnitProperty_MakeConnection, kAudioUnitScope_Input, inConnection.destInputNumber);
 	return noErr;
 
 errexit:
 	return err;
 }
- 
+
 //_____________________________________________________________________________
 //
 UInt32				AUBase::SupportedNumChannels (	const AUChannelInfo** 			outInfo)
@@ -1838,7 +1838,7 @@ const CAStreamBasicDescription &
 {
 //#warning "aliasing of global scope format should be pushed to subclasses"
 	AUIOElement *element;
-	
+
 	switch (inScope) {
 	case kAudioUnitScope_Input:
 		element = Inputs().GetIOElement(inElement);
@@ -1858,9 +1858,9 @@ const CAStreamBasicDescription &
 OSStatus			AUBase::SetBusCount(	AudioUnitScope					inScope,
 											UInt32 							inCount)
 {
-	if (IsInitialized()) 
+	if (IsInitialized())
 		return kAudioUnitErr_Initialized;
-		
+
 	GetScope(inScope).SetNumberOfElements(inCount);
 	return noErr;
 }
@@ -1874,7 +1874,7 @@ OSStatus			AUBase::ChangeStreamFormat(		AudioUnitScope					inScope,
 {
 //#warning "aliasing of global scope format should be pushed to subclasses"
 	AUIOElement *element;
-	
+
 	switch (inScope) {
 	case kAudioUnitScope_Input:
 		element = Inputs().GetIOElement(inElement);
@@ -1921,7 +1921,7 @@ OSStatus	AUBase::RemoveAudioChannelLayout(			AudioUnitScope				inScope,
 	return result;
 }
 
-OSStatus 	AUBase::SetAudioChannelLayout(				AudioUnitScope 				inScope, 
+OSStatus 	AUBase::SetAudioChannelLayout(				AudioUnitScope 				inScope,
 														AudioUnitElement 			inElement,
 														const AudioChannelLayout *	inLayout)
 {
@@ -1946,7 +1946,7 @@ OSStatus 	AUBase::SetAudioChannelLayout(				AudioUnitScope 				inScope,
 		}
 	}
 	free(tags);
-	
+
 	if (foundTag == false)
 		return kAudioUnitErr_InvalidPropertyValue;
 
@@ -1966,7 +1966,7 @@ OSStatus			AUBase::SaveState(		CFPropertyListRef * outData)
 {
 	AudioComponentDescription desc = GetComponentDescription();
 
-	CFMutableDictionaryRef dict = CFDictionaryCreateMutable	(NULL, 0, 
+	CFMutableDictionaryRef dict = CFDictionaryCreateMutable	(NULL, 0,
 								&kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
 
 // first step -> save the version to the data ref
@@ -1979,24 +1979,24 @@ OSStatus			AUBase::SaveState(		CFPropertyListRef * outData)
 
 	value = desc.componentSubType;
 	AddNumToDictionary (dict, kSubtypeString, value);
-	
+
 	value = desc.componentManufacturer;
 	AddNumToDictionary (dict, kManufacturerString, value);
-	
+
 // fourth step -> save the state of all parameters on all scopes and elements
 	CFMutableDataRef data = CFDataCreateMutable(NULL, 0);
 	for (AudioUnitScope iscope = 0; iscope < 3; ++iscope) {
 		AUScope &scope = GetScope(iscope);
 		scope.SaveState (data);
 	}
-    
+
     SaveExtendedScopes(data);
 
 // save all this in the data section of the dictionary
 	CFDictionarySetValue(dict, kDataString, data);
 	CFRelease (data);
-	
-//OK - now we're going to do some properties 	
+
+//OK - now we're going to do some properties
 //save the preset name...
 	CFDictionarySetValue (dict, kNameString, mCurrentPreset.presetName);
 
@@ -2006,44 +2006,44 @@ OSStatus			AUBase::SaveState(		CFPropertyListRef * outData)
 								kAudioUnitScope_Global,
 								0,
 								&value);
-	
+
 	if (result == noErr) {
 		AddNumToDictionary (dict, kRenderQualityString, value);
 	}
-	
+
 // Does the unit support the CPULoad Quality property - if so, save it...
 	Float32 cpuLoad;
 	result = DispatchGetProperty (6/*kAudioUnitProperty_CPULoad*/,
 								kAudioUnitScope_Global,
 								0,
 								&cpuLoad);
-	
+
 	if (result == noErr) {
 		CFNumberRef num = CFNumberCreate (NULL, kCFNumberFloatType, &cpuLoad);
 		CFDictionarySetValue (dict, kCPULoadString, num);
 		CFRelease (num);
 	}
 
-// Do we have any element names for any of our scopes?	
+// Do we have any element names for any of our scopes?
 	// first check to see if we have any names...
 	bool foundName = false;
 	for (AudioUnitScope i = 0; i < kNumScopes; ++i) {
 		foundName = GetScope (i).HasElementWithName();
-		if (foundName) 
+		if (foundName)
 			break;
 	}
 		// OK - we found a name away we go...
 	if (foundName) {
-		CFMutableDictionaryRef nameDict = CFDictionaryCreateMutable	(NULL, 0, 
+		CFMutableDictionaryRef nameDict = CFDictionaryCreateMutable	(NULL, 0,
 								&kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
 		for (AudioUnitScope i = 0; i < kNumScopes; ++i) {
 			GetScope (i).AddElementNamesToDict (nameDict);
 		}
-		
+
 		CFDictionarySetValue (dict, kElementNameString, nameDict);
 		CFRelease (nameDict);
 	}
-	
+
 // we're done!!!
 	*outData = dict;
 
@@ -2055,16 +2055,16 @@ OSStatus			AUBase::SaveState(		CFPropertyListRef * outData)
 OSStatus			AUBase::RestoreState(	CFPropertyListRef	plist)
 {
 	if (CFGetTypeID(plist) != CFDictionaryGetTypeID()) return kAudioUnitErr_InvalidPropertyValue;
-	
+
 	AudioComponentDescription desc = GetComponentDescription();
-	
+
 	CFDictionaryRef dict = static_cast<CFDictionaryRef>(plist);
 
 // zeroeth step - make sure the Part key is NOT present, as this method is used
-// to restore the GLOBAL state of the dictionary	
+// to restore the GLOBAL state of the dictionary
 	if (CFDictionaryContainsKey (dict, kPartString))
 		return kAudioUnitErr_InvalidPropertyValue;
-		
+
 // first step -> check the saved version in the data ref
 // at this point we're only dealing with version==0
 	CFNumberRef cfnum = reinterpret_cast<CFNumberRef>(CFDictionaryGetValue (dict, kVersionString));
@@ -2087,22 +2087,22 @@ OSStatus			AUBase::RestoreState(	CFPropertyListRef	plist)
 	CFNumberGetValue (cfnum, kCFNumberSInt32Type, &value);
 	if (UInt32(value) != desc.componentManufacturer) return kAudioUnitErr_InvalidPropertyValue;
 
-// fourth step -> restore the state of all of the parameters for each scope and element	
+// fourth step -> restore the state of all of the parameters for each scope and element
 	CFDataRef data = reinterpret_cast<CFDataRef>(CFDictionaryGetValue (dict, kDataString));
-	if (data != NULL) 
+	if (data != NULL)
 	{
 		const UInt8 *p, *pend;
-		
+
 		p = CFDataGetBytePtr(data);
 		pend = p + CFDataGetLength(data);
-		
+
 		// we have a zero length data, which may just mean there were no parameters to save!
-		//	if (p >= pend) return noErr; 
-	
+		//	if (p >= pend) return noErr;
+
 		while (p < pend) {
             UInt32 scopeIdx = CFSwapInt32BigToHost(*(UInt32 *)p);
             p += sizeof(UInt32);
-            
+
 			AUScope &scope = GetScope(scopeIdx);
             p = scope.RestoreState(p);
         }
@@ -2116,12 +2116,12 @@ OSStatus			AUBase::RestoreState(	CFPropertyListRef	plist)
 	{
 		mCurrentPreset.presetName = name;
 		mCurrentPreset.presetNumber = -1;
-	} 
+	}
 	else { // no name entry make the default one
 		mCurrentPreset.presetName = kUntitledString;
 		mCurrentPreset.presetNumber = -1;
 	}
-	
+
 	CFRetain (mCurrentPreset.presetName);
 #if !CA_USE_AUDIO_PLUGIN_ONLY
 #ifndef __LP64__
@@ -2130,8 +2130,8 @@ OSStatus			AUBase::RestoreState(	CFPropertyListRef	plist)
 #endif
 	PropertyChanged(kAudioUnitProperty_PresentPreset, kAudioUnitScope_Global, 0);
 
-// Does the dict contain render quality information?		
-	if (CFDictionaryGetValueIfPresent (dict, kRenderQualityString, reinterpret_cast<const void**>(&cfnum))) 
+// Does the dict contain render quality information?
+	if (CFDictionaryGetValueIfPresent (dict, kRenderQualityString, reinterpret_cast<const void**>(&cfnum)))
 	{
 		CFNumberGetValue (cfnum, kCFNumberSInt32Type, &value);
 		DispatchSetProperty (kAudioUnitProperty_RenderQuality,
@@ -2140,9 +2140,9 @@ OSStatus			AUBase::RestoreState(	CFPropertyListRef	plist)
 								&value,
 								sizeof(value));
 	}
-	
+
 // Does the unit support the CPULoad Quality property - if so, save it...
-	if (CFDictionaryGetValueIfPresent (dict, kCPULoadString, reinterpret_cast<const void**>(&cfnum))) 
+	if (CFDictionaryGetValueIfPresent (dict, kCPULoadString, reinterpret_cast<const void**>(&cfnum)))
 	{
 		Float32 floatValue;
 		CFNumberGetValue (cfnum, kCFNumberFloatType, &floatValue);
@@ -2155,24 +2155,24 @@ OSStatus			AUBase::RestoreState(	CFPropertyListRef	plist)
 
 // Do we have any element names for any of our scopes?
 	CFDictionaryRef nameDict;
-	if (CFDictionaryGetValueIfPresent (dict, kElementNameString, reinterpret_cast<const void**>(&nameDict))) 
+	if (CFDictionaryGetValueIfPresent (dict, kElementNameString, reinterpret_cast<const void**>(&nameDict)))
 	{
 		char string[64];
-		for (int i = 0; i < kNumScopes; ++i) 
+		for (int i = 0; i < kNumScopes; ++i)
 		{
 			snprintf (string, sizeof(string), "%d", i);
 			CFStringRef key = CFStringCreateWithCString (NULL, string, kCFStringEncodingASCII);
 			CFDictionaryRef elementDict;
-			if (CFDictionaryGetValueIfPresent (nameDict, key, reinterpret_cast<const void**>(&elementDict))) 
+			if (CFDictionaryGetValueIfPresent (nameDict, key, reinterpret_cast<const void**>(&elementDict)))
 			{
 				bool didAddElements = GetScope (i).RestoreElementNames (elementDict);
 				if (didAddElements)
 					PropertyChanged (kAudioUnitProperty_ElementCount, i, 0);
 			}
-			CFRelease (key);				
+			CFRelease (key);
 		}
 	}
-	
+
 	return noErr;
 }
 
@@ -2206,18 +2206,18 @@ bool				AUBase::SetAFactoryPresetAsCurrent (const AUPreset & inPreset)
 }
 
 #if !CA_USE_AUDIO_PLUGIN_ONLY
-int			AUBase::GetNumCustomUIComponents () 
+int			AUBase::GetNumCustomUIComponents ()
 {
 	return 0;
 }
 
 void		AUBase::GetUIComponentDescs (ComponentDescription* inDescArray) {}
 #endif
-	
-bool		AUBase::HasIcon () 
+
+bool		AUBase::HasIcon ()
 {
 #if !CA_NO_AU_UI_FEATURES
-	CFURLRef url = CopyIconLocation(); 
+	CFURLRef url = CopyIconLocation();
 	if (url) {
 		CFRelease (url);
 		return true;
@@ -2226,11 +2226,11 @@ bool		AUBase::HasIcon ()
 	return false;
 }
 
-CFURLRef	AUBase::CopyIconLocation () 
+CFURLRef	AUBase::CopyIconLocation ()
 {
 	return NULL;
 }
-	
+
 //_____________________________________________________________________________
 //
 OSStatus			AUBase::GetParameterList(		AudioUnitScope					inScope,
@@ -2240,7 +2240,7 @@ OSStatus			AUBase::GetParameterList(		AudioUnitScope					inScope,
 	AUScope &scope = GetScope(inScope);
 	AUElement *elementWithMostParameters = NULL;
 	UInt32 maxNumParams = 0;
-	
+
 	int nElems = scope.GetNumberOfElements();
 	for (int ielem = 0; ielem < nElems; ++ielem) {
 		AUElement *element = scope.GetElement(ielem);
@@ -2250,10 +2250,10 @@ OSStatus			AUBase::GetParameterList(		AudioUnitScope					inScope,
 			elementWithMostParameters = element;
 		}
 	}
-	
+
 	if (outParameterList != NULL && elementWithMostParameters != NULL)
 		elementWithMostParameters->GetParameterList(outParameterList);
-	
+
 	outNumParameters = maxNumParams;
 	return noErr;
 }
@@ -2289,8 +2289,8 @@ OSStatus			AUBase::GetParameterHistoryInfo(	AudioUnitScope					inScope,
 
 //_____________________________________________________________________________
 //
-OSStatus			AUBase::CopyClumpName(			AudioUnitScope			inScope, 
-													UInt32					inClumpID, 
+OSStatus			AUBase::CopyClumpName(			AudioUnitScope			inScope,
+													UInt32					inClumpID,
 													UInt32					inDesiredNameLength,
 													CFStringRef *			outClumpName)
 {
@@ -2328,7 +2328,7 @@ AUElement *			AUBase::CreateElement(			AudioUnitScope					scope,
 #endif
 	}
 	COMPONENT_THROW(kAudioUnitErr_InvalidScope);
-	
+
 	return NULL;	// get rid of compiler warning
 }
 
@@ -2374,9 +2374,9 @@ const Float64 AUBase::kNoLastRenderedSampleTime = -1.;
 char*	AUBase::GetLoggingString () const
 {
 	if (mLogString) return mLogString;
-	
+
 	AudioComponentDescription desc = GetComponentDescription();
-	
+
 	const size_t logStringSize = 256;
 	const_cast<AUBase*>(this)->mLogString = new char[logStringSize];
 	char str[24];
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUBase.h b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUBase.h
index 0c78221..8cc600f 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUBase.h
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUBase.h
@@ -2,14 +2,14 @@
      File: AUBase.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #ifndef __AUBase_h__
 #define __AUBase_h__
@@ -81,7 +81,7 @@
 
 #ifndef AUTRACE
 	#define AUTRACE(code, obj, a, b, c, d)
-#endif	
+#endif
 
 #include "AUPlugInDispatch.h"
 
@@ -92,11 +92,11 @@
 
 #define kAUDefaultSampleRate		44100.0
 #if !TARGET_OS_WIN32
-#define kAUDefaultMaxFramesPerSlice	1156 
+#define kAUDefaultMaxFramesPerSlice	1156
 //this allows enough default frames for a 512 dest 44K and SRC from 96K
 // add a padding of 4 frames for any altivec rounding
 #else
-#define kAUDefaultMaxFramesPerSlice	2048 
+#define kAUDefaultMaxFramesPerSlice	2048
 #endif
 
 // ________________________________________________________________________
@@ -106,16 +106,16 @@ class AUBase : public ComponentBase {
 public:
 
 	/*! @ctor AUBase */
-								AUBase(					AudioComponentInstance			inInstance, 
+								AUBase(					AudioComponentInstance			inInstance,
 														UInt32							numInputElements,
 														UInt32							numOutputElements,
 														UInt32							numGroupElements = 0);
 	/*! @dtor AUBase */
 	virtual						~AUBase();
-	
+
 	/*! @method PostConstructor */
 	virtual void				PostConstructor() { CreateElements(); }
-								
+
 	/*! @method PreDestructor */
 	virtual void				PreDestructor();
 
@@ -133,7 +133,7 @@ public:
 	// ________________________________________________________________________
 	// Virtual methods (mostly) directly corresponding to the entry points.  Many of these
 	// have useful implementations here and will not need overriding.
-	
+
 	/*! @method DoInitialize */
 			OSStatus			DoInitialize();
 				// this implements the entry point and makes sure that initialization
@@ -143,16 +143,16 @@ public:
 	virtual OSStatus			Initialize();
 				// ... so that overrides to this method can assume that they will only
 				// be called exactly once.
-	
+
 	/*! @method IsInitialized */
 			bool				IsInitialized() const { return mInitialized; }
 	/*! @method HasBegunInitializing */
 			bool				HasBegunInitializing() const { return mHasBegunInitializing; }
-			
+
 	/*! @method DoCleanup */
 			void				DoCleanup();
 				// same pattern as with Initialize
-	
+
 	/*! @method Cleanup */
 	virtual void				Cleanup();
 
@@ -161,7 +161,7 @@ public:
 														AudioUnitElement 				inElement);
 
 	// Note about GetPropertyInfo, GetProperty, SetProperty:
-	// Certain properties are trapped out in these dispatch functions and handled with different virtual 
+	// Certain properties are trapped out in these dispatch functions and handled with different virtual
 	// methods.  (To discourage hacks and keep vtable size down, these are non-virtual)
 
 	/*! @method DispatchGetPropertyInfo */
@@ -183,7 +183,7 @@ public:
 														AudioUnitElement 				inElement,
 														const void *					inData,
 														UInt32 							inDataSize);
-													
+
 			OSStatus			DispatchRemovePropertyValue(	AudioUnitPropertyID 	inID,
 														AudioUnitScope 					inScope,
 														AudioUnitElement 				inElement);
@@ -207,7 +207,7 @@ public:
 														AudioUnitElement 				inElement,
 														const void *					inData,
 														UInt32 							inDataSize);
-													
+
 	/*! @method ClearPropertyUsage */
 	virtual OSStatus			RemovePropertyValue (	AudioUnitPropertyID		 		inID,
 														AudioUnitScope 					inScope,
@@ -217,28 +217,28 @@ public:
 	virtual OSStatus			AddPropertyListener(	AudioUnitPropertyID				inID,
 														AudioUnitPropertyListenerProc	inProc,
 														void *							inProcRefCon);
-														
+
 	/*! @method RemovePropertyListener */
 	virtual OSStatus			RemovePropertyListener(	AudioUnitPropertyID				inID,
 														AudioUnitPropertyListenerProc	inProc,
 														void *							inProcRefCon,
 														bool							refConSpecified);
-	
+
 	/*! @method SetRenderNotification */
 	virtual OSStatus			SetRenderNotification(	AURenderCallback		 		inProc,
 														void *							inRefCon);
-	
+
 	/*! @method RemoveRenderNotification */
 	virtual OSStatus			RemoveRenderNotification(
 														AURenderCallback		 		inProc,
 														void *							inRefCon);
-	
+
 	/*! @method GetParameter */
 	virtual OSStatus 	GetParameter(			AudioUnitParameterID			inID,
 														AudioUnitScope 					inScope,
 														AudioUnitElement 				inElement,
 														AudioUnitParameterValue &		outValue);
-												
+
 	/*! @method SetParameter */
 	virtual OSStatus 	SetParameter(			AudioUnitParameterID			inID,
 														AudioUnitScope 					inScope,
@@ -252,7 +252,7 @@ public:
 	/*! @method ScheduleParameter */
 	virtual OSStatus 	ScheduleParameter (		const AudioUnitParameterEvent 	*inParameterEvent,
 														UInt32							inNumEvents);
-	
+
 
 	/*! @method DoRender */
 	OSStatus 	DoRender(								AudioUnitRenderActionFlags &	ioActionFlags,
@@ -260,14 +260,14 @@ public:
 														UInt32							inBusNumber,
 														UInt32							inNumberFrames,
 														AudioBufferList &				ioData);
-	
+
 
 	/*! @method Process */
 	OSStatus	DoProcess (							AudioUnitRenderActionFlags  &		ioActionFlags,
 													const AudioTimeStamp &				inTimeStamp,
 													UInt32								inFramesToProcess,
 													AudioBufferList &					ioData);
-	
+
 	/*! @method ProcessMultiple */
 	OSStatus	DoProcessMultiple (					AudioUnitRenderActionFlags  &		ioActionFlags,
 													const AudioTimeStamp &				inTimeStamp,
@@ -276,7 +276,7 @@ public:
 													const AudioBufferList **			inInputBufferLists,
 													UInt32 								inNumberOutputBufferLists,
 													AudioBufferList **					ioOutputBufferLists);
-		
+
 	/*! @method ProcessBufferLists */
 	virtual OSStatus	ProcessBufferLists(			AudioUnitRenderActionFlags &		ioActionFlags,
 													const AudioBufferList &				inBuffer,
@@ -288,26 +288,26 @@ public:
 
 	/*! @method ProcessMultipleBufferLists */
 	virtual OSStatus	ProcessMultipleBufferLists(	AudioUnitRenderActionFlags &		ioActionFlags,
-													UInt32								inFramesToProcess, 
+													UInt32								inFramesToProcess,
 												    UInt32								inNumberInputBufferLists,
 												    const AudioBufferList **			inInputBufferLists,
 												    UInt32							 	inNumberOutputBufferLists,
-												    AudioBufferList **					ioOutputBufferLists)	
+												    AudioBufferList **					ioOutputBufferLists)
 						{
 							return kAudio_UnimplementedError;
 						}
-	
+
 	/*! @method ComplexRender */
-	virtual OSStatus	ComplexRender(				AudioUnitRenderActionFlags &		ioActionFlags, 
-													const AudioTimeStamp &				inTimeStamp, 
-													UInt32								inOutputBusNumber, 
-													UInt32								inNumberOfPackets, 
-													UInt32 *							outNumberOfPackets, 
-													AudioStreamPacketDescription *		outPacketDescriptions, 
-													AudioBufferList &					ioData, 
-													void *								outMetadata, 
-													UInt32 *							outMetadataByteSize) 
-						{	
+	virtual OSStatus	ComplexRender(				AudioUnitRenderActionFlags &		ioActionFlags,
+													const AudioTimeStamp &				inTimeStamp,
+													UInt32								inOutputBusNumber,
+													UInt32								inNumberOfPackets,
+													UInt32 *							outNumberOfPackets,
+													AudioStreamPacketDescription *		outPacketDescriptions,
+													AudioBufferList &					ioData,
+													void *								outMetadata,
+													UInt32 *							outMetadataByteSize)
+						{
 							return kAudio_UnimplementedError;
 						}
 
@@ -316,7 +316,7 @@ public:
 	// Otherwise, override Render().
 	//
 	// N.B. Implementations of this method can assume that the output's buffer list has already been
-	// prepared and access it with GetOutput(inBusNumber)->GetBufferList() instead of 
+	// prepared and access it with GetOutput(inBusNumber)->GetBufferList() instead of
 	// GetOutput(inBusNumber)->PrepareBuffer(nFrames) -- if PrepareBuffer is called, a
 	// copy may occur after rendering.
 	/*! @method RenderBus */
@@ -331,7 +331,7 @@ public:
 								}
 
 	// N.B. For a unit with only one output bus, it can assume in its implementation of this
-	// method that the output's buffer list has already been prepared and access it with 
+	// method that the output's buffer list has already been prepared and access it with
 	// GetOutput(0)->GetBufferList() instead of GetOutput(0)->PrepareBuffer(nFrames)
 	//  -- if PrepareBuffer is called, a copy may occur after rendering.
 	/*! @method Render */
@@ -342,7 +342,7 @@ public:
 									return noErr;
 								}
 
-								
+
 #pragma mark -
 #pragma mark Property Dispatch
 
@@ -361,10 +361,10 @@ public:
 
 	/*! @method SetConnection */
 	virtual OSStatus			SetConnection(			const AudioUnitConnection &		inConnection);
-	
+
 	/*! @method SetInputCallback */
 	virtual OSStatus			SetInputCallback(		UInt32							inPropertyID,
-														AudioUnitElement 				inElement, 
+														AudioUnitElement 				inElement,
 														AURenderCallback				inProc,
 														void *							inRefCon);
 
@@ -386,7 +386,7 @@ public:
 
 	/*! @method SaveState */
 	virtual OSStatus			SaveState(				CFPropertyListRef *				outData);
-    
+
     /*! @method SaveExtendedScopes */
 	virtual void                SaveExtendedScopes(		CFMutableDataRef				outData) {};
 
@@ -399,8 +399,8 @@ public:
 														CFArrayRef *					outStrings);
 
 	/*! @method CopyClumpName */
-	virtual OSStatus			CopyClumpName(			AudioUnitScope					inScope, 
-														UInt32							inClumpID, 
+	virtual OSStatus			CopyClumpName(			AudioUnitScope					inScope,
+														UInt32							inClumpID,
 														UInt32							inDesiredNameLength,
 														CFStringRef *					outClumpName);
 
@@ -411,14 +411,14 @@ public:
 		// and the name should be valid, or the preset WON'T take
 	/*! @method SetAFactoryPresetAsCurrent */
 	bool						SetAFactoryPresetAsCurrent (const AUPreset & inPreset);
-		
+
 		// Called when someone sets a new, valid preset
 		// If this is a valid preset, then the subclass sets its state to that preset
 		// and returns noErr.
 		// If not a valid preset, return an error, and the pre-existing preset is restored
 	/*! @method NewFactoryPresetSet */
 	virtual OSStatus			NewFactoryPresetSet (const AUPreset & inNewFactoryPreset);
-	
+
 	/*! @method NewCustomPresetSet */
 	virtual OSStatus            NewCustomPresetSet (const AUPreset & inNewCustomPreset);
 
@@ -429,10 +429,10 @@ public:
 	/*! @method GetUIComponentDescs */
 	virtual void				GetUIComponentDescs (ComponentDescription* inDescArray);
 #endif
-	
+
 	/*! @method CopyIconLocation */
 	virtual CFURLRef			CopyIconLocation ();
-	
+
 	// default is no latency, and unimplemented tail time
 	/*! @method GetLatency */
     virtual Float64				GetLatency() {return 0.0;}
@@ -444,18 +444,18 @@ public:
 	/*! @method IsStreamFormatWritable */
 			bool				IsStreamFormatWritable(	AudioUnitScope					scope,
 														AudioUnitElement				element);
-	
+
 	/*! @method StreamFormatWritable */
 	virtual bool				StreamFormatWritable(	AudioUnitScope					scope,
 														AudioUnitElement				element) = 0;
 															// scope will always be input or output
-			
+
 			// pass in a pointer to get the struct, and num channel infos
 			// you can pass in NULL to just get the number
 			// a return value of 0 (the default in AUBase) means the property is not supported...
 	/*! @method SupportedNumChannels */
 	virtual UInt32				SupportedNumChannels (	const AUChannelInfo**			outInfo);
-																												
+
 	/*! @method ValidFormat */
 	virtual bool				ValidFormat(			AudioUnitScope					inScope,
 														AudioUnitElement				inElement,
@@ -466,7 +466,7 @@ public:
 															// native-endian 32-bit float, any sample rate,
 															// any number of channels; override when other
 															// formats are supported.  A subclass's override can
-															// choose to always return true and trap invalid 
+															// choose to always return true and trap invalid
 															// formats in ChangeStreamFormat.
 
 
@@ -489,7 +489,7 @@ public:
 														const CAStreamBasicDescription & inNewFormat);
 															// Will only be called after StreamFormatWritable
 															// and ValidFormat have succeeded.
-															
+
 	// ________________________________________________________________________
 
 #if !CA_USE_AUDIO_PLUGIN_ONLY
@@ -500,7 +500,7 @@ public:
 
 	// ________________________________________________________________________
 	// Methods useful for subclasses
-	
+
 	/*! @method GetScope */
 	AUScope &					GetScope(				AudioUnitScope					inScope)
 	{
@@ -511,10 +511,10 @@ public:
 		}
 		return mScopes[inScope];
 	}
-	
+
 	/*! @method GetScopeExtended */
 	virtual AUScope *			GetScopeExtended (AudioUnitScope inScope) { return NULL; }
-	
+
 	/*! @method GlobalScope */
 	AUScope &					GlobalScope() { return mScopes[kAudioUnitScope_Global]; }
 	/*! @method Inputs */
@@ -527,7 +527,7 @@ public:
 #endif
 	/*! @method Globals */
 	AUElement *					Globals()	{ return mScopes[kAudioUnitScope_Global].GetElement(0); }
-	
+
 	/*! @method SetNumberOfElements */
 	void						SetNumberOfElements(	AudioUnitScope					inScope,
 														UInt32							numElements);
@@ -538,14 +538,14 @@ public:
 	{
 		return GetScope(inScope).GetElement(inElement);
 	}
-	
+
 	/*! @method GetIOElement */
 	AUIOElement *				GetIOElement(			AudioUnitScope 					inScope,
 														AudioUnitElement			 	inElement)
 	{
 		return GetScope(inScope).GetIOElement(inElement);
 	}
-	
+
 	/*! @method SafeGetElement */
 	AUElement *					SafeGetElement(			AudioUnitScope 					inScope,
 														AudioUnitElement			 	inElement)
@@ -558,13 +558,13 @@ public:
 	{
 		return static_cast<AUInputElement *>(Inputs().SafeGetElement(inElement));
 	}
-	
+
 	/*! @method GetOutput */
 	AUOutputElement *			GetOutput(				AudioUnitElement				inElement)
 	{
 		return static_cast<AUOutputElement *>(Outputs().SafeGetElement(inElement));
 	}
-	
+
 #if !CA_BASIC_AU_FEATURES
 	/*! @method GetGroup */
 	AUElement *					GetGroup(				AudioUnitElement				inElement)
@@ -572,7 +572,7 @@ public:
 		return Groups().SafeGetElement(inElement);
 	}
 #endif
-	
+
 	/*! @method PullInput */
 	OSStatus					PullInput(				UInt32	 					inBusNumber,
 														AudioUnitRenderActionFlags &ioActionFlags,
@@ -589,7 +589,7 @@ public:
 	bool						UsesFixedBlockSize() const { return mUsesFixedBlockSize; }
 	/*! @method SetUsesFixedBlockSize */
 	void						SetUsesFixedBlockSize(bool inUsesFixedBlockSize) { mUsesFixedBlockSize = inUsesFixedBlockSize; }
-	
+
 	/*! @method GetVectorUnitType */
 	static SInt32				GetVectorUnitType() { return sVectorUnitType; }
 	/*! @method HasVectorUnit */
@@ -600,12 +600,12 @@ public:
 	static bool					HasSSE2() { return sVectorUnitType >= kVecSSE2; }
 	/*! @method HasSSE3 */
 	static bool					HasSSE3() { return sVectorUnitType >= kVecSSE3; }
-	
+
 	/*! @method AudioUnitAPIVersion */
 	UInt8						AudioUnitAPIVersion() const { return mAudioUnitAPIVersion; }
-	
+
 	/*! @method IsRenderThread */
-	bool						InRenderThread () const 
+	bool						InRenderThread () const
 								{
 #if TARGET_OS_MAC
 									return (mRenderThreadID ? pthread_equal (mRenderThreadID, pthread_self()) : false);
@@ -623,7 +623,7 @@ public:
 
 	/*! @method PropertyChanged */
 	virtual void				PropertyChanged(		AudioUnitPropertyID				inID,
-														AudioUnitScope					inScope, 
+														AudioUnitScope					inScope,
 														AudioUnitElement				inElement);
 
 #if !CA_NO_AU_UI_FEATURES
@@ -634,12 +634,12 @@ public:
 	// as this can save work in the host.
 
 	/*! @method CallHostBeatAndTempo */
-	OSStatus	CallHostBeatAndTempo (Float64				*outCurrentBeat,  
+	OSStatus	CallHostBeatAndTempo (Float64				*outCurrentBeat,
 										Float64				*outCurrentTempo)
 	{
-		return (mHostCallbackInfo.beatAndTempoProc 
-						? (*mHostCallbackInfo.beatAndTempoProc) (mHostCallbackInfo.hostUserData, 
-																	outCurrentBeat, 
+		return (mHostCallbackInfo.beatAndTempoProc
+						? (*mHostCallbackInfo.beatAndTempoProc) (mHostCallbackInfo.hostUserData,
+																	outCurrentBeat,
 																	outCurrentTempo)
 						: -1);
 	}
@@ -650,14 +650,14 @@ public:
 										UInt32            	*outTimeSig_Denominator,
 										Float64           	*outCurrentMeasureDownBeat)
 	{
-		return (mHostCallbackInfo.musicalTimeLocationProc 
+		return (mHostCallbackInfo.musicalTimeLocationProc
 						? (*mHostCallbackInfo.musicalTimeLocationProc) (mHostCallbackInfo.hostUserData,
 																			outDeltaSampleOffsetToNextBeat,
 																			outTimeSig_Numerator,
 																			outTimeSig_Denominator,
 																			outCurrentMeasureDownBeat)
 						: -1);
-	}											
+	}
 
 	/*! @method CallHostTransportState */
 	OSStatus	CallHostTransportState (Boolean 			*outIsPlaying,
@@ -667,7 +667,7 @@ public:
 										Float64 			*outCycleStartBeat,
 										Float64 			*outCycleEndBeat)
 	{
-		return (mHostCallbackInfo.transportStateProc 
+		return (mHostCallbackInfo.transportStateProc
 						? (*mHostCallbackInfo.transportStateProc) (mHostCallbackInfo.hostUserData,
 																		outIsPlaying,
 																		outTransportStateChanged,
@@ -680,7 +680,7 @@ public:
 #endif
 
 	char*						GetLoggingString () const;
-	
+
 	CAMutex*					GetMutex() { return mAUMutex; }
 
 	// ________________________________________________________________________
@@ -698,7 +698,7 @@ public:
 	virtual OSStatus	Start() { return kAudio_UnimplementedError; }
 	/*! @method Stop */
 	virtual OSStatus	Stop() { return kAudio_UnimplementedError; }
-	
+
 #if !CA_BASIC_AU_FEATURES
 #pragma mark -
 #pragma mark AU Music Base Dispatch
@@ -711,38 +711,38 @@ public:
 	/*! @method PrepareInstrument */
 	virtual OSStatus			ReleaseInstrument(MusicDeviceInstrumentID inInstrument) { return kAudio_UnimplementedError; }
 #endif
-	
+
 	// ________________________________________________________________________
 	// ________________________________________________________________________
 	// ________________________________________________________________________
 	// music device/music effect methods -- incomplete
 	/*! @method MIDIEvent */
-	virtual OSStatus	MIDIEvent(		UInt32 						inStatus, 
-										UInt32 						inData1, 
-										UInt32 						inData2, 
+	virtual OSStatus	MIDIEvent(		UInt32 						inStatus,
+										UInt32 						inData1,
+										UInt32 						inData2,
 										UInt32 						inOffsetSampleFrame) { return kAudio_UnimplementedError; }
 
 	/*! @method SysEx */
-	virtual OSStatus	SysEx(			const UInt8 *				inData, 
+	virtual OSStatus	SysEx(			const UInt8 *				inData,
 										UInt32 						inLength) { return kAudio_UnimplementedError;}
-										
+
 	/*! @method StartNote */
-	virtual OSStatus	StartNote(		MusicDeviceInstrumentID 	inInstrument, 
-										MusicDeviceGroupID 			inGroupID, 
-										NoteInstanceID *			outNoteInstanceID, 
-										UInt32 						inOffsetSampleFrame, 
+	virtual OSStatus	StartNote(		MusicDeviceInstrumentID 	inInstrument,
+										MusicDeviceGroupID 			inGroupID,
+										NoteInstanceID *			outNoteInstanceID,
+										UInt32 						inOffsetSampleFrame,
 										const MusicDeviceNoteParams &inParams) { return kAudio_UnimplementedError; }
 
 	/*! @method StopNote */
-	virtual OSStatus	StopNote(		MusicDeviceGroupID 			inGroupID, 
-										NoteInstanceID 				inNoteInstanceID, 
+	virtual OSStatus	StopNote(		MusicDeviceGroupID 			inGroupID,
+										NoteInstanceID 				inNoteInstanceID,
 										UInt32 						inOffsetSampleFrame) { return kAudio_UnimplementedError; }
 #endif
 
 	// ________________________________________________________________________
 	// ________________________________________________________________________
 	// ________________________________________________________________________
-	
+
 protected:
 #pragma mark -
 #pragma mark Implementation methods
@@ -751,7 +751,7 @@ protected:
 	virtual void				ReallocateBuffers();
 									// needs to be called when mMaxFramesPerSlice changes
 	virtual void				DeallocateIOBuffers();
-		
+
 	/*! @method FillInParameterName */
 	static void					FillInParameterName (AudioUnitParameterInfo& ioInfo, CFStringRef inName, bool inShouldRelease)
 	{
@@ -761,25 +761,25 @@ protected:
 			ioInfo.flags |= kAudioUnitParameterFlag_CFNameRelease;
 		CFStringGetCString (inName, ioInfo.name, offsetof (AudioUnitParameterInfo, clumpID), kCFStringEncodingUTF8);
 	}
-	
-	static void					HasClump (AudioUnitParameterInfo& ioInfo, UInt32 inClumpID)				
+
+	static void					HasClump (AudioUnitParameterInfo& ioInfo, UInt32 inClumpID)
 	{
 		ioInfo.clumpID = inClumpID;
 		ioInfo.flags |= kAudioUnitParameterFlag_HasClump;
 	}
-	
+
 	/*! @method SetMaxFramesPerSlice */
 	virtual void				SetMaxFramesPerSlice(UInt32 nFrames);
 
 	/*! @method CanSetMaxFrames */
 	virtual OSStatus			CanSetMaxFrames() const;
-	
+
 	/*! @method WantsRenderThreadID */
 	bool						WantsRenderThreadID () const { return mWantsRenderThreadID; }
-	
+
 	/*! @method SetWantsRenderThreadID */
 	void						SetWantsRenderThreadID (bool inFlag);
-	
+
 	/*! @method SetRenderError */
 	OSStatus					SetRenderError (OSStatus inErr)
 	{
@@ -789,7 +789,7 @@ protected:
 		}
 		return inErr;
 	}
-	
+
 private:
 	/*! @method DoRenderBus */
 	// shared between Render and RenderSlice, inlined to minimize function call overhead
@@ -829,13 +829,13 @@ private:
 									memset (&mCurrentRenderTime, 0, sizeof(mCurrentRenderTime));
 									mCurrentRenderTime.mSampleTime = kNoLastRenderedSampleTime;
 								}
-				
+
 protected:
 	/*! @method GetAudioChannelLayout */
 	virtual UInt32				GetChannelLayoutTags(	AudioUnitScope				scope,
 														AudioUnitElement 			element,
 														AudioChannelLayoutTag *		outLayoutTags);
-														
+
 	/*! @method GetAudioChannelLayout */
 	virtual UInt32				GetAudioChannelLayout(	AudioUnitScope				scope,
 														AudioUnitElement 			element,
@@ -843,13 +843,13 @@ protected:
 														Boolean &					outWritable);
 
 	/*! @method SetAudioChannelLayout */
-	virtual OSStatus			SetAudioChannelLayout(	AudioUnitScope 				scope, 
+	virtual OSStatus			SetAudioChannelLayout(	AudioUnitScope 				scope,
 														AudioUnitElement 			element,
 														const AudioChannelLayout *	inLayout);
 
 	/*! @method RemoveAudioChannelLayout */
 	virtual OSStatus			RemoveAudioChannelLayout(AudioUnitScope scope, AudioUnitElement element);
-	
+
 	/*! @method NeedsToRender */
 	bool						NeedsToRender(			const AudioTimeStamp &		inTimeStamp)
 								{
@@ -858,7 +858,7 @@ protected:
 										mCurrentRenderTime = inTimeStamp;
 									return needsToRender;
 								}
-	
+
 	// Scheduled parameter implementation:
 
 	typedef std::vector<AudioUnitParameterEvent> ParameterEventList;
@@ -869,14 +869,14 @@ protected:
 	// for which the DSP code depends.  ProcessForScheduledParams() will call (potentially repeatedly)
 	// virtual method ProcessScheduledSlice() to perform the actual DSP for a given sub-division of
 	// the buffer.  The job of ProcessForScheduledParams() is to sub-divide the buffer into smaller
-	// pieces according to the scheduled times found in the ParameterEventList (usually coming 
+	// pieces according to the scheduled times found in the ParameterEventList (usually coming
 	// directly from a previous call to ScheduleParameter() ), setting the appropriate immediate or
 	// ramped parameter values for the corresponding scopes and elements, then calling ProcessScheduledSlice()
 	// to do the actual DSP for each of these divisions.
 	virtual OSStatus 	ProcessForScheduledParams(	ParameterEventList		&inParamList,
 															UInt32					inFramesToProcess,
 															void					*inUserData );
-	
+
 	//	This method is called (potentially repeatedly) by ProcessForScheduledParams()
 	//	in order to perform the actual DSP required for this portion of the entire buffer
 	//	being processed.  The entire buffer can be divided up into smaller "slices"
@@ -889,11 +889,11 @@ protected:
 														UInt32				inStartFrameInBuffer,
 														UInt32				inSliceFramesToProcess,
 														UInt32				inTotalBufferFrames ) {return noErr;};	// default impl does nothing...
-	
-	
+
+
 	/*! @method CurrentRenderTime */
 	const AudioTimeStamp &		CurrentRenderTime () const { return mCurrentRenderTime; }
-	
+
 	// ________________________________________________________________________
 	//	Private data members to discourage hacking in subclasses
 private:
@@ -902,23 +902,23 @@ private:
 			mRenderNotify(proc),
 			mRenderNotifyRefCon(ref)
 		{ }
-		
+
 		AURenderCallback			mRenderNotify;
 		void *						mRenderNotifyRefCon;
-		
+
 		bool operator == (const RenderCallback &other) {
 			return this->mRenderNotify == other.mRenderNotify &&
 					this->mRenderNotifyRefCon == other.mRenderNotifyRefCon;
 		}
 	};
 	typedef TThreadSafeList<RenderCallback>	RenderCallbackList;
-	
+
 #if !CA_BASIC_AU_FEATURES
 	enum { kNumScopes = 4 };
 #else
 	enum { kNumScopes = 3 };
 #endif
-	
+
 	/*! @var mElementsCreated */
 	bool						mElementsCreated;
 protected:
@@ -929,7 +929,7 @@ protected:
 private:
 	/*! @var mAudioUnitAPIVersion */
 	UInt8						mAudioUnitAPIVersion;
-	
+
 	/*! @var mInitNumInputEls */
 	const UInt32				mInitNumInputEls;
 	/*! @var mInitNumOutputEls */
@@ -940,36 +940,36 @@ private:
 #endif
 	/*! @var mScopes */
 	AUScope						mScopes[kNumScopes];
-	
+
 	/*! @var mRenderCallbacks */
 	RenderCallbackList			mRenderCallbacks;
 	bool						mRenderCallbacksTouched;
-	
+
 	/*! @var mRenderThreadID */
 #if TARGET_OS_MAC
 	pthread_t					mRenderThreadID;
 #elif TARGET_OS_WIN32
 	UInt32						mRenderThreadID;
 #endif
-	
+
 	/*! @var mWantsRenderThreadID */
 	bool						mWantsRenderThreadID;
-		
+
 	/*! @var mCurrentRenderTime */
 	AudioTimeStamp				mCurrentRenderTime;
-	
+
 	/*! @var mMaxFramesPerSlice */
 	UInt32						mMaxFramesPerSlice;
-	
+
 	/*! @var mLastRenderError */
 	OSStatus					mLastRenderError;
 	/*! @var mCurrentPreset */
 	AUPreset					mCurrentPreset;
-	
+
 protected:
 	/*! @var mUsesFixedBlockSize */
 	bool						mUsesFixedBlockSize;
-	
+
 	struct PropertyListener {
 		AudioUnitPropertyID				propertyID;
 		AudioUnitPropertyListenerProc	listenerProc;
@@ -981,10 +981,10 @@ protected:
 	ParameterEventList			mParamList;
 	/*! @var mPropertyListeners */
 	PropertyListeners			mPropertyListeners;
-	
+
 	/*! @var mBuffersAllocated */
 	bool						mBuffersAllocated;
-	
+
 	/*! @var mLogString */
 	// if this is NOT null, it will contain identifying info about this AU.
 	char*						mLogString;
@@ -1012,7 +1012,7 @@ protected:
 #endif
 };
 
-inline 	OSStatus	AUInputElement::PullInputWithBufferList(	
+inline 	OSStatus	AUInputElement::PullInputWithBufferList(
 												AudioUnitRenderActionFlags &  	ioActionFlags,
 												const AudioTimeStamp &			inTimeStamp,
 												AudioUnitElement				inElement,
@@ -1020,7 +1020,7 @@ inline 	OSStatus	AUInputElement::PullInputWithBufferList(
 												AudioBufferList *				inBufferList)
 {
 	OSStatus theResult;
-	
+
 	if (HasConnection()) {
 			// only support connections for V2 audio units
 #if !CA_USE_AUDIO_PLUGIN_ONLY
@@ -1036,7 +1036,7 @@ inline 	OSStatus	AUInputElement::PullInputWithBufferList(
 			theResult = (mInputProc)(
 							mInputProcRefCon, &ioActionFlags, &inTimeStamp, inElement, nFrames, inBufferList);
 	}
-	
+
 	if (mInputType == kNoInput)	// defense: the guy upstream could have disconnected
 								// it's a horrible thing to do, but may happen!
 		return kAudioUnitErr_NoConnection;
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUDispatch.cpp b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUDispatch.cpp
index 1f0f01c..ed27327 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUDispatch.cpp
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUDispatch.cpp
@@ -2,14 +2,14 @@
      File: AUDispatch.cpp
  Abstract: AUDispatch.h
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #include "AUBase.h"
 #include "CAXException.h"
@@ -101,19 +101,19 @@ OSStatus		AUBase::ComponentEntryDispatch(ComponentParameters *params, AUBase *Th
 			case kAudioUnitRenderSelect:
 				result = (This->AudioUnitAPIVersion() > 1);
 				break;
-				
+
 			default:
 				return ComponentBase::ComponentEntryDispatch(params, This);
 		}
 		break;
-		
+
 	case kAudioUnitInitializeSelect:
 	{
 		CAMutex::Locker lock2(This->GetMutex());
 		result = This->DoInitialize();
 	}
 		break;
-		
+
 	case kAudioUnitUninitializeSelect:
 	{
 		CAMutex::Locker lock2(This->GetMutex());
@@ -136,7 +136,7 @@ OSStatus		AUBase::ComponentEntryDispatch(ComponentParameters *params, AUBase *Th
 			// always assume they're non-null
 			UInt32 dataSize;
 			Boolean writable;
-			
+
 			result = This->DispatchGetPropertyInfo(pinID, pinScope, pinElement, dataSize, writable);
 			if (poutDataSize != NULL)
 				*poutDataSize = dataSize;
@@ -158,7 +158,7 @@ OSStatus		AUBase::ComponentEntryDispatch(ComponentParameters *params, AUBase *Th
 			Boolean writable;
 			char *tempBuffer;
 			void *destBuffer;
-			
+
 			if (pioDataSize == NULL) {
 				ca_debug_string("AudioUnitGetProperty: null size pointer");
 				result = kAudio_ParamError;
@@ -166,12 +166,12 @@ OSStatus		AUBase::ComponentEntryDispatch(ComponentParameters *params, AUBase *Th
 			}
 			if (poutData == NULL) {
 				UInt32 dataSize;
-				
+
 				result = This->DispatchGetPropertyInfo(pinID, pinScope, pinElement, dataSize, writable);
 				*pioDataSize = dataSize;
 				goto finishGetProperty;
 			}
-			
+
 			clientBufferSize = *pioDataSize;
 			if (clientBufferSize == 0)
 			{
@@ -180,13 +180,13 @@ OSStatus		AUBase::ComponentEntryDispatch(ComponentParameters *params, AUBase *Th
 				result = kAudio_ParamError;
 				goto finishGetProperty;
 			}
-			
-			result = This->DispatchGetPropertyInfo(pinID, pinScope, pinElement, 
+
+			result = This->DispatchGetPropertyInfo(pinID, pinScope, pinElement,
 													actualPropertySize, writable);
-			if (result) 
+			if (result)
 				goto finishGetProperty;
-			
-			if (clientBufferSize < actualPropertySize) 
+
+			if (clientBufferSize < actualPropertySize)
 			{
 				tempBuffer = new char[actualPropertySize];
 				destBuffer = tempBuffer;
@@ -194,9 +194,9 @@ OSStatus		AUBase::ComponentEntryDispatch(ComponentParameters *params, AUBase *Th
 				tempBuffer = NULL;
 				destBuffer = poutData;
 			}
-			
+
 			result = This->DispatchGetProperty(pinID, pinScope, pinElement, destBuffer);
-			
+
 			if (result == noErr) {
 				if (clientBufferSize < actualPropertySize && tempBuffer != NULL)
 				{
@@ -213,7 +213,7 @@ OSStatus		AUBase::ComponentEntryDispatch(ComponentParameters *params, AUBase *Th
 
 		}
 		break;
-		
+
 	case kAudioUnitSetPropertySelect:
 		{
 			CAMutex::Locker lock(This->GetMutex());
@@ -222,7 +222,7 @@ OSStatus		AUBase::ComponentEntryDispatch(ComponentParameters *params, AUBase *Th
 			PARAM(AudioUnitElement, pinElement, 2, 5);
 			PARAM(const void *, pinData, 3, 5);
 			PARAM(UInt32, pinDataSize, 4, 5);
-			
+
 			if (pinData && pinDataSize)
 				result = This->DispatchSetProperty(pinID, pinScope, pinElement, pinData, pinDataSize);
 			else {
@@ -247,7 +247,7 @@ OSStatus		AUBase::ComponentEntryDispatch(ComponentParameters *params, AUBase *Th
 
 		}
 		break;
-		
+
 	case kAudioUnitAddPropertyListenerSelect:
 		{
 			CAMutex::Locker lock(This->GetMutex());
@@ -278,7 +278,7 @@ OSStatus		AUBase::ComponentEntryDispatch(ComponentParameters *params, AUBase *Th
 			result = This->RemovePropertyListener(pinID, pinProc, pinProcRefCon, true);
 		}
 		break;
-		
+
 	case kAudioUnitAddRenderNotifySelect:
 		{
 			CAMutex::Locker lock(This->GetMutex());
@@ -344,7 +344,7 @@ OSStatus		AUBase::ComponentEntryDispatch(ComponentParameters *params, AUBase *Th
 				PARAM(UInt32, pinNumberFrames, 3, 5);
 				PARAM(AudioBufferList *, pioData, 4, 5);
 				AudioUnitRenderActionFlags tempFlags;
-				
+
 				if (pinTimeStamp == NULL || pioData == NULL)
 					result = kAudio_ParamError;
 				else {
@@ -354,7 +354,7 @@ OSStatus		AUBase::ComponentEntryDispatch(ComponentParameters *params, AUBase *Th
 					}
 					result = This->DoRender(*pinActionFlags, *pinTimeStamp, pinOutputBusNumber, pinNumberFrames, *pioData);
 				}
-			}			
+			}
 		}
 		break;
 
@@ -385,13 +385,13 @@ OSStatus CMgr_AudioUnitBaseGetParameter(	AUBase *				This,
 											float					*outValue)
 {
 	OSStatus result = AUBase::noErr;
-	
+
 	try {
 		if (This == NULL || outValue == NULL) return kAudio_ParamError;
 		result = This->GetParameter(inID, inScope, inElement, *outValue);
 	}
 	COMPONENT_CATCH
-	
+
 	return result;
 }
 
@@ -403,13 +403,13 @@ OSStatus CMgr_AudioUnitBaseSetParameter(	AUBase * 				This,
 											UInt32					inBufferOffset)
 {
 	OSStatus result = AUBase::noErr;
-	
+
 	try {
 		if (This == NULL) return kAudio_ParamError;
 		result = This->SetParameter(inID, inScope, inElement, inValue, inBufferOffset);
 	}
 	COMPONENT_CATCH
-	
+
 	return result;
 }
 
@@ -421,10 +421,10 @@ OSStatus CMgr_AudioUnitBaseRender(			AUBase *				This,
 											AudioBufferList *		ioData)
 {
 	if (inTimeStamp == NULL || ioData == NULL) return kAudio_ParamError;
-	
+
 	OSStatus result = AUBase::noErr;
 	AudioUnitRenderActionFlags tempFlags;
-	
+
 	try {
 		if (ioActionFlags == NULL) {
 			tempFlags = 0;
@@ -433,6 +433,6 @@ OSStatus CMgr_AudioUnitBaseRender(			AUBase *				This,
 		result = This->DoRender(*ioActionFlags, *inTimeStamp, inBusNumber, inNumberFrames, *ioData);
 	}
 	COMPONENT_CATCH
-	
+
 	return result;
 }
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUDispatch.h b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUDispatch.h
index 5acd962..fcdc29e 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUDispatch.h
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUDispatch.h
@@ -2,14 +2,14 @@
      File: AUDispatch.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #ifndef __AUDispatch_h__
 #define __AUDispatch_h__
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUInputElement.cpp b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUInputElement.cpp
index 2e148e8..688e404 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUInputElement.cpp
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUInputElement.cpp
@@ -2,14 +2,14 @@
      File: AUInputElement.cpp
  Abstract: AUInputElement.h
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #include "AUBase.h"
 
@@ -76,8 +76,8 @@ void	AUInputElement::SetConnection(const AudioUnitConnection &conn)
 	if (conn.sourceAudioUnit == 0) {
 		Disconnect();
 		return;
-	}	
-	
+	}
+
 	mInputType = kFromConnection;
 	mConnection = conn;
 	AllocateBuffer();
@@ -136,16 +136,16 @@ OSStatus		AUInputElement::PullInput(	AudioUnitRenderActionFlags &  	ioActionFlag
 											const AudioTimeStamp &			inTimeStamp,
 											AudioUnitElement				inElement,
 											UInt32							nFrames)
-{	
+{
 	if (!IsActive())
 		return kAudioUnitErr_NoConnection;
-		
+
 	AudioBufferList *pullBuffer;
-	
+
 	if (HasConnection() || !WillAllocateBuffer())
 		pullBuffer = &mIOBuffer.PrepareNullBuffer(mStreamFormat, nFrames);
 	else
 		pullBuffer = &mIOBuffer.PrepareBuffer(mStreamFormat, nFrames);
-	
+
 	return PullInputWithBufferList (ioActionFlags, inTimeStamp, inElement, nFrames, pullBuffer);
 }
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUInputElement.h b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUInputElement.h
index 891e4c6..128efe5 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUInputElement.h
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUInputElement.h
@@ -2,14 +2,14 @@
      File: AUInputElement.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #ifndef __AUInput_h__
 #define __AUInput_h__
@@ -53,7 +53,7 @@
 /*! @class AUInputElement */
 class AUInputElement : public AUIOElement {
 public:
-	
+
 	/*! @ctor AUInputElement */
 						AUInputElement(AUBase *audioUnit);
 	/*! @dtor ~AUInputElement */
@@ -103,7 +103,7 @@ protected:
 	AURenderCallback			mInputProc;
 	/*! @var mInputProcRefCon */
 	void *						mInputProcRefCon;
-	
+
 	// if from connection:
 	/*! @var mConnection */
 	AudioUnitConnection			mConnection;
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUOutputElement.cpp b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUOutputElement.cpp
index 5eb34a1..080fa63 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUOutputElement.cpp
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUOutputElement.cpp
@@ -2,14 +2,14 @@
      File: AUOutputElement.cpp
  Abstract: AUOutputElement.h
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,14 +40,14 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #include "AUOutputElement.h"
 #include "AUBase.h"
 
-AUOutputElement::AUOutputElement(AUBase *audioUnit) : 
+AUOutputElement::AUOutputElement(AUBase *audioUnit) :
 	AUIOElement(audioUnit)
 {
 	AllocateBuffer();
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUOutputElement.h b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUOutputElement.h
index 3e6a938..42ae842 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUOutputElement.h
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUOutputElement.h
@@ -2,14 +2,14 @@
      File: AUOutputElement.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #ifndef __AUOutput_h__
 #define __AUOutput_h__
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUPlugInDispatch.cpp b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUPlugInDispatch.cpp
index 3bab198..c75d208 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUPlugInDispatch.cpp
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUPlugInDispatch.cpp
@@ -2,14 +2,14 @@
      File: AUPlugInDispatch.cpp
  Abstract: AUPlugInDispatch.h
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #include "AUPlugInDispatch.h"
 #include "CAXException.h"
@@ -83,7 +83,7 @@ static OSStatus AUMethodGetPropertyInfo(void *self, AudioUnitPropertyID prop, Au
 	try {
 		UInt32 dataSize = 0;        // 13517289 GetPropetyInfo was returning an uninitialized value when there is an error. This is a problem for auval.
 		Boolean writable = false;
-		
+
 		AUI_LOCK
 		result = AUI->DispatchGetPropertyInfo(prop, scope, elem, dataSize, writable);
 		if (outDataSize != NULL)
@@ -103,7 +103,7 @@ static OSStatus AUMethodGetProperty(void *self, AudioUnitPropertyID inID, AudioU
 		Boolean writable;
 		char *tempBuffer;
 		void *destBuffer;
-		
+
 		AUI_LOCK
 		if (ioDataSize == NULL) {
 			ca_debug_string("AudioUnitGetProperty: null size pointer");
@@ -112,12 +112,12 @@ static OSStatus AUMethodGetProperty(void *self, AudioUnitPropertyID inID, AudioU
 		}
 		if (outData == NULL) {
 			UInt32 dataSize;
-			
+
 			result = AUI->DispatchGetPropertyInfo(inID, inScope, inElement, dataSize, writable);
 			*ioDataSize = dataSize;
 			goto finishGetProperty;
 		}
-		
+
 		clientBufferSize = *ioDataSize;
 		if (clientBufferSize == 0)
 		{
@@ -126,12 +126,12 @@ static OSStatus AUMethodGetProperty(void *self, AudioUnitPropertyID inID, AudioU
 			result = kAudio_ParamError;
 			goto finishGetProperty;
 		}
-		
+
 		result = AUI->DispatchGetPropertyInfo(inID, inScope, inElement, actualPropertySize, writable);
-		if (result != noErr) 
+		if (result != noErr)
 			goto finishGetProperty;
-		
-		if (clientBufferSize < actualPropertySize) 
+
+		if (clientBufferSize < actualPropertySize)
 		{
 			tempBuffer = new char[actualPropertySize];
 			destBuffer = tempBuffer;
@@ -139,9 +139,9 @@ static OSStatus AUMethodGetProperty(void *self, AudioUnitPropertyID inID, AudioU
 			tempBuffer = NULL;
 			destBuffer = outData;
 		}
-		
+
 		result = AUI->DispatchGetProperty(inID, inScope, inElement, destBuffer);
-		
+
 		if (result == noErr) {
 			if (clientBufferSize < actualPropertySize && tempBuffer != NULL)
 			{
@@ -285,7 +285,7 @@ static OSStatus AUMethodRender(void *self, AudioUnitRenderActionFlags *ioActionF
 #endif
 		// this is a processing method; no lock
 		AudioUnitRenderActionFlags tempFlags;
-		
+
 		if (inTimeStamp == NULL || ioData == NULL)
 			result = kAudio_ParamError;
 		else {
@@ -313,7 +313,7 @@ static OSStatus AUMethodComplexRender(void *self, AudioUnitRenderActionFlags *io
 #endif
 		// this is a processing method; no lock
 		AudioUnitRenderActionFlags tempFlags;
-		
+
 		if (inTimeStamp == NULL || ioData == NULL)
 			result = kAudio_ParamError;
 		else {
@@ -362,7 +362,7 @@ static OSStatus AUMethodProcess (void *self, AudioUnitRenderActionFlags *ioActio
 			if (*ioActionFlags & (1 << 9)/*kAudioUnitRenderAction_DoNotCheckRenderArgs*/)
 				doParamCheck = false;
 		}
-		
+
 		if (doParamCheck && (inTimeStamp == NULL || ioData == NULL))
 			result = kAudio_ParamError;
 		else {
@@ -380,15 +380,15 @@ static OSStatus AUMethodProcess (void *self, AudioUnitRenderActionFlags *ioActio
 static OSStatus AUMethodProcessMultiple (void *self, AudioUnitRenderActionFlags *ioActionFlags, const AudioTimeStamp *inTimeStamp, UInt32 inNumberFrames, UInt32 inNumberInputBufferLists, const AudioBufferList **inInputBufferLists, UInt32 inNumberOutputBufferLists, AudioBufferList **ioOutputBufferLists)
 {
 	OSStatus result = noErr;
-	
+
 #if !TARGET_OS_IPHONE
 	try {
 #endif
 		// this is a processing method; no lock
 		bool doParamCheck = true;
-		
+
 		AudioUnitRenderActionFlags tempFlags;
-		
+
 		if (ioActionFlags == NULL) {
 			tempFlags = 0;
 			ioActionFlags = &tempFlags;
@@ -402,7 +402,7 @@ static OSStatus AUMethodProcessMultiple (void *self, AudioUnitRenderActionFlags
 		else {
 			result = AUI->DoProcessMultiple(*ioActionFlags, *inTimeStamp, inNumberFrames, inNumberInputBufferLists, inInputBufferLists, inNumberOutputBufferLists, ioOutputBufferLists);
 		}
-		
+
 #if !TARGET_OS_IPHONE
 	}
 	COMPONENT_CATCH
@@ -465,7 +465,7 @@ static OSStatus AUMethodStartNote(void *self, MusicDeviceInstrumentID inInstrume
 	OSStatus result = noErr;
 	try {
 		// this is a potential render-time method; no lock
-		if (inParams == NULL || outNoteInstanceID == NULL) 
+		if (inParams == NULL || outNoteInstanceID == NULL)
 			result = kAudio_ParamError;
 		else
 			result = AUI->StartNote(inInstrument, inGroupID, outNoteInstanceID, inOffsetSampleFrame, *inParams);
@@ -559,10 +559,10 @@ AudioComponentMethod AUComplexOutputLookup::Lookup (SInt16 selector)
 {
 	AudioComponentMethod method = AUBaseLookup::Lookup(selector);
 	if (method) return method;
-	
+
 	method = AUOutputLookup::Lookup(selector);
 	if (method) return method;
-	
+
 	if (selector == kAudioUnitComplexRenderSelect)
 		return (AudioComponentMethod)AUMethodComplexRender;
 	return NULL;
@@ -572,10 +572,10 @@ AudioComponentMethod AUBaseProcessLookup::Lookup (SInt16 selector)
 {
 	AudioComponentMethod method = AUBaseLookup::Lookup(selector);
 	if (method) return method;
-	
+
 	if (selector == kAudioUnitProcessSelect)
 		return (AudioComponentMethod)AUMethodProcess;
-	
+
 	return NULL;
 }
 
@@ -583,10 +583,10 @@ AudioComponentMethod AUBaseProcessMultipleLookup::Lookup (SInt16 selector)
 {
 	AudioComponentMethod method = AUBaseLookup::Lookup(selector);
 	if (method) return method;
-    
+
 	if (selector == kAudioUnitProcessMultipleSelect)
 		return (AudioComponentMethod)AUMethodProcessMultiple;
-	
+
 	return NULL;
 }
 
@@ -597,7 +597,7 @@ AudioComponentMethod AUBaseProcessAndMultipleLookup::Lookup (SInt16 selector)
 
 	method = AUBaseProcessMultipleLookup::Lookup(selector);
 	if (method) return method;
-    
+
 	method = AUBaseProcessLookup::Lookup(selector);
 	if (method) return method;
 
@@ -620,7 +620,7 @@ AudioComponentMethod AUMIDILookup::Lookup (SInt16 selector)
 {
 	AudioComponentMethod method = AUBaseLookup::Lookup(selector);
 	if (method) return method;
-	
+
 	return MIDI_Lookup(selector);
 }
 
@@ -628,7 +628,7 @@ AudioComponentMethod AUMIDIProcessLookup::Lookup (SInt16 selector)
 {
 	AudioComponentMethod method = AUBaseProcessLookup::Lookup(selector);
 	if (method) return method;
-	
+
 	return MIDI_Lookup(selector);
 }
 
@@ -644,7 +644,7 @@ AudioComponentMethod AUMusicLookup::Lookup (SInt16 selector)
 		case kMusicDevicePrepareInstrumentSelect:	return (AudioComponentMethod)AUMethodPrepareInstrument;
 		case kMusicDeviceReleaseInstrumentSelect:	return (AudioComponentMethod)AUMethodReleaseInstrument;
 #endif
-		default:		
+		default:
 			break;
 	}
 	return MIDI_Lookup (selector);
@@ -656,10 +656,10 @@ AudioComponentMethod AUAuxBaseLookup::Lookup (SInt16 selector)
 		case kAudioUnitGetPropertyInfoSelect:	return (AudioComponentMethod)AUMethodGetPropertyInfo;
 		case kAudioUnitGetPropertySelect:		return (AudioComponentMethod)AUMethodGetProperty;
 		case kAudioUnitSetPropertySelect:		return (AudioComponentMethod)AUMethodSetProperty;
-            
+
 		case kAudioUnitGetParameterSelect:		return (AudioComponentMethod)AUMethodGetParameter;
 		case kAudioUnitSetParameterSelect:		return (AudioComponentMethod)AUMethodSetParameter;
-            
+
 		default:
 			break;
 	}
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUPlugInDispatch.h b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUPlugInDispatch.h
index 6ebea75..1ce471b 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUPlugInDispatch.h
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUPlugInDispatch.h
@@ -2,14 +2,14 @@
      File: AUPlugInDispatch.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #ifndef __AUPlugInBase_h__
 #define __AUPlugInBase_h__
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUScopeElement.cpp b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUScopeElement.cpp
index 24bd18e..99d359f 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUScopeElement.cpp
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUScopeElement.cpp
@@ -2,14 +2,14 @@
      File: AUScopeElement.cpp
  Abstract: AUScopeElement.h
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #include "AUScopeElement.h"
 #include "AUBase.h"
@@ -57,7 +57,7 @@
 //
 void	AUElement::UseIndexedParameters(int inNumberOfParameters)
 {
-	mIndexedParameters.resize (inNumberOfParameters);	
+	mIndexedParameters.resize (inNumberOfParameters);
 	mUseIndexedParameters = true;
 }
 
@@ -69,12 +69,12 @@ void	AUElement::UseIndexedParameters(int inNumberOfParameters)
 inline ParameterMapEvent&	AUElement::GetParamEvent(AudioUnitParameterID paramID)
 {
 	ParameterMapEvent *event;
-	
+
 	if(mUseIndexedParameters)
 	{
 		if(paramID >= mIndexedParameters.size() )
 			COMPONENT_THROW(kAudioUnitErr_InvalidParameter);
-		
+
 		event = &mIndexedParameters[paramID];
 	}
 	else
@@ -82,10 +82,10 @@ inline ParameterMapEvent&	AUElement::GetParamEvent(AudioUnitParameterID paramID)
 		ParameterMap::iterator i = mParameters.find(paramID);
 		if (i == mParameters.end())
 			COMPONENT_THROW(kAudioUnitErr_InvalidParameter);
-			
+
 		event = &(*i).second;
 	}
-	
+
 	return *event;
 }
 
@@ -95,19 +95,19 @@ inline ParameterMapEvent&	AUElement::GetParamEvent(AudioUnitParameterID paramID)
 //	returns whether the specified paramID is known to the element
 //
 bool		AUElement::HasParameterID (AudioUnitParameterID paramID) const
-{	
+{
 	if(mUseIndexedParameters)
 	{
 		if(paramID >= mIndexedParameters.size() )
 			return false;
-		
+
 		return true;
 	}
-	
+
 	ParameterMap::const_iterator i = mParameters.find(paramID);
 	if (i == mParameters.end())
 		return false;
-		
+
 	return true;
 }
 
@@ -118,7 +118,7 @@ bool		AUElement::HasParameterID (AudioUnitParameterID paramID) const
 AudioUnitParameterValue		AUElement::GetParameter(AudioUnitParameterID paramID)
 {
 	ParameterMapEvent &event = GetParamEvent(paramID);
-	
+
 	return event.GetValue();
 }
 
@@ -132,7 +132,7 @@ void			AUElement::GetRampSliceStartEnd(	AudioUnitParameterID		paramID,
 
 {
 	ParameterMapEvent &event = GetParamEvent(paramID);
-		
+
 	// works even if the value is constant (immediate parameter value)
 	event.GetRampSliceStartEnd(outStartValue, outEndValue, outValuePerFrameDelta );
 }
@@ -143,7 +143,7 @@ AudioUnitParameterValue			AUElement::GetEndValue(	AudioUnitParameterID		paramID)
 
 {
 	ParameterMapEvent &event = GetParamEvent(paramID);
-		
+
 	// works even if the value is constant (immediate parameter value)
 	return event.GetEndValue();
 }
@@ -160,21 +160,21 @@ void			AUElement::SetParameter(AudioUnitParameterID paramID, AudioUnitParameterV
 	else
 	{
 		ParameterMap::iterator i = mParameters.find(paramID);
-	
+
 		if (i == mParameters.end())
 		{
 			if (mAudioUnit->IsInitialized() && !okWhenInitialized) {
 				// The AU should not be creating new parameters once initialized.
-				// If a client tries to set an undefined parameter, we could throw as follows, 
+				// If a client tries to set an undefined parameter, we could throw as follows,
 				// but this might cause a regression. So it is better to just fail silently.
 				// COMPONENT_THROW(kAudioUnitErr_InvalidParameter);
 #if DEBUG
-				fprintf(stderr, "WARNING: %s SetParameter for undefined param ID %d while initialized. Ignoring..\n", 
+				fprintf(stderr, "WARNING: %s SetParameter for undefined param ID %d while initialized. Ignoring..\n",
 								mAudioUnit->GetLoggingString(), (int)paramID);
 #endif
 			} else {
 				// create new entry in map for the paramID (only happens first time)
-				ParameterMapEvent event(inValue);		
+				ParameterMapEvent event(inValue);
 				mParameters[paramID] = event;
 			}
 		}
@@ -203,21 +203,21 @@ void			AUElement::SetScheduledEvent(	AudioUnitParameterID 			paramID,
 	else
 	{
 		ParameterMap::iterator i = mParameters.find(paramID);
-	
+
 		if (i == mParameters.end())
 		{
 			if (mAudioUnit->IsInitialized() && !okWhenInitialized) {
 				// The AU should not be creating new parameters once initialized.
-				// If a client tries to set an undefined parameter, we could throw as follows, 
+				// If a client tries to set an undefined parameter, we could throw as follows,
 				// but this might cause a regression. So it is better to just fail silently.
 				// COMPONENT_THROW(kAudioUnitErr_InvalidParameter);
 #if DEBUG
-				fprintf(stderr, "WARNING: %s SetScheduledEvent for undefined param ID %d while initialized. Ignoring..\n", 
+				fprintf(stderr, "WARNING: %s SetScheduledEvent for undefined param ID %d while initialized. Ignoring..\n",
 								mAudioUnit->GetLoggingString(), (int)paramID);
 #endif
 			} else {
 				// create new entry in map for the paramID (only happens first time)
-				ParameterMapEvent event(inEvent, inSliceOffsetInBuffer, inSliceDurationFrames);		
+				ParameterMapEvent event(inEvent, inSliceOffsetInBuffer, inSliceDurationFrames);
 				mParameters[paramID] = event;
 			}
 		}
@@ -225,7 +225,7 @@ void			AUElement::SetScheduledEvent(	AudioUnitParameterID 			paramID,
 		{
 			// paramID already exists in map so simply change its value
 			ParameterMapEvent &event = (*i).second;
-			
+
 			event.SetScheduledEvent(inEvent, inSliceOffsetInBuffer, inSliceDurationFrames );
 		}
 	}
@@ -259,7 +259,7 @@ void			AUElement::SaveState(CFMutableDataRef data)
 		UInt32 nparams = static_cast<UInt32>(mIndexedParameters.size());
 		UInt32 theData = CFSwapInt32HostToBig(nparams);
 		CFDataAppendBytes(data, (UInt8 *)&theData, sizeof(nparams));
-	
+
 		for (UInt32 i = 0; i < nparams; i++)
 		{
 			struct {
@@ -267,12 +267,12 @@ void			AUElement::SaveState(CFMutableDataRef data)
 				//CFSwappedFloat32	value; crashes gcc3 PFE
 				UInt32				value;	// really a big-endian float
 			} entry;
-			
+
 			entry.paramID = CFSwapInt32HostToBig(i);
-	
+
 			AudioUnitParameterValue v = mIndexedParameters[i].GetValue();
 			entry.value = CFSwapInt32HostToBig(*(UInt32 *)&v );
-	
+
 			CFDataAppendBytes(data, (UInt8 *)&entry, sizeof(entry));
 		}
 	}
@@ -280,19 +280,19 @@ void			AUElement::SaveState(CFMutableDataRef data)
 	{
 		UInt32 nparams = CFSwapInt32HostToBig(static_cast<uint32_t>(mParameters.size()));
 		CFDataAppendBytes(data, (UInt8 *)&nparams, sizeof(nparams));
-	
+
 		for (ParameterMap::iterator i = mParameters.begin(); i != mParameters.end(); ++i) {
 			struct {
 				UInt32				paramID;
 				//CFSwappedFloat32	value; crashes gcc3 PFE
 				UInt32				value;	// really a big-endian float
 			} entry;
-			
+
 			entry.paramID = CFSwapInt32HostToBig((*i).first);
-	
+
 			AudioUnitParameterValue v = (*i).second.GetValue();
 			entry.value = CFSwapInt32HostToBig(*(UInt32 *)&v );
-	
+
 			CFDataAppendBytes(data, (UInt8 *)&entry, sizeof(entry));
 		}
 	}
@@ -306,20 +306,20 @@ const UInt8 *	AUElement::RestoreState(const UInt8 *state)
 	const UInt8 *p = state;
 	UInt32 nparams = CFSwapInt32BigToHost(*(UInt32 *)p);
 	p += sizeof(UInt32);
-	
+
 	for (UInt32 i = 0; i < nparams; ++i) {
 		struct {
 			AudioUnitParameterID		paramID;
 			AudioUnitParameterValue		value;
 		} entry;
-		
+
 		entry.paramID = CFSwapInt32BigToHost(*(UInt32 *)p);
 		p += sizeof(UInt32);
 		FloatInt32 temp;
 		temp.i = CFSwapInt32BigToHost(*(UInt32 *)p);
 		entry.value = temp.f;
 		p += sizeof(AudioUnitParameterValue);
-		
+
 		SetParameter(entry.paramID, entry.value);
 	}
 	return p;
@@ -327,10 +327,10 @@ const UInt8 *	AUElement::RestoreState(const UInt8 *state)
 
 //_____________________________________________________________________________
 //
-void	AUElement::SetName (CFStringRef inName) 
-{ 
+void	AUElement::SetName (CFStringRef inName)
+{
 	if (mElementName) CFRelease (mElementName);
-	mElementName = inName; 
+	mElementName = inName;
 	if (mElementName) CFRetain (mElementName);
 }
 
@@ -362,9 +362,9 @@ void			AUIOElement::AllocateBuffer(UInt32 inFramesToAllocate)
 	if (GetAudioUnit()->HasBegunInitializing())
 	{
 		UInt32 framesToAllocate = inFramesToAllocate > 0 ? inFramesToAllocate : GetAudioUnit()->GetMaxFramesPerSlice();
-		
+
 //		printf ("will allocate: %d\n", (int)((mWillAllocate && NeedsBufferSpace()) ? framesToAllocate : 0));
-		
+
 		mIOBuffer.Allocate(mStreamFormat, (mWillAllocate && NeedsBufferSpace()) ? framesToAllocate : 0);
 	}
 }
@@ -381,21 +381,21 @@ void			AUIOElement::DeallocateBuffer()
 //		AudioChannelLayout support
 
 // outLayoutTagsPtr WILL be NULL if called to find out how many
-// layouts that Audio Unit will report 
+// layouts that Audio Unit will report
 // return 0 (ie. NO channel layouts) if the AU doesn't require channel layout knowledge
 UInt32		AUIOElement::GetChannelLayoutTags (AudioChannelLayoutTag		*outLayoutTagsPtr)
 {
 	return 0;
 }
-		
-// As the AudioChannelLayout can be a variable length structure 
+
+// As the AudioChannelLayout can be a variable length structure
 // (though in most cases it won't be!!!)
 // The size of the ACL is always returned by the method
-// if outMapPtr is NOT-NULL, then AU should copy into this pointer (outMapPtr) the current ACL that it has in use. 
+// if outMapPtr is NOT-NULL, then AU should copy into this pointer (outMapPtr) the current ACL that it has in use.
 // the AU should also return whether the property is writable (that is the client can provide any arbitrary ACL that the audio unit will then honour)
 // or if the property is read only - which is the generally preferred mode.
 // If the AU doesn't require an AudioChannelLayout, then just return 0.
-UInt32		AUIOElement::GetAudioChannelLayout (AudioChannelLayout		*outMapPtr, 
+UInt32		AUIOElement::GetAudioChannelLayout (AudioChannelLayout		*outMapPtr,
 											Boolean				&outWritable)
 {
 	return 0;
@@ -500,7 +500,7 @@ bool	AUScope::RestoreElementNames (CFDictionaryRef& inNameDict)
 	//first we have to see if we have enough elements
 	bool didAddElements = false;
 	unsigned int maxElNum = GetNumberOfElements();
-	
+
 	int dictSize = static_cast<int>(CFDictionaryGetCount(inNameDict));
 	CFStringRef * keys = (CFStringRef*)CA_malloc (dictSize * sizeof (CFStringRef));
 	CFDictionaryGetKeysAndValues (inNameDict, reinterpret_cast<const void**>(keys), NULL);
@@ -519,7 +519,7 @@ bool	AUScope::RestoreElementNames (CFDictionaryRef& inNameDict)
         }
 	}
 	free (keys);
-	
+
 	return didAddElements;
 }
 
@@ -534,11 +534,11 @@ void    AUScope::SaveState(CFMutableDataRef data)
                 UInt32	scope;
                 UInt32	element;
             } hdr;
-            
+
             hdr.scope = CFSwapInt32HostToBig(GetScope());
             hdr.element = CFSwapInt32HostToBig(ielem);
             CFDataAppendBytes(data, (UInt8 *)&hdr, sizeof(hdr));
-            
+
             element->SaveState(data);
         }
     }
@@ -556,10 +556,10 @@ const UInt8 *	AUScope::RestoreState(const UInt8 *state)
         } entry;
         UInt32 nparams = CFSwapInt32BigToHost(*(UInt32 *)p);
         p += sizeof(UInt32);
-        
+
         p += nparams * sizeof(entry);
     } else
         p = element->RestoreState(p);
-    
+
     return p;
 }
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUScopeElement.h b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUScopeElement.h
index 47ebe2f..ae493f2 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUScopeElement.h
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/AUScopeElement.h
@@ -2,14 +2,14 @@
      File: AUScopeElement.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #ifndef __AUScopeElement_h__
 #define __AUScopeElement_h__
@@ -69,15 +69,15 @@ class ParameterMapEvent
 {
 public:
 /*! @ctor ParameterMapEvent */
-	ParameterMapEvent() 
-		: mEventType(kParameterEvent_Immediate), mBufferOffset(0), mDurationInFrames(0), mValue1(0.0f), mValue2(0.0f), mSliceDurationFrames(0) 
+	ParameterMapEvent()
+		: mEventType(kParameterEvent_Immediate), mBufferOffset(0), mDurationInFrames(0), mValue1(0.0f), mValue2(0.0f), mSliceDurationFrames(0)
 		{}
 
 /*! @ctor ParameterMapEvent */
 	ParameterMapEvent(AudioUnitParameterValue inValue)
-		: mEventType(kParameterEvent_Immediate), mBufferOffset(0), mDurationInFrames(0), mValue1(inValue), mValue2(inValue), mSliceDurationFrames(0) 
+		: mEventType(kParameterEvent_Immediate), mBufferOffset(0), mDurationInFrames(0), mValue1(inValue), mValue2(inValue), mSliceDurationFrames(0)
 		{}
-		
+
 	// constructor for scheduled event
 /*! @ctor ParameterMapEvent */
 	ParameterMapEvent(	const AudioUnitParameterEvent 	&inEvent,
@@ -86,7 +86,7 @@ public:
 	{
 		SetScheduledEvent(inEvent, inSliceOffsetInBuffer, inSliceDurationFrames );
 	};
-	
+
 /*! @method SetScheduledEvent */
 	void SetScheduledEvent(	const AudioUnitParameterEvent 	&inEvent,
 							UInt32 							inSliceOffsetInBuffer,
@@ -94,7 +94,7 @@ public:
 	{
 		mEventType = inEvent.eventType;
 		mSliceDurationFrames = inSliceDurationFrames;
-		
+
 		if(mEventType == kParameterEvent_Immediate )
 		{
 			// constant immediate value for the whole slice
@@ -111,9 +111,9 @@ public:
 			mValue2 			= 	inEvent.eventValues.ramp.endValue;
 		}
 	};
-	
-	
-	
+
+
+
 /*! @method GetEventType */
 	AUParameterEventType		GetEventType() const {return mEventType;};
 
@@ -122,13 +122,13 @@ public:
 /*! @method GetEndValue */
 	AudioUnitParameterValue		GetEndValue() const {return mValue2;};	// only valid if immediate event type
 /*! @method SetValue */
-	void						SetValue(AudioUnitParameterValue inValue) 
+	void						SetValue(AudioUnitParameterValue inValue)
 								{
-									mEventType = kParameterEvent_Immediate; 
-									mValue1 = inValue; 
+									mEventType = kParameterEvent_Immediate;
+									mValue1 = inValue;
 									mValue2 = inValue;
 								}
-	
+
 	// interpolates the start and end values corresponding to the current processing slice
 	// most ramp parameter implementations will want to use this method
 	// the start value will correspond to the start of the slice
@@ -140,7 +140,7 @@ public:
 	{
 		if (mEventType == kParameterEvent_Ramped) {
 			outValuePerFrameDelta = (mValue2 - mValue1) / mDurationInFrames;
-		
+
 			outStartValue = mValue1 + outValuePerFrameDelta * (-mBufferOffset);	// corresponds to frame 0 of this slice
 			outEndValue = outStartValue +  outValuePerFrameDelta * mSliceDurationFrames;
 		} else {
@@ -178,15 +178,15 @@ public:
 	}
 #endif
 
-private:	
+private:
 	AUParameterEventType		mEventType;
-	
+
 	SInt32						mBufferOffset;		// ramp start offset relative to start of this slice (may be negative)
 	UInt32						mDurationInFrames;	// total duration of ramp parameter
 	AudioUnitParameterValue     mValue1;				// value if immediate : startValue if ramp
 	AudioUnitParameterValue		mValue2;				// endValue (only used for ramp)
-	
-	UInt32					mSliceDurationFrames;	// duration of this processing slice 
+
+	UInt32					mSliceDurationFrames;	// duration of this processing slice
 };
 
 
@@ -201,10 +201,10 @@ public:
 /*! @ctor AUElement */
 								AUElement(AUBase *audioUnit) : mAudioUnit(audioUnit),
 									mUseIndexedParameters(false), mElementName(0) { }
-	
+
 /*! @dtor ~AUElement */
 	virtual						~AUElement() { if (mElementName) CFRelease (mElementName); }
-	
+
 /*! @method GetNumberOfParameters */
 	virtual UInt32				GetNumberOfParameters()
 	{
@@ -214,12 +214,12 @@ public:
 	virtual void				GetParameterList(AudioUnitParameterID *outList);
 /*! @method HasParameterID */
 	bool						HasParameterID (AudioUnitParameterID paramID) const;
-	
+
 /*! @method GetParameter */
 	AudioUnitParameterValue		GetParameter(AudioUnitParameterID paramID);
 /*! @method SetParameter */
 	void						SetParameter(AudioUnitParameterID paramID, AudioUnitParameterValue value, bool okWhenInitialized = false);
-	// Only set okWhenInitialized to true when you know the outside world cannot access this element. Otherwise the parameter map could get corrupted. 
+	// Only set okWhenInitialized to true when you know the outside world cannot access this element. Otherwise the parameter map could get corrupted.
 
 	// interpolates the start and end values corresponding to the current processing slice
 	// most ramp parameter implementations will want to use this method
@@ -228,7 +228,7 @@ public:
 													AudioUnitParameterValue &	outStartValue,
 													AudioUnitParameterValue &	outEndValue,
 													AudioUnitParameterValue &	outValuePerFrameDelta );
-													
+
 /*! @method GetEndValue */
 	AudioUnitParameterValue		GetEndValue(	AudioUnitParameterID		paramID);
 
@@ -238,7 +238,7 @@ public:
 													UInt32 							inSliceOffsetInBuffer,
 													UInt32							inSliceDurationFrames,
 													bool							okWhenInitialized = false );
-	// Only set okWhenInitialized to true when you know the outside world cannot access this element. Otherwise the parameter map could get corrupted. 
+	// Only set okWhenInitialized to true when you know the outside world cannot access this element. Otherwise the parameter map could get corrupted.
 
 
 /*! @method GetAudioUnit */
@@ -259,13 +259,13 @@ public:
 
 /*! @method AsIOElement*/
 	virtual AUIOElement*		AsIOElement () { return NULL; }
-	
+
 protected:
 	inline ParameterMapEvent&	GetParamEvent(AudioUnitParameterID paramID);
-	
+
 private:
 	typedef std::map<AudioUnitParameterID, ParameterMapEvent, std::less<AudioUnitParameterID> > ParameterMap;
-	
+
 /*! @var mAudioUnit */
 	AUBase *						mAudioUnit;
 /*! @var mParameters */
@@ -275,7 +275,7 @@ private:
 	bool							mUseIndexedParameters;
 /*! @var mIndexedParameters */
 	std::vector<ParameterMapEvent>	mIndexedParameters;
-	
+
 /*! @var mElementName */
 	CFStringRef						mElementName;
 };
@@ -292,7 +292,7 @@ public:
 
 /*! @method GetStreamFormat */
 	const CAStreamBasicDescription &GetStreamFormat() const { return mStreamFormat; }
-	
+
 /*! @method SetStreamFormat */
 	virtual OSStatus			SetStreamFormat(const CAStreamBasicDescription &desc);
 
@@ -304,14 +304,14 @@ public:
 	virtual bool				NeedsBufferSpace() const = 0;
 
 /*! @method SetWillAllocateBuffer */
-	void						SetWillAllocateBuffer(bool inFlag) { 
-									mWillAllocate = inFlag; 
+	void						SetWillAllocateBuffer(bool inFlag) {
+									mWillAllocate = inFlag;
 								}
 /*! @method WillAllocateBuffer */
-	bool						WillAllocateBuffer() const { 
-									return mWillAllocate; 
+	bool						WillAllocateBuffer() const {
+									return mWillAllocate;
 								}
-	
+
 /*! @method UseExternalBuffer */
 	void						UseExternalBuffer(const AudioUnitExternalBuffer &buf) {
 									mIOBuffer.UseExternalBuffer(mStreamFormat, buf);
@@ -392,7 +392,7 @@ public:
 
 /*! @method SetAudioChannelLayout */
 	virtual OSStatus			SetAudioChannelLayout (const AudioChannelLayout &inData);
-		
+
 /*! @method RemoveAudioChannelLayout */
 	virtual OSStatus			RemoveAudioChannelLayout ();
 
@@ -416,32 +416,32 @@ protected:
 class AUScopeDelegate {
 public:
 /*! @ctor AUScopeDelegate */
-					AUScopeDelegate() : mCreator(NULL), mScope(0) { }	
+					AUScopeDelegate() : mCreator(NULL), mScope(0) { }
 /*! @dtor ~AUScopeDelegate */
 					virtual ~AUScopeDelegate() {}
-	
+
 /*! @method Initialize */
-	void					Initialize(	AUBase *creator, 
-										AudioUnitScope scope, 
+	void					Initialize(	AUBase *creator,
+										AudioUnitScope scope,
 										UInt32 numElements)
 	{
 		mCreator = creator;
 		mScope = scope;
 		SetNumberOfElements(numElements);
 	}
-	
+
 /*! @method SetNumberOfElements */
 	virtual void			SetNumberOfElements(UInt32 numElements) = 0;
-	
+
 /*! @method GetNumberOfElements */
 	virtual UInt32			GetNumberOfElements()	 = 0;
-	
+
 /*! @method GetElement */
 	virtual AUElement *		GetElement(UInt32 elementIndex) = 0;
-	
+
 	AUBase *			GetCreator() const { return mCreator; }
 	AudioUnitScope		GetScope() const { return mScope; }
-	
+
 
 private:
 /*! @var mCreator */
@@ -458,13 +458,13 @@ private:
 class AUScope {
 public:
 /*! @ctor AUScope */
-					AUScope() : mCreator(NULL), mScope(0), mDelegate(0) { }	
+					AUScope() : mCreator(NULL), mScope(0), mDelegate(0) { }
 /*! @dtor ~AUScope */
 					~AUScope();
-	
+
 /*! @method Initialize */
-	void			Initialize(AUBase *creator, 
-								AudioUnitScope scope, 
+	void			Initialize(AUBase *creator,
+								AudioUnitScope scope,
 								UInt32 numElements)
 	{
 		mCreator = creator;
@@ -472,22 +472,22 @@ public:
 
 		if (mDelegate)
 			return mDelegate->Initialize(creator, scope, numElements);
-			
+
 		SetNumberOfElements(numElements);
 	}
-	
+
 /*! @method SetNumberOfElements */
 	void			SetNumberOfElements(UInt32 numElements);
-	
+
 /*! @method GetNumberOfElements */
-	UInt32			GetNumberOfElements()	const	
+	UInt32			GetNumberOfElements()	const
 	{
 		if (mDelegate)
 			return mDelegate->GetNumberOfElements();
-			
+
 		return static_cast<UInt32>(mElements.size());
 	}
-	
+
 /*! @method GetElement */
 	AUElement *		GetElement(UInt32 elementIndex) const
 	{
@@ -498,7 +498,7 @@ public:
 			// catch passing -1 in as the elementIndex - causes a wrap around
 		return (i >= mElements.end() || i < mElements.begin()) ? NULL : *i;
 	}
-	
+
 /*! @method SafeGetElement */
 	AUElement *		SafeGetElement(UInt32 elementIndex)
 	{
@@ -507,7 +507,7 @@ public:
 			COMPONENT_THROW(kAudioUnitErr_InvalidElement);
 		return element;
 	}
-	
+
 /*! @method GetIOElement */
 	AUIOElement *	GetIOElement(UInt32 elementIndex) const
 	{
@@ -517,15 +517,15 @@ public:
 			COMPONENT_THROW (kAudioUnitErr_InvalidElement);
 		return ioel;
 	}
-	
+
 /*! @method HasElementWithName */
 	bool			HasElementWithName () const;
-	
+
 /*! @method AddElementNamesToDict */
 	void			AddElementNamesToDict (CFMutableDictionaryRef & inNameDict);
-	
+
 	bool			RestoreElementNames (CFDictionaryRef& inNameDict);
-	
+
 	AudioUnitScope		GetScope() const { return mScope; }
 
 	void SetDelegate(AUScopeDelegate* inDelegate) { mDelegate = inDelegate; }
@@ -535,7 +535,7 @@ public:
 
 /*! @method RestoreState */
     const UInt8 *	RestoreState(const UInt8 *state);
-	
+
 private:
 	typedef std::vector<AUElement *> ElementVector;
 /*! @var mCreator */
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/ComponentBase.cpp b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/ComponentBase.cpp
index fc98733..37328fe 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/ComponentBase.cpp
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/ComponentBase.cpp
@@ -2,14 +2,14 @@
      File: ComponentBase.cpp
  Abstract: ComponentBase.h
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #include "ComponentBase.h"
 #include "CAXException.h"
@@ -72,11 +72,11 @@ static OSStatus CB_GetComponentDescription (const AudioComponentInstance inInsta
 	static OSStatus CMgr_GetComponentDescription (const AudioComponentInstance inInstance, AudioComponentDescription * outDesc);
 #endif
 
-ComponentBase::ComponentBase(AudioComponentInstance inInstance) 
-	: mComponentInstance(inInstance), 
-	  mInstanceType(sNewInstanceType) 
-{ 
-	GetComponentDescription(); 
+ComponentBase::ComponentBase(AudioComponentInstance inInstance)
+	: mComponentInstance(inInstance),
+	  mInstanceType(sNewInstanceType)
+{
+	GetComponentDescription();
 }
 
 ComponentBase::~ComponentBase()
@@ -99,7 +99,7 @@ OSStatus ComponentBase::AP_Open(void *self, AudioUnit compInstance)
 	OSStatus result = noErr;
 	try {
 		ComponentInitLocker lock;
-		
+
 		ComponentBase::sNewInstanceType = ComponentBase::kAudioComponentInstance;
 		ComponentBase *cb = (ComponentBase *)(*ACPI->mConstruct)(&ACPI->mInstanceStorage, compInstance);
 		cb->PostConstructor();	// allows base class to do additional initialization
@@ -137,13 +137,13 @@ OSStatus		ComponentBase::ComponentEntryDispatch(ComponentParameters *p, Componen
 	if (This == NULL) return kAudio_ParamError;
 
 	OSStatus result = noErr;
-	
+
 	switch (p->what) {
 	case kComponentCloseSelect:
 		This->PreDestructor();
 		delete This;
 		break;
-	
+
 	case kComponentVersionSelect:
 		result = This->Version();
 		break;
@@ -158,7 +158,7 @@ OSStatus		ComponentBase::ComponentEntryDispatch(ComponentParameters *p, Componen
 		default:
 			return 0;
 		}
-		
+
 	default:
 		result = badComponentSelector;
 		break;
@@ -169,7 +169,7 @@ OSStatus		ComponentBase::ComponentEntryDispatch(ComponentParameters *p, Componen
 SInt16		ComponentBase::GetSelectorForCanDo(ComponentParameters *params)
 {
 	if (params->what != kComponentCanDoSelect) return 0;
-	
+
 	#if TARGET_CPU_X86
 		SInt16 sel = params->params[0];
 	#elif TARGET_CPU_X86_64
@@ -179,9 +179,9 @@ SInt16		ComponentBase::GetSelectorForCanDo(ComponentParameters *params)
 	#else
 		SInt16 sel = params->params[0];
 	#endif
-	
+
 	return sel;
-/*		
+/*
 		printf ("flags:%d, paramSize: %d, what: %d\n\t", params->flags, params->paramSize, params->what);
 		for (int i = 0; i < params->paramSize; ++i) {
 			printf ("[%d]:%d(0x%x), ", i, params->params[i], params->params[i]);
@@ -192,7 +192,7 @@ SInt16		ComponentBase::GetSelectorForCanDo(ComponentParameters *params)
 
 #endif
 
-#if CA_DO_NOT_USE_AUDIO_COMPONENT 
+#if CA_DO_NOT_USE_AUDIO_COMPONENT
 static OSStatus ComponentBase_GetComponentDescription (const AudioComponentInstance & inInstance, AudioComponentDescription &outDesc);
 #endif
 
@@ -200,20 +200,20 @@ AudioComponentDescription ComponentBase::GetComponentDescription() const
 {
 	AudioComponentDescription desc;
 	OSStatus result = 1;
-	
+
 	if (IsPluginObject()) {
 		ca_require_noerr(result = CB_GetComponentDescription (mComponentInstance, &desc), home);
 	}
 #if !CA_USE_AUDIO_PLUGIN_ONLY
 	else {
-		ca_require_noerr(result = CMgr_GetComponentDescription (mComponentInstance, &desc), home);	
+		ca_require_noerr(result = CMgr_GetComponentDescription (mComponentInstance, &desc), home);
 	}
 #endif
 
 home:
 	if (result)
 		memset (&desc, 0, sizeof(AudioComponentDescription));
-	
+
 	return desc;
 }
 
@@ -239,13 +239,13 @@ static OSStatus CB_GetComponentDescription (const AudioComponentInstance inInsta
 {
 	typedef AudioComponent (*AudioComponentInstanceGetComponentProc) (AudioComponentInstance);
 	static AudioComponentInstanceGetComponentProc aciGCProc = NULL;
-	
+
 	typedef OSStatus (*AudioComponentGetDescriptionProc)(AudioComponent, AudioComponentDescription *);
 	static AudioComponentGetDescriptionProc acGDProc = NULL;
-	
+
 	static int doneInit = 0;
 	if (doneInit == 0) {
-		doneInit = 1;	
+		doneInit = 1;
 		void* theImage = dlopen("/System/Library/Frameworks/AudioUnit.framework/AudioUnit", RTLD_LAZY);
 		if (theImage != NULL)
 		{
@@ -255,13 +255,13 @@ static OSStatus CB_GetComponentDescription (const AudioComponentInstance inInsta
 			}
 		}
 	}
-	
+
 	OSStatus result = kAudio_UnimplementedError;
 	if (acGDProc && aciGCProc) {
 		AudioComponent comp = (*aciGCProc)(inInstance);
 		if (comp)
 			result = (*acGDProc)(comp, outDesc);
-	} 
+	}
 #if !CA_USE_AUDIO_PLUGIN_ONLY
 	else {
 		result = CMgr_GetComponentDescription (inInstance, outDesc);
@@ -317,7 +317,7 @@ static void CSInit ()
 	dispatch_once_f(&sCSInitOnce, NULL, CSInitOnce);
 }
 
-#else 
+#else
 
 static void CSInit ()
 {
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/ComponentBase.h b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/ComponentBase.h
index 67417aa..f8c5511 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/ComponentBase.h
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUBase/ComponentBase.h
@@ -2,14 +2,14 @@
      File: ComponentBase.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #ifndef __ComponentBase_h__
 #define __ComponentBase_h__
@@ -57,7 +57,7 @@
 
 	#if !CA_USE_AUDIO_PLUGIN_ONLY
 		#include <CoreServices/../Frameworks/CarbonCore.framework/Headers/Components.h>
-	
+
 		#if	(MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_5)
 			#define AudioComponentInstance			ComponentInstance
 			#define AudioComponentDescription		ComponentDescription
@@ -115,13 +115,13 @@ public:
 
 	/*! @ctor ComponentBase */
 				ComponentBase(AudioComponentInstance inInstance);
-				
+
 	/*! @dtor ~ComponentBase */
 	virtual 	~ComponentBase();
-	
+
 	/*! @method PostConstructor */
 	virtual void			PostConstructor();
-	
+
 	/*! @method PreDestructor */
 	virtual void			PreDestructor();
 
@@ -135,14 +135,14 @@ public:
 	/*! GetSelectorForCanDo */
 	static SInt16		GetSelectorForCanDo(ComponentParameters *params);
 #endif
-	
+
 	/*! @method GetComponentInstance */
 	AudioComponentInstance		GetComponentInstance() const { return mComponentInstance; }
 
 	/*! @method GetComponentDescription */
 	AudioComponentDescription	GetComponentDescription() const;
 
-	// This global variable is so that new instances know how they were instantiated: via the Component Manager, 
+	// This global variable is so that new instances know how they were instantiated: via the Component Manager,
 	// or as AudioComponents. It's ugly, but preferable to altering the constructor of every class in the hierarchy.
 	// It's safe because construction is protected by ComponentInitLocker.
 	enum EInstanceType { kComponentMgrInstance, kAudioComponentInstance };
@@ -158,27 +158,27 @@ public:
 
 	/*! @method AP_Close */
 	static OSStatus AP_Close(void *self);
-	
+
 protected:
 	/*! @var mComponentInstance */
 	AudioComponentInstance		mComponentInstance;
 	EInstanceType				mInstanceType;
 };
 
-class ComponentInitLocker 
+class ComponentInitLocker
 {
 #if TARGET_OS_MAC
 public:
-	ComponentInitLocker() 
-	{ 
+	ComponentInitLocker()
+	{
 		pthread_once(&sOnce, InitComponentInitLocker);
-		pthread_mutex_lock(&sComponentOpenMutex); 
+		pthread_mutex_lock(&sComponentOpenMutex);
 		mPreviousNewInstanceType = ComponentBase::sNewInstanceType;
 	}
-	~ComponentInitLocker() 
-	{ 
+	~ComponentInitLocker()
+	{
 		ComponentBase::sNewInstanceType = mPreviousNewInstanceType;
-		pthread_mutex_unlock(&sComponentOpenMutex); 
+		pthread_mutex_unlock(&sComponentOpenMutex);
 	}
 
 	// There are situations (11844772) where we need to be able to release the lock early.
@@ -190,7 +190,7 @@ public:
 		}
 		~Unlocker()
 		{
-			pthread_mutex_lock(&sComponentOpenMutex); 
+			pthread_mutex_lock(&sComponentOpenMutex);
 		}
 	};
 
@@ -198,7 +198,7 @@ private:
 	static pthread_mutex_t sComponentOpenMutex;
 	static pthread_once_t sOnce;
 	static void InitComponentInitLocker();
-	
+
 #elif TARGET_OS_WIN32
 public:
 	bool sNeedsUnlocking;
@@ -207,12 +207,12 @@ public:
 private:
 	static CAGuard	sComponentOpenGuard;
 #endif
-	
+
 private:
 	ComponentBase::EInstanceType	mPreviousNewInstanceType;
 };
 
-/*! @class AudioComponentPlugInInstance */ 
+/*! @class AudioComponentPlugInInstance */
 struct AudioComponentPlugInInstance {
 	AudioComponentPlugInInterface		mPlugInInterface;
 	void *								(*mConstruct)(void *memory, AudioComponentInstance ci);
@@ -222,7 +222,7 @@ struct AudioComponentPlugInInstance {
 																// this member is just a placeholder. it is aligned to a 16byte boundary
 };
 
-/*! @class APFactory */ 
+/*! @class APFactory */
 template <class APMethodLookup, class Implementor>
 class APFactory {
 public:
@@ -230,7 +230,7 @@ public:
 	{
 		return new(memory) Implementor(compInstance);
 	}
-	
+
 	static void Destruct(void *memory)
 	{
 		((Implementor *)memory)->~Implementor();
@@ -240,7 +240,7 @@ public:
 	// The actual implementation object is not created until Open().
 	static AudioComponentPlugInInterface *Factory(const AudioComponentDescription * /* inDesc */)
 	{
-		AudioComponentPlugInInstance *acpi = 
+		AudioComponentPlugInInstance *acpi =
 				(AudioComponentPlugInInstance *)malloc( offsetof(AudioComponentPlugInInstance, mInstanceStorage) + sizeof(Implementor) );
 		acpi->mPlugInInterface.Open = ComponentBase::AP_Open;
 		acpi->mPlugInInterface.Close = ComponentBase::AP_Close;
@@ -252,17 +252,17 @@ public:
 		acpi->mPad[1] = NULL;
 		return (AudioComponentPlugInInterface*)acpi;
 	}
-	
+
 	// This is for runtime registration (not for plug-ins loaded from bundles).
 	static AudioComponent Register(UInt32 type, UInt32 subtype, UInt32 manuf, CFStringRef name, UInt32 vers, UInt32 flags=0)
 	{
 		AudioComponentDescription desc = { type, subtype, manuf, flags, 0 };
-		return AudioComponentRegister(&desc, name, vers, Factory); 
+		return AudioComponentRegister(&desc, name, vers, Factory);
 	}
 };
 
 #if !CA_USE_AUDIO_PLUGIN_ONLY
-/*! @class ComponentEntryPoint 
+/*! @class ComponentEntryPoint
  *	@discussion This is only used for a component manager version
 */
 template <class Class>
@@ -272,7 +272,7 @@ public:
 	static OSStatus Dispatch(ComponentParameters *params, Class *obj)
 	{
 		OSStatus result = noErr;
-		
+
 		try {
 			if (params->what == kComponentOpenSelect) {
 				// solve a host of initialization thread safety issues.
@@ -283,16 +283,16 @@ public:
 				Class *This = new Class((AudioComponentInstance)ci);
 				This->PostConstructor();	// allows base class to do additional initialization
 											// once the derived class is fully constructed
-				
+
 				CMgr_SetComponentInstanceStorage(ci, (Handle)This);
 			} else
 				result = Class::ComponentEntryDispatch(params, obj);
 		}
 		COMPONENT_CATCH
-		
+
 		return result;
 	}
-	
+
 	/*! @method Register */
 	static Component Register(OSType compType, OSType subType, OSType manufacturer)
 	{
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/AUCarbonViewBase.cpp b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/AUCarbonViewBase.cpp
index 3324753..d3394ee 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/AUCarbonViewBase.cpp
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/AUCarbonViewBase.cpp
@@ -2,14 +2,14 @@
      File: AUCarbonViewBase.cpp
  Abstract: AUCarbonViewBase.h
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #include "AUCarbonViewBase.h"
 #include "AUCarbonViewControl.h"
@@ -59,11 +59,11 @@ AUCarbonViewBase::AUCarbonViewBase(AudioUnitCarbonView inInstance, Float32 inNot
 	mTimerUPP (NULL),
 	mCarbonWindow(NULL),
 	mCarbonPane(NULL),
-	mXOffset(0), 
+	mXOffset(0),
 	mYOffset(0)
 {
 	AUEventListenerCreate (ParameterListener, this,
-			CFRunLoopGetCurrent(), kCFRunLoopCommonModes, 
+			CFRunLoopGetCurrent(), kCFRunLoopCommonModes,
 			inNotificationInterval, inNotificationInterval,
 			&mParameterListener);
 }
@@ -82,12 +82,12 @@ AUCarbonViewBase::~AUCarbonViewBase()
 
 	if (mTimerRef)
 		::RemoveEventLoopTimer (mTimerRef);
-		
+
 	if (mTimerUPP)
 		DisposeEventLoopTimerUPP (mTimerUPP);
 #endif
 }
-	
+
 void	AUCarbonViewBase::AddControl(AUCarbonViewControl *control)
 {
 	ControlList::iterator it = find(mControlList.begin(), mControlList.end(), control);
@@ -126,7 +126,7 @@ void	AUCarbonViewBase::ParameterListener(void *				inCallbackRefCon,
 	}
 }
 
-									
+
 OSStatus			AUCarbonViewBase::CreateCarbonView(AudioUnit inAudioUnit, WindowRef inWindow, ControlRef inParentControl, const Float32Point &inLocation, const Float32Point &inSize, ControlRef &outParentControl)
 {
 #if !__LP64__
@@ -140,19 +140,19 @@ OSStatus			AUCarbonViewBase::CreateCarbonView(AudioUnit inAudioUnit, WindowRef i
 	Rect area;
 	area.left = short(inLocation.x); area.top = short(inLocation.y);
 	area.right = short(area.left + inSize.x); area.bottom = short(area.top + inSize.y);
-	OSStatus err = ::CreateUserPaneControl(inWindow, &area, 
+	OSStatus err = ::CreateUserPaneControl(inWindow, &area,
 						kControlSupportsEmbedding,
 						&mCarbonPane);	// subclass can resize mCarbonPane to taste
 	verify_noerr(err);
 	if (err) return err;
 	outParentControl = mCarbonPane;
-	
+
 	// register for mouse-down in our pane -- we want to clear focus
 	EventTypeSpec paneEvents[] = {
 		{ kEventClassControl, kEventControlClick }
 	};
 	WantEventTypes(GetControlEventTarget(mCarbonPane), GetEventTypeCount(paneEvents), paneEvents);
-	
+
 	if (IsCompositWindow()) {
 		verify_noerr(::HIViewAddSubview(inParentControl, mCarbonPane));
 		mXOffset = 0;
@@ -164,7 +164,7 @@ OSStatus			AUCarbonViewBase::CreateCarbonView(AudioUnit inAudioUnit, WindowRef i
 		mYOffset = inLocation.y;
 	}
 	mBottomRight.h = mBottomRight.v = 0;
-	
+
 	SizeControl(mCarbonPane, 0, 0);
 	if (err = CreateUI(mXOffset, mYOffset))
 		return err;
@@ -187,12 +187,12 @@ OSStatus			AUCarbonViewBase::CreateCarbonView(AudioUnit inAudioUnit, WindowRef i
 			{ kEventClassScrollable, kEventScrollableGetInfo },
 			{ kEventClassScrollable, kEventScrollableScrollTo }
 		};
-		
+
 		WantEventTypes(GetControlEventTarget(mCarbonPane), GetEventTypeCount(scrollEvents), scrollEvents);
-	
+
 		mCurrentScrollPoint.x = mCurrentScrollPoint.y = 0.0f;
 	}
-	
+
 	return err;
 #else
 	return noErr;
@@ -212,10 +212,10 @@ OSStatus	AUCarbonViewBase::EmbedControl(ControlRef ctl)
 	if (r.right > mBottomRight.h) mBottomRight.h = r.right;
 	if (r.bottom > mBottomRight.v) mBottomRight.v = r.bottom;
 
-	if (IsCompositWindow()) 
+	if (IsCompositWindow())
 		return ::HIViewAddSubview(mCarbonPane, ctl);
-	else 
-		return ::EmbedControl(ctl, mCarbonPane);	
+	else
+		return ::EmbedControl(ctl, mCarbonPane);
 #else
 	return noErr;
 #endif
@@ -224,19 +224,19 @@ OSStatus	AUCarbonViewBase::EmbedControl(ControlRef ctl)
 void	AUCarbonViewBase::AddCarbonControl(AUCarbonViewControl::ControlType type, const CAAUParameter &param, ControlRef control)
 {
 	verify_noerr(EmbedControl(control));
-    
+
 	AUCarbonViewControl *auvc = new AUCarbonViewControl(this, mParameterListener, type, param, control);
 	auvc->Bind();
 	AddControl(auvc);
 }
 
 bool	AUCarbonViewBase::HandleEvent(EventHandlerCallRef inHandlerRef, EventRef event)
-{	
+{
 #if !__LP64__
 	UInt32 eclass = GetEventClass(event);
 	UInt32 ekind = GetEventKind(event);
 	ControlRef control;
-	
+
 	switch (eclass) {
 		case kEventClassControl:
 		{
@@ -250,7 +250,7 @@ bool	AUCarbonViewBase::HandleEvent(EventHandlerCallRef inHandlerRef, EventRef ev
 			}
 		}
 		break;
-		
+
 		case kEventClassScrollable:
 		{
 			switch (ekind) {
@@ -262,7 +262,7 @@ bool	AUCarbonViewBase::HandleEvent(EventHandlerCallRef inHandlerRef, EventRef ev
 					 */
 					HISize originalSize = { mBottomRight.h, mBottomRight.v };
 					verify_noerr(SetEventParameter(event, kEventParamImageSize, typeHISize, sizeof(HISize), &originalSize));
-					
+
 					// [2/4]
 					/*	<--	kEventParamViewSize (out, typeHISize)
 					 *		On exit, contains the amount of the scrollable view that is
@@ -274,7 +274,7 @@ bool	AUCarbonViewBase::HandleEvent(EventHandlerCallRef inHandlerRef, EventRef ev
 					//HISize windowSize = {	float(windowBounds.right - windowBounds.left),
 					//						float(windowBounds.bottom - windowBounds.top) };
 					verify_noerr(SetEventParameter(event, kEventParamViewSize, typeHISize, sizeof(HISize), &(parentBounds.size)));
-					
+
 					// [3/4]
 					/*	<--	kEventParamLineSize (out, typeHISize)
 					 *		On exit, contains the amount that should be scrolled in
@@ -282,7 +282,7 @@ bool	AUCarbonViewBase::HandleEvent(EventHandlerCallRef inHandlerRef, EventRef ev
 					 */
 					 HISize scrollIncrementSize = { 16.0f, float(20) };
 					 verify_noerr(SetEventParameter(event, kEventParamLineSize, typeHISize, sizeof(HISize), &scrollIncrementSize));
-					 
+
 					// [4/4]
 					/*	<-- kEventParamOrigin (out, typeHIPoint)
 					 *		On exit, contains the scrollable viewÕs current origin (the
@@ -294,17 +294,17 @@ bool	AUCarbonViewBase::HandleEvent(EventHandlerCallRef inHandlerRef, EventRef ev
 					 verify_noerr(SetEventParameter(event, kEventParamOrigin, typeHIPoint, sizeof(HIPoint), &mCurrentScrollPoint));
 				}
 				return true;
-				
+
 			case kEventScrollableScrollTo:
 				{
 					/*
 					 *  kEventClassScrollable / kEventScrollableScrollTo
-					 *  
+					 *
 					 *  Summary:
 					 *    Requests that an HIScrollViewÕs scrollable view should scroll to
 					 *    a particular origin.
 					 */
-					
+
 					/*	-->	kEventParamOrigin (in, typeHIPoint)
 					 *		The new origin for the scrollable view. The origin
 					 *		coordinates will vary from (0,0) to scrollable viewÕs image
@@ -312,24 +312,24 @@ bool	AUCarbonViewBase::HandleEvent(EventHandlerCallRef inHandlerRef, EventRef ev
 					 */
 					HIPoint pointToScrollTo;
 					verify_noerr(GetEventParameter(event, kEventParamOrigin, typeHIPoint, NULL, sizeof(HIPoint), NULL, &pointToScrollTo));
-					
+
 					float xDelta = mCurrentScrollPoint.x - pointToScrollTo.x;
 					float yDelta = mCurrentScrollPoint.y - pointToScrollTo.y;
 					// move visible portion the appropriate amount
 					verify_noerr(HIViewScrollRect(mCarbonPane, NULL, xDelta, yDelta));
 					// set new content to be drawn
 					verify_noerr(HIViewSetBoundsOrigin(mCarbonPane, pointToScrollTo.x, pointToScrollTo.y));
-					
+
 					mCurrentScrollPoint = pointToScrollTo;
 				}
 				return true;
-				
+
 			default:
 				break;
 			}
 		}
 		break;
-		
+
 		default:
 			break;
 	}
@@ -352,7 +352,7 @@ void	AUCarbonViewBase::TellListener (const CAAUParameter &auvp, AudioUnitCarbonV
 	} else {
 		auEvent.mEventType = kAudioUnitEvent_EndParameterChangeGesture;
 	}
-	AUEventListenerNotify(mParameterListener, this, &auEvent);									
+	AUEventListenerNotify(mParameterListener, this, &auEvent);
 }
 
 
@@ -370,34 +370,34 @@ pascal void		AUCarbonViewBase::TheTimerProc (EventLoopTimerRef inTimer, void *in
 	This->RespondToEventTimer (inTimer);
 }
 
-void			AUCarbonViewBase::RespondToEventTimer (EventLoopTimerRef inTimer) 
+void			AUCarbonViewBase::RespondToEventTimer (EventLoopTimerRef inTimer)
 {}
 
-/* 
+/*
 	THESE are reasonable values for these two times
-	0.005 // delay 
+	0.005 // delay
 	0.050 // interval
 */
 
-OSStatus	AUCarbonViewBase::CreateEventLoopTimer (Float32 inDelay, Float32 inInterval) 
+OSStatus	AUCarbonViewBase::CreateEventLoopTimer (Float32 inDelay, Float32 inInterval)
 {
 	if (mTimerUPP)
 		return noErr;
-	
+
 	mTimerUPP = NewEventLoopTimerUPP(TheTimerProc);
-	
+
 	EventLoopRef mainEventLoop = GetMainEventLoop();
-	
+
 		//doesn't seem to like too small a value
 	if (inDelay < 0.005)
 		inDelay = 0.005;
-			
+
 	OSStatus timerResult =  ::InstallEventLoopTimer(
 									mainEventLoop,
 									inDelay,
 									inInterval,
 									mTimerUPP,
 									this,
-									&mTimerRef);                       
+									&mTimerRef);
 	return timerResult;
 }
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/AUCarbonViewBase.h b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/AUCarbonViewBase.h
index 910e53f..0afc5fc 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/AUCarbonViewBase.h
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/AUCarbonViewBase.h
@@ -2,14 +2,14 @@
      File: AUCarbonViewBase.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #ifndef __AUCarbonViewBase_h__
 #define __AUCarbonViewBase_h__
@@ -62,7 +62,7 @@ public:
 						Float32 inNotificationInterval = kDefaultNotificationInterval /* in seconds */);
 	/*! @dtor ~AUCarbonViewBase */
 	virtual ~AUCarbonViewBase();
-	
+
 	// AUViewBase overrides
 	/*! @method CreateCarbonView */
 	virtual OSStatus			CreateCarbonView (AudioUnit inAudioUnit, WindowRef inWindow, ControlRef inParentControl, const Float32Point &inLocation, const Float32Point &inSize, ControlRef &outParentControl);
@@ -73,7 +73,7 @@ public:
 
 	/*! @method HandleEvent */
 	virtual bool				HandleEvent (EventHandlerCallRef inHandlerRef, EventRef event);
-	
+
 	/*! @method GetEditAudioUnit */
 	const AudioUnit				GetEditAudioUnit () const { return mEditAudioUnit; }
 	//
@@ -84,8 +84,8 @@ public:
 
 	/*! @method AddCarbonControl */
 	void						AddCarbonControl (
-									AUCarbonViewControl::ControlType	type, 
-									const CAAUParameter &				param, 
+									AUCarbonViewControl::ControlType	type,
+									const CAAUParameter &				param,
 									ControlRef							control);
 
 	/*! @method GetCarbonWindow */
@@ -94,27 +94,27 @@ public:
 	ControlRef					GetCarbonPane () { return mCarbonPane; }
 	/*! @method EmbedControl */
 	OSStatus					EmbedControl (ControlRef ctl);
-	
+
 	/*! @method TellListener */
 	void						TellListener (const CAAUParameter &auvp, AudioUnitCarbonViewEventID event, void *evpar);
-	
+
 	// pass in true if wanting an update to the view and you're calling this from a thread
 	// that is safe to do UI in.
 	// If you don't know, pass in false!
 	/*! @method Update */
 	void						Update (bool inUIThread);
-	
+
 	/*! @method GetXOffset */
 	Float32						GetXOffset () { return mXOffset; }
 	/*! @method GetYOffset */
 	Float32						GetYOffset () { return mYOffset; }
-	
+
 	/*! @method ClearControls */
 	void						ClearControls ();
-	
+
 	/*! @method IsCompositWindow */
 	bool						IsCompositWindow () const { return mCompositWindow; }
-	
+
 protected:
 #if !__LP64__
 	/*! @method SetEventListener */
@@ -131,15 +131,15 @@ protected:
 	void						RemoveControl (AUCarbonViewControl *control);
 
 	OSStatus					CreateEventLoopTimer (Float32 inDelay, Float32 inInterval);
-	
+
 	/*! @method ParameterListener */
 	static void ParameterListener (void *						inCallbackRefCon,
 									void *						inObject,
 									const AudioUnitEvent *		inEvent,
 									UInt64						inEventHostTime,
 									Float32						inParameterValue);
-									
-	static pascal void TheTimerProc (	EventLoopTimerRef 		inTimer, 
+
+	static pascal void TheTimerProc (	EventLoopTimerRef 		inTimer,
 										void *					inUserData);
 
 	virtual void 				RespondToEventTimer (EventLoopTimerRef inTimer);
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/AUCarbonViewControl.cpp b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/AUCarbonViewControl.cpp
index 981347b..c22c50c 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/AUCarbonViewControl.cpp
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/AUCarbonViewControl.cpp
@@ -2,14 +2,14 @@
      File: AUCarbonViewControl.cpp
  Abstract: AUCarbonViewControl.h
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #include "AUCarbonViewControl.h"
 #include "AUCarbonViewBase.h"
@@ -74,11 +74,11 @@ void	AUCarbonViewControl::Bind()
 	mInControlInitialization = 1;   // true
 	AUListenerAddParameter(mListener, this, &mParam);
 		// will cause an almost-immediate callback
-	
+
 	EventTypeSpec events[] = {
 		{ kEventClassControl, kEventControlValueFieldChanged }	// N.B. OS X only
 	};
-	
+
 	WantEventTypes(GetControlEventTarget(mControl), GetEventTypeCount(events), events);
 
 	if (mType == kTypeContinuous || mType == kTypeText || mType == kTypeDiscrete) {
@@ -88,18 +88,18 @@ void	AUCarbonViewControl::Bind()
 		    { kEventClassControl, kEventControlTrack }
 		};
 		WantEventTypes(GetControlEventTarget(mControl), GetEventTypeCount(events), events);
-	} 
+	}
 
 	if (mType == kTypeText) {
 		EventTypeSpec events[] = {
 			{ kEventClassControl, kEventControlSetFocusPart }
 		};
-		WantEventTypes(GetControlEventTarget(mControl), GetEventTypeCount(events), events); 
+		WantEventTypes(GetControlEventTarget(mControl), GetEventTypeCount(events), events);
 		ControlKeyFilterUPP proc = mParam.ValuesHaveStrings() ? StdKeyFilterCallback : NumericKeyFilterCallback;
 			// this will fail for a static text field
 		SetControlData(mControl, 0, kControlEditTextKeyFilterTag, sizeof(proc), &proc);
 	}
-	
+
 	Update(true);
 	mInControlInitialization = 0;   // false
 #endif
@@ -116,7 +116,7 @@ void	AUCarbonViewControl::ParameterToControl(Float32 paramValue)
 	case kTypeDiscrete:
 		{
 			long value = long(paramValue);
-			
+
 			// special case [1] -- menu parameters
 			if (mParam.HasNamedParams()) {
 				// if we're dealing with menus they behave differently!
@@ -124,17 +124,17 @@ void	AUCarbonViewControl::ParameterToControl(Float32 paramValue)
 				// first menu item always reports a control value of 1
 				ControlKind ctrlKind;
 				if (GetControlKind(mControl, &ctrlKind) == noErr) {
-					if ((ctrlKind.kind == kControlKindPopupArrow) 
-						|| (ctrlKind.kind == kControlKindPopupButton))				
+					if ((ctrlKind.kind == kControlKindPopupArrow)
+						|| (ctrlKind.kind == kControlKindPopupButton))
 					{
 						value = value - long(mParam.ParamInfo().minValue) + 1;
 					}
 				}
 			}
-			
+
 			// special case [2] -- Write-only boolean parameters
 			AudioUnitParameterInfo AUPI = mParam.ParamInfo();
-			
+
 			bool isWriteOnlyBoolParameter = (	(AUPI.unit == kAudioUnitParameterUnit_Boolean) &&
 												(AUPI.flags & kAudioUnitParameterFlag_IsWritable) &&
 												!(AUPI.flags & kAudioUnitParameterFlag_IsReadable)	);
@@ -148,7 +148,7 @@ void	AUCarbonViewControl::ParameterToControl(Float32 paramValue)
 			CFStringRef cfstr = mParam.GetStringFromValueCopy(&paramValue);
 
 			if ( !(mParam.ParamInfo().flags & kAudioUnitParameterFlag_IsWritable)			//READ ONLY PARAMS
-					&& (mParam.ParamInfo().flags & kAudioUnitParameterFlag_IsReadable)) 
+					&& (mParam.ParamInfo().flags & kAudioUnitParameterFlag_IsReadable))
 			{
 				if (mParam.GetParamTag()) {
 					CFMutableStringRef str = CFStringCreateMutableCopy(NULL, 256, cfstr);
@@ -184,7 +184,7 @@ void	AUCarbonViewControl::ControlToParameter()
 	case kTypeDiscrete:
 		{
 			long value = GetValue();
-			
+
 			// special case [1] -- Menus
 			if (mParam.HasNamedParams()) {
 				// if we're dealing with menus they behave differently!
@@ -192,24 +192,24 @@ void	AUCarbonViewControl::ControlToParameter()
 				// first menu item always reports a control value of 1
 				ControlKind ctrlKind;
 				if (GetControlKind(mControl, &ctrlKind) == noErr) {
-					if ((ctrlKind.kind == kControlKindPopupArrow) 
-						|| (ctrlKind.kind == kControlKindPopupButton))				
+					if ((ctrlKind.kind == kControlKindPopupArrow)
+						|| (ctrlKind.kind == kControlKindPopupButton))
 					{
 						value = value + long(mParam.ParamInfo().minValue) - 1;
 					}
 				}
 			}
-			
+
 			// special case [2] -- Write-only boolean parameters
 			AudioUnitParameterInfo AUPI = mParam.ParamInfo();
-			
+
 			bool isWriteOnlyBoolParameter = (	(AUPI.unit == kAudioUnitParameterUnit_Boolean) &&
 												(AUPI.flags & kAudioUnitParameterFlag_IsWritable) &&
 												!(AUPI.flags & kAudioUnitParameterFlag_IsReadable)	);
 			if (isWriteOnlyBoolParameter) {
 				value = 1;
 			}
-			
+
 			mParam.SetValue (mListener, this, value);
 		}
 		break;
@@ -284,25 +284,25 @@ long	AUCarbonViewControl::GetValue()
 #endif
 }
 
-/* Notes on event handling 
-	
+/* Notes on event handling
+
 	Button (Click and release on button)
 		kEventControlClick received
 		kEventControlTrack received
 		kEventControlValueFieldChanged received
 		kEventControlHit received
-	
+
 	Button (Click and release outside of button bounds)
 		kEventControlClick received
 		kEventControlTrack received
-	
+
 	Slider (Click, drag, and release)
 		kEventControlClick received
 		kEventControlTrack received
 		kEventControlValueFieldChanged received
 		kEventControlValueFieldChanged received
 		kEventControlHit received
-		
+
 	Slider (Click, release without changing value)
 		kEventControlClick received
 		kEventControlTrack received
@@ -313,16 +313,16 @@ bool	AUCarbonViewControl::HandleEvent(EventHandlerCallRef inHandlerRef, EventRef
 	UInt32 ekind = GetEventKind(event);
 	ControlRef control;
 	bool		handled = true;
-	
+
 	switch (eclass) {
 		case kEventClassControl:
 		{
 			AudioUnitParameterInfo AUPI = mParam.ParamInfo();
-			
+
 			bool isWriteOnlyBoolParameter = (	(AUPI.unit == kAudioUnitParameterUnit_Boolean) &&
 												(AUPI.flags & kAudioUnitParameterFlag_IsWritable) &&
 												!(AUPI.flags & kAudioUnitParameterFlag_IsReadable)	);
-			
+
 			switch (ekind) {
 				case kEventControlSetFocusPart:	// tab
 					handled = !handled;		// fall through to next case
@@ -331,7 +331,7 @@ bool	AUCarbonViewControl::HandleEvent(EventHandlerCallRef inHandlerRef, EventRef
 					GetEventParameter(event, kEventParamDirectObject, typeControlRef, NULL, sizeof(ControlRef), NULL, &control);
 					verify(control == mControl);
 					ControlToParameter();
-					return handled;			
+					return handled;
 				case kEventControlClick:
 					if (isWriteOnlyBoolParameter) {
 						GetEventParameter(event, kEventParamDirectObject, typeControlRef, NULL, sizeof(ControlRef), NULL, &control);
@@ -341,7 +341,7 @@ bool	AUCarbonViewControl::HandleEvent(EventHandlerCallRef inHandlerRef, EventRef
 						if (mLastControl != NULL) {
 							mLastControl->Update(false);
 						}
-						mLastControl = this;	
+						mLastControl = this;
 					}
 					mOwnerView->TellListener(mParam, kAudioUnitCarbonViewEvent_MouseDownInControl, NULL);
 					break;	// don't return true, continue normal processing
@@ -349,17 +349,17 @@ bool	AUCarbonViewControl::HandleEvent(EventHandlerCallRef inHandlerRef, EventRef
 					if (mLastControl != this) {
 						if (mLastControl != NULL)
 							mLastControl->Update(false);
-						mLastControl = this;	
-					} 
+						mLastControl = this;
+					}
 					mOwnerView->TellListener(mParam, kAudioUnitCarbonViewEvent_MouseUpInControl, NULL);
 					break;	// don't return true, continue normal processing
-				case kEventControlTrack:		
+				case kEventControlTrack:
 					if (mLastControl != this) {
 						if (mLastControl != NULL)
 							mLastControl->Update(false);
-						mLastControl = this;	
+						mLastControl = this;
 					}
-					
+
 					CallNextEventHandler(inHandlerRef, event);
 					ControlToParameter();						// new code
 					mOwnerView->TellListener(mParam, kAudioUnitCarbonViewEvent_MouseUpInControl, NULL);
@@ -379,8 +379,8 @@ pascal void	AUCarbonViewControl::SliderTrackProc(ControlRef theControl, ControlP
 //	AUCarbonViewControl *This = (AUCarbonViewControl *)GetControlReference(theControl);
 }
 
-pascal ControlKeyFilterResult	AUCarbonViewControl::StdKeyFilterCallback(ControlRef theControl, 
-												SInt16 *keyCode, SInt16 *charCode, 
+pascal ControlKeyFilterResult	AUCarbonViewControl::StdKeyFilterCallback(ControlRef theControl,
+												SInt16 *keyCode, SInt16 *charCode,
 												EventModifiers *modifiers)
 {
 #if !__LP64__
@@ -397,8 +397,8 @@ pascal ControlKeyFilterResult	AUCarbonViewControl::StdKeyFilterCallback(ControlR
 	return kControlKeyFilterBlockKey;
 }
 
-pascal ControlKeyFilterResult	AUCarbonViewControl::NumericKeyFilterCallback(ControlRef theControl, 
-												SInt16 *keyCode, SInt16 *charCode, 
+pascal ControlKeyFilterResult	AUCarbonViewControl::NumericKeyFilterCallback(ControlRef theControl,
+												SInt16 *keyCode, SInt16 *charCode,
 												EventModifiers *modifiers)
 {
 #if !__LP64__
@@ -420,43 +420,43 @@ Boolean	AUCarbonViewControl::SizeControlToFit(ControlRef inControl, SInt16 *outW
 {
 #if !__LP64__
 	if (inControl == 0) return false;
-	
+
 	Boolean bValue = false;
 	// this only works on text controls -- returns an error for other controls, but doesn't do anything,
 	// so the error is irrelevant
 	SetControlData(inControl, kControlEntireControl, 'stim' /* kControlStaticTextIsMultilineTag */, sizeof(Boolean), &bValue);
-	
+
 	SInt16 baseLineOffset;
 	Rect bestRect;
-	OSErr err = GetBestControlRect(inControl, &bestRect, &baseLineOffset);  
+	OSErr err = GetBestControlRect(inControl, &bestRect, &baseLineOffset);
 	if (err != noErr) return false;
-	
+
 	int width = (bestRect.right - bestRect.left) + 1;
 	int height = (bestRect.bottom - bestRect.top) + 1;
-	
+
 	Rect boundsRect;
 	GetControlBounds (inControl, &boundsRect);
-	
+
 	Rect newRect;
 	newRect.top = boundsRect.top;
 	newRect.bottom = newRect.top + height;
 	newRect.left = boundsRect.left;
 	newRect.right = newRect.left + width;
-	
+
 	SetControlBounds (inControl, &newRect);
-	
+
 	if (outWidth)
 		*outWidth = width;
-	
+
 	if (outHeight)
 		*outHeight = height;
-#endif	
+#endif
 	return true;
 }
 
 #pragma mark ___AUPropertyControl
 bool	AUPropertyControl::HandleEvent(EventHandlerCallRef inHandlerRef, EventRef event)
-{	
+{
 	UInt32 eclass = GetEventClass(event);
 	UInt32 ekind = GetEventKind(event);
 	switch (eclass) {
@@ -477,14 +477,14 @@ void	AUPropertyControl::RegisterEvents ()
 	EventTypeSpec events[] = {
 		{ kEventClassControl, kEventControlValueFieldChanged }	// N.B. OS X only
 	};
-	
+
 	WantEventTypes(GetControlEventTarget(mControl), GetEventTypeCount(events), events);
 #endif
 }
 
-void	AUPropertyControl::EmbedControl (ControlRef theControl) 
-{ 
-	mView->EmbedControl (theControl); 
+void	AUPropertyControl::EmbedControl (ControlRef theControl)
+{
+	mView->EmbedControl (theControl);
 }
 
 WindowRef 	AUPropertyControl::GetCarbonWindow()
@@ -498,11 +498,11 @@ static CFStringRef kStringFactoryPreset = kAUViewLocalizedStringKey_FactoryPrese
 static bool sAUVPresetLocalized = false;
 #endif
 
-AUVPresets::AUVPresets (AUCarbonViewBase* 		inParentView, 
+AUVPresets::AUVPresets (AUCarbonViewBase* 		inParentView,
 						CFArrayRef& 			inPresets,
-						Point 					inLocation, 
-						int 					nameWidth, 
-						int 					controlWidth, 
+						Point 					inLocation,
+						int 					nameWidth,
+						int 					controlWidth,
 						ControlFontStyleRec & 	inFontStyle)
 	: AUPropertyControl (inParentView),
 	  mPresets (inPresets),
@@ -510,13 +510,13 @@ AUVPresets::AUVPresets (AUCarbonViewBase* 		inParentView,
 {
 #if !__LP64__
 	Rect r;
-	
+
 	// ok we now have an array of factory presets
 	// get their strings and display them
 
 	r.top = inLocation.v;		r.bottom = r.top;
 	r.left = inLocation.h;		r.right = r.left;
-	
+
     // localize as necessary
     if (!sAUVPresetLocalized) {
         CFBundleRef mainBundle = CFBundleGetBundleWithIdentifier(kLocalizedStringBundle_AUView);
@@ -527,86 +527,86 @@ AUVPresets::AUVPresets (AUCarbonViewBase* 		inParentView,
             sAUVPresetLocalized = true;
         }
     }
-    
+
     // create localized title string
     CFMutableStringRef factoryPresetsTitle = CFStringCreateMutable(NULL, 0);
     CFStringAppend(factoryPresetsTitle, kStringFactoryPreset);
     CFStringAppend(factoryPresetsTitle, kAUViewUnlocalizedString_TitleSeparator);
-    
+
 	ControlRef theControl;
     verify_noerr(CreateStaticTextControl(mView->GetCarbonWindow(), &r, factoryPresetsTitle, &inFontStyle, &theControl));
 	SInt16 width = 0;
 	AUCarbonViewControl::SizeControlToFit(theControl, &width, &mHeight);
     CFRelease(factoryPresetsTitle);
 	EmbedControl(theControl);
-	
+
 	r.top -= 2;
 	r.left += width + 10;
 	r.right = r.left;
 	r.bottom = r.top;
-	
-	verify_noerr(CreatePopupButtonControl (	mView->GetCarbonWindow(), &r, NULL, 
+
+	verify_noerr(CreatePopupButtonControl (	mView->GetCarbonWindow(), &r, NULL,
 											-12345,	// DON'T GET MENU FROM RESOURCE mMenuID,!!!
-											FALSE,	// variableWidth, 
-											0,		// titleWidth, 
-											0,		// titleJustification, 
-											0,		// titleStyle, 
+											FALSE,	// variableWidth,
+											0,		// titleWidth,
+											0,		// titleJustification,
+											0,		// titleStyle,
 											&mControl));
-	
+
 	MenuRef menuRef;
 	verify_noerr(CreateNewMenu(1, 0, &menuRef));
-	
+
 	int numPresets = CFArrayGetCount(mPresets);
-	
+
 	for (int i = 0; i < numPresets; ++i)
 	{
 		AUPreset* preset = (AUPreset*) CFArrayGetValueAtIndex (mPresets, i);
 		verify_noerr(AppendMenuItemTextWithCFString (menuRef, preset->presetName, 0, 0, 0));
 	}
-	
+
 	verify_noerr(SetControlData(mControl, 0, kControlPopupButtonMenuRefTag, sizeof(menuRef), &menuRef));
 	verify_noerr (SetControlFontStyle (mControl, &inFontStyle));
-	
+
 	SetControl32BitMaximum (mControl, numPresets);
-	
+
 	// size popup
 	SInt16 height = 0;
-	
+
 	AUCarbonViewControl::SizeControlToFit(mControl, &width, &height);
-	
+
 	if (height > mHeight) mHeight = height;
 	if (mHeight < 0) mHeight = 0;
-	
+
 	// find which menu item is the Default preset
 	UInt32 propertySize = sizeof(AUPreset);
 	AUPreset defaultPreset;
-	OSStatus result = AudioUnitGetProperty (mView->GetEditAudioUnit(), 
+	OSStatus result = AudioUnitGetProperty (mView->GetEditAudioUnit(),
 									kAudioUnitProperty_PresentPreset,
-									kAudioUnitScope_Global, 
-									0, 
-									&defaultPreset, 
+									kAudioUnitScope_Global,
+									0,
+									&defaultPreset,
 									&propertySize);
-	
+
 	mPropertyID = kAudioUnitProperty_PresentPreset;
-#endif	
+#endif
 #ifndef __LP64__
 	if (result != noErr) {	// if the PresentPreset property is not implemented, fall back to the CurrentPreset property
-		OSStatus result = AudioUnitGetProperty (mView->GetEditAudioUnit(), 
+		OSStatus result = AudioUnitGetProperty (mView->GetEditAudioUnit(),
 									kAudioUnitProperty_CurrentPreset,
-									kAudioUnitScope_Global, 
-									0, 
-									&defaultPreset, 
+									kAudioUnitScope_Global,
+									0,
+									&defaultPreset,
 									&propertySize);
 		mPropertyID = kAudioUnitProperty_CurrentPreset;
 		if (result == noErr)
 			CFRetain (defaultPreset.presetName);
-	} 
+	}
 #endif
-#if !__LP64__		
+#if !__LP64__
 	EmbedControl (mControl);
-	
+
 	HandlePropertyChange(defaultPreset);
-	
+
 	RegisterEvents();
 #endif
 }
@@ -620,7 +620,7 @@ void	AUVPresets::AddInterest (AUEventListenerRef		inListener,
 	e.mArgument.mProperty.mPropertyID = mPropertyID;
 	e.mArgument.mProperty.mScope = kAudioUnitScope_Global;
 	e.mArgument.mProperty.mElement = 0;
-	
+
 	AUEventListenerAddEventType(inListener, inObject, &e);
 }
 
@@ -644,14 +644,14 @@ void	AUVPresets::HandleControlChange ()
 	if (i > 0)
 	{
 		AUPreset* preset = (AUPreset*) CFArrayGetValueAtIndex (mPresets, i-1);
-	
-		verify_noerr(AudioUnitSetProperty (mView->GetEditAudioUnit(), 
+
+		verify_noerr(AudioUnitSetProperty (mView->GetEditAudioUnit(),
 									mPropertyID,	// either currentPreset or PresentPreset depending on which is supported
-									kAudioUnitScope_Global, 
-									0, 
-									preset, 
+									kAudioUnitScope_Global,
+									0,
+									preset,
 									sizeof(AUPreset)));
-									
+
 		// when we change a preset we can't expect the AU to update its state
 		// as it isn't meant to know that its being viewed!
 		// so we broadcast a notification to all listeners that all parameters on this AU have changed
@@ -663,12 +663,12 @@ void	AUVPresets::HandleControlChange ()
 #endif
 }
 
-void	AUVPresets::HandlePropertyChange(AUPreset &preset) 
+void	AUVPresets::HandlePropertyChange(AUPreset &preset)
 {
 #if !__LP64__
 	// check to see if the preset is in our menu
 	int numPresets = CFArrayGetCount(mPresets);
-	if (preset.presetNumber < 0) {	
+	if (preset.presetNumber < 0) {
 		SetControl32BitValue (mControl, 0); //controls are one-based
 	} else {
 		for (SInt32 i = 0; i < numPresets; ++i) {
@@ -679,7 +679,7 @@ void	AUVPresets::HandlePropertyChange(AUPreset &preset)
 			}
 		}
 	}
-	
+
 	if (preset.presetName)
 		CFRelease (preset.presetName);
 #endif
@@ -687,16 +687,16 @@ void	AUVPresets::HandlePropertyChange(AUPreset &preset)
 
 bool	AUVPresets::HandlePropertyChange (const AudioUnitProperty &inProp)
 {
-	if (inProp.mPropertyID == mPropertyID) 
+	if (inProp.mPropertyID == mPropertyID)
 	{
 		UInt32 theSize = sizeof(AUPreset);
 		AUPreset currentPreset;
-		
-		OSStatus result = AudioUnitGetProperty(inProp.mAudioUnit, 
-												inProp.mPropertyID, 
-												inProp.mScope, 
+
+		OSStatus result = AudioUnitGetProperty(inProp.mAudioUnit,
+												inProp.mPropertyID,
+												inProp.mScope,
 												inProp.mElement, &currentPreset, &theSize);
-		
+
 		if (result == noErr) {
 #ifndef __LP64__
 			if (inProp.mPropertyID == kAudioUnitProperty_CurrentPreset && currentPreset.presetName)
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/AUCarbonViewControl.h b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/AUCarbonViewControl.h
index 3d5f975..b22e992 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/AUCarbonViewControl.h
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/AUCarbonViewControl.h
@@ -2,14 +2,14 @@
      File: AUCarbonViewControl.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #ifndef __AUCarbonViewControl_h__
 #define __AUCarbonViewControl_h__
@@ -69,7 +69,7 @@ public:
 		kTypeDiscrete,		// e.g. pop-up menu
 		kTypeText
 	};
-	
+
 	AUCarbonViewControl(AUCarbonViewBase *ownerView, AUParameterListenerRef listener, ControlType type, const CAAUParameter &param, ControlRef control);
 	~AUCarbonViewControl();
 
@@ -80,7 +80,7 @@ public:
 	virtual void		ControlToParameter();
 	/*! @method ParameterToControl */
 	virtual void		ParameterToControl(Float32 newValue);
-	
+
 	/*! @method SetValueFract */
 	virtual void		SetValueFract(double value);
 	/*! @method GetValueFract */
@@ -93,34 +93,34 @@ public:
 	virtual void		SetValue(long value);
 	/*! @method GetValue */
 	virtual long		GetValue();
-	
+
 	/*! @method GetOwnerView */
 	AUCarbonViewBase * GetOwnerView() {return mOwnerView;}
 
 	/*! @method Update */
-	void				Update (bool inUIThread) 
-	{ 
+	void				Update (bool inUIThread)
+	{
 				if (inUIThread)
 					ParameterToControl (mParam.GetValue());
 				else
 					AUParameterListenerNotify (mListener, this, &mParam);
 	}
-	
-	
+
+
 	// CarbonEventHandler overrides
 	/*! @method HandleEvent */
 	virtual bool		HandleEvent(EventHandlerCallRef inHandlerRef, EventRef event);
-	
+
 	/*! @method ControlRef */
 	operator ControlRef() { return mControl; }
-	
+
 	/*! @method SizeControlToFit */
 	static Boolean SizeControlToFit(ControlRef inControl, SInt16 *outWidth = NULL, SInt16 *outHeight = NULL);
-	
+
 	/*! @method SliderTrackProc */
 	static pascal void SliderTrackProc(ControlRef theControl, ControlPartCode partCode);
 	/*! @method NumericKeyFilterCallback */
-	static pascal ControlKeyFilterResult NumericKeyFilterCallback(ControlRef theControl, SInt16 *keyCode, SInt16 *charCode, 
+	static pascal ControlKeyFilterResult NumericKeyFilterCallback(ControlRef theControl, SInt16 *keyCode, SInt16 *charCode,
 															EventModifiers *modifiers);
 protected:
 	/*! @method ParamInfo */
@@ -137,12 +137,12 @@ protected:
 
 	/*! @var mControl */
 	ControlRef				mControl;
-	
+
 	/*! @method StdKeyFilterCallback */
-	static pascal ControlKeyFilterResult StdKeyFilterCallback(ControlRef theControl, SInt16 *keyCode,   SInt16 *charCode, 
+	static pascal ControlKeyFilterResult StdKeyFilterCallback(ControlRef theControl, SInt16 *keyCode,   SInt16 *charCode,
 																										EventModifiers *modifiers);
 	SInt16					mInControlInitialization;
-	
+
 	static AUCarbonViewControl*	mLastControl;
 };
 
@@ -151,34 +151,34 @@ class AUPropertyControl : public CarbonEventHandler {
 public:
 	/*! @ctor AUPropertyControl */
 	AUPropertyControl (AUCarbonViewBase * 		inBase) : mControl(0), mView (inBase), mHeight(0) {}
-	
+
 	/*! @method HandleEvent */
 	virtual bool	HandleEvent(EventHandlerCallRef inHandlerRef, EventRef event);
 
 	/*! @method HandlePropertyChange */
 	virtual bool	HandlePropertyChange (const AudioUnitProperty &inProp) = 0;
-	
+
 	/*! @method AddInterest */
 	virtual void	AddInterest (AUEventListenerRef		inListener,
 								void *					inObject) = 0;
-	
+
 	/*! @method RemoveInterest */
 	virtual void	RemoveInterest  (AUEventListenerRef	inListener,
 								void *					inObject) = 0;
-	
+
 	/*! @method GetHeight */
 	int			GetHeight()	{ return mHeight;}
-	
+
 protected:
 	/*! @method HandleControlChange */
-	virtual void	HandleControlChange () = 0;	
+	virtual void	HandleControlChange () = 0;
 
 	/*! @method RegisterEvents */
 			void	RegisterEvents ();
 
 	/*! @method EmbedControl */
 			void	EmbedControl (ControlRef theControl);
-			
+
 	/*! @method GetCarbonWindow */
 	WindowRef 	GetCarbonWindow();
 
@@ -194,30 +194,30 @@ protected:
 class AUVPresets : public AUPropertyControl {
 public:
 					/*! @ctor HandleControlChange */
-					AUVPresets (AUCarbonViewBase * 		inBase, 
+					AUVPresets (AUCarbonViewBase * 		inBase,
 								CFArrayRef& 			inPresets,
-								Point 					inLocation, 
-								int 					nameWidth, 
-								int 					controlWidth, 
+								Point 					inLocation,
+								int 					nameWidth,
+								int 					controlWidth,
 								ControlFontStyleRec & 	inFontStyle);
 
 					virtual ~AUVPresets () { CFRelease (mPresets); }
 
 	/*! @method HandlePropertyChange */
 	virtual bool	HandlePropertyChange (const AudioUnitProperty &inProp);
-	
+
 	/*! @method AddInterest */
 	virtual void	AddInterest (AUEventListenerRef		inListener,
 								void *					inObject);
-	
+
 	/*! @method RemoveInterest */
 	virtual void	RemoveInterest  (AUEventListenerRef	inListener,
 								void *					inObject);
 
 protected:
 	/*! @method HandleControlChange */
-	virtual void	HandleControlChange ();	
-			
+	virtual void	HandleControlChange ();
+
 	/*! @var mPresets */
 	CFArrayRef			mPresets;
 	/*! @var mView */
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/AUCarbonViewDispatch.cpp b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/AUCarbonViewDispatch.cpp
index 15a04e8..2762a67 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/AUCarbonViewDispatch.cpp
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/AUCarbonViewDispatch.cpp
@@ -2,14 +2,14 @@
      File: AUCarbonViewDispatch.cpp
  Abstract: AUCarbonViewDispatch.h
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #include "AUCarbonViewBase.h"
 
@@ -93,7 +93,7 @@ OSStatus		AUCarbonViewBase::ComponentEntryDispatch(ComponentParameters *p, AUCar
 	if (This == NULL) return paramErr;
 
 	OSStatus result = noErr;
-	
+
 	switch (p->what) {
 	case kAudioUnitCarbonViewCreateSelect:
 		{
@@ -104,7 +104,7 @@ OSStatus		AUCarbonViewBase::ComponentEntryDispatch(ComponentParameters *p, AUCar
 			CheckNull(pb->inSize);
 			CheckNull(pb->inLocation);
 			CheckNull(pb->outControl);
-			result = This->CreateCarbonView(pb->inAudioUnit, pb->inWindow, pb->inParentControl, 
+			result = This->CreateCarbonView(pb->inAudioUnit, pb->inWindow, pb->inParentControl,
 					*pb->inLocation, *pb->inSize, *pb->outControl);
 		}
 		break;
@@ -116,7 +116,7 @@ OSStatus		AUCarbonViewBase::ComponentEntryDispatch(ComponentParameters *p, AUCar
 		}
 		break;
 #endif
-	
+
 	default:
 		result = ComponentBase::ComponentEntryDispatch(p, This);
 		break;
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/AUControlGroup.cpp b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/AUControlGroup.cpp
index 8976b40..d0b7b41 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/AUControlGroup.cpp
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/AUControlGroup.cpp
@@ -2,14 +2,14 @@
      File: AUControlGroup.cpp
  Abstract: AUControlGroup.h
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #include <Carbon/Carbon.h>
 #include "AUCarbonViewBase.h"
@@ -59,10 +59,10 @@ static bool sLocalized = false;
 #endif
 
 void	AUControlGroup::CreateLabelledSlider(
-										AUCarbonViewBase *			auView, 
-										const CAAUParameter &		auvp, 
-										const Rect &				area, 
-										Point 						labelSize, 
+										AUCarbonViewBase *			auView,
+										const CAAUParameter &		auvp,
+										const Rect &				area,
+										Point 						labelSize,
 										const ControlFontStyleRec &	inFontStyle)
 {
 #if !__LP64__
@@ -73,14 +73,14 @@ void	AUControlGroup::CreateLabelledSlider(
 	CFStringRef cfstr;
 	int sliderValueMax, sliderValueMin, sliderValueDefault;
 	AUCarbonViewControl::ControlType sliderType;
-	
+
 	bool horizontal = (width > height);
 
 	if (horizontal) {
 		maxValRect.top = minValRect.top = area.top + (height - labelSize.v) / 2;
 		minValRect.left = area.left;
 		maxValRect.left = area.right - labelSize.h;
-		
+
 		minValRect.bottom = minValRect.top + labelSize.v;
 		minValRect.right = minValRect.left + labelSize.h;
 		maxValRect.bottom = maxValRect.top + labelSize.v;
@@ -104,12 +104,12 @@ void	AUControlGroup::CreateLabelledSlider(
 		maxValRect.left = minValRect.left = area.left + (width - labelSize.h) / 2;
 		maxValRect.top = area.top;
 		minValRect.top = area.bottom - labelSize.v;
-		
+
 		minValRect.bottom = minValRect.top + labelSize.v;
 		minValRect.right = minValRect.left + labelSize.h;
 		maxValRect.bottom = maxValRect.top + labelSize.v;
 		maxValRect.right = maxValRect.left + labelSize.h;
-	
+
 		sliderRect.left = area.left + (width - kSliderThinDimension) / 2;
 		sliderRect.right = sliderRect.left + kSliderThinDimension + 4;
 		sliderRect.top = maxValRect.bottom + kLabelAndSliderSpacing;
@@ -117,7 +117,7 @@ void	AUControlGroup::CreateLabelledSlider(
 
 		if (auvp.IsIndexedParam ()) {
 			sliderValueMin = sliderValueDefault = int(auvp.ParamInfo().minValue);
-			sliderValueMax = int(auvp.ParamInfo().maxValue);			
+			sliderValueMax = int(auvp.ParamInfo().maxValue);
 			sliderType = AUCarbonViewControl::kTypeDiscrete;
 		} else {
 			sliderValueMin = sliderValueDefault = 0;
@@ -134,7 +134,7 @@ void	AUControlGroup::CreateLabelledSlider(
 		verify_noerr(CreateStaticTextControl(auView->GetCarbonWindow(), &minValRect, cfstr, &fontStyle, &newControl));
 		CFRelease(cfstr);
 		verify_noerr(auView->EmbedControl(newControl));
-	
+
 		// maximum value label
 		cfstr = auvp.GetStringFromValueCopy(&auvp.ParamInfo().maxValue);
 		fontStyle.just = horizontal ? teFlushLeft : teCenter;
@@ -142,7 +142,7 @@ void	AUControlGroup::CreateLabelledSlider(
 		CFRelease(cfstr);
 		verify_noerr(auView->EmbedControl(newControl));
 	}
-	
+
 	// slider
 	verify_noerr(CreateSliderControl(auView->GetCarbonWindow(), &sliderRect, sliderValueDefault, sliderValueMin, sliderValueMax, kControlSliderDoesNotPoint, 0, true, AUCarbonViewControl::SliderTrackProc, &newControl));
 
@@ -154,10 +154,10 @@ void	AUControlGroup::CreateLabelledSlider(
 }
 
 void	AUControlGroup::CreateLabelledSliderAndEditText(
-										AUCarbonViewBase *			auView, 
-										const CAAUParameter &		auvp, 
-										const Rect &				area, 
-										Point 						labelSize, 
+										AUCarbonViewBase *			auView,
+										const CAAUParameter &		auvp,
+										const Rect &				area,
+										Point 						labelSize,
 										Point						editTextSize,
 										const ControlFontStyleRec &	inFontStyle)
 {
@@ -166,7 +166,7 @@ void	AUControlGroup::CreateLabelledSliderAndEditText(
 	Rect sliderArea, textArea;
 	ControlRef newControl;
 	int width = area.right - area.left, height = area.bottom - area.top;
-	
+
 	bool horizontal = (width > height);
 
 	sliderArea = area;
@@ -188,55 +188,55 @@ void	AUControlGroup::CreateLabelledSliderAndEditText(
 		textArea.right = textArea.left + editTextSize.h;
 	}
 	CreateLabelledSlider(auView, auvp, sliderArea, labelSize, fontStyle);
-	
-	verify_noerr(CreateEditUnicodeTextControl(auView->GetCarbonWindow(), &textArea, CFSTR(""), false, 
+
+	verify_noerr(CreateEditUnicodeTextControl(auView->GetCarbonWindow(), &textArea, CFSTR(""), false,
 			&fontStyle, &newControl));
 	auView->AddCarbonControl(AUCarbonViewControl::kTypeText, auvp, newControl);
 #endif
 }
 
-void	AUControlGroup::CreatePopupMenu (AUCarbonViewBase *			auView, 
-										const CAAUParameter &		auvp, 
-										const Rect &				area, 
+void	AUControlGroup::CreatePopupMenu (AUCarbonViewBase *			auView,
+										const CAAUParameter &		auvp,
+										const Rect &				area,
 										const ControlFontStyleRec &	inFontStyle,
 										const bool					inSizeToFit)
 {
 #if !__LP64__
 	ControlRef thePopUp;
-			
-	verify_noerr(CreatePopupButtonControl (auView->GetCarbonWindow(), &area, NULL, 
+
+	verify_noerr(CreatePopupButtonControl (auView->GetCarbonWindow(), &area, NULL,
 												-12345,	// DON'T GET MENU FROM RESOURCE mMenuID
-												FALSE,	// variableWidth, 
-												0,		// titleWidth, 
-												0,		// titleJustification, 
-												0,		// titleStyle, 
+												FALSE,	// variableWidth,
+												0,		// titleWidth,
+												0,		// titleJustification,
+												0,		// titleStyle,
 												&thePopUp));
-	
+
 	ControlSize small = kControlSizeSmall;
 	SetControlData(thePopUp, kControlEntireControl, kControlSizeTag, sizeof(ControlSize), &small);
-	
+
 	MenuRef menuRef;
 	verify_noerr(CreateNewMenu( 1, 0, &menuRef));
-	
+
 	for (int i = 0; i < auvp.GetNumIndexedParams(); ++i) {
 		verify_noerr(AppendMenuItemTextWithCFString (menuRef, auvp.GetParamName(i), kMenuItemAttrIgnoreMeta, 0, 0));
 	}
-	
+
 	verify_noerr(SetControlData(thePopUp, 0, kControlPopupButtonMenuRefTag, sizeof(menuRef), &menuRef));
 	SetControl32BitMaximum(thePopUp, auvp.GetNumIndexedParams());
 
 	verify_noerr (SetControlFontStyle (thePopUp, &inFontStyle));
-	
+
 	if (inSizeToFit) {
 		AUCarbonViewControl::SizeControlToFit(thePopUp);
 	}
-	
+
 	auView->AddCarbonControl(AUCarbonViewControl::kTypeDiscrete, auvp, thePopUp);
 #endif
 }
 
-void	AUControlGroup::AddAUInfo (		AUCarbonViewBase *			auView, 
-										const Point &				inLocation, 
+void	AUControlGroup::AddAUInfo (		AUCarbonViewBase *			auView,
+										const Point &				inLocation,
 										const SInt16 				inRightOffset,
 										const SInt16				inTotalWidth)
 {
@@ -245,14 +245,14 @@ void	AUControlGroup::AddAUInfo (		AUCarbonViewBase *			auView,
 	ComponentDescription desc;
     Handle h1 = NewHandleClear(4);
 	OSStatus err = GetComponentInfo ((Component)auView->GetEditAudioUnit(), &desc, h1, 0, 0);
-    
-    if (err == noErr) {        
+
+    if (err == noErr) {
         // Get the manufacturer's name... look for the ':' character convention
         HLock(h1);
         char* ptr1 = *h1;
         int len = *ptr1++;
         char* displayStr = 0;
-        
+
         for (int i = 0; i < len; ++i) {
             if (ptr1[i] == ':') { // found the name
                 ptr1[i++] = 0;
@@ -260,7 +260,7 @@ void	AUControlGroup::AddAUInfo (		AUCarbonViewBase *			auView,
                 break;
             }
         }
-        
+
         // localize as necessary:
         if (!sLocalized) {
             CFBundleRef mainBundle = CFBundleGetBundleWithIdentifier(kLocalizedStringBundle_AUView);
@@ -271,7 +271,7 @@ void	AUControlGroup::AddAUInfo (		AUCarbonViewBase *			auView,
                 sLocalized = true;
             }
         }
-        
+
         // display strings
         ControlRef newControl;
         Rect r;
@@ -279,7 +279,7 @@ void	AUControlGroup::AddAUInfo (		AUCarbonViewBase *			auView,
         ControlFontStyleRec fontStyle;
         fontStyle.flags = kControlUseFontMask | kControlUseJustMask;
         fontStyle.font = kControlFontSmallBoldSystemFont;
-        
+
         // display manufacturer string
         if (displayStr) {
             CFMutableStringRef mfrstring = CFStringCreateMutable(NULL, 0);
@@ -291,15 +291,15 @@ void	AUControlGroup::AddAUInfo (		AUCarbonViewBase *			auView,
                 CFStringAppend(mfrstring, mfrname);	// "Manufacturer: MFRName"
                 CFRelease (mfrname);
             }
-            
-            r.left = inLocation.h + inRightOffset;	
+
+            r.left = inLocation.h + inRightOffset;
 			r.right = inLocation.h + inTotalWidth - 28;
 			fontStyle.just = teFlushRight;
-            
+
             verify_noerr(CreateStaticTextControl(auView->GetCarbonWindow(), &r, mfrstring, &fontStyle, &newControl));
             verify_noerr(auView->EmbedControl(newControl));
             CFRelease (mfrstring);
-                                        
+
             //move displayStr ptr past the manu, to the name
             // we move the characters down an index, because the handle doesn't have any room
             // at the end for the \0
@@ -316,42 +316,42 @@ void	AUControlGroup::AddAUInfo (		AUCarbonViewBase *			auView,
 				displayStr[j] = displayStr[i];
 				++j; ++i;
 			} while (i < len);
-			
+
 			displayStr[j] = 0;
         }
-        
+
         // display AudioUnit string
         r.left = inLocation.h;	r.right = r.left + inRightOffset;
         fontStyle.just = 0;
-        
+
         CFMutableStringRef cfstr = CFStringCreateMutable(NULL, 0);
         CFStringAppend(cfstr, kAUViewLocalizedStringKey_AudioUnit);		// "Audio Unit"
         CFStringAppend(cfstr, kAUViewUnlocalizedString_TitleSeparator);
                                                         // "Audio Unit: "
-        
+
 		CFStringRef auname = CFStringCreateWithCString(NULL, displayStr, kCFStringEncodingUTF8);
 		CFStringAppend(cfstr, auname);				// "Audio Unit: AUName"
 		CFRelease (auname);
-        
+
         verify_noerr(CreateStaticTextControl(auView->GetCarbonWindow(), &r, cfstr, &fontStyle, &newControl));
-		
+
 		// size text control correctly
 		Boolean bValue = false;
 		SetControlData(newControl, kControlEntireControl, 'stim' /* kControlStaticTextIsMultilineTag */, sizeof(Boolean), &bValue);
 		SInt16 baseLineOffset;
 		Rect bestRect;
-		err = GetBestControlRect(newControl, &bestRect, &baseLineOffset);  
+		err = GetBestControlRect(newControl, &bestRect, &baseLineOffset);
 		if (err == noErr)
 		{
 			int width = (bestRect.right - bestRect.left) + 1;
 			int height = (bestRect.bottom - bestRect.top) + 1;
 			SizeControl (newControl, width, height);
 		}
-		
+
         verify_noerr(auView->EmbedControl(newControl));
         CFRelease (cfstr);
     }
-    
+
 	DisposeHandle (h1);
 #endif
 }
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/AUControlGroup.h b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/AUControlGroup.h
index 0e16100..89ef4f2 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/AUControlGroup.h
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/AUControlGroup.h
@@ -2,14 +2,14 @@
      File: AUControlGroup.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #ifndef __AUControlGroup_h__
 #define __AUControlGroup_h__
@@ -57,31 +57,31 @@ class CAAUParameter;
 class AUControlGroup {
 public:
 	/*! @method CreateLabelledSlider */
-	static void	CreateLabelledSlider(	AUCarbonViewBase *			auView, 
-										const CAAUParameter &		auvp, 
-										const Rect &				area, 
-										Point 						labelSize, 
+	static void	CreateLabelledSlider(	AUCarbonViewBase *			auView,
+										const CAAUParameter &		auvp,
+										const Rect &				area,
+										Point 						labelSize,
 										const ControlFontStyleRec &	fontStyle);
 
 	/*! @method CreateLabelledSliderAndEditText */
 	static void CreateLabelledSliderAndEditText(
-										AUCarbonViewBase *			auView, 
-										const CAAUParameter &		auvp, 
-										const Rect &				area, 
-										Point 						labelSize, 
+										AUCarbonViewBase *			auView,
+										const CAAUParameter &		auvp,
+										const Rect &				area,
+										Point 						labelSize,
 										Point						editTextSize,
 										const ControlFontStyleRec &	fontStyle);
 
 	/*! @method CreatePopupMenu */
-	static void CreatePopupMenu (		AUCarbonViewBase *			auView, 
-										const CAAUParameter &		auvp, 
-										const Rect &				area, 
+	static void CreatePopupMenu (		AUCarbonViewBase *			auView,
+										const CAAUParameter &		auvp,
+										const Rect &				area,
 										const ControlFontStyleRec &	inFontStyle,
 										const bool					inSizeToFit = false);
 
 	/*! @method AddAUInfo */
-	static void AddAUInfo (				AUCarbonViewBase *			auView, 
-										const Point &				inLocation, 
+	static void AddAUInfo (				AUCarbonViewBase *			auView,
+										const Point &				inLocation,
 										const SInt16 				inRightOffset,
 										const SInt16				inTotalWidth);
 };
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/CarbonEventHandler.cpp b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/CarbonEventHandler.cpp
index fe9a731..c935e33 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/CarbonEventHandler.cpp
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/CarbonEventHandler.cpp
@@ -2,14 +2,14 @@
      File: CarbonEventHandler.cpp
  Abstract: CarbonEventHandler.h
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #include "CarbonEventHandler.h"
 
@@ -65,22 +65,22 @@ CarbonEventHandler::~CarbonEventHandler()
 		int count = static_cast<int>(CFDictionaryGetCount(mHandlers));
 		EventHandlerRef *theHandlers = (EventHandlerRef*) malloc(count * sizeof(EventHandlerRef));
 		CFDictionaryGetKeysAndValues(mHandlers, NULL, (const void **)theHandlers);
-		
+
 		for (int i = 0; i < count; i++)
 			RemoveEventHandler(theHandlers[i]);
 		CFDictionaryRemoveAllValues(mHandlers);
 		CFRelease (mHandlers);
 		free(theHandlers);
-	}	
+	}
 }
 
 void	CarbonEventHandler::WantEventTypes(EventTargetRef target, UInt32 inNumTypes, const EventTypeSpec *inList)
 {
 	if (mHandlers == NULL)
 		mHandlers = CFDictionaryCreateMutable(NULL, 0, NULL, NULL);
-		
+
 	EventHandlerRef handler;
-	
+
 	if (CFDictionaryGetValueIfPresent (mHandlers, target, (const void **)&handler))	// if there is already a handler for the target, add the type
 		verify_noerr(AddEventTypesToHandler(handler, inNumTypes, inList));
 	else {
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/CarbonEventHandler.h b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/CarbonEventHandler.h
index 9225e1a..b3231a8 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/CarbonEventHandler.h
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/CarbonEventHandler.h
@@ -2,14 +2,14 @@
      File: CarbonEventHandler.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #ifndef __CarbonEventHandler_h__
 #define __CarbonEventHandler_h__
@@ -56,7 +56,7 @@ public:
 	CarbonEventHandler();
 	/*! @dtor ~CarbonEventHandler */
 	virtual ~CarbonEventHandler();
-	
+
 	/*! @method WantEventTypes */
 	virtual void	WantEventTypes(EventTargetRef target, UInt32 inNumTypes, const EventTypeSpec *inList);
 
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/AUInstrumentBase.cpp b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/AUInstrumentBase.cpp
index 1ce8b30..74336d9 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/AUInstrumentBase.cpp
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/AUInstrumentBase.cpp
@@ -2,14 +2,14 @@
      File: AUInstrumentBase.cpp
  Abstract: AUInstrumentBase.h
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #include "AUInstrumentBase.h"
 #include "AUMIDIDefs.h"
@@ -58,12 +58,12 @@
 const UInt32 kEventQueueSize = 1024;
 
 AUInstrumentBase::AUInstrumentBase(
-							AudioComponentInstance			inInstance, 
+							AudioComponentInstance			inInstance,
 							UInt32							numInputs,
 							UInt32							numOutputs,
 							UInt32							numGroups,
 							UInt32							numParts)
-	: MusicDeviceBase(inInstance, numInputs, numOutputs, numGroups), 
+	: MusicDeviceBase(inInstance, numInputs, numOutputs, numGroups),
 	mAbsoluteSampleFrame(0),
 	mEventQueue(kEventQueueSize),
 	mNumNotes(0),
@@ -79,7 +79,7 @@ AUInstrumentBase::AUInstrumentBase(
 	mFreeNotes.mState = kNoteState_Free;
 	SetWantsRenderThreadID(true);
 }
-	
+
 
 AUInstrumentBase::~AUInstrumentBase()
 {
@@ -100,12 +100,12 @@ AUElement *	AUInstrumentBase::CreateElement(AudioUnitScope inScope, AudioUnitEle
 	return MusicDeviceBase::CreateElement(inScope, element);
 }
 
-void		AUInstrumentBase::CreateExtendedElements() 
+void		AUInstrumentBase::CreateExtendedElements()
 {
 	Parts().Initialize(this, kAudioUnitScope_Part, mInitNumPartEls);
 }
 
-AUScope *	AUInstrumentBase::GetScopeExtended (AudioUnitScope inScope) 
+AUScope *	AUInstrumentBase::GetScopeExtended (AudioUnitScope inScope)
 {
 	if (inScope == kAudioUnitScope_Part)
 		return &mPartScope;
@@ -122,7 +122,7 @@ void		AUInstrumentBase::SetNotes(UInt32 inNumNotes, UInt32 inMaxActiveNotes, Syn
 	mMaxActiveNotes = inMaxActiveNotes;
 	mNoteSize = inNoteDataSize;
 	mNotes = inNotes;
-	
+
 	for (UInt32 i=0; i<mNumNotes; ++i)
 	{
 			SynthNote *note = GetNote(i);
@@ -138,7 +138,7 @@ UInt32		AUInstrumentBase::CountActiveNotes()
 	for (UInt32 i=0; i<mNumNotes; ++i)
 	{
 		SynthNote *note = GetNote(i);
-		if (note->GetState() <= kNoteState_Released) 
+		if (note->GetState() <= kNoteState_Released)
 			sum++;
 	}
 	return sum;
@@ -165,16 +165,16 @@ OSStatus			AUInstrumentBase::Initialize()
 TO DO:
 	Currently ValidFormat will check and validate that the num channels is not being
 	changed if the AU doesn't support the SupportedNumChannels property - which is correct
-	
+
 	What needs to happen here is that IFF the AU does support this property, (ie, the AU
 	can be configured to have different num channels than its original configuration) then
 	the state of the AU at Initialization needs to be validated.
-	
+
 	This is work still to be done - see AUEffectBase for the kind of logic that needs to be applied here
 */
 
 	// override to call SetNotes
-	
+
 	mNoteIDCounter = 128; // reset this every time we initialise
 	mAbsoluteSampleFrame = 0;
 	return noErr;
@@ -199,7 +199,7 @@ OSStatus			AUInstrumentBase::Reset(			AudioUnitScope 					inScope,
 		for (UInt32 i=0; i<mNumNotes; ++i)
 		{
 			SynthNote *note = GetNote(i);
-			if (note->IsSounding()) 
+			if (note->IsSounding())
 				note->Kill(0);
 			note->ListRemove();
 			mFreeNotes.AddNote(note);
@@ -225,7 +225,7 @@ void		AUInstrumentBase::PerformEvents(const AudioTimeStamp& inTimeStamp)
 #endif
 	SynthEvent *event;
 	SynthGroupElement *group;
-	
+
 	while ((event = mEventQueue.ReadItem()) != NULL)
 	{
 #if DEBUG_PRINT_RENDER
@@ -270,12 +270,12 @@ void		AUInstrumentBase::PerformEvents(const AudioTimeStamp& inTimeStamp)
 				group->ResetAllControllers(event->GetOffsetSampleFrame());
 				break;
 		}
-		
+
 		mEventQueue.AdvanceReadPtr();
 	}
 }
 
-														
+
 OSStatus			AUInstrumentBase::Render(   AudioUnitRenderActionFlags &	ioActionFlags,
 												const AudioTimeStamp &			inTimeStamp,
 												UInt32							inNumberFrames)
@@ -311,18 +311,18 @@ OSStatus			AUInstrumentBase::Render(   AudioUnitRenderActionFlags &	ioActionFlag
 bool				AUInstrumentBase::ValidFormat(	AudioUnitScope					inScope,
 													AudioUnitElement				inElement,
 													const CAStreamBasicDescription  & inNewFormat)
-{	
+{
 		// if the AU supports this, then we should just let this go through to the Init call
-	if (SupportedNumChannels (NULL)) 
+	if (SupportedNumChannels (NULL))
 		return MusicDeviceBase::ValidFormat(inScope, inElement, inNewFormat);
 
 	bool isGood = MusicDeviceBase::ValidFormat (inScope, inElement, inNewFormat);
 	if (!isGood) return false;
-	
+
 		// if we get to here, then the basic criteria is that the
 		// num channels cannot change on an existing bus
 	AUIOElement *el = GetIOElement (inScope, inElement);
-	return (el->GetStreamFormat().NumberChannels() == inNewFormat.NumberChannels()); 
+	return (el->GetStreamFormat().NumberChannels() == inNewFormat.NumberChannels());
 }
 
 
@@ -333,8 +333,8 @@ bool				AUInstrumentBase::StreamFormatWritable(	AudioUnitScope					scope,
 }
 
 OSStatus			AUInstrumentBase::RealTimeStartNote(	SynthGroupElement 			*inGroup,
-															NoteInstanceID 				inNoteInstanceID, 
-															UInt32 						inOffsetSampleFrame, 
+															NoteInstanceID 				inNoteInstanceID,
+															UInt32 						inOffsetSampleFrame,
 															const MusicDeviceNoteParams &inParams)
 {
 	return noErr;
@@ -358,10 +358,10 @@ SynthGroupElement *	AUInstrumentBase::GetElForGroupID (MusicDeviceGroupID	inGrou
 	AUScope & groups = Groups();
 	unsigned int numEls = groups.GetNumberOfElements();
 	SynthGroupElement* unassignedEl = NULL;
-	
+
 	for (unsigned int i = 0; i < numEls; ++i) {
 		SynthGroupElement* el = reinterpret_cast<SynthGroupElement*>(groups.GetElement(i));
-		if (el->GroupID() == inGroupID) 
+		if (el->GroupID() == inGroupID)
 			return el;
 		if (el->GroupID() == SynthGroupElement::kUnassignedGroup) {
 			unassignedEl = el;
@@ -376,14 +376,14 @@ SynthGroupElement *	AUInstrumentBase::GetElForGroupID (MusicDeviceGroupID	inGrou
 }
 
 OSStatus			AUInstrumentBase::RealTimeStopNote(
-												MusicDeviceGroupID 			inGroupID, 
-												NoteInstanceID 				inNoteInstanceID, 
+												MusicDeviceGroupID 			inGroupID,
+												NoteInstanceID 				inNoteInstanceID,
 												UInt32 						inOffsetSampleFrame)
 {
 #if DEBUG_PRINT
 	printf("AUInstrumentBase::RealTimeStopNote ch %d id %d\n", inGroupID, inNoteInstanceID);
 #endif
-	
+
 	SynthGroupElement *gp = (inGroupID == kMusicNoteEvent_Unused
 								? GetElForNoteID (inNoteInstanceID)
 								: GetElForGroupID(inGroupID));
@@ -391,7 +391,7 @@ OSStatus			AUInstrumentBase::RealTimeStopNote(
 	{
 		gp->NoteOff (inNoteInstanceID, inOffsetSampleFrame);
 	}
-	
+
 	return noErr;
 }
 
@@ -402,7 +402,7 @@ SynthGroupElement *	AUInstrumentBase::GetElForNoteID (NoteInstanceID inNoteID)
 #endif
 	AUScope & groups = Groups();
 	unsigned int numEls = groups.GetNumberOfElements();
-	
+
 	for (unsigned int i = 0; i < numEls; ++i) {
 		SynthGroupElement* el = reinterpret_cast<SynthGroupElement*>(groups.GetElement(i));
 		if (el->GetNote(inNoteID) != NULL)	// searches for any note state
@@ -411,27 +411,27 @@ SynthGroupElement *	AUInstrumentBase::GetElForNoteID (NoteInstanceID inNoteID)
 	throw static_cast<OSStatus>(kAudioUnitErr_InvalidElement);
 }
 
-OSStatus			AUInstrumentBase::StartNote(	MusicDeviceInstrumentID 	inInstrument, 
-													MusicDeviceGroupID 			inGroupID, 
-													NoteInstanceID *			outNoteInstanceID, 
-													UInt32 						inOffsetSampleFrame, 
+OSStatus			AUInstrumentBase::StartNote(	MusicDeviceInstrumentID 	inInstrument,
+													MusicDeviceGroupID 			inGroupID,
+													NoteInstanceID *			outNoteInstanceID,
+													UInt32 						inOffsetSampleFrame,
 													const MusicDeviceNoteParams &inParams)
 {
 	OSStatus err = noErr;
-	
-	NoteInstanceID noteID; 
+
+	NoteInstanceID noteID;
 	if (outNoteInstanceID) {
 		noteID = NextNoteID();
 		*outNoteInstanceID = noteID;
 	} else
 		noteID = (UInt32)inParams.mPitch;
-	
+
 #if DEBUG_PRINT
 	printf("AUInstrumentBase::StartNote ch %u, key %u, offset %u\n", inGroupID, (unsigned) inParams.mPitch, inOffsetSampleFrame);
 #endif
 
 	if (InRenderThread ())
-	{		
+	{
 		err = RealTimeStartNote(
 					GetElForGroupID(inGroupID),
 					noteID,
@@ -450,14 +450,14 @@ OSStatus			AUInstrumentBase::StartNote(	MusicDeviceInstrumentID 	inInstrument,
 			inOffsetSampleFrame,
 			&inParams
 		);
-		
+
 		mEventQueue.AdvanceWritePtr();
 	}
 	return err;
 }
 
-OSStatus			AUInstrumentBase::StopNote( MusicDeviceGroupID 			inGroupID, 
-												NoteInstanceID 				inNoteInstanceID, 
+OSStatus			AUInstrumentBase::StopNote( MusicDeviceGroupID 			inGroupID,
+												NoteInstanceID 				inNoteInstanceID,
 												UInt32 						inOffsetSampleFrame)
 {
 #if DEBUG_PRINT
@@ -466,7 +466,7 @@ OSStatus			AUInstrumentBase::StopNote( MusicDeviceGroupID 			inGroupID,
 	OSStatus err = noErr;
 
 	if (InRenderThread ())
-	{		
+	{
 		err = RealTimeStopNote(
 			inGroupID,
 			inNoteInstanceID,
@@ -484,7 +484,7 @@ OSStatus			AUInstrumentBase::StopNote( MusicDeviceGroupID 			inGroupID,
 			inOffsetSampleFrame,
 			NULL
 		);
-		
+
 		mEventQueue.AdvanceWritePtr();
 	}
 	return err;
@@ -492,13 +492,13 @@ OSStatus			AUInstrumentBase::StopNote( MusicDeviceGroupID 			inGroupID,
 
 OSStatus	AUInstrumentBase::SendPedalEvent(MusicDeviceGroupID inGroupID, UInt32 inEventType, UInt32 inOffsetSampleFrame)
 {
-	
+
 	if (InRenderThread ())
 	{
 		SynthGroupElement *group = GetElForGroupID(inGroupID);
 		if (!group)
 			return kAudioUnitErr_InvalidElement;
-		
+
 		switch (inEventType)
 		{
 			case SynthEvent::kEventType_SustainOn :
@@ -532,7 +532,7 @@ OSStatus	AUInstrumentBase::SendPedalEvent(MusicDeviceGroupID inGroupID, UInt32 i
 		if (!event) return -1; // queue full
 
 		event->Set(inEventType, inGroupID, 0, 0, NULL);
-		
+
 		mEventQueue.AdvanceWritePtr();
 	}
 	return noErr;
@@ -576,7 +576,7 @@ OSStatus	AUInstrumentBase::HandleControlChange(	UInt8 	inChannel,
 	}
 	return noErr;
 }
-												
+
 OSStatus	AUInstrumentBase::HandlePitchWheel(		UInt8 	inChannel,
 													UInt8 	inPitch1,	// LSB
 													UInt8 	inPitch2,	// MSB
@@ -592,7 +592,7 @@ OSStatus	AUInstrumentBase::HandlePitchWheel(		UInt8 	inChannel,
 		return kAudioUnitErr_InvalidElement;
 }
 
-												
+
 OSStatus	AUInstrumentBase::HandleChannelPressure(UInt8 	inChannel,
 													UInt8 	inValue,
 													UInt32	inStartFrame)
@@ -647,13 +647,13 @@ OSStatus	AUInstrumentBase::HandleResetAllControllers(	UInt8 	inChannel)
 	return SendPedalEvent (inChannel, SynthEvent::kEventType_ResetAllControllers, 0);
 }
 
-	
+
 OSStatus	AUInstrumentBase::HandleAllNotesOff(			UInt8 	inChannel)
 {
 	return SendPedalEvent (inChannel, SynthEvent::kEventType_AllNotesOff, 0);
 }
 
-	
+
 OSStatus	AUInstrumentBase::HandleAllSoundOff(			UInt8 	inChannel)
 {
 	return SendPedalEvent (inChannel, SynthEvent::kEventType_AllSoundOff, 0);
@@ -670,7 +670,7 @@ SynthNote*  AUInstrumentBase::GetAFreeNote(UInt32 inFrame)
 		mFreeNotes.RemoveNote(note);
 		return note;
 	}
-	
+
 	return VoiceStealing(inFrame, true);
 }
 
@@ -724,13 +724,13 @@ SynthNote*  AUInstrumentBase::VoiceStealing(UInt32 inFrame, bool inKillIt)
 #if DEBUG_PRINT_NOTE
 	printf("no notes to steal????\n");
 #endif
-	return NULL; // It should be impossible to get here. It means there were no notes to kill in any state. 
+	return NULL; // It should be impossible to get here. It means there were no notes to kill in any state.
 }
 
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
 AUMonotimbralInstrumentBase::AUMonotimbralInstrumentBase(
-							AudioComponentInstance			inInstance, 
+							AudioComponentInstance			inInstance,
 							UInt32							numInputs,
 							UInt32							numOutputs,
 							UInt32							numGroups,
@@ -739,28 +739,28 @@ AUMonotimbralInstrumentBase::AUMonotimbralInstrumentBase(
 {
 }
 
-OSStatus			AUMonotimbralInstrumentBase::RealTimeStartNote(	
-															SynthGroupElement 			*inGroup, 
-															NoteInstanceID 				inNoteInstanceID, 
-															UInt32 						inOffsetSampleFrame, 
+OSStatus			AUMonotimbralInstrumentBase::RealTimeStartNote(
+															SynthGroupElement 			*inGroup,
+															NoteInstanceID 				inNoteInstanceID,
+															UInt32 						inOffsetSampleFrame,
 															const MusicDeviceNoteParams &inParams)
 {
 #if DEBUG_PRINT_RENDER
 	printf("AUMonotimbralInstrumentBase::RealTimeStartNote %d\n", inNoteInstanceID);
 #endif
 
-	if (NumActiveNotes() + 1 > MaxActiveNotes()) 
+	if (NumActiveNotes() + 1 > MaxActiveNotes())
 	{
 		VoiceStealing(inOffsetSampleFrame, false);
 	}
 	SynthNote *note = GetAFreeNote(inOffsetSampleFrame);
 	if (!note) return -1;
-	
+
 	SynthPartElement *part = GetPartElement (0);	// Only one part for monotimbral
-	
+
 	IncNumActiveNotes();
 	inGroup->NoteOn(note, part, inNoteInstanceID, inOffsetSampleFrame, inParams);
-	
+
 	return noErr;
 }
 
@@ -774,8 +774,8 @@ OSStatus			AUMultitimbralInstrumentBase::GetPropertyInfo(AudioUnitPropertyID	inI
 												Boolean &					outWritable)
 {
 	OSStatus result = noErr;
-	
-	switch (inID) 
+
+	switch (inID)
 	{
 #if !TARGET_OS_IPHONE
 		case kMusicDeviceProperty_PartGroup:
@@ -797,7 +797,7 @@ OSStatus			AUMultitimbralInstrumentBase::GetProperty(	AudioUnitPropertyID 	inID,
 {
 	OSStatus result = noErr;
 
-	switch (inID) 
+	switch (inID)
 	{
 #if !TARGET_OS_IPHONE
 		case kMusicDeviceProperty_PartGroup:
@@ -809,7 +809,7 @@ OSStatus			AUMultitimbralInstrumentBase::GetProperty(	AudioUnitPropertyID 	inID,
 		default:
 			result = AUInstrumentBase::GetProperty (inID, inScope, inElement, outData);
 	}
-	
+
 	return result;
 }
 
@@ -823,7 +823,7 @@ OSStatus			AUMultitimbralInstrumentBase::SetProperty(  AudioUnitPropertyID 			in
 {
 	OSStatus result = noErr;
 
-	switch (inID) 
+	switch (inID)
 	{
 #if !TARGET_OS_IPHONE
 		case kMusicDeviceProperty_PartGroup:
@@ -835,7 +835,7 @@ OSStatus			AUMultitimbralInstrumentBase::SetProperty(  AudioUnitPropertyID 			in
 		default:
 			result = MusicDeviceBase::SetProperty (inID, inScope, inElement, inData, inDataSize);
 	}
-	
+
 	return result;
 }
 
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/AUInstrumentBase.h b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/AUInstrumentBase.h
index 3ad7e03..7e3bfbf 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/AUInstrumentBase.h
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/AUInstrumentBase.h
@@ -2,14 +2,14 @@
      File: AUInstrumentBase.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #ifndef __AUInstrumentBase__
 #define __AUInstrumentBase__
@@ -66,7 +66,7 @@ class AUInstrumentBase : public MusicDeviceBase
 {
 public:
 			AUInstrumentBase(
-							AudioComponentInstance			inInstance, 
+							AudioComponentInstance			inInstance,
 							UInt32							numInputs,
 							UInt32							numOutputs,
 							UInt32							numGroups = 16,
@@ -74,7 +74,7 @@ public:
 	virtual ~AUInstrumentBase();
 
 	virtual OSStatus			Initialize();
-	
+
 	/*! @method Parts */
 	AUScope &					Parts()	{ return mPartScope; }
 
@@ -92,10 +92,10 @@ public:
 	virtual void				CreateExtendedElements();
 
 	virtual void				Cleanup();
-	
+
 	virtual OSStatus			Reset(					AudioUnitScope 					inScope,
 														AudioUnitElement 				inElement);
-														
+
 	virtual bool				ValidFormat(			AudioUnitScope					inScope,
 														AudioUnitElement				inElement,
 														const CAStreamBasicDescription  & inNewFormat);
@@ -109,35 +109,35 @@ public:
 														const AudioTimeStamp &			inTimeStamp,
 														UInt32							inNumberFrames);
 
-	virtual OSStatus			StartNote(		MusicDeviceInstrumentID 	inInstrument, 
-												MusicDeviceGroupID 			inGroupID, 
-												NoteInstanceID *			outNoteInstanceID, 
-												UInt32 						inOffsetSampleFrame, 
+	virtual OSStatus			StartNote(		MusicDeviceInstrumentID 	inInstrument,
+												MusicDeviceGroupID 			inGroupID,
+												NoteInstanceID *			outNoteInstanceID,
+												UInt32 						inOffsetSampleFrame,
 												const MusicDeviceNoteParams &inParams);
 
-	virtual OSStatus			StopNote(		MusicDeviceGroupID 			inGroupID, 
-												NoteInstanceID 				inNoteInstanceID, 
+	virtual OSStatus			StopNote(		MusicDeviceGroupID 			inGroupID,
+												NoteInstanceID 				inNoteInstanceID,
 												UInt32 						inOffsetSampleFrame);
 
 	virtual OSStatus			RealTimeStartNote(		SynthGroupElement 			*inGroup,
-														NoteInstanceID 				inNoteInstanceID, 
-														UInt32 						inOffsetSampleFrame, 
+														NoteInstanceID 				inNoteInstanceID,
+														UInt32 						inOffsetSampleFrame,
 														const MusicDeviceNoteParams &inParams);
-	
-	virtual OSStatus			RealTimeStopNote(		MusicDeviceGroupID 			inGroupID, 
-														NoteInstanceID 				inNoteInstanceID, 
+
+	virtual OSStatus			RealTimeStopNote(		MusicDeviceGroupID 			inGroupID,
+														NoteInstanceID 				inNoteInstanceID,
 														UInt32 						inOffsetSampleFrame);
-	
+
 	virtual OSStatus	HandleControlChange(	UInt8	inChannel,
 												UInt8 	inController,
 												UInt8 	inValue,
 												UInt32	inStartFrame);
-												
+
 	virtual OSStatus	HandlePitchWheel(		UInt8 	inChannel,
 												UInt8 	inPitch1,
 												UInt8 	inPitch2,
 												UInt32	inStartFrame);
-												
+
 	virtual OSStatus	HandleChannelPressure(	UInt8 	inChannel,
 												UInt8 	inValue,
 												UInt32	inStartFrame);
@@ -151,31 +151,31 @@ public:
 												UInt32	inStartFrame);
 
 	virtual OSStatus	HandleResetAllControllers(		UInt8 	inChannel);
-	
+
 	virtual OSStatus	HandleAllNotesOff(				UInt8 	inChannel);
-	
+
 	virtual OSStatus	HandleAllSoundOff(				UInt8 	inChannel);
 
-	SynthNote*			GetNote(UInt32 inIndex) 
-						{ 
+	SynthNote*			GetNote(UInt32 inIndex)
+						{
 							if (!mNotes)
 								throw std::runtime_error("no notes");
-							return (SynthNote*)((char*)mNotes + inIndex * mNoteSize); 
+							return (SynthNote*)((char*)mNotes + inIndex * mNoteSize);
 						}
-	
+
 	SynthNote*			GetAFreeNote(UInt32 inFrame);
 	void				AddFreeNote(SynthNote* inNote);
-	
+
 	friend class SynthGroupElement;
 protected:
 
 	UInt32				NextNoteID() { return OSAtomicIncrement32((int32_t *)&mNoteIDCounter); }
-	
-	
-	// call SetNotes in your Initialize() method to give the base class your note structures and to set the maximum 
+
+
+	// call SetNotes in your Initialize() method to give the base class your note structures and to set the maximum
 	// number of active notes. inNoteData should be an array of size inMaxActiveNotes.
 	void				SetNotes(UInt32 inNumNotes, UInt32 inMaxActiveNotes, SynthNote* inNotes, UInt32 inNoteSize);
-	
+
 	void				PerformEvents(   const AudioTimeStamp &			inTimeStamp);
 	OSStatus			SendPedalEvent(MusicDeviceGroupID inGroupID, UInt32 inEventType, UInt32 inOffsetSampleFrame);
 	virtual SynthNote*  VoiceStealing(UInt32 inFrame, bool inKillIt);
@@ -184,29 +184,29 @@ protected:
 	void				IncNumActiveNotes() { ++mNumActiveNotes; }
 	void				DecNumActiveNotes() { --mNumActiveNotes; }
 	UInt32				CountActiveNotes();
-	
+
 	SynthPartElement *	GetPartElement (AudioUnitElement inPartElement);
-	
+
 			// this call throws if there's no assigned element for the group ID
 	virtual SynthGroupElement *	GetElForGroupID (MusicDeviceGroupID	inGroupID);
 	virtual SynthGroupElement *	GetElForNoteID (NoteInstanceID inNoteID);
 
 	SInt64 mAbsoluteSampleFrame;
 
-	
+
 private:
-				
+
 	SInt32 mNoteIDCounter;
-	
+
 	SynthEventQueue mEventQueue;
-	
+
 	UInt32 mNumNotes;
 	UInt32 mNumActiveNotes;
 	UInt32 mMaxActiveNotes;
-	SynthNote* mNotes;	
+	SynthNote* mNotes;
 	SynthNoteList mFreeNotes;
 	UInt32 mNoteSize;
-	
+
 	AUScope			mPartScope;
 	const UInt32	mInitNumPartEls;
 };
@@ -217,15 +217,15 @@ class AUMonotimbralInstrumentBase : public AUInstrumentBase
 {
 public:
 	AUMonotimbralInstrumentBase(
-							AudioComponentInstance			inInstance, 
+							AudioComponentInstance			inInstance,
 							UInt32							numInputs,
 							UInt32							numOutputs,
 							UInt32							numGroups = 16,
 							UInt32							numParts = 1);
-										
-	virtual OSStatus			RealTimeStartNote(			SynthGroupElement 			*inGroup, 
-															NoteInstanceID 				inNoteInstanceID, 
-															UInt32 						inOffsetSampleFrame, 
+
+	virtual OSStatus			RealTimeStartNote(			SynthGroupElement 			*inGroup,
+															NoteInstanceID 				inNoteInstanceID,
+															UInt32 						inOffsetSampleFrame,
 															const MusicDeviceNoteParams &inParams);
 };
 
@@ -236,12 +236,12 @@ class AUMultitimbralInstrumentBase : public AUInstrumentBase
 {
 public:
 	AUMultitimbralInstrumentBase(
-							AudioComponentInstance			inInstance, 
+							AudioComponentInstance			inInstance,
 							UInt32							numInputs,
 							UInt32							numOutputs,
 							UInt32							numGroups,
 							UInt32							numParts);
-							
+
 	virtual OSStatus			GetPropertyInfo(		AudioUnitPropertyID				inID,
 														AudioUnitScope					inScope,
 														AudioUnitElement				inElement,
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/LockFreeFIFO.h b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/LockFreeFIFO.h
index ea6c4c2..f9a0ec2 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/LockFreeFIFO.h
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/LockFreeFIFO.h
@@ -2,14 +2,14 @@
      File: LockFreeFIFO.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #include <libkern/OSAtomic.h>
 
@@ -58,22 +58,22 @@ public:
 		mItems = new ITEM[inMaxSize];
 		mMask = inMaxSize - 1;
 	}
-	
+
 	~LockFreeFIFOWithFree()
 	{
 		delete [] mItems;
 	}
 
-	
-	void Reset() 
+
+	void Reset()
 	{
 		FreeItems();
 		mReadIndex = 0;
 		mWriteIndex = 0;
 		mFreeIndex = 0;
 	}
-	
-	ITEM* WriteItem() 
+
+	ITEM* WriteItem()
 	{
 		//printf("WriteItem %d %d\n", mReadIndex, mWriteIndex);
 		FreeItems(); // free items on the write thread.
@@ -81,8 +81,8 @@ public:
 		if (nextWriteIndex == mFreeIndex) return NULL;
 		return &mItems[mWriteIndex];
 	}
-	
-	ITEM* ReadItem() 
+
+	ITEM* ReadItem()
 	{
 		//printf("ReadItem %d %d\n", mReadIndex, mWriteIndex);
 		if (mReadIndex == mWriteIndex) return NULL;
@@ -91,14 +91,14 @@ public:
 	void AdvanceWritePtr() { OSAtomicCompareAndSwap32(mWriteIndex, (mWriteIndex + 1) & mMask, &mWriteIndex); }
 	void AdvanceReadPtr()  { OSAtomicCompareAndSwap32(mReadIndex,  (mReadIndex  + 1) & mMask, &mReadIndex); }
 private:
-	ITEM* FreeItem() 
+	ITEM* FreeItem()
 	{
 		if (mFreeIndex == mReadIndex) return NULL;
 		return &mItems[mFreeIndex];
 	}
 	void AdvanceFreePtr() { OSAtomicCompareAndSwap32(mFreeIndex, (mFreeIndex + 1) & mMask, &mFreeIndex); }
-	
-	void FreeItems() 
+
+	void FreeItems()
 	{
 		ITEM* item;
 		while ((item = FreeItem()) != NULL)
@@ -107,7 +107,7 @@ private:
 			AdvanceFreePtr();
 		}
 	}
-	
+
 	volatile int32_t mReadIndex, mWriteIndex, mFreeIndex;
 	int32_t mMask;
 	ITEM *mItems;
@@ -129,38 +129,38 @@ public:
 		mItems = new ITEM[inMaxSize];
 		mMask = inMaxSize - 1;
 	}
-	
+
 	~LockFreeFIFO()
 	{
 		delete [] mItems;
 	}
-	
-	void Reset() 
+
+	void Reset()
 	{
 		mReadIndex = 0;
 		mWriteIndex = 0;
 	}
-	
-	ITEM* WriteItem() 
+
+	ITEM* WriteItem()
 	{
 		int32_t nextWriteIndex = (mWriteIndex + 1) & mMask;
 		if (nextWriteIndex == mReadIndex) return NULL;
 		return &mItems[mWriteIndex];
 	}
-	
-	ITEM* ReadItem() 
+
+	ITEM* ReadItem()
 	{
 		if (mReadIndex == mWriteIndex) return NULL;
 		return &mItems[mReadIndex];
 	}
-	
+
 		// the CompareAndSwap will always succeed. We use CompareAndSwap because it calls the PowerPC sync instruction,
 		// plus any processor bug workarounds for various CPUs.
 	void AdvanceWritePtr() { OSAtomicCompareAndSwap32(mWriteIndex, (mWriteIndex + 1) & mMask, &mWriteIndex); }
 	void AdvanceReadPtr()  { OSAtomicCompareAndSwap32(mReadIndex,  (mReadIndex  + 1) & mMask, &mReadIndex); }
-	
+
 private:
-	
+
 	volatile int32_t mReadIndex, mWriteIndex;
 	int32_t mMask;
 	ITEM *mItems;
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/MIDIControlHandler.h b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/MIDIControlHandler.h
index 0f8003f..408108c 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/MIDIControlHandler.h
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/MIDIControlHandler.h
@@ -2,14 +2,14 @@
      File: MIDIControlHandler.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #ifndef __MIDICONTROLHANDLER_H__
 #define	__MIDICONTROLHANDLER_H__
@@ -62,11 +62,11 @@ public:
 	virtual bool	SetPolyPressure(UInt8 inKey, UInt8 inValue) = 0;
 	virtual bool	SetController(UInt8 inControllerNumber, UInt8 inValue) = 0;
 	virtual bool	SetSysex(void *inSysexMsg) = 0;
-	
+
 	virtual float	GetPitchBend() const = 0;
 
 	/*! Default controller values.  These represent MSB values unless indicated in the name */
-	
+
 	enum
 	{
 		kDefault_Midpoint				= 0x40,		//! Used for all center-null-point controllers
@@ -78,7 +78,7 @@ public:
 		kDefault_ChannelPressure	= 0,
 		kDefault_ReverbSend			= 40,
 		kDefault_ChorusSend			= 0,
-		
+
 		kDefault_RPN_LSB				= 0x7f,
 		kDefault_RPN_MSB				= 0x7f,
 		kDefault_PitchBendRange		= 2,
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/SynthElement.cpp b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/SynthElement.cpp
index fd329f8..cef3a50 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/SynthElement.cpp
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/SynthElement.cpp
@@ -2,14 +2,14 @@
      File: SynthElement.cpp
  Abstract: SynthElement.h
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #include "SynthElement.h"
 #include "AUInstrumentBase.h"
@@ -78,7 +78,7 @@ void MidiControls::Reset()
 }
 
 
-SynthElement::SynthElement(AUInstrumentBase *audioUnit, UInt32 inElement) 
+SynthElement::SynthElement(AUInstrumentBase *audioUnit, UInt32 inElement)
 	: AUElement(audioUnit), mIndex(inElement)
 {
 }
@@ -87,7 +87,7 @@ SynthElement::~SynthElement()
 {
 }
 
-SynthGroupElement::SynthGroupElement(AUInstrumentBase *audioUnit, UInt32 inElement, MIDIControlHandler *inHandler) 
+SynthGroupElement::SynthGroupElement(AUInstrumentBase *audioUnit, UInt32 inElement, MIDIControlHandler *inHandler)
 	: SynthElement(audioUnit, inElement),
 	mCurrentAbsoluteFrame(-1),
 	mMidiControlHandler(inHandler),
@@ -109,7 +109,7 @@ void	SynthGroupElement::SetGroupID (MusicDeviceGroupID inGroup)
 	mGroupID = inGroup;
 }
 
-void SynthGroupElement::Reset() 
+void SynthGroupElement::Reset()
 {
 #if DEBUG_PRINT
 	printf("SynthGroupElement::Reset\n");
@@ -119,7 +119,7 @@ void SynthGroupElement::Reset()
 		mNoteList[i].Empty();
 }
 
-SynthPartElement::SynthPartElement(AUInstrumentBase *audioUnit, UInt32 inElement) 
+SynthPartElement::SynthPartElement(AUInstrumentBase *audioUnit, UInt32 inElement)
 	: SynthElement(audioUnit, inElement)
 {
 }
@@ -132,7 +132,7 @@ SynthNote *SynthGroupElement::GetNote(NoteInstanceID inNoteID, bool unreleasedOn
 #if DEBUG_PRINT_RENDER
 	printf("SynthGroupElement::GetNote %d, unreleased = %d\n", inNoteID, unreleasedOnly);
 #endif
-	const UInt32 lastNoteState = unreleasedOnly ? 
+	const UInt32 lastNoteState = unreleasedOnly ?
 									(mSostenutoIsOn ? kNoteState_Sostenutoed : kNoteState_Attacked)
 										: kNoteState_Released;
 	SynthNote *note = NULL;
@@ -176,7 +176,7 @@ void SynthGroupElement::NoteOn(SynthNote *note,
 }
 
 void SynthGroupElement::NoteOff(NoteInstanceID inNoteID, UInt32 inFrame)
-{	
+{
 #if DEBUG_PRINT_NOTE
 	printf("SynthGroupElement::NoteOff %d\n", inNoteID);
 #endif
@@ -217,7 +217,7 @@ void SynthGroupElement::NoteEnded(SynthNote *inNote, UInt32 inFrame)
 		SynthNoteList *list = &mNoteList[inNote->GetState()];
 		list->RemoveNote(inNote);
 	}
-	
+
 	GetAUInstrument()->AddFreeNote(inNote);
 }
 
@@ -245,7 +245,7 @@ bool SynthGroupElement::ChannelMessage(UInt16 controllerID, UInt16 inValue)
 	// Sustain and sostenuto are "pedal events", and are handled during render cycle
 	if (controllerID <= kMidiController_RPN_MSB && controllerID != kMidiController_Sustain && controllerID != kMidiController_Sostenuto)
 		handled = mMidiControlHandler->SetController(controllerID, UInt8(inValue));
-	else 
+	else
 	{
 		switch (controllerID)
 		{
@@ -296,7 +296,7 @@ void SynthGroupElement::SostenutoOff(UInt32 inFrame)
 		mMidiControlHandler->SetController(kMidiController_Sostenuto, 0);
 		mSostenutoIsOn = false;
 		mNoteList[kNoteState_Attacked].TransferAllFrom(&mNoteList[kNoteState_Sostenutoed], inFrame);
-		if (mSustainIsOn) 
+		if (mSustainIsOn)
 			mNoteList[kNoteState_ReleasedButSustained].TransferAllFrom(&mNoteList[kNoteState_ReleasedButSostenutoed], inFrame);
 		else
 			mNoteList[kNoteState_Released].TransferAllFrom(&mNoteList[kNoteState_ReleasedButSostenutoed], inFrame);
@@ -323,7 +323,7 @@ void SynthGroupElement::SustainOff(UInt32 inFrame)
 	if (mSustainIsOn) {
 		mMidiControlHandler->SetController(kMidiController_Sustain, 0);
 		mSustainIsOn = false;
-	
+
 		mNoteList[kNoteState_Released].TransferAllFrom(&mNoteList[kNoteState_ReleasedButSustained], inFrame);
 	}
 }
@@ -342,14 +342,14 @@ void SynthGroupElement::AllNotesOff(UInt32 inFrame)
 		while (note)
 		{
 			SynthNote *nextNote = note->mNext;
-			
+
 			mNoteList[i].RemoveNote(note);
 			note->Release(inFrame);
 			mNoteList[newState].AddNote(note);
-			
+
 			note = nextNote;
 		}
-	}	
+	}
 }
 
 void SynthGroupElement::AllSoundOff(UInt32 inFrame)
@@ -358,21 +358,21 @@ void SynthGroupElement::AllSoundOff(UInt32 inFrame)
 	printf("SynthGroupElement::AllSoundOff\n");
 #endif
 	SynthNote *note;
-	
+
 	for (UInt32 i=0 ; i<kNumberOfActiveNoteStates; ++i)
 	{
 		note = mNoteList[i].mHead;
 		while (note)
 		{
 			SynthNote *nextNote = note->mNext;
-			
+
 			mNoteList[i].RemoveNote(note);
 			note->FastRelease(inFrame);
 			mNoteList[kNoteState_FastReleased].AddNote(note);
 			GetAUInstrument()->DecNumActiveNotes();
 			note = nextNote;
 		}
-	}	
+	}
 }
 
 void SynthGroupElement::ResetAllControllers(UInt32 inFrame)
@@ -395,7 +395,7 @@ OSStatus SynthGroupElement::Render(SInt64 inAbsoluteSampleFrame, UInt32 inNumber
 		{
 			buffArray[outBus] = &GetAudioUnit()->GetOutput(outBus)->GetBufferList();
 		}
-		
+
 		for (UInt32 i=0 ; i<kNumberOfSoundingNoteStates; ++i)
 		{
 			SynthNote *note = mNoteList[i].mHead;
@@ -405,10 +405,10 @@ OSStatus SynthGroupElement::Render(SInt64 inAbsoluteSampleFrame, UInt32 inNumber
 				printf("SynthGroupElement::Render: state %d, note %p\n", i, note);
 #endif
 				SynthNote *nextNote = note->mNext;
-				
+
 				OSStatus err = note->Render(inAbsoluteSampleFrame, inNumberFrames, buffArray, numOutputs);
 				if (err) return err;
-				
+
 				note = nextNote;
 			}
 		}
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/SynthElement.h b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/SynthElement.h
index 4ca3643..8f844a5 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/SynthElement.h
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/SynthElement.h
@@ -2,14 +2,14 @@
      File: SynthElement.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #ifndef __SynthElement__
 #define __SynthElement__
@@ -62,9 +62,9 @@ public:
 	virtual ~SynthElement();
 
 	UInt32 GetIndex() const { return mIndex; }
-	
+
 	AUInstrumentBase* GetAUInstrument() { return (AUInstrumentBase*)GetAudioUnit(); }
-	
+
 private:
 	UInt32 mIndex;
 };
@@ -98,11 +98,11 @@ public:
 
 	virtual float GetPitchBend() const { return mFPitchBend * mFPitchBendDepth; }
 
-	SInt16 GetHiResControl(UInt32 inIndex) const 
-	{   
+	SInt16 GetHiResControl(UInt32 inIndex) const
+	{
 		return ((mControls[inIndex] & 127) << 7) | (mControls[inIndex + 32] & 127);
 	}
-	
+
 	float GetControl(UInt32 inIndex) const
 	{
 		if (inIndex < 32) {
@@ -111,10 +111,10 @@ public:
 			return (float)mControls[inIndex];
 		}
 	}
-	
-	
+
+
 private:
-	
+
 	UInt8 mControls[128];
 	UInt8 mPolyPressure[128];
 	UInt8 mMonoPressure;
@@ -124,17 +124,17 @@ private:
 	UInt16 mActiveNRPN;
 	UInt16 mActiveRPValue;
 	UInt16 mActiveNRPValue;
-	
+
 	UInt16 mPitchBendDepth;
 	float mFPitchBendDepth;
 	float mFPitchBend;
-	
+
 	void SetHiResControl(UInt32 inIndex, UInt8 inMSB, UInt8 inLSB)
-		{ 
+		{
 			mControls[inIndex] = inMSB;
 			mControls[inIndex + 32] = inLSB;
 		}
-		
+
 };
 
 
@@ -144,7 +144,7 @@ public:
 	enum {
 		kUnassignedGroup = 0xFFFFFFFF
 	};
-	
+
 	SynthGroupElement(AUInstrumentBase *audioUnit, UInt32 inElement, MIDIControlHandler *inHandler);
 	virtual					~SynthGroupElement();
 
@@ -157,27 +157,27 @@ public:
 
 	void					NoteEnded(SynthNote *inNote, UInt32 inFrame);
 	void					NoteFastReleased(SynthNote *inNote);
-	
+
 	virtual bool			ChannelMessage(UInt16 controlID, UInt16 controlValue);
 	virtual void			AllNotesOff(UInt32 inFrame);
 	virtual void			AllSoundOff(UInt32 inFrame);
 	void					ResetAllControllers(UInt32 inFrame);
-	
+
 	SynthNote *				GetNote(NoteInstanceID inNoteID, bool unreleasedOnly=false, UInt32 *outNoteState=NULL);
-	
+
 	void					Reset();
-	
+
 	virtual OSStatus		Render(SInt64 inAbsoluteSampleFrame, UInt32 inNumberFrames, AUScope &outputs);
-	
+
 	float					GetPitchBend() const { return mMidiControlHandler->GetPitchBend(); }
 	SInt64					GetCurrentAbsoluteFrame() const { return mCurrentAbsoluteFrame; }
-	
+
 	MusicDeviceGroupID		GroupID () const { return mGroupID; }
 	virtual void			SetGroupID (MusicDeviceGroupID inGroup);
 
 	MIDIControlHandler *	GetMIDIControlHandler() const { return mMidiControlHandler; }
-	
-protected:	
+
+protected:
 	SInt64					mCurrentAbsoluteFrame;
 	SynthNoteList 			mNoteList[kNumberOfSoundingNoteStates];
 	MIDIControlHandler		*mMidiControlHandler;
@@ -186,7 +186,7 @@ private:
 	friend class AUInstrumentBase;
 	friend class AUMonotimbralInstrumentBase;
 	friend class AUMultitimbralInstrumentBase;
-	
+
 	bool					mSustainIsOn;
 	bool					mSostenutoIsOn;
 	UInt32					mOutputBus;
@@ -213,15 +213,15 @@ public:
 
 	UInt32		GetGroupIndex() const { return mGroupIndex; }
 	bool		InRange(Float32 inNote, Float32 inVelocity);
-	
+
 	UInt32		GetMaxPolyphony() const { return mMaxPolyphony; }
 	void		SetMaxPolyphony(UInt32 inMaxPolyphony) { mMaxPolyphony = inMaxPolyphony; }
-	
+
 private:
 	UInt32							mGroupIndex;
 	UInt32							mPatchIndex;
 	UInt32							mMaxPolyphony;
-	SynthKeyZone					mKeyZone;	
+	SynthKeyZone					mKeyZone;
 };
 
 #endif
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/SynthEvent.h b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/SynthEvent.h
index 9c27aee..abb7886 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/SynthEvent.h
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/SynthEvent.h
@@ -2,14 +2,14 @@
      File: SynthEvent.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 /* You can either fill in code here or remove this and create or add new files. */
 
@@ -76,7 +76,7 @@ public:
 	SynthEvent() {}
 	~SynthEvent() {}
 
-	void Set(   
+	void Set(
 				UInt32							inEventType,
 				MusicDeviceGroupID				inGroupID,
 				NoteInstanceID					inNoteID,
@@ -88,20 +88,20 @@ public:
 		mGroupID = inGroupID;
 		mNoteID = inNoteID;
 		mOffsetSampleFrame = inOffsetSampleFrame;
-		
+
 		if (inNoteParams)
 		{
-			UInt32 paramSize = offsetof(MusicDeviceNoteParams, mControls) + (inNoteParams->argCount-2)*sizeof(NoteParamsControlValue); 
-			mNoteParams = inNoteParams->argCount > 3 
-								? (MusicDeviceNoteParams*)malloc(paramSize) 
+			UInt32 paramSize = offsetof(MusicDeviceNoteParams, mControls) + (inNoteParams->argCount-2)*sizeof(NoteParamsControlValue);
+			mNoteParams = inNoteParams->argCount > 3
+								? (MusicDeviceNoteParams*)malloc(paramSize)
 								: &mSmallNoteParams;
 			memcpy(mNoteParams, inNoteParams, paramSize);
 		}
-		else 
+		else
 			mNoteParams = NULL;
 	}
-	
-	
+
+
 	void Free()
 	{
 		if (mNoteParams)
@@ -111,27 +111,27 @@ public:
 			mNoteParams = NULL;
 		}
 	}
-	
+
 	UInt32					GetEventType() const { return mEventType; }
 	MusicDeviceGroupID		GetGroupID() const { return mGroupID; }
 	NoteInstanceID			GetNoteID() const { return mNoteID; }
 	UInt32					GetOffsetSampleFrame() const { return mOffsetSampleFrame; }
-	
+
 	MusicDeviceNoteParams*  GetParams() const { return mNoteParams; }
 
 	UInt32					GetArgCount() const { return mNoteParams->argCount; }
 	UInt32					NumberParameters() const { return mNoteParams->argCount - 2; }
-	
+
 	Float32					GetNote() const { return mNoteParams->mPitch; }
 	Float32					GetVelocity() const { return mNoteParams->mVelocity; }
-	
-	NoteParamsControlValue  GetParameter(UInt32 inIndex) const 
+
+	NoteParamsControlValue  GetParameter(UInt32 inIndex) const
 							{
-								if (inIndex >= NumberParameters()) 
+								if (inIndex >= NumberParameters())
 									throw std::runtime_error("index out of range");
-								return mNoteParams->mControls[inIndex]; 
+								return mNoteParams->mControls[inIndex];
 							}
-	
+
 private:
 	UInt32					mEventType;
 	MusicDeviceGroupID		mGroupID;
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/SynthNote.cpp b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/SynthNote.cpp
index 96a24d3..9ecced6 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/SynthNote.cpp
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/SynthNote.cpp
@@ -2,14 +2,14 @@
      File: SynthNote.cpp
  Abstract: SynthNote.h
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #include "SynthNote.h"
 #include "SynthElement.h"
@@ -51,9 +51,9 @@
 bool SynthNote::AttackNote(
 			SynthPartElement *				inPart,
 			SynthGroupElement *				inGroup,
-			NoteInstanceID					inNoteID, 
-			UInt64							inAbsoluteSampleFrame, 
-			UInt32							inOffsetSampleFrame, 
+			NoteInstanceID					inNoteID,
+			UInt64							inAbsoluteSampleFrame,
+			UInt32							inOffsetSampleFrame,
 			const MusicDeviceNoteParams		&inParams)
 {
 #if DEBUG_PRINT
@@ -70,8 +70,8 @@ bool SynthNote::AttackNote(
 
 	mPitch = inParams.mPitch;
 	mVelocity = inParams.mVelocity;
-	
-	
+
+
 	return Attack(inParams);
 }
 
@@ -116,25 +116,25 @@ double SynthNote::SampleRate()
 	return GetAudioUnit()->GetOutput(0)->GetStreamFormat().mSampleRate;
 }
 
-AUInstrumentBase* SynthNote::GetAudioUnit() const 
-{ 
-	return (AUInstrumentBase*)mGroup->GetAudioUnit(); 
+AUInstrumentBase* SynthNote::GetAudioUnit() const
+{
+	return (AUInstrumentBase*)mGroup->GetAudioUnit();
 }
 
-Float32 SynthNote::GetGlobalParameter(AudioUnitParameterID inParamID) const 
+Float32 SynthNote::GetGlobalParameter(AudioUnitParameterID inParamID) const
 {
 	return mGroup->GetAudioUnit()->Globals()->GetParameter(inParamID);
 }
 
-void SynthNote::NoteEnded(UInt32 inFrame) 
-{ 
+void SynthNote::NoteEnded(UInt32 inFrame)
+{
 	mGroup->NoteEnded(this, inFrame);
-	mNoteID = 0xFFFFFFFF; 
+	mNoteID = 0xFFFFFFFF;
 }
 
-float SynthNote::GetPitchBend() const 
-{ 
-	return mGroup->GetPitchBend(); 
+float SynthNote::GetPitchBend() const
+{
+	return mGroup->GetPitchBend();
 }
 
 
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/SynthNote.h b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/SynthNote.h
index cec6377..89179b1 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/SynthNote.h
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/SynthNote.h
@@ -2,14 +2,14 @@
      File: SynthNote.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #ifndef __SynthNote__
 #define __SynthNote__
@@ -84,7 +84,7 @@ enum SynthNoteState {
         end of note             any state                                       free
 		soft voice stealing     any state                                       fast released
 		hard voice stealing     any state                                       free
-		
+
 		soft voice stealing happens when there is a note on event and NumActiveNotes > MaxActiveNotes
 		hard voice stealing happens when there is a note on event and NumActiveNotes == NumNotes (no free notes)
 		voice stealing removes the quietest note in the highest numbered state that has sounding notes.
@@ -108,20 +108,20 @@ struct SynthNote
 		mVelocity(0.0f)
 	{
 	}
-	
+
 	virtual					~SynthNote() {}
-	
+
 	virtual void			Reset();
 	//! Returns true if active note resulted from this call, otherwise false
 	virtual bool			AttackNote(
 									SynthPartElement *				inPart,
 									SynthGroupElement *				inGroup,
-									NoteInstanceID					inNoteID, 
-									UInt64							inAbsoluteSampleFrame, 
-									UInt32							inOffsetSampleFrame, 
+									NoteInstanceID					inNoteID,
+									UInt64							inAbsoluteSampleFrame,
+									UInt32							inOffsetSampleFrame,
 									const MusicDeviceNoteParams		&inParams
 							);
-								
+
 	virtual OSStatus		Render(UInt64 inAbsoluteSampleFrame, UInt32 inNumFrames, AudioBufferList** inBufferList, UInt32 inOutBusCount) = 0;
 	//! Returns true if active note resulted from this call, otherwise false
 	virtual bool			Attack(const MusicDeviceNoteParams &inParams) = 0;
@@ -134,7 +134,7 @@ struct SynthNote
 
 	SynthGroupElement*		GetGroup() const { return mGroup; }
 	SynthPartElement*		GetPart() const { return mPart; }
-	
+
 	AUInstrumentBase*		GetAudioUnit() const;
 
 	Float32					GetGlobalParameter(AudioUnitParameterID inParamID) const;
@@ -143,7 +143,7 @@ struct SynthNote
 	SynthNoteState			GetState() const { return mState; }
 	UInt8					GetMidiKey() const { return (UInt8) mPitch; }
 	UInt8					GetMidiVelocity() const { return (UInt8) mVelocity; }
-	
+
 	Boolean					IsSounding() const { return mState < kNumberOfSoundingNoteStates; }
 	Boolean					IsActive() const { return mState < kNumberOfActiveNoteStates; }
 	UInt64					GetAbsoluteStartFrame() const { return mAbsoluteStartFrame; }
@@ -155,7 +155,7 @@ struct SynthNote
 
 	float					GetPitchBend() const;
 	double					TuningA() const;
-	
+
 	Float32					GetPitch() const { return mPitch; }	// returns raw pitch from MusicDeviceNoteParams
 	virtual double			Frequency(); // returns the frequency of note + pitch bend.
 	virtual double			SampleRate();
@@ -163,7 +163,7 @@ struct SynthNote
 	// linked list pointers
 	SynthNote				*mPrev;
 	SynthNote				*mNext;
-	
+
 	friend class			SynthGroupElement;
 	friend struct			SynthNoteList;
 protected:
@@ -171,14 +171,14 @@ protected:
 private:
 	SynthPartElement*		mPart;
 	SynthGroupElement*	mGroup;
-		
+
 	NoteInstanceID			mNoteID;
 	SynthNoteState			mState;
 	UInt64					mAbsoluteStartFrame;
 	SInt32					mRelativeStartFrame;
 	SInt32					mRelativeReleaseFrame;
 	SInt32					mRelativeKillFrame;
-	
+
 	Float32					mPitch;
 	Float32					mVelocity;
 };
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/SynthNoteList.cpp b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/SynthNoteList.cpp
index 849abd2..7e49da9 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/SynthNoteList.cpp
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/SynthNoteList.cpp
@@ -2,14 +2,14 @@
      File: SynthNoteList.cpp
  Abstract: SynthNoteList.h
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #include "SynthNoteList.h"
 #include <stdexcept>
@@ -52,23 +52,23 @@ void SynthNoteList::SanityCheck() const
 	if (mState >= kNoteState_Unset) {
 		throw std::runtime_error("SanityCheck: mState is bad");
 	}
-	
+
 	if (mHead == NULL) {
-		if (mTail != NULL) 
+		if (mTail != NULL)
 			throw std::runtime_error("SanityCheck: mHead is NULL but not mTail");
 		return;
 	}
 	if (mTail == NULL) {
 		throw std::runtime_error("SanityCheck: mTail is NULL but not mHead");
 	}
-	
+
 	if (mHead->mPrev) {
 		throw std::runtime_error("SanityCheck: mHead has a mPrev");
 	}
 	if (mTail->mNext) {
 		throw std::runtime_error("SanityCheck: mTail has a mNext");
 	}
-	
+
 	SynthNote *note = mHead;
 	while (note)
 	{
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/SynthNoteList.h b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/SynthNoteList.h
index 47a3593..6718f18 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/SynthNoteList.h
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUInstrumentBase/SynthNoteList.h
@@ -2,14 +2,14 @@
      File: SynthNoteList.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #ifndef __SynthNoteList__
 #define __SynthNoteList__
@@ -61,26 +61,26 @@
 struct SynthNoteList
 {
 	SynthNoteList() : mState(kNoteState_Unset), mHead(0), mTail(0) {}
-	
+
 	bool NotEmpty() const { return mHead != NULL; }
 	bool IsEmpty() const { return mHead == NULL; }
-	void Empty() { 
+	void Empty() {
 #if USE_SANITY_CHECK
 		SanityCheck();
 #endif
-		mHead = mTail = NULL; 
+		mHead = mTail = NULL;
 	}
-	
+
 	UInt32 Length() const {
 #if USE_SANITY_CHECK
 		SanityCheck();
 #endif
 		UInt32 length = 0;
-		for (SynthNote* note = mHead; note; note = note->mNext) 
+		for (SynthNote* note = mHead; note; note = note->mNext)
 			length++;
 		return length;
 	};
-	
+
 	void AddNote(SynthNote *inNote)
 	{
 #if DEBUG_PRINT
@@ -92,14 +92,14 @@ struct SynthNoteList
 		inNote->SetState(mState);
 		inNote->mNext = mHead;
 		inNote->mPrev = NULL;
-		
+
 		if (mHead) { mHead->mPrev = inNote; mHead = inNote; }
 		else mHead = mTail = inNote;
 #if USE_SANITY_CHECK
 		SanityCheck();
 #endif
 	}
-	
+
 	void RemoveNote(SynthNote *inNote)
 	{
 #if DEBUG_PRINT
@@ -113,7 +113,7 @@ struct SynthNoteList
 
 		if (inNote->mNext) inNote->mNext->mPrev = inNote->mPrev;
 		else mTail = inNote->mPrev;
-		
+
 		inNote->mPrev = 0;
 		inNote->mNext = 0;
 #if USE_SANITY_CHECK
@@ -131,7 +131,7 @@ struct SynthNoteList
 		inNoteList->SanityCheck();
 #endif
 		if (!inNoteList->mTail) return;
-		
+
 		if (mState == kNoteState_Released)
 		{
 			for (SynthNote* note = inNoteList->mHead; note; note = note->mNext)
@@ -150,14 +150,14 @@ struct SynthNoteList
 				note->SetState(mState);
 			}
 		}
-		
+
 		inNoteList->mTail->mNext = mHead;
-		
+
 		if (mHead) mHead->mPrev = inNoteList->mTail;
 		else mTail = inNoteList->mTail;
-		
+
 		mHead = inNoteList->mHead;
-		
+
 		inNoteList->mHead = NULL;
 		inNoteList->mTail = NULL;
 #if USE_SANITY_CHECK
@@ -165,7 +165,7 @@ struct SynthNoteList
 		inNoteList->SanityCheck();
 #endif
 	}
-	
+
 	SynthNote* FindOldestNote()
 	{
 #if DEBUG_PRINT
@@ -186,7 +186,7 @@ struct SynthNoteList
 		}
 		return oldestNote;
 	}
-	
+
 	SynthNote* FindMostQuietNote()
 	{
 #if DEBUG_PRINT
@@ -219,9 +219,9 @@ struct SynthNoteList
 #endif
 		return mostQuietNote;
 	}
-	
+
 	void SanityCheck() const;
-	
+
 	SynthNoteState	mState;
 	SynthNote *		mHead;
 	SynthNote *		mTail;
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUViewBase/AUViewLocalizedStringKeys.h b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUViewBase/AUViewLocalizedStringKeys.h
index 741be00..995b9fb 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUViewBase/AUViewLocalizedStringKeys.h
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/AUViewBase/AUViewLocalizedStringKeys.h
@@ -2,14 +2,14 @@
      File: AUViewLocalizedStringKeys.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #ifndef __AUViewLocalizedStringKeys_h__
 #define __AUViewLocalizedStringKeys_h__
@@ -53,27 +53,27 @@
 
 // UNLOCALIZED STRINGS:
     #define	kAUViewUnlocalizedString_TitleSeparator  			CFSTR(": ")
-    
+
 // Generic View:
     #define	kAUViewLocalizedStringKey_AudioUnit 				CFSTR("Audio Unit")
     #define	kAUViewLocalizedStringKey_Manufacturer 			CFSTR("Manufacturer")
-    
+
     #define	kAUViewLocalizedStringKey_FactoryPreset 			CFSTR("Factory Preset")
-    
+
     #define	kAUViewLocalizedStringKey_Properties 				CFSTR("Properties")
     #define	kAUViewLocalizedStringKey_Parameters 				CFSTR("Parameters")
-    
+
     #define	kAUViewLocalizedStringKey_Standard 				CFSTR("Standard")
     #define	kAUViewLocalizedStringKey_Expert 					CFSTR("Expert")
-    
+
 // AULoadCPU:
     #define	kAUViewLocalizedStringKey_RestrictCPULoad 			CFSTR("Restrict CPU Load")
     #define	kAUViewLocalizedStringKey_PercentSymbol 			CFSTR("%")
     #define	kAUViewLocalizedStringKey_NotApplicable 			CFSTR("n/a")
-    
+
 // AUDiskStreamingCheckbox:
     #define	kAUViewLocalizedStringKey_StreamFromDisk 			CFSTR("Stream From Disk")
-    
+
 // AURenderQualityPopup:
     #define	kAUViewLocalizedStringKey_RenderQuality 			CFSTR("Render Quality")
     #define	kAUViewLocalizedStringKey_Maximum 					CFSTR("Maximum")
@@ -84,5 +84,5 @@
 
 // AUChannelLayoutPopUp:
 	#define	kAUViewLocalizedStringKey_AudioChannelLayout 		CFSTR("Audio Channel Layout")
-    
+
 #endif //__AUViewLocalizedStringKeys_h__
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/AUEffectBase.cpp b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/AUEffectBase.cpp
index 010082f..c7a8c65 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/AUEffectBase.cpp
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/AUEffectBase.cpp
@@ -2,14 +2,14 @@
      File: AUEffectBase.cpp
  Abstract: AUEffectBase.h
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,15 +40,15 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #include "AUEffectBase.h"
 
-/* 
+/*
 	This class does not deal as well as it should with N-M effects...
-	
+
 	The problem areas are (if the channels don't match):
 		ProcessInPlace if the channels don't match - there will be problems if InputChan != OutputChan
 		Bypass - its just passing the buffers through when not processing them
@@ -84,7 +84,7 @@ void AUEffectBase::Cleanup()
 {
 	for (KernelList::iterator it = mKernelList.begin(); it != mKernelList.end(); ++it)
 		delete *it;
-		
+
 	mKernelList.clear();
 	mMainOutput = NULL;
 	mMainInput = NULL;
@@ -113,7 +113,7 @@ OSStatus AUEffectBase::Initialize()
             if ((configNumInputs < 0) && (configNumOutputs < 0))
             {
 					// unit accepts any number of channels on input and output
-                if (((configNumInputs == -1) && (configNumOutputs == -2)) 
+                if (((configNumInputs == -1) && (configNumOutputs == -2))
 					|| ((configNumInputs == -2) && (configNumOutputs == -1)))
                 {
 				    foundMatch = true;
@@ -129,7 +129,7 @@ OSStatus AUEffectBase::Initialize()
             }
             else
             {
-					// the -1 case on either scope is saying that the unit doesn't care about the 
+					// the -1 case on either scope is saying that the unit doesn't care about the
 					// number of channels on that scope
                 bool inputMatch = (auNumInputs == configNumInputs) || (configNumInputs == -1);
                 bool outputMatch = (auNumOutputs == configNumOutputs) || (configNumOutputs == -1);
@@ -152,14 +152,14 @@ OSStatus AUEffectBase::Initialize()
     }
 
     MaintainKernels();
-	
+
 	mMainOutput = GetOutput(0);
 	mMainInput = GetInput(0);
-	
+
 	const CAStreamBasicDescription& format = GetStreamFormat(kAudioUnitScope_Output, 0);
 	format.IdentifyCommonPCMFormat(mCommonPCMFormat, NULL);
 	mBytesPerFrame = format.mBytesPerFrame;
-	
+
     return noErr;
 }
 
@@ -171,7 +171,7 @@ OSStatus			AUEffectBase::Reset(		AudioUnitScope 		inScope,
 		if (kernel != NULL)
 			kernel->Reset();
 	}
-	
+
 	return AUBase::Reset(inScope, inElement);
 }
 
@@ -228,10 +228,10 @@ OSStatus			AUEffectBase::SetProperty(		AudioUnitPropertyID inID,
 			{
 				if (inDataSize < sizeof(UInt32))
 					return kAudioUnitErr_InvalidPropertyValue;
-					
+
 				bool tempNewSetting = *((UInt32*)inData) != 0;
 					// we're changing the state of bypass
-				if (tempNewSetting != IsBypassEffect()) 
+				if (tempNewSetting != IsBypassEffect())
 				{
 					if (!tempNewSetting && IsBypassEffect() && IsInitialized()) // turning bypass off and we're initialized
 						Reset(0, 0);
@@ -246,16 +246,16 @@ OSStatus			AUEffectBase::SetProperty(		AudioUnitPropertyID inID,
 	}
 	return AUBase::SetProperty (inID, inScope, inElement, inData, inDataSize);
 }
- 
+
 
 void	AUEffectBase::MaintainKernels()
 {
 #if TARGET_OS_IPHONE
 	UInt32 nKernels = mOnlyOneKernel ? 1 : GetNumberOfChannels();
-#else 
+#else
 	UInt32 nKernels = GetNumberOfChannels();
 #endif
-	
+
 	if (mKernelList.size() < nKernels) {
 		mKernelList.reserve(nKernels);
 		for (UInt32 i = (UInt32)mKernelList.size(); i < nKernels; ++i)
@@ -267,7 +267,7 @@ void	AUEffectBase::MaintainKernels()
 			mKernelList.pop_back();
 		}
 	}
-	
+
 	for(unsigned int i = 0; i < nKernels; i++ )
 	{
 		if(mKernelList[i]) {
@@ -289,7 +289,7 @@ OSStatus			AUEffectBase::ChangeStreamFormat(	AudioUnitScope				inScope,
 {
 	OSStatus result = AUBase::ChangeStreamFormat(inScope, inElement, inPrevFormat, inNewFormat);
 	if (result == noErr)
-	{	
+	{
 		// for the moment this only dependency we know about
 		// where a parameter's range may change is with the sample rate
 		// and effects are only publishing parameters in the global scope!
@@ -314,11 +314,11 @@ OSStatus		AUEffectBase::ProcessScheduledSlice(	void				*inUserData,
 														UInt32				inTotalBufferFrames )
 {
 	ScheduledProcessParams	&sliceParams = *((ScheduledProcessParams*)inUserData);
-	
+
 	AudioUnitRenderActionFlags 	&actionFlags = *sliceParams.actionFlags;
 	AudioBufferList 			&inputBufferList = *sliceParams.inputBufferList;
 	AudioBufferList 			&outputBufferList = *sliceParams.outputBufferList;
-	
+
 	UInt32 channelSize = inSliceFramesToProcess * mBytesPerFrame;
 		// fix the size of the buffer we're operating on before we render this slice of time
 	for(unsigned int i = 0; i < inputBufferList.mNumberBuffers; i++ ) {
@@ -333,15 +333,15 @@ OSStatus		AUEffectBase::ProcessScheduledSlice(	void				*inUserData,
 
 		// we just partially processed the buffers, so increment the data pointers to the next part of the buffer to process
 	for(unsigned int i = 0; i < inputBufferList.mNumberBuffers; i++ ) {
-		inputBufferList.mBuffers[i].mData = 
+		inputBufferList.mBuffers[i].mData =
 			(char *)inputBufferList.mBuffers[i].mData + inputBufferList.mBuffers[i].mNumberChannels * channelSize;
 	}
-	
+
 	for(unsigned int i = 0; i < outputBufferList.mNumberBuffers; i++ ) {
-		outputBufferList.mBuffers[i].mData = 
+		outputBufferList.mBuffers[i].mData =
 			(char *)outputBufferList.mBuffers[i].mData + outputBufferList.mBuffers[i].mNumberChannels * channelSize;
 	}
-	
+
 	return result;
 }
 
@@ -358,7 +358,7 @@ OSStatus 	AUEffectBase::Render(	AudioUnitRenderActionFlags &ioActionFlags,
 	OSStatus result = noErr;
 
 	result = mMainInput->PullInput(ioActionFlags, inTimeStamp, 0 /* element */, nFrames);
-	
+
 	if (result == noErr)
 	{
 		if(ProcessesInPlace() && mMainOutput->WillAllocateBuffer())
@@ -369,7 +369,7 @@ OSStatus 	AUEffectBase::Render(	AudioUnitRenderActionFlags &ioActionFlags,
 		if (ShouldBypassEffect())
 		{
 			// leave silence bit alone
-			
+
 			if(!ProcessesInPlace() )
 			{
 				mMainInput->CopyBufferContentsTo (mMainOutput->GetBufferList());
@@ -385,22 +385,22 @@ OSStatus 	AUEffectBase::Render(	AudioUnitRenderActionFlags &ioActionFlags,
 			else
 			{
 				// deal with scheduled parameters...
-				
+
 				AudioBufferList &inputBufferList = mMainInput->GetBufferList();
 				AudioBufferList &outputBufferList = mMainOutput->GetBufferList();
-				
+
 				ScheduledProcessParams processParams;
 				processParams.actionFlags = &ioActionFlags;
 				processParams.inputBufferList = &inputBufferList;
 				processParams.outputBufferList = &outputBufferList;
-	
+
 				// divide up the buffer into slices according to scheduled params then
 				// do the DSP for each slice (ProcessScheduledSlice() called for each slice)
 				result = ProcessForScheduledParams(	mParamList,
 													nFrames,
 													&processParams );
-	
-				
+
+
 				// fixup the buffer pointers to how they were before we started
 				UInt32 channelSize = nFrames * mBytesPerFrame;
 				for(unsigned int i = 0; i < inputBufferList.mNumberBuffers; i++ ) {
@@ -408,7 +408,7 @@ OSStatus 	AUEffectBase::Render(	AudioUnitRenderActionFlags &ioActionFlags,
 					inputBufferList.mBuffers[i].mData = (char *)inputBufferList.mBuffers[i].mData - size;
 					inputBufferList.mBuffers[i].mDataByteSize = size;
 				}
-				
+
 				for(unsigned int i = 0; i < outputBufferList.mNumberBuffers; i++ ) {
 					UInt32 size = outputBufferList.mBuffers[i].mNumberChannels * channelSize;
 					outputBufferList.mBuffers[i].mData = (char *)outputBufferList.mBuffers[i].mData - size;
@@ -416,13 +416,13 @@ OSStatus 	AUEffectBase::Render(	AudioUnitRenderActionFlags &ioActionFlags,
 				}
 			}
 		}
-	
+
 		if ( (ioActionFlags & kAudioUnitRenderAction_OutputIsSilence) && !ProcessesInPlace() )
 		{
 			AUBufferList::ZeroBuffer(mMainOutput->GetBufferList() );
 		}
 	}
-	
+
 	return result;
 }
 
@@ -435,7 +435,7 @@ OSStatus	AUEffectBase::ProcessBufferLists(
 {
 	if (ShouldBypassEffect())
 		return noErr;
-		
+
 	// interleaved (or mono)
 	switch (mCommonPCMFormat) {
 		case CAStreamBasicDescription::kPCMFormatFloat32 :
@@ -450,7 +450,7 @@ OSStatus	AUEffectBase::ProcessBufferLists(
 		default :
 			throw CAException(kAudio_UnimplementedError);
 	}
-	
+
 	return noErr;
 }
 
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/AUEffectBase.h b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/AUEffectBase.h
index 13ba96b..a7c62c2 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/AUEffectBase.h
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/AUEffectBase.h
@@ -2,14 +2,14 @@
      File: AUEffectBase.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #ifndef __AUEffectBase_h__
 #define __AUEffectBase_h__
@@ -63,7 +63,7 @@ public:
 												bool						inProcessesInPlace = true );
 	/*! @dtor ~AUEffectBase */
 								~AUEffectBase();
-	
+
 	/*! @method Initialize */
 	virtual OSStatus			Initialize();
 
@@ -112,7 +112,7 @@ public:
 										UInt32							inNumberFrames);
 
 	// our virtual methods
-	
+
 	// If your unit processes N to N channels, and there are no interactions between channels,
 	// it can override NewKernel to create a mono processing object per channel.  Otherwise,
 	// don't override NewKernel, and instead, override ProcessBufferLists.
@@ -129,7 +129,7 @@ public:
 	// convenience format accessors (use output 0's format)
 	/*! @method GetSampleRate */
 	Float64						GetSampleRate();
-	
+
 	/*! @method GetNumberOfChannels */
 	UInt32						GetNumberOfChannels();
 
@@ -141,7 +141,7 @@ public:
 								{
 									Globals()->SetParameter(paramID, value);
 								}
-								
+
 	/*! @method GetParameter */
 	using AUBase::GetParameter;
 	AudioUnitParameterValue		GetParameter(			AudioUnitParameterID			paramID )
@@ -151,13 +151,13 @@ public:
 
 	/*! @method CanScheduleParameters */
 	virtual bool				CanScheduleParameters() const { return true; }
-	
+
 	/*! @method IsBypassEffect */
 	// This is used for the property value - to reflect to the UI if an effect is bypassed
 	bool						IsBypassEffect () { return mBypassEffect; }
-	
+
 protected:
-											
+
 	/*! @method MaintainKernels */
 	void						MaintainKernels();
 
@@ -165,17 +165,17 @@ protected:
 	// This is used in the render call to see if an effect is bypassed
 	// It can return a different status than IsBypassEffect (though it MUST take that into account)
 	virtual	bool				ShouldBypassEffect () { return IsBypassEffect(); }
-					
+
 public:
 	/*! @method SetBypassEffect */
 	virtual void				SetBypassEffect (bool inFlag) { mBypassEffect = inFlag; }
-	
+
 	/*! @method SetParamHasSampleRateDependency */
-	void						SetParamHasSampleRateDependency (bool inFlag) 
-								{ 
-									mParamSRDep = inFlag; 
+	void						SetParamHasSampleRateDependency (bool inFlag)
+								{
+									mParamSRDep = inFlag;
 								}
-	
+
 	/*! @method GetParamHasSampleRateDependency */
 	bool						GetParamHasSampleRateDependency () const { return mParamSRDep; }
 
@@ -194,12 +194,12 @@ public:
 
 	bool							ProcessesInPlace() const {return mProcessesInPlace;};
 	void							SetProcessesInPlace(bool inProcessesInPlace) {mProcessesInPlace = inProcessesInPlace;};
-		
+
 	typedef std::vector<AUKernelBase *> KernelList;
-	
-	
 
-protected:	
+
+
+protected:
 	/*! @var mKernelList */
 	KernelList						mKernelList;
 
@@ -209,13 +209,13 @@ protected:
 	bool 							IsInputSilent (AudioUnitRenderActionFlags 	inActionFlags, UInt32 inFramesToProcess)
 									{
 										bool inputSilent = (inActionFlags & kAudioUnitRenderAction_OutputIsSilence) != 0;
-									
+
 										// take latency and tail time into account when propagating the silent bit
 										UInt32 silentTimeoutFrames = UInt32(GetSampleRate() * (GetLatency() + GetTailTime()));
 										mSilentTimeout.Process (inFramesToProcess, silentTimeoutFrames, inputSilent);
 										return inputSilent;
 									}
-									
+
 #if TARGET_OS_IPHONE
 	void SetOnlyOneKernel(bool inUseOnlyOneKernel) { mOnlyOneKernel = inUseOnlyOneKernel; } // set in ctor of subclass that wants it.
 #endif
@@ -228,26 +228,26 @@ protected:
 										UInt32							inFramesToProcess );
 
 	CAStreamBasicDescription::CommonPCMFormat GetCommonPCMFormat() const { return mCommonPCMFormat; }
-	
+
 
 private:
 	/*! @var mBypassEffect */
 	bool							mBypassEffect;
 	/*! @var mParamSRDep */
 	bool							mParamSRDep;
-	
+
 	/*! @var mProcessesInplace */
 	bool							mProcessesInPlace;
-	
+
 	/*! @var mSilentTimeout */
 	AUSilentTimeout					mSilentTimeout;
 
 	/*! @var mMainOutput */
 	AUOutputElement *				mMainOutput;
-	
+
 	/*! @var mMainInput */
 	AUInputElement *				mMainInput;
-	
+
 #if TARGET_OS_IPHONE
 	/*! @var mOnlyOneKernel */
 	bool							mOnlyOneKernel;
@@ -299,16 +299,16 @@ public:
 								{
 									return mAudioUnit->GetSampleRate();
 								}
-								
+
 	/*! @method GetParameter */
-	AudioUnitParameterValue		GetParameter (AudioUnitParameterID	paramID) 
+	AudioUnitParameterValue		GetParameter (AudioUnitParameterID	paramID)
 								{
 									return mAudioUnit->GetParameter(paramID);
 								}
-	
+
 	void						SetChannelNum (UInt32 inChan) { mChannelNum = inChan; }
 	UInt32						GetChannelNum () { return mChannelNum; }
-	
+
 protected:
 	/*! @var mAudioUnit */
 	AUEffectBase * 		mAudioUnit;
@@ -332,41 +332,41 @@ void	AUEffectBase::ProcessBufferListsT(
 	if (inBuffer.mNumberBuffers == 1) {
 		if (inBuffer.mBuffers[0].mNumberChannels == 0)
 			throw CAException(kAudio_ParamError);
-			
+
 		for (UInt32 channel = 0; channel < mKernelList.size(); ++channel) {
 			AUKernelBase *kernel = mKernelList[channel];
-			
+
 			if (kernel == NULL) continue;
 			ioSilence = silentInput;
-			
+
 			// process each interleaved channel individually
 			kernel->Process(
-				(const T *)inBuffer.mBuffers[0].mData + channel, 
+				(const T *)inBuffer.mBuffers[0].mData + channel,
 				(T *)outBuffer.mBuffers[0].mData + channel,
 				inFramesToProcess,
 				inBuffer.mBuffers[0].mNumberChannels,
 				ioSilence);
-				
+
 			if (!ioSilence)
 				ioActionFlags &= ~kAudioUnitRenderAction_OutputIsSilence;
 		}
 	} else {
 		for (UInt32 channel = 0; channel < mKernelList.size(); ++channel) {
 			AUKernelBase *kernel = mKernelList[channel];
-			
+
 			if (kernel == NULL) continue;
-			
+
 			ioSilence = silentInput;
 			const AudioBuffer *srcBuffer = &inBuffer.mBuffers[channel];
 			AudioBuffer *destBuffer = &outBuffer.mBuffers[channel];
-			
+
 			kernel->Process(
-				(const T *)srcBuffer->mData, 
-				(T *)destBuffer->mData, 
+				(const T *)srcBuffer->mData,
+				(T *)destBuffer->mData,
 				inFramesToProcess,
 				1,
 				ioSilence);
-				
+
 			if (!ioSilence)
 				ioActionFlags &= ~kAudioUnitRenderAction_OutputIsSilence;
 		}
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/AUMIDIBase.cpp b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/AUMIDIBase.cpp
index e5e358d..520d76a 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/AUMIDIBase.cpp
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/AUMIDIBase.cpp
@@ -2,14 +2,14 @@
      File: AUMIDIBase.cpp
  Abstract: AUMIDIBase.h
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #include "AUMIDIBase.h"
 #include <CoreMIDI/CoreMIDI.h>
@@ -64,18 +64,18 @@ enum
 	kMidiController_AllNotesOff			= 123
 };
 
-AUMIDIBase::AUMIDIBase(AUBase* inBase) 
-	: mAUBaseInstance (*inBase) 
+AUMIDIBase::AUMIDIBase(AUBase* inBase)
+	: mAUBaseInstance (*inBase)
 {
 #if CA_AUTO_MIDI_MAP
 	mMapManager = new CAAUMIDIMapManager();
 #endif
 }
 
-AUMIDIBase::~AUMIDIBase() 
+AUMIDIBase::~AUMIDIBase()
 {
 #if CA_AUTO_MIDI_MAP
-	if (mMapManager) 
+	if (mMapManager)
 		delete mMapManager;
 #endif
 }
@@ -88,7 +88,7 @@ OSStatus			AUMIDIBase::DelegateGetPropertyInfo(AudioUnitPropertyID				inID,
 														Boolean &						outWritable)
 {
 	OSStatus result = noErr;
-	
+
 	switch (inID) {
 #if !TARGET_OS_IPHONE
 	case kMusicDeviceProperty_MIDIXMLNames:
@@ -100,8 +100,8 @@ OSStatus			AUMIDIBase::DelegateGetPropertyInfo(AudioUnitPropertyID				inID,
 		} else
 			result = kAudioUnitErr_InvalidProperty;
 		break;
-#endif		
-#if CA_AUTO_MIDI_MAP				
+#endif
+#if CA_AUTO_MIDI_MAP
 	case kAudioUnitProperty_AllParameterMIDIMappings:
 		ca_require(inScope == kAudioUnitScope_Global, InvalidScope);
 		ca_require(inElement == 0, InvalidElement);
@@ -109,15 +109,15 @@ OSStatus			AUMIDIBase::DelegateGetPropertyInfo(AudioUnitPropertyID				inID,
 		outDataSize = sizeof (AUParameterMIDIMapping)*mMapManager->NumMaps();
 		result = noErr;
 		break;
-	
+
 	case kAudioUnitProperty_HotMapParameterMIDIMapping:
 		ca_require(inScope == kAudioUnitScope_Global, InvalidScope);
 		ca_require(inElement == 0, InvalidElement);
 		outWritable = true;
-		outDataSize = sizeof (AUParameterMIDIMapping); 
+		outDataSize = sizeof (AUParameterMIDIMapping);
 		result = noErr;
 		break;
-		
+
 	case kAudioUnitProperty_AddParameterMIDIMapping:
 		ca_require(inScope == kAudioUnitScope_Global, InvalidScope);
 		ca_require(inElement == 0, InvalidElement);
@@ -125,12 +125,12 @@ OSStatus			AUMIDIBase::DelegateGetPropertyInfo(AudioUnitPropertyID				inID,
 		outDataSize = sizeof (AUParameterMIDIMapping);
 		result = noErr;
 		break;
-		
+
 	case kAudioUnitProperty_RemoveParameterMIDIMapping:
 		ca_require(inScope == kAudioUnitScope_Global, InvalidScope);
 		ca_require(inElement == 0, InvalidElement);
 		outWritable = true;
-		outDataSize = sizeof (AUParameterMIDIMapping); 
+		outDataSize = sizeof (AUParameterMIDIMapping);
 		result = noErr;
 		break;
 #endif
@@ -155,7 +155,7 @@ OSStatus			AUMIDIBase::DelegateGetProperty(	AudioUnitPropertyID 			inID,
 														void *							outData)
 {
 	OSStatus result;
-	
+
 	switch (inID) {
 #if !TARGET_OS_IPHONE
 	case kMusicDeviceProperty_MIDIXMLNames:
@@ -163,7 +163,7 @@ OSStatus			AUMIDIBase::DelegateGetProperty(	AudioUnitPropertyID 			inID,
 		ca_require(inElement == 0, InvalidElement);
 		result = GetXMLNames((CFURLRef *)outData);
 		break;
-#endif		
+#endif
 #if CA_AUTO_MIDI_MAP
 	case kAudioUnitProperty_AllParameterMIDIMappings:{
 		ca_require(inScope == kAudioUnitScope_Global, InvalidScope);
@@ -175,7 +175,7 @@ OSStatus			AUMIDIBase::DelegateGetProperty(	AudioUnitPropertyID 			inID,
 		result = noErr;
 		break;
 	}
-		
+
 	case kAudioUnitProperty_HotMapParameterMIDIMapping:{
 		ca_require(inScope == kAudioUnitScope_Global, InvalidScope);
 		ca_require(inElement == 0, InvalidElement);
@@ -185,7 +185,7 @@ OSStatus			AUMIDIBase::DelegateGetProperty(	AudioUnitPropertyID 			inID,
 		break;
 	}
 #endif
-	
+
 	default:
 		result = kAudioUnitErr_InvalidProperty;
 		break;
@@ -207,7 +207,7 @@ OSStatus			AUMIDIBase::DelegateSetProperty(	AudioUnitPropertyID 			inID,
 														UInt32							inDataSize)
 {
 	OSStatus result;
-	
+
 	switch (inID) {
 #if CA_AUTO_MIDI_MAP
 		case kAudioUnitProperty_AddParameterMIDIMapping:{
@@ -215,11 +215,11 @@ OSStatus			AUMIDIBase::DelegateSetProperty(	AudioUnitPropertyID 			inID,
 			ca_require(inElement == 0, InvalidElement);
 			AUParameterMIDIMapping * maps = (AUParameterMIDIMapping*)inData;
 			mMapManager->SortedInsertToParamaterMaps (maps, (inDataSize / sizeof(AUParameterMIDIMapping)), mAUBaseInstance);
-			mAUBaseInstance.PropertyChanged (kAudioUnitProperty_AllParameterMIDIMappings, kAudioUnitScope_Global, 0);	 
+			mAUBaseInstance.PropertyChanged (kAudioUnitProperty_AllParameterMIDIMappings, kAudioUnitScope_Global, 0);
 			result = noErr;
 			break;
 		}
-			
+
 		case kAudioUnitProperty_RemoveParameterMIDIMapping:{
 			ca_require(inScope == kAudioUnitScope_Global, InvalidScope);
 			ca_require(inElement == 0, InvalidElement);
@@ -227,16 +227,16 @@ OSStatus			AUMIDIBase::DelegateSetProperty(	AudioUnitPropertyID 			inID,
 			bool didChange;
 			mMapManager->SortedRemoveFromParameterMaps(maps, (inDataSize / sizeof(AUParameterMIDIMapping)), didChange);
 			if (didChange)
-				mAUBaseInstance.PropertyChanged (kAudioUnitProperty_AllParameterMIDIMappings, kAudioUnitScope_Global, 0);	 
+				mAUBaseInstance.PropertyChanged (kAudioUnitProperty_AllParameterMIDIMappings, kAudioUnitScope_Global, 0);
 			result = noErr;
 			break;
 		}
-					
+
 		case kAudioUnitProperty_HotMapParameterMIDIMapping:{
 			ca_require(inScope == kAudioUnitScope_Global, InvalidScope);
 			ca_require(inElement == 0, InvalidElement);
 			AUParameterMIDIMapping & map = *((AUParameterMIDIMapping*)inData);
-			mMapManager->SetHotMapping (map);			
+			mMapManager->SetHotMapping (map);
 			result = noErr;
 			break;
 		}
@@ -249,7 +249,7 @@ OSStatus			AUMIDIBase::DelegateSetProperty(	AudioUnitPropertyID 			inID,
 			break;
 		}
 #endif
-		
+
 	default:
 		result = kAudioUnitErr_InvalidProperty;
 		break;
@@ -319,10 +319,10 @@ inline const Byte *	NextMIDIEvent(const Byte *event, const Byte *end)
 OSStatus			AUMIDIBase::HandleMIDIPacketList(const MIDIPacketList *pktlist)
 {
 	if (!mAUBaseInstance.IsInitialized()) return kAudioUnitErr_Uninitialized;
-	
+
 	int nPackets = pktlist->numPackets;
 	const MIDIPacket *pkt = pktlist->packet;
-	
+
 	while (nPackets-- > 0) {
 		const Byte *event = pkt->data, *packetEnd = event + pkt->length;
 		long startFrame = (long)pkt->timeStamp;
@@ -347,20 +347,20 @@ OSStatus			AUMIDIBase::HandleMIDIPacketList(const MIDIPacketList *pktlist)
 OSStatus 	AUMIDIBase::HandleMidiEvent(UInt8 status, UInt8 channel, UInt8 data1, UInt8 data2, UInt32 inStartFrame)
 {
 	if (!mAUBaseInstance.IsInitialized()) return kAudioUnitErr_Uninitialized;
-		
-#if CA_AUTO_MIDI_MAP	
-// you potentially have a choice to make here - if a param mapping matches, do you still want to process the 
+
+#if CA_AUTO_MIDI_MAP
+// you potentially have a choice to make here - if a param mapping matches, do you still want to process the
 // MIDI event or not. The default behaviour is to continue on with the MIDI event.
 	if (mMapManager->HandleHotMapping (status, channel, data1, mAUBaseInstance)) {
 		mAUBaseInstance.PropertyChanged (kAudioUnitProperty_HotMapParameterMIDIMapping, kAudioUnitScope_Global, 0);
 	}
 	else {
 		mMapManager->FindParameterMapEventMatch(status, channel, data1, data2, inStartFrame, mAUBaseInstance);
-	}	
-#endif	
-	
+	}
+#endif
+
 	OSStatus result = noErr;
-	
+
 	switch(status)
 	{
 		case kMidiMessage_NoteOn:
@@ -374,16 +374,16 @@ OSStatus 	AUMIDIBase::HandleMidiEvent(UInt8 status, UInt8 channel, UInt8 data1,
 				result = HandleNoteOff(channel, data1, data2, inStartFrame);
 			}
 			break;
-			
+
 		case kMidiMessage_NoteOff:
 			result = HandleNoteOff(channel, data1, data2, inStartFrame);
 			break;
-		
+
 		default:
 			result = HandleNonNoteEvent (status, channel, data1, data2, inStartFrame);
 			break;
 	}
-	
+
 	return result;
 }
 
@@ -396,15 +396,15 @@ OSStatus	AUMIDIBase::HandleNonNoteEvent (UInt8 status, UInt8 channel, UInt8 data
 		case kMidiMessage_PitchWheel:
 			result = HandlePitchWheel(channel, data1, data2, inStartFrame);
 			break;
-			
+
 		case kMidiMessage_ProgramChange:
 			result = HandleProgramChange(channel, data1);
 			break;
-			
+
 		case kMidiMessage_ChannelPressure:
 			result = HandleChannelPressure(channel, data1, inStartFrame);
 			break;
-			
+
 		case kMidiMessage_ControlChange:
 		{
 			switch (data1) {
@@ -419,7 +419,7 @@ OSStatus	AUMIDIBase::HandleNonNoteEvent (UInt8 status, UInt8 channel, UInt8 data
 				case kMidiController_AllSoundOff:
 					result = HandleAllSoundOff(channel);
 					break;
-								
+
 				default:
 					result = HandleControlChange(channel, data1, data2, inStartFrame);
 					break;
@@ -433,7 +433,7 @@ OSStatus	AUMIDIBase::HandleNonNoteEvent (UInt8 status, UInt8 channel, UInt8 data
 	return result;
 }
 
-OSStatus 	AUMIDIBase::SysEx (const UInt8 *	inData, 
+OSStatus 	AUMIDIBase::SysEx (const UInt8 *	inData,
 										UInt32			inLength)
 {
 	if (!mAUBaseInstance.IsInitialized()) return kAudioUnitErr_Uninitialized;
@@ -466,7 +466,7 @@ OSStatus			AUMIDIBase::ComponentEntryDispatch(	ComponentParameters *			params,
 	if (This == NULL) return kAudio_ParamError;
 
 	OSStatus result;
-	
+
 	switch (params->what) {
 	case kMusicDeviceMIDIEventSelect:
 		{
@@ -489,7 +489,7 @@ OSStatus			AUMIDIBase::ComponentEntryDispatch(	ComponentParameters *			params,
 		result = badComponentSelector;
 		break;
 	}
-	
+
 	return result;
 }
 #endif
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/AUMIDIBase.h b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/AUMIDIBase.h
index 40c6a77..223f50e 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/AUMIDIBase.h
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/AUMIDIBase.h
@@ -2,14 +2,14 @@
      File: AUMIDIBase.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #ifndef __AUMIDIBase_h__
 #define __AUMIDIBase_h__
@@ -66,24 +66,24 @@ public:
 								AUMIDIBase(AUBase* inBase);
 	/*! @dtor ~AUMIDIBase */
 	virtual						~AUMIDIBase();
-	
+
 	/*! @method MIDIEvent */
-	virtual OSStatus	MIDIEvent(		UInt32 						inStatus, 
-										UInt32 						inData1, 
-										UInt32 						inData2, 
+	virtual OSStatus	MIDIEvent(		UInt32 						inStatus,
+										UInt32 						inData1,
+										UInt32 						inData2,
 										UInt32 						inOffsetSampleFrame)
 	{
 		UInt32 strippedStatus = inStatus & 0xf0;
 		UInt32 channel = inStatus & 0x0f;
-	
+
 		return HandleMidiEvent(strippedStatus, channel, inData1, inData2, inOffsetSampleFrame);
 	}
-	
+
 	/*! @method HandleMIDIPacketList */
 	OSStatus			HandleMIDIPacketList(const MIDIPacketList *pktlist);
-	
+
 	/*! @method SysEx */
-	virtual OSStatus	SysEx(			const UInt8 *				inData, 
+	virtual OSStatus	SysEx(			const UInt8 *				inData,
 										UInt32 						inLength);
 
 #if TARGET_API_MAC_OSX
@@ -99,7 +99,7 @@ public:
 														AudioUnitScope 				inScope,
 														AudioUnitElement		 	inElement,
 														void *						outData);
-														
+
 	/*! @method DelegateSetProperty */
 	virtual OSStatus			DelegateSetProperty(	AudioUnitPropertyID 		inID,
 														AudioUnitScope 				inScope,
@@ -118,15 +118,15 @@ protected:
 												UInt32 	inStartFrame);
 
 	/*! @method HandleNonNoteEvent */
-	virtual OSStatus	HandleNonNoteEvent (	UInt8	status, 
-												UInt8	channel, 
-												UInt8	data1, 
-												UInt8	data2, 
+	virtual OSStatus	HandleNonNoteEvent (	UInt8	status,
+												UInt8	channel,
+												UInt8	data1,
+												UInt8	data2,
 												UInt32	inStartFrame);
 
 #if TARGET_API_MAC_OSX
 	/*! @method GetXMLNames */
-	virtual OSStatus			GetXMLNames(CFURLRef *outNameDocument) 
+	virtual OSStatus			GetXMLNames(CFURLRef *outNameDocument)
 	{ return kAudioUnitErr_InvalidProperty; }	// if not overridden, it's unsupported
 #endif
 
@@ -136,25 +136,25 @@ protected:
 												UInt8 	inNoteNumber,
 												UInt8 	inVelocity,
 												UInt32 	inStartFrame) { return noErr; }
-												
+
 	/*! @method HandleNoteOff */
 	virtual OSStatus	HandleNoteOff(			UInt8 	inChannel,
 												UInt8 	inNoteNumber,
 												UInt8 	inVelocity,
 												UInt32 	inStartFrame) { return noErr; }
-												
+
 	/*! @method HandleControlChange */
 	virtual OSStatus	HandleControlChange(	UInt8 	inChannel,
 												UInt8 	inController,
 												UInt8 	inValue,
 												UInt32	inStartFrame) { return noErr; }
-												
+
 	/*! @method HandlePitchWheel */
 	virtual OSStatus	HandlePitchWheel(		UInt8 	inChannel,
 												UInt8 	inPitch1,
 												UInt8 	inPitch2,
 												UInt32	inStartFrame) { return noErr; }
-												
+
 	/*! @method HandleChannelPressure */
 	virtual OSStatus	HandleChannelPressure(	UInt8 	inChannel,
 												UInt8 	inValue,
@@ -172,15 +172,15 @@ protected:
 
 	/*! @method HandleResetAllControllers */
 	virtual OSStatus	HandleResetAllControllers(UInt8 inChannel) { return noErr; }
-	
+
 	/*! @method HandleAllNotesOff */
 	virtual OSStatus	HandleAllNotesOff(		UInt8	inChannel) { return noErr; }
-	
+
 	/*! @method HandleAllSoundOff */
 	virtual OSStatus	HandleAllSoundOff(		UInt8	inChannel) { return noErr; }
 
 
-//System messages   
+//System messages
 	/*! @method HandleSysEx */
 	virtual OSStatus	HandleSysEx(			const UInt8 *	inData,
                                         		UInt32			inLength ) { return noErr; }
@@ -188,19 +188,19 @@ protected:
 #if CA_AUTO_MIDI_MAP
 	/* map manager */
 	CAAUMIDIMapManager			*GetMIDIMapManager() {return mMapManager;};
-	
+
 #endif
 
-												
+
 private:
 	/*! @var mAUBaseInstance */
 	AUBase						& mAUBaseInstance;
-	
+
 #if CA_AUTO_MIDI_MAP
 	/* map manager */
 	CAAUMIDIMapManager			* mMapManager;
 #endif
-	
+
 public:
 #if !CA_USE_AUDIO_PLUGIN_ONLY
 	// component dispatcher
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/AUMIDIEffectBase.cpp b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/AUMIDIEffectBase.cpp
index dfe307c..c60aa40 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/AUMIDIEffectBase.cpp
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/AUMIDIEffectBase.cpp
@@ -2,14 +2,14 @@
      File: AUMIDIEffectBase.cpp
  Abstract: AUMIDIEffectBase.h
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #include "AUMIDIEffectBase.h"
 
@@ -61,7 +61,7 @@ static OSStatus		AUMIDIEffectBaseMIDIEvent(void *				inComponentStorage,
 						UInt32					inOffsetSampleFrame);
 
 AUMIDIEffectBase::AUMIDIEffectBase(		AudioComponentInstance				inInstance,
-						bool 						inProcessesInPlace ) 
+						bool 						inProcessesInPlace )
 	: AUEffectBase(inInstance, inProcessesInPlace),
 	  AUMIDIBase(this)
 {
@@ -74,12 +74,12 @@ OSStatus			AUMIDIEffectBase::GetPropertyInfo(AudioUnitPropertyID			inID,
 							Boolean &				outWritable)
 {
 	OSStatus result;
-	
+
 	result = AUEffectBase::GetPropertyInfo (inID, inScope, inElement, outDataSize, outWritable);
-	
+
 	if (result == kAudioUnitErr_InvalidProperty)
 		result = AUMIDIBase::DelegateGetPropertyInfo (inID, inScope, inElement, outDataSize, outWritable);
-	
+
 	return result;
 }
 
@@ -99,12 +99,12 @@ OSStatus			AUMIDIEffectBase::GetProperty(	AudioUnitPropertyID		inID,
 		return kAudioUnitErr_InvalidElement;
 	}
 #endif
-	
+
 	result = AUEffectBase::GetProperty (inID, inScope, inElement, outData);
-	
+
 	if (result == kAudioUnitErr_InvalidProperty)
 		result = AUMIDIBase::DelegateGetProperty (inID, inScope, inElement, outData);
-	
+
 	return result;
 }
 
@@ -116,10 +116,10 @@ OSStatus			AUMIDIEffectBase::SetProperty(	AudioUnitPropertyID			inID,
 {
 
 	OSStatus result = AUEffectBase::SetProperty (inID, inScope, inElement, inData, inDataSize);
-		
+
 	if (result == kAudioUnitErr_InvalidProperty)
 		result = AUMIDIBase::DelegateSetProperty (inID, inScope, inElement, inData, inDataSize);
-		
+
 	return result;
 }
 
@@ -131,7 +131,7 @@ OSStatus			AUMIDIEffectBase::ComponentEntryDispatch(ComponentParameters *			para
 	if (This == NULL) return paramErr;
 
 	OSStatus result;
-	
+
 	switch (params->what) {
 	case kMusicDeviceMIDIEventSelect:
 	case kMusicDeviceSysExSelect:
@@ -141,7 +141,7 @@ OSStatus			AUMIDIEffectBase::ComponentEntryDispatch(ComponentParameters *			para
 		result = AUEffectBase::ComponentEntryDispatch(params, This);
 		break;
 	}
-	
+
 	return result;
 }
 #endif
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/AUMIDIEffectBase.h b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/AUMIDIEffectBase.h
index b38f506..744abd6 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/AUMIDIEffectBase.h
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/AUMIDIEffectBase.h
@@ -2,14 +2,14 @@
      File: AUMIDIEffectBase.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #ifndef __AUMIDIEffectBase_h__
 #define __AUMIDIEffectBase_h__
@@ -67,7 +67,7 @@ public:
 	{
 		return AUMIDIBase::MIDIEvent (inStatus, inData1, inData2, inOffsetSampleFrame);
 	}
-    
+
 	/*! @method SysEx */
 	virtual OSStatus            SysEx(const UInt8 *         inData,
                                       UInt32                inLength)
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/AUOutputBase.cpp b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/AUOutputBase.cpp
index 591c43a..c2ed4cc 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/AUOutputBase.cpp
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/AUOutputBase.cpp
@@ -2,14 +2,14 @@
      File: AUOutputBase.cpp
  Abstract: AUOutputBase.h
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #if !CA_USE_AUDIO_PLUGIN_ONLY
 #include "AUOutputBase.h"
@@ -52,7 +52,7 @@ OSStatus		AUOutputBase::ComponentEntryDispatch(ComponentParameters *params, AUOu
 	if (This == NULL) return paramErr;
 
 	OSStatus result;
-	
+
 	switch (params->what) {
 	case kAudioOutputUnitStartSelect:
 		{
@@ -70,7 +70,7 @@ OSStatus		AUOutputBase::ComponentEntryDispatch(ComponentParameters *params, AUOu
 		result = badComponentSelector;
 		break;
 	}
-	
+
 	return result;
 }
 #endif
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/AUOutputBase.h b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/AUOutputBase.h
index 8e5399b..f1a3c15 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/AUOutputBase.h
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/AUOutputBase.h
@@ -2,14 +2,14 @@
      File: AUOutputBase.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #ifndef __AUOutputBase_h__
 #define __AUOutputBase_h__
@@ -63,7 +63,7 @@ public:
 	// additional component entry points
 	/*! @method Start */
 	virtual OSStatus			Start() = 0;
-	
+
 	/*! @method Stop */
 	virtual OSStatus			Stop() = 0;
 
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/AUPannerBase.cpp b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/AUPannerBase.cpp
index f1e2f24..91e7d9c 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/AUPannerBase.cpp
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/AUPannerBase.cpp
@@ -2,14 +2,14 @@
      File: AUPannerBase.cpp
  Abstract: AUPannerBase.h
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #include "AUPannerBase.h"
 #include "CABundleLocker.h"
@@ -51,13 +51,13 @@
 
 static bool sLocalized = false;
 
-static CFStringRef kPanner_Azimuth_Name = CFSTR("azimuth"); 	
-static CFStringRef kPanner_Elevation_Name = CFSTR("elevation"); 	
+static CFStringRef kPanner_Azimuth_Name = CFSTR("azimuth");
+static CFStringRef kPanner_Elevation_Name = CFSTR("elevation");
 static CFStringRef kPanner_Distance_Name = CFSTR("distance");
 
-static CFStringRef kPanner_CoordScale_Name = CFSTR("coordinate scale"); 	
-static CFStringRef kPanner_RefDistance_Name = CFSTR("reference distance"); 	
-static CFStringRef kPanner_Gain_Name = CFSTR("gain"); 	
+static CFStringRef kPanner_CoordScale_Name = CFSTR("coordinate scale");
+static CFStringRef kPanner_RefDistance_Name = CFSTR("reference distance");
+static CFStringRef kPanner_Gain_Name = CFSTR("gain");
 
 static Float32 kPannerParamDefault_Azimuth = 0.;
 static Float32 kPannerParamDefault_Elevation = 0.;
@@ -75,30 +75,30 @@ AUPannerBase::AUPannerBase(AudioComponentInstance inAudioUnit)
 	{
 		CABundleLocker lock;
 		if (!sLocalized)
-		{		
+		{
 			CFBundleRef bundle = CFBundleGetBundleWithIdentifier( CFSTR("com.apple.audio.units.Components") );
 			if (bundle != NULL)
 			{
 				kPanner_Azimuth_Name 	= CFCopyLocalizedStringFromTableInBundle(kPanner_Azimuth_Name,    CFSTR("AudioUnits"), bundle, CFSTR(""));
 				kPanner_Elevation_Name 	= CFCopyLocalizedStringFromTableInBundle(kPanner_Elevation_Name,  CFSTR("AudioUnits"), bundle, CFSTR(""));
 				kPanner_Distance_Name 	= CFCopyLocalizedStringFromTableInBundle(kPanner_Distance_Name,   CFSTR("AudioUnits"), bundle, CFSTR(""));
-				
+
 				kPanner_CoordScale_Name  = CFCopyLocalizedStringFromTableInBundle(kPanner_CoordScale_Name,  CFSTR("AudioUnits"), bundle, CFSTR(""));
 				kPanner_RefDistance_Name = CFCopyLocalizedStringFromTableInBundle(kPanner_RefDistance_Name, CFSTR("AudioUnits"), bundle, CFSTR(""));
 				kPanner_Gain_Name 	     = CFCopyLocalizedStringFromTableInBundle(kPanner_Gain_Name,        CFSTR("AudioUnits"), bundle, CFSTR(""));
 
 			}
-			
+
 			sLocalized = true;
 		}
 	}
-	
+
 	CreateElements();
-	
+
     SetParameter(kPannerParam_Azimuth, kPannerParamDefault_Azimuth);
     SetParameter(kPannerParam_Elevation, kPannerParamDefault_Elevation);
     SetParameter(kPannerParam_Distance, kPannerParamDefault_Distance);
-    
+
     SetParameter(kPannerParam_CoordScale, kPannerParamDefault_CoordScale);
     SetParameter(kPannerParam_RefDistance, kPannerParamDefault_RefDistance);
     SetParameter(kPannerParam_Gain, kPannerParamDefault_Gain);
@@ -135,13 +135,13 @@ void		AUPannerBase::AllocBypassMatrix()
 static AudioChannelLayoutTag DefaultTagForNumberOfChannels(UInt32 inNumberChannels)
 {
 	switch (inNumberChannels) {
-		case 1: return kAudioChannelLayoutTag_Mono; 
-		case 2: return kAudioChannelLayoutTag_Stereo; 
-		case 4: return kAudioChannelLayoutTag_Quadraphonic; 
-		case 5: return kAudioChannelLayoutTag_AudioUnit_5_0; 
-		case 6: return kAudioChannelLayoutTag_AudioUnit_6_0; 
-		case 7: return kAudioChannelLayoutTag_AudioUnit_7_0; 
-		case 8: return kAudioChannelLayoutTag_AudioUnit_8; 
+		case 1: return kAudioChannelLayoutTag_Mono;
+		case 2: return kAudioChannelLayoutTag_Stereo;
+		case 4: return kAudioChannelLayoutTag_Quadraphonic;
+		case 5: return kAudioChannelLayoutTag_AudioUnit_5_0;
+		case 6: return kAudioChannelLayoutTag_AudioUnit_6_0;
+		case 7: return kAudioChannelLayoutTag_AudioUnit_7_0;
+		case 8: return kAudioChannelLayoutTag_AudioUnit_8;
 
 		default: return 0xFFFF0000 | inNumberChannels;
 	}
@@ -153,7 +153,7 @@ static AudioChannelLayoutTag DefaultTagForNumberOfChannels(UInt32 inNumberChanne
 OSStatus			AUPannerBase::SetDefaultChannelLayoutsIfNone()
 {
 	OSStatus err = noErr;
-	
+
 	// if layout has not been set, then guess layout from number of channels
 	UInt32 inChannels = GetNumberOfInputChannels();
 	AudioChannelLayout inputLayoutSubstitute;
@@ -168,7 +168,7 @@ OSStatus			AUPannerBase::SetDefaultChannelLayoutsIfNone()
 		err = SetAudioChannelLayout(kAudioUnitScope_Input, 0, &GetInputLayout());
 		if (err) return err;
 	}
-		
+
 	// if layout has not been set, then guess layout from number of channels
 	UInt32 outChannels = GetNumberOfOutputChannels();
 	AudioChannelLayout outputLayoutSubstitute;
@@ -183,29 +183,29 @@ OSStatus			AUPannerBase::SetDefaultChannelLayoutsIfNone()
 		err = SetAudioChannelLayout(kAudioUnitScope_Output, 0, &GetOutputLayout());
 		if (err) return err;
 	}
-	
+
 	return err;
 }
 
 
-	
+
 OSStatus			AUPannerBase::UpdateBypassMatrix()
 {
 	OSStatus err = SetDefaultChannelLayoutsIfNone();
 	if (err) return err;
-	
+
 	UInt32 inChannels = GetNumberOfInputChannels();
-	UInt32 outChannels = GetNumberOfOutputChannels();	
-	
+	UInt32 outChannels = GetNumberOfOutputChannels();
+
 	const AudioChannelLayout* inoutACL[2];
-	
+
 	inoutACL[0] = &GetInputLayout();
 	inoutACL[1] = &GetOutputLayout();
 
 	mBypassMatrix.alloc(inChannels * outChannels, true);
-	
+
 	UInt32 propSize = inChannels * outChannels * sizeof(Float32);
-	
+
 	err = AudioFormatGetProperty(kAudioFormatProperty_MatrixMixMap, sizeof(inoutACL), inoutACL, &propSize, mBypassMatrix());
 	if (err) {
 		// if there is an error, use a diagonal matrix.
@@ -225,7 +225,7 @@ OSStatus			AUPannerBase::UpdateBypassMatrix()
 /*! @method Cleanup */
 void				AUPannerBase::Cleanup()
 {
-    
+
 }
 
 
@@ -249,9 +249,9 @@ OSStatus			AUPannerBase::GetParameterInfo(	AudioUnitScope			inScope,
 
 	outParameterInfo.flags = 	kAudioUnitParameterFlag_IsWritable
 						+		kAudioUnitParameterFlag_IsReadable;
-		
+
 	if (inScope == kAudioUnitScope_Global) {
-		
+
 		switch(inParameterID)
 		{
 			case kPannerParam_Azimuth:
@@ -279,7 +279,7 @@ OSStatus			AUPannerBase::GetParameterInfo(	AudioUnitScope			inScope,
 				outParameterInfo.flags += kAudioUnitParameterFlag_IsHighResolution;
 				//outParameterInfo.flags += kAudioUnitParameterFlag_DisplayLogarithmic;
 			break;
- 
+
  			case kPannerParam_CoordScale:
 				AUBase::FillInParameterName (outParameterInfo, kPanner_CoordScale_Name, false);
 				outParameterInfo.unit = kAudioUnitParameterUnit_Meters;
@@ -313,9 +313,9 @@ OSStatus			AUPannerBase::GetParameterInfo(	AudioUnitScope			inScope,
 	} else {
 		result = kAudioUnitErr_InvalidParameter;
 	}
-	
+
 	return result;
-}												
+}
 
 //_____________________________________________________________________________
 //
@@ -324,15 +324,15 @@ OSStatus 	AUPannerBase::GetParameter(		AudioUnitParameterID			inParamID,
 													AudioUnitElement 				inElement,
 													Float32 &						outValue)
 {
-	if (inScope != kAudioUnitScope_Global) 
+	if (inScope != kAudioUnitScope_Global)
 		return kAudioUnitErr_InvalidScope;
-		
+
 	outValue = Globals()->GetParameter(inParamID);
 
 	return noErr;
 }
 
-											
+
 //_____________________________________________________________________________
 //
 OSStatus 	AUPannerBase::SetParameter(		AudioUnitParameterID			inParamID,
@@ -341,11 +341,11 @@ OSStatus 	AUPannerBase::SetParameter(		AudioUnitParameterID			inParamID,
 													Float32							inValue,
 													UInt32							inBufferOffsetInFrames)
 {
-	if (inScope != kAudioUnitScope_Global) 
+	if (inScope != kAudioUnitScope_Global)
 		return kAudioUnitErr_InvalidScope;
 
 	Globals()->SetParameter(inParamID, inValue);
-	
+
 	return noErr;
 }
 
@@ -365,7 +365,7 @@ OSStatus			AUPannerBase::GetPropertyInfo (AudioUnitPropertyID	inID,
 		case kAudioUnitProperty_BypassEffect:
 			if (inScope != kAudioUnitScope_Global)
 				return kAudioUnitErr_InvalidScope;
-				
+
 			outWritable = true;
 			outDataSize = sizeof (UInt32);
 			break;
@@ -384,7 +384,7 @@ OSStatus			AUPannerBase::GetProperty (AudioUnitPropertyID 		inID,
 										void *						outData)
 {
 	OSStatus err = noErr;
-	switch (inID) 
+	switch (inID)
 	{
 		case kAudioUnitProperty_BypassEffect:
 			if (inScope != kAudioUnitScope_Global)
@@ -407,14 +407,14 @@ OSStatus			AUPannerBase::SetProperty(AudioUnitPropertyID 		inID,
 										const void *				inData,
 										UInt32 						inDataSize)
 {
-	switch (inID) 
+	switch (inID)
 	{
 		case kAudioUnitProperty_BypassEffect:
 				if (inDataSize < sizeof(UInt32))
 					return kAudioUnitErr_InvalidPropertyValue;
 				bool tempNewSetting = *((UInt32*)inData) != 0;
 					// we're changing the state of bypass
-				if (tempNewSetting != IsBypassEffect()) 
+				if (tempNewSetting != IsBypassEffect())
 				{
 					if (!tempNewSetting && IsBypassEffect() && IsInitialized()) // turning bypass off and we're initialized
 						Reset(0, 0);
@@ -444,15 +444,15 @@ OSStatus			AUPannerBase::ChangeStreamFormat (
 									const CAStreamBasicDescription & 	inPrevFormat,
 									const CAStreamBasicDescription &	inNewFormat)
 {
-	if (inScope == kAudioUnitScope_Input && !InputChannelConfigIsSupported(inNewFormat.NumberChannels())) 
+	if (inScope == kAudioUnitScope_Input && !InputChannelConfigIsSupported(inNewFormat.NumberChannels()))
 		return kAudioUnitErr_FormatNotSupported;
-		
-	if (inScope == kAudioUnitScope_Output && !OutputChannelConfigIsSupported(inNewFormat.NumberChannels())) 
+
+	if (inScope == kAudioUnitScope_Output && !OutputChannelConfigIsSupported(inNewFormat.NumberChannels()))
 		return kAudioUnitErr_FormatNotSupported;
-		
+
 	if (inNewFormat.NumberChannels() != inPrevFormat.NumberChannels())
 		RemoveAudioChannelLayout(inScope, inElement);
-		
+
 	return AUBase::ChangeStreamFormat(inScope, inElement, inPrevFormat, inNewFormat);
 }
 
@@ -463,9 +463,9 @@ OSStatus 	AUPannerBase::Render(AudioUnitRenderActionFlags &		ioActionFlags,
 									const AudioTimeStamp &			inTimeStamp,
 									UInt32							inNumberFrames)
 {
-	if (IsBypassEffect()) 
+	if (IsBypassEffect())
 		return BypassRender(ioActionFlags, inTimeStamp, inNumberFrames);
-	else 
+	else
 		return PannerRender(ioActionFlags, inTimeStamp, inNumberFrames);
 }
 
@@ -483,16 +483,16 @@ OSStatus 	AUPannerBase::BypassRender(AudioUnitRenderActionFlags &		ioActionFlags
 
 	AudioBufferList& outputBufferList = GetOutput(0)->GetBufferList();
 	AUBufferList::ZeroBuffer(outputBufferList);
-	
-	if (!isSilent) 
+
+	if (!isSilent)
 	{
 		UInt32 inChannels = GetNumberOfInputChannels();
 		UInt32 outChannels = GetNumberOfOutputChannels();
 		Float32* bypass = mBypassMatrix();
 		for (UInt32 outChan = 0; outChan < outChannels; ++outChan)
 		{
-			float* outData = GetOutput(0)->GetChannelData(outChan);	
-			
+			float* outData = GetOutput(0)->GetChannelData(outChan);
+
 			for (UInt32 inChan = 0; inChan < inChannels; ++inChan)
 			{
 				float* inData = GetInput(0)->GetChannelData(inChan);
@@ -510,13 +510,13 @@ UInt32		AUPannerBase::GetAudioChannelLayout(	AudioUnitScope				inScope,
 													AudioUnitElement 			inElement,
 													AudioChannelLayout *		outLayoutPtr,
 													Boolean &					outWritable)
-{	
+{
 	SetDefaultChannelLayoutsIfNone();
-	
+
 	outWritable = true;
-	
+
 	CAAudioChannelLayout* caacl = NULL;
-	switch (inScope) 
+	switch (inScope)
 	{
 		case kAudioUnitScope_Input:
 			caacl = &mInputLayout;
@@ -527,14 +527,14 @@ UInt32		AUPannerBase::GetAudioChannelLayout(	AudioUnitScope				inScope,
 		default:
 			COMPONENT_THROW(kAudioUnitErr_InvalidScope);
 	}
-	
+
 	if (inElement != 0)
 		COMPONENT_THROW(kAudioUnitErr_InvalidElement);
-		
+
 	UInt32 size = caacl->IsValid() ? caacl->Size() : 0;
 	if (size > 0 && outLayoutPtr)
 		memcpy(outLayoutPtr, &caacl->Layout(), size);
-		
+
 	return size;
 }
 
@@ -544,7 +544,7 @@ OSStatus	AUPannerBase::RemoveAudioChannelLayout(		AudioUnitScope				inScope,
 														AudioUnitElement			inElement)
 {
 	CAAudioChannelLayout* caacl = NULL;
-	switch (inScope) 
+	switch (inScope)
 	{
 		case kAudioUnitScope_Input:
 			caacl = &mInputLayout;
@@ -555,17 +555,17 @@ OSStatus	AUPannerBase::RemoveAudioChannelLayout(		AudioUnitScope				inScope,
 		default:
 			return kAudioUnitErr_InvalidScope;
 	}
-	
+
 	if (inElement != 0)
 		return kAudioUnitErr_InvalidElement;
-	
+
 	*caacl = NULL;
 	return noErr;
 }
 
 //_____________________________________________________________________________
 //
-OSStatus 	AUPannerBase::SetAudioChannelLayout(		AudioUnitScope 				inScope, 
+OSStatus 	AUPannerBase::SetAudioChannelLayout(		AudioUnitScope 				inScope,
 														AudioUnitElement 			inElement,
 														const AudioChannelLayout *	inLayout)
 {
@@ -574,10 +574,10 @@ OSStatus 	AUPannerBase::SetAudioChannelLayout(		AudioUnitScope 				inScope,
 
 	if (!ChannelLayoutTagIsSupported(inScope, inElement, inLayout->mChannelLayoutTag))
 		return kAudioUnitErr_FormatNotSupported;
-	
+
 	CAAudioChannelLayout* caacl = NULL;
 	UInt32 currentChannels;
-	switch (inScope) 
+	switch (inScope)
 	{
 		case kAudioUnitScope_Input:
 			caacl = &mInputLayout;
@@ -590,28 +590,28 @@ OSStatus 	AUPannerBase::SetAudioChannelLayout(		AudioUnitScope 				inScope,
 		default:
 			return kAudioUnitErr_InvalidScope;
 	}
-	
+
 	if (inElement != 0)
 		return kAudioUnitErr_InvalidElement;
 
 	UInt32 numChannelsInLayout = CAAudioChannelLayout::NumberChannels(*inLayout);
 	if (currentChannels != numChannelsInLayout)
 		return kAudioUnitErr_InvalidPropertyValue;
-	
+
 	*caacl = inLayout;
 	if (IsInitialized())
 		UpdateBypassMatrix();
-		
+
 	return noErr;
 }
 
 //_____________________________________________________________________________
 //
 UInt32 AUPannerBase::GetChannelLayoutTags(		AudioUnitScope				inScope,
-												AudioUnitElement 			inElement, 
+												AudioUnitElement 			inElement,
 												AudioChannelLayoutTag*		outTags)
 {
-	switch (inScope) 
+	switch (inScope)
 	{
 		case kAudioUnitScope_Input:
 			if (outTags) {
@@ -687,20 +687,20 @@ bool 	AUPannerBase::OutputChannelConfigIsSupported(UInt32 inNumberChannels)
 
 //_____________________________________________________________________________
 //
-bool 	AUPannerBase::ChannelLayoutTagIsSupported(		AudioUnitScope			inScope, 
-														AudioUnitElement		inElement, 
+bool 	AUPannerBase::ChannelLayoutTagIsSupported(		AudioUnitScope			inScope,
+														AudioUnitElement		inElement,
 														AudioChannelLayoutTag	inTag)
 {
 	UInt32 numTags = GetChannelLayoutTags(inScope, inElement, NULL);
 	CAAutoFree<AudioChannelLayoutTag> tags(numTags);
 	GetChannelLayoutTags(inScope, inElement, tags());
-	
+
 	for (UInt32 i = 0; i < numTags; ++i)
 	{
 		if (tags[i] == inTag)
 			return true;
 	}
-	
+
 	return false;
 }
 
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/AUPannerBase.h b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/AUPannerBase.h
index 3184830..8804255 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/AUPannerBase.h
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/AUPannerBase.h
@@ -2,14 +2,14 @@
      File: AUPannerBase.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #ifndef __AUPannerBase_h__
 #define __AUPannerBase_h__
@@ -61,7 +61,7 @@ public:
     AUPannerBase(AudioComponentInstance inAudioUnit);
 /*! @dtor ~AUPannerBase */
     virtual ~AUPannerBase();
-    
+
 	/*! @method Initialize */
 	virtual OSStatus			Initialize();
 
@@ -114,14 +114,14 @@ public:
 										const CAStreamBasicDescription & 	inPrevFormat,
 										const CAStreamBasicDescription &	inNewFormat);
 
-	
+
 	/*! @method IsBypassEffect */
 	// This is used for the property value - to reflect to the UI if an effect is bypassed
 	bool						IsBypassEffect () { return mBypassEffect; }
-						
+
 	/*! @method SetBypassEffect */
 	virtual void				SetBypassEffect (bool inFlag) { mBypassEffect = inFlag; }
-	
+
 
 	/*! @method Render */
 	virtual OSStatus 	Render(AudioUnitRenderActionFlags &		ioActionFlags,
@@ -146,17 +146,17 @@ public:
 														Boolean &					outWritable);
 
 	/*! @method SetAudioChannelLayout */
-	virtual OSStatus			SetAudioChannelLayout(	AudioUnitScope 				inScope, 
+	virtual OSStatus			SetAudioChannelLayout(	AudioUnitScope 				inScope,
 														AudioUnitElement 			inElement,
 														const AudioChannelLayout *	inLayout);
 
 	/*! @method RemoveAudioChannelLayout */
-	virtual OSStatus			RemoveAudioChannelLayout(	AudioUnitScope			inScope, 
+	virtual OSStatus			RemoveAudioChannelLayout(	AudioUnitScope			inScope,
 															AudioUnitElement		inElement);
 
 	/*! @method GetChannelLayoutTags */
 	virtual UInt32				GetChannelLayoutTags(		AudioUnitScope				inScope,
-															AudioUnitElement 			inElement, 
+															AudioUnitElement 			inElement,
 															AudioChannelLayoutTag*		outTags);
 
 	/*! @method GetNumberOfInputChannels */
@@ -169,7 +169,7 @@ public:
 														AudioUnitScope 					inScope,
 														AudioUnitElement 				inElement,
 														Float32 &						outValue);
-												
+
 	/*! @method SetParameter */
 	virtual OSStatus 	SetParameter(			AudioUnitParameterID			inParamID,
 														AudioUnitScope 					inScope,
@@ -185,7 +185,7 @@ public:
 									OSStatus err = SetParameter(inParamID, kAudioUnitScope_Global, 0, inValue, 0);
 									if (err) throw err;
 								}
-								
+
 	/*! @method GetParameter */
 	Float32						GetParameter(			UInt32							inParamID )
 								{
@@ -219,8 +219,8 @@ public:
 	/*! @method GetCoordScale */
 	Float32						GetCoordScale()  { return GetParameter(kPannerParam_CoordScale); }
 	/*! @method GetRefDistance */
-	Float32						GetRefDistance() { return GetParameter(kPannerParam_RefDistance); }	                        	
-	                        	
+	Float32						GetRefDistance() { return GetParameter(kPannerParam_RefDistance); }
+
 	/*! @method SetGain */
 	void						SetGain(Float32 inValue)        { SetParameter(kPannerParam_Gain, inValue); }
 	/*! @method SetAzimuth */
@@ -233,7 +233,7 @@ public:
 	void						SetCoordScale(Float32 inValue)  { SetParameter(kPannerParam_CoordScale, inValue); }
 	/*! @method SetRefDistance */
 	void						SetRefDistance(Float32 inValue) { SetParameter(kPannerParam_RefDistance, inValue); }
-	
+
 protected:
 	/*! @method ShouldBypassEffect */
 	// This is used in the render call to see if an effect is bypassed
@@ -248,17 +248,17 @@ protected:
 
 	/*! @method SetDefaultChannelLayoutsIfNone */
 	OSStatus					SetDefaultChannelLayoutsIfNone();
-	
+
 	/*! @method ChannelLayoutTagIsSupported */
-	bool						ChannelLayoutTagIsSupported(	AudioUnitScope			inScope, 
-																AudioUnitElement		inElement, 
+	bool						ChannelLayoutTagIsSupported(	AudioUnitScope			inScope,
+																AudioUnitElement		inElement,
 																AudioChannelLayoutTag	inTag);
-	
+
 	const AudioChannelLayout&	GetInputLayout() const { return mInputLayout.Layout(); }
 	const AudioChannelLayout&	GetOutputLayout() const { return mOutputLayout.Layout(); }
-	
+
 private:
-	
+
 	/*! @var UpdateBypassMatrix */
 	bool mBypassEffect;
 	/*! @var mBypassMatrix */
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/MusicDeviceBase.cpp b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/MusicDeviceBase.cpp
index 28e4d36..15e13e8 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/MusicDeviceBase.cpp
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/MusicDeviceBase.cpp
@@ -2,14 +2,14 @@
      File: MusicDeviceBase.cpp
  Abstract: MusicDeviceBase.h
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #include "MusicDeviceBase.h"
 
@@ -90,10 +90,10 @@ static OSStatus		MusicDeviceBaseStopNote(void *			inComponentStorage,
 
 #endif
 
-MusicDeviceBase::MusicDeviceBase(AudioComponentInstance			inInstance, 
+MusicDeviceBase::MusicDeviceBase(AudioComponentInstance			inInstance,
 									UInt32						numInputs,
 									UInt32						numOutputs,
-									UInt32						numGroups) 
+									UInt32						numGroups)
 	: AUBase(inInstance, numInputs, numOutputs, numGroups),
 	  AUMIDIBase(this)
 {
@@ -106,8 +106,8 @@ OSStatus			MusicDeviceBase::GetPropertyInfo(AudioUnitPropertyID	inID,
 							Boolean &				outWritable)
 {
 	OSStatus result;
-	
-	switch (inID) 
+
+	switch (inID)
 	{
 #if !TARGET_OS_IPHONE
 		case kMusicDeviceProperty_InstrumentCount:
@@ -119,7 +119,7 @@ OSStatus			MusicDeviceBase::GetPropertyInfo(AudioUnitPropertyID	inID,
 #endif
 		default:
 			result = AUBase::GetPropertyInfo (inID, inScope, inElement, outDataSize, outWritable);
-			
+
 			if (result == kAudioUnitErr_InvalidProperty)
 				result = AUMIDIBase::DelegateGetPropertyInfo (inID, inScope, inElement, outDataSize, outWritable);
 			break;
@@ -134,7 +134,7 @@ OSStatus			MusicDeviceBase::GetProperty(	AudioUnitPropertyID			inID,
 {
 	OSStatus result;
 
-	switch (inID) 
+	switch (inID)
 	{
 #if !CA_USE_AUDIO_PLUGIN_ONLY
 		case kAudioUnitProperty_FastDispatch:
@@ -146,7 +146,7 @@ OSStatus			MusicDeviceBase::GetProperty(	AudioUnitPropertyID			inID,
 			else if (inElement == kMusicDeviceStartNoteSelect) {
 				*(TEMP_MusicDeviceStartNoteProc *)outData = MusicDeviceBaseStartNote;
 				return noErr;
-			}	
+			}
 			else if (inElement == kMusicDeviceStopNoteSelect) {
 				*(TEMP_MusicDeviceStopNoteProc *)outData = MusicDeviceBaseStopNote;
 				return noErr;
@@ -161,11 +161,11 @@ OSStatus			MusicDeviceBase::GetProperty(	AudioUnitPropertyID			inID,
 #endif
 		default:
 			result = AUBase::GetProperty (inID, inScope, inElement, outData);
-			
+
 			if (result == kAudioUnitErr_InvalidProperty)
 				result = AUMIDIBase::DelegateGetProperty (inID, inScope, inElement, outData);
 	}
-	
+
 	return result;
 }
 
@@ -179,10 +179,10 @@ OSStatus			MusicDeviceBase::SetProperty(	AudioUnitPropertyID 			inID,
 {
 
 	OSStatus result = AUBase::SetProperty (inID, inScope, inElement, inData, inDataSize);
-		
+
 	if (result == kAudioUnitErr_InvalidProperty)
 		result = AUMIDIBase::DelegateSetProperty (inID, inScope, inElement, inData, inDataSize);
-		
+
 	return result;
 }
 
@@ -205,7 +205,7 @@ OSStatus	MusicDeviceBase::HandleNoteOn(	UInt8 	inChannel,
 	params.mVelocity = inVelocity;
 	return StartNote (kMusicNoteEvent_UseGroupInstrument, inChannel, NULL, inStartFrame, params);
 }
-											
+
 OSStatus	MusicDeviceBase::HandleNoteOff(	UInt8 	inChannel,
 											UInt8 	inNoteNumber,
 											UInt8 	inVelocity,
@@ -214,17 +214,17 @@ OSStatus	MusicDeviceBase::HandleNoteOff(	UInt8 	inChannel,
 	return StopNote (inChannel, inNoteNumber, inStartFrame);
 }
 
-OSStatus			
-MusicDeviceBase::HandleStartNoteMessage (MusicDeviceInstrumentID		inInstrument, 
-										MusicDeviceGroupID				inGroupID, 
-										NoteInstanceID *				outNoteInstanceID, 
-										UInt32							inOffsetSampleFrame, 
+OSStatus
+MusicDeviceBase::HandleStartNoteMessage (MusicDeviceInstrumentID		inInstrument,
+										MusicDeviceGroupID				inGroupID,
+										NoteInstanceID *				outNoteInstanceID,
+										UInt32							inOffsetSampleFrame,
 										const MusicDeviceNoteParams *	inParams)
 {
 	if (inParams == NULL || outNoteInstanceID == NULL) return kAudio_ParamError;
 
 	if (!IsInitialized()) return kAudioUnitErr_Uninitialized;
-	
+
 	return StartNote (inInstrument, inGroupID, outNoteInstanceID, inOffsetSampleFrame, *inParams);
 }
 
@@ -251,7 +251,7 @@ OSStatus			MusicDeviceBase::ComponentEntryDispatch(	ComponentParameters *		param
 	if (This == NULL) return kAudio_ParamError;
 
 	OSStatus result;
-	
+
 	switch (params->what) {
 	case kMusicDeviceMIDIEventSelect:
 	case kMusicDeviceSysExSelect:
@@ -294,7 +294,7 @@ OSStatus			MusicDeviceBase::ComponentEntryDispatch(	ComponentParameters *		param
 		result = AUBase::ComponentEntryDispatch(params, This);
 		break;
 	}
-	
+
 	return result;
 }
 #endif
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/MusicDeviceBase.h b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/MusicDeviceBase.h
index 4850b8f..f7304a8 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/MusicDeviceBase.h
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/OtherBases/MusicDeviceBase.h
@@ -2,14 +2,14 @@
      File: MusicDeviceBase.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #ifndef __MusicDeviceBase_h__
 #define __MusicDeviceBase_h__
@@ -57,23 +57,23 @@
 class MusicDeviceBase : public AUBase, public AUMIDIBase {
 public:
 	/*! @ctor MusicDeviceBase */
-								MusicDeviceBase(		AudioComponentInstance			inInstance, 
+								MusicDeviceBase(		AudioComponentInstance			inInstance,
 														UInt32							numInputs,
 														UInt32							numOutputs,
 														UInt32							numGroups = 0);
 
 
-	virtual OSStatus	MIDIEvent(		UInt32 						inStatus, 
-										UInt32 						inData1, 
-										UInt32 						inData2, 
+	virtual OSStatus	MIDIEvent(		UInt32 						inStatus,
+										UInt32 						inData1,
+										UInt32 						inData2,
 										UInt32 						inOffsetSampleFrame)
 	{
 		return AUMIDIBase::MIDIEvent (inStatus, inData1, inData2, inOffsetSampleFrame);
 	}
 
 	/*! @method SysEx */
-	virtual OSStatus	SysEx(			const UInt8 *				inData, 
-										UInt32 						inLength) 
+	virtual OSStatus	SysEx(			const UInt8 *				inData,
+										UInt32 						inLength)
 	{
 		return AUMIDIBase::SysEx (inData, inLength);
 	}
@@ -90,7 +90,7 @@ public:
 												AudioUnitScope 				inScope,
 												AudioUnitElement		 	inElement,
 												void *						outData);
-												
+
 	/*! @method SetProperty */
 	virtual OSStatus			SetProperty(			AudioUnitPropertyID 			inID,
 														AudioUnitScope 					inScope,
@@ -103,7 +103,7 @@ public:
 												UInt8 	inNoteNumber,
 												UInt8 	inVelocity,
 												UInt32 	inStartFrame);
-																								
+
 	/*! @method HandleNoteOff */
 	virtual OSStatus			HandleNoteOff(	UInt8 	inChannel,
 												UInt8 	inNoteNumber,
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/Utility/AUBaseHelper.cpp b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/Utility/AUBaseHelper.cpp
index 2316807..65c6de8 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/Utility/AUBaseHelper.cpp
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/Utility/AUBaseHelper.cpp
@@ -2,14 +2,14 @@
      File: AUBaseHelper.cpp
  Abstract: AUBaseHelper.h
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #include "AUBaseHelper.h"
 
@@ -53,18 +53,18 @@
 #endif
 
 OSStatus	GetFileRefPath (CFDictionaryRef parent, CFStringRef frKey, CFStringRef * fPath)
-{	
+{
 	static CFStringRef kFRString = CFSTR (kAUPresetExternalFileRefs);
-	
+
 	const void* frVal = CFDictionaryGetValue(parent, kFRString);
 	if (!frVal) return kAudioUnitErr_InvalidPropertyValue;
 
 	const void* frString = CFDictionaryGetValue ((CFDictionaryRef)frVal, frKey);
 	if (!frString) return kAudioUnitErr_InvalidPropertyValue;
-		
+
 	if (fPath)
 		*fPath = (CFStringRef)frString;
-	
+
 	return noErr;
 }
 
@@ -74,7 +74,7 @@ CFMutableDictionaryRef CreateFileRefDict (CFStringRef fKey, CFStringRef fPath, C
 		fileRefDict = CFDictionaryCreateMutable	(NULL, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
 
 	CFDictionarySetValue (fileRefDict, fKey, fPath);
-	
+
 	return fileRefDict;
 }
 
@@ -113,11 +113,11 @@ void PrintAUParamEvent (AudioUnitParameterEvent& event, FILE* f)
 		fprintf (f, "\tEvent Type:%s,", (isRamp ? "ramp" : "immediate"));
 		if (isRamp)
 			fprintf (f, "start=%ld,dur=%ld,startValue=%f,endValue=%f\n",
-					(long)event.eventValues.ramp.startBufferOffset, (long)event.eventValues.ramp.durationInFrames, 
+					(long)event.eventValues.ramp.startBufferOffset, (long)event.eventValues.ramp.durationInFrames,
 					event.eventValues.ramp.startValue, event.eventValues.ramp.endValue);
 		else
-			fprintf (f, "start=%ld,value=%f\n", 
-					(long)event.eventValues.immediate.bufferOffset, 
+			fprintf (f, "start=%ld,value=%f\n",
+					(long)event.eventValues.immediate.bufferOffset,
 					event.eventValues.immediate.value);
 		fprintf (f, "- - - - - - - - - - - - - - - -\n");
 }
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/Utility/AUBaseHelper.h b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/Utility/AUBaseHelper.h
index 310a8df..ad4cda6 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/Utility/AUBaseHelper.h
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/Utility/AUBaseHelper.h
@@ -2,14 +2,14 @@
      File: AUBaseHelper.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #ifndef __AUBaseHelper_h__
 #define __AUBaseHelper_h__
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/Utility/AUBuffer.cpp b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/Utility/AUBuffer.cpp
index 36bb41f..6164ae1 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/Utility/AUBuffer.cpp
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/Utility/AUBuffer.cpp
@@ -2,14 +2,14 @@
      File: AUBuffer.cpp
  Abstract: AUBuffer.h
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #include "AUBuffer.h"
 #include <stdlib.h>
@@ -58,10 +58,10 @@ AUBufferList::~AUBufferList()
 static UInt32 SafeMultiplyAddUInt32(UInt32 a, UInt32 b, UInt32 c)
 {
 	if (a == 0 || b == 0) return c;  // prevent zero divide
-	
+
 	if (a > (0xFFFFFFFF - c) / b)
 		throw std::bad_alloc();
-	
+
 	return a * b + c;
 }
 
@@ -132,7 +132,7 @@ AudioBufferList &	AUBufferList::PrepareBuffer(const CAStreamBasicDescription &fo
 		if (nStreams > mAllocatedStreams)
 			COMPONENT_THROW(kAudioUnitErr_FormatNotSupported);
 	}
-	
+
 	AudioBufferList *abl = mPtrs;
 	abl->mNumberBuffers = nStreams;
 	AudioBuffer *buf = abl->mBuffers;
@@ -187,7 +187,7 @@ void		AUBufferList::UseExternalBuffer(const CAStreamBasicDescription &format, co
 		Byte *oldMemory = mMemory;
 		mMemory = buf.buffer;
 		mAllocatedBytes = alignedSize;
-		// from Allocate(): nBytes = nStreams * nFrames * format.mBytesPerFrame;	
+		// from Allocate(): nBytes = nStreams * nFrames * format.mBytesPerFrame;
 		// thus: nFrames = nBytes / (nStreams * format.mBytesPerFrame)
 		mAllocatedFrames = mAllocatedBytes / (format.NumberChannelStreams() * format.mBytesPerFrame);
 		mExternalMemory = true;
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/Utility/AUBuffer.h b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/Utility/AUBuffer.h
index 64ea4c3..0bdea23 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/Utility/AUBuffer.h
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/Utility/AUBuffer.h
@@ -2,14 +2,14 @@
      File: AUBuffer.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #ifndef __AUBuffer_h__
 #define __AUBuffer_h__
@@ -75,7 +75,7 @@ class AUBufferList {
 	};
 public:
 	/*! @ctor AUBufferList */
-	AUBufferList() : mPtrState(kPtrsInvalid), mExternalMemory(false), mPtrs(NULL), mMemory(NULL), 
+	AUBufferList() : mPtrState(kPtrsInvalid), mExternalMemory(false), mPtrs(NULL), mMemory(NULL),
 		mAllocatedStreams(0), mAllocatedFrames(0), mAllocatedBytes(0) { }
 	/*! @dtor ~AUBufferList */
 	~AUBufferList();
@@ -93,7 +93,7 @@ public:
 							memcpy(mPtrs, &abl, (char *)&abl.mBuffers[abl.mNumberBuffers] - (char *)&abl);
 							return *mPtrs;
 						}
-	
+
 	/*! @method SetBuffer */
 	void				SetBuffer(UInt32 index, const AudioBuffer &ab) {
 							if (mPtrState == kPtrsInvalid || index >= mPtrs->mNumberBuffers)
@@ -118,7 +118,7 @@ public:
 								COMPONENT_THROW(-1);
 							memcpy(&abl, mPtrs, (char *)&abl.mBuffers[abl.mNumberBuffers] - (char *)&abl);
 						}
-	
+
 	/*! @method CopyBufferContentsTo */
 	void				CopyBufferContentsTo(AudioBufferList &abl) const {
 							if (mPtrState == kPtrsInvalid)
@@ -134,12 +134,12 @@ public:
 								destbuf->mDataByteSize = srcbuf->mDataByteSize;
 							}
 						}
-	
+
 	/*! @method Allocate */
 	void				Allocate(const CAStreamBasicDescription &format, UInt32 nFrames);
 	/*! @method Deallocate */
 	void				Deallocate();
-	
+
 	/*! @method UseExternalBuffer */
 	void				UseExternalBuffer(const CAStreamBasicDescription &format, const AudioUnitExternalBuffer &buf);
 
@@ -157,7 +157,7 @@ public:
 
 	/*! @method GetAllocatedFrames */
 	UInt32				GetAllocatedFrames() const { return mAllocatedFrames; }
-	
+
 private:
 	/*! @ctor AUBufferList */
 	AUBufferList(AUBufferList &) { }	// prohibit copy constructor
@@ -184,34 +184,34 @@ private:
 template <class T>
 class TAUBuffer {
 public:
-	enum { 
+	enum {
 		kAlignInterval = 0x10,
 		kAlignMask = kAlignInterval - 1
 	};
-	
+
 	/*! @ctor TAUBuffer.0 */
 	TAUBuffer() :	mMemObject(NULL), mAlignedBuffer(NULL), mBufferSizeBytes(0)
 	{
 	}
-	
+
 	/*! @ctor TAUBuffer.1 */
 	TAUBuffer(UInt32 numElems, UInt32 numChannels) :	mMemObject(NULL), mAlignedBuffer(NULL),
 														mBufferSizeBytes(0)
 	{
 		Allocate(numElems, numChannels);
 	}
-	
+
 	/*! @dtor ~TAUBuffer */
 	~TAUBuffer()
 	{
 		Deallocate();
 	}
-		
+
 	/*! @method Allocate */
 	void	Allocate(UInt32 numElems)			// can also re-allocate
 	{
 		UInt32 reqSize = numElems * sizeof(T);
-		
+
 		if (mMemObject != NULL && reqSize == mBufferSizeBytes)
 			return;	// already allocated
 
@@ -230,28 +230,28 @@ public:
 	{
 		if (mMemObject == NULL) return;			// so this method has no effect if we're using
 												// an external buffer
-		
+
 		free(mMemObject);
 		mMemObject = NULL;
 		mAlignedBuffer = NULL;
 		mBufferSizeBytes = 0;
 	}
-	
+
 	/*! @method AllocateClear */
 	void	AllocateClear(UInt32 numElems)		// can also re-allocate
 	{
 		Allocate(numElems);
 		Clear();
 	}
-	
+
 	/*! @method Clear */
 	void	Clear()
 	{
 		memset(mAlignedBuffer, 0, mBufferSizeBytes);
 	}
-	
+
 	// accessors
-	
+
 	/*! @method operator T *()@ */
 	operator T *()				{ return mAlignedBuffer; }
 
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/Utility/AUInputFormatConverter.h b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/Utility/AUInputFormatConverter.h
index f628a91..bc82c7f 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/Utility/AUInputFormatConverter.h
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/Utility/AUInputFormatConverter.h
@@ -2,14 +2,14 @@
      File: AUInputFormatConverter.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #ifndef __AUInputFormatConverter_h__
 #define __AUInputFormatConverter_h__
@@ -69,14 +69,14 @@ public:
 		strcpy(mTimestampGenerator.mDebugName, "AUConverter");
 #endif
 	}
-	
+
 	// need to subsequently call Initialize, with the desired formats
-	
+
 	/*! @dtor ~AUInputFormatConverter */
 	~AUInputFormatConverter()
 	{
 	}
-	
+
 	virtual OSStatus Initialize(const AudioStreamBasicDescription &src, const AudioStreamBasicDescription &dest)
 	{
 		OSStatus err = FormatConverterClient::Initialize(src, dest);
@@ -92,7 +92,7 @@ public:
 		mTimestampGenerator.Reset();
 		return FormatConverterClient::Reset();
 	}
-	
+
 	void	SetStartInputTimeAtZero(bool b)
 	{
 		mTimestampGenerator.SetStartInputAtZero(b);
@@ -119,13 +119,13 @@ public:
 	}
 
 	/*! @method FormatConverterInputProc */
-	virtual OSStatus	FormatConverterInputProc(	
+	virtual OSStatus	FormatConverterInputProc(
 								UInt32 &						ioNumberDataPackets,
 								AudioBufferList &				ioData,
 								AudioStreamPacketDescription**	outDataPacketDescription)
 	{
 		OSStatus err = ca_noErr;
-		
+
 		AudioUnitRenderActionFlags actionFlags = 0;
 		AUInputElement *input = mHost->GetInput(mHostBus);
 		*ioNumberDataPackets = std::min(*ioNumberDataPackets, This->mHost->GetMaxFramesPerSlice());
@@ -144,7 +144,7 @@ protected:
 	AUBase *				mHost;
 	/*! @var mHostBus */
 	int						mHostBus;
-	
+
 	AUTimestampGenerator	mTimestampGenerator;
 	bool					mIsPCMToPCM;
 	bool					mHasSRC;
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/Utility/AUMIDIDefs.h b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/Utility/AUMIDIDefs.h
index e83c0e7..4fa7a62 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/Utility/AUMIDIDefs.h
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/Utility/AUMIDIDefs.h
@@ -2,14 +2,14 @@
      File: AUMIDIDefs.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #ifndef __AUMIDIDefs_h__
 #define __AUMIDIDefs_h__
@@ -75,7 +75,7 @@ enum
 	kMidiController_Balance					= 8,
 	kMidiController_Pan						= 10,
 	kMidiController_Expression				= 11,
-	
+
 	// these controls have a (0-63) == off, (64-127) == on
 	kMidiController_Sustain					= 64, //hold1
 	kMidiController_Portamento				= 65,
@@ -91,7 +91,7 @@ enum
 	kMidiController_VibratoRate				= 76,
 	kMidiController_VibratoDepth			= 77,
 	kMidiController_VibratoDelay			= 78,
-	
+
 	// these controls have a 0-127 range and in MIDI they have no LSB (so fractional values are lost in MIDI)
 	kMidiController_ReverbLevel				= 91,
 	kMidiController_ChorusLevel				= 93,
@@ -109,7 +109,7 @@ enum
 };
 
 // RPN values
-enum 
+enum
 {
 	kMidiControllerValue_RPNPitchBendSensitivity	= 0,
 	kMidiControllerValue_RPNChannelFineTuning		= 1,
@@ -119,7 +119,7 @@ enum
 };
 
 // GM2 Sound Bank Constants
-enum 
+enum
 {
 	kGM2MelodicBank						= 0x7900,
 	kGM2PercussionBank					= 0x7800,
@@ -129,7 +129,7 @@ enum
 	kBankMSBMask						= 0xff00
 };
 
-enum 
+enum
 {
 	kMSBController_MidPoint			= 0x40
 };
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/Utility/AUSilentTimeout.h b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/Utility/AUSilentTimeout.h
index 9fbd3e1..ad38819 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/Utility/AUSilentTimeout.h
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/Utility/AUSilentTimeout.h
@@ -2,14 +2,14 @@
      File: AUSilentTimeout.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #ifndef __AUSilentTimeout
 #define __AUSilentTimeout
@@ -64,7 +64,7 @@ public:
 				mTimeoutCounter = inTimeoutLimit;
 				mResetTimer = false;
 			}
-			
+
 			if(mTimeoutCounter > 0 )
 			{
 				mTimeoutCounter -= inFramesToProcess;
@@ -74,7 +74,7 @@ public:
 		else
 		{
 			// signal to reset the next time we receive silence
-			mResetTimer = true;	
+			mResetTimer = true;
 		}
 	}
 
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/Utility/AUTimestampGenerator.cpp b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/Utility/AUTimestampGenerator.cpp
index 7c57a81..85dad84 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/Utility/AUTimestampGenerator.cpp
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/Utility/AUTimestampGenerator.cpp
@@ -2,14 +2,14 @@
      File: AUTimestampGenerator.cpp
  Abstract: AUTimestampGenerator.h
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #include "AUTimestampGenerator.h"
 #include "CAMath.h"
@@ -68,12 +68,12 @@ void	AUTimestampGenerator::AddOutputTime(const AudioTimeStamp &inTimeStamp, Floa
 
 	if (mState.mBypassed)
 		return;
-		
+
 	if (mState.mHostTimeDiscontinuityCorrection && !(mState.mCurrentOutputTime.mFlags & kAudioTimeStampHostTimeValid) && (mState.mLastOutputTime.mFlags & kAudioTimeStampHostTimeValid)) {
 		// no host time here but we had one last time, interpolate one
 		double rateScalar = (mState.mCurrentOutputTime.mFlags & kAudioTimeStampRateScalarValid) ? mState.mCurrentOutputTime.mRateScalar : 1.0;
 		Float64 deltaSamples = mState.mCurrentOutputTime.mSampleTime - mState.mLastOutputTime.mSampleTime;
-		mState.mCurrentOutputTime.mHostTime = mState.mLastOutputTime.mHostTime + 
+		mState.mCurrentOutputTime.mHostTime = mState.mLastOutputTime.mHostTime +
 			UInt64(CAHostTimeBase::GetFrequency() * deltaSamples * rateScalar / outputSampleRate);
 		mState.mCurrentOutputTime.mFlags |= kAudioTimeStampHostTimeValid;
 #if DEBUG
@@ -90,7 +90,7 @@ void	AUTimestampGenerator::AddOutputTime(const AudioTimeStamp &inTimeStamp, Floa
 			mState.mCurrentOutputTime.mFlags |= kAudioTimeStampRateScalarValid;
 		}
 	}
-	
+
 	if (mFirstTime) {
 		mFirstTime = false;
 		mState.mDiscontinuous = false;
@@ -120,16 +120,16 @@ const AudioTimeStamp &	AUTimestampGenerator::GenerateInputTime(Float64 framesToA
 		return mState.mCurrentOutputTime;
 
 	double inputSampleTime;
-	
+
 	mState.mCurrentInputTime.mFlags = kAudioTimeStampSampleTimeValid;
 	double rateScalar = 1.0;
-	
+
 	// propagate rate scalar
 	if (mState.mCurrentOutputTime.mFlags & kAudioTimeStampRateScalarValid) {
 		mState.mCurrentInputTime.mFlags |= kAudioTimeStampRateScalarValid;
 		mState.mCurrentInputTime.mRateScalar = rateScalar = mState.mCurrentOutputTime.mRateScalar;
 	}
-	
+
 	// propagate host time and sample time
 	if (mState.mCurrentOutputTime.mFlags & kAudioTimeStampHostTimeValid) {
 		mState.mCurrentInputTime.mFlags |= kAudioTimeStampHostTimeValid;
@@ -142,7 +142,7 @@ const AudioTimeStamp &	AUTimestampGenerator::GenerateInputTime(Float64 framesToA
 			mState.mCurrentInputTime.mHostTime = mState.mCurrentOutputTime.mHostTime;
 		}
 		if (mState.mHostTimeDiscontinuityCorrection && mState.mDiscontinuous && (mState.mLastOutputTime.mFlags & kAudioTimeStampHostTimeValid)) {
-			// we had a discontinuous output time, need to resync by interpolating 
+			// we had a discontinuous output time, need to resync by interpolating
 			// a sample time that is appropriate to the host time
 			UInt64 deltaHostTime = mState.mCurrentOutputTime.mHostTime - mState.mLastOutputTime.mHostTime;
 			double deltaSeconds = double(deltaHostTime) * CAHostTimeBase::GetInverseFrequency();
@@ -168,28 +168,28 @@ const AudioTimeStamp &	AUTimestampGenerator::GenerateInputTime(Float64 framesToA
 		// we had a discontinuous output time, need to resync by propagating the
 		// detected discontinuity, taking the rate scalar adjustment into account
 		inputSampleTime += floor(mState.mDiscontinuityDeltaSamples / mState.mRateScalarAdj + 0.5);
-		
+
 #if DEBUG
 		if (mVerbosity > 1)
 			printf("%-20.20s: adjusted input time: %.0f -> %.0f (SR=%.3f, rs=%.3f, delta=%.0f)\n", mDebugName, mState.mNextInputSampleTime, inputSampleTime, inputSampleRate, mState.mRateScalarAdj, mState.mDiscontinuityDeltaSamples);
 #endif
-		
+
 		mState.mDiscontinuityDeltaSamples = 0.;
 	}
-	
-	
+
+
 	// propagate word clock
 	if (mState.mCurrentOutputTime.mFlags & kAudioTimeStampWordClockTimeValid) {
 		mState.mCurrentInputTime.mFlags |= kAudioTimeStampWordClockTimeValid;
 		mState.mCurrentInputTime.mWordClockTime = mState.mCurrentOutputTime.mWordClockTime;
 	}
-	
+
 	// propagate SMPTE time
 	if (mState.mCurrentOutputTime.mFlags & kAudioTimeStampSMPTETimeValid) {
 		mState.mCurrentInputTime.mFlags |= kAudioTimeStampSMPTETimeValid;
 		mState.mCurrentInputTime.mSMPTETime = mState.mCurrentOutputTime.mSMPTETime;
 	}
-	
+
 	// store the input sample time and expected next input time
 	mState.mCurrentInputTime.mSampleTime = inputSampleTime;
 	mState.mNextInputSampleTime = inputSampleTime + framesToAdvance;
diff --git a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/Utility/AUTimestampGenerator.h b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/Utility/AUTimestampGenerator.h
index cfd8456..333dc19 100644
--- a/libs/appleutility/CoreAudio/AudioUnits/AUPublic/Utility/AUTimestampGenerator.h
+++ b/libs/appleutility/CoreAudio/AudioUnits/AUPublic/Utility/AUTimestampGenerator.h
@@ -2,14 +2,14 @@
      File: AUTimestampGenerator.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #ifndef __AUTimestampGenerator_h__
 #define __AUTimestampGenerator_h__
@@ -76,14 +76,14 @@ public:
 		CAHostTimeBase::GetFrequency();
 		Reset();
 	}
-	
+
 	void	SetStartInputAtZero(bool b) { mState.mStartInputAtZero = b; }
 	bool	GetStartInputAtZero() const { return mState.mStartInputAtZero; }
-	
+
 	// bypassing is intended for a narrow special case. the upstream sample time will always be the same as the downstream time.
 	void	SetBypassed(bool b) { mState.mBypassed = b; }
 	bool	GetBypassed() const { return mState.mBypassed; }
-		
+
 	// Call this to reset the timeline.
 	void	Reset()
 	{
@@ -93,26 +93,26 @@ public:
 		mState.mNextOutputSampleTime = 0.;
 		mState.mLastOutputTime.mFlags = 0;
 		mState.mRateScalarAdj = 1.;
-		
+
 		mFirstTime = true;
 #if DEBUG
 		if (mVerbosity)
 			printf("%-20.20s: Reset\n", mDebugName);
 #endif
 	}
-	
+
 	// Call this once per render cycle with the downstream timestamp.
-	// expectedDeltaFrames is the expected difference between the current and NEXT 
+	// expectedDeltaFrames is the expected difference between the current and NEXT
 	//	downstream timestamps.
 	// sampleRate is the OUTPUT sample rate.
 	void	AddOutputTime(const AudioTimeStamp &inTimeStamp, Float64 expectedDeltaFrames, double outputSampleRate, double rateScalarAdj=1.0);
-	
+
 	// Call this once per render cycle to obtain the upstream timestamp.
 	// framesToAdvance is the number of frames the input timeline is to be
 	//	advanced during this render cycle.
 	// sampleRate is the INPUT sample rate.
 	const AudioTimeStamp &	GenerateInputTime(Float64 framesToAdvance, double inputSampleRate, bool advanceHostTime = false);
-		
+
 	// this can be called to override the setting of the next input sample time in GenerateInputTime
 	void					Advance(Float64 framesToAdvance)
 	{
@@ -128,7 +128,7 @@ public:
 		Float64				mNextInputSampleTime;
 		Float64				mNextOutputSampleTime;
 		Float64				mInputSampleTimeForOutputPull;
-		
+
 		AudioTimeStamp		mLastOutputTime;
 		AudioTimeStamp		mCurrentOutputTime;
 
@@ -137,21 +137,21 @@ public:
 		bool				mDiscontinuous;
 		bool				mBypassed;
 		Float64				mDiscontinuityDeltaSamples;
-		
+
 		double				mRateScalarAdj;
-		
+
 		bool				mHostTimeDiscontinuityCorrection; // If true, propagate timestamp discontinuities using host time.
 	};
-	
+
 	void GetState(State& outState) const { outState = mState; }
 	void SetState(State const& inState) { mState = inState; mFirstTime = false; }
-	
+
 private:
-	
+
 	struct State		mState;
 
-	bool				mFirstTime;	
-	
+	bool				mFirstTime;
+
 #if DEBUG
 public:
 	int					mVerbosity;
diff --git a/libs/appleutility/CoreAudio/PublicUtility/AUOutputBL.cpp b/libs/appleutility/CoreAudio/PublicUtility/AUOutputBL.cpp
index c2c8468..8a76b8b 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/AUOutputBL.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/AUOutputBL.cpp
@@ -2,14 +2,14 @@
      File: AUOutputBL.cpp
  Abstract: AUOutputBL.h
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #include "AUOutputBL.h"
 #if !defined(__COREAUDIO_USE_FLAT_INCLUDES__)
@@ -64,7 +64,7 @@ struct AudioBuffer
 };
 */
 
-AUOutputBL::AUOutputBL (const CAStreamBasicDescription &inDesc, UInt32 inDefaultNumFrames) 
+AUOutputBL::AUOutputBL (const CAStreamBasicDescription &inDesc, UInt32 inDefaultNumFrames)
 		: mFormat (inDesc),
 		  mBufferMemory(NULL),
 		  mBufferList (NULL),
@@ -85,10 +85,10 @@ AUOutputBL::~AUOutputBL()
 		delete [] (Byte *)mBufferList;
 }
 
-void 	AUOutputBL::Prepare (UInt32 inNumFrames, bool inWantNullBufferIfAllocated) 
+void 	AUOutputBL::Prepare (UInt32 inNumFrames, bool inWantNullBufferIfAllocated)
 {
 	UInt32 channelsPerBuffer = mFormat.IsInterleaved() ? mFormat.NumberChannels() : 1;
-	
+
 	if (mBufferMemory == NULL || inWantNullBufferIfAllocated)
 	{
 		mBufferList->mNumberBuffers = mNumberBuffers;
@@ -104,7 +104,7 @@ void 	AUOutputBL::Prepare (UInt32 inNumFrames, bool inWantNullBufferIfAllocated)
 		UInt32 nBytes = mFormat.FramesToBytes (inNumFrames);
 		if ((nBytes * mNumberBuffers) > AllocatedBytes())
 			throw OSStatus(kAudioUnitErr_TooManyFramesToProcess);
-			
+
 		mBufferList->mNumberBuffers = mNumberBuffers;
 		AudioBuffer *buf = &mBufferList->mBuffers[0];
 		Byte* p = mBufferMemory;
@@ -120,31 +120,31 @@ void 	AUOutputBL::Prepare (UInt32 inNumFrames, bool inWantNullBufferIfAllocated)
 
 void	AUOutputBL::Allocate (UInt32 inNumFrames)
 {
-	if (inNumFrames) 
+	if (inNumFrames)
 	{
 		UInt32 nBytes = mFormat.FramesToBytes (inNumFrames);
-		
-		if (nBytes <= AllocatedBytes()) 
+
+		if (nBytes <= AllocatedBytes())
 			return;
-		
+
 			// align successive buffers for Altivec and to take alternating
 			// cache line hits by spacing them by odd multiples of 16
 		if (mNumberBuffers > 1)
 			nBytes = (nBytes + (0x10 - (nBytes & 0xF))) | 0x10;
-		
+
 		mBufferSize = nBytes;
-		
+
 		UInt32 memorySize = mBufferSize * mNumberBuffers;
 		Byte *newMemory = new Byte[memorySize];
 		memset(newMemory, 0, memorySize);	// make buffer "hot"
-		
+
 		Byte *oldMemory = mBufferMemory;
 		mBufferMemory = newMemory;
 		delete[] oldMemory;
-		
+
 		mFrames = inNumFrames;
-	} 
-	else 
+	}
+	else
 	{
 		if (mBufferMemory) {
 			delete [] mBufferMemory;
diff --git a/libs/appleutility/CoreAudio/PublicUtility/AUOutputBL.h b/libs/appleutility/CoreAudio/PublicUtility/AUOutputBL.h
index 0baad3a..da30891 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/AUOutputBL.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/AUOutputBL.h
@@ -2,14 +2,14 @@
      File: AUOutputBL.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #ifndef __AUOutputBL_h__
 #define __AUOutputBL_h__
@@ -63,10 +63,10 @@
 
 class AUOutputBL {
 public:
-											
+
 											// you CANNOT use one of these - it will crash!
 //										AUOutputBL ();
-										
+
 											// this is the constructor that you use
 											// it can't be reset once you've constructed it
 										AUOutputBL (const CAStreamBasicDescription &inDesc, UInt32 inDefaultNumFrames = 512);
@@ -76,29 +76,29 @@ public:
 										{
 											Prepare (mFrames);
 										}
-									
+
 								// this version can throw if this is an allocted ABL and inNumFrames is > AllocatedFrames()
 								// you can set the bool to true if you want a NULL buffer list even if allocated
 								// inNumFrames must be a valid number (will throw if inNumFrames is 0)
 	void 								Prepare (UInt32 inNumFrames, bool inWantNullBufferIfAllocated = false);
-	
+
 	AudioBufferList*					ABL() { return mBufferList; }
-								
+
 								// You only need to call this if you want to allocate a buffer list
 								// if you want an empty buffer list, just call Prepare()
 								// if you want to dispose previously allocted memory, pass in 0
 								// then you either have an empty buffer list, or you can re-allocate
 								// Memory is kept around if an Allocation request is less than what is currently allocated
 	void								Allocate (UInt32 inNumberFrames);
-	
+
 	UInt32								AllocatedFrames() const { return mFrames; }
-	
+
 	const CAStreamBasicDescription&		GetFormat() const { return mFormat; }
 
 #if DEBUG
 	void								Print();
 #endif
-	
+
 private:
 	UInt32						AllocatedBytes () const { return (mBufferSize * mNumberBuffers); }
 
diff --git a/libs/appleutility/CoreAudio/PublicUtility/AUParamInfo.cpp b/libs/appleutility/CoreAudio/PublicUtility/AUParamInfo.cpp
index 87d7848..677fcb4 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/AUParamInfo.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/AUParamInfo.cpp
@@ -2,14 +2,14 @@
      File: AUParamInfo.cpp
  Abstract: AUParamInfo.h
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,15 +40,15 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #include "AUParamInfo.h"
 #include "CAXException.h"
 
-AUParamInfo::AUParamInfo (AudioUnit				inAU, 
-							bool				inIncludeExpert, 
+AUParamInfo::AUParamInfo (AudioUnit				inAU,
+							bool				inIncludeExpert,
 							bool				inIncludeReadOnly,
 							AudioUnitScope		inScope,
 							AudioUnitElement	inElement)
@@ -61,14 +61,14 @@ AUParamInfo::AUParamInfo (AudioUnit				inAU,
 	UInt32 size;
 	OSStatus result = AudioUnitGetPropertyInfo(mAU, kAudioUnitProperty_ParameterList, inScope, mElement, &size, NULL);
 		if (size == 0 || result) return;
-	
+
 	int nparams = size / sizeof(AudioUnitPropertyID);
 	mParamListID = new AudioUnitParameterID[nparams];
 
 	memset (mParamListID, 0xFF, size);
 
 	AudioUnitParameterID *paramList = new AudioUnitParameterID[nparams];
-	
+
 	result = AudioUnitGetProperty(mAU, kAudioUnitProperty_ParameterList, mScope, mElement, paramList, &size);
 	if (result) {
 		delete [] mParamListID;
@@ -76,33 +76,33 @@ AUParamInfo::AUParamInfo (AudioUnit				inAU,
 		mParamListID = NULL;
 		return;
 	}
-	
+
 	ParameterMap params;
-	for (int i = 0; i < nparams; ++i) 
+	for (int i = 0; i < nparams; ++i)
 	{
 		CAAUParameter auvp (mAU, paramList[i], mScope, mElement); // took out only using global scope in CAAUParameter creation
 		const AudioUnitParameterInfo &paramInfo = auvp.ParamInfo();
-			
+
 		//	don't include if parameter can't be read or written
-		if (!(paramInfo.flags & kAudioUnitParameterFlag_IsWritable) 
+		if (!(paramInfo.flags & kAudioUnitParameterFlag_IsWritable)
 			&& !(paramInfo.flags & kAudioUnitParameterFlag_IsReadable))
 			continue;
 
 		// only include if expert params wanted
 		if (!inIncludeExpert && auvp.IsExpert())
 			continue;
-		
+
 		// only include if read only params are wanted
-		if (!(paramInfo.flags & kAudioUnitParameterFlag_IsWritable) 
+		if (!(paramInfo.flags & kAudioUnitParameterFlag_IsWritable)
 			&& (paramInfo.flags & kAudioUnitParameterFlag_IsReadable))
-		{	
+		{
 			if (!inIncludeReadOnly)
 				continue;
 		}
-		
+
 		mParamListID[mNumParams] = paramList[i];
 		mNumParams++;
-		
+
 		// ok - if we're here, then we have a parameter we are going to display.
 		UInt32 clump = 0;
 		auvp.GetClumpID (clump);
@@ -118,9 +118,9 @@ AUParamInfo::~AUParamInfo()
 }
 
 UInt32			AUParamInfo::NumParamsForClump (UInt32 inClump) const
-{ 
+{
 	ParameterMap::const_iterator it = mParams.find(inClump);
-	if (it != mParams.end()) 
+	if (it != mParams.end())
 		return static_cast<UInt32>((*it).second.size());
 	return 0;
 }
diff --git a/libs/appleutility/CoreAudio/PublicUtility/AUParamInfo.h b/libs/appleutility/CoreAudio/PublicUtility/AUParamInfo.h
index d15fbfe..4d5b795 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/AUParamInfo.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/AUParamInfo.h
@@ -2,14 +2,14 @@
      File: AUParamInfo.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #include <map>
 #include <vector>
@@ -50,11 +50,11 @@
 #include "CAAUParameter.h"
 
 /*
-	The ParameterMap returned by the Map() method is a map where 
+	The ParameterMap returned by the Map() method is a map where
 		- the key is the clumpID
 		- the value is a ParameterList (vector<CAAUParameter>)
-		
-	If you have parameters on multiple scopes (or elements within a scope), then you should create one of these 
+
+	If you have parameters on multiple scopes (or elements within a scope), then you should create one of these
 	for each scope-element pair
 */
 
@@ -66,45 +66,45 @@ public:
 
 
 
-							AUParamInfo (AudioUnit		inAU, 
-									bool				inIncludeExpert, 
-									bool				inIncludeReadOnly, 
+							AUParamInfo (AudioUnit		inAU,
+									bool				inIncludeExpert,
+									bool				inIncludeReadOnly,
 									AudioUnitScope		inScope = kAudioUnitScope_Global,
 									AudioUnitElement	inElement = 0);
-									
+
 							~AUParamInfo();
-							
+
 	const ParameterMap&		Map () const { return mParams; }
-	
+
 	// some convenience methods
 	UInt32					NumParams () const { return mNumParams; }
-	
-	AudioUnitParameterID	ParamID (UInt32 inIndex) const 
-							{ 
-								if (inIndex < mNumParams) return mParamListID[inIndex]; 
-								return 0xFFFFFFFF; 
+
+	AudioUnitParameterID	ParamID (UInt32 inIndex) const
+							{
+								if (inIndex < mNumParams) return mParamListID[inIndex];
+								return 0xFFFFFFFF;
 							}
-							 
+
 	UInt32					NumClumps () const { return static_cast<UInt32>(mParams.size()); }
 
 	UInt32					NumParamsForClump (UInt32 inClump) const;
-	
+
 			// returns NULL if there's no info for the parameter
 	const CAAUParameter*	GetParamInfo (AudioUnitParameterID inParamID) const;
-	
+
 	AudioUnitScope			GetScope () const { return mScope; }
 	AudioUnitElement		GetElement () const { return mElement; }
-	
+
 private:
 
 	AudioUnit				mAU;
 	UInt32					mNumParams;
 	AudioUnitParameterID *	mParamListID;
-	
+
 	ParameterMap			mParams;
 	AudioUnitScope			mScope;
 	AudioUnitElement		mElement;
-		
+
 		// disallow
 	AUParamInfo () {}
 	AUParamInfo (const AUParamInfo &c) {}
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAAUMIDIMap.cpp b/libs/appleutility/CoreAudio/PublicUtility/CAAUMIDIMap.cpp
index 4e72b22..4f8bea6 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAAUMIDIMap.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAAUMIDIMap.cpp
@@ -2,14 +2,14 @@
      File: CAAUMIDIMap.cpp
  Abstract: CAAUMIDIMap.h
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,16 +40,16 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #include "CAAUMIDIMap.h"
 #include <pthread.h>
 
 struct AllMidiTransformers
 {
-	MIDILinearTransformer linearTrans; 
+	MIDILinearTransformer linearTrans;
 	MIDILogTransformer logTrans;
 	MIDIExpTransformer expTrans;
 	MIDISqrtTransformer sqrtTrans;
@@ -77,13 +77,13 @@ static void CheckInitAllMidiTransformers()
 MIDIValueTransformer *	CAAUMIDIMap::GetTransformer (UInt32 inFlags)
 {
 #if TARGET_OS_MAC
-	if (gAllMidiTransformers == NULL) 
+	if (gAllMidiTransformers == NULL)
 		CheckInitAllMidiTransformers();
 #else
-	if (gAllMidiTransformers == NULL) 
+	if (gAllMidiTransformers == NULL)
 		gAllMidiTransformers = new AllMidiTransformers();
 #endif
-	
+
 	if (AudioUnitDisplayTypeIsLogarithmic(inFlags))
 		return &gAllMidiTransformers->logTrans;
 	else if (AudioUnitDisplayTypeIsExponential(inFlags))
@@ -176,13 +176,13 @@ bool	CAAUMIDIMap::MIDI_Matches (UInt8 inChannel, UInt8 inData1, UInt8 inData2, F
 				}
 				return false;
 			}
-			//printf("this in midi matches %X with ", this); 
-			outLinear = inData2 / 127.; 
+			//printf("this in midi matches %X with ", this);
+			outLinear = inData2 / 127.;
 			return true;
 		}
 		return false;
 	}
-	
+
 		// this just matches on the patch change value itself...
 	if (IsPatchChange()) {
 		if (mData1 == inData1) {
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAAUMIDIMap.h b/libs/appleutility/CoreAudio/PublicUtility/CAAUMIDIMap.h
index a53fdf7..33d0c2e 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAAUMIDIMap.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAAUMIDIMap.h
@@ -2,14 +2,14 @@
      File: CAAUMIDIMap.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #ifndef __CAAUMIDIMap_h_
 #define __CAAUMIDIMap_h_
@@ -53,7 +53,7 @@
 /*
 enum {
 	kAUParameterMIDIMapping_AnyChannelFlag		= (1L << 0),
-		// If this flag is set and mStatus is a MIDI channel message, then the MIDI channel number 
+		// If this flag is set and mStatus is a MIDI channel message, then the MIDI channel number
 		// in the status byte is ignored; the mapping is from the specified MIDI message on ANY channel.
 
 	kAUParameterMIDIMapping_AnyNoteFlag			= (1L << 1),
@@ -68,7 +68,7 @@ enum {
 		// this is only useful for boolean typed parameters. When set, it means that the parameter's
 		// value should be toggled (if true, become false and vice versa) when the represented MIDI message
 		// is received
-	
+
 	kAUParameterMIDIMapping_Bipolar				= (1L << 4),
 		// this can be set to when mapping a MIDI Controller to indicate that the parameter (typically a boolean
 		// style parameter) will only have its value changed to either the on or off state of a MIDI controller message
@@ -118,41 +118,41 @@ Create a mapping between a parameter and a MIDI message through either:
 
 	* The AUParameterMIDIMapping Structure
 
-	Command				mStatus			mData1			
-	Note Off			0x8n			Note Num		
-	Note On				0x9n			Note Num		
-	Key Pressure		0xAn			Note Num		
-	Control Change		0xBn			ControllerID	
-	Patch Change		0xCn			Patch Num		
-	Channel Pressure	DxDn			0 (Unused)		
-	Pitch Bend			0xEn			0 (Unused)		
+	Command				mStatus			mData1
+	Note Off			0x8n			Note Num
+	Note On				0x9n			Note Num
+	Key Pressure		0xAn			Note Num
+	Control Change		0xBn			ControllerID
+	Patch Change		0xCn			Patch Num
+	Channel Pressure	DxDn			0 (Unused)
+	Pitch Bend			0xEn			0 (Unused)
 
 	(where n is 0-0xF to correspond to MIDI channels 1-16)
 
 		Details:
 
 	In general MIDI Commands can be mapped to either a specific channel as specified in the mStatus bit.
-	If the kAUParameterMIDIMapping_AnyChannelFlag bit is set mStatus is a MIDI channel message, then the 
+	If the kAUParameterMIDIMapping_AnyChannelFlag bit is set mStatus is a MIDI channel message, then the
 	MIDI channel number in the status byte is ignored; the mapping is from the specified MIDI message on ANY channel.
 
 	For note commands (note on, note off, key pressure), the MIDI message can trigger either with just a specific
 	note number, or any note number if the kAUParameterMIDIMapping_AnyNoteFlag bit is set. In these instances, the
-	note number is used as the trigger value (for instance, a note message could be used to set the 
+	note number is used as the trigger value (for instance, a note message could be used to set the
 											  cut off frequency of a filter).
 
- The Properties:								
+ The Properties:
 
 	kAudioUnitProperty_AllParameterMIDIMappings							array of AUParameterMIDIMapping (read/write)
 	This property is used to both retreive and set the current mapping state between (some/many/all of) its parameters
 	and MIDI messages. When set, it should replace any previous mapped settings the AU had.
 
 	If this property is implemented by a non-MIDI capable AU (such as an 'aufx' type), then the property is
-	read only, and recommends a suggested set of mappings for the host to perform. In this case, it is the 
+	read only, and recommends a suggested set of mappings for the host to perform. In this case, it is the
 	host's responsibility to map MIDI message to the AU parameters. As described previously, there are a set
-	of default mappings (see AudioToolbox/AUMIDIController.h) that the host can recommend to the user 
+	of default mappings (see AudioToolbox/AUMIDIController.h) that the host can recommend to the user
 	in this circumstance.
 
-	This property's size will be very dynamic, depending on the number of mappings currently in affect, so the 
+	This property's size will be very dynamic, depending on the number of mappings currently in affect, so the
 	caller should always get the size of the property first before retrieving it. The AU should return an error
 	if the caller doesn't provide enough space to return all of the current mappings.
 
@@ -169,19 +169,19 @@ Create a mapping between a parameter and a MIDI message through either:
 	(1) If a mapping struct is provided, then that struct provides *all* of the information that the AU should
 	use to map the parameter, *except* for the MIDI message. The AU should then listen for the next MIDI message
 	and associate that MIDI message with the supplied AUParameter mapping. When this MIDI message is received and
-	the mapping made, the AU should also issue a notification on this property 
+	the mapping made, the AU should also issue a notification on this property
 	(kAudioUnitProperty_HotMapParameterMIDIMapping) to indicate to the host that the mapping has been made. The host
 	can then retrieve the mapping that was made by getting the value of this property.
 
-	To avoid possible confusion, it is recommended that once the host has retrieved this mapping (if it is 
+	To avoid possible confusion, it is recommended that once the host has retrieved this mapping (if it is
 	presenting a UI to describe the mappings for example), that it then clears the mapping state as described next.
 
 	Thus, the only time this property will return a valid value is when the AU has made a mapping. If the AU's mapping
-	state has been cleared (or it has not been asked to make a mapping), then the AU should return 
+	state has been cleared (or it has not been asked to make a mapping), then the AU should return
 	kAudioUnitErr_InvalidPropertyValue if the host tries to read this value.
 
 	(2) If the value passed in is NULL, then if the AU had a parameter that it was in the process of mapping, it
-	should disregard that (stop listening to the MIDI messages to create a mapping) and discard the partially 
+	should disregard that (stop listening to the MIDI messages to create a mapping) and discard the partially
 	mapped struct. If the value is NULL and the AU is not in the process of mapping, the AU can ignore the request.
 
 	At all times, the _AllMappings property will completely describe the current known state of the AU's mappings
@@ -242,25 +242,25 @@ struct MIDICubeTransformer : public MIDIValueTransformer {
 
 
 class CAAUMIDIMap : public AUParameterMIDIMapping {
-	
+
 public:
-// variables for more efficient parsing of MIDI to Param value	
+// variables for more efficient parsing of MIDI to Param value
 	Float32						mMinValue;
 	Float32						mMaxValue;
 	MIDIValueTransformer		*mTransType;
 
-// methods	
+// methods
 	static MIDIValueTransformer *GetTransformer (UInt32 inFlags);
-	
+
 								CAAUMIDIMap() { memset(this, 0, sizeof(CAAUMIDIMap)); }
-								CAAUMIDIMap (const AUParameterMIDIMapping& inMap) 
+								CAAUMIDIMap (const AUParameterMIDIMapping& inMap)
 								{
 									memset(this, 0, sizeof(CAAUMIDIMap));
 									memcpy (this, &inMap, sizeof(inMap));
 								}
-								CAAUMIDIMap (AudioUnitScope inScope, AudioUnitElement inElement, AudioUnitParameterID inParam) 
-								{ 
-									memset(this, 0, sizeof(CAAUMIDIMap)); 
+								CAAUMIDIMap (AudioUnitScope inScope, AudioUnitElement inElement, AudioUnitParameterID inParam)
+								{
+									memset(this, 0, sizeof(CAAUMIDIMap));
 									mScope = inScope;
 									mElement = inElement;
 									mParameterID = inParam;
@@ -271,41 +271,41 @@ public:
 
 	// returns -1 if any channel bit is set
 	SInt32						Channel () const { return IsAnyChannel() ? -1 : (mStatus & 0xF); }
-	bool						IsAnyChannel () const { 
-									return mFlags & kAUParameterMIDIMapping_AnyChannelFlag; 
+	bool						IsAnyChannel () const {
+									return mFlags & kAUParameterMIDIMapping_AnyChannelFlag;
 								}
 									// preserves the existing channel info in the status byte
 									// preserves any previously set mFlags value
-	void						SetAnyChannel (bool inFlag) 
-								{ 
-									if (inFlag) 
-										mFlags |= kAUParameterMIDIMapping_AnyChannelFlag; 
+	void						SetAnyChannel (bool inFlag)
+								{
+									if (inFlag)
+										mFlags |= kAUParameterMIDIMapping_AnyChannelFlag;
 									else
 										mFlags &= ~kAUParameterMIDIMapping_AnyChannelFlag;
 								}
 
-	bool						IsAnyNote () const { 		
+	bool						IsAnyNote () const {
 									return (mFlags & kAUParameterMIDIMapping_AnyNoteFlag) != 0;
 								}
 									// preserves the existing key num in the mData1 byte
 									// preserves any previously set mFlags value
 	void						SetAnyNote (bool inFlag)
-								{ 
-									if (inFlag) 
-										mFlags |= kAUParameterMIDIMapping_AnyNoteFlag; 
+								{
+									if (inFlag)
+										mFlags |= kAUParameterMIDIMapping_AnyNoteFlag;
 									else
 										mFlags &= ~kAUParameterMIDIMapping_AnyNoteFlag;
 								}
-									
+
 	bool						IsToggle() const { return (mFlags & kAUParameterMIDIMapping_Toggle) != 0; }
 	void						SetToggle (bool inFlag)
 								{
-									if (inFlag) 
-										mFlags |= kAUParameterMIDIMapping_Toggle; 
+									if (inFlag)
+										mFlags |= kAUParameterMIDIMapping_Toggle;
 									else
 										mFlags &= ~kAUParameterMIDIMapping_Toggle;
 								}
-	
+
 	bool						IsBipolar() const { return (mFlags & kAUParameterMIDIMapping_Bipolar) != 0; }
 									// inUseOnValue is valid ONLY if inFlag is true
 	void						SetBipolar (bool inFlag, bool inUseOnValue = false)
@@ -326,56 +326,56 @@ public:
 	bool						IsSubRange () const { return (mFlags & kAUParameterMIDIMapping_SubRange) != 0; }
 	void						SetSubRange (Float32 inStartValue, Float32 inStopValue)
 								{
-									mFlags |= kAUParameterMIDIMapping_SubRange; 
-									
+									mFlags |= kAUParameterMIDIMapping_SubRange;
+
 									mSubRangeMin = inStartValue;
 									mSubRangeMax = inStopValue;
 								}
-	
+
 	void						SetParamRange(Float32 minValue, Float32 maxValue)
 								{
 									mMinValue = minValue;
-									mMaxValue = maxValue;		
+									mMaxValue = maxValue;
 								}
-									
+
 								// this will retain the subrange values previously set.
-	void						SetSubRange (bool inFlag) 
-								{ 
+	void						SetSubRange (bool inFlag)
+								{
 									if (inFlag)
-										mFlags |= kAUParameterMIDIMapping_SubRange; 
+										mFlags |= kAUParameterMIDIMapping_SubRange;
 									else
-										mFlags &= ~kAUParameterMIDIMapping_SubRange; 
+										mFlags &= ~kAUParameterMIDIMapping_SubRange;
 								}
-	
+
 	bool						IsAnyValue() const{return !IsBipolar();}
 	bool						IsOnValue() const{return IsBipolar_OnValue();}
 	bool						IsOffValue() const{return IsBipolar();}
-								
+
 	bool						IsNoteOff () const { return ((mStatus & 0xF0) == 0x80); }
 	bool						IsNoteOn () const { return ((mStatus & 0xF0) == 0x90); }
-	
+
 	bool						IsKeyPressure () const { return ((mStatus & 0xF0) == 0xA0); }
-	
+
 	bool						IsKeyEvent () const { return (mStatus > 0x7F) && (mStatus < 0xB0); }
-	
+
 	bool						IsPatchChange () const { return ((mStatus & 0xF0) == 0xC0); }
 	bool						IsChannelPressure () const { return ((mStatus & 0xF0) == 0xD0); }
 	bool						IsPitchBend () const { return ((mStatus & 0xF0) == 0xE0); }
 	bool						IsControlChange () const { return ((mStatus & 0xF0) == 0xB0); }
-	
-	
+
+
 	void						SetControllerOnValue(){SetBipolar(true,true);}
 	void						SetControllerOffValue(){SetBipolar(true,false);}
 	void						SetControllerAnyValue(){SetBipolar(false,false);}
-								
-	// All of these Set calls will reset the mFlags field based on the 
+
+	// All of these Set calls will reset the mFlags field based on the
 	// anyChannel param value
 	void						SetNoteOff (UInt8 key, SInt8 channel, bool anyChannel = false)
 								{
 									mStatus = 0x80 | (channel & 0xF);
 									mData1 = key;
 									mFlags = (anyChannel ? kAUParameterMIDIMapping_AnyChannelFlag : 0);
-									
+
 								}
 
 	void						SetNoteOn (UInt8 key, SInt8 channel, bool anyChannel = false)
@@ -398,7 +398,7 @@ public:
 									mData1 = controllerID;
 									mFlags = (anyChannel ? kAUParameterMIDIMapping_AnyChannelFlag : 0);
 								}
-	
+
 	void						SetPatchChange (UInt8 patchChange, SInt8 channel, bool anyChannel = false)
 								{
 									mStatus = 0xC0 | (channel & 0xF);
@@ -419,8 +419,8 @@ public:
 									mData1 = 0;
 									mFlags = (anyChannel ? kAUParameterMIDIMapping_AnyChannelFlag : 0);
 								}
-	
-	
+
+
 	Float32						ParamValueFromMIDILinear (Float32		inLinearValue) const
 	{
 								Float32 low, high;
@@ -432,32 +432,32 @@ public:
 									low = mMinValue;
 									high = mMaxValue;
 								}
-								
-								
+
+
 								// WE ARE ASSUMING YOU HAVE SET THIS UP PROPERLY!!!!! (or this will crash cause it will be NULL)
 								return (Float32)mTransType->fromlinear((inLinearValue * (high - low)) + low);
 	}
-		
+
 
 		// The CALLER of this method must ensure that the status byte's MIDI Command (ignoring the channel) matches!!!
 	bool						MIDI_Matches (UInt8 inChannel, UInt8 inData1, UInt8 inData2, Float32 &outLinear) const;
-	
+
 	void						Print () const;
-	
+
 	void						Save (CFPropertyListRef &outData) const;
 	void						Restore (CFDictionaryRef inData);
-	
-	static void					SaveAsMapPList (AudioUnit						inUnit, 
-											const AUParameterMIDIMapping		* inMappings, 
-											UInt32								inNumMappings, 
+
+	static void					SaveAsMapPList (AudioUnit						inUnit,
+											const AUParameterMIDIMapping		* inMappings,
+											UInt32								inNumMappings,
 											CFPropertyListRef					&outData,
 											CFStringRef							inName = NULL);
 
 									// inNumMappings describes how much memory is allocated in outMappings
-	static void					RestoreFromMapPList (const CFDictionaryRef			inData, 
-														AUParameterMIDIMapping		* outMappings, 
+	static void					RestoreFromMapPList (const CFDictionaryRef			inData,
+														AUParameterMIDIMapping		* outMappings,
 														UInt32						inNumMappings);
-														
+
 	static UInt32				NumberOfMaps (const CFDictionaryRef inData);
 };
 
@@ -472,15 +472,15 @@ inline bool operator== (const CAAUMIDIMap &a, const CAAUMIDIMap &b)
 			&&  (a.mParameterID == b.mParameterID)
 			&& (a.mElement == b.mElement)
 			&& (a.mScope == b.mScope));
-	
+
 	// reserved field comparisons - ignored until/if they are used
 }
 
 inline bool operator< (const CAAUMIDIMap	&a, const CAAUMIDIMap &b)
 {
-	if ((a.mStatus & 0xF0) != (b.mStatus & 0xF0)) 
+	if ((a.mStatus & 0xF0) != (b.mStatus & 0xF0))
 		return ((a.mStatus & 0xF0) < (b.mStatus & 0xF0));
-	
+
 	if (a.mData1 != b.mData1)
 		return (a.mData1 < b.mData1);
 
@@ -488,7 +488,7 @@ inline bool operator< (const CAAUMIDIMap	&a, const CAAUMIDIMap &b)
 		return ((a.mStatus & 0xF) < (b.mStatus & 0xf));
 
 // reserved field comparisons - ignored until/if they are used
-		
+
 //		we're sorting this by MIDI, so we don't really care how the rest is sorted
 	return	((a.mParameterID < b.mParameterID)
 				&& (a.mElement < b.mElement)
@@ -498,7 +498,7 @@ inline bool operator< (const CAAUMIDIMap	&a, const CAAUMIDIMap &b)
 
 
 class CompareMIDIMap {
-	int compare (const CAAUMIDIMap &a, const CAAUMIDIMap &b) 
+	int compare (const CAAUMIDIMap &a, const CAAUMIDIMap &b)
 	{
 		if ((a.mStatus & 0xF0) < (b.mStatus & 0xF0))
 			return -1;
@@ -512,7 +512,7 @@ class CompareMIDIMap {
 		if (a.mData1 < b.mData1) return -1;
 		return 0;
 	}
-					 
+
 public:
 	bool operator() (const CAAUMIDIMap &a, const CAAUMIDIMap &b) {
 		return compare (a, b) < 0;
@@ -533,7 +533,7 @@ public:
 			break;
 	// ...
 	}
-	
+
 	in the for loop you call the MIDI_Matches call, to see if the MIDI event matches a given AUMIDIParam mapping
 	special note: you HAVE to transform note on (with vel zero) events to the note off status byte
 */
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAAUMIDIMapManager.cpp b/libs/appleutility/CoreAudio/PublicUtility/CAAUMIDIMapManager.cpp
index b24ff99..7487229 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAAUMIDIMapManager.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAAUMIDIMapManager.cpp
@@ -2,14 +2,14 @@
      File: CAAUMIDIMapManager.cpp
  Abstract: CAAUMIDIMapManager.h
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,42 +40,42 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #include "CAAUMIDIMapManager.h"
 #include <AudioToolbox/AudioUnitUtilities.h>
 
 CAAUMIDIMapManager::CAAUMIDIMapManager()
-{	
-	hotMapping = false;	
+{
+	hotMapping = false;
 }
 
 static void FillInMap (CAAUMIDIMap &map, AUBase &That)
 {
 	AudioUnitParameterInfo info;
 	That.GetParameterInfo (map.mScope, map.mParameterID, info);
-	
+
 	if (map.IsSubRange()) {
 		map.mMinValue = map.mSubRangeMin;
 		map.mMaxValue = map.mSubRangeMax;
 	} else {
-		map.mMinValue = info.minValue;			
-		map.mMaxValue = info.maxValue;		
+		map.mMinValue = info.minValue;
+		map.mMaxValue = info.maxValue;
 	}
-	
+
 	map.mTransType = CAAUMIDIMap::GetTransformer(info.flags);
 }
 
 OSStatus	CAAUMIDIMapManager::SortedInsertToParamaterMaps	(AUParameterMIDIMapping *maps, UInt32 inNumMaps, AUBase &That)
-{	
-	for (unsigned int i = 0; i < inNumMaps; ++i) 
+{
+	for (unsigned int i = 0; i < inNumMaps; ++i)
 	{
 		CAAUMIDIMap map(maps[i]);
 
 		FillInMap (map, That);
-		
+
 		int idx = FindParameterIndex (maps[i]);
 		if (idx > -1)
 			mParameterMaps.erase(mParameterMaps.begin() + idx);
@@ -83,9 +83,9 @@ OSStatus	CAAUMIDIMapManager::SortedInsertToParamaterMaps	(AUParameterMIDIMapping
 			// least disruptive place to put this is at the end
 		mParameterMaps.push_back(map);
 	}
-	
-	std::sort(mParameterMaps.begin(), mParameterMaps.end(), CompareMIDIMap());	
-	
+
+	std::sort(mParameterMaps.begin(), mParameterMaps.end(), CompareMIDIMap());
+
 	return noErr;
 }
 
@@ -95,7 +95,7 @@ void CAAUMIDIMapManager::GetHotParameterMap(AUParameterMIDIMapping &outMap )
 }
 
 void CAAUMIDIMapManager::SortedRemoveFromParameterMaps(AUParameterMIDIMapping *maps, UInt32 inNumMaps, bool &outMapDidChange)
-{	
+{
 	if (hotMapping) {
 		hotMapping = false;
 	}
@@ -122,7 +122,7 @@ void	CAAUMIDIMapManager::ReplaceAllMaps (AUParameterMIDIMapping* inMappings, UIn
 		mParameterMaps.push_back (mapping);
 	}
 
-	std::sort(mParameterMaps.begin(),mParameterMaps.end(), CompareMIDIMap());	
+	std::sort(mParameterMaps.begin(),mParameterMaps.end(), CompareMIDIMap());
 }
 
 bool CAAUMIDIMapManager::HandleHotMapping(UInt8 	inStatus,
@@ -132,13 +132,13 @@ bool CAAUMIDIMapManager::HandleHotMapping(UInt8 	inStatus,
 { //used to set the hot map info
 
 	if (inStatus == 0xf0) return false;
-	
+
 	if (!hotMapping) return false;
 	hotMapping = false;
 
-	mHotMap.mStatus = inStatus | inChannel;  
-	mHotMap.mData1 = inData1; 
-		
+	mHotMap.mStatus = inStatus | inChannel;
+	mHotMap.mData1 = inData1;
+
 	SortedInsertToParamaterMaps (&mHotMap, 1, That);
 	return true;
 }
@@ -147,10 +147,10 @@ bool CAAUMIDIMapManager::HandleHotMapping(UInt8 	inStatus,
 
 void CAAUMIDIMapManager::Print()
 {
-	for ( ParameterMaps::iterator i = mParameterMaps.begin(); i < mParameterMaps.end(); ++i) { 
-		CAAUMIDIMap* listmap =  &(*i);		
-		listmap->Print();		
-	}		
+	for ( ParameterMaps::iterator i = mParameterMaps.begin(); i < mParameterMaps.end(); ++i) {
+		CAAUMIDIMap* listmap =  &(*i);
+		listmap->Print();
+	}
 }
 
 #endif // DEBUG
@@ -158,24 +158,24 @@ void CAAUMIDIMapManager::Print()
 void CAAUMIDIMapManager::GetMaps(AUParameterMIDIMapping* maps)
 {
 	int i = 0;
-	for ( ParameterMaps::iterator iter = mParameterMaps.begin(); iter < mParameterMaps.end(); ++iter, ++i) { 
-		AUParameterMIDIMapping &listmap =  (*iter);	
-		maps[i] = listmap;	
+	for ( ParameterMaps::iterator iter = mParameterMaps.begin(); iter < mParameterMaps.end(); ++iter, ++i) {
+		AUParameterMIDIMapping &listmap =  (*iter);
+		maps[i] = listmap;
 	}
 }
 
 int CAAUMIDIMapManager::FindParameterIndex (AUParameterMIDIMapping &inMap)
-{ 
+{
 	//used to get back hot mapping and one at a time maps, for ui
-	
+
 	int idx = 0;
-	for ( ParameterMaps::iterator i = mParameterMaps.begin(); i < mParameterMaps.end(); ++i) { 
+	for ( ParameterMaps::iterator i = mParameterMaps.begin(); i < mParameterMaps.end(); ++i) {
 		CAAUMIDIMap & listmap =  (*i);
-		if ( (listmap.mParameterID == inMap.mParameterID) && 
-			 (listmap.mScope == inMap.mScope) && 
+		if ( (listmap.mParameterID == inMap.mParameterID) &&
+			 (listmap.mScope == inMap.mScope) &&
 			 (listmap.mElement == inMap.mElement) )
-		{ 
-				return idx; 
+		{
+				return idx;
 		}
 		idx++;
 	}
@@ -193,37 +193,37 @@ bool CAAUMIDIMapManager::FindParameterMapEventMatch(	UInt8			inStatus,
 
 	if (inStatus == 0x90 && !inData2)
 		inStatus = 0x80 | inChannel;
-	
+
 	//used to test for midi matches once map is made
 	CAAUMIDIMap tempMap;
 	tempMap.mStatus = inStatus | inChannel;
 	tempMap.mData1 = inData1;
-	
+
 	CompareMIDIMap compareObj;
 
 	AudioUnitEvent event;
 	event.mEventType = kAudioUnitEvent_ParameterValueChange;
 	event.mArgument.mParameter.mAudioUnit = inAUBase.GetComponentInstance();
-	
-	ParameterMaps::iterator lower_iter = 
+
+	ParameterMaps::iterator lower_iter =
 	std::lower_bound(mParameterMaps.begin(), mParameterMaps.end(), tempMap, compareObj);
-	
-	while (lower_iter < mParameterMaps.end()) 
+
+	while (lower_iter < mParameterMaps.end())
 	{
 		CAAUMIDIMap & map = (*lower_iter);
-		if (compareObj.Finish(map, tempMap)) 
+		if (compareObj.Finish(map, tempMap))
 			break;
-		
+
 		Float32 value;
 		if (map.MIDI_Matches(inChannel, inData1, inData2, value))
-		{	
-			inAUBase.SetParameter ( map.mParameterID, map.mScope, map.mElement, 
+		{
+			inAUBase.SetParameter ( map.mParameterID, map.mScope, map.mElement,
 									map.ParamValueFromMIDILinear(value), inBufferOffset);
 
 			event.mArgument.mParameter.mParameterID = map.mParameterID;
 			event.mArgument.mParameter.mScope = map.mScope;
 			event.mArgument.mParameter.mElement = map.mElement;
-			
+
 			AUEventListenerNotify(NULL, NULL, &event);
 			ret_value = true;
 		}
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAAUMIDIMapManager.h b/libs/appleutility/CoreAudio/PublicUtility/CAAUMIDIMapManager.h
index 8926d8f..856c8fc 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAAUMIDIMapManager.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAAUMIDIMapManager.h
@@ -2,14 +2,14 @@
      File: CAAUMIDIMapManager.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #ifndef __CAAUMIDIMapManager_h_
 #define __CAAUMIDIMapManager_h_
@@ -53,46 +53,46 @@
 #include <AudioToolbox/AudioUnitUtilities.h>
 
 class CAAUMIDIMapManager {
-		
+
 protected:
-	
+
 	typedef std::vector<CAAUMIDIMap>	ParameterMaps;
 	ParameterMaps						mParameterMaps;
-	
+
 	bool								hotMapping;
 	AUParameterMIDIMapping				mHotMap;
-	
+
 public:
-					
+
 							CAAUMIDIMapManager();
-	
+
 	UInt32					NumMaps(){return static_cast<UInt32>(mParameterMaps.size());}
 	void					GetMaps(AUParameterMIDIMapping* maps);
-	
+
 	int						FindParameterIndex(AUParameterMIDIMapping &map);
-	
+
 	void					GetHotParameterMap(AUParameterMIDIMapping &outMap);
-		
+
 	void					SortedRemoveFromParameterMaps	(AUParameterMIDIMapping *maps, UInt32 inNumMaps, bool &outMapDidChange);
 	OSStatus				SortedInsertToParamaterMaps	(AUParameterMIDIMapping *maps, UInt32 inNumMaps, AUBase &That);
-	
+
 	void					ReplaceAllMaps (AUParameterMIDIMapping* inMappings, UInt32 inNumMaps, AUBase &That);
-	
+
 	bool					IsHotMapping(){return hotMapping;}
 	void					SetHotMapping (AUParameterMIDIMapping &inMap){hotMapping = true; mHotMap = inMap; }
-	
+
 	bool					HandleHotMapping(	UInt8 	inStatus,
 												UInt8 	inChannel,
 												UInt8 	inData1,
 												AUBase	&That);
-	
-		
+
+
 	bool					FindParameterMapEventMatch(UInt8 	inStatus,
 													   UInt8 	inChannel,
 													   UInt8 	inData1,
 													   UInt8 	inData2,
 													   UInt32	inBufferOffset,
-													   AUBase&	inAUBase);	
+													   AUBase&	inAUBase);
 #if DEBUG
 	void					Print();
 #endif
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAAUParameter.cpp b/libs/appleutility/CoreAudio/PublicUtility/CAAUParameter.cpp
index 2d8fe18..bd8b784 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAAUParameter.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAAUParameter.cpp
@@ -2,14 +2,14 @@
      File: CAAUParameter.cpp
  Abstract: CAAUParameter.h
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,13 +40,13 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #include "CAAUParameter.h"
 
-CAAUParameter::CAAUParameter() 
+CAAUParameter::CAAUParameter()
 {
 	memset(this, 0, sizeof(CAAUParameter));
 }
@@ -63,7 +63,7 @@ CAAUParameter::CAAUParameter (AudioUnitParameter &inParam)
 	Init (inParam.mAudioUnit, inParam.mParameterID, inParam.mScope, inParam.mElement);
 }
 
-CAAUParameter::CAAUParameter(const CAAUParameter &a) 
+CAAUParameter::CAAUParameter(const CAAUParameter &a)
 {
 	memset(this, 0, sizeof(CAAUParameter));
 	*this = a;
@@ -74,13 +74,13 @@ CAAUParameter &	CAAUParameter::operator = (const CAAUParameter &a)
 	if (mParamName) CFRelease(mParamName);
 	if (mParamTag) CFRelease(mParamTag);
 	if (mNamedParams) CFRelease(mNamedParams);
-	
+
 	memcpy(this, &a, sizeof(CAAUParameter));
 
 	if (mParamName) CFRetain(mParamName);
 	if (mParamTag) CFRetain(mParamTag);
 	if (mNamedParams) CFRetain(mNamedParams);
-	
+
 	return *this;
 }
 
@@ -97,7 +97,7 @@ void		CAAUParameter::Init (AudioUnit au, AudioUnitParameterID param, AudioUnitSc
 	mParameterID = param;
 	mScope = scope;
 	mElement = element;
-	
+
 	UInt32 propertySize = sizeof(mParamInfo);
 	OSStatus err = AudioUnitGetProperty(au, kAudioUnitProperty_ParameterInfo,
 			scope, param, &mParamInfo, &propertySize);
@@ -105,11 +105,11 @@ void		CAAUParameter::Init (AudioUnit au, AudioUnitParameterID param, AudioUnitSc
 		memset(&mParamInfo, 0, sizeof(mParamInfo));
 	if (mParamInfo.flags & kAudioUnitParameterFlag_HasCFNameString) {
 		mParamName = mParamInfo.cfNameString;
-		if (!(mParamInfo.flags & kAudioUnitParameterFlag_CFNameRelease)) 
+		if (!(mParamInfo.flags & kAudioUnitParameterFlag_CFNameRelease))
 			CFRetain (mParamName);
 	} else
 		mParamName = CFStringCreateWithCString(NULL, mParamInfo.name, kCFStringEncodingUTF8);
-	
+
 	const char* str = 0;
 	switch (mParamInfo.unit)
 	{
@@ -177,11 +177,11 @@ void		CAAUParameter::Init (AudioUnit au, AudioUnitParameterID param, AudioUnitSc
 		case kAudioUnitParameterUnit_Indexed:
 			{
 				propertySize = sizeof(mNamedParams);
-				err = AudioUnitGetProperty (au, 
+				err = AudioUnitGetProperty (au,
 									kAudioUnitProperty_ParameterValueStrings,
-									scope, 
-									param, 
-									&mNamedParams, 
+									scope,
+									param,
+									&mNamedParams,
 									&propertySize);
 				if (!err && mNamedParams) {
 					mNumIndexedParams = CFArrayGetCount(mNamedParams);
@@ -208,7 +208,7 @@ void		CAAUParameter::Init (AudioUnit au, AudioUnitParameterID param, AudioUnitSc
 			str = NULL;
 			break;
 	}
-	
+
 	if (str)
 		mParamTag = CFStringCreateWithCString(NULL, str, kCFStringEncodingUTF8);
 	else
@@ -219,7 +219,7 @@ void		CAAUParameter::Init (AudioUnit au, AudioUnitParameterID param, AudioUnitSc
 Float32		CAAUParameter::GetValue() const
 {
 	Float32 value = 0.;
-	//OSStatus err = 
+	//OSStatus err =
 	AudioUnitGetParameter(mAudioUnit, mParameterID, mScope, mElement, &value);
 	return value;
 }
@@ -227,7 +227,7 @@ Float32		CAAUParameter::GetValue() const
 CFStringRef CreateLocalizedStringForParameterValue ( double					inParameterValue,
 													 const CAAUParameter *	inParameter,
 													 UInt32					inDigits,
-													 UInt32					minDigits) {	
+													 UInt32					minDigits) {
 	if (!inParameter) return nil;
 
 	AudioUnitParameterInfo info = inParameter->ParamInfo();
@@ -252,30 +252,30 @@ CFStringRef CreateLocalizedStringForParameterValue ( double					inParameterValue
 	//	2		100-999			0
 	//	3		1000-9990		-1
 	//	4		10000-99900		-2
-	
+
 	int nDigitsAfterDecimal = inDigits - (pow10 + 1);
 	if (nDigitsAfterDecimal < 0)
 		nDigitsAfterDecimal = 0;	// the least number of digits possible is zero
 
 	if (info.flags & kAudioUnitParameterFlag_IsHighResolution)
 		nDigitsAfterDecimal = 4;
-	
-	CFLocaleRef currentLocale = CFLocaleCopyCurrent(); 
+
+	CFLocaleRef currentLocale = CFLocaleCopyCurrent();
 	CFNumberFormatterRef numberFormatter = CFNumberFormatterCreate (NULL, currentLocale, kCFNumberFormatterDecimalStyle);
-	
+
 	CFNumberRef maxFractionDigits = CFNumberCreate (NULL, kCFNumberIntType, &nDigitsAfterDecimal);
-	
+
 	if (nDigitsAfterDecimal > 0)
 		nDigitsAfterDecimal = minDigits;
-		
-	CFNumberRef minFractionDigits = CFNumberCreate (NULL, kCFNumberIntType, &nDigitsAfterDecimal); 
 
-	CFNumberFormatterSetProperty (numberFormatter, kCFNumberFormatterMinFractionDigits, minFractionDigits); 
-	CFNumberFormatterSetProperty (numberFormatter, kCFNumberFormatterMaxFractionDigits, maxFractionDigits); 
-	CFStringRef formattedNumberString = CFNumberFormatterCreateStringWithValue (NULL, numberFormatter, kCFNumberDoubleType, &inParameterValue); 
+	CFNumberRef minFractionDigits = CFNumberCreate (NULL, kCFNumberIntType, &nDigitsAfterDecimal);
 
-	CFRelease(currentLocale); 
-	CFRelease(numberFormatter); 
+	CFNumberFormatterSetProperty (numberFormatter, kCFNumberFormatterMinFractionDigits, minFractionDigits);
+	CFNumberFormatterSetProperty (numberFormatter, kCFNumberFormatterMaxFractionDigits, maxFractionDigits);
+	CFStringRef formattedNumberString = CFNumberFormatterCreateStringWithValue (NULL, numberFormatter, kCFNumberDoubleType, &inParameterValue);
+
+	CFRelease(currentLocale);
+	CFRelease(numberFormatter);
 	CFRelease(maxFractionDigits);
 	CFRelease(minFractionDigits);
 
@@ -284,20 +284,20 @@ CFStringRef CreateLocalizedStringForParameterValue ( double					inParameterValue
 
 CFStringRef CreateLocalizedStringForParameterValue ( double					inParameterValue,
 													 const CAAUParameter *	inParameter,
-													 UInt32					inDigits) {	
+													 UInt32					inDigits) {
 	return CreateLocalizedStringForParameterValue (inParameterValue, inParameter, inDigits, 1);
 }
 
 double ValueForLocalizedParameterString (CFStringRef string, const CAAUParameter * inParameter) {
-	CFLocaleRef currentLocale = CFLocaleCopyCurrent(); 
+	CFLocaleRef currentLocale = CFLocaleCopyCurrent();
 	CFNumberFormatterRef numberFormatter = CFNumberFormatterCreate (NULL, currentLocale, kCFNumberFormatterDecimalStyle);
 
 	double value = 0;
 	Boolean worked = CFNumberFormatterGetValueFromString (numberFormatter, string, NULL, kCFNumberDoubleType, &value);
-	
+
 	CFRelease(currentLocale);
 	CFRelease(numberFormatter);
-	
+
 	if (worked)
 		return value;
 	else {
@@ -318,25 +318,25 @@ CFStringRef CAAUParameter::GetStringFromValueCopy(const Float32 *value) const
 			return str;
 		}
 	}
-	else if (ValuesHaveStrings()) 
+	else if (ValuesHaveStrings())
 	{
 		AudioUnitParameterStringFromValue stringValue;
 		stringValue.inParamID = mParameterID;
 		stringValue.inValue = value;
 		stringValue.outString = NULL;
 		UInt32 propertySize = sizeof(stringValue);
-		
-		OSStatus err = AudioUnitGetProperty (mAudioUnit, 
+
+		OSStatus err = AudioUnitGetProperty (mAudioUnit,
 											kAudioUnitProperty_ParameterStringFromValue,
-											mScope, 
-											0, 
-											&stringValue, 
+											mScope,
+											0,
+											&stringValue,
 											&propertySize);
-		
+
 		if (!err && stringValue.outString != NULL)
 			return stringValue.outString;
 	}
-	
+
 	Float32 val = (value == NULL ? GetValue() : *value);
 	AudioUnitParameterUnit unit = this->ParamInfo().unit;
 	if (unit ==  kAudioUnitParameterUnit_Cents || unit == kAudioUnitParameterUnit_AbsoluteCents)
@@ -347,29 +347,29 @@ CFStringRef CAAUParameter::GetStringFromValueCopy(const Float32 *value) const
 
 Float32 CAAUParameter::GetValueFromString(CFStringRef str) const
 {
-	if (ValuesHaveStrings()) 
+	if (ValuesHaveStrings())
 	{
 		AudioUnitParameterValueFromString valueString;
 		valueString.inParamID = mParameterID;
 		valueString.inString = str;
 		UInt32 propertySize = sizeof(valueString);
-		
-		OSStatus err = AudioUnitGetProperty (mAudioUnit, 
+
+		OSStatus err = AudioUnitGetProperty (mAudioUnit,
 										kAudioUnitProperty_ParameterValueFromString,
-										mScope, 
-										0, 
-										&valueString, 
+										mScope,
+										0,
+										&valueString,
 										&propertySize);
-										
+
 		if (!err) {
 			return valueString.outValue;
 		}
 	}
-	
+
 	return (Float32) ValueForLocalizedParameterString(str, this);
 }
 
-void		CAAUParameter::SetValue(	AUParameterListenerRef		inListener, 
+void		CAAUParameter::SetValue(	AUParameterListenerRef		inListener,
 									void *							inObject,
 									Float32							inValue) const
 {
@@ -379,7 +379,7 @@ void		CAAUParameter::SetValue(	AUParameterListenerRef		inListener,
         valueToSet = mParamInfo.maxValue;
     if (valueToSet < mParamInfo.minValue)
         valueToSet = mParamInfo.minValue;
-    
+
 	AUParameterSet(inListener, inObject, this, valueToSet, 0);
 }
 
@@ -388,12 +388,12 @@ void	CAAUParameter::Print() const
 {
 	UInt32 clump = 0;
 	GetClumpID (clump);
-	
+
 	UInt32 len = static_cast<UInt32>(CFStringGetLength(mParamName));
 	char* chars = (char*)malloc (len * 2); // give us plenty of room for unichar chars
 	if (!CFStringGetCString (mParamName, chars, len * 2, kCFStringEncodingUTF8))
 		chars[0] = 0;
-	
+
 	printf ("ID: %ld, Clump: %u, Name: %s\n", (long unsigned int) mParameterID, (unsigned int) clump, chars);
 	free (chars);
 }
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAAUParameter.h b/libs/appleutility/CoreAudio/PublicUtility/CAAUParameter.h
index f8b5733..42402ed 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAAUParameter.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAAUParameter.h
@@ -2,14 +2,14 @@
      File: CAAUParameter.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #ifndef __CAAUParameter_h__
 #define __CAAUParameter_h__
@@ -65,107 +65,107 @@ public:
 								CAAUParameter(const CAAUParameter &a);
 								/*! @dtor ~CAAUParameter */
 								~CAAUParameter();
-		
+
 	/*! @method operator <@ */
-	bool						operator < (const CAAUParameter &a) const 
-								{ 
-									return memcmp(this, &a, sizeof(AudioUnitParameter)) < 0; 
+	bool						operator < (const CAAUParameter &a) const
+								{
+									return memcmp(this, &a, sizeof(AudioUnitParameter)) < 0;
 								}
 
 	/*! @method operator ==@ */
-	bool						operator == (const CAAUParameter &a) const 
-								{ 
-									return !memcmp(this, &a, sizeof(AudioUnitParameter)); 
+	bool						operator == (const CAAUParameter &a) const
+								{
+									return !memcmp(this, &a, sizeof(AudioUnitParameter));
 								}
-	
+
 	/*! @method operator =@ */
 	CAAUParameter &				operator = (const CAAUParameter &a);
-	
+
 	/*! @method GetValue */
 	Float32						GetValue() const;
 	/*! @method SetValue */
-	void						SetValue(	AUParameterListenerRef			inListener, 
+	void						SetValue(	AUParameterListenerRef			inListener,
 											void *							inObject,
 											Float32							inValue) const;
-	
+
 	/*! @method GetName */
-	CFStringRef					GetName() const { return mParamName; }  
+	CFStringRef					GetName() const { return mParamName; }
 										// borrowed reference!
 
 	/*! @method GetStringFromValueCopy */
-	CFStringRef					GetStringFromValueCopy(const Float32 *value = NULL) const;	
+	CFStringRef					GetStringFromValueCopy(const Float32 *value = NULL) const;
 										// returns a copy of the name of the current parameter value
 										// or null if there is no name associated
 										// caller must release
 	/*! @method ValuesHaveStrings */
-	bool						ValuesHaveStrings () const 
-								{ 
-									return (mParamInfo.flags & kAudioUnitParameterFlag_ValuesHaveStrings) != 0; 
+	bool						ValuesHaveStrings () const
+								{
+									return (mParamInfo.flags & kAudioUnitParameterFlag_ValuesHaveStrings) != 0;
 								}
-	
+
 	/*! @method GetValueFromString */
-	Float32						GetValueFromString (CFStringRef str) const;					
+	Float32						GetValueFromString (CFStringRef str) const;
 									// caller must release
 
 	/*! @method ParamInfo */
-	const AudioUnitParameterInfo &		
+	const AudioUnitParameterInfo &
 								ParamInfo()	const { return mParamInfo; }
 
 	/*! @method GetParamTag */
 	CFStringRef					GetParamTag() const	{ return mParamTag; }
-									// this may return null! - 
+									// this may return null! -
 									// in which case there is no descriptive tag for the parameter
 
 	/*! @method GetParamName */
 	CFStringRef					GetParamName (int inIndex) const
 									// this can return null if there is no name for the parameter
-								{ 
-									return (mNamedParams && inIndex < mNumIndexedParams) 
+								{
+									return (mNamedParams && inIndex < mNumIndexedParams)
 												? (CFStringRef) CFArrayGetValueAtIndex(mNamedParams, inIndex)
-												: 0; 
+												: 0;
 								}
-	
+
 	/*! @method GetNumIndexedParams */
 	int							GetNumIndexedParams () const { return mNumIndexedParams; }
-	
+
 	/*! @method IsIndexedParam */
 	bool						IsIndexedParam () const { return mNumIndexedParams != 0; }
-	
+
 	/*! @method HasNamedParams */
 	bool						HasNamedParams () const { return IsIndexedParam() && mNamedParams; }
-	
+
 	/*! @method GetClumpID */
-	bool						GetClumpID (UInt32 &outClumpID) const 
-								{ 
+	bool						GetClumpID (UInt32 &outClumpID) const
+								{
 									if (mParamInfo.flags & kAudioUnitParameterFlag_HasClump) {
 										outClumpID = mParamInfo.clumpID;
 										return true;
 									}
 									return false;
 								}
-								
+
 	/*! @method HasDisplayTransformation */
-	bool						HasDisplayTransformation () const 
-								{ 
-									return GetAudioUnitParameterDisplayType (mParamInfo.flags); 
+	bool						HasDisplayTransformation () const
+								{
+									return GetAudioUnitParameterDisplayType (mParamInfo.flags);
 								}
 
 	/*! @method IsExpert */
-	bool						IsExpert () const 
-								{ 
-									return mParamInfo.flags & kAudioUnitParameterFlag_ExpertMode; 
+	bool						IsExpert () const
+								{
+									return mParamInfo.flags & kAudioUnitParameterFlag_ExpertMode;
 								}
 #if DEBUG
 	void						Print () const;
 #endif
-	
+
 		// these methods are defined in CAPersistence.cpp
 		// they will persist and restore only the scope, element and param ID's of the AudioUnitParameter
 		// however, this is sufficient to be able to save/restore a CAAUParameter object
 	void						Save (CFPropertyListRef &outData) const;
-	
+
 	static void					Save (const AudioUnitParameter &inParam, CFPropertyListRef &outData);
-	
+
 	static OSStatus				Restore	(const CFPropertyListRef inData, AudioUnitParameter &outParam);
 
 protected:
@@ -180,7 +180,7 @@ protected:
 	short						mNumIndexedParams;
 	/*! @var mNamedParams */
 	CFArrayRef					mNamedParams;
-	
+
 private:
 	void						Init (AudioUnit au, AudioUnitParameterID param, AudioUnitScope scope, AudioUnitElement element);
 
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAAUProcessor.cpp b/libs/appleutility/CoreAudio/PublicUtility/CAAUProcessor.cpp
index 1cda39c..9aaba46 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAAUProcessor.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAAUProcessor.cpp
@@ -2,14 +2,14 @@
      File: CAAUProcessor.cpp
  Abstract: CAAUProcessor.h
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,24 +40,24 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
-#include "CAAUProcessor.h"						
+#include "CAAUProcessor.h"
 #include "CAXException.h"
 
-static OSStatus SilenceInputCallback (void 		*inRefCon, 
-					AudioUnitRenderActionFlags *ioActionFlags, 
-					const AudioTimeStamp 		*inTimeStamp, 
-					UInt32 						inBusNumber, 
-					UInt32 						inNumberFrames, 
+static OSStatus SilenceInputCallback (void 		*inRefCon,
+					AudioUnitRenderActionFlags *ioActionFlags,
+					const AudioTimeStamp 		*inTimeStamp,
+					UInt32 						inBusNumber,
+					UInt32 						inNumberFrames,
 					AudioBufferList 			*ioData)
 {
 	AudioBuffer *buf = ioData->mBuffers;
 	for (UInt32 i = ioData->mNumberBuffers; i--; ++buf)
 		memset((Byte *)buf->mData, 0, buf->mDataByteSize);
-		
+
 		//provide a hint that our input data is silent.
 	*ioActionFlags &= kAudioUnitRenderAction_OutputIsSilence;
 	return noErr;
@@ -84,19 +84,19 @@ CAAUProcessor::~CAAUProcessor ()
 
 inline OSStatus		SetInputCallback (CAAudioUnit &inUnit, AURenderCallbackStruct &inInputCallback)
 {
-	return inUnit.SetProperty (kAudioUnitProperty_SetRenderCallback, 
-											kAudioUnitScope_Input, 
+	return inUnit.SetProperty (kAudioUnitProperty_SetRenderCallback,
+											kAudioUnitScope_Input,
 											0,
-											&inInputCallback, 
+											&inInputCallback,
 											sizeof(inInputCallback));
 }
 
 static AURenderCallbackStruct sRenderCallback;
-static OSStatus PrerollRenderProc (	void 						* /*inRefCon*/, 
+static OSStatus PrerollRenderProc (	void 						* /*inRefCon*/,
 								AudioUnitRenderActionFlags		* /*inActionFlags*/,
-								const AudioTimeStamp 			* /*inTimeStamp*/, 
+								const AudioTimeStamp 			* /*inTimeStamp*/,
 								UInt32 							/*inBusNumber*/,
-								UInt32							/*inNumFrames*/, 
+								UInt32							/*inNumFrames*/,
 								AudioBufferList 				*ioData)
 {
 	AudioBuffer *buf = ioData->mBuffers;
@@ -111,18 +111,18 @@ OSStatus 	Preroll (CAAudioUnit & inAU, UInt32 inFrameSize)
 	CAStreamBasicDescription desc;
 	OSStatus result = inAU.GetFormat (kAudioUnitScope_Input, 0, desc);
 	bool hasInput = false;
-			//we have input	
-	if (result == noErr) 
+			//we have input
+	if (result == noErr)
 	{
 		sRenderCallback.inputProc = PrerollRenderProc;
 		sRenderCallback.inputProcRefCon = 0;
-		
-		result = inAU.SetProperty (kAudioUnitProperty_SetRenderCallback, kAudioUnitScope_Input, 
+
+		result = inAU.SetProperty (kAudioUnitProperty_SetRenderCallback, kAudioUnitScope_Input,
 								0, &sRenderCallback, sizeof(sRenderCallback));
 		if (result) return result;
 		hasInput = true;
 	}
-	
+
 	AudioUnitRenderActionFlags flags = 0;
 	AudioTimeStamp time;
 	memset (&time, 0, sizeof(time));
@@ -133,7 +133,7 @@ OSStatus 	Preroll (CAAudioUnit & inAU, UInt32 inFrameSize)
 	{
 		AUOutputBL list (outputFormat, inFrameSize);
 		list.Prepare ();
-		
+
 		result = inAU.Render (&flags, &time, 0, inFrameSize, list.ABL());
 		if (result) { printf("A result %d\n", (int)result); goto home; }
 	}
@@ -143,8 +143,8 @@ home:
             // remove our installed callback
 		sRenderCallback.inputProc = 0;
 		sRenderCallback.inputProcRefCon = 0;
-		
-		inAU.SetProperty (kAudioUnitProperty_SetRenderCallback, kAudioUnitScope_Input, 
+
+		inAU.SetProperty (kAudioUnitProperty_SetRenderCallback, kAudioUnitScope_Input,
 								0, &sRenderCallback, sizeof(sRenderCallback));
 	}
 	return result;
@@ -163,10 +163,10 @@ OSStatus		CAAUProcessor::EstablishInputCallback (AURenderCallbackStruct &inInput
 
 OSStatus		CAAUProcessor::SetAUPreset (CFPropertyListRef 			inPreset)
 {
-	return mUnit.SetProperty (kAudioUnitProperty_ClassInfo, 
-									kAudioUnitScope_Global, 
-									0, 
-									&inPreset, 
+	return mUnit.SetProperty (kAudioUnitProperty_ClassInfo,
+									kAudioUnitScope_Global,
+									0,
+									&inPreset,
 									sizeof(inPreset));
 }
 
@@ -215,12 +215,12 @@ OSStatus		CAAUProcessor::Reinitialize (UInt32 inNewMaxFrames)
 {
 	OSStatus result;
 	CAStreamBasicDescription inputDesc, outputDesc;
-	
+
 	ca_require_noerr (result = mUnit.GetFormat (kAudioUnitScope_Input, 0, inputDesc), home);
 	ca_require_noerr (result = mUnit.GetFormat (kAudioUnitScope_Output, 0, outputDesc), home);
-	
+
 	ca_require_noerr (result = DoInitialisation (inputDesc, outputDesc, mNumInputSamples, inNewMaxFrames), home);
-	
+
 home:
 	return result;
 }
@@ -232,23 +232,23 @@ OSStatus		CAAUProcessor::DoInitialisation (const CAStreamBasicDescription 	&inIn
 												UInt32 								inMaxFrames)
 {
 	OSStatus result;
-	
+
 	if (inNumInputSamples == 0 && IsOfflineAU())
 		return kAudioUnitErr_InvalidOfflineRender;
-		
+
 	mNumInputSamples = inNumInputSamples;
-	
+
 		// first check that we can do this number of channels
 	if (mUnit.CanDo (inInputFormat.NumberChannels(), inOutputFormat.NumberChannels()) == false)
 		ca_require_noerr (result = kAudioUnitErr_FailedInitialization, home);
-	
+
 	// just uninitialise the AU as a matter of course
 	ca_require_noerr (result = mUnit.Uninitialize(), home);
 
-	ca_require_noerr (result = mUnit.SetFormat (kAudioUnitScope_Input, 0, inInputFormat), home); 
-	ca_require_noerr (result = mUnit.SetFormat (kAudioUnitScope_Output, 0, inOutputFormat), home); 
+	ca_require_noerr (result = mUnit.SetFormat (kAudioUnitScope_Input, 0, inInputFormat), home);
+	ca_require_noerr (result = mUnit.SetFormat (kAudioUnitScope_Output, 0, inOutputFormat), home);
 	ca_require_noerr (result = SetMaxFramesPerRender (inMaxFrames), home);
-	
+
 #if !TARGET_OS_IPHONE
 		// if we're any AU but an offline AU, we should tell it that we've processing offline
 	if (!IsOfflineAU()) {
@@ -263,11 +263,11 @@ OSStatus		CAAUProcessor::DoInitialisation (const CAStreamBasicDescription 	&inIn
 												&mNumInputSamples, sizeof(mNumInputSamples));
 	}
 #endif
-	
+
 	ca_require_noerr (result = mUnit.Initialize(), home);
 
 	ca_require_noerr (result = SetInputCallback (mUnit, mUserCallback), home);
-	
+
 	// finally reset our time stamp
 	// the time stamp we use with the AU Render - only sample count is valid
 	memset (&mRenderTimeStamp, 0, sizeof(mRenderTimeStamp));
@@ -281,11 +281,11 @@ OSStatus		CAAUProcessor::DoInitialisation (const CAStreamBasicDescription 	&inIn
 		delete mPreflightABL;
 		mPreflightABL = NULL;
 	}
-	
+
 	mPreflightABL = new AUOutputBL (inOutputFormat);
 
 	mLastPercentReported = 0;
-	
+
 home:
 	return result;
 }
@@ -297,27 +297,27 @@ void		CAAUProcessor::CalculateRemainderSamples (Float64 inSampleRate)
 	mTailSamples = 0;
 	mTailSamplesRemaining = 0;
 	return;
-	
+
 		// nothing to do because we're not processing offline
 	if (IsOfflineContext() == false) return;
-		
+
 		// because an offline unit has some indeterminancy about what it does with the input samples
 		// it is *required* to deal internally with both latency and tail
-	if (!IsOfflineAU()) 
+	if (!IsOfflineAU())
 	{
 			// when offline we need to deal with both latency and tail
-			
+
 		// if the AU has latency - how many samples at the start will be zero?
 		// we'll end up chucking these away.
 		Float64 renderTimeProps;
 		UInt32 propSize = sizeof (renderTimeProps);
 		OSStatus result = mUnit.GetProperty (kAudioUnitProperty_Latency, kAudioUnitScope_Global, 0,
 													&renderTimeProps, &propSize);
-		
+
 		Float64 latencySamples = 0;
 		if (result == noErr) // we have latency to deal with - its reported in seconds
 			latencySamples = renderTimeProps * inSampleRate;
-			
+
 			// AU tail
 			// if the AU has a tail - we'll pull that many zeroes through at the end to flush
 			// out this tail - think of a decaying digital delay or reverb...
@@ -328,7 +328,7 @@ void		CAAUProcessor::CalculateRemainderSamples (Float64 inSampleRate)
 		Float64 tailSamples = 0;
 		if (result == noErr)
 			tailSamples = renderTimeProps * inSampleRate;
-		
+
 		// this dictates how many samples at the end we need to pull through...
 		// we add latency to tail because we throw the latency samples away from the start of the rendering
 		// and we have to pull that many samples after the end of course to get the last of the original data
@@ -342,7 +342,7 @@ void		CAAUProcessor::CalculateRemainderSamples (Float64 inSampleRate)
 #if !TARGET_OS_IPHONE
 CFStringRef		CAAUProcessor::GetOLPreflightName () const
 {
-	if (OfflineAUNeedsPreflight()) 
+	if (OfflineAUNeedsPreflight())
 	{
 		CFStringRef str;
 		UInt32 size = sizeof(str);
@@ -389,8 +389,8 @@ OSStatus	CAAUProcessor::Preflight (bool inProcessPreceedingTail)
 	UInt32 numFrames = MaxFramesPerRender();
 	if (numFrames == 0)
 		return kAudioUnitErr_InvalidProperty;
-	
-	if (!IsOfflineAU()) 
+
+	if (!IsOfflineAU())
 	{
 		if ((IsOfflineContext() == false && inProcessPreceedingTail) || IsOfflineContext())
 		{
@@ -399,22 +399,22 @@ OSStatus	CAAUProcessor::Preflight (bool inProcessPreceedingTail)
 
 			// Consume the number of input samples indicated by the AU's latency or tail
 			// based on whether the AU is being used in an offline context or not.
-			
-			UInt32 latSamps = IsOfflineContext() ? mLatencySamples : mTailSamples;	
+
+			UInt32 latSamps = IsOfflineContext() ? mLatencySamples : mTailSamples;
 			printf("latSamps %d\n", (int)latSamps);
 			latSamps = 0;
 			while (latSamps > 0)
 			{
 				if (latSamps < numFrames)
 					numFrames = latSamps;
-					
+
 					// process the samples (the unit's input callback will read the samples
 					// from the file and convert them to float for processing
 				AudioUnitRenderActionFlags renderFlags = 0;
 				mPreflightABL->Prepare();
 				result = mUnit.Render (&renderFlags, &mRenderTimeStamp, 0, numFrames, mPreflightABL->ABL());
 				if (result) { printf("B result %d\n", (int)result); goto home; }
-		
+
 				mRenderTimeStamp.mSampleTime += numFrames;
 				latSamps -= numFrames;
 			}
@@ -425,10 +425,10 @@ OSStatus	CAAUProcessor::Preflight (bool inProcessPreceedingTail)
 		{
 			// processing real-time but not processing preceeding tail, so we should preroll the AU
 			ca_require_noerr (result = Preroll(mUnit, numFrames), home);
-			
+
 			// re-establish the user's input callback
 			ca_require_noerr (result = SetInputCallback (mUnit, mUserCallback), home);
-			
+
 			mRenderTimeStamp.mSampleTime = 0;
 		}
 	}
@@ -437,25 +437,25 @@ OSStatus	CAAUProcessor::Preflight (bool inProcessPreceedingTail)
 	{
 			// re-establish the user's input callback
 		ca_require_noerr (result = SetInputCallback (mUnit, mUserCallback), home);
-		
+
 		UInt32 preflightRequirements;
 		UInt32 size; size = sizeof(preflightRequirements);
 		ca_require_noerr (result = mUnit.GetProperty (kAudioUnitOfflineProperty_PreflightRequirements,
 												kAudioUnitScope_Global, 0,
 												&preflightRequirements, &size), home);
-												
+
 			// 0 indicates none, otherwise optional or required -> we do it for either
-		if (preflightRequirements) 
+		if (preflightRequirements)
 		{
 			for (;;) {
-				// here we need to do the preflight loop - we don't expect any data back, but have to 
+				// here we need to do the preflight loop - we don't expect any data back, but have to
 				// give the offline unit all of its input data to allow it to prepare its processing
 				AudioUnitRenderActionFlags renderFlags = kAudioOfflineUnitRenderAction_Preflight;
 				mPreflightABL->Prepare();
 				result = mUnit.Render (&renderFlags, &mRenderTimeStamp, 0, numFrames, mPreflightABL->ABL());
 				if (result) { printf("C result %d\n", (int)result); goto home; }
 				mRenderTimeStamp.mSampleTime += numFrames;
-		
+
 				if (renderFlags & kAudioOfflineUnitRenderAction_Complete)
 					break;
 			}
@@ -468,7 +468,7 @@ OSStatus	CAAUProcessor::Preflight (bool inProcessPreceedingTail)
 	if (result == noErr) {
 		mPreflightDone = true;
 	}
-	
+
 home:
 	printf("<<<<CAAUProcessor::Preflight\n");
 	return result;
@@ -488,16 +488,16 @@ OSStatus 	CAAUProcessor::OfflineAUPreflight (UInt32 inNumFrames, bool &outIsDone
 	ca_require_noerr (result = mUnit.GetProperty (kAudioUnitOfflineProperty_PreflightRequirements,
 												kAudioUnitScope_Global, 0,
 												&preflightRequirements, &size), home);
-												
+
 		// 0 indicates none, otherwise optional or required -> we do it for either
-	if (preflightRequirements) 
+	if (preflightRequirements)
 	{
 		AudioUnitRenderActionFlags renderFlags = kAudioOfflineUnitRenderAction_Preflight;
 		mPreflightABL->Prepare();
 		result = mUnit.Render (&renderFlags, &mRenderTimeStamp, 0, inNumFrames, mPreflightABL->ABL());
 		if (result) { printf("D result %d\n", (int)result); goto home; }
 		mRenderTimeStamp.mSampleTime += inNumFrames;
-		
+
 		if (renderFlags & kAudioOfflineUnitRenderAction_Complete) {
 			outIsDone = true;
 			mRenderTimeStamp.mSampleTime = 0;
@@ -512,7 +512,7 @@ OSStatus 	CAAUProcessor::OfflineAUPreflight (UInt32 inNumFrames, bool &outIsDone
 		mPreflightDone = true;
 		mLastPercentReported = 0;
 	}
-	
+
 home:
 	return result;
 }
@@ -527,33 +527,33 @@ void SetBufferListToNumFrames (AudioBufferList &list, UInt32 inNumFrames)
 	}
 }
 
-OSStatus	CAAUProcessor::Render (AudioBufferList 		*ioData, 
-									UInt32 				&ioNumFrames, 
+OSStatus	CAAUProcessor::Render (AudioBufferList 		*ioData,
+									UInt32 				&ioNumFrames,
 									bool				&outIsSilence,
-									bool 				*outOLCompleted, 
+									bool 				*outOLCompleted,
 									bool 				*outOLRequiresPostProcess)
 {
 	if (IsOfflineContext())
 	{
 		if (!mPreflightDone)
 			return kAudioUnitErr_InvalidOfflineRender;
-	
+
 			// YES - this is correct!!! you have to provide both if rendering in an offline Context
 		*outOLCompleted = false;
 		*outOLRequiresPostProcess = false;
 
-		if (!IsOfflineAU() && !mUnit.Comp().Desc().IsFConv()) 
+		if (!IsOfflineAU() && !mUnit.Comp().Desc().IsFConv())
 		{
 				// have we processed the input we expect too?
 				// in an offline case, we want to create output that matches the input
 				// for an OfflineAU type, it manages this internally, so we don't have to do anything
 				// for a FormatConverter AU, we don't know and can't tell, so we can't do anything here
-				// for any other AU type (effect, instrument) the Prime assumption is that it will 
+				// for any other AU type (effect, instrument) the Prime assumption is that it will
 				// ask for the same number of frames of input as it is asked to output
 				// so we can ask what it is doing, and get a sample accurate output (which is input + tail time)
-			if (mRenderTimeStamp.mSampleTime + ioNumFrames >= InputSampleCount()) 
+			if (mRenderTimeStamp.mSampleTime + ioNumFrames >= InputSampleCount())
 			{
-					// if we fall into here, we have just a partial number of input samples left 
+					// if we fall into here, we have just a partial number of input samples left
 					// (less input less than what we've been asked to produce output for.
 				*outOLCompleted = true;
 					// we require post processing if we've got some tail (or latency) samples to flush through
@@ -579,8 +579,8 @@ OSStatus	CAAUProcessor::Render (AudioBufferList 		*ioData,
 		OSStatus result = mUnit.Render (&renderFlags, &mRenderTimeStamp, 0, ioNumFrames, ioData);
 		if (result) { printf("E result %d\n", (int)result); }
 		if (result) {
-			if (mUnit.Comp().Desc().IsFConv()) { 
-				// this is the only way we can tell we're done with a FormatConverter AU 
+			if (mUnit.Comp().Desc().IsFConv()) {
+				// this is the only way we can tell we're done with a FormatConverter AU
 				// - ie. client returns an error from input
 				result = noErr;
 				*outOLCompleted = true;
@@ -600,7 +600,7 @@ OSStatus	CAAUProcessor::Render (AudioBufferList 		*ioData,
 //	}
 		mRenderTimeStamp.mSampleTime += ioNumFrames;
 		outIsSilence = (renderFlags & kAudioUnitRenderAction_OutputIsSilence);
-		
+
 			// if we're an Offline AU type, it will set this flag on completion of its processing
 		if (renderFlags & kAudioOfflineUnitRenderAction_Complete) {
 			// we now need to calculate how many frames we rendered.
@@ -617,7 +617,7 @@ OSStatus	CAAUProcessor::Render (AudioBufferList 		*ioData,
 					mUnit.GlobalReset (); //flush this out, as we're done with this phase
 			}
 		}
-	
+
 		return result;
 	}
 
@@ -637,20 +637,20 @@ OSStatus	CAAUProcessor::Render (AudioBufferList 		*ioData,
 //		u.f = ((float*)(ioData->mBuffers[0].mData))[i];
 //		printf("aup out %4d  %14.10f  %02X %02X %02X %02X\n", (int)i, u.f, u.c[0], u.c[1], u.c[2], u.c[3]);
 //	}
-	
-	return result;	
+
+	return result;
 }
-	
-OSStatus	CAAUProcessor::PostProcess (AudioBufferList 	*ioData, 
-										UInt32 				&ioNumFrames, 
+
+OSStatus	CAAUProcessor::PostProcess (AudioBufferList 	*ioData,
+										UInt32 				&ioNumFrames,
 										bool				&outIsSilence,
 										bool 				&outDone)
 {
-	if (IsOfflineAU() || !IsOfflineContext()) 
+	if (IsOfflineAU() || !IsOfflineContext())
 		return kAudioUnitErr_CannotDoInCurrentContext;
-	
+
 	outDone = false;
-	
+
 		// we've got less samples to process than we've been asked to process
 	if (mTailSamplesRemaining <= SInt32(ioNumFrames)) {
 		outDone = true;
@@ -659,7 +659,7 @@ OSStatus	CAAUProcessor::PostProcess (AudioBufferList 	*ioData,
 		if (ioNumFrames == 0)
 			return noErr;
 	}
-	
+
 	AudioUnitRenderActionFlags renderFlags = 0;
 	OSStatus result;
 	result = mUnit.Render (&renderFlags, &mRenderTimeStamp, 0, ioNumFrames, ioData);
@@ -667,14 +667,14 @@ OSStatus	CAAUProcessor::PostProcess (AudioBufferList 	*ioData,
 	mRenderTimeStamp.mSampleTime += ioNumFrames;
 	mTailSamplesRemaining -= ioNumFrames;
 	outIsSilence = (renderFlags & kAudioUnitRenderAction_OutputIsSilence);
-			
+
 	if (outDone) {
 		ca_require_noerr (result = SetInputCallback (mUnit, mUserCallback), home);
 		mUnit.GlobalReset (); //flush this out, as we're done with this phase
 	}
 home:
 	return result;
-}		
+}
 
 #if !TARGET_OS_IPHONE
 Float32		CAAUProcessor::GetOLPercentComplete ()
@@ -683,22 +683,22 @@ Float32		CAAUProcessor::GetOLPercentComplete ()
 		return 0;
 
 	Float32 percentDone = mLastPercentReported;
-		
-	if (IsOfflineAU()) 
+
+	if (IsOfflineAU())
 	{
 		// we get the output size every time, as this can change as parameters are changed
 		UInt64 numOutputSamples = mNumInputSamples;
 		UInt32 propSize = sizeof(numOutputSamples);
 		mUnit.GetProperty (kAudioUnitOfflineProperty_OutputSize,
 							kAudioUnitScope_Global, 0, &numOutputSamples, &propSize);
-		
+
 		percentDone = (mRenderTimeStamp.mSampleTime / Float64(numOutputSamples)) * 100.;
 	}
 	else
 	{
 		percentDone = (mRenderTimeStamp.mSampleTime / Float64(mNumInputSamples + mTailSamples)) * 100.;
 	}
-	
+
 	if (percentDone > mLastPercentReported)
 		mLastPercentReported = percentDone;
 
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAAUProcessor.h b/libs/appleutility/CoreAudio/PublicUtility/CAAUProcessor.h
index f0fb345..c8c02be 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAAUProcessor.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAAUProcessor.h
@@ -2,14 +2,14 @@
      File: CAAUProcessor.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #ifndef __CAAUProcessor_h__
 #define __CAAUProcessor_h__
@@ -60,76 +60,76 @@
 	It can be used in a RealTime context (rendering data with RT constraints) or in an OffLine context
 	such as using an AU to process data that is stored in a file, and on which there are no
 	RT constraints to be imposed.
-	
+
 	Order of operations:
 	Create an instance
 	Establish an Input Callback
 	Initialize the AU to the audio formats and whether it is going to process in an offline or RT context
 	Preflight
-	
+
 	while (...)
 		Render  // based on your calling context
-	
+
 	PostProcess if needed (only in OL case)
-	
+
 	After any initialization, preflighting is required.
-	
+
 	Parameter Values on the AU should be set just before each call to Render. The sampleFrameOffsets
 	supplied when setting those values are an offset into that next render buffer's numFrames.
-	
+
 	RT vs OT is determined by whether the inputSampleCount is set during Initialization, thus
 	this class can move the AU between RT and OL contexts. If you are using an AU of type 'auol'
 	(Offline), then it cannot be used in a RT context.
 
 	The CAAUProcessor will only call your Input Callback for input when it needs valid input.
 	This input callback will contain a sample time that indicates where within your input
-	you should read data from, where after preflighting, the first output data produces is for 
+	you should read data from, where after preflighting, the first output data produces is for
 	the output sample count of zero.
-	
+
 	MaxFrames should be set before initialisation (or is also passed in to the Reinitialize API)
-		
+
 	If RT, then PostProcessing will *never* be required, nor will Render ever return an isDone value
 	If OL, then Render will at some point return isDone==true, and then also indicate if PostProcessing is required
-	
+
 	If using a Format Converter AU in offline context, then the only way for it to determine that you've finished
 	is for the Input callback to return an error. This means ultimately, that you'll have potentially longer output
-	than you should have. The only way to manage this is for the caller to know the relationship between 
+	than you should have. The only way to manage this is for the caller to know the relationship between
 	input to output samples that will be required, and to call Render for just that amount of output samples
 	then return an error, so the tail and latency can be processed.
-	
+
 	Tail and Latency are *only* calculated at initialisation.. Some AU's may change these properties based on
 	either different presets or parameter settings... Ideally, this class should listen to those properties
 	and recalculate its values based on those changes.
-*/	
-	
+*/
+
 class CAAUProcessor {
 public:
 									// by default this is set to process offline
 							CAAUProcessor (const CAComponent& inComp);
 							~CAAUProcessor ();
-		
+
 	CAAudioUnit&			AU() { return mUnit; }
 	const CAAudioUnit&		AU() const { return mUnit; }
-		
-#pragma mark __Setup APIs			
+
+#pragma mark __Setup APIs
 	bool					IsOfflineContext () const { return mNumInputSamples != 0; }
-								
-								// this contains the callback and client data that the AU 
+
+								// this contains the callback and client data that the AU
 								// uses to call when it needs input
 	OSStatus				EstablishInputCallback (AURenderCallbackStruct &inInputCallback);
-	
+
 	OSStatus				SetAUPreset (CFPropertyListRef 			inPreset);
 	OSStatus				SetAUPresetIndex (SInt32				inPresetIndex);
-	
+
 	OSStatus				SetParameter (AudioUnitParameterID inID, AudioUnitScope scope, AudioUnitElement element,
 											Float32 value, UInt32 bufferOffsetFrames = 0);
-	
+
 		// a result of zero here signifies an error
 	UInt32					MaxFramesPerRender () const;
-		
+
 		// this call can return an error if the AU is initialized - see Reinitialize
 	OSStatus				SetMaxFramesPerRender (UInt32 inMaxFrames);
-		
+
 	// Prepares the AU for processing at the specified format
 	// only doing n-n channel processing here.. could extend this for n-m channel processing easily enough
 	// if you are processing using an Offline AU, you HAVE to specify the numInputSamples to process
@@ -138,15 +138,15 @@ public:
 							{
 								return Initialize (inIODesc, inIODesc, inNumInputSamples);
 							}
-	OSStatus				Initialize (const CAStreamBasicDescription 		&inInputDesc, 
-										const CAStreamBasicDescription 		&inOutputDesc, 
+	OSStatus				Initialize (const CAStreamBasicDescription 		&inInputDesc,
+										const CAStreamBasicDescription 		&inOutputDesc,
 										UInt64 								inNumInputSamples = 0);
-	
+
 		// takes the existing format state of the AU, but resets the AUProcessor so that:
 		// applies an optional new number of max frames
 		// the AUProcessor will have to be Preflighted again after this call
 		// Use this when you want to keep the same formats, same input sample count,
-		// but want to re-initialize the AU to use a new num max frames and prepare it 
+		// but want to re-initialize the AU to use a new num max frames and prepare it
 		// appropriately...
 	OSStatus				Reinitialize (UInt32 inNewMaxFrames);
 
@@ -155,18 +155,18 @@ public:
 #pragma mark __Render APIs
 	// Preflighting - you HAVE to preflight
 	// returns noErr when preflighting is done
-	
+
 	// Offline Context:
 	// Offline AU's require preflighting, even if they will end up doing no work.
-	// In the case where the AU is offline the latency samples are trimmed and not returned 
+	// In the case where the AU is offline the latency samples are trimmed and not returned
 	// from the consequent Render calls
-	
-	// If you are NOT an offline AU then the first time Render is called, 
+
+	// If you are NOT an offline AU then the first time Render is called,
 	// there will need to be some consumption of the input before you will get any valid output data.
 	// This is determined by the value of the AU's reported latency. So, in this case preflight
 	// will consume those initial samples and then return.
 	// Your InputCallback MUST provide the initial data that is to be processed.
-	
+
 	// RealTime Context:
 	// (1 No priming. In this case inProcessPreceedingTail is false (the default) and no
 	// processing is done on the AU. However, because preflight is the first time that Rendering
@@ -185,12 +185,12 @@ public:
 	// and you'll need to read up to the numSamples of tail time of the preceeding data.
 	// It discards the output results of the preflighting. If you don't have any previous data
 	// with which to prepare the AU, then you do NOT need to take this path and can do the step below.
-	
+
 	// In both of these cases the inital latency frames are *not* trimmed from
 	// the output that will be generated by a consequent call to render.
 	OSStatus				Preflight (bool inProcessPreceedingTail = false);
 
-	// this can be used with an OfflineAU to do a gradual preflight (so you could for instance, 
+	// this can be used with an OfflineAU to do a gradual preflight (so you could for instance,
 	// present a progress indicator. The Preflight call will do it all at once.
 	// If you break out of the preflight before you are done, then you HAVE to reinitialise the AU
 	// before you can either do another preflight or do a render, otherwise the Render call will produce
@@ -199,45 +199,45 @@ public:
 
 	// Here's the major stage that produces output.
 	// You pass in two bool flags and an ioNumFrames....
-	
+
 	// So ioNumFrames will be *untouched* if outOLCompleted == false
 	// if outOLCompleted is true, ioNumFrames contains the number of valid frames within the ioData data that are valid data
 	// (ioData's pointers and sizes will also have been resized to match these number of frames)
-	// outOLRequiresPostProcess should also be checked when outOLCompleted is true, 
+	// outOLRequiresPostProcess should also be checked when outOLCompleted is true,
 	// to see if any post-processing is required
 	// if rendering in a RT context, then neither outOLCompleted or outOLRequiresPostProcess is required
 	// if rendering in an OL context, both must be specified.
 	// Caller MUST provide an ABL that is set up in the previously specified output format
-	
+
 	// If you receive kAudioUnitErr_InvalidOfflineRender when dealing with an OfflineAU Type, then you have either not
 	// preflighted it (and the AU requires it) or you have changed some state (its num input samples, its start offest)
 	// and it needs to be re-preflighted. In that case, preflight the AU again first.
-	OSStatus				Render (AudioBufferList 			*ioData, 
-									UInt32 						&ioNumFrames, 
+	OSStatus				Render (AudioBufferList 			*ioData,
+									UInt32 						&ioNumFrames,
 									bool						&outIsSilence,
-									bool 						*outOLCompleted = NULL, 
+									bool 						*outOLCompleted = NULL,
 									bool 						*outOLRequiresPostProcess = NULL);
-	
+
 	// call this method if outOLRequiresPostProcess returned true upon rendering completion
 	OSStatus				PostProcess (AudioBufferList *ioData, UInt32 &ioNumFrames, bool &outIsSilence, bool &outDone);
-	
+
 	// This method returns how many input samples will need to be provided before
 	// valid output data is produced.
 	UInt32					LatencySampleCount () const { return mLatencySamples; }
-	
+
 	UInt32					TailSampleCount () const { return mTailSamples; }
-	
+
 	UInt64					InputSampleCount () const { return mNumInputSamples; }
-		
+
 	// the class maintains the TimeStamp from render call to render call
 	// this value is the sample count that will be used in the *next* render call
 	Float64					SampleTime () const { return mRenderTimeStamp.mSampleTime; }
-	
+
 		// in some settings (for instance a delay with 100% feedback) tail time is essentially infinite
 		// so you should safeguard the final OL render stage (post process) which is aimed at pulling the tail through
 		// default is 10 seconds
 	Float64					GetMaxTailTime () const { return mMaxTailTime; }
-	
+
 	// this ONLY takes affect when you initialise the processor, it doesn't change that AU's tail time,
 	// but just the max amount of time that this object will allow the AU to post-process data
 	// set this to 0, to use the AU's tail time with no adjustment
@@ -247,20 +247,20 @@ public:
 	// if this is NULL, then there is no explicit (optional or required) preflight requirement of the AU
 	// if this is valid, then the AU either requires or optionally requires preflighting. The default
 	// behaviour in this case is that the processor will preflight. This name can be used to preset
-	// to the user. If the AU doesn't present a name, but preflighting is optional/required, then the 
+	// to the user. If the AU doesn't present a name, but preflighting is optional/required, then the
 	// processor return "Preflight" as its string.
 	// the String should be released by the caller.
 	CFStringRef				GetOLPreflightName () const;
 
-	// Returns true if this is processor is an offline AU, and that AU (whether optional or required) 
+	// Returns true if this is processor is an offline AU, and that AU (whether optional or required)
 	// needs preflighting
 	bool					OfflineAUNeedsPreflight () const;
-	
+
 	// this provides a rough approximation of the progress of an Offline Processing operation (both for the
 	// preflight and the render phases)
 	Float32					GetOLPercentComplete ();
 #endif
-	
+
 private:
 	CAAudioUnit 			mUnit;
 	UInt32					mLatencySamples;
@@ -274,11 +274,11 @@ private:
 	AURenderCallbackStruct	mUserCallback;
 	Float64					mMaxTailTime;
 	Float32					mLastPercentReported;
-	
+
 	bool			IsOfflineAU () const { return mUnit.Comp().Desc().IsOffline(); }
 
 	void			CalculateRemainderSamples (Float64 inSampleRate);
-	
+
 	OSStatus		DoInitialisation (const CAStreamBasicDescription 	&inInputFormat,
 									const CAStreamBasicDescription 		&inOutputFormat,
 									UInt64								inNumInputSamples,
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAAtomic.h b/libs/appleutility/CoreAudio/PublicUtility/CAAtomic.h
index c9a611b..ae3efd7 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAAtomic.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAAtomic.h
@@ -2,14 +2,14 @@
      File: CAAtomic.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,17 +40,17 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 /*
 	This file implements all Atomic operations using Interlocked functions specified in
 	Winbase.h
 NOTE: According to Microsoft documentation, all Interlocked functions generates a
-full barrier. 
+full barrier.
 	On Windows:
-	As the Interlocked functions returns the Old value, Extra checks and operations 
+	As the Interlocked functions returns the Old value, Extra checks and operations
 	are made after the atomic operation to return value consistent with OSX counterparts.
 */
 #ifndef __CAAtomic_h__
@@ -66,7 +66,7 @@ full barrier.
 	#include <libkern/OSAtomic.h>
 #endif
 
-inline void CAMemoryBarrier() 
+inline void CAMemoryBarrier()
 {
 #if TARGET_OS_WIN32
 	MemoryBarrier();
@@ -80,7 +80,7 @@ inline SInt32 CAAtomicAdd32Barrier(SInt32 theAmt, volatile SInt32* theValue)
 #if TARGET_OS_WIN32
 	long lRetVal = InterlockedExchangeAdd((volatile long*)theValue, theAmt);
 	// InterlockedExchangeAdd returns the original value which differs from OSX version. 
-	// At this point the addition would have occured and hence returning the new value
+	// At this point the addition would have occurred and hence returning the new value
 	// to keep it sync with OSX.
 	return lRetVal + theAmt;
 #else
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAAtomicStack.h b/libs/appleutility/CoreAudio/PublicUtility/CAAtomicStack.h
index 8d40fc5..6277865 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAAtomicStack.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAAtomicStack.h
@@ -2,14 +2,14 @@
      File: CAAtomicStack.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #ifndef __CAAtomicStack_h__
 #define __CAAtomicStack_h__
@@ -63,14 +63,14 @@ template <class T>
 class TAtomicStack {
 public:
 	TAtomicStack() : mHead(NULL) { }
-	
+
 	// non-atomic routines, for use when initializing/deinitializing, operate NON-atomically
 	void	push_NA(T *item)
 	{
 		item->next() = mHead;
 		mHead = item;
 	}
-	
+
 	T *		pop_NA()
 	{
 		T *result = mHead;
@@ -78,11 +78,11 @@ public:
 			mHead = result->next();
 		return result;
 	}
-	
+
 	bool	empty() const { return mHead == NULL; }
-	
+
 	T *		head() { return mHead; }
-	
+
 	// atomic routines
 	void	push_atomic(T *item)
 	{
@@ -92,7 +92,7 @@ public:
 			item->next() = head_;
 		} while (!compare_and_swap(head_, item, &mHead));
 	}
-	
+
 	void	push_multiple_atomic(T *item)
 		// pushes entire linked list headed by item
 	{
@@ -107,7 +107,7 @@ public:
 			tail->next() = head_;
 		} while (!compare_and_swap(head_, item, &mHead));
 	}
-	
+
 	T *		pop_atomic_single_reader()
 		// this may only be used when only one thread may potentially pop from the stack.
 		// if multiple threads may pop, this suffers from the ABA problem.
@@ -120,7 +120,7 @@ public:
 		} while (!compare_and_swap(result, result->next(), &mHead));
 		return result;
 	}
-	
+
 	T *		pop_atomic()
 		// This is inefficient for large linked lists.
 		// prefer pop_all() to a series of calls to pop_atomic.
@@ -135,7 +135,7 @@ public:
 		}
 		return result;
 	}
-	
+
 	T *		pop_all()
 	{
 		T *result;
@@ -145,7 +145,7 @@ public:
 		} while (!compare_and_swap(result, NULL, &mHead));
 		return result;
 	}
-	
+
 	T*		pop_all_reversed()
 	{
 		TAtomicStack<T> reversed;
@@ -157,7 +157,7 @@ public:
 		}
 		return reversed.mHead;
 	}
-	
+
 	static bool	compare_and_swap(T *oldvalue, T *newvalue, T **pvalue)
 	{
 #if TARGET_OS_MAC
@@ -173,7 +173,7 @@ public:
 			return CAAtomicCompareAndSwap32Barrier(SInt32(oldvalue), SInt32(newvalue), (SInt32*)pvalue);
 #endif
 	}
-	
+
 protected:
 	T *		mHead;
 };
@@ -194,7 +194,7 @@ public:
 	void *	pop_atomic() { return OSAtomicDequeue(&mHead, mNextPtrOffset); }
 	void *	pop_atomic_single_reader() { return pop_atomic(); }
 	void *	pop_NA() { return pop_atomic(); }
-	
+
 private:
 	OSQueueHead		mHead;
 	size_t			mNextPtrOffset;
@@ -221,10 +221,10 @@ public:
 	T *		pop_atomic() { return (T *)OSAtomicDequeue(&mHead, mNextPtrOffset); }
 	T *		pop_atomic_single_reader() { return pop_atomic(); }
 	T *		pop_NA() { return pop_atomic(); }
-	
+
 	// caution: do not try to implement pop_all_reversed here. the writer could add new elements
 	// while the reader is trying to pop old ones!
-	
+
 private:
 	OSQueueHead		mHead;
 	ssize_t			mNextPtrOffset;
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAAudioBufferList.cpp b/libs/appleutility/CoreAudio/PublicUtility/CAAudioBufferList.cpp
index d3644ed..3e73459 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAAudioBufferList.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAAudioBufferList.cpp
@@ -2,14 +2,14 @@
      File: CAAudioBufferList.cpp
  Abstract: CAAudioBufferList.h
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 //=============================================================================
 //	Includes
@@ -84,12 +84,12 @@ UInt32	CAAudioBufferList::CalculateByteSize(UInt32 inNumberBuffers)
 UInt32	CAAudioBufferList::GetTotalNumberChannels(const AudioBufferList& inBufferList)
 {
 	UInt32 theAnswer = 0;
-	
+
 	for(UInt32 theIndex = 0; theIndex < inBufferList.mNumberBuffers; ++theIndex)
 	{
 		theAnswer += inBufferList.mBuffers[theIndex].mNumberChannels;
 	}
-	
+
 	return theAnswer;
 }
 
@@ -97,20 +97,20 @@ bool	CAAudioBufferList::GetBufferForChannel(const AudioBufferList& inBufferList,
 {
 	bool theAnswer = false;
 	UInt32 theIndex = 0;
-	
+
 	while((theIndex < inBufferList.mNumberBuffers) && (inChannel >= inBufferList.mBuffers[theIndex].mNumberChannels))
 	{
 		inChannel -= inBufferList.mBuffers[theIndex].mNumberChannels;
 		++theIndex;
 	}
-	
+
 	if(theIndex < inBufferList.mNumberBuffers)
 	{
 		outBufferNumber = theIndex;
 		outBufferChannel = inChannel;
 		theAnswer = true;
 	}
-	
+
 	return theAnswer;
 }
 
@@ -136,7 +136,7 @@ void	CAAudioBufferList::Copy(const AudioBufferList& inSource, UInt32 inStartingS
 	UInt32 theNumberInputChannels = GetTotalNumberChannels(inSource);
 	UInt32 theOutputChannel = inStartingDestinationChannel;
 	UInt32 theNumberOutputChannels = GetTotalNumberChannels(outDestination);
-	
+
 	UInt32 theInputBufferIndex = 0;
 	UInt32 theInputBufferChannel = 0;
 	UInt32 theOutputBufferIndex = 0;
@@ -144,11 +144,11 @@ void	CAAudioBufferList::Copy(const AudioBufferList& inSource, UInt32 inStartingS
 	while((theInputChannel < theNumberInputChannels) && (theOutputChannel < theNumberOutputChannels))
 	{
 		GetBufferForChannel(inSource, theInputChannel, theInputBufferIndex, theInputBufferChannel);
-		
+
 		GetBufferForChannel(inSource, theOutputChannel, theOutputBufferIndex, theOutputBufferChannel);
-		
+
 		CopyChannel(inSource.mBuffers[theInputBufferIndex], theInputBufferChannel, outDestination.mBuffers[theOutputBufferIndex], theOutputBufferChannel);
-		
+
 		++theInputChannel;
 		++theOutputChannel;
 	}
@@ -160,13 +160,13 @@ void	CAAudioBufferList::CopyChannel(const AudioBuffer& inSource, UInt32 inSource
 	UInt32 theNumberFramesToCopy = outDestination.mDataByteSize / (outDestination.mNumberChannels * SizeOf32(Float32));
 	const Float32* theSource = static_cast<const Float32*>(inSource.mData);
 	Float32* theDestination = static_cast<Float32*>(outDestination.mData);
-	
+
 	//  loop through the data and copy the samples
 	while(theNumberFramesToCopy > 0)
 	{
 		//  copy the data
 		theDestination[inDestinationChannel] = theSource[inSourceChannel];
-		
+
 		//  adjust the pointers
 		--theNumberFramesToCopy;
 		theSource += inSource.mNumberChannels;
@@ -218,7 +218,7 @@ bool	CAAudioBufferList::HasData(AudioBufferList& inBufferList)
 void	CAAudioBufferList::PrintToLog(const AudioBufferList& inBufferList)
 {
 	PrintInt("  Number streams: ", inBufferList.mNumberBuffers);
-	
+
 	for(UInt32 theIndex = 0; theIndex < inBufferList.mNumberBuffers; ++theIndex)
 	{
 		PrintIndexedInt("  Channels in stream", theIndex + 1, inBufferList.mBuffers[theIndex].mNumberChannels);
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAAudioBufferList.h b/libs/appleutility/CoreAudio/PublicUtility/CAAudioBufferList.h
index 70614f3..e28e723 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAAudioBufferList.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAAudioBufferList.h
@@ -2,14 +2,14 @@
      File: CAAudioBufferList.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #if !defined(__CAAudioBufferList_h__)
 #define __CAAudioBufferList_h__
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAAudioChannelLayout.cpp b/libs/appleutility/CoreAudio/PublicUtility/CAAudioChannelLayout.cpp
index 7475359..982dee1 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAAudioChannelLayout.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAAudioChannelLayout.cpp
@@ -2,14 +2,14 @@
      File: CAAudioChannelLayout.cpp
  Abstract: CAAudioChannelLayout.h
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 //=============================================================================
 //	Includes
@@ -95,10 +95,10 @@ bool	operator== (const AudioChannelLayout &x, const AudioChannelLayout &y)
 	// (this may be too strict a comparison if all you care about are matching layout tags)
 	UInt32 theSize1 = CAAudioChannelLayout::CalculateByteSize(x.mNumberChannelDescriptions);
 	UInt32 theSize2 = CAAudioChannelLayout::CalculateByteSize(y.mNumberChannelDescriptions);
-	
+
 	if (theSize1 != theSize2)
 		return false;
-		
+
 	return !memcmp (&x, &y, theSize1);
 }
 
@@ -125,7 +125,7 @@ UInt32	CAAudioChannelLayout::NumberChannels (const AudioChannelLayout& inLayout)
 {
 	if (inLayout.mChannelLayoutTag == kAudioChannelLayoutTag_UseChannelDescriptions)
 		return inLayout.mNumberChannelDescriptions;
-	
+
 	if (inLayout.mChannelLayoutTag == kAudioChannelLayoutTag_UseChannelBitmap)
 		return CountOnes (inLayout.mChannelBitmap);
 
@@ -134,7 +134,7 @@ UInt32	CAAudioChannelLayout::NumberChannels (const AudioChannelLayout& inLayout)
 
 void 	CAShowAudioChannelLayout (FILE* file, const AudioChannelLayout *layout)
 {
-	if (layout == NULL) 
+	if (layout == NULL)
 	{
 		fprintf (file, "\tNULL layout\n");
 		return;
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAAudioChannelLayout.h b/libs/appleutility/CoreAudio/PublicUtility/CAAudioChannelLayout.h
index 4307054..9338429 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAAudioChannelLayout.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAAudioChannelLayout.h
@@ -2,14 +2,14 @@
      File: CAAudioChannelLayout.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #if !defined(__CAAudioChannelLayout_h__)
 #define __CAAudioChannelLayout_h__
@@ -85,27 +85,27 @@ class CAAudioChannelLayout
 public:
 	static AudioChannelLayout*	Create(UInt32 inNumberChannelDescriptions);
 	static void					Destroy(AudioChannelLayout* inChannelLayout);
-	static UInt32				CalculateByteSize(UInt32 inNumberChannelDescriptions) { 
+	static UInt32				CalculateByteSize(UInt32 inNumberChannelDescriptions) {
 									return SizeOf32(AudioChannelLayout) - SizeOf32(AudioChannelDescription) + (inNumberChannelDescriptions * SizeOf32(AudioChannelDescription));
 								}
 	static void					SetAllToUnknown(AudioChannelLayout& outChannelLayout, UInt32 inNumberChannelDescriptions);
 	static UInt32				NumberChannels(const AudioChannelLayout& inLayout);
-	
+
 #if !HAL_Build
-// object methods	
+// object methods
 public:
 								CAAudioChannelLayout ();
 
 								CAAudioChannelLayout (UInt32 inNumberChannels, bool inChooseSurround);
 									// if inChooseSurround is false, then symmetrical speaker arrangements
 									// are chosen in place of surround layouts if there is a choice
-									// This call chooses layouts based on the expected defaults in 
+									// This call chooses layouts based on the expected defaults in
 									// AudioUnit usage
 								CAAudioChannelLayout (AudioChannelLayoutTag inTag);
 								CAAudioChannelLayout (const CAAudioChannelLayout &c);
 								CAAudioChannelLayout (const AudioChannelLayout* inChannelLayout);
 								~CAAudioChannelLayout();
-	
+
 	CAAudioChannelLayout&		operator= (const AudioChannelLayout* inChannelLayout);
 	CAAudioChannelLayout&		operator= (const CAAudioChannelLayout& c);
 	bool						operator== (const CAAudioChannelLayout &c) const;
@@ -115,38 +115,38 @@ public:
 
 	bool						IsValid() const { return NumberChannels() > 0; }
 	UInt32						Size() const { return mLayout ? mLayout->Size() : 0; }
-	
+
 	UInt32						NumberChannels() const { return mLayout ? mLayout->NumberChannels() : 0; }
-	
+
 	AudioChannelLayoutTag		Tag() const { return Layout().mChannelLayoutTag; }
 	const AudioChannelLayout&	Layout() const { return mLayout->Layout(); }
 	operator const AudioChannelLayout *() const { return &Layout(); }
-	
+
 	void						Print () const { Print (stdout); }
 	void						Print (FILE* file) const;
 
 	OSStatus					Save (CFPropertyListRef *outData) const;
 	OSStatus					Restore (CFPropertyListRef &inData);
-	
+
 private:
 	class RefCountedLayout : public CAReferenceCounted {
 		void *	operator new(size_t /* size */, size_t aclSize)
 		{
 			return CA_malloc(sizeof(RefCountedLayout) - sizeof(AudioChannelLayout) + aclSize);
 		}
-		
+
 		void	operator delete(void *mem)
 		{
 			free(mem);
 		}
-		
-		
+
+
 		RefCountedLayout(UInt32 inDataSize) :
 			mByteSize(inDataSize)
-		{ 
+		{
 			memset(&mACL, 0, inDataSize);
 		}
-		
+
 	public:
 		static RefCountedLayout *CreateWithNumberChannelDescriptions(unsigned nChannels) {
 								size_t size = CAAudioChannelLayout::CalculateByteSize(nChannels);
@@ -164,33 +164,33 @@ private:
 								acl->mACL.mChannelLayoutTag = layoutTag;
 								return acl;
 							}
-	
+
 		const AudioChannelLayout & 	Layout() const { return mACL; }
-		
+
 		UInt32						Size () const { return mByteSize; }
-		
+
 		UInt32						NumberChannels() { return CAAudioChannelLayout::NumberChannels(Layout()); }
-		
+
 	private:
 		const UInt32		mByteSize;
 		AudioChannelLayout 	mACL;
 		// * * * mACL is variable length and thus must be last * * *
-		
+
 			// only the constructors can change the actual state of the layout
 		friend CAAudioChannelLayout::CAAudioChannelLayout (UInt32 inNumberChannels, bool inChooseSurround);
 		friend OSStatus CAAudioChannelLayout::Restore (CFPropertyListRef &inData);
 		friend CAAudioChannelLayout& CAAudioChannelLayout::operator= (const AudioChannelLayout* inChannelLayout);
 		friend void CAAudioChannelLayout::SetWithTag(AudioChannelLayoutTag inTag);
-		
+
 		AudioChannelLayout * 	GetLayout() { return &mACL; }
-	
+
 	private:
 		// prohibited methods: private and unimplemented.
 		RefCountedLayout();
 		RefCountedLayout(const RefCountedLayout& c);
 		RefCountedLayout& operator=(const RefCountedLayout& c);
 	};
-	
+
 	RefCountedLayout		*mLayout;
 #endif	//	HAL_Build
 
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAAudioChannelLayoutObject.cpp b/libs/appleutility/CoreAudio/PublicUtility/CAAudioChannelLayoutObject.cpp
index 009d4b3..50687e9 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAAudioChannelLayoutObject.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAAudioChannelLayoutObject.cpp
@@ -2,14 +2,14 @@
      File: CAAudioChannelLayoutObject.cpp
  Abstract: CAAudioChannelLayoutObject.h
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #include "CAAudioChannelLayout.h"
 #if !defined(__COREAUDIO_USE_FLAT_INCLUDES__)
@@ -60,11 +60,11 @@ CAAudioChannelLayout::CAAudioChannelLayout ()
 //	CAAudioChannelLayout::CAAudioChannelLayout
 //=============================================================================
 CAAudioChannelLayout::CAAudioChannelLayout (UInt32 inNumberChannels, bool inChooseSurround)
-{		
+{
 		// this chooses default layouts based on the number of channels...
 	AudioChannelLayoutTag tag;
-	
-	switch (inNumberChannels) 
+
+	switch (inNumberChannels)
 	{
 		default:
 			// here we have a "broken" layout, in the sense that we haven't any idea how to lay this out
@@ -93,7 +93,7 @@ CAAudioChannelLayout::CAAudioChannelLayout (UInt32 inNumberChannels, bool inChoo
 			tag = kAudioChannelLayoutTag_AudioUnit_8;
 			break;
 	}
-	
+
 	mLayout = RefCountedLayout::CreateWithLayoutTag(tag);
 }
 
@@ -144,11 +144,11 @@ CAAudioChannelLayout& CAAudioChannelLayout::operator= (const CAAudioChannelLayou
 	if (mLayout != c.mLayout) {
 		if (mLayout)
 			mLayout->release();
-	
+
 		if ((mLayout = c.mLayout) != NULL)
 			mLayout->retain();
 	}
-	
+
 	return *this;
 }
 
@@ -156,11 +156,11 @@ CAAudioChannelLayout&	CAAudioChannelLayout::operator= (const AudioChannelLayout*
 {
 	if (mLayout && &mLayout->Layout() == inChannelLayout)
 		return *this;
-		
+
 	if (mLayout)
 		mLayout->release();
 
-	if (inChannelLayout == NULL) 
+	if (inChannelLayout == NULL)
 	{
 		mLayout = RefCountedLayout::CreateWithNumberChannelDescriptions(0);
 	}
@@ -175,7 +175,7 @@ void	CAAudioChannelLayout::SetWithTag(AudioChannelLayoutTag inTag)
 {
 	if (mLayout)
 		mLayout->release();
-	
+
 	mLayout = RefCountedLayout::CreateWithLayoutTag(inTag);
 }
 
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAAudioFileFormats.cpp b/libs/appleutility/CoreAudio/PublicUtility/CAAudioFileFormats.cpp
index ce2efea..fce21ec 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAAudioFileFormats.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAAudioFileFormats.cpp
@@ -2,14 +2,14 @@
      File: CAAudioFileFormats.cpp
  Abstract: CAAudioFileFormats.h
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #include "CAAudioFileFormats.h"
 #include <algorithm>
@@ -62,26 +62,26 @@ class CompareFileFormatNames {
 public:
 	bool	operator() (const CAAudioFileFormats::FileFormatInfo &a, const CAAudioFileFormats::FileFormatInfo &b)
 	{
-		return CFStringCompare(a.mFileTypeName, b.mFileTypeName, 
+		return CFStringCompare(a.mFileTypeName, b.mFileTypeName,
 			kCFCompareCaseInsensitive | kCFCompareLocalized) == kCFCompareLessThan;
 	}
 };*/
 
 static int CompareFileFormatNames(const void *va, const void *vb)
 {
-	CAAudioFileFormats::FileFormatInfo  *a = (CAAudioFileFormats::FileFormatInfo *)va, 
+	CAAudioFileFormats::FileFormatInfo  *a = (CAAudioFileFormats::FileFormatInfo *)va,
 										*b = (CAAudioFileFormats::FileFormatInfo *)vb;
-	return CFStringCompare(a->mFileTypeName, b->mFileTypeName, 
+	return CFStringCompare(a->mFileTypeName, b->mFileTypeName,
 		kCFCompareCaseInsensitive | kCFCompareLocalized);
 }
 
-CAAudioFileFormats::CAAudioFileFormats(bool loadDataFormats) : 
+CAAudioFileFormats::CAAudioFileFormats(bool loadDataFormats) :
 	mNumFileFormats(0), mFileFormats(NULL)
 {
 	OSStatus err;
 	UInt32 size;
 	UInt32 *fileTypes = NULL;
-	
+
 	// get all file types
 	err = AudioFileGetGlobalInfoSize(kAudioFileGlobalInfo_WritableTypes, 0, NULL, &size);
 	if (err != noErr) goto bail;
@@ -90,32 +90,32 @@ CAAudioFileFormats::CAAudioFileFormats(bool loadDataFormats) :
 	fileTypes = new UInt32[mNumFileFormats];
 	err = AudioFileGetGlobalInfo(kAudioFileGlobalInfo_WritableTypes, 0, NULL, &size, fileTypes);
 	if (err != noErr) goto bail;
-	
+
 	// get info for each file type
 	for (int i = 0; i < mNumFileFormats; ++i) {
 		FileFormatInfo *ffi = &mFileFormats[i];
 		OSType filetype = fileTypes[i];
 
 		ffi->mFileTypeID = filetype;
-		
+
 		// file type name
 		ffi->mFileTypeName = NULL;
 		size = sizeof(CFStringRef);
 		err = AudioFileGetGlobalInfo(kAudioFileGlobalInfo_FileTypeName, sizeof(UInt32), &filetype, &size, &ffi->mFileTypeName);
 		if (err == noErr && ffi->mFileTypeName)
 			CFRetain(ffi->mFileTypeName);
-		
+
 		// file extensions
 		size = sizeof(CFArrayRef);
 		err = AudioFileGetGlobalInfo(kAudioFileGlobalInfo_ExtensionsForType,
 			sizeof(OSType), &filetype, &size, &ffi->mExtensions);
 		if (err)
 			ffi->mExtensions = NULL;
-		
+
 		// file data formats
 		ffi->mNumDataFormats = 0;
 		ffi->mDataFormats = NULL;
-		
+
 		if (loadDataFormats)
 			ffi->LoadDataFormats();
 	}
@@ -129,7 +129,7 @@ bail:
 void	CAAudioFileFormats::FileFormatInfo::LoadDataFormats()
 {
 	if (mDataFormats != NULL) return;
-	
+
 	UInt32 *writableFormats = NULL, *readableFormats = NULL;
 	int nWritableFormats, nReadableFormats;
 	// get all writable formats
@@ -140,7 +140,7 @@ void	CAAudioFileFormats::FileFormatInfo::LoadDataFormats()
 	writableFormats = new UInt32[nWritableFormats];
 	err = AudioFormatGetProperty(kAudioFormatProperty_EncodeFormatIDs, 0, NULL, &size, writableFormats);
 	if (err != noErr) goto bail;
-	
+
 	// get all readable formats
 	err = AudioFormatGetPropertyInfo(kAudioFormatProperty_DecodeFormatIDs, 0, NULL, &size);
 	if (err != noErr) goto bail;
@@ -148,7 +148,7 @@ void	CAAudioFileFormats::FileFormatInfo::LoadDataFormats()
 	readableFormats = new UInt32[nReadableFormats];
 	err = AudioFormatGetProperty(kAudioFormatProperty_DecodeFormatIDs, 0, NULL, &size, readableFormats);
 	if (err != noErr) goto bail;
-	
+
 	err = AudioFileGetGlobalInfoSize(kAudioFileGlobalInfo_AvailableFormatIDs, sizeof(UInt32), &mFileTypeID, &size);
 	if (err == noErr) {
 		mNumDataFormats = size / sizeof(OSType);
@@ -174,7 +174,7 @@ void	CAAudioFileFormats::FileFormatInfo::LoadDataFormats()
 						dfi->mWritable = true;
 						break;
 					}
-				
+
 				dfi->mNumVariants = 0;
 				AudioFileTypeAndFormatID tf = { mFileTypeID, dfi->mFormatID };
 				err = AudioFileGetGlobalInfoSize(kAudioFileGlobalInfo_AvailableStreamDescriptionsForFormat,
@@ -200,7 +200,7 @@ void	CAAudioFileFormats::FileFormatInfo::LoadDataFormats()
 						}
 					}
 				}
-				
+
 				dfi->mEitherEndianPCM = (anyBigEndian && anyLittleEndian);
 			}
 		}
@@ -280,7 +280,7 @@ bool	CAAudioFileFormats::InferFileFormatFromFilename(const char *filename, Audio
 	return result;
 }
 
-bool	CAAudioFileFormats::InferFileFormatFromDataFormat(const CAStreamBasicDescription &fmt, 
+bool	CAAudioFileFormats::InferFileFormatFromDataFormat(const CAStreamBasicDescription &fmt,
 			AudioFileTypeID &filetype)
 {
 	// if there's exactly one file format that supports this data format
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAAudioFileFormats.h b/libs/appleutility/CoreAudio/PublicUtility/CAAudioFileFormats.h
index 3d2f90f..1f99711 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAAudioFileFormats.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAAudioFileFormats.h
@@ -2,14 +2,14 @@
      File: CAAudioFileFormats.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #ifndef __CAAudioFileFormats_h__
 #define __CAAudioFileFormats_h__
@@ -61,7 +61,7 @@ public:
 	struct DataFormatInfo {
 		DataFormatInfo() : mVariants(NULL) { }
 		~DataFormatInfo() { delete[] mVariants; }
-		
+
 		UInt32							mFormatID;
 		int								mNumVariants;
 		AudioStreamBasicDescription *	mVariants;
@@ -73,7 +73,7 @@ public:
 		void	DebugPrint();
 #endif
 	};
-	
+
 	struct FileFormatInfo {
 		FileFormatInfo() : mFileTypeName(NULL), mExtensions(NULL), mDataFormats(NULL) { }
 		~FileFormatInfo() {
@@ -83,13 +83,13 @@ public:
 			if (mExtensions)
 				CFRelease(mExtensions);
 		}
-		
+
 		AudioFileTypeID					mFileTypeID;
 		CFStringRef						mFileTypeName;
 		CFArrayRef						mExtensions;
 		int								mNumDataFormats;
 		DataFormatInfo *				mDataFormats;		// NULL until loaded!
-		
+
 		int		NumberOfExtensions() { return static_cast<int>(mExtensions ? CFArrayGetCount(mExtensions) : 0); }
 		char *	GetExtension(int index, char *buf, int buflen) {
 					CFStringRef cfext = (CFStringRef)CFArrayGetValueAtIndex(mExtensions, index);
@@ -107,19 +107,19 @@ public:
 				}
 		bool	AnyWritableFormats();
 		void	LoadDataFormats();
-		
+
 #if DEBUG
 		void	DebugPrint();
 #endif
 	};
-	
+
 private:	// use Instance()
 	CAAudioFileFormats(bool loadDataFormats);
 	~CAAudioFileFormats();
 public:
-	
+
 	bool	InferDataFormatFromFileFormat(AudioFileTypeID filetype, CAStreamBasicDescription &fmt);
-	
+
 	bool	InferFileFormatFromFilename(const char *filename, AudioFileTypeID &filetype);
 
 	bool	InferFileFormatFromFilename(CFStringRef filename, AudioFileTypeID &filetype);
@@ -127,19 +127,19 @@ public:
 	bool	InferFileFormatFromDataFormat(const CAStreamBasicDescription &fmt, AudioFileTypeID &filetype);
 
 	bool	IsKnownDataFormat(UInt32 dataFormat);
-	
+
 #if DEBUG
 	void	DebugPrint();
 #endif
 
 	int					mNumFileFormats;
 	FileFormatInfo	*	mFileFormats;
-	
+
 	FileFormatInfo *	FindFileFormat(UInt32 formatID);
 
 	static CAAudioFileFormats *	Instance(bool loadDataFormats=true);
 
-private:	
+private:
 	static CAAudioFileFormats *	sInstance;
 };
 
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAAudioTimeStamp.cpp b/libs/appleutility/CoreAudio/PublicUtility/CAAudioTimeStamp.cpp
index 0200ec9..48e5ff4 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAAudioTimeStamp.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAAudioTimeStamp.cpp
@@ -2,14 +2,14 @@
      File: CAAudioTimeStamp.cpp
  Abstract: CAAudioTimeStamp.h
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 //=============================================================================
 //	Includes
@@ -60,7 +60,7 @@ bool	operator<(const AudioTimeStamp& x, const AudioTimeStamp& y)
 {
 	bool	isLessThan = false;
 	bool	isDone = false;
-	
+
 	//	check the sample time
 	if(!isDone)
 	{
@@ -70,7 +70,7 @@ bool	operator<(const AudioTimeStamp& x, const AudioTimeStamp& y)
 			isDone = true;
 		}
 	}
-	
+
 	//	check the host time
 	if(!isDone)
 	{
@@ -80,7 +80,7 @@ bool	operator<(const AudioTimeStamp& x, const AudioTimeStamp& y)
 			isDone = true;
 		}
 	}
-	
+
 	//	check the word clock time
 	if(!isDone)
 	{
@@ -91,7 +91,7 @@ bool	operator<(const AudioTimeStamp& x, const AudioTimeStamp& y)
 			//isDone = true;
 		}
 	}
-	
+
 	return isLessThan;
 }
 
@@ -99,7 +99,7 @@ bool	operator==(const AudioTimeStamp& x, const AudioTimeStamp& y)
 {
 	bool	isEqual = false;
 	bool	isDone = false;
-	
+
 	//	check the sample time
 	if(!isDone)
 	{
@@ -109,7 +109,7 @@ bool	operator==(const AudioTimeStamp& x, const AudioTimeStamp& y)
 			isDone = true;
 		}
 	}
-	
+
 	//	check the host time
 	if(!isDone)
 	{
@@ -119,7 +119,7 @@ bool	operator==(const AudioTimeStamp& x, const AudioTimeStamp& y)
 			isDone = true;
 		}
 	}
-	
+
 	//	check the word clock time
 	if(!isDone)
 	{
@@ -130,6 +130,6 @@ bool	operator==(const AudioTimeStamp& x, const AudioTimeStamp& y)
 			//isDone = true;
 		}
 	}
-	
+
 	return isEqual;
 }
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAAudioTimeStamp.h b/libs/appleutility/CoreAudio/PublicUtility/CAAudioTimeStamp.h
index 9b8d6ab..e7d3b11 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAAudioTimeStamp.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAAudioTimeStamp.h
@@ -2,14 +2,14 @@
      File: CAAudioTimeStamp.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #if !defined(__CAAudioTimeStamp_h__)
 #define __CAAudioTimeStamp_h__
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAAudioUnit.cpp b/libs/appleutility/CoreAudio/PublicUtility/CAAudioUnit.cpp
index 53da5a1..cfa0297 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAAudioUnit.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAAudioUnit.cpp
@@ -2,14 +2,14 @@
      File: CAAudioUnit.cpp
  Abstract: CAAudioUnit.h
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #include "CAAudioUnit.h"
 
@@ -62,7 +62,7 @@
 struct StackAUChannelInfo {
 		StackAUChannelInfo (UInt32 inSize) : mChanInfo ((AUChannelInfo*)malloc (inSize)) {}
 		~StackAUChannelInfo() { free (mChanInfo); }
-		
+
 	AUChannelInfo* mChanInfo;
 };
 
@@ -81,21 +81,21 @@ class CAAudioUnit::AUState : public CAReferenceCounted  {
 public:
 	AUState (AudioComponent inComp)
 						: mUnit(0), mNode (0)
-						{ 
-							OSStatus result = ::AudioComponentInstanceNew (inComp, &mUnit); 
+						{
+							OSStatus result = ::AudioComponentInstanceNew (inComp, &mUnit);
 							if (result)
 								throw result;
 							Init();
 						}
 
 	AUState (const AUNode &inNode, const AudioUnit& inUnit)
-						: mUnit (inUnit), mNode (inNode) 
+						: mUnit (inUnit), mNode (inNode)
 						{
 							Init();
 						}
-						
+
 	~AUState();
-											
+
 	AudioUnit			mUnit;
 	AUNode				mNode;
 
@@ -105,7 +105,7 @@ public:
 #if CA_AU_USE_FAST_DISPATCH
 			if (mGetParamProc != NULL) {
 				return (mGetParamProc) (mConnInstanceStorage, inID, scope, element, &outValue);
-			}							
+			}
 #endif
 		return AudioUnitGetParameter(mUnit, inID, scope, element, &outValue);
 	}
@@ -116,11 +116,11 @@ public:
 #if CA_AU_USE_FAST_DISPATCH
 			if (mSetParamProc != NULL) {
 				return (mSetParamProc) (mConnInstanceStorage, inID, scope, element, value, bufferOffsetFrames);
-			}							
+			}
 #endif
 			return AudioUnitSetParameter(mUnit, inID, scope, element, value, bufferOffsetFrames);
 	}
-	
+
 	OSStatus			Render (AudioUnitRenderActionFlags *  ioActionFlags,
 								const AudioTimeStamp *        inTimeStamp,
 								UInt32                        inOutputBusNumber,
@@ -130,11 +130,11 @@ public:
 #if CA_AU_USE_FAST_DISPATCH
 		if (mRenderProc != NULL) {
 			return (mRenderProc) (mConnInstanceStorage, ioActionFlags, inTimeStamp, inOutputBusNumber, inNumberFrames, ioData);
-		}							
+		}
 #endif
 		return AudioUnitRender(mUnit, ioActionFlags, inTimeStamp, inOutputBusNumber, inNumberFrames, ioData);
 	}
-	
+
 	OSStatus		MIDIEvent (UInt32					inStatus,
 								UInt32					inData1,
 								UInt32					inData2,
@@ -187,7 +187,7 @@ public:
 
 private:
 	// get the fast dispatch pointers
-	void Init() 
+	void Init()
 	{
 #if CA_AU_USE_FAST_DISPATCH
 		UInt32 size = sizeof(AudioUnitRenderProc);
@@ -195,13 +195,13 @@ private:
 								kAudioUnitScope_Global, kAudioUnitRenderSelect,
 								&mRenderProc, &size) != noErr)
 			mRenderProc = NULL;
-		
+
 		size = sizeof(AudioUnitGetParameterProc);
 		if (AudioUnitGetProperty(mUnit, kAudioUnitProperty_FastDispatch,
 								kAudioUnitScope_Global, kAudioUnitGetParameterSelect,
 								&mGetParamProc, &size) != noErr)
 			mGetParamProc = NULL;
-		
+
 		size = sizeof(AudioUnitSetParameterProc);
 		if (AudioUnitGetProperty(mUnit, kAudioUnitProperty_FastDispatch,
 								kAudioUnitScope_Global, kAudioUnitSetParameterSelect,
@@ -225,7 +225,7 @@ private:
 								kAudioUnitScope_Global, kMusicDeviceStopNoteSelect,
 								&mStopNoteProc, &size) != noErr)
 			mStopNoteProc = NULL;
-		
+
 		if (mRenderProc || mGetParamProc || mSetParamProc || mMIDIEventProc || mStartNoteProc || mStopNoteProc) {
 			mConnInstanceStorage = LoadGetComponentInstanceStorage ( mUnit );
 		} else
@@ -234,10 +234,10 @@ private:
 		mConnInstanceStorage = NULL;
 #endif
 	}
-	
+
 #if CA_AU_USE_FAST_DISPATCH
 	AudioUnitRenderProc			mRenderProc;
-	AudioUnitGetParameterProc	mGetParamProc; 
+	AudioUnitGetParameterProc	mGetParamProc;
 	AudioUnitSetParameterProc	mSetParamProc;
 	MusicDeviceMIDIEventProc	mMIDIEventProc;
 	MusicDeviceStartNoteProc	mStartNoteProc;
@@ -251,9 +251,9 @@ private:
 	AUState () {}
 	AUState (const AUState&);
 	AUState& operator= (const AUState&);
-};						
-						
-						
+};
+
+
 CAAudioUnit::AUState::~AUState ()
 {
 	if (mUnit && (mNode == 0)) {
@@ -266,7 +266,7 @@ CAAudioUnit::AUState::~AUState ()
 OSStatus		CAAudioUnit::Open (const CAComponent& inComp, CAAudioUnit &outUnit)
 {
 	try {
-		outUnit = inComp; 
+		outUnit = inComp;
 		return noErr;
 	} catch (OSStatus res) {
 		return res;
@@ -286,7 +286,7 @@ CAAudioUnit::CAAudioUnit (const CAComponent& inComp)
 }
 
 CAAudioUnit::CAAudioUnit (const AUNode &inNode, const AudioUnit& inUnit)
-	: mComp (inUnit), mDataPtr(new AUState (inNode, inUnit)) 
+	: mComp (inUnit), mDataPtr(new AUState (inNode, inUnit))
 {
 }
 
@@ -308,13 +308,13 @@ CAAudioUnit&	CAAudioUnit::operator= (const CAAudioUnit &a)
 	if (mDataPtr != a.mDataPtr) {
 		if (mDataPtr)
 			mDataPtr->release();
-	
+
 		if ((mDataPtr = a.mDataPtr) != NULL)
 			mDataPtr->retain();
-		
+
 		mComp = a.mComp;
 	}
-	
+
 	return *this;
 }
 
@@ -338,36 +338,36 @@ OSStatus		CAAudioUnit::RemovePropertyListener (AudioUnitPropertyID		inID,
 {
 		// we call this first. If it fails we call the old API as the failure can
 		// mean that the AU doesn't implement that selector.
-	OSStatus result = AudioUnitRemovePropertyListenerWithUserData(AU(), inID, 
+	OSStatus result = AudioUnitRemovePropertyListenerWithUserData(AU(), inID,
 									inProc, inProcUserData);
 	#if !__LP64__ && !TARGET_OS_IPHONE
 		if (result) result = AudioUnitRemovePropertyListener (AU(), inID, inProc);
-	#endif									
+	#endif
 	return result;
-}	
+}
 
-#pragma mark __State Management	
+#pragma mark __State Management
 
-bool			CAAudioUnit::IsValid () const 
-{ 
-	return mDataPtr ? mDataPtr->mUnit != 0 : false; 
+bool			CAAudioUnit::IsValid () const
+{
+	return mDataPtr ? mDataPtr->mUnit != 0 : false;
 }
-	
-AudioUnit		CAAudioUnit::AU() const 
-{ 
-	return mDataPtr ? mDataPtr->mUnit : 0; 
+
+AudioUnit		CAAudioUnit::AU() const
+{
+	return mDataPtr ? mDataPtr->mUnit : 0;
 }
 
 AUNode			CAAudioUnit::GetAUNode () const
 {
-	return mDataPtr ? mDataPtr->mNode : 0; 
+	return mDataPtr ? mDataPtr->mNode : 0;
 }
 
 #pragma mark __Format Handling
-	
-bool		CAAudioUnit::CanDo (	int 				inChannelsIn, 
+
+bool		CAAudioUnit::CanDo (	int 				inChannelsIn,
 									int 				inChannelsOut) const
-{		
+{
 	// this is the default assumption of an audio effect unit
 	Boolean* isWritable = 0;
 	UInt32	dataSize = 0;
@@ -376,31 +376,31 @@ bool		CAAudioUnit::CanDo (	int 				inChannelsIn,
 									kAudioUnitProperty_SupportedNumChannels,
 									kAudioUnitScope_Global, 0,
 									&dataSize, isWritable); //don't care if this is writable
-		
+
 		// if this property is NOT implemented an FX unit
 		// is expected to deal with same channel valance in and out
-	if (result) 
+	if (result)
 	{
 		if ((Comp().Desc().IsEffect() && inChannelsIn == inChannelsOut)
 			|| (Comp().Desc().IsOffline() && inChannelsIn == inChannelsOut))
 		{
 			return true;
 		}
-		else 
+		else
 		{
 			// the au should either really tell us about this
 			// or we will assume the worst
 			return false;
 		}
 	}
-	
+
 	StackAUChannelInfo info (dataSize);
-	
+
 	result = GetProperty (kAudioUnitProperty_SupportedNumChannels,
 							kAudioUnitScope_Global, 0,
 							info.mChanInfo, &dataSize);
 	if (result) { return false; }
-	
+
 	return ValidateChannelPair (inChannelsIn, inChannelsOut, info.mChanInfo, (dataSize / sizeof (AUChannelInfo)));
 }
 
@@ -414,10 +414,10 @@ int    CAAudioUnit::GetChannelInfo (AUChannelInfo** chaninfo, UInt32& cnt)
                                                 kAudioUnitProperty_SupportedNumChannels,
                                                 kAudioUnitScope_Global, 0,
                                                 &dataSize, isWritable); //don't care if this is writable
-    
+
     // if this property is NOT implemented an FX unit
     // is expected to deal with same channel valance in and out
-    
+
     if (result)
     {
         if (Comp().Desc().IsEffect())
@@ -430,16 +430,16 @@ int    CAAudioUnit::GetChannelInfo (AUChannelInfo** chaninfo, UInt32& cnt)
             // (eg. Kick, Snare,.. on a Drummachine)
             // eventually the Bus-Name for each configuration should be exposed
             // for the User to select..
-            
+
             UInt32 elCountIn, elCountOut;
-            
+
             if (GetElementCount (kAudioUnitScope_Input, elCountIn)) return -1;
             if (GetElementCount (kAudioUnitScope_Output, elCountOut)) return -1;
-            
+
             cnt = std::max(elCountIn, elCountOut);
-            
+
             *chaninfo = (AUChannelInfo*) malloc (sizeof (AUChannelInfo) * cnt);
-            
+
             for (unsigned int i = 0; i < elCountIn; ++i) {
                 UInt32 numChans;
                 if (NumberChannels (kAudioUnitScope_Input, i, numChans)) return -1;
@@ -448,7 +448,7 @@ int    CAAudioUnit::GetChannelInfo (AUChannelInfo** chaninfo, UInt32& cnt)
             for (unsigned int i = elCountIn; i < cnt; ++i) {
                 (*chaninfo)[i].inChannels = 0;
             }
-            
+
             for (unsigned int i = 0; i < elCountOut; ++i) {
                 UInt32 numChans;
                 if (NumberChannels (kAudioUnitScope_Output, i, numChans)) return -1;
@@ -459,26 +459,26 @@ int    CAAudioUnit::GetChannelInfo (AUChannelInfo** chaninfo, UInt32& cnt)
             }
             return 0;
         }
-        else 
+        else
         {
             // the au should either really tell us about this
             // or we will assume the worst
             return -1;
         }
     }
-    
+
     *chaninfo = (AUChannelInfo*) malloc (dataSize);
     cnt = dataSize / sizeof (AUChannelInfo);
-    
+
     result = GetProperty (kAudioUnitProperty_SupportedNumChannels,
                           kAudioUnitScope_Global, 0,
                           *chaninfo, &dataSize);
-    
+
     if (result) { return -1; }
     return 0;
 }
 
-bool	CAAudioUnit::ValidateChannelPair (int 				inChannelsIn, 
+bool	CAAudioUnit::ValidateChannelPair (int 				inChannelsIn,
 										int 				inChannelsOut,
 										const AUChannelInfo * info,
 										UInt32				numChanInfo) const
@@ -490,8 +490,8 @@ bool	CAAudioUnit::ValidateChannelPair (int 				inChannelsIn,
 -1		wild card:
 -1,-1	any num channels as long as same channels on in and out
 -1,-2	any num channels channels on in and out - special meaning
--2+ 	indicates total num channs AU can handle 
-			- elements configurable to any num channels, 
+-2+ 	indicates total num channs AU can handle
+			- elements configurable to any num channels,
 			- element count in scope must be writable
 */
 
@@ -510,7 +510,7 @@ bool	CAAudioUnit::ValidateChannelPair (int 				inChannelsIn,
 					return true; // if one of these is zero, then a -1 means any
 			}
 			else if ((info[i].inChannels == -1 && info[i].outChannels == -2)
-					|| (info[i].inChannels == -2 && info[i].outChannels == -1)) 
+					|| (info[i].inChannels == -2 && info[i].outChannels == -1))
 			{
 				return true;
 			}
@@ -522,22 +522,22 @@ bool	CAAudioUnit::ValidateChannelPair (int 				inChannelsIn,
 				IsElementCountWritable (kAudioUnitScope_Input, inWrite);
 				if (inWrite && outWrite) {
 					if ((inChannelsOut <= abs(info[i].outChannels))
-						&& (inChannelsIn <= abs(info[i].inChannels))) 
+						&& (inChannelsIn <= abs(info[i].inChannels)))
 					{
 						return true;
 					}
 				}
 			}
 		}
-			
+
 			// special meaning on input, specific num on output
 		else if (info[i].inChannels < 0) {
-			if (info[i].outChannels == inChannelsOut) 
+			if (info[i].outChannels == inChannelsOut)
 			{
 					// can do any in channels
 				if (info[i].inChannels == -1) {
 					return true;
-				} 
+				}
 					// total chans on input
 				else {
 					bool inWrite = false;
@@ -548,15 +548,15 @@ bool	CAAudioUnit::ValidateChannelPair (int 				inChannelsIn,
 				}
 			}
 		}
-		
+
 			// special meaning on output, specific num on input
 		else if (info[i].outChannels < 0) {
-			if (info[i].inChannels == inChannelsIn) 
+			if (info[i].inChannels == inChannelsIn)
 			{
 					// can do any out channels
 				if (info[i].outChannels == -1) {
 					return true;
-				} 
+				}
 					// total chans on output
 				else {
 					bool outWrite = false;
@@ -571,9 +571,9 @@ bool	CAAudioUnit::ValidateChannelPair (int 				inChannelsIn,
 			// both chans in struct >= 0 - thus has to explicitly match
 		else if ((info[i].inChannels == inChannelsIn) && (info[i].outChannels == inChannelsOut)) {
 			return true;
-		} 
-		
-			// now check to see if a wild card on the args (inChannelsIn or inChannelsOut chans is zero) is found 
+		}
+
+			// now check to see if a wild card on the args (inChannelsIn or inChannelsOut chans is zero) is found
 			// tells us to match just one side of the scopes
 		else if (inChannelsIn == 0) {
 			if (info[i].outChannels == inChannelsOut) {
@@ -586,7 +586,7 @@ bool	CAAudioUnit::ValidateChannelPair (int 				inChannelsIn,
 			}
 		}
 	}
-	
+
 	return false;
 }
 
@@ -599,9 +599,9 @@ bool CheckDynCount (SInt32 inTotalChans, const CAAUChanHelper &inHelper)
 	return (totalChans <= inTotalChans);
 }
 
-bool	CAAudioUnit::CheckOneSide (const CAAUChanHelper		&inHelper, 
-									bool					checkOutput, 
-									const AUChannelInfo		*info, 
+bool	CAAudioUnit::CheckOneSide (const CAAUChanHelper		&inHelper,
+									bool					checkOutput,
+									const AUChannelInfo		*info,
 									UInt32					numInfo) const
 {
 		// now we can use the wildcard option (see above impl) to see if this matches
@@ -624,25 +624,25 @@ bool	CAAudioUnit::CheckOneSide (const CAAUChanHelper		&inHelper,
 	return true;
 }
 
-bool		CAAudioUnit::CanDo (const CAAUChanHelper		&inputs,  
+bool		CAAudioUnit::CanDo (const CAAUChanHelper		&inputs,
 								const CAAUChanHelper		&outputs) const
 
 {
 // first check our state
 		// huh!
 	if (inputs.mNumEls == 0 && outputs.mNumEls == 0) return false;
-	
+
 	UInt32 elCount;
 	if (GetElementCount (kAudioUnitScope_Input, elCount)) { return false; }
 	if (elCount != inputs.mNumEls) return false;
 
 	if (GetElementCount (kAudioUnitScope_Output, elCount)) { return false; }
 	if (elCount != outputs.mNumEls) return false;
-		
+
 // (1) special cases (effects and sources (generators and instruments) only)
 	UInt32	dataSize = 0;
 	if (GetPropertyInfo (kAudioUnitProperty_SupportedNumChannels,
-									kAudioUnitScope_Global, 0, &dataSize, NULL) != noErr) 
+									kAudioUnitScope_Global, 0, &dataSize, NULL) != noErr)
 	{
 		if (Comp().Desc().IsEffect() || Comp().Desc().IsOffline()) {
 			UInt32 numChan = outputs.mNumEls > 0 ? outputs.mChans[0] : inputs.mChans[0];
@@ -652,7 +652,7 @@ bool		CAAudioUnit::CanDo (const CAAUChanHelper		&inputs,
 				if (numChan != outputs.mChans[out]) return false;
 			return true;
 		}
-		
+
 			// in this case, all the channels have to match the current config
 		if (Comp().Desc().IsGenerator() || Comp().Desc().IsMusicDevice()) {
 			for (unsigned int in = 0; in < inputs.mNumEls; ++in) {
@@ -667,22 +667,22 @@ bool		CAAudioUnit::CanDo (const CAAUChanHelper		&inputs,
 			}
 			return true;
 		}
-		
+
 			// if we get here we can't determine anything about channel capabilities
 		return false;
 	}
 
 	StackAUChannelInfo info (dataSize);
-	
+
 	if (GetProperty (kAudioUnitProperty_SupportedNumChannels,
 							kAudioUnitScope_Global, 0,
 							info.mChanInfo, &dataSize) != noErr)
-	{ 
-		return false; 
+	{
+		return false;
 	}
-	
+
 	int numInfo = dataSize / sizeof(AUChannelInfo);
-	
+
 // (2) Test for dynamic capability (or no elements on that scope)
 	SInt32 dynInChans = 0;
 	if (ValidateDynamicScope (kAudioUnitScope_Input, dynInChans, info.mChanInfo, numInfo)) {
@@ -706,7 +706,7 @@ bool		CAAudioUnit::CanDo (const CAAUChanHelper		&inputs,
 	}
 
 // (4) - not a dynamic AU, has ins and outs, and has channel constraints so we test every possible pairing
-	for (unsigned int in = 0; in < inputs.mNumEls; ++in) 
+	for (unsigned int in = 0; in < inputs.mNumEls; ++in)
 	{
 		bool testInAlready = false;
 		for (unsigned int i = 0; i < in; ++i) {
@@ -733,7 +733,7 @@ bool		CAAudioUnit::CanDo (const CAAUChanHelper		&inputs,
 			}
 		}
 	}
-	
+
 	return true;
 }
 
@@ -747,7 +747,7 @@ bool		CAAudioUnit::SupportsNumChannels () const
 									kAudioUnitProperty_SupportedNumChannels,
 									kAudioUnitScope_Global, 0,
 									&dataSize, isWritable); //don't care if this is writable
-		
+
 		// if this property is NOT implemented an FX unit
 		// is expected to deal with same channel valance in and out
 	if (result) {
@@ -761,7 +761,7 @@ OSStatus		CAAudioUnit::GetChannelLayoutTags (AudioUnitScope 	inScope,
 										AudioUnitElement 			inEl,
 										ChannelTagVector			&outChannelVector) const
 {
-	if (HasChannelLayouts (inScope, inEl) == false) return kAudioUnitErr_InvalidProperty; 
+	if (HasChannelLayouts (inScope, inEl) == false) return kAudioUnitErr_InvalidProperty;
 
 	UInt32 dataSize;
 	OSStatus result = AudioUnitGetPropertyInfo (AU(),
@@ -770,7 +770,7 @@ OSStatus		CAAudioUnit::GetChannelLayoutTags (AudioUnitScope 	inScope,
 								&dataSize, NULL);
 
 	if (result) return result;
-	
+
 		// OK lets get our channel layouts and see if the one we want is present
 	AudioChannelLayoutTag* info = (AudioChannelLayoutTag*)malloc (dataSize);
 	result = AudioUnitGetProperty (AU(),
@@ -778,7 +778,7 @@ OSStatus		CAAudioUnit::GetChannelLayoutTags (AudioUnitScope 	inScope,
 							inScope, inEl,
 							info, &dataSize);
 	if (result) goto home;
-	
+
 	outChannelVector.erase (outChannelVector.begin(), outChannelVector.end());
 	for (unsigned int i = 0; i < (dataSize / sizeof (AudioChannelLayoutTag)); ++i)
 		outChannelVector.push_back (info[i]);
@@ -788,7 +788,7 @@ home:
 	return result;
 }
 
-bool		CAAudioUnit::HasChannelLayouts (AudioUnitScope 		inScope, 
+bool		CAAudioUnit::HasChannelLayouts (AudioUnitScope 		inScope,
 										AudioUnitElement 		inEl) const
 {
 	OSStatus result = AudioUnitGetPropertyInfo (AU(),
@@ -798,17 +798,17 @@ bool		CAAudioUnit::HasChannelLayouts (AudioUnitScope 		inScope,
 	return !result;
 }
 
-bool		CAAudioUnit::HasChannelLayout (AudioUnitScope 		inScope, 
+bool		CAAudioUnit::HasChannelLayout (AudioUnitScope 		inScope,
 											AudioUnitElement 		inEl) const
 {
 	Boolean writable;
 	UInt32 size;
-	
+
 	return AudioUnitGetPropertyInfo (AU(),
 									kAudioUnitProperty_AudioChannelLayout,
 									inScope, inEl,
 									&size, &writable) == noErr;
-}	
+}
 
 OSStatus	CAAudioUnit::GetChannelLayout (AudioUnitScope 		inScope,
 										AudioUnitElement 		inEl,
@@ -818,14 +818,14 @@ OSStatus	CAAudioUnit::GetChannelLayout (AudioUnitScope 		inScope,
 	OSStatus result = AudioUnitGetPropertyInfo (AU(), kAudioUnitProperty_AudioChannelLayout,
 									inScope, inEl, &size, NULL);
 	if (result) return result;
-	
+
 	AudioChannelLayout *layout = (AudioChannelLayout*)malloc (size);
 
 	ca_require_noerr (result = AudioUnitGetProperty (AU(), kAudioUnitProperty_AudioChannelLayout,
 									inScope, inEl, layout, &size), home);
 
 	outLayout = CAAudioChannelLayout (layout);
-	
+
 home:
 	free (layout);
 	return result;
@@ -842,7 +842,7 @@ OSStatus	CAAudioUnit::SetChannelLayout (AudioUnitScope 		inScope,
 	return result;
 }
 
-OSStatus	CAAudioUnit::SetChannelLayout (AudioUnitScope 			inScope, 
+OSStatus	CAAudioUnit::SetChannelLayout (AudioUnitScope 			inScope,
 											AudioUnitElement 		inEl,
 											const AudioChannelLayout		&inLayout,
 											UInt32					inSize)
@@ -868,7 +868,7 @@ OSStatus	CAAudioUnit::GetFormat (AudioUnitScope				inScope,
 {
 	UInt32 dataSize = sizeof (AudioStreamBasicDescription);
 	return AudioUnitGetProperty (AU(), kAudioUnitProperty_StreamFormat,
-								inScope, inEl, 
+								inScope, inEl,
 								&outFormat, &dataSize);
 }
 
@@ -878,7 +878,7 @@ OSStatus	CAAudioUnit::SetFormat (AudioUnitScope						inScope,
 {
 	return AudioUnitSetProperty (AU(), kAudioUnitProperty_StreamFormat,
 								inScope, inEl,
-								const_cast<AudioStreamBasicDescription*>(&inFormat), 
+								const_cast<AudioStreamBasicDescription*>(&inFormat),
 								sizeof (AudioStreamBasicDescription));
 }
 
@@ -888,7 +888,7 @@ OSStatus	CAAudioUnit::GetSampleRate (AudioUnitScope		inScope,
 {
 	UInt32 dataSize = sizeof (Float64);
 	return AudioUnitGetProperty (AU(), kAudioUnitProperty_SampleRate,
-								inScope, inEl, 
+								inScope, inEl,
 								&outRate, &dataSize);
 }
 
@@ -906,7 +906,7 @@ OSStatus	CAAudioUnit::SetSampleRate (AudioUnitScope		inScope,
 OSStatus	CAAudioUnit::SetSampleRate (Float64			inSampleRate)
 {
 	OSStatus result;
-	
+
 	UInt32 elCount;
 	ca_require_noerr (result = GetElementCount(kAudioUnitScope_Input, elCount), home);
 	if (elCount) {
@@ -921,7 +921,7 @@ OSStatus	CAAudioUnit::SetSampleRate (Float64			inSampleRate)
 			ca_require_noerr (result = SetSampleRate (kAudioUnitScope_Output, i, inSampleRate), home);
 		}
 	}
-	
+
 home:
 	return result;
 }
@@ -958,7 +958,7 @@ OSStatus		CAAudioUnit::IsElementCountWritable (AudioUnitScope inScope, bool &out
 	if (result)
 		return result;
 	outWritable = isWritable ? true : false;
-	return noErr;	
+	return noErr;
 }
 
 OSStatus		CAAudioUnit::GetElementCount (AudioUnitScope inScope, UInt32 &outCount) const
@@ -981,12 +981,12 @@ bool			CAAudioUnit::HasDynamicScope (AudioUnitScope inScope, SInt32 &outTotalNum
 	OSStatus result = GetPropertyInfo (kAudioUnitProperty_SupportedNumChannels,
 								kAudioUnitScope_Global, 0,
 								&dataSize, isWritable); //don't care if this is writable
-		
+
 		// AU has to explicitly tell us about this.
 	if (result) return false;
 
 	StackAUChannelInfo info (dataSize);
-	
+
 	result = GetProperty (kAudioUnitProperty_SupportedNumChannels,
 							kAudioUnitScope_Global, 0,
 							info.mChanInfo, &dataSize);
@@ -1003,9 +1003,9 @@ bool			CAAudioUnit::HasDynamicScope (AudioUnitScope inScope, SInt32 &outTotalNum
 
 -N 	(where N is less than -2), signifies the total channel count on the scope side (in or out)
 */
-bool	CAAudioUnit::ValidateDynamicScope (AudioUnitScope		inScope, 
-											SInt32				&outTotalNumChannels, 
-											const AUChannelInfo *info, 
+bool	CAAudioUnit::ValidateDynamicScope (AudioUnitScope		inScope,
+											SInt32				&outTotalNumChannels,
+											const AUChannelInfo *info,
 											UInt32				numInfo) const
 {
 	bool writable = false;
@@ -1024,48 +1024,48 @@ bool	CAAudioUnit::ValidateDynamicScope (AudioUnitScope		inScope,
 			outTotalNumChannels = -1;
 			return true;
 		}
-		
+
 		// ok lets now test our special case....
 		if (inScope == kAudioUnitScope_Input) {
 				// isn't dynamic on this side at least
 			if (info[i].inChannels >= 0)
 				continue;
-				
+
 			if (info[i].inChannels < -2) {
 				outTotalNumChannels = abs (info[i].inChannels);
 				return true;
 			}
-		} 
-		
+		}
+
 		else if (inScope == kAudioUnitScope_Output) {
 				// isn't dynamic on this side at least
 			if (info[i].outChannels >= 0)
 				continue;
-				
+
 			if (info[i].outChannels < -2) {
 				outTotalNumChannels = abs (info[i].outChannels);
 				return true;
 			}
-		} 
-		
+		}
+
 		else {
 			break; // wrong scope was specified
 		}
 	}
-	
-	return false;	
+
+	return false;
 }
 
-OSStatus	CAAudioUnit::ConfigureDynamicScope (AudioUnitScope 		inScope, 
-											UInt32 					inNumElements, 
-											UInt32 					*inChannelsPerElement, 
+OSStatus	CAAudioUnit::ConfigureDynamicScope (AudioUnitScope 		inScope,
+											UInt32 					inNumElements,
+											UInt32 					*inChannelsPerElement,
 											Float64 				inSampleRate)
 {
 	SInt32 numChannels = 0;
 	bool isDyamic = HasDynamicScope (inScope, numChannels);
 	if (isDyamic == false)
 		return kAudioUnitErr_InvalidProperty;
-	
+
 	//lets to a sanity check...
 	// if numChannels == -1, then it can do "any"...
 	if (numChannels > 0) {
@@ -1075,11 +1075,11 @@ OSStatus	CAAudioUnit::ConfigureDynamicScope (AudioUnitScope 		inScope,
 		if (count > numChannels)
 			return kAudioUnitErr_InvalidPropertyValue;
 	}
-	
+
 	OSStatus result = SetElementCount (inScope, inNumElements);
 	if (result)
 		return result;
-		
+
 	for (unsigned int i = 0; i < inNumElements; ++i) {
 		CAStreamBasicDescription desc;
 		result = GetFormat (inScope, i, desc);
@@ -1115,7 +1115,7 @@ bool		CAAudioUnit::GetBypass 		() const
 }
 
 OSStatus	CAAudioUnit::SetBypass 		(bool	inBypass) const
-{	
+{
 	UInt32 bypass = inBypass ? 1 : 0;
 	return AudioUnitSetProperty (AU(), kAudioUnitProperty_BypassEffect,
 								kAudioUnitScope_Global, 0,
@@ -1134,7 +1134,7 @@ OSStatus	CAAudioUnit::SetMaxFramesPerSlice (UInt32 inMaxFrames)
 {
 	return AudioUnitSetProperty (AU(), kAudioUnitProperty_MaximumFramesPerSlice,
 								 kAudioUnitScope_Global, 0,
-								 &inMaxFrames, sizeof (UInt32));	
+								 &inMaxFrames, sizeof (UInt32));
 }
 
 Float64		CAAudioUnit::Latency () const
@@ -1177,7 +1177,7 @@ OSStatus	CAAudioUnit::GetPresentPreset (AUPreset &outData) const
 								kAudioUnitScope_Global, 0,
 								&outData, &dataSize);
 #if !TARGET_OS_IPHONE
-#ifndef __LP64__ 
+#ifndef __LP64__
 	if (result == kAudioUnitErr_InvalidProperty) {
 		dataSize = sizeof(outData);
 		result = AudioUnitGetProperty (AU(), kAudioUnitProperty_CurrentPreset,
@@ -1194,7 +1194,7 @@ OSStatus	CAAudioUnit::GetPresentPreset (AUPreset &outData) const
 #endif
 	return result;
 }
-	
+
 OSStatus	CAAudioUnit::SetPresentPreset (AUPreset &inData)
 {
 	OSStatus result = AudioUnitSetProperty (AU(), kAudioUnitProperty_PresentPreset,
@@ -1220,7 +1220,7 @@ bool		CAAudioUnit::HasCustomView () const
 #ifndef __LP64__
 	result = GetPropertyInfo(kAudioUnitProperty_GetUIComponentList,
                                         kAudioUnitScope_Global, 0,
-                                        &dataSize, NULL);	
+                                        &dataSize, NULL);
 #endif
 	if (result || !dataSize) {
 		dataSize = 0;
@@ -1263,7 +1263,7 @@ OSStatus	CAAudioUnit::StartNote (MusicDeviceInstrumentID		inInstrument,
 									UInt32						inOffsetSampleFrame,
 									const MusicDeviceNoteParams * inParams)
 {
-	return mDataPtr ? mDataPtr->StartNote (inInstrument, inGroupID, outNoteInstanceID, inOffsetSampleFrame, inParams) 
+	return mDataPtr ? mDataPtr->StartNote (inInstrument, inGroupID, outNoteInstanceID, inOffsetSampleFrame, inParams)
 					: paramErr;
 }
 
@@ -1287,10 +1287,10 @@ OSStatus		CAAudioUnit::Render (AudioUnitRenderActionFlags 			* ioActionFlags,
 }
 
 extern "C" OSStatus
-AudioUnitProcess (					AudioUnit						inUnit, 
-									AudioUnitRenderActionFlags *	ioActionFlags, 
-									const AudioTimeStamp *			inTimeStamp, 
-									UInt32							inNumberFrames, 
+AudioUnitProcess (					AudioUnit						inUnit,
+									AudioUnitRenderActionFlags *	ioActionFlags,
+									const AudioTimeStamp *			inTimeStamp,
+									UInt32							inNumberFrames,
 									AudioBufferList *				ioData);
 
 OSStatus		CAAudioUnit::Process (AudioUnitRenderActionFlags 			& ioActionFlags,
@@ -1306,9 +1306,9 @@ OSStatus		CAAudioUnit::Process (AudioUnitRenderActionFlags 			& ioActionFlags,
 }
 
 extern "C" OSStatus
-AudioUnitProcessMultiple (			AudioUnit						inUnit, 
-									AudioUnitRenderActionFlags *	ioActionFlags, 
-									const AudioTimeStamp *			inTimeStamp, 
+AudioUnitProcessMultiple (			AudioUnit						inUnit,
+									AudioUnitRenderActionFlags *	ioActionFlags,
+									const AudioTimeStamp *			inTimeStamp,
 									UInt32							inNumberFrames,
 									UInt32							inNumberInputBufferLists,
 									const AudioBufferList **		inInputBufferLists,
@@ -1324,7 +1324,7 @@ OSStatus		CAAudioUnit::ProcessMultiple (AudioUnitRenderActionFlags 	& ioActionFl
 									AudioBufferList **						ioOutputBufferLists)
 {
 #if defined(__MAC_10_7) || defined(__IPHONE_4_0)
-	return AudioUnitProcessMultiple (AU(), &ioActionFlags, &inTimeStamp, inNumberFrames, 
+	return AudioUnitProcessMultiple (AU(), &ioActionFlags, &inTimeStamp, inNumberFrames,
 				inNumberInputBufferLists, inInputBufferLists, inNumberOutputBufferLists, ioOutputBufferLists);
 #else
 	return -4/*unimpErr*/;
@@ -1354,8 +1354,8 @@ CAAUChanHelper::CAAUChanHelper(const CAAudioUnit &inAU, AudioUnitScope inScope)
 	mNumEls = elCount;
 }
 
-CAAUChanHelper::CAAUChanHelper(UInt32 inMaxElems) 
-	: mNumEls(inMaxElems), mDidAllocate(false) 
+CAAUChanHelper::CAAUChanHelper(UInt32 inMaxElems)
+	: mNumEls(inMaxElems), mDidAllocate(false)
 {
 	if (inMaxElems > kStaticElCount) {
 		mChans = new UInt32[inMaxElems];
@@ -1372,8 +1372,8 @@ CAAUChanHelper::~CAAUChanHelper()
 	if (mDidAllocate) delete [] mChans;
 }
 
-CAAUChanHelper&		CAAUChanHelper::operator= (const CAAUChanHelper &c) 
-{ 
+CAAUChanHelper&		CAAUChanHelper::operator= (const CAAUChanHelper &c)
+{
 	if (mDidAllocate) delete [] mChans;
 	if (c.mDidAllocate) {
 		mChans = new UInt32[c.mNumEls];
@@ -1383,8 +1383,8 @@ CAAUChanHelper&		CAAUChanHelper::operator= (const CAAUChanHelper &c)
 		mChans = mStaticChans;
 	}
 	memcpy (mChans, c.mChans, c.mNumEls * sizeof(int));
-	
-	return *this; 
+
+	return *this;
 }
 
 
@@ -1393,7 +1393,7 @@ CAAUChanHelper&		CAAUChanHelper::operator= (const CAAUChanHelper &c)
 void		CAAudioUnit::Print (FILE* file) const
 {
 	fprintf (file, "AudioUnit:%p\n", AU());
-	if (IsValid()) { 
+	if (IsValid()) {
 		fprintf (file, "\tnode=%ld\t", (long)GetAUNode()); Comp().Print (file);
 	}
 }
@@ -1404,13 +1404,13 @@ static void *LoadGetComponentInstanceStorage (void *inst)
 {
 	typedef void* (*GetComponentInstanceStorageProc)(void* aComponentInstance);
 	static GetComponentInstanceStorageProc sGetComponentInstanceStorageProc = NULL;
-	
+
 	static int sDoCSLoad = 1;
 	if (sDoCSLoad) {
 		sDoCSLoad = 0;
 		void *theImage = dlopen("/System/Library/Frameworks/CoreServices.framework/CoreServices", RTLD_LAZY);
 		if (!theImage) return NULL;
-	
+
 		sGetComponentInstanceStorageProc = (GetComponentInstanceStorageProc) dlsym(theImage, "GetComponentInstanceStorage");
 	}
 	if (sGetComponentInstanceStorageProc)
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAAudioUnit.h b/libs/appleutility/CoreAudio/PublicUtility/CAAudioUnit.h
index 07a522e..d06a20c 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAAudioUnit.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAAudioUnit.h
@@ -2,14 +2,14 @@
      File: CAAudioUnit.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #ifndef __CAAudioUnit_h__
 #define __CAAudioUnit_h__
@@ -73,7 +73,7 @@ class CAAUChanHelper;
 // The destructor will NOT automatically close the AU down
 // This state should be managed by the Caller
 // once closed, the unit represented by this object is no longer valid
-// it is up to the user of this object to ensure its validity is in sync 
+// it is up to the user of this object to ensure its validity is in sync
 // if it is removed from a graph
 
 // methods that can significantly change the state of the AU (like its format) are
@@ -89,7 +89,7 @@ public:
 	typedef ChannelTagVector::iterator 			ChannelTagVectorIter;
 
 public:
-							CAAudioUnit () 
+							CAAudioUnit ()
 								: mDataPtr(0) {}
 
 							CAAudioUnit (const AudioUnit& inUnit);
@@ -105,28 +105,28 @@ public:
 
 	void					Close ();
 
-	
+
 	CAAudioUnit&			operator= (const CAAudioUnit& y);
 
 	bool					operator== (const CAAudioUnit& y) const;
 
 	bool					operator== (const AudioUnit& y) const;
 
-#pragma mark __State Management	
+#pragma mark __State Management
 	bool					IsValid () const;
-	
+
 	AudioUnit				AU() const;
 	operator AudioUnit () const { return AU(); }
 
 	const CAComponent&		Comp() const { return mComp; }
-	
+
 	const CAComponentDescription& Desc() const { return mComp.Desc(); }
-	
+
 	bool					FromAUGraph () const { return GetAUNode() != 0 && GetAUNode() != kCAAU_DoNotKnowIfAUNode; }
-	
+
 	AUNode					GetAUNode () const;
 	operator AUNode () const { return GetAUNode(); }
-	
+
 #pragma mark __API Wrapper
 	OSStatus				Initialize() const {
 								return AudioUnitInitialize(AU());
@@ -151,7 +151,7 @@ public:
 							}
 	OSStatus				SetParameter(AudioUnitParameterID inID, AudioUnitScope scope, AudioUnitElement element,
 											Float32 value, UInt32 bufferOffsetFrames=0);
-							
+
 	OSStatus				GetParameter(AudioUnitParameterID inID, AudioUnitScope scope, AudioUnitElement element,
 											Float32 &outValue) const;
 
@@ -165,7 +165,7 @@ public:
 												const AudioTimeStamp 		& inTimeStamp,
 												UInt32						inNumberFrames,
 												AudioBufferList				& ioData);
-	
+
 	OSStatus				ProcessMultiple (AudioUnitRenderActionFlags 	& ioActionFlags,
 												const AudioTimeStamp		& inTimeStamp,
 												UInt32						inNumberFrames,
@@ -174,7 +174,7 @@ public:
 												UInt32						inNumberOutputBufferLists,
 												AudioBufferList **			ioOutputBufferLists);
 
-	
+
 	OSStatus				Reset (AudioUnitScope scope, AudioUnitElement element)
 							{
 								return AudioUnitReset (AU(), scope, element);
@@ -188,7 +188,7 @@ public:
 							{
 								return AudioUnitAddRenderNotify (AU(), inProc, inProcRefCon);
 							}
-	
+
 	OSStatus				RemoveRenderNotify (AURenderCallback   inProc, void *inProcRefCon)
 							{
 								return AudioUnitRemoveRenderNotify (AU(), inProc, inProcRefCon);
@@ -200,24 +200,24 @@ public:
 							{
 								return AudioUnitAddPropertyListener (AU(), inID, inProc, inProcRefCon);
 							}
-	
+
 	OSStatus				RemovePropertyListener (AudioUnitPropertyID				inID,
 													AudioUnitPropertyListenerProc	inProc,
 													void *							inProcUserData);
-	
+
 	OSStatus				MIDIEvent (UInt32					inStatus,
 										UInt32					inData1,
 										UInt32					inData2,
 										UInt32					inOffsetSampleFrame);
-								
+
 								// uses the default VoiceForGroup value - this is the normal case
 	OSStatus				StartNote (MusicDeviceGroupID		inGroupID,
 									NoteInstanceID *			outNoteInstanceID,
 									UInt32						inOffsetSampleFrame,
 									const MusicDeviceNoteParams * inParams)
 							{
-								return StartNote (kMusicNoteEvent_UseGroupInstrument, 
-													inGroupID, outNoteInstanceID, 
+								return StartNote (kMusicNoteEvent_UseGroupInstrument,
+													inGroupID, outNoteInstanceID,
 													inOffsetSampleFrame, inParams);
 							}
 
@@ -241,45 +241,45 @@ public:
 							{
 								return CanDo (inChannelsInOut, inChannelsInOut);
 							}
-							
-	bool					CanDo (		int 				inChannelsIn, 
+
+	bool					CanDo (		int 				inChannelsIn,
 										int 				inChannelsOut) const;
-		
+
 		// This version does a more thorough test for ANY AU with ANY ins/outs
 		// you pass in the channel helper (for the current element count on that scope)
-		
+
 	bool					CanDo (		const CAAUChanHelper		&input,
 										const CAAUChanHelper		&output) const;
-	
+
 	bool					SupportsNumChannels () const;
 
-	bool					HasChannelLayouts (AudioUnitScope 		inScope, 
+	bool					HasChannelLayouts (AudioUnitScope 		inScope,
 											AudioUnitElement 		inEl) const;
-		
+
     int                                     GetChannelInfo (AUChannelInfo** chaninfo, UInt32& cnt);
 	OSStatus				GetChannelLayoutTags (AudioUnitScope 	inScope,
 									AudioUnitElement 				inEl,
 									ChannelTagVector				&outChannelVector) const;
-	
-	bool					HasChannelLayout (AudioUnitScope 		inScope, 
+
+	bool					HasChannelLayout (AudioUnitScope 		inScope,
 											AudioUnitElement 		inEl) const;
-	
+
 	OSStatus				GetChannelLayout (AudioUnitScope 		inScope,
 											AudioUnitElement 		inEl,
-											CAAudioChannelLayout	&outLayout) const;	
+											CAAudioChannelLayout	&outLayout) const;
 
-	OSStatus				SetChannelLayout (AudioUnitScope 		inScope, 
+	OSStatus				SetChannelLayout (AudioUnitScope 		inScope,
 											AudioUnitElement 		inEl,
 											const CAAudioChannelLayout	&inLayout);
 
-	OSStatus				SetChannelLayout (AudioUnitScope 		inScope, 
+	OSStatus				SetChannelLayout (AudioUnitScope 		inScope,
 											AudioUnitElement 		inEl,
 											const AudioChannelLayout		&inLayout,
 											UInt32					inSize);
-											
+
 	OSStatus				ClearChannelLayout (AudioUnitScope		inScope,
 											AudioUnitElement		inEl);
-												
+
 	OSStatus				GetFormat (AudioUnitScope					inScope,
 											AudioUnitElement			inEl,
 											AudioStreamBasicDescription	&outFormat) const;
@@ -298,16 +298,16 @@ public:
 
 	// this sets the sample rate on all in/out buses of the AU
 	OSStatus				SetSampleRate (Float64				inSampleRate);
-	
+
 	OSStatus				NumberChannels (AudioUnitScope		inScope,
 											AudioUnitElement	inEl,
 											UInt32				&outChans) const;
 
 	OSStatus				GetNumberChannels (AudioUnitScope	inScope,
 											AudioUnitElement	inEl,
-											UInt32				&outChans) const 
-							{ 
-								return NumberChannels (inScope, inEl, outChans); 
+											UInt32				&outChans) const
+							{
+								return NumberChannels (inScope, inEl, outChans);
 							}
 
 	OSStatus				SetNumberChannels (AudioUnitScope	inScope,
@@ -319,28 +319,28 @@ public:
 	OSStatus				GetElementCount (AudioUnitScope 	inScope, UInt32 &outCount) const;
 
 	OSStatus				SetElementCount (AudioUnitScope		inScope, UInt32 inCount);
-		
+
 		// value of -1 for outTotalNumChannels indicates no restriction on num channels
-		// for ex. the Matrix Mixer satisfies this (its in/out element count is writable, and can be set to 
+		// for ex. the Matrix Mixer satisfies this (its in/out element count is writable, and can be set to
 		// any number of channels.
 		// outTotalNumChannels is only valid if method returns true...
 	bool					HasDynamicInputs (SInt32 &outTotalNumChannels) const
 							{
 								return HasDynamicScope (kAudioUnitScope_Input, outTotalNumChannels);
 							}
-							
+
 	bool					HasDynamicOutputs (SInt32 &outTotalNumChannels) const
 							{
 								return HasDynamicScope (kAudioUnitScope_Output, outTotalNumChannels);
 							}
-	
+
 		// here, if the in (or out) elements are dynamic, then you supply the number of elements
 		// you want on in (or out) scope, and the number of channels on each consecutive element
 	OSStatus				ConfigureDynamicInput (UInt32 inNumElements, UInt32 *inChannelsPerElement, Float64 inSampleRate)
 							{
 								return ConfigureDynamicScope (kAudioUnitScope_Input, inNumElements, inChannelsPerElement, inSampleRate);
 							}
-							
+
 	OSStatus				ConfigureDynamicOutput (UInt32 inNumElements, UInt32 *inChannelsPerElement, Float64 inSampleRate)
 							{
 								return ConfigureDynamicScope (kAudioUnitScope_Output, inNumElements, inChannelsPerElement, inSampleRate);
@@ -351,57 +351,57 @@ public:
 	bool					GetBypass 		() const;
 
 	OSStatus				SetBypass 		(bool				inBypass) const;
-	
+
 	OSStatus				GetMaxFramesPerSlice (UInt32& outMaxFrames) const;
-	
+
 	OSStatus				SetMaxFramesPerSlice (UInt32 inMaxFrames);
-	
+
 	Float64					Latency () const;
-	
+
 		// these calls just deal with the global preset state
 		// you could rescope them to deal with presets on the part scope
 	OSStatus				GetAUPreset (CFPropertyListRef &outData) const;
 
 	OSStatus				SetAUPreset (CFPropertyListRef &inData);
-	
+
 	OSStatus				SetAUPresetFromDocument (CFPropertyListRef &inData);
 
 	OSStatus				GetPresentPreset (AUPreset &outData) const;
-	
+
 	OSStatus				SetPresentPreset (AUPreset &inData);
-	
+
 	bool					HasCustomView () const;
-	
-#pragma mark __Print	
+
+#pragma mark __Print
 	void					Print () const { Print (stdout); }
 	void					Print (FILE* file) const;
-	
+
 private:
 	CAComponent				mComp;
-	
+
 	class AUState;
 	AUState*		mDataPtr;
-		
+
 		// this can throw - so wrap this up in a static that returns a result code...
 	CAAudioUnit (const CAComponent& inComp);
 
 	bool				HasDynamicScope (AudioUnitScope inScope, SInt32 &outTotalNumChannels) const;
-	OSStatus			ConfigureDynamicScope (AudioUnitScope   inScope, 
-											UInt32				inNumElements, 
-											UInt32				*inChannelsPerElement, 
+	OSStatus			ConfigureDynamicScope (AudioUnitScope   inScope,
+											UInt32				inNumElements,
+											UInt32				*inChannelsPerElement,
 											Float64				inSampleRate);
-	bool				ValidateChannelPair (int 				inChannelsIn, 
+	bool				ValidateChannelPair (int 				inChannelsIn,
 											int 				inChannelsOut,
 											const AUChannelInfo * info,
 											UInt32				numChanInfo) const;
-											
-	bool				ValidateDynamicScope (AudioUnitScope	inScope, 
-											SInt32				&outTotalNumChannels, 
-											const AUChannelInfo * info, 
+
+	bool				ValidateDynamicScope (AudioUnitScope	inScope,
+											SInt32				&outTotalNumChannels,
+											const AUChannelInfo * info,
 											UInt32 numInfo) const;
-	bool				CheckOneSide (const CAAUChanHelper		&inHelper, 
-											bool				checkOutput, 
-											const AUChannelInfo *info, 
+	bool				CheckOneSide (const CAAUChanHelper		&inHelper,
+											bool				checkOutput,
+											const AUChannelInfo *info,
 											UInt32				numInfo) const;
 	enum {
 			kCAAU_DoNotKnowIfAUNode = -1
@@ -410,24 +410,24 @@ private:
 
 class CAAUChanHelper {
 public:
-				CAAUChanHelper() 
-					: mChans(mStaticChans), mNumEls(0), mDidAllocate(false) 
+				CAAUChanHelper()
+					: mChans(mStaticChans), mNumEls(0), mDidAllocate(false)
 				{
 					memset (mChans, 0, sizeof(UInt32) * kStaticElCount);
 				}
 				CAAUChanHelper(UInt32 inMaxElems);
 				CAAUChanHelper(const CAAudioUnit &inAU, AudioUnitScope inScope);
-				CAAUChanHelper (const CAAUChanHelper &c) 
-					: mChans(mStaticChans), mNumEls(0), mDidAllocate(false) 
+				CAAUChanHelper (const CAAUChanHelper &c)
+					: mChans(mStaticChans), mNumEls(0), mDidAllocate(false)
 					{ *this = c; }
-				
+
 				~CAAUChanHelper();
 
 	CAAUChanHelper& operator= (const CAAUChanHelper &c);
 
 	UInt32		* mChans;
 	UInt32		mNumEls;
-	
+
 private:
 	enum {
 		kStaticElCount = 8
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAAudioUnitOutputCapturer.h b/libs/appleutility/CoreAudio/PublicUtility/CAAudioUnitOutputCapturer.h
index 42bebfa..0053b18 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAAudioUnitOutputCapturer.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAAudioUnitOutputCapturer.h
@@ -2,14 +2,14 @@
      File: CAAudioUnitOutputCapturer.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #ifndef __CAAudioUnitOutputCapturer_h__
 #define __CAAudioUnitOutputCapturer_h__
@@ -77,13 +77,13 @@ public:
 		mAudioUnit(au),
 		mExtAudioFile(NULL),
 		mBusNumber (busNumber)
-	{	
+	{
 		CFShow(outputFileURL);
 		OSStatus err = ExtAudioFileCreateWithURL(outputFileURL, fileType, &format, NULL, kAudioFileFlags_EraseFile, &mExtAudioFile);
 		if (!err)
 			mFileOpen = true;
 	}
-	
+
 	void	Start() {
 		if (mFileOpen) {
 			if (!mClientFormatSet) {
@@ -97,19 +97,19 @@ public:
 			AudioUnitAddRenderNotify(mAudioUnit, RenderCallback, this);
 		}
 	}
-	
+
 	void	Stop() {
 		if (mFileOpen)
 			AudioUnitRemoveRenderNotify(mAudioUnit, RenderCallback, this);
 	}
-	
+
 	void	Close() {
 		if (mExtAudioFile) {
 			ExtAudioFileDispose(mExtAudioFile);
 			mExtAudioFile = NULL;
 		}
 	}
-	
+
 	~CAAudioUnitOutputCapturer() {
 		Close();
 	}
@@ -132,7 +132,7 @@ private:
 		}
 		return noErr;
 	}
-	
+
 	bool				mFileOpen;
 	bool				mClientFormatSet;
 	AudioUnit			mAudioUnit;
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAAudioValueRange.cpp b/libs/appleutility/CoreAudio/PublicUtility/CAAudioValueRange.cpp
index 203e437..50faf8f 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAAudioValueRange.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAAudioValueRange.cpp
@@ -2,14 +2,14 @@
      File: CAAudioValueRange.cpp
  Abstract: CAAudioValueRange.h
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 //==================================================================================================
 //	Includes
@@ -80,7 +80,7 @@ Float64 CAAudioValueRange::PickCommonSampleRate(const AudioValueRange& inRange)
 	//  if no common rates can be found. It assumes that inRange contains a continuous range of
 	//  sample rates.
 	Float64 theAnswer = inRange.mMaximum;
-	
+
 	if(ContainsValue(inRange, 44100.0))
 	{
 		theAnswer = 44100.0;
@@ -129,7 +129,7 @@ Float64 CAAudioValueRange::PickCommonSampleRate(const AudioValueRange& inRange)
 	{
 		theAnswer = 8000.0;
 	}
-	
+
 	return theAnswer;
 }
 
@@ -173,50 +173,50 @@ void	CAAudioValueRange_ComputeUnion(const AudioValueRange& inRange, const CAAudi
 {
 	//	this method assumes that the ranges in inRangeList are disjoint and that they are sorted from low to high and
 	outUnion.clear();
-	
+
 	//	start at the beginning of inRangeList
 	CAAudioValueRangeList::const_iterator theIterator = inRangeList.begin();
-	
+
 	//	iterate through inRangeList and add all the ranges that are strictly less than inRange
 	while((theIterator != inRangeList.end()) && CAAudioValueRange::IsStrictlyLessThan(*theIterator, inRange))
 	{
 		//	put this range in the union
 		outUnion.push_back(*theIterator);
-		
+
 		//	go to the next one
 		std::advance(theIterator, 1);
 	}
-	
+
 	if(theIterator != inRangeList.end())
 	{
 		if(!CAAudioValueRange::IsStrictlyGreaterThan(*theIterator, inRange))
 		{
 			//	inRange intersects the range that theIterator points at, but might actually intersect several contiguous ranges
-			
+
 			//	initialize the starting point, noting that we can skip the current one since we already know it's in the intersection
 			CAAudioValueRangeList::const_iterator theGreaterIterator = theIterator;
 			std::advance(theGreaterIterator, 1);
-			
+
 			//	iterate until we find a range that is strictly greater than inRange
 			while((theGreaterIterator != inRangeList.end()) && !CAAudioValueRange::IsStrictlyGreaterThan(*theGreaterIterator, inRange))
 			{
 				//	go to the next one
 				std::advance(theGreaterIterator, 1);
 			}
-			
+
 			//	theGreaterIterator now points at either one past the highest range in the intersection or the end of the vector
 			//	Either way, we have to adjust it to point at the true highest range in the intersection
 			std::advance(theGreaterIterator, -1);
-			
+
 			//	now theIterator points at the lowest range in the intersection and theGreaterIterator points at the highest
 			//	so we can compute the coagulated range
 			AudioValueRange theCoagulation;
 			theCoagulation.mMinimum = std::min(theIterator->mMinimum, inRange.mMinimum);
 			theCoagulation.mMaximum = std::max(theGreaterIterator->mMaximum, inRange.mMaximum);
-			
+
 			//	add the coagulation to the union
 			outUnion.push_back(theCoagulation);
-			
+
 			//	adjust theIterator to point at the next range for processing
 			theIterator = theGreaterIterator;
 			std::advance(theIterator, 1);
@@ -226,13 +226,13 @@ void	CAAudioValueRange_ComputeUnion(const AudioValueRange& inRange, const CAAudi
 			//	the range theIterator points at is strictly greater than inRange, so insert inRange in front of it and we're done
 			outUnion.push_back(inRange);
 		}
-			
+
 		//	we need to now copy the remaining higher ranges in inRangeList into the union
 		while(theIterator != inRangeList.end())
 		{
 			//	put this range in the union
 			outUnion.push_back(*theIterator);
-			
+
 			//	go to the next one
 			std::advance(theIterator, 1);
 		}
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAAudioValueRange.h b/libs/appleutility/CoreAudio/PublicUtility/CAAudioValueRange.h
index e17c457..c9f94ea 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAAudioValueRange.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAAudioValueRange.h
@@ -2,14 +2,14 @@
      File: CAAudioValueRange.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #if !defined(__CAAudioValueRange_h__)
 #define __CAAudioValueRange_h__
@@ -104,7 +104,7 @@ public:
 			return x.mMinimum < y.mMinimum;
 		}
 	};
-	
+
 };
 
 inline bool	operator<(const AudioValueRange& x, const AudioValueRange& y)								{ return x.mMinimum < y.mMinimum; }
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAAutoDisposer.h b/libs/appleutility/CoreAudio/PublicUtility/CAAutoDisposer.h
index 2da2415..eef4762 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAAutoDisposer.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAAutoDisposer.h
@@ -2,14 +2,14 @@
      File: CAAutoDisposer.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #if !defined(__CAPtr_h__)
 #define __CAPtr_h__
@@ -78,10 +78,10 @@ inline void* CA_realloc(void* old, size_t size)
 #endif
 
 inline void* CA_calloc(size_t n, size_t size)
-{	
+{
 	// ensure that multiplication will not overflow
 	if (n && UINTPTR_MAX / n < size) throw std::bad_alloc();
-	
+
 	size_t nsize = n*size;
 	void* p = malloc(nsize);
 	if (!p && nsize) throw std::bad_alloc();
@@ -107,87 +107,87 @@ private:
 	T* ptr_;
 
 public:
-	
+
 	CAAutoFree() : ptr_(0) {}
-	
+
 	explicit CAAutoFree(T* ptr) : ptr_(ptr) {}
-	
+
 	template<typename U>
 	CAAutoFree(CAAutoFree<U>& that) : ptr_(that.release()) {} // take ownership
 
 	// C++ std says: a template constructor is never a copy constructor
 	CAAutoFree(CAAutoFree<T>& that) : ptr_(that.release()) {} // take ownership
 
-	CAAutoFree(size_t n, bool clear = false) 
+	CAAutoFree(size_t n, bool clear = false)
 		// this becomes an ambiguous call if n == 0
-		: ptr_(0) 
+		: ptr_(0)
 		{
 			size_t maxItems = ~size_t(0) / sizeof(T);
-			if (n > maxItems) 
+			if (n > maxItems)
 				throw std::bad_alloc();
 
 			ptr_ = static_cast<T*>(clear ? CA_calloc(n, sizeof(T)) : CA_malloc(n * sizeof(T)));
 		}
-	
+
 	~CAAutoFree() { free(); }
-	
-	void alloc(size_t numItems, bool clear = false) 
+
+	void alloc(size_t numItems, bool clear = false)
 	{
 		size_t maxItems = ~size_t(0) / sizeof(T);
 		if (numItems > maxItems) throw std::bad_alloc();
-		
+
 		free();
 		ptr_ = static_cast<T*>(clear ? CA_calloc(numItems, sizeof(T)) : CA_malloc(numItems * sizeof(T)));
 	}
-	
-	void allocBytes(size_t numBytes, bool clear = false) 
+
+	void allocBytes(size_t numBytes, bool clear = false)
 	{
 		free();
 		ptr_ = static_cast<T*>(clear ? CA_calloc(1, numBytes) : CA_malloc(numBytes));
 	}
-	
-	void reallocBytes(size_t numBytes) 
+
+	void reallocBytes(size_t numBytes)
 	{
 		ptr_ = static_cast<T*>(CA_realloc(ptr_, numBytes));
 	}
 
-	void reallocItems(size_t numItems) 
+	void reallocItems(size_t numItems)
 	{
 		size_t maxItems = ~size_t(0) / sizeof(T);
 		if (numItems > maxItems) throw std::bad_alloc();
-		
+
 		ptr_ = static_cast<T*>(CA_realloc(ptr_, numItems * sizeof(T)));
 	}
-	
+
 	template <typename U>
-	CAAutoFree& operator=(CAAutoFree<U>& that) 
-	{ 
+	CAAutoFree& operator=(CAAutoFree<U>& that)
+	{
 		set(that.release());	// take ownership
 		return *this;
 	}
-	
-	CAAutoFree& operator=(CAAutoFree& that) 
-	{ 
+
+	CAAutoFree& operator=(CAAutoFree& that)
+	{
 		set(that.release());	// take ownership
 		return *this;
 	}
-	
-	CAAutoFree& operator=(T* ptr) 
+
+	CAAutoFree& operator=(T* ptr)
 	{
-		set(ptr); 
+		set(ptr);
 		return *this;
 	}
-	
+
 	template <typename U>
-	CAAutoFree& operator=(U* ptr) 
+	CAAutoFree& operator=(U* ptr)
 	{
-		set(ptr); 
+		set(ptr);
 		return *this;
 	}
-		
+
 	T& operator*() const { return *ptr_; }
 	T* operator->() const { return ptr_; }
-	
+
 	T* operator()() const { return ptr_; }
 	T* get() const { return ptr_; }
 	operator T*() const { return ptr_; }
@@ -196,15 +196,15 @@ public:
 	bool operator!=(CAAutoFree const& that) const { return ptr_ != that.ptr_; }
 	bool operator==(T* ptr) const { return ptr_ == ptr; }
 	bool operator!=(T* ptr) const { return ptr_ != ptr; }
-		
-	T* release() 
+
+	T* release()
 	{
 		// release ownership
 		T* result = ptr_;
 		ptr_ = 0;
 		return result;
 	}
-	
+
 	void set(T* ptr)
 	{
 		if (ptr != ptr_)
@@ -213,8 +213,8 @@ public:
 			ptr_ = ptr;
 		}
 	}
-	
-	void free() 
+
+	void free()
 	{
 		set(0);
 	}
@@ -237,7 +237,7 @@ public:
 	template<typename U>
 	operator CAAutoFree<U>()
 		{ return CAAutoFree<U>(release()); }
-	
+
 };
 
 
@@ -251,61 +251,61 @@ public:
 	CAAutoDelete() : ptr_(0) {}
 
 	explicit CAAutoDelete(T* ptr) : ptr_(ptr) {}
-	
+
 	template<typename U>
 	CAAutoDelete(CAAutoDelete<U>& that) : ptr_(that.release()) {} // take ownership
 
 	// C++ std says: a template constructor is never a copy constructor
 	CAAutoDelete(CAAutoDelete<T>& that) : ptr_(that.release()) {} // take ownership
-	
+
 	~CAAutoDelete() { free(); }
-	
+
 	template <typename U>
-	CAAutoDelete& operator=(CAAutoDelete<U>& that) 
-	{ 
+	CAAutoDelete& operator=(CAAutoDelete<U>& that)
+	{
 		set(that.release());	// take ownership
 		return *this;
 	}
-	
-	CAAutoDelete& operator=(CAAutoDelete& that) 
-	{ 
+
+	CAAutoDelete& operator=(CAAutoDelete& that)
+	{
 		set(that.release());	// take ownership
 		return *this;
 	}
-	
-	CAAutoDelete& operator=(T* ptr) 
+
+	CAAutoDelete& operator=(T* ptr)
 	{
-		set(ptr); 
+		set(ptr);
 		return *this;
 	}
-	
+
 	template <typename U>
-	CAAutoDelete& operator=(U* ptr) 
+	CAAutoDelete& operator=(U* ptr)
 	{
-		set(ptr); 
+		set(ptr);
 		return *this;
 	}
-		
+
 	T& operator*() const { return *ptr_; }
 	T* operator->() const { return ptr_; }
-	
+
 	T* operator()() const { return ptr_; }
 	T* get() const { return ptr_; }
 	operator T*() const { return ptr_; }
-	
+
 	bool operator==(CAAutoDelete const& that) const { return ptr_ == that.ptr_; }
 	bool operator!=(CAAutoDelete const& that) const { return ptr_ != that.ptr_; }
 	bool operator==(T* ptr) const { return ptr_ == ptr; }
 	bool operator!=(T* ptr) const { return ptr_ != ptr; }
-		
-	T* release() 
+
+	T* release()
 	{
 		// release ownership
 		T* result = ptr_;
 		ptr_ = 0;
 		return result;
 	}
-	
+
 	void set(T* ptr)
 	{
 		if (ptr != ptr_)
@@ -314,8 +314,8 @@ public:
 			ptr_ = ptr;
 		}
 	}
-	
-	void free() 
+
+	void free()
 	{
 		set(0);
 	}
@@ -338,7 +338,7 @@ public:
 	template<typename U>
 	operator CAAutoFree<U>()
 		{ return CAAutoFree<U>(release()); }
-	
+
 };
 
 
@@ -352,53 +352,53 @@ public:
 	CAAutoArrayDelete() : ptr_(0) {}
 
 	explicit CAAutoArrayDelete(T* ptr) : ptr_(ptr) {}
-	
+
 	template<typename U>
 	CAAutoArrayDelete(CAAutoArrayDelete<U>& that) : ptr_(that.release()) {} // take ownership
 
 	// C++ std says: a template constructor is never a copy constructor
 	CAAutoArrayDelete(CAAutoArrayDelete<T>& that) : ptr_(that.release()) {} // take ownership
-	
+
 	// this becomes an ambiguous call if n == 0
 	CAAutoArrayDelete(size_t n) : ptr_(new T[n]) {}
-	
+
 	~CAAutoArrayDelete() { free(); }
-	
-	void alloc(size_t numItems) 
+
+	void alloc(size_t numItems)
 	{
 		free();
 		ptr_ = new T [numItems];
 	}
-	
+
 	template <typename U>
-	CAAutoArrayDelete& operator=(CAAutoArrayDelete<U>& that) 
-	{ 
+	CAAutoArrayDelete& operator=(CAAutoArrayDelete<U>& that)
+	{
 		set(that.release());	// take ownership
 		return *this;
 	}
-	
-	CAAutoArrayDelete& operator=(CAAutoArrayDelete& that) 
-	{ 
+
+	CAAutoArrayDelete& operator=(CAAutoArrayDelete& that)
+	{
 		set(that.release());	// take ownership
 		return *this;
 	}
-	
-	CAAutoArrayDelete& operator=(T* ptr) 
+
+	CAAutoArrayDelete& operator=(T* ptr)
 	{
-		set(ptr); 
+		set(ptr);
 		return *this;
 	}
-	
+
 	template <typename U>
-	CAAutoArrayDelete& operator=(U* ptr) 
+	CAAutoArrayDelete& operator=(U* ptr)
 	{
-		set(ptr); 
+		set(ptr);
 		return *this;
 	}
-		
+
 	T& operator*() const { return *ptr_; }
 	T* operator->() const { return ptr_; }
-	
+
 	T* operator()() const { return ptr_; }
 	T* get() const { return ptr_; }
 	operator T*() const { return ptr_; }
@@ -407,15 +407,15 @@ public:
 	bool operator!=(CAAutoArrayDelete const& that) const { return ptr_ != that.ptr_; }
 	bool operator==(T* ptr) const { return ptr_ == ptr; }
 	bool operator!=(T* ptr) const { return ptr_ != ptr; }
-		
-	T* release() 
+
+	T* release()
 	{
 		// release ownership
 		T* result = ptr_;
 		ptr_ = 0;
 		return result;
 	}
-	
+
 	void set(T* ptr)
 	{
 		if (ptr != ptr_)
@@ -424,8 +424,8 @@ public:
 			ptr_ = ptr;
 		}
 	}
-	
-	void free() 
+
+	void free()
 	{
 		set(0);
 	}
@@ -448,7 +448,7 @@ public:
 	template<typename U>
 	operator CAAutoArrayDelete<U>()
 		{ return CAAutoFree<U>(release()); }
-	
+
 };
 
 
@@ -493,7 +493,7 @@ void sink(CAAutoFree<char> captr)
 }
 
 
-int main (int argc, char * const argv[]) 
+int main (int argc, char * const argv[])
 {
 
 	CAAutoFree<char> captr(source());
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CABitOperations.h b/libs/appleutility/CoreAudio/PublicUtility/CABitOperations.h
index 21cb516..8394fbf 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CABitOperations.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CABitOperations.h
@@ -2,14 +2,14 @@
      File: CABitOperations.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #ifndef _CABitOperations_h_
 #define _CABitOperations_h_
@@ -57,8 +57,8 @@
 #include <TargetConditionals.h>
 
 // return whether a number is a power of two
-inline UInt32 IsPowerOfTwo(UInt32 x) 
-{ 
+inline UInt32 IsPowerOfTwo(UInt32 x)
+{
 	return (x & (x-1)) == 0;
 }
 
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CABool.h b/libs/appleutility/CoreAudio/PublicUtility/CABool.h
index 719fd74..0d74961 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CABool.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CABool.h
@@ -2,14 +2,14 @@
      File: CABool.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #if !defined(__CABool_h__)
 #define __CABool_h__
@@ -72,17 +72,17 @@ public:
 					CABool(bool inValue) : mValue(inValue ? 1 : 0) {}
 					CABool(const CABool& inValue) : mValue(inValue.mValue) {}
 					~CABool() {}
-					
+
 	CABool&			operator=(bool inValue) { mValue = inValue; return *this; }
 	CABool&			operator=(const CABool& inValue) { mValue = inValue.mValue; return *this; }
-	
+
 					operator bool() const { ThrowIf(mValue == -1, CAException('nope'), "CABool: uninitialized"); return mValue != 0; }
 	bool			IsInitialized() const { return mValue != -1; }
 	void			Uninitialize() { mValue = -1; }
 
 private:
 	SInt32			mValue;
-	
+
 					CABool(const void*);	// prevent accidental instantiation with a pointer via bool constructor
 };
 
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CABufferList.cpp b/libs/appleutility/CoreAudio/PublicUtility/CABufferList.cpp
index 3249013..f43cdaa 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CABufferList.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CABufferList.cpp
@@ -2,14 +2,14 @@
      File: CABufferList.cpp
  Abstract: CABufferList.h
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #include "CABufferList.h"
 #include "CAByteOrder.h"
@@ -58,7 +58,7 @@ void		CABufferList::AllocateBuffers(UInt32 nBytes)
 	UInt32 memorySize = nBytes * mABL.mNumberBuffers;
 	Byte *newMemory = new Byte[memorySize], *p = newMemory;
 	memset(newMemory, 0, memorySize);	// get page faults now, not later
-	
+
 	AudioBuffer *buf = mABL.mBuffers;
 	for (UInt32 i = mABL.mNumberBuffers; i--; ++buf) {
 		if (buf->mData != NULL && buf->mDataByteSize > 0)
@@ -84,7 +84,7 @@ void		CABufferList::AllocateBuffersAndCopyFrom(UInt32 nBytes, CABufferList *inSr
 	}
 	inSetPtrList->VerifyNotTrashingOwnedBuffer();
 	UInt32 fromByteSize = inSrcList->GetNumBytes();
-	
+
 	if (mABL.mNumberBuffers > 1)
 		// align successive buffers for Altivec and to take alternating
 		// cache line hits by spacing them by odd multiples of 16
@@ -92,7 +92,7 @@ void		CABufferList::AllocateBuffersAndCopyFrom(UInt32 nBytes, CABufferList *inSr
 	UInt32 memorySize = nBytes * mABL.mNumberBuffers;
 	Byte *newMemory = new Byte[memorySize], *p = newMemory;
 	memset(newMemory, 0, memorySize);	// make buffer "hot"
-	
+
 	AudioBuffer *buf = mABL.mBuffers;
 	AudioBuffer *ptrBuf = inSetPtrList->mABL.mBuffers;
 	AudioBuffer *srcBuf = inSrcList->mABL.mBuffers;
@@ -126,7 +126,7 @@ void		CABufferList::DeallocateBuffers()
 		mBufferMemory = NULL;
 		mBufferCapacity = 0;
 	}
-    
+
 }
 
 static void show(const AudioBufferList &abl, int framesToPrint, int wordSize, const char *label, const char *fmtstr=NULL)
@@ -193,7 +193,7 @@ void CAShowAudioBufferList(const AudioBufferList &abl, int framesToPrint, const
 	CAStreamBasicDescription fmt(asbd);
 	int wordSize = 1;
 	char fmtstr[80] = { 0 };
-	
+
 	if (fmt.mFormatID == kAudioFormatLinearPCM) {
 		if (fmt.mFormatFlags & kLinearPCMFormatFlagIsFloat) {
 			if (fmt.mBitsPerChannel == 32) {
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CABufferList.h b/libs/appleutility/CoreAudio/PublicUtility/CABufferList.h
index 72c93f8..67bf272 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CABufferList.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CABufferList.h
@@ -2,14 +2,14 @@
      File: CABufferList.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #ifndef __CABufferList_h__
 #define __CABufferList_h__
@@ -61,7 +61,7 @@ extern "C" int CrashIfClientProvidedBogusAudioBufferList(const AudioBufferList *
 
 	This class is designed for use in non-simplistic cases. For AudioUnits, AUBufferList
 	is preferred.
-	
+
 	CABufferList can be used in one of two ways:
 		- as mutable pointers into non-owned memory
 		- as an immutable array of buffers (owns its own memory).
@@ -107,20 +107,20 @@ public:
 		if (mBufferMemory)
 			delete[] mBufferMemory;
 	}
-	
+
 	const char *				Name() { return mName; }
-	
+
 	const AudioBufferList &		GetBufferList() const { return mABL; }
-	
+
 	AudioBufferList &			GetModifiableBufferList() { return _GetBufferList(); }
-	
+
 	UInt32		GetNumberBuffers() const { return mABL.mNumberBuffers; }
-	
+
 	UInt32		GetNumBytes() const
 	{
 		return mABL.mBuffers[0].mDataByteSize;
 	}
-	
+
 	void		SetBytes(UInt32 nBytes, void *data)
 	{
 		VerifyNotTrashingOwnedBuffer();
@@ -128,7 +128,7 @@ public:
 		mABL.mBuffers[0].mDataByteSize = nBytes;
 		mABL.mBuffers[0].mData = data;
 	}
-	
+
 	void		CopyAllFrom(CABufferList *srcbl, CABufferList *ptrbl)
 					// copies bytes from srcbl
 					// make ptrbl reflect the length copied
@@ -150,17 +150,17 @@ public:
 		if (srcbl != ptrbl)
 			srcbl->BytesConsumed(nBytes);
 	}
-	
+
 	// copies data from another buffer list.
 	void		CopyDataFrom(const AudioBufferList &other)
 	{
 		for (unsigned i = 0; i < other.mNumberBuffers; ++i) {
 			XAssert(mBufferCapacity == 0 || other.mBuffers[i].mDataByteSize <= mBufferCapacity);
-			memcpy(mABL.mBuffers[i].mData, other.mBuffers[i].mData, 
+			memcpy(mABL.mBuffers[i].mData, other.mBuffers[i].mData,
 				mABL.mBuffers[i].mDataByteSize = other.mBuffers[i].mDataByteSize);
 		}
 	}
-	
+
 	void		AppendFrom(CABufferList *blp, UInt32 nBytes)
 	{
 		// this may mutate a buffer that owns memory.
@@ -173,7 +173,7 @@ public:
 		}
 		blp->BytesConsumed(nBytes);
 	}
-	
+
 	void		PadWithZeroes(UInt32 desiredBufferSize)
 					// for cases where an algorithm (e.g. SRC) requires some
 					// padding to create silence following end-of-file
@@ -186,7 +186,7 @@ public:
 			buf->mDataByteSize = desiredBufferSize;
 		}
 	}
-	
+
 	void		SetToZeroes(UInt32 nBytes)
 	{
 		XAssert(mBufferCapacity == 0 || nBytes <= mBufferCapacity);
@@ -196,23 +196,23 @@ public:
 			buf->mDataByteSize = nBytes;
 		}
 	}
-	
+
 	void		Reset()
 	{
 		DeallocateBuffers();
 	}
-	
+
 	Boolean		SameDataAs(const CABufferList* anotherBufferList)
 	{
 		// check to see if two buffer lists point to the same memory.
 		if (mABL.mNumberBuffers != anotherBufferList->mABL.mNumberBuffers) return false;
-		
+
 		for (UInt32 i = 0; i < mABL.mNumberBuffers; ++i) {
 			if (mABL.mBuffers[i].mData != anotherBufferList->mABL.mBuffers[i].mData) return false;
 		}
 		return true;
 	}
-	
+
 	void		BytesConsumed(UInt32 nBytes)
 					// advance buffer pointers, decrease buffer sizes
 	{
@@ -224,18 +224,18 @@ public:
 			buf->mDataByteSize -= nBytes;
 		}
 	}
-	
+
 	void		SetFrom(const AudioBufferList *abl)
 	{
 		VerifyNotTrashingOwnedBuffer();
 		memcpy(&_GetBufferList(), abl, (char *)&abl->mBuffers[abl->mNumberBuffers] - (char *)abl);
 	}
-	
+
 	void		SetFrom(const CABufferList *blp)
 	{
 		SetFrom(&blp->GetBufferList());
 	}
-	
+
 	void		SetFrom(const AudioBufferList *abl, UInt32 nBytes)
 	{
 		VerifyNotTrashingOwnedBuffer();
@@ -247,25 +247,25 @@ public:
 			mybuf->mData = srcbuf->mData;
 		}
 	}
-	
+
 	void		SetFrom(const CABufferList *blp, UInt32 nBytes)
 	{
 		SetFrom(&blp->GetBufferList(), nBytes);
 	}
-	
+
 	AudioBufferList *	ToAudioBufferList(AudioBufferList *abl) const
 	{
 		memcpy(abl, &GetBufferList(), (char *)&abl->mBuffers[mABL.mNumberBuffers] - (char *)abl);
 		return abl;
 	}
-	
+
 	void		AllocateBuffers(UInt32 nBytes);
 	void		AllocateBuffersAndCopyFrom(UInt32 nBytes, CABufferList *inCopyFromList, CABufferList *inSetPtrList);
-	
+
 	void		DeallocateBuffers();
-	
+
 	void		UseExternalBuffer(Byte *ptr, UInt32 nBytes);
-    
+
 	void		AdvanceBufferPointers(UInt32 nBytes) // $$$ ReducingSize
 					// this is for bufferlists that function simply as
 					// an array of pointers into another bufferlist, being advanced,
@@ -278,7 +278,7 @@ public:
 			buf->mDataByteSize -= nBytes;
 		}
 	}
-	
+
 	void		SetNumBytes(UInt32 nBytes)
 	{
 		XAssert(mBufferCapacity == 0 || nBytes <= mBufferCapacity);
@@ -296,9 +296,9 @@ public:
 		if (mBufferMemory)
 			printf("  owned memory @ 0x%p:\n", mBufferMemory);
 	}
-	
+
 	UInt32		GetCapacityBytes() const { return mBufferCapacity; }
-	
+
 	template <typename T>
 	T*			GetData(UInt32 inBuffer) {
 		return static_cast<T*>(mABL.mBuffers[inBuffer].mData);
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CABundleLocker.cpp b/libs/appleutility/CoreAudio/PublicUtility/CABundleLocker.cpp
index 2161be7..2e4655c 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CABundleLocker.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CABundleLocker.cpp
@@ -2,14 +2,14 @@
      File: CABundleLocker.cpp
  Abstract: CABundleLocker.h
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #include "CABundleLocker.h"
 #include <pthread.h>
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CABundleLocker.h b/libs/appleutility/CoreAudio/PublicUtility/CABundleLocker.h
index 821ca34..898b2cf 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CABundleLocker.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CABundleLocker.h
@@ -2,14 +2,14 @@
      File: CABundleLocker.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,15 +40,15 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #ifndef _CABundleLocker_h_
 #define _CABundleLocker_h_
 
 #include <TargetConditionals.h>
- 
+
 /*
 some bundle operations are not thread safe, notably CFCopyLocalizedStringFromTableInBundle
 */
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAByteOrder.h b/libs/appleutility/CoreAudio/PublicUtility/CAByteOrder.h
index 9a56c6d..78a512a 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAByteOrder.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAByteOrder.h
@@ -2,14 +2,14 @@
      File: CAByteOrder.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #if !defined(__CAByteOrder_h__)
 #define __CAByteOrder_h__
@@ -71,7 +71,7 @@ CF_INLINE Float32 CASwapFloat32 (Float32 arg) {
 
 	flip.f = arg;
 	flip.i = CFSwapInt32 (flip.i);
-	
+
 	return flip.f;
 }
 
@@ -83,7 +83,7 @@ CF_INLINE Float64 CASwapFloat64 (Float64 arg) {
 
 	flip.f = arg;
 	flip.i = CFSwapInt64 (flip.i);
-	
+
 	return flip.f;
 }
 
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CACFArray.cpp b/libs/appleutility/CoreAudio/PublicUtility/CACFArray.cpp
index e7c057d..ec1e93c 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CACFArray.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CACFArray.cpp
@@ -2,14 +2,14 @@
      File: CACFArray.cpp
  Abstract: CACFArray.h
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 //=============================================================================
 //	Includes
@@ -91,7 +91,7 @@ bool	CACFArray::GetIndexOfItem(const void* inItem, UInt32& outIndex) const
 bool	CACFArray::GetBool(UInt32 inIndex, bool& outValue) const
 {
 	bool theAnswer = false;
-	
+
 	CFTypeRef theValue = NULL;
 	if(GetCFType(inIndex, theValue))
 	{
@@ -108,14 +108,14 @@ bool	CACFArray::GetBool(UInt32 inIndex, bool& outValue) const
 			theAnswer = true;
 		}
 	}
-	
+
 	return theAnswer;
 }
 
 bool	CACFArray::GetSInt32(UInt32 inIndex, SInt32& outItem) const
 {
 	bool theAnswer = false;
-	
+
 	CFTypeRef theItem = NULL;
 	if(GetCFType(inIndex, theItem))
 	{
@@ -125,14 +125,14 @@ bool	CACFArray::GetSInt32(UInt32 inIndex, SInt32& outItem) const
 			theAnswer = true;
 		}
 	}
-	
+
 	return theAnswer;
 }
 
 bool	CACFArray::GetUInt32(UInt32 inIndex, UInt32& outItem) const
 {
 	bool theAnswer = false;
-	
+
 	CFTypeRef theItem = NULL;
 	if(GetCFType(inIndex, theItem))
 	{
@@ -142,14 +142,14 @@ bool	CACFArray::GetUInt32(UInt32 inIndex, UInt32& outItem) const
 			theAnswer = true;
 		}
 	}
-	
+
 	return theAnswer;
 }
 
 bool	CACFArray::GetSInt64(UInt32 inIndex, SInt64& outItem) const
 {
 	bool theAnswer = false;
-	
+
 	CFTypeRef theItem = NULL;
 	if(GetCFType(inIndex, theItem))
 	{
@@ -159,14 +159,14 @@ bool	CACFArray::GetSInt64(UInt32 inIndex, SInt64& outItem) const
 			theAnswer = true;
 		}
 	}
-	
+
 	return theAnswer;
 }
 
 bool	CACFArray::GetUInt64(UInt32 inIndex, UInt64& outItem) const
 {
 	bool theAnswer = false;
-	
+
 	CFTypeRef theItem = NULL;
 	if(GetCFType(inIndex, theItem))
 	{
@@ -176,14 +176,14 @@ bool	CACFArray::GetUInt64(UInt32 inIndex, UInt64& outItem) const
 			theAnswer = true;
 		}
 	}
-	
+
 	return theAnswer;
 }
 
 bool	CACFArray::GetFloat32(UInt32 inIndex, Float32& outItem) const
 {
 	bool theAnswer = false;
-	
+
 	CFTypeRef theItem = NULL;
 	if(GetCFType(inIndex, theItem))
 	{
@@ -193,14 +193,14 @@ bool	CACFArray::GetFloat32(UInt32 inIndex, Float32& outItem) const
 			theAnswer = true;
 		}
 	}
-	
+
 	return theAnswer;
 }
 
 bool	CACFArray::GetFloat64(UInt32 inIndex, Float64& outItem) const
 {
 	bool theAnswer = false;
-	
+
 	CFTypeRef theItem = NULL;
 	if(GetCFType(inIndex, theItem))
 	{
@@ -210,14 +210,14 @@ bool	CACFArray::GetFloat64(UInt32 inIndex, Float64& outItem) const
 			theAnswer = true;
 		}
 	}
-	
+
 	return theAnswer;
 }
 
 bool	CACFArray::Get4CC(UInt32 inIndex, UInt32& outValue) const
 {
 	bool theAnswer = false;
-	
+
 	CFTypeRef theValue = NULL;
 	if(GetCFType(inIndex, theValue))
 	{
@@ -237,14 +237,14 @@ bool	CACFArray::Get4CC(UInt32 inIndex, UInt32& outValue) const
 			}
 		}
 	}
-	
+
 	return theAnswer;
 }
 
 bool	CACFArray::GetString(UInt32 inIndex, CFStringRef& outItem) const
 {
 	bool theAnswer = false;
-	
+
 	CFTypeRef theItem = NULL;
 	if(GetCFType(inIndex, theItem))
 	{
@@ -254,14 +254,14 @@ bool	CACFArray::GetString(UInt32 inIndex, CFStringRef& outItem) const
 			theAnswer = true;
 		}
 	}
-	
+
 	return theAnswer;
 }
 
 bool	CACFArray::GetArray(UInt32 inIndex, CFArrayRef& outItem) const
 {
 	bool theAnswer = false;
-	
+
 	CFTypeRef theItem = NULL;
 	if(GetCFType(inIndex, theItem))
 	{
@@ -271,14 +271,14 @@ bool	CACFArray::GetArray(UInt32 inIndex, CFArrayRef& outItem) const
 			theAnswer = true;
 		}
 	}
-	
+
 	return theAnswer;
 }
 
 bool	CACFArray::GetDictionary(UInt32 inIndex, CFDictionaryRef& outItem) const
 {
 	bool theAnswer = false;
-	
+
 	CFTypeRef theItem = NULL;
 	if(GetCFType(inIndex, theItem))
 	{
@@ -288,14 +288,14 @@ bool	CACFArray::GetDictionary(UInt32 inIndex, CFDictionaryRef& outItem) const
 			theAnswer = true;
 		}
 	}
-	
+
 	return theAnswer;
 }
 
 bool	CACFArray::GetData(UInt32 inIndex, CFDataRef& outItem) const
 {
 	bool theAnswer = false;
-	
+
 	CFTypeRef theItem = NULL;
 	if(GetCFType(inIndex, theItem))
 	{
@@ -305,14 +305,14 @@ bool	CACFArray::GetData(UInt32 inIndex, CFDataRef& outItem) const
 			theAnswer = true;
 		}
 	}
-	
+
 	return theAnswer;
 }
 
 bool	CACFArray::GetUUID(UInt32 inIndex, CFUUIDRef& outItem) const
 {
 	bool theAnswer = false;
-	
+
 	CFTypeRef theItem = NULL;
 	if(GetCFType(inIndex, theItem))
 	{
@@ -322,20 +322,20 @@ bool	CACFArray::GetUUID(UInt32 inIndex, CFUUIDRef& outItem) const
 			theAnswer = true;
 		}
 	}
-	
+
 	return theAnswer;
 }
 
 bool	CACFArray::GetCFType(UInt32 inIndex, CFTypeRef& outItem) const
 {
 	bool theAnswer = false;
-	
+
 	if((mCFArray != NULL) && (inIndex < GetNumberItems()))
 	{
 		outItem = CFArrayGetValueAtIndex(mCFArray, static_cast<CFIndex>(inIndex));
 		theAnswer = outItem != NULL;
 	}
-	
+
 	return theAnswer;
 }
 
@@ -381,7 +381,7 @@ void	CACFArray::GetCACFDictionary(UInt32 inIndex, CACFDictionary& outItem) const
 bool	CACFArray::AppendBool(bool inItem)
 {
 	bool theAnswer = false;
-	
+
 	if((mCFArray != NULL) && mMutable)
 	{
 		CACFBoolean theItem(inItem);
@@ -390,14 +390,14 @@ bool	CACFArray::AppendBool(bool inItem)
 			theAnswer = AppendCFType(theItem.GetCFBoolean());
 		}
 	}
-	
+
 	return theAnswer;
 }
 
 bool	CACFArray::AppendSInt32(SInt32 inItem)
 {
 	bool theAnswer = false;
-	
+
 	if((mCFArray != NULL) && mMutable)
 	{
 		CACFNumber theItem(inItem);
@@ -406,14 +406,14 @@ bool	CACFArray::AppendSInt32(SInt32 inItem)
 			theAnswer = AppendCFType(theItem.GetCFNumber());
 		}
 	}
-	
+
 	return theAnswer;
 }
 
 bool	CACFArray::AppendUInt32(UInt32 inItem)
 {
 	bool theAnswer = false;
-	
+
 	if((mCFArray != NULL) && mMutable)
 	{
 		CACFNumber theItem(inItem);
@@ -422,14 +422,14 @@ bool	CACFArray::AppendUInt32(UInt32 inItem)
 			theAnswer = AppendCFType(theItem.GetCFNumber());
 		}
 	}
-	
+
 	return theAnswer;
 }
 
 bool	CACFArray::AppendSInt64(SInt64 inItem)
 {
 	bool theAnswer = false;
-	
+
 	if((mCFArray != NULL) && mMutable)
 	{
 		CACFNumber theItem(inItem);
@@ -438,14 +438,14 @@ bool	CACFArray::AppendSInt64(SInt64 inItem)
 			theAnswer = AppendCFType(theItem.GetCFNumber());
 		}
 	}
-	
+
 	return theAnswer;
 }
 
 bool	CACFArray::AppendUInt64(UInt64 inItem)
 {
 	bool theAnswer = false;
-	
+
 	if((mCFArray != NULL) && mMutable)
 	{
 		CACFNumber theItem(inItem);
@@ -454,14 +454,14 @@ bool	CACFArray::AppendUInt64(UInt64 inItem)
 			theAnswer = AppendCFType(theItem.GetCFNumber());
 		}
 	}
-	
+
 	return theAnswer;
 }
 
 bool	CACFArray::AppendFloat32(Float32 inItem)
 {
 	bool theAnswer = false;
-	
+
 	if((mCFArray != NULL) && mMutable)
 	{
 		CACFNumber theItem(inItem);
@@ -470,14 +470,14 @@ bool	CACFArray::AppendFloat32(Float32 inItem)
 			theAnswer = AppendCFType(theItem.GetCFNumber());
 		}
 	}
-	
+
 	return theAnswer;
 }
 
 bool	CACFArray::AppendFloat64(Float64 inItem)
 {
 	bool theAnswer = false;
-	
+
 	if((mCFArray != NULL) && mMutable)
 	{
 		CACFNumber theItem(inItem);
@@ -486,7 +486,7 @@ bool	CACFArray::AppendFloat64(Float64 inItem)
 			theAnswer = AppendCFType(theItem.GetCFNumber());
 		}
 	}
-	
+
 	return theAnswer;
 }
 
@@ -513,20 +513,20 @@ bool	CACFArray::AppendData(const CFDataRef inItem)
 bool	CACFArray::AppendCFType(const CFTypeRef inItem)
 {
 	bool theAnswer = false;
-	
+
 	if((mCFArray != NULL) && mMutable)
 	{
 		CFArrayAppendValue(mCFArray, inItem);
 		theAnswer = true;
 	}
-	
+
 	return theAnswer;
 }
 
 bool	CACFArray::InsertBool(UInt32 inIndex, bool inItem)
 {
 	bool theAnswer = false;
-	
+
 	if((mCFArray != NULL) && mMutable)
 	{
 		CACFBoolean theItem(inItem);
@@ -535,14 +535,14 @@ bool	CACFArray::InsertBool(UInt32 inIndex, bool inItem)
 			theAnswer = InsertCFType(inIndex, theItem.GetCFBoolean());
 		}
 	}
-	
+
 	return theAnswer;
 }
 
 bool	CACFArray::InsertSInt32(UInt32 inIndex, SInt32 inItem)
 {
 	bool theAnswer = false;
-	
+
 	if((mCFArray != NULL) && mMutable)
 	{
 		CACFNumber theItem(inItem);
@@ -551,14 +551,14 @@ bool	CACFArray::InsertSInt32(UInt32 inIndex, SInt32 inItem)
 			theAnswer = InsertCFType(inIndex, theItem.GetCFNumber());
 		}
 	}
-	
+
 	return theAnswer;
 }
 
 bool	CACFArray::InsertUInt32(UInt32 inIndex, UInt32 inItem)
 {
 	bool theAnswer = false;
-	
+
 	if((mCFArray != NULL) && mMutable)
 	{
 		CACFNumber theItem(inItem);
@@ -567,14 +567,14 @@ bool	CACFArray::InsertUInt32(UInt32 inIndex, UInt32 inItem)
 			theAnswer = InsertCFType(inIndex, theItem.GetCFNumber());
 		}
 	}
-	
+
 	return theAnswer;
 }
 
 bool	CACFArray::InsertSInt64(UInt32 inIndex, SInt64 inItem)
 {
 	bool theAnswer = false;
-	
+
 	if((mCFArray != NULL) && mMutable)
 	{
 		CACFNumber theItem(inItem);
@@ -583,14 +583,14 @@ bool	CACFArray::InsertSInt64(UInt32 inIndex, SInt64 inItem)
 			theAnswer = InsertCFType(inIndex, theItem.GetCFNumber());
 		}
 	}
-	
+
 	return theAnswer;
 }
 
 bool	CACFArray::InsertUInt64(UInt32 inIndex, UInt64 inItem)
 {
 	bool theAnswer = false;
-	
+
 	if((mCFArray != NULL) && mMutable)
 	{
 		CACFNumber theItem(inItem);
@@ -599,14 +599,14 @@ bool	CACFArray::InsertUInt64(UInt32 inIndex, UInt64 inItem)
 			theAnswer = InsertCFType(inIndex, theItem.GetCFNumber());
 		}
 	}
-	
+
 	return theAnswer;
 }
 
 bool	CACFArray::InsertFloat32(UInt32 inIndex, Float32 inItem)
 {
 	bool theAnswer = false;
-	
+
 	if((mCFArray != NULL) && mMutable)
 	{
 		CACFNumber theItem(inItem);
@@ -615,14 +615,14 @@ bool	CACFArray::InsertFloat32(UInt32 inIndex, Float32 inItem)
 			theAnswer = InsertCFType(inIndex, theItem.GetCFNumber());
 		}
 	}
-	
+
 	return theAnswer;
 }
 
 bool	CACFArray::InsertFloat64(UInt32 inIndex, Float64 inItem)
 {
 	bool theAnswer = false;
-	
+
 	if((mCFArray != NULL) && mMutable)
 	{
 		CACFNumber theItem(inItem);
@@ -631,7 +631,7 @@ bool	CACFArray::InsertFloat64(UInt32 inIndex, Float64 inItem)
 			theAnswer = InsertCFType(inIndex, theItem.GetCFNumber());
 		}
 	}
-	
+
 	return theAnswer;
 }
 
@@ -658,7 +658,7 @@ bool	CACFArray::InsertData(UInt32 inIndex, const CFDataRef inItem)
 bool	CACFArray::InsertCFType(UInt32 inIndex, const CFTypeRef inItem)
 {
 	bool theAnswer = false;
-	
+
 	if((mCFArray != NULL) && mMutable)
 	{
 		if(inIndex < GetNumberItems())
@@ -671,14 +671,14 @@ bool	CACFArray::InsertCFType(UInt32 inIndex, const CFTypeRef inItem)
 		}
 		theAnswer = true;
 	}
-	
+
 	return theAnswer;
 }
 
 bool	CACFArray::SetBool(UInt32 inIndex, bool inItem)
 {
 	bool theAnswer = false;
-	
+
 	if((mCFArray != NULL) && mMutable && (inIndex <= GetNumberItems()))
 	{
 		CACFBoolean theItem(inItem);
@@ -687,14 +687,14 @@ bool	CACFArray::SetBool(UInt32 inIndex, bool inItem)
 			theAnswer = SetCFType(inIndex, theItem.GetCFBoolean());
 		}
 	}
-	
+
 	return theAnswer;
 }
 
 bool	CACFArray::SetSInt32(UInt32 inIndex, SInt32 inItem)
 {
 	bool theAnswer = false;
-	
+
 	if((mCFArray != NULL) && mMutable && (inIndex <= GetNumberItems()))
 	{
 		CACFNumber theItem(inItem);
@@ -703,14 +703,14 @@ bool	CACFArray::SetSInt32(UInt32 inIndex, SInt32 inItem)
 			theAnswer = SetCFType(inIndex, theItem.GetCFNumber());
 		}
 	}
-	
+
 	return theAnswer;
 }
 
 bool	CACFArray::SetUInt32(UInt32 inIndex, UInt32 inItem)
 {
 	bool theAnswer = false;
-	
+
 	if((mCFArray != NULL) && mMutable && (inIndex <= GetNumberItems()))
 	{
 		CACFNumber theItem(inItem);
@@ -719,14 +719,14 @@ bool	CACFArray::SetUInt32(UInt32 inIndex, UInt32 inItem)
 			theAnswer = SetCFType(inIndex, theItem.GetCFNumber());
 		}
 	}
-	
+
 	return theAnswer;
 }
 
 bool	CACFArray::SetSInt64(UInt32 inIndex, SInt64 inItem)
 {
 	bool theAnswer = false;
-	
+
 	if((mCFArray != NULL) && mMutable && (inIndex <= GetNumberItems()))
 	{
 		CACFNumber theItem(inItem);
@@ -735,14 +735,14 @@ bool	CACFArray::SetSInt64(UInt32 inIndex, SInt64 inItem)
 			theAnswer = SetCFType(inIndex, theItem.GetCFNumber());
 		}
 	}
-	
+
 	return theAnswer;
 }
 
 bool	CACFArray::SetUInt64(UInt32 inIndex, UInt64 inItem)
 {
 	bool theAnswer = false;
-	
+
 	if((mCFArray != NULL) && mMutable && (inIndex <= GetNumberItems()))
 	{
 		CACFNumber theItem(inItem);
@@ -751,14 +751,14 @@ bool	CACFArray::SetUInt64(UInt32 inIndex, UInt64 inItem)
 			theAnswer = SetCFType(inIndex, theItem.GetCFNumber());
 		}
 	}
-	
+
 	return theAnswer;
 }
 
 bool	CACFArray::SetFloat32(UInt32 inIndex, Float32 inItem)
 {
 	bool theAnswer = false;
-	
+
 	if((mCFArray != NULL) && mMutable && (inIndex <= GetNumberItems()))
 	{
 		CACFNumber theItem(inItem);
@@ -767,14 +767,14 @@ bool	CACFArray::SetFloat32(UInt32 inIndex, Float32 inItem)
 			theAnswer = SetCFType(inIndex, theItem.GetCFNumber());
 		}
 	}
-	
+
 	return theAnswer;
 }
 
 bool	CACFArray::SetFloat64(UInt32 inIndex, Float64 inItem)
 {
 	bool theAnswer = false;
-	
+
 	if((mCFArray != NULL) && mMutable && (inIndex <= GetNumberItems()))
 	{
 		CACFNumber theItem(inItem);
@@ -783,7 +783,7 @@ bool	CACFArray::SetFloat64(UInt32 inIndex, Float64 inItem)
 			theAnswer = SetCFType(inIndex, theItem.GetCFNumber());
 		}
 	}
-	
+
 	return theAnswer;
 }
 
@@ -810,12 +810,12 @@ bool	CACFArray::SetData(UInt32 inIndex, const CFDataRef inItem)
 bool	CACFArray::SetCFType(UInt32 inIndex, const CFTypeRef inItem)
 {
 	bool theAnswer = false;
-	
+
 	if((mCFArray != NULL) && mMutable && (inIndex <= GetNumberItems()))
 	{
 		CFArraySetValueAtIndex(mCFArray, static_cast<CFIndex>(inIndex), inItem);
 		theAnswer = true;
 	}
-	
+
 	return theAnswer;
 }
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CACFArray.h b/libs/appleutility/CoreAudio/PublicUtility/CACFArray.h
index 89c8c55..4c9fb79 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CACFArray.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CACFArray.h
@@ -2,14 +2,14 @@
      File: CACFArray.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #if !defined(__CACFArray_h__)
 #define __CACFArray_h__
@@ -92,21 +92,21 @@ public:
 private:
 	void				Retain()																	{ if(mRelease && (mCFArray != NULL)) { CFRetain(mCFArray); } }
 	void				Release()																	{ if(mRelease && (mCFArray != NULL)) { CFRelease(mCFArray); } }
-		
+
 //	Attributes
 public:
 	bool				IsValid() const																{ return mCFArray != NULL; }
 	bool				IsMutable() const															{ return mMutable; }
 	bool				CanModify() const															{ return mMutable && (mCFArray != NULL); }
-	
+
 	bool				WillRelease() const															{ return mRelease; }
 	void				ShouldRelease(bool inRelease)												{ mRelease = inRelease; }
-	
+
 	CFTypeID			GetTypeID() const															{ return CFGetTypeID(mCFArray); }
-	
+
 	CFArrayRef			GetCFArray() const															{ return mCFArray; }
 	CFArrayRef			CopyCFArray() const															{ if(mCFArray != NULL) { CFRetain(mCFArray); } return mCFArray; }
-	
+
 	CFMutableArrayRef	GetCFMutableArray() const													{ return mCFArray; }
 	CFMutableArrayRef	CopyCFMutableArray() const													{ if(mCFArray != NULL) { CFRetain(mCFArray); } return mCFArray; }
 	CFPropertyListRef   AsPropertyList() const														{ return mCFArray; }
@@ -124,7 +124,7 @@ public:
 	void				Sort(CFComparatorFunction inCompareFunction)								{ if(CanModify()) { CFRange theRange = { 0, CFArrayGetCount(mCFArray) }; CFArraySortValues(mCFArray, theRange, inCompareFunction, NULL); } }
 	void				SortNumbers()																{ Sort((CFComparatorFunction)CFNumberCompare); }
 	void				SortStrings()																{ Sort((CFComparatorFunction)CFStringCompare); }
-	
+
 	bool				GetBool(UInt32 inIndex, bool& outValue) const;
 	bool				GetSInt32(UInt32 inIndex, SInt32& outItem) const;
 	bool				GetUInt32(UInt32 inIndex, UInt32& outItem) const;
@@ -139,11 +139,11 @@ public:
 	bool				GetData(UInt32 inIndex, CFDataRef& outItem) const;
 	bool				GetUUID(UInt32 inIndex, CFUUIDRef& outItem) const;
 	bool				GetCFType(UInt32 inIndex, CFTypeRef& outItem) const;
-	
+
 	void				GetCACFString(UInt32 inIndex, CACFString& outItem) const;
 	void				GetCACFArray(UInt32 inIndex, CACFArray& outItem) const;
 	void				GetCACFDictionary(UInt32 inIndex, CACFDictionary& outItem) const;
-	
+
 	bool				AppendBool(bool inItem);
 	bool				AppendSInt32(SInt32 inItem);
 	bool				AppendUInt32(UInt32 inItem);
@@ -156,7 +156,7 @@ public:
 	bool				AppendDictionary(const CFDictionaryRef inItem);
 	bool				AppendData(const CFDataRef inItem);
 	bool				AppendCFType(const CFTypeRef inItem);
-	
+
 	bool				InsertBool(UInt32 inIndex, bool inItem);
 	bool				InsertSInt32(UInt32 inIndex, SInt32 inItem);
 	bool				InsertUInt32(UInt32 inIndex, UInt32 inItem);
@@ -169,7 +169,7 @@ public:
 	bool				InsertDictionary(UInt32 inIndex, const CFDictionaryRef inItem);
 	bool				InsertData(UInt32 inIndex, const CFDataRef inItem);
 	bool				InsertCFType(UInt32 inIndex, const CFTypeRef inItem);
-	
+
 	bool				SetBool(UInt32 inIndex, bool inItem);
 	bool				SetSInt32(UInt32 inIndex, SInt32 inItem);
 	bool				SetUInt32(UInt32 inIndex, UInt32 inItem);
@@ -188,7 +188,7 @@ private:
 	CFMutableArrayRef	mCFArray;
 	bool				mRelease;
 	bool				mMutable;
-	
+
 						CACFArray(const void*);	// prevent accidental instantiation with a pointer via bool constructor
 };
 
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CACFData.h b/libs/appleutility/CoreAudio/PublicUtility/CACFData.h
index 7ce08dc..b289f60 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CACFData.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CACFData.h
@@ -2,14 +2,14 @@
      File: CACFData.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #if !defined(__CACFData_h__)
 #define __CACFData_h__
@@ -81,7 +81,7 @@ public:
 private:
 	void		Retain() { if(mWillRelease && (mCFData != NULL)) { CFRetain(mCFData); } }
 	void		Release() { if(mWillRelease && (mCFData != NULL)) { CFRelease(mCFData); } }
-	
+
 	CFDataRef	mCFData;
 	bool		mWillRelease;
 
@@ -95,11 +95,11 @@ public:
 public:
 	CFDataRef	GetCFData() const { return mCFData; }
 	CFDataRef	CopyCFData() const { if(mCFData != NULL) { CFRetain(mCFData); } return mCFData; }
-	
+
 	UInt32		GetSize() const { return ToUInt32(CFDataGetLength(mCFData)); }
 	const void*	GetDataPtr() const { return CFDataGetBytePtr(mCFData); }
 	void		CopyData(UInt32 inStartOffset, void* outData, UInt32 inDataSize) const { CFRange theRange = { static_cast<CFIndex>(inStartOffset), static_cast<CFIndex>(inDataSize) }; CFDataGetBytes(mCFData, theRange, static_cast<UInt8*>(outData)); }
-	
+
 	SInt32		GetSInt32() const { SInt32 theAnswer = 0; CopyData(0, &theAnswer, SizeOf32(SInt32)); return theAnswer; }
 	Float32		GetFloat32() const { Float32 theAnswer = 0; CopyData(0, &theAnswer, SizeOf32(Float32)); return theAnswer; }
 
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CACFDictionary.cpp b/libs/appleutility/CoreAudio/PublicUtility/CACFDictionary.cpp
index fbac774..a488a85 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CACFDictionary.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CACFDictionary.cpp
@@ -2,14 +2,14 @@
      File: CACFDictionary.cpp
  Abstract: CACFDictionary.h
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 //=============================================================================
 //	Includes
@@ -83,7 +83,7 @@ void	CACFDictionary::GetKeysAndValues (const void **keys, const void **values) c
 bool	CACFDictionary::GetBool(const CFStringRef inKey, bool& outValue) const
 {
 	bool theAnswer = false;
-	
+
 	CFTypeRef theValue = NULL;
 	if(GetCFType(inKey, theValue))
 	{
@@ -100,14 +100,14 @@ bool	CACFDictionary::GetBool(const CFStringRef inKey, bool& outValue) const
 			theAnswer = true;
 		}
 	}
-	
+
 	return theAnswer;
 }
 
 bool	CACFDictionary::GetSInt32(const CFStringRef inKey, SInt32& outValue) const
 {
 	bool theAnswer = false;
-	
+
 	CFTypeRef theValue = NULL;
 	if(GetCFType(inKey, theValue))
 	{
@@ -117,14 +117,14 @@ bool	CACFDictionary::GetSInt32(const CFStringRef inKey, SInt32& outValue) const
 			theAnswer = true;
 		}
 	}
-	
+
 	return theAnswer;
 }
 
 bool	CACFDictionary::GetUInt32(const CFStringRef inKey, UInt32& outValue) const
 {
 	bool theAnswer = false;
-	
+
 	CFTypeRef theValue = NULL;
 	if(GetCFType(inKey, theValue))
 	{
@@ -134,14 +134,14 @@ bool	CACFDictionary::GetUInt32(const CFStringRef inKey, UInt32& outValue) const
 			theAnswer = true;
 		}
 	}
-	
+
 	return theAnswer;
 }
 
 bool	CACFDictionary::GetSInt64(const CFStringRef inKey, SInt64& outValue) const
 {
 	bool theAnswer = false;
-	
+
 	CFTypeRef theValue = NULL;
 	if(GetCFType(inKey, theValue))
 	{
@@ -151,14 +151,14 @@ bool	CACFDictionary::GetSInt64(const CFStringRef inKey, SInt64& outValue) const
 			theAnswer = true;
 		}
 	}
-	
+
 	return theAnswer;
 }
 
 bool	CACFDictionary::GetUInt64(const CFStringRef inKey, UInt64& outValue) const
 {
 	bool theAnswer = false;
-	
+
 	CFTypeRef theValue = NULL;
 	if(GetCFType(inKey, theValue))
 	{
@@ -168,14 +168,14 @@ bool	CACFDictionary::GetUInt64(const CFStringRef inKey, UInt64& outValue) const
 			theAnswer = true;
 		}
 	}
-	
+
 	return theAnswer;
 }
 
 bool	CACFDictionary::GetFloat32FromString(const CFStringRef inKey, Float32& outValue) const
 {
 	bool theAnswer = false;
-	
+
 	CFTypeRef theValue = NULL;
 	if(GetCFType(inKey, theValue))
 	{
@@ -184,14 +184,14 @@ bool	CACFDictionary::GetFloat32FromString(const CFStringRef inKey, Float32& outV
 			outValue = static_cast<Float32>(CFStringGetDoubleValue(static_cast<CFStringRef>(theValue)));
 		}
 	}
-	
+
 	return theAnswer;
 }
 
 bool	CACFDictionary::GetUInt32FromString(const CFStringRef inKey, UInt32& outValue) const
 {
 	bool theAnswer = false;
-	
+
 	CFTypeRef theValue = NULL;
 	if(GetCFType(inKey, theValue))
 	{
@@ -200,14 +200,14 @@ bool	CACFDictionary::GetUInt32FromString(const CFStringRef inKey, UInt32& outVal
 			outValue = CFStringGetIntValue(static_cast<CFStringRef>(theValue));
 		}
 	}
-	
+
 	return theAnswer;
 }
 
 bool	CACFDictionary::GetFloat32(const CFStringRef inKey, Float32& outValue) const
 {
 	bool theAnswer = false;
-	
+
 	CFTypeRef theValue = NULL;
 	if(GetCFType(inKey, theValue))
 	{
@@ -217,14 +217,14 @@ bool	CACFDictionary::GetFloat32(const CFStringRef inKey, Float32& outValue) cons
 			theAnswer = true;
 		}
 	}
-	
+
 	return theAnswer;
 }
 
 bool	CACFDictionary::GetFloat64(const CFStringRef inKey, Float64& outValue) const
 {
 	bool theAnswer = false;
-	
+
 	CFTypeRef theValue = NULL;
 	if(GetCFType(inKey, theValue))
 	{
@@ -234,14 +234,14 @@ bool	CACFDictionary::GetFloat64(const CFStringRef inKey, Float64& outValue) cons
 			theAnswer = true;
 		}
 	}
-	
+
 	return theAnswer;
 }
 
 bool	CACFDictionary::GetFixed32(const CFStringRef inKey, Float32& outValue) const
 {
 	bool theAnswer = false;
-	
+
 	CFTypeRef theValue = NULL;
 	if(GetCFType(inKey, theValue))
 	{
@@ -249,7 +249,7 @@ bool	CACFDictionary::GetFixed32(const CFStringRef inKey, Float32& outValue) cons
 		{
 			SInt32 theFixed32 = 0;
 			CFNumberGetValue(static_cast<CFNumberRef>(theValue), kCFNumberSInt32Type, &theFixed32);
-			
+
 			//	this is a 16.16 value so convert it to a float
 			Float32 theSign = theFixed32 < 0 ? -1.0f : 1.0f;
 			theFixed32 *= (SInt32)theSign;
@@ -260,14 +260,14 @@ bool	CACFDictionary::GetFixed32(const CFStringRef inKey, Float32& outValue) cons
 			theAnswer = true;
 		}
 	}
-	
+
 	return theAnswer;
 }
 
 bool	CACFDictionary::GetFixed64(const CFStringRef inKey, Float64& outValue) const
 {
 	bool theAnswer = false;
-	
+
 	CFTypeRef theValue = NULL;
 	if(GetCFType(inKey, theValue))
 	{
@@ -280,14 +280,14 @@ bool	CACFDictionary::GetFixed64(const CFStringRef inKey, Float64& outValue) cons
 			theAnswer = true;
 		}
 	}
-	
+
 	return theAnswer;
 }
 
 bool	CACFDictionary::Get4CC(const CFStringRef inKey, UInt32& outValue) const
 {
 	bool theAnswer = false;
-	
+
 	CFTypeRef theValue = NULL;
 	if(GetCFType(inKey, theValue))
 	{
@@ -307,14 +307,14 @@ bool	CACFDictionary::Get4CC(const CFStringRef inKey, UInt32& outValue) const
 			}
 		}
 	}
-	
+
 	return theAnswer;
 }
 
 bool	CACFDictionary::GetString(const CFStringRef inKey, CFStringRef& outValue) const
 {
 	bool theAnswer = false;
-	
+
 	CFTypeRef theValue = NULL;
 	if(GetCFType(inKey, theValue))
 	{
@@ -324,14 +324,14 @@ bool	CACFDictionary::GetString(const CFStringRef inKey, CFStringRef& outValue) c
 			theAnswer = true;
 		}
 	}
-	
+
 	return theAnswer;
 }
-	
+
 bool	CACFDictionary::GetArray(const CFStringRef inKey, CFArrayRef& outValue) const
 {
 	bool theAnswer = false;
-	
+
 	CFTypeRef theValue = NULL;
 	if(GetCFType(inKey, theValue))
 	{
@@ -341,14 +341,14 @@ bool	CACFDictionary::GetArray(const CFStringRef inKey, CFArrayRef& outValue) con
 			theAnswer = true;
 		}
 	}
-	
+
 	return theAnswer;
 }
-	
+
 bool	CACFDictionary::GetDictionary(const CFStringRef inKey, CFDictionaryRef& outValue) const
 {
 	bool theAnswer = false;
-	
+
 	CFTypeRef theValue = NULL;
 	if(GetCFType(inKey, theValue))
 	{
@@ -358,14 +358,14 @@ bool	CACFDictionary::GetDictionary(const CFStringRef inKey, CFDictionaryRef& out
 			theAnswer = true;
 		}
 	}
-	
+
 	return theAnswer;
 }
 
 bool	CACFDictionary::GetData(const CFStringRef inKey, CFDataRef& outValue) const
 {
 	bool theAnswer = false;
-	
+
 	CFTypeRef theValue = NULL;
 	if(GetCFType(inKey, theValue))
 	{
@@ -375,27 +375,27 @@ bool	CACFDictionary::GetData(const CFStringRef inKey, CFDataRef& outValue) const
 			theAnswer = true;
 		}
 	}
-	
+
 	return theAnswer;
 }
 
 bool	CACFDictionary::GetCFType(const CFStringRef inKey, CFTypeRef& outValue) const
 {
 	bool theAnswer = false;
-	
+
 	if(mCFDictionary != NULL)
 	{
 		outValue = CFDictionaryGetValue(mCFDictionary, inKey);
 		theAnswer = (outValue != NULL);
 	}
-	
+
 	return theAnswer;
 }
 
 bool	CACFDictionary::GetURL(const CFStringRef inKey, CFURLRef& outValue) const
 {
 	bool theAnswer = false;
-	
+
 	CFTypeRef theValue = NULL;
 	if(GetCFType(inKey, theValue))
 	{
@@ -405,14 +405,14 @@ bool	CACFDictionary::GetURL(const CFStringRef inKey, CFURLRef& outValue) const
 			theAnswer = true;
 		}
 	}
-	
+
 	return theAnswer;
 }
 
 bool	CACFDictionary::GetCFTypeWithCStringKey(const char* inKey, CFTypeRef& outValue) const
 {
 	bool theAnswer = false;
-	
+
 	if(mCFDictionary != NULL)
 	{
 		CACFString theKey(inKey);
@@ -421,7 +421,7 @@ bool	CACFDictionary::GetCFTypeWithCStringKey(const char* inKey, CFTypeRef& outVa
 			theAnswer = GetCFType(theKey.GetCFString(), outValue);
 		}
 	}
-	
+
 	return theAnswer;
 }
 
@@ -437,7 +437,7 @@ void	CACFDictionary::GetCACFString(const CFStringRef inKey, CACFString& outValue
 		}
 	}
 }
-	
+
 void	CACFDictionary::GetCACFArray(const CFStringRef inKey, CACFArray& outValue) const
 {
 	outValue = static_cast<CFArrayRef>(NULL);
@@ -450,7 +450,7 @@ void	CACFDictionary::GetCACFArray(const CFStringRef inKey, CACFArray& outValue)
 		}
 	}
 }
-	
+
 void	CACFDictionary::GetCACFDictionary(const CFStringRef inKey, CACFDictionary& outValue) const
 {
 	outValue = static_cast<CFDictionaryRef>(NULL);
@@ -539,7 +539,7 @@ bool	CACFDictionary::AddURL(const CFStringRef inKey, const CFURLRef inValue)
 bool	CACFDictionary::AddCFTypeWithCStringKey(const char* inKey, const CFTypeRef inValue)
 {
 	bool theAnswer = false;
-	
+
 	if (inKey)
 	{
 		CACFString theKey(inKey);
@@ -548,14 +548,14 @@ bool	CACFDictionary::AddCFTypeWithCStringKey(const char* inKey, const CFTypeRef
 			theAnswer = AddCFType(theKey.GetCFString(), inValue);
 		}
 	}
-	
+
 	return theAnswer;
 }
 
 bool	CACFDictionary::AddCString(const CFStringRef inKey, const char* inValue)
 {
 	bool theAnswer = false;
-	
+
 	if (inValue)
 	{
 		CACFString theValue(inValue);
@@ -570,12 +570,12 @@ bool	CACFDictionary::AddCString(const CFStringRef inKey, const char* inValue)
 bool	CACFDictionary::AddCFType(const CFStringRef inKey, const CFTypeRef inValue)
 {
 	bool theAnswer = false;
-	
+
 	if(mMutable && (mCFDictionary != NULL) && inValue)
 	{
 		CFDictionarySetValue(mCFDictionary, inKey, inValue);
 		theAnswer = true;
 	}
-	
+
 	return theAnswer;
 }
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CACFDictionary.h b/libs/appleutility/CoreAudio/PublicUtility/CACFDictionary.h
index c389e50..db61f63 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CACFDictionary.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CACFDictionary.h
@@ -2,14 +2,14 @@
      File: CACFDictionary.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #if !defined(__CACFDictionary_h__)
 #define __CACFDictionary_h__
@@ -69,7 +69,7 @@ class	CACFString;
 //	CACFDictionary
 //=============================================================================
 
-class CACFDictionary 
+class CACFDictionary
 {
 
 //	Construction/Destruction
@@ -79,24 +79,24 @@ public:
 							CACFDictionary(CFDictionaryRef inCFDictionary, bool inRelease)			: mCFDictionary(const_cast<CFMutableDictionaryRef>(inCFDictionary)), mRelease(inRelease), mMutable(false) {}
 							CACFDictionary(CFMutableDictionaryRef inCFDictionary, bool inRelease)	: mCFDictionary(inCFDictionary), mRelease(inRelease), mMutable(true) {}
 							CACFDictionary(const CACFDictionary& inDictionary)						: mCFDictionary(inDictionary.mCFDictionary), mRelease(inDictionary.mRelease), mMutable(inDictionary.mMutable) { Retain(); }
-	CACFDictionary&			operator=(const CACFDictionary& inDictionary)							{ Release(); mCFDictionary = inDictionary.mCFDictionary; mRelease = inDictionary.mRelease; mMutable = inDictionary.mMutable; Retain(); return *this; } 
-	CACFDictionary&			operator=(CFDictionaryRef inDictionary)									{ Release(); mCFDictionary = const_cast<CFMutableDictionaryRef>(inDictionary); mMutable = false; Retain(); return *this; } 
-	CACFDictionary&			operator=(CFMutableDictionaryRef inDictionary)							{ Release(); mCFDictionary = inDictionary; mMutable = true; Retain(); return *this; } 
+	CACFDictionary&			operator=(const CACFDictionary& inDictionary)							{ Release(); mCFDictionary = inDictionary.mCFDictionary; mRelease = inDictionary.mRelease; mMutable = inDictionary.mMutable; Retain(); return *this; }
+	CACFDictionary&			operator=(CFDictionaryRef inDictionary)									{ Release(); mCFDictionary = const_cast<CFMutableDictionaryRef>(inDictionary); mMutable = false; Retain(); return *this; }
+	CACFDictionary&			operator=(CFMutableDictionaryRef inDictionary)							{ Release(); mCFDictionary = inDictionary; mMutable = true; Retain(); return *this; }
 							~CACFDictionary()														{ Release(); }
 
 private:
 	void					Retain()																{ if(mRelease && (mCFDictionary != NULL)) { CFRetain(mCFDictionary); } }
 	void					Release()																{ if(mRelease && (mCFDictionary != NULL)) { CFRelease(mCFDictionary); } }
-		
+
 //	Attributes
 public:
 	bool					IsValid() const															{ return mCFDictionary != NULL; }
 	bool					IsMutable() const														{ return mMutable;}
 	bool					CanModify() const														{ return mMutable && (mCFDictionary != NULL); }
-	
+
 	bool					WillRelease() const														{ return mRelease; }
 	void					ShouldRelease(bool inRelease)											{ mRelease = inRelease; }
-	
+
 	CFDictionaryRef			GetDict() const															{ return mCFDictionary; }
 	CFDictionaryRef			GetCFDictionary() const													{ return mCFDictionary; }
 	CFDictionaryRef			CopyCFDictionary() const												{ if(mCFDictionary != NULL) { CFRetain(mCFDictionary); } return mCFDictionary; }
@@ -116,7 +116,7 @@ public:
 	UInt32					Size() const;
 	void					GetKeys(const void** keys) const;
 	void					GetKeysAndValues (const void **keys, const void **values) const;
-	
+
 	bool					GetBool(const CFStringRef inKey, bool& outValue) const;
 	bool					GetSInt32(const CFStringRef inKey, SInt32& outValue) const;
 	bool					GetUInt32(const CFStringRef inKey, UInt32& outValue) const;
@@ -129,9 +129,9 @@ public:
 	bool					GetFixed32(const CFStringRef inKey, Float32& outValue) const;
 	bool					GetFixed64(const CFStringRef inKey, Float64& outValue) const;
 	bool					Get4CC(const CFStringRef inKey, UInt32& outValue) const;
-	bool					GetString(const CFStringRef inKey, CFStringRef& outValue) const;	
-	bool					GetArray(const CFStringRef inKey, CFArrayRef& outValue) const;	
-	bool					GetDictionary(const CFStringRef inKey, CFDictionaryRef& outValue) const;	
+	bool					GetString(const CFStringRef inKey, CFStringRef& outValue) const;
+	bool					GetArray(const CFStringRef inKey, CFArrayRef& outValue) const;
+	bool					GetDictionary(const CFStringRef inKey, CFDictionaryRef& outValue) const;
 	bool					GetData(const CFStringRef inKey, CFDataRef& outValue) const;
 	bool					GetCFType(const CFStringRef inKey, CFTypeRef& outValue) const;
 	bool					GetURL(const CFStringRef inKey, CFURLRef& outValue) const;
@@ -140,7 +140,7 @@ public:
 	void					GetCACFString(const CFStringRef inKey, CACFString& outItem) const;
 	void					GetCACFArray(const CFStringRef inKey, CACFArray& outItem) const;
 	void					GetCACFDictionary(const CFStringRef inKey, CACFDictionary& outItem) const;
-	
+
 	bool					AddBool(const CFStringRef inKey, bool inValue);
 	bool					AddSInt32(const CFStringRef inKey, SInt32 inValue);
 	bool					AddUInt32(const CFStringRef inKey, UInt32 inValue);
@@ -155,21 +155,21 @@ public:
 	bool					AddData(const CFStringRef inKey, const CFDataRef inValue);
 	bool					AddCFType(const CFStringRef inKey, const CFTypeRef inValue);
 	bool					AddURL(const CFStringRef inKey, const CFURLRef inValue);
-	
+
 	bool					AddCFTypeWithCStringKey(const char* inKey, const CFTypeRef inValue);
 	bool					AddCString(const CFStringRef inKey, const char* inValue);
 
 	void					RemoveKey(const CFStringRef inKey)										{ if(CanModify()) { CFDictionaryRemoveValue(mCFDictionary, inKey); } }
 	void					Clear()																	{ if(CanModify()) { CFDictionaryRemoveAllValues(mCFDictionary); } }
-	
+
 	void					Show()																	{ CFShow(mCFDictionary); }
-	
+
 //	Implementation
 private:
 	CFMutableDictionaryRef 	mCFDictionary;
 	bool					mRelease;
 	bool					mMutable;
-	
+
 							CACFDictionary(const void*);	// prevent accidental instantiation with a pointer via bool constructor
 };
 
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CACFDistributedNotification.cpp b/libs/appleutility/CoreAudio/PublicUtility/CACFDistributedNotification.cpp
index 36c6923..7744ef2 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CACFDistributedNotification.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CACFDistributedNotification.cpp
@@ -2,14 +2,14 @@
      File: CACFDistributedNotification.cpp
  Abstract: CACFDistributedNotification.h
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 //==================================================================================================
 //	Includes
@@ -68,7 +68,7 @@ void	CACFDistributedNotification::AddObserver(const void* inObserver, CFNotifica
 	CFNotificationCenterRef theCenter = CFNotificationCenterGetDarwinNotifyCenter();
 	CFNotificationSuspensionBehavior theSuspensionBehavior = static_cast<CFNotificationSuspensionBehavior>(0);
 #endif
-	 
+
 	CFNotificationCenterAddObserver(theCenter, inObserver, inCallback, inName, NULL, theSuspensionBehavior);
 }
 
@@ -79,7 +79,7 @@ void	CACFDistributedNotification::RemoveObserver(const void* inObserver, CFStrin
 #else
 	CFNotificationCenterRef theCenter = CFNotificationCenterGetDarwinNotifyCenter();
 #endif
-	 
+
 	CFNotificationCenterRemoveObserver(theCenter, inObserver, inName, NULL);
 }
 
@@ -97,11 +97,11 @@ void	CACFDistributedNotification::PostNotification(CFStringRef inName, CFDiction
 	//	flag unsupported features
 	Assert(inUserInfo == NULL, "CACFDistributedNotification::PostNotification: distributed notifications do not support a payload");
 	Assert(inPostToAllSessions, "CACFDistributedNotification::PostNotification: distributed notifications do not support per-session delivery");
-	
+
 	CFNotificationCenterRef theCenter = CFNotificationCenterGetDarwinNotifyCenter();
 	CFDictionaryRef theUserInfo = NULL;
 	CFOptionFlags theFlags = 0;
 #endif
-	 
+
 	 CFNotificationCenterPostNotificationWithOptions(theCenter, inName, NULL, theUserInfo, theFlags);
 }
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CACFDistributedNotification.h b/libs/appleutility/CoreAudio/PublicUtility/CACFDistributedNotification.h
index d75e23b..8132379 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CACFDistributedNotification.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CACFDistributedNotification.h
@@ -2,14 +2,14 @@
      File: CACFDistributedNotification.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #if !defined(__CACFDistributedNotification_h__)
 #define __CACFDistributedNotification_h__
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CACFMachPort.cpp b/libs/appleutility/CoreAudio/PublicUtility/CACFMachPort.cpp
index 9a33d5d..520c37a 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CACFMachPort.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CACFMachPort.cpp
@@ -2,14 +2,14 @@
      File: CACFMachPort.cpp
  Abstract: CACFMachPort.h
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 //==================================================================================================
 //	Includes
@@ -93,7 +93,7 @@ CACFMachPort::CACFMachPort(mach_port_t inMachPort, CFMachPortCallBack inCallBack
 	mOwnsPort(false)
 {
 	CFMachPortContext theContext = { 1, inUserData, NULL, NULL, NULL };
-	
+
 	if(inMachPort == MACH_PORT_NULL)
 	{
 		mMachPort = CFMachPortCreate(NULL, inCallBack, &theContext, NULL);
@@ -119,7 +119,7 @@ CACFMachPort::CACFMachPort(mach_port_t inMachPort, CFMachPortCallBack inCallBack
 		DebugMessage("CACFMachPort::CACFMachPort: couldn't create the CFRunLoopSource");
 		throw CAException('what');
 	}
-	
+
 	if(inInvalidationCallBack != NULL)
 	{
 		CFMachPortSetInvalidationCallBack(mMachPort, inInvalidationCallBack);
@@ -132,7 +132,7 @@ CACFMachPort::~CACFMachPort()
 	{
 		CFRelease(mRunLoopSource);
 	}
-	
+
 	if(mMachPort != NULL)
 	{
 		if(mOwnsPort)
@@ -162,7 +162,7 @@ kern_return_t	CACFMachPort::ReceiveMessage(UInt32 inMaxMessageSize, mach_msg_hea
 	{
 		theOptions |= MACH_RCV_TIMEOUT;
 	}
-	
+
 	//	receive the messsage
 	return mach_msg(outMessage, theOptions, 0, inMaxMessageSize, thePort, inTimeOut, MACH_PORT_NULL);
 }
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CACFMachPort.h b/libs/appleutility/CoreAudio/PublicUtility/CACFMachPort.h
index 18b8ccc..1eb11d2 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CACFMachPort.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CACFMachPort.h
@@ -2,14 +2,14 @@
      File: CACFMachPort.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #if !defined(__CACFMachPort_h__)
 #define __CACFMachPort_h__
@@ -59,7 +59,7 @@
 //	CACFMachPort
 //
 //	This class wraps a CFMachPort.
-//	
+//
 //	Note that when you create a CFMachPort object, CF will attach the run loop source for the the
 //	Mach Port that handles Port Death notifications (aka the Invalidation Callback) to the current
 //	thread's run loop. This is something over which there is no control, so be sure to create the
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CACFMessagePort.cpp b/libs/appleutility/CoreAudio/PublicUtility/CACFMessagePort.cpp
index 97b5da1..c56a7ac 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CACFMessagePort.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CACFMessagePort.cpp
@@ -2,14 +2,14 @@
      File: CACFMessagePort.cpp
  Abstract: CACFMessagePort.h
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 //=============================================================================
 //	Includes
@@ -123,7 +123,7 @@ CACFRemoteMessagePort::CACFRemoteMessagePort(CFStringRef inName, CFMessagePortIn
 		//	because it isn't really an error since the port in question may not
 		//	exist and this fact requires a more complex response than an excpeption
 		//	provides for.
-		
+
 		//	add the invalidation callback, if any
 		if(inInvalidationCallBack != NULL)
 		{
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CACFMessagePort.h b/libs/appleutility/CoreAudio/PublicUtility/CACFMessagePort.h
index c369251..e5b6dab 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CACFMessagePort.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CACFMessagePort.h
@@ -2,14 +2,14 @@
      File: CACFMessagePort.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #if !defined(__CACFMessagePort_h__)
 #define __CACFMessagePort_h__
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CACFNumber.cpp b/libs/appleutility/CoreAudio/PublicUtility/CACFNumber.cpp
index 36d1c2e..7bb8345 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CACFNumber.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CACFNumber.cpp
@@ -2,14 +2,14 @@
      File: CACFNumber.cpp
  Abstract: CACFNumber.h
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 //=============================================================================
 //	Includes
@@ -57,27 +57,27 @@
 Float32	CACFNumber::GetFixed32() const
 {
 	SInt32 theFixedValue = GetSInt32();
-	
+
 	//	this is a 16.16 value so convert it to a float
 	Float32 theSign = theFixedValue < 0 ? -1.0f : 1.0f;
 	theFixedValue *= (SInt32)theSign;
 	Float32 theWholePart = (theFixedValue & 0x7FFF0000) >> 16;
 	Float32 theFractPart = theFixedValue & 0x0000FFFF;
 	theFractPart /= 65536.0f;
-	
+
 	return theSign * (theWholePart + theFractPart);
 }
 
 Float64	CACFNumber::GetFixed64() const
 {
 	SInt64 theFixedValue = GetSInt64();
-	
+
 	//	this is a 32.32 value so convert it to a double
 	Float64 theSign = theFixedValue < 0 ? -1.0 : 1.0;
 	theFixedValue *= (SInt64)theSign;
 	Float64 theWholePart = (theFixedValue & 0x7FFFFFFF00000000LL) >> 32;
 	Float64 theFractPart = theFixedValue & 0x00000000FFFFFFFFLL;
 	theFractPart /= 4294967296.0;
-	
+
 	return theSign * (theWholePart + theFractPart);
 }
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CACFNumber.h b/libs/appleutility/CoreAudio/PublicUtility/CACFNumber.h
index 25887f6..8bf34b4 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CACFNumber.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CACFNumber.h
@@ -2,14 +2,14 @@
      File: CACFNumber.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #if !defined(__CACFNumber_h__)
 #define __CACFNumber_h__
@@ -78,7 +78,7 @@ public:
 private:
 	void			Retain() { if(mWillRelease && (mCFBoolean != NULL)) { CFRetain(mCFBoolean); } }
 	void			Release() { if(mWillRelease && (mCFBoolean != NULL)) { CFRelease(mCFBoolean); } }
-	
+
 	CFBooleanRef	mCFBoolean;
 	bool			mWillRelease;
 
@@ -94,7 +94,7 @@ public:
 	CFBooleanRef	CopyCFBoolean() const { if(mCFBoolean != NULL) { CFRetain(mCFBoolean); } return mCFBoolean; }
 
 	bool			GetBoolean() const { bool theAnswer = false; if(mCFBoolean != NULL) { theAnswer = CFEqual(mCFBoolean, kCFBooleanTrue); } return theAnswer; }
-	
+
 					CACFBoolean(const void*);	// prevent accidental instantiation with a pointer via bool constructor
 };
 
@@ -122,7 +122,7 @@ public:
 private:
 	void		Retain() { if(mWillRelease && (mCFNumber != NULL)) { CFRetain(mCFNumber); } }
 	void		Release() { if(mWillRelease && (mCFNumber != NULL)) { CFRelease(mCFNumber); } }
-	
+
 	CFNumberRef	mCFNumber;
 	bool		mWillRelease;
 
@@ -144,7 +144,7 @@ public:
 	Float32		GetFixed32() const;
 	Float64		GetFixed64() const;
 	SInt64		GetSInt64() const { SInt64 theAnswer = 0; if(mCFNumber != NULL) { CFNumberGetValue(mCFNumber, kCFNumberSInt64Type, &theAnswer); } return theAnswer; }
-	
+
 				CACFNumber(const void*);	// prevent accidental instantiation with a pointer via bool constructor
 };
 
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CACFObject.h b/libs/appleutility/CoreAudio/PublicUtility/CACFObject.h
index 748016b..7a4ed9d 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CACFObject.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CACFObject.h
@@ -2,14 +2,14 @@
      File: CACFObject.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #if !defined(__CACFObject_h__)
 #define __CACFObject_h__
@@ -109,7 +109,7 @@ public:
 private:
 	void				Retain() { if(mWillRelease && (mCFObject != NULL)) { CFRetain(mCFObject); } }
 	void				Release() { if(mWillRelease && (mCFObject != NULL)) { CFRelease(mCFObject); mCFObject = NULL; } }
-	
+
 	CFObjectType		mCFObject;
 	bool				mWillRelease;
 
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CACFPlugIn.h b/libs/appleutility/CoreAudio/PublicUtility/CACFPlugIn.h
index babde13..5dcf2b1 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CACFPlugIn.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CACFPlugIn.h
@@ -2,14 +2,14 @@
      File: CACFPlugIn.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #if !defined(__CACFPlugIn_h__)
 #define __CACFPlugIn_h__
@@ -75,7 +75,7 @@ public:
 private:
 	void			Retain()															{ if(mWillRelease && (mCFPlugIn != NULL)) { CFRetain(mCFPlugIn); } }
 	void			Release()															{ if(mWillRelease && (mCFPlugIn != NULL)) { CFRelease(mCFPlugIn); mCFPlugIn = NULL; } }
-	
+
 	CFPlugInRef		mCFPlugIn;
 	bool			mWillRelease;
 
@@ -84,7 +84,7 @@ public:
 	void			AllowRelease()														{ mWillRelease = true; }
 	void			DontAllowRelease()													{ mWillRelease = false; }
 	bool			IsValid() const														{ return mCFPlugIn != NULL; }
-	
+
 	CFBundleRef		GetBundle() const													{ CFBundleRef theAnswer = NULL; if(IsValid()) { theAnswer = CFPlugInGetBundle(mCFPlugIn); } return theAnswer; }
 	CFStringRef		CopyBundleID() const												{ CFStringRef theAnswer = NULL; CFBundleRef theBundle = GetBundle(); if(IsValid() && (theBundle != NULL)) { theAnswer = CFBundleGetIdentifier(theBundle); if(theAnswer != NULL) { CFRetain(theAnswer); } } return theAnswer; }
 	UInt32			GetBundleVersion() const											{ UInt32 theAnswer = 0; CFBundleRef theBundle = GetBundle(); if(IsValid() && (theBundle != NULL)) { theAnswer = CFBundleGetVersionNumber(theBundle); } return theAnswer; }
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CACFPreferences.cpp b/libs/appleutility/CoreAudio/PublicUtility/CACFPreferences.cpp
index cb2e86c..f605029 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CACFPreferences.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CACFPreferences.cpp
@@ -2,14 +2,14 @@
      File: CACFPreferences.cpp
  Abstract: CACFPreferences.h
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 //==================================================================================================
 //	Includes
@@ -63,23 +63,23 @@ CFPropertyListRef	CACFPreferences::CopyValue(CFStringRef inKey, bool inCurrentUs
 {
 	//	synchronize to make sure that what's in memory matches what's on disk
 	Synchronize(inCurrentUser, inCurrentHost, false);
-	
+
 	CFPropertyListRef theAnswer = NULL;
 	CFStringRef theUser = inCurrentUser ? kCFPreferencesCurrentUser : kCFPreferencesAnyUser;
 	CFStringRef theHost = inCurrentHost ? kCFPreferencesCurrentHost : kCFPreferencesAnyHost;
-	
+
 	theAnswer = CFPreferencesCopyValue(inKey, kCFPreferencesAnyApplication, theUser, theHost);
-	
+
 	return theAnswer;
 }
 
 CFStringRef	CACFPreferences::CopyStringValue(CFStringRef inKey, bool inCurrentUser, bool inCurrentHost)
 {
 	CFStringRef theAnswer = NULL;
-	
+
 	//	get the raw value
 	CFPropertyListRef theRawValue = CopyValue(inKey, inCurrentUser, inCurrentHost);
-	
+
 	if(theRawValue != NULL)
 	{
 		//	get it's type ID and make sure it's a CFString
@@ -95,17 +95,17 @@ CFStringRef	CACFPreferences::CopyStringValue(CFStringRef inKey, bool inCurrentUs
 			DebugMessage("CACFPreferences::CopyStringValue: not a CFString");
 		}
 	}
-	
+
 	return theAnswer;
 }
 
 CFNumberRef	CACFPreferences::CopyNumberValue(CFStringRef inKey, bool inCurrentUser, bool inCurrentHost)
 {
 	CFNumberRef theAnswer = NULL;
-	
+
 	//	get the raw value
 	CFPropertyListRef theRawValue = CopyValue(inKey, inCurrentUser, inCurrentHost);
-	
+
 	if(theRawValue != NULL)
 	{
 		//	get it's type ID and make sure it's a CFNumber
@@ -121,17 +121,17 @@ CFNumberRef	CACFPreferences::CopyNumberValue(CFStringRef inKey, bool inCurrentUs
 			DebugMessage("CACFPreferences::CopyNumberValue: not a CFNumber");
 		}
 	}
-	
+
 	return theAnswer;
 }
 
 CFArrayRef	CACFPreferences::CopyArrayValue(CFStringRef inKey, bool inCurrentUser, bool inCurrentHost)
 {
 	CFArrayRef theAnswer = NULL;
-	
+
 	//	get the raw value
 	CFPropertyListRef theRawValue = CopyValue(inKey, inCurrentUser, inCurrentHost);
-	
+
 	if(theRawValue != NULL)
 	{
 		//	get it's type ID and make sure it's a CFArray
@@ -147,17 +147,17 @@ CFArrayRef	CACFPreferences::CopyArrayValue(CFStringRef inKey, bool inCurrentUser
 			DebugMessage("CACFPreferences::CopyArrayValue: not a CFArray");
 		}
 	}
-	
+
 	return theAnswer;
 }
 
 CFDictionaryRef	CACFPreferences::CopyDictionaryValue(CFStringRef inKey, bool inCurrentUser, bool inCurrentHost)
 {
 	CFDictionaryRef theAnswer = NULL;
-	
+
 	//	get the raw value
 	CFPropertyListRef theRawValue = CopyValue(inKey, inCurrentUser, inCurrentHost);
-	
+
 	if(theRawValue != NULL)
 	{
 		//	get it's type ID and make sure it's a CFDictionary
@@ -173,7 +173,7 @@ CFDictionaryRef	CACFPreferences::CopyDictionaryValue(CFStringRef inKey, bool inC
 			DebugMessage("CACFPreferences::CopyDictionaryValue: not a CFDictionary");
 		}
 	}
-	
+
 	return theAnswer;
 }
 
@@ -182,7 +182,7 @@ void	CACFPreferences::SetValue(CFStringRef inKey, CFPropertyListRef inValue, boo
 	CFStringRef theUser = inCurrentUser ? kCFPreferencesCurrentUser : kCFPreferencesAnyUser;
 	CFStringRef theHost = inCurrentHost ? kCFPreferencesCurrentHost : kCFPreferencesAnyHost;
 	CFPreferencesSetValue(inKey, inValue, kCFPreferencesAnyApplication, theUser, theHost);
-	
+
 	if(inSynchronize)
 	{
 		Synchronize(inCurrentUser, inCurrentHost, true);
@@ -194,7 +194,7 @@ void	CACFPreferences::DeleteValue(CFStringRef inKey, bool inCurrentUser, bool in
 	CFStringRef theUser = inCurrentUser ? kCFPreferencesCurrentUser : kCFPreferencesAnyUser;
 	CFStringRef theHost = inCurrentHost ? kCFPreferencesCurrentHost : kCFPreferencesAnyHost;
 	CFPreferencesSetValue(inKey, NULL, kCFPreferencesAnyApplication, theUser, theHost);
-	
+
 	if(inSynchronize)
 	{
 		Synchronize(theUser, inCurrentHost, true);
@@ -260,7 +260,7 @@ void	CACFPreferences::SendNotification(CFStringRef inName)
 bool	CACFPreferences::ArePrefsOutOfDate(bool inCurrentUser, bool inCurrentHost)
 {
 	bool theAnswer = false;
-	
+
 	if(!inCurrentUser && !inCurrentHost)
 	{
 		theAnswer = sAnyUserAnyHostPrefsOutOfDate;
@@ -277,7 +277,7 @@ bool	CACFPreferences::ArePrefsOutOfDate(bool inCurrentUser, bool inCurrentHost)
 	{
 		theAnswer = sCurrentUserCurrentHostPrefsOutOfDate;
 	}
-	
+
 	return theAnswer;
 }
 
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CACFPreferences.h b/libs/appleutility/CoreAudio/PublicUtility/CACFPreferences.h
index 040490f..53c1b91 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CACFPreferences.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CACFPreferences.h
@@ -2,14 +2,14 @@
      File: CACFPreferences.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #if !defined(__CACFPreferences_h__)
 #define __CACFPreferences_h__
@@ -81,7 +81,7 @@ public:
 
 private:
 	static bool					ArePrefsOutOfDate(bool inCurrentUser, bool inCurrentHost);
-	
+
 	static bool					sAnyUserAnyHostPrefsOutOfDate;
 	static bool					sAnyUserCurrentHostPrefsOutOfDate;
 	static bool					sCurrentUserAnyHostPrefsOutOfDate;
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CACFString.cpp b/libs/appleutility/CoreAudio/PublicUtility/CACFString.cpp
index 3ce81a5..b5328ae 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CACFString.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CACFString.cpp
@@ -2,14 +2,14 @@
      File: CACFString.cpp
  Abstract: CACFString.h
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 //=============================================================================
 //	Includes
@@ -57,13 +57,13 @@
 UInt32	CACFString::GetStringByteLength(CFStringRef inCFString, CFStringEncoding inEncoding)
 {
 	CFIndex theAnswer = 0;
-	
+
 	if(inCFString != NULL)
 	{
 		CFRange theRange = { 0, CFStringGetLength(inCFString) };
 		CFStringGetBytes(inCFString, theRange, inEncoding, 0, false, NULL, 0x7FFFFFFF, &theAnswer);
 	}
-	
+
 	return UInt32(theAnswer);
 }
 
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CACFString.h b/libs/appleutility/CoreAudio/PublicUtility/CACFString.h
index 3abce51..65127d7 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CACFString.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CACFString.h
@@ -2,14 +2,14 @@
      File: CACFString.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #if !defined(__CACFString_h__)
 #define __CACFString_h__
@@ -89,7 +89,7 @@ public:
 private:
 	void				Retain() { if(mWillRelease && (mCFString != NULL)) { CFRetain(mCFString); } }
 	void				Release() { if(mWillRelease && (mCFString != NULL)) { CFRelease(mCFString); } }
-	
+
 	CFStringRef			mCFString;
 	bool				mWillRelease;
 
@@ -121,7 +121,7 @@ public:
 	static void			GetUnicodeString(CFStringRef inCFString, UInt16* outString, UInt32& ioStringSize);
 	static SInt32		GetAsInteger(CFStringRef inCFString) { SInt32 theAnswer = 0; if(inCFString != NULL){ theAnswer = CFStringGetIntValue(inCFString); } return theAnswer; }
 	static Float64		GetAsFloat64(CFStringRef inCFString) { Float64 theAnswer = 0; if(inCFString != NULL){ theAnswer = CFStringGetDoubleValue(inCFString); } return theAnswer; }
-	
+
 };
 
 inline bool	operator<(const CACFString& x, const CACFString& y) { return CFStringCompare(x.GetCFString(), y.GetCFString(), 0) == kCFCompareLessThan; }
@@ -166,7 +166,7 @@ public:
 private:
 	void				Retain() { if(mWillRelease && (mCFMutableString != NULL)) { CFRetain(mCFMutableString); } }
 	void				Release() { if(mWillRelease && (mCFMutableString != NULL)) { CFRelease(mCFMutableString); } }
-	
+
 	CFMutableStringRef	mCFMutableString;
 	bool				mWillRelease;
 
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAComponent.cpp b/libs/appleutility/CoreAudio/PublicUtility/CAComponent.cpp
index 04eae54..77913c4 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAComponent.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAComponent.cpp
@@ -2,14 +2,14 @@
      File: CAComponent.cpp
  Abstract: CAComponent.h
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #include "CAComponent.h"
 #include "CAComponentDescription.h"
@@ -60,21 +60,21 @@ CAComponent::CAComponent (const AudioComponentDescription& inDesc, CAComponent*
 		memcpy (&mDesc, &inDesc, sizeof(AudioComponentDescription));
 }
 
-CAComponent::CAComponent (const AudioComponent& comp) 
+CAComponent::CAComponent (const AudioComponent& comp)
 	: mComp (comp),
-	  mManuName(0), 
-	  mAUName(0), 
+	  mManuName(0),
+	  mAUName(0),
 	  mCompName(0)
 {
 	AudioComponentGetDescription (Comp(), &mDesc);
 }
 
-CAComponent::CAComponent (const AudioComponentInstance& compInst) 
-	: mComp (NULL), 
-	  mManuName(0), 
-	  mAUName(0), 
+CAComponent::CAComponent (const AudioComponentInstance& compInst)
+	: mComp (NULL),
+	  mManuName(0),
+	  mAUName(0),
 	  mCompName(0)
-{ 
+{
 	mComp = AudioComponentInstanceGetComponent (compInst);
 	AudioComponentGetDescription (Comp(), &mDesc);
 }
@@ -113,7 +113,7 @@ CAComponent&	CAComponent::operator= (const CAComponent& y)
 
 	if (y.mManuName) { mManuName = y.mManuName; CFRetain (mManuName); }
 	if (y.mAUName) { mAUName = y.mAUName; CFRetain (mAUName); }
-	if (y.mCompName) { mCompName = y.mCompName; CFRetain (mCompName); } 
+	if (y.mCompName) { mCompName = y.mCompName; CFRetain (mCompName); }
 
 	return *this;
 }
@@ -121,33 +121,33 @@ CAComponent&	CAComponent::operator= (const CAComponent& y)
 void 		CAComponent::SetCompNames () const
 {
 	if (!mCompName) {
-	
+
 		CFStringRef compName;
 		OSStatus result = AudioComponentCopyName (Comp(), &compName);
 		if (result) return;
-		
+
 		const_cast<CAComponent*>(this)->mCompName = compName;
 		if (compName)
 		{
 			CFArrayRef splitStrArray = CFStringCreateArrayBySeparatingStrings(NULL, compName, CFSTR(":"));
-			
+
 			// we need to retain these values so the strings are not lost when the array is released
 			const_cast<CAComponent*>(this)->mManuName = (CFStringRef)CFArrayGetValueAtIndex(splitStrArray, 0);
             CFRetain(this->mManuName);
 			if (CFArrayGetCount(splitStrArray) > 1)
 			{
 				CFStringRef str = (CFStringRef)CFArrayGetValueAtIndex(splitStrArray, 1);
-				
+
 				CFMutableStringRef mstr = CFStringCreateMutableCopy (NULL, CFStringGetLength(str), str);
 
 				// this needs to trim out white space:
-				
+
 				CFStringTrimWhitespace (mstr);
-			
+
 				const_cast<CAComponent*>(this)->mAUName = mstr;
 			} else
 				const_cast<CAComponent*>(this)->mAUName = NULL;
-			
+
 			CFRelease(splitStrArray);
 		}
 	}
@@ -177,6 +177,6 @@ void	CAComponent::Print(FILE* file) const
 		fprintf (file, ", Manu:"); _ShowCF (file, mManuName);
 		if (mAUName) fprintf (file, ", Name:"); _ShowCF (file, mAUName);
 	}
-	fprintf (file, ", "); 
+	fprintf (file, ", ");
 	Desc ().Print(file);
 }
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAComponent.h b/libs/appleutility/CoreAudio/PublicUtility/CAComponent.h
index 5ff24ee..17bbb61 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAComponent.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAComponent.h
@@ -2,14 +2,14 @@
      File: CAComponent.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #ifndef __CAComponent_h__
 #define __CAComponent_h__
@@ -54,63 +54,63 @@
 
 #include "CAComponentDescription.h"
 
-class CAComponent 
+class CAComponent
 {
 public:
 	CAComponent ()
 		: mComp (0), mDesc(), mManuName(0), mAUName(0), mCompName(0) {}
-		
+
 		// if next is specifed that is used to find the next component after that one
 	CAComponent (const AudioComponentDescription& inDesc, CAComponent* next = 0);
-	
-	CAComponent (const CAComponent& y) 
+
+	CAComponent (const CAComponent& y)
 		: mComp (0), mDesc(), mManuName(0), mAUName(0), mCompName(0) { *this = y; }
 
 	CAComponent (const AudioComponent& comp);
-	
+
 	CAComponent (const AudioComponentInstance& compInst);
 
 	CAComponent (OSType inType, OSType inSubtype = 0, OSType inManu = 0);
-	
+
 	~CAComponent ();
-	
+
 	CAComponent&	operator= (const CAComponent& y);
-	
+
 		// returns true if this object references a valid component
 	bool			IsValid () const { return Comp() != 0; }
-	
+
 	bool			HasAUStrings() const { 	SetCompNames (); return mManuName != 0; }
 
 		// CFStringRef should be retained by caller if needed beyond lifetime of this object
-		
+
 		// Can return NULL if component doesn't follow AU naming conventions
 	CFStringRef		GetAUManu () const { SetCompNames (); return mManuName; }
 	CFStringRef		GetAUName () const { SetCompNames (); return mAUName ? mAUName : mCompName; }
-		
+
 		// Return value of NULL indicates a problem getting that information from the component
 	CFStringRef		GetCompName () const { SetCompNames(); return mCompName; }
-	
+
 	const CAComponentDescription&	Desc () const { return mDesc; }
-			
-	OSStatus		Open (AudioComponentInstance& outInst) const 
+
+	OSStatus		Open (AudioComponentInstance& outInst) const
 	{
 		return AudioComponentInstanceNew (Comp(), &outInst);
   	}
 
 	OSStatus			GetVersion (UInt32 &outVersion) const;
-	
+
 	const AudioComponent&		Comp() const { return mComp; }
-	
+
 	void				Print(FILE* file = stdout) const;
 
 	OSStatus			Save (CFPropertyListRef *outData) const;
-		
+
 	OSStatus			Restore (CFPropertyListRef &inData);
-	
+
 private:
 	AudioComponent mComp;
 	CAComponentDescription mDesc;
-	
+
 	CFStringRef mManuName, mAUName, mCompName;
 
 	void	SetCompNames () const;
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAComponentDescription.cpp b/libs/appleutility/CoreAudio/PublicUtility/CAComponentDescription.cpp
index a3c877b..53dae27 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAComponentDescription.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAComponentDescription.cpp
@@ -2,14 +2,14 @@
      File: CAComponentDescription.cpp
  Abstract: CAComponentDescription.h
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #include "CAComponentDescription.h"
 #include "CAStreamBasicDescription.h"
@@ -60,7 +60,7 @@ void 	CAComponentDescription::_CAShowComponentDescription(const AudioComponentDe
 		char str[24];
 		fprintf (file, "AudioComponentDescription: %s - ", CAStringForOSType(desc->componentType, str, sizeof(str)));
 		fprintf (file, "%s - ", CAStringForOSType(desc->componentSubType, str, sizeof(str)));
-		fprintf (file, "%s", CAStringForOSType(desc->componentManufacturer, str, sizeof(str)));		
+		fprintf (file, "%s", CAStringForOSType(desc->componentManufacturer, str, sizeof(str)));
 		fprintf (file, ", 0x%X, 0x%X\n", (int)desc->componentFlags, (int)desc->componentFlagsMask);
 	}
 }
@@ -74,11 +74,11 @@ CAComponentDescription::CAComponentDescription (OSType inType, OSType inSubtype,
 	componentFlagsMask = 0;
 }
 
-bool	CAComponentDescription::IsAU () const 
-{ 
+bool	CAComponentDescription::IsAU () const
+{
 	bool flag = IsEffect() || IsMusicDevice() || IsOffline();
 	if (flag) return true;
-	
+
 	switch (componentType) {
 		case kAudioUnitType_Output:
 		case kAudioUnitType_FormatConverter:
@@ -90,21 +90,21 @@ bool	CAComponentDescription::IsAU () const
 
 inline bool _MatchTest (const OSType &inTypeA, const OSType &inTypeB)
 {
-	return ((inTypeA == inTypeB) || (!inTypeA && !inTypeB) || (inTypeA && !inTypeB) || (!inTypeA && inTypeB)); 
+	return ((inTypeA == inTypeB) || (!inTypeA && !inTypeB) || (inTypeA && !inTypeB) || (!inTypeA && inTypeB));
 }
 
 bool	CAComponentDescription::Matches (const AudioComponentDescription &desc) const
 {
 	bool matches = false;
-		
+
 		// see if the type matches
 	matches = _MatchTest (componentType, desc.componentType);
-	
+
 	if (matches)
 		matches = _MatchTest (componentSubType, desc.componentSubType);
-	
+
 	if (matches)
 		matches = _MatchTest (componentManufacturer, desc.componentManufacturer);
-	
+
 	return matches;
 }
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAComponentDescription.h b/libs/appleutility/CoreAudio/PublicUtility/CAComponentDescription.h
index 5c756ea..1531129 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAComponentDescription.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAComponentDescription.h
@@ -2,14 +2,14 @@
      File: CAComponentDescription.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #ifndef __CAComponentDescription_h__
 #define __CAComponentDescription_h__
@@ -66,57 +66,57 @@ void CAShowComponentDescription(const AudioComponentDescription *desc);
 class CAComponentDescription : public AudioComponentDescription {
 public:
 	CAComponentDescription() { memset (this, 0, sizeof (AudioComponentDescription)); }
-	
+
 	CAComponentDescription (OSType inType, OSType inSubtype = 0, OSType inManu = 0);
 
 	CAComponentDescription(const AudioComponentDescription& desc) { memcpy (this, &desc, sizeof (AudioComponentDescription)); }
-		
+
 	// _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
 	//
 	// interrogation
-	
+
 	bool	IsAU () const;
-	
+
 	bool	IsAUFX() const { return componentType == kAudioUnitType_Effect; }
 	bool	IsAUFM() const { return componentType == kAudioUnitType_MusicEffect; }
-    
+
     bool    IsAUMI() const { return componentType == 'aumi' /*kAudioUnitType_MIDIProcessor*/; }
-	
+
 	bool	IsAUAX () const { return componentType == 'auax' /*kAudioUnitType_Auxiliary*/; }
-	
+
 	bool 	IsEffect () const { return IsAUFX() || IsAUFM() || IsPanner(); }
-	
+
 	bool	IsOffline () const { return componentType == 'auol' /*kAudioUnitType_Offline*/; }
-	
+
 	bool 	IsFConv () const { return componentType == kAudioUnitType_FormatConverter; }
-	
+
 	bool	IsPanner () const { return componentType == kAudioUnitType_Panner; }
-	
+
 	bool	IsMusicDevice () const { return componentType == kAudioUnitType_MusicDevice; }
-	
+
 #ifndef MAC_OS_X_VERSION_10_4
 	bool	IsGenerator () const { return componentType =='augn'; }
 #else
 	bool	IsGenerator () const { return componentType ==kAudioUnitType_Generator; }
 #endif
-	
+
 	bool	IsOutput () const { return componentType == kAudioUnitType_Output; }
-	
+
 	bool	IsSource () const { return IsMusicDevice() || IsGenerator(); }
-	
+
 	OSType	Type () const { return componentType; }
 	OSType	SubType () const { return componentSubType; }
 	OSType 	Manu () const { return componentManufacturer; }
 
 	int		Count() const { return AudioComponentCount(const_cast<CAComponentDescription*>(this)); }
-	
+
 		// does a semantic match where "wild card" values for type, subtype, manu will match
 	bool	Matches (const AudioComponentDescription &desc) const;
-	
+
 	// _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
 	//
 	//	other
-	
+
 	void	Print(FILE* file = stdout) const 	{ _CAShowComponentDescription (this, file); }
 
 	OSStatus			Save (CFPropertyListRef *outData) const;
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CADebugMacros.cpp b/libs/appleutility/CoreAudio/PublicUtility/CADebugMacros.cpp
index 9739e37..f60b54d 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CADebugMacros.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CADebugMacros.cpp
@@ -2,14 +2,14 @@
      File: CADebugMacros.cpp
  Abstract: CADebugMacros.h
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #include "CADebugMacros.h"
 #include <stdio.h>
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CADebugMacros.h b/libs/appleutility/CoreAudio/PublicUtility/CADebugMacros.h
index 15af919..980f6b5 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CADebugMacros.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CADebugMacros.h
@@ -2,14 +2,14 @@
      File: CADebugMacros.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #if !defined(__CADebugMacros_h__)
 #define __CADebugMacros_h__
@@ -95,7 +95,7 @@
 #if	DEBUG || CoreAudio_Debug
 	// can be used to break into debugger immediately, also see CADebugger
 	#define BusError()		{ long* p=NULL; *p=0; }
-	
+
 	//	basic debugging print routines
 	#if	TARGET_OS_MAC && !TARGET_API_MAC_CARBON
 		extern void DebugStr(const unsigned char* debuggerMsg);
@@ -105,13 +105,13 @@
 		#define DebugMessageN3(msg, N1, N2, N3)
 	#else
 		#include "CADebugPrintf.h"
-		
+
 		#if	(CoreAudio_FlushDebugMessages && !CoreAudio_UseSysLog) || defined(CoreAudio_UseSideFile)
 			#define	FlushRtn	,fflush(DebugPrintfFile)
 		#else
 			#define	FlushRtn
 		#endif
-		
+
 		#if		CoreAudio_ThreadStampMessages
 			#include <pthread.h>
 			#include "CAHostTimeBase.h"
@@ -137,7 +137,7 @@
 	#else
 		#define vprint(msg)
 	#endif
-	
+
 	// Original macro keeps its function of turning on and off use of CADebuggerStop() for both asserts and throws.
 	// For backwards compat, it overrides any setting of the two sub-macros.
 	#if	CoreAudio_StopOnFailure
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CADebugPrintf.cpp b/libs/appleutility/CoreAudio/PublicUtility/CADebugPrintf.cpp
index d691de3..b401c3a 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CADebugPrintf.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CADebugPrintf.cpp
@@ -2,14 +2,14 @@
      File: CADebugPrintf.cpp
  Abstract: CADebugPrintf.h
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 //==================================================================================================
 //	Includes
@@ -69,7 +69,7 @@
 			return 0;
 		}
 	#endif
-	
+
 	#if defined(CoreAudio_UseSideFile)
 		#include <unistd.h>
 		FILE* sDebugPrintfSideFile = NULL;
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CADebugPrintf.h b/libs/appleutility/CoreAudio/PublicUtility/CADebugPrintf.h
index 79aa15d..905d0f2 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CADebugPrintf.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CADebugPrintf.h
@@ -2,14 +2,14 @@
      File: CADebugPrintf.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #if !defined(__CADebugPrintf_h__)
 #define __CADebugPrintf_h__
@@ -65,14 +65,14 @@
 //#define	CoreAudio_UseSideFile	"/CoreAudio-%d.txt"
 
 #if	DEBUG || CoreAudio_Debug
-	
+
 	#if	TARGET_OS_WIN32
 		#if defined(__cplusplus)
 		extern "C"
 		#endif
 		extern int CAWin32DebugPrintf(char* inFormat, ...);
 		#define	DebugPrintfRtn			CAWin32DebugPrintf
-		#define	DebugPrintfFile			
+		#define	DebugPrintfFile
 		#define	DebugPrintfLineEnding	"\n"
 		#define	DebugPrintfFileComma
 	#else
@@ -104,9 +104,9 @@
 
 	#define	DebugPrintf(inFormat, ...)	DebugPrintfRtn(DebugPrintfFileComma inFormat DebugPrintfLineEnding, ## __VA_ARGS__)
 #else
-	#define	DebugPrintfRtn	
-	#define	DebugPrintfFile	
-	#define	DebugPrintfLineEnding	
+	#define	DebugPrintfRtn
+	#define	DebugPrintfFile
+	#define	DebugPrintfLineEnding
 	#define	DebugPrintfFileComma
 	#define	DebugPrintf(inFormat, ...)
 #endif
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CADebugger.cpp b/libs/appleutility/CoreAudio/PublicUtility/CADebugger.cpp
index 7f0141d..eb690a5 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CADebugger.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CADebugger.cpp
@@ -2,14 +2,14 @@
      File: CADebugger.cpp
  Abstract: CADebugger.h
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 //=============================================================================
 //	Includes
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CADebugger.h b/libs/appleutility/CoreAudio/PublicUtility/CADebugger.h
index 9391f01..6c07514 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CADebugger.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CADebugger.h
@@ -2,14 +2,14 @@
      File: CADebugger.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #if !defined(__CADebugger_h__)
 #define __CADebugger_h__
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAException.h b/libs/appleutility/CoreAudio/PublicUtility/CAException.h
index 7217001..26b3af1 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAException.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAException.h
@@ -2,14 +2,14 @@
      File: CAException.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #if !defined(__CAException_h__)
 #define __CAException_h__
@@ -71,7 +71,7 @@ public:
 					~CAException() {}
 
 	OSStatus		GetError() const { return mError; }
-	
+
 protected:
 	OSStatus		mError;
 };
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAExtAudioFile.h b/libs/appleutility/CoreAudio/PublicUtility/CAExtAudioFile.h
index f1aa56f..bf0c7e1 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAExtAudioFile.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAExtAudioFile.h
@@ -2,14 +2,14 @@
      File: CAExtAudioFile.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #ifndef __CAExtAudioFile_h__
 #define __CAExtAudioFile_h__
@@ -74,9 +74,9 @@ public:
 	{
 		Close();
 	}
-	
+
 	bool IsValid() const { return mExtAudioFile != NULL; }
-	
+
 	void	Open(const char* filename)
 	{
 		Close();
@@ -88,7 +88,7 @@ public:
 		Check(res, "ExtAudioFileOpenURL");
 		CFRelease (url);
 	}
-	
+
 	// this group of methods maps directly to the API other than OSStatus results translating into exceptions.
 	// you must explicitly open, wrap or create a file.
 	void	OpenURL(CFURLRef url)
@@ -96,7 +96,7 @@ public:
 		Close();
 		Check(ExtAudioFileOpenURL(url, &mExtAudioFile), "ExtAudioFileOpenURL");
 	}
-		
+
 	void	WrapAudioFileID(AudioFileID inFileID, Boolean forWriting)
 	{
 		Close();
@@ -114,7 +114,7 @@ public:
 		Check(res, "ExtAudioFileCreateWithURL");
 		CFRelease(url);
 	}
-	
+
 	void	CreateWithURL(CFURLRef url, AudioFileTypeID filetype, const AudioStreamBasicDescription &streamDesc, const AudioChannelLayout *channelLayout, UInt32 flags)
 	{
 		Close();
@@ -129,12 +129,12 @@ public:
 			mExtAudioFile = NULL;
 		}
 	}
-	
+
 	void	Read(UInt32 &ioNumberFrames, AudioBufferList *ioData)
 	{
 		Check(ExtAudioFileRead(mExtAudioFile, &ioNumberFrames, ioData), "ExtAudioFileRead");
 	}
-	
+
 	OSStatus	Write(UInt32 inNumberFrames, const AudioBufferList *ioData)
 	{
 		OSStatus err = ExtAudioFileWrite(mExtAudioFile, inNumberFrames, ioData);
@@ -154,41 +154,41 @@ public:
 		}
 		return err;
 	}
-	
+
 	void	WriteAsync(UInt32 inNumberFrames, const AudioBufferList *ioData)
 	{
 		Check(ExtAudioFileWriteAsync(mExtAudioFile, inNumberFrames, ioData), "ExtAudioFileWriteAsync");
 	}
-	
+
 	void	Seek(SInt64 inFrameOffset)
 	{
 		Check(ExtAudioFileSeek(mExtAudioFile, inFrameOffset), "ExtAudioFileSeek");
 	}
-	
+
 	SInt64	Tell() const
 	{
 		SInt64 pos;
 		Check(ExtAudioFileTell(mExtAudioFile, &pos), "ExtAudioFileTell");
 		return pos;
 	}
-	
+
 	UInt32	GetPropertyInfo(ExtAudioFilePropertyID propid, Boolean *outWritable) const
 	{
 		UInt32 size;
 		CheckProperty(ExtAudioFileGetPropertyInfo(mExtAudioFile, propid, &size, outWritable), "ExtAudioFileGetPropertyInfo", propid);
 		return size;
 	}
-	
+
 	void	GetProperty(ExtAudioFilePropertyID propid, UInt32 &ioSize, void *outData) const
 	{
 		CheckProperty(ExtAudioFileGetProperty(mExtAudioFile, propid, &ioSize, outData), "ExtAudioFileGetProperty", propid);
 	}
-	
+
 	void	SetProperty(ExtAudioFilePropertyID propid, UInt32 size, const void *inData)
 	{
 		CheckProperty(ExtAudioFileSetProperty(mExtAudioFile, propid, size, inData), "ExtAudioFileSetProperty", propid);
 	}
-	
+
 	const CAAudioChannelLayout &GetFileChannelLayout()
 	{
 		return FetchChannelLayout(mFileChannelLayout, kExtAudioFileProperty_FileChannelLayout);
@@ -204,13 +204,13 @@ public:
 		GetProperty(kExtAudioFileProperty_FileDataFormat, size, &mFileDataFormat);
 		return mFileDataFormat;
 	}
-	
+
 	const CAStreamBasicDescription &GetClientDataFormat() {
 		UInt32 size = sizeof(mClientDataFormat);
 		GetProperty(kExtAudioFileProperty_ClientDataFormat, size, &mClientDataFormat);
 		return mClientDataFormat;
 	}
-	
+
 
 	void	SetClientFormat(const CAStreamBasicDescription &dataFormat, const CAAudioChannelLayout *layout=NULL, UInt32 codecManuf=0) {
 		if (codecManuf != 0)
@@ -219,11 +219,11 @@ public:
 		if (layout)
 			SetClientChannelLayout(*layout);
 	}
-	
+
 	void	SetClientChannelLayout(const CAAudioChannelLayout &layout) {
 		SetProperty(kExtAudioFileProperty_ClientChannelLayout, layout.Size(), &layout.Layout());
 	}
-	
+
 	AudioConverterRef				GetConverter() const {
 		UInt32 size = sizeof(AudioConverterRef);
 		AudioConverterRef converter = NULL;
@@ -232,7 +232,7 @@ public:
 	}
 
 	bool	HasConverter() const { return GetConverter() != NULL; }
-	
+
 	OSStatus	SetConverterProperty(AudioConverterPropertyID inPropertyID,	UInt32 inPropertyDataSize, const void *inPropertyData, bool inCanFail=false)
 	{
 		OSStatus err = AudioConverterSetProperty(GetConverter(), inPropertyID, inPropertyDataSize, inPropertyData);
@@ -245,14 +245,14 @@ public:
 		}
 		return err;
 	}
-	
+
 	SInt64		GetNumberFrames() {
 		SInt64 length;
 		UInt32 size = sizeof(SInt64);
 		GetProperty(kExtAudioFileProperty_FileLengthFrames, size, &length);
 		return length;
 	}
-	
+
 
 protected:
 	virtual void Check(OSStatus err, const char *func) const
@@ -263,7 +263,7 @@ protected:
 			throw CAXException(txt, err);
 		}
 	}
-	
+
 	virtual void CheckProperty(OSStatus err, const char *func, UInt32 propid) const
 	{
 		if (err) {
@@ -289,7 +289,7 @@ private:
 
 private:
 	ExtAudioFileRef				mExtAudioFile;
-	
+
 	// for convenience to the client, it helps if we hold onto some storage for these
 	CAStreamBasicDescription	mFileDataFormat;
 	CAAudioChannelLayout		mFileChannelLayout;
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAFilePathUtils.cpp b/libs/appleutility/CoreAudio/PublicUtility/CAFilePathUtils.cpp
index 124cb21..1d46f29 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAFilePathUtils.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAFilePathUtils.cpp
@@ -2,14 +2,14 @@
      File: CAFilePathUtils.cpp
  Abstract: CAFilePathUtils.h
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #include "CAFilePathUtils.h"
 #include <string.h>
@@ -72,16 +72,16 @@ OSStatus	PosixPathToParentFSRefAndName(const char *path, FSRef &outParentDir, CF
 	// get the directory's FSRef
 	OSStatus err = CFURLGetFSRef(dirurl, &outParentDir) ? OSStatus(noErr) : OSStatus(kAudio_FileNotFoundError);
 	CFRelease(dirurl);
-	
+
 	CFStringRef lastPathComponent = CFURLCopyLastPathComponent(fullurl);
 	CFRelease(fullurl);
 	CFMutableStringRef filename = CFStringCreateMutableCopy(NULL, 0, lastPathComponent);
 	CFRelease(lastPathComponent);
 	// convert colons (legal in POSIX paths, illegal in File Manager) to slashes
 	CFStringFindAndReplace(filename, CFSTR(":"), CFSTR("/"), CFRangeMake(0, CFStringGetLength(filename)), 0);
-	
+
 	outFileName = filename;
-	
+
 	return err;
 }
 #endif // !CA_NO_CORE_SERVICES
@@ -92,29 +92,29 @@ OSStatus	PosixPathToParentFSRefAndName(const char *path, FSRef &outParentDir, CF
 char*	dirname(const char* inPath)
 {
 	static char sAnswer[1024];
-	
+
 	char* theAnswer = NULL;
 	SInt32 thePathLength = strlen(inPath);
 	if(thePathLength < 1023)
 	{
 		//	make a working copy
 		strlcpy(sAnswer, inPath, sizeof(sAnswer));
-		
+
 		//	start at the end of the string
 		SInt32 theIndex = thePathLength - 1;
-		
+
 		//	walk back over the '\' characters
 		while((theIndex > 0) && (sAnswer[theIndex] == '\\'))
 		{
 			--theIndex;
 		}
-		
+
 		//	now keep walking back until we get to a '\'
 		while((theIndex > 0) && (sAnswer[theIndex] != '\\'))
 		{
 			--theIndex;
 		}
-		
+
 		//	where we are now is either the first character of the path or the '\' that marks the end of the directory name
 		if(theIndex > 0)
 		{
@@ -127,34 +127,34 @@ char*	dirname(const char* inPath)
 			sAnswer[0] = '.';
 			sAnswer[1] = 0;
 		}
-		
+
 		//	set the return value
 		theAnswer = sAnswer;
 	}
-	
+
 	return theAnswer;
 }
 
 char*	basename(const char* inPath)
 {
 	static char sAnswer[1024];
-	
+
 	char* theAnswer = NULL;
 	SInt32 thePathLength = strlen(inPath);
 	if(thePathLength < 1023)
 	{
 		//	make a working copy
 		strlcpy(sAnswer, inPath, sizeof(sAnswer));
-		
+
 		//	start at the end of the string
 		SInt32 theLastIndex = thePathLength - 1;
-		
+
 		//	walk back over the '\' characters
 		while((theLastIndex > 0) && (sAnswer[theLastIndex] == '\\'))
 		{
 			--theLastIndex;
 		}
-		
+
 		//	check to see if we're at the beginning now
 		if(theLastIndex > 0)
 		{
@@ -164,10 +164,10 @@ char*	basename(const char* inPath)
 			{
 				--theFirstIndex;
 			}
-			
+
 			//	we now have a string, so put a '\0' after the last character
 			sAnswer[theLastIndex + 1] = 0;
-			
+
 			//	and set the return value
 			theAnswer = &sAnswer[theFirstIndex];
 		}
@@ -176,12 +176,12 @@ char*	basename(const char* inPath)
 			//	the path was entirely '\' characters, so the return value is "\"
 			sAnswer[0] = '\\';
 			sAnswer[1] = 0;
-		
+
 			//	set the return value
 			theAnswer = sAnswer;
 		}
 	}
-	
+
 	return theAnswer;
 }
 
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAFilePathUtils.h b/libs/appleutility/CoreAudio/PublicUtility/CAFilePathUtils.h
index 41f1ee0..53597a1 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAFilePathUtils.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAFilePathUtils.h
@@ -2,14 +2,14 @@
      File: CAFilePathUtils.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #ifndef __CAFilePathUtils_h__
 #define __CAFilePathUtils_h__
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAGuard.cpp b/libs/appleutility/CoreAudio/PublicUtility/CAGuard.cpp
index a1c83be..1c766f9 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAGuard.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAGuard.cpp
@@ -2,14 +2,14 @@
      File: CAGuard.cpp
  Abstract: CAGuard.h
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 //==================================================================================================
 //	Includes
@@ -169,7 +169,7 @@ bool	CAGuard::WaitFor(UInt64 inNanos)
 		theTimeSpec.tv_sec = 0;
 		theTimeSpec.tv_nsec = static_cast<long>(inNanos);
 	}
-	
+
 	#if	Log_TimedWaits || Log_Latency || Log_Average_Latency
 		UInt64	theStartNanos = CAHostTimeBase::GetCurrentTimeInNanos();
 	#endif
@@ -183,19 +183,19 @@ bool	CAGuard::WaitFor(UInt64 inNanos)
 	OSStatus theError = pthread_cond_timedwait_relative_np(&mCondVar, &mMutex, &theTimeSpec);
 	ThrowIf((theError != 0) && (theError != ETIMEDOUT), CAException(theError), "CAGuard::WaitFor: Wait got an error");
 	mOwner = pthread_self();
-	
+
 	#if	Log_TimedWaits || Log_Latency || Log_Average_Latency
 		UInt64	theEndNanos = CAHostTimeBase::GetCurrentTimeInNanos();
 	#endif
-	
+
 	#if	Log_TimedWaits
 		DebugMessageN1("CAGuard::WaitFor: waited  %.0f", (Float64)(theEndNanos - theStartNanos));
 	#endif
-	
+
 	#if	Log_Latency
 		DebugMessageN1("CAGuard::WaitFor: latency  %.0f", (Float64)((theEndNanos - theStartNanos) - inNanos));
 	#endif
-	
+
 	#if	Log_Average_Latency
 		++mAverageLatencyCount;
 		mAverageLatencyAccumulator += (theEndNanos - theStartNanos) - inNanos;
@@ -231,7 +231,7 @@ bool	CAGuard::WaitFor(UInt64 inNanos)
 	#if	Log_WaitOwnership
 		DebugPrintfRtn(DebugPrintfFileComma "%lu %.4f: CAGuard::WaitFor: thread %lu is waiting on %s, owner: %lu\n", GetCurrentThreadId(), ((Float64)(CAHostTimeBase::GetCurrentTimeInNanos()) / 1000000.0), GetCurrentThreadId(), mName, mOwner);
 	#endif
-	
+
 	ReleaseMutex(mMutex);
 	HANDLE theHandles[] = { mMutex, mEvent };
 	OSStatus theError = WaitForMultipleObjects(2, theHandles, true, theWaitTime);
@@ -246,15 +246,15 @@ bool	CAGuard::WaitFor(UInt64 inNanos)
 	#if	Log_TimedWaits || Log_Latency || Log_Average_Latency
 		UInt64	theEndNanos = CAHostTimeBase::GetCurrentTimeInNanos();
 	#endif
-	
+
 	#if	Log_TimedWaits
 		DebugMessageN1("CAGuard::WaitFor: waited  %.0f", (Float64)(theEndNanos - theStartNanos));
 	#endif
-	
+
 	#if	Log_Latency
 		DebugMessageN1("CAGuard::WaitFor: latency  %.0f", (Float64)((theEndNanos - theStartNanos) - inNanos));
 	#endif
-	
+
 	#if	Log_Average_Latency
 		++mAverageLatencyCount;
 		mAverageLatencyAccumulator += (theEndNanos - theStartNanos) - inNanos;
@@ -280,11 +280,11 @@ bool	CAGuard::WaitUntil(UInt64 inNanos)
 {
 	bool	theAnswer = false;
 	UInt64	theCurrentNanos = CAHostTimeBase::GetCurrentTimeInNanos();
-	
+
 #if	Log_TimedWaits
 	DebugMessageN2("CAGuard::WaitUntil: now: %.0f, requested: %.0f", (double)theCurrentNanos, (double)inNanos);
 #endif
-	
+
 	if(inNanos > theCurrentNanos)
 	{
 #if Log_Errors
@@ -319,7 +319,7 @@ void	CAGuard::Notify()
 	#if	Log_WaitOwnership
 		DebugPrintfRtn(DebugPrintfFileComma "%lu %.4f: CAGuard::Notify: thread %lu is notifying %s, owner: %lu\n", GetCurrentThreadId(), ((Float64)(CAHostTimeBase::GetCurrentTimeInNanos()) / 1000000.0), GetCurrentThreadId(), mName, mOwner);
 	#endif
-	
+
 	SetEvent(mEvent);
 #endif
 }
@@ -337,7 +337,7 @@ void	CAGuard::NotifyAll()
 	#if	Log_WaitOwnership
 		DebugPrintfRtn(DebugPrintfFileComma "%lu %.4f: CAGuard::NotifyAll: thread %lu is notifying %s, owner: %lu\n", GetCurrentThreadId(), ((Float64)(CAHostTimeBase::GetCurrentTimeInNanos()) / 1000000.0), GetCurrentThreadId(), mName, mOwner);
 	#endif
-	
+
 	SetEvent(mEvent);
 #endif
 }
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAGuard.h b/libs/appleutility/CoreAudio/PublicUtility/CAGuard.h
index ffcb59d..f6d80ec 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAGuard.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAGuard.h
@@ -2,14 +2,14 @@
      File: CAGuard.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #if !defined(__CAGuard_h__)
 #define __CAGuard_h__
@@ -83,7 +83,7 @@ public:
 	virtual void	Wait();
 	virtual bool	WaitFor(UInt64 inNanos);
 	virtual bool	WaitUntil(UInt64 inNanos);
-	
+
 	virtual void	Notify();
 	virtual void	NotifyAll();
 
@@ -98,34 +98,34 @@ protected:
 	Float64			mAverageLatencyAccumulator;
 	UInt32			mAverageLatencyCount;
 #endif
-	
+
 //	Helper class to manage taking and releasing recursively
 public:
 	class			Locker
 	{
-	
+
 	//	Construction/Destruction
 	public:
 					Locker(CAGuard& inGuard) : mGuard(inGuard), mNeedsRelease(false) { mNeedsRelease = mGuard.Lock(); }
 					~Locker() { if(mNeedsRelease) { mGuard.Unlock(); } }
-	
+
 	private:
 					Locker(const Locker&);
 		Locker&		operator=(const Locker&);
-	
+
 	//	Actions
 	public:
 		void		Wait() { mGuard.Wait(); }
 		bool		WaitFor(UInt64 inNanos) { return mGuard.WaitFor(inNanos); }
 		bool		WaitUntil(UInt64 inNanos) { return mGuard.WaitUntil(inNanos); }
-		
+
 		void		Notify() { mGuard.Notify(); }
 		void		NotifyAll() { mGuard.NotifyAll(); }
 
 	//	Implementation
 	private:
 		CAGuard&	mGuard;
-		bool		mNeedsRelease;	
+		bool		mNeedsRelease;
 	};
 
 };
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAHALAudioDevice.cpp b/libs/appleutility/CoreAudio/PublicUtility/CAHALAudioDevice.cpp
index 9bce346..fe668b9 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAHALAudioDevice.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAHALAudioDevice.cpp
@@ -2,14 +2,14 @@
      File: CAHALAudioDevice.cpp
  Abstract: CAHALAudioDevice.h
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 //==================================================================================================
 //	Includes
@@ -544,7 +544,7 @@ void	CAHALAudioDevice::StartIOProcAtTime(AudioDeviceIOProcID inIOProcID, AudioTi
 	{
 		theFlags |= kAudioDeviceStartTimeDontConsultDeviceFlag;
 	}
-	
+
 	OSStatus theError = AudioDeviceStartAtTime(mObjectID, inIOProcID, &ioStartTime, theFlags);
 	ThrowIfError(theError, CAException(theError), "CAHALAudioDevice::StartIOProcAtTime: got an error starting an IOProc");
 }
@@ -561,15 +561,15 @@ void	CAHALAudioDevice::GetIOProcStreamUsage(AudioDeviceIOProcID inIOProcID, bool
 	UInt32 theNumberStreams = GetNumberStreams(inIsInput);
 	UInt32 theSize = SizeOf32(void*) + SizeOf32(UInt32) + (theNumberStreams * SizeOf32(UInt32));
 	CAAutoFree<AudioHardwareIOProcStreamUsage> theStreamUsage(theSize);
-	
+
 	//	set it up
 	theStreamUsage->mIOProc = reinterpret_cast<void*>(inIOProcID);
 	theStreamUsage->mNumberStreams = theNumberStreams;
-	
+
 	//	get the property
 	CAPropertyAddress theAddress(kAudioDevicePropertyIOProcStreamUsage, inIsInput ? kAudioDevicePropertyScopeInput : kAudioDevicePropertyScopeOutput);
 	GetPropertyData(theAddress, 0, NULL, theSize, theStreamUsage);
-	
+
 	//	fill out the return value
 	for(UInt32 theIndex = 0; theIndex < theNumberStreams; ++theIndex)
 	{
@@ -583,7 +583,7 @@ void	CAHALAudioDevice::SetIOProcStreamUsage(AudioDeviceIOProcID inIOProcID, bool
 	UInt32 theNumberStreams = GetNumberStreams(inIsInput);
 	UInt32 theSize = SizeOf32(void*) + SizeOf32(UInt32) + (theNumberStreams * SizeOf32(UInt32));
 	CAAutoFree<AudioHardwareIOProcStreamUsage> theStreamUsage(theSize);
-	
+
 	//	set it up
 	theStreamUsage->mIOProc = reinterpret_cast<void*>(inIOProcID);
 	theStreamUsage->mNumberStreams = theNumberStreams;
@@ -591,7 +591,7 @@ void	CAHALAudioDevice::SetIOProcStreamUsage(AudioDeviceIOProcID inIOProcID, bool
 	{
 		theStreamUsage->mStreamIsOn[theIndex] = (inStreamUsage[theIndex] ? 1 : 0);
 	}
-	
+
 	//	set the property
 	CAPropertyAddress theAddress(kAudioDevicePropertyIOProcStreamUsage, inIsInput ? kAudioDevicePropertyScopeInput : kAudioDevicePropertyScopeOutput);
 	SetPropertyData(theAddress, 0, NULL, theSize, theStreamUsage);
@@ -635,7 +635,7 @@ void	CAHALAudioDevice::GetNearestStartTime(AudioTimeStamp& ioTime, bool inIsInpu
 	{
 		theFlags |= kAudioDeviceStartTimeDontConsultDeviceFlag;
 	}
-	
+
 	OSStatus theError = AudioDeviceGetNearestStartTime(mObjectID, &ioTime, theFlags);
 	ThrowIfError(theError, CAException(theError), "CAHALAudioDevice::GetNearestStartTime: got an error getting the start time");
 }
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAHALAudioDevice.h b/libs/appleutility/CoreAudio/PublicUtility/CAHALAudioDevice.h
index 8cfb466..ea7a438 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAHALAudioDevice.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAHALAudioDevice.h
@@ -2,14 +2,14 @@
      File: CAHALAudioDevice.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #if !defined(__CAHALAudioDevice_h__)
 #define __CAHALAudioDevice_h__
@@ -108,7 +108,7 @@ public:
 	UInt32				GetTotalNumberChannels(bool inIsInput) const;
 	void				GetCurrentVirtualFormats(bool inIsInput, UInt32& ioNumberStreams, AudioStreamBasicDescription* outFormats) const;
 	void				GetCurrentPhysicalFormats(bool inIsInput, UInt32& ioNumberStreams, AudioStreamBasicDescription* outFormats) const;
-	
+
 //	IO Stuff
 public:
 	bool				IsRunning() const;
@@ -141,7 +141,7 @@ public:
 	void				SetIOProcStreamUsage(AudioDeviceIOProcID inIOProcID, bool inIsInput, const bool* inStreamUsage);
 	Float32				GetIOCycleUsage() const;
 	void				SetIOCycleUsage(Float32 inValue);
-	
+
 //	Time Operations
 public:
 	void				GetCurrentTime(AudioTimeStamp& outTime);
@@ -158,7 +158,7 @@ public:
 	void				SetVolumeControlDecibelValue(AudioObjectPropertyScope inScope, UInt32 inChannel, Float32 inValue);
 	Float32				GetVolumeControlScalarForDecibelValue(AudioObjectPropertyScope inScope, UInt32 inChannel, Float32 inValue) const;
 	Float32				GetVolumeControlDecibelForScalarValue(AudioObjectPropertyScope inScope, UInt32 inChannel, Float32 inValue) const;
-	
+
 	bool				HasSubVolumeControl(AudioObjectPropertyScope inScope, UInt32 inChannel) const;
 	bool				SubVolumeControlIsSettable(AudioObjectPropertyScope inScope, UInt32 inChannel) const;
 	Float32				GetSubVolumeControlScalarValue(AudioObjectPropertyScope inScope, UInt32 inChannel) const;
@@ -167,31 +167,31 @@ public:
 	void				SetSubVolumeControlDecibelValue(AudioObjectPropertyScope inScope, UInt32 inChannel, Float32 inValue);
 	Float32				GetSubVolumeControlScalarForDecibelValue(AudioObjectPropertyScope inScope, UInt32 inChannel, Float32 inValue) const;
 	Float32				GetSubVolumeControlDecibelForScalarValue(AudioObjectPropertyScope inScope, UInt32 inChannel, Float32 inValue) const;
-	
+
 	bool				HasMuteControl(AudioObjectPropertyScope inScope, UInt32 inChannel) const;
 	bool				MuteControlIsSettable(AudioObjectPropertyScope inScope, UInt32 inChannel) const;
 	bool				GetMuteControlValue(AudioObjectPropertyScope inScope, UInt32 inChannel) const;
 	void				SetMuteControlValue(AudioObjectPropertyScope inScope, UInt32 inChannel, bool inValue);
-	
+
 	bool				HasSoloControl(AudioObjectPropertyScope inScope, UInt32 inChannel) const;
 	bool				SoloControlIsSettable(AudioObjectPropertyScope inScope, UInt32 inChannel) const;
 	bool				GetSoloControlValue(AudioObjectPropertyScope inScope, UInt32 inChannel) const;
 	void				SetSoloControlValue(AudioObjectPropertyScope inScope, UInt32 inChannel, bool inValue);
-	
+
 	bool				HasStereoPanControl(AudioObjectPropertyScope inScope, UInt32 inChannel) const;
 	bool				StereoPanControlIsSettable(AudioObjectPropertyScope inScope, UInt32 inChannel) const;
 	Float32				GetStereoPanControlValue(AudioObjectPropertyScope inScope, UInt32 inChannel) const;
 	void				SetStereoPanControlValue(AudioObjectPropertyScope inScope, UInt32 inChannel, Float32 inValue);
 	void				GetStereoPanControlChannels(AudioObjectPropertyScope inScope, UInt32 inChannel, UInt32& outLeftChannel, UInt32& outRightChannel) const;
-	
+
 	bool				HasJackControl(AudioObjectPropertyScope inScope, UInt32 inChannel) const;
 	bool				GetJackControlValue(AudioObjectPropertyScope inScope, UInt32 inChannel) const;
-	
+
 	bool				HasSubMuteControl(AudioObjectPropertyScope inScope, UInt32 inChannel) const;
 	bool				SubMuteControlIsSettable(AudioObjectPropertyScope inScope, UInt32 inChannel) const;
 	bool				GetSubMuteControlValue(AudioObjectPropertyScope inScope, UInt32 inChannel) const;
 	void				SetSubMuteControlValue(AudioObjectPropertyScope inScope, UInt32 inChannel, bool inValue);
-	
+
 	bool				HasiSubOwnerControl(AudioObjectPropertyScope inScope, UInt32 inChannel) const;
 	bool				iSubOwnerControlIsSettable(AudioObjectPropertyScope inScope, UInt32 inChannel) const;
 	bool				GetiSubOwnerControlValue(AudioObjectPropertyScope inScope, UInt32 inChannel) const;
@@ -224,7 +224,7 @@ public:
 	UInt32				GetAvailableClockSourceByIndex(UInt32 inIndex) const;
 	CFStringRef			CopyClockSourceNameForID(UInt32 inID) const;
 	UInt32				GetClockSourceKindForID(UInt32 inID) const;
-	
+
 };
 
 inline AudioDeviceIOProcID	CAHALAudioDevice::CreateIOProcIDWithBlock(dispatch_queue_t inDispatchQueue, AudioDeviceIOBlock inIOBlock)
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAHALAudioObject.cpp b/libs/appleutility/CoreAudio/PublicUtility/CAHALAudioObject.cpp
index c8f16b4..3e3255e 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAHALAudioObject.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAHALAudioObject.cpp
@@ -2,14 +2,14 @@
      File: CAHALAudioObject.cpp
  Abstract: CAHALAudioObject.h
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 //==================================================================================================
 //	Includes
@@ -85,17 +85,17 @@ AudioClassID	CAHALAudioObject::GetClassID() const
 {
 	//	set up the return value
 	AudioClassID theAnswer = 0;
-	
+
 	//	set up the property address
 	CAPropertyAddress theAddress(kAudioObjectPropertyClass);
-	
+
 	//	make sure the property exists
 	if(HasProperty(theAddress))
 	{
 		UInt32 theSize = sizeof(AudioClassID);
 		GetPropertyData(theAddress, 0, NULL, theSize, &theAnswer);
 	}
-	
+
 	return theAnswer;
 }
 
@@ -103,10 +103,10 @@ AudioObjectID	CAHALAudioObject::GetOwnerObjectID() const
 {
 	//	set up the return value
 	AudioObjectID theAnswer = 0;
-	
+
 	//	set up the property address
 	CAPropertyAddress theAddress(kAudioObjectPropertyOwner);
-	
+
 	//	make sure the property exists
 	if(HasProperty(theAddress))
 	{
@@ -114,7 +114,7 @@ AudioObjectID	CAHALAudioObject::GetOwnerObjectID() const
 		UInt32 theSize = sizeof(AudioObjectID);
 		GetPropertyData(theAddress, 0, NULL, theSize, &theAnswer);
 	}
-	
+
 	return theAnswer;
 }
 
@@ -122,10 +122,10 @@ CFStringRef	CAHALAudioObject::CopyOwningPlugInBundleID() const
 {
 	//	set up the return value
 	CFStringRef theAnswer = NULL;
-	
+
 	//	set up the property address
 	CAPropertyAddress theAddress(kAudioObjectPropertyCreator);
-	
+
 	//	make sure the property exists
 	if(HasProperty(theAddress))
 	{
@@ -133,7 +133,7 @@ CFStringRef	CAHALAudioObject::CopyOwningPlugInBundleID() const
 		UInt32 theSize = sizeof(CFStringRef);
 		GetPropertyData(theAddress, 0, NULL, theSize, &theAnswer);
 	}
-	
+
 	return theAnswer;
 }
 
@@ -141,10 +141,10 @@ CFStringRef	CAHALAudioObject::CopyName() const
 {
 	//	set up the return value
 	CFStringRef theAnswer = NULL;
-	
+
 	//	set up the property address
 	CAPropertyAddress theAddress(kAudioObjectPropertyName);
-	
+
 	//	make sure the property exists
 	if(HasProperty(theAddress))
 	{
@@ -152,7 +152,7 @@ CFStringRef	CAHALAudioObject::CopyName() const
 		UInt32 theSize = sizeof(CFStringRef);
 		GetPropertyData(theAddress, 0, NULL, theSize, &theAnswer);
 	}
-	
+
 	return theAnswer;
 }
 
@@ -160,10 +160,10 @@ CFStringRef	CAHALAudioObject::CopyManufacturer() const
 {
 	//	set up the return value
 	CFStringRef theAnswer = NULL;
-	
+
 	//	set up the property address
 	CAPropertyAddress theAddress(kAudioObjectPropertyManufacturer);
-	
+
 	//	make sure the property exists
 	if(HasProperty(theAddress))
 	{
@@ -171,7 +171,7 @@ CFStringRef	CAHALAudioObject::CopyManufacturer() const
 		UInt32 theSize = sizeof(CFStringRef);
 		GetPropertyData(theAddress, 0, NULL, theSize, &theAnswer);
 	}
-	
+
 	return theAnswer;
 }
 
@@ -179,10 +179,10 @@ CFStringRef	CAHALAudioObject::CopyNameForElement(AudioObjectPropertyScope inScop
 {
 	//	set up the return value
 	CFStringRef theAnswer = NULL;
-	
+
 	//	set up the property address
 	CAPropertyAddress theAddress(kAudioObjectPropertyElementName, inScope, inElement);
-	
+
 	//	make sure the property exists
 	if(HasProperty(theAddress))
 	{
@@ -190,7 +190,7 @@ CFStringRef	CAHALAudioObject::CopyNameForElement(AudioObjectPropertyScope inScop
 		UInt32 theSize = sizeof(CFStringRef);
 		GetPropertyData(theAddress, 0, NULL, theSize, &theAnswer);
 	}
-	
+
 	return theAnswer;
 }
 
@@ -198,10 +198,10 @@ CFStringRef	CAHALAudioObject::CopyCategoryNameForElement(AudioObjectPropertyScop
 {
 	//	set up the return value
 	CFStringRef theAnswer = NULL;
-	
+
 	//	set up the property address
 	CAPropertyAddress theAddress(kAudioObjectPropertyElementCategoryName, inScope, inElement);
-	
+
 	//	make sure the property exists
 	if(HasProperty(theAddress))
 	{
@@ -209,7 +209,7 @@ CFStringRef	CAHALAudioObject::CopyCategoryNameForElement(AudioObjectPropertyScop
 		UInt32 theSize = sizeof(CFStringRef);
 		GetPropertyData(theAddress, 0, NULL, theSize, &theAnswer);
 	}
-	
+
 	return theAnswer;
 }
 
@@ -217,10 +217,10 @@ CFStringRef	CAHALAudioObject::CopyNumberNameForElement(AudioObjectPropertyScope
 {
 	//	set up the return value
 	CFStringRef theAnswer = NULL;
-	
+
 	//	set up the property address
 	CAPropertyAddress theAddress(kAudioObjectPropertyElementNumberName, inScope, inElement);
-	
+
 	//	make sure the property exists
 	if(HasProperty(theAddress))
 	{
@@ -228,7 +228,7 @@ CFStringRef	CAHALAudioObject::CopyNumberNameForElement(AudioObjectPropertyScope
 		UInt32 theSize = sizeof(CFStringRef);
 		GetPropertyData(theAddress, 0, NULL, theSize, &theAnswer);
 	}
-	
+
 	return theAnswer;
 }
 
@@ -243,10 +243,10 @@ UInt32	CAHALAudioObject::GetNumberOwnedObjects(AudioClassID inClass) const
 {
 	//	set up the return value
 	UInt32 theAnswer = 0;
-	
+
 	//	set up the property address
 	CAPropertyAddress theAddress(kAudioObjectPropertyOwnedObjects);
-	
+
 	//	figure out the qualifier
 	UInt32 theQualifierSize = 0;
 	void* theQualifierData = NULL;
@@ -255,13 +255,13 @@ UInt32	CAHALAudioObject::GetNumberOwnedObjects(AudioClassID inClass) const
 		theQualifierSize = sizeof(AudioObjectID);
 		theQualifierData = &inClass;
 	}
-	
+
 	//	get the property data size
 	theAnswer = GetPropertyDataSize(theAddress, theQualifierSize, theQualifierData);
-	
+
 	//	calculate the number of object IDs
 	theAnswer /= SizeOf32(AudioObjectID);
-	
+
 	return theAnswer;
 }
 
@@ -269,7 +269,7 @@ void	CAHALAudioObject::GetAllOwnedObjects(AudioClassID inClass, UInt32& ioNumber
 {
 	//	set up the property address
 	CAPropertyAddress theAddress(kAudioObjectPropertyOwnedObjects);
-	
+
 	//	figure out the qualifier
 	UInt32 theQualifierSize = 0;
 	void* theQualifierData = NULL;
@@ -278,11 +278,11 @@ void	CAHALAudioObject::GetAllOwnedObjects(AudioClassID inClass, UInt32& ioNumber
 		theQualifierSize = sizeof(AudioObjectID);
 		theQualifierData = &inClass;
 	}
-	
+
 	//	get the property data
 	UInt32 theDataSize = ioNumberObjects * SizeOf32(AudioClassID);
 	GetPropertyData(theAddress, theQualifierSize, theQualifierData, theDataSize, ioObjectIDs);
-	
+
 	//	set the number of object IDs being returned
 	ioNumberObjects = theDataSize / SizeOf32(AudioObjectID);
 }
@@ -291,7 +291,7 @@ AudioObjectID	CAHALAudioObject::GetOwnedObjectByIndex(AudioClassID inClass, UInt
 {
 	//	set up the property address
 	CAPropertyAddress theAddress(kAudioObjectPropertyOwnedObjects);
-	
+
 	//	figure out the qualifier
 	UInt32 theQualifierSize = 0;
 	void* theQualifierData = NULL;
@@ -300,27 +300,27 @@ AudioObjectID	CAHALAudioObject::GetOwnedObjectByIndex(AudioClassID inClass, UInt
 		theQualifierSize = sizeof(AudioObjectID);
 		theQualifierData = &inClass;
 	}
-	
+
 	//	figure out how much space to allocate
 	UInt32 theDataSize = GetPropertyDataSize(theAddress, theQualifierSize, theQualifierData);
 	UInt32 theNumberObjectIDs = theDataSize / SizeOf32(AudioObjectID);
-	
+
 	//	set up the return value
 	AudioObjectID theAnswer = 0;
-	
+
 	//	maker sure the index is in range
 	if(inIndex < theNumberObjectIDs)
 	{
 		//	allocate it
 		CAAutoArrayDelete<AudioObjectID> theObjectList(theDataSize / sizeof(AudioObjectID));
-		
+
 		//	get the property data
 		GetPropertyData(theAddress, theQualifierSize, theQualifierData, theDataSize, theObjectList);
-		
+
 		//	get the return value
 		theAnswer = theObjectList[inIndex];
 	}
-	
+
 	return theAnswer;
 }
 
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAHALAudioObject.h b/libs/appleutility/CoreAudio/PublicUtility/CAHALAudioObject.h
index d99ab0d..1933a27 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAHALAudioObject.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAHALAudioObject.h
@@ -2,14 +2,14 @@
      File: CAHALAudioObject.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #if !defined(__CAHALAudioObject_h__)
 #define __CAHALAudioObject_h__
@@ -88,7 +88,7 @@ public:
 	CFStringRef					CopyNameForElement(AudioObjectPropertyScope inScope, AudioObjectPropertyElement inElement) const;
 	CFStringRef					CopyCategoryNameForElement(AudioObjectPropertyScope inScope, AudioObjectPropertyElement inElement) const;
 	CFStringRef					CopyNumberNameForElement(AudioObjectPropertyScope inScope, AudioObjectPropertyElement inElement) const;
-	
+
 	static bool					ObjectExists(AudioObjectID inObjectID);
 
 //	Owned Objects
@@ -96,16 +96,16 @@ public:
 	UInt32						GetNumberOwnedObjects(AudioClassID inClass) const;
 	void						GetAllOwnedObjects(AudioClassID inClass, UInt32& ioNumberObjects, AudioObjectID* ioObjectIDs) const;
 	AudioObjectID				GetOwnedObjectByIndex(AudioClassID inClass, UInt32 inIndex);
-	
+
 //	Property Operations
 public:
 	bool						HasProperty(const AudioObjectPropertyAddress& inAddress) const;
 	bool						IsPropertySettable(const AudioObjectPropertyAddress& inAddress) const;
 	UInt32						GetPropertyDataSize(const AudioObjectPropertyAddress& inAddress, UInt32 inQualifierDataSize, const void* inQualifierData) const;
-	
+
 	void						GetPropertyData(const AudioObjectPropertyAddress& inAddress, UInt32 inQualifierDataSize, const void* inQualifierData, UInt32& ioDataSize, void* outData) const;
 	void						SetPropertyData(const AudioObjectPropertyAddress& inAddress, UInt32 inQualifierDataSize, const void* inQualifierData, UInt32 inDataSize, const void* inData);
-	
+
 	UInt32						GetPropertyData_UInt32(const AudioObjectPropertyAddress& inAddress, UInt32 inQualifierDataSize = 0, const void* inQualifierData = NULL) const										{ UInt32 theAnswer = 0; UInt32 theDataSize = SizeOf32(UInt32); GetPropertyData(inAddress, inQualifierDataSize, inQualifierData, theDataSize, &theAnswer); return theAnswer; }
 	void						SetPropertyData_UInt32(const AudioObjectPropertyAddress& inAddress, UInt32 inValue, UInt32 inQualifierDataSize = 0, const void* inQualifierData = NULL)								{ SetPropertyData(inAddress, inQualifierDataSize, inQualifierData, SizeOf32(UInt32), &inValue); }
 
@@ -127,7 +127,7 @@ public:
 	template <class T> UInt32	GetPropertyData_ArraySize(const AudioObjectPropertyAddress& inAddress, UInt32 inQualifierDataSize = 0, const void* inQualifierData = NULL) const									{ return GetPropertyDataSize(inAddress, inQualifierDataSize, inQualifierData) / SizeOf32(T); }
 	template <class T> void		GetPropertyData_Array(const AudioObjectPropertyAddress& inAddress, UInt32& ioNumberItems, T* outArray, UInt32 inQualifierDataSize = 0, const void* inQualifierData = NULL) const	{ UInt32 theDataSize = ioNumberItems * SizeOf32(T); GetPropertyData(inAddress, inQualifierDataSize, inQualifierData, theDataSize, outArray); ioNumberItems = theDataSize / SizeOf32(T); }
 	template <class T> void		SetPropertyData_Array(const AudioObjectPropertyAddress& inAddress, UInt32 inNumberItems, T* inArray, UInt32 inQualifierDataSize = 0, const void* inQualifierData = NULL)			{ SetPropertyData(inAddress, inQualifierDataSize, inQualifierData, inNumberItems * SizeOf32(T), inArray); }
-	
+
 	void						AddPropertyListener(const AudioObjectPropertyAddress& inAddress, AudioObjectPropertyListenerProc inListenerProc, void* inClientData);
 	void						RemovePropertyListener(const AudioObjectPropertyAddress& inAddress, AudioObjectPropertyListenerProc inListenerProc, void* inClientData);
 
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAHALAudioStream.cpp b/libs/appleutility/CoreAudio/PublicUtility/CAHALAudioStream.cpp
index 62b9b3c..d28f0d2 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAHALAudioStream.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAHALAudioStream.cpp
@@ -2,14 +2,14 @@
      File: CAHALAudioStream.cpp
  Abstract: CAHALAudioStream.h
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 //==================================================================================================
 //	Includes
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAHALAudioStream.h b/libs/appleutility/CoreAudio/PublicUtility/CAHALAudioStream.h
index 0c6cb55..a61c5ad 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAHALAudioStream.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAHALAudioStream.h
@@ -2,14 +2,14 @@
      File: CAHALAudioStream.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #if !defined(__CAHALAudioStream_h__)
 #define __CAHALAudioStream_h__
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAHALAudioSystemObject.cpp b/libs/appleutility/CoreAudio/PublicUtility/CAHALAudioSystemObject.cpp
index 404dd98..50643db 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAHALAudioSystemObject.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAHALAudioSystemObject.cpp
@@ -2,14 +2,14 @@
      File: CAHALAudioSystemObject.cpp
  Abstract: CAHALAudioSystemObject.h
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 //==================================================================================================
 //	Includes
@@ -124,15 +124,15 @@ void	CAHALAudioSystemObject::LogBasicDeviceInfo()
 		char theCString[256];
 		UInt32 theCStringSize = sizeof(theCString);
 		DebugMessageN1("CAHALAudioSystemObject::LogBasicDeviceInfo: Device %d", (int)theDeviceIndex);
-		
+
 		CAHALAudioDevice theDevice(theDeviceList[theDeviceIndex]);
 		DebugMessageN1("CAHALAudioSystemObject::LogBasicDeviceInfo:   Object ID: %d", (int)theDeviceList[theDeviceIndex]);
-		
+
 		CACFString theDeviceName(theDevice.CopyName());
 		theCStringSize = sizeof(theCString);
 		theDeviceName.GetCString(theCString, theCStringSize);
 		DebugMessageN1("CAHALAudioSystemObject::LogBasicDeviceInfo:   Name:      %s", theCString);
-		
+
 		CACFString theDeviceUID(theDevice.CopyDeviceUID());
 		theCStringSize = sizeof(theCString);
 		theDeviceUID.GetCString(theCString, theCStringSize);
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAHALAudioSystemObject.h b/libs/appleutility/CoreAudio/PublicUtility/CAHALAudioSystemObject.h
index 0ade7a5..6b0f938 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAHALAudioSystemObject.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAHALAudioSystemObject.h
@@ -2,14 +2,14 @@
      File: CAHALAudioSystemObject.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #if !defined(__CAHALAudioSystemObject_h__)
 #define __CAHALAudioSystemObject_h__
@@ -80,7 +80,7 @@ public:
 public:
 	AudioObjectID	GetDefaultAudioDevice(bool inIsInput, bool inIsSystem) const;
 	void			SetDefaultAudioDevice(bool inIsInput, bool inIsSystem, AudioObjectID inNewDefaultDevice);
-	
+
 //	PlugIns
 public:
 	AudioObjectID	GetAudioPlugInForBundleID(CFStringRef inBundleID) const;
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAHostTimeBase.cpp b/libs/appleutility/CoreAudio/PublicUtility/CAHostTimeBase.cpp
index db78a4a..60d91a1 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAHostTimeBase.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAHostTimeBase.cpp
@@ -2,14 +2,14 @@
      File: CAHostTimeBase.cpp
  Abstract: CAHostTimeBase.h
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 //=============================================================================
 //	Includes
@@ -88,7 +88,7 @@ void	CAHostTimeBase::Initialize()
 		sFrequency = static_cast<Float64>(*((UInt64*)&theFrequency));
 	#endif
 	sInverseFrequency = 1.0 / sFrequency;
-	
+
 	#if	Log_Host_Time_Base_Parameters
 		DebugPrintf("Host Time Base Parameters");
 		DebugPrintf(" Minimum Delta:          %lu", (unsigned long)sMinDelta);
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAHostTimeBase.h b/libs/appleutility/CoreAudio/PublicUtility/CAHostTimeBase.h
index 50e3507..7b5303b 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAHostTimeBase.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAHostTimeBase.h
@@ -2,14 +2,14 @@
      File: CAHostTimeBase.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #if !defined(__CAHostTimeBase_h__)
 #define __CAHostTimeBase_h__
@@ -101,12 +101,12 @@ public:
 	static SInt64			HostDeltaToNanos(UInt64 inStartTime, UInt64 inEndTime);
 
 	static UInt64			MultiplyByRatio(UInt64 inMuliplicand, UInt32 inNumerator, UInt32 inDenominator);
-	
+
 private:
 	static void				Initialize();
-	
+
 	static pthread_once_t	sIsInited;
-	
+
 	static Float64			sFrequency;
 	static Float64			sInverseFrequency;
 	static UInt32			sMinDelta;
@@ -128,7 +128,7 @@ inline UInt64	CAHostTimeBase::GetTheCurrentTime()
 		QueryPerformanceCounter(&theValue);
 		theTime = *((UInt64*)&theValue);
 	#endif
-	
+
 	#if	Track_Host_TimeBase
 		if(sLastTime != 0)
 		{
@@ -150,7 +150,7 @@ inline UInt64	CAHostTimeBase::GetTheCurrentTime()
 inline UInt64	CAHostTimeBase::ConvertToNanos(UInt64 inHostTime)
 {
 	pthread_once(&sIsInited, Initialize);
-	
+
 	UInt64 theAnswer = MultiplyByRatio(inHostTime, sToNanosNumerator, sToNanosDenominator);
 	#if CoreAudio_Debug
 		if(((sToNanosNumerator > sToNanosDenominator) && (theAnswer < inHostTime)) || ((sToNanosDenominator > sToNanosNumerator) && (theAnswer > inHostTime)))
@@ -158,7 +158,7 @@ inline UInt64	CAHostTimeBase::ConvertToNanos(UInt64 inHostTime)
 			DebugPrintf("CAHostTimeBase::ConvertToNanos: The conversion wrapped");
 		}
 	#endif
-	
+
 	return theAnswer;
 }
 
@@ -185,7 +185,7 @@ inline UInt64	CAHostTimeBase::GetCurrentTimeInNanos()
 inline UInt64	CAHostTimeBase::AbsoluteHostDeltaToNanos(UInt64 inStartTime, UInt64 inEndTime)
 {
 	UInt64 theAnswer;
-	
+
 	if(inStartTime <= inEndTime)
 	{
 		theAnswer = inEndTime - inStartTime;
@@ -194,7 +194,7 @@ inline UInt64	CAHostTimeBase::AbsoluteHostDeltaToNanos(UInt64 inStartTime, UInt6
 	{
 		theAnswer = inStartTime - inEndTime;
 	}
-	
+
 	return ConvertToNanos(theAnswer);
 }
 
@@ -202,7 +202,7 @@ inline SInt64	CAHostTimeBase::HostDeltaToNanos(UInt64 inStartTime, UInt64 inEndT
 {
 	SInt64 theAnswer;
 	SInt64 theSign = 1;
-	
+
 	if(inStartTime <= inEndTime)
 	{
 		theAnswer = static_cast<SInt64>(inEndTime - inStartTime);
@@ -212,7 +212,7 @@ inline SInt64	CAHostTimeBase::HostDeltaToNanos(UInt64 inStartTime, UInt64 inEndT
 		theAnswer = static_cast<SInt64>(inStartTime - inEndTime);
 		theSign = -1;
 	}
-	
+
 	return theSign * static_cast<SInt64>(ConvertToNanos(static_cast<UInt64>(theAnswer)));
 }
 
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CALogMacros.h b/libs/appleutility/CoreAudio/PublicUtility/CALogMacros.h
index 7fd4ac4..4c62506 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CALogMacros.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CALogMacros.h
@@ -2,14 +2,14 @@
      File: CALogMacros.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #if !defined(__CALogMacros_h__)
 #define __CALogMacros_h__
@@ -57,31 +57,31 @@
 	#include "CADebugPrintf.h"
 	#include <stdio.h>
 	#include <string.h>
-	
+
 	#define	PrintLine(msg)						DebugPrintfRtn(DebugPrintfFileComma "%s\n", (msg))
-	
+
 	#define PrintBool(msg, b)					DebugPrintfRtn(DebugPrintfFileComma "%s%s\n", (msg), (b) ? "true" : "false")
 	#define PrintIndexedBool(msg, i, b)			DebugPrintfRtn(DebugPrintfFileComma "  %s %ld: %s\n", (msg), (long)(i), (b) ? "true" : "false")
-	
+
 	#define PrintToggle(msg, b)					DebugPrintfRtn(DebugPrintfFileComma "%s%s\n", (msg), (b) ? "on" : "off")
 	#define PrintIndexedToggle(msg, i, b)		DebugPrintfRtn(DebugPrintfFileComma "  %s %ld: %s\n", (msg), (long)(i), (b) ? "on" : "off")
-	
+
 	#define PrintInt(msg, n)					DebugPrintfRtn(DebugPrintfFileComma "%s%ld\n", (msg), (long)(n))
 	#define PrintIndexedInt(msg, i, n)			DebugPrintfRtn(DebugPrintfFileComma "  %s %ld: %ld\n", (msg), (long)(i), (long)(n))
-	
+
 	#define PrintHex(msg, n)					DebugPrintfRtn(DebugPrintfFileComma "%s0x%lX\n", (msg), (unsigned long)(n))
 	#define PrintIndexedHex(msg, i, n)			DebugPrintfRtn(DebugPrintfFileComma "  %s %ld: 0x%lX\n", (msg), (long)(i), (unsigned long)(n))
-	
+
 	#define PrintFloat(msg, f)					DebugPrintfRtn(DebugPrintfFileComma "%s%.6f\n", (msg), (f))
 	#define PrintIndexedFloat(msg, i, f)		DebugPrintfRtn(DebugPrintfFileComma "  %s %ld: %.6f\n", (msg), (long)(i), (f))
 	#define PrintFloatIndexedFloat(msg, i, f)	DebugPrintfRtn(DebugPrintfFileComma "  %s %.6f: %.6f\n", (msg), (i), (f))
-	
+
 	#define	PrintString(msg, s)					DebugPrintfRtn(DebugPrintfFileComma "%s%s\n", (msg), (s))
 	#define PrintIndexedString(msg, i, s)		DebugPrintfRtn(DebugPrintfFileComma "  %s %ld: %s\n", (msg), (long)(i), (s))
-	
+
 	#define PrintPointer(msg, p)				DebugPrintfRtn(DebugPrintfFileComma "%s%p\n", (msg), (p))
 	#define PrintIndexedPointer(msg, i, p)		DebugPrintfRtn(DebugPrintfFileComma "  %s %ld: %p\n", (msg), (long)(i), (p))
-	
+
 	#define	Print4CharCode(msg, c)				{																								\
 													UInt32 __4CC_number = (c);																	\
 													char __4CC_string[5] = CA4CCToCString(__4CC_number);										\
@@ -92,46 +92,46 @@
 													char __4CC_string[5] = CA4CCToCString(__4CC_number);										\
 													DebugPrintfRtn(DebugPrintfFileComma "  %s %ld: '%s'\n", (msg), (long)(i), __4CC_string);		\
 												}
-	
+
 	#define	ErrorLine(s)						DebugPrintfRtn(DebugPrintfFileComma "%s\n", (s))
 	#define	OSErrorLine(s, e)					{																								\
 													OSStatus __err_number = (e);																\
 													char __err_string[5] = CA4CCToCString(__err_number);										\
 													DebugPrintfRtn(DebugPrintfFileComma "%s, OSStatus code: %s\n", (s), __err_string);				\
 												}
-	
+
 	#define	MessageIfOSError(e, s)				if((e) != 0) { OSErrorLine(s, e); }
 	#define	MessageIfNULL(p, s)					if((p) == 0) { ErrorLine(s); }
 
 #else
 
-	#define	PrintLine(msg)					
-	
+	#define	PrintLine(msg)
+
 	#define PrintBool(msg, b)					(b)
 	#define PrintIndexedBool(msg, i, b)			(b)
-	
+
 	#define PrintInt(msg, n)					(n)
 	#define PrintIndexedInt(msg, i, n)			(n)
-	
+
 	#define PrintHex(msg, n)					(n)
 	#define PrintIndexedHex(msg, i, n)			(n)
-	
+
 	#define PrintFloat(msg, f)					(f)
 	#define PrintIndexedFloat(msg, i, f)		(f)
 	#define PrintFloatIndexedFloat(msg, i, f)	(f)
-	
+
 	#define	PrintString(msg, s)					(s)
 	#define PrintIndexedString(msg, i, s)		(s)
-	
+
 	#define PrintPointer(msg, p)				(p)
 	#define PrintIndexedPointer(msg, i, p)		(p)
-	
+
 	#define	Print4CharCode(msg, c)				(c)
 	#define PrintIndexed4CharCode(msg, i, c)	(c)
-	
+
 	#define	ErrorLine(s)						(s)
 	#define	OSErrorLine(s, e)					(e)
-	
+
 	#define	MessageIfOSError(e, s)				(e)
 	#define	MessageIfNULL(p, s)					(p)
 
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAMath.h b/libs/appleutility/CoreAudio/PublicUtility/CAMath.h
index eb81f26..ca7cd38 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAMath.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAMath.h
@@ -2,14 +2,14 @@
      File: CAMath.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #ifndef __CAMath_h__
 #define __CAMath_h__
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAMixMap.h b/libs/appleutility/CoreAudio/PublicUtility/CAMixMap.h
index 62e95d4..58d4764 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAMixMap.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAMixMap.h
@@ -2,14 +2,14 @@
      File: CAMixMap.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,45 +40,45 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #ifndef __CAMixMap_h__
 #define __CAMixMap_h__
 
 	// manages the setting of mix map volumes
-	
+
 class CAMixMap {
 public:
 				CAMixMap ()
 					: mIns(0), mOuts (0), mMixMap(NULL)
 					{}
-					
-				CAMixMap (const CAMixMap &mm) 
+
+				CAMixMap (const CAMixMap &mm)
 					: mIns(0), mOuts (0), mMixMap(NULL)
 					{ *this = mm; }
-				
-				CAMixMap (UInt32 numIns, UInt32 numOuts) 
+
+				CAMixMap (UInt32 numIns, UInt32 numOuts)
 					: mIns(numIns), mOuts (numOuts), mMixMap(NULL)
-					{ 
-						mMixMap = new Float32[numIns * numOuts]; 
+					{
+						mMixMap = new Float32[numIns * numOuts];
 						memset (mMixMap, 0, ByteSize());
 					}
-								
+
 				~CAMixMap () { delete [] mMixMap; }
-	
-	CAMixMap&	operator=(const CAMixMap& mm) 
-				{ 
+
+	CAMixMap&	operator=(const CAMixMap& mm)
+				{
 					if (mMixMap) { delete [] mMixMap; mMixMap = NULL; }
 					mIns = mm.mIns; mOuts = mm.mOuts;
-					if (NumIns() && NumOuts()) { 
+					if (NumIns() && NumOuts()) {
 						mMixMap = new Float32 [ NumIns() * NumOuts() ];
 						memcpy (mMixMap, mm.mMixMap, ByteSize());
 					}
 					return *this;
 				}
-				
+
 	UInt32		NumIns () const { return mIns; }
 	UInt32		NumOuts () const { return mOuts; }
 
@@ -100,10 +100,10 @@ public:
 						mMixMap[i * NumOuts() + i] = val;
 					}
 				}
-	
+
 	void		Clear () { memset (mMixMap, 0, ByteSize()); }
-	
-	
+
+
 	Float32*	MM() { return mMixMap; }
 	const Float32*	MM() const { return mMixMap; }
 	UInt32		ByteSize () const { return NumIns() * NumOuts() * sizeof(Float32); }
@@ -116,7 +116,7 @@ public:
 					}
 					return sum;
 				}
-				
+
 	void		Normalize()
 				{
 					// ensure that no output channel will sum over unity.
@@ -129,25 +129,25 @@ public:
 						}
 						if (sum > maxsum) maxsum = sum;
 					}
-					
+
 					if (maxsum == 0.f) return;
 					Float32 scale = 1.f / maxsum;
 					for (UInt32 i = 0; i < mIns * mOuts; ++i) {
 						mixmap[i] *= scale;
 					}
 				}
-	
+
 	void		Print ()
 				{
 					printf ("Num Ins: %d, Num Outs: %d\n", (int)mIns, (int)mOuts);
 					for (unsigned int ins = 0; ins < mIns; ++ins) {
 						printf ("\t%d: ", ins);
 						for (unsigned int outs = 0; outs < mOuts; ++outs)
-							printf ("(%.3f) ", mMixMap[ins * NumOuts() + outs]); 
+							printf ("(%.3f) ", mMixMap[ins * NumOuts() + outs]);
 						printf("\n");
 					}
 				}
-				
+
 private:
 	UInt32	mIns;
 	UInt32	mOuts;
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAMutex.cpp b/libs/appleutility/CoreAudio/PublicUtility/CAMutex.cpp
index 88cf9b0..f6e7ca4 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAMutex.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAMutex.cpp
@@ -2,14 +2,14 @@
      File: CAMutex.cpp
  Abstract: CAMutex.h
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 //==================================================================================================
 //	Includes
@@ -83,14 +83,14 @@ CAMutex::CAMutex(const char* inName)
 #if TARGET_OS_MAC
 	OSStatus theError = pthread_mutex_init(&mMutex, NULL);
 	ThrowIf(theError != 0, CAException(theError), "CAMutex::CAMutex: Could not init the mutex");
-	
+
 	#if	Log_Ownership
 		DebugPrintfRtn(DebugPrintfFileComma "%p %.4f: CAMutex::CAMutex: creating %s, owner: %p\n", pthread_self(), ((Float64)(CAHostTimeBase::GetCurrentTimeInNanos()) / 1000000.0), mName, mOwner);
 	#endif
 #elif TARGET_OS_WIN32
 	mMutex = CreateMutex(NULL, false, NULL);
 	ThrowIfNULL(mMutex, CAException(GetLastError()), "CAMutex::CAMutex: could not create the mutex.");
-	
+
 	#if	Log_Ownership
 		DebugPrintfRtn(DebugPrintfFileComma "%lu %.4f: CAMutex::CAMutex: creating %s, owner: %lu\n", GetCurrentThreadId(), ((Float64)(CAHostTimeBase::GetCurrentTimeInNanos()) / 1000000.0), mName, mOwner);
 	#endif
@@ -118,7 +118,7 @@ CAMutex::~CAMutex()
 bool	CAMutex::Lock()
 {
 	bool theAnswer = false;
-	
+
 #if TARGET_OS_MAC
 	pthread_t theCurrentThread = pthread_self();
 	if(!pthread_equal(theCurrentThread, mOwner))
@@ -126,22 +126,22 @@ bool	CAMutex::Lock()
 		#if	Log_Ownership
 			DebugPrintfRtn(DebugPrintfFileComma "%p %.4f: CAMutex::Lock: thread %p is locking %s, owner: %p\n", theCurrentThread, ((Float64)(CAHostTimeBase::GetCurrentTimeInNanos()) / 1000000.0), theCurrentThread, mName, mOwner);
 		#endif
-		
+
 		#if Log_LongLatencies
 			UInt64 lockTryTime = CAHostTimeBase::GetCurrentTimeInNanos();
 		#endif
-		
+
 		OSStatus theError = pthread_mutex_lock(&mMutex);
 		ThrowIf(theError != 0, CAException(theError), "CAMutex::Lock: Could not lock the mutex");
 		mOwner = theCurrentThread;
 		theAnswer = true;
-	
+
 		#if Log_LongLatencies
 			UInt64 lockAcquireTime = CAHostTimeBase::GetCurrentTimeInNanos();
 			if (lockAcquireTime - lockTryTime >= LongLatencyThresholdNS)
 				DebugPrintfRtn(DebugPrintfFileComma "Thread %p took %.6fs to acquire the lock %s\n", theCurrentThread, (lockAcquireTime - lockTryTime) * 1.0e-9 /* nanos to seconds */, mName);
 		#endif
-		
+
 		#if	Log_Ownership
 			DebugPrintfRtn(DebugPrintfFileComma "%p %.4f: CAMutex::Lock: thread %p has locked %s, owner: %p\n", pthread_self(), ((Float64)(CAHostTimeBase::GetCurrentTimeInNanos()) / 1000000.0), pthread_self(), mName, mOwner);
 		#endif
@@ -157,7 +157,7 @@ bool	CAMutex::Lock()
 		ThrowIfError(theError, CAException(theError), "CAMutex::Lock: could not lock the mutex");
 		mOwner = GetCurrentThreadId();
 		theAnswer = true;
-	
+
 		#if	Log_Ownership
 			DebugPrintfRtn(DebugPrintfFileComma "%lu %.4f: CAMutex::Lock: thread %lu has locked %s, owner: %lu\n", GetCurrentThreadId(), ((Float64)(CAHostTimeBase::GetCurrentTimeInNanos()) / 1000000.0), GetCurrentThreadId(), mName, mOwner);
 		#endif
@@ -179,7 +179,7 @@ void	CAMutex::Unlock()
 		mOwner = 0;
 		OSStatus theError = pthread_mutex_unlock(&mMutex);
 		ThrowIf(theError != 0, CAException(theError), "CAMutex::Unlock: Could not unlock the mutex");
-	
+
 		#if	Log_Ownership
 			DebugPrintfRtn(DebugPrintfFileComma "%p %.4f: CAMutex::Unlock: thread %p has unlocked %s, owner: %p\n", pthread_self(), ((Float64)(CAHostTimeBase::GetCurrentTimeInNanos()) / 1000000.0), pthread_self(), mName, mOwner);
 		#endif
@@ -198,7 +198,7 @@ void	CAMutex::Unlock()
 		mOwner = 0;
 		bool wasReleased = ReleaseMutex(mMutex);
 		ThrowIf(!wasReleased, CAException(GetLastError()), "CAMutex::Unlock: Could not unlock the mutex");
-	
+
 		#if	Log_Ownership
 			DebugPrintfRtn(DebugPrintfFileComma "%lu %.4f: CAMutex::Unlock: thread %lu has unlocked %s, owner: %lu\n", GetCurrentThreadId(), ((Float64)(CAHostTimeBase::GetCurrentTimeInNanos()) / 1000000.0), GetCurrentThreadId(), mName, mOwner);
 		#endif
@@ -232,7 +232,7 @@ bool	CAMutex::Try(bool& outWasLocked)
 			mOwner = theCurrentThread;
 			theAnswer = true;
 			outWasLocked = true;
-	
+
 			#if	Log_Ownership
 				DebugPrintfRtn(DebugPrintfFileComma "%p %.4f: CAMutex::Try: thread %p has locked %s, owner: %p\n", theCurrentThread, ((Float64)(CAHostTimeBase::GetCurrentTimeInNanos()) / 1000000.0), theCurrentThread, mName, mOwner);
 			#endif
@@ -242,7 +242,7 @@ bool	CAMutex::Try(bool& outWasLocked)
 			//	return value of EBUSY means that the lock was already locked by another thread
 			theAnswer = false;
 			outWasLocked = false;
-	
+
 			#if	Log_Ownership
 				DebugPrintfRtn(DebugPrintfFileComma "%p %.4f: CAMutex::Try: thread %p failed to lock %s, owner: %p\n", theCurrentThread, ((Float64)(CAHostTimeBase::GetCurrentTimeInNanos()) / 1000000.0), theCurrentThread, mName, mOwner);
 			#endif
@@ -266,7 +266,7 @@ bool	CAMutex::Try(bool& outWasLocked)
 		#if	Log_Ownership
 			DebugPrintfRtn(DebugPrintfFileComma "%lu %.4f: CAMutex::Try: thread %lu is try-locking %s, owner: %lu\n", GetCurrentThreadId(), ((Float64)(CAHostTimeBase::GetCurrentTimeInNanos()) / 1000000.0), GetCurrentThreadId(), mName, mOwner);
 		#endif
-		
+
 		//	try to acquire the mutex
 		OSStatus theError = WaitForSingleObject(mMutex, 0);
 		if(theError == WAIT_OBJECT_0)
@@ -275,7 +275,7 @@ bool	CAMutex::Try(bool& outWasLocked)
 			mOwner = GetCurrentThreadId();
 			theAnswer = true;
 			outWasLocked = true;
-	
+
 			#if	Log_Ownership
 				DebugPrintfRtn(DebugPrintfFileComma "%lu %.4f: CAMutex::Try: thread %lu has locked %s, owner: %lu\n", GetCurrentThreadId(), ((Float64)(CAHostTimeBase::GetCurrentTimeInNanos()) / 1000000.0), GetCurrentThreadId(), mName, mOwner);
 			#endif
@@ -285,7 +285,7 @@ bool	CAMutex::Try(bool& outWasLocked)
 			//	this means that the lock was already locked by another thread
 			theAnswer = false;
 			outWasLocked = false;
-	
+
 			#if	Log_Ownership
 				DebugPrintfRtn(DebugPrintfFileComma "%lu %.4f: CAMutex::Try: thread %lu failed to lock %s, owner: %lu\n", GetCurrentThreadId(), ((Float64)(CAHostTimeBase::GetCurrentTimeInNanos()) / 1000000.0), GetCurrentThreadId(), mName, mOwner);
 			#endif
@@ -303,7 +303,7 @@ bool	CAMutex::Try(bool& outWasLocked)
 		outWasLocked = false;
 	}
 #endif
-	
+
 	return theAnswer;
 }
 
@@ -315,7 +315,7 @@ bool	CAMutex::IsFree() const
 bool	CAMutex::IsOwnedByCurrentThread() const
 {
 	bool theAnswer = true;
-	
+
 #if TARGET_OS_MAC
 	theAnswer = pthread_equal(pthread_self(), mOwner);
 #elif TARGET_OS_WIN32
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAMutex.h b/libs/appleutility/CoreAudio/PublicUtility/CAMutex.h
index 093066b..4cc8ac5 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAMutex.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAMutex.h
@@ -2,14 +2,14 @@
      File: CAMutex.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #ifndef __CAMutex_h__
 #define __CAMutex_h__
@@ -82,10 +82,10 @@ public:
 	virtual bool	Lock();
 	virtual void	Unlock();
 	virtual bool	Try(bool& outWasLocked);	// returns true if lock is free, false if not
-	
+
 	virtual bool	IsFree() const;
 	virtual bool	IsOwnedByCurrentThread() const;
-		
+
 //	Implementation
 protected:
 	const char*		mName;
@@ -101,24 +101,24 @@ protected:
 public:
 	class			Locker
 	{
-	
+
 	//	Construction/Destruction
 	public:
 					Locker(CAMutex& inMutex) : mMutex(&inMutex), mNeedsRelease(false) { mNeedsRelease = mMutex->Lock(); }
 					Locker(CAMutex* inMutex) : mMutex(inMutex), mNeedsRelease(false) { mNeedsRelease = (mMutex != NULL && mMutex->Lock()); }
 						// in this case the mutex can be null
 					~Locker() { if(mNeedsRelease) { mMutex->Unlock(); } }
-	
-	
+
+
 	private:
 					Locker(const Locker&);
 		Locker&		operator=(const Locker&);
-	
+
 	//	Implementation
 	private:
 		CAMutex*	mMutex;
 		bool		mNeedsRelease;
-	
+
 	};
 
 // Unlocker
@@ -127,24 +127,24 @@ public:
 	public:
 						Unlocker(CAMutex& inMutex);
 						~Unlocker();
-		
+
 	private:
 		CAMutex&	mMutex;
 		bool		mNeedsLock;
-		
+
 		// Hidden definitions of copy ctor, assignment operator
 		Unlocker(const Unlocker& copy);				// Not implemented
 		Unlocker& operator=(const Unlocker& copy);	// Not implemented
 	};
-	
+
 // you can use this with Try - if you take the lock in try, pass in the outWasLocked var
 	class Tryer {
-	
+
 	//	Construction/Destruction
 	public:
 		Tryer (CAMutex &mutex) : mMutex(mutex), mNeedsRelease(false), mHasLock(false) { mHasLock = mMutex.Try (mNeedsRelease); }
 		~Tryer () { if (mNeedsRelease) mMutex.Unlock(); }
-		
+
 		bool HasLock () const { return mHasLock; }
 
 	private:
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAPThread.cpp b/libs/appleutility/CoreAudio/PublicUtility/CAPThread.cpp
index 3da1058..2428a7a 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAPThread.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAPThread.cpp
@@ -2,14 +2,14 @@
      File: CAPThread.cpp
  Abstract: CAPThread.h
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 //=============================================================================
 //	Includes
@@ -170,7 +170,7 @@ void	CAPThread::SetPriority(UInt32 inPriority, bool inFixedPriority)
 	if(mPThread != 0)
 	{
 		SetPriority(mPThread, mPriority, mFixedPriority);
-    } 
+    }
 #elif TARGET_OS_WIN32
 	if(mThreadID != NULL)
 	{
@@ -185,7 +185,7 @@ void	CAPThread::SetPriority(NativeThread inThread, UInt32 inPriority, bool inFix
 	if(inThread != 0)
 	{
 		kern_return_t theError = 0;
-		
+
 		//	set whether or not this is a fixed priority thread
 		if (inFixedPriority)
 		{
@@ -193,17 +193,17 @@ void	CAPThread::SetPriority(NativeThread inThread, UInt32 inPriority, bool inFix
 			theError = thread_policy_set(pthread_mach_thread_np(inThread), THREAD_EXTENDED_POLICY, (thread_policy_t)&theFixedPolicy, THREAD_EXTENDED_POLICY_COUNT);
 			AssertNoKernelError(theError, "CAPThread::SetPriority: failed to set the fixed-priority policy");
 		}
-		
+
 		//	set the thread's absolute priority which is relative to the priority on which thread_policy_set() is called
 		UInt32 theCurrentThreadPriority = getScheduledPriority(pthread_self(), CAPTHREAD_SET_PRIORITY);
         thread_precedence_policy_data_t thePrecedencePolicy = { static_cast<integer_t>(inPriority - theCurrentThreadPriority) };
 		theError = thread_policy_set(pthread_mach_thread_np(inThread), THREAD_PRECEDENCE_POLICY, (thread_policy_t)&thePrecedencePolicy, THREAD_PRECEDENCE_POLICY_COUNT);
         AssertNoKernelError(theError, "CAPThread::SetPriority: failed to set the precedence policy");
-		
+
 		#if	Log_SetPriority
 			DebugMessageN4("CAPThread::SetPriority: requsted: %lu spawning: %lu current: %lu assigned: %d", mPriority, mSpawningThreadPriority, theCurrentThreadPriority, thePrecedencePolicy.importance);
 		#endif
-    } 
+    }
 #elif TARGET_OS_WIN32
 	if(inThread != NULL)
 	{
@@ -249,18 +249,18 @@ void	CAPThread::Start()
 	{
 		OSStatus			theResult;
 		pthread_attr_t		theThreadAttributes;
-		
+
 		theResult = pthread_attr_init(&theThreadAttributes);
 		ThrowIf(theResult != 0, CAException(theResult), "CAPThread::Start: Thread attributes could not be created.");
-		
+
 		theResult = pthread_attr_setdetachstate(&theThreadAttributes, PTHREAD_CREATE_DETACHED);
 		ThrowIf(theResult != 0, CAException(theResult), "CAPThread::Start: A thread could not be created in the detached state.");
-		
+
 		theResult = pthread_create(&mPThread, &theThreadAttributes, (ThreadRoutine)CAPThread::Entry, this);
 		ThrowIf(theResult != 0 || !mPThread, CAException(theResult), "CAPThread::Start: Could not create a thread.");
-		
+
 		pthread_attr_destroy(&theThreadAttributes);
-		
+
 	}
 #elif TARGET_OS_WIN32
 	Assert(mThreadID == 0, "CAPThread::Start: can't start because the thread is already running");
@@ -272,7 +272,7 @@ void	CAPThread::Start()
 			CloseHandle(mThreadHandle);
 			mThreadHandle = NULL;
 		}
-		
+
 		//	create a new thread
 		mThreadHandle = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Entry, this, 0, &mThreadID);
 		ThrowIf(mThreadHandle == NULL, CAException(GetLastError()), "CAPThread::Start: Could not create a thread.");
@@ -291,7 +291,7 @@ void*	CAPThread::Entry(CAPThread* inCAPThread)
 #elif TARGET_OS_WIN32
 	// do we need to do something here?
 #endif
-	
+
 #if	!TARGET_OS_IPHONE && (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6)
 	if(inCAPThread->mThreadName[0] != 0)
 	{
@@ -299,7 +299,7 @@ void*	CAPThread::Entry(CAPThread* inCAPThread)
 	}
 #endif
 
-	try 
+	try
 	{
 		if(inCAPThread->mTimeConstraintSet)
 		{
@@ -333,11 +333,11 @@ UInt32 CAPThread::getScheduledPriority(pthread_t inThread, int inPriorityKind)
 
 	if (inThread == NULL)
 		return 0;
-    
+
     // get basic info
     count = THREAD_BASIC_INFO_COUNT;
     thread_info (pthread_mach_thread_np (inThread), THREAD_BASIC_INFO, (thread_info_t)&threadInfo, &count);
-    
+
 	switch (threadInfo.policy) {
 		case POLICY_TIMESHARE:
 			count = POLICY_TIMESHARE_INFO_COUNT;
@@ -347,7 +347,7 @@ UInt32 CAPThread::getScheduledPriority(pthread_t inThread, int inPriorityKind)
             }
             return static_cast<UInt32>(thePolicyInfo.ts.base_priority);
             break;
-            
+
         case POLICY_FIFO:
 			count = POLICY_FIFO_INFO_COUNT;
 			thread_info(pthread_mach_thread_np (inThread), THREAD_SCHED_FIFO_INFO, (thread_info_t)&(thePolicyInfo.fifo), &count);
@@ -356,7 +356,7 @@ UInt32 CAPThread::getScheduledPriority(pthread_t inThread, int inPriorityKind)
             }
             return static_cast<UInt32>(thePolicyInfo.fifo.base_priority);
             break;
-            
+
 		case POLICY_RR:
 			count = POLICY_RR_INFO_COUNT;
 			thread_info(pthread_mach_thread_np (inThread), THREAD_SCHED_RR_INFO, (thread_info_t)&(thePolicyInfo.rr), &count);
@@ -366,7 +366,7 @@ UInt32 CAPThread::getScheduledPriority(pthread_t inThread, int inPriorityKind)
             return static_cast<UInt32>(thePolicyInfo.rr.base_priority);
             break;
 	}
-    
+
     return 0;
 }
 
@@ -376,7 +376,7 @@ UInt32 WINAPI	CAPThread::Entry(CAPThread* inCAPThread)
 {
 	UInt32 theAnswer = 0;
 
-	try 
+	try
 	{
 		if(inCAPThread->mTimeConstraintSet)
 		{
@@ -429,20 +429,20 @@ void	CAPThread::DebugPriority(const char *label)
 {
 #if !TARGET_OS_WIN32
 	if (mTimeConstraintSet)
-		printf("CAPThread::%s %p: pri=<time constraint>, spawning pri=%d, scheduled pri=%d\n", label, this, 
+		printf("CAPThread::%s %p: pri=<time constraint>, spawning pri=%d, scheduled pri=%d\n", label, this,
 		(int)mSpawningThreadPriority, (mPThread != NULL) ? (int)GetScheduledPriority() : -1);
 	else
-		printf("CAPThread::%s %p: pri=%d%s, spawning pri=%d, scheduled pri=%d\n", label, this, (int)mPriority, mFixedPriority ? " fixed" : "", 
+		printf("CAPThread::%s %p: pri=%d%s, spawning pri=%d, scheduled pri=%d\n", label, this, (int)mPriority, mFixedPriority ? " fixed" : "",
 		(int)mSpawningThreadPriority, (mPThread != NULL) ? (int)GetScheduledPriority() : -1);
 #else
 	if (mTimeConstraintSet)
 	{
-		printf("CAPThread::%s %p: pri=<time constraint>, spawning pri=%d, scheduled pri=%d\n", label, this, 
+		printf("CAPThread::%s %p: pri=<time constraint>, spawning pri=%d, scheduled pri=%d\n", label, this,
 		(int)mPriority, (mThreadHandle != NULL) ? (int)GetScheduledPriority() : -1);
 	}
 	else
 	{
-		printf("CAPThread::%s %p: pri=%d%s, spawning pri=%d, scheduled pri=%d\n", label, this, (int)mPriority, mFixedPriority ? " fixed" : "", 
+		printf("CAPThread::%s %p: pri=%d%s, spawning pri=%d, scheduled pri=%d\n", label, this, (int)mPriority, mFixedPriority ? " fixed" : "",
 		(int)mPriority, (mThreadHandle != NULL) ? (int)GetScheduledPriority() : -1);
 	}
 #endif
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAPThread.h b/libs/appleutility/CoreAudio/PublicUtility/CAPThread.h
index 4145125..f85cdc0 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAPThread.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAPThread.h
@@ -2,14 +2,14 @@
      File: CAPThread.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #if !defined(__CAPThread_h__)
 #define __CAPThread_h__
@@ -121,7 +121,7 @@ public:
     static UInt32			getScheduledPriority(pthread_t inThread, int inPriorityKind);
 #elif TARGET_OS_WIN32
 	typedef unsigned long	NativeThread;
-	
+
 	NativeThread			GetNativeThread() { return mThreadID; }
 	static NativeThread		GetCurrentThread() { return GetCurrentThreadId(); }
 	static bool				IsNativeThreadsEqual(NativeThread a, NativeThread b) { return (a==b); }
@@ -146,13 +146,13 @@ public:
 	void					GetTimeConstraints(UInt32& outPeriod, UInt32& outComputation, UInt32& outConstraint, bool& outIsPreemptible) const { outPeriod = mPeriod; outComputation = mComputation; outConstraint = mConstraint; outIsPreemptible = mIsPreemptible; }
 	void					SetTimeConstraints(UInt32 inPeriod, UInt32 inComputation, UInt32 inConstraint, bool inIsPreemptible);
 	void					ClearTimeConstraints() { SetPriority(mPriority); }
-	
+
 	bool					WillAutoDelete() const { return mAutoDelete; }
 	void					SetAutoDelete(bool b) { mAutoDelete = b; }
-	
+
 	void					SetName(const char* inThreadName);
 
-#if CoreAudio_Debug	
+#if CoreAudio_Debug
 	void					DebugPriority(const char *label);
 #endif
 
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAPersistence.cpp b/libs/appleutility/CoreAudio/PublicUtility/CAPersistence.cpp
index d3fe008..cabec8b 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAPersistence.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAPersistence.cpp
@@ -2,14 +2,14 @@
      File: CAPersistence.cpp
  Abstract: CAPersistence.h
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #include "CACFArray.h"
 #include "CACFDictionary.h"
@@ -80,7 +80,7 @@ OSStatus	CAStreamBasicDescription::Save (CFPropertyListRef *outData) const
 	if (!dict.AddUInt32 (kFrameBytes, mBytesPerFrame)) goto error;
 	if (!dict.AddUInt32 (kFrameChannels, mChannelsPerFrame)) goto error;
 	if (!dict.AddUInt32 (kChannelBits, mBitsPerChannel)) goto error;
-	
+
 	*outData = dict.GetDict();
 
 	return noErr;
@@ -90,14 +90,14 @@ error:
 	return paramErr;
 }
 
-	
+
 		// Given a CFData object generated by the save command, this will re-establish
 		// the CAStreamBasicDescription
 OSStatus	CAStreamBasicDescription::Restore (CFPropertyListRef& inData)
 {
 	if (CFGetTypeID (inData) != CFDictionaryGetTypeID()) return paramErr;
 	CACFDictionary dict(static_cast<CFDictionaryRef>(inData), false);
-	
+
 	if (!dict.GetFloat64 (kSampleRate, mSampleRate)) return paramErr;
 	if (!dict.GetUInt32 (kFormat, mFormatID)) return paramErr;
 	if (!dict.GetUInt32 (kFormatFlags, mFormatFlags)) return paramErr;
@@ -122,9 +122,9 @@ OSStatus		CAComponentDescription::Save (CFPropertyListRef *outData) const
 	if (!dict.AddUInt32 (kType, componentType)) goto error;
 	if (!dict.AddUInt32 (kSubType, componentSubType)) goto error;
 	if (!dict.AddUInt32 (kManu, componentManufacturer)) goto error;
-	
+
 	*outData = dict.GetDict();
-	
+
 	return 0;
 error:
 	dict.ShouldRelease (true);
@@ -135,14 +135,14 @@ OSStatus		CAComponentDescription::Restore (CFPropertyListRef &inData)
 {
 	if (CFGetTypeID (inData) != CFDictionaryGetTypeID()) return paramErr;
 	CACFDictionary dict(static_cast<CFDictionaryRef>(inData), false);
-		
+
 	if (!dict.GetUInt32 (kType, componentType)) return paramErr;
 	if (!dict.GetUInt32 (kSubType, componentSubType)) return paramErr;
 	if (!dict.GetUInt32 (kManu, componentManufacturer)) return paramErr;
 
 	componentFlags = 0;
 	componentFlagsMask = 0;
-	
+
 	return 0;
 }
 
@@ -152,13 +152,13 @@ OSStatus		CAComponent::Save (CFPropertyListRef *outData) const
 {
 	OSStatus result = mDesc.Save (outData);
 	if (result) return result;
-	
+
 	//add the name string of the component for a human readable name...
 	// this name string is *not* restored when restoring the component
 	CFStringRef	name = GetCompName ();
 	if (name && *outData)
 		CFDictionarySetValue ((CFMutableDictionaryRef)(*outData), CFSTR("name"), name);
-	
+
 	return noErr;
 }
 
@@ -187,8 +187,8 @@ static const CFStringRef kACLCoords0Key = CFSTR("coords 0");
 static const CFStringRef kACLCoords1Key = CFSTR("coords 1");
 static const CFStringRef kACLCoords2Key = CFSTR("coords 2");
 static const CFStringRef kACLDescsKey = CFSTR("descriptions");
-	
-OSStatus	CAAudioChannelLayout::Save (CFPropertyListRef *outData) const 
+
+OSStatus	CAAudioChannelLayout::Save (CFPropertyListRef *outData) const
 {
 	const AudioChannelLayout& layout = Layout();
 
@@ -197,13 +197,13 @@ OSStatus	CAAudioChannelLayout::Save (CFPropertyListRef *outData) const
 		goto badadd;
 	if (layout.mChannelBitmap && !dict.AddUInt32 (kACLBitmapKey, layout.mChannelBitmap))
 		goto badadd;
-	
+
 	if (layout.mNumberChannelDescriptions)
-	{	
+	{
 		CFMutableArrayRef descs = CFArrayCreateMutable (NULL, layout.mNumberChannelDescriptions, &kCFTypeArrayCallBacks);
-		
+
 		const AudioChannelDescription *desc = layout.mChannelDescriptions;
-		for (unsigned int i = 0; i < layout.mNumberChannelDescriptions; ++i, ++desc) 
+		for (unsigned int i = 0; i < layout.mNumberChannelDescriptions; ++i, ++desc)
 		{
 			CACFDictionary descDict (true);
 			if (!descDict.AddUInt32 (kACLLabelKey, desc->mChannelLabel))
@@ -216,41 +216,41 @@ OSStatus	CAAudioChannelLayout::Save (CFPropertyListRef *outData) const
 				{ CFRelease (descs); goto badadd; }
 			if (!descDict.AddFloat32 (kACLCoords2Key, desc->mCoordinates[2]))
 				{ CFRelease (descs); goto badadd; }
-			
+
 			CFArrayAppendValue (descs, descDict.AsPropertyList());
 		}
 		dict.AddArray (kACLDescsKey, descs);
-		
+
 		CFRelease (descs);
 	}
-	
-	*outData = dict.GetDict();	
-	
+
+	*outData = dict.GetDict();
+
 	return noErr;
-	
+
 badadd:
 	dict.ShouldRelease(true);
 	return paramErr;
 }
 
-OSStatus	CAAudioChannelLayout::Restore (CFPropertyListRef &inData) 
+OSStatus	CAAudioChannelLayout::Restore (CFPropertyListRef &inData)
 {
 	if (CFGetTypeID (inData) != CFDictionaryGetTypeID()) return paramErr;
 	CACFDictionary dict(static_cast<CFDictionaryRef>(inData), false);
 
 	RefCountedLayout *temp = NULL;
 	AudioChannelLayout* layout;
-	
+
 	CFArrayRef descs = NULL;
 	UInt32 numDescs = 0;
 
 	if (dict.GetArray (kACLDescsKey, descs)) {
 		numDescs = static_cast<OSStatus>(CFArrayGetCount (descs));
 	}
-	
+
 	temp = RefCountedLayout::CreateWithNumberChannelDescriptions(numDescs);
 	layout = temp->GetLayout();
-		
+
 	if (!dict.GetUInt32 (kACLTagKey, layout->mChannelLayoutTag))
 		goto badget;
 	if (dict.HasKey (kACLBitmapKey)) {
@@ -258,17 +258,17 @@ OSStatus	CAAudioChannelLayout::Restore (CFPropertyListRef &inData)
 			goto badget;
 	} else
 		layout->mChannelBitmap = 0;
-		
+
 	layout->mNumberChannelDescriptions = numDescs;
-	
+
 	if (numDescs)
 	{
 		AudioChannelDescription *desc = layout->mChannelDescriptions;
 		for (unsigned int i = 0; i < numDescs; ++i, ++desc)
 		{
-			CFDictionaryRef descDict = (CFDictionaryRef)CFArrayGetValueAtIndex (descs, i);			
+			CFDictionaryRef descDict = (CFDictionaryRef)CFArrayGetValueAtIndex (descs, i);
 			CACFDictionary theDesc (descDict, false);
-			
+
 			if (!theDesc.GetUInt32 (kACLLabelKey, desc->mChannelLabel))
 				goto badget;
 			if (!theDesc.GetUInt32 (kACLFlagsKey, desc->mChannelFlags))
@@ -285,7 +285,7 @@ OSStatus	CAAudioChannelLayout::Restore (CFPropertyListRef &inData)
 		mLayout->release();
 
 	mLayout = temp;
-	
+
 	return noErr;
 
 badget:
@@ -299,9 +299,9 @@ static const CFStringRef kAUScopeStr = CFSTR("scope");
 static const CFStringRef kAUElementIDStr = CFSTR("element ID");
 static const CFStringRef kAUParameterIDStr = CFSTR("paramID");
 
-void		CAAUParameter::Save (CFPropertyListRef &outData) const 
-{ 
-	return CAAUParameter::Save (*this, outData); 
+void		CAAUParameter::Save (CFPropertyListRef &outData) const
+{
+	return CAAUParameter::Save (*this, outData);
 }
 
 // static functions to save/restore AudioUnitParameter
@@ -363,56 +363,56 @@ void CAAUMIDIMap::Save(CFPropertyListRef &outData) const
 }
 
 void CAAUMIDIMap::Restore(CFDictionaryRef inData)
-{	
+{
 	CACFDictionary paramDict (inData, false);
 
-	if (!paramDict.GetUInt32 (kLocalScopeStr, mScope)) return; 
-	if (!paramDict.GetUInt32 (kLocalElementIDStr, mElement)) return; 
-	if (!paramDict.GetUInt32 (kLocalParameterIDStr, mParameterID)) return; 
+	if (!paramDict.GetUInt32 (kLocalScopeStr, mScope)) return;
+	if (!paramDict.GetUInt32 (kLocalElementIDStr, mElement)) return;
+	if (!paramDict.GetUInt32 (kLocalParameterIDStr, mParameterID)) return;
 	if (!paramDict.GetUInt32 (kMIDIFlagsStr, mFlags)) return;
-	if (!paramDict.GetFloat32 (kMIDISubMinStr, mSubRangeMin)) return; 
-	if (!paramDict.GetFloat32 (kMIDISubMaxStr, mSubRangeMax)) return; 
-	UInt32 data;		
+	if (!paramDict.GetFloat32 (kMIDISubMinStr, mSubRangeMin)) return;
+	if (!paramDict.GetFloat32 (kMIDISubMaxStr, mSubRangeMax)) return;
+	UInt32 data;
 	if (!paramDict.GetUInt32 (kMIDIStatusStr, data)) return;
 	mStatus = data;
-	if (!paramDict.GetUInt32 (kMIDIDataByteStr, data)) return; 
+	if (!paramDict.GetUInt32 (kMIDIDataByteStr, data)) return;
 	mData1 = data;
 }
 
 void		CAAUMIDIMap::SaveAsMapPList (AudioUnit inUnit, const AUParameterMIDIMapping* inMappings, UInt32 inNumMappings, CFPropertyListRef &outData, CFStringRef inName)
 {
 
-	CACFDictionary mappingDict (false);	
+	CACFDictionary mappingDict (false);
 	CACFArray maps (true);
-	
-	for (UInt32 i = 0; i< inNumMappings; ++i) 
+
+	for (UInt32 i = 0; i< inNumMappings; ++i)
 	{
 		CFPropertyListRef data;
 		CAAUMIDIMap paramMap(inMappings[i]);
 		paramMap.Save (data);
-		if (data) 
+		if (data)
 		{
-			maps.AppendCFType (data); 
-			CFRelease(data); 
-		}				
+			maps.AppendCFType (data);
+			CFRelease(data);
+		}
 	}
 
 	if (maps.GetNumberItems()) {
 		mappingDict.AddCFType (kParamMIDIStr, maps.GetCFArray());
-		
+
 		// Add the AU info here - where this map came from
 		CAAudioUnit au (inUnit);
 		CFPropertyListRef data;
 		au.Comp().Save (&data);
-		
+
 		mappingDict.AddCFType (kAUStr, data);
 		CFRelease(data);
-		
+
 		if (!inName) inName = CFSTR("Untitled");
 		mappingDict.AddString (CFSTR("name"), inName);
-		
+
 		mappingDict.AddUInt32 (CFSTR("version"), 1);
-		
+
 		outData = mappingDict.AsPropertyList();
 	} else {
 		mappingDict.ShouldRelease(true);
@@ -423,41 +423,41 @@ void		CAAUMIDIMap::SaveAsMapPList (AudioUnit inUnit, const AUParameterMIDIMappin
 UInt32		CAAUMIDIMap::NumberOfMaps (const CFDictionaryRef inData)
 {
 	CACFDictionary dict (inData, false);
-	
-	if (dict.HasKey (kParamMIDIStr)) 
+
+	if (dict.HasKey (kParamMIDIStr))
 	{
 		CFArrayRef cfArray;
-		dict.GetArray (kParamMIDIStr, cfArray); 
-		
+		dict.GetArray (kParamMIDIStr, cfArray);
+
 		CACFArray array (cfArray, false);
-		
+
 		return array.GetNumberItems();
 	}
 	return 0;
 }
-	
+
 void		CAAUMIDIMap::RestoreFromMapPList (const CFDictionaryRef inData, AUParameterMIDIMapping* outMappings, UInt32 inNumMappings)
 {
 
 	CACFDictionary dict (inData, false);
-	
-	if (dict.HasKey (kParamMIDIStr)) 
+
+	if (dict.HasKey (kParamMIDIStr))
 	{
 		CFArrayRef cfArray;
-		dict.GetArray (kParamMIDIStr, cfArray); 
-		
+		dict.GetArray (kParamMIDIStr, cfArray);
+
 		CACFArray array (cfArray, false);
-		
+
 		UInt32 count = array.GetNumberItems();
 		if (count > inNumMappings)
 			count = inNumMappings;
-		
+
 		for (unsigned int i = 0; i < count; ++i)
 		{
 			CFDictionaryRef paramsDictRef;
-			if (!array.GetDictionary(i, paramsDictRef)) 
+			if (!array.GetDictionary(i, paramsDictRef))
 				return;
-			
+
 			CAAUMIDIMap parameterMap;
 			parameterMap.Restore(paramsDictRef);
 			outMappings[i] = parameterMap;
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAProcess.cpp b/libs/appleutility/CoreAudio/PublicUtility/CAProcess.cpp
index 23ad2c0..fa7d203 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAProcess.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAProcess.cpp
@@ -2,14 +2,14 @@
      File: CAProcess.cpp
  Abstract: CAProcess.h
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 //=============================================================================
 //	Includes
@@ -62,7 +62,7 @@ bool	CAProcess::ProcessExists(pid_t inPID)
 	//	pids <= 0 are reserved for special purposes and -1 is
 	//	used as a sentinel value by the HAL.
 	bool theAnswer = inPID > 0;
-	
+
 	if(theAnswer)
 	{
 		//	according to kill(2), the process exists if kill(pid, 0) returns 0
@@ -75,7 +75,7 @@ bool	CAProcess::ProcessExists(pid_t inPID)
 		}
 	}
 
-	
+
 	return theAnswer;
 }
 
@@ -85,7 +85,7 @@ pid_t	CAProcess::GetPID()
 	{
 		sPID = getpid();
 	}
-	
+
 	return sPID;
 }
 
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAProcess.h b/libs/appleutility/CoreAudio/PublicUtility/CAProcess.h
index e512d91..5602ccd 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAProcess.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAProcess.h
@@ -2,14 +2,14 @@
      File: CAProcess.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #if !defined(__CAProcess_h__)
 #define __CAProcess_h__
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAPropertyAddress.h b/libs/appleutility/CoreAudio/PublicUtility/CAPropertyAddress.h
index 6df444b..f35776f 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAPropertyAddress.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAPropertyAddress.h
@@ -2,14 +2,14 @@
      File: CAPropertyAddress.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #if !defined(__CAPropertyAddress_h__)
 #define __CAPropertyAddress_h__
@@ -88,7 +88,7 @@ public:
 						CAPropertyAddress(const CAPropertyAddress& inAddress)																				: AudioObjectPropertyAddress(inAddress){}
 	CAPropertyAddress&  operator=(const AudioObjectPropertyAddress& inAddress)																				{ AudioObjectPropertyAddress::operator=(inAddress); return *this; }
 	CAPropertyAddress&  operator=(const CAPropertyAddress& inAddress)																						{ AudioObjectPropertyAddress::operator=(inAddress); return *this; }
-	
+
 //  Operations
 public:
 	static bool			IsSameAddress(const AudioObjectPropertyAddress& inAddress1, const AudioObjectPropertyAddress& inAddress2)							{ return (inAddress1.mScope == inAddress2.mScope) && (inAddress1.mSelector == inAddress2.mSelector) && (inAddress1.mElement == inAddress2.mElement); }
@@ -145,18 +145,18 @@ public:
 public:
 	void*									GetToken() const																		{ return mToken; }
 	void									SetToken(void* inToken)																	{ mToken = inToken; }
-	
+
 	uintptr_t								GetIntToken() const																		{ return reinterpret_cast<uintptr_t>(mToken); }
 	void									SetIntToken(uintptr_t inToken)															{ mToken = reinterpret_cast<void*>(inToken); }
-	
+
 	AudioObjectID							GetAudioObjectIDToken() const															{ return static_cast<AudioObjectID>(reinterpret_cast<uintptr_t>(mToken)); }
-	
+
 	bool									IsEmpty() const																			{ return mAddressList.empty(); }
 	UInt32									GetNumberItems() const																	{ return ToUInt32(mAddressList.size()); }
 	void									GetItemByIndex(UInt32 inIndex, AudioObjectPropertyAddress& outAddress) const			{ if(inIndex < mAddressList.size()) { outAddress = mAddressList.at(inIndex); } }
 	const AudioObjectPropertyAddress*		GetItems() const																		{ return &(*mAddressList.begin()); }
 	AudioObjectPropertyAddress*				GetItems()																				{ return &(*mAddressList.begin()); }
-	
+
 	bool									HasItem(const AudioObjectPropertyAddress& inAddress) const								{ AddressList::const_iterator theIterator = std::find_if(mAddressList.begin(), mAddressList.end(), std::bind1st(CAPropertyAddress::CongruentEqualTo(), inAddress)); return theIterator != mAddressList.end(); }
 	bool									HasExactItem(const AudioObjectPropertyAddress& inAddress) const							{ AddressList::const_iterator theIterator = std::find_if(mAddressList.begin(), mAddressList.end(), std::bind1st(CAPropertyAddress::EqualTo(), inAddress)); return theIterator != mAddressList.end(); }
 
@@ -174,7 +174,7 @@ private:
 
 	AddressList								mAddressList;
 	void*									mToken;
-	
+
 };
 
 //==================================================================================================
@@ -207,10 +207,10 @@ public:
 	CAPropertyAddressList*						GetItemByToken(void* inToken);
 	const CAPropertyAddressList*				GetItemByIntToken(uintptr_t inToken) const;
 	CAPropertyAddressList*						GetItemByIntToken(uintptr_t inToken);
-	
+
 	void										AppendItem(const CAPropertyAddressList& inAddressList)								{ mAddressListVector.push_back(inAddressList); }
 	void										EraseAllItems()																		{ mAddressListVector.clear(); }
-	
+
 //  Implementation
 private:
 	typedef std::vector<CAPropertyAddressList>	AddressListVector;
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAReferenceCounted.h b/libs/appleutility/CoreAudio/PublicUtility/CAReferenceCounted.h
index f00fc61..9e4de36 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAReferenceCounted.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAReferenceCounted.h
@@ -2,14 +2,14 @@
      File: CAReferenceCounted.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #ifndef __CAReferenceCounted_h__
 #define __CAReferenceCounted_h__
@@ -53,11 +53,11 @@
 class CAReferenceCounted {
 public:
 	CAReferenceCounted() : mRefCount(1) {}
-	
+
 	void	retain() { CAAtomicIncrement32(&mRefCount); }
-	
-	void	release() 
-			{ 
+
+	void	release()
+			{
 				SInt32 rc = CAAtomicDecrement32(&mRefCount);
 				if (rc == 0) {
 					releaseObject();
@@ -69,17 +69,17 @@ public:
 	public:
 		Retainer(CAReferenceCounted *obj) : mObject(obj) { mObject->retain(); }
 		~Retainer() { mObject->release(); }
-	
+
 	private:
 		CAReferenceCounted *	mObject;
 	};
 
 protected:
     virtual	~CAReferenceCounted() { }
-	
-	virtual void releaseObject () 
-			{ 
-				delete this; 
+
+	virtual void releaseObject ()
+			{
+				delete this;
 			}
 
 #if DEBUG
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CARingBuffer.cpp b/libs/appleutility/CoreAudio/PublicUtility/CARingBuffer.cpp
index c78acd2..8d9584e 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CARingBuffer.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CARingBuffer.cpp
@@ -2,14 +2,14 @@
      File: CARingBuffer.cpp
  Abstract: CARingBuffer.h
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #include "CARingBuffer.h"
 #include "CABitOperations.h"
@@ -69,9 +69,9 @@ CARingBuffer::~CARingBuffer()
 void	CARingBuffer::Allocate(int nChannels, UInt32 bytesPerFrame, UInt32 capacityFrames)
 {
 	Deallocate();
-	
+
 	capacityFrames = NextPowerOfTwo(capacityFrames);
-	
+
 	mNumberChannels = nChannels;
 	mBytesPerFrame = bytesPerFrame;
 	mCapacityFrames = capacityFrames;
@@ -88,7 +88,7 @@ void	CARingBuffer::Allocate(int nChannels, UInt32 bytesPerFrame, UInt32 capacity
 		mBuffers[i] = p;
 		p += mCapacityBytes;
 	}
-	
+
 	for (UInt32 i = 0; i<kGeneralRingTimeBoundsQueueSize; ++i)
 	{
 		mTimeBoundsQueue[i].mStartTime = 0;
@@ -157,12 +157,12 @@ CARingBufferError	CARingBuffer::Store(const AudioBufferList *abl, UInt32 framesT
 {
 	if (framesToWrite == 0)
 		return kCARingBufferError_OK;
-	
+
 	if (framesToWrite > mCapacityFrames)
 		return kCARingBufferError_TooMuch;		// too big!
 
 	SampleTime endWrite = startWrite + framesToWrite;
-	
+
 	if (startWrite < EndTime()) {
 		// going backwards, throw everything out
 		SetTimeBounds(startWrite, startWrite);
@@ -174,13 +174,13 @@ CARingBufferError	CARingBuffer::Store(const AudioBufferList *abl, UInt32 framesT
 		SampleTime newEnd = std::max(newStart, EndTime());
 		SetTimeBounds(newStart, newEnd);
 	}
-	
+
 	// write the new frames
 	Byte **buffers = mBuffers;
 	int nchannels = mNumberChannels;
 	int offset0, offset1, nbytes;
 	SampleTime curEnd = EndTime();
-	
+
 	if (startWrite > curEnd) {
 		// we are skipping some samples, so zero the range we are skipping
 		offset0 = FrameOffset(curEnd);
@@ -204,10 +204,10 @@ CARingBufferError	CARingBuffer::Store(const AudioBufferList *abl, UInt32 framesT
 		StoreABL(buffers, offset0, abl, 0, nbytes);
 		StoreABL(buffers, 0, abl, nbytes, offset1);
 	}
-	
+
 	// now update the end time
 	SetTimeBounds(StartTime(), endWrite);
-	
+
 	return kCARingBufferError_OK;	// success
 }
 
@@ -215,7 +215,7 @@ void	CARingBuffer::SetTimeBounds(SampleTime startTime, SampleTime endTime)
 {
 	UInt32 nextPtr = mTimeBoundsQueuePtr + 1;
 	UInt32 index = nextPtr & kGeneralRingTimeBoundsQueueMask;
-	
+
 	mTimeBoundsQueue[index].mStartTime = startTime;
 	mTimeBoundsQueue[index].mEndTime = endTime;
 	mTimeBoundsQueue[index].mUpdateCounter = nextPtr;
@@ -229,12 +229,12 @@ CARingBufferError	CARingBuffer::GetTimeBounds(SampleTime &startTime, SampleTime
 		UInt32 curPtr = mTimeBoundsQueuePtr;
 		UInt32 index = curPtr & kGeneralRingTimeBoundsQueueMask;
 		CARingBuffer::TimeBounds* bounds = mTimeBoundsQueue + index;
-		
+
 		startTime = bounds->mStartTime;
 		endTime = bounds->mEndTime;
 		UInt32 newPtr = bounds->mUpdateCounter;
-		
-		if (newPtr == curPtr) 
+
+		if (newPtr == curPtr)
 			return kCARingBufferError_OK;
 	}
 	return kCARingBufferError_CPUOverload;
@@ -243,19 +243,19 @@ CARingBufferError	CARingBuffer::GetTimeBounds(SampleTime &startTime, SampleTime
 CARingBufferError	CARingBuffer::ClipTimeBounds(SampleTime& startRead, SampleTime& endRead)
 {
 	SampleTime startTime, endTime;
-	
+
 	CARingBufferError err = GetTimeBounds(startTime, endTime);
 	if (err) return err;
-	
+
 	if (startRead > endTime || endRead < startTime) {
 		endRead = startRead;
 		return kCARingBufferError_OK;
 	}
-	
+
 	startRead = std::max(startRead, startTime);
 	endRead = std::min(endRead, endTime);
 	endRead = std::max(endRead, startRead);
-		
+
 	return kCARingBufferError_OK;	// success
 }
 
@@ -263,9 +263,9 @@ CARingBufferError	CARingBuffer::Fetch(AudioBufferList *abl, UInt32 nFrames, Samp
 {
 	if (nFrames == 0)
 		return kCARingBufferError_OK;
-		
+
 	startRead = std::max(0LL, startRead);
-	
+
 	SampleTime endRead = startRead + nFrames;
 
 	SampleTime startRead0 = startRead;
@@ -278,25 +278,25 @@ CARingBufferError	CARingBuffer::Fetch(AudioBufferList *abl, UInt32 nFrames, Samp
 		ZeroABL(abl, 0, nFrames * mBytesPerFrame);
 		return kCARingBufferError_OK;
 	}
-	
+
 	SInt32 byteSize = (SInt32)((endRead - startRead) * mBytesPerFrame);
-	
-	SInt32 destStartByteOffset = std::max((SInt32)0, (SInt32)((startRead - startRead0) * mBytesPerFrame)); 
-		
+
+	SInt32 destStartByteOffset = std::max((SInt32)0, (SInt32)((startRead - startRead0) * mBytesPerFrame));
+
 	if (destStartByteOffset > 0) {
 		ZeroABL(abl, 0, std::min((SInt32)(nFrames * mBytesPerFrame), destStartByteOffset));
 	}
 
-	SInt32 destEndSize = std::max((SInt32)0, (SInt32)(endRead0 - endRead)); 
+	SInt32 destEndSize = std::max((SInt32)0, (SInt32)(endRead0 - endRead));
 	if (destEndSize > 0) {
 		ZeroABL(abl, destStartByteOffset + byteSize, destEndSize * mBytesPerFrame);
 	}
-	
+
 	Byte **buffers = mBuffers;
 	int offset0 = FrameOffset(startRead);
 	int offset1 = FrameOffset(endRead);
 	int nbytes;
-	
+
 	if (offset0 < offset1) {
 		nbytes = offset1 - offset0;
 		FetchABL(abl, destStartByteOffset, buffers, offset0, nbytes);
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CARingBuffer.h b/libs/appleutility/CoreAudio/PublicUtility/CARingBuffer.h
index 9569e9a..4331194 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CARingBuffer.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CARingBuffer.h
@@ -2,14 +2,14 @@
      File: CARingBuffer.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #if !defined(__COREAUDIO_USE_FLAT_INCLUDES__)
 	#include <CoreAudio/CoreAudioTypes.h>
@@ -71,37 +71,37 @@ public:
 
 	CARingBuffer();
 	~CARingBuffer();
-	
+
 	void					Allocate(int nChannels, UInt32 bytesPerFrame, UInt32 capacityFrames);
 								// capacityFrames will be rounded up to a power of 2
 	void					Deallocate();
-	
+
 	CARingBufferError	Store(const AudioBufferList *abl, UInt32 nFrames, SampleTime frameNumber);
 							// Copy nFrames of data into the ring buffer at the specified sample time.
 							// The sample time should normally increase sequentially, though gaps
 							// are filled with zeroes. A sufficiently large gap effectively empties
-							// the buffer before storing the new data. 
-							
+							// the buffer before storing the new data.
+
 							// If frameNumber is less than the previous frame number, the behavior is undefined.
-							
+
 							// Return false for failure (buffer not large enough).
-				
+
 	CARingBufferError	Fetch(AudioBufferList *abl, UInt32 nFrames, SampleTime frameNumber);
 								// will alter mNumDataBytes of the buffers
-	
+
 	CARingBufferError	GetTimeBounds(SampleTime &startTime, SampleTime &endTime);
-	
+
 protected:
 
 	int						FrameOffset(SampleTime frameNumber) { return (frameNumber & mCapacityFramesMask) * mBytesPerFrame; }
 
 	CARingBufferError		ClipTimeBounds(SampleTime& startRead, SampleTime& endRead);
-	
+
 	// these should only be called from Store.
 	SampleTime				StartTime() const { return mTimeBoundsQueue[mTimeBoundsQueuePtr & kGeneralRingTimeBoundsQueueMask].mStartTime; }
 	SampleTime				EndTime()   const { return mTimeBoundsQueue[mTimeBoundsQueuePtr & kGeneralRingTimeBoundsQueueMask].mEndTime; }
 	void					SetTimeBounds(SampleTime startTime, SampleTime endTime);
-	
+
 protected:
 	Byte **					mBuffers;				// allocated in one chunk of memory
 	int						mNumberChannels;
@@ -109,14 +109,14 @@ protected:
 	UInt32					mCapacityFrames;		// per channel, must be a power of 2
 	UInt32					mCapacityFramesMask;
 	UInt32					mCapacityBytes;			// per channel
-	
+
 	// range of valid sample time in the buffer
 	typedef struct {
 		volatile SampleTime		mStartTime;
 		volatile SampleTime		mEndTime;
 		volatile UInt32			mUpdateCounter;
 	} TimeBounds;
-	
+
 	CARingBuffer::TimeBounds mTimeBoundsQueue[kGeneralRingTimeBoundsQueueSize];
 	UInt32 mTimeBoundsQueuePtr;
 };
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CASettingsStorage.cpp b/libs/appleutility/CoreAudio/PublicUtility/CASettingsStorage.cpp
index 69bdffc..3982f3d 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CASettingsStorage.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CASettingsStorage.cpp
@@ -2,14 +2,14 @@
      File: CASettingsStorage.cpp
  Abstract: CASettingsStorage.h
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 //==================================================================================================
 //	Includes
@@ -81,17 +81,17 @@ CASettingsStorage::CASettingsStorage(const char* inSettingsFilePath, mode_t inSe
 	size_t theLength = strlen(inSettingsFilePath);
 	mSettingsFilePath = new char[theLength + 2];
 	strlcpy(mSettingsFilePath, inSettingsFilePath, theLength + 2);
-	
+
 	mSettingsCacheTime.tv_sec = 0;
 	mSettingsCacheTime.tv_nsec = 0;
-	
+
 	mSettingsCacheForceRefresh = true;
 }
 
 CASettingsStorage::~CASettingsStorage()
 {
 	delete[] mSettingsFilePath;
-	
+
 	if(mSettingsCache != NULL)
 	{
 		CFRelease(mSettingsCache);
@@ -119,11 +119,11 @@ void	CASettingsStorage::CopyBoolValue(CFStringRef inKey, bool& outValue, bool in
 {
 	//	initialize the return value
 	outValue = inDefaultValue;
-	
+
 	//	get the raw value
 	CFTypeRef theValue = NULL;
 	CopyCFTypeValue(inKey, theValue, NULL);
-	
+
 	//	for this type, NULL is an invalid value
 	if(theValue != NULL)
 	{
@@ -138,11 +138,11 @@ void	CASettingsStorage::CopyBoolValue(CFStringRef inKey, bool& outValue, bool in
 			//	get the numeric value
 			SInt32 theNumericValue = 0;
 			CFNumberGetValue(static_cast<CFNumberRef>(theValue), kCFNumberSInt32Type, &theNumericValue);
-			
+
 			//	non-zero indicates true
 			outValue = theNumericValue != 0;
 		}
-		
+
 		//	release the value since we aren't returning it
 		CFRelease(theValue);
 	}
@@ -152,11 +152,11 @@ void	CASettingsStorage::CopySInt32Value(CFStringRef inKey, SInt32& outValue, SIn
 {
 	//	initialize the return value
 	outValue = inDefaultValue;
-	
+
 	//	get the raw value
 	CFTypeRef theValue = NULL;
 	CopyCFTypeValue(inKey, theValue, NULL);
-	
+
 	//	for this type, NULL is an invalid value
 	if(theValue != NULL)
 	{
@@ -166,7 +166,7 @@ void	CASettingsStorage::CopySInt32Value(CFStringRef inKey, SInt32& outValue, SIn
 			//	get the return value from the CF object
 			CFNumberGetValue(static_cast<CFNumberRef>(theValue), kCFNumberSInt32Type, &outValue);
 		}
-		
+
 		//	release the value since we aren't returning it
 		CFRelease(theValue);
 	}
@@ -176,11 +176,11 @@ void	CASettingsStorage::CopyUInt32Value(CFStringRef inKey, UInt32& outValue, UIn
 {
 	//	initialize the return value
 	outValue = inDefaultValue;
-	
+
 	//	get the raw value
 	CFTypeRef theValue = NULL;
 	CopyCFTypeValue(inKey, theValue, NULL);
-	
+
 	//	for this type, NULL is an invalid value
 	if(theValue != NULL)
 	{
@@ -190,7 +190,7 @@ void	CASettingsStorage::CopyUInt32Value(CFStringRef inKey, UInt32& outValue, UIn
 			//	get the return value from the CF object
 			CFNumberGetValue(static_cast<CFNumberRef>(theValue), kCFNumberSInt32Type, &outValue);
 		}
-		
+
 		//	release the value since we aren't returning it
 		CFRelease(theValue);
 	}
@@ -200,11 +200,11 @@ void	CASettingsStorage::CopySInt64Value(CFStringRef inKey, SInt64& outValue, SIn
 {
 	//	initialize the return value
 	outValue = inDefaultValue;
-	
+
 	//	get the raw value
 	CFTypeRef theValue = NULL;
 	CopyCFTypeValue(inKey, theValue, NULL);
-	
+
 	//	for this type, NULL is an invalid value
 	if(theValue != NULL)
 	{
@@ -214,7 +214,7 @@ void	CASettingsStorage::CopySInt64Value(CFStringRef inKey, SInt64& outValue, SIn
 			//	get the return value from the CF object
 			CFNumberGetValue(static_cast<CFNumberRef>(theValue), kCFNumberSInt64Type, &outValue);
 		}
-		
+
 		//	release the value since we aren't returning it
 		CFRelease(theValue);
 	}
@@ -224,11 +224,11 @@ void	CASettingsStorage::CopyUInt64Value(CFStringRef inKey, UInt64& outValue, UIn
 {
 	//	initialize the return value
 	outValue = inDefaultValue;
-	
+
 	//	get the raw value
 	CFTypeRef theValue = NULL;
 	CopyCFTypeValue(inKey, theValue, NULL);
-	
+
 	//	for this type, NULL is an invalid value
 	if(theValue != NULL)
 	{
@@ -238,7 +238,7 @@ void	CASettingsStorage::CopyUInt64Value(CFStringRef inKey, UInt64& outValue, UIn
 			//	get the return value from the CF object
 			CFNumberGetValue(static_cast<CFNumberRef>(theValue), kCFNumberSInt64Type, &outValue);
 		}
-		
+
 		//	release the value since we aren't returning it
 		CFRelease(theValue);
 	}
@@ -248,11 +248,11 @@ void	CASettingsStorage::CopyFloat32Value(CFStringRef inKey, Float32& outValue, F
 {
 	//	initialize the return value
 	outValue = inDefaultValue;
-	
+
 	//	get the raw value
 	CFTypeRef theValue = NULL;
 	CopyCFTypeValue(inKey, theValue, NULL);
-	
+
 	//	for this type, NULL is an invalid value
 	if(theValue != NULL)
 	{
@@ -262,7 +262,7 @@ void	CASettingsStorage::CopyFloat32Value(CFStringRef inKey, Float32& outValue, F
 			//	get the return value from the CF object
 			CFNumberGetValue(static_cast<CFNumberRef>(theValue), kCFNumberFloat32Type, &outValue);
 		}
-		
+
 		//	release the value since we aren't returning it
 		CFRelease(theValue);
 	}
@@ -272,11 +272,11 @@ void	CASettingsStorage::CopyFloat64Value(CFStringRef inKey, Float64& outValue, F
 {
 	//	initialize the return value
 	outValue = inDefaultValue;
-	
+
 	//	get the raw value
 	CFTypeRef theValue = NULL;
 	CopyCFTypeValue(inKey, theValue, NULL);
-	
+
 	//	for this type, NULL is an invalid value
 	if(theValue != NULL)
 	{
@@ -286,7 +286,7 @@ void	CASettingsStorage::CopyFloat64Value(CFStringRef inKey, Float64& outValue, F
 			//	get the return value from the CF object
 			CFNumberGetValue(static_cast<CFNumberRef>(theValue), kCFNumberFloat64Type, &outValue);
 		}
-		
+
 		//	release the value since we aren't returning it
 		CFRelease(theValue);
 	}
@@ -300,7 +300,7 @@ void	CASettingsStorage::CopyNumberValue(CFStringRef inKey, CFNumberRef& outValue
 	//	get the raw value
 	CFTypeRef theValue = NULL;
 	CopyCFTypeValue(inKey, theValue, inDefaultValue);
-	
+
 	//	for this type, NULL is a valid value, but requires less work
 	if(theValue != NULL)
 	{
@@ -314,16 +314,16 @@ void	CASettingsStorage::CopyNumberValue(CFStringRef inKey, CFNumberRef& outValue
 		{
 			//	release the value since we aren't returning it
 			CFRelease(theValue);
-			
+
 			//	set the return value to the default value
 			outValue = inDefaultValue;
-			
+
 			//	and retain it
 			CFRetain(outValue);
 		}
 	}
 }
-	
+
 void	CASettingsStorage::CopyStringValue(CFStringRef inKey, CFStringRef& outValue, CFStringRef inDefaultValue) const
 {
 	//	initialize the return value
@@ -332,7 +332,7 @@ void	CASettingsStorage::CopyStringValue(CFStringRef inKey, CFStringRef& outValue
 	//	get the raw value
 	CFTypeRef theValue = NULL;
 	CopyCFTypeValue(inKey, theValue, inDefaultValue);
-	
+
 	//	for this type, NULL is a valid value, but requires less work
 	if(theValue != NULL)
 	{
@@ -346,16 +346,16 @@ void	CASettingsStorage::CopyStringValue(CFStringRef inKey, CFStringRef& outValue
 		{
 			//	release the value since we aren't returning it
 			CFRelease(theValue);
-			
+
 			//	set the return value to the default value
 			outValue = inDefaultValue;
-			
+
 			//	and retain it
 			CFRetain(outValue);
 		}
 	}
 }
-	
+
 void	CASettingsStorage::CopyArrayValue(CFStringRef inKey, CFArrayRef& outValue, CFArrayRef inDefaultValue) const
 {
 	//	initialize the return value
@@ -364,7 +364,7 @@ void	CASettingsStorage::CopyArrayValue(CFStringRef inKey, CFArrayRef& outValue,
 	//	get the raw value
 	CFTypeRef theValue = NULL;
 	CopyCFTypeValue(inKey, theValue, inDefaultValue);
-	
+
 	//	for this type, NULL is a valid value, but requires less work
 	if(theValue != NULL)
 	{
@@ -378,16 +378,16 @@ void	CASettingsStorage::CopyArrayValue(CFStringRef inKey, CFArrayRef& outValue,
 		{
 			//	release the value since we aren't returning it
 			CFRelease(theValue);
-			
+
 			//	set the return value to the default value
 			outValue = inDefaultValue;
-			
+
 			//	and retain it
 			CFRetain(outValue);
 		}
 	}
 }
-	
+
 void	CASettingsStorage::CopyDictionaryValue(CFStringRef inKey, CFDictionaryRef& outValue, CFDictionaryRef inDefaultValue) const
 {
 	//	initialize the return value
@@ -396,7 +396,7 @@ void	CASettingsStorage::CopyDictionaryValue(CFStringRef inKey, CFDictionaryRef&
 	//	get the raw value
 	CFTypeRef theValue = NULL;
 	CopyCFTypeValue(inKey, theValue, inDefaultValue);
-	
+
 	//	for this type, NULL is a valid value, but requires less work
 	if(theValue != NULL)
 	{
@@ -410,16 +410,16 @@ void	CASettingsStorage::CopyDictionaryValue(CFStringRef inKey, CFDictionaryRef&
 		{
 			//	release the value since we aren't returning it
 			CFRelease(theValue);
-			
+
 			//	set the return value to the default value
 			outValue = inDefaultValue;
-			
+
 			//	and retain it
 			CFRetain(outValue);
 		}
 	}
 }
-	
+
 void	CASettingsStorage::CopyDataValue(CFStringRef inKey, CFDataRef& outValue, CFDataRef inDefaultValue) const
 {
 	//	initialize the return value
@@ -428,7 +428,7 @@ void	CASettingsStorage::CopyDataValue(CFStringRef inKey, CFDataRef& outValue, CF
 	//	get the raw value
 	CFTypeRef theValue = NULL;
 	CopyCFTypeValue(inKey, theValue, inDefaultValue);
-	
+
 	//	for this type, NULL is a valid value, but requires less work
 	if(theValue != NULL)
 	{
@@ -442,10 +442,10 @@ void	CASettingsStorage::CopyDataValue(CFStringRef inKey, CFDataRef& outValue, CF
 		{
 			//	release the value since we aren't returning it
 			CFRelease(theValue);
-			
+
 			//	set the return value to the default value
 			outValue = inDefaultValue;
-			
+
 			//	and retain it
 			CFRetain(outValue);
 		}
@@ -463,7 +463,7 @@ void	CASettingsStorage::CopyCFTypeValue(CFStringRef inKey, CFTypeRef& outValue,
 		//	the key wasn't in the cache, so return the default value
 		outValue = inDefaultValue;
 	}
-		
+
 	//	make sure we retain the return value
 	if(outValue != NULL)
 	{
@@ -536,10 +536,10 @@ void	CASettingsStorage::SetCFTypeValue(CFStringRef inKey, CFTypeRef inValue)
 {
 	//	make sure our cache is up to date
 	RefreshSettings();
-	
+
 	//	add the new key/value to the dictionary
 	CFDictionarySetValue(mSettingsCache, inKey, inValue);
-	
+
 	//	write the settings to the file
 	SaveSettings();
 }
@@ -548,10 +548,10 @@ void	CASettingsStorage::RemoveValue(CFStringRef inKey)
 {
 	//	make sure our cache is up to date
 	RefreshSettings();
-	
+
 	//	remove the given key
 	CFDictionaryRemoveValue(mSettingsCache, inKey);
-	
+
 	//	write the settings to the file
 	SaveSettings();
 }
@@ -560,10 +560,10 @@ void	CASettingsStorage::RemoveAllValues()
 {
 	//	make sure our cache is up to date
 	RefreshSettings();
-	
+
 	//	remove the given key
 	CFDictionaryRemoveAllValues(mSettingsCache);
-	
+
 	//	write the settings to the file
 	SaveSettings();
 }
@@ -593,11 +593,11 @@ void	CASettingsStorage::RefreshSettings()
 		//	telling us if the file exisits
 		struct stat theFileInfo;
 		int theStatError = stat(mSettingsFilePath, &theFileInfo);
-		
+
 		//	we use this boolean to make error recovery easier since we need a case for when there's no file anyway
 		bool theSettingsWereCached = false;
 		bool theSettingsNeedSaving = true;
-		
+
 		if(theStatError == 0)
 		{
 			//	stat says there is something there, only have to do work if we either don't have a cache or the cache is out of date
@@ -615,44 +615,44 @@ void	CASettingsStorage::RefreshSettings()
 						fseek(theFile, 0, SEEK_END);
 						size_t theFileLength = static_cast<size_t>(ftell(theFile));
 						fseek(theFile, 0, SEEK_SET);
-						
+
 						if(theFileLength > 0)
 						{
 							//	allocate a block of memory to hold the data in the file
 							CAAutoFree<Byte> theRawFileData(theFileLength);
-							
+
 							//	read all the data in
 							fread(static_cast<Byte*>(theRawFileData), theFileLength, 1, theFile);
-							
+
 							//	release the lock
 							flock(fileno(theFile), LOCK_UN);
-							
+
 							//	put it into a CFData object
 							CACFData theRawFileDataCFData(static_cast<Byte*>(theRawFileData), static_cast<UInt32>(theFileLength));
-							
+
 							//	get rid of the existing cache
 							if(mSettingsCache != NULL)
 							{
 								CFRelease(mSettingsCache);
 								mSettingsCache = NULL;
 							}
-							
+
 							//	parse the data as a property list
 							mSettingsCache = (CFMutableDictionaryRef)CFPropertyListCreateWithData(NULL, theRawFileDataCFData.GetCFData(), kCFPropertyListMutableContainersAndLeaves, NULL, NULL);
-							
+
 							//	check to be sure we parsed a plist out of the file
 							if(mSettingsCache != NULL)
 							{
 								//	save the date of the cache
 								mSettingsCacheTime = theFileInfo.st_mtimespec;
-								
+
 								//	mark that we're done
 								theSettingsWereCached = true;
 								theSettingsNeedSaving = false;
 							}
 						}
 					}
-					
+
 					//	close the file
 					fclose(theFile);
 					mSettingsCacheForceRefresh = false;
@@ -665,8 +665,8 @@ void	CASettingsStorage::RefreshSettings()
 				theSettingsWereCached = true;
 			}
 		}
-		
-		//	if there was a failure, we need to clean up 
+
+		//	if there was a failure, we need to clean up
 		if((theStatError != 0) || theSettingsNeedSaving || !theSettingsWereCached)
 		{
 			//	we get here if either there isn't a file or something wacky happenned while parsing it
@@ -675,10 +675,10 @@ void	CASettingsStorage::RefreshSettings()
 			{
 				mSettingsCache = CFDictionaryCreateMutable(NULL, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
 			}
-			
+
 			mSettingsCacheTime.tv_sec = 0;
 			mSettingsCacheTime.tv_nsec = 0;
-			
+
 			if((theStatError != 0) || theSettingsNeedSaving)
 			{
 				SaveSettings();
@@ -693,7 +693,7 @@ void	CASettingsStorage::SaveSettings()
 	{
 		//	make a CFData that contains the new settings
 		CACFData theNewRawPrefsCFData(CFPropertyListCreateData(NULL, mSettingsCache, mSettingsCacheFormat, 0, NULL), true);
-		
+
 		//	open the file for writing
 		FILE* theFile = fopen(mSettingsFilePath, "w+");
 		if(theFile != NULL)
@@ -707,23 +707,23 @@ void	CASettingsStorage::SaveSettings()
 				{
 					fchmod(fileno(theFile), mSettingsFileAccessMode);
 				}
-				
+
 				//	write the data
 				fwrite(theNewRawPrefsCFData.GetDataPtr(), theNewRawPrefsCFData.GetSize(), 1, theFile);
-				
+
 				//	flush the file to be sure it is all on disk
 				fflush(theFile);
-				
+
 				//	release the lock
 				flock(fileno(theFile), LOCK_UN);
-			
+
 				//	close the file
 				fclose(theFile);
-				
+
 				//	stat the file to get the mod date
 				struct stat theFileInfo;
 				stat(mSettingsFilePath, &theFileInfo);
-				
+
 				//	save the mod date
 				mSettingsCacheTime = theFileInfo.st_mtimespec;
 			}
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CASettingsStorage.h b/libs/appleutility/CoreAudio/PublicUtility/CASettingsStorage.h
index d15f87d..33d0148 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CASettingsStorage.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CASettingsStorage.h
@@ -2,14 +2,14 @@
      File: CASettingsStorage.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #if !defined(__CASettingsStorage_h__)
 #define __CASettingsStorage_h__
@@ -83,13 +83,13 @@ public:
 	void					CopyUInt64Value(const CFStringRef inKey, UInt64& outValue, UInt64 inDefaultValue = 0) const;
 	void					CopyFloat32Value(const CFStringRef inKey, Float32& outValue, Float32 inDefaultValue = 0) const;
 	void					CopyFloat64Value(const CFStringRef inKey, Float64& outValue, Float64 inDefaultValue = 0) const;
-	void					CopyNumberValue(const CFStringRef inKey, CFNumberRef& outValue, CFNumberRef inDefaultValue = NULL) const;	
-	void					CopyStringValue(const CFStringRef inKey, CFStringRef& outValue, CFStringRef inDefaultValue = NULL) const;	
-	void					CopyArrayValue(const CFStringRef inKey, CFArrayRef& outValue, CFArrayRef inDefaultValue = NULL) const;	
-	void					CopyDictionaryValue(const CFStringRef inKey, CFDictionaryRef& outValue, CFDictionaryRef inDefaultValue = NULL) const;	
+	void					CopyNumberValue(const CFStringRef inKey, CFNumberRef& outValue, CFNumberRef inDefaultValue = NULL) const;
+	void					CopyStringValue(const CFStringRef inKey, CFStringRef& outValue, CFStringRef inDefaultValue = NULL) const;
+	void					CopyArrayValue(const CFStringRef inKey, CFArrayRef& outValue, CFArrayRef inDefaultValue = NULL) const;
+	void					CopyDictionaryValue(const CFStringRef inKey, CFDictionaryRef& outValue, CFDictionaryRef inDefaultValue = NULL) const;
 	void					CopyDataValue(const CFStringRef inKey, CFDataRef& outValue, CFDataRef inDefaultValue = NULL) const;
 	void					CopyCFTypeValue(const CFStringRef inKey, CFTypeRef& outValue, CFTypeRef inDefaultValue = NULL) const;
-	
+
 	void					SetSInt32Value(const CFStringRef inKey, SInt32 inValue);
 	void					SetUInt32Value(const CFStringRef inKey, UInt32 inValue);
 	void					SetSInt64Value(const CFStringRef inKey, SInt64 inValue);
@@ -102,10 +102,10 @@ public:
 	void					SetDictionaryValue(const CFStringRef inKey, const CFDictionaryRef inValue);
 	void					SetDataValue(const CFStringRef inKey, const CFDataRef inValue);
 	void					SetCFTypeValue(const CFStringRef inKey, const CFTypeRef inValue);
-	
+
 	void					RemoveValue(const CFStringRef inKey);
 	void					RemoveAllValues();
-	
+
 	void					SendNotification(const CFStringRef inName, CFDictionaryRef inData = NULL, bool inPostToAllSessions = true) const;
 	void					ForceRefresh();
 
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CASharedLibrary.cpp b/libs/appleutility/CoreAudio/PublicUtility/CASharedLibrary.cpp
index 0e39ac7..d463b4c 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CASharedLibrary.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CASharedLibrary.cpp
@@ -2,14 +2,14 @@
      File: CASharedLibrary.cpp
  Abstract: CASharedLibrary.h
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 //=============================================================================
 //	Includes
@@ -84,7 +84,7 @@ void*	CASharedLibrary::LoadLibraryAndGetRoutineAddress(const char* inRoutineName
 		//	off when passed to dlsym
 		theRoutine = dlsym(theImage, &(inRoutineName[1]));
 	}
-	
+
 #endif
 
 	return theRoutine;
@@ -93,7 +93,7 @@ void*	CASharedLibrary::LoadLibraryAndGetRoutineAddress(const char* inRoutineName
 void*	CASharedLibrary::GetRoutineAddressIfLibraryLoaded(const char* inRoutineName, const char* /*inLibraryName*/, const char* inLibraryPath)
 {
 	void* theRoutine = 0;
-		
+
 #if	CASharedLibrary_Use_DYLD
 	const struct mach_header* theImage = NSAddImage(inLibraryPath, NSADDIMAGE_OPTION_RETURN_ONLY_IF_LOADED);
 	if(theImage != 0)
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CASharedLibrary.h b/libs/appleutility/CoreAudio/PublicUtility/CASharedLibrary.h
index d02e70e..e183b1b 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CASharedLibrary.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CASharedLibrary.h
@@ -2,14 +2,14 @@
      File: CASharedLibrary.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #if !defined(__CASharedLibrary_h__)
 #define __CASharedLibrary_h__
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CASpectralProcessor.cpp b/libs/appleutility/CoreAudio/PublicUtility/CASpectralProcessor.cpp
index ffb2da8..85f14cb 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CASpectralProcessor.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CASpectralProcessor.cpp
@@ -2,14 +2,14 @@
      File: CASpectralProcessor.cpp
  Abstract: CASpectralProcessor.h
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,11 +40,11 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
- 
+
 //#include "AudioFormulas.h"
 #include "CASpectralProcessor.h"
 #include "CABitOperations.h"
@@ -57,23 +57,23 @@
 
 CASpectralProcessor::CASpectralProcessor(UInt32 inFFTSize, UInt32 inHopSize, UInt32 inNumChannels, UInt32 inMaxFrames)
 	: mFFTSize(inFFTSize), mHopSize(inHopSize), mNumChannels(inNumChannels), mMaxFrames(inMaxFrames),
-	mLog2FFTSize(Log2Ceil(mFFTSize)), 
+	mLog2FFTSize(Log2Ceil(mFFTSize)),
 	mFFTMask(mFFTSize - 1),
 	mFFTByteSize(mFFTSize * sizeof(Float32)),
 	mIOBufSize(NextPowerOfTwo(mFFTSize + mMaxFrames)),
 	mIOMask(mIOBufSize - 1),
 	mInputSize(0),
-	mInputPos(0), mOutputPos(-mFFTSize & mIOMask), 
+	mInputPos(0), mOutputPos(-mFFTSize & mIOMask),
 	mInFFTPos(0), mOutFFTPos(0),
 	mSpectralFunction(0), mUserData(0)
 {
 	mWindow.alloc(mFFTSize, false);
 	SineWindow(); // set default window.
-	
+
 	mChannels.alloc(mNumChannels);
 	mSpectralBufferList.allocBytes(OFFSETOF(SpectralBufferList, mDSPSplitComplex[mNumChannels]), true);
 	mSpectralBufferList->mNumberSpectra = mNumChannels;
-	for (UInt32 i = 0; i < mNumChannels; ++i) 
+	for (UInt32 i = 0; i < mNumChannels; ++i)
 	{
 		mChannels[i].mInputBuf.alloc(mIOBufSize, true);
 		mChannels[i].mOutputBuf.alloc(mIOBufSize, true);
@@ -84,7 +84,7 @@ CASpectralProcessor::CASpectralProcessor(UInt32 inFFTSize, UInt32 inHopSize, UIn
 	}
 
 	mFFTSetup = vDSP_create_fftsetup (mLog2FFTSize, FFT_RADIX2);
-	
+
 }
 
 CASpectralProcessor::~CASpectralProcessor()
@@ -101,8 +101,8 @@ void CASpectralProcessor::Reset()
 	mOutputPos = -mFFTSize & mIOMask;
 	mInFFTPos = 0;
 	mOutFFTPos = 0;
-	
-	for (UInt32 i = 0; i < mNumChannels; ++i) 
+
+	for (UInt32 i = 0; i < mNumChannels; ++i)
 	{
 		memset(mChannels[i].mInputBuf(), 0, mIOBufSize * sizeof(Float32));
 		memset(mChannels[i].mOutputBuf(), 0, mIOBufSize * sizeof(Float32));
@@ -113,13 +113,13 @@ void CASpectralProcessor::Reset()
 const double two_pi = 2. * M_PI;
 
 void CASpectralProcessor::HanningWindow()
-{ 
+{
 	// this is also vector optimized
 
 	double w = two_pi / (double)(mFFTSize - 1);
 	for (UInt32 i = 0; i < mFFTSize; ++i)
 	{
-		mWindow[i] = (0.5 - 0.5 * cos(w * (double)i));	
+		mWindow[i] = (0.5 - 0.5 * cos(w * (double)i));
 	}
 }
 
@@ -136,9 +136,9 @@ void CASpectralProcessor::Process(UInt32 inNumFrames, AudioBufferList* inInput,
 {
 	// copy from buffer list to input buffer
 	CopyInput(inNumFrames, inInput);
-	
+
 	// if enough input to process, then process.
-	while (mInputSize >= mFFTSize) 
+	while (mInputSize >= mFFTSize)
 	{
 		CopyInputToFFT(); // copy from input buffer to fft buffer
 		DoWindowing();
@@ -170,18 +170,18 @@ void CASpectralProcessor::CopyInput(UInt32 inNumFrames, AudioBufferList* inInput
 {
 	UInt32 numBytes = inNumFrames * sizeof(Float32);
 	UInt32 firstPart = mIOBufSize - mInputPos;
-	
+
 
 	if (firstPart < inNumFrames) {
 		UInt32 firstPartBytes = firstPart * sizeof(Float32);
 		UInt32 secondPartBytes = numBytes - firstPartBytes;
-		for (UInt32 i=0; i<mNumChannels; ++i) {		
+		for (UInt32 i=0; i<mNumChannels; ++i) {
 			memcpy(mChannels[i].mInputBuf + mInputPos, inInput->mBuffers[i].mData, firstPartBytes);
 			memcpy(mChannels[i].mInputBuf, (UInt8*)inInput->mBuffers[i].mData + firstPartBytes, secondPartBytes);
 		}
 	} else {
 		UInt32 numBytes = inNumFrames * sizeof(Float32);
-		for (UInt32 i=0; i<mNumChannels; ++i) {		
+		for (UInt32 i=0; i<mNumChannels; ++i) {
 			memcpy(mChannels[i].mInputBuf + mInputPos, inInput->mBuffers[i].mData, numBytes);
 		}
 	}
@@ -221,7 +221,7 @@ void CASpectralProcessor::PrintSpectralBufferList()
 	UInt32 half = mFFTSize >> 1;
 	for (UInt32 i=0; i<mNumChannels; ++i) {
 		DSPSplitComplex	&freqData = mSpectralBufferList->mDSPSplitComplex[i];
-	
+
 		for (UInt32 j=0; j<half; j++){
 			printf(" bin[%d]: %lf + %lfi\n", (int) j, freqData.realp[j], freqData.imagp[j]);
 		}
@@ -277,7 +277,7 @@ void CASpectralProcessor::DoFwdFFT()
 {
 	//printf("->DoFwdFFT %g %g\n", mChannels[0].mFFTBuf()[0], mChannels[0].mFFTBuf()[200]);
 	UInt32 half = mFFTSize >> 1;
-	for (UInt32 i=0; i<mNumChannels; ++i) 
+	for (UInt32 i=0; i<mNumChannels; ++i)
 	{
 		vDSP_ctoz((DSPComplex*)mChannels[i].mFFTBuf(), 2, &mSpectralBufferList->mDSPSplitComplex[i], 1, half);
 		vDSP_fft_zrip(mFFTSetup, &mSpectralBufferList->mDSPSplitComplex[i], 1, mLog2FFTSize, FFT_FORWARD);
@@ -289,10 +289,10 @@ void CASpectralProcessor::DoInvFFT()
 {
 	//printf("->DoInvFFT %g %g\n", mChannels[0].mFFTBuf()[0], mChannels[0].mFFTBuf()[200]);
 	UInt32 half = mFFTSize >> 1;
-	for (UInt32 i=0; i<mNumChannels; ++i) 
+	for (UInt32 i=0; i<mNumChannels; ++i)
 	{
 		vDSP_fft_zrip(mFFTSetup, &mSpectralBufferList->mDSPSplitComplex[i], 1, mLog2FFTSize, FFT_INVERSE);
-		vDSP_ztoc(&mSpectralBufferList->mDSPSplitComplex[i], 1, (DSPComplex*)mChannels[i].mFFTBuf(), 2, half);		
+		vDSP_ztoc(&mSpectralBufferList->mDSPSplitComplex[i], 1, (DSPComplex*)mChannels[i].mFFTBuf(), 2, half);
 		float scale = 0.5 / mFFTSize;
 		vDSP_vsmul(mChannels[i].mFFTBuf(), 1, &scale, mChannels[i].mFFTBuf(), 1, mFFTSize );
 	}
@@ -301,7 +301,7 @@ void CASpectralProcessor::DoInvFFT()
 
 void CASpectralProcessor::SetSpectralFunction(SpectralFunction inFunction, void* inUserData)
 {
-	mSpectralFunction = inFunction; 
+	mSpectralFunction = inFunction;
 	mUserData = inUserData;
 }
 
@@ -313,29 +313,29 @@ void CASpectralProcessor::ProcessSpectrum(UInt32 inFFTSize, SpectralBufferList*
 
 #pragma mark ___Utility___
 
-void CASpectralProcessor::GetMagnitude(AudioBufferList* list, Float32* min, Float32* max) 
-{	
-	UInt32 half = mFFTSize >> 1;	
+void CASpectralProcessor::GetMagnitude(AudioBufferList* list, Float32* min, Float32* max)
+{
+	UInt32 half = mFFTSize >> 1;
 	for (UInt32 i=0; i<mNumChannels; ++i) {
-		DSPSplitComplex	&freqData = mSpectralBufferList->mDSPSplitComplex[i];		
-		
+		DSPSplitComplex	&freqData = mSpectralBufferList->mDSPSplitComplex[i];
+
 		Float32* b = (Float32*) list->mBuffers[i].mData;
-		
-		vDSP_zvabs(&freqData,1,b,1,half); 		
-   
-		vDSP_maxmgv(b, 1, &max[i], half); 
- 		vDSP_minmgv(b, 1, &min[i], half); 
-		
-   } 
+
+		vDSP_zvabs(&freqData,1,b,1,half);
+
+		vDSP_maxmgv(b, 1, &max[i], half);
+ 		vDSP_minmgv(b, 1, &min[i], half);
+
+   }
 }
 
 
 void CASpectralProcessor::GetFrequencies(Float32* freqs, Float32 sampleRate)
 {
-	UInt32 half = mFFTSize >> 1;	
+	UInt32 half = mFFTSize >> 1;
 
 	for (UInt32 i=0; i< half; i++){
-		freqs[i] = ((Float32)(i))*sampleRate/((Float32)mFFTSize);	
+		freqs[i] = ((Float32)(i))*sampleRate/((Float32)mFFTSize);
 	}
 }
 
@@ -344,10 +344,10 @@ bool CASpectralProcessor::ProcessForwards(UInt32 inNumFrames, AudioBufferList* i
 {
 	// copy from buffer list to input buffer
 	CopyInput(inNumFrames, inInput);
-		
+
 	bool processed = false;
 	// if enough input to process, then process.
-	while (mInputSize >= mFFTSize) 
+	while (mInputSize >= mFFTSize)
 	{
 		CopyInputToFFT(); // copy from input buffer to fft buffer
 		DoWindowing();
@@ -355,21 +355,21 @@ bool CASpectralProcessor::ProcessForwards(UInt32 inNumFrames, AudioBufferList* i
 		ProcessSpectrum(mFFTSize, mSpectralBufferList()); // here you would copy the fft results out to a buffer indicated in mUserData, say for sonogram drawing
 		processed = true;
 	}
-	
+
 	return processed;
 }
 
 bool CASpectralProcessor::ProcessBackwards(UInt32 inNumFrames, AudioBufferList* outOutput)
-{		
-	
+{
+
 	ProcessSpectrum(mFFTSize, mSpectralBufferList());
 	DoInvFFT();
 	DoWindowing();
-	OverlapAddOutput();		
-	
+	OverlapAddOutput();
+
 	// copy from output buffer to buffer list
 	CopyOutput(inNumFrames, outOutput);
-	
+
 	return true;
 }
 
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CASpectralProcessor.h b/libs/appleutility/CoreAudio/PublicUtility/CASpectralProcessor.h
index d7c285b..7c8b1a7 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CASpectralProcessor.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CASpectralProcessor.h
@@ -2,14 +2,14 @@
      File: CASpectralProcessor.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,13 +40,13 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #ifndef _SpectralProcesor_H_
 #define _SpectralProcesor_H_
- 
+
 #if !defined(__COREAUDIO_USE_FLAT_INCLUDES__)
 #include <CoreAudio/CoreAudioTypes.h>
 #include <CoreFoundation/CoreFoundation.h>
@@ -65,39 +65,39 @@ struct SpectralBufferList
 	DSPSplitComplex mDSPSplitComplex[1];
 };
 
-class CASpectralProcessor 
+class CASpectralProcessor
 {
 public:
 	CASpectralProcessor(UInt32 inFFTSize, UInt32 inHopSize, UInt32 inNumChannels, UInt32 inMaxFrames);
 	virtual ~CASpectralProcessor();
-	
+
 	void Reset();
-	
+
 	void Process(UInt32 inNumFrames, AudioBufferList* inInput, AudioBufferList* outOutput);
-	
+
 	typedef void (*SpectralFunction)(SpectralBufferList* inSpectra, void* inUserData);
-	
+
 	void SetSpectralFunction(SpectralFunction inFunction, void* inUserData);
-	
+
 	UInt32 FFTSize() const { return mFFTSize; }
 	UInt32 MaxFrames() const { return mMaxFrames; }
 	UInt32 NumChannels() const { return mNumChannels; }
 	UInt32 HopSize() const { return mHopSize; }
 	Float32* Window() const { return mWindow; }
-	
-	
+
+
 	void HanningWindow(); // set up a hanning window
 	void SineWindow();
-	
+
 	void GetFrequencies(Float32* freqs, Float32 sampleRate);				// only for processed forward
 	void GetMagnitude(AudioBufferList* inCopy, Float32* min, Float32* max); // only for processed forward
-	
+
 	virtual bool ProcessForwards(UInt32 inNumFrames, AudioBufferList* inInput);
 	bool ProcessBackwards(UInt32 inNumFrames, AudioBufferList* outOutput);
 
 
 	void PrintSpectralBufferList();
-	
+
 protected:
 	void CopyInput(UInt32 inNumFrames, AudioBufferList* inInput);
 	void CopyInputToFFT();
@@ -107,14 +107,14 @@ protected:
 	void OverlapAddOutput();
 	void CopyOutput(UInt32 inNumFrames, AudioBufferList* inOutput);
 	void ProcessSpectrum(UInt32 inFFTSize, SpectralBufferList* inSpectra);
-	
+
 	UInt32 mFFTSize;
 	UInt32 mHopSize;
 	UInt32 mNumChannels;
 	UInt32 mMaxFrames;
 
 	UInt32 mLog2FFTSize;
-	UInt32 mFFTMask; 
+	UInt32 mFFTMask;
 	UInt32 mFFTByteSize;
 	UInt32 mIOBufSize;
 	UInt32 mIOMask;
@@ -126,7 +126,7 @@ protected:
 	FFTSetup mFFTSetup;
 
 	CAAutoFree<Float32> mWindow;
-	struct SpectralChannel 
+	struct SpectralChannel
 	{
 		CAAutoFree<Float32> mInputBuf;		// log2ceil(FFT size + max frames)
 		CAAutoFree<Float32> mOutputBuf;		// log2ceil(FFT size + max frames)
@@ -136,10 +136,10 @@ protected:
 	CAAutoArrayDelete<SpectralChannel> mChannels;
 
 	CAAutoFree<SpectralBufferList> mSpectralBufferList;
-	
+
 	SpectralFunction mSpectralFunction;
 	void *mUserData;
-	
+
 };
 
 
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAStreamBasicDescription.cpp b/libs/appleutility/CoreAudio/PublicUtility/CAStreamBasicDescription.cpp
index d56947a..432d513 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAStreamBasicDescription.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAStreamBasicDescription.cpp
@@ -2,14 +2,14 @@
      File: CAStreamBasicDescription.cpp
  Abstract: CAStreamBasicDescription.h
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #include "CAStreamBasicDescription.h"
 #include "CAMath.h"
@@ -72,12 +72,12 @@ char *CAStringForOSType (OSType t, char *writeLocation, size_t bufsize)
             q++;
 		}
         q = u.str;
-		
+
 		if (hasNonPrint)
 			p += snprintf (p, pend - p, "0x");
 		else if (p < pend)
 			*p++ = '\'';
-			
+
 		for (int i = 0; i < 4 && p < pend; ++i) {
 			if (hasNonPrint) {
 				p += snprintf(p, pend - p, "%02X", *q++);
@@ -96,11 +96,11 @@ char *CAStringForOSType (OSType t, char *writeLocation, size_t bufsize)
 
 const AudioStreamBasicDescription	CAStreamBasicDescription::sEmpty = { 0.0, 0, 0, 0, 0, 0, 0, 0, 0 };
 
-CAStreamBasicDescription::CAStreamBasicDescription() 
-{ 
-	memset (this, 0, sizeof(AudioStreamBasicDescription)); 
+CAStreamBasicDescription::CAStreamBasicDescription()
+{
+	memset (this, 0, sizeof(AudioStreamBasicDescription));
 }
-	
+
 CAStreamBasicDescription::CAStreamBasicDescription(const AudioStreamBasicDescription &desc)
 {
 	SetFrom(desc);
@@ -165,15 +165,15 @@ char *CAStreamBasicDescription::AsString(char *buf, size_t _bufsize, bool brief
 			return theBuffer;
 		}
 	}
-	
+
 	nc = snprintf(buf, static_cast<size_t>(bufsize), "%2d ch, %6.0f Hz, %s (0x%08X) ", (int)NumberChannels(), mSampleRate, formatID, (int)mFormatFlags);
 	buf += nc; if ((bufsize -= nc) <= 0) goto exit;
 	if (mFormatID == kAudioFormatLinearPCM) {
 		bool isInt = !(mFormatFlags & kLinearPCMFormatFlagIsFloat);
 		int wordSize = static_cast<int>(SampleWordSize());
-		const char *endian = (wordSize > 1) ? 
+		const char *endian = (wordSize > 1) ?
 			((mFormatFlags & kLinearPCMFormatFlagIsBigEndian) ? " big-endian" : " little-endian" ) : "";
-		const char *sign = isInt ? 
+		const char *sign = isInt ?
 			((mFormatFlags & kLinearPCMFormatFlagIsSignedInteger) ? " signed" : " unsigned") : "";
 		const char *floatInt = isInt ? "integer" : "float";
 		char packed[32];
@@ -195,9 +195,9 @@ char *CAStreamBasicDescription::AsString(char *buf, size_t _bufsize, bool brief
 			snprintf(bitdepth, sizeof(bitdepth), "%d.%d", (int)mBitsPerChannel - fracbits, fracbits);
 		else
 			snprintf(bitdepth, sizeof(bitdepth), "%d", (int)mBitsPerChannel);
-		
+
 		/*nc =*/ snprintf(buf, static_cast<size_t>(bufsize), "%s-bit%s%s %s%s%s%s%s",
-			bitdepth, endian, sign, floatInt, 
+			bitdepth, endian, sign, floatInt,
 			commaSpace, packed, align, deinter);
 		// buf += nc; if ((bufsize -= nc) <= 0) goto exit;
 	} else if (mFormatID == kAudioFormatAppleLossless) {
@@ -226,7 +226,7 @@ char *CAStreamBasicDescription::AsString(char *buf, size_t _bufsize, bool brief
 		//	buf += nc; if ((bufsize -= nc) <= 0) goto exit;
 	}
 	else
-		/*nc =*/ snprintf(buf, static_cast<size_t>(bufsize), "%d bits/channel, %d bytes/packet, %d frames/packet, %d bytes/frame", 
+		/*nc =*/ snprintf(buf, static_cast<size_t>(bufsize), "%d bits/channel, %d bytes/packet, %d frames/packet, %d bytes/frame",
 			(int)mBitsPerChannel, (int)mBytesPerPacket, (int)mFramesPerPacket, (int)mBytesPerFrame);
 exit:
 	return theBuffer;
@@ -328,7 +328,7 @@ void	CAStreamBasicDescription::GetSimpleName(const AudioStreamBasicDescription&
 		outName += theCharactersWritten;
 		inMaxNameLength -= static_cast<UInt32>(theCharactersWritten);
 	}
-	
+
 	switch(inDescription.mFormatID)
 	{
 		case kAudioFormatLinearPCM:
@@ -346,7 +346,7 @@ void	CAStreamBasicDescription::GetSimpleName(const AudioStreamBasicDescription&
 						theEndianString = "Little Endian";
 					#endif
 				}
-				
+
 				const char* theKindString = NULL;
 				if((inDescription.mFormatFlags & kAudioFormatFlagIsFloat) != 0)
 				{
@@ -360,7 +360,7 @@ void	CAStreamBasicDescription::GetSimpleName(const AudioStreamBasicDescription&
 				{
 					theKindString = (inAbbreviate ? "UInt" : "Unsigned Integer");
 				}
-				
+
 				const char* thePackingString = NULL;
 				if((inDescription.mFormatFlags & kAudioFormatFlagIsPacked) == 0)
 				{
@@ -373,7 +373,7 @@ void	CAStreamBasicDescription::GetSimpleName(const AudioStreamBasicDescription&
 						thePackingString = "Low";
 					}
 				}
-				
+
 				const char* theMixabilityString = NULL;
 				if((inDescription.mFormatFlags & kIsNonMixableFlag) == 0)
 				{
@@ -383,7 +383,7 @@ void	CAStreamBasicDescription::GetSimpleName(const AudioStreamBasicDescription&
 				{
 					theMixabilityString = "Unmixable";
 				}
-				
+
 				if(inAbbreviate)
 				{
 					if(theEndianString != NULL)
@@ -436,15 +436,15 @@ void	CAStreamBasicDescription::GetSimpleName(const AudioStreamBasicDescription&
 				}
 			}
 			break;
-		
+
 		case kAudioFormatAC3:
 			strlcpy(outName, "AC-3", sizeof(outName));
 			break;
-		
+
 		case kAudioFormat60958AC3:
 			strlcpy(outName, "AC-3 for SPDIF", sizeof(outName));
 			break;
-		
+
 		default:
 			CACopy4CCToCString(outName, inDescription.mFormatID);
 			break;
@@ -471,9 +471,9 @@ bool	operator<(const AudioStreamBasicDescription& x, const AudioStreamBasicDescr
 {
 	bool theAnswer = false;
 	bool isDone = false;
-	
+
 	//	note that if either side is 0, that field is skipped
-	
+
 	//	format ID is the first order sort
 	if((!isDone) && ((x.mFormatID != 0) && (y.mFormatID != 0)))
 	{
@@ -496,8 +496,8 @@ bool	operator<(const AudioStreamBasicDescription& x, const AudioStreamBasicDescr
 			isDone = true;
 		}
 	}
-	
-	
+
+
 	//  mixable is always better than non-mixable for linear PCM and should be the second order sort item
 	if((!isDone) && ((x.mFormatID == kAudioFormatLinearPCM) && (y.mFormatID == kAudioFormatLinearPCM)))
 	{
@@ -512,7 +512,7 @@ bool	operator<(const AudioStreamBasicDescription& x, const AudioStreamBasicDescr
 			isDone = true;
 		}
 	}
-	
+
 	//	floating point vs integer for linear PCM only
 	if((!isDone) && ((x.mFormatID == kAudioFormatLinearPCM) && (y.mFormatID == kAudioFormatLinearPCM)))
 	{
@@ -523,7 +523,7 @@ bool	operator<(const AudioStreamBasicDescription& x, const AudioStreamBasicDescr
 			isDone = true;
 		}
 	}
-	
+
 	//	bit depth
 	if((!isDone) && ((x.mBitsPerChannel != 0) && (y.mBitsPerChannel != 0)))
 	{
@@ -534,7 +534,7 @@ bool	operator<(const AudioStreamBasicDescription& x, const AudioStreamBasicDescr
 			isDone = true;
 		}
 	}
-	
+
 	//	sample rate
 	if((!isDone) && fnonzero(x.mSampleRate) && fnonzero(y.mSampleRate))
 	{
@@ -545,7 +545,7 @@ bool	operator<(const AudioStreamBasicDescription& x, const AudioStreamBasicDescr
 			isDone = true;
 		}
 	}
-	
+
 	//	number of channels
 	if((!isDone) && ((x.mChannelsPerFrame != 0) && (y.mChannelsPerFrame != 0)))
 	{
@@ -556,7 +556,7 @@ bool	operator<(const AudioStreamBasicDescription& x, const AudioStreamBasicDescr
 			//isDone = true;
 		}
 	}
-	
+
 	return theAnswer;
 }
 
@@ -569,24 +569,24 @@ void CAStreamBasicDescription::ModifyFormatFlagsForMatching(const AudioStreamBas
         xFlags = yFlags = 0;
         return;
     }
-    
+
     if (x.mFormatID == kAudioFormatLinearPCM) {
         // knock off the all clear flag
         xFlags = xFlags & ~kAudioFormatFlagsAreAllClear;
         yFlags = yFlags & ~kAudioFormatFlagsAreAllClear;
-        
+
         // if both kAudioFormatFlagIsPacked bits are set, then we don't care about the kAudioFormatFlagIsAlignedHigh bit.
         if (xFlags & yFlags & kAudioFormatFlagIsPacked) {
             xFlags = xFlags & ~static_cast<UInt32>(kAudioFormatFlagIsAlignedHigh);
             yFlags = yFlags & ~static_cast<UInt32>(kAudioFormatFlagIsAlignedHigh);
         }
-        
+
         // if both kAudioFormatFlagIsFloat bits are set, then we don't care about the kAudioFormatFlagIsSignedInteger bit.
         if (xFlags & yFlags & kAudioFormatFlagIsFloat) {
             xFlags = xFlags & ~static_cast<UInt32>(kAudioFormatFlagIsSignedInteger);
             yFlags = yFlags & ~static_cast<UInt32>(kAudioFormatFlagIsSignedInteger);
         }
-        
+
         //	if the bit depth is 8 bits or less and the format is packed, we don't care about endianness
         if((x.mBitsPerChannel <= 8) && ((xFlags & kAudioFormatFlagIsPacked) == kAudioFormatFlagIsPacked))
         {
@@ -596,13 +596,13 @@ void CAStreamBasicDescription::ModifyFormatFlagsForMatching(const AudioStreamBas
         {
             yFlags = yFlags & ~static_cast<UInt32>(kAudioFormatFlagIsBigEndian);
         }
-        
+
         //	if the number of channels is 1, we don't care about non-interleavedness
         if (x.mChannelsPerFrame == 1 && y.mChannelsPerFrame == 1) {
             xFlags &= ~static_cast<UInt32>(kLinearPCMFormatFlagIsNonInterleaved);
             yFlags &= ~static_cast<UInt32>(kLinearPCMFormatFlagIsNonInterleaved);
         }
-        
+
         if (converterOnly) {
             CAStreamBasicDescription cas_x = CAStreamBasicDescription(x);
             CAStreamBasicDescription cas_y = CAStreamBasicDescription(y);
@@ -625,7 +625,7 @@ static bool MatchFormatFlags(const AudioStreamBasicDescription& x, const AudioSt
 {
 	UInt32 xFlags = x.mFormatFlags;
 	UInt32 yFlags = y.mFormatFlags;
-	
+
     CAStreamBasicDescription::ModifyFormatFlagsForMatching(x, y, xFlags, yFlags, false);
 	return xFlags == yFlags;
 }
@@ -635,37 +635,37 @@ bool	operator==(const AudioStreamBasicDescription& x, const AudioStreamBasicDesc
 	//	the semantics for equality are:
 	//		1) Values must match exactly -- except for PCM format flags, see above.
 	//		2) wildcard's are ignored in the comparison
-	
+
 #define MATCH(name) ((x.name) == 0 || (y.name) == 0 || (x.name) == (y.name))
-	
-	return 
+
+	return
     //	check all but the format flags
     CAStreamBasicDescription::FlagIndependentEquivalence(x, y)
     //	check the format flags
-    && MatchFormatFlags(x, y);  
+    && MatchFormatFlags(x, y);
 }
 
 bool    CAStreamBasicDescription::FlagIndependentEquivalence(const AudioStreamBasicDescription &x, const AudioStreamBasicDescription &y)
 {
-    return 
+    return
     //	check the sample rate
     (fiszero(x.mSampleRate) || fiszero(y.mSampleRate) || fequal(x.mSampleRate, y.mSampleRate))
-    
+
     //	check the format ids
     && MATCH(mFormatID)
-        
+
     //	check the bytes per packet
-    && MATCH(mBytesPerPacket) 
-    
+    && MATCH(mBytesPerPacket)
+
     //	check the frames per packet
-    && MATCH(mFramesPerPacket) 
-    
+    && MATCH(mFramesPerPacket)
+
     //	check the bytes per frame
-    && MATCH(mBytesPerFrame) 
-    
+    && MATCH(mBytesPerFrame)
+
     //	check the channels per frame
-    && MATCH(mChannelsPerFrame) 
-    
+    && MATCH(mChannelsPerFrame)
+
     //	check the channels per frame
     && MATCH(mBitsPerChannel) ;
 }
@@ -679,15 +679,15 @@ bool	CAStreamBasicDescription::IsEqual(const AudioStreamBasicDescription &other,
 
 bool    CAStreamBasicDescription::IsFunctionallyEquivalent(const AudioStreamBasicDescription &x, const AudioStreamBasicDescription &y)
 {
-    UInt32 xFlags = x.mFormatFlags, yFlags = y.mFormatFlags;    
+    UInt32 xFlags = x.mFormatFlags, yFlags = y.mFormatFlags;
     CAStreamBasicDescription::ModifyFormatFlagsForMatching(x, y, xFlags, yFlags, true);
-    
+
     return
     // check all but the format flags
     CAStreamBasicDescription::FlagIndependentEquivalence(x, y)
     // check the format flags with converter focus
     && (xFlags == yFlags);
-    
+
 }
 
 bool SanityCheck(const AudioStreamBasicDescription& x)
@@ -695,9 +695,9 @@ bool SanityCheck(const AudioStreamBasicDescription& x)
 	// This function returns false if there are sufficiently insane values in any field.
 	// It is very conservative so even some very unlikely values will pass.
 	// This is just meant to catch the case where the data from a file is corrupted.
-	
-	return 
-		(x.mSampleRate >= 0.)	
+
+	return
+		(x.mSampleRate >= 0.)
 		&& (x.mSampleRate < 3e6)	// SACD sample rate is 2.8224 MHz
 		&& (x.mBytesPerPacket < 1000000)
 		&& (x.mFramesPerPacket < 1000000)
@@ -711,7 +711,7 @@ bool SanityCheck(const AudioStreamBasicDescription& x)
 bool CAStreamBasicDescription::FromText(const char *inTextDesc, AudioStreamBasicDescription &fmt)
 {
 	const char *p = inTextDesc;
-	
+
 	memset(&fmt, 0, sizeof(fmt));
 
 	bool isPCM = true;	// until proven otherwise
@@ -764,18 +764,18 @@ bool CAStreamBasicDescription::FromText(const char *inTextDesc, AudioStreamBasic
 					p += 2;
 				}
 			}
-			
+
 			if (strchr("-@/#", buf[3])) {
 				// further special-casing for 'aac'
 				buf[3] = ' ';
 				--p;
 			}
-			
+
 			memcpy(&fmt.mFormatID, buf, 4);
 			fmt.mFormatID = CFSwapInt32BigToHost(fmt.mFormatID);
 		}
 	}
-	
+
 	if (isPCM) {
 		fmt.mFormatID = kAudioFormatLinearPCM;
 		fmt.mFormatFlags = pcmFlags;
@@ -874,6 +874,6 @@ Bail:
 	return false;
 }
 
-const char *CAStreamBasicDescription::sTextParsingUsageString = 
+const char *CAStreamBasicDescription::sTextParsingUsageString =
 	"format[@sample_rate_hz][/format_flags][#frames_per_packet][:LHbytesPerFrame][,channelsDI].\n"
 	"Format for PCM is [-][BE|LE]{F|I|UI}{bitdepth}; else a 4-char format code (e.g. aac, alac).\n";
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAStreamBasicDescription.h b/libs/appleutility/CoreAudio/PublicUtility/CAStreamBasicDescription.h
index 8b81dba..6c6b7a1 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAStreamBasicDescription.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAStreamBasicDescription.h
@@ -2,14 +2,14 @@
      File: CAStreamBasicDescription.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #ifndef __CAStreamBasicDescription_h__
 #define __CAStreamBasicDescription_h__
@@ -90,14 +90,14 @@ enum {
 //	It adds a number of convenience routines, but otherwise adds nothing
 //	to the footprint of the original struct.
 //=============================================================================
-class CAStreamBasicDescription : 
+class CAStreamBasicDescription :
 	public AudioStreamBasicDescription
 {
 
 //	Constants
 public:
 	static const AudioStreamBasicDescription	sEmpty;
-	
+
 	enum CommonPCMFormat {
 		kPCMFormatOther		= 0,
 		kPCMFormatFloat32	= 1,
@@ -105,13 +105,13 @@ public:
 		kPCMFormatFixed824	= 3,
 		kPCMFormatFloat64	= 4
 	};
-	
+
 //	Construction/Destruction
 public:
 	CAStreamBasicDescription();
-	
+
 	CAStreamBasicDescription(const AudioStreamBasicDescription &desc);
-	
+
 	CAStreamBasicDescription(		double inSampleRate,		UInt32 inFormatID,
 									UInt32 inBytesPerPacket,	UInt32 inFramesPerPacket,
 									UInt32 inBytesPerFrame,		UInt32 inChannelsPerFrame,
@@ -164,55 +164,55 @@ public:
 	{
 		memcpy(this, &desc, sizeof(AudioStreamBasicDescription));
 	}
-	
+
 	bool		FromText(const char *inTextDesc) { return FromText(inTextDesc, *this); }
 	static bool	FromText(const char *inTextDesc, AudioStreamBasicDescription &outDesc);
 					// return true if parsing was successful
-	
+
 	static const char *sTextParsingUsageString;
-	
+
 	// _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
 	//
 	// interrogation
-	
+
 	bool	IsPCM() const { return mFormatID == kAudioFormatLinearPCM; }
-	
+
 	bool	PackednessIsSignificant() const
 	{
 		Assert(IsPCM(), "PackednessIsSignificant only applies for PCM");
 		return (SampleWordSize() << 3) != mBitsPerChannel;
 	}
-	
+
 	bool	AlignmentIsSignificant() const
 	{
 		return PackednessIsSignificant() || (mBitsPerChannel & 7) != 0;
 	}
-	
+
 	bool	IsInterleaved() const
 	{
 		return !(mFormatFlags & kAudioFormatFlagIsNonInterleaved);
 	}
-	
+
 	bool	IsSignedInteger() const
 	{
 		return IsPCM() && (mFormatFlags & kAudioFormatFlagIsSignedInteger);
 	}
-	
+
 	bool	IsFloat() const
 	{
 		return IsPCM() && (mFormatFlags & kAudioFormatFlagIsFloat);
 	}
-	
+
 	bool	IsNativeEndian() const
 	{
 		return (mFormatFlags & kAudioFormatFlagIsBigEndian) == kAudioFormatFlagsNativeEndian;
 	}
-	
+
 	// for sanity with interleaved/deinterleaved possibilities, never access mChannelsPerFrame, use these:
-	UInt32	NumberInterleavedChannels() const	{ return IsInterleaved() ? mChannelsPerFrame : 1; }	
+	UInt32	NumberInterleavedChannels() const	{ return IsInterleaved() ? mChannelsPerFrame : 1; }
 	UInt32	NumberChannelStreams() const		{ return IsInterleaved() ? 1 : mChannelsPerFrame; }
 	UInt32	NumberChannels() const				{ return mChannelsPerFrame; }
-	UInt32	SampleWordSize() const				{ 
+	UInt32	SampleWordSize() const				{
 			return (mBytesPerFrame > 0 && NumberInterleavedChannels()) ? mBytesPerFrame / NumberInterleavedChannels() :  0;
 	}
 
@@ -221,15 +221,15 @@ public:
 		Assert(mBytesPerFrame > 0, "bytesPerFrame must be > 0 in BytesToFrames");
 		return nbytes / mBytesPerFrame;
 	}
-	
+
 	bool	SameChannelsAndInterleaving(const CAStreamBasicDescription &a) const
 	{
 		return this->NumberChannels() == a.NumberChannels() && this->IsInterleaved() == a.IsInterleaved();
 	}
-	
+
 	bool	IdentifyCommonPCMFormat(CommonPCMFormat &outFormat, bool *outIsInterleaved=NULL) const
 	{	// return true if it's a valid PCM format.
-	
+
 		outFormat = kPCMFormatOther;
 		// trap out patently invalid formats.
 		if (mFormatID != kAudioFormatLinearPCM || mFramesPerPacket != 1 || mBytesPerFrame != mBytesPerPacket || mBitsPerChannel/8 > mBytesPerFrame || mChannelsPerFrame == 0)
@@ -241,7 +241,7 @@ public:
 			if (wordsize % mChannelsPerFrame != 0) return false;
 			wordsize /= mChannelsPerFrame;
 		}
-		
+
 		if ((mFormatFlags & kAudioFormatFlagIsBigEndian) == kAudioFormatFlagsNativeEndian
 		&& wordsize * 8 == mBitsPerChannel) {
 			// packed and native endian, good
@@ -281,11 +281,11 @@ public:
 		CommonPCMFormat fmt;
 		return IdentifyCommonPCMFormat(fmt, outIsInterleaved) && fmt == kPCMFormatInt16;
 	}
-	
+
 	// _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
 	//
 	//	manipulation
-	
+
 	void	SetCanonical(UInt32 nChannels, bool interleaved)
 				// note: leaves sample rate untouched
 	{
@@ -302,7 +302,7 @@ public:
 			mFormatFlags |= kAudioFormatFlagIsNonInterleaved;
 		}
 	}
-	
+
 	bool	IsCanonical() const
 	{
 		if (mFormatID != kAudioFormatLinearPCM) return false;
@@ -319,7 +319,7 @@ public:
 			&& mBytesPerFrame == reqFrameSize
 			&& mBytesPerPacket == reqFrameSize);
 	}
-	
+
 	void	SetAUCanonical(UInt32 nChannels, bool interleaved)
 	{
 		mFormatID = kAudioFormatLinearPCM;
@@ -338,7 +338,7 @@ public:
 			mFormatFlags |= kAudioFormatFlagIsNonInterleaved;
 		}
 	}
-	
+
 	void	ChangeNumberChannels(UInt32 nChannels, bool interleaved)
 				// alter an existing format
 	{
@@ -356,28 +356,28 @@ public:
 			mFormatFlags |= kAudioFormatFlagIsNonInterleaved;
 		}
 	}
-	
+
 	// _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
 	//
 	//	other
-	
+
 	bool            IsEqual(const AudioStreamBasicDescription &other, bool interpretingWildcards=true) const;
 	static bool     FlagIndependentEquivalence(const AudioStreamBasicDescription &x, const AudioStreamBasicDescription &y);
     static bool     IsFunctionallyEquivalent(const AudioStreamBasicDescription &x, const AudioStreamBasicDescription &y);
-    
+
 	void	Print() const {
 		Print (stdout);
 	}
 
 	void	Print(FILE* file) const {
-		PrintFormat (file, "", "AudioStreamBasicDescription:");	
+		PrintFormat (file, "", "AudioStreamBasicDescription:");
 	}
 
 	void	PrintFormat(FILE *f, const char *indent, const char *name) const {
 		char buf[256];
 		fprintf(f, "%s%s %s\n", indent, name, AsString(buf, sizeof(buf)));
 	}
-	
+
 	void	PrintFormat2(FILE *f, const char *indent, const char *name) const { // no trailing newline
 		char buf[256];
 		fprintf(f, "%s%s %s", indent, name, AsString(buf, sizeof(buf)));
@@ -385,14 +385,14 @@ public:
 
 	char *	AsString(char *buf, size_t bufsize, bool brief=false) const;
 
-	static void Print (const AudioStreamBasicDescription &inDesc) 
-	{ 
+	static void Print (const AudioStreamBasicDescription &inDesc)
+	{
 		CAStreamBasicDescription desc(inDesc);
 		desc.Print ();
 	}
-	
+
 	OSStatus			Save(CFPropertyListRef *outData) const;
-		
+
 	OSStatus			Restore(CFPropertyListRef &inData);
 
 //	Operations
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAStreamRangedDescription.cpp b/libs/appleutility/CoreAudio/PublicUtility/CAStreamRangedDescription.cpp
index 9b72054..99d3e0c 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAStreamRangedDescription.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAStreamRangedDescription.cpp
@@ -2,14 +2,14 @@
      File: CAStreamRangedDescription.cpp
  Abstract: CAStreamRangedDescription.h
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 //==================================================================================================
 //	Includes
@@ -80,9 +80,9 @@ bool	CAStreamRangedDescription::Sorter(const AudioStreamRangedDescription& x, co
 {
 	bool theAnswer = false;
 	bool isDone = false;
-	
+
 	//	note that if either side is 0, that field is skipped
-	
+
 	//	format ID is the first order sort
 	if((!isDone) && ((x.mFormat.mFormatID != 0) && (y.mFormat.mFormatID != 0)))
 	{
@@ -105,8 +105,8 @@ bool	CAStreamRangedDescription::Sorter(const AudioStreamRangedDescription& x, co
 			isDone = true;
 		}
 	}
-	
-	
+
+
 	//  mixable is always better than non-mixable for linear PCM and should be the second order sort item
 	if((!isDone) && ((x.mFormat.mFormatID == kAudioFormatLinearPCM) && (y.mFormat.mFormatID == kAudioFormatLinearPCM)))
 	{
@@ -121,7 +121,7 @@ bool	CAStreamRangedDescription::Sorter(const AudioStreamRangedDescription& x, co
 			isDone = true;
 		}
 	}
-	
+
 	//	floating point vs integer for linear PCM only
 	if((!isDone) && ((x.mFormat.mFormatID == kAudioFormatLinearPCM) && (y.mFormat.mFormatID == kAudioFormatLinearPCM)))
 	{
@@ -132,7 +132,7 @@ bool	CAStreamRangedDescription::Sorter(const AudioStreamRangedDescription& x, co
 			isDone = true;
 		}
 	}
-	
+
 	//	bit depth
 	if((!isDone) && ((x.mFormat.mBitsPerChannel != 0) && (y.mFormat.mBitsPerChannel != 0)))
 	{
@@ -143,7 +143,7 @@ bool	CAStreamRangedDescription::Sorter(const AudioStreamRangedDescription& x, co
 			isDone = true;
 		}
 	}
-	
+
 	//	sample rate range
 	if((!isDone) && fnonzero(x.mSampleRateRange.mMinimum) && fnonzero(x.mSampleRateRange.mMaximum) && fnonzero(y.mSampleRateRange.mMinimum) && fnonzero(y.mSampleRateRange.mMaximum))
 	{
@@ -154,7 +154,7 @@ bool	CAStreamRangedDescription::Sorter(const AudioStreamRangedDescription& x, co
 			isDone = true;
 		}
 	}
-	
+
 	//	sample rate
 	if((!isDone) && fnonzero(x.mFormat.mSampleRate) && fnonzero(y.mFormat.mSampleRate))
 	{
@@ -165,7 +165,7 @@ bool	CAStreamRangedDescription::Sorter(const AudioStreamRangedDescription& x, co
 			isDone = true;
 		}
 	}
-	
+
 	//	number of channels
 	if((!isDone) && ((x.mFormat.mChannelsPerFrame != 0) && (y.mFormat.mChannelsPerFrame != 0)))
 	{
@@ -177,7 +177,7 @@ bool	CAStreamRangedDescription::Sorter(const AudioStreamRangedDescription& x, co
 			//isDone = true;
 		}
 	}
-	
+
 	return theAnswer;
 }
 
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAStreamRangedDescription.h b/libs/appleutility/CoreAudio/PublicUtility/CAStreamRangedDescription.h
index 7f8284d..2c439a5 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAStreamRangedDescription.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAStreamRangedDescription.h
@@ -2,14 +2,14 @@
      File: CAStreamRangedDescription.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #if !defined(__CAStreamRangedDescription_h__)
 #define __CAStreamRangedDescription_h__
@@ -89,7 +89,7 @@ public:
 
 };
 
-inline bool operator<(const AudioStreamRangedDescription& x, const AudioStreamRangedDescription& y)													{	return	(x.mFormat.mFormatID == y.mFormat.mFormatID) ? 
+inline bool operator<(const AudioStreamRangedDescription& x, const AudioStreamRangedDescription& y)													{	return	(x.mFormat.mFormatID == y.mFormat.mFormatID) ?
 																																								(x.mFormat < y.mFormat) && (x.mSampleRateRange < y.mSampleRateRange) :
 																																								(x.mFormat.mFormatID == kAudioFormatLinearPCM) ? false : (x.mFormat.mFormatID < y.mFormat.mFormatID); }
 inline bool operator==(const AudioStreamRangedDescription& x, const AudioStreamRangedDescription& y)												{ return (x.mFormat == y.mFormat) && (x.mSampleRateRange == y.mSampleRateRange); }
@@ -100,10 +100,10 @@ inline bool	operator>=(const AudioStreamRangedDescription& x, const AudioStreamR
 inline bool	operator>(const AudioStreamRangedDescription& x, const AudioStreamRangedDescription& y)													{ return !((x < y) || (x == y)); }
 #endif
 
-inline bool operator<(const AudioStreamBasicDescription& x, const AudioStreamRangedDescription& y)													{	return	(x.mFormatID == y.mFormat.mFormatID) ? 
+inline bool operator<(const AudioStreamBasicDescription& x, const AudioStreamRangedDescription& y)													{	return	(x.mFormatID == y.mFormat.mFormatID) ?
 																																								(x < y.mFormat) && (x.mSampleRate < y.mSampleRateRange.mMinimum) :
 																																								(x.mFormatID == kAudioFormatLinearPCM) ? false : (x.mFormatID < y.mFormat.mFormatID); }
-inline bool operator<(const AudioStreamRangedDescription& x, const AudioStreamBasicDescription& y)													{	return	(x.mFormat.mFormatID == y.mFormatID) ? 
+inline bool operator<(const AudioStreamRangedDescription& x, const AudioStreamBasicDescription& y)													{	return	(x.mFormat.mFormatID == y.mFormatID) ?
 																																								(x.mFormat < y) && (x.mSampleRateRange.mMinimum < y.mSampleRate) :
 																																								(x.mFormat.mFormatID == kAudioFormatLinearPCM) ? false : (x.mFormat.mFormatID < y.mFormatID); }
 inline bool operator==(const AudioStreamBasicDescription& x, const AudioStreamRangedDescription& y)													{ return (x == y.mFormat) && CAAudioValueRange::ContainsValue(y.mSampleRateRange, x.mSampleRate); }
@@ -126,7 +126,7 @@ struct	CAStreamRangedDescription_EqualToASBD
 {
 			CAStreamRangedDescription_EqualToASBD(const AudioStreamBasicDescription& inFormat)	: mFormat(inFormat) {}
 	bool	operator()(const AudioStreamRangedDescription& x) const								{ return mFormat == x; }
-	
+
 	AudioStreamBasicDescription	mFormat;
 };
 
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAThreadSafeList.h b/libs/appleutility/CoreAudio/PublicUtility/CAThreadSafeList.h
index d0b7391..18c3a0d 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAThreadSafeList.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAThreadSafeList.h
@@ -2,14 +2,14 @@
      File: CAThreadSafeList.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #ifndef __CAThreadSafeList_h__
 #define __CAThreadSafeList_h__
@@ -60,7 +60,7 @@ private:
 		Node *		mNext;
 		EEventType	mEventType;
 		T			mObject;
-		
+
 		Node *&	next() { return mNext; }
 	};
 
@@ -69,19 +69,19 @@ public:
 	public:
 		iterator() { }
 		iterator(Node *n) : mNode(n) { }
-		
+
 		bool operator == (const iterator &other) const { return this->mNode == other.mNode; }
 		bool operator != (const iterator &other) const { return this->mNode != other.mNode; }
-		
+
 		T & operator * () const { return mNode->mObject; }
-		
+
 		iterator & operator ++ () { mNode = mNode->next(); return *this; }	// preincrement
 		iterator operator ++ (int) { iterator tmp = *this; mNode = mNode->next(); return tmp; } // postincrement
-		
+
 	private:
 		Node *		mNode;
 	};
-	
+
 	TThreadSafeList() { }
 	~TThreadSafeList()
 	{
@@ -89,9 +89,9 @@ public:
 		mPendingList.free_all();
 		mFreeList.free_all();
 	}
-	
+
 	// These may be called on any thread
-	
+
 	void	deferred_add(const T &obj)	// can be called on any thread
 	{
 		Node *node = AllocNode();
@@ -100,7 +100,7 @@ public:
 		mPendingList.push_atomic(node);
 		//mPendingList.dump("pending after add");
 	}
-	
+
 	void	deferred_remove(const T &obj)	// can be called on any thread
 	{
 		Node *node = AllocNode();
@@ -109,22 +109,22 @@ public:
 		mPendingList.push_atomic(node);
 		//mPendingList.dump("pending after remove");
 	}
-	
+
 	void	deferred_clear()					// can be called on any thread
 	{
 		Node *node = AllocNode();
 		node->mEventType = kClear;
 		mPendingList.push_atomic(node);
 	}
-	
+
 	// These must be called from only one thread
-	
+
 	void	update()		// must only be called from one thread
 	{
 		NodeStack reversed;
 		Node *event, *node, *next;
 		bool workDone = false;
-		
+
 		// reverse the events so they are in order
 		event = mPendingList.pop_all();
 		while (event != NULL) {
@@ -136,7 +136,7 @@ public:
 		if (workDone) {
 			//reversed.dump("pending popped");
 			//mActiveList.dump("active before update");
-			
+
 			// now process them
 			while ((event = reversed.pop_NA()) != NULL) {
 				switch (event->mEventType) {
@@ -190,14 +190,14 @@ public:
 			//mActiveList.dump("active after update");
 		}
 	}
-	
+
 	iterator begin() const {
 		//mActiveList.dump("active at begin");
 		return iterator(mActiveList.head());
 	}
 	iterator end() const { return iterator(NULL); }
 
-	
+
 private:
 	Node *	AllocNode()
 	{
@@ -206,7 +206,7 @@ private:
 			node = (Node *)CA_malloc(sizeof(Node));
 		return node;
 	}
-	
+
 	void	FreeNode(Node *node)
 	{
 		mFreeList.push_atomic(node);
@@ -220,7 +220,7 @@ private:
 			while ((node = this->pop_NA()) != NULL)
 				free(node);
 		}
-		
+
 		Node **	phead() { return &this->mHead; }
 		Node *	head() const { return this->mHead; }
 	};
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CATink.h b/libs/appleutility/CoreAudio/PublicUtility/CATink.h
index f082935..fa279c3 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CATink.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CATink.h
@@ -2,14 +2,14 @@
      File: CATink.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #if !defined(__CATink_h__)
 #define __CATink_h__
@@ -74,7 +74,7 @@ class CATink
 
 public:
 	CATink(F proc) { Set(proc); }
-	
+
 	~CATink() { Set((F)0xDEADDEAD); }		// jump to an obviously bad (odd) address if accessed after destruction
 
 #if TARGET_CPU_PPC
@@ -97,7 +97,7 @@ public:
 		mCode[3] = 0x4E800420;
 		MakeDataExecutable(mCode, sizeof(mCode));
 	}
-	
+
 	operator F () { return F(mCode); }
 
 private:
@@ -107,7 +107,7 @@ private:
 	{
 		/*
 			<tink>:   push   $0x12345678
-			<tink+5>: ret    
+			<tink+5>: ret
 			<tink>:   0x34567868
 			<tink+4>: 0x00e8c312
 		*/
@@ -123,14 +123,14 @@ private:
 	UInt32		mCode[2];
 #else
 	#warning: CPU not directly supported by CATink
-	
+
 	// For other CPU's, just wrap the function pointer for now.
 	// this bypasses what we're trying to accomplish with the Tink
 	// (multiple unique "instances" of a function), but it will at
 	// least compile and run.
 
 	void Set(F proc) { mProcPtr = proc; }
-	
+
 	operator F () { return mProcPtr; }
 private:
 	F			mProcPtr;
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CATokenMap.h b/libs/appleutility/CoreAudio/PublicUtility/CATokenMap.h
index f85f393..e1272b8 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CATokenMap.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CATokenMap.h
@@ -2,14 +2,14 @@
      File: CATokenMap.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #if !defined(__CATokenMap_h__)
 #define __CATokenMap_h__
@@ -88,7 +88,7 @@ public:
 	{
 		return mTokenMapMutex.Lock();
 	}
-	
+
 	void	Unlock()
 	{
 		mTokenMapMutex.Unlock();
@@ -109,7 +109,7 @@ public:
 		}
 		return theAnswer;
 	}
-	
+
 	T*		GetObject(UInt32 inToken) const
 	{
 		CAMutex::Locker theLocker(const_cast<CAMutex&>(mTokenMapMutex));
@@ -125,13 +125,13 @@ public:
 			return GetObject((UInt32)inToken);
 		#endif
 	}
-	
+
 	UInt32	GetNumberObjects() const
 	{
 		CAMutex::Locker theLocker(const_cast<CAMutex&>(mTokenMapMutex));
 		return static_cast<UInt32>(mTokenMap.size());
 	}
-	
+
 	T*		GetObjectByIndex(UInt32 inIndex) const
 	{
 		T* theAnswer = NULL;
@@ -144,7 +144,7 @@ public:
 		}
 		return theAnswer;
 	}
-	
+
 	void	AddMapping(UInt32 inToken, T* inObject)
 	{
 		CAMutex::Locker theLocker(mTokenMapMutex);
@@ -158,7 +158,7 @@ public:
 			mTokenMap.insert(typename TokenMap::value_type(inToken, inObject));
 		}
 	}
-	
+
 	void	RemoveMapping(UInt32 inToken, T* /*inObject*/)
 	{
 		CAMutex::Locker theLocker(mTokenMapMutex);
@@ -168,12 +168,12 @@ public:
 			mTokenMap.erase(i);
 		}
 	}
-	
+
 	UInt32	GetNextToken()
 	{
 		return mNextToken++;
 	}
-	
+
 	UInt32	MapObject(T* inObject)
 	{
 		CAMutex::Locker theLocker(mTokenMapMutex);
@@ -181,7 +181,7 @@ public:
 		mTokenMap.insert(typename TokenMap::value_type(theToken, inObject));
 		return theToken;
 	}
-	
+
 	void	UnmapObject(T* inObject)
 	{
 		CAMutex::Locker theLocker(mTokenMapMutex);
@@ -202,7 +202,7 @@ public:
 	}
 
 //	Implementation
-private:	
+private:
 	TokenMap	mTokenMap;
 	UInt32		mNextToken;
 	CAMutex		mTokenMapMutex;
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAVectorUnit.cpp b/libs/appleutility/CoreAudio/PublicUtility/CAVectorUnit.cpp
index 83bfb8c..2737855 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAVectorUnit.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAVectorUnit.cpp
@@ -2,14 +2,14 @@
      File: CAVectorUnit.cpp
  Abstract: CAVectorUnit.h
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #include "CAVectorUnit.h"
 
@@ -101,17 +101,17 @@ static bool IsCpuidAvailable()
 {
 	SInt32 return_value = 0x0;
 	_asm{
-		pushfd    ;			//push original EFLAGS 
-		pop eax   ;			//get original EFLAGS 
-		mov ecx, eax   ;	//save original EFLAGS 
-		xor eax, 200000h  ; //flip ID bit in EFLAGS 
-		push eax   ;		//save new EFLAGS value on stack 
-		popfd    ;			//replace current EFLAGS value 
-		pushfd    ;			//get new EFLAGS 
-		pop eax   ;			//store new EFLAGS in EAX 
-		xor eax, ecx   ;	 
+		pushfd    ;			//push original EFLAGS
+		pop eax   ;			//get original EFLAGS
+		mov ecx, eax   ;	//save original EFLAGS
+		xor eax, 200000h  ; //flip ID bit in EFLAGS
+		push eax   ;		//save new EFLAGS value on stack
+		popfd    ;			//replace current EFLAGS value
+		pushfd    ;			//get new EFLAGS
+		pop eax   ;			//store new EFLAGS in EAX
+		xor eax, ecx   ;
 		je end_cpuid_identify  ; //can't toggle ID bit
-		mov return_value, 0x1;	
+		mov return_value, 0x1;
 end_cpuid_identify:
 		nop;
 		}
@@ -123,9 +123,9 @@ end_cpuid_identify:
 SInt32	CAVectorUnit_Examine()
 {
 	int result = kVecNone;
-	
+
 #if TARGET_OS_WIN32
-#if HAS_IPP	
+#if HAS_IPP
 	// Initialize the static IPP library! This needs to be done before
 	// any IPP function calls, otherwise we may have a performance penalty
 	int status = ippStaticInit();
@@ -156,7 +156,7 @@ SInt32	CAVectorUnit_Examine()
 	if (getenv("CA_NoVector")) {
 		fprintf(stderr, "CA_NoVector set; Vector unit optimized routines will be bypassed\n");
 		return result;
-	} 
+	}
 	else
 #endif
 	{
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAVectorUnit.h b/libs/appleutility/CoreAudio/PublicUtility/CAVectorUnit.h
index cf3a16c..604fe84 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAVectorUnit.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAVectorUnit.h
@@ -2,14 +2,14 @@
      File: CAVectorUnit.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #ifndef __CAVectorUnit_h__
 #define __CAVectorUnit_h__
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAVectorUnitTypes.h b/libs/appleutility/CoreAudio/PublicUtility/CAVectorUnitTypes.h
index 85ff837..2efb2e6 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAVectorUnitTypes.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAVectorUnitTypes.h
@@ -2,14 +2,14 @@
      File: CAVectorUnitTypes.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #ifndef __CAVectorUnitTypes_h__
 #define __CAVectorUnitTypes_h__
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAVolumeCurve.cpp b/libs/appleutility/CoreAudio/PublicUtility/CAVolumeCurve.cpp
index bb6e70c..5431d20 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAVolumeCurve.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAVolumeCurve.cpp
@@ -2,14 +2,14 @@
      File: CAVolumeCurve.cpp
  Abstract: CAVolumeCurve.h
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 //=============================================================================
 //	Includes
@@ -74,61 +74,61 @@ CAVolumeCurve::~CAVolumeCurve()
 SInt32	CAVolumeCurve::GetMinimumRaw() const
 {
 	SInt32 theAnswer = 0;
-	
+
 	if(!mCurveMap.empty())
 	{
 		CurveMap::const_iterator theIterator = mCurveMap.begin();
 		theAnswer = theIterator->first.mMinimum;
 	}
-	
+
 	return theAnswer;
 }
 
 SInt32	CAVolumeCurve::GetMaximumRaw() const
 {
 	SInt32 theAnswer = 0;
-	
+
 	if(!mCurveMap.empty())
 	{
 		CurveMap::const_iterator theIterator = mCurveMap.begin();
 		std::advance(theIterator, static_cast<int>(mCurveMap.size() - 1));
 		theAnswer = theIterator->first.mMaximum;
 	}
-	
+
 	return theAnswer;
 }
 
 Float32	CAVolumeCurve::GetMinimumDB() const
 {
 	Float32 theAnswer = 0;
-	
+
 	if(!mCurveMap.empty())
 	{
 		CurveMap::const_iterator theIterator = mCurveMap.begin();
 		theAnswer = theIterator->second.mMinimum;
 	}
-	
+
 	return theAnswer;
 }
 
 Float32	CAVolumeCurve::GetMaximumDB() const
 {
 	Float32 theAnswer = 0;
-	
+
 	if(!mCurveMap.empty())
 	{
 		CurveMap::const_iterator theIterator = mCurveMap.begin();
 		std::advance(theIterator, static_cast<int>(mCurveMap.size() - 1));
 		theAnswer = theIterator->second.mMaximum;
 	}
-	
+
 	return theAnswer;
 }
 
 void	CAVolumeCurve::SetTransferFunction(UInt32 inTransferFunction)
 {
 	mTransferFunction = inTransferFunction;
-	
+
 	//	figure out the co-efficients
 	switch(inTransferFunction)
 	{
@@ -137,97 +137,97 @@ void	CAVolumeCurve::SetTransferFunction(UInt32 inTransferFunction)
 			mRawToScalarExponentNumerator = 1.0f;
 			mRawToScalarExponentDenominator = 1.0f;
 			break;
-			
+
 		case kPow1Over3Curve:
 			mIsApplyingTransferFunction = true;
 			mRawToScalarExponentNumerator = 1.0f;
 			mRawToScalarExponentDenominator = 3.0f;
 			break;
-			
+
 		case kPow1Over2Curve:
 			mIsApplyingTransferFunction = true;
 			mRawToScalarExponentNumerator = 1.0f;
 			mRawToScalarExponentDenominator = 2.0f;
 			break;
-			
+
 		case kPow3Over4Curve:
 			mIsApplyingTransferFunction = true;
 			mRawToScalarExponentNumerator = 3.0f;
 			mRawToScalarExponentDenominator = 4.0f;
 			break;
-			
+
 		case kPow3Over2Curve:
 			mIsApplyingTransferFunction = true;
 			mRawToScalarExponentNumerator = 3.0f;
 			mRawToScalarExponentDenominator = 2.0f;
 			break;
-			
+
 		case kPow2Over1Curve:
 			mIsApplyingTransferFunction = true;
 			mRawToScalarExponentNumerator = 2.0f;
 			mRawToScalarExponentDenominator = 1.0f;
 			break;
-			
+
 		case kPow3Over1Curve:
 			mIsApplyingTransferFunction = true;
 			mRawToScalarExponentNumerator = 3.0f;
 			mRawToScalarExponentDenominator = 1.0f;
 			break;
-		
+
 		case kPow4Over1Curve:
 			mIsApplyingTransferFunction = true;
 			mRawToScalarExponentNumerator = 4.0f;
 			mRawToScalarExponentDenominator = 1.0f;
 			break;
-		
+
 		case kPow5Over1Curve:
 			mIsApplyingTransferFunction = true;
 			mRawToScalarExponentNumerator = 5.0f;
 			mRawToScalarExponentDenominator = 1.0f;
 			break;
-		
+
 		case kPow6Over1Curve:
 			mIsApplyingTransferFunction = true;
 			mRawToScalarExponentNumerator = 6.0f;
 			mRawToScalarExponentDenominator = 1.0f;
 			break;
-		
+
 		case kPow7Over1Curve:
 			mIsApplyingTransferFunction = true;
 			mRawToScalarExponentNumerator = 7.0f;
 			mRawToScalarExponentDenominator = 1.0f;
 			break;
-		
+
 		case kPow8Over1Curve:
 			mIsApplyingTransferFunction = true;
 			mRawToScalarExponentNumerator = 8.0f;
 			mRawToScalarExponentDenominator = 1.0f;
 			break;
-		
+
 		case kPow9Over1Curve:
 			mIsApplyingTransferFunction = true;
 			mRawToScalarExponentNumerator = 9.0f;
 			mRawToScalarExponentDenominator = 1.0f;
 			break;
-		
+
 		case kPow10Over1Curve:
 			mIsApplyingTransferFunction = true;
 			mRawToScalarExponentNumerator = 10.0f;
 			mRawToScalarExponentDenominator = 1.0f;
 			break;
-		
+
 		case kPow11Over1Curve:
 			mIsApplyingTransferFunction = true;
 			mRawToScalarExponentNumerator = 11.0f;
 			mRawToScalarExponentDenominator = 1.0f;
 			break;
-		
+
 		case kPow12Over1Curve:
 			mIsApplyingTransferFunction = true;
 			mRawToScalarExponentNumerator = 12.0f;
 			mRawToScalarExponentDenominator = 1.0f;
 			break;
-		
+
 		default:
 			mIsApplyingTransferFunction = true;
 			mRawToScalarExponentNumerator = 2.0f;
@@ -240,7 +240,7 @@ void	CAVolumeCurve::AddRange(SInt32 inMinRaw, SInt32 inMaxRaw, Float32 inMinDB,
 {
 	CARawPoint theRaw(inMinRaw, inMaxRaw);
 	CADBPoint theDB(inMinDB, inMaxDB);
-	
+
 	bool isOverlapped = false;
 	bool isDone = false;
 	CurveMap::iterator theIterator = mCurveMap.begin();
@@ -248,13 +248,13 @@ void	CAVolumeCurve::AddRange(SInt32 inMinRaw, SInt32 inMaxRaw, Float32 inMinDB,
 	{
 		isOverlapped = CARawPoint::Overlap(theRaw, theIterator->first);
 		isDone = theRaw >= theIterator->first;
-		
+
 		if(!isOverlapped && !isDone)
 		{
 			std::advance(theIterator, 1);
 		}
 	}
-	
+
 	if(!isOverlapped)
 	{
 		mCurveMap.insert(CurveMap::value_type(theRaw, theDB));
@@ -273,7 +273,7 @@ void	CAVolumeCurve::ResetRange()
 bool	CAVolumeCurve::CheckForContinuity() const
 {
 	bool theAnswer = true;
-	
+
 	CurveMap::const_iterator theIterator = mCurveMap.begin();
 	if(theIterator != mCurveMap.end())
 	{
@@ -284,22 +284,22 @@ bool	CAVolumeCurve::CheckForContinuity() const
 			SInt32 theRawMin = theIterator->first.mMinimum;
 			SInt32 theRawMax = theIterator->first.mMaximum;
 			SInt32 theRawRange = theRawMax - theRawMin;
-			
+
 			Float32 theDBMin = theIterator->second.mMinimum;
 			Float32 theDBMax = theIterator->second.mMaximum;
 			Float32 theDBRange = theDBMax - theDBMin;
 
 			theAnswer = theRaw == theRawMin;
 			theAnswer = theAnswer && (theDB == theDBMin);
-			
+
 			theRaw += theRawRange;
 			theDB += theDBRange;
-			
+
 			std::advance(theIterator, 1);
 		}
 		while((theIterator != mCurveMap.end()) && theAnswer);
 	}
-	
+
 	return theAnswer;
 }
 
@@ -308,16 +308,16 @@ SInt32	CAVolumeCurve::ConvertDBToRaw(Float32 inDB) const
 	//	clamp the value to the dB range
 	Float32 theOverallDBMin = GetMinimumDB();
 	Float32 theOverallDBMax = GetMaximumDB();
-	
+
 	if(inDB < theOverallDBMin) inDB = theOverallDBMin;
 	if(inDB > theOverallDBMax) inDB = theOverallDBMax;
-	
+
 	//	get the first entry in the curve map;
 	CurveMap::const_iterator theIterator = mCurveMap.begin();
-	
+
 	//	initialize the answer to the minimum raw of the first item in the curve map
 	SInt32 theAnswer = theIterator->first.mMinimum;
-	
+
 	//	iterate through the curve map until we run out of dB
 	bool isDone = false;
 	while(!isDone && (theIterator != mCurveMap.end()))
@@ -325,13 +325,13 @@ SInt32	CAVolumeCurve::ConvertDBToRaw(Float32 inDB) const
 		SInt32 theRawMin = theIterator->first.mMinimum;
 		SInt32 theRawMax = theIterator->first.mMaximum;
 		SInt32 theRawRange = theRawMax - theRawMin;
-		
+
 		Float32 theDBMin = theIterator->second.mMinimum;
 		Float32 theDBMax = theIterator->second.mMaximum;
 		Float32 theDBRange = theDBMax - theDBMin;
-		
+
 		Float32 theDBPerRaw = theDBRange / static_cast<Float32>(theRawRange);
-		
+
 		//	figure out how many steps we are into this entry in the curve map
 		if(inDB > theDBMax)
 		{
@@ -344,44 +344,44 @@ SInt32	CAVolumeCurve::ConvertDBToRaw(Float32 inDB) const
 			//	figure out how many steps it is
 			Float32 theNumberRawSteps = inDB - theDBMin;
 			theNumberRawSteps /= theDBPerRaw;
-			
+
 			//	only move in whole steps
 			theNumberRawSteps = roundf(theNumberRawSteps);
-			
+
 			//	add this many steps to the answer
 			theAnswer += static_cast<SInt32>(theNumberRawSteps);
-			
+
 			//	mark that we are done
 			isDone = true;
 		}
-		
+
 		//	go to the next entry in the curve map
 		std::advance(theIterator, 1);
 	}
-	
+
 	return theAnswer;
 }
 
 Float32	CAVolumeCurve::ConvertRawToDB(SInt32 inRaw) const
 {
 	Float32 theAnswer = 0;
-	
+
 	//	clamp the raw value
 	SInt32 theOverallRawMin = GetMinimumRaw();
 	SInt32 theOverallRawMax = GetMaximumRaw();
-	
+
 	if(inRaw < theOverallRawMin) inRaw = theOverallRawMin;
 	if(inRaw > theOverallRawMax) inRaw = theOverallRawMax;
-	
+
 	//	figure out how many raw steps need to be taken from the first one
 	SInt32 theNumberRawSteps = inRaw - theOverallRawMin;
 
 	//	get the first item in the curve map
 	CurveMap::const_iterator theIterator = mCurveMap.begin();
-	
+
 	//	initialize the answer to the minimum dB of the first item in the curve map
 	theAnswer = theIterator->second.mMinimum;
-	
+
 	//	iterate through the curve map until we run out of steps
 	while((theNumberRawSteps > 0) && (theIterator != mCurveMap.end()))
 	{
@@ -389,26 +389,26 @@ Float32	CAVolumeCurve::ConvertRawToDB(SInt32 inRaw) const
 		SInt32 theRawMin = theIterator->first.mMinimum;
 		SInt32 theRawMax = theIterator->first.mMaximum;
 		SInt32 theRawRange = theRawMax - theRawMin;
-		
+
 		Float32 theDBMin = theIterator->second.mMinimum;
 		Float32 theDBMax = theIterator->second.mMaximum;
 		Float32 theDBRange = theDBMax - theDBMin;
-		
+
 		Float32 theDBPerRaw = theDBRange / static_cast<Float32>(theRawRange);
-		
+
 		//	there might be more steps than the current map entry accounts for
 		SInt32 theRawStepsToAdd = std::min(theRawRange, theNumberRawSteps);
-		
+
 		//	add this many steps worth of db to the answer;
 		theAnswer += theRawStepsToAdd * theDBPerRaw;
-		
+
 		//	figure out how many steps are left
 		theNumberRawSteps -= theRawStepsToAdd;
-		
+
 		//	go to the next map entry
 		std::advance(theIterator, 1);
 	}
-	
+
 	return theAnswer;
 }
 
@@ -421,7 +421,7 @@ Float32	CAVolumeCurve::ConvertRawToScalar(SInt32 inRaw) const
 	SInt32	theRawMin = GetMinimumRaw();
 	SInt32	theRawMax = GetMaximumRaw();
 	SInt32	theRawRange = theRawMax - theRawMin;
-	
+
 	//	range the raw value
 	if(inRaw < theRawMin) inRaw = theRawMin;
 	if(inRaw > theRawMax) inRaw = theRawMax;
@@ -449,7 +449,7 @@ SInt32	CAVolumeCurve::ConvertScalarToRaw(Float32 inScalar) const
 {
 	//	range the scalar value
 	inScalar = std::min(1.0f, std::max(0.0f, inScalar));
-	
+
 	//	get some important values
 	Float32	theDBMin = GetMinimumDB();
 	Float32	theDBMax = GetMaximumDB();
@@ -457,20 +457,20 @@ SInt32	CAVolumeCurve::ConvertScalarToRaw(Float32 inScalar) const
 	SInt32	theRawMin = GetMinimumRaw();
 	SInt32	theRawMax = GetMaximumRaw();
 	SInt32	theRawRange = theRawMax - theRawMin;
-	
+
 	//	have to undo the curve if the dB range is greater than 30
 	if(mIsApplyingTransferFunction && (theDBRange > 30.0f))
 	{
 		inScalar = powf(inScalar, mRawToScalarExponentDenominator / mRawToScalarExponentNumerator);
 	}
-	
+
 	//	now we can figure out how many raw steps this is
 	Float32 theNumberRawSteps = inScalar * static_cast<Float32>(theRawRange);
 	theNumberRawSteps = roundf(theNumberRawSteps);
-	
+
 	//	the answer is the minimum raw value plus the number of raw steps
 	SInt32 theAnswer = theRawMin + static_cast<SInt32>(theNumberRawSteps);
-	
+
 	return theAnswer;
 }
 
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAVolumeCurve.h b/libs/appleutility/CoreAudio/PublicUtility/CAVolumeCurve.h
index 4f95446..c8ac3f6 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAVolumeCurve.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAVolumeCurve.h
@@ -2,14 +2,14 @@
      File: CAVolumeCurve.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #if !defined(__CAVolumeCurve_h__)
 #define __CAVolumeCurve_h__
@@ -66,12 +66,12 @@ struct CARawPoint
 {
 	SInt32	mMinimum;
 	SInt32	mMaximum;
-	
+
 	CARawPoint() : mMinimum(0), mMaximum(0) {}
 	CARawPoint(const CARawPoint& inPoint) : mMinimum(inPoint.mMinimum), mMaximum(inPoint.mMaximum) {}
 	CARawPoint(SInt32 inMinimum, SInt32 inMaximum) : mMinimum(inMinimum), mMaximum(inMaximum) {}
 	CARawPoint&	operator=(const CARawPoint& inPoint) { mMinimum = inPoint.mMinimum; mMaximum = inPoint.mMaximum; return *this; }
-	
+
 	static bool	Overlap(const CARawPoint& x, const CARawPoint& y) { return (x.mMinimum < y.mMaximum) && (x.mMaximum > y.mMinimum); }
 };
 
@@ -86,12 +86,12 @@ struct CADBPoint
 {
 	Float32	mMinimum;
 	Float32	mMaximum;
-	
+
 	CADBPoint() : mMinimum(0), mMaximum(0) {}
 	CADBPoint(const CADBPoint& inPoint) : mMinimum(inPoint.mMinimum), mMaximum(inPoint.mMaximum) {}
 	CADBPoint(Float32 inMinimum, Float32 inMaximum) : mMinimum(inMinimum), mMaximum(inMaximum) {}
 	CADBPoint&	operator=(const CADBPoint& inPoint) { mMinimum = inPoint.mMinimum; mMaximum = inPoint.mMaximum; return *this; }
-	
+
 	static bool	Overlap(const CADBPoint& x, const CADBPoint& y) { return (x.mMinimum < y.mMaximum) && (x.mMaximum >= y.mMinimum); }
 };
 
@@ -144,7 +144,7 @@ public:
 	SInt32			GetMaximumRaw() const;
 	Float32			GetMinimumDB() const;
 	Float32			GetMaximumDB() const;
-	
+
 	void			SetIsApplyingTransferFunction(bool inIsApplyingTransferFunction)  { mIsApplyingTransferFunction = inIsApplyingTransferFunction; }
 	UInt32			GetTransferFunction() const { return mTransferFunction; }
 	void			SetTransferFunction(UInt32 inTransferFunction);
@@ -154,7 +154,7 @@ public:
 	void			AddRange(SInt32 mMinRaw, SInt32 mMaxRaw, Float32 inMinDB, Float32 inMaxDB);
 	void			ResetRange();
 	bool			CheckForContinuity() const;
-	
+
 	SInt32			ConvertDBToRaw(Float32 inDB) const;
 	Float32			ConvertRawToDB(SInt32 inRaw) const;
 	Float32			ConvertRawToScalar(SInt32 inRaw) const;
@@ -165,7 +165,7 @@ public:
 //	Implementation
 private:
 	typedef	std::map<CARawPoint, CADBPoint>	CurveMap;
-	
+
 	UInt32			mTag;
 	CurveMap		mCurveMap;
 	bool			mIsApplyingTransferFunction;
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAXException.cpp b/libs/appleutility/CoreAudio/PublicUtility/CAXException.cpp
index c2dbac5..2b83bd4 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAXException.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAXException.cpp
@@ -2,14 +2,14 @@
      File: CAXException.cpp
  Abstract: CAXException.h
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #include "CAXException.h"
 
diff --git a/libs/appleutility/CoreAudio/PublicUtility/CAXException.h b/libs/appleutility/CoreAudio/PublicUtility/CAXException.h
index 90dabe9..0f174e0 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/CAXException.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/CAXException.h
@@ -2,14 +2,14 @@
      File: CAXException.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #ifndef __CAXException_h__
 #define __CAXException_h__
@@ -118,31 +118,31 @@ public:
 
 			strlcpy(mOperation, operation, sizeof(mOperation));
 		}
-	
+
 	char *FormatError(char *str, size_t strsize) const
 	{
 		return FormatError(str, strsize, mError);
 	}
-	
+
 	char				mOperation[256];
 	const OSStatus		mError;
-	
+
 	// -------------------------------------------------
-	
+
 	typedef void (*WarningHandler)(const char *msg, OSStatus err);
-	
+
 	static char *FormatError(char *str, size_t strsize, OSStatus error)
 	{
 		strlcpy(str, CAX4CCString(error), strsize);
 		return str;
 	}
-	
+
 	static void Warning(const char *s, OSStatus error)
 	{
 		if (sWarningHandler)
 			(*sWarningHandler)(s, error);
 	}
-	
+
 	static void SetWarningHandler(WarningHandler f) { sWarningHandler = f; }
 private:
 	static WarningHandler	sWarningHandler;
@@ -178,7 +178,7 @@ private:
 				goto label;														\
 			}																	\
 		} while (0)
-	
+
 	#define XAssert(assertion)													\
 		do {																	\
 			if (!(assertion)) {													\
@@ -186,7 +186,7 @@ private:
 				__ASSERT_STOP;															\
 			}																	\
 		} while (0)
-	
+
 	#define XAssertNoError(error)												\
 		do {																	\
 			OSStatus __err = error;												\
@@ -271,7 +271,7 @@ private:
                   __LINE__);													\
           }																		\
       } while ( 0 )
-		
+
 #else
 	#define XThrowIfError(error, operation)										\
 		do {																	\
diff --git a/libs/appleutility/CoreAudio/PublicUtility/MatrixMixerVolumes.cpp b/libs/appleutility/CoreAudio/PublicUtility/MatrixMixerVolumes.cpp
index 98d868e..f3d106a 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/MatrixMixerVolumes.cpp
+++ b/libs/appleutility/CoreAudio/PublicUtility/MatrixMixerVolumes.cpp
@@ -2,14 +2,14 @@
      File: MatrixMixerVolumes.cpp
  Abstract: MatrixMixerVolumes.h
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #include "MatrixMixerVolumes.h"
 #include "CAXException.h"
@@ -59,9 +59,9 @@ OSStatus PrintBuses (FILE* file, const char* str, AudioUnit au, AudioUnitScope i
 	UInt32 busCount;
 	UInt32 theSize = sizeof(busCount);
 
-	ca_require_noerr (result = AudioUnitGetProperty (au, kAudioUnitProperty_ElementCount,	
+	ca_require_noerr (result = AudioUnitGetProperty (au, kAudioUnitProperty_ElementCount,
 							inScope, 0, &busCount, &theSize), home);
-		
+
 	fprintf (file, "\t%s Elements:\n\t\t", str);
 	for (UInt32 i = 0; i < busCount; ++i) {
 		Float32 val;
@@ -83,16 +83,16 @@ void	PrintMatrixMixerVolumes (FILE* file, AudioUnit au)
 	UInt32 theSize =  sizeof(UInt32) * 2;
 	Float32 *theVols = NULL;
 	OSStatus result;
-	
-// this call will fail if the unit is NOT initialized as it would present an incomplete state	
-	ca_require_noerr (result = AudioUnitGetProperty (au, kAudioUnitProperty_MatrixDimensions,	
+
+// this call will fail if the unit is NOT initialized as it would present an incomplete state
+	ca_require_noerr (result = AudioUnitGetProperty (au, kAudioUnitProperty_MatrixDimensions,
 							kAudioUnitScope_Global, 0, dims, &theSize), home);
 
 	theSize = ((dims[0] + 1) * (dims[1] + 1)) * sizeof(Float32);
-	
+
 	theVols	= static_cast<Float32*> (malloc (theSize));
-	
-	ca_require_noerr (result = AudioUnitGetProperty (au, kAudioUnitProperty_MatrixLevels,	
+
+	ca_require_noerr (result = AudioUnitGetProperty (au, kAudioUnitProperty_MatrixLevels,
 							kAudioUnitScope_Global, 0, theVols, &theSize), home);
 
 home:
@@ -101,9 +101,9 @@ home:
 			free(theVols);
 		return;
 	}
-	
+
 	theSize /= sizeof(Float32);
-	
+
 	unsigned int inputs = dims[0];
 	unsigned int outputs = dims[1];
 
@@ -114,7 +114,7 @@ home:
 	for (unsigned int i = 0; i < (inputs + 1); ++i) {
 		if (i < inputs) {
 			fprintf (file, "\t%.3f   ", theVols[(i + 1) * (outputs + 1) - 1]);
-			
+
 			for (unsigned int j = 0; j < outputs; ++j)
 				fprintf (file, "(%.3f) ", theVols[(i * (outputs  + 1)) + j]);
 		} else {
@@ -141,7 +141,7 @@ OSStatus	NumberChannels (AudioUnit 		 	au,
 	AudioStreamBasicDescription desc;
 	UInt32 dataSize = sizeof (AudioStreamBasicDescription);
 	OSStatus result = AudioUnitGetProperty (au, kAudioUnitProperty_StreamFormat,
-								inScope, inEl, 
+								inScope, inEl,
 								&desc, &dataSize);
 	if (!result)
 		outChans = desc.mChannelsPerFrame;
diff --git a/libs/appleutility/CoreAudio/PublicUtility/MatrixMixerVolumes.h b/libs/appleutility/CoreAudio/PublicUtility/MatrixMixerVolumes.h
index 06854f0..aa47ef0 100644
--- a/libs/appleutility/CoreAudio/PublicUtility/MatrixMixerVolumes.h
+++ b/libs/appleutility/CoreAudio/PublicUtility/MatrixMixerVolumes.h
@@ -2,14 +2,14 @@
      File: MatrixMixerVolumes.h
  Abstract: Part of CoreAudio Utility Classes
   Version: 1.1
- 
+
  Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
  Inc. ("Apple") in consideration of your agreement to the following
  terms, and your use, installation, modification or redistribution of
  this Apple software constitutes acceptance of these terms.  If you do
  not agree with these terms, please do not use, install, modify or
  redistribute this Apple software.
- 
+
  In consideration of your agreement to abide by the following terms, and
  subject to these terms, Apple grants you a personal, non-exclusive
  license, under Apple's copyrights in this original Apple software (the
@@ -25,13 +25,13 @@
  implied, are granted by Apple herein, including but not limited to any
  patent rights that may be infringed by your derivative works or by other
  works in which the Apple Software may be incorporated.
- 
+
  The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
  MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
  THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
  FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
  OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
- 
+
  IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
@@ -40,9 +40,9 @@
  AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
  STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
  POSSIBILITY OF SUCH DAMAGE.
- 
+
  Copyright (C) 2014 Apple Inc. All Rights Reserved.
- 
+
 */
 #ifndef __MatrixMixerVolumes_h__
 #define __MatrixMixerVolumes_h__
@@ -59,10 +59,10 @@ extern "C"
 #endif
 
 // prints the matrix mixer volumes of a specific audio unit to the given file
-void	 PrintMatrixMixerVolumes (FILE* file, AudioUnit au);				
+void	 PrintMatrixMixerVolumes (FILE* file, AudioUnit au);
 
 // prints the mixer volumes for the specific scope of the audio unit
-// results will be printed to the speficied file "file" with identifiying string tag "str"		
+// results will be printed to the speficied file "file" with identifiying string tag "str"
 OSStatus PrintBuses (FILE* file, char* str, AudioUnit au, AudioUnitScope inScope);
 #if defined(__cplusplus)
 }
diff --git a/libs/ardour/MSVClibardour/ardour.vcproj b/libs/ardour/MSVClibardour/ardour.vcproj
index 15caf97..8e03f65 100644
--- a/libs/ardour/MSVClibardour/ardour.vcproj
+++ b/libs/ardour/MSVClibardour/ardour.vcproj
@@ -41,8 +41,8 @@
 				Name="VCCLCompilerTool"
 				AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
 				Optimization="0"
-				AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\timecode;"..\..\midi++2";..\..\audiographer;"$(GenericIncludeFolder)\taglib";"$(GenericIncludeFolder)\taglib\toolkit";"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\glibmm";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor";"$(GenericIncludeFolder)\lilv-0";"$(GenericIncludeFolder)\suil-0";"$(GenericIncludeFolder)\serd-0";"$(GenericIncludeFolder)\sord-0";"$(GenericIncludeFolder)\lv2";"$(GenericIncludeFolder)\sratom-0""
-				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;DEBUGGABLE_BACKENDS;DEBUGGABLE_SCANNER_APP;BUILDING_LIBARDOUR;LIBARDOUR_DLL_EXPORTS;LIBARDOUR=\"mixbus3\";RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_DEBUG;DEBUG="Debug";ARCH_X86;USE_XMMINTRIN;ENABLE_NLS;PACKAGE="\"ardour3\"";PROGRAM_NAME="\"Mixbus\"";PROGRAM_VERSION="\"3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+				AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\lua;..\..\timecode;"..\..\midi++2";..\..\audiographer;"$(GenericIncludeFolder)\taglib";"$(GenericIncludeFolder)\taglib\toolkit";"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\glibmm";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor";"$(GenericIncludeFolder)\lilv-0";"$(GenericIncludeFolder)\suil-0";"$(GenericIncludeFolder)\serd-0";"$(GenericIncludeFolder)\sord-0";"$(GenericIncludeFolder)\lv2";"$(GenericIncludeFolder)\sratom-0""
+				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;DEBUGGABLE_BACKENDS;DEBUGGABLE_SCANNER_APP;BUILDING_LIBARDOUR;LIBARDOUR_DLL_EXPORTS;LIBARDOUR=\"mixbus3\";RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_DEBUG;DEBUG="Debug";ARCH_X86;USE_XMMINTRIN;ENABLE_NLS;PACKAGE="\"ardour3\"";PROGRAM_NAME="\"Mixbus\"";PROGRAM_VERSION="\"3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;LV2_EXTENDED=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
 				MinimalRebuild="true"
 				RuntimeLibrary="3"
 				WarningLevel="3"
@@ -60,7 +60,7 @@
 			/>
 			<Tool
 				Name="VCLinkerTool"
-				AdditionalDependencies="libfftw3-3.lib libfftw3f-3.lib libfftw3l-3.lib libeay32.lib iconvD.lib zlib1D.lib boost-regex32D.lib $(DllPrefix)atkmm32$(AtkmmDllSuffix)D.lib $(DllPrefix)gtkmm32$(GtkmmDllSuffix)D.lib $(DllPrefix)gdkmm32$(GtkmmDllSuffix)D.lib $(DllPrefix)glibmm32$(GlibmmDllSuffix)D.lib $(DllPrefix)giomm32$(GlibmmDllSuffix)D.lib $(DllPrefix)cairomm32$(CairommDllSuffix)D.lib $(DllPrefix)pangomm32$(PangommDllSuffix)D.lib pthreadVCE2.lib $(DllPrefix)pango32$(PangoDllSuffix)D.lib $(DllPrefix)pangoft232$(PangoDllSuffix)D.lib $(DllPrefix)pangowin32$(PangoDllSuffix)D.lib $(DllPrefix)pangocairo32$(PangoDllSuffix)D.lib $(DllPrefix)cairo32$(CairoDllSuffix)D.lib $(DllPrefix)atk32$(AtkDllSuffix)D.lib $(DllPrefix)gthread32$(GlibDllSuffix)D.lib $(DllPrefix)gobject32$(GlibDllSuffix)D.lib $(DllPrefix)gmodule32$(GlibDllSuffix)D.lib $(DllPrefix)glib32$(GlibDllSuffix)D.lib $(DllPrefix)gio32$(GlibDllSuffix)D.lib $(DllPrefix)gtk32$(GtkDllSuffix)D.lib $(DllPrefix)gdk32$(GtkDllSuffix)D.lib $(DllPrefix)gdk-pixbuf32$(GdkPixbufDllSuffix)D.lib $(DllPrefix)sigc++32-2.0D.lib $(DllPrefix)curlD.lib $(DllPrefix)fontconfigD.lib $(DllPrefix)timecode32D.lib $(DllPrefix)taglib32D.lib freetype32-2D.lib raptor2D.lib lrdfD.lib libloD.lib rubberbandD.lib $(DllPrefix)ltcD.lib $(DllPrefix)audiographer32D.lib $(DllPrefix)pbd32D.lib $(DllPrefix)midi++32D.lib $(DllPrefix)evoral32D.lib $(DllPrefix)sndfile-1D.lib $(DllPrefix)samplerate-0D.lib vampsdkD.lib vamphostsdkD.lib $(DllPrefix)lilv32-0D.lib $(DllPrefix)suil32-0D.lib $(DllPrefix)serd32-0D.lib $(DllPrefix)sord32-0D.lib $(DllPrefix)sratom32-0D.lib libart_lgpl_2D.lib libjackD.lib libxml2D.lib intlD.lib shell32.lib psapi.lib ws2_32.lib winmm.lib"
+				AdditionalDependencies="libfftw3-3.lib libfftw3f-3.lib libfftw3l-3.lib libeay32.lib iconvD.lib zlib1D.lib boost-regex32D.lib $(DllPrefix)atkmm32$(AtkmmDllSuffix)D.lib $(DllPrefix)gtkmm32$(GtkmmDllSuffix)D.lib $(DllPrefix)gdkmm32$(GtkmmDllSuffix)D.lib $(DllPrefix)glibmm32$(GlibmmDllSuffix)D.lib $(DllPrefix)giomm32$(GlibmmDllSuffix)D.lib $(DllPrefix)cairomm32$(CairommDllSuffix)D.lib $(DllPrefix)pangomm32$(PangommDllSuffix)D.lib pthreadVCE2.lib $(DllPrefix)pango32$(PangoDllSuffix)D.lib $(DllPrefix)pangoft232$(PangoDllSuffix)D.lib $(DllPrefix)pangowin32$(PangoDllSuffix)D.lib $(DllPrefix)pangocairo32$(PangoDllSuffix)D.lib $(DllPrefix)cairo32$(CairoDllSuffix)D.lib $(DllPrefix)atk32$(AtkDllSuffix)D.lib $(DllPrefix)gthread32$(GlibDllSuffix)D.lib $(DllPrefix)gobject32$(GlibDllSuffix)D.lib $(DllPrefix)gmodule32$(GlibDllSuffix)D.lib $(DllPrefix)glib32$(GlibDllSuffix)D.lib $(DllPrefix)gio32$(GlibDllSuffix)D.lib $(DllPrefix)gtk32$(GtkDllSuffix)D.lib $(DllPrefix)gdk32$(GtkDllSuffix)D.lib $(DllPrefix)gdk-pixbuf32$(GdkPixbufDllSuffix)D.lib $(DllPrefix)sigc++32-2.0D.lib $(DllPrefix)curlD.lib $(DllPrefix)fontconfigD.lib $(DllPrefix)timecode32D.lib $(DllPrefix)taglib32D.lib freetype32-2D.lib raptor2D.lib lrdfD.lib libloD.lib rubberbandD.lib $(DllPrefix)ltcD.lib $(DllPrefix)lua32D.lib $(DllPrefix)audiographer32D.lib $(DllPrefix)pbd32D.lib $(DllPrefix)midi++32D.lib $(DllPrefix)evoral32D.lib $(DllPrefix)sndfile-1D.lib $(DllPrefix)samplerate-0D.lib vampsdkD.lib vamphostsdkD.lib $(DllPrefix)lilv32-0D.lib $(DllPrefix)suil32-0D.lib $(DllPrefix)serd32-0D.lib $(DllPrefix)sord32-0D.lib $(DllPrefix)sratom32-0D.lib libart_lgpl_2D.lib libjackD.lib libxml2D.lib intlD.lib shell32.lib psapi.lib iphlpapi.lib ws2_32.lib winmm.lib"
 				OutputFile="$(OutDir)\$(DllPrefix)$(ProjectName)32D.dll"
 				AdditionalLibraryDirectories="F:\pthread-win32\Pre-built.2\lib"
 				IgnoreDefaultLibraryNames="libboost_regex-vc80-mt-gd-1_40.lib;msvcrt.lib;dsound.lib"
@@ -123,8 +123,8 @@
 				AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
 				Optimization="2"
 				InlineFunctionExpansion="1"
-				AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\timecode;"..\..\midi++2";..\..\audiographer;"$(GenericIncludeFolder)\taglib";"$(GenericIncludeFolder)\taglib\toolkit";"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\glibmm";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor";"$(GenericIncludeFolder)\lilv-0";"$(GenericIncludeFolder)\suil-0";"$(GenericIncludeFolder)\serd-0";"$(GenericIncludeFolder)\sord-0";"$(GenericIncludeFolder)\lv2";"$(GenericIncludeFolder)\sratom-0""
-				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_LIBARDOUR;LIBARDOUR_DLL_EXPORTS;LIBARDOUR=\"mixbus3\";RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;NDEBUG;ARCH_X86;USE_XMMINTRIN;ENABLE_NLS;PACKAGE="\"ardour3\"";PROGRAM_NAME="\"Mixbus\"";PROGRAM_VERSION="\"3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+				AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\lua;..\..\timecode;"..\..\midi++2";..\..\audiographer;"$(GenericIncludeFolder)\taglib";"$(GenericIncludeFolder)\taglib\toolkit";"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\glibmm";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor";"$(GenericIncludeFolder)\lilv-0";"$(GenericIncludeFolder)\suil-0";"$(GenericIncludeFolder)\serd-0";"$(GenericIncludeFolder)\sord-0";"$(GenericIncludeFolder)\lv2";"$(GenericIncludeFolder)\sratom-0";..\.."
+				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_LIBARDOUR;LIBARDOUR_DLL_EXPORTS;LIBARDOUR=\"mixbus3\";RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;NDEBUG;ARCH_X86;USE_XMMINTRIN;ENABLE_NLS;PACKAGE="\"ardour3\"";PROGRAM_NAME="\"Mixbus\"";PROGRAM_VERSION="\"3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;LV2_EXTENDED=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
 				StringPooling="false"
 				RuntimeLibrary="2"
 				EnableEnhancedInstructionSet="1"
@@ -142,7 +142,7 @@
 			/>
 			<Tool
 				Name="VCLinkerTool"
-				AdditionalDependencies="libfftw3-3.lib libfftw3f-3.lib libfftw3l-3.lib libeay32.lib iconv.lib zlib1.lib boost-regex32.lib $(DllPrefix)atkmm32$(AtkmmDllSuffix).lib $(DllPrefix)gtkmm32$(GtkmmDllSuffix).lib $(DllPrefix)gdkmm32$(GtkmmDllSuffix).lib $(DllPrefix)glibmm32$(GlibmmDllSuffix).lib $(DllPrefix)giomm32$(GlibmmDllSuffix).lib $(DllPrefix)cairomm32$(CairommDllSuffix).lib $(DllPrefix)pangomm32$(PangommDllSuffix).lib pthreadVCE2.lib $(DllPrefix)pango32$(PangoDllSuffix).lib $(DllPrefix)pangoft232$(PangoDllSuffix).lib $(DllPrefix)pangowin32$(PangoDllSuffix).lib $(DllPrefix)pangocairo32$(PangoDllSuffix).lib $(DllPrefix)cairo32$(CairoDllSuffix).lib $(DllPrefix)atk32$(AtkDllSuffix).lib $(DllPrefix)gthread32$(GlibDllSuffix).lib $(DllPrefix)gobject32$(GlibDllSuffix).lib $(DllPrefix)gmodule32$(GlibDllSuffix).lib $(DllPrefix)glib32$(GlibDllSuffix).lib $(DllPrefix)gio32$(GlibDllSuffix).lib $(DllPrefix)gtk32$(GtkDllSuffix).lib $(DllPrefix)gdk32$(GtkDllSuffix).lib $(DllPrefix)gdk-pixbuf32$(GdkPixbufDllSuffix).lib $(DllPrefix)sigc++32-2.0.lib $(DllPrefix)curl.lib $(DllPrefix)fontconfig.lib $(DllPrefix)timecode32.lib $(DllPrefix)taglib32.lib freetype32-2.lib raptor2.lib lrdf.lib liblo.lib rubberband.lib $(DllPrefix)ltc.lib $(DllPrefix)audiographer32.lib $(DllPrefix)pbd32.lib $(DllPrefix)midi++32.lib $(DllPrefix)evoral32.lib $(DllPrefix)sndfile-1.lib $(DllPrefix)samplerate-0.lib vampsdk.lib vamphostsdk.lib $(DllPrefix)lilv32-0.lib $(DllPrefix)suil32-0.lib $(DllPrefix)serd32-0.lib $(DllPrefix)sord32-0.lib $(DllPrefix)sratom32-0.lib libart_lgpl_2.lib libjack.lib libxml2.lib intl.lib shell32.lib psapi.lib ws2_32.lib winmm.lib"
+				AdditionalDependencies="libfftw3-3.lib libfftw3f-3.lib libfftw3l-3.lib libeay32.lib iconv.lib zlib1.lib boost-regex32.lib $(DllPrefix)atkmm32$(AtkmmDllSuffix).lib $(DllPrefix)gtkmm32$(GtkmmDllSuffix).lib $(DllPrefix)gdkmm32$(GtkmmDllSuffix).lib $(DllPrefix)glibmm32$(GlibmmDllSuffix).lib $(DllPrefix)giomm32$(GlibmmDllSuffix).lib $(DllPrefix)cairomm32$(CairommDllSuffix).lib $(DllPrefix)pangomm32$(PangommDllSuffix).lib pthreadVCE2.lib $(DllPrefix)pango32$(PangoDllSuffix).lib $(DllPrefix)pangoft232$(PangoDllSuffix).lib $(DllPrefix)pangowin32$(PangoDllSuffix).lib $(DllPrefix)pangocairo32$(PangoDllSuffix).lib $(DllPrefix)cairo32$(CairoDllSuffix).lib $(DllPrefix)atk32$(AtkDllSuffix).lib $(DllPrefix)gthread32$(GlibDllSuffix).lib $(DllPrefix)gobject32$(GlibDllSuffix).lib $(DllPrefix)gmodule32$(GlibDllSuffix).lib $(DllPrefix)glib32$(GlibDllSuffix).lib $(DllPrefix)gio32$(GlibDllSuffix).lib $(DllPrefix)gtk32$(GtkDllSuffix).lib $(DllPrefix)gdk32$(GtkDllSuffix).lib $(DllPrefix)gdk-pixbuf32$(GdkPixbufDllSuffix).lib $(DllPrefix)sigc++32-2.0.lib $(DllPrefix)curl.lib $(DllPrefix)fontconfig.lib $(DllPrefix)timecode32.lib $(DllPrefix)taglib32.lib freetype32-2.lib raptor2.lib lrdf.lib liblo.lib rubberband.lib $(DllPrefix)ltc.lib $(DllPrefix)lua32.lib $(DllPrefix)audiographer32.lib $(DllPrefix)pbd32.lib $(DllPrefix)midi++32.lib $(DllPrefix)evoral32.lib $(DllPrefix)sndfile-1.lib $(DllPrefix)samplerate-0.lib vampsdk.lib vamphostsdk.lib $(DllPrefix)lilv32-0.lib $(DllPrefix)suil32-0.lib $(DllPrefix)serd32-0.lib $(DllPrefix)sord32-0.lib $(DllPrefix)sratom32-0.lib libart_lgpl_2.lib libjack.lib libxml2.lib intl.lib shell32.lib psapi.lib iphlpapi.lib ws2_32.lib winmm.lib"
 				OutputFile="$(OutDir)\$(DllPrefix)$(ProjectName)32.dll"
 				AdditionalLibraryDirectories="F:\pthread-win32\Pre-built.2\lib"
 				IgnoreDefaultLibraryNames="libboost_regex-vc80-mt-gd-1_40.lib;dsound.lib"
@@ -204,8 +204,8 @@
 				Name="VCCLCompilerTool"
 				AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
 				Optimization="0"
-				AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\timecode;"..\..\midi++2";..\..\audiographer;"$(GenericIncludeFolder)\taglib";"$(GenericIncludeFolder)\taglib\toolkit";"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\glibmm";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor";"$(GenericIncludeFolder)\lilv-0";"$(GenericIncludeFolder)\suil-0";"$(GenericIncludeFolder)\serd-0";"$(GenericIncludeFolder)\sord-0";"$(GenericIncludeFolder)\lv2";"$(GenericIncludeFolder)\sratom-0""
-				PreprocessorDefinitions="PLATFORM_WINDOWS;DEBUGGABLE_BACKENDS;DEBUGGABLE_SCANNER_APP;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_LIBARDOUR;LIBARDOUR_DLL_EXPORTS;LIBARDOUR=\"mixbus3\";RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;ARCH_X86;USE_XMMINTRIN;ENABLE_NLS;PACKAGE="\"ardour3\"";PROGRAM_NAME="\"Mixbus\"";PROGRAM_VERSION="\"3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+				AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\lua;..\..\timecode;"..\..\midi++2";..\..\audiographer;"$(GenericIncludeFolder)\taglib";"$(GenericIncludeFolder)\taglib\toolkit";"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\glibmm";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor";"$(GenericIncludeFolder)\lilv-0";"$(GenericIncludeFolder)\suil-0";"$(GenericIncludeFolder)\serd-0";"$(GenericIncludeFolder)\sord-0";"$(GenericIncludeFolder)\lv2";"$(GenericIncludeFolder)\sratom-0";..\.."
+				PreprocessorDefinitions="PLATFORM_WINDOWS;DEBUGGABLE_BACKENDS;DEBUGGABLE_SCANNER_APP;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_LIBARDOUR;LIBARDOUR_DLL_EXPORTS;LIBARDOUR=\"mixbus3\";RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;ARCH_X86;USE_XMMINTRIN;ENABLE_NLS;PACKAGE="\"ardour3\"";PROGRAM_NAME="\"Mixbus\"";PROGRAM_VERSION="\"3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;LV2_EXTENDED=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
 				StringPooling="false"
 				RuntimeLibrary="2"
 				EnableEnhancedInstructionSet="1"
@@ -224,7 +224,7 @@
 			/>
 			<Tool
 				Name="VCLinkerTool"
-				AdditionalDependencies="libfftw3-3.lib libfftw3f-3.lib libfftw3l-3.lib libeay32.lib iconvRDC.lib zlib1RDC.lib boost-regex32RDC.lib $(DllPrefix)atkmm32$(AtkmmDllSuffix)RDC.lib $(DllPrefix)gtkmm32$(GtkmmDllSuffix)RDC.lib $(DllPrefix)gdkmm32$(GtkmmDllSuffix)RDC.lib $(DllPrefix)glibmm32$(GlibmmDllSuffix)RDC.lib $(DllPrefix)giomm32$(GlibmmDllSuffix)RDC.lib $(DllPrefix)cairomm32$(CairommDllSuffix)RDC.lib $(DllPrefix)pangomm32$(PangommDllSuffix)RDC.lib pthreadVCE2.lib $(DllPrefix)pango32$(PangoDllSuffix)RDC.lib $(DllPrefix)pangoft232$(PangoDllSuffix)RDC.lib $(DllPrefix)pangowin32$(PangoDllSuffix)RDC.lib $(DllPrefix)pangocairo32$(PangoDllSuffix)RDC.lib $(DllPrefix)cairo32$(CairoDllSuffix)RDC.lib $(DllPrefix)atk32$(AtkDllSuffix)RDC.lib $(DllPrefix)gthread32$(GlibDllSuffix)RDC.lib $(DllPrefix)gobject32$(GlibDllSuffix)RDC.lib $(DllPrefix)gmodule32$(GlibDllSuffix)RDC.lib $(DllPrefix)glib32$(GlibDllSuffix)RDC.lib $(DllPrefix)gio32$(GlibDllSuffix)RDC.lib $(DllPrefix)gtk32$(GtkDllSuffix)RDC.lib $(DllPrefix)gdk32$(GtkDllSuffix)RDC.lib $(DllPrefix)gdk-pixbuf32$(GdkPixbufDllSuffix)RDC.lib $(DllPrefix)sigc++32-2.0RDC.lib $(DllPrefix)curlRDC.lib $(DllPrefix)fontconfigRDC.lib $(DllPrefix)timecode32RDC.lib $(DllPrefix)taglib32RDC.lib freetype32-2RDC.lib raptor2.lib lrdf.lib libloRDC.lib rubberbandRDC.lib $(DllPrefix)ltcRDC.lib $(DllPrefix)audiographer32RDC.lib $(DllPrefix)pbd32RDC.lib $(DllPrefix)midi++32RDC.lib $(DllPrefix)evoral32RDC.lib $(DllPrefix)sndfile-1.lib $(DllPrefix)samplerate-0.lib vampsdkRDC.lib vamphostsdkRDC.lib $(DllPrefix)lilv32-0RDC.lib $(DllPrefix)suil32-0RDC.lib $(DllPrefix)serd32-0RDC.lib $(DllPrefix)sord32-0RDC.lib $(DllPrefix)sratom32-0RDC.lib libart_lgpl_2.lib libjack.lib libxml2.lib intlRDC.lib shell32.lib psapi.lib ws2_32.lib winmm.lib"
+				AdditionalDependencies="libfftw3-3.lib libfftw3f-3.lib libfftw3l-3.lib libeay32.lib iconvRDC.lib zlib1RDC.lib boost-regex32RDC.lib $(DllPrefix)atkmm32$(AtkmmDllSuffix)RDC.lib $(DllPrefix)gtkmm32$(GtkmmDllSuffix)RDC.lib $(DllPrefix)gdkmm32$(GtkmmDllSuffix)RDC.lib $(DllPrefix)glibmm32$(GlibmmDllSuffix)RDC.lib $(DllPrefix)giomm32$(GlibmmDllSuffix)RDC.lib $(DllPrefix)cairomm32$(CairommDllSuffix)RDC.lib $(DllPrefix)pangomm32$(PangommDllSuffix)RDC.lib pthreadVCE2.lib $(DllPrefix)pango32$(PangoDllSuffix)RDC.lib $(DllPrefix)pangoft232$(PangoDllSuffix)RDC.lib $(DllPrefix)pangowin32$(PangoDllSuffix)RDC.lib $(DllPrefix)pangocairo32$(PangoDllSuffix)RDC.lib $(DllPrefix)cairo32$(CairoDllSuffix)RDC.lib $(DllPrefix)atk32$(AtkDllSuffix)RDC.lib $(DllPrefix)gthread32$(GlibDllSuffix)RDC.lib $(DllPrefix)gobject32$(GlibDllSuffix)RDC.lib $(DllPrefix)gmodule32$(GlibDllSuffix)RDC.lib $(DllPrefix)glib32$(GlibDllSuffix)RDC.lib $(DllPrefix)gio32$(GlibDllSuffix)RDC.lib $(DllPrefix)gtk32$(GtkDllSuffix)RDC.lib $(DllPrefix)gdk32$(GtkDllSuffix)RDC.lib $(DllPrefix)gdk-pixbuf32$(GdkPixbufDllSuffix)RDC.lib $(DllPrefix)sigc++32-2.0RDC.lib $(DllPrefix)curlRDC.lib $(DllPrefix)fontconfigRDC.lib $(DllPrefix)timecode32RDC.lib $(DllPrefix)taglib32RDC.lib freetype32-2RDC.lib raptor2.lib lrdf.lib libloRDC.lib rubberbandRDC.lib $(DllPrefix)ltcRDC.lib $(DllPrefix)lua32RDC.lib $(DllPrefix)audiographer32RDC.lib $(DllPrefix)pbd32RDC.lib $(DllPrefix)midi++32RDC.lib $(DllPrefix)evoral32RDC.lib $(DllPrefix)sndfile-1.lib $(DllPrefix)samplerate-0.lib vampsdkRDC.lib vamphostsdkRDC.lib $(DllPrefix)lilv32-0RDC.lib $(DllPrefix)suil32-0RDC.lib $(DllPrefix)serd32-0RDC.lib $(DllPrefix)sord32-0RDC.lib $(DllPrefix)sratom32-0RDC.lib libart_lgpl_2.lib libjack.lib libxml2.lib intlRDC.lib shell32.lib psapi.lib iphlpapi.lib ws2_32.lib winmm.lib"
 				OutputFile="$(OutDir)\$(DllPrefix)$(ProjectName)32RDC.dll"
 				AdditionalLibraryDirectories="F:\pthread-win32\Pre-built.2\lib"
 				IgnoreDefaultLibraryNames="libboost_regex-vc80-mt-gd-1_40.lib;dsound.lib"
@@ -284,6 +284,10 @@
 				>
 			</File>
 			<File
+				RelativePath="..\analysis_graph.cc"
+				>
+			</File>
+			<File
 				RelativePath="..\async_midi_port.cc"
 				>
 			</File>
@@ -424,10 +428,18 @@
 				>
 			</File>
 			<File
+				RelativePath="..\control_group.cc"
+				>
+			</File>
+			<File
 				RelativePath="..\control_protocol_manager.cc"
 				>
 			</File>
 			<File
+				RelativePath="..\controllable_descriptor.cc"
+				>
+			</File>
+			<File
 				RelativePath="..\cycle_timer.cc"
 				>
 			</File>
@@ -460,6 +472,10 @@
 				>
 			</File>
 			<File
+				RelativePath="..\dsp_filter.cc"
+				>
+			</File>
+			<File
 				RelativePath="..\ebur128_analysis.cc"
 				>
 			</File>
@@ -560,6 +576,10 @@
 				>
 			</File>
 			<File
+				RelativePath="..\fixed_delay.cc"
+				>
+			</File>
+			<File
 				RelativePath="..\gain_control.cc"
 				>
 			</File>
@@ -640,6 +660,22 @@
 				>
 			</File>
 			<File
+				RelativePath="..\lua_api.cc"
+				>
+			</File>
+			<File
+				RelativePath="..\luabindings.cc"
+				>
+			</File>
+			<File
+				RelativePath="..\luaproc.cc"
+				>
+			</File>
+			<File
+				RelativePath="..\luascripting.cc"
+				>
+			</File>
+			<File
 				RelativePath="..\lv2_evbuf.c"
 				>
 			</File>
@@ -740,6 +776,10 @@
 				>
 			</File>
 			<File
+				RelativePath="..\monitor_control.cc"
+				>
+			</File>
+			<File
 				RelativePath="..\monitor_processor.cc"
 				>
 			</File>
@@ -752,10 +792,18 @@
 				>
 			</File>
 			<File
+				RelativePath="..\mute_control.cc"
+				>
+			</File>
+			<File
 				RelativePath="..\mute_master.cc"
 				>
 			</File>
 			<File
+				RelativePath="..\muteable.cc"
+				>
+			</File>
+			<File
 				RelativePath="..\note_fixer.cc"
 				>
 			</File>
@@ -796,6 +844,10 @@
 				>
 			</File>
 			<File
+				RelativePath="..\phase_control.cc"
+				>
+			</File>
+			<File
 				RelativePath="..\playlist.cc"
 				>
 			</File>
@@ -836,6 +888,10 @@
 				>
 			</File>
 			<File
+				RelativePath="..\presentation_info.cc"
+				>
+			</File>
+			<File
 				RelativePath="..\process_thread.cc"
 				>
 			</File>
@@ -864,6 +920,14 @@
 				>
 			</File>
 			<File
+				RelativePath="..\record_enable_control.cc"
+				>
+			</File>
+			<File
+				RelativePath="..\record_safe_control.cc"
+				>
+			</File>
+			<File
 				RelativePath="..\region.cc"
 				>
 			</File>
@@ -892,10 +956,6 @@
 				>
 			</File>
 			<File
-				RelativePath="..\route_controls.cc"
-				>
-			</File>
-			<File
 				RelativePath="..\route_graph.cc"
 				>
 			</File>
@@ -1188,6 +1248,18 @@
 				>
 			</File>
 			<File
+				RelativePath="..\sidechain.cc"
+				>
+			</File>
+			<File
+				RelativePath="..\slavable.cc"
+				>
+			</File>
+			<File
+				RelativePath="..\slavable_automation_control.cc"
+				>
+			</File>
+			<File
 				RelativePath="..\slave.cc"
 				>
 			</File>
@@ -1208,6 +1280,18 @@
 				>
 			</File>
 			<File
+				RelativePath="..\solo_control.cc"
+				>
+			</File>
+			<File
+				RelativePath="..\solo_isolate_control.cc"
+				>
+			</File>
+			<File
+				RelativePath="..\solo_safe_control.cc"
+				>
+			</File>
+			<File
 				RelativePath="..\soundcloud_upload.cc"
 				>
 			</File>
@@ -1236,6 +1320,10 @@
 				>
 			</File>
 			<File
+				RelativePath="..\stripable.cc"
+				>
+			</File>
+			<File
 				RelativePath="..\system_exec.cc"
 				>
 			</File>
@@ -1296,6 +1384,14 @@
 				>
 			</File>
 			<File
+				RelativePath="..\vca.cc"
+				>
+			</File>
+			<File
+				RelativePath="..\vca_manager.cc"
+				>
+			</File>
+			<File
 				RelativePath="..\version.cc"
 				>
 			</File>
@@ -1346,6 +1442,10 @@
 				>
 			</File>
 			<File
+				RelativePath="..\ardour\analysis_graph.h"
+				>
+			</File>
+			<File
 				RelativePath="..\ardour\ardour.h"
 				>
 			</File>
@@ -1458,6 +1558,10 @@
 				>
 			</File>
 			<File
+				RelativePath="..\ardour\boost_debug.h"
+				>
+			</File>
+			<File
 				RelativePath="..\ardour\broadcast_info.h"
 				>
 			</File>
@@ -1506,10 +1610,18 @@
 				>
 			</File>
 			<File
+				RelativePath="..\ardour\control_group_member.h"
+				>
+			</File>
+			<File
 				RelativePath="..\ardour\control_protocol_manager.h"
 				>
 			</File>
 			<File
+				RelativePath="..\ardour\controllable_descriptor.h"
+				>
+			</File>
+			<File
 				RelativePath="..\ardour\coreaudiosource.h"
 				>
 			</File>
@@ -1550,6 +1662,10 @@
 				>
 			</File>
 			<File
+				RelativePath="..\ardour\dsp_filter.h"
+				>
+			</File>
+			<File
 				RelativePath="..\ardour\dsp_load_calculator.h"
 				>
 			</File>
@@ -1662,6 +1778,10 @@
 				>
 			</File>
 			<File
+				RelativePath="..\ardour\fixed_delay.h"
+				>
+			</File>
+			<File
 				RelativePath="..\ardour\gain_control.h"
 				>
 			</File>
@@ -1718,6 +1838,10 @@
 				>
 			</File>
 			<File
+				RelativePath="..\ardour\io_vector.h"
+				>
+			</File>
+			<File
 				RelativePath="..\ardour\kmeterdsp.h"
 				>
 			</File>
@@ -1754,6 +1878,30 @@
 				>
 			</File>
 			<File
+				RelativePath="..\ardour\lua_api.h"
+				>
+			</File>
+			<File
+				RelativePath="..\ardour\lua_script_params.h"
+				>
+			</File>
+			<File
+				RelativePath="..\ardour\luabindings.h"
+				>
+			</File>
+			<File
+				RelativePath="..\ardour\luaproc.h"
+				>
+			</File>
+			<File
+				RelativePath="..\ardour\luascripting.h"
+				>
+			</File>
+			<File
+				RelativePath="..\ardour\lv2_extensions.h"
+				>
+			</File>
+			<File
 				RelativePath="..\ardour\lv2_plugin.h"
 				>
 			</File>
@@ -1974,6 +2122,10 @@
 				>
 			</File>
 			<File
+				RelativePath="..\ardour\presentation_info.h"
+				>
+			</File>
+			<File
 				RelativePath="..\ardour\process_thread.h"
 				>
 			</File>
@@ -2022,6 +2174,10 @@
 				>
 			</File>
 			<File
+				RelativePath="..\ardour\record_safe_control.h"
+				>
+			</File>
+			<File
 				RelativePath="..\ardour\region.h"
 				>
 			</File>
@@ -2070,10 +2226,6 @@
 				>
 			</File>
 			<File
-				RelativePath="..\ardour\route_sorters.h"
-				>
-			</File>
-			<File
 				RelativePath="..\ardour\runtime_functions.h"
 				>
 			</File>
@@ -2146,10 +2298,22 @@
 				>
 			</File>
 			<File
+				RelativePath="..\ardour\sidechain.h"
+				>
+			</File>
+			<File
 				RelativePath="..\ardour\silentfilesource.h"
 				>
 			</File>
 			<File
+				RelativePath="..\ardour\slavable.h"
+				>
+			</File>
+			<File
+				RelativePath="..\ardour\slavable_automation_control.h"
+				>
+			</File>
+			<File
 				RelativePath="..\ardour\slave.h"
 				>
 			</File>
@@ -2210,6 +2374,10 @@
 				>
 			</File>
 			<File
+				RelativePath="..\ardour\stripable.h"
+				>
+			</File>
+			<File
 				RelativePath="..\ardour\system_exec.h"
 				>
 			</File>
@@ -2298,6 +2466,14 @@
 				>
 			</File>
 			<File
+				RelativePath="..\ardour\vca.h"
+				>
+			</File>
+			<File
+				RelativePath="..\ardour\vca_manager.h"
+				>
+			</File>
+			<File
 				RelativePath="..\ardour\vst_plugin.h"
 				>
 			</File>
@@ -2324,7 +2500,7 @@
 			UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
 			>
 			<File
-				RelativePath="..\..\..\icons\win32\msvc_resources.rc"
+				RelativePath="..\..\..\gtk2_ardour\win32\msvc_resources.rc"
 				>
 			</File>
 		</Filter>
diff --git a/libs/ardour/amp.cc b/libs/ardour/amp.cc
index d5b9f56..d86362a 100644
--- a/libs/ardour/amp.cc
+++ b/libs/ardour/amp.cc
@@ -31,7 +31,7 @@
 #include "ardour/rc_configuration.h"
 #include "ardour/session.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 using namespace PBD;
@@ -71,7 +71,7 @@ Amp::configure_io (ChanCount in, ChanCount out)
 }
 
 void
-Amp::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end_frame*/, pframes_t nframes, bool)
+Amp::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end_frame*/, double /*speed*/, pframes_t nframes, bool)
 {
 	if (!_active && !_pending_active) {
 		return;
@@ -118,7 +118,7 @@ Amp::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end_frame*/,
 
 		} else { /* manual (scalar) gain */
 
-			gain_t const dg = _gain_control->user_double();
+			gain_t const dg = _gain_control->get_value();
 
 			if (_current_gain != dg) {
 
@@ -388,7 +388,7 @@ Amp::setup_gain_automation (framepos_t start_frame, framepos_t end_frame, framec
 		assert (_gain_automation_buffer);
 		_apply_gain_automation = _gain_control->list()->curve().rt_safe_get_vector (
 			start_frame, end_frame, _gain_automation_buffer, nframes);
-		if (start_frame != _current_automation_frame) {
+		if (start_frame != _current_automation_frame && _session.bounce_processing ()) {
 			_current_gain = _gain_automation_buffer[0];
 		}
 		_current_automation_frame = end_frame;
@@ -405,7 +405,7 @@ Amp::visible() const
 }
 
 std::string
-Amp::value_as_string (boost::shared_ptr<AutomationControl> ac) const
+Amp::value_as_string (boost::shared_ptr<const AutomationControl> ac) const
 {
 	if (ac == _gain_control) {
 		char buffer[32];
diff --git a/libs/ardour/analyser.cc b/libs/ardour/analyser.cc
index 58a8f30..457291f 100644
--- a/libs/ardour/analyser.cc
+++ b/libs/ardour/analyser.cc
@@ -19,12 +19,13 @@
 
 #include "ardour/analyser.h"
 #include "ardour/audiofilesource.h"
+#include "ardour/rc_configuration.h"
 #include "ardour/session_event.h"
 #include "ardour/transient_detector.h"
 
 #include "pbd/compose.h"
 #include "pbd/error.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
@@ -110,6 +111,7 @@ Analyser::analyse_audio_file_source (boost::shared_ptr<AudioFileSource> src)
 
 	try {
 		TransientDetector td (src->sample_rate());
+		td.set_sensitivity (3, Config->get_transient_sensitivity()); // "General purpose"
 		if (td.run (src->get_transients_path(), src.get(), 0, results) == 0) {
 			src->set_been_analysed (true);
 		} else {
diff --git a/libs/ardour/analysis_graph.cc b/libs/ardour/analysis_graph.cc
new file mode 100644
index 0000000..a1e8807
--- /dev/null
+++ b/libs/ardour/analysis_graph.cc
@@ -0,0 +1,148 @@
+/*
+ * Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+
+
+#include "ardour/analysis_graph.h"
+#include "ardour/route.h"
+#include "ardour/session.h"
+
+#include "timecode/time.h"
+
+#include "audiographer/process_context.h"
+#include "audiographer/general/chunker.h"
+#include "audiographer/general/interleaver.h"
+#include "audiographer/general/analyser.h"
+#include "audiographer/general/peak_reader.h"
+
+#include "pbd/i18n.h"
+
+using namespace ARDOUR;
+using namespace AudioGrapher;
+
+AnalysisGraph::AnalysisGraph (Session *s)
+	: _session (s)
+	, _max_chunksize (8192)
+	, _frames_read (0)
+	, _frames_end (0)
+	, _canceled (false)
+{
+	_buf     = (Sample *) malloc(sizeof(Sample) * _max_chunksize);
+	_mixbuf  = (Sample *) malloc(sizeof(Sample) * _max_chunksize);
+	_gainbuf = (float *)  malloc(sizeof(float)  * _max_chunksize);
+}
+
+AnalysisGraph::~AnalysisGraph ()
+{
+	free (_buf);
+	free (_mixbuf);
+	free (_gainbuf);
+}
+
+void
+AnalysisGraph::analyze_region (boost::shared_ptr<AudioRegion> region)
+{
+	interleaver.reset (new Interleaver<Sample> ());
+	interleaver->init (region->n_channels(), _max_chunksize);
+	chunker.reset (new Chunker<Sample> (_max_chunksize));
+	analyser.reset (new Analyser (
+				_session->nominal_frame_rate(),
+				region->n_channels(),
+				_max_chunksize,
+				region->length()));
+
+	interleaver->add_output(chunker);
+	chunker->add_output (analyser);
+
+	framecnt_t x = 0;
+	framecnt_t length = region->length();
+	while (x < length) {
+		framecnt_t chunk = std::min (_max_chunksize, length - x);
+		framecnt_t n = 0;
+		for (unsigned int channel = 0; channel < region->n_channels(); ++channel) {
+			memset (_buf, 0, chunk * sizeof (Sample));
+			n = region->read_at (_buf, _mixbuf, _gainbuf, region->position() + x, chunk, channel);
+			ConstProcessContext<Sample> context (_buf, n, 1);
+			if (n < _max_chunksize) {
+				context().set_flag (ProcessContext<Sample>::EndOfInput);
+			}
+			interleaver->input (channel)->process (context);
+
+			if (n == 0) {
+				std::cerr << "AnalysisGraph::analyze_region read zero samples\n";
+				break;
+			}
+		}
+		x += n;
+		_frames_read += n;
+		Progress (_frames_read, _frames_end);
+		if (_canceled) {
+			return;
+		}
+	}
+	_results.insert (std::make_pair (region->name(), analyser->result ()));
+}
+
+void
+AnalysisGraph::analyze_range (boost::shared_ptr<Route> route, boost::shared_ptr<AudioPlaylist> pl, const std::list<AudioRange>& range)
+{
+	const uint32_t n_audio = route->n_inputs().n_audio();
+
+	for (std::list<AudioRange>::const_iterator j = range.begin(); j != range.end(); ++j) {
+
+		interleaver.reset (new Interleaver<Sample> ());
+		interleaver->init (n_audio, _max_chunksize);
+		chunker.reset (new Chunker<Sample> (_max_chunksize));
+		analyser.reset (new Analyser (48000.f,  n_audio, _max_chunksize, (*j).length()));
+
+		interleaver->add_output(chunker);
+		chunker->add_output (analyser);
+
+		framecnt_t x = 0;
+		while (x < j->length()) {
+			framecnt_t chunk = std::min (_max_chunksize, (*j).length() - x);
+			framecnt_t n = 0;
+			for (uint32_t channel = 0; channel < n_audio; ++channel) {
+				n = pl->read (_buf, _mixbuf, _gainbuf, (*j).start + x, chunk, channel);
+
+				ConstProcessContext<Sample> context (_buf, n, 1);
+				if (n < _max_chunksize) {
+					context().set_flag (ProcessContext<Sample>::EndOfInput);
+				}
+				interleaver->input (channel)->process (context);
+			}
+			x += n;
+			_frames_read += n;
+			Progress (_frames_read, _frames_end);
+			if (_canceled) {
+				return;
+			}
+		}
+
+		std::string name = string_compose (_("%1 (%2..%3)"), route->name(),
+				Timecode::timecode_format_sampletime (
+					(*j).start,
+					_session->nominal_frame_rate(),
+					100, false),
+				Timecode::timecode_format_sampletime (
+					(*j).start + (*j).length(),
+					_session->nominal_frame_rate(),
+					100, false)
+				);
+		_results.insert (std::make_pair (name, analyser->result ()));
+	}
+}
diff --git a/libs/ardour/ardour/amp.h b/libs/ardour/ardour/amp.h
index 20a07c0..820e2a8 100644
--- a/libs/ardour/ardour/amp.h
+++ b/libs/ardour/ardour/amp.h
@@ -47,7 +47,7 @@ public:
 	bool can_support_io_configuration (const ChanCount& in, ChanCount& out);
 	bool configure_io (ChanCount in, ChanCount out);
 
-	void run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, bool);
+	void run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, double speed, pframes_t nframes, bool);
 
 	bool apply_gain () const  { return _apply_gain; }
 	void apply_gain (bool yn) { _apply_gain = yn; }
@@ -79,7 +79,7 @@ public:
 		return _gain_control;
 	}
 
-	std::string value_as_string (boost::shared_ptr<AutomationControl>) const;
+	std::string value_as_string (boost::shared_ptr<const AutomationControl>) const;
 
 private:
 	bool   _denormal_protection;
diff --git a/libs/ardour/ardour/analysis_graph.h b/libs/ardour/ardour/analysis_graph.h
new file mode 100644
index 0000000..4724b82
--- /dev/null
+++ b/libs/ardour/ardour/analysis_graph.h
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+
+#ifndef __ardour_analysis_graph_h__
+#define __ardour_analysis_graph_h__
+
+#include <map>
+#include <set>
+#include <cstring>
+#include <boost/shared_ptr.hpp>
+
+#include "ardour/audioregion.h"
+#include "ardour/audioplaylist.h"
+#include "ardour/export_analysis.h"
+#include "ardour/libardour_visibility.h"
+
+namespace AudioGrapher {
+	class Analyser;
+	template <typename T> class Chunker;
+	template <typename T> class Interleaver;
+}
+
+namespace ARDOUR {
+class LIBARDOUR_API AnalysisGraph {
+	public:
+		AnalysisGraph (ARDOUR::Session*);
+		~AnalysisGraph ();
+
+		void analyze_region (boost::shared_ptr<ARDOUR::AudioRegion>);
+		void analyze_range (boost::shared_ptr<ARDOUR::Route>, boost::shared_ptr<ARDOUR::AudioPlaylist>, const std::list<AudioRange>&);
+		const AnalysisResults& results () const { return _results; }
+
+		void cancel () { _canceled = true; }
+		bool canceled () const { return _canceled; }
+
+		void set_total_frames (framecnt_t p) { _frames_end = p; }
+		PBD::Signal2<void, framecnt_t, framecnt_t> Progress;
+
+	private:
+		ARDOUR::Session* _session;
+		AnalysisResults  _results;
+		framecnt_t       _max_chunksize;
+
+		ARDOUR::Sample*  _buf;
+		ARDOUR::Sample*  _mixbuf;
+		float*           _gainbuf;
+		framecnt_t       _frames_read;
+		framecnt_t       _frames_end;
+		bool             _canceled;
+
+		typedef boost::shared_ptr<AudioGrapher::Analyser> AnalysisPtr;
+		typedef boost::shared_ptr<AudioGrapher::Chunker<float> > ChunkerPtr;
+		typedef boost::shared_ptr<AudioGrapher::Interleaver<Sample> > InterleaverPtr;
+
+		InterleaverPtr  interleaver;
+		ChunkerPtr      chunker;
+		AnalysisPtr     analyser;
+};
+} // namespace ARDOUR
+#endif
diff --git a/libs/ardour/ardour/ardour.h b/libs/ardour/ardour/ardour.h
index ddea43f..79b6912 100644
--- a/libs/ardour/ardour/ardour.h
+++ b/libs/ardour/ardour/ardour.h
@@ -72,8 +72,6 @@ namespace ARDOUR {
 
 	extern LIBARDOUR_API const char* const ardour_config_info;
 
-	LIBARDOUR_API void find_bindings_files (std::map<std::string,std::string>&);
-
 	/* these only impact bundled installations */
 	LIBARDOUR_API std::string translation_enable_path ();
 	LIBARDOUR_API bool translations_are_enabled ();
diff --git a/libs/ardour/ardour/audio_backend.h b/libs/ardour/ardour/audio_backend.h
index d5c53b4..9a00cf2 100644
--- a/libs/ardour/ardour/audio_backend.h
+++ b/libs/ardour/ardour/audio_backend.h
@@ -80,6 +80,9 @@ struct LIBARDOUR_API AudioBackendInfo {
     bool (*available)();
 };
 
+/** AudioBackend is an high-level abstraction for interacting with the operating system's
+ * audio and midi I/O.
+ */
 class LIBARDOUR_API AudioBackend : public PortEngine {
   public:
 
diff --git a/libs/ardour/ardour/audio_buffer.h b/libs/ardour/ardour/audio_buffer.h
index f3ec2ed..9a9653b 100644
--- a/libs/ardour/ardour/audio_buffer.h
+++ b/libs/ardour/ardour/audio_buffer.h
@@ -33,9 +33,18 @@ public:
 	AudioBuffer(size_t capacity);
 	~AudioBuffer();
 
+	/** silence buffer
+	 * @param len number of samples to clear
+	 * @laram offset start offset
+	 */
 	void silence (framecnt_t len, framecnt_t offset = 0);
 
-	/** Read @a len frames @a src starting at @a src_offset into self starting at @ dst_offset*/
+	/** Copy samples from src array starting at src_offset into self starting at dst_offset
+	 * @param src array to read from
+	 * @param len number of samples to copy
+	 * @param dst_offset offset in destination buffer
+	 * @param src_offset start offset in src buffer
+	 */
 	void read_from (const Sample* src, framecnt_t len, framecnt_t dst_offset = 0, framecnt_t src_offset = 0) {
 		assert(src != 0);
 		assert(_capacity > 0);
@@ -45,7 +54,7 @@ public:
 		_written = true;
 	}
 
-        void read_from_with_gain (const Sample* src, framecnt_t len, gain_t gain, framecnt_t dst_offset = 0, framecnt_t src_offset = 0) {
+	void read_from_with_gain (const Sample* src, framecnt_t len, gain_t gain, framecnt_t dst_offset = 0, framecnt_t src_offset = 0) {
 		assert(src != 0);
 		assert(_capacity > 0);
 		assert(len <= _capacity);
@@ -57,7 +66,12 @@ public:
 		_written = true;
 	}
 
-	/** Read @a len frames @a src starting at @a src_offset into self starting at @ dst_offset*/
+	/** Copy samples from src buffer starting at src_offset into self starting at dst_offset
+	 * @param src buffer to read from
+	 * @param len number of samples to copy
+	 * @param dst_offset offset in destination buffer
+	 * @param src_offset start offset in src buffer
+	 */
 	void read_from (const Buffer& src, framecnt_t len, framecnt_t dst_offset = 0, framecnt_t src_offset = 0) {
 		assert(&src != this);
 		assert(_capacity > 0);
@@ -73,14 +87,14 @@ public:
 		_written = true;
 	}
 
-	/** Acumulate (add) @a len frames @a src starting at @a src_offset into self starting at @a dst_offset */
+	/** Accumulate (add) @a len frames @a src starting at @a src_offset into self starting at @a dst_offset */
 	void merge_from (const Buffer& src, framecnt_t len, framecnt_t dst_offset = 0, framecnt_t src_offset = 0) {
 		const AudioBuffer* ab = dynamic_cast<const AudioBuffer*>(&src);
 		assert (ab);
 		accumulate_from (*ab, len, dst_offset, src_offset);
 	}
 
-	/** Acumulate (add) @a len frames @a src starting at @a src_offset into self starting at @a dst_offset */
+	/** Accumulate (add) @a len frames @a src starting at @a src_offset into self starting at @a dst_offset */
 	void accumulate_from (const AudioBuffer& src, framecnt_t len, framecnt_t dst_offset = 0, framecnt_t src_offset = 0) {
 		assert(_capacity > 0);
 		assert(len <= _capacity);
@@ -94,7 +108,7 @@ public:
 		_written = true;
 	}
 
-	/** Acumulate (add) @a len frames @a src starting at @a src_offset into self starting at @a dst_offset */
+	/** Accumulate (add) @a len frames @a src starting at @a src_offset into self starting at @a dst_offset */
 	void accumulate_from (const Sample* src, framecnt_t len, framecnt_t dst_offset = 0, framecnt_t src_offset = 0) {
 		assert(_capacity > 0);
 		assert(len <= _capacity);
@@ -108,7 +122,7 @@ public:
 		_written = true;
 	}
 
-	/** Acumulate (add) @a len frames @a src starting at @a src_offset into self starting at @dst_offset
+	/** Accumulate (add) @a len frames @a src starting at @a src_offset into self starting at @dst_offset
 	 * scaling by @a gain_coeff */
 	void accumulate_with_gain_from (const AudioBuffer& src, framecnt_t len, gain_t gain_coeff, framecnt_t dst_offset = 0, framecnt_t src_offset = 0) {
 
@@ -162,6 +176,10 @@ public:
 		_written = true;
 	}
 
+	/** apply a fixed gain factor to the audio buffer
+	 * @param gain gain factor
+	 * @param len number of frames to amplify
+	 */
 	void apply_gain (gain_t gain, framecnt_t len) {
 		apply_gain_to_buffer (_data, len, gain);
 	}
@@ -195,9 +213,20 @@ public:
 		return _data + offset;
 	}
 
-	bool check_silence (pframes_t, pframes_t&) const;
+	/** check buffer for silence
+	 * @param nframes  number of frames to check
+	 * @param n first non zero sample (if any)
+	 * @return true if all samples are zero
+	 */
+	bool check_silence (pframes_t nframes, pframes_t& n) const;
 
-	void prepare () { _written = false; _silent = false; }
+	void prepare () {
+		if (!_owns_data) {
+			_data = 0;
+		}
+		_written = false;
+		_silent = false;
+	}
 	bool written() const { return _written; }
 	void set_written(bool w) { _written = w; }
 
diff --git a/libs/ardour/ardour/audio_track.h b/libs/ardour/ardour/audio_track.h
index 17e2223..d80042a 100644
--- a/libs/ardour/ardour/audio_track.h
+++ b/libs/ardour/ardour/audio_track.h
@@ -34,7 +34,7 @@ class AudioFileSource;
 class LIBARDOUR_API AudioTrack : public Track
 {
   public:
-	AudioTrack (Session&, std::string name, Route::Flag f = Route::Flag (0), TrackMode m = Normal);
+	AudioTrack (Session&, std::string name, TrackMode m = Normal);
 	~AudioTrack ();
 
 	int set_mode (TrackMode m);
diff --git a/libs/ardour/ardour/audio_unit.h b/libs/ardour/ardour/audio_unit.h
index e9a5622..c5c5ed4 100644
--- a/libs/ardour/ardour/audio_unit.h
+++ b/libs/ardour/ardour/audio_unit.h
@@ -74,6 +74,8 @@ class LIBARDOUR_API AUPlugin : public ARDOUR::Plugin
 	void set_parameter (uint32_t which, float val);
 	float get_parameter (uint32_t which) const;
 
+	PluginOutputConfiguration possible_output () const { return _output_configs; }
+
 	int get_parameter_descriptor (uint32_t which, ParameterDescriptor&) const;
 	uint32_t nth_parameter (uint32_t which, bool& ok) const;
 	void activate ();
@@ -82,10 +84,12 @@ class LIBARDOUR_API AUPlugin : public ARDOUR::Plugin
 	int set_block_size (pframes_t nframes);
 
 	int connect_and_run (BufferSet& bufs,
-			     ChanMapping in, ChanMapping out,
-			     pframes_t nframes, framecnt_t offset);
+			framepos_t start, framepos_t end, double speed,
+			ChanMapping in, ChanMapping out,
+			pframes_t nframes, framecnt_t offset);
 	std::set<Evoral::Parameter> automatable() const;
 	std::string describe_parameter (Evoral::Parameter);
+	IOPortDescription describe_io_port (DataType dt, bool input, uint32_t id) const;
 	std::string state_node_name () const { return "audiounit"; }
 	void print_parameter (uint32_t, char*, uint32_t len) const;
 
@@ -103,7 +107,7 @@ class LIBARDOUR_API AUPlugin : public ARDOUR::Plugin
 
 	bool has_editor () const;
 
-	bool can_support_io_configuration (const ChanCount& in, ChanCount& out);
+	bool can_support_io_configuration (const ChanCount& in, ChanCount& out, ChanCount* imprecise);
 	ChanCount output_streams() const;
 	ChanCount input_streams() const;
 	bool configure_io (ChanCount in, ChanCount out);
@@ -166,12 +170,13 @@ class LIBARDOUR_API AUPlugin : public ARDOUR::Plugin
 	int32_t input_channels;
 	int32_t output_channels;
 	std::vector<std::pair<int,int> > io_configs;
-	pframes_t _current_block_size;
 	framecnt_t _last_nframes;
+	mutable volatile guint _current_latency;
 	bool _requires_fixed_size_buffers;
 	AudioBufferList* buffers;
 	bool _has_midi_input;
 	bool _has_midi_output;
+	PluginOutputConfiguration _output_configs;
 
 	/* despite all the cool work that apple did on their AU preset
 	   system, they left factory presets and user presets as two
@@ -190,9 +195,18 @@ class LIBARDOUR_API AUPlugin : public ARDOUR::Plugin
 	UInt32 output_elements;
 	UInt32 input_elements;
 
-	int set_output_format (AudioStreamBasicDescription&);
-	int set_input_format (AudioStreamBasicDescription&);
-	int set_stream_format (int scope, uint32_t cnt, AudioStreamBasicDescription&);
+	bool variable_inputs;
+	bool variable_outputs;
+
+	uint32_t configured_input_busses;
+	uint32_t configured_output_busses;
+
+	uint32_t *bus_inputs;
+	uint32_t *bus_outputs;
+	std::vector <std::string> _bus_name_in;
+	std::vector <std::string> _bus_name_out;
+
+	int set_stream_format (int scope, uint32_t bus, AudioStreamBasicDescription&);
 	void discover_parameters ();
 	void add_state (XMLNode *) const;
 
@@ -200,8 +214,9 @@ class LIBARDOUR_API AUPlugin : public ARDOUR::Plugin
 	ParameterMap parameter_map;
 	uint32_t   input_maxbuf;
 	framecnt_t input_offset;
-	framecnt_t cb_offset;
+	framecnt_t *cb_offsets;
 	BufferSet* input_buffers;
+	ChanMapping * input_map;
 	framecnt_t frames_processed;
 	uint32_t   audio_input_cnt;
 
@@ -212,8 +227,9 @@ class LIBARDOUR_API AUPlugin : public ARDOUR::Plugin
 
 	void discover_factory_presets ();
 
-	bool      last_transport_rolling;
-	float     last_transport_speed;
+	framepos_t transport_frame;
+	float      transport_speed;
+	float      last_transport_speed;
 
 	static void _parameter_change_listener (void* /*arg*/, void* /*src*/, const AudioUnitEvent* event, UInt64 host_time, Float32 new_value);
 	void parameter_change_listener (void* /*arg*/, void* /*src*/, const AudioUnitEvent* event, UInt64 host_time, Float32 new_value);
@@ -234,7 +250,7 @@ class LIBARDOUR_API AUPluginInfo : public PluginInfo {
 
 	std::vector<Plugin::PresetRecord> get_presets (bool user_only) const;
 
-	bool needs_midi_input ();
+	bool needs_midi_input () const;
 	bool is_effect () const;
 	bool is_effect_without_midi_input () const;
 	bool is_effect_with_midi_input () const;
@@ -244,6 +260,7 @@ class LIBARDOUR_API AUPluginInfo : public PluginInfo {
 
 	bool reconfigurable_io() const { return true; }
 
+	static void clear_cache ();
 	static PluginInfoList* discover (bool scan_only);
 	static bool au_get_crashlog (std::string &msg);
 	static std::string stringify_descriptor (const CAComponentDescription&);
diff --git a/libs/ardour/ardour/audioengine.h b/libs/ardour/ardour/audioengine.h
index 330af8d..cb5b82d 100644
--- a/libs/ardour/ardour/audioengine.h
+++ b/libs/ardour/ardour/audioengine.h
@@ -57,7 +57,7 @@ class ProcessThread;
 class AudioBackend;
 struct AudioBackendInfo;
 
-class LIBARDOUR_API AudioEngine : public SessionHandlePtr, public PortManager
+class LIBARDOUR_API AudioEngine : public PortManager, public SessionHandlePtr
 {
   public:
 
@@ -161,7 +161,7 @@ class LIBARDOUR_API AudioEngine : public SessionHandlePtr, public PortManager
 	   (the regular process() call to session->process() is not made)
 	*/
 
-	PBD::Signal1<int, pframes_t> Freewheel;
+	PBD::Signal1<void, pframes_t> Freewheel;
 
 	PBD::Signal0<void> Xrun;
 
diff --git a/libs/ardour/ardour/audioregion.h b/libs/ardour/ardour/audioregion.h
index 45b7fea..d25cf0e 100644
--- a/libs/ardour/ardour/audioregion.h
+++ b/libs/ardour/ardour/audioregion.h
@@ -82,8 +82,17 @@ class LIBARDOUR_API AudioRegion : public Region
 	gain_t scale_amplitude() const { return _scale_amplitude; }
 
 	void normalize (float, float target_in_dB = 0.0f);
+
+	/** @return the maximum (linear) amplitude of the region, or a -ve
+	 *  number if the Progress object reports that the process was cancelled.
+	 */
 	double maximum_amplitude (Progress* p = 0) const;
 
+	/** @return the maximum (rms) signal power of the region, or a -1
+	 *  if the Progress object reports that the process was cancelled.
+	 */
+	double rms (Progress* p = 0) const;
+
 	bool envelope_active () const { return _envelope_active; }
 	bool fade_in_active ()  const { return _fade_in_active; }
 	bool fade_out_active () const { return _fade_out_active; }
@@ -167,10 +176,10 @@ class LIBARDOUR_API AudioRegion : public Region
 
 	void add_transient (framepos_t where);
 	void remove_transient (framepos_t where);
-	int set_transients (AnalysisFeatureList&);
-	int get_transients (AnalysisFeatureList&, bool force_new = false);
-	int update_transient (framepos_t old_position, framepos_t new_position);
-	int adjust_transients (frameoffset_t delta);
+	void clear_transients ();
+	void set_onsets (AnalysisFeatureList&);
+	void get_transients (AnalysisFeatureList&);
+	void update_transient (framepos_t old_position, framepos_t new_position);
 
 	AudioIntervalResult find_silence (Sample, framecnt_t, framecnt_t, InterThreadInfo&) const;
 
@@ -180,7 +189,7 @@ class LIBARDOUR_API AudioRegion : public Region
 	AudioRegion (boost::shared_ptr<AudioSource>);
 	AudioRegion (const SourceList &);
 	AudioRegion (boost::shared_ptr<const AudioRegion>);
-	AudioRegion (boost::shared_ptr<const AudioRegion>, frameoffset_t offset);
+	AudioRegion (boost::shared_ptr<const AudioRegion>, frameoffset_t offset, const int32_t sub_num);
 	AudioRegion (boost::shared_ptr<const AudioRegion>, const SourceList&);
 	AudioRegion (SourceList &);
 
@@ -188,6 +197,8 @@ class LIBARDOUR_API AudioRegion : public Region
 	friend class ::AudioRegionReadTest;
 	friend class ::PlaylistReadTest;
 
+	void build_transients ();
+
 	PBD::Property<bool>     _envelope_active;
 	PBD::Property<bool>     _default_fade_in;
 	PBD::Property<bool>     _default_fade_out;
diff --git a/libs/ardour/ardour/automatable.h b/libs/ardour/ardour/automatable.h
index c9e14cf..ae2c8dd 100644
--- a/libs/ardour/ardour/automatable.h
+++ b/libs/ardour/ardour/automatable.h
@@ -23,10 +23,15 @@
 #include <map>
 #include <set>
 #include <string>
+
 #include <boost/shared_ptr.hpp>
+
 #include "pbd/signals.h"
+
 #include "evoral/ControlSet.hpp"
+
 #include "ardour/libardour_visibility.h"
+#include "ardour/slavable.h"
 #include "ardour/types.h"
 
 class XMLNode;
@@ -39,7 +44,7 @@ class AutomationControl;
 /* The inherited ControlSet is virtual because AutomatableSequence inherits
  * from this AND EvoralSequence, which is also a ControlSet
  */
-class LIBARDOUR_API Automatable : virtual public Evoral::ControlSet
+class LIBARDOUR_API Automatable : virtual public Evoral::ControlSet, public Slavable
 {
 public:
 	Automatable(Session&);
@@ -47,24 +52,24 @@ public:
 
         virtual ~Automatable();
 
-	boost::shared_ptr<Evoral::Control>
-	control_factory(const Evoral::Parameter& id);
+	boost::shared_ptr<Evoral::Control> control_factory(const Evoral::Parameter& id);
 
-	boost::shared_ptr<AutomationControl>
-	automation_control (const Evoral::Parameter& id, bool create_if_missing=false);
+	boost::shared_ptr<AutomationControl> automation_control (const Evoral::Parameter& id) {
+		return automation_control (id, false);
+	}
 
-	boost::shared_ptr<const AutomationControl>
-	automation_control (const Evoral::Parameter& id) const;
+	boost::shared_ptr<AutomationControl> automation_control (const Evoral::Parameter& id, bool create_if_missing);
+	boost::shared_ptr<const AutomationControl> automation_control (const Evoral::Parameter& id) const;
 
 	virtual void add_control(boost::shared_ptr<Evoral::Control>);
-	virtual bool find_next_event(double start, double end, Evoral::ControlEvent& ev, bool only_active = true) const;
+	virtual bool find_next_event (double start, double end, Evoral::ControlEvent& ev, bool only_active = true) const;
 	void clear_controls ();
 
         virtual void transport_located (framepos_t now);
 	virtual void transport_stopped (framepos_t now);
 
 	virtual std::string describe_parameter(Evoral::Parameter param);
-	virtual std::string value_as_string (boost::shared_ptr<AutomationControl>) const;
+	virtual std::string value_as_string (boost::shared_ptr<const AutomationControl>) const;
 
 	AutoState get_parameter_automation_state (Evoral::Parameter param);
 	virtual void set_parameter_automation_state (Evoral::Parameter param, AutoState);
diff --git a/libs/ardour/ardour/automation_control.h b/libs/ardour/ardour/automation_control.h
index 0d06568..e15abbe 100644
--- a/libs/ardour/ardour/automation_control.h
+++ b/libs/ardour/ardour/automation_control.h
@@ -21,22 +21,29 @@
 #ifndef __ardour_automation_control_h__
 #define __ardour_automation_control_h__
 
+#include <map>
+
+#include <glibmm/threads.h>
+
 #include <boost/shared_ptr.hpp>
 #include <boost/enable_shared_from_this.hpp>
 
-#include "evoral/types.hpp"
 #include "pbd/controllable.h"
+
+#include "evoral/types.hpp"
 #include "evoral/Control.hpp"
 
-#include "ardour/libardour_visibility.h"
 #include "ardour/automation_list.h"
+#include "ardour/control_group_member.h"
 #include "ardour/parameter_descriptor.h"
 
+#include "ardour/libardour_visibility.h"
+
 namespace ARDOUR {
 
 class Session;
 class Automatable;
-
+class ControlGroup;
 
 /** A PBD::Controllable with associated automation data (AutomationList)
  */
@@ -44,8 +51,9 @@ class LIBARDOUR_API AutomationControl
 	: public PBD::Controllable
 	, public Evoral::Control
 	, public boost::enable_shared_from_this<AutomationControl>
+	, public ControlGroupMember
 {
-public:
+    public:
 	AutomationControl(ARDOUR::Session&,
 	                  const Evoral::Parameter&                  parameter,
 	                  const ParameterDescriptor&                desc,
@@ -82,8 +90,6 @@ public:
 	void stop_touch(bool mark, double when);
 
 	/* inherited from PBD::Controllable.
-	 * Derived classes MUST call ::writable() to verify
-	 * that writing to the parameter is legal at that time.
 	 */
 	double get_value () const;
 	/* inherited from PBD::Controllable.
@@ -94,10 +100,11 @@ public:
 	/* automation related value setting */
 	virtual bool writable () const;
 	/* Call to ::set_value() with no test for writable() because
-	 * this is only used by automation playback. We would like
-	 * to make it pure virtual 
+	 * this is only used by automation playback.
 	 */
-	virtual void set_value_unchecked (double val) {}
+	void set_value_unchecked (double val) {
+		actually_set_value (val, PBD::Controllable::NoGroup);
+	}
 
 	double lower()   const { return _desc.lower; }
 	double upper()   const { return _desc.upper; }
@@ -112,10 +119,34 @@ public:
 	const ARDOUR::Session& session() const { return _session; }
 	void commit_transaction (bool did_write);
 
-protected:
+  protected:
 	ARDOUR::Session& _session;
+	boost::shared_ptr<ControlGroup> _group;
 
 	const ParameterDescriptor _desc;
+
+	bool check_rt (double val, Controllable::GroupControlDisposition gcd);
+
+	/* derived classes may reimplement this, but should either
+	   call this explicitly inside their version OR make sure that the
+	   Controllable::Changed signal is emitted when necessary.
+	*/
+
+	virtual void actually_set_value (double value, PBD::Controllable::GroupControlDisposition);
+
+	/* Session needs to call this method before it queues up the real
+	   change for execution in a realtime context. C++ access control sucks.
+	*/
+	friend class Session;
+	virtual void do_pre_realtime_queue_stuff (double new_value) {}
+
+  private:
+	/* I am unclear on why we have to make ControlGroup a friend in order
+	   to get access to the ::set_group() method when it is already
+	   declared to be a friend in ControlGroupMember. Oh well.
+	*/
+	friend class ControlGroup;
+	void set_group (boost::shared_ptr<ControlGroup>);
 };
 
 
diff --git a/libs/ardour/ardour/automation_list.h b/libs/ardour/ardour/automation_list.h
index 37a30ac..a57460c 100644
--- a/libs/ardour/ardour/automation_list.h
+++ b/libs/ardour/ardour/automation_list.h
@@ -61,6 +61,10 @@ private:
 	AutomationListProperty& operator= (AutomationListProperty const &);
 };
 
+/** AutomationList is a stateful wrapper around Evoral::ControlList.
+ * It includes session-specifics (such as automation state), control logic (e.g. touch, signals)
+ * and acts as proxy to the underlying ControlList which holds the actual data.
+ */
 class LIBARDOUR_API AutomationList : public PBD::StatefulDestructible, public Evoral::ControlList
 {
   public:
@@ -111,9 +115,11 @@ class LIBARDOUR_API AutomationList : public PBD::StatefulDestructible, public Ev
 	XMLNode& state (bool full);
 	XMLNode& serialize_events ();
 
+	Command* memento_command (XMLNode* before, XMLNode* after);
+
 	bool operator!= (const AutomationList &) const;
 
-	XMLNode* before () { return _before; }
+	XMLNode* before () { XMLNode* rv = _before; _before = 0; return rv; }
 	void clear_history ();
   private:
 	void create_curve_if_necessary ();
diff --git a/libs/ardour/ardour/beats_frames_converter.h b/libs/ardour/ardour/beats_frames_converter.h
index 908dd19..4b7169b 100644
--- a/libs/ardour/ardour/beats_frames_converter.h
+++ b/libs/ardour/ardour/beats_frames_converter.h
@@ -19,8 +19,8 @@
     $Id: midiregion.h 733 2006-08-01 17:19:38Z drobilla $
 */
 
+#include "evoral/Beats.hpp"
 #include "evoral/TimeConverter.hpp"
-#include "evoral/types.hpp"
 
 #include "ardour/libardour_visibility.h"
 #include "ardour/types.h"
diff --git a/libs/ardour/ardour/boost_debug.h b/libs/ardour/ardour/boost_debug.h
new file mode 100644
index 0000000..08c5f5a
--- /dev/null
+++ b/libs/ardour/ardour/boost_debug.h
@@ -0,0 +1,41 @@
+/*
+    Copyright (C) 2016 Paul Davis
+    From an idea by Carl Hetherington.
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#ifndef __libardour_boost_debug_h__
+#define __libardour_boost_debug_h__
+
+#include "pbd/boost_debug.h"
+
+/* these defines are intended to be switched on as-needed. They will not work
+   unless the program was configured with --boost-sp-debug
+*/
+
+//#define BOOST_MARK_ROUTE(p) boost_debug_shared_ptr_mark_interesting((p).get(),"Route")
+//#define BOOST_MARK_TRACK(p) boost_debug_shared_ptr_mark_interesting((p).get(),"Track")
+//#define BOOST_MARK_VCA(p) boost_debug_shared_ptr_mark_interesting((p).get(),"ControlMaster")
+//#define BOOST_SHOW_POINTERS() boost_debug_list_ptrs()
+
+#define BOOST_MARK_ROUTE(p)
+#define BOOST_MARK_TRACK(p)
+#define BOOST_MARK_VCA(p)
+#define BOOST_SHOW_POINTERS()
+
+
+#endif /* __libardour_boost_debug_h__ */
diff --git a/libs/ardour/ardour/capturing_processor.h b/libs/ardour/ardour/capturing_processor.h
index 9a91e6d..dccb7eb 100644
--- a/libs/ardour/ardour/capturing_processor.h
+++ b/libs/ardour/ardour/capturing_processor.h
@@ -20,14 +20,16 @@
 #ifndef __ardour_capturing_processor_h__
 #define __ardour_capturing_processor_h__
 
+#include "ardour/fixed_delay.h"
 #include "ardour/processor.h"
+#include "ardour/types.h"
 
 namespace ARDOUR {
 
 class LIBARDOUR_API CapturingProcessor : public Processor
 {
   public:
-	CapturingProcessor (Session & session);
+	CapturingProcessor (Session & session, framecnt_t latency);
 	~CapturingProcessor();
 
   public: // main interface
@@ -36,7 +38,7 @@ class LIBARDOUR_API CapturingProcessor : public Processor
   public: // Processor overrides
 	bool display_to_user() const { return false; }
 	int set_block_size (pframes_t nframes);
-	void run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, bool result_required);
+	void run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, double speed, pframes_t nframes, bool result_required);
 	bool configure_io (ChanCount in, ChanCount out);
 	bool can_support_io_configuration (const ChanCount& in, ChanCount& out);
 	virtual XMLNode& state (bool);
@@ -47,6 +49,8 @@ class LIBARDOUR_API CapturingProcessor : public Processor
 
 	framecnt_t block_size;
 	BufferSet capture_buffers;
+	FixedDelay _delaybuffers;
+	framecnt_t _latency;
 };
 
 } // namespace ARDOUR
diff --git a/libs/ardour/ardour/chan_count.h b/libs/ardour/ardour/chan_count.h
index b613f67..b5699b6 100644
--- a/libs/ardour/ardour/chan_count.h
+++ b/libs/ardour/ardour/chan_count.h
@@ -43,29 +43,56 @@ public:
 	ChanCount(const XMLNode& node);
 	ChanCount() { reset(); }
 
-	// Convenience constructor for making single-typed streams (stereo, mono, etc)
-	ChanCount(DataType type, uint32_t channels) {
+	/** Convenience constructor for making single-typed streams (mono, stereo, midi, etc)
+	 * @param type data type
+	 * @param count number of channels
+	 */
+	ChanCount(DataType type, uint32_t count) {
 		reset();
-		set(type, channels);
+		set(type, count);
 	}
 
+	/** zero count of all data types */
 	void reset() {
 		for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
 			_counts[*t] = 0;
 		}
 	}
 
+	/** set channel count for given type
+	 * @param type data type
+	 * @param count number of channels
+	 */
 	void     set(DataType t, uint32_t count) { assert(t != DataType::NIL); _counts[t] = count; }
+	/** query channel count for given type
+	 * @param type data type
+	 * @returns channel count for given type
+	 */
 	uint32_t get(DataType t) const { assert(t != DataType::NIL); return _counts[t]; }
 
 	inline uint32_t n (DataType t) const { return _counts[t]; }
 
+	/** query number of audio channels
+	 * @returns number of audio channels
+	 */
 	inline uint32_t n_audio() const { return _counts[DataType::AUDIO]; }
+	/** set number of audio channels
+	 * @param a number of audio channels
+	 */
 	inline void set_audio(uint32_t a) { _counts[DataType::AUDIO] = a; }
 
+	/** query number of midi channels
+	 * @returns number of midi channels
+	 */
 	inline uint32_t n_midi()  const { return _counts[DataType::MIDI]; }
+	/** set number of audio channels
+	 * @param m number of midi channels
+	 */
 	inline void set_midi(uint32_t m) { _counts[DataType::MIDI] = m; }
 
+	/** query total channel count of all data types
+	 * @returns total channel count (audio + midi)
+	 */
 	uint32_t n_total() const {
 		uint32_t ret = 0;
 		for (uint32_t i=0; i < DataType::num_types; ++i)
@@ -120,6 +147,39 @@ public:
 		return ret;
 	}
 
+	/** underflow safe subtraction */
+	ChanCount operator-(const ChanCount& other) const {
+		ChanCount ret;
+		for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
+			if (get(*t) < other.get(*t)) {
+				ret.set(*t, 0);
+			} else {
+				ret.set(*t, get(*t) - other.get(*t));
+			}
+		}
+		return ret;
+	}
+
+	ChanCount operator*(const unsigned int factor) const {
+		ChanCount ret;
+		for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
+			ret.set(*t, get(*t) * factor );
+		}
+		return ret;
+	}
+
+	/** underflow safe subtraction */
+	ChanCount& operator-=(const ChanCount& other) {
+		for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
+			if (_counts[*t] < other._counts[*t]) {
+				_counts[*t] = 0;
+			} else {
+				_counts[*t] -= other._counts[*t];
+			}
+		}
+		return *this;
+	}
+
 	ChanCount& operator+=(const ChanCount& other) {
 		for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
 			_counts[*t] += other._counts[*t];
diff --git a/libs/ardour/ardour/chan_mapping.h b/libs/ardour/ardour/chan_mapping.h
index 7b9f819..ac546e3 100644
--- a/libs/ardour/ardour/chan_mapping.h
+++ b/libs/ardour/ardour/chan_mapping.h
@@ -25,32 +25,95 @@
 #include <ostream>
 #include <utility>
 
+#include "pbd/xml++.h"
 #include "ardour/data_type.h"
 #include "ardour/chan_count.h"
 
 namespace ARDOUR {
 
 
-/** A mapping from one set of channels to another
- * (e.g. how to 'connect' two BufferSets).
+/** A mapping from one set of channels to another.
+ * The general form is  1 source (from), many sinks (to).
+ * numeric IDs are used to identify sources and sinks.
+ *
+ * for plugins this is used to map "plugin-pin" to "audio-buffer"
  */
 class LIBARDOUR_API ChanMapping {
 public:
 	ChanMapping() {}
 	ChanMapping(ARDOUR::ChanCount identity);
-
-	uint32_t get(DataType t, uint32_t from, bool* valid);
-	uint32_t get(DataType t, uint32_t from) { return get (t, from, NULL); }
+	ChanMapping(const ChanMapping&);
+	ChanMapping(const XMLNode& node);
+
+	uint32_t get(DataType t, uint32_t from, bool* valid) const;
+
+	/** reverse lookup
+	 * @param type data type
+	 * @param to pin
+	 * @param valid pointer to a boolean. If not NULL it is set to true if the mapping is found, and false otherwise.
+	 * @returns first "from" that matches given "to"
+	 */
+	uint32_t get_src(DataType t, uint32_t to, bool* valid) const;
+
+	/** get buffer mapping for given data type and pin
+	 * @param type data type
+	 * @param from numeric source id
+	 * @returns mapped buffer number (or ChanMapping::Invalid)
+	 */
+	uint32_t get (DataType t, uint32_t from) const { return get (t, from, NULL); }
+
+	/** set buffer mapping for given data type
+	 * @param type data type
+	 * @param from numeric source id
+	 * @param to buffer
+	 */
 	void     set(DataType t, uint32_t from, uint32_t to);
 	void     offset_from(DataType t, int32_t delta);
 	void     offset_to(DataType t, int32_t delta);
 
+	/** remove mapping
+	 * @param type data type
+	 * @param from numeric source to remove from mapping
+	 */
+	void     unset(DataType t, uint32_t from);
+
+	/** Test mapping matrix for identity
+	 * @param offset per data-type offset to take into account
+	 * @returns true if the mapping is a channel identity map
+	 */
+	bool     is_identity (ARDOUR::ChanCount offset = ARDOUR::ChanCount()) const;
+
+	/** Test if this mapping is monotonic (useful to see if inplace processing is feasible)
+	 * @returns true if the map is a strict monotonic set
+	 */
+	bool     is_monotonic () const;
+
+	uint32_t n_total () const;
+
+	ChanCount count () const;
+
+	XMLNode* state(const std::string& name) const;
+
+	/** Test if this mapping is a subset
+	 * @param superset to test against
+	 * @returns true if all mapping are also present in the superset
+	 */
+	bool     is_subset (const ChanMapping& superset) const;
+
 	typedef std::map<uint32_t, uint32_t>    TypeMapping;
 	typedef std::map<DataType, TypeMapping> Mappings;
 
 	Mappings       mappings()       { return _mappings; }
 	const Mappings mappings() const { return _mappings; }
 
+	bool operator==(const ChanMapping& other) const {
+		return (_mappings == other._mappings);
+	}
+
+	bool operator!=(const ChanMapping& other) const {
+		return ! (*this == other);
+	}
+
 private:
 	Mappings _mappings;
 };
diff --git a/libs/ardour/ardour/control_group.h b/libs/ardour/ardour/control_group.h
new file mode 100644
index 0000000..e1b83bb
--- /dev/null
+++ b/libs/ardour/ardour/control_group.h
@@ -0,0 +1,108 @@
+/*
+  Copyright (C) 2016 Paul Davis
+
+  This program is free software; you can redistribute it and/or modify it
+  under the terms of the GNU General Public License as published by the Free
+  Software Foundation; either version 2 of the License, or (at your option)
+  any later version.
+
+  This program is distributed in the hope that it will be useful, but WITHOUT
+  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+  for more details.
+
+  You should have received a copy of the GNU General Public License along
+  with this program; if not, write to the Free Software Foundation, Inc.,
+  675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#ifndef __libardour_control_group_h__
+#define __libardour_control_group_h__
+
+#include <map>
+#include <vector>
+
+#include <boost/shared_ptr.hpp>
+#include <boost/enable_shared_from_this.hpp>
+
+#include <glibmm/threads.h>
+
+#include "pbd/controllable.h"
+
+#include "evoral/Parameter.hpp"
+
+#include "ardour/automation_control.h"
+#include "ardour/types.h"
+
+namespace ARDOUR {
+
+class LIBARDOUR_API ControlGroup : public boost::enable_shared_from_this<ControlGroup>
+{
+  public:
+	ControlGroup (Evoral::Parameter p);
+	virtual ~ControlGroup ();
+
+	enum Mode {
+		Relative = 0x1,
+		Inverted = 0x2,
+	};
+
+	int add_control (boost::shared_ptr<AutomationControl>);
+	int remove_control (boost::shared_ptr<AutomationControl>);
+
+	ControlList controls () const;
+
+	void clear ();
+
+	void set_active (bool);
+	bool active() const { return _active; }
+
+	void set_mode (Mode m);
+	Mode mode () const { return _mode; }
+
+	Evoral::Parameter parameter() const { return _parameter; }
+
+	virtual void set_group_value (boost::shared_ptr<AutomationControl>, double val);
+
+	bool use_me (PBD::Controllable::GroupControlDisposition gcd) const {
+		switch (gcd) {
+		case PBD::Controllable::ForGroup:
+			return false;
+		case PBD::Controllable::NoGroup:
+			return false;
+		case PBD::Controllable::InverseGroup:
+			return !_active;
+		default:
+			return _active;
+		}
+	}
+
+  protected:
+	typedef std::map<PBD::ID,boost::shared_ptr<AutomationControl> > ControlMap;
+	Evoral::Parameter _parameter;
+	mutable Glib::Threads::RWLock controls_lock;
+	ControlMap _controls;
+	bool _active;
+	Mode _mode;
+	PBD::ScopedConnectionList member_connections;
+	bool propagating;
+
+	void control_going_away (boost::weak_ptr<AutomationControl>);
+};
+
+
+class LIBARDOUR_API GainControlGroup : public ControlGroup
+{
+  public:
+	GainControlGroup();
+
+	void set_group_value (boost::shared_ptr<AutomationControl>, double val);
+
+  private:
+	gain_t get_max_factor (gain_t);
+	gain_t get_min_factor (gain_t);
+};
+
+} /* namespace */
+
+#endif /* __libardour_control_group_h__ */
diff --git a/libs/ardour/ardour/control_group_member.h b/libs/ardour/ardour/control_group_member.h
new file mode 100644
index 0000000..385de9c
--- /dev/null
+++ b/libs/ardour/ardour/control_group_member.h
@@ -0,0 +1,40 @@
+/*
+  Copyright (C) 2016 Paul Davis
+
+  This program is free software; you can redistribute it and/or modify it
+  under the terms of the GNU General Public License as published by the Free
+  Software Foundation; either version 2 of the License, or (at your option)
+  any later version.
+
+  This program is distributed in the hope that it will be useful, but WITHOUT
+  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+  for more details.
+
+  You should have received a copy of the GNU General Public License along
+  with this program; if not, write to the Free Software Foundation, Inc.,
+  675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#ifndef __libardour_control_group_member_h__
+#define __libardour_control_group_member_h__
+
+namespace ARDOUR {
+
+class ControlGroup;
+
+class LIBARDOUR_API ControlGroupMember
+{
+  public:
+	virtual ~ControlGroupMember () {};
+  private:
+	friend class ControlGroup;
+	/* Only a ControlGroup can call this; all membership changes must be
+	   mediated by the ControlGroup, not by operating on the member.
+	*/
+	virtual void set_group (boost::shared_ptr<ControlGroup>) = 0;
+};
+
+} /* namespace */
+
+#endif /* __libardour_control_group_member_h__ */
diff --git a/libs/ardour/ardour/control_protocol_manager.h b/libs/ardour/ardour/control_protocol_manager.h
index dbbb0c3..c6ea045 100644
--- a/libs/ardour/ardour/control_protocol_manager.h
+++ b/libs/ardour/ardour/control_protocol_manager.h
@@ -36,20 +36,21 @@ class ControlProtocolDescriptor;
 class Session;
 
 class LIBARDOUR_API ControlProtocolInfo {
-public:
-    ControlProtocolDescriptor* descriptor;
-    ControlProtocol* protocol;
-    std::string name;
-    std::string path;
-    bool requested;
-    bool mandatory;
-    bool supports_feedback;
-    XMLNode* state;
-
-    ControlProtocolInfo() : descriptor (0), protocol (0), requested(false),
+	public:
+		ControlProtocolDescriptor* descriptor;
+		ControlProtocol* protocol;
+		std::string name;
+		std::string path;
+		bool requested;
+		bool mandatory;
+		bool supports_feedback;
+		XMLNode* state;
+
+		ControlProtocolInfo() : descriptor (0), protocol (0), requested(false),
 		mandatory(false), supports_feedback(false), state (0)
 	{}
-    ~ControlProtocolInfo() { delete state; }
+		~ControlProtocolInfo();
+
 };
 
 class LIBARDOUR_API ControlProtocolManager : public PBD::Stateful, public ARDOUR::SessionHandlePtr
diff --git a/libs/ardour/ardour/controllable_descriptor.h b/libs/ardour/ardour/controllable_descriptor.h
new file mode 100644
index 0000000..9f16022
--- /dev/null
+++ b/libs/ardour/ardour/controllable_descriptor.h
@@ -0,0 +1,95 @@
+/*
+    Copyright (C) 2009 Paul Davis
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#ifndef __libardour_controllable_descriptor_h__
+#define __libardour_controllable_descriptor_h__
+
+#include <vector>
+#include <string>
+#include <stdint.h>
+
+#include "ardour/libardour_visibility.h"
+
+namespace ARDOUR {
+
+class LIBARDOUR_API ControllableDescriptor {
+public:
+    enum TopLevelType {
+	    PresentationOrderRoute,
+	    PresentationOrderTrack,
+	    PresentationOrderBus,
+	    PresentationOrderVCA,
+	    NamedRoute,
+	    SelectionCount,
+    };
+
+    enum SubType {
+	    Gain,
+	    Trim,
+	    Solo,
+	    Mute,
+	    Recenable,
+	    PanDirection,
+	    PanWidth,
+	    PanElevation,
+	    Balance,
+	    SendGain,
+	    PluginParameter
+    };
+
+    ControllableDescriptor ()
+	    : _top_level_type (PresentationOrderRoute)
+	    , _subtype (Gain)
+	    , _banked (false)
+	    , _bank_offset (0)
+    {}
+
+    int set (const std::string&);
+
+    /* it is only valid to call top_level_name() if top_level_type() returns
+       NamedRoute
+    */
+
+    TopLevelType top_level_type() const { return _top_level_type; }
+    const std::string& top_level_name() const { return _top_level_name; }
+
+    SubType subtype() const { return _subtype; }
+
+    uint32_t presentation_order() const;
+    uint32_t selection_id() const;
+    uint32_t target (uint32_t n) const;
+    bool banked() const { return _banked; }
+
+    void set_bank_offset (uint32_t o) { _bank_offset = o; }
+
+private:
+    TopLevelType          _top_level_type;
+    SubType               _subtype;
+    std::string           _top_level_name;
+    union {
+	    uint32_t  _presentation_order;
+	    uint32_t  _selection_id;
+    };
+    std::vector<uint32_t> _target;
+    uint32_t              _banked;
+    uint32_t              _bank_offset;
+};
+
+}
+
+#endif /* __libardour_controllable_descriptor_h__ */
diff --git a/libs/ardour/ardour/debug.h b/libs/ardour/ardour/debug.h
index 6ebf21a..4193508 100644
--- a/libs/ardour/ardour/debug.h
+++ b/libs/ardour/ardour/debug.h
@@ -37,6 +37,7 @@ namespace PBD {
 		LIBARDOUR_API extern DebugBits LatencyCompensation;
 		LIBARDOUR_API extern DebugBits Peaks;
 		LIBARDOUR_API extern DebugBits Processors;
+		LIBARDOUR_API extern DebugBits ChanMapping;
 		LIBARDOUR_API extern DebugBits ProcessThreads;
 		LIBARDOUR_API extern DebugBits Graph;
 		LIBARDOUR_API extern DebugBits Destruction;
@@ -53,6 +54,7 @@ namespace PBD {
 		LIBARDOUR_API extern DebugBits AudioPlayback;
 		LIBARDOUR_API extern DebugBits Panning;
 		LIBARDOUR_API extern DebugBits LV2;
+		LIBARDOUR_API extern DebugBits LV2Automate;
 		LIBARDOUR_API extern DebugBits CaptureAlignment;
 		LIBARDOUR_API extern DebugBits PluginManager;
 		LIBARDOUR_API extern DebugBits AudioUnits;
@@ -77,6 +79,7 @@ namespace PBD {
 		LIBARDOUR_API extern DebugBits BackendPorts;
 		LIBARDOUR_API extern DebugBits VSTCallbacks;
 		LIBARDOUR_API extern DebugBits FaderPort;
+		LIBARDOUR_API extern DebugBits VCA;
 
 	}
 }
diff --git a/libs/ardour/ardour/delayline.h b/libs/ardour/ardour/delayline.h
index 56a6de0..93097df 100644
--- a/libs/ardour/ardour/delayline.h
+++ b/libs/ardour/ardour/delayline.h
@@ -20,6 +20,9 @@
 #ifndef __ardour_delayline_h__
 #define __ardour_delayline_h__
 
+#include <boost/shared_ptr.hpp>
+#include <boost/shared_array.hpp>
+
 #include "ardour/types.h"
 #include "ardour/processor.h"
 
@@ -39,7 +42,7 @@ public:
 
 	bool display_to_user() const { return false; }
 
-	void run (BufferSet&, framepos_t, framepos_t, pframes_t, bool);
+	void run (BufferSet&, framepos_t, framepos_t, double, pframes_t, bool);
 	void set_delay(framecnt_t signal_delay);
 	framecnt_t get_delay() { return _pending_delay; }
 
@@ -58,8 +61,8 @@ private:
 	framecnt_t _delay, _pending_delay;
 	framecnt_t _bsiz,  _pending_bsiz;
 	frameoffset_t _roff, _woff;
-	boost::shared_ptr<Sample> _buf;
-	boost::shared_ptr<Sample> _pending_buf;
+	boost::shared_array<Sample> _buf;
+	boost::shared_array<Sample> _pending_buf;
 	boost::shared_ptr<MidiBuffer> _midi_buf;
 	bool _pending_flush;
 };
diff --git a/libs/ardour/ardour/delivery.h b/libs/ardour/ardour/delivery.h
index 13e1cdc..80b8431 100644
--- a/libs/ardour/ardour/delivery.h
+++ b/libs/ardour/ardour/delivery.h
@@ -71,7 +71,7 @@ public:
 	bool can_support_io_configuration (const ChanCount& in, ChanCount& out);
 	bool configure_io (ChanCount in, ChanCount out);
 
-	void run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, bool);
+	void run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, double speed, pframes_t nframes, bool);
 
 	/* supplemental method used with MIDI */
 
diff --git a/libs/ardour/ardour/directory_names.h b/libs/ardour/ardour/directory_names.h
index c2b4783..7c507d1 100644
--- a/libs/ardour/ardour/directory_names.h
+++ b/libs/ardour/ardour/directory_names.h
@@ -39,6 +39,7 @@ namespace ARDOUR {
 	LIBARDOUR_API extern const char* const templates_dir_name;
 	LIBARDOUR_API extern const char* const route_templates_dir_name;
 	LIBARDOUR_API extern const char* const surfaces_dir_name;
+	LIBARDOUR_API extern const char* const theme_dir_name;
 	LIBARDOUR_API extern const char* const ladspa_dir_name;
 	LIBARDOUR_API extern const char* const panner_dir_name;
 	LIBARDOUR_API extern const char* const backend_dir_name;
@@ -46,6 +47,7 @@ namespace ARDOUR {
 	LIBARDOUR_API extern const char* const analysis_dir_name;
 	LIBARDOUR_API extern const char* const plugins_dir_name;
 	LIBARDOUR_API extern const char* const externals_dir_name;
+	LIBARDOUR_API extern const char* const lua_dir_name;
 
 };
 
diff --git a/libs/ardour/ardour/diskstream.h b/libs/ardour/ardour/diskstream.h
index fb9be65..e51f8c3 100644
--- a/libs/ardour/ardour/diskstream.h
+++ b/libs/ardour/ardour/diskstream.h
@@ -29,7 +29,7 @@
 
 #include <boost/utility.hpp>
 
-#include "evoral/types.hpp"
+#include "evoral/Range.hpp"
 
 #include "ardour/ardour.h"
 #include "ardour/chan_count.h"
diff --git a/libs/ardour/ardour/dsp_filter.h b/libs/ardour/ardour/dsp_filter.h
new file mode 100644
index 0000000..b7be410
--- /dev/null
+++ b/libs/ardour/ardour/dsp_filter.h
@@ -0,0 +1,314 @@
+/*
+ * Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ *
+ */
+#ifndef _dsp_filter_h_
+#define _dsp_filter_h_
+
+#include <stdint.h>
+#include <string.h>
+#include <assert.h>
+#include <glib.h>
+#include <glibmm.h>
+#include <fftw3.h>
+
+#include "pbd/malign.h"
+
+#include "ardour/buffer_set.h"
+#include "ardour/chan_mapping.h"
+#include "ardour/libardour_visibility.h"
+#include "ardour/types.h"
+
+namespace ARDOUR { namespace DSP {
+
+	/** C/C++ Shared Memory
+	 *
+	 * A convenience class representing a C array of float[] or int32_t[]
+	 * data values. This is useful for lua scripts to perform DSP operations
+	 * directly using C/C++ with CPU Hardware acceleration.
+	 *
+	 * Access to this memory area is always 4 byte aligned. The data
+	 * is interpreted either as float or as int.
+	 *
+	 * This memory area can also be shared between different instances
+	 * or the same lua plugin (DSP, GUI).
+	 *
+	 * Since memory allocation is not realtime safe it should be
+	 * allocated during dsp_init() or dsp_configure().
+	 * The memory is free()ed automatically when the lua instance is
+	 * destroyed.
+	 */
+	class DspShm {
+		public:
+			DspShm (size_t s = 0)
+				: _data (0)
+				, _size (0)
+			{
+				assert (sizeof(float) == sizeof (int32_t));
+				assert (sizeof(float) == sizeof (int));
+				allocate (s);
+			}
+
+			~DspShm () {
+				cache_aligned_free (_data);
+			}
+
+			/** [re] allocate memory in host's memory space
+			 *
+			 * @param s size, total number of float or integer elements to store.
+			 */
+			void allocate (size_t s) {
+				if (s == _size) { return; }
+				cache_aligned_free (_data);
+				cache_aligned_malloc ((void**) &_data, sizeof (float) * s);
+				if (_data) { _size = s; }
+			}
+
+			/** clear memory (set to zero) */
+			void clear () {
+				memset (_data, 0, sizeof(float) * _size);
+			}
+
+			/** access memory as float array
+			 *
+			 * @param off offset in shared memory region
+			 * @returns float[]
+			 */
+			float* to_float (size_t off) {
+				if (off >= _size) { return 0; }
+				return &(((float*)_data)[off]);
+			}
+
+			/** access memory as integer array
+			 *
+			 * @param off offset in shared memory region
+			 * @returns int_32_t[]
+			 */
+			int32_t* to_int (size_t off) {
+				if (off >= _size) { return 0; }
+				return &(((int32_t*)_data)[off]);
+			}
+
+			/** atomically set integer at offset
+			 *
+			 * This involves a memory barrier. This call
+			 * is intended for buffers which are
+			 * shared with another instance.
+			 *
+			 * @param off offset in shared memory region
+			 * @param val value to set
+			 */
+			void atomic_set_int (size_t off, int32_t val) {
+				g_atomic_int_set (&(((int32_t*)_data)[off]), val);
+			}
+
+			/** atomically read integer at offset
+			 *
+			 * This involves a memory barrier. This call
+			 * is intended for buffers which are
+			 * shared with another instance.
+			 *
+			 * @param off offset in shared memory region
+			 * @returns value at offset
+			 */
+			int32_t atomic_get_int (size_t off) {
+				return g_atomic_int_get (&(((int32_t*)_data)[off]));
+			}
+
+		private:
+			void* _data;
+			size_t _size;
+	};
+
+	/** lua wrapper to memset() */
+	void memset (float *data, const float val, const uint32_t n_samples);
+	/** matrix multiply
+	 * multiply every sample of `data' with the corresponding sample at `mult'.
+	 *
+	 * @param data multiplicand
+	 * @param mult multiplicand
+	 * @param n_samples number of samples in data and mmult
+	 */
+	void mmult (float *data, float *mult, const uint32_t n_samples);
+	/** calculate peaks
+	 *
+	 * @param data data to analyze
+	 * @param min result, minimum value found in range
+	 * @param max result, max value found in range
+	 * @param n_samples number of samples to analyze
+	 */
+	void peaks (const float *data, float &min, float &max, uint32_t n_samples);
+
+	/** non-linear power-scale meter deflection
+	 *
+	 * @param power signal power (dB)
+	 * @returns deflected value
+	 */
+	float log_meter (float power);
+	/** non-linear power-scale meter deflection
+	 *
+	 * @param coeff signal value
+	 * @returns deflected value
+	 */
+	float log_meter_coeff (float coeff);
+
+	void process_map (BufferSet* bufs,
+	                  const ChanMapping& in,
+	                  const ChanMapping& out,
+	                  pframes_t nframes, framecnt_t offset,
+	                  const DataType&);
+
+	/** 1st order Low Pass filter */
+	class LIBARDOUR_API LowPass {
+		public:
+			/** instantiate a LPF
+			 *
+			 * @param samplerate samplerate
+			 * @param freq cut-off frequency
+			 */
+			LowPass (double samplerate, float freq);
+			/** process audio data
+			 *
+			 * @param data pointer to audio-data
+			 * @param n_samples number of samples to process
+			 */
+			void proc (float *data, const uint32_t n_samples);
+			/** filter control data
+			 *
+			 * This is useful for parameter smoothing.
+			 *
+			 * @param data pointer to control-data array
+			 * @param val target value
+			 * @param array length
+			 */
+			void ctrl (float *data, const float val, const uint32_t n_samples);
+			/** update filter cut-off frequency
+			 *
+			 * @param freq cut-off frequency
+			 */
+			void set_cutoff (float freq);
+			/** reset filter state */
+			void reset () { _z =  0.f; }
+		private:
+			float _rate;
+			float _z;
+			float _a;
+	};
+
+	/** Biquad Filter */
+	class LIBARDOUR_API Biquad {
+		public:
+			enum Type {
+				LowPass,
+				HighPass,
+				BandPassSkirt,
+				BandPass0dB,
+				Notch,
+				AllPass,
+				Peaking,
+				LowShelf,
+				HighShelf
+			};
+
+			/** Instantiate Biquad Filter
+			 *
+			 * @param samplerate Samplerate
+			 */
+			Biquad (double samplerate);
+			Biquad (const Biquad &other);
+
+			/** process audio data
+			 *
+			 * @param data pointer to audio-data
+			 * @param n_samples number of samples to process
+			 */
+			void run (float *data, const uint32_t n_samples);
+			/** setup filter, compute coefficients
+			 *
+			 * @param t filter type (LowPass, HighPass, etc)
+			 * @param freq filter frequency
+			 * @param Q filter quality
+			 * @param gain filter gain
+			 */
+			void compute (Type t, double freq, double Q, double gain);
+
+			/** setup filter, set coefficients directly */
+			void configure (double a1, double a2, double b0, double b1, double b2);
+
+			/** filter transfer function (filter response for spectrum visualization)
+			 * @param freq frequency
+			 * @return gain at given frequency in dB (clamped to -120..+120)
+			 */
+			float dB_at_freq (float freq) const;
+
+			/** reset filter state */
+			void reset () { _z1 = _z2 = 0.0; }
+		private:
+			double _rate;
+			float  _z1, _z2;
+			double _a1, _a2;
+			double _b0, _b1, _b2;
+	};
+
+	class LIBARDOUR_API FFTSpectrum {
+		public:
+			FFTSpectrum (uint32_t window_size, double rate);
+			~FFTSpectrum ();
+
+			/** set data to be analyzed and pre-process with hanning window
+			 * n_samples + offset must not be larger than the configured window_size
+			 *
+			 * @param data raw audio data
+			 * @param n_samples number of samples to write to analysis buffer
+			 * @param offset destination offset
+			 */
+			void set_data_hann (float const * const data, const uint32_t n_samples, const uint32_t offset = 0);
+
+			/** process current data in buffer */
+			void execute ();
+
+			/** query
+			 * @param bin the frequency bin 0 .. window_size / 2
+			 * @param norm gain factor (set equal to @bin for 1/f normalization)
+			 * @return signal power at given bin (in dBFS)
+			 */
+			float power_at_bin (const uint32_t bin, const float norm = 1.f) const;
+
+			float freq_at_bin (const uint32_t bin) const {
+				return bin * _fft_freq_per_bin;
+			}
+
+		private:
+			static Glib::Threads::Mutex fft_planner_lock;
+			float* hann_window;
+
+			void init (uint32_t window_size, double rate);
+			void reset ();
+
+			uint32_t _fft_window_size;
+			uint32_t _fft_data_size;
+			double   _fft_freq_per_bin;
+
+			float* _fft_data_in;
+			float* _fft_data_out;
+			float* _fft_power;
+
+			fftwf_plan _fftplan;
+	};
+
+} } /* namespace */
+#endif
diff --git a/libs/ardour/ardour/export_format_manager.h b/libs/ardour/ardour/export_format_manager.h
index fff9729..5a78708 100644
--- a/libs/ardour/ardour/export_format_manager.h
+++ b/libs/ardour/ardour/export_format_manager.h
@@ -109,7 +109,10 @@ class LIBARDOUR_API ExportFormatManager : public PBD::ScopedConnectionList
 	void select_trim_end (bool value);
 	void select_silence_end (AnyTime const & time);
 	void select_normalize (bool value);
-	void select_normalize_target (float value);
+	void select_normalize_loudness (bool value);
+	void select_normalize_dbfs (float value);
+	void select_normalize_lufs (float value);
+	void select_normalize_dbtp (float value);
 	void select_tagging (bool tag);
 
   private:
diff --git a/libs/ardour/ardour/export_format_specification.h b/libs/ardour/ardour/export_format_specification.h
index 89ce0e5..d473d20 100644
--- a/libs/ardour/ardour/export_format_specification.h
+++ b/libs/ardour/ardour/export_format_specification.h
@@ -91,7 +91,10 @@ class LIBARDOUR_API ExportFormatSpecification : public ExportFormatBase {
 	void set_trim_beginning (bool value) { _trim_beginning = value; }
 	void set_trim_end (bool value) { _trim_end = value; }
 	void set_normalize (bool value) { _normalize = value; }
-	void set_normalize_target (float value) { _normalize_target = value; }
+	void set_normalize_loudness (bool value) { _normalize_loudness = value; }
+	void set_normalize_dbfs (float value) { _normalize_dbfs = value; }
+	void set_normalize_lufs (float value) { _normalize_lufs = value; }
+	void set_normalize_dbtp (float value) { _normalize_dbtp = value; }
 
 	void set_tag (bool tag_it) { _tag = tag_it; }
 	void set_with_cue (bool yn) { _with_cue = yn; }
@@ -157,7 +160,10 @@ class LIBARDOUR_API ExportFormatSpecification : public ExportFormatBase {
 	bool trim_beginning () const { return _trim_beginning; }
 	bool trim_end () const { return _trim_end; }
 	bool normalize () const { return _normalize; }
-	float normalize_target () const { return _normalize_target; }
+	bool normalize_loudness () const { return _normalize_loudness; }
+	float normalize_dbfs () const { return _normalize_dbfs; }
+	float normalize_lufs () const { return _normalize_lufs; }
+	float normalize_dbtp () const { return _normalize_dbtp; }
 	bool with_toc() const { return _with_toc; }
 	bool with_cue() const { return _with_cue; }
 	bool with_mp4chaps() const { return _with_mp4chaps; }
@@ -211,7 +217,10 @@ class LIBARDOUR_API ExportFormatSpecification : public ExportFormatBase {
 	Time            _silence_end;
 
 	bool            _normalize;
-	float           _normalize_target;
+	bool            _normalize_loudness;
+	float           _normalize_dbfs;
+	float           _normalize_lufs;
+	float           _normalize_dbtp;
 	bool            _with_toc;
 	bool            _with_cue;
 	bool            _with_mp4chaps;
diff --git a/libs/ardour/ardour/export_graph_builder.h b/libs/ardour/ardour/export_graph_builder.h
index 0a9912e..c9671d7 100644
--- a/libs/ardour/ardour/export_graph_builder.h
+++ b/libs/ardour/ardour/export_graph_builder.h
@@ -32,6 +32,7 @@
 namespace AudioGrapher {
 	class SampleRateConverter;
 	class PeakReader;
+	class LoudnessReader;
 	class Normalizer;
 	class Analyser;
 	template <typename T> class Chunker;
@@ -67,14 +68,15 @@ class LIBARDOUR_API ExportGraphBuilder
 	~ExportGraphBuilder ();
 
 	int process (framecnt_t frames, bool last_cycle);
-	bool process_normalize (); // returns true when finished
-	bool will_normalize() { return !normalizers.empty(); }
-	unsigned get_normalize_cycle_count() const;
+	bool post_process (); // returns true when finished
+	bool need_postprocessing () const { return !intermediates.empty(); }
+	bool realtime() const { return _realtime; }
+	unsigned get_postprocessing_cycle_count() const;
 
 	void reset ();
 	void cleanup (bool remove_out_files = false);
 	void set_current_timespan (boost::shared_ptr<ExportTimespan> span);
-	void add_config (FileSpec const & config);
+	void add_config (FileSpec const & config, bool rt);
 	void get_analysis_results (AnalysisResults& results);
 
   private:
@@ -145,41 +147,45 @@ class LIBARDOUR_API ExportGraphBuilder
 		ShortConverterPtr short_converter;
 	};
 
-	class Normalizer {
+	class Intermediate {
 	                                        public:
-		Normalizer (ExportGraphBuilder & parent, FileSpec const & new_config, framecnt_t max_frames);
+		Intermediate (ExportGraphBuilder & parent, FileSpec const & new_config, framecnt_t max_frames);
 		FloatSinkPtr sink ();
 		void add_child (FileSpec const & new_config);
 		void remove_children (bool remove_out_files);
 		bool operator== (FileSpec const & other_config) const;
 
-		unsigned get_normalize_cycle_count() const;
+		unsigned get_postprocessing_cycle_count() const;
 
 		/// Returns true when finished
 		bool process ();
 
 	                                        private:
 		typedef boost::shared_ptr<AudioGrapher::PeakReader> PeakReaderPtr;
+		typedef boost::shared_ptr<AudioGrapher::LoudnessReader> LoudnessReaderPtr;
 		typedef boost::shared_ptr<AudioGrapher::Normalizer> NormalizerPtr;
 		typedef boost::shared_ptr<AudioGrapher::TmpFile<Sample> > TmpFilePtr;
 		typedef boost::shared_ptr<AudioGrapher::Threader<Sample> > ThreaderPtr;
 		typedef boost::shared_ptr<AudioGrapher::AllocatingProcessContext<Sample> > BufferPtr;
 
-		void start_post_processing();
+		void prepare_post_processing ();
+		void start_post_processing ();
 
 		ExportGraphBuilder & parent;
 
 		FileSpec        config;
 		framecnt_t      max_frames_out;
-
+		bool            use_loudness;
+		bool            use_peak;
 		BufferPtr       buffer;
 		PeakReaderPtr   peak_reader;
 		TmpFilePtr      tmp_file;
 		NormalizerPtr   normalizer;
 		ThreaderPtr     threader;
+		LoudnessReaderPtr    loudness_reader;
 		boost::ptr_list<SFC> children;
 
-		PBD::ScopedConnection post_processing_connection;
+		PBD::ScopedConnectionList post_processing_connection;
 	};
 
 	// sample rate converter
@@ -201,7 +207,7 @@ class LIBARDOUR_API ExportGraphBuilder
 		ExportGraphBuilder &  parent;
 		FileSpec              config;
 		boost::ptr_list<SFC>  children;
-		boost::ptr_list<Normalizer> normalized_children;
+		boost::ptr_list<Intermediate> intermediate_children;
 		SRConverterPtr        converter;
 		framecnt_t            max_frames_out;
 	};
@@ -257,10 +263,12 @@ class LIBARDOUR_API ExportGraphBuilder
 
 	framecnt_t process_buffer_frames;
 
-	std::list<Normalizer *> normalizers;
+	std::list<Intermediate *> intermediates;
 
 	AnalysisMap analysis_map;
 
+	bool _realtime;
+
 	Glib::ThreadPool thread_pool;
 };
 
diff --git a/libs/ardour/ardour/export_handler.h b/libs/ardour/ardour/export_handler.h
index 3d92888..5ed1c0b 100644
--- a/libs/ardour/ardour/export_handler.h
+++ b/libs/ardour/ardour/export_handler.h
@@ -34,7 +34,7 @@
 #include "ardour/types.h"
 #include "pbd/signals.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 namespace AudioGrapher {
 	class BroadcastInfo;
@@ -72,6 +72,7 @@ class LIBARDOUR_API ExportElementFactory
 	Session & session;
 };
 
+/** Export Handler */
 class LIBARDOUR_API ExportHandler : public ExportElementFactory, public sigc::trackable
 {
   public:
@@ -138,13 +139,13 @@ class LIBARDOUR_API ExportHandler : public ExportElementFactory, public sigc::tr
 	typedef std::multimap<ExportTimespanPtr, FileSpec> ConfigMap;
 	ConfigMap          config_map;
 
-	bool               normalizing;
+	bool               post_processing;
 
 	/* Timespan management */
 
 	void start_timespan ();
 	int  process_timespan (framecnt_t frames);
-	int  process_normalize ();
+	int  post_process ();
 	void finish_timespan ();
 
 	typedef std::pair<ConfigMap::iterator, ConfigMap::iterator> TimespanBounds;
diff --git a/libs/ardour/ardour/export_profile_manager.h b/libs/ardour/ardour/export_profile_manager.h
index 2757795..b0285f8 100644
--- a/libs/ardour/ardour/export_profile_manager.h
+++ b/libs/ardour/ardour/export_profile_manager.h
@@ -65,6 +65,8 @@ class LIBARDOUR_API ExportProfileManager
 	void load_profile ();
 	void prepare_for_export ();
 
+	ExportType type () const { return _type; }
+
 	typedef std::list<ExportPresetPtr> PresetList;
 
 	PresetList const & get_presets () { return preset_list; }
@@ -79,7 +81,7 @@ class LIBARDOUR_API ExportProfileManager
 	typedef std::pair<PBD::UUID, std::string> FilePair;
 	typedef std::map<PBD::UUID, std::string> FileMap;
 
-	ExportType type;
+	ExportType  _type;
 	std::string xml_node_name;
 	HandlerPtr  handler;
 	Session &   session;
diff --git a/libs/ardour/ardour/export_status.h b/libs/ardour/ardour/export_status.h
index f250ae0..99642a2 100644
--- a/libs/ardour/ardour/export_status.h
+++ b/libs/ardour/ardour/export_status.h
@@ -62,6 +62,7 @@ class LIBARDOUR_API ExportStatus {
 	volatile enum Progress {
 		Exporting,
 		Normalizing,
+		Encoding,
 		Tagging,
 		Uploading,
 		Command }
@@ -77,8 +78,8 @@ class LIBARDOUR_API ExportStatus {
 	volatile framecnt_t     total_frames_current_timespan;
 	volatile framecnt_t     processed_frames_current_timespan;
 
-	volatile uint32_t       total_normalize_cycles;
-	volatile uint32_t       current_normalize_cycle;
+	volatile uint32_t       total_postprocessing_cycles;
+	volatile uint32_t       current_postprocessing_cycle;
 
 	AnalysisResults         result_map;
 
diff --git a/libs/ardour/ardour/export_timespan.h b/libs/ardour/ardour/export_timespan.h
index 754335b..d4631cb 100644
--- a/libs/ardour/ardour/export_timespan.h
+++ b/libs/ardour/ardour/export_timespan.h
@@ -53,6 +53,9 @@ class LIBARDOUR_API ExportTimespan
 	std::string range_id () const { return _range_id; }
 	void set_range_id (std::string range_id) { _range_id = range_id; }
 
+	bool realtime () const { return _realtime; }
+	void set_realtime (bool rt) { _realtime = rt; }
+
 	void set_range (framepos_t start, framepos_t end);
 	framecnt_t get_length () const { return end_frame - start_frame; }
 	framepos_t get_start () const { return start_frame; }
@@ -76,6 +79,7 @@ class LIBARDOUR_API ExportTimespan
 
 	std::string _name;
 	std::string _range_id;
+	bool        _realtime;
 
 };
 
diff --git a/libs/ardour/ardour/fixed_delay.h b/libs/ardour/ardour/fixed_delay.h
new file mode 100644
index 0000000..21eaa65
--- /dev/null
+++ b/libs/ardour/ardour/fixed_delay.h
@@ -0,0 +1,112 @@
+/*
+ * Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+
+#ifndef __ardour_fixed_delay_h__
+#define __ardour_fixed_delay_h__
+
+#include <vector>
+#include "ardour/buffer.h"
+
+namespace ARDOUR {
+
+class ChanCount;
+
+/** Multichannel Audio/Midi Delay Line
+ *
+ * This is an efficient delay line operating directly on Ardour buffers.
+ * The drawback is that there is no thread safety:
+ * All calls need to be executed in the same thread.
+ *
+ * After configuration, the delay can be changed safely up to the maximum
+ * configured delay but doing so flushes the buffer. There is no de-clicking
+ * (see ARDOUR::Delayline for those cases).
+ *
+ * Increasing the delay above the max configured or requesting more
+ * buffers will allocate the required space (not realtime safe).
+ *
+ * All buffers part of the set are treated separately.
+ */
+class LIBARDOUR_API FixedDelay
+{
+public:
+	FixedDelay ();
+	~FixedDelay ();
+
+	/** initial configuration, usually done after instantiation
+	 *
+	 * @param count Channel Count (audio+midi)
+	 * @param max_delay the maximum number of samples to delay
+	 * @param shrink when false already allocated buffers are kept if both channel-count and max-delay requirements are satisified
+	 */
+	void configure (const ChanCount& count, framecnt_t max_delay, bool shrink = true);
+
+	/** set delay time and update active process buffers
+	 *
+	 * This calls configure with shrink = false and sets the current delay time
+	 * if the delay time mismatches, the buffers are silenced (zeroed).
+	 *
+	 * @param count channels to be processed
+	 * @param delay number of audio samples to delay
+	 */
+	void set (const ChanCount& count, framecnt_t delay);
+
+	/** process a channel
+	 *
+	 * Read N samples from the input buffer, delay them by the configured delay-time and write
+	 * the delayed samples to the output buffer at the given offset.
+	 *
+	 * @param dt datatype
+	 * @param id buffer number (starting at 0)
+	 * @param out output buffer to write data to
+	 * @param in input buffer to read data from
+	 * @param n_samples number of samples to process (must be <= 8192)
+	 * @param dst_offset offset in output buffer to start writing to
+	 * @param src_offset offset in input buffer to start reading from
+	 */
+	void delay (ARDOUR::DataType dt, uint32_t id, Buffer& out, const Buffer& in, pframes_t n_samples, framecnt_t dst_offset = 0, framecnt_t src_offset = 0);
+
+	/** zero all buffers */
+	void flush();
+
+private:
+	framecnt_t _max_delay;
+	framecnt_t _buf_size;
+	framecnt_t _delay;
+	ChanCount  _count;
+
+	struct DelayBuffer {
+		public:
+		DelayBuffer () : buf (0), pos (0) {}
+		DelayBuffer (DataType dt, size_t capacity)
+			: buf (Buffer::create (dt, capacity)), pos (0) {}
+		~DelayBuffer () { delete buf; }
+		Buffer * buf;
+		framepos_t pos;
+	};
+
+	typedef std::vector<DelayBuffer*> BufferVec;
+	// Vector of vectors, indexed by DataType
+	std::vector<BufferVec> _buffers;
+
+	void ensure_buffers(DataType type, size_t num_buffers, size_t buffer_capacity);
+	void clear ();
+};
+
+} // namespace ARDOUR
+
+#endif // __ardour_fixed_delay_h__
diff --git a/libs/ardour/ardour/gain_control.h b/libs/ardour/ardour/gain_control.h
index 07a900a..f72320f 100644
--- a/libs/ardour/ardour/gain_control.h
+++ b/libs/ardour/ardour/gain_control.h
@@ -20,27 +20,25 @@
 #define __ardour_gain_control_h__
 
 #include <string>
+
 #include <boost/shared_ptr.hpp>
 
 #include "pbd/controllable.h"
 
 #include "evoral/Parameter.hpp"
 
-#include "ardour/automation_control.h"
+#include "ardour/slavable_automation_control.h"
 #include "ardour/libardour_visibility.h"
 
 namespace ARDOUR {
 
 class Session;
 
-class LIBARDOUR_API GainControl : public AutomationControl {
+class LIBARDOUR_API GainControl : public SlavableAutomationControl {
   public:
 	GainControl (Session& session, const Evoral::Parameter &param,
 	             boost::shared_ptr<AutomationList> al = boost::shared_ptr<AutomationList>());
 
-	void set_value (double val, PBD::Controllable::GroupControlDisposition group_override);
-	void set_value_unchecked (double);
-
 	double internal_to_interface (double) const;
 	double interface_to_internal (double) const;
 	double internal_to_user (double) const;
@@ -49,8 +47,14 @@ class LIBARDOUR_API GainControl : public AutomationControl {
 
 	double lower_db;
 	double range_db;
+
+	int set_state (XMLNode const&, int);
+	XMLNode& get_state();
+
+	void inc_gain (gain_t);
+
   private:
-	void _set_value (double val, PBD::Controllable::GroupControlDisposition group_override);
+	void recompute_masters_ratios (double val);
 };
 
 } /* namespace */
diff --git a/libs/ardour/ardour/instrument_info.h b/libs/ardour/ardour/instrument_info.h
index 745e480..8e08c8b 100644
--- a/libs/ardour/ardour/instrument_info.h
+++ b/libs/ardour/ardour/instrument_info.h
@@ -52,6 +52,7 @@ class LIBARDOUR_API InstrumentInfo {
     void set_internal_instrument (boost::shared_ptr<ARDOUR::Processor>);
 
     std::string get_patch_name (uint16_t bank, uint8_t program, uint8_t channel) const;
+    std::string get_patch_name_without (uint16_t bank, uint8_t program, uint8_t channel) const;
     std::string get_controller_name (Evoral::Parameter param) const;
     std::string get_instrument_name () const;
 
@@ -70,6 +71,7 @@ class LIBARDOUR_API InstrumentInfo {
     boost::shared_ptr<MIDI::Name::ChannelNameSet> plugin_programs_to_channel_name_set (boost::shared_ptr<Processor> p);
     std::string get_plugin_patch_name (boost::shared_ptr<ARDOUR::Processor>, uint16_t bank, uint8_t program, uint8_t channel) const;
 
+    std::string get_patch_name (uint16_t bank, uint8_t program, uint8_t channel, bool with_extra) const;
     static MIDI::Name::PatchNameList _gm_patches;
 };
 
diff --git a/libs/ardour/ardour/internal_return.h b/libs/ardour/ardour/internal_return.h
index d12b330..48fcab1 100644
--- a/libs/ardour/ardour/internal_return.h
+++ b/libs/ardour/ardour/internal_return.h
@@ -37,7 +37,7 @@ class LIBARDOUR_API InternalReturn : public Return
 	XMLNode& state (bool full);
 	XMLNode& get_state ();
 
-	void run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, bool);
+	void run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, double speed, pframes_t nframes, bool);
 	bool configure_io (ChanCount, ChanCount);
 	bool can_support_io_configuration (const ChanCount& in, ChanCount& out);
 
diff --git a/libs/ardour/ardour/internal_send.h b/libs/ardour/ardour/internal_send.h
index 71d8049..263c40b 100644
--- a/libs/ardour/ardour/internal_send.h
+++ b/libs/ardour/ardour/internal_send.h
@@ -40,7 +40,7 @@ class LIBARDOUR_API InternalSend : public Send
 	int set_state(const XMLNode& node, int version);
 
 	void cycle_start (pframes_t);
-	void run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, bool);
+	void run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, double speed, pframes_t nframes, bool);
 	bool feeds (boost::shared_ptr<Route> other) const;
 	bool can_support_io_configuration (const ChanCount& in, ChanCount& out);
 	bool configure_io (ChanCount in, ChanCount out);
diff --git a/libs/ardour/ardour/io.h b/libs/ardour/ardour/io.h
index 9afd016..db0f2c3 100644
--- a/libs/ardour/ardour/io.h
+++ b/libs/ardour/ardour/io.h
@@ -74,8 +74,8 @@ class LIBARDOUR_API IO : public SessionObject, public Latent
 		Output
 	};
 
-        IO (Session&, const std::string& name, Direction, DataType default_type = DataType::AUDIO, bool sendish = false);
-        IO (Session&, const XMLNode&, DataType default_type = DataType::AUDIO, bool sendish = false);
+	IO (Session&, const std::string& name, Direction, DataType default_type = DataType::AUDIO, bool sendish = false);
+	IO (Session&, const XMLNode&, DataType default_type = DataType::AUDIO, bool sendish = false);
 
 	virtual ~IO();
 
@@ -88,13 +88,15 @@ class LIBARDOUR_API IO : public SessionObject, public Latent
 	void set_active(bool yn) { _active = yn; }
 
 	bool set_name (const std::string& str);
+	void set_pretty_name (const std::string& str);
+	std::string pretty_name () const { return _pretty_name_prefix; }
 
 	virtual void silence (framecnt_t);
 	void increment_port_buffer_offset (pframes_t offset);
 
 	int ensure_io (ChanCount cnt, bool clear, void *src);
 
-        int connect_ports_to_bundle (boost::shared_ptr<Bundle>, bool exclusive, void *);
+	int connect_ports_to_bundle (boost::shared_ptr<Bundle>, bool exclusive, void *);
 	int disconnect_ports_from_bundle (boost::shared_ptr<Bundle>, void *);
 
 	BundleList bundles_connected ();
@@ -192,7 +194,7 @@ class LIBARDOUR_API IO : public SessionObject, public Latent
 	/* three utility functions - this just seems to be simplest place to put them */
 
 	void collect_input (BufferSet& bufs, pframes_t nframes, ChanCount offset);
-	void process_input (boost::shared_ptr<Processor>, framepos_t start_frame, framepos_t end_frame, pframes_t nframes);
+	void process_input (boost::shared_ptr<Processor>, framepos_t start_frame, framepos_t end_frame, double speed, pframes_t nframes);
 	void copy_to_outputs (BufferSet& bufs, DataType type, pframes_t nframes, framecnt_t offset);
 
 	/* AudioTrack::deprecated_use_diskstream_connections() needs these */
@@ -207,7 +209,7 @@ class LIBARDOUR_API IO : public SessionObject, public Latent
 	Direction _direction;
 	DataType _default_type;
 	bool     _active;
-        bool     _sendish;
+	bool     _sendish;
 
   private:
 	int connecting_became_legal ();
@@ -248,6 +250,8 @@ class LIBARDOUR_API IO : public SessionObject, public Latent
 	void setup_bundle ();
 	std::string bundle_channel_name (uint32_t, uint32_t, DataType) const;
 
+	void apply_pretty_name ();
+	std::string _pretty_name_prefix;
 	BufferSet _buffers;
 	void disconnect_check (boost::shared_ptr<ARDOUR::Port>, boost::shared_ptr<ARDOUR::Port>);
 };
diff --git a/libs/ardour/ardour/io_processor.h b/libs/ardour/ardour/io_processor.h
index a273545..15bd74d 100644
--- a/libs/ardour/ardour/io_processor.h
+++ b/libs/ardour/ardour/io_processor.h
@@ -64,7 +64,7 @@ class LIBARDOUR_API IOProcessor : public Processor
 	void set_input (boost::shared_ptr<IO>);
 	void set_output (boost::shared_ptr<IO>);
 
-	void silence (framecnt_t nframes);
+	void silence (framecnt_t nframes, framepos_t start_frame);
 	void disconnect ();
 
 	void increment_port_buffer_offset (pframes_t);
diff --git a/libs/ardour/ardour/io_vector.h b/libs/ardour/ardour/io_vector.h
new file mode 100644
index 0000000..0c68f97
--- /dev/null
+++ b/libs/ardour/ardour/io_vector.h
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+ * Copyright (C) 2006 Paul Davis
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+
+#ifndef __ardour_io_vector_h__
+#define __ardour_io_vector_h__
+
+#include <vector>
+#include <boost/shared_ptr.hpp>
+#include "ardour/io.h"
+
+namespace ARDOUR {
+
+class IOVector : public std::vector<boost::weak_ptr<ARDOUR::IO> >
+{
+public:
+#if 0 // unused -- for future reference
+	bool connected_to (const IOVector& other) const {
+		for (IOVector::const_iterator i = other.begin(); i != other.end(); ++i) {
+			boost::shared_ptr<const IO> io = i->lock();
+			if (!io) continue;
+			if (connected_to (io)) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+	bool connected_to (boost::shared_ptr<const IO> other) const {
+		for (IOVector::const_iterator i = begin(); i != end(); ++i) {
+			boost::shared_ptr<const IO> io = i->lock();
+			if (!io) continue;
+			if (io->connected_to (other)) {
+				return true;
+			}
+		}
+		return false;
+	}
+#endif
+
+	bool fed_by (boost::shared_ptr<const IO> other) const {
+		for (IOVector::const_iterator i = begin(); i != end(); ++i) {
+			boost::shared_ptr<const IO> io = i->lock();
+			if (!io) continue;
+			if (other->connected_to (io)) {
+				return true;
+			}
+		}
+		return false;
+	}
+};
+
+} // namespace ARDOUR
+
+
+#endif
diff --git a/libs/ardour/ardour/ladspa_plugin.h b/libs/ardour/ardour/ladspa_plugin.h
index 6fd214d..dbb635f 100644
--- a/libs/ardour/ardour/ladspa_plugin.h
+++ b/libs/ardour/ardour/ladspa_plugin.h
@@ -83,6 +83,7 @@ class LIBARDOUR_API LadspaPlugin : public ARDOUR::Plugin
 	int set_block_size (pframes_t /*nframes*/) { return 0; }
 
 	int connect_and_run (BufferSet& bufs,
+			framepos_t start, framepos_t end, double speed,
 			ChanMapping in, ChanMapping out,
 			pframes_t nframes, framecnt_t offset);
 
diff --git a/libs/ardour/ardour/location.h b/libs/ardour/ardour/location.h
index f564757..6b61dae 100644
--- a/libs/ardour/ardour/location.h
+++ b/libs/ardour/ardour/location.h
@@ -41,6 +41,7 @@ namespace ARDOUR {
 
 class SceneChange;
 
+/** Location on Timeline - abstract representation for Markers, Loop/Punch Ranges, CD-Markers etc. */
 class LIBARDOUR_API Location : public SessionHandleRef, public PBD::StatefulDestructible
 {
   public:
@@ -150,9 +151,9 @@ class LIBARDOUR_API Location : public SessionHandleRef, public PBD::StatefulDest
   private:
 	std::string        _name;
 	framepos_t         _start;
-	Timecode::BBT_Time _bbt_start;
+	double             _bbt_start;
 	framepos_t         _end;
-	Timecode::BBT_Time _bbt_end;
+	double             _bbt_end;
 	Flags              _flags;
 	bool               _locked;
 	PositionLockStyle  _position_lock_style;
@@ -163,6 +164,7 @@ class LIBARDOUR_API Location : public SessionHandleRef, public PBD::StatefulDest
 	void recompute_bbt_from_frames ();
 };
 
+/** A collection of session locations including unique dedicated locations (loop, punch, etc) */
 class LIBARDOUR_API Locations : public SessionHandleRef, public PBD::StatefulDestructible
 {
   public:
@@ -171,7 +173,8 @@ class LIBARDOUR_API Locations : public SessionHandleRef, public PBD::StatefulDes
 	Locations (Session &);
 	~Locations ();
 
-	const LocationList& list() { return locations; }
+	const LocationList& list () const { return locations; }
+	LocationList list () { return locations; }
 
 	void add (Location *, bool make_current = false);
 	void remove (Location *);
diff --git a/libs/ardour/ardour/lua_api.h b/libs/ardour/ardour/lua_api.h
new file mode 100644
index 0000000..9af9649
--- /dev/null
+++ b/libs/ardour/ardour/lua_api.h
@@ -0,0 +1,226 @@
+/*
+ * Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ *
+ */
+#ifndef _ardour_lua_api_h_
+#define _ardour_lua_api_h_
+
+#include <string>
+#include <lo/lo.h>
+#include <boost/shared_ptr.hpp>
+
+#include "ardour/libardour_visibility.h"
+
+#include "ardour/processor.h"
+#include "ardour/session.h"
+
+namespace ARDOUR { namespace LuaAPI {
+
+	/** convenience constructor for DataType::NIL with managed lifetime
+	 * @returns DataType::NIL
+	 */
+	int datatype_ctor_null (lua_State *lua);
+	/** convenience constructor for DataType::AUDIO with managed lifetime
+	 * @returns DataType::AUDIO
+	 */
+	int datatype_ctor_audio (lua_State *L);
+	/** convenience constructor for DataType::MIDI with managed lifetime
+	 * @returns DataType::MIDI
+	 */
+	int datatype_ctor_midi (lua_State *L);
+
+	/** Create a null processor shared pointer
+	 *
+	 * This is useful for Track:bounce() to indicate no processing.
+	 */
+	boost::shared_ptr<ARDOUR::Processor> nil_processor ();
+
+	/** create a new Lua Processor (Plugin)
+	 *
+	 * @param s Session Handle
+	 * @param p Identifier or Name of the Processor
+	 * @returns Processor object (may be nil)
+	 */
+	boost::shared_ptr<ARDOUR::Processor> new_luaproc (ARDOUR::Session *s, const std::string& p);
+
+	/** search a Plugin
+	 *
+	 * @param id Plugin Name, ID or URI
+	 * @param type Plugin Type
+	 * @returns PluginInfo or nil if not found
+	 */
+	boost::shared_ptr<ARDOUR::PluginInfo> new_plugin_info (const std::string& id, ARDOUR::PluginType type);
+
+	/** create a new Plugin Instance
+	 *
+	 * @param s Session Handle
+	 * @param id Plugin Name, ID or URI
+	 * @param type Plugin Type
+	 * @returns Processor or nil
+	 */
+	boost::shared_ptr<ARDOUR::Processor> new_plugin (ARDOUR::Session *s, const std::string& id, ARDOUR::PluginType type, const std::string& preset = "");
+
+	/** set a plugin control-input parameter value
+	 *
+	 * @param proc Plugin-Processor
+	 * @param which control-input to set (starting at 0)
+	 * @param value value to set
+	 * @returns true on success, false on error or out-of-bounds value
+	 */
+	bool set_processor_param (boost::shared_ptr<ARDOUR::Processor> proc, uint32_t which, float val);
+	/** set a plugin control-input parameter value
+	 *
+	 * This is a wrapper around set_processor_param which looks up the Processor by plugin-insert.
+	 *
+	 * @param proc Plugin-Insert
+	 * @param which control-input to set (starting at 0)
+	 * @param value value to set
+	 * @returns true on success, false on error or out-of-bounds value
+	 */
+	bool set_plugin_insert_param (boost::shared_ptr<ARDOUR::PluginInsert> pi, uint32_t which, float val);
+
+	/**
+	 * A convenience function to get a Automation Lists and ParamaterDescriptor
+	 * for a given plugin control.
+	 *
+	 * This is equivalent to the following lua code
+	 * @code
+	 * function (processor, param_id)
+	 *  local plugininsert = processor:to_insert ()
+	 *  local plugin = plugininsert:plugin(0)
+	 *  local _, t = plugin:get_parameter_descriptor(param_id, ARDOUR.ParameterDescriptor ())
+	 *  local ctrl = Evoral.Parameter (ARDOUR.AutomationType.PluginAutomation, 0, param_id)
+	 *  local ac = pi:automation_control (ctrl, false)
+	 *  local acl = ac:alist()
+	 *  return ac:alist(), ac:to_ctrl():list(), t[2]
+	 * end
+	 * @endcode
+	 *
+	 * Example usage: get the third input parameter of first plugin on the given route
+	 * (Ardour starts counting at zero).
+	 * @code
+	 * local al, cl, pd = ARDOUR.LuaAPI.plugin_automation (route:nth_plugin (0), 3)
+	 * @endcode
+	 * @returns 3 parameters: AutomationList, ControlList, ParamaterDescriptor
+	 */
+	int plugin_automation (lua_State *lua);
+
+	/**
+	 * A convenience function for colorspace HSL to RGB conversion.
+	 * All ranges are 0..1
+	 *
+	 * Example:
+	 * @code
+	 * local r, g, b, a = ARDOUR.LuaAPI.hsla_to_rgba (hue, saturation, luminosity, alpha)
+	 * @endcode
+	 * @returns 4 parameters: red, green, blue, alpha (in range 0..1)
+	 */
+	int hsla_to_rgba (lua_State *lua);
+} } /* namespace */
+
+namespace ARDOUR { namespace LuaOSC {
+	/** OSC transmitter
+	 *
+	 * A Class to send OSC messages.
+	 */
+	class Address {
+		/*
+		 * OSC is kinda special, lo_address is a void* and lo_send() has varags
+		 * and typed arguments which makes it hard to bind, even lo_cpp.
+		 */
+		public:
+			/** Construct a new OSC transmitter object
+			 * @param uri the destination uri e.g. "osc.udp://localhost:7890"
+			 */
+			Address (std::string uri) {
+				_addr = lo_address_new_from_url (uri.c_str());
+			}
+
+			~Address () { if (_addr) { lo_address_free (_addr); } }
+			/** Transmit an OSC message
+			 *
+			 * Path (string) and type (string) must always be given.
+			 * The number of following args must match the type.
+			 * Supported types are:
+			 *
+			 *  'i': integer (lua number)
+			 *
+			 *  'f': float (lua number)
+			 *
+			 *  'd': double (lua number)
+			 *
+			 *  'h': 64bit integer (lua number)
+			 *
+			 *  's': string (lua string)
+			 *
+			 *  'c': character (lua string)
+			 *
+			 *  'T': boolean (lua bool) -- this is not implicily True, a lua true/false must be given
+			 *
+			 *  'F': boolean (lua bool) -- this is not implicily False, a lua true/false must be given
+			 *
+			 * @param lua: lua arguments: path, types, ...
+			 * @returns boolean true if successful, false on error.
+			 */
+			int send (lua_State *lua);
+		private:
+			lo_address _addr;
+	};
+
+}
+
+class LuaTableRef {
+	public:
+		LuaTableRef ();
+		~LuaTableRef ();
+
+		int get (lua_State* L);
+		int set (lua_State* L);
+
+	private:
+		struct LuaTableEntry {
+			LuaTableEntry (int kt, int vt)
+				: keytype (kt)
+				, valuetype (vt)
+			{ }
+
+			int keytype;
+			std::string k_s;
+			unsigned int k_n;
+
+			int valuetype;
+			// LUA_TUSERDATA
+			const void* c;
+			void* p;
+			// LUA_TBOOLEAN
+			bool b;
+			// LUA_TSTRING:
+			std::string s;
+			// LUA_TNUMBER:
+			double n;
+		};
+
+		std::vector<LuaTableEntry> _data;
+
+		static void* findclasskey (lua_State *L, const void* key);
+		template<typename T>
+		static void assign (luabridge::LuaRef* rv, T key, const LuaTableEntry& s);
+};
+
+} /* namespace */
+
+#endif // _ardour_lua_api_h_
diff --git a/libs/ardour/ardour/lua_script_params.h b/libs/ardour/ardour/lua_script_params.h
new file mode 100644
index 0000000..b636aad
--- /dev/null
+++ b/libs/ardour/ardour/lua_script_params.h
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ *
+ */
+#ifndef _ardour_lua_script_params_h_
+#define _ardour_lua_script_params_h_
+
+#include "ardour/libardour_visibility.h"
+#include "ardour/luascripting.h"
+
+namespace luabridge {
+	class LuaRef;
+}
+
+/* Semantically these are static functions of the LuaScripting class
+ * but are kept separately to minimize header includes.
+ *
+ * LuaScripting itself is a standalone abstraction (not depending on luabridge)
+ * luascripting.h is included by session.h (this file is not).
+ *
+ * The implementation of these functions is in libs/ardour/luascripting.cc
+ */
+namespace ARDOUR { namespace LuaScriptParams {
+
+	LIBARDOUR_API LuaScriptParamList script_params (LuaScriptInfoPtr, const std::string &);
+	LIBARDOUR_API LuaScriptParamList script_params (const std::string &, const std::string &, bool file=true);
+	LIBARDOUR_API void params_to_ref (luabridge::LuaRef *tbl_args, const LuaScriptParamList&);
+	LIBARDOUR_API void ref_to_params (LuaScriptParamList&, luabridge::LuaRef *tbl_args);
+
+} } // namespace
+
+#endif // _ardour_lua_script_params_h_
diff --git a/libs/ardour/ardour/luabindings.h b/libs/ardour/ardour/luabindings.h
new file mode 100644
index 0000000..4650858
--- /dev/null
+++ b/libs/ardour/ardour/luabindings.h
@@ -0,0 +1,40 @@
+/*
+    Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+
+    This program is free software; you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by the Free
+    Software Foundation; either version 2 of the License, or (at your option)
+    any later version.
+
+    This program is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc.,
+    675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#ifndef __ardour_luabindings_h__
+#define __ardour_luabindings_h__
+
+#include "lua/lua.h"
+#include "ardour/libardour_visibility.h"
+
+namespace ARDOUR {
+	class Session;
+	namespace LuaBindings {
+		LIBARDOUR_API extern void stddef (lua_State* L);
+
+		LIBARDOUR_API extern void common (lua_State* L);
+		LIBARDOUR_API extern void dsp (lua_State* L);
+		LIBARDOUR_API extern void session (lua_State* L);
+		LIBARDOUR_API extern void osc (lua_State* L);
+
+		LIBARDOUR_API extern void set_session (lua_State* L, Session *s);
+
+	} // namespace LuaBindings
+} // namespace ARDOUR
+
+#endif /* __ardour_luabindings_h__ */
diff --git a/libs/ardour/ardour/luaproc.h b/libs/ardour/ardour/luaproc.h
new file mode 100644
index 0000000..e38e8fb
--- /dev/null
+++ b/libs/ardour/ardour/luaproc.h
@@ -0,0 +1,213 @@
+/*
+    Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+    Copyright (C) 2006 Paul Davis
+
+    This program is free software; you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by the Free
+    Software Foundation; either version 2 of the License, or (at your option)
+    any later version.
+
+    This program is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc.,
+    675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+/* print runtime and garbage-collection timing statistics */
+//#define WITH_LUAPROC_STATS
+
+/* memory allocation system, default: ReallocPool */
+//#define USE_TLSF // use TLSF instead of ReallocPool
+//#define USE_MALLOC // or plain OS provided realloc (no mlock) -- if USE_TLSF isn't defined
+
+#ifndef __ardour_luaproc_h__
+#define __ardour_luaproc_h__
+
+#include <set>
+#include <vector>
+#include <string>
+
+#ifdef USE_TLSF
+#  include "pbd/tlsf.h"
+#else
+#  include "pbd/reallocpool.h"
+#endif
+
+#include "pbd/stateful.h"
+
+#include "ardour/types.h"
+#include "ardour/plugin.h"
+#include "ardour/luascripting.h"
+#include "ardour/dsp_filter.h"
+#include "ardour/lua_api.h"
+
+#include "lua/luastate.h"
+
+namespace luabridge {
+	class LuaRef;
+}
+
+namespace ARDOUR {
+
+class LIBARDOUR_API LuaProc : public ARDOUR::Plugin {
+public:
+	LuaProc (AudioEngine&, Session&, const std::string&);
+	LuaProc (const LuaProc &);
+	~LuaProc ();
+
+	/* Plugin interface */
+
+	std::string unique_id() const { return get_info()->unique_id; }
+	const char* name()  const { return get_info()->name.c_str(); }
+	const char* label() const { return get_info()->name.c_str(); }
+	const char* maker() const { return get_info()->creator.c_str(); }
+
+	uint32_t    parameter_count() const;
+	float       default_value (uint32_t port);
+	void        set_parameter (uint32_t port, float val);
+	float       get_parameter (uint32_t port) const;
+	int         get_parameter_descriptor (uint32_t which, ParameterDescriptor&) const;
+	uint32_t    nth_parameter (uint32_t port, bool& ok) const;
+
+	std::string get_docs () const { return _docs; }
+	std::string get_parameter_docs (uint32_t) const;
+
+	PluginOutputConfiguration possible_output () const { return _output_configs; }
+
+	std::set<Evoral::Parameter> automatable() const;
+
+	void activate () { }
+	void deactivate () { }
+	void cleanup () { }
+
+	int set_block_size (pframes_t /*nframes*/) { return 0; }
+	framecnt_t  signal_latency() const { return 0; }
+
+	int connect_and_run (BufferSet& bufs,
+			framepos_t start, framepos_t end, double speed,
+			ChanMapping in, ChanMapping out,
+			pframes_t nframes, framecnt_t offset);
+
+	std::string describe_parameter (Evoral::Parameter);
+	void        print_parameter (uint32_t, char*, uint32_t len) const;
+	boost::shared_ptr<ScalePoints> get_scale_points(uint32_t port_index) const;
+
+	bool parameter_is_audio (uint32_t) const { return false; }
+	bool parameter_is_control (uint32_t) const { return true; }
+	bool parameter_is_input (uint32_t) const;
+	bool parameter_is_output (uint32_t) const;
+
+	uint32_t designated_bypass_port () {
+		return _designated_bypass_port;
+	}
+
+	std::string state_node_name() const { return "luaproc"; }
+	void add_state (XMLNode *) const;
+	int set_state (const XMLNode&, int version);
+	int set_script_from_state (const XMLNode&);
+
+	bool load_preset (PresetRecord);
+	std::string do_save_preset (std::string);
+	void do_remove_preset (std::string);
+
+	bool has_editor() const { return false; }
+
+	bool can_support_io_configuration (const ChanCount& in, ChanCount& out, ChanCount* imprecise);
+	bool configure_io (ChanCount in, ChanCount out);
+
+	ChanCount output_streams() const { return _configured_out; }
+	ChanCount input_streams() const { return _configured_in; }
+
+	bool has_inline_display () { return _lua_has_inline_display; }
+	void setup_lua_inline_gui (LuaState *lua_gui);
+
+private:
+	void find_presets ();
+
+	/* END Plugin interface */
+protected:
+	const std::string& script() const { return _script; }
+
+private:
+#ifdef USE_TLSF
+	PBD::TLSF _mempool;
+#else
+	PBD::ReallocPool _mempool;
+#endif
+	LuaState lua;
+	luabridge::LuaRef * _lua_dsp;
+	std::string _script;
+	std::string _docs;
+	bool _lua_does_channelmapping;
+	bool _lua_has_inline_display;
+
+	void queue_draw () { QueueDraw(); /* EMIT SIGNAL */ }
+	DSP::DspShm* instance_shm () { return &lshm; }
+	DSP::DspShm lshm;
+
+	LuaTableRef* instance_ref () { return &lref; }
+	LuaTableRef lref;
+
+	void init ();
+	bool load_script ();
+	void lua_print (std::string s);
+
+	std::string preset_name_to_uri (const std::string&) const;
+	std::string presets_file () const;
+	XMLTree* presets_tree () const;
+
+	boost::shared_ptr<ScalePoints> parse_scale_points (luabridge::LuaRef*);
+
+	std::vector<std::pair<bool, int> > _ctrl_params;
+	std::map<int, ARDOUR::ParameterDescriptor> _param_desc;
+	std::map<int, std::string> _param_doc;
+	uint32_t _designated_bypass_port;
+
+	float* _control_data;
+	float* _shadow_data;
+
+	ChanCount _configured_in;
+	ChanCount _configured_out;
+
+	ChanCount _selected_in;
+	ChanCount _selected_out;
+
+	PluginOutputConfiguration _output_configs;
+
+	bool _has_midi_input;
+	bool _has_midi_output;
+
+#ifdef WITH_LUAPROC_STATS
+	int64_t _stats_avg[2];
+	int64_t _stats_max[2];
+	int64_t _stats_cnt;
+#endif
+};
+
+class LIBARDOUR_API LuaPluginInfo : public PluginInfo
+{
+  public:
+	LuaPluginInfo (LuaScriptInfoPtr lsi);
+	~LuaPluginInfo () { };
+
+	PluginPtr load (Session& session);
+	std::vector<Plugin::PresetRecord> get_presets (bool user_only) const;
+
+	bool in_category (const std::string &c) const {
+		return (category == c);
+	}
+	bool is_instrument () const { return _is_instrument; }
+	bool reconfigurable_io() const { return true; }
+
+	bool _is_instrument;
+};
+
+typedef boost::shared_ptr<LuaPluginInfo> LuaPluginInfoPtr;
+
+} // namespace ARDOUR
+
+#endif // __ardour_luaproc_h__
diff --git a/libs/ardour/ardour/luascripting.h b/libs/ardour/ardour/luascripting.h
new file mode 100644
index 0000000..1e7833f
--- /dev/null
+++ b/libs/ardour/ardour/luascripting.h
@@ -0,0 +1,133 @@
+/*
+ * Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ *
+ */
+#ifndef _ardour_luascripting_h_
+#define _ardour_luascripting_h_
+#include <vector>
+
+#include <boost/shared_ptr.hpp>
+#include <glibmm/threads.h>
+
+#include "pbd/signals.h"
+#include "ardour/libardour_visibility.h"
+
+namespace ARDOUR {
+
+class LIBARDOUR_API LuaScriptInfo {
+  public:
+
+	enum ScriptType {
+		Invalid,
+		DSP,
+		Session,
+		EditorHook,
+		EditorAction,
+		Snippet,
+	};
+
+	static std::string type2str (const ScriptType t);
+	static ScriptType str2type (const std::string& str);
+
+	LuaScriptInfo (ScriptType t, const std::string &n, const std::string &p, const std::string &uid)
+	: type (t)
+	, name (n)
+	, path (p)
+	, unique_id (uid)
+	{ }
+
+	virtual ~LuaScriptInfo () { }
+
+	ScriptType type;
+	std::string name;
+	std::string path;
+	std::string unique_id;
+
+	std::string author;
+	std::string license;
+	std::string category;
+	std::string description;
+};
+
+struct LIBARDOUR_API LuaScriptParam {
+	public:
+		LuaScriptParam (
+				const std::string& n,
+				const std::string& t,
+				const std::string& d,
+				bool o)
+			: name (n)
+			, title (t)
+			, dflt (d)
+			, optional (o)
+			, is_set (false)
+			, value (d)
+	{}
+
+		std::string name;
+		std::string title;
+		std::string dflt;
+		bool optional;
+		bool is_set;
+		std::string value;
+};
+
+
+typedef boost::shared_ptr<LuaScriptInfo> LuaScriptInfoPtr;
+typedef std::vector<LuaScriptInfoPtr> LuaScriptList;
+
+typedef boost::shared_ptr<LuaScriptParam> LuaScriptParamPtr;
+typedef std::vector<LuaScriptParamPtr> LuaScriptParamList;
+
+
+class LIBARDOUR_API LuaScripting {
+
+public:
+	static LuaScripting& instance();
+
+	~LuaScripting ();
+
+	LuaScriptList &scripts (LuaScriptInfo::ScriptType);
+	void refresh (bool run_scan = false);
+	PBD::Signal0<void> scripts_changed;
+
+	static LuaScriptInfoPtr script_info (const std::string &script);
+	static bool try_compile (const std::string&, const LuaScriptParamList&);
+	static std::string get_factory_bytecode (const std::string&);
+	static std::string user_script_dir ();
+
+private:
+	static LuaScripting* _instance; // singleton
+	LuaScripting ();
+
+	void scan ();
+	static LuaScriptInfoPtr scan_script (const std::string &, const std::string & sc = "");
+	static void lua_print (std::string s);
+
+	LuaScriptList *_sl_dsp;
+	LuaScriptList *_sl_session;
+	LuaScriptList *_sl_hook;
+	LuaScriptList *_sl_action;
+	LuaScriptList *_sl_snippet;
+	LuaScriptList  _empty_script_info;
+
+	Glib::Threads::Mutex _lock;
+};
+
+} // namespace ARDOUR
+
+#endif // _ardour_luascripting_h_
diff --git a/libs/ardour/ardour/lv2_extensions.h b/libs/ardour/ardour/lv2_extensions.h
new file mode 100644
index 0000000..64fc3bc
--- /dev/null
+++ b/libs/ardour/ardour/lv2_extensions.h
@@ -0,0 +1,174 @@
+/*
+  Copyright 2016 Robin Gareus <robin at gareus.org>
+
+  Permission to use, copy, modify, and/or distribute this software for any
+  purpose with or without fee is hereby granted, provided that the above
+  copyright notice and this permission notice appear in all copies.
+
+  THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+  WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+  MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+  ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+*/
+
+#ifndef _ardour_lv2_extensions_h_
+#define _ardour_lv2_extensions_h_
+
+#include "lv2/lv2plug.in/ns/lv2core/lv2.h"
+
+/**
+   @defgroup inlinedisplay Inline-Display
+
+   Support for displaying a miniaturized generic view
+	 directly in the host's Mixer Window.
+
+   @{
+*/
+
+#define LV2_INLINEDISPLAY_URI "http://harrisonconsoles.com/lv2/inlinedisplay"
+#define LV2_INLINEDISPLAY_PREFIX LV2_INLINEDISPLAY_URI "#"
+#define LV2_INLINEDISPLAY__interface LV2_INLINEDISPLAY_PREFIX "interface"
+#define LV2_INLINEDISPLAY__queue_draw LV2_INLINEDISPLAY_PREFIX "queue_draw"
+
+/** Opaque handle for LV2_Inline_Display::queue_draw() */
+typedef void* LV2_Inline_Display_Handle;
+
+/** raw image pixmap format is ARGB32,
+ * the data pointer is owned by the plugin and must be valid
+ * from the first call to render until cleanup.
+ */
+typedef struct {
+	unsigned char *data;
+	int width;
+	int height;
+	int stride;
+} LV2_Inline_Display_Image_Surface;
+
+/** a LV2 Feature provided by the Host to the plugin */
+typedef struct {
+	/** Opaque host data */
+	LV2_Inline_Display_Handle handle;
+	/** Request from run() that the host should call render() at a later time
+	 * to update the inline display */
+	void (*queue_draw)(LV2_Inline_Display_Handle handle);
+} LV2_Inline_Display;
+
+/**
+ * Plugin Inline-Display Interface.
+ */
+typedef struct {
+	/**
+	 * The render method. This is called by the host in a non-realtime context,
+	 * usually the main GUI thread.
+	 * The data pointer is owned by the plugin and must be valid
+	 * from the first call to render until cleanup.
+	 *
+	 * @param instance The LV2 instance
+	 * @param w the max available width
+	 * @param h the max available height
+	 * @return pointer to a LV2_Inline_Display_Image_Surface or NULL
+	 */
+	LV2_Inline_Display_Image_Surface* (*render)(LV2_Handle instance, uint32_t w, uint32_t h);
+} LV2_Inline_Display_Interface;
+
+/**
+   @}
+*/
+
+/**
+   @defgroup automate Self-Automation
+
+   Support for plugins to write automation data via Atom Events
+
+   @{
+*/
+
+#define LV2_AUTOMATE_URI "http://ardour.org/lv2/automate"
+#define LV2_AUTOMATE_URI_PREFIX LV2_AUTOMATE_URI "#"
+/** an lv2:optionalFeature */
+#define LV2_AUTOMATE_URI__can_write LV2_AUTOMATE_URI_PREFIX "canWriteAutomatation"
+/** atom:supports */
+#define LV2_AUTOMATE_URI__control LV2_AUTOMATE_URI_PREFIX "automationControl"
+/** lv2:portProperty */
+#define LV2_AUTOMATE_URI__controlled LV2_AUTOMATE_URI_PREFIX "automationControlled"
+#define LV2_AUTOMATE_URI__controller LV2_AUTOMATE_URI_PREFIX "automationController"
+
+/** atom messages */
+#define LV2_AUTOMATE_URI__event LV2_AUTOMATE_URI_PREFIX "event"
+#define LV2_AUTOMATE_URI__setup LV2_AUTOMATE_URI_PREFIX "setup"
+#define LV2_AUTOMATE_URI__finalize LV2_AUTOMATE_URI_PREFIX "finalize"
+#define LV2_AUTOMATE_URI__start LV2_AUTOMATE_URI_PREFIX "start"
+#define LV2_AUTOMATE_URI__end LV2_AUTOMATE_URI_PREFIX "end"
+#define LV2_AUTOMATE_URI__parameter LV2_AUTOMATE_URI_PREFIX "parameter"
+#define LV2_AUTOMATE_URI__value LV2_AUTOMATE_URI_PREFIX "value"
+
+/**
+   @}
+*/
+
+/**
+   @defgroup license License-Report
+
+   Allow for commercial LV2 to report their
+	 licensing status.
+
+   @{
+*/
+
+#define LV2_PLUGINLICENSE_URI "http://harrisonconsoles.com/lv2/license"
+#define LV2_PLUGINLICENSE_PREFIX LV2_PLUGINLICENSE_URI "#"
+#define LV2_PLUGINLICENSE__interface LV2_PLUGINLICENSE_PREFIX "interface"
+
+typedef struct _LV2_License_Interface {
+	/* @return -1 if no license is needed; 0 if unlicensed, 1 if licensed */
+	int   (*is_licensed)(LV2_Handle instance);
+	/* @return a string copy of the licensee name if licensed, or NULL, the caller needs to free this */
+	char* (*licensee)(LV2_Handle instance);
+	/* @return a URI identifying the plugin-bundle or plugin for which a given license is valid */
+	const char* (*product_uri)(LV2_Handle instance);
+	/* @return human readable product name for the URI */
+	const char* (*product_name)(LV2_Handle instance);
+	/* @return link to website or webstore */
+	const char* (*store_url)(LV2_Handle instance);
+} LV2_License_Interface;
+
+/**
+   @}
+*/
+
+/**
+   @defgroup plugin provided bypass
+
+	 A port with the designation "processing#enable" must
+	 control a plugin's internal bypass mode.
+
+	 If the port value is larger than zero the plugin processes
+	 normally.
+
+	 If the port value is zero, the plugin is expected to bypass
+	 all signals unmodified.
+
+	 The plugin is responsible for providing a click-free transition
+	 between the states.
+
+	 (values less than zero are reserved for future use:
+	 e.g click-free insert/removal of latent plugins.
+	 Generally values <= 0 are to be treated as bypassed.)
+
+   lv2:designation <http://ardour.org/lv2/processing#enable> ;
+
+   @{
+*/
+
+#define LV2_PROCESSING_URI "http://ardour.org/lv2/processing"
+#define LV2_PROCESSING_URI_PREFIX LV2_PROCESSING_URI "#"
+#define LV2_PROCESSING_URI__enable LV2_PROCESSING_URI_PREFIX "enable"
+
+/**
+   @}
+*/
+
+#endif
diff --git a/libs/ardour/ardour/lv2_plugin.h b/libs/ardour/ardour/lv2_plugin.h
index a4cdfcd..7f31245 100644
--- a/libs/ardour/ardour/lv2_plugin.h
+++ b/libs/ardour/ardour/lv2_plugin.h
@@ -20,6 +20,7 @@
 #ifndef __ardour_lv2_plugin_h__
 #define __ardour_lv2_plugin_h__
 
+#include <glibmm/threads.h>
 #include <set>
 #include <string>
 #include <vector>
@@ -30,6 +31,10 @@
 #include "ardour/worker.h"
 #include "pbd/ringbuffer.h"
 
+#ifdef LV2_EXTENDED // -> needs to eventually go upstream to lv2plug.in
+#include "ardour/lv2_extensions.h"
+#endif
+
 #ifndef PATH_MAX
 #define PATH_MAX 1024
 #endif
@@ -67,6 +72,7 @@ class LIBARDOUR_API LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee
 	uint32_t    num_ports () const;
 	uint32_t    parameter_count () const;
 	float       default_value (uint32_t port);
+	framecnt_t  max_latency () const;
 	framecnt_t  signal_latency () const;
 	void        set_parameter (uint32_t port, float val);
 	float       get_parameter (uint32_t port) const;
@@ -74,6 +80,9 @@ class LIBARDOUR_API LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee
 	std::string get_parameter_docs(uint32_t which) const;
 	int         get_parameter_descriptor (uint32_t which, ParameterDescriptor&) const;
 	uint32_t    nth_parameter (uint32_t port, bool& ok) const;
+	bool        get_layout (uint32_t which, UILayoutHint&) const;
+
+	IOPortDescription describe_io_port (DataType dt, bool input, uint32_t id) const;
 
 	const void* extension_data (const char* uri) const;
 
@@ -91,6 +100,7 @@ class LIBARDOUR_API LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee
 	const LV2_Feature* const* features () { return _features; }
 
 	std::set<Evoral::Parameter> automatable () const;
+	virtual void set_automation_control (uint32_t, boost::shared_ptr<AutomationControl>);
 
 	void activate ();
 	void deactivate ();
@@ -100,6 +110,7 @@ class LIBARDOUR_API LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee
 	bool requires_fixed_sized_buffers () const;
 
 	int connect_and_run (BufferSet& bufs,
+	                     framepos_t start, framepos_t end, double speed,
 	                     ChanMapping in, ChanMapping out,
 	                     pframes_t nframes, framecnt_t offset);
 
@@ -117,6 +128,8 @@ class LIBARDOUR_API LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee
 	bool parameter_is_output (uint32_t) const;
 	bool parameter_is_toggled (uint32_t) const;
 
+	uint32_t designated_bypass_port ();
+
 	boost::shared_ptr<ScalePoints>
 	get_scale_points(uint32_t port_index) const;
 
@@ -151,7 +164,7 @@ class LIBARDOUR_API LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee
 	URIMap&       uri_map()       { return _uri_map; }
 	const URIMap& uri_map() const { return _uri_map; }
 
-	int work(uint32_t size, const void* data);
+	int work(Worker& worker, uint32_t size, const void* data);
 	int work_response(uint32_t size, const void* data);
 
 	void                       set_property(uint32_t key, const Variant& value);
@@ -165,6 +178,7 @@ class LIBARDOUR_API LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee
 	void*         _module;
 	LV2_Feature** _features;
 	Worker*       _worker;
+	Worker*       _state_worker;
 	framecnt_t    _sample_rate;
 	float*        _control_data;
 	float*        _shadow_data;
@@ -182,6 +196,9 @@ class LIBARDOUR_API LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee
 	uint32_t      _patch_port_out_index;
 	URIMap&       _uri_map;
 	bool          _no_sample_accurate_ctrl;
+	bool          _can_write_automation;
+	framecnt_t    _max_latency;
+	framecnt_t    _current_latency;
 
 	friend const void* lv2plugin_get_port_value(const char* port_symbol,
 	                                            void*       user_data,
@@ -197,7 +214,11 @@ class LIBARDOUR_API LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee
 		PORT_SEQUENCE = 1 << 5,  ///< New atom API event port
 		PORT_MIDI     = 1 << 6,  ///< Event port understands MIDI
 		PORT_POSITION = 1 << 7,  ///< Event port understands position
-		PORT_PATCHMSG = 1 << 8   ///< Event port supports patch:Message
+		PORT_PATCHMSG = 1 << 8,  ///< Event port supports patch:Message
+		PORT_AUTOCTRL = 1 << 9,  ///< Event port supports auto:AutomationControl
+		PORT_CTRLED   = 1 << 10, ///< Port prop auto:AutomationControlled (can be self controlled)
+		PORT_CTRLER   = 1 << 11, ///< Port prop auto:AutomationController (can be self set)
+		PORT_NOAUTO   = 1 << 12  ///< Port don't allow to automate
 	} PortFlag;
 
 	typedef unsigned PortFlags;
@@ -208,6 +229,25 @@ class LIBARDOUR_API LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee
 
 	PropertyDescriptors _property_descriptors;
 
+	struct AutomationCtrl {
+		AutomationCtrl (const AutomationCtrl &other)
+			: ac (other.ac)
+			, guard (other.guard)
+		{ }
+
+		AutomationCtrl (boost::shared_ptr<ARDOUR::AutomationControl> c)
+			: ac (c)
+			, guard (false)
+		{ }
+		boost::shared_ptr<ARDOUR::AutomationControl> ac;
+		bool guard;
+	};
+
+	typedef boost::shared_ptr<AutomationCtrl> AutomationCtrlPtr;
+	typedef std::map<uint32_t, AutomationCtrlPtr> AutomationCtrlMap;
+	AutomationCtrlMap _ctrl_map;
+	AutomationCtrlPtr get_automation_control (uint32_t);
+
 	/// Message send to/from UI via ports
 	struct UIMessage {
 		uint32_t index;
@@ -230,6 +270,12 @@ class LIBARDOUR_API LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee
 	RingBuffer<uint8_t>* _to_ui;
 	RingBuffer<uint8_t>* _from_ui;
 
+	Glib::Threads::Mutex _work_mutex;
+
+#ifdef LV2_EXTENDED
+	const LV2_Inline_Display_Interface* _display_interface;
+#endif
+
 	typedef struct {
 		const void* (*extension_data) (const char* uri);
 	} LV2_DataAccess;
@@ -242,6 +288,9 @@ class LIBARDOUR_API LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee
 	LV2_Feature    _work_schedule_feature;
 	LV2_Feature    _options_feature;
 	LV2_Feature    _def_state_feature;
+#ifdef LV2_EXTENDED
+	LV2_Feature    _queue_draw_feature;
+#endif
 
 	// Options passed to plugin
 	int32_t _seq_size;
@@ -265,6 +314,11 @@ class LIBARDOUR_API LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee
 
 	void load_supported_properties(PropertyDescriptors& descs);
 
+#ifdef LV2_EXTENDED
+	bool has_inline_display ();
+	Plugin::Display_Image_Surface* render_inline_display (uint32_t, uint32_t);
+#endif
+
 	void latency_compute_run ();
 	std::string do_save_preset (std::string);
 	void do_remove_preset (std::string);
diff --git a/libs/ardour/ardour/meter.h b/libs/ardour/ardour/meter.h
index a3bd34e..ddc1e5e 100644
--- a/libs/ardour/ardour/meter.h
+++ b/libs/ardour/ardour/meter.h
@@ -64,7 +64,7 @@ public:
 	void emit_configuration_changed ();
 
 	/** Compute peaks */
-	void run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, bool);
+	void run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, double speed, pframes_t nframes, bool);
 
 	void activate ()   { }
 	void deactivate () { }
diff --git a/libs/ardour/ardour/midi_buffer.h b/libs/ardour/ardour/midi_buffer.h
index 8593a4e..2a472e1 100644
--- a/libs/ardour/ardour/midi_buffer.h
+++ b/libs/ardour/ardour/midi_buffer.h
@@ -45,6 +45,7 @@ public:
 	void merge_from (const Buffer& src, framecnt_t nframes, framecnt_t dst_offset = 0, framecnt_t src_offset = 0);
 
 	void copy(const MidiBuffer& copy);
+	void copy(MidiBuffer const * const);
 
 	bool     push_back(const Evoral::MIDIEvent<TimeType>& event);
 	bool     push_back(TimeType time, size_t size, const uint8_t* data);
diff --git a/libs/ardour/ardour/midi_model.h b/libs/ardour/ardour/midi_model.h
index 21c67c2..ea4f178 100644
--- a/libs/ardour/ardour/midi_model.h
+++ b/libs/ardour/ardour/midi_model.h
@@ -175,8 +175,9 @@ public:
 
 	private:
 		struct Change {
+			Change () : sysex_id (0) {}
 			boost::shared_ptr<Evoral::Event<TimeType> > sysex;
-   		        gint sysex_id;
+			gint sysex_id;
 			SysExDiffCommand::Property property;
 			TimeType old_time;
 			TimeType new_time;
@@ -264,7 +265,8 @@ public:
 	bool write_section_to(boost::shared_ptr<MidiSource>     source,
 	                      const Glib::Threads::Mutex::Lock& source_lock,
 	                      Evoral::Beats                     begin = Evoral::MinBeats,
-	                      Evoral::Beats                     end   = Evoral::MaxBeats);
+	                      Evoral::Beats                     end   = Evoral::MaxBeats,
+	                      bool                              offset_events = false);
 
 	// MidiModel doesn't use the normal AutomationList serialisation code
 	// since controller data is stored in the .mid
diff --git a/libs/ardour/ardour/midi_operator.h b/libs/ardour/ardour/midi_operator.h
index b79544e..589e930 100644
--- a/libs/ardour/ardour/midi_operator.h
+++ b/libs/ardour/ardour/midi_operator.h
@@ -23,7 +23,7 @@
 #include <vector>
 #include <string>
 
-#include "evoral/types.hpp"
+#include "evoral/Beats.hpp"
 #include "evoral/Sequence.hpp"
 
 class Command;
diff --git a/libs/ardour/ardour/midi_playlist.h b/libs/ardour/ardour/midi_playlist.h
index cb07bc1..a84c464 100644
--- a/libs/ardour/ardour/midi_playlist.h
+++ b/libs/ardour/ardour/midi_playlist.h
@@ -30,12 +30,12 @@
 #include "ardour/midi_state_tracker.h"
 #include "ardour/note_fixer.h"
 #include "ardour/playlist.h"
-#include "evoral/Beats.hpp"
 #include "evoral/Note.hpp"
 #include "evoral/Parameter.hpp"
 
 namespace Evoral {
 template<typename Time> class EventSink;
+class                         Beats;
 }
 
 namespace ARDOUR
diff --git a/libs/ardour/ardour/midi_region.h b/libs/ardour/ardour/midi_region.h
index 250a58a..5a1dfe0 100644
--- a/libs/ardour/ardour/midi_region.h
+++ b/libs/ardour/ardour/midi_region.h
@@ -23,7 +23,7 @@
 
 #include <vector>
 
-#include "evoral/types.hpp"
+#include "evoral/Beats.hpp"
 
 #include "ardour/ardour.h"
 #include "ardour/region.h"
@@ -61,6 +61,8 @@ class LIBARDOUR_API MidiRegion : public Region
 
 	~MidiRegion();
 
+	bool do_export (std::string path) const;
+
 	boost::shared_ptr<MidiRegion> clone (std::string path = std::string()) const;
 	boost::shared_ptr<MidiRegion> clone (boost::shared_ptr<MidiSource>) const;
 
@@ -101,7 +103,8 @@ class LIBARDOUR_API MidiRegion : public Region
 	boost::shared_ptr<const MidiModel> model() const;
 
 	void fix_negative_start ();
-
+	Evoral::Beats start_beats () {return _start_beats.val(); }
+ 	Evoral::Beats length_beats () {return _length_beats.val(); }
   protected:
 
 	virtual bool can_trim_start_before_source_start () const {
@@ -115,7 +118,7 @@ class LIBARDOUR_API MidiRegion : public Region
 
 	MidiRegion (const SourceList&);
 	MidiRegion (boost::shared_ptr<const MidiRegion>);
-	MidiRegion (boost::shared_ptr<const MidiRegion>, frameoffset_t offset);
+	MidiRegion (boost::shared_ptr<const MidiRegion>, frameoffset_t offset, const int32_t sub_num = 0);
 
 	framecnt_t _read_at (const SourceList&, Evoral::EventSink<framepos_t>& dst,
 	                     framepos_t position,
@@ -131,16 +134,17 @@ class LIBARDOUR_API MidiRegion : public Region
 	void recompute_at_start ();
 	void recompute_at_end ();
 
-	void set_position_internal (framepos_t pos, bool allow_bbt_recompute);
-	void set_length_internal (framecnt_t len);
-	void set_start_internal (framecnt_t);
-	void update_length_beats ();
+	void set_position_internal (framepos_t pos, bool allow_bbt_recompute, const int32_t sub_num);
+	void set_length_internal (framecnt_t len, const int32_t sub_num);
+	void set_start_internal (framecnt_t, const int32_t sub_num);
+	void trim_to_internal (framepos_t position, framecnt_t length, const int32_t sub_num);
+	void update_length_beats (const int32_t sub_num);
 
 	void model_changed ();
 	void model_automation_state_changed (Evoral::Parameter const &);
 
 	void set_start_beats_from_start_frames ();
-	void update_after_tempo_map_change ();
+	void update_after_tempo_map_change (bool send_change = true);
 
 	std::set<Evoral::Parameter> _filtered_parameters; ///< parameters that we ask our source not to return when reading
 	PBD::ScopedConnection _model_connection;
diff --git a/libs/ardour/ardour/midi_source.h b/libs/ardour/ardour/midi_source.h
index 6a55398..c8b4263 100644
--- a/libs/ardour/ardour/midi_source.h
+++ b/libs/ardour/ardour/midi_source.h
@@ -63,6 +63,19 @@ class LIBARDOUR_API MidiSource : virtual public Source, public boost::enable_sha
 	              Evoral::Beats                 begin = Evoral::MinBeats,
 	              Evoral::Beats                 end   = Evoral::MaxBeats);
 
+	/** Export the midi data in the given time range to another MidiSource
+	 * \param newsrc MidiSource to which data will be written. Should be a
+	 *        new, empty source. If it already has contents, the results are
+	 *        undefined. Source must be writable.
+	 * \param begin time of earliest event that can be written.
+	 * \param end time of latest event that can be written.
+	 * \return zero on success, non-zero if the write failed for any reason.
+	 */
+	int export_write_to (const Lock&                   lock,
+	                     boost::shared_ptr<MidiSource> newsrc,
+	                     Evoral::Beats                 begin,
+	                     Evoral::Beats                 end);
+
 	/** Read the data in a given time range from the MIDI source.
 	 * All time stamps in parameters are in audio frames (even if the source has tempo time).
 	 * \param dst Ring buffer where read events are written.
@@ -79,7 +92,9 @@ class LIBARDOUR_API MidiSource : virtual public Source, public boost::enable_sha
 	                              framecnt_t                         cnt,
 	                              MidiStateTracker*                  tracker,
 	                              MidiChannelFilter*                 filter,
-	                              const std::set<Evoral::Parameter>& filtered) const;
+	                              const std::set<Evoral::Parameter>& filtered,
+				      double                             beat,
+				      double                             start_beat) const;
 
 	/** Write data from a MidiRingBuffer to this source.
 	 *  @param source Source to read from.
diff --git a/libs/ardour/ardour/midi_track.h b/libs/ardour/ardour/midi_track.h
index ed13832..f756812 100644
--- a/libs/ardour/ardour/midi_track.h
+++ b/libs/ardour/ardour/midi_track.h
@@ -37,7 +37,7 @@ class Session;
 class LIBARDOUR_API MidiTrack : public Track
 {
 public:
-	MidiTrack (Session&, std::string name, Route::Flag f = Route::Flag (0), TrackMode m = Normal);
+	MidiTrack (Session&, std::string name, TrackMode m = Normal);
 	~MidiTrack ();
 
 	int init ();
@@ -50,8 +50,9 @@ public:
 
 	boost::shared_ptr<Diskstream> create_diskstream ();
 	void set_diskstream (boost::shared_ptr<Diskstream>);
-	void set_record_enabled (bool yn, PBD::Controllable::GroupControlDisposition);
-	void set_record_safe (bool yn, PBD::Controllable::GroupControlDisposition);
+
+	bool can_be_record_enabled ();
+	bool can_be_record_safe ();
 
 	DataType data_type () const {
 		return DataType::MIDI;
@@ -89,14 +90,12 @@ public:
 			, _route (route)
 		{}
 
-		void set_value (double val, PBD::Controllable::GroupControlDisposition group_override);
-		void set_value_unchecked (double);
 		bool writable() const { return true; }
 
 		MidiTrack* _route;
 
 	private:
-		void _set_value (double val, PBD::Controllable::GroupControlDisposition group_override);
+		void actually_set_value (double val, PBD::Controllable::GroupControlDisposition group_override);
 	};
 
 	virtual void set_parameter_automation_state (Evoral::Parameter param, AutoState);
@@ -133,7 +132,6 @@ public:
 	PBD::Signal1<void, boost::weak_ptr<MidiSource> > DataRecorded;
 	boost::shared_ptr<MidiBuffer> get_gui_feed_buffer () const;
 
-	void set_monitoring (MonitorChoice, PBD::Controllable::GroupControlDisposition);
 	MonitorState monitoring_state () const;
 
 	void set_input_active (bool);
@@ -144,6 +142,7 @@ protected:
 	XMLNode& state (bool full);
 
 	void act_on_mute ();
+	void monitoring_changed (bool, PBD::Controllable::GroupControlDisposition);
 
 private:
 	MidiRingBuffer<framepos_t> _immediate_events;
diff --git a/libs/ardour/ardour/midi_ui.h b/libs/ardour/ardour/midi_ui.h
index 2f0f7d3..88ea021 100644
--- a/libs/ardour/ardour/midi_ui.h
+++ b/libs/ardour/ardour/midi_ui.h
@@ -62,7 +62,7 @@ class LIBARDOUR_API MidiControlUI : public AbstractUI<MidiUIRequest>
   private:
 	ARDOUR::Session& _session;
 
-	bool midi_input_handler (Glib::IOCondition, boost::shared_ptr<AsyncMIDIPort>);
+	bool midi_input_handler (Glib::IOCondition, boost::weak_ptr<AsyncMIDIPort>);
 	void reset_ports ();
 	void clear_ports ();
 
diff --git a/libs/ardour/ardour/monitor_control.h b/libs/ardour/ardour/monitor_control.h
new file mode 100644
index 0000000..b185172
--- /dev/null
+++ b/libs/ardour/ardour/monitor_control.h
@@ -0,0 +1,58 @@
+/*
+    Copyright (C) 2016 Paul Davis
+
+    This program is free software; you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by the Free
+    Software Foundation; either version 2 of the License, or (at your option)
+    any later version.
+
+    This program is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc.,
+    675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#ifndef __ardour_monitor_control_h__
+#define __ardour_monitor_control_h__
+
+#include <string>
+
+#include <boost/shared_ptr.hpp>
+#include <boost/dynamic_bitset.hpp>
+
+#include "ardour/slavable_automation_control.h"
+#include "ardour/monitorable.h"
+
+#include "ardour/libardour_visibility.h"
+
+namespace ARDOUR {
+
+class Session;
+
+class LIBARDOUR_API MonitorControl : public SlavableAutomationControl
+{
+  public:
+	MonitorControl (Session& session, std::string const & name, Monitorable& m);
+	~MonitorControl() {}
+
+	MonitorChoice monitoring_choice() const { return static_cast<MonitorChoice> ((int)get_value()); }
+	MonitorState monitoring_state () const { return _monitorable.monitoring_state(); }
+
+	int set_state (XMLNode const&, int);
+	XMLNode& get_state ();
+
+  protected:
+	void actually_set_value (double, PBD::Controllable::GroupControlDisposition group_override);
+
+  private:
+	Monitorable& _monitorable;
+	MonitorChoice _monitoring;
+};
+
+} /* namespace */
+
+#endif /* __libardour_monitor_control_h__ */
diff --git a/libs/ardour/ardour/monitor_processor.h b/libs/ardour/ardour/monitor_processor.h
index e971d0a..d369cb9 100644
--- a/libs/ardour/ardour/monitor_processor.h
+++ b/libs/ardour/ardour/monitor_processor.h
@@ -54,11 +54,11 @@ public:
 
 	/* Controllable API */
 
-	void set_value (double v, PBD::Controllable::GroupControlDisposition group_override) {
+	void set_value (double v, PBD::Controllable::GroupControlDisposition gcd) {
 		T newval = (T) v;
 		if (newval != _value) {
 			_value = std::max (_lower, std::min (_upper, newval));
-			Changed(); /* EMIT SIGNAL */
+			Changed (true, gcd); /* EMIT SIGNAL */
 		}
 	}
 
@@ -84,7 +84,7 @@ public:
 	MPControl& operator=(const T& v) {
 		if (v != _value) {
 			_value = std::max (_lower, std::min (_upper, v));
-			Changed (); /* EMIT SIGNAL */
+			Changed (true, PBD::Controllable::UseGroup); /* EMIT SIGNAL */
 		}
 		return *this;
 	}
@@ -127,7 +127,7 @@ public:
 
 	bool display_to_user() const;
 
-	void run (BufferSet& /*bufs*/, framepos_t /*start_frame*/, framepos_t /*end_frame*/, pframes_t /*nframes*/, bool /*result_required*/);
+	void run (BufferSet& /*bufs*/, framepos_t /*start_frame*/, framepos_t /*end_frame*/, double /*speed*/, pframes_t /*nframes*/, bool /*result_required*/);
 
 	XMLNode& state (bool full);
 	int set_state (const XMLNode&, int /* version */);
diff --git a/libs/ardour/ardour/monitorable.h b/libs/ardour/ardour/monitorable.h
new file mode 100644
index 0000000..03968e6
--- /dev/null
+++ b/libs/ardour/ardour/monitorable.h
@@ -0,0 +1,35 @@
+/*
+    Copyright (C) 2016 Paul Davis
+
+    This program is free software; you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by the Free
+    Software Foundation; either version 2 of the License, or (at your option)
+    any later version.
+
+    This program is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc.,
+    675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#ifndef __ardour_monitorable_h__
+#define __ardour_monitorable_h__
+
+#include "ardour/types.h"
+
+namespace ARDOUR {
+
+class Monitorable {
+    public:
+	virtual ~Monitorable() {}
+
+	virtual MonitorState monitoring_state() const = 0;
+};
+
+} /* namespace */
+
+#endif /* __ardour_monitorable_h__ */
diff --git a/libs/ardour/ardour/mute_control.h b/libs/ardour/ardour/mute_control.h
new file mode 100644
index 0000000..909f0cb
--- /dev/null
+++ b/libs/ardour/ardour/mute_control.h
@@ -0,0 +1,85 @@
+/*
+    Copyright (C) 2016 Paul Davis
+
+    This program is free software; you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by the Free
+    Software Foundation; either version 2 of the License, or (at your option)
+    any later version.
+
+    This program is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc.,
+    675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#ifndef __ardour_mute_control_h__
+#define __ardour_mute_control_h__
+
+#include <string>
+
+#include <boost/shared_ptr.hpp>
+
+#include "ardour/slavable_automation_control.h"
+
+#include "ardour/mute_master.h"
+#include "ardour/libardour_visibility.h"
+
+namespace ARDOUR {
+
+class Session;
+class Muteable;
+
+class LIBARDOUR_API MuteControl : public SlavableAutomationControl
+{
+  public:
+	MuteControl (Session& session, std::string const& name, Muteable&);
+
+	double get_value () const;
+
+	/* Export additional API so that objects that only get access
+	 * to a Controllable/AutomationControl can do more fine-grained
+	 * operations with respect to mute. Obviously, they would need
+	 * to dynamic_cast<MuteControl> first.
+	 *
+	 * Mute state is not representable by a single scalar value,
+	 * so set_value() and get_value() is not enough.
+	 *
+	 * This means that the Controllable is technically
+	 * asymmetric. It is possible to call ::set_value (0.0) to
+	 * turn off mute, and then call ::get_value() and get a
+	 * return of 1.0 because the control is affected by
+	 * upstream/downstream or a master.
+	 */
+
+	bool muted () const;
+	bool muted_by_self () const;
+	bool muted_by_masters () const;
+	bool muted_by_self_or_masters () const {
+		return muted_by_self() || muted_by_masters ();
+	}
+
+	bool muted_by_others_soloing () const;
+
+	void set_mute_points (MuteMaster::MutePoint);
+	MuteMaster::MutePoint mute_points () const;
+
+	void automation_run (framepos_t start, pframes_t nframes);
+
+  protected:
+	void master_changed (bool, PBD::Controllable::GroupControlDisposition, boost::shared_ptr<AutomationControl>);
+	void actually_set_value (double, PBD::Controllable::GroupControlDisposition group_override);
+
+	void pre_remove_master (boost::shared_ptr<AutomationControl>);
+	void post_add_master (boost::shared_ptr<AutomationControl>);
+
+  private:
+	Muteable& _muteable;
+};
+
+} /* namespace */
+
+#endif /* __libardour_mute_control_h__ */
diff --git a/libs/ardour/ardour/mute_master.h b/libs/ardour/ardour/mute_master.h
index d88cbdc..f73ce09 100644
--- a/libs/ardour/ardour/mute_master.h
+++ b/libs/ardour/ardour/mute_master.h
@@ -20,16 +20,20 @@
 #ifndef __ardour_mute_master_h__
 #define __ardour_mute_master_h__
 
-#include "evoral/Parameter.hpp"
+#include <string>
+
 #include "pbd/signals.h"
 #include "pbd/stateful.h"
-#include <string>
+
+#include "evoral/Parameter.hpp"
 
 #include "ardour/session_handle.h"
+#include "ardour/types.h"
 
 namespace ARDOUR {
 
 class Session;
+class Muteable;
 
 class LIBARDOUR_API MuteMaster : public SessionHandleRef, public PBD::Stateful
 {
@@ -44,12 +48,14 @@ class LIBARDOUR_API MuteMaster : public SessionHandleRef, public PBD::Stateful
 
 	static const MutePoint AllPoints;
 
-	MuteMaster (Session& s, const std::string& name);
+	MuteMaster (Session& s, Muteable&, const std::string& name);
 	~MuteMaster() {}
 
 	bool muted_by_self () const { return _muted_by_self && (_mute_point != MutePoint (0)); }
 	bool muted_by_self_at (MutePoint mp) const { return _muted_by_self && (_mute_point & mp); }
-	bool muted_by_others_at (MutePoint mp) const;
+	bool muted_by_others_soloing_at (MutePoint mp) const;
+	bool muted_by_masters () const { return _muted_by_masters && (_mute_point != MutePoint (0)); }
+	bool muted_by_masters_at (MutePoint mp) const { return _muted_by_masters && (_mute_point & mp); }
 
 	gain_t mute_gain_at (MutePoint) const;
 
@@ -64,19 +70,22 @@ class LIBARDOUR_API MuteMaster : public SessionHandleRef, public PBD::Stateful
 
 	void set_soloed_by_self (bool yn) { _soloed_by_self = yn; }
 	void set_soloed_by_others (bool yn) { _soloed_by_others = yn; }
-	void set_solo_ignore (bool yn) { _solo_ignore = yn; }
+
+	void set_muted_by_masters (bool);
 
 	PBD::Signal0<void> MutePointChanged;
 
 	XMLNode& get_state();
 	int set_state(const XMLNode&, int version);
+	static const std::string xml_node_name;
 
   private:
-	volatile MutePoint _mute_point;
-	volatile bool      _muted_by_self;
-	volatile bool      _soloed_by_self;
-	volatile bool      _soloed_by_others;
-	volatile bool      _solo_ignore;
+	Muteable* _muteable;
+	MutePoint _mute_point;
+	bool      _muted_by_self;
+	bool      _soloed_by_self;
+	bool      _soloed_by_others;
+	bool      _muted_by_masters;
 };
 
 } // namespace ARDOUR
diff --git a/libs/ardour/ardour/muteable.h b/libs/ardour/ardour/muteable.h
new file mode 100644
index 0000000..adc4259
--- /dev/null
+++ b/libs/ardour/ardour/muteable.h
@@ -0,0 +1,52 @@
+/*
+    Copyright (C) 2016 Paul Davis
+
+    This program is free software; you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by the Free
+    Software Foundation; either version 2 of the License, or (at your option)
+    any later version.
+
+    This program is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc.,
+    675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#ifndef __ardour_muteable_h__
+#define __ardour_muteable_h__
+
+#include <boost/shared_ptr.hpp>
+
+#include "pbd/signals.h"
+
+namespace ARDOUR {
+
+class MuteMaster;
+class Session;
+
+class Muteable {
+    public:
+	Muteable (Session&, std::string const &name);
+	virtual ~Muteable() {}
+
+	virtual bool can_be_muted_by_others () const = 0;
+	virtual void act_on_mute () {}
+	virtual bool muted_by_others_soloing () const = 0;
+
+	boost::shared_ptr<MuteMaster> mute_master() const {
+		return _mute_master;
+	}
+
+	PBD::Signal0<void> mute_points_changed;
+
+    protected:
+	boost::shared_ptr<MuteMaster> _mute_master;
+};
+
+} /* namespace */
+
+#endif /* __ardour_muteable_h__ */
diff --git a/libs/ardour/ardour/onset_detector.h b/libs/ardour/ardour/onset_detector.h
index 40eac9b..a77b84f 100644
--- a/libs/ardour/ardour/onset_detector.h
+++ b/libs/ardour/ardour/onset_detector.h
@@ -37,6 +37,7 @@ public:
 
 	void set_silence_threshold (float);
 	void set_peak_threshold (float);
+	void set_minioi (float);
 	void set_function (int);
 
 	int run (const std::string& path, Readable*, uint32_t channel, AnalysisFeatureList& results);
diff --git a/libs/ardour/ardour/pan_controllable.h b/libs/ardour/ardour/pan_controllable.h
index 85a4efe..82aa60f 100644
--- a/libs/ardour/ardour/pan_controllable.h
+++ b/libs/ardour/ardour/pan_controllable.h
@@ -47,12 +47,11 @@ class LIBARDOUR_API PanControllable : public AutomationControl
 	{}
 
 	double lower () const;
-	void set_value (double, PBD::Controllable::GroupControlDisposition group_override);
-	void set_value_unchecked (double);
+	std::string get_user_string () const;
 
   private:
 	Pannable* owner;
-	void _set_value (double, PBD::Controllable::GroupControlDisposition group_override);
+	void actually_set_value (double, PBD::Controllable::GroupControlDisposition group_override);
 };
 
 } // namespace
diff --git a/libs/ardour/ardour/pannable.h b/libs/ardour/ardour/pannable.h
index 62c9cd1..fd8ffe6 100644
--- a/libs/ardour/ardour/pannable.h
+++ b/libs/ardour/ardour/pannable.h
@@ -68,7 +68,7 @@ class LIBARDOUR_API Pannable : public PBD::Stateful, public Automatable, public
 		return ((_auto_state & Write) || ((_auto_state & Touch) && touching()));
 	}
 
-	std::string value_as_string (boost::shared_ptr<AutomationControl>) const;
+	std::string value_as_string (boost::shared_ptr<const AutomationControl>) const;
 
 	void start_touch (double when);
 	void stop_touch (bool mark, double when);
diff --git a/libs/ardour/ardour/panner.h b/libs/ardour/ardour/panner.h
index 1838fb5..48f9ee1 100644
--- a/libs/ardour/ardour/panner.h
+++ b/libs/ardour/ardour/panner.h
@@ -110,7 +110,7 @@ public:
 
 	virtual std::set<Evoral::Parameter> what_can_be_automated() const;
 	virtual std::string describe_parameter (Evoral::Parameter);
-	virtual std::string value_as_string (boost::shared_ptr<AutomationControl>) const;
+	virtual std::string value_as_string (boost::shared_ptr<const AutomationControl>) const;
 
 	bool touching() const;
 
diff --git a/libs/ardour/ardour/parameter_descriptor.h b/libs/ardour/ardour/parameter_descriptor.h
index 9d219d1..9a8c559 100644
--- a/libs/ardour/ardour/parameter_descriptor.h
+++ b/libs/ardour/ardour/parameter_descriptor.h
@@ -43,6 +43,8 @@ struct LIBARDOUR_API ParameterDescriptor : public Evoral::ParameterDescriptor
 		HZ,         ///< Frequency in Hertz
 	};
 
+	static std::string midi_note_name (uint8_t);
+
 	ParameterDescriptor(const Evoral::Parameter& parameter);
 
 	ParameterDescriptor();
diff --git a/libs/ardour/ardour/phase_control.h b/libs/ardour/ardour/phase_control.h
new file mode 100644
index 0000000..0693c8e
--- /dev/null
+++ b/libs/ardour/ardour/phase_control.h
@@ -0,0 +1,71 @@
+/*
+    Copyright (C) 2016 Paul Davis
+
+    This program is free software; you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by the Free
+    Software Foundation; either version 2 of the License, or (at your option)
+    any later version.
+
+    This program is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc.,
+    675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#ifndef __ardour_phase_control_h__
+#define __ardour_phase_control_h__
+
+#include <string>
+
+#include <boost/shared_ptr.hpp>
+#include <boost/dynamic_bitset.hpp>
+
+#include "ardour/slavable_automation_control.h"
+#include "ardour/libardour_visibility.h"
+
+namespace ARDOUR {
+
+class Session;
+
+/* Note that PhaseControl is not Slavable. There's no particular reason for
+ * this, it could be changed at any time. But it seems useless.
+ */
+
+class LIBARDOUR_API PhaseControl : public AutomationControl
+{
+  public:
+	PhaseControl (Session& session, std::string const & name);
+
+	/* There are two approaches to designing/using a PhaseControl. One is
+	 * to have one such control for every channel of the control's
+	 * owner. The other is to have a single control which manages all
+	 * channels. For now (Spring 2016) we're using the second design.
+	 */
+
+	void set_phase_invert (uint32_t, bool yn);
+	void set_phase_invert (boost::dynamic_bitset<>);
+	bool inverted (uint32_t chn) const { return _phase_invert[chn]; }
+
+	bool none () const { return !_phase_invert.any(); }
+	bool any() const { return _phase_invert.any(); }
+	uint64_t count() const { return _phase_invert.count(); }
+	uint64_t size() const { return _phase_invert.size(); }
+	void resize (uint32_t);
+
+	int set_state (XMLNode const&, int);
+	XMLNode& get_state ();
+
+  protected:
+	void actually_set_value (double, PBD::Controllable::GroupControlDisposition group_override);
+
+  private:
+	boost::dynamic_bitset<> _phase_invert;
+};
+
+} /* namespace */
+
+#endif /* __libardour_phase_control_h__ */
diff --git a/libs/ardour/ardour/playlist.h b/libs/ardour/ardour/playlist.h
index e5bdfd9..04615ac 100644
--- a/libs/ardour/ardour/playlist.h
+++ b/libs/ardour/ardour/playlist.h
@@ -38,7 +38,7 @@
 #include "pbd/sequence_property.h"
 #include "pbd/stacktrace.h"
 
-#include "evoral/types.hpp"
+#include "evoral/Range.hpp"
 
 #include "ardour/ardour.h"
 #include "ardour/region.h"
@@ -128,15 +128,14 @@ public:
 
 	/* Editing operations */
 
-	void add_region (boost::shared_ptr<Region>, framepos_t position, float times = 1, bool auto_partition = false);
+	void add_region (boost::shared_ptr<Region>, framepos_t position, float times = 1, bool auto_partition = false, const int32_t sub_num = 0);
 	void remove_region (boost::shared_ptr<Region>);
-	void remove_region_by_source (boost::shared_ptr<Source>);
 	void get_equivalent_regions (boost::shared_ptr<Region>, std::vector<boost::shared_ptr<Region> >&);
 	void get_region_list_equivalent_regions (boost::shared_ptr<Region>, std::vector<boost::shared_ptr<Region> >&);
 	void get_source_equivalent_regions (boost::shared_ptr<Region>, std::vector<boost::shared_ptr<Region> >&);
 	void replace_region (boost::shared_ptr<Region> old, boost::shared_ptr<Region> newr, framepos_t pos);
-	void split_region (boost::shared_ptr<Region>, framepos_t position);
-	void split (framepos_t at);
+	void split_region (boost::shared_ptr<Region>, framepos_t position, const int32_t sub_num);
+	void split (framepos_t at, const int32_t sub_num);
 	void shift (framepos_t at, frameoffset_t distance, bool move_intersected, bool ignore_music_glue);
 	void partition (framepos_t start, framepos_t end, bool cut = false);
 	void duplicate (boost::shared_ptr<Region>, framepos_t position, float times);
@@ -162,9 +161,10 @@ public:
 
 	boost::shared_ptr<Playlist> cut  (std::list<AudioRange>&, bool result_is_hidden = true);
 	boost::shared_ptr<Playlist> copy (std::list<AudioRange>&, bool result_is_hidden = true);
-	int                         paste (boost::shared_ptr<Playlist>, framepos_t position, float times);
+	int                         paste (boost::shared_ptr<Playlist>, framepos_t position, float times, const int32_t sub_num);
 
-	const RegionListProperty& region_list () const { return regions; }
+	const RegionListProperty& region_list_property () const { return regions; }
+	boost::shared_ptr<RegionList> region_list();
 
 	boost::shared_ptr<RegionList> regions_at (framepos_t frame);
 	uint32_t                   count_regions_at (framepos_t) const;
@@ -180,7 +180,8 @@ public:
 	bool                       region_is_shuffle_constrained (boost::shared_ptr<Region>);
 	bool                       has_region_at (framepos_t const) const;
 
-	bool uses_source (boost::shared_ptr<const Source> src) const;
+	bool uses_source (boost::shared_ptr<const Source> src, bool shallow = false) const;
+	void deep_sources (std::set<boost::shared_ptr<Source> >&) const;
 
 	framepos_t find_next_transient (framepos_t position, int dir);
 
@@ -361,7 +362,7 @@ public:
 
 	virtual XMLNode& state (bool);
 
-	bool add_region_internal (boost::shared_ptr<Region>, framepos_t position);
+	bool add_region_internal (boost::shared_ptr<Region>, framepos_t position, const int32_t sub_num = 0);
 
 	int remove_region_internal (boost::shared_ptr<Region>);
 	void copy_regions (RegionList&) const;
@@ -379,7 +380,7 @@ public:
 	void begin_undo ();
 	void end_undo ();
 
-	void _split_region (boost::shared_ptr<Region>, framepos_t position);
+	void _split_region (boost::shared_ptr<Region>, framepos_t position, const int32_t sub_num);
 
 	typedef std::pair<boost::shared_ptr<Region>, boost::shared_ptr<Region> > TwoRegions;
 
diff --git a/libs/ardour/ardour/plugin.h b/libs/ardour/ardour/plugin.h
index 44090c3..df4b512 100644
--- a/libs/ardour/ardour/plugin.h
+++ b/libs/ardour/ardour/plugin.h
@@ -22,6 +22,7 @@
 
 #include <boost/shared_ptr.hpp>
 #include <string>
+#include <set>
 
 #include "pbd/statefuldestructible.h"
 #include "pbd/controllable.h"
@@ -49,11 +50,21 @@ class BufferSet;
 class PluginInsert;
 class Plugin;
 class PluginInfo;
+class AutomationControl;
 
 typedef boost::shared_ptr<Plugin> PluginPtr;
 typedef boost::shared_ptr<PluginInfo> PluginInfoPtr;
 typedef std::list<PluginInfoPtr> PluginInfoList;
-
+typedef std::set<uint32_t> PluginOutputConfiguration;
+
+/** A plugin is an external module (usually 3rd party provided) loaded into Ardour
+ * for the purpose of digital signal processing.
+ *
+ * This class provides an abstraction for methords provided by
+ * all supported plugin standards such as presets, name, parameters etc.
+ *
+ * Plugins are not used directly in Ardour but always wrapped by a PluginInsert.
+ */
 class LIBARDOUR_API Plugin : public PBD::StatefulDestructible, public Latent
 {
   public:
@@ -77,6 +88,18 @@ class LIBARDOUR_API Plugin : public PBD::StatefulDestructible, public Latent
 	virtual std::string get_docs () const { return ""; }
 	virtual std::string get_parameter_docs (uint32_t /*which*/) const { return ""; }
 
+	struct UILayoutHint {
+		UILayoutHint ()
+			: x0(-1), x1(-1), y0(-1), y1(-1), knob(false) {}
+		int x0;
+		int x1;
+		int y0;
+		int y1;
+		bool knob;
+	};
+
+	virtual bool get_layout (uint32_t which, UILayoutHint&) const { return false; }
+
 	virtual int get_parameter_descriptor (uint32_t which, ParameterDescriptor&) const = 0;
 	virtual uint32_t nth_parameter (uint32_t which, bool& ok) const = 0;
 	virtual void activate () = 0;
@@ -84,10 +107,13 @@ class LIBARDOUR_API Plugin : public PBD::StatefulDestructible, public Latent
 	virtual void flush () { deactivate(); activate(); }
 
 	virtual int set_block_size (pframes_t nframes) = 0;
+	virtual bool requires_fixed_sized_buffers() const { return false; }
+	virtual bool inplace_broken() const { return false; }
 
 	virtual int connect_and_run (BufferSet& bufs,
-				     ChanMapping in, ChanMapping out,
-				     pframes_t nframes, framecnt_t offset);
+			framepos_t start, framepos_t end, double speed,
+			ChanMapping in, ChanMapping out,
+			pframes_t nframes, framecnt_t offset);
 
 	virtual std::set<Evoral::Parameter> automatable() const = 0;
 	virtual std::string describe_parameter (Evoral::Parameter) = 0;
@@ -99,6 +125,27 @@ class LIBARDOUR_API Plugin : public PBD::StatefulDestructible, public Latent
 	virtual bool parameter_is_input(uint32_t) const = 0;
 	virtual bool parameter_is_output(uint32_t) const = 0;
 
+	virtual uint32_t designated_bypass_port () { return UINT32_MAX; }
+
+	struct LIBARDOUR_API IOPortDescription {
+		public:
+		IOPortDescription (const std::string& n)
+			: name (n)
+			, is_sidechain (false)
+		{}
+		IOPortDescription (const IOPortDescription &other)
+			: name (other.name)
+			, is_sidechain (other.is_sidechain)
+		{}
+		std::string name;
+		bool is_sidechain;
+	};
+
+	virtual IOPortDescription describe_io_port (DataType dt, bool input, uint32_t id) const;
+	virtual PluginOutputConfiguration possible_output () const;
+
+	virtual void set_automation_control (uint32_t /*port_index*/, boost::shared_ptr<ARDOUR::AutomationControl>) { }
+
 	virtual boost::shared_ptr<ScalePoints> get_scale_points(uint32_t /*port_index*/) const {
 		return boost::shared_ptr<ScalePoints>();
 	}
@@ -107,6 +154,17 @@ class LIBARDOUR_API Plugin : public PBD::StatefulDestructible, public Latent
 	void realtime_locate ();
 	void monitoring_changed ();
 
+	typedef struct {
+		unsigned char *data;
+		int width;
+		int height;
+		int stride;
+	} Display_Image_Surface;
+
+	virtual bool has_inline_display () { return false; }
+	virtual Display_Image_Surface* render_inline_display (uint32_t, uint32_t) { return NULL; }
+	PBD::Signal0<void> QueueDraw;
+
 	struct PresetRecord {
 	    PresetRecord () : valid (false) {}
 	    PresetRecord (const std::string& u, const std::string& l, bool s = true) : uri (u), label (l), user (s), valid (true)  {}
@@ -167,6 +225,9 @@ class LIBARDOUR_API Plugin : public PBD::StatefulDestructible, public Latent
 		return 0;
 	}
 
+	/** the max possible latency a plugin will have */
+	virtual framecnt_t max_latency () const { return 0; } // TODO = 0, require implementation
+
 	/** Emitted when a preset is added or removed, respectively */
 	PBD::Signal0<void> PresetAdded;
 	PBD::Signal0<void> PresetRemoved;
@@ -194,7 +255,7 @@ class LIBARDOUR_API Plugin : public PBD::StatefulDestructible, public Latent
 	/* specific types of plugins can overload this. As of September 2008, only
 	   AUPlugin does this.
 	*/
-	virtual bool can_support_io_configuration (const ChanCount& /*in*/, ChanCount& /*out*/) { return false; }
+	virtual bool can_support_io_configuration (const ChanCount& /*in*/, ChanCount& /*out*/, ChanCount* imprecise = 0) { return false; }
 	virtual ChanCount output_streams() const;
 	virtual ChanCount input_streams() const;
 
@@ -334,6 +395,7 @@ class LIBARDOUR_API PluginInfo {
 
 	virtual PluginPtr load (Session& session) = 0;
 	virtual bool is_instrument() const;
+	virtual bool needs_midi_input() const { return is_instrument (); }
 	virtual bool in_category (const std::string &) const { return false; }
 
 	virtual std::vector<Plugin::PresetRecord> get_presets (bool user_only) const = 0;
diff --git a/libs/ardour/ardour/plugin_insert.h b/libs/ardour/ardour/plugin_insert.h
index ffa55b9..d38523a 100644
--- a/libs/ardour/ardour/plugin_insert.h
+++ b/libs/ardour/ardour/plugin_insert.h
@@ -27,9 +27,14 @@
 
 #include "ardour/ardour.h"
 #include "ardour/libardour_visibility.h"
+#include "ardour/chan_mapping.h"
+#include "ardour/fixed_delay.h"
+#include "ardour/io.h"
 #include "ardour/types.h"
 #include "ardour/parameter_descriptor.h"
+#include "ardour/plugin.h"
 #include "ardour/processor.h"
+#include "ardour/sidechain.h"
 #include "ardour/automation_control.h"
 
 class XMLNode;
@@ -56,37 +61,128 @@ class LIBARDOUR_API PluginInsert : public Processor
 	void update_id (PBD::ID);
 	void set_state_dir (const std::string& d = "");
 
-	void run (BufferSet& in, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, bool);
-	void silence (framecnt_t nframes);
+	void run (BufferSet& in, framepos_t start_frame, framepos_t end_frame, double speed, pframes_t nframes, bool);
+	void silence (framecnt_t nframes, framepos_t start_frame);
 
 	void activate ();
 	void deactivate ();
 	void flush ();
 
+	void enable (bool yn);
+	bool enabled () const;
+	bool bypassable () const;
+
 	bool reset_parameters_to_default ();
 	bool can_reset_all_parameters ();
 
 	int set_block_size (pframes_t nframes);
 
+	ChanMapping input_map (uint32_t num) const {
+		if (num < _in_map.size()) {
+			return _in_map.find (num)->second;
+		} else {
+			return ChanMapping ();
+		}
+	}
+
+	ChanMapping output_map (uint32_t num) const {
+		if (num < _out_map.size()) {
+			return _out_map.find (num)->second;
+		} else {
+			return ChanMapping ();
+		}
+	}
+
+	ChanMapping thru_map () const {
+		return _thru_map;
+	}
+
+	bool pre_seed (const ChanCount&, const ChanCount&, const ChanMapping&, const ChanMapping&, const ChanMapping&);
+
+	ChanMapping input_map () const; ///< combined (all instances) input map
+	ChanMapping no_sc_input_map () const; ///< combined (all instances) input map w/o sidechain sinks
+	ChanMapping output_map () const; ///< combined (all instances) output map
+	bool has_midi_bypass () const;
+	bool has_midi_thru () const;
+	bool inplace () const { return ! _no_inplace; }
+
+#ifdef MIXBUS
+	bool is_channelstrip () const;
+#endif
+
+	void set_input_map (uint32_t, ChanMapping);
+	void set_output_map (uint32_t, ChanMapping);
+	void set_thru_map (ChanMapping);
+	bool reset_map (bool emit = true);
+	bool sanitize_maps ();
+	bool check_inplace ();
+
+	// these are ports visible on the outside
 	ChanCount output_streams() const;
 	ChanCount input_streams() const;
+	ChanCount internal_streams() const; // with side-chain
+
+	// actual ports of all plugins.
+	// n * natural_i/o or result of reconfigurable i/o
+	ChanCount internal_output_streams() const;
+	ChanCount internal_input_streams() const;
+
+	// a single plugin's internal i/o
 	ChanCount natural_output_streams() const;
 	ChanCount natural_input_streams() const;
 
-	bool     set_count (uint32_t num);
-	uint32_t get_count () const { return _plugins.size(); }
+	/** plugin ports marked as sidechain */
+	ChanCount sidechain_input_pins() const;
+
+	/** Plugin-Insert IO sidechain ports */
+	ChanCount sidechain_input_ports() const {
+		if (_sidechain) {
+			return _sidechain->input ()->n_ports ();
+		} else {
+			return ChanCount ();
+		}
+	}
+
+	const ChanCount& required_buffers () const { return _required_buffers; }
+	const ChanCount& preset_out () const { return _preset_out; }
+
+	// allow to override output_streams(), implies "Custom Mode"
+
+	// only the owning route may call these (with process lock held)
+	// route is not a friend class, it owns us
+	bool set_count      (uint32_t num);
+	void set_sinks      (const ChanCount&); // reconfigurable I/O ONLY
+	void set_outputs    (const ChanCount&);
+	void set_strict_io  (bool b);
+	void set_custom_cfg (bool b);
+	bool set_preset_out (const ChanCount&);
+	bool add_sidechain  (uint32_t n_audio = 1, uint32_t n_midi = 0);
+	bool del_sidechain ();
+	void set_sidechain_latency (uint32_t, uint32_t);
+	boost::shared_ptr<SideChain> sidechain () const { return _sidechain; }
+	// end C++ class slavery!
+
+	uint32_t get_count  () const { return _plugins.size(); }
+	bool     strict_io  () const { return _strict_io; }
+	bool     custom_cfg () const { return _custom_cfg; }
 
 	bool can_support_io_configuration (const ChanCount& in, ChanCount& out);
 	bool configure_io (ChanCount in, ChanCount out);
 
 	bool has_no_inputs() const;
 	bool has_no_audio_inputs() const;
-	bool is_midi_instrument() const;
+	bool needs_midi_input() const;
+	bool has_output_presets (
+			ChanCount in = ChanCount (DataType::MIDI, 1),
+			ChanCount out = ChanCount (DataType::AUDIO, 2)
+			);
 
 	void realtime_handle_transport_stopped ();
 	void realtime_locate ();
 	void monitoring_changed ();
 
+	bool load_preset (Plugin::PresetRecord);
+
 	/** A control that manipulates a plugin parameter (control port). */
 	struct PluginControl : public AutomationControl
 	{
@@ -95,15 +191,13 @@ class LIBARDOUR_API PluginInsert : public Processor
 		               const ParameterDescriptor&        desc,
 		               boost::shared_ptr<AutomationList> list=boost::shared_ptr<AutomationList>());
 
-		void set_value (double val, PBD::Controllable::GroupControlDisposition group_override);
-		void set_value_unchecked (double);
 		double get_value (void) const;
 		void catch_up_with_external_value (double val);
 		XMLNode& get_state();
 
 	private:
 		PluginInsert* _plugin;
-		void _set_value (double val, PBD::Controllable::GroupControlDisposition group_override);
+		void actually_set_value (double val, PBD::Controllable::GroupControlDisposition group_override);
 	};
 
 	/** A control that manipulates a plugin property (message). */
@@ -114,10 +208,10 @@ class LIBARDOUR_API PluginInsert : public Processor
 		                       const ParameterDescriptor&        desc,
 		                       boost::shared_ptr<AutomationList> list=boost::shared_ptr<AutomationList>());
 
-		void set_value (double val, PBD::Controllable::GroupControlDisposition group_override);
-		void set_value_unchecked (double);
 		double get_value (void) const;
 		XMLNode& get_state();
+        protected:
+		void actually_set_value (double value, PBD::Controllable::GroupControlDisposition);
 
 	private:
 		PluginInsert* _plugin;
@@ -132,6 +226,19 @@ class LIBARDOUR_API PluginInsert : public Processor
 		}
 	}
 
+	framecnt_t plugin_latency () const;
+
+	bool has_sidechain () const {
+		return _sidechain ? true : false;
+	}
+
+	boost::shared_ptr<IO> sidechain_input () const {
+		if (_sidechain) {
+			return _sidechain->input ();
+		}
+		return boost::shared_ptr<IO> ();
+	}
+
 	PluginType type ();
 
 	std::string describe_parameter (Evoral::Parameter param);
@@ -142,14 +249,23 @@ class LIBARDOUR_API PluginInsert : public Processor
 
 	void collect_signal_for_analysis (framecnt_t nframes);
 
+	bool strict_io_configured () const {
+		return _match.strict_io;
+	}
+
 	bool splitting () const {
 		return _match.method == Split;
 	}
 
-	void configured_io (ChanCount &in, ChanCount &out) { in = _configured_in; out = _configured_out; }
+	void configured_io (ChanCount &in, ChanCount &out) const {
+		in = _configured_in;
+		out = _configured_out;
+	}
 
 	PBD::Signal2<void,BufferSet*, BufferSet*> AnalysisDataGathered;
 	PBD::Signal0<void> PluginIoReConfigure;
+	PBD::Signal0<void> PluginMapChanged;
+	PBD::Signal0<void> PluginConfigChanged;
 
 	/** Enumeration of the ways in which we can match our insert's
 	 *  IO to that of the plugin(s).
@@ -164,19 +280,38 @@ class LIBARDOUR_API PluginInsert : public Processor
 		Hide,        ///< we `hide' some of the plugin's inputs by feeding them silence
 	};
 
+	/** Description of how we can match our plugin's IO to our own insert IO */
+	struct Match {
+		Match () : method (Impossible), plugins (0), strict_io (false), custom_cfg (false) {}
+		Match (MatchingMethod m, int32_t p,
+				bool strict = false, bool custom = false, ChanCount h = ChanCount ())
+			: method (m), plugins (p), hide (h), strict_io (strict), custom_cfg (custom) {}
+
+		MatchingMethod method; ///< method to employ
+		int32_t plugins;       ///< number of copies of the plugin that we need
+		ChanCount hide;        ///< number of channels to hide
+		bool strict_io;        ///< force in == out
+		bool custom_cfg;       ///< custom config (if not strict)
+	};
+
   private:
 	/* disallow copy construction */
 	PluginInsert (const PluginInsert&);
 
 	void parameter_changed_externally (uint32_t, float);
 
-	void  set_parameter (Evoral::Parameter param, float val);
+	void set_parameter (Evoral::Parameter param, float val);
 
 	float default_parameter_value (const Evoral::Parameter& param);
 
 	typedef std::vector<boost::shared_ptr<Plugin> > Plugins;
 	Plugins _plugins;
 
+	boost::shared_ptr<SideChain> _sidechain;
+	uint32_t _sc_playback_latency;
+	uint32_t _sc_capture_latency;
+	uint32_t _plugin_signal_latency;
+
 	boost::weak_ptr<Plugin> _impulseAnalysisPlugin;
 
 	framecnt_t _signal_analysis_collected_nframes;
@@ -185,41 +320,62 @@ class LIBARDOUR_API PluginInsert : public Processor
 	BufferSet _signal_analysis_inputs;
 	BufferSet _signal_analysis_outputs;
 
-	ChanCount midi_bypass;
+	FixedDelay _delaybuffers;
 
 	ChanCount _configured_in;
+	ChanCount _configured_internal; // with side-chain
 	ChanCount _configured_out;
-
-	/** Description of how we can match our plugin's IO to our own insert IO */
-	struct Match {
-		Match () : method (Impossible), plugins (0) {}
-		Match (MatchingMethod m, int32_t p, ChanCount h = ChanCount ()) : method (m), plugins (p), hide (h) {}
-
-		MatchingMethod method; ///< method to employ
-		int32_t plugins;       ///< number of copies of the plugin that we need
-		ChanCount hide;        ///< number of channels to hide
-	};
-
-	Match private_can_support_io_configuration (ChanCount const &, ChanCount &);
+	ChanCount _custom_out;
+	ChanCount _custom_sinks;
+	ChanCount _preset_out;
+	ChanCount _cached_sidechain_pins;
+	ChanCount _required_buffers;
+
+	bool _configured;
+	bool _no_inplace;
+	bool _strict_io;
+	bool _custom_cfg;
+	bool _maps_from_state;
+	bool _mapping_changed;
+
+	Match private_can_support_io_configuration (ChanCount const &, ChanCount &) const;
+	Match internal_can_support_io_configuration (ChanCount const &, ChanCount &) const;
+	Match automatic_can_support_io_configuration (ChanCount const &, ChanCount &) const;
 
 	/** details of the match currently being used */
 	Match _match;
 
-	void automation_run (BufferSet& bufs, framepos_t start, pframes_t nframes);
-	void connect_and_run (BufferSet& bufs, pframes_t nframes, framecnt_t offset, bool with_auto, framepos_t now = 0);
+	typedef std::map <uint32_t, ARDOUR::ChanMapping> PinMappings;
+	PinMappings _in_map;
+	PinMappings _out_map;
+	ChanMapping _thru_map; // out-idx <=  in-idx
+
+	void automation_run (BufferSet& bufs, framepos_t start, framepos_t end, double speed, pframes_t nframes);
+	void connect_and_run (BufferSet& bufs, framepos_t start, framecnt_t end, double speed, pframes_t nframes, framecnt_t offset, bool with_auto);
+	void bypass (BufferSet& bufs, pframes_t nframes);
+	void inplace_silence_unconnected (BufferSet&, const PinMappings&, framecnt_t nframes, framecnt_t offset) const;
 
 	void create_automatable_parameters ();
 	void control_list_automation_state_changed (Evoral::Parameter, AutoState);
 	void set_parameter_state_2X (const XMLNode& node, int version);
 	void set_control_ids (const XMLNode&, int version);
 
+	void enable_changed ();
+	void bypassable_changed ();
+
 	boost::shared_ptr<Plugin> plugin_factory (boost::shared_ptr<Plugin>);
 	void add_plugin (boost::shared_ptr<Plugin>);
 
 	void start_touch (uint32_t param_id);
 	void end_touch (uint32_t param_id);
+
+	void latency_changed ();
+	bool _latency_changed;
+	uint32_t _bypass_port;
 };
 
 } // namespace ARDOUR
 
+std::ostream& operator<<(std::ostream& o, const ARDOUR::PluginInsert::Match& m);
+
 #endif /* __ardour_plugin_insert_h__ */
diff --git a/libs/ardour/ardour/plugin_manager.h b/libs/ardour/ardour/plugin_manager.h
index e25a268..1a92543 100644
--- a/libs/ardour/ardour/plugin_manager.h
+++ b/libs/ardour/ardour/plugin_manager.h
@@ -50,6 +50,7 @@ class LIBARDOUR_API PluginManager : public boost::noncopyable {
 	ARDOUR::PluginInfoList &ladspa_plugin_info ();
 	ARDOUR::PluginInfoList &lv2_plugin_info ();
 	ARDOUR::PluginInfoList &au_plugin_info ();
+	ARDOUR::PluginInfoList &lua_plugin_info ();
 
 	void refresh (bool cache_only = false);
 	void cancel_plugin_scan();
@@ -112,6 +113,7 @@ class LIBARDOUR_API PluginManager : public boost::noncopyable {
 	ARDOUR::PluginInfoList* _ladspa_plugin_info;
 	ARDOUR::PluginInfoList* _lv2_plugin_info;
 	ARDOUR::PluginInfoList* _au_plugin_info;
+	ARDOUR::PluginInfoList* _lua_plugin_info;
 
 	std::map<uint32_t, std::string> rdf_type;
 
@@ -122,6 +124,8 @@ class LIBARDOUR_API PluginManager : public boost::noncopyable {
 	bool _cancel_timeout;
 
 	void ladspa_refresh ();
+	void lua_refresh ();
+	void lua_refresh_cb ();
 	void windows_vst_refresh (bool cache_only = false);
 	void lxvst_refresh (bool cache_only = false);
 
@@ -146,6 +150,7 @@ class LIBARDOUR_API PluginManager : public boost::noncopyable {
 	std::string get_ladspa_category (uint32_t id);
 	std::vector<uint32_t> ladspa_plugin_whitelist;
 
+	PBD::ScopedConnection lua_refresh_connection;
 	Glib::Threads::Mutex _lock;
 
 	static PluginManager* _instance; // singleton
diff --git a/libs/ardour/ardour/plugin_types.h b/libs/ardour/ardour/plugin_types.h
index e0dd660..d997e28 100644
--- a/libs/ardour/ardour/plugin_types.h
+++ b/libs/ardour/ardour/plugin_types.h
@@ -28,6 +28,7 @@ namespace ARDOUR {
 		LV2,
 		Windows_VST,
 		LXVST,
+		Lua,
 	};
 
 }
diff --git a/libs/ardour/ardour/port.h b/libs/ardour/ardour/port.h
index 97f8a4e..619b8ba 100644
--- a/libs/ardour/ardour/port.h
+++ b/libs/ardour/ardour/port.h
@@ -57,11 +57,12 @@ public:
 
 	/** @return Port human readable name */
 	std::string pretty_name (bool fallback_to_name = false) const;
+	bool set_pretty_name (const std::string&);
 
 	int set_name (std::string const &);
 
 	/** @return flags */
-        PortFlags flags () const {
+	PortFlags flags () const {
 		return _flags;
 	}
 
@@ -98,9 +99,9 @@ public:
 	bool last_monitor() const { return _last_monitor; }
 	void set_last_monitor (bool yn) { _last_monitor = yn; }
 
-        PortEngine::PortHandle port_handle() { return _port_handle; }
+	PortEngine::PortHandle port_handle() { return _port_handle; }
 
-        void get_connected_latency_range (LatencyRange& range, bool playback) const;
+	void get_connected_latency_range (LatencyRange& range, bool playback) const;
 
 	void set_private_latency_range (LatencyRange& range, bool playback);
 	const LatencyRange&  private_latency_range (bool playback) const;
@@ -124,6 +125,7 @@ public:
 	PBD::Signal1<void,bool> MonitorInputChanged;
 	static PBD::Signal2<void,boost::shared_ptr<Port>,boost::shared_ptr<Port> > PostDisconnect;
 	static PBD::Signal0<void> PortDrop;
+	static PBD::Signal0<void> PortSignalDrop;
 
 	static void set_cycle_framecnt (pframes_t n) {
 		_cycle_nframes = n;
@@ -168,8 +170,11 @@ private:
 	*/
 	std::set<std::string> _connections;
 
-       void drop ();
-       PBD::ScopedConnection drop_connection;
+	void port_connected_or_disconnected (boost::weak_ptr<Port>, boost::weak_ptr<Port>, bool);
+	void signal_drop ();
+	void drop ();
+	PBD::ScopedConnection drop_connection;
+	PBD::ScopedConnection engine_connection;
 };
 
 }
diff --git a/libs/ardour/ardour/port_engine.h b/libs/ardour/ardour/port_engine.h
index 5d18706..a6fa2a5 100644
--- a/libs/ardour/ardour/port_engine.h
+++ b/libs/ardour/ardour/port_engine.h
@@ -138,6 +138,17 @@ class LIBARDOUR_API PortEngine {
      */
     virtual int get_port_property (PortHandle, const std::string& key, std::string& value, std::string& type) const { return -1; }
 
+    /** Set the port-property value and type for a given key
+     *
+     * The API follows jack_set_property():
+     * @param key The key of the property.
+     * @param value The value of the property.
+     * @param type The type of the property.
+     *
+     * @return 0 on success, -1 on error
+     */
+    virtual int set_port_property (PortHandle, const std::string& key, const std::string& value, const std::string& type) { return -1; }
+
     /** Return a reference to a port with the fullname @param name. Return
      * an "empty" PortHandle (analogous to a null pointer) if no such port exists.
      */
diff --git a/libs/ardour/ardour/port_insert.h b/libs/ardour/ardour/port_insert.h
index 54d8583..0b1b3fb 100644
--- a/libs/ardour/ardour/port_insert.h
+++ b/libs/ardour/ardour/port_insert.h
@@ -26,6 +26,7 @@
 
 #include "ardour/ardour.h"
 #include "ardour/io_processor.h"
+#include "ardour/delivery.h"
 #include "ardour/libardour_visibility.h"
 #include "ardour/types.h"
 
@@ -52,7 +53,11 @@ class LIBARDOUR_API PortInsert : public IOProcessor
 	XMLNode& get_state(void);
 	int set_state (const XMLNode&, int version);
 
-	void run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, bool);
+	void run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, double speed, pframes_t nframes, bool);
+
+	void flush_buffers (framecnt_t nframes) {
+		_out->flush_buffers (nframes);
+	}
 
 	framecnt_t signal_latency () const;
 
diff --git a/libs/ardour/ardour/port_manager.h b/libs/ardour/ardour/port_manager.h
index 21ba221..ba1a8c3 100644
--- a/libs/ardour/ardour/port_manager.h
+++ b/libs/ardour/ardour/port_manager.h
@@ -39,6 +39,7 @@ namespace ARDOUR {
 
 class PortEngine;
 class AudioBackend;
+class Session;
 
 class LIBARDOUR_API PortManager
 {
@@ -147,7 +148,7 @@ class LIBARDOUR_API PortManager
 	boost::shared_ptr<Ports> _cycle_ports;
 
 	void fade_out (gain_t, gain_t, pframes_t);
-	void silence (pframes_t nframes);
+	void silence (pframes_t nframes, Session *s = 0);
 	void silence_outputs (pframes_t nframes);
 	void check_monitoring ();
 	/** Signal the start of an audio cycle.
diff --git a/libs/ardour/ardour/port_set.h b/libs/ardour/ardour/port_set.h
index cd76f75..fce3627 100644
--- a/libs/ardour/ardour/port_set.h
+++ b/libs/ardour/ardour/port_set.h
@@ -49,10 +49,15 @@ public:
 	void add (boost::shared_ptr<Port> port);
 	bool remove (boost::shared_ptr<Port> port);
 
-	/** nth port */
+	/** nth port
+	 * @param index port index
+	 */
 	boost::shared_ptr<Port> port(size_t index) const;
 
-	/** nth port of type @a t, or nth port if t = NIL */
+	/** nth port of type @a t, or nth port if t = NIL
+	 * @param t data type
+	 * @param index port index
+	 */
 	boost::shared_ptr<Port> port(DataType t, size_t index) const;
 
 	boost::shared_ptr<AudioPort> nth_audio_port(size_t n) const;
diff --git a/libs/ardour/ardour/presentation_info.h b/libs/ardour/ardour/presentation_info.h
new file mode 100644
index 0000000..6ef0fae
--- /dev/null
+++ b/libs/ardour/ardour/presentation_info.h
@@ -0,0 +1,253 @@
+/*
+    Copyright (C) 2016 Paul Davis
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#ifndef __libardour_presentation_info_h__
+#define __libardour_presentation_info_h__
+
+#include <iostream>
+#include <string>
+
+#include <stdint.h>
+
+#include "pbd/signals.h"
+#include "pbd/stateful.h"
+#include "pbd/properties.h"
+
+#include "ardour/libardour_visibility.h"
+
+class XMLNode;
+
+namespace ARDOUR {
+
+namespace Properties {
+	LIBARDOUR_API extern PBD::PropertyDescriptor<uint32_t> order;
+	LIBARDOUR_API extern PBD::PropertyDescriptor<uint32_t> color;
+	LIBARDOUR_API extern PBD::PropertyDescriptor<bool> selected;
+	/* we use this; declared in region.cc */
+	LIBARDOUR_API extern PBD::PropertyDescriptor<bool> hidden;
+}
+
+class LIBARDOUR_API PresentationInfo : public PBD::Stateful
+{
+  public:
+
+	/* a PresentationInfo object exists to share information between
+	 * different user interfaces (e.g. GUI and a Mackie Control surface)
+	 * about:
+	 *
+	 *     - ordering
+	 *     - selection status
+	 *     - visibility
+	 *     - object identity
+	 *
+	 * ORDERING
+	 *
+	 * One UI takes control of ordering by setting the "order" value for
+	 * the PresentationInfo component of every Stripable object. In Ardour,
+	 * this is done by the GUI (mostly because it is very hard for the user
+	 * to re-order things on a control surface).
+	 *
+	 * Ordering is a complex beast, however. Different user interfaces may
+	 * display things in different ways. For example, the GUI of Ardour
+	 * allows the user to mix busses in between tracks. A control surface
+	 * may do the same, but may also allow the user to press a button that
+	 * makes it show only busses, or only MIDI tracks. At that point, the
+	 * ordering on the surface differs from the ordering in the GUI.
+	 *
+	 * There are several pathways for the order being set:
+	 *
+	 *   - object created during session loading from XML
+	 *           - numeric order will be set during ::set_state(), based on
+	 *           - type will be set during ctor call
+	 *
+	 *   - object created in response to user request
+	 *		- numeric order will be set by Session, before adding
+	 *		     to container.
+	 *		- type set during ctor call
+	 *
+	 *
+	 * OBJECT IDENTITY
+	 *
+	 * Control surfaces/protocols often need to be able to get a handle on
+	 * an object identified only abstractly, such as the "5th audio track"
+	 * or "the master out". A PresentationInfo object uniquely identifies
+	 * all objects in this way through the combination of its _order member
+	 * and part of its _flags member. The _flags member identifies the type
+	 * of object, as well as selection/hidden status. The type may never
+	 * change after construction (not strictly the constructor itself, but
+	 * a more generalized notion of construction, as in "ready to use").
+	 *
+	 * SELECTION
+	 *
+	 * When an object is selected, its _flags member will have the Selected
+	 * bit set.
+	 *
+	 * VISIBILITY
+	 *
+	 * When an object is hidden, its _flags member will have the Hidden
+	 * bit set.
+	 *
+	 *
+	 */
+
+	enum Flag {
+		/* Type information */
+		AudioTrack = 0x1,
+		MidiTrack = 0x2,
+		AudioBus = 0x4,
+		MidiBus = 0x8,
+		VCA = 0x10,
+		MasterOut = 0x20,
+		MonitorOut = 0x40,
+		Auditioner = 0x80,
+		/* These are for sharing Stripable states between the GUI and other
+		 * user interfaces/control surfaces
+		 */
+		Selected = 0x100,
+		Hidden = 0x200,
+		/* single bit indicates that the group order is set */
+		OrderSet = 0x400,
+
+		/* special mask to delect out "state" bits */
+		StatusMask = (Selected|Hidden)
+	};
+
+	static const Flag AllStripables; /* mask to use for any route or VCA (but not auditioner) */
+	static const Flag AllRoutes; /* mask to use for any route include master+monitor, but not auditioner */
+	static const Flag Route;     /* mask for any route (bus or track */
+	static const Flag Track;     /* mask to use for any track */
+	static const Flag Bus;       /* mask to use for any bus */
+
+	typedef uint32_t order_t;
+	typedef uint32_t color_t;
+
+	PresentationInfo (Flag f);
+	PresentationInfo (order_t o, Flag f);
+	PresentationInfo (PresentationInfo const &);
+
+	static const order_t max_order;
+
+	PresentationInfo::Flag flags() const { return _flags; }
+	order_t  order() const { return _order; }
+	color_t  color() const { return _color; }
+
+	bool color_set() const;
+
+	void set_color (color_t);
+	void set_selected (bool yn);
+	void set_hidden (bool yn);
+	void set_flags (Flag f) { _flags = f; }
+
+	bool order_set() const { return _flags & OrderSet; }
+
+	bool hidden() const { return _flags & Hidden; }
+	bool selected() const { return _flags & Selected; }
+	bool special() const { return _flags & (MasterOut|MonitorOut|Auditioner); }
+
+	bool flag_match (Flag f) const {
+		/* no flags, match all */
+
+		if (f == Flag (0)) {
+			return true;
+		}
+
+		if (f & StatusMask) {
+			/* status bits set, must match them */
+			if ((_flags & StatusMask) != (f & StatusMask)) {
+				return false;
+			}
+		}
+
+		/* Generic flags in f, match the right stuff */
+
+		if (f == Bus && (_flags & Bus)) {
+			/* some kind of bus */
+			return true;
+		}
+		if (f == Track && (_flags & Track)) {
+			/* some kind of track */
+			return true;
+		}
+		if (f == Route && (_flags & Route)) {
+			/* any kind of route, but not master, monitor in
+			   or auditioner.
+			 */
+			return true;
+		}
+
+		if (f == AllRoutes && (_flags & AllRoutes)) {
+			/* any kind of route, but not auditioner. Ask for that
+			   specifically.
+			*/
+			return true;
+		}
+
+		if (f == AllStripables && (_flags & AllStripables)) {
+			/* any kind of stripable, but not auditioner. Ask for that
+			   specifically.
+			*/
+			return true;
+		}
+
+		/* compare without status mask - we already checked that above 
+		 */
+
+		return (_flags & (f &~ (StatusMask|OrderSet))) != 0; /* some flag matches */
+	}
+
+	int set_state (XMLNode const&, int);
+	XMLNode& get_state ();
+
+	bool operator==(PresentationInfo const& other) {
+		return (_order == other.order()) && (_flags == other.flags());
+	}
+
+	bool operator!=(PresentationInfo const& other) {
+		return (_order != other.order()) || (_flags != other.flags());
+	}
+
+	PresentationInfo& operator= (PresentationInfo const& other);
+
+	static Flag get_flags (XMLNode const& node);
+	static std::string state_node_name;
+
+	/* for things concerned about *any* PresentationInfo. This is emitted
+	 * only at the request of another object that has finished making some
+	 * changes (e.g. reordering things)
+	 */
+
+	static PBD::Signal0<void> Change;
+
+	static void make_property_quarks ();
+
+  protected:
+	friend class Stripable;
+	void set_order (order_t order);
+
+  private:
+	order_t _order;
+	Flag    _flags;
+	color_t _color;
+};
+
+}
+
+std::ostream& operator<<(std::ostream& o, ARDOUR::PresentationInfo const& rid);
+
+#endif /* __libardour_presentation_info_h__ */
diff --git a/libs/ardour/ardour/process_thread.h b/libs/ardour/ardour/process_thread.h
index ee2e522..cd1087f 100644
--- a/libs/ardour/ardour/process_thread.h
+++ b/libs/ardour/ardour/process_thread.h
@@ -47,6 +47,7 @@ public:
 
 	static BufferSet& get_silent_buffers (ChanCount count = ChanCount::ZERO);
 	static BufferSet& get_scratch_buffers (ChanCount count = ChanCount::ZERO, bool silence = false);
+	static BufferSet& get_noinplace_buffers (ChanCount count = ChanCount::ZERO);
 	static BufferSet& get_route_buffers (ChanCount count = ChanCount::ZERO, bool silence = false);
 	static BufferSet& get_mix_buffers (ChanCount count = ChanCount::ZERO);
 	static gain_t* gain_automation_buffer ();
diff --git a/libs/ardour/ardour/processor.h b/libs/ardour/ardour/processor.h
index c7d3608..1a4863f 100644
--- a/libs/ardour/ardour/processor.h
+++ b/libs/ardour/ardour/processor.h
@@ -36,6 +36,7 @@
 
 class XMLNode;
 class ProcessorWindowProxy;
+class PluginPinWindowProxy;
 
 namespace ARDOUR {
 
@@ -58,7 +59,9 @@ class LIBARDOUR_API Processor : public SessionObject, public Automatable, public
 	virtual bool display_to_user() const { return _display_to_user; }
 	virtual void set_display_to_user (bool);
 
-	bool active () const { return _pending_active; }
+	bool active () const { return _pending_active; } ///< ardour hard bypass
+	virtual bool enabled () const { return _pending_active; } ///< processor enabled/bypass
+	virtual bool bypassable () const { return true; } ///< enable is not automated or locked
 
 	virtual bool does_routing() const { return false; }
 
@@ -73,13 +76,15 @@ class LIBARDOUR_API Processor : public SessionObject, public Automatable, public
 	/** @param result_required true if, on return from this method, @a bufs is required to contain valid data;
 	 *  if false, the method need not bother writing to @a bufs if it doesn't want to.
 	 */
-	virtual void run (BufferSet& /*bufs*/, framepos_t /*start_frame*/, framepos_t /*end_frame*/, pframes_t /*nframes*/, bool /*result_required*/) {}
-	virtual void silence (framecnt_t /*nframes*/) {}
+	virtual void run (BufferSet& /*bufs*/, framepos_t /*start_frame*/, framepos_t /*end_frame*/, double speed, pframes_t /*nframes*/, bool /*result_required*/) {}
+	virtual void silence (framecnt_t /*nframes*/, framepos_t /*start_frame*/) {}
 
 	virtual void activate ()   { _pending_active = true; ActiveChanged(); }
 	virtual void deactivate () { _pending_active = false; ActiveChanged(); }
 	virtual void flush() {}
 
+	virtual void enable (bool yn) { if (yn) { activate (); } else { deactivate (); } }
+
 	virtual bool configure_io (ChanCount in, ChanCount out);
 
 	/* Derived classes should override these, or processor appears as an in-place pass-through */
@@ -110,13 +115,17 @@ class LIBARDOUR_API Processor : public SessionObject, public Automatable, public
 	virtual void set_pre_fader (bool);
 
 	PBD::Signal0<void>                     ActiveChanged;
+	PBD::Signal0<void>                     BypassableChanged;
 	PBD::Signal2<void,ChanCount,ChanCount> ConfigurationChanged;
 
 	void  set_ui (void*);
 	void* get_ui () const { return _ui_pointer; }
 
 	ProcessorWindowProxy * window_proxy () const { return _window_proxy; }
-	void set_window_proxy (ProcessorWindowProxy* wp);
+	void set_window_proxy (ProcessorWindowProxy* wp) { _window_proxy = wp; }
+
+	PluginPinWindowProxy * pinmgr_proxy () const { return _pinmgr_proxy; }
+	void set_pingmgr_proxy (PluginPinWindowProxy* wp) { _pinmgr_proxy = wp ; }
 
 	void set_owner (SessionObject*);
 	SessionObject* owner() const;
@@ -134,6 +143,7 @@ protected:
 	bool      _pre_fader; ///< true if this processor is currently placed before the Amp, otherwise false
 	void*     _ui_pointer;
 	ProcessorWindowProxy *_window_proxy;
+	PluginPinWindowProxy *_pinmgr_proxy;
 	SessionObject* _owner;
 };
 
diff --git a/libs/ardour/ardour/profile.h b/libs/ardour/ardour/profile.h
index 1ea7e2b..cc3ae4f 100644
--- a/libs/ardour/ardour/profile.h
+++ b/libs/ardour/ardour/profile.h
@@ -31,7 +31,6 @@ class LIBARDOUR_API RuntimeProfile {
 public:
 	enum Element {
 		SmallScreen,
-		SAE,
 		SinglePackage,
 		Trx,
 		Mixbus,
@@ -44,9 +43,6 @@ public:
     void set_small_screen() { bits[SmallScreen] = true; }
     bool get_small_screen() const { return bits[SmallScreen]; }
 
-    void set_sae () { bits[SAE] = true; }
-    bool get_sae () const { return bits[SAE]; }
-
     bool get_trx() const { return bits[Trx]; }
     void set_trx() { bits[Trx] = true; }
 
diff --git a/libs/ardour/ardour/proxy_controllable.h b/libs/ardour/ardour/proxy_controllable.h
index c60f5f1..22761d7 100644
--- a/libs/ardour/ardour/proxy_controllable.h
+++ b/libs/ardour/ardour/proxy_controllable.h
@@ -40,7 +40,7 @@ class LIBARDOUR_API ProxyControllable : public PBD::Controllable {
 		, _getter (getter)
 	{}
 
-	void set_value (double v, PBD::Controllable::GroupControlDisposition /*group_override*/) { if (_setter (v)) { Changed(); /* EMIT SIGNAL */ } }
+	void set_value (double v, PBD::Controllable::GroupControlDisposition gcd) { if (_setter (v)) { Changed (true, gcd); /* EMIT SIGNAL */ } }
 	double get_value () const { return _getter (); }
 
 	double internal_to_user (double i) const { return accurate_coefficient_to_dB (i);}
diff --git a/libs/ardour/ardour/rc_configuration_vars.h b/libs/ardour/ardour/rc_configuration_vars.h
index 39f7709..a753e1b 100644
--- a/libs/ardour/ardour/rc_configuration_vars.h
+++ b/libs/ardour/ardour/rc_configuration_vars.h
@@ -40,6 +40,7 @@ CONFIG_VARIABLE (bool, auto_connect_standard_busses, "auto-connect-standard-buss
 */
 CONFIG_VARIABLE (AutoConnectOption, output_auto_connect, "output-auto-connect", AutoConnectMaster)
 CONFIG_VARIABLE (AutoConnectOption, input_auto_connect, "input-auto-connect", AutoConnectPhysical)
+CONFIG_VARIABLE (bool, strict_io, "strict-io", true)
 
 /* Naming */
 CONFIG_VARIABLE (TracksAutoNamingRule, tracks_auto_naming, "tracks-auto-naming", UseDefaultNames)
@@ -84,7 +85,6 @@ CONFIG_VARIABLE (float, ltc_output_volume, "ltc-output-volume", 0.125893)
 
 CONFIG_VARIABLE (uint32_t, feedback_interval_ms,  "feedback-interval-ms", 100)
 CONFIG_VARIABLE (bool, use_tranzport,  "use-tranzport", false)
-CONFIG_VARIABLE (RemoteModel, remote_model, "remote-model", MixerOrdered)
 
 /* disk operations */
 
@@ -97,6 +97,7 @@ CONFIG_VARIABLE (float, audio_playback_buffer_seconds, "playback-buffer-seconds"
 CONFIG_VARIABLE (float, midi_track_buffer_seconds, "midi-track-buffer-seconds", 1.0)
 CONFIG_VARIABLE (uint32_t, disk_choice_space_threshold,  "disk-choice-space-threshold", 57600000)
 CONFIG_VARIABLE (bool, auto_analyse_audio, "auto-analyse-audio", false)
+CONFIG_VARIABLE (float, transient_sensitivity, "transient-sensitivity", 50)
 
 /* OSC */
 
@@ -198,6 +199,7 @@ CONFIG_VARIABLE (MeterType, meter_type_bus, "meter-type-bus", MeterPeak)
 
 /* miscellany */
 
+CONFIG_VARIABLE (bool, try_autostart_engine, "try-autostart-engine", false)
 CONFIG_VARIABLE (std::string, auditioner_output_left, "auditioner-output-left", "default")
 CONFIG_VARIABLE (std::string, auditioner_output_right, "auditioner-output-right", "default")
 CONFIG_VARIABLE (bool, replicate_missing_region_channels, "replicate-missing-region-channels", false)
@@ -237,7 +239,8 @@ CONFIG_VARIABLE (bool, discover_vst_on_start, "discover-vst-on-start", false)
 CONFIG_VARIABLE (bool, verbose_plugin_scan, "verbose-plugin-scan", true)
 CONFIG_VARIABLE (int, vst_scan_timeout, "vst-scan-timeout", 600) /* deciseconds, per plugin, <= 0 no timeout */
 CONFIG_VARIABLE (bool, discover_audio_units, "discover-audio-units", false)
-CONFIG_VARIABLE (bool, open_gui_after_adding_plugin, "open-gui-after-adding-plugin", true)
+CONFIG_VARIABLE (bool, ask_replace_instrument, "ask-replace-instrument", true)
+CONFIG_VARIABLE (bool, ask_setup_instrument, "ask-setup-instrument", true)
 
 /* custom user plugin paths */
 CONFIG_VARIABLE (std::string, plugin_path_vst, "plugin-path-vst", "@default@")
@@ -271,3 +274,6 @@ CONFIG_VARIABLE (std::string, video_server_docroot, "video-server-docroot", "C:\
 #endif
 CONFIG_VARIABLE (bool, show_video_export_info, "show-video-export-info", true)
 CONFIG_VARIABLE (bool, show_video_server_dialog, "show-video-server-dialog", false)
+
+CONFIG_VARIABLE (float, export_preroll, "export-preroll", 10.0) // seconds
+CONFIG_VARIABLE (float, export_silence_threshold, "export-silence-threshold", -INFINITY) // dB
diff --git a/libs/ardour/ardour/record_enable_control.h b/libs/ardour/ardour/record_enable_control.h
new file mode 100644
index 0000000..c5cb65c
--- /dev/null
+++ b/libs/ardour/ardour/record_enable_control.h
@@ -0,0 +1,61 @@
+/*
+    Copyright (C) 2016 Paul Davis
+
+    This program is free software; you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by the Free
+    Software Foundation; either version 2 of the License, or (at your option)
+    any later version.
+
+    This program is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc.,
+    675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#ifndef __ardour_record_enable_control_h__
+#define __ardour_record_enable_control_h__
+
+#include <string>
+
+#include <boost/shared_ptr.hpp>
+#include <boost/dynamic_bitset.hpp>
+
+#include "ardour/slavable_automation_control.h"
+#include "ardour/recordable.h"
+
+#include "ardour/libardour_visibility.h"
+
+namespace ARDOUR {
+
+class Session;
+
+class LIBARDOUR_API RecordEnableControl : public SlavableAutomationControl
+{
+  public:
+	RecordEnableControl (Session& session, std::string const & name, Recordable& m);
+	~RecordEnableControl() {}
+
+	/* Most (Slavable)AutomationControls do not override this, but we need
+	 * to in order to prepare the Recordable for a change that will happen
+	 * subsequently, in a realtime context. So the change is divided into
+	 * two parts: the non-RT preparation, executed inside ::set_value(),
+	 * then the second RT part.
+	 */
+
+	void set_value (double, PBD::Controllable::GroupControlDisposition);
+
+  protected:
+	void actually_set_value (double val, Controllable::GroupControlDisposition gcd);
+	void do_pre_realtime_queue_stuff (double value);
+
+  private:
+	Recordable& _recordable;
+};
+
+} /* namespace */
+
+#endif /* __libardour_record_enable_control_h__ */
diff --git a/libs/ardour/ardour/record_safe_control.h b/libs/ardour/ardour/record_safe_control.h
new file mode 100644
index 0000000..ef062aa
--- /dev/null
+++ b/libs/ardour/ardour/record_safe_control.h
@@ -0,0 +1,50 @@
+/*
+    Copyright (C) 2016 Paul Davis
+
+    This program is free software; you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by the Free
+    Software Foundation; either version 2 of the License, or (at your option)
+    any later version.
+
+    This program is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc.,
+    675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#ifndef __ardour_record_safe_control_h__
+#define __ardour_record_safe_control_h__
+
+#include <string>
+
+#include <boost/shared_ptr.hpp>
+
+#include "ardour/slavable_automation_control.h"
+#include "ardour/recordable.h"
+
+#include "ardour/libardour_visibility.h"
+
+namespace ARDOUR {
+
+class Session;
+
+class LIBARDOUR_API RecordSafeControl : public SlavableAutomationControl
+{
+  public:
+	RecordSafeControl (Session& session, std::string const & name, Recordable& m);
+	~RecordSafeControl() {}
+
+  protected:
+	void actually_set_value (double val, Controllable::GroupControlDisposition gcd);
+
+  private:
+	Recordable& _recordable;
+};
+
+} /* namespace */
+
+#endif /* __libardour_record_enable_control_h__ */
diff --git a/libs/ardour/ardour/recordable.h b/libs/ardour/ardour/recordable.h
new file mode 100644
index 0000000..e8568cf
--- /dev/null
+++ b/libs/ardour/ardour/recordable.h
@@ -0,0 +1,35 @@
+/*
+    Copyright (C) 2016 Paul Davis
+
+    This program is free software; you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by the Free
+    Software Foundation; either version 2 of the License, or (at your option)
+    any later version.
+
+    This program is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc.,
+    675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#ifndef __ardour_recordable_h__
+#define __ardour_recordable_h__
+
+namespace ARDOUR {
+
+class Recordable {
+    public:
+	virtual ~Recordable() {}
+
+	virtual int prep_record_enabled (bool yn) = 0;
+	virtual bool can_be_record_enabled() = 0;
+	virtual bool can_be_record_safe() = 0;
+};
+
+} /* namespace */
+
+#endif /* __ardour_recordable_h__ */
diff --git a/libs/ardour/ardour/region.h b/libs/ardour/ardour/region.h
index a8a1475..e86db04 100644
--- a/libs/ardour/ardour/region.h
+++ b/libs/ardour/ardour/region.h
@@ -27,7 +27,6 @@
 
 #include "pbd/undo.h"
 #include "pbd/signals.h"
-
 #include "ardour/ardour.h"
 #include "ardour/data_type.h"
 #include "ardour/automatable.h"
@@ -58,6 +57,7 @@ namespace Properties {
 	LIBARDOUR_API extern PBD::PropertyDescriptor<framepos_t>        start;
 	LIBARDOUR_API extern PBD::PropertyDescriptor<framecnt_t>        length;
 	LIBARDOUR_API extern PBD::PropertyDescriptor<framepos_t>        position;
+	LIBARDOUR_API extern PBD::PropertyDescriptor<double>            beat;
 	LIBARDOUR_API extern PBD::PropertyDescriptor<framecnt_t>        sync_position;
 	LIBARDOUR_API extern PBD::PropertyDescriptor<layer_t>           layer;
 	LIBARDOUR_API extern PBD::PropertyDescriptor<framepos_t>        ancestral_start;
@@ -101,8 +101,6 @@ class LIBARDOUR_API Region
 
 	const DataType& data_type () const { return _type; }
 
-	AnalysisFeatureList transients () { return _transients; };
-
 	/** How the region parameters play together:
 	 *
 	 * POSITION: first frame of the region along the timeline
@@ -132,7 +130,6 @@ class LIBARDOUR_API Region
 
 	frameoffset_t sync_offset (int& dir) const;
 	framepos_t sync_position () const;
-	framepos_t sync_point () const;
 
 	framepos_t adjust_to_sync (framepos_t) const;
 
@@ -164,7 +161,6 @@ class LIBARDOUR_API Region
 	bool locked ()           const { return _locked; }
 	bool position_locked ()  const { return _position_locked; }
 	bool video_locked ()     const { return _video_locked; }
-	bool valid_transients () const { return _valid_transients; }
 	bool automatic ()        const { return _automatic; }
 	bool whole_file ()       const { return _whole_file; }
 	bool captured ()         const { return !(_import || _external); }
@@ -176,9 +172,11 @@ class LIBARDOUR_API Region
 	Trimmable::CanTrim can_trim () const;
 
 	PositionLockStyle position_lock_style () const { return _position_lock_style; }
-
 	void set_position_lock_style (PositionLockStyle ps);
-	void recompute_position_from_lock_style ();
+	void recompute_position_from_lock_style (const int32_t sub_num);
+
+	double beat () const { return _beat; }
+	void set_beat (double beat) { _beat = beat; }
 
 	void suspend_property_changes ();
 
@@ -202,33 +200,34 @@ class LIBARDOUR_API Region
 	bool region_list_equivalent (boost::shared_ptr<const Region>) const;
 	bool source_equivalent (boost::shared_ptr<const Region>) const;
 	bool any_source_equivalent (boost::shared_ptr<const Region>) const;
-	bool uses_source (boost::shared_ptr<const Source>) const;
+	bool uses_source (boost::shared_ptr<const Source>, bool shallow = false) const;
+	void deep_sources (std::set<boost::shared_ptr<Source> >&) const;
 
 	std::string source_string () const;
 
 
 	/* EDITING OPERATIONS */
 
-	void set_length (framecnt_t);
+	void set_length (framecnt_t, const int32_t sub_num);
 	void set_start (framepos_t);
-	void set_position (framepos_t);
+	void set_position (framepos_t, int32_t sub_num = 0);
 	void set_initial_position (framepos_t);
 	void special_set_position (framepos_t);
-	virtual void update_after_tempo_map_change ();
+	virtual void update_after_tempo_map_change (bool send_change = true);
 	void nudge_position (frameoffset_t);
 
 	bool at_natural_position () const;
 	void move_to_natural_position ();
 
-	void move_start (frameoffset_t distance);
-	void trim_front (framepos_t new_position);
-	void trim_end (framepos_t new_position);
-	void trim_to (framepos_t position, framecnt_t length);
+	void move_start (frameoffset_t distance, const int32_t sub_num = 0);
+	void trim_front (framepos_t new_position, const int32_t sub_num = 0);
+	void trim_end (framepos_t new_position, const int32_t sub_num = 0);
+	void trim_to (framepos_t position, framecnt_t length, const int32_t sub_num = 0);
 
 	virtual void fade_range (framepos_t, framepos_t) {}
 
-	void cut_front (framepos_t new_position);
-	void cut_end (framepos_t new_position);
+	void cut_front (framepos_t new_position, const int32_t sub_num = 0);
+	void cut_end (framepos_t new_position, const int32_t sub_num = 0);
 
 	void set_layer (layer_t l); /* ONLY Playlist can call this */
 	void raise ();
@@ -291,37 +290,45 @@ class LIBARDOUR_API Region
 		// no transients, but its OK
 	}
 
-	virtual int update_transient (framepos_t /* old_position */, framepos_t /* new_position */) {
+	virtual void clear_transients () {
 		// no transients, but its OK
-		return 0;
 	}
 
-	virtual void remove_transient (framepos_t /* where */) {
+	virtual void update_transient (framepos_t /* old_position */, framepos_t /* new_position */) {
 		// no transients, but its OK
 	}
 
-	virtual int set_transients (AnalysisFeatureList&) {
+	virtual void remove_transient (framepos_t /* where */) {
 		// no transients, but its OK
-		return 0;
 	}
 
-	virtual int get_transients (AnalysisFeatureList&, bool force_new = false) {
-		(void) force_new;
+	virtual void set_onsets (AnalysisFeatureList&) {
 		// no transients, but its OK
-		return 0;
 	}
 
-	virtual int adjust_transients (frameoffset_t /*delta*/) {
+	/** merges _onsets and _user_transients into given list
+	 * and removed exact duplicates.
+	 */
+	void transients (AnalysisFeatureList&);
+
+	/** merges _onsets OR _transients with _user_transients into given list
+	 * if _onsets and _transients are unset, run analysis.
+	 * list is not thinned, duplicates remain in place.
+	 *
+	 * intended for: Playlist::find_next_transient ()
+	 */
+	virtual void get_transients (AnalysisFeatureList&) {
 		// no transients, but its OK
-		return 0;
 	}
 
+	bool has_transients () const;
+
 	virtual int separate_by_channel (ARDOUR::Session&,
 			std::vector< boost::shared_ptr<Region> >&) const {
 		return 0;
 	}
 
-	void invalidate_transients ();
+	void maybe_invalidate_transients ();
 
 	void drop_sources ();
 
@@ -335,7 +342,7 @@ class LIBARDOUR_API Region
 	Region (boost::shared_ptr<const Region>);
 
 	/** Construct a region from another region, at an offset within that region */
-	Region (boost::shared_ptr<const Region>, frameoffset_t start_offset);
+	Region (boost::shared_ptr<const Region>, frameoffset_t start_offset, const int32_t sub_num);
 
 	/** Construct a region as a copy of another region, but with different sources */
 	Region (boost::shared_ptr<const Region>, const SourceList&);
@@ -352,9 +359,11 @@ class LIBARDOUR_API Region
 	void send_change (const PBD::PropertyChange&);
 	virtual int _set_state (const XMLNode&, int version, PBD::PropertyChange& what_changed, bool send_signal);
 	void post_set (const PBD::PropertyChange&);
-	virtual void set_position_internal (framepos_t pos, bool allow_bbt_recompute);
-	virtual void set_length_internal (framecnt_t);
-	virtual void set_start_internal (framecnt_t);
+	virtual void set_position_internal (framepos_t pos, bool allow_bbt_recompute, const int32_t sub_num);
+	virtual void set_length_internal (framecnt_t, const int32_t sub_num);
+	virtual void set_start_internal (framecnt_t, const int32_t sub_num = 0);
+	bool verify_start_and_length (framepos_t, framecnt_t&);
+	void first_edit ();
 
 	DataType _type;
 
@@ -365,6 +374,7 @@ class LIBARDOUR_API Region
 	PBD::Property<framepos_t>  _start;
 	PBD::Property<framecnt_t>  _length;
 	PBD::Property<framepos_t>  _position;
+	PBD::Property<double>      _beat;
 	/** Sync position relative to the start of our file */
 	PBD::Property<framepos_t>  _sync_position;
 
@@ -372,22 +382,31 @@ class LIBARDOUR_API Region
 	/** Used when timefx are applied, so we can always use the original source */
 	SourceList              _master_sources;
 
-	AnalysisFeatureList     _transients;
-
 	boost::weak_ptr<ARDOUR::Playlist> _playlist;
 
+	void merge_features (AnalysisFeatureList&, const AnalysisFeatureList&, const frameoffset_t) const;
+
+	AnalysisFeatureList     _onsets; // used by the Ferret (Aubio OnsetDetector)
+
+	// _transient_user_start is covered by  _valid_transients
+	AnalysisFeatureList     _user_transients; // user added
+	framepos_t              _transient_user_start; // region's _start relative to user_transients
+
+	// these are used by Playlist::find_next_transient() in absence of onsets
+	AnalysisFeatureList     _transients; // Source Analysis (QM Transient), user read-only
+	framepos_t              _transient_analysis_start;
+	framepos_t              _transient_analysis_end;
+
   private:
 	void mid_thaw (const PBD::PropertyChange&);
 
-	void trim_to_internal (framepos_t position, framecnt_t length);
-	void modify_front (framepos_t new_position, bool reset_fade);
-	void modify_end (framepos_t new_position, bool reset_fade);
+	virtual void trim_to_internal (framepos_t position, framecnt_t length, const int32_t sub_num);
+	void modify_front (framepos_t new_position, bool reset_fade, const int32_t sub_num);
+	void modify_end (framepos_t new_position, bool reset_fade, const int32_t sub_num);
 
 	void maybe_uncopy ();
-	void first_edit ();
 
 	bool verify_start (framepos_t);
-	bool verify_start_and_length (framepos_t, framecnt_t&);
 	bool verify_start_mutable (framepos_t&_start);
 	bool verify_length (framecnt_t&);
 
@@ -414,7 +433,6 @@ class LIBARDOUR_API Region
 	framecnt_t              _last_length;
 	framepos_t              _last_position;
 	mutable RegionEditState _first_edit;
-	Timecode::BBT_Time      _bbt_time;
 	layer_t                 _layer;
 
 	void register_properties ();
diff --git a/libs/ardour/ardour/region_factory.h b/libs/ardour/ardour/region_factory.h
index 08d9aff..6971e77 100644
--- a/libs/ardour/ardour/region_factory.h
+++ b/libs/ardour/ardour/region_factory.h
@@ -59,7 +59,7 @@ public:
 	static PBD::Signal1<void,boost::shared_ptr<Region> >  CheckNewRegion;
 
 	/** create a "pure copy" of Region @param other */
-	static boost::shared_ptr<Region> create (boost::shared_ptr<const Region> other, bool announce = false);
+	static boost::shared_ptr<Region> create (boost::shared_ptr<const Region> other, bool announce = false, const int32_t sub_num = 0);
 
 	/** create a region from a single Source */
 	static boost::shared_ptr<Region> create (boost::shared_ptr<Source>,
@@ -73,7 +73,7 @@ public:
 	                                         const PBD::PropertyList&, bool announce = true);
 	/** create a copy of @param other starting at @param offset within @param other */
 	static boost::shared_ptr<Region> create (boost::shared_ptr<Region> other, frameoffset_t offset,
-	                                         const PBD::PropertyList&, bool announce = true);
+	                                         const PBD::PropertyList&, bool announce = true, const int32_t sub_num = 0);
 	/** create a "copy" of @param other but using a different set of sources @param srcs */
 	static boost::shared_ptr<Region> create (boost::shared_ptr<Region> other, const SourceList& srcs,
 	                                         const PBD::PropertyList&, bool announce = true);
diff --git a/libs/ardour/ardour/return.h b/libs/ardour/ardour/return.h
index 1d60a43..d42a280 100644
--- a/libs/ardour/ardour/return.h
+++ b/libs/ardour/ardour/return.h
@@ -42,7 +42,7 @@ public:
 
 	uint32_t bit_slot() const { return _bitslot; }
 
-	void run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, bool);
+	void run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, double speed, pframes_t nframes, bool);
 
 	boost::shared_ptr<Amp> amp() const { return _amp; }
 	boost::shared_ptr<PeakMeter> meter() const { return _meter; }
diff --git a/libs/ardour/ardour/route.h b/libs/ardour/ardour/route.h
index 92e073e..6c57263 100644
--- a/libs/ardour/ardour/route.h
+++ b/libs/ardour/ardour/route.h
@@ -14,7 +14,6 @@
     You should have received a copy of the GNU General Public License
     along with this program; if not, write to the Free Software
     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
 */
 
 #ifndef __ardour_route_h__
@@ -29,7 +28,6 @@
 
 #include <boost/shared_ptr.hpp>
 #include <boost/weak_ptr.hpp>
-#include <boost/dynamic_bitset.hpp>
 #include <boost/enable_shared_from_this.hpp>
 
 #include <glibmm/threads.h>
@@ -44,13 +42,24 @@
 #include "ardour/gain_control.h"
 #include "ardour/instrument_info.h"
 #include "ardour/io.h"
+#include "ardour/io_vector.h"
 #include "ardour/libardour_visibility.h"
 #include "ardour/types.h"
+#include "ardour/monitorable.h"
+#include "ardour/muteable.h"
 #include "ardour/mute_master.h"
+#include "ardour/mute_control.h"
 #include "ardour/route_group_member.h"
+#include "ardour/stripable.h"
 #include "ardour/graphnode.h"
 #include "ardour/automatable.h"
 #include "ardour/unknown_processor.h"
+#include "ardour/soloable.h"
+#include "ardour/solo_control.h"
+#include "ardour/solo_safe_control.h"
+#include "ardour/slavable.h"
+
+class RoutePinWindowProxy;
 
 namespace ARDOUR {
 
@@ -62,6 +71,7 @@ class Panner;
 class PannerShell;
 class PortSet;
 class Processor;
+class PluginInsert;
 class RouteGroup;
 class Send;
 class InternalReturn;
@@ -69,26 +79,33 @@ class MonitorProcessor;
 class Pannable;
 class CapturingProcessor;
 class InternalSend;
-
-class LIBARDOUR_API Route : public SessionObject, public Automatable, public RouteGroupMember, public GraphNode, public boost::enable_shared_from_this<Route>
+class VCA;
+class SoloIsolateControl;
+class PhaseControl;
+class MonitorControl;
+
+class LIBARDOUR_API Route : public Stripable,
+                            public GraphNode,
+                            public Soloable,
+                            public Muteable,
+                            public Monitorable,
+                            public Automatable,
+                            public RouteGroupMember,
+                            public boost::enable_shared_from_this<Route>
 {
-  public:
+public:
 
 	typedef std::list<boost::shared_ptr<Processor> > ProcessorList;
 
-	enum Flag {
-		Auditioner = 0x1,
-		MasterOut = 0x2,
-		MonitorOut = 0x4
-	};
-
-	Route (Session&, std::string name, Flag flags = Flag(0), DataType default_type = DataType::AUDIO);
+	Route (Session&, std::string name, PresentationInfo::Flag flags = PresentationInfo::Flag(0), DataType default_type = DataType::AUDIO);
 	virtual ~Route();
 
 	virtual int init ();
 
 	boost::shared_ptr<IO> input() const { return _input; }
 	boost::shared_ptr<IO> output() const { return _output; }
+	IOVector all_inputs () const;
+	IOVector all_outputs () const;
 
 	ChanCount n_inputs() const { return _input->n_ports(); }
 	ChanCount n_outputs() const { return _output->n_ports(); }
@@ -104,15 +121,7 @@ class LIBARDOUR_API Route : public SessionObject, public Automatable, public Rou
 	bool set_name (const std::string& str);
 	static void set_name_in_state (XMLNode &, const std::string &, bool rename_playlist = true);
 
-        uint32_t order_key () const;
-        bool has_order_key () const;
-	void set_order_key (uint32_t);
-
-	bool is_auditioner() const { return _flags & Auditioner; }
-	bool is_master() const { return _flags & MasterOut; }
-	bool is_monitor() const { return _flags & MonitorOut; }
-
-	virtual MonitorState monitoring_state () const;
+	MonitorState monitoring_state () const;
 	virtual MeterState metering_state () const;
 
 	/* these are the core of the API of a Route. see the protected sections as well */
@@ -128,60 +137,39 @@ class LIBARDOUR_API Route : public SessionObject, public Automatable, public Rou
 
 	virtual bool can_record() { return false; }
 
-	virtual void set_record_enabled (bool /*yn*/, PBD::Controllable::GroupControlDisposition) {}
-	virtual bool record_enabled() const { return false; }
-	virtual void set_record_safe (bool /*yn*/, PBD::Controllable::GroupControlDisposition) {}
-	virtual bool record_safe () const {return false; }
 	virtual void nonrealtime_handle_transport_stopped (bool abort, bool did_locate, bool flush_processors);
 	virtual void realtime_handle_transport_stopped () {}
 	virtual void realtime_locate () {}
-        virtual void non_realtime_locate (framepos_t);
+	virtual void non_realtime_locate (framepos_t);
 	virtual void set_pending_declick (int);
 
 	/* end of vfunc-based API */
 
 	void shift (framepos_t, framecnt_t);
 
-	void set_gain (gain_t val, PBD::Controllable::GroupControlDisposition);
-	void inc_gain (gain_t delta);
-
 	void set_trim (gain_t val, PBD::Controllable::GroupControlDisposition);
 
-	void set_mute_points (MuteMaster::MutePoint);
-	MuteMaster::MutePoint mute_points () const;
-
-	bool muted () const;
-	void set_mute (bool yn, PBD::Controllable::GroupControlDisposition);
-
-	bool muted_by_others() const;
-
 	/* controls use set_solo() to modify this route's solo state
 	 */
 
-	void set_solo (bool yn, PBD::Controllable::GroupControlDisposition group_override = PBD::Controllable::UseGroup);
-	bool soloed () const { return self_soloed () || soloed_by_others (); }
 	void clear_all_solo_state ();
 
-	bool soloed_by_others () const { return _soloed_by_others_upstream||_soloed_by_others_downstream; }
-	bool soloed_by_others_upstream () const { return _soloed_by_others_upstream; }
-	bool soloed_by_others_downstream () const { return _soloed_by_others_downstream; }
-	bool self_soloed () const { return _self_solo; }
-
-	void set_solo_isolated (bool yn, PBD::Controllable::GroupControlDisposition group_override = PBD::Controllable::UseGroup);
-	bool solo_isolated() const;
-
-	void set_solo_safe (bool yn, PBD::Controllable::GroupControlDisposition group_override = PBD::Controllable::UseGroup);
-	bool solo_safe() const;
+	bool soloed_by_others () const { return _solo_control->soloed_by_others(); }
+	bool soloed_by_others_upstream () const { return _solo_control->soloed_by_others_upstream(); }
+	bool soloed_by_others_downstream () const { return _solo_control->soloed_by_others_downstream(); }
+	bool self_soloed () const { return _solo_control->self_soloed(); }
+	bool soloed () const { return self_soloed () || soloed_by_others (); }
 
-	void set_listen (bool yn, PBD::Controllable::GroupControlDisposition group_override = PBD::Controllable::UseGroup);
-	bool listening_via_monitor () const;
+	void push_solo_upstream (int32_t delta);
+	void push_solo_isolate_upstream (int32_t delta);
+	bool can_solo () const {
+		return !(is_master() || is_monitor() || is_auditioner());
+	}
+	bool is_safe () const {
+		return _solo_safe_control->get_value();
+	}
 	void enable_monitor_send ();
 
-	void set_phase_invert (uint32_t, bool yn);
-	void set_phase_invert (boost::dynamic_bitset<>);
-	bool phase_invert (uint32_t) const;
-	boost::dynamic_bitset<> phase_invert () const;
-
 	void set_denormal_protection (bool yn);
 	bool denormal_protection() const;
 
@@ -197,8 +185,8 @@ class LIBARDOUR_API Route : public SessionObject, public Automatable, public Rou
 
 	boost::shared_ptr<Amp> amp() const  { return _amp; }
 	boost::shared_ptr<Amp> trim() const { return _trim; }
-	PeakMeter&       peak_meter()       { return *_meter.get(); }
-	const PeakMeter& peak_meter() const { return *_meter.get(); }
+	boost::shared_ptr<PeakMeter>       peak_meter()       { return _meter; }
+	boost::shared_ptr<const PeakMeter> peak_meter() const { return _meter; }
 	boost::shared_ptr<PeakMeter> shared_peak_meter() const { return _meter; }
 	boost::shared_ptr<DelayLine> delay_line() const  { return _delayline; }
 
@@ -232,9 +220,13 @@ class LIBARDOUR_API Route : public SessionObject, public Automatable, public Rou
 
 	std::list<std::string> unknown_processors () const;
 
+	RoutePinWindowProxy * pinmgr_proxy () const { return _pinmgr_proxy; }
+	void set_pingmgr_proxy (RoutePinWindowProxy* wp) { _pinmgr_proxy = wp ; }
+
 	/* special processors */
 
 	boost::shared_ptr<InternalSend>     monitor_send() const { return _monitor_send; }
+	/** the signal processorat at end of the processing chain which produces output */
 	boost::shared_ptr<Delivery>         main_outs() const { return _main_outs; }
 	boost::shared_ptr<InternalReturn>   internal_return() const { return _intreturn; }
 	boost::shared_ptr<MonitorProcessor> monitor_control() const { return _monitor_control; }
@@ -262,7 +254,22 @@ class LIBARDOUR_API Route : public SessionObject, public Automatable, public Rou
 	boost::shared_ptr<Processor> before_processor_for_placement (Placement);
 	boost::shared_ptr<Processor> before_processor_for_index (int);
 	bool processors_reorder_needs_configure (const ProcessorList& new_order);
-	int remove_processor (boost::shared_ptr<Processor>, ProcessorStreams* err = 0, bool need_process_lock = true);
+	/** remove plugin/processor
+	 *
+	 * @param proc processor to remove
+	 * @param err error report (index where removal vailed, channel-count why it failed) may be nil
+	 * @param need_process_lock if locking is required (set to true, unless called from RT context with lock)
+	 * @returns 0 on success
+	 */
+	int remove_processor (boost::shared_ptr<Processor> proc, ProcessorStreams* err = 0, bool need_process_lock = true);
+	/** replace plugin/processor with another
+	 *
+	 * @param old processor to remove
+	 * @param sub processor to substitute the old one with
+	 * @param err error report (index where removal vailed, channel-count why it failed) may be nil
+	 * @returns 0 on success
+	 */
+	int replace_processor (boost::shared_ptr<Processor> old, boost::shared_ptr<Processor> sub, ProcessorStreams* err = 0);
 	int remove_processors (const ProcessorList&, ProcessorStreams* err = 0);
 	int reorder_processors (const ProcessorList& new_order, ProcessorStreams* err = 0);
 	void disable_processors (Placement);
@@ -273,6 +280,46 @@ class LIBARDOUR_API Route : public SessionObject, public Automatable, public Rou
 	void clear_processors (Placement);
 	void all_visible_processors_active (bool);
 
+	bool strict_io () const { return _strict_io; }
+	bool set_strict_io (bool);
+	/** reset plugin-insert configuration to default, disable customizations.
+	 *
+	 * This is equivalent to calling
+	 * @code
+	 * customize_plugin_insert (proc, 0, unused)
+	 * @endcode
+	 *
+	 * @param proc Processor to reset
+	 * @returns true if successful
+	 */
+	bool reset_plugin_insert (boost::shared_ptr<Processor> proc);
+	/** enable custom plugin-insert configuration
+	 * @param proc Processor to customize
+	 * @param count number of plugin instances to use (if zero, reset to default)
+	 * @param outs output port customization
+	 * @param sinks input pins for variable-I/O plugins
+	 * @returns true if successful
+	 */
+	bool customize_plugin_insert (boost::shared_ptr<Processor> proc, uint32_t count, ChanCount outs, ChanCount sinks);
+	bool add_remove_sidechain (boost::shared_ptr<Processor> proc, bool);
+	bool plugin_preset_output (boost::shared_ptr<Processor> proc, ChanCount outs);
+
+	/* enable sidechain input for a given processor
+	 *
+	 * The sidechain itself is an IO port object with variable number of channels and configured independently.
+	 * Adding/removing the port itself however requires reconfiguring the route and is hence
+	 * not a plugin operation itself.
+	 *
+	 * @param proc the processor to add sidechain inputs to
+	 * @returns true on success
+	 */
+	bool add_sidechain (boost::shared_ptr<Processor> proc) { return add_remove_sidechain (proc, true); }
+	/* remove sidechain input from given processor
+	 * @param proc the processor to remove the sidechain input from
+	 * @returns true on success
+	 */
+	bool remove_sidechain (boost::shared_ptr<Processor> proc) { return add_remove_sidechain (proc, false); }
+
 	framecnt_t set_private_port_latencies (bool playback) const;
 	void       set_public_port_latencies (framecnt_t, bool playback) const;
 
@@ -284,15 +331,8 @@ class LIBARDOUR_API Route : public SessionObject, public Automatable, public Rou
 	framecnt_t signal_latency() const { return _signal_latency; }
 
 	PBD::Signal0<void>       active_changed;
-	PBD::Signal0<void>       phase_invert_changed;
 	PBD::Signal0<void>       denormal_protection_changed;
-	PBD::Signal1<void,PBD::Controllable::GroupControlDisposition>  listen_changed;
-	PBD::Signal2<void,bool,PBD::Controllable::GroupControlDisposition>  solo_changed;
-	PBD::Signal0<void>       solo_safe_changed;
-	PBD::Signal0<void>       solo_isolated_changed;
 	PBD::Signal0<void>       comment_changed;
-	PBD::Signal0<void>       mute_changed;
-	PBD::Signal0<void>       mute_points_changed;
 
 	/** track numbers - assigned by session
 	 * nubers > 0 indicate tracks (audio+midi)
@@ -309,9 +349,18 @@ class LIBARDOUR_API Route : public SessionObject, public Automatable, public Rou
 		PropertyChanged (ARDOUR::Properties::name);
 	}
 
+	enum PluginSetupOptions {
+		None = 0x0,
+		CanReplace = 0x1,
+		MultiOut = 0x2,
+	};
+
+	static PBD::Signal3<int,boost::shared_ptr<Route>, boost::shared_ptr<PluginInsert>, PluginSetupOptions > PluginSetup;
+
 	/** the processors have changed; the parameter indicates what changed */
 	PBD::Signal1<void,RouteProcessorChange> processors_changed;
 	PBD::Signal1<void,void*> record_enable_changed;
+	PBD::Signal0<void> processor_latency_changed;
 	/** the metering point has changed */
 	PBD::Signal0<void>       meter_change;
 	PBD::Signal0<void>       signal_latency_changed;
@@ -320,10 +369,6 @@ class LIBARDOUR_API Route : public SessionObject, public Automatable, public Rou
 	/** Emitted with the process lock held */
 	PBD::Signal0<void>       io_changed;
 
-	/* gui's call this for their own purposes. */
-
-	PBD::Signal2<void,std::string,void*> gui_changed;
-
 	/* stateful */
 
 	XMLNode& get_state();
@@ -360,6 +405,8 @@ class LIBARDOUR_API Route : public SessionObject, public Automatable, public Rou
 	 */
 	bool direct_feeds_according_to_graph (boost::shared_ptr<Route>, bool* via_send_only = 0);
 
+	bool feeds_according_to_graph (boost::shared_ptr<Route>);
+
 	struct FeedRecord {
 		boost::weak_ptr<Route> r;
 		bool sends_only;
@@ -385,131 +432,33 @@ class LIBARDOUR_API Route : public SessionObject, public Automatable, public Rou
 
 	boost::shared_ptr<AutomationControl> get_control (const Evoral::Parameter& param);
 
-	class RouteAutomationControl : public AutomationControl {
-	public:
-		RouteAutomationControl (const std::string& name,
-		                        AutomationType atype,
-		                        boost::shared_ptr<AutomationList> alist,
-		                        boost::shared_ptr<Route> route);
-	protected:
-		friend class Route;
-
-		void route_set_value (double val) {
-			AutomationControl::set_value (val, Controllable::NoGroup);
-		}
-
-		boost::weak_ptr<Route> _route;
-	};
-
-	class GainControllable : public GainControl  {
-	public:
-		GainControllable (Session& session,
-		                  AutomationType type,
-		                  boost::shared_ptr<Route> route);
-
-		void set_value (double val, PBD::Controllable::GroupControlDisposition group_override) {
-			boost::shared_ptr<Route> r = _route.lock();
-			if (r) {
-				/* Route must mediate group control */
-				r->set_control ((AutomationType) parameter().type(), val, group_override);
-			}
-		}
-
-	protected:
-		friend class Route;
-
-		void route_set_value (double val) {
-			GainControl::set_value (val, Controllable::NoGroup);
-		}
-
-		boost::weak_ptr<Route> _route;
-	};
-
-	class SoloControllable : public RouteAutomationControl {
-	public:
-		SoloControllable (std::string name, boost::shared_ptr<Route>);
-		void set_value (double, PBD::Controllable::GroupControlDisposition group_override);
-		void set_value_unchecked (double);
-		double get_value () const;
-	private:
-		void _set_value (double, PBD::Controllable::GroupControlDisposition group_override);
-	};
-
-	struct MuteControllable : public RouteAutomationControl {
-	public:
-		MuteControllable (std::string name, boost::shared_ptr<Route>);
-		void set_value (double, PBD::Controllable::GroupControlDisposition group_override);
-		void set_value_unchecked (double);
-		double get_value () const;
-
-		/* Pretend to change value, but do not affect actual route mute. */
-		void set_superficial_value(bool muted);
-
-	private:
-		boost::weak_ptr<Route> _route;
-		void _set_value (double, PBD::Controllable::GroupControlDisposition group_override);
-	};
-
-	class LIBARDOUR_API PhaseControllable : public RouteAutomationControl {
-	public:
-		PhaseControllable (std::string name, boost::shared_ptr<Route>);
-		void set_value (double, PBD::Controllable::GroupControlDisposition group_override);
-		/* currently no automation, so no need for set_value_unchecked() */
-		void set_channel (uint32_t);
-		double get_value () const;
-		uint32_t channel() const;
-	private:
-		uint32_t _current_phase;
-		void _set_value (double, PBD::Controllable::GroupControlDisposition group_override);
-	};
-
-	class LIBARDOUR_API SoloIsolateControllable : public RouteAutomationControl {
-	public:
-		SoloIsolateControllable (std::string name, boost::shared_ptr<Route>);
-		void set_value (double, PBD::Controllable::GroupControlDisposition group_override);
-		/* currently no automation, so no need for set_value_unchecked() */
-		double get_value () const;
-	private:
-		void _set_value (double, PBD::Controllable::GroupControlDisposition group_override);
-	};
-
-	class LIBARDOUR_API SoloSafeControllable : public RouteAutomationControl {
-	public:
-		SoloSafeControllable (std::string name, boost::shared_ptr<Route>);
-		void set_value (double, PBD::Controllable::GroupControlDisposition group_override);
-		/* currently no automation, so no need for set_value_unchecked() */
-		double get_value () const;
-	private:
-		void _set_value (double, PBD::Controllable::GroupControlDisposition group_override);
-	};
-
-	void set_control (AutomationType, double val, PBD::Controllable::GroupControlDisposition group_override);
-
-	boost::shared_ptr<SoloControllable> solo_control() const {
+	boost::shared_ptr<SoloControl> solo_control() const {
 		return _solo_control;
 	}
 
-	boost::shared_ptr<MuteControllable> mute_control() const {
+	boost::shared_ptr<MuteControl> mute_control() const {
 		return _mute_control;
 	}
 
-	boost::shared_ptr<MuteMaster> mute_master() const {
-		return _mute_master;
-	}
+	bool can_be_muted_by_others () const { return can_solo(); }
+	bool muted () const { return _mute_control->muted(); }
+	bool muted_by_masters () const { return _mute_control->muted_by_masters(); }
+	bool muted_by_self () const { return _mute_control->muted_by_self(); }
+	bool muted_by_others_soloing () const;
 
-	boost::shared_ptr<SoloIsolateControllable> solo_isolate_control() const {
+	boost::shared_ptr<SoloIsolateControl> solo_isolate_control() const {
 		return _solo_isolate_control;
 	}
 
-	boost::shared_ptr<SoloSafeControllable> solo_safe_control() const {
+	boost::shared_ptr<SoloSafeControl> solo_safe_control() const {
 		return _solo_safe_control;
 	}
 
-	boost::shared_ptr<AutomationControl> monitoring_control() const {
+	boost::shared_ptr<MonitorControl> monitoring_control() const {
 		/* tracks override this to provide actual monitoring control;
 		   busses have no possible choices except input monitoring.
 		*/
-		return boost::shared_ptr<AutomationControl> ();
+		return boost::shared_ptr<MonitorControl> ();
 	}
 
 	/* Route doesn't own these items, but sub-objects that it does own have them
@@ -519,11 +468,11 @@ class LIBARDOUR_API Route : public SessionObject, public Automatable, public Rou
 
 	boost::shared_ptr<Panner> panner() const;  /* may return null */
 	boost::shared_ptr<PannerShell> panner_shell() const;
-	boost::shared_ptr<GainControl> gain_control() const;
 	boost::shared_ptr<Pannable> pannable() const;
-	boost::shared_ptr<GainControl> trim_control() const;
 
-	boost::shared_ptr<PhaseControllable> phase_control() const;
+	boost::shared_ptr<GainControl> gain_control() const;
+	boost::shared_ptr<GainControl> trim_control() const;
+	boost::shared_ptr<PhaseControl> phase_control() const;
 
 	/**
 	   Return the first processor that accepts has at least one MIDI input
@@ -533,121 +482,102 @@ class LIBARDOUR_API Route : public SessionObject, public Automatable, public Rou
 	   special case not covered by this utility function.
 	*/
 	boost::shared_ptr<Processor> the_instrument() const;
-        InstrumentInfo& instrument_info() { return _instrument_info; }
-
-        /* "well-known" controls for panning. Any or all of these may return
-         * null.
-         */
-
-        boost::shared_ptr<AutomationControl> pan_azimuth_control() const;
-        boost::shared_ptr<AutomationControl> pan_elevation_control() const;
-        boost::shared_ptr<AutomationControl> pan_width_control() const;
-        boost::shared_ptr<AutomationControl> pan_frontback_control() const;
-        boost::shared_ptr<AutomationControl> pan_lfe_control() const;
-
-        /* "well-known" controls for an EQ in this route. Any or all may
-         * be null. eq_band_cnt() must return 0 if there is no EQ present.
-         * Passing an @param band value >= eq_band_cnt() will guarantee the
-         * return of a null ptr (or an empty string for eq_band_name()).
-         */
-        uint32_t eq_band_cnt () const;
-        std::string eq_band_name (uint32_t) const;
-        boost::shared_ptr<AutomationControl> eq_gain_controllable (uint32_t band) const;
-        boost::shared_ptr<AutomationControl> eq_freq_controllable (uint32_t band) const;
-        boost::shared_ptr<AutomationControl> eq_q_controllable (uint32_t band) const;
-        boost::shared_ptr<AutomationControl> eq_shape_controllable (uint32_t band) const;
-        boost::shared_ptr<AutomationControl> eq_enable_controllable () const;
-        boost::shared_ptr<AutomationControl> eq_hpf_controllable () const;
-
-        /* "well-known" controls for a compressor in this route. Any or all may
-         * be null.
-         */
-        boost::shared_ptr<AutomationControl> comp_enable_controllable () const;
-        boost::shared_ptr<AutomationControl> comp_threshold_controllable () const;
-        boost::shared_ptr<AutomationControl> comp_speed_controllable () const;
-        boost::shared_ptr<AutomationControl> comp_mode_controllable () const;
-        boost::shared_ptr<AutomationControl> comp_makeup_controllable () const;
-        boost::shared_ptr<AutomationControl> comp_redux_controllable () const;
-
-        /* @param mode must be supplied by the comp_mode_controllable(). All other values
-         * result in undefined behaviour
-         */
-        std::string comp_mode_name (uint32_t mode) const;
-        /* @param mode - as for comp mode name. This returns the name for the
-         * parameter/control accessed via comp_speed_controllable(), which can
-         * be mode dependent.
-         */
-        std::string comp_speed_name (uint32_t mode) const;
-
-        /* "well-known" controls for sends to well-known busses in this route. Any or all may
-         * be null.
-         *
-         * In Mixbus, these are the sends that connect to the mixbusses.
-         * In Ardour, these are user-created sends that connect to user-created
-         * Aux busses.
-         */
-        boost::shared_ptr<AutomationControl> send_level_controllable (uint32_t n) const;
-        boost::shared_ptr<AutomationControl> send_enable_controllable (uint32_t n) const;
-        /* for the same value of @param n, this returns the name of the send
-         * associated with the pair of controllables returned by the above two methods.
-         */
-        std::string send_name (uint32_t n) const;
-
-        /* well known control that enables/disables sending to the master bus.
-         *
-         * In Ardour, this returns null.
-         * In Mixbus, it will return a suitable control, or null depending on
-         * the route.
-         */
-        boost::shared_ptr<AutomationControl> master_send_enable_controllable () const;
-
-        void protect_automation ();
-
-	enum {
-		/* These numbers are taken from MIDI Machine Control,
-		   which can only control up to 317 tracks without
-		   doing sysex segmentation.
-		*/
-		MasterBusRemoteControlID = 318,
-		MonitorBusRemoteControlID = 319,
-	};
+	InstrumentInfo& instrument_info() { return _instrument_info; }
 
-	void     set_remote_control_id (uint32_t id, bool notify_class_listeners = true);
-	uint32_t remote_control_id () const;
-        void     set_remote_control_id_explicit (uint32_t order_key);
+	/* "well-known" controls for panning. Any or all of these may return
+	 * null.
+	 */
 
-	/* for things concerned about *this* route's RID */
+	boost::shared_ptr<AutomationControl> pan_azimuth_control() const;
+	boost::shared_ptr<AutomationControl> pan_elevation_control() const;
+	boost::shared_ptr<AutomationControl> pan_width_control() const;
+	boost::shared_ptr<AutomationControl> pan_frontback_control() const;
+	boost::shared_ptr<AutomationControl> pan_lfe_control() const;
 
-	PBD::Signal0<void> RemoteControlIDChanged;
+	/* "well-known" controls for an EQ in this route. Any or all may
+	 * be null. eq_band_cnt() must return 0 if there is no EQ present.
+	 * Passing an @param band value >= eq_band_cnt() will guarantee the
+	 * return of a null ptr (or an empty string for eq_band_name()).
+	 */
+	uint32_t eq_band_cnt () const;
+	std::string eq_band_name (uint32_t) const;
+	boost::shared_ptr<AutomationControl> eq_gain_controllable (uint32_t band) const;
+	boost::shared_ptr<AutomationControl> eq_freq_controllable (uint32_t band) const;
+	boost::shared_ptr<AutomationControl> eq_q_controllable (uint32_t band) const;
+	boost::shared_ptr<AutomationControl> eq_shape_controllable (uint32_t band) const;
+	boost::shared_ptr<AutomationControl> eq_enable_controllable () const;
+	boost::shared_ptr<AutomationControl> eq_hpf_controllable () const;
+
+	/* "well-known" controls for a compressor in this route. Any or all may
+	 * be null.
+	 */
+	boost::shared_ptr<AutomationControl> comp_enable_controllable () const;
+	boost::shared_ptr<AutomationControl> comp_threshold_controllable () const;
+	boost::shared_ptr<AutomationControl> comp_speed_controllable () const;
+	boost::shared_ptr<AutomationControl> comp_mode_controllable () const;
+	boost::shared_ptr<AutomationControl> comp_makeup_controllable () const;
+	boost::shared_ptr<AutomationControl> comp_redux_controllable () const;
+
+	/* @param mode must be supplied by the comp_mode_controllable(). All other values
+	 * result in undefined behaviour
+	 */
+	std::string comp_mode_name (uint32_t mode) const;
+	/* @param mode - as for comp mode name. This returns the name for the
+	 * parameter/control accessed via comp_speed_controllable(), which can
+	 * be mode dependent.
+	 */
+	std::string comp_speed_name (uint32_t mode) const;
+
+	/* "well-known" controls for sends to well-known busses in this route. Any or all may
+	 * be null.
+	 *
+	 * In Mixbus, these are the sends that connect to the mixbusses.
+	 * In Ardour, these are user-created sends that connect to user-created
+	 * Aux busses.
+	 */
+	boost::shared_ptr<AutomationControl> send_level_controllable (uint32_t n) const;
+	boost::shared_ptr<AutomationControl> send_enable_controllable (uint32_t n) const;
+	/* for the same value of @param n, this returns the name of the send
+	 * associated with the pair of controllables returned by the above two methods.
+	 */
+	std::string send_name (uint32_t n) const;
 
-	/* for things concerned about *any* route's RID changes */
+	/* well known control that enables/disables sending to the master bus.
+	 *
+	 * In Ardour, this returns null.
+	 * In Mixbus, it will return a suitable control, or null depending on
+	 * the route.
+	 */
+	boost::shared_ptr<AutomationControl> master_send_enable_controllable () const;
 
-	static PBD::Signal0<void> RemoteControlIDChange;
-	static PBD::Signal0<void> SyncOrderKeys;
+	void protect_automation ();
 
 	bool has_external_redirects() const;
 
-        /* can only be executed by a route for which is_monitor() is true
-	   (i.e. the monitor out)
-        */
-        void monitor_run (framepos_t start_frame, framepos_t end_frame,
-			  pframes_t nframes, int declick);
+	/* can only be executed by a route for which is_monitor() is true
+	 *	 (i.e. the monitor out)
+	 */
+	void monitor_run (framepos_t start_frame, framepos_t end_frame,
+			pframes_t nframes, int declick);
+
+        bool slaved_to (boost::shared_ptr<VCA>) const;
+        bool slaved () const;
 
   protected:
-	friend class Session;
+        friend class Session;
 
 	void catch_up_on_solo_mute_override ();
-	void mod_solo_by_others_upstream (int32_t);
-	void mod_solo_by_others_downstream (int32_t);
+	void set_listen (bool);
+
 	void curve_reallocate ();
 	virtual void set_block_size (pframes_t nframes);
 
   protected:
-	virtual framecnt_t check_initial_delay (framecnt_t nframes, framepos_t&) { return nframes; }
+        virtual framecnt_t check_initial_delay (framecnt_t nframes, framepos_t&) { return nframes; }
 
-        void fill_buffers_with_input (BufferSet& bufs, boost::shared_ptr<IO> io, pframes_t nframes);
+	void fill_buffers_with_input (BufferSet& bufs, boost::shared_ptr<IO> io, pframes_t nframes);
 
-        void passthru (BufferSet&, framepos_t start_frame, framepos_t end_frame,
+	void passthru (BufferSet&, framepos_t start_frame, framepos_t end_frame,
 			pframes_t nframes, int declick);
 
 	virtual void write_out_of_band_data (BufferSet& /* bufs */, framepos_t /* start_frame */, framepos_t /* end_frame */,
@@ -658,6 +588,8 @@ class LIBARDOUR_API Route : public SessionObject, public Automatable, public Rou
 	                                     pframes_t nframes, int declick,
 	                                     bool gain_automation_ok);
 
+	void flush_processor_buffers_locked (framecnt_t nframes);
+
 	virtual void bounce_process (BufferSet& bufs,
 	                             framepos_t start_frame, framecnt_t nframes,
 															 boost::shared_ptr<Processor> endpoint, bool include_endpoint,
@@ -695,19 +627,10 @@ class LIBARDOUR_API Route : public SessionObject, public Automatable, public Rou
 	gint           _pending_process_reorder; // atomic
 	gint           _pending_signals; // atomic
 
-	Flag           _flags;
 	int            _pending_declick;
 	MeterPoint     _meter_point;
 	MeterPoint     _pending_meter_point;
 	MeterType      _meter_type;
-	boost::dynamic_bitset<> _phase_invert;
-	bool           _self_solo;
-	uint32_t       _soloed_by_others_upstream;
-	uint32_t       _soloed_by_others_downstream;
-	bool           _solo_isolated;
-	uint32_t       _solo_isolated_by_upstream;
-
-	void mod_solo_isolated_by_upstream (bool);
 
 	bool           _denormal_protection;
 
@@ -715,26 +638,22 @@ class LIBARDOUR_API Route : public SessionObject, public Automatable, public Rou
 	bool _silent : 1;
 	bool _declickable : 1;
 
-	boost::shared_ptr<SoloControllable> _solo_control;
-	boost::shared_ptr<MuteControllable> _mute_control;
-	boost::shared_ptr<MuteMaster> _mute_master;
-	boost::shared_ptr<PhaseControllable> _phase_control;
-	boost::shared_ptr<SoloIsolateControllable> _solo_isolate_control;
-	boost::shared_ptr<SoloSafeControllable> _solo_safe_control;
-
-	virtual void act_on_mute () {}
+	boost::shared_ptr<SoloControl> _solo_control;
+	boost::shared_ptr<MuteControl> _mute_control;
+	boost::shared_ptr<PhaseControl> _phase_control;
+	boost::shared_ptr<SoloIsolateControl> _solo_isolate_control;
+	boost::shared_ptr<SoloSafeControl> _solo_safe_control;
 
 	std::string    _comment;
 	bool           _have_internal_generator;
-	bool           _solo_safe;
 	DataType       _default_type;
 	FedBy          _fed_by;
 
-        InstrumentInfo _instrument_info;
+	InstrumentInfo _instrument_info;
 
 	virtual ChanCount input_streams () const;
 
-  protected:
+protected:
 	virtual XMLNode& state(bool);
 
 	int configure_processors (ProcessorStreams*);
@@ -753,9 +672,9 @@ class LIBARDOUR_API Route : public SessionObject, public Automatable, public Rou
 
 	virtual void maybe_declick (BufferSet&, framecnt_t, int);
 
-	boost::shared_ptr<GainControllable> _gain_control;
+	boost::shared_ptr<GainControl> _gain_control;
 	boost::shared_ptr<Amp>       _amp;
-	boost::shared_ptr<GainControllable> _trim_control;
+	boost::shared_ptr<GainControl> _trim_control;
 	boost::shared_ptr<Amp>       _trim;
 	boost::shared_ptr<PeakMeter> _meter;
 	boost::shared_ptr<DelayLine> _delayline;
@@ -763,25 +682,27 @@ class LIBARDOUR_API Route : public SessionObject, public Automatable, public Rou
 	boost::shared_ptr<Processor> the_instrument_unlocked() const;
 
   private:
+	int64_t _track_number;
+
 	int set_state_2X (const XMLNode&, int);
 	void set_processor_state_2X (XMLNodeList const &, int);
 
-	uint32_t _order_key;
-	bool _has_order_key;
-        uint32_t _remote_control_id;
-
-	int64_t _track_number;
-
 	void input_change_handler (IOChange, void *src);
 	void output_change_handler (IOChange, void *src);
+	void sidechain_change_handler (IOChange, void *src);
+
+	void processor_selfdestruct (boost::weak_ptr<Processor>);
+	std::vector<boost::weak_ptr<Processor> > selfdestruct_sequence;
+	Glib::Threads::Mutex  selfdestruct_lock;
 
 	bool input_port_count_changing (ChanCount);
 	bool output_port_count_changing (ChanCount);
 
 	bool _in_configure_processors;
 	bool _initial_io_setup;
+	bool _in_sidechain_setup;
 
-	int configure_processors_unlocked (ProcessorStreams*);
+	int configure_processors_unlocked (ProcessorStreams*, Glib::Threads::RWLock::WriterLock*);
 	bool set_meter_point_unlocked ();
 	void apply_processor_order (const ProcessorList& new_order);
 
@@ -793,7 +714,6 @@ class LIBARDOUR_API Route : public SessionObject, public Automatable, public Rou
 	void placement_range (Placement p, ProcessorList::iterator& start, ProcessorList::iterator& end);
 
 	void set_self_solo (bool yn);
-	void set_mute_master_solo ();
 
 	void set_processor_positions ();
 	framecnt_t update_port_latencies (PortSet& ports, PortSet& feeders, bool playback, framecnt_t) const;
@@ -832,6 +752,8 @@ class LIBARDOUR_API Route : public SessionObject, public Automatable, public Rou
 
 	friend class ProcessorState;
 
+	bool _strict_io;
+
 	/* no copy construction */
 	Route (Route const &);
 
@@ -843,10 +765,11 @@ class LIBARDOUR_API Route : public SessionObject, public Automatable, public Rou
 	    or 0.
 	*/
 	boost::weak_ptr<Processor> _processor_after_last_custom_meter;
+	RoutePinWindowProxy *_pinmgr_proxy;
 
-        void reset_instrument_info ();
+	void reset_instrument_info ();
 
-        void set_remote_control_id_internal (uint32_t id, bool notify_class_listeners = true);
+        void solo_control_changed (bool self, PBD::Controllable::GroupControlDisposition);
 };
 
 } // namespace ARDOUR
diff --git a/libs/ardour/ardour/route_graph.h b/libs/ardour/ardour/route_graph.h
index e1e1049..aae2ba0 100644
--- a/libs/ardour/ardour/route_graph.h
+++ b/libs/ardour/ardour/route_graph.h
@@ -44,6 +44,7 @@ public:
 
 	void add (GraphVertex from, GraphVertex to, bool via_sends_only);
 	bool has (GraphVertex from, GraphVertex to, bool* via_sends_only);
+	bool feeds (GraphVertex from, GraphVertex to);
 	std::set<GraphVertex> from (GraphVertex r) const;
 	void remove (GraphVertex from, GraphVertex to);
 	bool has_none_to (GraphVertex to) const;
@@ -56,6 +57,7 @@ private:
 	typedef std::multimap<GraphVertex, std::pair<GraphVertex, bool> > EdgeMapWithSends;
 
 	EdgeMapWithSends::iterator find_in_from_to_with_sends (GraphVertex, GraphVertex);
+	EdgeMapWithSends::iterator find_recursively_in_from_to_with_sends (GraphVertex, GraphVertex);
 
 	/** map of edges with from as `first' and to as `second' */
 	EdgeMap _from_to;
diff --git a/libs/ardour/ardour/route_group.h b/libs/ardour/ardour/route_group.h
index fc295a6..1285d3b 100644
--- a/libs/ardour/ardour/route_group.h
+++ b/libs/ardour/ardour/route_group.h
@@ -29,24 +29,27 @@
 #include "pbd/signals.h"
 #include "pbd/stateful.h"
 
-#include "ardour/libardour_visibility.h"
+#include "ardour/control_group.h"
 #include "ardour/types.h"
 #include "ardour/session_object.h"
 
+#include "ardour/libardour_visibility.h"
+
 namespace ARDOUR {
 
 namespace Properties {
-	LIBARDOUR_API extern PBD::PropertyDescriptor<bool> relative;
+	LIBARDOUR_API extern PBD::PropertyDescriptor<bool> group_relative;
+	LIBARDOUR_API extern PBD::PropertyDescriptor<bool> group_gain;
+	LIBARDOUR_API extern PBD::PropertyDescriptor<bool> group_mute;
+	LIBARDOUR_API extern PBD::PropertyDescriptor<bool> group_solo;
+	LIBARDOUR_API extern PBD::PropertyDescriptor<bool> group_recenable;
+	LIBARDOUR_API extern PBD::PropertyDescriptor<bool> group_select;
+	LIBARDOUR_API extern PBD::PropertyDescriptor<bool> group_route_active;
+	LIBARDOUR_API extern PBD::PropertyDescriptor<bool> group_color;
+	LIBARDOUR_API extern PBD::PropertyDescriptor<bool> group_monitoring;
 	LIBARDOUR_API extern PBD::PropertyDescriptor<bool> active;
-	LIBARDOUR_API extern PBD::PropertyDescriptor<bool> gain;
-	LIBARDOUR_API extern PBD::PropertyDescriptor<bool> mute;
-	LIBARDOUR_API extern PBD::PropertyDescriptor<bool> solo;
-	LIBARDOUR_API extern PBD::PropertyDescriptor<bool> recenable;
-	LIBARDOUR_API extern PBD::PropertyDescriptor<bool> select;
-	LIBARDOUR_API extern PBD::PropertyDescriptor<bool> route_active;
-	LIBARDOUR_API extern PBD::PropertyDescriptor<bool> color;
-	LIBARDOUR_API extern PBD::PropertyDescriptor<bool> monitoring;
-	/* we use this, but its declared in region.cc */
+	LIBARDOUR_API extern PBD::PropertyDescriptor<int32_t> group_master_number;
+	/* we use these declared in region.cc */
 	LIBARDOUR_API extern PBD::PropertyDescriptor<bool> hidden;
 };
 
@@ -55,6 +58,13 @@ class Track;
 class AudioTrack;
 class Session;
 
+/** A group identifier for routes.
+ *
+ * RouteGroups permit to define properties which are shared
+ * among all Routes that use the given identifier.
+ *
+ * A route can at most be in one group.
+ */
 class LIBARDOUR_API RouteGroup : public SessionObject
 {
   public:
@@ -66,7 +76,7 @@ class LIBARDOUR_API RouteGroup : public SessionObject
 	bool is_active () const { return _active.val(); }
 	bool is_relative () const { return _relative.val(); }
 	bool is_hidden () const { return _hidden.val(); }
-	bool is_gain () const { return _gain.val(); }
+	bool is_gain () const { return _gain.val() && _group_master_number.val() <= 0; }
 	bool is_mute () const { return _mute.val(); }
 	bool is_solo () const { return _solo.val(); }
 	bool is_recenable () const { return _recenable.val(); }
@@ -74,6 +84,7 @@ class LIBARDOUR_API RouteGroup : public SessionObject
 	bool is_route_active () const { return _route_active.val(); }
 	bool is_color () const { return _color.val(); }
 	bool is_monitoring() const { return _monitoring.val(); }
+	int32_t group_master_number() const { return _group_master_number.val(); }
 
 	bool empty() const {return routes->empty();}
 	size_t size() const { return routes->size();}
@@ -134,9 +145,15 @@ class LIBARDOUR_API RouteGroup : public SessionObject
 
 	int set_state (const XMLNode&, int version);
 
+	void assign_master (boost::shared_ptr<VCA>);
+	void unassign_master (boost::shared_ptr<VCA>);
+	bool has_control_master() const;
+	bool slaved () const;
+
   private:
 	boost::shared_ptr<RouteList> routes;
 	boost::shared_ptr<Route> subgroup_bus;
+	boost::weak_ptr<VCA> group_master;
 
 	PBD::Property<bool> _relative;
 	PBD::Property<bool> _active;
@@ -149,9 +166,19 @@ class LIBARDOUR_API RouteGroup : public SessionObject
 	PBD::Property<bool> _route_active;
 	PBD::Property<bool> _color;
 	PBD::Property<bool> _monitoring;
+	PBD::Property<int32_t> _group_master_number;
+
+	boost::shared_ptr<ControlGroup> _solo_group;
+	boost::shared_ptr<ControlGroup> _mute_group;
+	boost::shared_ptr<ControlGroup> _rec_enable_group;
+	boost::shared_ptr<ControlGroup> _gain_group;
+	boost::shared_ptr<ControlGroup> _monitoring_group;
 
 	void remove_when_going_away (boost::weak_ptr<Route>);
 	int set_state_2X (const XMLNode&, int);
+
+	void post_set (PBD::PropertyChange const &);
+	void push_to_groups ();
 };
 
 } /* namespace */
diff --git a/libs/ardour/ardour/route_sorters.h b/libs/ardour/ardour/route_sorters.h
deleted file mode 100644
index 022d5a2..0000000
--- a/libs/ardour/ardour/route_sorters.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
-    Copyright (C) 2000-2014 Paul Davis
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-*/
-
-#ifndef __libardour_route_sorters_h__
-#define __libardour_route_sorters_h__
-
-#include "ardour/route.h"
-
-namespace ARDOUR {
-
-struct SignalOrderRouteSorter {
-	bool operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b) {
-		if (a->is_master() || a->is_monitor()) {
-			/* "a" is a special route (master, monitor, etc), and comes
-			 * last in the mixer ordering
-			 */
-			return false;
-		} else if (b->is_master() || b->is_monitor()) {
-			/* everything comes before b */
-			return true;
-		}
-		return a->order_key () < b->order_key ();
-	}
-};
-
-} // namespace
-
-#endif /* __libardour_route_sorters_h__ */
diff --git a/libs/ardour/ardour/search_paths.h b/libs/ardour/ardour/search_paths.h
index 3eea491..f280e5d 100644
--- a/libs/ardour/ardour/search_paths.h
+++ b/libs/ardour/ardour/search_paths.h
@@ -79,19 +79,29 @@ namespace ARDOUR {
 	 *
 	 * If ARDOUR_MIDI_PATCH_PATH is defined then the Searchpath returned
 	 * will contain only those directories specified in it, otherwise it will
-	 * contain the user and system directories which may contain control
-	 * surface plugins.
+	 * contain the user and system directories.
 	 */
 	LIBARDOUR_API PBD::Searchpath midi_patch_search_path ();
 
 	/**
 	 * return a Searchpath containing directories in which to look for
+	 * theme files.
+	 *
+	 * If ARDOUR_THEMES_PATH is defined then the Searchpath returned
+	 * will contain only those directories specified in it, otherwise it will
+	 * contain the user and system directories
+	 */
+	LIBARDOUR_API PBD::Searchpath theme_search_path ();
+
+
+	/**
+	 * return a Searchpath containing directories in which to look for
 	 * panner plugins.
 	 *
 	 * If ARDOUR_PANNER_PATH is defined then the Searchpath returned
 	 * will contain only those directories specified in it, otherwise it will
-	 * contain the user and system directories which may contain control
-	 * surface plugins.
+	 * contain the user and system directories which may contain panner
+	 * plugins.
 	 */
 	LIBARDOUR_API PBD::Searchpath panner_search_path ();
 
@@ -107,6 +117,14 @@ namespace ARDOUR {
 	 */
 	LIBARDOUR_API PBD::Searchpath template_search_path ();
 
+
+	/**
+	 * return a Searchpath containing directories in which to look for
+	 * lua scripts
+	 */
+	LIBARDOUR_API PBD::Searchpath lua_search_path ();
+
+
 } // namespace ARDOUR
 
 #endif /* __libardour_search_paths_h__ */
diff --git a/libs/ardour/ardour/send.h b/libs/ardour/ardour/send.h
index 3b0e8a4..f70f09b 100644
--- a/libs/ardour/ardour/send.h
+++ b/libs/ardour/ardour/send.h
@@ -55,9 +55,13 @@ class LIBARDOUR_API Send : public Delivery
 	XMLNode& get_state ();
 	int set_state(const XMLNode&, int version);
 
+	PBD::Signal0<void> SelfDestruct;
+	void set_remove_on_disconnect (bool b) { _remove_on_disconnect = b; }
+	bool remove_on_disconnect () const { return _remove_on_disconnect; }
+
 	uint32_t pans_required() const { return _configured_input.n_audio(); }
 
-	void run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, bool);
+	void run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, double speed, pframes_t nframes, bool);
 
 	bool can_support_io_configuration (const ChanCount& in, ChanCount& out);
 	bool configure_io (ChanCount in, ChanCount out);
@@ -73,7 +77,7 @@ class LIBARDOUR_API Send : public Delivery
 
 	bool set_name (const std::string& str);
 
-	std::string value_as_string (boost::shared_ptr<AutomationControl>) const;
+	std::string value_as_string (boost::shared_ptr<const AutomationControl>) const;
 
 	static uint32_t how_many_sends();
 	static std::string name_and_id_new_send (Session&, Delivery::Role r, uint32_t&, bool);
@@ -89,6 +93,7 @@ class LIBARDOUR_API Send : public Delivery
 	/* disallow copy construction */
 	Send (const Send&);
 	void panshell_changed ();
+	void snd_output_changed (IOChange, void*);
 
 	int set_state_2X (XMLNode const &, int);
 
@@ -96,6 +101,7 @@ class LIBARDOUR_API Send : public Delivery
 
 	framecnt_t _delay_in;
 	framecnt_t _delay_out;
+	bool       _remove_on_disconnect;
 };
 
 } // namespace ARDOUR
diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h
index e28ff8e..db80ddc 100644
--- a/libs/ardour/ardour/session.h
+++ b/libs/ardour/ardour/session.h
@@ -28,6 +28,7 @@
 #include <set>
 #include <string>
 #include <vector>
+#include <queue>
 #include <stdint.h>
 
 #include <boost/dynamic_bitset.hpp>
@@ -42,11 +43,14 @@
 #include "pbd/error.h"
 #include "pbd/event_loop.h"
 #include "pbd/rcu.h"
+#include "pbd/reallocpool.h"
 #include "pbd/statefuldestructible.h"
 #include "pbd/signals.h"
 #include "pbd/undo.h"
 
-#include "evoral/types.hpp"
+#include "lua/luastate.h"
+
+#include "evoral/Range.hpp"
 
 #include "midi++/types.h"
 #include "midi++/mmc.h"
@@ -57,12 +61,16 @@
 #include "ardour/chan_count.h"
 #include "ardour/delivery.h"
 #include "ardour/interthread_info.h"
+#include "ardour/luascripting.h"
 #include "ardour/location.h"
 #include "ardour/monitor_processor.h"
+#include "ardour/presentation_info.h"
 #include "ardour/rc_configuration.h"
 #include "ardour/session_configuration.h"
 #include "ardour/session_event.h"
 #include "ardour/interpolation.h"
+#include "ardour/plugin.h"
+#include "ardour/presentation_info.h"
 #include "ardour/route.h"
 #include "ardour/route_graph.h"
 
@@ -80,7 +88,10 @@ class Parser;
 
 namespace PBD {
 class Controllable;
-class ControllableDescriptor;
+}
+
+namespace luabridge {
+	class LuaRef;
 }
 
 namespace Evoral {
@@ -102,6 +113,7 @@ class BufferSet;
 class Bundle;
 class Butler;
 class Click;
+class ControllableDescriptor;
 class Diskstream;
 class ExportHandler;
 class ExportStatus;
@@ -138,6 +150,7 @@ class Source;
 class Speakers;
 class TempoMap;
 class Track;
+class VCAManager;
 class WindowsVSTPlugin;
 
 extern void setup_enum_writer ();
@@ -153,6 +166,7 @@ private:
 	std::string _message;
 };
 
+/** Ardour Session */
 class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionList, public SessionEventManager
 {
   public:
@@ -177,6 +191,12 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
 	static int get_info_from_path (const std::string& xmlpath, float& sample_rate, SampleFormat& data_format);
 	static std::string get_snapshot_from_instant (const std::string& session_dir);
 
+	/** a monotonic counter used for naming user-visible things uniquely
+	 * (curently the sidechain port).
+	 * Use sparingly to keep the numbers low, prefer PBD::ID for all
+	 * internal, not user-visible IDs */
+	static unsigned int next_name_id ();
+
 	std::string path() const { return _path; }
 	std::string name() const { return _name; }
 	std::string snap_name() const { return _current_snapshot_name; }
@@ -193,11 +213,10 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
 	bool deletion_in_progress() const { return _state_of_the_state & Deletion; }
 	bool routes_deletion_in_progress() const { return _route_deletion_in_progress; }
 	bool peaks_cleanup_in_progres() const { return _state_of_the_state & PeakCleanup; }
+	bool loading () const { return _state_of_the_state & Loading; }
 
 	PBD::Signal0<void> DirtyChanged;
 
-	PBD::Signal1<void, bool> RouteAddedOrRemoved;
-
 	const SessionDirectory& session_directory () const { return *(_session_dir.get()); }
 
 	static PBD::Signal1<void,std::string> Dialog;
@@ -219,6 +238,13 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
 	std::string new_audio_source_path_for_embedded (const std::string& existing_path);
 	std::string new_audio_source_path (const std::string&, uint32_t nchans, uint32_t chan, bool destructive, bool take_required);
 	std::string new_midi_source_path (const std::string&);
+	/** create a new track or bus from a template (XML path)
+	 * @param how_many how many tracks or busses to create
+	 * @param template_path path to xml template file
+	 * @param name name (prefix) of the route to create
+	 * @param pd Playlist disposition
+	 * @return list of newly created routes
+	 */
 	RouteList new_route_from_template (uint32_t how_many, const std::string& template_path, const std::string& name, PlaylistDisposition pd = NewPlaylist);
 	RouteList new_route_from_template (uint32_t how_many, XMLNode&, const std::string& name, PlaylistDisposition pd = NewPlaylist);
 	std::vector<std::string> get_paths_for_new_sources (bool allow_replacing, const std::string& import_file_path, uint32_t channels);
@@ -228,7 +254,8 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
 	void process (pframes_t nframes);
 
 	BufferSet& get_silent_buffers (ChanCount count = ChanCount::ZERO);
-	BufferSet& get_scratch_buffers (ChanCount count = ChanCount::ZERO, bool silence = true );
+	BufferSet& get_noinplace_buffers (ChanCount count = ChanCount::ZERO);
+	BufferSet& get_scratch_buffers (ChanCount count = ChanCount::ZERO, bool silence = true);
 	BufferSet& get_route_buffers (ChanCount count = ChanCount::ZERO, bool silence = true);
 	BufferSet& get_mix_buffers (ChanCount count = ChanCount::ZERO);
 
@@ -250,6 +277,14 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
 		return routes.reader ();
 	}
 
+	/* because the set of Stripables consists of objects managed
+	 * independently, in multiple containers within the Session (or objects
+	 * owned by the session), we fill out a list in-place rather than
+	 * return a pointer to a copy of the (RCU) managed list, as happens
+	 * with get_routes()
+	 */
+
+	void get_stripables (StripableList&) const;
 	boost::shared_ptr<RouteList> get_tracks() const;
 	boost::shared_ptr<RouteList> get_routes_with_internal_returns() const;
 	boost::shared_ptr<RouteList> get_routes_with_regions_at (framepos_t const) const;
@@ -266,20 +301,20 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
 		bool operator() (boost::shared_ptr<Route>, boost::shared_ptr<Route> b);
 	};
 
-	void set_order_hint (int32_t order_hint) {_order_hint = order_hint;};
-	void notify_remote_id_change ();
-	void sync_order_keys ();
+	void notify_presentation_info_change ();
 
 	template<class T> void foreach_route (T *obj, void (T::*func)(Route&), bool sort = true);
 	template<class T> void foreach_route (T *obj, void (T::*func)(boost::shared_ptr<Route>), bool sort = true);
 	template<class T, class A> void foreach_route (T *obj, void (T::*func)(Route&, A), A arg, bool sort = true);
 
 	static char session_name_is_legal (const std::string&);
-	bool io_name_is_legal (const std::string&);
-	boost::shared_ptr<Route> route_by_name (std::string);
-	boost::shared_ptr<Route> route_by_id (PBD::ID);
-	boost::shared_ptr<Route> route_by_remote_id (uint32_t id);
-	boost::shared_ptr<Track> track_by_diskstream_id (PBD::ID);
+	bool io_name_is_legal (const std::string&) const;
+	boost::shared_ptr<Route> route_by_name (std::string) const;
+	boost::shared_ptr<Route> route_by_id (PBD::ID) const;
+	boost::shared_ptr<Stripable> get_remote_nth_stripable (PresentationInfo::order_t n, PresentationInfo::Flag) const;
+	boost::shared_ptr<Route> get_remote_nth_route (PresentationInfo::order_t n) const;
+	boost::shared_ptr<Route> route_by_selected_count (uint32_t cnt) const;
+	boost::shared_ptr<Track> track_by_diskstream_id (PBD::ID) const;
 	void routes_using_input_from (const std::string& str, RouteList& rl);
 
 	bool route_name_unique (std::string) const;
@@ -305,7 +340,7 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
 	void maybe_enable_record ();
 	void disable_record (bool rt_context, bool force = false);
 	void step_back_from_record ();
-	
+
 	void set_all_tracks_record_enabled(bool);
 
 	void maybe_write_autosave ();
@@ -424,6 +459,7 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
 	void set_auto_punch_location (Location *);
 	void set_auto_loop_location (Location *);
 	void set_session_extents (framepos_t start, framepos_t end);
+	void set_end_is_free (bool);
 	int location_name(std::string& result, std::string base = std::string(""));
 
 	pframes_t get_block_size()        const { return current_block_size; }
@@ -461,6 +497,13 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
 	};
 
 	int save_as (SaveAs&);
+	/** save session
+	 * @param snapshot_name name of the session (use an empty string for the current name)
+	 * @param pending save a 'recovery', not full state (default: false)
+	 * @param switch_to_snapshot switch to given snapshot after saving (default: false)
+	 * @param template_only save a session template (default: false)
+	 * @return zero on success
+	 */
 	int save_state (std::string snapshot_name, bool pending = false, bool switch_to_snapshot = false, bool template_only = false);
 	int restore_state (std::string snapshot_name);
 	int save_template (std::string template_name, bool replace_existing = false);
@@ -559,23 +602,25 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
 	std::list<boost::shared_ptr<AudioTrack> > new_audio_track (
 		int input_channels,
 		int output_channels,
-		TrackMode mode = Normal,
-		RouteGroup* route_group = 0,
-		uint32_t how_many = 1,
-		std::string name_template = ""
-		);
-
-	RouteList new_audio_route (
-		int input_channels, int output_channels, RouteGroup* route_group, uint32_t how_many, std::string name_template = ""
+		RouteGroup* route_group,
+		uint32_t how_many,
+		std::string name_template,
+		PresentationInfo::order_t order,
+		TrackMode mode = Normal
 		);
 
 	std::list<boost::shared_ptr<MidiTrack> > new_midi_track (
 		const ChanCount& input, const ChanCount& output,
-		boost::shared_ptr<PluginInfo> instrument = boost::shared_ptr<PluginInfo>(),
-		TrackMode mode = Normal,
-		RouteGroup* route_group = 0, uint32_t how_many = 1, std::string name_template = ""
+		boost::shared_ptr<PluginInfo> instrument,
+		Plugin::PresetRecord* pset,
+		RouteGroup* route_group, uint32_t how_many, std::string name_template,
+		PresentationInfo::order_t,
+		TrackMode mode = Normal
 		);
 
+	RouteList new_audio_route (int input_channels, int output_channels, RouteGroup* route_group, uint32_t how_many, std::string name_template, PresentationInfo::Flag, PresentationInfo::order_t);
+	RouteList new_midi_route (RouteGroup* route_group, uint32_t how_many, std::string name_template, boost::shared_ptr<PluginInfo> instrument, Plugin::PresetRecord*, PresentationInfo::Flag, PresentationInfo::order_t);
+
 	void remove_routes (boost::shared_ptr<RouteList>);
 	void remove_route (boost::shared_ptr<Route>);
 
@@ -631,8 +676,8 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
 	bool   synced_to_ltc () const { return config.get_external_sync() && Config->get_sync_source() == LTC && g_atomic_int_get (const_cast<gint*>(&_ltc_active)); }
 
 	double transport_speed() const { return _transport_speed; }
-	bool   transport_stopped() const { return _transport_speed == 0.0f; }
-	bool   transport_rolling() const { return _transport_speed != 0.0f; }
+	bool   transport_stopped() const { return _transport_speed == 0.0; }
+	bool   transport_rolling() const { return _transport_speed != 0.0; }
 
 	bool silent () { return _silent; }
 
@@ -659,7 +704,7 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
 	boost::shared_ptr<ExportHandler> get_export_handler ();
 	boost::shared_ptr<ExportStatus> get_export_status ();
 
-	int start_audio_export (framepos_t position);
+	int start_audio_export (framepos_t position, bool realtime = false);
 
 	PBD::Signal1<int, framecnt_t> ProcessExport;
 	static PBD::Signal2<void,std::string, std::string> Exported;
@@ -693,6 +738,9 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
 	*/
 	static PBD::Signal2<int, framecnt_t, framecnt_t> AskAboutSampleRateMismatch;
 
+	/** non interactive message */
+	static PBD::Signal2<void, framecnt_t, framecnt_t> NotifyAboutSampleRateMismatch;
+
 	/** handlers should return !0 for use pending state, 0 for ignore it.
 	 */
 	static PBD::Signal0<int> AskAboutPendingState;
@@ -723,6 +771,13 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
 
 	PBD::Signal1<void,bool> AuditionActive;
 
+	/* session script */
+	void register_lua_function (const std::string&, const std::string&, const LuaScriptParamList&);
+	void unregister_lua_function (const std::string& name);
+	std::vector<std::string> registered_lua_functions ();
+	uint32_t registered_lua_function_count () const { return _n_lua_scripts; }
+	void scripts_changed (); // called from lua, updates _n_lua_scripts
+
 	/* flattening stuff */
 
 	boost::shared_ptr<Region> write_one_track (Track&, framepos_t start, framepos_t end,
@@ -736,18 +791,17 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
 	bool soloing() const { return _non_soloed_outs_muted; }
 	bool listening() const { return _listen_cnt > 0; }
 	bool solo_isolated() const { return _solo_isolated_cnt > 0; }
+	void cancel_all_solo ();
 
 	static const SessionEvent::RTeventCallback rt_cleanup;
 
-	void set_solo (boost::shared_ptr<RouteList>, bool, SessionEvent::RTeventCallback after = rt_cleanup, PBD::Controllable::GroupControlDisposition group_override = PBD::Controllable::UseGroup);
 	void clear_all_solo_state (boost::shared_ptr<RouteList>);
-	void set_just_one_solo (boost::shared_ptr<Route>, bool, SessionEvent::RTeventCallback after = rt_cleanup);
-	void set_mute (boost::shared_ptr<RouteList>, bool, SessionEvent::RTeventCallback after = rt_cleanup, PBD::Controllable::GroupControlDisposition group_override = PBD::Controllable::UseGroup);
-	void set_listen (boost::shared_ptr<RouteList>, bool, SessionEvent::RTeventCallback after = rt_cleanup, PBD::Controllable::GroupControlDisposition group_override = PBD::Controllable::UseGroup);
-	void set_record_enabled (boost::shared_ptr<RouteList>, bool, SessionEvent::RTeventCallback after = rt_cleanup, PBD::Controllable::GroupControlDisposition group_override = PBD::Controllable::UseGroup);
-	void set_record_safe (boost::shared_ptr<RouteList>, bool yn, SessionEvent::RTeventCallback after = rt_cleanup, PBD::Controllable::GroupControlDisposition group_override = PBD::Controllable::UseGroup);
-	void set_solo_isolated (boost::shared_ptr<RouteList>, bool, SessionEvent::RTeventCallback after = rt_cleanup, PBD::Controllable::GroupControlDisposition group_override = PBD::Controllable::UseGroup);
-	void set_monitoring (boost::shared_ptr<RouteList>, MonitorChoice, SessionEvent::RTeventCallback after = rt_cleanup, PBD::Controllable::GroupControlDisposition group_override = PBD::Controllable::UseGroup);
+
+	/* Control-based methods */
+
+	void set_controls (boost::shared_ptr<ControlList>, double val, PBD::Controllable::GroupControlDisposition);
+	void set_control (boost::shared_ptr<AutomationControl>, double val, PBD::Controllable::GroupControlDisposition);
+
 	void set_exclusive_input_active (boost::shared_ptr<RouteList> rt, bool onoff, bool flip_others = false);
 
 	PBD::Signal1<void,bool> SoloActive;
@@ -835,13 +889,38 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
 	std::string next_undo() const { return _history.next_undo(); }
 	std::string next_redo() const { return _history.next_redo(); }
 
+	/** begin collecting undo information
+	 *
+	 * This call must always be followed by either
+	 * begin_reversible_command() or commit_reversible_command()
+	 *
+	 * @param cmd_name human readable name for the undo operation
+	 */
 	void begin_reversible_command (const std::string& cmd_name);
 	void begin_reversible_command (GQuark);
+	/** abort an open undo command
+	 * This must only be called after begin_reversible_command ()
+	 */
 	void abort_reversible_command ();
+	/** finalize an undo command and commit pending transactions
+	 *
+	 * This must only be called after begin_reversible_command ()
+	 * @param cmd (additional) command to add
+	 */
 	void commit_reversible_command (Command* cmd = 0);
 
 	void add_command (Command *const cmd);
 
+	/** create an StatefulDiffCommand from the given object and add it to the stack.
+	 *
+	 * This function must only be called after  begin_reversible_command.
+	 * Failing to do so may lead to a crash.
+	 *
+	 * @param sfd the object to diff
+	 * @returns the allocated StatefulDiffCommand (already added via add_command)
+	 */
+	PBD::StatefulDiffCommand* add_stateful_diff_command (boost::shared_ptr<PBD::StatefulDestructible> sfd);
+
 	/** @return The list of operations that are currently in progress */
 	std::list<GQuark> const & current_operations () {
 		return _current_trans_quarks;
@@ -916,8 +995,10 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
 
 	/* Controllables */
 
+	boost::shared_ptr<Processor> processor_by_id (PBD::ID) const;
+
 	boost::shared_ptr<PBD::Controllable> controllable_by_id (const PBD::ID&);
-	boost::shared_ptr<PBD::Controllable> controllable_by_descriptor (const PBD::ControllableDescriptor&);
+	boost::shared_ptr<PBD::Controllable> controllable_by_descriptor (const ARDOUR::ControllableDescriptor&);
 
 	void add_controllable (boost::shared_ptr<PBD::Controllable>);
 	void remove_controllable (PBD::Controllable*);
@@ -1045,11 +1126,15 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
 	void reconnect_ltc_input ();
 	void reconnect_ltc_output ();
 
+	VCAManager& vca_manager() { return *_vca_manager; }
+
   protected:
 	friend class AudioEngine;
 	void set_block_size (pframes_t nframes);
 	void set_frame_rate (framecnt_t nframes);
+#ifdef USE_TRACKS_CODE_FEATURES
 	void reconnect_existing_routes (bool withLock, bool reconnect_master = true, bool reconnect_inputs = true, bool reconnect_outputs = true);
+#endif
 
   protected:
 	friend class Route;
@@ -1060,6 +1145,10 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
 	int  create (const std::string& mix_template, BusProfile*);
 	void destroy ();
 
+	static guint _name_id_counter;
+	static void init_name_id_counter (guint n);
+	static unsigned int name_id_counter ();
+
 	enum SubState {
 		PendingDeclickIn      = 0x1,  ///< pending de-click fade-in for start
 		PendingDeclickOut     = 0x2,  ///< pending de-click fade-out for stop
@@ -1081,13 +1170,14 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
 	process_function_type    last_process_function;
 	bool                    _bounce_processing_active;
 	bool                     waiting_for_sync_offset;
-	framecnt_t              _base_frame_rate;
-	framecnt_t              _current_frame_rate;  //this includes video pullup offset
-	framecnt_t              _nominal_frame_rate;  //ignores audioengine setting, "native" SR
+	framecnt_t              _base_frame_rate;     // sample-rate of the session at creation time, "native" SR
+	framecnt_t              _nominal_frame_rate;  // overridden by audioengine setting
+	framecnt_t              _current_frame_rate;  // this includes video pullup offset
 	int                      transport_sub_state;
 	mutable gint            _record_status;
 	framepos_t              _transport_frame;
 	Location*               _session_range_location; ///< session range, or 0 if there is nothing in the session yet
+	bool                    _session_range_end_is_free;
 	Slave*                  _slave;
 	bool                    _silent;
 
@@ -1140,8 +1230,8 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
 	void process_without_events (pframes_t);
 	void process_with_events    (pframes_t);
 	void process_audition       (pframes_t);
-	int  process_export         (pframes_t);
-	int  process_export_fw      (pframes_t);
+	void process_export         (pframes_t);
+	void process_export_fw      (pframes_t);
 
 	void block_processing() { g_atomic_int_set (&processing_prohibited, 1); }
 	void unblock_processing() { g_atomic_int_set (&processing_prohibited, 0); }
@@ -1177,8 +1267,10 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
 	framepos_t post_export_position;
 
 	bool _exporting;
-	bool _export_started;
 	bool _export_rolling;
+	bool _realtime_export;
+	framepos_t _export_preroll;
+	framepos_t _export_latency;
 
 	boost::shared_ptr<ExportHandler> export_handler;
 	boost::shared_ptr<ExportStatus>  export_status;
@@ -1271,6 +1363,21 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
 	bool              pending_abort;
 	bool              pending_auto_loop;
 
+	PBD::ReallocPool _mempool;
+	LuaState lua;
+	Glib::Threads::Mutex lua_lock;
+	luabridge::LuaRef * _lua_run;
+	luabridge::LuaRef * _lua_add;
+	luabridge::LuaRef * _lua_del;
+	luabridge::LuaRef * _lua_list;
+	luabridge::LuaRef * _lua_load;
+	luabridge::LuaRef * _lua_save;
+	luabridge::LuaRef * _lua_cleanup;
+	uint32_t            _n_lua_scripts;
+
+	void setup_lua ();
+	void try_run_lua (pframes_t);
+
 	Butler* _butler;
 
 	static const PostTransportWork ProcessCannotProceedMask =
@@ -1322,7 +1429,7 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
 	void             auto_loop_changed (Location *);
 	void             auto_loop_declick_range (Location *, framepos_t &, framepos_t &);
 
-	int  ensure_engine (uint32_t desired_sample_rate);
+	int  ensure_engine (uint32_t desired_sample_rate, bool);
 	void pre_engine_init (std::string path);
 	int  post_engine_init ();
 	int  immediately_post_engine ();
@@ -1370,6 +1477,47 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
 	pthread_cond_t  _rt_emit_cond;
 	bool            _rt_emit_pending;
 
+	/* Auto Connect Thread */
+	static void *auto_connect_thread (void *);
+	void auto_connect_thread_run ();
+	void auto_connect_thread_start ();
+	void auto_connect_thread_terminate ();
+
+	pthread_t       _auto_connect_thread;
+	bool            _ac_thread_active;
+	pthread_mutex_t _auto_connect_mutex;
+	pthread_cond_t  _auto_connect_cond;
+
+	struct AutoConnectRequest {
+		public:
+		AutoConnectRequest (boost::shared_ptr <Route> r, bool ci,
+				const ChanCount& is,
+				const ChanCount& os,
+				const ChanCount& io,
+				const ChanCount& oo)
+			: route (boost::weak_ptr<Route> (r))
+			, connect_inputs (ci)
+			, input_start (is)
+			, output_start (os)
+			, input_offset (io)
+			, output_offset (oo)
+		{}
+
+		boost::weak_ptr <Route> route;
+		bool connect_inputs;
+		ChanCount input_start;
+		ChanCount output_start;
+		ChanCount input_offset;
+		ChanCount output_offset;
+	};
+
+	typedef std::queue<AutoConnectRequest> AutoConnectQueue;
+	Glib::Threads::Mutex  _auto_connect_queue_lock;
+	AutoConnectQueue _auto_connect_queue;
+	guint _latency_recompute_pending;
+
+	void auto_connect (const AutoConnectRequest&);
+	void queue_latency_recompute ();
 
 	/* SessionEventManager interface */
 
@@ -1503,6 +1651,7 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
 
 	TempoMap    *_tempo_map;
 	void          tempo_map_changed (const PBD::PropertyChange&);
+	void          gui_tempo_map_changed ();
 
 	/* edit/mix groups */
 
@@ -1517,8 +1666,8 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
 
 	SerializedRCUManager<RouteList>  routes;
 
-	void add_routes (RouteList&, bool input_auto_connect, bool output_auto_connect, bool save);
-	void add_routes_inner (RouteList&, bool input_auto_connect, bool output_auto_connect);
+	void add_routes (RouteList&, bool input_auto_connect, bool output_auto_connect, bool save, PresentationInfo::order_t);
+	void add_routes_inner (RouteList&, bool input_auto_connect, bool output_auto_connect, PresentationInfo::order_t);
 	bool _adding_routes_in_progress;
 	bool _reconnecting_routes_in_progress;
 	bool _route_deletion_in_progress;
@@ -1532,9 +1681,7 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
 
 	bool find_route_name (std::string const &, uint32_t& id, std::string& name, bool);
 	void count_existing_track_channels (ChanCount& in, ChanCount& out);
-	void auto_connect_route (boost::shared_ptr<Route> route, ChanCount& existing_inputs, ChanCount& existing_outputs,
-	                         bool with_lock, bool connect_inputs = true,
-	                         ChanCount input_start = ChanCount (), ChanCount output_start = ChanCount ());
+	void auto_connect_route (boost::shared_ptr<Route>, bool, const ChanCount&, const ChanCount&, const ChanCount& io = ChanCount(), const ChanCount& oo = ChanCount());
 	void midi_output_change_handler (IOChange change, void* /*src*/, boost::weak_ptr<Route> midi_track);
 
 	/* track numbering */
@@ -1542,12 +1689,13 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
 	void reassign_track_numbers ();
 	uint32_t _track_number_decimals;
 
-	/* mixer stuff */
+	/* solo/mute/notifications */
 
 	void route_listen_changed (PBD::Controllable::GroupControlDisposition, boost::weak_ptr<Route>);
 	void route_mute_changed ();
 	void route_solo_changed (bool self_solo_change, PBD::Controllable::GroupControlDisposition group_override, boost::weak_ptr<Route>);
 	void route_solo_isolated_changed (boost::weak_ptr<Route>);
+
 	void update_route_solo_state (boost::shared_ptr<RouteList> r = boost::shared_ptr<RouteList>());
 
 	void listen_position_changed ();
@@ -1782,15 +1930,30 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
 		return ev;
 	}
 
-	void rt_set_solo (boost::shared_ptr<RouteList>, bool yn, PBD::Controllable::GroupControlDisposition group_override);
+	/* specialized version realtime "apply to set of routes" operations */
+	template<typename T1, typename T2> SessionEvent*
+		get_rt_event (boost::shared_ptr<RouteList> rl, T1 t1arg, T2 t2arg, SessionEvent::RTeventCallback after, PBD::Controllable::GroupControlDisposition group_override,
+		              void (Session::*method) (boost::shared_ptr<RouteList>, T1, T2, PBD::Controllable::GroupControlDisposition)) {
+		SessionEvent* ev = new SessionEvent (SessionEvent::RealTimeOperation, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
+		ev->rt_slot = boost::bind (method, this, rl, t1arg, t2arg, group_override);
+		ev->rt_return = after;
+		ev->event_loop = PBD::EventLoop::get_event_loop_for_thread ();
+
+		return ev;
+	}
+
+	/* specialized version realtime "apply to set of controls" operations */
+	SessionEvent* get_rt_event (boost::shared_ptr<ControlList> cl, double arg, PBD::Controllable::GroupControlDisposition group_override) {
+		SessionEvent* ev = new SessionEvent (SessionEvent::RealTimeOperation, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
+		ev->rt_slot = boost::bind (&Session::rt_set_controls, this, cl, arg, group_override);
+		ev->rt_return = Session::rt_cleanup;
+		ev->event_loop = PBD::EventLoop::get_event_loop_for_thread ();
+
+		return ev;
+	}
+
+	void rt_set_controls (boost::shared_ptr<ControlList>, double val, PBD::Controllable::GroupControlDisposition group_override);
 	void rt_clear_all_solo_state (boost::shared_ptr<RouteList>, bool yn, PBD::Controllable::GroupControlDisposition group_override);
-	void rt_set_just_one_solo (boost::shared_ptr<RouteList>, bool yn, PBD::Controllable::GroupControlDisposition  /* ignored*/ );
-	void rt_set_mute (boost::shared_ptr<RouteList>, bool yn, PBD::Controllable::GroupControlDisposition group_override);
-	void rt_set_listen (boost::shared_ptr<RouteList>, bool yn, PBD::Controllable::GroupControlDisposition group_override);
-	void rt_set_solo_isolated (boost::shared_ptr<RouteList>, bool yn, PBD::Controllable::GroupControlDisposition group_override);
-	void rt_set_record_enabled (boost::shared_ptr<RouteList>, bool yn, PBD::Controllable::GroupControlDisposition group_override);
-	void rt_set_record_safe (boost::shared_ptr<RouteList>, bool yn, PBD::Controllable::GroupControlDisposition group_override);
-	void rt_set_monitoring (boost::shared_ptr<RouteList>, MonitorChoice, PBD::Controllable::GroupControlDisposition group_override);
 
 	/** temporary list of Diskstreams used only during load of 2.X sessions */
 	std::list<boost::shared_ptr<Diskstream> > _diskstreams_2X;
@@ -1821,8 +1984,7 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
 	*/
 	GraphEdges _current_route_graph;
 
-	uint32_t next_control_id () const;
-	int32_t _order_hint;
+	void ensure_route_presentation_info_gap (PresentationInfo::order_t, uint32_t gap_size);
 	bool ignore_route_processor_changes;
 
 	MidiClockTicker* midi_clock;
@@ -1848,6 +2010,12 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
 	static const uint32_t session_end_shift;
 
 	std::string _template_state_dir;
+
+	VCAManager* _vca_manager;
+
+	boost::shared_ptr<Route> get_midi_nth_route_by_id (PresentationInfo::order_t n) const;
+
+	std::string created_with;
 };
 
 
diff --git a/libs/ardour/ardour/session_configuration_vars.h b/libs/ardour/ardour/session_configuration_vars.h
index 25625e2..6c4bc3f 100644
--- a/libs/ardour/ardour/session_configuration_vars.h
+++ b/libs/ardour/ardour/session_configuration_vars.h
@@ -56,6 +56,14 @@ CONFIG_VARIABLE (std::string, timecode_generator_offset, "timecode-generator-off
 CONFIG_VARIABLE (bool, glue_new_markers_to_bars_and_beats, "glue-new-markers-to-bars-and-beats", false)
 CONFIG_VARIABLE (bool, midi_copy_is_fork, "midi-copy-is-fork", false)
 CONFIG_VARIABLE (bool, glue_new_regions_to_bars_and_beats, "glue-new-regions-to-bars-and-beats", false)
+CONFIG_VARIABLE (bool, realtime_export, "realtime-export", false)
+
+/* Video-settings are saved with the session and belong to the session.
+ * headless ardour could remote control xjadeo for example.
+ */
+CONFIG_VARIABLE (bool, use_video_file_fps, "use-video-file-fps", false)
+CONFIG_VARIABLE (bool, videotimeline_pullup, "videotimeline-pullup", true)
+
 /* These are GUI-only properties and should not be present in this
  * context. There needs to be a new GUI-level session-scoped configuration
  * variable header.
@@ -65,8 +73,6 @@ CONFIG_VARIABLE (uint16_t, wave_zoom_factor, "wave-zoom-factor", 2)
 CONFIG_VARIABLE (bool, show_summary, "show-summary", true)
 CONFIG_VARIABLE (bool, show_group_tabs, "show-group-tabs", true)
 CONFIG_VARIABLE (bool, show_region_fades, "show-region-fades", true)
-CONFIG_VARIABLE (bool, use_video_file_fps, "use-video-file-fps", false)
-CONFIG_VARIABLE (bool, videotimeline_pullup, "videotimeline-pullup", true)
 CONFIG_VARIABLE (bool, show_busses_on_meterbridge, "show-busses-on-meterbridge", false)
 CONFIG_VARIABLE (bool, show_master_on_meterbridge, "show-master-on-meterbridge", true)
 CONFIG_VARIABLE (bool, show_midi_on_meterbridge, "show-midi-on-meterbridge", true)
diff --git a/libs/ardour/ardour/session_event.h b/libs/ardour/ardour/session_event.h
index cca7f12..8bb160b 100644
--- a/libs/ardour/ardour/session_event.h
+++ b/libs/ardour/ardour/session_event.h
@@ -84,26 +84,28 @@ public:
 	union {
 		void*        ptr;
 		bool         yes_or_no;
-		framepos_t  target2_frame;
+		framepos_t   target2_frame;
 		Slave*       slave;
 		Route*       route;
 	};
 
 	union {
 		bool second_yes_or_no;
+		double control_value;
 	};
 
 	union {
 		bool third_yes_or_no;
 	};
 
-	/* 4 members to handle a multi-group event handled in RT context */
+	/* 5 members to handle a multi-group event handled in RT context */
 
 	typedef boost::function<void (SessionEvent*)> RTeventCallback;
 
-	boost::shared_ptr<RouteList> routes;    /* apply to */
-	boost::function<void (void)> rt_slot;   /* what to call in RT context */
-	RTeventCallback              rt_return; /* called after rt_slot, with this event as an argument */
+	boost::shared_ptr<ControlList> controls; /* apply to */
+	boost::shared_ptr<RouteList> routes;     /* apply to */
+	boost::function<void (void)> rt_slot;    /* what to call in RT context */
+	RTeventCallback              rt_return;  /* called after rt_slot, with this event as an argument */
 	PBD::EventLoop*              event_loop;
 
 	std::list<AudioRange> audio_range;
diff --git a/libs/ardour/ardour/session_playlists.h b/libs/ardour/ardour/session_playlists.h
index e7ad162..cc6d301 100644
--- a/libs/ardour/ardour/session_playlists.h
+++ b/libs/ardour/ardour/session_playlists.h
@@ -54,12 +54,14 @@ public:
 	uint32_t source_use_count (boost::shared_ptr<const Source> src) const;
 	uint32_t region_use_count (boost::shared_ptr<Region> region) const;
 	template<class T> void foreach (T *obj, void (T::*func)(boost::shared_ptr<Playlist>));
+	void foreach (boost::function<void(boost::shared_ptr<const Playlist>)> functor);
 	void get (std::vector<boost::shared_ptr<Playlist> >&) const;
 	void unassigned (std::list<boost::shared_ptr<Playlist> > & list);
 	void destroy_region (boost::shared_ptr<Region>);
 	boost::shared_ptr<Crossfade> find_crossfade (const PBD::ID &);
 	void sync_all_regions_with_regions ();
 	std::vector<boost::shared_ptr<Playlist> > playlists_for_track (boost::shared_ptr<Track>) const;
+	uint32_t n_playlists() const;
 
 private:
 	friend class Session;
@@ -69,7 +71,6 @@ private:
 	void remove_weak (boost::weak_ptr<Playlist>);
 	void track (bool, boost::weak_ptr<Playlist>);
 
-	uint32_t n_playlists() const;
 	void find_equivalent_playlist_regions (boost::shared_ptr<Region>, std::vector<boost::shared_ptr<Region> >& result);
 	void update_after_tempo_map_change ();
 	void add_state (XMLNode *, bool);
diff --git a/libs/ardour/ardour/sidechain.h b/libs/ardour/ardour/sidechain.h
new file mode 100644
index 0000000..9d44c3e
--- /dev/null
+++ b/libs/ardour/ardour/sidechain.h
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+ * Copyright (C) 2006 Paul Davis
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+
+#ifndef __ardour_sidechain_h__
+#define __ardour_sidechain_h__
+
+#include <string>
+
+#include "pbd/stateful.h"
+#include "ardour/ardour.h"
+#include "ardour/io_processor.h"
+
+namespace ARDOUR {
+
+class LIBARDOUR_API SideChain : public IOProcessor
+{
+public:
+	SideChain (Session&, const std::string&);
+	virtual ~SideChain ();
+
+	void run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, double speed, pframes_t nframes, bool);
+
+	bool can_support_io_configuration (const ChanCount& in, ChanCount& out);
+	bool configure_io (ChanCount in, ChanCount out);
+
+	XMLNode& state(bool full);
+	int      set_state(const XMLNode&, int version);
+
+private:
+	/* disallow copy construction */
+	SideChain (const SideChain&);
+};
+
+} // namespace ARDOUR
+
+#endif // __ardour_sidechain_h__
diff --git a/libs/ardour/ardour/slavable.h b/libs/ardour/ardour/slavable.h
new file mode 100644
index 0000000..83675f0
--- /dev/null
+++ b/libs/ardour/ardour/slavable.h
@@ -0,0 +1,79 @@
+/*
+    Copyright (C) 2016 Paul Davis
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#ifndef __ardour_slavable_h__
+#define __ardour_slavable_h__
+
+#include <set>
+#include <string>
+#include <stdint.h>
+
+#include <boost/shared_ptr.hpp>
+
+#include "pbd/signals.h"
+
+#include "evoral/Parameter.hpp"
+
+#include "ardour/libardour_visibility.h"
+
+class XMLNode;
+
+namespace ARDOUR {
+
+class VCA;
+class VCAManager;
+class AutomationControl;
+
+class LIBARDOUR_API Slavable
+{
+    public:
+	Slavable ();
+	virtual ~Slavable() {}
+
+	XMLNode& get_state () const;
+	int set_state (XMLNode const&, int);
+
+	void assign (boost::shared_ptr<VCA>);
+	void unassign (boost::shared_ptr<VCA>);
+
+	virtual boost::shared_ptr<AutomationControl> automation_control (const Evoral::Parameter& id) = 0;
+
+	static std::string xml_node_name;
+
+	/* signal sent VCAManager once assignment is possible */
+	static PBD::Signal1<void,VCAManager*> Assign;
+
+    protected:
+	virtual int assign_controls (boost::shared_ptr<VCA>);
+	virtual int unassign_controls (boost::shared_ptr<VCA>);
+
+    private:
+	mutable Glib::Threads::RWLock master_lock;
+	std::set<uint32_t> _masters;
+	PBD::ScopedConnection assign_connection;
+	PBD::ScopedConnectionList unassign_connections;
+
+	int do_assign (VCAManager* s);
+	void weak_unassign (boost::weak_ptr<VCA>);
+
+};
+
+} // namespace ARDOUR
+
+#endif /* __ardour_slavable_h__ */
diff --git a/libs/ardour/ardour/slavable_automation_control.h b/libs/ardour/ardour/slavable_automation_control.h
new file mode 100644
index 0000000..45b5555
--- /dev/null
+++ b/libs/ardour/ardour/slavable_automation_control.h
@@ -0,0 +1,117 @@
+/*
+    Copyright (C) 2016 Paul Davis
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#ifndef __ardour_slavable_automation_control_h__
+#define __ardour_slavable_automation_control_h__
+
+#include "ardour/automation_control.h"
+#include "ardour/libardour_visibility.h"
+
+namespace ARDOUR {
+
+class LIBARDOUR_API SlavableAutomationControl : public AutomationControl
+{
+    public:
+	SlavableAutomationControl(ARDOUR::Session&,
+	                  const Evoral::Parameter&                  parameter,
+	                  const ParameterDescriptor&                desc,
+	                  boost::shared_ptr<ARDOUR::AutomationList> l=boost::shared_ptr<ARDOUR::AutomationList>(),
+	                  const std::string&                        name="");
+
+	double get_value () const;
+
+	void add_master (boost::shared_ptr<AutomationControl>);
+	void remove_master (boost::shared_ptr<AutomationControl>);
+	void clear_masters ();
+	bool slaved_to (boost::shared_ptr<AutomationControl>) const;
+	bool slaved () const;
+	double get_masters_value () const {
+		Glib::Threads::RWLock::ReaderLock lm (master_lock);
+		return get_masters_value_locked ();
+	}
+
+	/* for toggled/boolean controls, returns a count of the number of
+	   masters currently enabled. For other controls, returns zero.
+	*/
+	int32_t   get_boolean_masters () const;
+
+	std::vector<PBD::ID> masters () const;
+
+	PBD::Signal0<void> MasterStatusChange;
+
+    protected:
+
+	class MasterRecord {
+          public:
+		MasterRecord (boost::shared_ptr<AutomationControl> gc, double r)
+			: _master (gc)
+			, _ratio (r)
+		{}
+
+		boost::shared_ptr<AutomationControl> master() const { return _master; }
+
+		/* for boolean/toggled controls, we store a boolean value to
+		 * indicate if this master returned true/false (1.0/0.0) from
+		 * ::get_value() after its most recent change.
+		 */
+
+		bool yn() const { return _yn; }
+		void set_yn (bool yn) { _yn = yn; }
+
+		/* for non-boolean/non-toggled controls, we store a ratio that
+		 * connects the value of the master with the value of this
+		 * slave. See comments in the source for more details on how
+		 * this is computed and used.
+		 */
+
+		double ratio () const { return _ratio; }
+		void reset_ratio (double r) { _ratio = r; }
+
+		PBD::ScopedConnection connection;
+
+         private:
+		boost::shared_ptr<AutomationControl> _master;
+		union {
+			double _ratio;
+			bool   _yn;
+		};
+	};
+
+	mutable Glib::Threads::RWLock master_lock;
+	typedef std::map<PBD::ID,MasterRecord> Masters;
+	Masters _masters;
+	PBD::ScopedConnectionList masters_connections;
+
+	void   master_going_away (boost::weak_ptr<AutomationControl>);
+	double get_value_locked() const;
+	void   actually_set_value (double val, PBD::Controllable::GroupControlDisposition group_override);
+	void   update_boolean_masters_records (boost::shared_ptr<AutomationControl>);
+
+	virtual void   master_changed (bool from_self, GroupControlDisposition gcd, boost::shared_ptr<AutomationControl>);
+	virtual void   recompute_masters_ratios (double val) { /* do nothing by default */}
+	virtual double get_masters_value_locked () const;
+	virtual void   pre_remove_master (boost::shared_ptr<AutomationControl>) {}
+	virtual void   post_add_master (boost::shared_ptr<AutomationControl>) {}
+
+
+};
+
+} // namespace ARDOUR
+
+#endif /* __ardour_slavable_automation_control_h__ */
diff --git a/libs/ardour/ardour/solo_control.h b/libs/ardour/ardour/solo_control.h
new file mode 100644
index 0000000..3f0f522
--- /dev/null
+++ b/libs/ardour/ardour/solo_control.h
@@ -0,0 +1,118 @@
+/*
+    Copyright (C) 2016 Paul Davis
+
+    This program is free software; you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by the Free
+    Software Foundation; either version 2 of the License, or (at your option)
+    any later version.
+
+    This program is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc.,
+    675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#ifndef __ardour_solo_control_h__
+#define __ardour_solo_control_h__
+
+#include <string>
+
+#include <boost/shared_ptr.hpp>
+
+#include "ardour/slavable_automation_control.h"
+#include "ardour/libardour_visibility.h"
+
+namespace ARDOUR {
+
+class Session;
+class Soloable;
+class Muteable;
+
+class LIBARDOUR_API SoloControl : public SlavableAutomationControl
+{
+  public:
+	SoloControl (Session& session, std::string const & name, Soloable& soloable, Muteable& m);
+
+	double get_value () const;
+
+	bool can_solo() const;
+
+	/* Export additional API so that objects that only get access
+	 * to a Controllable/AutomationControl can do more fine-grained
+	 * operations with respect to solo. Obviously, they would need
+	 * to dynamic_cast<SoloControl> first.
+	 *
+	 * Solo state is not representable by a single scalar value,
+	 * so set_value() and get_value() is not enough.
+	 *
+	 * This means that the Controllable is technically
+	 * asymmetric. It is possible to call ::set_value (0.0) to
+	 * disable (self)solo, and then call ::get_value() and get a
+	 * return of 1.0 because the control is soloed by
+	 * upstream/downstream or a master.
+	 */
+
+	void mod_solo_by_others_upstream (int32_t delta);
+	void mod_solo_by_others_downstream (int32_t delta);
+
+	/* API to check different aspects of solo substate
+	 */
+
+	bool self_soloed () const {
+		return _self_solo;
+	}
+	bool soloed_by_masters () const {
+		return get_masters_value();
+	}
+	bool soloed_by_self_or_masters () const {
+		return self_soloed() || get_masters_value ();
+	}
+	bool soloed_by_others () const {
+		return _soloed_by_others_downstream || _soloed_by_others_upstream || get_masters_value ();
+	}
+	uint32_t soloed_by_others_upstream () const {
+		return _soloed_by_others_upstream;
+	}
+	uint32_t soloed_by_others_downstream () const {
+		return _soloed_by_others_downstream;
+	}
+	bool soloed() const { return self_soloed() || soloed_by_others(); }
+
+	/* The session object needs to respond to solo
+	   changes, but to do so accurately it needs to know if we transition
+	   into or out of solo. The normal Changed signal doesn't make that
+	   possible.
+	*/
+
+	int32_t transitioned_into_solo () const { return _transition_into_solo; }
+
+	void clear_all_solo_state ();
+
+	int set_state (XMLNode const&, int);
+	XMLNode& get_state ();
+
+  protected:
+	void actually_set_value (double, PBD::Controllable::GroupControlDisposition group_override);
+	void master_changed (bool from_self, GroupControlDisposition, boost::shared_ptr<AutomationControl> m);
+	void pre_remove_master (boost::shared_ptr<AutomationControl>);
+	void post_add_master (boost::shared_ptr<AutomationControl>);
+
+  private:
+	Soloable& _soloable;
+	Muteable& _muteable;
+	bool      _self_solo;
+	uint32_t  _soloed_by_others_upstream;
+	uint32_t  _soloed_by_others_downstream;
+	int32_t   _transition_into_solo;
+
+	void set_self_solo (bool yn);
+	void set_mute_master_solo ();
+};
+
+} /* namespace */
+
+#endif /* __libardour_solo_control_h__ */
diff --git a/libs/ardour/ardour/solo_isolate_control.h b/libs/ardour/ardour/solo_isolate_control.h
new file mode 100644
index 0000000..1e49469
--- /dev/null
+++ b/libs/ardour/ardour/solo_isolate_control.h
@@ -0,0 +1,91 @@
+/*
+    Copyright (C) 2016 Paul Davis
+
+    This program is free software; you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by the Free
+    Software Foundation; either version 2 of the License, or (at your option)
+    any later version.
+
+    This program is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc.,
+    675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#ifndef __ardour_solo_isolate_control_h__
+#define __ardour_solo_isolate_control_h__
+
+#include <string>
+
+#include <boost/shared_ptr.hpp>
+
+#include "ardour/slavable_automation_control.h"
+#include "ardour/libardour_visibility.h"
+
+class XMLNode;
+
+namespace ARDOUR {
+
+class Session;
+class Soloable;
+class Muteable;
+
+class LIBARDOUR_API SoloIsolateControl : public SlavableAutomationControl
+{
+  public:
+	SoloIsolateControl (Session& session, std::string const & name, Soloable& soloable, Muteable& m);
+
+	double get_value () const;
+
+	/* Export additional API so that objects that only get access
+	 * to a Controllable/AutomationControl can do more fine-grained
+	 * operations with respect to solo isolate. Obviously, they would need
+	 * to dynamic_cast<SoloControl> first.
+	 *
+	 * Solo Isolate state is not representable by a single scalar value,
+	 * so set_value() and get_value() is not enough.
+	 *
+	 * This means that the Controllable is technically
+	 * asymmetric. It is possible to call ::set_value (0.0) to
+	 * disable (self)solo, and then call ::get_value() and get a
+	 * return of 1.0 because the control is isolated by
+	 * upstream/downstream or a master.
+	 */
+
+	void mod_solo_isolated_by_upstream (int32_t delta);
+
+	/* API to check different aspects of solo isolate substate
+	 */
+
+	uint32_t solo_isolated_by_upstream () const {
+		return _solo_isolated_by_upstream;
+	}
+	bool self_solo_isolated () const {
+		return _solo_isolated;
+	}
+	bool solo_isolated() const { return self_solo_isolated() || solo_isolated_by_upstream(); }
+
+	int set_state (XMLNode const&, int);
+	XMLNode& get_state ();
+
+  protected:
+	void master_changed (bool from_self, PBD::Controllable::GroupControlDisposition gcd, boost::shared_ptr<AutomationControl>);
+	void actually_set_value (double, PBD::Controllable::GroupControlDisposition group_override);
+
+  private:
+	Soloable&      _soloable;
+	Muteable&      _muteable;
+	bool           _solo_isolated;
+	uint32_t       _solo_isolated_by_upstream;
+
+	void set_solo_isolated (bool yn, Controllable::GroupControlDisposition group_override);
+
+};
+
+} /* namespace */
+
+#endif /* __libardour_solo_isolate_control_h__ */
diff --git a/libs/ardour/ardour/solo_safe_control.h b/libs/ardour/ardour/solo_safe_control.h
new file mode 100644
index 0000000..e969959
--- /dev/null
+++ b/libs/ardour/ardour/solo_safe_control.h
@@ -0,0 +1,55 @@
+/*
+    Copyright (C) 2016 Paul Davis
+
+    This program is free software; you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by the Free
+    Software Foundation; either version 2 of the License, or (at your option)
+    any later version.
+
+    This program is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc.,
+    675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#ifndef __ardour_solo_safe_control_h__
+#define __ardour_solo_safe_control_h__
+
+#include <string>
+
+#include "ardour/slavable_automation_control.h"
+
+#include "ardour/libardour_visibility.h"
+
+class XMLNode;
+
+namespace ARDOUR {
+
+class Session;
+
+class LIBARDOUR_API SoloSafeControl : public SlavableAutomationControl
+{
+  public:
+	SoloSafeControl (Session& session, std::string const & name);
+
+	double get_value () const;
+
+	bool solo_safe() const { return _solo_safe; }
+
+	int set_state (XMLNode const&, int);
+	XMLNode& get_state ();
+
+  protected:
+	void actually_set_value (double, PBD::Controllable::GroupControlDisposition group_override);
+
+  private:
+	bool _solo_safe;
+};
+
+} /* namespace */
+
+#endif /* __libardour_solo_safe_control_h__ */
diff --git a/libs/ardour/ardour/soloable.h b/libs/ardour/ardour/soloable.h
new file mode 100644
index 0000000..6dafac7
--- /dev/null
+++ b/libs/ardour/ardour/soloable.h
@@ -0,0 +1,38 @@
+/*
+    Copyright (C) 2016 Paul Davis
+
+    This program is free software; you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by the Free
+    Software Foundation; either version 2 of the License, or (at your option)
+    any later version.
+
+    This program is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc.,
+    675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#ifndef __ardour_soloable_h__
+#define __ardour_soloable_h__
+
+#include <stdint.h>
+
+namespace ARDOUR {
+
+class Soloable {
+    public:
+	virtual ~Soloable() {}
+
+	virtual void push_solo_upstream (int32_t delta) = 0;
+	virtual void push_solo_isolate_upstream (int32_t delta) = 0;
+	virtual bool is_safe () const = 0;
+	virtual bool can_solo () const = 0;
+};
+
+} /* namespace */
+
+#endif /* __ardour_soloable_h__ */
diff --git a/libs/ardour/ardour/stripable.h b/libs/ardour/ardour/stripable.h
new file mode 100644
index 0000000..2464ddd
--- /dev/null
+++ b/libs/ardour/ardour/stripable.h
@@ -0,0 +1,190 @@
+/*
+  Copyright (C) 2016 Paul Davis
+
+  This program is free software; you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation; either version 2 of the License, or
+  (at your option) any later version.
+
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#ifndef __libardour_stripable_h__
+#define __libardour_stripable_h__
+
+#include <stdint.h>
+
+#include <string>
+#include <boost/utility.hpp>
+#include <boost/shared_ptr.hpp>
+
+#include "pbd/signals.h"
+
+#include "ardour/presentation_info.h"
+#include "ardour/session_object.h"
+#include "ardour/libardour_visibility.h"
+
+namespace ARDOUR {
+
+class AutomationControl;
+class GainControl;
+class PeakMeter;
+class SoloControl;
+class MuteControl;
+class PhaseControl;
+class SoloIsolateControl;
+class SoloSafeControl;
+class MonitorControl;
+class MonitorProcessor;
+class RecordEnableControl;
+class RecordSafeControl;
+
+/* This is a virtual base class for any object that needs to be potentially
+ * represented by a control-centric user interface using the general model of a
+ * mixing console "strip" - a collection of controls that determine the state
+ * and behaviour of the object.
+ */
+
+class LIBARDOUR_API Stripable : public SessionObject {
+   public:
+	Stripable (Session& session, std::string const & name, PresentationInfo const &);
+	virtual ~Stripable () {}
+
+	/* XXX
+	   midi on/off
+	 */
+
+	bool is_auditioner() const { return _presentation_info.flags() & PresentationInfo::Auditioner; }
+	bool is_master() const { return _presentation_info.flags() & PresentationInfo::MasterOut; }
+	bool is_monitor() const { return _presentation_info.flags() & PresentationInfo::MonitorOut; }
+
+	int set_state (XMLNode const&, int);
+
+	bool is_hidden() const { return _presentation_info.flags() & PresentationInfo::Hidden; }
+	bool is_selected() const { return _presentation_info.flags() & PresentationInfo::Selected; }
+
+	PresentationInfo const & presentation_info () const { return _presentation_info; }
+	PresentationInfo& presentation_info () { return _presentation_info; }
+
+	/* set just the order */
+
+	void  set_presentation_order (PresentationInfo::order_t, bool notify_class_listeners = true);
+
+	struct PresentationOrderSorter {
+		bool operator() (boost::shared_ptr<Stripable> a, boost::shared_ptr<Stripable> b) {
+			return a->presentation_info().order() < b->presentation_info().order();
+		}
+	};
+
+	/* gui's call this for their own purposes. */
+
+	PBD::Signal2<void,std::string,void*> gui_changed;
+
+	/***************************************************************
+	 * Pure interface begins here
+	 ***************************************************************/
+
+	virtual boost::shared_ptr<PeakMeter>       peak_meter() = 0;
+	virtual boost::shared_ptr<const PeakMeter> peak_meter() const = 0;
+
+	virtual boost::shared_ptr<GainControl> gain_control() const = 0;
+
+	virtual boost::shared_ptr<SoloControl> solo_control() const = 0;
+	virtual boost::shared_ptr<SoloIsolateControl> solo_isolate_control() const = 0;
+	virtual boost::shared_ptr<SoloSafeControl> solo_safe_control() const = 0;
+	virtual boost::shared_ptr<MuteControl> mute_control() const = 0;
+
+	virtual boost::shared_ptr<PhaseControl> phase_control() const = 0;
+	virtual boost::shared_ptr<GainControl> trim_control() const = 0;
+
+	virtual boost::shared_ptr<MonitorControl> monitoring_control() const = 0;
+
+	virtual boost::shared_ptr<AutomationControl> rec_enable_control() const { return boost::shared_ptr<AutomationControl>(); }
+	virtual boost::shared_ptr<AutomationControl> rec_safe_control() const { return boost::shared_ptr<AutomationControl>(); }
+
+	/* "well-known" controls for panning. Any or all of these may return
+	 * null.
+	 */
+	virtual boost::shared_ptr<AutomationControl> pan_azimuth_control() const = 0;
+	virtual boost::shared_ptr<AutomationControl> pan_elevation_control() const = 0;
+	virtual boost::shared_ptr<AutomationControl> pan_width_control() const = 0;
+	virtual boost::shared_ptr<AutomationControl> pan_frontback_control() const = 0;
+	virtual boost::shared_ptr<AutomationControl> pan_lfe_control() const = 0;
+
+	/* "well-known" controls for an EQ in this route. Any or all may
+	 * be null. eq_band_cnt() must return 0 if there is no EQ present.
+	 * Passing an @param band value >= eq_band_cnt() will guarantee the
+	 * return of a null ptr (or an empty string for eq_band_name()).
+	 */
+	virtual uint32_t eq_band_cnt () const = 0;
+	virtual std::string eq_band_name (uint32_t) const = 0;
+	virtual boost::shared_ptr<AutomationControl> eq_gain_controllable (uint32_t band) const = 0;
+	virtual boost::shared_ptr<AutomationControl> eq_freq_controllable (uint32_t band) const = 0;
+	virtual boost::shared_ptr<AutomationControl> eq_q_controllable (uint32_t band) const = 0;
+	virtual boost::shared_ptr<AutomationControl> eq_shape_controllable (uint32_t band) const = 0;
+	virtual boost::shared_ptr<AutomationControl> eq_enable_controllable () const = 0;
+	virtual boost::shared_ptr<AutomationControl> eq_hpf_controllable () const = 0;
+
+	/* "well-known" controls for a compressor in this route. Any or all may
+	 * be null.
+	 */
+	virtual boost::shared_ptr<AutomationControl> comp_enable_controllable () const = 0;
+	virtual boost::shared_ptr<AutomationControl> comp_threshold_controllable () const = 0;
+	virtual boost::shared_ptr<AutomationControl> comp_speed_controllable () const = 0;
+	virtual boost::shared_ptr<AutomationControl> comp_mode_controllable () const = 0;
+	virtual boost::shared_ptr<AutomationControl> comp_makeup_controllable () const = 0;
+	virtual boost::shared_ptr<AutomationControl> comp_redux_controllable () const = 0;
+
+	/* @param mode must be supplied by the comp_mode_controllable(). All other values
+	 * result in undefined behaviour
+	 */
+	virtual std::string comp_mode_name (uint32_t mode) const = 0;
+
+	/* @param mode - as for comp mode name. This returns the name for the
+	 * parameter/control accessed via comp_speed_controllable(), which can
+	 * be mode dependent.
+	 */
+	virtual std::string comp_speed_name (uint32_t mode) const = 0;
+
+	/* "well-known" controls for sends to well-known busses in this route. Any or all may
+	 * be null.
+	 *
+	 * In Mixbus, these are the sends that connect to the mixbusses.
+	 * In Ardour, these are user-created sends that connect to user-created
+	 * Aux busses.
+	 */
+	virtual boost::shared_ptr<AutomationControl> send_level_controllable (uint32_t n) const = 0;
+	virtual boost::shared_ptr<AutomationControl> send_enable_controllable (uint32_t n) const = 0;
+
+	/* for the same value of @param n, this returns the name of the send
+	 * associated with the pair of controllables returned by the above two methods.
+	 */
+	virtual std::string send_name (uint32_t n) const = 0;
+
+	/* well known control that enables/disables sending to the master bus.
+	 *
+	 * In Ardour, this returns null.
+	 * In Mixbus, it will return a suitable control, or null depending on
+	 * the route.
+	 */
+	virtual boost::shared_ptr<AutomationControl> master_send_enable_controllable () const = 0;
+
+	virtual bool muted_by_others_soloing () const = 0;
+
+	virtual boost::shared_ptr<MonitorProcessor> monitor_control() const = 0;
+
+  protected:
+	PresentationInfo _presentation_info;
+};
+
+}
+
+#endif /* __libardour_stripable_h__ */
diff --git a/libs/ardour/ardour/tempo.h b/libs/ardour/ardour/tempo.h
index bb22a79..1db1f65 100644
--- a/libs/ardour/ardour/tempo.h
+++ b/libs/ardour/ardour/tempo.h
@@ -27,15 +27,17 @@
 #include <glibmm/threads.h>
 
 #include "pbd/undo.h"
+
 #include "pbd/stateful.h"
 #include "pbd/statefuldestructible.h"
 
-#include "evoral/types.hpp"
+#include "evoral/Beats.hpp"
 
 #include "ardour/ardour.h"
 
 class BBTTest;
 class FrameposPlusBeatsTest;
+class FrameposMinusBeatsTest;
 class TempoTest;
 class XMLNode;
 
@@ -47,14 +49,29 @@ class TempoMap;
 /** Tempo, the speed at which musical time progresses (BPM). */
 class LIBARDOUR_API Tempo {
   public:
+	/**
+	 * @param bpm Beats Per Minute
+	 * @param type Note Type (default `4': quarter note)
+	 */
 	Tempo (double bpm, double type=4.0) // defaulting to quarter note
 		: _beats_per_minute (bpm), _note_type(type) {}
 
-	double beats_per_minute () const { return _beats_per_minute;}
-	double note_type () const { return _note_type;}
+	/* ..or more aptly 'pulse divisions per minute'.
+	   Nothing to do with actual beats, which are defined by the meter and tempo.
+	*/
+	double beats_per_minute () const { return _beats_per_minute; }
+	void set_beats_per_minute (double bpm) { _beats_per_minute = bpm; }
+	double note_type () const { return _note_type; }
+	double pulses_per_minute () const { return _beats_per_minute / _note_type; }
+	/** audio samples per beat
+	 * @param sr samplerate
+	 */
 	double frames_per_beat (framecnt_t sr) const {
 		return (60.0 * sr) / _beats_per_minute;
 	}
+	double frames_per_pulse (framecnt_t sr) const {
+		return (_note_type * 60.0 * sr) / _beats_per_minute;
+	}
 
   protected:
 	double _beats_per_minute;
@@ -89,26 +106,21 @@ class LIBARDOUR_API Meter {
 /** A section of timeline with a certain Tempo or Meter. */
 class LIBARDOUR_API MetricSection {
   public:
-	MetricSection (const Timecode::BBT_Time& start)
-		: _start (start), _frame (0), _movable (true) {}
-	MetricSection (framepos_t start)
-		: _frame (start), _movable (true) {}
+	MetricSection (double pulse, framepos_t frame, PositionLockStyle pls, bool is_tempo)
+		: _pulse (pulse), _frame (frame), _movable (true), _position_lock_style (pls), _is_tempo (is_tempo) {}
 
 	virtual ~MetricSection() {}
 
-	const Timecode::BBT_Time& start() const { return _start; }
-	framepos_t                frame() const { return _frame; }
-
-	void set_movable (bool yn) { _movable = yn; }
-	bool movable() const { return _movable; }
+	const double& pulse () const { return _pulse; }
+	void set_pulse (double pulse) { _pulse = pulse; }
 
+	framepos_t frame() const { return _frame; }
 	virtual void set_frame (framepos_t f) {
 		_frame = f;
 	}
 
-	virtual void set_start (const Timecode::BBT_Time& w) {
-		_start = w;
-	}
+	void set_movable (bool yn) { _movable = yn; }
+	bool movable() const { return _movable; }
 
 	/* MeterSections are not stateful in the full sense,
 	   but we do want them to control their own
@@ -116,44 +128,108 @@ class LIBARDOUR_API MetricSection {
 	*/
 	virtual XMLNode& get_state() const = 0;
 
-  private:
-	Timecode::BBT_Time _start;
+	PositionLockStyle position_lock_style () const { return _position_lock_style; }
+	void set_position_lock_style (PositionLockStyle ps) { _position_lock_style = ps; }
+	bool is_tempo () const { return _is_tempo; }
+
+private:
+	double             _pulse;
 	framepos_t         _frame;
 	bool               _movable;
+	PositionLockStyle  _position_lock_style;
+	const bool         _is_tempo;
 };
 
 /** A section of timeline with a certain Meter. */
 class LIBARDOUR_API MeterSection : public MetricSection, public Meter {
   public:
-	MeterSection (const Timecode::BBT_Time& start, double bpb, double note_type)
-		: MetricSection (start), Meter (bpb, note_type) {}
-	MeterSection (framepos_t start, double bpb, double note_type)
-		: MetricSection (start), Meter (bpb, note_type) {}
+	MeterSection (double pulse, framepos_t frame, double beat, const Timecode::BBT_Time& bbt, double bpb, double note_type, PositionLockStyle pls)
+		: MetricSection (pulse, frame, pls, false), Meter (bpb, note_type), _bbt (bbt),  _beat (beat) {}
+
 	MeterSection (const XMLNode&);
 
 	static const std::string xml_state_node_name;
 
 	XMLNode& get_state() const;
+
+	void set_beat (std::pair<double, Timecode::BBT_Time>& w) {
+		_beat = w.first;
+		_bbt = w.second;
+	}
+
+	const Timecode::BBT_Time& bbt() const { return _bbt; }
+        const double& beat () const { return _beat; }
+	void set_beat (double beat) { _beat = beat; }
+
+private:
+	Timecode::BBT_Time _bbt;
+	double _beat;
 };
 
 /** A section of timeline with a certain Tempo. */
 class LIBARDOUR_API TempoSection : public MetricSection, public Tempo {
   public:
-	TempoSection (const Timecode::BBT_Time& start, double qpm, double note_type)
-		: MetricSection (start), Tempo (qpm, note_type), _bar_offset (-1.0)  {}
-	TempoSection (framepos_t start, double qpm, double note_type)
-		: MetricSection (start), Tempo (qpm, note_type), _bar_offset (-1.0) {}
+	enum Type {
+		Ramp,
+		Constant,
+	};
+
+	TempoSection (const double& pulse, const framepos_t& frame, double qpm, double note_type, Type tempo_type, PositionLockStyle pls)
+		: MetricSection (pulse, frame, pls, true), Tempo (qpm, note_type), _type (tempo_type), _c_func (0.0), _active (true), _locked_to_meter (false)  {}
+
 	TempoSection (const XMLNode&);
 
 	static const std::string xml_state_node_name;
 
 	XMLNode& get_state() const;
 
-	void update_bar_offset_from_bbt (const Meter&);
-	void update_bbt_time_from_bar_offset (const Meter&);
-	double bar_offset() const { return _bar_offset; }
+	double c_func () const { return _c_func; }
+	void set_c_func (double c_func) { _c_func = c_func; }
+
+	void set_type (Type type);
+	Type type () const { return _type; }
+
+	bool active () const { return _active; }
+	void set_active (bool yn) { _active = yn; }
+
+	bool locked_to_meter ()  const { return _locked_to_meter; }
+	void set_locked_to_meter (bool yn) { _locked_to_meter = yn; }
+
+	double tempo_at_frame (const framepos_t& frame, const framecnt_t& frame_rate) const;
+	framepos_t frame_at_tempo (const double& ppm, const double& beat, const framecnt_t& frame_rate) const;
+
+	double tempo_at_pulse (const double& pulse) const;
+	double pulse_at_tempo (const double& ppm, const framepos_t& frame, const framecnt_t& frame_rate) const;
+
+	double pulse_at_frame (const framepos_t& frame, const framepos_t& frame_rate) const;
+	framepos_t frame_at_pulse (const double& pulse, const framecnt_t& frame_rate) const;
+
+	double compute_c_func_pulse (const double& end_bpm, const double& end_pulse, const framecnt_t& frame_rate);
+	double compute_c_func_frame (const double& end_bpm, const framepos_t& end_frame, const framecnt_t& frame_rate) const;
+
+	Timecode::BBT_Time legacy_bbt () { return _legacy_bbt; }
 
   private:
+
+	framepos_t minute_to_frame (const double& time, const framecnt_t& frame_rate) const;
+	double frame_to_minute (const framepos_t& frame, const framecnt_t& frame_rate) const;
+
+	/*  tempo ramp functions. zero-based with time in minutes,
+	 * 'tick tempo' in ticks per minute and tempo in bpm.
+	 *  time relative to section start.
+	 */
+	double a_func (double end_tpm, double c_func) const;
+	double c_func (double end_tpm, double end_time) const;
+
+	double pulse_tempo_at_time (const double& time) const;
+	double time_at_pulse_tempo (const double& pulse_tempo) const;
+
+	double pulse_tempo_at_pulse (const double& pulse) const;
+	double pulse_at_pulse_tempo (const double& pulse_tempo) const;
+
+	double pulse_at_time (const double& time) const;
+	double time_at_pulse (const double& pulse) const;
+
 	/* this value provides a fractional offset into the bar in which
 	   the tempo section is located in. A value of 0.0 indicates that
 	   it occurs on the first beat of the bar, a value of 0.5 indicates
@@ -162,7 +238,11 @@ class LIBARDOUR_API TempoSection : public MetricSection, public Tempo {
 	   this enables us to keep the tempo change at the same relative
 	   position within the bar if/when the meter changes.
 	*/
-	double _bar_offset;
+	Type _type;
+	double _c_func;
+	bool _active;
+	bool _locked_to_meter;
+	Timecode::BBT_Time _legacy_bbt;
 };
 
 typedef std::list<MetricSection*> Metrics;
@@ -178,7 +258,7 @@ class LIBARDOUR_API TempoMetric {
 	void set_tempo (const Tempo& t)              { _tempo = &t; }
 	void set_meter (const Meter& m)              { _meter = &m; }
 	void set_frame (framepos_t f)                { _frame = f; }
-	void set_start (const Timecode::BBT_Time& t) { _start = t; }
+	void set_pulse (const double& p)             { _pulse = p; }
 
 	void set_metric (const MetricSection* section) {
 		const MeterSection* meter;
@@ -189,22 +269,25 @@ class LIBARDOUR_API TempoMetric {
 			set_tempo(*tempo);
 		}
 
-		set_frame(section->frame());
-		set_start(section->start());
+		set_frame (section->frame());
+		set_pulse (section->pulse());
 	}
 
 	const Meter&              meter() const { return *_meter; }
 	const Tempo&              tempo() const { return *_tempo; }
 	framepos_t                frame() const { return _frame; }
-	const Timecode::BBT_Time& start() const { return _start; }
+	const double&             pulse() const { return _pulse; }
 
   private:
 	const Meter*       _meter;
 	const Tempo*       _tempo;
 	framepos_t         _frame;
-	Timecode::BBT_Time _start;
+	double             _pulse;
 };
 
+/** Tempo Map - mapping of timecode to musical time.
+ * convert audio-samples, sample-rate to Bar/Beat/Tick, Meter/Tempo
+ */
 class LIBARDOUR_API TempoMap : public PBD::StatefulDestructible
 {
   public:
@@ -220,14 +303,15 @@ class LIBARDOUR_API TempoMap : public PBD::StatefulDestructible
 
 	struct BBTPoint {
 		framepos_t          frame;
-		const MeterSection* meter;
-		const TempoSection* tempo;
+		Meter               meter;
+		Tempo               tempo;
+		double              c;
 		uint32_t            bar;
 		uint32_t            beat;
 
-		BBTPoint (const MeterSection& m, const TempoSection& t, framepos_t f,
-		          uint32_t b, uint32_t e)
-			: frame (f), meter (&m), tempo (&t), bar (b), beat (e) {}
+		BBTPoint (const MeterSection& m, const Tempo& t, framepos_t f,
+		          uint32_t b, uint32_t e, double func_c)
+		: frame (f), meter (m.divisions_per_bar(), m.note_divisor()), tempo (t.beats_per_minute(), t.note_type()), c (func_c), bar (b), beat (e) {}
 
 		Timecode::BBT_Time bbt() const { return Timecode::BBT_Time (bar, beat, 0); }
 		operator Timecode::BBT_Time() const { return bbt(); }
@@ -235,19 +319,83 @@ class LIBARDOUR_API TempoMap : public PBD::StatefulDestructible
 		bool is_bar() const { return beat == 1; }
 	};
 
-	typedef std::vector<BBTPoint> BBTPointList;
-
 	template<class T> void apply_with_metrics (T& obj, void (T::*method)(const Metrics&)) {
 		Glib::Threads::RWLock::ReaderLock lm (lock);
-		(obj.*method)(metrics);
+		(obj.*method)(_metrics);
 	}
 
-	void get_grid (BBTPointList::const_iterator&, BBTPointList::const_iterator&,
+	void get_grid (std::vector<BBTPoint>&,
 	               framepos_t start, framepos_t end);
 
+	static const Tempo& default_tempo() { return _default_tempo; }
+	static const Meter& default_meter() { return _default_meter; }
+
+	/* because tempos may be ramped, this is only valid for the instant requested.*/
+	double frames_per_beat_at (const framepos_t&, const framecnt_t& sr) const;
+
+	const TempoSection& tempo_section_at_frame (framepos_t frame) const;
+	const MeterSection& meter_section_at_frame (framepos_t frame) const;
+	const MeterSection& meter_section_at_beat (double beat) const;
+
+	/** add a tempo section locked to pls. ignored values will be set in recompute_tempi()
+	 * @param pulse pulse position of new section. ignored if pls == AudioTime
+	 * @param frame frame position of new section. ignored if pls == MusicTime
+	 * @param type type of new tempo section (Ramp, Constant)
+	 */
+	TempoSection* add_tempo (const Tempo&, const double& pulse, const framepos_t& frame, TempoSection::Type type, PositionLockStyle pls);
+
+	/** add an meter section locked to pls.. ignored values will be set in recompute_meters()
+	 * @param beat beat position of new section
+	 * @param where bbt position of new section
+	 * @param frame frame position of new section. ignored if pls == MusicTime
+	 */
+	MeterSection* add_meter (const Meter&, const double& beat, const Timecode::BBT_Time& where, const framepos_t& frame, PositionLockStyle pls);
+
+	void remove_tempo (const TempoSection&, bool send_signal);
+	void remove_meter (const MeterSection&, bool send_signal);
+
+	void replace_tempo (const TempoSection&, const Tempo&, const double& pulse, const framepos_t& frame
+			    , TempoSection::Type type, PositionLockStyle pls);
+
+	void replace_meter (const MeterSection&, const Meter&, const Timecode::BBT_Time& where, const framepos_t& frame
+			    , PositionLockStyle pls);
+
+	framepos_t round_to_bar  (framepos_t frame, RoundMode dir);
+	framepos_t round_to_beat (framepos_t frame, RoundMode dir);
+	framepos_t round_to_beat_subdivision (framepos_t fr, int sub_num, RoundMode dir);
+
+	void set_length (framepos_t frames);
+
+	XMLNode& get_state (void);
+	int set_state (const XMLNode&, int version);
+
+	void dump (const Metrics& metrics, std::ostream&) const;
+	void clear ();
+
+	TempoMetric metric_at (Timecode::BBT_Time bbt) const;
+
+	/** Return the TempoMetric at frame @p t, and point @p last to the latest
+	 * metric change <= t, if it is non-NULL.
+	 */
+	TempoMetric metric_at (framepos_t, Metrics::const_iterator* last=NULL) const;
+
+	Metrics::const_iterator metrics_end() { return _metrics.end(); }
+
+	void change_existing_tempo_at (framepos_t, double bpm, double note_type);
+	void change_initial_tempo (double bpm, double note_type);
+
+	void insert_time (framepos_t, framecnt_t);
+	bool remove_time (framepos_t where, framecnt_t amount);  //returns true if anything was moved
+
+	int n_tempos () const;
+	int n_meters () const;
+
+	framecnt_t frame_rate () const { return _frame_rate; }
+
 	/* TEMPO- AND METER-SENSITIVE FUNCTIONS
 
-	   bbt_time(), bbt_time_rt(), frame_time() and bbt_duration_at()
+	   bbt_at_frame(), frame_at_bbt(), beat_at_frame(), frame_at_beat(), tempo_at_beat()
+	   and bbt_duration_at()
 	   are all sensitive to tempo and meter, and will give answers
 	   that align with the grid formed by tempo and meter sections.
 
@@ -255,14 +403,34 @@ class LIBARDOUR_API TempoMap : public PBD::StatefulDestructible
 	   whose location is canonically defined in beats.
 	*/
 
-	void bbt_time (framepos_t when, Timecode::BBT_Time&);
+	double beat_at_frame (const framecnt_t& frame) const;
+	framepos_t frame_at_beat (const double& beat) const;
+
+	Tempo tempo_at_frame (const framepos_t& frame) const;
+	framepos_t frame_at_tempo (const Tempo& tempo) const;
+
+	Tempo tempo_at_beat (const double& beat) const;
+
+	const Meter& meter_at_frame (framepos_t) const;
+
+	/* you probably only need to use pulses when moving tempos */
+	double pulse_at_beat (const double& beat) const;
+	double beat_at_pulse (const double& pulse) const;
+
+	double pulse_at_frame (const framecnt_t& frame) const;
+	framepos_t frame_at_pulse (const double& pulse) const;
+
+	/* bbt - it's nearly always better to use beats.*/
+	Timecode::BBT_Time bbt_at_frame (framepos_t when);
+	Timecode::BBT_Time bbt_at_frame_rt (framepos_t when);
+	framepos_t frame_at_bbt (const Timecode::BBT_Time&);
+
+	double beat_at_bbt (const Timecode::BBT_Time& bbt);
+	Timecode::BBT_Time bbt_at_beat (const double& beats);
+
+	double pulse_at_bbt (const Timecode::BBT_Time& bbt);
+	Timecode::BBT_Time bbt_at_pulse (const double& pulse);
 
-	/* realtime safe variant of ::bbt_time(), will throw
-	   std::logic_error if the map is not large enough
-	   to provide an answer.
-	*/
-	void       bbt_time_rt (framepos_t when, Timecode::BBT_Time&);
-	framepos_t frame_time (const Timecode::BBT_Time&);
 	framecnt_t bbt_duration_at (framepos_t, const Timecode::BBT_Time&, int dir);
 
 	/* TEMPO-SENSITIVE FUNCTIONS
@@ -280,85 +448,75 @@ class LIBARDOUR_API TempoMap : public PBD::StatefulDestructible
 	framepos_t framepos_minus_beats (framepos_t, Evoral::Beats) const;
 	Evoral::Beats framewalk_to_beats (framepos_t pos, framecnt_t distance) const;
 
-	static const Tempo& default_tempo() { return _default_tempo; }
-	static const Meter& default_meter() { return _default_meter; }
+	void gui_move_tempo (TempoSection*, const framepos_t& frame, const int& sub_num);
+	void gui_move_meter (MeterSection*, const framepos_t& frame);
+	bool gui_change_tempo (TempoSection*, const Tempo& bpm);
+	void gui_dilate_tempo (TempoSection* tempo, const framepos_t& frame, const framepos_t& end_frame, const double& pulse);
 
-	const Tempo& tempo_at (framepos_t) const;
-	const Meter& meter_at (framepos_t) const;
+	double exact_beat_at_frame (const framepos_t& frame, const int32_t sub_num);
 
-	const TempoSection& tempo_section_at (framepos_t) const;
-	const MeterSection& meter_section_at (framepos_t) const;
+	std::pair<double, framepos_t> predict_tempo_position (TempoSection* section, const Timecode::BBT_Time& bbt);
+	bool can_solve_bbt (TempoSection* section, const Timecode::BBT_Time& bbt);
 
-	void add_tempo (const Tempo&, Timecode::BBT_Time where);
-	void add_meter (const Meter&, Timecode::BBT_Time where);
+	PBD::Signal0<void> MetricPositionChanged;
+	void fix_legacy_session();
 
-	void remove_tempo (const TempoSection&, bool send_signal);
-	void remove_meter (const MeterSection&, bool send_signal);
+private:
 
-	void replace_tempo (const TempoSection&, const Tempo&, const Timecode::BBT_Time& where);
-	void replace_meter (const MeterSection&, const Meter&, const Timecode::BBT_Time& where);
+	double beat_at_frame_locked (const Metrics& metrics, const framecnt_t& frame) const;
+	framepos_t frame_at_beat_locked (const Metrics& metrics, const double& beat) const;
 
-	framepos_t round_to_bar  (framepos_t frame, RoundMode dir);
-	framepos_t round_to_beat (framepos_t frame, RoundMode dir);
-	framepos_t round_to_beat_subdivision (framepos_t fr, int sub_num, RoundMode dir);
+	double pulse_at_beat_locked (const Metrics& metrics, const double& beat) const;
+	double beat_at_pulse_locked (const Metrics& metrics, const double& pulse) const;
 
-	void set_length (framepos_t frames);
+	double pulse_at_frame_locked (const Metrics& metrics, const framepos_t& frame) const;
+	framepos_t frame_at_pulse_locked (const Metrics& metrics, const double& pulse) const;
 
-	XMLNode& get_state (void);
-	int set_state (const XMLNode&, int version);
-
-	void dump (std::ostream&) const;
-	void clear ();
+	Tempo tempo_at_frame_locked (const Metrics& metrics, const framepos_t& frame) const;
+	framepos_t frame_at_tempo_locked (const Metrics& metrics, const Tempo& tempo) const;
 
-	TempoMetric metric_at (Timecode::BBT_Time bbt) const;
+	Timecode::BBT_Time bbt_at_frame_locked (const Metrics& metrics, const framepos_t& frame) const;
+	framepos_t frame_at_bbt_locked (const Metrics& metrics, const Timecode::BBT_Time&) const;
 
-	/** Return the TempoMetric at frame @p t, and point @p last to the latest
-	 * metric change <= t, if it is non-NULL.
-	 */
-	TempoMetric metric_at (framepos_t, Metrics::const_iterator* last=NULL) const;
+	double beat_at_bbt_locked (const Metrics& metrics, const Timecode::BBT_Time& bbt) const ;
+	Timecode::BBT_Time bbt_at_beat_locked (const Metrics& metrics, const double& beats) const;
 
-	Metrics::const_iterator metrics_end() { return metrics.end(); }
+	double pulse_at_bbt_locked (const Metrics& metrics, const Timecode::BBT_Time& bbt) const;
+	Timecode::BBT_Time bbt_at_pulse_locked (const Metrics& metrics, const double& pulse) const;
 
-	void change_existing_tempo_at (framepos_t, double bpm, double note_type);
-	void change_initial_tempo (double bpm, double note_type);
+	const TempoSection& tempo_section_at_frame_locked (const Metrics& metrics, framepos_t frame) const;
+	const TempoSection& tempo_section_at_beat_locked (const Metrics& metrics, const double& beat) const;
 
-	void insert_time (framepos_t, framecnt_t);
-	bool remove_time (framepos_t where, framecnt_t amount);  //returns true if anything was moved
+	const MeterSection& meter_section_at_frame_locked (const Metrics& metrics, framepos_t frame) const;
+	const MeterSection& meter_section_at_beat_locked (const Metrics& metrics, const double& beat) const;
 
-	int n_tempos () const;
-	int n_meters () const;
+	bool check_solved (const Metrics& metrics) const;
+	bool set_active_tempos (const Metrics& metrics, const framepos_t& frame);
 
-	framecnt_t frame_rate () const { return _frame_rate; }
+	bool solve_map_frame (Metrics& metrics, TempoSection* section, const framepos_t& frame);
+	bool solve_map_pulse (Metrics& metrics, TempoSection* section, const double& pulse);
+	bool solve_map_frame (Metrics& metrics, MeterSection* section, const framepos_t& frame);
+	bool solve_map_bbt (Metrics& metrics, MeterSection* section, const Timecode::BBT_Time& bbt);
 
-  private:
+	double exact_beat_at_frame_locked (const Metrics& metrics, const framepos_t& frame, const int32_t sub_num);
 
 	friend class ::BBTTest;
 	friend class ::FrameposPlusBeatsTest;
+	friend class ::FrameposMinusBeatsTest;
 	friend class ::TempoTest;
 
 	static Tempo    _default_tempo;
 	static Meter    _default_meter;
 
-	Metrics                       metrics;
+	Metrics                       _metrics;
 	framecnt_t                    _frame_rate;
 	mutable Glib::Threads::RWLock lock;
-	BBTPointList                  _map;
-
-	void recompute_map (bool reassign_tempo_bbt, framepos_t end = -1);
-	void extend_map (framepos_t end);
-	void require_map_to (framepos_t pos);
-	void require_map_to (const Timecode::BBT_Time&);
-	void _extend_map (TempoSection* tempo, MeterSection* meter,
-	                  Metrics::iterator next_metric,
-	                  Timecode::BBT_Time current, framepos_t current_frame, framepos_t end);
 
-	BBTPointList::const_iterator bbt_before_or_at (framepos_t);
-	BBTPointList::const_iterator bbt_before_or_at (const Timecode::BBT_Time&);
-	BBTPointList::const_iterator bbt_after_or_at (framepos_t);
+	void recompute_tempi (Metrics& metrics);
+	void recompute_meters (Metrics& metrics);
+	void recompute_map (Metrics& metrics, framepos_t end = -1);
 
 	framepos_t round_to_type (framepos_t fr, RoundMode dir, BBTPointType);
-	void bbt_time (framepos_t, Timecode::BBT_Time&, const BBTPointList::const_iterator&);
-	framecnt_t bbt_duration_at_unlocked (const Timecode::BBT_Time& when, const Timecode::BBT_Time& bbt, int dir);
 
 	const MeterSection& first_meter() const;
 	MeterSection&       first_meter();
@@ -367,12 +525,17 @@ class LIBARDOUR_API TempoMap : public PBD::StatefulDestructible
 
 	void do_insert (MetricSection* section);
 
-	void add_tempo_locked (const Tempo&, Timecode::BBT_Time where, bool recompute);
-	void add_meter_locked (const Meter&, Timecode::BBT_Time where, bool recompute);
+	TempoSection* add_tempo_locked (const Tempo&, double pulse, framepos_t frame
+			       , TempoSection::Type type, PositionLockStyle pls, bool recompute, bool locked_to_meter = false);
+
+	MeterSection* add_meter_locked (const Meter&, double beat, const Timecode::BBT_Time& where, framepos_t frame
+					, PositionLockStyle pls, bool recompute);
 
 	bool remove_tempo_locked (const TempoSection&);
 	bool remove_meter_locked (const MeterSection&);
 
+	TempoSection* copy_metrics_and_point (const Metrics& metrics, Metrics& copy, TempoSection* section);
+	MeterSection* copy_metrics_and_point (const Metrics& metrics, Metrics& copy, MeterSection* section);
 };
 
 }; /* namespace ARDOUR */
diff --git a/libs/ardour/ardour/thread_buffers.h b/libs/ardour/ardour/thread_buffers.h
index f018ee4..598d8f3 100644
--- a/libs/ardour/ardour/thread_buffers.h
+++ b/libs/ardour/ardour/thread_buffers.h
@@ -39,6 +39,7 @@ public:
 
 	BufferSet* silent_buffers;
 	BufferSet* scratch_buffers;
+	BufferSet* noinplace_buffers;
 	BufferSet* route_buffers;
 	BufferSet* mix_buffers;
 	gain_t*    gain_automation_buffer;
diff --git a/libs/ardour/ardour/track.h b/libs/ardour/ardour/track.h
index ee05666..243d40f 100644
--- a/libs/ardour/ardour/track.h
+++ b/libs/ardour/ardour/track.h
@@ -22,6 +22,7 @@
 #include <boost/shared_ptr.hpp>
 
 #include "ardour/interthread_info.h"
+#include "ardour/recordable.h"
 #include "ardour/route.h"
 #include "ardour/public_diskstream.h"
 
@@ -34,11 +35,19 @@ class Source;
 class Region;
 class Diskstream;
 class IO;
-
-class LIBARDOUR_API Track : public Route, public PublicDiskstream
+class MonitorControl;
+class RecordEnableControl;
+class RecordSafeControl;
+
+/** A track is an route (bus) with a recordable diskstream and
+ * related objects relevant to tracking, playback and editing.
+ *
+ * Specifically a track has regions and playlist objects.
+ */
+class LIBARDOUR_API Track : public Route, public Recordable, public PublicDiskstream
 {
   public:
-	Track (Session&, std::string name, Route::Flag f = Route::Flag (0), TrackMode m = Normal, DataType default_type = DataType::AUDIO);
+	Track (Session&, std::string name, PresentationInfo::Flag f = PresentationInfo::Flag (0), TrackMode m = Normal, DataType default_type = DataType::AUDIO);
 	virtual ~Track ();
 
 	int init ();
@@ -51,23 +60,9 @@ class LIBARDOUR_API Track : public Route, public PublicDiskstream
 	virtual bool can_use_mode (TrackMode /*m*/, bool& /*bounce_required*/) { return false; }
 	PBD::Signal0<void> TrackModeChanged;
 
-	class LIBARDOUR_API MonitoringControllable : public RouteAutomationControl {
-	public:
-		MonitoringControllable (std::string name, boost::shared_ptr<Track>);
-		void set_value (double, PBD::Controllable::GroupControlDisposition group_override);
-		/* currently no automation, so no need for set_value_unchecked() */
-		double get_value () const;
-	private:
-		void _set_value (double, PBD::Controllable::GroupControlDisposition group_override);
-	};
-
-	void set_monitoring (MonitorChoice, PBD::Controllable::GroupControlDisposition group_override);
-	MonitorChoice monitoring_choice() const { return _monitoring; }
-        MonitorState monitoring_state () const;
-	PBD::Signal0<void> MonitoringChanged;
-
-	boost::shared_ptr<AutomationControl> monitoring_control() const { return _monitoring_control; }
+	boost::shared_ptr<MonitorControl> monitoring_control() const { return _monitoring_control; }
 
+	MonitorState monitoring_state () const;
 	MeterState metering_state () const;
 
 	virtual int no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame,
@@ -102,11 +97,32 @@ class LIBARDOUR_API Track : public Route, public PublicDiskstream
 	virtual void freeze_me (InterThreadInfo&) = 0;
 	virtual void unfreeze () = 0;
 
-	/** @return true if the track can be bounced, or false otherwise.
+	/** Test if the track can be bounced with the given settings.
+	 * If sends/inserts/returns are present in the signal path or the given track
+	 * has no audio outputs bouncing is not possible.
+	 *
+	 * @param endpoint the processor to tap the signal off (or nil for the top)
+	 * @param include_endpoint include the given processor in the bounced audio.
+	 * @return true if the track can be bounced, or false otherwise.
 	 */
 	virtual bool bounceable (boost::shared_ptr<Processor> endpoint, bool include_endpoint) const = 0;
-	virtual boost::shared_ptr<Region> bounce (InterThreadInfo&) = 0;
-	virtual boost::shared_ptr<Region> bounce_range (framepos_t start, framepos_t end, InterThreadInfo&,
+
+	/** bounce track from session start to session end to new region
+	 *
+	 * @param itt asynchronous progress report and cancel
+	 * @return a new audio region (or nil in case of error)
+	 */
+	virtual boost::shared_ptr<Region> bounce (InterThreadInfo& itt) = 0;
+
+	/** Bounce the given range to a new audio region.
+	 * @param start start time (in samples)
+	 * @param end end time (in samples)
+	 * @param itt asynchronous progress report and cancel
+	 * @param endpoint the processor to tap the signal off (or nil for the top)
+	 * @param include_endpoint include the given processor in the bounced audio.
+	 * @return a new audio region (or nil in case of error)
+	 */
+	virtual boost::shared_ptr<Region> bounce_range (framepos_t start, framepos_t end, InterThreadInfo& itt,
 							boost::shared_ptr<Processor> endpoint, bool include_endpoint) = 0;
 	virtual int export_stuff (BufferSet& bufs, framepos_t start_frame, framecnt_t nframes,
 				  boost::shared_ptr<Processor> endpoint, bool include_endpoint, bool for_export, bool for_freeze) = 0;
@@ -116,13 +132,12 @@ class LIBARDOUR_API Track : public Route, public PublicDiskstream
 	virtual int set_state (const XMLNode&, int version);
 	static void zero_diskstream_id_in_xml (XMLNode&);
 
-	boost::shared_ptr<AutomationControl> rec_enable_control() { return _rec_enable_control; }
+	boost::shared_ptr<AutomationControl> rec_enable_control() const { return _record_enable_control; }
+	boost::shared_ptr<AutomationControl> rec_safe_control() const { return _record_safe_control; }
 
-	bool record_enabled() const;
-	bool record_safe () const;
-	void set_record_enabled (bool yn, PBD::Controllable::GroupControlDisposition);
-	void set_record_safe (bool yn, PBD::Controllable::GroupControlDisposition);
-	void prep_record_enabled (bool yn, PBD::Controllable::GroupControlDisposition);
+	int prep_record_enabled (bool);
+	bool can_be_record_enabled ();
+	bool can_be_record_safe ();
 
 	bool using_diskstream_id (PBD::ID) const;
 
@@ -178,8 +193,6 @@ class LIBARDOUR_API Track : public Route, public PublicDiskstream
 	PBD::Signal0<void> FreezeChange;
 	/* Emitted when our diskstream is set to use a different playlist */
 	PBD::Signal0<void> PlaylistChanged;
-	PBD::Signal0<void> RecordEnableChanged;
-	PBD::Signal0<void> RecordSafeChanged;
 	PBD::Signal0<void> SpeedChanged;
 	PBD::Signal0<void> AlignmentStyleChanged;
 
@@ -190,8 +203,7 @@ class LIBARDOUR_API Track : public Route, public PublicDiskstream
 	MeterPoint    _saved_meter_point;
 	TrackMode     _mode;
 	bool          _needs_butler;
-	MonitorChoice _monitoring;
-	boost::shared_ptr<MonitoringControllable> _monitoring_control;
+	boost::shared_ptr<MonitorControl> _monitoring_control;
 
 	//private: (FIXME)
 	struct FreezeRecordProcessorInfo {
@@ -216,20 +228,6 @@ class LIBARDOUR_API Track : public Route, public PublicDiskstream
 		FreezeState                        state;
 	};
 
-	class RecEnableControl : public AutomationControl {
-	public:
-		RecEnableControl (boost::shared_ptr<Track> t);
-
-		void set_value (double, PBD::Controllable::GroupControlDisposition);
-		void set_value_unchecked (double);
-		double get_value (void) const;
-
-		boost::weak_ptr<Track> track;
-
-	private:
-		void _set_value (double, PBD::Controllable::GroupControlDisposition);
-	};
-
 	virtual void set_state_part_two () = 0;
 
 	FreezeRecord          _freeze_record;
@@ -238,17 +236,20 @@ class LIBARDOUR_API Track : public Route, public PublicDiskstream
 
 	void maybe_declick (BufferSet&, framecnt_t, int);
 
-	boost::shared_ptr<RecEnableControl> _rec_enable_control;
+	boost::shared_ptr<AutomationControl> _record_enable_control;
+	boost::shared_ptr<AutomationControl> _record_safe_control;
+
+	virtual void record_enable_changed (bool, PBD::Controllable::GroupControlDisposition);
+	virtual void record_safe_changed (bool, PBD::Controllable::GroupControlDisposition);
 
 	framecnt_t check_initial_delay (framecnt_t nframes, framepos_t&);
+	virtual void monitoring_changed (bool, PBD::Controllable::GroupControlDisposition);
 
 private:
 
 	virtual boost::shared_ptr<Diskstream> diskstream_factory (XMLNode const &) = 0;
 
 	void diskstream_playlist_changed ();
-	void diskstream_record_enable_changed ();
-	void diskstream_record_safe_changed ();
 	void diskstream_speed_changed ();
 	void diskstream_alignment_style_changed ();
 	void parameter_changed (std::string const & p);
diff --git a/libs/ardour/ardour/transient_detector.h b/libs/ardour/ardour/transient_detector.h
index 0e07c58..d29e124 100644
--- a/libs/ardour/ardour/transient_detector.h
+++ b/libs/ardour/ardour/transient_detector.h
@@ -37,10 +37,7 @@ public:
 	static std::string operational_identifier();
 
 	void set_threshold (float);
-	void set_sensitivity (float);
-
-	float get_threshold () const;
-	float get_sensitivity () const;
+	void set_sensitivity (uint32_t, float);
 
 	int run (const std::string& path, Readable*, uint32_t channel, AnalysisFeatureList& results);
 	void update_positions (Readable* src, uint32_t channel, AnalysisFeatureList& results);
diff --git a/libs/ardour/ardour/types.h b/libs/ardour/ardour/types.h
index 97dba38..ce28484 100644
--- a/libs/ardour/ardour/types.h
+++ b/libs/ardour/ardour/types.h
@@ -52,6 +52,9 @@ namespace ARDOUR {
 	class AudioSource;
 	class Route;
 	class Region;
+	class Stripable;
+	class VCA;
+	class AutomationControl;
 
 	typedef float    Sample;
 	typedef float    pan_t;
@@ -148,6 +151,7 @@ namespace ARDOUR {
 		FadeOutAutomation,
 		EnvelopeAutomation,
 		RecEnableAutomation,
+		RecSafeAutomation,
 		TrimAutomation,
 		PhaseAutomation,
 		MonitoringAutomation,
@@ -318,7 +322,7 @@ namespace ARDOUR {
 
 		AudioRange (framepos_t s, framepos_t e, uint32_t i) : start (s), end (e) , id (i) {}
 
-		framecnt_t length() { return end - start + 1; }
+		framecnt_t length() const { return end - start + 1; }
 
 		bool operator== (const AudioRange& other) const {
 			return start == other.start && end == other.end && id == other.id;
@@ -462,11 +466,6 @@ namespace ARDOUR {
 		DenormalFTZDAZ
 	};
 
-	enum RemoteModel {
-		UserOrdered,
-		MixerOrdered
-	};
-
 	enum LayerModel {
 		LaterHigher,
 		Manual
@@ -563,7 +562,12 @@ namespace ARDOUR {
 	typedef std::list<framepos_t> AnalysisFeatureList;
 
 	typedef std::list<boost::shared_ptr<Route> > RouteList;
+	typedef std::list<boost::shared_ptr<Stripable> > StripableList;
 	typedef std::list<boost::weak_ptr  <Route> > WeakRouteList;
+	typedef std::list<boost::weak_ptr  <Stripable> > WeakStripableList;
+	typedef std::list<boost::shared_ptr<AutomationControl> > ControlList;
+
+	typedef std::list<boost::shared_ptr<VCA> > VCAList;
 
 	class Bundle;
 	typedef std::vector<boost::shared_ptr<Bundle> > BundleList;
@@ -690,7 +694,6 @@ std::istream& operator>>(std::istream& o, ARDOUR::EditMode& sf);
 std::istream& operator>>(std::istream& o, ARDOUR::MonitorModel& sf);
 std::istream& operator>>(std::istream& o, ARDOUR::PFLPosition& sf);
 std::istream& operator>>(std::istream& o, ARDOUR::AFLPosition& sf);
-std::istream& operator>>(std::istream& o, ARDOUR::RemoteModel& sf);
 std::istream& operator>>(std::istream& o, ARDOUR::ListenPosition& sf);
 std::istream& operator>>(std::istream& o, ARDOUR::LayerModel& sf);
 std::istream& operator>>(std::istream& o, ARDOUR::InsertMergePolicy& sf);
@@ -714,7 +717,6 @@ std::ostream& operator<<(std::ostream& o, const ARDOUR::EditMode& sf);
 std::ostream& operator<<(std::ostream& o, const ARDOUR::MonitorModel& sf);
 std::ostream& operator<<(std::ostream& o, const ARDOUR::PFLPosition& sf);
 std::ostream& operator<<(std::ostream& o, const ARDOUR::AFLPosition& sf);
-std::ostream& operator<<(std::ostream& o, const ARDOUR::RemoteModel& sf);
 std::ostream& operator<<(std::ostream& o, const ARDOUR::ListenPosition& sf);
 std::ostream& operator<<(std::ostream& o, const ARDOUR::LayerModel& sf);
 std::ostream& operator<<(std::ostream& o, const ARDOUR::InsertMergePolicy& sf);
diff --git a/libs/ardour/ardour/unknown_processor.h b/libs/ardour/ardour/unknown_processor.h
index b9743c9..170be38 100644
--- a/libs/ardour/ardour/unknown_processor.h
+++ b/libs/ardour/ardour/unknown_processor.h
@@ -46,7 +46,7 @@ public:
 	virtual ~UnknownProcessor ();
 
 	bool can_support_io_configuration (const ChanCount &, ChanCount &);
-	void run (BufferSet& /*bufs*/, framepos_t /*start_frame*/, framepos_t /*end_frame*/, pframes_t /*nframes*/, bool /*result_required*/);
+	void run (BufferSet& /*bufs*/, framepos_t /*start_frame*/, framepos_t /*end_frame*/, double /*speed*/, pframes_t /*nframes*/, bool /*result_required*/);
 
 	XMLNode & state (bool);
 
diff --git a/libs/ardour/ardour/uri_map.h b/libs/ardour/ardour/uri_map.h
index d745ad5..460aa99 100644
--- a/libs/ardour/ardour/uri_map.h
+++ b/libs/ardour/ardour/uri_map.h
@@ -69,6 +69,7 @@ public:
 		uint32_t atom_Float;
 		uint32_t log_Error;
 		uint32_t log_Note;
+		uint32_t log_Trace;
 		uint32_t log_Warning;
 		uint32_t midi_MidiEvent;
 		uint32_t time_Position;
@@ -83,6 +84,15 @@ public:
 		uint32_t patch_Set;
 		uint32_t patch_property;
 		uint32_t patch_value;
+#ifdef LV2_EXTENDED
+		uint32_t auto_event;
+		uint32_t auto_setup;
+		uint32_t auto_finalize;
+		uint32_t auto_start;
+		uint32_t auto_end;
+		uint32_t auto_parameter;
+		uint32_t auto_value;
+#endif
 	};
 
 	URIDs urids;
diff --git a/libs/ardour/ardour/utils.h b/libs/ardour/ardour/utils.h
index f3767d4..cc6e504 100644
--- a/libs/ardour/ardour/utils.h
+++ b/libs/ardour/ardour/utils.h
@@ -28,19 +28,26 @@
 #include <string>
 #include <cmath>
 
+#include "boost/shared_ptr.hpp"
+
 #if __APPLE__
 #include <CoreFoundation/CoreFoundation.h>
 #endif /* __APPLE__ */
 
-#include "ardour/libardour_visibility.h"
 #include "ardour/ardour.h"
 #include "ardour/data_type.h"
 #include "ardour/dB.h"
+#include "ardour/types.h"
+
+#include "ardour/libardour_visibility.h"
 
 class XMLNode;
 
 namespace ARDOUR {
 
+class Route;
+class Track;
+
 LIBARDOUR_API std::string legalize_for_path (const std::string& str);
 LIBARDOUR_API std::string legalize_for_universal_path (const std::string& str);
 LIBARDOUR_API std::string legalize_for_uri (const std::string& str);
@@ -169,6 +176,28 @@ LIBARDOUR_API bool matching_unsuffixed_filename_exists_in (const std::string& di
 
 LIBARDOUR_API uint32_t how_many_dsp_threads ();
 
+template<typename T> boost::shared_ptr<ControlList> route_list_to_control_list (boost::shared_ptr<RouteList> rl, boost::shared_ptr<T> (Stripable::*get_control)() const) {
+	boost::shared_ptr<ControlList> cl (new ControlList);
+	for (RouteList::const_iterator r = rl->begin(); r != rl->end(); ++r) {
+		boost::shared_ptr<AutomationControl> ac = ((*r).get()->*get_control)();
+		if (ac) {
+			cl->push_back (ac);
+		}
+	}
+	return cl;
+}
+
+template<typename T> boost::shared_ptr<ControlList> stripable_list_to_control_list (StripableList& sl, boost::shared_ptr<T> (Stripable::*get_control)() const) {
+	boost::shared_ptr<ControlList> cl (new ControlList);
+	for (StripableList::const_iterator s = sl.begin(); s != sl.end(); ++s) {
+		boost::shared_ptr<AutomationControl> ac = ((*s).get()->*get_control)();
+		if (ac) {
+			cl->push_back (ac);
+		}
+	}
+	return cl;
+}
+
 #if __APPLE__
 LIBARDOUR_API std::string CFStringRefToStdString(CFStringRef stringRef);
 #endif // __APPLE__
@@ -176,4 +205,3 @@ LIBARDOUR_API std::string CFStringRefToStdString(CFStringRef stringRef);
 } //namespave
 
 #endif /* __ardour_utils_h__ */
-
diff --git a/libs/ardour/ardour/value_as_string.h b/libs/ardour/ardour/value_as_string.h
index c2f40fc..9e042b7 100644
--- a/libs/ardour/ardour/value_as_string.h
+++ b/libs/ardour/ardour/value_as_string.h
@@ -46,16 +46,7 @@ value_as_string(const ARDOUR::ParameterDescriptor& desc,
 
 	// Value is not a scale point, print it normally
 	if (desc.unit == ARDOUR::ParameterDescriptor::MIDI_NOTE) {
-		if (v >= 0 && v <= 127) {
-			const int         num          = rint(v);
-			static const char names[12][3] = {
-				"C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"
-			};
-			snprintf(buf, sizeof(buf), "%s %d", names[num % 12], (num / 12) - 2);
-		} else {
-			// Odd, invalid range, just print the number
-			snprintf(buf, sizeof(buf), "%.0f", v);
-		}
+		snprintf(buf, sizeof(buf), "%s", ParameterDescriptor::midi_note_name (rint(v)).c_str());
 	} else if (!desc.print_fmt.empty()) {
 		snprintf(buf, sizeof(buf), desc.print_fmt.c_str(), v);
 	} else if (desc.integer_step) {
diff --git a/libs/ardour/ardour/variant.h b/libs/ardour/ardour/variant.h
index 9ecadbf..4cf1df5 100644
--- a/libs/ardour/ardour/variant.h
+++ b/libs/ardour/ardour/variant.h
@@ -27,7 +27,7 @@
 #include <stdexcept>
 
 #include "ardour/libardour_visibility.h"
-#include "evoral/types.hpp"
+#include "evoral/Beats.hpp"
 #include "pbd/compose.h"
 
 namespace ARDOUR {
diff --git a/libs/ardour/ardour/vca.h b/libs/ardour/ardour/vca.h
new file mode 100644
index 0000000..710447f
--- /dev/null
+++ b/libs/ardour/ardour/vca.h
@@ -0,0 +1,163 @@
+/*
+    Copyright (C) 2016 Paul Davis
+
+    This program is free software; you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by the Free
+    Software Foundation; either version 2 of the License, or (at your option)
+    any later version.
+
+    This program is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc.,
+    675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#ifndef __ardour_vca_h__
+#define __ardour_vca_h__
+
+#include <string>
+#include <boost/shared_ptr.hpp>
+#include <boost/enable_shared_from_this.hpp>
+
+#include <glibmm/threads.h>
+
+#include "pbd/controllable.h"
+#include "pbd/statefuldestructible.h"
+
+#include "ardour/automatable.h"
+#include "ardour/muteable.h"
+#include "ardour/monitorable.h"
+#include "ardour/recordable.h"
+#include "ardour/soloable.h"
+#include "ardour/slavable.h"
+#include "ardour/stripable.h"
+
+namespace ARDOUR {
+
+class Route;
+class GainControl;
+class SoloControl;
+class MuteControl;
+class MonitorControl;
+
+class LIBARDOUR_API VCA : public Stripable,
+                          public Soloable,
+                          public Muteable,
+                          public Automatable,
+                          public Recordable,
+                          public Monitorable,
+                          public boost::enable_shared_from_this<VCA> {
+  public:
+	VCA (Session& session,  int32_t num, const std::string& name);
+	~VCA();
+
+	int32_t number () const { return _number; }
+
+	int init ();
+	XMLNode& get_state();
+	int set_state (XMLNode const&, int version);
+
+	PBD::Signal0<void> Drop; /* signal to slaves to drop control by this VCA */
+
+	/* Slavable API */
+
+        bool slaved_to (boost::shared_ptr<VCA>) const;
+        bool slaved () const;
+
+	/* Soloable API */
+
+	void clear_all_solo_state ();
+
+	bool soloed () const;
+	void push_solo_upstream (int32_t) {}
+	void push_solo_isolate_upstream (int32_t) {}
+	bool can_solo() const { return true; }
+	bool is_safe () const { return false; }
+
+	/* Muteable API */
+
+	bool can_be_muted_by_others () const { return true; }
+	bool muted_by_others_soloing() const { return false; }
+
+	/* Recordable API */
+
+	int prep_record_enabled (bool yn) { return 0; }
+	bool can_be_record_enabled() { return true; }
+	bool can_be_record_safe() { return true; }
+
+	/* Monitorable API */
+
+	MonitorState monitoring_state() const;
+
+	static std::string default_name_template ();
+	static int32_t next_vca_number ();
+	static std::string xml_node_name;
+
+	/* used by Session to save/restore the atomic counter */
+	static int32_t get_next_vca_number ();
+	static void set_next_vca_number (int32_t);
+
+	boost::shared_ptr<GainControl> gain_control() const { return _gain_control; }
+	boost::shared_ptr<SoloControl> solo_control() const { return _solo_control; }
+	boost::shared_ptr<MuteControl> mute_control() const { return _mute_control; }
+
+	/* null Stripable API, because VCAs don't have any of this */
+
+	boost::shared_ptr<SoloIsolateControl> solo_isolate_control() const { return boost::shared_ptr<SoloIsolateControl>(); }
+	boost::shared_ptr<SoloSafeControl> solo_safe_control() const { return boost::shared_ptr<SoloSafeControl>(); }
+	boost::shared_ptr<PeakMeter>         peak_meter() { return boost::shared_ptr<PeakMeter>(); }
+	boost::shared_ptr<const PeakMeter>   peak_meter() const { return boost::shared_ptr<PeakMeter>(); }
+	boost::shared_ptr<PhaseControl>      phase_control() const { return boost::shared_ptr<PhaseControl>(); }
+	boost::shared_ptr<GainControl>       trim_control() const { return boost::shared_ptr<GainControl>(); }
+	boost::shared_ptr<AutomationControl> pan_azimuth_control() const { return boost::shared_ptr<AutomationControl>(); }
+	boost::shared_ptr<AutomationControl> pan_elevation_control() const { return boost::shared_ptr<AutomationControl>(); }
+	boost::shared_ptr<AutomationControl> pan_width_control() const { return boost::shared_ptr<AutomationControl>(); }
+	boost::shared_ptr<AutomationControl> pan_frontback_control() const { return boost::shared_ptr<AutomationControl>(); }
+	boost::shared_ptr<AutomationControl> pan_lfe_control() const { return boost::shared_ptr<AutomationControl>(); }
+	uint32_t eq_band_cnt () const { return 0; }
+	std::string eq_band_name (uint32_t) const { return std::string(); }
+	boost::shared_ptr<AutomationControl> eq_gain_controllable (uint32_t band) const { return boost::shared_ptr<AutomationControl>(); }
+	boost::shared_ptr<AutomationControl> eq_freq_controllable (uint32_t band) const { return boost::shared_ptr<AutomationControl>(); }
+	boost::shared_ptr<AutomationControl> eq_q_controllable (uint32_t band) const { return boost::shared_ptr<AutomationControl>(); }
+	boost::shared_ptr<AutomationControl> eq_shape_controllable (uint32_t band) const { return boost::shared_ptr<AutomationControl>(); }
+	boost::shared_ptr<AutomationControl> eq_enable_controllable () const { return boost::shared_ptr<AutomationControl>(); }
+	boost::shared_ptr<AutomationControl> eq_hpf_controllable () const { return boost::shared_ptr<AutomationControl>(); }
+	boost::shared_ptr<AutomationControl> comp_enable_controllable () const { return boost::shared_ptr<AutomationControl>(); }
+	boost::shared_ptr<AutomationControl> comp_threshold_controllable () const { return boost::shared_ptr<AutomationControl>(); }
+	boost::shared_ptr<AutomationControl> comp_speed_controllable () const { return boost::shared_ptr<AutomationControl>(); }
+	boost::shared_ptr<AutomationControl> comp_mode_controllable () const { return boost::shared_ptr<AutomationControl>(); }
+	boost::shared_ptr<AutomationControl> comp_makeup_controllable () const { return boost::shared_ptr<AutomationControl>(); }
+	boost::shared_ptr<AutomationControl> comp_redux_controllable () const { return boost::shared_ptr<AutomationControl>(); }
+	std::string comp_mode_name (uint32_t mode) const { return std::string(); }
+	std::string comp_speed_name (uint32_t mode) const { return std::string(); }
+	boost::shared_ptr<AutomationControl> send_level_controllable (uint32_t n) const { return boost::shared_ptr<AutomationControl>(); }
+	boost::shared_ptr<AutomationControl> send_enable_controllable (uint32_t n) const { return boost::shared_ptr<AutomationControl>(); }
+	std::string send_name (uint32_t n) const { return std::string(); }
+	boost::shared_ptr<AutomationControl> master_send_enable_controllable () const { return boost::shared_ptr<AutomationControl>(); }
+	boost::shared_ptr<MonitorProcessor> monitor_control() const { return boost::shared_ptr<MonitorProcessor>(); }
+	boost::shared_ptr<MonitorControl> monitoring_control() const { return boost::shared_ptr<MonitorControl>(); }
+
+  private:
+	int32_t _number;
+
+	boost::shared_ptr<GainControl> _gain_control;
+	boost::shared_ptr<SoloControl> _solo_control;
+	boost::shared_ptr<MuteControl> _mute_control;
+
+
+	static int32_t next_number;
+	static Glib::Threads::Mutex number_lock;
+
+	void solo_target_going_away (boost::weak_ptr<Route>);
+	void mute_target_going_away (boost::weak_ptr<Route>);
+	bool soloed_locked () const;
+	bool muted_locked () const;
+};
+
+} /* namespace */
+
+#endif /* __ardour_vca_h__ */
diff --git a/libs/ardour/ardour/vca_manager.h b/libs/ardour/ardour/vca_manager.h
new file mode 100644
index 0000000..99be0c5
--- /dev/null
+++ b/libs/ardour/ardour/vca_manager.h
@@ -0,0 +1,75 @@
+/*
+  Copyright (C) 2016 Paul Davis
+
+  This program is free software; you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation; either version 2 of the License, or
+  (at your option) any later version.
+
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#ifndef __libardour_vca_manager_h__
+#define __libardour_vca_manager_h__
+
+#include <string>
+#include <list>
+
+#include <boost/shared_ptr.hpp>
+
+#include <glibmm/threads.h>
+
+#include "pbd/signals.h"
+#include "pbd/statefuldestructible.h"
+
+#include "ardour/session_handle.h"
+#include "ardour/types.h"
+#include "ardour/libardour_visibility.h"
+
+namespace ARDOUR {
+
+class VCA;
+
+class LIBARDOUR_API VCAManager : public SessionHandleRef, public PBD::StatefulDestructible
+{
+     public:
+	VCAManager (ARDOUR::Session&);
+	~VCAManager ();
+
+	int create_vca (uint32_t how_many, std::string const & name = std::string());
+	void remove_vca (boost::shared_ptr<VCA>);
+
+	boost::shared_ptr<VCA> vca_by_number(int32_t) const;
+
+	VCAList vcas() const;
+	VCAList::size_type n_vcas() const { return _vcas.size(); }
+
+	PBD::Signal1<void,VCAList&> VCAAdded;
+
+	XMLNode& get_state();
+	int set_state (XMLNode const&, int version);
+
+	bool vcas_loaded() const { return _vcas_loaded; }
+	void clear_all_solo_state ();
+
+	static std::string xml_node_name;
+
+     private:
+	mutable Glib::Threads::Mutex lock;
+	VCAList _vcas;
+	bool _vcas_loaded;
+
+	void clear ();
+};
+
+} // namespace
+
+#endif /* __libardour_vca_manager_h__ */
diff --git a/libs/ardour/ardour/vestige/aeffectx.h b/libs/ardour/ardour/vestige/aeffectx.h
index 2b839f0..25be89b 100644
--- a/libs/ardour/ardour/vestige/aeffectx.h
+++ b/libs/ardour/ardour/vestige/aeffectx.h
@@ -138,6 +138,7 @@ struct RemoteVstPlugin;
 #define kVstTransportChanged 1
 #define kVstTransportPlaying (1 << 1)
 #define kVstTransportCycleActive (1 << 2)
+#define kVstTransportRecording (1 << 3)
 
 #define kVstAutomationWriting (1 << 6)
 #define kVstAutomationReading (1 << 7)
diff --git a/libs/ardour/ardour/vst_plugin.h b/libs/ardour/ardour/vst_plugin.h
index d77d380..e56b9c0 100644
--- a/libs/ardour/ardour/vst_plugin.h
+++ b/libs/ardour/ardour/vst_plugin.h
@@ -29,8 +29,12 @@ typedef struct _VSTHandle VSTHandle;
 struct _VSTState;
 typedef struct _VSTState VSTState;
 
+#include "ardour/vestige/aeffectx.h"
+
 namespace ARDOUR {
 
+class PluginInsert;
+
 /** Parent class for VST plugins of both Windows and Linux varieties */
 class LIBARDOUR_API VSTPlugin : public Plugin
 {
@@ -42,6 +46,7 @@ public:
 	void deactivate ();
 
 	int set_block_size (pframes_t);
+	bool inplace_broken() const { return true; }
 	float default_value (uint32_t port);
 	float get_parameter (uint32_t port) const;
 	uint32_t nth_parameter (uint32_t port, bool& ok) const;
@@ -58,10 +63,11 @@ public:
 	bool parameter_is_input (uint32_t) const { return true; }
 	bool parameter_is_output (uint32_t) const { return false; }
 
-	int connect_and_run (
-		BufferSet&, ChanMapping in, ChanMapping out,
-		pframes_t nframes, framecnt_t offset
-		);
+	int connect_and_run (BufferSet&,
+			framepos_t start, framepos_t end, double speed,
+			ChanMapping in, ChanMapping out,
+			pframes_t nframes, framecnt_t offset
+			);
 
 	std::string unique_id () const;
 	const char * label () const;
@@ -80,6 +86,14 @@ public:
 
 	int first_user_preset_index () const;
 
+	void set_insert (PluginInsert* pi, uint32_t num) { _pi = pi; _num = num; }
+	PluginInsert* plugin_insert () const { return _pi; }
+	uint32_t plugin_number () const { return _num; }
+	VstTimeInfo* timeinfo () { return &_timeInfo; }
+	framepos_t transport_frame () const { return _transport_frame; }
+	float transport_speed () const { return _transport_speed; }
+
+
 protected:
 	void set_plugin (AEffect *);
 	gchar* get_chunk (bool) const;
@@ -96,8 +110,15 @@ protected:
 	VSTHandle* _handle;
 	VSTState*  _state;
 	AEffect*   _plugin;
+	PluginInsert* _pi;
+	uint32_t      _num;
 
 	MidiBuffer* _midi_out_buf;
+	VstTimeInfo _timeInfo;
+
+	framepos_t _transport_frame;
+	float      _transport_speed;
+	mutable std::map <uint32_t, float> _parameter_defaults;
 };
 
 }
diff --git a/libs/ardour/ardour/worker.h b/libs/ardour/ardour/worker.h
index c83f006..6e1a7c9 100644
--- a/libs/ardour/ardour/worker.h
+++ b/libs/ardour/ardour/worker.h
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2012 Paul Davis
+  Copyright (C) 2012-2016 Paul Davis
   Author: David Robillard
 
   This program is free software; you can redistribute it and/or modify
@@ -31,6 +31,8 @@
 
 namespace ARDOUR {
 
+class Worker;
+
 /**
    An object that needs to schedule non-RT work in the audio thread.
 */
@@ -41,7 +43,7 @@ public:
 	/**
 	   Do some work in the worker thread.
 	*/
-	virtual int work(uint32_t size, const void* data) = 0;
+	virtual int work(Worker& worker, uint32_t size, const void* data) = 0;
 
 	/**
 	   Handle a response from the worker thread in the audio thread.
@@ -50,12 +52,16 @@ public:
 };
 
 /**
-   A worker thread for non-realtime tasks scheduled in the audio thread.
+   A worker for non-realtime tasks scheduled from another thread.
+
+   A worker may be a separate thread that runs to execute scheduled work
+   asynchronously, or unthreaded, in which case work is executed immediately
+   upon scheduling by the calling thread.
 */
 class LIBARDOUR_API Worker
 {
 public:
-	Worker(Workee* workee, uint32_t ring_size);
+	Worker(Workee* workee, uint32_t ring_size, bool threaded=true);
 	~Worker();
 
 	/**
@@ -75,6 +81,16 @@ public:
 	*/
 	void emit_responses();
 
+	/**
+	   Enable or disable synchronous execution.
+
+	   If enabled, all work is performed immediately in schedule() regardless
+	   of whether or not the worker is threaded.  This is used for exporting,
+	   where we want to temporarily execute all work synchronously but the
+	   worker is typically used threaded for live rolling.
+	*/
+	void set_synchronous(bool synchronous) { _synchronous = synchronous; }
+
 private:
 	void run();
 	/**
@@ -83,19 +99,19 @@ private:
 	   Handle the unlikley edge-case, if we're called in between the
 	   responder writing 'size' and 'data'.
 
-		 @param rb the ringbuffer to check
-		 @return true if the message is complete, false otherwise
-	 */
+	   @param rb the ringbuffer to check
+	   @return true if the message is complete, false otherwise
+	*/
 	bool verify_message_completeness(RingBuffer<uint8_t>* rb);
 
 	Workee*                _workee;
 	RingBuffer<uint8_t>*   _requests;
 	RingBuffer<uint8_t>*   _responses;
 	uint8_t*               _response;
-	PBD::Semaphore  _sem;
-	bool                   _exit;
+	PBD::Semaphore         _sem;
 	Glib::Threads::Thread* _thread;
-
+	bool                   _exit;
+	bool                   _synchronous;
 };
 
 } // namespace ARDOUR
diff --git a/libs/ardour/audio_backend.cc b/libs/ardour/audio_backend.cc
index c3e88e7..930eb41 100644
--- a/libs/ardour/audio_backend.cc
+++ b/libs/ardour/audio_backend.cc
@@ -19,7 +19,7 @@
 
 #include "ardour/audio_backend.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 namespace ARDOUR {
 
diff --git a/libs/ardour/audio_buffer.cc b/libs/ardour/audio_buffer.cc
index 6d8b2aa..89e210c 100644
--- a/libs/ardour/audio_buffer.cc
+++ b/libs/ardour/audio_buffer.cc
@@ -22,7 +22,7 @@
 #include "pbd/error.h"
 #include "pbd/malign.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace PBD;
 using namespace ARDOUR;
diff --git a/libs/ardour/audio_diskstream.cc b/libs/ardour/audio_diskstream.cc
index 6f7c2d6..330b9d5 100644
--- a/libs/ardour/audio_diskstream.cc
+++ b/libs/ardour/audio_diskstream.cc
@@ -56,7 +56,7 @@
 #include "ardour/types.h"
 #include "ardour/utils.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 #include <locale.h>
 
 using namespace std;
@@ -168,7 +168,7 @@ AudioDiskstream::non_realtime_input_change ()
 			need_write_sources = true;
 		}
 
-		if (input_change_pending.type == IOChange::ConfigurationChanged) {
+		if (input_change_pending.type & IOChange::ConfigurationChanged) {
 			RCUWriter<ChannelList> writer (channels);
 			boost::shared_ptr<ChannelList> c = writer.get_copy();
 
@@ -359,7 +359,7 @@ AudioDiskstream::use_destructive_playlist ()
 
 	boost::shared_ptr<Region> rp;
 	{
-		const RegionList& rl (_playlist->region_list().rlist());
+		const RegionList& rl (_playlist->region_list_property().rlist());
 		if (rl.size() > 0) {
 			assert((rl.size() == 1));
 			rp = rl.front();
@@ -377,9 +377,9 @@ AudioDiskstream::use_destructive_playlist ()
 		throw failed_constructor();
 	}
 
-	/* be sure to stretch the region out to the maximum length */
+	/* be sure to stretch the region out to the maximum length (non-musical)*/
 
-	region->set_length (max_framepos - region->position());
+	region->set_length (max_framepos - region->position(), 0);
 
 	uint32_t n;
 	ChannelList::iterator chan;
@@ -1895,7 +1895,7 @@ AudioDiskstream::get_state ()
 {
 	XMLNode& node (Diskstream::get_state());
 	char buf[64] = "";
-	LocaleGuard lg (X_("C"));
+	LocaleGuard lg;
 
 	boost::shared_ptr<ChannelList> c = channels.reader();
 	snprintf (buf, sizeof(buf), "%u", (unsigned int) c->size());
@@ -1932,12 +1932,12 @@ AudioDiskstream::get_state ()
 int
 AudioDiskstream::set_state (const XMLNode& node, int version)
 {
-	const XMLProperty* prop;
+	XMLProperty const * prop;
 	XMLNodeList nlist = node.children();
 	XMLNodeIterator niter;
 	uint32_t nchans = 1;
 	XMLNode* capture_pending_node = 0;
-	LocaleGuard lg (X_("C"));
+	LocaleGuard lg;
 
 	/* prevent write sources from being created */
 
@@ -2237,11 +2237,11 @@ AudioDiskstream::playback_buffer_load () const
 	boost::shared_ptr<ChannelList> c = channels.reader();
 
 	if (c->empty ()) {
-		return 0;
+		return 1.0;
 	}
 
 	return (float) ((double) c->front()->playback_buf->read_space()/
-			(double) c->front()->playback_buf->bufsize());
+	                   (double) c->front()->playback_buf->bufsize());
 }
 
 float
@@ -2250,7 +2250,7 @@ AudioDiskstream::capture_buffer_load () const
 	boost::shared_ptr<ChannelList> c = channels.reader();
 
 	if (c->empty ()) {
-		return 0;
+		return 1.0;
 	}
 
 	return (float) ((double) c->front()->capture_buf->write_space()/
@@ -2260,7 +2260,7 @@ AudioDiskstream::capture_buffer_load () const
 int
 AudioDiskstream::use_pending_capture_data (XMLNode& node)
 {
-	const XMLProperty* prop;
+	XMLProperty const * prop;
 	XMLNodeList nlist = node.children();
 	XMLNodeIterator niter;
 	boost::shared_ptr<AudioFileSource> fs;
@@ -2435,7 +2435,7 @@ AudioDiskstream::can_become_destructive (bool& requires_bounce) const
 
 	boost::shared_ptr<Region> first;
 	{
-		const RegionList& rl (_playlist->region_list().rlist());
+		const RegionList& rl (_playlist->region_list_property().rlist());
 		assert((rl.size() == 1));
 		first = rl.front();
 
diff --git a/libs/ardour/audio_library.cc b/libs/ardour/audio_library.cc
index a1643c8..2f09a37 100644
--- a/libs/ardour/audio_library.cc
+++ b/libs/ardour/audio_library.cc
@@ -40,7 +40,7 @@
 #include "ardour/audio_library.h"
 #include "ardour/filesystem_paths.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace PBD;
diff --git a/libs/ardour/audio_playlist.cc b/libs/ardour/audio_playlist.cc
index 0553206..b00252d 100644
--- a/libs/ardour/audio_playlist.cc
+++ b/libs/ardour/audio_playlist.cc
@@ -28,7 +28,7 @@
 #include "ardour/region_sorters.h"
 #include "ardour/session.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 using namespace std;
@@ -38,7 +38,7 @@ AudioPlaylist::AudioPlaylist (Session& session, const XMLNode& node, bool hidden
 	: Playlist (session, node, DataType::AUDIO, hidden)
 {
 #ifndef NDEBUG
-	const XMLProperty* prop = node.property("type");
+	XMLProperty const * prop = node.property("type");
 	assert(!prop || DataType(prop->value()) == DataType::AUDIO);
 #endif
 
@@ -335,6 +335,11 @@ AudioPlaylist::region_changed (const PropertyChange& what_changed, boost::shared
 		return false;
 	}
 
+	PropertyChange bounds;
+	bounds.add (Properties::start);
+	bounds.add (Properties::position);
+	bounds.add (Properties::length);
+
 	PropertyChange our_interests;
 
 	our_interests.add (Properties::fade_in_active);
@@ -348,8 +353,8 @@ AudioPlaylist::region_changed (const PropertyChange& what_changed, boost::shared
 	bool parent_wants_notify;
 
 	parent_wants_notify = Playlist::region_changed (what_changed, region);
-
-	if (parent_wants_notify || (what_changed.contains (our_interests))) {
+	/* if bounds changed, we have already done notify_contents_changed ()*/
+	if ((parent_wants_notify || what_changed.contains (our_interests)) && !what_changed.contains (bounds)) {
 		notify_contents_changed ();
 	}
 
@@ -487,7 +492,7 @@ AudioPlaylist::load_legacy_crossfades (const XMLNode& node, int version)
 	for (XMLNodeConstIterator i = children.begin(); i != children.end(); ++i) {
 		if ((*i)->name() == X_("Crossfade")) {
 
-			XMLProperty* p = (*i)->property (X_("active"));
+			XMLProperty const * p = (*i)->property (X_("active"));
 			assert (p);
 
 			if (!string_is_affirmative (p->value())) {
diff --git a/libs/ardour/audio_playlist_importer.cc b/libs/ardour/audio_playlist_importer.cc
index 5390f1c..c1afdfe 100644
--- a/libs/ardour/audio_playlist_importer.cc
+++ b/libs/ardour/audio_playlist_importer.cc
@@ -31,7 +31,7 @@
 #include "ardour/playlist_factory.h"
 #include "ardour/session_playlists.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace PBD;
@@ -51,7 +51,7 @@ AudioPlaylistImportHandler::AudioPlaylistImportHandler (XMLTree const & source,
 
 	XMLNodeList const & pl_children = playlists->children();
 	for (XMLNodeList::const_iterator it = pl_children.begin(); it != pl_children.end(); ++it) {
-		const XMLProperty* type = (*it)->property("type");
+		XMLProperty const * type = (*it)->property("type");
 		if ( !type || type->value() == "audio" ) {
 			try {
 				elements.push_back (ElementPtr ( new AudioPlaylistImporter (source, session, *this, **it)));
@@ -75,7 +75,7 @@ AudioPlaylistImportHandler::get_regions (XMLNode const & node, ElementList & lis
 }
 
 void
-AudioPlaylistImportHandler::update_region_id (XMLProperty* id_prop)
+AudioPlaylistImportHandler::update_region_id (XMLProperty * id_prop)
 {
 	PBD::ID old_id (id_prop->value());
 	PBD::ID new_id (region_handler.get_new_id (old_id));
@@ -178,7 +178,7 @@ AudioPlaylistImporter::_prepare_move ()
 		name = rename_pair.second;
 	}
 
-	XMLProperty* p = xml_playlist.property ("name");
+	XMLProperty * p = xml_playlist.property ("name");
 	if (!p) {
 		error << _("badly-formed XML in imported playlist") << endmsg;
 		return false;
@@ -219,8 +219,8 @@ AudioPlaylistImporter::_move ()
 	// Update region ids in crossfades
 	XMLNodeList crossfades = xml_playlist.children("Crossfade");
 	for (XMLNodeIterator it = crossfades.begin(); it != crossfades.end(); ++it) {
-		XMLProperty* in = (*it)->property("in");
-		XMLProperty* out = (*it)->property("out");
+		XMLProperty * in = (*it)->property("in");
+		XMLProperty * out = (*it)->property("out");
 		if (!in || !out) {
 			error << string_compose (X_("AudioPlaylistImporter (%1): did not find the \"in\" or \"out\" property from a crossfade"), name) << endmsg;
 			continue; // or fatal?
@@ -230,12 +230,12 @@ AudioPlaylistImporter::_move ()
 		handler.update_region_id (out);
 
 		// rate convert length and position
-		XMLProperty* length = (*it)->property("length");
+		XMLProperty * length = (*it)->property("length");
 		if (length) {
 			length->set_value (rate_convert_samples (length->value()));
 		}
 
-		XMLProperty* position = (*it)->property("position");
+		XMLProperty * position = (*it)->property("position");
 		if (position) {
 			position->set_value (rate_convert_samples (position->value()));
 		}
diff --git a/libs/ardour/audio_playlist_source.cc b/libs/ardour/audio_playlist_source.cc
index 8effdd0..f77c8b5 100644
--- a/libs/ardour/audio_playlist_source.cc
+++ b/libs/ardour/audio_playlist_source.cc
@@ -35,7 +35,7 @@
 #include "ardour/session.h"
 #include "ardour/session_directory.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
@@ -108,7 +108,7 @@ AudioPlaylistSource::set_state (const XMLNode& node, int version, bool with_desc
 		}
 	}
 
-	const XMLProperty* prop;
+	XMLProperty const * prop;
 	pair<framepos_t,framepos_t> extent = _playlist->get_extent();
 
 	AudioSource::_length = extent.second - extent.first;
@@ -188,7 +188,7 @@ AudioPlaylistSource::n_channels () const
 		return 1;
 	}
 
-	boost::shared_ptr<Region> r = _playlist->region_list().front ();
+	boost::shared_ptr<Region> r = _playlist->region_list_property().front ();
 	boost::shared_ptr<AudioRegion> ar = boost::dynamic_pointer_cast<AudioRegion> (r);
 
 	return ar->audio_source()->n_channels ();
@@ -203,7 +203,7 @@ AudioPlaylistSource::sample_rate () const
 		_session.frame_rate ();
 	}
 
-	boost::shared_ptr<Region> r = _playlist->region_list().front ();
+	boost::shared_ptr<Region> r = _playlist->region_list_property().front ();
 	boost::shared_ptr<AudioRegion> ar = boost::dynamic_pointer_cast<AudioRegion> (r);
 
 	return ar->audio_source()->sample_rate ();
diff --git a/libs/ardour/audio_port.cc b/libs/ardour/audio_port.cc
index e2bb20d..33e41c1 100644
--- a/libs/ardour/audio_port.cc
+++ b/libs/ardour/audio_port.cc
@@ -59,8 +59,11 @@ void
 AudioPort::cycle_end (pframes_t nframes)
 {
         if (sends_output() && !_buffer->written()) {
-		if (_buffer->capacity() >= nframes) {
-			_buffer->silence (nframes);
+	        if (!_buffer->data (0)) {
+		        get_audio_buffer (nframes);
+	        }
+	        if (_buffer->capacity() >= nframes) {
+		        _buffer->silence (nframes);
 		}
 	}
 }
diff --git a/libs/ardour/audio_region_importer.cc b/libs/ardour/audio_region_importer.cc
index 53367a3..8fc5c53 100644
--- a/libs/ardour/audio_region_importer.cc
+++ b/libs/ardour/audio_region_importer.cc
@@ -33,7 +33,7 @@
 #include "ardour/region_factory.h"
 #include "ardour/session_directory.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace PBD;
@@ -236,7 +236,7 @@ AudioRegionImporter::parse_source_xml ()
 	char buf[128];
 	std::string source_dir(get_sound_dir (source));
 	XMLNode * source_node;
-	XMLProperty *prop;
+	XMLProperty const * prop;
 
 	// Get XML for sources
 	if (!(source_node = source.root()->child (X_("Sources")))) {
diff --git a/libs/ardour/audio_track.cc b/libs/ardour/audio_track.cc
index 47746ff..3a653a0 100644
--- a/libs/ardour/audio_track.cc
+++ b/libs/ardour/audio_track.cc
@@ -19,7 +19,6 @@
 
 #include <boost/scoped_array.hpp>
 
-#include "pbd/boost_debug.h"
 #include "pbd/enumwriter.h"
 #include "pbd/error.h"
 
@@ -30,9 +29,11 @@
 #include "ardour/audio_diskstream.h"
 #include "ardour/audio_track.h"
 #include "ardour/audioplaylist.h"
+#include "ardour/boost_debug.h"
 #include "ardour/buffer_set.h"
 #include "ardour/delivery.h"
 #include "ardour/meter.h"
+#include "ardour/monitor_control.h"
 #include "ardour/playlist_factory.h"
 #include "ardour/processor.h"
 #include "ardour/profile.h"
@@ -43,14 +44,14 @@
 #include "ardour/source.h"
 #include "ardour/utils.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
 using namespace PBD;
 
-AudioTrack::AudioTrack (Session& sess, string name, Route::Flag flag, TrackMode mode)
-	: Track (sess, name, flag, mode)
+AudioTrack::AudioTrack (Session& sess, string name, TrackMode mode)
+	: Track (sess, name, PresentationInfo::AudioTrack, mode)
 {
 }
 
@@ -158,7 +159,7 @@ AudioTrack::deprecated_use_diskstream_connections ()
 		return 0;
 	}
 
-	const XMLProperty* prop;
+	XMLProperty const * prop;
 	XMLNode& node (*diskstream->deprecated_io_node);
 
 	/* don't do this more than once. */
@@ -200,7 +201,7 @@ AudioTrack::deprecated_use_diskstream_connections ()
 int
 AudioTrack::set_state (const XMLNode& node, int version)
 {
-	const XMLProperty *prop;
+	XMLProperty const * prop;
 
 	if ((prop = node.property (X_("mode"))) != 0) {
 		_mode = TrackMode (string_2_enum (prop->value(), _mode));
@@ -266,8 +267,8 @@ void
 AudioTrack::set_state_part_two ()
 {
 	XMLNode* fnode;
-	XMLProperty* prop;
-	LocaleGuard lg (X_("C"));
+	XMLProperty const * prop;
+	LocaleGuard lg;
 
 	/* This is called after all session state has been restored but before
 	   have been made ports and connections are established.
@@ -349,7 +350,7 @@ AudioTrack::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_fram
 
 	if (!_active) {
 		silence (nframes);
-		if (_meter_point == MeterInput && (_monitoring & MonitorInput || _diskstream->record_enabled())) {
+		if (_meter_point == MeterInput && ((_monitoring_control->monitoring_choice() & MonitorInput) || _diskstream->record_enabled())) {
 			_meter->reset();
 		}
 		return 0;
@@ -374,16 +375,6 @@ AudioTrack::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_fram
 		return dret;
 	}
 
-	if (_mute_control->list() && _mute_control->automation_playback()) {
-		bool        valid = false;
-		const float mute  = _mute_control->list()->rt_safe_eval(transport_frame, valid);
-		if (mute >= 0.5 && !muted()) {
-			_mute_control->set_value_unchecked(1.0);  // mute
-		} else if (mute < 0.5 && muted()) {
-			_mute_control->set_value_unchecked(0.0);  // unmute
-		}
-	}
-
 	_silent = false;
 	_amp->apply_gain_automation(false);
 
@@ -391,8 +382,8 @@ AudioTrack::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_fram
 
 	fill_buffers_with_input (bufs, _input, nframes);
 
-	if (_meter_point == MeterInput && (_monitoring & MonitorInput || _diskstream->record_enabled())) {
-		_meter->run (bufs, start_frame, end_frame, nframes, true);
+	if (_meter_point == MeterInput && ((_monitoring_control->monitoring_choice() & MonitorInput) || _diskstream->record_enabled())) {
+		_meter->run (bufs, start_frame, end_frame, 1.0 /*speed()*/, nframes, true);
 	}
 
 	if ((dret = diskstream->process (bufs, transport_frame, nframes, playback_distance, (monitoring_state() == MonitoringDisk))) != 0) {
@@ -403,12 +394,7 @@ AudioTrack::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_fram
 
 	process_output_buffers (bufs, start_frame, end_frame, nframes, declick, (!diskstream->record_enabled() && _session.transport_rolling()));
 
-	for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
-		boost::shared_ptr<Delivery> d = boost::dynamic_pointer_cast<Delivery> (*i);
-		if (d) {
-			d->flush_buffers (nframes);
-		}
-	}
+	flush_processor_buffers_locked (nframes);
 
 	need_butler = diskstream->commit (playback_distance);
 
@@ -629,8 +615,9 @@ AudioTrack::freeze_me (InterThreadInfo& itt)
 
 	/* reset stuff that has already been accounted for in the freeze process */
 
-	set_gain (GAIN_COEFF_UNITY, Controllable::NoGroup);
-	_amp->gain_control()->set_automation_state (Off);
+	gain_control()->set_value (GAIN_COEFF_UNITY, Controllable::NoGroup);
+	gain_control()->set_automation_state (Off);
+
 	/* XXX need to use _main_outs _panner->set_automation_state (Off); */
 
 	_freeze_record.state = Frozen;
diff --git a/libs/ardour/audio_track_importer.cc b/libs/ardour/audio_track_importer.cc
index 43a4010..dd77cb3 100644
--- a/libs/ardour/audio_track_importer.cc
+++ b/libs/ardour/audio_track_importer.cc
@@ -31,7 +31,7 @@
 #include <sstream>
 #include <algorithm>
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace PBD;
@@ -51,7 +51,7 @@ AudioTrackImportHandler::AudioTrackImportHandler (XMLTree const & source, Sessio
 
 	XMLNodeList const & route_list = routes->children();
 	for (XMLNodeList::const_iterator it = route_list.begin(); it != route_list.end(); ++it) {
-		const XMLProperty* type = (*it)->property("default-type");
+		XMLProperty const * type = (*it)->property("default-type");
 		if ( (!type || type->value() == "audio") &&  ((*it)->property ("diskstream") != 0 || (*it)->property ("diskstream-id") != 0)) {
 			try {
 				elements.push_back (ElementPtr ( new AudioTrackImporter (source, session, *this, **it, pl_handler)));
@@ -254,7 +254,7 @@ AudioTrackImporter::_prepare_move ()
 		return false;
 	}
 
-	XMLProperty* p = c->property ("name");
+	XMLProperty * p = c->property ("name");
 	if (!p) {
 		error << _("badly-formed XML in imported track") << endmsg;
 		return false;
@@ -289,7 +289,7 @@ AudioTrackImporter::_move ()
 	}
 
 	boost::shared_ptr<XMLNode> ds_node = ds_node_list->front();
-	XMLProperty* p = ds_node->property (X_("id"));
+	XMLProperty * p = ds_node->property (X_("id"));
 	assert (p);
 	p->set_value (new_ds_id.to_s());
 
diff --git a/libs/ardour/audio_unit.cc b/libs/ardour/audio_unit.cc
index 6cb5c2a..5c324b0 100644
--- a/libs/ardour/audio_unit.cc
+++ b/libs/ardour/audio_unit.cc
@@ -71,7 +71,7 @@
 #define ArdourFindNext AudioComponentFindNext
 #endif
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace PBD;
@@ -430,17 +430,27 @@ AUPlugin::AUPlugin (AudioEngine& engine, Session& session, boost::shared_ptr<CAC
 	, comp (_comp)
 	, unit (new CAAudioUnit)
 	, initialized (false)
-	, _current_block_size (0)
+	, _last_nframes (0)
+	, _current_latency (UINT_MAX)
 	, _requires_fixed_size_buffers (false)
 	, buffers (0)
+	, variable_inputs (false)
+	, variable_outputs (false)
+	, configured_input_busses (0)
+	, configured_output_busses (0)
+	, bus_inputs (0)
+	, bus_outputs (0)
 	, input_maxbuf (0)
 	, input_offset (0)
+	, cb_offsets (0)
 	, input_buffers (0)
+	, input_map (0)
 	, frames_processed (0)
 	, audio_input_cnt (0)
 	, _parameter_listener (0)
 	, _parameter_listener_arg (0)
-	, last_transport_rolling (false)
+	, transport_frame (0)
+	, transport_speed (0)
 	, last_transport_speed (0.0)
 {
 	if (!preset_search_path_initialized) {
@@ -461,16 +471,27 @@ AUPlugin::AUPlugin (const AUPlugin& other)
 	, comp (other.get_comp())
 	, unit (new CAAudioUnit)
 	, initialized (false)
-	, _current_block_size (0)
 	, _last_nframes (0)
+	, _current_latency (UINT_MAX)
 	, _requires_fixed_size_buffers (false)
 	, buffers (0)
+	, variable_inputs (false)
+	, variable_outputs (false)
+	, configured_input_busses (0)
+	, configured_output_busses (0)
+	, bus_inputs (0)
+	, bus_outputs (0)
 	, input_maxbuf (0)
 	, input_offset (0)
+	, cb_offsets (0)
 	, input_buffers (0)
+	, input_map (0)
 	, frames_processed (0)
 	, _parameter_listener (0)
 	, _parameter_listener_arg (0)
+	, transport_frame (0)
+	, transport_speed (0)
+	, last_transport_speed (0.0)
 
 {
 	init ();
@@ -491,9 +512,10 @@ AUPlugin::~AUPlugin ()
 		unit->Uninitialize ();
 	}
 
-	if (buffers) {
-		free (buffers);
-	}
+	free (buffers);
+	free (bus_inputs);
+	free (bus_outputs);
+	free (cb_offsets);
 }
 
 void
@@ -584,18 +606,56 @@ AUPlugin::init ()
 	DEBUG_TRACE (DEBUG::AudioUnits, "count output elements\n");
 	unit->GetElementCount (kAudioUnitScope_Output, output_elements);
 
-	if (input_elements > 0) {
-		/* setup render callback: the plugin calls this to get input data
-		 */
+	cb_offsets = (framecnt_t*) calloc (input_elements, sizeof(uint32_t));
+	bus_inputs = (uint32_t*) calloc (input_elements, sizeof(uint32_t));
+	bus_outputs = (uint32_t*) calloc (output_elements, sizeof(uint32_t));
 
-		AURenderCallbackStruct renderCallbackInfo;
+	for (size_t i = 0; i < output_elements; ++i) {
+		unit->Reset (kAudioUnitScope_Output, i);
+		AudioStreamBasicDescription fmt;
+		err = unit->GetFormat (kAudioUnitScope_Output, i, fmt);
+		if (err == noErr) {
+			bus_outputs[i] = fmt.mChannelsPerFrame;
+		}
+		CFStringRef name;
+		UInt32 sz = sizeof (CFStringRef);
+		if (AudioUnitGetProperty (unit->AU(), kAudioUnitProperty_ElementName, kAudioUnitScope_Output,
+					i, &name, &sz) == noErr
+				&& sz > 0) {
+			_bus_name_out.push_back (CFStringRefToStdString (name));
+			CFRelease(name);
+		} else {
+			_bus_name_out.push_back (string_compose ("Audio-Bus %1", i));
+		}
+	}
 
+	for (size_t i = 0; i < input_elements; ++i) {
+		unit->Reset (kAudioUnitScope_Input, i);
+		AudioStreamBasicDescription fmt;
+		err = unit->GetFormat (kAudioUnitScope_Input, i, fmt);
+		if (err == noErr) {
+			bus_inputs[i] = fmt.mChannelsPerFrame;
+		}
+		CFStringRef name;
+		UInt32 sz = sizeof (CFStringRef);
+		if (AudioUnitGetProperty (unit->AU(), kAudioUnitProperty_ElementName, kAudioUnitScope_Input,
+					i, &name, &sz) == noErr
+				&& sz > 0) {
+			_bus_name_in.push_back (CFStringRefToStdString (name));
+			CFRelease(name);
+		} else {
+			_bus_name_in.push_back (string_compose ("Audio-Bus %1", i));
+		}
+	}
+
+	for (size_t i = 0; i < input_elements; ++i) {
+		/* setup render callback: the plugin calls this to get input data */
+		AURenderCallbackStruct renderCallbackInfo;
 		renderCallbackInfo.inputProc = _render_callback;
 		renderCallbackInfo.inputProcRefCon = this;
-
 		DEBUG_TRACE (DEBUG::AudioUnits, "set render callback in input scope\n");
 		if ((err = unit->SetProperty (kAudioUnitProperty_SetRenderCallback, kAudioUnitScope_Input,
-					      0, (void*) &renderCallbackInfo, sizeof(renderCallbackInfo))) != 0) {
+					      i, (void*) &renderCallbackInfo, sizeof(renderCallbackInfo))) != 0) {
 			error << string_compose (_("cannot install render callback (err = %1)"), err) << endmsg;
 			throw failed_constructor();
 		}
@@ -895,7 +955,12 @@ AUPlugin::default_value (uint32_t port)
 framecnt_t
 AUPlugin::signal_latency () const
 {
-	return unit->Latency() * _session.frame_rate();
+	guint lat = g_atomic_int_get (&_current_latency);;
+	if (lat == UINT_MAX) {
+		lat = unit->Latency() * _session.frame_rate();
+		g_atomic_int_set (&_current_latency, lat);
+	}
+	return lat;
 }
 
 void
@@ -1022,8 +1087,6 @@ AUPlugin::set_block_size (pframes_t nframes)
 		activate ();
 	}
 
-	_current_block_size = nframes;
-
 	return 0;
 }
 
@@ -1036,14 +1099,14 @@ AUPlugin::configure_io (ChanCount in, ChanCount out)
 	if (audio_input_cnt > 0) {
 		in.set (DataType::AUDIO, audio_input_cnt);
 	}
-	int32_t audio_in = in.n_audio();
+	const int32_t audio_in = in.n_audio();
 
 	DEBUG_TRACE (DEBUG::AudioUnits, string_compose ("configure %1 for %2 in %3 out\n", name(), in, out));
 
 	if (initialized) {
 		//if we are already running with the requested i/o config, bail out here
 		if ( (audio_in==input_channels) && (audio_out==output_channels) ) {
-			return 0;
+			return true;
 		} else {
 			deactivate ();
 		}
@@ -1063,41 +1126,104 @@ AUPlugin::configure_io (ChanCount in, ChanCount out)
 	streamFormat.mFramesPerPacket = 1;
 
 	/* apple says that for non-interleaved data, these
-	   values always refer to a single channel.
-	*/
+	 * values always refer to a single channel.
+	 */
 	streamFormat.mBytesPerPacket = 4;
 	streamFormat.mBytesPerFrame = 4;
 
-	streamFormat.mChannelsPerFrame = audio_in;
+	configured_input_busses = 0;
+	configured_output_busses = 0;
+	/* reset busses */
+	for (size_t i = 0; i < output_elements; ++i) {
+		unit->Reset (kAudioUnitScope_Output, i);
+	}
+	for (size_t i = 0; i < input_elements; ++i) {
+		unit->Reset (kAudioUnitScope_Input, i);
+	}
+
+	/* now assign the channels to available busses */
+	uint32_t used_in = 0;
+	uint32_t used_out = 0;
 
-	if (set_input_format (streamFormat) != 0) {
-		return -1;
+	if (variable_inputs || input_elements == 1) {
+		// we only ever use the first bus
+		if (input_elements > 1) {
+			warning << string_compose (_("AU %1 has multiple input busses and variable port count."), name()) << endmsg;
+		}
+		streamFormat.mChannelsPerFrame = audio_in;
+		if (set_stream_format (kAudioUnitScope_Input, 0, streamFormat) != 0) {
+			return false;
+		}
+		configured_input_busses = 1;
+		used_in = audio_in;
+	} else {
+		configured_input_busses = 0;
+		uint32_t remain = audio_in;
+		for (uint32_t bus = 0; remain > 0 && bus < input_elements; ++bus) {
+			uint32_t cnt = std::min (remain, bus_inputs[bus]);
+			if (cnt == 0) { continue; }
+			DEBUG_TRACE (DEBUG::AudioUnits, string_compose ("%1 configure input bus: %2 chn: %3", name(), bus, cnt));
+
+			streamFormat.mChannelsPerFrame = cnt;
+			if (set_stream_format (kAudioUnitScope_Input, bus, streamFormat) != 0) {
+				return false;
+			}
+			used_in += cnt;
+			++configured_input_busses;
+			remain -= cnt;
+		}
 	}
 
-	streamFormat.mChannelsPerFrame = audio_out;
+	if (variable_outputs || output_elements == 1) {
+		if (output_elements > 1) {
+			warning << string_compose (_("AU %1 has multiple output busses and variable port count."), name()) << endmsg;
+		}
 
-	if (set_output_format (streamFormat) != 0) {
-		return -1;
+		streamFormat.mChannelsPerFrame = audio_out;
+		if (set_stream_format (kAudioUnitScope_Output, 0, streamFormat) != 0) {
+			return false;
+		}
+		configured_output_busses = 1;
+		used_out = audio_out;
+	} else {
+		uint32_t remain = audio_out;
+		configured_output_busses = 0;
+		for (uint32_t bus = 0; remain > 0 && bus < output_elements; ++bus) {
+			uint32_t cnt = std::min (remain, bus_outputs[bus]);
+			if (cnt == 0) { continue; }
+			DEBUG_TRACE (DEBUG::AudioUnits, string_compose ("%1 configure output bus: %2 chn: %3", name(), bus, cnt));
+			streamFormat.mChannelsPerFrame = cnt;
+			if (set_stream_format (kAudioUnitScope_Output, bus, streamFormat) != 0) {
+				return false;
+			}
+			used_out += cnt;
+			remain -= cnt;
+			++configured_output_busses;
+		}
 	}
 
+	free (buffers);
+	buffers = (AudioBufferList *) malloc (offsetof(AudioBufferList, mBuffers) +
+					      used_out * sizeof(::AudioBuffer));
+
+	input_channels = used_in;
+	output_channels = used_out;
 	/* reset plugin info to show currently configured state */
 
-	_info->n_inputs = in;
-	_info->n_outputs = out;
+	_info->n_inputs = ChanCount (DataType::AUDIO, used_in) + ChanCount (DataType::MIDI, _has_midi_input ? 1 : 0);
+	_info->n_outputs = ChanCount (DataType::AUDIO, used_out);
 
 	if (was_initialized) {
 		activate ();
 	}
 
-	return 0;
+	return true;
 }
 
 ChanCount
 AUPlugin::input_streams() const
 {
 	ChanCount c;
-
-
 	if (input_channels < 0) {
 		// force PluginIoReConfigure -- see also commit msg e38eb06
 		c.set (DataType::AUDIO, 0);
@@ -1106,7 +1232,6 @@ AUPlugin::input_streams() const
 		c.set (DataType::AUDIO, input_channels);
 		c.set (DataType::MIDI, _has_midi_input ? 1 : 0);
 	}
-
 	return c;
 }
 
@@ -1115,7 +1240,6 @@ ChanCount
 AUPlugin::output_streams() const
 {
 	ChanCount c;
-
 	if (output_channels < 0) {
 		// force PluginIoReConfigure - see also commit msg e38eb06
 		c.set (DataType::AUDIO, 0);
@@ -1124,43 +1248,73 @@ AUPlugin::output_streams() const
 		c.set (DataType::AUDIO, output_channels);
 		c.set (DataType::MIDI, _has_midi_output ? 1 : 0);
 	}
-
 	return c;
 }
 
 bool
-AUPlugin::can_support_io_configuration (const ChanCount& in, ChanCount& out)
+AUPlugin::can_support_io_configuration (const ChanCount& in, ChanCount& out, ChanCount* imprecise)
 {
-	// Note: We never attempt to multiply-instantiate plugins to meet io configurations.
-
-	int32_t audio_in = in.n_audio();
-	int32_t audio_out;
-	bool found = false;
+	_output_configs.clear ();
+	const int32_t audio_in = in.n_audio();
 	AUPluginInfoPtr pinfo = boost::dynamic_pointer_cast<AUPluginInfo>(get_info());
 
 	/* lets check MIDI first */
 
-	if (in.n_midi() > 0) {
-		if (!_has_midi_input) {
-			return false;
+	if (in.n_midi() > 0 && !_has_midi_input && !imprecise) {
+		return false;
+	}
+
+	vector<pair<int,int> > io_configs = pinfo->cache.io_configs;
+
+	if (input_elements > 1) {
+		const vector<pair<int,int> >& ioc (pinfo->cache.io_configs);
+		for (vector<pair<int,int> >::const_iterator i = ioc.begin(); i != ioc.end(); ++i) {
+			int32_t possible_in = i->first;
+			int32_t possible_out = i->second;
+			if (possible_in < 1 || possible_out < 1) {
+				continue;
+			}
+			for (uint32_t i = 1; i < input_elements; ++i) {
+				// can't use up-to bus_inputs[]
+				// waves' SC-C6(s) for example fails to configure with only 1 input
+				// on the 2nd bus.
+				io_configs.push_back (pair<int,int> (possible_in + bus_inputs[i], possible_out));
+			}
 		}
 	}
 
-	vector<pair<int,int> >& io_configs = pinfo->cache.io_configs;
+	if (output_elements > 1) {
+		const vector<pair<int,int> >& ioc (pinfo->cache.io_configs);
+		for (vector<pair<int,int> >::const_iterator i = ioc.begin(); i != ioc.end(); ++i) {
+			int32_t possible_in = i->first;
+			int32_t possible_out = i->second;
+			if (possible_in < 1 || possible_out < 1) {
+				continue;
+			}
+			for (uint32_t i = 1; i < output_elements; ++i) {
+				int32_t c = bus_outputs[i];
+				for (uint32_t j = 1; j < i; ++j) {
+					c += bus_outputs [j];
+				}
+				io_configs.push_back (pair<int,int> (possible_in, possible_out + c));
+			}
+		}
+	}
 
 	DEBUG_TRACE (DEBUG::AudioUnits, string_compose ("%1 has %2 IO configurations, looking for %3 in, %4 out\n",
 							name(), io_configs.size(), in, out));
 
-	//Ardour expects the plugin to tell it the output
-	//configuration but AU plugins can have multiple I/O
-	//configurations in most cases. so first lets see
-	//if there's a configuration that keeps out==in
-
-	if (in.n_midi() > 0 && audio_in == 0) {
-		audio_out = 2; // prefer stereo version if available.
-	} else {
-		audio_out = audio_in;
+#if 0
+	printf ("AU I/O Configs %s %d\n", name(), io_configs.size());
+	for (vector<pair<int,int> >::iterator i = io_configs.begin(); i != io_configs.end(); ++i) {
+		printf ("- I/O  %d / %d\n", i->first, i->second);
 	}
+#endif
+
+	// preferred setting (provided by plugin_insert)
+	const int preferred_out = out.n_audio ();
+	bool found = false;
+	bool exact_match = false;
 
 	/* kAudioUnitProperty_SupportedNumChannels
 	 * https://developer.apple.com/library/mac/documentation/MusicAudio/Conceptual/AudioUnitProgrammingGuide/TheAudioUnit/TheAudioUnit.html#//apple_ref/doc/uid/TP40003278-CH12-SW20
@@ -1193,21 +1347,50 @@ AUPlugin::can_support_io_configuration (const ChanCount& in, ChanCount& out)
 		int32_t possible_in = i->first;
 		int32_t possible_out = i->second;
 
-		if ((possible_in == audio_in) && (possible_out == audio_out)) {
+		if ((possible_in == audio_in) && (possible_out == preferred_out)) {
 			DEBUG_TRACE (DEBUG::AudioUnits, string_compose ("\tCHOSEN: %1 in %2 out to match in %3 out %4\n",
-									possible_in, possible_out,
-									in, out));
+						possible_in, possible_out,
+						in, out));
 
-			out.set (DataType::MIDI, 0);
-			out.set (DataType::AUDIO, audio_out);
-
-			return 1;
+			// exact match
+			_output_configs.insert (preferred_out);
+			exact_match = true;
+			found = true;
+			break;
 		}
 	}
 
 	/* now allow potentially "imprecise" matches */
+	int32_t audio_out = -1;
+	float penalty = 9999;
+	int used_possible_in = 0;
+#if defined (__clang__)
+#	pragma clang diagnostic push
+#	pragma clang diagnostic ignored "-Wtautological-compare"
+#endif
+
+#define FOUNDCFG(nch) {                            \
+  float p = fabsf ((float)(nch) - preferred_out);  \
+  _output_configs.insert (nch);                    \
+  if ((nch) > preferred_out) { p *= 1.1; }         \
+  if (p < penalty) {                               \
+    used_possible_in = possible_in;                \
+    audio_out = (nch);                             \
+    penalty = p;                                   \
+    found = true;                                  \
+    variable_inputs = possible_in < 0;             \
+    variable_outputs = possible_out < 0;           \
+  }                                                \
+}
 
-	audio_out = -1;
+#define ANYTHINGGOES                               \
+  _output_configs.insert (0);
+
+#define UPTO(nch) {                                \
+  for (int n = 1; n <= nch; ++n) {                 \
+    _output_configs.insert (n);                    \
+  }                                                \
+}
 
 	for (vector<pair<int,int> >::iterator i = io_configs.begin(); i != io_configs.end(); ++i) {
 
@@ -1223,252 +1406,237 @@ AUPlugin::can_support_io_configuration (const ChanCount& in, ChanCount& out)
 		}
 
 		if (possible_in == 0) {
-
-			/* instrument plugin, always legal but throws away inputs ...
-			*/
-
+			/* no inputs, generators & instruments */
 			if (possible_out == -1) {
 				/* any configuration possible, provide stereo output */
-				audio_out = 2;
-				found = true;
+				FOUNDCFG (preferred_out);
+				ANYTHINGGOES;
 			} else if (possible_out == -2) {
-				/* plugins shouldn't really use (0,-2) but might.
-				   any configuration possible, provide stereo output
-				*/
-				audio_out = 2;
-				found = true;
+				/* invalid, should be (0, -1) */
+				FOUNDCFG (preferred_out);
+				ANYTHINGGOES;
 			} else if (possible_out < -2) {
-				/* explicitly variable number of outputs.
-				 *
-				 * We really need to ask the user in this case.
-				 * stereo will be correct in 99.9% of all cases.
-				 */
-				audio_out = 2;
-				found = true;
+				/* variable number of outputs up to -N, */
+				FOUNDCFG (min (-possible_out, preferred_out));
+				UPTO (-possible_out);
 			} else {
 				/* exact number of outputs */
-				audio_out = possible_out;
-				found = true;
+				FOUNDCFG (possible_out);
 			}
 		}
 
 		if (possible_in == -1) {
-
 			/* wildcard for input */
-
 			if (possible_out == -1) {
-				/* out much match in */
-				audio_out = audio_in;
-				found = true;
+				/* out must match in */
+				FOUNDCFG (audio_in);
 			} else if (possible_out == -2) {
 				/* any configuration possible, pick matching */
-				audio_out = audio_in;
-				found = true;
+				FOUNDCFG (preferred_out);
+				ANYTHINGGOES;
 			} else if (possible_out < -2) {
 				/* explicitly variable number of outputs, pick maximum */
-				audio_out = -possible_out;
-				found = true;
+				FOUNDCFG (max (-possible_out, preferred_out));
+				/* and try min, too, in case the penalty is lower */
+				FOUNDCFG (min (-possible_out, preferred_out));
+				UPTO (-possible_out)
 			} else {
 				/* exact number of outputs */
-				audio_out = possible_out;
-				found = true;
+				FOUNDCFG (possible_out);
 			}
 		}
 
 		if (possible_in == -2) {
-
 			if (possible_out == -1) {
 				/* any configuration possible, pick matching */
-				audio_out = audio_in;
-				found = true;
+				FOUNDCFG (preferred_out);
+				ANYTHINGGOES;
 			} else if (possible_out == -2) {
-				/* plugins shouldn't really use (-2,-2) but might.
-				   interpret as (-1,-1).
-				*/
-				audio_out = audio_in;
-				found = true;
+				/* invalid. interpret as (-1, -1) */
+				FOUNDCFG (preferred_out);
+				ANYTHINGGOES;
 			} else if (possible_out < -2) {
-				/* explicitly variable number of outputs, pick maximum */
-				audio_out = -possible_out;
-				found = true;
+				/* invalid,  interpret as (<-2, <-2)
+				 * variable number of outputs up to -N, */
+				FOUNDCFG (min (-possible_out, preferred_out));
+				UPTO (-possible_out)
 			} else {
 				/* exact number of outputs */
-				audio_out = possible_out;
-				found = true;
+				FOUNDCFG (possible_out);
 			}
 		}
 
 		if (possible_in < -2) {
-
 			/* explicit variable number of inputs */
-
-			if (audio_in > -possible_in) {
-				/* request is too large */
+			if (audio_in > -possible_in && imprecise != NULL) {
+				// hide inputs ports
+				imprecise->set (DataType::AUDIO, -possible_in);
 			}
 
-
-			if (possible_out == -1) {
-				/* any output configuration possible, provide stereo out */
-				audio_out = 2;
-				found = true;
+			if (audio_in > -possible_in && imprecise == NULL) {
+				/* request is too large */
+			} else if (possible_out == -1) {
+				/* any output configuration possible */
+				FOUNDCFG (preferred_out);
+				ANYTHINGGOES;
 			} else if (possible_out == -2) {
-				/* plugins shouldn't really use (<-2,-2) but might.
-				   interpret as (<-2,-1): any configuration possible, provide stereo output
-				*/
-				audio_out = 2;
-				found = true;
+				/* invalid. interpret as (<-2, -1) */
+				FOUNDCFG (preferred_out);
+				ANYTHINGGOES;
 			} else if (possible_out < -2) {
-				/* explicitly variable number of outputs.
-				 *
-				 * We really need to ask the user in this case.
-				 * stereo will be correct in 99.9% of all cases.
-				 */
-				audio_out = 2;
-				found = true;
+				/* variable number of outputs up to -N, */
+				FOUNDCFG (min (-possible_out, preferred_out));
+				UPTO (-possible_out)
 			} else {
 				/* exact number of outputs */
-				audio_out = possible_out;
-				found = true;
+				FOUNDCFG (possible_out);
 			}
 		}
 
 		if (possible_in && (possible_in == audio_in)) {
-
 			/* exact number of inputs ... must match obviously */
-
 			if (possible_out == -1) {
-				/* any output configuration possible, provide stereo output */
-				audio_out = 2;
-				found = true;
+				/* any output configuration possible */
+				FOUNDCFG (preferred_out);
+				ANYTHINGGOES;
 			} else if (possible_out == -2) {
-				/* plugins shouldn't really use (>0,-2) but might.
-				   interpret as (>0,-1):
-				   any output configuration possible, provide stereo output
-				*/
-				audio_out = 2;
-				found = true;
+				/* plugins shouldn't really use (>0,-2), interpret as (>0,-1) */
+				FOUNDCFG (preferred_out);
+				ANYTHINGGOES;
 			} else if (possible_out < -2) {
-				/* explicitly variable number of outputs, pick maximum */
-				audio_out = -possible_out;
-				found = true;
+				/* > 0, < -2 is not specified
+				 * interpret as up to -N */
+				FOUNDCFG (min (-possible_out, preferred_out));
+				UPTO (-possible_out)
 			} else {
 				/* exact number of outputs */
-				audio_out = possible_out;
-				found = true;
+				FOUNDCFG (possible_out);
 			}
 		}
+	}
+
+	if (!found && imprecise) {
+		/* try harder */
+		for (vector<pair<int,int> >::iterator i = io_configs.begin(); i != io_configs.end(); ++i) {
+			int32_t possible_in = i->first;
+			int32_t possible_out = i->second;
+
+			assert (possible_in > 0); // all other cases will have been matched above
+			assert (possible_out !=0 || possible_in !=0); // already handled above
 
-		if (found) {
-			if (possible_in < -2 && audio_in == 0) {
-				// input-port count cannot be zero, use as many ports
-				// as outputs, but at most abs(possible_in)
-				audio_input_cnt = max (1, min (audio_out, -possible_in));
+			imprecise->set (DataType::AUDIO, possible_in);
+			if (possible_out == -1 || possible_out == -2) {
+				FOUNDCFG (2);
+			} else if (possible_out < -2) {
+				/* explicitly variable number of outputs, pick maximum */
+				FOUNDCFG (min (-possible_out, preferred_out));
+			} else {
+				/* exact number of outputs */
+				FOUNDCFG (possible_out);
 			}
-			break;
+			// ideally we'll also find the closest, best matching
+			// input configuration with minimal output penalty...
 		}
-
 	}
 
-	if (found) {
-		out.set (DataType::MIDI, 0); /// XXX
-		out.set (DataType::AUDIO, audio_out);
-		DEBUG_TRACE (DEBUG::AudioUnits, string_compose ("\tCHOSEN: in %1 out %2\n", in, out));
-	} else {
+	if (!found) {
 		DEBUG_TRACE (DEBUG::AudioUnits, string_compose ("\tFAIL: no io configs match %1\n", in));
 		return false;
 	}
 
-	return true;
-}
-
-int
-AUPlugin::set_input_format (AudioStreamBasicDescription& fmt)
-{
-	return set_stream_format (kAudioUnitScope_Input, input_elements, fmt);
-}
-
-int
-AUPlugin::set_output_format (AudioStreamBasicDescription& fmt)
-{
-	if (set_stream_format (kAudioUnitScope_Output, output_elements, fmt) != 0) {
-		return -1;
-	}
-
-	if (buffers) {
-		free (buffers);
-		buffers = 0;
+	if (exact_match) {
+		out.set (DataType::MIDI, 0); // currently always zero
+		out.set (DataType::AUDIO, preferred_out);
+	} else {
+		if (used_possible_in < -2 && audio_in == 0) {
+			// input-port count cannot be zero, use as many ports
+			// as outputs, but at most abs(possible_in)
+			audio_input_cnt = max (1, min (audio_out, -used_possible_in));
+		}
+		out.set (DataType::MIDI, 0); /// XXX
+		out.set (DataType::AUDIO, audio_out);
 	}
+	DEBUG_TRACE (DEBUG::AudioUnits, string_compose ("\tCHOSEN: in %1 out %2\n", in, out));
 
-	buffers = (AudioBufferList *) malloc (offsetof(AudioBufferList, mBuffers) +
-					      fmt.mChannelsPerFrame * sizeof(::AudioBuffer));
-
-	return 0;
+#if defined (__clang__)
+#	pragma clang diagnostic pop
+#endif
+	return true;
 }
 
 int
-AUPlugin::set_stream_format (int scope, uint32_t cnt, AudioStreamBasicDescription& fmt)
+AUPlugin::set_stream_format (int scope, uint32_t bus, AudioStreamBasicDescription& fmt)
 {
 	OSErr result;
 
-	for (uint32_t i = 0; i < cnt; ++i) {
-		DEBUG_TRACE (DEBUG::AudioUnits, string_compose ("set stream format for %1, scope = %2 element %3\n",
-								(scope == kAudioUnitScope_Input ? "input" : "output"),
-								scope, cnt));
-		if ((result = unit->SetFormat (scope, i, fmt)) != 0) {
-			error << string_compose (_("AUPlugin: could not set stream format for %1/%2 (err = %3)"),
-						 (scope == kAudioUnitScope_Input ? "input" : "output"), i, result) << endmsg;
-			return -1;
-		}
-	}
-
-	if (scope == kAudioUnitScope_Input) {
-		input_channels = fmt.mChannelsPerFrame;
-	} else {
-		output_channels = fmt.mChannelsPerFrame;
+	DEBUG_TRACE (DEBUG::AudioUnits, string_compose ("set stream format for %1, scope = %2 element %3\n",
+				(scope == kAudioUnitScope_Input ? "input" : "output"),
+				scope, bus));
+	if ((result = unit->SetFormat (scope, bus, fmt)) != 0) {
+		error << string_compose (_("AUPlugin: could not set stream format for %1/%2 (err = %3)"),
+				(scope == kAudioUnitScope_Input ? "input" : "output"), bus, result) << endmsg;
+		return -1;
 	}
-
 	return 0;
 }
 
 OSStatus
 AUPlugin::render_callback(AudioUnitRenderActionFlags*,
 			  const AudioTimeStamp*,
-			  UInt32,
-			  UInt32       inNumberFrames,
-			  AudioBufferList*       ioData)
+			  UInt32 bus,
+			  UInt32 inNumberFrames,
+			  AudioBufferList* ioData)
 {
 	/* not much to do with audio - the data is already in the buffers given to us in connect_and_run() */
 
-	// DEBUG_TRACE (DEBUG::AudioUnits, string_compose ("%1: render callback, frames %2 bufs %3\n",
-	// name(), inNumberFrames, ioData->mNumberBuffers));
+	// DEBUG_TRACE (DEBUG::AudioUnits, string_compose ("%1: render callback, frames %2 bus %3 bufs %4\n",
+	// name(), inNumberFrames, bus, ioData->mNumberBuffers));
 
 	if (input_maxbuf == 0) {
+		DEBUG_TRACE (DEBUG::AudioUnits, "AUPlugin: render callback called illegally!");
 		error << _("AUPlugin: render callback called illegally!") << endmsg;
 		return kAudioUnitErr_CannotDoInCurrentContext;
 	}
+
+	assert (bus < input_elements);
+	uint32_t busoff = 0;
+	for (uint32_t i = 0; i < bus; ++i) {
+		busoff += bus_inputs[i];
+	}
+
 	uint32_t limit = min ((uint32_t) ioData->mNumberBuffers, input_maxbuf);
 
+	ChanCount bufs_count (DataType::AUDIO, 1);
+	BufferSet& silent_bufs = _session.get_silent_buffers(bufs_count);
+
+	/* apply bus offsets */
+
 	for (uint32_t i = 0; i < limit; ++i) {
 		ioData->mBuffers[i].mNumberChannels = 1;
 		ioData->mBuffers[i].mDataByteSize = sizeof (Sample) * inNumberFrames;
 
-		/* we don't use the channel mapping because audiounits are
-		 * never replicated. one plugin instance uses all channels/buffers
-		 * passed to PluginInsert::connect_and_run()
-		 */
-
-		ioData->mBuffers[i].mData = input_buffers->get_audio (i).data (cb_offset + input_offset);
+		bool valid = false;
+		uint32_t idx = input_map->get (DataType::AUDIO, i + busoff, &valid);
+		if (valid) {
+			ioData->mBuffers[i].mData = input_buffers->get_audio (idx).data (cb_offsets[bus] + input_offset);
+		} else {
+			ioData->mBuffers[i].mData = silent_bufs.get_audio(0).data (cb_offsets[bus] + input_offset);
+		}
 	}
-
-	cb_offset += inNumberFrames;
-
+	cb_offsets[bus] += inNumberFrames;
 	return noErr;
 }
 
 int
-AUPlugin::connect_and_run (BufferSet& bufs, ChanMapping in_map, ChanMapping out_map, pframes_t nframes, framecnt_t offset)
+AUPlugin::connect_and_run (BufferSet& bufs,
+		framepos_t start, framepos_t end, double speed,
+		ChanMapping in_map, ChanMapping out_map,
+		pframes_t nframes, framecnt_t offset)
 {
-	Plugin::connect_and_run (bufs, in_map, out_map, nframes, offset);
+	Plugin::connect_and_run(bufs, start, end, speed, in_map, out_map, nframes, offset);
+
+	transport_frame = start;
+	transport_speed = speed;
 
 	AudioUnitRenderActionFlags flags = 0;
 	AudioTimeStamp ts;
@@ -1479,101 +1647,151 @@ AUPlugin::connect_and_run (BufferSet& bufs, ChanMapping in_map, ChanMapping out_
 		_last_nframes = nframes;
 	}
 
-	DEBUG_TRACE (DEBUG::AudioUnits, string_compose ("%1 in %2 out %3 MIDI %4 bufs %5 (available %6)\n",
+	/* test if we can run in-place; only compare audio buffers */
+	bool inplace = true; // TODO check plugin-insert in-place ?
+	ChanMapping::Mappings inmap (in_map.mappings ());
+	ChanMapping::Mappings outmap (out_map.mappings ());
+	if (outmap[DataType::AUDIO].size () == 0) {
+		inplace = false;
+	}
+	if (inmap[DataType::AUDIO].size() > 0 && inmap != outmap) {
+		inplace = false;
+	}
+
+	DEBUG_TRACE (DEBUG::AudioUnits, string_compose ("%1 in %2 out %3 MIDI %4 bufs %5 (available %6) InBus %7 OutBus %8 Inplace: %9 var-i/o %10 %11\n",
 				name(), input_channels, output_channels, _has_midi_input,
-				bufs.count(), bufs.available()));
+				bufs.count(), bufs.available(),
+				configured_input_busses, configured_output_busses, inplace, variable_inputs, variable_outputs));
 
 	/* the apparent number of buffers matches our input configuration, but we know that the bufferset
-	   has the capacity to handle our outputs.
-	   */
+	 * has the capacity to handle our outputs.
+	 */
 
 	assert (bufs.available() >= ChanCount (DataType::AUDIO, output_channels));
 
 	input_buffers = &bufs;
+	input_map = &in_map;
 	input_maxbuf = bufs.count().n_audio(); // number of input audio buffers
 	input_offset = offset;
-	cb_offset = 0;
-
-	buffers->mNumberBuffers = output_channels;
-
-	for (int32_t i = 0; i < output_channels; ++i) {
-		buffers->mBuffers[i].mNumberChannels = 1;
-		buffers->mBuffers[i].mDataByteSize = nframes * sizeof (Sample);
-		/* setting this to 0 indicates to the AU that it can provide buffers here
-		 * if necessary. if it can process in-place, it will use the buffers provided
-		 * as input by ::render_callback() above.
-		 *
-		 * a non-null values tells the plugin to render into the buffer pointed
-		 * at by the value.
-		 */
-		buffers->mBuffers[i].mData = 0;
+	for (size_t i = 0; i < input_elements; ++i) {
+		cb_offsets[i] = 0;
 	}
 
-	if (_has_midi_input) {
+	ChanCount bufs_count (DataType::AUDIO, 1);
+	BufferSet& scratch_bufs = _session.get_scratch_buffers(bufs_count);
 
+	if (_has_midi_input) {
 		uint32_t nmidi = bufs.count().n_midi();
-
 		for (uint32_t i = 0; i < nmidi; ++i) {
-
 			/* one MIDI port/buffer only */
-
 			MidiBuffer& m = bufs.get_midi (i);
-
 			for (MidiBuffer::iterator i = m.begin(); i != m.end(); ++i) {
 				Evoral::MIDIEvent<framepos_t> ev (*i);
-
 				if (ev.is_channel_event()) {
 					const uint8_t* b = ev.buffer();
 					DEBUG_TRACE (DEBUG::AudioUnits, string_compose ("%1: MIDI event %2\n", name(), ev));
 					unit->MIDIEvent (b[0], b[1], b[2], ev.time());
 				}
-
 				/* XXX need to handle sysex and other message types */
 			}
 		}
 	}
 
-	/* does this really mean anything ?
-	*/
-
-	ts.mSampleTime = frames_processed;
-	ts.mFlags = kAudioTimeStampSampleTimeValid;
+	assert (input_maxbuf < 512);
+	std::bitset<512> used_outputs;
 
-	DEBUG_TRACE (DEBUG::AudioUnits, string_compose ("%1 render flags=%2 time=%3 nframes=%4 buffers=%5\n",
-				name(), flags, frames_processed, nframes, buffers->mNumberBuffers));
+	bool ok = true;
+	uint32_t busoff = 0;
+	uint32_t remain = output_channels;
+	for (uint32_t bus = 0; remain > 0 && bus < configured_output_busses; ++bus) {
+		uint32_t cnt;
+		if (variable_outputs || (output_elements == configured_output_busses && configured_output_busses == 1)) {
+			cnt = output_channels;
+		} else {
+			cnt = std::min (remain, bus_outputs[bus]);
+		}
+		assert (cnt > 0);
+
+		buffers->mNumberBuffers = cnt;
+
+		for (uint32_t i = 0; i < cnt; ++i) {
+			buffers->mBuffers[i].mNumberChannels = 1;
+			buffers->mBuffers[i].mDataByteSize = nframes * sizeof (Sample);
+			/* setting this to 0 indicates to the AU that it can provide buffers here
+			 * if necessary. if it can process in-place, it will use the buffers provided
+			 * as input by ::render_callback() above.
+			 *
+			 * a non-null values tells the plugin to render into the buffer pointed
+			 * at by the value.
+			 */
+			if (inplace) {
+				buffers->mBuffers[i].mData = 0;
+			} else {
+				bool valid = false;
+				uint32_t idx = out_map.get (DataType::AUDIO, i + busoff, &valid);
+				if (valid) {
+					buffers->mBuffers[i].mData = bufs.get_audio (idx).data (offset);
+				} else {
+					buffers->mBuffers[i].mData = scratch_bufs.get_audio(0).data(offset);
+				}
+			}
+		}
 
-	if ((err = unit->Render (&flags, &ts, 0, nframes, buffers)) == noErr) {
+		/* does this really mean anything ?  */
+		ts.mSampleTime = frames_processed;
+		ts.mFlags = kAudioTimeStampSampleTimeValid;
 
-		input_maxbuf = 0;
-		frames_processed += nframes;
+		DEBUG_TRACE (DEBUG::AudioUnits, string_compose ("%1 render flags=%2 time=%3 nframes=%4 bus=%5 buffers=%6\n",
+					name(), flags, frames_processed, nframes, bus, buffers->mNumberBuffers));
 
-		DEBUG_TRACE (DEBUG::AudioUnits, string_compose ("%1 rendered %2 buffers of %3\n",
-					name(), buffers->mNumberBuffers, output_channels));
+		if ((err = unit->Render (&flags, &ts, bus, nframes, buffers)) == noErr) {
 
-		int32_t limit = min ((int32_t) buffers->mNumberBuffers, output_channels);
-		int32_t i;
+			DEBUG_TRACE (DEBUG::AudioUnits, string_compose ("%1 rendered %2 buffers of %3\n",
+						name(), buffers->mNumberBuffers, output_channels));
 
-		for (i = 0; i < limit; ++i) {
-			Sample* expected_buffer_address= bufs.get_audio (i).data (offset);
-			if (expected_buffer_address != buffers->mBuffers[i].mData) {
-				/* plugin provided its own buffer for output so copy it back to where we want it
-				*/
-				memcpy (expected_buffer_address, buffers->mBuffers[i].mData, nframes * sizeof (Sample));
+			uint32_t limit = std::min ((uint32_t) buffers->mNumberBuffers, cnt);
+			for (uint32_t i = 0; i < limit; ++i) {
+				bool valid = false;
+				uint32_t idx = out_map.get (DataType::AUDIO, i + busoff, &valid);
+				if (!valid) continue;
+				used_outputs.set (i + busoff);
+				Sample* expected_buffer_address = bufs.get_audio (idx).data (offset);
+				if (expected_buffer_address != buffers->mBuffers[i].mData) {
+					/* plugin provided its own buffer for output so copy it back to where we want it */
+					memcpy (expected_buffer_address, buffers->mBuffers[i].mData, nframes * sizeof (Sample));
+				}
 			}
+		} else {
+			DEBUG_TRACE (DEBUG::AudioUnits, string_compose (_("AU: render error for %1, bus %2 status = %3\n"), name(), bus, err));
+			error << string_compose (_("AU: render error for %1, bus %2 status = %3"), name(), bus, err) << endmsg;
+			ok = false;
+			break;
 		}
 
-		/* now silence any buffers that were passed in but the that the plugin
-		 * did not fill/touch/use.
-		 */
+		remain -= cnt;
+		busoff += bus_outputs[bus];
+	}
 
-		for (;i < output_channels; ++i) {
-			memset (bufs.get_audio (i).data (offset), 0, nframes * sizeof (Sample));
-		}
+	/* now silence any buffers that were passed in but the that the plugin
+	 * did not fill/touch/use.
+	 *
+	 * TODO: optimize, when plugin-insert is processing in-place
+	 * unconnected buffers are (also) cleared there.
+	 */
+	for (uint32_t i = 0; i < input_maxbuf; ++i) {
+		if (used_outputs.test (i)) { continue; }
+		bool valid = false;
+		uint32_t idx = out_map.get (DataType::AUDIO, i, &valid);
+		if (!valid) continue;
+		memset (bufs.get_audio (idx).data (offset), 0, nframes * sizeof (Sample));
+	}
+
+	input_maxbuf = 0;
 
+	if (ok) {
+		frames_processed += nframes;
 		return 0;
 	}
-
-	error << string_compose (_("AU: render error for %1, status = %2"), name(), err) << endmsg;
 	return -1;
 }
 
@@ -1594,16 +1812,16 @@ AUPlugin::get_beat_and_tempo_callback (Float64* outCurrentBeat,
 		return kAudioUnitErr_CannotDoInCurrentContext;
 	}
 
-	Timecode::BBT_Time bbt;
-	TempoMetric metric = tmap.metric_at (_session.transport_frame() + input_offset);
-	tmap.bbt_time (_session.transport_frame() + input_offset, bbt);
+	TempoMetric metric = tmap.metric_at (transport_frame + input_offset);
+	Timecode::BBT_Time bbt = _session.tempo_map().bbt_at_frame (transport_frame + input_offset);
 
 	if (outCurrentBeat) {
+		const double ppq_scaling = metric.meter().note_divisor() / 4.0;
 		float beat;
-		beat = metric.meter().divisions_per_bar() * bbt.bars;
-		beat += bbt.beats;
+		beat = metric.meter().divisions_per_bar() * (bbt.bars - 1);
+		beat += (bbt.beats - 1);
 		beat += bbt.ticks / Timecode::BBT_Time::ticks_per_beat;
-		*outCurrentBeat = beat;
+		*outCurrentBeat = beat * ppq_scaling;
 	}
 
 	if (outCurrentTempo) {
@@ -1633,18 +1851,16 @@ AUPlugin::get_musical_time_location_callback (UInt32*   outDeltaSampleOffsetToNe
 		return kAudioUnitErr_CannotDoInCurrentContext;
 	}
 
-	Timecode::BBT_Time bbt;
-	TempoMetric metric = tmap.metric_at (_session.transport_frame() + input_offset);
-	tmap.bbt_time (_session.transport_frame() + input_offset, bbt);
+	TempoMetric metric = tmap.metric_at (transport_frame + input_offset);
+	Timecode::BBT_Time bbt = _session.tempo_map().bbt_at_frame (transport_frame + input_offset);
 
 	if (outDeltaSampleOffsetToNextBeat) {
 		if (bbt.ticks == 0) {
 			/* on the beat */
 			*outDeltaSampleOffsetToNextBeat = 0;
 		} else {
-			*outDeltaSampleOffsetToNextBeat = (UInt32)
-				floor (((Timecode::BBT_Time::ticks_per_beat - bbt.ticks)/Timecode::BBT_Time::ticks_per_beat) * // fraction of a beat to next beat
-				       metric.tempo().frames_per_beat (_session.frame_rate())); // frames per beat
+			double const beat_frac_to_next = (Timecode::BBT_Time::ticks_per_beat - bbt.ticks) / Timecode::BBT_Time::ticks_per_beat;
+			*outDeltaSampleOffsetToNextBeat = tmap.frame_at_beat (tmap.beat_at_frame (transport_frame + input_offset) + beat_frac_to_next);
 		}
 	}
 
@@ -1678,22 +1894,20 @@ AUPlugin::get_transport_state_callback (Boolean*  outIsPlaying,
 					Float64*  outCycleStartBeat,
 					Float64*  outCycleEndBeat)
 {
-	bool rolling;
-	float speed;
+	const bool rolling = (transport_speed != 0);
+	const bool last_transport_rolling = (last_transport_speed != 0);
 
 	DEBUG_TRACE (DEBUG::AudioUnits, "AU calls ardour transport state callback\n");
 
-	rolling = _session.transport_rolling();
-	speed = _session.transport_speed ();
 
 	if (outIsPlaying) {
-		*outIsPlaying = _session.transport_rolling();
+		*outIsPlaying = rolling;
 	}
 
 	if (outTransportStateChanged) {
 		if (rolling != last_transport_rolling) {
 			*outTransportStateChanged = true;
-		} else if (speed != last_transport_speed) {
+		} else if (transport_speed != last_transport_speed) {
 			*outTransportStateChanged = true;
 		} else {
 			*outTransportStateChanged = false;
@@ -1704,13 +1918,14 @@ AUPlugin::get_transport_state_callback (Boolean*  outIsPlaying,
 		/* this assumes that the AU can only call this host callback from render context,
 		   where input_offset is valid.
 		*/
-		*outCurrentSampleInTimeLine = _session.transport_frame() + input_offset;
+		*outCurrentSampleInTimeLine = transport_frame + input_offset;
 	}
 
 	if (outIsCycling) {
+		// TODO check bounce-processing
 		Location* loc = _session.locations()->auto_loop_location();
 
-		*outIsCycling = (loc && _session.transport_rolling() && _session.get_play_loop());
+		*outIsCycling = (loc && rolling && _session.get_play_loop());
 
 		if (*outIsCycling) {
 
@@ -1730,7 +1945,7 @@ AUPlugin::get_transport_state_callback (Boolean*  outIsPlaying,
 
 				if (outCycleStartBeat) {
 					TempoMetric metric = tmap.metric_at (loc->start() + input_offset);
-					_session.tempo_map().bbt_time (loc->start(), bbt);
+					bbt = _session.tempo_map().bbt_at_frame (loc->start() + input_offset);
 
 					float beat;
 					beat = metric.meter().divisions_per_bar() * bbt.bars;
@@ -1742,7 +1957,7 @@ AUPlugin::get_transport_state_callback (Boolean*  outIsPlaying,
 
 				if (outCycleEndBeat) {
 					TempoMetric metric = tmap.metric_at (loc->end() + input_offset);
-					_session.tempo_map().bbt_time (loc->end(), bbt);
+					bbt = _session.tempo_map().bbt_at_frame (loc->end() + input_offset);
 
 					float beat;
 					beat = metric.meter().divisions_per_bar() * bbt.bars;
@@ -1755,8 +1970,7 @@ AUPlugin::get_transport_state_callback (Boolean*  outIsPlaying,
 		}
 	}
 
-	last_transport_rolling = rolling;
-	last_transport_speed = speed;
+	last_transport_speed = transport_speed;
 
 	return noErr;
 }
@@ -1775,6 +1989,60 @@ AUPlugin::automatable() const
 	return automates;
 }
 
+Plugin::IOPortDescription
+AUPlugin::describe_io_port (ARDOUR::DataType dt, bool input, uint32_t id) const
+{
+	std::stringstream ss;
+	switch (dt) {
+		case DataType::AUDIO:
+			break;
+		case DataType::MIDI:
+			ss << _("Midi");
+			break;
+		default:
+			ss << _("?");
+			break;
+	}
+
+	if (dt == DataType::AUDIO) {
+		if (input) {
+			uint32_t pid = id;
+			for (uint32_t bus = 0; bus < input_elements; ++bus) {
+				if (pid < bus_inputs[bus]) {
+					id = pid;
+					ss << _bus_name_in[bus];
+					ss << " / Bus " << (1 + bus);
+					break;
+				}
+				pid -= bus_inputs[bus];
+			}
+		}
+		else {
+			uint32_t pid = id;
+			for (uint32_t bus = 0; bus < output_elements; ++bus) {
+				if (pid < bus_outputs[bus]) {
+					id = pid;
+					ss << _bus_name_out[bus];
+					ss << " / Bus " << (1 + bus);
+					break;
+				}
+				pid -= bus_outputs[bus];
+			}
+		}
+	}
+
+	if (input) {
+		ss << " " << _("In") << " ";
+	} else {
+		ss << " " << _("Out") << " ";
+	}
+
+	ss << (id + 1);
+
+	Plugin::IOPortDescription iod (ss.str());
+	return iod;
+}
+
 string
 AUPlugin::describe_parameter (Evoral::Parameter param)
 {
@@ -1833,7 +2101,7 @@ AUPlugin::parameter_is_output (uint32_t param) const
 void
 AUPlugin::add_state (XMLNode* root) const
 {
-	LocaleGuard lg (X_("C"));
+	LocaleGuard lg;
 	CFDataRef xmlData;
 	CFPropertyListRef propertyList;
 
@@ -1872,7 +2140,7 @@ AUPlugin::set_state(const XMLNode& node, int version)
 {
 	int ret = -1;
 	CFPropertyListRef propertyList;
-	LocaleGuard lg (X_("C"));
+	LocaleGuard lg;
 
 	if (node.name() != state_node_name()) {
 		error << _("Bad node sent to AUPlugin::set_state") << endmsg;
@@ -2485,6 +2753,8 @@ AUPluginInfo::discover (bool scan_only)
 
 	if (!Glib::file_test (au_cache_path(), Glib::FILE_TEST_EXISTS)) {
 		ARDOUR::BootMessage (_("Discovering AudioUnit plugins (could take some time ...)"));
+		// flush RAM cache -- after clear_cache()
+		cached_info.clear();
 	}
 	// create crash log file
 	au_start_crashlog ();
@@ -2645,6 +2915,8 @@ AUPluginInfo::discover_by_description (PluginInfoList& plugs, CAComponentDescrip
 			continue;
 		}
 
+		bool has_midi_in = false;
+
 		AUPluginInfoPtr info (new AUPluginInfo
 				      (boost::shared_ptr<CAComponentDescription> (new CAComponentDescription(temp))));
 
@@ -2669,9 +2941,11 @@ AUPluginInfo::discover_by_description (PluginInfoList& plugs, CAComponentDescrip
 			break;
 		case kAudioUnitType_MusicDevice:
 			info->category = _("AudioUnit Instruments");
+			has_midi_in = true;
 			break;
 		case kAudioUnitType_MusicEffect:
 			info->category = _("AudioUnit MusicEffects");
+			has_midi_in = true;
 			break;
 		case kAudioUnitType_Effect:
 			info->category = _("AudioUnit Effects");
@@ -2699,8 +2973,7 @@ AUPluginInfo::discover_by_description (PluginInfoList& plugs, CAComponentDescrip
 		info->type = ARDOUR::AudioUnit;
 		info->unique_id = stringify_descriptor (*info->descriptor);
 
-		/* XXX not sure of the best way to handle plugin versioning yet
-		 */
+		/* XXX not sure of the best way to handle plugin versioning yet */
 
 		CAComponent cacomp (*info->descriptor);
 
@@ -2738,6 +3011,8 @@ AUPluginInfo::discover_by_description (PluginInfoList& plugs, CAComponentDescrip
 				info->n_inputs.set (DataType::AUDIO, 1);
 			}
 
+			info->n_inputs.set (DataType::MIDI, has_midi_in ? 1 : 0);
+
 			if (possible_out > 0) {
 				info->n_outputs.set (DataType::AUDIO, possible_out);
 			} else {
@@ -2820,20 +3095,34 @@ AUPluginInfo::cached_io_configuration (const std::string& unique_id,
 	}
 
 	if (ret > 0) {
-
-		/* no explicit info available, so default to 1in/1out */
-
-		/* XXX this is wrong. we should be indicating wildcard values */
-
+		/* AU is expected to deal with same channel valance in and out */
 		cinfo.io_configs.push_back (pair<int,int> (-1, -1));
-
 	} else {
-
-		/* store each configuration */
-
-		for (uint32_t n = 0; n < cnt; ++n) {
-			cinfo.io_configs.push_back (pair<int,int> (channel_info[n].inChannels,
-								   channel_info[n].outChannels));
+		/* CAAudioUnit::GetChannelInfo silently merges bus formats
+		 * check if this was the case and if so, add
+		 * bus configs as incremental options.
+		 */
+		Boolean* isWritable = 0;
+		UInt32	dataSize = 0;
+		OSStatus result = AudioUnitGetPropertyInfo (unit.AU(),
+				kAudioUnitProperty_SupportedNumChannels,
+				kAudioUnitScope_Global, 0,
+				&dataSize, isWritable);
+		if (result != noErr && (comp.Desc().IsGenerator() || comp.Desc().IsMusicDevice())) {
+			/* incrementally add busses */
+			int in = 0;
+			int out = 0;
+			for (uint32_t n = 0; n < cnt; ++n) {
+				in += channel_info[n].inChannels;
+				out += channel_info[n].outChannels;
+				cinfo.io_configs.push_back (pair<int,int> (in, out));
+			}
+		} else {
+			/* store each configuration */
+			for (uint32_t n = 0; n < cnt; ++n) {
+				cinfo.io_configs.push_back (pair<int,int> (channel_info[n].inChannels,
+							channel_info[n].outChannels));
+			}
 		}
 
 		free (channel_info);
@@ -2846,6 +3135,17 @@ AUPluginInfo::cached_io_configuration (const std::string& unique_id,
 }
 
 void
+AUPluginInfo::clear_cache ()
+{
+	const string& fn = au_cache_path();
+	if (Glib::file_test (fn, Glib::FILE_TEST_EXISTS)) {
+		::g_unlink(fn.c_str());
+	}
+	// keep cached_info in RAM until restart or re-scan
+	cached_info.clear();
+}
+
+void
 AUPluginInfo::add_cached_info (const std::string& id, AUPluginCachedInfo& cinfo)
 {
 	cached_info[id] = cinfo;
@@ -2913,7 +3213,7 @@ AUPluginInfo::load_cached_info ()
 	}
 
 	//initial version has incorrectly stored i/o info, and/or garbage chars.
-	const XMLProperty* version = root->property(X_("version"));
+	XMLProperty const * version = root->property(X_("version"));
 	if (! ((version != NULL) && (version->value() == X_(AU_CACHE_VERSION)))) {
 		error << "au_cache is not correct version.  AU plugins will be re-scanned" << endmsg;
 		return -1;
@@ -2931,7 +3231,7 @@ AUPluginInfo::load_cached_info ()
 
 			const XMLNode* gchild;
 			const XMLNodeList gchildren = child->children();
-			const XMLProperty* prop = child->property (X_("id"));
+			XMLProperty const * prop = child->property (X_("id"));
 
 			if (!prop) {
 				continue;
@@ -2969,8 +3269,8 @@ AUPluginInfo::load_cached_info ()
 
 					int in;
 					int out;
-					const XMLProperty* iprop;
-					const XMLProperty* oprop;
+					XMLProperty const * iprop;
+					XMLProperty const * oprop;
 
 					if (((iprop = gchild->property (X_("in"))) != 0) &&
 					    ((oprop = gchild->property (X_("out"))) != 0)) {
@@ -3012,7 +3312,7 @@ AUPluginInfo::stringify_descriptor (const CAComponentDescription& desc)
 }
 
 bool
-AUPluginInfo::needs_midi_input ()
+AUPluginInfo::needs_midi_input () const
 {
 	return is_effect_with_midi_input () || is_instrument ();
 }
@@ -3067,6 +3367,19 @@ AUPlugin::create_parameter_listener (AUEventListenerProc cb, void* arg, float in
 
 	_parameter_listener_arg = arg;
 
+	// listen for latency changes
+	AudioUnitEvent event;
+	event.mEventType = kAudioUnitEvent_PropertyChange;
+	event.mArgument.mProperty.mAudioUnit = unit->AU();
+	event.mArgument.mProperty.mPropertyID = kAudioUnitProperty_Latency;
+	event.mArgument.mProperty.mScope = kAudioUnitScope_Global;
+	event.mArgument.mProperty.mElement = 0;
+
+	if (AUEventListenerAddEventType (_parameter_listener, _parameter_listener_arg, &event) != noErr) {
+		PBD::error << "Failed to create latency event listener\n";
+		// TODO don't cache _current_latency
+	}
+
 	return 0;
 }
 
@@ -3163,6 +3476,15 @@ AUPlugin::_parameter_change_listener (void* arg, void* src, const AudioUnitEvent
 void
 AUPlugin::parameter_change_listener (void* /*arg*/, void* src, const AudioUnitEvent* event, UInt64 /*host_time*/, Float32 new_value)
 {
+	if (event->mEventType == kAudioUnitEvent_PropertyChange) {
+		if (event->mArgument.mProperty.mPropertyID == kAudioUnitProperty_Latency) {
+			DEBUG_TRACE (DEBUG::AudioUnits, string_compose("AU Latency Change Event %1 <> %2\n", new_value, unit->Latency()));
+			guint lat = unit->Latency() * _session.frame_rate();
+			g_atomic_int_set (&_current_latency, lat);
+		}
+		return;
+	}
+
         ParameterMap::iterator i;
 
         if ((i = parameter_map.find (event->mArgument.mParameter.mParameterID)) == parameter_map.end()) {
diff --git a/libs/ardour/audioanalyser.cc b/libs/ardour/audioanalyser.cc
index 7013d34..f90edd3 100644
--- a/libs/ardour/audioanalyser.cc
+++ b/libs/ardour/audioanalyser.cc
@@ -33,7 +33,7 @@
 
 #include <cstring>
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace Vamp;
diff --git a/libs/ardour/audioengine.cc b/libs/ardour/audioengine.cc
index 07a70ae..30c2113 100644
--- a/libs/ardour/audioengine.cc
+++ b/libs/ardour/audioengine.cc
@@ -55,7 +55,7 @@
 #include "ardour/process_thread.h"
 #include "ardour/session.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
@@ -114,6 +114,7 @@ AudioEngine::~AudioEngine ()
 	for (BackendMap::const_iterator i = _backends.begin(); i != _backends.end(); ++i) {
 		i->second->deinstantiate();
 	}
+	delete _main_thread;
 }
 
 AudioEngine*
@@ -411,7 +412,7 @@ AudioEngine::process_callback (pframes_t nframes)
 
 #else
 	if (_session->silent()) {
-		PortManager::silence (nframes);
+		PortManager::silence (nframes, _session);
 	}
 #endif
 
@@ -1234,6 +1235,7 @@ AudioEngine::thread_init_callback (void* arg)
 	AsyncMIDIPort::set_process_thread (pthread_self());
 
 	if (arg) {
+		delete AudioEngine::instance()->_main_thread;
 		/* the special thread created/managed by the backend */
 		AudioEngine::instance()->_main_thread = new ProcessThread;
 	}
diff --git a/libs/ardour/audiofilesource.cc b/libs/ardour/audiofilesource.cc
index bb3c18f..bb0b4da 100644
--- a/libs/ardour/audiofilesource.cc
+++ b/libs/ardour/audiofilesource.cc
@@ -61,7 +61,7 @@
 #include <AudioToolbox/AudioFormat.h>
 #endif // HAVE_COREAUDIO
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
diff --git a/libs/ardour/audioregion.cc b/libs/ardour/audioregion.cc
index ddd152b..873d411 100644
--- a/libs/ardour/audioregion.cc
+++ b/libs/ardour/audioregion.cc
@@ -55,7 +55,7 @@
 #include "ardour/coreaudiosource.h"
 #endif // HAVE_COREAUDIO
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 #include <locale.h>
 
 using namespace std;
@@ -213,7 +213,7 @@ AudioRegion::register_properties ()
 	, _fade_in (Properties::fade_in, boost::shared_ptr<AutomationList> (new AutomationList (*other->_fade_in.val()))) \
 	, _inverse_fade_in (Properties::fade_in, boost::shared_ptr<AutomationList> (new AutomationList (*other->_inverse_fade_in.val()))) \
 	, _fade_out (Properties::fade_in, boost::shared_ptr<AutomationList> (new AutomationList (*other->_fade_out.val()))) \
-	, _inverse_fade_out (Properties::fade_in, boost::shared_ptr<AutomationList> (new AutomationList (*other->_inverse_fade_out.val())))
+	, _inverse_fade_out (Properties::fade_in, boost::shared_ptr<AutomationList> (new AutomationList (*other->_inverse_fade_out.val()))) \
 /* a Session will reset these to its chosen defaults by calling AudioRegion::set_default_fade() */
 
 void
@@ -279,8 +279,8 @@ AudioRegion::AudioRegion (boost::shared_ptr<const AudioRegion> other)
 	assert (_sources.size() == _master_sources.size());
 }
 
-AudioRegion::AudioRegion (boost::shared_ptr<const AudioRegion> other, framecnt_t offset)
-	: Region (other, offset)
+AudioRegion::AudioRegion (boost::shared_ptr<const AudioRegion> other, framecnt_t offset, const int32_t sub_num)
+	: Region (other, offset, sub_num)
 	, AUDIOREGION_COPY_STATE (other)
 	  /* As far as I can see, the _envelope's times are relative to region position, and have nothing
 	     to do with sources (and hence _start).  So when we copy the envelope, we just use the supplied offset.
@@ -372,7 +372,7 @@ void
 AudioRegion::connect_to_analysis_changed ()
 {
 	for (SourceList::const_iterator i = _sources.begin(); i != _sources.end(); ++i) {
-		(*i)->AnalysisChanged.connect_same_thread (*this, boost::bind (&AudioRegion::invalidate_transients, this));
+		(*i)->AnalysisChanged.connect_same_thread (*this, boost::bind (&AudioRegion::maybe_invalidate_transients, this));
 	}
 }
 
@@ -771,7 +771,7 @@ AudioRegion::get_basic_state ()
 {
 	XMLNode& node (Region::state ());
 	char buf[64];
-	LocaleGuard lg (X_("C"));
+	LocaleGuard lg;
 
 	snprintf (buf, sizeof (buf), "%u", (uint32_t) _sources.size());
 	node.add_property ("channels", buf);
@@ -784,7 +784,7 @@ AudioRegion::state ()
 {
 	XMLNode& node (get_basic_state());
 	XMLNode *child;
-	LocaleGuard lg (X_("C"));
+	LocaleGuard lg;
 
 	child = node.add_child ("Envelope");
 
@@ -840,8 +840,8 @@ int
 AudioRegion::_set_state (const XMLNode& node, int version, PropertyChange& what_changed, bool send)
 {
 	const XMLNodeList& nlist = node.children();
-	const XMLProperty *prop;
-	LocaleGuard lg (X_("C"));
+	XMLProperty const * prop;
+	LocaleGuard lg;
 	boost::shared_ptr<Playlist> the_playlist (_playlist.lock());
 
 	suspend_property_changes ();
@@ -871,7 +871,7 @@ AudioRegion::_set_state (const XMLNode& node, int version, PropertyChange& what_
 
 	for (XMLNodeConstIterator niter = nlist.begin(); niter != nlist.end(); ++niter) {
 		XMLNode *child;
-		XMLProperty *prop;
+		XMLProperty const * prop;
 
 		child = (*niter);
 
@@ -1402,9 +1402,6 @@ AudioRegion::set_scale_amplitude (gain_t g)
 	send_change (PropertyChange (Properties::scale_amplitude));
 }
 
-/** @return the maximum (linear) amplitude of the region, or a -ve
- *  number if the Progress object reports that the process was cancelled.
- */
 double
 AudioRegion::maximum_amplitude (Progress* p) const
 {
@@ -1444,6 +1441,45 @@ AudioRegion::maximum_amplitude (Progress* p) const
 	return maxamp;
 }
 
+double
+AudioRegion::rms (Progress* p) const
+{
+	framepos_t fpos = _start;
+	framepos_t const fend = _start + _length;
+	uint32_t const n_chan = n_channels ();
+	double rms = 0;
+
+	framecnt_t const blocksize = 64 * 1024;
+	Sample buf[blocksize];
+
+	framecnt_t total = 0;
+
+	if (n_chan == 0) {
+		return 0;
+	}
+
+	while (fpos < fend) {
+		framecnt_t const to_read = min (fend - fpos, blocksize);
+		total += to_read;
+		for (uint32_t c = 0; c < n_chan; ++c) {
+			if (read_raw_internal (buf, fpos, to_read, c) != to_read) {
+				return 0;
+			}
+			for (framepos_t i = 0; i < to_read; ++i) {
+				rms += buf[i] * buf[i];
+			}
+			fpos += to_read;
+			if (p) {
+				p->set_progress (float (fpos - _start) / _length);
+				if (p->cancelled ()) {
+					return -1;
+				}
+			}
+		}
+	}
+	return sqrt (rms / (double)(total * n_chan));
+}
+
 /** Normalize using a given maximum amplitude and target, so that region
  *  _scale_amplitude becomes target / max_amplitude.
  */
@@ -1594,93 +1630,136 @@ AudioRegion::get_related_audio_file_channel_count () const
     return chan_count;
 }
 
-int
-AudioRegion::adjust_transients (frameoffset_t delta)
+void
+AudioRegion::clear_transients () // yet unused
 {
-	for (AnalysisFeatureList::iterator x = _transients.begin(); x != _transients.end(); ++x) {
-		(*x) = (*x) + delta;
-	}
-
+	_user_transients.clear ();
+	_valid_transients = false;
 	send_change (PropertyChange (Properties::valid_transients));
-
-	return 0;
 }
 
-int
-AudioRegion::update_transient (framepos_t old_position, framepos_t new_position)
+void
+AudioRegion::add_transient (framepos_t where)
 {
-	for (AnalysisFeatureList::iterator x = _transients.begin(); x != _transients.end(); ++x) {
-		if ((*x) == old_position) {
-			(*x) = new_position;
-			send_change (PropertyChange (Properties::valid_transients));
+	if (where < first_frame () || where >= last_frame ()) {
+		return;
+	}
+	where -= _position;
 
-			break;
+	if (!_valid_transients) {
+		_transient_user_start = _start;
+		_valid_transients = true;
+	}
+	frameoffset_t offset = _transient_user_start - _start;
+
+	if (where < offset) {
+		if (offset <= 0) {
+			return;
+		}
+		// region start changed (extend to front), shift points and offset
+		for (AnalysisFeatureList::iterator x = _transients.begin(); x != _transients.end(); ++x) {
+			(*x) += offset;
 		}
+		_transient_user_start -= offset;
+		offset = 0;
 	}
 
-	return 0;
+	const framepos_t p = where - offset;
+	_user_transients.push_back(p);
+	send_change (PropertyChange (Properties::valid_transients));
 }
 
 void
-AudioRegion::add_transient (framepos_t where)
+AudioRegion::update_transient (framepos_t old_position, framepos_t new_position)
 {
-	_transients.push_back(where);
-	_valid_transients = true;
+	bool changed = false;
+	if (!_onsets.empty ()) {
+		const framepos_t p = old_position - _position;
+		AnalysisFeatureList::iterator x = std::find (_onsets.begin (), _onsets.end (), p);
+		if (x != _transients.end ()) {
+			(*x) = new_position - _position;
+			changed = true;
+		}
+	}
 
-	send_change (PropertyChange (Properties::valid_transients));
+	if (_valid_transients) {
+		const frameoffset_t offset = _position + _transient_user_start - _start;
+		const framepos_t p = old_position - offset;
+		AnalysisFeatureList::iterator x = std::find (_user_transients.begin (), _user_transients.end (), p);
+		if (x != _transients.end ()) {
+			(*x) = new_position - offset;
+			changed = true;
+		}
+	}
+
+	if (changed) {
+		send_change (PropertyChange (Properties::valid_transients));
+	}
 }
 
 void
 AudioRegion::remove_transient (framepos_t where)
 {
-	_transients.remove(where);
-	_valid_transients = true;
+	bool changed = false;
+	if (!_onsets.empty ()) {
+		const framepos_t p = where - _position;
+		AnalysisFeatureList::iterator i = std::find (_onsets.begin (), _onsets.end (), p);
+		if (i != _transients.end ()) {
+			_onsets.erase (i);
+			changed = true;
+		}
+	}
 
-	send_change (PropertyChange (Properties::valid_transients));
+	if (_valid_transients) {
+		const framepos_t p = where - (_position + _transient_user_start - _start);
+		AnalysisFeatureList::iterator i = std::find (_user_transients.begin (), _user_transients.end (), p);
+		if (i != _transients.end ()) {
+			_transients.erase (i);
+			changed = true;
+		}
+	}
+
+	if (changed) {
+		send_change (PropertyChange (Properties::valid_transients));
+	}
 }
 
-int
-AudioRegion::set_transients (AnalysisFeatureList& results)
+void
+AudioRegion::set_onsets (AnalysisFeatureList& results)
 {
-	_transients.clear();
-	_transients = results;
-	_valid_transients = true;
-
+	_onsets.clear();
+	_onsets = results;
 	send_change (PropertyChange (Properties::valid_transients));
-
-	return 0;
 }
 
-int
-AudioRegion::get_transients (AnalysisFeatureList& results, bool force_new)
+void
+AudioRegion::build_transients ()
 {
+	_transients.clear ();
+	_transient_analysis_start = _transient_analysis_end = 0;
+
 	boost::shared_ptr<Playlist> pl = playlist();
 
 	if (!pl) {
-		return -1;
-	}
-
-	if (_valid_transients && !force_new) {
-		results = _transients;
-		return 0;
+		return;
 	}
 
+	/* check analyzed sources first */
 	SourceList::iterator s;
-
 	for (s = _sources.begin() ; s != _sources.end(); ++s) {
 		if (!(*s)->has_been_analysed()) {
+#ifndef NDEBUG
 			cerr << "For " << name() << " source " << (*s)->name() << " has not been analyzed\n";
+#endif
 			break;
 		}
 	}
 
 	if (s == _sources.end()) {
 		/* all sources are analyzed, merge data from each one */
-
 		for (s = _sources.begin() ; s != _sources.end(); ++s) {
 
 			/* find the set of transients within the bounds of this region */
-
 			AnalysisFeatureList::iterator low = lower_bound ((*s)->transients.begin(),
 									 (*s)->transients.end(),
 									 _start);
@@ -1690,23 +1769,19 @@ AudioRegion::get_transients (AnalysisFeatureList& results, bool force_new)
 									  _start + _length);
 
 			/* and add them */
-
-			results.insert (results.end(), low, high);
+			_transients.insert (_transients.end(), low, high);
 		}
 
-		TransientDetector::cleanup_transients (results, pl->session().frame_rate(), 3.0);
+		TransientDetector::cleanup_transients (_transients, pl->session().frame_rate(), 3.0);
 
 		/* translate all transients to current position */
-
-		for (AnalysisFeatureList::iterator x = results.begin(); x != results.end(); ++x) {
+		for (AnalysisFeatureList::iterator x = _transients.begin(); x != _transients.end(); ++x) {
 			(*x) -= _start;
-			(*x) += _position;
 		}
 
-		_transients = results;
-		_valid_transients = true;
-
-		return 0;
+		_transient_analysis_start = _start;
+		_transient_analysis_end = _start + _length;
+		return;
 	}
 
 	/* no existing/complete transient info */
@@ -1721,7 +1796,7 @@ You currently have \"auto-analyse-audio\" disabled, which means \
 that transient data must be generated every time it is required.\n\n\
 If you are doing work that will require transient data on a \
 regular basis, you should probably enable \"auto-analyse-audio\" \
-then quit %1 and restart.\n\n\
+in Preferences > Audio > Regions, then quit %1 and restart.\n\n\
 This dialog will not display again.  But you may notice a slight delay \
 in this and future transient-detection operations.\n\
 "), PROGRAM_NAME));
@@ -1729,64 +1804,74 @@ in this and future transient-detection operations.\n\
 		}
 	}
 
-	bool existing_results = !results.empty();
-
 	try {
-
 		TransientDetector t (pl->session().frame_rate());
-
-		_transients.clear ();
-		_valid_transients = false;
-
 		for (uint32_t i = 0; i < n_channels(); ++i) {
 
 			AnalysisFeatureList these_results;
 
 			t.reset ();
 
+			/* this produces analysis result relative to current position
+			 * ::read() sample 0 is at _position */
 			if (t.run ("", this, i, these_results)) {
-				return -1;
-			}
-
-			/* translate all transients to give absolute position */
-
-			for (AnalysisFeatureList::iterator i = these_results.begin(); i != these_results.end(); ++i) {
-				(*i) += _position;
+				return;
 			}
 
 			/* merge */
-
 			_transients.insert (_transients.end(), these_results.begin(), these_results.end());
 		}
 	} catch (...) {
 		error << string_compose(_("Transient Analysis failed for %1."), _("Audio Region")) << endmsg;
-		return -1;
+		return;
 	}
 
-	if (!results.empty()) {
-		if (existing_results) {
-
-			/* merge our transients into the existing ones, then clean up
-			   those.
-			*/
-
-			results.insert (results.end(), _transients.begin(), _transients.end());
-			TransientDetector::cleanup_transients (results, pl->session().frame_rate(), 3.0);
-		}
-
-		/* make sure ours are clean too */
+	TransientDetector::cleanup_transients (_transients, pl->session().frame_rate(), 3.0);
+	_transient_analysis_start = _start;
+	_transient_analysis_end = _start + _length;
+}
 
-		TransientDetector::cleanup_transients (_transients, pl->session().frame_rate(), 3.0);
+/* Transient analysis uses ::read() which is relative to _start,
+ * at the time of analysis and spans _length samples.
+ *
+ * This is true for RhythmFerret::run_analysis and the
+ * TransientDetector here.
+ *
+ * We store _start and length in _transient_analysis_start,
+ * _transient_analysis_end in case the region is trimmed or split after analysis.
+ *
+ * Various methods (most notably Playlist::find_next_transient and
+ * RhythmFerret::do_split_action) span multiple regions and *merge/combine*
+ * Analysis results.
+ * We therefore need to translate the analysis timestamps to absolute session-time
+ * and include the _position of the region.
+ *
+ * Note: we should special case the AudioRegionView. The region-view itself
+ * is located at _position (currently ARV subtracts _position again)
+ */
+void
+AudioRegion::get_transients (AnalysisFeatureList& results)
+{
+	boost::shared_ptr<Playlist> pl = playlist();
+	if (!playlist ()) {
+		return;
+	}
 
-	} else {
+	Region::merge_features (results, _user_transients, _position + _transient_user_start - _start);
 
-		TransientDetector::cleanup_transients (_transients, pl->session().frame_rate(), 3.0);
-		results = _transients;
+	if (!_onsets.empty ()) {
+		// onsets are invalidated when start or length changes
+		merge_features (results, _onsets, _position);
+		return;
 	}
 
-	_valid_transients = true;
+	if ((_transient_analysis_start == _transient_analysis_end)
+			|| _transient_analysis_start > _start
+			|| _transient_analysis_end < _start + _length) {
+		build_transients ();
+	}
 
-	return 0;
+	merge_features (results, _transients, _position + _transient_analysis_start - _start);
 }
 
 /** Find areas of `silence' within a region.
@@ -1817,11 +1902,13 @@ AudioRegion::find_silence (Sample threshold, framecnt_t min_length, framecnt_t f
 	while (pos < end && !itt.cancel) {
 
 		framecnt_t cur_samples = 0;
+		framecnt_t const to_read = min (end - pos, block_size);
 		/* fill `loudest' with the loudest absolute sample at each instant, across all channels */
 		memset (loudest.get(), 0, sizeof (Sample) * block_size);
+
 		for (uint32_t n = 0; n < n_channels(); ++n) {
 
-			cur_samples = read_raw_internal (buf.get(), pos, block_size, n);
+			cur_samples = read_raw_internal (buf.get(), pos, to_read, n);
 			for (framecnt_t i = 0; i < cur_samples; ++i) {
 				loudest[i] = max (loudest[i], abs (buf[i]));
 			}
diff --git a/libs/ardour/audiosource.cc b/libs/ardour/audiosource.cc
index 9d90d05..123bc22 100644
--- a/libs/ardour/audiosource.cc
+++ b/libs/ardour/audiosource.cc
@@ -58,7 +58,7 @@
 #include "ardour/runtime_functions.h"
 #include "ardour/session.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 #include "ardour/debug.h"
 
@@ -142,7 +142,7 @@ AudioSource::get_state ()
 int
 AudioSource::set_state (const XMLNode& node, int /*version*/)
 {
-	const XMLProperty* prop;
+	XMLProperty const * prop;
 
 	if ((prop = node.property ("captured-for")) != 0) {
 		_captured_for = prop->value();
diff --git a/libs/ardour/auditioner.cc b/libs/ardour/auditioner.cc
index fe84a2d..aa81c3a 100644
--- a/libs/ardour/auditioner.cc
+++ b/libs/ardour/auditioner.cc
@@ -43,10 +43,10 @@ using namespace std;
 using namespace ARDOUR;
 using namespace PBD;
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 Auditioner::Auditioner (Session& s)
-	: Track (s, "auditioner", Route::Auditioner)
+	: Track (s, "auditioner", PresentationInfo::Auditioner)
 	, current_frame (0)
 	, _auditioning (0)
 	, length (0)
@@ -85,13 +85,17 @@ Auditioner::init ()
 
 Auditioner::~Auditioner ()
 {
+	if (asynth) {
+		asynth->drop_references ();
+	}
+	asynth.reset ();
 }
 
 void
 Auditioner::lookup_synth ()
 {
 	string plugin_id = Config->get_midi_audition_synth_uri();
-	asynth = boost::shared_ptr<Processor>();
+	asynth.reset ();
 	if (!plugin_id.empty()) {
 		boost::shared_ptr<Plugin> p;
 		p = find_plugin (_session, plugin_id, ARDOUR::LV2);
diff --git a/libs/ardour/auto_bundle.cc b/libs/ardour/auto_bundle.cc
deleted file mode 100644
index a8d471a..0000000
--- a/libs/ardour/auto_bundle.cc
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
-    Copyright (C) 2012 Paul Davis
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-*/
-
-#include <cassert>
-#include "ardour/auto_bundle.h"
-
-ARDOUR::AutoBundle::AutoBundle (bool i)
-	: Bundle (i)
-{
-
-}
-
-ARDOUR::AutoBundle::AutoBundle (std::string const & n, bool i)
-	: Bundle (n, i)
-{
-
-}
-
-ARDOUR::ChanCount
-ARDOUR::AutoBundle::nchannels () const
-{
-	Glib::Threads::Mutex::Lock lm (_ports_mutex);
-	return ChanCount (type(), _ports.size ());
-}
-
-const ARDOUR::PortList&
-ARDOUR::AutoBundle::channel_ports (uint32_t c) const
-{
-	assert (c < nchannels().get (type()));
-
-	Glib::Threads::Mutex::Lock lm (_ports_mutex);
-	return _ports[c];
-}
-
-void
-ARDOUR::AutoBundle::set_channels (uint32_t n)
-{
-	Glib::Threads::Mutex::Lock lm (_ports_mutex);
-	_ports.resize (n);
-}
-
-void
-ARDOUR::AutoBundle::set_port (uint32_t c, std::string const & p)
-{
-	assert (c < nchannels ().get (type()));
-
-	Glib::Threads::Mutex::Lock lm (_ports_mutex);
-	_ports[c].resize (1);
-	_ports[c][0] = p;
-}
diff --git a/libs/ardour/automatable.cc b/libs/ardour/automatable.cc
index 3c5d610..10d2565 100644
--- a/libs/ardour/automatable.cc
+++ b/libs/ardour/automatable.cc
@@ -29,16 +29,18 @@
 #include "ardour/automatable.h"
 #include "ardour/event_type_map.h"
 #include "ardour/gain_control.h"
+#include "ardour/monitor_control.h"
 #include "ardour/midi_track.h"
 #include "ardour/pan_controllable.h"
 #include "ardour/pannable.h"
 #include "ardour/plugin.h"
 #include "ardour/plugin_insert.h"
+#include "ardour/record_enable_control.h"
 #include "ardour/session.h"
 #include "ardour/uri_map.h"
 #include "ardour/value_as_string.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
@@ -77,7 +79,7 @@ Automatable::~Automatable ()
 int
 Automatable::old_set_automation_state (const XMLNode& node)
 {
-	const XMLProperty *prop;
+	XMLProperty const * prop;
 
 	if ((prop = node.property ("path")) != 0) {
 		load_automation (prop->value());
@@ -148,7 +150,9 @@ Automatable::add_control(boost::shared_ptr<Evoral::Control> ac)
 
 	boost::shared_ptr<AutomationList> al = boost::dynamic_pointer_cast<AutomationList> (ac->list ());
 
-	if (al) {
+	boost::shared_ptr<AutomationControl> actl (boost::dynamic_pointer_cast<AutomationControl> (ac));
+
+	if ((!actl || !(actl->flags() & Controllable::NotAutomatable)) && al) {
 		al->automation_state_changed.connect_same_thread (
 			_list_connections,
 			boost::bind (&Automatable::automation_list_automation_state_changed,
@@ -157,7 +161,7 @@ Automatable::add_control(boost::shared_ptr<Evoral::Control> ac)
 
 	ControlSet::add_control (ac);
 
-	if (al) {
+	if ((!actl || !(actl->flags() & Controllable::NotAutomatable)) && al) {
 		_can_automate_list.insert (param);
 		automation_list_automation_state_changed (param, al->automation_state ()); // sync everything up
 	}
@@ -220,7 +224,7 @@ Automatable::set_automation_xml_state (const XMLNode& node, Evoral::Parameter le
 
 		if ((*niter)->name() == "AutomationList") {
 
-			const XMLProperty* id_prop = (*niter)->property("automation-id");
+			XMLProperty const * id_prop = (*niter)->property("automation-id");
 
 			Evoral::Parameter param = (id_prop
 					? EventTypeMap::instance().from_symbol(id_prop->value())
@@ -229,7 +233,12 @@ Automatable::set_automation_xml_state (const XMLNode& node, Evoral::Parameter le
 			if (param.type() == NullAutomation) {
 				warning << "Automation has null type" << endl;
 				continue;
-                        }
+			}
+
+			if (_can_automate_list.find (param) == _can_automate_list.end ()) {
+				warning << "Ignored automation data for non-automatable parameter" << endl;
+				continue;
+			}
 
 			if (!id_prop) {
 				warning << "AutomationList node without automation-id property, "
@@ -420,6 +429,7 @@ Automatable::control_factory(const Evoral::Parameter& param)
 	bool                              make_list = true;
 	ParameterDescriptor               desc(param);
 	boost::shared_ptr<AutomationList> list;
+
 	if (param.type() >= MidiCCAutomation && param.type() <= MidiChannelPressureAutomation) {
 		MidiTrack* mt = dynamic_cast<MidiTrack*>(this);
 		if (mt) {
@@ -460,6 +470,27 @@ Automatable::control_factory(const Evoral::Parameter& param)
 		} else {
 			warning << "PanAutomation for non-Pannable" << endl;
 		}
+	} else if (param.type() == RecEnableAutomation) {
+		Recordable* re = dynamic_cast<Recordable*> (this);
+		if (re) {
+			control = new RecordEnableControl (_a_session, X_("recenable"), *re);
+		}
+	} else if (param.type() == MonitoringAutomation) {
+		Monitorable* m = dynamic_cast<Monitorable*>(this);
+		if (m) {
+			control = new MonitorControl (_a_session, X_("monitor"), *m);
+		}
+	} else if (param.type() == SoloAutomation) {
+		Soloable* s = dynamic_cast<Soloable*>(this);
+		Muteable* m = dynamic_cast<Muteable*>(this);
+		if (s && m) {
+			control = new SoloControl (_a_session, X_("solo"), *s, *m);
+		}
+	} else if (param.type() == MuteAutomation) {
+		Muteable* m = dynamic_cast<Muteable*>(this);
+		if (m) {
+			control = new MuteControl (_a_session, X_("mute"), *m);
+		}
 	}
 
 	if (make_list && !list) {
@@ -493,7 +524,7 @@ Automatable::clear_controls ()
 }
 
 string
-Automatable::value_as_string (boost::shared_ptr<AutomationControl> ac) const
+Automatable::value_as_string (boost::shared_ptr<const AutomationControl> ac) const
 {
 	return ARDOUR::value_as_string(ac->desc(), ac->get_value());
 }
diff --git a/libs/ardour/automation_control.cc b/libs/ardour/automation_control.cc
index 583f388..e27da6a 100644
--- a/libs/ardour/automation_control.cc
+++ b/libs/ardour/automation_control.cc
@@ -18,16 +18,28 @@
 
 */
 
+#include <math.h>
 #include <iostream>
+
+#include "pbd/memento_command.h"
+#include "pbd/stacktrace.h"
+
+#include "ardour/audioengine.h"
 #include "ardour/automation_control.h"
 #include "ardour/automation_watch.h"
+#include "ardour/control_group.h"
 #include "ardour/event_type_map.h"
 #include "ardour/session.h"
 
-#include "pbd/memento_command.h"
-#include "pbd/stacktrace.h"
+#include "pbd/i18n.h"
 
-#include "i18n.h"
+#ifdef COMPILER_MSVC
+#include <float.h>
+// C99 'isfinite()' is not available in MSVC.
+#define isfinite_local(val) (bool)_finite((double)val)
+#else
+#define isfinite_local isfinite
+#endif
 
 using namespace std;
 using namespace ARDOUR;
@@ -43,10 +55,14 @@ AutomationControl::AutomationControl(ARDOUR::Session&                          s
 	, _session(session)
 	, _desc(desc)
 {
+	if (_desc.toggled) {
+		set_flags (Controllable::Toggle);
+	}
 }
 
 AutomationControl::~AutomationControl ()
 {
+	DropReferences (); /* EMIT SIGNAL */
 }
 
 bool
@@ -63,36 +79,73 @@ AutomationControl::writable() const
 double
 AutomationControl::get_value() const
 {
-	bool from_list = _list && ((AutomationList*)_list.get())->automation_playback();
+	bool from_list = _list && boost::dynamic_pointer_cast<AutomationList>(_list)->automation_playback();
 	return Control::get_double (from_list, _session.transport_frame());
 }
 
+void
+AutomationControl::set_value (double val, PBD::Controllable::GroupControlDisposition gcd)
+{
+	if (!writable()) {
+		return;
+	}
+
+	/* enforce strict double/boolean value mapping */
+
+	if (_desc.toggled) {
+		if (val != 0.0) {
+			val = 1.0;
+		}
+	}
+
+	if (check_rt (val, gcd)) {
+		/* change has been queued to take place in an RT context */
+		return;
+	}
+
+	if (_group && _group->use_me (gcd)) {
+		_group->set_group_value (shared_from_this(), val);
+	} else {
+		actually_set_value (val, gcd);
+	}
+}
+
 /** Set the value and do the right thing based on automation state
  *  (e.g. record if necessary, etc.)
  *  @param value `user' value
  */
 void
-AutomationControl::set_value (double value, PBD::Controllable::GroupControlDisposition /* group_override */)
+AutomationControl::actually_set_value (double value, PBD::Controllable::GroupControlDisposition gcd)
 {
-	bool to_list = _list && ((AutomationList*)_list.get())->automation_write();
+	bool to_list = _list && boost::dynamic_pointer_cast<AutomationList>(_list)->automation_write();
+	//const double old_value = Control::user_double ();
 
 	Control::set_double (value, _session.transport_frame(), to_list);
 
-	Changed(); /* EMIT SIGNAL */
+	//AutomationType at = (AutomationType) _parameter.type();
+	//std::cerr << "++++ Changed (" << enum_2_string (at) << ", " << enum_2_string (gcd) << ") = " << value 
+	//<< " (was " << old_value << ") @ " << this << std::endl;
+
+	Changed (true, gcd);
 }
 
 void
 AutomationControl::set_list (boost::shared_ptr<Evoral::ControlList> list)
 {
 	Control::set_list (list);
-	Changed();  /* EMIT SIGNAL */
+	Changed (true, Controllable::NoGroup);
 }
 
 void
 AutomationControl::set_automation_state (AutoState as)
 {
+	if (flags() & NotAutomatable) {
+		return;
+	}
 	if (_list && as != alist()->automation_state()) {
 
+		const double val = get_value ();
+
 		alist()->set_automation_state (as);
 		if (_desc.toggled) {
 			return;  // No watch for boolean automation
@@ -101,6 +154,11 @@ AutomationControl::set_automation_state (AutoState as)
 		if (as == Write) {
 			AutomationWatch::instance().add_automation_watch (shared_from_this());
 		} else if (as == Touch) {
+			if (alist()->empty()) {
+				Control::set_double (val, _session.current_start_frame (), true);
+				Control::set_double (val, _session.current_end_frame (), true);
+				Changed (true, Controllable::NoGroup);
+			}
 			if (!touching()) {
 				AutomationWatch::instance().remove_automation_watch (shared_from_this());
 			} else {
@@ -199,6 +257,9 @@ AutomationControl::internal_to_interface (double val) const
 double
 AutomationControl::interface_to_internal (double val) const
 {
+	if (!isfinite_local (val)) {
+		val = 0;
+	}
 	if (_desc.logarithmic) {
 		if (val <= 0) {
 			val = 0;
@@ -219,4 +280,26 @@ AutomationControl::interface_to_internal (double val) const
 	return val;
 }
 
+void
+AutomationControl::set_group (boost::shared_ptr<ControlGroup> cg)
+{
+	/* this method can only be called by a ControlGroup. We do not need
+	   to ensure consistency by calling ControlGroup::remove_control(),
+	   since we are guaranteed that the ControlGroup will take care of that
+	   for us.
+	*/
 
+	_group = cg;
+}
+
+bool
+AutomationControl::check_rt (double val, Controllable::GroupControlDisposition gcd)
+{
+	if (!_session.loading() && (flags() & Controllable::RealTime) && !AudioEngine::instance()->in_process_thread()) {
+		/* queue change in RT context */
+		_session.set_control (shared_from_this(), val, gcd);
+		return true;
+	}
+
+	return false;
+}
diff --git a/libs/ardour/automation_list.cc b/libs/ardour/automation_list.cc
index bc8ca8e..4b23378 100644
--- a/libs/ardour/automation_list.cc
+++ b/libs/ardour/automation_list.cc
@@ -27,10 +27,11 @@
 #include "ardour/event_type_map.h"
 #include "ardour/parameter_descriptor.h"
 #include "evoral/Curve.hpp"
+#include "pbd/memento_command.h"
 #include "pbd/stacktrace.h"
 #include "pbd/enumwriter.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
@@ -130,6 +131,7 @@ AutomationList::AutomationList (const XMLNode& node, Evoral::Parameter id)
 
 AutomationList::~AutomationList()
 {
+	delete _before;
 }
 
 boost::shared_ptr<Evoral::ControlList>
@@ -191,8 +193,11 @@ AutomationList::set_automation_state (AutoState s)
 {
 	if (s != _state) {
 		_state = s;
+		delete _before;
 		if (s == Write && _desc.toggled) {
 			_before = &get_state ();
+		} else {
+			_before = 0;
 		}
 		automation_state_changed (s); /* EMIT SIGNAL */
 	}
@@ -210,8 +215,11 @@ AutomationList::set_automation_style (AutoStyle s)
 void
 AutomationList::start_write_pass (double when)
 {
+	delete _before;
 	if (in_new_write_pass ()) {
 		_before = &get_state ();
+	} else {
+		_before = 0;
 	}
 	ControlList::start_write_pass (when);
 }
@@ -220,8 +228,6 @@ void
 AutomationList::write_pass_finished (double when, double thinning_factor)
 {
 	ControlList::write_pass_finished (when, thinning_factor);
-	/* automation control has deleted this or it is now owned by the session undo stack */
-	_before = 0;
 }
 
 void
@@ -259,7 +265,9 @@ AutomationList::stop_touch (bool mark, double)
 
 /* _before may be owned by the undo stack,
  * so we have to be careful about doing this.
-*/
+ *
+ * ::before () transfers ownership, setting _before to 0
+ */
 void
 AutomationList::clear_history ()
 {
@@ -278,6 +286,12 @@ AutomationList::thaw ()
 	}
 }
 
+Command*
+AutomationList::memento_command (XMLNode* before, XMLNode* after)
+{
+	return new MementoCommand<AutomationList> (*this, before, after);
+}
+
 XMLNode&
 AutomationList::get_state ()
 {
@@ -289,7 +303,7 @@ AutomationList::state (bool full)
 {
 	XMLNode* root = new XMLNode (X_("AutomationList"));
 	char buf[64];
-	LocaleGuard lg (X_("C"));
+	LocaleGuard lg;
 
 	root->add_property ("automation-id", EventTypeMap::instance().to_symbol(_parameter));
 
@@ -407,11 +421,11 @@ AutomationList::deserialize_events (const XMLNode& node)
 int
 AutomationList::set_state (const XMLNode& node, int version)
 {
-	LocaleGuard lg (X_("C"));
+	LocaleGuard lg;
 	XMLNodeList nlist = node.children();
 	XMLNode* nsos;
 	XMLNodeIterator niter;
-	const XMLProperty* prop;
+	XMLProperty const * prop;
 
 	if (node.name() == X_("events")) {
 		/* partial state setting*/
@@ -429,7 +443,7 @@ AutomationList::set_state (const XMLNode& node, int version)
 
 		const XMLNodeList& elist = node.children();
 		XMLNodeConstIterator i;
-		XMLProperty* prop;
+		XMLProperty const * prop;
 		pframes_t x;
 		double y;
 
diff --git a/libs/ardour/bundle.cc b/libs/ardour/bundle.cc
index 9934083..c27905e 100644
--- a/libs/ardour/bundle.cc
+++ b/libs/ardour/bundle.cc
@@ -23,7 +23,7 @@
 #include "ardour/audioengine.h"
 #include "ardour/port.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
diff --git a/libs/ardour/butler.cc b/libs/ardour/butler.cc
index 62f3a52..2281886 100644
--- a/libs/ardour/butler.cc
+++ b/libs/ardour/butler.cc
@@ -35,7 +35,7 @@
 #include "ardour/track.h"
 #include "ardour/auditioner.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace PBD;
 
diff --git a/libs/ardour/caimportable.cc b/libs/ardour/caimportable.cc
index 751e74c..b9bd20d 100644
--- a/libs/ardour/caimportable.cc
+++ b/libs/ardour/caimportable.cc
@@ -21,7 +21,7 @@
 #include <sndfile.h>
 #include "pbd/error.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 using namespace std;
diff --git a/libs/ardour/capturing_processor.cc b/libs/ardour/capturing_processor.cc
index ce4a546..b942883 100644
--- a/libs/ardour/capturing_processor.cc
+++ b/libs/ardour/capturing_processor.cc
@@ -22,13 +22,14 @@
 #include "ardour/session.h"
 #include "ardour/audioengine.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 namespace ARDOUR {
 
-CapturingProcessor::CapturingProcessor (Session & session)
+CapturingProcessor::CapturingProcessor (Session & session, framecnt_t latency)
 	: Processor (session, X_("capture point"))
 	, block_size (AudioEngine::instance()->samples_per_cycle())
+	, _latency (latency)
 {
 	realloc_buffers ();
 }
@@ -46,10 +47,16 @@ CapturingProcessor::set_block_size (pframes_t nframes)
 }
 
 void
-CapturingProcessor::run (BufferSet& bufs, framepos_t, framepos_t, pframes_t nframes, bool)
+CapturingProcessor::run (BufferSet& bufs, framepos_t, framepos_t, double, pframes_t nframes, bool)
 {
-	if (active()) {
-		capture_buffers.read_from (bufs, nframes);
+	if (!active()) {
+		_delaybuffers.flush ();
+		return;
+	}
+	for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
+		for (uint32_t b = 0; b < bufs.count().get (*t); ++b) {
+			_delaybuffers.delay (*t, b, capture_buffers.get (*t, b), bufs.get (*t, b), nframes, 0, 0);
+		}
 	}
 }
 
@@ -57,6 +64,7 @@ bool
 CapturingProcessor::configure_io (ChanCount in, ChanCount out)
 {
 	Processor::configure_io (in, out);
+	_delaybuffers.set (out, _latency);
 	realloc_buffers();
 	return true;
 }
@@ -72,6 +80,7 @@ void
 CapturingProcessor::realloc_buffers()
 {
 	capture_buffers.ensure_buffers (_configured_input, block_size);
+	_delaybuffers.flush ();
 }
 
 XMLNode &
diff --git a/libs/ardour/chan_count.cc b/libs/ardour/chan_count.cc
index 3cef0f6..42f9994 100644
--- a/libs/ardour/chan_count.cc
+++ b/libs/ardour/chan_count.cc
@@ -21,7 +21,7 @@
 #include <stdint.h>
 #include "ardour/chan_count.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 static const char* state_node_name = "Channels";
 
diff --git a/libs/ardour/chan_mapping.cc b/libs/ardour/chan_mapping.cc
index 5773480..f6f0e09 100644
--- a/libs/ardour/chan_mapping.cc
+++ b/libs/ardour/chan_mapping.cc
@@ -23,6 +23,10 @@
 #include <iostream>
 #include "ardour/chan_mapping.h"
 
+#include "pbd/i18n.h"
+
+static const char* state_node_name = "Channelmap";
+
 using namespace std;
 
 namespace ARDOUR {
@@ -40,15 +44,38 @@ ChanMapping::ChanMapping(ChanCount identity)
 	}
 }
 
+ChanMapping::ChanMapping (const ChanMapping& other)
+{
+	const ChanMapping::Mappings& mp (other.mappings());
+	for (Mappings::const_iterator tm = mp.begin(); tm != mp.end(); ++tm) {
+		for (TypeMapping::const_iterator i = tm->second.begin(); i != tm->second.end(); ++i) {
+			set (tm->first, i->first, i->second);
+		}
+	}
+}
+
+ChanMapping::ChanMapping (const XMLNode& node)
+{
+	XMLNodeConstIterator iter = node.children().begin();
+	for ( ; iter != node.children().end(); ++iter) {
+		if ((*iter)->name() == X_(state_node_name)) {
+			const string& type_str  = (*iter)->property("type")->value();
+			const string& from_str = (*iter)->property("from")->value();
+			const string& to_str = (*iter)->property("to")->value();
+			set(DataType(type_str), atol (from_str.c_str()), atol (to_str.c_str()));
+		}
+	}
+}
+
 uint32_t
-ChanMapping::get(DataType t, uint32_t from, bool* valid)
+ChanMapping::get(DataType t, uint32_t from, bool* valid) const
 {
-	Mappings::iterator tm = _mappings.find(t);
+	Mappings::const_iterator tm = _mappings.find(t);
 	if (tm == _mappings.end()) {
 		if (valid) { *valid = false; }
 		return -1;
 	}
-	TypeMapping::iterator m = tm->second.find(from);
+	TypeMapping::const_iterator m = tm->second.find(from);
 	if (m == tm->second.end()) {
 		if (valid) { *valid = false; }
 		return -1;
@@ -57,26 +84,57 @@ ChanMapping::get(DataType t, uint32_t from, bool* valid)
 	return m->second;
 }
 
+uint32_t
+ChanMapping::get_src(DataType t, uint32_t to, bool* valid) const
+{
+	Mappings::const_iterator tm = _mappings.find(t);
+	if (tm == _mappings.end()) {
+		if (valid) { *valid = false; }
+		return -1;
+	}
+	for (TypeMapping::const_iterator i = tm->second.begin(); i != tm->second.end(); ++i) {
+		if (i->second == to) {
+			if (valid) { *valid = true; }
+			return i->first;
+		}
+	}
+	if (valid) { *valid = false; }
+	return -1;
+}
+
+
+
 void
 ChanMapping::set(DataType t, uint32_t from, uint32_t to)
 {
 	assert(t != DataType::NIL);
-	Mappings::iterator tm = _mappings.find(t);
+	Mappings::iterator tm = _mappings.find (t);
 	if (tm == _mappings.end()) {
 		tm = _mappings.insert(std::make_pair(t, TypeMapping())).first;
 	}
 	tm->second.insert(std::make_pair(from, to));
 }
 
+void
+ChanMapping::unset(DataType t, uint32_t from)
+{
+	assert(t != DataType::NIL);
+	Mappings::iterator tm = _mappings.find (t);
+	if (tm == _mappings.end()) {
+		return;
+	}
+	tm->second.erase(from);
+}
+
 /** Offset the 'from' field of every mapping for type @a t by @a delta */
 void
 ChanMapping::offset_from(DataType t, int32_t delta)
 {
 	Mappings::iterator tm = _mappings.find(t);
-	if (tm != _mappings.end()) {
+	if (tm != _mappings.end ()) {
 		TypeMapping new_map;
 		for (TypeMapping::iterator m = tm->second.begin(); m != tm->second.end(); ++m) {
-			new_map.insert(make_pair(m->first + delta, m->second));
+			new_map.insert (make_pair (m->first + delta, m->second));
 		}
 		tm->second = new_map;
 	}
@@ -94,12 +152,103 @@ ChanMapping::offset_to(DataType t, int32_t delta)
 	}
 }
 
+XMLNode*
+ChanMapping::state(const std::string& name) const
+{
+	XMLNode* node = new XMLNode (name);
+	const Mappings& mp (mappings());
+	for (Mappings::const_iterator tm = mp.begin(); tm != mp.end(); ++tm) {
+		for (TypeMapping::const_iterator i = tm->second.begin(); i != tm->second.end(); ++i) {
+			XMLNode* n = new XMLNode(X_(state_node_name));
+			n->add_property("type", tm->first.to_string());
+			n->add_property("from", i->first);
+			n->add_property("to", i->second);
+			node->add_child_nocopy(*n);
+		}
+	}
+	return node;
+}
+
+bool
+ChanMapping::is_subset (const ChanMapping& superset) const
+{
+	const Mappings& mp (mappings());
+	for (Mappings::const_iterator tm = mp.begin(); tm != mp.end(); ++tm) {
+		for (TypeMapping::const_iterator i = tm->second.begin(); i != tm->second.end(); ++i) {
+			bool valid;
+			if (i->second != superset.get (tm->first, i->first, &valid)) {
+				return false;
+			}
+			if (!valid) {
+				return false;
+			}
+		}
+	}
+	return true;
+}
+
+bool
+ChanMapping::is_monotonic () const
+{
+	const Mappings& mp (mappings());
+	for (Mappings::const_iterator tm = mp.begin(); tm != mp.end(); ++tm) {
+		uint32_t prev = UINT32_MAX;
+		for (TypeMapping::const_iterator i = tm->second.begin(); i != tm->second.end(); ++i) {
+			// set keys are strictly weak ordered
+			if (i->first < i->second || i->second == prev) {
+				return false;
+			}
+			prev = i->second;
+		}
+	}
+	return true;
+}
+
+bool
+ChanMapping::is_identity (ChanCount offset) const
+{
+	const Mappings& mp (mappings());
+	for (Mappings::const_iterator tm = mp.begin(); tm != mp.end(); ++tm) {
+		for (TypeMapping::const_iterator i = tm->second.begin(); i != tm->second.end(); ++i) {
+			if (i->first + offset.get (tm->first) != i->second) {
+				return false;
+			}
+		}
+	}
+	return true;
+}
+
+uint32_t
+ChanMapping::n_total () const
+{
+	// fast version of count().n_total();
+	uint32_t rv = 0;
+	const Mappings& mp (mappings());
+	for (Mappings::const_iterator tm = mp.begin(); tm != mp.end(); ++tm) {
+		rv += tm->second.size ();
+	}
+	return rv;
+}
+
+ChanCount
+ChanMapping::count () const
+{
+	ChanCount rv;
+	const Mappings& mp (mappings());
+	for (Mappings::const_iterator tm = mp.begin(); tm != mp.end(); ++tm) {
+		rv.set (tm->first, tm->second.size ());
+	}
+	return rv;
+}
+
+
+
 } // namespace ARDOUR
 
 std::ostream& operator<<(std::ostream& o, const ARDOUR::ChanMapping& cm)
 {
-	for (ARDOUR::ChanMapping::Mappings::const_iterator tm = cm.mappings().begin();
-			tm != cm.mappings().end(); ++tm) {
+	const ARDOUR::ChanMapping::Mappings& mp (cm.mappings());
+	for (ARDOUR::ChanMapping::Mappings::const_iterator tm = mp.begin(); tm != mp.end(); ++tm) {
 		o << tm->first.to_string() << endl;
 		for (ARDOUR::ChanMapping::TypeMapping::const_iterator i = tm->second.begin();
 				i != tm->second.end(); ++i) {
@@ -109,4 +258,3 @@ std::ostream& operator<<(std::ostream& o, const ARDOUR::ChanMapping& cm)
 
 	return o;
 }
-
diff --git a/libs/ardour/config_text.cc b/libs/ardour/config_text.cc
new file mode 100644
index 0000000..d81c143
--- /dev/null
+++ b/libs/ardour/config_text.cc
@@ -0,0 +1,56 @@
+#include "ardour/ardour.h"
+namespace ARDOUR {
+const char* const ardour_config_info = "\n\
+Build documentation: False\n\
+Debuggable build: True\n\
+Export all symbols (backtrace): True\n\
+Install prefix: /usr/local\n\
+Strict compiler flags: []\n\
+Internal Shared Libraries: True\n\
+Use External Libraries: False\n\
+Library exports hidden: True\n\
+ALSA DBus Reservation: True\n\
+Architecture flags: None\n\
+Aubio: True\n\
+AudioUnits: False\n\
+Free/Demo copy: False\n\
+Build target: x86_64\n\
+CoreAudio: False\n\
+CoreAudio 10.5 compat: False\n\
+Debug RT allocations: False\n\
+Debug Symbols: True\n\
+Process thread timing: False\n\
+Denormal exceptions: False\n\
+FLAC: True\n\
+FPU optimization: True\n\
+Freedesktop files: False\n\
+Libjack linking: link\n\
+Libjack metadata: True\n\
+Lua Binding Doc: False\n\
+LV2 UI embedding: True\n\
+LV2 support: True\n\
+LV2 extensions: True\n\
+LXVST support: True\n\
+OGG: True\n\
+Phone home: True\n\
+Program name: Ardour\n\
+Samplerate: True\n\
+PT format: False\n\
+PTW32 Semaphore: False\n\
+Translation: True\n\
+Unit tests: False\n\
+Mac i386 Architecture: False\n\
+Mac ppc Architecture: False\n\
+Windows VST support: False\n\
+Wiimote support: True\n\
+Windows key: Mod4><Super\n\
+PortAudio Backend: False\n\
+CoreAudio/Midi Backend: False\n\
+ALSA Backend: True\n\
+Dummy backend: False\n\
+JACK Backend: True\n\
+C compiler flags: ['-I/usr/local/music/src/ardour/4.0', '-DWAF_BUILD', '-g', '-std=c99', '-pedantic', '-Wshadow', '-Wall', '-Wcast-align', '-Wextra', '-Wwrite-strings', '-Wunsafe-loop-optimizations', '-Wlogical-op', '-fshow-column', '-DARCH_X86', '-mmmx', '-msse', '-mfpmath=sse', '-DUSE_XMMINTRIN', '-DBUILD_SSE_OPTIMIZATIONS', '-DLXVST_64BIT', '-Wall', '-Wpointer-arith', '-Wcast-qual', '-Wcast-align', '-Wno-unused-parameter', '-DBOOST_SYSTEM_NO_DEPRECATED', '-D_ISOC9X_SOURCE', '-D_LARGEFILE64_SOURCE', '-D_FILE_OFFSET_BITS=64', '-DENABLE_NLS', '-DPROGRAM_NAME=\"Ardour\"', u'-DPROGRAM_VERSION=\"5\"', '-Wstrict-prototypes', '-Wmissing-prototypes']\n\
+C++ compiler flags: ['-I/usr/local/music/src/ardour/4.0', '-DWAF_BUILD', '-g', '-ansi', '-Wnon-virtual-dtor', '-Woverloaded-virtual', '-fstrict-overflow', '-Wall', '-Wcast-align', '-Wextra', '-Wwrite-strings', '-Wunsafe-loop-optimizations', '-Wlogical-op', '-fshow-column', '-DARCH_X86', '-mmmx', '-msse', '-mfpmath=sse', '-DUSE_XMMINTRIN', '-DBUILD_SSE_OPTIMIZATIONS', '-DLXVST_64BIT', '-Wall', '-Wpointer-arith', '-Wcast-qual', '-Wcast-align', '-Wno-unused-parameter', '-DBOOST_SYSTEM_NO_DEPRECATED', '-D_ISOC9X_SOURCE', '-D_LARGEFILE64_SOURCE', '-D_FILE_OFFSET_BITS=64', '-DENABLE_NLS', '-DPROGRAM_NAME=\"Ardour\"', u'-DPROGRAM_VERSION=\"5\"', '-Woverloaded-virtual', '-Wno-unused-local-typedefs', '-D__STDC_LIMIT_MACROS', '-D__STDC_FORMAT_MACROS', '-DCANVAS_COMPATIBILITY', '-DCANVAS_DEBUG']\n\
+Linker flags: ['', '-rdynamic']\n\
+";
+}
diff --git a/libs/ardour/control_group.cc b/libs/ardour/control_group.cc
new file mode 100644
index 0000000..51a1515
--- /dev/null
+++ b/libs/ardour/control_group.cc
@@ -0,0 +1,318 @@
+/*
+    Copyright (C) 2016 Paul Davis
+
+    This program is free software; you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by the Free
+    Software Foundation; either version 2 of the License, or (at your option)
+    any later version.
+
+    This program is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc.,
+    675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#include <vector>
+
+#include "pbd/unwind.h"
+
+#include "ardour/control_group.h"
+#include "ardour/gain_control.h"
+
+using namespace ARDOUR;
+using namespace PBD;
+
+ControlGroup::ControlGroup (Evoral::Parameter p)
+	: _parameter (p)
+	, _active (true)
+	, _mode (Mode (0))
+	, propagating (false)
+{
+}
+
+
+ControlGroup::~ControlGroup ()
+{
+	clear ();
+}
+
+void
+ControlGroup::set_active (bool yn)
+{
+	_active = yn;
+}
+
+void
+ControlGroup::set_mode (Mode m)
+{
+	_mode = m;
+}
+
+void
+ControlGroup::clear ()
+{
+	/* we're giving up on all members, so we don't care about their
+	 * DropReferences signals anymore
+	 */
+
+	member_connections.drop_connections ();
+
+	/* make a copy so that when the control calls ::remove_control(), we
+	 * don't deadlock.
+	 */
+
+	std::vector<boost::shared_ptr<AutomationControl> > controls;
+	{
+		Glib::Threads::RWLock::WriterLock lm (controls_lock);
+		for (ControlMap::const_iterator i = _controls.begin(); i != _controls.end(); ++i) {
+			controls.push_back (i->second);
+		}
+	}
+
+	_controls.clear ();
+
+	for (std::vector<boost::shared_ptr<AutomationControl> >::iterator c = controls.begin(); c != controls.end(); ++c) {
+		(*c)->set_group (boost::shared_ptr<ControlGroup>());
+	}
+}
+
+ControlList
+ControlGroup::controls () const
+{
+	ControlList c;
+
+	if (_active) {
+		Glib::Threads::RWLock::WriterLock lm (controls_lock);
+		for (ControlMap::const_iterator i = _controls.begin(); i != _controls.end(); ++i) {
+			c.push_back (i->second);
+		}
+	}
+
+	return c;
+}
+
+void
+ControlGroup::control_going_away (boost::weak_ptr<AutomationControl> wac)
+{
+	boost::shared_ptr<AutomationControl> ac (wac.lock());
+	if (!ac) {
+		return;
+	}
+
+	remove_control (ac);
+}
+
+int
+ControlGroup::remove_control (boost::shared_ptr<AutomationControl> ac)
+{
+	int erased;
+
+	{
+		Glib::Threads::RWLock::WriterLock lm (controls_lock);
+		erased = _controls.erase (ac->id());
+	}
+
+	if (erased) {
+		ac->set_group (boost::shared_ptr<ControlGroup>());
+	}
+
+	/* return zero if erased, non-zero otherwise */
+	return !erased;
+}
+
+int
+ControlGroup::add_control (boost::shared_ptr<AutomationControl> ac)
+{
+	if (ac->parameter() != _parameter) {
+		return -1;
+	}
+
+	std::pair<ControlMap::iterator,bool> res;
+
+	{
+		Glib::Threads::RWLock::WriterLock lm (controls_lock);
+		res = _controls.insert (std::make_pair (ac->id(), ac));
+	}
+
+	if (!res.second) {
+		/* already in ControlMap */
+		return -1;
+	}
+
+	/* Inserted */
+
+	ac->set_group (shared_from_this());
+
+	ac->DropReferences.connect_same_thread (member_connections, boost::bind (&ControlGroup::control_going_away, this, boost::weak_ptr<AutomationControl>(ac)));
+
+	return 0;
+}
+
+void
+ControlGroup::set_group_value (boost::shared_ptr<AutomationControl> control, double val)
+{
+	double old = control->get_value ();
+
+	/* set the primary control */
+
+	control->set_value (val, Controllable::ForGroup);
+
+	if (!_active) {
+		return;
+	}
+
+	/* now propagate across the group */
+
+	Glib::Threads::RWLock::ReaderLock lm (controls_lock);
+
+	if (_mode & Relative) {
+
+		const double factor = old / control->get_value ();
+
+		for (ControlMap::iterator c = _controls.begin(); c != _controls.end(); ++c) {
+			if (c->second != control) {
+				c->second->set_value (factor * c->second->get_value(), Controllable::ForGroup);
+			}
+		}
+
+	} else {
+
+		for (ControlMap::iterator c = _controls.begin(); c != _controls.end(); ++c) {
+			if (c->second != control) {
+				c->second->set_value (val, Controllable::ForGroup);
+			}
+		}
+	}
+}
+
+/*---- GAIN CONTROL GROUP -----------*/
+
+GainControlGroup::GainControlGroup ()
+	: ControlGroup (GainAutomation)
+{
+}
+
+gain_t
+GainControlGroup::get_min_factor (gain_t factor)
+{
+	/* CALLER MUST HOLD READER LOCK */
+
+	for (ControlMap::iterator c = _controls.begin(); c != _controls.end(); ++c) {
+		gain_t const g = c->second->get_value();
+
+		if ((g + g * factor) >= 0.0f) {
+			continue;
+		}
+
+		if (g <= 0.0000003f) {
+			return 0.0f;
+		}
+
+		factor = 0.0000003f / g - 1.0f;
+	}
+
+	return factor;
+}
+
+gain_t
+GainControlGroup::get_max_factor (gain_t factor)
+{
+	/* CALLER MUST HOLD READER LOCK */
+
+	for (ControlMap::iterator c = _controls.begin(); c != _controls.end(); ++c) {
+		gain_t const g = c->second->get_value();
+
+		// if the current factor woulnd't raise this route above maximum
+		if ((g + g * factor) <= 1.99526231f) {
+			continue;
+		}
+
+		// if route gain is already at peak, return 0.0f factor
+		if (g >= 1.99526231f) {
+			return 0.0f;
+		}
+
+		// factor is calculated so that it would raise current route to max
+		factor = 1.99526231f / g - 1.0f;
+	}
+
+	return factor;
+}
+
+void
+GainControlGroup::set_group_value (boost::shared_ptr<AutomationControl> control, double val)
+{
+	if (!_active) {
+		/* set the primary control */
+		control->set_value (val, Controllable::ForGroup);
+		return;
+	}
+
+	Glib::Threads::RWLock::ReaderLock lm (controls_lock);
+
+	if (_mode & Relative) {
+
+		gain_t usable_gain = control->get_value();
+
+		if (usable_gain < 0.000001f) {
+			usable_gain = 0.000001f;
+		}
+
+		gain_t delta = val;
+		if (delta < 0.000001f) {
+			delta = 0.000001f;
+		}
+
+		delta -= usable_gain;
+
+		if (delta == 0.0f) {
+			return;
+		}
+
+		gain_t factor = delta / usable_gain;
+
+		if (factor > 0.0f) {
+			factor = get_max_factor (factor);
+			if (factor == 0.0f) {
+				control->Changed (true, Controllable::ForGroup); /* EMIT SIGNAL */
+				return;
+			}
+		} else {
+			factor = get_min_factor (factor);
+			if (factor == 0.0f) {
+				control->Changed (true, Controllable::ForGroup); /* EMIT SIGNAL */
+				return;
+			}
+		}
+
+		/* set the primary control */
+
+		control->set_value (val, Controllable::ForGroup);
+
+		/* now propagate across the group */
+
+		for (ControlMap::iterator c = _controls.begin(); c != _controls.end(); ++c) {
+			if (c->second == control) {
+				continue;
+			}
+
+			boost::shared_ptr<GainControl> gc = boost::dynamic_pointer_cast<GainControl> (c->second);
+
+			if (gc) {
+				gc->inc_gain (factor);
+			}
+		}
+
+	} else {
+
+		/* just set entire group */
+
+		for (ControlMap::iterator c = _controls.begin(); c != _controls.end(); ++c) {
+			c->second->set_value (val, Controllable::ForGroup);
+		}
+	}
+}
diff --git a/libs/ardour/control_protocol_manager.cc b/libs/ardour/control_protocol_manager.cc
index 7423d3b..a0a36c1 100644
--- a/libs/ardour/control_protocol_manager.cc
+++ b/libs/ardour/control_protocol_manager.cc
@@ -38,11 +38,27 @@ using namespace ARDOUR;
 using namespace std;
 using namespace PBD;
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 ControlProtocolManager* ControlProtocolManager::_instance = 0;
 const string ControlProtocolManager::state_node_name = X_("ControlProtocols");
 
+
+ControlProtocolInfo::~ControlProtocolInfo ()
+{
+	if (protocol && descriptor) {
+		descriptor->destroy (descriptor, protocol);
+		protocol = 0;
+	}
+
+	delete state; state = 0;
+
+	if (descriptor) {
+		delete (Glib::Module*) descriptor->module;
+		descriptor = 0;
+	}
+}
+
 ControlProtocolManager::ControlProtocolManager ()
 {
 }
@@ -168,7 +184,7 @@ ControlProtocolManager::instantiate (ControlProtocolInfo& cpi)
 
 	cpi.descriptor = get_descriptor (cpi.path);
 
- 	DEBUG_TRACE (DEBUG::ControlProtocols, string_compose ("instantiating %1\n", cpi.name));
+	DEBUG_TRACE (DEBUG::ControlProtocols, string_compose ("instantiating %1\n", cpi.name));
 
 	if (cpi.descriptor == 0) {
 		error << string_compose (_("control protocol name \"%1\" has no descriptor"), cpi.name) << endmsg;
@@ -410,28 +426,31 @@ ControlProtocolManager::set_state (const XMLNode& node, int /*version*/)
 {
 	XMLNodeList clist;
 	XMLNodeConstIterator citer;
-	XMLProperty* prop;
+	XMLProperty const * prop;
 
 	Glib::Threads::Mutex::Lock lm (protocols_lock);
 
 	clist = node.children();
 
 	for (citer = clist.begin(); citer != clist.end(); ++citer) {
-		if ((*citer)->name() == X_("Protocol")) {
+		XMLNode const * child = *citer;
+
+		if (child->name() == X_("Protocol")) {
 
-			if ((prop = (*citer)->property (X_("active"))) == 0) {
+			if ((prop = child->property (X_("active"))) == 0) {
 				continue;
 			}
 
 			bool active = string_is_affirmative (prop->value());
 
-			if ((prop = (*citer)->property (X_("name"))) == 0) {
+			if ((prop = child->property (X_("name"))) == 0) {
 				continue;
 			}
 
 			ControlProtocolInfo* cpi = cpi_by_name (prop->value());
 
 			if (cpi) {
+				delete cpi->state;
 				cpi->state = new XMLNode (**citer);
 
 				if (active) {
diff --git a/libs/ardour/controllable_descriptor.cc b/libs/ardour/controllable_descriptor.cc
new file mode 100644
index 0000000..fff8b00
--- /dev/null
+++ b/libs/ardour/controllable_descriptor.cc
@@ -0,0 +1,221 @@
+/*
+    Copyright (C) 2009 Paul Davis
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#ifdef COMPILER_MSVC
+#include <io.h> // Microsoft's nearest equivalent to <unistd.h>
+#include <ardourext/misc.h>
+#else
+#include <regex.h>
+#endif
+
+#include "pbd/strsplit.h"
+#include "pbd/convert.h"
+
+#include "ardour/controllable_descriptor.h"
+
+using namespace std;
+using namespace PBD;
+using namespace ARDOUR;
+
+int
+ControllableDescriptor::set (const std::string& str)
+{
+	string::size_type first_space = str.find_first_of (" ");
+
+	if (first_space == string::npos) {
+		return -1;
+	}
+
+	string front = str.substr (0, first_space);
+	string back = str.substr (first_space);
+
+	vector<string> path;
+	split (front, path, '/');
+
+	if (path.size() < 2) {
+		return -1;
+	}
+
+	vector<string> rest;
+	split (back, rest, ' ');
+
+	if (rest.size() < 1) {
+		return -1;
+	}
+
+	bool stripable = false;
+	regex_t compiled_pattern;
+	const char * const pattern = "^[BS]?[0-9]+";
+
+	if (path[0] == "route" || path[0] == "rid") {
+
+		/* this is not going to fail */
+		regcomp (&compiled_pattern, pattern, REG_EXTENDED|REG_NOSUB);
+		bool matched = (regexec (&compiled_pattern, rest[0].c_str(), 0, 0, 0) == 0);
+		regfree (&compiled_pattern);
+
+		if (matched) {
+			_top_level_type = PresentationOrderRoute;
+			stripable = true;
+		} else {
+			_top_level_type = NamedRoute;
+			_top_level_name = rest[0];
+		}
+
+	} else if (path[0] == "vca") {
+		_top_level_type = PresentationOrderVCA;
+		stripable = true;
+	} else if (path[0] == "bus") {
+		/* digits, or B<digits> or S<digits> will be used as for route;
+		   anything else will be treated as a track name.
+		*/
+
+		/* this is not going to fail */
+
+		regcomp (&compiled_pattern, pattern, REG_EXTENDED|REG_NOSUB);
+		bool matched = (regexec (&compiled_pattern, rest[0].c_str(), 0, 0, 0) == 0);
+		regfree (&compiled_pattern);
+
+		if (matched) {
+			_top_level_type = PresentationOrderBus;
+			stripable = true;
+		} else {
+			_top_level_type = NamedRoute;
+			_top_level_name = rest[0];
+		}
+
+	} else if (path[0] == "track") {
+
+		/* digits, or B<digits> or S<digits> will be used as for route;
+		   anything else will be treated as a track name.
+		*/
+
+		/* this is not going to fail */
+		regcomp (&compiled_pattern, pattern, REG_EXTENDED|REG_NOSUB);
+		bool matched = (regexec (&compiled_pattern, rest[0].c_str(), 0, 0, 0) == 0);
+		regfree (&compiled_pattern);
+
+		if (matched) {
+			_top_level_type = PresentationOrderTrack;
+			stripable = true;
+		} else {
+			_top_level_type = NamedRoute;
+			_top_level_name = rest[0];
+		}
+	}
+
+	if (stripable) {
+		if (rest[0][0] == 'B') {
+			_banked = true;
+			_presentation_order = atoi (rest[0].substr (1));
+		} else if (rest[0][0] == 'S') {
+			_top_level_type = SelectionCount;
+			_banked = true;
+			_selection_id = atoi (rest[0].substr (1));
+		} else if (isdigit (rest[0][0])) {
+			_banked = false;
+			_presentation_order = atoi (rest[0]);
+		} else {
+			return -1;
+		}
+
+		_presentation_order -= 1; /* order is zero-based, but maps use 1-based */
+	}
+
+	if (path[1] == "gain") {
+		_subtype = Gain;
+
+	} else if (path[1] == "trim") {
+		_subtype = Trim;
+
+	} else if (path[1] == "solo") {
+		_subtype = Solo;
+
+	} else if (path[1] == "mute") {
+		_subtype = Mute;
+
+	} else if (path[1] == "recenable") {
+		_subtype = Recenable;
+
+	} else if (path[1] == "balance") {
+		_subtype = Balance;
+
+	} else if (path[1] == "panwidth") {
+		_subtype = PanWidth;
+
+	} else if (path[1] == "pandirection") {
+		_subtype = PanDirection;
+
+	} else if (path[1] == "plugin") {
+		if (path.size() == 3 && rest.size() == 3) {
+			if (path[2] == "parameter") {
+				_subtype = PluginParameter;
+				_target.push_back (atoi (rest[1]));
+				_target.push_back (atoi (rest[2]));
+			} else {
+				return -1;
+			}
+		} else {
+			return -1;
+		}
+	} else if (path[1] == "send") {
+
+		if (path.size() == 3 && rest.size() == 2) {
+			if (path[2] == "gain") {
+				_subtype = SendGain;
+				_target.push_back (atoi (rest[1]));
+			} else {
+				return -1;
+			}
+		} else {
+			return -1;
+		}
+	}
+
+	return 0;
+}
+
+uint32_t
+ControllableDescriptor::presentation_order () const
+{
+	if (banked()) {
+		return _presentation_order + _bank_offset;
+	}
+
+	return _presentation_order;
+}
+
+uint32_t
+ControllableDescriptor::selection_id () const
+{
+	if (banked()) {
+		return _selection_id + _bank_offset;
+	}
+
+	return _selection_id;
+}
+
+uint32_t
+ControllableDescriptor::target (uint32_t n) const
+{
+	if (n < _target.size()) {
+		return _target[n];
+	}
+
+	return 0;
+}
diff --git a/libs/ardour/coreaudiosource.cc b/libs/ardour/coreaudiosource.cc
index 3bb00f7..90ab07b 100644
--- a/libs/ardour/coreaudiosource.cc
+++ b/libs/ardour/coreaudiosource.cc
@@ -34,7 +34,7 @@
 
 #include <glibmm/fileutils.h>
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 #include <AudioToolbox/AudioFormat.h>
 
diff --git a/libs/ardour/cycle_timer.cc b/libs/ardour/cycle_timer.cc
index a86124c..4742d96 100644
--- a/libs/ardour/cycle_timer.cc
+++ b/libs/ardour/cycle_timer.cc
@@ -24,7 +24,7 @@
 
 #include "ardour/libardour_visibility.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace PBD;
diff --git a/libs/ardour/data_type.cc b/libs/ardour/data_type.cc
index 4a43009..c72c173 100644
--- a/libs/ardour/data_type.cc
+++ b/libs/ardour/data_type.cc
@@ -18,7 +18,7 @@
 */
 
 #include "ardour/data_type.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 const char *
 ARDOUR::DataType::to_i18n_string () const
diff --git a/libs/ardour/debug.cc b/libs/ardour/debug.cc
index 86afaf6..4dd7714 100644
--- a/libs/ardour/debug.cc
+++ b/libs/ardour/debug.cc
@@ -33,6 +33,7 @@ PBD::DebugBits PBD::DEBUG::Latency = PBD::new_debug_bit ("latency");
 PBD::DebugBits PBD::DEBUG::LatencyCompensation = PBD::new_debug_bit ("latencycompensation");
 PBD::DebugBits PBD::DEBUG::Peaks = PBD::new_debug_bit ("peaks");
 PBD::DebugBits PBD::DEBUG::Processors = PBD::new_debug_bit ("processors");
+PBD::DebugBits PBD::DEBUG::ChanMapping = PBD::new_debug_bit ("chanmapping");
 PBD::DebugBits PBD::DEBUG::ProcessThreads = PBD::new_debug_bit ("processthreads");
 PBD::DebugBits PBD::DEBUG::Graph = PBD::new_debug_bit ("graph");
 PBD::DebugBits PBD::DEBUG::Destruction = PBD::new_debug_bit ("destruction");
@@ -49,6 +50,7 @@ PBD::DebugBits PBD::DEBUG::Solo = PBD::new_debug_bit ("solo");
 PBD::DebugBits PBD::DEBUG::AudioPlayback = PBD::new_debug_bit ("audioplayback");
 PBD::DebugBits PBD::DEBUG::Panning = PBD::new_debug_bit ("panning");
 PBD::DebugBits PBD::DEBUG::LV2 = PBD::new_debug_bit ("lv2");
+PBD::DebugBits PBD::DEBUG::LV2Automate = PBD::new_debug_bit ("lv2automate");
 PBD::DebugBits PBD::DEBUG::CaptureAlignment = PBD::new_debug_bit ("capturealignment");
 PBD::DebugBits PBD::DEBUG::PluginManager = PBD::new_debug_bit ("pluginmanager");
 PBD::DebugBits PBD::DEBUG::AudioUnits = PBD::new_debug_bit ("audiounits");
@@ -74,3 +76,4 @@ PBD::DebugBits PBD::DEBUG::BackendThreads = PBD::new_debug_bit ("backendthreads"
 PBD::DebugBits PBD::DEBUG::BackendPorts = PBD::new_debug_bit ("backendports");
 PBD::DebugBits PBD::DEBUG::VSTCallbacks = PBD::new_debug_bit ("vstcallbacks");
 PBD::DebugBits PBD::DEBUG::FaderPort = PBD::new_debug_bit ("faderport");
+PBD::DebugBits PBD::DEBUG::VCA = PBD::new_debug_bit ("vca");
diff --git a/libs/ardour/delayline.cc b/libs/ardour/delayline.cc
index 0bd7793..eda85f0 100644
--- a/libs/ardour/delayline.cc
+++ b/libs/ardour/delayline.cc
@@ -50,7 +50,7 @@ DelayLine::~DelayLine ()
 
 #define FADE_LEN (16)
 void
-DelayLine::run (BufferSet& bufs, framepos_t /* start_frame */, framepos_t /* end_frame */, pframes_t nsamples, bool)
+DelayLine::run (BufferSet& bufs, framepos_t /* start_frame */, framepos_t /* end_frame */, double /* speed */, pframes_t nsamples, bool)
 {
 	const uint32_t chn = _configured_output.n_audio();
 	pframes_t p0 = 0;
@@ -112,6 +112,7 @@ DelayLine::run (BufferSet& bufs, framepos_t /* start_frame */, framepos_t /* end
 			_roff += boff;
 		}
 
+		// use shared_array::swap() ??
 		_buf = _pending_buf;
 		_bsiz = _pending_bsiz;
 		_pending_bsiz = 0;
diff --git a/libs/ardour/delivery.cc b/libs/ardour/delivery.cc
index b2cdc0b..e051ce6 100644
--- a/libs/ardour/delivery.cc
+++ b/libs/ardour/delivery.cc
@@ -34,7 +34,7 @@
 #include "ardour/port.h"
 #include "ardour/session.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 namespace ARDOUR { class Panner; }
 
@@ -229,14 +229,14 @@ Delivery::configure_io (ChanCount in, ChanCount out)
 }
 
 void
-Delivery::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, bool result_required)
+Delivery::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, double /*speed*/, pframes_t nframes, bool result_required)
 {
 	assert (_output);
 
 	PortSet& ports (_output->ports());
 	gain_t tgain;
 
-	if (_output->n_ports ().get (_output->default_type()) == 0) {
+	if (ports.num_ports () == 0) {
 		goto out;
 	}
 
@@ -246,8 +246,8 @@ Delivery::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pf
 	}
 
 	/* this setup is not just for our purposes, but for anything that comes after us in the
-	   processing pathway that wants to use this->output_buffers() for some reason.
-	*/
+	 * processing pathway that wants to use this->output_buffers() for some reason.
+	 */
 
 	// TODO delayline -- latency-compensation
 	output_buffers().get_backend_port_addresses (ports, nframes);
@@ -267,8 +267,8 @@ Delivery::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pf
 	} else if (tgain < GAIN_COEFF_SMALL) {
 
 		/* we were quiet last time, and we're still supposed to be quiet.
-		   Silence the outputs, and make sure the buffers are quiet too,
-		*/
+			 Silence the outputs, and make sure the buffers are quiet too,
+			 */
 
 		_output->silence (nframes);
 		if (result_required) {
@@ -283,7 +283,7 @@ Delivery::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pf
 		Amp::apply_simple_gain (bufs, nframes, tgain);
 	}
 
-        // Speed quietning
+	// Speed quietning
 
 	if (fabs (_session.transport_speed()) > 1.5 && Config->get_quieten_at_speed ()) {
 		Amp::apply_simple_gain (bufs, nframes, speed_quietning, false);
@@ -297,30 +297,36 @@ Delivery::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pf
 
 		_panshell->run (bufs, output_buffers(), start_frame, end_frame, nframes);
 
-		// MIDI data will not have been delivered by the panner
+		// non-audio data will not have been delivered by the panner
 
-		if (bufs.count().n_midi() > 0 && ports.count().n_midi () > 0) {
-			_output->copy_to_outputs (bufs, DataType::MIDI, nframes, ports.port(0)->port_offset());
+		for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
+			if (*t != DataType::AUDIO && bufs.count().get(*t) > 0) {
+				_output->copy_to_outputs (bufs, *t, nframes, ports.port(0)->port_offset());
+			}
 		}
 
 	} else {
 
 		// Do a 1:1 copy of data to output ports
 
-		if (bufs.count().n_audio() > 0 && ports.count().n_audio () > 0) {
+		// audio is handled separately because we use 0 for the offset
+		// XXX how does this interact with Port::increment_global_port_buffer_offset ?
+		if (bufs.count().n_audio() > 0) {
 			_output->copy_to_outputs (bufs, DataType::AUDIO, nframes, 0);
-                }
+		}
 
-		if (bufs.count().n_midi() > 0 && ports.count().n_midi () > 0) {
-			_output->copy_to_outputs (bufs, DataType::MIDI, nframes, ports.port(0)->port_offset());
+		for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
+			if (*t != DataType::AUDIO && bufs.count().get(*t) > 0) {
+				_output->copy_to_outputs (bufs, *t, nframes, ports.port(0)->port_offset());
+			}
 		}
 	}
 
-        if (result_required) {
-                bufs.read_from (output_buffers (), nframes);
-        }
+	if (result_required) {
+		bufs.read_from (output_buffers (), nframes);
+	}
 
-  out:
+out:
 	_active = _pending_active;
 }
 
@@ -352,7 +358,7 @@ Delivery::state (bool full_state)
 int
 Delivery::set_state (const XMLNode& node, int version)
 {
-	const XMLProperty* prop;
+	XMLProperty const * prop;
 
 	if (IOProcessor::set_state (node, version)) {
 		return -1;
diff --git a/libs/ardour/directory_names.cc b/libs/ardour/directory_names.cc
index 54b491e..5d13850 100644
--- a/libs/ardour/directory_names.cc
+++ b/libs/ardour/directory_names.cc
@@ -19,7 +19,7 @@
 
 #include "ardour/directory_names.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 namespace ARDOUR {
 
@@ -37,11 +37,13 @@ const char* const templates_dir_name = X_("templates");
 const char* const route_templates_dir_name = X_("route_templates");
 const char* const surfaces_dir_name = X_("surfaces");
 const char* const ladspa_dir_name = X_("ladspa");
+const char* const theme_dir_name = X_("themes");
 const char* const panner_dir_name = X_("panners");
 const char* const backend_dir_name = X_("backends");
 const char* const automation_dir_name = X_("automation");
 const char* const analysis_dir_name = X_("analysis");
 const char* const plugins_dir_name = X_("plugins");
 const char* const externals_dir_name = X_("externals");
+const char* const lua_dir_name = X_("scripts");
 
 }
diff --git a/libs/ardour/diskstream.cc b/libs/ardour/diskstream.cc
index 7f42140..ebd11a1 100644
--- a/libs/ardour/diskstream.cc
+++ b/libs/ardour/diskstream.cc
@@ -46,7 +46,7 @@
 #include "ardour/session.h"
 #include "ardour/track.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 #include <locale.h>
 
 using namespace std;
@@ -380,7 +380,7 @@ Diskstream::use_playlist (boost::shared_ptr<Playlist> playlist)
 		_playlist = playlist;
 		_playlist->use();
 
-		if (!in_set_state && recordable()) {
+		if (!in_set_state && destructive() && recordable()) {
 			reset_write_sources (false);
 		}
 
@@ -461,7 +461,7 @@ Diskstream::get_state ()
 {
 	XMLNode* node = new XMLNode ("Diskstream");
         char buf[64];
-	LocaleGuard lg (X_("C"));
+	LocaleGuard lg;
 
 	node->add_property ("flags", enum_2_string (_flags));
 	node->add_property ("playlist", _playlist->name());
@@ -483,7 +483,7 @@ Diskstream::get_state ()
 int
 Diskstream::set_state (const XMLNode& node, int /*version*/)
 {
-	const XMLProperty* prop;
+	XMLProperty const * prop;
 
 	if ((prop = node.property ("name")) != 0) {
 		_name = prop->value();
@@ -568,7 +568,9 @@ Diskstream::playlist_ranges_moved (list< Evoral::RangeMove<framepos_t> > const &
                         continue;
                 }
                 boost::shared_ptr<AutomationList> alist = ac->alist();
-
+		if (!alist->size()) {
+			continue;
+		}
                 XMLNode & before = alist->get_state ();
                 bool const things_moved = alist->move_ranges (movements);
                 if (things_moved) {
@@ -598,6 +600,9 @@ Diskstream::move_processor_automation (boost::weak_ptr<Processor> p, list< Evora
 
 	for (set<Evoral::Parameter>::const_iterator i = a.begin (); i != a.end (); ++i) {
 		boost::shared_ptr<AutomationList> al = processor->automation_control(*i)->alist();
+		if (!al->size()) {
+			continue;
+		}
 		XMLNode & before = al->get_state ();
 		bool const things_moved = al->move_ranges (movements);
 		if (things_moved) {
diff --git a/libs/ardour/dsp_filter.cc b/libs/ardour/dsp_filter.cc
new file mode 100644
index 0000000..0eef61a
--- /dev/null
+++ b/libs/ardour/dsp_filter.cc
@@ -0,0 +1,426 @@
+/*
+ * Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ *
+ */
+
+#include <algorithm>
+#include <stdlib.h>
+#include <cmath>
+#include "ardour/dB.h"
+#include "ardour/buffer.h"
+#include "ardour/dsp_filter.h"
+
+#ifdef COMPILER_MSVC
+#include <float.h>
+#define isfinite_local(val) (bool)_finite((double)val)
+#else
+#define isfinite_local std::isfinite
+#endif
+
+#ifndef M_PI
+#define M_PI 3.14159265358979323846
+#endif
+
+using namespace ARDOUR::DSP;
+
+void
+ARDOUR::DSP::memset (float *data, const float val, const uint32_t n_samples) {
+	for (uint32_t i = 0; i < n_samples; ++i) {
+		data[i] = val;
+	}
+}
+
+void
+ARDOUR::DSP::mmult (float *data, float *mult, const uint32_t n_samples) {
+	for (uint32_t i = 0; i < n_samples; ++i) {
+		data[i] *= mult[i];
+	}
+}
+
+float
+ARDOUR::DSP::log_meter (float power) {
+	// compare to gtk2_ardour/logmeter.h
+	static const float lower_db = -192.f;
+	static const float upper_db = 0.f;
+	static const float non_linearity = 8.0;
+	return (power < lower_db ? 0.0 : powf ((power - lower_db) / (upper_db - lower_db), non_linearity));
+}
+
+float
+ARDOUR::DSP::log_meter_coeff (float coeff) {
+	if (coeff <= 0) return 0;
+	return log_meter (fast_coefficient_to_dB (coeff));
+}
+
+void
+ARDOUR::DSP::peaks (const float *data, float &min, float &max, uint32_t n_samples) {
+	for (uint32_t i = 0; i < n_samples; ++i) {
+		if (data[i] < min) min = data[i];
+		if (data[i] > max) max = data[i];
+	}
+}
+
+void
+ARDOUR::DSP::process_map (BufferSet* bufs, const ChanMapping& in, const ChanMapping& out, pframes_t nframes, framecnt_t offset, const DataType& dt)
+{
+	const ChanMapping::Mappings& im (in.mappings());
+	const ChanMapping::Mappings& om (out.mappings());
+
+	for (ChanMapping::Mappings::const_iterator tm = im.begin(); tm != im.end(); ++tm) {
+		if (tm->first != dt) { continue; }
+		for (ChanMapping::TypeMapping::const_iterator i = tm->second.begin(); i != tm->second.end(); ++i) {
+			bool valid;
+			const uint32_t idx = out.get (dt, i->second, &valid);
+			if (valid && idx != i->first) {
+				bufs->get (dt, idx).read_from (bufs->get (dt, i->first), nframes, offset, offset);
+			}
+		}
+	}
+	for (ChanMapping::Mappings::const_iterator tm = im.begin(); tm != im.end(); ++tm) {
+		if (tm->first != dt) { continue; }
+		for (ChanMapping::TypeMapping::const_iterator i = tm->second.begin(); i != tm->second.end(); ++i) {
+			bool valid;
+			in.get_src (dt, i->first, &valid);
+			if (!valid) {
+				bufs->get (dt, i->second).silence (nframes, offset);
+			}
+		}
+	}
+
+}
+
+LowPass::LowPass (double samplerate, float freq)
+	: _rate (samplerate)
+	, _z (0)
+{
+	set_cutoff (freq);
+}
+
+void
+LowPass::set_cutoff (float freq)
+{
+	_a = 1.f - expf (-2.f * M_PI * freq / _rate);
+}
+
+void
+LowPass::proc (float *data, const uint32_t n_samples)
+{
+	// localize variables
+	const float a = _a;
+	float z = _z;
+	for (uint32_t i = 0; i < n_samples; ++i) {
+		data[i] += a * (data[i] - z);
+		z = data[i];
+	}
+	_z = z;
+	if (!isfinite_local (_z)) { _z = 0; }
+}
+
+void
+LowPass::ctrl (float *data, const float val, const uint32_t n_samples)
+{
+	// localize variables
+	const float a = _a;
+	float z = _z;
+	for (uint32_t i = 0; i < n_samples; ++i) {
+		data[i] += a * (val - z);
+		z = data[i];
+	}
+	_z = z;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+Biquad::Biquad (double samplerate)
+	: _rate (samplerate)
+	, _z1 (0.0)
+	, _z2 (0.0)
+	, _a1 (0.0)
+	, _a2 (0.0)
+	, _b0 (1.0)
+	, _b1 (0.0)
+	, _b2 (0.0)
+{
+}
+
+Biquad::Biquad (const Biquad &other)
+	: _rate (other._rate)
+	, _z1 (0.0)
+	, _z2 (0.0)
+	, _a1 (other._a1)
+	, _a2 (other._a2)
+	, _b0 (other._b0)
+	, _b1 (other._b1)
+	, _b2 (other._b2)
+{
+}
+
+void
+Biquad::run (float *data, const uint32_t n_samples)
+{
+	for (uint32_t i = 0; i < n_samples; ++i) {
+		const float xn = data[i];
+		const float z = _b0 * xn + _z1;
+		_z1           = _b1 * xn - _a1 * z + _z2;
+		_z2           = _b2 * xn - _a2 * z;
+		data[i] = z;
+	}
+
+	if (!isfinite_local (_z1)) { _z1 = 0; }
+	if (!isfinite_local (_z2)) { _z2 = 0; }
+}
+
+void
+Biquad::configure (double a1, double a2, double b0, double b1, double b2)
+{
+	_a1 = a1;
+	_a2 = a2;
+	_b0 = b0;
+	_b1 = b1;
+	_b2 = b2;
+}
+
+void
+Biquad::compute (Type type, double freq, double Q, double gain)
+{
+	if (Q <= .001)     { Q = 0.001; }
+	if (freq <= 1.)    { freq = 1.; }
+	if (freq >= _rate) { freq = _rate; }
+
+	/* Compute biquad filter settings.
+	 * Based on 'Cookbook formulae for audio EQ biquad filter coefficents'
+	 * by Robert Bristow-Johnson
+	 */
+	const double A = pow (10.0, (gain / 40.0));
+	const double W0 = (2.0 * M_PI * freq) / _rate;
+	const double sinW0 = sin (W0);
+	const double cosW0 = cos (W0);
+	const double alpha = sinW0 / (2.0 * Q);
+	const double beta  = sqrt (A) / Q;
+
+	double _a0;
+
+	switch (type) {
+		case LowPass:
+			_b0 = (1.0 - cosW0) / 2.0;
+			_b1 =  1.0 - cosW0;
+			_b2 = (1.0 - cosW0) / 2.0;
+			_a0 =  1.0 + alpha;
+			_a1 = -2.0 * cosW0;
+			_a2 =  1.0 - alpha;
+			break;
+
+		case HighPass:
+			_b0 =  (1.0 + cosW0) / 2.0;
+			_b1 = -(1.0 + cosW0);
+			_b2 =  (1.0 + cosW0) / 2.0;
+			_a0 =   1.0 + alpha;
+			_a1 =  -2.0 * cosW0;
+			_a2 =   1.0 - alpha;
+			break;
+
+		case BandPassSkirt: /* Constant skirt gain, peak gain = Q */
+			_b0 =  sinW0 / 2.0;
+			_b1 =  0.0;
+			_b2 = -sinW0 / 2.0;
+			_a0 =  1.0 + alpha;
+			_a1 = -2.0 * cosW0;
+			_a2 =  1.0 - alpha;
+			break;
+
+		case BandPass0dB: /* Constant 0 dB peak gain */
+			_b0 =  alpha;
+			_b1 =  0.0;
+			_b2 = -alpha;
+			_a0 =  1.0 + alpha;
+			_a1 = -2.0 * cosW0;
+			_a2 =  1.0 - alpha;
+			break;
+
+		case Notch:
+			_b0 =  1.0;
+			_b1 = -2.0 * cosW0;
+			_b2 =  1.0;
+			_a0 =  1.0 + alpha;
+			_a1 = -2.0 * cosW0;
+			_a2 =  1.0 - alpha;
+			break;
+
+		case AllPass:
+			_b0 =  1.0 - alpha;
+			_b1 = -2.0 * cosW0;
+			_b2 =  1.0 + alpha;
+			_a0 =  1.0 + alpha;
+			_a1 = -2.0 * cosW0;
+			_a2 =  1.0 - alpha;
+			break;
+
+		case Peaking:
+			_b0 =  1.0 + (alpha * A);
+			_b1 = -2.0 * cosW0;
+			_b2 =  1.0 - (alpha * A);
+			_a0 =  1.0 + (alpha / A);
+			_a1 = -2.0 * cosW0;
+			_a2 =  1.0 - (alpha / A);
+			break;
+
+		case LowShelf:
+			_b0 =         A * ((A + 1) - ((A - 1) * cosW0) + (beta * sinW0));
+			_b1 = (2.0 * A) * ((A - 1) - ((A + 1) * cosW0));
+			_b2 =         A * ((A + 1) - ((A - 1) * cosW0) - (beta * sinW0));
+			_a0 =              (A + 1) + ((A - 1) * cosW0) + (beta * sinW0);
+			_a1 =      -2.0 * ((A - 1) + ((A + 1) * cosW0));
+			_a2 =              (A + 1) + ((A - 1) * cosW0) - (beta * sinW0);
+			break;
+
+		case HighShelf:
+			_b0 =          A * ((A + 1) + ((A - 1) * cosW0) + (beta * sinW0));
+			_b1 = -(2.0 * A) * ((A - 1) + ((A + 1) * cosW0));
+			_b2 =          A * ((A + 1) + ((A - 1) * cosW0) - (beta * sinW0));
+			_a0 =               (A + 1) - ((A - 1) * cosW0) + (beta * sinW0);
+			_a1 =        2.0 * ((A - 1) - ((A + 1) * cosW0));
+			_a2 =               (A + 1) - ((A - 1) * cosW0) - (beta * sinW0);
+			break;
+		default:
+			abort(); /*NOTREACHED*/
+			break;
+	}
+
+	_b0 /= _a0;
+	_b1 /= _a0;
+	_b2 /= _a0;
+	_a1 /= _a0;
+	_a2 /= _a0;
+}
+
+float
+Biquad::dB_at_freq (float freq) const
+{
+	const double W0 = (2.0 * M_PI * freq) / _rate;
+	const float c1 = cosf (W0);
+	const float s1 = sinf (W0);
+
+	const float A = _b0 + _b2;
+	const float B = _b0 - _b2;
+	const float C = 1.0 + _a2;
+	const float D = 1.0 - _a2;
+
+	const float a = A * c1 + _b1;
+	const float b = B * s1;
+	const float c = C * c1 + _a1;
+	const float d = D * s1;
+
+#define SQUARE(x) ( (x) * (x) )
+	float rv = 20.f * log10f (sqrtf ((SQUARE(a) + SQUARE(b)) * (SQUARE(c) + SQUARE(d))) / (SQUARE(c) + SQUARE(d)));
+	if (!isfinite_local (rv)) { rv = 0; }
+	return std::min (120.f, std::max(-120.f, rv));
+}
+
+
+Glib::Threads::Mutex FFTSpectrum::fft_planner_lock;
+
+FFTSpectrum::FFTSpectrum (uint32_t window_size, double rate)
+	: hann_window (0)
+{
+	init (window_size, rate);
+}
+
+FFTSpectrum::~FFTSpectrum ()
+{
+	{
+		Glib::Threads::Mutex::Lock lk (fft_planner_lock);
+		fftwf_destroy_plan (_fftplan);
+	}
+	fftwf_free (_fft_data_in);
+	fftwf_free (_fft_data_out);
+	free (_fft_power);
+	free (hann_window);
+}
+
+void
+FFTSpectrum::init (uint32_t window_size, double rate)
+{
+	Glib::Threads::Mutex::Lock lk (fft_planner_lock);
+
+	_fft_window_size = window_size;
+	_fft_data_size   = window_size / 2;
+	_fft_freq_per_bin = rate / _fft_data_size / 2.f;
+
+	_fft_data_in  = (float *) fftwf_malloc (sizeof(float) * _fft_window_size);
+	_fft_data_out = (float *) fftwf_malloc (sizeof(float) * _fft_window_size);
+	_fft_power    = (float *) malloc (sizeof(float) * _fft_data_size);
+
+	reset ();
+
+	_fftplan = fftwf_plan_r2r_1d (_fft_window_size, _fft_data_in, _fft_data_out, FFTW_R2HC, FFTW_MEASURE);
+
+	hann_window  = (float *) malloc(sizeof(float) * window_size);
+	double sum = 0.0;
+
+	for (uint32_t i = 0; i < window_size; ++i) {
+		hann_window[i] = 0.5f - (0.5f * (float) cos (2.0f * M_PI * (float)i / (float)(window_size)));
+		sum += hann_window[i];
+	}
+	const double isum = 2.0 / sum;
+	for (uint32_t i = 0; i < window_size; ++i) {
+		hann_window[i] *= isum;
+	}
+}
+
+void
+FFTSpectrum::reset ()
+{
+	for (uint32_t i = 0; i < _fft_data_size; ++i) {
+		_fft_power[i] = 0;
+	}
+	for (uint32_t i = 0; i < _fft_window_size; ++i) {
+		_fft_data_out[i] = 0;
+	}
+}
+
+void
+FFTSpectrum::set_data_hann (float const * const data, uint32_t n_samples, uint32_t offset)
+{
+	assert(n_samples + offset <= _fft_window_size);
+	for (uint32_t i = 0; i < n_samples; ++i) {
+		_fft_data_in[i + offset] = data[i] * hann_window[i + offset];
+	}
+}
+
+void
+FFTSpectrum::execute ()
+{
+	fftwf_execute (_fftplan);
+
+	_fft_power[0] = _fft_data_out[0] * _fft_data_out[0];
+
+#define FRe (_fft_data_out[i])
+#define FIm (_fft_data_out[_fft_window_size - i])
+	for (uint32_t i = 1; i < _fft_data_size - 1; ++i) {
+		_fft_power[i] = (FRe * FRe) + (FIm * FIm);
+		//_fft_phase[i] = atan2f (FIm, FRe);
+	}
+#undef FRe
+#undef FIm
+}
+
+float
+FFTSpectrum::power_at_bin (const uint32_t b, const float norm) const {
+	assert (b < _fft_data_size);
+	const float a = _fft_power[b] * norm;
+	return a > 1e-12 ? 10.0 * fast_log10 (a) : -INFINITY;
+}
diff --git a/libs/ardour/ebur128_analysis.cc b/libs/ardour/ebur128_analysis.cc
index 3788e02..a329f87 100644
--- a/libs/ardour/ebur128_analysis.cc
+++ b/libs/ardour/ebur128_analysis.cc
@@ -22,7 +22,7 @@
 
 #include "ardour/ebur128_analysis.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace Vamp;
 using namespace ARDOUR;
diff --git a/libs/ardour/element_importer.cc b/libs/ardour/element_importer.cc
index 4f635f1..7bd7d01 100644
--- a/libs/ardour/element_importer.cc
+++ b/libs/ardour/element_importer.cc
@@ -26,7 +26,7 @@
 #include "pbd/convert.h"
 #include "ardour/session.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace PBD;
@@ -42,7 +42,7 @@ ElementImporter::ElementImporter (XMLTree const & source, ARDOUR::Session & sess
   _broken (false)
 {
 	// Get samplerate
-	XMLProperty *prop;
+	XMLProperty const * prop;
 	prop = source.root()->property ("sample-rate");
 	if (prop) {
 		std::istringstream iss (prop->value());
diff --git a/libs/ardour/engine_state_controller.cc b/libs/ardour/engine_state_controller.cc
index 57b8a84..06a4f46 100644
--- a/libs/ardour/engine_state_controller.cc
+++ b/libs/ardour/engine_state_controller.cc
@@ -26,7 +26,7 @@
 
 #include "pbd/pthread_utils.h"
 #include "pbd/error.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 
 using namespace ARDOUR;
@@ -150,7 +150,7 @@ EngineStateController::_deserialize_and_load_engine_states ()
 
 		XMLNode* state_node = *state_node_iter;
 		StatePtr engine_state (new State);
-		XMLProperty* prop = NULL;
+		XMLProperty const * prop = NULL;
 
 		if ((prop = state_node->property ("backend-name")) == 0) {
 			continue;
@@ -302,7 +302,7 @@ EngineStateController::_deserialize_and_load_midi_port_states ()
 			for (; input_state_node_iter != input_state_nodes.end (); ++input_state_node_iter) {
 
 				XMLNode* input_state_node = *input_state_node_iter;
-				XMLProperty* prop = NULL;
+				XMLProperty const * prop = NULL;
 
 				if (input_state_node->name () != "input") {
 					continue;
@@ -341,7 +341,7 @@ EngineStateController::_deserialize_and_load_midi_port_states ()
 			for (; output_state_node_iter != output_state_nodes.end (); ++output_state_node_iter) {
 
 				XMLNode* output_state_node = *output_state_node_iter;
-				XMLProperty* prop = NULL;
+				XMLProperty const * prop = NULL;
 
 				if (output_state_node->name () != "output") {
 					continue;
diff --git a/libs/ardour/enums.cc b/libs/ardour/enums.cc
index fa83780..6e90bd0 100644
--- a/libs/ardour/enums.cc
+++ b/libs/ardour/enums.cc
@@ -32,8 +32,10 @@
 #include "ardour/location.h"
 #include "ardour/midi_model.h"
 #include "ardour/mute_master.h"
+#include "ardour/presentation_info.h"
 #include "ardour/session.h"
 #include "ardour/source.h"
+#include "ardour/tempo.h"
 #include "ardour/track.h"
 #include "ardour/types.h"
 
@@ -72,7 +74,6 @@ setup_enum_writer ()
 	MonitorState _MonitorState;
 	PFLPosition _PFLPosition;
 	AFLPosition _AFLPosition;
-	RemoteModel _RemoteModel;
 	DenormalModel _DenormalModel;
 	LayerModel _LayerModel;
 	InsertMergePolicy _InsertMergePolicy;
@@ -98,11 +99,11 @@ setup_enum_writer ()
 	AutoConnectOption _AutoConnectOption;
 	TracksAutoNamingRule _TracksAutoNamingRule;
 	Session::StateOfTheState _Session_StateOfTheState;
-	Route::Flag _Route_Flag;
 	Source::Flag _Source_Flag;
 	Diskstream::Flag _Diskstream_Flag;
 	Location::Flags _Location_Flags;
 	PositionLockStyle _PositionLockStyle;
+	TempoSection::Type _TempoSection_Type;
 	Track::FreezeState _Track_FreezeState;
 	AutomationList::InterpolationStyle _AutomationList_InterpolationStyle;
 	AnyTime::Type _AnyTime_Type;
@@ -132,27 +133,37 @@ setup_enum_writer ()
 	Evoral::OverlapType _OverlapType;
         BufferingPreset _BufferingPreset;
 	AutoReturnTarget _AutoReturnTarget;
+	PresentationInfo::Flag _PresentationInfo_Flag;
 
 #define REGISTER(e) enum_writer.register_distinct (typeid(e).name(), i, s); i.clear(); s.clear()
 #define REGISTER_BITS(e) enum_writer.register_bits (typeid(e).name(), i, s); i.clear(); s.clear()
 #define REGISTER_ENUM(e) i.push_back (e); s.push_back (#e)
 #define REGISTER_CLASS_ENUM(t,e) i.push_back (t::e); s.push_back (#e)
 
+	REGISTER_ENUM (NullAutomation);
 	REGISTER_ENUM (GainAutomation);
-	REGISTER_ENUM (TrimAutomation);
 	REGISTER_ENUM (PanAzimuthAutomation);
 	REGISTER_ENUM (PanElevationAutomation);
 	REGISTER_ENUM (PanWidthAutomation);
+	REGISTER_ENUM (PanFrontBackAutomation);
+	REGISTER_ENUM (PanLFEAutomation);
 	REGISTER_ENUM (PluginAutomation);
 	REGISTER_ENUM (PluginPropertyAutomation);
 	REGISTER_ENUM (SoloAutomation);
+	REGISTER_ENUM (SoloIsolateAutomation);
+	REGISTER_ENUM (SoloSafeAutomation);
 	REGISTER_ENUM (MuteAutomation);
 	REGISTER_ENUM (MidiCCAutomation);
+	REGISTER_ENUM (MidiPgmChangeAutomation);
+	REGISTER_ENUM (MidiPitchBenderAutomation);
+	REGISTER_ENUM (MidiChannelPressureAutomation);
+	REGISTER_ENUM (MidiSystemExclusiveAutomation);
 	REGISTER_ENUM (FadeInAutomation);
 	REGISTER_ENUM (FadeOutAutomation);
 	REGISTER_ENUM (EnvelopeAutomation);
-	REGISTER_ENUM (SoloIsolateAutomation);
-	REGISTER_ENUM (SoloSafeAutomation);
+	REGISTER_ENUM (RecEnableAutomation);
+	REGISTER_ENUM (RecSafeAutomation);
+	REGISTER_ENUM (TrimAutomation);
 	REGISTER_ENUM (PhaseAutomation);
 	REGISTER_ENUM (MonitoringAutomation);
 	REGISTER_ENUM (EQGain);
@@ -311,9 +322,6 @@ setup_enum_writer ()
 	REGISTER_ENUM (DenormalFTZDAZ);
 	REGISTER (_DenormalModel);
 
-	REGISTER_ENUM (UserOrdered);
-	REGISTER_ENUM (MixerOrdered);
-	REGISTER (_RemoteModel);
 	/*
 	 * EditorOrdered has been deprecated
 	 * since the removal of independent
@@ -480,11 +488,6 @@ setup_enum_writer ()
 	REGISTER_CLASS_ENUM (Session, pullup_Minus4Minus1);
 	REGISTER (_Session_PullupFormat);
 
-	REGISTER_CLASS_ENUM (Route, Auditioner);
-	REGISTER_CLASS_ENUM (Route, MasterOut);
-	REGISTER_CLASS_ENUM (Route, MonitorOut);
-	REGISTER_BITS (_Route_Flag);
-
 	REGISTER_CLASS_ENUM (Source, Writable);
 	REGISTER_CLASS_ENUM (Source, CanRename);
 	REGISTER_CLASS_ENUM (Source, Broadcast);
@@ -528,6 +531,10 @@ setup_enum_writer ()
 	REGISTER_CLASS_ENUM (Location, IsSkip);
 	REGISTER_BITS (_Location_Flags);
 
+	REGISTER_CLASS_ENUM (TempoSection, Ramp);
+	REGISTER_CLASS_ENUM (TempoSection, Constant);
+	REGISTER (_TempoSection_Type);
+
 	REGISTER_CLASS_ENUM (Track, NoFreeze);
 	REGISTER_CLASS_ENUM (Track, Frozen);
 	REGISTER_CLASS_ENUM (Track, UnFrozen);
@@ -694,6 +701,19 @@ setup_enum_writer ()
 	REGISTER_ENUM (Loop);
 	REGISTER_ENUM (RegionSelectionStart);
 	REGISTER_BITS (_AutoReturnTarget);
+
+	REGISTER_CLASS_ENUM (PresentationInfo, AudioTrack);
+	REGISTER_CLASS_ENUM (PresentationInfo, MidiTrack);
+	REGISTER_CLASS_ENUM (PresentationInfo, AudioBus);
+	REGISTER_CLASS_ENUM (PresentationInfo, MidiBus);
+	REGISTER_CLASS_ENUM (PresentationInfo, VCA);
+	REGISTER_CLASS_ENUM (PresentationInfo, MasterOut);
+	REGISTER_CLASS_ENUM (PresentationInfo, MonitorOut);
+	REGISTER_CLASS_ENUM (PresentationInfo, Auditioner);
+	REGISTER_CLASS_ENUM (PresentationInfo, Selected);
+	REGISTER_CLASS_ENUM (PresentationInfo, Hidden);
+	REGISTER_CLASS_ENUM (PresentationInfo, OrderSet);
+	REGISTER_BITS (_PresentationInfo_Flag);
 }
 
 } /* namespace ARDOUR */
@@ -826,19 +846,6 @@ std::ostream& operator<<(std::ostream& o, const AFLPosition& var)
 	return o << s;
 }
 
-std::istream& operator>>(std::istream& o, RemoteModel& var)
-{
-	std::string s;
-	o >> s;
-	var = (RemoteModel) string_2_enum (s, var);
-	return o;
-}
-
-std::ostream& operator<<(std::ostream& o, const RemoteModel& var)
-{
-	std::string s = enum_2_string (var);
-	return o << s;
-}
 std::istream& operator>>(std::istream& o, EditMode& var)
 {
 	std::string s;
diff --git a/libs/ardour/export_channel.cc b/libs/ardour/export_channel.cc
index 2ccaf1a..cc38853 100644
--- a/libs/ardour/export_channel.cc
+++ b/libs/ardour/export_channel.cc
@@ -30,7 +30,7 @@
 
 #include "pbd/error.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 
@@ -98,7 +98,7 @@ PortExportChannel::get_state (XMLNode * node) const
 void
 PortExportChannel::set_state (XMLNode * node, Session & session)
 {
-	XMLProperty * prop;
+	XMLProperty const * prop;
 	XMLNodeList xml_ports = node->children ("Port");
 	for (XMLNodeList::iterator it = xml_ports.begin(); it != xml_ports.end(); ++it) {
 		if ((prop = (*it)->property ("name"))) {
diff --git a/libs/ardour/export_failed.cc b/libs/ardour/export_failed.cc
index 97f2ee5..6de3c9f 100644
--- a/libs/ardour/export_failed.cc
+++ b/libs/ardour/export_failed.cc
@@ -21,7 +21,7 @@
 #include "pbd/error.h"
 #include "ardour/export_failed.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
diff --git a/libs/ardour/export_filename.cc b/libs/ardour/export_filename.cc
index 201abb9..177d515 100644
--- a/libs/ardour/export_filename.cc
+++ b/libs/ardour/export_filename.cc
@@ -37,7 +37,7 @@
 #include "ardour/export_timespan.h"
 #include "ardour/utils.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace PBD;
 using namespace Glib;
@@ -107,7 +107,7 @@ int
 ExportFilename::set_state (const XMLNode & node)
 {
 	XMLNode * child;
-	XMLProperty * prop;
+	XMLProperty const * prop;
 	FieldPair pair;
 
 	child = node.child ("Folder");
@@ -372,7 +372,7 @@ ExportFilename::get_field (XMLNode const & node, string const & name)
 	XMLNodeList children = node.children();
 
 	for (XMLNodeList::iterator it = children.begin(); it != children.end(); ++it) {
-		XMLProperty * prop = (*it)->property ("name");
+		XMLProperty const * prop = (*it)->property ("name");
 		if (prop && !prop->value().compare (name)) {
 
 			prop = (*it)->property ("enabled");
diff --git a/libs/ardour/export_format_manager.cc b/libs/ardour/export_format_manager.cc
index f87a086..4025ad3 100644
--- a/libs/ardour/export_format_manager.cc
+++ b/libs/ardour/export_format_manager.cc
@@ -23,7 +23,7 @@
 #include "ardour/export_format_specification.h"
 #include "ardour/export_format_compatibility.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using std::string;
 
@@ -216,13 +216,13 @@ void
 ExportFormatManager::init_sample_rates ()
 {
 	add_sample_rate (SampleRatePtr (new SampleRateState (ExportFormatBase::SR_Session, _("Session rate"))));
-	add_sample_rate (SampleRatePtr (new SampleRateState (ExportFormatBase::SR_8, "8 kHz")));
-	add_sample_rate (SampleRatePtr (new SampleRateState (ExportFormatBase::SR_22_05, "22,05 kHz")));
-	add_sample_rate (SampleRatePtr (new SampleRateState (ExportFormatBase::SR_44_1, "44,1 kHz")));
-	add_sample_rate (SampleRatePtr (new SampleRateState (ExportFormatBase::SR_48, "48 kHz")));
-	add_sample_rate (SampleRatePtr (new SampleRateState (ExportFormatBase::SR_88_2, "88,2 kHz")));
-	add_sample_rate (SampleRatePtr (new SampleRateState (ExportFormatBase::SR_96, "96 kHz")));
-	add_sample_rate (SampleRatePtr (new SampleRateState (ExportFormatBase::SR_192, "192 kHz")));
+	add_sample_rate (SampleRatePtr (new SampleRateState (ExportFormatBase::SR_8,     string_compose ("%1%2%3 kHz", std::fixed, std::setprecision(0), 8))));
+	add_sample_rate (SampleRatePtr (new SampleRateState (ExportFormatBase::SR_22_05, string_compose ("%1%2%3 kHz", std::fixed, std::setprecision(2), 22.05))));
+	add_sample_rate (SampleRatePtr (new SampleRateState (ExportFormatBase::SR_44_1,  string_compose ("%1%2%3 kHz", std::fixed, std::setprecision(1), 44.1))));
+	add_sample_rate (SampleRatePtr (new SampleRateState (ExportFormatBase::SR_48,    string_compose ("%1%2%3 kHz", std::fixed, std::setprecision(0), 48))));
+	add_sample_rate (SampleRatePtr (new SampleRateState (ExportFormatBase::SR_88_2,  string_compose ("%1%2%3 kHz", std::fixed, std::setprecision(1), 88.2))));
+	add_sample_rate (SampleRatePtr (new SampleRateState (ExportFormatBase::SR_96,    string_compose ("%1%2%3 kHz", std::fixed, std::setprecision(0), 96))));
+	add_sample_rate (SampleRatePtr (new SampleRateState (ExportFormatBase::SR_192,   string_compose ("%1%2%3 kHz", std::fixed, std::setprecision(0), 192))));
 }
 
 void
@@ -343,9 +343,30 @@ ExportFormatManager::select_normalize (bool value)
 }
 
 void
-ExportFormatManager::select_normalize_target (float value)
+ExportFormatManager::select_normalize_loudness (bool value)
 {
-	current_selection->set_normalize_target (value);
+	current_selection->set_normalize_loudness (value);
+	check_for_description_change ();
+}
+
+void
+ExportFormatManager::select_normalize_dbfs (float value)
+{
+	current_selection->set_normalize_dbfs (value);
+	check_for_description_change ();
+}
+
+void
+ExportFormatManager::select_normalize_lufs (float value)
+{
+	current_selection->set_normalize_lufs (value);
+	check_for_description_change ();
+}
+
+void
+ExportFormatManager::select_normalize_dbtp (float value)
+{
+	current_selection->set_normalize_dbtp (value);
 	check_for_description_change ();
 }
 
diff --git a/libs/ardour/export_format_specification.cc b/libs/ardour/export_format_specification.cc
index fd85c32..07bd911 100644
--- a/libs/ardour/export_format_specification.cc
+++ b/libs/ardour/export_format_specification.cc
@@ -31,7 +31,7 @@
 #include "pbd/enumwriter.h"
 #include "pbd/convert.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 namespace ARDOUR
 {
@@ -167,7 +167,10 @@ ExportFormatSpecification::ExportFormatSpecification (Session & s)
 	, _silence_end (s)
 
 	, _normalize (false)
-	, _normalize_target (GAIN_COEFF_UNITY)
+	, _normalize_loudness (false)
+	, _normalize_dbfs (GAIN_COEFF_UNITY)
+	, _normalize_lufs (-23)
+	, _normalize_dbtp (-1)
 	, _with_toc (false)
 	, _with_cue (false)
 	, _with_mp4chaps (false)
@@ -184,9 +187,30 @@ ExportFormatSpecification::ExportFormatSpecification (Session & s)
 
 ExportFormatSpecification::ExportFormatSpecification (Session & s, XMLNode const & state)
 	: session (s)
+
+	, has_sample_format (false)
+	, supports_tagging (false)
+	, _has_broadcast_info (false)
+	, _channel_limit (0)
+	, _dither_type (D_None)
+	, _src_quality (SRC_SincBest)
+	, _tag (true)
+
+	, _trim_beginning (false)
 	, _silence_beginning (s)
+	, _trim_end (false)
 	, _silence_end (s)
+
+	, _normalize (false)
+	, _normalize_loudness (false)
+	, _normalize_dbfs (GAIN_COEFF_UNITY)
+	, _normalize_lufs (-23)
+	, _normalize_dbtp (-1)
+	, _with_toc (false)
+	, _with_cue (false)
+	, _with_mp4chaps (false)
 	, _soundcloud_upload (false)
+	, _command ("")
 	, _analyse (true)
 {
 	_silence_beginning.type = Time::Timecode;
@@ -228,7 +252,10 @@ ExportFormatSpecification::ExportFormatSpecification (ExportFormatSpecification
 	set_trim_beginning (other.trim_beginning());
 	set_trim_end (other.trim_end());
 	set_normalize (other.normalize());
-	set_normalize_target (other.normalize_target());
+	set_normalize_loudness (other.normalize_loudness());
+	set_normalize_dbfs (other.normalize_dbfs());
+	set_normalize_lufs (other.normalize_lufs());
+	set_normalize_dbtp (other.normalize_dbtp());
 
 	set_tag (other.tag());
 
@@ -245,6 +272,7 @@ ExportFormatSpecification::~ExportFormatSpecification ()
 XMLNode &
 ExportFormatSpecification::get_state ()
 {
+	LocaleGuard lg;
 	XMLNode * node;
 	XMLNode * root = new XMLNode ("ExportFormatSpecification");
 
@@ -281,7 +309,10 @@ ExportFormatSpecification::get_state ()
 
 	node = processing->add_child ("Normalize");
 	node->add_property ("enabled", normalize() ? "true" : "false");
-	node->add_property ("target", to_string (normalize_target(), std::dec));
+	node->add_property ("loudness", normalize_loudness() ? "yes" : "no");
+	node->add_property ("dbfs", to_string (normalize_dbfs(), std::dec));
+	node->add_property ("lufs", to_string (normalize_lufs(), std::dec));
+	node->add_property ("dbtp", to_string (normalize_dbtp(), std::dec));
 
 	XMLNode * silence = processing->add_child ("Silence");
 	XMLNode * start = silence->add_child ("Start");
@@ -310,6 +341,7 @@ ExportFormatSpecification::set_state (const XMLNode & root)
 	XMLProperty const * prop;
 	XMLNode const * child;
 	string value;
+	LocaleGuard lg;
 
 	if ((prop = root.property ("name"))) {
 		_name = prop->value();
@@ -407,8 +439,25 @@ ExportFormatSpecification::set_state (const XMLNode & root)
 			_normalize = (!prop->value().compare ("true"));
 		}
 
+		// old formats before ~ 4.7-930ish
 		if ((prop = child->property ("target"))) {
-			_normalize_target = atof (prop->value());
+			_normalize_dbfs = atof (prop->value());
+		}
+
+		if ((prop = child->property ("loudness"))) {
+			_normalize_loudness = string_is_affirmative (prop->value());
+		}
+
+		if ((prop = child->property ("dbfs"))) {
+			_normalize_dbfs = atof (prop->value());
+		}
+
+		if ((prop = child->property ("lufs"))) {
+			_normalize_lufs = atof (prop->value());
+		}
+
+		if ((prop = child->property ("dbtp"))) {
+			_normalize_dbtp = atof (prop->value());
 		}
 	}
 
@@ -556,7 +605,11 @@ ExportFormatSpecification::description (bool include_name)
 	list<string> components;
 
 	if (_normalize) {
-		components.push_back (_("normalize"));
+		if (_normalize_loudness) {
+			components.push_back (_("normalize loudness"));
+		} else {
+			components.push_back (_("normalize peak"));
+		}
 	}
 
 	if (_trim_beginning && _trim_end) {
@@ -649,7 +702,7 @@ ExportFormatSpecification::get_option (XMLNode const * node, std::string const &
 	XMLNodeList list (node->children ("Option"));
 
 	for (XMLNodeList::iterator it = list.begin(); it != list.end(); ++it) {
-		XMLProperty * prop = (*it)->property ("name");
+		XMLProperty const * prop = (*it)->property ("name");
 		if (prop && !name.compare (prop->value())) {
 			prop = (*it)->property ("value");
 			if (prop) {
diff --git a/libs/ardour/export_formats.cc b/libs/ardour/export_formats.cc
index 47f68fe..642f05a 100644
--- a/libs/ardour/export_formats.cc
+++ b/libs/ardour/export_formats.cc
@@ -20,7 +20,7 @@
 
 #include "ardour/export_formats.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 
diff --git a/libs/ardour/export_graph_builder.cc b/libs/ardour/export_graph_builder.cc
index a15a48a..7c5a434 100644
--- a/libs/ardour/export_graph_builder.cc
+++ b/libs/ardour/export_graph_builder.cc
@@ -30,11 +30,14 @@
 #include "audiographer/general/normalizer.h"
 #include "audiographer/general/analyser.h"
 #include "audiographer/general/peak_reader.h"
+#include "audiographer/general/loudness_reader.h"
 #include "audiographer/general/sample_format_converter.h"
 #include "audiographer/general/sr_converter.h"
 #include "audiographer/general/silence_trimmer.h"
 #include "audiographer/general/threader.h"
 #include "audiographer/sndfile/tmp_file.h"
+#include "audiographer/sndfile/tmp_file_rt.h"
+#include "audiographer/sndfile/tmp_file_sync.h"
 #include "audiographer/sndfile/sndfile_writer.h"
 
 #include "ardour/audioengine.h"
@@ -81,25 +84,25 @@ ExportGraphBuilder::process (framecnt_t frames, bool last_cycle)
 }
 
 bool
-ExportGraphBuilder::process_normalize ()
+ExportGraphBuilder::post_process ()
 {
-	for (std::list<Normalizer *>::iterator it = normalizers.begin(); it != normalizers.end(); /* ++ in loop */) {
+	for (std::list<Intermediate *>::iterator it = intermediates.begin(); it != intermediates.end(); /* ++ in loop */) {
 		if ((*it)->process()) {
-			it = normalizers.erase (it);
+			it = intermediates.erase (it);
 		} else {
 			++it;
 		}
 	}
 
-	return normalizers.empty();
+	return intermediates.empty();
 }
 
 unsigned
-ExportGraphBuilder::get_normalize_cycle_count() const
+ExportGraphBuilder::get_postprocessing_cycle_count() const
 {
 	unsigned max = 0;
-	for (std::list<Normalizer *>::const_iterator it = normalizers.begin(); it != normalizers.end(); ++it) {
-		max = std::max(max, (*it)->get_normalize_cycle_count());
+	for (std::list<Intermediate *>::const_iterator it = intermediates.begin(); it != intermediates.end(); ++it) {
+		max = std::max(max, (*it)->get_postprocessing_cycle_count());
 	}
 	return max;
 }
@@ -110,8 +113,9 @@ ExportGraphBuilder::reset ()
 	timespan.reset();
 	channel_configs.clear ();
 	channels.clear ();
-	normalizers.clear ();
+	intermediates.clear ();
 	analysis_map.clear();
+	_realtime = false;
 }
 
 void
@@ -132,7 +136,7 @@ ExportGraphBuilder::set_current_timespan (boost::shared_ptr<ExportTimespan> span
 }
 
 void
-ExportGraphBuilder::add_config (FileSpec const & config)
+ExportGraphBuilder::add_config (FileSpec const & config, bool rt)
 {
 	ExportChannelConfiguration::ChannelList const & channels =
 		config.channel_config->get_channels();
@@ -141,6 +145,8 @@ ExportGraphBuilder::add_config (FileSpec const & config)
 		(*it)->set_max_buffer_size(process_buffer_frames);
 	}
 
+	_realtime = rt;
+
 	// If the sample rate is "session rate", change it to the real value.
 	// However, we need to copy it to not change the config which is saved...
 	FileSpec new_config (config);
@@ -316,6 +322,8 @@ ExportGraphBuilder::SFC::SFC (ExportGraphBuilder &parent, FileSpec const & new_c
 		analyser.reset (new Analyser (config.format->sample_rate(), channels, max_frames,
 					(framecnt_t) ceil (duration * config.format->sample_rate () / (double) sample_rate)));
 		chunker->add_output (analyser);
+
+		config.filename->set_channel_config (config.channel_config);
 		parent.add_analyser (config.filename->get_path (config.format), analyser);
 	}
 
@@ -403,10 +411,12 @@ ExportGraphBuilder::SFC::operator== (FileSpec const & other_config) const
 	return config.format->sample_format() == other_config.format->sample_format();
 }
 
-/* Normalizer */
+/* Intermediate (Normalizer, TmpFile) */
 
-ExportGraphBuilder::Normalizer::Normalizer (ExportGraphBuilder & parent, FileSpec const & new_config, framecnt_t /*max_frames*/)
+ExportGraphBuilder::Intermediate::Intermediate (ExportGraphBuilder & parent, FileSpec const & new_config, framecnt_t max_frames)
 	: parent (parent)
+	, use_loudness (false)
+	, use_peak (false)
 {
 	std::string tmpfile_path = parent.session.session_directory().export_path();
 	tmpfile_path = Glib::build_filename(tmpfile_path, "XXXXXX");
@@ -417,33 +427,58 @@ ExportGraphBuilder::Normalizer::Normalizer (ExportGraphBuilder & parent, FileSpe
 	config = new_config;
 	uint32_t const channels = config.channel_config->get_n_chans();
 	max_frames_out = 4086 - (4086 % channels); // TODO good chunk size
+	use_loudness = config.format->normalize_loudness ();
+	use_peak = config.format->normalize ();
 
 	buffer.reset (new AllocatingProcessContext<Sample> (max_frames_out, channels));
-	peak_reader.reset (new PeakReader ());
-	normalizer.reset (new AudioGrapher::Normalizer (config.format->normalize_target()));
-	threader.reset (new Threader<Sample> (parent.thread_pool));
 
+	if (use_peak) {
+		peak_reader.reset (new PeakReader ());
+	}
+	if (use_loudness) {
+		loudness_reader.reset (new LoudnessReader (config.format->sample_rate(), channels, max_frames));
+	}
+
+	normalizer.reset (new AudioGrapher::Normalizer (use_loudness ? 0.0 : config.format->normalize_dbfs()));
+	threader.reset (new Threader<Sample> (parent.thread_pool));
 	normalizer->alloc_buffer (max_frames_out);
 	normalizer->add_output (threader);
 
 	int format = ExportFormatBase::F_RAW | ExportFormatBase::SF_Float;
-	tmp_file.reset (new TmpFile<float> (&tmpfile_path_buf[0], format, channels, config.format->sample_rate()));
+
+	if (parent._realtime) {
+		tmp_file.reset (new TmpFileRt<float> (&tmpfile_path_buf[0], format, channels, config.format->sample_rate()));
+	} else {
+		tmp_file.reset (new TmpFileSync<float> (&tmpfile_path_buf[0], format, channels, config.format->sample_rate()));
+	}
+
 	tmp_file->FileWritten.connect_same_thread (post_processing_connection,
-	                                           boost::bind (&Normalizer::start_post_processing, this));
+	                                           boost::bind (&Intermediate::prepare_post_processing, this));
+	tmp_file->FileFlushed.connect_same_thread (post_processing_connection,
+	                                           boost::bind (&Intermediate::start_post_processing, this));
 
 	add_child (new_config);
 
-	peak_reader->add_output (tmp_file);
+	if (use_loudness) {
+		loudness_reader->add_output (tmp_file);
+	} else if (use_peak) {
+		peak_reader->add_output (tmp_file);
+	}
 }
 
 ExportGraphBuilder::FloatSinkPtr
-ExportGraphBuilder::Normalizer::sink ()
+ExportGraphBuilder::Intermediate::sink ()
 {
-	return peak_reader;
+	if (use_loudness) {
+		return loudness_reader;
+	} else if (use_peak) {
+		return peak_reader;
+	}
+	return tmp_file;
 }
 
 void
-ExportGraphBuilder::Normalizer::add_child (FileSpec const & new_config)
+ExportGraphBuilder::Intermediate::add_child (FileSpec const & new_config)
 {
 	for (boost::ptr_list<SFC>::iterator it = children.begin(); it != children.end(); ++it) {
 		if (*it == new_config) {
@@ -457,7 +492,7 @@ ExportGraphBuilder::Normalizer::add_child (FileSpec const & new_config)
 }
 
 void
-ExportGraphBuilder::Normalizer::remove_children (bool remove_out_files)
+ExportGraphBuilder::Intermediate::remove_children (bool remove_out_files)
 {
 	boost::ptr_list<SFC>::iterator iter = children.begin ();
 
@@ -468,36 +503,62 @@ ExportGraphBuilder::Normalizer::remove_children (bool remove_out_files)
 }
 
 bool
-ExportGraphBuilder::Normalizer::operator== (FileSpec const & other_config) const
+ExportGraphBuilder::Intermediate::operator== (FileSpec const & other_config) const
 {
 	return config.format->normalize() == other_config.format->normalize() &&
-		config.format->normalize_target() == other_config.format->normalize_target();
+		config.format->normalize_loudness () == other_config.format->normalize_loudness() &&
+		(
+		 (!config.format->normalize_loudness () && config.format->normalize_dbfs() == other_config.format->normalize_dbfs())
+		 ||
+		 // FIXME: allow simultaneous export of two formats with different loundness normalization settings
+		 (config.format->normalize_loudness () /* lufs/dbtp is a result option, not an instantaion option */)
+		);
 }
 
 unsigned
-ExportGraphBuilder::Normalizer::get_normalize_cycle_count() const
+ExportGraphBuilder::Intermediate::get_postprocessing_cycle_count() const
 {
 	return static_cast<unsigned>(std::ceil(static_cast<float>(tmp_file->get_frames_written()) /
 	                                       max_frames_out));
 }
 
 bool
-ExportGraphBuilder::Normalizer::process()
+ExportGraphBuilder::Intermediate::process()
 {
 	framecnt_t frames_read = tmp_file->read (*buffer);
 	return frames_read != buffer->frames();
 }
 
 void
-ExportGraphBuilder::Normalizer::start_post_processing()
-{
-	const float gain = normalizer->set_peak (peak_reader->get_peak());
-	for (boost::ptr_list<SFC>::iterator i = children.begin(); i != children.end(); ++i) {
-		(*i).set_peak (gain);
+ExportGraphBuilder::Intermediate::prepare_post_processing()
+{
+	// called in sync rt-context
+	float gain;
+	if (use_loudness) {
+		gain = normalizer->set_peak (loudness_reader->get_peak (config.format->normalize_lufs (), config.format->normalize_dbtp ()));
+	} else if (use_peak) {
+		gain = normalizer->set_peak (peak_reader->get_peak());
+	} else {
+		gain = normalizer->set_peak (0.0);
+	}
+	if (use_loudness || use_peak) {
+		// push info to analyzers
+		for (boost::ptr_list<SFC>::iterator i = children.begin(); i != children.end(); ++i) {
+			(*i).set_peak (gain);
+		}
 	}
-	tmp_file->seek (0, SEEK_SET);
 	tmp_file->add_output (normalizer);
-	parent.normalizers.push_back (this);
+	parent.intermediates.push_back (this);
+}
+
+void
+ExportGraphBuilder::Intermediate::start_post_processing()
+{
+	// called in disk-thread (when exporting in realtime)
+	tmp_file->seek (0, SEEK_SET);
+	if (!AudioEngine::instance()->freewheeling ()) {
+		AudioEngine::instance()->freewheel (true);
+	}
 }
 
 /* SRC */
@@ -523,8 +584,8 @@ ExportGraphBuilder::SRC::sink ()
 void
 ExportGraphBuilder::SRC::add_child (FileSpec const & new_config)
 {
-	if (new_config.format->normalize()) {
-		add_child_to_list (new_config, normalized_children);
+	if (new_config.format->normalize() || parent._realtime) {
+		add_child_to_list (new_config, intermediate_children);
 	} else {
 		add_child_to_list (new_config, children);
 	}
@@ -541,12 +602,12 @@ ExportGraphBuilder::SRC::remove_children (bool remove_out_files)
 		sfc_iter = children.erase (sfc_iter);
 	}
 
-	boost::ptr_list<Normalizer>::iterator norm_iter = normalized_children.begin();
+	boost::ptr_list<Intermediate>::iterator norm_iter = intermediate_children.begin();
 
-	while (norm_iter != normalized_children.end() ) {
+	while (norm_iter != intermediate_children.end() ) {
 		converter->remove_output (norm_iter->sink() );
 		norm_iter->remove_children (remove_out_files);
-		norm_iter = normalized_children.erase (norm_iter);
+		norm_iter = intermediate_children.erase (norm_iter);
 	}
 
 }
@@ -580,7 +641,12 @@ ExportGraphBuilder::SilenceHandler::SilenceHandler (ExportGraphBuilder & parent,
 	max_frames_in = max_frames;
 	framecnt_t sample_rate = parent.session.nominal_frame_rate();
 
-	silence_trimmer.reset (new SilenceTrimmer<Sample>(max_frames_in));
+#ifdef MIXBUS
+	silence_trimmer.reset (new SilenceTrimmer<Sample>(max_frames_in, -90));
+#else
+	// TODO silence-threshold should be per export-preset, with Config->get_silence_threshold being the default
+	silence_trimmer.reset (new SilenceTrimmer<Sample>(max_frames_in, Config->get_export_silence_threshold ()));
+#endif
 	silence_trimmer->set_trim_beginning (config.format->trim_beginning());
 	silence_trimmer->set_trim_end (config.format->trim_end());
 
diff --git a/libs/ardour/export_handler.cc b/libs/ardour/export_handler.cc
index c36a6da..ac2f7b0 100644
--- a/libs/ardour/export_handler.cc
+++ b/libs/ardour/export_handler.cc
@@ -26,6 +26,7 @@
 
 #include "pbd/convert.h"
 
+#include "ardour/audioengine.h"
 #include "ardour/audiofile_tagger.h"
 #include "ardour/debug.h"
 #include "ardour/export_graph_builder.h"
@@ -40,7 +41,7 @@
 #include "pbd/basename.h"
 #include "ardour/session_metadata.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace PBD;
@@ -110,7 +111,7 @@ ExportHandler::ExportHandler (Session & session)
   , session (session)
   , graph_builder (new ExportGraphBuilder (session))
   , export_status (session.get_export_status ())
-  , normalizing (false)
+  , post_processing (false)
   , cue_tracknum (0)
   , cue_indexnum (0)
 {
@@ -189,19 +190,20 @@ ExportHandler::start_timespan ()
 	graph_builder->reset ();
 	graph_builder->set_current_timespan (current_timespan);
 	handle_duplicate_format_extensions();
+	bool realtime = current_timespan->realtime ();
 	for (ConfigMap::iterator it = timespan_bounds.first; it != timespan_bounds.second; ++it) {
 		// Filenames can be shared across timespans
 		FileSpec & spec = it->second;
 		spec.filename->set_timespan (it->first);
-		graph_builder->add_config (spec);
+		graph_builder->add_config (spec, realtime);
 	}
 
 	/* start export */
 
-	normalizing = false;
+	post_processing = false;
 	session.ProcessExport.connect_same_thread (process_connection, boost::bind (&ExportHandler::process, this, _1));
 	process_position = current_timespan->get_start();
-	session.start_audio_export (process_position);
+	session.start_audio_export (process_position, realtime);
 }
 
 void
@@ -230,9 +232,14 @@ ExportHandler::process (framecnt_t frames)
 {
 	if (!export_status->running ()) {
 		return 0;
-	} else if (normalizing) {
+	} else if (post_processing) {
 		Glib::Threads::Mutex::Lock l (export_status->lock());
-		return process_normalize ();
+		if (AudioEngine::instance()->freewheeling ()) {
+			return post_process ();
+		} else {
+			// wait until we're freewheeling
+			return 0;
+		}
 	} else {
 		Glib::Threads::Mutex::Lock l (export_status->lock());
 		return process_timespan (frames);
@@ -242,6 +249,7 @@ ExportHandler::process (framecnt_t frames)
 int
 ExportHandler::process_timespan (framecnt_t frames)
 {
+	export_status->active_job = ExportStatus::Exporting;
 	/* update position */
 
 	framecnt_t frames_to_read = 0;
@@ -263,12 +271,12 @@ ExportHandler::process_timespan (framecnt_t frames)
 	/* Do actual processing */
 	int ret = graph_builder->process (frames_to_read, last_cycle);
 
-	/* Start normalizing if necessary */
+	/* Start post-processing/normalizing if necessary */
 	if (last_cycle) {
-		normalizing = graph_builder->will_normalize();
-		if (normalizing) {
-			export_status->total_normalize_cycles = graph_builder->get_normalize_cycle_count();
-			export_status->current_normalize_cycle = 0;
+		post_processing = graph_builder->need_postprocessing ();
+		if (post_processing) {
+			export_status->total_postprocessing_cycles = graph_builder->get_postprocessing_cycle_count();
+			export_status->current_postprocessing_cycle = 0;
 		} else {
 			finish_timespan ();
 			return 0;
@@ -279,16 +287,20 @@ ExportHandler::process_timespan (framecnt_t frames)
 }
 
 int
-ExportHandler::process_normalize ()
+ExportHandler::post_process ()
 {
-	if (graph_builder->process_normalize ()) {
+	if (graph_builder->post_process ()) {
 		finish_timespan ();
 		export_status->active_job = ExportStatus::Exporting;
 	} else {
-		export_status->active_job = ExportStatus::Normalizing;
+		if (graph_builder->realtime ()) {
+			export_status->active_job = ExportStatus::Encoding;
+		} else {
+			export_status->active_job = ExportStatus::Normalizing;
+		}
 	}
 
-	export_status->current_normalize_cycle++;
+	export_status->current_postprocessing_cycle++;
 
 	return 0;
 }
@@ -321,6 +333,8 @@ ExportHandler::finish_timespan ()
 			export_cd_marker_file (current_timespan, fmt, filename, MP4Chaps);
 		}
 
+		Session::Exported (current_timespan->name(), filename); /* EMIT SIGNAL */
+
 		/* close file first, otherwise TagLib enounters an ERROR_SHARING_VIOLATION
 		 * The process cannot access the file because it is being used.
 		 * ditto for post-export and upload.
@@ -336,8 +350,9 @@ ExportHandler::finish_timespan ()
 		}
 
 		if (!fmt->command().empty()) {
+			SessionMetadata const & metadata (*SessionMetadata::Metadata());
 
-#if 0			// would be nicer with C++11 initialiser...
+#if 0	// would be nicer with C++11 initialiser...
 			std::map<char, std::string> subs {
 				{ 'f', filename },
 				{ 'd', Glib::path_get_dirname(filename)  + G_DIR_SEPARATOR },
@@ -348,11 +363,38 @@ ExportHandler::finish_timespan ()
 			export_status->active_job = ExportStatus::Command;
 			PBD::ScopedConnection command_connection;
 			std::map<char, std::string> subs;
-			subs.insert (std::pair<char, std::string> ('f', filename));
-			subs.insert (std::pair<char, std::string> ('d', Glib::path_get_dirname (filename) + G_DIR_SEPARATOR));
+
+			std::stringstream track_number;
+			track_number << metadata.track_number ();
+			std::stringstream total_tracks;
+			total_tracks << metadata.total_tracks ();
+			std::stringstream year;
+			year << metadata.year ();
+
+			subs.insert (std::pair<char, std::string> ('a', metadata.artist ()));
 			subs.insert (std::pair<char, std::string> ('b', PBD::basename_nosuffix (filename)));
-			subs.insert (std::pair<char, std::string> ('s', session.path ()));
+			subs.insert (std::pair<char, std::string> ('c', metadata.copyright ()));
+			subs.insert (std::pair<char, std::string> ('d', Glib::path_get_dirname (filename) + G_DIR_SEPARATOR));
+			subs.insert (std::pair<char, std::string> ('f', filename));
+			subs.insert (std::pair<char, std::string> ('l', metadata.lyricist ()));
 			subs.insert (std::pair<char, std::string> ('n', session.name ()));
+			subs.insert (std::pair<char, std::string> ('s', session.path ()));
+			subs.insert (std::pair<char, std::string> ('o', metadata.conductor ()));
+			subs.insert (std::pair<char, std::string> ('t', metadata.title ()));
+			subs.insert (std::pair<char, std::string> ('z', metadata.organization ()));
+			subs.insert (std::pair<char, std::string> ('A', metadata.album ()));
+			subs.insert (std::pair<char, std::string> ('C', metadata.comment ()));
+			subs.insert (std::pair<char, std::string> ('E', metadata.engineer ()));
+			subs.insert (std::pair<char, std::string> ('G', metadata.genre ()));
+			subs.insert (std::pair<char, std::string> ('L', total_tracks.str ()));
+			subs.insert (std::pair<char, std::string> ('M', metadata.mixer ()));
+			subs.insert (std::pair<char, std::string> ('N', current_timespan->name())); // =?= config_map.begin()->first->name ()
+			subs.insert (std::pair<char, std::string> ('O', metadata.composer ()));
+			subs.insert (std::pair<char, std::string> ('P', metadata.producer ()));
+			subs.insert (std::pair<char, std::string> ('S', metadata.disc_subtitle ()));
+			subs.insert (std::pair<char, std::string> ('T', track_number.str ()));
+			subs.insert (std::pair<char, std::string> ('Y', year.str ()));
+			subs.insert (std::pair<char, std::string> ('Z', metadata.country ()));
 
 			ARDOUR::SystemExec *se = new ARDOUR::SystemExec(fmt->command(), subs);
 			info << "Post-export command line : {" << se->to_s () << "}" << endmsg;
@@ -517,10 +559,10 @@ ExportHandler::export_cd_marker_file (ExportTimespanPtr timespan, ExportFormatSp
 		}
 
 	} catch (std::exception& e) {
-		error << string_compose (_("an error occured while writing a TOC/CUE file: %1"), e.what()) << endmsg;
+		error << string_compose (_("an error occurred while writing a TOC/CUE file: %1"), e.what()) << endmsg;
 		::g_unlink (filepath.c_str());
 	} catch (Glib::Exception& e) {
-		error << string_compose (_("an error occured while writing a TOC/CUE file: %1"), e.what()) << endmsg;
+		error << string_compose (_("an error occurred while writing a TOC/CUE file: %1"), e.what()) << endmsg;
 		::g_unlink (filepath.c_str());
 	}
 }
@@ -808,7 +850,7 @@ ExportHandler::toc_escape_cdtext (const std::string& txt)
 	char buf[5];
 
 	try {
-		latin1_txt = Glib::convert (txt, "ISO-8859-1", "UTF-8");
+		latin1_txt = Glib::convert_with_fallback (txt, "ISO-8859-1", "UTF-8", "_");
 	} catch (Glib::ConvertError& err) {
 		throw Glib::ConvertError (err.code(), string_compose (_("Cannot convert %1 to Latin-1 text"), txt));
 	}
diff --git a/libs/ardour/export_multiplication.cc b/libs/ardour/export_multiplication.cc
deleted file mode 100644
index 13b7a4a..0000000
--- a/libs/ardour/export_multiplication.cc
+++ /dev/null
@@ -1,697 +0,0 @@
-/*
-    Copyright (C) 2008-2012 Paul Davis
-    Author: Sakari Bergen
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-*/
-
-/* This file is not used at the moment. It includes code related to export a
- * multiplication graph system that can be used together with the ExportMultiplicator
- * class in the gtk2_ardour folder.
- * - Sakari Bergen 6.8.2008 -
- */
-
-void
-ExportProfileManager::register_all_configs ()
-{
-	list<TimespanNodePtr>::iterator tsl_it; // timespan list node iterator
-	for (tsl_it = graph.timespans.begin(); tsl_it != graph.timespans.end(); ++tsl_it) {
-		list<GraphNode *>::const_iterator cc_it; // channel config node iterator
-		for (cc_it = (*tsl_it)->get_children().begin(); cc_it != (*tsl_it)->get_children().end(); ++cc_it) {
-			list<GraphNode *>::const_iterator f_it; // format node iterator
-			for (f_it = (*cc_it)->get_children().begin(); f_it != (*cc_it)->get_children().end(); ++f_it) {
-				list<GraphNode *>::const_iterator fn_it; // filename node iterator
-				for (fn_it = (*f_it)->get_children().begin(); fn_it != (*f_it)->get_children().end(); ++fn_it) {
-					/* Finally loop through each timespan in the timespan list */
-
-					TimespanNodePtr ts_node;
-					if (!(ts_node = boost::dynamic_pointer_cast<TimespanNode> (*tsl_it))) {
-						throw ExportFailed (X_("Programming error, Invalid pointer cast in ExportProfileManager"));
-					}
-
-					TimespanListPtr ts_list = ts_node->data()->timespans;
-					TimespanList::iterator ts_it;
-					for (ts_it = ts_list->begin(); ts_it != ts_list->end(); ++ts_it) {
-
-						TimespanPtr timespan = *ts_it;
-
-						ChannelConfigNode * cc_node;
-						if (!(cc_node = dynamic_cast<ChannelConfigNode *> (*cc_it))) {
-							throw ExportFailed (X_("Programming error, Invalid pointer cast in ExportProfileManager"));
-						}
-						ChannelConfigPtr channel_config = cc_node->data()->config;
-
-						FormatNode * f_node;
-						if (!(f_node = dynamic_cast<FormatNode *> (*f_it))) {
-							throw ExportFailed (X_("Programming error, Invalid pointer cast in ExportProfileManager"));
-						}
-						FormatPtr format = f_node->data()->format;
-
-						FilenameNode * fn_node;
-						if (!(fn_node = dynamic_cast<FilenameNode *> (*fn_it))) {
-							throw ExportFailed (X_("Programming error, Invalid pointer cast in ExportProfileManager"));
-						}
-						FilenamePtr filename = fn_node->data()->filename;
-
-						handler->add_export_config (timespan, channel_config, format, filename);
-					}
-				}
-			}
-		}
-	}
-}
-
-void
-ExportProfileManager::create_empty_config ()
-{
-	TimespanNodePtr timespan = TimespanNode::create (new TimespanState ());
-	timespan->data()->timespans->push_back (handler->add_timespan());
-
-	ChannelConfigNodePtr channel_config = ChannelConfigNode::create (new ChannelConfigState(handler->add_channel_config()));
-
-	FormatNodePtr format;
-	load_formats ();
-	if (!format_list.empty()) {
-		format = FormatNode::create (new FormatState (*format_list.begin ()));
-	} else {
-		format = FormatNode::create (new FormatState (handler->add_format ()));
-	}
-
-	FilenameNodePtr filename = FilenameNode::create (new FilenameState (handler->add_filename()));
-
-	/* Bring everything together */
-
-	timespan->add_child (channel_config.get(), 0);
-	channel_config->add_child (format.get(), 0);
-	format->add_child (filename.get(), 0);
-
-	graph.timespans.push_back (timespan);
-	graph.channel_configs.push_back (channel_config);
-	graph.formats.push_back (format);
-	graph.filenames.push_back (filename);
-}
-
-/*** GraphNode ***/
-
-uint32_t ExportProfileManager::GraphNode::id_counter = 0;
-
-ExportProfileManager::GraphNode::GraphNode ()
-{
-	_id = ++id_counter;
-}
-
-ExportProfileManager::GraphNode::~GraphNode ()
-{
-	while (!children.empty()) {
-		remove_child (children.front());
-	}
-
-	while (!parents.empty()) {
-		parents.front()->remove_child (this);
-	}
-}
-
-void
-ExportProfileManager::GraphNode::add_parent (GraphNode * parent)
-{
-	for (list<GraphNode *>::iterator it = parents.begin(); it != parents.end(); ++it) {
-		if (*it == parent) {
-			return;
-		}
-	}
-
-	parents.push_back (parent);
-}
-
-void
-ExportProfileManager::GraphNode::add_child (GraphNode * child, GraphNode * left_sibling)
-{
-	for (list<GraphNode *>::iterator it = children.begin(); it != children.end(); ++it) {
-		if (*it == child) {
-			return;
-		}
-	}
-
-	if (left_sibling) {
-		insert_after (children, left_sibling, child);
-	} else {
-		children.push_back (child);
-	}
-
-	child->add_parent (this);
-}
-
-bool
-ExportProfileManager::GraphNode::is_ancestor_of (GraphNode const * node) const
-{
-	for (list<GraphNode *>::const_iterator it = children.begin(); it != children.end(); ++it) {
-		if (*it == node || (*it)->is_ancestor_of (node)) {
-			return true;
-		}
-	}
-
-	return false;
-}
-
-bool
-ExportProfileManager::GraphNode::is_descendant_of (GraphNode const * node) const
-{
-	for (list<GraphNode *>::const_iterator it = parents.begin(); it != parents.end(); ++it) {
-		if (*it == node || (*it)->is_descendant_of (node)) {
-			return true;
-		}
-	}
-
-	return false;
-}
-
-void
-ExportProfileManager::GraphNode::select (bool value)
-{
-	if (_selected == value) { return; }
-
-	_selected = value;
-	SelectChanged (value);
-}
-
-void
-ExportProfileManager::GraphNode::remove_parent (GraphNode * parent)
-{
-	for (list<GraphNode *>::iterator it = parents.begin(); it != parents.end(); ++it) {
-		if (*it == parent) {
-			parents.erase (it);
-			break;
-		}
-	}
-}
-
-void
-ExportProfileManager::GraphNode::remove_child (GraphNode * child)
-{
-	for (list<GraphNode *>::iterator it = children.begin(); it != children.end(); ++it) {
-		if (*it == child) {
-			children.erase (it);
-			break;
-		}
-	}
-
-	child->remove_parent (this);
-}
-
-void
-ExportProfileManager::split_node (GraphNode * node, float position)
-{
-	TimespanNode * ts_node;
-	if ((ts_node = dynamic_cast<TimespanNode *> (node))) {
-		split_timespan (ts_node->self_ptr(), position);
-		return;
-	}
-
-	ChannelConfigNode * cc_node;
-	if ((cc_node = dynamic_cast<ChannelConfigNode *> (node))) {
-		split_channel_config (cc_node->self_ptr(), position);
-		return;
-	}
-
-	FormatNode * f_node;
-	if ((f_node = dynamic_cast<FormatNode *> (node))) {
-		split_format (f_node->self_ptr(), position);
-		return;
-	}
-
-	FilenameNode * fn_node;
-	if ((fn_node = dynamic_cast<FilenameNode *> (node))) {
-		split_filename (fn_node->self_ptr(), position);
-		return;
-	}
-}
-
-void
-ExportProfileManager::remove_node (GraphNode * node)
-{
-	TimespanNode * ts_node;
-	if ((ts_node = dynamic_cast<TimespanNode *> (node))) {
-		remove_timespan (ts_node->self_ptr());
-		return;
-	}
-
-	ChannelConfigNode * cc_node;
-	if ((cc_node = dynamic_cast<ChannelConfigNode *> (node))) {
-		remove_channel_config (cc_node->self_ptr());
-		return;
-	}
-
-	FormatNode * f_node;
-	if ((f_node = dynamic_cast<FormatNode *> (node))) {
-		remove_format (f_node->self_ptr());
-		return;
-	}
-
-	FilenameNode * fn_node;
-	if ((fn_node = dynamic_cast<FilenameNode *> (node))) {
-		remove_filename (fn_node->self_ptr());
-		return;
-	}
-}
-
-void
-ExportProfileManager::purge_graph ()
-{
-	for (list<TimespanNodePtr>::iterator it = graph.timespans.begin(); it != graph.timespans.end(); ) {
-		list<TimespanNodePtr>::iterator tmp = it;
-		++it;
-
-		if ((*tmp)->get_children().empty()) {
-			graph.timespans.erase (tmp);
-		}
-	}
-
-	for (list<ChannelConfigNodePtr>::iterator it = graph.channel_configs.begin(); it != graph.channel_configs.end(); ) {
-		list<ChannelConfigNodePtr>::iterator tmp = it;
-		++it;
-
-		if ((*tmp)->get_parents().empty()) {
-			graph.channel_configs.erase (tmp);
-		}
-	}
-
-	for (list<FormatNodePtr>::iterator it = graph.formats.begin(); it != graph.formats.end(); ) {
-		list<FormatNodePtr>::iterator tmp = it;
-		++it;
-
-		if ((*tmp)->get_parents().empty()) {
-			graph.formats.erase (tmp);
-		}
-	}
-
-	for (list<FilenameNodePtr>::iterator it = graph.filenames.begin(); it != graph.filenames.end(); ) {
-		list<FilenameNodePtr>::iterator tmp = it;
-		++it;
-
-		if ((*tmp)->get_parents().empty()) {
-			graph.filenames.erase (tmp);
-		}
-	}
-
-	GraphChanged();
-}
-
-template<typename T>
-void
-ExportProfileManager::insert_after (list<T> & the_list, T const & position, T const & element)
-{
-	typename list<T>::iterator it;
-	for (it = the_list.begin(); it != the_list.end(); ++it) {
-		if (*it == position) {
-			the_list.insert (++it, element);
-			return;
-		}
-	}
-
-	std::cerr << "invalid position given to ExportProfileManager::insert_after (aborting)" << std::endl;
-
-	abort();
-}
-
-template<typename T>
-void
-ExportProfileManager::remove_by_element (list<T> & the_list, T const & element)
-{
-	typename list<T>::iterator it;
-	for (it = the_list.begin(); it != the_list.end(); ++it) {
-		if (*it == element) {
-			the_list.erase (it);
-			return;
-		}
-	}
-}
-
-bool
-ExportProfileManager::nodes_have_one_common_child (list<GraphNode *> const & the_list)
-{
-	return end_of_common_child_range (the_list, the_list.begin()) == --the_list.end();
-}
-
-list<ExportProfileManager::GraphNode *>::const_iterator
-ExportProfileManager::end_of_common_child_range (list<GraphNode *> const & the_list, list<GraphNode *>::const_iterator beginning)
-{
-	if ((*beginning)->get_children().size() != 1) { return beginning; }
-	GraphNode * child = (*beginning)->get_children().front();
-
-	list<GraphNode *>::const_iterator it = beginning;
-	while (it != the_list.end() && (*it)->get_children().size() == 1 && (*it)->get_children().front() == child) {
-		++it;
-	}
-
-	return --it;
-}
-
-void
-ExportProfileManager::split_node_at_position (GraphNode * old_node, GraphNode * new_node, float position)
-{
-	list<GraphNode *> const & node_parents = old_node->get_parents();
-	uint32_t split_index = (int) (node_parents.size() * position + 0.5);
-	split_index = std::max ((uint32_t) 1, std::min (split_index, node_parents.size() - 1));
-
-	list<GraphNode *>::const_iterator it = node_parents.begin();
-	for (uint32_t index = 1; it != node_parents.end(); ++index) {
-		if (index > split_index) {
-			list<GraphNode *>::const_iterator tmp = it++;
-			(*tmp)->add_child (new_node, old_node);
-			(*tmp)->remove_child (old_node);
-		} else {
-			++it;
-		}
-	}
-}
-
-void
-ExportProfileManager::split_timespan (TimespanNodePtr node, float)
-{
-	TimespanNodePtr new_timespan = duplicate_timespan_node (node);
-	insert_after (graph.timespans, node, new_timespan);
-
-	/* Note: Since a timespan selector allows all combinations of ranges
-	 * there is no reason for a channel configuration to have two parents
-	 */
-
-	duplicate_timespan_children (node->self_ptr(), new_timespan);
-
-	GraphChanged();
-}
-
-void
-ExportProfileManager::split_channel_config (ChannelConfigNodePtr node, float)
-{
-	ChannelConfigNodePtr new_config = duplicate_channel_config_node (node);
-	insert_after (graph.channel_configs, node, new_config);
-
-	/* Channel configs have only one parent, see above! */
-	node->get_parents().front()->add_child (new_config.get(), node.get());
-
-	if (node->get_children().size() == 1) {
-		new_config->add_child (node->first_child(), 0);
-	} else {
-		duplicate_channel_config_children (node, new_config);
-	}
-
-	GraphChanged();
-}
-
-void
-ExportProfileManager::split_format (FormatNodePtr node, float position)
-{
-	FormatNodePtr new_format = duplicate_format_node (node);
-	insert_after (graph.formats, node, new_format);
-
-	list<GraphNode *> const & node_parents = node->get_parents();
-	if (node_parents.size() == 1) {
-		node_parents.front()->add_child (new_format.get(), 0);
-	} else {
-		node->sort_parents (graph.channel_configs);
-		split_node_at_position (node.get(), new_format.get(), position);
-	}
-
-	if (node->get_children().size() == 1) {
-		new_format->add_child (node->first_child(), 0);
-	} else {
-		duplicate_format_children (node, new_format);
-	}
-
-	GraphChanged();
-}
-
-void
-ExportProfileManager::split_filename (FilenameNodePtr node, float position)
-{
-	FilenameNodePtr new_filename = duplicate_filename_node (node);
-	insert_after (graph.filenames, node, new_filename);
-
-	list<GraphNode *> const & node_parents = node->get_parents();
-
-	if (node_parents.size() == 1) {
-		node_parents.front()->add_child (new_filename.get(), 0);
-	} else {
-		node->sort_parents (graph.formats);
-		split_node_at_position (node.get(), new_filename.get(), position);
-	}
-
-	GraphChanged();
-}
-
-void
-ExportProfileManager::duplicate_timespan_children (TimespanNodePtr source, TimespanNodePtr target, GraphNode * insertion_point)
-{
-	list<GraphNode *> const & source_children = source->get_children();
-	bool one_grandchild = nodes_have_one_common_child (source_children);
-	GraphNode * child_insertion_point = 0;
-
-	ChannelConfigNodePtr node_insertion_point;
-	ChannelConfigNode * node_insertion_ptr;
-	if (!insertion_point) { insertion_point = source->last_child(); }
-	if (!(node_insertion_ptr = dynamic_cast<ChannelConfigNode *> (insertion_point))) {
-		throw ExportFailed (X_("Programming error, Invalid pointer cast in ExportProfileManager"));
-	}
-	node_insertion_point = node_insertion_ptr->self_ptr();
-
-	/* Keep track of common children */
-
-	list<GraphNode *>::const_iterator common_children_begin = source_children.begin();
-	list<GraphNode *>::const_iterator common_children_end = end_of_common_child_range (source_children, source_children.begin());
-	GraphNode * common_child = 0;
-
-	for (list<GraphNode *>::const_iterator it = source_children.begin(); it != source_children.end(); ++it) {
-		/* Duplicate node */
-
-		ChannelConfigNode *  node;
-		ChannelConfigNodePtr new_node;
-
-		if (!(node = dynamic_cast<ChannelConfigNode *> (*it))) {
-			throw ExportFailed (X_("Programming error, Invalid pointer cast in ExportProfileManager"));
-		}
-
-		new_node = duplicate_channel_config_node (node->self_ptr());
-
-		/* Insert in gaph's list and update insertion position */
-
-		insert_after (graph.channel_configs, node_insertion_point, new_node);
-		node_insertion_point = new_node;
-
-		/* Handle children */
-
-		target->add_child (new_node.get(), child_insertion_point);
-		child_insertion_point = new_node.get();
-
-		if (one_grandchild) {
-			new_node->add_child (node->first_child(), 0);
-		} else {
-			list<GraphNode *>::const_iterator past_end = common_children_end;
-			if (it == ++past_end) { // At end => start new range
-				common_children_begin = it;
-				common_children_end = end_of_common_child_range (source_children, it);
-			}
-
-			if (it == common_children_begin) { // At beginning => do duplication
-				GraphNode * grand_child_ins_pt = common_child;
-				if (!grand_child_ins_pt) {
-					grand_child_ins_pt = source->last_child()->last_child();
-				}
-				duplicate_channel_config_children (node->self_ptr(), new_node, grand_child_ins_pt);
-				common_child = new_node->first_child();
-			} else { // Somewhere in between end and beginning => share child
-				new_node->add_child (common_child, 0);
-			}
-		}
-	}
-}
-
-void
-ExportProfileManager::duplicate_channel_config_children (ChannelConfigNodePtr source, ChannelConfigNodePtr target, GraphNode * insertion_point)
-{
-	list<GraphNode *> const & source_children = source->get_children();
-	bool one_grandchild = nodes_have_one_common_child (source_children);
-	GraphNode * child_insertion_point = 0;
-
-	FormatNodePtr node_insertion_point;
-	FormatNode * node_insertion_ptr;
-	if (!insertion_point) { insertion_point = source->last_child(); }
-	if (!(node_insertion_ptr = dynamic_cast<FormatNode *> (insertion_point))) {
-		throw ExportFailed (X_("Programming error, Invalid pointer cast in ExportProfileManager"));
-	}
-	node_insertion_point = node_insertion_ptr->self_ptr();
-
-	/* Keep track of common children */
-
-	list<GraphNode *>::const_iterator common_children_begin = source_children.begin();
-	list<GraphNode *>::const_iterator common_children_end = end_of_common_child_range (source_children, source_children.begin());
-	GraphNode * common_child = 0;
-
-	for (list<GraphNode *>::const_iterator it = source_children.begin(); it != source_children.end(); ++it) {
-		/* Duplicate node */
-
-		FormatNode *  node;
-		FormatNodePtr new_node;
-
-		if (!(node = dynamic_cast<FormatNode *> (*it))) {
-			throw ExportFailed (X_("Programming error, Invalid pointer cast in ExportProfileManager"));
-		}
-
-		new_node = duplicate_format_node (node->self_ptr());
-
-		/* Insert in gaph's list and update insertion position */
-
-		insert_after (graph.formats, node_insertion_point, new_node);
-		node_insertion_point = new_node;
-
-		/* Handle children */
-
-		target->add_child (new_node.get(), child_insertion_point);
-		child_insertion_point = new_node.get();
-
-		if (one_grandchild) {
-			new_node->add_child (node->first_child(), 0);
-		} else {
-			list<GraphNode *>::const_iterator past_end = common_children_end;
-			if (it == ++past_end) { // At end => start new range
-				common_children_begin = it;
-				common_children_end = end_of_common_child_range (source_children, it);
-			}
-
-			if (it == common_children_begin) { // At beginning => do duplication
-				GraphNode * grand_child_ins_pt = common_child;
-				if (!grand_child_ins_pt) {
-					grand_child_ins_pt = source->get_parents().back()->last_child()->last_child()->last_child();
-				}
-				duplicate_format_children (node->self_ptr(), new_node, grand_child_ins_pt);
-				common_child = new_node->first_child();
-			} else { // Somewhere in between end and beginning => share child
-				new_node->add_child (common_child, 0);
-			}
-		}
-	}
-}
-
-void
-ExportProfileManager::duplicate_format_children (FormatNodePtr source, FormatNodePtr target, GraphNode * insertion_point)
-{
-	GraphNode * child_insertion_point = 0;
-
-	FilenameNodePtr node_insertion_point;
-	FilenameNode * node_insertion_ptr;
-	if (!insertion_point) { insertion_point = source->last_child(); }
-	if (!(node_insertion_ptr = dynamic_cast<FilenameNode *> (insertion_point))) {
-		throw ExportFailed (X_("Programming error, Invalid pointer cast in ExportProfileManager"));
-	}
-	node_insertion_point = node_insertion_ptr->self_ptr();
-
-	for (list<GraphNode *>::const_iterator it = source->get_children().begin(); it != source->get_children().end(); ++it) {
-		/* Duplicate node */
-
-		FilenameNode *  node;
-		FilenameNodePtr new_node;
-
-		if (!(node = dynamic_cast<FilenameNode *> (*it))) {
-			throw ExportFailed (X_("Programming error, Invalid pointer cast in ExportProfileManager"));
-		}
-
-		new_node = duplicate_filename_node (node->self_ptr());
-
-		/* Insert in gaph's list and update insertion position */
-
-		insert_after (graph.filenames, node_insertion_point, new_node);
-		node_insertion_point = new_node;
-
-		/* Handle children */
-
-		target->add_child (new_node.get(), child_insertion_point);
-		child_insertion_point = new_node.get();
-	}
-}
-
-ExportProfileManager::TimespanNodePtr
-ExportProfileManager::duplicate_timespan_node (TimespanNodePtr node)
-{
-	TimespanStatePtr state = node->data();
-	TimespanStatePtr new_state (new TimespanState ());
-	TimespanNodePtr  new_node = TimespanNode::create (new_state);
-
-	for (TimespanList::iterator it = state->timespans->begin(); it != state->timespans->end(); ++it) {
-		new_state->timespans->push_back (handler->add_timespan_copy (*it));
-	}
-
-	new_state->time_format = state->time_format;
-	new_state->marker_format = state->marker_format;
-
-	return new_node;
-}
-
-ExportProfileManager::ChannelConfigNodePtr
-ExportProfileManager::duplicate_channel_config_node (ChannelConfigNodePtr node)
-{
-	ChannelConfigStatePtr state = node->data();
-	ChannelConfigStatePtr new_state (new ChannelConfigState (handler->add_channel_config_copy (state->config)));
-	ChannelConfigNodePtr  new_node = ChannelConfigNode::create (new_state);
-
-	return new_node;
-}
-
-ExportProfileManager::FormatNodePtr
-ExportProfileManager::duplicate_format_node (FormatNodePtr node)
-{
-	FormatStatePtr state = node->data();
-	FormatStatePtr new_state (new FormatState (handler->add_format_copy (state->format)));
-	FormatNodePtr  new_node = FormatNode::create (new_state);
-
-	return new_node;
-}
-
-ExportProfileManager::FilenameNodePtr
-ExportProfileManager::duplicate_filename_node (FilenameNodePtr node)
-{
-	FilenameStatePtr state = node->data();
-	FilenameStatePtr new_state (new FilenameState (handler->add_filename_copy (state->filename)));
-	FilenameNodePtr  new_node = FilenameNode::create (new_state);
-
-	return new_node;
-}
-
-void
-ExportProfileManager::remove_timespan (TimespanNodePtr node)
-{
-	remove_by_element (graph.timespans, node);
-	purge_graph ();
-}
-
-void
-ExportProfileManager::remove_channel_config (ChannelConfigNodePtr node)
-{
-	remove_by_element (graph.channel_configs, node);
-	purge_graph ();
-}
-
-void
-ExportProfileManager::remove_format (FormatNodePtr node)
-{
-	remove_by_element (graph.formats, node);
-	purge_graph ();
-}
-
-void
-ExportProfileManager::remove_filename (FilenameNodePtr node)
-{
-	remove_by_element (graph.filenames, node);
-	purge_graph ();
-}
diff --git a/libs/ardour/export_preset.cc b/libs/ardour/export_preset.cc
index c6bae09..dec4c4b 100644
--- a/libs/ardour/export_preset.cc
+++ b/libs/ardour/export_preset.cc
@@ -30,7 +30,7 @@ ExportPreset::ExportPreset (string filename, Session & s) :
 {
 	XMLNode * root;
 	if ((root = global.root())) {
-		XMLProperty * prop;
+		XMLProperty const * prop;
 		if ((prop = root->property ("id"))) {
 			set_id (prop->value());
 		}
@@ -124,7 +124,7 @@ ExportPreset::get_instant_xml () const
 	if ((instant_xml = session.instant_xml ("ExportPresets"))) {
 		XMLNodeList children = instant_xml->children ("ExportPreset");
 		for (XMLNodeList::iterator it = children.begin(); it != children.end(); ++it) {
-			XMLProperty * prop;
+			XMLProperty const * prop;
 			if ((prop = (*it)->property ("id")) && _id == PBD::UUID(prop->value())) {
 				return *it;
 			}
diff --git a/libs/ardour/export_profile_manager.cc b/libs/ardour/export_profile_manager.cc
index 932b990..be9cdd6 100644
--- a/libs/ardour/export_profile_manager.cc
+++ b/libs/ardour/export_profile_manager.cc
@@ -48,7 +48,7 @@
 #include "ardour/session.h"
 #include "ardour/broadcast_info.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace Glib;
@@ -58,7 +58,7 @@ namespace ARDOUR
 {
 
 ExportProfileManager::ExportProfileManager (Session & s, ExportType type)
-  : type(type)
+  : _type(type)
   , handler (s.get_export_handler())
   , session (s)
 
@@ -162,7 +162,7 @@ ExportProfileManager::prepare_for_export ()
 			}
 
 			// ...and each channel config
-			filename->include_channel_config = (type == StemExport) ||
+			filename->include_channel_config = (_type == StemExport) ||
 			                                   (channel_configs.size() > 1);
 			for(ChannelConfigStateList::iterator cc_it = channel_configs.begin(); cc_it != channel_configs.end(); ++cc_it) {
 				handler->add_export_config (*ts_it, (*cc_it)->config, (*format_it)->format, filename, b);
@@ -180,9 +180,14 @@ ExportProfileManager::load_preset (ExportPresetPtr preset)
 	if (!preset) { return false; }
 
 	XMLNode const * state;
+	/* local state is saved in instant.xml and contains timespan
+	 * and channel config for per session.
+	 * It may not be present for a given preset/session combination
+	 * and is never preset for system-wide presets, but that's OK.
+	 */
 	if ((state = preset->get_local_state())) {
 		set_local_state (*state);
-	} else { ok = false; }
+	}
 
 	if ((state = preset->get_global_state())) {
 		if (!set_global_state (*state)) {
@@ -701,7 +706,7 @@ ExportProfileManager::init_formats (XMLNodeList nodes)
 ExportProfileManager::FormatStatePtr
 ExportProfileManager::deserialize_format (XMLNode & root)
 {
-	XMLProperty * prop;
+	XMLProperty const * prop;
 	PBD::UUID id;
 
 	if ((prop = root.property ("id"))) {
diff --git a/libs/ardour/export_status.cc b/libs/ardour/export_status.cc
index 1700739..808d6f1 100644
--- a/libs/ardour/export_status.cc
+++ b/libs/ardour/export_status.cc
@@ -50,8 +50,8 @@ ExportStatus::init ()
 	total_frames_current_timespan = 0;
 	processed_frames_current_timespan = 0;
 
-	total_normalize_cycles = 0;
-	current_normalize_cycle = 0;
+	total_postprocessing_cycles = 0;
+	current_postprocessing_cycle = 0;
 	result_map.clear();
 }
 
diff --git a/libs/ardour/export_timespan.cc b/libs/ardour/export_timespan.cc
index 3b20213..f8a0676 100644
--- a/libs/ardour/export_timespan.cc
+++ b/libs/ardour/export_timespan.cc
@@ -28,7 +28,8 @@ ExportTimespan::ExportTimespan (ExportStatusPtr status, framecnt_t frame_rate) :
 	start_frame (0),
 	end_frame (0),
 	position (0),
-	frame_rate (frame_rate)
+	frame_rate (frame_rate),
+	_realtime (false)
 {
 
 }
diff --git a/libs/ardour/file_source.cc b/libs/ardour/file_source.cc
index 3ec561d..c05a0a4 100644
--- a/libs/ardour/file_source.cc
+++ b/libs/ardour/file_source.cc
@@ -44,7 +44,7 @@
 #include "ardour/source.h"
 #include "ardour/utils.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
@@ -140,7 +140,7 @@ FileSource::init (const string& pathstr, bool must_exist)
 int
 FileSource::set_state (const XMLNode& node, int /*version*/)
 {
-	const XMLProperty* prop;
+	XMLProperty const * prop;
 
 	if ((prop = node.property (X_("channel"))) != 0) {
 		_channel = atoi (prop->value());
diff --git a/libs/ardour/filename_extensions.cc b/libs/ardour/filename_extensions.cc
index fa6ca07..c575f12 100644
--- a/libs/ardour/filename_extensions.cc
+++ b/libs/ardour/filename_extensions.cc
@@ -19,7 +19,7 @@
 
 #include "ardour/filename_extensions.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 namespace ARDOUR {
 
diff --git a/libs/ardour/filesystem_paths.cc b/libs/ardour/filesystem_paths.cc
index fcdf42c..47b9994 100644
--- a/libs/ardour/filesystem_paths.cc
+++ b/libs/ardour/filesystem_paths.cc
@@ -29,7 +29,7 @@
 #include "ardour/directory_names.h"
 #include "ardour/filesystem_paths.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 #ifdef PLATFORM_WINDOWS
 #include "shlobj.h"
diff --git a/libs/ardour/filter.cc b/libs/ardour/filter.cc
index 36a74da..6ebf231 100644
--- a/libs/ardour/filter.cc
+++ b/libs/ardour/filter.cc
@@ -32,7 +32,7 @@
 #include "ardour/smf_source.h"
 #include "ardour/source_factory.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
diff --git a/libs/ardour/find_session.cc b/libs/ardour/find_session.cc
index c470ef7..af39a47 100644
--- a/libs/ardour/find_session.cc
+++ b/libs/ardour/find_session.cc
@@ -35,7 +35,7 @@
 #include "ardour/utils.h"
 #include "ardour/session_utils.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace PBD;
diff --git a/libs/ardour/fixed_delay.cc b/libs/ardour/fixed_delay.cc
new file mode 100644
index 0000000..f4c8b98
--- /dev/null
+++ b/libs/ardour/fixed_delay.cc
@@ -0,0 +1,154 @@
+/*
+ * Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+
+#include "ardour/audio_buffer.h"
+#include "ardour/buffer_set.h"
+#include "ardour/fixed_delay.h"
+#include "ardour/midi_buffer.h"
+
+using namespace ARDOUR;
+
+FixedDelay::FixedDelay ()
+	: _max_delay (0)
+	, _buf_size (0)
+	, _delay (0)
+{
+	for (size_t i = 0; i < DataType::num_types; ++i) {
+		_buffers.push_back (BufferVec ());
+	}
+	_count.reset ();
+}
+
+FixedDelay::~FixedDelay ()
+{
+	clear ();
+}
+
+void
+FixedDelay::ensure_buffers (DataType type, size_t num_buffers, size_t buffer_capacity)
+{
+	assert (type != DataType::NIL);
+	assert (type < _buffers.size ());
+	if (num_buffers == 0) {
+		return;
+	}
+	BufferVec& bufs = _buffers[type];
+	if (bufs.size () < num_buffers || (bufs.size () > 0 && bufs[0]->buf->capacity () < buffer_capacity)) {
+		for (BufferVec::iterator i = bufs.begin (); i != bufs.end (); ++i) {
+			delete (*i);
+		}
+		bufs.clear ();
+		for (size_t i = 0; i < num_buffers; ++i) {
+			bufs.push_back (new DelayBuffer (type, buffer_capacity));
+		}
+		_count.set (type, num_buffers);
+	}
+}
+
+void
+FixedDelay::clear ()
+{
+	for (std::vector<BufferVec>::iterator i = _buffers.begin (); i != _buffers.end (); ++i) {
+		for (BufferVec::iterator j = (*i).begin (); j != (*i).end (); ++j) {
+			delete *j;
+		}
+		(*i).clear ();
+	}
+	_buffers.clear ();
+	_count.reset ();
+}
+
+void
+FixedDelay::flush()
+{
+	for (std::vector<BufferVec>::iterator i = _buffers.begin (); i != _buffers.end (); ++i) {
+		for (BufferVec::iterator j = (*i).begin (); j != (*i).end (); ++j) {
+			(*j)->buf->silence (_buf_size);
+		}
+	}
+}
+
+void
+FixedDelay::configure (const ChanCount& count, framecnt_t max_delay, bool shrink)
+{
+	if (shrink) {
+		if (max_delay == _max_delay && count == _count) {
+			return;
+		}
+		_max_delay = max_delay;
+	} else if (max_delay <= _max_delay || count <= _count) {
+		return;
+		_max_delay = std::max (_max_delay, max_delay);
+	}
+
+	// max possible (with all engines and during export)
+	static const framecnt_t max_block_length = 8192;
+	_buf_size = _max_delay + max_block_length;
+	for (DataType::iterator i = DataType::begin (); i != DataType::end (); ++i) {
+		ensure_buffers (*i, count.get (*i), _buf_size);
+	}
+}
+
+void
+FixedDelay::set (const ChanCount& count, framecnt_t delay)
+{
+	configure (count, delay, false);
+	if (_delay != delay) {
+		flush ();
+	}
+	_delay = delay;
+}
+
+void
+FixedDelay::delay (
+		ARDOUR::DataType dt, uint32_t id,
+		Buffer& out, const Buffer& in,
+		pframes_t n_frames,
+		framecnt_t dst_offset, framecnt_t src_offset)
+{
+	if (_delay == 0) {
+		out.read_from (in, n_frames, dst_offset, src_offset);
+		return;
+	}
+
+	assert (dt < _buffers.size ());
+	assert (id < _buffers[dt].size ());
+	DelayBuffer *db = _buffers[dt][id];
+
+	if (db->pos + n_frames > _buf_size) {
+		uint32_t w0 = _buf_size - db->pos;
+		uint32_t w1 = db->pos + n_frames - _buf_size;
+		db->buf->read_from (in, w0, db->pos, src_offset);
+		db->buf->read_from (in, w1, 0, src_offset + w0);
+	} else {
+		db->buf->read_from (in, n_frames, db->pos, src_offset);
+	}
+
+	uint32_t rp = (db->pos + _buf_size - _delay) % _buf_size;
+
+	if (rp + n_frames > _buf_size) {
+		uint32_t r0 = _buf_size - rp;
+		uint32_t r1 = rp + n_frames - _buf_size;
+		out.read_from (*db->buf, r0, dst_offset, rp);
+		out.read_from (*db->buf, r1, dst_offset + r0, 0);
+	} else {
+		out.read_from (*db->buf, n_frames, dst_offset, rp);
+	}
+
+	db->pos = (db->pos + n_frames) % _buf_size;
+}
diff --git a/libs/ardour/gain_control.cc b/libs/ardour/gain_control.cc
index 867edaf..8910c9a 100644
--- a/libs/ardour/gain_control.cc
+++ b/libs/ardour/gain_control.cc
@@ -16,19 +16,26 @@
     675 Mass Ave, Cambridge, MA 02139, USA.
 */
 
+#include <cmath>
+
+#include "pbd/convert.h"
+#include "pbd/strsplit.h"
+
 #include "ardour/dB.h"
 #include "ardour/gain_control.h"
 #include "ardour/session.h"
+#include "ardour/vca.h"
+#include "ardour/vca_manager.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 using namespace std;
 
 GainControl::GainControl (Session& session, const Evoral::Parameter &param, boost::shared_ptr<AutomationList> al)
-	: AutomationControl (session, param, ParameterDescriptor(param),
-	                     al ? al : boost::shared_ptr<AutomationList> (new AutomationList (param)),
-	                     param.type() == GainAutomation ? X_("gaincontrol") : X_("trimcontrol")) {
+	: SlavableAutomationControl (session, param, ParameterDescriptor(param),
+	                             al ? al : boost::shared_ptr<AutomationList> (new AutomationList (param)),
+	                             param.type() == GainAutomation ? X_("gaincontrol") : X_("trimcontrol")) {
 
 	alist()->reset_default (1.0);
 
@@ -36,28 +43,6 @@ GainControl::GainControl (Session& session, const Evoral::Parameter &param, boos
 	range_db = accurate_coefficient_to_dB (_desc.upper) - lower_db;
 }
 
-void
-GainControl::set_value (double val, PBD::Controllable::GroupControlDisposition group_override)
-{
-	if (writable()) {
-		_set_value (val, group_override);
-	}
-}
-
-void
-GainControl::set_value_unchecked (double val)
-{
-	/* used only automation playback */
-	_set_value (val, Controllable::NoGroup);
-}
-
-void
-GainControl::_set_value (double val, Controllable::GroupControlDisposition group_override)
-{
-	AutomationControl::set_value (std::max (std::min (val, (double)_desc.upper), (double)_desc.lower), group_override);
-	_session.set_dirty ();
-}
-
 double
 GainControl::internal_to_interface (double v) const
 {
@@ -97,3 +82,102 @@ GainControl::get_user_string () const
 	return std::string(theBuf);
 }
 
+void
+GainControl::inc_gain (gain_t factor)
+{
+	/* To be used ONLY when doing group-relative gain adjustment, from
+	 * ControlGroup::set_group_values().
+	 */
+
+	const float desired_gain = user_double();
+
+	if (fabsf (desired_gain) < GAIN_COEFF_SMALL) {
+		// really?! what's the idea here?
+		actually_set_value (0.000001f + (0.000001f * factor), Controllable::ForGroup);
+	} else {
+		actually_set_value (desired_gain + (desired_gain * factor), Controllable::ForGroup);
+	}
+}
+
+void
+GainControl::recompute_masters_ratios (double val)
+{
+	/* Master WRITE lock must be held */
+
+	/* V' is the new gain value for this
+
+	   Mv(n) is the return value of ::get_value() for the n-th master
+	   Mr(n) is the return value of ::ratio() for the n-th master record
+
+	   the slave should return V' on the next call to ::get_value().
+
+	   but the value is determined by the masters, so we know:
+
+	   V' = (Mv(1) * Mr(1)) * (Mv(2) * Mr(2)) * ... * (Mv(n) * Mr(n))
+
+	   hence:
+
+	   Mr(1) * Mr(2) * ... * (Mr(n) = V' / (Mv(1) * Mv(2) * ... * Mv(n))
+
+	   if we make all ratios equal (i.e. each master contributes the same
+	   fraction of its own gain level to make the final slave gain), then we
+	   have:
+
+	   pow (Mr(n), n) = V' / (Mv(1) * Mv(2) * ... * Mv(n))
+
+	   which gives
+
+	   Mr(n) = pow ((V' / (Mv(1) * Mv(2) * ... * Mv(n))), 1/n)
+
+	   Mr(n) is the new ratio number for the slaves
+	*/
+
+
+	const double nmasters = _masters.size();
+	double masters_total_gain_coefficient = 1.0;
+
+	for (Masters::iterator mr = _masters.begin(); mr != _masters.end(); ++mr) {
+		masters_total_gain_coefficient *= mr->second.master()->get_value();
+	}
+
+	const double new_universal_ratio = pow ((val / masters_total_gain_coefficient), (1.0/nmasters));
+
+	for (Masters::iterator mr = _masters.begin(); mr != _masters.end(); ++mr) {
+		mr->second.reset_ratio (new_universal_ratio);
+	}
+}
+
+XMLNode&
+GainControl::get_state ()
+{
+	XMLNode& node (AutomationControl::get_state());
+
+#if 0
+	/* store VCA master IDs */
+
+	string str;
+
+	{
+		Glib::Threads::RWLock::ReaderLock lm (master_lock);
+		for (Masters::const_iterator mr = _masters.begin(); mr != _masters.end(); ++mr) {
+			if (!str.empty()) {
+				str += ',';
+			}
+			str += PBD::to_string (mr->first, std::dec);
+		}
+	}
+
+	if (!str.empty()) {
+		node.add_property (X_("masters"), str);
+	}
+#endif
+
+	return node;
+}
+
+int
+GainControl::set_state (XMLNode const& node, int version)
+{
+	return AutomationControl::set_state (node, version);
+}
+
diff --git a/libs/ardour/globals.cc b/libs/ardour/globals.cc
index 9f4a139..974247a 100644
--- a/libs/ardour/globals.cc
+++ b/libs/ardour/globals.cc
@@ -80,7 +80,6 @@
 #include "pbd/fpu.h"
 #include "pbd/file_utils.h"
 #include "pbd/enumwriter.h"
-#include "pbd/basename.h"
 
 #include "midi++/port.h"
 #include "midi++/mmc.h"
@@ -103,6 +102,7 @@
 #include "ardour/operations.h"
 #include "ardour/panner_manager.h"
 #include "ardour/plugin_manager.h"
+#include "ardour/presentation_info.h"
 #include "ardour/process_thread.h"
 #include "ardour/profile.h"
 #include "ardour/rc_configuration.h"
@@ -116,10 +116,10 @@
 #include "audiographer/routines.h"
 
 #if defined (__APPLE__)
-       #include <Carbon/Carbon.h> // For Gestalt
+#include <CoreFoundation/CoreFoundation.h>
 #endif
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 ARDOUR::RCConfiguration* ARDOUR::Config = 0;
 ARDOUR::RuntimeProfile* ARDOUR::Profile = 0;
@@ -206,12 +206,8 @@ setup_hardware_optimization (bool try_optimization)
 		}
 
 #elif defined (__APPLE__) && defined (BUILD_VECLIB_OPTIMIZATIONS)
-		SInt32 sysVersion = 0;
 
-		if (noErr != Gestalt(gestaltSystemVersion, &sysVersion))
-			sysVersion = 0;
-
-		if (sysVersion >= 0x00001040) { // Tiger at least
+		if (floor (kCFCoreFoundationVersionNumber) > kCFCoreFoundationVersionNumber10_4) { /* at least Tiger */
 			compute_peak           = veclib_compute_peak;
 			find_peaks             = veclib_find_peaks;
 			apply_gain_to_buffer   = veclib_apply_gain_to_buffer;
@@ -305,7 +301,7 @@ copy_configuration_files (string const & old_dir, string const & new_dir, int ol
 		return -1;
 	}
 
-	if (old_version == 3) {
+	if (old_version >= 3) {
 
 		old_name = Glib::build_filename (old_dir, X_("recent"));
 		new_name = Glib::build_filename (new_dir, X_("recent"));
@@ -443,6 +439,7 @@ ARDOUR::init (bool use_windows_vst, bool try_optimization, const char* localedir
 	RouteGroup::make_property_quarks ();
         Playlist::make_property_quarks ();
         AudioPlaylist::make_property_quarks ();
+        PresentationInfo::make_property_quarks ();
 
 	/* this is a useful ready to use PropertyChange that many
 	   things need to check. This avoids having to compose
@@ -608,31 +605,6 @@ ARDOUR::cleanup ()
 	return;
 }
 
-void
-ARDOUR::find_bindings_files (map<string,string>& files)
-{
-	vector<std::string> found;
-	Searchpath spath = ardour_config_search_path();
-
-	if (getenv ("ARDOUR_SAE")) {
-		find_files_matching_pattern (found, spath, "*SAE-*.bindings");
-	} else {
-		find_files_matching_pattern (found, spath, "*.bindings");
-	}
-
-	if (found.empty()) {
-		return;
-	}
-
-	for (vector<std::string>::iterator x = found.begin(); x != found.end(); ++x) {
-		std::string path(*x);
-		pair<string,string> namepath;
-		namepath.second = path;
-		namepath.first = PBD::basename_nosuffix (path);
-		files.insert (namepath);
-	}
-}
-
 bool
 ARDOUR::no_auto_connect()
 {
diff --git a/libs/ardour/graph.cc b/libs/ardour/graph.cc
index ff4f860..563c882 100644
--- a/libs/ardour/graph.cc
+++ b/libs/ardour/graph.cc
@@ -32,7 +32,7 @@
 #include "ardour/process_thread.h"
 #include "ardour/audioengine.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 using namespace PBD;
@@ -412,15 +412,16 @@ Graph::helper_thread()
 	ProcessThread* pt = new ProcessThread ();
 	resume_rt_malloc_checks ();
 
-        pt->get_buffers();
+	pt->get_buffers();
 
-        while(1) {
-                if (run_one()) {
-                        break;
-                }
-        }
+	while(1) {
+		if (run_one()) {
+			break;
+		}
+	}
 
-        pt->drop_buffers();
+	pt->drop_buffers();
+	delete pt;
 }
 
 /** Here's the main graph thread */
@@ -431,35 +432,35 @@ Graph::main_thread()
 	ProcessThread* pt = new ProcessThread ();
 	resume_rt_malloc_checks ();
 
-        pt->get_buffers();
+	pt->get_buffers();
 
-  again:
-        _callback_start_sem.wait ();
+again:
+	_callback_start_sem.wait ();
 
 	DEBUG_TRACE(DEBUG::ProcessThreads, "main thread is awake\n");
 
-        if (!_threads_active) {
-                return;
-        }
+	if (!_threads_active) {
+		return;
+	}
 
 	prep ();
 
-        if (_graph_empty && _threads_active) {
-                _callback_done_sem.signal ();
-                DEBUG_TRACE(DEBUG::ProcessThreads, "main thread sees graph done, goes back to sleep\n");
-                goto again;
-        }
+	if (_graph_empty && _threads_active) {
+		_callback_done_sem.signal ();
+		DEBUG_TRACE(DEBUG::ProcessThreads, "main thread sees graph done, goes back to sleep\n");
+		goto again;
+	}
 
 	/* This loop will run forever */
-        while (1) {
+	while (1) {
 		DEBUG_TRACE(DEBUG::ProcessThreads, "main thread runs one graph node\n");
-                if (run_one()) {
-                        break;
-                }
-        }
+		if (run_one()) {
+			break;
+		}
+	}
 
-        pt->drop_buffers();
-        delete (pt);
+	pt->drop_buffers();
+	delete (pt);
 }
 
 void
diff --git a/libs/ardour/i18n.h b/libs/ardour/i18n.h
deleted file mode 100644
index b04c96d..0000000
--- a/libs/ardour/i18n.h
+++ /dev/null
@@ -1,24 +0,0 @@
-#ifndef __i18n_h__
-#define __i18n_h__
-
-#include "pbd/compose.h"
-#include "pbd/convert.h"
-#include "gettext.h"
-
-#include <vector>
-#include <string>
-
-#define _(Text)  dgettext (PACKAGE,Text)
-#define N_(Text) gettext_noop (Text)
-#define X_(Text) Text
-#define I18N(Array) PBD::internationalize (PACKAGE, Array)
-/** Use this to translate strings that have different meanings in different places.
- *  Text should be of the form Context|Message.
- */
-#define S_(Text) PBD::sgettext (PACKAGE, Text)
-
-/** Use this to translate strings with plural forms
- */
-#define P_(Singular,Plural,HowMany) dngettext (PACKAGE, (Singular), (Plural), (HowMany))
-
-#endif // __i18n_h__
diff --git a/libs/ardour/import.cc b/libs/ardour/import.cc
index 0656cdc..b2b9403 100644
--- a/libs/ardour/import.cc
+++ b/libs/ardour/import.cc
@@ -67,7 +67,7 @@
 #include "ardour/caimportable.h"
 #endif
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
@@ -265,14 +265,14 @@ write_audio_data_to_new_files (ImportableSource* source, ImportStatus& status,
 		uint32_t read_count = 0;
 
 		while (!status.cancel) {
-			framecnt_t const nread = source->read (data.get(), nframes);
+			framecnt_t const nread = source->read (data.get(), nframes * channels);
 			if (nread == 0) {
 				break;
 			}
 
-			peak = compute_peak (data.get(), nread, peak);
+			peak = compute_peak (data.get(), nread * channels, peak);
 
-			read_count += nread;
+			read_count += nread / channels;
 			status.progress = 0.5 * read_count / (source->ratio() * source->length() * channels);
 		}
 
@@ -294,7 +294,7 @@ write_audio_data_to_new_files (ImportableSource* source, ImportStatus& status,
 		uint32_t x;
 		uint32_t chn;
 
-		if ((nread = source->read (data.get(), nframes)) == 0) {
+		if ((nread = source->read (data.get(), nframes * channels)) == 0) {
 #ifdef PLATFORM_WINDOWS
 			/* Flush the data once we've finished importing the file. Windows can  */
 			/* cache the data for very long periods of time (perhaps not writing   */
@@ -459,7 +459,7 @@ Session::import_files (ImportStatus& status)
 
 	status.sources.clear ();
 
-	for (vector<string>::iterator p = status.paths.begin();
+	for (vector<string>::const_iterator p = status.paths.begin();
 	     p != status.paths.end() && !status.cancel;
 	     ++p)
 	{
diff --git a/libs/ardour/instrument_info.cc b/libs/ardour/instrument_info.cc
index c30994b..b8c026b 100644
--- a/libs/ardour/instrument_info.cc
+++ b/libs/ardour/instrument_info.cc
@@ -29,7 +29,7 @@
 #include "ardour/plugin_insert.h"
 #include "ardour/rc_configuration.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 using namespace MIDI::Name;
@@ -82,6 +82,18 @@ InstrumentInfo::get_instrument_name () const
 string
 InstrumentInfo::get_patch_name (uint16_t bank, uint8_t program, uint8_t channel) const
 {
+	return get_patch_name (bank, program, channel, true);
+}
+
+string
+InstrumentInfo::get_patch_name_without (uint16_t bank, uint8_t program, uint8_t channel) const
+{
+	return get_patch_name (bank, program, channel, false);
+}
+
+string
+InstrumentInfo::get_patch_name (uint16_t bank, uint8_t program, uint8_t channel, bool with_extra) const
+{
 	boost::shared_ptr<Processor> p = internal_instrument.lock();
 	if (p) {
 		return get_plugin_patch_name (p, bank, program, channel);
@@ -100,7 +112,11 @@ InstrumentInfo::get_patch_name (uint16_t bank, uint8_t program, uint8_t channel)
 
 #define MIDI_BP_ZERO ((Config->get_first_midi_bank_is_zero())?0:1)
 
-		return string_compose ("prg %1 bnk %2",program + MIDI_BP_ZERO , bank + MIDI_BP_ZERO);
+		if (with_extra) {
+			return string_compose ("prg %1 bnk %2",program + MIDI_BP_ZERO , bank + MIDI_BP_ZERO);
+		} else {
+			return string_compose ("%1", program + MIDI_BP_ZERO);
+		}
 	}
 }
 
diff --git a/libs/ardour/internal_return.cc b/libs/ardour/internal_return.cc
index 4947231..e42c067 100644
--- a/libs/ardour/internal_return.cc
+++ b/libs/ardour/internal_return.cc
@@ -32,7 +32,7 @@ InternalReturn::InternalReturn (Session& s)
 }
 
 void
-InternalReturn::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end_frame*/, pframes_t nframes, bool)
+InternalReturn::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end_frame*/, double /*speed*/, pframes_t nframes, bool)
 {
 	if (!_active && !_pending_active) {
 		return;
diff --git a/libs/ardour/internal_send.cc b/libs/ardour/internal_send.cc
index 8870535..1746b00 100644
--- a/libs/ardour/internal_send.cc
+++ b/libs/ardour/internal_send.cc
@@ -30,7 +30,7 @@
 #include "ardour/session.h"
 #include "ardour/audioengine.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 namespace ARDOUR { class MuteMaster; class Pannable; }
 
@@ -133,7 +133,7 @@ InternalSend::send_to_going_away ()
 }
 
 void
-InternalSend::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, bool)
+InternalSend::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, double speed, pframes_t nframes, bool)
 {
 	if ((!_active && !_pending_active) || !_send_to) {
 		_meter->reset ();
@@ -144,7 +144,30 @@ InternalSend::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame
 	// in-place, which a send must never do.
 
 	if (_panshell && !_panshell->bypassed() && role() != Listen) {
-		_panshell->run (bufs, mixbufs, start_frame, end_frame, nframes);
+		if (mixbufs.count ().n_audio () > 0) {
+			_panshell->run (bufs, mixbufs, start_frame, end_frame, nframes);
+		}
+
+		/* non-audio data will not have been copied by the panner, do it now
+		 * if there are more buffers available than send buffers, ignore them,
+		 * if there are less, copy the last as IO::copy_to_output does. */
+
+		for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
+			if (*t != DataType::AUDIO) {
+				BufferSet::iterator o = mixbufs.begin(*t);
+				BufferSet::iterator i = bufs.begin(*t);
+
+				while (i != bufs.end(*t) && o != mixbufs.end(*t)) {
+					o->read_from (*i, nframes);
+					++i;
+					++o;
+				}
+				while (o != mixbufs.end(*t)) {
+					o->silence(nframes, 0);
+					++o;
+				}
+			}
+		}
 	} else {
 		if (role() == Listen) {
 			/* We're going to the monitor bus, so discard MIDI data */
@@ -213,9 +236,9 @@ InternalSend::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame
 
 	_amp->set_gain_automation_buffer (_session.send_gain_automation_buffer ());
 	_amp->setup_gain_automation (start_frame, end_frame, nframes);
-	_amp->run (mixbufs, start_frame, end_frame, nframes, true);
+	_amp->run (mixbufs, start_frame, end_frame, speed, nframes, true);
 
-	_delayline->run (mixbufs, start_frame, end_frame, nframes, true);
+	_delayline->run (mixbufs, start_frame, end_frame, speed, nframes, true);
 
 	/* consider metering */
 
@@ -223,7 +246,7 @@ InternalSend::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame
 		if (_amp->gain_control()->get_value() == GAIN_COEFF_ZERO) {
 			_meter->reset();
 		} else {
-			_meter->run (mixbufs, start_frame, end_frame, nframes, true);
+			_meter->run (mixbufs, start_frame, end_frame, speed, nframes, true);
 		}
 	}
 
@@ -274,7 +297,7 @@ InternalSend::get_state()
 int
 InternalSend::set_state (const XMLNode& node, int version)
 {
-	const XMLProperty* prop;
+	XMLProperty const * prop;
 
 	init_gain ();
 
diff --git a/libs/ardour/io.cc b/libs/ardour/io.cc
index 9fa6c70..f535467 100644
--- a/libs/ardour/io.cc
+++ b/libs/ardour/io.cc
@@ -43,7 +43,7 @@
 #include "ardour/session.h"
 #include "ardour/user_bundle.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 #define BLOCK_PROCESS_CALLBACK() Glib::Threads::Mutex::Lock em (AudioEngine::instance()->process_lock())
 
@@ -99,6 +99,9 @@ IO::~IO ()
 void
 IO::disconnect_check (boost::shared_ptr<Port> a, boost::shared_ptr<Port> b)
 {
+	if (_session.state_of_the_state () & Session::Deletion) {
+		return;
+	}
 	/* this could be called from within our own ::disconnect() method(s)
 	   or from somewhere that operates directly on a port. so, we don't
 	   know for sure if we can take this lock or not. if we fail,
@@ -368,6 +371,7 @@ IO::add_port (string destination, void* src, DataType type)
 		}
 	}
 
+	apply_pretty_name ();
 	setup_bundle ();
 	_session.set_dirty ();
 
@@ -401,6 +405,7 @@ IO::ensure_ports_locked (ChanCount count, bool clear, bool& changed)
 #endif
 
 	boost::shared_ptr<Port> port;
+	vector<boost::shared_ptr<Port> > deleted_ports;
 
 	changed    = false;
 
@@ -414,11 +419,30 @@ IO::ensure_ports_locked (ChanCount count, bool clear, bool& changed)
 
 			assert(port);
 			_ports.remove(port);
+
+			/* hold a reference to the port so that we can ensure
+			 * that this thread, and not a JACK notification thread,
+			 * holds the final reference.
+			 */
+
+			deleted_ports.push_back (port);
 			_session.engine().unregister_port (port);
 
 			changed = true;
 		}
 
+		/* this will drop the final reference to the deleted ports,
+		 * which will in turn call their destructors, which will in
+		 * turn call the backend to unregister them.
+		 *
+		 * There will no connect/disconnect or register/unregister
+		 * callbacks from the backend until we get here, because
+		 * they are driven by the Port destructor. The destructor
+		 * will not execute until we drop the final reference,
+		 * which all happens right .... here.
+		 */
+		deleted_ports.clear ();
+
 		/* create any necessary new ports */
 		while (n_ports().get(*t) < n) {
 
@@ -526,7 +550,7 @@ IO::state (bool /*full_state*/)
 	char buf[64];
 	string str;
 	int n;
-	LocaleGuard lg (X_("C"));
+	LocaleGuard lg;
 	Glib::Threads::Mutex::Lock lm (io_lock);
 
 	node->add_property("name", _name);
@@ -535,6 +559,10 @@ IO::state (bool /*full_state*/)
 	node->add_property ("direction", enum_2_string (_direction));
 	node->add_property ("default-type", _default_type.to_string());
 
+	if (!_pretty_name_prefix.empty ()) {
+		node->add_property("pretty-name", _pretty_name_prefix);
+	}
+
 	for (std::vector<UserBundleInfo*>::iterator i = _bundles_connected.begin(); i != _bundles_connected.end(); ++i) {
 		XMLNode* n = new XMLNode ("Bundle");
 		n->add_property ("name", (*i)->bundle->name ());
@@ -587,9 +615,9 @@ IO::set_state (const XMLNode& node, int version)
 	 */
 	assert (version >= 3000);
 
-	const XMLProperty* prop;
+	XMLProperty const * prop;
 	XMLNodeConstIterator iter;
-	LocaleGuard lg (X_("C"));
+	LocaleGuard lg;
 
 	/* force use of non-localized representation of decimal point,
 	   since we use it a lot in XML files and so forth.
@@ -619,6 +647,11 @@ IO::set_state (const XMLNode& node, int version)
 		return -1;
 	}
 
+	// after create_ports, updates names
+	if ((prop = node.property ("pretty-name")) != 0) {
+		set_pretty_name (prop->value());
+	}
+
 	if (connecting_legal) {
 
 		if (make_connections (node, version, false)) {
@@ -643,9 +676,9 @@ IO::set_state (const XMLNode& node, int version)
 int
 IO::set_state_2X (const XMLNode& node, int version, bool in)
 {
-	const XMLProperty* prop;
+	XMLProperty const * prop;
 	XMLNodeConstIterator iter;
-	LocaleGuard lg (X_("C"));
+	LocaleGuard lg;
 
 	/* force use of non-localized representation of decimal point,
 	   since we use it a lot in XML files and so forth.
@@ -915,7 +948,7 @@ IO::make_connections (const XMLNode& node, int version, bool in)
 		return make_connections_2X (node, version, in);
 	}
 
-	const XMLProperty* prop;
+	XMLProperty const * prop;
 
 	for (XMLNodeConstIterator i = node.children().begin(); i != node.children().end(); ++i) {
 
@@ -976,7 +1009,7 @@ IO::prepare_for_reset (XMLNode& node, const std::string& name)
 	   the name of the thing we're applying it to.
 	*/
 
-	XMLProperty* prop;
+	XMLProperty * prop;
 	XMLNodeList children = node.children();
 
 	for (XMLNodeIterator i = children.begin(); i != children.end(); ++i) {
@@ -1007,7 +1040,7 @@ IO::prepare_for_reset (XMLNode& node, const std::string& name)
 int
 IO::make_connections_2X (const XMLNode& node, int /*version*/, bool in)
 {
-	const XMLProperty* prop;
+	XMLProperty const * prop;
 
 	/* XXX: bundles ("connections" as was) */
 
@@ -1220,6 +1253,31 @@ IO::set_name (const string& requested_name)
 	return r;
 }
 
+void
+IO::set_pretty_name (const std::string& str)
+{
+	if (_pretty_name_prefix == str) {
+		return;
+	}
+	_pretty_name_prefix = str;
+	apply_pretty_name ();
+}
+
+void
+IO::apply_pretty_name ()
+{
+	uint32_t pn = 1;
+	if (_pretty_name_prefix.empty ()) {
+		return;
+	}
+	for (PortSet::iterator i = _ports.begin (); i != _ports.end(); ++i, ++pn) {
+		(*i)->set_pretty_name (string_compose (("%1/%2 %3"),
+					_pretty_name_prefix,
+					_direction == Output ? _("Out") : _("In"),
+					pn));
+	}
+}
+
 framecnt_t
 IO::latency () const
 {
@@ -1541,13 +1599,13 @@ IO::bundle_channel_name (uint32_t c, uint32_t n, DataType t) const
 		case 2:
 			return c == 0 ? _("L") : _("R");
 		default:
-			snprintf (buf, sizeof(buf), _("%d"), (c + 1));
+			snprintf (buf, sizeof(buf), "%d", (c + 1));
 			return buf;
 		}
 
 	} else {
 
-		snprintf (buf, sizeof(buf), _("%d"), (c + 1));
+		snprintf (buf, sizeof(buf), "%d", (c + 1));
 		return buf;
 
 	}
@@ -1558,7 +1616,7 @@ IO::bundle_channel_name (uint32_t c, uint32_t n, DataType t) const
 string
 IO::name_from_state (const XMLNode& node)
 {
-	const XMLProperty* prop;
+	XMLProperty const * prop;
 
 	if ((prop = node.property ("name")) != 0) {
 		return prop->value();
@@ -1637,7 +1695,7 @@ IO::connected_to (const string& str) const
  *  Caller must hold process lock.
  */
 void
-IO::process_input (boost::shared_ptr<Processor> proc, framepos_t start_frame, framepos_t end_frame, pframes_t nframes)
+IO::process_input (boost::shared_ptr<Processor> proc, framepos_t start_frame, framepos_t end_frame, double speed, pframes_t nframes)
 {
 	/* don't read the data into new buffers - just use the port buffers directly */
 
@@ -1648,7 +1706,7 @@ IO::process_input (boost::shared_ptr<Processor> proc, framepos_t start_frame, fr
 
 	_buffers.get_backend_port_addresses (_ports, nframes);
 	if (proc) {
-		proc->run (_buffers, start_frame, end_frame, nframes, true);
+		proc->run (_buffers, start_frame, end_frame, speed, nframes, true);
 	}
 }
 
@@ -1674,7 +1732,7 @@ IO::collect_input (BufferSet& bufs, pframes_t nframes, ChanCount offset)
 		}
 
 		for ( ; i != _ports.end(*t); ++i, ++b) {
-			Buffer& bb (i->get_buffer (nframes));
+			const Buffer& bb (i->get_buffer (nframes));
 			b->read_from (bb, nframes);
 		}
 	}
@@ -1683,12 +1741,14 @@ IO::collect_input (BufferSet& bufs, pframes_t nframes, ChanCount offset)
 void
 IO::copy_to_outputs (BufferSet& bufs, DataType type, pframes_t nframes, framecnt_t offset)
 {
-	// Copy any buffers 1:1 to outputs
-
 	PortSet::iterator o = _ports.begin(type);
 	BufferSet::iterator i = bufs.begin(type);
 	BufferSet::iterator prev = i;
 
+	assert(i != bufs.end(type)); // or second loop will crash
+
+	// Copy any buffers 1:1 to outputs
+
 	while (i != bufs.end(type) && o != _ports.end (type)) {
 		Buffer& port_buffer (o->get_buffer (nframes));
 		port_buffer.read_from (*i, nframes, offset);
diff --git a/libs/ardour/io_processor.cc b/libs/ardour/io_processor.cc
index 8240062..61bb97f 100644
--- a/libs/ardour/io_processor.cc
+++ b/libs/ardour/io_processor.cc
@@ -32,7 +32,7 @@
 #include "ardour/session_object.h"
 #include "ardour/types.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
@@ -147,7 +147,7 @@ IOProcessor::set_state (const XMLNode& node, int version)
 		return set_state_2X (node, version);
 	}
 
-	const XMLProperty *prop;
+	XMLProperty const * prop;
 	const XMLNode *io_node = 0;
 
 	Processor::set_state(node, version);
@@ -168,9 +168,9 @@ IOProcessor::set_state (const XMLNode& node, int version)
 	const string instr = enum_2_string (IO::Input);
 	const string outstr = enum_2_string (IO::Output);
 
-	if (_own_input) {
+	if (_own_input && _input) {
 		for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
-			const XMLProperty* prop;
+			XMLProperty const * prop;
 			if ((prop = (*niter)->property ("name")) != 0) {
 				if (_name == prop->value()) {
 					if ((prop = (*niter)->property ("direction")) != 0) {
@@ -197,10 +197,10 @@ IOProcessor::set_state (const XMLNode& node, int version)
 
 	}
 
-	if (_own_output) {
+	if (_own_output && _output) {
 		for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
 			if ((*niter)->name() == "IO") {
-				const XMLProperty* prop;
+				XMLProperty const * prop;
 				if ((prop = (*niter)->property ("name")) != 0) {
 					if (_name == prop->value()) {
 						if ((prop = (*niter)->property ("direction")) != 0) {
@@ -240,7 +240,7 @@ IOProcessor::set_state_2X (const XMLNode& node, int version)
 }
 
 void
-IOProcessor::silence (framecnt_t nframes)
+IOProcessor::silence (framecnt_t nframes, framepos_t /* start_frame */)
 {
 	if (_own_output && _output) {
 		_output->silence (nframes);
diff --git a/libs/ardour/ladspa_plugin.cc b/libs/ardour/ladspa_plugin.cc
index f30925a..7ca6929 100644
--- a/libs/ardour/ladspa_plugin.cc
+++ b/libs/ardour/ladspa_plugin.cc
@@ -51,7 +51,7 @@
 
 #include "pbd/stl_delete.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 #include <locale.h>
 
 using namespace std;
@@ -141,11 +141,8 @@ LadspaPlugin::init (string module_path, uint32_t index, framecnt_t rate)
 				*_latency_control_port = 0;
 			}
 
-			if (!LADSPA_IS_PORT_INPUT(port_descriptor (i))) {
-				continue;
-			}
-
 			_shadow_data[i] = _default_value (i);
+			_control_data[i] = _shadow_data[i];
 		}
 	}
 
@@ -350,8 +347,8 @@ void
 LadspaPlugin::add_state (XMLNode* root) const
 {
 	XMLNode *child;
-	char buf[16];
-	LocaleGuard lg (X_("C"));
+	char buf[32];
+	LocaleGuard lg;
 
 	for (uint32_t i = 0; i < parameter_count(); ++i){
 
@@ -377,14 +374,14 @@ LadspaPlugin::set_state (const XMLNode& node, int version)
 
 #ifndef NO_PLUGIN_STATE
 	XMLNodeList nodes;
-	XMLProperty *prop;
+	XMLProperty const * prop;
 	XMLNodeConstIterator iter;
 	XMLNode *child;
 	const char *port;
 	const char *data;
 	uint32_t port_id;
 #endif
-	LocaleGuard lg (X_("C"));
+	LocaleGuard lg;
 
 	if (node.name() != state_node_name()) {
 		error << _("Bad node sent to LadspaPlugin::set_state") << endmsg;
@@ -427,14 +424,14 @@ LadspaPlugin::set_state_2X (const XMLNode& node, int /* version */)
 {
 #ifndef NO_PLUGIN_STATE
 	XMLNodeList nodes;
-	XMLProperty *prop;
+	XMLProperty const * prop;
 	XMLNodeConstIterator iter;
 	XMLNode *child;
 	const char *port;
 	const char *data;
 	uint32_t port_id;
 #endif
-	LocaleGuard lg (X_("C"));
+	LocaleGuard lg;
 
 	if (node.name() != state_node_name()) {
 		error << _("Bad node sent to LadspaPlugin::set_state") << endmsg;
@@ -569,10 +566,11 @@ LadspaPlugin::automatable () const
 
 int
 LadspaPlugin::connect_and_run (BufferSet& bufs,
+		framepos_t start, framepos_t end, double speed,
 		ChanMapping in_map, ChanMapping out_map,
 		pframes_t nframes, framecnt_t offset)
 {
-	Plugin::connect_and_run (bufs, in_map, out_map, nframes, offset);
+	Plugin::connect_and_run (bufs, start, end, speed, in_map, out_map, nframes, offset);
 
 	cycles_t now;
 	cycles_t then = get_cycles ();
diff --git a/libs/ardour/linux_vst_support.cc b/libs/ardour/linux_vst_support.cc
index 0bdc896..9f2ab0a 100644
--- a/libs/ardour/linux_vst_support.cc
+++ b/libs/ardour/linux_vst_support.cc
@@ -37,7 +37,7 @@
 #include "pbd/basename.h"
 #include "pbd/error.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 /***********************************************************/
 /* VSTFX - A set of modules for managing linux VST plugins */
diff --git a/libs/ardour/location.cc b/libs/ardour/location.cc
index 1b63ce4..0a48b43 100644
--- a/libs/ardour/location.cc
+++ b/libs/ardour/location.cc
@@ -36,7 +36,7 @@
 #include "ardour/audiofilesource.h"
 #include "ardour/tempo.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
@@ -207,8 +207,8 @@ Location::set_start (framepos_t s, bool force, bool allow_bbt_recompute)
 
 			start_changed (this); /* EMIT SIGNAL */
 			StartChanged (); /* EMIT SIGNAL */
-			end_changed (this); /* EMIT SIGNAL */
-			EndChanged (); /* EMIT SIGNAL */
+			//end_changed (this); /* EMIT SIGNAL */
+			//EndChanged (); /* EMIT SIGNAL */
 		}
 
 		/* moving the start (position) of a marker with a scene change
@@ -281,8 +281,8 @@ Location::set_end (framepos_t e, bool force, bool allow_bbt_recompute)
 			if (allow_bbt_recompute) {
 				recompute_bbt_from_frames ();
 			}
-			start_changed (this); /* EMIT SIGNAL */
-			StartChanged (); /* EMIT SIGNAL */
+			//start_changed (this); /* EMIT SIGNAL */
+			//StartChanged (); /* EMIT SIGNAL */
 			end_changed (this); /* EMIT SIGNAL */
 			EndChanged (); /* EMIT SIGNAL */
 		}
@@ -396,21 +396,17 @@ Location::set (framepos_t s, framepos_t e, bool allow_bbt_recompute)
 		assert (_end >= 0);
 	}
 
-	if (start_change) {
+	if (start_change && end_change) {
+		changed (this);
+		Changed ();
+	} else if (start_change) {
 		start_changed(this); /* EMIT SIGNAL */
 		StartChanged(); /* EMIT SIGNAL */
-	}
-
-	if (end_change) {
+	} else if (end_change) {
 		end_changed(this); /* EMIT SIGNAL */
 		EndChanged(); /* EMIT SIGNAL */
 	}
 
-	if (start_change && end_change) {
-		changed (this);
-		Changed ();
-	}
-
 	return 0;
 }
 
@@ -598,7 +594,7 @@ Location::get_state ()
 int
 Location::set_state (const XMLNode& node, int version)
 {
-	const XMLProperty *prop;
+	XMLProperty const * prop;
 
 	XMLNodeList cd_list = node.children();
 	XMLNodeConstIterator cd_iter;
@@ -726,8 +722,8 @@ Location::recompute_bbt_from_frames ()
 		return;
 	}
 
-	_session.bbt_time (_start, _bbt_start);
-	_session.bbt_time (_end, _bbt_end);
+	_bbt_start = _session.tempo_map().beat_at_frame (_start);
+	_bbt_end = _session.tempo_map().beat_at_frame (_end);
 }
 
 void
@@ -738,7 +734,7 @@ Location::recompute_frames_from_bbt ()
 	}
 
 	TempoMap& map (_session.tempo_map());
-	set (map.frame_time (_bbt_start), map.frame_time (_bbt_end), false);
+	set (map.frame_at_beat (_bbt_start), map.frame_at_beat (_bbt_end), false);
 }
 
 void
diff --git a/libs/ardour/location_importer.cc b/libs/ardour/location_importer.cc
index 281e045..87c304f 100644
--- a/libs/ardour/location_importer.cc
+++ b/libs/ardour/location_importer.cc
@@ -27,7 +27,7 @@
 #include "pbd/convert.h"
 #include "pbd/failed_constructor.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace PBD;
diff --git a/libs/ardour/ltc_file_reader.cc b/libs/ardour/ltc_file_reader.cc
index b07b320..8ca97ee 100644
--- a/libs/ardour/ltc_file_reader.cc
+++ b/libs/ardour/ltc_file_reader.cc
@@ -32,7 +32,7 @@
 #include "timecode/time.h"
 #include "ardour/ltc_file_reader.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
diff --git a/libs/ardour/ltc_slave.cc b/libs/ardour/ltc_slave.cc
index ab84cf6..6167c6b 100644
--- a/libs/ardour/ltc_slave.cc
+++ b/libs/ardour/ltc_slave.cc
@@ -32,7 +32,7 @@
 #include "ardour/audioengine.h"
 #include "ardour/audio_port.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
diff --git a/libs/ardour/lua_api.cc b/libs/ardour/lua_api.cc
new file mode 100644
index 0000000..890e268
--- /dev/null
+++ b/libs/ardour/lua_api.cc
@@ -0,0 +1,497 @@
+/*
+ * Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ *
+ */
+#include <cstring>
+
+#include "pbd/error.h"
+#include "pbd/compose.h"
+
+#include "ardour/lua_api.h"
+#include "ardour/luaproc.h"
+#include "ardour/luascripting.h"
+#include "ardour/plugin.h"
+#include "ardour/plugin_insert.h"
+#include "ardour/plugin_manager.h"
+
+#include "LuaBridge/LuaBridge.h"
+
+#include "pbd/i18n.h"
+
+using namespace ARDOUR;
+using namespace PBD;
+using namespace std;
+
+int
+ARDOUR::LuaAPI::datatype_ctor_null (lua_State *L)
+{
+	DataType dt (DataType::NIL);
+	luabridge::Stack <DataType>::push (L, dt);
+	return 1;
+}
+
+int
+ARDOUR::LuaAPI::datatype_ctor_audio (lua_State *L)
+{
+	DataType dt (DataType::AUDIO);
+	// NB luabridge will copy construct the object and manage lifetime.
+	luabridge::Stack <DataType>::push (L, dt);
+	return 1;
+}
+
+int
+ARDOUR::LuaAPI::datatype_ctor_midi (lua_State *L)
+{
+	DataType dt (DataType::MIDI);
+	luabridge::Stack <DataType>::push (L, dt);
+	return 1;
+}
+
+boost::shared_ptr<Processor>
+ARDOUR::LuaAPI::nil_processor ()
+{
+	return boost::shared_ptr<Processor> ();
+}
+
+boost::shared_ptr<Processor>
+ARDOUR::LuaAPI::new_luaproc (Session *s, const string& name)
+{
+	if (!s) {
+		return boost::shared_ptr<Processor> ();
+	}
+
+	LuaScriptInfoPtr spi;
+	ARDOUR::LuaScriptList & _scripts (LuaScripting::instance ().scripts (LuaScriptInfo::DSP));
+	for (LuaScriptList::const_iterator i = _scripts.begin(); i != _scripts.end(); ++i) {
+		if (name == (*i)->name) {
+			spi = *i;
+			break;
+		}
+	}
+
+	if (!spi) {
+		warning << _("Script with given name was not found\n");
+		return boost::shared_ptr<Processor> ();
+	}
+
+	PluginPtr p;
+	try {
+		LuaPluginInfoPtr lpi (new LuaPluginInfo(spi));
+		p = (lpi->load (*s));
+	} catch (...) {
+		warning << _("Failed to instantiate Lua Processor\n");
+		return boost::shared_ptr<Processor> ();
+	}
+
+	return boost::shared_ptr<Processor> (new PluginInsert (*s, p));
+}
+
+PluginInfoPtr
+ARDOUR::LuaAPI::new_plugin_info (const string& name, ARDOUR::PluginType type)
+{
+	PluginManager& manager = PluginManager::instance();
+	PluginInfoList all_plugs;
+	all_plugs.insert(all_plugs.end(), manager.ladspa_plugin_info().begin(), manager.ladspa_plugin_info().end());
+	all_plugs.insert(all_plugs.end(), manager.lua_plugin_info().begin(), manager.lua_plugin_info().end());
+#ifdef WINDOWS_VST_SUPPORT
+	all_plugs.insert(all_plugs.end(), manager.windows_vst_plugin_info().begin(), manager.windows_vst_plugin_info().end());
+#endif
+#ifdef LXVST_SUPPORT
+	all_plugs.insert(all_plugs.end(), manager.lxvst_plugin_info().begin(), manager.lxvst_plugin_info().end());
+#endif
+#ifdef AUDIOUNIT_SUPPORT
+	all_plugs.insert(all_plugs.end(), manager.au_plugin_info().begin(), manager.au_plugin_info().end());
+#endif
+#ifdef LV2_SUPPORT
+	all_plugs.insert(all_plugs.end(), manager.lv2_plugin_info().begin(), manager.lv2_plugin_info().end());
+#endif
+
+	for (PluginInfoList::const_iterator i = all_plugs.begin(); i != all_plugs.end(); ++i) {
+		if (((*i)->name == name || (*i)->unique_id == name) && (*i)->type == type) {
+			return *i;
+		}
+	}
+	return PluginInfoPtr ();
+}
+
+boost::shared_ptr<Processor>
+ARDOUR::LuaAPI::new_plugin (Session *s, const string& name, ARDOUR::PluginType type, const string& preset)
+{
+	if (!s) {
+		return boost::shared_ptr<Processor> ();
+	}
+
+	PluginInfoPtr pip = new_plugin_info (name, type);
+
+	if (!pip) {
+		return boost::shared_ptr<Processor> ();
+	}
+
+	PluginPtr p = pip->load (*s);
+	if (!p) {
+		return boost::shared_ptr<Processor> ();
+	}
+
+	if (!preset.empty()) {
+		const Plugin::PresetRecord *pr = p->preset_by_label (preset);
+		if (pr) {
+			p->load_preset (*pr);
+		}
+	}
+
+	return boost::shared_ptr<Processor> (new PluginInsert (*s, p));
+}
+
+bool
+ARDOUR::LuaAPI::set_plugin_insert_param (boost::shared_ptr<PluginInsert> pi, uint32_t which, float val)
+{
+	boost::shared_ptr<Plugin> plugin = pi->plugin();
+	if (!plugin) { return false; }
+
+	bool ok=false;
+	uint32_t controlid = plugin->nth_parameter (which, ok);
+	if (!ok) { return false; }
+	if (!plugin->parameter_is_input (controlid)) { return false; }
+
+	ParameterDescriptor pd;
+	if (plugin->get_parameter_descriptor (controlid, pd) != 0) { return false; }
+	if (val < pd.lower || val > pd.upper) { return false; }
+
+	boost::shared_ptr<AutomationControl> c = pi->automation_control (Evoral::Parameter(PluginAutomation, 0, controlid));
+	c->set_value (val, PBD::Controllable::NoGroup);
+	return true;
+}
+
+bool
+ARDOUR::LuaAPI::set_processor_param (boost::shared_ptr<Processor> proc, uint32_t which, float val)
+{
+	boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert> (proc);
+	if (!pi) { return false; }
+	return set_plugin_insert_param (pi, which, val);
+}
+
+int
+ARDOUR::LuaAPI::plugin_automation (lua_State *L)
+{
+	typedef boost::shared_ptr<Processor> T;
+
+	int top = lua_gettop(L);
+	if (top < 2) {
+		return luaL_argerror (L, 1, "invalid number of arguments, :plugin_automation (plugin, parameter_number)");
+	}
+	T* const p = luabridge::Userdata::get<T>(L, 1, false);
+	uint32_t which = luabridge::Stack<uint32_t>::get (L, 2);
+	if (!p) {
+		return luaL_error (L, "Invalid pointer to Ardour:Processor");
+	}
+	boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert> (*p);
+	if (!pi) {
+		return luaL_error (L, "Given Processor is not a Plugin Insert");
+	}
+	boost::shared_ptr<Plugin> plugin = pi->plugin();
+	if (!plugin) {
+		return luaL_error (L, "Given Processor is not a Plugin");
+	}
+
+	bool ok=false;
+	uint32_t controlid = plugin->nth_parameter (which, ok);
+	if (!ok) {
+		return luaL_error (L, "Invalid Parameter");
+	}
+	if (!plugin->parameter_is_input (controlid)) {
+		return luaL_error (L, "Given Parameter is not an input");
+	}
+
+	ParameterDescriptor pd;
+	if (plugin->get_parameter_descriptor (controlid, pd) != 0) {
+		return luaL_error (L, "Cannot describe parameter");
+	}
+
+	boost::shared_ptr<AutomationControl> c = pi->automation_control (Evoral::Parameter(PluginAutomation, 0, controlid));
+
+	luabridge::Stack<boost::shared_ptr<AutomationList> >::push (L, c->alist());
+	luabridge::Stack<boost::shared_ptr<Evoral::ControlList> >::push (L, c->list());
+	luabridge::Stack<ParameterDescriptor>::push (L, pd);
+	return 3;
+}
+
+int
+ARDOUR::LuaOSC::Address::send (lua_State *L)
+{
+	Address * const luaosc = luabridge::Userdata::get <Address> (L, 1, false);
+	if (!luaosc) {
+		return luaL_error (L, "Invalid pointer to OSC.Address");
+	}
+	if (!luaosc->_addr) {
+		return luaL_error (L, "Invalid Destination Address");
+	}
+
+	int top = lua_gettop(L);
+	if (top < 3) {
+    return luaL_argerror (L, 1, "invalid number of arguments, :send (path, type, ...)");
+	}
+
+	const char* path = luaL_checkstring (L, 2);
+	const char* type = luaL_checkstring (L, 3);
+	assert (path && type);
+
+	if ((int) strlen(type) != top - 3) {
+    return luaL_argerror (L, 3, "type description does not match arguments");
+	}
+
+	lo_message msg = lo_message_new ();
+
+	for (int i = 4; i <= top; ++i) {
+		char t = type[i - 4];
+		int lt = lua_type(L, i);
+		int ok = -1;
+		switch(lt) {
+			case LUA_TSTRING:
+				if (t == LO_STRING) {
+					ok = lo_message_add_string (msg, luaL_checkstring(L, i));
+				} else if (t ==  LO_CHAR) {
+					char c = luaL_checkstring (L, i) [0];
+					ok = lo_message_add_char (msg, c);
+				}
+				break;
+			case LUA_TBOOLEAN:
+				if (t == LO_TRUE || t == LO_FALSE) {
+					if (lua_toboolean (L, i)) {
+						ok = lo_message_add_true (msg);
+					} else {
+						ok = lo_message_add_false (msg);
+					}
+				}
+				break;
+			case LUA_TNUMBER:
+				if (t == LO_INT32) {
+					ok = lo_message_add_int32 (msg, (int32_t) luaL_checkinteger(L, i));
+				}
+				else if (t == LO_FLOAT) {
+					ok = lo_message_add_float (msg, (float) luaL_checknumber(L, i));
+				}
+				else if (t == LO_DOUBLE) {
+					ok = lo_message_add_double (msg, (double) luaL_checknumber(L, i));
+				}
+				else if (t == LO_INT64) {
+					ok = lo_message_add_double (msg, (int64_t) luaL_checknumber(L, i));
+				}
+				break;
+			default:
+				break;
+		}
+		if (ok != 0) {
+			return luaL_argerror (L, i, "type description does not match parameter");
+		}
+	}
+
+	int rv = lo_send_message (luaosc->_addr, path, msg);
+	lo_message_free (msg);
+	luabridge::Stack<bool>::push (L, (rv == 0));
+	return 1;
+}
+
+static double hue2rgb (const double p, const double q, double t) {
+	if (t < 0.0) t += 1.0;
+	if (t > 1.0) t -= 1.0;
+	if (t < 1.0 / 6.0) return p + (q - p) * 6.0 * t;
+	if (t < 1.0 / 2.0) return q;
+	if (t < 2.0 / 3.0) return p + (q - p) * (2.0 / 3.0 - t) * 6.0;
+	return p;
+}
+
+int
+ARDOUR::LuaAPI::hsla_to_rgba (lua_State *L)
+{
+	int top = lua_gettop(L);
+	if (top < 3) {
+		return luaL_argerror (L, 1, "invalid number of arguments, :hsla_to_rgba (h, s, l [,a])");
+	}
+	double h = luabridge::Stack<double>::get (L, 1);
+	double s = luabridge::Stack<double>::get (L, 2);
+	double l = luabridge::Stack<double>::get (L, 3);
+	double a = 1.0;
+	if (top > 3) {
+		a = luabridge::Stack<double>::get (L, 4);
+	}
+
+	// we can't use ArdourCanvas::hsva_to_color here
+	// besides we want HSL not HSV and without intermediate
+	// color_to_rgba (rgba_to_color ())
+	double r,g,b;
+	const double cq = l < 0.5 ? l * (1 + s) : l + s - l * s;
+	const double cp = 2.f * l - cq;
+	r = hue2rgb (cp, cq, h + 1.0 / 3.0);
+	g = hue2rgb (cp, cq, h);
+	b = hue2rgb (cp, cq, h - 1.0 / 3.0);
+
+	luabridge::Stack<double>::push (L, r);
+	luabridge::Stack<double>::push (L, g);
+	luabridge::Stack<double>::push (L, b);
+	luabridge::Stack<double>::push (L, a);
+	return 4;
+}
+
+luabridge::LuaRef::Proxy&
+luabridge::LuaRef::Proxy::clone_instance (const void* classkey, void* p) {
+  lua_rawgeti (m_L, LUA_REGISTRYINDEX, m_tableRef);
+  lua_rawgeti (m_L, LUA_REGISTRYINDEX, m_keyRef);
+
+	luabridge::UserdataPtr::push_raw (m_L, p, classkey);
+
+  lua_rawset (m_L, -3);
+  lua_pop (m_L, 1);
+  return *this;
+}
+
+LuaTableRef::LuaTableRef () {}
+LuaTableRef::~LuaTableRef () {}
+
+int
+LuaTableRef::get (lua_State* L)
+{
+	luabridge::LuaRef rv (luabridge::newTable (L));
+	for (std::vector<LuaTableEntry>::const_iterator i = _data.begin (); i != _data.end (); ++i) {
+		switch ((*i).keytype) {
+			case LUA_TSTRING:
+				assign(&rv, i->k_s, *i);
+				break;
+			case LUA_TNUMBER:
+				assign(&rv, i->k_n, *i);
+				break;
+		}
+	}
+	luabridge::push (L, rv);
+	return 1;
+}
+
+int
+LuaTableRef::set (lua_State* L)
+{
+	if (!lua_istable (L, -1)) { return luaL_error (L, "argument is not a table"); }
+	_data.clear ();
+
+	lua_pushvalue (L, -1);
+	lua_pushnil (L);
+	while (lua_next (L, -2)) {
+		lua_pushvalue (L, -2);
+
+		LuaTableEntry s (lua_type(L, -1), lua_type(L, -2));
+		switch (lua_type(L, -1)) {
+			case LUA_TSTRING:
+				s.k_s = luabridge::Stack<std::string>::get (L, -1);
+				break;
+				;
+			case LUA_TNUMBER:
+				s.k_n = luabridge::Stack<unsigned int>::get (L, -1);
+				break;
+			default:
+				// invalid key
+				lua_pop (L, 2);
+				continue;
+		}
+
+		switch(lua_type(L, -2)) {
+			case LUA_TSTRING:
+				s.s = luabridge::Stack<std::string>::get (L, -2);
+				break;
+			case LUA_TBOOLEAN:
+				s.b = lua_toboolean (L, -2);
+				break;
+			case LUA_TNUMBER:
+				s.n = lua_tonumber (L, -2);
+				break;
+			case LUA_TUSERDATA:
+				{
+					bool ok = false;
+					lua_getmetatable (L, -2);
+					lua_rawgetp (L, -1, luabridge::getIdentityKey ());
+					if (lua_isboolean (L, -1)) {
+						lua_pop (L, 1);
+						const void* key = lua_topointer (L, -1);
+						lua_pop (L, 1);
+						void const* classkey = findclasskey (L, key);
+
+						if (classkey) {
+							ok = true;
+							s.c = classkey;
+							s.p = luabridge::Userdata::get_ptr (L, -2);
+						}
+					}  else {
+						lua_pop (L, 2);
+					}
+
+					if (ok) {
+						break;
+					}
+					// invalid userdata -- fall through
+				}
+				// no break
+			case LUA_TFUNCTION: // no support -- we could... string.format("%q", string.dump(value, true))
+			case LUA_TTABLE: // no nested tables, sorry.
+			case LUA_TNIL: // fallthrough
+			default:
+				// invalid value
+				lua_pop (L, 2);
+				continue;
+		}
+
+		_data.push_back(s);
+		lua_pop (L, 2);
+	}
+	return 0;
+}
+
+void*
+LuaTableRef::findclasskey (lua_State *L, const void* key)
+{
+	lua_pushvalue(L, LUA_REGISTRYINDEX);
+	lua_pushnil (L);
+	while (lua_next (L, -2)) {
+		lua_pushvalue (L, -2);
+		if (lua_topointer(L, -2) == key) {
+			void* rv = lua_touserdata (L, -1);
+			lua_pop (L, 4);
+			return rv;
+		}
+		lua_pop (L, 2);
+	}
+	lua_pop (L, 1);
+	return NULL;
+}
+
+template<typename T>
+void LuaTableRef::assign (luabridge::LuaRef* rv, T key, const LuaTableEntry& s)
+{
+	switch (s.valuetype) {
+		case LUA_TSTRING:
+			(*rv)[key] = s.s;
+			break;
+		case LUA_TBOOLEAN:
+			(*rv)[key] = s.b;
+			break;
+		case LUA_TNUMBER:
+			(*rv)[key] = s.n;
+			break;
+		case LUA_TUSERDATA:
+			(*rv)[key].clone_instance (s.c, s.p);
+			break;
+		default:
+			assert (0);
+			break;
+	}
+}
diff --git a/libs/ardour/luabindings.cc b/libs/ardour/luabindings.cc
new file mode 100644
index 0000000..0bbfb11
--- /dev/null
+++ b/libs/ardour/luabindings.cc
@@ -0,0 +1,1502 @@
+/*
+    Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+
+    This program is free software; you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by the Free
+    Software Foundation; either version 2 of the License, or (at your option)
+    any later version.
+
+    This program is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc.,
+    675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#include <glibmm.h>
+
+#include "timecode/bbt_time.h"
+#include "pbd/stateful_diff_command.h"
+#include "pbd/openuri.h"
+#include "evoral/Control.hpp"
+#include "evoral/ControlList.hpp"
+#include "evoral/Range.hpp"
+
+#include "ardour/amp.h"
+#include "ardour/audioengine.h"
+#include "ardour/audiosource.h"
+#include "ardour/audio_backend.h"
+#include "ardour/audio_buffer.h"
+#include "ardour/audio_port.h"
+#include "ardour/audio_track.h"
+#include "ardour/buffer_set.h"
+#include "ardour/chan_mapping.h"
+#include "ardour/dB.h"
+#include "ardour/dsp_filter.h"
+#include "ardour/interthread_info.h"
+#include "ardour/lua_api.h"
+#include "ardour/luabindings.h"
+#include "ardour/luaproc.h"
+#include "ardour/meter.h"
+#include "ardour/midi_track.h"
+#include "ardour/midi_port.h"
+#include "ardour/phase_control.h"
+#include "ardour/playlist.h"
+#include "ardour/plugin.h"
+#include "ardour/plugin_insert.h"
+#include "ardour/port_manager.h"
+#include "ardour/runtime_functions.h"
+#include "ardour/region.h"
+#include "ardour/region_factory.h"
+#include "ardour/route_group.h"
+#include "ardour/session.h"
+#include "ardour/session_object.h"
+#include "ardour/sidechain.h"
+#include "ardour/solo_isolate_control.h"
+#include "ardour/solo_safe_control.h"
+#include "ardour/stripable.h"
+#include "ardour/track.h"
+#include "ardour/tempo.h"
+
+#include "LuaBridge/LuaBridge.h"
+
+#ifdef PLATFORM_WINDOWS
+/* luabridge uses addresses of static functions/variables to identify classes.
+ *
+ * Static symbols on windows (even identical symbols) are not
+ * mapped to the same address when mixing .dll + .exe.
+ * So we need a single point to define those static functions.
+ * (normally they're header-only in libs/lua/LuaBridge/detail/ClassInfo.h)
+ *
+ * Really!! A static function with a static variable in a library header
+ * should never ever be replicated, even if it is a template.
+ * But then again this is windows... what else can go wrong.
+ */
+
+template <class T>
+void const*
+luabridge::ClassInfo<T>::getStaticKey ()
+{
+	static char value;
+	return &value;
+}
+
+template <class T>
+void const*
+luabridge::ClassInfo<T>::getClassKey ()
+{
+	static char value;
+	return &value;
+}
+
+template <class T>
+void const*
+luabridge::ClassInfo<T>::getConstKey ()
+{
+	static char value;
+	return &value;
+}
+
+void*
+luabridge::getIdentityKey ()
+{
+  static char value;
+  return &value;
+}
+
+/* ...and this is the ugly part of it.
+ *
+ * We need to foward declare classes from gtk2_ardour
+ * end explicily list classes which are used by gtk2_ardour's bindings.
+ *
+ * This is needed because some of the GUI classes use objects from libardour
+ * as function parameters and the .exe would re-create symbols for libardour
+ * objects.
+ *
+ * Classes which don't use libardour symbols could be moved to
+ * gtk2_ardour/luainstance.cc, but keeping this here reduces code
+ * duplication and does not give the compiler a chance to even think
+ * about replicating the symbols.
+ */
+
+#define CLASSKEYS(CLS) \
+	template void const* luabridge::ClassInfo< CLS >::getStaticKey(); \
+	template void const* luabridge::ClassInfo< CLS >::getClassKey();  \
+	template void const* luabridge::ClassInfo< CLS >::getConstKey();
+
+#define CLASSINFO(CLS) \
+	class CLS; \
+	template void const* luabridge::ClassInfo< CLS >::getStaticKey(); \
+	template void const* luabridge::ClassInfo< CLS >::getClassKey();  \
+	template void const* luabridge::ClassInfo< CLS >::getConstKey();
+
+CLASSINFO(MarkerSelection);
+CLASSINFO(TrackSelection);
+CLASSINFO(TrackViewList);
+CLASSINFO(TimeSelection);
+CLASSINFO(RegionSelection);
+CLASSINFO(PublicEditor);
+CLASSINFO(Selection);
+CLASSINFO(ArdourMarker);
+
+namespace LuaCairo {
+	class ImageSurface;
+	class PangoLayout;
+}
+CLASSKEYS(LuaCairo::ImageSurface);
+CLASSKEYS(LuaCairo::PangoLayout);
+
+namespace Cairo {
+	class Context;
+}
+CLASSKEYS(Cairo::Context);
+CLASSKEYS(std::vector<double>);
+CLASSKEYS(std::list<ArdourMarker*>);
+CLASSKEYS(std::bitset<47ul>); // LuaSignal::LAST_SIGNAL
+CLASSKEYS(ArdourMarker*);
+CLASSKEYS(ARDOUR::RouteGroup);
+CLASSKEYS(ARDOUR::LuaProc);
+CLASSKEYS(ARDOUR::DataType);
+CLASSKEYS(ARDOUR::ChanCount);
+CLASSKEYS(boost::shared_ptr<ARDOUR::Processor>);
+CLASSKEYS(ARDOUR::ParameterDescriptor);
+CLASSKEYS(boost::shared_ptr<ARDOUR::AutomationList>);
+CLASSKEYS(boost::shared_ptr<Evoral::ControlList>);
+CLASSKEYS(ARDOUR::LuaOSC::Address);
+CLASSKEYS(ARDOUR::Session);
+CLASSKEYS(ARDOUR::BufferSet);
+CLASSKEYS(ARDOUR::ChanMapping);
+CLASSKEYS(ARDOUR::DSP::DspShm);
+CLASSKEYS(ARDOUR::LuaTableRef);
+CLASSKEYS(PBD::ID);
+CLASSKEYS(ARDOUR::Location);
+CLASSKEYS(ARDOUR::PluginInfo);
+CLASSKEYS(PBD::PropertyChange);
+CLASSKEYS(std::vector<std::string>);
+CLASSKEYS(std::list<boost::shared_ptr<ARDOUR::Route> >);
+CLASSKEYS(std::list<boost::shared_ptr<ARDOUR::Port> >);
+CLASSKEYS(boost::shared_ptr<ARDOUR::PluginInfo>);
+CLASSKEYS(boost::shared_ptr<ARDOUR::Region>);
+CLASSKEYS(boost::weak_ptr<ARDOUR::Route>);
+CLASSKEYS(std::list<boost::shared_ptr<ARDOUR::Region> >);
+CLASSKEYS(std::list<ARDOUR::AudioRange>);
+CLASSKEYS(Evoral::Beats);
+CLASSKEYS(ARDOUR::PortEngine);
+CLASSKEYS(ARDOUR::PortManager);
+CLASSKEYS(ARDOUR::AudioEngine);
+CLASSKEYS(void);
+CLASSKEYS(float);
+
+#endif // end windows special case
+
+/* Some notes on Lua bindings for libardour and friends
+ *
+ * - Prefer factory methods over Contructors whenever possible.
+ *   Don't expose the constructor method unless required.
+ *
+ *   e.g. Don't allow the script to construct a "Track" Object directly
+ *   but do allow to create a "BBT_TIME" object.
+ *
+ * - Do not dereference Shared or Weak Pointers. Pass the pointer to Lua.
+ * - Define Objects as boost:shared_ptr Object whenever possible.
+ *
+ *   Storing a boost::shared_ptr in a Lua-variable keeps the reference
+ *   until that variable is set to 'nil'.
+ *   (if the script were to keep a direct pointer to the object instance, the
+ *   behaviour is undefined if the actual object goes away)
+ *
+ *   Methods of the actual class are indirectly exposed,
+ *   boost::*_ptr get() and ::lock() is implicit when the class is exported
+ *   as LuaBridge's "WSPtrClass".
+ */
+
+using namespace ARDOUR;
+
+void
+LuaBindings::stddef (lua_State* L)
+{
+	// std::list<std::string>
+	luabridge::getGlobalNamespace (L)
+		.beginNamespace ("C")
+		.beginStdList <std::string> ("StringList")
+		.endClass ()
+
+	// std::vector<std::string>
+		.beginStdVector <std::string> ("StringVector")
+		.endClass ()
+
+	// register float array (uint8_t*)
+		.registerArray <uint8_t> ("ByteArray")
+
+	// register float array (float*)
+		.registerArray <float> ("FloatArray")
+
+	// register float array (int32_t*)
+		.registerArray <int32_t> ("IntArray")
+
+	// TODO std::set
+		.endNamespace ();
+}
+
+void
+LuaBindings::common (lua_State* L)
+{
+	luabridge::getGlobalNamespace (L)
+		.beginNamespace ("PBD")
+
+		.addFunction ("open_uri", (bool (*) (const std::string&))&PBD::open_uri)
+		.addFunction ("open_uri", &PBD::open_folder)
+
+		.beginClass <PBD::ID> ("ID")
+		.addConstructor <void (*) (std::string)> ()
+		.addFunction ("to_s", &PBD::ID::to_s) // TODO special case LUA __tostring ?
+		.endClass ()
+
+		.beginStdVector <PBD::ID> ("IdVector").endClass ()
+
+		.beginClass <XMLNode> ("XMLNode")
+		.addFunction ("name", &XMLNode::name)
+		.endClass ()
+
+		.beginClass <PBD::Stateful> ("Stateful")
+		.addFunction ("id", &PBD::Stateful::id)
+		.addFunction ("properties", &PBD::Stateful::properties)
+		.addFunction ("clear_changes", &PBD::Stateful::clear_changes)
+		.endClass ()
+
+		.beginWSPtrClass <PBD::Stateful> ("StatefulPtr")
+		.addFunction ("id", &PBD::Stateful::id)
+		.addFunction ("properties", &PBD::Stateful::properties)
+		.addFunction ("clear_changes", &PBD::Stateful::clear_changes)
+		.endClass ()
+
+		.deriveClass <PBD::StatefulDestructible, PBD::Stateful> ("StatefulDestructible")
+		.endClass ()
+
+		.deriveWSPtrClass <PBD::StatefulDestructible, PBD::Stateful> ("StatefulDestructiblePtr")
+		.endClass ()
+
+		.deriveClass <Command, PBD::StatefulDestructible> ("Command")
+		.addFunction ("set_name", &Command::set_name)
+		.addFunction ("name", &Command::name)
+		.endClass ()
+
+		/* UndoTransaction::add_command() subscribes to DropReferences()
+		 * and deletes the object.
+		 *
+		 * This object cannot be constructed by lua because lua would manage lifetime
+		 * and delete the object leading to a double free.
+		 *
+		 * use Session::add_stateful_diff_command()
+		 * and Session::abort_reversible_command()
+		 */
+		.deriveClass <PBD::StatefulDiffCommand, Command> ("StatefulDiffCommand")
+		.addFunction ("undo", &PBD::StatefulDiffCommand::undo)
+		.addFunction ("empty", &PBD::StatefulDiffCommand::empty)
+		.endClass ()
+
+		.deriveWSPtrClass <PBD::Controllable, PBD::StatefulDestructible> ("Controllable")
+		.addFunction ("name", &PBD::Controllable::name)
+		.addFunction ("get_value", &PBD::Controllable::get_value)
+		.endClass ()
+
+		.beginClass <PBD::RingBufferNPT <uint8_t> > ("RingBuffer8")
+		.addConstructor <void (*) (size_t)> ()
+		.addFunction ("reset", &PBD::RingBufferNPT<uint8_t>::reset)
+		.addFunction ("read", &PBD::RingBufferNPT<uint8_t>::read)
+		.addFunction ("write", &PBD::RingBufferNPT<uint8_t>::write)
+		.addFunction ("write_one", &PBD::RingBufferNPT<uint8_t>::write_one)
+		.addFunction ("write_space", &PBD::RingBufferNPT<uint8_t>::write_space)
+		.addFunction ("read_space", &PBD::RingBufferNPT<uint8_t>::read_space)
+		.addFunction ("increment_read_ptr", &PBD::RingBufferNPT<uint8_t>::increment_read_ptr)
+		.addFunction ("increment_write_ptr", &PBD::RingBufferNPT<uint8_t>::increment_write_ptr)
+		.endClass ()
+
+		.beginClass <PBD::RingBufferNPT <float> > ("RingBufferF")
+		.addConstructor <void (*) (size_t)> ()
+		.addFunction ("reset", &PBD::RingBufferNPT<float>::reset)
+		.addFunction ("read", &PBD::RingBufferNPT<float>::read)
+		.addFunction ("write", &PBD::RingBufferNPT<float>::write)
+		.addFunction ("write_one", &PBD::RingBufferNPT<float>::write_one)
+		.addFunction ("write_space", &PBD::RingBufferNPT<float>::write_space)
+		.addFunction ("read_space", &PBD::RingBufferNPT<float>::read_space)
+		.addFunction ("increment_read_ptr", &PBD::RingBufferNPT<float>::increment_read_ptr)
+		.addFunction ("increment_write_ptr", &PBD::RingBufferNPT<float>::increment_write_ptr)
+		.endClass ()
+
+		.beginClass <PBD::RingBufferNPT <int> > ("RingBufferI")
+		.addConstructor <void (*) (size_t)> ()
+		.addFunction ("reset", &PBD::RingBufferNPT<int>::reset)
+		.addFunction ("read", &PBD::RingBufferNPT<int>::read)
+		.addFunction ("write", &PBD::RingBufferNPT<int>::write)
+		.addFunction ("write_one", &PBD::RingBufferNPT<int>::write_one)
+		.addFunction ("write_space", &PBD::RingBufferNPT<int>::write_space)
+		.addFunction ("read_space", &PBD::RingBufferNPT<int>::read_space)
+		.addFunction ("increment_read_ptr", &PBD::RingBufferNPT<int>::increment_read_ptr)
+		.addFunction ("increment_write_ptr", &PBD::RingBufferNPT<int>::increment_write_ptr)
+		.endClass ()
+
+		/* PBD enums */
+		.beginNamespace ("GroupControlDisposition")
+		.addConst ("InverseGroup", PBD::Controllable::GroupControlDisposition(PBD::Controllable::InverseGroup))
+		.addConst ("NoGroup", PBD::Controllable::GroupControlDisposition(PBD::Controllable::NoGroup))
+		.addConst ("UseGroup", PBD::Controllable::GroupControlDisposition(PBD::Controllable::UseGroup))
+		.endNamespace ()
+
+		.endNamespace (); // PBD
+
+	luabridge::getGlobalNamespace (L)
+		.beginNamespace ("Timecode")
+		.beginClass <Timecode::BBT_Time> ("BBT_TIME")
+		.addConstructor <void (*) (uint32_t, uint32_t, uint32_t)> ()
+		.endClass ()
+		.endNamespace ();
+
+	luabridge::getGlobalNamespace (L)
+
+		.beginNamespace ("Evoral")
+		.beginClass <Evoral::Parameter> ("Parameter")
+		.addConstructor <void (*) (uint32_t, uint8_t, uint32_t)> ()
+		.addFunction ("type", &Evoral::Parameter::type)
+		.addFunction ("channel", &Evoral::Parameter::channel)
+		.addFunction ("id", &Evoral::Parameter::id)
+		.endClass ()
+
+		.beginWSPtrClass <Evoral::ControlList> ("ControlList")
+		.addFunction ("add", &Evoral::ControlList::add)
+		.addFunction ("thin", &Evoral::ControlList::thin)
+		.addFunction ("eval", &Evoral::ControlList::eval)
+		.addRefFunction ("rt_safe_eval", &Evoral::ControlList::rt_safe_eval)
+		.addFunction ("interpolation", &Evoral::ControlList::interpolation)
+		.addFunction ("set_interpolation", &Evoral::ControlList::set_interpolation)
+		.addFunction ("truncate_end", &Evoral::ControlList::truncate_end)
+		.addFunction ("truncate_start", &Evoral::ControlList::truncate_start)
+		.addFunction ("clear", (void (Evoral::ControlList::*)(double, double))&Evoral::ControlList::clear)
+		.addFunction ("in_write_pass", &Evoral::ControlList::in_write_pass)
+		.endClass ()
+
+		.beginWSPtrClass <Evoral::ControlSet> ("ControlSet")
+		.endClass ()
+
+		.beginWSPtrClass <Evoral::Control> ("Control")
+		.addFunction ("list", (boost::shared_ptr<Evoral::ControlList>(Evoral::Control::*)())&Evoral::Control::list)
+		.endClass ()
+
+		.beginClass <Evoral::ParameterDescriptor> ("ParameterDescriptor")
+		.addVoidConstructor ()
+		.addData ("lower", &Evoral::ParameterDescriptor::lower)
+		.addData ("upper", &Evoral::ParameterDescriptor::upper)
+		.addData ("normal", &Evoral::ParameterDescriptor::normal)
+		.addData ("toggled", &Evoral::ParameterDescriptor::toggled)
+		.endClass ()
+
+		.beginClass <Evoral::Range<framepos_t> > ("Range")
+		.addConstructor <void (*) (framepos_t, framepos_t)> ()
+		.addData ("from", &Evoral::Range<framepos_t>::from)
+		.addData ("to", &Evoral::Range<framepos_t>::to)
+		.endClass ()
+
+		/* libevoral enums */
+		.beginNamespace ("InterpolationStyle")
+		.addConst ("Discrete", Evoral::ControlList::InterpolationStyle(Evoral::ControlList::Discrete))
+		.addConst ("Linear", Evoral::ControlList::InterpolationStyle(Evoral::ControlList::Linear))
+		.addConst ("Curved", Evoral::ControlList::InterpolationStyle(Evoral::ControlList::Curved))
+		.endNamespace ()
+
+		.endNamespace () // Evoral
+
+		.beginNamespace ("ARDOUR")
+
+		.beginClass <InterThreadInfo> ("InterThreadInfo")
+		.addVoidConstructor ()
+		.addData ("done", const_cast<bool InterThreadInfo::*>(&InterThreadInfo::done))
+#if 0 // currently unused, lua is single-threaded, no custom UIs.
+		.addData ("cancel", (bool InterThreadInfo::*)&InterThreadInfo::cancel)
+#endif
+		.addData ("progress", const_cast<float InterThreadInfo::*>(&InterThreadInfo::progress))
+		.endClass ()
+
+		.beginClass <AudioRange> ("AudioRange")
+		.addConstructor <void (*) (framepos_t, framepos_t, uint32_t)> ()
+		.addFunction ("length", &AudioRange::length)
+		.addFunction ("equal", &AudioRange::equal)
+		.addData ("start", &AudioRange::start)
+		.addData ("_end", &AudioRange::end) // XXX "end" is a lua reserved word
+		.addData ("id", &AudioRange::id)
+		.endClass ()
+
+		.beginWSPtrClass <PluginInfo> ("PluginInfo")
+		.addVoidConstructor ()
+		.endClass ()
+
+		.beginNamespace ("Route")
+		.beginClass <Route::ProcessorStreams> ("ProcessorStreams")
+		.addVoidConstructor ()
+		.endClass ()
+		.endNamespace ()
+
+		.beginClass <ChanMapping> ("ChanMapping")
+		.addVoidConstructor ()
+		.addFunction ("get", static_cast<uint32_t(ChanMapping::*)(DataType, uint32_t) const>(&ChanMapping::get))
+		.addFunction ("set", &ChanMapping::set)
+		.addFunction ("count", &ChanMapping::count)
+		.addFunction ("n_total", &ChanMapping::n_total)
+		.addFunction ("is_monotonic", &ChanMapping::is_monotonic)
+		.addConst ("Invalid", 4294967295U) // UINT32_MAX
+		.endClass ()
+
+		.beginNamespace ("Properties")
+		// templated class definitions
+		.beginClass <PBD::PropertyDescriptor<bool> > ("BoolProperty").endClass ()
+		.beginClass <PBD::PropertyDescriptor<float> > ("FloatProperty").endClass ()
+		.beginClass <PBD::PropertyDescriptor<framepos_t> > ("FrameposProperty").endClass ()
+		// actual references (TODO: also expose GQuark for std::set)
+		//   ardour/region.h
+		.addConst ("Start", &ARDOUR::Properties::start)
+		.addConst ("Length", &ARDOUR::Properties::length)
+		.addConst ("Position", &ARDOUR::Properties::position)
+		.endNamespace ()
+
+		.beginClass <PBD::PropertyChange> ("PropertyChange")
+		// TODO add special handling (std::set<PropertyID>), PropertyID is a GQuark.
+		// -> direct map to lua table  beginStdSet()A
+		//
+		// expand templated PropertyDescriptor<T>
+		.addFunction ("containsBool", &PBD::PropertyChange::contains<bool>)
+		.addFunction ("containsFloat", &PBD::PropertyChange::contains<float>)
+		.addFunction ("containsFramePos", &PBD::PropertyChange::contains<framepos_t>)
+		.endClass ()
+
+		.beginClass <PBD::PropertyList> ("PropertyList")
+		// is-a  std::map<PropertyID, PropertyBase*>
+		.endClass ()
+
+		.deriveClass <PBD::OwnedPropertyList, PBD::PropertyList> ("OwnedPropertyList")
+		.endClass ()
+
+		.beginWSPtrClass <AutomationList> ("AutomationList")
+		.addCast<PBD::Stateful> ("to_stateful")
+		.addCast<PBD::StatefulDestructible> ("to_statefuldestructible")
+		.addCast<Evoral::ControlList> ("list")
+		.addFunction ("get_state", &AutomationList::get_state)
+		.addFunction ("memento_command", &AutomationList::memento_command)
+		.addFunction ("touching", &AutomationList::touching)
+		.addFunction ("writing", &AutomationList::writing)
+		.addFunction ("touch_enabled", &AutomationList::touch_enabled)
+		.endClass ()
+
+		.deriveClass <Location, PBD::StatefulDestructible> ("Location")
+		.addFunction ("locked", &Location::locked)
+		.addFunction ("lock", &Location::lock)
+		.addFunction ("unlock", &Location::unlock)
+		.addFunction ("start", &Location::start)
+		.addFunction ("_end", &Location::end) // XXX "end" is a lua reserved word
+		.addFunction ("length", &Location::length)
+		.addFunction ("set_start", &Location::set_start)
+		.addFunction ("set_end", &Location::set_end)
+		.addFunction ("set_length", &Location::set)
+		.addFunction ("move_to", &Location::move_to)
+		.addFunction ("matches", &Location::matches)
+		.addFunction ("flags", &Location::flags)
+		.addFunction ("is_auto_punch", &Location::is_auto_punch)
+		.addFunction ("is_auto_loop", &Location::is_auto_loop)
+		.addFunction ("is_mark", &Location::is_mark)
+		.addFunction ("is_hidden", &Location::is_hidden)
+		.addFunction ("is_cd_marker", &Location::is_cd_marker)
+		.addFunction ("is_session_range", &Location::is_session_range)
+		.addFunction ("is_range_marker", &Location::is_range_marker)
+		.endClass ()
+
+		.deriveClass <Locations, PBD::StatefulDestructible> ("Locations")
+		.addFunction ("list", static_cast<Locations::LocationList (Locations::*)()>(&Locations::list))
+		.addFunction ("auto_loop_location", &Locations::auto_loop_location)
+		.addFunction ("auto_punch_location", &Locations::auto_punch_location)
+		.addFunction ("session_range_location", &Locations::session_range_location)
+		.addFunction ("first_mark_after", &Locations::first_mark_after)
+		.addFunction ("first_mark_before", &Locations::first_mark_before)
+		.addFunction ("first_mark_at", &Locations::mark_at)
+		.addRefFunction ("marks_either_side", &Locations::marks_either_side)
+		.addRefFunction ("find_all_between", &Locations::find_all_between)
+		.endClass ()
+
+		.beginWSPtrClass <SessionObject> ("SessionObject")
+		/* SessionObject is-a PBD::StatefulDestructible,
+		 * but multiple inheritance is not covered by luabridge,
+		 * we need explicit casts */
+		.addCast<PBD::Stateful> ("to_stateful")
+		.addCast<PBD::StatefulDestructible> ("to_statefuldestructible")
+		.addFunction ("name", &SessionObject::name)
+		.endClass ()
+
+		.beginWSPtrClass <Port> ("Port")
+		.addCast<MidiPort> ("to_midiport")
+		.addCast<AudioPort> ("to_audioport")
+		.addFunction ("name", &Port::name)
+		.addFunction ("pretty_name", &Port::pretty_name)
+		.addFunction ("receives_input", &Port::receives_input)
+		.addFunction ("sends_output", &Port::sends_output)
+		.addFunction ("connected", &Port::connected)
+		.addFunction ("disconnect_all", &Port::disconnect_all)
+		.addFunction ("connected_to_name", (bool (Port::*)(std::string const &)const)&Port::connected_to)
+		.addFunction ("connect_by_name", (int (Port::*)(std::string const &))&Port::connect)
+		.addFunction ("disconnect_by_name", (int (Port::*)(std::string const &))&Port::disconnect)
+		.addFunction ("connected_to", (bool (Port::*)(Port*)const)&Port::connected_to)
+		.addFunction ("connect", (int (Port::*)(Port*))&Port::connect)
+		.addFunction ("disconnect", (int (Port::*)(Port*))&Port::disconnect)
+		//.addStaticFunction ("port_offset", &Port::port_offset) // static
+		.endClass ()
+
+		.deriveWSPtrClass <AudioPort, Port> ("AudioPort")
+		.endClass ()
+
+		.deriveWSPtrClass <MidiPort, Port> ("MidiPort")
+		.addFunction ("input_active", &MidiPort::input_active)
+		.addFunction ("set_input_active", &MidiPort::set_input_active)
+		.addFunction ("get_midi_buffer", &MidiPort::get_midi_buffer) // DSP only
+		.endClass ()
+
+		.beginWSPtrClass <PortSet> ("PortSet")
+		.addFunction ("num_ports", (size_t (PortSet::*)(DataType)const)&PortSet::num_ports)
+		.addFunction ("add", &PortSet::add)
+		.addFunction ("remove", &PortSet::remove)
+		.addFunction ("port", (boost::shared_ptr<Port> (PortSet::*)(DataType, size_t)const)&PortSet::port)
+		.addFunction ("contains", &PortSet::contains)
+		.addFunction ("clear", &PortSet::clear)
+		.addFunction ("empty", &PortSet::empty)
+		.endClass ()
+
+		.deriveWSPtrClass <IO, SessionObject> ("IO")
+		.addFunction ("active", &IO::active)
+		.addFunction ("add_port", &IO::add_port)
+		.addFunction ("remove_port", &IO::remove_port)
+		.addFunction ("connect", &IO::connect)
+		.addFunction ("disconnect", (int (IO::*)(boost::shared_ptr<Port>, std::string, void *))&IO::disconnect)
+		.addFunction ("physically_connected", &IO::physically_connected)
+		.addFunction ("has_port", &IO::has_port)
+		.addFunction ("nth", &IO::nth)
+		.addFunction ("audio", &IO::audio)
+		.addFunction ("midi", &IO::midi)
+		.addFunction ("port_by_name", &IO::nth)
+		.addFunction ("n_ports", &IO::n_ports)
+		.endClass ()
+
+		.beginClass <RouteGroup> ("RouteGroup")
+		// stub RouteGroup* is needed for new_audio_track()
+		.endClass ()
+
+		.deriveWSPtrClass <Stripable, SessionObject> ("Stripable")
+		.addCast<Route> ("to_route")
+		.addFunction ("is_auditioner", &Stripable::is_auditioner)
+		.addFunction ("is_master", &Stripable::is_master)
+		.addFunction ("is_monitor", &Stripable::is_monitor)
+		.addFunction ("is_hidden", &Stripable::is_hidden)
+		.addFunction ("is_selected", &Stripable::is_selected)
+		.addFunction ("gain_control", &Stripable::gain_control)
+		.addFunction ("solo_control", &Stripable::solo_control)
+		.addFunction ("solo_isolate_control", &Stripable::solo_isolate_control)
+		.addFunction ("solo_safe_control", &Stripable::solo_safe_control)
+		.addFunction ("mute_control", &Stripable::mute_control)
+		.addFunction ("phase_control", &Stripable::phase_control)
+		.addFunction ("trim_control", &Stripable::trim_control)
+		.addFunction ("rec_enable_control", &Stripable::rec_enable_control)
+		.addFunction ("rec_safe_control", &Stripable::rec_safe_control)
+		.endClass ()
+
+		.deriveWSPtrClass <Route, Stripable> ("Route")
+		.addCast<Track> ("to_track")
+		.addFunction ("set_name", &Route::set_name)
+		.addFunction ("comment", &Route::comment)
+		.addFunction ("active", &Route::active)
+		.addFunction ("set_active", &Route::set_active)
+		.addFunction ("nth_plugin", &Route::nth_plugin)
+		.addFunction ("nth_processor", &Route::nth_processor)
+		.addFunction ("nth_send", &Route::nth_send)
+		.addFunction ("add_processor_by_index", &Route::add_processor_by_index)
+		.addFunction ("remove_processor", &Route::remove_processor)
+		.addFunction ("replace_processor", &Route::replace_processor)
+		.addFunction ("n_inputs", &Route::n_inputs)
+		.addFunction ("n_outputs", &Route::n_outputs)
+		.addFunction ("set_comment", &Route::set_comment)
+		.addFunction ("strict_io", &Route::strict_io)
+		.addFunction ("set_strict_io", &Route::set_strict_io)
+		.addFunction ("reset_plugin_insert", &Route::reset_plugin_insert)
+		.addFunction ("customize_plugin_insert", &Route::customize_plugin_insert)
+		.addFunction ("add_sidechain", &Route::add_sidechain)
+		.addFunction ("remove_sidechain", &Route::remove_sidechain)
+		.addFunction ("main_outs", &Route::main_outs)
+		.addFunction ("muted", &Route::muted)
+		.addFunction ("soloed", &Route::soloed)
+		.addFunction ("amp", &Route::amp)
+		.addFunction ("trim", &Route::trim)
+		.endClass ()
+
+		.deriveWSPtrClass <Playlist, SessionObject> ("Playlist")
+		.addFunction ("region_by_id", &Playlist::region_by_id)
+		.addFunction ("data_type", &Playlist::data_type)
+		.addFunction ("n_regions", &Playlist::n_regions)
+		//.addFunction ("get_extent", &Playlist::get_extent) // pair<framepos_t, framepos_t>
+		.addFunction ("region_list", &Playlist::region_list)
+		.addFunction ("add_region", &Playlist::add_region)
+		.addFunction ("remove_region", &Playlist::remove_region)
+		.addFunction ("regions_at", &Playlist::regions_at)
+		.addFunction ("top_region_at", &Playlist::top_region_at)
+		.addFunction ("top_unmuted_region_at", &Playlist::top_unmuted_region_at)
+		.addFunction ("find_next_region", &Playlist::find_next_region)
+		.addFunction ("find_next_region_boundary", &Playlist::find_next_region_boundary)
+		.addFunction ("count_regions_at", &Playlist::count_regions_at)
+		.addFunction ("regions_touched", &Playlist::regions_touched)
+		.addFunction ("regions_with_start_within", &Playlist::regions_with_start_within)
+		.addFunction ("regions_with_end_within", &Playlist::regions_with_end_within)
+		.addFunction ("raise_region", &Playlist::raise_region)
+		.addFunction ("lower_region", &Playlist::lower_region)
+		.addFunction ("raise_region_to_top", &Playlist::raise_region_to_top)
+		.addFunction ("lower_region_to_bottom", &Playlist::lower_region_to_bottom)
+		.addFunction ("duplicate", (void (Playlist::*)(boost::shared_ptr<Region>, framepos_t, framecnt_t, float))&Playlist::duplicate)
+		.addFunction ("duplicate_until", &Playlist::duplicate_until)
+		.addFunction ("duplicate_range", &Playlist::duplicate_range)
+		.addFunction ("combine", &Playlist::combine)
+		.addFunction ("uncombine", &Playlist::uncombine)
+		.addFunction ("split_region", &Playlist::split_region)
+		.addFunction ("split", (void (Playlist::*)(framepos_t))&Playlist::split)
+		.addFunction ("cut", (boost::shared_ptr<Playlist> (Playlist::*)(std::list<AudioRange>&, bool))&Playlist::cut)
+#if 0
+		.addFunction ("copy", &Playlist::copy)
+		.addFunction ("paste", &Playlist::paste)
+#endif
+		.endClass ()
+
+		.deriveWSPtrClass <Track, Route> ("Track")
+		.addCast<AudioTrack> ("to_audio_track")
+		.addCast<MidiTrack> ("to_midi_track")
+		.addFunction ("set_name", &Track::set_name)
+		.addFunction ("can_record", &Track::can_record)
+		.addFunction ("bounceable", &Track::bounceable)
+		.addFunction ("bounce", &Track::bounce)
+		.addFunction ("bounce_range", &Track::bounce_range)
+		.addFunction ("playlist", &Track::playlist)
+		.endClass ()
+
+		.deriveWSPtrClass <AudioTrack, Track> ("AudioTrack")
+		.endClass ()
+
+		.deriveWSPtrClass <MidiTrack, Track> ("MidiTrack")
+		.endClass ()
+
+		.deriveWSPtrClass <Region, SessionObject> ("Region")
+		/* properties */
+		.addFunction ("position", &Region::position)
+		.addFunction ("start", &Region::start)
+		.addFunction ("length", &Region::length)
+		.addFunction ("layer", &Region::layer)
+		.addFunction ("data_type", &Region::data_type)
+		.addFunction ("stretch", &Region::stretch)
+		.addFunction ("shift", &Region::shift)
+		.addRefFunction ("sync_offset", &Region::sync_offset)
+		.addFunction ("sync_position", &Region::sync_position)
+		.addFunction ("hidden", &Region::hidden)
+		.addFunction ("muted", &Region::muted)
+		.addFunction ("opaque", &Region::opaque)
+		.addFunction ("locked", &Region::locked)
+		.addFunction ("position_locked", &Region::position_locked)
+		.addFunction ("video_locked", &Region::video_locked)
+		.addFunction ("automatic", &Region::automatic)
+		.addFunction ("whole_file", &Region::whole_file)
+		.addFunction ("captured", &Region::captured)
+		.addFunction ("can_move", &Region::can_move)
+		.addFunction ("sync_marked", &Region::sync_marked)
+		.addFunction ("external", &Region::external)
+		.addFunction ("import", &Region::import)
+		.addFunction ("covers", &Region::covers)
+		.addFunction ("at_natural_position", &Region::at_natural_position)
+		.addFunction ("is_compound", &Region::is_compound)
+		/* editing operations */
+		.addFunction ("set_length", &Region::set_length)
+		.addFunction ("set_start", &Region::set_start)
+		.addFunction ("set_position", &Region::set_position)
+		.addFunction ("set_initial_position", &Region::set_initial_position)
+		.addFunction ("nudge_position", &Region::nudge_position)
+		.addFunction ("move_to_natural_position", &Region::move_to_natural_position)
+		.addFunction ("move_start", &Region::move_start)
+		.addFunction ("trim_front", &Region::trim_front)
+		.addFunction ("trim_end", &Region::trim_end)
+		.addFunction ("trim_to", &Region::trim_to)
+		.addFunction ("cut_front", &Region::cut_front)
+		.addFunction ("cut_end", &Region::cut_end)
+		.addFunction ("raise", &Region::raise)
+		.addFunction ("lower", &Region::lower)
+		.addFunction ("raise_to_top", &Region::raise_to_top)
+		.addFunction ("lower_to_bottom", &Region::lower_to_bottom)
+		.addFunction ("set_sync_position", &Region::set_sync_position)
+		.addFunction ("clear_sync_position", &Region::clear_sync_position)
+		.addFunction ("set_hidden", &Region::set_hidden)
+		.addFunction ("set_muted", &Region::set_muted)
+		.addFunction ("set_opaque", &Region::set_opaque)
+		.addFunction ("set_locked", &Region::set_locked)
+		.addFunction ("set_video_locked", &Region::set_video_locked)
+		.addFunction ("set_position_locked", &Region::set_position_locked)
+		.endClass ()
+
+		.beginWSPtrClass <Source> ("Source")
+		.endClass ()
+
+		.beginClass <Plugin::PresetRecord> ("PresetRecord")
+		.addVoidConstructor ()
+		.addData ("uri", &Plugin::PresetRecord::uri, false)
+		.addData ("label", &Plugin::PresetRecord::label, false)
+		.addData ("user", &Plugin::PresetRecord::user, false)
+		.addData ("valid", &Plugin::PresetRecord::valid, false)
+		.endClass ()
+
+		.deriveWSPtrClass <Automatable, Evoral::ControlSet> ("Automatable")
+		.addFunction ("automation_control", (boost::shared_ptr<AutomationControl>(Automatable::*)(const Evoral::Parameter&, bool))&Automatable::automation_control)
+		.endClass ()
+
+		.deriveClass <ParameterDescriptor, Evoral::ParameterDescriptor> ("ParameterDescriptor")
+		.addVoidConstructor ()
+		.addData ("label", &ParameterDescriptor::label)
+		.addData ("logarithmic", &ParameterDescriptor::logarithmic)
+		.addStaticFunction ("midi_note_name", &ParameterDescriptor::midi_note_name)
+		.endClass ()
+
+		.deriveWSPtrClass <Processor, SessionObject> ("Processor")
+		.addCast<Automatable> ("to_automatable")
+		.addCast<PluginInsert> ("to_insert")
+		.addCast<SideChain> ("to_sidechain")
+		.addCast<IOProcessor> ("to_ioprocessor")
+		.addCast<UnknownProcessor> ("to_unknownprocessor")
+		.addCast<Amp> ("to_amp")
+#if 0 // those objects are not yet bound
+		.addCast<MonitorProcessor> ("to_monitorprocessor")
+		.addCast<CapturingProcessor> ("to_capturingprocessor")
+		.addCast<DelayLine> ("to_delayline")
+		.addCast<PeakMeter> ("to_meter")
+#endif
+		.addFunction ("display_name", &Processor::display_name)
+		.addFunction ("active", &Processor::active)
+		.addFunction ("activate", &Processor::activate)
+		.addFunction ("deactivate", &Processor::deactivate)
+		.endClass ()
+
+		.deriveWSPtrClass <IOProcessor, Processor> ("IOProcessor")
+		.addFunction ("natural_input_streams", &IOProcessor::natural_input_streams)
+		.addFunction ("natural_output_streams", &IOProcessor::natural_output_streams)
+		.addFunction ("input", (boost::shared_ptr<IO>(IOProcessor::*)())&IOProcessor::input)
+		.addFunction ("output", (boost::shared_ptr<IO>(IOProcessor::*)())&IOProcessor::output)
+		.endClass ()
+
+		.deriveWSPtrClass <SideChain, IOProcessor> ("SideChain")
+		.endClass ()
+
+		.deriveWSPtrClass <Delivery, IOProcessor> ("Delivery")
+		.endClass ()
+
+		.deriveWSPtrClass <Plugin, PBD::StatefulDestructible> ("Plugin")
+		.addFunction ("label", &Plugin::label)
+		.addFunction ("name", &Plugin::name)
+		.addFunction ("maker", &Plugin::maker)
+		.addFunction ("parameter_count", &Plugin::parameter_count)
+		.addRefFunction ("nth_parameter", &Plugin::nth_parameter)
+		.addFunction ("preset_by_label", &Plugin::preset_by_label)
+		.addFunction ("preset_by_uri", &Plugin::preset_by_uri)
+		.addFunction ("load_preset", &Plugin::load_preset)
+		.addFunction ("parameter_is_input", &Plugin::parameter_is_input)
+		.addFunction ("get_docs", &Plugin::get_docs)
+		.addFunction ("get_parameter_docs", &Plugin::get_parameter_docs)
+		.addRefFunction ("get_parameter_descriptor", &Plugin::get_parameter_descriptor)
+		.endClass ()
+
+		.deriveWSPtrClass <PluginInsert, Processor> ("PluginInsert")
+		.addFunction ("plugin", &PluginInsert::plugin)
+		.addFunction ("activate", &PluginInsert::activate)
+		.addFunction ("deactivate", &PluginInsert::deactivate)
+		.addFunction ("strict_io_configured", &PluginInsert::strict_io_configured)
+		.addFunction ("input_map", (ARDOUR::ChanMapping (PluginInsert::*)(uint32_t) const)&PluginInsert::input_map)
+		.addFunction ("output_map", (ARDOUR::ChanMapping (PluginInsert::*)(uint32_t) const)&PluginInsert::output_map)
+		.addFunction ("set_input_map", &PluginInsert::set_input_map)
+		.addFunction ("set_output_map", &PluginInsert::set_output_map)
+		.addFunction ("sidechain_input", &PluginInsert::sidechain_input)
+		.endClass ()
+
+		.deriveWSPtrClass <AutomationControl, PBD::Controllable> ("AutomationControl")
+		.addCast<Evoral::Control> ("to_ctrl")
+		.addFunction ("automation_state", &AutomationControl::automation_state)
+		.addFunction ("automation_style", &AutomationControl::automation_style)
+		.addFunction ("set_automation_state", &AutomationControl::set_automation_state)
+		.addFunction ("set_automation_style", &AutomationControl::set_automation_style)
+		.addFunction ("start_touch", &AutomationControl::start_touch)
+		.addFunction ("stop_touch", &AutomationControl::stop_touch)
+		.addFunction ("get_value", &AutomationControl::get_value)
+		.addFunction ("set_value", &AutomationControl::set_value)
+		.addFunction ("writable", &AutomationControl::writable)
+		.addFunction ("alist", &AutomationControl::alist)
+		.endClass ()
+
+		.deriveWSPtrClass <SlavableAutomationControl, AutomationControl> ("SlavableAutomationControl,")
+		.addFunction ("add_master", &SlavableAutomationControl::add_master)
+		.addFunction ("remove_master", &SlavableAutomationControl::remove_master)
+		.addFunction ("clear_masters", &SlavableAutomationControl::clear_masters)
+		.addFunction ("slaved_to", &SlavableAutomationControl::slaved_to)
+		.addFunction ("slaved", &SlavableAutomationControl::slaved)
+		.addFunction ("get_masters_value", &SlavableAutomationControl::get_masters_value)
+		.addFunction ("get_boolean_masters", &SlavableAutomationControl::get_boolean_masters)
+		//.addFunction ("masters", &SlavableAutomationControl::masters) // not implemented
+		.endClass ()
+
+		.deriveWSPtrClass <PhaseControl, AutomationControl> ("PhaseControl")
+		.addFunction ("set_phase_invert", (void(PhaseControl::*)(uint32_t, bool))&PhaseControl::set_phase_invert)
+		.addFunction ("inverted", &PhaseControl::inverted)
+		.endClass ()
+
+		.deriveWSPtrClass <GainControl, SlavableAutomationControl> ("GainControl")
+		.endClass ()
+
+		.deriveWSPtrClass <SoloControl, SlavableAutomationControl> ("SoloControl")
+		.addFunction ("can_solo", &SoloControl::can_solo)
+		.addFunction ("soloed", &SoloControl::soloed)
+		.addFunction ("self_soloed", &SoloControl::self_soloed)
+		.endClass ()
+
+		.deriveWSPtrClass <MuteControl, SlavableAutomationControl> ("MuteControl")
+		.addFunction ("muted", &MuteControl::muted)
+		.addFunction ("muted_by_self", &MuteControl::muted_by_self)
+		.endClass ()
+
+		.deriveWSPtrClass <SoloIsolateControl, SlavableAutomationControl> ("SoloIsolateControl")
+		.addFunction ("solo_isolated", &SoloIsolateControl::solo_isolated)
+		.addFunction ("self_solo_isolated", &SoloIsolateControl::self_solo_isolated)
+		.endClass ()
+
+		.deriveWSPtrClass <SoloSafeControl, SlavableAutomationControl> ("SoloSafeControl")
+		.addFunction ("solo_safe", &SoloSafeControl::solo_safe)
+		.endClass ()
+
+		.deriveWSPtrClass <Amp, Processor> ("Amp")
+		.addFunction ("gain_control", (boost::shared_ptr<GainControl>(Amp::*)())&Amp::gain_control)
+		.endClass ()
+
+		.deriveWSPtrClass <UnknownProcessor, Processor> ("UnknownProcessor")
+		.endClass ()
+
+		.deriveWSPtrClass <PluginInsert::PluginControl, AutomationControl> ("PluginControl")
+		.endClass ()
+
+		.deriveWSPtrClass <AudioSource, Source> ("AudioSource")
+		.addFunction ("readable_length", &AudioSource::readable_length)
+		.addFunction ("n_channels", &AudioSource::n_channels)
+		.endClass ()
+
+		// <std::list<boost::shared_ptr <AudioTrack> >
+		.beginStdList <boost::shared_ptr<AudioTrack> > ("AudioTrackList")
+		.endClass ()
+
+		// std::list<boost::shared_ptr <MidiTrack> >
+		.beginStdList <boost::shared_ptr<MidiTrack> > ("MidiTrackList")
+		.endClass ()
+
+		// RouteList == std::list<boost::shared_ptr<Route> >
+		.beginConstStdList <boost::shared_ptr<Route> > ("RouteList")
+		.endClass ()
+
+		// boost::shared_ptr<RouteList>
+		.beginPtrStdList <boost::shared_ptr<Route> > ("RouteListPtr")
+		.endClass ()
+
+		// typedef std::list<boost::weak_ptr <Route> > WeakRouteList
+		.beginConstStdList <boost::weak_ptr<Route> > ("WeakRouteList")
+		.endClass ()
+
+		// std::list< boost::weak_ptr <AudioSource> >
+		.beginConstStdList <boost::weak_ptr<AudioSource> > ("WeakAudioSourceList")
+		.endClass ()
+
+		// typedef std::list<boost::shared_ptr<Region> > RegionList
+		.beginConstStdList <boost::shared_ptr<Region> > ("RegionList")
+		.endClass ()
+
+		// boost::shared_ptr <std::list<boost::shared_ptr<Region> > >
+		.beginPtrStdList <boost::shared_ptr<Region> > ("RegionListPtr")
+		.endClass ()
+
+		//std::list<boost::shared_ptr<Port> > PortList;
+		.beginConstStdList <boost::shared_ptr<Port> > ("PortList")
+		.endClass ()
+
+		// used by Playlist::cut/copy
+		.beginConstStdList <AudioRange> ("AudioRangeList")
+		.endClass ()
+
+		.beginConstStdList <Location*> ("LocationList")
+		.endClass ()
+
+#if 0  // depends on Evoal:: Note, Beats see note_fixer.h
+	// typedef Evoral::Note<Evoral::Beats> Note;
+	// std::set< boost::weak_ptr<Note> >
+		.beginStdSet <boost::weak_ptr<Note> > ("WeakNoteSet")
+		.endClass ()
+#endif
+
+	// std::list<boost::weak_ptr<Source> >
+		.beginConstStdList <boost::weak_ptr<Source> > ("WeakSourceList")
+		.endClass ()
+
+		.beginClass <Tempo> ("Tempo")
+		.addConstructor <void (*) (double, double)> ()
+		.addFunction ("note_type", &Tempo::note_type)
+		.addFunction ("beats_per_minute", &Tempo::beats_per_minute)
+		.addFunction ("frames_per_beat", &Tempo::frames_per_beat)
+		.endClass ()
+
+		.beginClass <Meter> ("Meter")
+		.addConstructor <void (*) (double, double)> ()
+		.addFunction ("divisions_per_bar", &Meter::divisions_per_bar)
+		.addFunction ("note_divisor", &Meter::note_divisor)
+		.addFunction ("frames_per_bar", &Meter::frames_per_bar)
+		.addFunction ("frames_per_grid", &Meter::frames_per_grid)
+		.endClass ()
+
+		.beginClass <TempoMap> ("TempoMap")
+		.addFunction ("add_tempo", &TempoMap::add_tempo)
+		.addFunction ("add_meter", &TempoMap::add_meter)
+		.addFunction ("tempo_section_at_frame", &TempoMap::tempo_section_at_frame)
+		.addFunction ("meter_section_at_frame", &TempoMap::meter_section_at_frame)
+		.addFunction ("meter_section_at_beat", &TempoMap::meter_section_at_beat)
+		.endClass ()
+
+		.beginClass <MetricSection> ("MetricSection")
+		.addFunction ("pulse", &MetricSection::pulse)
+		.addFunction ("set_pulse", &MetricSection::set_pulse)
+		.endClass ()
+
+		.deriveClass <TempoSection, MetricSection> ("TempoSection")
+		.addFunction ("c_func", (double(TempoSection::*)()const)&TempoSection::c_func)
+		.endClass ()
+
+		.deriveClass <MeterSection, MetricSection> ("MeterSection")
+		.addCast<Meter> ("to_meter")
+		.addFunction ("set_pulse", &MeterSection::set_pulse)
+		.addFunction ("set_beat", (void(MeterSection::*)(double))&MeterSection::set_beat)
+		.endClass ()
+
+		.beginClass <ChanCount> ("ChanCount")
+		.addConstructor <void (*) (DataType, uint32_t)> ()
+		.addFunction ("get", &ChanCount::get)
+		.addFunction ("set", &ChanCount::set)
+		.addFunction ("n_audio", &ChanCount::n_audio)
+		.addFunction ("n_midi", &ChanCount::n_midi)
+		.addFunction ("n_total", &ChanCount::n_total)
+		.addFunction ("reset", &ChanCount::reset)
+		.endClass()
+
+		.beginClass <DataType> ("DataType")
+		.addConstructor <void (*) (std::string)> ()
+		.addStaticCFunction ("null",  &LuaAPI::datatype_ctor_null) // "nil" is a lua reseved word
+		.addStaticCFunction ("audio", &LuaAPI::datatype_ctor_audio)
+		.addStaticCFunction ("midi",  &LuaAPI::datatype_ctor_midi)
+		.addFunction ("to_string",  &DataType::to_string) // TODO Lua __tostring
+		// TODO add uint32_t cast, add operator==  !=
+		.endClass()
+
+		/* libardour enums */
+		.beginNamespace ("PluginType")
+		.addConst ("AudioUnit", ARDOUR::PluginType(AudioUnit))
+		.addConst ("LADSPA", ARDOUR::PluginType(LADSPA))
+		.addConst ("LV2", ARDOUR::PluginType(LV2))
+		.addConst ("Windows_VST", ARDOUR::PluginType(Windows_VST))
+		.addConst ("LXVST", ARDOUR::PluginType(LXVST))
+		.addConst ("Lua", ARDOUR::PluginType(Lua))
+		.endNamespace ()
+
+		.beginNamespace ("PresentationInfo")
+		.beginNamespace ("Flag")
+		.addConst ("AudioTrack", ARDOUR::PresentationInfo::Flag(PresentationInfo::AudioTrack))
+		.addConst ("MidiTrack", ARDOUR::PresentationInfo::Flag(PresentationInfo::MidiTrack))
+		.addConst ("AudioBus", ARDOUR::PresentationInfo::Flag(PresentationInfo::AudioBus))
+		.addConst ("MidiBus", ARDOUR::PresentationInfo::Flag(PresentationInfo::MidiBus))
+		.addConst ("VCA", ARDOUR::PresentationInfo::Flag(PresentationInfo::VCA))
+		.addConst ("MasterOut", ARDOUR::PresentationInfo::Flag(PresentationInfo::MasterOut))
+		.addConst ("MonitorOut", ARDOUR::PresentationInfo::Flag(PresentationInfo::MonitorOut))
+		.addConst ("Auditioner", ARDOUR::PresentationInfo::Flag(PresentationInfo::Auditioner))
+		.addConst ("Selected", ARDOUR::PresentationInfo::Flag(PresentationInfo::Selected))
+		.addConst ("Hidden", ARDOUR::PresentationInfo::Flag(PresentationInfo::Hidden))
+		.addConst ("GroupOrderSet", ARDOUR::PresentationInfo::Flag(PresentationInfo::OrderSet))
+		.addConst ("StatusMask", ARDOUR::PresentationInfo::Flag(PresentationInfo::StatusMask))
+		.endNamespace ()
+		.endNamespace ()
+
+		.beginNamespace ("AutoStyle")
+		.addConst ("Absolute", ARDOUR::AutoStyle(Absolute))
+		.addConst ("Trim", ARDOUR::AutoStyle(Trim))
+		.endNamespace ()
+
+		.beginNamespace ("AutoState")
+		.addConst ("Off", ARDOUR::AutoState(Off))
+		.addConst ("Write", ARDOUR::AutoState(Write))
+		.addConst ("Touch", ARDOUR::AutoState(Touch))
+		.addConst ("Play", ARDOUR::AutoState(Play))
+		.endNamespace ()
+
+		.beginNamespace ("AutomationType")
+		.addConst ("GainAutomation", ARDOUR::AutomationType(GainAutomation))
+		.addConst ("PluginAutomation", ARDOUR::AutomationType(PluginAutomation))
+		.addConst ("SoloAutomation", ARDOUR::AutomationType(SoloAutomation))
+		.addConst ("SoloIsolateAutomation", ARDOUR::AutomationType(SoloIsolateAutomation))
+		.addConst ("SoloSafeAutomation", ARDOUR::AutomationType(SoloSafeAutomation))
+		.addConst ("MuteAutomation", ARDOUR::AutomationType(MuteAutomation))
+		.addConst ("RecEnableAutomation", ARDOUR::AutomationType(RecEnableAutomation))
+		.addConst ("RecSafeAutomation", ARDOUR::AutomationType(RecSafeAutomation))
+		.addConst ("TrimAutomation", ARDOUR::AutomationType(TrimAutomation))
+		.addConst ("PhaseAutomation", ARDOUR::AutomationType(PhaseAutomation))
+		.endNamespace ()
+
+		.beginNamespace ("SrcQuality")
+		.addConst ("SrcBest", ARDOUR::SrcQuality(SrcBest))
+		.endNamespace ()
+
+		.beginNamespace ("PortFlags")
+		.addConst ("IsInput", ARDOUR::PortFlags(IsInput))
+		.addConst ("IsOutput", ARDOUR::PortFlags(IsOutput))
+		.addConst ("IsPhysical", ARDOUR::PortFlags(IsPhysical))
+		.addConst ("CanMonitor", ARDOUR::PortFlags(CanMonitor))
+		.addConst ("IsTerminal", ARDOUR::PortFlags(IsTerminal))
+		.endNamespace ()
+
+		.beginNamespace ("PlaylistDisposition")
+		.addConst ("CopyPlaylist", ARDOUR::PlaylistDisposition(CopyPlaylist))
+		.addConst ("NewPlaylist", ARDOUR::PlaylistDisposition(NewPlaylist))
+		.addConst ("SharePlaylist", ARDOUR::PlaylistDisposition(SharePlaylist))
+		.endNamespace ()
+
+		.beginNamespace ("RegionPoint")
+		.addConst ("Start", ARDOUR::RegionPoint(Start))
+		.addConst ("End", ARDOUR::RegionPoint(End))
+		.addConst ("SyncPoint", ARDOUR::RegionPoint(SyncPoint))
+		.endNamespace ()
+
+		.beginNamespace ("TempoSection")
+		.beginNamespace ("PositionLockStyle")
+		.addConst ("AudioTime", ARDOUR::PositionLockStyle(AudioTime))
+		.addConst ("MusicTime", ARDOUR::PositionLockStyle(MusicTime))
+		.endNamespace ()
+		.endNamespace ()
+
+		.beginNamespace ("TempoSection")
+		.beginNamespace ("Type")
+		.addConst ("Ramp", ARDOUR::TempoSection::Type(TempoSection::Ramp))
+		.addConst ("Constant", ARDOUR::TempoSection::Type(TempoSection::Constant))
+		.endNamespace ()
+		.endNamespace ()
+
+		.beginNamespace ("TrackMode")
+		.addConst ("Normal", ARDOUR::TrackMode(Start))
+		.addConst ("NonLayered", ARDOUR::TrackMode(NonLayered))
+		.addConst ("Destructive", ARDOUR::TrackMode(Destructive))
+		.endNamespace ()
+		.endNamespace (); // end ARDOUR
+
+	luabridge::getGlobalNamespace (L)
+		.beginNamespace ("ARDOUR")
+		.beginClass <AudioBackendInfo> ("AudioBackendInfo")
+		.addData ("name", &AudioBackendInfo::name)
+		.endClass()
+		.beginStdVector <const AudioBackendInfo*> ("BackendVector").endClass ()
+
+		.beginClass <AudioBackend::DeviceStatus> ("DeviceStatus")
+		.addData ("name", &AudioBackend::DeviceStatus::name)
+		.addData ("available", &AudioBackend::DeviceStatus::available)
+		.endClass()
+		.beginStdVector <AudioBackend::DeviceStatus> ("DeviceStatusVector").endClass ()
+
+		.beginWSPtrClass <AudioBackend> ("AudioBackend")
+		.addFunction ("info", &AudioBackend::info)
+		.addFunction ("sample_rate", &AudioBackend::sample_rate)
+		.addFunction ("buffer_size", &AudioBackend::buffer_size)
+		.addFunction ("period_size", &AudioBackend::period_size)
+		.addFunction ("input_channels", &AudioBackend::input_channels)
+		.addFunction ("output_channels", &AudioBackend::output_channels)
+		.addFunction ("dsp_load", &AudioBackend::dsp_load)
+
+		.addFunction ("set_sample_rate", &AudioBackend::set_sample_rate)
+		.addFunction ("set_buffer_size", &AudioBackend::set_buffer_size)
+		.addFunction ("set_peridod_size", &AudioBackend::set_peridod_size)
+
+		.addFunction ("enumerate_drivers", &AudioBackend::enumerate_drivers)
+		.addFunction ("driver_name", &AudioBackend::driver_name)
+		.addFunction ("set_driver", &AudioBackend::set_driver)
+
+		.addFunction ("use_separate_input_and_output_devices", &AudioBackend::use_separate_input_and_output_devices)
+		.addFunction ("enumerate_devices", &AudioBackend::enumerate_devices)
+		.addFunction ("enumerate_input_devices", &AudioBackend::enumerate_input_devices)
+		.addFunction ("enumerate_output_devices", &AudioBackend::enumerate_output_devices)
+		.addFunction ("device_name", &AudioBackend::device_name)
+		.addFunction ("input_device_name", &AudioBackend::input_device_name)
+		.addFunction ("output_device_name", &AudioBackend::output_device_name)
+		.addFunction ("set_device_name", &AudioBackend::set_device_name)
+		.addFunction ("set_input_device_name", &AudioBackend::set_input_device_name)
+		.addFunction ("set_output_device_name", &AudioBackend::set_output_device_name)
+		.endClass()
+
+		.beginClass <PortEngine> ("PortEngine")
+		.endClass()
+
+		.beginClass <PortManager> ("PortManager")
+		.addFunction ("port_engine", &PortManager::port_engine)
+		.addFunction ("connected", &PortManager::connected)
+		.addFunction ("connect", &PortManager::connect)
+		.addFunction ("physically_connected", &PortManager::physically_connected)
+		.addFunction ("disconnect", (int (PortManager::*)(const std::string&, const std::string&))&PortManager::disconnect)
+		.addFunction ("disconnect_port", (int (PortManager::*)(boost::shared_ptr<Port>))&PortManager::disconnect)
+		.addFunction ("get_port_by_name", &PortManager::get_port_by_name)
+		.addFunction ("get_pretty_name_by_name", &PortManager::get_pretty_name_by_name)
+		.addFunction ("port_is_physical", &PortManager::port_is_physical)
+		.addFunction ("get_physical_outputs", &PortManager::get_physical_outputs)
+		.addFunction ("get_physical_inputs", &PortManager::get_physical_inputs)
+		.addFunction ("n_physical_outputs", &PortManager::n_physical_outputs)
+		.addFunction ("n_physical_inputs", &PortManager::n_physical_inputs)
+		.addRefFunction ("get_connections", &PortManager::get_connections)
+		.addRefFunction ("get_ports", (int (PortManager::*)(DataType, PortManager::PortList&))&PortManager::get_ports)
+		.addRefFunction ("get_backend_ports", (int (PortManager::*)(const std::string&, DataType, PortFlags, std::vector<std::string>&))&PortManager::get_ports)
+		.endClass()
+
+		.deriveClass <AudioEngine, PortManager> ("AudioEngine")
+		.addFunction ("available_backends", &AudioEngine::available_backends)
+		.addFunction ("current_backend_name", &AudioEngine::current_backend_name)
+		.addFunction ("set_backend", &AudioEngine::set_backend)
+		.addFunction ("setup_required", &AudioEngine::setup_required)
+		.addFunction ("start", &AudioEngine::start)
+		.addFunction ("stop", &AudioEngine::stop)
+		.addFunction ("get_dsp_load", &AudioEngine::get_dsp_load)
+		.addFunction ("set_device_name", &AudioEngine::set_device_name)
+		.addFunction ("set_sample_rate", &AudioEngine::set_sample_rate)
+		.addFunction ("set_buffer_size", &AudioEngine::set_buffer_size)
+		.addFunction ("get_last_backend_error", &AudioEngine::get_last_backend_error)
+		.endClass()
+		.endNamespace ();
+
+	// basic representation of Session
+	// functions which can be used from realtime and non-realtime contexts
+	luabridge::getGlobalNamespace (L)
+		.beginNamespace ("ARDOUR")
+		.beginClass <Session> ("Session")
+		.addFunction ("scripts_changed", &Session::scripts_changed) // used internally
+		.addFunction ("transport_rolling", &Session::transport_rolling)
+		.addFunction ("request_transport_speed", &Session::request_transport_speed)
+		.addFunction ("transport_frame", &Session::transport_frame)
+		.addFunction ("transport_speed", &Session::transport_speed)
+		.addFunction ("frame_rate", &Session::frame_rate)
+		.addFunction ("nominal_frame_rate", &Session::nominal_frame_rate)
+		.addFunction ("frames_per_timecode_frame", &Session::frames_per_timecode_frame)
+		.addFunction ("timecode_frames_per_hour", &Session::timecode_frames_per_hour)
+		.addFunction ("timecode_frames_per_second", &Session::timecode_frames_per_second)
+		.addFunction ("timecode_drop_frames", &Session::timecode_drop_frames)
+		.addFunction ("request_locate", &Session::request_locate)
+		.addFunction ("request_stop", &Session::request_stop)
+		.addFunction ("last_transport_start", &Session::last_transport_start)
+		.addFunction ("goto_start", &Session::goto_start)
+		.addFunction ("goto_end", &Session::goto_end)
+		.addFunction ("current_start_frame", &Session::current_start_frame)
+		.addFunction ("current_end_frame", &Session::current_end_frame)
+		.addFunction ("actively_recording", &Session::actively_recording)
+		.addFunction ("new_audio_track", &Session::new_audio_track)
+		.addFunction ("new_audio_route", &Session::new_audio_route)
+		.addFunction ("new_midi_track", &Session::new_midi_track)
+		.addFunction ("new_midi_route", &Session::new_midi_route)
+		.addFunction ("get_routes", &Session::get_routes)
+		.addFunction ("get_tracks", &Session::get_tracks)
+		.addFunction ("name", &Session::name)
+		.addFunction ("path", &Session::path)
+		.addFunction ("record_status", &Session::record_status)
+		.addFunction ("route_by_id", &Session::route_by_id)
+		.addFunction ("route_by_name", &Session::route_by_name)
+		.addFunction ("get_remote_nth_stripable", &Session::get_remote_nth_stripable)
+		.addFunction ("get_remote_nth_route", &Session::get_remote_nth_route)
+		.addFunction ("route_by_selected_count", &Session::route_by_selected_count)
+		.addFunction ("track_by_diskstream_id", &Session::track_by_diskstream_id)
+		.addFunction ("source_by_id", &Session::source_by_id)
+		.addFunction ("controllable_by_id", &Session::controllable_by_id)
+		.addFunction ("processor_by_id", &Session::processor_by_id)
+		.addFunction ("snap_name", &Session::snap_name)
+		.addFunction ("monitor_out", &Session::monitor_out)
+		.addFunction ("master_out", &Session::master_out)
+		.addFunction ("tempo_map", (TempoMap& (Session::*)())&Session::tempo_map)
+		.addFunction ("locations", &Session::locations)
+		.addFunction ("begin_reversible_command", (void (Session::*)(const std::string&))&Session::begin_reversible_command)
+		.addFunction ("commit_reversible_command", &Session::commit_reversible_command)
+		.addFunction ("abort_reversible_command", &Session::abort_reversible_command)
+		.addFunction ("add_command", &Session::add_command)
+		.addFunction ("add_stateful_diff_command", &Session::add_stateful_diff_command)
+		.addFunction ("engine", (AudioEngine& (Session::*)())&Session::engine)
+		.addFunction ("get_block_size", &Session::get_block_size)
+		.addFunction ("worst_output_latency", &Session::worst_output_latency)
+		.addFunction ("worst_input_latency", &Session::worst_input_latency)
+		.addFunction ("worst_track_latency", &Session::worst_track_latency)
+		.addFunction ("worst_playback_latency", &Session::worst_playback_latency)
+		.endClass ()
+
+		.beginClass <RegionFactory> ("RegionFactory")
+		.addStaticFunction ("region_by_id", &RegionFactory::region_by_id)
+		.endClass ()
+
+		/* session enums (rt-safe, common) */
+		.beginNamespace ("Session")
+
+		.beginNamespace ("RecordState")
+		.addConst ("Disabled", ARDOUR::Session::RecordState(Session::Disabled))
+		.addConst ("Enabled", ARDOUR::Session::RecordState(Session::Enabled))
+		.addConst ("Recording", ARDOUR::Session::RecordState(Session::Recording))
+		.endNamespace ()
+
+		.endNamespace () // end Session enums
+
+		/* ardour enums (rt-safe, common) */
+		.beginNamespace ("LocationFlags")
+		.addConst ("IsMark", ARDOUR::Location::Flags(Location::IsMark))
+		.addConst ("IsAutoPunch", ARDOUR::Location::Flags(Location::IsAutoPunch))
+		.addConst ("IsAutoLoop", ARDOUR::Location::Flags(Location::IsAutoLoop))
+		.addConst ("IsHidden", ARDOUR::Location::Flags(Location::IsHidden))
+		.addConst ("IsCDMarker", ARDOUR::Location::Flags(Location::IsCDMarker))
+		.addConst ("IsRangeMarker", ARDOUR::Location::Flags(Location::IsRangeMarker))
+		.addConst ("IsSessionRange", ARDOUR::Location::Flags(Location::IsSessionRange))
+		.addConst ("IsSkip", ARDOUR::Location::Flags(Location::IsSkip))
+		.addConst ("IsSkipping", ARDOUR::Location::Flags(Location::IsSkipping))
+		.endNamespace ()
+
+		.beginNamespace ("LuaAPI")
+		.addFunction ("nil_proc", ARDOUR::LuaAPI::nil_processor)
+		.addFunction ("new_luaproc", ARDOUR::LuaAPI::new_luaproc)
+		.addFunction ("new_plugin_info", ARDOUR::LuaAPI::new_plugin_info)
+		.addFunction ("new_plugin", ARDOUR::LuaAPI::new_plugin)
+		.addFunction ("set_processor_param", ARDOUR::LuaAPI::set_processor_param)
+		.addFunction ("set_plugin_insert_param", ARDOUR::LuaAPI::set_plugin_insert_param)
+		.addCFunction ("plugin_automation", ARDOUR::LuaAPI::plugin_automation)
+		.addCFunction ("hsla_to_rgba", ARDOUR::LuaAPI::hsla_to_rgba)
+		.addFunction ("usleep", Glib::usleep)
+		.endNamespace () // end LuaAPI
+		.endNamespace ();// end ARDOUR
+}
+
+void
+LuaBindings::dsp (lua_State* L)
+{
+	luabridge::getGlobalNamespace (L)
+		.beginNamespace ("ARDOUR")
+
+		.beginClass <AudioBuffer> ("AudioBuffer")
+		.addEqualCheck ()
+		.addFunction ("data", (Sample*(AudioBuffer::*)(framecnt_t))&AudioBuffer::data)
+		.addFunction ("silence", &AudioBuffer::silence)
+		.addFunction ("apply_gain", &AudioBuffer::apply_gain)
+		.addFunction ("check_silence", &AudioBuffer::check_silence)
+		.addFunction ("read_from", (void (AudioBuffer::*)(const Sample*, framecnt_t, framecnt_t, framecnt_t))&AudioBuffer::check_silence)
+		.endClass()
+
+		.beginClass <MidiBuffer> ("MidiBuffer")
+		.addEqualCheck ()
+		.addFunction ("silence", &MidiBuffer::silence)
+		.addFunction ("size", &MidiBuffer::size)
+		.addFunction ("empty", &MidiBuffer::empty)
+		.addFunction ("resize", &MidiBuffer::resize)
+		.addFunction ("copy", (void (MidiBuffer::*)(MidiBuffer const * const))&MidiBuffer::copy)
+		.addFunction ("push_event", (bool (MidiBuffer::*)(const Evoral::MIDIEvent<framepos_t>&))&MidiBuffer::push_back)
+		.addFunction ("push_back", (bool (MidiBuffer::*)(framepos_t, size_t, const uint8_t*))&MidiBuffer::push_back)
+		// TODO iterators..
+		.addExtCFunction ("table", &luabridge::CFunc::listToTable<const Evoral::MIDIEvent<framepos_t>, MidiBuffer>)
+		.endClass()
+
+		.beginClass <BufferSet> ("BufferSet")
+		.addEqualCheck ()
+		.addFunction ("get_audio", static_cast<AudioBuffer&(BufferSet::*)(size_t)>(&BufferSet::get_audio))
+		.addFunction ("get_midi", static_cast<MidiBuffer&(BufferSet::*)(size_t)>(&BufferSet::get_midi))
+		.addFunction ("count", static_cast<const ChanCount&(BufferSet::*)()const>(&BufferSet::count))
+		.endClass()
+		.endNamespace ();
+
+	luabridge::getGlobalNamespace (L)
+		.beginNamespace ("Evoral")
+		.beginClass <Evoral::Event<framepos_t> > ("Event")
+		.addFunction ("clear", &Evoral::Event<framepos_t>::clear)
+		.addFunction ("size", &Evoral::Event<framepos_t>::size)
+		.addFunction ("set_buffer", &Evoral::Event<framepos_t>::set_buffer)
+		.addFunction ("buffer", (uint8_t*(Evoral::Event<framepos_t>::*)())&Evoral::Event<framepos_t>::buffer)
+		.addFunction ("time", (framepos_t (Evoral::Event<framepos_t>::*)())&Evoral::MIDIEvent<framepos_t>::time)
+		.endClass ()
+
+		.beginClass <Evoral::Beats> ("Beats")
+		.addFunction ("to_double", &Evoral::Beats::to_double)
+		.endClass ()
+
+		.deriveClass <Evoral::MIDIEvent<framepos_t>, Evoral::Event<framepos_t> > ("MidiEvent")
+		// add Ctor?
+		.addFunction ("type", &Evoral::MIDIEvent<framepos_t>::type)
+		.addFunction ("channel", &Evoral::MIDIEvent<framepos_t>::channel)
+		.addFunction ("set_type", &Evoral::MIDIEvent<framepos_t>::set_type)
+		.addFunction ("set_channel", &Evoral::MIDIEvent<framepos_t>::set_channel)
+		.endClass ()
+		.endNamespace ();
+
+	// dsp releated session functions
+	luabridge::getGlobalNamespace (L)
+		.beginNamespace ("ARDOUR")
+		.beginClass <Session> ("Session")
+		.addFunction ("get_scratch_buffers", &Session::get_scratch_buffers)
+		.addFunction ("get_silent_buffers", &Session::get_silent_buffers)
+		.endClass ()
+		.endNamespace ();
+
+	luabridge::getGlobalNamespace (L)
+		.beginNamespace ("ARDOUR")
+		.beginNamespace ("DSP")
+		.addFunction ("compute_peak", ARDOUR::compute_peak)
+		.addFunction ("find_peaks", ARDOUR::find_peaks)
+		.addFunction ("apply_gain_to_buffer", ARDOUR::apply_gain_to_buffer)
+		.addFunction ("mix_buffers_no_gain", ARDOUR::mix_buffers_no_gain)
+		.addFunction ("mix_buffers_with_gain", ARDOUR::mix_buffers_with_gain)
+		.addFunction ("copy_vector", ARDOUR::copy_vector)
+		.addFunction ("dB_to_coefficient", &dB_to_coefficient)
+		.addFunction ("fast_coefficient_to_dB", &fast_coefficient_to_dB)
+		.addFunction ("accurate_coefficient_to_dB", &accurate_coefficient_to_dB)
+		.addFunction ("memset", &DSP::memset)
+		.addFunction ("mmult", &DSP::mmult)
+		.addFunction ("log_meter", &DSP::log_meter)
+		.addFunction ("log_meter_coeff", &DSP::log_meter_coeff)
+		.addFunction ("process_map", &DSP::process_map)
+		.addRefFunction ("peaks", &DSP::peaks)
+
+		.beginClass <DSP::LowPass> ("LowPass")
+		.addConstructor <void (*) (double, float)> ()
+		.addFunction ("proc", &DSP::LowPass::proc)
+		.addFunction ("ctrl", &DSP::LowPass::ctrl)
+		.addFunction ("set_cutoff", &DSP::LowPass::set_cutoff)
+		.addFunction ("reset", &DSP::LowPass::reset)
+		.endClass ()
+		.beginClass <DSP::Biquad> ("Biquad")
+		.addConstructor <void (*) (double)> ()
+		.addFunction ("run", &DSP::Biquad::run)
+		.addFunction ("compute", &DSP::Biquad::compute)
+		.addFunction ("configure", &DSP::Biquad::configure)
+		.addFunction ("reset", &DSP::Biquad::reset)
+		.addFunction ("dB_at_freq", &DSP::Biquad::dB_at_freq)
+		.endClass ()
+		.beginClass <DSP::FFTSpectrum> ("FFTSpectrum")
+		.addConstructor <void (*) (uint32_t, double)> ()
+		.addFunction ("set_data_hann", &DSP::FFTSpectrum::set_data_hann)
+		.addFunction ("execute", &DSP::FFTSpectrum::execute)
+		.addFunction ("power_at_bin", &DSP::FFTSpectrum::power_at_bin)
+		.addFunction ("freq_at_bin", &DSP::FFTSpectrum::freq_at_bin)
+		.endClass ()
+
+		/* DSP enums */
+		.beginNamespace ("BiquadType")
+		.addConst ("LowPass", ARDOUR::DSP::Biquad::LowPass)
+		.addConst ("HighPass", ARDOUR::DSP::Biquad::HighPass)
+		.addConst ("BandPassSkirt", ARDOUR::DSP::Biquad::BandPassSkirt)
+		.addConst ("BandPass0dB", ARDOUR::DSP::Biquad::BandPass0dB)
+		.addConst ("Notch", ARDOUR::DSP::Biquad::Notch)
+		.addConst ("AllPass", ARDOUR::DSP::Biquad::AllPass)
+		.addConst ("Peaking", ARDOUR::DSP::Biquad::Peaking)
+		.addConst ("LowShelf", ARDOUR::DSP::Biquad::LowShelf)
+		.addConst ("HighShelf", ARDOUR::DSP::Biquad::HighShelf)
+		.endNamespace ()
+
+		.beginClass <DSP::DspShm> ("DspShm")
+		.addConstructor<void (*) (size_t)> ()
+		.addFunction ("allocate", &DSP::DspShm::allocate)
+		.addFunction ("clear", &DSP::DspShm::clear)
+		.addFunction ("to_float", &DSP::DspShm::to_float)
+		.addFunction ("to_int", &DSP::DspShm::to_int)
+		.addFunction ("atomic_set_int", &DSP::DspShm::atomic_set_int)
+		.addFunction ("atomic_get_int", &DSP::DspShm::atomic_get_int)
+		.endClass ()
+
+		.endNamespace () // DSP
+
+		.beginClass <LuaTableRef> ("LuaTableRef")
+		.addCFunction ("get", &LuaTableRef::get)
+		.addCFunction ("set", &LuaTableRef::set)
+		.endClass ()
+
+		.endNamespace (); // ARDOUR
+}
+
+void
+LuaBindings::session (lua_State* L)
+{
+	// non-realtime session functions
+	luabridge::getGlobalNamespace (L)
+		.beginNamespace ("ARDOUR")
+		.beginClass <Session> ("Session")
+		.addFunction ("save_state", &Session::save_state)
+		.addFunction ("set_dirty", &Session::set_dirty)
+		.addFunction ("unknown_processors", &Session::unknown_processors)
+
+		.addFunction<RouteList (Session::*)(uint32_t, const std::string&, const std::string&, PlaylistDisposition)> ("new_route_from_template", &Session::new_route_from_template)
+		// TODO  session_add_audio_track  session_add_midi_track  session_add_mixed_track
+		//.addFunction ("new_midi_track", &Session::new_midi_track)
+		.endClass ()
+
+		.endNamespace (); // ARDOUR
+}
+
+void
+LuaBindings::osc (lua_State* L)
+{
+	luabridge::getGlobalNamespace (L)
+		.beginNamespace ("ARDOUR")
+		.beginNamespace ("LuaOSC")
+		.beginClass<LuaOSC::Address> ("Address")
+		.addConstructor<void (*) (std::string)> ()
+		.addCFunction ("send", &LuaOSC::Address::send)
+		.endClass ()
+		.endNamespace ()
+		.endNamespace ();
+}
+
+void
+LuaBindings::set_session (lua_State* L, Session *s)
+{
+	/* LuaBridge uses unique keys to identify classes/c-types.
+	 *
+	 * Those keys are "generated" by using the memory-address of a static
+	 * variable, templated for every Class.
+	 * (see libs/lua/LuaBridge/detail/ClassInfo.h)
+	 *
+	 * When linking the final executable there must be exactly one static
+	 * function (static variable) for every templated class.
+	 * This works fine on OSX and Linux...
+	 *
+	 * Windows (mingw and MSVC) however expand the template differently for libardour
+	 * AND gtk2_ardour. We end up with two identical static functions
+	 * at different addresses!!
+	 *
+	 * The Solution: have gtk2_ardour never include LuaBridge headers directly
+	 * and always go via libardour function calls for classes that are registered
+	 * in libardour. (calling lua itself is fine,  calling c-functions in the GUI
+	 * which expand the template is not)
+	 *
+	 * (the actual cause: even static symbols in a .dll have no fixed address
+	 * and are mapped when loading the dll. static functions in .exe do have a fixed
+	 * address)
+	 *
+	 * libardour:
+	 *  0000000000000000 I __imp__ZZN9luabridge9ClassInfoIN6ARDOUR7SessionEE11getClassKeyEvE5value
+	 *  0000000000000000 I __nm__ZZN9luabridge9ClassInfoIN6ARDOUR7SessionEE11getClassKeyEvE5value
+	 *  0000000000000000 T _ZN9luabridge9ClassInfoIN6ARDOUR7SessionEE11getClassKeyEv
+	 *
+	 * ardour.exe
+	 *  000000000104f560 d .data$_ZZN9luabridge9ClassInfoIN6ARDOUR7SessionEE11getClassKeyEvE5value
+	 *  000000000104f560 D _ZZN9luabridge9ClassInfoIN6ARDOUR7SessionEE11getClassKeyEvE5value
+	 *  0000000000e9baf0 T _ZN9luabridge9ClassInfoIN6ARDOUR7SessionEE11getClassKeyEv
+	 *
+	 *
+	 */
+	luabridge::push <Session *> (L, s);
+	lua_setglobal (L, "Session");
+
+	if (s) {
+		// call lua function.
+		luabridge::LuaRef cb_ses = luabridge::getGlobal (L, "new_session");
+		if (cb_ses.type() == LUA_TFUNCTION) { cb_ses(s->name()); } // TODO args
+	}
+}
diff --git a/libs/ardour/luaproc.cc b/libs/ardour/luaproc.cc
new file mode 100644
index 0000000..fbba74b
--- /dev/null
+++ b/libs/ardour/luaproc.cc
@@ -0,0 +1,1251 @@
+/*
+    Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+    Copyright (C) 2006 Paul Davis
+
+    This program is free software; you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by the Free
+    Software Foundation; either version 2 of the License, or (at your option)
+    any later version.
+
+    This program is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc.,
+    675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#include <glib.h>
+#include <glibmm/miscutils.h>
+#include <glibmm/fileutils.h>
+
+#include "pbd/gstdio_compat.h"
+#include "pbd/locale_guard.h"
+#include "pbd/pthread_utils.h"
+
+#include "ardour/audio_buffer.h"
+#include "ardour/buffer_set.h"
+#include "ardour/filesystem_paths.h"
+#include "ardour/luabindings.h"
+#include "ardour/luaproc.h"
+#include "ardour/luascripting.h"
+#include "ardour/midi_buffer.h"
+#include "ardour/plugin.h"
+#include "ardour/session.h"
+
+#include "LuaBridge/LuaBridge.h"
+
+#include "pbd/i18n.h"
+
+using namespace ARDOUR;
+using namespace PBD;
+
+LuaProc::LuaProc (AudioEngine& engine,
+                  Session& session,
+                  const std::string &script)
+	: Plugin (engine, session)
+	, _mempool ("LuaProc", 2097152)
+#ifdef USE_TLSF
+	, lua (lua_newstate (&PBD::TLSF::lalloc, &_mempool))
+#elif defined USE_MALLOC
+	, lua ()
+#else
+	, lua (lua_newstate (&PBD::ReallocPool::lalloc, &_mempool))
+#endif
+	, _lua_dsp (0)
+	, _script (script)
+	, _lua_does_channelmapping (false)
+	, _lua_has_inline_display (false)
+	, _designated_bypass_port (UINT32_MAX)
+	, _control_data (0)
+	, _shadow_data (0)
+	, _has_midi_input (false)
+	, _has_midi_output (false)
+{
+	init ();
+
+	/* when loading a session, or pasing a processor,
+	 * the script is set during set_state();
+	 */
+	if (!_script.empty () && load_script ()) {
+		throw failed_constructor ();
+	}
+}
+
+LuaProc::LuaProc (const LuaProc &other)
+	: Plugin (other)
+	, _mempool ("LuaProc", 2097152)
+#ifdef USE_TLSF
+	, lua (lua_newstate (&PBD::TLSF::lalloc, &_mempool))
+#elif defined USE_MALLOC
+	, lua ()
+#else
+	, lua (lua_newstate (&PBD::ReallocPool::lalloc, &_mempool))
+#endif
+	, _lua_dsp (0)
+	, _script (other.script ())
+	, _lua_does_channelmapping (false)
+	, _lua_has_inline_display (false)
+	, _designated_bypass_port (UINT32_MAX)
+	, _control_data (0)
+	, _shadow_data (0)
+	, _has_midi_input (false)
+	, _has_midi_output (false)
+{
+	init ();
+
+	if (load_script ()) {
+		throw failed_constructor ();
+	}
+
+	for (uint32_t i = 0; i < parameter_count (); ++i) {
+		_control_data[i] = other._shadow_data[i];
+		_shadow_data[i]  = other._shadow_data[i];
+	}
+}
+
+LuaProc::~LuaProc () {
+#ifdef WITH_LUAPROC_STATS
+	if (_info && _stats_cnt > 0) {
+		printf ("LuaProc: '%s' run()  avg: %.3f  max: %.3f [ms]\n",
+				_info->name.c_str (),
+				0.0001f * _stats_avg[0] / (float) _stats_cnt,
+				0.0001f * _stats_max[0]);
+		printf ("LuaProc: '%s' gc()   avg: %.3f  max: %.3f [ms]\n",
+				_info->name.c_str (),
+				0.0001f * _stats_avg[1] / (float) _stats_cnt,
+				0.0001f * _stats_max[1]);
+	}
+#endif
+	lua.do_command ("collectgarbage();");
+	delete (_lua_dsp);
+	delete [] _control_data;
+	delete [] _shadow_data;
+}
+
+void
+LuaProc::init ()
+{
+#ifdef WITH_LUAPROC_STATS
+	_stats_avg[0] = _stats_avg[1] = _stats_max[0] = _stats_max[1] = _stats_cnt = 0;
+#endif
+
+	lua.tweak_rt_gc ();
+	lua.Print.connect (sigc::mem_fun (*this, &LuaProc::lua_print));
+	// register session object
+	lua_State* L = lua.getState ();
+	LuaBindings::stddef (L);
+	LuaBindings::common (L);
+	LuaBindings::dsp (L);
+
+	luabridge::getGlobalNamespace (L)
+		.beginNamespace ("Ardour")
+		.beginClass <LuaProc> ("LuaProc")
+		.addFunction ("queue_draw", &LuaProc::queue_draw)
+		.addFunction ("shmem", &LuaProc::instance_shm)
+		.addFunction ("table", &LuaProc::instance_ref)
+		.endClass ()
+		.endNamespace ();
+
+	// add session to global lua namespace
+	luabridge::push <Session *> (L, &_session);
+	lua_setglobal (L, "Session");
+
+	// instance
+	luabridge::push <LuaProc *> (L, this);
+	lua_setglobal (L, "self");
+
+	// sandbox
+	lua.do_command ("io = nil os = nil loadfile = nil require = nil dofile = nil package = nil debug = nil");
+#if 0
+	lua.do_command ("for n in pairs(_G) do print(n) end print ('----')"); // print global env
+#endif
+	lua.do_command ("function ardour () end");
+}
+
+void
+LuaProc::lua_print (std::string s) {
+	std::cout <<"LuaProc: " << s << "\n";
+	PBD::error << "LuaProc: " << s << "\n";
+}
+
+bool
+LuaProc::load_script ()
+{
+	assert (!_lua_dsp); // don't allow to re-initialize
+	LuaPluginInfoPtr lpi;
+
+	// TODO: refine APIs; function arguments..
+	// - perform channel-map in ardour (silent/scratch buffers) ?
+	// - control-port API (explicit get/set functions ??)
+	// - latency reporting (global var? ctrl-port? set-function ?)
+	// - MIDI -> sparse table of events
+	//     { [sample] => { Event }, .. }
+	//   or  { { sample, Event }, .. }
+
+	try {
+		LuaScriptInfoPtr lsi = LuaScripting::script_info (_script);
+		lpi = LuaPluginInfoPtr (new LuaPluginInfo (lsi));
+		assert (lpi);
+		set_info (lpi);
+		_mempool.set_name ("LuaProc: " + lsi->name);
+		_docs = lsi->description;
+	} catch (failed_constructor& err) {
+		return true;
+	}
+
+	lua_State* L = lua.getState ();
+	lua.do_command (_script);
+
+	// check if script has a DSP callback
+	luabridge::LuaRef lua_dsp_run = luabridge::getGlobal (L, "dsp_run");
+	luabridge::LuaRef lua_dsp_map = luabridge::getGlobal (L, "dsp_runmap");
+
+	if ((lua_dsp_run.type () != LUA_TFUNCTION) == (lua_dsp_map.type () != LUA_TFUNCTION)) {
+		return true;
+	}
+
+	if (lua_dsp_run.type () == LUA_TFUNCTION) {
+		_lua_dsp = new luabridge::LuaRef (lua_dsp_run);
+	}
+	else if (lua_dsp_map.type () == LUA_TFUNCTION) {
+		_lua_dsp = new luabridge::LuaRef (lua_dsp_map);
+		_lua_does_channelmapping = true;
+	}
+	else {
+		assert (0);
+	}
+
+	// initialize the DSP if needed
+	luabridge::LuaRef lua_dsp_init = luabridge::getGlobal (L, "dsp_init");
+	if (lua_dsp_init.type () == LUA_TFUNCTION) {
+		try {
+			lua_dsp_init (_session.nominal_frame_rate ());
+		} catch (luabridge::LuaException const& e) {
+			;
+		}
+	}
+
+	_ctrl_params.clear ();
+
+	luabridge::LuaRef lua_render = luabridge::getGlobal (L, "render_inline");
+	if (lua_render.isFunction ()) {
+		_lua_has_inline_display = true;
+	}
+
+	luabridge::LuaRef lua_params = luabridge::getGlobal (L, "dsp_params");
+	if (lua_params.isFunction ()) {
+
+		// call function // add try {} catch (luabridge::LuaException const& e)
+		luabridge::LuaRef params = lua_params ();
+
+		if (params.isTable ()) {
+
+			for (luabridge::Iterator i (params); !i.isNil (); ++i) {
+				// required fields
+				if (!i.key ().isNumber ())           { return false; }
+				if (!i.value ().isTable ())          { return false; }
+				if (!i.value ()["type"].isString ()) { return false; }
+				if (!i.value ()["name"].isString ()) { return false; }
+				if (!i.value ()["min"].isNumber ())  { return false; }
+				if (!i.value ()["max"].isNumber ())  { return false; }
+
+				int pn = i.key ().cast<int> ();
+				std::string type = i.value ()["type"].cast<std::string> ();
+				if (type == "input") {
+					if (!i.value ()["default"].isNumber ()) { return false; }
+					_ctrl_params.push_back (std::make_pair (false, pn));
+				}
+				else if (type == "output") {
+					_ctrl_params.push_back (std::make_pair (true, pn));
+				} else {
+					return false;
+				}
+				assert (pn == (int) _ctrl_params.size ());
+
+				//_param_desc[pn] = boost::shared_ptr<ParameterDescriptor> (new ParameterDescriptor());
+				luabridge::LuaRef lr = i.value ();
+
+				if (type == "input") {
+					_param_desc[pn].normal     = lr["default"].cast<float> ();
+				} else {
+					_param_desc[pn].normal     = lr["min"].cast<float> (); // output-port, no default
+				}
+				_param_desc[pn].lower        = lr["min"].cast<float> ();
+				_param_desc[pn].upper        = lr["max"].cast<float> ();
+				_param_desc[pn].toggled      = lr["toggled"].isBoolean () && (lr["toggled"]).cast<bool> ();
+				_param_desc[pn].logarithmic  = lr["logarithmic"].isBoolean () && (lr["logarithmic"]).cast<bool> ();
+				_param_desc[pn].integer_step = lr["integer"].isBoolean () && (lr["integer"]).cast<bool> ();
+				_param_desc[pn].sr_dependent = lr["ratemult"].isBoolean () && (lr["ratemult"]).cast<bool> ();
+				_param_desc[pn].enumeration  = lr["enum"].isBoolean () && (lr["enum"]).cast<bool> ();
+
+				if (lr["bypass"].isBoolean () && (lr["bypass"]).cast<bool> ()) {
+					_designated_bypass_port = pn - 1; // lua table starts at 1.
+				}
+
+				if (lr["unit"].isString ()) {
+					std::string unit = lr["unit"].cast<std::string> ();
+					if (unit == "dB")             { _param_desc[pn].unit = ParameterDescriptor::DB; }
+					else if (unit == "Hz")        { _param_desc[pn].unit = ParameterDescriptor::HZ; }
+					else if (unit == "Midi Note") { _param_desc[pn].unit = ParameterDescriptor::MIDI_NOTE; }
+				}
+				_param_desc[pn].label        = (lr["name"]).cast<std::string> ();
+				_param_desc[pn].scale_points = parse_scale_points (&lr);
+
+				luabridge::LuaRef doc = lr["doc"];
+				if (doc.isString ()) {
+					_param_doc[pn] = doc.cast<std::string> ();
+				} else {
+					_param_doc[pn] = "";
+				}
+				assert (!(_param_desc[pn].toggled && _param_desc[pn].logarithmic));
+			}
+		}
+	}
+
+	_control_data = new float[parameter_count ()];
+	_shadow_data  = new float[parameter_count ()];
+
+	for (uint32_t i = 0; i < parameter_count (); ++i) {
+		if (parameter_is_input (i)) {
+			_control_data[i] = _shadow_data[i] = default_value (i);
+		}
+	}
+
+	// expose ctrl-ports to global lua namespace
+	luabridge::push <float *> (L, _control_data);
+	lua_setglobal (L, "CtrlPorts");
+
+	return false; // no error
+}
+
+bool
+LuaProc::can_support_io_configuration (const ChanCount& in, ChanCount& out, ChanCount* imprecise)
+{
+	// caller must hold process lock (no concurrent calls to interpreter
+	_output_configs.clear ();
+
+	lua_State* L = lua.getState ();
+	luabridge::LuaRef ioconfig = luabridge::getGlobal (L, "dsp_ioconfig");
+
+	luabridge::LuaRef *_iotable = NULL; // can't use reference :(
+
+	if (ioconfig.isFunction ()) {
+		try {
+			luabridge::LuaRef iotable = ioconfig ();
+			if (iotable.isTable ()) {
+				_iotable = new luabridge::LuaRef (iotable);
+			}
+		} catch (luabridge::LuaException const& e) {
+			_iotable = NULL;
+		}
+	}
+
+	if (!_iotable) {
+		/* empty table as default */
+		luabridge::LuaRef iotable = luabridge::newTable(L);
+		_iotable = new luabridge::LuaRef (iotable);
+	}
+
+	// now we can reference it.
+	luabridge::LuaRef iotable (*_iotable);
+	delete _iotable;
+
+	if ((iotable).length () < 1) {
+		/* empty table as only config, to get default values */
+		luabridge::LuaRef ioconf = luabridge::newTable(L);
+		iotable[1] = ioconf;
+	}
+
+	const int audio_in = in.n_audio ();
+	const int midi_in = in.n_midi ();
+
+	// preferred setting (provided by plugin_insert)
+	const int preferred_out = out.n_audio ();
+	const int preferred_midiout = out.n_midi ();
+
+	int midi_out = -1;
+	int audio_out = -1;
+	float penalty = 9999;
+	bool found = false;
+
+#define FOUNDCFG_PENALTY(in, out, p) {                              \
+  _output_configs.insert (out);                                     \
+  if (p < penalty) {                                                \
+    audio_out = (out);                                              \
+    midi_out = possible_midiout;                                    \
+    if (imprecise) {                                                \
+      imprecise->set (DataType::AUDIO, (in));                       \
+      imprecise->set (DataType::MIDI, possible_midiin);             \
+    }                                                               \
+    _has_midi_input = (possible_midiin > 0);                        \
+    _has_midi_output = (possible_midiout > 0);                      \
+    penalty = p;                                                    \
+    found = true;                                                   \
+  }                                                                 \
+}
+
+#define FOUNDCFG_IMPRECISE(in, out) {                               \
+  const float p = fabsf ((float)(out) - preferred_out) *            \
+                      (((out) > preferred_out) ? 1.1 : 1)           \
+                + fabsf ((float)possible_midiout - preferred_midiout) *    \
+                      ((possible_midiout - preferred_midiout) ? 0.6 : 0.5) \
+                + fabsf ((float)(in) - audio_in) *                  \
+                      (((in) > audio_in) ? 275 : 250)               \
+                + fabsf ((float)possible_midiin - midi_in) *        \
+                      ((possible_midiin - midi_in) ? 100 : 110);    \
+  FOUNDCFG_PENALTY(in, out, p);                                     \
+}
+
+#define FOUNDCFG(out)                                               \
+  FOUNDCFG_IMPRECISE(audio_in, out)
+
+#define ANYTHINGGOES                                                \
+  _output_configs.insert (0);
+
+#define UPTO(nch) {                                                 \
+  for (int n = 1; n < nch; ++n) {                                   \
+    _output_configs.insert (n);                                     \
+  }                                                                 \
+}
+
+	if (imprecise) {
+		*imprecise = in;
+	}
+
+	for (luabridge::Iterator i (iotable); !i.isNil (); ++i) {
+		luabridge::LuaRef io (i.value ());
+		if (!io.isTable()) {
+			continue;
+		}
+
+		int possible_in = io["audio_in"].isNumber() ? io["audio_in"] : -1;
+		int possible_out = io["audio_out"].isNumber() ? io["audio_out"] : -1;
+		int possible_midiin = io["midi_in"].isNumber() ? io["midi_in"] : 0;
+		int possible_midiout = io["midi_out"].isNumber() ? io["midi_out"] : 0;
+
+		if (midi_in != possible_midiin && !imprecise) {
+			continue;
+		}
+
+		// exact match
+		if ((possible_in == audio_in) && (possible_out == preferred_out)) {
+			/* Set penalty so low that this output configuration
+			 * will trump any other one */
+			FOUNDCFG_PENALTY(audio_in, preferred_out, -1);
+		}
+
+		if (possible_out == 0 && possible_midiout == 0) {
+			/* skip configurations with no output at all */
+			continue;
+		}
+
+		if (possible_in == -1 || possible_in == -2) {
+			/* wildcard for input */
+			if (possible_out == possible_in) {
+				/* either both -1 or both -2 (invalid and
+				 * interpreted as both -1): out must match in */
+				FOUNDCFG (audio_in);
+			} else if (possible_out == -3 - possible_in) {
+				/* one is -1, the other is -2: any output configuration
+				 * possible, pick what the insert prefers */
+				FOUNDCFG (preferred_out);
+				ANYTHINGGOES;
+			} else if (possible_out < -2) {
+				/* variable number of outputs up to -N,
+				 * invalid if in == -2 but we accept it anyway */
+				FOUNDCFG (min (-possible_out, preferred_out));
+				UPTO (-possible_out)
+			} else {
+				/* exact number of outputs */
+				FOUNDCFG (possible_out);
+			}
+		}
+
+		if (possible_in < -2 || possible_in >= 0) {
+			/* specified number, exact or up to */
+			int desired_in;
+			if (possible_in >= 0) {
+				/* configuration can only match possible_in */
+				desired_in = possible_in;
+			} else {
+				/* configuration can match up to -possible_in */
+				desired_in = min (-possible_in, audio_in);
+			}
+			if (!imprecise && audio_in != desired_in) {
+				/* skip that configuration, it cannot match
+				 * the required audio input count, and we
+				 * cannot ask for change via \imprecise */
+			} else if (possible_out == -1 || possible_out == -2) {
+				/* any output configuration possible
+				 * out == -2 is invalid, interpreted as out == -1.
+				 * Really imprecise only if desired_in != audio_in */
+				FOUNDCFG_IMPRECISE (desired_in, preferred_out);
+				ANYTHINGGOES;
+			} else if (possible_out < -2) {
+				/* variable number of outputs up to -N
+				 * not specified if in > 0, but we accept it anyway.
+				 * Really imprecise only if desired_in != audio_in */
+				FOUNDCFG_IMPRECISE (desired_in, min (-possible_out, preferred_out));
+				UPTO (-possible_out)
+			} else {
+				/* exact number of outputs
+				 * Really imprecise only if desired_in != audio_in */
+				FOUNDCFG_IMPRECISE (desired_in, possible_out);
+			}
+		}
+
+	}
+
+	if (!found) {
+		return false;
+	}
+
+	if (imprecise) {
+		_selected_in = *imprecise;
+	} else {
+		_selected_in = in;
+	}
+
+	out.set (DataType::MIDI, midi_out);
+	out.set (DataType::AUDIO, audio_out);
+	_selected_out = out;
+
+	return true;
+}
+
+bool
+LuaProc::configure_io (ChanCount in, ChanCount out)
+{
+	in.set (DataType::MIDI, _has_midi_input ? 1 : 0);
+	out.set (DataType::MIDI, _has_midi_output ? 1 : 0);
+
+	_info->n_inputs = _selected_in;
+	_info->n_outputs = _selected_out;
+
+	// configure the DSP if needed
+	if (in != _configured_in || out != _configured_out) {
+		lua_State* L = lua.getState ();
+		luabridge::LuaRef lua_dsp_configure = luabridge::getGlobal (L, "dsp_configure");
+		if (lua_dsp_configure.type () == LUA_TFUNCTION) {
+			try {
+				luabridge::LuaRef io = lua_dsp_configure (&in, &out);
+				if (io.isTable ()) {
+					ChanCount lin (_selected_in);
+					ChanCount lout (_selected_out);
+
+					if (io["audio_in"].type() == LUA_TNUMBER) {
+						const int c = io["audio_in"].cast<int> ();
+						if (c >= 0) {
+							lin.set (DataType::AUDIO, c);
+						}
+					}
+					if (io["audio_out"].type() == LUA_TNUMBER) {
+						const int c = io["audio_out"].cast<int> ();
+						if (c >= 0) {
+							lout.set (DataType::AUDIO, c);
+						}
+					}
+					if (io["midi_in"].type() == LUA_TNUMBER) {
+						const int c = io["midi_in"].cast<int> ();
+						if (c >= 0) {
+							lin.set (DataType::MIDI, c);
+						}
+					}
+					if (io["midi_out"].type() == LUA_TNUMBER) {
+						const int c = io["midi_out"].cast<int> ();
+						if (c >= 0) {
+							lout.set (DataType::MIDI, c);
+						}
+					}
+					_info->n_inputs = lin;
+					_info->n_outputs = lout;
+				}
+			} catch (luabridge::LuaException const& e) {
+				PBD::error << "LuaException: " << e.what () << "\n";
+#ifndef NDEBUG
+				std::cerr << "LuaException: " << e.what () << "\n";
+#endif
+				return false;
+			}
+		}
+	}
+
+	_configured_in = in;
+	_configured_out = out;
+
+	return true;
+}
+
+int
+LuaProc::connect_and_run (BufferSet& bufs,
+		framepos_t start, framepos_t end, double speed,
+		ChanMapping in, ChanMapping out,
+		pframes_t nframes, framecnt_t offset)
+{
+	if (!_lua_dsp) {
+		return 0;
+	}
+
+	Plugin::connect_and_run (bufs, start, end, speed, in, out, nframes, offset);
+
+	// This is needed for ARDOUR::Session requests :(
+	if (! SessionEvent::has_per_thread_pool ()) {
+		char name[64];
+		snprintf (name, 64, "Proc-%p", this);
+		pthread_set_name (name);
+		SessionEvent::create_per_thread_pool (name, 64);
+		PBD::notify_event_loops_about_thread_creation (pthread_self(), name, 64);
+	}
+
+	uint32_t const n = parameter_count ();
+	for (uint32_t i = 0; i < n; ++i) {
+		if (parameter_is_control (i) && parameter_is_input (i)) {
+			_control_data[i] = _shadow_data[i];
+		}
+	}
+
+#ifdef WITH_LUAPROC_STATS
+	int64_t t0 = g_get_monotonic_time ();
+#endif
+
+	try {
+		if (_lua_does_channelmapping) {
+			// run the DSP function
+			(*_lua_dsp)(&bufs, in, out, nframes, offset);
+		} else {
+			// map buffers
+			BufferSet& silent_bufs  = _session.get_silent_buffers (ChanCount (DataType::AUDIO, 1));
+			BufferSet& scratch_bufs = _session.get_scratch_buffers (ChanCount (DataType::AUDIO, 1));
+
+			lua_State* L = lua.getState ();
+			luabridge::LuaRef in_map (luabridge::newTable (L));
+			luabridge::LuaRef out_map (luabridge::newTable (L));
+
+			const uint32_t audio_in = _configured_in.n_audio ();
+			const uint32_t audio_out = _configured_out.n_audio ();
+			const uint32_t midi_in = _configured_in.n_midi ();
+
+			for (uint32_t ap = 0; ap < audio_in; ++ap) {
+				bool valid;
+				const uint32_t buf_index = in.get(DataType::AUDIO, ap, &valid);
+				if (valid) {
+					in_map[ap + 1] = bufs.get_audio (buf_index).data (offset);
+				} else {
+					in_map[ap + 1] = silent_bufs.get_audio (0).data (offset);
+				}
+			}
+			for (uint32_t ap = 0; ap < audio_out; ++ap) {
+				bool valid;
+				const uint32_t buf_index = out.get(DataType::AUDIO, ap, &valid);
+				if (valid) {
+					out_map[ap + 1] = bufs.get_audio (buf_index).data (offset);
+				} else {
+					out_map[ap + 1] = scratch_bufs.get_audio (0).data (offset);
+				}
+			}
+
+			luabridge::LuaRef lua_midi_src_tbl (luabridge::newTable (L));
+			int e = 1; // > 1 port, we merge events (unsorted)
+			for (uint32_t mp = 0; mp < midi_in; ++mp) {
+				bool valid;
+				const uint32_t idx = in.get(DataType::MIDI, mp, &valid);
+				if (valid) {
+					for (MidiBuffer::iterator m = bufs.get_midi(idx).begin();
+							m != bufs.get_midi(idx).end(); ++m, ++e) {
+						const Evoral::MIDIEvent<framepos_t> ev(*m, false);
+						luabridge::LuaRef lua_midi_data (luabridge::newTable (L));
+						const uint8_t* data = ev.buffer();
+						for (uint32_t i = 0; i < ev.size(); ++i) {
+							lua_midi_data [i + 1] = data[i];
+						}
+						luabridge::LuaRef lua_midi_event (luabridge::newTable (L));
+						lua_midi_event["time"] = 1 + (*m).time();
+						lua_midi_event["data"] = lua_midi_data;
+						lua_midi_src_tbl[e] = lua_midi_event;
+					}
+				}
+			}
+
+			if (_has_midi_input) {
+				// XXX TODO This needs a better solution than global namespace
+				luabridge::push (L, lua_midi_src_tbl);
+				lua_setglobal (L, "midiin");
+			}
+
+			luabridge::LuaRef lua_midi_sink_tbl (luabridge::newTable (L));
+			if (_has_midi_output) {
+				luabridge::push (L, lua_midi_sink_tbl);
+				lua_setglobal (L, "midiout");
+			}
+
+			// run the DSP function
+			(*_lua_dsp)(in_map, out_map, nframes);
+
+			// copy back midi events
+			if (_has_midi_output && lua_midi_sink_tbl.isTable ()) {
+				bool valid;
+				const uint32_t idx = out.get(DataType::MIDI, 0, &valid);
+				if (valid && bufs.count().n_midi() > idx) {
+					MidiBuffer& mbuf = bufs.get_midi(idx);
+					mbuf.silence(0, 0);
+					for (luabridge::Iterator i (lua_midi_sink_tbl); !i.isNil (); ++i) {
+						if (!i.key ().isNumber ()) { continue; }
+						if (!i.value ()["time"].isNumber ()) { continue; }
+						if (!i.value ()["data"].isTable ()) { continue; }
+						luabridge::LuaRef data_tbl (i.value ()["data"]);
+						framepos_t tme = i.value ()["time"];
+						if (tme < 1 || tme > nframes) { continue; }
+						uint8_t data[64];
+						size_t size = 0;
+						for (luabridge::Iterator di (data_tbl); !di.isNil () && size < sizeof(data); ++di, ++size) {
+							data[size] = di.value ();
+						}
+						if (size > 0 && size < 64) {
+							mbuf.push_back(tme - 1, size, data);
+						}
+					}
+
+				}
+			}
+		}
+	} catch (luabridge::LuaException const& e) {
+		PBD::error << "LuaException: " << e.what () << "\n";
+#ifndef NDEBUG
+		std::cerr << "LuaException: " << e.what () << "\n";
+#endif
+		return -1;
+	}
+#ifdef WITH_LUAPROC_STATS
+	int64_t t1 = g_get_monotonic_time ();
+#endif
+
+	lua.collect_garbage_step ();
+#ifdef WITH_LUAPROC_STATS
+	++_stats_cnt;
+	int64_t t2 = g_get_monotonic_time ();
+	int64_t ela0 = t1 - t0;
+	int64_t ela1 = t2 - t1;
+	if (ela0 > _stats_max[0]) _stats_max[0] = ela0;
+	if (ela1 > _stats_max[1]) _stats_max[1] = ela1;
+	_stats_avg[0] += ela0;
+	_stats_avg[1] += ela1;
+#endif
+	return 0;
+}
+
+
+void
+LuaProc::add_state (XMLNode* root) const
+{
+	XMLNode*    child;
+	char        buf[32];
+	LocaleGuard lg;
+
+	gchar* b64 = g_base64_encode ((const guchar*)_script.c_str (), _script.size ());
+	std::string b64s (b64);
+	g_free (b64);
+	XMLNode* script_node = new XMLNode (X_("script"));
+	script_node->add_property (X_("lua"), LUA_VERSION);
+	script_node->add_content (b64s);
+	root->add_child_nocopy (*script_node);
+
+	for (uint32_t i = 0; i < parameter_count(); ++i) {
+		if (parameter_is_input(i) && parameter_is_control(i)) {
+			child = new XMLNode("Port");
+			snprintf(buf, sizeof(buf), "%u", i);
+			child->add_property("id", std::string(buf));
+			snprintf(buf, sizeof(buf), "%+f", _shadow_data[i]);
+			child->add_property("value", std::string(buf));
+			root->add_child_nocopy(*child);
+		}
+	}
+}
+
+int
+LuaProc::set_script_from_state (const XMLNode& node)
+{
+	XMLNode* child;
+	if (node.name () != state_node_name ()) {
+		return -1;
+	}
+
+	if ((child = node.child (X_("script"))) != 0) {
+		for (XMLNodeList::const_iterator n = child->children ().begin (); n != child->children ().end (); ++n) {
+			if (!(*n)->is_content ()) { continue; }
+			gsize size;
+			guchar* buf = g_base64_decode ((*n)->content ().c_str (), &size);
+			_script = std::string ((const char*)buf, size);
+			g_free (buf);
+			if (load_script ()) {
+				PBD::error << _("Failed to load Lua script from session state.") << endmsg;
+#ifndef NDEBUG
+				std::cerr << "Failed Lua Script: " << _script << std::endl;
+#endif
+				_script = "";
+			}
+			break;
+		}
+	}
+	if (_script.empty ()) {
+		PBD::error << _("Session State for LuaProcessor did not include a Lua script.") << endmsg;
+		return -1;
+	}
+	if (!_lua_dsp) {
+		PBD::error << _("Invalid/incompatible Lua script found for LuaProcessor.") << endmsg;
+		return -1;
+	}
+	return 0;
+}
+
+int
+LuaProc::set_state (const XMLNode& node, int version)
+{
+#ifndef NO_PLUGIN_STATE
+	XMLNodeList nodes;
+	XMLProperty const * prop;
+	XMLNodeConstIterator iter;
+	XMLNode *child;
+	const char *value;
+	const char *port;
+	uint32_t port_id;
+#endif
+	LocaleGuard lg;
+
+	if (_script.empty ()) {
+		if (set_script_from_state (node)) {
+			return -1;
+		}
+	}
+
+#ifndef NO_PLUGIN_STATE
+	if (node.name() != state_node_name()) {
+		error << _("Bad node sent to LuaProc::set_state") << endmsg;
+		return -1;
+	}
+
+	nodes = node.children ("Port");
+	for (iter = nodes.begin(); iter != nodes.end(); ++iter) {
+		child = *iter;
+		if ((prop = child->property("id")) != 0) {
+			port = prop->value().c_str();
+		} else {
+			warning << _("LuaProc: port has no symbol, ignored") << endmsg;
+			continue;
+		}
+		if ((prop = child->property("value")) != 0) {
+			value = prop->value().c_str();
+		} else {
+			warning << _("LuaProc: port has no value, ignored") << endmsg;
+			continue;
+		}
+		sscanf (port, "%" PRIu32, &port_id);
+		set_parameter (port_id, atof(value));
+	}
+#endif
+
+	return Plugin::set_state (node, version);
+}
+
+uint32_t
+LuaProc::parameter_count () const
+{
+	return _ctrl_params.size ();
+}
+
+float
+LuaProc::default_value (uint32_t port)
+{
+	if (_ctrl_params[port].first) {
+		assert (0);
+		return 0;
+	}
+	int lp = _ctrl_params[port].second;
+	return _param_desc[lp].normal;
+}
+
+void
+LuaProc::set_parameter (uint32_t port, float val)
+{
+	assert (port < parameter_count ());
+	if (get_parameter (port) == val) {
+		return;
+	}
+	_shadow_data[port] = val;
+	Plugin::set_parameter (port, val);
+}
+
+float
+LuaProc::get_parameter (uint32_t port) const
+{
+	if (parameter_is_input (port)) {
+		return _shadow_data[port];
+	} else {
+		return _control_data[port];
+	}
+}
+
+int
+LuaProc::get_parameter_descriptor (uint32_t port, ParameterDescriptor& desc) const
+{
+	assert (port <= parameter_count ());
+	int lp = _ctrl_params[port].second;
+	const ParameterDescriptor& d (_param_desc.find(lp)->second);
+
+	desc.lower        = d.lower;
+	desc.upper        = d.upper;
+	desc.normal       = d.normal;
+	desc.toggled      = d.toggled;
+	desc.logarithmic  = d.logarithmic;
+	desc.integer_step = d.integer_step;
+	desc.sr_dependent = d.sr_dependent;
+	desc.enumeration  = d.enumeration;
+	desc.unit         = d.unit;
+	desc.label        = d.label;
+	desc.scale_points = d.scale_points;
+
+	desc.update_steps ();
+	return 0;
+}
+
+std::string
+LuaProc::get_parameter_docs (uint32_t port) const {
+	assert (port <= parameter_count ());
+	int lp = _ctrl_params[port].second;
+	return _param_doc.find(lp)->second;
+}
+
+uint32_t
+LuaProc::nth_parameter (uint32_t port, bool& ok) const
+{
+	if (port < _ctrl_params.size ()) {
+		ok = true;
+		return port;
+	}
+	ok = false;
+	return 0;
+}
+
+bool
+LuaProc::parameter_is_input (uint32_t port) const
+{
+	assert (port < _ctrl_params.size ());
+	return (!_ctrl_params[port].first);
+}
+
+bool
+LuaProc::parameter_is_output (uint32_t port) const
+{
+	assert (port < _ctrl_params.size ());
+	return (_ctrl_params[port].first);
+}
+
+std::set<Evoral::Parameter>
+LuaProc::automatable () const
+{
+	std::set<Evoral::Parameter> automatables;
+	for (uint32_t i = 0; i < _ctrl_params.size (); ++i) {
+		if (parameter_is_input (i)) {
+			automatables.insert (automatables.end (), Evoral::Parameter (PluginAutomation, 0, i));
+		}
+	}
+	return automatables;
+}
+
+std::string
+LuaProc::describe_parameter (Evoral::Parameter param)
+{
+	if (param.type () == PluginAutomation && param.id () < parameter_count ()) {
+		int lp = _ctrl_params[param.id ()].second;
+		return _param_desc[lp].label;
+	}
+	return "??";
+}
+
+void
+LuaProc::print_parameter (uint32_t param, char* buf, uint32_t len) const
+{
+	if (buf && len) {
+		if (param < parameter_count ()) {
+			snprintf (buf, len, "%.3f", get_parameter (param));
+		} else {
+			strcat (buf, "0");
+		}
+	}
+}
+
+boost::shared_ptr<ScalePoints>
+LuaProc::parse_scale_points (luabridge::LuaRef* lr)
+{
+	if (!(*lr)["scalepoints"].isTable()) {
+		return boost::shared_ptr<ScalePoints> ();
+	}
+
+	int cnt = 0;
+	boost::shared_ptr<ScalePoints> rv = boost::shared_ptr<ScalePoints>(new ScalePoints());
+	luabridge::LuaRef scalepoints ((*lr)["scalepoints"]);
+
+	for (luabridge::Iterator i (scalepoints); !i.isNil (); ++i) {
+		if (!i.key ().isString ())    { continue; }
+		if (!i.value ().isNumber ())  { continue; }
+		rv->insert(make_pair(i.key ().cast<std::string> (),
+					i.value ().cast<float> ()));
+		++cnt;
+	}
+
+	if (rv->size() > 0) {
+		return rv;
+	}
+	return boost::shared_ptr<ScalePoints> ();
+}
+
+boost::shared_ptr<ScalePoints>
+LuaProc::get_scale_points (uint32_t port) const
+{
+	int lp = _ctrl_params[port].second;
+	return _param_desc.find(lp)->second.scale_points;
+}
+
+void
+LuaProc::setup_lua_inline_gui (LuaState *lua_gui)
+{
+	lua_State* LG = lua_gui->getState ();
+	LuaBindings::stddef (LG);
+	LuaBindings::common (LG);
+	LuaBindings::dsp (LG);
+
+	lua_gui->Print.connect (sigc::mem_fun (*this, &LuaProc::lua_print));
+	lua_gui->do_command ("function ardour () end");
+	lua_gui->do_command (_script);
+
+	// TODO think: use a weak-pointer here ?
+	// (the GUI itself uses a shared ptr to this plugin, so we should be good)
+	luabridge::getGlobalNamespace (LG)
+		.beginNamespace ("Ardour")
+		.beginClass <LuaProc> ("LuaProc")
+		.addFunction ("shmem", &LuaProc::instance_shm)
+		.addFunction ("table", &LuaProc::instance_ref)
+		.endClass ()
+		.endNamespace ();
+
+	luabridge::push <LuaProc *> (LG, this);
+	lua_setglobal (LG, "self");
+
+	luabridge::push <float *> (LG, _shadow_data);
+	lua_setglobal (LG, "CtrlPorts");
+}
+////////////////////////////////////////////////////////////////////////////////
+
+#include "ardour/search_paths.h"
+#include "sha1.c"
+
+std::string
+LuaProc::preset_name_to_uri (const std::string& name) const
+{
+	std::string uri ("urn:lua:");
+	char hash[41];
+	Sha1Digest s;
+	sha1_init (&s);
+	sha1_write (&s, (const uint8_t *) name.c_str(), name.size ());
+	sha1_write (&s, (const uint8_t *) _script.c_str(), _script.size ());
+	sha1_result_hash (&s, hash);
+	return uri + hash;
+}
+
+std::string
+LuaProc::presets_file () const
+{
+	return string_compose ("lua-%1", _info->unique_id);
+}
+
+XMLTree*
+LuaProc::presets_tree () const
+{
+	XMLTree* t = new XMLTree;
+	std::string p = Glib::build_filename (ARDOUR::user_config_directory (), "presets");
+
+	if (!Glib::file_test (p, Glib::FILE_TEST_IS_DIR)) {
+		if (g_mkdir_with_parents (p.c_str(), 0755) != 0) {
+			error << _("Unable to create LuaProc presets directory") << endmsg;
+		};
+	}
+
+	p = Glib::build_filename (p, presets_file ());
+
+	if (!Glib::file_test (p, Glib::FILE_TEST_EXISTS)) {
+		t->set_root (new XMLNode (X_("LuaPresets")));
+		return t;
+	}
+
+	t->set_filename (p);
+	if (!t->read ()) {
+		delete t;
+		return 0;
+	}
+	return t;
+}
+
+bool
+LuaProc::load_preset (PresetRecord r)
+{
+	boost::shared_ptr<XMLTree> t (presets_tree ());
+	if (t == 0) {
+		return false;
+	}
+
+	XMLNode* root = t->root ();
+	for (XMLNodeList::const_iterator i = root->children().begin(); i != root->children().end(); ++i) {
+		XMLProperty const * label = (*i)->property (X_("label"));
+		assert (label);
+		if (label->value() != r.label) {
+			continue;
+		}
+
+		for (XMLNodeList::const_iterator j = (*i)->children().begin(); j != (*i)->children().end(); ++j) {
+			if ((*j)->name() == X_("Parameter")) {
+				XMLProperty const * index = (*j)->property (X_("index"));
+				XMLProperty const * value = (*j)->property (X_("value"));
+				assert (index);
+				assert (value);
+				LocaleGuard lg;
+				set_parameter (atoi (index->value().c_str()), atof (value->value().c_str ()));
+			}
+		}
+		return Plugin::load_preset(r);
+	}
+	return false;
+}
+
+std::string
+LuaProc::do_save_preset (std::string name) {
+
+	boost::shared_ptr<XMLTree> t (presets_tree ());
+	if (t == 0) {
+		return "";
+	}
+
+	std::string uri (preset_name_to_uri (name));
+
+	XMLNode* p = new XMLNode (X_("Preset"));
+	p->add_property (X_("uri"), uri);
+	p->add_property (X_("label"), name);
+
+	for (uint32_t i = 0; i < parameter_count(); ++i) {
+		if (parameter_is_input (i)) {
+			XMLNode* c = new XMLNode (X_("Parameter"));
+			c->add_property (X_("index"), string_compose ("%1", i));
+			c->add_property (X_("value"), string_compose ("%1", get_parameter (i)));
+			p->add_child_nocopy (*c);
+		}
+	}
+	t->root()->add_child_nocopy (*p);
+
+	std::string f = Glib::build_filename (ARDOUR::user_config_directory (), "presets");
+	f = Glib::build_filename (f, presets_file ());
+
+	t->write (f);
+	return uri;
+}
+
+void
+LuaProc::do_remove_preset (std::string name)
+{
+	boost::shared_ptr<XMLTree> t (presets_tree ());
+	if (t == 0) {
+		return;
+	}
+	t->root()->remove_nodes_and_delete (X_("label"), name);
+	std::string f = Glib::build_filename (ARDOUR::user_config_directory (), "presets");
+	f = Glib::build_filename (f, presets_file ());
+	t->write (f);
+}
+
+void
+LuaProc::find_presets ()
+{
+	boost::shared_ptr<XMLTree> t (presets_tree ());
+	if (t) {
+		XMLNode* root = t->root ();
+		for (XMLNodeList::const_iterator i = root->children().begin(); i != root->children().end(); ++i) {
+
+			XMLProperty const * uri = (*i)->property (X_("uri"));
+			XMLProperty const * label = (*i)->property (X_("label"));
+
+			assert (uri);
+			assert (label);
+
+			PresetRecord r (uri->value(), label->value(), true);
+			_presets.insert (make_pair (r.uri, r));
+		}
+	}
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+LuaPluginInfo::LuaPluginInfo (LuaScriptInfoPtr lsi) {
+	if (lsi->type != LuaScriptInfo::DSP) {
+		throw failed_constructor ();
+	}
+
+	path = lsi->path;
+	name = lsi->name;
+	creator = lsi->author;
+	category = lsi->category;
+	unique_id = lsi->unique_id;
+
+	n_inputs.set (DataType::AUDIO, 1);
+	n_outputs.set (DataType::AUDIO, 1);
+	type = Lua;
+
+	_is_instrument = category == "Instrument";
+}
+
+PluginPtr
+LuaPluginInfo::load (Session& session)
+{
+	std::string script = "";
+	if (!Glib::file_test (path, Glib::FILE_TEST_EXISTS)) {
+		return PluginPtr ();
+	}
+
+	try {
+		script = Glib::file_get_contents (path);
+	} catch (Glib::FileError err) {
+		return PluginPtr ();
+	}
+
+	if (script.empty ()) {
+		return PluginPtr ();
+	}
+
+	try {
+		PluginPtr plugin (new LuaProc (session.engine (), session, script));
+		return plugin;
+	} catch (failed_constructor& err) {
+		;
+	}
+	return PluginPtr ();
+}
+
+std::vector<Plugin::PresetRecord>
+LuaPluginInfo::get_presets (bool /*user_only*/) const
+{
+	std::vector<Plugin::PresetRecord> p;
+	XMLTree* t = new XMLTree;
+	std::string pf = Glib::build_filename (ARDOUR::user_config_directory (), "presets", string_compose ("lua-%1", unique_id));
+	if (Glib::file_test (pf, Glib::FILE_TEST_EXISTS)) {
+		t->set_filename (pf);
+		if (t->read ()) {
+			XMLNode* root = t->root ();
+			for (XMLNodeList::const_iterator i = root->children().begin(); i != root->children().end(); ++i) {
+				XMLProperty const * uri = (*i)->property (X_("uri"));
+				XMLProperty const * label = (*i)->property (X_("label"));
+				p.push_back (Plugin::PresetRecord (uri->value(), label->value(), true));
+			}
+		}
+	}
+	delete t;
+	return p;
+}
diff --git a/libs/ardour/luascripting.cc b/libs/ardour/luascripting.cc
new file mode 100644
index 0000000..815711f
--- /dev/null
+++ b/libs/ardour/luascripting.cc
@@ -0,0 +1,487 @@
+/*
+ * Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ *
+ */
+#include <cstring>
+#include <glibmm.h>
+
+#include "pbd/error.h"
+#include "pbd/file_utils.h"
+#include "pbd/compose.h"
+
+#include "ardour/directory_names.h"
+#include "ardour/filesystem_paths.h"
+#include "ardour/luascripting.h"
+#include "ardour/lua_script_params.h"
+#include "ardour/search_paths.h"
+
+#include "lua/luastate.h"
+#include "LuaBridge/LuaBridge.h"
+
+#include "pbd/i18n.h"
+#include "sha1.c"
+
+using namespace ARDOUR;
+using namespace PBD;
+using namespace std;
+
+LuaScripting* LuaScripting::_instance = 0;
+
+LuaScripting&
+LuaScripting::instance ()
+{
+	if (!_instance) {
+		_instance = new LuaScripting;
+	}
+	return *_instance;
+}
+
+LuaScripting::LuaScripting ()
+	: _sl_dsp (0)
+	, _sl_session (0)
+	, _sl_hook (0)
+	, _sl_action (0)
+	, _sl_snippet (0)
+{
+	;
+}
+
+LuaScripting::~LuaScripting ()
+{
+	if (getenv ("ARDOUR_RUNNING_UNDER_VALGRIND")) {
+		// don't bother, just exit quickly.
+		delete _sl_dsp;
+		delete _sl_session;
+		delete _sl_hook;
+		delete _sl_action;
+		delete _sl_snippet;
+	}
+}
+
+
+void
+LuaScripting::refresh (bool run_scan)
+{
+	Glib::Threads::Mutex::Lock lm (_lock);
+
+	delete _sl_dsp;
+	delete _sl_session;
+	delete _sl_hook;
+	delete _sl_action;
+	delete _sl_snippet;
+
+	_sl_dsp = 0;
+	_sl_session = 0;
+	_sl_hook = 0;
+	_sl_action = 0;
+	_sl_snippet = 0;
+
+	if (run_scan) {
+		lm.release ();
+		scan ();
+	}
+}
+
+struct ScriptSorter {
+	bool operator () (LuaScriptInfoPtr a, LuaScriptInfoPtr b) {
+		return a->name < b->name;
+	}
+};
+
+LuaScriptInfoPtr
+LuaScripting::script_info (const std::string &script) {
+	return scan_script ("", script);
+}
+
+void
+LuaScripting::scan ()
+{
+	Glib::Threads::Mutex::Lock lm (_lock);
+
+#define CLEAR_OR_NEW(LIST) \
+	if (LIST) { LIST->clear (); } else { LIST = new LuaScriptList (); }
+
+	CLEAR_OR_NEW (_sl_dsp)
+	CLEAR_OR_NEW (_sl_session)
+	CLEAR_OR_NEW (_sl_hook)
+	CLEAR_OR_NEW (_sl_action)
+	CLEAR_OR_NEW (_sl_snippet)
+
+#undef CLEAR_OR_NEW
+
+	vector<string> luascripts;
+	find_files_matching_pattern (luascripts, lua_search_path (), "*.lua");
+
+	for (vector<string>::iterator i = luascripts.begin(); i != luascripts.end (); ++i) {
+		LuaScriptInfoPtr lsi = scan_script (*i);
+		if (!lsi) {
+			PBD::info << string_compose (_("Script '%1' has no valid descriptor."), *i) << endmsg;
+			continue;
+		}
+		switch (lsi->type) {
+			case LuaScriptInfo::DSP:
+				_sl_dsp->push_back(lsi);
+				break;
+			case LuaScriptInfo::Session:
+				_sl_session->push_back(lsi);
+				break;
+			case LuaScriptInfo::EditorHook:
+				_sl_hook->push_back(lsi);
+				break;
+			case LuaScriptInfo::EditorAction:
+				_sl_action->push_back(lsi);
+				break;
+			case LuaScriptInfo::Snippet:
+				_sl_snippet->push_back(lsi);
+				break;
+			default:
+				break;
+		}
+	}
+
+	std::sort (_sl_dsp->begin(), _sl_dsp->end(), ScriptSorter());
+	std::sort (_sl_session->begin(), _sl_session->end(), ScriptSorter());
+	std::sort (_sl_hook->begin(), _sl_hook->end(), ScriptSorter());
+	std::sort (_sl_action->begin(), _sl_action->end(), ScriptSorter());
+	std::sort (_sl_snippet->begin(), _sl_snippet->end(), ScriptSorter());
+
+	scripts_changed (); /* EMIT SIGNAL */
+}
+
+void
+LuaScripting::lua_print (std::string s) {
+	PBD::info << "Lua: " << s << "\n";
+}
+
+LuaScriptInfoPtr
+LuaScripting::scan_script (const std::string &fn, const std::string &sc)
+{
+	LuaState lua;
+	if (!(fn.empty() ^ sc.empty())){
+		// give either file OR script
+		assert (0);
+		return LuaScriptInfoPtr();
+	}
+
+	lua_State* L = lua.getState();
+	lua.Print.connect (&LuaScripting::lua_print);
+
+	lua.do_command ("io = nil;");
+
+	lua.do_command (
+			"ardourluainfo = {}"
+			"function ardour (entry)"
+			"  ardourluainfo['type'] = assert(entry['type'])"
+			"  ardourluainfo['name'] = assert(entry['name'])"
+			"  ardourluainfo['category'] = entry['category'] or 'Unknown'"
+			"  ardourluainfo['author'] = entry['author'] or 'Unknown'"
+			"  ardourluainfo['license'] = entry['license'] or ''"
+			"  ardourluainfo['description'] = entry['description'] or ''"
+			" end"
+			);
+
+	try {
+		int err;
+		if (fn.empty()) {
+			err = lua.do_command (sc);
+		} else {
+			err = lua.do_file (fn);
+		}
+		if (err) {
+#ifndef NDEBUG
+		cerr << "failed to load lua script\n";
+#endif
+			return LuaScriptInfoPtr();
+		}
+	} catch (...) { // luabridge::LuaException
+#ifndef NDEBUG
+		cerr << "failed to parse lua script\n";
+#endif
+		return LuaScriptInfoPtr();
+	}
+	luabridge::LuaRef nfo = luabridge::getGlobal (L, "ardourluainfo");
+	if (nfo.type() != LUA_TTABLE) {
+#ifndef NDEBUG
+		cerr << "failed to get ardour{} table from script\n";
+#endif
+		return LuaScriptInfoPtr();
+	}
+
+	if (nfo["name"].type() != LUA_TSTRING || nfo["type"].type() != LUA_TSTRING) {
+#ifndef NDEBUG
+		cerr << "script-type or script-name is not a string\n";
+#endif
+		return LuaScriptInfoPtr();
+	}
+
+	std::string name = nfo["name"].cast<std::string>();
+	LuaScriptInfo::ScriptType type = LuaScriptInfo::str2type (nfo["type"].cast<std::string>());
+
+	if (name.empty() || type == LuaScriptInfo::Invalid) {
+#ifndef NDEBUG
+		cerr << "invalid script-type or missing script name\n";
+#endif
+		return LuaScriptInfoPtr();
+	}
+
+	char hash[41];
+	Sha1Digest s;
+	sha1_init (&s);
+
+	if (fn.empty()) {
+		sha1_write (&s, (const uint8_t *) sc.c_str(), sc.size ());
+	} else {
+		try {
+			std::string script = Glib::file_get_contents (fn);
+			sha1_write (&s, (const uint8_t *) script.c_str(), script.size ());
+		} catch (Glib::FileError err) {
+			return LuaScriptInfoPtr();
+		}
+	}
+	sha1_result_hash (&s, hash);
+
+
+	LuaScriptInfoPtr lsi (new LuaScriptInfo (type, name, fn, hash));
+
+	for (luabridge::Iterator i(nfo); !i.isNil (); ++i) {
+		if (!i.key().isString() || !i.value().isString()) {
+			return LuaScriptInfoPtr();
+		}
+		std::string key = i.key().tostring();
+		std::string val = i.value().tostring();
+
+		if (key == "author") { lsi->author = val; }
+		if (key == "license") { lsi->license = val; }
+		if (key == "description") { lsi->description = val; }
+		if (key == "category") { lsi->category = val; }
+	}
+	return lsi;
+}
+
+LuaScriptList &
+LuaScripting::scripts (LuaScriptInfo::ScriptType type) {
+
+	if (!_sl_dsp || !_sl_session || !_sl_hook || !_sl_action || !_sl_snippet) {
+		scan ();
+	}
+
+	switch (type) {
+		case LuaScriptInfo::DSP:
+			return *_sl_dsp;
+			break;
+		case LuaScriptInfo::Session:
+			return *_sl_session;
+			break;
+		case LuaScriptInfo::EditorHook:
+			return *_sl_hook;
+			break;
+		case LuaScriptInfo::EditorAction:
+			return *_sl_action;
+			break;
+		case LuaScriptInfo::Snippet:
+			return *_sl_snippet;
+			break;
+		default:
+			break;
+	}
+	return _empty_script_info; // make some compilers happy
+}
+
+
+std::string
+LuaScriptInfo::type2str (const ScriptType t) {
+	switch (t) {
+		case LuaScriptInfo::DSP: return "DSP";
+		case LuaScriptInfo::Session: return "Session";
+		case LuaScriptInfo::EditorHook: return "EditorHook";
+		case LuaScriptInfo::EditorAction: return "EditorAction";
+		case LuaScriptInfo::Snippet: return "Snippet";
+		default: return "Invalid";
+	}
+}
+
+LuaScriptInfo::ScriptType
+LuaScriptInfo::str2type (const std::string& str) {
+	const char* type = str.c_str();
+	if (!strcasecmp (type, "DSP")) {return LuaScriptInfo::DSP;}
+	if (!strcasecmp (type, "Session")) {return LuaScriptInfo::Session;}
+	if (!strcasecmp (type, "EditorHook")) {return LuaScriptInfo::EditorHook;}
+	if (!strcasecmp (type, "EditorAction")) {return LuaScriptInfo::EditorAction;}
+	if (!strcasecmp (type, "Snippet")) {return LuaScriptInfo::Snippet;}
+	return LuaScriptInfo::Invalid;
+}
+
+LuaScriptParamList
+LuaScriptParams::script_params (LuaScriptInfoPtr lsi, const std::string &pname)
+{
+	assert (lsi);
+	return LuaScriptParams::script_params (lsi->path, pname);
+}
+
+LuaScriptParamList
+LuaScriptParams::script_params (const std::string& s, const std::string &pname, bool file)
+{
+	LuaScriptParamList rv;
+
+	LuaState lua;
+	lua_State* L = lua.getState();
+	lua.do_command ("io = nil;");
+	lua.do_command ("function ardour () end");
+
+	try {
+		if (file) {
+			lua.do_file (s);
+		} else {
+			lua.do_command (s);
+		}
+	} catch (luabridge::LuaException const& e) {
+		return rv;
+	}
+
+	luabridge::LuaRef lua_params = luabridge::getGlobal (L, pname.c_str());
+	if (lua_params.isFunction ()) {
+		luabridge::LuaRef params = lua_params ();
+		if (params.isTable ()) {
+			for (luabridge::Iterator i (params); !i.isNil (); ++i) {
+				if (!i.key ().isString ())            { continue; }
+				if (!i.value ().isTable ())           { continue; }
+				if (!i.value ()["title"].isString ()) { continue; }
+
+				std::string name = i.key ().cast<std::string> ();
+				std::string title = i.value ()["title"].cast<std::string> ();
+				std::string dflt;
+				bool optional = false;
+
+				if (i.value ()["default"].isString ()) {
+					dflt = i.value ()["default"].cast<std::string> ();
+				}
+				if (i.value ()["optional"].isBoolean ()) {
+					optional = i.value ()["optional"].cast<bool> ();
+				}
+				LuaScriptParamPtr lsspp (new LuaScriptParam(name, title, dflt, optional));
+				rv.push_back (lsspp);
+			}
+		}
+	}
+	return rv;
+}
+
+void
+LuaScriptParams::params_to_ref (luabridge::LuaRef *tbl_args, const LuaScriptParamList& args)
+{
+	assert (tbl_args &&  (*tbl_args).isTable ());
+	for (LuaScriptParamList::const_iterator i = args.begin(); i != args.end(); ++i) {
+		if ((*i)->optional && !(*i)->is_set) { continue; }
+		(*tbl_args)[(*i)->name] = (*i)->value;
+	}
+}
+
+void
+LuaScriptParams::ref_to_params (LuaScriptParamList& args, luabridge::LuaRef *tbl_ref)
+{
+	assert (tbl_ref &&  (*tbl_ref).isTable ());
+	for (luabridge::Iterator i (*tbl_ref); !i.isNil (); ++i) {
+		if (!i.key ().isString ()) { assert(0); continue; }
+		std::string name = i.key ().cast<std::string> ();
+		std::string value = i.value ().cast<std::string> ();
+		for (LuaScriptParamList::const_iterator ii = args.begin(); ii != args.end(); ++ii) {
+			if ((*ii)->name == name) {
+				(*ii)->value = value;
+				break;
+			}
+		}
+	}
+}
+
+bool
+LuaScripting::try_compile (const std::string& script, const LuaScriptParamList& args)
+{
+	const std::string& bytecode = get_factory_bytecode (script);
+	if (bytecode.empty()) {
+		return false;
+	}
+	LuaState l;
+	l.Print.connect (&LuaScripting::lua_print);
+	lua_State* L = l.getState();
+
+	l.do_command (""
+			" function checkfactory (b, a)"
+			"  assert(type(b) == 'string', 'ByteCode must be string')"
+			"  load(b)()" // assigns f
+			"  assert(type(f) == 'string', 'Assigned ByteCode must be string')"
+			"  local factory = load(f)"
+			"  assert(type(factory) == 'function', 'Factory is a not a function')"
+			"  local env = _ENV;  env.f = nil env.debug = nil os.exit = nil"
+			"  load (string.dump(factory, true), nil, nil, env)(a)"
+			" end"
+			);
+
+	try {
+		luabridge::LuaRef lua_test = luabridge::getGlobal (L, "checkfactory");
+		l.do_command ("checkfactory = nil"); // hide it.
+		l.do_command ("collectgarbage()");
+
+		luabridge::LuaRef tbl_arg (luabridge::newTable(L));
+		LuaScriptParams::params_to_ref (&tbl_arg, args);
+		lua_test (bytecode, tbl_arg);
+		return true; // OK
+	} catch (luabridge::LuaException const& e) {
+#ifndef NDEBUG
+		cerr << e.what() << "\n";
+#endif
+		lua_print (e.what());
+	}
+
+	return false;
+}
+
+std::string
+LuaScripting::get_factory_bytecode (const std::string& script)
+{
+	LuaState l;
+	l.Print.connect (&LuaScripting::lua_print);
+	lua_State* L = l.getState();
+
+	l.do_command (
+			" function ardour () end"
+			""
+			" function dump_function (f)"
+			"  assert(type(f) == 'function', 'Factory is a not a function')"
+			"  return string.format(\"f = %q\", string.dump(f, true))"
+			" end"
+			);
+
+	try {
+		luabridge::LuaRef lua_dump = luabridge::getGlobal (L, "dump_function");
+		l.do_command ("dump_function = nil"); // hide it
+		l.do_command (script); // register "factory"
+		luabridge::LuaRef lua_factory = luabridge::getGlobal (L, "factory");
+
+		if (lua_factory.isFunction()) {
+			return (lua_dump(lua_factory)).cast<std::string> ();
+		}
+	} catch (luabridge::LuaException const& e) { }
+	return "";
+}
+
+std::string
+LuaScripting::user_script_dir ()
+{
+	std::string dir = Glib::build_filename (user_config_directory(), lua_dir_name);
+	g_mkdir_with_parents (dir.c_str(), 0744);
+	return dir;
+}
diff --git a/libs/ardour/lv2_plugin.cc b/libs/ardour/lv2_plugin.cc
index 7791c0b..c1f3c06 100644
--- a/libs/ardour/lv2_plugin.cc
+++ b/libs/ardour/lv2_plugin.cc
@@ -17,6 +17,7 @@
     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */
 
+#include <cctype>
 #include <string>
 #include <vector>
 #include <limits>
@@ -35,6 +36,7 @@
 #include "pbd/stl_delete.h"
 #include "pbd/compose.h"
 #include "pbd/error.h"
+#include "pbd/replace_all.h"
 #include "pbd/xml++.h"
 
 #include "libardour-config.h"
@@ -50,7 +52,7 @@
 #include "ardour/worker.h"
 #include "ardour/search_paths.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 #include <locale.h>
 
 #include <lilv/lilv.h>
@@ -125,6 +127,10 @@ public:
 	LilvNode* ev_EventPort;
 	LilvNode* ext_logarithmic;
 	LilvNode* ext_notOnGUI;
+	LilvNode* ext_expensive;
+	LilvNode* ext_causesArtifacts;
+	LilvNode* ext_notAutomatic;
+	LilvNode* ext_rangeSteps;
 	LilvNode* lv2_AudioPort;
 	LilvNode* lv2_ControlPort;
 	LilvNode* lv2_InputPort;
@@ -132,6 +138,7 @@ public:
 	LilvNode* lv2_enumeration;
 	LilvNode* lv2_freewheeling;
 	LilvNode* lv2_inPlaceBroken;
+	LilvNode* lv2_isSideChain;
 	LilvNode* lv2_integer;
 	LilvNode* lv2_default;
 	LilvNode* lv2_minimum;
@@ -155,13 +162,26 @@ public:
 	LilvNode* units_midiNote;
 	LilvNode* patch_writable;
 	LilvNode* patch_Message;
-	LilvNode* lv2_noSampleAccurateCtrl;
 #ifdef HAVE_LV2_1_2_0
 	LilvNode* bufz_powerOf2BlockLength;
 	LilvNode* bufz_fixedBlockLength;
 	LilvNode* bufz_nominalBlockLength;
 #endif
 
+#ifdef HAVE_LV2_1_10_0
+	LilvNode* atom_int;
+	LilvNode* atom_float;
+	LilvNode* atom_object; // new in 1.8
+	LilvNode* atom_vector;
+#endif
+#ifdef LV2_EXTENDED
+	LilvNode* lv2_noSampleAccurateCtrl;
+	LilvNode* auto_can_write_automatation; // lv2:optionalFeature
+	LilvNode* auto_automation_control; // atom:supports
+	LilvNode* auto_automation_controlled; // lv2:portProperty
+	LilvNode* auto_automation_controller; // lv2:portProperty
+#endif
+
 private:
 	bool _bundle_checked;
 };
@@ -176,15 +196,9 @@ work_schedule(LV2_Worker_Schedule_Handle handle,
               uint32_t                   size,
               const void*                data)
 {
-	LV2Plugin* plugin = (LV2Plugin*)handle;
-	if (plugin->session().engine().freewheeling()) {
-		// Freewheeling, do the work immediately in this (audio) thread
-		return (LV2_Worker_Status)plugin->work(size, data);
-	} else {
-		// Enqueue message for the worker thread
-		return plugin->worker()->schedule(size, data) ?
-			LV2_WORKER_SUCCESS : LV2_WORKER_ERR_UNKNOWN;
-	}
+	return (((Worker*)handle)->schedule(size, data)
+	        ? LV2_WORKER_SUCCESS
+	        : LV2_WORKER_ERR_UNKNOWN);
 }
 
 /** Called by the plugin to respond to non-RT work. */
@@ -193,16 +207,20 @@ work_respond(LV2_Worker_Respond_Handle handle,
              uint32_t                  size,
              const void*               data)
 {
+	return (((Worker*)handle)->respond(size, data)
+	        ? LV2_WORKER_SUCCESS
+	        : LV2_WORKER_ERR_UNKNOWN);
+}
+
+#ifdef LV2_EXTENDED
+/* inline display extension */
+static void
+queue_draw (LV2_Inline_Display_Handle handle)
+{
 	LV2Plugin* plugin = (LV2Plugin*)handle;
-	if (plugin->session().engine().freewheeling()) {
-		// Freewheeling, respond immediately in this (audio) thread
-		return (LV2_Worker_Status)plugin->work_response(size, data);
-	} else {
-		// Enqueue response for the worker
-		return plugin->worker()->respond(size, data) ?
-			LV2_WORKER_SUCCESS : LV2_WORKER_ERR_UNKNOWN;
-	}
+	plugin->QueueDraw(); /* EMIT SIGNAL */
 }
+#endif
 
 /* log extension */
 
@@ -214,14 +232,23 @@ log_vprintf(LV2_Log_Handle /*handle*/,
 {
 	char* str = NULL;
 	const int ret = g_vasprintf(&str, fmt, args);
+	/* strip trailing whitespace */
+	while (strlen (str) > 0 && isspace (str[strlen (str) - 1])) {
+		str[strlen (str) - 1] = '\0';
+	}
+	if (strlen (str) == 0) {
+		return 0;
+	}
+
 	if (type == URIMap::instance().urids.log_Error) {
 		error << str << endmsg;
 	} else if (type == URIMap::instance().urids.log_Warning) {
 		warning << str << endmsg;
 	} else if (type == URIMap::instance().urids.log_Note) {
 		info << str << endmsg;
+	} else if (type == URIMap::instance().urids.log_Trace) {
+		DEBUG_TRACE(DEBUG::LV2, str);
 	}
-	// TODO: Toggleable log:Trace message support
 	return ret;
 }
 
@@ -248,6 +275,9 @@ struct LV2Plugin::Impl {
 #ifdef HAVE_LV2_1_2_0
 	       , options(0)
 #endif
+#ifdef LV2_EXTENDED
+	       , queue_draw(0)
+#endif
 	{}
 
 	/** Find the LV2 input port with the given designation.
@@ -272,6 +302,9 @@ struct LV2Plugin::Impl {
 #ifdef HAVE_LV2_1_2_0
 	LV2_Options_Option*          options;
 #endif
+#ifdef LV2_EXTENDED
+	LV2_Inline_Display*          queue_draw;
+#endif
 };
 
 LV2Plugin::LV2Plugin (AudioEngine& engine,
@@ -283,6 +316,7 @@ LV2Plugin::LV2Plugin (AudioEngine& engine,
 	, _impl(new Impl())
 	, _features(NULL)
 	, _worker(NULL)
+	, _state_worker(NULL)
 	, _insert_id("0")
 	, _patch_port_in_index((uint32_t)-1)
 	, _patch_port_out_index((uint32_t)-1)
@@ -298,6 +332,7 @@ LV2Plugin::LV2Plugin (const LV2Plugin& other)
 	, _impl(new Impl())
 	, _features(NULL)
 	, _worker(NULL)
+	, _state_worker(NULL)
 	, _insert_id(other._insert_id)
 	, _patch_port_in_index((uint32_t)-1)
 	, _patch_port_out_index((uint32_t)-1)
@@ -335,6 +370,9 @@ LV2Plugin::init(const void* c_plugin, framecnt_t rate)
 	_state_version          = 0;
 	_was_activated          = false;
 	_has_state_interface    = false;
+	_can_write_automation   = false;
+	_max_latency            = 0;
+	_current_latency        = 0;
 	_impl->block_length     = _session.get_block_size();
 
 	_instance_access_feature.URI = "http://lv2plug.in/ns/ext/instance-access";
@@ -358,7 +396,7 @@ LV2Plugin::init(const void* c_plugin, framecnt_t rate)
 	lilv_node_free(state_uri);
 	lilv_node_free(state_iface_uri);
 
-	_features    = (LV2_Feature**)calloc(11, sizeof(LV2_Feature*));
+	_features    = (LV2_Feature**)calloc(12, sizeof(LV2_Feature*));
 	_features[0] = &_instance_access_feature;
 	_features[1] = &_data_access_feature;
 	_features[2] = &_make_path_feature;
@@ -375,6 +413,17 @@ LV2Plugin::init(const void* c_plugin, framecnt_t rate)
 	lv2_atom_forge_init(&_impl->forge, _uri_map.urid_map());
 	lv2_atom_forge_init(&_impl->ui_forge, _uri_map.urid_map());
 
+#ifdef LV2_EXTENDED
+	_impl->queue_draw = (LV2_Inline_Display*)
+		malloc (sizeof(LV2_Inline_Display));
+	_impl->queue_draw->handle     = this;
+	_impl->queue_draw->queue_draw = queue_draw;
+
+	_queue_draw_feature.URI  = LV2_INLINEDISPLAY__queue_draw;
+	_queue_draw_feature.data = _impl->queue_draw;
+	_features[n_features++]  = &_queue_draw_feature;
+#endif
+
 #ifdef HAVE_LV2_1_2_0
 	LV2_URID atom_Int = _uri_map.uri_to_id(LV2_ATOM__Int);
 	static const int32_t _min_block_length = 1;   // may happen during split-cycles
@@ -418,19 +467,24 @@ LV2Plugin::init(const void* c_plugin, framecnt_t rate)
 	log->vprintf = &log_vprintf;
 	_log_feature.data = log;
 
+	const size_t ring_size = _session.engine().raw_buffer_size(DataType::MIDI) * NBUFS;
 	LilvNode* worker_schedule = lilv_new_uri(_world.world, LV2_WORKER__schedule);
 	if (lilv_plugin_has_feature(plugin, worker_schedule)) {
 		LV2_Worker_Schedule* schedule = (LV2_Worker_Schedule*)malloc(
 			sizeof(LV2_Worker_Schedule));
-		size_t buf_size = _session.engine().raw_buffer_size(DataType::MIDI) * NBUFS;
-		_worker                     = new Worker(this, buf_size);
-		schedule->handle            = this;
+		_worker                     = new Worker(this, ring_size);
+		schedule->handle            = _worker;
 		schedule->schedule_work     = work_schedule;
 		_work_schedule_feature.data = schedule;
 		_features[n_features++]     = &_work_schedule_feature;
 	}
 	lilv_node_free(worker_schedule);
 
+	if (_has_state_interface) {
+		// Create a non-threaded worker for use by state restore
+		_state_worker = new Worker(this, ring_size, false);
+	}
+
 	_impl->instance = lilv_plugin_instantiate(plugin, rate, _features);
 	_impl->name     = lilv_plugin_get_name(plugin);
 	_impl->author   = lilv_plugin_get_author_name(plugin);
@@ -461,6 +515,11 @@ LV2Plugin::init(const void* c_plugin, framecnt_t rate)
 	lilv_node_free(options_iface_uri);
 #endif
 
+#ifdef LV2_EXTENDED
+	_display_interface = (const LV2_Inline_Display_Interface*)
+		extension_data (LV2_INLINEDISPLAY__interface);
+#endif
+
 	if (lilv_plugin_has_feature(plugin, _world.lv2_inPlaceBroken)) {
 		error << string_compose(
 		    _("LV2: \"%1\" cannot be used, since it cannot do inplace processing."),
@@ -484,11 +543,16 @@ LV2Plugin::init(const void* c_plugin, framecnt_t rate)
 		throw failed_constructor();
 	}
 	lilv_nodes_free(required_features);
+#endif
 
+#ifdef LV2_EXTENDED
 	LilvNodes* optional_features = lilv_plugin_get_optional_features (plugin);
 	if (lilv_nodes_contains (optional_features, _world.lv2_noSampleAccurateCtrl)) {
 		_no_sample_accurate_ctrl = true;
 	}
+	if (lilv_nodes_contains (optional_features, _world.auto_can_write_automatation)) {
+		_can_write_automation = true;
+	}
 	lilv_nodes_free(optional_features);
 #endif
 
@@ -542,6 +606,11 @@ LV2Plugin::init(const void* c_plugin, framecnt_t rate)
 				if (lilv_nodes_contains(atom_supports, _world.time_Position)) {
 					flags |= PORT_POSITION;
 				}
+#ifdef LV2_EXTENDED
+				if (lilv_nodes_contains(atom_supports, _world.auto_automation_control)) {
+					flags |= PORT_AUTOCTRL;
+				}
+#endif
 				if (lilv_nodes_contains(atom_supports, _world.patch_Message)) {
 					flags |= PORT_PATCHMSG;
 					if (flags & PORT_INPUT) {
@@ -566,8 +635,33 @@ LV2Plugin::init(const void* c_plugin, framecnt_t rate)
 			throw failed_constructor();
 		}
 
+		if ((flags & PORT_INPUT) && (flags & PORT_CONTROL)) {
+			if (lilv_port_has_property(_impl->plugin, port, _world.ext_causesArtifacts)) {
+				flags |= PORT_NOAUTO;
+			}
+			if (lilv_port_has_property(_impl->plugin, port, _world.ext_notAutomatic)) {
+				flags |= PORT_NOAUTO;
+			}
+			if (lilv_port_has_property(_impl->plugin, port, _world.ext_expensive)) {
+				flags |= PORT_NOAUTO;
+			}
+		}
+#ifdef LV2_EXTENDED
+		if (lilv_port_has_property(_impl->plugin, port, _world.auto_automation_controlled)) {
+			if ((flags & PORT_INPUT) && (flags & PORT_CONTROL)) {
+				flags |= PORT_CTRLED;
+			}
+		}
+		if (lilv_port_has_property(_impl->plugin, port, _world.auto_automation_controller)) {
+			if ((flags & PORT_INPUT) && (flags & PORT_CONTROL)) {
+				flags |= PORT_CTRLER;
+			}
+		}
+#endif
+
 		_port_flags.push_back(flags);
 		_port_minimumSize.push_back(minimumSize);
+		DEBUG_TRACE(DEBUG::LV2, string_compose("port %1 buffer %2 bytes\n", i, minimumSize));
 	}
 
 	_control_data = new float[num_ports];
@@ -609,6 +703,9 @@ LV2Plugin::init(const void* c_plugin, framecnt_t rate)
 			lilv_instance_connect_port(_impl->instance, i, &_control_data[i]);
 
 			if (latent && i == latency_index) {
+				LilvNode *max;
+				lilv_port_get_range(_impl->plugin, port, NULL, NULL, &max);
+				_max_latency = max ? lilv_node_as_float(max) : .02 * _sample_rate;
 				_latency_control_port  = &_control_data[i];
 				*_latency_control_port = 0;
 			}
@@ -710,6 +807,13 @@ LV2Plugin::requires_fixed_sized_buffers () const
 	 * e.g The process cycle may be split when looping, also
 	 * the period-size may change any time: see set_block_size()
 	 */
+	if (get_info()->n_inputs.n_midi() > 0) {
+		/* we don't yet implement midi buffer offsets (for split cycles).
+		 * Also connect_and_run() also uses _session.transport_frame() directly
+		 * (for BBT) which is not offset for plugin cycle split.
+		 */
+		return true;
+	}
 	return _no_sample_accurate_ctrl;
 }
 
@@ -727,14 +831,19 @@ LV2Plugin::~LV2Plugin ()
 #ifdef HAVE_LV2_1_2_0
 	free(_impl->options);
 #endif
+#ifdef LV2_EXTENDED
+	free(_impl->queue_draw);
+#endif
 
 	free(_features);
+	free(_log_feature.data);
 	free(_make_path_feature.data);
 	free(_work_schedule_feature.data);
 
 	delete _to_ui;
 	delete _from_ui;
 	delete _worker;
+	delete _state_worker;
 
 	if (_atom_ev_buffers) {
 		LV2_Evbuf**  b = _atom_ev_buffers;
@@ -749,6 +858,7 @@ LV2Plugin::~LV2Plugin ()
 	delete [] _shadow_data;
 	delete [] _defaults;
 	delete [] _ev_buffers;
+	delete _impl;
 }
 
 bool
@@ -789,6 +899,23 @@ LV2Plugin::ui_is_resizable () const
 	return !fs_matches && !nrs_matches;
 }
 
+#ifdef LV2_EXTENDED
+bool
+LV2Plugin::has_inline_display () {
+	return _display_interface ? true : false;
+}
+
+Plugin::Display_Image_Surface*
+LV2Plugin::render_inline_display (uint32_t w, uint32_t h) {
+	if (_display_interface) {
+		/* Plugin::Display_Image_Surface is identical to
+		 * LV2_Inline_Display_Image_Surface */
+		return (Plugin::Display_Image_Surface*) _display_interface->render ((void*)_impl->instance->lv2_handle, w, h);
+	}
+	return NULL;
+}
+#endif
+
 string
 LV2Plugin::unique_id() const
 {
@@ -924,6 +1051,51 @@ LV2Plugin::get_parameter_docs(uint32_t which) const
 	return "";
 }
 
+bool
+LV2Plugin::get_layout (uint32_t which, UILayoutHint& h) const
+{
+	/// TODO lookup port-properties
+	if (unique_id () != "urn:ardour:a-eq") {
+		return false;
+	}
+	h.knob = true;
+	switch (which) {
+		case  0: h.x0 = 0; h.x1 = 1; h.y0 = 2; h.y1 = 3; break; // Frequency L
+		case  1: h.x0 = 0; h.x1 = 1; h.y0 = 0; h.y1 = 1; break; // Gain L
+		case 17: h.x0 = 0; h.x1 = 1; h.y0 = 5; h.y1 = 6; break; // enable L
+
+		case  2: h.x0 = 1; h.x1 = 3; h.y0 = 2; h.y1 = 3; break; // Frequency 1
+		case  3: h.x0 = 1; h.x1 = 3; h.y0 = 0; h.y1 = 1; break; // Gain 1
+		case  4: h.x0 = 2; h.x1 = 4; h.y0 = 1; h.y1 = 2; break; // Bandwidth 1
+		case 18: h.x0 = 1; h.x1 = 4; h.y0 = 5; h.y1 = 6; break; // enable 1
+
+		case  5: h.x0 = 4; h.x1 = 6; h.y0 = 2; h.y1 = 3; break; // Frequency 2
+		case  6: h.x0 = 4; h.x1 = 6; h.y0 = 0; h.y1 = 1; break; // Gain 2
+		case  7: h.x0 = 5; h.x1 = 7; h.y0 = 1; h.y1 = 2; break; // Bandwidth 2
+		case 19: h.x0 = 4; h.x1 = 7; h.y0 = 5; h.y1 = 6; break; // enable 2
+
+		case  8: h.x0 = 7; h.x1 =  9; h.y0 = 2; h.y1 = 3; break; // Frequency 3
+		case  9: h.x0 = 7; h.x1 =  9; h.y0 = 0; h.y1 = 1; break; // Gain 3
+		case 10: h.x0 = 8; h.x1 = 10; h.y0 = 1; h.y1 = 2; break; // Bandwidth 3
+		case 20: h.x0 = 7; h.x1 = 10; h.y0 = 5; h.y1 = 6; break; // enable 3
+
+		case 11: h.x0 = 10; h.x1 = 12; h.y0 = 2; h.y1 = 3; break; // Frequency 4
+		case 12: h.x0 = 10; h.x1 = 12; h.y0 = 0; h.y1 = 1; break; // Gain 4
+		case 13: h.x0 = 11; h.x1 = 13; h.y0 = 1; h.y1 = 2; break; // Bandwidth 4
+		case 21: h.x0 = 10; h.x1 = 13; h.y0 = 5; h.y1 = 6; break; // enable 4
+
+		case 14: h.x0 = 13; h.x1 = 14; h.y0 = 2; h.y1 = 3; break; // Frequency H
+		case 15: h.x0 = 13; h.x1 = 14; h.y0 = 0; h.y1 = 1; break; // Gain H
+		case 22: h.x0 = 13; h.x1 = 14; h.y0 = 5; h.y1 = 6; break; // enable H
+
+
+		case 16: h.x0 = 14; h.x1 = 15; h.y0 = 4; h.y1 = 6; break; // Master Gain
+		default:
+			return false;
+	}
+	return true;
+}
+
 uint32_t
 LV2Plugin::nth_parameter(uint32_t n, bool& ok) const
 {
@@ -1028,7 +1200,7 @@ LV2Plugin::add_state(XMLNode* root) const
 
 	XMLNode*    child;
 	char        buf[32];
-	LocaleGuard lg(X_("C"));
+	LocaleGuard lg;
 
 	for (uint32_t i = 0; i < parameter_count(); ++i) {
 		if (parameter_is_input(i) && parameter_is_control(i)) {
@@ -1164,8 +1336,15 @@ LV2Plugin::load_preset(PresetRecord r)
 	LilvNode*  pset  = lilv_new_uri(world, r.uri.c_str());
 	LilvState* state = lilv_state_new_from_world(world, _uri_map.urid_map(), pset);
 
+	const LV2_Feature*  state_features[2]   = { NULL, NULL };
+	LV2_Worker_Schedule schedule            = { _state_worker, work_schedule };
+	const LV2_Feature   state_sched_feature = { LV2_WORKER__schedule, &schedule };
+	if (_state_worker) {
+		state_features[0] = &state_sched_feature;
+	}
+
 	if (state) {
-		lilv_state_restore(state, _impl->instance, set_port_value, this, 0, NULL);
+		lilv_state_restore(state, _impl->instance, set_port_value, this, 0, state_features);
 		lilv_state_free(state);
 		Plugin::load_preset(r);
 	}
@@ -1516,6 +1695,7 @@ load_parameter_descriptor_units(LilvWorld* lworld, ParameterDescriptor& desc, co
 		LilvNode* render = get_value(lworld, unit, _world.units_render);
 		if (render) {
 			desc.print_fmt = lilv_node_as_string(render);
+			replace_all (desc.print_fmt, "%f", "%.2f");
 			lilv_node_free(render);
 		}
 	}
@@ -1666,10 +1846,11 @@ LV2Plugin::emit_to_ui(void* controller, UIMessageSink sink)
 }
 
 int
-LV2Plugin::work(uint32_t size, const void* data)
+LV2Plugin::work(Worker& worker, uint32_t size, const void* data)
 {
+	Glib::Threads::Mutex::Lock lm(_work_mutex);
 	return _impl->work_iface->work(
-		_impl->instance->lv2_handle, work_respond, this, size, data);
+		_impl->instance->lv2_handle, work_respond, &worker, size, data);
 }
 
 int
@@ -1701,13 +1882,13 @@ int
 LV2Plugin::set_state(const XMLNode& node, int version)
 {
 	XMLNodeList          nodes;
-	const XMLProperty*   prop;
+	XMLProperty const * prop;
 	XMLNodeConstIterator iter;
 	XMLNode*             child;
 	const char*          sym;
 	const char*          value;
 	uint32_t             port_id;
-	LocaleGuard          lg(X_("C"));
+	LocaleGuard          lg;
 
 	if (node.name() != state_node_name()) {
 		error << _("Bad node sent to LV2Plugin::set_state") << endmsg;
@@ -1804,6 +1985,8 @@ LV2Plugin::get_parameter_descriptor(uint32_t which, ParameterDescriptor& desc) c
 	lilv_port_get_range(_impl->plugin, port, &def, &min, &max);
 	portunits = lilv_port_get_value(_impl->plugin, port, _world.units_unit);
 
+	LilvNode* steps   = lilv_port_get(_impl->plugin, port, _world.ext_rangeSteps);
+
 	// TODO: Once we can rely on lilv 0.18.0 being present,
 	// load_parameter_descriptor() can be used for ports as well
 	desc.integer_step = lilv_port_has_property(_impl->plugin, port, _world.lv2_integer);
@@ -1829,14 +2012,89 @@ LV2Plugin::get_parameter_descriptor(uint32_t which, ParameterDescriptor& desc) c
 
 	desc.update_steps();
 
+	if (steps) {
+		//override auto-calculated steps in update_steps()
+		float s = lilv_node_as_float (steps);
+		const float delta = desc.upper - desc.lower;
+
+		desc.step = desc.smallstep = (delta / s);
+		desc.largestep = std::min ((delta / 5.0f), 10.f * desc.smallstep);
+
+		if (desc.logarithmic) {
+			// TODO marry AutomationControl::internal_to_interface () with
+			// http://lv2plug.in/ns/ext/port-props/#rangeSteps
+			desc.smallstep = desc.smallstep / logf(s);
+			desc.step      = desc.step      / logf(s);
+			desc.largestep = desc.largestep / logf(s);
+		} else if (desc.integer_step) {
+			desc.smallstep = 1.0;
+			desc.step      = std::max(1.f, rintf (desc.step));
+			desc.largestep = std::max(1.f, rintf (desc.largestep));
+		}
+		DEBUG_TRACE(DEBUG::LV2, string_compose("parameter %1 small: %2, step: %3 largestep: %4\n",
+					which, desc.smallstep, desc.step, desc.largestep));
+	}
+
+
 	lilv_node_free(def);
 	lilv_node_free(min);
 	lilv_node_free(max);
+	lilv_node_free(steps);
 	lilv_nodes_free(portunits);
 
 	return 0;
 }
 
+Plugin::IOPortDescription
+LV2Plugin::describe_io_port (ARDOUR::DataType dt, bool input, uint32_t id) const
+{
+	PortFlags match = 0;
+	switch (dt) {
+		case DataType::AUDIO:
+			match = PORT_AUDIO;
+			break;
+		case DataType::MIDI:
+			match = PORT_SEQUENCE | PORT_MIDI; // ignore old PORT_EVENT
+			break;
+		default:
+			return Plugin::IOPortDescription ("?");
+			break;
+	}
+	if (input) {
+		match |= PORT_INPUT;
+	} else {
+		match |= PORT_OUTPUT;
+	}
+
+	uint32_t p = 0;
+	uint32_t idx = UINT32_MAX;
+
+	uint32_t const num_ports = parameter_count();
+	for (uint32_t port_index = 0; port_index < num_ports; ++port_index) {
+		PortFlags flags = _port_flags[port_index];
+		if ((flags & match) == match) {
+			if (p == id) {
+				idx = port_index;
+			}
+			++p;
+		}
+	}
+	if (idx == UINT32_MAX) {
+		return Plugin::IOPortDescription ("?");
+	}
+
+	LilvNode* name = lilv_port_get_name(_impl->plugin,
+			lilv_plugin_get_port_by_index(_impl->plugin, idx));
+	Plugin::IOPortDescription iod (lilv_node_as_string (name));
+	lilv_node_free(name);
+
+	if (lilv_port_has_property(_impl->plugin,
+				lilv_plugin_get_port_by_index(_impl->plugin, idx), _world.lv2_isSideChain)) {
+		iod.is_sidechain = true;
+	}
+	return iod;
+}
+
 string
 LV2Plugin::describe_parameter(Evoral::Parameter which)
 {
@@ -1868,6 +2126,12 @@ LV2Plugin::describe_parameter(Evoral::Parameter which)
 }
 
 framecnt_t
+LV2Plugin::max_latency () const
+{
+	return _max_latency;
+}
+
+framecnt_t
 LV2Plugin::signal_latency() const
 {
 	if (_latency_control_port) {
@@ -1883,7 +2147,7 @@ LV2Plugin::automatable() const
 	set<Evoral::Parameter> ret;
 
 	for (uint32_t i = 0; i < parameter_count(); ++i) {
-		if (parameter_is_input(i) && parameter_is_control(i)) {
+		if (parameter_is_input(i) && parameter_is_control(i) && !(_port_flags[i] & PORT_NOAUTO)) {
 			ret.insert(ret.end(), Evoral::Parameter(PluginAutomation, 0, i));
 		}
 	}
@@ -1897,6 +2161,24 @@ LV2Plugin::automatable() const
 }
 
 void
+LV2Plugin::set_automation_control (uint32_t i, boost::shared_ptr<AutomationControl> c)
+{
+	if ((_port_flags[i] & (PORT_CTRLED | PORT_CTRLER))) {
+		DEBUG_TRACE(DEBUG::LV2Automate, string_compose ("Ctrl Port %1\n", i));
+		_ctrl_map [i] = AutomationCtrlPtr (new AutomationCtrl(c));
+	}
+}
+
+LV2Plugin::AutomationCtrlPtr
+LV2Plugin::get_automation_control (uint32_t i)
+{
+	if (_ctrl_map.find (i) == _ctrl_map.end()) {
+		return AutomationCtrlPtr ();
+	}
+	return _ctrl_map[i];
+}
+
+void
 LV2Plugin::activate()
 {
 	DEBUG_TRACE(DEBUG::LV2, string_compose("%1 activate\n", name()));
@@ -1948,8 +2230,7 @@ LV2Plugin::allocate_atom_event_buffers()
 			LilvNodes* atom_supports = lilv_port_get_value(
 				p, port, _world.atom_supports);
 
-			if (!lilv_nodes_contains(buffer_types, _world.atom_Sequence)
-					|| !lilv_nodes_contains(atom_supports, _world.midi_MidiEvent)) {
+			if (lilv_nodes_contains(buffer_types, _world.atom_Sequence)) {
 				if (lilv_port_is_a(p, port, _world.lv2_InputPort)) {
 					count_atom_in++;
 				}
@@ -1976,7 +2257,7 @@ LV2Plugin::allocate_atom_event_buffers()
 		return;
 	}
 
-	DEBUG_TRACE(DEBUG::LV2, string_compose("allocate %1 atom_ev_buffers of %d bytes\n", total_atom_buffers, minimumSize));
+	DEBUG_TRACE(DEBUG::LV2, string_compose("allocate %1 atom_ev_buffers of %2 bytes\n", total_atom_buffers, minimumSize));
 	_atom_ev_buffers = (LV2_Evbuf**) malloc((total_atom_buffers + 1) * sizeof(LV2_Evbuf*));
 	for (int i = 0; i < total_atom_buffers; ++i ) {
 		_atom_ev_buffers[i] = lv2_evbuf_new(minimumSize, LV2_EVBUF_ATOM,
@@ -2047,17 +2328,18 @@ write_position(LV2_Atom_Forge*     forge,
 
 int
 LV2Plugin::connect_and_run(BufferSet& bufs,
-	ChanMapping in_map, ChanMapping out_map,
-	pframes_t nframes, framecnt_t offset)
+		framepos_t start, framepos_t end, double speed,
+		ChanMapping in_map, ChanMapping out_map,
+		pframes_t nframes, framecnt_t offset)
 {
 	DEBUG_TRACE(DEBUG::LV2, string_compose("%1 run %2 offset %3\n", name(), nframes, offset));
-	Plugin::connect_and_run(bufs, in_map, out_map, nframes, offset);
+	Plugin::connect_and_run(bufs, start, end, speed, in_map, out_map, nframes, offset);
 
 	cycles_t then = get_cycles();
 
 	TempoMap&               tmap     = _session.tempo_map();
 	Metrics::const_iterator metric_i = tmap.metrics_end();
-	TempoMetric             tmetric  = tmap.metric_at(_session.transport_frame(), &metric_i);
+	TempoMetric             tmetric  = tmap.metric_at(start, &metric_i);
 
 	if (_freewheel_control_port) {
 		*_freewheel_control_port = _session.engine().freewheeling() ? 1.f : 0.f;
@@ -2067,6 +2349,15 @@ LV2Plugin::connect_and_run(BufferSet& bufs,
 		*_bpm_control_port = tmetric.tempo().beats_per_minute();
 	}
 
+#ifdef LV2_EXTENDED
+	if (_can_write_automation && start != _next_cycle_start) {
+		// add guard-points after locating
+		for (AutomationCtrlMap::iterator i = _ctrl_map.begin(); i != _ctrl_map.end(); ++i) {
+			i->second->guard = true;
+		}
+	}
+#endif
+
 	ChanCount bufs_count;
 	bufs_count.set(DataType::AUDIO, 1);
 	bufs_count.set(DataType::MIDI, 1);
@@ -2127,13 +2418,12 @@ LV2Plugin::connect_and_run(BufferSet& bufs,
 			if (valid && (flags & PORT_INPUT)) {
 				Timecode::BBT_Time bbt;
 				if ((flags & PORT_POSITION)) {
-					if (_session.transport_frame() != _next_cycle_start ||
-					    _session.transport_speed() != _next_cycle_speed) {
+					if (start != _next_cycle_start ||
+					    speed != _next_cycle_speed) {
 						// Transport has changed, write position at cycle start
-						tmap.bbt_time(_session.transport_frame(), bbt);
+						bbt = tmap.bbt_at_frame (start);
 						write_position(&_impl->forge, _ev_buffers[port_index],
-						               tmetric, bbt, _session.transport_speed(),
-						               _session.transport_frame(), 0);
+						               tmetric, bbt, speed, start, 0);
 					}
 				}
 
@@ -2147,7 +2437,7 @@ LV2Plugin::connect_and_run(BufferSet& bufs,
 
 				// Now merge MIDI and any transport events into the buffer
 				const uint32_t     type = _uri_map.urids.midi_MidiEvent;
-				const framepos_t   tend = _session.transport_frame() + nframes;
+				const framepos_t   tend = end;
 				++metric_i;
 				while (m != m_end || (metric_i != tmap.metrics_end() &&
 				                      (*metric_i)->frame() < tend)) {
@@ -2162,11 +2452,11 @@ LV2Plugin::connect_and_run(BufferSet& bufs,
 						++m;
 					} else {
 						tmetric.set_metric(metric);
-						bbt = metric->start();
+						bbt = tmap.bbt_at_pulse (metric->pulse());
 						write_position(&_impl->forge, _ev_buffers[port_index],
-						               tmetric, bbt, _session.transport_speed(),
+						               tmetric, bbt, speed,
 						               metric->frame(),
-						               metric->frame() - _session.transport_frame());
+						               metric->frame() - start);
 						++metric_i;
 					}
 				}
@@ -2251,9 +2541,8 @@ LV2Plugin::connect_and_run(BufferSet& bufs,
 			}
 		}
 
-
 		// Write messages to UI
-		if ((_to_ui || _patch_port_out_index != (uint32_t)-1) &&
+		if ((_to_ui || _can_write_automation || _patch_port_out_index != (uint32_t)-1) &&
 		    (flags & PORT_OUTPUT) && (flags & (PORT_EVENT|PORT_SEQUENCE))) {
 			LV2_Evbuf* buf = _ev_buffers[port_index];
 			for (LV2_Evbuf_Iterator i = lv2_evbuf_begin(buf);
@@ -2263,6 +2552,117 @@ LV2Plugin::connect_and_run(BufferSet& bufs,
 				uint8_t* data;
 				lv2_evbuf_get(i, &frames, &subframes, &type, &size, &data);
 
+#ifdef LV2_EXTENDED
+				// Intercept Automation Write Events
+				if ((flags & PORT_AUTOCTRL)) {
+					LV2_Atom* atom = (LV2_Atom*)(data - sizeof(LV2_Atom));
+					if (atom->type == _uri_map.urids.atom_Blank ||
+							atom->type == _uri_map.urids.atom_Object) {
+						LV2_Atom_Object* obj = (LV2_Atom_Object*)atom;
+						if (obj->body.otype == _uri_map.urids.auto_event) {
+							// only if transport_rolling ??
+							const LV2_Atom* parameter = NULL;
+							const LV2_Atom* value    = NULL;
+							lv2_atom_object_get(obj,
+							                    _uri_map.urids.auto_parameter, &parameter,
+							                    _uri_map.urids.auto_value,     &value,
+							                    0);
+							if (parameter && value) {
+								const uint32_t p = ((const LV2_Atom_Int*)parameter)->body;
+								const float v = ((const LV2_Atom_Float*)value)->body;
+								// -> add automation event..
+								DEBUG_TRACE(DEBUG::LV2Automate,
+										string_compose ("Event p: %1 t: %2 v: %3\n", p, frames, v));
+								AutomationCtrlPtr c = get_automation_control (p);
+								if (c &&
+								     (c->ac->automation_state() == Touch || c->ac->automation_state() == Write)
+								   ) {
+									framepos_t when = std::max ((framepos_t) 0, start + frames - _current_latency);
+									assert (start + frames - _current_latency >= 0);
+									if (c->guard) {
+										c->guard = false;
+										c->ac->list()->add (when, v, true, true);
+									} else {
+										c->ac->set_double (v, when, true);
+									}
+								}
+							}
+						}
+						else if (obj->body.otype == _uri_map.urids.auto_setup) {
+							// TODO optional arguments, for now we assume the plugin
+							// writes automation for its own inputs
+							// -> put them in "touch" mode (preferably "exclusive plugin touch(TM)"
+							for (AutomationCtrlMap::iterator i = _ctrl_map.begin(); i != _ctrl_map.end(); ++i) {
+								if (_port_flags[i->first] & PORT_CTRLED) {
+									DEBUG_TRACE(DEBUG::LV2Automate,
+										string_compose ("Setup p: %1\n", i->first));
+									i->second->ac->set_automation_state (Touch);
+								}
+							}
+						}
+						else if (obj->body.otype == _uri_map.urids.auto_finalize) {
+							// set [touched] parameters to "play" ??
+							// allow plugin to change its mode (from analyze to apply)
+							const LV2_Atom* parameter = NULL;
+							const LV2_Atom* value    = NULL;
+							lv2_atom_object_get(obj,
+							                    _uri_map.urids.auto_parameter, &parameter,
+							                    _uri_map.urids.auto_value,     &value,
+							                    0);
+							if (parameter && value) {
+								const uint32_t p = ((const LV2_Atom_Int*)parameter)->body;
+								const float v = ((const LV2_Atom_Float*)value)->body;
+								AutomationCtrlPtr c = get_automation_control (p);
+								DEBUG_TRACE(DEBUG::LV2Automate,
+										string_compose ("Finalize p: %1 v: %2\n", p, v));
+								if (c && _port_flags[p] & PORT_CTRLER) {
+									c->ac->set_value(v, Controllable::NoGroup);
+								}
+							} else {
+								DEBUG_TRACE(DEBUG::LV2Automate, "Finalize\n");
+							}
+							for (AutomationCtrlMap::iterator i = _ctrl_map.begin(); i != _ctrl_map.end(); ++i) {
+								// guard will be false if an event was written
+								if ((_port_flags[i->first] & PORT_CTRLED) && !i->second->guard) {
+									DEBUG_TRACE(DEBUG::LV2Automate,
+										string_compose ("Thin p: %1\n", i->first));
+									i->second->ac->alist ()->thin (20);
+								}
+							}
+						}
+						else if (obj->body.otype == _uri_map.urids.auto_start) {
+							const LV2_Atom* parameter = NULL;
+							lv2_atom_object_get(obj,
+							                    _uri_map.urids.auto_parameter, &parameter,
+							                    0);
+							if (parameter) {
+								const uint32_t p = ((const LV2_Atom_Int*)parameter)->body;
+								AutomationCtrlPtr c = get_automation_control (p);
+								DEBUG_TRACE(DEBUG::LV2Automate, string_compose ("Start Touch p: %1\n", p));
+								if (c) {
+									c->ac->start_touch (std::max ((framepos_t)0, start - _current_latency));
+									c->guard = true;
+								}
+							}
+						}
+						else if (obj->body.otype == _uri_map.urids.auto_end) {
+							const LV2_Atom* parameter = NULL;
+							lv2_atom_object_get(obj,
+							                    _uri_map.urids.auto_parameter, &parameter,
+							                    0);
+							if (parameter) {
+								const uint32_t p = ((const LV2_Atom_Int*)parameter)->body;
+								AutomationCtrlPtr c = get_automation_control (p);
+								DEBUG_TRACE(DEBUG::LV2Automate, string_compose ("End Touch p: %1\n", p));
+								if (c) {
+									c->ac->stop_touch (true, std::max ((framepos_t)0, start - _current_latency));
+								}
+							}
+						}
+					}
+				}
+#endif
+
 				// Intercept patch change messages to emit PropertyChanged signal
 				if ((flags & PORT_PATCHMSG)) {
 					LV2_Atom* atom = (LV2_Atom*)(data - sizeof(LV2_Atom));
@@ -2277,19 +2677,18 @@ LV2Plugin::connect_and_run(BufferSet& bufs,
 							                    _uri_map.urids.patch_value,    &value,
 							                    0);
 
-							if (!property || !value ||
-							    property->type != _uri_map.urids.atom_URID ||
-							    value->type    != _uri_map.urids.atom_Path) {
+							if (property && value &&
+							    property->type == _uri_map.urids.atom_URID &&
+							    value->type    == _uri_map.urids.atom_Path) {
+								const uint32_t prop_id = ((const LV2_Atom_URID*)property)->body;
+								const char*    path    = (const char*)LV2_ATOM_BODY_CONST(value);
+
+								// Emit PropertyChanged signal for UI
+								// TODO: This should emit the control's Changed signal
+								PropertyChanged(prop_id, Variant(Variant::PATH, path));
+							} else {
 								std::cerr << "warning: patch:Set for unknown property" << std::endl;
-								continue;
 							}
-
-							const uint32_t prop_id = ((const LV2_Atom_URID*)property)->body;
-							const char*    path    = (const char*)LV2_ATOM_BODY_CONST(value);
-
-							// Emit PropertyChanged signal for UI
-							// TODO: This should emit the control's Changed signal
-							PropertyChanged(prop_id, Variant(Variant::PATH, path));
 						}
 					}
 				}
@@ -2306,9 +2705,13 @@ LV2Plugin::connect_and_run(BufferSet& bufs,
 	set_cycles((uint32_t)(now - then));
 
 	// Update expected transport information for next cycle so we can detect changes
-	_next_cycle_speed = _session.transport_speed();
-	_next_cycle_start = _session.transport_frame() + (nframes * _next_cycle_speed);
+	_next_cycle_speed = speed;
+	_next_cycle_start = end;
 
+	if (_latency_control_port) {
+		framecnt_t new_latency = signal_latency ();
+		_current_latency = new_latency;
+	}
 	return 0;
 }
 
@@ -2347,6 +2750,22 @@ LV2Plugin::parameter_is_input(uint32_t param) const
 	return _port_flags[param] & PORT_INPUT;
 }
 
+uint32_t
+LV2Plugin::designated_bypass_port ()
+{
+#ifdef LV2_EXTENDED
+	const LilvPort* port = NULL;
+	LilvNode* designation = lilv_new_uri (_world.world, LV2_PROCESSING_URI__enable);
+	port = lilv_plugin_get_port_by_designation (
+			_impl->plugin, _world.lv2_InputPort, designation);
+	lilv_node_free(designation);
+	if (port) {
+		return lilv_port_get_index (_impl->plugin, port);
+	}
+#endif
+	return UINT32_MAX;
+}
+
 void
 LV2Plugin::print_parameter(uint32_t param, char* buf, uint32_t len) const
 {
@@ -2396,10 +2815,24 @@ LV2Plugin::run(pframes_t nframes)
 		}
 	}
 
+	if (_worker) {
+		// Execute work synchronously if we're freewheeling (export)
+		_worker->set_synchronous(session().engine().freewheeling());
+	}
+
+	// Run the plugin for this cycle
 	lilv_instance_run(_impl->instance, nframes);
 
-	if (_impl->work_iface) {
+	// Emit any queued worker responses (calls a plugin callback)
+	if (_state_worker) {
+		_state_worker->emit_responses();
+	}
+	if (_worker) {
 		_worker->emit_responses();
+	}
+
+	// Notify the plugin that a work run cycle is complete
+	if (_impl->work_iface) {
 		if (_impl->work_iface->end_run) {
 			_impl->work_iface->end_run(_impl->instance->lv2_handle);
 		}
@@ -2488,11 +2921,16 @@ LV2World::LV2World()
 	ev_EventPort       = lilv_new_uri(world, LILV_URI_EVENT_PORT);
 	ext_logarithmic    = lilv_new_uri(world, LV2_PORT_PROPS__logarithmic);
 	ext_notOnGUI       = lilv_new_uri(world, LV2_PORT_PROPS__notOnGUI);
+	ext_expensive      = lilv_new_uri(world, LV2_PORT_PROPS__expensive);
+	ext_causesArtifacts= lilv_new_uri(world, LV2_PORT_PROPS__causesArtifacts);
+	ext_notAutomatic   = lilv_new_uri(world, LV2_PORT_PROPS__notAutomatic);
+	ext_rangeSteps     = lilv_new_uri(world, LV2_PORT_PROPS__rangeSteps);
 	lv2_AudioPort      = lilv_new_uri(world, LILV_URI_AUDIO_PORT);
 	lv2_ControlPort    = lilv_new_uri(world, LILV_URI_CONTROL_PORT);
 	lv2_InputPort      = lilv_new_uri(world, LILV_URI_INPUT_PORT);
 	lv2_OutputPort     = lilv_new_uri(world, LILV_URI_OUTPUT_PORT);
 	lv2_inPlaceBroken  = lilv_new_uri(world, LV2_CORE__inPlaceBroken);
+	lv2_isSideChain    = lilv_new_uri(world, LV2_CORE_PREFIX "isSideChain");
 	lv2_integer        = lilv_new_uri(world, LV2_CORE__integer);
 	lv2_default        = lilv_new_uri(world, LV2_CORE__default);
 	lv2_minimum        = lilv_new_uri(world, LV2_CORE__minimum);
@@ -2518,7 +2956,13 @@ LV2World::LV2World()
 	units_db           = lilv_new_uri(world, LV2_UNITS__db);
 	patch_writable     = lilv_new_uri(world, LV2_PATCH__writable);
 	patch_Message      = lilv_new_uri(world, LV2_PATCH__Message);
-	lv2_noSampleAccurateCtrl = lilv_new_uri(world, LV2_CORE_PREFIX "noSampleAccurateControls");
+#ifdef LV2_EXTENDED
+	lv2_noSampleAccurateCtrl    = lilv_new_uri(world, "http://ardour.org/lv2/ext#noSampleAccurateControls");
+	auto_can_write_automatation = lilv_new_uri(world, LV2_AUTOMATE_URI__can_write);
+	auto_automation_control     = lilv_new_uri(world, LV2_AUTOMATE_URI__control);
+	auto_automation_controlled  = lilv_new_uri(world, LV2_AUTOMATE_URI__controlled);
+	auto_automation_controller  = lilv_new_uri(world, LV2_AUTOMATE_URI__controller);
+#endif
 #ifdef HAVE_LV2_1_2_0
 	bufz_powerOf2BlockLength = lilv_new_uri(world, LV2_BUF_SIZE__powerOf2BlockLength);
 	bufz_fixedBlockLength    = lilv_new_uri(world, LV2_BUF_SIZE__fixedBlockLength);
@@ -2537,7 +2981,13 @@ LV2World::~LV2World()
 	lilv_node_free(bufz_fixedBlockLength);
 	lilv_node_free(bufz_powerOf2BlockLength);
 #endif
+#ifdef LV2_EXTENDED
 	lilv_node_free(lv2_noSampleAccurateCtrl);
+	lilv_node_free(auto_can_write_automatation);
+	lilv_node_free(auto_automation_control);
+	lilv_node_free(auto_automation_controlled);
+	lilv_node_free(auto_automation_controller);
+#endif
 	lilv_node_free(patch_Message);
 	lilv_node_free(patch_writable);
 	lilv_node_free(units_hz);
@@ -2560,11 +3010,16 @@ LV2World::~LV2World()
 	lilv_node_free(lv2_sampleRate);
 	lilv_node_free(lv2_reportsLatency);
 	lilv_node_free(lv2_integer);
+	lilv_node_free(lv2_isSideChain);
 	lilv_node_free(lv2_inPlaceBroken);
 	lilv_node_free(lv2_OutputPort);
 	lilv_node_free(lv2_InputPort);
 	lilv_node_free(lv2_ControlPort);
 	lilv_node_free(lv2_AudioPort);
+	lilv_node_free(ext_rangeSteps);
+	lilv_node_free(ext_notAutomatic);
+	lilv_node_free(ext_causesArtifacts);
+	lilv_node_free(ext_expensive);
 	lilv_node_free(ext_notOnGUI);
 	lilv_node_free(ext_logarithmic);
 	lilv_node_free(ev_EventPort);
diff --git a/libs/ardour/lxvst_plugin.cc b/libs/ardour/lxvst_plugin.cc
index 2c50144..3939048 100644
--- a/libs/ardour/lxvst_plugin.cc
+++ b/libs/ardour/lxvst_plugin.cc
@@ -25,7 +25,7 @@
 #include "ardour/session.h"
 #include "ardour/lxvst_plugin.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
@@ -150,8 +150,8 @@ LXVSTPluginInfo::get_presets (bool user_only) const
 		if (t->read ()) { // TODO read names only. skip parsing the actual data
 			XMLNode* root = t->root ();
 			for (XMLNodeList::const_iterator i = root->children().begin(); i != root->children().end(); ++i) {
-				XMLProperty* uri = (*i)->property (X_("uri"));
-				XMLProperty* label = (*i)->property (X_("label"));
+				XMLProperty const * uri = (*i)->property (X_("uri"));
+				XMLProperty const * label = (*i)->property (X_("label"));
 				p.push_back (Plugin::PresetRecord (uri->value(), label->value(), true));
 			}
 		}
diff --git a/libs/ardour/meter.cc b/libs/ardour/meter.cc
index fa9ee2f..430306c 100644
--- a/libs/ardour/meter.cc
+++ b/libs/ardour/meter.cc
@@ -78,7 +78,7 @@ PeakMeter::~PeakMeter ()
  * (runs in jack realtime context)
  */
 void
-PeakMeter::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end_frame*/, pframes_t nframes, bool)
+PeakMeter::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end_frame*/, double /*speed*/, pframes_t nframes, bool)
 {
 	if (!_active && !_pending_active) {
 		return;
@@ -87,6 +87,7 @@ PeakMeter::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end_fr
 	const bool do_reset_dpm = _reset_dpm;
 	_reset_max = false;
 	_reset_dpm = false;
+	_combined_peak = 0;
 
 	// cerr << "meter " << name() << " runs with " << bufs.available() << " inputs\n";
 
@@ -136,11 +137,12 @@ PeakMeter::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end_fr
 	// Meter audio in to the rest of the peaks
 	for (uint32_t i = 0; i < n_audio; ++i, ++n) {
 		if (bufs.get_audio(i).silent()) {
-			;
+			_peak_buffer[n] = 0;
 		} else {
 			_peak_buffer[n] = compute_peak (bufs.get_audio(i).data(), nframes, _peak_buffer[n]);
+			_peak_buffer[n] = std::min (_peak_buffer[n], 100.f); // cut off at +40dBFS for falloff.
 			_max_peak_signal[n] = std::max(_peak_buffer[n], _max_peak_signal[n]); // todo sync reset
-			_combined_peak =std::max(_peak_buffer[n], _combined_peak);
+			_combined_peak = std::max(_peak_buffer[n], _combined_peak);
 		}
 
 		if (do_reset_max) {
@@ -235,14 +237,23 @@ PeakMeter::can_support_io_configuration (const ChanCount& in, ChanCount& out)
 bool
 PeakMeter::configure_io (ChanCount in, ChanCount out)
 {
+	bool changed = false;
 	if (out != in) { // always 1:1
 		return false;
 	}
 
+	if (current_meters != in) {
+		changed = true;
+	}
+
 	current_meters = in;
 
 	set_max_channels (in);
 
+	if (changed) {
+		reset_max();
+	}
+
 	return Processor::configure_io (in, out);
 }
 
@@ -364,7 +375,6 @@ PeakMeter::meter_level(uint32_t n, MeterType type) {
 			break;
 		case MeterMCP:
 			mcptmp = _combined_peak;
-			_combined_peak = 0;
 			return accurate_coefficient_to_dB(mcptmp);
 		case MeterMaxSignal:
 			assert(0);
diff --git a/libs/ardour/midi_automation_list_binder.cc b/libs/ardour/midi_automation_list_binder.cc
index f7249d7..b01155b 100644
--- a/libs/ardour/midi_automation_list_binder.cc
+++ b/libs/ardour/midi_automation_list_binder.cc
@@ -35,10 +35,10 @@ MidiAutomationListBinder::MidiAutomationListBinder (boost::shared_ptr<MidiSource
 MidiAutomationListBinder::MidiAutomationListBinder (XMLNode* node, Session::SourceMap const & sources)
 	: _parameter (0, 0, 0)
 {
-	XMLProperty* source = node->property ("source-id");
+	XMLProperty const * source = node->property ("source-id");
 	assert (source);
 
-	XMLProperty* parameter = node->property ("parameter");
+	XMLProperty const * parameter = node->property ("parameter");
 	assert (parameter);
 
 	Session::SourceMap::const_iterator i = sources.find (PBD::ID (source->value()));
diff --git a/libs/ardour/midi_buffer.cc b/libs/ardour/midi_buffer.cc
index 3a03a03..41d638d 100644
--- a/libs/ardour/midi_buffer.cc
+++ b/libs/ardour/midi_buffer.cc
@@ -80,6 +80,14 @@ MidiBuffer::copy(const MidiBuffer& copy)
 	memcpy(_data, copy._data, copy._size);
 }
 
+void
+MidiBuffer::copy(MidiBuffer const * const copy)
+{
+	assert(_capacity >= copy->size ());
+	_size = copy->size ();
+	memcpy(_data, copy->data(), _size);
+}
+
 
 /** Read events from @a src starting at time @a offset into the START of this buffer, for
  * time duration @a nframes.  Relative time, where 0 = start of buffer.
diff --git a/libs/ardour/midi_clock_slave.cc b/libs/ardour/midi_clock_slave.cc
index 8c95272..f2dc4f9 100644
--- a/libs/ardour/midi_clock_slave.cc
+++ b/libs/ardour/midi_clock_slave.cc
@@ -35,7 +35,7 @@
 #include "ardour/slave.h"
 #include "ardour/tempo.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
@@ -82,8 +82,8 @@ MIDIClock_Slave::rebind (MidiPort& port)
 void
 MIDIClock_Slave::calculate_one_ppqn_in_frames_at(framepos_t time)
 {
-	const Tempo& current_tempo = session->tempo_map().tempo_at(time);
-	double frames_per_beat = current_tempo.frames_per_beat(session->frame_rate());
+	const Tempo& current_tempo = session->tempo_map().tempo_at_frame (time);
+	double const frames_per_beat = session->tempo_map().frames_per_beat_at (time, session->frame_rate());
 
 	double quarter_notes_per_beat = 4.0 / current_tempo.note_type();
 	double frames_per_quarter_note = frames_per_beat / quarter_notes_per_beat;
diff --git a/libs/ardour/midi_diskstream.cc b/libs/ardour/midi_diskstream.cc
index 485967b..4d3dd4e 100644
--- a/libs/ardour/midi_diskstream.cc
+++ b/libs/ardour/midi_diskstream.cc
@@ -58,7 +58,7 @@
 
 #include "midi++/types.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 #include <locale.h>
 
 using namespace std;
@@ -1213,7 +1213,7 @@ MidiDiskstream::get_state ()
 {
 	XMLNode& node (Diskstream::get_state());
 	char buf[64];
-	LocaleGuard lg (X_("C"));
+	LocaleGuard lg;
 
 	if (_write_source && _session.get_record_enabled()) {
 
@@ -1247,7 +1247,7 @@ MidiDiskstream::set_state (const XMLNode& node, int version)
 	XMLNodeList nlist = node.children();
 	XMLNodeIterator niter;
 	XMLNode* capture_pending_node = 0;
-	LocaleGuard lg (X_("C"));
+	LocaleGuard lg;
 
 	/* prevent write sources from being created */
 
diff --git a/libs/ardour/midi_model.cc b/libs/ardour/midi_model.cc
index 1950fbe..4e895c5 100644
--- a/libs/ardour/midi_model.cc
+++ b/libs/ardour/midi_model.cc
@@ -40,7 +40,7 @@
 #include "ardour/session.h"
 #include "ardour/types.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
@@ -491,7 +491,7 @@ Evoral::Sequence<MidiModel::TimeType>::NotePtr
 MidiModel::NoteDiffCommand::unmarshal_note (XMLNode *xml_note)
 {
 	unsigned int note;
-	XMLProperty* prop;
+	XMLProperty const * prop;
 	unsigned int channel;
 	MidiModel::TimeType time;
 	MidiModel::TimeType length;
@@ -599,7 +599,7 @@ MidiModel::NoteDiffCommand::marshal_change (const NoteChange& change)
 MidiModel::NoteDiffCommand::NoteChange
 MidiModel::NoteDiffCommand::unmarshal_change (XMLNode *xml_change)
 {
-	XMLProperty* prop;
+	XMLProperty const * prop;
 	NoteChange change;
 	change.note_id = 0;
 
@@ -876,7 +876,7 @@ MidiModel::SysExDiffCommand::marshal_change (const Change& change)
 MidiModel::SysExDiffCommand::Change
 MidiModel::SysExDiffCommand::unmarshal_change (XMLNode *xml_change)
 {
-	XMLProperty* prop;
+	XMLProperty const * prop;
 	Change change;
 
 	if ((prop = xml_change->property ("property")) != 0) {
@@ -1235,8 +1235,8 @@ MidiModel::PatchChangeDiffCommand::marshal_change (const Change& c)
 MidiModel::PatchChangePtr
 MidiModel::PatchChangeDiffCommand::unmarshal_patch_change (XMLNode* n)
 {
-	XMLProperty* prop;
-	XMLProperty* prop_id;
+	XMLProperty const * prop;
+	XMLProperty const * prop_id;
 	Evoral::event_id_t id = 0;
 	Evoral::Beats time = Evoral::Beats();
 	int channel = 0;
@@ -1277,7 +1277,7 @@ MidiModel::PatchChangeDiffCommand::unmarshal_patch_change (XMLNode* n)
 MidiModel::PatchChangeDiffCommand::Change
 MidiModel::PatchChangeDiffCommand::unmarshal_change (XMLNode* n)
 {
-	XMLProperty* prop;
+	XMLProperty const * prop;
 	Change c;
 	int an_int;
 
@@ -1482,8 +1482,9 @@ MidiModel::sync_to_source (const Glib::Threads::Mutex::Lock& source_lock)
 bool
 MidiModel::write_section_to (boost::shared_ptr<MidiSource>     source,
                              const Glib::Threads::Mutex::Lock& source_lock,
-                             Evoral::Beats                     begin_time,
-                             Evoral::Beats                     end_time)
+                             TimeType                          begin_time,
+                             TimeType                          end_time,
+                             bool                              offset_events)
 {
 	ReadLock lock(read_lock());
 	MidiStateTracker mst;
@@ -1495,21 +1496,17 @@ MidiModel::write_section_to (boost::shared_ptr<MidiSource>     source,
 	source->mark_streaming_midi_write_started (source_lock, note_mode());
 
 	for (Evoral::Sequence<TimeType>::const_iterator i = begin(TimeType(), true); i != end(); ++i) {
-		const Evoral::Event<Evoral::Beats>& ev (*i);
+		if (i->time() >= begin_time && i->time() < end_time) {
 
-		if (ev.time() >= begin_time && ev.time() < end_time) {
+			Evoral::MIDIEvent<TimeType> mev (*i, true); /* copy the event */
 
-			const Evoral::MIDIEvent<Evoral::Beats>* mev =
-				static_cast<const Evoral::MIDIEvent<Evoral::Beats>* > (&ev);
-
-			if (!mev) {
-				continue;
+			if (offset_events) {
+				mev.set_time(mev.time() - begin_time);
 			}
 
+			if (mev.is_note_off()) {
 
-			if (mev->is_note_off()) {
-
-				if (!mst.active (mev->note(), mev->channel())) {
+				if (!mst.active (mev.note(), mev.channel())) {
 					/* the matching note-on was outside the
 					   time range we were given, so just
 					   ignore this note-off.
@@ -1517,18 +1514,21 @@ MidiModel::write_section_to (boost::shared_ptr<MidiSource>     source,
 					continue;
 				}
 
-				source->append_event_beats (source_lock, *i);
-				mst.remove (mev->note(), mev->channel());
+				source->append_event_beats (source_lock, mev);
+				mst.remove (mev.note(), mev.channel());
 
-			} else if (mev->is_note_on()) {
-				mst.add (mev->note(), mev->channel());
-				source->append_event_beats(source_lock, *i);
+			} else if (mev.is_note_on()) {
+				mst.add (mev.note(), mev.channel());
+				source->append_event_beats(source_lock, mev);
 			} else {
-				source->append_event_beats(source_lock, *i);
+				source->append_event_beats(source_lock, mev);
 			}
 		}
 	}
 
+	if (offset_events) {
+		end_time -= begin_time;
+	}
 	mst.resolve_notes (*source, source_lock, end_time);
 
 	set_percussive(old_percussive);
diff --git a/libs/ardour/midi_patch_manager.cc b/libs/ardour/midi_patch_manager.cc
index 133f4ee..8a6d8df 100644
--- a/libs/ardour/midi_patch_manager.cc
+++ b/libs/ardour/midi_patch_manager.cc
@@ -29,7 +29,7 @@
 
 #include "ardour/search_paths.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
diff --git a/libs/ardour/midi_playlist.cc b/libs/ardour/midi_playlist.cc
index 7adbe70..e3274c7 100644
--- a/libs/ardour/midi_playlist.cc
+++ b/libs/ardour/midi_playlist.cc
@@ -36,7 +36,7 @@
 #include "ardour/session.h"
 #include "ardour/types.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 using namespace PBD;
@@ -48,7 +48,7 @@ MidiPlaylist::MidiPlaylist (Session& session, const XMLNode& node, bool hidden)
 	, _read_end(0)
 {
 #ifndef NDEBUG
-	const XMLProperty* prop = node.property("type");
+	XMLProperty const * prop = node.property("type");
 	assert(prop && DataType(prop->value()) == DataType::MIDI);
 #endif
 
diff --git a/libs/ardour/midi_playlist_source.cc b/libs/ardour/midi_playlist_source.cc
index 3d9c5b1..65c2794 100644
--- a/libs/ardour/midi_playlist_source.cc
+++ b/libs/ardour/midi_playlist_source.cc
@@ -25,7 +25,7 @@
 #include "ardour/midi_playlist.h"
 #include "ardour/midi_playlist_source.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
diff --git a/libs/ardour/midi_region.cc b/libs/ardour/midi_region.cc
index 56472e4..eef2811 100644
--- a/libs/ardour/midi_region.cc
+++ b/libs/ardour/midi_region.cc
@@ -28,7 +28,7 @@
 #include <glibmm/fileutils.h>
 #include <glibmm/miscutils.h>
 
-#include "evoral/types.hpp"
+#include "evoral/Beats.hpp"
 
 #include "pbd/xml++.h"
 #include "pbd/basename.h"
@@ -44,7 +44,7 @@
 #include "ardour/tempo.h"
 #include "ardour/types.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 #include <locale.h>
 
 using namespace std;
@@ -91,9 +91,9 @@ MidiRegion::MidiRegion (const SourceList& srcs)
 MidiRegion::MidiRegion (boost::shared_ptr<const MidiRegion> other)
 	: Region (other)
 	, _start_beats (Properties::start_beats, other->_start_beats)
-	, _length_beats (Properties::length_beats, Evoral::Beats())
+	, _length_beats (Properties::length_beats, other->_length_beats)
 {
-	update_length_beats ();
+	//update_length_beats ();
 	register_properties ();
 
 	assert(_name.val().find("/") == string::npos);
@@ -102,17 +102,13 @@ MidiRegion::MidiRegion (boost::shared_ptr<const MidiRegion> other)
 }
 
 /** Create a new MidiRegion that is part of an existing one */
-MidiRegion::MidiRegion (boost::shared_ptr<const MidiRegion> other, frameoffset_t offset)
-	: Region (other, offset)
+MidiRegion::MidiRegion (boost::shared_ptr<const MidiRegion> other, frameoffset_t offset, const int32_t sub_num)
+	: Region (other, offset, sub_num)
 	, _start_beats (Properties::start_beats, Evoral::Beats())
-	, _length_beats (Properties::length_beats, Evoral::Beats())
+	, _length_beats (Properties::length_beats, other->_length_beats)
 {
-	BeatsFramesConverter bfc (_session.tempo_map(), _position);
-	Evoral::Beats const offset_beats = bfc.from (offset);
-
-	_start_beats  = other->_start_beats.val() + offset_beats;
-	_length_beats = other->_length_beats.val() - offset_beats;
-
+	_start_beats = Evoral::Beats (_session.tempo_map().exact_beat_at_frame ((other->_position + offset), sub_num) - other->beat()) + other->_start_beats;
+	update_length_beats (sub_num);
 	register_properties ();
 
 	assert(_name.val().find("/") == string::npos);
@@ -124,6 +120,37 @@ MidiRegion::~MidiRegion ()
 {
 }
 
+/** Export the MIDI data of the MidiRegion to a new MIDI file (SMF).
+ */
+bool
+MidiRegion::do_export (string path) const
+{
+	boost::shared_ptr<MidiSource> newsrc;
+
+	/* caller must check for pre-existing file */
+	assert (!path.empty());
+	assert (!Glib::file_test (path, Glib::FILE_TEST_EXISTS));
+	newsrc = boost::dynamic_pointer_cast<MidiSource>(
+		SourceFactory::createWritable(DataType::MIDI, _session,
+		                              path, false, _session.frame_rate()));
+
+	BeatsFramesConverter bfc (_session.tempo_map(), _position);
+	Evoral::Beats const bbegin = bfc.from (_start);
+	Evoral::Beats const bend = bfc.from (_start + _length);
+
+	{
+		/* Lock our source since we'll be reading from it.  write_to() will
+		   take a lock on newsrc. */
+		Source::Lock lm (midi_source(0)->mutex());
+		if (midi_source(0)->export_write_to (lm, newsrc, bbegin, bend)) {
+			return false;
+		}
+	}
+
+	return true;
+}
+
+
 /** Create a new MidiRegion that has its own version of some/all of the Source used by another.
  */
 boost::shared_ptr<MidiRegion>
@@ -166,7 +193,10 @@ MidiRegion::clone (boost::shared_ptr<MidiSource> newsrc) const
 	plist.add (Properties::length_beats, _length_beats);
 	plist.add (Properties::layer, 0);
 
-	return boost::dynamic_pointer_cast<MidiRegion> (RegionFactory::create (newsrc, plist, true));
+	boost::shared_ptr<MidiRegion> ret (boost::dynamic_pointer_cast<MidiRegion> (RegionFactory::create (newsrc, plist, true)));
+	ret->set_beat (beat());
+
+	return ret;
 }
 
 void
@@ -175,7 +205,8 @@ MidiRegion::post_set (const PropertyChange& pc)
 	Region::post_set (pc);
 
 	if (pc.contains (Properties::length) && !pc.contains (Properties::length_beats)) {
-		update_length_beats ();
+		/* update non-musically */
+		update_length_beats (0);
 	} else if (pc.contains (Properties::start) && !pc.contains (Properties::start_beats)) {
 		set_start_beats_from_start_frames ();
 	}
@@ -184,49 +215,71 @@ MidiRegion::post_set (const PropertyChange& pc)
 void
 MidiRegion::set_start_beats_from_start_frames ()
 {
-	BeatsFramesConverter c (_session.tempo_map(), _position - _start);
-	_start_beats = c.from (_start);
+	_start_beats = Evoral::Beats (beat() - _session.tempo_map().beat_at_frame (_position - _start));
 }
 
 void
-MidiRegion::set_length_internal (framecnt_t len)
+MidiRegion::set_length_internal (framecnt_t len, const int32_t sub_num)
 {
-	Region::set_length_internal (len);
-	update_length_beats ();
+	Region::set_length_internal (len, sub_num);
+	update_length_beats (sub_num);
 }
 
 void
-MidiRegion::update_after_tempo_map_change ()
+MidiRegion::update_after_tempo_map_change (bool /* send */)
 {
-	Region::update_after_tempo_map_change ();
+	boost::shared_ptr<Playlist> pl (playlist());
 
-	/* _position has now been updated for the new tempo map */
-	_start = _position - _session.tempo_map().framepos_minus_beats (_position, _start_beats);
+	if (!pl || position_lock_style() != MusicTime) {
+		return;
+	}
+
+	const framepos_t old_pos = _position;
+	const framepos_t old_length = _length;
+	const framepos_t old_start = _start;
+
+	Region::update_after_tempo_map_change (false);
+
+	/* _start has now been updated. */
+	_length = _session.tempo_map().frame_at_beat (beat() + _length_beats.val().to_double()) - _position;
+
+	PropertyChange s_and_l;
+	if (old_start != _start) {
+		s_and_l.add (Properties::start);
+	}
+	if (old_length != _length) {
+		s_and_l.add (Properties::length);
+	}
+	if (old_pos != _position) {
+		s_and_l.add (Properties::position);
+	}
 
-	send_change (Properties::start);
+	send_change (s_and_l);
 }
 
 void
-MidiRegion::update_length_beats ()
+MidiRegion::update_length_beats (const int32_t sub_num)
 {
-	BeatsFramesConverter converter (_session.tempo_map(), _position);
-	_length_beats = converter.from (_length);
+	_length_beats = Evoral::Beats (_session.tempo_map().exact_beat_at_frame (_position + _length, sub_num) - beat());
 }
 
 void
-MidiRegion::set_position_internal (framepos_t pos, bool allow_bbt_recompute)
+MidiRegion::set_position_internal (framepos_t pos, bool allow_bbt_recompute, const int32_t sub_num)
 {
-	Region::set_position_internal (pos, allow_bbt_recompute);
-	/* zero length regions don't exist - so if _length_beats is zero, this object
-	   is under construction.
-	*/
-	if (_length_beats.val() == Evoral::Beats()) {
-		/* leave _length_beats alone, and change _length to reflect the state of things
-		   at the new position (tempo map may dictate a different number of frames
-		*/
-		BeatsFramesConverter converter (_session.tempo_map(), _position);
-		Region::set_length_internal (converter.to (_length_beats));
+	Region::set_position_internal (pos, allow_bbt_recompute, sub_num);
+
+	/* set _start to new position in tempo map */
+	_start = _position - _session.tempo_map().frame_at_beat (beat() - _start_beats.val().to_double());
+
+	/* in construction from src */
+	if (_length_beats == Evoral::Beats()) {
+		update_length_beats (sub_num);
 	}
+
+	/* leave _length_beats alone, and change _length to reflect the state of things
+	   at the new position (tempo map may dictate a different number of frames).
+	*/
+	Region::set_length_internal (_session.tempo_map().frame_at_beat (beat() + _length_beats.val().to_double()) - _position, sub_num);
 }
 
 framecnt_t
@@ -309,7 +362,9 @@ MidiRegion::_read_at (const SourceList&              /*srcs*/,
 			to_read, // read duration in frames
 			tracker,
 			filter,
-			_filtered_parameters
+			_filtered_parameters,
+			beat(),
+			_start_beats.val().to_double()
 		    ) != to_read) {
 		return 0; /* "read nothing" */
 	}
@@ -329,7 +384,10 @@ MidiRegion::set_state (const XMLNode& node, int version)
 	int ret = Region::set_state (node, version);
 
 	if (ret == 0) {
-		update_length_beats ();
+		/* set length beats to the frame (non-musical) */
+		if (position_lock_style() == AudioTime) {
+			update_length_beats (0);
+		}
 	}
 
 	return ret;
@@ -459,8 +517,79 @@ MidiRegion::fix_negative_start ()
 }
 
 void
-MidiRegion::set_start_internal (framecnt_t s)
+MidiRegion::set_start_internal (framecnt_t s, const int32_t sub_num)
 {
-	Region::set_start_internal (s);
-	set_start_beats_from_start_frames ();
+	Region::set_start_internal (s, sub_num);
+
+	if (position_lock_style() == AudioTime) {
+		set_start_beats_from_start_frames ();
+		}
+}
+
+void
+MidiRegion::trim_to_internal (framepos_t position, framecnt_t length, const int32_t sub_num)
+{
+	framepos_t new_start;
+
+	if (locked()) {
+		return;
+	}
+
+	PropertyChange what_changed;
+
+	/* beat has been set exactly by set_position_internal, but the source starts on a frame.
+	   working in beats seems the correct thing to do, but reports of a missing first note
+	   on playback suggest otherwise. for now, we work in exact beats.
+	*/
+	const double pos_beat = _session.tempo_map().exact_beat_at_frame (position, sub_num);
+	const double beat_delta = pos_beat - beat();
+
+	/* Set position before length, otherwise for MIDI regions this bad thing happens:
+	 * 1. we call set_length_internal; length in beats is computed using the region's current
+	 *    (soon-to-be old) position
+	 * 2. we call set_position_internal; position is set and length in frames re-computed using
+	 *    length in beats from (1) but at the new position, which is wrong if the region
+	 *    straddles a tempo/meter change.
+	 */
+
+	if (_position != position) {
+		set_position_internal (position, true, sub_num);
+		what_changed.add (Properties::position);
+	}
+
+	const double new_start_beat = _start_beats.val().to_double() + beat_delta;
+	new_start = _position - _session.tempo_map().frame_at_beat (beat() - new_start_beat);
+
+	if (!verify_start_and_length (new_start, length)) {
+		return;
+	}
+
+	if (_start != new_start) {
+		_start_beats = Evoral::Beats (new_start_beat);
+		what_changed.add (Properties::start_beats);
+
+		set_start_internal (new_start, sub_num);
+		what_changed.add (Properties::start);
+	}
+
+	if (_length != length) {
+		set_length_internal (length, sub_num);
+		what_changed.add (Properties::length);
+		what_changed.add (Properties::length_beats);
+	}
+
+	set_whole_file (false);
+
+	PropertyChange start_and_length;
+
+	start_and_length.add (Properties::start);
+	start_and_length.add (Properties::length);
+
+	if (what_changed.contains (start_and_length)) {
+		first_edit ();
+	}
+
+	if (!what_changed.empty()) {
+		send_change (what_changed);
+	}
 }
diff --git a/libs/ardour/midi_scene_change.cc b/libs/ardour/midi_scene_change.cc
index ed0729b..969dadb 100644
--- a/libs/ardour/midi_scene_change.cc
+++ b/libs/ardour/midi_scene_change.cc
@@ -23,7 +23,7 @@
 #include "ardour/midi_port.h"
 #include "ardour/midi_scene_change.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace PBD;
 using namespace ARDOUR;
@@ -123,7 +123,7 @@ MIDISceneChange::set_state (const XMLNode& node, int /* version-ignored */)
 		return -1;
 	}
 
-	const XMLProperty* prop;
+	XMLProperty const * prop;
 
 	if ((prop = node.property (X_("program"))) == 0) {
 		return -1;
diff --git a/libs/ardour/midi_scene_changer.cc b/libs/ardour/midi_scene_changer.cc
index 7f6c865..07eb549 100644
--- a/libs/ardour/midi_scene_changer.cc
+++ b/libs/ardour/midi_scene_changer.cc
@@ -30,7 +30,7 @@
 #include "ardour/midi_scene_changer.h"
 #include "ardour/session.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 
diff --git a/libs/ardour/midi_source.cc b/libs/ardour/midi_source.cc
index 0314a92..97bce4b 100644
--- a/libs/ardour/midi_source.cc
+++ b/libs/ardour/midi_source.cc
@@ -44,10 +44,11 @@
 #include "ardour/midi_source.h"
 #include "ardour/midi_state_tracker.h"
 #include "ardour/session.h"
+#include "ardour/tempo.h"
 #include "ardour/session_directory.h"
 #include "ardour/source_factory.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 namespace ARDOUR { template <typename T> class MidiRingBuffer; }
 
@@ -113,7 +114,7 @@ MidiSource::get_state ()
 int
 MidiSource::set_state (const XMLNode& node, int /*version*/)
 {
-	const XMLProperty* prop;
+	XMLProperty const * prop;
 	if ((prop = node.property ("captured-for")) != 0) {
 		_captured_for = prop->value();
 	}
@@ -192,9 +193,11 @@ MidiSource::midi_read (const Lock&                        lm,
                        framecnt_t                         cnt,
                        MidiStateTracker*                  tracker,
                        MidiChannelFilter*                 filter,
-                       const std::set<Evoral::Parameter>& filtered) const
+                       const std::set<Evoral::Parameter>& filtered,
+		       double                             beat,
+		       double                             start_beat) const
 {
-	BeatsFramesConverter converter(_session.tempo_map(), source_start);
+	//BeatsFramesConverter converter(_session.tempo_map(), source_start);
 
 	DEBUG_TRACE (DEBUG::MidiSourceIO,
 	             string_compose ("MidiSource::midi_read() %5 sstart %1 start %2 cnt %3 tracker %4\n",
@@ -247,12 +250,14 @@ MidiSource::midi_read (const Lock&                        lm,
 			 * some way (maybe keep an iterator per playlist).
 			 */
 			for (i = _model->begin(); i != _model->end(); ++i) {
-				const framecnt_t time_frames = converter.to(i->time());
-				if (time_frames >= start) {
+				if (i->time().to_double() + (beat - start_beat) >= beat) {
 					break;
 				}
 			}
 			_model_iter_valid = true;
+			if (!linear_read) {
+				_model->active_notes().clear();
+			}
 #endif
 		}
 
@@ -260,21 +265,21 @@ MidiSource::midi_read (const Lock&                        lm,
 
 		// Copy events in [start, start + cnt) into dst
 		for (; i != _model->end(); ++i) {
-			const framecnt_t time_frames = converter.to(i->time());
-			if (time_frames < start + cnt) {
+			const framecnt_t time_frames = _session.tempo_map().frame_at_beat (i->time().to_double() + (beat - start_beat));
+
+			if (time_frames < start + cnt + source_start) {
 				if (filter && filter->filter(i->buffer(), i->size())) {
 					DEBUG_TRACE (DEBUG::MidiSourceIO,
 					             string_compose ("%1: filter event @ %2 type %3 size %4\n",
-					                             _name, time_frames + source_start, i->event_type(), i->size()));
+					                             _name, time_frames, i->event_type(), i->size()));
 					continue;
 				}
-
 				// Offset by source start to convert event time to session time
-				dst.write (time_frames + source_start, i->event_type(), i->size(), i->buffer());
+				dst.write (time_frames, i->event_type(), i->size(), i->buffer());
 
 				DEBUG_TRACE (DEBUG::MidiSourceIO,
 				             string_compose ("%1: add event @ %2 type %3 size %4\n",
-				                             _name, time_frames + source_start, i->event_type(), i->size()));
+				                             _name, time_frames, i->event_type(), i->size()));
 
 				if (tracker) {
 					tracker->track (*i);
@@ -380,6 +385,23 @@ MidiSource::mark_streaming_write_completed (const Lock& lock)
 }
 
 int
+MidiSource::export_write_to (const Lock& lock, boost::shared_ptr<MidiSource> newsrc, Evoral::Beats begin, Evoral::Beats end)
+{
+	Lock newsrc_lock (newsrc->mutex ());
+
+	if (!_model) {
+		error << string_compose (_("programming error: %1"), X_("no model for MidiSource during export"));
+		return -1;
+	}
+
+	_model->write_section_to (newsrc, newsrc_lock, begin, end, true);
+
+	newsrc->flush_midi(newsrc_lock);
+
+	return 0;
+}
+
+int
 MidiSource::write_to (const Lock& lock, boost::shared_ptr<MidiSource> newsrc, Evoral::Beats begin, Evoral::Beats end)
 {
 	Lock newsrc_lock (newsrc->mutex ());
diff --git a/libs/ardour/midi_state_tracker.cc b/libs/ardour/midi_state_tracker.cc
index 0403461..884d1e1 100644
--- a/libs/ardour/midi_state_tracker.cc
+++ b/libs/ardour/midi_state_tracker.cc
@@ -55,7 +55,7 @@ MidiStateTracker::add (uint8_t note, uint8_t chn)
 	++_active_notes[note + 128 * chn];
 
 	if (_active_notes[note+128 * chn] > 1) {
-		cerr << this << " note " << (int) note << '/' << (int) chn << " was already on, now at " << (int) _active_notes[note+128*chn] << endl;
+		//cerr << this << " note " << (int) note << '/' << (int) chn << " was already on, now at " << (int) _active_notes[note+128*chn] << endl;
 	}
 
 	DEBUG_TRACE (PBD::DEBUG::MidiTrackers, string_compose ("%1 ON %2/%3 voices %5 total on %4\n",
diff --git a/libs/ardour/midi_stretch.cc b/libs/ardour/midi_stretch.cc
index 71ffcc2..70f44e1 100644
--- a/libs/ardour/midi_stretch.cc
+++ b/libs/ardour/midi_stretch.cc
@@ -26,7 +26,7 @@
 #include "ardour/midi_stretch.h"
 #include "ardour/types.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
@@ -114,8 +114,8 @@ MidiStretch::run (boost::shared_ptr<Region> r, Progress*)
 	new_src->copy_interpolation_from (src);
 
 	const int ret = finish (region, nsrcs, new_name);
-
-	results[0]->set_length((framecnt_t) floor (r->length() * _request.time_fraction));
+	/* non-musical */
+	results[0]->set_length((framecnt_t) floor (r->length() * _request.time_fraction), 0);
 
 	return ret;
 }
diff --git a/libs/ardour/midi_track.cc b/libs/ardour/midi_track.cc
index da47fab..b79a1cf 100644
--- a/libs/ardour/midi_track.cc
+++ b/libs/ardour/midi_track.cc
@@ -44,6 +44,7 @@
 #include "ardour/midi_port.h"
 #include "ardour/midi_region.h"
 #include "ardour/midi_track.h"
+#include "ardour/monitor_control.h"
 #include "ardour/parameter_types.h"
 #include "ardour/port.h"
 #include "ardour/processor.h"
@@ -53,7 +54,7 @@
 #include "ardour/session_playlists.h"
 #include "ardour/utils.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 namespace ARDOUR {
 class InterThreadInfo;
@@ -66,8 +67,8 @@ using namespace std;
 using namespace ARDOUR;
 using namespace PBD;
 
-MidiTrack::MidiTrack (Session& sess, string name, Route::Flag flag, TrackMode mode)
-	: Track (sess, name, flag, mode, DataType::MIDI)
+MidiTrack::MidiTrack (Session& sess, string name, TrackMode mode)
+	: Track (sess, name, PresentationInfo::MidiTrack, mode, DataType::MIDI)
 	, _immediate_events(1024) // FIXME: size?
 	, _step_edit_ring_buffer(64) // FIXME: size?
 	, _note_mode(Sustained)
@@ -103,24 +104,24 @@ MidiTrack::create_diskstream ()
 }
 
 
-void
-MidiTrack::set_record_enabled (bool yn, Controllable::GroupControlDisposition group_override)
+bool
+MidiTrack::can_be_record_safe ()
 {
 	if (_step_editing) {
-		return;
+		return false;
 	}
 
-	Track::set_record_enabled (yn, group_override);
+	return Track::can_be_record_safe ();
 }
 
-void
-MidiTrack::set_record_safe (bool yn, Controllable::GroupControlDisposition group_override)
+bool
+MidiTrack::can_be_record_enabled ()
 {
-	if (_step_editing) { /* REQUIRES REVIEW */
-		return;
+	if (_step_editing) {
+		return false;
 	}
 
-	Track::set_record_safe (yn, group_override);
+	return Track::can_be_record_enabled ();
 }
 
 void
@@ -161,7 +162,7 @@ MidiTrack::midi_diskstream() const
 int
 MidiTrack::set_state (const XMLNode& node, int version)
 {
-	const XMLProperty *prop;
+	XMLProperty const * prop;
 
 	/* This must happen before Track::set_state(), as there will be a buffer
 	   fill during that call, and we must fill buffers using the correct
@@ -272,8 +273,8 @@ void
 MidiTrack::set_state_part_two ()
 {
 	XMLNode* fnode;
-	XMLProperty* prop;
-	LocaleGuard lg (X_("C"));
+	XMLProperty const * prop;
+	LocaleGuard lg;
 
 	/* This is called after all session state has been restored but before
 	   have been made ports and connections are established.
@@ -372,7 +373,7 @@ MidiTrack::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame
 
 	if (!_active) {
 		silence (nframes);
-		if (_meter_point == MeterInput && (_monitoring & MonitorInput || _diskstream->record_enabled())) {
+		if (_meter_point == MeterInput && ((_monitoring_control->monitoring_choice() & MonitorInput) || _diskstream->record_enabled())) {
 			_meter->reset();
 		}
 		return 0;
@@ -395,16 +396,6 @@ MidiTrack::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame
 		return dret;
 	}
 
-	if (_mute_control->list() && _mute_control->automation_playback()) {
-		bool        valid = false;
-		const float mute  = _mute_control->list()->rt_safe_eval(transport_frame, valid);
-		if (mute >= 0.5 && !muted()) {
-			_mute_control->set_value_unchecked(1.0);  // mute
-		} else if (mute < 0.5 && muted()) {
-			_mute_control->set_value_unchecked(0.0);  // unmute
-		}
-	}
-
 	BufferSet& bufs = _session.get_route_buffers (n_process_buffers());
 
 	fill_buffers_with_input (bufs, _input, nframes);
@@ -412,8 +403,8 @@ MidiTrack::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame
 	/* filter captured data before meter sees it */
 	_capture_filter.filter (bufs);
 
-	if (_meter_point == MeterInput && (_monitoring & MonitorInput || _diskstream->record_enabled())) {
-		_meter->run (bufs, start_frame, end_frame, nframes, true);
+	if (_meter_point == MeterInput && ((_monitoring_control->monitoring_choice() & MonitorInput) || _diskstream->record_enabled())) {
+		_meter->run (bufs, start_frame, end_frame, 1.0 /*speed()*/, nframes, true);
 	}
 
 
@@ -453,12 +444,7 @@ MidiTrack::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame
 	process_output_buffers (bufs, start_frame, end_frame, nframes,
 				declick, (!diskstream->record_enabled() && !_session.transport_stopped()));
 
-	for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
-		boost::shared_ptr<Delivery> d = boost::dynamic_pointer_cast<Delivery> (*i);
-		if (d) {
-			d->flush_buffers (nframes);
-		}
-	}
+	flush_processor_buffers_locked (nframes);
 
 	need_butler = diskstream->commit (playback_distance);
 
@@ -726,22 +712,7 @@ MidiTrack::set_parameter_automation_state (Evoral::Parameter param, AutoState st
 }
 
 void
-MidiTrack::MidiControl::set_value (double val, PBD::Controllable::GroupControlDisposition group_override)
-{
-	if (writable()) {
-		_set_value (val, group_override);
-	}
-}
-
-void
-MidiTrack::MidiControl::set_value_unchecked (double val)
-{
-	/* used only by automation playback */
-	_set_value (val, Controllable::NoGroup);
-}
-
-void
-MidiTrack::MidiControl::_set_value (double val, PBD::Controllable::GroupControlDisposition group_override)
+MidiTrack::MidiControl::actually_set_value (double val, PBD::Controllable::GroupControlDisposition group_override)
 {
 	const Evoral::Parameter &parameter = _list ? _list->parameter() : Control::parameter();
 	const Evoral::ParameterDescriptor &desc = EventTypeMap::instance().descriptor(parameter);
@@ -798,7 +769,7 @@ MidiTrack::MidiControl::_set_value (double val, PBD::Controllable::GroupControlD
 		_route->write_immediate_event(size,  ev);
 	}
 
-	AutomationControl::set_value(val, group_override);
+	AutomationControl::actually_set_value(val, group_override);
 }
 
 void
@@ -934,7 +905,7 @@ MidiTrack::act_on_mute ()
 		return;
 	}
 
-	if (muted() || _mute_master->muted_by_others_at(MuteMaster::AllPoints)) {
+	if (muted() || _mute_master->muted_by_others_soloing_at (MuteMaster::AllPoints)) {
 		/* only send messages for channels we are using */
 
 		uint16_t mask = _playback_filter.get_channel_mask();
@@ -958,35 +929,27 @@ MidiTrack::act_on_mute ()
 }
 
 void
-MidiTrack::set_monitoring (MonitorChoice mc, Controllable::GroupControlDisposition gcd)
+MidiTrack::monitoring_changed (bool self, Controllable::GroupControlDisposition gcd)
 {
-	if (use_group (gcd, &RouteGroup::is_monitoring)) {
-		_route_group->apply (&Track::set_monitoring, mc, Controllable::NoGroup);
-		return;
-	}
+	Track::monitoring_changed (self, gcd);
 
-	if (mc != _monitoring) {
+	/* monitoring state changed, so flush out any on notes at the
+	 * port level.
+	 */
 
-		Track::set_monitoring (mc, gcd);
+	PortSet& ports (_output->ports());
 
-		/* monitoring state changed, so flush out any on notes at the
-		 * port level.
-		 */
-
-		PortSet& ports (_output->ports());
-
-		for (PortSet::iterator p = ports.begin(); p != ports.end(); ++p) {
-			boost::shared_ptr<MidiPort> mp = boost::dynamic_pointer_cast<MidiPort> (*p);
-			if (mp) {
-				mp->require_resolve ();
-			}
+	for (PortSet::iterator p = ports.begin(); p != ports.end(); ++p) {
+		boost::shared_ptr<MidiPort> mp = boost::dynamic_pointer_cast<MidiPort> (*p);
+		if (mp) {
+			mp->require_resolve ();
 		}
+	}
 
-		boost::shared_ptr<MidiDiskstream> md (midi_diskstream());
+	boost::shared_ptr<MidiDiskstream> md (midi_diskstream());
 
-		if (md) {
-			md->reset_tracker ();
-		}
+	if (md) {
+		md->reset_tracker ();
 	}
 }
 
@@ -999,4 +962,3 @@ MidiTrack::monitoring_state () const
 	}
 	return ms;
 }
-
diff --git a/libs/ardour/midi_ui.cc b/libs/ardour/midi_ui.cc
index 1d2fe7c..eaacde2 100644
--- a/libs/ardour/midi_ui.cc
+++ b/libs/ardour/midi_ui.cc
@@ -37,7 +37,7 @@ using namespace ARDOUR;
 using namespace PBD;
 using namespace Glib;
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 MidiControlUI* MidiControlUI::_instance = 0;
 
@@ -82,8 +82,13 @@ MidiControlUI::do_request (MidiUIRequest* req)
 }
 
 bool
-MidiControlUI::midi_input_handler (IOCondition ioc, boost::shared_ptr<AsyncMIDIPort> port)
+MidiControlUI::midi_input_handler (IOCondition ioc, boost::weak_ptr<AsyncMIDIPort> wport)
 {
+	boost::shared_ptr<AsyncMIDIPort> port = wport.lock ();
+	if (!port) {
+		return false;
+	}
+
 	DEBUG_TRACE (DEBUG::MidiIO, string_compose ("something happend on  %1\n", boost::shared_ptr<ARDOUR::Port> (port)->name()));
 
 	if (ioc & ~IO_IN) {
@@ -130,7 +135,8 @@ MidiControlUI::reset_ports ()
 	}
 
 	for (vector<boost::shared_ptr<AsyncMIDIPort> >::const_iterator pi = ports.begin(); pi != ports.end(); ++pi) {
-		(*pi)->xthread().set_receive_handler (sigc::bind (sigc::mem_fun (this, &MidiControlUI::midi_input_handler), *pi));
+		(*pi)->xthread().set_receive_handler (sigc::bind (
+					sigc::mem_fun (this, &MidiControlUI::midi_input_handler), boost::weak_ptr<AsyncMIDIPort>(*pi)));
 		(*pi)->xthread().attach (_main_loop->get_context());
 	}
 }
diff --git a/libs/ardour/midiport_manager.cc b/libs/ardour/midiport_manager.cc
index 7f3f05a..7f5dee4 100644
--- a/libs/ardour/midiport_manager.cc
+++ b/libs/ardour/midiport_manager.cc
@@ -22,7 +22,7 @@
 #include "ardour/midiport_manager.h"
 #include "ardour/rc_configuration.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 using namespace std;
@@ -111,7 +111,7 @@ MidiPortManager::create_ports ()
 void
 MidiPortManager::set_midi_port_states (const XMLNodeList&nodes)
 {
-	XMLProperty* prop;
+	XMLProperty const * prop;
 	typedef map<std::string,boost::shared_ptr<Port> > PortMap;
 	PortMap ports;
 	const int version = 0;
diff --git a/libs/ardour/monitor_control.cc b/libs/ardour/monitor_control.cc
new file mode 100644
index 0000000..907a747
--- /dev/null
+++ b/libs/ardour/monitor_control.cc
@@ -0,0 +1,80 @@
+/*
+    Copyright (C) 2016 Paul Davis
+
+    This program is free software; you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by the Free
+    Software Foundation; either version 2 of the License, or (at your option)
+    any later version.
+
+    This program is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc.,
+    675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#include "ardour/monitor_control.h"
+
+#include "pbd/i18n.h"
+
+using namespace ARDOUR;
+using namespace PBD;
+
+MonitorControl::MonitorControl (Session& session, std::string const & name, Monitorable& m)
+	: SlavableAutomationControl (session, MonitoringAutomation, ParameterDescriptor (MonitoringAutomation),
+	                             boost::shared_ptr<AutomationList>(new AutomationList(Evoral::Parameter(MonitoringAutomation))),
+	                             name)
+
+	, _monitorable (m)
+	, _monitoring (MonitorAuto)
+{
+	_list->set_interpolation(Evoral::ControlList::Discrete);
+	/* monitoring changes must be synchronized by the process cycle */
+	set_flags (Controllable::Flag (flags() | Controllable::RealTime));
+}
+
+void
+MonitorControl::actually_set_value (double val, Controllable::GroupControlDisposition gcd)
+{
+	int v = (int) val;
+	switch (v) {
+	case MonitorAuto:
+	case MonitorInput:
+	case MonitorDisk:
+	case MonitorCue:
+		break;
+	default:
+		/* illegal value */
+		return;
+	}
+
+	_monitoring = MonitorChoice (v);
+	AutomationControl::actually_set_value (val, gcd);
+}
+
+XMLNode&
+MonitorControl::get_state ()
+{
+	XMLNode& node (SlavableAutomationControl::get_state());
+	node.add_property (X_("monitoring"), enum_2_string (_monitoring));
+	return node;
+}
+
+int
+MonitorControl::set_state (XMLNode const & node, int version)
+{
+	SlavableAutomationControl::set_state (node, version);
+
+	const XMLProperty* prop;
+
+	if ((prop = node.property (X_("monitoring"))) != 0) {
+		_monitoring = MonitorChoice (string_2_enum (prop->value(), _monitoring));
+	} else {
+		_monitoring = MonitorAuto;
+	}
+
+	return 0;
+}
diff --git a/libs/ardour/monitor_processor.cc b/libs/ardour/monitor_processor.cc
index 6b73af6..811d5a1 100644
--- a/libs/ardour/monitor_processor.cc
+++ b/libs/ardour/monitor_processor.cc
@@ -28,7 +28,7 @@
 #include "ardour/monitor_processor.h"
 #include "ardour/session.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 using namespace PBD;
@@ -37,11 +37,11 @@ using namespace std;
 /* specialize for bool because of set_value() semantics */
 
 namespace ARDOUR {
-	template<> void MPControl<bool>::set_value (double v, PBD::Controllable::GroupControlDisposition /*group_override*/) {
+	template<> void MPControl<bool>::set_value (double v, PBD::Controllable::GroupControlDisposition gcd) {
                 bool newval = fabs (v) >= 0.5;
                 if (newval != _value) {
                         _value = newval;
-                        Changed(); /* EMIT SIGNAL */
+                        Changed (true, gcd); /* EMIT SIGNAL */
                 }
         }
 }
@@ -112,7 +112,7 @@ MonitorProcessor::set_state (const XMLNode& node, int version)
                 return ret;
         }
 
-        const XMLProperty* prop;
+        XMLProperty const * prop;
 
         if ((prop = node.property (X_("type"))) == 0) {
                 error << string_compose (X_("programming error: %1"), X_("MonitorProcessor XML settings have no type information"))
@@ -226,7 +226,7 @@ MonitorProcessor::set_state (const XMLNode& node, int version)
 XMLNode&
 MonitorProcessor::state (bool full)
 {
-	LocaleGuard lg (X_("C"));
+	LocaleGuard lg;
         XMLNode& node (Processor::state (full));
         char buf[64];
 
@@ -270,7 +270,7 @@ MonitorProcessor::state (bool full)
 }
 
 void
-MonitorProcessor::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end_frame*/, pframes_t nframes, bool /*result_required*/)
+MonitorProcessor::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end_frame*/, double /*speed*/, pframes_t nframes, bool /*result_required*/)
 {
         uint32_t chn = 0;
         gain_t target_gain;
diff --git a/libs/ardour/mtc_slave.cc b/libs/ardour/mtc_slave.cc
index 25aa93d..102694e 100644
--- a/libs/ardour/mtc_slave.cc
+++ b/libs/ardour/mtc_slave.cc
@@ -34,7 +34,7 @@
 
 #include <glibmm/timer.h>
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
diff --git a/libs/ardour/mute_control.cc b/libs/ardour/mute_control.cc
new file mode 100644
index 0000000..5b38547
--- /dev/null
+++ b/libs/ardour/mute_control.cc
@@ -0,0 +1,194 @@
+/*
+    Copyright (C) 2016 Paul Davis
+
+    This program is free software; you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by the Free
+    Software Foundation; either version 2 of the License, or (at your option)
+    any later version.
+
+    This program is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc.,
+    675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#include "evoral/ControlList.hpp"
+
+#include "ardour/mute_master.h"
+#include "ardour/session.h"
+#include "ardour/mute_control.h"
+
+#include "pbd/i18n.h"
+
+using namespace ARDOUR;
+using namespace std;
+
+
+MuteControl::MuteControl (Session& session, std::string const & name, Muteable& m)
+	: SlavableAutomationControl (session, MuteAutomation, ParameterDescriptor (MuteAutomation),
+	                             boost::shared_ptr<AutomationList> (new AutomationList (Evoral::Parameter (MuteAutomation))),
+	                             name)
+	, _muteable (m)
+{
+	_list->set_interpolation (Evoral::ControlList::Discrete);
+	/* mute changes must be synchronized by the process cycle */
+	set_flags (Controllable::Flag (flags() | Controllable::RealTime));
+}
+
+void
+MuteControl::post_add_master (boost::shared_ptr<AutomationControl> m)
+{
+	if (m->get_value()) {
+
+		/* boolean masters records are not updated until AFTER
+		 * ::post_add_master() is called, so we can use them to check
+		 * on whether any master was already enabled before the new
+		 * one was added.
+		 */
+
+		if (!muted_by_self() && !get_boolean_masters()) {
+			_muteable.mute_master()->set_muted_by_masters (true);
+			Changed (false, Controllable::NoGroup);
+		}
+	}
+}
+
+void
+MuteControl::pre_remove_master (boost::shared_ptr<AutomationControl> m)
+{
+	if (!m) {
+		/* null control ptr means we're removing all masters */
+		_muteable.mute_master()->set_muted_by_masters (false);
+		/* Changed will be emitted in SlavableAutomationControl::clear_masters() */
+		return;
+	}
+
+	if (m->get_value()) {
+		if (!muted_by_self() && (get_boolean_masters() == 1)) {
+			Changed (false, Controllable::NoGroup);
+		}
+	}
+}
+
+void
+MuteControl::actually_set_value (double val, Controllable::GroupControlDisposition gcd)
+{
+	if (muted_by_self() != bool (val)) {
+		_muteable.mute_master()->set_muted_by_self (val);
+
+		/* allow the Muteable to respond to the mute change
+		   before anybody else knows about it.
+		*/
+		_muteable.act_on_mute ();
+	}
+
+	SlavableAutomationControl::actually_set_value (val, gcd);
+}
+
+void
+MuteControl::master_changed (bool self_change, Controllable::GroupControlDisposition gcd, boost::shared_ptr<AutomationControl> m)
+{
+	bool send_signal = false;
+	boost::shared_ptr<MuteControl> mc = boost::dynamic_pointer_cast<MuteControl> (m);
+
+	if (m->get_value()) {
+		/* this master is now enabled */
+		if (!muted_by_self() && get_boolean_masters() == 0) {
+			_muteable.mute_master()->set_muted_by_masters (true);
+			send_signal = true;
+		}
+	} else {
+		/* this master is disabled and there was only 1 enabled before */
+		if (!muted_by_self() && get_boolean_masters() == 1) {
+			_muteable.mute_master()->set_muted_by_masters (false);
+			send_signal = true;
+		}
+	}
+
+	update_boolean_masters_records (m);
+
+	if (send_signal) {
+		Changed (false, Controllable::NoGroup);
+	}
+}
+
+double
+MuteControl::get_value () const
+{
+	if (slaved ()) {
+		return muted_by_self() || get_masters_value ();
+	}
+
+	if (_list && boost::dynamic_pointer_cast<AutomationList>(_list)->automation_playback()) {
+		// Playing back automation, get the value from the list
+		return AutomationControl::get_value();
+	}
+
+	return muted();
+}
+
+void
+MuteControl::set_mute_points (MuteMaster::MutePoint mp)
+{
+	_muteable.mute_master()->set_mute_points (mp);
+	_muteable.mute_points_changed (); /* EMIT SIGNAL */
+
+	if (_muteable.mute_master()->muted_by_self()) {
+		Changed (true, Controllable::UseGroup); /* EMIT SIGNAL */
+	}
+}
+
+MuteMaster::MutePoint
+MuteControl::mute_points () const
+{
+	return _muteable.mute_master()->mute_points ();
+}
+
+bool
+MuteControl::muted () const
+{
+	/* have to get (self-muted) value from somewhere. could be our own
+	   Control, or the Muteable that we sort-of proxy for. Since this
+	   method is called by ::get_value(), use the latter to avoid recursion.
+	*/
+	return _muteable.mute_master()->muted_by_self() || get_masters_value ();
+}
+
+bool
+MuteControl::muted_by_self () const
+{
+	return _muteable.mute_master()->muted_by_self();
+}
+
+bool
+MuteControl::muted_by_masters () const
+{
+	return get_masters_value ();
+}
+
+bool
+MuteControl::muted_by_others_soloing () const
+{
+	return _muteable.muted_by_others_soloing ();
+}
+
+void
+MuteControl::automation_run (framepos_t start, pframes_t)
+{
+	if (!list() || !automation_playback()) {
+		return;
+	}
+
+	bool        valid = false;
+	const float mute  = list()->rt_safe_eval (start, valid);
+
+	if (mute >= 0.5 && !muted()) {
+		set_value_unchecked (1.0);  // mute
+	} else if (mute < 0.5 && muted ()) {
+		set_value_unchecked (0.0);  // unmute
+	}
+}
diff --git a/libs/ardour/mute_master.cc b/libs/ardour/mute_master.cc
index 8f81a5e..ed77942 100644
--- a/libs/ardour/mute_master.cc
+++ b/libs/ardour/mute_master.cc
@@ -26,21 +26,24 @@
 #include "ardour/mute_master.h"
 #include "ardour/session.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 using namespace std;
 
+const string MuteMaster::xml_node_name (X_("MuteMaster"));
+
 const MuteMaster::MutePoint MuteMaster::AllPoints = MuteMaster::MutePoint(
 	PreFader|PostFader|Listen|Main);
 
-MuteMaster::MuteMaster (Session& s, const std::string&)
+MuteMaster::MuteMaster (Session& s, Muteable& m, const std::string&)
 	: SessionHandleRef (s)
+	, _muteable (&m)
 	, _mute_point (MutePoint (0))
         , _muted_by_self (false)
         , _soloed_by_self (false)
         , _soloed_by_others (false)
-        , _solo_ignore (false)
+	, _muted_by_masters (0)
 {
 
 	if (Config->get_mute_affects_pre_fader ()) {
@@ -86,22 +89,22 @@ MuteMaster::mute_gain_at (MutePoint mp) const
         if (Config->get_solo_mute_override()) {
                 if (_soloed_by_self) {
                         gain = GAIN_COEFF_UNITY;
-                } else if (muted_by_self_at (mp)) {
+                } else if (muted_by_self_at (mp) || muted_by_masters_at (mp)) {
                         gain = GAIN_COEFF_ZERO;
                 } else {
-                        if (muted_by_others_at (mp) && !_soloed_by_others) {
+	                if (!_soloed_by_others && muted_by_others_soloing_at (mp)) {
                                 gain = Config->get_solo_mute_gain ();
                         } else {
                                 gain = GAIN_COEFF_UNITY;
                         }
                 }
         } else {
-                if (muted_by_self_at (mp)) {
+	        if (muted_by_self_at (mp) || muted_by_masters_at (mp)) {
                         gain = GAIN_COEFF_ZERO;
                 } else if (_soloed_by_self || _soloed_by_others) {
                         gain = GAIN_COEFF_UNITY;
                 } else {
-                        if (muted_by_others_at (mp)) {
+                        if (muted_by_others_soloing_at (mp)) {
                                 gain = Config->get_solo_mute_gain ();
                         } else {
                                 gain = GAIN_COEFF_UNITY;
@@ -136,7 +139,7 @@ MuteMaster::set_mute_points (MutePoint mp)
 int
 MuteMaster::set_state (const XMLNode& node, int /*version*/)
 {
-	const XMLProperty* prop;
+	XMLProperty const * prop;
 
 	if ((prop = node.property ("mute-point")) != 0) {
 		_mute_point = (MutePoint) string_2_enum (prop->value(), _mute_point);
@@ -154,15 +157,20 @@ MuteMaster::set_state (const XMLNode& node, int /*version*/)
 XMLNode&
 MuteMaster::get_state()
 {
-	XMLNode* node = new XMLNode (X_("MuteMaster"));
+	XMLNode* node = new XMLNode (xml_node_name);
 	node->add_property ("mute-point", enum_2_string (_mute_point));
 	node->add_property ("muted", (_muted_by_self ? X_("yes") : X_("no")));
 	return *node;
 }
 
 bool
-MuteMaster::muted_by_others_at (MutePoint mp) const
+MuteMaster::muted_by_others_soloing_at (MutePoint mp) const
 {
-	return (!_solo_ignore && _session.soloing() && (_mute_point & mp));
+	return _muteable->muted_by_others_soloing() && (_mute_point & mp);
 }
 
+void
+MuteMaster::set_muted_by_masters (bool yn)
+{
+	_muted_by_masters = yn;
+}
diff --git a/libs/ardour/muteable.cc b/libs/ardour/muteable.cc
new file mode 100644
index 0000000..c94b55a
--- /dev/null
+++ b/libs/ardour/muteable.cc
@@ -0,0 +1,27 @@
+/*
+    Copyright (C) 2016 Paul Davis
+
+    This program is free software; you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by the Free
+    Software Foundation; either version 2 of the License, or (at your option)
+    any later version.
+
+    This program is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc.,
+    675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#include "ardour/muteable.h"
+#include "ardour/mute_master.h"
+
+using namespace ARDOUR;
+
+Muteable::Muteable (Session& s, std::string const & name)
+	: _mute_master (new MuteMaster (s, *this, name))
+{
+}
diff --git a/libs/ardour/onset_detector.cc b/libs/ardour/onset_detector.cc
index 60fea6d..7658bd8 100644
--- a/libs/ardour/onset_detector.cc
+++ b/libs/ardour/onset_detector.cc
@@ -20,7 +20,7 @@
 #include <cmath>
 #include "ardour/onset_detector.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace Vamp;
 using namespace ARDOUR;
@@ -93,6 +93,16 @@ OnsetDetector::set_peak_threshold (float val)
 }
 
 void
+OnsetDetector::set_minioi (float val)
+{
+#ifdef HAVE_AUBIO4
+	if (plugin) {
+		plugin->setParameter ("minioi", val);
+	}
+#endif
+}
+
+void
 OnsetDetector::set_function (int val)
 {
 	if (plugin) {
diff --git a/libs/ardour/operations.cc b/libs/ardour/operations.cc
index 1b4796d..5c5fe41 100644
--- a/libs/ardour/operations.cc
+++ b/libs/ardour/operations.cc
@@ -19,7 +19,7 @@
 
 #include <glib.h>
 #include "ardour/operations.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 GQuark Operations::capture;
 GQuark Operations::paste;
diff --git a/libs/ardour/pan_controllable.cc b/libs/ardour/pan_controllable.cc
index a6a9678..89842b1 100644
--- a/libs/ardour/pan_controllable.cc
+++ b/libs/ardour/pan_controllable.cc
@@ -35,27 +35,13 @@ PanControllable::lower () const
 }
 
 void
-PanControllable::set_value (double v, PBD::Controllable::GroupControlDisposition group_override)
-{
-	if (writable()) {
-		_set_value (v, group_override);
-	}
-}
-void
-PanControllable::set_value_unchecked (double v)
-{
-	/* used only automation playback */
-	_set_value (v, Controllable::NoGroup);
-}
-
-void
-PanControllable::_set_value (double v, Controllable::GroupControlDisposition group_override)
+PanControllable::actually_set_value (double v, Controllable::GroupControlDisposition group_override)
 {
 	boost::shared_ptr<Panner> p = owner->panner();
 
         if (!p) {
                 /* no panner: just do it */
-	        AutomationControl::set_value (v, group_override);
+	        AutomationControl::actually_set_value (v, group_override);
                 return;
         }
 
@@ -76,7 +62,12 @@ PanControllable::_set_value (double v, Controllable::GroupControlDisposition gro
         }
 
         if (can_set) {
-	        AutomationControl::set_value (v, group_override);
+	        AutomationControl::actually_set_value (v, group_override);
         }
 }
 
+std::string
+PanControllable::get_user_string () const
+{
+	return owner->value_as_string (shared_from_this());
+}
diff --git a/libs/ardour/pannable.cc b/libs/ardour/pannable.cc
index f589024..d77c8a0 100644
--- a/libs/ardour/pannable.cc
+++ b/libs/ardour/pannable.cc
@@ -20,8 +20,8 @@
 #include "pbd/error.h"
 #include "pbd/convert.h"
 #include "pbd/compose.h"
-#include "pbd/boost_debug.h"
 
+#include "ardour/boost_debug.h"
 #include "ardour/debug.h"
 #include "ardour/automation_control.h"
 #include "ardour/automation_list.h"
@@ -30,7 +30,7 @@
 #include "ardour/pan_controllable.h"
 #include "ardour/session.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace PBD;
@@ -187,6 +187,7 @@ Pannable::get_state ()
 XMLNode&
 Pannable::state (bool /*full*/)
 {
+	LocaleGuard lg;
 	XMLNode* node = new XMLNode (X_("Pannable"));
 
 	node->add_child_nocopy (pan_azimuth_control->get_state());
@@ -213,7 +214,7 @@ Pannable::set_state (const XMLNode& root, int version)
 
 	for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
 		if ((*niter)->name() == Controllable::xml_node_name) {
-			const XMLProperty* prop = (*niter)->property (X_("name"));
+			XMLProperty const * prop = (*niter)->property (X_("name"));
 
 			if (!prop) {
 				continue;
@@ -235,7 +236,7 @@ Pannable::set_state (const XMLNode& root, int version)
 			set_automation_xml_state (**niter, PanAzimuthAutomation);
 
 		} else {
-			const XMLProperty* prop;
+			XMLProperty const * prop;
 
 			/* old school (alpha1-6) XML info */
 
@@ -274,7 +275,7 @@ Pannable::set_state (const XMLNode& root, int version)
 }
 
 string
-Pannable::value_as_string (boost::shared_ptr<AutomationControl> ac) const
+Pannable::value_as_string (boost::shared_ptr<const AutomationControl> ac) const
 {
 	boost::shared_ptr<Panner> p = panner ();
 
diff --git a/libs/ardour/panner.cc b/libs/ardour/panner.cc
index c88fbe4..59e4e2e 100644
--- a/libs/ardour/panner.cc
+++ b/libs/ardour/panner.cc
@@ -22,7 +22,7 @@
 #include "ardour/panner.h"
 #include "ardour/pannable.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
@@ -109,7 +109,7 @@ Panner::describe_parameter (Evoral::Parameter p)
 }
 
 string
-Panner::value_as_string (boost::shared_ptr<AutomationControl> ac) const
+Panner::value_as_string (boost::shared_ptr<const AutomationControl> ac) const
 {
 	return _pannable->value_as_string (ac);
 }
diff --git a/libs/ardour/panner_manager.cc b/libs/ardour/panner_manager.cc
index 906e979..c6b73b4 100644
--- a/libs/ardour/panner_manager.cc
+++ b/libs/ardour/panner_manager.cc
@@ -32,7 +32,7 @@
 
 #include "ardour/search_paths.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
diff --git a/libs/ardour/panner_shell.cc b/libs/ardour/panner_shell.cc
index 678b1a1..6c3ae00 100644
--- a/libs/ardour/panner_shell.cc
+++ b/libs/ardour/panner_shell.cc
@@ -32,7 +32,6 @@
 #include <glibmm.h>
 
 #include "pbd/cartesian.h"
-#include "pbd/boost_debug.h"
 #include "pbd/convert.h"
 #include "pbd/error.h"
 #include "pbd/failed_constructor.h"
@@ -43,16 +42,18 @@
 
 #include "ardour/audio_buffer.h"
 #include "ardour/audioengine.h"
+#include "ardour/boost_debug.h"
 #include "ardour/buffer_set.h"
 #include "ardour/debug.h"
 #include "ardour/pannable.h"
 #include "ardour/panner.h"
 #include "ardour/panner_manager.h"
 #include "ardour/panner_shell.h"
+#include "ardour/profile.h"
 #include "ardour/session.h"
 #include "ardour/speakers.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 #include "pbd/mathfix.h"
 
@@ -73,7 +74,7 @@ PannerShell::PannerShell (string name, Session& s, boost::shared_ptr<Pannable> p
 {
 	if (is_send) {
 		_pannable_internal.reset(new Pannable (s));
-		if (Config->get_link_send_and_route_panner()) {
+		if (Config->get_link_send_and_route_panner() && !ARDOUR::Profile->get_mixbus()) {
 			_panlinked = true;
 		} else {
 			_panlinked = false;
@@ -170,15 +171,17 @@ PannerShell::set_state (const XMLNode& node, int version)
 {
 	XMLNodeList nlist = node.children ();
 	XMLNodeConstIterator niter;
-	const XMLProperty *prop;
-	LocaleGuard lg (X_("C"));
+	XMLProperty const * prop;
+	LocaleGuard lg;
 
 	if ((prop = node.property (X_("bypassed"))) != 0) {
 		set_bypassed (string_is_affirmative (prop->value ()));
 	}
 
 	if ((prop = node.property (X_("linked-to-route"))) != 0) {
-		_panlinked = string_is_affirmative (prop->value ());
+		if (!ARDOUR::Profile->get_mixbus()) {
+			_panlinked = string_is_affirmative (prop->value ());
+		}
 	}
 
 	if ((prop = node.property (X_("user-panner"))) != 0) {
diff --git a/libs/ardour/parameter_descriptor.cc b/libs/ardour/parameter_descriptor.cc
index 7ce6a5e..bf0c9b7 100644
--- a/libs/ardour/parameter_descriptor.cc
+++ b/libs/ardour/parameter_descriptor.cc
@@ -24,7 +24,7 @@
 #include "ardour/types.h"
 #include "ardour/utils.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 namespace ARDOUR {
 
@@ -75,6 +75,7 @@ ParameterDescriptor::ParameterDescriptor(const Evoral::Parameter& parameter)
 		normal = 0.0f;
 		break;
 	case RecEnableAutomation:
+	case RecSafeAutomation:
 		lower  = 0.0;
 		upper  = 1.0;
 		toggled = true;
@@ -157,6 +158,9 @@ ParameterDescriptor::update_steps()
 		step      = slider_position_to_gain(largestep / 10.0);
 		smallstep = step;
 	} else {
+		/* note that LV2Plugin::get_parameter_descriptor ()
+		 * overrides this is lv2:rangeStep is set for a port.
+		 */
 		const float delta = upper - lower;
 
 		/* 30 happens to be the total number of steps for a fader with default
@@ -178,10 +182,40 @@ ParameterDescriptor::update_steps()
 			largestep = largestep / logf(30.0f);
 		} else if (integer_step) {
 			smallstep = 1.0;
-			step      = std::max(1.0, rint(step));
-			largestep = std::max(1.0, rint(largestep));
+			step      = std::max(1.f, rintf (step));
+			largestep = std::max(1.f, rintf (largestep));
 		}
 	}
 }
 
+std::string
+ParameterDescriptor::midi_note_name (const uint8_t b)
+{
+	char buf[8];
+	if (b > 127) {
+		snprintf(buf, sizeof(buf), "%d", b);
+		return buf;
+	}
+
+	static const char* notes[] = {
+		S_("Note|C"),
+		S_("Note|C#"),
+		S_("Note|D"),
+		S_("Note|D#"),
+		S_("Note|E"),
+		S_("Note|F"),
+		S_("Note|F#"),
+		S_("Note|G"),
+		S_("Note|G#"),
+		S_("Note|A"),
+		S_("Note|A#"),
+		S_("Note|B")
+	};
+
+	/* MIDI note 0 is in octave -1 (in scientific pitch notation) */
+	const int octave = b / 12 - 1;
+	snprintf (buf, sizeof (buf), "%s%d", notes[b % 12], octave);
+	return buf;
+}
+
 } // namespace ARDOUR
diff --git a/libs/ardour/phase_control.cc b/libs/ardour/phase_control.cc
new file mode 100644
index 0000000..9757c10
--- /dev/null
+++ b/libs/ardour/phase_control.cc
@@ -0,0 +1,97 @@
+/*
+    Copyright (C) 2016 Paul Davis
+
+    This program is free software; you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by the Free
+    Software Foundation; either version 2 of the License, or (at your option)
+    any later version.
+
+    This program is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc.,
+    675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#include "ardour/phase_control.h"
+#include "ardour/session.h"
+
+#include "pbd/i18n.h"
+
+using namespace std;
+using namespace PBD;
+using namespace ARDOUR;
+
+PhaseControl::PhaseControl (Session& session, std::string const & name)
+	: AutomationControl (session, PhaseAutomation, ParameterDescriptor (PhaseAutomation),
+	                     boost::shared_ptr<AutomationList>(new AutomationList(Evoral::Parameter(PhaseAutomation))),
+	                     name)
+{
+}
+
+void
+PhaseControl::actually_set_value (double val, Controllable::GroupControlDisposition gcd)
+{
+	_phase_invert = boost::dynamic_bitset<> (std::numeric_limits<double>::digits, (unsigned long) val);
+
+	AutomationControl::actually_set_value (val, gcd);
+}
+
+/** @param c Audio channel index.
+ *  @param yn true to invert phase, otherwise false.
+ */
+void
+PhaseControl::set_phase_invert (uint32_t c, bool yn)
+{
+	if (_phase_invert[c] != yn) {
+		_phase_invert[c] = yn;
+		AutomationControl::actually_set_value (_phase_invert.to_ulong(), Controllable::NoGroup);
+		_session.set_dirty ();
+	}
+}
+
+void
+PhaseControl::set_phase_invert (boost::dynamic_bitset<> p)
+{
+	if (_phase_invert != p) {
+		_phase_invert = p;
+		AutomationControl::actually_set_value (_phase_invert.to_ulong(), Controllable::NoGroup);
+		Changed (true, Controllable::NoGroup); /* EMIT SIGNAL */
+		_session.set_dirty ();
+	}
+}
+
+void
+PhaseControl::resize (uint32_t n)
+{
+	_phase_invert.resize (n);
+}
+
+XMLNode&
+PhaseControl::get_state ()
+{
+	XMLNode& node (AutomationControl::get_state ());
+
+	string p;
+	boost::to_string (_phase_invert, p);
+	node.add_property("phase-invert", p);
+
+	return node;
+}
+
+int
+PhaseControl::set_state (XMLNode const & node, int version)
+{
+	AutomationControl::set_state (node, version);
+
+	const XMLProperty* prop;
+
+	if ((prop = node.property (X_("phase-invert"))) != 0) {
+		set_phase_invert (boost::dynamic_bitset<> (prop->value ()));
+	}
+
+	return 0;
+}
diff --git a/libs/ardour/playlist.cc b/libs/ardour/playlist.cc
index 41681a7..7074442 100644
--- a/libs/ardour/playlist.cc
+++ b/libs/ardour/playlist.cc
@@ -40,7 +40,7 @@
 #include "ardour/session_playlists.h"
 #include "ardour/source_factory.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
@@ -141,7 +141,7 @@ Playlist::Playlist (Session& sess, const XMLNode& node, DataType type, bool hide
 	, _type(type)
 {
 #ifndef NDEBUG
-	const XMLProperty* prop = node.property("type");
+	XMLProperty const * prop = node.property("type");
 	assert(!prop || DataType(prop->value()) == _type);
 #endif
 
@@ -657,6 +657,7 @@ Playlist::flush_notifications (bool from_undo)
 	 pending_range_moves.clear ();
 	 pending_region_extensions.clear ();
 	 pending_contents_change = false;
+	 pending_layering = false;
  }
 
  /*************************************************************
@@ -665,7 +666,7 @@ Playlist::flush_notifications (bool from_undo)
 
 /** Note: this calls set_layer (..., DBL_MAX) so it will reset the layering index of region */
  void
- Playlist::add_region (boost::shared_ptr<Region> region, framepos_t position, float times, bool auto_partition)
+ Playlist::add_region (boost::shared_ptr<Region> region, framepos_t position, float times, bool auto_partition, const int32_t sub_num)
  {
 	 RegionWriteLock rlock (this);
 	 times = fabs (times);
@@ -679,7 +680,7 @@ Playlist::flush_notifications (bool from_undo)
 	 }
 
 	 if (itimes >= 1) {
-		 add_region_internal (region, pos);
+		 add_region_internal (region, pos, sub_num);
 		 set_layer (region, DBL_MAX);
 		 pos += region->length();
 		 --itimes;
@@ -691,8 +692,8 @@ Playlist::flush_notifications (bool from_undo)
 	 */
 
 	 for (int i = 0; i < itimes; ++i) {
-		 boost::shared_ptr<Region> copy = RegionFactory::create (region, true);
-		 add_region_internal (copy, pos);
+		 boost::shared_ptr<Region> copy = RegionFactory::create (region, true, sub_num);
+		 add_region_internal (copy, pos, sub_num);
 		 set_layer (copy, DBL_MAX);
 		 pos += region->length();
 	 }
@@ -713,7 +714,7 @@ Playlist::flush_notifications (bool from_undo)
 			 plist.add (Properties::layer, region->layer());
 
 			 boost::shared_ptr<Region> sub = RegionFactory::create (region, plist);
-			 add_region_internal (sub, pos);
+			 add_region_internal (sub, pos, sub_num);
 			 set_layer (sub, DBL_MAX);
 		 }
 	 }
@@ -734,7 +735,7 @@ Playlist::flush_notifications (bool from_undo)
  }
 
  bool
- Playlist::add_region_internal (boost::shared_ptr<Region> region, framepos_t position)
+ Playlist::add_region_internal (boost::shared_ptr<Region> region, framepos_t position, const int32_t sub_num)
  {
 	 if (region->data_type() != _type) {
 		 return false;
@@ -747,7 +748,7 @@ Playlist::flush_notifications (bool from_undo)
 		 region->set_playlist (boost::weak_ptr<Playlist>(foo));
 	 }
 
-	 region->set_position (position);
+	 region->set_position (position, sub_num);
 
 	 regions.insert (upper_bound (regions.begin(), regions.end(), region, cmp), region);
 	 all_regions.insert (region);
@@ -1146,7 +1147,7 @@ Playlist::flush_notifications (bool from_undo)
 			    chopped.
 			 */
 
-			 ret->paste (pl, (*i).start - start, 1.0f);
+			 ret->paste (pl, (*i).start - start, 1.0f, 0);
 		 }
 	 }
 
@@ -1208,7 +1209,7 @@ Playlist::flush_notifications (bool from_undo)
  }
 
  int
- Playlist::paste (boost::shared_ptr<Playlist> other, framepos_t position, float times)
+ Playlist::paste (boost::shared_ptr<Playlist> other, framepos_t position, float times, const int32_t sub_num)
  {
 	 times = fabs (times);
 
@@ -1230,7 +1231,7 @@ Playlist::flush_notifications (bool from_undo)
 					    the ordering they had in the original playlist.
 					 */
 
-					 add_region_internal (copy_of_region, (*i)->position() + pos);
+					 add_region_internal (copy_of_region, (*i)->position() + pos, sub_num);
 					 set_layer (copy_of_region, copy_of_region->layer() + top);
 				 }
 				 pos += shift;
@@ -1321,7 +1322,7 @@ Playlist::duplicate_range (AudioRange& range, float times)
 {
 	boost::shared_ptr<Playlist> pl = copy (range.start, range.length(), true);
 	framecnt_t offset = range.end - range.start;
-	paste (pl, range.start + offset, times);
+	paste (pl, range.start + offset, times, 0);
 }
 
 void
@@ -1345,7 +1346,7 @@ Playlist::duplicate_ranges (std::list<AudioRange>& ranges, float /* times */)
 
 	for (list<AudioRange>::iterator i = ranges.begin(); i != ranges.end(); ++i) {
 		boost::shared_ptr<Playlist> pl = copy ((*i).start, (*i).length(), true);
-		paste (pl, (*i).start + offset, 1.0f); // times ??
+		paste (pl, (*i).start + offset, 1.0f, 0); // times ??
 	}
 }
 
@@ -1384,12 +1385,12 @@ Playlist::duplicate_ranges (std::list<AudioRange>& ranges, float /* times */)
 
 	 /* XXX: may not be necessary; Region::post_set should do this, I think */
 	 for (RegionList::iterator r = fixup.begin(); r != fixup.end(); ++r) {
-		 (*r)->recompute_position_from_lock_style ();
+		 (*r)->recompute_position_from_lock_style (0);
 	 }
  }
 
  void
- Playlist::split (framepos_t at)
+ Playlist::split (framepos_t at, const int32_t sub_num)
  {
 	 RegionWriteLock rlock (this);
 	 RegionList copy (regions.rlist());
@@ -1398,19 +1399,19 @@ Playlist::duplicate_ranges (std::list<AudioRange>& ranges, float /* times */)
 	  */
 
 	 for (RegionList::iterator r = copy.begin(); r != copy.end(); ++r) {
-		 _split_region (*r, at);
+		 _split_region (*r, at, sub_num);
 	 }
  }
 
  void
- Playlist::split_region (boost::shared_ptr<Region> region, framepos_t playlist_position)
+ Playlist::split_region (boost::shared_ptr<Region> region, framepos_t playlist_position, const int32_t sub_num)
  {
 	 RegionWriteLock rl (this);
-	 _split_region (region, playlist_position);
+	 _split_region (region, playlist_position, sub_num);
  }
 
  void
- Playlist::_split_region (boost::shared_ptr<Region> region, framepos_t playlist_position)
+ Playlist::_split_region (boost::shared_ptr<Region> region, framepos_t playlist_position, const int32_t sub_num)
  {
 	 if (!region->covers (playlist_position)) {
 		 return;
@@ -1451,7 +1452,7 @@ Playlist::duplicate_ranges (std::list<AudioRange>& ranges, float /* times */)
 		    since it supplies that offset to the Region constructor, which
 		    is necessary to get audio region gain envelopes right.
 		 */
-		 left = RegionFactory::create (region, 0, plist);
+		 left = RegionFactory::create (region, 0, plist, true, sub_num);
 	 }
 
 	 RegionFactory::region_name (after_name, region->name(), false);
@@ -1466,7 +1467,7 @@ Playlist::duplicate_ranges (std::list<AudioRange>& ranges, float /* times */)
 		 plist.add (Properties::layer, region->layer ());
 
 		 /* same note as above */
-		 right = RegionFactory::create (region, before, plist);
+		 right = RegionFactory::create (region, before, plist, true, sub_num);
 	 }
 
 	 add_region_internal (left, region->position());
@@ -1769,11 +1770,29 @@ Playlist::region_bounds_changed (const PropertyChange& what_changed, boost::shar
 
  }
 
- /***********************************************************************
+ /* *********************************************************************
   FINDING THINGS
   **********************************************************************/
 
 boost::shared_ptr<RegionList>
+Playlist::region_list()
+{
+	RegionReadLock rlock (this);
+	boost::shared_ptr<RegionList> rlist (new RegionList (regions.rlist ()));
+	return rlist;
+}
+
+void
+Playlist::deep_sources (std::set<boost::shared_ptr<Source> >& sources) const
+{
+	RegionReadLock rlock (const_cast<Playlist*>(this));
+
+	for (RegionList::const_iterator i = regions.begin(); i != regions.end(); ++i) {
+		(*i)->deep_sources (sources);
+	}
+}
+
+boost::shared_ptr<RegionList>
 Playlist::regions_at (framepos_t frame)
 {
 	RegionReadLock rlock (this);
@@ -1822,6 +1841,7 @@ Playlist::regions_at (framepos_t frame)
 	 for (RegionList::iterator i = rlist->begin(); i != rlist->end(); ) {
 
 		 RegionList::iterator tmp = i;
+
 		 ++tmp;
 
 		 if ((*i)->muted()) {
@@ -1949,7 +1969,7 @@ Playlist::find_next_transient (framepos_t from, int dir)
 	bool reached = false;
 
 	if (dir > 0) {
-		for (AnalysisFeatureList::iterator x = points.begin(); x != points.end(); ++x) {
+		for (AnalysisFeatureList::const_iterator x = points.begin(); x != points.end(); ++x) {
 			if ((*x) >= from) {
 				reached = true;
 			}
@@ -2047,23 +2067,25 @@ Playlist::find_next_region (framepos_t frame, RegionPoint point, int dir)
 
 			 boost::shared_ptr<Region> r = (*i);
 			 frameoffset_t distance;
+			 const framepos_t first_frame = r->first_frame();
+			 const framepos_t last_frame = r->last_frame();
 
-			 if (r->first_frame() > frame) {
+			 if (first_frame > frame) {
 
-				 distance = r->first_frame() - frame;
+				 distance = first_frame - frame;
 
 				 if (distance < closest) {
-					 ret = r->first_frame();
+					 ret = first_frame;
 					 closest = distance;
 				 }
 			 }
 
-			 if (r->last_frame () > frame) {
+			 if (last_frame > frame) {
 
-				 distance = r->last_frame () - frame;
+				 distance = last_frame - frame;
 
 				 if (distance < closest) {
-					 ret = r->last_frame ();
+					 ret = last_frame;
 					 closest = distance;
 				 }
 			 }
@@ -2075,23 +2097,25 @@ Playlist::find_next_region (framepos_t frame, RegionPoint point, int dir)
 
 			 boost::shared_ptr<Region> r = (*i);
 			 frameoffset_t distance;
+			 const framepos_t first_frame = r->first_frame();
+			 const framepos_t last_frame = r->last_frame();
 
-			 if (r->last_frame() < frame) {
+			 if (last_frame < frame) {
 
-				 distance = frame - r->last_frame();
+				 distance = frame - last_frame;
 
 				 if (distance < closest) {
-					 ret = r->last_frame();
+					 ret = last_frame;
 					 closest = distance;
 				 }
 			 }
 
-			 if (r->first_frame() < frame) {
+			 if (first_frame < frame) {
 
-				 distance = frame - r->first_frame();
+				 distance = frame - first_frame;
 
 				 if (distance < closest) {
-					 ret = r->first_frame();
+					 ret = first_frame;
 					 closest = distance;
 				 }
 			 }
@@ -2156,7 +2180,7 @@ Playlist::find_next_region (framepos_t frame, RegionPoint point, int dir)
 	 XMLNodeConstIterator niter;
 	 XMLPropertyList plist;
 	 XMLPropertyConstIterator piter;
-	 XMLProperty *prop;
+	 XMLProperty const * prop;
 	 boost::shared_ptr<Region> region;
 	 string region_name;
 	 bool seen_region_nodes = false;
@@ -2647,12 +2671,18 @@ Playlist::nudge_after (framepos_t start, framecnt_t distance, bool forwards)
 }
 
 bool
-Playlist::uses_source (boost::shared_ptr<const Source> src) const
+Playlist::uses_source (boost::shared_ptr<const Source> src, bool shallow) const
 {
 	RegionReadLock rlock (const_cast<Playlist*> (this));
 
 	for (set<boost::shared_ptr<Region> >::const_iterator r = all_regions.begin(); r != all_regions.end(); ++r) {
-		if ((*r)->uses_source (src)) {
+		/* Note: passing the second argument as false can cause at best
+		   incredibly deep and time-consuming recursion, and at worst
+		   cycles if the user has managed to create cycles of reference
+		   between compound regions. We generally only this during
+		   cleanup, and @param shallow is passed as true.
+		*/
+		if ((*r)->uses_source (src, shallow)) {
 			return true;
 		}
 	}
@@ -2660,6 +2690,7 @@ Playlist::uses_source (boost::shared_ptr<const Source> src) const
 	return false;
 }
 
+
 boost::shared_ptr<Region>
 Playlist::find_region (const ID& id) const
 {
@@ -2897,7 +2928,7 @@ Playlist::update_after_tempo_map_change ()
 	for (RegionList::iterator i = copy.begin(); i != copy.end(); ++i) {
 		(*i)->update_after_tempo_map_change ();
 	}
-
+	/* possibly causes a contents changed notification (flush_notifications()) */
 	thaw ();
 }
 
@@ -2923,25 +2954,6 @@ Playlist::has_region_at (framepos_t const p) const
 	return (i != regions.end());
 }
 
-/** Remove any region that uses a given source */
-void
-Playlist::remove_region_by_source (boost::shared_ptr<Source> s)
-{
-	RegionWriteLock rl (this);
-
-	RegionList::iterator i = regions.begin();
-	while (i != regions.end()) {
-		RegionList::iterator j = i;
-		++j;
-
-		if ((*i)->uses_source (s)) {
-			remove_region_internal (*i);
-		}
-
-		i = j;
-	}
-}
-
 /** Look from a session frame time and find the start time of the next region
  *  which is on the top layer of this playlist.
  *  @param t Time to look from.
@@ -3126,7 +3138,7 @@ Playlist::uncombine (boost::shared_ptr<Region> target)
 
 	// (2) get all the original regions
 
-	const RegionList& rl (pl->region_list().rlist());
+	const RegionList& rl (pl->region_list_property().rlist());
 	RegionFactory::CompoundAssociations& cassocs (RegionFactory::compound_associations());
 	frameoffset_t move_offset = 0;
 
@@ -3173,7 +3185,7 @@ Playlist::uncombine (boost::shared_ptr<Region> target)
 		}
 
 		/* check to see how the original region (in the
-		 * playlist before compounding occured) overlaps
+		 * playlist before compounding occurred) overlaps
 		 * with the new state of the compound region.
 		 */
 
diff --git a/libs/ardour/playlist_factory.cc b/libs/ardour/playlist_factory.cc
index 150ae6c..46f9910 100644
--- a/libs/ardour/playlist_factory.cc
+++ b/libs/ardour/playlist_factory.cc
@@ -25,7 +25,7 @@
 #include "ardour/midi_playlist.h"
 #include "ardour/playlist_factory.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
@@ -36,7 +36,7 @@ PBD::Signal2<void,boost::shared_ptr<Playlist>, bool> PlaylistFactory::PlaylistCr
 boost::shared_ptr<Playlist>
 PlaylistFactory::create (Session& s, const XMLNode& node, bool hidden, bool unused)
 {
-	const XMLProperty* type = node.property("type");
+	XMLProperty const * type = node.property("type");
 
 	boost::shared_ptr<Playlist> pl;
 
diff --git a/libs/ardour/playlist_source.cc b/libs/ardour/playlist_source.cc
index ed8735b..07f7233 100644
--- a/libs/ardour/playlist_source.cc
+++ b/libs/ardour/playlist_source.cc
@@ -34,7 +34,7 @@
 #include "ardour/playlist_source.h"
 #include "ardour/playlist_factory.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
@@ -93,7 +93,7 @@ PlaylistSource::set_state (const XMLNode& node, int /*version*/)
 {
 	/* check that we have a playlist ID */
 
-	const XMLProperty *prop = node.property (X_("playlist"));
+	XMLProperty const * prop = node.property (X_("playlist"));
 
 	if (!prop) {
 		error << _("No playlist ID in PlaylistSource XML!") << endmsg;
diff --git a/libs/ardour/plugin.cc b/libs/ardour/plugin.cc
index 31e9e2e..a0ac97b 100644
--- a/libs/ardour/plugin.cc
+++ b/libs/ardour/plugin.cc
@@ -46,6 +46,7 @@
 #include "ardour/chan_count.h"
 #include "ardour/chan_mapping.h"
 #include "ardour/data_type.h"
+#include "ardour/luaproc.h"
 #include "ardour/midi_buffer.h"
 #include "ardour/midi_state_tracker.h"
 #include "ardour/plugin.h"
@@ -64,7 +65,7 @@
 
 #include "pbd/stl_delete.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 #include <locale.h>
 
 using namespace std;
@@ -162,6 +163,10 @@ ARDOUR::find_plugin(Session& session, string identifier, PluginType type)
 	PluginInfoList plugs;
 
 	switch (type) {
+	case ARDOUR::Lua:
+		plugs = mgr.lua_plugin_info();
+		break;
+
 	case ARDOUR::LADSPA:
 		plugs = mgr.ladspa_plugin_info();
 		break;
@@ -249,9 +254,52 @@ Plugin::input_streams () const
 	return ChanCount::ZERO;
 }
 
+Plugin::IOPortDescription
+Plugin::describe_io_port (ARDOUR::DataType dt, bool input, uint32_t id) const
+{
+	std::stringstream ss;
+	switch (dt) {
+		case DataType::AUDIO:
+			ss << _("Audio") << " ";
+			break;
+		case DataType::MIDI:
+			ss << _("Midi") << " ";
+			break;
+		default:
+			ss << _("?") << " ";
+			break;
+	}
+	if (input) {
+		ss << _("In") << " ";
+	} else {
+		ss << _("Out") << " ";
+	}
+
+	ss << (id + 1);
+
+	Plugin::IOPortDescription iod (ss.str());
+	return iod;
+}
+
+PluginOutputConfiguration
+Plugin::possible_output () const
+{
+	PluginOutputConfiguration oc;
+	if (_info) {
+		oc.insert (_info->n_outputs.n_audio ());
+	}
+	return oc;
+}
+
 const Plugin::PresetRecord *
 Plugin::preset_by_label (const string& label)
 {
+#ifndef NO_PLUGIN_STATE
+	if (!_have_presets) {
+		find_presets ();
+		_have_presets = true;
+	}
+#endif
 	// FIXME: O(n)
 	for (map<string, PresetRecord>::const_iterator i = _presets.begin(); i != _presets.end(); ++i) {
 		if (i->second.label == label) {
@@ -265,6 +313,12 @@ Plugin::preset_by_label (const string& label)
 const Plugin::PresetRecord *
 Plugin::preset_by_uri (const string& uri)
 {
+#ifndef NO_PLUGIN_STATE
+	if (!_have_presets) {
+		find_presets ();
+		_have_presets = true;
+	}
+#endif
 	map<string, PresetRecord>::const_iterator pr = _presets.find (uri);
 	if (pr != _presets.end()) {
 		return &pr->second;
@@ -275,8 +329,9 @@ Plugin::preset_by_uri (const string& uri)
 
 int
 Plugin::connect_and_run (BufferSet& bufs,
-			 ChanMapping /*in_map*/, ChanMapping /*out_map*/,
-			 pframes_t /* nframes */, framecnt_t /*offset*/)
+		framepos_t /*start*/, framepos_t /*end*/, double /*speed*/,
+		ChanMapping /*in_map*/, ChanMapping /*out_map*/,
+		pframes_t /* nframes */, framecnt_t /*offset*/)
 {
 	if (bufs.count().n_midi() > 0) {
 
@@ -371,6 +426,7 @@ Plugin::load_preset (PresetRecord r)
 	_last_preset = r;
 	_parameter_changed_since_last_preset = false;
 
+	_session.set_dirty ();
 	PresetLoaded (); /* EMIT SIGNAL */
 	return true;
 }
@@ -382,6 +438,7 @@ Plugin::clear_preset ()
 	_last_preset.label = "";
 	_parameter_changed_since_last_preset = false;
 
+	_session.set_dirty ();
 	PresetLoaded (); /* EMIT SIGNAL */
 }
 
@@ -427,7 +484,7 @@ XMLNode &
 Plugin::get_state ()
 {
 	XMLNode* root = new XMLNode (state_node_name ());
-	LocaleGuard lg (X_("C"));
+	LocaleGuard lg;
 
 	root->add_property (X_("last-preset-uri"), _last_preset.uri);
 	root->add_property (X_("last-preset-label"), _last_preset.label);
diff --git a/libs/ardour/plugin_insert.cc b/libs/ardour/plugin_insert.cc
index 96b8570..9a0e6c5 100644
--- a/libs/ardour/plugin_insert.cc
+++ b/libs/ardour/plugin_insert.cc
@@ -33,8 +33,10 @@
 #include "ardour/debug.h"
 #include "ardour/event_type_map.h"
 #include "ardour/ladspa_plugin.h"
+#include "ardour/luaproc.h"
 #include "ardour/plugin.h"
 #include "ardour/plugin_insert.h"
+#include "ardour/port.h"
 
 #ifdef LV2_SUPPORT
 #include "ardour/lv2_plugin.h"
@@ -55,7 +57,7 @@
 #include "ardour/session.h"
 #include "ardour/types.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
@@ -65,14 +67,41 @@ const string PluginInsert::port_automation_node_name = "PortAutomation";
 
 PluginInsert::PluginInsert (Session& s, boost::shared_ptr<Plugin> plug)
 	: Processor (s, (plug ? plug->name() : string ("toBeRenamed")))
+	, _sc_playback_latency (0)
+	, _sc_capture_latency (0)
+	, _plugin_signal_latency (0)
 	, _signal_analysis_collected_nframes(0)
 	, _signal_analysis_collect_nframes_max(0)
+	, _configured (false)
+	, _no_inplace (false)
+	, _strict_io (false)
+	, _custom_cfg (false)
+	, _maps_from_state (false)
+	, _bypass_port (UINT32_MAX)
 {
 	/* the first is the master */
 
 	if (plug) {
 		add_plugin (plug);
 		create_automatable_parameters ();
+		const ChanCount& sc (sidechain_input_pins ());
+		if (sc.n_audio () > 0 || sc.n_midi () > 0) {
+			add_sidechain (sc.n_audio (), sc.n_midi ());
+		}
+	}
+}
+
+PluginInsert::~PluginInsert ()
+{
+}
+
+void
+PluginInsert::set_strict_io (bool b)
+{
+	bool changed = _strict_io != b;
+	_strict_io = b;
+	if (changed) {
+		PluginConfigChanged (); /* EMIT SIGNAL */
 	}
 }
 
@@ -81,9 +110,14 @@ PluginInsert::set_count (uint32_t num)
 {
 	bool require_state = !_plugins.empty();
 
+	if (require_state && num > 1 && plugin (0)->get_info ()->type == ARDOUR::AudioUnit) {
+		// we don't allow to replicate AUs
+		return false;
+	}
+
 	/* this is a bad idea.... we shouldn't do this while active.
-	   only a route holding their redirect_lock should be calling this
-	*/
+	 * only a route holding their redirect_lock should be calling this
+	 */
 
 	if (num == 0) {
 		return false;
@@ -93,27 +127,123 @@ PluginInsert::set_count (uint32_t num)
 		for (uint32_t n = 0; n < diff; ++n) {
 			boost::shared_ptr<Plugin> p = plugin_factory (_plugins[0]);
 			add_plugin (p);
-			if (active ()) {
-				p->activate ();
-			}
 
 			if (require_state) {
-				/* XXX do something */
+				XMLNode& state = _plugins[0]->get_state ();
+				p->set_state (state, Stateful::loading_state_version);
+			}
+
+			if (active ()) {
+				p->activate ();
 			}
 		}
+		PluginConfigChanged (); /* EMIT SIGNAL */
 
 	} else if (num < _plugins.size()) {
 		uint32_t diff = _plugins.size() - num;
 		for (uint32_t n= 0; n < diff; ++n) {
 			_plugins.pop_back();
 		}
+		PluginConfigChanged (); /* EMIT SIGNAL */
 	}
 
 	return true;
 }
 
-PluginInsert::~PluginInsert ()
+
+void
+PluginInsert::set_sinks (const ChanCount& c)
+{
+	_custom_sinks = c;
+	/* no signal, change will only be visible after re-config */
+}
+
+void
+PluginInsert::set_outputs (const ChanCount& c)
 {
+	bool changed = (_custom_out != c) && _custom_cfg;
+	_custom_out = c;
+	if (changed) {
+		PluginConfigChanged (); /* EMIT SIGNAL */
+	}
+}
+
+void
+PluginInsert::set_custom_cfg (bool b)
+{
+	bool changed = _custom_cfg != b;
+	_custom_cfg = b;
+	if (changed) {
+		PluginConfigChanged (); /* EMIT SIGNAL */
+	}
+}
+
+bool
+PluginInsert::set_preset_out (const ChanCount& c)
+{
+	bool changed = _preset_out != c;
+	_preset_out = c;
+	if (changed && !_custom_cfg) {
+		PluginConfigChanged (); /* EMIT SIGNAL */
+	}
+	return changed;
+}
+
+bool
+PluginInsert::add_sidechain (uint32_t n_audio, uint32_t n_midi)
+{
+	// caller must hold process lock
+	if (_sidechain) {
+		return false;
+	}
+	std::ostringstream n;
+	if (n_audio > 0 || n_midi > 0) {
+		n << "Sidechain " << Session::next_name_id ();
+	} else {
+		n << "TO BE RESET FROM XML";
+	}
+	SideChain *sc = new SideChain (_session, n.str ());
+	_sidechain = boost::shared_ptr<SideChain> (sc);
+	_sidechain->activate ();
+	for (uint32_t n = 0; n < n_audio; ++n) {
+		_sidechain->input()->add_port ("", owner(), DataType::AUDIO); // add a port, don't connect.
+	}
+	for (uint32_t n = 0; n < n_midi; ++n) {
+		_sidechain->input()->add_port ("", owner(), DataType::MIDI); // add a port, don't connect.
+	}
+	PluginConfigChanged (); /* EMIT SIGNAL */
+	return true;
+}
+
+bool
+PluginInsert::del_sidechain ()
+{
+	if (!_sidechain) {
+		return false;
+	}
+	_sidechain.reset ();
+	_sc_playback_latency = 0;
+	_sc_capture_latency = 0;
+	PluginConfigChanged (); /* EMIT SIGNAL */
+	return true;
+}
+
+void
+PluginInsert::set_sidechain_latency (uint32_t capture, uint32_t playback)
+{
+	if (_sidechain &&
+			(_sc_playback_latency != playback || _sc_capture_latency != capture)) {
+		_sc_capture_latency = capture;
+		_sc_playback_latency = playback;
+		LatencyRange pl; pl.min = pl.max = playback;
+		LatencyRange cl; cl.min = cl.max = capture;
+		DEBUG_TRACE (DEBUG::Latency, string_compose ("%1: capture %2 playback; %3\n", _sidechain->name (), capture, playback));
+		PortSet& ps (_sidechain->input ()->ports ());
+		for (PortSet::iterator p = ps.begin(); p != ps.end(); ++p) {
+			p->set_private_latency_range (pl, true);
+			p->set_private_latency_range (cl, false);
+		}
+	}
 }
 
 void
@@ -133,6 +263,27 @@ PluginInsert::control_list_automation_state_changed (Evoral::Parameter which, Au
 ChanCount
 PluginInsert::output_streams() const
 {
+	assert (_configured);
+	return _configured_out;
+}
+
+ChanCount
+PluginInsert::input_streams() const
+{
+	assert (_configured);
+	return _configured_in;
+}
+
+ChanCount
+PluginInsert::internal_streams() const
+{
+	assert (_configured);
+	return _configured_internal;
+}
+
+ChanCount
+PluginInsert::internal_output_streams() const
+{
 	assert (!_plugins.empty());
 
 	PluginInfoPtr info = _plugins.front()->get_info();
@@ -145,13 +296,13 @@ PluginInsert::output_streams() const
 		ChanCount out = info->n_outputs;
 		// DEBUG_TRACE (DEBUG::Processors, string_compose ("Plugin insert, static output streams = %1 for %2 plugins\n", out, _plugins.size()));
 		out.set_audio (out.n_audio() * _plugins.size());
-		out.set_midi (out.n_midi() * _plugins.size() + midi_bypass.n_midi());
+		out.set_midi (out.n_midi() * _plugins.size());
 		return out;
 	}
 }
 
 ChanCount
-PluginInsert::input_streams() const
+PluginInsert::internal_input_streams() const
 {
 	assert (!_plugins.empty());
 
@@ -160,7 +311,6 @@ PluginInsert::input_streams() const
 	PluginInfoPtr info = _plugins.front()->get_info();
 
 	if (info->reconfigurable_io()) {
-		assert (_plugins.size() == 1);
 		in = _plugins.front()->input_streams();
 	} else {
 		in = info->n_inputs;
@@ -200,15 +350,31 @@ PluginInsert::input_streams() const
 ChanCount
 PluginInsert::natural_output_streams() const
 {
+#ifdef MIXBUS
+	if (is_channelstrip ()) {
+		return ChanCount::min (_configured_out, ChanCount (DataType::AUDIO, 2));
+	}
+#endif
 	return _plugins[0]->get_info()->n_outputs;
 }
 
 ChanCount
 PluginInsert::natural_input_streams() const
 {
+#ifdef MIXBUS
+	if (is_channelstrip ()) {
+		return ChanCount::min (_configured_in, ChanCount (DataType::AUDIO, 2));
+	}
+#endif
 	return _plugins[0]->get_info()->n_inputs;
 }
 
+ChanCount
+PluginInsert::sidechain_input_pins() const
+{
+	return _cached_sidechain_pins;
+}
+
 bool
 PluginInsert::has_no_inputs() const
 {
@@ -221,16 +387,48 @@ PluginInsert::has_no_audio_inputs() const
 	return _plugins[0]->get_info()->n_inputs.n_audio() == 0;
 }
 
+framecnt_t
+PluginInsert::plugin_latency () const {
+	return _plugins.front()->signal_latency ();
+}
+
 bool
-PluginInsert::is_midi_instrument() const
+PluginInsert::needs_midi_input() const
 {
-	/* XXX more finesse is possible here. VST plugins have a
-	   a specific "instrument" flag, for example.
-	 */
-	PluginInfoPtr pi = _plugins[0]->get_info();
+	PluginInfoPtr pip = _plugins[0]->get_info();
+	if (pip->needs_midi_input ()) {
+		return true;
+	}
+	return pip->n_inputs.n_midi() != 0 && pip->n_outputs.n_audio() != 0;
+}
+
+bool
+PluginInsert::has_output_presets (ChanCount in, ChanCount out)
+{
+	if (!_configured && _plugins[0]->get_info ()->reconfigurable_io ()) {
+		// collect possible configurations, prefer given in/out
+		_plugins[0]->can_support_io_configuration (in, out);
+	}
+
+	PluginOutputConfiguration ppc (_plugins[0]->possible_output ());
+
+	if (ppc.size () == 0) {
+		return false;
+	}
+	if (!strict_io () && ppc.size () == 1) {
+		return false;
+	}
 
-	return pi->n_inputs.n_midi() != 0 &&
-		pi->n_outputs.n_audio() > 0;
+	if (strict_io () && ppc.size () == 1) {
+		// "stereo" is currently preferred default for instruments
+		if (ppc.find (2) != ppc.end ()) {
+			return false;
+		}
+	}
+	if (!needs_midi_input ()) {
+			return false;
+	}
+	return true;
 }
 
 void
@@ -238,29 +436,53 @@ PluginInsert::create_automatable_parameters ()
 {
 	assert (!_plugins.empty());
 
+	boost::shared_ptr<Plugin> plugin = _plugins.front();
 	set<Evoral::Parameter> a = _plugins.front()->automatable ();
 
-	for (set<Evoral::Parameter>::iterator i = a.begin(); i != a.end(); ++i) {
-		if (i->type() == PluginAutomation) {
+	for (uint32_t i = 0; i < plugin->parameter_count(); ++i) {
+		if (!plugin->parameter_is_control (i) || !plugin->parameter_is_input (i)) {
+			continue;
+		}
+		Evoral::Parameter param (PluginAutomation, 0, i);
 
-			Evoral::Parameter param(*i);
+		ParameterDescriptor desc;
+		plugin->get_parameter_descriptor(i, desc);
 
-			ParameterDescriptor desc;
-			_plugins.front()->get_parameter_descriptor(i->id(), desc);
+		const bool automatable = a.find(param) != a.end();
 
+		if (automatable) {
 			can_automate (param);
-			boost::shared_ptr<AutomationList> list(new AutomationList(param, desc));
-			add_control (boost::shared_ptr<AutomationControl> (new PluginControl(this, param, desc, list)));
-		} else if (i->type() == PluginPropertyAutomation) {
-			Evoral::Parameter param(*i);
-			const ParameterDescriptor& desc = _plugins.front()->get_property_descriptor(param.id());
-			if (desc.datatype != Variant::NOTHING) {
-				boost::shared_ptr<AutomationList> list;
-				if (Variant::type_is_numeric(desc.datatype)) {
-					list = boost::shared_ptr<AutomationList>(new AutomationList(param, desc));
-				}
-				add_control (boost::shared_ptr<AutomationControl> (new PluginPropertyControl(this, param, desc, list)));
+		}
+		boost::shared_ptr<AutomationList> list(new AutomationList(param, desc));
+		boost::shared_ptr<AutomationControl> c (new PluginControl(this, param, desc, list));
+		if (!automatable) {
+			c->set_flags (Controllable::Flag ((int)c->flags() | Controllable::NotAutomatable));
+		}
+		add_control (c);
+		plugin->set_automation_control (i, c);
+	}
+
+
+	const Plugin::PropertyDescriptors& pdl (plugin->get_supported_properties ());
+	for (Plugin::PropertyDescriptors::const_iterator p = pdl.begin(); p != pdl.end(); ++p) {
+		Evoral::Parameter param (PluginPropertyAutomation, 0, p->first);
+		const ParameterDescriptor& desc = plugin->get_property_descriptor(param.id());
+		if (desc.datatype != Variant::NOTHING) {
+			boost::shared_ptr<AutomationList> list;
+			if (Variant::type_is_numeric(desc.datatype)) {
+				list = boost::shared_ptr<AutomationList>(new AutomationList(param, desc));
 			}
+			add_control (boost::shared_ptr<AutomationControl> (new PluginPropertyControl(this, param, desc, list)));
+		}
+	}
+
+	_bypass_port = plugin->designated_bypass_port ();
+
+	if (_bypass_port != UINT32_MAX) {
+		boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, _bypass_port));
+		if (0 == (ac->flags () & Controllable::NotAutomatable)) {
+			ac->alist()->automation_state_changed.connect_same_thread (*this, boost::bind (&PluginInsert::bypassable_changed, this));
+			ac->Changed.connect_same_thread (*this, boost::bind (&PluginInsert::enable_changed, this));
 		}
 	}
 }
@@ -333,6 +555,17 @@ PluginInsert::activate ()
 	}
 
 	Processor::activate ();
+	/* when setting state e.g ProcessorBox::paste_processor_state ()
+	 * the plugin is not yet owned by a route.
+	 * but no matter.  Route::add_processors() will call activate () again
+	 */
+	if (!owner ()) {
+		return;
+	}
+	if (_plugin_signal_latency != signal_latency ()) {
+		_plugin_signal_latency = signal_latency ();
+		latency_changed ();
+	}
 }
 
 void
@@ -343,6 +576,10 @@ PluginInsert::deactivate ()
 	for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
 		(*i)->deactivate ();
 	}
+	if (_plugin_signal_latency != signal_latency ()) {
+		_plugin_signal_latency = signal_latency ();
+		latency_changed ();
+	}
 }
 
 void
@@ -354,41 +591,148 @@ PluginInsert::flush ()
 }
 
 void
-PluginInsert::connect_and_run (BufferSet& bufs, pframes_t nframes, framecnt_t offset, bool with_auto, framepos_t now)
+PluginInsert::enable (bool yn)
 {
-	// Calculate if, and how many frames we need to collect for analysis
-	framecnt_t collect_signal_nframes = (_signal_analysis_collect_nframes_max -
-					     _signal_analysis_collected_nframes);
-	if (nframes < collect_signal_nframes) { // we might not get all frames now
-		collect_signal_nframes = nframes;
+	if (_bypass_port == UINT32_MAX) {
+		if (yn) {
+			activate ();
+		} else {
+			deactivate ();
+		}
+	} else {
+		if (!_pending_active) {
+			activate ();
+		}
+		boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, _bypass_port));
+		ac->set_value (yn ? 1.0 : 0.0, Controllable::NoGroup);
+		ActiveChanged ();
+	}
+}
+
+bool
+PluginInsert::enabled () const
+{
+	if (_bypass_port == UINT32_MAX) {
+		return Processor::enabled ();
+	} else {
+		boost::shared_ptr<const AutomationControl> ac = boost::const_pointer_cast<AutomationControl> (automation_control (Evoral::Parameter (PluginAutomation, 0, _bypass_port)));
+		return (ac->get_value () > 0 && _pending_active);
 	}
+}
 
-	ChanCount const in_streams = input_streams ();
-	ChanCount const out_streams = output_streams ();
+bool
+PluginInsert::bypassable () const
+{
+	if (_bypass_port == UINT32_MAX) {
+		return true;
+	} else {
+		boost::shared_ptr<const AutomationControl> ac = boost::const_pointer_cast<AutomationControl> (automation_control (Evoral::Parameter (PluginAutomation, 0, _bypass_port)));
 
-	ChanMapping in_map (in_streams);
-	ChanMapping out_map (out_streams);
-	bool valid;
-	if (_match.method == Split) {
-		/* fix the input mapping so that we have maps for each of the plugin's inputs */
-		in_map = ChanMapping (natural_input_streams ());
-
-		/* copy the first stream's buffer contents to the others */
-		/* XXX: audio only */
-		uint32_t first_idx = in_map.get (DataType::AUDIO, 0, &valid);
-		if (valid) {
-			for (uint32_t i = in_streams.n_audio(); i < natural_input_streams().n_audio(); ++i) {
-				bufs.get_audio(in_map.get (DataType::AUDIO, i, &valid)).read_from(bufs.get_audio(first_idx), nframes, offset, offset);
+		return !ac->automation_playback ();
+	}
+}
+
+void
+PluginInsert::enable_changed ()
+{
+	ActiveChanged ();
+}
+
+void
+PluginInsert::bypassable_changed ()
+{
+	BypassableChanged ();
+}
+
+void
+PluginInsert::inplace_silence_unconnected (BufferSet& bufs, const PinMappings& out_map, framecnt_t nframes, framecnt_t offset) const
+{
+	// TODO optimize: store "unconnected" in a fixed set.
+	// it only changes on reconfiguration.
+	for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
+		for (uint32_t out = 0; out < bufs.count().get (*t); ++out) {
+			bool mapped = false;
+			if (*t == DataType::MIDI && out == 0 && has_midi_bypass ()) {
+				mapped = true; // in-place Midi bypass
+			}
+			for (uint32_t pc = 0; pc < get_count() && !mapped; ++pc) {
+				PinMappings::const_iterator i = out_map.find (pc);
+				if (i == out_map.end ()) {
+					continue;
+				}
+				const ChanMapping& outmap (i->second);
+				for (uint32_t o = 0; o < natural_output_streams().get (*t); ++o) {
+					bool valid;
+					uint32_t idx = outmap.get (*t, o, &valid);
+					if (valid && idx == out) {
+						mapped = true;
+						break;
+					}
+				}
+			}
+			if (!mapped) {
+				bufs.get (*t, out).silence (nframes, offset);
 			}
 		}
 	}
+}
 
-	bufs.set_count(ChanCount::max(bufs.count(), in_streams));
-	bufs.set_count(ChanCount::max(bufs.count(), out_streams));
+void
+PluginInsert::connect_and_run (BufferSet& bufs, framepos_t start, framepos_t end, double speed, pframes_t nframes, framecnt_t offset, bool with_auto)
+{
+	// TODO: atomically copy maps & _no_inplace
+	PinMappings in_map (_in_map);
+	PinMappings out_map (_out_map);
+	ChanMapping thru_map (_thru_map);
+	if (_mapping_changed) { // ToDo use a counters, increment until match.
+		_no_inplace = check_inplace ();
+		_mapping_changed = false;
+	}
+
+	if (_latency_changed) {
+		/* delaylines are configured with the max possible latency (as reported by the plugin)
+		 * so this won't allocate memory (unless the plugin lied about its max latency)
+		 * It may still 'click' though, since the fixed delaylines are not de-clicked.
+		 * Then again plugin-latency changes are not click-free to begin with.
+		 *
+		 * This is also worst case, there is currently no concept of per-stream latency.
+		 *
+		 * e.g.  Two identical latent plugins:
+		 *   1st plugin: process left (latent), bypass right.
+		 *   2nd plugin: bypass left, process right (latent).
+		 * -> currently this yields 2 times latency of the plugin,
+		 */
+		_latency_changed = false;
+		_delaybuffers.set (ChanCount::max(bufs.count(), _configured_out), plugin_latency ());
+	}
 
-	/* Note that we've already required that plugins
-	   be able to handle in-place processing.
-	*/
+	if (_match.method == Split && !_no_inplace) {
+		// TODO: also use this optimization if one source-buffer
+		// feeds _all_ *connected* inputs.
+		// currently this is *first* buffer to all only --
+		// see PluginInsert::check_inplace
+		for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
+			if (_configured_internal.get (*t) == 0) {
+				continue;
+			}
+			bool valid;
+			uint32_t first_idx = in_map[0].get (*t, 0, &valid);
+			assert (valid && first_idx == 0); // check_inplace ensures this
+			/* copy the first stream's buffer contents to the others */
+			for (uint32_t i = 1; i < natural_input_streams ().get (*t); ++i) {
+				uint32_t idx = in_map[0].get (*t, i, &valid);
+				if (valid) {
+					assert (idx == 0);
+					bufs.get (*t, i).read_from (bufs.get (*t, first_idx), nframes, offset, offset);
+				}
+			}
+		}
+		/* the copy operation produces a linear monotonic input map */
+		in_map[0] = ChanMapping (natural_input_streams ());
+	}
+
+	bufs.set_count(ChanCount::max(bufs.count(), _configured_internal));
+	bufs.set_count(ChanCount::max(bufs.count(), _configured_out));
 
 	if (with_auto) {
 
@@ -402,7 +746,7 @@ PluginInsert::connect_and_run (BufferSet& bufs, pframes_t nframes, framecnt_t of
 			if (c->list() && c->automation_playback()) {
 				bool valid;
 
-				const float val = c->list()->rt_safe_eval (now, valid);
+				const float val = c->list()->rt_safe_eval (start, valid);
 
 				if (valid) {
 					/* This is the ONLY place where we are
@@ -421,37 +765,153 @@ PluginInsert::connect_and_run (BufferSet& bufs, pframes_t nframes, framecnt_t of
 		}
 	}
 
+	/* Calculate if, and how many frames we need to collect for analysis */
+	framecnt_t collect_signal_nframes = (_signal_analysis_collect_nframes_max -
+					     _signal_analysis_collected_nframes);
+	if (nframes < collect_signal_nframes) { // we might not get all frames now
+		collect_signal_nframes = nframes;
+	}
+
 	if (collect_signal_nframes > 0) {
 		// collect input
 		//std::cerr << "collect input, bufs " << bufs.count().n_audio() << " count,  " << bufs.available().n_audio() << " available" << std::endl;
-		//std::cerr << "               streams " << input_streams().n_audio() << std::endl;
+		//std::cerr << "               streams " << internal_input_streams().n_audio() << std::endl;
 		//std::cerr << "filling buffer with " << collect_signal_nframes << " frames at " << _signal_analysis_collected_nframes << std::endl;
 
 		_signal_analysis_inputs.set_count(input_streams());
 
 		for (uint32_t i = 0; i < input_streams().n_audio(); ++i) {
-			_signal_analysis_inputs.get_audio(i).read_from(
+			_signal_analysis_inputs.get_audio(i).read_from (
 				bufs.get_audio(i),
 				collect_signal_nframes,
 				_signal_analysis_collected_nframes); // offset is for target buffer
 		}
 
 	}
+#ifdef MIXBUS
+	if (is_channelstrip ()) {
+		if (_configured_in.n_audio() > 0) {
+			ChanMapping mb_in_map (ChanCount::min (_configured_in, ChanCount (DataType::AUDIO, 2)));
+			ChanMapping mb_out_map (ChanCount::min (_configured_out, ChanCount (DataType::AUDIO, 2)));
 
-	for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
-		if ((*i)->connect_and_run(bufs, in_map, out_map, nframes, offset)) {
-			deactivate ();
+			_plugins.front()->connect_and_run (bufs, start, end, speed, mb_in_map, mb_out_map, nframes, offset);
+
+			for (uint32_t out = _configured_in.n_audio (); out < bufs.count().get (DataType::AUDIO); ++out) {
+				bufs.get (DataType::AUDIO, out).silence (nframes, offset);
+			}
 		}
+	} else
+#endif
+	if (_no_inplace) {
+		// TODO optimize -- build maps once.
+		uint32_t pc = 0;
+		BufferSet& inplace_bufs  = _session.get_noinplace_buffers();
+		ARDOUR::ChanMapping used_outputs;
+
+		assert (inplace_bufs.count () >= natural_input_streams () + _configured_out);
+
+		/* build used-output map */
+		for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
+			for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
+				for (uint32_t out = 0; out < natural_output_streams().get (*t); ++out) {
+					bool valid;
+					uint32_t out_idx = out_map[pc].get (*t, out, &valid);
+					if (valid) {
+						used_outputs.set (*t, out_idx, 1); // mark as used
+					}
+				}
+			}
+		}
+		/* copy thru data to outputs before processing in-place */
 		for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
-			in_map.offset_to(*t, natural_input_streams().get(*t));
-			out_map.offset_to(*t, natural_output_streams().get(*t));
+			for (uint32_t out = 0; out < bufs.count().get (*t); ++out) {
+				bool valid;
+				uint32_t in_idx = thru_map.get (*t, out, &valid);
+				uint32_t m = out + natural_input_streams ().get (*t);
+				if (valid) {
+					_delaybuffers.delay (*t, out, inplace_bufs.get (*t, m), bufs.get (*t, in_idx), nframes, offset, offset);
+					used_outputs.set (*t, out, 1); // mark as used
+				} else {
+					used_outputs.get (*t, out, &valid);
+					if (valid) {
+						/* the plugin is expected to write here, but may not :(
+						 * (e.g. drumgizmo w/o kit loaded)
+						 */
+						inplace_bufs.get (*t, m).silence (nframes);
+					}
+				}
+			}
 		}
+
+		pc = 0;
+		for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
+
+			ARDOUR::ChanMapping i_in_map (natural_input_streams());
+			ARDOUR::ChanMapping i_out_map (out_map[pc]);
+			ARDOUR::ChanCount mapped;
+
+			/* map inputs sequentially */
+			for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
+				for (uint32_t in = 0; in < natural_input_streams().get (*t); ++in) {
+					bool valid;
+					uint32_t in_idx = in_map[pc].get (*t, in, &valid);
+					uint32_t m = mapped.get (*t);
+					if (valid) {
+						inplace_bufs.get (*t, m).read_from (bufs.get (*t, in_idx), nframes, offset, offset);
+					} else {
+						inplace_bufs.get (*t, m).silence (nframes, offset);
+					}
+					mapped.set (*t, m + 1);
+				}
+			}
+
+			/* outputs are mapped to inplace_bufs after the inputs */
+			for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
+				i_out_map.offset_to (*t, natural_input_streams ().get (*t));
+			}
+
+			if ((*i)->connect_and_run (inplace_bufs, start, end, speed, i_in_map, i_out_map, nframes, offset)) {
+				deactivate ();
+			}
+		}
+
+		/* all instances have completed, now copy data that was written
+		 * and zero unconnected buffers */
+		ARDOUR::ChanMapping nonzero_out (used_outputs);
+		if (has_midi_bypass ()) {
+			nonzero_out.set (DataType::MIDI, 0, 1); // Midi bypass.
+		}
+		for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
+			for (uint32_t out = 0; out < bufs.count().get (*t); ++out) {
+				bool valid;
+				used_outputs.get (*t, out, &valid);
+				if (!valid) {
+					nonzero_out.get (*t, out, &valid);
+					if (!valid) {
+						bufs.get (*t, out).silence (nframes, offset);
+					}
+				} else {
+					uint32_t m = out + natural_input_streams ().get (*t);
+					bufs.get (*t, out).read_from (inplace_bufs.get (*t, m), nframes, offset, offset);
+				}
+			}
+		}
+	} else {
+		/* in-place processing */
+		uint32_t pc = 0;
+		for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
+			if ((*i)->connect_and_run(bufs, start, end, speed, in_map[pc], out_map[pc], nframes, offset)) {
+				deactivate ();
+			}
+		}
+		// now silence unconnected outputs
+		inplace_silence_unconnected (bufs, _out_map, nframes, offset);
 	}
 
 	if (collect_signal_nframes > 0) {
 		// collect output
 		//std::cerr << "       output, bufs " << bufs.count().n_audio() << " count,  " << bufs.available().n_audio() << " available" << std::endl;
-		//std::cerr << "               streams " << output_streams().n_audio() << std::endl;
+		//std::cerr << "               streams " << internal_output_streams().n_audio() << std::endl;
 
 		_signal_analysis_outputs.set_count(output_streams());
 
@@ -473,67 +933,169 @@ PluginInsert::connect_and_run (BufferSet& bufs, pframes_t nframes, framecnt_t of
 					     &_signal_analysis_outputs);
 		}
 	}
-	/* leave remaining channel buffers alone */
+
+	if (_plugin_signal_latency != signal_latency ()) {
+		_plugin_signal_latency = signal_latency ();
+		latency_changed ();
+	}
 }
 
 void
-PluginInsert::silence (framecnt_t nframes)
+PluginInsert::bypass (BufferSet& bufs, pframes_t nframes)
 {
-	if (!active ()) {
-		return;
+	/* bypass the plugin(s) not the whole processor.
+	 * -> use mappings just like connect_and_run
+	 */
+
+	// TODO: atomically copy maps & _no_inplace
+	const ChanMapping in_map (no_sc_input_map ());
+	const ChanMapping out_map (output_map ());
+	if (_mapping_changed) {
+		_no_inplace = check_inplace ();
+		_mapping_changed = false;
 	}
 
-	ChanMapping in_map(input_streams());
-	ChanMapping out_map(output_streams());
+	bufs.set_count(ChanCount::max(bufs.count(), _configured_internal));
+	bufs.set_count(ChanCount::max(bufs.count(), _configured_out));
 
-	if (_match.method == Split) {
-		/* fix the input mapping so that we have maps for each of the plugin's inputs */
-		in_map = ChanMapping (natural_input_streams ());
+	if (_no_inplace) {
+		ChanMapping thru_map (_thru_map);
+
+		BufferSet& inplace_bufs  = _session.get_noinplace_buffers();
+		// copy all inputs
+		for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
+			for (uint32_t in = 0; in < _configured_internal.get (*t); ++in) {
+				inplace_bufs.get (*t, in).read_from (bufs.get (*t, in), nframes, 0, 0);
+			}
+		}
+		ARDOUR::ChanMapping used_outputs;
+		// copy thru
+		for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
+			for (uint32_t out = 0; out < _configured_out.get (*t); ++out) {
+				bool valid;
+				uint32_t in_idx = thru_map.get (*t, out, &valid);
+				if (valid) {
+					bufs.get (*t, out).read_from (inplace_bufs.get (*t, in_idx), nframes, 0, 0);
+					used_outputs.set (*t, out, 1); // mark as used
+				}
+			}
+		}
+		// plugin no-op: assume every plugin has an internal identity map
+		for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
+			for (uint32_t out = 0; out < _configured_out.get (*t); ++out) {
+				bool valid;
+				uint32_t src_idx = out_map.get_src (*t, out, &valid);
+				if (!valid) {
+					continue;
+				}
+				uint32_t in_idx = in_map.get (*t, src_idx, &valid);
+				if (!valid) {
+					continue;
+				}
+				bufs.get (*t, out).read_from (inplace_bufs.get (*t, in_idx), nframes, 0, 0);
+				used_outputs.set (*t, out, 1); // mark as used
+			}
+		}
+		// now silence all unused outputs
+		if (has_midi_bypass ()) {
+			used_outputs.set (DataType::MIDI, 0, 1); // Midi bypass.
+		}
+		for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
+			for (uint32_t out = 0; out < _configured_out.get (*t); ++out) {
+				bool valid;
+				used_outputs.get (*t, out, &valid);
+				if (!valid) {
+						bufs.get (*t, out).silence (nframes, 0);
+				}
+			}
+		}
+	} else {
+		if (_match.method == Split) {
+			for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
+				if (_configured_internal.get (*t) == 0) {
+					continue;
+				}
+				// copy/feeds _all_ *connected* inputs, copy the first buffer
+				bool valid;
+				uint32_t first_idx = in_map.get (*t, 0, &valid);
+				assert (valid && first_idx == 0); // check_inplace ensures this
+				for (uint32_t i = 1; i < natural_input_streams ().get (*t); ++i) {
+					uint32_t idx = in_map.get (*t, i, &valid);
+					if (valid) {
+						assert (idx == 0);
+						bufs.get (*t, i).read_from (bufs.get (*t, first_idx), nframes, 0, 0);
+					}
+				}
+			}
+		}
+
+		// apply output map and/or monotonic but not identity i/o mappings
+		for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
+			for (uint32_t out = 0; out < _configured_out.get (*t); ++out) {
+				bool valid;
+				uint32_t src_idx = out_map.get_src (*t, out, &valid);
+				if (!valid) {
+					bufs.get (*t, out).silence (nframes, 0);
+					continue;
+				}
+				uint32_t in_idx = in_map.get (*t, src_idx, &valid);
+				if (!valid) {
+					bufs.get (*t, out).silence (nframes, 0);
+					continue;
+				}
+				if (in_idx != src_idx) {
+					bufs.get (*t, out).read_from (bufs.get (*t, in_idx), nframes, 0, 0);
+				}
+			}
+		}
 	}
+}
 
+void
+PluginInsert::silence (framecnt_t nframes, framepos_t start_frame)
+{
+	if (!active ()) {
+		return;
+	}
+
+	_delaybuffers.flush ();
+
+	ChanMapping in_map (natural_input_streams ());
+	ChanMapping out_map (natural_output_streams ());
+	ChanCount maxbuf = ChanCount::max (natural_input_streams (), natural_output_streams());
+#ifdef MIXBUS
+	if (is_channelstrip ()) {
+		if (_configured_in.n_audio() > 0) {
+			_plugins.front()->connect_and_run (_session.get_scratch_buffers (maxbuf, true), start_frame, start_frame + nframes, 1.0, in_map, out_map, nframes, 0);
+		}
+	} else
+#endif
 	for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
-		(*i)->connect_and_run (_session.get_scratch_buffers ((*i)->get_info()->n_inputs, true), in_map, out_map, nframes, 0);
+		(*i)->connect_and_run (_session.get_scratch_buffers (maxbuf, true), start_frame, start_frame + nframes, 1.0, in_map, out_map, nframes, 0);
 	}
 }
 
 void
-PluginInsert::run (BufferSet& bufs, framepos_t start_frame, framepos_t /*end_frame*/, pframes_t nframes, bool)
+PluginInsert::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, double speed, pframes_t nframes, bool)
 {
+	if (_sidechain) {
+		// collect sidechain input for complete cycle (!)
+		// TODO we need delaylines here for latency compensation
+		_sidechain->run (bufs, start_frame, end_frame, speed, nframes, true);
+	}
+
 	if (_pending_active) {
 		/* run as normal if we are active or moving from inactive to active */
 
 		if (_session.transport_rolling() || _session.bounce_processing()) {
-			automation_run (bufs, start_frame, nframes);
+			automation_run (bufs, start_frame, end_frame, speed, nframes);
 		} else {
-			connect_and_run (bufs, nframes, 0, false);
+			connect_and_run (bufs, start_frame, end_frame, speed, nframes, 0, false);
 		}
 
 	} else {
-		uint32_t in = input_streams ().n_audio ();
-		uint32_t out = output_streams().n_audio ();
-
-		if (has_no_audio_inputs() || in == 0) {
-
-			/* silence all (audio) outputs. Should really declick
-			 * at the transitions of "active"
-			 */
-
-			for (uint32_t n = 0; n < out; ++n) {
-				bufs.get_audio (n).silence (nframes);
-			}
-
-		} else if (out > in) {
-
-			/* not active, but something has make up for any channel count increase */
-
-			// TODO: option round-robin (n % in) or silence additional buffers ??
-			// for now , simply replicate last buffer
-			for (uint32_t n = in; n < out; ++n) {
-				bufs.get_audio(n).read_from(bufs.get_audio(in - 1), nframes);
-			}
-		}
-
-		bufs.count().set_audio (out);
+		bypass (bufs, nframes);
+		_delaybuffers.flush ();
 	}
 
 	_active = _pending_active;
@@ -541,43 +1103,40 @@ PluginInsert::run (BufferSet& bufs, framepos_t start_frame, framepos_t /*end_fra
 	/* we have no idea whether the plugin generated silence or not, so mark
 	 * all buffers appropriately.
 	 */
-
 }
 
 void
-PluginInsert::automation_run (BufferSet& bufs, framepos_t start, pframes_t nframes)
+PluginInsert::automation_run (BufferSet& bufs, framepos_t start, framepos_t end, double speed, pframes_t nframes)
 {
 	Evoral::ControlEvent next_event (0, 0.0f);
-	framepos_t now = start;
-	framepos_t end = now + nframes;
 	framecnt_t offset = 0;
 
 	Glib::Threads::Mutex::Lock lm (control_lock(), Glib::Threads::TRY_LOCK);
 
 	if (!lm.locked()) {
-		connect_and_run (bufs, nframes, offset, false);
+		connect_and_run (bufs, start, end, speed, nframes, offset, false);
 		return;
 	}
 
-	if (!find_next_event (now, end, next_event) || requires_fixed_sized_buffers()) {
+	if (!find_next_event (start, end, next_event) || _plugins.front()->requires_fixed_sized_buffers()) {
 
 		/* no events have a time within the relevant range */
 
-		connect_and_run (bufs, nframes, offset, true, now);
+		connect_and_run (bufs, start, end, speed, nframes, offset, true);
 		return;
 	}
 
 	while (nframes) {
 
-		framecnt_t cnt = min (((framecnt_t) ceil (next_event.when) - now), (framecnt_t) nframes);
+		framecnt_t cnt = min (((framecnt_t) ceil (next_event.when) - start), (framecnt_t) nframes);
 
-		connect_and_run (bufs, cnt, offset, true, now);
+		connect_and_run (bufs, start, start + cnt, speed, cnt, offset, true); // XXX (start + cnt) * speed
 
 		nframes -= cnt;
 		offset += cnt;
-		now += cnt;
+		start += cnt;
 
-		if (!find_next_event (now, end, next_event)) {
+		if (!find_next_event (start, end, next_event)) {
 			break;
 		}
 	}
@@ -585,7 +1144,7 @@ PluginInsert::automation_run (BufferSet& bufs, framepos_t start, pframes_t nfram
 	/* cleanup anything that is left to do */
 
 	if (nframes) {
-		connect_and_run (bufs, nframes, offset, true, now);
+		connect_and_run (bufs, start, start + nframes, speed, nframes, offset, true);
 	}
 }
 
@@ -648,83 +1207,524 @@ PluginInsert::reset_parameters_to_default ()
 		const float dflt = _plugins[0]->default_value (cid);
 		const float curr = _plugins[0]->get_parameter (cid);
 
-		if (dflt == curr) {
-			continue;
+		if (dflt == curr) {
+			continue;
+		}
+
+		boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter(PluginAutomation, 0, cid));
+		if (!ac) {
+			continue;
+		}
+
+		if (ac->automation_state() & Play) {
+			all = false;
+			continue;
+		}
+
+		ac->set_value (dflt, Controllable::NoGroup);
+	}
+	return all;
+}
+
+boost::shared_ptr<Plugin>
+PluginInsert::plugin_factory (boost::shared_ptr<Plugin> other)
+{
+	boost::shared_ptr<LadspaPlugin> lp;
+	boost::shared_ptr<LuaProc> lua;
+#ifdef LV2_SUPPORT
+	boost::shared_ptr<LV2Plugin> lv2p;
+#endif
+#ifdef WINDOWS_VST_SUPPORT
+	boost::shared_ptr<WindowsVSTPlugin> vp;
+#endif
+#ifdef LXVST_SUPPORT
+	boost::shared_ptr<LXVSTPlugin> lxvp;
+#endif
+#ifdef AUDIOUNIT_SUPPORT
+	boost::shared_ptr<AUPlugin> ap;
+#endif
+
+	if ((lp = boost::dynamic_pointer_cast<LadspaPlugin> (other)) != 0) {
+		return boost::shared_ptr<Plugin> (new LadspaPlugin (*lp));
+	} else if ((lua = boost::dynamic_pointer_cast<LuaProc> (other)) != 0) {
+		return boost::shared_ptr<Plugin> (new LuaProc (*lua));
+#ifdef LV2_SUPPORT
+	} else if ((lv2p = boost::dynamic_pointer_cast<LV2Plugin> (other)) != 0) {
+		return boost::shared_ptr<Plugin> (new LV2Plugin (*lv2p));
+#endif
+#ifdef WINDOWS_VST_SUPPORT
+	} else if ((vp = boost::dynamic_pointer_cast<WindowsVSTPlugin> (other)) != 0) {
+		return boost::shared_ptr<Plugin> (new WindowsVSTPlugin (*vp));
+#endif
+#ifdef LXVST_SUPPORT
+	} else if ((lxvp = boost::dynamic_pointer_cast<LXVSTPlugin> (other)) != 0) {
+		return boost::shared_ptr<Plugin> (new LXVSTPlugin (*lxvp));
+#endif
+#ifdef AUDIOUNIT_SUPPORT
+	} else if ((ap = boost::dynamic_pointer_cast<AUPlugin> (other)) != 0) {
+		return boost::shared_ptr<Plugin> (new AUPlugin (*ap));
+#endif
+	}
+
+	fatal << string_compose (_("programming error: %1"),
+			  X_("unknown plugin type in PluginInsert::plugin_factory"))
+	      << endmsg;
+	abort(); /*NOTREACHED*/
+	return boost::shared_ptr<Plugin> ((Plugin*) 0);
+}
+
+void
+PluginInsert::set_input_map (uint32_t num, ChanMapping m) {
+	if (num < _in_map.size()) {
+		bool changed = _in_map[num] != m;
+		_in_map[num] = m;
+		changed |= sanitize_maps ();
+		if (changed) {
+			PluginMapChanged (); /* EMIT SIGNAL */
+			_mapping_changed = true;
+			_session.set_dirty();
+		}
+	}
+}
+
+void
+PluginInsert::set_output_map (uint32_t num, ChanMapping m) {
+	if (num < _out_map.size()) {
+		bool changed = _out_map[num] != m;
+		_out_map[num] = m;
+		changed |= sanitize_maps ();
+		if (changed) {
+			PluginMapChanged (); /* EMIT SIGNAL */
+			_mapping_changed = true;
+			_session.set_dirty();
+		}
+	}
+}
+
+void
+PluginInsert::set_thru_map (ChanMapping m) {
+	bool changed = _thru_map != m;
+	_thru_map = m;
+	changed |= sanitize_maps ();
+	if (changed) {
+		PluginMapChanged (); /* EMIT SIGNAL */
+		_mapping_changed = true;
+		_session.set_dirty();
+	}
+}
+
+bool
+PluginInsert::pre_seed (const ChanCount& in, const ChanCount& out,
+		const ChanMapping& im, const ChanMapping& om, const ChanMapping& tm)
+{
+	if (_configured) { return false; }
+	_configured_in = in;
+	_configured_out = out;
+	_in_map[0] = im;
+	_out_map[0] = om;
+	_thru_map = tm;
+	_maps_from_state = in.n_total () > 0 && out.n_total () > 0;
+	return true;
+}
+
+ChanMapping
+PluginInsert::input_map () const
+{
+	ChanMapping rv;
+	uint32_t pc = 0;
+	for (PinMappings::const_iterator i = _in_map.begin (); i != _in_map.end (); ++i, ++pc) {
+		ChanMapping m (i->second);
+		const ChanMapping::Mappings& mp ((*i).second.mappings());
+		for (ChanMapping::Mappings::const_iterator tm = mp.begin(); tm != mp.end(); ++tm) {
+			for (ChanMapping::TypeMapping::const_iterator i = tm->second.begin(); i != tm->second.end(); ++i) {
+				rv.set (tm->first, i->first + pc * natural_input_streams().get(tm->first), i->second);
+			}
+		}
+	}
+	return rv;
+}
+
+
+ChanMapping
+PluginInsert::no_sc_input_map () const
+{
+	ChanMapping rv;
+	uint32_t pc = 0;
+	for (PinMappings::const_iterator i = _in_map.begin (); i != _in_map.end (); ++i, ++pc) {
+		ChanMapping m (i->second);
+		const ChanMapping::Mappings& mp ((*i).second.mappings());
+		for (ChanMapping::Mappings::const_iterator tm = mp.begin(); tm != mp.end(); ++tm) {
+			uint32_t ins = natural_input_streams().get(tm->first) - _cached_sidechain_pins.get(tm->first);
+			for (ChanMapping::TypeMapping::const_iterator i = tm->second.begin(); i != tm->second.end(); ++i) {
+				if (i->first < ins) {
+					rv.set (tm->first, i->first + pc * ins, i->second);
+				}
+			}
+		}
+	}
+	return rv;
+}
+
+ChanMapping
+PluginInsert::output_map () const
+{
+	ChanMapping rv;
+	uint32_t pc = 0;
+	for (PinMappings::const_iterator i = _out_map.begin (); i != _out_map.end (); ++i, ++pc) {
+		ChanMapping m (i->second);
+		const ChanMapping::Mappings& mp ((*i).second.mappings());
+		for (ChanMapping::Mappings::const_iterator tm = mp.begin(); tm != mp.end(); ++tm) {
+			for (ChanMapping::TypeMapping::const_iterator i = tm->second.begin(); i != tm->second.end(); ++i) {
+				rv.set (tm->first, i->first + pc * natural_output_streams().get(tm->first), i->second);
+			}
+		}
+	}
+	if (has_midi_bypass ()) {
+		rv.set (DataType::MIDI, 0, 0);
+	}
+
+	return rv;
+}
+
+bool
+PluginInsert::has_midi_bypass () const
+{
+	if (_configured_in.n_midi () == 1 && _configured_out.n_midi () == 1
+			&& natural_output_streams ().n_midi () == 0) {
+		return true;
+	}
+	return false;
+}
+
+bool
+PluginInsert::has_midi_thru () const
+{
+	if (_configured_in.n_midi () == 1 && _configured_out.n_midi () == 1
+			&& natural_input_streams ().n_midi () == 0 && natural_output_streams ().n_midi () == 0) {
+		return true;
+	}
+	return false;
+}
+
+#ifdef MIXBUS
+bool
+PluginInsert::is_channelstrip () const {
+	return _plugins.front()->is_channelstrip();
+}
+#endif
+
+bool
+PluginInsert::check_inplace ()
+{
+	bool inplace_ok = !_plugins.front()->inplace_broken ();
+
+	if (_thru_map.n_total () > 0) {
+		// TODO once midi-bypass is part of the mapping, ignore it
+		inplace_ok = false;
+	}
+
+	if (_match.method == Split && inplace_ok) {
+		assert (get_count() == 1);
+		assert (_in_map.size () == 1);
+		if (!_out_map[0].is_monotonic ()) {
+			inplace_ok = false;
+		}
+		if (_configured_internal != _configured_in) {
+			/* no sidechain -- TODO we could allow this with
+			 * some more logic in PluginInsert::connect_and_run().
+			 *
+			 * PluginInsert::reset_map() already maps it.
+			 */
+			inplace_ok = false;
+		}
+		/* check mapping */
+		for (DataType::iterator t = DataType::begin(); t != DataType::end() && inplace_ok; ++t) {
+			if (_configured_internal.get (*t) == 0) {
+				continue;
+			}
+			bool valid;
+			uint32_t first_idx = _in_map[0].get (*t, 0, &valid);
+			if (!valid || first_idx != 0) {
+				// so far only allow to copy the *first* stream's buffer to others
+				inplace_ok = false;
+			} else {
+				for (uint32_t i = 1; i < natural_input_streams ().get (*t); ++i) {
+					uint32_t idx = _in_map[0].get (*t, i, &valid);
+					if (valid && idx != first_idx) {
+						inplace_ok = false;
+						break;
+					}
+				}
+			}
+		}
+
+		if (inplace_ok) {
+			DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: In Place Split Map\n", name()));
+			return false;
+		}
+	}
+
+	for (uint32_t pc = 0; pc < get_count() && inplace_ok ; ++pc) {
+		if (!_in_map[pc].is_monotonic ()) {
+			inplace_ok = false;
+		}
+		if (!_out_map[pc].is_monotonic ()) {
+			inplace_ok = false;
+		}
+	}
+
+	if (inplace_ok) {
+		/* check if every output is fed by the corresponding input
+		 *
+		 * this prevents  in-port 1 -> sink-pin 2  ||  source-pin 1 -> out port 1, source-pin 2 -> out port 2
+		 * (with in-place,  source-pin 1 -> out port 1 overwrites in-port 1)
+		 *
+		 * but allows     in-port 1 -> sink-pin 2  ||  source-pin 2 -> out port 1
+		 */
+		ChanMapping in_map (input_map ());
+		const ChanMapping::Mappings out_m (output_map ().mappings ());
+		for (ChanMapping::Mappings::const_iterator t = out_m.begin (); t != out_m.end () && inplace_ok; ++t) {
+			for (ChanMapping::TypeMapping::const_iterator c = (*t).second.begin (); c != (*t).second.end () ; ++c) {
+				/* src-pin: c->first, out-port: c->second */
+				bool valid;
+				uint32_t in_port = in_map.get (t->first, c->first, &valid);
+				if (valid && in_port != c->second) {
+					inplace_ok = false;
+					break;
+				}
+			}
+		}
+	}
+
+	DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: %2\n", name(), inplace_ok ? "In-Place" : "No Inplace Processing"));
+	return !inplace_ok; // no-inplace
+}
+
+bool
+PluginInsert::sanitize_maps ()
+{
+	bool changed = false;
+	/* strip dead wood */
+	PinMappings new_ins;
+	PinMappings new_outs;
+	ChanMapping new_thru;
+
+	for (uint32_t pc = 0; pc < get_count(); ++pc) {
+		ChanMapping new_in;
+		ChanMapping new_out;
+		for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
+			for (uint32_t i = 0; i < natural_input_streams().get (*t); ++i) {
+				bool valid;
+				uint32_t idx = _in_map[pc].get (*t, i, &valid);
+				if (valid && idx < _configured_internal.get (*t)) {
+					new_in.set (*t, i, idx);
+				}
+			}
+			for (uint32_t o = 0; o < natural_output_streams().get (*t); ++o) {
+				bool valid;
+				uint32_t idx = _out_map[pc].get (*t, o, &valid);
+				if (valid && idx < _configured_out.get (*t)) {
+					new_out.set (*t, o, idx);
+				}
+			}
+		}
+		if (_in_map[pc] != new_in || _out_map[pc] != new_out) {
+			changed = true;
+		}
+		new_ins[pc] = new_in;
+		new_outs[pc] = new_out;
+	}
+
+	/* prevent dup output assignments */
+	for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
+		for (uint32_t o = 0; o < _configured_out.get (*t); ++o) {
+			bool mapped = false;
+			for (uint32_t pc = 0; pc < get_count(); ++pc) {
+				bool valid;
+				uint32_t idx = new_outs[pc].get_src (*t, o, &valid);
+				if (valid && mapped) {
+					new_outs[pc].unset (*t, idx);
+				} else if (valid) {
+					mapped = true;
+				}
+			}
 		}
+	}
 
-		boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter(PluginAutomation, 0, cid));
-		if (!ac) {
-			continue;
+	/* remove excess thru */
+	for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
+		for (uint32_t o = 0; o < _configured_out.get (*t); ++o) {
+			bool valid;
+			uint32_t idx = _thru_map.get (*t, o, &valid);
+			if (valid && idx < _configured_internal.get (*t)) {
+				new_thru.set (*t, o, idx);
+			}
 		}
+	}
 
-		if (ac->automation_state() & Play) {
-			all = false;
-			continue;
+	/* prevent out + thru,  existing plugin outputs override thru */
+	for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
+		for (uint32_t o = 0; o < _configured_out.get (*t); ++o) {
+			bool mapped = false;
+			bool valid;
+			for (uint32_t pc = 0; pc < get_count(); ++pc) {
+				new_outs[pc].get_src (*t, o, &mapped);
+				if (mapped) { break; }
+			}
+			if (!mapped) { continue; }
+			uint32_t idx = new_thru.get (*t, o, &valid);
+			if (mapped) {
+				new_thru.unset (*t, idx);
+			}
 		}
+	}
 
-		ac->set_value (dflt, Controllable::NoGroup);
+	if (has_midi_bypass ()) {
+		// TODO: include midi-bypass in the thru set,
+		// remove dedicated handling.
+		new_thru.unset (DataType::MIDI, 0);
 	}
-	return all;
+
+	if (_in_map != new_ins || _out_map != new_outs || _thru_map != new_thru) {
+		changed = true;
+	}
+	_in_map = new_ins;
+	_out_map = new_outs;
+	_thru_map = new_thru;
+
+	return changed;
 }
 
-boost::shared_ptr<Plugin>
-PluginInsert::plugin_factory (boost::shared_ptr<Plugin> other)
+bool
+PluginInsert::reset_map (bool emit)
 {
-	boost::shared_ptr<LadspaPlugin> lp;
-#ifdef LV2_SUPPORT
-	boost::shared_ptr<LV2Plugin> lv2p;
-#endif
-#ifdef WINDOWS_VST_SUPPORT
-	boost::shared_ptr<WindowsVSTPlugin> vp;
-#endif
-#ifdef LXVST_SUPPORT
-	boost::shared_ptr<LXVSTPlugin> lxvp;
-#endif
-#ifdef AUDIOUNIT_SUPPORT
-	boost::shared_ptr<AUPlugin> ap;
-#endif
+	const PinMappings old_in (_in_map);
+	const PinMappings old_out (_out_map);
 
-	if ((lp = boost::dynamic_pointer_cast<LadspaPlugin> (other)) != 0) {
-		return boost::shared_ptr<Plugin> (new LadspaPlugin (*lp));
-#ifdef LV2_SUPPORT
-	} else if ((lv2p = boost::dynamic_pointer_cast<LV2Plugin> (other)) != 0) {
-		return boost::shared_ptr<Plugin> (new LV2Plugin (*lv2p));
-#endif
-#ifdef WINDOWS_VST_SUPPORT
-	} else if ((vp = boost::dynamic_pointer_cast<WindowsVSTPlugin> (other)) != 0) {
-		return boost::shared_ptr<Plugin> (new WindowsVSTPlugin (*vp));
-#endif
-#ifdef LXVST_SUPPORT
-	} else if ((lxvp = boost::dynamic_pointer_cast<LXVSTPlugin> (other)) != 0) {
-		return boost::shared_ptr<Plugin> (new LXVSTPlugin (*lxvp));
-#endif
-#ifdef AUDIOUNIT_SUPPORT
-	} else if ((ap = boost::dynamic_pointer_cast<AUPlugin> (other)) != 0) {
-		return boost::shared_ptr<Plugin> (new AUPlugin (*ap));
-#endif
+	_in_map.clear ();
+	_out_map.clear ();
+	_thru_map = ChanMapping ();
+
+	/* build input map */
+	for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
+		uint32_t sc = 0; // side-chain round-robin (all instances)
+		uint32_t pc = 0;
+		for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
+			const uint32_t nis = natural_input_streams ().get(*t);
+			const uint32_t stride = nis - sidechain_input_pins().get (*t);
+
+			/* SC inputs are last in the plugin-insert.. */
+			const uint32_t sc_start = _configured_in.get (*t);
+			const uint32_t sc_len = _configured_internal.get (*t) - sc_start;
+			/* ...but may not be at the end of the plugin ports.
+			 * in case the side-chain is not the last port, shift connections back.
+			 * and connect to side-chain
+			 */
+			uint32_t shift = 0;
+			uint32_t ic = 0; // split inputs
+			const uint32_t cend = _configured_in.get (*t);
+
+			for (uint32_t in = 0; in < nis; ++in) {
+				const Plugin::IOPortDescription& iod (_plugins[pc]->describe_io_port (*t, true, in));
+				if (iod.is_sidechain) {
+					/* connect sidechain sinks to sidechain inputs in round-robin fashion */
+					if (sc_len > 0) {// side-chain may be hidden
+						_in_map[pc].set (*t, in, sc_start + sc);
+						sc = (sc + 1) % sc_len;
+					}
+					++shift;
+				} else {
+					if (_match.method == Split) {
+						if (cend == 0) { continue; }
+						if (_strict_io && ic + stride * pc >= cend) {
+							break;
+						}
+						/* connect *no* sidechain sinks in round-robin fashion */
+						_in_map[pc].set (*t, in, ic + stride * pc);
+						if (_strict_io && (ic + 1) == cend) {
+							break;
+						}
+						ic = (ic + 1) % cend;
+					} else {
+						uint32_t s = in - shift;
+						if (stride * pc + s < cend) {
+							_in_map[pc].set (*t, in, s + stride * pc);
+						}
+					}
+				}
+			}
+		}
 	}
 
-	fatal << string_compose (_("programming error: %1"),
-			  X_("unknown plugin type in PluginInsert::plugin_factory"))
-	      << endmsg;
-	abort(); /*NOTREACHED*/
-	return boost::shared_ptr<Plugin> ((Plugin*) 0);
+	/* build output map */
+	uint32_t pc = 0;
+	for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
+		_out_map[pc] = ChanMapping (ChanCount::min (natural_output_streams(), _configured_out));
+		for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
+			_out_map[pc].offset_to(*t, pc * natural_output_streams().get(*t));
+		}
+	}
+
+	sanitize_maps ();
+	if (old_in == _in_map && old_out == _out_map) {
+		return false;
+	}
+	if (emit) {
+		PluginMapChanged (); /* EMIT SIGNAL */
+		_mapping_changed = true;
+		_session.set_dirty();
+	}
+	return true;
 }
 
 bool
 PluginInsert::configure_io (ChanCount in, ChanCount out)
 {
 	Match old_match = _match;
-	ChanCount old_in = input_streams ();
-	ChanCount old_out = output_streams ();
+	ChanCount old_in;
+	ChanCount old_internal;
+	ChanCount old_out;
+	ChanCount old_pins;
+
+	old_pins = natural_input_streams();
+	old_in = _configured_in;
+	old_out = _configured_out;
+	old_internal = _configured_internal;
 
 	_configured_in = in;
+	_configured_internal = in;
 	_configured_out = out;
 
-	/* set the matching method and number of plugins that we will use to meet this configuration */
+	if (_sidechain) {
+		/* TODO hide midi-bypass, and custom outs. Best /fake/ "out" here.
+		 * (currently _sidechain->configure_io always succeeds
+		 *  since Processor::configure_io() succeeds)
+		 */
+		if (!_sidechain->configure_io (in, out)) {
+			DEBUG_TRACE (DEBUG::ChanMapping, "Sidechain configuration failed\n");
+			return false;
+		}
+		_configured_internal += _sidechain->input()->n_ports();
+
+		// include (static_cast<Route*>owner())->name() ??
+		_sidechain->input ()-> set_pretty_name (string_compose (_("SC %1"), name ()));
+	}
+
+	/* get plugin configuration */
 	_match = private_can_support_io_configuration (in, out);
+#ifndef NDEBUG
+	if (DEBUG_ENABLED(DEBUG::ChanMapping)) {
+		DEBUG_STR_DECL(a);
+		DEBUG_STR_APPEND(a, string_compose ("%1: ",  name()));
+		DEBUG_STR_APPEND(a, _match);
+		DEBUG_TRACE (DEBUG::ChanMapping, DEBUG_STR(a).str());
+	}
+#endif
+
+	/* set the matching method and number of plugins that we will use to meet this configuration */
 	if (set_count (_match.plugins) == false) {
 		PluginIoReConfigure (); /* EMIT SIGNAL */
+		_configured = false;
 		return false;
 	}
 
@@ -732,40 +1732,188 @@ PluginInsert::configure_io (ChanCount in, ChanCount out)
 	switch (_match.method) {
 	case Split:
 	case Hide:
-		if (_plugins.front()->configure_io (_plugins.front()->get_info()->n_inputs, out) == false) {
+		if (_plugins.front()->configure_io (natural_input_streams(), out) == false) {
 			PluginIoReConfigure (); /* EMIT SIGNAL */
+			_configured = false;
 			return false;
 		}
 		break;
+	case Delegate:
+		{
+			ChanCount din (_configured_internal);
+			ChanCount dout (din); // hint
+			if (_custom_cfg) {
+				if (_custom_sinks.n_total () > 0) {
+					din = _custom_sinks;
+				}
+				dout = _custom_out;
+			} else if (_preset_out.n_audio () > 0) {
+				dout.set (DataType::AUDIO, _preset_out.n_audio ());
+			} else if (dout.n_midi () > 0 && dout.n_audio () == 0) {
+				dout.set (DataType::AUDIO, 2);
+			}
+			if (out.n_audio () == 0) { out.set (DataType::AUDIO, 1); }
+			ChanCount useins;
+			DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: Delegate lookup : %2 %3\n", name(), din, dout));
+			bool const r = _plugins.front()->can_support_io_configuration (din, dout, &useins);
+			assert (r);
+			if (useins.n_audio() == 0) {
+				useins = din;
+			}
+			DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: Delegate configuration: %2 %3\n", name(), useins, dout));
 
+			if (_plugins.front()->configure_io (useins, dout) == false) {
+				PluginIoReConfigure (); /* EMIT SIGNAL */
+				_configured = false;
+				return false;
+			}
+			if (!_custom_cfg) {
+				_custom_sinks = din;
+			}
+		}
+		break;
 	default:
 		if (_plugins.front()->configure_io (in, out) == false) {
 			PluginIoReConfigure (); /* EMIT SIGNAL */
+			_configured = false;
 			return false;
 		}
 		break;
 	}
 
-	if (  (old_match.method != _match.method && (old_match.method == Split || _match.method == Split))
-			|| old_in != in
-			|| old_out != out
-			)
-	{
+	DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: cfg:%2 state:%3 chn-in:%4 chn-out:%5 inpin:%6 match:%7 cust:%8 size-in:%9 size-out:%10\n",
+				name (),
+				_configured ? "Y" : "N",
+				_maps_from_state ? "Y" : "N",
+				old_in == in ? "==" : "!=",
+				old_out == out ? "==" : "!=",
+				old_pins == natural_input_streams () ? "==" : "!=",
+				old_match.method == _match.method ? "==" : "!=",
+				old_match.custom_cfg == _match.custom_cfg ? "==" : "!=",
+				_in_map.size() == get_count () ? "==" : "!=",
+				_out_map.size() == get_count () ? "==" : "!="
+				));
+
+	bool mapping_changed = false;
+	if (old_in == in && old_out == out
+			&& _configured
+			&& old_pins == natural_input_streams ()
+			&& old_match.method == _match.method
+			&& old_match.custom_cfg == _match.custom_cfg
+			&& _in_map.size() == _out_map.size()
+			&& _in_map.size() == get_count ()
+		 ) {
+		assert (_maps_from_state == false);
+		/* If the configuration has not changed, keep the mapping */
+		mapping_changed = sanitize_maps ();
+	} else if (_match.custom_cfg && _configured) {
+		assert (_maps_from_state == false);
+		/* don't touch the map in manual mode */
+		mapping_changed = sanitize_maps ();
+	} else {
+#ifdef MIXBUS
+		if (is_channelstrip ()) {
+			/* fake channel map - for wire display */
+			_in_map.clear ();
+			_out_map.clear ();
+			_thru_map = ChanMapping ();
+			_in_map[0] = ChanMapping (ChanCount::min (_configured_in, ChanCount (DataType::AUDIO, 2)));
+			_out_map[0] = ChanMapping (ChanCount::min (_configured_out, ChanCount (DataType::AUDIO, 2)));
+			/* set "thru" map for in-place forward of audio */
+			for (uint32_t i = 2; i < _configured_in.n_audio(); ++i) {
+				_thru_map.set (DataType::AUDIO, i, i);
+			}
+			/* and midi (after implicit 1st channel bypass) */
+			for (uint32_t i = 1; i < _configured_in.n_midi(); ++i) {
+				_thru_map.set (DataType::MIDI, i, i);
+			}
+		} else
+#endif
+		if (_maps_from_state && old_in == in && old_out == out) {
+			mapping_changed = true;
+			sanitize_maps ();
+		} else {
+			/* generate a new mapping */
+			mapping_changed = reset_map (false);
+		}
+		_maps_from_state = false;
+	}
+
+	if (mapping_changed) {
+		PluginMapChanged (); /* EMIT SIGNAL */
+
+#ifndef NDEBUG
+		if (DEBUG_ENABLED(DEBUG::ChanMapping)) {
+			uint32_t pc = 0;
+			DEBUG_STR_DECL(a);
+			DEBUG_STR_APPEND(a, "\n--------<<--------\n");
+			for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
+				if (pc > 0) {
+			DEBUG_STR_APPEND(a, "----><----\n");
+				}
+				DEBUG_STR_APPEND(a, string_compose ("Channel Map for %1 plugin %2\n", name(), pc));
+				DEBUG_STR_APPEND(a, " * Inputs:\n");
+				DEBUG_STR_APPEND(a, _in_map[pc]);
+				DEBUG_STR_APPEND(a, " * Outputs:\n");
+				DEBUG_STR_APPEND(a, _out_map[pc]);
+			}
+			DEBUG_STR_APPEND(a, " * Thru:\n");
+			DEBUG_STR_APPEND(a, _thru_map);
+			DEBUG_STR_APPEND(a, "-------->>--------\n");
+			DEBUG_TRACE (DEBUG::ChanMapping, DEBUG_STR(a).str());
+		}
+#endif
+	}
+
+	_no_inplace = check_inplace ();
+	_mapping_changed = false;
+
+	/* only the "noinplace_buffers" thread buffers need to be this large,
+	 * this can be optimized. other buffers are fine with
+	 * ChanCount::max (natural_input_streams (), natural_output_streams())
+	 * and route.cc's max (configured_in, configured_out)
+	 *
+	 * no-inplace copies "thru" outputs (to emulate in-place) for
+	 * all outputs (to prevent overwrite) into a temporary space
+	 * which also holds input buffers (in case the plugin does process
+	 * in-place and overwrites those).
+	 *
+	 * this buffers need to be at least as
+	 *   natural_input_streams () + possible outputs.
+	 *
+	 * sidechain inputs add a constraint on the input:
+	 * configured input + sidechain (=_configured_internal)
+	 *
+	 * NB. this also satisfies
+	 * max (natural_input_streams(), natural_output_streams())
+	 * which is needed for silence runs
+	 */
+	_required_buffers = ChanCount::max (_configured_internal,
+			natural_input_streams () + ChanCount::max (_configured_out, natural_output_streams () * get_count ()));
+
+	if (old_in != in || old_out != out || old_internal != _configured_internal
+			|| old_pins != natural_input_streams ()
+			|| (old_match.method != _match.method && (old_match.method == Split || _match.method == Split))
+		 ) {
 		PluginIoReConfigure (); /* EMIT SIGNAL */
 	}
 
+	_delaybuffers.configure (_configured_out, _plugins.front ()->max_latency ());
+	_latency_changed = true;
+
 	// we don't know the analysis window size, so we must work with the
 	// current buffer size here. each request for data fills in these
 	// buffers and the analyser makes sure it gets enough data for the
 	// analysis window
 	session().ensure_buffer_set (_signal_analysis_inputs, in);
-	//_signal_analysis_inputs.set_count (in);
+	_signal_analysis_inputs.set_count (in);
 
 	session().ensure_buffer_set (_signal_analysis_outputs, out);
-	//_signal_analysis_outputs.set_count (out);
+	_signal_analysis_outputs.set_count (out);
 
 	// std::cerr << "set counts to i" << in.n_audio() << "/o" << out.n_audio() << std::endl;
 
+	_configured = true;
 	return Processor::configure_io (in, out);
 }
 
@@ -780,46 +1928,212 @@ PluginInsert::configure_io (ChanCount in, ChanCount out)
 bool
 PluginInsert::can_support_io_configuration (const ChanCount& in, ChanCount& out)
 {
+	if (_sidechain) {
+		_sidechain->can_support_io_configuration (in, out); // never fails, sets "out"
+	}
 	return private_can_support_io_configuration (in, out).method != Impossible;
 }
 
+PluginInsert::Match
+PluginInsert::private_can_support_io_configuration (ChanCount const& in, ChanCount& out) const
+{
+	if (!_custom_cfg && _preset_out.n_audio () > 0) {
+		// preseed hint (for variable i/o)
+		out.set (DataType::AUDIO, _preset_out.n_audio ());
+	}
+
+	Match rv = internal_can_support_io_configuration (in, out);
+
+	if (!_custom_cfg && _preset_out.n_audio () > 0) {
+		DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: using output preset: %2\n", name(), _preset_out));
+		out.set (DataType::AUDIO, _preset_out.n_audio ());
+	}
+	return rv;
+}
+
 /** A private version of can_support_io_configuration which returns the method
  *  by which the configuration can be matched, rather than just whether or not
  *  it can be.
  */
 PluginInsert::Match
-PluginInsert::private_can_support_io_configuration (ChanCount const & inx, ChanCount& out)
+PluginInsert::internal_can_support_io_configuration (ChanCount const & inx, ChanCount& out) const
 {
 	if (_plugins.empty()) {
 		return Match();
 	}
 
+#ifdef MIXBUS
+	if (is_channelstrip ()) {
+		out = inx;
+		return Match (ExactMatch, 1);
+	}
+#endif
+
+	/* if a user specified a custom cfg, so be it. */
+	if (_custom_cfg) {
+		PluginInfoPtr info = _plugins.front()->get_info();
+		out = _custom_out;
+		if (info->reconfigurable_io()) {
+			return Match (Delegate, 1, _strict_io, true);
+		} else {
+			return Match (ExactMatch, get_count(), _strict_io, true);
+		}
+	}
+
+	/* try automatic configuration */
+	Match m = PluginInsert::automatic_can_support_io_configuration (inx, out);
+
 	PluginInfoPtr info = _plugins.front()->get_info();
-	ChanCount in; in += inx;
-	midi_bypass.reset();
+	ChanCount inputs  = info->n_inputs;
+	ChanCount outputs = info->n_outputs;
+
+	/* handle case strict-i/o */
+	if (_strict_io && m.method != Impossible) {
+		m.strict_io = true;
+
+		/* special case MIDI instruments */
+		if (needs_midi_input ()) {
+			// output = midi-bypass + at most master-out channels.
+			ChanCount max_out (DataType::AUDIO, 2); // TODO use master-out
+			max_out.set (DataType::MIDI, out.get(DataType::MIDI));
+			out = ChanCount::min (out, max_out);
+			DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: special case strict-i/o instrument\n", name()));
+			return m;
+		}
+
+		switch (m.method) {
+			case NoInputs:
+				if (inx.n_audio () != out.n_audio ()) { // ignore midi bypass
+					/* replicate processor to match output count (generators and such)
+					 * at least enough to feed every output port. */
+					uint32_t f = 1; // at least one. e.g. control data filters, no in, no out.
+					for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
+						uint32_t nout = outputs.get (*t);
+						if (nout == 0 || inx.get(*t) == 0) { continue; }
+						f = max (f, (uint32_t) ceil (inx.get(*t) / (float)nout));
+					}
+					out = inx;
+					DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: special case strict-i/o for generator\n", name()));
+					return Match (Replicate, f, _strict_io);
+				}
+				break;
+			default:
+				break;
+		}
+
+		out = inx;
+		return m;
+	}
+
+	if (m.method != Impossible) {
+		return m;
+	}
+
+	ChanCount ns_inputs  = inputs - sidechain_input_pins ();
+
+	DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: resolving 'Impossible' match...\n", name()));
 
 	if (info->reconfigurable_io()) {
-		/* Plugin has flexible I/O, so delegate to it */
-		bool const r = _plugins.front()->can_support_io_configuration (in, out);
+		ChanCount useins;
+		out = inx; // hint
+		if (out.n_midi () > 0 && out.n_audio () == 0) { out.set (DataType::AUDIO, 2); }
+		if (out.n_audio () == 0) { out.set (DataType::AUDIO, 1); }
+		bool const r = _plugins.front()->can_support_io_configuration (inx + sidechain_input_pins (), out, &useins);
 		if (!r) {
+			// houston, we have a problem.
 			return Match (Impossible, 0);
 		}
+		// midi bypass
+		if (inx.n_midi () > 0 && out.n_midi () == 0) { out.set (DataType::MIDI, 1); }
+		return Match (Delegate, 1, _strict_io);
+	}
+
+	ChanCount midi_bypass;
+	if (inx.get(DataType::MIDI) == 1 && outputs.get(DataType::MIDI) == 0) {
+		midi_bypass.set (DataType::MIDI, 1);
+	}
+
+	// add at least as many plugins so that output count matches input count (w/o sidechain pins)
+	uint32_t f = 0;
+	for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
+		uint32_t nin = ns_inputs.get (*t);
+		uint32_t nout = outputs.get (*t);
+		if (nin == 0 || inx.get(*t) == 0) { continue; }
+		// prefer floor() so the count won't overly increase IFF (nin < nout)
+		f = max (f, (uint32_t) floor (inx.get(*t) / (float)nout));
+	}
+	if (f > 0 && outputs * f >= _configured_out) {
+		out = outputs * f + midi_bypass;
+		return Match (Replicate, f, _strict_io);
+	}
+
+	// add at least as many plugins needed to connect all inputs (w/o sidechain pins)
+	f = 0;
+	for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
+		uint32_t nin = ns_inputs.get (*t);
+		if (nin == 0 || inx.get(*t) == 0) { continue; }
+		f = max (f, (uint32_t) ceil (inx.get(*t) / (float)nin));
+	}
+	if (f > 0) {
+		out = outputs * f + midi_bypass;
+		return Match (Replicate, f, _strict_io);
+	}
+
+	// add at least as many plugins needed to connect all inputs
+	f = 1;
+	for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
+		uint32_t nin = inputs.get (*t);
+		if (nin == 0 || inx.get(*t) == 0) { continue; }
+		f = max (f, (uint32_t) ceil (inx.get(*t) / (float)nin));
+	}
+	out = outputs * f + midi_bypass;
+	return Match (Replicate, f, _strict_io);
+}
+
+/* this is the original Ardour 3/4 behavior, mainly for backwards compatibility */
+PluginInsert::Match
+PluginInsert::automatic_can_support_io_configuration (ChanCount const & inx, ChanCount& out) const
+{
+	if (_plugins.empty()) {
+		return Match();
+	}
 
+	PluginInfoPtr info = _plugins.front()->get_info();
+	ChanCount in; in += inx;
+	ChanCount midi_bypass;
+
+	if (info->reconfigurable_io()) {
+		/* Plugin has flexible I/O, so delegate to it
+		 * pre-seed outputs, plugin tries closest match
+		 */
+		out = in; // hint
+		if (out.n_midi () > 0 && out.n_audio () == 0) { out.set (DataType::AUDIO, 2); }
+		if (out.n_audio () == 0) { out.set (DataType::AUDIO, 1); }
+		bool const r = _plugins.front()->can_support_io_configuration (in + sidechain_input_pins (), out);
+		if (!r) {
+			return Match (Impossible, 0);
+		}
+		// midi bypass
+		if (in.n_midi () > 0 && out.n_midi () == 0) { out.set (DataType::MIDI, 1); }
 		return Match (Delegate, 1);
 	}
 
 	ChanCount inputs  = info->n_inputs;
 	ChanCount outputs = info->n_outputs;
+	ChanCount ns_inputs  = inputs - sidechain_input_pins ();
 
 	if (in.get(DataType::MIDI) == 1 && outputs.get(DataType::MIDI) == 0) {
-		DEBUG_TRACE ( DEBUG::Processors, string_compose ("bypassing midi-data around %1\n", name()));
-		midi_bypass.set(DataType::MIDI, 1);
+		DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: bypassing midi-data\n", name()));
+		midi_bypass.set (DataType::MIDI, 1);
 	}
 	if (in.get(DataType::MIDI) == 1 && inputs.get(DataType::MIDI) == 0) {
-		DEBUG_TRACE ( DEBUG::Processors, string_compose ("hiding midi-port from plugin %1\n", name()));
+		DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: hiding midi-port from plugin\n", name()));
 		in.set(DataType::MIDI, 0);
 	}
 
+	// add internally provided sidechain ports
+	ChanCount insc = in + sidechain_input_ports ();
+
 	bool no_inputs = true;
 	for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
 		if (inputs.get (*t) != 0) {
@@ -834,8 +2148,14 @@ PluginInsert::private_can_support_io_configuration (ChanCount const & inx, ChanC
 		return Match (NoInputs, 1);
 	}
 
-	/* Plugin inputs match requested inputs exactly */
-	if (inputs == in) {
+	/* Plugin inputs match requested inputs + side-chain-ports exactly */
+	if (inputs == insc) {
+		out = outputs + midi_bypass;
+		return Match (ExactMatch, 1);
+	}
+
+	/* Plugin inputs matches without side-chain-pins */
+	if (ns_inputs == in) {
 		out = outputs + midi_bypass;
 		return Match (ExactMatch, 1);
 	}
@@ -850,7 +2170,8 @@ PluginInsert::private_can_support_io_configuration (ChanCount const & inx, ChanC
 	bool     can_replicate = true;
 	for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
 
-		uint32_t nin = inputs.get (*t);
+		// ignore side-chains
+		uint32_t nin = ns_inputs.get (*t);
 
 		// No inputs of this type
 		if (nin == 0 && in.get(*t) == 0) {
@@ -874,7 +2195,7 @@ PluginInsert::private_can_support_io_configuration (ChanCount const & inx, ChanC
 		}
 	}
 
-	if (can_replicate) {
+	if (can_replicate && f > 0) {
 		for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
 			out.set (*t, outputs.get(*t) * f);
 		}
@@ -893,7 +2214,7 @@ PluginInsert::private_can_support_io_configuration (ChanCount const & inx, ChanC
 	bool can_split = true;
 	for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
 
-		bool const can_split_type = (in.get (*t) == 1 && inputs.get (*t) > 1);
+		bool const can_split_type = (in.get (*t) == 1 && ns_inputs.get (*t) > 1);
 		bool const nothing_to_do_for_type = (in.get (*t) == 0 && inputs.get (*t) == 0);
 
 		if (!can_split_type && !nothing_to_do_for_type) {
@@ -927,13 +2248,13 @@ PluginInsert::private_can_support_io_configuration (ChanCount const & inx, ChanC
 
 	if (could_hide && !cannot_hide) {
 		out = outputs + midi_bypass;
-		return Match (Hide, 1, hide_channels);
+		return Match (Hide, 1, false, false, hide_channels);
 	}
 
-	midi_bypass.reset();
 	return Match (Impossible, 0);
 }
 
+
 XMLNode&
 PluginInsert::get_state ()
 {
@@ -952,7 +2273,24 @@ PluginInsert::state (bool full)
 	/* remember actual i/o configuration (for later placeholder
 	 * in case the plugin goes missing) */
 	node.add_child_nocopy (* _configured_in.state (X_("ConfiguredInput")));
+	node.add_child_nocopy (* _custom_sinks.state (X_("CustomSinks")));
 	node.add_child_nocopy (* _configured_out.state (X_("ConfiguredOutput")));
+	node.add_child_nocopy (* _preset_out.state (X_("PresetOutput")));
+
+	/* save custom i/o config */
+	node.add_property("custom", _custom_cfg ? "yes" : "no");
+	for (uint32_t pc = 0; pc < get_count(); ++pc) {
+		char tmp[128];
+		snprintf (tmp, sizeof(tmp), "InputMap-%d", pc);
+		node.add_child_nocopy (* _in_map[pc].state (tmp));
+		snprintf (tmp, sizeof(tmp), "OutputMap-%d", pc);
+		node.add_child_nocopy (* _out_map[pc].state (tmp));
+	}
+	node.add_child_nocopy (* _thru_map.state ("ThruMap"));
+
+	if (_sidechain) {
+		node.add_child_nocopy (_sidechain->state (full));
+	}
 
 	_plugins[0]->set_insert_id(this->id());
 	node.add_child_nocopy (_plugins[0]->get_state());
@@ -976,7 +2314,7 @@ PluginInsert::set_control_ids (const XMLNode& node, int version)
 
 	for (iter = nlist.begin(); iter != nlist.end(); ++iter) {
 		if ((*iter)->name() == Controllable::xml_node_name) {
-			const XMLProperty* prop;
+			XMLProperty const * prop;
 
 			uint32_t p = (uint32_t)-1;
 #ifdef LV2_SUPPORT
@@ -1017,7 +2355,7 @@ PluginInsert::set_state(const XMLNode& node, int version)
 	XMLNodeList nlist = node.children();
 	XMLNodeIterator niter;
 	XMLPropertyList plist;
-	const XMLProperty *prop;
+	XMLProperty const * prop;
 	ARDOUR::PluginType type;
 
 	if ((prop = node.property ("type")) == 0) {
@@ -1035,6 +2373,8 @@ PluginInsert::set_state(const XMLNode& node, int version)
 		type = ARDOUR::LXVST;
 	} else if (prop->value() == X_("audiounit")) {
 		type = ARDOUR::AudioUnit;
+	} else if (prop->value() == X_("luaproc")) {
+		type = ARDOUR::Lua;
 	} else {
 		error << string_compose (_("unknown plugin type %1 in plugin insert state"),
 				  prop->value())
@@ -1087,6 +2427,19 @@ PluginInsert::set_state(const XMLNode& node, int version)
 	}
 #endif
 
+	if (plugin == 0 && type == ARDOUR::Lua) {
+		/* unique ID (sha1 of script) was not found,
+		 * load the plugin from the serialized version in the
+		 * session-file instead.
+		 */
+		boost::shared_ptr<LuaProc> lp (new LuaProc (_session.engine(), _session, ""));
+		XMLNode *ls = node.child (lp->state_node_name().c_str());
+		if (ls && lp) {
+			lp->set_script_from_state (*ls);
+			plugin = lp;
+		}
+	}
+
 	if (plugin == 0) {
 		error << string_compose(
 			_("Found a reference to a plugin (\"%1\") that is unknown.\n"
@@ -1189,6 +2542,58 @@ PluginInsert::set_state(const XMLNode& node, int version)
 		set_parameter_state_2X (node, version);
 	}
 
+	if ((prop = node.property (X_("custom"))) != 0) {
+		_custom_cfg = string_is_affirmative (prop->value());
+	}
+
+	uint32_t in_maps = 0;
+	uint32_t out_maps = 0;
+	XMLNodeList kids = node.children ();
+	for (XMLNodeIterator i = kids.begin(); i != kids.end(); ++i) {
+		if ((*i)->name() == X_("ConfiguredInput")) {
+			_configured_in = ChanCount(**i);
+		}
+		if ((*i)->name() == X_("CustomSinks")) {
+			_custom_sinks = ChanCount(**i);
+		}
+		if ((*i)->name() == X_("ConfiguredOutput")) {
+			_custom_out = ChanCount(**i);
+			_configured_out = ChanCount(**i);
+		}
+		if ((*i)->name() == X_("PresetOutput")) {
+			_preset_out = ChanCount(**i);
+		}
+		if (strncmp ((*i)->name ().c_str(), X_("InputMap-"), 9) == 0) {
+			long pc = atol (&((*i)->name().c_str()[9]));
+			if (pc >= 0 && pc <= (long) get_count()) {
+				_in_map[pc] = ChanMapping (**i);
+				++in_maps;
+			}
+		}
+		if (strncmp ((*i)->name ().c_str(), X_("OutputMap-"), 10) == 0) {
+			long pc = atol (&((*i)->name().c_str()[10]));
+			if (pc >= 0 && pc <= (long) get_count()) {
+				_out_map[pc] = ChanMapping (**i);
+				++out_maps;
+			}
+		}
+		if ((*i)->name () ==  "ThruMap") {
+				_thru_map = ChanMapping (**i);
+		}
+
+		// sidechain is a Processor (IO)
+		if ((*i)->name () ==  Processor::state_node_name) {
+			if (!_sidechain) {
+				add_sidechain (0);
+			}
+			_sidechain->set_state (**i, version);
+		}
+	}
+
+	if (in_maps == out_maps && out_maps >0 && out_maps == get_count()) {
+		_maps_from_state = true;
+	}
+
 	for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
 		if (active()) {
 			(*i)->activate ();
@@ -1197,6 +2602,7 @@ PluginInsert::set_state(const XMLNode& node, int version)
 		}
 	}
 
+	PluginConfigChanged (); /* EMIT SIGNAL */
 	return 0;
 }
 
@@ -1231,7 +2637,7 @@ PluginInsert::set_parameter_state_2X (const XMLNode& node, int version)
 		}
 
 		XMLNodeList cnodes;
-		XMLProperty *cprop;
+		XMLProperty const * cprop;
 		XMLNodeConstIterator iter;
 		XMLNode *child;
 		const char *port;
@@ -1317,6 +2723,9 @@ PluginInsert::describe_parameter (Evoral::Parameter param)
 ARDOUR::framecnt_t
 PluginInsert::signal_latency() const
 {
+	if (!_pending_active) {
+		return 0;
+	}
 	if (_user_latency) {
 		return _user_latency;
 	}
@@ -1343,29 +2752,12 @@ PluginInsert::PluginControl::PluginControl (PluginInsert*                     p,
 			list->set_interpolation(Evoral::ControlList::Discrete);
 		}
 	}
-
-	if (desc.toggled) {
-		set_flags(Controllable::Toggle);
-	}
 }
 
 /** @param val `user' value */
-void
-PluginInsert::PluginControl::set_value (double user_val, PBD::Controllable::GroupControlDisposition group_override)
-{
-	if (writable()) {
-		_set_value (user_val, group_override);
-	}
-}
-void
-PluginInsert::PluginControl::set_value_unchecked (double user_val)
-{
-	/* used only by automation playback */
-	_set_value (user_val, Controllable::NoGroup);
-}
 
 void
-PluginInsert::PluginControl::_set_value (double user_val, PBD::Controllable::GroupControlDisposition group_override)
+PluginInsert::PluginControl::actually_set_value (double user_val, PBD::Controllable::GroupControlDisposition group_override)
 {
 	/* FIXME: probably should be taking out some lock here.. */
 
@@ -1378,13 +2770,13 @@ PluginInsert::PluginControl::_set_value (double user_val, PBD::Controllable::Gro
 		iasp->set_parameter (_list->parameter().id(), user_val);
 	}
 
-	AutomationControl::set_value (user_val, group_override);
+	AutomationControl::actually_set_value (user_val, group_override);
 }
 
 void
 PluginInsert::PluginControl::catch_up_with_external_value (double user_val)
 {
-	AutomationControl::set_value (user_val, Controllable::NoGroup);
+	AutomationControl::actually_set_value (user_val, Controllable::NoGroup);
 }
 
 XMLNode&
@@ -1429,22 +2821,10 @@ PluginInsert::PluginPropertyControl::PluginPropertyControl (PluginInsert*
 		alist()->set_yrange (desc.lower, desc.upper);
 		alist()->reset_default (desc.normal);
 	}
-
-	if (desc.toggled) {
-		set_flags(Controllable::Toggle);
-	}
-}
-
-void
-PluginInsert::PluginPropertyControl::set_value (double user_val, PBD::Controllable::GroupControlDisposition /* group_override*/)
-{
-	if (writable()) {
-		set_value_unchecked (user_val);
-	}
 }
 
 void
-PluginInsert::PluginPropertyControl::set_value_unchecked (double user_val)
+PluginInsert::PluginPropertyControl::actually_set_value (double user_val, Controllable::GroupControlDisposition gcd)
 {
 	/* Old numeric set_value(), coerce to appropriate datatype if possible.
 	   This is lossy, but better than nothing until Ardour's automation system
@@ -1460,7 +2840,8 @@ PluginInsert::PluginPropertyControl::set_value_unchecked (double user_val)
 	}
 
 	_value = value;
-	AutomationControl::set_value (user_val, Controllable::NoGroup);
+
+	AutomationControl::actually_set_value (user_val, gcd);
 }
 
 XMLNode&
@@ -1487,8 +2868,18 @@ PluginInsert::get_impulse_analysis_plugin()
 {
 	boost::shared_ptr<Plugin> ret;
 	if (_impulseAnalysisPlugin.expired()) {
+		// LV2 in particular uses various _session params
+		// during init() -- most notably block_size..
+		// not great.
 		ret = plugin_factory(_plugins[0]);
-		ret->configure_io (input_streams (), output_streams ());
+		ChanCount out (internal_output_streams ());
+		if (ret->get_info ()->reconfigurable_io ()) {
+			// populate get_info ()->n_inputs and ->n_outputs
+			ChanCount useins;
+			ret->can_support_io_configuration (internal_input_streams (), out, &useins);
+			assert (out == internal_output_streams ());
+		}
+		ret->configure_io (internal_input_streams (), out);
 		_impulseAnalysisPlugin = ret;
 	} else {
 		ret = _impulseAnalysisPlugin.lock();
@@ -1502,8 +2893,8 @@ PluginInsert::collect_signal_for_analysis (framecnt_t nframes)
 {
 	// called from outside the audio thread, so this should be safe
 	// only do audio as analysis is (currently) only for audio plugins
-	_signal_analysis_inputs.ensure_buffers(  DataType::AUDIO, input_streams().n_audio(),  nframes);
-	_signal_analysis_outputs.ensure_buffers( DataType::AUDIO, output_streams().n_audio(), nframes);
+	_signal_analysis_inputs.ensure_buffers (DataType::AUDIO, input_streams().n_audio(),  nframes);
+	_signal_analysis_outputs.ensure_buffers (DataType::AUDIO, output_streams().n_audio(), nframes);
 
 	_signal_analysis_collected_nframes   = 0;
 	_signal_analysis_collect_nframes_max = nframes;
@@ -1516,17 +2907,46 @@ PluginInsert::add_plugin (boost::shared_ptr<Plugin> plugin)
 	plugin->set_insert_id (this->id());
 
 	if (_plugins.empty()) {
-                /* first (and probably only) plugin instance - connect to relevant signals
-                 */
+		/* first (and probably only) plugin instance - connect to relevant signals */
 
 		plugin->ParameterChangedExternally.connect_same_thread (*this, boost::bind (&PluginInsert::parameter_changed_externally, this, _1, _2));
-                plugin->StartTouch.connect_same_thread (*this, boost::bind (&PluginInsert::start_touch, this, _1));
-                plugin->EndTouch.connect_same_thread (*this, boost::bind (&PluginInsert::end_touch, this, _1));
+		plugin->StartTouch.connect_same_thread (*this, boost::bind (&PluginInsert::start_touch, this, _1));
+		plugin->EndTouch.connect_same_thread (*this, boost::bind (&PluginInsert::end_touch, this, _1));
+		_custom_sinks = plugin->get_info()->n_inputs;
+		// cache sidechain port count
+		_cached_sidechain_pins.reset ();
+		const ChanCount& nis (plugin->get_info()->n_inputs);
+		for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
+			for (uint32_t in = 0; in < nis.get (*t); ++in) {
+				const Plugin::IOPortDescription& iod (plugin->describe_io_port (*t, true, in));
+				if (iod.is_sidechain) {
+					_cached_sidechain_pins.set (*t, 1 + _cached_sidechain_pins.n(*t));
+				}
+			}
+		}
 	}
+#if (defined WINDOWS_VST_SUPPORT || defined LXVST_SUPPORT)
+	boost::shared_ptr<VSTPlugin> vst = boost::dynamic_pointer_cast<VSTPlugin> (plugin);
+	if (vst) {
+		vst->set_insert (this, _plugins.size ());
+	}
+#endif
 
 	_plugins.push_back (plugin);
 }
 
+bool
+PluginInsert::load_preset (ARDOUR::Plugin::PresetRecord pr)
+{
+	bool ok = true;
+	for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
+		if (! (*i)->load_preset (pr)) {
+			ok = false;
+		}
+	}
+	return ok;
+}
+
 void
 PluginInsert::realtime_handle_transport_stopped ()
 {
@@ -1552,6 +2972,16 @@ PluginInsert::monitoring_changed ()
 }
 
 void
+PluginInsert::latency_changed ()
+{
+	// this is called in RT context, LatencyChanged is emitted after run()
+	_latency_changed = true;
+	// XXX This also needs a proper API not an owner() hack.
+	assert (owner ());
+	static_cast<Route*>(owner ())->processor_latency_changed (); /* EMIT SIGNAL */
+}
+
+void
 PluginInsert::start_touch (uint32_t param_id)
 {
         boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, param_id));
@@ -1568,3 +2998,24 @@ PluginInsert::end_touch (uint32_t param_id)
                 ac->stop_touch (true, session().audible_frame());
         }
 }
+
+std::ostream& operator<<(std::ostream& o, const ARDOUR::PluginInsert::Match& m)
+{
+	switch (m.method) {
+		case PluginInsert::Impossible: o << "Impossible"; break;
+		case PluginInsert::Delegate:   o << "Delegate"; break;
+		case PluginInsert::NoInputs:   o << "NoInputs"; break;
+		case PluginInsert::ExactMatch: o << "ExactMatch"; break;
+		case PluginInsert::Replicate:  o << "Replicate"; break;
+		case PluginInsert::Split:      o << "Split"; break;
+		case PluginInsert::Hide:       o << "Hide"; break;
+	}
+	o << " cnt: " << m.plugins
+		<< (m.strict_io ? " strict-io" : "")
+		<< (m.custom_cfg ? " custom-cfg" : "");
+	if (m.method == PluginInsert::Hide) {
+		o << " hide: " << m.hide;
+	}
+	o << "\n";
+	return o;
+}
diff --git a/libs/ardour/plugin_manager.cc b/libs/ardour/plugin_manager.cc
index 53d73c4..23515a2 100644
--- a/libs/ardour/plugin_manager.cc
+++ b/libs/ardour/plugin_manager.cc
@@ -67,6 +67,8 @@
 #include "ardour/filesystem_paths.h"
 #include "ardour/ladspa.h"
 #include "ardour/ladspa_plugin.h"
+#include "ardour/luascripting.h"
+#include "ardour/luaproc.h"
 #include "ardour/plugin.h"
 #include "ardour/plugin_manager.h"
 #include "ardour/rc_configuration.h"
@@ -93,7 +95,7 @@
 #include "pbd/error.h"
 #include "pbd/stl_delete.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 #include "ardour/debug.h"
 
@@ -119,6 +121,7 @@ PluginManager::PluginManager ()
 	, _ladspa_plugin_info(0)
 	, _lv2_plugin_info(0)
 	, _au_plugin_info(0)
+	, _lua_plugin_info(0)
 	, _cancel_scan(false)
 	, _cancel_timeout(false)
 {
@@ -215,6 +218,8 @@ PluginManager::PluginManager ()
 	}
 
 	BootMessage (_("Discovering Plugins"));
+
+	LuaScripting::instance().scripts_changed.connect_same_thread (lua_refresh_connection, boost::bind (&PluginManager::lua_refresh_cb, this));
 }
 
 
@@ -227,6 +232,7 @@ PluginManager::~PluginManager()
 		delete _ladspa_plugin_info;
 		delete _lv2_plugin_info;
 		delete _au_plugin_info;
+		delete _lua_plugin_info;
 	}
 }
 
@@ -244,6 +250,8 @@ PluginManager::refresh (bool cache_only)
 
 	BootMessage (_("Scanning LADSPA Plugins"));
 	ladspa_refresh ();
+	BootMessage (_("Scanning Lua DSP Processors"));
+	lua_refresh ();
 #ifdef LV2_SUPPORT
 	BootMessage (_("Scanning LV2 Plugins"));
 	lv2_refresh ();
@@ -437,11 +445,7 @@ void
 PluginManager::clear_au_cache ()
 {
 #ifdef AUDIOUNIT_SUPPORT
-	// AUPluginInfo::au_cache_path ()
-	string fn = Glib::build_filename (ARDOUR::user_config_directory(), "au_cache");
-	if (Glib::file_test (fn, Glib::FILE_TEST_EXISTS)) {
-		::g_unlink(fn.c_str());
-	}
+	AUPluginInfo::clear_cache ();
 #endif
 }
 
@@ -457,6 +461,32 @@ PluginManager::clear_au_blacklist ()
 }
 
 void
+PluginManager::lua_refresh ()
+{
+	if (_lua_plugin_info) {
+		_lua_plugin_info->clear ();
+	} else {
+		_lua_plugin_info = new ARDOUR::PluginInfoList ();
+	}
+	ARDOUR::LuaScriptList & _scripts (LuaScripting::instance ().scripts (LuaScriptInfo::DSP));
+	for (LuaScriptList::const_iterator s = _scripts.begin(); s != _scripts.end(); ++s) {
+		LuaPluginInfoPtr lpi (new LuaPluginInfo(*s));
+		_lua_plugin_info->push_back (lpi);
+	}
+}
+
+void
+PluginManager::lua_refresh_cb ()
+{
+	Glib::Threads::Mutex::Lock lm (_lock, Glib::Threads::TRY_LOCK);
+	if (!lm.locked()) {
+		return;
+	}
+	lua_refresh ();
+	PluginListChanged (); /* EMIT SIGNAL */
+}
+
+void
 PluginManager::ladspa_refresh ()
 {
 	if (_ladspa_plugin_info) {
@@ -586,6 +616,11 @@ PluginManager::ladspa_discover (string path)
 	DEBUG_TRACE (DEBUG::PluginManager, string_compose ("LADSPA plugin found at %1\n", path));
 
 	for (uint32_t i = 0; ; ++i) {
+		/* if a ladspa plugin allocates memory here
+		 * it is never free()ed (or plugin-dependent only when unloading).
+		 * For some plugins memory allocated is incremental, we should
+		 * avoid re-scanning plugins and file bug reports.
+		 */
 		if ((descriptor = dfunc (i)) == 0) {
 			break;
 		}
@@ -1102,6 +1137,9 @@ PluginManager::save_statuses ()
 		case LXVST:
 			ofs << "LXVST";
 			break;
+		case Lua:
+			ofs << "Lua";
+			break;
 		}
 
 		ofs << ' ';
@@ -1188,6 +1226,8 @@ PluginManager::load_statuses ()
 			type = Windows_VST;
 		} else if (stype == "LXVST") {
 			type = LXVST;
+		} else if (stype == "Lua") {
+			type = Lua;
 		} else {
 			error << string_compose (_("unknown plugin type \"%1\" - ignored"), stype)
 			      << endmsg;
@@ -1265,3 +1305,10 @@ PluginManager::au_plugin_info ()
 #endif
 	return _empty_plugin_info;
 }
+
+ARDOUR::PluginInfoList&
+PluginManager::lua_plugin_info ()
+{
+	assert(_lua_plugin_info);
+	return *_lua_plugin_info;
+}
diff --git a/libs/ardour/po/cs.mo b/libs/ardour/po/cs.mo
new file mode 100644
index 0000000..3a4a78e
Binary files /dev/null and b/libs/ardour/po/cs.mo differ
diff --git a/libs/ardour/po/cs.po b/libs/ardour/po/cs.po
index 47c740f..333aa45 100644
--- a/libs/ardour/po/cs.po
+++ b/libs/ardour/po/cs.po
@@ -6,7 +6,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-03-31 20:13-0400\n"
+"POT-Creation-Date: 2016-07-14 06:20-0400\n"
 "PO-Revision-Date: 2013-06-13 22:47+0200\n"
 "Last-Translator: Pavel Fric <pavelfric at seznam.cz>\n"
 "Language-Team: Czech <kde-i18n-doc at kde.org>\n"
@@ -17,89 +17,242 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 "X-Generator: Lokalize 1.5\n"
 
-#: amp.cc:57 automatable.cc:165
-msgid "Fader"
-msgstr "Prolínač"
+#: amp.cc:412
+#, c-format
+msgid "%.2fdB"
+msgstr ""
 
-#: analyser.cc:117 audioregion.cc:1729
+#: analyser.cc:121 audioregion.cc:1789
 msgid "Transient Analysis failed for %1."
 msgstr ""
 
-#: analyser.cc:117
+#: analyser.cc:121
 msgid "Audio File Source"
 msgstr ""
 
-#: audio_diskstream.cc:249
+#: analysis_graph.cc:136
+msgid "%1 (%2..%3)"
+msgstr ""
+
+#: audio_backend.cc:31
+msgid "No Error occurred"
+msgstr ""
+
+#: audio_backend.cc:33
+msgid "Failed to initialize audio backend"
+msgstr ""
+
+#: audio_backend.cc:35
+msgid "Failed to deinitialize audio backend"
+msgstr ""
+
+#: audio_backend.cc:37
+msgid "Failed to reinitialize audio backend"
+msgstr ""
+
+#: audio_backend.cc:39
+msgid "Failed to open audio device"
+msgstr ""
+
+#: audio_backend.cc:41
+msgid "Failed to close audio device"
+msgstr ""
+
+#: audio_backend.cc:43
+msgid "Audio device not valid"
+msgstr ""
+
+#: audio_backend.cc:45
+msgid "Audio device unavailable"
+msgstr ""
+
+#: audio_backend.cc:47
+msgid "Audio device not connected"
+msgstr ""
+
+#: audio_backend.cc:49
+msgid "Failed to request and reserve audio device"
+msgstr ""
+
+#: audio_backend.cc:51
+msgid "Audio device Input/Output error"
+msgstr ""
+
+#: audio_backend.cc:53
+msgid "Failed to open MIDI device"
+msgstr ""
+
+#: audio_backend.cc:55
+msgid "Failed to close MIDI device"
+msgstr ""
+
+#: audio_backend.cc:57
+msgid "MIDI device unavailable"
+msgstr ""
+
+#: audio_backend.cc:59
+msgid "MIDI device not connected"
+msgstr ""
+
+#: audio_backend.cc:61
+msgid "MIDI device Input/Output error"
+msgstr ""
+
+#: audio_backend.cc:63
+msgid "Sample format is not supported"
+msgstr ""
+
+#: audio_backend.cc:65
+msgid "Sample rate is not supported"
+msgstr ""
+
+#: audio_backend.cc:67
+msgid "Requested input latency is not supported"
+msgstr ""
+
+#: audio_backend.cc:69
+msgid "Requested output latency is not supported"
+msgstr ""
+
+#: audio_backend.cc:71
+msgid "Period size is not supported"
+msgstr ""
+
+#: audio_backend.cc:73
+msgid "Period count is not supported"
+msgstr ""
+
+#: audio_backend.cc:75
+msgid "Device configuration not supported"
+msgstr ""
+
+#: audio_backend.cc:77
+msgid "Channel count configuration not supported"
+msgstr ""
+
+#: audio_backend.cc:79
+msgid "Input channel count configuration not supported"
+msgstr ""
+
+#: audio_backend.cc:81
+msgid "Output channel count configuration not supported"
+msgstr ""
+
+#: audio_backend.cc:83
+msgid "Unable to aquire realtime permissions"
+msgstr ""
+
+#: audio_backend.cc:85
+msgid "Setting audio device thread priorities failed"
+msgstr ""
+
+#: audio_backend.cc:87
+msgid "Setting MIDI device thread priorities failed"
+msgstr ""
+
+#: audio_backend.cc:89
+msgid "Failed to start process thread"
+msgstr ""
+
+#: audio_backend.cc:91
+msgid "Failed to start freewheel thread"
+msgstr ""
+
+#: audio_backend.cc:93
+msgid "Failed to register audio/midi ports"
+msgstr ""
+
+#: audio_backend.cc:95
+msgid "Failed to re-connect audio/midi ports"
+msgstr ""
+
+#: audio_backend.cc:97
+msgid "Out Of Memory Error"
+msgstr ""
+
+#: audio_backend.cc:99
+msgid "Could not reconnect to Audio/MIDI engine"
+msgstr ""
+
+#: audio_backend.cc:107 export_formats.cc:52 session.cc:6772 session.cc:6792
+msgid "None"
+msgstr "Žádný"
+
+#: audio_backend.cc:109
+msgid "Default"
+msgstr ""
+
+#: audio_diskstream.cc:257
 msgid "AudioDiskstream: Playlist \"%1\" isn't an audio playlist"
 msgstr "AudioDiskstream: Seznam skladeb \"%1\" není seznamem zvukových skladeb"
 
-#: audio_diskstream.cc:301
+#: audio_diskstream.cc:309
 msgid "AudioDiskstream %1: there is no existing playlist to make a copy of!"
 msgstr ""
 "AudioDiskstream %1: není žádný seznam skladeb, který by bylo lze kopírovat!"
 
-#: audio_diskstream.cc:861 audio_diskstream.cc:871
+#: audio_diskstream.cc:880 audio_diskstream.cc:890
 msgid ""
 "AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3"
 msgstr ""
 "AudioDiskstream %1: Při doplňování nelze číst %2 ze seznamu skladeb u snímku "
 "%3"
 
-#: audio_diskstream.cc:1028
+#: audio_diskstream.cc:1053
 msgid "AudioDiskstream %1: cannot read %2 from playlist at frame %3"
 msgstr "AudioDiskstream %1: Nelze číst %2 ze seznamu skladeb u snímku %3"
 
-#: audio_diskstream.cc:1397 audio_diskstream.cc:1416
+#: audio_diskstream.cc:1469 audio_diskstream.cc:1488
 msgid "AudioDiskstream %1: cannot write to disk"
 msgstr "AudioDiskstream %1: Nelze zapisovat na disk"
 
-#: audio_diskstream.cc:1459
+#: audio_diskstream.cc:1531
 msgid "AudioDiskstream \"%1\": cannot flush captured data to disk!"
 msgstr "AudioDiskstream %1: Zachycená data nelze zapisovat na disk!"
 
-#: audio_diskstream.cc:1553
+#: audio_diskstream.cc:1627
 msgid "%1: could not create region for complete audio file"
 msgstr "%1: Nepodařilo se vytvořit oblast pro úplný zvukový soubor"
 
-#: audio_diskstream.cc:1585
+#: audio_diskstream.cc:1659
 msgid "AudioDiskstream: could not create region for captured audio!"
 msgstr ""
 "AudioDiskstream: Nepodařilo se vytvořit oblast pro zaznamenaný zvukový "
 "materiál!"
 
-#: audio_diskstream.cc:1693
+#: audio_diskstream.cc:1755
 msgid "programmer error: %1"
 msgstr "Chyba v programování: %1"
 
-#: audio_diskstream.cc:1921
+#: audio_diskstream.cc:2012
 msgid "AudioDiskstream: channel %1 out of range"
 msgstr "AudioDiskstream: Kanál %1 překročení rozsahu"
 
-#: audio_diskstream.cc:1935 midi_diskstream.cc:1274
+#: audio_diskstream.cc:2026 midi_diskstream.cc:1295
 msgid "%1:%2 new capture file not initialized correctly"
 msgstr "%1:%2 nový záznamový soubor neinicializován správně"
 
-#: audio_diskstream.cc:2214
+#: audio_diskstream.cc:2305
 msgid "%1: cannot restore pending capture source file %2"
 msgstr "%1: Nelze obnovit předběžný záznamový zdrojový soubor %2"
 
-#: audio_diskstream.cc:2236
+#: audio_diskstream.cc:2327
 msgid "%1: incorrect number of pending sources listed - ignoring them all"
 msgstr ""
 "%1: Seznam obsahuje nesprávný počet předběžných zdrojů - všechny jsou "
 "přehlíženy"
 
-#: audio_diskstream.cc:2270
+#: audio_diskstream.cc:2361
 msgid "%1: cannot create whole-file region from pending capture sources"
 msgstr ""
 "%1: Z předběžných záznamových zdrojů nelze vytvořit žádnou oblast pro úplný "
 "soubor"
 
-#: audio_library.cc:81
+#: audio_library.cc:82
 msgid "Could not open %1.  Audio Library not saved"
 msgstr "Nepodařilo se otevřít %1. Zvuková knihovna nebyla uložena"
 
-#: audio_playlist.cc:504
+#: audio_playlist.cc:509
 msgid ""
 "Legacy crossfade involved an incoming region not present in playlist \"%1\" "
 "- crossfade discarded"
@@ -107,7 +260,7 @@ msgstr ""
 "Do prolínání byla zapojena zesilující oblast, která ale neexistuje v seznamu "
 "skladeb \"%1\" - prolínání zahozeno"
 
-#: audio_playlist.cc:520
+#: audio_playlist.cc:525
 msgid ""
 "Legacy crossfade involved an outgoing region not present in playlist \"%1\" "
 "- crossfade discarded"
@@ -139,10 +292,11 @@ msgstr "Špatně utvořený XML v zavedeném seznamu skladeb"
 msgid "Audio Playlists (unused)"
 msgstr "Seznamy zvukových skladeb (nepoužívané)"
 
-#: audio_playlist_source.cc:171 audiosource.cc:963 midi_playlist_source.cc:147
-#: midi_playlist_source.cc:155 midi_playlist_source.cc:162 midi_source.cc:356
-#: plugin_insert.cc:641 rb_effect.cc:327 session.cc:2845 session.cc:2878
-#: session.cc:4124 session_handle.cc:87 sndfilesource.cc:154
+#: audio_playlist_source.cc:171 audiosource.cc:1046
+#: midi_playlist_source.cc:147 midi_playlist_source.cc:155
+#: midi_playlist_source.cc:162 midi_source.cc:403 plugin_insert.cc:1259
+#: rb_effect.cc:327 session.cc:5314 session.cc:5341 session.cc:5461
+#: session_handle.cc:88 sndfilesource.cc:173
 msgid "programming error: %1"
 msgstr "Chyba v programování: %1"
 
@@ -170,26 +324,30 @@ msgstr ""
 "\n"
 "Kanály: "
 
-#: audio_track.cc:161
+#: audio_track.cc:177
 msgid "Unknown bundle \"%1\" listed for input of %2"
 msgstr "Neznámý kabel \"%1\" uvedený pro vstup %2"
 
-#: audio_track.cc:163
+#: audio_track.cc:179
 msgid "in 1"
 msgstr "in 1"
 
-#: audio_track.cc:164
+#: audio_track.cc:180
 msgid "No input bundles available as a replacement"
 msgstr "Nejsou žádné vhodné vstupní kabely jako náhrada"
 
-#: audio_track.cc:168
+#: audio_track.cc:184
 msgid "Bundle %1 was not available - \"in 1\" used instead"
 msgstr "Kabel %1 nebyl dostupný - místo něj se používá \"in 1\""
 
-#: audio_track.cc:177
+#: audio_track.cc:193
 msgid "improper input channel list in XML node (%1)"
 msgstr "Uzel XML (%1) obsahuje nevhodný seznam vstupních kanálů"
 
+#: audio_track.cc:216 diskstream.cc:503 source.cc:149
+msgid "%1: this session uses destructive tracks, which are not supported"
+msgstr ""
+
 #: audio_track_importer.cc:68
 msgid "Audio Tracks"
 msgstr "Zvukové stopy"
@@ -210,19 +368,19 @@ msgstr "Nelze nahrát přídavný modul VAMP \"%1\""
 msgid "VAMP Plugin \"%1\" could not be loaded"
 msgstr "Přídavný modul VAMP \"%1\" se nepodařilo nahrát"
 
-#: audioengine.cc:696
+#: audioengine.cc:756
 msgid "AudioEngine: cannot load module \"%1\" (%2)"
 msgstr ""
 
-#: audioengine.cc:702
+#: audioengine.cc:762
 msgid "AudioEngine: backend at \"%1\" has no descriptor function."
 msgstr ""
 
-#: audioengine.cc:779
+#: audioengine.cc:841
 msgid "Could not create backend for %1: %2"
 msgstr ""
 
-#: audioregion.cc:1685
+#: audioregion.cc:1757
 msgid ""
 "You have requested an operation that requires audio analysis.\n"
 "\n"
@@ -230,13 +388,14 @@ msgid ""
 "transient data must be generated every time it is required.\n"
 "\n"
 "If you are doing work that will require transient data on a regular basis, "
-"you should probably enable \"auto-analyse-audio\" then quit %1 and restart.\n"
+"you should probably enable \"auto-analyse-audio\" in Preferences > Audio > "
+"Regions, then quit %1 and restart.\n"
 "\n"
 "This dialog will not display again.  But you may notice a slight delay in "
 "this and future transient-detection operations.\n"
 msgstr ""
 
-#: audioregion.cc:1729
+#: audioregion.cc:1789
 msgid "Audio Region"
 msgstr ""
 
@@ -244,171 +403,199 @@ msgstr ""
 msgid "cannot rename peakfile for %1 from %2 to %3 (%4)"
 msgstr "Nelze přejmenovat vrcholový soubor pro %1 z %2 na %3 (%4)"
 
-#: audiosource.cc:257
+#: audiosource.cc:262
 msgid "AudioSource: cannot stat peakfile \"%1\""
 msgstr "AudioSource: Vrcholový soubor \"%1\" není zjevný"
 
-#: audiosource.cc:361
+#: audiosource.cc:368
+msgid "Cannot open peakfile @ %1 for size check (%2)"
+msgstr ""
+
+#: audiosource.cc:389
+msgid "peak file %1 is truncated from %2 to %3"
+msgstr ""
+
+#: audiosource.cc:392
+msgid "Cannot open peakfile @ %1 for size check (%2) after rebuild"
+msgstr ""
+
+#: audiosource.cc:404
 msgid "Cannot open peakfile @ %1 for reading (%2)"
 msgstr ""
 
-#: audiosource.cc:394
+#: audiosource.cc:438
 msgid "cannot read sample data for unscaled peak computation"
 msgstr "Nelze přečíst vzorkovací data neškálovaný výpočet vrcholů"
 
-#: audiosource.cc:430 audiosource.cc:525
+#: audiosource.cc:473 audiosource.cc:568
 msgid "map failed - could not create file mapping for peakfile %1."
 msgstr ""
 
-#: audiosource.cc:436 audiosource.cc:531
+#: audiosource.cc:479 audiosource.cc:574
 msgid "map failed - could not map peakfile %1."
 msgstr ""
 
-#: audiosource.cc:447 audiosource.cc:542
+#: audiosource.cc:490 audiosource.cc:585
 msgid "unmap failed - could not unmap peakfile %1."
 msgstr ""
 
-#: audiosource.cc:453 audiosource.cc:548
+#: audiosource.cc:496 audiosource.cc:591
 msgid "map failed - could not mmap peakfile %1."
 msgstr ""
 
-#: audiosource.cc:638
+#: audiosource.cc:681
 msgid ""
 "AudioSource[%1]: peak read - cannot read %2 samples at offset %3 of %4 (%5)"
 msgstr ""
 "AudioSource[%1]: čtení vrcholu - Nelze přečíst %2 vzorky při posunu %3 %4(%5)"
 
-#: audiosource.cc:705
+#: audiosource.cc:748
 msgid "%1: could not write read raw data for peak computation (%2)"
 msgstr ""
 "%1: Nepodařilo se přečíst/zapsat nezpracovaná data pro výpočet vrcholů (%2)"
 
-#: audiosource.cc:742
-msgid "AudioSource: cannot open peakpath (c) \"%1\" (%2)"
-msgstr "AudioSource: Nelze otevřít cestu pro vrcholy (c) \"%1\" (%2)"
+#: audiosource.cc:815
+msgid "AudioSource: cannot open _peakpath (c) \"%1\" (%2)"
+msgstr ""
 
-#: audiosource.cc:811 audiosource.cc:933
+#: audiosource.cc:894 audiosource.cc:1016
 msgid "%1: could not seek in peak file data (%2)"
 msgstr ""
 
-#: audiosource.cc:816 audiosource.cc:942
+#: audiosource.cc:899 audiosource.cc:1025
 msgid "%1: could not write peak file data (%2)"
 msgstr "%1: Nepodařilo se zapsat vrcholová data do souboru (%2)"
 
-#: audiosource.cc:975
+#: audiosource.cc:1058
 msgid "could not truncate peakfile %1 to %2 (error: %3)"
 msgstr "Nepodařilo se zkrátit vrcholový soubor %1 na %2 (Chyba: %3)"
 
-#: auditioner.cc:100
+#: auditioner.cc:105
 msgid "Falling back to Reasonable Synth for Midi Audition"
 msgstr ""
 
-#: auditioner.cc:102
+#: auditioner.cc:107
 msgid "No synth for midi-audition found."
 msgstr ""
 
-#: auditioner.cc:158
+#: auditioner.cc:163
 msgid "no outputs available for auditioner - manual connection required"
 msgstr "Pro poslech nejsou dostupné žádné výstupy - požadováno ruční připojení"
 
-#: auditioner.cc:399 auditioner.cc:446
+#: auditioner.cc:408 auditioner.cc:455
 msgid "Cannot setup auditioner processing flow for %1 channels"
 msgstr "Nelze nastavit signálový tok poslechu pro %1 kanály"
 
-#: auditioner.cc:434
+#: auditioner.cc:443
 msgid "Failed to load synth for MIDI-Audition."
 msgstr ""
 
-#: auditioner.cc:453
+#: auditioner.cc:462
 msgid "Auditioning of regions other than Audio or Midi is not supported."
 msgstr ""
 
-#: automatable.cc:84
+#: automatable.cc:87
 msgid "Automation node has no path property"
 msgstr "Uzel automatizace nemá žádnou vlastnost \"cesta\""
 
-#: automatable.cc:104
+#: automatable.cc:108
 msgid "cannot open %2 to load automation data (%3)"
 msgstr "Nelze otevřít %2 pro nahrání dat automatizace (%3)"
 
-#: automatable.cc:132
+#: automatable.cc:140
 msgid "cannot load automation data from %2"
 msgstr "Nelze nahrát data automatizace z %2"
 
-#: automatable.cc:167
+#: automatable.cc:176 send.cc:95 session.cc:851
+msgid "Fader"
+msgstr "Prolínač"
+
+#: automatable.cc:178
+msgid "Trim"
+msgstr ""
+
+#: automatable.cc:180
 msgid "Mute"
 msgstr ""
 
-#: automation_list.cc:356
+#: automation_control.cc:228
+msgid "record %1 automation"
+msgstr ""
+
+#: automation_list.cc:410
 msgid "automation list: cannot load coordinates from XML, all points ignored"
 msgstr ""
 "Seznam automatizace: Nelze nahrát souřadnice z XML. Všechny body se přehlíží"
 
-#: automation_list.cc:402
+#: automation_list.cc:456
 msgid ""
 "automation list: no x-coordinate stored for control point (point ignored)"
 msgstr ""
 "Seznam automatizace: Není uložena žádná souřadnice x pro kontrolní bod (bod "
 "se přehlíží)"
 
-#: automation_list.cc:408
+#: automation_list.cc:462
 msgid ""
 "automation list: no y-coordinate stored for control point (point ignored)"
 msgstr ""
 "Seznam automatizace: Není uložena žádná souřadnice y pro kontrolní bod (bod "
 "se přehlíží)"
 
-#: automation_list.cc:422
+#: automation_list.cc:476
 msgid ""
 "AutomationList: passed XML node called %1, not \"AutomationList\" - ignored"
 msgstr ""
 "Seznam automatizace: Uzel XML s názvem %1, nepředán \"AutomationList\" - "
 "přehlíží se"
 
-#: butler.cc:100
+#: butler.cc:126
 msgid "Session: could not create butler thread"
 msgstr "Sezení: Nepodařilo se vytvořit vlákno sluhy"
 
-#: butler.cc:222 butler.cc:223
+#: butler.cc:254 butler.cc:255
 msgid "Butler read ahead failure on dstream %1"
 msgstr "Chyba při čtení sluhy u dstream %1"
 
-#: butler.cc:270 butler.cc:271
+#: butler.cc:344 butler.cc:345 butler.cc:393 butler.cc:394
 msgid "Butler write-behind failure on dstream %1"
 msgstr "Chyba při zápisu sluhy u dstream %1"
 
-#: control_protocol_manager.cc:164
+#: control_protocol_manager.cc:174
 msgid "control protocol name \"%1\" has no descriptor"
 msgstr "Název kontrolního protokolu \"%1\" nemá žádný popis"
 
-#: control_protocol_manager.cc:171
+#: control_protocol_manager.cc:181
 msgid "control protocol name \"%1\" could not be initialized"
 msgstr "Kontrolní protokol \"%1\" se nepodařilo inicializovat"
 
-#: control_protocol_manager.cc:237
+#: control_protocol_manager.cc:265
 msgid "Instantiating mandatory control protocol %1"
 msgstr "Doložení povinného kontrolního protokolu %1"
 
-#: control_protocol_manager.cc:281
+#: control_protocol_manager.cc:309
 msgid "looking for control protocols in %1\n"
 msgstr "Hledání kontrolního protokolu v %1\n"
 
-#: control_protocol_manager.cc:306
+#: control_protocol_manager.cc:334
 msgid "Control protocol %1 not usable"
 msgstr "Kontrolní protokol %1 nepoužitelný"
 
-#: control_protocol_manager.cc:323
+#: control_protocol_manager.cc:351
 msgid "Control surface protocol discovered: \"%1\"\n"
 msgstr "Protokol pro kontrolní povrch odkryt: \"%1\"\n"
 
-#: control_protocol_manager.cc:341
+#: control_protocol_manager.cc:367
 msgid "ControlProtocolManager: cannot load module \"%1\" (%2)"
 msgstr "ControlProtocolManager: Nelze nahrát modul \"%1\" (%2)"
 
-#: control_protocol_manager.cc:347
+#: control_protocol_manager.cc:373
 msgid "ControlProtocolManager: module \"%1\" has no descriptor function."
 msgstr "ControlProtocolManager: Modul \"%1\" nemá žádnou funkci k popisu"
 
+#: control_protocol_manager.cc:516
+msgid "Control protocol \"%1\" has no descriptor"
+msgstr ""
+
 #: cycle_timer.cc:40
 msgid "CycleTimer::get_mhz(): can't open /proc/cpuinfo"
 msgstr "CycleTimer::get_mhz(): Nelze otevřít /proc/cpuinfo"
@@ -425,7 +612,7 @@ msgstr "Nelze nalézt takt CPU (MHz) v /proc/cpuinfo"
 msgid "audio"
 msgstr "Zvuk"
 
-#: data_type.cc:28 session.cc:1995 session.cc:1998
+#: data_type.cc:28 session.cc:2452
 msgid "MIDI"
 msgstr "MIDI"
 
@@ -437,11 +624,11 @@ msgstr "Neznámý"
 msgid "main outs"
 msgstr "Hlavní výstupy"
 
-#: delivery.cc:121 send.cc:63
+#: delivery.cc:121 send.cc:64
 msgid "listen"
 msgstr "Poslech"
 
-#: diskstream.cc:309
+#: diskstream.cc:311
 msgid "Location \"%1\" not valid for track loop (start >= end)"
 msgstr "Časový bod \"%1\" pro smyčku stopy neplatný (Začátek >= Konec)"
 
@@ -455,24 +642,24 @@ msgstr ""
 msgid "Export failed: %1"
 msgstr "Vyvedení se nezdařilo: %1"
 
-#: export_filename.cc:126
+#: export_filename.cc:128
 msgid "Existing export folder for this session (%1) does not exist - ignored"
 msgstr ""
 "Stávající složka pro vyvedení pro toto sezení (%1) neexistuje - přehlíží se"
 
-#: export_filename.cc:242
+#: export_filename.cc:263
 msgid "No Time"
 msgstr "Žádný čas"
 
-#: export_filename.cc:251
+#: export_filename.cc:272
 msgid "Invalid time format"
 msgstr "Neplatný časový formát"
 
-#: export_filename.cc:260
+#: export_filename.cc:281
 msgid "No Date"
 msgstr "Žádné datum"
 
-#: export_filename.cc:275
+#: export_filename.cc:296
 msgid "Invalid date format"
 msgstr "Neplatný formát data"
 
@@ -508,23 +695,27 @@ msgstr "Ztrátová komprese"
 msgid "Lossless compression"
 msgstr "Bezztrátová komprese"
 
-#: export_format_manager.cc:218 export_format_specification.cc:591
+#: export_format_manager.cc:218 export_format_specification.cc:657
 msgid "Session rate"
 msgstr "Kmitočet sezení"
 
-#: export_format_specification.cc:549
-msgid "normalize"
-msgstr "Normalizovat"
+#: export_format_specification.cc:609
+msgid "normalize loudness"
+msgstr ""
 
-#: export_format_specification.cc:553
+#: export_format_specification.cc:611
+msgid "normalize peak"
+msgstr ""
+
+#: export_format_specification.cc:616
 msgid "trim"
 msgstr "Oříznout"
 
-#: export_format_specification.cc:555
+#: export_format_specification.cc:618
 msgid "trim start"
 msgstr "Ustřihnout začátek"
 
-#: export_format_specification.cc:557
+#: export_format_specification.cc:620
 msgid "trim end"
 msgstr "Ustřihnout konec"
 
@@ -540,25 +731,21 @@ msgstr "Trojúhelníkový"
 msgid "Rectangular"
 msgstr "Obdélníkový"
 
-#: export_formats.cc:52 session.cc:5421 session.cc:5437
-msgid "None"
-msgstr "Žádný"
-
 #: export_formats.cc:159
-msgid "8bit"
-msgstr "8bit"
+msgid "8-bit"
+msgstr ""
 
 #: export_formats.cc:161
-msgid "16bit"
-msgstr "16bit"
+msgid "16-bit"
+msgstr ""
 
 #: export_formats.cc:163
-msgid "24bit"
-msgstr "24bit"
+msgid "24-bit"
+msgstr ""
 
 #: export_formats.cc:165
-msgid "32bit"
-msgstr "32bit"
+msgid "32-bit"
+msgstr ""
 
 #: export_formats.cc:167
 msgid "float"
@@ -569,8 +756,8 @@ msgid "double"
 msgstr "dvojitý"
 
 #: export_formats.cc:171
-msgid "8bit unsigned"
-msgstr "8bit bez znaménka"
+msgid "8-bit unsigned"
+msgstr ""
 
 #: export_formats.cc:173
 msgid "Vorbis sample format"
@@ -580,95 +767,91 @@ msgstr "Vzorkovací formát Vorbis"
 msgid "No sample format"
 msgstr "Žádný vzorkovací formát"
 
-#: export_handler.cc:360
+#: export_handler.cc:419
 msgid "File %1 uploaded to %2"
 msgstr ""
 
-#: export_handler.cc:366
+#: export_handler.cc:425
 msgid ""
 "upload to Soundcloud failed. Perhaps your email or password are incorrect?\n"
 msgstr ""
 
-#: export_handler.cc:413
-msgid "Editor: cannot open \"%1\" as export file for CD marker file"
-msgstr "Editor: Nelze otevřít \"%1\" jako soubor vyvedení pro značku CD"
-
-#: export_handler.cc:492 export_handler.cc:495
-msgid "an error occured while writing a TOC/CUE file: %1"
+#: export_handler.cc:551 export_handler.cc:554
+msgid "an error occurred while writing a TOC/CUE file: %1"
 msgstr "Při zápisu souboru TOC/CUE se vyskytla chyba:%1"
 
-#: export_handler.cc:744 export_handler.cc:802
+#: export_handler.cc:844 export_handler.cc:902
 msgid "Cannot convert %1 to Latin-1 text"
 msgstr "Nelze převést %1 na kódování Latin-1"
 
-#: export_profile_manager.cc:93
+#: export_profile_manager.cc:94
 msgid "Searching for export formats in %1"
 msgstr "Hledání vyváděcích formátů v %1"
 
-#: export_profile_manager.cc:99
+#: export_profile_manager.cc:100
 msgid "Unable to create export format directory %1: %2"
 msgstr "Nelze vytvořit adresář %1 pro vyváděcí formáty: %2"
 
-#: export_profile_manager.cc:262
+#: export_profile_manager.cc:268
 msgid "Unable to remove export preset %1: %2"
 msgstr "Nelze odstranit přednastavení vyvádění %1: %2"
 
-#: export_profile_manager.cc:351
+#: export_profile_manager.cc:357
 msgid "Selection"
 msgstr "Výběr"
 
-#: export_profile_manager.cc:604
+#: export_profile_manager.cc:621
 msgid "Unable to rename export format %1 to %2: %3"
 msgstr "Nelze přejmenovat vyváděcí formát %1 na %2: %3"
 
-#: export_profile_manager.cc:636
+#: export_profile_manager.cc:653
 msgid "Unable to remove export profile %1: %2"
 msgstr "Nelze odstranit vyváděcí profil %1: %2"
 
-#: export_profile_manager.cc:654
+#: export_profile_manager.cc:671
 msgid "empty format"
 msgstr "Prázdný formát"
 
-#: export_profile_manager.cc:735
+#: export_profile_manager.cc:752
 msgid "Cannot load export format from %1"
 msgstr ""
 
-#: export_profile_manager.cc:741
+#: export_profile_manager.cc:758
 msgid "Cannot export format read from %1"
 msgstr ""
 
-#: export_profile_manager.cc:835
+#: export_profile_manager.cc:852
 msgid "No timespan has been selected!"
 msgstr "Nebyl vybrán žádný časový úsek!"
 
-#: export_profile_manager.cc:839
+#: export_profile_manager.cc:856
 msgid "No channels have been selected!"
 msgstr "Nebyly vybrány žádné kanály!"
 
-#: export_profile_manager.cc:843
+#: export_profile_manager.cc:860
 msgid "Some channels are empty"
 msgstr "Některé kanály jsou prázdné"
 
-#: export_profile_manager.cc:876
+#: export_profile_manager.cc:893
 msgid "No format selected!"
 msgstr "Nebyl vybrán žádný formát!"
 
-#: export_profile_manager.cc:878
+#: export_profile_manager.cc:895
 msgid "All channels are empty!"
 msgstr "Všechny kanály jsou prázdné!"
 
-#: export_profile_manager.cc:880
+#: export_profile_manager.cc:897
 msgid "One or more of the selected formats is not compatible with this system!"
 msgstr "Jeden nebo více formátu není slučitelný s tímto systémem!"
 
-#: export_profile_manager.cc:883
+#: export_profile_manager.cc:900
 msgid ""
 "%1 supports only %2 channels, but you have %3 channels in your channel "
 "configuration"
 msgstr ""
 "% podporuje jen %2 kanály, ale ve vašem nastavení kanálů se nachází %3 kanál"
 
-#: file_source.cc:201 session_state.cc:2857
+#: file_source.cc:201 session_state.cc:3284
 msgid ""
 "there are already 1000 files with names like %1; versioning discontinued"
 msgstr "Je již 1000 souborů s názvem, jako je %1; verzování skončeno"
@@ -677,25 +860,25 @@ msgstr "Je již 1000 souborů s názvem, jako je %1; verzování skončeno"
 msgid "cannot rename file source from %1 to %2 (%3)"
 msgstr "Nelze přejmenovat zdroj souboru z %1 na %2 (%3)"
 
-#: file_source.cc:251 file_source.cc:375
+#: file_source.cc:251 file_source.cc:374
 msgid "FileSource: search path not set"
 msgstr "Zdroj souboru: Cesta hledání nenastavena"
 
-#: file_source.cc:435
+#: file_source.cc:434
 msgid ""
 "FileSource: \"%1\" is ambigous when searching\n"
 "\t"
 msgstr ""
 
-#: file_source.cc:442
+#: file_source.cc:441
 msgid "Filesource: cannot find required file (%1)"
 msgstr ""
 
-#: file_source.cc:487
+#: file_source.cc:486
 msgid "Filesource: cannot find required file (%1): %2"
 msgstr "Zdroj souboru: Nelze najít požadovaný soubor (%1): %2"
 
-#: file_source.cc:495
+#: file_source.cc:494
 msgid "Filesource: cannot check for existing file (%1): %2"
 msgstr "Zdroj souboru: U souboru (%1) nelze ověřit, zda existuje: %2"
 
@@ -712,11 +895,11 @@ msgstr ""
 msgid "cannot rename file %1 to %2 (%3)"
 msgstr "Nelze přejmenovat soubor %1 na %2 (%3)"
 
-#: filesystem_paths.cc:105
+#: filesystem_paths.cc:120
 msgid "Cannot create Configuration directory %1 - cannot run"
 msgstr "Nelze vytvořit adresář pro nastavení %1 - nelze spustit"
 
-#: filesystem_paths.cc:110
+#: filesystem_paths.cc:125
 msgid ""
 "Configuration directory %1 already exists and is not a directory/folder - "
 "cannot run"
@@ -724,24 +907,28 @@ msgstr ""
 "Adresář pro nastavení %1 již existuje, není ale žádný adresář/složka - nelze "
 "spustit"
 
-#: filesystem_paths.cc:171
+#: filesystem_paths.cc:186
 msgid "Cannot create cache directory %1 - cannot run"
 msgstr ""
 
-#: filesystem_paths.cc:176
+#: filesystem_paths.cc:191
 msgid ""
 "Cache directory %1 already exists and is not a directory/folder - cannot run"
 msgstr ""
 
-#: filesystem_paths.cc:194
+#: filesystem_paths.cc:209
 msgid "ARDOUR_DLL_PATH not set in environment - exiting\n"
 msgstr "Proměnná prostředí ARDOUR_DLL_PATH není nastavena - ukončuje se\n"
 
-#: filesystem_paths.cc:245
+#: filesystem_paths.cc:232
+msgid "Cannot determine %1 package directory"
+msgstr ""
+
+#: filesystem_paths.cc:277
 msgid "ARDOUR_CONFIG_PATH not set in environment\n"
 msgstr ""
 
-#: filesystem_paths.cc:266
+#: filesystem_paths.cc:298
 msgid "ARDOUR_DATA_PATH not set in environment\n"
 msgstr ""
 
@@ -749,52 +936,81 @@ msgstr ""
 msgid "filter: error creating name for new file based on %1"
 msgstr "Filtr: Chyba při vytváření názvu pro nový soubor z %1"
 
-#: filter.cc:79
+#: filter.cc:92
 msgid "filter: error creating new file %1 (%2)"
 msgstr "Filtr: Chyba při vytváření nového souboru %1 (%2)"
 
-#: find_session.cc:59
+#: find_session.cc:60
 msgid "cannot check session path %1 (%2)"
 msgstr "Nelze ověřit cestu sezení %1 (%2)"
 
-#: find_session.cc:85
+#: find_session.cc:86
 msgid "cannot check statefile %1 (%2)"
 msgstr "Nelze ověřit soubor sezení %1 (%2)"
 
-#: find_session.cc:121
+#: find_session.cc:125
 msgid "%1 is not a snapshot file"
 msgstr "%1 není souborem se snímkem"
 
-#: find_session.cc:138
+#: find_session.cc:142
 msgid "cannot determine current working directory (%1)"
 msgstr "Nelze určit nynější pracovní adresář (%1)"
 
-#: find_session.cc:155
+#: find_session.cc:159
 msgid "unknown file type for session %1"
 msgstr "Neznámý typ souboru pro sezení %1"
 
-#: globals.cc:234
+#: gain_control.cc:81
+#, c-format
+msgid "%3.1f dB"
+msgstr ""
+
+#: globals.cc:266
 msgid "Could not set system open files limit to \"unlimited\""
 msgstr ""
 "Nepodařilo se nastavit systémové omezení pro otevřené soubory na \"neomezeno"
 "\""
 
-#: globals.cc:236
+#: globals.cc:268
 msgid "Could not set system open files limit to %1"
 msgstr "Nepodařilo se nastavit systémové omezení pro otevřené soubory na %1"
 
-#: globals.cc:240
+#: globals.cc:272 globals.cc:289
 msgid "Your system is configured to limit %1 to only %2 open files"
 msgstr "Vaše systémové nastavení omezuje %1 na jen %2 otevřené soubory"
 
-#: globals.cc:244
+#: globals.cc:276
 msgid "Could not get system open files limit (%1)"
 msgstr "Nepodařilo se dostat systémové omezení pro otevřené soubory (%1)"
 
-#: globals.cc:415
+#: globals.cc:291
+msgid "Could not set system open files limit. Current limit is %1 open files"
+msgstr ""
+
+#: globals.cc:474
 msgid "Loading configuration"
 msgstr "Nahrává se nastavení"
 
+#: globals.cc:554 route.cc:182 route.cc:4149 session.cc:1157
+msgid "Monitor"
+msgstr ""
+
+#: globals.cc:555 session_state.cc:642
+msgid "Master"
+msgstr ""
+
+#: globals.cc:556
+msgid "Control"
+msgstr ""
+
+#: globals.cc:557
+msgid "Click"
+msgstr ""
+
+#: globals.cc:558
+msgid "Mackie"
+msgstr ""
+
 #: import.cc:146
 msgid "Cannot find new filename for imported file %1"
 msgstr ""
@@ -820,8 +1036,8 @@ msgid "Track %1 of %2 contained no usable MIDI data"
 msgstr "Stopa %1 z %2 neobsahovala žádná užitečná data MIDI"
 
 #: import.cc:427
-msgid "MIDI file %1 was not readable (no reason available)"
-msgstr "Soubor MIDI %1 nebyl čitelný (žádná příčina se nedá určit)"
+msgid "MIDI file could not be written (best guess: %1)"
+msgstr ""
 
 #: import.cc:475
 msgid "Import: cannot open input sound file \"%1\""
@@ -848,110 +1064,113 @@ msgstr ""
 msgid "Unknown"
 msgstr "Neznámý"
 
-#: instrument_info.cc:231
+#: instrument_info.cc:243
 msgid "preset %1 (bank %2)"
 msgstr "Přednastavení %1 (banka %2)"
 
-#: internal_send.cc:316 internal_send.cc:317
+#: internal_send.cc:338 internal_send.cc:339
 msgid "%1 - cannot find any track/bus with the ID %2 to connect to"
 msgstr "%1 - Nelze najít stopu/sběrnici s ID %2 ke spojení s"
 
-#: io.cc:209
+#: io.cc:212
 msgid "IO: cannot disconnect port %1 from %2"
 msgstr "IO: Přípojku %1 nelze oddělit od %2"
 
-#: io.cc:344 io.cc:431
+#: io.cc:347 io.cc:435
 msgid "IO: cannot register input port %1"
 msgstr "IO: Nelze zapsat vstupní přípojku %1"
 
-#: io.cc:349 io.cc:436
+#: io.cc:352 io.cc:440
 msgid "IO: cannot register output port %1"
 msgstr "IO: Nelze zapsat výstupní přípojku %1"
 
-#: io.cc:598 io.cc:654
+#: io.cc:607 io.cc:668
 msgid "incorrect XML node \"%1\" passed to IO object"
 msgstr "Nesprávný uzel XML \"%1\" odevzdán objektu IO"
 
-#: io.cc:713
+#: io.cc:730
 msgid "in"
 msgstr "vst"
 
-#: io.cc:713
+#: io.cc:730
 msgid "out"
 msgstr "výst"
 
-#: io.cc:714
+#: io.cc:731
 msgid "input"
 msgstr "Vstup"
 
-#: io.cc:714
+#: io.cc:731
 msgid "output"
 msgstr "Výstup"
 
-#: io.cc:724
+#: io.cc:741
 msgid "Unknown bundle \"%1\" listed for %2 of %3"
 msgstr "Neznámý kabel \"%1\"uvedený pro %2 %3"
 
-#: io.cc:790
+#: io.cc:807
 msgid "Bundle %1 was not available - \"%2\" used instead"
 msgstr "Kabel %1 nebyl dostupný - místo něj se používá \"%2\" "
 
-#: io.cc:793
+#: io.cc:810
 msgid "No %1 bundles available as a replacement"
 msgstr "Žádné %1 kabely dostupné jako náhrada"
 
-#: io.cc:897
+#: io.cc:914
 msgid "%1: cannot create I/O ports"
 msgstr "%1: Nelze vytvořit přípojky vstup/výstup"
 
-#: io.cc:1025 io.cc:1126
+#: io.cc:1042 io.cc:1143
 msgid "IO: badly formed string in XML node for inputs \"%1\""
 msgstr "IO: Špatně utvořený řetězec v uzlu XML pro vstupy \"%1\""
 
-#: io.cc:1030 io.cc:1131
+#: io.cc:1047 io.cc:1148
 msgid "bad input string in XML node \"%1\""
 msgstr "IO: Špatný řetězec pro vstup v uzlu XML \"%1\""
 
-#: io.cc:1069
+#: io.cc:1086
 msgid "IO: badly formed string in XML node for outputs \"%1\""
 msgstr "IO: Špatně utvořený řetězec v uzlu XML pro výstupy \"%1\""
 
-#: io.cc:1074
+#: io.cc:1091
 msgid "IO: bad output string in XML node \"%1\""
 msgstr "IO: Špatný řetězec pro výstup v uzlu XML \"%1\""
 
-#: io.cc:1413
+#: io.cc:1256 plugin.cc:275
+msgid "Out"
+msgstr ""
+
+#: io.cc:1256 plugin.cc:273
+msgid "In"
+msgstr ""
+
+#: io.cc:1454
 #, c-format
 msgid "%s %u"
 msgstr "%s %u"
 
-#: io.cc:1460
+#: io.cc:1501
 #, c-format
 msgid "%s in"
 msgstr "%s vstup"
 
-#: io.cc:1462
+#: io.cc:1503
 #, c-format
 msgid "%s out"
 msgstr "%s výstup"
 
-#: io.cc:1537 session.cc:733 session.cc:767
+#: io.cc:1578 session.cc:957 session.cc:991
 msgid "mono"
 msgstr "Mono"
 
-#: io.cc:1539 session.cc:746 session.cc:781
+#: io.cc:1580 session.cc:970 session.cc:1005
 msgid "L"
 msgstr "L"
 
-#: io.cc:1539 session.cc:748 session.cc:783
+#: io.cc:1580 session.cc:972 session.cc:1007
 msgid "R"
 msgstr "P"
 
-#: io.cc:1541 io.cc:1547
-#, c-format
-msgid "%d"
-msgstr "%d"
-
 #: ladspa_plugin.cc:93
 msgid "LADSPA: Unable to open module: "
 msgstr ""
@@ -969,7 +1188,7 @@ msgid "LADSPA: \"%1\" cannot be used, since it cannot do inplace processing"
 msgstr ""
 "LADSPA: \"%1\" nemůže být použit, neboť nedělá žádný \"inplace processing\""
 
-#: ladspa_plugin.cc:311
+#: ladspa_plugin.cc:308
 msgid ""
 "illegal parameter number used with plugin \"%1\". This may indicate a change "
 "in the plugin design, and presets may be invalid"
@@ -977,75 +1196,75 @@ msgstr ""
 "Špatné číslo parametru pro přídavný modul \"%1\". To může značit změnu v "
 "návrhupřídavného modulu, a přednastavení jsou případně neplatná"
 
-#: ladspa_plugin.cc:390 ladspa_plugin.cc:440
+#: ladspa_plugin.cc:387 ladspa_plugin.cc:437
 msgid "Bad node sent to LadspaPlugin::set_state"
 msgstr "Špatný uzel poslán LadspaPlugin::set_state"
 
-#: ladspa_plugin.cc:405 ladspa_plugin.cc:454
+#: ladspa_plugin.cc:402 ladspa_plugin.cc:451
 msgid "LADSPA: no ladspa port number"
 msgstr "LADSPA: Žádné číslo přípojky LADSPA"
 
-#: ladspa_plugin.cc:411 ladspa_plugin.cc:460
+#: ladspa_plugin.cc:408 ladspa_plugin.cc:457
 msgid "LADSPA: no ladspa port data"
 msgstr "LADSPA: Žádná data přípojky LADSPA"
 
-#: ladspa_plugin.cc:842
+#: ladspa_plugin.cc:863
 msgid "Could not locate HOME.  Preset not removed."
 msgstr "Nepodařilo se najít HOME. Přednastavení neodstraněno."
 
-#: ladspa_plugin.cc:881 ladspa_plugin.cc:887
+#: ladspa_plugin.cc:902 ladspa_plugin.cc:908
 msgid "Could not create %1.  Preset not saved. (%2)"
 msgstr "Nepodařilo se vytvořit %1. Přednastavení neuloženo. (%2)"
 
-#: ladspa_plugin.cc:894
+#: ladspa_plugin.cc:915
 msgid "Error saving presets file %1."
 msgstr "Chyba při ukládání souboru s přednastavením %1."
 
-#: ladspa_plugin.cc:936
+#: ladspa_plugin.cc:957
 msgid "Could not locate HOME.  Preset not saved."
 msgstr "Nepodařilo se najít HOME. Přednastavení neuloženo."
 
-#: location.cc:456
+#: location.cc:455
 msgid "You cannot put a CD marker at this position"
 msgstr "Na toto místo nemůžete dát žádnou značku CD"
 
-#: location.cc:608
+#: location.cc:607
 msgid "incorrect XML node passed to Location::set_state"
 msgstr "Nesprávný uzel XML předán dál Location::set_state"
 
-#: location.cc:613
+#: location.cc:612
 msgid "XML node for Location has no ID information"
 msgstr "Uzel XML pro polohu nemá žádnou informaci o ID"
 
-#: location.cc:617
+#: location.cc:616
 msgid "XML node for Location has no name information"
 msgstr "Uzel XML pro polohu nemá žádnou informaci o názvu"
 
-#: location.cc:624
+#: location.cc:623
 msgid "XML node for Location has no start information"
 msgstr "Uzel XML pro polohu nemá žádnou informaci o začátku"
 
-#: location.cc:635
+#: location.cc:634
 msgid "XML node for Location has no end information"
 msgstr "Uzel XML pro polohu nemá žádnou informaci o konci"
 
-#: location.cc:642
+#: location.cc:641
 msgid "XML node for Location has no flags information"
 msgstr "Uzel XML pro polohu nemá žádnou informaci o příznacích"
 
-#: location.cc:856
+#: location.cc:868
 msgid "Locations: attempt to use unknown location as selected location"
 msgstr "Locations: Pokus o použití neznámé polohy jako vybrané polohy"
 
-#: location.cc:1034
+#: location.cc:1046
 msgid "incorrect XML mode passed to Locations::set_state"
 msgstr "Nesprávný uzel XML předán dál Locations::set_state"
 
-#: location.cc:1047 session.cc:1293 session.cc:4919 session_state.cc:1053
+#: location.cc:1059 session.cc:1667 session.cc:6305 session_state.cc:1205
 msgid "session"
 msgstr "Sezení"
 
-#: location.cc:1112
+#: location.cc:1126
 msgid "could not load location from session file - ignored"
 msgstr "Nepodařilo se nahrát polohu ze souboru se sezením - přehlíží se"
 
@@ -1097,50 +1316,106 @@ msgstr ""
 "Poloha s tímto názvem již existuje.\n"
 "Zavedenou polohu můžete přejmenovat:"
 
-#: ltc_slave.cc:272
+#: ltc_file_reader.cc:96
+msgid "LTCFileReader: cannot open file \"%1\""
+msgstr ""
+
+#: ltc_file_reader.cc:105
+msgid "LTCFileReader: cannot open file \"%1\" (%3)"
+msgstr ""
+
+#: ltc_file_reader.cc:109
+msgid "LTCFileReader: \"%1\" is an empty audio file"
+msgstr ""
+
+#: ltc_file_reader.cc:134
+msgid "LTCFileReader:: invalid audio channel selected"
+msgstr ""
+
+#: ltc_slave.cc:275
 msgid "Session framerate adjusted from %1 to LTC's %2."
 msgstr "Rychlost snímkování sezení změněna z %1 na %2 (LTC)."
 
-#: ltc_slave.cc:286
+#: ltc_slave.cc:289
 msgid "Session and LTC framerate mismatch: LTC:%1 Session:%2."
 msgstr "Rychlost snímkování sezení a LTC se liší: LTC: %1 Sezení: %2."
 
-#: ltc_slave.cc:603
+#: ltc_slave.cc:609
 msgid "flywheel"
 msgstr "Setrvačník"
 
-#: midi_diskstream.cc:173
+#: lua_api.cc:87
+msgid "Script with given name was not found\n"
+msgstr ""
+
+#: lua_api.cc:96
+msgid "Failed to instantiate Lua Processor\n"
+msgstr ""
+
+#: luaproc.cc:876
+msgid "Failed to load Lua script from session state."
+msgstr ""
+
+#: luaproc.cc:886
+msgid "Session State for LuaProcessor did not include a Lua script."
+msgstr ""
+
+#: luaproc.cc:890
+msgid "Invalid/incompatible Lua script found for LuaProcessor."
+msgstr ""
+
+#: luaproc.cc:918
+msgid "Bad node sent to LuaProc::set_state"
+msgstr ""
+
+#: luaproc.cc:928
+msgid "LuaProc: port has no symbol, ignored"
+msgstr ""
+
+#: luaproc.cc:934
+msgid "LuaProc: port has no value, ignored"
+msgstr ""
+
+#: luaproc.cc:1164
+msgid "Unable to create LuaProc presets directory"
+msgstr ""
+
+#: luascripting.cc:132
+msgid "Script '%1' has no valid descriptor."
+msgstr ""
+
+#: midi_diskstream.cc:172
 msgid ""
 "%1: I/O configuration change %4 requested to use %2, but channel setup is %3"
 msgstr ""
 "%1: Změna nastavení vstupu/výstupu %4 použije %2, ale počet kanálů je %3"
 
-#: midi_diskstream.cc:225
+#: midi_diskstream.cc:224
 msgid "MidiDiskstream: Playlist \"%1\" isn't a midi playlist"
 msgstr "MidiDiskstream: Seznam skladeb \"%1\" není seznamem skladeb MIDI"
 
-#: midi_diskstream.cc:276
+#: midi_diskstream.cc:275
 msgid "MidiDiskstream %1: there is no existing playlist to make a copy of!"
 msgstr ""
 "MidiDiskstream %1: není žádný seznam skladeb, který by bylo lze kopírovat!"
 
-#: midi_diskstream.cc:754
+#: midi_diskstream.cc:753
 msgid "MidiDiskstream %1: cannot read %2 from playlist at frame %3"
 msgstr "MidiDiskstream %1: Nelze číst %2 ze seznamu skladeb u snímku %3"
 
-#: midi_diskstream.cc:891
+#: midi_diskstream.cc:890
 msgid "MidiDiskstream %1: cannot write to disk"
 msgstr "MidiDiskstream %1: Nelze zapisovat na disk"
 
-#: midi_diskstream.cc:925
+#: midi_diskstream.cc:924
 msgid "MidiDiskstream \"%1\": cannot flush captured data to disk!"
 msgstr "MidiDiskstream %1: Zachycená data nelze zapisovat na disk!"
 
-#: midi_diskstream.cc:1014
+#: midi_diskstream.cc:1013
 msgid "%1: could not create region for complete midi file"
 msgstr "%1: Nepodařilo se vytvořit oblast pro úplný soubor MIDI"
 
-#: midi_diskstream.cc:1055
+#: midi_diskstream.cc:1054
 msgid "MidiDiskstream: could not create region for captured midi!"
 msgstr ""
 "MidiDiskstream: Nepodařilo se vytvořit oblast pro zaznamenaný materiál MIDI!"
@@ -1161,31 +1436,47 @@ msgstr "Nenalezeno žádné NoteID pro změnu vlastnosti \"note\" - přehlíží
 msgid "No SysExID found for sys-ex property change - ignored"
 msgstr "Nenalezeno žádné SysExID pro změnu vlastnosti \"sys-ex\" - přehlíží se"
 
-#: midi_model.cc:1994
-msgid "transpose"
-msgstr "Převést"
+#: midi_patch_manager.cc:78
+msgid "Loading %1 MIDI patch from %2"
+msgid_plural "Loading %1 MIDI patches from %2"
+msgstr[0] ""
+msgstr[1] ""
+
+#: midi_patch_manager.cc:109
+msgid "Unloading %1 MIDI patch from %2"
+msgid_plural "Unloading %1 MIDI patches from %2"
+msgstr[0] ""
+msgstr[1] ""
 
-#: midi_patch_manager.cc:133
+#: midi_patch_manager.cc:126
+msgid "Error parsing MIDI patch file %1"
+msgstr ""
+
+#: midi_patch_manager.cc:135
 msgid "Duplicate MIDI device `%1' in `%2' ignored"
 msgstr "Zdvojení zařízení MIDI `%1' v `%2' se přehlíží"
 
-#: midi_scene_changer.cc:295
+#: midi_patch_manager.cc:170
+msgid "Removing MIDI patch file %1"
+msgstr ""
+
+#: midi_scene_changer.cc:312
 msgid "Scene "
 msgstr ""
 
-#: midi_source.cc:125
+#: midi_source.cc:126
 msgid "Missing parameter property on InterpolationStyle"
 msgstr "Chybějící vlastnost \"parameter\" u InterpolationStyle"
 
-#: midi_source.cc:131
+#: midi_source.cc:132
 msgid "Missing style property on InterpolationStyle"
 msgstr "Chybějící vlastnost \"style\" u InterpolationStyle"
 
-#: midi_source.cc:140
+#: midi_source.cc:141
 msgid "Missing parameter property on AutomationState"
 msgstr "Chybějící vlastnost \"parameter\" u AutomationState"
 
-#: midi_source.cc:146
+#: midi_source.cc:147
 msgid "Missing state property on AutomationState"
 msgstr "Chybějící vlastnost \"state\" u AutomationState"
 
@@ -1193,47 +1484,47 @@ msgstr "Chybějící vlastnost \"state\" u AutomationState"
 msgid "MIDI stretch created non-MIDI source"
 msgstr "Protažení MIDI vytvořilo zdroj, který není MIDI"
 
-#: monitor_processor.cc:53
+#: monitor_processor.cc:54
 msgid "monitor dim"
 msgstr "Utlumení sledování "
 
-#: monitor_processor.cc:54
+#: monitor_processor.cc:55
 msgid "monitor cut"
 msgstr "Přerušení sledování "
 
-#: monitor_processor.cc:55
+#: monitor_processor.cc:56
 msgid "monitor mono"
 msgstr "Mono sledování"
 
-#: monitor_processor.cc:58
+#: monitor_processor.cc:59
 msgid "monitor dim level"
 msgstr "Síla hlasitosti pro utlumení sledování "
 
-#: monitor_processor.cc:62
+#: monitor_processor.cc:63
 msgid "monitor solo boost level"
 msgstr "Síla hlasitosti pro zdůraznění sóla sledování"
 
-#: monitor_processor.cc:512
+#: monitor_processor.cc:543
 msgid "cut control %1"
 msgstr "Ovládání přerušení %1"
 
-#: monitor_processor.cc:513
+#: monitor_processor.cc:544
 msgid "dim control"
 msgstr "Ovládání útlumu"
 
-#: monitor_processor.cc:514
+#: monitor_processor.cc:545
 msgid "polarity control"
 msgstr "Ovládání polarity"
 
-#: monitor_processor.cc:515
+#: monitor_processor.cc:546
 msgid "solo control"
 msgstr "Ovládání sóla"
 
-#: mtc_slave.cc:240
+#: mtc_slave.cc:241
 msgid "MTC Slave: atomic read of current time failed, sleeping!"
 msgstr "MTC Slave: Chyba při atomickém čtení nynějšího času, spánek!"
 
-#: mtc_slave.cc:362
+#: mtc_slave.cc:363
 msgid ""
 "Unknown rate/drop value %1 in incoming MTC stream, session values used "
 "instead"
@@ -1241,11 +1532,11 @@ msgstr ""
 "Neznámá hodnota %1 pro rychlost snímkování/zahozené snímky v příchozím "
 "datovém proudu MTC, místo ní se používají hodnoty sezení"
 
-#: mtc_slave.cc:382
+#: mtc_slave.cc:383
 msgid "Session framerate adjusted from %1 TO: MTC's %2."
 msgstr "Rychlost snímkování sezení změněna z %1 na MTC: %2"
 
-#: mtc_slave.cc:396
+#: mtc_slave.cc:397
 msgid "Session and MTC framerate mismatch: MTC:%1 %2:%3."
 msgstr "Rychlost snímkování sezení a MTC se neshodují: MTC: %1 %2:%3."
 
@@ -1301,7 +1592,7 @@ msgstr "Kopírovat oblast"
 msgid "fixed time region copy"
 msgstr "Kopírovat oblast s pevně stanoveným časem"
 
-#: pannable.cc:207
+#: pannable.cc:208
 msgid "Pannable given XML data for %1 - ignored"
 msgstr "Cíli vyvážení předána data XML pro %1 - přehlíží se"
 
@@ -1335,21 +1626,69 @@ msgstr ""
 msgid "select panner: %1\n"
 msgstr ""
 
-#: panner_shell.cc:255
+#: panner_shell.cc:257
 msgid "Unknown panner plugin \"%1\" found in pan state - ignored"
 msgstr ""
 "Ve stavu vyvážení nalezen neznámý přídavný modul pro vyvážení \"%1\" - "
 "přehlíží se"
 
-#: panner_shell.cc:261
+#: panner_shell.cc:263
 msgid "panner plugin node has no type information!"
 msgstr "Uzel přídavného modulu pro vyvážení nemá žádnou informaci o typu!"
 
-#: playlist.cc:2138
+#: parameter_descriptor.cc:201
+msgid "Note|C"
+msgstr ""
+
+#: parameter_descriptor.cc:202
+msgid "Note|C#"
+msgstr ""
+
+#: parameter_descriptor.cc:203
+msgid "Note|D"
+msgstr ""
+
+#: parameter_descriptor.cc:204
+msgid "Note|D#"
+msgstr ""
+
+#: parameter_descriptor.cc:205
+msgid "Note|E"
+msgstr ""
+
+#: parameter_descriptor.cc:206
+msgid "Note|F"
+msgstr ""
+
+#: parameter_descriptor.cc:207
+msgid "Note|F#"
+msgstr ""
+
+#: parameter_descriptor.cc:208
+msgid "Note|G"
+msgstr ""
+
+#: parameter_descriptor.cc:209
+msgid "Note|G#"
+msgstr ""
+
+#: parameter_descriptor.cc:210
+msgid "Note|A"
+msgstr ""
+
+#: parameter_descriptor.cc:211
+msgid "Note|A#"
+msgstr ""
+
+#: parameter_descriptor.cc:212
+msgid "Note|B"
+msgstr ""
+
+#: playlist.cc:2234
 msgid "region state node has no ID, ignored"
 msgstr "Uzel stavu oblasti nemá žádné ID, přehlíží se"
 
-#: playlist.cc:2156
+#: playlist.cc:2252
 msgid "Playlist: cannot create region from XML"
 msgstr "Seznam skladeb: Nelze vytvořit oblast ze XML"
 
@@ -1361,35 +1700,59 @@ msgstr "Žádné ID seznamu skladeb v XML zdroje seznamu skladeb!"
 msgid "Could not construct playlist for PlaylistSource from session data!"
 msgstr "Nepodařilo se sestavit seznam skladeb ze zdrojových dat sezení!"
 
-#: plugin.cc:328
+#: plugin.cc:126
+msgid "Cannot remove plugin factory preset."
+msgstr ""
+
+#: plugin.cc:144
+msgid "Preset with given name already exists."
+msgstr ""
+
+#: plugin.cc:263
+msgid "Audio"
+msgstr "Zvuk"
+
+#: plugin.cc:266
+msgid "Midi"
+msgstr ""
+
+#: plugin.cc:269
+msgid "?"
+msgstr ""
+
+#: plugin.cc:412
 msgid ""
 "Plugin presets are not supported in this build of %1. Consider paying for a "
 "full version"
 msgstr ""
 
-#: plugin.cc:403
+#: plugin.cc:495
 msgid ""
 "Saving plugin settings is not supported in this build of %1. Consider paying "
 "for the full version"
 msgstr ""
 
-#: plugin_insert.cc:596
+#: plugin_insert.cc:1148
 msgid "programming error: "
 msgstr "Chyba v programování:"
 
-#: plugin_insert.cc:933
+#: plugin_insert.cc:1700
+msgid "SC %1"
+msgstr ""
+
+#: plugin_insert.cc:2352
 msgid "XML node describing plugin is missing the `type' field"
 msgstr "Uzlu XML k popisu přídavného modulu chybí pole \"type\""
 
-#: plugin_insert.cc:948
+#: plugin_insert.cc:2369
 msgid "unknown plugin type %1 in plugin insert state"
 msgstr "Neznámý typ přídavného modulu %1 ve vkládacím stavu přídavného modulu"
 
-#: plugin_insert.cc:976
+#: plugin_insert.cc:2397
 msgid "Plugin has no unique ID field"
 msgstr "Přídavný modul nemá žádné pole pro jedinečné ID"
 
-#: plugin_insert.cc:1001
+#: plugin_insert.cc:2435
 msgid ""
 "Found a reference to a plugin (\"%1\") that is unknown.\n"
 "Perhaps it was removed or moved since it was last used."
@@ -1397,80 +1760,174 @@ msgstr ""
 "Nalezen odkaz na neznámý přídavný modul (\"%1\").\n"
 "Snad byl od posledního použití odstraněn nebo přesunut."
 
-#: plugin_insert.cc:1115
+#: plugin_insert.cc:2645
 msgid "PluginInsert: Auto: no ladspa port number"
 msgstr "PluginInsert: Auto: Žádné číslo přípojky LADSPA"
 
-#: plugin_insert.cc:1122
+#: plugin_insert.cc:2652
 msgid "PluginInsert: Auto: port id out of range"
 msgstr "PluginInsert: Auto: Překročení rozsahu ID přípojky"
 
-#: plugin_insert.cc:1158
+#: plugin_insert.cc:2688
 msgid "PluginInsert: automatable control %1 not found - ignored"
 msgstr ""
 "PluginInsert: automatizovatelný prvek ovládání %1 nenalezen - přehlíží se"
 
-#: plugin_manager.cc:209
+#: plugin_manager.cc:220
 msgid "Discovering Plugins"
 msgstr "Hledání přídavných modulů"
 
-#: plugin_manager.cc:231
+#: plugin_manager.cc:251
 msgid "Scanning LADSPA Plugins"
 msgstr ""
 
-#: plugin_manager.cc:234
+#: plugin_manager.cc:253
+msgid "Scanning Lua DSP Processors"
+msgstr ""
+
+#: plugin_manager.cc:256
 msgid "Scanning LV2 Plugins"
 msgstr ""
 
-#: plugin_manager.cc:239
+#: plugin_manager.cc:262
 msgid "Scanning Windows VST Plugins"
 msgstr ""
 
-#: plugin_manager.cc:246
+#: plugin_manager.cc:264
+msgid "Discovering Windows VST Plugins"
+msgstr ""
+
+#: plugin_manager.cc:273
 msgid "Scanning Linux VST Plugins"
 msgstr ""
 
-#: plugin_manager.cc:252
+#: plugin_manager.cc:275
+msgid "Discovering Linux VST Plugins"
+msgstr ""
+
+#: plugin_manager.cc:288
+msgid "VST Blacklist: "
+msgstr ""
+
+#: plugin_manager.cc:290
+msgid "VST Blacklist:"
+msgstr ""
+
+#: plugin_manager.cc:300
 msgid "Scanning AU Plugins"
 msgstr ""
 
-#: plugin_manager.cc:256
+#: plugin_manager.cc:302
+msgid "Discovering AU Plugins"
+msgstr ""
+
+#: plugin_manager.cc:307
 msgid "Plugin Scan Complete..."
 msgstr ""
 
-#: plugin_manager.cc:393
+#: plugin_manager.cc:513
 msgid "LADSPA"
 msgstr ""
 
-#: plugin_manager.cc:445
+#: plugin_manager.cc:565
 msgid "Could not parse rdf file: %1"
 msgstr "Nepodařilo se zpracovat soubor RDF: %1"
 
-#: plugin_manager.cc:482
+#: plugin_manager.cc:602
 msgid "LADSPA: cannot load module \"%1\" (%2)"
 msgstr "LADSPA: Nelze nahrát modul \"%1\" (%2)"
 
-#: plugin_manager.cc:489
+#: plugin_manager.cc:609
 msgid "LADSPA: module \"%1\" has no descriptor function."
 msgstr "LADSPA: Modul \"%1\" nemá žádnou funkci popisu."
 
-#: plugin_manager.cc:705
+#: plugin_manager.cc:813
+msgid "--- Windows VST plugins Scan: %1"
+msgstr ""
+
+#: plugin_manager.cc:819
 msgid "VST"
 msgstr ""
 
-#: plugin_manager.cc:732
+#: plugin_manager.cc:824
+msgid "--- Windows VST plugins Scan Done"
+msgstr ""
+
+#: plugin_manager.cc:839
+msgid "cannot open dll"
+msgstr ""
+
+#: plugin_manager.cc:843
+msgid "invalid dll, file too small"
+msgstr ""
+
+#: plugin_manager.cc:847
+msgid "not a dll"
+msgstr ""
+
+#: plugin_manager.cc:853
+msgid "cannot determine dll type"
+msgstr ""
+
+#: plugin_manager.cc:857
+msgid "cannot read dll PE header"
+msgstr ""
+
+#: plugin_manager.cc:862
+msgid "invalid dll PE header"
+msgstr ""
+
+#: plugin_manager.cc:869
+msgid "i386 (32-bit)"
+msgstr ""
+
+#: plugin_manager.cc:872
+msgid "Itanium"
+msgstr ""
+
+#: plugin_manager.cc:875
+msgid "x64 (64-bit)"
+msgstr ""
+
+#: plugin_manager.cc:878
+msgid "Native Architecture"
+msgstr ""
+
+#: plugin_manager.cc:881
+msgid "Unknown Architecture"
+msgstr ""
+
+#: plugin_manager.cc:897
+msgid " *  %1 (cache only)"
+msgstr ""
+
+#: plugin_manager.cc:899
+msgid " *  %1 - %2"
+msgstr ""
+
+#: plugin_manager.cc:913
+msgid " -> Cannot get Windows VST information, plugin ignored."
+msgstr ""
+
+#: plugin_manager.cc:924
 msgid ""
-"VST plugin %1 does not support processReplacing, and so cannot be used in %2 "
-"at this time"
+"VST plugin %1 does not support processReplacing, and cannot be used in %2 at "
+"this time"
 msgstr ""
-"Přídavný modul VST %1 nepodporuje processReplacing a z toho důvodu jej nyní "
-"nelze v %2 použít"
 
-#: plugin_manager.cc:824
+#: plugin_manager.cc:959
+msgid "Ignoring duplicate Windows VST plugin \"%1\""
+msgstr ""
+
+#: plugin_manager.cc:971
+msgid " -> OK (VST Plugin \"%1\" was added)."
+msgstr ""
+
+#: plugin_manager.cc:1019
 msgid "LXVST"
 msgstr ""
 
-#: plugin_manager.cc:851
+#: plugin_manager.cc:1046
 msgid ""
 "linuxVST plugin %1 does not support processReplacing, and so cannot be used "
 "in %2 at this time"
@@ -1478,16 +1935,16 @@ msgstr ""
 "Přídavný modul linuxVST %1 nepodporuje processReplacing a z toho důvodu jej "
 "nyní nelze v %2 použít"
 
-#: plugin_manager.cc:1020
+#: plugin_manager.cc:1213
 msgid "unknown plugin status type \"%1\" - all entries ignored"
 msgstr ""
 "Neznámý typ stavu přídavného modulu\"%1\" - všechny záznamy se přehlíží"
 
-#: plugin_manager.cc:1037
+#: plugin_manager.cc:1232
 msgid "unknown plugin type \"%1\" - ignored"
 msgstr "Neznámý typ přídavného modulu \"%1\" - přehlíží se"
 
-#: port.cc:450
+#: port.cc:504
 msgid "could not reregister %1"
 msgstr "Nepodařilo se znovu zaregistrovat %1"
 
@@ -1495,16 +1952,16 @@ msgstr "Nepodařilo se znovu zaregistrovat %1"
 msgid "insert %1"
 msgstr "Vložit %1"
 
-#: port_insert.cc:197
+#: port_insert.cc:204
 msgid "XML node describing port insert is missing the `type' field"
 msgstr "Uzlu XML k popisu přípojky chybí pole \"type\""
 
-#: port_insert.cc:202
+#: port_insert.cc:209
 msgid "non-port insert XML used for port plugin insert"
 msgstr ""
 "XML pro vložení ne-přípojky použito ke vložení přídavného modulu přípojky"
 
-#: port_manager.cc:287
+#: port_manager.cc:288
 msgid ""
 "a port with the name \"%1\" already exists: check for duplicated track/bus "
 "names"
@@ -1512,49 +1969,49 @@ msgstr ""
 "Přípojka s názvem \"%1\" již existuje: Prověřte na zdvojené názvy stop/"
 "sběrnic"
 
-#: port_manager.cc:289
+#: port_manager.cc:290
 msgid ""
 "No more ports are available. You will need to stop %1 and restart with more "
 "ports if you need this many tracks."
 msgstr ""
 
-#: port_manager.cc:292
+#: port_manager.cc:293
 msgid "AudioEngine: cannot register port \"%1\": %2"
 msgstr "AudioEngine: Nelze zaregistrovat přípojku \"%1\": %2"
 
-#: port_manager.cc:331
+#: port_manager.cc:332
 msgid "unable to create port: %1"
 msgstr "Nelze vytvořit přípojku: %1"
 
-#: port_manager.cc:418
+#: port_manager.cc:453
 msgid "AudioEngine: cannot connect %1 (%2) to %3 (%4)"
 msgstr "AudioEngine: Nelze spojit %1 (%2) s %3 (%4)"
 
-#: port_manager.cc:470 port_manager.cc:471
+#: port_manager.cc:505 port_manager.cc:506
 msgid "Re-establising port %1 failed"
 msgstr ""
 
-#: processor.cc:214
+#: processor.cc:218
 msgid "No %1 property flag in element %2"
 msgstr "Žádný příznak pro vlastnost \"%1\" v prvku %2"
 
-#: processor.cc:223
+#: processor.cc:227
 msgid "No child node with active property"
 msgstr "Žádný uzel potomka s vlastností \"činný\""
 
-#: rc_configuration.cc:91
+#: rc_configuration.cc:92
 msgid "Loading system configuration file %1"
 msgstr "Nahrává se soubor s nastavením systému %1"
 
-#: rc_configuration.cc:95
+#: rc_configuration.cc:96
 msgid "%1: cannot read system configuration file \"%2\""
 msgstr "%1: Nelze přečíst soubor s nastavením systému \"%2\""
 
-#: rc_configuration.cc:100
+#: rc_configuration.cc:101
 msgid "%1: system configuration file \"%2\" not loaded successfully."
 msgstr "%1: Soubor s nastavením systému \"%2\" se nepodařilo nahrát."
 
-#: rc_configuration.cc:104
+#: rc_configuration.cc:105
 msgid ""
 "Your system %1 configuration file is empty. This probably means that there "
 "was an error installing %1"
@@ -1562,93 +2019,156 @@ msgstr ""
 "Váš soubor s nastavením systému %1 je prázdný. To zřejmě znamená, že při "
 "instalaci %1 se vyskytla chyba."
 
-#: rc_configuration.cc:119
+#: rc_configuration.cc:120
 msgid "Loading user configuration file %1"
 msgstr "Nahrává se soubor s uživatelovým nastavením %1"
 
-#: rc_configuration.cc:123
+#: rc_configuration.cc:124
 msgid "%1: cannot read configuration file \"%2\""
 msgstr "%1: Nelze přečíst soubor s nastavením\"%2\""
 
-#: rc_configuration.cc:128
+#: rc_configuration.cc:129
 msgid "%1: user configuration file \"%2\" not loaded successfully."
 msgstr "%1: Soubor s uživatelovým nastavením \"%2\" se nepodařilo nahrát."
 
-#: rc_configuration.cc:132
+#: rc_configuration.cc:133
 msgid "your %1 configuration file is empty. This is not normal."
 msgstr "Váš soubor s nastavením %1 je prázdný. To není obvyklé."
 
-#: rc_configuration.cc:149
+#: rc_configuration.cc:150
 msgid "Config file %1 not saved"
 msgstr "Soubor s nastavením %1 nebyl uložen"
 
-#: recent_sessions.cc:54
+#: recent_sessions.cc:55
 msgid "cannot open recent session file %1 (%2)"
 msgstr "Nelze otevřít naposledy otevřený soubor sezení %1 (%2)"
 
-#: region_factory.cc:78 region_factory.cc:120 region_factory.cc:161
-#: region_factory.cc:203
+#: recent_sessions.cc:68 recent_sessions.cc:126
+msgid "Error reading recent session file %1 (%2)"
+msgstr ""
+
+#: recent_sessions.cc:113
+msgid "Cannot open recent template file %1 (%2)"
+msgstr ""
+
+#: recent_sessions.cc:176
+msgid "Error writing recent sessions file %1 (%2)"
+msgstr ""
+
+#: recent_sessions.cc:211
+msgid "Error writing saved template file %1 (%2)"
+msgstr ""
+
+#: region_factory.cc:78 region_factory.cc:121 region_factory.cc:162
+#: region_factory.cc:204
 msgid ""
 "programming error: RegionFactory::create() called with unknown Region type"
 msgstr ""
 "Chyba v programování: RegionFactory::create() zavoláno s neznámým typem "
 "oblasti"
 
-#: region_factory.cc:565
+#: region_factory.cc:566
 msgid "%1 compound-%2 (%3)"
 msgstr "%1 spojen-%2 (%3)"
 
-#: region_factory.cc:567
+#: region_factory.cc:568
 msgid "%1 compound-%2.1 (%3)"
 msgstr "%1 spojen-%2.1 (%3)"
 
-#: region_factory.cc:629
+#: region_factory.cc:630
 msgid "cannot create new name for region \"%1\""
 msgstr "Nelze vytvořit nový název pro oblast \"%1\""
 
-#: resampled_source.cc:102
+#: resampled_source.cc:107
 msgid "Import: %1"
 msgstr "Zavedení: %1"
 
-#: resampled_source.cc:132 srcfilesource.cc:75
+#: resampled_source.cc:136 srcfilesource.cc:75
 msgid "Import: src_new() failed : %1"
 msgstr "Zavedení: Chyba v src_new() : %1"
 
-#: return.cc:41
+#: return.cc:42
 msgid "return %1"
 msgstr "Vrácená hodnota: %1"
 
-#: route.cc:1218 route.cc:2701
+#: route.cc:862 route.cc:2797
 msgid "unknown Processor type \"%1\"; ignored"
 msgstr "Neznámý typ procesoru \"%1\"; přehlíží se"
 
-#: route.cc:1240
+#: route.cc:884
 msgid "processor could not be created. Ignored."
 msgstr "Procesor se nepodařilo vytvořit. Přehlíží se."
 
-#: route.cc:2126 route.cc:2355
+#: route.cc:2338 route.cc:2504
 msgid "Bad node sent to Route::set_state() [%1]"
 msgstr "Špatný uzel poslán Route::set_state() [%1]"
 
-#: route.cc:2186
+#: route.cc:2395
 msgid "Pannable state found for route (%1) without a panner!"
 msgstr ""
 "Nalezen stav cíle vyvážení pro cestu (%1), aniž by bylo nalezeno vyvážení!"
 
-#: route.cc:2260 route.cc:2264 route.cc:2469 route.cc:2473
-msgid "badly formed order key string in state file! [%1] ... ignored."
+#: route.cc:3270
+msgid "Invalid Solo-Isolate propagation: from:%1 new:%2 - old:%3 = delta:%4"
+msgstr ""
+
+#: route.cc:4396
+msgid "Amp/Fader on Route '%1' went AWOL. Re-added."
+msgstr ""
+
+#: route.cc:4994
+msgid "lo"
+msgstr ""
+
+#: route.cc:4996
+msgid "mid"
+msgstr ""
+
+#: route.cc:4998
+msgid "hi"
+msgstr ""
+
+#: route.cc:5105
+msgid "Leveler"
+msgstr ""
+
+#: route.cc:5107
+msgid "Compressor"
+msgstr ""
+
+#: route.cc:5109 route.cc:5111
+msgid "Limiter"
+msgstr ""
+
+#: route.cc:5111
+msgid "Sidechain"
+msgstr ""
+
+#: route.cc:5114 route.cc:5116 route.cc:5133 route.cc:5135
+msgid "???"
 msgstr ""
-"Špatně utvořený řetězec znaků pro klíč pořadí roztřídění v souboru sezení! "
-"[%1] ... Přehlíží se."
 
-#: route.cc:2479
-msgid "Converting deprecated order key for %1 using Editor order %2"
+#: route.cc:5126
+msgid "Attk"
 msgstr ""
 
-#: route_group.cc:459
+#: route.cc:5128
+msgid "Ratio"
+msgstr ""
+
+#: route.cc:5131
+msgid "Rels"
+msgstr ""
+
+#: route_group.cc:507
 msgid "You cannot subgroup MIDI tracks at this time"
 msgstr "Stopy MIDI nelze nyní sdružit do podskupin"
 
+#: route_group.cc:514
+msgid ""
+"You cannot subgroup tracks with different number of outputs at this time."
+msgstr ""
+
 #: rb_effect.cc:229 rb_effect.cc:269
 msgid "tempoize: error reading data from %1 at %2 (wanted %3, got %4)"
 msgstr "tempoize: Chyba při čtení dat z %1 v %2 (žádáno %3, obdrženo %4)"
@@ -1657,106 +2177,126 @@ msgstr "tempoize: Chyba při čtení dat z %1 v %2 (žádáno %3, obdrženo %4)"
 msgid "error writing tempo-adjusted data to %1"
 msgstr "Chyba při zápisu dat s upraveným tempem do %1"
 
-#: send.cc:61
+#: send.cc:62
 msgid "aux %1"
 msgstr "Pomocné (Aux) %1"
 
-#: send.cc:65
+#: send.cc:66
 msgid "send %1"
 msgstr "Poslání (send) %1"
 
-#: send.cc:67
+#: send.cc:68
 msgid "programming error: send created using role %1"
 msgstr "Chyba v programování: Poslání vytvořeno pomocí role %1"
 
-#: session.cc:357
+#: session.cc:348 session.cc:403
+msgid "Cannot connect to audio/midi engine"
+msgstr ""
+
+#: session.cc:358
+msgid "Session initialization failed"
+msgstr ""
+
+#: session.cc:374
+msgid "Failed to load template/snapshot state"
+msgstr ""
+
+#: session.cc:385
+msgid "Failed to load state"
+msgstr ""
+
+#: session.cc:409
+msgid "Cannot configure audio/midi engine with session parameters"
+msgstr ""
+
+#: session.cc:433
 msgid "Connect to engine"
 msgstr "Spojit se strojem"
 
-#: session.cc:362
+#: session.cc:484
 msgid "Session loading complete"
 msgstr "Nahrání sezení dokončeno"
 
-#: session.cc:434
+#: session.cc:575
 msgid "Set up LTC"
 msgstr ""
 
-#: session.cc:436
+#: session.cc:577
 msgid "Set up Click"
 msgstr ""
 
-#: session.cc:438
+#: session.cc:579
 msgid "Set up standard connections"
 msgstr "Nastavit standardní spojení"
 
-#: session.cc:664
+#: session.cc:888
 msgid "could not setup Click I/O"
 msgstr "Nepodařilo se nastavit vstup/výstup metronomu"
 
-#: session.cc:727
+#: session.cc:951
 #, c-format
 msgid "out %s"
 msgstr ""
 
-#: session.cc:729
+#: session.cc:953
 #, c-format
 msgid "out %<PRIu32>"
 msgstr "Výstup %<PRIu32>"
 
-#: session.cc:744
+#: session.cc:968
 #, c-format
 msgid "out %<PRIu32>+%<PRIu32>"
 msgstr "Výstup %<PRIu32>+%<PRIu32>"
 
-#: session.cc:761
+#: session.cc:985
 #, c-format
 msgid "in %s"
 msgstr ""
 
-#: session.cc:763
+#: session.cc:987
 #, c-format
 msgid "in %<PRIu32>"
 msgstr "Vstup %<PRIu32>"
 
-#: session.cc:778
+#: session.cc:1002
 #, c-format
 msgid "in %<PRIu32>+%<PRIu32>"
 msgstr "Vstup %<PRIu32>+%<PRIu32>"
 
-#: session.cc:852
+#: session.cc:1082
 msgid "cannot connect master output %1 to %2"
 msgstr "Nelze spojit hlavní výstup %1 s %2"
 
-#: session.cc:921
-msgid "Monitor"
+#: session.cc:1170
+msgid "Cannot create monitor section. 'Monitor' Port name is not unique."
 msgstr ""
 
-#: session.cc:966
+#: session.cc:1204 session.cc:1335
 msgid "cannot connect control input %1 to %2"
 msgstr "Nelze spojit vstup ovládání %1 s %2"
 
-#: session.cc:986
+#: session.cc:1224 session.cc:1354
 msgid "The preferred I/O for the monitor bus (%1) cannot be found"
 msgstr "Upřednostňovaný vstup/výstup pro sledovací sběrnici (%1) nelze najít"
 
-#: session.cc:1017
+#: session.cc:1255 session.cc:1385
 msgid "cannot connect control output %1 to %2"
 msgstr "Nelze spojit výstup ovládání %1 s %2"
 
-#: session.cc:1085
+#: session.cc:1443
 msgid "cannot create Auditioner: no auditioning of regions possible"
 msgstr "Nelze vytvořit poslechový systém: Žádný poslech oblastí není možný"
 
-#: session.cc:1270
+#: session.cc:1644
 msgid "Session: you can't use that location for auto punch (start <= end)"
 msgstr ""
 "Sezení: Tuto polohu nelze pro automatický přepis použít (Začátek <= Konec) "
 
-#: session.cc:1297
+#: session.cc:1671
 msgid "Session: you can't use that location for session start/end)"
 msgstr ""
 
-#: session.cc:1329
+#: session.cc:1703
 msgid ""
 "You cannot use this location for auto-loop because it has zero or negative "
 "length"
@@ -1764,19 +2304,31 @@ msgstr ""
 "Tuto polohu nelze pro automatickou smyčku použít, protože nemá žádnou, nebo "
 "má zápornou délku"
 
-#: session.cc:1497
+#: session.cc:1886
 msgid "programming error: session range removed!"
 msgstr ""
 
-#: session.cc:1751
+#: session.cc:2158
 msgid "feedback loop setup between %1 and %2"
 msgstr "Smyčka zpětné vazby rozpoznána mezi %1 a %2"
 
-#: session.cc:2047
+#: session.cc:2419
+msgid "Track "
+msgstr ""
+
+#: session.cc:2421
+msgid "Audio "
+msgstr ""
+
+#: session.cc:2426
+msgid "MIDI "
+msgstr ""
+
+#: session.cc:2500
 msgid "Session: could not create new midi track."
 msgstr "Sezení: Nepodařilo se vytvořit novou stopu MIDI"
 
-#: session.cc:2053
+#: session.cc:2506
 msgid ""
 "No more JACK ports are available. You will need to stop %1 and restart JACK "
 "with more ports if you need this many tracks."
@@ -1784,83 +2336,91 @@ msgstr ""
 "Nejsou dostupné další přípojky JACK. Pokud potřebujete tolik stop, musíte "
 "zastavit %1 a spustit JACK znovu s více přípojkami."
 
-#: session.cc:2239 session.cc:2242
-msgid "Audio"
-msgstr "Zvuk"
+#: session.cc:2547 session.cc:2550
+msgid "Midi Bus"
+msgstr ""
+
+#: session.cc:2572
+msgid "cannot configure new midi bus input"
+msgstr ""
 
-#: session.cc:2266 session.cc:2274 session.cc:2352 session.cc:2360
+#: session.cc:2578
+msgid "cannot configure new midi bus output"
+msgstr ""
+
+#: session.cc:2592 session.cc:3137
+msgid "Session: could not create new audio route."
+msgstr "Sezení: Nepodařilo se vytvořit novou zvukovou cestu"
+
+#: session.cc:3022 session.cc:3030 session.cc:3113 session.cc:3121
 msgid "cannot configure %1 in/%2 out configuration for new audio track"
 msgstr "Nelze nastavit %1 nastavení vstup/%2 výstup pro novou zvukovou stopu"
 
-#: session.cc:2297
+#: session.cc:3050
 msgid "Session: could not create new audio track."
 msgstr "Sezení: Nepodařilo se vytvořit novou zvukovou stopu"
 
-#: session.cc:2330 session.cc:2333
+#: session.cc:3088 session.cc:3091
 msgid "Bus"
 msgstr "Sběrnice"
 
-#: session.cc:2383
-msgid "Session: could not create new audio route."
-msgstr "Sezení: Nepodařilo se vytvořit novou zvukovou cestu"
-
-#: session.cc:2443 session.cc:2453
+#: session.cc:3207 session.cc:3217
 msgid "Session: UINT_MAX routes? impossible!"
 msgstr "Sezení: Cesty UINT_MAX? Nemožné!"
 
-#: session.cc:2475
+#: session.cc:3293
 msgid "Session: cannot create track/bus from template description"
 msgstr "Sezení: Nelze vytvořit stopu/sběrnici z popisu předlohy"
 
-#: session.cc:2501
+#: session.cc:3331
 msgid "Session: could not create new route from template"
 msgstr "Sezení: Nepodařilo se vytvořit novou cestu z předlohy"
 
-#: session.cc:2531
+#: session.cc:3365
 msgid "Adding new tracks/busses failed"
 msgstr "Chyba při přidávání nové stopy/sběrnice"
 
-#: session.cc:3671
+#: session.cc:4784
 msgid "Merging embedded file %1: name collision AND md5 hash collision!"
 msgstr ""
 
-#: session.cc:3801 session.cc:3874
+#: session.cc:4914 session.cc:4987
 msgid "There are already %1 recordings for %2, which I consider too many."
 msgstr "Již je %1 nahrávek pro %2, což je příliš mnoho."
 
-#: session.cc:4316
+#: session.cc:5663
 msgid "send ID %1 appears to be in use already"
 msgstr "Zdá se, že ID poslání (send) %1, se již používá"
 
-#: session.cc:4328
+#: session.cc:5675
 msgid "aux send ID %1 appears to be in use already"
 msgstr "Zdá se, že ID pomocného-poslání (aux-send) %1, se již používá"
 
-#: session.cc:4340
+#: session.cc:5687
 msgid "return ID %1 appears to be in use already"
 msgstr "Zdá se, že ID vrácení (return) %1, se již používá"
 
-#: session.cc:4352
+#: session.cc:5699
 msgid "insert ID %1 appears to be in use already"
 msgstr "Zdá se, že ID vložení (insert) %1, se již používá"
 
-#: session.cc:4477
+#: session.cc:5825
 msgid "Cannot write a range where end <= start (e.g. %1 <= %2)"
 msgstr "Nelze zapsat oblast s Konec <= Začátek (např. %1 <= %2)"
 
-#: session.cc:4486
+#: session.cc:5834
 msgid "Cannot write a range with no data."
 msgstr ""
 
-#: session.cc:4528
+#: session.cc:5876
 msgid "cannot create new file \"%1\" for %2"
 msgstr ""
 
-#: session_click.cc:161
+#: session_click.cc:162
 msgid "cannot open click soundfile %1 (%2)"
 msgstr "Nelze otevřít zvukový soubor metronomu %1 (%2)"
 
-#: session_click.cc:174
+#: session_click.cc:175
 msgid "cannot read data from click soundfile"
 msgstr "Nelze přečíst data ze zvukového souboru metronomu"
 
@@ -1903,23 +2463,36 @@ msgstr ""
 msgid "Could not save session options"
 msgstr ""
 
-#: session_directory.cc:59
+#: session_directory.cc:65
 msgid "Cannot create Session directory at path %1 Error: %2"
 msgstr "Nelze vytvořit adresář se sezením v cestě %1. Chyba: %2"
 
-#: session_directory.cc:76
+#: session_directory.cc:82
 msgid "Session subdirectory does not exist at path %1"
 msgstr "Adresář se sezením v cestě %1 neexistuje"
 
-#: session_events.cc:234
+#: session_directory.cc:161
+msgid ""
+"session-dir and session-name mismatch. Please use 'Menu > Session > Rename' "
+"in the future to rename sessions."
+msgstr ""
+
+#: session_directory.cc:167
+msgid ""
+"The session's interchange dir is tainted.\n"
+"There is more than one folder in '%1'.\n"
+"Please remove extra subdirs to reduce possible filename ambiguties."
+msgstr ""
+
+#: session_events.cc:229
 msgid "Session: cannot have two events of type %1 at the same frame (%2)."
 msgstr "Sezení: Není možné mít ve stejném snímku (%2) dvě události typu %1."
 
-#: session_export.cc:125
+#: session_export.cc:152
 msgid "%1: cannot seek to %2 for export"
 msgstr "%1: Polohu souboru %2 nelze vyhledat pro vyvedení"
 
-#: session_export.cc:182
+#: session_export.cc:216
 msgid "Export ended unexpectedly: %1"
 msgstr "Vyvedení skončilo neočekávaně: %1"
 
@@ -1931,100 +2504,112 @@ msgstr ""
 "Kodér LTC: Neplatná rychlost snímkování - Kódování LTC je pro zbývající část "
 "tohoto sezení zakázáno."
 
-#: session_midi.cc:520
+#: session_midi.cc:570
 msgid "Session: cannot send quarter-frame MTC message (%1)"
 msgstr "Sezení: Nelze poslat quarter-frame MTC (%1)"
 
-#: session_playlists.cc:378 session_playlists.cc:397
+#: session_playlists.cc:405 session_playlists.cc:424
 msgid "Session: cannot create Playlist from XML description."
 msgstr "Sezení: Nelze vytvořit seznam skladeb z popisu XML"
 
-#: session_process.cc:136
+#: session_process.cc:159
 msgid "Session: error in no roll for %1"
 msgstr "Sezení: Chyba v no_roll pro %1"
 
-#: session_process.cc:1174
+#: session_process.cc:1202
 msgid "Programming error: illegal event type in process_event (%1)"
 msgstr "Chyba v programování: Neplatný typ události v process_event (%1)"
 
-#: session_state.cc:179
+#: session_state.cc:194
 msgid "solo cut control (dB)"
 msgstr "Nastavení Solo Cut (dB)"
 
-#: session_state.cc:203
+#: session_state.cc:216
 msgid "Set block size and sample rate"
 msgstr "Nastavit velikost bloku a vzorkovací kmitočet"
 
-#: session_state.cc:208
+#: session_state.cc:221
 msgid "Using configuration"
 msgstr "Používané nastavení"
 
-#: session_state.cc:331
+#: session_state.cc:348
 msgid "Reset Remote Controls"
 msgstr "Nastavit dálkové ovládání znovu"
 
-#: session_state.cc:423
+#: session_state.cc:377 session_state.cc:409
+msgid "Filling playback buffers"
+msgstr ""
+
+#: session_state.cc:475
 msgid "Session: cannot create session peakfile folder \"%1\" (%2)"
 msgstr "Sezení: Nelze vytvořit složku Peakfile \"%1\" (%2)"
 
-#: session_state.cc:430
+#: session_state.cc:482
 msgid "Session: cannot create session sounds dir \"%1\" (%2)"
 msgstr "Sezení: Nelze vytvořit adresář sezení pro zvuková data \"%1\" (%2)"
 
-#: session_state.cc:437
+#: session_state.cc:489
 msgid "Session: cannot create session midi dir \"%1\" (%2)"
 msgstr "Sezení: Nelze vytvořit adresář sezení pro MIDI \"%1\" (%2)"
 
-#: session_state.cc:444
+#: session_state.cc:496
 msgid "Session: cannot create session dead sounds folder \"%1\" (%2)"
 msgstr ""
 "Sezení: Nelze vytvořit odpadkový koš sezení pro zahozený zvuk \"%1\" (%2)"
 
-#: session_state.cc:451
+#: session_state.cc:503
 msgid "Session: cannot create session export folder \"%1\" (%2)"
 msgstr "Sezení: Nelze vytvořit složku sezení pro vyvedené soubory \"%1\" (%2)"
 
-#: session_state.cc:458
+#: session_state.cc:510
 msgid "Session: cannot create session analysis folder \"%1\" (%2)"
 msgstr "Sezení: Nelze vytvořit složku sezení pro data rozboru \"%1\" (%2)"
 
-#: session_state.cc:465
+#: session_state.cc:517
 msgid "Session: cannot create session plugins folder \"%1\" (%2)"
 msgstr "Sezení: Nelze vytvořit složku sezení pro přídavné moduly \"%1\" (%2)"
 
-#: session_state.cc:472
+#: session_state.cc:524
 msgid "Session: cannot create session externals folder \"%1\" (%2)"
 msgstr "Sezení: Nelze vytvořit složku sezení pro vnější \"%1\" (%2)"
 
-#: session_state.cc:486
+#: session_state.cc:538
 msgid "Session: cannot create session folder \"%1\" (%2)"
 msgstr "Sezení: Nelze vytvořit složku sezení \"%1\" (%2)"
 
-#: session_state.cc:520
+#: session_state.cc:569
+msgid "Error reading session template file %1 (%2)"
+msgstr ""
+
+#: session_state.cc:584
+msgid "Error writing session template file %1 (%2)"
+msgstr ""
+
+#: session_state.cc:601
 msgid "Could not open %1 for writing session template"
 msgstr "Nepodařilo se otevřít %1 pro zápis předlohy sezení"
 
-#: session_state.cc:526
+#: session_state.cc:608
 msgid "Could not open session template %1 for reading"
 msgstr "Nepodařilo se otevřít předlohu sezení %1 pro čtení"
 
-#: session_state.cc:545
-msgid "Master"
+#: session_state.cc:626
+msgid "Loop"
 msgstr ""
 
-#: session_state.cc:606
+#: session_state.cc:707
 msgid "Could not remove pending capture state at path \"%1\" (%2)"
 msgstr "Nepodařilo se odstranit předběžný stav nahrávání v cestě \"%1\" (%2)"
 
-#: session_state.cc:630
+#: session_state.cc:731
 msgid "could not rename snapshot %1 to %2 (%3)"
 msgstr "Nepodařilo se přejmenovat snímek obrazovky %1 na %2 (%3)"
 
-#: session_state.cc:658
+#: session_state.cc:759
 msgid "Could not remove session file at path \"%1\" (%2)"
 msgstr "Nepodařilo se odstranit soubor se sezením v cestě \"%1\" (%2)"
 
-#: session_state.cc:685
+#: session_state.cc:788
 msgid ""
 "the %1 audio engine is not connected and state saving would lose all I/O "
 "connections. Session not saved"
@@ -2032,142 +2617,142 @@ msgstr ""
 "Zvukový stroj %1 není spojen, a při ukládání stavu by došlo ke ztrátě všech "
 "spojení vstup/výstup. Sezení neuloženo"
 
-#: session_state.cc:736
+#: session_state.cc:856
 msgid "state could not be saved to %1"
 msgstr "Stav se do %1 uložit nepodařilo"
 
-#: session_state.cc:738 session_state.cc:749
+#: session_state.cc:858 session_state.cc:871
 msgid "Could not remove temporary session file at path \"%1\" (%2)"
 msgstr "Nepodařilo se odstranit dočasný soubor se sezením v cestě \"%1\" (%2)"
 
-#: session_state.cc:746
+#: session_state.cc:868
 msgid "could not rename temporary session file %1 to %2 (%3)"
 msgstr ""
 
-#: session_state.cc:814
+#: session_state.cc:942
 msgid "%1: session file \"%2\" doesn't exist!"
 msgstr "%1: Soubor se sezením  \"%2\" neexistuje!"
 
-#: session_state.cc:826
+#: session_state.cc:954
 msgid "Could not understand session file %1"
 msgstr "Nepodařilo se porozumět souboru se sezením\"%1\""
 
-#: session_state.cc:835
+#: session_state.cc:963
 msgid "Session file %1 is not a session"
 msgstr "Soubor se sezením %1 není sezením"
 
-#: session_state.cc:1147
+#: session_state.cc:1332
 msgid "programming error: Session: incorrect XML node sent to set_state()"
 msgstr "Chyba v programování: Sezení: Nesprávný uzel XML poslán set_state()"
 
-#: session_state.cc:1201
+#: session_state.cc:1410
 msgid "Session: XML state has no options section"
 msgstr "Sezení: XML nemá žádnou část \"options\""
 
-#: session_state.cc:1206
+#: session_state.cc:1415
 msgid "Session: XML state has no metadata section"
 msgstr "Sezení: XML nemá žádnou část \"metadata\""
 
-#: session_state.cc:1217
+#: session_state.cc:1426
 msgid "Session: XML state has no sources section"
 msgstr "Sezení: XML nemá žádnou část \"sources\""
 
-#: session_state.cc:1224
+#: session_state.cc:1433
 msgid "Session: XML state has no Tempo Map section"
 msgstr "Sezení: XML nemá žádnou část \"Tempo Map\""
 
-#: session_state.cc:1231
+#: session_state.cc:1440
 msgid "Session: XML state has no locations section"
 msgstr "Sezení: XML nemá žádnou část \"locations\""
 
-#: session_state.cc:1244
+#: session_state.cc:1453
 msgid "Session: XML state has no Regions section"
 msgstr "Sezení: XML nemá žádnou část \"Regions\""
 
-#: session_state.cc:1251
+#: session_state.cc:1460
 msgid "Session: XML state has no playlists section"
 msgstr "Sezení: XML nemá žádnou část \"playlists\""
 
-#: session_state.cc:1271
+#: session_state.cc:1480
 msgid "Session: XML state has no bundles section"
 msgstr "Sezení: XML nemá žádnou část \"bundles\""
 
-#: session_state.cc:1283
+#: session_state.cc:1492
 msgid "Session: XML state has no diskstreams section"
 msgstr "Sezení: XML nemá žádnou část \"diskstreams\""
 
-#: session_state.cc:1291
+#: session_state.cc:1504
 msgid "Session: XML state has no routes section"
 msgstr "Sezení: XML nemá žádnou část \"routes\""
 
-#: session_state.cc:1303
+#: session_state.cc:1520
 msgid "Session: XML state has no route groups section"
 msgstr "Sezení: XML nemá žádnou část \"route groups\""
 
-#: session_state.cc:1312
+#: session_state.cc:1529
 msgid "Session: XML state has no edit groups section"
 msgstr "Sezení: XML nemá žádnou část \"edit groups\""
 
-#: session_state.cc:1319
+#: session_state.cc:1536
 msgid "Session: XML state has no mix groups section"
 msgstr "Sezení: XML nemá žádnou část \"mix groups\""
 
-#: session_state.cc:1327
+#: session_state.cc:1544
 msgid "Session: XML state has no click section"
 msgstr "Sezení: XML nemá žádnou část \"click\""
 
-#: session_state.cc:1373
+#: session_state.cc:1606
 msgid "Session: cannot create Route from XML description."
 msgstr "Sezení: Nelze vytvořit cestu z popisu XML"
 
-#: session_state.cc:1377
+#: session_state.cc:1610
 msgid "Loaded track/bus %1"
 msgstr "Byla nahrána stopa/sběrnice %1"
 
-#: session_state.cc:1382
+#: session_state.cc:1615
 msgid "Tracks/busses loaded;  Adding to Session"
 msgstr ""
 
-#: session_state.cc:1386
+#: session_state.cc:1619
 msgid "Finished adding tracks/busses"
 msgstr ""
 
-#: session_state.cc:1485
+#: session_state.cc:1709
 msgid "Could not find diskstream for route"
 msgstr "Nepodařilo se najít Diskstream pro cestu"
 
-#: session_state.cc:1545
+#: session_state.cc:1760
 msgid "Session: cannot create Region from XML description."
 msgstr "Sezení: Nelze vytvořit oblast z popisu XML"
 
-#: session_state.cc:1549
+#: session_state.cc:1764
 msgid "Can not load state for region '%1'"
 msgstr "Nelze nahrát stav pro oblast '%1'"
 
-#: session_state.cc:1585
+#: session_state.cc:1800
 msgid "Regions in compound description not found (ID's %1 and %2): ignored"
 msgstr "Oblasti ve spojeném popisu nenalezeny (ID %1 a %2): přehlíží se"
 
-#: session_state.cc:1613
+#: session_state.cc:1828
 msgid "Nested source has no ID info in session file! (ignored)"
 msgstr ""
 "Vnořený zdroj nemá v souboru se sezením žádné informace ID! (přehlíží se)"
 
-#: session_state.cc:1625
+#: session_state.cc:1840
 msgid "Cannot reconstruct nested source for region %1"
 msgstr "Nelze obnovit vnořený zdroj pro oblast %1"
 
-#: session_state.cc:1687
+#: session_state.cc:1902
 msgid "Session: XMLNode describing a AudioRegion is incomplete (no source)"
 msgstr "Sezení: Uzel XML k popisu zvukové oblasti je neúplný (chybí zdroj)"
 
-#: session_state.cc:1695 session_state.cc:1716 session_state.cc:1736
+#: session_state.cc:1910 session_state.cc:1931 session_state.cc:1951
 msgid ""
 "Session: XMLNode describing a AudioRegion references an unknown source id =%1"
 msgstr ""
 "Sezení: Uzel XML k popisu zvukové oblasti odkazuje na ID neznámého zdroje =%1"
 
-#: session_state.cc:1701 session_state.cc:1722 session_state.cc:1742
+#: session_state.cc:1916 session_state.cc:1937 session_state.cc:1957
 msgid ""
 "Session: XMLNode describing a AudioRegion references a non-audio source id ="
 "%1"
@@ -2175,7 +2760,7 @@ msgstr ""
 "Sezení: Uzel XML k popisu zvukové oblasti odkazuje na ID nezvukového zdroje ="
 "%1"
 
-#: session_state.cc:1765
+#: session_state.cc:1980
 msgid ""
 "Session: XMLNode describing an AudioRegion is missing some master sources; "
 "ignored"
@@ -2183,139 +2768,174 @@ msgstr ""
 "Sezení: Uzlu XML k popisu zvukové oblasti chybí některé hlavní zdroje; "
 "přehlíží se"
 
-#: session_state.cc:1799
+#: session_state.cc:2014
 msgid "Session: XMLNode describing a MidiRegion is incomplete (no source)"
 msgstr "Sezení: Uzel XML k popisu oblasti MIDI je neúplný (chybí zdroj)"
 
-#: session_state.cc:1807
+#: session_state.cc:2022
 msgid ""
 "Session: XMLNode describing a MidiRegion references an unknown source id =%1"
 msgstr ""
 "Sezení: Uzel XML k popisu oblasti MIDI odkazuje na ID neznámého zdroje =%1"
 
-#: session_state.cc:1813
+#: session_state.cc:2028
 msgid ""
 "Session: XMLNode describing a MidiRegion references a non-midi source id =%1"
 msgstr ""
 "Sezení: Uzel XML k popisu oblasti MIDI odkazuje na ID ne-MIDI zdroje =%1"
 
-#: session_state.cc:1872
+#: session_state.cc:2101
 msgid "Session: cannot create Source from XML description."
 msgstr "Sezení: Nelze vytvořit zdroj z popisu XML"
 
-#: session_state.cc:1880
+#: session_state.cc:2109
 msgid ""
 "A external MIDI file is missing. %1 cannot currently recover from missing "
 "external MIDI files"
 msgstr ""
 
-#: session_state.cc:1962
+#: session_state.cc:2191
 msgid "Found a sound file that cannot be used by %1. Talk to the programmers."
 msgstr ""
 
-#: session_state.cc:1979
+#: session_state.cc:2212
 msgid "Could not create templates directory \"%1\" (%2)"
 msgstr "Nepodařilo se vytvořit adresář s předlohami \"%1\" (%2)"
 
-#: session_state.cc:1992
+#: session_state.cc:2224
 msgid "Template \"%1\" already exists - new version not created"
 msgstr "Předloha \"%1\" již existuje - nová verze nebyla vytvořena"
 
-#: session_state.cc:1998
+#: session_state.cc:2230
 msgid "Could not create directory for Session template\"%1\" (%2)"
 msgstr "Nepodařilo se vytvořit adresář pro předlohu sezení \"%1\" (%2)"
 
-#: session_state.cc:2008
+#: session_state.cc:2259
 msgid "template not saved"
 msgstr "Předloha neuložena"
 
-#: session_state.cc:2018
-msgid "Could not create directory for Session template plugin state\"%1\" (%2)"
-msgstr ""
-"Nepodařilo se vytvořit adresář pro stav přídavného modulu předlohy sezení "
-"\"%1\" (%2)"
-
-#: session_state.cc:2261
+#: session_state.cc:2501
 msgid "Unknown node \"%1\" found in Bundles list from session file"
 msgstr "Nalezen neznámý uzel \"%1\" v seznamu svazků souboru sezení"
 
-#: session_state.cc:2834
+#: session_state.cc:2969
+msgid "Cannot cleanup peak-files for read-only session."
+msgstr ""
+
+#: session_state.cc:2973
+msgid "Cannot cleanup peak-files while recording"
+msgstr ""
+
+#: session_state.cc:2996
+msgid ""
+"Timeout waiting for peak-file creation to terminate before cleanup, please "
+"try again later."
+msgstr ""
+
+#: session_state.cc:3261
 msgid "Session: cannot create dead file folder \"%1\" (%2)"
 msgstr "Sezení: Nelze vytvořit odpadkový koš pro zahozen soubory \"%1\" (%2)"
 
-#: session_state.cc:2873
+#: session_state.cc:3296
 msgid "cannot rename unused file source from %1 to %2 (%3)"
 msgstr "Nelze přejmenovat nepoužívaný souborový zdroj z %1 na %2 (%3)"
 
-#: session_state.cc:2891
+#: session_state.cc:3312
 msgid "cannot remove peakfile %1 for %2 (%3)"
 msgstr "Nelze odstranit vrcholový soubor %1 pro %2 (%3)"
 
-#: session_state.cc:3204
+#: session_state.cc:3633
 msgid "could not backup old history file, current history not saved"
 msgstr ""
 "Nepodařilo se vytvořit zálohu starého souboru se seznamem činností, nynější "
 "historie neuložena"
 
-#: session_state.cc:3213
+#: session_state.cc:3642
 msgid "history could not be saved to %1"
 msgstr "Nepodařilo se uložit seznam činností do %1"
 
-#: session_state.cc:3216
+#: session_state.cc:3645
 msgid "Could not remove history file at path \"%1\" (%2)"
 msgstr ""
 "Nepodařilo se odstranit soubor se seznamem činností v cestě \"%1\" (%2)"
 
-#: session_state.cc:3220
+#: session_state.cc:3649
 msgid "could not restore history file from backup %1 (%2)"
 msgstr "Nepodařilo se obnovit soubor se seznamem činností ze zálohy %1 (%2)"
 
-#: session_state.cc:3245
+#: session_state.cc:3674
 msgid "%1: no history file \"%2\" for this session."
 msgstr "%1: Žádný soubor se seznamem činností \"%2\" pro toto sezení."
 
-#: session_state.cc:3251
+#: session_state.cc:3680
 msgid "Could not understand session history file \"%1\""
 msgstr "Nepodařilo se porozumět souboru se seznamem činností sezení \"%1\""
 
-#: session_state.cc:3293
+#: session_state.cc:3722
 msgid "Failed to downcast MidiSource for NoteDiffCommand"
 msgstr "Nepodařilo se najít MidiSource pro NoteDiffCommand"
 
-#: session_state.cc:3304
+#: session_state.cc:3733
 msgid "Failed to downcast MidiSource for SysExDiffCommand"
 msgstr "Nepodařilo se najít MidiSource pro SysExDiffCommand"
 
-#: session_state.cc:3315
+#: session_state.cc:3744
 msgid "Failed to downcast MidiSource for PatchChangeDiffCommand"
 msgstr "Nepodařilo se najít MidiSource pro PatchChangeDiffCommand"
 
-#: session_state.cc:3323
+#: session_state.cc:3752
 msgid "Couldn't figure out how to make a Command out of a %1 XMLNode."
 msgstr "Nepodařilo se rozpoznat žádný příkaz v uzlu XML \"%1\"."
 
-#: session_state.cc:3559
+#: session_state.cc:3990
 msgid "Session: unknown diskstream type in XML"
 msgstr "Sezení: Neznámý typ Diskstream  v XML"
 
-#: session_state.cc:3564
+#: session_state.cc:3995
 msgid "Session: could not load diskstream via XML state"
 msgstr "Sezení: Nepodařilo se nahrát Diskstream pomocí stavu XML"
 
-#: session_state.cc:3688 session_state.cc:3716 session_state.cc:3729
-#: session_state.cc:3744
+#: session_state.cc:4092
+msgid "Cannot rename read-only session."
+msgstr ""
+
+#: session_state.cc:4096
+msgid "Cannot rename session while recording"
+msgstr ""
+
+#: session_state.cc:4181 session_state.cc:4182 session_state.cc:4224
+#: session_state.cc:4228
 msgid "renaming %s as %2 failed (%3)"
 msgstr ""
 
+#: session_state.cc:4244 session_state.cc:4245 session_state.cc:4259
+#: session_state.cc:4260
+msgid "renaming %1 as %2 failed (%3)"
+msgstr ""
+
+#: session_state.cc:4571
+msgid "Cannot create new session folder %1"
+msgstr ""
+
+#: session_state.cc:4633 session_state.cc:4708
+msgid ""
+"\n"
+"copying \"%1\" failed !"
+msgstr ""
+
+#: session_state.cc:4906
+msgid "unknown reason"
+msgstr ""
+
 #: session_time.cc:214
 msgid "Unknown transport state %1 in sync callback"
 msgstr ""
 
-#: session_transport.cc:171
+#: session_transport.cc:177
 msgid "Cannot loop - no loop range defined"
 msgstr "Nelze přehrávat ve smyčce - Nestanovena žádná oblast smyčky"
 
-#: session_transport.cc:833
+#: session_transport.cc:968
 msgid ""
 "Seamless looping cannot be supported while %1 is using JACK transport.\n"
 "Recommend changing the configured options"
@@ -2323,11 +2943,11 @@ msgstr ""
 "Souvislé přehrávání ve smyčce není možné, dokud %1 používá transport JACK.\n"
 "Doporučuje se změna volby v nastavení"
 
-#: session_transport.cc:915
+#: session_transport.cc:1050
 msgid "Locate called for negative sample position - ignored"
 msgstr ""
 
-#: session_transport.cc:1272
+#: session_transport.cc:1401
 msgid ""
 "Global varispeed cannot be supported while %1 is connected to JACK transport "
 "control"
@@ -2335,28 +2955,32 @@ msgstr ""
 "Celkové ovládání výšky tónu při proměnlivé rychlosti přehrávání není možné, "
 "dokud je %1 spojen s transportem JACK."
 
-#: smf_source.cc:344
+#: slavable.cc:100
+msgid "Master #%1 not found, assignment lost"
+msgstr ""
+
+#: smf_source.cc:350
 msgid "Unable to read event prefix, corrupt MIDI ring"
 msgstr "Nelze přečíst předponu události, poškozen okraj MIDI"
 
-#: smf_source.cc:357
+#: smf_source.cc:363
 msgid "Event has time and size but no body, corrupt MIDI ring"
 msgstr "Událost má čas a velikost, ale nemá tělo, poškozen okraj MIDI"
 
-#: smf_source.cc:363
+#: smf_source.cc:369
 msgid "Event time is before MIDI source position"
 msgstr "Čas události je před polohou zdroje MIDI"
 
-#: smf_source.cc:409
+#: smf_source.cc:417
 msgid ""
 "Skipping event with unordered beat time %1 < %2 (off by %3 beats, %4 ticks)"
 msgstr ""
 
-#: smf_source.cc:453
+#: smf_source.cc:461
 msgid "Skipping event with unordered frame time %1 < %2"
 msgstr ""
 
-#: smf_source.cc:518
+#: smf_source.cc:526
 msgid "cannot open MIDI file %1 for write"
 msgstr "Nelze otevřít soubor MIDI %1 pro zápis"
 
@@ -2373,8 +2997,8 @@ msgid "CAF"
 msgstr "CAF"
 
 #: sndfile_helpers.cc:37
-msgid "W64 (64 bit WAV)"
-msgstr "W64 (64 bit WAV)"
+msgid "W64 (64-bit WAV)"
+msgstr ""
 
 #: sndfile_helpers.cc:38
 msgid "FLAC"
@@ -2417,24 +3041,24 @@ msgid ".raw"
 msgstr ".raw"
 
 #: sndfile_helpers.cc:66
-msgid "Signed 16 bit PCM"
-msgstr "Signed 16 bit PCM"
+msgid "Signed 16-bit PCM"
+msgstr ""
 
 #: sndfile_helpers.cc:67
-msgid "Signed 24 bit PCM"
-msgstr "Signed 24 bit PCM"
+msgid "Signed 24-bit PCM"
+msgstr ""
 
 #: sndfile_helpers.cc:68
-msgid "Signed 32 bit PCM"
-msgstr "Signed 32 bit PCM"
+msgid "Signed 32-bit PCM"
+msgstr ""
 
 #: sndfile_helpers.cc:69
-msgid "Signed 8 bit PCM"
-msgstr "Signed 8 bit PCM"
+msgid "Signed 8-bit PCM"
+msgstr ""
 
 #: sndfile_helpers.cc:70
-msgid "32 bit float"
-msgstr "32 bit float"
+msgid "32-bit float"
+msgstr ""
 
 #: sndfile_helpers.cc:83
 msgid "Little-endian (Intel)"
@@ -2444,18 +3068,26 @@ msgstr "Little-endian (Intel)"
 msgid "Big-endian (PowerPC)"
 msgstr "Big-endian (PowerPC)"
 
-#: sndfilesource.cc:260
+#: sndfilesource.cc:282
+msgid "SndFileSource: cannot open file \"%1\" for %2"
+msgstr ""
+
+#: sndfilesource.cc:300
 msgid "SndFileSource: cannot open file \"%1\" for %2 (%3)"
 msgstr "SndFileSource: Nelze otevřít soubor \"%1\" pro %2 (%3)"
 
-#: sndfilesource.cc:268
+#: sndfilesource.cc:308
 msgid ""
 "SndFileSource: file only contains %1 channels; %2 is invalid as a channel "
 "number"
 msgstr ""
 "SndFileSource: Soubor obsahuje jen %1 kanály, %2 je neplatným počtem kanálů"
 
-#: sndfilesource.cc:322 sndfilesource.cc:655
+#: sndfilesource.cc:323
+msgid "Cannot mark RF64 audio file for automatic downgrade to WAV: %1"
+msgstr ""
+
+#: sndfilesource.cc:375 sndfilesource.cc:705
 msgid ""
 "cannot set broadcast info for audio file %1 (%2); dropping broadcast info "
 "for this file"
@@ -2463,68 +3095,68 @@ msgstr ""
 "Nelze nastavit informace o přenosu pro zvukový soubor %1 (%2); Zahazují se "
 "informace o přenosu pro tento soubor"
 
-#: sndfilesource.cc:368
-msgid "could not allocate file %1 for reading."
-msgstr "Nepodařilo se přidělit soubor %1 pro čtení."
+#: sndfilesource.cc:418
+msgid "could not open file %1 for reading."
+msgstr ""
 
-#: sndfilesource.cc:403
+#: sndfilesource.cc:453
 msgid "SndFileSource: could not seek to frame %1 within %2 (%3)"
 msgstr "SndFileSource: Nepodařil se vyhledat v %2 snímku %1 (%3)"
 
-#: sndfilesource.cc:412
+#: sndfilesource.cc:462
 msgid ""
 "SndFileSource: @ %1 could not read %2 within %3 (%4) (len = %5, ret was %6)"
 msgstr ""
 "SndFileSource: @ %1 Nepodařil se číst %2 uvnitř %3 (%4) (len = %5, ret byl "
 "%6)"
 
-#: sndfilesource.cc:454 sndfilesource.cc:483
+#: sndfilesource.cc:504 sndfilesource.cc:533
 msgid "attempt to write a non-writable audio file source (%1)"
 msgstr ""
 "Pokus o zápis zvukového zdrojového souboru chráněného proti zápisu (%1)"
 
-#: sndfilesource.cc:459 utils.cc:579 utils.cc:603 utils.cc:617 utils.cc:636
+#: sndfilesource.cc:509 utils.cc:564 utils.cc:588 utils.cc:602 utils.cc:621
 msgid "programming error: %1 %2"
 msgstr "Chyba v programování: %1 %2"
 
-#: sndfilesource.cc:586 sndfilesource.cc:604
+#: sndfilesource.cc:636 sndfilesource.cc:654
 msgid "attempt to flush a non-writable audio file source (%1)"
 msgstr ""
 "Pokus o uklizení zvukového zdrojového souboru chráněného proti zápisu (%1)"
 
-#: sndfilesource.cc:591
+#: sndfilesource.cc:641
 msgid "could not allocate file %1 to write header"
 msgstr "Nepodařilo se přidělit soubor %1 pro zapsání hlavičky souboru"
 
-#: sndfilesource.cc:609
+#: sndfilesource.cc:659
 msgid "could not allocate file %1 to flush contents"
 msgstr ""
 
-#: sndfilesource.cc:621
+#: sndfilesource.cc:671
 msgid ""
 "attempt to store broadcast info in a non-writable audio file source (%1)"
 msgstr ""
 "Pokus o zápis informace o přenosu do zvukového zdrojového souboru chráněného "
 "proti zápisu (%1)"
 
-#: sndfilesource.cc:626
+#: sndfilesource.cc:676
 msgid "attempt to set BWF info for an un-opened audio file source (%1)"
 msgstr ""
 "Pokus o nastavení informace BWF v neotevřeném zvukovém zdrojovém souboru (%1)"
 
-#: sndfilesource.cc:670
+#: sndfilesource.cc:720
 msgid "%1: cannot seek to %2 (libsndfile error: %3)"
 msgstr "%1: Nelze vyhledat %2 (Chyba libsndfile: %3)"
 
-#: sndfilesource.cc:780
+#: sndfilesource.cc:830
 msgid "SndFileSource: \"%1\" bad read retval: %2 of %5 (%3: %4)"
 msgstr "SndFileSource: \"%1\" špatná vrácená hodnota čtení: %2 z %5 (%3: %4)"
 
-#: sndfilesource.cc:793 sndfilesource.cc:843 sndfilesource.cc:850
+#: sndfilesource.cc:843 sndfilesource.cc:893 sndfilesource.cc:900
 msgid "SndFileSource: \"%1\" bad write (%2)"
 msgstr "SndFileSource: \"%1\" špatný postup zápisu (%2)"
 
-#: sndfilesource.cc:873
+#: sndfilesource.cc:923
 msgid ""
 "Filesource: start time is already set for existing file (%1): Cannot change "
 "start time."
@@ -2532,12 +3164,24 @@ msgstr ""
 "Filesource: Začáteční čas pro existující soubor je již nastaven (%1): "
 "Začáteční čas nelze změnit."
 
+#: sndfilesource.cc:982
+msgid "SndFileSource: cannot open file \"%1\" for reading"
+msgstr ""
+
+#: solo_control.cc:199
+msgid "Cleared Explicit solo: %1\n"
+msgstr ""
+
+#: solo_control.cc:202
+msgid "Cleared Implicit solo: %1 up:%2 down:%3\n"
+msgstr ""
+
 #: soundcloud_upload.cc:129
 msgid ""
 "Upload to Soundcloud failed.  Perhaps your email or password are incorrect?\n"
 msgstr ""
 
-#: source_factory.cc:374
+#: source_factory.cc:390
 msgid "Recovery attempted on a MIDI file - not implemented"
 msgstr ""
 
@@ -2553,7 +3197,7 @@ msgstr "Údaj pro reproduktor postrádá vyvýšení - reproduktor se přehlíž
 msgid "Speaker information is missing distance - speaker ignored"
 msgstr "Údaj pro reproduktor postrádá vzdálenost - reproduktor se přehlíží"
 
-#: srcfilesource.cc:134
+#: srcfilesource.cc:142
 msgid "SrcFileSource: %1"
 msgstr ""
 
@@ -2561,44 +3205,68 @@ msgstr ""
 msgid "Cannot compile tape track regexp for use (%1)"
 msgstr "Regulární výraz stopy pásky nelze vyhodnotit k užívání (%1)"
 
-#: tempo.cc:80
-msgid "TempoSection XML node has no \"start\" property"
-msgstr "TempoSection: Uzel XML nemá žádnou vlastnost \"start\""
+#: tempo.cc:98
+msgid "Legacy session detected. TempoSection XML node will be altered."
+msgstr ""
 
-#: tempo.cc:88
-msgid "TempoSection XML node has an illegal \"start\" value"
-msgstr "TempoSection: Uzel XML má nepřípustnou hodnotu pro \"start\""
+#: tempo.cc:104
+msgid "TempoSection XML node has an illegal \"pulse\" value"
+msgstr ""
 
-#: tempo.cc:95
+#: tempo.cc:112
+msgid "TempoSection XML node has an illegal \"frame\" value"
+msgstr ""
+
+#: tempo.cc:119
 msgid "TempoSection XML node has no \"beats-per-minute\" property"
 msgstr "TempoSection: Uzel XML nemá žádnou vlastnost \"beats-per-minute\""
 
-#: tempo.cc:100
+#: tempo.cc:124
 msgid "TempoSection XML node has an illegal \"beats_per_minute\" value"
 msgstr ""
 "TempoSection: Uzel XML má nepřípustnou hodnotu pro \"beats_per_minute\""
 
-#: tempo.cc:109
+#: tempo.cc:133
 msgid "TempoSection XML node has an illegal \"note-type\" value"
 msgstr "TempoSection: Uzel XML má nepřípustnou hodnotu pro \"note-type\""
 
-#: tempo.cc:115
+#: tempo.cc:139
 msgid "TempoSection XML node has no \"movable\" property"
 msgstr "TempoSection: Uzel XML má nepřípustnou hodnotu pro \"movable\""
 
-#: tempo.cc:125
-msgid "TempoSection XML node has an illegal \"bar-offset\" value"
-msgstr "TempoSection: Uzel XML má nepřípustnou hodnotu pro \"bar-offset\""
-
-#: tempo.cc:202
-msgid "MeterSection XML node has no \"start\" property"
-msgstr "MeterSection: Uzel XML nemá žádnou vlastnost \"start\""
+#: tempo.cc:146
+msgid "TempoSection XML node has no \"active\" property"
+msgstr ""
 
-#: tempo.cc:210
+#: tempo.cc:471
 msgid "MeterSection XML node has an illegal \"start\" value"
 msgstr "MeterSection: Uzel XML má nepřípustnou hodnotu pro \"start\""
 
-#: tempo.cc:220
+#: tempo.cc:474
+msgid "Legacy session detected - MeterSection XML node will be altered."
+msgstr ""
+
+#: tempo.cc:481
+msgid "MeterSection XML node has an illegal \"pulse\" value"
+msgstr ""
+
+#: tempo.cc:488
+msgid "MeterSection XML node has an illegal \"beat\" value"
+msgstr ""
+
+#: tempo.cc:495
+msgid "MeterSection XML node has no \"bbt\" property"
+msgstr ""
+
+#: tempo.cc:500
+msgid "MeterSection XML node has an illegal \"bbt\" value"
+msgstr ""
+
+#: tempo.cc:509
+msgid "MeterSection XML node has an illegal \"frame\" value"
+msgstr ""
+
+#: tempo.cc:519
 msgid ""
 "MeterSection XML node has no \"beats-per-bar\" or \"divisions-per-bar\" "
 "property"
@@ -2606,68 +3274,72 @@ msgstr ""
 "MeterSection: Uzel XML nemá žádnou vlastnost \"beats-per-bar\" nebo "
 "\"divisions-per-bar\""
 
-#: tempo.cc:226
-msgid ""
-"MeterSection XML node has an illegal \"beats-per-bar\" or \"divisions-per-bar"
-"\" value"
+#: tempo.cc:524
+msgid "MeterSection XML node has an illegal \"divisions-per-bar\" value"
 msgstr ""
-"MeterSection: Uzel XML má nepřípustnou hodnotu pro \"beats-per-bar\" nebo "
-"\"divisions-per-bar\""
 
-#: tempo.cc:231
+#: tempo.cc:529
 msgid "MeterSection XML node has no \"note-type\" property"
 msgstr "MeterSection: Uzel XML nemá žádnou vlastnost \"note-type\""
 
-#: tempo.cc:236
+#: tempo.cc:533
 msgid "MeterSection XML node has an illegal \"note-type\" value"
 msgstr "MeterSection: Uzel XML má nepřípustnou hodnotu pro \"note-type\""
 
-#: tempo.cc:241
+#: tempo.cc:538
 msgid "MeterSection XML node has no \"movable\" property"
 msgstr "MeterSection: Uzel XML nemá žádnou vlastnost \"movable\""
 
-#: tempo.cc:388
+#: tempo.cc:545
+msgid "MeterSection XML node has no \"lock-style\" property"
+msgstr ""
+
+#: tempo.cc:821
 msgid ""
 "Meter changes can only be positioned on the first beat of a bar. Moving from "
 "%1 to %2"
 msgstr ""
 "Změny metra lze umístit pouze na první dobu taktu. Přesunuje se z %1 na %2"
 
-#: tempo.cc:650
+#: tempo.cc:1156
 msgid "no tempo sections defined in tempo map - cannot change tempo @ %1"
 msgstr ""
 "V přiřazení tempa nejsou stanoveny žádné úseky tempa - Nelze změnit tempo @ "
 "%1"
 
-#: tempo.cc:680 tempo.cc:696 tempo.cc:712 tempo.cc:728
+#: tempo.cc:1186
+msgid "programming error: no meter section in tempo map!"
+msgstr ""
+
+#: tempo.cc:1204 tempo.cc:1227 tempo.cc:1248
 msgid "programming error: no tempo section in tempo map!"
 msgstr "Chyba v programování: Žádný úsek tempa v přiřazení tempa"
 
-#: tempo.cc:846 tempo.cc:1827
-msgid "programming error: unhandled MetricSection type"
-msgstr "Chyba v programování: Neupravený typ MetricSection"
-
-#: tempo.cc:1142
+#: tempo.cc:1959 tempo.cc:1987
 msgid "tempo map asked for BBT time at frame %1\n"
 msgstr "Přiřazení tempa požádalo o čas BBT u snímku %1\n"
 
-#: tempo.cc:1185
+#: tempo.cc:2054
 msgid "tempo map asked for frame time at bar < 1  (%1)\n"
 msgstr "Přiřazení tempa požádalo o čas snímku v taktu < 1 %1\n"
 
-#: tempo.cc:1642 tempo.cc:1656
+#: tempo.cc:3472 tempo.cc:3485
 msgid "Tempo map: could not set new state, restoring old one."
 msgstr ""
 "Přiřazení tempa: Nepodařilo se nastavit nový stav, obnovuje se starý stav."
 
-#: tempo.cc:1677
+#: tempo.cc:3522 tempo.cc:3523
 msgid "Multiple meter definitions found at %1"
 msgstr "V %1 nalezeno více vymezení metra"
 
-#: tempo.cc:1682
+#: tempo.cc:3528 tempo.cc:3529
 msgid "Multiple tempo definitions found at %1"
 msgstr "V %1 nalezeno více vymezení tempa"
 
+#: tempo.cc:3715
+msgid "programming error: unhandled MetricSection type"
+msgstr "Chyba v programování: Neupravený typ MetricSection"
+
 #: tempo_map_importer.cc:52
 msgid "Tempo map"
 msgstr "Přiřazení tempa"
@@ -2696,6 +3368,14 @@ msgstr ""
 "Toto nahradí nynější přiřazení tempa!\n"
 "Opravdu to chcete udělat?"
 
+#: unknown_processor.cc:86
+msgid "Using plugin-stub with unknown i/o configuration for: "
+msgstr ""
+
+#: unknown_processor.cc:107
+msgid "Using plugin-stub with mismatching i/o configuration for: "
+msgstr ""
+
 #: user_bundle.cc:47
 msgid "Node for Bundle has no \"name\" property"
 msgstr "Uzel pro svazek nemá žádnou vlastnost \"name\""
@@ -2717,62 +3397,162 @@ msgstr "Uzel pro kanál nemá žádnou vlastnost \"type\""
 msgid "Node for Port has no \"name\" property"
 msgstr "Uzel pro přípojku nemá žádnou vlastnost \"name\""
 
-#: utils.cc:422 utils.cc:451
+#: utils.cc:412 utils.cc:441
 msgid "Splice"
 msgstr "Spojit"
 
-#: utils.cc:424 utils.cc:441
+#: utils.cc:414 utils.cc:431
 msgid "Slide"
 msgstr "Vsunout"
 
-#: utils.cc:426 utils.cc:447
+#: utils.cc:416 utils.cc:437
 msgid "Ripple"
 msgstr ""
 
-#: utils.cc:428 utils.cc:444
+#: utils.cc:418 utils.cc:434
 msgid "Lock"
 msgstr "Zamknout"
 
-#: utils.cc:431
+#: utils.cc:421
 msgid "programming error: unknown edit mode string \"%1\""
 msgstr "Chyba v programování: neznámý řetězec pro režim úprav \"%1\""
 
-#: utils.cc:458 utils.cc:490
+#: utils.cc:448 utils.cc:484
 msgid "MIDI Timecode"
 msgstr "Časový kód MIDI"
 
-#: utils.cc:458 utils.cc:488
+#: utils.cc:448 utils.cc:482
 msgid "MTC"
 msgstr "MTC"
 
-#: utils.cc:462 utils.cc:497
+#: utils.cc:452 utils.cc:491
 msgid "MIDI Clock"
 msgstr "Hodiny MIDI"
 
-#: utils.cc:466 utils.cc:484 utils.cc:504
+#: utils.cc:456 utils.cc:478 utils.cc:498
 msgid "JACK"
 msgstr "JACK"
 
-#: utils.cc:470
+#: utils.cc:460 utils.cc:495
+msgid "LTC"
+msgstr "LTC"
+
+#: utils.cc:464
 msgid "programming error: unknown sync source string \"%1\""
 msgstr "Chyba v programování: neznámý řetězec pro zdroj seřízení \"%1\""
 
-#: utils.cc:495
+#: utils.cc:489
 msgid "M-Clock"
 msgstr "M-Clock"
 
-#: utils.cc:501
-msgid "LTC"
-msgstr "LTC"
-
-#: utils.cc:671
+#: utils.cc:658
 msgid "programming error: unknown native header format: %1"
 msgstr "Chyba v programování: neznámý nativní formát hlavičky: %1"
 
-#: utils.cc:686
+#: utils.cc:673
 msgid "cannot open directory %1 (%2)"
 msgstr "Nelze otevřít adresář %1 (%2)"
 
+#: vca.cc:43
+#, c-format
+msgid "VCA %n"
+msgstr ""
+
+#: vca_manager.cc:166
+msgid "Cannot set state of a VCA"
+msgstr ""
+
+#~ msgid "%d"
+#~ msgstr "%d"
+
+#~ msgid "AudioSource: cannot open peakpath (c) \"%1\" (%2)"
+#~ msgstr "AudioSource: Nelze otevřít cestu pro vrcholy (c) \"%1\" (%2)"
+
+#~ msgid "normalize"
+#~ msgstr "Normalizovat"
+
+#~ msgid "8bit"
+#~ msgstr "8bit"
+
+#~ msgid "16bit"
+#~ msgstr "16bit"
+
+#~ msgid "24bit"
+#~ msgstr "24bit"
+
+#~ msgid "32bit"
+#~ msgstr "32bit"
+
+#~ msgid "8bit unsigned"
+#~ msgstr "8bit bez znaménka"
+
+#~ msgid "Editor: cannot open \"%1\" as export file for CD marker file"
+#~ msgstr "Editor: Nelze otevřít \"%1\" jako soubor vyvedení pro značku CD"
+
+#~ msgid "MIDI file %1 was not readable (no reason available)"
+#~ msgstr "Soubor MIDI %1 nebyl čitelný (žádná příčina se nedá určit)"
+
+#~ msgid "transpose"
+#~ msgstr "Převést"
+
+#~ msgid ""
+#~ "VST plugin %1 does not support processReplacing, and so cannot be used in "
+#~ "%2 at this time"
+#~ msgstr ""
+#~ "Přídavný modul VST %1 nepodporuje processReplacing a z toho důvodu jej "
+#~ "nyní nelze v %2 použít"
+
+#~ msgid "badly formed order key string in state file! [%1] ... ignored."
+#~ msgstr ""
+#~ "Špatně utvořený řetězec znaků pro klíč pořadí roztřídění v souboru "
+#~ "sezení! [%1] ... Přehlíží se."
+
+#~ msgid ""
+#~ "Could not create directory for Session template plugin state\"%1\" (%2)"
+#~ msgstr ""
+#~ "Nepodařilo se vytvořit adresář pro stav přídavného modulu předlohy sezení "
+#~ "\"%1\" (%2)"
+
+#~ msgid "W64 (64 bit WAV)"
+#~ msgstr "W64 (64 bit WAV)"
+
+#~ msgid "Signed 16 bit PCM"
+#~ msgstr "Signed 16 bit PCM"
+
+#~ msgid "Signed 24 bit PCM"
+#~ msgstr "Signed 24 bit PCM"
+
+#~ msgid "Signed 32 bit PCM"
+#~ msgstr "Signed 32 bit PCM"
+
+#~ msgid "Signed 8 bit PCM"
+#~ msgstr "Signed 8 bit PCM"
+
+#~ msgid "32 bit float"
+#~ msgstr "32 bit float"
+
+#~ msgid "could not allocate file %1 for reading."
+#~ msgstr "Nepodařilo se přidělit soubor %1 pro čtení."
+
+#~ msgid "TempoSection XML node has no \"start\" property"
+#~ msgstr "TempoSection: Uzel XML nemá žádnou vlastnost \"start\""
+
+#~ msgid "TempoSection XML node has an illegal \"start\" value"
+#~ msgstr "TempoSection: Uzel XML má nepřípustnou hodnotu pro \"start\""
+
+#~ msgid "TempoSection XML node has an illegal \"bar-offset\" value"
+#~ msgstr "TempoSection: Uzel XML má nepřípustnou hodnotu pro \"bar-offset\""
+
+#~ msgid "MeterSection XML node has no \"start\" property"
+#~ msgstr "MeterSection: Uzel XML nemá žádnou vlastnost \"start\""
+
+#~ msgid ""
+#~ "MeterSection XML node has an illegal \"beats-per-bar\" or \"divisions-per-"
+#~ "bar\" value"
+#~ msgstr ""
+#~ "MeterSection: Uzel XML má nepřípustnou hodnotu pro \"beats-per-bar\" nebo "
+#~ "\"divisions-per-bar\""
+
 #~ msgid ""
 #~ "You have requested an operation that requires audio analysis.\n"
 #~ "\n"
diff --git a/libs/ardour/po/de.mo b/libs/ardour/po/de.mo
new file mode 100644
index 0000000..e8704bf
Binary files /dev/null and b/libs/ardour/po/de.mo differ
diff --git a/libs/ardour/po/de.po b/libs/ardour/po/de.po
index 5056d59..7964ddd 100644
--- a/libs/ardour/po/de.po
+++ b/libs/ardour/po/de.po
@@ -1,48 +1,39 @@
 # Copyright (C) YEAR "Paul Davis"
 # This file is distributed under the same license as the PACKAGE package.
 #
-# Edgar Aichinger <edgar.aichinger at aon.at>, 2013, 2014, 2015.
+# Edgar Aichinger <edgar.aichinger at aon.at>, 2013, 2014, 2015, 2016.
 msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-12-23 09:42+0100\n"
-"PO-Revision-Date: 2015-12-23 12:06+0100\n"
-"Last-Translator: Edgar Aichinger <edogawa at aon.at>\n"
+"POT-Creation-Date: 2016-07-14 06:20-0400\n"
+"PO-Revision-Date: 2016-08-06 15:36+0100\n"
+"Last-Translator: Edgar Aichinger <edgar.aichinger at aon.at>\n"
 "Language-Team: German <ardour-dev at lists.ardour.org>\n"
 "Language: de\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-Generator: Lokalize 1.5\n"
+"X-Generator: Lokalize 2.0\n"
 
-#: amp.cc:62 automatable.cc:173
-msgid "Trim"
-msgstr "Anpassen"
-
-#: amp.cc:62 automatable.cc:171
-msgid "Fader"
-msgstr "Fader"
-
-#: amp.cc:453
-#, c-format
-msgid "%3.1f dB"
-msgstr "%3.1f dB"
-
-#: amp.cc:494
+#: amp.cc:412
 #, c-format
 msgid "%.2fdB"
 msgstr "%.2fdB"
 
-#: analyser.cc:119 audioregion.cc:1762
+#: analyser.cc:121 audioregion.cc:1789
 msgid "Transient Analysis failed for %1."
 msgstr "Transientenanalyse für %1 fehlgeschlagen."
 
-#: analyser.cc:119
+#: analyser.cc:121
 msgid "Audio File Source"
 msgstr "Audiodateiquelle"
 
+#: analysis_graph.cc:136
+msgid "%1 (%2..%3)"
+msgstr "%1 (%2..%3)"
+
 #: audio_backend.cc:31
 msgid "No Error occurred"
 msgstr "Kein Fehler aufgetreten"
@@ -183,7 +174,7 @@ msgstr "Fehler: Speichermangel"
 msgid "Could not reconnect to Audio/MIDI engine"
 msgstr "Konnte nicht zur Audio/MIDI Engine wiederverbinden"
 
-#: audio_backend.cc:107 export_formats.cc:52 session.cc:6233 session.cc:6253
+#: audio_backend.cc:107 export_formats.cc:52 session.cc:6772 session.cc:6792
 msgid "None"
 msgstr "Kein"
 
@@ -262,7 +253,7 @@ msgstr ""
 msgid "Could not open %1.  Audio Library not saved"
 msgstr "Konnte %1 nicht öffnen. Die Audio-Bibliothek wurde nicht gesichert"
 
-#: audio_playlist.cc:504
+#: audio_playlist.cc:509
 msgid ""
 "Legacy crossfade involved an incoming region not present in playlist \"%1\" "
 "- crossfade discarded"
@@ -270,7 +261,7 @@ msgstr ""
 "An der veralteten Ãœberblendung war eine einzublendende Region beteiligt, die "
 "aber in Wiedergabeliste \"%1\" nicht existiert- Ãœberblendung verworfen"
 
-#: audio_playlist.cc:520
+#: audio_playlist.cc:525
 msgid ""
 "Legacy crossfade involved an outgoing region not present in playlist \"%1\" "
 "- crossfade discarded"
@@ -306,8 +297,8 @@ msgstr "Audio-Wiedergabelisten (unbenutzt)"
 
 #: audio_playlist_source.cc:171 audiosource.cc:1046
 #: midi_playlist_source.cc:147 midi_playlist_source.cc:155
-#: midi_playlist_source.cc:162 midi_source.cc:398 plugin_insert.cc:705
-#: rb_effect.cc:327 session.cc:3545 session.cc:3583 session.cc:4893
+#: midi_playlist_source.cc:162 midi_source.cc:403 plugin_insert.cc:1259
+#: rb_effect.cc:327 session.cc:5314 session.cc:5341 session.cc:5461
 #: session_handle.cc:88 sndfilesource.cc:173
 msgid "programming error: %1"
 msgstr "Programmierfehler: %1"
@@ -336,27 +327,27 @@ msgstr ""
 "\n"
 "Kanäle: "
 
-#: audio_track.cc:176
+#: audio_track.cc:177
 msgid "Unknown bundle \"%1\" listed for input of %2"
 msgstr "Unbekanntes Bündel \"%1\" für Eingang von %2 genannt"
 
-#: audio_track.cc:178
+#: audio_track.cc:179
 msgid "in 1"
 msgstr "in 1"
 
-#: audio_track.cc:179
+#: audio_track.cc:180
 msgid "No input bundles available as a replacement"
 msgstr "Es gibt keine als Ersatz geeigneten Eingangs-Bündel"
 
-#: audio_track.cc:183
+#: audio_track.cc:184
 msgid "Bundle %1 was not available - \"in 1\" used instead"
 msgstr "Bündel %1 war nicht verfügbar - verwende statt dessen \"in 1\""
 
-#: audio_track.cc:192
+#: audio_track.cc:193
 msgid "improper input channel list in XML node (%1)"
 msgstr "XML-Knoten (%1) enthält ungeeignete Liste der Eingangskanäle"
 
-#: audio_track.cc:215 diskstream.cc:503 source.cc:149
+#: audio_track.cc:216 diskstream.cc:503 source.cc:149
 msgid "%1: this session uses destructive tracks, which are not supported"
 msgstr ""
 "%1: dieses Projekt benutzt destruktive Spuren, was aber nicht unterstützt "
@@ -382,19 +373,19 @@ msgstr "kann VAMP-Plugin \"%1\" nicht laden"
 msgid "VAMP Plugin \"%1\" could not be loaded"
 msgstr "VAMP-Plugin \"%1\" konnte nicht geladen werden"
 
-#: audioengine.cc:753
+#: audioengine.cc:756
 msgid "AudioEngine: cannot load module \"%1\" (%2)"
 msgstr "AudioEngine: kann Modul \"%1\" nicht laden (%2)"
 
-#: audioengine.cc:759
+#: audioengine.cc:762
 msgid "AudioEngine: backend at \"%1\" has no descriptor function."
 msgstr "AudioEngine: Backend an \"%1\" hat keine Beschreibungsfunktion."
 
-#: audioengine.cc:838
+#: audioengine.cc:841
 msgid "Could not create backend for %1: %2"
 msgstr "Konnte Backend für %1 nicht erzeugen: %2"
 
-#: audioregion.cc:1718
+#: audioregion.cc:1757
 msgid ""
 "You have requested an operation that requires audio analysis.\n"
 "\n"
@@ -402,24 +393,26 @@ msgid ""
 "transient data must be generated every time it is required.\n"
 "\n"
 "If you are doing work that will require transient data on a regular basis, "
-"you should probably enable \"auto-analyse-audio\" then quit %1 and restart.\n"
+"you should probably enable \"auto-analyse-audio\" in Preferences > Audio > "
+"Regions, then quit %1 and restart.\n"
 "\n"
 "This dialog will not display again.  But you may notice a slight delay in "
 "this and future transient-detection operations.\n"
 msgstr ""
-"Sie haben eine Operation ausgelöst, die Audio-Analyse verlangt.\n"
+"Sie haben eine Operation angefordert, die Audioanalyse erfordert.\n"
 "\n"
-"Momentan haben Sie \"auto-analyse-audio\" deaktiviert, weshalbTransienten-"
-"Daten bei Bedarf jedesmal neu erzeugt werden müssen.\n"
+"Zur Zeit ist \"auto-analyse-audio\" deaktiviert, was bedeutet, daß "
+"Transientendaten, wenn verlangt, jedesmal neu generiert werden müssen.\n"
 "\n"
-"Wenn Sie öfters mit Transienten-Daten arbeiten, sollten Sie möglicherweise "
-"\"auto-analyse-audio\" einschalten und %1 neu starten.\n"
+"Falls Sie an etwas arbeiten, das regelmäßig Transientendaten benötigt, "
+"sollten Sie \"auto-analyse-audio\" in Globale Einstellungen > Audio > "
+"Regionen aktivieren, dann %1 beenden und neu starten.\n"
 "\n"
-"Dieser Dialog wird nicht wieder erscheinen. Jedoch könnten Sie bei dieser "
-"und zukünftigen Operation(en) zur Transienten-Erkennung eine leichte "
-"Verzögerung bemerken.\n"
+"Dieser Dialog wird nicht mehr angezeigt. Aber Sie könnten eine leichte "
+"Verzögerung bei dieser und zukünftigen Operationen mit Transienten-Erkennung "
+"bemerken.\n"
 
-#: audioregion.cc:1762
+#: audioregion.cc:1789
 msgid "Audio Region"
 msgstr "Audioregion"
 
@@ -496,70 +489,78 @@ msgstr "%1: konnte Peak-Daten nicht in Datei schreiben (%2)"
 msgid "could not truncate peakfile %1 to %2 (error: %3)"
 msgstr "konnte Peakdatei %1 nicht auf %2 kürzen (Fehler: %3)"
 
-#: auditioner.cc:101
+#: auditioner.cc:105
 msgid "Falling back to Reasonable Synth for Midi Audition"
 msgstr "Greife fürs MIDI-Vorhören auf Reasonable Synth zurück"
 
-#: auditioner.cc:103
+#: auditioner.cc:107
 msgid "No synth for midi-audition found."
 msgstr "Keinen Synth zum MIDI-Vorhören gefunden."
 
-#: auditioner.cc:159
+#: auditioner.cc:163
 msgid "no outputs available for auditioner - manual connection required"
 msgstr "Keine Ausgänge für Abhöre verfügbar - manuelle Verbindung erforderlich"
 
-#: auditioner.cc:404 auditioner.cc:451
+#: auditioner.cc:408 auditioner.cc:455
 msgid "Cannot setup auditioner processing flow for %1 channels"
 msgstr "Kann den Abhör-Signalfluss für %1 Kanäle nicht einrichten"
 
-#: auditioner.cc:439
+#: auditioner.cc:443
 msgid "Failed to load synth for MIDI-Audition."
 msgstr "Konnte Synth zum MIDI-Vorhören nicht laden."
 
-#: auditioner.cc:458
+#: auditioner.cc:462
 msgid "Auditioning of regions other than Audio or Midi is not supported."
 msgstr "Vorhören anderer Regionen als Audio oder MIDI wird nicht unterstützt."
 
-#: automatable.cc:84
+#: automatable.cc:87
 msgid "Automation node has no path property"
 msgstr "Automationsknoten hat keine Eigenschaft \"Pfad\""
 
-#: automatable.cc:105
+#: automatable.cc:108
 msgid "cannot open %2 to load automation data (%3)"
 msgstr "kann %2 nicht öffnen, um Automationsdaten zu laden (%3)"
 
-#: automatable.cc:137
+#: automatable.cc:140
 msgid "cannot load automation data from %2"
 msgstr "kann Automationsdaten von %2 nicht laden"
 
-#: automatable.cc:175
+#: automatable.cc:176 send.cc:95 session.cc:851
+msgid "Fader"
+msgstr "Fader"
+
+#: automatable.cc:178
+msgid "Trim"
+msgstr "Anpassen"
+
+#: automatable.cc:180
 msgid "Mute"
 msgstr "Stumm"
 
-#: automation_control.cc:170
+#: automation_control.cc:228
 msgid "record %1 automation"
 msgstr "%1 Automation aufnehmen"
 
-#: automation_list.cc:396
+#: automation_list.cc:410
 msgid "automation list: cannot load coordinates from XML, all points ignored"
 msgstr ""
 "Automationsliste: kann Koordinaten aus XML nicht laden, alle Punkte ignoriert"
 
-#: automation_list.cc:442
+#: automation_list.cc:456
 msgid ""
 "automation list: no x-coordinate stored for control point (point ignored)"
 msgstr ""
 "Automationsliste: Keine X-Koordinate für Kontrollpunkt gespeichert (Punkt "
 "ignoriert)"
 
-#: automation_list.cc:448
+#: automation_list.cc:462
 msgid ""
 "automation list: no y-coordinate stored for control point (point ignored)"
 msgstr ""
 "Automationsliste: Keine Y-Koordinate für Kontrollpunkt gespeichert (Punkt "
 "ignoriert)"
 
-#: automation_list.cc:462
+#: automation_list.cc:476
 msgid ""
 "AutomationList: passed XML node called %1, not \"AutomationList\" - ignored"
 msgstr ""
@@ -578,39 +579,43 @@ msgstr "Butler-Lesefehler bei dstream %1"
 msgid "Butler write-behind failure on dstream %1"
 msgstr "Butler-Schreibfehler bei dstream %1"
 
-#: control_protocol_manager.cc:173
+#: control_protocol_manager.cc:174
 msgid "control protocol name \"%1\" has no descriptor"
 msgstr "Kontrollprotokollname \"%1\" hat keine Beschreibung"
 
-#: control_protocol_manager.cc:180
+#: control_protocol_manager.cc:181
 msgid "control protocol name \"%1\" could not be initialized"
 msgstr "Kontrollprotokoll \"%1\" konnte nicht initialisiert werden"
 
-#: control_protocol_manager.cc:246
+#: control_protocol_manager.cc:265
 msgid "Instantiating mandatory control protocol %1"
 msgstr "Instanziere erforderliches Kontrollprotokoll %1"
 
-#: control_protocol_manager.cc:290
+#: control_protocol_manager.cc:309
 msgid "looking for control protocols in %1\n"
 msgstr "suche nach Kontrollprotokollen in %1\n"
 
-#: control_protocol_manager.cc:315
+#: control_protocol_manager.cc:334
 msgid "Control protocol %1 not usable"
 msgstr "Kontrollprotokoll %1 nicht benutzbar"
 
-#: control_protocol_manager.cc:332
+#: control_protocol_manager.cc:351
 msgid "Control surface protocol discovered: \"%1\"\n"
 msgstr "Protokoll für Kontrolloberfläche entdeckt: \"%1\"\n"
 
-#: control_protocol_manager.cc:350
+#: control_protocol_manager.cc:367
 msgid "ControlProtocolManager: cannot load module \"%1\" (%2)"
 msgstr "ControlProtocolManager: kann Modul \"%1\" nicht laden (%2)"
 
-#: control_protocol_manager.cc:356
+#: control_protocol_manager.cc:373
 msgid "ControlProtocolManager: module \"%1\" has no descriptor function."
 msgstr ""
 "ControlProtocolManager: Modul \"%1\" hat keine Funktion zur Beschreibung."
 
+#: control_protocol_manager.cc:516
+msgid "Control protocol \"%1\" has no descriptor"
+msgstr "Kontrollprotokoll \"%1\" hat keinen Deskriptor"
+
 #: cycle_timer.cc:40
 msgid "CycleTimer::get_mhz(): can't open /proc/cpuinfo"
 msgstr "CycleTimer::get_mhz(): kann /proc/cpuinfo nicht öffnen"
@@ -627,7 +632,7 @@ msgstr "kann CPU-Takt in /proc/cpuinfo nicht finden"
 msgid "audio"
 msgstr "Audio"
 
-#: data_type.cc:28 session.cc:2307
+#: data_type.cc:28 session.cc:2452
 msgid "MIDI"
 msgstr "MIDI"
 
@@ -639,7 +644,7 @@ msgstr "unbekannt"
 msgid "main outs"
 msgstr "Hauptausgänge"
 
-#: delivery.cc:121 send.cc:63
+#: delivery.cc:121 send.cc:64
 msgid "listen"
 msgstr "hören"
 
@@ -656,25 +661,25 @@ msgstr ""
 msgid "Export failed: %1"
 msgstr "Export fehlgeschlagen: %1"
 
-#: export_filename.cc:126
+#: export_filename.cc:128
 msgid "Existing export folder for this session (%1) does not exist - ignored"
 msgstr ""
 "genanntes Exportverzeichnis für dieses Projekt (%1) existiert nicht - "
 "ignoriert"
 
-#: export_filename.cc:242
+#: export_filename.cc:263
 msgid "No Time"
 msgstr "Keine Zeit"
 
-#: export_filename.cc:251
+#: export_filename.cc:272
 msgid "Invalid time format"
 msgstr "Ungültiges Zeitformat"
 
-#: export_filename.cc:260
+#: export_filename.cc:281
 msgid "No Date"
 msgstr "Kein Datum"
 
-#: export_filename.cc:275
+#: export_filename.cc:296
 msgid "Invalid date format"
 msgstr "Ungültiges Datumsformat"
 
@@ -710,23 +715,27 @@ msgstr "Verlustbehaftete Kompression"
 msgid "Lossless compression"
 msgstr "Verlustfreie  Kompression"
 
-#: export_format_manager.cc:218 export_format_specification.cc:601
+#: export_format_manager.cc:218 export_format_specification.cc:657
 msgid "Session rate"
 msgstr "Projektrate"
 
-#: export_format_specification.cc:556
-msgid "normalize"
-msgstr "normalisiere"
+#: export_format_specification.cc:609
+msgid "normalize loudness"
+msgstr "normalisiere Lautheit"
 
-#: export_format_specification.cc:560
+#: export_format_specification.cc:611
+msgid "normalize peak"
+msgstr "normalisiere Spitzenwert"
+
+#: export_format_specification.cc:616
 msgid "trim"
 msgstr "anpassen"
 
-#: export_format_specification.cc:562
+#: export_format_specification.cc:618
 msgid "trim start"
 msgstr "Anfang anpassen"
 
-#: export_format_specification.cc:564
+#: export_format_specification.cc:620
 msgid "trim end"
 msgstr "Ende anpassen"
 
@@ -778,22 +787,22 @@ msgstr "Vorbis-Sampleformat"
 msgid "No sample format"
 msgstr "Kein Sampleformat"
 
-#: export_handler.cc:371
+#: export_handler.cc:419
 msgid "File %1 uploaded to %2"
 msgstr "Datei %1 nach %2 hochgeladen"
 
-#: export_handler.cc:377
+#: export_handler.cc:425
 msgid ""
 "upload to Soundcloud failed. Perhaps your email or password are incorrect?\n"
 msgstr ""
 "das Hochladen nach Soundcloud ist gescheitert. Vielleicht sind E-mail-"
-"Adresse oder Passwort falsch?"
+"Adresse oder Passwort falsch?\n"
 
-#: export_handler.cc:503 export_handler.cc:506
-msgid "an error occured while writing a TOC/CUE file: %1"
+#: export_handler.cc:551 export_handler.cc:554
+msgid "an error occurred while writing a TOC/CUE file: %1"
 msgstr "beim Schreiben einer TOC/CUE Datei trat ein Fehler auf:%1"
 
-#: export_handler.cc:796 export_handler.cc:854
+#: export_handler.cc:844 export_handler.cc:902
 msgid "Cannot convert %1 to Latin-1 text"
 msgstr "Kann %1 nicht zu Latin-1 Kodierung konvertieren"
 
@@ -805,61 +814,61 @@ msgstr "Suche in %1 nach Exportformaten"
 msgid "Unable to create export format directory %1: %2"
 msgstr "Kann Verzeichnis %1 für Exportformate nicht erzeugen: %2"
 
-#: export_profile_manager.cc:263
+#: export_profile_manager.cc:268
 msgid "Unable to remove export preset %1: %2"
 msgstr "Kann Export-Preset %1 nicht entfernen: %2"
 
-#: export_profile_manager.cc:352
+#: export_profile_manager.cc:357
 msgid "Selection"
 msgstr "Auswahl"
 
-#: export_profile_manager.cc:616
+#: export_profile_manager.cc:621
 msgid "Unable to rename export format %1 to %2: %3"
 msgstr "Kann Export-Format %1 nicht nach %2 umbenennen: %3"
 
-#: export_profile_manager.cc:648
+#: export_profile_manager.cc:653
 msgid "Unable to remove export profile %1: %2"
 msgstr "Kann Export-Profil %1 nicht entfernen: %2"
 
-#: export_profile_manager.cc:666
+#: export_profile_manager.cc:671
 msgid "empty format"
 msgstr "leeres Format"
 
-#: export_profile_manager.cc:747
+#: export_profile_manager.cc:752
 msgid "Cannot load export format from %1"
 msgstr "Kann Exportformat aus %1 nicht laden"
 
-#: export_profile_manager.cc:753
+#: export_profile_manager.cc:758
 msgid "Cannot export format read from %1"
 msgstr "Kann Exportformat aus %1 nicht lesen"
 
-#: export_profile_manager.cc:847
+#: export_profile_manager.cc:852
 msgid "No timespan has been selected!"
 msgstr "Keine Zeitspanne ausgewählt!"
 
-#: export_profile_manager.cc:851
+#: export_profile_manager.cc:856
 msgid "No channels have been selected!"
 msgstr "Keine Kanäle ausgewählt!"
 
-#: export_profile_manager.cc:855
+#: export_profile_manager.cc:860
 msgid "Some channels are empty"
 msgstr "Einige Kanäle sind leer"
 
-#: export_profile_manager.cc:888
+#: export_profile_manager.cc:893
 msgid "No format selected!"
 msgstr "Kein Format ausgewählt!"
 
-#: export_profile_manager.cc:890
+#: export_profile_manager.cc:895
 msgid "All channels are empty!"
 msgstr "Alle Kanäle sind leer!"
 
-#: export_profile_manager.cc:892
+#: export_profile_manager.cc:897
 msgid "One or more of the selected formats is not compatible with this system!"
 msgstr ""
 "Eines oder mehrere der gewählten Formate sind mit diesem Sytem nicht "
 "kompatibel!"
 
-#: export_profile_manager.cc:895
+#: export_profile_manager.cc:900
 msgid ""
 "%1 supports only %2 channels, but you have %3 channels in your channel "
 "configuration"
@@ -867,7 +876,7 @@ msgstr ""
 "% unterstützt nur %2 Kanäle, in Ihrer Kanalkonfiguration befinden sich "
 "jedoch %3 Kanäle"
 
-#: file_source.cc:201 session_state.cc:3144
+#: file_source.cc:201 session_state.cc:3284
 msgid ""
 "there are already 1000 files with names like %1; versioning discontinued"
 msgstr ""
@@ -981,50 +990,55 @@ msgstr "kann momentanes Arbeitsverzeichnis nicht bestimmen (%1)"
 msgid "unknown file type for session %1"
 msgstr "Unbekannter Dateityp für Projekt %1"
 
-#: globals.cc:265
+#: gain_control.cc:81
+#, c-format
+msgid "%3.1f dB"
+msgstr "%3.1f dB"
+
+#: globals.cc:266
 msgid "Could not set system open files limit to \"unlimited\""
 msgstr ""
 "Konnte die Systemgrenze für offene Dateien nicht auf \"unbeschränkt\" setzen"
 
-#: globals.cc:267
+#: globals.cc:268
 msgid "Could not set system open files limit to %1"
 msgstr "Konnte die Systemgrenze für offene Dateien nicht auf %1 setzen"
 
-#: globals.cc:271 globals.cc:288
+#: globals.cc:272 globals.cc:289
 msgid "Your system is configured to limit %1 to only %2 open files"
 msgstr "Ihre Systemkonfiguration beschränkt %1 auf nur %2 offene Dateien"
 
-#: globals.cc:275
+#: globals.cc:276
 msgid "Could not get system open files limit (%1)"
 msgstr "Konnte die Grenze für offene Dateien nicht erhalten (%1)"
 
-#: globals.cc:290
+#: globals.cc:291
 msgid "Could not set system open files limit. Current limit is %1 open files"
 msgstr ""
 "Konnte die Systemgrenze für offene Dateien nicht setzen. Momentane Grenze "
 "ist bei %1 Dateien"
 
-#: globals.cc:472
+#: globals.cc:474
 msgid "Loading configuration"
 msgstr "Lade Konfiguration"
 
-#: globals.cc:536 session.cc:1031
+#: globals.cc:554 route.cc:182 route.cc:4149 session.cc:1157
 msgid "Monitor"
 msgstr "Monitor"
 
-#: globals.cc:537 session_state.cc:633
+#: globals.cc:555 session_state.cc:642
 msgid "Master"
 msgstr "Master"
 
-#: globals.cc:538
+#: globals.cc:556
 msgid "Control"
 msgstr "Strg"
 
-#: globals.cc:539
+#: globals.cc:557
 msgid "Click"
 msgstr "Klick"
 
-#: globals.cc:540
+#: globals.cc:558
 msgid "Mackie"
 msgstr "Mackie"
 
@@ -1082,110 +1096,113 @@ msgstr ""
 msgid "Unknown"
 msgstr "Unbekannt"
 
-#: instrument_info.cc:231
+#: instrument_info.cc:243
 msgid "preset %1 (bank %2)"
 msgstr "Preset %1 (Bank %2)"
 
-#: internal_send.cc:315 internal_send.cc:316
+#: internal_send.cc:338 internal_send.cc:339
 msgid "%1 - cannot find any track/bus with the ID %2 to connect to"
 msgstr "%1 - kann Spur/Bus mit der ID %2 zum Verbinden finden"
 
-#: io.cc:209
+#: io.cc:212
 msgid "IO: cannot disconnect port %1 from %2"
 msgstr "IO: kann Port %1 nicht von %2 trennen"
 
-#: io.cc:344 io.cc:431
+#: io.cc:347 io.cc:435
 msgid "IO: cannot register input port %1"
 msgstr "IO: kann Eingangsport %1 nicht registrieren"
 
-#: io.cc:349 io.cc:436
+#: io.cc:352 io.cc:440
 msgid "IO: cannot register output port %1"
 msgstr "IO: kann Ausgangsport %1 nicht registrieren"
 
-#: io.cc:599 io.cc:655
+#: io.cc:607 io.cc:668
 msgid "incorrect XML node \"%1\" passed to IO object"
 msgstr "unkorrekter XML-Knoten \"%1\" an IO Objekt weitergereicht"
 
-#: io.cc:717
+#: io.cc:730
 msgid "in"
 msgstr "in"
 
-#: io.cc:717
+#: io.cc:730
 msgid "out"
 msgstr "out"
 
-#: io.cc:718
+#: io.cc:731
 msgid "input"
 msgstr "Eingang"
 
-#: io.cc:718
+#: io.cc:731
 msgid "output"
 msgstr "Ausgang"
 
-#: io.cc:728
+#: io.cc:741
 msgid "Unknown bundle \"%1\" listed for %2 of %3"
 msgstr "Unbekanntes Bündel \"%1\" für %2 von %3 genannt"
 
-#: io.cc:794
+#: io.cc:807
 msgid "Bundle %1 was not available - \"%2\" used instead"
 msgstr "Bündel %1 war nicht verfügbar - verwende stattdessen \"%2\" "
 
-#: io.cc:797
+#: io.cc:810
 msgid "No %1 bundles available as a replacement"
 msgstr "%1 Bündel nicht als Ersatz verfügbar"
 
-#: io.cc:901
+#: io.cc:914
 msgid "%1: cannot create I/O ports"
 msgstr "%1: kann keine E/A-Ports erzeugen"
 
-#: io.cc:1029 io.cc:1130
+#: io.cc:1042 io.cc:1143
 msgid "IO: badly formed string in XML node for inputs \"%1\""
 msgstr "IO: schlecht geformte Zeichenkette in XML-Knoten für Eingänge \"%1\""
 
-#: io.cc:1034 io.cc:1135
+#: io.cc:1047 io.cc:1148
 msgid "bad input string in XML node \"%1\""
 msgstr "IO: schlechte Zeichenkette für Eingang in XML-Knoten \"%1\""
 
-#: io.cc:1073
+#: io.cc:1086
 msgid "IO: badly formed string in XML node for outputs \"%1\""
 msgstr "IO: schlecht geformte Zeichenkette in XML-Knoten für Ausgänge \"%1\""
 
-#: io.cc:1078
+#: io.cc:1091
 msgid "IO: bad output string in XML node \"%1\""
 msgstr "IO: schlechte Zeichenkette für Ausgang in XML-Knoten \"%1\""
 
-#: io.cc:1416
+#: io.cc:1256 plugin.cc:275
+msgid "Out"
+msgstr "Aus"
+
+#: io.cc:1256 plugin.cc:273
+msgid "In"
+msgstr "Ein"
+
+#: io.cc:1454
 #, c-format
 msgid "%s %u"
 msgstr "%s %u"
 
-#: io.cc:1463
+#: io.cc:1501
 #, c-format
 msgid "%s in"
 msgstr "%s in"
 
-#: io.cc:1465
+#: io.cc:1503
 #, c-format
 msgid "%s out"
 msgstr "%s out"
 
-#: io.cc:1540 session.cc:837 session.cc:871
+#: io.cc:1578 session.cc:957 session.cc:991
 msgid "mono"
 msgstr "Mono"
 
-#: io.cc:1542 session.cc:850 session.cc:885
+#: io.cc:1580 session.cc:970 session.cc:1005
 msgid "L"
 msgstr "L"
 
-#: io.cc:1542 session.cc:852 session.cc:887
+#: io.cc:1580 session.cc:972 session.cc:1007
 msgid "R"
 msgstr "R"
 
-#: io.cc:1544 io.cc:1550
-#, c-format
-msgid "%d"
-msgstr "%d"
-
 #: ladspa_plugin.cc:93
 msgid "LADSPA: Unable to open module: "
 msgstr "LADSPA: Kann Modul nicht öffnen: "
@@ -1204,7 +1221,7 @@ msgstr ""
 "LADSPA: \"%1\" kann nicht verwendet werdeen, da es kein \"inplace processing"
 "\" beherrscht"
 
-#: ladspa_plugin.cc:311
+#: ladspa_plugin.cc:308
 msgid ""
 "illegal parameter number used with plugin \"%1\". This may indicate a change "
 "in the plugin design, and presets may be invalid"
@@ -1212,77 +1229,77 @@ msgstr ""
 "Falsche Parameterzahl für Plugin \"%1\". Das auf eine Änderung im Plugin-"
 "Design hindeuten, und Presets sind eventuell ungültig"
 
-#: ladspa_plugin.cc:390 ladspa_plugin.cc:440
+#: ladspa_plugin.cc:387 ladspa_plugin.cc:437
 msgid "Bad node sent to LadspaPlugin::set_state"
 msgstr "Schlechter Knoten an LadspaPlugin::set_state gesendet"
 
-#: ladspa_plugin.cc:405 ladspa_plugin.cc:454
+#: ladspa_plugin.cc:402 ladspa_plugin.cc:451
 msgid "LADSPA: no ladspa port number"
 msgstr "LADSPA: keine LADSPA-Portnummer"
 
-#: ladspa_plugin.cc:411 ladspa_plugin.cc:460
+#: ladspa_plugin.cc:408 ladspa_plugin.cc:457
 msgid "LADSPA: no ladspa port data"
 msgstr "LADSPA: keine LADSPA-Portdaten"
 
-#: ladspa_plugin.cc:842
+#: ladspa_plugin.cc:863
 msgid "Could not locate HOME.  Preset not removed."
 msgstr "Konnte HOME nicht eruieren. Preset nicht entfernt."
 
-#: ladspa_plugin.cc:881 ladspa_plugin.cc:887
+#: ladspa_plugin.cc:902 ladspa_plugin.cc:908
 msgid "Could not create %1.  Preset not saved. (%2)"
 msgstr "Konnte %1 nicht erzeugen. Preset nicht gesichert. (%2)"
 
-#: ladspa_plugin.cc:894
+#: ladspa_plugin.cc:915
 msgid "Error saving presets file %1."
 msgstr "Fehler beim Sichern der Preset-Datei %1."
 
-#: ladspa_plugin.cc:936
+#: ladspa_plugin.cc:957
 msgid "Could not locate HOME.  Preset not saved."
 msgstr "Konnte HOME nicht eruieren. Preset nicht gesichert."
 
-#: location.cc:459
+#: location.cc:455
 msgid "You cannot put a CD marker at this position"
 msgstr "An dieser Stelle können Sie keinen CD-Marker ablegen"
 
-#: location.cc:611
+#: location.cc:607
 msgid "incorrect XML node passed to Location::set_state"
 msgstr "Unkorrekter XML-Knoten an Location::set_state weitergereicht"
 
-#: location.cc:616
+#: location.cc:612
 msgid "XML node for Location has no ID information"
 msgstr "XML-Knoten für Position hat keine ID-Information"
 
-#: location.cc:620
+#: location.cc:616
 msgid "XML node for Location has no name information"
 msgstr "XML-Knoten für Position hat keine Namensinformation"
 
-#: location.cc:627
+#: location.cc:623
 msgid "XML node for Location has no start information"
 msgstr "XML-Knoten für Position hat keine Start-Information"
 
-#: location.cc:638
+#: location.cc:634
 msgid "XML node for Location has no end information"
 msgstr "XML-Knoten für Position hat keine End-Information"
 
-#: location.cc:645
+#: location.cc:641
 msgid "XML node for Location has no flags information"
 msgstr "XML-Knoten für Position hat keine Flags-Information"
 
-#: location.cc:872
+#: location.cc:868
 msgid "Locations: attempt to use unknown location as selected location"
 msgstr ""
 "Locations: Versuch, eine unbekannte Position als ausgewählte Position zu "
 "verwenden"
 
-#: location.cc:1050
+#: location.cc:1046
 msgid "incorrect XML mode passed to Locations::set_state"
 msgstr "unkorrekter XML-Modus an Locations::set_state weitergereicht"
 
-#: location.cc:1063 session.cc:1537 session.cc:5717 session_state.cc:1169
+#: location.cc:1059 session.cc:1667 session.cc:6305 session_state.cc:1205
 msgid "session"
 msgstr "Projekt"
 
-#: location.cc:1130
+#: location.cc:1126
 msgid "could not load location from session file - ignored"
 msgstr "konnte Position nicht aus Projektdatei laden - ignoriert"
 
@@ -1365,6 +1382,46 @@ msgstr ""
 msgid "flywheel"
 msgstr "Schwungrad"
 
+#: lua_api.cc:87
+msgid "Script with given name was not found\n"
+msgstr "Skript mit dem angegebenen Namen konnte nicht gefunden werden\n"
+
+#: lua_api.cc:96
+msgid "Failed to instantiate Lua Processor\n"
+msgstr "Instantiierung des Lua-Prozessors fehlgeschlagen\n"
+
+#: luaproc.cc:876
+msgid "Failed to load Lua script from session state."
+msgstr "Das Laden eines Lua Skriptes aus dem Projektstatus schlug fehl."
+
+#: luaproc.cc:886
+msgid "Session State for LuaProcessor did not include a Lua script."
+msgstr "Projektstatus für LuaProcessor enthielt kein Lua Skript."
+
+#: luaproc.cc:890
+msgid "Invalid/incompatible Lua script found for LuaProcessor."
+msgstr "Ungültiges/inkompatibles Lua Skript für LuaProcessor gefunden."
+
+#: luaproc.cc:918
+msgid "Bad node sent to LuaProc::set_state"
+msgstr "Schlechter Knoten an LuaProc::set_state gesendet"
+
+#: luaproc.cc:928
+msgid "LuaProc: port has no symbol, ignored"
+msgstr "LuaProc: port hat kein Symbol, ignoriere"
+
+#: luaproc.cc:934
+msgid "LuaProc: port has no value, ignored"
+msgstr "LuaProc: port hat keinen Wert, ignoriere"
+
+#: luaproc.cc:1164
+msgid "Unable to create LuaProc presets directory"
+msgstr "Kann LuaProc Preset-Ordner nicht erzeugen"
+
+#: luascripting.cc:132
+msgid "Script '%1' has no valid descriptor."
+msgstr "Skript '%1' hat keinen gültigen Deskriptor."
+
 #: midi_diskstream.cc:172
 msgid ""
 "%1: I/O configuration change %4 requested to use %2, but channel setup is %3"
@@ -1448,19 +1505,19 @@ msgstr "Entferne MIDI-Patch-Datei %1"
 msgid "Scene "
 msgstr "Szene"
 
-#: midi_source.cc:125
+#: midi_source.cc:126
 msgid "Missing parameter property on InterpolationStyle"
 msgstr "Fehlende Eigenschaft \"parameter\" bei InterpolationStyle"
 
-#: midi_source.cc:131
+#: midi_source.cc:132
 msgid "Missing style property on InterpolationStyle"
 msgstr "Fehlende Eigenschaft \"style\" bei InterpolationStyle"
 
-#: midi_source.cc:140
+#: midi_source.cc:141
 msgid "Missing parameter property on AutomationState"
 msgstr "Fehlende Eigenschaft \"parameter\" bei AutomationState"
 
-#: midi_source.cc:146
+#: midi_source.cc:147
 msgid "Missing state property on AutomationState"
 msgstr "Fehlende Eigenschaft \"state\" bei AutomationState"
 
@@ -1468,39 +1525,39 @@ msgstr "Fehlende Eigenschaft \"state\" bei AutomationState"
 msgid "MIDI stretch created non-MIDI source"
 msgstr "MIDI Streckung erzeugte Nicht-MIDI Quelle"
 
-#: monitor_processor.cc:53
+#: monitor_processor.cc:54
 msgid "monitor dim"
 msgstr "Monitor dämpfen"
 
-#: monitor_processor.cc:54
+#: monitor_processor.cc:55
 msgid "monitor cut"
 msgstr "Monitor Cut"
 
-#: monitor_processor.cc:55
+#: monitor_processor.cc:56
 msgid "monitor mono"
 msgstr "Monitor Mono"
 
-#: monitor_processor.cc:58
+#: monitor_processor.cc:59
 msgid "monitor dim level"
 msgstr "Lautstärke für Monitor dämpfen"
 
-#: monitor_processor.cc:62
+#: monitor_processor.cc:63
 msgid "monitor solo boost level"
 msgstr "Lautstärke für Monitor Solo Boost"
 
-#: monitor_processor.cc:511
+#: monitor_processor.cc:543
 msgid "cut control %1"
 msgstr "Cut-Regler %1"
 
-#: monitor_processor.cc:512
+#: monitor_processor.cc:544
 msgid "dim control"
 msgstr "Dämpfungsschalter"
 
-#: monitor_processor.cc:513
+#: monitor_processor.cc:545
 msgid "polarity control"
 msgstr "Polaritätsschalter"
 
-#: monitor_processor.cc:514
+#: monitor_processor.cc:546
 msgid "solo control"
 msgstr "Solo-Schalter"
 
@@ -1576,7 +1633,7 @@ msgstr "Region kopieren"
 msgid "fixed time region copy"
 msgstr "Region mit fixierter Zeit kopieren"
 
-#: pannable.cc:207
+#: pannable.cc:208
 msgid "Pannable given XML data for %1 - ignored"
 msgstr "Pannerziel bekam XML-Daten für %1 übergeben - ignoriert"
 
@@ -1600,7 +1657,7 @@ msgstr "PannerManager: Modul \"%1\" hat keine Beschreibungsfunktion"
 msgid "no panner discovered for in/out = %1/%2"
 msgstr "keinen Panner für %1/%2 Ein/Ausgänge gefunden"
 
-#: panner_shell.cc:121
+#: panner_shell.cc:122
 msgid ""
 "No panner found: check that panners are being discovered correctly during "
 "startup."
@@ -1608,23 +1665,71 @@ msgstr ""
 "Keinen Panner gefunden: Vergewissern Sie sich, dass die Panner während des "
 "Programmstarts korrekt erkannt werden."
 
-#: panner_shell.cc:125
+#: panner_shell.cc:126
 msgid "select panner: %1\n"
 msgstr "wähle Panner: %1\n"
 
-#: panner_shell.cc:254
+#: panner_shell.cc:257
 msgid "Unknown panner plugin \"%1\" found in pan state - ignored"
 msgstr "Unbekanntes Panner-Plugin \"%1\" in Pan-Status gefunden - ignoriert"
 
-#: panner_shell.cc:260
+#: panner_shell.cc:263
 msgid "panner plugin node has no type information!"
 msgstr "Panner Plugin-Knoten hat keine Typinformation!"
 
-#: playlist.cc:2179
+#: parameter_descriptor.cc:201
+msgid "Note|C"
+msgstr "C"
+
+#: parameter_descriptor.cc:202
+msgid "Note|C#"
+msgstr "Cis"
+
+#: parameter_descriptor.cc:203
+msgid "Note|D"
+msgstr "D"
+
+#: parameter_descriptor.cc:204
+msgid "Note|D#"
+msgstr "Dis"
+
+#: parameter_descriptor.cc:205
+msgid "Note|E"
+msgstr "E"
+
+#: parameter_descriptor.cc:206
+msgid "Note|F"
+msgstr "F"
+
+#: parameter_descriptor.cc:207
+msgid "Note|F#"
+msgstr "Fis"
+
+#: parameter_descriptor.cc:208
+msgid "Note|G"
+msgstr "G"
+
+#: parameter_descriptor.cc:209
+msgid "Note|G#"
+msgstr "Gis"
+
+#: parameter_descriptor.cc:210
+msgid "Note|A"
+msgstr "A"
+
+#: parameter_descriptor.cc:211
+msgid "Note|A#"
+msgstr "Ais"
+
+#: parameter_descriptor.cc:212
+msgid "Note|B"
+msgstr "H"
+
+#: playlist.cc:2234
 msgid "region state node has no ID, ignored"
 msgstr "Status-Knoten der Region hat keine ID, ignoriert"
 
-#: playlist.cc:2197
+#: playlist.cc:2252
 msgid "Playlist: cannot create region from XML"
 msgstr "Wiedergabeliste: kann Region aus XML nicht erzeugen"
 
@@ -1638,7 +1743,27 @@ msgstr ""
 "Konnte die Wiedergabeliste nicht aus den Quelldaten des Projekts "
 "konstruieren!"
 
-#: plugin.cc:329
+#: plugin.cc:126
+msgid "Cannot remove plugin factory preset."
+msgstr "Factory-Preset des Plugins kann nicht entfernt werden."
+
+#: plugin.cc:144
+msgid "Preset with given name already exists."
+msgstr "Ein Preset mit diesem Namen existiert bereits"
+
+#: plugin.cc:263
+msgid "Audio"
+msgstr "Audio"
+
+#: plugin.cc:266
+msgid "Midi"
+msgstr "MIDI"
+
+#: plugin.cc:269
+msgid "?"
+msgstr "?"
+
+#: plugin.cc:412
 msgid ""
 "Plugin presets are not supported in this build of %1. Consider paying for a "
 "full version"
@@ -1646,7 +1771,7 @@ msgstr ""
 "Pluginpresets werden in diesem %1-Binärpaket nicht unterstützt. Erwägen Sie, "
 "für die Vollversion zu bezahlen"
 
-#: plugin.cc:412
+#: plugin.cc:495
 msgid ""
 "Saving plugin settings is not supported in this build of %1. Consider paying "
 "for the full version"
@@ -1654,23 +1779,27 @@ msgstr ""
 "Das Speichern von Pluginpresets werden in diesem %1-Binärpaket nicht "
 "unterstützt. Erwägen Sie, für die Vollversion zu bezahlen"
 
-#: plugin_insert.cc:597
+#: plugin_insert.cc:1148
 msgid "programming error: "
 msgstr "Programmierfehler:"
 
-#: plugin_insert.cc:1010
+#: plugin_insert.cc:1700
+msgid "SC %1"
+msgstr "SC %1"
+
+#: plugin_insert.cc:2352
 msgid "XML node describing plugin is missing the `type' field"
 msgstr "Dem XML-Knoten zur Beschreibung des Plugins fehlt das \"type\"-Feld"
 
-#: plugin_insert.cc:1025
+#: plugin_insert.cc:2369
 msgid "unknown plugin type %1 in plugin insert state"
 msgstr "Unbekannter Plugintyp %1 im Einfüge-Status des Plugins"
 
-#: plugin_insert.cc:1053
+#: plugin_insert.cc:2397
 msgid "Plugin has no unique ID field"
 msgstr "Das Plugin hat kein Feld für die eindeutige ID"
 
-#: plugin_insert.cc:1078
+#: plugin_insert.cc:2435
 msgid ""
 "Found a reference to a plugin (\"%1\") that is unknown.\n"
 "Perhaps it was removed or moved since it was last used."
@@ -1678,153 +1807,157 @@ msgstr ""
 "Referenz auf ein unbekanntes Plugin (\"%1\") gefunden.\n"
 "Vielleicht wurde es seit der letzten Verwendung entfernt oder verschoben."
 
-#: plugin_insert.cc:1235
+#: plugin_insert.cc:2645
 msgid "PluginInsert: Auto: no ladspa port number"
 msgstr "PluginInsert: Auto: keine LADSPA Portnummer"
 
-#: plugin_insert.cc:1242
+#: plugin_insert.cc:2652
 msgid "PluginInsert: Auto: port id out of range"
 msgstr "PluginInsert: Auto: Port-ID Bereichsüberschreitung"
 
-#: plugin_insert.cc:1278
+#: plugin_insert.cc:2688
 msgid "PluginInsert: automatable control %1 not found - ignored"
 msgstr ""
 "PluginInsert: automatisierbares Kontrollelement %1 nicht gefunden - ignoriert"
 
-#: plugin_manager.cc:217
+#: plugin_manager.cc:220
 msgid "Discovering Plugins"
 msgstr "Finde Plugins"
 
-#: plugin_manager.cc:245
+#: plugin_manager.cc:251
 msgid "Scanning LADSPA Plugins"
 msgstr "Scanne LADSPA Plugins"
 
-#: plugin_manager.cc:248
+#: plugin_manager.cc:253
+msgid "Scanning Lua DSP Processors"
+msgstr "Scanne Lua DSP-Prozessoren"
+
+#: plugin_manager.cc:256
 msgid "Scanning LV2 Plugins"
 msgstr "Scanne LV2 Plugins"
 
-#: plugin_manager.cc:254
+#: plugin_manager.cc:262
 msgid "Scanning Windows VST Plugins"
 msgstr "Scanne Windows VST Plugins"
 
-#: plugin_manager.cc:256
+#: plugin_manager.cc:264
 msgid "Discovering Windows VST Plugins"
 msgstr "Halte Ausschau nach Windows VST Plugins"
 
-#: plugin_manager.cc:265
+#: plugin_manager.cc:273
 msgid "Scanning Linux VST Plugins"
 msgstr "Scanne Linux VST Plugins"
 
-#: plugin_manager.cc:267
+#: plugin_manager.cc:275
 msgid "Discovering Linux VST Plugins"
 msgstr "Halte Ausschau nach Linux VST Plugins"
 
-#: plugin_manager.cc:280
+#: plugin_manager.cc:288
 msgid "VST Blacklist: "
 msgstr "VST Schwarzliste: "
 
-#: plugin_manager.cc:282
+#: plugin_manager.cc:290
 msgid "VST Blacklist:"
 msgstr "VST Schwarzliste:"
 
-#: plugin_manager.cc:292
+#: plugin_manager.cc:300
 msgid "Scanning AU Plugins"
 msgstr "Scanne AU Plugins"
 
-#: plugin_manager.cc:294
+#: plugin_manager.cc:302
 msgid "Discovering AU Plugins"
 msgstr "Halte Ausschau nach AU Plugins"
 
-#: plugin_manager.cc:299
+#: plugin_manager.cc:307
 msgid "Plugin Scan Complete..."
 msgstr "Plugin-Scan abgeschlossen"
 
-#: plugin_manager.cc:483
+#: plugin_manager.cc:513
 msgid "LADSPA"
 msgstr "LADSPA"
 
-#: plugin_manager.cc:535
+#: plugin_manager.cc:565
 msgid "Could not parse rdf file: %1"
 msgstr "Konnte RDF-Datei: %1 nicht parsen"
 
-#: plugin_manager.cc:572
+#: plugin_manager.cc:602
 msgid "LADSPA: cannot load module \"%1\" (%2)"
 msgstr "LADSPA: kann Modul \"%1\" nicht laden (%2)"
 
-#: plugin_manager.cc:579
+#: plugin_manager.cc:609
 msgid "LADSPA: module \"%1\" has no descriptor function."
 msgstr "LADSPA: Modul \"%1\" hat keine Beschreibungsfunktion."
 
-#: plugin_manager.cc:778
+#: plugin_manager.cc:813
 msgid "--- Windows VST plugins Scan: %1"
 msgstr "--- Windows VST plugins Scan: %1"
 
-#: plugin_manager.cc:784
+#: plugin_manager.cc:819
 msgid "VST"
 msgstr "VST"
 
-#: plugin_manager.cc:789
+#: plugin_manager.cc:824
 msgid "--- Windows VST plugins Scan Done"
 msgstr "--- Windows VST plugins Scan Fertig"
 
-#: plugin_manager.cc:804
+#: plugin_manager.cc:839
 msgid "cannot open dll"
 msgstr "kann dll  nicht öffnen"
 
-#: plugin_manager.cc:808
+#: plugin_manager.cc:843
 msgid "invalid dll, file too small"
 msgstr "Ungültige dll, Datei zu klein"
 
-#: plugin_manager.cc:812
+#: plugin_manager.cc:847
 msgid "not a dll"
 msgstr "keine dll"
 
-#: plugin_manager.cc:818
+#: plugin_manager.cc:853
 msgid "cannot determine dll type"
 msgstr "kann dll-Typ nicht ermitteln"
 
-#: plugin_manager.cc:822
+#: plugin_manager.cc:857
 msgid "cannot read dll PE header"
 msgstr "kann den dll-PE-Header nicht lesen"
 
-#: plugin_manager.cc:827
+#: plugin_manager.cc:862
 msgid "invalid dll PE header"
 msgstr "ungültiger dll-PE-Header"
 
-#: plugin_manager.cc:834
+#: plugin_manager.cc:869
 msgid "i386 (32-bit)"
 msgstr "i386 (32-bit)"
 
-#: plugin_manager.cc:837
+#: plugin_manager.cc:872
 msgid "Itanium"
 msgstr "Itanium"
 
-#: plugin_manager.cc:840
+#: plugin_manager.cc:875
 msgid "x64 (64-bit)"
 msgstr "x64 (64-bit)"
 
-#: plugin_manager.cc:843
+#: plugin_manager.cc:878
 msgid "Native Architecture"
 msgstr "Native Architektur"
 
-#: plugin_manager.cc:846
+#: plugin_manager.cc:881
 msgid "Unknown Architecture"
 msgstr "Unbekannte Architektur"
 
-#: plugin_manager.cc:862
+#: plugin_manager.cc:897
 msgid " *  %1 (cache only)"
 msgstr " *  %1 (nur Cache)"
 
-#: plugin_manager.cc:864
+#: plugin_manager.cc:899
 msgid " *  %1 - %2"
 msgstr " *  %1 - %2"
 
-#: plugin_manager.cc:878
+#: plugin_manager.cc:913
 msgid " -> Cannot get Windows VST information, plugin ignored."
 msgstr ""
 "Kann Windows VST Informationen nicht erhalten, Plugin \"%1\" wird ignoriert."
 
-#: plugin_manager.cc:889
+#: plugin_manager.cc:924
 msgid ""
 "VST plugin %1 does not support processReplacing, and cannot be used in %2 at "
 "this time"
@@ -1832,19 +1965,19 @@ msgstr ""
 "VST-Plugin %1 unterstützt kein processReplacing und kann zur Zeit nicht mit "
 "%2 benützt werden"
 
-#: plugin_manager.cc:924
+#: plugin_manager.cc:959
 msgid "Ignoring duplicate Windows VST plugin \"%1\""
 msgstr "Ignoriere Duplikat des Windows VST Plugins \"%1\""
 
-#: plugin_manager.cc:936
+#: plugin_manager.cc:971
 msgid " -> OK (VST Plugin \"%1\" was added)."
 msgstr " -> OK (VST Plugin \"%1\" hinzugefügt)."
 
-#: plugin_manager.cc:984
+#: plugin_manager.cc:1019
 msgid "LXVST"
 msgstr "LXVST"
 
-#: plugin_manager.cc:1011
+#: plugin_manager.cc:1046
 msgid ""
 "linuxVST plugin %1 does not support processReplacing, and so cannot be used "
 "in %2 at this time"
@@ -1852,15 +1985,15 @@ msgstr ""
 "linuxVST-Plugin %1 unterstützt kein processReplacing und kann daher zur Zeit "
 "nicht mit %2 benützt werden"
 
-#: plugin_manager.cc:1175
+#: plugin_manager.cc:1213
 msgid "unknown plugin status type \"%1\" - all entries ignored"
 msgstr "unbekannter Plugin-Statustyp \"%1\" - alle Einträge ignoriert"
 
-#: plugin_manager.cc:1192
+#: plugin_manager.cc:1232
 msgid "unknown plugin type \"%1\" - ignored"
 msgstr "unbekannter Plugintyp \"%1\" - ignoriert"
 
-#: port.cc:462
+#: port.cc:504
 msgid "could not reregister %1"
 msgstr "konnte %1 nicht erneut registrieren"
 
@@ -1877,7 +2010,7 @@ msgstr ""
 msgid "non-port insert XML used for port plugin insert"
 msgstr "Nicht-Port-Insert XML zum Einfügen eines Port-Plugin benutzt"
 
-#: port_manager.cc:285
+#: port_manager.cc:288
 msgid ""
 "a port with the name \"%1\" already exists: check for duplicated track/bus "
 "names"
@@ -1885,7 +2018,7 @@ msgstr ""
 "Ein Port mit Namen \"%1\" existiert bereits: Prüfen Sie auf doppelte Spur/"
 "Busnamen"
 
-#: port_manager.cc:287
+#: port_manager.cc:290
 msgid ""
 "No more ports are available. You will need to stop %1 and restart with more "
 "ports if you need this many tracks."
@@ -1893,27 +2026,27 @@ msgstr ""
 "Keine Ports mehr verfügbar. Wenn Sie so viele Spuren brauchen, müssen Sie %1 "
 "stoppen und mit mehr Ports neu starten."
 
-#: port_manager.cc:290
+#: port_manager.cc:293
 msgid "AudioEngine: cannot register port \"%1\": %2"
 msgstr "AudioEngine: kann Port \"%1\": %2 nicht registrieren"
 
-#: port_manager.cc:329
+#: port_manager.cc:332
 msgid "unable to create port: %1"
 msgstr "kann Port: %1 nicht erzeugen"
 
-#: port_manager.cc:416
+#: port_manager.cc:453
 msgid "AudioEngine: cannot connect %1 (%2) to %3 (%4)"
 msgstr "AudioEngine: kann %1 (%2) nicht mit %3 (%4) verbinden"
 
-#: port_manager.cc:468 port_manager.cc:469
+#: port_manager.cc:505 port_manager.cc:506
 msgid "Re-establising port %1 failed"
 msgstr "Portwiederherstellung fehlgeschlagen"
 
-#: processor.cc:214
+#: processor.cc:218
 msgid "No %1 property flag in element %2"
 msgstr "Kein Flag für Eigenschaft \"%1\" in Element %2"
 
-#: processor.cc:223
+#: processor.cc:227
 msgid "No child node with active property"
 msgstr "Kein Kindknoten mit der Eigenschaft \"aktiv\""
 
@@ -1977,123 +2110,113 @@ msgstr "Kann kürzlich geöffnete Projektdatei %1 nicht schreiben (%2)"
 msgid "Error writing saved template file %1 (%2)"
 msgstr "Kann gesicherte Vorlagendatei %1 nicht schreiben (%2)"
 
-#: region_factory.cc:78 region_factory.cc:120 region_factory.cc:161
-#: region_factory.cc:203
+#: region_factory.cc:78 region_factory.cc:121 region_factory.cc:162
+#: region_factory.cc:204
 msgid ""
 "programming error: RegionFactory::create() called with unknown Region type"
 msgstr ""
 "Programmierfehler: RegionFactory::create() mit unbekanntem Regionentyp "
 "aufgerufen"
 
-#: region_factory.cc:565
+#: region_factory.cc:566
 msgid "%1 compound-%2 (%3)"
 msgstr "%1 verbunden-%2 (%3)"
 
-#: region_factory.cc:567
+#: region_factory.cc:568
 msgid "%1 compound-%2.1 (%3)"
 msgstr "%1 verbunden-%2.1 (%3)"
 
-#: region_factory.cc:629
+#: region_factory.cc:630
 msgid "cannot create new name for region \"%1\""
 msgstr "kann keinen neuen Namen für Region \"%1\" erzeugen"
 
-#: resampled_source.cc:106
+#: resampled_source.cc:107
 msgid "Import: %1"
 msgstr "Import: %1"
 
-#: resampled_source.cc:135 srcfilesource.cc:75
+#: resampled_source.cc:136 srcfilesource.cc:75
 msgid "Import: src_new() failed : %1"
 msgstr "Import: Fehler in src_new() : %1"
 
-#: return.cc:41
+#: return.cc:42
 msgid "return %1"
 msgstr "Rückgabewert: %1"
 
-#: route.cc:841
-msgid "Cleared Explicit solo: %1\n"
-msgstr "Explizites Solo gelöscht: %1\n"
-
-#: route.cc:844
-msgid "Cleared Implicit solo: %1 up:%2 down:%3\n"
-msgstr "Implizites Solo gelöscht: %1 auf:%2 ab:%3\n"
-
-#: route.cc:1371 route.cc:2983
+#: route.cc:862 route.cc:2797
 msgid "unknown Processor type \"%1\"; ignored"
 msgstr "unbekannter Prozessortyp \"%1\"; ignoriert"
 
-#: route.cc:1393
+#: route.cc:884
 msgid "processor could not be created. Ignored."
 msgstr "Prozessor konnte nicht erzeugt werden. Ignoriert."
 
-#: route.cc:2406 route.cc:2631
+#: route.cc:2338 route.cc:2504
 msgid "Bad node sent to Route::set_state() [%1]"
 msgstr "Schlechter Knoten an Route::set_state() gesendet [%1]"
 
-#: route.cc:2466
+#: route.cc:2395
 msgid "Pannable state found for route (%1) without a panner!"
 msgstr "Pannerziel-Status für Route (%1) ohne Panner gefunden!"
 
-#: route.cc:2540 route.cc:2544 route.cc:2745 route.cc:2749
-msgid "badly formed order key string in state file! [%1] ... ignored."
-msgstr ""
-"schlecht geformte Zeichenkette für den Schlüssel der Sortierreihenfolge in "
-"der Projektdatei! [%1] ... ignoriert"
-
-#: route.cc:2755
-msgid "Converting deprecated order key for %1 using Editor order %2"
-msgstr ""
-"Konvertiere veralteten Sortierschlüssel für %1 unter Nutzung der "
-"Editorreihenfolge %2"
-
-#: route.cc:3389
+#: route.cc:3270
 msgid "Invalid Solo-Isolate propagation: from:%1 new:%2 - old:%3 = delta:%4"
 msgstr "Ungültige Solo-Isolate Propagierung: von:%1 neu:%2 - alt:%3 = delta:%4"
 
-#: route.cc:5308
+#: route.cc:4396
+msgid "Amp/Fader on Route '%1' went AWOL. Re-added."
+msgstr ""
+"Verstärker/Fader auf Route '%1' war nicht vorhanden. Wurde wieder "
+"hinzugefügt."
+
+#: route.cc:4994
 msgid "lo"
 msgstr "lo"
 
-#: route.cc:5310
+#: route.cc:4996
 msgid "mid"
 msgstr "mid"
 
-#: route.cc:5312
+#: route.cc:4998
 msgid "hi"
 msgstr "hi"
 
-#: route.cc:5419
+#: route.cc:5105
 msgid "Leveler"
 msgstr "Leveller"
 
-#: route.cc:5421
+#: route.cc:5107
 msgid "Compressor"
 msgstr "Kompressor"
 
-#: route.cc:5423
+#: route.cc:5109 route.cc:5111
 msgid "Limiter"
 msgstr "Limiter"
 
-#: route.cc:5426 route.cc:5428 route.cc:5444 route.cc:5446
+#: route.cc:5111
+msgid "Sidechain"
+msgstr "Sidechain"
+
+#: route.cc:5114 route.cc:5116 route.cc:5133 route.cc:5135
 msgid "???"
 msgstr "???"
 
-#: route.cc:5438
+#: route.cc:5126
 msgid "Attk"
 msgstr "Attk"
 
-#: route.cc:5440
+#: route.cc:5128
 msgid "Ratio"
 msgstr "Ratio"
 
-#: route.cc:5442
+#: route.cc:5131
 msgid "Rels"
 msgstr "Rels"
 
-#: route_group.cc:459
+#: route_group.cc:507
 msgid "You cannot subgroup MIDI tracks at this time"
 msgstr "MIDI-Spuren können zur Zeit nicht zu Subgruppen zusammengefasst werden"
 
-#: route_group.cc:466
+#: route_group.cc:514
 msgid ""
 "You cannot subgroup tracks with different number of outputs at this time."
 msgstr ""
@@ -2110,131 +2233,131 @@ msgstr ""
 msgid "error writing tempo-adjusted data to %1"
 msgstr "Fehler beim Schreiben der tempo-angepassten Daten nach %1"
 
-#: send.cc:61
+#: send.cc:62
 msgid "aux %1"
 msgstr "Aux %1"
 
-#: send.cc:65
+#: send.cc:66
 msgid "send %1"
 msgstr "Send %1"
 
-#: send.cc:67
+#: send.cc:68
 msgid "programming error: send created using role %1"
 msgstr "Programmierfehler: Send erzeugt mittels Rolle %1"
 
-#: session.cc:317 session.cc:366
+#: session.cc:348 session.cc:403
 msgid "Cannot connect to audio/midi engine"
 msgstr "Kann nicht zur Audio/MIDI Engine verbinden"
 
-#: session.cc:322
+#: session.cc:358
 msgid "Session initialization failed"
 msgstr "Projektinitialisierung gescheitert"
 
-#: session.cc:338
+#: session.cc:374
 msgid "Failed to load template/snapshot state"
 msgstr "Konnte Vorlagen/Schnappschussstatus nicht laden"
 
-#: session.cc:349
+#: session.cc:385
 msgid "Failed to load state"
 msgstr "Konnte Status nicht laden"
 
-#: session.cc:372
+#: session.cc:409
 msgid "Cannot configure audio/midi engine with session parameters"
 msgstr "Kann Audio/MIDI Engine nicht mit Projektparametern konfigurieren"
 
-#: session.cc:395
+#: session.cc:433
 msgid "Connect to engine"
 msgstr "Verbinde zur Engine"
 
-#: session.cc:446
+#: session.cc:484
 msgid "Session loading complete"
 msgstr "Laden des Projektes abgeschlossen"
 
-#: session.cc:517
+#: session.cc:575
 msgid "Set up LTC"
 msgstr "LTC einrichten"
 
-#: session.cc:519
+#: session.cc:577
 msgid "Set up Click"
 msgstr "Klick einrichten"
 
-#: session.cc:521
+#: session.cc:579
 msgid "Set up standard connections"
 msgstr "Richte Standard-Verbindungen ein"
 
-#: session.cc:768
+#: session.cc:888
 msgid "could not setup Click I/O"
 msgstr "konnte Metronom-E/A nicht einrichten"
 
-#: session.cc:831
+#: session.cc:951
 #, c-format
 msgid "out %s"
 msgstr "aus %s"
 
-#: session.cc:833
+#: session.cc:953
 #, c-format
 msgid "out %<PRIu32>"
 msgstr "out %<PRIu32>"
 
-#: session.cc:848
+#: session.cc:968
 #, c-format
 msgid "out %<PRIu32>+%<PRIu32>"
 msgstr "out %<PRIu32>+%<PRIu32>"
 
-#: session.cc:865
+#: session.cc:985
 #, c-format
 msgid "in %s"
 msgstr "in %s"
 
-#: session.cc:867
+#: session.cc:987
 #, c-format
 msgid "in %<PRIu32>"
 msgstr "in %<PRIu32>"
 
-#: session.cc:882
+#: session.cc:1002
 #, c-format
 msgid "in %<PRIu32>+%<PRIu32>"
 msgstr "in %<PRIu32>+%<PRIu32>"
 
-#: session.cc:962
+#: session.cc:1082
 msgid "cannot connect master output %1 to %2"
 msgstr "kann Master-Ausgang %1 nicht mit %2 verbinden"
 
-#: session.cc:1045
+#: session.cc:1170
 msgid "Cannot create monitor section. 'Monitor' Port name is not unique."
 msgstr ""
 "Kann keine Monitorsektion erzeugen. Der Portname 'Monitor' ist schon "
 "vergeben."
 
-#: session.cc:1079 session.cc:1205
+#: session.cc:1204 session.cc:1335
 msgid "cannot connect control input %1 to %2"
 msgstr "kann Kontrolleingang %1 nicht mit %2 verbinden"
 
-#: session.cc:1099 session.cc:1224
+#: session.cc:1224 session.cc:1354
 msgid "The preferred I/O for the monitor bus (%1) cannot be found"
 msgstr "Bevorzugte E/A für den Monitorbus (%1) kann nicht gefunden werden"
 
-#: session.cc:1130 session.cc:1255
+#: session.cc:1255 session.cc:1385
 msgid "cannot connect control output %1 to %2"
 msgstr "kann Kontrollausgang %1 nicht mit %2 verbinden"
 
-#: session.cc:1313
+#: session.cc:1443
 msgid "cannot create Auditioner: no auditioning of regions possible"
 msgstr ""
 "Kann das Vorhör-System nicht einrichten: kein Vorhören von Regionen möglich"
 
-#: session.cc:1514
+#: session.cc:1644
 msgid "Session: you can't use that location for auto punch (start <= end)"
 msgstr ""
 "Session: Sie können diese Position nicht für Auto-Punch verwenden (Start <= "
 "Ende) "
 
-#: session.cc:1541
+#: session.cc:1671
 msgid "Session: you can't use that location for session start/end)"
 msgstr ""
 "Projekt: Sie können diesen Zeitpunkt nicht als Projektanfang/ende benutzen"
 
-#: session.cc:1573
+#: session.cc:1703
 msgid ""
 "You cannot use this location for auto-loop because it has zero or negative "
 "length"
@@ -2242,31 +2365,31 @@ msgstr ""
 "Sie können diese Position nicht für \"automatische Schleife\" verwenden, da "
 "sie keine oder eine negative Länge hat"
 
-#: session.cc:1756
+#: session.cc:1886
 msgid "programming error: session range removed!"
 msgstr "Programmierfehler: Projektbereich entfernt!"
 
-#: session.cc:2016
+#: session.cc:2158
 msgid "feedback loop setup between %1 and %2"
 msgstr "Feedbackschleife zwischen %1 und %2 erkannt"
 
-#: session.cc:2276
+#: session.cc:2419
 msgid "Track "
 msgstr "Spur "
 
-#: session.cc:2278
+#: session.cc:2421
 msgid "Audio "
 msgstr "Audio "
 
-#: session.cc:2283
+#: session.cc:2426
 msgid "MIDI "
 msgstr "MIDI"
 
-#: session.cc:2358
+#: session.cc:2500
 msgid "Session: could not create new midi track."
 msgstr "Session: konnte keine neue MIDI-Spur erzeugen."
 
-#: session.cc:2364
+#: session.cc:2506
 msgid ""
 "No more JACK ports are available. You will need to stop %1 and restart JACK "
 "with more ports if you need this many tracks."
@@ -2274,81 +2397,93 @@ msgstr ""
 "Keine JACK-Ports mehr verfügbar. Wenn Sie so viele Spuren benötigen, müssen "
 "Sie %1 stoppen und JACK mit mehr Ports neu starten."
 
-#: session.cc:2884 session.cc:2892 session.cc:2976 session.cc:2984
+#: session.cc:2547 session.cc:2550
+msgid "Midi Bus"
+msgstr "MIDI Bus"
+
+#: session.cc:2572
+msgid "cannot configure new midi bus input"
+msgstr "kann neuen MIDI-Buseingang nicht konfigurieren"
+
+#: session.cc:2578
+msgid "cannot configure new midi bus output"
+msgstr "kann neuen MIDI-Busausgang nicht konfigurieren"
+
+#: session.cc:2592 session.cc:3137
+msgid "Session: could not create new audio route."
+msgstr "Session: konnte keine neueAudio-Route  erzeugen"
+
+#: session.cc:3022 session.cc:3030 session.cc:3113 session.cc:3121
 msgid "cannot configure %1 in/%2 out configuration for new audio track"
 msgstr "kann %1 ein/%2 aus für neue Audiospur nicht konfigurieren"
 
-#: session.cc:2917
+#: session.cc:3050
 msgid "Session: could not create new audio track."
 msgstr "Session: konnte keine neue Audiospur erzeugen"
 
-#: session.cc:2954 session.cc:2957
+#: session.cc:3088 session.cc:3091
 msgid "Bus"
 msgstr "Bus"
 
-#: session.cc:3009
-msgid "Session: could not create new audio route."
-msgstr "Session: konnte keine neueAudio-Route  erzeugen"
-
-#: session.cc:3082 session.cc:3092
+#: session.cc:3207 session.cc:3217
 msgid "Session: UINT_MAX routes? impossible!"
 msgstr "Session: UINT_MAX Routen? unmöglich!"
 
-#: session.cc:3125
+#: session.cc:3293
 msgid "Session: cannot create track/bus from template description"
 msgstr "Session: Kann die Route aus der Vorlagenbeschreibung nicht erzeugen"
 
-#: session.cc:3168
+#: session.cc:3331
 msgid "Session: could not create new route from template"
 msgstr "Session: konnte keine neue Route aus der Vorlage erzeugen."
 
-#: session.cc:3202
+#: session.cc:3365
 msgid "Adding new tracks/busses failed"
 msgstr "Fehler beim Hinzufügen neuer Spuren/Busse"
 
-#: session.cc:4440
+#: session.cc:4784
 msgid "Merging embedded file %1: name collision AND md5 hash collision!"
 msgstr ""
 "Zusammenführen der eingebetteten Datei %1: Namenskollision UND md5 hash "
 "Kollision!"
 
-#: session.cc:4570 session.cc:4643
+#: session.cc:4914 session.cc:4987
 msgid "There are already %1 recordings for %2, which I consider too many."
 msgstr "Es gibt bereits %1 Aufnahmen für %2, was ich als zu viele erachte."
 
-#: session.cc:5085
+#: session.cc:5663
 msgid "send ID %1 appears to be in use already"
 msgstr "Send ID %1 ist offenbar schon in Gebrauch"
 
-#: session.cc:5097
+#: session.cc:5675
 msgid "aux send ID %1 appears to be in use already"
 msgstr "Aux-Send ID %1 ist offenbar schon in Gebrauch"
 
-#: session.cc:5109
+#: session.cc:5687
 msgid "return ID %1 appears to be in use already"
 msgstr "Return ID %1 ist offenbar schon in Gebrauch"
 
-#: session.cc:5121
+#: session.cc:5699
 msgid "insert ID %1 appears to be in use already"
 msgstr "Insert ID %1 ist offenbar schon in Gebrauch"
 
-#: session.cc:5246
+#: session.cc:5825
 msgid "Cannot write a range where end <= start (e.g. %1 <= %2)"
 msgstr "Kann einen Bereich mit Ende <= Start nicht schreiben (z.B. %1 <= %2)"
 
-#: session.cc:5255
+#: session.cc:5834
 msgid "Cannot write a range with no data."
 msgstr "Kann einen Bereich ohne Daten nicht schreiben."
 
-#: session.cc:5297
+#: session.cc:5876
 msgid "cannot create new file \"%1\" for %2"
 msgstr "Kann neue Datei \"%1\" für %2 nicht erzeugen"
 
-#: session_click.cc:163
+#: session_click.cc:162
 msgid "cannot open click soundfile %1 (%2)"
 msgstr "kann Metronom-Audiodatei %1 nicht öffnen (%2)"
 
-#: session_click.cc:176
+#: session_click.cc:175
 msgid "cannot read data from click soundfile"
 msgstr "kann Daten der Metronom-Audiodatei nicht lesen"
 
@@ -2426,11 +2561,11 @@ msgstr ""
 "Session: zwei Ereignisse des Typs %1 können nicht im selben Frame existieren "
 "(%2)."
 
-#: session_export.cc:125
+#: session_export.cc:152
 msgid "%1: cannot seek to %2 for export"
 msgstr "%1: kann für Export nicht Dateiposition %2 aufsuchen"
 
-#: session_export.cc:182
+#: session_export.cc:216
 msgid "Export ended unexpectedly: %1"
 msgstr "Export endet unerwartet: %1"
 
@@ -2442,11 +2577,11 @@ msgstr ""
 "LTC-Kodierer: ungültige Framerate - das Kodieren von LTC wird für den "
 "restlichen Teil dieses Projekts ausgesetzt."
 
-#: session_midi.cc:534
+#: session_midi.cc:570
 msgid "Session: cannot send quarter-frame MTC message (%1)"
 msgstr "Session: kann quarter-frame MTC-Nachricht nicht senden (%1)"
 
-#: session_playlists.cc:402 session_playlists.cc:421
+#: session_playlists.cc:405 session_playlists.cc:424
 msgid "Session: cannot create Playlist from XML description."
 msgstr "Session: kann Wiedergabeliste nicht aus der XML-Beschreibung erzeugen"
 
@@ -2454,105 +2589,105 @@ msgstr "Session: kann Wiedergabeliste nicht aus der XML-Beschreibung erzeugen"
 msgid "Session: error in no roll for %1"
 msgstr "Session: Fehler in no_roll für %1"
 
-#: session_process.cc:1199
+#: session_process.cc:1202
 msgid "Programming error: illegal event type in process_event (%1)"
 msgstr "Programmierfehler: illegaler Ereignistyp in process_event (%1)"
 
-#: session_state.cc:187
+#: session_state.cc:194
 msgid "solo cut control (dB)"
 msgstr "Solo Cut Einstellung (dB)"
 
-#: session_state.cc:209
+#: session_state.cc:216
 msgid "Set block size and sample rate"
 msgstr "Setze Blockgröße und Samplerate"
 
-#: session_state.cc:214
+#: session_state.cc:221
 msgid "Using configuration"
 msgstr "Benutze Konfiguration"
 
-#: session_state.cc:339
+#: session_state.cc:348
 msgid "Reset Remote Controls"
 msgstr "Fernbedienungen zurücksetzen"
 
-#: session_state.cc:368 session_state.cc:400
+#: session_state.cc:377 session_state.cc:409
 msgid "Filling playback buffers"
 msgstr "Fülle Wiedergabepuffer"
 
-#: session_state.cc:466
+#: session_state.cc:475
 msgid "Session: cannot create session peakfile folder \"%1\" (%2)"
 msgstr "Session: kann den Peakfile Ordner \"%1\" nicht erzeugen (%2)"
 
-#: session_state.cc:473
+#: session_state.cc:482
 msgid "Session: cannot create session sounds dir \"%1\" (%2)"
 msgstr ""
 "Session: kann das Projektverzeichnis für Sounddateien \"%1\" nicht erzeugen "
 "(%2)"
 
-#: session_state.cc:480
+#: session_state.cc:489
 msgid "Session: cannot create session midi dir \"%1\" (%2)"
 msgstr ""
 "Session: kann das Projektverzeichnis für MIDI \"%1\" nicht erzeugen (%2)"
 
-#: session_state.cc:487
+#: session_state.cc:496
 msgid "Session: cannot create session dead sounds folder \"%1\" (%2)"
 msgstr "Session: kann den Mülleimer des Projektes \"%1\" nicht erzeugen (%2)"
 
-#: session_state.cc:494
+#: session_state.cc:503
 msgid "Session: cannot create session export folder \"%1\" (%2)"
 msgstr ""
 "Session: kann den Projektordner für Exportdateien \"%1\" nicht erzeugen (%2)"
 
-#: session_state.cc:501
+#: session_state.cc:510
 msgid "Session: cannot create session analysis folder \"%1\" (%2)"
 msgstr ""
 "Session: kann den Projektordner für Analysedaten \"%1\" nicht erzeugen (%2)"
 
-#: session_state.cc:508
+#: session_state.cc:517
 msgid "Session: cannot create session plugins folder \"%1\" (%2)"
 msgstr "Session: kann den Projektordner für Plugins \"%1\" nicht erzeugen (%2)"
 
-#: session_state.cc:515
+#: session_state.cc:524
 msgid "Session: cannot create session externals folder \"%1\" (%2)"
 msgstr ""
 "Session: kann den Projektordner für Externals \"%1\" nicht erzeugen (%2)"
 
-#: session_state.cc:529
+#: session_state.cc:538
 msgid "Session: cannot create session folder \"%1\" (%2)"
 msgstr "Session: kann den Projektordner \"%1\" nicht erzeugen (%2)"
 
-#: session_state.cc:560
+#: session_state.cc:569
 msgid "Error reading session template file %1 (%2)"
 msgstr "Fehler beim Lesen der Projektvorlagendatei %1 (%2)"
 
-#: session_state.cc:575
+#: session_state.cc:584
 msgid "Error writing session template file %1 (%2)"
 msgstr "Fehler beim Schreiben der Projektvorlagendatei %1 (%2)"
 
-#: session_state.cc:592
+#: session_state.cc:601
 msgid "Could not open %1 for writing session template"
 msgstr "Konnte %1 nicht zum Schreiben der Projektvorlage öffnen"
 
-#: session_state.cc:599
+#: session_state.cc:608
 msgid "Could not open session template %1 for reading"
 msgstr "Konnte Projektvorlage %1 nicht zum Lesen öffnen"
 
-#: session_state.cc:617
+#: session_state.cc:626
 msgid "Loop"
 msgstr "Schleife"
 
-#: session_state.cc:698
+#: session_state.cc:707
 msgid "Could not remove pending capture state at path \"%1\" (%2)"
 msgstr "Konnte vorläufigen Aufnahmestatus im Pfad \"%1\" nicht entfernen (%2)"
 
-#: session_state.cc:722
+#: session_state.cc:731
 msgid "could not rename snapshot %1 to %2 (%3)"
 msgstr "Konnte  Schnappschuss %1 nicht auf %2 umbenennen (%3)"
 
-#: session_state.cc:750
+#: session_state.cc:759
 msgid "Could not remove session file at path \"%1\" (%2)"
 msgstr "Konnte Projektdatei im Pfad \"%1\" nicht entfernen (%2)"
 
-#: session_state.cc:777
+#: session_state.cc:788
 msgid ""
 "the %1 audio engine is not connected and state saving would lose all I/O "
 "connections. Session not saved"
@@ -2560,148 +2695,148 @@ msgstr ""
 "die %1 Audio-Engine ist nicht verbunden, beim Sichern würden Sie daher alle "
 "E/A-Verbindungen verlieren. Projekt nicht gesichert"
 
-#: session_state.cc:841
+#: session_state.cc:856
 msgid "state could not be saved to %1"
 msgstr "Status konnte nicht nach %1 gesichert werden"
 
-#: session_state.cc:843 session_state.cc:856
+#: session_state.cc:858 session_state.cc:871
 msgid "Could not remove temporary session file at path \"%1\" (%2)"
 msgstr "Konnte temporäre Projektdatei im Pfad \"%1\" nicht entfernen (%2)"
 
-#: session_state.cc:853
+#: session_state.cc:868
 msgid "could not rename temporary session file %1 to %2 (%3)"
 msgstr "konnte temporäre Projektdatei %1 nicht nach %2 umbenennen(%3)"
 
-#: session_state.cc:923
+#: session_state.cc:942
 msgid "%1: session file \"%2\" doesn't exist!"
 msgstr "%1: Projektdatei \"%2\" existiert nicht!"
 
-#: session_state.cc:935
+#: session_state.cc:954
 msgid "Could not understand session file %1"
 msgstr "Konnte Projektdatei \"%1\" nicht verstehen"
 
-#: session_state.cc:944
+#: session_state.cc:963
 msgid "Session file %1 is not a session"
 msgstr "Projektdatei %1 ist kein Projekt"
 
-#: session_state.cc:1273
+#: session_state.cc:1332
 msgid "programming error: Session: incorrect XML node sent to set_state()"
 msgstr ""
 "Programmierfehler: Session: Inkorrekter XML-Knoten an send_state() gesendet"
 
-#: session_state.cc:1327
+#: session_state.cc:1410
 msgid "Session: XML state has no options section"
 msgstr "Session: XML hat keinen Abschnitt \"options\""
 
-#: session_state.cc:1332
+#: session_state.cc:1415
 msgid "Session: XML state has no metadata section"
 msgstr "Session: XML hat keinen Abschnitt \"metadata\""
 
-#: session_state.cc:1343
+#: session_state.cc:1426
 msgid "Session: XML state has no sources section"
 msgstr "Session: XML hat keinen Abschnitt \"sources\""
 
-#: session_state.cc:1350
+#: session_state.cc:1433
 msgid "Session: XML state has no Tempo Map section"
 msgstr "Session: XML hat keinen Abschnitt \"Tempo Map\""
 
-#: session_state.cc:1357
+#: session_state.cc:1440
 msgid "Session: XML state has no locations section"
 msgstr "Session: XML hat keinen Abschnitt \"locations\""
 
-#: session_state.cc:1370
+#: session_state.cc:1453
 msgid "Session: XML state has no Regions section"
 msgstr "Session: XML hat keinen Abschnitt \"Regions\""
 
-#: session_state.cc:1377
+#: session_state.cc:1460
 msgid "Session: XML state has no playlists section"
 msgstr "Session: XML hat keinen Abschnitt \"playlists\""
 
-#: session_state.cc:1397
+#: session_state.cc:1480
 msgid "Session: XML state has no bundles section"
 msgstr "Session: XML hat keinen Abschnitt \"bundles\""
 
-#: session_state.cc:1409
+#: session_state.cc:1492
 msgid "Session: XML state has no diskstreams section"
 msgstr "Session: XML hat keinen Abschnitt \"diskstreams\""
 
-#: session_state.cc:1417
+#: session_state.cc:1504
 msgid "Session: XML state has no routes section"
 msgstr "Session: XML hat keinen Abschnitt \"routes\""
 
-#: session_state.cc:1429
+#: session_state.cc:1520
 msgid "Session: XML state has no route groups section"
 msgstr "Session: XML hat keinen Abschnitt \"route groups\""
 
-#: session_state.cc:1438
+#: session_state.cc:1529
 msgid "Session: XML state has no edit groups section"
 msgstr "Session: XML hat keinen Abschnitt \"edit groups\""
 
-#: session_state.cc:1445
+#: session_state.cc:1536
 msgid "Session: XML state has no mix groups section"
 msgstr "Session: XML hat keinen Abschnitt \"mix groups\""
 
-#: session_state.cc:1453
+#: session_state.cc:1544
 msgid "Session: XML state has no click section"
 msgstr "Session: XML hat keinen Abschnitt \"click\""
 
-#: session_state.cc:1500
+#: session_state.cc:1606
 msgid "Session: cannot create Route from XML description."
 msgstr "Session: Kann die Route aus der XML-Beschreibung nicht erzeugen"
 
-#: session_state.cc:1504
+#: session_state.cc:1610
 msgid "Loaded track/bus %1"
 msgstr "Spur/Bus %1 wurde geladen"
 
-#: session_state.cc:1509
+#: session_state.cc:1615
 msgid "Tracks/busses loaded;  Adding to Session"
 msgstr "Spuren/Busse geladen; Füge sie dem Projekt hinzu"
 
-#: session_state.cc:1513
+#: session_state.cc:1619
 msgid "Finished adding tracks/busses"
 msgstr "Hinzufügen der Spuren/Busse abgeschlossen"
 
-#: session_state.cc:1612
+#: session_state.cc:1709
 msgid "Could not find diskstream for route"
 msgstr "Konnte Diskstream für Route nicht finden"
 
-#: session_state.cc:1672
+#: session_state.cc:1760
 msgid "Session: cannot create Region from XML description."
 msgstr "Session: kann Region nicht aus XML-Beschreibung erzeugen"
 
-#: session_state.cc:1676
+#: session_state.cc:1764
 msgid "Can not load state for region '%1'"
 msgstr "Kann Status für Region '%1' nicht laden"
 
-#: session_state.cc:1712
+#: session_state.cc:1800
 msgid "Regions in compound description not found (ID's %1 and %2): ignored"
 msgstr ""
 "Regionen der Verbindungsbeschreibung nicht gefunden (IDs %1 and %2): "
 "ignoriert"
 
-#: session_state.cc:1740
+#: session_state.cc:1828
 msgid "Nested source has no ID info in session file! (ignored)"
 msgstr ""
 "Verschachtelte Quelle hat keine ID-Information in Projektdatei! (ignoriert)"
 
-#: session_state.cc:1752
+#: session_state.cc:1840
 msgid "Cannot reconstruct nested source for region %1"
 msgstr "Kann verschachtelte Quelle für Region %1 nicht wiederherstellen"
 
-#: session_state.cc:1814
+#: session_state.cc:1902
 msgid "Session: XMLNode describing a AudioRegion is incomplete (no source)"
 msgstr ""
 "Session: XML-Knoten zur Beschreibung einer Audioregion ist unvollständig "
 "(Quelle fehlt)"
 
-#: session_state.cc:1822 session_state.cc:1843 session_state.cc:1863
+#: session_state.cc:1910 session_state.cc:1931 session_state.cc:1951
 msgid ""
 "Session: XMLNode describing a AudioRegion references an unknown source id =%1"
 msgstr ""
 "Session: XML-Knoten zur Beschreibung einer Audioregion referenziert eine "
 "unbekannte Quell-ID =%1"
 
-#: session_state.cc:1828 session_state.cc:1849 session_state.cc:1869
+#: session_state.cc:1916 session_state.cc:1937 session_state.cc:1957
 msgid ""
 "Session: XMLNode describing a AudioRegion references a non-audio source id ="
 "%1"
@@ -2709,7 +2844,7 @@ msgstr ""
 "Session: XML-Knoten zur Beschreibung einer Audioregion referenziert eine "
 "Nicht-Audio Quell-ID =%1"
 
-#: session_state.cc:1892
+#: session_state.cc:1980
 msgid ""
 "Session: XMLNode describing an AudioRegion is missing some master sources; "
 "ignored"
@@ -2717,31 +2852,31 @@ msgstr ""
 "Session: dem XML-Knoten zur Beschreibung einer Audioregion fehlen einige "
 "Hauptquellen; ignoriert"
 
-#: session_state.cc:1926
+#: session_state.cc:2014
 msgid "Session: XMLNode describing a MidiRegion is incomplete (no source)"
 msgstr ""
 "Session: XML-Knoten zur Beschreibung einer MIDI-Region ist unvollständig "
 "(Quelle fehlt)"
 
-#: session_state.cc:1934
+#: session_state.cc:2022
 msgid ""
 "Session: XMLNode describing a MidiRegion references an unknown source id =%1"
 msgstr ""
 "Session: XML-Knoten zur Beschreibung einer MIDI-Region referenziert eine "
 "unbekannte Quell-ID =%1"
 
-#: session_state.cc:1940
+#: session_state.cc:2028
 msgid ""
 "Session: XMLNode describing a MidiRegion references a non-midi source id =%1"
 msgstr ""
 "Session: XML-Knoten zur Beschreibung einer MIDI-Region referenziert eine "
 "Nicht-MIDI Quell-ID =%1"
 
-#: session_state.cc:2013
+#: session_state.cc:2101
 msgid "Session: cannot create Source from XML description."
 msgstr "Session: Kann Quelle aus der XML-Beschreibung nicht erzeugen"
 
-#: session_state.cc:2021
+#: session_state.cc:2109
 msgid ""
 "A external MIDI file is missing. %1 cannot currently recover from missing "
 "external MIDI files"
@@ -2749,41 +2884,41 @@ msgstr ""
 "Eine externe MIDI-Datei fehlt, %1 kann zur Zeit mit fehlenden externen MIDI-"
 "Dateien nicht umgehen"
 
-#: session_state.cc:2103
+#: session_state.cc:2191
 msgid "Found a sound file that cannot be used by %1. Talk to the programmers."
 msgstr ""
 "Eine nicht mit %1 benutzbare Audiodatei wurde gefunden. Sprechen Sie mit den "
 "Programmierern."
 
-#: session_state.cc:2124
+#: session_state.cc:2212
 msgid "Could not create templates directory \"%1\" (%2)"
 msgstr "Konnte Vorlagenverzeichnis \"%1\" nicht erzeugen (%2)"
 
-#: session_state.cc:2136
+#: session_state.cc:2224
 msgid "Template \"%1\" already exists - new version not created"
 msgstr "Vorlage \"%1\" existiert bereits - neue Version wurde nicht erzeugt"
 
-#: session_state.cc:2142
+#: session_state.cc:2230
 msgid "Could not create directory for Session template\"%1\" (%2)"
 msgstr "Konnte kein Verzeichnis für Projektvorlage \"%1\" erzeugen (%2)"
 
-#: session_state.cc:2171
+#: session_state.cc:2259
 msgid "template not saved"
 msgstr "Vorlage nicht gesichert"
 
-#: session_state.cc:2413
+#: session_state.cc:2501
 msgid "Unknown node \"%1\" found in Bundles list from session file"
 msgstr "Unbekannter Knoten \"%1\" in Bündelliste der Projektdatei gefunden"
 
-#: session_state.cc:2869
+#: session_state.cc:2969
 msgid "Cannot cleanup peak-files for read-only session."
 msgstr "Kann Peakdateien für Nur-Lese Projekt nicht aufräumen"
 
-#: session_state.cc:2873
+#: session_state.cc:2973
 msgid "Cannot cleanup peak-files while recording"
 msgstr "Kann Peakdateien während Aufnahme nicht aufräumen"
 
-#: session_state.cc:2896
+#: session_state.cc:2996
 msgid ""
 "Timeout waiting for peak-file creation to terminate before cleanup, please "
 "try again later."
@@ -2791,91 +2926,91 @@ msgstr ""
 "Timeout beim Warten darauf, daß die Peakdatei-Erzeugung vor dem Aufräumen "
 "abgeschlossen wird, bitte versuchen Sie es später noch einmal."
 
-#: session_state.cc:3121
+#: session_state.cc:3261
 msgid "Session: cannot create dead file folder \"%1\" (%2)"
 msgstr "Session: kann den Mülleimer \"%1\" nicht erzeugen (%2)"
 
-#: session_state.cc:3160
+#: session_state.cc:3296
 msgid "cannot rename unused file source from %1 to %2 (%3)"
 msgstr "kann unbenutzte Dateiquelle nicht von %1 nach %2 umbenennen (%3)"
 
-#: session_state.cc:3178
+#: session_state.cc:3312
 msgid "cannot remove peakfile %1 for %2 (%3)"
 msgstr "kann Peakdatei %1 für %2 nicht entfernen (%3)"
 
-#: session_state.cc:3495
+#: session_state.cc:3633
 msgid "could not backup old history file, current history not saved"
 msgstr ""
 "konnte kein Backup der alten Aktionsliste erstellen, momentane Aktionsliste "
 "ungesichert"
 
-#: session_state.cc:3504
+#: session_state.cc:3642
 msgid "history could not be saved to %1"
 msgstr "Aktionsliste konnte nicht nach %1 gesichert werden"
 
-#: session_state.cc:3507
+#: session_state.cc:3645
 msgid "Could not remove history file at path \"%1\" (%2)"
 msgstr "Konnte Aktionslistendatei im Pfad \"%1\" nicht entfernen (%2)"
 
-#: session_state.cc:3511
+#: session_state.cc:3649
 msgid "could not restore history file from backup %1 (%2)"
 msgstr "konnte Aktionslistendatei nicht aus dem Backup %1 restaurieren (%2)"
 
-#: session_state.cc:3536
+#: session_state.cc:3674
 msgid "%1: no history file \"%2\" for this session."
 msgstr "%1: keine Aktionslistendatei \"%2\" für dieses Projekt."
 
-#: session_state.cc:3542
+#: session_state.cc:3680
 msgid "Could not understand session history file \"%1\""
 msgstr "Konnte Projekt-Aktionslistendatei \"%1\" nicht verstehen"
 
-#: session_state.cc:3584
+#: session_state.cc:3722
 msgid "Failed to downcast MidiSource for NoteDiffCommand"
 msgstr "MidiSource für NoteDiffCommand nicht auffindbar"
 
-#: session_state.cc:3595
+#: session_state.cc:3733
 msgid "Failed to downcast MidiSource for SysExDiffCommand"
 msgstr "MidiSource für SysExDiffCommand nicht auffindbar"
 
-#: session_state.cc:3606
+#: session_state.cc:3744
 msgid "Failed to downcast MidiSource for PatchChangeDiffCommand"
 msgstr "MidiSource für PatchChangeDiffCommand nicht auffindbar"
 
-#: session_state.cc:3614
+#: session_state.cc:3752
 msgid "Couldn't figure out how to make a Command out of a %1 XMLNode."
 msgstr "Konnte im XML-Knoten \"%1\" keinen Befehl erkennen."
 
-#: session_state.cc:3852
+#: session_state.cc:3990
 msgid "Session: unknown diskstream type in XML"
 msgstr "Session: Unbekannter Diskstream  im XML"
 
-#: session_state.cc:3857
+#: session_state.cc:3995
 msgid "Session: could not load diskstream via XML state"
 msgstr "Session: konnte Diskstream nicht via XML-Status laden"
 
-#: session_state.cc:3954
+#: session_state.cc:4092
 msgid "Cannot rename read-only session."
 msgstr "Kann Nur-Lese Projekt nicht umbenennen"
 
-#: session_state.cc:3958
+#: session_state.cc:4096
 msgid "Cannot rename session while recording"
 msgstr "Kann Projekt während Aufnahme nicht umbenennen"
 
-#: session_state.cc:4043 session_state.cc:4044 session_state.cc:4086
-#: session_state.cc:4090
+#: session_state.cc:4181 session_state.cc:4182 session_state.cc:4224
+#: session_state.cc:4228
 msgid "renaming %s as %2 failed (%3)"
 msgstr "umbenennen von %s in %2 gescheitert (%3)"
 
-#: session_state.cc:4106 session_state.cc:4107 session_state.cc:4121
-#: session_state.cc:4122
+#: session_state.cc:4244 session_state.cc:4245 session_state.cc:4259
+#: session_state.cc:4260
 msgid "renaming %1 as %2 failed (%3)"
 msgstr "umbenennen von %1 in %2 gescheitert (%3)"
 
-#: session_state.cc:4431
+#: session_state.cc:4571
 msgid "Cannot create new session folder %1"
 msgstr "Kann den neuen Projektordner \"%1\" nicht erzeugen"
 
-#: session_state.cc:4493 session_state.cc:4568
+#: session_state.cc:4633 session_state.cc:4708
 msgid ""
 "\n"
 "copying \"%1\" failed !"
@@ -2883,7 +3018,7 @@ msgstr ""
 "\n"
 "kopieren von \"%1\" fehlgeschlagen !"
 
-#: session_state.cc:4766
+#: session_state.cc:4906
 msgid "unknown reason"
 msgstr "unbekannter Grund"
 
@@ -2895,7 +3030,7 @@ msgstr "Unbekannter Transportstatus %1 im Sync-Callback"
 msgid "Cannot loop - no loop range defined"
 msgstr "Kann nicht loopen - kein Schleifenbereich definieert"
 
-#: session_transport.cc:956
+#: session_transport.cc:968
 msgid ""
 "Seamless looping cannot be supported while %1 is using JACK transport.\n"
 "Recommend changing the configured options"
@@ -2904,11 +3039,11 @@ msgstr ""
 "benutzt.\n"
 "Ändern Sie die Konfigurationsoption"
 
-#: session_transport.cc:1038
+#: session_transport.cc:1050
 msgid "Locate called for negative sample position - ignored"
 msgstr "Locate für negative Sample-Position aufgerufen - ignoriert"
 
-#: session_transport.cc:1392
+#: session_transport.cc:1401
 msgid ""
 "Global varispeed cannot be supported while %1 is connected to JACK transport "
 "control"
@@ -2916,6 +3051,10 @@ msgstr ""
 "Globales Varispeed ist nicht möglich, solange %1 mit JACK Transport "
 "verbunden ist."
 
+#: slavable.cc:100
+msgid "Master #%1 not found, assignment lost"
+msgstr "Master #%1 nicht gefunden, Zuordnung verloren"
+
 #: smf_source.cc:350
 msgid "Unable to read event prefix, corrupt MIDI ring"
 msgstr "Kann Ereignisprefix nicht lesen, korrupter MIDI-Ringbuffer"
@@ -3128,12 +3267,20 @@ msgstr ""
 msgid "SndFileSource: cannot open file \"%1\" for reading"
 msgstr "SndFileSource: kann Datei \"%1\" nicht zum Lesen öffnen"
 
+#: solo_control.cc:199
+msgid "Cleared Explicit solo: %1\n"
+msgstr "Explizites Solo gelöscht: %1\n"
+
+#: solo_control.cc:202
+msgid "Cleared Implicit solo: %1 up:%2 down:%3\n"
+msgstr "Implizites Solo gelöscht: %1 auf:%2 ab:%3\n"
+
 #: soundcloud_upload.cc:129
 msgid ""
 "Upload to Soundcloud failed.  Perhaps your email or password are incorrect?\n"
 msgstr ""
 "Das Hochladen nach Soundcloud ist gescheitert. Vielleicht sind E-mail-"
-"Adresse oder Passwort falsch?"
+"Adresse oder Passwort falsch?\n"
 
 #: source_factory.cc:390
 msgid "Recovery attempted on a MIDI file - not implemented"
@@ -3160,44 +3307,70 @@ msgstr "video_server_dialog.cc:140"
 msgid "Cannot compile tape track regexp for use (%1)"
 msgstr "Kann regulären Ausdruck der Bandspur nicht zum Gebrauch auswerten (%1)"
 
-#: tempo.cc:80
-msgid "TempoSection XML node has no \"start\" property"
-msgstr "TempoSection: XML-Knoten hat keine Eigenschaft \"start\""
+#: tempo.cc:98
+msgid "Legacy session detected. TempoSection XML node will be altered."
+msgstr ""
+"Altes Projekt entdeckt. XML-Knoten für TempoSection wird nicht verändert."
+
+#: tempo.cc:104
+msgid "TempoSection XML node has an illegal \"pulse\" value"
+msgstr "XML-Knoten für TempoSection enthält einen illegalen Wert für \"pulse\""
 
-#: tempo.cc:88
-msgid "TempoSection XML node has an illegal \"start\" value"
-msgstr "TempoSection: XML-Knoten hat unzulässigen Wert für \"start\""
+#: tempo.cc:112
+msgid "TempoSection XML node has an illegal \"frame\" value"
+msgstr "XML-Knoten für TempoSection enthält einen illegalen Wert für \"frame\""
 
-#: tempo.cc:95
+#: tempo.cc:119
 msgid "TempoSection XML node has no \"beats-per-minute\" property"
 msgstr "TempoSection: XML-Knoten hat keine Eigenschaft \"beats-per-minute\""
 
-#: tempo.cc:100
+#: tempo.cc:124
 msgid "TempoSection XML node has an illegal \"beats_per_minute\" value"
 msgstr ""
 "TempoSection: XML-Knoten hat unzulässigen Wert für \"beats_per_minute\""
 
-#: tempo.cc:109
+#: tempo.cc:133
 msgid "TempoSection XML node has an illegal \"note-type\" value"
 msgstr "TempoSection: XML-Knoten hat unzulässigen Wert für \"note-type\""
 
-#: tempo.cc:115
+#: tempo.cc:139
 msgid "TempoSection XML node has no \"movable\" property"
 msgstr "TempoSection: XML-Knoten hat keine Eigenschaft \"movable\""
 
-#: tempo.cc:125
-msgid "TempoSection XML node has an illegal \"bar-offset\" value"
-msgstr "TempoSection: XML-Knoten hat unzulässigen Wert für \"bar-offset\""
-
-#: tempo.cc:202
-msgid "MeterSection XML node has no \"start\" property"
-msgstr "MeterSection: XML-Knoten hat keine Eigenschaft \"start\""
+#: tempo.cc:146
+msgid "TempoSection XML node has no \"active\" property"
+msgstr "XML-Knoten für TempoSection enthält keine Eigenschaft \"active\""
 
-#: tempo.cc:210
+#: tempo.cc:471
 msgid "MeterSection XML node has an illegal \"start\" value"
 msgstr "MeterSection: XML-Knoten hat unzulässigen Wert für \"start\""
 
-#: tempo.cc:220
+#: tempo.cc:474
+msgid "Legacy session detected - MeterSection XML node will be altered."
+msgstr ""
+"Altes Projekt entdeckt. XML-Knoten für MeterSection wird nicht verändert."
+
+#: tempo.cc:481
+msgid "MeterSection XML node has an illegal \"pulse\" value"
+msgstr "XML-Knoten für MeterSection enthält einen illegalen Wert für \"pulse\""
+
+#: tempo.cc:488
+msgid "MeterSection XML node has an illegal \"beat\" value"
+msgstr "XML-Knoten für MeterSection enthält einen illegalen Wert für \"beat\""
+
+#: tempo.cc:495
+msgid "MeterSection XML node has no \"bbt\" property"
+msgstr "XML-Knoten für MeterSection enthält  keine Eigenschaft \"bbt\""
+
+#: tempo.cc:500
+msgid "MeterSection XML node has an illegal \"bbt\" value"
+msgstr "XML-Knoten für MeterSection enthält einen illegalen Wert für \"bbt\""
+
+#: tempo.cc:509
+msgid "MeterSection XML node has an illegal \"frame\" value"
+msgstr "XML-Knoten für MeterSection enthält einen illegalen Wert für \"frame\""
+
+#: tempo.cc:519
 msgid ""
 "MeterSection XML node has no \"beats-per-bar\" or \"divisions-per-bar\" "
 "property"
@@ -3205,27 +3378,29 @@ msgstr ""
 "MeterSection: XML-Knoten hat keine Eigenschaft \"beats-per-bar\" oderr "
 "\"divisions-per-bar\""
 
-#: tempo.cc:226
-msgid ""
-"MeterSection XML node has an illegal \"beats-per-bar\" or \"divisions-per-bar"
-"\" value"
+#: tempo.cc:524
+msgid "MeterSection XML node has an illegal \"divisions-per-bar\" value"
 msgstr ""
-"MeterSection: XML-Knoten hat unzulässigen Wert für \"beats-per-bar\" oder "
-"\"divisions-per-bar\""
+"XML-Knoten für MeterSection enthält einen illegalen Wert für"
+" \"divisions-per-bar\""
 
-#: tempo.cc:231
+#: tempo.cc:529
 msgid "MeterSection XML node has no \"note-type\" property"
 msgstr "MeterSection: XML-Knoten hat keine Eigenschaft \"note-type\""
 
-#: tempo.cc:236
+#: tempo.cc:533
 msgid "MeterSection XML node has an illegal \"note-type\" value"
 msgstr "MeterSection: XML-Knoten hat unzulässigen Wert für \"note-type\""
 
-#: tempo.cc:241
+#: tempo.cc:538
 msgid "MeterSection XML node has no \"movable\" property"
 msgstr "MeterSection: XML-Knoten hat keine Eigenschaft \"movable\""
 
-#: tempo.cc:402
+#: tempo.cc:545
+msgid "MeterSection XML node has no \"lock-style\" property"
+msgstr "XML-Knoten für MeterSection enthält  keine Eigenschaft \"lock-style\""
+
+#: tempo.cc:821
 msgid ""
 "Meter changes can only be positioned on the first beat of a bar. Moving from "
 "%1 to %2"
@@ -3233,41 +3408,45 @@ msgstr ""
 "Metrumswechsel können nur am ersten Schlag eines Taktes platziert werden. "
 "Verschiebe von%1 nach %2"
 
-#: tempo.cc:682
+#: tempo.cc:1156
 msgid "no tempo sections defined in tempo map - cannot change tempo @ %1"
 msgstr ""
 "in der Tempo Map sind keine Tempo-Abschnitte definiert - kann Tempo @ %1 "
 "nicht ändern"
 
-#: tempo.cc:712 tempo.cc:730 tempo.cc:748 tempo.cc:764
+#: tempo.cc:1186
+msgid "programming error: no meter section in tempo map!"
+msgstr "Programmierfehler: kein Metrum-Abschnitt in der Tempo map!"
+
+#: tempo.cc:1204 tempo.cc:1227 tempo.cc:1248
 msgid "programming error: no tempo section in tempo map!"
 msgstr "Programmierfehler: kein Tempo-Abschnitt in der Tempo Map"
 
-#: tempo.cc:882 tempo.cc:1892
-msgid "programming error: unhandled MetricSection type"
-msgstr "Programmierfehler: unbehandelter MetricSection Typ"
-
-#: tempo.cc:1178
+#: tempo.cc:1959 tempo.cc:1987
 msgid "tempo map asked for BBT time at frame %1\n"
 msgstr "Tempo Map fragte nach BBT-Zeit an Frame %1\n"
 
-#: tempo.cc:1221
+#: tempo.cc:2054
 msgid "tempo map asked for frame time at bar < 1  (%1)\n"
 msgstr "Tempo Map fragte nach Frame-Zeit an Takt < 1 %1\n"
 
-#: tempo.cc:1705 tempo.cc:1719
+#: tempo.cc:3472 tempo.cc:3485
 msgid "Tempo map: could not set new state, restoring old one."
 msgstr ""
 "Tempo Map: konnte neuen Status nicht setzen, stelle den alten wieder her."
 
-#: tempo.cc:1740 tempo.cc:1741
+#: tempo.cc:3522 tempo.cc:3523
 msgid "Multiple meter definitions found at %1"
 msgstr "Mehrere Metrumdefinitionen an %1 gefunden"
 
-#: tempo.cc:1746 tempo.cc:1747
+#: tempo.cc:3528 tempo.cc:3529
 msgid "Multiple tempo definitions found at %1"
 msgstr "Mehrere Tempodefinitionen an %1 gefunden"
 
+#: tempo.cc:3715
+msgid "programming error: unhandled MetricSection type"
+msgstr "Programmierfehler: unbehandelter MetricSection Typ"
+
 #: tempo_map_importer.cc:52
 msgid "Tempo map"
 msgstr "Tempo Map"
@@ -3300,6 +3479,10 @@ msgstr ""
 msgid "Using plugin-stub with unknown i/o configuration for: "
 msgstr "Benutze Plugin-Platzhalter mit unbekannter E/A-Konfiguration für: "
 
+#: unknown_processor.cc:107
+msgid "Using plugin-stub with mismatching i/o configuration for: "
+msgstr "Benutze einen Plugin-Platzhalter mit falscher E/A-Konfiguration für: "
+
 #: user_bundle.cc:47
 msgid "Node for Bundle has no \"name\" property"
 msgstr "Knoten für Bündel hat keine Eigenschaft \"name\""
@@ -3377,3 +3560,46 @@ msgstr "Programmierfehler: unbekanntes natives Dateikopfformat: %1"
 msgid "cannot open directory %1 (%2)"
 msgstr "kann Verzeichnis %1 nicht öffnen (%2)"
 
+#: vca.cc:43
+#, c-format
+msgid "VCA %n"
+msgstr "VCA %n"
+
+#: vca_manager.cc:166
+msgid "Cannot set state of a VCA"
+msgstr "Kann den Status eines VCA nicht setzen"
+
+#~ msgid "%d"
+#~ msgstr "%d"
+
+#~ msgid "badly formed order key string in state file! [%1] ... ignored."
+#~ msgstr ""
+#~ "schlecht geformte Zeichenkette für den Schlüssel der Sortierreihenfolge "
+#~ "in der Projektdatei! [%1] ... ignoriert"
+
+#~ msgid "Converting deprecated order key for %1 using Editor order %2"
+#~ msgstr ""
+#~ "Konvertiere veralteten Sortierschlüssel für %1 unter Nutzung der "
+#~ "Editorreihenfolge %2"
+
+#~ msgid "programming error: %1%2\n"
+#~ msgstr "Programmierfehler: %1 %2\n"
+
+#~ msgid "TempoSection XML node has no \"start\" property"
+#~ msgstr "TempoSection: XML-Knoten hat keine Eigenschaft \"start\""
+
+#~ msgid "TempoSection XML node has an illegal \"start\" value"
+#~ msgstr "TempoSection: XML-Knoten hat unzulässigen Wert für \"start\""
+
+#~ msgid "TempoSection XML node has an illegal \"bar-offset\" value"
+#~ msgstr "TempoSection: XML-Knoten hat unzulässigen Wert für \"bar-offset\""
+
+#~ msgid "MeterSection XML node has no \"start\" property"
+#~ msgstr "MeterSection: XML-Knoten hat keine Eigenschaft \"start\""
+
+#~ msgid ""
+#~ "MeterSection XML node has an illegal \"beats-per-bar\" or \"divisions-per-"
+#~ "bar\" value"
+#~ msgstr ""
+#~ "MeterSection: XML-Knoten hat unzulässigen Wert für \"beats-per-bar\" oder "
+#~ "\"divisions-per-bar\""
diff --git a/libs/ardour/po/el.mo b/libs/ardour/po/el.mo
new file mode 100644
index 0000000..eb450a8
Binary files /dev/null and b/libs/ardour/po/el.mo differ
diff --git a/libs/ardour/po/el.po b/libs/ardour/po/el.po
index a0e913a..4e0d02a 100644
--- a/libs/ardour/po/el.po
+++ b/libs/ardour/po/el.po
@@ -7,105 +7,258 @@ msgid ""
 msgstr ""
 "Project-Id-Version: libardour 0.664.0\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-03-31 20:13-0400\n"
+"POT-Creation-Date: 2016-07-14 06:20-0400\n"
 "PO-Revision-Date: 2007-04-16 00:38+0200\n"
 "Last-Translator: Klearchos Gourgourinis <muadib at in.gr>\n"
 "Language-Team: Hellenic(Greek)\n"
-"Language: \n"
+"Language: Greek\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: amp.cc:57 automatable.cc:165
-msgid "Fader"
+#: amp.cc:412
+#, c-format
+msgid "%.2fdB"
 msgstr ""
 
-#: analyser.cc:117 audioregion.cc:1729
+#: analyser.cc:121 audioregion.cc:1789
 msgid "Transient Analysis failed for %1."
 msgstr ""
 
-#: analyser.cc:117
+#: analyser.cc:121
 msgid "Audio File Source"
 msgstr ""
 
-#: audio_diskstream.cc:249
+#: analysis_graph.cc:136
+msgid "%1 (%2..%3)"
+msgstr ""
+
+#: audio_backend.cc:31
+msgid "No Error occurred"
+msgstr ""
+
+#: audio_backend.cc:33
+msgid "Failed to initialize audio backend"
+msgstr ""
+
+#: audio_backend.cc:35
+msgid "Failed to deinitialize audio backend"
+msgstr ""
+
+#: audio_backend.cc:37
+msgid "Failed to reinitialize audio backend"
+msgstr ""
+
+#: audio_backend.cc:39
+msgid "Failed to open audio device"
+msgstr ""
+
+#: audio_backend.cc:41
+msgid "Failed to close audio device"
+msgstr ""
+
+#: audio_backend.cc:43
+msgid "Audio device not valid"
+msgstr ""
+
+#: audio_backend.cc:45
+msgid "Audio device unavailable"
+msgstr ""
+
+#: audio_backend.cc:47
+msgid "Audio device not connected"
+msgstr ""
+
+#: audio_backend.cc:49
+msgid "Failed to request and reserve audio device"
+msgstr ""
+
+#: audio_backend.cc:51
+msgid "Audio device Input/Output error"
+msgstr ""
+
+#: audio_backend.cc:53
+msgid "Failed to open MIDI device"
+msgstr ""
+
+#: audio_backend.cc:55
+msgid "Failed to close MIDI device"
+msgstr ""
+
+#: audio_backend.cc:57
+msgid "MIDI device unavailable"
+msgstr ""
+
+#: audio_backend.cc:59
+msgid "MIDI device not connected"
+msgstr ""
+
+#: audio_backend.cc:61
+msgid "MIDI device Input/Output error"
+msgstr ""
+
+#: audio_backend.cc:63
+msgid "Sample format is not supported"
+msgstr ""
+
+#: audio_backend.cc:65
+msgid "Sample rate is not supported"
+msgstr ""
+
+#: audio_backend.cc:67
+msgid "Requested input latency is not supported"
+msgstr ""
+
+#: audio_backend.cc:69
+msgid "Requested output latency is not supported"
+msgstr ""
+
+#: audio_backend.cc:71
+msgid "Period size is not supported"
+msgstr ""
+
+#: audio_backend.cc:73
+msgid "Period count is not supported"
+msgstr ""
+
+#: audio_backend.cc:75
+msgid "Device configuration not supported"
+msgstr ""
+
+#: audio_backend.cc:77
+msgid "Channel count configuration not supported"
+msgstr ""
+
+#: audio_backend.cc:79
+msgid "Input channel count configuration not supported"
+msgstr ""
+
+#: audio_backend.cc:81
+msgid "Output channel count configuration not supported"
+msgstr ""
+
+#: audio_backend.cc:83
+msgid "Unable to aquire realtime permissions"
+msgstr ""
+
+#: audio_backend.cc:85
+msgid "Setting audio device thread priorities failed"
+msgstr ""
+
+#: audio_backend.cc:87
+msgid "Setting MIDI device thread priorities failed"
+msgstr ""
+
+#: audio_backend.cc:89
+msgid "Failed to start process thread"
+msgstr ""
+
+#: audio_backend.cc:91
+msgid "Failed to start freewheel thread"
+msgstr ""
+
+#: audio_backend.cc:93
+msgid "Failed to register audio/midi ports"
+msgstr ""
+
+#: audio_backend.cc:95
+msgid "Failed to re-connect audio/midi ports"
+msgstr ""
+
+#: audio_backend.cc:97
+msgid "Out Of Memory Error"
+msgstr ""
+
+#: audio_backend.cc:99
+msgid "Could not reconnect to Audio/MIDI engine"
+msgstr ""
+
+#: audio_backend.cc:107 export_formats.cc:52 session.cc:6772 session.cc:6792
+msgid "None"
+msgstr ""
+
+#: audio_backend.cc:109
+msgid "Default"
+msgstr ""
+
+#: audio_diskstream.cc:257
 msgid "AudioDiskstream: Playlist \"%1\" isn't an audio playlist"
 msgstr "AudioDiskStream: Η Λίστα \"%1\" δεν είναι ηχητική λίστα αναπαρ/γής"
 
-#: audio_diskstream.cc:301
+#: audio_diskstream.cc:309
 msgid "AudioDiskstream %1: there is no existing playlist to make a copy of!"
 msgstr ""
 "AudioDiskstream %1: δεν υπάρχει λίστα αναπαρ/γής για να γίνει αντιγραφή!"
 
-#: audio_diskstream.cc:861 audio_diskstream.cc:871
+#: audio_diskstream.cc:880 audio_diskstream.cc:890
 msgid ""
 "AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3"
 msgstr ""
 "AudioDiskstream %1: κατα την αναγόμωση, δεν μπόρεσα να διαβάσω %2 από τη "
 "λίστα αναπαρ/γής στο frame %3"
 
-#: audio_diskstream.cc:1028
+#: audio_diskstream.cc:1053
 msgid "AudioDiskstream %1: cannot read %2 from playlist at frame %3"
 msgstr ""
 "AudioDiskstream %1: δεν μπόρεσα να διαβάσω %2 από τη λίστα αναπαρ/γής στο "
 "frame %3"
 
-#: audio_diskstream.cc:1397 audio_diskstream.cc:1416
+#: audio_diskstream.cc:1469 audio_diskstream.cc:1488
 msgid "AudioDiskstream %1: cannot write to disk"
 msgstr "AudioDiskstream %1: δεν μπορώ να γράψω στο δίσκο"
 
-#: audio_diskstream.cc:1459
+#: audio_diskstream.cc:1531
 msgid "AudioDiskstream \"%1\": cannot flush captured data to disk!"
 msgstr ""
 "AudioDiskstream \"%1\": αδύνατη η εκκαθάριση δειγματοληπτικών δεδομένων στο "
 "δίσκο!"
 
-#: audio_diskstream.cc:1553
+#: audio_diskstream.cc:1627
 msgid "%1: could not create region for complete audio file"
 msgstr "%1: δεν μπόρεσα να δημιουργήσω περιοχή για ολόκληρο audio file"
 
-#: audio_diskstream.cc:1585
+#: audio_diskstream.cc:1659
 msgid "AudioDiskstream: could not create region for captured audio!"
 msgstr ""
 "AudioDiskstream: δεν μπόρεσα να δημιουργήσω περιοχή για δειγματοληψίες!"
 
-#: audio_diskstream.cc:1693
+#: audio_diskstream.cc:1755
 msgid "programmer error: %1"
 msgstr "σφάλμα προγραμματιστή: %1"
 
-#: audio_diskstream.cc:1921
+#: audio_diskstream.cc:2012
 msgid "AudioDiskstream: channel %1 out of range"
 msgstr "AudioDiskstream: κανάλι %1 εκτός διαστήματος"
 
-#: audio_diskstream.cc:1935 midi_diskstream.cc:1274
+#: audio_diskstream.cc:2026 midi_diskstream.cc:1295
 msgid "%1:%2 new capture file not initialized correctly"
 msgstr "%1:%2 νέα δειγματοληψία δεν εκκινήθη σωστά"
 
-#: audio_diskstream.cc:2214
+#: audio_diskstream.cc:2305
 msgid "%1: cannot restore pending capture source file %2"
 msgstr "%1: δεν μπορώ να ανοίξω το αρχείο %2 από την απαιτούμενη πηγή"
 
-#: audio_diskstream.cc:2236
+#: audio_diskstream.cc:2327
 msgid "%1: incorrect number of pending sources listed - ignoring them all"
 msgstr "%1: ετυπώθη λανθασμένος αριθμός απαιτούμενων πηγών - αγνοήθηκαν όλες"
 
-#: audio_diskstream.cc:2270
+#: audio_diskstream.cc:2361
 msgid "%1: cannot create whole-file region from pending capture sources"
 msgstr ""
 "%1: αδύνατη η δημιουργία ακέραιας περιοχής από τις απαιτούμενες πηγές "
 "ηχοληψίας"
 
-#: audio_library.cc:81
+#: audio_library.cc:82
 msgid "Could not open %1.  Audio Library not saved"
 msgstr "Δεν μπόρεσα να ανοίξω το %1.  Η Audio Library δεν αποθηκεύθηκε"
 
-#: audio_playlist.cc:504
+#: audio_playlist.cc:509
 msgid ""
 "Legacy crossfade involved an incoming region not present in playlist \"%1\" "
 "- crossfade discarded"
 msgstr ""
 
-#: audio_playlist.cc:520
+#: audio_playlist.cc:525
 msgid ""
 "Legacy crossfade involved an outgoing region not present in playlist \"%1\" "
 "- crossfade discarded"
@@ -135,10 +288,11 @@ msgstr ""
 msgid "Audio Playlists (unused)"
 msgstr ""
 
-#: audio_playlist_source.cc:171 audiosource.cc:963 midi_playlist_source.cc:147
-#: midi_playlist_source.cc:155 midi_playlist_source.cc:162 midi_source.cc:356
-#: plugin_insert.cc:641 rb_effect.cc:327 session.cc:2845 session.cc:2878
-#: session.cc:4124 session_handle.cc:87 sndfilesource.cc:154
+#: audio_playlist_source.cc:171 audiosource.cc:1046
+#: midi_playlist_source.cc:147 midi_playlist_source.cc:155
+#: midi_playlist_source.cc:162 midi_source.cc:403 plugin_insert.cc:1259
+#: rb_effect.cc:327 session.cc:5314 session.cc:5341 session.cc:5461
+#: session_handle.cc:88 sndfilesource.cc:173
 msgid "programming error: %1"
 msgstr "σφάλμα προγραμματισμού: %1"
 
@@ -162,26 +316,30 @@ msgid ""
 "Channels: "
 msgstr ""
 
-#: audio_track.cc:161
+#: audio_track.cc:177
 msgid "Unknown bundle \"%1\" listed for input of %2"
 msgstr ""
 
-#: audio_track.cc:163
+#: audio_track.cc:179
 msgid "in 1"
 msgstr ""
 
-#: audio_track.cc:164
+#: audio_track.cc:180
 msgid "No input bundles available as a replacement"
 msgstr ""
 
-#: audio_track.cc:168
+#: audio_track.cc:184
 msgid "Bundle %1 was not available - \"in 1\" used instead"
 msgstr ""
 
-#: audio_track.cc:177
+#: audio_track.cc:193
 msgid "improper input channel list in XML node (%1)"
 msgstr "ακατάλληλη λίστα καναλιών εισόδου στον κόμβο XML (%1)"
 
+#: audio_track.cc:216 diskstream.cc:503 source.cc:149
+msgid "%1: this session uses destructive tracks, which are not supported"
+msgstr ""
+
 #: audio_track_importer.cc:68
 msgid "Audio Tracks"
 msgstr ""
@@ -202,19 +360,19 @@ msgstr ""
 msgid "VAMP Plugin \"%1\" could not be loaded"
 msgstr ""
 
-#: audioengine.cc:696
+#: audioengine.cc:756
 msgid "AudioEngine: cannot load module \"%1\" (%2)"
 msgstr ""
 
-#: audioengine.cc:702
+#: audioengine.cc:762
 msgid "AudioEngine: backend at \"%1\" has no descriptor function."
 msgstr ""
 
-#: audioengine.cc:779
+#: audioengine.cc:841
 msgid "Could not create backend for %1: %2"
 msgstr ""
 
-#: audioregion.cc:1685
+#: audioregion.cc:1757
 msgid ""
 "You have requested an operation that requires audio analysis.\n"
 "\n"
@@ -222,13 +380,14 @@ msgid ""
 "transient data must be generated every time it is required.\n"
 "\n"
 "If you are doing work that will require transient data on a regular basis, "
-"you should probably enable \"auto-analyse-audio\" then quit %1 and restart.\n"
+"you should probably enable \"auto-analyse-audio\" in Preferences > Audio > "
+"Regions, then quit %1 and restart.\n"
 "\n"
 "This dialog will not display again.  But you may notice a slight delay in "
 "this and future transient-detection operations.\n"
 msgstr ""
 
-#: audioregion.cc:1729
+#: audioregion.cc:1789
 msgid "Audio Region"
 msgstr ""
 
@@ -236,169 +395,197 @@ msgstr ""
 msgid "cannot rename peakfile for %1 from %2 to %3 (%4)"
 msgstr "αδύνατη η μετονομασία του peakfile για %1 από %2 σε %3 (%4)"
 
-#: audiosource.cc:257
+#: audiosource.cc:262
 msgid "AudioSource: cannot stat peakfile \"%1\""
 msgstr ""
 
-#: audiosource.cc:361
+#: audiosource.cc:368
+msgid "Cannot open peakfile @ %1 for size check (%2)"
+msgstr ""
+
+#: audiosource.cc:389
+msgid "peak file %1 is truncated from %2 to %3"
+msgstr ""
+
+#: audiosource.cc:392
+msgid "Cannot open peakfile @ %1 for size check (%2) after rebuild"
+msgstr ""
+
+#: audiosource.cc:404
 msgid "Cannot open peakfile @ %1 for reading (%2)"
 msgstr ""
 
-#: audiosource.cc:394
+#: audiosource.cc:438
 msgid "cannot read sample data for unscaled peak computation"
 msgstr ""
 "δεν μπορώ να διαβάσω δεδομένα δείγματος για υπολογισμό μη-κλιμακώτου peak"
 
-#: audiosource.cc:430 audiosource.cc:525
+#: audiosource.cc:473 audiosource.cc:568
 msgid "map failed - could not create file mapping for peakfile %1."
 msgstr ""
 
-#: audiosource.cc:436 audiosource.cc:531
+#: audiosource.cc:479 audiosource.cc:574
 msgid "map failed - could not map peakfile %1."
 msgstr ""
 
-#: audiosource.cc:447 audiosource.cc:542
+#: audiosource.cc:490 audiosource.cc:585
 msgid "unmap failed - could not unmap peakfile %1."
 msgstr ""
 
-#: audiosource.cc:453 audiosource.cc:548
+#: audiosource.cc:496 audiosource.cc:591
 msgid "map failed - could not mmap peakfile %1."
 msgstr ""
 
-#: audiosource.cc:638
+#: audiosource.cc:681
 msgid ""
 "AudioSource[%1]: peak read - cannot read %2 samples at offset %3 of %4 (%5)"
 msgstr ""
 
-#: audiosource.cc:705
+#: audiosource.cc:748
 msgid "%1: could not write read raw data for peak computation (%2)"
 msgstr ""
 "%1: δεν μπορεσα να γράψω ανεγνωσμένα raw δεδομένα για τον υπολογισμό του "
 "peak (%2)"
 
-#: audiosource.cc:742
-msgid "AudioSource: cannot open peakpath (c) \"%1\" (%2)"
+#: audiosource.cc:815
+msgid "AudioSource: cannot open _peakpath (c) \"%1\" (%2)"
 msgstr ""
 
-#: audiosource.cc:811 audiosource.cc:933
+#: audiosource.cc:894 audiosource.cc:1016
 msgid "%1: could not seek in peak file data (%2)"
 msgstr ""
 
-#: audiosource.cc:816 audiosource.cc:942
+#: audiosource.cc:899 audiosource.cc:1025
 msgid "%1: could not write peak file data (%2)"
 msgstr "%1: δεν μπόρεσα να γράψω δεδομένα του αρχείου peak (%2)"
 
-#: audiosource.cc:975
+#: audiosource.cc:1058
 msgid "could not truncate peakfile %1 to %2 (error: %3)"
 msgstr ""
 
-#: auditioner.cc:100
+#: auditioner.cc:105
 msgid "Falling back to Reasonable Synth for Midi Audition"
 msgstr ""
 
-#: auditioner.cc:102
+#: auditioner.cc:107
 msgid "No synth for midi-audition found."
 msgstr ""
 
-#: auditioner.cc:158
+#: auditioner.cc:163
 msgid "no outputs available for auditioner - manual connection required"
 msgstr ""
 
-#: auditioner.cc:399 auditioner.cc:446
+#: auditioner.cc:408 auditioner.cc:455
 msgid "Cannot setup auditioner processing flow for %1 channels"
 msgstr ""
 
-#: auditioner.cc:434
+#: auditioner.cc:443
 msgid "Failed to load synth for MIDI-Audition."
 msgstr ""
 
-#: auditioner.cc:453
+#: auditioner.cc:462
 msgid "Auditioning of regions other than Audio or Midi is not supported."
 msgstr ""
 
-#: automatable.cc:84
+#: automatable.cc:87
 msgid "Automation node has no path property"
 msgstr ""
 
-#: automatable.cc:104
+#: automatable.cc:108
 msgid "cannot open %2 to load automation data (%3)"
 msgstr ""
 
-#: automatable.cc:132
+#: automatable.cc:140
 msgid "cannot load automation data from %2"
 msgstr ""
 
-#: automatable.cc:167
+#: automatable.cc:176 send.cc:95 session.cc:851
+msgid "Fader"
+msgstr ""
+
+#: automatable.cc:178
+msgid "Trim"
+msgstr ""
+
+#: automatable.cc:180
 msgid "Mute"
 msgstr ""
 
-#: automation_list.cc:356
+#: automation_control.cc:228
+msgid "record %1 automation"
+msgstr ""
+
+#: automation_list.cc:410
 msgid "automation list: cannot load coordinates from XML, all points ignored"
 msgstr ""
 
-#: automation_list.cc:402
+#: automation_list.cc:456
 msgid ""
 "automation list: no x-coordinate stored for control point (point ignored)"
 msgstr ""
 "λίστα αυτοματισμού: καμία x-συντεταγμένη αποθηκευμένη για σημείο ελέγχου (το "
 "σημείο αγνοήθηκε)"
 
-#: automation_list.cc:408
+#: automation_list.cc:462
 msgid ""
 "automation list: no y-coordinate stored for control point (point ignored)"
 msgstr ""
 "λίστα αυτοματισμού: καμία y-συντεταγμένη αποθηκευμένη για σημείο ελέγχου (το "
 "σημείο αγνοήθηκε)"
 
-#: automation_list.cc:422
+#: automation_list.cc:476
 msgid ""
 "AutomationList: passed XML node called %1, not \"AutomationList\" - ignored"
 msgstr ""
 
-#: butler.cc:100
+#: butler.cc:126
 msgid "Session: could not create butler thread"
 msgstr "Συνεδρία: δεν μπόρεσα να δημιουργήσω δέσμη με τον butler"
 
-#: butler.cc:222 butler.cc:223
+#: butler.cc:254 butler.cc:255
 msgid "Butler read ahead failure on dstream %1"
 msgstr "Αποτυχία προανάγνωσης Butler στο dstream %1"
 
-#: butler.cc:270 butler.cc:271
+#: butler.cc:344 butler.cc:345 butler.cc:393 butler.cc:394
 msgid "Butler write-behind failure on dstream %1"
 msgstr "Αποτυχία οπισθεγγραφής Butler στο dstream %1"
 
-#: control_protocol_manager.cc:164
+#: control_protocol_manager.cc:174
 msgid "control protocol name \"%1\" has no descriptor"
 msgstr "Το όνομα πρωτοκόλλου ελέγχου \"%1\" δεν έχει descriptor"
 
-#: control_protocol_manager.cc:171
+#: control_protocol_manager.cc:181
 msgid "control protocol name \"%1\" could not be initialized"
 msgstr "Το όνομα πρωτοκόλλου ελέγχου \"%1\" ήταν αδύνατο να αρχίσει"
 
-#: control_protocol_manager.cc:237
+#: control_protocol_manager.cc:265
 msgid "Instantiating mandatory control protocol %1"
 msgstr ""
 
-#: control_protocol_manager.cc:281
+#: control_protocol_manager.cc:309
 msgid "looking for control protocols in %1\n"
 msgstr ""
 
-#: control_protocol_manager.cc:306
+#: control_protocol_manager.cc:334
 msgid "Control protocol %1 not usable"
 msgstr "Πρωτόκολλο ελέγχου %1 μη χρησιμοποιήσιμο"
 
-#: control_protocol_manager.cc:323
+#: control_protocol_manager.cc:351
 msgid "Control surface protocol discovered: \"%1\"\n"
 msgstr ""
 
-#: control_protocol_manager.cc:341
+#: control_protocol_manager.cc:367
 msgid "ControlProtocolManager: cannot load module \"%1\" (%2)"
 msgstr "ControlProtocolManager: δεν μπορώ να φορτώσω το module \"%1\" (%2)"
 
-#: control_protocol_manager.cc:347
+#: control_protocol_manager.cc:373
 msgid "ControlProtocolManager: module \"%1\" has no descriptor function."
 msgstr "ControlProtocolManager: το module \"%1\" δεν έχει descriptor function."
 
+#: control_protocol_manager.cc:516
+msgid "Control protocol \"%1\" has no descriptor"
+msgstr ""
+
 #: cycle_timer.cc:40
 msgid "CycleTimer::get_mhz(): can't open /proc/cpuinfo"
 msgstr "CycleTimer::get_mhz(): δεν ανοίγει το /proc/cpuinfo"
@@ -415,7 +602,7 @@ msgstr "δεν ευρέθη το cpu MHz στο /proc/cpuinfo"
 msgid "audio"
 msgstr ""
 
-#: data_type.cc:28 session.cc:1995 session.cc:1998
+#: data_type.cc:28 session.cc:2452
 msgid "MIDI"
 msgstr ""
 
@@ -427,11 +614,11 @@ msgstr ""
 msgid "main outs"
 msgstr ""
 
-#: delivery.cc:121 send.cc:63
+#: delivery.cc:121 send.cc:64
 msgid "listen"
 msgstr ""
 
-#: diskstream.cc:309
+#: diskstream.cc:311
 msgid "Location \"%1\" not valid for track loop (start >= end)"
 msgstr "Η Τοποθεσία \"%1\" δεν είναι ικανή για track loop (αρχή >= τέλος)"
 
@@ -443,23 +630,23 @@ msgstr ""
 msgid "Export failed: %1"
 msgstr ""
 
-#: export_filename.cc:126
+#: export_filename.cc:128
 msgid "Existing export folder for this session (%1) does not exist - ignored"
 msgstr ""
 
-#: export_filename.cc:242
+#: export_filename.cc:263
 msgid "No Time"
 msgstr ""
 
-#: export_filename.cc:251
+#: export_filename.cc:272
 msgid "Invalid time format"
 msgstr ""
 
-#: export_filename.cc:260
+#: export_filename.cc:281
 msgid "No Date"
 msgstr ""
 
-#: export_filename.cc:275
+#: export_filename.cc:296
 msgid "Invalid date format"
 msgstr ""
 
@@ -495,23 +682,27 @@ msgstr ""
 msgid "Lossless compression"
 msgstr ""
 
-#: export_format_manager.cc:218 export_format_specification.cc:591
+#: export_format_manager.cc:218 export_format_specification.cc:657
 msgid "Session rate"
 msgstr ""
 
-#: export_format_specification.cc:549
-msgid "normalize"
+#: export_format_specification.cc:609
+msgid "normalize loudness"
 msgstr ""
 
-#: export_format_specification.cc:553
+#: export_format_specification.cc:611
+msgid "normalize peak"
+msgstr ""
+
+#: export_format_specification.cc:616
 msgid "trim"
 msgstr ""
 
-#: export_format_specification.cc:555
+#: export_format_specification.cc:618
 msgid "trim start"
 msgstr ""
 
-#: export_format_specification.cc:557
+#: export_format_specification.cc:620
 msgid "trim end"
 msgstr ""
 
@@ -527,24 +718,20 @@ msgstr ""
 msgid "Rectangular"
 msgstr ""
 
-#: export_formats.cc:52 session.cc:5421 session.cc:5437
-msgid "None"
-msgstr ""
-
 #: export_formats.cc:159
-msgid "8bit"
+msgid "8-bit"
 msgstr ""
 
 #: export_formats.cc:161
-msgid "16bit"
+msgid "16-bit"
 msgstr ""
 
 #: export_formats.cc:163
-msgid "24bit"
+msgid "24-bit"
 msgstr ""
 
 #: export_formats.cc:165
-msgid "32bit"
+msgid "32-bit"
 msgstr ""
 
 #: export_formats.cc:167
@@ -556,7 +743,7 @@ msgid "double"
 msgstr ""
 
 #: export_formats.cc:171
-msgid "8bit unsigned"
+msgid "8-bit unsigned"
 msgstr ""
 
 #: export_formats.cc:173
@@ -567,94 +754,90 @@ msgstr ""
 msgid "No sample format"
 msgstr ""
 
-#: export_handler.cc:360
+#: export_handler.cc:419
 msgid "File %1 uploaded to %2"
 msgstr ""
 
-#: export_handler.cc:366
+#: export_handler.cc:425
 msgid ""
 "upload to Soundcloud failed. Perhaps your email or password are incorrect?\n"
 msgstr ""
 
-#: export_handler.cc:413
-msgid "Editor: cannot open \"%1\" as export file for CD marker file"
-msgstr ""
-
-#: export_handler.cc:492 export_handler.cc:495
-msgid "an error occured while writing a TOC/CUE file: %1"
+#: export_handler.cc:551 export_handler.cc:554
+msgid "an error occurred while writing a TOC/CUE file: %1"
 msgstr ""
 
-#: export_handler.cc:744 export_handler.cc:802
+#: export_handler.cc:844 export_handler.cc:902
 msgid "Cannot convert %1 to Latin-1 text"
 msgstr ""
 
-#: export_profile_manager.cc:93
+#: export_profile_manager.cc:94
 msgid "Searching for export formats in %1"
 msgstr ""
 
-#: export_profile_manager.cc:99
+#: export_profile_manager.cc:100
 msgid "Unable to create export format directory %1: %2"
 msgstr ""
 
-#: export_profile_manager.cc:262
+#: export_profile_manager.cc:268
 msgid "Unable to remove export preset %1: %2"
 msgstr ""
 
-#: export_profile_manager.cc:351
+#: export_profile_manager.cc:357
 msgid "Selection"
 msgstr ""
 
-#: export_profile_manager.cc:604
+#: export_profile_manager.cc:621
 msgid "Unable to rename export format %1 to %2: %3"
 msgstr ""
 
-#: export_profile_manager.cc:636
+#: export_profile_manager.cc:653
 msgid "Unable to remove export profile %1: %2"
 msgstr ""
 
-#: export_profile_manager.cc:654
+#: export_profile_manager.cc:671
 msgid "empty format"
 msgstr ""
 
-#: export_profile_manager.cc:735
+#: export_profile_manager.cc:752
 msgid "Cannot load export format from %1"
 msgstr ""
 
-#: export_profile_manager.cc:741
+#: export_profile_manager.cc:758
 msgid "Cannot export format read from %1"
 msgstr ""
 
-#: export_profile_manager.cc:835
+#: export_profile_manager.cc:852
 msgid "No timespan has been selected!"
 msgstr ""
 
-#: export_profile_manager.cc:839
+#: export_profile_manager.cc:856
 msgid "No channels have been selected!"
 msgstr ""
 
-#: export_profile_manager.cc:843
+#: export_profile_manager.cc:860
 msgid "Some channels are empty"
 msgstr ""
 
-#: export_profile_manager.cc:876
+#: export_profile_manager.cc:893
 msgid "No format selected!"
 msgstr ""
 
-#: export_profile_manager.cc:878
+#: export_profile_manager.cc:895
 msgid "All channels are empty!"
 msgstr ""
 
-#: export_profile_manager.cc:880
+#: export_profile_manager.cc:897
 msgid "One or more of the selected formats is not compatible with this system!"
 msgstr ""
 
-#: export_profile_manager.cc:883
+#: export_profile_manager.cc:900
 msgid ""
 "%1 supports only %2 channels, but you have %3 channels in your channel "
 "configuration"
 msgstr ""
 
-#: file_source.cc:201 session_state.cc:2857
+#: file_source.cc:201 session_state.cc:3284
 msgid ""
 "there are already 1000 files with names like %1; versioning discontinued"
 msgstr "Υπάρχουν ήδη 1000 αρχεία με ονόματα όπως %1; μη-συνεχές versioning"
@@ -663,25 +846,25 @@ msgstr "Υπάρχουν ήδη 1000 αρχεία με ονόματα όπως %
 msgid "cannot rename file source from %1 to %2 (%3)"
 msgstr ""
 
-#: file_source.cc:251 file_source.cc:375
+#: file_source.cc:251 file_source.cc:374
 msgid "FileSource: search path not set"
 msgstr "FileSource: μονοπάτι αναζητήσεως δεν ετέθη"
 
-#: file_source.cc:435
+#: file_source.cc:434
 msgid ""
 "FileSource: \"%1\" is ambigous when searching\n"
 "\t"
 msgstr ""
 
-#: file_source.cc:442
+#: file_source.cc:441
 msgid "Filesource: cannot find required file (%1)"
 msgstr ""
 
-#: file_source.cc:487
+#: file_source.cc:486
 msgid "Filesource: cannot find required file (%1): %2"
 msgstr "Filesource: δεν ευρέθη το απαιτούμενο αρχείο (%1): %2"
 
-#: file_source.cc:495
+#: file_source.cc:494
 msgid "Filesource: cannot check for existing file (%1): %2"
 msgstr "Filesource: δεν μπορώ να ελέγξω για το υπάρχον αρχείο (%1): %2"
 
@@ -695,34 +878,38 @@ msgstr ""
 msgid "cannot rename file %1 to %2 (%3)"
 msgstr ""
 
-#: filesystem_paths.cc:105
+#: filesystem_paths.cc:120
 msgid "Cannot create Configuration directory %1 - cannot run"
 msgstr ""
 
-#: filesystem_paths.cc:110
+#: filesystem_paths.cc:125
 msgid ""
 "Configuration directory %1 already exists and is not a directory/folder - "
 "cannot run"
 msgstr ""
 
-#: filesystem_paths.cc:171
+#: filesystem_paths.cc:186
 msgid "Cannot create cache directory %1 - cannot run"
 msgstr ""
 
-#: filesystem_paths.cc:176
+#: filesystem_paths.cc:191
 msgid ""
 "Cache directory %1 already exists and is not a directory/folder - cannot run"
 msgstr ""
 
-#: filesystem_paths.cc:194
+#: filesystem_paths.cc:209
 msgid "ARDOUR_DLL_PATH not set in environment - exiting\n"
 msgstr ""
 
-#: filesystem_paths.cc:245
+#: filesystem_paths.cc:232
+msgid "Cannot determine %1 package directory"
+msgstr ""
+
+#: filesystem_paths.cc:277
 msgid "ARDOUR_CONFIG_PATH not set in environment\n"
 msgstr ""
 
-#: filesystem_paths.cc:266
+#: filesystem_paths.cc:298
 msgid "ARDOUR_DATA_PATH not set in environment\n"
 msgstr ""
 
@@ -730,50 +917,79 @@ msgstr ""
 msgid "filter: error creating name for new file based on %1"
 msgstr ""
 
-#: filter.cc:79
+#: filter.cc:92
 msgid "filter: error creating new file %1 (%2)"
 msgstr ""
 
-#: find_session.cc:59
+#: find_session.cc:60
 msgid "cannot check session path %1 (%2)"
 msgstr "δεν μπορώ να ελέγξω το μονοπάτι συνεδρίας %1 (%2)"
 
-#: find_session.cc:85
+#: find_session.cc:86
 msgid "cannot check statefile %1 (%2)"
 msgstr "δεν μπορώ να ελέγξω το αρχείο κατάστασεως %1 (%2)"
 
-#: find_session.cc:121
+#: find_session.cc:125
 msgid "%1 is not a snapshot file"
 msgstr ""
 
-#: find_session.cc:138
+#: find_session.cc:142
 msgid "cannot determine current working directory (%1)"
 msgstr "δεν μπορώ να καθορίσω τον τρέχοντα ενεργό φάκελο(directory) (%1)"
 
-#: find_session.cc:155
+#: find_session.cc:159
 msgid "unknown file type for session %1"
 msgstr "άγνωστος τύπος αρχείου για την συνεδρία %1"
 
-#: globals.cc:234
+#: gain_control.cc:81
+#, c-format
+msgid "%3.1f dB"
+msgstr ""
+
+#: globals.cc:266
 msgid "Could not set system open files limit to \"unlimited\""
 msgstr ""
 
-#: globals.cc:236
+#: globals.cc:268
 msgid "Could not set system open files limit to %1"
 msgstr ""
 
-#: globals.cc:240
+#: globals.cc:272 globals.cc:289
 msgid "Your system is configured to limit %1 to only %2 open files"
 msgstr ""
 
-#: globals.cc:244
+#: globals.cc:276
 msgid "Could not get system open files limit (%1)"
 msgstr ""
 
-#: globals.cc:415
+#: globals.cc:291
+msgid "Could not set system open files limit. Current limit is %1 open files"
+msgstr ""
+
+#: globals.cc:474
 msgid "Loading configuration"
 msgstr ""
 
+#: globals.cc:554 route.cc:182 route.cc:4149 session.cc:1157
+msgid "Monitor"
+msgstr ""
+
+#: globals.cc:555 session_state.cc:642
+msgid "Master"
+msgstr ""
+
+#: globals.cc:556
+msgid "Control"
+msgstr ""
+
+#: globals.cc:557
+msgid "Click"
+msgstr ""
+
+#: globals.cc:558
+msgid "Mackie"
+msgstr ""
+
 #: import.cc:146
 msgid "Cannot find new filename for imported file %1"
 msgstr ""
@@ -799,7 +1015,7 @@ msgid "Track %1 of %2 contained no usable MIDI data"
 msgstr ""
 
 #: import.cc:427
-msgid "MIDI file %1 was not readable (no reason available)"
+msgid "MIDI file could not be written (best guess: %1)"
 msgstr ""
 
 #: import.cc:475
@@ -826,110 +1042,113 @@ msgstr ""
 msgid "Unknown"
 msgstr ""
 
-#: instrument_info.cc:231
+#: instrument_info.cc:243
 msgid "preset %1 (bank %2)"
 msgstr ""
 
-#: internal_send.cc:316 internal_send.cc:317
+#: internal_send.cc:338 internal_send.cc:339
 msgid "%1 - cannot find any track/bus with the ID %2 to connect to"
 msgstr ""
 
-#: io.cc:209
+#: io.cc:212
 msgid "IO: cannot disconnect port %1 from %2"
 msgstr ""
 
-#: io.cc:344 io.cc:431
+#: io.cc:347 io.cc:435
 msgid "IO: cannot register input port %1"
 msgstr "IO: δεν μπορεί να καταχώρηθεί η θύρα εισόδου %1"
 
-#: io.cc:349 io.cc:436
+#: io.cc:352 io.cc:440
 msgid "IO: cannot register output port %1"
 msgstr "IO: δεν μπορει να καταχώρηθεί η θύρα εξόδου %1"
 
-#: io.cc:598 io.cc:654
+#: io.cc:607 io.cc:668
 msgid "incorrect XML node \"%1\" passed to IO object"
 msgstr "μη-σωστός κόμβος XML \"%1\" πέρασε στο IO αντικείμενο"
 
-#: io.cc:713
+#: io.cc:730
 msgid "in"
 msgstr ""
 
-#: io.cc:713
+#: io.cc:730
 msgid "out"
 msgstr ""
 
-#: io.cc:714
+#: io.cc:731
 msgid "input"
 msgstr ""
 
-#: io.cc:714
+#: io.cc:731
 msgid "output"
 msgstr ""
 
-#: io.cc:724
+#: io.cc:741
 msgid "Unknown bundle \"%1\" listed for %2 of %3"
 msgstr ""
 
-#: io.cc:790
+#: io.cc:807
 msgid "Bundle %1 was not available - \"%2\" used instead"
 msgstr ""
 
-#: io.cc:793
+#: io.cc:810
 msgid "No %1 bundles available as a replacement"
 msgstr ""
 
-#: io.cc:897
+#: io.cc:914
 msgid "%1: cannot create I/O ports"
 msgstr "%1: θύρες I/O δεν μπορούν να δημιουργηθούν"
 
-#: io.cc:1025 io.cc:1126
+#: io.cc:1042 io.cc:1143
 msgid "IO: badly formed string in XML node for inputs \"%1\""
 msgstr "IO: κακοφτιαγμένη γραμμή στον XML κόμβο για εισόδους \"%1\""
 
-#: io.cc:1030 io.cc:1131
+#: io.cc:1047 io.cc:1148
 msgid "bad input string in XML node \"%1\""
 msgstr "κακή γραμμή εισόδου στον XML κόμβο \"%1\""
 
-#: io.cc:1069
+#: io.cc:1086
 msgid "IO: badly formed string in XML node for outputs \"%1\""
 msgstr "IO: δύσμορφη γραμμή στον κόμβο XML για τις εξόδους \"%1\""
 
-#: io.cc:1074
+#: io.cc:1091
 msgid "IO: bad output string in XML node \"%1\""
 msgstr "IO: κακή γραμμή εξόδουστον κόμβο XML \"%1\""
 
-#: io.cc:1413
+#: io.cc:1256 plugin.cc:275
+msgid "Out"
+msgstr ""
+
+#: io.cc:1256 plugin.cc:273
+msgid "In"
+msgstr ""
+
+#: io.cc:1454
 #, c-format
 msgid "%s %u"
 msgstr ""
 
-#: io.cc:1460
+#: io.cc:1501
 #, c-format
 msgid "%s in"
 msgstr ""
 
-#: io.cc:1462
+#: io.cc:1503
 #, c-format
 msgid "%s out"
 msgstr ""
 
-#: io.cc:1537 session.cc:733 session.cc:767
+#: io.cc:1578 session.cc:957 session.cc:991
 msgid "mono"
 msgstr ""
 
-#: io.cc:1539 session.cc:746 session.cc:781
+#: io.cc:1580 session.cc:970 session.cc:1005
 msgid "L"
 msgstr ""
 
-#: io.cc:1539 session.cc:748 session.cc:783
+#: io.cc:1580 session.cc:972 session.cc:1007
 msgid "R"
 msgstr ""
 
-#: io.cc:1541 io.cc:1547
-#, c-format
-msgid "%d"
-msgstr ""
-
 #: ladspa_plugin.cc:93
 msgid "LADSPA: Unable to open module: "
 msgstr ""
@@ -948,83 +1167,83 @@ msgstr ""
 "LADSPA: \"%1\" δεν μπορεί να χρησιμοποιηθεί, εφ'όσον δεν μπορεί να κάνει επι "
 "τόπου επεξεργασία"
 
-#: ladspa_plugin.cc:311
+#: ladspa_plugin.cc:308
 msgid ""
 "illegal parameter number used with plugin \"%1\". This may indicate a change "
 "in the plugin design, and presets may be invalid"
 msgstr ""
 
-#: ladspa_plugin.cc:390 ladspa_plugin.cc:440
+#: ladspa_plugin.cc:387 ladspa_plugin.cc:437
 msgid "Bad node sent to LadspaPlugin::set_state"
 msgstr "Κακός κόμβος εστάλη στο LadspaPlugin::set_state"
 
-#: ladspa_plugin.cc:405 ladspa_plugin.cc:454
+#: ladspa_plugin.cc:402 ladspa_plugin.cc:451
 msgid "LADSPA: no ladspa port number"
 msgstr "LADSPA: κανείς αριθμός θύρας ladspa"
 
-#: ladspa_plugin.cc:411 ladspa_plugin.cc:460
+#: ladspa_plugin.cc:408 ladspa_plugin.cc:457
 msgid "LADSPA: no ladspa port data"
 msgstr "LADSPA: κανένα δεδομένο θύρας ladspa"
 
-#: ladspa_plugin.cc:842
+#: ladspa_plugin.cc:863
 msgid "Could not locate HOME.  Preset not removed."
 msgstr ""
 
-#: ladspa_plugin.cc:881 ladspa_plugin.cc:887
+#: ladspa_plugin.cc:902 ladspa_plugin.cc:908
 msgid "Could not create %1.  Preset not saved. (%2)"
 msgstr "Δεν μπόρεσα να δημιουργήσω το %1.  Προ-ρύθμιση δεν αποθηκεύθηκε. (%2)"
 
-#: ladspa_plugin.cc:894
+#: ladspa_plugin.cc:915
 msgid "Error saving presets file %1."
 msgstr "Σφάλμα στην αποθήκευση αρχείου προ-ρυθμίσεων %1."
 
-#: ladspa_plugin.cc:936
+#: ladspa_plugin.cc:957
 msgid "Could not locate HOME.  Preset not saved."
 msgstr "Δεν μπόρεσα να βρώ το HOME.  Προ-ρύθμιση δεν αποθηκεύθηκε."
 
-#: location.cc:456
+#: location.cc:455
 msgid "You cannot put a CD marker at this position"
 msgstr ""
 
-#: location.cc:608
+#: location.cc:607
 msgid "incorrect XML node passed to Location::set_state"
 msgstr "λανθασμένος κόμβος XML πέρασε στην Τοποθεσία::set_state"
 
-#: location.cc:613
+#: location.cc:612
 msgid "XML node for Location has no ID information"
 msgstr ""
 
-#: location.cc:617
+#: location.cc:616
 msgid "XML node for Location has no name information"
 msgstr "Ο κόμβος XML για την Τοποθεσία δεν έχει πληροφορίες ονόματος"
 
-#: location.cc:624
+#: location.cc:623
 msgid "XML node for Location has no start information"
 msgstr "Ο κόμβος XML για την Τοποθεσία δεν έχει πληροφορίες ενάρξεως"
 
-#: location.cc:635
+#: location.cc:634
 msgid "XML node for Location has no end information"
 msgstr "Ο κόμβος XML για την Τοποθεσία δεν έχει πληροφορίες τέλους"
 
-#: location.cc:642
+#: location.cc:641
 msgid "XML node for Location has no flags information"
 msgstr "Ο κόμβος XML για την Τοποθεσία δεν έχει πληροφορίες για σημαίες(flags)"
 
-#: location.cc:856
+#: location.cc:868
 msgid "Locations: attempt to use unknown location as selected location"
 msgstr ""
 "Τοποθεσίες: απόπειρα να χρησιμοποιηθεί άγνωστη τοποθεσία σαν επιλεγμένη "
 "τοποθεσία"
 
-#: location.cc:1034
+#: location.cc:1046
 msgid "incorrect XML mode passed to Locations::set_state"
 msgstr "λανθασμένο XML mode πέρασε στις Τοποθεσίες::set_state"
 
-#: location.cc:1047 session.cc:1293 session.cc:4919 session_state.cc:1053
+#: location.cc:1059 session.cc:1667 session.cc:6305 session_state.cc:1205
 msgid "session"
 msgstr ""
 
-#: location.cc:1112
+#: location.cc:1126
 msgid "could not load location from session file - ignored"
 msgstr ""
 
@@ -1066,48 +1285,104 @@ msgid ""
 "You may rename the imported location:"
 msgstr ""
 
-#: ltc_slave.cc:272
+#: ltc_file_reader.cc:96
+msgid "LTCFileReader: cannot open file \"%1\""
+msgstr ""
+
+#: ltc_file_reader.cc:105
+msgid "LTCFileReader: cannot open file \"%1\" (%3)"
+msgstr ""
+
+#: ltc_file_reader.cc:109
+msgid "LTCFileReader: \"%1\" is an empty audio file"
+msgstr ""
+
+#: ltc_file_reader.cc:134
+msgid "LTCFileReader:: invalid audio channel selected"
+msgstr ""
+
+#: ltc_slave.cc:275
 msgid "Session framerate adjusted from %1 to LTC's %2."
 msgstr ""
 
-#: ltc_slave.cc:286
+#: ltc_slave.cc:289
 msgid "Session and LTC framerate mismatch: LTC:%1 Session:%2."
 msgstr ""
 
-#: ltc_slave.cc:603
+#: ltc_slave.cc:609
 msgid "flywheel"
 msgstr ""
 
-#: midi_diskstream.cc:173
+#: lua_api.cc:87
+msgid "Script with given name was not found\n"
+msgstr ""
+
+#: lua_api.cc:96
+msgid "Failed to instantiate Lua Processor\n"
+msgstr ""
+
+#: luaproc.cc:876
+msgid "Failed to load Lua script from session state."
+msgstr ""
+
+#: luaproc.cc:886
+msgid "Session State for LuaProcessor did not include a Lua script."
+msgstr ""
+
+#: luaproc.cc:890
+msgid "Invalid/incompatible Lua script found for LuaProcessor."
+msgstr ""
+
+#: luaproc.cc:918
+msgid "Bad node sent to LuaProc::set_state"
+msgstr ""
+
+#: luaproc.cc:928
+msgid "LuaProc: port has no symbol, ignored"
+msgstr ""
+
+#: luaproc.cc:934
+msgid "LuaProc: port has no value, ignored"
+msgstr ""
+
+#: luaproc.cc:1164
+msgid "Unable to create LuaProc presets directory"
+msgstr ""
+
+#: luascripting.cc:132
+msgid "Script '%1' has no valid descriptor."
+msgstr ""
+
+#: midi_diskstream.cc:172
 msgid ""
 "%1: I/O configuration change %4 requested to use %2, but channel setup is %3"
 msgstr ""
 
-#: midi_diskstream.cc:225
+#: midi_diskstream.cc:224
 msgid "MidiDiskstream: Playlist \"%1\" isn't a midi playlist"
 msgstr ""
 
-#: midi_diskstream.cc:276
+#: midi_diskstream.cc:275
 msgid "MidiDiskstream %1: there is no existing playlist to make a copy of!"
 msgstr ""
 
-#: midi_diskstream.cc:754
+#: midi_diskstream.cc:753
 msgid "MidiDiskstream %1: cannot read %2 from playlist at frame %3"
 msgstr ""
 
-#: midi_diskstream.cc:891
+#: midi_diskstream.cc:890
 msgid "MidiDiskstream %1: cannot write to disk"
 msgstr ""
 
-#: midi_diskstream.cc:925
+#: midi_diskstream.cc:924
 msgid "MidiDiskstream \"%1\": cannot flush captured data to disk!"
 msgstr ""
 
-#: midi_diskstream.cc:1014
+#: midi_diskstream.cc:1013
 msgid "%1: could not create region for complete midi file"
 msgstr ""
 
-#: midi_diskstream.cc:1055
+#: midi_diskstream.cc:1054
 msgid "MidiDiskstream: could not create region for captured midi!"
 msgstr ""
 
@@ -1127,31 +1402,47 @@ msgstr ""
 msgid "No SysExID found for sys-ex property change - ignored"
 msgstr ""
 
-#: midi_model.cc:1994
-msgid "transpose"
+#: midi_patch_manager.cc:78
+msgid "Loading %1 MIDI patch from %2"
+msgid_plural "Loading %1 MIDI patches from %2"
+msgstr[0] ""
+msgstr[1] ""
+
+#: midi_patch_manager.cc:109
+msgid "Unloading %1 MIDI patch from %2"
+msgid_plural "Unloading %1 MIDI patches from %2"
+msgstr[0] ""
+msgstr[1] ""
+
+#: midi_patch_manager.cc:126
+msgid "Error parsing MIDI patch file %1"
 msgstr ""
 
-#: midi_patch_manager.cc:133
+#: midi_patch_manager.cc:135
 msgid "Duplicate MIDI device `%1' in `%2' ignored"
 msgstr ""
 
-#: midi_scene_changer.cc:295
+#: midi_patch_manager.cc:170
+msgid "Removing MIDI patch file %1"
+msgstr ""
+
+#: midi_scene_changer.cc:312
 msgid "Scene "
 msgstr ""
 
-#: midi_source.cc:125
+#: midi_source.cc:126
 msgid "Missing parameter property on InterpolationStyle"
 msgstr ""
 
-#: midi_source.cc:131
+#: midi_source.cc:132
 msgid "Missing style property on InterpolationStyle"
 msgstr ""
 
-#: midi_source.cc:140
+#: midi_source.cc:141
 msgid "Missing parameter property on AutomationState"
 msgstr ""
 
-#: midi_source.cc:146
+#: midi_source.cc:147
 msgid "Missing state property on AutomationState"
 msgstr ""
 
@@ -1159,58 +1450,58 @@ msgstr ""
 msgid "MIDI stretch created non-MIDI source"
 msgstr ""
 
-#: monitor_processor.cc:53
+#: monitor_processor.cc:54
 msgid "monitor dim"
 msgstr ""
 
-#: monitor_processor.cc:54
+#: monitor_processor.cc:55
 msgid "monitor cut"
 msgstr ""
 
-#: monitor_processor.cc:55
+#: monitor_processor.cc:56
 msgid "monitor mono"
 msgstr ""
 
-#: monitor_processor.cc:58
+#: monitor_processor.cc:59
 msgid "monitor dim level"
 msgstr ""
 
-#: monitor_processor.cc:62
+#: monitor_processor.cc:63
 msgid "monitor solo boost level"
 msgstr ""
 
-#: monitor_processor.cc:512
+#: monitor_processor.cc:543
 msgid "cut control %1"
 msgstr ""
 
-#: monitor_processor.cc:513
+#: monitor_processor.cc:544
 msgid "dim control"
 msgstr ""
 
-#: monitor_processor.cc:514
+#: monitor_processor.cc:545
 msgid "polarity control"
 msgstr ""
 
-#: monitor_processor.cc:515
+#: monitor_processor.cc:546
 msgid "solo control"
 msgstr ""
 
-#: mtc_slave.cc:240
+#: mtc_slave.cc:241
 msgid "MTC Slave: atomic read of current time failed, sleeping!"
 msgstr ""
 "MTC Slave: ατομική ανάγνωση του τρέχοντος χρόνου απέτυχε, πίσω για ύπνο!"
 
-#: mtc_slave.cc:362
+#: mtc_slave.cc:363
 msgid ""
 "Unknown rate/drop value %1 in incoming MTC stream, session values used "
 "instead"
 msgstr ""
 
-#: mtc_slave.cc:382
+#: mtc_slave.cc:383
 msgid "Session framerate adjusted from %1 TO: MTC's %2."
 msgstr ""
 
-#: mtc_slave.cc:396
+#: mtc_slave.cc:397
 msgid "Session and MTC framerate mismatch: MTC:%1 %2:%3."
 msgstr ""
 
@@ -1266,7 +1557,7 @@ msgstr ""
 msgid "fixed time region copy"
 msgstr ""
 
-#: pannable.cc:207
+#: pannable.cc:208
 msgid "Pannable given XML data for %1 - ignored"
 msgstr ""
 
@@ -1300,19 +1591,67 @@ msgstr ""
 msgid "select panner: %1\n"
 msgstr ""
 
-#: panner_shell.cc:255
+#: panner_shell.cc:257
 msgid "Unknown panner plugin \"%1\" found in pan state - ignored"
 msgstr "Άγνωστο plugin για panner \"%1\" ευρέθη στην κατάσταση pan - αγνοήθηκε"
 
-#: panner_shell.cc:261
+#: panner_shell.cc:263
 msgid "panner plugin node has no type information!"
 msgstr "ο κόμβος για τα plugin του panner δεν  έχει πληροφορίες τύπου!"
 
-#: playlist.cc:2138
+#: parameter_descriptor.cc:201
+msgid "Note|C"
+msgstr ""
+
+#: parameter_descriptor.cc:202
+msgid "Note|C#"
+msgstr ""
+
+#: parameter_descriptor.cc:203
+msgid "Note|D"
+msgstr ""
+
+#: parameter_descriptor.cc:204
+msgid "Note|D#"
+msgstr ""
+
+#: parameter_descriptor.cc:205
+msgid "Note|E"
+msgstr ""
+
+#: parameter_descriptor.cc:206
+msgid "Note|F"
+msgstr ""
+
+#: parameter_descriptor.cc:207
+msgid "Note|F#"
+msgstr ""
+
+#: parameter_descriptor.cc:208
+msgid "Note|G"
+msgstr ""
+
+#: parameter_descriptor.cc:209
+msgid "Note|G#"
+msgstr ""
+
+#: parameter_descriptor.cc:210
+msgid "Note|A"
+msgstr ""
+
+#: parameter_descriptor.cc:211
+msgid "Note|A#"
+msgstr ""
+
+#: parameter_descriptor.cc:212
+msgid "Note|B"
+msgstr ""
+
+#: playlist.cc:2234
 msgid "region state node has no ID, ignored"
 msgstr ""
 
-#: playlist.cc:2156
+#: playlist.cc:2252
 msgid "Playlist: cannot create region from XML"
 msgstr ""
 
@@ -1324,35 +1663,59 @@ msgstr ""
 msgid "Could not construct playlist for PlaylistSource from session data!"
 msgstr ""
 
-#: plugin.cc:328
+#: plugin.cc:126
+msgid "Cannot remove plugin factory preset."
+msgstr ""
+
+#: plugin.cc:144
+msgid "Preset with given name already exists."
+msgstr ""
+
+#: plugin.cc:263
+msgid "Audio"
+msgstr ""
+
+#: plugin.cc:266
+msgid "Midi"
+msgstr ""
+
+#: plugin.cc:269
+msgid "?"
+msgstr ""
+
+#: plugin.cc:412
 msgid ""
 "Plugin presets are not supported in this build of %1. Consider paying for a "
 "full version"
 msgstr ""
 
-#: plugin.cc:403
+#: plugin.cc:495
 msgid ""
 "Saving plugin settings is not supported in this build of %1. Consider paying "
 "for the full version"
 msgstr ""
 
-#: plugin_insert.cc:596
+#: plugin_insert.cc:1148
 msgid "programming error: "
 msgstr "σφάλμα προγραμματισμού: "
 
-#: plugin_insert.cc:933
+#: plugin_insert.cc:1700
+msgid "SC %1"
+msgstr ""
+
+#: plugin_insert.cc:2352
 msgid "XML node describing plugin is missing the `type' field"
 msgstr ""
 
-#: plugin_insert.cc:948
+#: plugin_insert.cc:2369
 msgid "unknown plugin type %1 in plugin insert state"
 msgstr "άγνωστος τύπος plugin %1 στην κατάσταση εισαχθέντων plugins"
 
-#: plugin_insert.cc:976
+#: plugin_insert.cc:2397
 msgid "Plugin has no unique ID field"
 msgstr ""
 
-#: plugin_insert.cc:1001
+#: plugin_insert.cc:2435
 msgid ""
 "Found a reference to a plugin (\"%1\") that is unknown.\n"
 "Perhaps it was removed or moved since it was last used."
@@ -1360,91 +1723,187 @@ msgstr ""
 "Ευρέθη μια αναφορά σε plugin (\"%1\") που είναι άγνωστο.\n"
 "Ίσως έχει διαγραφεί ή μετακινηθεί από την τελευταία του χρήση."
 
-#: plugin_insert.cc:1115
+#: plugin_insert.cc:2645
 msgid "PluginInsert: Auto: no ladspa port number"
 msgstr "PluginInsert: Auto: χωρίς αριθμό θύρας ladspa"
 
-#: plugin_insert.cc:1122
+#: plugin_insert.cc:2652
 msgid "PluginInsert: Auto: port id out of range"
 msgstr "PluginInsert: Auto: το id θύρας είναι εκτός πεδίου"
 
-#: plugin_insert.cc:1158
+#: plugin_insert.cc:2688
 msgid "PluginInsert: automatable control %1 not found - ignored"
 msgstr ""
 
-#: plugin_manager.cc:209
+#: plugin_manager.cc:220
 msgid "Discovering Plugins"
 msgstr ""
 
-#: plugin_manager.cc:231
+#: plugin_manager.cc:251
 msgid "Scanning LADSPA Plugins"
 msgstr ""
 
-#: plugin_manager.cc:234
+#: plugin_manager.cc:253
+msgid "Scanning Lua DSP Processors"
+msgstr ""
+
+#: plugin_manager.cc:256
 msgid "Scanning LV2 Plugins"
 msgstr ""
 
-#: plugin_manager.cc:239
+#: plugin_manager.cc:262
 msgid "Scanning Windows VST Plugins"
 msgstr ""
 
-#: plugin_manager.cc:246
+#: plugin_manager.cc:264
+msgid "Discovering Windows VST Plugins"
+msgstr ""
+
+#: plugin_manager.cc:273
 msgid "Scanning Linux VST Plugins"
 msgstr ""
 
-#: plugin_manager.cc:252
+#: plugin_manager.cc:275
+msgid "Discovering Linux VST Plugins"
+msgstr ""
+
+#: plugin_manager.cc:288
+msgid "VST Blacklist: "
+msgstr ""
+
+#: plugin_manager.cc:290
+msgid "VST Blacklist:"
+msgstr ""
+
+#: plugin_manager.cc:300
 msgid "Scanning AU Plugins"
 msgstr ""
 
-#: plugin_manager.cc:256
+#: plugin_manager.cc:302
+msgid "Discovering AU Plugins"
+msgstr ""
+
+#: plugin_manager.cc:307
 msgid "Plugin Scan Complete..."
 msgstr ""
 
-#: plugin_manager.cc:393
+#: plugin_manager.cc:513
 msgid "LADSPA"
 msgstr ""
 
-#: plugin_manager.cc:445
+#: plugin_manager.cc:565
 msgid "Could not parse rdf file: %1"
 msgstr "Δεν μπόρεσα να αναλύσω το αρχείο rdf: %1"
 
-#: plugin_manager.cc:482
+#: plugin_manager.cc:602
 msgid "LADSPA: cannot load module \"%1\" (%2)"
 msgstr "LADSPA: δεν μπορώ να φορτώσω το module \"%1\" (%2)"
 
-#: plugin_manager.cc:489
+#: plugin_manager.cc:609
 msgid "LADSPA: module \"%1\" has no descriptor function."
 msgstr "LADSPA: το module \"%1\" δεν έχει λειτουργία περιγραφής."
 
-#: plugin_manager.cc:705
+#: plugin_manager.cc:813
+msgid "--- Windows VST plugins Scan: %1"
+msgstr ""
+
+#: plugin_manager.cc:819
 msgid "VST"
 msgstr ""
 
-#: plugin_manager.cc:732
+#: plugin_manager.cc:824
+msgid "--- Windows VST plugins Scan Done"
+msgstr ""
+
+#: plugin_manager.cc:839
+msgid "cannot open dll"
+msgstr ""
+
+#: plugin_manager.cc:843
+msgid "invalid dll, file too small"
+msgstr ""
+
+#: plugin_manager.cc:847
+msgid "not a dll"
+msgstr ""
+
+#: plugin_manager.cc:853
+msgid "cannot determine dll type"
+msgstr ""
+
+#: plugin_manager.cc:857
+msgid "cannot read dll PE header"
+msgstr ""
+
+#: plugin_manager.cc:862
+msgid "invalid dll PE header"
+msgstr ""
+
+#: plugin_manager.cc:869
+msgid "i386 (32-bit)"
+msgstr ""
+
+#: plugin_manager.cc:872
+msgid "Itanium"
+msgstr ""
+
+#: plugin_manager.cc:875
+msgid "x64 (64-bit)"
+msgstr ""
+
+#: plugin_manager.cc:878
+msgid "Native Architecture"
+msgstr ""
+
+#: plugin_manager.cc:881
+msgid "Unknown Architecture"
+msgstr ""
+
+#: plugin_manager.cc:897
+msgid " *  %1 (cache only)"
+msgstr ""
+
+#: plugin_manager.cc:899
+msgid " *  %1 - %2"
+msgstr ""
+
+#: plugin_manager.cc:913
+msgid " -> Cannot get Windows VST information, plugin ignored."
+msgstr ""
+
+#: plugin_manager.cc:924
 msgid ""
-"VST plugin %1 does not support processReplacing, and so cannot be used in %2 "
-"at this time"
+"VST plugin %1 does not support processReplacing, and cannot be used in %2 at "
+"this time"
 msgstr ""
 
-#: plugin_manager.cc:824
+#: plugin_manager.cc:959
+msgid "Ignoring duplicate Windows VST plugin \"%1\""
+msgstr ""
+
+#: plugin_manager.cc:971
+msgid " -> OK (VST Plugin \"%1\" was added)."
+msgstr ""
+
+#: plugin_manager.cc:1019
 msgid "LXVST"
 msgstr ""
 
-#: plugin_manager.cc:851
+#: plugin_manager.cc:1046
 msgid ""
 "linuxVST plugin %1 does not support processReplacing, and so cannot be used "
 "in %2 at this time"
 msgstr ""
 
-#: plugin_manager.cc:1020
+#: plugin_manager.cc:1213
 msgid "unknown plugin status type \"%1\" - all entries ignored"
 msgstr ""
 
-#: plugin_manager.cc:1037
+#: plugin_manager.cc:1232
 msgid "unknown plugin type \"%1\" - ignored"
 msgstr ""
 
-#: port.cc:450
+#: port.cc:504
 msgid "could not reregister %1"
 msgstr "αδύνατη η επανακαταγραφή %1"
 
@@ -1452,152 +1911,215 @@ msgstr "αδύνατη η επανακαταγραφή %1"
 msgid "insert %1"
 msgstr ""
 
-#: port_insert.cc:197
+#: port_insert.cc:204
 msgid "XML node describing port insert is missing the `type' field"
 msgstr ""
 
-#: port_insert.cc:202
+#: port_insert.cc:209
 msgid "non-port insert XML used for port plugin insert"
 msgstr "εισαγωγή μη-θύρας XML για χρήση σε εισαγωγή  plugin θύρας"
 
-#: port_manager.cc:287
+#: port_manager.cc:288
 msgid ""
 "a port with the name \"%1\" already exists: check for duplicated track/bus "
 "names"
 msgstr ""
 
-#: port_manager.cc:289
+#: port_manager.cc:290
 msgid ""
 "No more ports are available. You will need to stop %1 and restart with more "
 "ports if you need this many tracks."
 msgstr ""
 
-#: port_manager.cc:292
+#: port_manager.cc:293
 msgid "AudioEngine: cannot register port \"%1\": %2"
 msgstr ""
 
-#: port_manager.cc:331
+#: port_manager.cc:332
 msgid "unable to create port: %1"
 msgstr ""
 
-#: port_manager.cc:418
+#: port_manager.cc:453
 msgid "AudioEngine: cannot connect %1 (%2) to %3 (%4)"
 msgstr "AudioEngine: αδύνατη η σύνδεση %1 (%2) σε %3 (%4)"
 
-#: port_manager.cc:470 port_manager.cc:471
+#: port_manager.cc:505 port_manager.cc:506
 msgid "Re-establising port %1 failed"
 msgstr ""
 
-#: processor.cc:214
+#: processor.cc:218
 msgid "No %1 property flag in element %2"
 msgstr ""
 
-#: processor.cc:223
+#: processor.cc:227
 msgid "No child node with active property"
 msgstr ""
 
-#: rc_configuration.cc:91
+#: rc_configuration.cc:92
 msgid "Loading system configuration file %1"
 msgstr "Ανάκληση αρχείου ρυθμίσεων συστήματος %1"
 
-#: rc_configuration.cc:95
+#: rc_configuration.cc:96
 msgid "%1: cannot read system configuration file \"%2\""
 msgstr ""
 
-#: rc_configuration.cc:100
+#: rc_configuration.cc:101
 msgid "%1: system configuration file \"%2\" not loaded successfully."
 msgstr ""
 
-#: rc_configuration.cc:104
+#: rc_configuration.cc:105
 msgid ""
 "Your system %1 configuration file is empty. This probably means that there "
 "was an error installing %1"
 msgstr ""
 
-#: rc_configuration.cc:119
+#: rc_configuration.cc:120
 msgid "Loading user configuration file %1"
 msgstr "Ανάκληση αρχείου ρυθμίσεων χρήστη %1"
 
-#: rc_configuration.cc:123
+#: rc_configuration.cc:124
 msgid "%1: cannot read configuration file \"%2\""
 msgstr ""
 
-#: rc_configuration.cc:128
+#: rc_configuration.cc:129
 msgid "%1: user configuration file \"%2\" not loaded successfully."
 msgstr ""
 
-#: rc_configuration.cc:132
+#: rc_configuration.cc:133
 msgid "your %1 configuration file is empty. This is not normal."
 msgstr ""
 
-#: rc_configuration.cc:149
+#: rc_configuration.cc:150
 msgid "Config file %1 not saved"
 msgstr "Αρχείο ρυθμίσεων %1 δεν αποθηκεύθηκε"
 
-#: recent_sessions.cc:54
+#: recent_sessions.cc:55
 msgid "cannot open recent session file %1 (%2)"
 msgstr "δεν μπορώ να ανοίξω το πρόσφατο αρχείο συνεδρίας %1 (%2)"
 
-#: region_factory.cc:78 region_factory.cc:120 region_factory.cc:161
-#: region_factory.cc:203
+#: recent_sessions.cc:68 recent_sessions.cc:126
+msgid "Error reading recent session file %1 (%2)"
+msgstr ""
+
+#: recent_sessions.cc:113
+msgid "Cannot open recent template file %1 (%2)"
+msgstr ""
+
+#: recent_sessions.cc:176
+msgid "Error writing recent sessions file %1 (%2)"
+msgstr ""
+
+#: recent_sessions.cc:211
+msgid "Error writing saved template file %1 (%2)"
+msgstr ""
+
+#: region_factory.cc:78 region_factory.cc:121 region_factory.cc:162
+#: region_factory.cc:204
 msgid ""
 "programming error: RegionFactory::create() called with unknown Region type"
 msgstr ""
 
-#: region_factory.cc:565
+#: region_factory.cc:566
 msgid "%1 compound-%2 (%3)"
 msgstr ""
 
-#: region_factory.cc:567
+#: region_factory.cc:568
 msgid "%1 compound-%2.1 (%3)"
 msgstr ""
 
-#: region_factory.cc:629
+#: region_factory.cc:630
 msgid "cannot create new name for region \"%1\""
 msgstr "δεν μπορώ να δημιουργήσω νέο όνομα για την περιοχή \"%1\""
 
-#: resampled_source.cc:102
+#: resampled_source.cc:107
 msgid "Import: %1"
 msgstr "Εισαγωγή: %1"
 
-#: resampled_source.cc:132 srcfilesource.cc:75
+#: resampled_source.cc:136 srcfilesource.cc:75
 msgid "Import: src_new() failed : %1"
 msgstr "Εισαγωγή: src_new() απέτυχε : %1"
 
-#: return.cc:41
+#: return.cc:42
 msgid "return %1"
 msgstr ""
 
-#: route.cc:1218 route.cc:2701
+#: route.cc:862 route.cc:2797
 msgid "unknown Processor type \"%1\"; ignored"
 msgstr ""
 
-#: route.cc:1240
+#: route.cc:884
 msgid "processor could not be created. Ignored."
 msgstr ""
 
-#: route.cc:2126 route.cc:2355
+#: route.cc:2338 route.cc:2504
 msgid "Bad node sent to Route::set_state() [%1]"
 msgstr "Κακός κόμβος εστάλη στο Route::set_state() [%1]"
 
-#: route.cc:2186
+#: route.cc:2395
 msgid "Pannable state found for route (%1) without a panner!"
 msgstr ""
 
-#: route.cc:2260 route.cc:2264 route.cc:2469 route.cc:2473
-msgid "badly formed order key string in state file! [%1] ... ignored."
+#: route.cc:3270
+msgid "Invalid Solo-Isolate propagation: from:%1 new:%2 - old:%3 = delta:%4"
+msgstr ""
+
+#: route.cc:4396
+msgid "Amp/Fader on Route '%1' went AWOL. Re-added."
+msgstr ""
+
+#: route.cc:4994
+msgid "lo"
+msgstr ""
+
+#: route.cc:4996
+msgid "mid"
+msgstr ""
+
+#: route.cc:4998
+msgid "hi"
+msgstr ""
+
+#: route.cc:5105
+msgid "Leveler"
 msgstr ""
-"δύσμορφη γραμμή κλειδιού ταξινομήσεως στο αρχείο καταστάσεως ! [%1] ... "
-"αγνοήθηκε."
 
-#: route.cc:2479
-msgid "Converting deprecated order key for %1 using Editor order %2"
+#: route.cc:5107
+msgid "Compressor"
 msgstr ""
 
-#: route_group.cc:459
+#: route.cc:5109 route.cc:5111
+msgid "Limiter"
+msgstr ""
+
+#: route.cc:5111
+msgid "Sidechain"
+msgstr ""
+
+#: route.cc:5114 route.cc:5116 route.cc:5133 route.cc:5135
+msgid "???"
+msgstr ""
+
+#: route.cc:5126
+msgid "Attk"
+msgstr ""
+
+#: route.cc:5128
+msgid "Ratio"
+msgstr ""
+
+#: route.cc:5131
+msgid "Rels"
+msgstr ""
+
+#: route_group.cc:507
 msgid "You cannot subgroup MIDI tracks at this time"
 msgstr ""
 
+#: route_group.cc:514
+msgid ""
+"You cannot subgroup tracks with different number of outputs at this time."
+msgstr ""
+
 #: rb_effect.cc:229 rb_effect.cc:269
 msgid "tempoize: error reading data from %1 at %2 (wanted %3, got %4)"
 msgstr ""
@@ -1606,207 +2128,247 @@ msgstr ""
 msgid "error writing tempo-adjusted data to %1"
 msgstr "σφάλμα στην εγγραφή χρονο-ρυθμισμένων δεδομένων στο %1"
 
-#: send.cc:61
+#: send.cc:62
 msgid "aux %1"
 msgstr ""
 
-#: send.cc:65
+#: send.cc:66
 msgid "send %1"
 msgstr ""
 
-#: send.cc:67
+#: send.cc:68
 msgid "programming error: send created using role %1"
 msgstr ""
 
-#: session.cc:357
+#: session.cc:348 session.cc:403
+msgid "Cannot connect to audio/midi engine"
+msgstr ""
+
+#: session.cc:358
+msgid "Session initialization failed"
+msgstr ""
+
+#: session.cc:374
+msgid "Failed to load template/snapshot state"
+msgstr ""
+
+#: session.cc:385
+msgid "Failed to load state"
+msgstr ""
+
+#: session.cc:409
+msgid "Cannot configure audio/midi engine with session parameters"
+msgstr ""
+
+#: session.cc:433
 msgid "Connect to engine"
 msgstr ""
 
-#: session.cc:362
+#: session.cc:484
 msgid "Session loading complete"
 msgstr ""
 
-#: session.cc:434
+#: session.cc:575
 msgid "Set up LTC"
 msgstr ""
 
-#: session.cc:436
+#: session.cc:577
 msgid "Set up Click"
 msgstr ""
 
-#: session.cc:438
+#: session.cc:579
 msgid "Set up standard connections"
 msgstr ""
 
-#: session.cc:664
+#: session.cc:888
 msgid "could not setup Click I/O"
 msgstr "Δεν μπόρεσα να διαμορφώσω το I/O του Μετρονόμου(click)"
 
-#: session.cc:727
+#: session.cc:951
 #, c-format
 msgid "out %s"
 msgstr ""
 
-#: session.cc:729
+#: session.cc:953
 #, c-format
 msgid "out %<PRIu32>"
 msgstr ""
 
-#: session.cc:744
+#: session.cc:968
 #, c-format
 msgid "out %<PRIu32>+%<PRIu32>"
 msgstr ""
 
-#: session.cc:761
+#: session.cc:985
 #, c-format
 msgid "in %s"
 msgstr ""
 
-#: session.cc:763
+#: session.cc:987
 #, c-format
 msgid "in %<PRIu32>"
 msgstr ""
 
-#: session.cc:778
+#: session.cc:1002
 #, c-format
 msgid "in %<PRIu32>+%<PRIu32>"
 msgstr ""
 
-#: session.cc:852
+#: session.cc:1082
 msgid "cannot connect master output %1 to %2"
 msgstr ""
 
-#: session.cc:921
-msgid "Monitor"
+#: session.cc:1170
+msgid "Cannot create monitor section. 'Monitor' Port name is not unique."
 msgstr ""
 
-#: session.cc:966
+#: session.cc:1204 session.cc:1335
 msgid "cannot connect control input %1 to %2"
 msgstr ""
 
-#: session.cc:986
+#: session.cc:1224 session.cc:1354
 msgid "The preferred I/O for the monitor bus (%1) cannot be found"
 msgstr ""
 
-#: session.cc:1017
+#: session.cc:1255 session.cc:1385
 msgid "cannot connect control output %1 to %2"
 msgstr ""
 
-#: session.cc:1085
+#: session.cc:1443
 msgid "cannot create Auditioner: no auditioning of regions possible"
 msgstr "δεν μπορώ να δημιουργήσω τον Ακροατή: καμία ακρόαση περιοχών δυνατή"
 
-#: session.cc:1270
+#: session.cc:1644
 msgid "Session: you can't use that location for auto punch (start <= end)"
 msgstr ""
 "Συνεδρία: δεν μπορείτε να χρησιμοποιήσετε αυτήν την τοποθεσία για auto punch "
 "(αρχή <= τέλος)"
 
-#: session.cc:1297
+#: session.cc:1671
 msgid "Session: you can't use that location for session start/end)"
 msgstr ""
 
-#: session.cc:1329
+#: session.cc:1703
 msgid ""
 "You cannot use this location for auto-loop because it has zero or negative "
 "length"
 msgstr ""
 
-#: session.cc:1497
+#: session.cc:1886
 msgid "programming error: session range removed!"
 msgstr ""
 
-#: session.cc:1751
+#: session.cc:2158
 msgid "feedback loop setup between %1 and %2"
 msgstr "διαμόρφωση feedback loop ανάμεσα σε %1 και %2"
 
-#: session.cc:2047
+#: session.cc:2419
+msgid "Track "
+msgstr ""
+
+#: session.cc:2421
+msgid "Audio "
+msgstr ""
+
+#: session.cc:2426
+msgid "MIDI "
+msgstr ""
+
+#: session.cc:2500
 msgid "Session: could not create new midi track."
 msgstr ""
 
-#: session.cc:2053
+#: session.cc:2506
 msgid ""
 "No more JACK ports are available. You will need to stop %1 and restart JACK "
 "with more ports if you need this many tracks."
 msgstr ""
 
-#: session.cc:2239 session.cc:2242
-msgid "Audio"
+#: session.cc:2547 session.cc:2550
+msgid "Midi Bus"
+msgstr ""
+
+#: session.cc:2572
+msgid "cannot configure new midi bus input"
+msgstr ""
+
+#: session.cc:2578
+msgid "cannot configure new midi bus output"
+msgstr ""
+
+#: session.cc:2592 session.cc:3137
+msgid "Session: could not create new audio route."
 msgstr ""
 
-#: session.cc:2266 session.cc:2274 session.cc:2352 session.cc:2360
+#: session.cc:3022 session.cc:3030 session.cc:3113 session.cc:3121
 msgid "cannot configure %1 in/%2 out configuration for new audio track"
 msgstr "δεν μπορώ να διαμορφώσω %1 in/%2 out διάταξη για νέο κανάλι ήχου"
 
-#: session.cc:2297
+#: session.cc:3050
 msgid "Session: could not create new audio track."
 msgstr "Συνεδρία: δεν μπόρεσα να δημιουργήσω νέο κανάλι ήχου."
 
-#: session.cc:2330 session.cc:2333
+#: session.cc:3088 session.cc:3091
 msgid "Bus"
 msgstr ""
 
-#: session.cc:2383
-msgid "Session: could not create new audio route."
-msgstr ""
-
-#: session.cc:2443 session.cc:2453
+#: session.cc:3207 session.cc:3217
 msgid "Session: UINT_MAX routes? impossible!"
 msgstr ""
 
-#: session.cc:2475
+#: session.cc:3293
 msgid "Session: cannot create track/bus from template description"
 msgstr ""
 
-#: session.cc:2501
+#: session.cc:3331
 msgid "Session: could not create new route from template"
 msgstr ""
 
-#: session.cc:2531
+#: session.cc:3365
 msgid "Adding new tracks/busses failed"
 msgstr ""
 
-#: session.cc:3671
+#: session.cc:4784
 msgid "Merging embedded file %1: name collision AND md5 hash collision!"
 msgstr ""
 
-#: session.cc:3801 session.cc:3874
+#: session.cc:4914 session.cc:4987
 msgid "There are already %1 recordings for %2, which I consider too many."
 msgstr "Υπάρχουν ήδη %1 εγγραφές για %2, τις οποίες θεωρώ πάρα πολλές."
 
-#: session.cc:4316
+#: session.cc:5663
 msgid "send ID %1 appears to be in use already"
 msgstr ""
 
-#: session.cc:4328
+#: session.cc:5675
 msgid "aux send ID %1 appears to be in use already"
 msgstr ""
 
-#: session.cc:4340
+#: session.cc:5687
 msgid "return ID %1 appears to be in use already"
 msgstr ""
 
-#: session.cc:4352
+#: session.cc:5699
 msgid "insert ID %1 appears to be in use already"
 msgstr ""
 
-#: session.cc:4477
+#: session.cc:5825
 msgid "Cannot write a range where end <= start (e.g. %1 <= %2)"
 msgstr ""
 
-#: session.cc:4486
+#: session.cc:5834
 msgid "Cannot write a range with no data."
 msgstr ""
 
-#: session.cc:4528
+#: session.cc:5876
 msgid "cannot create new file \"%1\" for %2"
 msgstr ""
 
-#: session_click.cc:161
+#: session_click.cc:162
 msgid "cannot open click soundfile %1 (%2)"
 msgstr "δεν μπορώ να ανοίξω τοsoundfile μετρονόμου%1 (%2)"
 
-#: session_click.cc:174
+#: session_click.cc:175
 msgid "cannot read data from click soundfile"
 msgstr "δεν μπορώ να διαβάσω δεδομένα από το soundfile μετρονόμου"
 
@@ -1845,25 +2407,38 @@ msgstr ""
 msgid "Could not save session options"
 msgstr ""
 
-#: session_directory.cc:59
+#: session_directory.cc:65
 msgid "Cannot create Session directory at path %1 Error: %2"
 msgstr ""
 
-#: session_directory.cc:76
+#: session_directory.cc:82
 msgid "Session subdirectory does not exist at path %1"
 msgstr ""
 
-#: session_events.cc:234
+#: session_directory.cc:161
+msgid ""
+"session-dir and session-name mismatch. Please use 'Menu > Session > Rename' "
+"in the future to rename sessions."
+msgstr ""
+
+#: session_directory.cc:167
+msgid ""
+"The session's interchange dir is tainted.\n"
+"There is more than one folder in '%1'.\n"
+"Please remove extra subdirs to reduce possible filename ambiguties."
+msgstr ""
+
+#: session_events.cc:229
 msgid "Session: cannot have two events of type %1 at the same frame (%2)."
 msgstr ""
 "Συνεδρία: δεν γίνεται να υπάρχουν δύο συμβάντα του τύπου %1 στο ίδιο frame "
 "(%2)."
 
-#: session_export.cc:125
+#: session_export.cc:152
 msgid "%1: cannot seek to %2 for export"
 msgstr "%1: δεν μπορώ να αναζητήσω στο %2 για εξαγωγή"
 
-#: session_export.cc:182
+#: session_export.cc:216
 msgid "Export ended unexpectedly: %1"
 msgstr ""
 
@@ -1873,244 +2448,256 @@ msgid ""
 "of this session."
 msgstr ""
 
-#: session_midi.cc:520
+#: session_midi.cc:570
 msgid "Session: cannot send quarter-frame MTC message (%1)"
 msgstr "Συνεδρία: δεν μπορώ να στείλω τέταρτο-frame MTC μήνυμα (%1)"
 
-#: session_playlists.cc:378 session_playlists.cc:397
+#: session_playlists.cc:405 session_playlists.cc:424
 msgid "Session: cannot create Playlist from XML description."
 msgstr "Συνεδρία: δεν μπορώ να δημιουργήσω την Playlist από την XML περιγραφή."
 
-#: session_process.cc:136
+#: session_process.cc:159
 msgid "Session: error in no roll for %1"
 msgstr "Συνεδρία: σφάλμα στο no roll για %1"
 
-#: session_process.cc:1174
+#: session_process.cc:1202
 msgid "Programming error: illegal event type in process_event (%1)"
 msgstr ""
 "Σφάλμα προγραμματισμού: παράνομος τύπος συμβάντος στο process_event (%1)"
 
-#: session_state.cc:179
+#: session_state.cc:194
 msgid "solo cut control (dB)"
 msgstr ""
 
-#: session_state.cc:203
+#: session_state.cc:216
 msgid "Set block size and sample rate"
 msgstr ""
 
-#: session_state.cc:208
+#: session_state.cc:221
 msgid "Using configuration"
 msgstr ""
 
-#: session_state.cc:331
+#: session_state.cc:348
 msgid "Reset Remote Controls"
 msgstr ""
 
-#: session_state.cc:423
+#: session_state.cc:377 session_state.cc:409
+msgid "Filling playback buffers"
+msgstr ""
+
+#: session_state.cc:475
 msgid "Session: cannot create session peakfile folder \"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:430
+#: session_state.cc:482
 msgid "Session: cannot create session sounds dir \"%1\" (%2)"
 msgstr "Συνεδρία: δεν μπορώ να δημιουργήσω φάκελο ήχων συνεδρίας \"%1\" (%2)"
 
-#: session_state.cc:437
+#: session_state.cc:489
 msgid "Session: cannot create session midi dir \"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:444
+#: session_state.cc:496
 msgid "Session: cannot create session dead sounds folder \"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:451
+#: session_state.cc:503
 msgid "Session: cannot create session export folder \"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:458
+#: session_state.cc:510
 msgid "Session: cannot create session analysis folder \"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:465
+#: session_state.cc:517
 msgid "Session: cannot create session plugins folder \"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:472
+#: session_state.cc:524
 msgid "Session: cannot create session externals folder \"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:486
+#: session_state.cc:538
 msgid "Session: cannot create session folder \"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:520
+#: session_state.cc:569
+msgid "Error reading session template file %1 (%2)"
+msgstr ""
+
+#: session_state.cc:584
+msgid "Error writing session template file %1 (%2)"
+msgstr ""
+
+#: session_state.cc:601
 msgid "Could not open %1 for writing session template"
 msgstr ""
 
-#: session_state.cc:526
+#: session_state.cc:608
 msgid "Could not open session template %1 for reading"
 msgstr ""
 
-#: session_state.cc:545
-msgid "Master"
+#: session_state.cc:626
+msgid "Loop"
 msgstr ""
 
-#: session_state.cc:606
+#: session_state.cc:707
 msgid "Could not remove pending capture state at path \"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:630
+#: session_state.cc:731
 msgid "could not rename snapshot %1 to %2 (%3)"
 msgstr ""
 
-#: session_state.cc:658
+#: session_state.cc:759
 msgid "Could not remove session file at path \"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:685
+#: session_state.cc:788
 msgid ""
 "the %1 audio engine is not connected and state saving would lose all I/O "
 "connections. Session not saved"
 msgstr ""
 
-#: session_state.cc:736
+#: session_state.cc:856
 msgid "state could not be saved to %1"
 msgstr "η κατάσταση δεν μπορούσε να σωθεί στο %1"
 
-#: session_state.cc:738 session_state.cc:749
+#: session_state.cc:858 session_state.cc:871
 msgid "Could not remove temporary session file at path \"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:746
+#: session_state.cc:868
 msgid "could not rename temporary session file %1 to %2 (%3)"
 msgstr ""
 
-#: session_state.cc:814
+#: session_state.cc:942
 msgid "%1: session file \"%2\" doesn't exist!"
 msgstr ""
 
-#: session_state.cc:826
+#: session_state.cc:954
 msgid "Could not understand session file %1"
 msgstr ""
 
-#: session_state.cc:835
+#: session_state.cc:963
 msgid "Session file %1 is not a session"
 msgstr ""
 
-#: session_state.cc:1147
+#: session_state.cc:1332
 msgid "programming error: Session: incorrect XML node sent to set_state()"
 msgstr ""
 "σφάλμα προγραμματισμού: Συνεδρία: λανθασμένος κόμβος XML εστάλη στην "
 "set_state()"
 
-#: session_state.cc:1201
+#: session_state.cc:1410
 msgid "Session: XML state has no options section"
 msgstr "Συνεδρία: η XML κατάσταση δεν έχει τομέα επιλογών(options)"
 
-#: session_state.cc:1206
+#: session_state.cc:1415
 msgid "Session: XML state has no metadata section"
 msgstr ""
 
-#: session_state.cc:1217
+#: session_state.cc:1426
 msgid "Session: XML state has no sources section"
 msgstr "Συνεδρία: η XML κατάσταση δεν έχει τομέα πηγών"
 
-#: session_state.cc:1224
+#: session_state.cc:1433
 msgid "Session: XML state has no Tempo Map section"
 msgstr "Συνεδρία: η XML κατάσταση δεν έχει τομέα Tempo Map"
 
-#: session_state.cc:1231
+#: session_state.cc:1440
 msgid "Session: XML state has no locations section"
 msgstr "Συνεδρία: η XML κατάσταση δεν έχει τομέα τοποθεσιών"
 
-#: session_state.cc:1244
+#: session_state.cc:1453
 msgid "Session: XML state has no Regions section"
 msgstr "Συνεδρία: η XML κατάσταση δεν έχει τομέα Περιοχών"
 
-#: session_state.cc:1251
+#: session_state.cc:1460
 msgid "Session: XML state has no playlists section"
 msgstr "Συνεδρία: η XML κατάσταση δεν έχει τομέα playlists"
 
-#: session_state.cc:1271
+#: session_state.cc:1480
 msgid "Session: XML state has no bundles section"
 msgstr ""
 
-#: session_state.cc:1283
+#: session_state.cc:1492
 msgid "Session: XML state has no diskstreams section"
 msgstr "Συνεδρία: η XML κατάσταση δεν έχει τομέα diskstreams"
 
-#: session_state.cc:1291
+#: session_state.cc:1504
 msgid "Session: XML state has no routes section"
 msgstr "Συνεδρία: η XML κατάσταση δεν έχει τομέα διαδρομών"
 
-#: session_state.cc:1303
+#: session_state.cc:1520
 msgid "Session: XML state has no route groups section"
 msgstr ""
 
-#: session_state.cc:1312
+#: session_state.cc:1529
 msgid "Session: XML state has no edit groups section"
 msgstr "Συνεδρία: η XML κατάσταση δεν έχει τομέα επεξερ/σίας ομάδων"
 
-#: session_state.cc:1319
+#: session_state.cc:1536
 msgid "Session: XML state has no mix groups section"
 msgstr "Συνεδρία: η XML κατάσταση δεν έχει τομέα μίξεως ομάδων"
 
-#: session_state.cc:1327
+#: session_state.cc:1544
 msgid "Session: XML state has no click section"
 msgstr "Συνεδρία: η XML κατάσταση δεν έχει τομέα μετρονόμου"
 
-#: session_state.cc:1373
+#: session_state.cc:1606
 msgid "Session: cannot create Route from XML description."
 msgstr "Συνεδρία: δεν μπορώ να δημιουργήσω Διαδρομή από XML περιγραφή."
 
-#: session_state.cc:1377
+#: session_state.cc:1610
 msgid "Loaded track/bus %1"
 msgstr ""
 
-#: session_state.cc:1382
+#: session_state.cc:1615
 msgid "Tracks/busses loaded;  Adding to Session"
 msgstr ""
 
-#: session_state.cc:1386
+#: session_state.cc:1619
 msgid "Finished adding tracks/busses"
 msgstr ""
 
-#: session_state.cc:1485
+#: session_state.cc:1709
 msgid "Could not find diskstream for route"
 msgstr ""
 
-#: session_state.cc:1545
+#: session_state.cc:1760
 msgid "Session: cannot create Region from XML description."
 msgstr "Συνεδρία: δεν μπορώ να δημιουργήσω Περιοχή από XML περιγραφή."
 
-#: session_state.cc:1549
+#: session_state.cc:1764
 msgid "Can not load state for region '%1'"
 msgstr ""
 
-#: session_state.cc:1585
+#: session_state.cc:1800
 msgid "Regions in compound description not found (ID's %1 and %2): ignored"
 msgstr ""
 
-#: session_state.cc:1613
+#: session_state.cc:1828
 msgid "Nested source has no ID info in session file! (ignored)"
 msgstr ""
 
-#: session_state.cc:1625
+#: session_state.cc:1840
 msgid "Cannot reconstruct nested source for region %1"
 msgstr ""
 
-#: session_state.cc:1687
+#: session_state.cc:1902
 msgid "Session: XMLNode describing a AudioRegion is incomplete (no source)"
 msgstr ""
 "Συνεδρία: Ο XMLΚόμβος που περιγράφει AudioΠεριοχή είναι ημιτελής (δίχως πηγή)"
 
-#: session_state.cc:1695 session_state.cc:1716 session_state.cc:1736
+#: session_state.cc:1910 session_state.cc:1931 session_state.cc:1951
 msgid ""
 "Session: XMLNode describing a AudioRegion references an unknown source id =%1"
 msgstr ""
 "Συνεδρία: Ο XMLΚόμβος που περιγράφει AudioΠεριοχή αναφέρει άγνωστο id πηγής ="
 "%1"
 
-#: session_state.cc:1701 session_state.cc:1722 session_state.cc:1742
+#: session_state.cc:1916 session_state.cc:1937 session_state.cc:1957
 msgid ""
 "Session: XMLNode describing a AudioRegion references a non-audio source id ="
 "%1"
@@ -2118,175 +2705,216 @@ msgstr ""
 "Συνεδρία: Ο XMLNode που περιγράφει AudioRegion αναφέρει μη-ηχητική πηγή με "
 "id =%1"
 
-#: session_state.cc:1765
+#: session_state.cc:1980
 msgid ""
 "Session: XMLNode describing an AudioRegion is missing some master sources; "
 "ignored"
 msgstr ""
 
-#: session_state.cc:1799
+#: session_state.cc:2014
 msgid "Session: XMLNode describing a MidiRegion is incomplete (no source)"
 msgstr ""
 
-#: session_state.cc:1807
+#: session_state.cc:2022
 msgid ""
 "Session: XMLNode describing a MidiRegion references an unknown source id =%1"
 msgstr ""
 
-#: session_state.cc:1813
+#: session_state.cc:2028
 msgid ""
 "Session: XMLNode describing a MidiRegion references a non-midi source id =%1"
 msgstr ""
 
-#: session_state.cc:1872
+#: session_state.cc:2101
 msgid "Session: cannot create Source from XML description."
 msgstr "Συνεδρία: δεν μπορώ να δημιουργήσω Πηγή από XML περιγραφή."
 
-#: session_state.cc:1880
+#: session_state.cc:2109
 msgid ""
 "A external MIDI file is missing. %1 cannot currently recover from missing "
 "external MIDI files"
 msgstr ""
 
-#: session_state.cc:1962
+#: session_state.cc:2191
 msgid "Found a sound file that cannot be used by %1. Talk to the programmers."
 msgstr ""
 
-#: session_state.cc:1979
+#: session_state.cc:2212
 msgid "Could not create templates directory \"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:1992
+#: session_state.cc:2224
 msgid "Template \"%1\" already exists - new version not created"
 msgstr "Το προσχέδιο \"%1\" ήδη υπάρχει - νέα έκδοση δεν δημιουργήθηκε"
 
-#: session_state.cc:1998
+#: session_state.cc:2230
 msgid "Could not create directory for Session template\"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:2008
+#: session_state.cc:2259
 msgid "template not saved"
 msgstr ""
 
-#: session_state.cc:2018
-msgid "Could not create directory for Session template plugin state\"%1\" (%2)"
+#: session_state.cc:2501
+msgid "Unknown node \"%1\" found in Bundles list from session file"
 msgstr ""
 
-#: session_state.cc:2261
-msgid "Unknown node \"%1\" found in Bundles list from session file"
+#: session_state.cc:2969
+msgid "Cannot cleanup peak-files for read-only session."
 msgstr ""
 
-#: session_state.cc:2834
+#: session_state.cc:2973
+msgid "Cannot cleanup peak-files while recording"
+msgstr ""
+
+#: session_state.cc:2996
+msgid ""
+"Timeout waiting for peak-file creation to terminate before cleanup, please "
+"try again later."
+msgstr ""
+
+#: session_state.cc:3261
 msgid "Session: cannot create dead file folder \"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:2873
+#: session_state.cc:3296
 msgid "cannot rename unused file source from %1 to %2 (%3)"
 msgstr ""
 
-#: session_state.cc:2891
+#: session_state.cc:3312
 msgid "cannot remove peakfile %1 for %2 (%3)"
 msgstr "δεν μπορώ να απαλοίψω το peakfile %1 για %2 (%3)"
 
-#: session_state.cc:3204
+#: session_state.cc:3633
 msgid "could not backup old history file, current history not saved"
 msgstr ""
 
-#: session_state.cc:3213
+#: session_state.cc:3642
 msgid "history could not be saved to %1"
 msgstr ""
 
-#: session_state.cc:3216
+#: session_state.cc:3645
 msgid "Could not remove history file at path \"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:3220
+#: session_state.cc:3649
 msgid "could not restore history file from backup %1 (%2)"
 msgstr ""
 
-#: session_state.cc:3245
+#: session_state.cc:3674
 msgid "%1: no history file \"%2\" for this session."
 msgstr ""
 
-#: session_state.cc:3251
+#: session_state.cc:3680
 msgid "Could not understand session history file \"%1\""
 msgstr ""
 
-#: session_state.cc:3293
+#: session_state.cc:3722
 msgid "Failed to downcast MidiSource for NoteDiffCommand"
 msgstr ""
 
-#: session_state.cc:3304
+#: session_state.cc:3733
 msgid "Failed to downcast MidiSource for SysExDiffCommand"
 msgstr ""
 
-#: session_state.cc:3315
+#: session_state.cc:3744
 msgid "Failed to downcast MidiSource for PatchChangeDiffCommand"
 msgstr ""
 
-#: session_state.cc:3323
+#: session_state.cc:3752
 msgid "Couldn't figure out how to make a Command out of a %1 XMLNode."
 msgstr ""
 
-#: session_state.cc:3559
+#: session_state.cc:3990
 msgid "Session: unknown diskstream type in XML"
 msgstr ""
 
-#: session_state.cc:3564
+#: session_state.cc:3995
 msgid "Session: could not load diskstream via XML state"
 msgstr "Συνεδρία: δεν μπόρεσα να φορτώσω diskstream μέσω καταστάσεως XML"
 
-#: session_state.cc:3688 session_state.cc:3716 session_state.cc:3729
-#: session_state.cc:3744
+#: session_state.cc:4092
+msgid "Cannot rename read-only session."
+msgstr ""
+
+#: session_state.cc:4096
+msgid "Cannot rename session while recording"
+msgstr ""
+
+#: session_state.cc:4181 session_state.cc:4182 session_state.cc:4224
+#: session_state.cc:4228
 msgid "renaming %s as %2 failed (%3)"
 msgstr ""
 
+#: session_state.cc:4244 session_state.cc:4245 session_state.cc:4259
+#: session_state.cc:4260
+msgid "renaming %1 as %2 failed (%3)"
+msgstr ""
+
+#: session_state.cc:4571
+msgid "Cannot create new session folder %1"
+msgstr ""
+
+#: session_state.cc:4633 session_state.cc:4708
+msgid ""
+"\n"
+"copying \"%1\" failed !"
+msgstr ""
+
+#: session_state.cc:4906
+msgid "unknown reason"
+msgstr ""
+
 #: session_time.cc:214
 msgid "Unknown transport state %1 in sync callback"
 msgstr ""
 
-#: session_transport.cc:171
+#: session_transport.cc:177
 msgid "Cannot loop - no loop range defined"
 msgstr "Δεν γίνεται loop - κανένα διάστημα loop δεν προσδιορίστηκε"
 
-#: session_transport.cc:833
+#: session_transport.cc:968
 msgid ""
 "Seamless looping cannot be supported while %1 is using JACK transport.\n"
 "Recommend changing the configured options"
 msgstr ""
 
-#: session_transport.cc:915
+#: session_transport.cc:1050
 msgid "Locate called for negative sample position - ignored"
 msgstr ""
 
-#: session_transport.cc:1272
+#: session_transport.cc:1401
 msgid ""
 "Global varispeed cannot be supported while %1 is connected to JACK transport "
 "control"
 msgstr ""
 
-#: smf_source.cc:344
+#: slavable.cc:100
+msgid "Master #%1 not found, assignment lost"
+msgstr ""
+
+#: smf_source.cc:350
 msgid "Unable to read event prefix, corrupt MIDI ring"
 msgstr ""
 
-#: smf_source.cc:357
+#: smf_source.cc:363
 msgid "Event has time and size but no body, corrupt MIDI ring"
 msgstr ""
 
-#: smf_source.cc:363
+#: smf_source.cc:369
 msgid "Event time is before MIDI source position"
 msgstr ""
 
-#: smf_source.cc:409
+#: smf_source.cc:417
 msgid ""
 "Skipping event with unordered beat time %1 < %2 (off by %3 beats, %4 ticks)"
 msgstr ""
 
-#: smf_source.cc:453
+#: smf_source.cc:461
 msgid "Skipping event with unordered frame time %1 < %2"
 msgstr ""
 
-#: smf_source.cc:518
+#: smf_source.cc:526
 msgid "cannot open MIDI file %1 for write"
 msgstr ""
 
@@ -2303,8 +2931,8 @@ msgid "CAF"
 msgstr ""
 
 #: sndfile_helpers.cc:37
-msgid "W64 (64 bit WAV)"
-msgstr "W64 (64 bit WAV)"
+msgid "W64 (64-bit WAV)"
+msgstr ""
 
 #: sndfile_helpers.cc:38
 msgid "FLAC"
@@ -2347,23 +2975,23 @@ msgid ".raw"
 msgstr ""
 
 #: sndfile_helpers.cc:66
-msgid "Signed 16 bit PCM"
+msgid "Signed 16-bit PCM"
 msgstr ""
 
 #: sndfile_helpers.cc:67
-msgid "Signed 24 bit PCM"
+msgid "Signed 24-bit PCM"
 msgstr ""
 
 #: sndfile_helpers.cc:68
-msgid "Signed 32 bit PCM"
+msgid "Signed 32-bit PCM"
 msgstr ""
 
 #: sndfile_helpers.cc:69
-msgid "Signed 8 bit PCM"
+msgid "Signed 8-bit PCM"
 msgstr ""
 
 #: sndfile_helpers.cc:70
-msgid "32 bit float"
+msgid "32-bit float"
 msgstr ""
 
 #: sndfile_helpers.cc:83
@@ -2374,11 +3002,15 @@ msgstr "Little-endian (Intel)"
 msgid "Big-endian (PowerPC)"
 msgstr ""
 
-#: sndfilesource.cc:260
+#: sndfilesource.cc:282
+msgid "SndFileSource: cannot open file \"%1\" for %2"
+msgstr ""
+
+#: sndfilesource.cc:300
 msgid "SndFileSource: cannot open file \"%1\" for %2 (%3)"
 msgstr "SndFileSource: δεν μπορώ να ανοίξω το αρχείο \"%1\" για %2 (%3)"
 
-#: sndfilesource.cc:268
+#: sndfilesource.cc:308
 msgid ""
 "SndFileSource: file only contains %1 channels; %2 is invalid as a channel "
 "number"
@@ -2386,7 +3018,11 @@ msgstr ""
 "SndFileSource: το αρχείο περιέχει μόνο %1 κανάλια; %2 δεν έχει αξία σαν "
 "κανάλι number"
 
-#: sndfilesource.cc:322 sndfilesource.cc:655
+#: sndfilesource.cc:323
+msgid "Cannot mark RF64 audio file for automatic downgrade to WAV: %1"
+msgstr ""
+
+#: sndfilesource.cc:375 sndfilesource.cc:705
 msgid ""
 "cannot set broadcast info for audio file %1 (%2); dropping broadcast info "
 "for this file"
@@ -2394,72 +3030,84 @@ msgstr ""
 "Δεν ετέθησαν broadcast info για το audio file %1 (%2); απόρριψη broadcast "
 "info για αυτό το αρχείο"
 
-#: sndfilesource.cc:368
-msgid "could not allocate file %1 for reading."
+#: sndfilesource.cc:418
+msgid "could not open file %1 for reading."
 msgstr ""
 
-#: sndfilesource.cc:403
+#: sndfilesource.cc:453
 msgid "SndFileSource: could not seek to frame %1 within %2 (%3)"
 msgstr "SndFileSource: δεν μπορούσα να αναζητήσω στο frame %1 μέσα στο %2 (%3)"
 
-#: sndfilesource.cc:412
+#: sndfilesource.cc:462
 msgid ""
 "SndFileSource: @ %1 could not read %2 within %3 (%4) (len = %5, ret was %6)"
 msgstr ""
 
-#: sndfilesource.cc:454 sndfilesource.cc:483
+#: sndfilesource.cc:504 sndfilesource.cc:533
 msgid "attempt to write a non-writable audio file source (%1)"
 msgstr ""
 
-#: sndfilesource.cc:459 utils.cc:579 utils.cc:603 utils.cc:617 utils.cc:636
+#: sndfilesource.cc:509 utils.cc:564 utils.cc:588 utils.cc:602 utils.cc:621
 msgid "programming error: %1 %2"
 msgstr "σφάλμα προγραμματισμού: %1 %2"
 
-#: sndfilesource.cc:586 sndfilesource.cc:604
+#: sndfilesource.cc:636 sndfilesource.cc:654
 msgid "attempt to flush a non-writable audio file source (%1)"
 msgstr ""
 
-#: sndfilesource.cc:591
+#: sndfilesource.cc:641
 msgid "could not allocate file %1 to write header"
 msgstr ""
 
-#: sndfilesource.cc:609
+#: sndfilesource.cc:659
 msgid "could not allocate file %1 to flush contents"
 msgstr ""
 
-#: sndfilesource.cc:621
+#: sndfilesource.cc:671
 msgid ""
 "attempt to store broadcast info in a non-writable audio file source (%1)"
 msgstr ""
 
-#: sndfilesource.cc:626
+#: sndfilesource.cc:676
 msgid "attempt to set BWF info for an un-opened audio file source (%1)"
 msgstr ""
 
-#: sndfilesource.cc:670
+#: sndfilesource.cc:720
 msgid "%1: cannot seek to %2 (libsndfile error: %3)"
 msgstr ""
 
-#: sndfilesource.cc:780
+#: sndfilesource.cc:830
 msgid "SndFileSource: \"%1\" bad read retval: %2 of %5 (%3: %4)"
 msgstr ""
 
-#: sndfilesource.cc:793 sndfilesource.cc:843 sndfilesource.cc:850
+#: sndfilesource.cc:843 sndfilesource.cc:893 sndfilesource.cc:900
 msgid "SndFileSource: \"%1\" bad write (%2)"
 msgstr ""
 
-#: sndfilesource.cc:873
+#: sndfilesource.cc:923
 msgid ""
 "Filesource: start time is already set for existing file (%1): Cannot change "
 "start time."
 msgstr ""
 
+#: sndfilesource.cc:982
+msgid "SndFileSource: cannot open file \"%1\" for reading"
+msgstr ""
+
+#: solo_control.cc:199
+msgid "Cleared Explicit solo: %1\n"
+msgstr ""
+
+#: solo_control.cc:202
+msgid "Cleared Implicit solo: %1 up:%2 down:%3\n"
+msgstr ""
+
 #: soundcloud_upload.cc:129
 msgid ""
 "Upload to Soundcloud failed.  Perhaps your email or password are incorrect?\n"
 msgstr ""
 
-#: source_factory.cc:374
+#: source_factory.cc:390
 msgid "Recovery attempted on a MIDI file - not implemented"
 msgstr ""
 
@@ -2475,7 +3123,7 @@ msgstr ""
 msgid "Speaker information is missing distance - speaker ignored"
 msgstr ""
 
-#: srcfilesource.cc:134
+#: srcfilesource.cc:142
 msgid "SrcFileSource: %1"
 msgstr ""
 
@@ -2483,105 +3131,135 @@ msgstr ""
 msgid "Cannot compile tape track regexp for use (%1)"
 msgstr ""
 
-#: tempo.cc:80
-msgid "TempoSection XML node has no \"start\" property"
-msgstr "Κόμβος του TempoSection XML δεν έχει ιδιότητα \"έναρξη\""
+#: tempo.cc:98
+msgid "Legacy session detected. TempoSection XML node will be altered."
+msgstr ""
 
-#: tempo.cc:88
-msgid "TempoSection XML node has an illegal \"start\" value"
-msgstr "Κόμβος του TempoSection XML έχει αθέμιτη αξία \"έναρξη\""
+#: tempo.cc:104
+msgid "TempoSection XML node has an illegal \"pulse\" value"
+msgstr ""
+
+#: tempo.cc:112
+msgid "TempoSection XML node has an illegal \"frame\" value"
+msgstr ""
 
-#: tempo.cc:95
+#: tempo.cc:119
 msgid "TempoSection XML node has no \"beats-per-minute\" property"
 msgstr "Κόμβος του TempoSection XML δεν έχει \"κτύπων-ανά-λεπτό\" ιδιότητα"
 
-#: tempo.cc:100
+#: tempo.cc:124
 msgid "TempoSection XML node has an illegal \"beats_per_minute\" value"
 msgstr "Κόμβος του TempoSection XML έχει αθέμιτη \"κτύπων_ανά_λεπτό\" αξία"
 
-#: tempo.cc:109
+#: tempo.cc:133
 msgid "TempoSection XML node has an illegal \"note-type\" value"
 msgstr ""
 
-#: tempo.cc:115
+#: tempo.cc:139
 msgid "TempoSection XML node has no \"movable\" property"
 msgstr "Κόμβος του TempoSection XML δεν έχει \"κινητή\" ιδιότητα"
 
-#: tempo.cc:125
-msgid "TempoSection XML node has an illegal \"bar-offset\" value"
+#: tempo.cc:146
+msgid "TempoSection XML node has no \"active\" property"
 msgstr ""
 
-#: tempo.cc:202
-msgid "MeterSection XML node has no \"start\" property"
-msgstr "Κόμβος του MeterSection XML δεν έχει \"έναρξη\" ιδιότητα"
-
-#: tempo.cc:210
+#: tempo.cc:471
 msgid "MeterSection XML node has an illegal \"start\" value"
 msgstr "Κόμβος του MeterSection XML έχει αθέμιτη \"έναρξη\" αξία"
 
-#: tempo.cc:220
+#: tempo.cc:474
+msgid "Legacy session detected - MeterSection XML node will be altered."
+msgstr ""
+
+#: tempo.cc:481
+msgid "MeterSection XML node has an illegal \"pulse\" value"
+msgstr ""
+
+#: tempo.cc:488
+msgid "MeterSection XML node has an illegal \"beat\" value"
+msgstr ""
+
+#: tempo.cc:495
+msgid "MeterSection XML node has no \"bbt\" property"
+msgstr ""
+
+#: tempo.cc:500
+msgid "MeterSection XML node has an illegal \"bbt\" value"
+msgstr ""
+
+#: tempo.cc:509
+msgid "MeterSection XML node has an illegal \"frame\" value"
+msgstr ""
+
+#: tempo.cc:519
 msgid ""
 "MeterSection XML node has no \"beats-per-bar\" or \"divisions-per-bar\" "
 "property"
 msgstr ""
 
-#: tempo.cc:226
-msgid ""
-"MeterSection XML node has an illegal \"beats-per-bar\" or \"divisions-per-bar"
-"\" value"
+#: tempo.cc:524
+msgid "MeterSection XML node has an illegal \"divisions-per-bar\" value"
 msgstr ""
 
-#: tempo.cc:231
+#: tempo.cc:529
 msgid "MeterSection XML node has no \"note-type\" property"
 msgstr "Κόμβος του MeterSection XML δεν έχει \"τύπος-νότας\" ιδιότητα"
 
-#: tempo.cc:236
+#: tempo.cc:533
 msgid "MeterSection XML node has an illegal \"note-type\" value"
 msgstr "Κόμβος του MeterSection XML έχει αθέμιτη \"τύπος-νότας\" αξία"
 
-#: tempo.cc:241
+#: tempo.cc:538
 msgid "MeterSection XML node has no \"movable\" property"
 msgstr "Κόμβος του MeterSection XML δεν έχει \"κινητή\" ιδιότητα"
 
-#: tempo.cc:388
+#: tempo.cc:545
+msgid "MeterSection XML node has no \"lock-style\" property"
+msgstr ""
+
+#: tempo.cc:821
 msgid ""
 "Meter changes can only be positioned on the first beat of a bar. Moving from "
 "%1 to %2"
 msgstr ""
 
-#: tempo.cc:650
+#: tempo.cc:1156
 msgid "no tempo sections defined in tempo map - cannot change tempo @ %1"
 msgstr ""
 
-#: tempo.cc:680 tempo.cc:696 tempo.cc:712 tempo.cc:728
+#: tempo.cc:1186
+msgid "programming error: no meter section in tempo map!"
+msgstr ""
+
+#: tempo.cc:1204 tempo.cc:1227 tempo.cc:1248
 msgid "programming error: no tempo section in tempo map!"
 msgstr "σφάλμα προγραμματισμού: κανένας τομέας ρυθμού στο χάρτη ρυθμών!"
 
-#: tempo.cc:846 tempo.cc:1827
-msgid "programming error: unhandled MetricSection type"
-msgstr "σφάλμα προγραμματισμού: αχείριστος τύπος MetricSection"
-
-#: tempo.cc:1142
+#: tempo.cc:1959 tempo.cc:1987
 msgid "tempo map asked for BBT time at frame %1\n"
 msgstr ""
 
-#: tempo.cc:1185
+#: tempo.cc:2054
 msgid "tempo map asked for frame time at bar < 1  (%1)\n"
 msgstr ""
 
-#: tempo.cc:1642 tempo.cc:1656
+#: tempo.cc:3472 tempo.cc:3485
 msgid "Tempo map: could not set new state, restoring old one."
 msgstr ""
 "Χάρτης ρυθμών: δεν μπόρεσα να θέσω νέα κατάσταση, επιστροφή προηγούμενης."
 
-#: tempo.cc:1677
+#: tempo.cc:3522 tempo.cc:3523
 msgid "Multiple meter definitions found at %1"
 msgstr ""
 
-#: tempo.cc:1682
+#: tempo.cc:3528 tempo.cc:3529
 msgid "Multiple tempo definitions found at %1"
 msgstr ""
 
+#: tempo.cc:3715
+msgid "programming error: unhandled MetricSection type"
+msgstr "σφάλμα προγραμματισμού: αχείριστος τύπος MetricSection"
+
 #: tempo_map_importer.cc:52
 msgid "Tempo map"
 msgstr ""
@@ -2606,6 +3284,14 @@ msgid ""
 "Are you sure you want to do this?"
 msgstr ""
 
+#: unknown_processor.cc:86
+msgid "Using plugin-stub with unknown i/o configuration for: "
+msgstr ""
+
+#: unknown_processor.cc:107
+msgid "Using plugin-stub with mismatching i/o configuration for: "
+msgstr ""
+
 #: user_bundle.cc:47
 msgid "Node for Bundle has no \"name\" property"
 msgstr ""
@@ -2627,62 +3313,88 @@ msgstr ""
 msgid "Node for Port has no \"name\" property"
 msgstr ""
 
-#: utils.cc:422 utils.cc:451
+#: utils.cc:412 utils.cc:441
 msgid "Splice"
 msgstr ""
 
-#: utils.cc:424 utils.cc:441
+#: utils.cc:414 utils.cc:431
 msgid "Slide"
 msgstr ""
 
-#: utils.cc:426 utils.cc:447
+#: utils.cc:416 utils.cc:437
 msgid "Ripple"
 msgstr ""
 
-#: utils.cc:428 utils.cc:444
+#: utils.cc:418 utils.cc:434
 msgid "Lock"
 msgstr ""
 
-#: utils.cc:431
+#: utils.cc:421
 msgid "programming error: unknown edit mode string \"%1\""
 msgstr ""
 
-#: utils.cc:458 utils.cc:490
+#: utils.cc:448 utils.cc:484
 msgid "MIDI Timecode"
 msgstr ""
 
-#: utils.cc:458 utils.cc:488
+#: utils.cc:448 utils.cc:482
 msgid "MTC"
 msgstr ""
 
-#: utils.cc:462 utils.cc:497
+#: utils.cc:452 utils.cc:491
 msgid "MIDI Clock"
 msgstr ""
 
-#: utils.cc:466 utils.cc:484 utils.cc:504
+#: utils.cc:456 utils.cc:478 utils.cc:498
 msgid "JACK"
 msgstr ""
 
-#: utils.cc:470
-msgid "programming error: unknown sync source string \"%1\""
+#: utils.cc:460 utils.cc:495
+msgid "LTC"
 msgstr ""
 
-#: utils.cc:495
-msgid "M-Clock"
+#: utils.cc:464
+msgid "programming error: unknown sync source string \"%1\""
 msgstr ""
 
-#: utils.cc:501
-msgid "LTC"
+#: utils.cc:489
+msgid "M-Clock"
 msgstr ""
 
-#: utils.cc:671
+#: utils.cc:658
 msgid "programming error: unknown native header format: %1"
 msgstr ""
 
-#: utils.cc:686
+#: utils.cc:673
 msgid "cannot open directory %1 (%2)"
 msgstr ""
 
+#: vca.cc:43
+#, c-format
+msgid "VCA %n"
+msgstr ""
+
+#: vca_manager.cc:166
+msgid "Cannot set state of a VCA"
+msgstr ""
+
+#~ msgid "badly formed order key string in state file! [%1] ... ignored."
+#~ msgstr ""
+#~ "δύσμορφη γραμμή κλειδιού ταξινομήσεως στο αρχείο καταστάσεως ! [%1] ... "
+#~ "αγνοήθηκε."
+
+#~ msgid "W64 (64 bit WAV)"
+#~ msgstr "W64 (64 bit WAV)"
+
+#~ msgid "TempoSection XML node has no \"start\" property"
+#~ msgstr "Κόμβος του TempoSection XML δεν έχει ιδιότητα \"έναρξη\""
+
+#~ msgid "TempoSection XML node has an illegal \"start\" value"
+#~ msgstr "Κόμβος του TempoSection XML έχει αθέμιτη αξία \"έναρξη\""
+
+#~ msgid "MeterSection XML node has no \"start\" property"
+#~ msgstr "Κόμβος του MeterSection XML δεν έχει \"έναρξη\" ιδιότητα"
+
 #~ msgid "Cannot create transport request signal pipe (%1)"
 #~ msgstr "Δεν μπορώ να δημιουργήσω transport request signal pipe (%1)"
 
diff --git a/libs/ardour/po/en_GB.mo b/libs/ardour/po/en_GB.mo
new file mode 100644
index 0000000..d33e563
Binary files /dev/null and b/libs/ardour/po/en_GB.mo differ
diff --git a/libs/ardour/po/en_GB.po b/libs/ardour/po/en_GB.po
index 7d46f4e..dd5b2d7 100644
--- a/libs/ardour/po/en_GB.po
+++ b/libs/ardour/po/en_GB.po
@@ -5,100 +5,253 @@
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: Ardour 3\n"
+"Project-Id-Version: Ardour 5\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-04-02 18:25+0100\n"
-"PO-Revision-Date: 2015-03-21 14:12+0100\n"
+"POT-Creation-Date: 2016-07-21 12:29+0100\n"
+"PO-Revision-Date: 2016-07-24 16:09+0100\n"
 "Last-Translator: Colin Fletcher <colin.m.fletcher at googlemail.com>\n"
-"Language-Team:  <colin.m.fletcher at googlemail.com>\n"
-"Language: English (UK)\n"
+"Language-Team: colin.m.fletcher at googlemail.com\n"
+"Language: en_GB\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Poedit-Language: English\n"
-"X-Poedit-Country: UNITED KINGDOM\n"
-"X-Poedit-SourceCharset: utf-8\n"
+"X-Poedit-SourceCharset: UTF-8\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 1.8.8\n"
 
-#: amp.cc:57 automatable.cc:165
-msgid "Fader"
+#: amp.cc:412
+#, c-format
+msgid "%.2fdB"
 msgstr ""
 
-#: analyser.cc:117 audioregion.cc:1729
+#: analyser.cc:121 audioregion.cc:1789
 msgid "Transient Analysis failed for %1."
 msgstr ""
 
-#: analyser.cc:117
+#: analyser.cc:121
 msgid "Audio File Source"
 msgstr ""
 
-#: audio_diskstream.cc:249
+#: analysis_graph.cc:136
+msgid "%1 (%2..%3)"
+msgstr ""
+
+#: audio_backend.cc:31
+msgid "No Error occurred"
+msgstr ""
+
+#: audio_backend.cc:33
+msgid "Failed to initialize audio backend"
+msgstr "Failed to initialise audio backend"
+
+#: audio_backend.cc:35
+msgid "Failed to deinitialize audio backend"
+msgstr "Failed to deinitialise audio backend"
+
+#: audio_backend.cc:37
+msgid "Failed to reinitialize audio backend"
+msgstr "Failed to reinitialise audio backend"
+
+#: audio_backend.cc:39
+msgid "Failed to open audio device"
+msgstr ""
+
+#: audio_backend.cc:41
+msgid "Failed to close audio device"
+msgstr ""
+
+#: audio_backend.cc:43
+msgid "Audio device not valid"
+msgstr ""
+
+#: audio_backend.cc:45
+msgid "Audio device unavailable"
+msgstr ""
+
+#: audio_backend.cc:47
+msgid "Audio device not connected"
+msgstr ""
+
+#: audio_backend.cc:49
+msgid "Failed to request and reserve audio device"
+msgstr ""
+
+#: audio_backend.cc:51
+msgid "Audio device Input/Output error"
+msgstr ""
+
+#: audio_backend.cc:53
+msgid "Failed to open MIDI device"
+msgstr ""
+
+#: audio_backend.cc:55
+msgid "Failed to close MIDI device"
+msgstr ""
+
+#: audio_backend.cc:57
+msgid "MIDI device unavailable"
+msgstr ""
+
+#: audio_backend.cc:59
+msgid "MIDI device not connected"
+msgstr ""
+
+#: audio_backend.cc:61
+msgid "MIDI device Input/Output error"
+msgstr ""
+
+#: audio_backend.cc:63
+msgid "Sample format is not supported"
+msgstr ""
+
+#: audio_backend.cc:65
+msgid "Sample rate is not supported"
+msgstr ""
+
+#: audio_backend.cc:67
+msgid "Requested input latency is not supported"
+msgstr ""
+
+#: audio_backend.cc:69
+msgid "Requested output latency is not supported"
+msgstr ""
+
+#: audio_backend.cc:71
+msgid "Period size is not supported"
+msgstr ""
+
+#: audio_backend.cc:73
+msgid "Period count is not supported"
+msgstr ""
+
+#: audio_backend.cc:75
+msgid "Device configuration not supported"
+msgstr ""
+
+#: audio_backend.cc:77
+msgid "Channel count configuration not supported"
+msgstr ""
+
+#: audio_backend.cc:79
+msgid "Input channel count configuration not supported"
+msgstr ""
+
+#: audio_backend.cc:81
+msgid "Output channel count configuration not supported"
+msgstr ""
+
+#: audio_backend.cc:83
+msgid "Unable to aquire realtime permissions"
+msgstr ""
+
+#: audio_backend.cc:85
+msgid "Setting audio device thread priorities failed"
+msgstr ""
+
+#: audio_backend.cc:87
+msgid "Setting MIDI device thread priorities failed"
+msgstr ""
+
+#: audio_backend.cc:89
+msgid "Failed to start process thread"
+msgstr ""
+
+#: audio_backend.cc:91
+msgid "Failed to start freewheel thread"
+msgstr ""
+
+#: audio_backend.cc:93
+msgid "Failed to register audio/midi ports"
+msgstr ""
+
+#: audio_backend.cc:95
+msgid "Failed to re-connect audio/midi ports"
+msgstr ""
+
+#: audio_backend.cc:97
+msgid "Out Of Memory Error"
+msgstr ""
+
+#: audio_backend.cc:99
+msgid "Could not reconnect to Audio/MIDI engine"
+msgstr ""
+
+#: audio_backend.cc:107 export_formats.cc:52 session.cc:6774 session.cc:6794
+msgid "None"
+msgstr ""
+
+#: audio_backend.cc:109
+msgid "Default"
+msgstr ""
+
+#: audio_diskstream.cc:257
 msgid "AudioDiskstream: Playlist \"%1\" isn't an audio playlist"
 msgstr ""
 
-#: audio_diskstream.cc:301
+#: audio_diskstream.cc:309
 msgid "AudioDiskstream %1: there is no existing playlist to make a copy of!"
 msgstr ""
 
-#: audio_diskstream.cc:861 audio_diskstream.cc:871
+#: audio_diskstream.cc:880 audio_diskstream.cc:890
 msgid ""
 "AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3"
 msgstr ""
 
-#: audio_diskstream.cc:1028
+#: audio_diskstream.cc:1053
 msgid "AudioDiskstream %1: cannot read %2 from playlist at frame %3"
 msgstr ""
 
-#: audio_diskstream.cc:1397 audio_diskstream.cc:1416
+#: audio_diskstream.cc:1469 audio_diskstream.cc:1488
 msgid "AudioDiskstream %1: cannot write to disk"
 msgstr ""
 
-#: audio_diskstream.cc:1459
+#: audio_diskstream.cc:1531
 msgid "AudioDiskstream \"%1\": cannot flush captured data to disk!"
 msgstr ""
 
-#: audio_diskstream.cc:1553
+#: audio_diskstream.cc:1627
 msgid "%1: could not create region for complete audio file"
 msgstr ""
 
-#: audio_diskstream.cc:1585
+#: audio_diskstream.cc:1659
 msgid "AudioDiskstream: could not create region for captured audio!"
 msgstr ""
 
-#: audio_diskstream.cc:1693
+#: audio_diskstream.cc:1755
 msgid "programmer error: %1"
 msgstr ""
 
-#: audio_diskstream.cc:1921
+#: audio_diskstream.cc:2012
 msgid "AudioDiskstream: channel %1 out of range"
 msgstr ""
 
-#: audio_diskstream.cc:1935 midi_diskstream.cc:1274
+#: audio_diskstream.cc:2026 midi_diskstream.cc:1295
 msgid "%1:%2 new capture file not initialized correctly"
 msgstr "%1:%2 new capture file not initialised correctly"
 
-#: audio_diskstream.cc:2214
+#: audio_diskstream.cc:2305
 msgid "%1: cannot restore pending capture source file %2"
 msgstr ""
 
-#: audio_diskstream.cc:2236
+#: audio_diskstream.cc:2327
 msgid "%1: incorrect number of pending sources listed - ignoring them all"
 msgstr ""
 
-#: audio_diskstream.cc:2270
+#: audio_diskstream.cc:2361
 msgid "%1: cannot create whole-file region from pending capture sources"
 msgstr ""
 
-#: audio_library.cc:81
+#: audio_library.cc:82
 msgid "Could not open %1.  Audio Library not saved"
 msgstr ""
 
-#: audio_playlist.cc:504
+#: audio_playlist.cc:509
 msgid ""
 "Legacy crossfade involved an incoming region not present in playlist \"%1\" "
 "- crossfade discarded"
 msgstr ""
 
-#: audio_playlist.cc:520
+#: audio_playlist.cc:525
 msgid ""
 "Legacy crossfade involved an outgoing region not present in playlist \"%1\" "
 "- crossfade discarded"
@@ -128,10 +281,10 @@ msgstr ""
 msgid "Audio Playlists (unused)"
 msgstr ""
 
-#: audio_playlist_source.cc:171 audiosource.cc:963 midi_playlist_source.cc:147
-#: midi_playlist_source.cc:155 midi_playlist_source.cc:162 midi_source.cc:356
-#: plugin_insert.cc:641 rb_effect.cc:327 session.cc:2848 session.cc:2881
-#: session.cc:4127 session_handle.cc:87 sndfilesource.cc:154
+#: audio_playlist_source.cc:171 audiosource.cc:1046 midi_playlist_source.cc:147
+#: midi_playlist_source.cc:155 midi_playlist_source.cc:162 midi_source.cc:393
+#: midi_source.cc:420 plugin_insert.cc:1259 rb_effect.cc:327 session.cc:5316
+#: session.cc:5343 session.cc:5463 session_handle.cc:88 sndfilesource.cc:173
 msgid "programming error: %1"
 msgstr ""
 
@@ -155,26 +308,30 @@ msgid ""
 "Channels: "
 msgstr ""
 
-#: audio_track.cc:161
+#: audio_track.cc:177
 msgid "Unknown bundle \"%1\" listed for input of %2"
 msgstr ""
 
-#: audio_track.cc:163
+#: audio_track.cc:179
 msgid "in 1"
 msgstr ""
 
-#: audio_track.cc:164
+#: audio_track.cc:180
 msgid "No input bundles available as a replacement"
 msgstr ""
 
-#: audio_track.cc:168
+#: audio_track.cc:184
 msgid "Bundle %1 was not available - \"in 1\" used instead"
 msgstr ""
 
-#: audio_track.cc:177
+#: audio_track.cc:193
 msgid "improper input channel list in XML node (%1)"
 msgstr ""
 
+#: audio_track.cc:216 diskstream.cc:503 source.cc:149
+msgid "%1: this session uses destructive tracks, which are not supported"
+msgstr ""
+
 #: audio_track_importer.cc:68
 msgid "Audio Tracks"
 msgstr ""
@@ -195,19 +352,19 @@ msgstr ""
 msgid "VAMP Plugin \"%1\" could not be loaded"
 msgstr ""
 
-#: audioengine.cc:709
+#: audioengine.cc:756
 msgid "AudioEngine: cannot load module \"%1\" (%2)"
 msgstr ""
 
-#: audioengine.cc:715
+#: audioengine.cc:762
 msgid "AudioEngine: backend at \"%1\" has no descriptor function."
 msgstr ""
 
-#: audioengine.cc:792
+#: audioengine.cc:841
 msgid "Could not create backend for %1: %2"
 msgstr ""
 
-#: audioregion.cc:1685
+#: audioregion.cc:1757
 msgid ""
 "You have requested an operation that requires audio analysis.\n"
 "\n"
@@ -215,7 +372,8 @@ msgid ""
 "transient data must be generated every time it is required.\n"
 "\n"
 "If you are doing work that will require transient data on a regular basis, "
-"you should probably enable \"auto-analyse-audio\" then quit %1 and restart.\n"
+"you should probably enable \"auto-analyse-audio\" in Preferences > Audio > "
+"Regions, then quit %1 and restart.\n"
 "\n"
 "This dialog will not display again.  But you may notice a slight delay in "
 "this and future transient-detection operations.\n"
@@ -226,12 +384,13 @@ msgstr ""
 "transient data must be generated every time it is required.\n"
 "\n"
 "If you are doing work that will require transient data on a regular basis, "
-"you should probably enable \"auto-analyse-audio\" then quit %1 and restart.\n"
+"you should probably enable \"auto-analyse-audio\" in Preferences > Audio > "
+"Regions, then quit %1 and restart.\n"
 "\n"
 "This dialogue will not display again.  But you may notice a slight delay in "
 "this and future transient-detection operations.\n"
 
-#: audioregion.cc:1729
+#: audioregion.cc:1789
 msgid "Audio Region"
 msgstr ""
 
@@ -239,162 +398,190 @@ msgstr ""
 msgid "cannot rename peakfile for %1 from %2 to %3 (%4)"
 msgstr ""
 
-#: audiosource.cc:257
+#: audiosource.cc:262
 msgid "AudioSource: cannot stat peakfile \"%1\""
 msgstr ""
 
-#: audiosource.cc:361
+#: audiosource.cc:368
+msgid "Cannot open peakfile @ %1 for size check (%2)"
+msgstr ""
+
+#: audiosource.cc:389
+msgid "peak file %1 is truncated from %2 to %3"
+msgstr ""
+
+#: audiosource.cc:392
+msgid "Cannot open peakfile @ %1 for size check (%2) after rebuild"
+msgstr ""
+
+#: audiosource.cc:404
 msgid "Cannot open peakfile @ %1 for reading (%2)"
 msgstr ""
 
-#: audiosource.cc:394
+#: audiosource.cc:438
 msgid "cannot read sample data for unscaled peak computation"
 msgstr ""
 
-#: audiosource.cc:430 audiosource.cc:525
+#: audiosource.cc:473 audiosource.cc:568
 msgid "map failed - could not create file mapping for peakfile %1."
 msgstr ""
 
-#: audiosource.cc:436 audiosource.cc:531
+#: audiosource.cc:479 audiosource.cc:574
 msgid "map failed - could not map peakfile %1."
 msgstr ""
 
-#: audiosource.cc:447 audiosource.cc:542
+#: audiosource.cc:490 audiosource.cc:585
 msgid "unmap failed - could not unmap peakfile %1."
 msgstr ""
 
-#: audiosource.cc:453 audiosource.cc:548
+#: audiosource.cc:496 audiosource.cc:591
 msgid "map failed - could not mmap peakfile %1."
 msgstr ""
 
-#: audiosource.cc:638
+#: audiosource.cc:681
 msgid ""
 "AudioSource[%1]: peak read - cannot read %2 samples at offset %3 of %4 (%5)"
 msgstr ""
 
-#: audiosource.cc:705
+#: audiosource.cc:748
 msgid "%1: could not write read raw data for peak computation (%2)"
 msgstr ""
 
-#: audiosource.cc:742
-msgid "AudioSource: cannot open peakpath (c) \"%1\" (%2)"
+#: audiosource.cc:815
+msgid "AudioSource: cannot open _peakpath (c) \"%1\" (%2)"
 msgstr ""
 
-#: audiosource.cc:811 audiosource.cc:933
+#: audiosource.cc:894 audiosource.cc:1016
 msgid "%1: could not seek in peak file data (%2)"
 msgstr ""
 
-#: audiosource.cc:816 audiosource.cc:942
+#: audiosource.cc:899 audiosource.cc:1025
 msgid "%1: could not write peak file data (%2)"
 msgstr ""
 
-#: audiosource.cc:975
+#: audiosource.cc:1058
 msgid "could not truncate peakfile %1 to %2 (error: %3)"
 msgstr ""
 
-#: auditioner.cc:100
+#: auditioner.cc:105
 msgid "Falling back to Reasonable Synth for Midi Audition"
 msgstr ""
 
-#: auditioner.cc:102
+#: auditioner.cc:107
 msgid "No synth for midi-audition found."
 msgstr ""
 
-#: auditioner.cc:158
+#: auditioner.cc:163
 msgid "no outputs available for auditioner - manual connection required"
 msgstr ""
 
-#: auditioner.cc:399 auditioner.cc:446
+#: auditioner.cc:408 auditioner.cc:455
 msgid "Cannot setup auditioner processing flow for %1 channels"
 msgstr ""
 
-#: auditioner.cc:434
+#: auditioner.cc:443
 msgid "Failed to load synth for MIDI-Audition."
 msgstr ""
 
-#: auditioner.cc:453
+#: auditioner.cc:462
 msgid "Auditioning of regions other than Audio or Midi is not supported."
 msgstr ""
 
-#: automatable.cc:84
+#: automatable.cc:87
 msgid "Automation node has no path property"
 msgstr ""
 
-#: automatable.cc:104
+#: automatable.cc:108
 msgid "cannot open %2 to load automation data (%3)"
 msgstr ""
 
-#: automatable.cc:132
+#: automatable.cc:140
 msgid "cannot load automation data from %2"
 msgstr ""
 
-#: automatable.cc:167
+#: automatable.cc:176 send.cc:95 session.cc:851
+msgid "Fader"
+msgstr ""
+
+#: automatable.cc:178
+msgid "Trim"
+msgstr ""
+
+#: automatable.cc:180
 msgid "Mute"
 msgstr ""
 
-#: automation_list.cc:356
+#: automation_control.cc:228
+msgid "record %1 automation"
+msgstr ""
+
+#: automation_list.cc:410
 msgid "automation list: cannot load coordinates from XML, all points ignored"
 msgstr ""
 
-#: automation_list.cc:402
+#: automation_list.cc:456
 msgid ""
 "automation list: no x-coordinate stored for control point (point ignored)"
 msgstr ""
 
-#: automation_list.cc:408
+#: automation_list.cc:462
 msgid ""
 "automation list: no y-coordinate stored for control point (point ignored)"
 msgstr ""
 
-#: automation_list.cc:422
+#: automation_list.cc:476
 msgid ""
 "AutomationList: passed XML node called %1, not \"AutomationList\" - ignored"
 msgstr ""
 
-#: butler.cc:100
+#: butler.cc:126
 msgid "Session: could not create butler thread"
 msgstr ""
 
-#: butler.cc:222 butler.cc:223
+#: butler.cc:254 butler.cc:255
 msgid "Butler read ahead failure on dstream %1"
 msgstr ""
 
-#: butler.cc:270 butler.cc:271
+#: butler.cc:344 butler.cc:345 butler.cc:393 butler.cc:394
 msgid "Butler write-behind failure on dstream %1"
 msgstr ""
 
-#: control_protocol_manager.cc:164
+#: control_protocol_manager.cc:174
 msgid "control protocol name \"%1\" has no descriptor"
 msgstr ""
 
-#: control_protocol_manager.cc:171
+#: control_protocol_manager.cc:181
 msgid "control protocol name \"%1\" could not be initialized"
 msgstr "control protocol name \"%1\" could not be initialised"
 
-#: control_protocol_manager.cc:237
+#: control_protocol_manager.cc:265
 msgid "Instantiating mandatory control protocol %1"
 msgstr ""
 
-#: control_protocol_manager.cc:281
+#: control_protocol_manager.cc:309
 msgid "looking for control protocols in %1\n"
 msgstr ""
 
-#: control_protocol_manager.cc:306
+#: control_protocol_manager.cc:334
 msgid "Control protocol %1 not usable"
 msgstr ""
 
-#: control_protocol_manager.cc:323
+#: control_protocol_manager.cc:351
 msgid "Control surface protocol discovered: \"%1\"\n"
 msgstr ""
 
-#: control_protocol_manager.cc:341
+#: control_protocol_manager.cc:367
 msgid "ControlProtocolManager: cannot load module \"%1\" (%2)"
 msgstr ""
 
-#: control_protocol_manager.cc:347
+#: control_protocol_manager.cc:373
 msgid "ControlProtocolManager: module \"%1\" has no descriptor function."
 msgstr ""
 
+#: control_protocol_manager.cc:516
+msgid "Control protocol \"%1\" has no descriptor"
+msgstr ""
+
 #: cycle_timer.cc:40
 msgid "CycleTimer::get_mhz(): can't open /proc/cpuinfo"
 msgstr ""
@@ -411,7 +598,7 @@ msgstr ""
 msgid "audio"
 msgstr ""
 
-#: data_type.cc:28 session.cc:1998 session.cc:2001
+#: data_type.cc:28 session.cc:2452
 msgid "MIDI"
 msgstr ""
 
@@ -423,11 +610,11 @@ msgstr ""
 msgid "main outs"
 msgstr ""
 
-#: delivery.cc:121 send.cc:63
+#: delivery.cc:121 send.cc:64
 msgid "listen"
 msgstr ""
 
-#: diskstream.cc:309
+#: diskstream.cc:311
 msgid "Location \"%1\" not valid for track loop (start >= end)"
 msgstr ""
 
@@ -439,23 +626,23 @@ msgstr ""
 msgid "Export failed: %1"
 msgstr ""
 
-#: export_filename.cc:126
+#: export_filename.cc:128
 msgid "Existing export folder for this session (%1) does not exist - ignored"
 msgstr ""
 
-#: export_filename.cc:242
+#: export_filename.cc:263
 msgid "No Time"
 msgstr ""
 
-#: export_filename.cc:251
+#: export_filename.cc:272
 msgid "Invalid time format"
 msgstr ""
 
-#: export_filename.cc:260
+#: export_filename.cc:281
 msgid "No Date"
 msgstr ""
 
-#: export_filename.cc:275
+#: export_filename.cc:296
 msgid "Invalid date format"
 msgstr ""
 
@@ -491,23 +678,27 @@ msgstr ""
 msgid "Lossless compression"
 msgstr ""
 
-#: export_format_manager.cc:218 export_format_specification.cc:591
+#: export_format_manager.cc:218 export_format_specification.cc:657
 msgid "Session rate"
 msgstr ""
 
-#: export_format_specification.cc:549
-msgid "normalize"
-msgstr "normalise"
+#: export_format_specification.cc:609
+msgid "normalize loudness"
+msgstr "normalise loudness"
+
+#: export_format_specification.cc:611
+msgid "normalize peak"
+msgstr "normalise peak"
 
-#: export_format_specification.cc:553
+#: export_format_specification.cc:616
 msgid "trim"
 msgstr ""
 
-#: export_format_specification.cc:555
+#: export_format_specification.cc:618
 msgid "trim start"
 msgstr ""
 
-#: export_format_specification.cc:557
+#: export_format_specification.cc:620
 msgid "trim end"
 msgstr ""
 
@@ -523,24 +714,20 @@ msgstr ""
 msgid "Rectangular"
 msgstr ""
 
-#: export_formats.cc:52 session.cc:5424 session.cc:5440
-msgid "None"
-msgstr ""
-
 #: export_formats.cc:159
-msgid "8bit"
+msgid "8-bit"
 msgstr ""
 
 #: export_formats.cc:161
-msgid "16bit"
+msgid "16-bit"
 msgstr ""
 
 #: export_formats.cc:163
-msgid "24bit"
+msgid "24-bit"
 msgstr ""
 
 #: export_formats.cc:165
-msgid "32bit"
+msgid "32-bit"
 msgstr ""
 
 #: export_formats.cc:167
@@ -552,7 +739,7 @@ msgid "double"
 msgstr ""
 
 #: export_formats.cc:171
-msgid "8bit unsigned"
+msgid "8-bit unsigned"
 msgstr ""
 
 #: export_formats.cc:173
@@ -563,94 +750,90 @@ msgstr ""
 msgid "No sample format"
 msgstr ""
 
-#: export_handler.cc:360
+#: export_handler.cc:430
 msgid "File %1 uploaded to %2"
 msgstr ""
 
-#: export_handler.cc:366
+#: export_handler.cc:436
 msgid ""
 "upload to Soundcloud failed. Perhaps your email or password are incorrect?\n"
 msgstr ""
 
-#: export_handler.cc:413
-msgid "Editor: cannot open \"%1\" as export file for CD marker file"
-msgstr ""
-
-#: export_handler.cc:492 export_handler.cc:495
-msgid "an error occured while writing a TOC/CUE file: %1"
+#: export_handler.cc:562 export_handler.cc:565
+msgid "an error occurred while writing a TOC/CUE file: %1"
 msgstr ""
 
-#: export_handler.cc:744 export_handler.cc:802
+#: export_handler.cc:855 export_handler.cc:913
 msgid "Cannot convert %1 to Latin-1 text"
 msgstr ""
 
-#: export_profile_manager.cc:93
+#: export_profile_manager.cc:94
 msgid "Searching for export formats in %1"
 msgstr ""
 
-#: export_profile_manager.cc:99
+#: export_profile_manager.cc:100
 msgid "Unable to create export format directory %1: %2"
 msgstr ""
 
-#: export_profile_manager.cc:262
+#: export_profile_manager.cc:268
 msgid "Unable to remove export preset %1: %2"
 msgstr ""
 
-#: export_profile_manager.cc:351
+#: export_profile_manager.cc:357
 msgid "Selection"
 msgstr ""
 
-#: export_profile_manager.cc:604
+#: export_profile_manager.cc:621
 msgid "Unable to rename export format %1 to %2: %3"
 msgstr ""
 
-#: export_profile_manager.cc:636
+#: export_profile_manager.cc:653
 msgid "Unable to remove export profile %1: %2"
 msgstr ""
 
-#: export_profile_manager.cc:654
+#: export_profile_manager.cc:671
 msgid "empty format"
 msgstr ""
 
-#: export_profile_manager.cc:735
+#: export_profile_manager.cc:752
 msgid "Cannot load export format from %1"
 msgstr ""
 
-#: export_profile_manager.cc:741
+#: export_profile_manager.cc:758
 msgid "Cannot export format read from %1"
 msgstr ""
 
-#: export_profile_manager.cc:835
+#: export_profile_manager.cc:852
 msgid "No timespan has been selected!"
 msgstr ""
 
-#: export_profile_manager.cc:839
+#: export_profile_manager.cc:856
 msgid "No channels have been selected!"
 msgstr ""
 
-#: export_profile_manager.cc:843
+#: export_profile_manager.cc:860
 msgid "Some channels are empty"
 msgstr ""
 
-#: export_profile_manager.cc:876
+#: export_profile_manager.cc:893
 msgid "No format selected!"
 msgstr ""
 
-#: export_profile_manager.cc:878
+#: export_profile_manager.cc:895
 msgid "All channels are empty!"
 msgstr ""
 
-#: export_profile_manager.cc:880
+#: export_profile_manager.cc:897
 msgid "One or more of the selected formats is not compatible with this system!"
 msgstr ""
 
-#: export_profile_manager.cc:883
+#: export_profile_manager.cc:900
 msgid ""
 "%1 supports only %2 channels, but you have %3 channels in your channel "
 "configuration"
 msgstr ""
 
-#: file_source.cc:201 session_state.cc:2858
+#: file_source.cc:201 session_state.cc:3284
 msgid ""
 "there are already 1000 files with names like %1; versioning discontinued"
 msgstr ""
@@ -659,25 +842,25 @@ msgstr ""
 msgid "cannot rename file source from %1 to %2 (%3)"
 msgstr ""
 
-#: file_source.cc:251 file_source.cc:375
+#: file_source.cc:251 file_source.cc:374
 msgid "FileSource: search path not set"
 msgstr ""
 
-#: file_source.cc:435
+#: file_source.cc:434
 msgid ""
 "FileSource: \"%1\" is ambigous when searching\n"
 "\t"
 msgstr ""
 
-#: file_source.cc:442
+#: file_source.cc:441
 msgid "Filesource: cannot find required file (%1)"
 msgstr ""
 
-#: file_source.cc:487
+#: file_source.cc:486
 msgid "Filesource: cannot find required file (%1): %2"
 msgstr ""
 
-#: file_source.cc:495
+#: file_source.cc:494
 msgid "Filesource: cannot check for existing file (%1): %2"
 msgstr ""
 
@@ -691,34 +874,38 @@ msgstr ""
 msgid "cannot rename file %1 to %2 (%3)"
 msgstr ""
 
-#: filesystem_paths.cc:105
+#: filesystem_paths.cc:120
 msgid "Cannot create Configuration directory %1 - cannot run"
 msgstr ""
 
-#: filesystem_paths.cc:110
+#: filesystem_paths.cc:125
 msgid ""
 "Configuration directory %1 already exists and is not a directory/folder - "
 "cannot run"
 msgstr ""
 
-#: filesystem_paths.cc:171
+#: filesystem_paths.cc:186
 msgid "Cannot create cache directory %1 - cannot run"
 msgstr ""
 
-#: filesystem_paths.cc:176
+#: filesystem_paths.cc:191
 msgid ""
 "Cache directory %1 already exists and is not a directory/folder - cannot run"
 msgstr ""
 
-#: filesystem_paths.cc:194
+#: filesystem_paths.cc:209
 msgid "ARDOUR_DLL_PATH not set in environment - exiting\n"
 msgstr ""
 
-#: filesystem_paths.cc:245
+#: filesystem_paths.cc:232
+msgid "Cannot determine %1 package directory"
+msgstr ""
+
+#: filesystem_paths.cc:277
 msgid "ARDOUR_CONFIG_PATH not set in environment\n"
 msgstr ""
 
-#: filesystem_paths.cc:266
+#: filesystem_paths.cc:298
 msgid "ARDOUR_DATA_PATH not set in environment\n"
 msgstr ""
 
@@ -726,50 +913,79 @@ msgstr ""
 msgid "filter: error creating name for new file based on %1"
 msgstr ""
 
-#: filter.cc:79
+#: filter.cc:92
 msgid "filter: error creating new file %1 (%2)"
 msgstr ""
 
-#: find_session.cc:59
+#: find_session.cc:60
 msgid "cannot check session path %1 (%2)"
 msgstr ""
 
-#: find_session.cc:85
+#: find_session.cc:86
 msgid "cannot check statefile %1 (%2)"
 msgstr ""
 
-#: find_session.cc:121
+#: find_session.cc:125
 msgid "%1 is not a snapshot file"
 msgstr ""
 
-#: find_session.cc:138
+#: find_session.cc:142
 msgid "cannot determine current working directory (%1)"
 msgstr ""
 
-#: find_session.cc:155
+#: find_session.cc:159
 msgid "unknown file type for session %1"
 msgstr ""
 
-#: globals.cc:234
+#: gain_control.cc:81
+#, c-format
+msgid "%3.1f dB"
+msgstr ""
+
+#: globals.cc:262
 msgid "Could not set system open files limit to \"unlimited\""
 msgstr ""
 
-#: globals.cc:236
+#: globals.cc:264
 msgid "Could not set system open files limit to %1"
 msgstr ""
 
-#: globals.cc:240
+#: globals.cc:268 globals.cc:285
 msgid "Your system is configured to limit %1 to only %2 open files"
 msgstr ""
 
-#: globals.cc:244
+#: globals.cc:272
 msgid "Could not get system open files limit (%1)"
 msgstr ""
 
-#: globals.cc:415
+#: globals.cc:287
+msgid "Could not set system open files limit. Current limit is %1 open files"
+msgstr ""
+
+#: globals.cc:470
 msgid "Loading configuration"
 msgstr ""
 
+#: globals.cc:550 route.cc:182 route.cc:4146 session.cc:1157
+msgid "Monitor"
+msgstr ""
+
+#: globals.cc:551 session_state.cc:642
+msgid "Master"
+msgstr ""
+
+#: globals.cc:552
+msgid "Control"
+msgstr ""
+
+#: globals.cc:553
+msgid "Click"
+msgstr ""
+
+#: globals.cc:554
+msgid "Mackie"
+msgstr ""
+
 #: import.cc:146
 msgid "Cannot find new filename for imported file %1"
 msgstr ""
@@ -795,7 +1011,7 @@ msgid "Track %1 of %2 contained no usable MIDI data"
 msgstr ""
 
 #: import.cc:427
-msgid "MIDI file %1 was not readable (no reason available)"
+msgid "MIDI file could not be written (best guess: %1)"
 msgstr ""
 
 #: import.cc:475
@@ -822,110 +1038,113 @@ msgstr ""
 msgid "Unknown"
 msgstr ""
 
-#: instrument_info.cc:231
+#: instrument_info.cc:243
 msgid "preset %1 (bank %2)"
 msgstr ""
 
-#: internal_send.cc:316 internal_send.cc:317
+#: internal_send.cc:338 internal_send.cc:339
 msgid "%1 - cannot find any track/bus with the ID %2 to connect to"
 msgstr ""
 
-#: io.cc:209
+#: io.cc:212
 msgid "IO: cannot disconnect port %1 from %2"
 msgstr ""
 
-#: io.cc:344 io.cc:431
+#: io.cc:347 io.cc:435
 msgid "IO: cannot register input port %1"
 msgstr ""
 
-#: io.cc:349 io.cc:436
+#: io.cc:352 io.cc:440
 msgid "IO: cannot register output port %1"
 msgstr ""
 
-#: io.cc:598 io.cc:654
+#: io.cc:607 io.cc:668
 msgid "incorrect XML node \"%1\" passed to IO object"
 msgstr ""
 
-#: io.cc:713
+#: io.cc:730
 msgid "in"
 msgstr ""
 
-#: io.cc:713
+#: io.cc:730
 msgid "out"
 msgstr ""
 
-#: io.cc:714
+#: io.cc:731
 msgid "input"
 msgstr ""
 
-#: io.cc:714
+#: io.cc:731
 msgid "output"
 msgstr ""
 
-#: io.cc:724
+#: io.cc:741
 msgid "Unknown bundle \"%1\" listed for %2 of %3"
 msgstr ""
 
-#: io.cc:790
+#: io.cc:807
 msgid "Bundle %1 was not available - \"%2\" used instead"
 msgstr ""
 
-#: io.cc:793
+#: io.cc:810
 msgid "No %1 bundles available as a replacement"
 msgstr ""
 
-#: io.cc:897
+#: io.cc:914
 msgid "%1: cannot create I/O ports"
 msgstr ""
 
-#: io.cc:1025 io.cc:1126
+#: io.cc:1042 io.cc:1143
 msgid "IO: badly formed string in XML node for inputs \"%1\""
 msgstr ""
 
-#: io.cc:1030 io.cc:1131
+#: io.cc:1047 io.cc:1148
 msgid "bad input string in XML node \"%1\""
 msgstr ""
 
-#: io.cc:1069
+#: io.cc:1086
 msgid "IO: badly formed string in XML node for outputs \"%1\""
 msgstr ""
 
-#: io.cc:1074
+#: io.cc:1091
 msgid "IO: bad output string in XML node \"%1\""
 msgstr ""
 
-#: io.cc:1413
+#: io.cc:1256 plugin.cc:275
+msgid "Out"
+msgstr ""
+
+#: io.cc:1256 plugin.cc:273
+msgid "In"
+msgstr ""
+
+#: io.cc:1454
 #, c-format
 msgid "%s %u"
 msgstr ""
 
-#: io.cc:1460
+#: io.cc:1501
 #, c-format
 msgid "%s in"
 msgstr ""
 
-#: io.cc:1462
+#: io.cc:1503
 #, c-format
 msgid "%s out"
 msgstr ""
 
-#: io.cc:1537 session.cc:736 session.cc:770
+#: io.cc:1578 session.cc:957 session.cc:991
 msgid "mono"
 msgstr ""
 
-#: io.cc:1539 session.cc:749 session.cc:784
+#: io.cc:1580 session.cc:970 session.cc:1005
 msgid "L"
 msgstr ""
 
-#: io.cc:1539 session.cc:751 session.cc:786
+#: io.cc:1580 session.cc:972 session.cc:1007
 msgid "R"
 msgstr ""
 
-#: io.cc:1541 io.cc:1547
-#, c-format
-msgid "%d"
-msgstr ""
-
 #: ladspa_plugin.cc:93
 msgid "LADSPA: Unable to open module: "
 msgstr ""
@@ -942,81 +1161,81 @@ msgstr ""
 msgid "LADSPA: \"%1\" cannot be used, since it cannot do inplace processing"
 msgstr ""
 
-#: ladspa_plugin.cc:311
+#: ladspa_plugin.cc:308
 msgid ""
 "illegal parameter number used with plugin \"%1\". This may indicate a change "
 "in the plugin design, and presets may be invalid"
 msgstr ""
 
-#: ladspa_plugin.cc:390 ladspa_plugin.cc:440
+#: ladspa_plugin.cc:387 ladspa_plugin.cc:437
 msgid "Bad node sent to LadspaPlugin::set_state"
 msgstr ""
 
-#: ladspa_plugin.cc:405 ladspa_plugin.cc:454
+#: ladspa_plugin.cc:402 ladspa_plugin.cc:451
 msgid "LADSPA: no ladspa port number"
 msgstr ""
 
-#: ladspa_plugin.cc:411 ladspa_plugin.cc:460
+#: ladspa_plugin.cc:408 ladspa_plugin.cc:457
 msgid "LADSPA: no ladspa port data"
 msgstr ""
 
-#: ladspa_plugin.cc:842
+#: ladspa_plugin.cc:863
 msgid "Could not locate HOME.  Preset not removed."
 msgstr ""
 
-#: ladspa_plugin.cc:881 ladspa_plugin.cc:887
+#: ladspa_plugin.cc:902 ladspa_plugin.cc:908
 msgid "Could not create %1.  Preset not saved. (%2)"
 msgstr ""
 
-#: ladspa_plugin.cc:894
+#: ladspa_plugin.cc:915
 msgid "Error saving presets file %1."
 msgstr ""
 
-#: ladspa_plugin.cc:936
+#: ladspa_plugin.cc:957
 msgid "Could not locate HOME.  Preset not saved."
 msgstr ""
 
-#: location.cc:456
+#: location.cc:455
 msgid "You cannot put a CD marker at this position"
 msgstr ""
 
-#: location.cc:608
+#: location.cc:607
 msgid "incorrect XML node passed to Location::set_state"
 msgstr ""
 
-#: location.cc:613
+#: location.cc:612
 msgid "XML node for Location has no ID information"
 msgstr ""
 
-#: location.cc:617
+#: location.cc:616
 msgid "XML node for Location has no name information"
 msgstr ""
 
-#: location.cc:624
+#: location.cc:623
 msgid "XML node for Location has no start information"
 msgstr ""
 
-#: location.cc:635
+#: location.cc:634
 msgid "XML node for Location has no end information"
 msgstr ""
 
-#: location.cc:642
+#: location.cc:641
 msgid "XML node for Location has no flags information"
 msgstr ""
 
-#: location.cc:856
+#: location.cc:868
 msgid "Locations: attempt to use unknown location as selected location"
 msgstr ""
 
-#: location.cc:1034
+#: location.cc:1046
 msgid "incorrect XML mode passed to Locations::set_state"
 msgstr ""
 
-#: location.cc:1047 session.cc:1296 session.cc:4922 session_state.cc:1054
+#: location.cc:1059 session.cc:1667 session.cc:6307 session_state.cc:1205
 msgid "session"
 msgstr ""
 
-#: location.cc:1112
+#: location.cc:1126
 msgid "could not load location from session file - ignored"
 msgstr ""
 
@@ -1058,48 +1277,104 @@ msgid ""
 "You may rename the imported location:"
 msgstr ""
 
-#: ltc_slave.cc:272
+#: ltc_file_reader.cc:96
+msgid "LTCFileReader: cannot open file \"%1\""
+msgstr ""
+
+#: ltc_file_reader.cc:105
+msgid "LTCFileReader: cannot open file \"%1\" (%3)"
+msgstr ""
+
+#: ltc_file_reader.cc:109
+msgid "LTCFileReader: \"%1\" is an empty audio file"
+msgstr ""
+
+#: ltc_file_reader.cc:134
+msgid "LTCFileReader:: invalid audio channel selected"
+msgstr ""
+
+#: ltc_slave.cc:275
 msgid "Session framerate adjusted from %1 to LTC's %2."
 msgstr ""
 
-#: ltc_slave.cc:286
+#: ltc_slave.cc:289
 msgid "Session and LTC framerate mismatch: LTC:%1 Session:%2."
 msgstr ""
 
-#: ltc_slave.cc:603
+#: ltc_slave.cc:609
 msgid "flywheel"
 msgstr ""
 
-#: midi_diskstream.cc:173
+#: lua_api.cc:87
+msgid "Script with given name was not found\n"
+msgstr ""
+
+#: lua_api.cc:96
+msgid "Failed to instantiate Lua Processor\n"
+msgstr ""
+
+#: luaproc.cc:888
+msgid "Failed to load Lua script from session state."
+msgstr ""
+
+#: luaproc.cc:898
+msgid "Session State for LuaProcessor did not include a Lua script."
+msgstr ""
+
+#: luaproc.cc:902
+msgid "Invalid/incompatible Lua script found for LuaProcessor."
+msgstr ""
+
+#: luaproc.cc:930
+msgid "Bad node sent to LuaProc::set_state"
+msgstr ""
+
+#: luaproc.cc:940
+msgid "LuaProc: port has no symbol, ignored"
+msgstr ""
+
+#: luaproc.cc:946
+msgid "LuaProc: port has no value, ignored"
+msgstr ""
+
+#: luaproc.cc:1176
+msgid "Unable to create LuaProc presets directory"
+msgstr ""
+
+#: luascripting.cc:132
+msgid "Script '%1' has no valid descriptor."
+msgstr ""
+
+#: midi_diskstream.cc:172
 msgid ""
 "%1: I/O configuration change %4 requested to use %2, but channel setup is %3"
 msgstr ""
 
-#: midi_diskstream.cc:225
+#: midi_diskstream.cc:224
 msgid "MidiDiskstream: Playlist \"%1\" isn't a midi playlist"
 msgstr ""
 
-#: midi_diskstream.cc:276
+#: midi_diskstream.cc:275
 msgid "MidiDiskstream %1: there is no existing playlist to make a copy of!"
 msgstr ""
 
-#: midi_diskstream.cc:754
+#: midi_diskstream.cc:753
 msgid "MidiDiskstream %1: cannot read %2 from playlist at frame %3"
 msgstr ""
 
-#: midi_diskstream.cc:891
+#: midi_diskstream.cc:890
 msgid "MidiDiskstream %1: cannot write to disk"
 msgstr ""
 
-#: midi_diskstream.cc:925
+#: midi_diskstream.cc:924
 msgid "MidiDiskstream \"%1\": cannot flush captured data to disk!"
 msgstr ""
 
-#: midi_diskstream.cc:1014
+#: midi_diskstream.cc:1013
 msgid "%1: could not create region for complete midi file"
 msgstr ""
 
-#: midi_diskstream.cc:1055
+#: midi_diskstream.cc:1054
 msgid "MidiDiskstream: could not create region for captured midi!"
 msgstr ""
 
@@ -1119,31 +1394,47 @@ msgstr ""
 msgid "No SysExID found for sys-ex property change - ignored"
 msgstr ""
 
-#: midi_model.cc:1994
-msgid "transpose"
+#: midi_patch_manager.cc:78
+msgid "Loading %1 MIDI patch from %2"
+msgid_plural "Loading %1 MIDI patches from %2"
+msgstr[0] ""
+msgstr[1] ""
+
+#: midi_patch_manager.cc:109
+msgid "Unloading %1 MIDI patch from %2"
+msgid_plural "Unloading %1 MIDI patches from %2"
+msgstr[0] ""
+msgstr[1] ""
+
+#: midi_patch_manager.cc:126
+msgid "Error parsing MIDI patch file %1"
 msgstr ""
 
-#: midi_patch_manager.cc:133
+#: midi_patch_manager.cc:135
 msgid "Duplicate MIDI device `%1' in `%2' ignored"
 msgstr ""
 
-#: midi_scene_changer.cc:295
+#: midi_patch_manager.cc:170
+msgid "Removing MIDI patch file %1"
+msgstr ""
+
+#: midi_scene_changer.cc:312
 msgid "Scene "
 msgstr ""
 
-#: midi_source.cc:125
+#: midi_source.cc:126
 msgid "Missing parameter property on InterpolationStyle"
 msgstr ""
 
-#: midi_source.cc:131
+#: midi_source.cc:132
 msgid "Missing style property on InterpolationStyle"
 msgstr ""
 
-#: midi_source.cc:140
+#: midi_source.cc:141
 msgid "Missing parameter property on AutomationState"
 msgstr ""
 
-#: midi_source.cc:146
+#: midi_source.cc:147
 msgid "Missing state property on AutomationState"
 msgstr ""
 
@@ -1151,57 +1442,57 @@ msgstr ""
 msgid "MIDI stretch created non-MIDI source"
 msgstr ""
 
-#: monitor_processor.cc:53
+#: monitor_processor.cc:54
 msgid "monitor dim"
 msgstr ""
 
-#: monitor_processor.cc:54
+#: monitor_processor.cc:55
 msgid "monitor cut"
 msgstr ""
 
-#: monitor_processor.cc:55
+#: monitor_processor.cc:56
 msgid "monitor mono"
 msgstr ""
 
-#: monitor_processor.cc:58
+#: monitor_processor.cc:59
 msgid "monitor dim level"
 msgstr ""
 
-#: monitor_processor.cc:62
+#: monitor_processor.cc:63
 msgid "monitor solo boost level"
 msgstr ""
 
-#: monitor_processor.cc:512
+#: monitor_processor.cc:543
 msgid "cut control %1"
 msgstr ""
 
-#: monitor_processor.cc:513
+#: monitor_processor.cc:544
 msgid "dim control"
 msgstr ""
 
-#: monitor_processor.cc:514
+#: monitor_processor.cc:545
 msgid "polarity control"
 msgstr ""
 
-#: monitor_processor.cc:515
+#: monitor_processor.cc:546
 msgid "solo control"
 msgstr ""
 
-#: mtc_slave.cc:240
+#: mtc_slave.cc:241
 msgid "MTC Slave: atomic read of current time failed, sleeping!"
 msgstr ""
 
-#: mtc_slave.cc:362
+#: mtc_slave.cc:363
 msgid ""
 "Unknown rate/drop value %1 in incoming MTC stream, session values used "
 "instead"
 msgstr ""
 
-#: mtc_slave.cc:382
+#: mtc_slave.cc:383
 msgid "Session framerate adjusted from %1 TO: MTC's %2."
 msgstr ""
 
-#: mtc_slave.cc:396
+#: mtc_slave.cc:397
 msgid "Session and MTC framerate mismatch: MTC:%1 %2:%3."
 msgstr ""
 
@@ -1257,7 +1548,7 @@ msgstr ""
 msgid "fixed time region copy"
 msgstr ""
 
-#: pannable.cc:207
+#: pannable.cc:208
 msgid "Pannable given XML data for %1 - ignored"
 msgstr ""
 
@@ -1291,19 +1582,67 @@ msgstr ""
 msgid "select panner: %1\n"
 msgstr ""
 
-#: panner_shell.cc:255
+#: panner_shell.cc:257
 msgid "Unknown panner plugin \"%1\" found in pan state - ignored"
 msgstr ""
 
-#: panner_shell.cc:261
+#: panner_shell.cc:263
 msgid "panner plugin node has no type information!"
 msgstr ""
 
-#: playlist.cc:2138
+#: parameter_descriptor.cc:201
+msgid "Note|C"
+msgstr ""
+
+#: parameter_descriptor.cc:202
+msgid "Note|C#"
+msgstr ""
+
+#: parameter_descriptor.cc:203
+msgid "Note|D"
+msgstr ""
+
+#: parameter_descriptor.cc:204
+msgid "Note|D#"
+msgstr ""
+
+#: parameter_descriptor.cc:205
+msgid "Note|E"
+msgstr ""
+
+#: parameter_descriptor.cc:206
+msgid "Note|F"
+msgstr ""
+
+#: parameter_descriptor.cc:207
+msgid "Note|F#"
+msgstr ""
+
+#: parameter_descriptor.cc:208
+msgid "Note|G"
+msgstr ""
+
+#: parameter_descriptor.cc:209
+msgid "Note|G#"
+msgstr ""
+
+#: parameter_descriptor.cc:210
+msgid "Note|A"
+msgstr ""
+
+#: parameter_descriptor.cc:211
+msgid "Note|A#"
+msgstr ""
+
+#: parameter_descriptor.cc:212
+msgid "Note|B"
+msgstr ""
+
+#: playlist.cc:2234
 msgid "region state node has no ID, ignored"
 msgstr ""
 
-#: playlist.cc:2156
+#: playlist.cc:2252
 msgid "Playlist: cannot create region from XML"
 msgstr ""
 
@@ -1315,125 +1654,245 @@ msgstr ""
 msgid "Could not construct playlist for PlaylistSource from session data!"
 msgstr ""
 
-#: plugin.cc:328
+#: plugin.cc:126
+msgid "Cannot remove plugin factory preset."
+msgstr ""
+
+#: plugin.cc:144
+msgid "Preset with given name already exists."
+msgstr ""
+
+#: plugin.cc:263
+msgid "Audio"
+msgstr ""
+
+#: plugin.cc:266
+msgid "Midi"
+msgstr ""
+
+#: plugin.cc:269
+msgid "?"
+msgstr ""
+
+#: plugin.cc:412
 msgid ""
 "Plugin presets are not supported in this build of %1. Consider paying for a "
 "full version"
 msgstr ""
 
-#: plugin.cc:403
+#: plugin.cc:495
 msgid ""
 "Saving plugin settings is not supported in this build of %1. Consider paying "
 "for the full version"
 msgstr ""
 
-#: plugin_insert.cc:596
+#: plugin_insert.cc:1148
 msgid "programming error: "
 msgstr ""
 
-#: plugin_insert.cc:933
+#: plugin_insert.cc:1700
+msgid "SC %1"
+msgstr ""
+
+#: plugin_insert.cc:2352
 msgid "XML node describing plugin is missing the `type' field"
 msgstr ""
 
-#: plugin_insert.cc:948
+#: plugin_insert.cc:2369
 msgid "unknown plugin type %1 in plugin insert state"
 msgstr ""
 
-#: plugin_insert.cc:976
+#: plugin_insert.cc:2397
 msgid "Plugin has no unique ID field"
 msgstr ""
 
-#: plugin_insert.cc:1001
+#: plugin_insert.cc:2435
 msgid ""
 "Found a reference to a plugin (\"%1\") that is unknown.\n"
 "Perhaps it was removed or moved since it was last used."
 msgstr ""
 
-#: plugin_insert.cc:1115
+#: plugin_insert.cc:2645
 msgid "PluginInsert: Auto: no ladspa port number"
 msgstr ""
 
-#: plugin_insert.cc:1122
+#: plugin_insert.cc:2652
 msgid "PluginInsert: Auto: port id out of range"
 msgstr ""
 
-#: plugin_insert.cc:1158
+#: plugin_insert.cc:2688
 msgid "PluginInsert: automatable control %1 not found - ignored"
 msgstr ""
 
-#: plugin_manager.cc:209
+#: plugin_manager.cc:220
 msgid "Discovering Plugins"
 msgstr ""
 
-#: plugin_manager.cc:231
+#: plugin_manager.cc:251
 msgid "Scanning LADSPA Plugins"
 msgstr ""
 
-#: plugin_manager.cc:234
+#: plugin_manager.cc:253
+msgid "Scanning Lua DSP Processors"
+msgstr ""
+
+#: plugin_manager.cc:256
 msgid "Scanning LV2 Plugins"
 msgstr ""
 
-#: plugin_manager.cc:239
+#: plugin_manager.cc:262
 msgid "Scanning Windows VST Plugins"
 msgstr ""
 
-#: plugin_manager.cc:246
+#: plugin_manager.cc:264
+msgid "Discovering Windows VST Plugins"
+msgstr ""
+
+#: plugin_manager.cc:273
 msgid "Scanning Linux VST Plugins"
 msgstr ""
 
-#: plugin_manager.cc:252
+#: plugin_manager.cc:275
+msgid "Discovering Linux VST Plugins"
+msgstr ""
+
+#: plugin_manager.cc:288
+msgid "VST Blacklist: "
+msgstr ""
+
+#: plugin_manager.cc:290
+msgid "VST Blacklist:"
+msgstr ""
+
+#: plugin_manager.cc:300
 msgid "Scanning AU Plugins"
 msgstr ""
 
-#: plugin_manager.cc:256
+#: plugin_manager.cc:302
+msgid "Discovering AU Plugins"
+msgstr ""
+
+#: plugin_manager.cc:307
 msgid "Plugin Scan Complete..."
 msgstr ""
 
-#: plugin_manager.cc:393
+#: plugin_manager.cc:513
 msgid "LADSPA"
 msgstr ""
 
-#: plugin_manager.cc:445
+#: plugin_manager.cc:565
 msgid "Could not parse rdf file: %1"
 msgstr ""
 
-#: plugin_manager.cc:482
+#: plugin_manager.cc:602
 msgid "LADSPA: cannot load module \"%1\" (%2)"
 msgstr ""
 
-#: plugin_manager.cc:489
+#: plugin_manager.cc:609
 msgid "LADSPA: module \"%1\" has no descriptor function."
 msgstr ""
 
-#: plugin_manager.cc:705
+#: plugin_manager.cc:813
+msgid "--- Windows VST plugins Scan: %1"
+msgstr ""
+
+#: plugin_manager.cc:819
 msgid "VST"
 msgstr ""
 
-#: plugin_manager.cc:732
+#: plugin_manager.cc:824
+msgid "--- Windows VST plugins Scan Done"
+msgstr ""
+
+#: plugin_manager.cc:839
+msgid "cannot open dll"
+msgstr ""
+
+#: plugin_manager.cc:843
+msgid "invalid dll, file too small"
+msgstr ""
+
+#: plugin_manager.cc:847
+msgid "not a dll"
+msgstr ""
+
+#: plugin_manager.cc:853
+msgid "cannot determine dll type"
+msgstr ""
+
+#: plugin_manager.cc:857
+msgid "cannot read dll PE header"
+msgstr ""
+
+#: plugin_manager.cc:862
+msgid "invalid dll PE header"
+msgstr ""
+
+#: plugin_manager.cc:869
+msgid "i386 (32-bit)"
+msgstr ""
+
+#: plugin_manager.cc:872
+msgid "Itanium"
+msgstr ""
+
+#: plugin_manager.cc:875
+msgid "x64 (64-bit)"
+msgstr ""
+
+#: plugin_manager.cc:878
+msgid "Native Architecture"
+msgstr ""
+
+#: plugin_manager.cc:881
+msgid "Unknown Architecture"
+msgstr ""
+
+#: plugin_manager.cc:897
+msgid " *  %1 (cache only)"
+msgstr ""
+
+#: plugin_manager.cc:899
+msgid " *  %1 - %2"
+msgstr ""
+
+#: plugin_manager.cc:913
+msgid " -> Cannot get Windows VST information, plugin ignored."
+msgstr ""
+
+#: plugin_manager.cc:924
 msgid ""
-"VST plugin %1 does not support processReplacing, and so cannot be used in %2 "
-"at this time"
+"VST plugin %1 does not support processReplacing, and cannot be used in %2 at "
+"this time"
 msgstr ""
 
-#: plugin_manager.cc:824
+#: plugin_manager.cc:959
+msgid "Ignoring duplicate Windows VST plugin \"%1\""
+msgstr ""
+
+#: plugin_manager.cc:971
+msgid " -> OK (VST Plugin \"%1\" was added)."
+msgstr ""
+
+#: plugin_manager.cc:1019
 msgid "LXVST"
 msgstr ""
 
-#: plugin_manager.cc:851
+#: plugin_manager.cc:1046
 msgid ""
 "linuxVST plugin %1 does not support processReplacing, and so cannot be used "
 "in %2 at this time"
 msgstr ""
 
-#: plugin_manager.cc:1020
+#: plugin_manager.cc:1213
 msgid "unknown plugin status type \"%1\" - all entries ignored"
 msgstr ""
 
-#: plugin_manager.cc:1037
+#: plugin_manager.cc:1232
 msgid "unknown plugin type \"%1\" - ignored"
 msgstr ""
 
-#: port.cc:450
+#: port.cc:504
 msgid "could not reregister %1"
 msgstr ""
 
@@ -1441,150 +1900,215 @@ msgstr ""
 msgid "insert %1"
 msgstr ""
 
-#: port_insert.cc:197
+#: port_insert.cc:204
 msgid "XML node describing port insert is missing the `type' field"
 msgstr ""
 
-#: port_insert.cc:202
+#: port_insert.cc:209
 msgid "non-port insert XML used for port plugin insert"
 msgstr ""
 
-#: port_manager.cc:287
+#: port_manager.cc:288
 msgid ""
 "a port with the name \"%1\" already exists: check for duplicated track/bus "
 "names"
 msgstr ""
 
-#: port_manager.cc:289
+#: port_manager.cc:290
 msgid ""
 "No more ports are available. You will need to stop %1 and restart with more "
 "ports if you need this many tracks."
 msgstr ""
 
-#: port_manager.cc:292
+#: port_manager.cc:293
 msgid "AudioEngine: cannot register port \"%1\": %2"
 msgstr ""
 
-#: port_manager.cc:331
+#: port_manager.cc:332
 msgid "unable to create port: %1"
 msgstr ""
 
-#: port_manager.cc:418
+#: port_manager.cc:453
 msgid "AudioEngine: cannot connect %1 (%2) to %3 (%4)"
 msgstr ""
 
-#: port_manager.cc:470 port_manager.cc:471
+#: port_manager.cc:505 port_manager.cc:506
 msgid "Re-establising port %1 failed"
 msgstr ""
 
-#: processor.cc:214
+#: processor.cc:218
 msgid "No %1 property flag in element %2"
 msgstr ""
 
-#: processor.cc:223
+#: processor.cc:227
 msgid "No child node with active property"
 msgstr ""
 
-#: rc_configuration.cc:91
+#: rc_configuration.cc:92
 msgid "Loading system configuration file %1"
 msgstr ""
 
-#: rc_configuration.cc:95
+#: rc_configuration.cc:96
 msgid "%1: cannot read system configuration file \"%2\""
 msgstr ""
 
-#: rc_configuration.cc:100
+#: rc_configuration.cc:101
 msgid "%1: system configuration file \"%2\" not loaded successfully."
 msgstr ""
 
-#: rc_configuration.cc:104
+#: rc_configuration.cc:105
 msgid ""
 "Your system %1 configuration file is empty. This probably means that there "
 "was an error installing %1"
 msgstr ""
 
-#: rc_configuration.cc:119
+#: rc_configuration.cc:120
 msgid "Loading user configuration file %1"
 msgstr ""
 
-#: rc_configuration.cc:123
+#: rc_configuration.cc:124
 msgid "%1: cannot read configuration file \"%2\""
 msgstr ""
 
-#: rc_configuration.cc:128
+#: rc_configuration.cc:129
 msgid "%1: user configuration file \"%2\" not loaded successfully."
 msgstr ""
 
-#: rc_configuration.cc:132
+#: rc_configuration.cc:133
 msgid "your %1 configuration file is empty. This is not normal."
 msgstr ""
 
-#: rc_configuration.cc:149
+#: rc_configuration.cc:150
 msgid "Config file %1 not saved"
 msgstr ""
 
-#: recent_sessions.cc:54
+#: recent_sessions.cc:55
 msgid "cannot open recent session file %1 (%2)"
 msgstr ""
 
-#: region_factory.cc:78 region_factory.cc:120 region_factory.cc:161
-#: region_factory.cc:203
+#: recent_sessions.cc:68 recent_sessions.cc:126
+msgid "Error reading recent session file %1 (%2)"
+msgstr ""
+
+#: recent_sessions.cc:113
+msgid "Cannot open recent template file %1 (%2)"
+msgstr ""
+
+#: recent_sessions.cc:176
+msgid "Error writing recent sessions file %1 (%2)"
+msgstr ""
+
+#: recent_sessions.cc:211
+msgid "Error writing saved template file %1 (%2)"
+msgstr ""
+
+#: region_factory.cc:78 region_factory.cc:121 region_factory.cc:162
+#: region_factory.cc:204
 msgid ""
 "programming error: RegionFactory::create() called with unknown Region type"
 msgstr ""
 
-#: region_factory.cc:565
+#: region_factory.cc:566
 msgid "%1 compound-%2 (%3)"
 msgstr ""
 
-#: region_factory.cc:567
+#: region_factory.cc:568
 msgid "%1 compound-%2.1 (%3)"
 msgstr ""
 
-#: region_factory.cc:629
+#: region_factory.cc:630
 msgid "cannot create new name for region \"%1\""
 msgstr ""
 
-#: resampled_source.cc:102
+#: resampled_source.cc:107
 msgid "Import: %1"
 msgstr ""
 
-#: resampled_source.cc:132 srcfilesource.cc:75
+#: resampled_source.cc:136 srcfilesource.cc:75
 msgid "Import: src_new() failed : %1"
 msgstr ""
 
-#: return.cc:41
+#: return.cc:42
 msgid "return %1"
 msgstr ""
 
-#: route.cc:1218 route.cc:2701
+#: route.cc:858 route.cc:2780
 msgid "unknown Processor type \"%1\"; ignored"
 msgstr ""
 
-#: route.cc:1240
+#: route.cc:880
 msgid "processor could not be created. Ignored."
 msgstr ""
 
-#: route.cc:2126 route.cc:2355
+#: route.cc:2334 route.cc:2491
 msgid "Bad node sent to Route::set_state() [%1]"
 msgstr ""
 
-#: route.cc:2186
+#: route.cc:2387
 msgid "Pannable state found for route (%1) without a panner!"
 msgstr ""
 
-#: route.cc:2260 route.cc:2264 route.cc:2469 route.cc:2473
-msgid "badly formed order key string in state file! [%1] ... ignored."
+#: route.cc:3258
+msgid "Invalid Solo-Isolate propagation: from:%1 new:%2 - old:%3 = delta:%4"
+msgstr ""
+
+#: route.cc:4393
+msgid "Amp/Fader on Route '%1' went AWOL. Re-added."
+msgstr ""
+
+#: route.cc:4994
+msgid "lo"
+msgstr ""
+
+#: route.cc:4996
+msgid "mid"
+msgstr ""
+
+#: route.cc:4998
+msgid "hi"
+msgstr ""
+
+#: route.cc:5105
+msgid "Leveler"
+msgstr ""
+
+#: route.cc:5107
+msgid "Compressor"
+msgstr ""
+
+#: route.cc:5109 route.cc:5111
+msgid "Limiter"
+msgstr ""
+
+#: route.cc:5111
+msgid "Sidechain"
+msgstr ""
+
+#: route.cc:5114 route.cc:5116 route.cc:5133 route.cc:5135
+msgid "???"
+msgstr ""
+
+#: route.cc:5126
+msgid "Attk"
+msgstr ""
+
+#: route.cc:5128
+msgid "Ratio"
 msgstr ""
 
-#: route.cc:2479
-msgid "Converting deprecated order key for %1 using Editor order %2"
+#: route.cc:5131
+msgid "Rels"
 msgstr ""
 
-#: route_group.cc:459
+#: route_group.cc:507
 msgid "You cannot subgroup MIDI tracks at this time"
 msgstr ""
 
+#: route_group.cc:514
+msgid ""
+"You cannot subgroup tracks with different number of outputs at this time."
+msgstr ""
+
 #: rb_effect.cc:229 rb_effect.cc:269
 msgid "tempoize: error reading data from %1 at %2 (wanted %3, got %4)"
 msgstr ""
@@ -1593,205 +2117,245 @@ msgstr ""
 msgid "error writing tempo-adjusted data to %1"
 msgstr ""
 
-#: send.cc:61
+#: send.cc:62
 msgid "aux %1"
 msgstr ""
 
-#: send.cc:65
+#: send.cc:66
 msgid "send %1"
 msgstr ""
 
-#: send.cc:67
+#: send.cc:68
 msgid "programming error: send created using role %1"
 msgstr ""
 
+#: session.cc:348 session.cc:403
+msgid "Cannot connect to audio/midi engine"
+msgstr ""
+
 #: session.cc:358
+msgid "Session initialization failed"
+msgstr ""
+
+#: session.cc:374
+msgid "Failed to load template/snapshot state"
+msgstr ""
+
+#: session.cc:385
+msgid "Failed to load state"
+msgstr ""
+
+#: session.cc:409
+msgid "Cannot configure audio/midi engine with session parameters"
+msgstr ""
+
+#: session.cc:433
 msgid "Connect to engine"
 msgstr ""
 
-#: session.cc:363
+#: session.cc:484
 msgid "Session loading complete"
 msgstr ""
 
-#: session.cc:435
+#: session.cc:575
 msgid "Set up LTC"
 msgstr ""
 
-#: session.cc:437
+#: session.cc:577
 msgid "Set up Click"
 msgstr ""
 
-#: session.cc:439
+#: session.cc:579
 msgid "Set up standard connections"
 msgstr ""
 
-#: session.cc:667
+#: session.cc:888
 msgid "could not setup Click I/O"
 msgstr ""
 
-#: session.cc:730
+#: session.cc:951
 #, c-format
 msgid "out %s"
 msgstr ""
 
-#: session.cc:732
+#: session.cc:953
 #, c-format
 msgid "out %<PRIu32>"
 msgstr ""
 
-#: session.cc:747
+#: session.cc:968
 #, c-format
 msgid "out %<PRIu32>+%<PRIu32>"
 msgstr ""
 
-#: session.cc:764
+#: session.cc:985
 #, c-format
 msgid "in %s"
 msgstr ""
 
-#: session.cc:766
+#: session.cc:987
 #, c-format
 msgid "in %<PRIu32>"
 msgstr ""
 
-#: session.cc:781
+#: session.cc:1002
 #, c-format
 msgid "in %<PRIu32>+%<PRIu32>"
 msgstr ""
 
-#: session.cc:855
+#: session.cc:1082
 msgid "cannot connect master output %1 to %2"
 msgstr ""
 
-#: session.cc:924
-msgid "Monitor"
+#: session.cc:1170
+msgid "Cannot create monitor section. 'Monitor' Port name is not unique."
 msgstr ""
 
-#: session.cc:969
+#: session.cc:1204 session.cc:1335
 msgid "cannot connect control input %1 to %2"
 msgstr ""
 
-#: session.cc:989
+#: session.cc:1224 session.cc:1354
 msgid "The preferred I/O for the monitor bus (%1) cannot be found"
 msgstr ""
 
-#: session.cc:1020
+#: session.cc:1255 session.cc:1385
 msgid "cannot connect control output %1 to %2"
 msgstr ""
 
-#: session.cc:1088
+#: session.cc:1443
 msgid "cannot create Auditioner: no auditioning of regions possible"
 msgstr ""
 
-#: session.cc:1273
+#: session.cc:1644
 msgid "Session: you can't use that location for auto punch (start <= end)"
 msgstr ""
 
-#: session.cc:1300
+#: session.cc:1671
 msgid "Session: you can't use that location for session start/end)"
 msgstr ""
 
-#: session.cc:1332
+#: session.cc:1703
 msgid ""
 "You cannot use this location for auto-loop because it has zero or negative "
 "length"
 msgstr ""
 
-#: session.cc:1500
+#: session.cc:1886
 msgid "programming error: session range removed!"
 msgstr ""
 
-#: session.cc:1754
+#: session.cc:2158
 msgid "feedback loop setup between %1 and %2"
 msgstr ""
 
-#: session.cc:2050
+#: session.cc:2419
+msgid "Track "
+msgstr ""
+
+#: session.cc:2421
+msgid "Audio "
+msgstr ""
+
+#: session.cc:2426
+msgid "MIDI "
+msgstr ""
+
+#: session.cc:2500
 msgid "Session: could not create new midi track."
 msgstr ""
 
-#: session.cc:2056
+#: session.cc:2506
 msgid ""
 "No more JACK ports are available. You will need to stop %1 and restart JACK "
 "with more ports if you need this many tracks."
 msgstr ""
 
-#: session.cc:2242 session.cc:2245
-msgid "Audio"
+#: session.cc:2547 session.cc:2550
+msgid "Midi Bus"
+msgstr ""
+
+#: session.cc:2572
+msgid "cannot configure new midi bus input"
+msgstr ""
+
+#: session.cc:2578
+msgid "cannot configure new midi bus output"
 msgstr ""
 
-#: session.cc:2269 session.cc:2277 session.cc:2355 session.cc:2363
+#: session.cc:2592 session.cc:3137
+msgid "Session: could not create new audio route."
+msgstr ""
+
+#: session.cc:3022 session.cc:3030 session.cc:3113 session.cc:3121
 msgid "cannot configure %1 in/%2 out configuration for new audio track"
 msgstr ""
 
-#: session.cc:2300
+#: session.cc:3050
 msgid "Session: could not create new audio track."
 msgstr ""
 
-#: session.cc:2333 session.cc:2336
+#: session.cc:3088 session.cc:3091
 msgid "Bus"
 msgstr ""
 
-#: session.cc:2386
-msgid "Session: could not create new audio route."
-msgstr ""
-
-#: session.cc:2446 session.cc:2456
+#: session.cc:3207 session.cc:3217
 msgid "Session: UINT_MAX routes? impossible!"
 msgstr ""
 
-#: session.cc:2478
+#: session.cc:3293
 msgid "Session: cannot create track/bus from template description"
 msgstr ""
 
-#: session.cc:2504
+#: session.cc:3331
 msgid "Session: could not create new route from template"
 msgstr ""
 
-#: session.cc:2534
+#: session.cc:3365
 msgid "Adding new tracks/busses failed"
 msgstr ""
 
-#: session.cc:3674
+#: session.cc:4786
 msgid "Merging embedded file %1: name collision AND md5 hash collision!"
 msgstr ""
 
-#: session.cc:3804 session.cc:3877
+#: session.cc:4916 session.cc:4989
 msgid "There are already %1 recordings for %2, which I consider too many."
 msgstr ""
 
-#: session.cc:4319
+#: session.cc:5665
 msgid "send ID %1 appears to be in use already"
 msgstr ""
 
-#: session.cc:4331
+#: session.cc:5677
 msgid "aux send ID %1 appears to be in use already"
 msgstr ""
 
-#: session.cc:4343
+#: session.cc:5689
 msgid "return ID %1 appears to be in use already"
 msgstr ""
 
-#: session.cc:4355
+#: session.cc:5701
 msgid "insert ID %1 appears to be in use already"
 msgstr ""
 
-#: session.cc:4480
+#: session.cc:5827
 msgid "Cannot write a range where end <= start (e.g. %1 <= %2)"
 msgstr ""
 
-#: session.cc:4489
+#: session.cc:5836
 msgid "Cannot write a range with no data."
 msgstr ""
 
-#: session.cc:4531
+#: session.cc:5878
 msgid "cannot create new file \"%1\" for %2"
 msgstr ""
 
-#: session_click.cc:161
+#: session_click.cc:162
 msgid "cannot open click soundfile %1 (%2)"
 msgstr ""
 
-#: session_click.cc:174
+#: session_click.cc:175
 msgid "cannot read data from click soundfile"
 msgstr ""
 
@@ -1830,23 +2394,36 @@ msgstr ""
 msgid "Could not save session options"
 msgstr ""
 
-#: session_directory.cc:59
+#: session_directory.cc:65
 msgid "Cannot create Session directory at path %1 Error: %2"
 msgstr ""
 
-#: session_directory.cc:76
+#: session_directory.cc:82
 msgid "Session subdirectory does not exist at path %1"
 msgstr ""
 
-#: session_events.cc:234
+#: session_directory.cc:161
+msgid ""
+"session-dir and session-name mismatch. Please use 'Menu > Session > Rename' "
+"in the future to rename sessions."
+msgstr ""
+
+#: session_directory.cc:167
+msgid ""
+"The session's interchange dir is tainted.\n"
+"There is more than one folder in '%1'.\n"
+"Please remove extra subdirs to reduce possible filename ambiguties."
+msgstr ""
+
+#: session_events.cc:229
 msgid "Session: cannot have two events of type %1 at the same frame (%2)."
 msgstr ""
 
-#: session_export.cc:125
+#: session_export.cc:152
 msgid "%1: cannot seek to %2 for export"
 msgstr ""
 
-#: session_export.cc:182
+#: session_export.cc:221
 msgid "Export ended unexpectedly: %1"
 msgstr ""
 
@@ -1856,412 +2433,465 @@ msgid ""
 "of this session."
 msgstr ""
 
-#: session_midi.cc:520
+#: session_midi.cc:570
 msgid "Session: cannot send quarter-frame MTC message (%1)"
 msgstr ""
 
-#: session_playlists.cc:378 session_playlists.cc:397
+#: session_playlists.cc:405 session_playlists.cc:424
 msgid "Session: cannot create Playlist from XML description."
 msgstr ""
 
-#: session_process.cc:136
+#: session_process.cc:159
 msgid "Session: error in no roll for %1"
 msgstr ""
 
-#: session_process.cc:1174
+#: session_process.cc:1202
 msgid "Programming error: illegal event type in process_event (%1)"
 msgstr ""
 
-#: session_state.cc:179
+#: session_state.cc:194
 msgid "solo cut control (dB)"
 msgstr ""
 
-#: session_state.cc:203
+#: session_state.cc:216
 msgid "Set block size and sample rate"
 msgstr ""
 
-#: session_state.cc:208
+#: session_state.cc:221
 msgid "Using configuration"
 msgstr ""
 
-#: session_state.cc:332
+#: session_state.cc:348
 msgid "Reset Remote Controls"
 msgstr ""
 
-#: session_state.cc:424
+#: session_state.cc:377 session_state.cc:409
+msgid "Filling playback buffers"
+msgstr ""
+
+#: session_state.cc:475
 msgid "Session: cannot create session peakfile folder \"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:431
+#: session_state.cc:482
 msgid "Session: cannot create session sounds dir \"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:438
+#: session_state.cc:489
 msgid "Session: cannot create session midi dir \"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:445
+#: session_state.cc:496
 msgid "Session: cannot create session dead sounds folder \"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:452
+#: session_state.cc:503
 msgid "Session: cannot create session export folder \"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:459
+#: session_state.cc:510
 msgid "Session: cannot create session analysis folder \"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:466
+#: session_state.cc:517
 msgid "Session: cannot create session plugins folder \"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:473
+#: session_state.cc:524
 msgid "Session: cannot create session externals folder \"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:487
+#: session_state.cc:538
 msgid "Session: cannot create session folder \"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:521
+#: session_state.cc:569
+msgid "Error reading session template file %1 (%2)"
+msgstr ""
+
+#: session_state.cc:584
+msgid "Error writing session template file %1 (%2)"
+msgstr ""
+
+#: session_state.cc:601
 msgid "Could not open %1 for writing session template"
 msgstr ""
 
-#: session_state.cc:527
+#: session_state.cc:608
 msgid "Could not open session template %1 for reading"
 msgstr ""
 
-#: session_state.cc:546
-msgid "Master"
+#: session_state.cc:626
+msgid "Loop"
 msgstr ""
 
-#: session_state.cc:607
+#: session_state.cc:707
 msgid "Could not remove pending capture state at path \"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:631
+#: session_state.cc:731
 msgid "could not rename snapshot %1 to %2 (%3)"
 msgstr ""
 
-#: session_state.cc:659
+#: session_state.cc:759
 msgid "Could not remove session file at path \"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:686
+#: session_state.cc:788
 msgid ""
 "the %1 audio engine is not connected and state saving would lose all I/O "
 "connections. Session not saved"
 msgstr ""
 
-#: session_state.cc:737
+#: session_state.cc:856
 msgid "state could not be saved to %1"
 msgstr ""
 
-#: session_state.cc:739 session_state.cc:750
+#: session_state.cc:858 session_state.cc:871
 msgid "Could not remove temporary session file at path \"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:747
+#: session_state.cc:868
 msgid "could not rename temporary session file %1 to %2 (%3)"
 msgstr ""
 
-#: session_state.cc:815
+#: session_state.cc:942
 msgid "%1: session file \"%2\" doesn't exist!"
 msgstr ""
 
-#: session_state.cc:827
+#: session_state.cc:954
 msgid "Could not understand session file %1"
 msgstr ""
 
-#: session_state.cc:836
+#: session_state.cc:963
 msgid "Session file %1 is not a session"
 msgstr ""
 
-#: session_state.cc:1148
+#: session_state.cc:1332
 msgid "programming error: Session: incorrect XML node sent to set_state()"
 msgstr ""
 
-#: session_state.cc:1202
+#: session_state.cc:1410
 msgid "Session: XML state has no options section"
 msgstr ""
 
-#: session_state.cc:1207
+#: session_state.cc:1415
 msgid "Session: XML state has no metadata section"
 msgstr ""
 
-#: session_state.cc:1218
+#: session_state.cc:1426
 msgid "Session: XML state has no sources section"
 msgstr ""
 
-#: session_state.cc:1225
+#: session_state.cc:1433
 msgid "Session: XML state has no Tempo Map section"
 msgstr ""
 
-#: session_state.cc:1232
+#: session_state.cc:1440
 msgid "Session: XML state has no locations section"
 msgstr ""
 
-#: session_state.cc:1245
+#: session_state.cc:1453
 msgid "Session: XML state has no Regions section"
 msgstr ""
 
-#: session_state.cc:1252
+#: session_state.cc:1460
 msgid "Session: XML state has no playlists section"
 msgstr ""
 
-#: session_state.cc:1272
+#: session_state.cc:1480
 msgid "Session: XML state has no bundles section"
 msgstr ""
 
-#: session_state.cc:1284
+#: session_state.cc:1492
 msgid "Session: XML state has no diskstreams section"
 msgstr ""
 
-#: session_state.cc:1292
+#: session_state.cc:1504
 msgid "Session: XML state has no routes section"
 msgstr ""
 
-#: session_state.cc:1304
+#: session_state.cc:1520
 msgid "Session: XML state has no route groups section"
 msgstr ""
 
-#: session_state.cc:1313
+#: session_state.cc:1529
 msgid "Session: XML state has no edit groups section"
 msgstr ""
 
-#: session_state.cc:1320
+#: session_state.cc:1536
 msgid "Session: XML state has no mix groups section"
 msgstr ""
 
-#: session_state.cc:1328
+#: session_state.cc:1544
 msgid "Session: XML state has no click section"
 msgstr ""
 
-#: session_state.cc:1374
+#: session_state.cc:1606
 msgid "Session: cannot create Route from XML description."
 msgstr ""
 
-#: session_state.cc:1378
+#: session_state.cc:1610
 msgid "Loaded track/bus %1"
 msgstr ""
 
-#: session_state.cc:1383
+#: session_state.cc:1615
 msgid "Tracks/busses loaded;  Adding to Session"
 msgstr ""
 
-#: session_state.cc:1387
+#: session_state.cc:1619
 msgid "Finished adding tracks/busses"
 msgstr ""
 
-#: session_state.cc:1486
+#: session_state.cc:1709
 msgid "Could not find diskstream for route"
 msgstr ""
 
-#: session_state.cc:1546
+#: session_state.cc:1760
 msgid "Session: cannot create Region from XML description."
 msgstr ""
 
-#: session_state.cc:1550
+#: session_state.cc:1764
 msgid "Can not load state for region '%1'"
 msgstr ""
 
-#: session_state.cc:1586
+#: session_state.cc:1800
 msgid "Regions in compound description not found (ID's %1 and %2): ignored"
 msgstr ""
 
-#: session_state.cc:1614
+#: session_state.cc:1828
 msgid "Nested source has no ID info in session file! (ignored)"
 msgstr ""
 
-#: session_state.cc:1626
+#: session_state.cc:1840
 msgid "Cannot reconstruct nested source for region %1"
 msgstr ""
 
-#: session_state.cc:1688
+#: session_state.cc:1902
 msgid "Session: XMLNode describing a AudioRegion is incomplete (no source)"
 msgstr ""
 
-#: session_state.cc:1696 session_state.cc:1717 session_state.cc:1737
+#: session_state.cc:1910 session_state.cc:1931 session_state.cc:1951
 msgid ""
 "Session: XMLNode describing a AudioRegion references an unknown source id =%1"
 msgstr ""
 
-#: session_state.cc:1702 session_state.cc:1723 session_state.cc:1743
+#: session_state.cc:1916 session_state.cc:1937 session_state.cc:1957
 msgid ""
 "Session: XMLNode describing a AudioRegion references a non-audio source id ="
 "%1"
 msgstr ""
 
-#: session_state.cc:1766
+#: session_state.cc:1980
 msgid ""
 "Session: XMLNode describing an AudioRegion is missing some master sources; "
 "ignored"
 msgstr ""
 
-#: session_state.cc:1800
+#: session_state.cc:2014
 msgid "Session: XMLNode describing a MidiRegion is incomplete (no source)"
 msgstr ""
 
-#: session_state.cc:1808
+#: session_state.cc:2022
 msgid ""
 "Session: XMLNode describing a MidiRegion references an unknown source id =%1"
 msgstr ""
 
-#: session_state.cc:1814
+#: session_state.cc:2028
 msgid ""
 "Session: XMLNode describing a MidiRegion references a non-midi source id =%1"
 msgstr ""
 
-#: session_state.cc:1873
+#: session_state.cc:2101
 msgid "Session: cannot create Source from XML description."
 msgstr ""
 
-#: session_state.cc:1881
+#: session_state.cc:2109
 msgid ""
 "A external MIDI file is missing. %1 cannot currently recover from missing "
 "external MIDI files"
 msgstr ""
 
-#: session_state.cc:1963
+#: session_state.cc:2191
 msgid "Found a sound file that cannot be used by %1. Talk to the programmers."
 msgstr ""
 
-#: session_state.cc:1980
+#: session_state.cc:2212
 msgid "Could not create templates directory \"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:1993
+#: session_state.cc:2224
 msgid "Template \"%1\" already exists - new version not created"
 msgstr ""
 
-#: session_state.cc:1999
+#: session_state.cc:2230
 msgid "Could not create directory for Session template\"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:2009
+#: session_state.cc:2259
 msgid "template not saved"
 msgstr ""
 
-#: session_state.cc:2019
-msgid "Could not create directory for Session template plugin state\"%1\" (%2)"
+#: session_state.cc:2501
+msgid "Unknown node \"%1\" found in Bundles list from session file"
 msgstr ""
 
-#: session_state.cc:2262
-msgid "Unknown node \"%1\" found in Bundles list from session file"
+#: session_state.cc:2969
+msgid "Cannot cleanup peak-files for read-only session."
 msgstr ""
 
-#: session_state.cc:2835
+#: session_state.cc:2973
+msgid "Cannot cleanup peak-files while recording"
+msgstr ""
+
+#: session_state.cc:2996
+msgid ""
+"Timeout waiting for peak-file creation to terminate before cleanup, please "
+"try again later."
+msgstr ""
+
+#: session_state.cc:3261
 msgid "Session: cannot create dead file folder \"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:2874
+#: session_state.cc:3296
 msgid "cannot rename unused file source from %1 to %2 (%3)"
 msgstr ""
 
-#: session_state.cc:2892
+#: session_state.cc:3312
 msgid "cannot remove peakfile %1 for %2 (%3)"
 msgstr ""
 
-#: session_state.cc:3205
+#: session_state.cc:3633
 msgid "could not backup old history file, current history not saved"
 msgstr ""
 
-#: session_state.cc:3214
+#: session_state.cc:3642
 msgid "history could not be saved to %1"
 msgstr ""
 
-#: session_state.cc:3217
+#: session_state.cc:3645
 msgid "Could not remove history file at path \"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:3221
+#: session_state.cc:3649
 msgid "could not restore history file from backup %1 (%2)"
 msgstr ""
 
-#: session_state.cc:3246
+#: session_state.cc:3674
 msgid "%1: no history file \"%2\" for this session."
 msgstr ""
 
-#: session_state.cc:3252
+#: session_state.cc:3680
 msgid "Could not understand session history file \"%1\""
 msgstr ""
 
-#: session_state.cc:3294
+#: session_state.cc:3722
 msgid "Failed to downcast MidiSource for NoteDiffCommand"
 msgstr ""
 
-#: session_state.cc:3305
+#: session_state.cc:3733
 msgid "Failed to downcast MidiSource for SysExDiffCommand"
 msgstr ""
 
-#: session_state.cc:3316
+#: session_state.cc:3744
 msgid "Failed to downcast MidiSource for PatchChangeDiffCommand"
 msgstr ""
 
-#: session_state.cc:3324
+#: session_state.cc:3752
 msgid "Couldn't figure out how to make a Command out of a %1 XMLNode."
 msgstr ""
 
-#: session_state.cc:3560
+#: session_state.cc:3990
 msgid "Session: unknown diskstream type in XML"
 msgstr ""
 
-#: session_state.cc:3565
+#: session_state.cc:3995
 msgid "Session: could not load diskstream via XML state"
 msgstr ""
 
-#: session_state.cc:3689 session_state.cc:3717 session_state.cc:3730
-#: session_state.cc:3745
+#: session_state.cc:4092
+msgid "Cannot rename read-only session."
+msgstr ""
+
+#: session_state.cc:4096
+msgid "Cannot rename session while recording"
+msgstr ""
+
+#: session_state.cc:4181 session_state.cc:4182 session_state.cc:4224
+#: session_state.cc:4228
 msgid "renaming %s as %2 failed (%3)"
 msgstr ""
 
+#: session_state.cc:4244 session_state.cc:4245 session_state.cc:4259
+#: session_state.cc:4260
+msgid "renaming %1 as %2 failed (%3)"
+msgstr ""
+
+#: session_state.cc:4571
+msgid "Cannot create new session folder %1"
+msgstr ""
+
+#: session_state.cc:4633 session_state.cc:4708
+msgid ""
+"\n"
+"copying \"%1\" failed !"
+msgstr ""
+
+#: session_state.cc:4906
+msgid "unknown reason"
+msgstr ""
+
 #: session_time.cc:214
 msgid "Unknown transport state %1 in sync callback"
 msgstr ""
 
-#: session_transport.cc:171
+#: session_transport.cc:177
 msgid "Cannot loop - no loop range defined"
 msgstr ""
 
-#: session_transport.cc:833
+#: session_transport.cc:968
 msgid ""
 "Seamless looping cannot be supported while %1 is using JACK transport.\n"
 "Recommend changing the configured options"
 msgstr ""
 
-#: session_transport.cc:915
+#: session_transport.cc:1050
 msgid "Locate called for negative sample position - ignored"
 msgstr ""
 
-#: session_transport.cc:1272
+#: session_transport.cc:1401
 msgid ""
 "Global varispeed cannot be supported while %1 is connected to JACK transport "
 "control"
 msgstr ""
 
-#: smf_source.cc:344
+#: slavable.cc:100
+msgid "Master #%1 not found, assignment lost"
+msgstr ""
+
+#: smf_source.cc:350
 msgid "Unable to read event prefix, corrupt MIDI ring"
 msgstr ""
 
-#: smf_source.cc:357
+#: smf_source.cc:363
 msgid "Event has time and size but no body, corrupt MIDI ring"
 msgstr ""
 
-#: smf_source.cc:363
+#: smf_source.cc:369
 msgid "Event time is before MIDI source position"
 msgstr ""
 
-#: smf_source.cc:409
+#: smf_source.cc:417
 msgid ""
 "Skipping event with unordered beat time %1 < %2 (off by %3 beats, %4 ticks)"
 msgstr ""
 
-#: smf_source.cc:453
+#: smf_source.cc:461
 msgid "Skipping event with unordered frame time %1 < %2"
 msgstr ""
 
-#: smf_source.cc:518
+#: smf_source.cc:526
 msgid "cannot open MIDI file %1 for write"
 msgstr ""
 
@@ -2278,7 +2908,7 @@ msgid "CAF"
 msgstr ""
 
 #: sndfile_helpers.cc:37
-msgid "W64 (64 bit WAV)"
+msgid "W64 (64-bit WAV)"
 msgstr ""
 
 #: sndfile_helpers.cc:38
@@ -2322,23 +2952,23 @@ msgid ".raw"
 msgstr ""
 
 #: sndfile_helpers.cc:66
-msgid "Signed 16 bit PCM"
+msgid "Signed 16-bit PCM"
 msgstr ""
 
 #: sndfile_helpers.cc:67
-msgid "Signed 24 bit PCM"
+msgid "Signed 24-bit PCM"
 msgstr ""
 
 #: sndfile_helpers.cc:68
-msgid "Signed 32 bit PCM"
+msgid "Signed 32-bit PCM"
 msgstr ""
 
 #: sndfile_helpers.cc:69
-msgid "Signed 8 bit PCM"
+msgid "Signed 8-bit PCM"
 msgstr ""
 
 #: sndfile_helpers.cc:70
-msgid "32 bit float"
+msgid "32-bit float"
 msgstr ""
 
 #: sndfile_helpers.cc:83
@@ -2349,88 +2979,108 @@ msgstr ""
 msgid "Big-endian (PowerPC)"
 msgstr ""
 
-#: sndfilesource.cc:260
+#: sndfilesource.cc:282
+msgid "SndFileSource: cannot open file \"%1\" for %2"
+msgstr ""
+
+#: sndfilesource.cc:300
 msgid "SndFileSource: cannot open file \"%1\" for %2 (%3)"
 msgstr ""
 
-#: sndfilesource.cc:268
+#: sndfilesource.cc:308
 msgid ""
 "SndFileSource: file only contains %1 channels; %2 is invalid as a channel "
 "number"
 msgstr ""
 
-#: sndfilesource.cc:322 sndfilesource.cc:655
+#: sndfilesource.cc:323
+msgid "Cannot mark RF64 audio file for automatic downgrade to WAV: %1"
+msgstr ""
+
+#: sndfilesource.cc:375 sndfilesource.cc:705
 msgid ""
 "cannot set broadcast info for audio file %1 (%2); dropping broadcast info "
 "for this file"
 msgstr ""
 
-#: sndfilesource.cc:368
-msgid "could not allocate file %1 for reading."
+#: sndfilesource.cc:418
+msgid "could not open file %1 for reading."
 msgstr ""
 
-#: sndfilesource.cc:403
+#: sndfilesource.cc:453
 msgid "SndFileSource: could not seek to frame %1 within %2 (%3)"
 msgstr ""
 
-#: sndfilesource.cc:412
+#: sndfilesource.cc:462
 msgid ""
 "SndFileSource: @ %1 could not read %2 within %3 (%4) (len = %5, ret was %6)"
 msgstr ""
 
-#: sndfilesource.cc:454 sndfilesource.cc:483
+#: sndfilesource.cc:504 sndfilesource.cc:533
 msgid "attempt to write a non-writable audio file source (%1)"
 msgstr ""
 
-#: sndfilesource.cc:459 utils.cc:579 utils.cc:603 utils.cc:617 utils.cc:636
+#: sndfilesource.cc:509 utils.cc:564 utils.cc:588 utils.cc:602 utils.cc:621
 msgid "programming error: %1 %2"
 msgstr ""
 
-#: sndfilesource.cc:586 sndfilesource.cc:604
+#: sndfilesource.cc:636 sndfilesource.cc:654
 msgid "attempt to flush a non-writable audio file source (%1)"
 msgstr ""
 
-#: sndfilesource.cc:591
+#: sndfilesource.cc:641
 msgid "could not allocate file %1 to write header"
 msgstr ""
 
-#: sndfilesource.cc:609
+#: sndfilesource.cc:659
 msgid "could not allocate file %1 to flush contents"
 msgstr ""
 
-#: sndfilesource.cc:621
+#: sndfilesource.cc:671
 msgid ""
 "attempt to store broadcast info in a non-writable audio file source (%1)"
 msgstr ""
 
-#: sndfilesource.cc:626
+#: sndfilesource.cc:676
 msgid "attempt to set BWF info for an un-opened audio file source (%1)"
 msgstr ""
 
-#: sndfilesource.cc:670
+#: sndfilesource.cc:720
 msgid "%1: cannot seek to %2 (libsndfile error: %3)"
 msgstr ""
 
-#: sndfilesource.cc:780
+#: sndfilesource.cc:830
 msgid "SndFileSource: \"%1\" bad read retval: %2 of %5 (%3: %4)"
 msgstr ""
 
-#: sndfilesource.cc:793 sndfilesource.cc:843 sndfilesource.cc:850
+#: sndfilesource.cc:843 sndfilesource.cc:893 sndfilesource.cc:900
 msgid "SndFileSource: \"%1\" bad write (%2)"
 msgstr ""
 
-#: sndfilesource.cc:873
+#: sndfilesource.cc:923
 msgid ""
 "Filesource: start time is already set for existing file (%1): Cannot change "
 "start time."
 msgstr ""
 
+#: sndfilesource.cc:982
+msgid "SndFileSource: cannot open file \"%1\" for reading"
+msgstr ""
+
+#: solo_control.cc:199
+msgid "Cleared Explicit solo: %1\n"
+msgstr ""
+
+#: solo_control.cc:202
+msgid "Cleared Implicit solo: %1 up:%2 down:%3\n"
+msgstr ""
+
 #: soundcloud_upload.cc:129
 msgid ""
 "Upload to Soundcloud failed.  Perhaps your email or password are incorrect?\n"
 msgstr ""
 
-#: source_factory.cc:374
+#: source_factory.cc:390
 msgid "Recovery attempted on a MIDI file - not implemented"
 msgstr ""
 
@@ -2446,7 +3096,7 @@ msgstr ""
 msgid "Speaker information is missing distance - speaker ignored"
 msgstr ""
 
-#: srcfilesource.cc:134
+#: srcfilesource.cc:142
 msgid "SrcFileSource: %1"
 msgstr ""
 
@@ -2454,104 +3104,134 @@ msgstr ""
 msgid "Cannot compile tape track regexp for use (%1)"
 msgstr ""
 
-#: tempo.cc:80
-msgid "TempoSection XML node has no \"start\" property"
+#: tempo.cc:98
+msgid "Legacy session detected. TempoSection XML node will be altered."
+msgstr ""
+
+#: tempo.cc:104
+msgid "TempoSection XML node has an illegal \"pulse\" value"
 msgstr ""
 
-#: tempo.cc:88
-msgid "TempoSection XML node has an illegal \"start\" value"
+#: tempo.cc:112
+msgid "TempoSection XML node has an illegal \"frame\" value"
 msgstr ""
 
-#: tempo.cc:95
+#: tempo.cc:119
 msgid "TempoSection XML node has no \"beats-per-minute\" property"
 msgstr ""
 
-#: tempo.cc:100
+#: tempo.cc:124
 msgid "TempoSection XML node has an illegal \"beats_per_minute\" value"
 msgstr ""
 
-#: tempo.cc:109
+#: tempo.cc:133
 msgid "TempoSection XML node has an illegal \"note-type\" value"
 msgstr ""
 
-#: tempo.cc:115
+#: tempo.cc:139
 msgid "TempoSection XML node has no \"movable\" property"
 msgstr ""
 
-#: tempo.cc:125
-msgid "TempoSection XML node has an illegal \"bar-offset\" value"
+#: tempo.cc:146
+msgid "TempoSection XML node has no \"active\" property"
 msgstr ""
 
-#: tempo.cc:202
-msgid "MeterSection XML node has no \"start\" property"
+#: tempo.cc:471
+msgid "MeterSection XML node has an illegal \"start\" value"
 msgstr ""
 
-#: tempo.cc:210
-msgid "MeterSection XML node has an illegal \"start\" value"
+#: tempo.cc:474
+msgid "Legacy session detected - MeterSection XML node will be altered."
+msgstr ""
+
+#: tempo.cc:481
+msgid "MeterSection XML node has an illegal \"pulse\" value"
+msgstr ""
+
+#: tempo.cc:488
+msgid "MeterSection XML node has an illegal \"beat\" value"
+msgstr ""
+
+#: tempo.cc:495
+msgid "MeterSection XML node has no \"bbt\" property"
 msgstr ""
 
-#: tempo.cc:220
+#: tempo.cc:500
+msgid "MeterSection XML node has an illegal \"bbt\" value"
+msgstr ""
+
+#: tempo.cc:509
+msgid "MeterSection XML node has an illegal \"frame\" value"
+msgstr ""
+
+#: tempo.cc:519
 msgid ""
 "MeterSection XML node has no \"beats-per-bar\" or \"divisions-per-bar\" "
 "property"
 msgstr ""
 
-#: tempo.cc:226
-msgid ""
-"MeterSection XML node has an illegal \"beats-per-bar\" or \"divisions-per-bar"
-"\" value"
+#: tempo.cc:524
+msgid "MeterSection XML node has an illegal \"divisions-per-bar\" value"
 msgstr ""
 
-#: tempo.cc:231
+#: tempo.cc:529
 msgid "MeterSection XML node has no \"note-type\" property"
 msgstr ""
 
-#: tempo.cc:236
+#: tempo.cc:533
 msgid "MeterSection XML node has an illegal \"note-type\" value"
 msgstr ""
 
-#: tempo.cc:241
+#: tempo.cc:538
 msgid "MeterSection XML node has no \"movable\" property"
 msgstr ""
 
-#: tempo.cc:402
+#: tempo.cc:545
+msgid "MeterSection XML node has no \"lock-style\" property"
+msgstr ""
+
+#: tempo.cc:821
 msgid ""
 "Meter changes can only be positioned on the first beat of a bar. Moving from "
 "%1 to %2"
 msgstr ""
 
-#: tempo.cc:682
+#: tempo.cc:1156
 msgid "no tempo sections defined in tempo map - cannot change tempo @ %1"
 msgstr ""
 
-#: tempo.cc:712 tempo.cc:730 tempo.cc:748 tempo.cc:764
-msgid "programming error: no tempo section in tempo map!"
+#: tempo.cc:1186
+msgid "programming error: no meter section in tempo map!"
 msgstr ""
 
-#: tempo.cc:882 tempo.cc:1863
-msgid "programming error: unhandled MetricSection type"
+#: tempo.cc:1204 tempo.cc:1227 tempo.cc:1248
+msgid "programming error: no tempo section in tempo map!"
 msgstr ""
 
-#: tempo.cc:1178
+#: tempo.cc:1959 tempo.cc:1987
 msgid "tempo map asked for BBT time at frame %1\n"
 msgstr ""
 
-#: tempo.cc:1221
+#: tempo.cc:2054
 msgid "tempo map asked for frame time at bar < 1  (%1)\n"
 msgstr ""
 
-#: tempo.cc:1678 tempo.cc:1692
+#: tempo.cc:3472 tempo.cc:3485
 msgid "Tempo map: could not set new state, restoring old one."
 msgstr ""
 
-#: tempo.cc:1713
+#: tempo.cc:3522 tempo.cc:3523
 msgid "Multiple meter definitions found at %1"
 msgstr ""
 
-#: tempo.cc:1718
+#: tempo.cc:3528 tempo.cc:3529
 msgid "Multiple tempo definitions found at %1"
 msgstr ""
 
+#: tempo.cc:3715
+msgid "programming error: unhandled MetricSection type"
+msgstr ""
+
 #: tempo_map_importer.cc:52
 msgid "Tempo map"
 msgstr ""
@@ -2576,6 +3256,14 @@ msgid ""
 "Are you sure you want to do this?"
 msgstr ""
 
+#: unknown_processor.cc:86
+msgid "Using plugin-stub with unknown i/o configuration for: "
+msgstr ""
+
+#: unknown_processor.cc:107
+msgid "Using plugin-stub with mismatching i/o configuration for: "
+msgstr ""
+
 #: user_bundle.cc:47
 msgid "Node for Bundle has no \"name\" property"
 msgstr ""
@@ -2597,58 +3285,95 @@ msgstr ""
 msgid "Node for Port has no \"name\" property"
 msgstr ""
 
-#: utils.cc:422 utils.cc:451
+#: utils.cc:412 utils.cc:441
 msgid "Splice"
 msgstr ""
 
-#: utils.cc:424 utils.cc:441
+#: utils.cc:414 utils.cc:431
 msgid "Slide"
 msgstr ""
 
-#: utils.cc:426 utils.cc:447
+#: utils.cc:416 utils.cc:437
 msgid "Ripple"
 msgstr ""
 
-#: utils.cc:428 utils.cc:444
+#: utils.cc:418 utils.cc:434
 msgid "Lock"
 msgstr ""
 
-#: utils.cc:431
+#: utils.cc:421
 msgid "programming error: unknown edit mode string \"%1\""
 msgstr ""
 
-#: utils.cc:458 utils.cc:490
+#: utils.cc:448 utils.cc:484
 msgid "MIDI Timecode"
 msgstr ""
 
-#: utils.cc:458 utils.cc:488
+#: utils.cc:448 utils.cc:482
 msgid "MTC"
 msgstr ""
 
-#: utils.cc:462 utils.cc:497
+#: utils.cc:452 utils.cc:491
 msgid "MIDI Clock"
 msgstr ""
 
-#: utils.cc:466 utils.cc:484 utils.cc:504
+#: utils.cc:456 utils.cc:478 utils.cc:498
 msgid "JACK"
 msgstr ""
 
-#: utils.cc:470
-msgid "programming error: unknown sync source string \"%1\""
+#: utils.cc:460 utils.cc:495
+msgid "LTC"
 msgstr ""
 
-#: utils.cc:495
-msgid "M-Clock"
+#: utils.cc:464
+msgid "programming error: unknown sync source string \"%1\""
 msgstr ""
 
-#: utils.cc:501
-msgid "LTC"
+#: utils.cc:489
+msgid "M-Clock"
 msgstr ""
 
-#: utils.cc:671
+#: utils.cc:658
 msgid "programming error: unknown native header format: %1"
 msgstr ""
 
-#: utils.cc:686
+#: utils.cc:673
 msgid "cannot open directory %1 (%2)"
 msgstr ""
+
+#: vca.cc:43
+#, c-format
+msgid "VCA %n"
+msgstr ""
+
+#: vca_manager.cc:166
+msgid "Cannot set state of a VCA"
+msgstr ""
+
+#~ msgid ""
+#~ "You have requested an operation that requires audio analysis.\n"
+#~ "\n"
+#~ "You currently have \"auto-analyse-audio\" disabled, which means that "
+#~ "transient data must be generated every time it is required.\n"
+#~ "\n"
+#~ "If you are doing work that will require transient data on a regular "
+#~ "basis, you should probably enable \"auto-analyse-audio\" then quit %1 and "
+#~ "restart.\n"
+#~ "\n"
+#~ "This dialog will not display again.  But you may notice a slight delay in "
+#~ "this and future transient-detection operations.\n"
+#~ msgstr ""
+#~ "You have requested an operation that requires audio analysis.\n"
+#~ "\n"
+#~ "You currently have \"auto-analyse-audio\" disabled, which means that "
+#~ "transient data must be generated every time it is required.\n"
+#~ "\n"
+#~ "If you are doing work that will require transient data on a regular "
+#~ "basis, you should probably enable \"auto-analyse-audio\" then quit %1 and "
+#~ "restart.\n"
+#~ "\n"
+#~ "This dialogue will not display again.  But you may notice a slight delay "
+#~ "in this and future transient-detection operations.\n"
+
+#~ msgid "normalize"
+#~ msgstr "normalise"
diff --git a/libs/ardour/po/es.mo b/libs/ardour/po/es.mo
new file mode 100644
index 0000000..7ce0bcd
Binary files /dev/null and b/libs/ardour/po/es.mo differ
diff --git a/libs/ardour/po/es.po b/libs/ardour/po/es.po
index b43f81f..92d15e5 100644
--- a/libs/ardour/po/es.po
+++ b/libs/ardour/po/es.po
@@ -2,7 +2,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: libardour\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-03-31 20:13-0400\n"
+"POT-Creation-Date: 2015-03-15 11:50+0100\n"
 "PO-Revision-Date: 2015-03-15 \n"
 "Last-Translator: Pablo Fernández <pablo.fbus at gmail.com>\n"
 "Language-Team: \n"
@@ -17,14 +17,6 @@ msgstr ""
 msgid "Fader"
 msgstr ""
 
-#: analyser.cc:117 audioregion.cc:1729
-msgid "Transient Analysis failed for %1."
-msgstr ""
-
-#: analyser.cc:117
-msgid "Audio File Source"
-msgstr ""
-
 #: audio_diskstream.cc:249
 msgid "AudioDiskstream: Playlist \"%1\" isn't an audio playlist"
 msgstr ""
@@ -72,7 +64,7 @@ msgstr "error de programador: %1"
 msgid "AudioDiskstream: channel %1 out of range"
 msgstr "AudioDiskstream: canal %1 fuera de rango"
 
-#: audio_diskstream.cc:1935 midi_diskstream.cc:1274
+#: audio_diskstream.cc:1935 midi_diskstream.cc:1297
 msgid "%1:%2 new capture file not initialized correctly"
 msgstr "%1:%2 archivo de captura nuevo no inicializado correctamente"
 
@@ -131,10 +123,11 @@ msgstr ""
 msgid "Audio Playlists (unused)"
 msgstr ""
 
-#: audio_playlist_source.cc:171 audiosource.cc:963 midi_playlist_source.cc:147
-#: midi_playlist_source.cc:155 midi_playlist_source.cc:162 midi_source.cc:356
-#: plugin_insert.cc:641 rb_effect.cc:327 session.cc:2845 session.cc:2878
-#: session.cc:4124 session_handle.cc:87 sndfilesource.cc:154
+#: audio_playlist_source.cc:171 audiosource.cc:1046
+#: midi_playlist_source.cc:147 midi_playlist_source.cc:155
+#: midi_playlist_source.cc:162 midi_source.cc:403 plugin_insert.cc:1259
+#: rb_effect.cc:327 session.cc:5314 session.cc:5341 session.cc:5461
+#: session_handle.cc:88 sndfilesource.cc:173
 msgid "programming error: %1"
 msgstr "error de programación: %1"
 
@@ -202,19 +195,19 @@ msgstr "no se puede cargar el plugin VAMP \"%1\""
 msgid "VAMP Plugin \"%1\" could not be loaded"
 msgstr "el plugin VAMP \"%1\" no pudo ser cargado"
 
-#: audioengine.cc:696
+#: audioengine.cc:756
 msgid "AudioEngine: cannot load module \"%1\" (%2)"
 msgstr ""
 
-#: audioengine.cc:702
+#: audioengine.cc:762
 msgid "AudioEngine: backend at \"%1\" has no descriptor function."
 msgstr ""
 
-#: audioengine.cc:779
+#: audioengine.cc:841
 msgid "Could not create backend for %1: %2"
 msgstr ""
 
-#: audioregion.cc:1685
+#: audioregion.cc:1757
 msgid ""
 "You have requested an operation that requires audio analysis.\n"
 "\n"
@@ -222,106 +215,103 @@ msgid ""
 "transient data must be generated every time it is required.\n"
 "\n"
 "If you are doing work that will require transient data on a regular basis, "
-"you should probably enable \"auto-analyse-audio\" then quit %1 and restart.\n"
+"you should probably enable \"auto-analyse-audio\" in Preferences > Audio > "
+"Regions, then quit %1 and restart.\n"
 "\n"
 "This dialog will not display again.  But you may notice a slight delay in "
 "this and future transient-detection operations.\n"
 msgstr ""
 
-#: audioregion.cc:1729
-msgid "Audio Region"
-msgstr ""
-
 #: audiosource.cc:228
 msgid "cannot rename peakfile for %1 from %2 to %3 (%4)"
 msgstr ""
 
-#: audiosource.cc:257
+#: audiosource.cc:262
 msgid "AudioSource: cannot stat peakfile \"%1\""
 msgstr ""
 
-#: audiosource.cc:361
+#: audiosource.cc:367
 msgid "Cannot open peakfile @ %1 for reading (%2)"
 msgstr ""
 
-#: audiosource.cc:394
+#: audiosource.cc:438
 msgid "cannot read sample data for unscaled peak computation"
 msgstr ""
 
-#: audiosource.cc:430 audiosource.cc:525
+#: audiosource.cc:473 audiosource.cc:568
 msgid "map failed - could not create file mapping for peakfile %1."
 msgstr ""
 
-#: audiosource.cc:436 audiosource.cc:531
+#: audiosource.cc:479 audiosource.cc:574
 msgid "map failed - could not map peakfile %1."
 msgstr ""
 
-#: audiosource.cc:447 audiosource.cc:542
+#: audiosource.cc:490 audiosource.cc:585
 msgid "unmap failed - could not unmap peakfile %1."
 msgstr ""
 
-#: audiosource.cc:453 audiosource.cc:548
+#: audiosource.cc:496 audiosource.cc:591
 msgid "map failed - could not mmap peakfile %1."
 msgstr ""
 
-#: audiosource.cc:638
+#: audiosource.cc:681
 msgid ""
 "AudioSource[%1]: peak read - cannot read %2 samples at offset %3 of %4 (%5)"
 msgstr ""
 
-#: audiosource.cc:705
+#: audiosource.cc:748
 msgid "%1: could not write read raw data for peak computation (%2)"
 msgstr ""
 
-#: audiosource.cc:742
+#: audiosource.cc:748
 msgid "AudioSource: cannot open peakpath (c) \"%1\" (%2)"
 msgstr ""
 
-#: audiosource.cc:811 audiosource.cc:933
+#: audiosource.cc:894 audiosource.cc:1016
 msgid "%1: could not seek in peak file data (%2)"
 msgstr ""
 
-#: audiosource.cc:816 audiosource.cc:942
+#: audiosource.cc:899 audiosource.cc:1025
 msgid "%1: could not write peak file data (%2)"
 msgstr ""
 
-#: audiosource.cc:975
+#: audiosource.cc:1058
 msgid "could not truncate peakfile %1 to %2 (error: %3)"
 msgstr ""
 
-#: auditioner.cc:100
+#: auditioner.cc:105
 msgid "Falling back to Reasonable Synth for Midi Audition"
 msgstr ""
 
-#: auditioner.cc:102
+#: auditioner.cc:107
 msgid "No synth for midi-audition found."
 msgstr ""
 
-#: auditioner.cc:158
+#: auditioner.cc:163
 msgid "no outputs available for auditioner - manual connection required"
 msgstr "No hay salidas disponibles para Audición - se requiere conexión manual"
 
-#: auditioner.cc:399 auditioner.cc:446
+#: auditioner.cc:408 auditioner.cc:455
 msgid "Cannot setup auditioner processing flow for %1 channels"
 msgstr ""
 
-#: auditioner.cc:434
+#: auditioner.cc:443
 msgid "Failed to load synth for MIDI-Audition."
 msgstr ""
 
-#: auditioner.cc:453
+#: auditioner.cc:462
 msgid "Auditioning of regions other than Audio or Midi is not supported."
 msgstr ""
 
-#: automatable.cc:84
+#: automatable.cc:87
 msgid "Automation node has no path property"
 msgstr ""
 
-#: automatable.cc:104
+#: automatable.cc:108
 msgid "cannot open %2 to load automation data (%3)"
 msgstr ""
 
-#: automatable.cc:132
+#: automatable.cc:140
 msgid "cannot load automation data from %2"
 msgstr ""
 
@@ -335,66 +325,66 @@ msgstr ""
 "Lista de automatización: No se pudieron cargar las coordenadas de XML, se "
 "han ignorado todos los puntos"
 
-#: automation_list.cc:402
+#: automation_list.cc:456
 msgid ""
 "automation list: no x-coordinate stored for control point (point ignored)"
 msgstr ""
 "Lista de automatización: No hay coordenada 'X' almacenada para el punto de "
 "control (punto ignorado)"
 
-#: automation_list.cc:408
+#: automation_list.cc:462
 msgid ""
 "automation list: no y-coordinate stored for control point (point ignored)"
 msgstr ""
 "Lista de automatización: No hay coordenada 'Y' almacenada para el punto de "
 "control (punto ignorado)"
 
-#: automation_list.cc:422
+#: automation_list.cc:476
 msgid ""
 "AutomationList: passed XML node called %1, not \"AutomationList\" - ignored"
 msgstr ""
 
-#: butler.cc:100
+#: butler.cc:126
 msgid "Session: could not create butler thread"
 msgstr ""
 
-#: butler.cc:222 butler.cc:223
+#: butler.cc:254 butler.cc:255
 msgid "Butler read ahead failure on dstream %1"
 msgstr ""
 
-#: butler.cc:270 butler.cc:271
+#: butler.cc:344 butler.cc:345 butler.cc:393 butler.cc:394
 msgid "Butler write-behind failure on dstream %1"
 msgstr ""
 
-#: control_protocol_manager.cc:164
+#: control_protocol_manager.cc:174
 msgid "control protocol name \"%1\" has no descriptor"
 msgstr "control protocol name \"%1\" has no descriptor"
 
-#: control_protocol_manager.cc:171
+#: control_protocol_manager.cc:181
 msgid "control protocol name \"%1\" could not be initialized"
 msgstr "El protocolo de control de nombre \"%1\" no se pudo inicializar"
 
-#: control_protocol_manager.cc:237
+#: control_protocol_manager.cc:265
 msgid "Instantiating mandatory control protocol %1"
 msgstr ""
 
-#: control_protocol_manager.cc:281
+#: control_protocol_manager.cc:309
 msgid "looking for control protocols in %1\n"
 msgstr "buscando protocolos de control en %1\n"
 
-#: control_protocol_manager.cc:306
+#: control_protocol_manager.cc:334
 msgid "Control protocol %1 not usable"
 msgstr "Protocolo de control %1 no usable."
 
-#: control_protocol_manager.cc:323
+#: control_protocol_manager.cc:351
 msgid "Control surface protocol discovered: \"%1\"\n"
 msgstr ""
 
-#: control_protocol_manager.cc:341
+#: control_protocol_manager.cc:367
 msgid "ControlProtocolManager: cannot load module \"%1\" (%2)"
 msgstr ""
 
-#: control_protocol_manager.cc:347
+#: control_protocol_manager.cc:373
 msgid "ControlProtocolManager: module \"%1\" has no descriptor function."
 msgstr ""
 
@@ -414,7 +404,7 @@ msgstr ""
 msgid "audio"
 msgstr ""
 
-#: data_type.cc:28 session.cc:1995 session.cc:1998
+#: data_type.cc:28 session.cc:2452
 msgid "MIDI"
 msgstr ""
 
@@ -426,11 +416,11 @@ msgstr "desconocido"
 msgid "main outs"
 msgstr ""
 
-#: delivery.cc:121 send.cc:63
+#: delivery.cc:121 send.cc:64
 msgid "listen"
 msgstr ""
 
-#: diskstream.cc:309
+#: diskstream.cc:311
 msgid "Location \"%1\" not valid for track loop (start >= end)"
 msgstr ""
 "La localización \"%1\" no es válida para bucle de pista (inicio >= fin)"
@@ -443,23 +433,23 @@ msgstr ""
 msgid "Export failed: %1"
 msgstr ""
 
-#: export_filename.cc:126
+#: export_filename.cc:128
 msgid "Existing export folder for this session (%1) does not exist - ignored"
 msgstr ""
 
-#: export_filename.cc:242
+#: export_filename.cc:263
 msgid "No Time"
 msgstr ""
 
-#: export_filename.cc:251
+#: export_filename.cc:272
 msgid "Invalid time format"
 msgstr ""
 
-#: export_filename.cc:260
+#: export_filename.cc:281
 msgid "No Date"
 msgstr ""
 
-#: export_filename.cc:275
+#: export_filename.cc:296
 msgid "Invalid date format"
 msgstr ""
 
@@ -527,7 +517,7 @@ msgstr ""
 msgid "Rectangular"
 msgstr ""
 
-#: export_formats.cc:52 session.cc:5421 session.cc:5437
+#: export_formats.cc:52 session.cc:5420 session.cc:5436
 msgid "None"
 msgstr ""
 
@@ -584,7 +574,7 @@ msgstr ""
 msgid "an error occured while writing a TOC/CUE file: %1"
 msgstr ""
 
-#: export_handler.cc:744 export_handler.cc:802
+#: export_handler.cc:717 export_handler.cc:775
 msgid "Cannot convert %1 to Latin-1 text"
 msgstr ""
 
@@ -754,23 +744,23 @@ msgstr ""
 msgid "unknown file type for session %1"
 msgstr "tipo de archivo desconocido para la sesión %1"
 
-#: globals.cc:234
+#: globals.cc:232
 msgid "Could not set system open files limit to \"unlimited\""
 msgstr "No se pudo establecer el límite de archivos abiertos a \"unlimited\""
 
-#: globals.cc:236
+#: globals.cc:234
 msgid "Could not set system open files limit to %1"
 msgstr "No se pudo establecer el límite de archivos abiertos a \"unlimited\""
 
-#: globals.cc:240
+#: globals.cc:238
 msgid "Your system is configured to limit %1 to only %2 open files"
 msgstr ""
 
-#: globals.cc:244
+#: globals.cc:242
 msgid "Could not get system open files limit (%1)"
 msgstr "No se pudo obtener el límite de archivos abiertos del sistema (%1) "
 
-#: globals.cc:415
+#: globals.cc:396
 msgid "Loading configuration"
 msgstr "Cargando configuración"
 
@@ -1016,7 +1006,7 @@ msgstr ""
 msgid "incorrect XML mode passed to Locations::set_state"
 msgstr ""
 
-#: location.cc:1047 session.cc:1293 session.cc:4919 session_state.cc:1053
+#: location.cc:1047 session.cc:1293 session.cc:4918 session_state.cc:1053
 msgid "session"
 msgstr "sesión"
 
@@ -1089,23 +1079,23 @@ msgstr ""
 msgid "MidiDiskstream %1: there is no existing playlist to make a copy of!"
 msgstr ""
 
-#: midi_diskstream.cc:754
+#: midi_diskstream.cc:777
 msgid "MidiDiskstream %1: cannot read %2 from playlist at frame %3"
 msgstr ""
 
-#: midi_diskstream.cc:891
+#: midi_diskstream.cc:914
 msgid "MidiDiskstream %1: cannot write to disk"
 msgstr ""
 
-#: midi_diskstream.cc:925
+#: midi_diskstream.cc:948
 msgid "MidiDiskstream \"%1\": cannot flush captured data to disk!"
 msgstr ""
 
-#: midi_diskstream.cc:1014
+#: midi_diskstream.cc:1037
 msgid "%1: could not create region for complete midi file"
 msgstr ""
 
-#: midi_diskstream.cc:1055
+#: midi_diskstream.cc:1078
 msgid "MidiDiskstream: could not create region for captured midi!"
 msgstr ""
 
@@ -1137,19 +1127,19 @@ msgstr ""
 msgid "Scene "
 msgstr ""
 
-#: midi_source.cc:125
+#: midi_source.cc:124
 msgid "Missing parameter property on InterpolationStyle"
 msgstr ""
 
-#: midi_source.cc:131
+#: midi_source.cc:130
 msgid "Missing style property on InterpolationStyle"
 msgstr ""
 
-#: midi_source.cc:140
+#: midi_source.cc:139
 msgid "Missing parameter property on AutomationState"
 msgstr ""
 
-#: midi_source.cc:146
+#: midi_source.cc:145
 msgid "Missing state property on AutomationState"
 msgstr ""
 
@@ -1327,7 +1317,7 @@ msgid ""
 "full version"
 msgstr ""
 
-#: plugin.cc:403
+#: plugin.cc:402
 msgid ""
 "Saving plugin settings is not supported in this build of %1. Consider paying "
 "for the full version"
@@ -1767,39 +1757,39 @@ msgstr "Sesión: No se pudo crear la nueva ruta desde plantilla"
 msgid "Adding new tracks/busses failed"
 msgstr ""
 
-#: session.cc:3671
+#: session.cc:3670
 msgid "Merging embedded file %1: name collision AND md5 hash collision!"
 msgstr ""
 
-#: session.cc:3801 session.cc:3874
+#: session.cc:3800 session.cc:3873
 msgid "There are already %1 recordings for %2, which I consider too many."
 msgstr ""
 
-#: session.cc:4316
+#: session.cc:4315
 msgid "send ID %1 appears to be in use already"
 msgstr ""
 
-#: session.cc:4328
+#: session.cc:4327
 msgid "aux send ID %1 appears to be in use already"
 msgstr ""
 
-#: session.cc:4340
+#: session.cc:4339
 msgid "return ID %1 appears to be in use already"
 msgstr ""
 
-#: session.cc:4352
+#: session.cc:4351
 msgid "insert ID %1 appears to be in use already"
 msgstr ""
 
-#: session.cc:4477
+#: session.cc:4476
 msgid "Cannot write a range where end <= start (e.g. %1 <= %2)"
 msgstr ""
 
-#: session.cc:4486
+#: session.cc:4485
 msgid "Cannot write a range with no data."
 msgstr ""
 
-#: session.cc:4528
+#: session.cc:4527
 msgid "cannot create new file \"%1\" for %2"
 msgstr ""
 
@@ -2257,28 +2247,28 @@ msgid ""
 "control"
 msgstr ""
 
-#: smf_source.cc:344
+#: smf_source.cc:340
 msgid "Unable to read event prefix, corrupt MIDI ring"
 msgstr ""
 
-#: smf_source.cc:357
+#: smf_source.cc:353
 msgid "Event has time and size but no body, corrupt MIDI ring"
 msgstr ""
 
-#: smf_source.cc:363
+#: smf_source.cc:359
 msgid "Event time is before MIDI source position"
 msgstr ""
 
-#: smf_source.cc:409
+#: smf_source.cc:405
 msgid ""
 "Skipping event with unordered beat time %1 < %2 (off by %3 beats, %4 ticks)"
 msgstr ""
 
-#: smf_source.cc:453
+#: smf_source.cc:449
 msgid "Skipping event with unordered frame time %1 < %2"
 msgstr ""
 
-#: smf_source.cc:518
+#: smf_source.cc:514
 msgid "cannot open MIDI file %1 for write"
 msgstr ""
 
@@ -2471,101 +2461,101 @@ msgstr ""
 msgid "Cannot compile tape track regexp for use (%1)"
 msgstr ""
 
-#: tempo.cc:80
+#: tempo.cc:79
 msgid "TempoSection XML node has no \"start\" property"
 msgstr ""
 
-#: tempo.cc:88
+#: tempo.cc:87
 msgid "TempoSection XML node has an illegal \"start\" value"
 msgstr ""
 
-#: tempo.cc:95
+#: tempo.cc:94
 msgid "TempoSection XML node has no \"beats-per-minute\" property"
 msgstr ""
 
-#: tempo.cc:100
+#: tempo.cc:99
 msgid "TempoSection XML node has an illegal \"beats_per_minute\" value"
 msgstr ""
 
-#: tempo.cc:109
+#: tempo.cc:108
 msgid "TempoSection XML node has an illegal \"note-type\" value"
 msgstr ""
 
-#: tempo.cc:115
+#: tempo.cc:114
 msgid "TempoSection XML node has no \"movable\" property"
 msgstr ""
 
-#: tempo.cc:125
+#: tempo.cc:124
 msgid "TempoSection XML node has an illegal \"bar-offset\" value"
 msgstr ""
 
-#: tempo.cc:202
+#: tempo.cc:201
 msgid "MeterSection XML node has no \"start\" property"
 msgstr ""
 
-#: tempo.cc:210
+#: tempo.cc:209
 msgid "MeterSection XML node has an illegal \"start\" value"
 msgstr ""
 
-#: tempo.cc:220
+#: tempo.cc:219
 msgid ""
 "MeterSection XML node has no \"beats-per-bar\" or \"divisions-per-bar\" "
 "property"
 msgstr ""
 
-#: tempo.cc:226
+#: tempo.cc:225
 msgid ""
 "MeterSection XML node has an illegal \"beats-per-bar\" or \"divisions-per-bar"
 "\" value"
 msgstr ""
 
-#: tempo.cc:231
+#: tempo.cc:230
 msgid "MeterSection XML node has no \"note-type\" property"
 msgstr ""
 
-#: tempo.cc:236
+#: tempo.cc:235
 msgid "MeterSection XML node has an illegal \"note-type\" value"
 msgstr ""
 
-#: tempo.cc:241
+#: tempo.cc:240
 msgid "MeterSection XML node has no \"movable\" property"
 msgstr ""
 
-#: tempo.cc:388
+#: tempo.cc:387
 msgid ""
 "Meter changes can only be positioned on the first beat of a bar. Moving from "
 "%1 to %2"
 msgstr ""
 
-#: tempo.cc:650
+#: tempo.cc:649
 msgid "no tempo sections defined in tempo map - cannot change tempo @ %1"
 msgstr ""
 
-#: tempo.cc:680 tempo.cc:696 tempo.cc:712 tempo.cc:728
+#: tempo.cc:679 tempo.cc:695 tempo.cc:711 tempo.cc:727
 msgid "programming error: no tempo section in tempo map!"
 msgstr ""
 
-#: tempo.cc:846 tempo.cc:1827
+#: tempo.cc:845 tempo.cc:1826
 msgid "programming error: unhandled MetricSection type"
 msgstr ""
 
-#: tempo.cc:1142
+#: tempo.cc:1141
 msgid "tempo map asked for BBT time at frame %1\n"
 msgstr ""
 
-#: tempo.cc:1185
+#: tempo.cc:1184
 msgid "tempo map asked for frame time at bar < 1  (%1)\n"
 msgstr ""
 
-#: tempo.cc:1642 tempo.cc:1656
+#: tempo.cc:1641 tempo.cc:1655
 msgid "Tempo map: could not set new state, restoring old one."
 msgstr ""
 
-#: tempo.cc:1677
+#: tempo.cc:1676
 msgid "Multiple meter definitions found at %1"
 msgstr ""
 
-#: tempo.cc:1682
+#: tempo.cc:1681
 msgid "Multiple tempo definitions found at %1"
 msgstr ""
 
diff --git a/libs/ardour/po/fr.mo b/libs/ardour/po/fr.mo
new file mode 100644
index 0000000..95cbbe1
Binary files /dev/null and b/libs/ardour/po/fr.mo differ
diff --git a/libs/ardour/po/fr.po b/libs/ardour/po/fr.po
index 507c2c7..09a8a5d 100644
--- a/libs/ardour/po/fr.po
+++ b/libs/ardour/po/fr.po
@@ -1,106 +1,260 @@
 # Copyright (C) YEAR "Paul Davis"
 # This file is distributed under the same license as the PACKAGE package.
 # Fred Rech <f.rech at yahoo.fr>, 2014.
+# Raphaël Doursenaud <rdoursenaud at free.fr>, 2015
+# Julien Rivaud <frnchfrgg at free.fr>, 2016
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: libardour 3\n"
+"Project-Id-Version: libardour 5\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-03-31 20:13-0400\n"
-"PO-Revision-Date: 2015-03-28 20:54+0100\n"
-"Last-Translator: Raphaël Doursenaud <rdoursenaud at free.fr>\n"
+"POT-Creation-Date: 2016-07-14 06:20-0400\n"
+"PO-Revision-Date: 2016-07-29 21:22+0200\n"
+"Last-Translator: Julien Rivaud <frnchfrgg at free.fr>\n"
 "Language-Team: \n"
 "Language: fr\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n > 1);\n"
-"X-Generator: Poedit 1.7.4\n"
+"X-Generator: Poedit 1.8.8\n"
 "X-Poedit-SourceCharset: UTF-8\n"
-"X-Poedit-Basepath: ../\n"
+"X-Poedit-Basepath: ..\n"
 
-#: amp.cc:57 automatable.cc:165
-#, fuzzy
-msgid "Fader"
-msgstr "Atténuateur"
+#: amp.cc:412
+#, c-format
+msgid "%.2fdB"
+msgstr "%.2f dB"
 
-#: analyser.cc:117 audioregion.cc:1729
+#: analyser.cc:121 audioregion.cc:1789
 msgid "Transient Analysis failed for %1."
-msgstr ""
+msgstr "La recherche des transitoires a échoué pour %1."
 
-#: analyser.cc:117
+#: analyser.cc:121
 msgid "Audio File Source"
-msgstr ""
+msgstr "le fichier source audio"
+
+#: analysis_graph.cc:136
+msgid "%1 (%2..%3)"
+msgstr "%1 (%2..%3)"
+
+#: audio_backend.cc:31
+msgid "No Error occurred"
+msgstr "Aucune erreur"
+
+#: audio_backend.cc:33
+msgid "Failed to initialize audio backend"
+msgstr "L'initialisation du moteur audio a échoué"
+
+#: audio_backend.cc:35
+msgid "Failed to deinitialize audio backend"
+msgstr "L'arrêt du moteur audio a échoué"
+
+#: audio_backend.cc:37
+msgid "Failed to reinitialize audio backend"
+msgstr "La réinitialisation du moteur audio a échoué"
+
+#: audio_backend.cc:39
+msgid "Failed to open audio device"
+msgstr "L'ouverture du périphérique audio a échoué"
+
+#: audio_backend.cc:41
+msgid "Failed to close audio device"
+msgstr "La fermeture du périphérique audio a échoué"
+
+#: audio_backend.cc:43
+msgid "Audio device not valid"
+msgstr "Le périphérique audio n'est pas valide"
+
+#: audio_backend.cc:45
+msgid "Audio device unavailable"
+msgstr "Le périphérique audio n'est pas disponible"
+
+#: audio_backend.cc:47
+msgid "Audio device not connected"
+msgstr "Le périphérique audio n'est pas connecté"
+
+#: audio_backend.cc:49
+msgid "Failed to request and reserve audio device"
+msgstr "La réservation du périphérique audio a échoué"
+
+#: audio_backend.cc:51
+msgid "Audio device Input/Output error"
+msgstr "Erreur d'entrée/sortie du périphérique audio"
+
+#: audio_backend.cc:53
+msgid "Failed to open MIDI device"
+msgstr "L'ouverture du périphérique MIDI a échoué"
+
+#: audio_backend.cc:55
+msgid "Failed to close MIDI device"
+msgstr "La fermeture du périphérique MIDI a échoué."
+
+#: audio_backend.cc:57
+msgid "MIDI device unavailable"
+msgstr "Le périphérique MIDI n'est pas disponible"
+
+#: audio_backend.cc:59
+msgid "MIDI device not connected"
+msgstr "Le périphérique MIDI n'est pas connecté"
+
+#: audio_backend.cc:61
+msgid "MIDI device Input/Output error"
+msgstr "Erreur d'entrée/sortie du périphérique MIDI"
+
+#: audio_backend.cc:63
+msgid "Sample format is not supported"
+msgstr "Le format d'échantillon n'est pas supporté"
+
+#: audio_backend.cc:65
+msgid "Sample rate is not supported"
+msgstr "Le taux d'échantillonnage n'est pas supporté"
+
+#: audio_backend.cc:67
+msgid "Requested input latency is not supported"
+msgstr "La latence d'entrée demandée n'est pas supportée"
+
+#: audio_backend.cc:69
+msgid "Requested output latency is not supported"
+msgstr "La latence de sortie demandée n'est pas supportée"
+
+#: audio_backend.cc:71
+msgid "Period size is not supported"
+msgstr "Cette longueur de période n'est pas supportée"
 
-#: audio_diskstream.cc:249
+#: audio_backend.cc:73
+msgid "Period count is not supported"
+msgstr "Ce nombre de périodes n'est pas supporté"
+
+#: audio_backend.cc:75
+msgid "Device configuration not supported"
+msgstr "Cette configuration de périphérique(s) n'est pas supportée"
+
+#: audio_backend.cc:77
+msgid "Channel count configuration not supported"
+msgstr "Ce nombre de canaux n'est pas supporté"
+
+#: audio_backend.cc:79
+msgid "Input channel count configuration not supported"
+msgstr "Ce nombre de canaux n'est pas supporté en entrée"
+
+#: audio_backend.cc:81
+msgid "Output channel count configuration not supported"
+msgstr "Ce nombre de canaux n'est pas supporté en sortie"
+
+#: audio_backend.cc:83
+msgid "Unable to aquire realtime permissions"
+msgstr "Impossible d'obtenir les permissions temps-réel"
+
+#: audio_backend.cc:85
+msgid "Setting audio device thread priorities failed"
+msgstr "Le réglage des priorités de la tâche « périphérique audio » a échoué"
+
+#: audio_backend.cc:87
+msgid "Setting MIDI device thread priorities failed"
+msgstr "Le réglage des priorités de la tâche « périphérique MIDI » a échoué"
+
+#: audio_backend.cc:89
+msgid "Failed to start process thread"
+msgstr "Le démarrage de la tâche de traitement a échoué"
+
+#: audio_backend.cc:91
+msgid "Failed to start freewheel thread"
+msgstr "Le démarrage de la tâche de débrayage a échoué"
+
+#: audio_backend.cc:93
+msgid "Failed to register audio/midi ports"
+msgstr "Impossible de réserver les ports audio/midi"
+
+#: audio_backend.cc:95
+msgid "Failed to re-connect audio/midi ports"
+msgstr "Impossible de reconnecter les ports audio/midi"
+
+#: audio_backend.cc:97
+msgid "Out Of Memory Error"
+msgstr "Erreur: plus de mémoire"
+
+#: audio_backend.cc:99
+msgid "Could not reconnect to Audio/MIDI engine"
+msgstr "Impossible de se reconnecter au moteur audio/MIDI"
+
+#: audio_backend.cc:107 export_formats.cc:52 session.cc:6772 session.cc:6792
+msgid "None"
+msgstr "Aucune"
+
+#: audio_backend.cc:109
+msgid "Default"
+msgstr "Par défaut"
+
+#: audio_diskstream.cc:257
 msgid "AudioDiskstream: Playlist \"%1\" isn't an audio playlist"
 msgstr ""
-"AudioDiskstream : la liste de lecture \"%1\" n'est pas une liste de lecture "
+"AudioDiskstream : la liste de lecture \"%1\" n'est pas une liste de lecture "
 "audio"
 
-#: audio_diskstream.cc:301
+#: audio_diskstream.cc:309
 msgid "AudioDiskstream %1: there is no existing playlist to make a copy of!"
-msgstr "AudioDiskstream %1 : aucune liste de lecture existante à copier !"
+msgstr "AudioDiskstream %1 : aucune liste de lecture existante à copier !"
 
-#: audio_diskstream.cc:861 audio_diskstream.cc:871
+#: audio_diskstream.cc:880 audio_diskstream.cc:890
 msgid ""
 "AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3"
 msgstr ""
-"AudioDiskstream %1 : en rechargeant, lecture impossible de %2 depuis la "
+"AudioDiskstream %1 : en rechargeant, lecture impossible de %2 depuis la "
 "liste de lecture à l'image %3"
 
-#: audio_diskstream.cc:1028
+#: audio_diskstream.cc:1053
 msgid "AudioDiskstream %1: cannot read %2 from playlist at frame %3"
 msgstr ""
-"AudioDiskstream %1 : lecture impossible de %2 depuis la  liste de lecture à "
+"AudioDiskstream %1 : lecture impossible de %2 depuis la  liste de lecture à "
 "l'image %3"
 
-#: audio_diskstream.cc:1397 audio_diskstream.cc:1416
+#: audio_diskstream.cc:1469 audio_diskstream.cc:1488
 msgid "AudioDiskstream %1: cannot write to disk"
-msgstr "AudioDiskstream %1 : écriture sur le disque impossible"
+msgstr "AudioDiskstream %1 : écriture sur le disque impossible"
 
-#: audio_diskstream.cc:1459
+#: audio_diskstream.cc:1531
 msgid "AudioDiskstream \"%1\": cannot flush captured data to disk!"
 msgstr ""
-"AudioDiskstream \"%1\" : transfert de la capture sur le disque impossible !"
+"AudioDiskstream \"%1\" : transfert de la capture sur le disque impossible !"
 
-#: audio_diskstream.cc:1553
+#: audio_diskstream.cc:1627
 msgid "%1: could not create region for complete audio file"
-msgstr "%1 : création de région pour le fichier audio complet impossible"
+msgstr "%1 : création de région pour le fichier audio complet impossible"
 
-#: audio_diskstream.cc:1585
+#: audio_diskstream.cc:1659
 msgid "AudioDiskstream: could not create region for captured audio!"
 msgstr "AudioDiskstream:  création de région pour l'audio capturé impossible !"
 
-#: audio_diskstream.cc:1693
+#: audio_diskstream.cc:1755
 msgid "programmer error: %1"
-msgstr ""
+msgstr "erreur de programmation : %1"
 
-#: audio_diskstream.cc:1921
+#: audio_diskstream.cc:2012
 msgid "AudioDiskstream: channel %1 out of range"
-msgstr "AudioDiskstream : canal %1 hors intervalle"
+msgstr "AudioDiskstream : canal %1 hors intervalle"
 
-#: audio_diskstream.cc:1935 midi_diskstream.cc:1274
+#: audio_diskstream.cc:2026 midi_diskstream.cc:1295
 msgid "%1:%2 new capture file not initialized correctly"
-msgstr "%1 : %2 nouveau fichier de capture mal initialisé"
+msgstr "%1 : %2 nouveau fichier de capture mal initialisé"
 
-#: audio_diskstream.cc:2214
+#: audio_diskstream.cc:2305
 msgid "%1: cannot restore pending capture source file %2"
-msgstr "%1 : reprise de la capture suspendue %2 impossible"
+msgstr "%1 : reprise de la capture suspendue %2 impossible"
 
-#: audio_diskstream.cc:2236
+#: audio_diskstream.cc:2327
 msgid "%1: incorrect number of pending sources listed - ignoring them all"
-msgstr "%1 : nombre de sources suspendues listées incorrect - tout ignorer"
+msgstr "%1 : nombre de sources suspendues listées incorrect - tout ignorer"
 
-#: audio_diskstream.cc:2270
+#: audio_diskstream.cc:2361
 msgid "%1: cannot create whole-file region from pending capture sources"
-msgstr "%1 : création de région unique pour les captures suspendues impossible"
+msgstr "%1 : création de région unique pour les captures suspendues impossible"
 
-#: audio_library.cc:81
+#: audio_library.cc:82
 msgid "Could not open %1.  Audio Library not saved"
 msgstr "Ouverture de %1 impossible. Librairie Audio non sauvegardée"
 
-#: audio_playlist.cc:504
+#: audio_playlist.cc:509
 msgid ""
 "Legacy crossfade involved an incoming region not present in playlist \"%1\" "
 "- crossfade discarded"
@@ -108,7 +262,7 @@ msgstr ""
 "Le fondu implique un début de région absent de la liste de lecture \"%1\" - "
 "fondu abandonné"
 
-#: audio_playlist.cc:520
+#: audio_playlist.cc:525
 msgid ""
 "Legacy crossfade involved an outgoing region not present in playlist \"%1\" "
 "- crossfade discarded"
@@ -134,17 +288,16 @@ msgstr "Ce nom de liste de lecture existe déjà, merci de la renommer."
 
 #: audio_playlist_importer.cc:183
 msgid "badly-formed XML in imported playlist"
-msgstr "Liste de lecture importée : syntaxe XML incorrecte"
+msgstr "Liste de lecture importée : syntaxe XML incorrecte"
 
 #: audio_playlist_importer.cc:267
 msgid "Audio Playlists (unused)"
 msgstr "Listes de lecture Audio (inutilisées)"
 
-#: audio_playlist_source.cc:171 audiosource.cc:963 midi_playlist_source.cc:147
-#: midi_playlist_source.cc:155 midi_playlist_source.cc:162 midi_source.cc:356
-#: plugin_insert.cc:641 rb_effect.cc:327 session.cc:2845 session.cc:2878
-#: session.cc:4124 session_handle.cc:87 sndfilesource.cc:154
-#, fuzzy
+#: audio_playlist_source.cc:171 audiosource.cc:1046 midi_playlist_source.cc:147
+#: midi_playlist_source.cc:155 midi_playlist_source.cc:162 midi_source.cc:403
+#: plugin_insert.cc:1259 rb_effect.cc:327 session.cc:5314 session.cc:5341
+#: session.cc:5461 session_handle.cc:88 sndfilesource.cc:173
 msgid "programming error: %1"
 msgstr "erreur de programmation : %1"
 
@@ -154,7 +307,7 @@ msgstr "Régions Audio"
 
 #: audio_region_importer.cc:145
 msgid "Length: "
-msgstr "Durée : "
+msgstr "Durée : "
 
 #: audio_region_importer.cc:147
 msgid ""
@@ -162,7 +315,7 @@ msgid ""
 "Position: "
 msgstr ""
 "\n"
-"Position : "
+"Position : "
 
 #: audio_region_importer.cc:149
 msgid ""
@@ -170,35 +323,41 @@ msgid ""
 "Channels: "
 msgstr ""
 "\n"
-"Canaux : "
+"Canaux : "
 
-#: audio_track.cc:161
+#: audio_track.cc:177
 msgid "Unknown bundle \"%1\" listed for input of %2"
 msgstr "Groupe inconnu \"%1\" listé comme entrée de %2"
 
-#: audio_track.cc:163
+#: audio_track.cc:179
 msgid "in 1"
 msgstr "Entrée 1"
 
-#: audio_track.cc:164
+#: audio_track.cc:180
 msgid "No input bundles available as a replacement"
 msgstr "Pas de groupe d'entrée disponible en remplacement"
 
-#: audio_track.cc:168
+#: audio_track.cc:184
 msgid "Bundle %1 was not available - \"in 1\" used instead"
 msgstr "Groupe %1 indisponible - \"Entrée 1\" utilisée à la place"
 
-#: audio_track.cc:177
+#: audio_track.cc:193
 msgid "improper input channel list in XML node (%1)"
 msgstr "Liste de canal d'entrée invalide dans le noeud XML (%1)"
 
+#: audio_track.cc:216 diskstream.cc:503 source.cc:149
+msgid "%1: this session uses destructive tracks, which are not supported"
+msgstr ""
+"%1 : cette session utilise des pistes destructrices, qui ne sont pas "
+"supportées"
+
 #: audio_track_importer.cc:68
 msgid "Audio Tracks"
 msgstr "Pistes Audio"
 
 #: audio_track_importer.cc:253 audio_track_importer.cc:259
 msgid "badly-formed XML in imported track"
-msgstr "Piste importée : syntaxe XML incorrecte"
+msgstr "Piste importée : syntaxe XML incorrecte"
 
 #: audio_track_importer.cc:287
 msgid "Error Importing Audio track %1"
@@ -212,19 +371,19 @@ msgstr "Impossible de charger le Plugin VAMP \"%1\""
 msgid "VAMP Plugin \"%1\" could not be loaded"
 msgstr "Le Plugin VAMP \"%1\" ne pouvait pas être chargé"
 
-#: audioengine.cc:696
+#: audioengine.cc:756
 msgid "AudioEngine: cannot load module \"%1\" (%2)"
-msgstr "Moteur Audio : module \"%1\" inchargeable (%2)"
+msgstr "Moteur Audio : module \"%1\" inchargeable (%2)"
 
-#: audioengine.cc:702
+#: audioengine.cc:762
 msgid "AudioEngine: backend at \"%1\" has no descriptor function."
 msgstr ""
 
-#: audioengine.cc:779
+#: audioengine.cc:841
 msgid "Could not create backend for %1: %2"
-msgstr ""
+msgstr "Impossible de créer le moteur pour %1 : %2"
 
-#: audioregion.cc:1685
+#: audioregion.cc:1757
 msgid ""
 "You have requested an operation that requires audio analysis.\n"
 "\n"
@@ -232,187 +391,216 @@ msgid ""
 "transient data must be generated every time it is required.\n"
 "\n"
 "If you are doing work that will require transient data on a regular basis, "
-"you should probably enable \"auto-analyse-audio\" then quit %1 and restart.\n"
+"you should probably enable \"auto-analyse-audio\" in Preferences > Audio > "
+"Regions, then quit %1 and restart.\n"
 "\n"
 "This dialog will not display again.  But you may notice a slight delay in "
 "this and future transient-detection operations.\n"
 msgstr ""
 
-#: audioregion.cc:1729
+#: audioregion.cc:1789
 msgid "Audio Region"
-msgstr ""
+msgstr "Région audio"
 
 #: audiosource.cc:228
 msgid "cannot rename peakfile for %1 from %2 to %3 (%4)"
 msgstr "Impossible de renommer le fichier de pic-audio pour %1 de %2 à %3 (%4)"
 
-#: audiosource.cc:257
+#: audiosource.cc:262
 msgid "AudioSource: cannot stat peakfile \"%1\""
 msgstr ""
 
-#: audiosource.cc:361
+#: audiosource.cc:368
+msgid "Cannot open peakfile @ %1 for size check (%2)"
+msgstr ""
+
+#: audiosource.cc:389
+msgid "peak file %1 is truncated from %2 to %3"
+msgstr ""
+
+#: audiosource.cc:392
+msgid "Cannot open peakfile @ %1 for size check (%2) after rebuild"
+msgstr ""
+
+#: audiosource.cc:404
 msgid "Cannot open peakfile @ %1 for reading (%2)"
 msgstr ""
 
-#: audiosource.cc:394
+#: audiosource.cc:438
 msgid "cannot read sample data for unscaled peak computation"
 msgstr ""
 
-#: audiosource.cc:430 audiosource.cc:525
+#: audiosource.cc:473 audiosource.cc:568
 msgid "map failed - could not create file mapping for peakfile %1."
 msgstr ""
 
-#: audiosource.cc:436 audiosource.cc:531
+#: audiosource.cc:479 audiosource.cc:574
 msgid "map failed - could not map peakfile %1."
 msgstr ""
 
-#: audiosource.cc:447 audiosource.cc:542
+#: audiosource.cc:490 audiosource.cc:585
 msgid "unmap failed - could not unmap peakfile %1."
 msgstr ""
 
-#: audiosource.cc:453 audiosource.cc:548
+#: audiosource.cc:496 audiosource.cc:591
 msgid "map failed - could not mmap peakfile %1."
 msgstr ""
 
-#: audiosource.cc:638
+#: audiosource.cc:681
 msgid ""
 "AudioSource[%1]: peak read - cannot read %2 samples at offset %3 of %4 (%5)"
 msgstr ""
 
-#: audiosource.cc:705
+#: audiosource.cc:748
 msgid "%1: could not write read raw data for peak computation (%2)"
 msgstr ""
 
-#: audiosource.cc:742
-msgid "AudioSource: cannot open peakpath (c) \"%1\" (%2)"
+#: audiosource.cc:815
+msgid "AudioSource: cannot open _peakpath (c) \"%1\" (%2)"
 msgstr ""
 
-#: audiosource.cc:811 audiosource.cc:933
+#: audiosource.cc:894 audiosource.cc:1016
 msgid "%1: could not seek in peak file data (%2)"
 msgstr ""
 
-#: audiosource.cc:816 audiosource.cc:942
+#: audiosource.cc:899 audiosource.cc:1025
 msgid "%1: could not write peak file data (%2)"
 msgstr ""
 
-#: audiosource.cc:975
+#: audiosource.cc:1058
 msgid "could not truncate peakfile %1 to %2 (error: %3)"
 msgstr ""
 
-#: auditioner.cc:100
+#: auditioner.cc:105
 msgid "Falling back to Reasonable Synth for Midi Audition"
 msgstr "Retour à Reasonable Synth pour l'audition MIDI"
 
-#: auditioner.cc:102
+#: auditioner.cc:107
 msgid "No synth for midi-audition found."
 msgstr "Pas de synthé trouvé pour l'audition MIDI."
 
-#: auditioner.cc:158
+#: auditioner.cc:163
 msgid "no outputs available for auditioner - manual connection required"
 msgstr "Pas de sortie disponible pour l'audition - correction manuelle requise"
 
-#: auditioner.cc:399 auditioner.cc:446
+#: auditioner.cc:408 auditioner.cc:455
 msgid "Cannot setup auditioner processing flow for %1 channels"
 msgstr ""
 "Configuration du traitement de flux d'audition pour %1 canaux impossible"
 
-#: auditioner.cc:434
+#: auditioner.cc:443
 msgid "Failed to load synth for MIDI-Audition."
 msgstr "Echec du chargement de synthé pour l'audition MIDI"
 
-#: auditioner.cc:453
+#: auditioner.cc:462
 msgid "Auditioning of regions other than Audio or Midi is not supported."
 msgstr "L'audition de régions autres qu'Audio ou MIDI est impossible."
 
-#: automatable.cc:84
+#: automatable.cc:87
 msgid "Automation node has no path property"
 msgstr "Le noeud d'automation n'a aucune propriété de chemin"
 
-#: automatable.cc:104
+#: automatable.cc:108
 msgid "cannot open %2 to load automation data (%3)"
 msgstr "Impossible d'ouvrir %2 pour charger les données d'automation (%3)"
 
-#: automatable.cc:132
+#: automatable.cc:140
 msgid "cannot load automation data from %2"
 msgstr "Impossible de charger les données d'automation de %2"
 
-#: automatable.cc:167
+#: automatable.cc:176 send.cc:95 session.cc:851
+#, fuzzy
+msgid "Fader"
+msgstr "Atténuateur"
+
+#: automatable.cc:178
+msgid "Trim"
+msgstr ""
+
+#: automatable.cc:180
 #, fuzzy
 msgid "Mute"
 msgstr "Muet"
 
-#: automation_list.cc:356
+#: automation_control.cc:228
+msgid "record %1 automation"
+msgstr ""
+
+#: automation_list.cc:410
 msgid "automation list: cannot load coordinates from XML, all points ignored"
 msgstr ""
-"Liste d'automation : chargement des coordonnées XML impossible, tous les "
+"Liste d'automation : chargement des coordonnées XML impossible, tous les "
 "points sont ignorés"
 
-#: automation_list.cc:402
+#: automation_list.cc:456
 msgid ""
 "automation list: no x-coordinate stored for control point (point ignored)"
 msgstr ""
-"Liste d'automation : pas de coordonnée x pour le point de controle (point "
+"Liste d'automation : pas de coordonnée x pour le point de controle (point "
 "ignoré)"
 
-#: automation_list.cc:408
+#: automation_list.cc:462
 msgid ""
 "automation list: no y-coordinate stored for control point (point ignored)"
 msgstr ""
-"Liste d'automation : pas de coordonnée y pour le point de controle (point "
+"Liste d'automation : pas de coordonnée y pour le point de controle (point "
 "ignoré)"
 
-#: automation_list.cc:422
+#: automation_list.cc:476
 msgid ""
 "AutomationList: passed XML node called %1, not \"AutomationList\" - ignored"
 msgstr ""
-"Liste d'automation : le noeud XML %1 entré n'est pas de liste d'automation - "
+"Liste d'automation : le noeud XML %1 entré n'est pas de liste d'automation - "
 "ignoré"
 
-#: butler.cc:100
+#: butler.cc:126
 msgid "Session: could not create butler thread"
 msgstr ""
 
-#: butler.cc:222 butler.cc:223
+#: butler.cc:254 butler.cc:255
 msgid "Butler read ahead failure on dstream %1"
 msgstr ""
 
-#: butler.cc:270 butler.cc:271
+#: butler.cc:344 butler.cc:345 butler.cc:393 butler.cc:394
 msgid "Butler write-behind failure on dstream %1"
 msgstr ""
 
-#: control_protocol_manager.cc:164
+#: control_protocol_manager.cc:174
 msgid "control protocol name \"%1\" has no descriptor"
 msgstr ""
 
-#: control_protocol_manager.cc:171
+#: control_protocol_manager.cc:181
 msgid "control protocol name \"%1\" could not be initialized"
 msgstr ""
 
-#: control_protocol_manager.cc:237
+#: control_protocol_manager.cc:265
 msgid "Instantiating mandatory control protocol %1"
 msgstr ""
 
-#: control_protocol_manager.cc:281
+#: control_protocol_manager.cc:309
 msgid "looking for control protocols in %1\n"
 msgstr ""
 
-#: control_protocol_manager.cc:306
+#: control_protocol_manager.cc:334
 msgid "Control protocol %1 not usable"
 msgstr ""
 
-#: control_protocol_manager.cc:323
+#: control_protocol_manager.cc:351
 msgid "Control surface protocol discovered: \"%1\"\n"
 msgstr ""
 
-#: control_protocol_manager.cc:341
-#, fuzzy
+#: control_protocol_manager.cc:367
 msgid "ControlProtocolManager: cannot load module \"%1\" (%2)"
-msgstr "Moteur Audio : module \"%1\" inchargeable (%2)"
+msgstr "ControlProtocolManager : impossible de charger le module « %1 » (%2)"
 
-#: control_protocol_manager.cc:347
+#: control_protocol_manager.cc:373
 msgid "ControlProtocolManager: module \"%1\" has no descriptor function."
 msgstr ""
 
+#: control_protocol_manager.cc:516
+msgid "Control protocol \"%1\" has no descriptor"
+msgstr ""
+
 #: cycle_timer.cc:40
 msgid "CycleTimer::get_mhz(): can't open /proc/cpuinfo"
 msgstr ""
@@ -429,8 +617,7 @@ msgstr ""
 msgid "audio"
 msgstr "Audio"
 
-#: data_type.cc:28 session.cc:1995 session.cc:1998
-#, fuzzy
+#: data_type.cc:28 session.cc:2452
 msgid "MIDI"
 msgstr "MIDI"
 
@@ -442,11 +629,11 @@ msgstr "Inconnu"
 msgid "main outs"
 msgstr "Sorties principales"
 
-#: delivery.cc:121 send.cc:63
+#: delivery.cc:121 send.cc:64
 msgid "listen"
 msgstr "Ecoute"
 
-#: diskstream.cc:309
+#: diskstream.cc:311
 msgid "Location \"%1\" not valid for track loop (start >= end)"
 msgstr "Emplacement \"%1\" invalide pour boucle (début >= fin)"
 
@@ -456,30 +643,29 @@ msgstr "Pas de port possible pour l'export du canal \"%1\", canal omis"
 
 #: export_failed.cc:32
 msgid "Export failed: %1"
-msgstr "Echec d'export : %1"
+msgstr "Echec d'export : %1"
 
-#: export_filename.cc:126
+#: export_filename.cc:128
 msgid "Existing export folder for this session (%1) does not exist - ignored"
 msgstr "Pas de répertoire d'export pour cette session (%1) - ignoré"
 
-#: export_filename.cc:242
+#: export_filename.cc:263
 msgid "No Time"
 msgstr "Pas d'heure"
 
-#: export_filename.cc:251
+#: export_filename.cc:272
 msgid "Invalid time format"
 msgstr "Format d'heure invalide"
 
-#: export_filename.cc:260
+#: export_filename.cc:281
 msgid "No Date"
 msgstr "Pas de date"
 
-#: export_filename.cc:275
+#: export_filename.cc:296
 msgid "Invalid date format"
 msgstr "Format de date invalide"
 
 #: export_format_manager.cc:57
-#, fuzzy
 msgid "CD"
 msgstr "CD"
 
@@ -512,23 +698,27 @@ msgstr "Compression avec perte"
 msgid "Lossless compression"
 msgstr "Compression sans perte"
 
-#: export_format_manager.cc:218 export_format_specification.cc:591
+#: export_format_manager.cc:218 export_format_specification.cc:657
 msgid "Session rate"
 msgstr "Débit de la session"
 
-#: export_format_specification.cc:549
-msgid "normalize"
-msgstr "Normaliser"
+#: export_format_specification.cc:609
+msgid "normalize loudness"
+msgstr ""
+
+#: export_format_specification.cc:611
+msgid "normalize peak"
+msgstr ""
 
-#: export_format_specification.cc:553
+#: export_format_specification.cc:616
 msgid "trim"
 msgstr "Enlever le silence au début et à la fin"
 
-#: export_format_specification.cc:555
+#: export_format_specification.cc:618
 msgid "trim start"
 msgstr "Enlever le silence au début"
 
-#: export_format_specification.cc:557
+#: export_format_specification.cc:620
 msgid "trim end"
 msgstr "Enlever le silence à la fin"
 
@@ -544,25 +734,21 @@ msgstr "Triangulaire"
 msgid "Rectangular"
 msgstr "Rectangulaire"
 
-#: export_formats.cc:52 session.cc:5421 session.cc:5437
-msgid "None"
-msgstr "Aucune"
-
 #: export_formats.cc:159
-msgid "8bit"
-msgstr "8 bits"
+msgid "8-bit"
+msgstr ""
 
 #: export_formats.cc:161
-msgid "16bit"
-msgstr "16 bits"
+msgid "16-bit"
+msgstr ""
 
 #: export_formats.cc:163
-msgid "24bit"
-msgstr "24 bits"
+msgid "24-bit"
+msgstr ""
 
 #: export_formats.cc:165
-msgid "32bit"
-msgstr "32 bits"
+msgid "32-bit"
+msgstr ""
 
 #: export_formats.cc:167
 msgid "float"
@@ -573,8 +759,8 @@ msgid "double"
 msgstr "Double"
 
 #: export_formats.cc:171
-msgid "8bit unsigned"
-msgstr "8 bits non-signé"
+msgid "8-bit unsigned"
+msgstr ""
 
 #: export_formats.cc:173
 msgid "Vorbis sample format"
@@ -584,92 +770,85 @@ msgstr "Format d'échantillonnage Vorbis"
 msgid "No sample format"
 msgstr "Pas de format d'échantillonnage"
 
-#: export_handler.cc:360
-#, fuzzy
+#: export_handler.cc:419
 msgid "File %1 uploaded to %2"
-msgstr "Import du fichier : %1 sur %2"
+msgstr "Fichier %1 téléversé vers %2"
 
-#: export_handler.cc:366
+#: export_handler.cc:425
 msgid ""
 "upload to Soundcloud failed. Perhaps your email or password are incorrect?\n"
 msgstr ""
 
-#: export_handler.cc:413
-msgid "Editor: cannot open \"%1\" as export file for CD marker file"
-msgstr ""
-"Editeur : impossible d'ouvrir \"%1\" comme fichier d'export pour les repères "
-"de CD"
-
-#: export_handler.cc:492 export_handler.cc:495
-msgid "an error occured while writing a TOC/CUE file: %1"
-msgstr "Erreur lors de l'écriture du fichier TOC/CUE : %1"
+#: export_handler.cc:551 export_handler.cc:554
+msgid "an error occurred while writing a TOC/CUE file: %1"
+msgstr "Erreur lors de l'écriture du fichier TOC/CUE : %1"
 
-#: export_handler.cc:744 export_handler.cc:802
+#: export_handler.cc:844 export_handler.cc:902
 msgid "Cannot convert %1 to Latin-1 text"
 msgstr "Conversion de texte %1 en Latin-1 impossible"
 
-#: export_profile_manager.cc:93
+#: export_profile_manager.cc:94
 msgid "Searching for export formats in %1"
 msgstr "Recherche de formats d'export dans %1"
 
-#: export_profile_manager.cc:99
+#: export_profile_manager.cc:100
 msgid "Unable to create export format directory %1: %2"
-msgstr "Création du dossier de formats d'export %1 impossible : %2"
+msgstr "Création du dossier de formats d'export %1 impossible : %2"
 
-#: export_profile_manager.cc:262
+#: export_profile_manager.cc:268
 msgid "Unable to remove export preset %1: %2"
-msgstr "Impossible d'enlever le préset d'export %1 : %2"
+msgstr "Impossible d'enlever le préset d'export %1 : %2"
 
-#: export_profile_manager.cc:351
+#: export_profile_manager.cc:357
 msgid "Selection"
 msgstr "Sélection"
 
-#: export_profile_manager.cc:604
+#: export_profile_manager.cc:621
 msgid "Unable to rename export format %1 to %2: %3"
-msgstr "Impossible de renommer le format d'export %1 en %2 : %3"
+msgstr "Impossible de renommer le format d'export %1 en %2 : %3"
 
-#: export_profile_manager.cc:636
+#: export_profile_manager.cc:653
 msgid "Unable to remove export profile %1: %2"
-msgstr "Impossible d'enlever le profil d'export %1 : %2"
+msgstr "Impossible d'enlever le profil d'export %1 : %2"
 
-#: export_profile_manager.cc:654
+#: export_profile_manager.cc:671
 msgid "empty format"
 msgstr "Format vide"
 
-#: export_profile_manager.cc:735
+#: export_profile_manager.cc:752
 msgid "Cannot load export format from %1"
 msgstr ""
 
-#: export_profile_manager.cc:741
+#: export_profile_manager.cc:758
 msgid "Cannot export format read from %1"
 msgstr ""
 
-#: export_profile_manager.cc:835
+#: export_profile_manager.cc:852
 msgid "No timespan has been selected!"
 msgstr "Aucun intervalle sélectionné !"
 
-#: export_profile_manager.cc:839
+#: export_profile_manager.cc:856
 msgid "No channels have been selected!"
 msgstr "Aucun canal sélectionné !"
 
-#: export_profile_manager.cc:843
+#: export_profile_manager.cc:860
 msgid "Some channels are empty"
 msgstr "Certains canaux sont vides !"
 
-#: export_profile_manager.cc:876
+#: export_profile_manager.cc:893
 msgid "No format selected!"
 msgstr "Aucun format sélectionné !"
 
-#: export_profile_manager.cc:878
+#: export_profile_manager.cc:895
 msgid "All channels are empty!"
 msgstr "Tous les canaux sont vides !"
 
-#: export_profile_manager.cc:880
+#: export_profile_manager.cc:897
 msgid "One or more of the selected formats is not compatible with this system!"
 msgstr ""
 "Au moins un des formats sélectionnés est incompatible avec ce système !"
 
-#: export_profile_manager.cc:883
+#: export_profile_manager.cc:900
 msgid ""
 "%1 supports only %2 channels, but you have %3 channels in your channel "
 "configuration"
@@ -677,7 +856,7 @@ msgstr ""
 "%1 supporte seulement %2 canaux, mais votre configuration de canal spécifie "
 "%3 canaux"
 
-#: file_source.cc:201 session_state.cc:2857
+#: file_source.cc:201 session_state.cc:3284
 msgid ""
 "there are already 1000 files with names like %1; versioning discontinued"
 msgstr ""
@@ -686,25 +865,25 @@ msgstr ""
 msgid "cannot rename file source from %1 to %2 (%3)"
 msgstr "Impossible de renommer la source du fichier de %1 en %2 (%3)"
 
-#: file_source.cc:251 file_source.cc:375
+#: file_source.cc:251 file_source.cc:374
 msgid "FileSource: search path not set"
 msgstr ""
 
-#: file_source.cc:435
+#: file_source.cc:434
 msgid ""
 "FileSource: \"%1\" is ambigous when searching\n"
 "\t"
 msgstr ""
 
-#: file_source.cc:442
+#: file_source.cc:441
 msgid "Filesource: cannot find required file (%1)"
 msgstr ""
 
-#: file_source.cc:487
+#: file_source.cc:486
 msgid "Filesource: cannot find required file (%1): %2"
 msgstr ""
 
-#: file_source.cc:495
+#: file_source.cc:494
 msgid "Filesource: cannot check for existing file (%1): %2"
 msgstr ""
 
@@ -721,12 +900,12 @@ msgstr ""
 msgid "cannot rename file %1 to %2 (%3)"
 msgstr "Renommage du fichier %1 en %2 impossible (%3)"
 
-#: filesystem_paths.cc:105
+#: filesystem_paths.cc:120
 msgid "Cannot create Configuration directory %1 - cannot run"
 msgstr ""
 "Création du dossier de configuration %1 impossible - démarrage impossible"
 
-#: filesystem_paths.cc:110
+#: filesystem_paths.cc:125
 msgid ""
 "Configuration directory %1 already exists and is not a directory/folder - "
 "cannot run"
@@ -734,75 +913,109 @@ msgstr ""
 "Le dossier de configuration %1 existe déjà, mais n'est pas un dossier - "
 "démarrage impossible"
 
-#: filesystem_paths.cc:171
+#: filesystem_paths.cc:186
 msgid "Cannot create cache directory %1 - cannot run"
 msgstr ""
 
-#: filesystem_paths.cc:176
+#: filesystem_paths.cc:191
 msgid ""
 "Cache directory %1 already exists and is not a directory/folder - cannot run"
 msgstr ""
 
-#: filesystem_paths.cc:194
+#: filesystem_paths.cc:209
 msgid "ARDOUR_DLL_PATH not set in environment - exiting\n"
 msgstr "ARDOUR_DLL_PATH non fixé dans l'environnement - sortie\n"
 
-#: filesystem_paths.cc:245
+#: filesystem_paths.cc:232
+msgid "Cannot determine %1 package directory"
+msgstr ""
+
+#: filesystem_paths.cc:277
 msgid "ARDOUR_CONFIG_PATH not set in environment\n"
 msgstr ""
 
-#: filesystem_paths.cc:266
+#: filesystem_paths.cc:298
 msgid "ARDOUR_DATA_PATH not set in environment\n"
 msgstr ""
 
 #: filter.cc:67
 msgid "filter: error creating name for new file based on %1"
-msgstr "Filtre : erreur de création du nom pour le nouveau fichier basé sur %1"
+msgstr "Filtre : erreur de création du nom pour le nouveau fichier basé sur %1"
 
-#: filter.cc:79
+#: filter.cc:92
 msgid "filter: error creating new file %1 (%2)"
-msgstr "Filtre : erreur de création du nouveau fichier %1 (%2)"
+msgstr "Filtre : erreur de création du nouveau fichier %1 (%2)"
 
-#: find_session.cc:59
+#: find_session.cc:60
 msgid "cannot check session path %1 (%2)"
 msgstr "Impossible de vérifier le chemin de session %1 (%2)"
 
-#: find_session.cc:85
+#: find_session.cc:86
 msgid "cannot check statefile %1 (%2)"
 msgstr "Impossible de vérifier l'état du fichier %1 (%2)"
 
-#: find_session.cc:121
+#: find_session.cc:125
 msgid "%1 is not a snapshot file"
 msgstr "%1 n'est pas un cliché"
 
-#: find_session.cc:138
+#: find_session.cc:142
 msgid "cannot determine current working directory (%1)"
 msgstr "Répertoire de travail courant impossible à déterminer (%1)"
 
-#: find_session.cc:155
+#: find_session.cc:159
 msgid "unknown file type for session %1"
 msgstr "Type de fichier inconnu pour la session %1"
 
-#: globals.cc:234
+#: gain_control.cc:81
+#, c-format
+msgid "%3.1f dB"
+msgstr ""
+
+#: globals.cc:266
 msgid "Could not set system open files limit to \"unlimited\""
 msgstr "Impossible de passer le nombre de fichiers ouverts à \"illimité\""
 
-#: globals.cc:236
+#: globals.cc:268
 msgid "Could not set system open files limit to %1"
 msgstr "Impossible de passer le nombre de fichiers ouverts à %1"
 
-#: globals.cc:240
+#: globals.cc:272 globals.cc:289
 msgid "Your system is configured to limit %1 to only %2 open files"
 msgstr "Votre configuration-système limite %1 à %2 fichiers ouverts"
 
-#: globals.cc:244
+#: globals.cc:276
 msgid "Could not get system open files limit (%1)"
 msgstr "Impossible de modifier le nombre de fichiers ouverts (%1)"
 
-#: globals.cc:415
+#: globals.cc:291
+msgid "Could not set system open files limit. Current limit is %1 open files"
+msgstr ""
+
+#: globals.cc:474
 msgid "Loading configuration"
 msgstr "Chargement de la configuration"
 
+#: globals.cc:554 route.cc:182 route.cc:4149 session.cc:1157
+msgid "Monitor"
+msgstr "Monitoring"
+
+#: globals.cc:555 session_state.cc:642
+#, fuzzy
+msgid "Master"
+msgstr "Bus Master"
+
+#: globals.cc:556
+msgid "Control"
+msgstr ""
+
+#: globals.cc:557
+msgid "Click"
+msgstr ""
+
+#: globals.cc:558
+msgid "Mackie"
+msgstr ""
+
 #: import.cc:146
 msgid "Cannot find new filename for imported file %1"
 msgstr "Impossible de trouver un nouveau nom pour le fichier importé %1"
@@ -828,16 +1041,16 @@ msgid "Track %1 of %2 contained no usable MIDI data"
 msgstr "La piste %1 de %2 ne contient aucune donnée MIDI valide"
 
 #: import.cc:427
-msgid "MIDI file %1 was not readable (no reason available)"
-msgstr "Le fichier MIDI %1 n'est pas lisible (pour une raison inconnue)"
+msgid "MIDI file could not be written (best guess: %1)"
+msgstr ""
 
 #: import.cc:475
 msgid "Import: cannot open input sound file \"%1\""
-msgstr "Import : impossible d'ouvrir le fichier Audio \"%1\""
+msgstr "Import : impossible d'ouvrir le fichier Audio \"%1\""
 
 #: import.cc:486
 msgid "Import: error opening MIDI file"
-msgstr "Import : erreur d'ouverture du fichier MIDI"
+msgstr "Import : erreur d'ouverture du fichier MIDI"
 
 #: import.cc:493
 msgid "Import: file contains no channels."
@@ -855,110 +1068,113 @@ msgstr "Echec de suppression de fichier(s) après l'échec/annulation d'import"
 msgid "Unknown"
 msgstr "Inconnnu"
 
-#: instrument_info.cc:231
+#: instrument_info.cc:243
 msgid "preset %1 (bank %2)"
 msgstr "Préset %1 (Banque %2)"
 
-#: internal_send.cc:316 internal_send.cc:317
+#: internal_send.cc:338 internal_send.cc:339
 msgid "%1 - cannot find any track/bus with the ID %2 to connect to"
 msgstr "%1 - aucune piste/bus à l'ID %2 à qui se connecter"
 
-#: io.cc:209
+#: io.cc:212
 msgid "IO: cannot disconnect port %1 from %2"
-msgstr "E/S : impossible de déconnecter le port %1 de %2"
+msgstr "E/S : impossible de déconnecter le port %1 de %2"
 
-#: io.cc:344 io.cc:431
+#: io.cc:347 io.cc:435
 msgid "IO: cannot register input port %1"
-msgstr "E/S : impossible d'inscrire le port d'entrée %1"
+msgstr "E/S : impossible d'inscrire le port d'entrée %1"
 
-#: io.cc:349 io.cc:436
+#: io.cc:352 io.cc:440
 msgid "IO: cannot register output port %1"
-msgstr "E/S : impossible d'inscrire le port de sortie %1"
+msgstr "E/S : impossible d'inscrire le port de sortie %1"
 
-#: io.cc:598 io.cc:654
+#: io.cc:607 io.cc:668
 msgid "incorrect XML node \"%1\" passed to IO object"
 msgstr ""
 
-#: io.cc:713
+#: io.cc:730
 msgid "in"
 msgstr "Entrée"
 
-#: io.cc:713
+#: io.cc:730
 msgid "out"
 msgstr "Sortie"
 
-#: io.cc:714
+#: io.cc:731
 msgid "input"
 msgstr "Entrée"
 
-#: io.cc:714
+#: io.cc:731
 msgid "output"
 msgstr "Sortie"
 
-#: io.cc:724
+#: io.cc:741
 msgid "Unknown bundle \"%1\" listed for %2 of %3"
 msgstr "Groupe inconnu \"%1\" listé comme %2 de %3"
 
-#: io.cc:790
+#: io.cc:807
 msgid "Bundle %1 was not available - \"%2\" used instead"
 msgstr "Groupe %1 indisponible - \"%2\" utilisé à la place"
 
-#: io.cc:793
+#: io.cc:810
 msgid "No %1 bundles available as a replacement"
 msgstr ""
 
-#: io.cc:897
+#: io.cc:914
 msgid "%1: cannot create I/O ports"
-msgstr "%1 : création de ports E/S impossible"
+msgstr "%1 : création de ports E/S impossible"
 
-#: io.cc:1025 io.cc:1126
+#: io.cc:1042 io.cc:1143
 msgid "IO: badly formed string in XML node for inputs \"%1\""
 msgstr ""
 
-#: io.cc:1030 io.cc:1131
+#: io.cc:1047 io.cc:1148
 msgid "bad input string in XML node \"%1\""
 msgstr ""
 
-#: io.cc:1069
+#: io.cc:1086
 msgid "IO: badly formed string in XML node for outputs \"%1\""
 msgstr ""
 
-#: io.cc:1074
+#: io.cc:1091
 msgid "IO: bad output string in XML node \"%1\""
 msgstr ""
 
-#: io.cc:1413
+#: io.cc:1256 plugin.cc:275
+msgid "Out"
+msgstr ""
+
+#: io.cc:1256 plugin.cc:273
+msgid "In"
+msgstr ""
+
+#: io.cc:1454
 #, c-format
 msgid "%s %u"
 msgstr ""
 
-#: io.cc:1460
+#: io.cc:1501
 #, c-format
 msgid "%s in"
 msgstr "Entrée %s"
 
-#: io.cc:1462
+#: io.cc:1503
 #, c-format
 msgid "%s out"
 msgstr "Sortie %s"
 
-#: io.cc:1537 session.cc:733 session.cc:767
+#: io.cc:1578 session.cc:957 session.cc:991
 msgid "mono"
 msgstr "Mono"
 
-#: io.cc:1539 session.cc:746 session.cc:781
+#: io.cc:1580 session.cc:970 session.cc:1005
 msgid "L"
 msgstr "G"
 
-#: io.cc:1539 session.cc:748 session.cc:783
+#: io.cc:1580 session.cc:972 session.cc:1007
 msgid "R"
 msgstr "D"
 
-#: io.cc:1541 io.cc:1547
-#, fuzzy, c-format
-msgid "%d"
-msgstr "S"
-
 #: ladspa_plugin.cc:93
 msgid "LADSPA: Unable to open module: "
 msgstr ""
@@ -969,87 +1185,87 @@ msgstr ""
 
 #: ladspa_plugin.cc:106
 msgid "LADSPA: plugin has gone away since discovery!"
-msgstr "LADSPA : le plugin a disparu depuis sa découverte !"
+msgstr "LADSPA : le plugin a disparu depuis sa découverte !"
 
 #: ladspa_plugin.cc:113
 msgid "LADSPA: \"%1\" cannot be used, since it cannot do inplace processing"
 msgstr ""
 
-#: ladspa_plugin.cc:311
+#: ladspa_plugin.cc:308
 msgid ""
 "illegal parameter number used with plugin \"%1\". This may indicate a change "
 "in the plugin design, and presets may be invalid"
 msgstr ""
 
-#: ladspa_plugin.cc:390 ladspa_plugin.cc:440
+#: ladspa_plugin.cc:387 ladspa_plugin.cc:437
 msgid "Bad node sent to LadspaPlugin::set_state"
 msgstr ""
 
-#: ladspa_plugin.cc:405 ladspa_plugin.cc:454
+#: ladspa_plugin.cc:402 ladspa_plugin.cc:451
 msgid "LADSPA: no ladspa port number"
 msgstr ""
 
-#: ladspa_plugin.cc:411 ladspa_plugin.cc:460
+#: ladspa_plugin.cc:408 ladspa_plugin.cc:457
 msgid "LADSPA: no ladspa port data"
 msgstr ""
 
-#: ladspa_plugin.cc:842
+#: ladspa_plugin.cc:863
 msgid "Could not locate HOME.  Preset not removed."
 msgstr "HOME introuvable. Préset non enlevé."
 
-#: ladspa_plugin.cc:881 ladspa_plugin.cc:887
+#: ladspa_plugin.cc:902 ladspa_plugin.cc:908
 msgid "Could not create %1.  Preset not saved. (%2)"
 msgstr "Création de %1 impossible. Préset non sauvegardé. (%2)"
 
-#: ladspa_plugin.cc:894
+#: ladspa_plugin.cc:915
 msgid "Error saving presets file %1."
 msgstr ""
 
-#: ladspa_plugin.cc:936
+#: ladspa_plugin.cc:957
 msgid "Could not locate HOME.  Preset not saved."
 msgstr "HOME introuvable. Préset non sauvegardé."
 
-#: location.cc:456
+#: location.cc:455
 msgid "You cannot put a CD marker at this position"
 msgstr "Impossible de placer un repère de CD ici"
 
-#: location.cc:608
+#: location.cc:607
 msgid "incorrect XML node passed to Location::set_state"
 msgstr ""
 
-#: location.cc:613
+#: location.cc:612
 msgid "XML node for Location has no ID information"
 msgstr ""
 
-#: location.cc:617
+#: location.cc:616
 msgid "XML node for Location has no name information"
 msgstr ""
 
-#: location.cc:624
+#: location.cc:623
 msgid "XML node for Location has no start information"
 msgstr ""
 
-#: location.cc:635
+#: location.cc:634
 msgid "XML node for Location has no end information"
 msgstr ""
 
-#: location.cc:642
+#: location.cc:641
 msgid "XML node for Location has no flags information"
 msgstr ""
 
-#: location.cc:856
+#: location.cc:868
 msgid "Locations: attempt to use unknown location as selected location"
 msgstr ""
 
-#: location.cc:1034
+#: location.cc:1046
 msgid "incorrect XML mode passed to Locations::set_state"
 msgstr ""
 
-#: location.cc:1047 session.cc:1293 session.cc:4919 session_state.cc:1053
+#: location.cc:1059 session.cc:1667 session.cc:6305 session_state.cc:1205
 msgid "session"
 msgstr "Session"
 
-#: location.cc:1112
+#: location.cc:1126
 msgid "could not load location from session file - ignored"
 msgstr ""
 
@@ -1077,7 +1293,7 @@ msgid ""
 "end: "
 msgstr ""
 "\n"
-"fin : "
+"fin : "
 
 #: location_importer.cc:146
 msgid ""
@@ -1086,7 +1302,7 @@ msgid ""
 msgstr ""
 "L'emplacement est l'intervalle-Punch, il sera importé comme intervalle "
 "normal.\n"
-"Vous pourriez renommer l'emplacement importé : "
+"Vous pourriez renommer l'emplacement importé : "
 
 #: location_importer.cc:157
 msgid ""
@@ -1095,7 +1311,7 @@ msgid ""
 msgstr ""
 "L'emplacement est un intervalle-Boucle, il sera importé comme intervalle "
 "normal.\n"
-"Vous pourriez renommer l'emplacement importé : "
+"Vous pourriez renommer l'emplacement importé : "
 
 #: location_importer.cc:168
 msgid ""
@@ -1103,59 +1319,115 @@ msgid ""
 "You may rename the imported location:"
 msgstr ""
 "Un emplacement de ce nom existe déjà.\n"
-"Vous pourriez renommer l'emplacement importé : "
+"Vous pourriez renommer l'emplacement importé : "
+
+#: ltc_file_reader.cc:96
+msgid "LTCFileReader: cannot open file \"%1\""
+msgstr ""
+
+#: ltc_file_reader.cc:105
+msgid "LTCFileReader: cannot open file \"%1\" (%3)"
+msgstr ""
+
+#: ltc_file_reader.cc:109
+msgid "LTCFileReader: \"%1\" is an empty audio file"
+msgstr ""
+
+#: ltc_file_reader.cc:134
+msgid "LTCFileReader:: invalid audio channel selected"
+msgstr ""
 
-#: ltc_slave.cc:272
+#: ltc_slave.cc:275
 msgid "Session framerate adjusted from %1 to LTC's %2."
 msgstr "FPS de la session ajusté de %1 à %2 du LTC."
 
-#: ltc_slave.cc:286
+#: ltc_slave.cc:289
 msgid "Session and LTC framerate mismatch: LTC:%1 Session:%2."
-msgstr "Décalage FPS entre Session et LTC : Session : %2 - LTC : %1."
+msgstr "Décalage FPS entre Session et LTC : Session : %2 - LTC : %1."
 
-#: ltc_slave.cc:603
+#: ltc_slave.cc:609
 msgid "flywheel"
 msgstr ""
 
-#: midi_diskstream.cc:173
+#: lua_api.cc:87
+msgid "Script with given name was not found\n"
+msgstr ""
+
+#: lua_api.cc:96
+msgid "Failed to instantiate Lua Processor\n"
+msgstr ""
+
+#: luaproc.cc:876
+msgid "Failed to load Lua script from session state."
+msgstr ""
+
+#: luaproc.cc:886
+msgid "Session State for LuaProcessor did not include a Lua script."
+msgstr ""
+
+#: luaproc.cc:890
+msgid "Invalid/incompatible Lua script found for LuaProcessor."
+msgstr ""
+
+#: luaproc.cc:918
+msgid "Bad node sent to LuaProc::set_state"
+msgstr ""
+
+#: luaproc.cc:928
+msgid "LuaProc: port has no symbol, ignored"
+msgstr ""
+
+#: luaproc.cc:934
+msgid "LuaProc: port has no value, ignored"
+msgstr ""
+
+#: luaproc.cc:1164
+msgid "Unable to create LuaProc presets directory"
+msgstr ""
+
+#: luascripting.cc:132
+msgid "Script '%1' has no valid descriptor."
+msgstr ""
+
+#: midi_diskstream.cc:172
 msgid ""
 "%1: I/O configuration change %4 requested to use %2, but channel setup is %3"
 msgstr ""
-"%1 : changement de configuration E/S %4 requis pour utiliser %2, mais le "
+"%1 : changement de configuration E/S %4 requis pour utiliser %2, mais le "
 "canal est réglé à %3"
 
-#: midi_diskstream.cc:225
+#: midi_diskstream.cc:224
 msgid "MidiDiskstream: Playlist \"%1\" isn't a midi playlist"
 msgstr ""
 
-#: midi_diskstream.cc:276
+#: midi_diskstream.cc:275
 #, fuzzy
 msgid "MidiDiskstream %1: there is no existing playlist to make a copy of!"
-msgstr "AudioDiskstream %1 : aucune liste de lecture existante à copier !"
+msgstr "AudioDiskstream %1 : aucune liste de lecture existante à copier !"
 
-#: midi_diskstream.cc:754
+#: midi_diskstream.cc:753
 #, fuzzy
 msgid "MidiDiskstream %1: cannot read %2 from playlist at frame %3"
 msgstr ""
-"AudioDiskstream %1 : lecture impossible de %2 depuis la  liste de lecture à "
+"AudioDiskstream %1 : lecture impossible de %2 depuis la  liste de lecture à "
 "l'image %3"
 
-#: midi_diskstream.cc:891
+#: midi_diskstream.cc:890
 #, fuzzy
 msgid "MidiDiskstream %1: cannot write to disk"
-msgstr "AudioDiskstream %1 : écriture sur le disque impossible"
+msgstr "AudioDiskstream %1 : écriture sur le disque impossible"
 
-#: midi_diskstream.cc:925
+#: midi_diskstream.cc:924
 #, fuzzy
 msgid "MidiDiskstream \"%1\": cannot flush captured data to disk!"
 msgstr ""
-"AudioDiskstream \"%1\" : transfert de la capture sur le disque impossible !"
+"AudioDiskstream \"%1\" : transfert de la capture sur le disque impossible !"
 
-#: midi_diskstream.cc:1014
+#: midi_diskstream.cc:1013
 msgid "%1: could not create region for complete midi file"
-msgstr "%1 : création de région impossible pour le fichier MIDI complet"
+msgstr "%1 : création de région impossible pour le fichier MIDI complet"
 
-#: midi_diskstream.cc:1055
+#: midi_diskstream.cc:1054
 msgid "MidiDiskstream: could not create region for captured midi!"
 msgstr ""
 
@@ -1175,32 +1447,47 @@ msgstr ""
 msgid "No SysExID found for sys-ex property change - ignored"
 msgstr ""
 
-#: midi_model.cc:1994
-msgid "transpose"
-msgstr "Transposer"
+#: midi_patch_manager.cc:78
+msgid "Loading %1 MIDI patch from %2"
+msgid_plural "Loading %1 MIDI patches from %2"
+msgstr[0] ""
+msgstr[1] ""
 
-#: midi_patch_manager.cc:133
+#: midi_patch_manager.cc:109
+msgid "Unloading %1 MIDI patch from %2"
+msgid_plural "Unloading %1 MIDI patches from %2"
+msgstr[0] ""
+msgstr[1] ""
+
+#: midi_patch_manager.cc:126
+msgid "Error parsing MIDI patch file %1"
+msgstr ""
+
+#: midi_patch_manager.cc:135
 msgid "Duplicate MIDI device `%1' in `%2' ignored"
 msgstr ""
 
-#: midi_scene_changer.cc:295
+#: midi_patch_manager.cc:170
+msgid "Removing MIDI patch file %1"
+msgstr ""
+
+#: midi_scene_changer.cc:312
 msgid "Scene "
 msgstr ""
 
-#: midi_source.cc:125
+#: midi_source.cc:126
 msgid "Missing parameter property on InterpolationStyle"
 msgstr ""
 
-#: midi_source.cc:131
-#, fuzzy
+#: midi_source.cc:132
 msgid "Missing style property on InterpolationStyle"
-msgstr "Style RGBA manquant pour \"%1\""
+msgstr ""
 
-#: midi_source.cc:140
+#: midi_source.cc:141
 msgid "Missing parameter property on AutomationState"
 msgstr ""
 
-#: midi_source.cc:146
+#: midi_source.cc:147
 msgid "Missing state property on AutomationState"
 msgstr ""
 
@@ -1208,59 +1495,58 @@ msgstr ""
 msgid "MIDI stretch created non-MIDI source"
 msgstr ""
 
-#: monitor_processor.cc:53
+#: monitor_processor.cc:54
 msgid "monitor dim"
 msgstr "Dim monitoring"
 
-#: monitor_processor.cc:54
+#: monitor_processor.cc:55
 msgid "monitor cut"
 msgstr "Monitoring coupé"
 
-#: monitor_processor.cc:55
+#: monitor_processor.cc:56
 msgid "monitor mono"
 msgstr "Monitoring Mono"
 
-#: monitor_processor.cc:58
+#: monitor_processor.cc:59
 msgid "monitor dim level"
 msgstr "Niveau de Dim du Monitoring"
 
-#: monitor_processor.cc:62
+#: monitor_processor.cc:63
 msgid "monitor solo boost level"
 msgstr "Niveau de gain solos du Monitoring"
 
-#: monitor_processor.cc:512
+#: monitor_processor.cc:543
 msgid "cut control %1"
 msgstr ""
 
-#: monitor_processor.cc:513
+#: monitor_processor.cc:544
 msgid "dim control"
 msgstr ""
 
-#: monitor_processor.cc:514
+#: monitor_processor.cc:545
 msgid "polarity control"
 msgstr ""
 
-#: monitor_processor.cc:515
-#, fuzzy
+#: monitor_processor.cc:546
 msgid "solo control"
-msgstr "Ctrl"
+msgstr ""
 
-#: mtc_slave.cc:240
+#: mtc_slave.cc:241
 msgid "MTC Slave: atomic read of current time failed, sleeping!"
 msgstr ""
 
-#: mtc_slave.cc:362
+#: mtc_slave.cc:363
 msgid ""
 "Unknown rate/drop value %1 in incoming MTC stream, session values used "
 "instead"
 msgstr ""
 
-#: mtc_slave.cc:382
+#: mtc_slave.cc:383
 #, fuzzy
 msgid "Session framerate adjusted from %1 TO: MTC's %2."
 msgstr "FPS de la session ajusté de %1 à %2 du LTC."
 
-#: mtc_slave.cc:396
+#: mtc_slave.cc:397
 msgid "Session and MTC framerate mismatch: MTC:%1 %2:%3."
 msgstr ""
 
@@ -1316,7 +1602,7 @@ msgstr "Copier une région"
 msgid "fixed time region copy"
 msgstr "Copier une région (horodatage fixe)"
 
-#: pannable.cc:207
+#: pannable.cc:208
 msgid "Pannable given XML data for %1 - ignored"
 msgstr ""
 
@@ -1325,16 +1611,13 @@ msgid "looking for panners in %1\n"
 msgstr "Recherche de Panoramiques dans %1\n"
 
 #: panner_manager.cc:121
-#, fuzzy
 msgid "Panner discovered: \"%1\" in %2\n"
-msgstr ""
-"%1\n"
-"(révision %2)"
+msgstr " \n"
 
 #: panner_manager.cc:140
 #, fuzzy
 msgid "PannerManager: cannot load module \"%1\" (%2)"
-msgstr "Moteur Audio : module \"%1\" inchargeable (%2)"
+msgstr "Moteur Audio : module \"%1\" inchargeable (%2)"
 
 #: panner_manager.cc:147
 msgid "PannerManager: module \"%1\" has no descriptor function."
@@ -1354,32 +1637,101 @@ msgstr ""
 msgid "select panner: %1\n"
 msgstr ""
 
-#: panner_shell.cc:255
+#: panner_shell.cc:257
 msgid "Unknown panner plugin \"%1\" found in pan state - ignored"
 msgstr ""
 
-#: panner_shell.cc:261
+#: panner_shell.cc:263
 msgid "panner plugin node has no type information!"
 msgstr ""
 
-#: playlist.cc:2138
+#: parameter_descriptor.cc:201
+msgid "Note|C"
+msgstr "Do"
+
+#: parameter_descriptor.cc:202
+msgid "Note|C#"
+msgstr "Do ♯"
+
+#: parameter_descriptor.cc:203
+msgid "Note|D"
+msgstr "Ré"
+
+#: parameter_descriptor.cc:204
+msgid "Note|D#"
+msgstr "Ré ♯"
+
+#: parameter_descriptor.cc:205
+msgid "Note|E"
+msgstr "Mi"
+
+#: parameter_descriptor.cc:206
+msgid "Note|F"
+msgstr "Fa"
+
+#: parameter_descriptor.cc:207
+msgid "Note|F#"
+msgstr "Fa ♯"
+
+#: parameter_descriptor.cc:208
+msgid "Note|G"
+msgstr "Sol"
+
+#: parameter_descriptor.cc:209
+msgid "Note|G#"
+msgstr "Sol ♯"
+
+#: parameter_descriptor.cc:210
+msgid "Note|A"
+msgstr "La"
+
+#: parameter_descriptor.cc:211
+msgid "Note|A#"
+msgstr "Si â™­"
+
+#: parameter_descriptor.cc:212
+msgid "Note|B"
+msgstr "Si"
+
+#: playlist.cc:2234
 msgid "region state node has no ID, ignored"
 msgstr ""
 
-#: playlist.cc:2156
+#: playlist.cc:2252
 msgid "Playlist: cannot create region from XML"
 msgstr ""
 
 #: playlist_source.cc:99
 #, fuzzy
 msgid "No playlist ID in PlaylistSource XML!"
-msgstr "Liste de lecture importée : syntaxe XML incorrecte"
+msgstr "Liste de lecture importée : syntaxe XML incorrecte"
 
 #: playlist_source.cc:118
 msgid "Could not construct playlist for PlaylistSource from session data!"
 msgstr ""
 
-#: plugin.cc:328
+#: plugin.cc:126
+msgid "Cannot remove plugin factory preset."
+msgstr ""
+
+#: plugin.cc:144
+msgid "Preset with given name already exists."
+msgstr ""
+
+#: plugin.cc:263
+#, fuzzy
+msgid "Audio"
+msgstr "Audio"
+
+#: plugin.cc:266
+msgid "Midi"
+msgstr ""
+
+#: plugin.cc:269
+msgid "?"
+msgstr ""
+
+#: plugin.cc:412
 msgid ""
 "Plugin presets are not supported in this build of %1. Consider paying for a "
 "full version"
@@ -1387,7 +1739,7 @@ msgstr ""
 "Les présets de Plugin ne sont pas supportés dans cette version d'%1. "
 "Envisagez d'acheter une version complète."
 
-#: plugin.cc:403
+#: plugin.cc:495
 msgid ""
 "Saving plugin settings is not supported in this build of %1. Consider paying "
 "for the full version"
@@ -1395,24 +1747,27 @@ msgstr ""
 "Sauvegarder les réglages de Plugin est impossible dans cette version d'%1. "
 "Envisagez d'acheter la version complète."
 
-#: plugin_insert.cc:596
-#, fuzzy
+#: plugin_insert.cc:1148
 msgid "programming error: "
-msgstr "erreur de programmation: "
+msgstr "erreur de programmation : "
+
+#: plugin_insert.cc:1700
+msgid "SC %1"
+msgstr ""
 
-#: plugin_insert.cc:933
+#: plugin_insert.cc:2352
 msgid "XML node describing plugin is missing the `type' field"
 msgstr ""
 
-#: plugin_insert.cc:948
+#: plugin_insert.cc:2369
 msgid "unknown plugin type %1 in plugin insert state"
 msgstr ""
 
-#: plugin_insert.cc:976
+#: plugin_insert.cc:2397
 msgid "Plugin has no unique ID field"
 msgstr ""
 
-#: plugin_insert.cc:1001
+#: plugin_insert.cc:2435
 msgid ""
 "Found a reference to a plugin (\"%1\") that is unknown.\n"
 "Perhaps it was removed or moved since it was last used."
@@ -1420,119 +1775,209 @@ msgstr ""
 "Référence à un Plugin (\"%1\") qui est inconnu.\n"
 "Il a peut-être été enlevé ou déplacé depuis sa dernière utilisation."
 
-#: plugin_insert.cc:1115
+#: plugin_insert.cc:2645
 msgid "PluginInsert: Auto: no ladspa port number"
 msgstr ""
 
-#: plugin_insert.cc:1122
+#: plugin_insert.cc:2652
 msgid "PluginInsert: Auto: port id out of range"
 msgstr ""
 
-#: plugin_insert.cc:1158
+#: plugin_insert.cc:2688
 msgid "PluginInsert: automatable control %1 not found - ignored"
 msgstr ""
 
-#: plugin_manager.cc:209
+#: plugin_manager.cc:220
 msgid "Discovering Plugins"
 msgstr "Découverte de Plugins..."
 
-#: plugin_manager.cc:231
+#: plugin_manager.cc:251
 msgid "Scanning LADSPA Plugins"
 msgstr ""
 
-#: plugin_manager.cc:234
-#, fuzzy
+#: plugin_manager.cc:253
+msgid "Scanning Lua DSP Processors"
+msgstr ""
+
+#: plugin_manager.cc:256
 msgid "Scanning LV2 Plugins"
-msgstr "Recherche de greffons"
+msgstr "Recherche de greffons LV2"
 
-#: plugin_manager.cc:239
+#: plugin_manager.cc:262
 msgid "Scanning Windows VST Plugins"
 msgstr ""
 
-#: plugin_manager.cc:246
+#: plugin_manager.cc:264
+msgid "Discovering Windows VST Plugins"
+msgstr ""
+
+#: plugin_manager.cc:273
 msgid "Scanning Linux VST Plugins"
 msgstr ""
 
-#: plugin_manager.cc:252
+#: plugin_manager.cc:275
+msgid "Discovering Linux VST Plugins"
+msgstr ""
+
+#: plugin_manager.cc:288
+msgid "VST Blacklist: "
+msgstr ""
+
+#: plugin_manager.cc:290
+msgid "VST Blacklist:"
+msgstr ""
+
+#: plugin_manager.cc:300
 msgid "Scanning AU Plugins"
 msgstr ""
 
-#: plugin_manager.cc:256
+#: plugin_manager.cc:302
+msgid "Discovering AU Plugins"
+msgstr ""
+
+#: plugin_manager.cc:307
 msgid "Plugin Scan Complete..."
 msgstr ""
 
-#: plugin_manager.cc:393
+#: plugin_manager.cc:513
 msgid "LADSPA"
 msgstr ""
 
-#: plugin_manager.cc:445
+#: plugin_manager.cc:565
 msgid "Could not parse rdf file: %1"
 msgstr ""
 
-#: plugin_manager.cc:482
+#: plugin_manager.cc:602
 msgid "LADSPA: cannot load module \"%1\" (%2)"
-msgstr "LADSPA : chargement du module \"%1\" impossible (%2)"
+msgstr "LADSPA : chargement du module \"%1\" impossible (%2)"
 
-#: plugin_manager.cc:489
+#: plugin_manager.cc:609
 msgid "LADSPA: module \"%1\" has no descriptor function."
 msgstr ""
 
-#: plugin_manager.cc:705
-#, fuzzy
+#: plugin_manager.cc:813
+msgid "--- Windows VST plugins Scan: %1"
+msgstr ""
+
+#: plugin_manager.cc:819
 msgid "VST"
+msgstr "VST"
+
+#: plugin_manager.cc:824
+msgid "--- Windows VST plugins Scan Done"
+msgstr ""
+
+#: plugin_manager.cc:839
+msgid "cannot open dll"
+msgstr ""
+
+#: plugin_manager.cc:843
+msgid "invalid dll, file too small"
+msgstr ""
+
+#: plugin_manager.cc:847
+msgid "not a dll"
+msgstr ""
+
+#: plugin_manager.cc:853
+msgid "cannot determine dll type"
+msgstr ""
+
+#: plugin_manager.cc:857
+msgid "cannot read dll PE header"
+msgstr ""
+
+#: plugin_manager.cc:862
+msgid "invalid dll PE header"
+msgstr ""
+
+#: plugin_manager.cc:869
+msgid "i386 (32-bit)"
+msgstr ""
+
+#: plugin_manager.cc:872
+msgid "Itanium"
+msgstr ""
+
+#: plugin_manager.cc:875
+msgid "x64 (64-bit)"
 msgstr ""
-"Type d'Éditeur de plugin inconnu (note: VST non supporté dans cette version "
-"d'%1)"
 
-#: plugin_manager.cc:732
+#: plugin_manager.cc:878
+msgid "Native Architecture"
+msgstr ""
+
+#: plugin_manager.cc:881
+msgid "Unknown Architecture"
+msgstr ""
+
+#: plugin_manager.cc:897
+msgid " *  %1 (cache only)"
+msgstr ""
+
+#: plugin_manager.cc:899
+msgid " *  %1 - %2"
+msgstr ""
+
+#: plugin_manager.cc:913
+msgid " -> Cannot get Windows VST information, plugin ignored."
+msgstr ""
+
+#: plugin_manager.cc:924
 msgid ""
-"VST plugin %1 does not support processReplacing, and so cannot be used in %2 "
-"at this time"
+"VST plugin %1 does not support processReplacing, and cannot be used in %2 at "
+"this time"
 msgstr ""
 
-#: plugin_manager.cc:824
+#: plugin_manager.cc:959
+msgid "Ignoring duplicate Windows VST plugin \"%1\""
+msgstr ""
+
+#: plugin_manager.cc:971
+msgid " -> OK (VST Plugin \"%1\" was added)."
+msgstr ""
+
+#: plugin_manager.cc:1019
 msgid "LXVST"
 msgstr ""
 
-#: plugin_manager.cc:851
+#: plugin_manager.cc:1046
 msgid ""
 "linuxVST plugin %1 does not support processReplacing, and so cannot be used "
 "in %2 at this time"
 msgstr ""
 
-#: plugin_manager.cc:1020
+#: plugin_manager.cc:1213
 msgid "unknown plugin status type \"%1\" - all entries ignored"
 msgstr ""
 
-#: plugin_manager.cc:1037
-#, fuzzy
+#: plugin_manager.cc:1232
 msgid "unknown plugin type \"%1\" - ignored"
-msgstr "Type d'Éditeur de plugin inconnu"
+msgstr "Type de greffon « %1 » inconnu − ignoré"
 
-#: port.cc:450
-#, fuzzy
+#: port.cc:504
 msgid "could not reregister %1"
-msgstr "IHM %1 impossible à créer"
+msgstr "impossible d'inscrire à nouveau %1"
 
 #: port_insert.cc:43
 msgid "insert %1"
 msgstr ""
 
-#: port_insert.cc:197
+#: port_insert.cc:204
 msgid "XML node describing port insert is missing the `type' field"
 msgstr ""
 
-#: port_insert.cc:202
+#: port_insert.cc:209
 msgid "non-port insert XML used for port plugin insert"
 msgstr ""
 
-#: port_manager.cc:287
+#: port_manager.cc:288
 msgid ""
 "a port with the name \"%1\" already exists: check for duplicated track/bus "
 "names"
 msgstr ""
 
-#: port_manager.cc:289
+#: port_manager.cc:290
 msgid ""
 "No more ports are available. You will need to stop %1 and restart with more "
 "ports if you need this many tracks."
@@ -1540,44 +1985,43 @@ msgstr ""
 "Plus de port disponible. Vous devez stopper %1 et redémarrer avec plus de "
 "ports si vous avez besoin d'autant de pistes."
 
-#: port_manager.cc:292
-#, fuzzy
+#: port_manager.cc:293
 msgid "AudioEngine: cannot register port \"%1\": %2"
-msgstr "Moteur Audio : module \"%1\" inchargeable (%2)"
+msgstr "AudioEngine : impossible de réserver le port « %1 » (%2)"
 
-#: port_manager.cc:331
+#: port_manager.cc:332
 msgid "unable to create port: %1"
-msgstr "création de port impossible : %1"
+msgstr "création de port impossible : %1"
 
-#: port_manager.cc:418
+#: port_manager.cc:453
 msgid "AudioEngine: cannot connect %1 (%2) to %3 (%4)"
 msgstr ""
 
-#: port_manager.cc:470 port_manager.cc:471
+#: port_manager.cc:505 port_manager.cc:506
 msgid "Re-establising port %1 failed"
 msgstr ""
 
-#: processor.cc:214
+#: processor.cc:218
 msgid "No %1 property flag in element %2"
 msgstr ""
 
-#: processor.cc:223
+#: processor.cc:227
 msgid "No child node with active property"
 msgstr ""
 
-#: rc_configuration.cc:91
+#: rc_configuration.cc:92
 msgid "Loading system configuration file %1"
 msgstr "Chargement du fichier de configuration-système %1"
 
-#: rc_configuration.cc:95
+#: rc_configuration.cc:96
 msgid "%1: cannot read system configuration file \"%2\""
-msgstr "%1 : lecture du fichier de configuration-système \"%2\" impossible"
+msgstr "%1 : lecture du fichier de configuration-système \"%2\" impossible"
 
-#: rc_configuration.cc:100
+#: rc_configuration.cc:101
 msgid "%1: system configuration file \"%2\" not loaded successfully."
-msgstr "%1 : échec de chargement du fichier de configuration-système \"%2\"."
+msgstr "%1 : échec de chargement du fichier de configuration-système \"%2\"."
 
-#: rc_configuration.cc:104
+#: rc_configuration.cc:105
 msgid ""
 "Your system %1 configuration file is empty. This probably means that there "
 "was an error installing %1"
@@ -1585,89 +2029,154 @@ msgstr ""
 "Le fichier de configuration-système %1 est vide. Il y a probablement eu une "
 "erreur en installant %1"
 
-#: rc_configuration.cc:119
+#: rc_configuration.cc:120
 msgid "Loading user configuration file %1"
 msgstr "Chargement du fichier de configuration-utilisateur %1"
 
-#: rc_configuration.cc:123
+#: rc_configuration.cc:124
 msgid "%1: cannot read configuration file \"%2\""
-msgstr "%1 : lecture du fichier de configuration \"%2\" impossible"
+msgstr "%1 : lecture du fichier de configuration \"%2\" impossible"
 
-#: rc_configuration.cc:128
+#: rc_configuration.cc:129
 msgid "%1: user configuration file \"%2\" not loaded successfully."
 msgstr ""
-"%1 : échec de chargement du fichier de configuration-utilisateur \"%2\"."
+"%1 : échec de chargement du fichier de configuration-utilisateur \"%2\"."
 
-#: rc_configuration.cc:132
+#: rc_configuration.cc:133
 msgid "your %1 configuration file is empty. This is not normal."
 msgstr "Le fichier de configuration %1 est vide. Ce n'est pas normal."
 
-#: rc_configuration.cc:149
+#: rc_configuration.cc:150
 msgid "Config file %1 not saved"
 msgstr "Fichier de configuration %1 non sauvegardé"
 
-#: recent_sessions.cc:54
+#: recent_sessions.cc:55
 msgid "cannot open recent session file %1 (%2)"
 msgstr "Impossible d'ouvrir le fichier de session récente %1 (%2)"
 
-#: region_factory.cc:78 region_factory.cc:120 region_factory.cc:161
-#: region_factory.cc:203
+#: recent_sessions.cc:68 recent_sessions.cc:126
+msgid "Error reading recent session file %1 (%2)"
+msgstr ""
+
+#: recent_sessions.cc:113
+msgid "Cannot open recent template file %1 (%2)"
+msgstr ""
+
+#: recent_sessions.cc:176
+msgid "Error writing recent sessions file %1 (%2)"
+msgstr ""
+
+#: recent_sessions.cc:211
+msgid "Error writing saved template file %1 (%2)"
+msgstr ""
+
+#: region_factory.cc:78 region_factory.cc:121 region_factory.cc:162
+#: region_factory.cc:204
 msgid ""
 "programming error: RegionFactory::create() called with unknown Region type"
 msgstr ""
 
-#: region_factory.cc:565
+#: region_factory.cc:566
 msgid "%1 compound-%2 (%3)"
 msgstr ""
 
-#: region_factory.cc:567
+#: region_factory.cc:568
 msgid "%1 compound-%2.1 (%3)"
 msgstr ""
 
-#: region_factory.cc:629
+#: region_factory.cc:630
 msgid "cannot create new name for region \"%1\""
 msgstr "Impossible de créer un nouveau nom pour la région \"%1\""
 
-#: resampled_source.cc:102
+#: resampled_source.cc:107
 msgid "Import: %1"
-msgstr "Import : %1"
+msgstr "Import : %1"
 
-#: resampled_source.cc:132 srcfilesource.cc:75
+#: resampled_source.cc:136 srcfilesource.cc:75
 msgid "Import: src_new() failed : %1"
 msgstr ""
 
-#: return.cc:41
+#: return.cc:42
 msgid "return %1"
 msgstr ""
 
-#: route.cc:1218 route.cc:2701
+#: route.cc:862 route.cc:2797
 msgid "unknown Processor type \"%1\"; ignored"
 msgstr ""
 
-#: route.cc:1240
+#: route.cc:884
 msgid "processor could not be created. Ignored."
 msgstr ""
 
-#: route.cc:2126 route.cc:2355
+#: route.cc:2338 route.cc:2504
 msgid "Bad node sent to Route::set_state() [%1]"
 msgstr ""
 
-#: route.cc:2186
+#: route.cc:2395
 msgid "Pannable state found for route (%1) without a panner!"
 msgstr ""
 
-#: route.cc:2260 route.cc:2264 route.cc:2469 route.cc:2473
-msgid "badly formed order key string in state file! [%1] ... ignored."
+#: route.cc:3270
+msgid "Invalid Solo-Isolate propagation: from:%1 new:%2 - old:%3 = delta:%4"
+msgstr ""
+
+#: route.cc:4396
+msgid "Amp/Fader on Route '%1' went AWOL. Re-added."
 msgstr ""
 
-#: route.cc:2479
-msgid "Converting deprecated order key for %1 using Editor order %2"
+#: route.cc:4994
+msgid "lo"
 msgstr ""
 
-#: route_group.cc:459
+#: route.cc:4996
+msgid "mid"
+msgstr ""
+
+#: route.cc:4998
+msgid "hi"
+msgstr ""
+
+#: route.cc:5105
+msgid "Leveler"
+msgstr ""
+
+#: route.cc:5107
+msgid "Compressor"
+msgstr ""
+
+#: route.cc:5109 route.cc:5111
+msgid "Limiter"
+msgstr ""
+
+#: route.cc:5111
+msgid "Sidechain"
+msgstr ""
+
+#: route.cc:5114 route.cc:5116 route.cc:5133 route.cc:5135
+msgid "???"
+msgstr ""
+
+#: route.cc:5126
+msgid "Attk"
+msgstr ""
+
+#: route.cc:5128
+msgid "Ratio"
+msgstr ""
+
+#: route.cc:5131
+msgid "Rels"
+msgstr ""
+
+#: route_group.cc:507
 msgid "You cannot subgroup MIDI tracks at this time"
 msgstr ""
 
+#: route_group.cc:514
+msgid ""
+"You cannot subgroup tracks with different number of outputs at this time."
+msgstr ""
+
 #: rb_effect.cc:229 rb_effect.cc:269
 msgid "tempoize: error reading data from %1 at %2 (wanted %3, got %4)"
 msgstr ""
@@ -1676,109 +2185,126 @@ msgstr ""
 msgid "error writing tempo-adjusted data to %1"
 msgstr ""
 
-#: send.cc:61
+#: send.cc:62
 msgid "aux %1"
 msgstr "%1 Aux."
 
-#: send.cc:65
+#: send.cc:66
 msgid "send %1"
 msgstr "%1 Dép."
 
-#: send.cc:67
+#: send.cc:68
 msgid "programming error: send created using role %1"
 msgstr ""
 
-#: session.cc:357
+#: session.cc:348 session.cc:403
+msgid "Cannot connect to audio/midi engine"
+msgstr ""
+
+#: session.cc:358
+msgid "Session initialization failed"
+msgstr ""
+
+#: session.cc:374
+msgid "Failed to load template/snapshot state"
+msgstr ""
+
+#: session.cc:385
+msgid "Failed to load state"
+msgstr ""
+
+#: session.cc:409
+msgid "Cannot configure audio/midi engine with session parameters"
+msgstr ""
+
+#: session.cc:433
 msgid "Connect to engine"
 msgstr "Connecter au moteur"
 
-#: session.cc:362
+#: session.cc:484
 msgid "Session loading complete"
 msgstr "Session chargée."
 
-#: session.cc:434
+#: session.cc:575
 msgid "Set up LTC"
 msgstr "Régler LTC"
 
-#: session.cc:436
+#: session.cc:577
 msgid "Set up Click"
 msgstr "Régler le clic"
 
-#: session.cc:438
+#: session.cc:579
 msgid "Set up standard connections"
 msgstr ""
 
-#: session.cc:664
+#: session.cc:888
 msgid "could not setup Click I/O"
 msgstr ""
 
-#: session.cc:727
-#, fuzzy, c-format
+#: session.cc:951
+#, c-format
 msgid "out %s"
 msgstr "Sortie %s"
 
-#: session.cc:729
+#: session.cc:953
 #, c-format
 msgid "out %<PRIu32>"
 msgstr "Sortie %<PRIu32>"
 
-#: session.cc:744
+#: session.cc:968
 #, c-format
 msgid "out %<PRIu32>+%<PRIu32>"
 msgstr "Sortie %<PRIu32>+%<PRIu32>"
 
-#: session.cc:761
-#, fuzzy, c-format
+#: session.cc:985
+#, c-format
 msgid "in %s"
 msgstr "Entrée %s"
 
-#: session.cc:763
+#: session.cc:987
 #, c-format
 msgid "in %<PRIu32>"
 msgstr "Entrée %<PRIu32>"
 
-#: session.cc:778
+#: session.cc:1002
 #, c-format
 msgid "in %<PRIu32>+%<PRIu32>"
 msgstr "Entrée %<PRIu32>+%<PRIu32>"
 
-#: session.cc:852
+#: session.cc:1082
 msgid "cannot connect master output %1 to %2"
 msgstr "Connection de sortie Master %1 à %2 impossible"
 
-#: session.cc:921
-#, fuzzy
-msgid "Monitor"
-msgstr ": moniteur"
+#: session.cc:1170
+msgid "Cannot create monitor section. 'Monitor' Port name is not unique."
+msgstr ""
 
-#: session.cc:966
-#, fuzzy
+#: session.cc:1204 session.cc:1335
 msgid "cannot connect control input %1 to %2"
-msgstr "Connection de sortie Master %1 à %2 impossible"
+msgstr "Impossible de connecter l'entrée de contrôle %1 à %2"
 
-#: session.cc:986
+#: session.cc:1224 session.cc:1354
 msgid "The preferred I/O for the monitor bus (%1) cannot be found"
 msgstr "Préférences d'E/S du bus de Monitoring introuvables"
 
-#: session.cc:1017
-#, fuzzy
+#: session.cc:1255 session.cc:1385
 msgid "cannot connect control output %1 to %2"
-msgstr "Connection de sortie Master %1 à %2 impossible"
+msgstr "Impossible de connecter la sortie de contrôle %1 à %2"
 
-#: session.cc:1085
+#: session.cc:1443
 msgid "cannot create Auditioner: no auditioning of regions possible"
 msgstr ""
-"Création du bus d'Audition impossible : pas d'audition de région possible"
+"Création du bus d'Audition impossible : pas d'audition de région possible"
 
-#: session.cc:1270
+#: session.cc:1644
 msgid "Session: you can't use that location for auto punch (start <= end)"
-msgstr "Session : le Punch ne peut pas utiliser cet intervalle (début <= fin)"
+msgstr "Session : le Punch ne peut pas utiliser cet intervalle (début <= fin)"
 
-#: session.cc:1297
+#: session.cc:1671
 msgid "Session: you can't use that location for session start/end)"
 msgstr ""
 
-#: session.cc:1329
+#: session.cc:1703
 msgid ""
 "You cannot use this location for auto-loop because it has zero or negative "
 "length"
@@ -1786,19 +2312,31 @@ msgstr ""
 "La boucle ne peut utiliser cet intervalle car sa durée est inférieure ou "
 "égale à zéro"
 
-#: session.cc:1497
+#: session.cc:1886
 msgid "programming error: session range removed!"
 msgstr ""
 
-#: session.cc:1751
+#: session.cc:2158
 msgid "feedback loop setup between %1 and %2"
 msgstr ""
 
-#: session.cc:2047
+#: session.cc:2419
+msgid "Track "
+msgstr ""
+
+#: session.cc:2421
+msgid "Audio "
+msgstr ""
+
+#: session.cc:2426
+msgid "MIDI "
+msgstr ""
+
+#: session.cc:2500
 msgid "Session: could not create new midi track."
-msgstr "Session : création de nouvelle piste MIDI impossible."
+msgstr "Session : création de nouvelle piste MIDI impossible."
 
-#: session.cc:2053
+#: session.cc:2506
 msgid ""
 "No more JACK ports are available. You will need to stop %1 and restart JACK "
 "with more ports if you need this many tracks."
@@ -1806,86 +2344,91 @@ msgstr ""
 "Plus de port JACK disponible. Vous devez stopper %1 et redémarrer JACK avec "
 "plus de ports si vous avez besoin d'autant de pistes."
 
-#: session.cc:2239 session.cc:2242
-#, fuzzy
-msgid "Audio"
-msgstr "Audio"
+#: session.cc:2547 session.cc:2550
+msgid "Midi Bus"
+msgstr ""
 
-#: session.cc:2266 session.cc:2274 session.cc:2352 session.cc:2360
+#: session.cc:2572
+msgid "cannot configure new midi bus input"
+msgstr ""
+
+#: session.cc:2578
+msgid "cannot configure new midi bus output"
+msgstr ""
+
+#: session.cc:2592 session.cc:3137
+msgid "Session: could not create new audio route."
+msgstr "Session : impossible de créer un nouveau routage Audio."
+
+#: session.cc:3022 session.cc:3030 session.cc:3113 session.cc:3121
 msgid "cannot configure %1 in/%2 out configuration for new audio track"
 msgstr "Impossible de créer une piste Audio avec %1 Entrée(s) / %2 Sortie(s)"
 
-#: session.cc:2297
+#: session.cc:3050
 msgid "Session: could not create new audio track."
-msgstr "Session : impossible de créer une nouvelle piste Audio."
+msgstr "Session : impossible de créer une nouvelle piste Audio."
 
-#: session.cc:2330 session.cc:2333
-#, fuzzy
+#: session.cc:3088 session.cc:3091
 msgid "Bus"
 msgstr "Bus"
 
-#: session.cc:2383
-msgid "Session: could not create new audio route."
-msgstr "Session : impossible de créer un nouveau routage Audio."
-
-#: session.cc:2443 session.cc:2453
+#: session.cc:3207 session.cc:3217
 msgid "Session: UINT_MAX routes? impossible!"
 msgstr ""
 
-#: session.cc:2475
+#: session.cc:3293
 msgid "Session: cannot create track/bus from template description"
 msgstr ""
 
-#: session.cc:2501
+#: session.cc:3331
 msgid "Session: could not create new route from template"
 msgstr ""
 
-#: session.cc:2531
+#: session.cc:3365
 msgid "Adding new tracks/busses failed"
 msgstr "Echec de l'ajout de nouvelles pistes/bus"
 
-#: session.cc:3671
+#: session.cc:4784
 msgid "Merging embedded file %1: name collision AND md5 hash collision!"
 msgstr ""
 
-#: session.cc:3801 session.cc:3874
+#: session.cc:4914 session.cc:4987
 msgid "There are already %1 recordings for %2, which I consider too many."
 msgstr "Il y a déjà %1 prises pour %2, c'est trop !"
 
-#: session.cc:4316
+#: session.cc:5663
 msgid "send ID %1 appears to be in use already"
 msgstr ""
 
-#: session.cc:4328
+#: session.cc:5675
 msgid "aux send ID %1 appears to be in use already"
 msgstr ""
 
-#: session.cc:4340
+#: session.cc:5687
 msgid "return ID %1 appears to be in use already"
 msgstr ""
 
-#: session.cc:4352
+#: session.cc:5699
 msgid "insert ID %1 appears to be in use already"
 msgstr ""
 
-#: session.cc:4477
+#: session.cc:5825
 msgid "Cannot write a range where end <= start (e.g. %1 <= %2)"
 msgstr "Impossible d'établir un intervalle où fin <= début (ex. %1 <= %2)"
 
-#: session.cc:4486
+#: session.cc:5834
 msgid "Cannot write a range with no data."
 msgstr ""
 
-#: session.cc:4528
-#, fuzzy
+#: session.cc:5876
 msgid "cannot create new file \"%1\" for %2"
-msgstr "(%2) : création du répertoire %1 pour l'utilisateur %3 impossible"
+msgstr "Impossible de créer le nouveau fichier « %1 » pour %2"
 
-#: session_click.cc:161
+#: session_click.cc:162
 msgid "cannot open click soundfile %1 (%2)"
 msgstr "Fichier Audio %1 impossible à ouvrir pour le clic (%2)"
 
-#: session_click.cc:174
+#: session_click.cc:175
 msgid "cannot read data from click soundfile"
 msgstr "Données du fichier Audio du clic illisibles"
 
@@ -1924,127 +2467,151 @@ msgstr ""
 msgid "Could not save session options"
 msgstr ""
 
-#: session_directory.cc:59
+#: session_directory.cc:65
 msgid "Cannot create Session directory at path %1 Error: %2"
-msgstr "Création du répertoire de session à l'adresse % impossible Erreur : %2"
+msgstr "Création du répertoire de session à l'adresse % impossible Erreur : %2"
 
-#: session_directory.cc:76
+#: session_directory.cc:82
 msgid "Session subdirectory does not exist at path %1"
 msgstr "Aucun sous-répertoire de Session à l'adresse %1"
 
-#: session_events.cc:234
+#: session_directory.cc:161
+msgid ""
+"session-dir and session-name mismatch. Please use 'Menu > Session > Rename' "
+"in the future to rename sessions."
+msgstr ""
+
+#: session_directory.cc:167
+msgid ""
+"The session's interchange dir is tainted.\n"
+"There is more than one folder in '%1'.\n"
+"Please remove extra subdirs to reduce possible filename ambiguties."
+msgstr ""
+
+#: session_events.cc:229
 msgid "Session: cannot have two events of type %1 at the same frame (%2)."
-msgstr "Session : 2 évènements simultanés de type %1 impossibles (%2)."
+msgstr "Session : 2 évènements simultanés de type %1 impossibles (%2)."
 
-#: session_export.cc:125
+#: session_export.cc:152
 msgid "%1: cannot seek to %2 for export"
-msgstr "%1 : chercher à %2 impossible pour exporter"
+msgstr "%1 : chercher à %2 impossible pour exporter"
 
-#: session_export.cc:182
+#: session_export.cc:216
 msgid "Export ended unexpectedly: %1"
-msgstr "Export inopinément fini : %1"
+msgstr "Export inopinément fini : %1"
 
 #: session_ltc.cc:221
 msgid ""
 "LTC encoder: invalid framerate - LTC encoding is disabled for the remainder "
 "of this session."
 msgstr ""
-"Encodeur LTC : FPS invalide - Encodage LTC désactivé pour cette session."
+"Encodeur LTC : FPS invalide - Encodage LTC désactivé pour cette session."
 
-#: session_midi.cc:520
+#: session_midi.cc:570
 msgid "Session: cannot send quarter-frame MTC message (%1)"
 msgstr ""
 
-#: session_playlists.cc:378 session_playlists.cc:397
+#: session_playlists.cc:405 session_playlists.cc:424
 msgid "Session: cannot create Playlist from XML description."
 msgstr ""
 
-#: session_process.cc:136
+#: session_process.cc:159
 msgid "Session: error in no roll for %1"
 msgstr ""
 
-#: session_process.cc:1174
+#: session_process.cc:1202
 msgid "Programming error: illegal event type in process_event (%1)"
 msgstr ""
 
-#: session_state.cc:179
+#: session_state.cc:194
 msgid "solo cut control (dB)"
 msgstr ""
 
-#: session_state.cc:203
+#: session_state.cc:216
 msgid "Set block size and sample rate"
 msgstr "Définir la taille et la fréquence des échantillons"
 
-#: session_state.cc:208
+#: session_state.cc:221
 msgid "Using configuration"
 msgstr "Utiliser la configuration"
 
-#: session_state.cc:331
+#: session_state.cc:348
 msgid "Reset Remote Controls"
 msgstr "RàZ des Controleurs Distants..."
 
-#: session_state.cc:423
+#: session_state.cc:377 session_state.cc:409
+msgid "Filling playback buffers"
+msgstr ""
+
+#: session_state.cc:475
 msgid "Session: cannot create session peakfile folder \"%1\" (%2)"
-msgstr "Session : création du répertoire Pics-Audio \"%1\" impossible (%2)"
+msgstr "Session : création du répertoire Pics-Audio \"%1\" impossible (%2)"
 
-#: session_state.cc:430
+#: session_state.cc:482
 msgid "Session: cannot create session sounds dir \"%1\" (%2)"
-msgstr "Session : création du répertoire Audio \"%1\" impossible (%2)"
+msgstr "Session : création du répertoire Audio \"%1\" impossible (%2)"
 
-#: session_state.cc:437
+#: session_state.cc:489
 msgid "Session: cannot create session midi dir \"%1\" (%2)"
-msgstr "Session : création du répertoire MIDI \"%1\" impossible (%2)"
+msgstr "Session : création du répertoire MIDI \"%1\" impossible (%2)"
 
-#: session_state.cc:444
+#: session_state.cc:496
 msgid "Session: cannot create session dead sounds folder \"%1\" (%2)"
-msgstr "Session : création du répertoire Nettoyage \"%1\" impossible (%2)"
+msgstr "Session : création du répertoire Nettoyage \"%1\" impossible (%2)"
 
-#: session_state.cc:451
+#: session_state.cc:503
 msgid "Session: cannot create session export folder \"%1\" (%2)"
-msgstr "Session : création du répertoire Export \"%1\" impossible (%2)"
+msgstr "Session : création du répertoire Export \"%1\" impossible (%2)"
 
-#: session_state.cc:458
+#: session_state.cc:510
 msgid "Session: cannot create session analysis folder \"%1\" (%2)"
-msgstr "Session : création du répertoire Analyse \"%1\" impossible (%2)"
+msgstr "Session : création du répertoire Analyse \"%1\" impossible (%2)"
 
-#: session_state.cc:465
+#: session_state.cc:517
 msgid "Session: cannot create session plugins folder \"%1\" (%2)"
-msgstr "Session : création du répertoire Plugins \"%1\" impossible (%2)"
+msgstr "Session : création du répertoire Plugins \"%1\" impossible (%2)"
 
-#: session_state.cc:472
+#: session_state.cc:524
 msgid "Session: cannot create session externals folder \"%1\" (%2)"
-msgstr "Session : création du répertoire Externes \"%1\" impossible (%2)"
+msgstr "Session : création du répertoire Externes \"%1\" impossible (%2)"
 
-#: session_state.cc:486
+#: session_state.cc:538
 msgid "Session: cannot create session folder \"%1\" (%2)"
-msgstr "Session : création du répertoire \"%1\" impossible (%2)"
+msgstr "Session : création du répertoire \"%1\" impossible (%2)"
+
+#: session_state.cc:569
+msgid "Error reading session template file %1 (%2)"
+msgstr ""
 
-#: session_state.cc:520
+#: session_state.cc:584
+msgid "Error writing session template file %1 (%2)"
+msgstr ""
+
+#: session_state.cc:601
 msgid "Could not open %1 for writing session template"
 msgstr ""
 
-#: session_state.cc:526
+#: session_state.cc:608
 msgid "Could not open session template %1 for reading"
 msgstr ""
 
-#: session_state.cc:545
-#, fuzzy
-msgid "Master"
-msgstr "Bus Master"
+#: session_state.cc:626
+msgid "Loop"
+msgstr ""
 
-#: session_state.cc:606
+#: session_state.cc:707
 msgid "Could not remove pending capture state at path \"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:630
+#: session_state.cc:731
 msgid "could not rename snapshot %1 to %2 (%3)"
 msgstr "Impossible de renommer le cliché %1 en %2 (%3)"
 
-#: session_state.cc:658
+#: session_state.cc:759
 msgid "Could not remove session file at path \"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:685
+#: session_state.cc:788
 msgid ""
 "the %1 audio engine is not connected and state saving would lose all I/O "
 "connections. Session not saved"
@@ -2053,340 +2620,375 @@ msgstr ""
 "toutes les connections E/S.\n"
 "Session non sauvegardée."
 
-#: session_state.cc:736
+#: session_state.cc:856
 msgid "state could not be saved to %1"
 msgstr ""
 
-#: session_state.cc:738 session_state.cc:749
+#: session_state.cc:858 session_state.cc:871
 msgid "Could not remove temporary session file at path \"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:746
+#: session_state.cc:868
 msgid "could not rename temporary session file %1 to %2 (%3)"
 msgstr ""
 
-#: session_state.cc:814
+#: session_state.cc:942
 msgid "%1: session file \"%2\" doesn't exist!"
-msgstr "%1 : le fichier de session \"%2\" n'existe pas !"
+msgstr "%1 : le fichier de session \"%2\" n'existe pas !"
 
-#: session_state.cc:826
-#, fuzzy
+#: session_state.cc:954
 msgid "Could not understand session file %1"
-msgstr "Ce fichier de session n'a pu être lu!"
+msgstr "Impossible d'interpréter le fichier de session %1"
 
-#: session_state.cc:835
-#, fuzzy
+#: session_state.cc:963
 msgid "Session file %1 is not a session"
-msgstr "Type de fichier inconnu pour la session %1"
+msgstr "Le fichier %1 n'est pas un fichier de session"
 
-#: session_state.cc:1147
+#: session_state.cc:1332
 msgid "programming error: Session: incorrect XML node sent to set_state()"
 msgstr ""
 
-#: session_state.cc:1201
+#: session_state.cc:1410
 msgid "Session: XML state has no options section"
 msgstr ""
 
-#: session_state.cc:1206
+#: session_state.cc:1415
 msgid "Session: XML state has no metadata section"
 msgstr ""
 
-#: session_state.cc:1217
+#: session_state.cc:1426
 msgid "Session: XML state has no sources section"
 msgstr ""
 
-#: session_state.cc:1224
+#: session_state.cc:1433
 msgid "Session: XML state has no Tempo Map section"
 msgstr ""
 
-#: session_state.cc:1231
+#: session_state.cc:1440
 msgid "Session: XML state has no locations section"
 msgstr ""
 
-#: session_state.cc:1244
+#: session_state.cc:1453
 msgid "Session: XML state has no Regions section"
 msgstr ""
 
-#: session_state.cc:1251
+#: session_state.cc:1460
 msgid "Session: XML state has no playlists section"
 msgstr ""
 
-#: session_state.cc:1271
+#: session_state.cc:1480
 msgid "Session: XML state has no bundles section"
 msgstr ""
 
-#: session_state.cc:1283
+#: session_state.cc:1492
 msgid "Session: XML state has no diskstreams section"
 msgstr ""
 
-#: session_state.cc:1291
+#: session_state.cc:1504
 msgid "Session: XML state has no routes section"
 msgstr ""
 
-#: session_state.cc:1303
+#: session_state.cc:1520
 msgid "Session: XML state has no route groups section"
 msgstr ""
 
-#: session_state.cc:1312
+#: session_state.cc:1529
 msgid "Session: XML state has no edit groups section"
 msgstr ""
 
-#: session_state.cc:1319
+#: session_state.cc:1536
 msgid "Session: XML state has no mix groups section"
 msgstr ""
 
-#: session_state.cc:1327
+#: session_state.cc:1544
 msgid "Session: XML state has no click section"
 msgstr ""
 
-#: session_state.cc:1373
+#: session_state.cc:1606
 msgid "Session: cannot create Route from XML description."
 msgstr ""
 
-#: session_state.cc:1377
+#: session_state.cc:1610
 msgid "Loaded track/bus %1"
-msgstr "Chargement de piste/bus : %1..."
+msgstr "Chargement de piste/bus : %1..."
 
-#: session_state.cc:1382
+#: session_state.cc:1615
 msgid "Tracks/busses loaded;  Adding to Session"
 msgstr ""
 
-#: session_state.cc:1386
+#: session_state.cc:1619
 msgid "Finished adding tracks/busses"
 msgstr ""
 
-#: session_state.cc:1485
+#: session_state.cc:1709
 msgid "Could not find diskstream for route"
 msgstr ""
 
-#: session_state.cc:1545
+#: session_state.cc:1760
 msgid "Session: cannot create Region from XML description."
 msgstr ""
 
-#: session_state.cc:1549
+#: session_state.cc:1764
 msgid "Can not load state for region '%1'"
 msgstr "Etat de la région '%1' inchargeable"
 
-#: session_state.cc:1585
+#: session_state.cc:1800
 msgid "Regions in compound description not found (ID's %1 and %2): ignored"
 msgstr ""
 
-#: session_state.cc:1613
+#: session_state.cc:1828
 msgid "Nested source has no ID info in session file! (ignored)"
 msgstr ""
 
-#: session_state.cc:1625
+#: session_state.cc:1840
 msgid "Cannot reconstruct nested source for region %1"
 msgstr ""
 
-#: session_state.cc:1687
+#: session_state.cc:1902
 msgid "Session: XMLNode describing a AudioRegion is incomplete (no source)"
 msgstr ""
 
-#: session_state.cc:1695 session_state.cc:1716 session_state.cc:1736
+#: session_state.cc:1910 session_state.cc:1931 session_state.cc:1951
 msgid ""
 "Session: XMLNode describing a AudioRegion references an unknown source id =%1"
 msgstr ""
 
-#: session_state.cc:1701 session_state.cc:1722 session_state.cc:1742
+#: session_state.cc:1916 session_state.cc:1937 session_state.cc:1957
 msgid ""
 "Session: XMLNode describing a AudioRegion references a non-audio source id ="
 "%1"
 msgstr ""
 
-#: session_state.cc:1765
+#: session_state.cc:1980
 msgid ""
 "Session: XMLNode describing an AudioRegion is missing some master sources; "
 "ignored"
 msgstr ""
 
-#: session_state.cc:1799
+#: session_state.cc:2014
 msgid "Session: XMLNode describing a MidiRegion is incomplete (no source)"
 msgstr ""
 
-#: session_state.cc:1807
+#: session_state.cc:2022
 msgid ""
 "Session: XMLNode describing a MidiRegion references an unknown source id =%1"
 msgstr ""
 
-#: session_state.cc:1813
+#: session_state.cc:2028
 msgid ""
 "Session: XMLNode describing a MidiRegion references a non-midi source id =%1"
 msgstr ""
 
-#: session_state.cc:1872
+#: session_state.cc:2101
 msgid "Session: cannot create Source from XML description."
 msgstr ""
 
-#: session_state.cc:1880
+#: session_state.cc:2109
 msgid ""
 "A external MIDI file is missing. %1 cannot currently recover from missing "
 "external MIDI files"
 msgstr ""
 
-#: session_state.cc:1962
+#: session_state.cc:2191
 msgid "Found a sound file that cannot be used by %1. Talk to the programmers."
 msgstr ""
 
-#: session_state.cc:1979
-#, fuzzy
+#: session_state.cc:2212
 msgid "Could not create templates directory \"%1\" (%2)"
-msgstr "Création du dossier de formats d'export %1 impossible : %2"
+msgstr "Impossible de créer le dossier de modèles « %1 » (%2)"
 
-#: session_state.cc:1992
+#: session_state.cc:2224
 msgid "Template \"%1\" already exists - new version not created"
 msgstr ""
 
-#: session_state.cc:1998
+#: session_state.cc:2230
 msgid "Could not create directory for Session template\"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:2008
+#: session_state.cc:2259
 msgid "template not saved"
 msgstr "Modèle non sauvegardé"
 
-#: session_state.cc:2018
-msgid "Could not create directory for Session template plugin state\"%1\" (%2)"
+#: session_state.cc:2501
+msgid "Unknown node \"%1\" found in Bundles list from session file"
 msgstr ""
 
-#: session_state.cc:2261
-msgid "Unknown node \"%1\" found in Bundles list from session file"
+#: session_state.cc:2969
+msgid "Cannot cleanup peak-files for read-only session."
+msgstr ""
+
+#: session_state.cc:2973
+msgid "Cannot cleanup peak-files while recording"
+msgstr ""
+
+#: session_state.cc:2996
+msgid ""
+"Timeout waiting for peak-file creation to terminate before cleanup, please "
+"try again later."
 msgstr ""
 
-#: session_state.cc:2834
+#: session_state.cc:3261
 msgid "Session: cannot create dead file folder \"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:2873
+#: session_state.cc:3296
 msgid "cannot rename unused file source from %1 to %2 (%3)"
 msgstr ""
 
-#: session_state.cc:2891
+#: session_state.cc:3312
 msgid "cannot remove peakfile %1 for %2 (%3)"
 msgstr ""
 
-#: session_state.cc:3204
+#: session_state.cc:3633
 msgid "could not backup old history file, current history not saved"
 msgstr ""
 
-#: session_state.cc:3213
+#: session_state.cc:3642
 msgid "history could not be saved to %1"
 msgstr ""
 
-#: session_state.cc:3216
+#: session_state.cc:3645
 msgid "Could not remove history file at path \"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:3220
+#: session_state.cc:3649
 msgid "could not restore history file from backup %1 (%2)"
 msgstr ""
 
-#: session_state.cc:3245
+#: session_state.cc:3674
 msgid "%1: no history file \"%2\" for this session."
-msgstr "%1 : pas de fichier d'historique \"%2\" pour cette session"
+msgstr "%1 : pas de fichier d'historique \"%2\" pour cette session"
 
-#: session_state.cc:3251
+#: session_state.cc:3680
 msgid "Could not understand session history file \"%1\""
 msgstr ""
 
-#: session_state.cc:3293
+#: session_state.cc:3722
 msgid "Failed to downcast MidiSource for NoteDiffCommand"
 msgstr ""
 
-#: session_state.cc:3304
+#: session_state.cc:3733
 msgid "Failed to downcast MidiSource for SysExDiffCommand"
 msgstr ""
 
-#: session_state.cc:3315
+#: session_state.cc:3744
 msgid "Failed to downcast MidiSource for PatchChangeDiffCommand"
 msgstr ""
 
-#: session_state.cc:3323
+#: session_state.cc:3752
 msgid "Couldn't figure out how to make a Command out of a %1 XMLNode."
 msgstr ""
 
-#: session_state.cc:3559
+#: session_state.cc:3990
 msgid "Session: unknown diskstream type in XML"
 msgstr ""
 
-#: session_state.cc:3564
+#: session_state.cc:3995
 msgid "Session: could not load diskstream via XML state"
 msgstr ""
 
-#: session_state.cc:3688 session_state.cc:3716 session_state.cc:3729
-#: session_state.cc:3744
+#: session_state.cc:4092
+msgid "Cannot rename read-only session."
+msgstr ""
+
+#: session_state.cc:4096
+msgid "Cannot rename session while recording"
+msgstr ""
+
+#: session_state.cc:4181 session_state.cc:4182 session_state.cc:4224
+#: session_state.cc:4228
 msgid "renaming %s as %2 failed (%3)"
 msgstr ""
 
+#: session_state.cc:4244 session_state.cc:4245 session_state.cc:4259
+#: session_state.cc:4260
+msgid "renaming %1 as %2 failed (%3)"
+msgstr ""
+
+#: session_state.cc:4571
+msgid "Cannot create new session folder %1"
+msgstr ""
+
+#: session_state.cc:4633 session_state.cc:4708
+msgid ""
+"\n"
+"copying \"%1\" failed !"
+msgstr ""
+
+#: session_state.cc:4906
+msgid "unknown reason"
+msgstr ""
+
 #: session_time.cc:214
 msgid "Unknown transport state %1 in sync callback"
 msgstr ""
 
-#: session_transport.cc:171
+#: session_transport.cc:177
 msgid "Cannot loop - no loop range defined"
 msgstr "Boucle impossible - pas d'intervalle défini"
 
-#: session_transport.cc:833
+#: session_transport.cc:968
 msgid ""
 "Seamless looping cannot be supported while %1 is using JACK transport.\n"
 "Recommend changing the configured options"
 msgstr ""
 "Impossible de rendre le bouclage inaudible si %1 utilise le transport JACK.\n"
-"Conseil : changer les options configurées"
+"Conseil : changer les options configurées"
 
-#: session_transport.cc:915
+#: session_transport.cc:1050
 msgid "Locate called for negative sample position - ignored"
 msgstr ""
 
-#: session_transport.cc:1272
+#: session_transport.cc:1401
 msgid ""
 "Global varispeed cannot be supported while %1 is connected to JACK transport "
 "control"
 msgstr ""
 "Le Varispeed est désactivé avec %1 connecté au controle de transport JACK"
 
-#: smf_source.cc:344
+#: slavable.cc:100
+msgid "Master #%1 not found, assignment lost"
+msgstr ""
+
+#: smf_source.cc:350
 msgid "Unable to read event prefix, corrupt MIDI ring"
 msgstr ""
 
-#: smf_source.cc:357
+#: smf_source.cc:363
 msgid "Event has time and size but no body, corrupt MIDI ring"
 msgstr ""
 
-#: smf_source.cc:363
+#: smf_source.cc:369
 msgid "Event time is before MIDI source position"
 msgstr ""
 
-#: smf_source.cc:409
+#: smf_source.cc:417
 msgid ""
 "Skipping event with unordered beat time %1 < %2 (off by %3 beats, %4 ticks)"
 msgstr ""
 
-#: smf_source.cc:453
+#: smf_source.cc:461
 msgid "Skipping event with unordered frame time %1 < %2"
 msgstr ""
 
-#: smf_source.cc:518
+#: smf_source.cc:526
 msgid "cannot open MIDI file %1 for write"
 msgstr ""
 
 #: sndfile_helpers.cc:34
-#, fuzzy
 msgid "WAV"
 msgstr "WAV"
 
 #: sndfile_helpers.cc:35
-#, fuzzy
 msgid "AIFF"
 msgstr "AIFF"
 
 #: sndfile_helpers.cc:36
-#, fuzzy
 msgid "CAF"
 msgstr "CAF"
 
 #: sndfile_helpers.cc:37
-msgid "W64 (64 bit WAV)"
+msgid "W64 (64-bit WAV)"
 msgstr ""
 
 #: sndfile_helpers.cc:38
@@ -2394,29 +2996,24 @@ msgid "FLAC"
 msgstr ""
 
 #: sndfile_helpers.cc:39
-#, fuzzy
 msgid "Ogg/Vorbis"
-msgstr "Options Ogg Vorbis"
+msgstr "Ogg/Vorbis"
 
 #: sndfile_helpers.cc:40
-#, fuzzy
 msgid "raw (no header)"
-msgstr "Modèle d'en-tête"
+msgstr "brut (sans en-tête)"
 
 #: sndfile_helpers.cc:45
-#, fuzzy
 msgid ".wav"
-msgstr "WAV"
+msgstr ".wav"
 
 #: sndfile_helpers.cc:46
-#, fuzzy
 msgid ".aiff"
-msgstr "AIFF"
+msgstr ".aiff"
 
 #: sndfile_helpers.cc:47
-#, fuzzy
 msgid ".caf"
-msgstr "CAF"
+msgstr ".caf"
 
 #: sndfile_helpers.cc:48
 msgid ".w64"
@@ -2435,24 +3032,24 @@ msgid ".raw"
 msgstr ""
 
 #: sndfile_helpers.cc:66
-msgid "Signed 16 bit PCM"
+msgid "Signed 16-bit PCM"
 msgstr ""
 
 #: sndfile_helpers.cc:67
-msgid "Signed 24 bit PCM"
+msgid "Signed 24-bit PCM"
 msgstr ""
 
 #: sndfile_helpers.cc:68
-msgid "Signed 32 bit PCM"
+msgid "Signed 32-bit PCM"
 msgstr ""
 
 #: sndfile_helpers.cc:69
-msgid "Signed 8 bit PCM"
+msgid "Signed 8-bit PCM"
 msgstr ""
 
 #: sndfile_helpers.cc:70
-msgid "32 bit float"
-msgstr "32 bits à virgule flottante"
+msgid "32-bit float"
+msgstr ""
 
 #: sndfile_helpers.cc:83
 msgid "Little-endian (Intel)"
@@ -2462,90 +3059,108 @@ msgstr ""
 msgid "Big-endian (PowerPC)"
 msgstr ""
 
-#: sndfilesource.cc:260
-#, fuzzy
+#: sndfilesource.cc:282
+msgid "SndFileSource: cannot open file \"%1\" for %2"
+msgstr ""
+
+#: sndfilesource.cc:300
 msgid "SndFileSource: cannot open file \"%1\" for %2 (%3)"
-msgstr "Impossible d'ouvrir le fichier de session récente %1 (%2)"
+msgstr ""
 
-#: sndfilesource.cc:268
+#: sndfilesource.cc:308
 msgid ""
 "SndFileSource: file only contains %1 channels; %2 is invalid as a channel "
 "number"
 msgstr ""
 
-#: sndfilesource.cc:322 sndfilesource.cc:655
+#: sndfilesource.cc:323
+msgid "Cannot mark RF64 audio file for automatic downgrade to WAV: %1"
+msgstr ""
+
+#: sndfilesource.cc:375 sndfilesource.cc:705
 msgid ""
 "cannot set broadcast info for audio file %1 (%2); dropping broadcast info "
 "for this file"
 msgstr ""
 
-#: sndfilesource.cc:368
-msgid "could not allocate file %1 for reading."
+#: sndfilesource.cc:418
+msgid "could not open file %1 for reading."
 msgstr ""
 
-#: sndfilesource.cc:403
+#: sndfilesource.cc:453
 msgid "SndFileSource: could not seek to frame %1 within %2 (%3)"
 msgstr ""
 
-#: sndfilesource.cc:412
+#: sndfilesource.cc:462
 msgid ""
 "SndFileSource: @ %1 could not read %2 within %3 (%4) (len = %5, ret was %6)"
 msgstr ""
 
-#: sndfilesource.cc:454 sndfilesource.cc:483
+#: sndfilesource.cc:504 sndfilesource.cc:533
 msgid "attempt to write a non-writable audio file source (%1)"
 msgstr ""
 
-#: sndfilesource.cc:459 utils.cc:579 utils.cc:603 utils.cc:617 utils.cc:636
-#, fuzzy
+#: sndfilesource.cc:509 utils.cc:564 utils.cc:588 utils.cc:602 utils.cc:621
 msgid "programming error: %1 %2"
-msgstr "erreur de programmation: %1 %2"
+msgstr "erreur de programmation : %1 %2"
 
-#: sndfilesource.cc:586 sndfilesource.cc:604
+#: sndfilesource.cc:636 sndfilesource.cc:654
 msgid "attempt to flush a non-writable audio file source (%1)"
 msgstr ""
 
-#: sndfilesource.cc:591
+#: sndfilesource.cc:641
 msgid "could not allocate file %1 to write header"
 msgstr ""
 
-#: sndfilesource.cc:609
+#: sndfilesource.cc:659
 msgid "could not allocate file %1 to flush contents"
 msgstr ""
 
-#: sndfilesource.cc:621
+#: sndfilesource.cc:671
 msgid ""
 "attempt to store broadcast info in a non-writable audio file source (%1)"
 msgstr ""
 
-#: sndfilesource.cc:626
+#: sndfilesource.cc:676
 msgid "attempt to set BWF info for an un-opened audio file source (%1)"
 msgstr ""
 
-#: sndfilesource.cc:670
+#: sndfilesource.cc:720
 msgid "%1: cannot seek to %2 (libsndfile error: %3)"
-msgstr "%1 : chercher à %2 impossible (erreur libsndfile : %3)"
+msgstr "%1 : chercher à %2 impossible (erreur libsndfile : %3)"
 
-#: sndfilesource.cc:780
+#: sndfilesource.cc:830
 msgid "SndFileSource: \"%1\" bad read retval: %2 of %5 (%3: %4)"
 msgstr ""
 
-#: sndfilesource.cc:793 sndfilesource.cc:843 sndfilesource.cc:850
+#: sndfilesource.cc:843 sndfilesource.cc:893 sndfilesource.cc:900
 msgid "SndFileSource: \"%1\" bad write (%2)"
 msgstr ""
 
-#: sndfilesource.cc:873
+#: sndfilesource.cc:923
 msgid ""
 "Filesource: start time is already set for existing file (%1): Cannot change "
 "start time."
 msgstr ""
 
+#: sndfilesource.cc:982
+msgid "SndFileSource: cannot open file \"%1\" for reading"
+msgstr ""
+
+#: solo_control.cc:199
+msgid "Cleared Explicit solo: %1\n"
+msgstr ""
+
+#: solo_control.cc:202
+msgid "Cleared Implicit solo: %1 up:%2 down:%3\n"
+msgstr ""
+
 #: soundcloud_upload.cc:129
 msgid ""
 "Upload to Soundcloud failed.  Perhaps your email or password are incorrect?\n"
 msgstr ""
 
-#: source_factory.cc:374
+#: source_factory.cc:390
 msgid "Recovery attempted on a MIDI file - not implemented"
 msgstr ""
 
@@ -2561,7 +3176,7 @@ msgstr ""
 msgid "Speaker information is missing distance - speaker ignored"
 msgstr ""
 
-#: srcfilesource.cc:134
+#: srcfilesource.cc:142
 msgid "SrcFileSource: %1"
 msgstr ""
 
@@ -2569,67 +3184,93 @@ msgstr ""
 msgid "Cannot compile tape track regexp for use (%1)"
 msgstr ""
 
-#: tempo.cc:80
-msgid "TempoSection XML node has no \"start\" property"
+#: tempo.cc:98
+msgid "Legacy session detected. TempoSection XML node will be altered."
+msgstr ""
+
+#: tempo.cc:104
+msgid "TempoSection XML node has an illegal \"pulse\" value"
 msgstr ""
 
-#: tempo.cc:88
-msgid "TempoSection XML node has an illegal \"start\" value"
+#: tempo.cc:112
+msgid "TempoSection XML node has an illegal \"frame\" value"
 msgstr ""
 
-#: tempo.cc:95
+#: tempo.cc:119
 msgid "TempoSection XML node has no \"beats-per-minute\" property"
 msgstr ""
 
-#: tempo.cc:100
+#: tempo.cc:124
 msgid "TempoSection XML node has an illegal \"beats_per_minute\" value"
 msgstr ""
 
-#: tempo.cc:109
+#: tempo.cc:133
 msgid "TempoSection XML node has an illegal \"note-type\" value"
 msgstr ""
 
-#: tempo.cc:115
+#: tempo.cc:139
 msgid "TempoSection XML node has no \"movable\" property"
 msgstr ""
 
-#: tempo.cc:125
-msgid "TempoSection XML node has an illegal \"bar-offset\" value"
+#: tempo.cc:146
+msgid "TempoSection XML node has no \"active\" property"
 msgstr ""
 
-#: tempo.cc:202
-msgid "MeterSection XML node has no \"start\" property"
+#: tempo.cc:471
+msgid "MeterSection XML node has an illegal \"start\" value"
 msgstr ""
 
-#: tempo.cc:210
-msgid "MeterSection XML node has an illegal \"start\" value"
+#: tempo.cc:474
+msgid "Legacy session detected - MeterSection XML node will be altered."
+msgstr ""
+
+#: tempo.cc:481
+msgid "MeterSection XML node has an illegal \"pulse\" value"
+msgstr ""
+
+#: tempo.cc:488
+msgid "MeterSection XML node has an illegal \"beat\" value"
+msgstr ""
+
+#: tempo.cc:495
+msgid "MeterSection XML node has no \"bbt\" property"
+msgstr ""
+
+#: tempo.cc:500
+msgid "MeterSection XML node has an illegal \"bbt\" value"
 msgstr ""
 
-#: tempo.cc:220
+#: tempo.cc:509
+msgid "MeterSection XML node has an illegal \"frame\" value"
+msgstr ""
+
+#: tempo.cc:519
 msgid ""
 "MeterSection XML node has no \"beats-per-bar\" or \"divisions-per-bar\" "
 "property"
 msgstr ""
 
-#: tempo.cc:226
-msgid ""
-"MeterSection XML node has an illegal \"beats-per-bar\" or \"divisions-per-bar"
-"\" value"
+#: tempo.cc:524
+msgid "MeterSection XML node has an illegal \"divisions-per-bar\" value"
 msgstr ""
 
-#: tempo.cc:231
+#: tempo.cc:529
 msgid "MeterSection XML node has no \"note-type\" property"
 msgstr ""
 
-#: tempo.cc:236
+#: tempo.cc:533
 msgid "MeterSection XML node has an illegal \"note-type\" value"
 msgstr ""
 
-#: tempo.cc:241
+#: tempo.cc:538
 msgid "MeterSection XML node has no \"movable\" property"
 msgstr ""
 
-#: tempo.cc:388
+#: tempo.cc:545
+msgid "MeterSection XML node has no \"lock-style\" property"
+msgstr ""
+
+#: tempo.cc:821
 msgid ""
 "Meter changes can only be positioned on the first beat of a bar. Moving from "
 "%1 to %2"
@@ -2637,38 +3278,42 @@ msgstr ""
 "Les changements de Rythme sont réservés aux premiers temps de mesures. "
 "Déplacement de %1 à %2"
 
-#: tempo.cc:650
+#: tempo.cc:1156
 msgid "no tempo sections defined in tempo map - cannot change tempo @ %1"
 msgstr ""
 
-#: tempo.cc:680 tempo.cc:696 tempo.cc:712 tempo.cc:728
-msgid "programming error: no tempo section in tempo map!"
+#: tempo.cc:1186
+msgid "programming error: no meter section in tempo map!"
 msgstr ""
 
-#: tempo.cc:846 tempo.cc:1827
-msgid "programming error: unhandled MetricSection type"
+#: tempo.cc:1204 tempo.cc:1227 tempo.cc:1248
+msgid "programming error: no tempo section in tempo map!"
 msgstr ""
 
-#: tempo.cc:1142
+#: tempo.cc:1959 tempo.cc:1987
 msgid "tempo map asked for BBT time at frame %1\n"
 msgstr ""
 
-#: tempo.cc:1185
+#: tempo.cc:2054
 msgid "tempo map asked for frame time at bar < 1  (%1)\n"
 msgstr ""
 
-#: tempo.cc:1642 tempo.cc:1656
+#: tempo.cc:3472 tempo.cc:3485
 msgid "Tempo map: could not set new state, restoring old one."
 msgstr ""
 
-#: tempo.cc:1677
+#: tempo.cc:3522 tempo.cc:3523
 msgid "Multiple meter definitions found at %1"
 msgstr "Plusieurs définitions de Rythme trouvées à %1"
 
-#: tempo.cc:1682
+#: tempo.cc:3528 tempo.cc:3529
 msgid "Multiple tempo definitions found at %1"
 msgstr "Plusieurs définitions de Tempo trouvées à %1"
 
+#: tempo.cc:3715
+msgid "programming error: unhandled MetricSection type"
+msgstr ""
+
 #: tempo_map_importer.cc:52
 msgid "Tempo map"
 msgstr "Table de tempo"
@@ -2679,7 +3324,7 @@ msgstr "Table de Tempo"
 
 #: tempo_map_importer.cc:80
 msgid "Tempo marks: "
-msgstr "Repères de Tempo : "
+msgstr "Repères de Tempo : "
 
 #: tempo_map_importer.cc:80
 msgid ""
@@ -2687,7 +3332,7 @@ msgid ""
 "Meter marks: "
 msgstr ""
 "\n"
-"Repères de Rythme : "
+"Repères de Rythme : "
 
 #: tempo_map_importer.cc:89
 msgid ""
@@ -2697,6 +3342,14 @@ msgstr ""
 "Vous allez remplacer la table de Tempo actuelle !\n"
 "Etes vous sur de le vouloir ?"
 
+#: unknown_processor.cc:86
+msgid "Using plugin-stub with unknown i/o configuration for: "
+msgstr ""
+
+#: unknown_processor.cc:107
+msgid "Using plugin-stub with mismatching i/o configuration for: "
+msgstr ""
+
 #: user_bundle.cc:47
 msgid "Node for Bundle has no \"name\" property"
 msgstr ""
@@ -2718,68 +3371,110 @@ msgstr ""
 msgid "Node for Port has no \"name\" property"
 msgstr ""
 
-#: utils.cc:422 utils.cc:451
-#, fuzzy
+#: utils.cc:412 utils.cc:441
 msgid "Splice"
-msgstr "Collant"
+msgstr ""
 
-#: utils.cc:424 utils.cc:441
-#, fuzzy
+#: utils.cc:414 utils.cc:431
 msgid "Slide"
-msgstr "Glissant"
+msgstr "Glisser"
 
-#: utils.cc:426 utils.cc:447
+#: utils.cc:416 utils.cc:437
 msgid "Ripple"
 msgstr ""
 
-#: utils.cc:428 utils.cc:444
-#, fuzzy
+#: utils.cc:418 utils.cc:434
 msgid "Lock"
 msgstr "Verrouiller"
 
-#: utils.cc:431
+#: utils.cc:421
 msgid "programming error: unknown edit mode string \"%1\""
 msgstr ""
 
-#: utils.cc:458 utils.cc:490
+#: utils.cc:448 utils.cc:484
 msgid "MIDI Timecode"
 msgstr "Timecode MIDI"
 
-#: utils.cc:458 utils.cc:488
+#: utils.cc:448 utils.cc:482
 #, fuzzy
 msgid "MTC"
 msgstr "Entrée MTC"
 
-#: utils.cc:462 utils.cc:497
+#: utils.cc:452 utils.cc:491
 msgid "MIDI Clock"
 msgstr "Horloge MIDI"
 
-#: utils.cc:466 utils.cc:484 utils.cc:504
+#: utils.cc:456 utils.cc:478 utils.cc:498
 #, fuzzy
 msgid "JACK"
-msgstr "Paramètres JACK de Transport et Timecode"
+msgstr "Transport JACK"
 
-#: utils.cc:470
+#: utils.cc:460 utils.cc:495
+#, fuzzy
+msgid "LTC"
+msgstr "Entrée LTC"
+
+#: utils.cc:464
 msgid "programming error: unknown sync source string \"%1\""
 msgstr ""
 
-#: utils.cc:495
+#: utils.cc:489
 msgid "M-Clock"
 msgstr ""
 
-#: utils.cc:501
-#, fuzzy
-msgid "LTC"
-msgstr "Entrée LTC"
-
-#: utils.cc:671
+#: utils.cc:658
 msgid "programming error: unknown native header format: %1"
 msgstr ""
 
-#: utils.cc:686
+#: utils.cc:673
 msgid "cannot open directory %1 (%2)"
 msgstr ""
 
+#: vca.cc:43
+#, c-format
+msgid "VCA %n"
+msgstr ""
+
+#: vca_manager.cc:166
+msgid "Cannot set state of a VCA"
+msgstr ""
+
+#, fuzzy
+#~ msgid "%d"
+#~ msgstr "S"
+
+#~ msgid "normalize"
+#~ msgstr "Normaliser"
+
+#~ msgid "8bit"
+#~ msgstr "8 bits"
+
+#~ msgid "16bit"
+#~ msgstr "16 bits"
+
+#~ msgid "24bit"
+#~ msgstr "24 bits"
+
+#~ msgid "32bit"
+#~ msgstr "32 bits"
+
+#~ msgid "8bit unsigned"
+#~ msgstr "8 bits non-signé"
+
+#~ msgid "Editor: cannot open \"%1\" as export file for CD marker file"
+#~ msgstr ""
+#~ "Editeur : impossible d'ouvrir \"%1\" comme fichier d'export pour les "
+#~ "repères de CD"
+
+#~ msgid "MIDI file %1 was not readable (no reason available)"
+#~ msgstr "Le fichier MIDI %1 n'est pas lisible (pour une raison inconnue)"
+
+#~ msgid "transpose"
+#~ msgstr "Transposer"
+
+#~ msgid "32 bit float"
+#~ msgstr "32 bits à virgule flottante"
+
 #~ msgid ""
 #~ "You have requested an operation that requires audio analysis.\n"
 #~ "\n"
diff --git a/libs/ardour/po/it.mo b/libs/ardour/po/it.mo
new file mode 100644
index 0000000..a7a2381
Binary files /dev/null and b/libs/ardour/po/it.mo differ
diff --git a/libs/ardour/po/it.po b/libs/ardour/po/it.po
index a51a520..3c426f0 100644
--- a/libs/ardour/po/it.po
+++ b/libs/ardour/po/it.po
@@ -7,95 +7,248 @@ msgid ""
 msgstr ""
 "Project-Id-Version: libardour 0.664.0\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-03-31 20:13-0400\n"
+"POT-Creation-Date: 2016-07-14 06:20-0400\n"
 "PO-Revision-Date: 2003-05-21 12:50+0500\n"
 "Last-Translator: Filippo Pappalardo <filippo at email.it>\n"
 "Language-Team: Italian\n"
-"Language: \n"
+"Language: Italian\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=ISO-8859-1\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: amp.cc:57 automatable.cc:165
-msgid "Fader"
+#: amp.cc:412
+#, c-format
+msgid "%.2fdB"
 msgstr ""
 
-#: analyser.cc:117 audioregion.cc:1729
+#: analyser.cc:121 audioregion.cc:1789
 msgid "Transient Analysis failed for %1."
 msgstr ""
 
-#: analyser.cc:117
+#: analyser.cc:121
 msgid "Audio File Source"
 msgstr ""
 
-#: audio_diskstream.cc:249
+#: analysis_graph.cc:136
+msgid "%1 (%2..%3)"
+msgstr ""
+
+#: audio_backend.cc:31
+msgid "No Error occurred"
+msgstr ""
+
+#: audio_backend.cc:33
+msgid "Failed to initialize audio backend"
+msgstr ""
+
+#: audio_backend.cc:35
+msgid "Failed to deinitialize audio backend"
+msgstr ""
+
+#: audio_backend.cc:37
+msgid "Failed to reinitialize audio backend"
+msgstr ""
+
+#: audio_backend.cc:39
+msgid "Failed to open audio device"
+msgstr ""
+
+#: audio_backend.cc:41
+msgid "Failed to close audio device"
+msgstr ""
+
+#: audio_backend.cc:43
+msgid "Audio device not valid"
+msgstr ""
+
+#: audio_backend.cc:45
+msgid "Audio device unavailable"
+msgstr ""
+
+#: audio_backend.cc:47
+msgid "Audio device not connected"
+msgstr ""
+
+#: audio_backend.cc:49
+msgid "Failed to request and reserve audio device"
+msgstr ""
+
+#: audio_backend.cc:51
+msgid "Audio device Input/Output error"
+msgstr ""
+
+#: audio_backend.cc:53
+msgid "Failed to open MIDI device"
+msgstr ""
+
+#: audio_backend.cc:55
+msgid "Failed to close MIDI device"
+msgstr ""
+
+#: audio_backend.cc:57
+msgid "MIDI device unavailable"
+msgstr ""
+
+#: audio_backend.cc:59
+msgid "MIDI device not connected"
+msgstr ""
+
+#: audio_backend.cc:61
+msgid "MIDI device Input/Output error"
+msgstr ""
+
+#: audio_backend.cc:63
+msgid "Sample format is not supported"
+msgstr ""
+
+#: audio_backend.cc:65
+msgid "Sample rate is not supported"
+msgstr ""
+
+#: audio_backend.cc:67
+msgid "Requested input latency is not supported"
+msgstr ""
+
+#: audio_backend.cc:69
+msgid "Requested output latency is not supported"
+msgstr ""
+
+#: audio_backend.cc:71
+msgid "Period size is not supported"
+msgstr ""
+
+#: audio_backend.cc:73
+msgid "Period count is not supported"
+msgstr ""
+
+#: audio_backend.cc:75
+msgid "Device configuration not supported"
+msgstr ""
+
+#: audio_backend.cc:77
+msgid "Channel count configuration not supported"
+msgstr ""
+
+#: audio_backend.cc:79
+msgid "Input channel count configuration not supported"
+msgstr ""
+
+#: audio_backend.cc:81
+msgid "Output channel count configuration not supported"
+msgstr ""
+
+#: audio_backend.cc:83
+msgid "Unable to aquire realtime permissions"
+msgstr ""
+
+#: audio_backend.cc:85
+msgid "Setting audio device thread priorities failed"
+msgstr ""
+
+#: audio_backend.cc:87
+msgid "Setting MIDI device thread priorities failed"
+msgstr ""
+
+#: audio_backend.cc:89
+msgid "Failed to start process thread"
+msgstr ""
+
+#: audio_backend.cc:91
+msgid "Failed to start freewheel thread"
+msgstr ""
+
+#: audio_backend.cc:93
+msgid "Failed to register audio/midi ports"
+msgstr ""
+
+#: audio_backend.cc:95
+msgid "Failed to re-connect audio/midi ports"
+msgstr ""
+
+#: audio_backend.cc:97
+msgid "Out Of Memory Error"
+msgstr ""
+
+#: audio_backend.cc:99
+msgid "Could not reconnect to Audio/MIDI engine"
+msgstr ""
+
+#: audio_backend.cc:107 export_formats.cc:52 session.cc:6772 session.cc:6792
+msgid "None"
+msgstr ""
+
+#: audio_backend.cc:109
+msgid "Default"
+msgstr ""
+
+#: audio_diskstream.cc:257
 msgid "AudioDiskstream: Playlist \"%1\" isn't an audio playlist"
 msgstr ""
 
-#: audio_diskstream.cc:301
+#: audio_diskstream.cc:309
 msgid "AudioDiskstream %1: there is no existing playlist to make a copy of!"
 msgstr ""
 
-#: audio_diskstream.cc:861 audio_diskstream.cc:871
+#: audio_diskstream.cc:880 audio_diskstream.cc:890
 msgid ""
 "AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3"
 msgstr ""
 
-#: audio_diskstream.cc:1028
+#: audio_diskstream.cc:1053
 msgid "AudioDiskstream %1: cannot read %2 from playlist at frame %3"
 msgstr ""
 
-#: audio_diskstream.cc:1397 audio_diskstream.cc:1416
+#: audio_diskstream.cc:1469 audio_diskstream.cc:1488
 msgid "AudioDiskstream %1: cannot write to disk"
 msgstr ""
 
-#: audio_diskstream.cc:1459
+#: audio_diskstream.cc:1531
 msgid "AudioDiskstream \"%1\": cannot flush captured data to disk!"
 msgstr ""
 
-#: audio_diskstream.cc:1553
+#: audio_diskstream.cc:1627
 msgid "%1: could not create region for complete audio file"
 msgstr "%1: impossibile creare una regione per il file audio completo"
 
-#: audio_diskstream.cc:1585
+#: audio_diskstream.cc:1659
 msgid "AudioDiskstream: could not create region for captured audio!"
 msgstr ""
 
-#: audio_diskstream.cc:1693
+#: audio_diskstream.cc:1755
 msgid "programmer error: %1"
 msgstr ""
 
-#: audio_diskstream.cc:1921
+#: audio_diskstream.cc:2012
 msgid "AudioDiskstream: channel %1 out of range"
 msgstr ""
 
-#: audio_diskstream.cc:1935 midi_diskstream.cc:1274
+#: audio_diskstream.cc:2026 midi_diskstream.cc:1295
 msgid "%1:%2 new capture file not initialized correctly"
 msgstr "%1:%2 nuovo file di registrazione non è stato avviato correttamente"
 
-#: audio_diskstream.cc:2214
+#: audio_diskstream.cc:2305
 msgid "%1: cannot restore pending capture source file %2"
 msgstr ""
 
-#: audio_diskstream.cc:2236
+#: audio_diskstream.cc:2327
 msgid "%1: incorrect number of pending sources listed - ignoring them all"
 msgstr ""
 
-#: audio_diskstream.cc:2270
+#: audio_diskstream.cc:2361
 msgid "%1: cannot create whole-file region from pending capture sources"
 msgstr ""
 
-#: audio_library.cc:81
+#: audio_library.cc:82
 msgid "Could not open %1.  Audio Library not saved"
 msgstr "Impossibile accedere a %1. Libreria Audio non salvata"
 
-#: audio_playlist.cc:504
+#: audio_playlist.cc:509
 msgid ""
 "Legacy crossfade involved an incoming region not present in playlist \"%1\" "
 "- crossfade discarded"
 msgstr ""
 
-#: audio_playlist.cc:520
+#: audio_playlist.cc:525
 msgid ""
 "Legacy crossfade involved an outgoing region not present in playlist \"%1\" "
 "- crossfade discarded"
@@ -125,10 +278,11 @@ msgstr ""
 msgid "Audio Playlists (unused)"
 msgstr ""
 
-#: audio_playlist_source.cc:171 audiosource.cc:963 midi_playlist_source.cc:147
-#: midi_playlist_source.cc:155 midi_playlist_source.cc:162 midi_source.cc:356
-#: plugin_insert.cc:641 rb_effect.cc:327 session.cc:2845 session.cc:2878
-#: session.cc:4124 session_handle.cc:87 sndfilesource.cc:154
+#: audio_playlist_source.cc:171 audiosource.cc:1046
+#: midi_playlist_source.cc:147 midi_playlist_source.cc:155
+#: midi_playlist_source.cc:162 midi_source.cc:403 plugin_insert.cc:1259
+#: rb_effect.cc:327 session.cc:5314 session.cc:5341 session.cc:5461
+#: session_handle.cc:88 sndfilesource.cc:173
 msgid "programming error: %1"
 msgstr "errore di programmazione: %1"
 
@@ -152,26 +306,30 @@ msgid ""
 "Channels: "
 msgstr ""
 
-#: audio_track.cc:161
+#: audio_track.cc:177
 msgid "Unknown bundle \"%1\" listed for input of %2"
 msgstr ""
 
-#: audio_track.cc:163
+#: audio_track.cc:179
 msgid "in 1"
 msgstr ""
 
-#: audio_track.cc:164
+#: audio_track.cc:180
 msgid "No input bundles available as a replacement"
 msgstr ""
 
-#: audio_track.cc:168
+#: audio_track.cc:184
 msgid "Bundle %1 was not available - \"in 1\" used instead"
 msgstr ""
 
-#: audio_track.cc:177
+#: audio_track.cc:193
 msgid "improper input channel list in XML node (%1)"
 msgstr ""
 
+#: audio_track.cc:216 diskstream.cc:503 source.cc:149
+msgid "%1: this session uses destructive tracks, which are not supported"
+msgstr ""
+
 #: audio_track_importer.cc:68
 msgid "Audio Tracks"
 msgstr ""
@@ -192,19 +350,19 @@ msgstr ""
 msgid "VAMP Plugin \"%1\" could not be loaded"
 msgstr ""
 
-#: audioengine.cc:696
+#: audioengine.cc:756
 msgid "AudioEngine: cannot load module \"%1\" (%2)"
 msgstr ""
 
-#: audioengine.cc:702
+#: audioengine.cc:762
 msgid "AudioEngine: backend at \"%1\" has no descriptor function."
 msgstr ""
 
-#: audioengine.cc:779
+#: audioengine.cc:841
 msgid "Could not create backend for %1: %2"
 msgstr ""
 
-#: audioregion.cc:1685
+#: audioregion.cc:1757
 msgid ""
 "You have requested an operation that requires audio analysis.\n"
 "\n"
@@ -212,13 +370,14 @@ msgid ""
 "transient data must be generated every time it is required.\n"
 "\n"
 "If you are doing work that will require transient data on a regular basis, "
-"you should probably enable \"auto-analyse-audio\" then quit %1 and restart.\n"
+"you should probably enable \"auto-analyse-audio\" in Preferences > Audio > "
+"Regions, then quit %1 and restart.\n"
 "\n"
 "This dialog will not display again.  But you may notice a slight delay in "
 "this and future transient-detection operations.\n"
 msgstr ""
 
-#: audioregion.cc:1729
+#: audioregion.cc:1789
 msgid "Audio Region"
 msgstr ""
 
@@ -226,166 +385,194 @@ msgstr ""
 msgid "cannot rename peakfile for %1 from %2 to %3 (%4)"
 msgstr ""
 
-#: audiosource.cc:257
+#: audiosource.cc:262
 msgid "AudioSource: cannot stat peakfile \"%1\""
 msgstr ""
 
-#: audiosource.cc:361
+#: audiosource.cc:368
+msgid "Cannot open peakfile @ %1 for size check (%2)"
+msgstr ""
+
+#: audiosource.cc:389
+msgid "peak file %1 is truncated from %2 to %3"
+msgstr ""
+
+#: audiosource.cc:392
+msgid "Cannot open peakfile @ %1 for size check (%2) after rebuild"
+msgstr ""
+
+#: audiosource.cc:404
 msgid "Cannot open peakfile @ %1 for reading (%2)"
 msgstr ""
 
-#: audiosource.cc:394
+#: audiosource.cc:438
 msgid "cannot read sample data for unscaled peak computation"
 msgstr ""
 
-#: audiosource.cc:430 audiosource.cc:525
+#: audiosource.cc:473 audiosource.cc:568
 msgid "map failed - could not create file mapping for peakfile %1."
 msgstr ""
 
-#: audiosource.cc:436 audiosource.cc:531
+#: audiosource.cc:479 audiosource.cc:574
 msgid "map failed - could not map peakfile %1."
 msgstr ""
 
-#: audiosource.cc:447 audiosource.cc:542
+#: audiosource.cc:490 audiosource.cc:585
 msgid "unmap failed - could not unmap peakfile %1."
 msgstr ""
 
-#: audiosource.cc:453 audiosource.cc:548
+#: audiosource.cc:496 audiosource.cc:591
 msgid "map failed - could not mmap peakfile %1."
 msgstr ""
 
-#: audiosource.cc:638
+#: audiosource.cc:681
 msgid ""
 "AudioSource[%1]: peak read - cannot read %2 samples at offset %3 of %4 (%5)"
 msgstr ""
 
-#: audiosource.cc:705
+#: audiosource.cc:748
 msgid "%1: could not write read raw data for peak computation (%2)"
 msgstr ""
 
-#: audiosource.cc:742
-msgid "AudioSource: cannot open peakpath (c) \"%1\" (%2)"
+#: audiosource.cc:815
+msgid "AudioSource: cannot open _peakpath (c) \"%1\" (%2)"
 msgstr ""
 
-#: audiosource.cc:811 audiosource.cc:933
+#: audiosource.cc:894 audiosource.cc:1016
 msgid "%1: could not seek in peak file data (%2)"
 msgstr ""
 
-#: audiosource.cc:816 audiosource.cc:942
+#: audiosource.cc:899 audiosource.cc:1025
 msgid "%1: could not write peak file data (%2)"
 msgstr ""
 
-#: audiosource.cc:975
+#: audiosource.cc:1058
 msgid "could not truncate peakfile %1 to %2 (error: %3)"
 msgstr ""
 
-#: auditioner.cc:100
+#: auditioner.cc:105
 msgid "Falling back to Reasonable Synth for Midi Audition"
 msgstr ""
 
-#: auditioner.cc:102
+#: auditioner.cc:107
 msgid "No synth for midi-audition found."
 msgstr ""
 
-#: auditioner.cc:158
+#: auditioner.cc:163
 msgid "no outputs available for auditioner - manual connection required"
 msgstr ""
 
-#: auditioner.cc:399 auditioner.cc:446
+#: auditioner.cc:408 auditioner.cc:455
 msgid "Cannot setup auditioner processing flow for %1 channels"
 msgstr ""
 
-#: auditioner.cc:434
+#: auditioner.cc:443
 msgid "Failed to load synth for MIDI-Audition."
 msgstr ""
 
-#: auditioner.cc:453
+#: auditioner.cc:462
 msgid "Auditioning of regions other than Audio or Midi is not supported."
 msgstr ""
 
-#: automatable.cc:84
+#: automatable.cc:87
 msgid "Automation node has no path property"
 msgstr ""
 
-#: automatable.cc:104
+#: automatable.cc:108
 msgid "cannot open %2 to load automation data (%3)"
 msgstr ""
 
-#: automatable.cc:132
+#: automatable.cc:140
 msgid "cannot load automation data from %2"
 msgstr ""
 
-#: automatable.cc:167
+#: automatable.cc:176 send.cc:95 session.cc:851
+msgid "Fader"
+msgstr ""
+
+#: automatable.cc:178
+msgid "Trim"
+msgstr ""
+
+#: automatable.cc:180
 msgid "Mute"
 msgstr ""
 
-#: automation_list.cc:356
+#: automation_control.cc:228
+msgid "record %1 automation"
+msgstr ""
+
+#: automation_list.cc:410
 msgid "automation list: cannot load coordinates from XML, all points ignored"
 msgstr ""
 
-#: automation_list.cc:402
+#: automation_list.cc:456
 msgid ""
 "automation list: no x-coordinate stored for control point (point ignored)"
 msgstr ""
 "lista automazione: nessuna coordinata X salvata per punto di controllo "
 "(ignorato)"
 
-#: automation_list.cc:408
+#: automation_list.cc:462
 msgid ""
 "automation list: no y-coordinate stored for control point (point ignored)"
 msgstr ""
 "lista automazione: nessuna coordinata Y salvata per punto di controllo "
 "(ignorato)"
 
-#: automation_list.cc:422
+#: automation_list.cc:476
 msgid ""
 "AutomationList: passed XML node called %1, not \"AutomationList\" - ignored"
 msgstr ""
 
-#: butler.cc:100
+#: butler.cc:126
 msgid "Session: could not create butler thread"
 msgstr ""
 
-#: butler.cc:222 butler.cc:223
+#: butler.cc:254 butler.cc:255
 msgid "Butler read ahead failure on dstream %1"
 msgstr ""
 
-#: butler.cc:270 butler.cc:271
+#: butler.cc:344 butler.cc:345 butler.cc:393 butler.cc:394
 msgid "Butler write-behind failure on dstream %1"
 msgstr ""
 
-#: control_protocol_manager.cc:164
+#: control_protocol_manager.cc:174
 msgid "control protocol name \"%1\" has no descriptor"
 msgstr ""
 
-#: control_protocol_manager.cc:171
+#: control_protocol_manager.cc:181
 msgid "control protocol name \"%1\" could not be initialized"
 msgstr ""
 
-#: control_protocol_manager.cc:237
+#: control_protocol_manager.cc:265
 msgid "Instantiating mandatory control protocol %1"
 msgstr ""
 
-#: control_protocol_manager.cc:281
+#: control_protocol_manager.cc:309
 msgid "looking for control protocols in %1\n"
 msgstr ""
 
-#: control_protocol_manager.cc:306
+#: control_protocol_manager.cc:334
 msgid "Control protocol %1 not usable"
 msgstr ""
 
-#: control_protocol_manager.cc:323
+#: control_protocol_manager.cc:351
 msgid "Control surface protocol discovered: \"%1\"\n"
 msgstr ""
 
-#: control_protocol_manager.cc:341
+#: control_protocol_manager.cc:367
 msgid "ControlProtocolManager: cannot load module \"%1\" (%2)"
 msgstr ""
 
-#: control_protocol_manager.cc:347
+#: control_protocol_manager.cc:373
 msgid "ControlProtocolManager: module \"%1\" has no descriptor function."
 msgstr ""
 
+#: control_protocol_manager.cc:516
+msgid "Control protocol \"%1\" has no descriptor"
+msgstr ""
+
 #: cycle_timer.cc:40
 msgid "CycleTimer::get_mhz(): can't open /proc/cpuinfo"
 msgstr "CycleTimer::get_mhz(): impossibile accedere a /proc/cpuinfo"
@@ -403,7 +590,7 @@ msgstr "impossibile localizzare \"cpu MHz\" in /proc/cpuinfo"
 msgid "audio"
 msgstr ""
 
-#: data_type.cc:28 session.cc:1995 session.cc:1998
+#: data_type.cc:28 session.cc:2452
 msgid "MIDI"
 msgstr ""
 
@@ -415,11 +602,11 @@ msgstr ""
 msgid "main outs"
 msgstr ""
 
-#: delivery.cc:121 send.cc:63
+#: delivery.cc:121 send.cc:64
 msgid "listen"
 msgstr ""
 
-#: diskstream.cc:309
+#: diskstream.cc:311
 msgid "Location \"%1\" not valid for track loop (start >= end)"
 msgstr "La Location \"%1\" non  valida per il loop (inizio >= fine)"
 
@@ -431,23 +618,23 @@ msgstr ""
 msgid "Export failed: %1"
 msgstr ""
 
-#: export_filename.cc:126
+#: export_filename.cc:128
 msgid "Existing export folder for this session (%1) does not exist - ignored"
 msgstr ""
 
-#: export_filename.cc:242
+#: export_filename.cc:263
 msgid "No Time"
 msgstr ""
 
-#: export_filename.cc:251
+#: export_filename.cc:272
 msgid "Invalid time format"
 msgstr ""
 
-#: export_filename.cc:260
+#: export_filename.cc:281
 msgid "No Date"
 msgstr ""
 
-#: export_filename.cc:275
+#: export_filename.cc:296
 msgid "Invalid date format"
 msgstr ""
 
@@ -483,23 +670,27 @@ msgstr ""
 msgid "Lossless compression"
 msgstr ""
 
-#: export_format_manager.cc:218 export_format_specification.cc:591
+#: export_format_manager.cc:218 export_format_specification.cc:657
 msgid "Session rate"
 msgstr ""
 
-#: export_format_specification.cc:549
-msgid "normalize"
+#: export_format_specification.cc:609
+msgid "normalize loudness"
+msgstr ""
+
+#: export_format_specification.cc:611
+msgid "normalize peak"
 msgstr ""
 
-#: export_format_specification.cc:553
+#: export_format_specification.cc:616
 msgid "trim"
 msgstr ""
 
-#: export_format_specification.cc:555
+#: export_format_specification.cc:618
 msgid "trim start"
 msgstr ""
 
-#: export_format_specification.cc:557
+#: export_format_specification.cc:620
 msgid "trim end"
 msgstr ""
 
@@ -515,24 +706,20 @@ msgstr ""
 msgid "Rectangular"
 msgstr ""
 
-#: export_formats.cc:52 session.cc:5421 session.cc:5437
-msgid "None"
-msgstr ""
-
 #: export_formats.cc:159
-msgid "8bit"
+msgid "8-bit"
 msgstr ""
 
 #: export_formats.cc:161
-msgid "16bit"
+msgid "16-bit"
 msgstr ""
 
 #: export_formats.cc:163
-msgid "24bit"
+msgid "24-bit"
 msgstr ""
 
 #: export_formats.cc:165
-msgid "32bit"
+msgid "32-bit"
 msgstr ""
 
 #: export_formats.cc:167
@@ -544,7 +731,7 @@ msgid "double"
 msgstr ""
 
 #: export_formats.cc:171
-msgid "8bit unsigned"
+msgid "8-bit unsigned"
 msgstr ""
 
 #: export_formats.cc:173
@@ -555,94 +742,90 @@ msgstr ""
 msgid "No sample format"
 msgstr ""
 
-#: export_handler.cc:360
+#: export_handler.cc:419
 msgid "File %1 uploaded to %2"
 msgstr ""
 
-#: export_handler.cc:366
+#: export_handler.cc:425
 msgid ""
 "upload to Soundcloud failed. Perhaps your email or password are incorrect?\n"
 msgstr ""
 
-#: export_handler.cc:413
-msgid "Editor: cannot open \"%1\" as export file for CD marker file"
-msgstr ""
-
-#: export_handler.cc:492 export_handler.cc:495
-msgid "an error occured while writing a TOC/CUE file: %1"
+#: export_handler.cc:551 export_handler.cc:554
+msgid "an error occurred while writing a TOC/CUE file: %1"
 msgstr ""
 
-#: export_handler.cc:744 export_handler.cc:802
+#: export_handler.cc:844 export_handler.cc:902
 msgid "Cannot convert %1 to Latin-1 text"
 msgstr ""
 
-#: export_profile_manager.cc:93
+#: export_profile_manager.cc:94
 msgid "Searching for export formats in %1"
 msgstr ""
 
-#: export_profile_manager.cc:99
+#: export_profile_manager.cc:100
 msgid "Unable to create export format directory %1: %2"
 msgstr ""
 
-#: export_profile_manager.cc:262
+#: export_profile_manager.cc:268
 msgid "Unable to remove export preset %1: %2"
 msgstr ""
 
-#: export_profile_manager.cc:351
+#: export_profile_manager.cc:357
 msgid "Selection"
 msgstr ""
 
-#: export_profile_manager.cc:604
+#: export_profile_manager.cc:621
 msgid "Unable to rename export format %1 to %2: %3"
 msgstr ""
 
-#: export_profile_manager.cc:636
+#: export_profile_manager.cc:653
 msgid "Unable to remove export profile %1: %2"
 msgstr ""
 
-#: export_profile_manager.cc:654
+#: export_profile_manager.cc:671
 msgid "empty format"
 msgstr ""
 
-#: export_profile_manager.cc:735
+#: export_profile_manager.cc:752
 msgid "Cannot load export format from %1"
 msgstr ""
 
-#: export_profile_manager.cc:741
+#: export_profile_manager.cc:758
 msgid "Cannot export format read from %1"
 msgstr ""
 
-#: export_profile_manager.cc:835
+#: export_profile_manager.cc:852
 msgid "No timespan has been selected!"
 msgstr ""
 
-#: export_profile_manager.cc:839
+#: export_profile_manager.cc:856
 msgid "No channels have been selected!"
 msgstr ""
 
-#: export_profile_manager.cc:843
+#: export_profile_manager.cc:860
 msgid "Some channels are empty"
 msgstr ""
 
-#: export_profile_manager.cc:876
+#: export_profile_manager.cc:893
 msgid "No format selected!"
 msgstr ""
 
-#: export_profile_manager.cc:878
+#: export_profile_manager.cc:895
 msgid "All channels are empty!"
 msgstr ""
 
-#: export_profile_manager.cc:880
+#: export_profile_manager.cc:897
 msgid "One or more of the selected formats is not compatible with this system!"
 msgstr ""
 
-#: export_profile_manager.cc:883
+#: export_profile_manager.cc:900
 msgid ""
 "%1 supports only %2 channels, but you have %3 channels in your channel "
 "configuration"
 msgstr ""
 
-#: file_source.cc:201 session_state.cc:2857
+#: file_source.cc:201 session_state.cc:3284
 msgid ""
 "there are already 1000 files with names like %1; versioning discontinued"
 msgstr ""
@@ -652,25 +835,25 @@ msgstr ""
 msgid "cannot rename file source from %1 to %2 (%3)"
 msgstr ""
 
-#: file_source.cc:251 file_source.cc:375
+#: file_source.cc:251 file_source.cc:374
 msgid "FileSource: search path not set"
 msgstr "FileSource: percorso di ricerca non specificato"
 
-#: file_source.cc:435
+#: file_source.cc:434
 msgid ""
 "FileSource: \"%1\" is ambigous when searching\n"
 "\t"
 msgstr ""
 
-#: file_source.cc:442
+#: file_source.cc:441
 msgid "Filesource: cannot find required file (%1)"
 msgstr ""
 
-#: file_source.cc:487
+#: file_source.cc:486
 msgid "Filesource: cannot find required file (%1): %2"
 msgstr "FileSource: impossibile trovare il file richiesto (%1): %2"
 
-#: file_source.cc:495
+#: file_source.cc:494
 msgid "Filesource: cannot check for existing file (%1): %2"
 msgstr "FileSource: impossibile controllare il file esistente (%1): %2"
 
@@ -684,34 +867,38 @@ msgstr ""
 msgid "cannot rename file %1 to %2 (%3)"
 msgstr ""
 
-#: filesystem_paths.cc:105
+#: filesystem_paths.cc:120
 msgid "Cannot create Configuration directory %1 - cannot run"
 msgstr ""
 
-#: filesystem_paths.cc:110
+#: filesystem_paths.cc:125
 msgid ""
 "Configuration directory %1 already exists and is not a directory/folder - "
 "cannot run"
 msgstr ""
 
-#: filesystem_paths.cc:171
+#: filesystem_paths.cc:186
 msgid "Cannot create cache directory %1 - cannot run"
 msgstr ""
 
-#: filesystem_paths.cc:176
+#: filesystem_paths.cc:191
 msgid ""
 "Cache directory %1 already exists and is not a directory/folder - cannot run"
 msgstr ""
 
-#: filesystem_paths.cc:194
+#: filesystem_paths.cc:209
 msgid "ARDOUR_DLL_PATH not set in environment - exiting\n"
 msgstr ""
 
-#: filesystem_paths.cc:245
+#: filesystem_paths.cc:232
+msgid "Cannot determine %1 package directory"
+msgstr ""
+
+#: filesystem_paths.cc:277
 msgid "ARDOUR_CONFIG_PATH not set in environment\n"
 msgstr ""
 
-#: filesystem_paths.cc:266
+#: filesystem_paths.cc:298
 msgid "ARDOUR_DATA_PATH not set in environment\n"
 msgstr ""
 
@@ -719,50 +906,79 @@ msgstr ""
 msgid "filter: error creating name for new file based on %1"
 msgstr ""
 
-#: filter.cc:79
+#: filter.cc:92
 msgid "filter: error creating new file %1 (%2)"
 msgstr ""
 
-#: find_session.cc:59
+#: find_session.cc:60
 msgid "cannot check session path %1 (%2)"
 msgstr "impossibile controllare il percorso %1 (%2)"
 
-#: find_session.cc:85
+#: find_session.cc:86
 msgid "cannot check statefile %1 (%2)"
 msgstr "impossibile controllare il file di stato %1 (%2)"
 
-#: find_session.cc:121
+#: find_session.cc:125
 msgid "%1 is not a snapshot file"
 msgstr ""
 
-#: find_session.cc:138
+#: find_session.cc:142
 msgid "cannot determine current working directory (%1)"
 msgstr "impossibile determinare la cartella di lavoro corrente (%1)"
 
-#: find_session.cc:155
+#: find_session.cc:159
 msgid "unknown file type for session %1"
 msgstr "tipo di fle sconosciuto per la sessione %1"
 
-#: globals.cc:234
+#: gain_control.cc:81
+#, c-format
+msgid "%3.1f dB"
+msgstr ""
+
+#: globals.cc:266
 msgid "Could not set system open files limit to \"unlimited\""
 msgstr ""
 
-#: globals.cc:236
+#: globals.cc:268
 msgid "Could not set system open files limit to %1"
 msgstr ""
 
-#: globals.cc:240
+#: globals.cc:272 globals.cc:289
 msgid "Your system is configured to limit %1 to only %2 open files"
 msgstr ""
 
-#: globals.cc:244
+#: globals.cc:276
 msgid "Could not get system open files limit (%1)"
 msgstr ""
 
-#: globals.cc:415
+#: globals.cc:291
+msgid "Could not set system open files limit. Current limit is %1 open files"
+msgstr ""
+
+#: globals.cc:474
 msgid "Loading configuration"
 msgstr ""
 
+#: globals.cc:554 route.cc:182 route.cc:4149 session.cc:1157
+msgid "Monitor"
+msgstr ""
+
+#: globals.cc:555 session_state.cc:642
+msgid "Master"
+msgstr ""
+
+#: globals.cc:556
+msgid "Control"
+msgstr ""
+
+#: globals.cc:557
+msgid "Click"
+msgstr ""
+
+#: globals.cc:558
+msgid "Mackie"
+msgstr ""
+
 #: import.cc:146
 msgid "Cannot find new filename for imported file %1"
 msgstr ""
@@ -788,7 +1004,7 @@ msgid "Track %1 of %2 contained no usable MIDI data"
 msgstr ""
 
 #: import.cc:427
-msgid "MIDI file %1 was not readable (no reason available)"
+msgid "MIDI file could not be written (best guess: %1)"
 msgstr ""
 
 #: import.cc:475
@@ -815,110 +1031,113 @@ msgstr ""
 msgid "Unknown"
 msgstr ""
 
-#: instrument_info.cc:231
+#: instrument_info.cc:243
 msgid "preset %1 (bank %2)"
 msgstr ""
 
-#: internal_send.cc:316 internal_send.cc:317
+#: internal_send.cc:338 internal_send.cc:339
 msgid "%1 - cannot find any track/bus with the ID %2 to connect to"
 msgstr ""
 
-#: io.cc:209
+#: io.cc:212
 msgid "IO: cannot disconnect port %1 from %2"
 msgstr ""
 
-#: io.cc:344 io.cc:431
+#: io.cc:347 io.cc:435
 msgid "IO: cannot register input port %1"
 msgstr "IO: impossibile registrare la porta %1"
 
-#: io.cc:349 io.cc:436
+#: io.cc:352 io.cc:440
 msgid "IO: cannot register output port %1"
 msgstr "IO: impossibile registrare la porta %1"
 
-#: io.cc:598 io.cc:654
+#: io.cc:607 io.cc:668
 msgid "incorrect XML node \"%1\" passed to IO object"
 msgstr ""
 
-#: io.cc:713
+#: io.cc:730
 msgid "in"
 msgstr ""
 
-#: io.cc:713
+#: io.cc:730
 msgid "out"
 msgstr ""
 
-#: io.cc:714
+#: io.cc:731
 msgid "input"
 msgstr ""
 
-#: io.cc:714
+#: io.cc:731
 msgid "output"
 msgstr ""
 
-#: io.cc:724
+#: io.cc:741
 msgid "Unknown bundle \"%1\" listed for %2 of %3"
 msgstr ""
 
-#: io.cc:790
+#: io.cc:807
 msgid "Bundle %1 was not available - \"%2\" used instead"
 msgstr ""
 
-#: io.cc:793
+#: io.cc:810
 msgid "No %1 bundles available as a replacement"
 msgstr ""
 
-#: io.cc:897
+#: io.cc:914
 msgid "%1: cannot create I/O ports"
 msgstr ""
 
-#: io.cc:1025 io.cc:1126
+#: io.cc:1042 io.cc:1143
 msgid "IO: badly formed string in XML node for inputs \"%1\""
 msgstr "IO: stringa malformata nel nodo XML per le entrate \"%1\""
 
-#: io.cc:1030 io.cc:1131
+#: io.cc:1047 io.cc:1148
 msgid "bad input string in XML node \"%1\""
 msgstr "stringa malformata nel nodo XML \"%1\""
 
-#: io.cc:1069
+#: io.cc:1086
 msgid "IO: badly formed string in XML node for outputs \"%1\""
 msgstr "IO: stringa mal formata nel nodo XML per le uscite \"%1\""
 
-#: io.cc:1074
+#: io.cc:1091
 msgid "IO: bad output string in XML node \"%1\""
 msgstr "IO: stringa mal formata nel nodo XML \"%1\""
 
-#: io.cc:1413
+#: io.cc:1256 plugin.cc:275
+msgid "Out"
+msgstr ""
+
+#: io.cc:1256 plugin.cc:273
+msgid "In"
+msgstr ""
+
+#: io.cc:1454
 #, c-format
 msgid "%s %u"
 msgstr ""
 
-#: io.cc:1460
+#: io.cc:1501
 #, c-format
 msgid "%s in"
 msgstr ""
 
-#: io.cc:1462
+#: io.cc:1503
 #, c-format
 msgid "%s out"
 msgstr ""
 
-#: io.cc:1537 session.cc:733 session.cc:767
+#: io.cc:1578 session.cc:957 session.cc:991
 msgid "mono"
 msgstr ""
 
-#: io.cc:1539 session.cc:746 session.cc:781
+#: io.cc:1580 session.cc:970 session.cc:1005
 msgid "L"
 msgstr ""
 
-#: io.cc:1539 session.cc:748 session.cc:783
+#: io.cc:1580 session.cc:972 session.cc:1007
 msgid "R"
 msgstr ""
 
-#: io.cc:1541 io.cc:1547
-#, c-format
-msgid "%d"
-msgstr ""
-
 #: ladspa_plugin.cc:93
 msgid "LADSPA: Unable to open module: "
 msgstr ""
@@ -935,81 +1154,81 @@ msgstr "LADSPA: il plugin 
 msgid "LADSPA: \"%1\" cannot be used, since it cannot do inplace processing"
 msgstr ""
 
-#: ladspa_plugin.cc:311
+#: ladspa_plugin.cc:308
 msgid ""
 "illegal parameter number used with plugin \"%1\". This may indicate a change "
 "in the plugin design, and presets may be invalid"
 msgstr ""
 
-#: ladspa_plugin.cc:390 ladspa_plugin.cc:440
+#: ladspa_plugin.cc:387 ladspa_plugin.cc:437
 msgid "Bad node sent to LadspaPlugin::set_state"
 msgstr ""
 
-#: ladspa_plugin.cc:405 ladspa_plugin.cc:454
+#: ladspa_plugin.cc:402 ladspa_plugin.cc:451
 msgid "LADSPA: no ladspa port number"
 msgstr ""
 
-#: ladspa_plugin.cc:411 ladspa_plugin.cc:460
+#: ladspa_plugin.cc:408 ladspa_plugin.cc:457
 msgid "LADSPA: no ladspa port data"
 msgstr ""
 
-#: ladspa_plugin.cc:842
+#: ladspa_plugin.cc:863
 msgid "Could not locate HOME.  Preset not removed."
 msgstr ""
 
-#: ladspa_plugin.cc:881 ladspa_plugin.cc:887
+#: ladspa_plugin.cc:902 ladspa_plugin.cc:908
 msgid "Could not create %1.  Preset not saved. (%2)"
 msgstr "Impossibile creare %1 . Preset non salvato. (%2)"
 
-#: ladspa_plugin.cc:894
+#: ladspa_plugin.cc:915
 msgid "Error saving presets file %1."
 msgstr "Errore nel salvare il file di preset %1."
 
-#: ladspa_plugin.cc:936
+#: ladspa_plugin.cc:957
 msgid "Could not locate HOME.  Preset not saved."
 msgstr "impossibile localizzare HOME.  Preset non salvato."
 
-#: location.cc:456
+#: location.cc:455
 msgid "You cannot put a CD marker at this position"
 msgstr ""
 
-#: location.cc:608
+#: location.cc:607
 msgid "incorrect XML node passed to Location::set_state"
 msgstr ""
 
-#: location.cc:613
+#: location.cc:612
 msgid "XML node for Location has no ID information"
 msgstr ""
 
-#: location.cc:617
+#: location.cc:616
 msgid "XML node for Location has no name information"
 msgstr "il nodo XML per la Location non ha informazioni sul nome"
 
-#: location.cc:624
+#: location.cc:623
 msgid "XML node for Location has no start information"
 msgstr "il nodo XML per la Location non ha informazioni sull'inizio"
 
-#: location.cc:635
+#: location.cc:634
 msgid "XML node for Location has no end information"
 msgstr "il nodo XML per la Location non ha informazioni sulla fine"
 
-#: location.cc:642
+#: location.cc:641
 msgid "XML node for Location has no flags information"
 msgstr "il nodo XML per la Location non ha informazioni sui flags"
 
-#: location.cc:856
+#: location.cc:868
 msgid "Locations: attempt to use unknown location as selected location"
 msgstr ""
 
-#: location.cc:1034
+#: location.cc:1046
 msgid "incorrect XML mode passed to Locations::set_state"
 msgstr ""
 
-#: location.cc:1047 session.cc:1293 session.cc:4919 session_state.cc:1053
+#: location.cc:1059 session.cc:1667 session.cc:6305 session_state.cc:1205
 msgid "session"
 msgstr ""
 
-#: location.cc:1112
+#: location.cc:1126
 msgid "could not load location from session file - ignored"
 msgstr ""
 
@@ -1051,48 +1270,104 @@ msgid ""
 "You may rename the imported location:"
 msgstr ""
 
-#: ltc_slave.cc:272
+#: ltc_file_reader.cc:96
+msgid "LTCFileReader: cannot open file \"%1\""
+msgstr ""
+
+#: ltc_file_reader.cc:105
+msgid "LTCFileReader: cannot open file \"%1\" (%3)"
+msgstr ""
+
+#: ltc_file_reader.cc:109
+msgid "LTCFileReader: \"%1\" is an empty audio file"
+msgstr ""
+
+#: ltc_file_reader.cc:134
+msgid "LTCFileReader:: invalid audio channel selected"
+msgstr ""
+
+#: ltc_slave.cc:275
 msgid "Session framerate adjusted from %1 to LTC's %2."
 msgstr ""
 
-#: ltc_slave.cc:286
+#: ltc_slave.cc:289
 msgid "Session and LTC framerate mismatch: LTC:%1 Session:%2."
 msgstr ""
 
-#: ltc_slave.cc:603
+#: ltc_slave.cc:609
 msgid "flywheel"
 msgstr ""
 
-#: midi_diskstream.cc:173
+#: lua_api.cc:87
+msgid "Script with given name was not found\n"
+msgstr ""
+
+#: lua_api.cc:96
+msgid "Failed to instantiate Lua Processor\n"
+msgstr ""
+
+#: luaproc.cc:876
+msgid "Failed to load Lua script from session state."
+msgstr ""
+
+#: luaproc.cc:886
+msgid "Session State for LuaProcessor did not include a Lua script."
+msgstr ""
+
+#: luaproc.cc:890
+msgid "Invalid/incompatible Lua script found for LuaProcessor."
+msgstr ""
+
+#: luaproc.cc:918
+msgid "Bad node sent to LuaProc::set_state"
+msgstr ""
+
+#: luaproc.cc:928
+msgid "LuaProc: port has no symbol, ignored"
+msgstr ""
+
+#: luaproc.cc:934
+msgid "LuaProc: port has no value, ignored"
+msgstr ""
+
+#: luaproc.cc:1164
+msgid "Unable to create LuaProc presets directory"
+msgstr ""
+
+#: luascripting.cc:132
+msgid "Script '%1' has no valid descriptor."
+msgstr ""
+
+#: midi_diskstream.cc:172
 msgid ""
 "%1: I/O configuration change %4 requested to use %2, but channel setup is %3"
 msgstr ""
 
-#: midi_diskstream.cc:225
+#: midi_diskstream.cc:224
 msgid "MidiDiskstream: Playlist \"%1\" isn't a midi playlist"
 msgstr ""
 
-#: midi_diskstream.cc:276
+#: midi_diskstream.cc:275
 msgid "MidiDiskstream %1: there is no existing playlist to make a copy of!"
 msgstr ""
 
-#: midi_diskstream.cc:754
+#: midi_diskstream.cc:753
 msgid "MidiDiskstream %1: cannot read %2 from playlist at frame %3"
 msgstr ""
 
-#: midi_diskstream.cc:891
+#: midi_diskstream.cc:890
 msgid "MidiDiskstream %1: cannot write to disk"
 msgstr ""
 
-#: midi_diskstream.cc:925
+#: midi_diskstream.cc:924
 msgid "MidiDiskstream \"%1\": cannot flush captured data to disk!"
 msgstr ""
 
-#: midi_diskstream.cc:1014
+#: midi_diskstream.cc:1013
 msgid "%1: could not create region for complete midi file"
 msgstr ""
 
-#: midi_diskstream.cc:1055
+#: midi_diskstream.cc:1054
 msgid "MidiDiskstream: could not create region for captured midi!"
 msgstr ""
 
@@ -1112,31 +1387,47 @@ msgstr ""
 msgid "No SysExID found for sys-ex property change - ignored"
 msgstr ""
 
-#: midi_model.cc:1994
-msgid "transpose"
+#: midi_patch_manager.cc:78
+msgid "Loading %1 MIDI patch from %2"
+msgid_plural "Loading %1 MIDI patches from %2"
+msgstr[0] ""
+msgstr[1] ""
+
+#: midi_patch_manager.cc:109
+msgid "Unloading %1 MIDI patch from %2"
+msgid_plural "Unloading %1 MIDI patches from %2"
+msgstr[0] ""
+msgstr[1] ""
+
+#: midi_patch_manager.cc:126
+msgid "Error parsing MIDI patch file %1"
 msgstr ""
 
-#: midi_patch_manager.cc:133
+#: midi_patch_manager.cc:135
 msgid "Duplicate MIDI device `%1' in `%2' ignored"
 msgstr ""
 
-#: midi_scene_changer.cc:295
+#: midi_patch_manager.cc:170
+msgid "Removing MIDI patch file %1"
+msgstr ""
+
+#: midi_scene_changer.cc:312
 msgid "Scene "
 msgstr ""
 
-#: midi_source.cc:125
+#: midi_source.cc:126
 msgid "Missing parameter property on InterpolationStyle"
 msgstr ""
 
-#: midi_source.cc:131
+#: midi_source.cc:132
 msgid "Missing style property on InterpolationStyle"
 msgstr ""
 
-#: midi_source.cc:140
+#: midi_source.cc:141
 msgid "Missing parameter property on AutomationState"
 msgstr ""
 
-#: midi_source.cc:146
+#: midi_source.cc:147
 msgid "Missing state property on AutomationState"
 msgstr ""
 
@@ -1144,57 +1435,57 @@ msgstr ""
 msgid "MIDI stretch created non-MIDI source"
 msgstr ""
 
-#: monitor_processor.cc:53
+#: monitor_processor.cc:54
 msgid "monitor dim"
 msgstr ""
 
-#: monitor_processor.cc:54
+#: monitor_processor.cc:55
 msgid "monitor cut"
 msgstr ""
 
-#: monitor_processor.cc:55
+#: monitor_processor.cc:56
 msgid "monitor mono"
 msgstr ""
 
-#: monitor_processor.cc:58
+#: monitor_processor.cc:59
 msgid "monitor dim level"
 msgstr ""
 
-#: monitor_processor.cc:62
+#: monitor_processor.cc:63
 msgid "monitor solo boost level"
 msgstr ""
 
-#: monitor_processor.cc:512
+#: monitor_processor.cc:543
 msgid "cut control %1"
 msgstr ""
 
-#: monitor_processor.cc:513
+#: monitor_processor.cc:544
 msgid "dim control"
 msgstr ""
 
-#: monitor_processor.cc:514
+#: monitor_processor.cc:545
 msgid "polarity control"
 msgstr ""
 
-#: monitor_processor.cc:515
+#: monitor_processor.cc:546
 msgid "solo control"
 msgstr ""
 
-#: mtc_slave.cc:240
+#: mtc_slave.cc:241
 msgid "MTC Slave: atomic read of current time failed, sleeping!"
 msgstr ""
 
-#: mtc_slave.cc:362
+#: mtc_slave.cc:363
 msgid ""
 "Unknown rate/drop value %1 in incoming MTC stream, session values used "
 "instead"
 msgstr ""
 
-#: mtc_slave.cc:382
+#: mtc_slave.cc:383
 msgid "Session framerate adjusted from %1 TO: MTC's %2."
 msgstr ""
 
-#: mtc_slave.cc:396
+#: mtc_slave.cc:397
 msgid "Session and MTC framerate mismatch: MTC:%1 %2:%3."
 msgstr ""
 
@@ -1250,7 +1541,7 @@ msgstr ""
 msgid "fixed time region copy"
 msgstr ""
 
-#: pannable.cc:207
+#: pannable.cc:208
 msgid "Pannable given XML data for %1 - ignored"
 msgstr ""
 
@@ -1284,19 +1575,67 @@ msgstr ""
 msgid "select panner: %1\n"
 msgstr ""
 
-#: panner_shell.cc:255
+#: panner_shell.cc:257
 msgid "Unknown panner plugin \"%1\" found in pan state - ignored"
 msgstr ""
 
-#: panner_shell.cc:261
+#: panner_shell.cc:263
 msgid "panner plugin node has no type information!"
 msgstr ""
 
-#: playlist.cc:2138
+#: parameter_descriptor.cc:201
+msgid "Note|C"
+msgstr ""
+
+#: parameter_descriptor.cc:202
+msgid "Note|C#"
+msgstr ""
+
+#: parameter_descriptor.cc:203
+msgid "Note|D"
+msgstr ""
+
+#: parameter_descriptor.cc:204
+msgid "Note|D#"
+msgstr ""
+
+#: parameter_descriptor.cc:205
+msgid "Note|E"
+msgstr ""
+
+#: parameter_descriptor.cc:206
+msgid "Note|F"
+msgstr ""
+
+#: parameter_descriptor.cc:207
+msgid "Note|F#"
+msgstr ""
+
+#: parameter_descriptor.cc:208
+msgid "Note|G"
+msgstr ""
+
+#: parameter_descriptor.cc:209
+msgid "Note|G#"
+msgstr ""
+
+#: parameter_descriptor.cc:210
+msgid "Note|A"
+msgstr ""
+
+#: parameter_descriptor.cc:211
+msgid "Note|A#"
+msgstr ""
+
+#: parameter_descriptor.cc:212
+msgid "Note|B"
+msgstr ""
+
+#: playlist.cc:2234
 msgid "region state node has no ID, ignored"
 msgstr ""
 
-#: playlist.cc:2156
+#: playlist.cc:2252
 msgid "Playlist: cannot create region from XML"
 msgstr ""
 
@@ -1308,35 +1647,59 @@ msgstr ""
 msgid "Could not construct playlist for PlaylistSource from session data!"
 msgstr ""
 
-#: plugin.cc:328
+#: plugin.cc:126
+msgid "Cannot remove plugin factory preset."
+msgstr ""
+
+#: plugin.cc:144
+msgid "Preset with given name already exists."
+msgstr ""
+
+#: plugin.cc:263
+msgid "Audio"
+msgstr ""
+
+#: plugin.cc:266
+msgid "Midi"
+msgstr ""
+
+#: plugin.cc:269
+msgid "?"
+msgstr ""
+
+#: plugin.cc:412
 msgid ""
 "Plugin presets are not supported in this build of %1. Consider paying for a "
 "full version"
 msgstr ""
 
-#: plugin.cc:403
+#: plugin.cc:495
 msgid ""
 "Saving plugin settings is not supported in this build of %1. Consider paying "
 "for the full version"
 msgstr ""
 
-#: plugin_insert.cc:596
+#: plugin_insert.cc:1148
 msgid "programming error: "
 msgstr "errore di programmazione: "
 
-#: plugin_insert.cc:933
+#: plugin_insert.cc:1700
+msgid "SC %1"
+msgstr ""
+
+#: plugin_insert.cc:2352
 msgid "XML node describing plugin is missing the `type' field"
 msgstr ""
 
-#: plugin_insert.cc:948
+#: plugin_insert.cc:2369
 msgid "unknown plugin type %1 in plugin insert state"
 msgstr ""
 
-#: plugin_insert.cc:976
+#: plugin_insert.cc:2397
 msgid "Plugin has no unique ID field"
 msgstr ""
 
-#: plugin_insert.cc:1001
+#: plugin_insert.cc:2435
 msgid ""
 "Found a reference to a plugin (\"%1\") that is unknown.\n"
 "Perhaps it was removed or moved since it was last used."
@@ -1344,91 +1707,187 @@ msgstr ""
 "Trovato un riferimento ad un plugin (\"%1\") sconosciuto.\n"
 "Forse  stato rimosso o spostato dall'ultima volta che lo si e' usato"
 
-#: plugin_insert.cc:1115
+#: plugin_insert.cc:2645
 msgid "PluginInsert: Auto: no ladspa port number"
 msgstr ""
 
-#: plugin_insert.cc:1122
+#: plugin_insert.cc:2652
 msgid "PluginInsert: Auto: port id out of range"
 msgstr ""
 
-#: plugin_insert.cc:1158
+#: plugin_insert.cc:2688
 msgid "PluginInsert: automatable control %1 not found - ignored"
 msgstr ""
 
-#: plugin_manager.cc:209
+#: plugin_manager.cc:220
 msgid "Discovering Plugins"
 msgstr ""
 
-#: plugin_manager.cc:231
+#: plugin_manager.cc:251
 msgid "Scanning LADSPA Plugins"
 msgstr ""
 
-#: plugin_manager.cc:234
+#: plugin_manager.cc:253
+msgid "Scanning Lua DSP Processors"
+msgstr ""
+
+#: plugin_manager.cc:256
 msgid "Scanning LV2 Plugins"
 msgstr ""
 
-#: plugin_manager.cc:239
+#: plugin_manager.cc:262
 msgid "Scanning Windows VST Plugins"
 msgstr ""
 
-#: plugin_manager.cc:246
+#: plugin_manager.cc:264
+msgid "Discovering Windows VST Plugins"
+msgstr ""
+
+#: plugin_manager.cc:273
 msgid "Scanning Linux VST Plugins"
 msgstr ""
 
-#: plugin_manager.cc:252
+#: plugin_manager.cc:275
+msgid "Discovering Linux VST Plugins"
+msgstr ""
+
+#: plugin_manager.cc:288
+msgid "VST Blacklist: "
+msgstr ""
+
+#: plugin_manager.cc:290
+msgid "VST Blacklist:"
+msgstr ""
+
+#: plugin_manager.cc:300
 msgid "Scanning AU Plugins"
 msgstr ""
 
-#: plugin_manager.cc:256
+#: plugin_manager.cc:302
+msgid "Discovering AU Plugins"
+msgstr ""
+
+#: plugin_manager.cc:307
 msgid "Plugin Scan Complete..."
 msgstr ""
 
-#: plugin_manager.cc:393
+#: plugin_manager.cc:513
 msgid "LADSPA"
 msgstr ""
 
-#: plugin_manager.cc:445
+#: plugin_manager.cc:565
 msgid "Could not parse rdf file: %1"
 msgstr ""
 
-#: plugin_manager.cc:482
+#: plugin_manager.cc:602
 msgid "LADSPA: cannot load module \"%1\" (%2)"
 msgstr "LADSPA: impossibile caricare il modulo \"%1\" (%2)"
 
-#: plugin_manager.cc:489
+#: plugin_manager.cc:609
 msgid "LADSPA: module \"%1\" has no descriptor function."
 msgstr "LADSPA: il modulo \"%1\" non ha alcuna funzione descriptor."
 
-#: plugin_manager.cc:705
+#: plugin_manager.cc:813
+msgid "--- Windows VST plugins Scan: %1"
+msgstr ""
+
+#: plugin_manager.cc:819
 msgid "VST"
 msgstr ""
 
-#: plugin_manager.cc:732
+#: plugin_manager.cc:824
+msgid "--- Windows VST plugins Scan Done"
+msgstr ""
+
+#: plugin_manager.cc:839
+msgid "cannot open dll"
+msgstr ""
+
+#: plugin_manager.cc:843
+msgid "invalid dll, file too small"
+msgstr ""
+
+#: plugin_manager.cc:847
+msgid "not a dll"
+msgstr ""
+
+#: plugin_manager.cc:853
+msgid "cannot determine dll type"
+msgstr ""
+
+#: plugin_manager.cc:857
+msgid "cannot read dll PE header"
+msgstr ""
+
+#: plugin_manager.cc:862
+msgid "invalid dll PE header"
+msgstr ""
+
+#: plugin_manager.cc:869
+msgid "i386 (32-bit)"
+msgstr ""
+
+#: plugin_manager.cc:872
+msgid "Itanium"
+msgstr ""
+
+#: plugin_manager.cc:875
+msgid "x64 (64-bit)"
+msgstr ""
+
+#: plugin_manager.cc:878
+msgid "Native Architecture"
+msgstr ""
+
+#: plugin_manager.cc:881
+msgid "Unknown Architecture"
+msgstr ""
+
+#: plugin_manager.cc:897
+msgid " *  %1 (cache only)"
+msgstr ""
+
+#: plugin_manager.cc:899
+msgid " *  %1 - %2"
+msgstr ""
+
+#: plugin_manager.cc:913
+msgid " -> Cannot get Windows VST information, plugin ignored."
+msgstr ""
+
+#: plugin_manager.cc:924
 msgid ""
-"VST plugin %1 does not support processReplacing, and so cannot be used in %2 "
-"at this time"
+"VST plugin %1 does not support processReplacing, and cannot be used in %2 at "
+"this time"
 msgstr ""
 
-#: plugin_manager.cc:824
+#: plugin_manager.cc:959
+msgid "Ignoring duplicate Windows VST plugin \"%1\""
+msgstr ""
+
+#: plugin_manager.cc:971
+msgid " -> OK (VST Plugin \"%1\" was added)."
+msgstr ""
+
+#: plugin_manager.cc:1019
 msgid "LXVST"
 msgstr ""
 
-#: plugin_manager.cc:851
+#: plugin_manager.cc:1046
 msgid ""
 "linuxVST plugin %1 does not support processReplacing, and so cannot be used "
 "in %2 at this time"
 msgstr ""
 
-#: plugin_manager.cc:1020
+#: plugin_manager.cc:1213
 msgid "unknown plugin status type \"%1\" - all entries ignored"
 msgstr ""
 
-#: plugin_manager.cc:1037
+#: plugin_manager.cc:1232
 msgid "unknown plugin type \"%1\" - ignored"
 msgstr ""
 
-#: port.cc:450
+#: port.cc:504
 msgid "could not reregister %1"
 msgstr ""
 
@@ -1436,150 +1895,215 @@ msgstr ""
 msgid "insert %1"
 msgstr ""
 
-#: port_insert.cc:197
+#: port_insert.cc:204
 msgid "XML node describing port insert is missing the `type' field"
 msgstr ""
 
-#: port_insert.cc:202
+#: port_insert.cc:209
 msgid "non-port insert XML used for port plugin insert"
 msgstr "insert non-port XML usato per insert di plugin di porta"
 
-#: port_manager.cc:287
+#: port_manager.cc:288
 msgid ""
 "a port with the name \"%1\" already exists: check for duplicated track/bus "
 "names"
 msgstr ""
 
-#: port_manager.cc:289
+#: port_manager.cc:290
 msgid ""
 "No more ports are available. You will need to stop %1 and restart with more "
 "ports if you need this many tracks."
 msgstr ""
 
-#: port_manager.cc:292
+#: port_manager.cc:293
 msgid "AudioEngine: cannot register port \"%1\": %2"
 msgstr ""
 
-#: port_manager.cc:331
+#: port_manager.cc:332
 msgid "unable to create port: %1"
 msgstr ""
 
-#: port_manager.cc:418
+#: port_manager.cc:453
 msgid "AudioEngine: cannot connect %1 (%2) to %3 (%4)"
 msgstr ""
 
-#: port_manager.cc:470 port_manager.cc:471
+#: port_manager.cc:505 port_manager.cc:506
 msgid "Re-establising port %1 failed"
 msgstr ""
 
-#: processor.cc:214
+#: processor.cc:218
 msgid "No %1 property flag in element %2"
 msgstr ""
 
-#: processor.cc:223
+#: processor.cc:227
 msgid "No child node with active property"
 msgstr ""
 
-#: rc_configuration.cc:91
+#: rc_configuration.cc:92
 msgid "Loading system configuration file %1"
 msgstr ""
 
-#: rc_configuration.cc:95
+#: rc_configuration.cc:96
 msgid "%1: cannot read system configuration file \"%2\""
 msgstr ""
 
-#: rc_configuration.cc:100
+#: rc_configuration.cc:101
 msgid "%1: system configuration file \"%2\" not loaded successfully."
 msgstr ""
 
-#: rc_configuration.cc:104
+#: rc_configuration.cc:105
 msgid ""
 "Your system %1 configuration file is empty. This probably means that there "
 "was an error installing %1"
 msgstr ""
 
-#: rc_configuration.cc:119
+#: rc_configuration.cc:120
 msgid "Loading user configuration file %1"
 msgstr ""
 
-#: rc_configuration.cc:123
+#: rc_configuration.cc:124
 msgid "%1: cannot read configuration file \"%2\""
 msgstr ""
 
-#: rc_configuration.cc:128
+#: rc_configuration.cc:129
 msgid "%1: user configuration file \"%2\" not loaded successfully."
 msgstr ""
 
-#: rc_configuration.cc:132
+#: rc_configuration.cc:133
 msgid "your %1 configuration file is empty. This is not normal."
 msgstr ""
 
-#: rc_configuration.cc:149
+#: rc_configuration.cc:150
 msgid "Config file %1 not saved"
 msgstr ""
 
-#: recent_sessions.cc:54
+#: recent_sessions.cc:55
 msgid "cannot open recent session file %1 (%2)"
 msgstr ""
 
-#: region_factory.cc:78 region_factory.cc:120 region_factory.cc:161
-#: region_factory.cc:203
+#: recent_sessions.cc:68 recent_sessions.cc:126
+msgid "Error reading recent session file %1 (%2)"
+msgstr ""
+
+#: recent_sessions.cc:113
+msgid "Cannot open recent template file %1 (%2)"
+msgstr ""
+
+#: recent_sessions.cc:176
+msgid "Error writing recent sessions file %1 (%2)"
+msgstr ""
+
+#: recent_sessions.cc:211
+msgid "Error writing saved template file %1 (%2)"
+msgstr ""
+
+#: region_factory.cc:78 region_factory.cc:121 region_factory.cc:162
+#: region_factory.cc:204
 msgid ""
 "programming error: RegionFactory::create() called with unknown Region type"
 msgstr ""
 
-#: region_factory.cc:565
+#: region_factory.cc:566
 msgid "%1 compound-%2 (%3)"
 msgstr ""
 
-#: region_factory.cc:567
+#: region_factory.cc:568
 msgid "%1 compound-%2.1 (%3)"
 msgstr ""
 
-#: region_factory.cc:629
+#: region_factory.cc:630
 msgid "cannot create new name for region \"%1\""
 msgstr "impossibile creare un nuovo nome per la regione \"%1\""
 
-#: resampled_source.cc:102
+#: resampled_source.cc:107
 msgid "Import: %1"
 msgstr ""
 
-#: resampled_source.cc:132 srcfilesource.cc:75
+#: resampled_source.cc:136 srcfilesource.cc:75
 msgid "Import: src_new() failed : %1"
 msgstr ""
 
-#: return.cc:41
+#: return.cc:42
 msgid "return %1"
 msgstr ""
 
-#: route.cc:1218 route.cc:2701
+#: route.cc:862 route.cc:2797
 msgid "unknown Processor type \"%1\"; ignored"
 msgstr ""
 
-#: route.cc:1240
+#: route.cc:884
 msgid "processor could not be created. Ignored."
 msgstr ""
 
-#: route.cc:2126 route.cc:2355
+#: route.cc:2338 route.cc:2504
 msgid "Bad node sent to Route::set_state() [%1]"
 msgstr ""
 
-#: route.cc:2186
+#: route.cc:2395
 msgid "Pannable state found for route (%1) without a panner!"
 msgstr ""
 
-#: route.cc:2260 route.cc:2264 route.cc:2469 route.cc:2473
-msgid "badly formed order key string in state file! [%1] ... ignored."
+#: route.cc:3270
+msgid "Invalid Solo-Isolate propagation: from:%1 new:%2 - old:%3 = delta:%4"
+msgstr ""
+
+#: route.cc:4396
+msgid "Amp/Fader on Route '%1' went AWOL. Re-added."
+msgstr ""
+
+#: route.cc:4994
+msgid "lo"
+msgstr ""
+
+#: route.cc:4996
+msgid "mid"
+msgstr ""
+
+#: route.cc:4998
+msgid "hi"
+msgstr ""
+
+#: route.cc:5105
+msgid "Leveler"
+msgstr ""
+
+#: route.cc:5107
+msgid "Compressor"
+msgstr ""
+
+#: route.cc:5109 route.cc:5111
+msgid "Limiter"
+msgstr ""
+
+#: route.cc:5111
+msgid "Sidechain"
+msgstr ""
+
+#: route.cc:5114 route.cc:5116 route.cc:5133 route.cc:5135
+msgid "???"
+msgstr ""
+
+#: route.cc:5126
+msgid "Attk"
+msgstr ""
+
+#: route.cc:5128
+msgid "Ratio"
 msgstr ""
 
-#: route.cc:2479
-msgid "Converting deprecated order key for %1 using Editor order %2"
+#: route.cc:5131
+msgid "Rels"
 msgstr ""
 
-#: route_group.cc:459
+#: route_group.cc:507
 msgid "You cannot subgroup MIDI tracks at this time"
 msgstr ""
 
+#: route_group.cc:514
+msgid ""
+"You cannot subgroup tracks with different number of outputs at this time."
+msgstr ""
+
 #: rb_effect.cc:229 rb_effect.cc:269
 msgid "tempoize: error reading data from %1 at %2 (wanted %3, got %4)"
 msgstr ""
@@ -1588,206 +2112,246 @@ msgstr ""
 msgid "error writing tempo-adjusted data to %1"
 msgstr ""
 
-#: send.cc:61
+#: send.cc:62
 msgid "aux %1"
 msgstr ""
 
-#: send.cc:65
+#: send.cc:66
 msgid "send %1"
 msgstr ""
 
-#: send.cc:67
+#: send.cc:68
 msgid "programming error: send created using role %1"
 msgstr ""
 
-#: session.cc:357
+#: session.cc:348 session.cc:403
+msgid "Cannot connect to audio/midi engine"
+msgstr ""
+
+#: session.cc:358
+msgid "Session initialization failed"
+msgstr ""
+
+#: session.cc:374
+msgid "Failed to load template/snapshot state"
+msgstr ""
+
+#: session.cc:385
+msgid "Failed to load state"
+msgstr ""
+
+#: session.cc:409
+msgid "Cannot configure audio/midi engine with session parameters"
+msgstr ""
+
+#: session.cc:433
 msgid "Connect to engine"
 msgstr ""
 
-#: session.cc:362
+#: session.cc:484
 msgid "Session loading complete"
 msgstr ""
 
-#: session.cc:434
+#: session.cc:575
 msgid "Set up LTC"
 msgstr ""
 
-#: session.cc:436
+#: session.cc:577
 msgid "Set up Click"
 msgstr ""
 
-#: session.cc:438
+#: session.cc:579
 msgid "Set up standard connections"
 msgstr ""
 
-#: session.cc:664
+#: session.cc:888
 msgid "could not setup Click I/O"
 msgstr "impossibile impostare entrata/uscita del click"
 
-#: session.cc:727
+#: session.cc:951
 #, c-format
 msgid "out %s"
 msgstr ""
 
-#: session.cc:729
+#: session.cc:953
 #, c-format
 msgid "out %<PRIu32>"
 msgstr ""
 
-#: session.cc:744
+#: session.cc:968
 #, c-format
 msgid "out %<PRIu32>+%<PRIu32>"
 msgstr ""
 
-#: session.cc:761
+#: session.cc:985
 #, c-format
 msgid "in %s"
 msgstr ""
 
-#: session.cc:763
+#: session.cc:987
 #, c-format
 msgid "in %<PRIu32>"
 msgstr ""
 
-#: session.cc:778
+#: session.cc:1002
 #, c-format
 msgid "in %<PRIu32>+%<PRIu32>"
 msgstr ""
 
-#: session.cc:852
+#: session.cc:1082
 msgid "cannot connect master output %1 to %2"
 msgstr ""
 
-#: session.cc:921
-msgid "Monitor"
+#: session.cc:1170
+msgid "Cannot create monitor section. 'Monitor' Port name is not unique."
 msgstr ""
 
-#: session.cc:966
+#: session.cc:1204 session.cc:1335
 msgid "cannot connect control input %1 to %2"
 msgstr ""
 
-#: session.cc:986
+#: session.cc:1224 session.cc:1354
 msgid "The preferred I/O for the monitor bus (%1) cannot be found"
 msgstr ""
 
-#: session.cc:1017
+#: session.cc:1255 session.cc:1385
 msgid "cannot connect control output %1 to %2"
 msgstr ""
 
-#: session.cc:1085
+#: session.cc:1443
 msgid "cannot create Auditioner: no auditioning of regions possible"
 msgstr "impossibile creare l'Auditioner"
 
-#: session.cc:1270
+#: session.cc:1644
 msgid "Session: you can't use that location for auto punch (start <= end)"
 msgstr ""
 "Sessione: non si può usare quella location per l'auto punch (inizio <= fine)"
 
-#: session.cc:1297
+#: session.cc:1671
 msgid "Session: you can't use that location for session start/end)"
 msgstr ""
 
-#: session.cc:1329
+#: session.cc:1703
 msgid ""
 "You cannot use this location for auto-loop because it has zero or negative "
 "length"
 msgstr ""
 
-#: session.cc:1497
+#: session.cc:1886
 msgid "programming error: session range removed!"
 msgstr ""
 
-#: session.cc:1751
+#: session.cc:2158
 msgid "feedback loop setup between %1 and %2"
 msgstr ""
 
-#: session.cc:2047
+#: session.cc:2419
+msgid "Track "
+msgstr ""
+
+#: session.cc:2421
+msgid "Audio "
+msgstr ""
+
+#: session.cc:2426
+msgid "MIDI "
+msgstr ""
+
+#: session.cc:2500
 msgid "Session: could not create new midi track."
 msgstr ""
 
-#: session.cc:2053
+#: session.cc:2506
 msgid ""
 "No more JACK ports are available. You will need to stop %1 and restart JACK "
 "with more ports if you need this many tracks."
 msgstr ""
 
-#: session.cc:2239 session.cc:2242
-msgid "Audio"
+#: session.cc:2547 session.cc:2550
+msgid "Midi Bus"
+msgstr ""
+
+#: session.cc:2572
+msgid "cannot configure new midi bus input"
+msgstr ""
+
+#: session.cc:2578
+msgid "cannot configure new midi bus output"
 msgstr ""
 
-#: session.cc:2266 session.cc:2274 session.cc:2352 session.cc:2360
+#: session.cc:2592 session.cc:3137
+msgid "Session: could not create new audio route."
+msgstr ""
+
+#: session.cc:3022 session.cc:3030 session.cc:3113 session.cc:3121
 msgid "cannot configure %1 in/%2 out configuration for new audio track"
 msgstr ""
 
-#: session.cc:2297
+#: session.cc:3050
 msgid "Session: could not create new audio track."
 msgstr "Sessione: impossibile creare una nuova traccia audio"
 
-#: session.cc:2330 session.cc:2333
+#: session.cc:3088 session.cc:3091
 msgid "Bus"
 msgstr ""
 
-#: session.cc:2383
-msgid "Session: could not create new audio route."
-msgstr ""
-
-#: session.cc:2443 session.cc:2453
+#: session.cc:3207 session.cc:3217
 msgid "Session: UINT_MAX routes? impossible!"
 msgstr ""
 
-#: session.cc:2475
+#: session.cc:3293
 msgid "Session: cannot create track/bus from template description"
 msgstr ""
 
-#: session.cc:2501
+#: session.cc:3331
 msgid "Session: could not create new route from template"
 msgstr ""
 
-#: session.cc:2531
+#: session.cc:3365
 msgid "Adding new tracks/busses failed"
 msgstr ""
 
-#: session.cc:3671
+#: session.cc:4784
 msgid "Merging embedded file %1: name collision AND md5 hash collision!"
 msgstr ""
 
-#: session.cc:3801 session.cc:3874
+#: session.cc:4914 session.cc:4987
 msgid "There are already %1 recordings for %2, which I consider too many."
 msgstr "Ci sono già %1 registrazioni per %2, che io considero troppe"
 
-#: session.cc:4316
+#: session.cc:5663
 msgid "send ID %1 appears to be in use already"
 msgstr ""
 
-#: session.cc:4328
+#: session.cc:5675
 msgid "aux send ID %1 appears to be in use already"
 msgstr ""
 
-#: session.cc:4340
+#: session.cc:5687
 msgid "return ID %1 appears to be in use already"
 msgstr ""
 
-#: session.cc:4352
+#: session.cc:5699
 msgid "insert ID %1 appears to be in use already"
 msgstr ""
 
-#: session.cc:4477
+#: session.cc:5825
 msgid "Cannot write a range where end <= start (e.g. %1 <= %2)"
 msgstr ""
 
-#: session.cc:4486
+#: session.cc:5834
 msgid "Cannot write a range with no data."
 msgstr ""
 
-#: session.cc:4528
+#: session.cc:5876
 msgid "cannot create new file \"%1\" for %2"
 msgstr ""
 
-#: session_click.cc:161
+#: session_click.cc:162
 msgid "cannot open click soundfile %1 (%2)"
 msgstr "impossibile accedere al file audio per il click %1 (%2)"
 
-#: session_click.cc:174
+#: session_click.cc:175
 msgid "cannot read data from click soundfile"
 msgstr "impossibile leggere dati dal file audio per il click"
 
@@ -1826,23 +2390,36 @@ msgstr ""
 msgid "Could not save session options"
 msgstr ""
 
-#: session_directory.cc:59
+#: session_directory.cc:65
 msgid "Cannot create Session directory at path %1 Error: %2"
 msgstr ""
 
-#: session_directory.cc:76
+#: session_directory.cc:82
 msgid "Session subdirectory does not exist at path %1"
 msgstr ""
 
-#: session_events.cc:234
+#: session_directory.cc:161
+msgid ""
+"session-dir and session-name mismatch. Please use 'Menu > Session > Rename' "
+"in the future to rename sessions."
+msgstr ""
+
+#: session_directory.cc:167
+msgid ""
+"The session's interchange dir is tainted.\n"
+"There is more than one folder in '%1'.\n"
+"Please remove extra subdirs to reduce possible filename ambiguties."
+msgstr ""
+
+#: session_events.cc:229
 msgid "Session: cannot have two events of type %1 at the same frame (%2)."
 msgstr ""
 
-#: session_export.cc:125
+#: session_export.cc:152
 msgid "%1: cannot seek to %2 for export"
 msgstr ""
 
-#: session_export.cc:182
+#: session_export.cc:216
 msgid "Export ended unexpectedly: %1"
 msgstr ""
 
@@ -1852,413 +2429,466 @@ msgid ""
 "of this session."
 msgstr ""
 
-#: session_midi.cc:520
+#: session_midi.cc:570
 msgid "Session: cannot send quarter-frame MTC message (%1)"
 msgstr ""
 
-#: session_playlists.cc:378 session_playlists.cc:397
+#: session_playlists.cc:405 session_playlists.cc:424
 msgid "Session: cannot create Playlist from XML description."
 msgstr "Sessione: impossibile creare Playlist dalla descrizione XML"
 
-#: session_process.cc:136
+#: session_process.cc:159
 msgid "Session: error in no roll for %1"
 msgstr ""
 
-#: session_process.cc:1174
+#: session_process.cc:1202
 msgid "Programming error: illegal event type in process_event (%1)"
 msgstr ""
 
-#: session_state.cc:179
+#: session_state.cc:194
 msgid "solo cut control (dB)"
 msgstr ""
 
-#: session_state.cc:203
+#: session_state.cc:216
 msgid "Set block size and sample rate"
 msgstr ""
 
-#: session_state.cc:208
+#: session_state.cc:221
 msgid "Using configuration"
 msgstr ""
 
-#: session_state.cc:331
+#: session_state.cc:348
 msgid "Reset Remote Controls"
 msgstr ""
 
-#: session_state.cc:423
+#: session_state.cc:377 session_state.cc:409
+msgid "Filling playback buffers"
+msgstr ""
+
+#: session_state.cc:475
 msgid "Session: cannot create session peakfile folder \"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:430
+#: session_state.cc:482
 msgid "Session: cannot create session sounds dir \"%1\" (%2)"
 msgstr ""
 "Sessione: impossibile creare la cartella sounds per la sessione \"%1\" (%2)"
 
-#: session_state.cc:437
+#: session_state.cc:489
 msgid "Session: cannot create session midi dir \"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:444
+#: session_state.cc:496
 msgid "Session: cannot create session dead sounds folder \"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:451
+#: session_state.cc:503
 msgid "Session: cannot create session export folder \"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:458
+#: session_state.cc:510
 msgid "Session: cannot create session analysis folder \"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:465
+#: session_state.cc:517
 msgid "Session: cannot create session plugins folder \"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:472
+#: session_state.cc:524
 msgid "Session: cannot create session externals folder \"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:486
+#: session_state.cc:538
 msgid "Session: cannot create session folder \"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:520
+#: session_state.cc:569
+msgid "Error reading session template file %1 (%2)"
+msgstr ""
+
+#: session_state.cc:584
+msgid "Error writing session template file %1 (%2)"
+msgstr ""
+
+#: session_state.cc:601
 msgid "Could not open %1 for writing session template"
 msgstr ""
 
-#: session_state.cc:526
+#: session_state.cc:608
 msgid "Could not open session template %1 for reading"
 msgstr ""
 
-#: session_state.cc:545
-msgid "Master"
+#: session_state.cc:626
+msgid "Loop"
 msgstr ""
 
-#: session_state.cc:606
+#: session_state.cc:707
 msgid "Could not remove pending capture state at path \"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:630
+#: session_state.cc:731
 msgid "could not rename snapshot %1 to %2 (%3)"
 msgstr ""
 
-#: session_state.cc:658
+#: session_state.cc:759
 msgid "Could not remove session file at path \"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:685
+#: session_state.cc:788
 msgid ""
 "the %1 audio engine is not connected and state saving would lose all I/O "
 "connections. Session not saved"
 msgstr ""
 
-#: session_state.cc:736
+#: session_state.cc:856
 msgid "state could not be saved to %1"
 msgstr ""
 
-#: session_state.cc:738 session_state.cc:749
+#: session_state.cc:858 session_state.cc:871
 msgid "Could not remove temporary session file at path \"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:746
+#: session_state.cc:868
 msgid "could not rename temporary session file %1 to %2 (%3)"
 msgstr ""
 
-#: session_state.cc:814
+#: session_state.cc:942
 msgid "%1: session file \"%2\" doesn't exist!"
 msgstr ""
 
-#: session_state.cc:826
+#: session_state.cc:954
 msgid "Could not understand session file %1"
 msgstr ""
 
-#: session_state.cc:835
+#: session_state.cc:963
 msgid "Session file %1 is not a session"
 msgstr ""
 
-#: session_state.cc:1147
+#: session_state.cc:1332
 msgid "programming error: Session: incorrect XML node sent to set_state()"
 msgstr ""
 
-#: session_state.cc:1201
+#: session_state.cc:1410
 msgid "Session: XML state has no options section"
 msgstr "Sessione: il file di stato XML non ha alcuna sezione option"
 
-#: session_state.cc:1206
+#: session_state.cc:1415
 msgid "Session: XML state has no metadata section"
 msgstr ""
 
-#: session_state.cc:1217
+#: session_state.cc:1426
 msgid "Session: XML state has no sources section"
 msgstr "Sessione: il file di stato XML non ha alcuna sezione sources"
 
-#: session_state.cc:1224
+#: session_state.cc:1433
 msgid "Session: XML state has no Tempo Map section"
 msgstr "Sessione: il file di stato XML non ha alcuna sezione Tempo Map"
 
-#: session_state.cc:1231
+#: session_state.cc:1440
 msgid "Session: XML state has no locations section"
 msgstr "Sessione: il file di stato XML non ha alcuna sezione locations"
 
-#: session_state.cc:1244
+#: session_state.cc:1453
 msgid "Session: XML state has no Regions section"
 msgstr "Sessione: il file di stato XML non ha alcuna sezione Regions"
 
-#: session_state.cc:1251
+#: session_state.cc:1460
 msgid "Session: XML state has no playlists section"
 msgstr "Sessione: il file di stato XML non ha alcuna sezione playlist"
 
-#: session_state.cc:1271
+#: session_state.cc:1480
 msgid "Session: XML state has no bundles section"
 msgstr ""
 
-#: session_state.cc:1283
+#: session_state.cc:1492
 msgid "Session: XML state has no diskstreams section"
 msgstr "Sessione: il file di stato XML non ha alcuna sezione diskstream"
 
-#: session_state.cc:1291
+#: session_state.cc:1504
 msgid "Session: XML state has no routes section"
 msgstr "Sessione: il file di stato XML non ha alcuna sezione routes"
 
-#: session_state.cc:1303
+#: session_state.cc:1520
 msgid "Session: XML state has no route groups section"
 msgstr ""
 
-#: session_state.cc:1312
+#: session_state.cc:1529
 msgid "Session: XML state has no edit groups section"
 msgstr "Sessione: il file di stato XML non ha alcuna sezione edit groups"
 
-#: session_state.cc:1319
+#: session_state.cc:1536
 msgid "Session: XML state has no mix groups section"
 msgstr "Sessione: il file di stato XML non ha alcuna sezione mix groups"
 
-#: session_state.cc:1327
+#: session_state.cc:1544
 msgid "Session: XML state has no click section"
 msgstr ""
 
-#: session_state.cc:1373
+#: session_state.cc:1606
 msgid "Session: cannot create Route from XML description."
 msgstr "Sessione: impossibile creare Route dalla descrizione XML"
 
-#: session_state.cc:1377
+#: session_state.cc:1610
 msgid "Loaded track/bus %1"
 msgstr ""
 
-#: session_state.cc:1382
+#: session_state.cc:1615
 msgid "Tracks/busses loaded;  Adding to Session"
 msgstr ""
 
-#: session_state.cc:1386
+#: session_state.cc:1619
 msgid "Finished adding tracks/busses"
 msgstr ""
 
-#: session_state.cc:1485
+#: session_state.cc:1709
 msgid "Could not find diskstream for route"
 msgstr ""
 
-#: session_state.cc:1545
+#: session_state.cc:1760
 msgid "Session: cannot create Region from XML description."
 msgstr "Sessione: impossibile creare regione dalla descrizione XML"
 
-#: session_state.cc:1549
+#: session_state.cc:1764
 msgid "Can not load state for region '%1'"
 msgstr ""
 
-#: session_state.cc:1585
+#: session_state.cc:1800
 msgid "Regions in compound description not found (ID's %1 and %2): ignored"
 msgstr ""
 
-#: session_state.cc:1613
+#: session_state.cc:1828
 msgid "Nested source has no ID info in session file! (ignored)"
 msgstr ""
 
-#: session_state.cc:1625
+#: session_state.cc:1840
 msgid "Cannot reconstruct nested source for region %1"
 msgstr ""
 
-#: session_state.cc:1687
+#: session_state.cc:1902
 msgid "Session: XMLNode describing a AudioRegion is incomplete (no source)"
 msgstr ""
 
-#: session_state.cc:1695 session_state.cc:1716 session_state.cc:1736
+#: session_state.cc:1910 session_state.cc:1931 session_state.cc:1951
 msgid ""
 "Session: XMLNode describing a AudioRegion references an unknown source id =%1"
 msgstr ""
 
-#: session_state.cc:1701 session_state.cc:1722 session_state.cc:1742
+#: session_state.cc:1916 session_state.cc:1937 session_state.cc:1957
 msgid ""
 "Session: XMLNode describing a AudioRegion references a non-audio source id ="
 "%1"
 msgstr ""
 
-#: session_state.cc:1765
+#: session_state.cc:1980
 msgid ""
 "Session: XMLNode describing an AudioRegion is missing some master sources; "
 "ignored"
 msgstr ""
 
-#: session_state.cc:1799
+#: session_state.cc:2014
 msgid "Session: XMLNode describing a MidiRegion is incomplete (no source)"
 msgstr ""
 
-#: session_state.cc:1807
+#: session_state.cc:2022
 msgid ""
 "Session: XMLNode describing a MidiRegion references an unknown source id =%1"
 msgstr ""
 
-#: session_state.cc:1813
+#: session_state.cc:2028
 msgid ""
 "Session: XMLNode describing a MidiRegion references a non-midi source id =%1"
 msgstr ""
 
-#: session_state.cc:1872
+#: session_state.cc:2101
 msgid "Session: cannot create Source from XML description."
 msgstr "Sessione: impossibile creare Source dalla descrizione XML"
 
-#: session_state.cc:1880
+#: session_state.cc:2109
 msgid ""
 "A external MIDI file is missing. %1 cannot currently recover from missing "
 "external MIDI files"
 msgstr ""
 
-#: session_state.cc:1962
+#: session_state.cc:2191
 msgid "Found a sound file that cannot be used by %1. Talk to the programmers."
 msgstr ""
 
-#: session_state.cc:1979
+#: session_state.cc:2212
 msgid "Could not create templates directory \"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:1992
+#: session_state.cc:2224
 msgid "Template \"%1\" already exists - new version not created"
 msgstr "Il modello \"%1\" esiste già - non è stata creata una nuova versione"
 
-#: session_state.cc:1998
+#: session_state.cc:2230
 msgid "Could not create directory for Session template\"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:2008
+#: session_state.cc:2259
 msgid "template not saved"
 msgstr ""
 
-#: session_state.cc:2018
-msgid "Could not create directory for Session template plugin state\"%1\" (%2)"
+#: session_state.cc:2501
+msgid "Unknown node \"%1\" found in Bundles list from session file"
 msgstr ""
 
-#: session_state.cc:2261
-msgid "Unknown node \"%1\" found in Bundles list from session file"
+#: session_state.cc:2969
+msgid "Cannot cleanup peak-files for read-only session."
+msgstr ""
+
+#: session_state.cc:2973
+msgid "Cannot cleanup peak-files while recording"
+msgstr ""
+
+#: session_state.cc:2996
+msgid ""
+"Timeout waiting for peak-file creation to terminate before cleanup, please "
+"try again later."
 msgstr ""
 
-#: session_state.cc:2834
+#: session_state.cc:3261
 msgid "Session: cannot create dead file folder \"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:2873
+#: session_state.cc:3296
 msgid "cannot rename unused file source from %1 to %2 (%3)"
 msgstr ""
 
-#: session_state.cc:2891
+#: session_state.cc:3312
 msgid "cannot remove peakfile %1 for %2 (%3)"
 msgstr "impossibile eliminare il peakfile %1 per %2 (%3)"
 
-#: session_state.cc:3204
+#: session_state.cc:3633
 msgid "could not backup old history file, current history not saved"
 msgstr ""
 
-#: session_state.cc:3213
+#: session_state.cc:3642
 msgid "history could not be saved to %1"
 msgstr ""
 
-#: session_state.cc:3216
+#: session_state.cc:3645
 msgid "Could not remove history file at path \"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:3220
+#: session_state.cc:3649
 msgid "could not restore history file from backup %1 (%2)"
 msgstr ""
 
-#: session_state.cc:3245
+#: session_state.cc:3674
 msgid "%1: no history file \"%2\" for this session."
 msgstr ""
 
-#: session_state.cc:3251
+#: session_state.cc:3680
 msgid "Could not understand session history file \"%1\""
 msgstr ""
 
-#: session_state.cc:3293
+#: session_state.cc:3722
 msgid "Failed to downcast MidiSource for NoteDiffCommand"
 msgstr ""
 
-#: session_state.cc:3304
+#: session_state.cc:3733
 msgid "Failed to downcast MidiSource for SysExDiffCommand"
 msgstr ""
 
-#: session_state.cc:3315
+#: session_state.cc:3744
 msgid "Failed to downcast MidiSource for PatchChangeDiffCommand"
 msgstr ""
 
-#: session_state.cc:3323
+#: session_state.cc:3752
 msgid "Couldn't figure out how to make a Command out of a %1 XMLNode."
 msgstr ""
 
-#: session_state.cc:3559
+#: session_state.cc:3990
 msgid "Session: unknown diskstream type in XML"
 msgstr ""
 
-#: session_state.cc:3564
+#: session_state.cc:3995
 msgid "Session: could not load diskstream via XML state"
 msgstr ""
 
-#: session_state.cc:3688 session_state.cc:3716 session_state.cc:3729
-#: session_state.cc:3744
+#: session_state.cc:4092
+msgid "Cannot rename read-only session."
+msgstr ""
+
+#: session_state.cc:4096
+msgid "Cannot rename session while recording"
+msgstr ""
+
+#: session_state.cc:4181 session_state.cc:4182 session_state.cc:4224
+#: session_state.cc:4228
 msgid "renaming %s as %2 failed (%3)"
 msgstr ""
 
+#: session_state.cc:4244 session_state.cc:4245 session_state.cc:4259
+#: session_state.cc:4260
+msgid "renaming %1 as %2 failed (%3)"
+msgstr ""
+
+#: session_state.cc:4571
+msgid "Cannot create new session folder %1"
+msgstr ""
+
+#: session_state.cc:4633 session_state.cc:4708
+msgid ""
+"\n"
+"copying \"%1\" failed !"
+msgstr ""
+
+#: session_state.cc:4906
+msgid "unknown reason"
+msgstr ""
+
 #: session_time.cc:214
 msgid "Unknown transport state %1 in sync callback"
 msgstr ""
 
-#: session_transport.cc:171
+#: session_transport.cc:177
 msgid "Cannot loop - no loop range defined"
 msgstr ""
 
-#: session_transport.cc:833
+#: session_transport.cc:968
 msgid ""
 "Seamless looping cannot be supported while %1 is using JACK transport.\n"
 "Recommend changing the configured options"
 msgstr ""
 
-#: session_transport.cc:915
+#: session_transport.cc:1050
 msgid "Locate called for negative sample position - ignored"
 msgstr ""
 
-#: session_transport.cc:1272
+#: session_transport.cc:1401
 msgid ""
 "Global varispeed cannot be supported while %1 is connected to JACK transport "
 "control"
 msgstr ""
 
-#: smf_source.cc:344
+#: slavable.cc:100
+msgid "Master #%1 not found, assignment lost"
+msgstr ""
+
+#: smf_source.cc:350
 msgid "Unable to read event prefix, corrupt MIDI ring"
 msgstr ""
 
-#: smf_source.cc:357
+#: smf_source.cc:363
 msgid "Event has time and size but no body, corrupt MIDI ring"
 msgstr ""
 
-#: smf_source.cc:363
+#: smf_source.cc:369
 msgid "Event time is before MIDI source position"
 msgstr ""
 
-#: smf_source.cc:409
+#: smf_source.cc:417
 msgid ""
 "Skipping event with unordered beat time %1 < %2 (off by %3 beats, %4 ticks)"
 msgstr ""
 
-#: smf_source.cc:453
+#: smf_source.cc:461
 msgid "Skipping event with unordered frame time %1 < %2"
 msgstr ""
 
-#: smf_source.cc:518
+#: smf_source.cc:526
 msgid "cannot open MIDI file %1 for write"
 msgstr ""
 
@@ -2275,7 +2905,7 @@ msgid "CAF"
 msgstr ""
 
 #: sndfile_helpers.cc:37
-msgid "W64 (64 bit WAV)"
+msgid "W64 (64-bit WAV)"
 msgstr ""
 
 #: sndfile_helpers.cc:38
@@ -2319,23 +2949,23 @@ msgid ".raw"
 msgstr ""
 
 #: sndfile_helpers.cc:66
-msgid "Signed 16 bit PCM"
+msgid "Signed 16-bit PCM"
 msgstr ""
 
 #: sndfile_helpers.cc:67
-msgid "Signed 24 bit PCM"
+msgid "Signed 24-bit PCM"
 msgstr ""
 
 #: sndfile_helpers.cc:68
-msgid "Signed 32 bit PCM"
+msgid "Signed 32-bit PCM"
 msgstr ""
 
 #: sndfile_helpers.cc:69
-msgid "Signed 8 bit PCM"
+msgid "Signed 8-bit PCM"
 msgstr ""
 
 #: sndfile_helpers.cc:70
-msgid "32 bit float"
+msgid "32-bit float"
 msgstr ""
 
 #: sndfile_helpers.cc:83
@@ -2346,11 +2976,15 @@ msgstr ""
 msgid "Big-endian (PowerPC)"
 msgstr ""
 
-#: sndfilesource.cc:260
+#: sndfilesource.cc:282
+msgid "SndFileSource: cannot open file \"%1\" for %2"
+msgstr ""
+
+#: sndfilesource.cc:300
 msgid "SndFileSource: cannot open file \"%1\" for %2 (%3)"
 msgstr ""
 
-#: sndfilesource.cc:268
+#: sndfilesource.cc:308
 msgid ""
 "SndFileSource: file only contains %1 channels; %2 is invalid as a channel "
 "number"
@@ -2358,78 +2992,94 @@ msgstr ""
 "SndFileSource: il file contiene solo %1 canali; %2 non è valido come numero "
 "di canale"
 
-#: sndfilesource.cc:322 sndfilesource.cc:655
+#: sndfilesource.cc:323
+msgid "Cannot mark RF64 audio file for automatic downgrade to WAV: %1"
+msgstr ""
+
+#: sndfilesource.cc:375 sndfilesource.cc:705
 msgid ""
 "cannot set broadcast info for audio file %1 (%2); dropping broadcast info "
 "for this file"
 msgstr ""
 
-#: sndfilesource.cc:368
-msgid "could not allocate file %1 for reading."
+#: sndfilesource.cc:418
+msgid "could not open file %1 for reading."
 msgstr ""
 
-#: sndfilesource.cc:403
+#: sndfilesource.cc:453
 msgid "SndFileSource: could not seek to frame %1 within %2 (%3)"
 msgstr ""
 
-#: sndfilesource.cc:412
+#: sndfilesource.cc:462
 msgid ""
 "SndFileSource: @ %1 could not read %2 within %3 (%4) (len = %5, ret was %6)"
 msgstr ""
 
-#: sndfilesource.cc:454 sndfilesource.cc:483
+#: sndfilesource.cc:504 sndfilesource.cc:533
 msgid "attempt to write a non-writable audio file source (%1)"
 msgstr ""
 
-#: sndfilesource.cc:459 utils.cc:579 utils.cc:603 utils.cc:617 utils.cc:636
+#: sndfilesource.cc:509 utils.cc:564 utils.cc:588 utils.cc:602 utils.cc:621
 msgid "programming error: %1 %2"
 msgstr ""
 
-#: sndfilesource.cc:586 sndfilesource.cc:604
+#: sndfilesource.cc:636 sndfilesource.cc:654
 msgid "attempt to flush a non-writable audio file source (%1)"
 msgstr ""
 
-#: sndfilesource.cc:591
+#: sndfilesource.cc:641
 msgid "could not allocate file %1 to write header"
 msgstr ""
 
-#: sndfilesource.cc:609
+#: sndfilesource.cc:659
 msgid "could not allocate file %1 to flush contents"
 msgstr ""
 
-#: sndfilesource.cc:621
+#: sndfilesource.cc:671
 msgid ""
 "attempt to store broadcast info in a non-writable audio file source (%1)"
 msgstr ""
 
-#: sndfilesource.cc:626
+#: sndfilesource.cc:676
 msgid "attempt to set BWF info for an un-opened audio file source (%1)"
 msgstr ""
 
-#: sndfilesource.cc:670
+#: sndfilesource.cc:720
 msgid "%1: cannot seek to %2 (libsndfile error: %3)"
 msgstr ""
 
-#: sndfilesource.cc:780
+#: sndfilesource.cc:830
 msgid "SndFileSource: \"%1\" bad read retval: %2 of %5 (%3: %4)"
 msgstr ""
 
-#: sndfilesource.cc:793 sndfilesource.cc:843 sndfilesource.cc:850
+#: sndfilesource.cc:843 sndfilesource.cc:893 sndfilesource.cc:900
 msgid "SndFileSource: \"%1\" bad write (%2)"
 msgstr ""
 
-#: sndfilesource.cc:873
+#: sndfilesource.cc:923
 msgid ""
 "Filesource: start time is already set for existing file (%1): Cannot change "
 "start time."
 msgstr ""
 
+#: sndfilesource.cc:982
+msgid "SndFileSource: cannot open file \"%1\" for reading"
+msgstr ""
+
+#: solo_control.cc:199
+msgid "Cleared Explicit solo: %1\n"
+msgstr ""
+
+#: solo_control.cc:202
+msgid "Cleared Implicit solo: %1 up:%2 down:%3\n"
+msgstr ""
+
 #: soundcloud_upload.cc:129
 msgid ""
 "Upload to Soundcloud failed.  Perhaps your email or password are incorrect?\n"
 msgstr ""
 
-#: source_factory.cc:374
+#: source_factory.cc:390
 msgid "Recovery attempted on a MIDI file - not implemented"
 msgstr ""
 
@@ -2445,7 +3095,7 @@ msgstr ""
 msgid "Speaker information is missing distance - speaker ignored"
 msgstr ""
 
-#: srcfilesource.cc:134
+#: srcfilesource.cc:142
 msgid "SrcFileSource: %1"
 msgstr ""
 
@@ -2453,104 +3103,134 @@ msgstr ""
 msgid "Cannot compile tape track regexp for use (%1)"
 msgstr ""
 
-#: tempo.cc:80
-msgid "TempoSection XML node has no \"start\" property"
+#: tempo.cc:98
+msgid "Legacy session detected. TempoSection XML node will be altered."
 msgstr ""
 
-#: tempo.cc:88
-msgid "TempoSection XML node has an illegal \"start\" value"
+#: tempo.cc:104
+msgid "TempoSection XML node has an illegal \"pulse\" value"
 msgstr ""
 
-#: tempo.cc:95
+#: tempo.cc:112
+msgid "TempoSection XML node has an illegal \"frame\" value"
+msgstr ""
+
+#: tempo.cc:119
 msgid "TempoSection XML node has no \"beats-per-minute\" property"
 msgstr ""
 
-#: tempo.cc:100
+#: tempo.cc:124
 msgid "TempoSection XML node has an illegal \"beats_per_minute\" value"
 msgstr ""
 
-#: tempo.cc:109
+#: tempo.cc:133
 msgid "TempoSection XML node has an illegal \"note-type\" value"
 msgstr ""
 
-#: tempo.cc:115
+#: tempo.cc:139
 msgid "TempoSection XML node has no \"movable\" property"
 msgstr ""
 
-#: tempo.cc:125
-msgid "TempoSection XML node has an illegal \"bar-offset\" value"
+#: tempo.cc:146
+msgid "TempoSection XML node has no \"active\" property"
 msgstr ""
 
-#: tempo.cc:202
-msgid "MeterSection XML node has no \"start\" property"
+#: tempo.cc:471
+msgid "MeterSection XML node has an illegal \"start\" value"
 msgstr ""
 
-#: tempo.cc:210
-msgid "MeterSection XML node has an illegal \"start\" value"
+#: tempo.cc:474
+msgid "Legacy session detected - MeterSection XML node will be altered."
+msgstr ""
+
+#: tempo.cc:481
+msgid "MeterSection XML node has an illegal \"pulse\" value"
+msgstr ""
+
+#: tempo.cc:488
+msgid "MeterSection XML node has an illegal \"beat\" value"
+msgstr ""
+
+#: tempo.cc:495
+msgid "MeterSection XML node has no \"bbt\" property"
+msgstr ""
+
+#: tempo.cc:500
+msgid "MeterSection XML node has an illegal \"bbt\" value"
+msgstr ""
+
+#: tempo.cc:509
+msgid "MeterSection XML node has an illegal \"frame\" value"
 msgstr ""
 
-#: tempo.cc:220
+#: tempo.cc:519
 msgid ""
 "MeterSection XML node has no \"beats-per-bar\" or \"divisions-per-bar\" "
 "property"
 msgstr ""
 
-#: tempo.cc:226
-msgid ""
-"MeterSection XML node has an illegal \"beats-per-bar\" or \"divisions-per-bar"
-"\" value"
+#: tempo.cc:524
+msgid "MeterSection XML node has an illegal \"divisions-per-bar\" value"
 msgstr ""
 
-#: tempo.cc:231
+#: tempo.cc:529
 msgid "MeterSection XML node has no \"note-type\" property"
 msgstr ""
 
-#: tempo.cc:236
+#: tempo.cc:533
 msgid "MeterSection XML node has an illegal \"note-type\" value"
 msgstr ""
 
-#: tempo.cc:241
+#: tempo.cc:538
 msgid "MeterSection XML node has no \"movable\" property"
 msgstr ""
 
-#: tempo.cc:388
+#: tempo.cc:545
+msgid "MeterSection XML node has no \"lock-style\" property"
+msgstr ""
+
+#: tempo.cc:821
 msgid ""
 "Meter changes can only be positioned on the first beat of a bar. Moving from "
 "%1 to %2"
 msgstr ""
 
-#: tempo.cc:650
+#: tempo.cc:1156
 msgid "no tempo sections defined in tempo map - cannot change tempo @ %1"
 msgstr ""
 
-#: tempo.cc:680 tempo.cc:696 tempo.cc:712 tempo.cc:728
-msgid "programming error: no tempo section in tempo map!"
+#: tempo.cc:1186
+msgid "programming error: no meter section in tempo map!"
 msgstr ""
 
-#: tempo.cc:846 tempo.cc:1827
-msgid "programming error: unhandled MetricSection type"
+#: tempo.cc:1204 tempo.cc:1227 tempo.cc:1248
+msgid "programming error: no tempo section in tempo map!"
 msgstr ""
 
-#: tempo.cc:1142
+#: tempo.cc:1959 tempo.cc:1987
 msgid "tempo map asked for BBT time at frame %1\n"
 msgstr ""
 
-#: tempo.cc:1185
+#: tempo.cc:2054
 msgid "tempo map asked for frame time at bar < 1  (%1)\n"
 msgstr ""
 
-#: tempo.cc:1642 tempo.cc:1656
+#: tempo.cc:3472 tempo.cc:3485
 msgid "Tempo map: could not set new state, restoring old one."
 msgstr ""
 
-#: tempo.cc:1677
+#: tempo.cc:3522 tempo.cc:3523
 msgid "Multiple meter definitions found at %1"
 msgstr ""
 
-#: tempo.cc:1682
+#: tempo.cc:3528 tempo.cc:3529
 msgid "Multiple tempo definitions found at %1"
 msgstr ""
 
+#: tempo.cc:3715
+msgid "programming error: unhandled MetricSection type"
+msgstr ""
+
 #: tempo_map_importer.cc:52
 msgid "Tempo map"
 msgstr ""
@@ -2575,6 +3255,14 @@ msgid ""
 "Are you sure you want to do this?"
 msgstr ""
 
+#: unknown_processor.cc:86
+msgid "Using plugin-stub with unknown i/o configuration for: "
+msgstr ""
+
+#: unknown_processor.cc:107
+msgid "Using plugin-stub with mismatching i/o configuration for: "
+msgstr ""
+
 #: user_bundle.cc:47
 msgid "Node for Bundle has no \"name\" property"
 msgstr ""
@@ -2596,62 +3284,71 @@ msgstr ""
 msgid "Node for Port has no \"name\" property"
 msgstr ""
 
-#: utils.cc:422 utils.cc:451
+#: utils.cc:412 utils.cc:441
 msgid "Splice"
 msgstr ""
 
-#: utils.cc:424 utils.cc:441
+#: utils.cc:414 utils.cc:431
 msgid "Slide"
 msgstr ""
 
-#: utils.cc:426 utils.cc:447
+#: utils.cc:416 utils.cc:437
 msgid "Ripple"
 msgstr ""
 
-#: utils.cc:428 utils.cc:444
+#: utils.cc:418 utils.cc:434
 msgid "Lock"
 msgstr ""
 
-#: utils.cc:431
+#: utils.cc:421
 msgid "programming error: unknown edit mode string \"%1\""
 msgstr ""
 
-#: utils.cc:458 utils.cc:490
+#: utils.cc:448 utils.cc:484
 msgid "MIDI Timecode"
 msgstr ""
 
-#: utils.cc:458 utils.cc:488
+#: utils.cc:448 utils.cc:482
 msgid "MTC"
 msgstr ""
 
-#: utils.cc:462 utils.cc:497
+#: utils.cc:452 utils.cc:491
 msgid "MIDI Clock"
 msgstr ""
 
-#: utils.cc:466 utils.cc:484 utils.cc:504
+#: utils.cc:456 utils.cc:478 utils.cc:498
 msgid "JACK"
 msgstr ""
 
-#: utils.cc:470
-msgid "programming error: unknown sync source string \"%1\""
+#: utils.cc:460 utils.cc:495
+msgid "LTC"
 msgstr ""
 
-#: utils.cc:495
-msgid "M-Clock"
+#: utils.cc:464
+msgid "programming error: unknown sync source string \"%1\""
 msgstr ""
 
-#: utils.cc:501
-msgid "LTC"
+#: utils.cc:489
+msgid "M-Clock"
 msgstr ""
 
-#: utils.cc:671
+#: utils.cc:658
 msgid "programming error: unknown native header format: %1"
 msgstr ""
 
-#: utils.cc:686
+#: utils.cc:673
 msgid "cannot open directory %1 (%2)"
 msgstr ""
 
+#: vca.cc:43
+#, c-format
+msgid "VCA %n"
+msgstr ""
+
+#: vca_manager.cc:166
+msgid "Cannot set state of a VCA"
+msgstr ""
+
 #~ msgid "cannot create new audio file \"%1\" for %2"
 #~ msgstr "impossibile creare un nuovo file audio \"%1\" per %2"
 
diff --git a/libs/ardour/po/nn.mo b/libs/ardour/po/nn.mo
new file mode 100644
index 0000000..ca6f270
Binary files /dev/null and b/libs/ardour/po/nn.mo differ
diff --git a/libs/ardour/po/nn.po b/libs/ardour/po/nn.po
index 96780ff..bc09a1c 100644
--- a/libs/ardour/po/nn.po
+++ b/libs/ardour/po/nn.po
@@ -8,11 +8,11 @@ msgid ""
 msgstr ""
 "Project-Id-Version: libardour\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-03-31 20:13-0400\n"
+"POT-Creation-Date: 2016-07-14 06:20-0400\n"
 "PO-Revision-Date: 2011-09-13 22:43+0100\n"
 "Last-Translator: Eivind Ødegård <meinmycell-lists at yahoo.no>\n"
 "Language-Team: Nynorsk <i18n-nn at lister.ping.uio.no>\n"
-"Language: \n"
+"Language: Norwegian Nynorsk\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
@@ -20,88 +20,241 @@ msgstr ""
 "X-Poedit-Country: NORWAY\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: amp.cc:57 automatable.cc:165
-msgid "Fader"
-msgstr "Dempar"
+#: amp.cc:412
+#, c-format
+msgid "%.2fdB"
+msgstr ""
 
-#: analyser.cc:117 audioregion.cc:1729
+#: analyser.cc:121 audioregion.cc:1789
 msgid "Transient Analysis failed for %1."
 msgstr ""
 
-#: analyser.cc:117
+#: analyser.cc:121
 msgid "Audio File Source"
 msgstr ""
 
-#: audio_diskstream.cc:249
+#: analysis_graph.cc:136
+msgid "%1 (%2..%3)"
+msgstr ""
+
+#: audio_backend.cc:31
+msgid "No Error occurred"
+msgstr ""
+
+#: audio_backend.cc:33
+msgid "Failed to initialize audio backend"
+msgstr ""
+
+#: audio_backend.cc:35
+msgid "Failed to deinitialize audio backend"
+msgstr ""
+
+#: audio_backend.cc:37
+msgid "Failed to reinitialize audio backend"
+msgstr ""
+
+#: audio_backend.cc:39
+msgid "Failed to open audio device"
+msgstr ""
+
+#: audio_backend.cc:41
+msgid "Failed to close audio device"
+msgstr ""
+
+#: audio_backend.cc:43
+msgid "Audio device not valid"
+msgstr ""
+
+#: audio_backend.cc:45
+msgid "Audio device unavailable"
+msgstr ""
+
+#: audio_backend.cc:47
+msgid "Audio device not connected"
+msgstr ""
+
+#: audio_backend.cc:49
+msgid "Failed to request and reserve audio device"
+msgstr ""
+
+#: audio_backend.cc:51
+msgid "Audio device Input/Output error"
+msgstr ""
+
+#: audio_backend.cc:53
+msgid "Failed to open MIDI device"
+msgstr ""
+
+#: audio_backend.cc:55
+msgid "Failed to close MIDI device"
+msgstr ""
+
+#: audio_backend.cc:57
+msgid "MIDI device unavailable"
+msgstr ""
+
+#: audio_backend.cc:59
+msgid "MIDI device not connected"
+msgstr ""
+
+#: audio_backend.cc:61
+msgid "MIDI device Input/Output error"
+msgstr ""
+
+#: audio_backend.cc:63
+msgid "Sample format is not supported"
+msgstr ""
+
+#: audio_backend.cc:65
+msgid "Sample rate is not supported"
+msgstr ""
+
+#: audio_backend.cc:67
+msgid "Requested input latency is not supported"
+msgstr ""
+
+#: audio_backend.cc:69
+msgid "Requested output latency is not supported"
+msgstr ""
+
+#: audio_backend.cc:71
+msgid "Period size is not supported"
+msgstr ""
+
+#: audio_backend.cc:73
+msgid "Period count is not supported"
+msgstr ""
+
+#: audio_backend.cc:75
+msgid "Device configuration not supported"
+msgstr ""
+
+#: audio_backend.cc:77
+msgid "Channel count configuration not supported"
+msgstr ""
+
+#: audio_backend.cc:79
+msgid "Input channel count configuration not supported"
+msgstr ""
+
+#: audio_backend.cc:81
+msgid "Output channel count configuration not supported"
+msgstr ""
+
+#: audio_backend.cc:83
+msgid "Unable to aquire realtime permissions"
+msgstr ""
+
+#: audio_backend.cc:85
+msgid "Setting audio device thread priorities failed"
+msgstr ""
+
+#: audio_backend.cc:87
+msgid "Setting MIDI device thread priorities failed"
+msgstr ""
+
+#: audio_backend.cc:89
+msgid "Failed to start process thread"
+msgstr ""
+
+#: audio_backend.cc:91
+msgid "Failed to start freewheel thread"
+msgstr ""
+
+#: audio_backend.cc:93
+msgid "Failed to register audio/midi ports"
+msgstr ""
+
+#: audio_backend.cc:95
+msgid "Failed to re-connect audio/midi ports"
+msgstr ""
+
+#: audio_backend.cc:97
+msgid "Out Of Memory Error"
+msgstr ""
+
+#: audio_backend.cc:99
+msgid "Could not reconnect to Audio/MIDI engine"
+msgstr ""
+
+#: audio_backend.cc:107 export_formats.cc:52 session.cc:6772 session.cc:6792
+msgid "None"
+msgstr "Ingen"
+
+#: audio_backend.cc:109
+msgid "Default"
+msgstr ""
+
+#: audio_diskstream.cc:257
 msgid "AudioDiskstream: Playlist \"%1\" isn't an audio playlist"
 msgstr "Lyd-diskstraum: Spelelista \"%1\" er ikkje ei lydspeleliste"
 
-#: audio_diskstream.cc:301
+#: audio_diskstream.cc:309
 msgid "AudioDiskstream %1: there is no existing playlist to make a copy of!"
 msgstr "Lyd-diskstraum %1: det finst inga speleliste å kopiera!"
 
-#: audio_diskstream.cc:861 audio_diskstream.cc:871
+#: audio_diskstream.cc:880 audio_diskstream.cc:890
 msgid ""
 "AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3"
 msgstr ""
 "Lyd-diskstraum %1: greidde ikkje lesa %2 frå spelelista, ramme %3, ved "
 "attfylling"
 
-#: audio_diskstream.cc:1028
+#: audio_diskstream.cc:1053
 msgid "AudioDiskstream %1: cannot read %2 from playlist at frame %3"
 msgstr "Lyd-diskstraum %1: greidde ikkje lesa %2 frå spelelista, ramme %3"
 
-#: audio_diskstream.cc:1397 audio_diskstream.cc:1416
+#: audio_diskstream.cc:1469 audio_diskstream.cc:1488
 msgid "AudioDiskstream %1: cannot write to disk"
 msgstr "Lyd-diskstraum %1: greidde ikkje skriva til disk"
 
-#: audio_diskstream.cc:1459
+#: audio_diskstream.cc:1531
 msgid "AudioDiskstream \"%1\": cannot flush captured data to disk!"
 msgstr "Lyd-diskstraum \"%1\": greier ikkje skriva opptaket til disken!"
 
-#: audio_diskstream.cc:1553
+#: audio_diskstream.cc:1627
 msgid "%1: could not create region for complete audio file"
 msgstr "%1: greidde ikkje laga bolk for heil lydfil"
 
-#: audio_diskstream.cc:1585
+#: audio_diskstream.cc:1659
 msgid "AudioDiskstream: could not create region for captured audio!"
 msgstr "Lyd-diskstraum: greidde ikkje laga bolk frå opptaket!"
 
-#: audio_diskstream.cc:1693
+#: audio_diskstream.cc:1755
 msgid "programmer error: %1"
 msgstr "Programmerarfeil: %1"
 
-#: audio_diskstream.cc:1921
+#: audio_diskstream.cc:2012
 msgid "AudioDiskstream: channel %1 out of range"
 msgstr "Lyd-diskstraum: kanal %1 utanfor rekkjevidd"
 
-#: audio_diskstream.cc:1935 midi_diskstream.cc:1274
+#: audio_diskstream.cc:2026 midi_diskstream.cc:1295
 msgid "%1:%2 new capture file not initialized correctly"
 msgstr "%1: ny opptaksfil %2 vart ikkje påbyrja rett"
 
-#: audio_diskstream.cc:2214
+#: audio_diskstream.cc:2305
 msgid "%1: cannot restore pending capture source file %2"
 msgstr "%1: greidde ikkje henta fram att den ventande opptakskjeldefila %2"
 
-#: audio_diskstream.cc:2236
+#: audio_diskstream.cc:2327
 msgid "%1: incorrect number of pending sources listed - ignoring them all"
 msgstr "%1: feil tal på ventande kjelder på lista - ser bort frå alle"
 
-#: audio_diskstream.cc:2270
+#: audio_diskstream.cc:2361
 msgid "%1: cannot create whole-file region from pending capture sources"
 msgstr "%1: greidde ikkje laga heilfilbolk frå ventande opptakskjelder"
 
-#: audio_library.cc:81
+#: audio_library.cc:82
 msgid "Could not open %1.  Audio Library not saved"
 msgstr "Greidde ikkje opna %1. Lydbiblioteket er ikkje lagra"
 
-#: audio_playlist.cc:504
+#: audio_playlist.cc:509
 msgid ""
 "Legacy crossfade involved an incoming region not present in playlist \"%1\" "
 "- crossfade discarded"
 msgstr ""
 
-#: audio_playlist.cc:520
+#: audio_playlist.cc:525
 msgid ""
 "Legacy crossfade involved an outgoing region not present in playlist \"%1\" "
 "- crossfade discarded"
@@ -131,10 +284,11 @@ msgstr ""
 msgid "Audio Playlists (unused)"
 msgstr "Lydspelelister (ubrukte)"
 
-#: audio_playlist_source.cc:171 audiosource.cc:963 midi_playlist_source.cc:147
-#: midi_playlist_source.cc:155 midi_playlist_source.cc:162 midi_source.cc:356
-#: plugin_insert.cc:641 rb_effect.cc:327 session.cc:2845 session.cc:2878
-#: session.cc:4124 session_handle.cc:87 sndfilesource.cc:154
+#: audio_playlist_source.cc:171 audiosource.cc:1046
+#: midi_playlist_source.cc:147 midi_playlist_source.cc:155
+#: midi_playlist_source.cc:162 midi_source.cc:403 plugin_insert.cc:1259
+#: rb_effect.cc:327 session.cc:5314 session.cc:5341 session.cc:5461
+#: session_handle.cc:88 sndfilesource.cc:173
 msgid "programming error: %1"
 msgstr "Programmeringsfeil: %1"
 
@@ -162,26 +316,30 @@ msgstr ""
 "\n"
 "Kanalar:"
 
-#: audio_track.cc:161
+#: audio_track.cc:177
 msgid "Unknown bundle \"%1\" listed for input of %2"
 msgstr "Ukjend bundel \"%1\" lista opp for inngangen på %2"
 
-#: audio_track.cc:163
+#: audio_track.cc:179
 msgid "in 1"
 msgstr "inn 1"
 
-#: audio_track.cc:164
+#: audio_track.cc:180
 msgid "No input bundles available as a replacement"
 msgstr "Ingen inngangsbundlar klare som erstatting"
 
-#: audio_track.cc:168
+#: audio_track.cc:184
 msgid "Bundle %1 was not available - \"in 1\" used instead"
 msgstr "Bundelen %1 var ikkje tilgjengeleg - brukar \"inn 1\" i staden for"
 
-#: audio_track.cc:177
+#: audio_track.cc:193
 msgid "improper input channel list in XML node (%1)"
 msgstr "Feil inngangskanalliste i XML-node (%1)"
 
+#: audio_track.cc:216 diskstream.cc:503 source.cc:149
+msgid "%1: this session uses destructive tracks, which are not supported"
+msgstr ""
+
 #: audio_track_importer.cc:68
 msgid "Audio Tracks"
 msgstr "Lydspor"
@@ -202,19 +360,19 @@ msgstr "greier ikkje lasta VAMP-innstikket \"%1\""
 msgid "VAMP Plugin \"%1\" could not be loaded"
 msgstr "VAMP-innstikket \"%1\" vart ikkje lasta"
 
-#: audioengine.cc:696
+#: audioengine.cc:756
 msgid "AudioEngine: cannot load module \"%1\" (%2)"
 msgstr ""
 
-#: audioengine.cc:702
+#: audioengine.cc:762
 msgid "AudioEngine: backend at \"%1\" has no descriptor function."
 msgstr ""
 
-#: audioengine.cc:779
+#: audioengine.cc:841
 msgid "Could not create backend for %1: %2"
 msgstr ""
 
-#: audioregion.cc:1685
+#: audioregion.cc:1757
 msgid ""
 "You have requested an operation that requires audio analysis.\n"
 "\n"
@@ -222,13 +380,14 @@ msgid ""
 "transient data must be generated every time it is required.\n"
 "\n"
 "If you are doing work that will require transient data on a regular basis, "
-"you should probably enable \"auto-analyse-audio\" then quit %1 and restart.\n"
+"you should probably enable \"auto-analyse-audio\" in Preferences > Audio > "
+"Regions, then quit %1 and restart.\n"
 "\n"
 "This dialog will not display again.  But you may notice a slight delay in "
 "this and future transient-detection operations.\n"
 msgstr ""
 
-#: audioregion.cc:1729
+#: audioregion.cc:1789
 msgid "Audio Region"
 msgstr ""
 
@@ -236,172 +395,200 @@ msgstr ""
 msgid "cannot rename peakfile for %1 from %2 to %3 (%4)"
 msgstr "kan ikkje døypa om toppfil for %1 frå %2 til %3 (%4)"
 
-#: audiosource.cc:257
+#: audiosource.cc:262
 msgid "AudioSource: cannot stat peakfile \"%1\""
 msgstr "Lydkjelde: kan ikkje bruka toppfil \"%1\""
 
-#: audiosource.cc:361
+#: audiosource.cc:368
+msgid "Cannot open peakfile @ %1 for size check (%2)"
+msgstr ""
+
+#: audiosource.cc:389
+msgid "peak file %1 is truncated from %2 to %3"
+msgstr ""
+
+#: audiosource.cc:392
+msgid "Cannot open peakfile @ %1 for size check (%2) after rebuild"
+msgstr ""
+
+#: audiosource.cc:404
 msgid "Cannot open peakfile @ %1 for reading (%2)"
 msgstr ""
 
-#: audiosource.cc:394
+#: audiosource.cc:438
 msgid "cannot read sample data for unscaled peak computation"
 msgstr "kan ikkje lesa lyddata for uskalert topputrekning"
 
-#: audiosource.cc:430 audiosource.cc:525
+#: audiosource.cc:473 audiosource.cc:568
 msgid "map failed - could not create file mapping for peakfile %1."
 msgstr ""
 
-#: audiosource.cc:436 audiosource.cc:531
+#: audiosource.cc:479 audiosource.cc:574
 msgid "map failed - could not map peakfile %1."
 msgstr ""
 
-#: audiosource.cc:447 audiosource.cc:542
+#: audiosource.cc:490 audiosource.cc:585
 msgid "unmap failed - could not unmap peakfile %1."
 msgstr ""
 
-#: audiosource.cc:453 audiosource.cc:548
+#: audiosource.cc:496 audiosource.cc:591
 msgid "map failed - could not mmap peakfile %1."
 msgstr ""
 
-#: audiosource.cc:638
+#: audiosource.cc:681
 msgid ""
 "AudioSource[%1]: peak read - cannot read %2 samples at offset %3 of %4 (%5)"
 msgstr ""
 "AudioSource [%1]: topplesing - kan ikkje lesa %2 punkt ved forskuvinga %3 av "
 "%4 (%5)"
 
-#: audiosource.cc:705
+#: audiosource.cc:748
 msgid "%1: could not write read raw data for peak computation (%2)"
 msgstr "%1 greidde ikkje skriva/lesa rådata for topputrekninga (%2)"
 
-#: audiosource.cc:742
-msgid "AudioSource: cannot open peakpath (c) \"%1\" (%2)"
-msgstr "Lydkjelde: kan ikkje opna toppstig (c) \"%1\" (%2)"
+#: audiosource.cc:815
+msgid "AudioSource: cannot open _peakpath (c) \"%1\" (%2)"
+msgstr ""
 
-#: audiosource.cc:811 audiosource.cc:933
+#: audiosource.cc:894 audiosource.cc:1016
 msgid "%1: could not seek in peak file data (%2)"
 msgstr ""
 
-#: audiosource.cc:816 audiosource.cc:942
+#: audiosource.cc:899 audiosource.cc:1025
 msgid "%1: could not write peak file data (%2)"
 msgstr "%1: greidde ikkje skriva toppfildata (%2)"
 
-#: audiosource.cc:975
+#: audiosource.cc:1058
 msgid "could not truncate peakfile %1 to %2 (error: %3)"
 msgstr ""
 
-#: auditioner.cc:100
+#: auditioner.cc:105
 msgid "Falling back to Reasonable Synth for Midi Audition"
 msgstr ""
 
-#: auditioner.cc:102
+#: auditioner.cc:107
 msgid "No synth for midi-audition found."
 msgstr ""
 
-#: auditioner.cc:158
+#: auditioner.cc:163
 msgid "no outputs available for auditioner - manual connection required"
 msgstr "ingen utgangar for lyttinga - du må kopla til manuelt"
 
-#: auditioner.cc:399 auditioner.cc:446
+#: auditioner.cc:408 auditioner.cc:455
 msgid "Cannot setup auditioner processing flow for %1 channels"
 msgstr "Greier ikkje setja opp lyttehandteringsflyt for %1 kanalar"
 
-#: auditioner.cc:434
+#: auditioner.cc:443
 msgid "Failed to load synth for MIDI-Audition."
 msgstr ""
 
-#: auditioner.cc:453
+#: auditioner.cc:462
 msgid "Auditioning of regions other than Audio or Midi is not supported."
 msgstr ""
 
-#: automatable.cc:84
+#: automatable.cc:87
 msgid "Automation node has no path property"
 msgstr "Automasjonspunktet har ingen stigeigenskapar"
 
-#: automatable.cc:104
+#: automatable.cc:108
 msgid "cannot open %2 to load automation data (%3)"
 msgstr "greier ikkje opna %2 for å lasta automasjonsdata (%3)"
 
-#: automatable.cc:132
+#: automatable.cc:140
 msgid "cannot load automation data from %2"
 msgstr "greier ikkje lasta automasjonsdata frå %2"
 
-#: automatable.cc:167
+#: automatable.cc:176 send.cc:95 session.cc:851
+msgid "Fader"
+msgstr "Dempar"
+
+#: automatable.cc:178
+msgid "Trim"
+msgstr ""
+
+#: automatable.cc:180
 msgid "Mute"
 msgstr ""
 
-#: automation_list.cc:356
+#: automation_control.cc:228
+msgid "record %1 automation"
+msgstr ""
+
+#: automation_list.cc:410
 msgid "automation list: cannot load coordinates from XML, all points ignored"
 msgstr ""
 "automasjonsliste: greier ikkje lasta koordinater frå XML, såg bort frå alle "
 "punkt"
 
-#: automation_list.cc:402
+#: automation_list.cc:456
 msgid ""
 "automation list: no x-coordinate stored for control point (point ignored)"
 msgstr ""
 "automasjonsliste: ingen x-koordinatar er lagra for kontrollpunktet (hoppar "
 "over)"
 
-#: automation_list.cc:408
+#: automation_list.cc:462
 msgid ""
 "automation list: no y-coordinate stored for control point (point ignored)"
 msgstr ""
 "automasjonsliste: ingen y-koordinatar er lagra for kontrollpunktet (hoppar "
 "over)"
 
-#: automation_list.cc:422
+#: automation_list.cc:476
 msgid ""
 "AutomationList: passed XML node called %1, not \"AutomationList\" - ignored"
 msgstr ""
 "AutomationList: gav XML-node med namet %1, ikkje \"AutomationList\" - såg "
 "bort frå."
 
-#: butler.cc:100
+#: butler.cc:126
 msgid "Session: could not create butler thread"
 msgstr "Økt: greier ikkje laga butler-tråd"
 
-#: butler.cc:222 butler.cc:223
+#: butler.cc:254 butler.cc:255
 msgid "Butler read ahead failure on dstream %1"
 msgstr "Butler-førlesingsfeil på dstream %1"
 
-#: butler.cc:270 butler.cc:271
+#: butler.cc:344 butler.cc:345 butler.cc:393 butler.cc:394
 msgid "Butler write-behind failure on dstream %1"
 msgstr "Butler-etterskrivingsfeil på dstream %1"
 
-#: control_protocol_manager.cc:164
+#: control_protocol_manager.cc:174
 msgid "control protocol name \"%1\" has no descriptor"
 msgstr "kontrollprotokollnamnet \"%1\" har inga skildring"
 
-#: control_protocol_manager.cc:171
+#: control_protocol_manager.cc:181
 msgid "control protocol name \"%1\" could not be initialized"
 msgstr "kontrollprotokollnamnet \"%1\" greidde ikkje starta opp"
 
-#: control_protocol_manager.cc:237
+#: control_protocol_manager.cc:265
 msgid "Instantiating mandatory control protocol %1"
 msgstr "Lagar obligatorisk kontrollprotokolløkt %1"
 
-#: control_protocol_manager.cc:281
+#: control_protocol_manager.cc:309
 msgid "looking for control protocols in %1\n"
 msgstr ""
 
-#: control_protocol_manager.cc:306
+#: control_protocol_manager.cc:334
 msgid "Control protocol %1 not usable"
 msgstr "Kontrollprotokollen %1 er ikkje brukande"
 
-#: control_protocol_manager.cc:323
+#: control_protocol_manager.cc:351
 msgid "Control surface protocol discovered: \"%1\"\n"
 msgstr ""
 
-#: control_protocol_manager.cc:341
+#: control_protocol_manager.cc:367
 msgid "ControlProtocolManager: cannot load module \"%1\" (%2)"
 msgstr "Kontrollprotokollstyring: kan ikkje lasta modulen \"%1\" (%2)"
 
-#: control_protocol_manager.cc:347
+#: control_protocol_manager.cc:373
 msgid "ControlProtocolManager: module \"%1\" has no descriptor function."
 msgstr "Kontrollprotokollstyring: modulen \"%1\" har ingen skildringsfunksjon."
 
+#: control_protocol_manager.cc:516
+msgid "Control protocol \"%1\" has no descriptor"
+msgstr ""
+
 #: cycle_timer.cc:40
 msgid "CycleTimer::get_mhz(): can't open /proc/cpuinfo"
 msgstr "CycleTimer::get:mhz()-funksjonen: kan ikkje opna /proc/cpuinfo"
@@ -419,7 +606,7 @@ msgstr "finn ikkje prosessor-MHz i /proc/cpuinfo"
 msgid "audio"
 msgstr "lyd"
 
-#: data_type.cc:28 session.cc:1995 session.cc:1998
+#: data_type.cc:28 session.cc:2452
 msgid "MIDI"
 msgstr "MIDI"
 
@@ -431,11 +618,11 @@ msgstr "ukjend"
 msgid "main outs"
 msgstr "hovudutgangar"
 
-#: delivery.cc:121 send.cc:63
+#: delivery.cc:121 send.cc:64
 msgid "listen"
 msgstr "høyr på"
 
-#: diskstream.cc:309
+#: diskstream.cc:311
 msgid "Location \"%1\" not valid for track loop (start >= end)"
 msgstr ""
 "Staden \"%1\" er ikkje gyldig for å spela spor i lykkje (start >= slutt)"
@@ -448,23 +635,23 @@ msgstr "Greidde ikkje få port for eksportkanalen \"%1\", hoppar over kanalen"
 msgid "Export failed: %1"
 msgstr "Eksportfeil: %1"
 
-#: export_filename.cc:126
+#: export_filename.cc:128
 msgid "Existing export folder for this session (%1) does not exist - ignored"
 msgstr ""
 
-#: export_filename.cc:242
+#: export_filename.cc:263
 msgid "No Time"
 msgstr "Inga tid"
 
-#: export_filename.cc:251
+#: export_filename.cc:272
 msgid "Invalid time format"
 msgstr "Ugyldig tidsformat"
 
-#: export_filename.cc:260
+#: export_filename.cc:281
 msgid "No Date"
 msgstr "Ingen dato"
 
-#: export_filename.cc:275
+#: export_filename.cc:296
 msgid "Invalid date format"
 msgstr "Ugyldig datoformat"
 
@@ -500,23 +687,27 @@ msgstr "Komprimering med tap"
 msgid "Lossless compression"
 msgstr "Tapsfri komprimering"
 
-#: export_format_manager.cc:218 export_format_specification.cc:591
+#: export_format_manager.cc:218 export_format_specification.cc:657
 msgid "Session rate"
 msgstr "Øktrate"
 
-#: export_format_specification.cc:549
-msgid "normalize"
+#: export_format_specification.cc:609
+msgid "normalize loudness"
 msgstr ""
 
-#: export_format_specification.cc:553
+#: export_format_specification.cc:611
+msgid "normalize peak"
+msgstr ""
+
+#: export_format_specification.cc:616
 msgid "trim"
 msgstr ""
 
-#: export_format_specification.cc:555
+#: export_format_specification.cc:618
 msgid "trim start"
 msgstr ""
 
-#: export_format_specification.cc:557
+#: export_format_specification.cc:620
 msgid "trim end"
 msgstr ""
 
@@ -532,25 +723,21 @@ msgstr "Trekant"
 msgid "Rectangular"
 msgstr "Firkant"
 
-#: export_formats.cc:52 session.cc:5421 session.cc:5437
-msgid "None"
-msgstr "Ingen"
-
 #: export_formats.cc:159
-msgid "8bit"
-msgstr "8-bit"
+msgid "8-bit"
+msgstr ""
 
 #: export_formats.cc:161
-msgid "16bit"
-msgstr "16-bit"
+msgid "16-bit"
+msgstr ""
 
 #: export_formats.cc:163
-msgid "24bit"
-msgstr "24-bit"
+msgid "24-bit"
+msgstr ""
 
 #: export_formats.cc:165
-msgid "32bit"
-msgstr "32-bit"
+msgid "32-bit"
+msgstr ""
 
 #: export_formats.cc:167
 msgid "float"
@@ -561,8 +748,8 @@ msgid "double"
 msgstr "dobbel"
 
 #: export_formats.cc:171
-msgid "8bit unsigned"
-msgstr "8bit usignert"
+msgid "8-bit unsigned"
+msgstr ""
 
 #: export_formats.cc:173
 msgid "Vorbis sample format"
@@ -572,95 +759,91 @@ msgstr "Vorbis-punktformat"
 msgid "No sample format"
 msgstr "Ikkje noko punktformat"
 
-#: export_handler.cc:360
+#: export_handler.cc:419
 msgid "File %1 uploaded to %2"
 msgstr ""
 
-#: export_handler.cc:366
+#: export_handler.cc:425
 msgid ""
 "upload to Soundcloud failed. Perhaps your email or password are incorrect?\n"
 msgstr ""
 
-#: export_handler.cc:413
-msgid "Editor: cannot open \"%1\" as export file for CD marker file"
-msgstr "Redigering: greier ikkje opna \"%1\" som eksportfil for CD-markørfil"
-
-#: export_handler.cc:492 export_handler.cc:495
-msgid "an error occured while writing a TOC/CUE file: %1"
+#: export_handler.cc:551 export_handler.cc:554
+msgid "an error occurred while writing a TOC/CUE file: %1"
 msgstr ""
 
-#: export_handler.cc:744 export_handler.cc:802
+#: export_handler.cc:844 export_handler.cc:902
 msgid "Cannot convert %1 to Latin-1 text"
 msgstr ""
 
-#: export_profile_manager.cc:93
+#: export_profile_manager.cc:94
 msgid "Searching for export formats in %1"
 msgstr "Leitar etter eksportformat i %1"
 
-#: export_profile_manager.cc:99
+#: export_profile_manager.cc:100
 msgid "Unable to create export format directory %1: %2"
 msgstr ""
 
-#: export_profile_manager.cc:262
+#: export_profile_manager.cc:268
 msgid "Unable to remove export preset %1: %2"
 msgstr ""
 
-#: export_profile_manager.cc:351
+#: export_profile_manager.cc:357
 msgid "Selection"
 msgstr "Val"
 
-#: export_profile_manager.cc:604
+#: export_profile_manager.cc:621
 msgid "Unable to rename export format %1 to %2: %3"
 msgstr ""
 
-#: export_profile_manager.cc:636
+#: export_profile_manager.cc:653
 msgid "Unable to remove export profile %1: %2"
 msgstr ""
 
-#: export_profile_manager.cc:654
+#: export_profile_manager.cc:671
 msgid "empty format"
 msgstr ""
 
-#: export_profile_manager.cc:735
+#: export_profile_manager.cc:752
 msgid "Cannot load export format from %1"
 msgstr ""
 
-#: export_profile_manager.cc:741
+#: export_profile_manager.cc:758
 msgid "Cannot export format read from %1"
 msgstr ""
 
-#: export_profile_manager.cc:835
+#: export_profile_manager.cc:852
 msgid "No timespan has been selected!"
 msgstr "Du har ikkje valt noko tidsomfang!"
 
-#: export_profile_manager.cc:839
+#: export_profile_manager.cc:856
 msgid "No channels have been selected!"
 msgstr "Ingen MIDI-kanalar er valde!"
 
-#: export_profile_manager.cc:843
+#: export_profile_manager.cc:860
 msgid "Some channels are empty"
 msgstr "Nokre av kanalane er tomme"
 
-#: export_profile_manager.cc:876
+#: export_profile_manager.cc:893
 msgid "No format selected!"
 msgstr "Du har ikkje valt noko format!"
 
-#: export_profile_manager.cc:878
+#: export_profile_manager.cc:895
 msgid "All channels are empty!"
 msgstr "Alle kanalane er tomme!"
 
-#: export_profile_manager.cc:880
+#: export_profile_manager.cc:897
 msgid "One or more of the selected formats is not compatible with this system!"
 msgstr "Eitt eller fleire av desse formata samsvarar ikkje med dette systemet!"
 
-#: export_profile_manager.cc:883
+#: export_profile_manager.cc:900
 msgid ""
 "%1 supports only %2 channels, but you have %3 channels in your channel "
 "configuration"
 msgstr ""
 "%1 støttar berre %2 kanalar, men du har %3 kanalar i kanaloppsettet ditt"
 
-#: file_source.cc:201 session_state.cc:2857
+#: file_source.cc:201 session_state.cc:3284
 msgid ""
 "there are already 1000 files with names like %1; versioning discontinued"
 msgstr "Det er alt 1000 filer med namn som %1, kuttar ut versjonsnamn"
@@ -669,25 +852,25 @@ msgstr "Det er alt 1000 filer med namn som %1, kuttar ut versjonsnamn"
 msgid "cannot rename file source from %1 to %2 (%3)"
 msgstr "kan ikkje døypa om filkjelda frå %1 til %2 (%3)"
 
-#: file_source.cc:251 file_source.cc:375
+#: file_source.cc:251 file_source.cc:374
 msgid "FileSource: search path not set"
 msgstr "Filkjelde: søkjestigen er ikkje sett opp"
 
-#: file_source.cc:435
+#: file_source.cc:434
 msgid ""
 "FileSource: \"%1\" is ambigous when searching\n"
 "\t"
 msgstr ""
 
-#: file_source.cc:442
+#: file_source.cc:441
 msgid "Filesource: cannot find required file (%1)"
 msgstr ""
 
-#: file_source.cc:487
+#: file_source.cc:486
 msgid "Filesource: cannot find required file (%1): %2"
 msgstr "Filkjelde: Kan ikkje finna den naudsynte fila %1: %2"
 
-#: file_source.cc:495
+#: file_source.cc:494
 msgid "Filesource: cannot check for existing file (%1): %2"
 msgstr "Filkjelde:Kan ikkje sjå etter eksisterande fil %1: %2"
 
@@ -704,34 +887,38 @@ msgstr ""
 msgid "cannot rename file %1 to %2 (%3)"
 msgstr "kan ikkje døypa om %1 til %2 (%3)"
 
-#: filesystem_paths.cc:105
+#: filesystem_paths.cc:120
 msgid "Cannot create Configuration directory %1 - cannot run"
 msgstr ""
 
-#: filesystem_paths.cc:110
+#: filesystem_paths.cc:125
 msgid ""
 "Configuration directory %1 already exists and is not a directory/folder - "
 "cannot run"
 msgstr ""
 
-#: filesystem_paths.cc:171
+#: filesystem_paths.cc:186
 msgid "Cannot create cache directory %1 - cannot run"
 msgstr ""
 
-#: filesystem_paths.cc:176
+#: filesystem_paths.cc:191
 msgid ""
 "Cache directory %1 already exists and is not a directory/folder - cannot run"
 msgstr ""
 
-#: filesystem_paths.cc:194
+#: filesystem_paths.cc:209
 msgid "ARDOUR_DLL_PATH not set in environment - exiting\n"
 msgstr ""
 
-#: filesystem_paths.cc:245
+#: filesystem_paths.cc:232
+msgid "Cannot determine %1 package directory"
+msgstr ""
+
+#: filesystem_paths.cc:277
 msgid "ARDOUR_CONFIG_PATH not set in environment\n"
 msgstr ""
 
-#: filesystem_paths.cc:266
+#: filesystem_paths.cc:298
 msgid "ARDOUR_DATA_PATH not set in environment\n"
 msgstr ""
 
@@ -739,50 +926,79 @@ msgstr ""
 msgid "filter: error creating name for new file based on %1"
 msgstr "lydfilter: feil med å laga namn for ny fil bygd på %1"
 
-#: filter.cc:79
+#: filter.cc:92
 msgid "filter: error creating new file %1 (%2)"
 msgstr "lydfilter: feil med å laga den nye fila %1 (%2)"
 
-#: find_session.cc:59
+#: find_session.cc:60
 msgid "cannot check session path %1 (%2)"
 msgstr "greier ikkje sjekka øktstigen %1 (%2)"
 
-#: find_session.cc:85
+#: find_session.cc:86
 msgid "cannot check statefile %1 (%2)"
 msgstr "greier ikkje sjekka tilstandsfila %1 (%2)"
 
-#: find_session.cc:121
+#: find_session.cc:125
 msgid "%1 is not a snapshot file"
 msgstr "%1 er ikkje ei snøggbiletefil"
 
-#: find_session.cc:138
+#: find_session.cc:142
 msgid "cannot determine current working directory (%1)"
 msgstr "greier ikkje avgjera kva som er arbeidsmappa no (%1)"
 
-#: find_session.cc:155
+#: find_session.cc:159
 msgid "unknown file type for session %1"
 msgstr "ukjend filtype for økta %1"
 
-#: globals.cc:234
+#: gain_control.cc:81
+#, c-format
+msgid "%3.1f dB"
+msgstr ""
+
+#: globals.cc:266
 msgid "Could not set system open files limit to \"unlimited\""
 msgstr "Greidde ikkje setja systemgrensa for opne filer til \"uavgrensa\""
 
-#: globals.cc:236
+#: globals.cc:268
 msgid "Could not set system open files limit to %1"
 msgstr "Greidde ikkje setja grensa for opne systemfiler til %1"
 
-#: globals.cc:240
+#: globals.cc:272 globals.cc:289
 msgid "Your system is configured to limit %1 to only %2 open files"
 msgstr ""
 
-#: globals.cc:244
+#: globals.cc:276
 msgid "Could not get system open files limit (%1)"
 msgstr "Greidde ikkje få tak i grensa for opne systemfiler (%1)"
 
-#: globals.cc:415
+#: globals.cc:291
+msgid "Could not set system open files limit. Current limit is %1 open files"
+msgstr ""
+
+#: globals.cc:474
 msgid "Loading configuration"
 msgstr "Lastar oppsettet"
 
+#: globals.cc:554 route.cc:182 route.cc:4149 session.cc:1157
+msgid "Monitor"
+msgstr ""
+
+#: globals.cc:555 session_state.cc:642
+msgid "Master"
+msgstr ""
+
+#: globals.cc:556
+msgid "Control"
+msgstr ""
+
+#: globals.cc:557
+msgid "Click"
+msgstr ""
+
+#: globals.cc:558
+msgid "Mackie"
+msgstr ""
+
 #: import.cc:146
 msgid "Cannot find new filename for imported file %1"
 msgstr ""
@@ -809,7 +1025,7 @@ msgid "Track %1 of %2 contained no usable MIDI data"
 msgstr "Spor %1 av %2 inneheld ingen brukbare MIDI-data"
 
 #: import.cc:427
-msgid "MIDI file %1 was not readable (no reason available)"
+msgid "MIDI file could not be written (best guess: %1)"
 msgstr ""
 
 #: import.cc:475
@@ -836,110 +1052,113 @@ msgstr ""
 msgid "Unknown"
 msgstr ""
 
-#: instrument_info.cc:231
+#: instrument_info.cc:243
 msgid "preset %1 (bank %2)"
 msgstr ""
 
-#: internal_send.cc:316 internal_send.cc:317
+#: internal_send.cc:338 internal_send.cc:339
 msgid "%1 - cannot find any track/bus with the ID %2 to connect to"
 msgstr ""
 
-#: io.cc:209
+#: io.cc:212
 msgid "IO: cannot disconnect port %1 from %2"
 msgstr "IU: kan ikkje kopla porten %1 frå %2"
 
-#: io.cc:344 io.cc:431
+#: io.cc:347 io.cc:435
 msgid "IO: cannot register input port %1"
 msgstr "IU: greier ikkje registrera inngangsporten %1"
 
-#: io.cc:349 io.cc:436
+#: io.cc:352 io.cc:440
 msgid "IO: cannot register output port %1"
 msgstr "IU: greier ikkje registrera utgangsporten %1"
 
-#: io.cc:598 io.cc:654
+#: io.cc:607 io.cc:668
 msgid "incorrect XML node \"%1\" passed to IO object"
 msgstr "feil XML-punkt, \"%1\", sendt til IU-objektet"
 
-#: io.cc:713
+#: io.cc:730
 msgid "in"
 msgstr "inn"
 
-#: io.cc:713
+#: io.cc:730
 msgid "out"
 msgstr "ut"
 
-#: io.cc:714
+#: io.cc:731
 msgid "input"
 msgstr "inngang"
 
-#: io.cc:714
+#: io.cc:731
 msgid "output"
 msgstr "utgang"
 
-#: io.cc:724
+#: io.cc:741
 msgid "Unknown bundle \"%1\" listed for %2 of %3"
 msgstr "Ukjend bundel \"%1\" lista for %2 av %3"
 
-#: io.cc:790
+#: io.cc:807
 msgid "Bundle %1 was not available - \"%2\" used instead"
 msgstr "Bundelen %1 var ikkje tilgjengeleg - brukte \"%2\" i staden"
 
-#: io.cc:793
+#: io.cc:810
 msgid "No %1 bundles available as a replacement"
 msgstr "Ingen %1-bundlar klare som erstatting"
 
-#: io.cc:897
+#: io.cc:914
 msgid "%1: cannot create I/O ports"
 msgstr "%1: greier ikkje laga I/U-portar"
 
-#: io.cc:1025 io.cc:1126
+#: io.cc:1042 io.cc:1143
 msgid "IO: badly formed string in XML node for inputs \"%1\""
 msgstr "IU: feilforma streng i XML-opunkt for inngangane \"%1\""
 
-#: io.cc:1030 io.cc:1131
+#: io.cc:1047 io.cc:1148
 msgid "bad input string in XML node \"%1\""
 msgstr "feil inngangsstreng i XML-punktet \"%1\""
 
-#: io.cc:1069
+#: io.cc:1086
 msgid "IO: badly formed string in XML node for outputs \"%1\""
 msgstr "IU: feilforma streng i XML-punktet for utgangane \"%1\""
 
-#: io.cc:1074
+#: io.cc:1091
 msgid "IO: bad output string in XML node \"%1\""
 msgstr "IU: feil utgangsstreng i XML-punktet \"%1\""
 
-#: io.cc:1413
+#: io.cc:1256 plugin.cc:275
+msgid "Out"
+msgstr ""
+
+#: io.cc:1256 plugin.cc:273
+msgid "In"
+msgstr ""
+
+#: io.cc:1454
 #, c-format
 msgid "%s %u"
 msgstr "%s %u"
 
-#: io.cc:1460
+#: io.cc:1501
 #, c-format
 msgid "%s in"
 msgstr " %s inn"
 
-#: io.cc:1462
+#: io.cc:1503
 #, c-format
 msgid "%s out"
 msgstr "%s ut"
 
-#: io.cc:1537 session.cc:733 session.cc:767
+#: io.cc:1578 session.cc:957 session.cc:991
 msgid "mono"
 msgstr "mono"
 
-#: io.cc:1539 session.cc:746 session.cc:781
+#: io.cc:1580 session.cc:970 session.cc:1005
 msgid "L"
 msgstr "V"
 
-#: io.cc:1539 session.cc:748 session.cc:783
+#: io.cc:1580 session.cc:972 session.cc:1007
 msgid "R"
 msgstr "H"
 
-#: io.cc:1541 io.cc:1547
-#, c-format
-msgid "%d"
-msgstr "%d"
-
 #: ladspa_plugin.cc:93
 msgid "LADSPA: Unable to open module: "
 msgstr ""
@@ -957,81 +1176,81 @@ msgid "LADSPA: \"%1\" cannot be used, since it cannot do inplace processing"
 msgstr ""
 "LADSPA: kan ikkje bruka \"%1\", sidan han ikkje kan prosessera på staden"
 
-#: ladspa_plugin.cc:311
+#: ladspa_plugin.cc:308
 msgid ""
 "illegal parameter number used with plugin \"%1\". This may indicate a change "
 "in the plugin design, and presets may be invalid"
 msgstr ""
 
-#: ladspa_plugin.cc:390 ladspa_plugin.cc:440
+#: ladspa_plugin.cc:387 ladspa_plugin.cc:437
 msgid "Bad node sent to LadspaPlugin::set_state"
 msgstr "Feil punkt sendt til LadspaPlugin::set_state"
 
-#: ladspa_plugin.cc:405 ladspa_plugin.cc:454
+#: ladspa_plugin.cc:402 ladspa_plugin.cc:451
 msgid "LADSPA: no ladspa port number"
 msgstr "LADSPA: ikkje noko Ladspa-portnummer"
 
-#: ladspa_plugin.cc:411 ladspa_plugin.cc:460
+#: ladspa_plugin.cc:408 ladspa_plugin.cc:457
 msgid "LADSPA: no ladspa port data"
 msgstr "LADSPA: ingen portdata"
 
-#: ladspa_plugin.cc:842
+#: ladspa_plugin.cc:863
 msgid "Could not locate HOME.  Preset not removed."
 msgstr "Greidde ikkje finna heimemappa. Har ikkje fjera ferdigoppsett."
 
-#: ladspa_plugin.cc:881 ladspa_plugin.cc:887
+#: ladspa_plugin.cc:902 ladspa_plugin.cc:908
 msgid "Could not create %1.  Preset not saved. (%2)"
 msgstr "Greidde ikkje laga %1. Har ikkje lagra ferdigoppsett. (%2)"
 
-#: ladspa_plugin.cc:894
+#: ladspa_plugin.cc:915
 msgid "Error saving presets file %1."
 msgstr "Feil med å lagra ferdigoppsettfila %1."
 
-#: ladspa_plugin.cc:936
+#: ladspa_plugin.cc:957
 msgid "Could not locate HOME.  Preset not saved."
 msgstr "Greidde ikkje finna heimemappa. Har ikkje lagra ferdigoppsett."
 
-#: location.cc:456
+#: location.cc:455
 msgid "You cannot put a CD marker at this position"
 msgstr "Du kan ikkje leggja til ein CD-markør her"
 
-#: location.cc:608
+#: location.cc:607
 msgid "incorrect XML node passed to Location::set_state"
 msgstr "feil XML-punkt sendt til Location::set_state"
 
-#: location.cc:613
+#: location.cc:612
 msgid "XML node for Location has no ID information"
 msgstr "XML-punktet for denne staden har ingen ID-informasjon"
 
-#: location.cc:617
+#: location.cc:616
 msgid "XML node for Location has no name information"
 msgstr "XML-punktet for denne staden har ingen namneinformasjon"
 
-#: location.cc:624
+#: location.cc:623
 msgid "XML node for Location has no start information"
 msgstr "XML-punktet for denne staden har ingen startinformasjon"
 
-#: location.cc:635
+#: location.cc:634
 msgid "XML node for Location has no end information"
 msgstr "XML-punktet for denne staden har ingen sluttinformasjon"
 
-#: location.cc:642
+#: location.cc:641
 msgid "XML node for Location has no flags information"
 msgstr "XML-punktet for denne staden har ingen flagginformasjon"
 
-#: location.cc:856
+#: location.cc:868
 msgid "Locations: attempt to use unknown location as selected location"
 msgstr "Stader: forsøk på å bruka ukjend stad som vald stad"
 
-#: location.cc:1034
+#: location.cc:1046
 msgid "incorrect XML mode passed to Locations::set_state"
 msgstr "feil XML-modus send til Locations::set_state"
 
-#: location.cc:1047 session.cc:1293 session.cc:4919 session_state.cc:1053
+#: location.cc:1059 session.cc:1667 session.cc:6305 session_state.cc:1205
 msgid "session"
 msgstr "økt"
 
-#: location.cc:1112
+#: location.cc:1126
 msgid "could not load location from session file - ignored"
 msgstr "greidde ikkje lasta stad frå øktfila - hoppa over"
 
@@ -1083,48 +1302,104 @@ msgstr ""
 "Det finst alt ei plassering med det namnet.\n"
 "Du kan gje eit nytt namn til den importerte plasseringa:"
 
-#: ltc_slave.cc:272
+#: ltc_file_reader.cc:96
+msgid "LTCFileReader: cannot open file \"%1\""
+msgstr ""
+
+#: ltc_file_reader.cc:105
+msgid "LTCFileReader: cannot open file \"%1\" (%3)"
+msgstr ""
+
+#: ltc_file_reader.cc:109
+msgid "LTCFileReader: \"%1\" is an empty audio file"
+msgstr ""
+
+#: ltc_file_reader.cc:134
+msgid "LTCFileReader:: invalid audio channel selected"
+msgstr ""
+
+#: ltc_slave.cc:275
 msgid "Session framerate adjusted from %1 to LTC's %2."
 msgstr ""
 
-#: ltc_slave.cc:286
+#: ltc_slave.cc:289
 msgid "Session and LTC framerate mismatch: LTC:%1 Session:%2."
 msgstr ""
 
-#: ltc_slave.cc:603
+#: ltc_slave.cc:609
 msgid "flywheel"
 msgstr ""
 
-#: midi_diskstream.cc:173
+#: lua_api.cc:87
+msgid "Script with given name was not found\n"
+msgstr ""
+
+#: lua_api.cc:96
+msgid "Failed to instantiate Lua Processor\n"
+msgstr ""
+
+#: luaproc.cc:876
+msgid "Failed to load Lua script from session state."
+msgstr ""
+
+#: luaproc.cc:886
+msgid "Session State for LuaProcessor did not include a Lua script."
+msgstr ""
+
+#: luaproc.cc:890
+msgid "Invalid/incompatible Lua script found for LuaProcessor."
+msgstr ""
+
+#: luaproc.cc:918
+msgid "Bad node sent to LuaProc::set_state"
+msgstr ""
+
+#: luaproc.cc:928
+msgid "LuaProc: port has no symbol, ignored"
+msgstr ""
+
+#: luaproc.cc:934
+msgid "LuaProc: port has no value, ignored"
+msgstr ""
+
+#: luaproc.cc:1164
+msgid "Unable to create LuaProc presets directory"
+msgstr ""
+
+#: luascripting.cc:132
+msgid "Script '%1' has no valid descriptor."
+msgstr ""
+
+#: midi_diskstream.cc:172
 msgid ""
 "%1: I/O configuration change %4 requested to use %2, but channel setup is %3"
 msgstr "%1: I/U-oppsettsendringa %4 ba om å bruka %2, men kanaloppsettet er %3"
 
-#: midi_diskstream.cc:225
+#: midi_diskstream.cc:224
 msgid "MidiDiskstream: Playlist \"%1\" isn't a midi playlist"
 msgstr ""
 
-#: midi_diskstream.cc:276
+#: midi_diskstream.cc:275
 msgid "MidiDiskstream %1: there is no existing playlist to make a copy of!"
 msgstr "MIDI-diskstraum %1: det finst inga speleliste å kopiera!"
 
-#: midi_diskstream.cc:754
+#: midi_diskstream.cc:753
 msgid "MidiDiskstream %1: cannot read %2 from playlist at frame %3"
 msgstr "MIDI-diskstraum %1: greidde ikkje lesa %2 frå spelelista, ramme %3"
 
-#: midi_diskstream.cc:891
+#: midi_diskstream.cc:890
 msgid "MidiDiskstream %1: cannot write to disk"
 msgstr "MIDI-diskstraum %1: greidde ikkje skriva til disk"
 
-#: midi_diskstream.cc:925
+#: midi_diskstream.cc:924
 msgid "MidiDiskstream \"%1\": cannot flush captured data to disk!"
 msgstr "MIDI-diskstraum \"%1\": greier ikkje skriva opptaket til disken!"
 
-#: midi_diskstream.cc:1014
+#: midi_diskstream.cc:1013
 msgid "%1: could not create region for complete midi file"
 msgstr "%1: greidde ikkje laga bolk for heil midifil"
 
-#: midi_diskstream.cc:1055
+#: midi_diskstream.cc:1054
 msgid "MidiDiskstream: could not create region for captured midi!"
 msgstr "MIDI-diskstraum: greidde ikkje laga bolk frå midi-opptaket!"
 
@@ -1144,31 +1419,47 @@ msgstr "Fann ingen NoteID for noteeigenskapsendringa - såg bort frå"
 msgid "No SysExID found for sys-ex property change - ignored"
 msgstr "Fann ingen SysExID for sys-ex-eigenskapsendring - såg bort frå"
 
-#: midi_model.cc:1994
-msgid "transpose"
-msgstr "transponer"
+#: midi_patch_manager.cc:78
+msgid "Loading %1 MIDI patch from %2"
+msgid_plural "Loading %1 MIDI patches from %2"
+msgstr[0] ""
+msgstr[1] ""
+
+#: midi_patch_manager.cc:109
+msgid "Unloading %1 MIDI patch from %2"
+msgid_plural "Unloading %1 MIDI patches from %2"
+msgstr[0] ""
+msgstr[1] ""
+
+#: midi_patch_manager.cc:126
+msgid "Error parsing MIDI patch file %1"
+msgstr ""
 
-#: midi_patch_manager.cc:133
+#: midi_patch_manager.cc:135
 msgid "Duplicate MIDI device `%1' in `%2' ignored"
 msgstr ""
 
-#: midi_scene_changer.cc:295
+#: midi_patch_manager.cc:170
+msgid "Removing MIDI patch file %1"
+msgstr ""
+
+#: midi_scene_changer.cc:312
 msgid "Scene "
 msgstr ""
 
-#: midi_source.cc:125
+#: midi_source.cc:126
 msgid "Missing parameter property on InterpolationStyle"
 msgstr "Manglar parametereigenskap på InterpolationStyle"
 
-#: midi_source.cc:131
+#: midi_source.cc:132
 msgid "Missing style property on InterpolationStyle"
 msgstr "Manglar stileigenskap på InterpolationStyle"
 
-#: midi_source.cc:140
+#: midi_source.cc:141
 msgid "Missing parameter property on AutomationState"
 msgstr "Manglar parameterigenskap på AutomationStyle"
 
-#: midi_source.cc:146
+#: midi_source.cc:147
 msgid "Missing state property on AutomationState"
 msgstr "Manglar statuseigenskap på AutomationState"
 
@@ -1176,58 +1467,58 @@ msgstr "Manglar statuseigenskap på AutomationState"
 msgid "MIDI stretch created non-MIDI source"
 msgstr ""
 
-#: monitor_processor.cc:53
+#: monitor_processor.cc:54
 msgid "monitor dim"
 msgstr "dim lytting"
 
-#: monitor_processor.cc:54
+#: monitor_processor.cc:55
 msgid "monitor cut"
 msgstr "kutt lytting"
 
-#: monitor_processor.cc:55
+#: monitor_processor.cc:56
 msgid "monitor mono"
 msgstr "lytting i mono"
 
-#: monitor_processor.cc:58
+#: monitor_processor.cc:59
 msgid "monitor dim level"
 msgstr "dimnivå lytting"
 
-#: monitor_processor.cc:62
+#: monitor_processor.cc:63
 msgid "monitor solo boost level"
 msgstr "soloaukingsnivå for lytting"
 
-#: monitor_processor.cc:512
+#: monitor_processor.cc:543
 msgid "cut control %1"
 msgstr "kutt kontroll %1"
 
-#: monitor_processor.cc:513
+#: monitor_processor.cc:544
 msgid "dim control"
 msgstr "dim kontroll"
 
-#: monitor_processor.cc:514
+#: monitor_processor.cc:545
 msgid "polarity control"
 msgstr "polaritetskontroll"
 
-#: monitor_processor.cc:515
+#: monitor_processor.cc:546
 msgid "solo control"
 msgstr "solo kontroll"
 
-#: mtc_slave.cc:240
+#: mtc_slave.cc:241
 msgid "MTC Slave: atomic read of current time failed, sleeping!"
 msgstr "MTC-slave: greidde ikkje lesa gyldig tid. Søv."
 
-#: mtc_slave.cc:362
+#: mtc_slave.cc:363
 msgid ""
 "Unknown rate/drop value %1 in incoming MTC stream, session values used "
 "instead"
 msgstr ""
 "Ukjent rate/sleppverdi %1 i innkomande MTC-straum, bruker øktverdiar i staden"
 
-#: mtc_slave.cc:382
+#: mtc_slave.cc:383
 msgid "Session framerate adjusted from %1 TO: MTC's %2."
 msgstr ""
 
-#: mtc_slave.cc:396
+#: mtc_slave.cc:397
 msgid "Session and MTC framerate mismatch: MTC:%1 %2:%3."
 msgstr ""
 
@@ -1283,7 +1574,7 @@ msgstr "bolkkopi"
 msgid "fixed time region copy"
 msgstr "fast tid-bolkkopi"
 
-#: pannable.cc:207
+#: pannable.cc:208
 msgid "Pannable given XML data for %1 - ignored"
 msgstr "Panoreringa fekk XML-data for %1 - ignorert"
 
@@ -1317,21 +1608,69 @@ msgstr ""
 msgid "select panner: %1\n"
 msgstr ""
 
-#: panner_shell.cc:255
+#: panner_shell.cc:257
 msgid "Unknown panner plugin \"%1\" found in pan state - ignored"
 msgstr ""
 "Ukjent panoreringstilleggsprogram, \"%1\", funne i panoreringstilstand. "
 "Hoppa over."
 
-#: panner_shell.cc:261
+#: panner_shell.cc:263
 msgid "panner plugin node has no type information!"
 msgstr "tilleggsprogrampunktet for panoreringa har ingen typeinformasjon!"
 
-#: playlist.cc:2138
+#: parameter_descriptor.cc:201
+msgid "Note|C"
+msgstr ""
+
+#: parameter_descriptor.cc:202
+msgid "Note|C#"
+msgstr ""
+
+#: parameter_descriptor.cc:203
+msgid "Note|D"
+msgstr ""
+
+#: parameter_descriptor.cc:204
+msgid "Note|D#"
+msgstr ""
+
+#: parameter_descriptor.cc:205
+msgid "Note|E"
+msgstr ""
+
+#: parameter_descriptor.cc:206
+msgid "Note|F"
+msgstr ""
+
+#: parameter_descriptor.cc:207
+msgid "Note|F#"
+msgstr ""
+
+#: parameter_descriptor.cc:208
+msgid "Note|G"
+msgstr ""
+
+#: parameter_descriptor.cc:209
+msgid "Note|G#"
+msgstr ""
+
+#: parameter_descriptor.cc:210
+msgid "Note|A"
+msgstr ""
+
+#: parameter_descriptor.cc:211
+msgid "Note|A#"
+msgstr ""
+
+#: parameter_descriptor.cc:212
+msgid "Note|B"
+msgstr ""
+
+#: playlist.cc:2234
 msgid "region state node has no ID, ignored"
 msgstr "områdestatusnoden har ingen ID, ser bort frå"
 
-#: playlist.cc:2156
+#: playlist.cc:2252
 msgid "Playlist: cannot create region from XML"
 msgstr "Speleliste: greier ikkje laga bolk frå XML"
 
@@ -1343,35 +1682,59 @@ msgstr "Fann ingen speleliste-ID i PlaylistSource-XML!"
 msgid "Could not construct playlist for PlaylistSource from session data!"
 msgstr "Greidde ikkje byggja speleliste for PlaylistSource frå øktdata!"
 
-#: plugin.cc:328
+#: plugin.cc:126
+msgid "Cannot remove plugin factory preset."
+msgstr ""
+
+#: plugin.cc:144
+msgid "Preset with given name already exists."
+msgstr ""
+
+#: plugin.cc:263
+msgid "Audio"
+msgstr "Lyd"
+
+#: plugin.cc:266
+msgid "Midi"
+msgstr ""
+
+#: plugin.cc:269
+msgid "?"
+msgstr ""
+
+#: plugin.cc:412
 msgid ""
 "Plugin presets are not supported in this build of %1. Consider paying for a "
 "full version"
 msgstr ""
 
-#: plugin.cc:403
+#: plugin.cc:495
 msgid ""
 "Saving plugin settings is not supported in this build of %1. Consider paying "
 "for the full version"
 msgstr ""
 
-#: plugin_insert.cc:596
+#: plugin_insert.cc:1148
 msgid "programming error: "
 msgstr "programmeringsfeil: "
 
-#: plugin_insert.cc:933
+#: plugin_insert.cc:1700
+msgid "SC %1"
+msgstr ""
+
+#: plugin_insert.cc:2352
 msgid "XML node describing plugin is missing the `type' field"
 msgstr "XML-punktet som skildrar utvidinga manglar 'type'-feltet"
 
-#: plugin_insert.cc:948
+#: plugin_insert.cc:2369
 msgid "unknown plugin type %1 in plugin insert state"
 msgstr "ukjent programtilleggstype %1 i innpluggingstilstanden"
 
-#: plugin_insert.cc:976
+#: plugin_insert.cc:2397
 msgid "Plugin has no unique ID field"
 msgstr "Innstikket har ikkje noko eige ID-felt"
 
-#: plugin_insert.cc:1001
+#: plugin_insert.cc:2435
 msgid ""
 "Found a reference to a plugin (\"%1\") that is unknown.\n"
 "Perhaps it was removed or moved since it was last used."
@@ -1379,93 +1742,189 @@ msgstr ""
 "Fann ein referanse til det ukjende tilleggsprogrammet \"%1\".\n"
 "Kanskje det har vorte fjerna eller flytt sidan sist det vart brukt."
 
-#: plugin_insert.cc:1115
+#: plugin_insert.cc:2645
 msgid "PluginInsert: Auto: no ladspa port number"
 msgstr "PluginInsert:Auto: ikkje noko ladspa-portnummer"
 
-#: plugin_insert.cc:1122
+#: plugin_insert.cc:2652
 msgid "PluginInsert: Auto: port id out of range"
 msgstr "PluginInsert: Auto: port-id utanfor rekkjevidd"
 
-#: plugin_insert.cc:1158
+#: plugin_insert.cc:2688
 msgid "PluginInsert: automatable control %1 not found - ignored"
 msgstr ""
 "PluginInsert: fann ikkje den automasjonsferdige kontrollen %1, såg bort frå "
 "han."
 
-#: plugin_manager.cc:209
+#: plugin_manager.cc:220
 msgid "Discovering Plugins"
 msgstr "Finn innstikk"
 
-#: plugin_manager.cc:231
+#: plugin_manager.cc:251
 msgid "Scanning LADSPA Plugins"
 msgstr ""
 
-#: plugin_manager.cc:234
+#: plugin_manager.cc:253
+msgid "Scanning Lua DSP Processors"
+msgstr ""
+
+#: plugin_manager.cc:256
 msgid "Scanning LV2 Plugins"
 msgstr ""
 
-#: plugin_manager.cc:239
+#: plugin_manager.cc:262
 msgid "Scanning Windows VST Plugins"
 msgstr ""
 
-#: plugin_manager.cc:246
+#: plugin_manager.cc:264
+msgid "Discovering Windows VST Plugins"
+msgstr ""
+
+#: plugin_manager.cc:273
 msgid "Scanning Linux VST Plugins"
 msgstr ""
 
-#: plugin_manager.cc:252
+#: plugin_manager.cc:275
+msgid "Discovering Linux VST Plugins"
+msgstr ""
+
+#: plugin_manager.cc:288
+msgid "VST Blacklist: "
+msgstr ""
+
+#: plugin_manager.cc:290
+msgid "VST Blacklist:"
+msgstr ""
+
+#: plugin_manager.cc:300
 msgid "Scanning AU Plugins"
 msgstr ""
 
-#: plugin_manager.cc:256
+#: plugin_manager.cc:302
+msgid "Discovering AU Plugins"
+msgstr ""
+
+#: plugin_manager.cc:307
 msgid "Plugin Scan Complete..."
 msgstr ""
 
-#: plugin_manager.cc:393
+#: plugin_manager.cc:513
 msgid "LADSPA"
 msgstr ""
 
-#: plugin_manager.cc:445
+#: plugin_manager.cc:565
 msgid "Could not parse rdf file: %1"
 msgstr "Greidde ikkje tolka rdf-fila: %1"
 
-#: plugin_manager.cc:482
+#: plugin_manager.cc:602
 msgid "LADSPA: cannot load module \"%1\" (%2)"
 msgstr "LADSPA: greier ikkje lasta modulen \"%1\" (%2)"
 
-#: plugin_manager.cc:489
+#: plugin_manager.cc:609
 msgid "LADSPA: module \"%1\" has no descriptor function."
 msgstr "LADSPA: modulen \"%1\" har ingen skildringsfunksjon."
 
-#: plugin_manager.cc:705
+#: plugin_manager.cc:813
+msgid "--- Windows VST plugins Scan: %1"
+msgstr ""
+
+#: plugin_manager.cc:819
 msgid "VST"
 msgstr ""
 
-#: plugin_manager.cc:732
+#: plugin_manager.cc:824
+msgid "--- Windows VST plugins Scan Done"
+msgstr ""
+
+#: plugin_manager.cc:839
+msgid "cannot open dll"
+msgstr ""
+
+#: plugin_manager.cc:843
+msgid "invalid dll, file too small"
+msgstr ""
+
+#: plugin_manager.cc:847
+msgid "not a dll"
+msgstr ""
+
+#: plugin_manager.cc:853
+msgid "cannot determine dll type"
+msgstr ""
+
+#: plugin_manager.cc:857
+msgid "cannot read dll PE header"
+msgstr ""
+
+#: plugin_manager.cc:862
+msgid "invalid dll PE header"
+msgstr ""
+
+#: plugin_manager.cc:869
+msgid "i386 (32-bit)"
+msgstr ""
+
+#: plugin_manager.cc:872
+msgid "Itanium"
+msgstr ""
+
+#: plugin_manager.cc:875
+msgid "x64 (64-bit)"
+msgstr ""
+
+#: plugin_manager.cc:878
+msgid "Native Architecture"
+msgstr ""
+
+#: plugin_manager.cc:881
+msgid "Unknown Architecture"
+msgstr ""
+
+#: plugin_manager.cc:897
+msgid " *  %1 (cache only)"
+msgstr ""
+
+#: plugin_manager.cc:899
+msgid " *  %1 - %2"
+msgstr ""
+
+#: plugin_manager.cc:913
+msgid " -> Cannot get Windows VST information, plugin ignored."
+msgstr ""
+
+#: plugin_manager.cc:924
 msgid ""
-"VST plugin %1 does not support processReplacing, and so cannot be used in %2 "
-"at this time"
+"VST plugin %1 does not support processReplacing, and cannot be used in %2 at "
+"this time"
 msgstr ""
 
-#: plugin_manager.cc:824
+#: plugin_manager.cc:959
+msgid "Ignoring duplicate Windows VST plugin \"%1\""
+msgstr ""
+
+#: plugin_manager.cc:971
+msgid " -> OK (VST Plugin \"%1\" was added)."
+msgstr ""
+
+#: plugin_manager.cc:1019
 msgid "LXVST"
 msgstr ""
 
-#: plugin_manager.cc:851
+#: plugin_manager.cc:1046
 msgid ""
 "linuxVST plugin %1 does not support processReplacing, and so cannot be used "
 "in %2 at this time"
 msgstr ""
 
-#: plugin_manager.cc:1020
+#: plugin_manager.cc:1213
 msgid "unknown plugin status type \"%1\" - all entries ignored"
 msgstr "\"%1\" er ein ukjend utvidingsstatustype, såg bort frå alt"
 
-#: plugin_manager.cc:1037
+#: plugin_manager.cc:1232
 msgid "unknown plugin type \"%1\" - ignored"
 msgstr "\"%1\" er ein ukjend innstikktype - hoppa over"
 
-#: port.cc:450
+#: port.cc:504
 msgid "could not reregister %1"
 msgstr "greidde ikkje registrera %1."
 
@@ -1473,16 +1932,16 @@ msgstr "greidde ikkje registrera %1."
 msgid "insert %1"
 msgstr "set inn %1"
 
-#: port_insert.cc:197
+#: port_insert.cc:204
 msgid "XML node describing port insert is missing the `type' field"
 msgstr "XML-punktet som skildrar portinnstikket manglar 'type'-feltet"
 
-#: port_insert.cc:202
+#: port_insert.cc:209
 msgid "non-port insert XML used for port plugin insert"
 msgstr ""
 "tappingspunkt-XML som ikkje er ein port er brukt for porttilleggstapping"
 
-#: port_manager.cc:287
+#: port_manager.cc:288
 msgid ""
 "a port with the name \"%1\" already exists: check for duplicated track/bus "
 "names"
@@ -1490,138 +1949,203 @@ msgstr ""
 "ein port med namnet \"%1\" finst frå før: sjekk opp dublettar i namn på spor "
 "eller bussar"
 
-#: port_manager.cc:289
+#: port_manager.cc:290
 msgid ""
 "No more ports are available. You will need to stop %1 and restart with more "
 "ports if you need this many tracks."
 msgstr ""
 
-#: port_manager.cc:292
+#: port_manager.cc:293
 msgid "AudioEngine: cannot register port \"%1\": %2"
 msgstr "AudioEngine: greier ikkje registrera porten \"%1\": %2"
 
-#: port_manager.cc:331
+#: port_manager.cc:332
 msgid "unable to create port: %1"
 msgstr "greidde ikkje laga port: %1"
 
-#: port_manager.cc:418
+#: port_manager.cc:453
 msgid "AudioEngine: cannot connect %1 (%2) to %3 (%4)"
 msgstr "Lydmaskineri: Klarte ikkje kopla %1 (%2) til %3 (%4)."
 
-#: port_manager.cc:470 port_manager.cc:471
+#: port_manager.cc:505 port_manager.cc:506
 msgid "Re-establising port %1 failed"
 msgstr ""
 
-#: processor.cc:214
+#: processor.cc:218
 msgid "No %1 property flag in element %2"
 msgstr "Ikkje noko %1-eigenskapsflagg i elementet %2"
 
-#: processor.cc:223
+#: processor.cc:227
 msgid "No child node with active property"
 msgstr "Ingen undernode med aktiv eigenskap"
 
-#: rc_configuration.cc:91
+#: rc_configuration.cc:92
 msgid "Loading system configuration file %1"
 msgstr "Lastar systemoppsettfila %1"
 
-#: rc_configuration.cc:95
+#: rc_configuration.cc:96
 msgid "%1: cannot read system configuration file \"%2\""
 msgstr "%1: greier ikkje lesa systemoppsettfila \"%2\""
 
-#: rc_configuration.cc:100
+#: rc_configuration.cc:101
 msgid "%1: system configuration file \"%2\" not loaded successfully."
 msgstr "%1: greidde ikkje lasta systemoppsettfila \"%2\" skikkeleg."
 
-#: rc_configuration.cc:104
+#: rc_configuration.cc:105
 msgid ""
 "Your system %1 configuration file is empty. This probably means that there "
 "was an error installing %1"
 msgstr ""
 
-#: rc_configuration.cc:119
+#: rc_configuration.cc:120
 msgid "Loading user configuration file %1"
 msgstr "Lastar brukaroppsettfila %1"
 
-#: rc_configuration.cc:123
+#: rc_configuration.cc:124
 msgid "%1: cannot read configuration file \"%2\""
 msgstr "%1: greier ikkje lesa oppsettfila \"%2\""
 
-#: rc_configuration.cc:128
+#: rc_configuration.cc:129
 msgid "%1: user configuration file \"%2\" not loaded successfully."
 msgstr "%1: greidde ikkje lasta brukaroppsettfila \"%2\" skikkeleg."
 
-#: rc_configuration.cc:132
+#: rc_configuration.cc:133
 msgid "your %1 configuration file is empty. This is not normal."
 msgstr "%1-oppsettsfila di er tom. Dette er ikkje normalt."
 
-#: rc_configuration.cc:149
+#: rc_configuration.cc:150
 msgid "Config file %1 not saved"
 msgstr "Oppsettfila %1 er ikkje lagra"
 
-#: recent_sessions.cc:54
+#: recent_sessions.cc:55
 msgid "cannot open recent session file %1 (%2)"
 msgstr "greier ikkje opna den nyleg brukte øktfila %1 (%2)"
 
-#: region_factory.cc:78 region_factory.cc:120 region_factory.cc:161
-#: region_factory.cc:203
+#: recent_sessions.cc:68 recent_sessions.cc:126
+msgid "Error reading recent session file %1 (%2)"
+msgstr ""
+
+#: recent_sessions.cc:113
+msgid "Cannot open recent template file %1 (%2)"
+msgstr ""
+
+#: recent_sessions.cc:176
+msgid "Error writing recent sessions file %1 (%2)"
+msgstr ""
+
+#: recent_sessions.cc:211
+msgid "Error writing saved template file %1 (%2)"
+msgstr ""
+
+#: region_factory.cc:78 region_factory.cc:121 region_factory.cc:162
+#: region_factory.cc:204
 msgid ""
 "programming error: RegionFactory::create() called with unknown Region type"
 msgstr ""
 "programmeringsfeil: RegionFactory::create()-funksjonen oppkalle med ukjent "
 "bolktype"
 
-#: region_factory.cc:565
+#: region_factory.cc:566
 msgid "%1 compound-%2 (%3)"
 msgstr "%1 samansett-%2 (%3)"
 
-#: region_factory.cc:567
+#: region_factory.cc:568
 msgid "%1 compound-%2.1 (%3)"
 msgstr "%1 samansett-%2.1 (%3)"
 
-#: region_factory.cc:629
+#: region_factory.cc:630
 msgid "cannot create new name for region \"%1\""
 msgstr "greier ikkje laga nytt namn for bolken \"%1\""
 
-#: resampled_source.cc:102
+#: resampled_source.cc:107
 msgid "Import: %1"
 msgstr "Import: %1"
 
-#: resampled_source.cc:132 srcfilesource.cc:75
+#: resampled_source.cc:136 srcfilesource.cc:75
 msgid "Import: src_new() failed : %1"
 msgstr "Import: src_new()-funkjsonen lukkast ikkje: %1"
 
-#: return.cc:41
+#: return.cc:42
 msgid "return %1"
 msgstr "retur %1"
 
-#: route.cc:1218 route.cc:2701
+#: route.cc:862 route.cc:2797
 msgid "unknown Processor type \"%1\"; ignored"
 msgstr "\"%1\" er ein ukjend prosesseringstype, hoppa over"
 
-#: route.cc:1240
+#: route.cc:884
 msgid "processor could not be created. Ignored."
 msgstr "greidde ikkje laga prosessering. Hoppa over."
 
-#: route.cc:2126 route.cc:2355
+#: route.cc:2338 route.cc:2504
 msgid "Bad node sent to Route::set_state() [%1]"
 msgstr "Feil punkt sendt til Route::set_state()-funksjonen [%1]"
 
-#: route.cc:2186
+#: route.cc:2395
 msgid "Pannable state found for route (%1) without a panner!"
 msgstr "Fann panoreringsstatus for ruta (%1) utan panorering!"
 
-#: route.cc:2260 route.cc:2264 route.cc:2469 route.cc:2473
-msgid "badly formed order key string in state file! [%1] ... ignored."
-msgstr "feilforma tingingsnykjelstreng i tilstandsfil! [%1] ... hoppa over."
+#: route.cc:3270
+msgid "Invalid Solo-Isolate propagation: from:%1 new:%2 - old:%3 = delta:%4"
+msgstr ""
+
+#: route.cc:4396
+msgid "Amp/Fader on Route '%1' went AWOL. Re-added."
+msgstr ""
+
+#: route.cc:4994
+msgid "lo"
+msgstr ""
+
+#: route.cc:4996
+msgid "mid"
+msgstr ""
+
+#: route.cc:4998
+msgid "hi"
+msgstr ""
+
+#: route.cc:5105
+msgid "Leveler"
+msgstr ""
+
+#: route.cc:5107
+msgid "Compressor"
+msgstr ""
+
+#: route.cc:5109 route.cc:5111
+msgid "Limiter"
+msgstr ""
+
+#: route.cc:5111
+msgid "Sidechain"
+msgstr ""
+
+#: route.cc:5114 route.cc:5116 route.cc:5133 route.cc:5135
+msgid "???"
+msgstr ""
+
+#: route.cc:5126
+msgid "Attk"
+msgstr ""
+
+#: route.cc:5128
+msgid "Ratio"
+msgstr ""
 
-#: route.cc:2479
-msgid "Converting deprecated order key for %1 using Editor order %2"
+#: route.cc:5131
+msgid "Rels"
 msgstr ""
 
-#: route_group.cc:459
+#: route_group.cc:507
 msgid "You cannot subgroup MIDI tracks at this time"
 msgstr "Du kan ikkje laga undergrupper for MIDI-spor no"
 
+#: route_group.cc:514
+msgid ""
+"You cannot subgroup tracks with different number of outputs at this time."
+msgstr ""
+
 #: rb_effect.cc:229 rb_effect.cc:269
 msgid "tempoize: error reading data from %1 at %2 (wanted %3, got %4)"
 msgstr ""
@@ -1631,206 +2155,246 @@ msgstr ""
 msgid "error writing tempo-adjusted data to %1"
 msgstr "greidde ikkje skriva tempo-justert fil til %1"
 
-#: send.cc:61
+#: send.cc:62
 msgid "aux %1"
 msgstr ""
 
-#: send.cc:65
+#: send.cc:66
 msgid "send %1"
 msgstr "send %1"
 
-#: send.cc:67
+#: send.cc:68
 msgid "programming error: send created using role %1"
 msgstr ""
 
-#: session.cc:357
+#: session.cc:348 session.cc:403
+msgid "Cannot connect to audio/midi engine"
+msgstr ""
+
+#: session.cc:358
+msgid "Session initialization failed"
+msgstr ""
+
+#: session.cc:374
+msgid "Failed to load template/snapshot state"
+msgstr ""
+
+#: session.cc:385
+msgid "Failed to load state"
+msgstr ""
+
+#: session.cc:409
+msgid "Cannot configure audio/midi engine with session parameters"
+msgstr ""
+
+#: session.cc:433
 msgid "Connect to engine"
 msgstr "Kople til maskin"
 
-#: session.cc:362
+#: session.cc:484
 msgid "Session loading complete"
 msgstr "Ferdig å lasta økta."
 
-#: session.cc:434
+#: session.cc:575
 msgid "Set up LTC"
 msgstr ""
 
-#: session.cc:436
+#: session.cc:577
 msgid "Set up Click"
 msgstr ""
 
-#: session.cc:438
+#: session.cc:579
 msgid "Set up standard connections"
 msgstr "Set opp standartilkoplingar"
 
-#: session.cc:664
+#: session.cc:888
 msgid "could not setup Click I/O"
 msgstr "greidde ikkje setja opp klikk-I/U"
 
-#: session.cc:727
+#: session.cc:951
 #, c-format
 msgid "out %s"
 msgstr ""
 
-#: session.cc:729
+#: session.cc:953
 #, c-format
 msgid "out %<PRIu32>"
 msgstr "ut %<PRIu32>"
 
-#: session.cc:744
+#: session.cc:968
 #, c-format
 msgid "out %<PRIu32>+%<PRIu32>"
 msgstr "ut %<PRIu32>+%<PRIu32>"
 
-#: session.cc:761
+#: session.cc:985
 #, c-format
 msgid "in %s"
 msgstr ""
 
-#: session.cc:763
+#: session.cc:987
 #, c-format
 msgid "in %<PRIu32>"
 msgstr "inn %<PRIu32>"
 
-#: session.cc:778
+#: session.cc:1002
 #, c-format
 msgid "in %<PRIu32>+%<PRIu32>"
 msgstr "inn %<PRIu32>+%<PRIu32>"
 
-#: session.cc:852
+#: session.cc:1082
 msgid "cannot connect master output %1 to %2"
 msgstr "greier ikkje kopla til hovudutgangane %1 til %2"
 
-#: session.cc:921
-msgid "Monitor"
+#: session.cc:1170
+msgid "Cannot create monitor section. 'Monitor' Port name is not unique."
 msgstr ""
 
-#: session.cc:966
+#: session.cc:1204 session.cc:1335
 msgid "cannot connect control input %1 to %2"
 msgstr "greier ikkje kopla til kontrollinngangane %1 til %2"
 
-#: session.cc:986
+#: session.cc:1224 session.cc:1354
 msgid "The preferred I/O for the monitor bus (%1) cannot be found"
 msgstr "Greidde ikkje finna føretrekt I/U for lyttebussen (%1)"
 
-#: session.cc:1017
+#: session.cc:1255 session.cc:1385
 msgid "cannot connect control output %1 to %2"
 msgstr "greier ikkje kopla til kontrollutgangane %1 til %2"
 
-#: session.cc:1085
+#: session.cc:1443
 msgid "cannot create Auditioner: no auditioning of regions possible"
 msgstr "greier ikkje laga Lytting: det er ikkje råd å lytta på nokon bolkar."
 
-#: session.cc:1270
+#: session.cc:1644
 msgid "Session: you can't use that location for auto punch (start <= end)"
 msgstr "Økt: du kan ikkje bruka denne staden for autoinnslag (start<=slutt)"
 
-#: session.cc:1297
+#: session.cc:1671
 msgid "Session: you can't use that location for session start/end)"
 msgstr ""
 
-#: session.cc:1329
+#: session.cc:1703
 msgid ""
 "You cannot use this location for auto-loop because it has zero or negative "
 "length"
 msgstr ""
 
-#: session.cc:1497
+#: session.cc:1886
 msgid "programming error: session range removed!"
 msgstr ""
 
-#: session.cc:1751
+#: session.cc:2158
 msgid "feedback loop setup between %1 and %2"
 msgstr "rundgang-lykkjeoppsett mellom %1 og %2"
 
-#: session.cc:2047
+#: session.cc:2419
+msgid "Track "
+msgstr ""
+
+#: session.cc:2421
+msgid "Audio "
+msgstr ""
+
+#: session.cc:2426
+msgid "MIDI "
+msgstr ""
+
+#: session.cc:2500
 msgid "Session: could not create new midi track."
 msgstr "Økt: greidde ikkje laga nytt midispor."
 
-#: session.cc:2053
+#: session.cc:2506
 msgid ""
 "No more JACK ports are available. You will need to stop %1 and restart JACK "
 "with more ports if you need this many tracks."
 msgstr ""
 
-#: session.cc:2239 session.cc:2242
-msgid "Audio"
-msgstr "Lyd"
+#: session.cc:2547 session.cc:2550
+msgid "Midi Bus"
+msgstr ""
+
+#: session.cc:2572
+msgid "cannot configure new midi bus input"
+msgstr ""
+
+#: session.cc:2578
+msgid "cannot configure new midi bus output"
+msgstr ""
+
+#: session.cc:2592 session.cc:3137
+msgid "Session: could not create new audio route."
+msgstr "Økt: greidde ikkje laga ny lydrute."
 
-#: session.cc:2266 session.cc:2274 session.cc:2352 session.cc:2360
+#: session.cc:3022 session.cc:3030 session.cc:3113 session.cc:3121
 msgid "cannot configure %1 in/%2 out configuration for new audio track"
 msgstr ""
 "greier ikkje stilla inn %1 inn/%2 ut-innstillingane for det nye lydsporet"
 
-#: session.cc:2297
+#: session.cc:3050
 msgid "Session: could not create new audio track."
 msgstr "Økt: greidde ikkje laga nytt lydspor."
 
-#: session.cc:2330 session.cc:2333
+#: session.cc:3088 session.cc:3091
 msgid "Bus"
 msgstr "Buss"
 
-#: session.cc:2383
-msgid "Session: could not create new audio route."
-msgstr "Økt: greidde ikkje laga ny lydrute."
-
-#: session.cc:2443 session.cc:2453
+#: session.cc:3207 session.cc:3217
 msgid "Session: UINT_MAX routes? impossible!"
 msgstr "Økt: UINT_MAX-ruter? Går ikkje an!"
 
-#: session.cc:2475
+#: session.cc:3293
 msgid "Session: cannot create track/bus from template description"
 msgstr "Økt: greier ikkje laga spor/buss frå malskildringa"
 
-#: session.cc:2501
+#: session.cc:3331
 msgid "Session: could not create new route from template"
 msgstr "Økt: greidde ikkje laga ny lydrute frå malen"
 
-#: session.cc:2531
+#: session.cc:3365
 msgid "Adding new tracks/busses failed"
 msgstr ""
 
-#: session.cc:3671
+#: session.cc:4784
 msgid "Merging embedded file %1: name collision AND md5 hash collision!"
 msgstr ""
 
-#: session.cc:3801 session.cc:3874
+#: session.cc:4914 session.cc:4987
 msgid "There are already %1 recordings for %2, which I consider too many."
 msgstr "Det er alt %1 opptak for %2, og eg synest det er for mange."
 
-#: session.cc:4316
+#: session.cc:5663
 msgid "send ID %1 appears to be in use already"
 msgstr "send-IDen %1 ser ut til å vera i bruk frå før"
 
-#: session.cc:4328
+#: session.cc:5675
 msgid "aux send ID %1 appears to be in use already"
 msgstr ""
 
-#: session.cc:4340
+#: session.cc:5687
 msgid "return ID %1 appears to be in use already"
 msgstr "retur-IDen %1 ser ut til å vera i bruk frå før"
 
-#: session.cc:4352
+#: session.cc:5699
 msgid "insert ID %1 appears to be in use already"
 msgstr "send-IDen %2 ser ut til å vera i bruk frå før"
 
-#: session.cc:4477
+#: session.cc:5825
 msgid "Cannot write a range where end <= start (e.g. %1 <= %2)"
 msgstr "Kan ikkje skriva eit område der slutten <= starten (td. %1 <= %2)"
 
-#: session.cc:4486
+#: session.cc:5834
 msgid "Cannot write a range with no data."
 msgstr ""
 
-#: session.cc:4528
+#: session.cc:5876
 msgid "cannot create new file \"%1\" for %2"
 msgstr ""
 
-#: session_click.cc:161
+#: session_click.cc:162
 msgid "cannot open click soundfile %1 (%2)"
 msgstr "greier ikkje opna klikk-lydfila %1 (%2)"
 
-#: session_click.cc:174
+#: session_click.cc:175
 msgid "cannot read data from click soundfile"
 msgstr "greier ikkje lesa data frå klikklydfila"
 
@@ -1873,23 +2437,36 @@ msgstr ""
 msgid "Could not save session options"
 msgstr ""
 
-#: session_directory.cc:59
+#: session_directory.cc:65
 msgid "Cannot create Session directory at path %1 Error: %2"
 msgstr "greier ikkje laga øktmappa i stigen \"%1\", feil: %2"
 
-#: session_directory.cc:76
+#: session_directory.cc:82
 msgid "Session subdirectory does not exist at path %1"
 msgstr "Undermappa for økta finst ikkje i stigen %1"
 
-#: session_events.cc:234
+#: session_directory.cc:161
+msgid ""
+"session-dir and session-name mismatch. Please use 'Menu > Session > Rename' "
+"in the future to rename sessions."
+msgstr ""
+
+#: session_directory.cc:167
+msgid ""
+"The session's interchange dir is tainted.\n"
+"There is more than one folder in '%1'.\n"
+"Please remove extra subdirs to reduce possible filename ambiguties."
+msgstr ""
+
+#: session_events.cc:229
 msgid "Session: cannot have two events of type %1 at the same frame (%2)."
 msgstr "Økt: du kan ikkje ha to handlingar av typen %1 på same ramma (%2)."
 
-#: session_export.cc:125
+#: session_export.cc:152
 msgid "%1: cannot seek to %2 for export"
 msgstr "%1: greier ikkje finna %2 for eksportering"
 
-#: session_export.cc:182
+#: session_export.cc:216
 msgid "Export ended unexpectedly: %1"
 msgstr ""
 
@@ -1899,99 +2476,111 @@ msgid ""
 "of this session."
 msgstr ""
 
-#: session_midi.cc:520
+#: session_midi.cc:570
 msgid "Session: cannot send quarter-frame MTC message (%1)"
 msgstr "Økt: greidde ikkje senda kvartramme-MTC-melding (%1)"
 
-#: session_playlists.cc:378 session_playlists.cc:397
+#: session_playlists.cc:405 session_playlists.cc:424
 msgid "Session: cannot create Playlist from XML description."
 msgstr "Økt: greier ikkje laga speleliste ut frå XML-skildringa."
 
-#: session_process.cc:136
+#: session_process.cc:159
 msgid "Session: error in no roll for %1"
 msgstr "Økt: feil på ingen rull for %1"
 
-#: session_process.cc:1174
+#: session_process.cc:1202
 msgid "Programming error: illegal event type in process_event (%1)"
 msgstr "Programmeringsfeil: ulovleg handlingstype i process-event (%1)"
 
-#: session_state.cc:179
+#: session_state.cc:194
 msgid "solo cut control (dB)"
 msgstr "solokutt-kontroll (dB)"
 
-#: session_state.cc:203
+#: session_state.cc:216
 msgid "Set block size and sample rate"
 msgstr "Set blokkstorleik og punktrate"
 
-#: session_state.cc:208
+#: session_state.cc:221
 msgid "Using configuration"
 msgstr "Bruker oppsett"
 
-#: session_state.cc:331
+#: session_state.cc:348
 msgid "Reset Remote Controls"
 msgstr "Still tilbake fjernkontrollar"
 
-#: session_state.cc:423
+#: session_state.cc:377 session_state.cc:409
+msgid "Filling playback buffers"
+msgstr ""
+
+#: session_state.cc:475
 msgid "Session: cannot create session peakfile folder \"%1\" (%2)"
 msgstr "Økt: greier ikkje laga mappa \"%1\" for økttoppfiler (%2)"
 
-#: session_state.cc:430
+#: session_state.cc:482
 msgid "Session: cannot create session sounds dir \"%1\" (%2)"
 msgstr "Økt: greier ikkje laga øktmappa \"%1\" for lydfiler (%2)"
 
-#: session_state.cc:437
+#: session_state.cc:489
 msgid "Session: cannot create session midi dir \"%1\" (%2)"
 msgstr "Økt: greier ikkje laga midimappa \"%1\" for økta (%2)"
 
-#: session_state.cc:444
+#: session_state.cc:496
 msgid "Session: cannot create session dead sounds folder \"%1\" (%2)"
 msgstr "Økt: greier ikkje laga mappa \"%1\" for daudlyd (%2)"
 
-#: session_state.cc:451
+#: session_state.cc:503
 msgid "Session: cannot create session export folder \"%1\" (%2)"
 msgstr "Økt: greidde ikkje laga mappa \"%1\" for eksportlyd (%2)"
 
-#: session_state.cc:458
+#: session_state.cc:510
 msgid "Session: cannot create session analysis folder \"%1\" (%2)"
 msgstr "Økt: greidde ikkje laga mappa \"%1\" for øktanalyse (%2)"
 
-#: session_state.cc:465
+#: session_state.cc:517
 msgid "Session: cannot create session plugins folder \"%1\" (%2)"
 msgstr "Økt: greier ikkje laga utvidingmappa \"%1\" for økta (%2)"
 
-#: session_state.cc:472
+#: session_state.cc:524
 msgid "Session: cannot create session externals folder \"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:486
+#: session_state.cc:538
 msgid "Session: cannot create session folder \"%1\" (%2)"
 msgstr "Økt: greidde ikkje laga øktmappa \"%1\" (%2)"
 
-#: session_state.cc:520
+#: session_state.cc:569
+msgid "Error reading session template file %1 (%2)"
+msgstr ""
+
+#: session_state.cc:584
+msgid "Error writing session template file %1 (%2)"
+msgstr ""
+
+#: session_state.cc:601
 msgid "Could not open %1 for writing session template"
 msgstr ""
 
-#: session_state.cc:526
+#: session_state.cc:608
 msgid "Could not open session template %1 for reading"
 msgstr ""
 
-#: session_state.cc:545
-msgid "Master"
+#: session_state.cc:626
+msgid "Loop"
 msgstr ""
 
-#: session_state.cc:606
+#: session_state.cc:707
 msgid "Could not remove pending capture state at path \"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:630
+#: session_state.cc:731
 msgid "could not rename snapshot %1 to %2 (%3)"
 msgstr "greidde ikkje døypa om snøggbiletet %1 til %2 (%3)"
 
-#: session_state.cc:658
+#: session_state.cc:759
 msgid "Could not remove session file at path \"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:685
+#: session_state.cc:788
 msgid ""
 "the %1 audio engine is not connected and state saving would lose all I/O "
 "connections. Session not saved"
@@ -1999,142 +2588,142 @@ msgstr ""
 "lydmotoren i %1 er ikkje kopla til, og å lagra statusen ville kasta bort "
 "alle I/U-tilkoplingar. Økta er ikkje lagra"
 
-#: session_state.cc:736
+#: session_state.cc:856
 msgid "state could not be saved to %1"
 msgstr "greidde ikkje lagra tilstanden til %1"
 
-#: session_state.cc:738 session_state.cc:749
+#: session_state.cc:858 session_state.cc:871
 msgid "Could not remove temporary session file at path \"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:746
+#: session_state.cc:868
 msgid "could not rename temporary session file %1 to %2 (%3)"
 msgstr ""
 
-#: session_state.cc:814
+#: session_state.cc:942
 msgid "%1: session file \"%2\" doesn't exist!"
 msgstr ""
 
-#: session_state.cc:826
+#: session_state.cc:954
 msgid "Could not understand session file %1"
 msgstr ""
 
-#: session_state.cc:835
+#: session_state.cc:963
 msgid "Session file %1 is not a session"
 msgstr "Øktfila %1 er ikkje ei økt"
 
-#: session_state.cc:1147
+#: session_state.cc:1332
 msgid "programming error: Session: incorrect XML node sent to set_state()"
 msgstr ""
 "programmeringsfeil: Økt: feil XML-punkt sendt til set_state()-funksjonen"
 
-#: session_state.cc:1201
+#: session_state.cc:1410
 msgid "Session: XML state has no options section"
 msgstr "Økt: XML-tilstandsfila har ikkje noko avsnitt om instillingar"
 
-#: session_state.cc:1206
+#: session_state.cc:1415
 msgid "Session: XML state has no metadata section"
 msgstr "Økt: XML-fila har inga avdeling for metadata"
 
-#: session_state.cc:1217
+#: session_state.cc:1426
 msgid "Session: XML state has no sources section"
 msgstr "Økt: XML-tilstandsfila har ikkje noko avsnitt om kjelder"
 
-#: session_state.cc:1224
+#: session_state.cc:1433
 msgid "Session: XML state has no Tempo Map section"
 msgstr "Økt: XML-fila har ikkje noko avsnitt om tempokart"
 
-#: session_state.cc:1231
+#: session_state.cc:1440
 msgid "Session: XML state has no locations section"
 msgstr "Økt: XML-fila har ikkje noko avsnitt om stader"
 
-#: session_state.cc:1244
+#: session_state.cc:1453
 msgid "Session: XML state has no Regions section"
 msgstr "Økt: XML-tilstandsfila har ikkje noko avsnitt om bolkar"
 
-#: session_state.cc:1251
+#: session_state.cc:1460
 msgid "Session: XML state has no playlists section"
 msgstr "Økt: XML-tilstandsfila har ikkje noko avsnitt om spelelister"
 
-#: session_state.cc:1271
+#: session_state.cc:1480
 msgid "Session: XML state has no bundles section"
 msgstr "Økt: XML-fila har inga avdeling for bundlar"
 
-#: session_state.cc:1283
+#: session_state.cc:1492
 msgid "Session: XML state has no diskstreams section"
 msgstr "Økt: XML-fila har ikkje nok avsnitt om diskstraumar"
 
-#: session_state.cc:1291
+#: session_state.cc:1504
 msgid "Session: XML state has no routes section"
 msgstr "Økt: XML-fila har ikkje noko avsnitt om ruter"
 
-#: session_state.cc:1303
+#: session_state.cc:1520
 msgid "Session: XML state has no route groups section"
 msgstr "Økt: XML-fila har inga avdeling for rutegrupper"
 
-#: session_state.cc:1312
+#: session_state.cc:1529
 msgid "Session: XML state has no edit groups section"
 msgstr "Økt: XML-fila har ikkje noko avsnitt om grupperedigering"
 
-#: session_state.cc:1319
+#: session_state.cc:1536
 msgid "Session: XML state has no mix groups section"
 msgstr "Økt: XML-fila har ikkje noko avsnitt om miksgrupper"
 
-#: session_state.cc:1327
+#: session_state.cc:1544
 msgid "Session: XML state has no click section"
 msgstr "Økt: XML-fila har ikkje noko avsnitt om klikk"
 
-#: session_state.cc:1373
+#: session_state.cc:1606
 msgid "Session: cannot create Route from XML description."
 msgstr "Økt: greier ikkje laga rute ut frå XML-skildringa."
 
-#: session_state.cc:1377
+#: session_state.cc:1610
 msgid "Loaded track/bus %1"
 msgstr "Lasta spor/buss %1"
 
-#: session_state.cc:1382
+#: session_state.cc:1615
 msgid "Tracks/busses loaded;  Adding to Session"
 msgstr ""
 
-#: session_state.cc:1386
+#: session_state.cc:1619
 msgid "Finished adding tracks/busses"
 msgstr ""
 
-#: session_state.cc:1485
+#: session_state.cc:1709
 msgid "Could not find diskstream for route"
 msgstr "Greidde ikkje finna diskstraumen for rute"
 
-#: session_state.cc:1545
+#: session_state.cc:1760
 msgid "Session: cannot create Region from XML description."
 msgstr "Økt: greier ikkje laga bolkar ut frå XML-skildringa."
 
-#: session_state.cc:1549
+#: session_state.cc:1764
 msgid "Can not load state for region '%1'"
 msgstr "Greier ikkje laga status for bolken '%1'"
 
-#: session_state.cc:1585
+#: session_state.cc:1800
 msgid "Regions in compound description not found (ID's %1 and %2): ignored"
 msgstr "Fann ikkje bolkar i samansetjingsstatus (IDar %1 og %2): ignorert"
 
-#: session_state.cc:1613
+#: session_state.cc:1828
 msgid "Nested source has no ID info in session file! (ignored)"
 msgstr ""
 
-#: session_state.cc:1625
+#: session_state.cc:1840
 msgid "Cannot reconstruct nested source for region %1"
 msgstr "Greier ikkje rekonstruera nøsta kjelde for bolken %1"
 
-#: session_state.cc:1687
+#: session_state.cc:1902
 msgid "Session: XMLNode describing a AudioRegion is incomplete (no source)"
 msgstr "Økt: XML-punktet som skildrar ein lydbolk er uferdig (manglar kjelde)"
 
-#: session_state.cc:1695 session_state.cc:1716 session_state.cc:1736
+#: session_state.cc:1910 session_state.cc:1931 session_state.cc:1951
 msgid ""
 "Session: XMLNode describing a AudioRegion references an unknown source id =%1"
 msgstr ""
 "Økt: XML-punktet som skildrar ein lydbolk peikar på ein ukjend kjelde-ID = %1"
 
-#: session_state.cc:1701 session_state.cc:1722 session_state.cc:1742
+#: session_state.cc:1916 session_state.cc:1937 session_state.cc:1957
 msgid ""
 "Session: XMLNode describing a AudioRegion references a non-audio source id ="
 "%1"
@@ -2142,7 +2731,7 @@ msgstr ""
 "Økt: XML-punktet som skildrar ein lydbolk peikar på ein kjelde-ID %1 som "
 "ikkje er ei lydfil"
 
-#: session_state.cc:1765
+#: session_state.cc:1980
 msgid ""
 "Session: XMLNode describing an AudioRegion is missing some master sources; "
 "ignored"
@@ -2150,138 +2739,175 @@ msgstr ""
 "Økt: XML-punktet som skildrar ein lydbolk manglar nokre masterkjelder, ser "
 "bort frå"
 
-#: session_state.cc:1799
+#: session_state.cc:2014
 msgid "Session: XMLNode describing a MidiRegion is incomplete (no source)"
 msgstr "Økt: XML-punktet som skildrar ein midibolk er uferdig (manglar kjelde)"
 
-#: session_state.cc:1807
+#: session_state.cc:2022
 msgid ""
 "Session: XMLNode describing a MidiRegion references an unknown source id =%1"
 msgstr ""
 "Økt: XML-punktet som skildrar ein midibolk peikar på ein ukjend kjelde-ID = "
 "%1"
 
-#: session_state.cc:1813
+#: session_state.cc:2028
 msgid ""
 "Session: XMLNode describing a MidiRegion references a non-midi source id =%1"
 msgstr ""
 "Økt: XML-punktet som skildrar ein midibolk peikar på ein kjelde-ID %1 som "
 "ikkje er ei midi-fil"
 
-#: session_state.cc:1872
+#: session_state.cc:2101
 msgid "Session: cannot create Source from XML description."
 msgstr "Økt: greier ikkje laga kjelde ut frå XML-skildringa."
 
-#: session_state.cc:1880
+#: session_state.cc:2109
 msgid ""
 "A external MIDI file is missing. %1 cannot currently recover from missing "
 "external MIDI files"
 msgstr ""
 
-#: session_state.cc:1962
+#: session_state.cc:2191
 msgid "Found a sound file that cannot be used by %1. Talk to the programmers."
 msgstr ""
 
-#: session_state.cc:1979
+#: session_state.cc:2212
 msgid "Could not create templates directory \"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:1992
+#: session_state.cc:2224
 msgid "Template \"%1\" already exists - new version not created"
 msgstr "Malen \"%1\" finst alt - laga ingen ny versjon"
 
-#: session_state.cc:1998
+#: session_state.cc:2230
 msgid "Could not create directory for Session template\"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:2008
+#: session_state.cc:2259
 msgid "template not saved"
 msgstr "malen vart ikkje lagra"
 
-#: session_state.cc:2018
-msgid "Could not create directory for Session template plugin state\"%1\" (%2)"
+#: session_state.cc:2501
+msgid "Unknown node \"%1\" found in Bundles list from session file"
 msgstr ""
 
-#: session_state.cc:2261
-msgid "Unknown node \"%1\" found in Bundles list from session file"
+#: session_state.cc:2969
+msgid "Cannot cleanup peak-files for read-only session."
+msgstr ""
+
+#: session_state.cc:2973
+msgid "Cannot cleanup peak-files while recording"
+msgstr ""
+
+#: session_state.cc:2996
+msgid ""
+"Timeout waiting for peak-file creation to terminate before cleanup, please "
+"try again later."
 msgstr ""
 
-#: session_state.cc:2834
+#: session_state.cc:3261
 msgid "Session: cannot create dead file folder \"%1\" (%2)"
 msgstr "Økt: greier ikkje laga mappa \"%1\" for daudlyd (%2)"
 
-#: session_state.cc:2873
+#: session_state.cc:3296
 msgid "cannot rename unused file source from %1 to %2 (%3)"
 msgstr "kan ikkje døypa om den ubrukte filkjelda frå %1 til %2 (%3)"
 
-#: session_state.cc:2891
+#: session_state.cc:3312
 msgid "cannot remove peakfile %1 for %2 (%3)"
 msgstr "kan ikkje fjerna toppfil %1 for %2 (%3)"
 
-#: session_state.cc:3204
+#: session_state.cc:3633
 msgid "could not backup old history file, current history not saved"
 msgstr ""
 "greidde ikkje ta tryggingskopi av den gamle historiefila, noverande historie "
 "vart ikkje lagra."
 
-#: session_state.cc:3213
+#: session_state.cc:3642
 msgid "history could not be saved to %1"
 msgstr "greidde ikkje lagra historia til %1"
 
-#: session_state.cc:3216
+#: session_state.cc:3645
 msgid "Could not remove history file at path \"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:3220
+#: session_state.cc:3649
 msgid "could not restore history file from backup %1 (%2)"
 msgstr "greidde ikkje henta fram att historiefila frå tryggingskopien %1 (%2)"
 
-#: session_state.cc:3245
+#: session_state.cc:3674
 msgid "%1: no history file \"%2\" for this session."
 msgstr "%1: inga historiefil \"%2\" for denne økta."
 
-#: session_state.cc:3251
+#: session_state.cc:3680
 msgid "Could not understand session history file \"%1\""
 msgstr "Skjønte ikkje økthistoriefila \"%1\""
 
-#: session_state.cc:3293
+#: session_state.cc:3722
 msgid "Failed to downcast MidiSource for NoteDiffCommand"
 msgstr "Greidde ikkje kasta ned midi-kjelde for NoteDiffCommand"
 
-#: session_state.cc:3304
+#: session_state.cc:3733
 msgid "Failed to downcast MidiSource for SysExDiffCommand"
 msgstr "Greidde ikkje kasta ned midi-kjelde for SysExDiffCommand"
 
-#: session_state.cc:3315
+#: session_state.cc:3744
 msgid "Failed to downcast MidiSource for PatchChangeDiffCommand"
 msgstr "Greidde ikkje kasta ned midi-kjelde for PatchChangeDiffCommand"
 
-#: session_state.cc:3323
+#: session_state.cc:3752
 msgid "Couldn't figure out how to make a Command out of a %1 XMLNode."
 msgstr "Fann ikkje ut korleis eg skal laga ein kommando av eit %1-XML-punkt."
 
-#: session_state.cc:3559
+#: session_state.cc:3990
 msgid "Session: unknown diskstream type in XML"
 msgstr "Økt: ukjend diskstraumtype i XML"
 
-#: session_state.cc:3564
+#: session_state.cc:3995
 msgid "Session: could not load diskstream via XML state"
 msgstr "Økt: greidde ikkje lasta diskstraumen via XML-tilstand"
 
-#: session_state.cc:3688 session_state.cc:3716 session_state.cc:3729
-#: session_state.cc:3744
+#: session_state.cc:4092
+msgid "Cannot rename read-only session."
+msgstr ""
+
+#: session_state.cc:4096
+msgid "Cannot rename session while recording"
+msgstr ""
+
+#: session_state.cc:4181 session_state.cc:4182 session_state.cc:4224
+#: session_state.cc:4228
 msgid "renaming %s as %2 failed (%3)"
 msgstr ""
 
+#: session_state.cc:4244 session_state.cc:4245 session_state.cc:4259
+#: session_state.cc:4260
+msgid "renaming %1 as %2 failed (%3)"
+msgstr ""
+
+#: session_state.cc:4571
+msgid "Cannot create new session folder %1"
+msgstr ""
+
+#: session_state.cc:4633 session_state.cc:4708
+msgid ""
+"\n"
+"copying \"%1\" failed !"
+msgstr ""
+
+#: session_state.cc:4906
+msgid "unknown reason"
+msgstr ""
+
 #: session_time.cc:214
 msgid "Unknown transport state %1 in sync callback"
 msgstr ""
 
-#: session_transport.cc:171
+#: session_transport.cc:177
 msgid "Cannot loop - no loop range defined"
 msgstr "Greidde ikkje spela i lykkje - du har ikkje gjeve noko lykkjeområde"
 
-#: session_transport.cc:833
+#: session_transport.cc:968
 msgid ""
 "Seamless looping cannot be supported while %1 is using JACK transport.\n"
 "Recommend changing the configured options"
@@ -2289,11 +2915,11 @@ msgstr ""
 "Samanhengande lykkjespeling er ikkje støtta når %1 bruker JACK-transporten.\n"
 "Me rår til at du endrar innstillingane."
 
-#: session_transport.cc:915
+#: session_transport.cc:1050
 msgid "Locate called for negative sample position - ignored"
 msgstr ""
 
-#: session_transport.cc:1272
+#: session_transport.cc:1401
 msgid ""
 "Global varispeed cannot be supported while %1 is connected to JACK transport "
 "control"
@@ -2301,28 +2927,32 @@ msgstr ""
 "Allmenn varifart-kontroll kan ikkje brukast når %1 er kopla til JACK-"
 "transportkontrollen"
 
-#: smf_source.cc:344
+#: slavable.cc:100
+msgid "Master #%1 not found, assignment lost"
+msgstr ""
+
+#: smf_source.cc:350
 msgid "Unable to read event prefix, corrupt MIDI ring"
 msgstr ""
 
-#: smf_source.cc:357
+#: smf_source.cc:363
 msgid "Event has time and size but no body, corrupt MIDI ring"
 msgstr ""
 
-#: smf_source.cc:363
+#: smf_source.cc:369
 msgid "Event time is before MIDI source position"
 msgstr ""
 
-#: smf_source.cc:409
+#: smf_source.cc:417
 msgid ""
 "Skipping event with unordered beat time %1 < %2 (off by %3 beats, %4 ticks)"
 msgstr ""
 
-#: smf_source.cc:453
+#: smf_source.cc:461
 msgid "Skipping event with unordered frame time %1 < %2"
 msgstr ""
 
-#: smf_source.cc:518
+#: smf_source.cc:526
 msgid "cannot open MIDI file %1 for write"
 msgstr "greier ikkje opna MIDI-fila %1 for skriving"
 
@@ -2339,8 +2969,8 @@ msgid "CAF"
 msgstr "CAF"
 
 #: sndfile_helpers.cc:37
-msgid "W64 (64 bit WAV)"
-msgstr "W64 (64-bits WAV)"
+msgid "W64 (64-bit WAV)"
+msgstr ""
 
 #: sndfile_helpers.cc:38
 msgid "FLAC"
@@ -2383,24 +3013,24 @@ msgid ".raw"
 msgstr ".raw"
 
 #: sndfile_helpers.cc:66
-msgid "Signed 16 bit PCM"
-msgstr "Signert 16bit PCM"
+msgid "Signed 16-bit PCM"
+msgstr ""
 
 #: sndfile_helpers.cc:67
-msgid "Signed 24 bit PCM"
-msgstr "Signert 24bit PCM"
+msgid "Signed 24-bit PCM"
+msgstr ""
 
 #: sndfile_helpers.cc:68
-msgid "Signed 32 bit PCM"
-msgstr "Signert 32bit PCM"
+msgid "Signed 32-bit PCM"
+msgstr ""
 
 #: sndfile_helpers.cc:69
-msgid "Signed 8 bit PCM"
-msgstr "Signert 8bit PCM"
+msgid "Signed 8-bit PCM"
+msgstr ""
 
 #: sndfile_helpers.cc:70
-msgid "32 bit float"
-msgstr "32-bit flytpunkt"
+msgid "32-bit float"
+msgstr ""
 
 #: sndfile_helpers.cc:83
 msgid "Little-endian (Intel)"
@@ -2410,18 +3040,26 @@ msgstr "Liten endian (Intel)"
 msgid "Big-endian (PowerPC)"
 msgstr "Viktigaste bit fyrst (Mac)"
 
-#: sndfilesource.cc:260
+#: sndfilesource.cc:282
+msgid "SndFileSource: cannot open file \"%1\" for %2"
+msgstr ""
+
+#: sndfilesource.cc:300
 msgid "SndFileSource: cannot open file \"%1\" for %2 (%3)"
 msgstr "Lydfilkjelde: greier ikkje opna fila \"%1\" for %2 (%3)"
 
-#: sndfilesource.cc:268
+#: sndfilesource.cc:308
 msgid ""
 "SndFileSource: file only contains %1 channels; %2 is invalid as a channel "
 "number"
 msgstr ""
 "Lydfilkjelde: fila inneheld berre %1 kanalar, %2 er eit ugyldig kanalnummer"
 
-#: sndfilesource.cc:322 sndfilesource.cc:655
+#: sndfilesource.cc:323
+msgid "Cannot mark RF64 audio file for automatic downgrade to WAV: %1"
+msgstr ""
+
+#: sndfilesource.cc:375 sndfilesource.cc:705
 msgid ""
 "cannot set broadcast info for audio file %1 (%2); dropping broadcast info "
 "for this file"
@@ -2429,62 +3067,62 @@ msgstr ""
 "greier ikkje fastsetja kringkastingsinformasjon for lydfila %1 (%2), hoppar "
 "over kringkastingsinformasjonen for denne fila"
 
-#: sndfilesource.cc:368
-msgid "could not allocate file %1 for reading."
-msgstr "greidde ikkje tildela fila %1 for å lesa"
+#: sndfilesource.cc:418
+msgid "could not open file %1 for reading."
+msgstr ""
 
-#: sndfilesource.cc:403
+#: sndfilesource.cc:453
 msgid "SndFileSource: could not seek to frame %1 within %2 (%3)"
 msgstr "Lydfilkjelde: greier ikkje leita fram til ramma %1 innan %2 (%3)"
 
-#: sndfilesource.cc:412
+#: sndfilesource.cc:462
 msgid ""
 "SndFileSource: @ %1 could not read %2 within %3 (%4) (len = %5, ret was %6)"
 msgstr ""
 
-#: sndfilesource.cc:454 sndfilesource.cc:483
+#: sndfilesource.cc:504 sndfilesource.cc:533
 msgid "attempt to write a non-writable audio file source (%1)"
 msgstr "prøvde å skriva til ei ikkje-skrivbar lydkjeldefil (%1)"
 
-#: sndfilesource.cc:459 utils.cc:579 utils.cc:603 utils.cc:617 utils.cc:636
+#: sndfilesource.cc:509 utils.cc:564 utils.cc:588 utils.cc:602 utils.cc:621
 msgid "programming error: %1 %2"
 msgstr "programmeringsfeil: %1 %2"
 
-#: sndfilesource.cc:586 sndfilesource.cc:604
+#: sndfilesource.cc:636 sndfilesource.cc:654
 msgid "attempt to flush a non-writable audio file source (%1)"
 msgstr "prøvde å tømma ei ikkje-skrivbar lydkjeldefil (%1)"
 
-#: sndfilesource.cc:591
+#: sndfilesource.cc:641
 msgid "could not allocate file %1 to write header"
 msgstr "greidde ikkje tildela fila %1 for å skriva hovudet"
 
-#: sndfilesource.cc:609
+#: sndfilesource.cc:659
 msgid "could not allocate file %1 to flush contents"
 msgstr ""
 
-#: sndfilesource.cc:621
+#: sndfilesource.cc:671
 msgid ""
 "attempt to store broadcast info in a non-writable audio file source (%1)"
 msgstr ""
 "prøvde å lagra kringastingsinfo til ei ikkje-skrivbar lydkjeldefil (%1)"
 
-#: sndfilesource.cc:626
+#: sndfilesource.cc:676
 msgid "attempt to set BWF info for an un-opened audio file source (%1)"
 msgstr "prøvde å laga BWF-info for ei uopna lydkjeldefil (%1)"
 
-#: sndfilesource.cc:670
+#: sndfilesource.cc:720
 msgid "%1: cannot seek to %2 (libsndfile error: %3)"
 msgstr ""
 
-#: sndfilesource.cc:780
+#: sndfilesource.cc:830
 msgid "SndFileSource: \"%1\" bad read retval: %2 of %5 (%3: %4)"
 msgstr "SndFileSource: \"%1\" feillesen returverdi: %2 av %5 (%3: %4)"
 
-#: sndfilesource.cc:793 sndfilesource.cc:843 sndfilesource.cc:850
+#: sndfilesource.cc:843 sndfilesource.cc:893 sndfilesource.cc:900
 msgid "SndFileSource: \"%1\" bad write (%2)"
 msgstr "SndFileSource: \"%1\" feilskriving (%2)"
 
-#: sndfilesource.cc:873
+#: sndfilesource.cc:923
 msgid ""
 "Filesource: start time is already set for existing file (%1): Cannot change "
 "start time."
@@ -2492,12 +3130,24 @@ msgstr ""
 "Filkjelde: starttida er alt sett for denne fila (%1): kan ikkje endra "
 "starttid."
 
+#: sndfilesource.cc:982
+msgid "SndFileSource: cannot open file \"%1\" for reading"
+msgstr ""
+
+#: solo_control.cc:199
+msgid "Cleared Explicit solo: %1\n"
+msgstr ""
+
+#: solo_control.cc:202
+msgid "Cleared Implicit solo: %1 up:%2 down:%3\n"
+msgstr ""
+
 #: soundcloud_upload.cc:129
 msgid ""
 "Upload to Soundcloud failed.  Perhaps your email or password are incorrect?\n"
 msgstr ""
 
-#: source_factory.cc:374
+#: source_factory.cc:390
 msgid "Recovery attempted on a MIDI file - not implemented"
 msgstr ""
 
@@ -2516,7 +3166,7 @@ msgid "Speaker information is missing distance - speaker ignored"
 msgstr ""
 "Høgtalaroppsettet manglar opplysingar om avstand - høgtalaren ikkje medteken"
 
-#: srcfilesource.cc:134
+#: srcfilesource.cc:142
 msgid "SrcFileSource: %1"
 msgstr ""
 
@@ -2524,107 +3174,137 @@ msgstr ""
 msgid "Cannot compile tape track regexp for use (%1)"
 msgstr "Greier ikkje setja saman bandspor-reguttrykk til bruk (%1)"
 
-#: tempo.cc:80
-msgid "TempoSection XML node has no \"start\" property"
-msgstr "TempoSection-XML-punktet har ingen \"start\"-eigenskap"
+#: tempo.cc:98
+msgid "Legacy session detected. TempoSection XML node will be altered."
+msgstr ""
+
+#: tempo.cc:104
+msgid "TempoSection XML node has an illegal \"pulse\" value"
+msgstr ""
 
-#: tempo.cc:88
-msgid "TempoSection XML node has an illegal \"start\" value"
-msgstr "TempoSection-XML-punktet har ein ulovleg \"start\"-verdi"
+#: tempo.cc:112
+msgid "TempoSection XML node has an illegal \"frame\" value"
+msgstr ""
 
-#: tempo.cc:95
+#: tempo.cc:119
 msgid "TempoSection XML node has no \"beats-per-minute\" property"
 msgstr "TempoSection-XML-punktet har ingen \"slag per minutt\"-eigenskap"
 
-#: tempo.cc:100
+#: tempo.cc:124
 msgid "TempoSection XML node has an illegal \"beats_per_minute\" value"
 msgstr "TempoSection-XML-punktet har ein ulovleg \"slag per minutt\"-verdi"
 
-#: tempo.cc:109
+#: tempo.cc:133
 msgid "TempoSection XML node has an illegal \"note-type\" value"
 msgstr "TempoSection-XML-punktet har ein ulovleg \"note-type\"-verdi"
 
-#: tempo.cc:115
+#: tempo.cc:139
 msgid "TempoSection XML node has no \"movable\" property"
 msgstr "TempoSection-XML-punktet har ingen \"flyttbar\"-eigenskap"
 
-#: tempo.cc:125
-msgid "TempoSection XML node has an illegal \"bar-offset\" value"
+#: tempo.cc:146
+msgid "TempoSection XML node has no \"active\" property"
 msgstr ""
 
-#: tempo.cc:202
-msgid "MeterSection XML node has no \"start\" property"
-msgstr "MeterSection-XML-punktet har ingen \"start\"-eigenskap"
-
-#: tempo.cc:210
+#: tempo.cc:471
 msgid "MeterSection XML node has an illegal \"start\" value"
 msgstr "MeterSection-XML-punktet har ein ulovleg \"start\"-verdi"
 
-#: tempo.cc:220
+#: tempo.cc:474
+msgid "Legacy session detected - MeterSection XML node will be altered."
+msgstr ""
+
+#: tempo.cc:481
+msgid "MeterSection XML node has an illegal \"pulse\" value"
+msgstr ""
+
+#: tempo.cc:488
+msgid "MeterSection XML node has an illegal \"beat\" value"
+msgstr ""
+
+#: tempo.cc:495
+msgid "MeterSection XML node has no \"bbt\" property"
+msgstr ""
+
+#: tempo.cc:500
+msgid "MeterSection XML node has an illegal \"bbt\" value"
+msgstr ""
+
+#: tempo.cc:509
+msgid "MeterSection XML node has an illegal \"frame\" value"
+msgstr ""
+
+#: tempo.cc:519
 msgid ""
 "MeterSection XML node has no \"beats-per-bar\" or \"divisions-per-bar\" "
 "property"
 msgstr ""
 
-#: tempo.cc:226
-msgid ""
-"MeterSection XML node has an illegal \"beats-per-bar\" or \"divisions-per-bar"
-"\" value"
+#: tempo.cc:524
+msgid "MeterSection XML node has an illegal \"divisions-per-bar\" value"
 msgstr ""
 
-#: tempo.cc:231
+#: tempo.cc:529
 msgid "MeterSection XML node has no \"note-type\" property"
 msgstr "MeterSection-XML-punktet har ingen \"notetype\"-eigenskap"
 
-#: tempo.cc:236
+#: tempo.cc:533
 msgid "MeterSection XML node has an illegal \"note-type\" value"
 msgstr "MeterSection-XML-punktet har ein ulovleg \"start\"-verdi"
 
-#: tempo.cc:241
+#: tempo.cc:538
 msgid "MeterSection XML node has no \"movable\" property"
 msgstr "MeterSection-XML-punktet har ingen \"flyttbar\"-eigenskap"
 
-#: tempo.cc:388
+#: tempo.cc:545
+msgid "MeterSection XML node has no \"lock-style\" property"
+msgstr ""
+
+#: tempo.cc:821
 msgid ""
 "Meter changes can only be positioned on the first beat of a bar. Moving from "
 "%1 to %2"
 msgstr ""
 
-#: tempo.cc:650
+#: tempo.cc:1156
 msgid "no tempo sections defined in tempo map - cannot change tempo @ %1"
 msgstr ""
 "ingen temposeksjonar sette opp i tempokartet - kan ikkje endra tempoet ved %1"
 
-#: tempo.cc:680 tempo.cc:696 tempo.cc:712 tempo.cc:728
+#: tempo.cc:1186
+msgid "programming error: no meter section in tempo map!"
+msgstr ""
+
+#: tempo.cc:1204 tempo.cc:1227 tempo.cc:1248
 msgid "programming error: no tempo section in tempo map!"
 msgstr "programmeringsfeil: ikkje noko tempoavsnitt i tempokartet!"
 
-#: tempo.cc:846 tempo.cc:1827
-msgid "programming error: unhandled MetricSection type"
-msgstr "programmeringsfeil: uhandtert MetricSection-type"
-
-#: tempo.cc:1142
+#: tempo.cc:1959 tempo.cc:1987
 msgid "tempo map asked for BBT time at frame %1\n"
 msgstr ""
 
-#: tempo.cc:1185
+#: tempo.cc:2054
 msgid "tempo map asked for frame time at bar < 1  (%1)\n"
 msgstr ""
 
-#: tempo.cc:1642 tempo.cc:1656
+#: tempo.cc:3472 tempo.cc:3485
 msgid "Tempo map: could not set new state, restoring old one."
 msgstr ""
 "Tempokart: greidde ikkje fastsetja den nye tilstanden, hentar fram att den "
 "gamle."
 
-#: tempo.cc:1677
+#: tempo.cc:3522 tempo.cc:3523
 msgid "Multiple meter definitions found at %1"
 msgstr ""
 
-#: tempo.cc:1682
+#: tempo.cc:3528 tempo.cc:3529
 msgid "Multiple tempo definitions found at %1"
 msgstr ""
 
+#: tempo.cc:3715
+msgid "programming error: unhandled MetricSection type"
+msgstr "programmeringsfeil: uhandtert MetricSection-type"
+
 #: tempo_map_importer.cc:52
 msgid "Tempo map"
 msgstr "Tempokart"
@@ -2651,6 +3331,14 @@ msgid ""
 "Are you sure you want to do this?"
 msgstr ""
 
+#: unknown_processor.cc:86
+msgid "Using plugin-stub with unknown i/o configuration for: "
+msgstr ""
+
+#: unknown_processor.cc:107
+msgid "Using plugin-stub with mismatching i/o configuration for: "
+msgstr ""
+
 #: user_bundle.cc:47
 msgid "Node for Bundle has no \"name\" property"
 msgstr "Punkt for bundelen har ingen \"namn\"-eigenskap"
@@ -2672,62 +3360,132 @@ msgstr "Punktet for kanalen har ingen \"type\"-eigenskap"
 msgid "Node for Port has no \"name\" property"
 msgstr "Punktet for porten har ingen \"namn\"-eigenskap"
 
-#: utils.cc:422 utils.cc:451
+#: utils.cc:412 utils.cc:441
 msgid "Splice"
 msgstr "Splitt"
 
-#: utils.cc:424 utils.cc:441
+#: utils.cc:414 utils.cc:431
 msgid "Slide"
 msgstr "Gli"
 
-#: utils.cc:426 utils.cc:447
+#: utils.cc:416 utils.cc:437
 msgid "Ripple"
 msgstr ""
 
-#: utils.cc:428 utils.cc:444
+#: utils.cc:418 utils.cc:434
 msgid "Lock"
 msgstr "LÃ¥s"
 
-#: utils.cc:431
+#: utils.cc:421
 msgid "programming error: unknown edit mode string \"%1\""
 msgstr "programmeringsfeil: ukjend redigeringsmodus-streng \"%1\""
 
-#: utils.cc:458 utils.cc:490
+#: utils.cc:448 utils.cc:484
 msgid "MIDI Timecode"
 msgstr "MIDI-tidskode"
 
-#: utils.cc:458 utils.cc:488
+#: utils.cc:448 utils.cc:482
 msgid "MTC"
 msgstr "MTC"
 
-#: utils.cc:462 utils.cc:497
+#: utils.cc:452 utils.cc:491
 msgid "MIDI Clock"
 msgstr "MIDI-klokke"
 
-#: utils.cc:466 utils.cc:484 utils.cc:504
+#: utils.cc:456 utils.cc:478 utils.cc:498
 msgid "JACK"
 msgstr "JACK"
 
-#: utils.cc:470
+#: utils.cc:460 utils.cc:495
+msgid "LTC"
+msgstr ""
+
+#: utils.cc:464
 msgid "programming error: unknown sync source string \"%1\""
 msgstr "programmeringsfeil: ukjend synkkjeldestreng \"%1\""
 
-#: utils.cc:495
+#: utils.cc:489
 msgid "M-Clock"
 msgstr ""
 
-#: utils.cc:501
-msgid "LTC"
-msgstr ""
-
-#: utils.cc:671
+#: utils.cc:658
 msgid "programming error: unknown native header format: %1"
 msgstr "programmeringsfeil: ukjent opphavleg hovudformat: \"%1\""
 
-#: utils.cc:686
+#: utils.cc:673
 msgid "cannot open directory %1 (%2)"
 msgstr "greier ikkje opna mappa %1 (%2)"
 
+#: vca.cc:43
+#, c-format
+msgid "VCA %n"
+msgstr ""
+
+#: vca_manager.cc:166
+msgid "Cannot set state of a VCA"
+msgstr ""
+
+#~ msgid "%d"
+#~ msgstr "%d"
+
+#~ msgid "AudioSource: cannot open peakpath (c) \"%1\" (%2)"
+#~ msgstr "Lydkjelde: kan ikkje opna toppstig (c) \"%1\" (%2)"
+
+#~ msgid "8bit"
+#~ msgstr "8-bit"
+
+#~ msgid "16bit"
+#~ msgstr "16-bit"
+
+#~ msgid "24bit"
+#~ msgstr "24-bit"
+
+#~ msgid "32bit"
+#~ msgstr "32-bit"
+
+#~ msgid "8bit unsigned"
+#~ msgstr "8bit usignert"
+
+#~ msgid "Editor: cannot open \"%1\" as export file for CD marker file"
+#~ msgstr ""
+#~ "Redigering: greier ikkje opna \"%1\" som eksportfil for CD-markørfil"
+
+#~ msgid "transpose"
+#~ msgstr "transponer"
+
+#~ msgid "badly formed order key string in state file! [%1] ... ignored."
+#~ msgstr "feilforma tingingsnykjelstreng i tilstandsfil! [%1] ... hoppa over."
+
+#~ msgid "W64 (64 bit WAV)"
+#~ msgstr "W64 (64-bits WAV)"
+
+#~ msgid "Signed 16 bit PCM"
+#~ msgstr "Signert 16bit PCM"
+
+#~ msgid "Signed 24 bit PCM"
+#~ msgstr "Signert 24bit PCM"
+
+#~ msgid "Signed 32 bit PCM"
+#~ msgstr "Signert 32bit PCM"
+
+#~ msgid "Signed 8 bit PCM"
+#~ msgstr "Signert 8bit PCM"
+
+#~ msgid "32 bit float"
+#~ msgstr "32-bit flytpunkt"
+
+#~ msgid "could not allocate file %1 for reading."
+#~ msgstr "greidde ikkje tildela fila %1 for å lesa"
+
+#~ msgid "TempoSection XML node has no \"start\" property"
+#~ msgstr "TempoSection-XML-punktet har ingen \"start\"-eigenskap"
+
+#~ msgid "TempoSection XML node has an illegal \"start\" value"
+#~ msgstr "TempoSection-XML-punktet har ein ulovleg \"start\"-verdi"
+
+#~ msgid "MeterSection XML node has no \"start\" property"
+#~ msgstr "MeterSection-XML-punktet har ingen \"start\"-eigenskap"
+
 #~ msgid ""
 #~ "You have requested an operation that requires audio analysis.\n"
 #~ "\n"
diff --git a/libs/ardour/po/pl.mo b/libs/ardour/po/pl.mo
new file mode 100644
index 0000000..6d67e04
Binary files /dev/null and b/libs/ardour/po/pl.mo differ
diff --git a/libs/ardour/po/pl.po b/libs/ardour/po/pl.po
index e6c4f7b..c6fe0fe 100644
--- a/libs/ardour/po/pl.po
+++ b/libs/ardour/po/pl.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: libardour3\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-03-31 20:13-0400\n"
+"POT-Creation-Date: 2016-07-14 06:20-0400\n"
 "PO-Revision-Date: 2008-04-10 10:51+0100\n"
 "Last-Translator: Piotr Zaryk <pzaryk at gmail.com>\n"
 "Language-Team: Polish <pl at li.org>\n"
@@ -16,86 +16,239 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: amp.cc:57 automatable.cc:165
-msgid "Fader"
+#: amp.cc:412
+#, c-format
+msgid "%.2fdB"
 msgstr ""
 
-#: analyser.cc:117 audioregion.cc:1729
+#: analyser.cc:121 audioregion.cc:1789
 msgid "Transient Analysis failed for %1."
 msgstr ""
 
-#: analyser.cc:117
+#: analyser.cc:121
 msgid "Audio File Source"
 msgstr ""
 
-#: audio_diskstream.cc:249
+#: analysis_graph.cc:136
+msgid "%1 (%2..%3)"
+msgstr ""
+
+#: audio_backend.cc:31
+msgid "No Error occurred"
+msgstr ""
+
+#: audio_backend.cc:33
+msgid "Failed to initialize audio backend"
+msgstr ""
+
+#: audio_backend.cc:35
+msgid "Failed to deinitialize audio backend"
+msgstr ""
+
+#: audio_backend.cc:37
+msgid "Failed to reinitialize audio backend"
+msgstr ""
+
+#: audio_backend.cc:39
+msgid "Failed to open audio device"
+msgstr ""
+
+#: audio_backend.cc:41
+msgid "Failed to close audio device"
+msgstr ""
+
+#: audio_backend.cc:43
+msgid "Audio device not valid"
+msgstr ""
+
+#: audio_backend.cc:45
+msgid "Audio device unavailable"
+msgstr ""
+
+#: audio_backend.cc:47
+msgid "Audio device not connected"
+msgstr ""
+
+#: audio_backend.cc:49
+msgid "Failed to request and reserve audio device"
+msgstr ""
+
+#: audio_backend.cc:51
+msgid "Audio device Input/Output error"
+msgstr ""
+
+#: audio_backend.cc:53
+msgid "Failed to open MIDI device"
+msgstr ""
+
+#: audio_backend.cc:55
+msgid "Failed to close MIDI device"
+msgstr ""
+
+#: audio_backend.cc:57
+msgid "MIDI device unavailable"
+msgstr ""
+
+#: audio_backend.cc:59
+msgid "MIDI device not connected"
+msgstr ""
+
+#: audio_backend.cc:61
+msgid "MIDI device Input/Output error"
+msgstr ""
+
+#: audio_backend.cc:63
+msgid "Sample format is not supported"
+msgstr ""
+
+#: audio_backend.cc:65
+msgid "Sample rate is not supported"
+msgstr ""
+
+#: audio_backend.cc:67
+msgid "Requested input latency is not supported"
+msgstr ""
+
+#: audio_backend.cc:69
+msgid "Requested output latency is not supported"
+msgstr ""
+
+#: audio_backend.cc:71
+msgid "Period size is not supported"
+msgstr ""
+
+#: audio_backend.cc:73
+msgid "Period count is not supported"
+msgstr ""
+
+#: audio_backend.cc:75
+msgid "Device configuration not supported"
+msgstr ""
+
+#: audio_backend.cc:77
+msgid "Channel count configuration not supported"
+msgstr ""
+
+#: audio_backend.cc:79
+msgid "Input channel count configuration not supported"
+msgstr ""
+
+#: audio_backend.cc:81
+msgid "Output channel count configuration not supported"
+msgstr ""
+
+#: audio_backend.cc:83
+msgid "Unable to aquire realtime permissions"
+msgstr ""
+
+#: audio_backend.cc:85
+msgid "Setting audio device thread priorities failed"
+msgstr ""
+
+#: audio_backend.cc:87
+msgid "Setting MIDI device thread priorities failed"
+msgstr ""
+
+#: audio_backend.cc:89
+msgid "Failed to start process thread"
+msgstr ""
+
+#: audio_backend.cc:91
+msgid "Failed to start freewheel thread"
+msgstr ""
+
+#: audio_backend.cc:93
+msgid "Failed to register audio/midi ports"
+msgstr ""
+
+#: audio_backend.cc:95
+msgid "Failed to re-connect audio/midi ports"
+msgstr ""
+
+#: audio_backend.cc:97
+msgid "Out Of Memory Error"
+msgstr ""
+
+#: audio_backend.cc:99
+msgid "Could not reconnect to Audio/MIDI engine"
+msgstr ""
+
+#: audio_backend.cc:107 export_formats.cc:52 session.cc:6772 session.cc:6792
+msgid "None"
+msgstr ""
+
+#: audio_backend.cc:109
+msgid "Default"
+msgstr ""
+
+#: audio_diskstream.cc:257
 msgid "AudioDiskstream: Playlist \"%1\" isn't an audio playlist"
 msgstr ""
 
-#: audio_diskstream.cc:301
+#: audio_diskstream.cc:309
 msgid "AudioDiskstream %1: there is no existing playlist to make a copy of!"
 msgstr ""
 
-#: audio_diskstream.cc:861 audio_diskstream.cc:871
+#: audio_diskstream.cc:880 audio_diskstream.cc:890
 msgid ""
 "AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3"
 msgstr ""
 
-#: audio_diskstream.cc:1028
+#: audio_diskstream.cc:1053
 msgid "AudioDiskstream %1: cannot read %2 from playlist at frame %3"
 msgstr ""
 
-#: audio_diskstream.cc:1397 audio_diskstream.cc:1416
+#: audio_diskstream.cc:1469 audio_diskstream.cc:1488
 msgid "AudioDiskstream %1: cannot write to disk"
 msgstr ""
 
-#: audio_diskstream.cc:1459
+#: audio_diskstream.cc:1531
 msgid "AudioDiskstream \"%1\": cannot flush captured data to disk!"
 msgstr ""
 
-#: audio_diskstream.cc:1553
+#: audio_diskstream.cc:1627
 msgid "%1: could not create region for complete audio file"
 msgstr ""
 
-#: audio_diskstream.cc:1585
+#: audio_diskstream.cc:1659
 msgid "AudioDiskstream: could not create region for captured audio!"
 msgstr ""
 
-#: audio_diskstream.cc:1693
+#: audio_diskstream.cc:1755
 msgid "programmer error: %1"
 msgstr "błąd programisty: %1"
 
-#: audio_diskstream.cc:1921
+#: audio_diskstream.cc:2012
 msgid "AudioDiskstream: channel %1 out of range"
 msgstr ""
 
-#: audio_diskstream.cc:1935 midi_diskstream.cc:1274
+#: audio_diskstream.cc:2026 midi_diskstream.cc:1295
 msgid "%1:%2 new capture file not initialized correctly"
 msgstr ""
 
-#: audio_diskstream.cc:2214
+#: audio_diskstream.cc:2305
 msgid "%1: cannot restore pending capture source file %2"
 msgstr ""
 
-#: audio_diskstream.cc:2236
+#: audio_diskstream.cc:2327
 msgid "%1: incorrect number of pending sources listed - ignoring them all"
 msgstr ""
 
-#: audio_diskstream.cc:2270
+#: audio_diskstream.cc:2361
 msgid "%1: cannot create whole-file region from pending capture sources"
 msgstr ""
 
-#: audio_library.cc:81
+#: audio_library.cc:82
 msgid "Could not open %1.  Audio Library not saved"
 msgstr ""
 
-#: audio_playlist.cc:504
+#: audio_playlist.cc:509
 msgid ""
 "Legacy crossfade involved an incoming region not present in playlist \"%1\" "
 "- crossfade discarded"
 msgstr ""
 
-#: audio_playlist.cc:520
+#: audio_playlist.cc:525
 msgid ""
 "Legacy crossfade involved an outgoing region not present in playlist \"%1\" "
 "- crossfade discarded"
@@ -125,10 +278,11 @@ msgstr ""
 msgid "Audio Playlists (unused)"
 msgstr ""
 
-#: audio_playlist_source.cc:171 audiosource.cc:963 midi_playlist_source.cc:147
-#: midi_playlist_source.cc:155 midi_playlist_source.cc:162 midi_source.cc:356
-#: plugin_insert.cc:641 rb_effect.cc:327 session.cc:2845 session.cc:2878
-#: session.cc:4124 session_handle.cc:87 sndfilesource.cc:154
+#: audio_playlist_source.cc:171 audiosource.cc:1046
+#: midi_playlist_source.cc:147 midi_playlist_source.cc:155
+#: midi_playlist_source.cc:162 midi_source.cc:403 plugin_insert.cc:1259
+#: rb_effect.cc:327 session.cc:5314 session.cc:5341 session.cc:5461
+#: session_handle.cc:88 sndfilesource.cc:173
 msgid "programming error: %1"
 msgstr ""
 
@@ -152,26 +306,30 @@ msgid ""
 "Channels: "
 msgstr ""
 
-#: audio_track.cc:161
+#: audio_track.cc:177
 msgid "Unknown bundle \"%1\" listed for input of %2"
 msgstr ""
 
-#: audio_track.cc:163
+#: audio_track.cc:179
 msgid "in 1"
 msgstr "wejście 1"
 
-#: audio_track.cc:164
+#: audio_track.cc:180
 msgid "No input bundles available as a replacement"
 msgstr ""
 
-#: audio_track.cc:168
+#: audio_track.cc:184
 msgid "Bundle %1 was not available - \"in 1\" used instead"
 msgstr ""
 
-#: audio_track.cc:177
+#: audio_track.cc:193
 msgid "improper input channel list in XML node (%1)"
 msgstr ""
 
+#: audio_track.cc:216 diskstream.cc:503 source.cc:149
+msgid "%1: this session uses destructive tracks, which are not supported"
+msgstr ""
+
 #: audio_track_importer.cc:68
 msgid "Audio Tracks"
 msgstr ""
@@ -192,19 +350,19 @@ msgstr ""
 msgid "VAMP Plugin \"%1\" could not be loaded"
 msgstr ""
 
-#: audioengine.cc:696
+#: audioengine.cc:756
 msgid "AudioEngine: cannot load module \"%1\" (%2)"
 msgstr ""
 
-#: audioengine.cc:702
+#: audioengine.cc:762
 msgid "AudioEngine: backend at \"%1\" has no descriptor function."
 msgstr ""
 
-#: audioengine.cc:779
+#: audioengine.cc:841
 msgid "Could not create backend for %1: %2"
 msgstr ""
 
-#: audioregion.cc:1685
+#: audioregion.cc:1757
 msgid ""
 "You have requested an operation that requires audio analysis.\n"
 "\n"
@@ -212,13 +370,14 @@ msgid ""
 "transient data must be generated every time it is required.\n"
 "\n"
 "If you are doing work that will require transient data on a regular basis, "
-"you should probably enable \"auto-analyse-audio\" then quit %1 and restart.\n"
+"you should probably enable \"auto-analyse-audio\" in Preferences > Audio > "
+"Regions, then quit %1 and restart.\n"
 "\n"
 "This dialog will not display again.  But you may notice a slight delay in "
 "this and future transient-detection operations.\n"
 msgstr ""
 
-#: audioregion.cc:1729
+#: audioregion.cc:1789
 msgid "Audio Region"
 msgstr ""
 
@@ -226,162 +385,190 @@ msgstr ""
 msgid "cannot rename peakfile for %1 from %2 to %3 (%4)"
 msgstr ""
 
-#: audiosource.cc:257
+#: audiosource.cc:262
 msgid "AudioSource: cannot stat peakfile \"%1\""
 msgstr ""
 
-#: audiosource.cc:361
+#: audiosource.cc:368
+msgid "Cannot open peakfile @ %1 for size check (%2)"
+msgstr ""
+
+#: audiosource.cc:389
+msgid "peak file %1 is truncated from %2 to %3"
+msgstr ""
+
+#: audiosource.cc:392
+msgid "Cannot open peakfile @ %1 for size check (%2) after rebuild"
+msgstr ""
+
+#: audiosource.cc:404
 msgid "Cannot open peakfile @ %1 for reading (%2)"
 msgstr ""
 
-#: audiosource.cc:394
+#: audiosource.cc:438
 msgid "cannot read sample data for unscaled peak computation"
 msgstr ""
 
-#: audiosource.cc:430 audiosource.cc:525
+#: audiosource.cc:473 audiosource.cc:568
 msgid "map failed - could not create file mapping for peakfile %1."
 msgstr ""
 
-#: audiosource.cc:436 audiosource.cc:531
+#: audiosource.cc:479 audiosource.cc:574
 msgid "map failed - could not map peakfile %1."
 msgstr ""
 
-#: audiosource.cc:447 audiosource.cc:542
+#: audiosource.cc:490 audiosource.cc:585
 msgid "unmap failed - could not unmap peakfile %1."
 msgstr ""
 
-#: audiosource.cc:453 audiosource.cc:548
+#: audiosource.cc:496 audiosource.cc:591
 msgid "map failed - could not mmap peakfile %1."
 msgstr ""
 
-#: audiosource.cc:638
+#: audiosource.cc:681
 msgid ""
 "AudioSource[%1]: peak read - cannot read %2 samples at offset %3 of %4 (%5)"
 msgstr ""
 
-#: audiosource.cc:705
+#: audiosource.cc:748
 msgid "%1: could not write read raw data for peak computation (%2)"
 msgstr ""
 
-#: audiosource.cc:742
-msgid "AudioSource: cannot open peakpath (c) \"%1\" (%2)"
+#: audiosource.cc:815
+msgid "AudioSource: cannot open _peakpath (c) \"%1\" (%2)"
 msgstr ""
 
-#: audiosource.cc:811 audiosource.cc:933
+#: audiosource.cc:894 audiosource.cc:1016
 msgid "%1: could not seek in peak file data (%2)"
 msgstr ""
 
-#: audiosource.cc:816 audiosource.cc:942
+#: audiosource.cc:899 audiosource.cc:1025
 msgid "%1: could not write peak file data (%2)"
 msgstr ""
 
-#: audiosource.cc:975
+#: audiosource.cc:1058
 msgid "could not truncate peakfile %1 to %2 (error: %3)"
 msgstr ""
 
-#: auditioner.cc:100
+#: auditioner.cc:105
 msgid "Falling back to Reasonable Synth for Midi Audition"
 msgstr ""
 
-#: auditioner.cc:102
+#: auditioner.cc:107
 msgid "No synth for midi-audition found."
 msgstr ""
 
-#: auditioner.cc:158
+#: auditioner.cc:163
 msgid "no outputs available for auditioner - manual connection required"
 msgstr ""
 
-#: auditioner.cc:399 auditioner.cc:446
+#: auditioner.cc:408 auditioner.cc:455
 msgid "Cannot setup auditioner processing flow for %1 channels"
 msgstr ""
 
-#: auditioner.cc:434
+#: auditioner.cc:443
 msgid "Failed to load synth for MIDI-Audition."
 msgstr ""
 
-#: auditioner.cc:453
+#: auditioner.cc:462
 msgid "Auditioning of regions other than Audio or Midi is not supported."
 msgstr ""
 
-#: automatable.cc:84
+#: automatable.cc:87
 msgid "Automation node has no path property"
 msgstr ""
 
-#: automatable.cc:104
+#: automatable.cc:108
 msgid "cannot open %2 to load automation data (%3)"
 msgstr ""
 
-#: automatable.cc:132
+#: automatable.cc:140
 msgid "cannot load automation data from %2"
 msgstr ""
 
-#: automatable.cc:167
+#: automatable.cc:176 send.cc:95 session.cc:851
+msgid "Fader"
+msgstr ""
+
+#: automatable.cc:178
+msgid "Trim"
+msgstr ""
+
+#: automatable.cc:180
 msgid "Mute"
 msgstr ""
 
-#: automation_list.cc:356
+#: automation_control.cc:228
+msgid "record %1 automation"
+msgstr ""
+
+#: automation_list.cc:410
 msgid "automation list: cannot load coordinates from XML, all points ignored"
 msgstr ""
 
-#: automation_list.cc:402
+#: automation_list.cc:456
 msgid ""
 "automation list: no x-coordinate stored for control point (point ignored)"
 msgstr ""
 
-#: automation_list.cc:408
+#: automation_list.cc:462
 msgid ""
 "automation list: no y-coordinate stored for control point (point ignored)"
 msgstr ""
 
-#: automation_list.cc:422
+#: automation_list.cc:476
 msgid ""
 "AutomationList: passed XML node called %1, not \"AutomationList\" - ignored"
 msgstr ""
 
-#: butler.cc:100
+#: butler.cc:126
 msgid "Session: could not create butler thread"
 msgstr ""
 
-#: butler.cc:222 butler.cc:223
+#: butler.cc:254 butler.cc:255
 msgid "Butler read ahead failure on dstream %1"
 msgstr ""
 
-#: butler.cc:270 butler.cc:271
+#: butler.cc:344 butler.cc:345 butler.cc:393 butler.cc:394
 msgid "Butler write-behind failure on dstream %1"
 msgstr ""
 
-#: control_protocol_manager.cc:164
+#: control_protocol_manager.cc:174
 msgid "control protocol name \"%1\" has no descriptor"
 msgstr ""
 
-#: control_protocol_manager.cc:171
+#: control_protocol_manager.cc:181
 msgid "control protocol name \"%1\" could not be initialized"
 msgstr ""
 
-#: control_protocol_manager.cc:237
+#: control_protocol_manager.cc:265
 msgid "Instantiating mandatory control protocol %1"
 msgstr ""
 
-#: control_protocol_manager.cc:281
+#: control_protocol_manager.cc:309
 msgid "looking for control protocols in %1\n"
 msgstr ""
 
-#: control_protocol_manager.cc:306
+#: control_protocol_manager.cc:334
 msgid "Control protocol %1 not usable"
 msgstr ""
 
-#: control_protocol_manager.cc:323
+#: control_protocol_manager.cc:351
 msgid "Control surface protocol discovered: \"%1\"\n"
 msgstr ""
 
-#: control_protocol_manager.cc:341
+#: control_protocol_manager.cc:367
 msgid "ControlProtocolManager: cannot load module \"%1\" (%2)"
 msgstr ""
 
-#: control_protocol_manager.cc:347
+#: control_protocol_manager.cc:373
 msgid "ControlProtocolManager: module \"%1\" has no descriptor function."
 msgstr ""
 
+#: control_protocol_manager.cc:516
+msgid "Control protocol \"%1\" has no descriptor"
+msgstr ""
+
 #: cycle_timer.cc:40
 msgid "CycleTimer::get_mhz(): can't open /proc/cpuinfo"
 msgstr ""
@@ -398,7 +585,7 @@ msgstr "nie można zlokalizować taktowania CPU w /proc/cpuinfo"
 msgid "audio"
 msgstr ""
 
-#: data_type.cc:28 session.cc:1995 session.cc:1998
+#: data_type.cc:28 session.cc:2452
 msgid "MIDI"
 msgstr ""
 
@@ -410,11 +597,11 @@ msgstr ""
 msgid "main outs"
 msgstr ""
 
-#: delivery.cc:121 send.cc:63
+#: delivery.cc:121 send.cc:64
 msgid "listen"
 msgstr ""
 
-#: diskstream.cc:309
+#: diskstream.cc:311
 msgid "Location \"%1\" not valid for track loop (start >= end)"
 msgstr ""
 
@@ -426,23 +613,23 @@ msgstr ""
 msgid "Export failed: %1"
 msgstr ""
 
-#: export_filename.cc:126
+#: export_filename.cc:128
 msgid "Existing export folder for this session (%1) does not exist - ignored"
 msgstr ""
 
-#: export_filename.cc:242
+#: export_filename.cc:263
 msgid "No Time"
 msgstr ""
 
-#: export_filename.cc:251
+#: export_filename.cc:272
 msgid "Invalid time format"
 msgstr ""
 
-#: export_filename.cc:260
+#: export_filename.cc:281
 msgid "No Date"
 msgstr ""
 
-#: export_filename.cc:275
+#: export_filename.cc:296
 msgid "Invalid date format"
 msgstr ""
 
@@ -478,23 +665,27 @@ msgstr ""
 msgid "Lossless compression"
 msgstr ""
 
-#: export_format_manager.cc:218 export_format_specification.cc:591
+#: export_format_manager.cc:218 export_format_specification.cc:657
 msgid "Session rate"
 msgstr ""
 
-#: export_format_specification.cc:549
-msgid "normalize"
+#: export_format_specification.cc:609
+msgid "normalize loudness"
+msgstr ""
+
+#: export_format_specification.cc:611
+msgid "normalize peak"
 msgstr ""
 
-#: export_format_specification.cc:553
+#: export_format_specification.cc:616
 msgid "trim"
 msgstr ""
 
-#: export_format_specification.cc:555
+#: export_format_specification.cc:618
 msgid "trim start"
 msgstr ""
 
-#: export_format_specification.cc:557
+#: export_format_specification.cc:620
 msgid "trim end"
 msgstr ""
 
@@ -510,24 +701,20 @@ msgstr ""
 msgid "Rectangular"
 msgstr ""
 
-#: export_formats.cc:52 session.cc:5421 session.cc:5437
-msgid "None"
-msgstr ""
-
 #: export_formats.cc:159
-msgid "8bit"
+msgid "8-bit"
 msgstr ""
 
 #: export_formats.cc:161
-msgid "16bit"
+msgid "16-bit"
 msgstr ""
 
 #: export_formats.cc:163
-msgid "24bit"
+msgid "24-bit"
 msgstr ""
 
 #: export_formats.cc:165
-msgid "32bit"
+msgid "32-bit"
 msgstr ""
 
 #: export_formats.cc:167
@@ -539,7 +726,7 @@ msgid "double"
 msgstr ""
 
 #: export_formats.cc:171
-msgid "8bit unsigned"
+msgid "8-bit unsigned"
 msgstr ""
 
 #: export_formats.cc:173
@@ -550,94 +737,90 @@ msgstr ""
 msgid "No sample format"
 msgstr ""
 
-#: export_handler.cc:360
+#: export_handler.cc:419
 msgid "File %1 uploaded to %2"
 msgstr ""
 
-#: export_handler.cc:366
+#: export_handler.cc:425
 msgid ""
 "upload to Soundcloud failed. Perhaps your email or password are incorrect?\n"
 msgstr ""
 
-#: export_handler.cc:413
-msgid "Editor: cannot open \"%1\" as export file for CD marker file"
-msgstr ""
-
-#: export_handler.cc:492 export_handler.cc:495
-msgid "an error occured while writing a TOC/CUE file: %1"
+#: export_handler.cc:551 export_handler.cc:554
+msgid "an error occurred while writing a TOC/CUE file: %1"
 msgstr ""
 
-#: export_handler.cc:744 export_handler.cc:802
+#: export_handler.cc:844 export_handler.cc:902
 msgid "Cannot convert %1 to Latin-1 text"
 msgstr ""
 
-#: export_profile_manager.cc:93
+#: export_profile_manager.cc:94
 msgid "Searching for export formats in %1"
 msgstr ""
 
-#: export_profile_manager.cc:99
+#: export_profile_manager.cc:100
 msgid "Unable to create export format directory %1: %2"
 msgstr ""
 
-#: export_profile_manager.cc:262
+#: export_profile_manager.cc:268
 msgid "Unable to remove export preset %1: %2"
 msgstr ""
 
-#: export_profile_manager.cc:351
+#: export_profile_manager.cc:357
 msgid "Selection"
 msgstr ""
 
-#: export_profile_manager.cc:604
+#: export_profile_manager.cc:621
 msgid "Unable to rename export format %1 to %2: %3"
 msgstr ""
 
-#: export_profile_manager.cc:636
+#: export_profile_manager.cc:653
 msgid "Unable to remove export profile %1: %2"
 msgstr ""
 
-#: export_profile_manager.cc:654
+#: export_profile_manager.cc:671
 msgid "empty format"
 msgstr ""
 
-#: export_profile_manager.cc:735
+#: export_profile_manager.cc:752
 msgid "Cannot load export format from %1"
 msgstr ""
 
-#: export_profile_manager.cc:741
+#: export_profile_manager.cc:758
 msgid "Cannot export format read from %1"
 msgstr ""
 
-#: export_profile_manager.cc:835
+#: export_profile_manager.cc:852
 msgid "No timespan has been selected!"
 msgstr ""
 
-#: export_profile_manager.cc:839
+#: export_profile_manager.cc:856
 msgid "No channels have been selected!"
 msgstr ""
 
-#: export_profile_manager.cc:843
+#: export_profile_manager.cc:860
 msgid "Some channels are empty"
 msgstr ""
 
-#: export_profile_manager.cc:876
+#: export_profile_manager.cc:893
 msgid "No format selected!"
 msgstr ""
 
-#: export_profile_manager.cc:878
+#: export_profile_manager.cc:895
 msgid "All channels are empty!"
 msgstr ""
 
-#: export_profile_manager.cc:880
+#: export_profile_manager.cc:897
 msgid "One or more of the selected formats is not compatible with this system!"
 msgstr ""
 
-#: export_profile_manager.cc:883
+#: export_profile_manager.cc:900
 msgid ""
 "%1 supports only %2 channels, but you have %3 channels in your channel "
 "configuration"
 msgstr ""
 
-#: file_source.cc:201 session_state.cc:2857
+#: file_source.cc:201 session_state.cc:3284
 msgid ""
 "there are already 1000 files with names like %1; versioning discontinued"
 msgstr ""
@@ -646,25 +829,25 @@ msgstr ""
 msgid "cannot rename file source from %1 to %2 (%3)"
 msgstr ""
 
-#: file_source.cc:251 file_source.cc:375
+#: file_source.cc:251 file_source.cc:374
 msgid "FileSource: search path not set"
 msgstr ""
 
-#: file_source.cc:435
+#: file_source.cc:434
 msgid ""
 "FileSource: \"%1\" is ambigous when searching\n"
 "\t"
 msgstr ""
 
-#: file_source.cc:442
+#: file_source.cc:441
 msgid "Filesource: cannot find required file (%1)"
 msgstr ""
 
-#: file_source.cc:487
+#: file_source.cc:486
 msgid "Filesource: cannot find required file (%1): %2"
 msgstr ""
 
-#: file_source.cc:495
+#: file_source.cc:494
 msgid "Filesource: cannot check for existing file (%1): %2"
 msgstr ""
 
@@ -678,34 +861,38 @@ msgstr ""
 msgid "cannot rename file %1 to %2 (%3)"
 msgstr ""
 
-#: filesystem_paths.cc:105
+#: filesystem_paths.cc:120
 msgid "Cannot create Configuration directory %1 - cannot run"
 msgstr ""
 
-#: filesystem_paths.cc:110
+#: filesystem_paths.cc:125
 msgid ""
 "Configuration directory %1 already exists and is not a directory/folder - "
 "cannot run"
 msgstr ""
 
-#: filesystem_paths.cc:171
+#: filesystem_paths.cc:186
 msgid "Cannot create cache directory %1 - cannot run"
 msgstr ""
 
-#: filesystem_paths.cc:176
+#: filesystem_paths.cc:191
 msgid ""
 "Cache directory %1 already exists and is not a directory/folder - cannot run"
 msgstr ""
 
-#: filesystem_paths.cc:194
+#: filesystem_paths.cc:209
 msgid "ARDOUR_DLL_PATH not set in environment - exiting\n"
 msgstr ""
 
-#: filesystem_paths.cc:245
+#: filesystem_paths.cc:232
+msgid "Cannot determine %1 package directory"
+msgstr ""
+
+#: filesystem_paths.cc:277
 msgid "ARDOUR_CONFIG_PATH not set in environment\n"
 msgstr ""
 
-#: filesystem_paths.cc:266
+#: filesystem_paths.cc:298
 msgid "ARDOUR_DATA_PATH not set in environment\n"
 msgstr ""
 
@@ -713,50 +900,79 @@ msgstr ""
 msgid "filter: error creating name for new file based on %1"
 msgstr ""
 
-#: filter.cc:79
+#: filter.cc:92
 msgid "filter: error creating new file %1 (%2)"
 msgstr ""
 
-#: find_session.cc:59
+#: find_session.cc:60
 msgid "cannot check session path %1 (%2)"
 msgstr ""
 
-#: find_session.cc:85
+#: find_session.cc:86
 msgid "cannot check statefile %1 (%2)"
 msgstr ""
 
-#: find_session.cc:121
+#: find_session.cc:125
 msgid "%1 is not a snapshot file"
 msgstr ""
 
-#: find_session.cc:138
+#: find_session.cc:142
 msgid "cannot determine current working directory (%1)"
 msgstr ""
 
-#: find_session.cc:155
+#: find_session.cc:159
 msgid "unknown file type for session %1"
 msgstr ""
 
-#: globals.cc:234
+#: gain_control.cc:81
+#, c-format
+msgid "%3.1f dB"
+msgstr ""
+
+#: globals.cc:266
 msgid "Could not set system open files limit to \"unlimited\""
 msgstr ""
 
-#: globals.cc:236
+#: globals.cc:268
 msgid "Could not set system open files limit to %1"
 msgstr ""
 
-#: globals.cc:240
+#: globals.cc:272 globals.cc:289
 msgid "Your system is configured to limit %1 to only %2 open files"
 msgstr ""
 
-#: globals.cc:244
+#: globals.cc:276
 msgid "Could not get system open files limit (%1)"
 msgstr ""
 
-#: globals.cc:415
+#: globals.cc:291
+msgid "Could not set system open files limit. Current limit is %1 open files"
+msgstr ""
+
+#: globals.cc:474
 msgid "Loading configuration"
 msgstr ""
 
+#: globals.cc:554 route.cc:182 route.cc:4149 session.cc:1157
+msgid "Monitor"
+msgstr ""
+
+#: globals.cc:555 session_state.cc:642
+msgid "Master"
+msgstr ""
+
+#: globals.cc:556
+msgid "Control"
+msgstr ""
+
+#: globals.cc:557
+msgid "Click"
+msgstr ""
+
+#: globals.cc:558
+msgid "Mackie"
+msgstr ""
+
 #: import.cc:146
 msgid "Cannot find new filename for imported file %1"
 msgstr ""
@@ -782,7 +998,7 @@ msgid "Track %1 of %2 contained no usable MIDI data"
 msgstr ""
 
 #: import.cc:427
-msgid "MIDI file %1 was not readable (no reason available)"
+msgid "MIDI file could not be written (best guess: %1)"
 msgstr ""
 
 #: import.cc:475
@@ -809,110 +1025,113 @@ msgstr ""
 msgid "Unknown"
 msgstr ""
 
-#: instrument_info.cc:231
+#: instrument_info.cc:243
 msgid "preset %1 (bank %2)"
 msgstr ""
 
-#: internal_send.cc:316 internal_send.cc:317
+#: internal_send.cc:338 internal_send.cc:339
 msgid "%1 - cannot find any track/bus with the ID %2 to connect to"
 msgstr ""
 
-#: io.cc:209
+#: io.cc:212
 msgid "IO: cannot disconnect port %1 from %2"
 msgstr ""
 
-#: io.cc:344 io.cc:431
+#: io.cc:347 io.cc:435
 msgid "IO: cannot register input port %1"
 msgstr ""
 
-#: io.cc:349 io.cc:436
+#: io.cc:352 io.cc:440
 msgid "IO: cannot register output port %1"
 msgstr ""
 
-#: io.cc:598 io.cc:654
+#: io.cc:607 io.cc:668
 msgid "incorrect XML node \"%1\" passed to IO object"
 msgstr ""
 
-#: io.cc:713
+#: io.cc:730
 msgid "in"
 msgstr "wejście"
 
-#: io.cc:713
+#: io.cc:730
 msgid "out"
 msgstr "wyjście"
 
-#: io.cc:714
+#: io.cc:731
 msgid "input"
 msgstr ""
 
-#: io.cc:714
+#: io.cc:731
 msgid "output"
 msgstr ""
 
-#: io.cc:724
+#: io.cc:741
 msgid "Unknown bundle \"%1\" listed for %2 of %3"
 msgstr ""
 
-#: io.cc:790
+#: io.cc:807
 msgid "Bundle %1 was not available - \"%2\" used instead"
 msgstr ""
 
-#: io.cc:793
+#: io.cc:810
 msgid "No %1 bundles available as a replacement"
 msgstr ""
 
-#: io.cc:897
+#: io.cc:914
 msgid "%1: cannot create I/O ports"
 msgstr ""
 
-#: io.cc:1025 io.cc:1126
+#: io.cc:1042 io.cc:1143
 msgid "IO: badly formed string in XML node for inputs \"%1\""
 msgstr ""
 
-#: io.cc:1030 io.cc:1131
+#: io.cc:1047 io.cc:1148
 msgid "bad input string in XML node \"%1\""
 msgstr ""
 
-#: io.cc:1069
+#: io.cc:1086
 msgid "IO: badly formed string in XML node for outputs \"%1\""
 msgstr ""
 
-#: io.cc:1074
+#: io.cc:1091
 msgid "IO: bad output string in XML node \"%1\""
 msgstr ""
 
-#: io.cc:1413
+#: io.cc:1256 plugin.cc:275
+msgid "Out"
+msgstr ""
+
+#: io.cc:1256 plugin.cc:273
+msgid "In"
+msgstr ""
+
+#: io.cc:1454
 #, c-format
 msgid "%s %u"
 msgstr "%s %u"
 
-#: io.cc:1460
+#: io.cc:1501
 #, c-format
 msgid "%s in"
 msgstr ""
 
-#: io.cc:1462
+#: io.cc:1503
 #, c-format
 msgid "%s out"
 msgstr ""
 
-#: io.cc:1537 session.cc:733 session.cc:767
+#: io.cc:1578 session.cc:957 session.cc:991
 msgid "mono"
 msgstr ""
 
-#: io.cc:1539 session.cc:746 session.cc:781
+#: io.cc:1580 session.cc:970 session.cc:1005
 msgid "L"
 msgstr ""
 
-#: io.cc:1539 session.cc:748 session.cc:783
+#: io.cc:1580 session.cc:972 session.cc:1007
 msgid "R"
 msgstr ""
 
-#: io.cc:1541 io.cc:1547
-#, c-format
-msgid "%d"
-msgstr ""
-
 #: ladspa_plugin.cc:93
 msgid "LADSPA: Unable to open module: "
 msgstr ""
@@ -929,81 +1148,81 @@ msgstr ""
 msgid "LADSPA: \"%1\" cannot be used, since it cannot do inplace processing"
 msgstr ""
 
-#: ladspa_plugin.cc:311
+#: ladspa_plugin.cc:308
 msgid ""
 "illegal parameter number used with plugin \"%1\". This may indicate a change "
 "in the plugin design, and presets may be invalid"
 msgstr ""
 
-#: ladspa_plugin.cc:390 ladspa_plugin.cc:440
+#: ladspa_plugin.cc:387 ladspa_plugin.cc:437
 msgid "Bad node sent to LadspaPlugin::set_state"
 msgstr ""
 
-#: ladspa_plugin.cc:405 ladspa_plugin.cc:454
+#: ladspa_plugin.cc:402 ladspa_plugin.cc:451
 msgid "LADSPA: no ladspa port number"
 msgstr ""
 
-#: ladspa_plugin.cc:411 ladspa_plugin.cc:460
+#: ladspa_plugin.cc:408 ladspa_plugin.cc:457
 msgid "LADSPA: no ladspa port data"
 msgstr ""
 
-#: ladspa_plugin.cc:842
+#: ladspa_plugin.cc:863
 msgid "Could not locate HOME.  Preset not removed."
 msgstr ""
 
-#: ladspa_plugin.cc:881 ladspa_plugin.cc:887
+#: ladspa_plugin.cc:902 ladspa_plugin.cc:908
 msgid "Could not create %1.  Preset not saved. (%2)"
 msgstr ""
 
-#: ladspa_plugin.cc:894
+#: ladspa_plugin.cc:915
 msgid "Error saving presets file %1."
 msgstr ""
 
-#: ladspa_plugin.cc:936
+#: ladspa_plugin.cc:957
 msgid "Could not locate HOME.  Preset not saved."
 msgstr ""
 
-#: location.cc:456
+#: location.cc:455
 msgid "You cannot put a CD marker at this position"
 msgstr ""
 
-#: location.cc:608
+#: location.cc:607
 msgid "incorrect XML node passed to Location::set_state"
 msgstr ""
 
-#: location.cc:613
+#: location.cc:612
 msgid "XML node for Location has no ID information"
 msgstr ""
 
-#: location.cc:617
+#: location.cc:616
 msgid "XML node for Location has no name information"
 msgstr ""
 
-#: location.cc:624
+#: location.cc:623
 msgid "XML node for Location has no start information"
 msgstr ""
 
-#: location.cc:635
+#: location.cc:634
 msgid "XML node for Location has no end information"
 msgstr ""
 
-#: location.cc:642
+#: location.cc:641
 msgid "XML node for Location has no flags information"
 msgstr ""
 
-#: location.cc:856
+#: location.cc:868
 msgid "Locations: attempt to use unknown location as selected location"
 msgstr ""
 
-#: location.cc:1034
+#: location.cc:1046
 msgid "incorrect XML mode passed to Locations::set_state"
 msgstr ""
 
-#: location.cc:1047 session.cc:1293 session.cc:4919 session_state.cc:1053
+#: location.cc:1059 session.cc:1667 session.cc:6305 session_state.cc:1205
 msgid "session"
 msgstr ""
 
-#: location.cc:1112
+#: location.cc:1126
 msgid "could not load location from session file - ignored"
 msgstr ""
 
@@ -1045,48 +1264,104 @@ msgid ""
 "You may rename the imported location:"
 msgstr ""
 
-#: ltc_slave.cc:272
+#: ltc_file_reader.cc:96
+msgid "LTCFileReader: cannot open file \"%1\""
+msgstr ""
+
+#: ltc_file_reader.cc:105
+msgid "LTCFileReader: cannot open file \"%1\" (%3)"
+msgstr ""
+
+#: ltc_file_reader.cc:109
+msgid "LTCFileReader: \"%1\" is an empty audio file"
+msgstr ""
+
+#: ltc_file_reader.cc:134
+msgid "LTCFileReader:: invalid audio channel selected"
+msgstr ""
+
+#: ltc_slave.cc:275
 msgid "Session framerate adjusted from %1 to LTC's %2."
 msgstr ""
 
-#: ltc_slave.cc:286
+#: ltc_slave.cc:289
 msgid "Session and LTC framerate mismatch: LTC:%1 Session:%2."
 msgstr ""
 
-#: ltc_slave.cc:603
+#: ltc_slave.cc:609
 msgid "flywheel"
 msgstr ""
 
-#: midi_diskstream.cc:173
+#: lua_api.cc:87
+msgid "Script with given name was not found\n"
+msgstr ""
+
+#: lua_api.cc:96
+msgid "Failed to instantiate Lua Processor\n"
+msgstr ""
+
+#: luaproc.cc:876
+msgid "Failed to load Lua script from session state."
+msgstr ""
+
+#: luaproc.cc:886
+msgid "Session State for LuaProcessor did not include a Lua script."
+msgstr ""
+
+#: luaproc.cc:890
+msgid "Invalid/incompatible Lua script found for LuaProcessor."
+msgstr ""
+
+#: luaproc.cc:918
+msgid "Bad node sent to LuaProc::set_state"
+msgstr ""
+
+#: luaproc.cc:928
+msgid "LuaProc: port has no symbol, ignored"
+msgstr ""
+
+#: luaproc.cc:934
+msgid "LuaProc: port has no value, ignored"
+msgstr ""
+
+#: luaproc.cc:1164
+msgid "Unable to create LuaProc presets directory"
+msgstr ""
+
+#: luascripting.cc:132
+msgid "Script '%1' has no valid descriptor."
+msgstr ""
+
+#: midi_diskstream.cc:172
 msgid ""
 "%1: I/O configuration change %4 requested to use %2, but channel setup is %3"
 msgstr ""
 
-#: midi_diskstream.cc:225
+#: midi_diskstream.cc:224
 msgid "MidiDiskstream: Playlist \"%1\" isn't a midi playlist"
 msgstr ""
 
-#: midi_diskstream.cc:276
+#: midi_diskstream.cc:275
 msgid "MidiDiskstream %1: there is no existing playlist to make a copy of!"
 msgstr ""
 
-#: midi_diskstream.cc:754
+#: midi_diskstream.cc:753
 msgid "MidiDiskstream %1: cannot read %2 from playlist at frame %3"
 msgstr ""
 
-#: midi_diskstream.cc:891
+#: midi_diskstream.cc:890
 msgid "MidiDiskstream %1: cannot write to disk"
 msgstr ""
 
-#: midi_diskstream.cc:925
+#: midi_diskstream.cc:924
 msgid "MidiDiskstream \"%1\": cannot flush captured data to disk!"
 msgstr ""
 
-#: midi_diskstream.cc:1014
+#: midi_diskstream.cc:1013
 msgid "%1: could not create region for complete midi file"
 msgstr ""
 
-#: midi_diskstream.cc:1055
+#: midi_diskstream.cc:1054
 msgid "MidiDiskstream: could not create region for captured midi!"
 msgstr ""
 
@@ -1106,31 +1381,47 @@ msgstr ""
 msgid "No SysExID found for sys-ex property change - ignored"
 msgstr ""
 
-#: midi_model.cc:1994
-msgid "transpose"
+#: midi_patch_manager.cc:78
+msgid "Loading %1 MIDI patch from %2"
+msgid_plural "Loading %1 MIDI patches from %2"
+msgstr[0] ""
+msgstr[1] ""
+
+#: midi_patch_manager.cc:109
+msgid "Unloading %1 MIDI patch from %2"
+msgid_plural "Unloading %1 MIDI patches from %2"
+msgstr[0] ""
+msgstr[1] ""
+
+#: midi_patch_manager.cc:126
+msgid "Error parsing MIDI patch file %1"
 msgstr ""
 
-#: midi_patch_manager.cc:133
+#: midi_patch_manager.cc:135
 msgid "Duplicate MIDI device `%1' in `%2' ignored"
 msgstr ""
 
-#: midi_scene_changer.cc:295
+#: midi_patch_manager.cc:170
+msgid "Removing MIDI patch file %1"
+msgstr ""
+
+#: midi_scene_changer.cc:312
 msgid "Scene "
 msgstr ""
 
-#: midi_source.cc:125
+#: midi_source.cc:126
 msgid "Missing parameter property on InterpolationStyle"
 msgstr ""
 
-#: midi_source.cc:131
+#: midi_source.cc:132
 msgid "Missing style property on InterpolationStyle"
 msgstr ""
 
-#: midi_source.cc:140
+#: midi_source.cc:141
 msgid "Missing parameter property on AutomationState"
 msgstr ""
 
-#: midi_source.cc:146
+#: midi_source.cc:147
 msgid "Missing state property on AutomationState"
 msgstr ""
 
@@ -1138,57 +1429,57 @@ msgstr ""
 msgid "MIDI stretch created non-MIDI source"
 msgstr ""
 
-#: monitor_processor.cc:53
+#: monitor_processor.cc:54
 msgid "monitor dim"
 msgstr ""
 
-#: monitor_processor.cc:54
+#: monitor_processor.cc:55
 msgid "monitor cut"
 msgstr ""
 
-#: monitor_processor.cc:55
+#: monitor_processor.cc:56
 msgid "monitor mono"
 msgstr ""
 
-#: monitor_processor.cc:58
+#: monitor_processor.cc:59
 msgid "monitor dim level"
 msgstr ""
 
-#: monitor_processor.cc:62
+#: monitor_processor.cc:63
 msgid "monitor solo boost level"
 msgstr ""
 
-#: monitor_processor.cc:512
+#: monitor_processor.cc:543
 msgid "cut control %1"
 msgstr ""
 
-#: monitor_processor.cc:513
+#: monitor_processor.cc:544
 msgid "dim control"
 msgstr ""
 
-#: monitor_processor.cc:514
+#: monitor_processor.cc:545
 msgid "polarity control"
 msgstr ""
 
-#: monitor_processor.cc:515
+#: monitor_processor.cc:546
 msgid "solo control"
 msgstr ""
 
-#: mtc_slave.cc:240
+#: mtc_slave.cc:241
 msgid "MTC Slave: atomic read of current time failed, sleeping!"
 msgstr ""
 
-#: mtc_slave.cc:362
+#: mtc_slave.cc:363
 msgid ""
 "Unknown rate/drop value %1 in incoming MTC stream, session values used "
 "instead"
 msgstr ""
 
-#: mtc_slave.cc:382
+#: mtc_slave.cc:383
 msgid "Session framerate adjusted from %1 TO: MTC's %2."
 msgstr ""
 
-#: mtc_slave.cc:396
+#: mtc_slave.cc:397
 msgid "Session and MTC framerate mismatch: MTC:%1 %2:%3."
 msgstr ""
 
@@ -1244,7 +1535,7 @@ msgstr ""
 msgid "fixed time region copy"
 msgstr ""
 
-#: pannable.cc:207
+#: pannable.cc:208
 msgid "Pannable given XML data for %1 - ignored"
 msgstr ""
 
@@ -1278,19 +1569,67 @@ msgstr ""
 msgid "select panner: %1\n"
 msgstr ""
 
-#: panner_shell.cc:255
+#: panner_shell.cc:257
 msgid "Unknown panner plugin \"%1\" found in pan state - ignored"
 msgstr ""
 
-#: panner_shell.cc:261
+#: panner_shell.cc:263
 msgid "panner plugin node has no type information!"
 msgstr ""
 
-#: playlist.cc:2138
+#: parameter_descriptor.cc:201
+msgid "Note|C"
+msgstr ""
+
+#: parameter_descriptor.cc:202
+msgid "Note|C#"
+msgstr ""
+
+#: parameter_descriptor.cc:203
+msgid "Note|D"
+msgstr ""
+
+#: parameter_descriptor.cc:204
+msgid "Note|D#"
+msgstr ""
+
+#: parameter_descriptor.cc:205
+msgid "Note|E"
+msgstr ""
+
+#: parameter_descriptor.cc:206
+msgid "Note|F"
+msgstr ""
+
+#: parameter_descriptor.cc:207
+msgid "Note|F#"
+msgstr ""
+
+#: parameter_descriptor.cc:208
+msgid "Note|G"
+msgstr ""
+
+#: parameter_descriptor.cc:209
+msgid "Note|G#"
+msgstr ""
+
+#: parameter_descriptor.cc:210
+msgid "Note|A"
+msgstr ""
+
+#: parameter_descriptor.cc:211
+msgid "Note|A#"
+msgstr ""
+
+#: parameter_descriptor.cc:212
+msgid "Note|B"
+msgstr ""
+
+#: playlist.cc:2234
 msgid "region state node has no ID, ignored"
 msgstr ""
 
-#: playlist.cc:2156
+#: playlist.cc:2252
 msgid "Playlist: cannot create region from XML"
 msgstr ""
 
@@ -1302,125 +1641,245 @@ msgstr ""
 msgid "Could not construct playlist for PlaylistSource from session data!"
 msgstr ""
 
-#: plugin.cc:328
+#: plugin.cc:126
+msgid "Cannot remove plugin factory preset."
+msgstr ""
+
+#: plugin.cc:144
+msgid "Preset with given name already exists."
+msgstr ""
+
+#: plugin.cc:263
+msgid "Audio"
+msgstr ""
+
+#: plugin.cc:266
+msgid "Midi"
+msgstr ""
+
+#: plugin.cc:269
+msgid "?"
+msgstr ""
+
+#: plugin.cc:412
 msgid ""
 "Plugin presets are not supported in this build of %1. Consider paying for a "
 "full version"
 msgstr ""
 
-#: plugin.cc:403
+#: plugin.cc:495
 msgid ""
 "Saving plugin settings is not supported in this build of %1. Consider paying "
 "for the full version"
 msgstr ""
 
-#: plugin_insert.cc:596
+#: plugin_insert.cc:1148
 msgid "programming error: "
 msgstr ""
 
-#: plugin_insert.cc:933
+#: plugin_insert.cc:1700
+msgid "SC %1"
+msgstr ""
+
+#: plugin_insert.cc:2352
 msgid "XML node describing plugin is missing the `type' field"
 msgstr ""
 
-#: plugin_insert.cc:948
+#: plugin_insert.cc:2369
 msgid "unknown plugin type %1 in plugin insert state"
 msgstr ""
 
-#: plugin_insert.cc:976
+#: plugin_insert.cc:2397
 msgid "Plugin has no unique ID field"
 msgstr ""
 
-#: plugin_insert.cc:1001
+#: plugin_insert.cc:2435
 msgid ""
 "Found a reference to a plugin (\"%1\") that is unknown.\n"
 "Perhaps it was removed or moved since it was last used."
 msgstr ""
 
-#: plugin_insert.cc:1115
+#: plugin_insert.cc:2645
 msgid "PluginInsert: Auto: no ladspa port number"
 msgstr ""
 
-#: plugin_insert.cc:1122
+#: plugin_insert.cc:2652
 msgid "PluginInsert: Auto: port id out of range"
 msgstr ""
 
-#: plugin_insert.cc:1158
+#: plugin_insert.cc:2688
 msgid "PluginInsert: automatable control %1 not found - ignored"
 msgstr ""
 
-#: plugin_manager.cc:209
+#: plugin_manager.cc:220
 msgid "Discovering Plugins"
 msgstr ""
 
-#: plugin_manager.cc:231
+#: plugin_manager.cc:251
 msgid "Scanning LADSPA Plugins"
 msgstr ""
 
-#: plugin_manager.cc:234
+#: plugin_manager.cc:253
+msgid "Scanning Lua DSP Processors"
+msgstr ""
+
+#: plugin_manager.cc:256
 msgid "Scanning LV2 Plugins"
 msgstr ""
 
-#: plugin_manager.cc:239
+#: plugin_manager.cc:262
 msgid "Scanning Windows VST Plugins"
 msgstr ""
 
-#: plugin_manager.cc:246
+#: plugin_manager.cc:264
+msgid "Discovering Windows VST Plugins"
+msgstr ""
+
+#: plugin_manager.cc:273
 msgid "Scanning Linux VST Plugins"
 msgstr ""
 
-#: plugin_manager.cc:252
+#: plugin_manager.cc:275
+msgid "Discovering Linux VST Plugins"
+msgstr ""
+
+#: plugin_manager.cc:288
+msgid "VST Blacklist: "
+msgstr ""
+
+#: plugin_manager.cc:290
+msgid "VST Blacklist:"
+msgstr ""
+
+#: plugin_manager.cc:300
 msgid "Scanning AU Plugins"
 msgstr ""
 
-#: plugin_manager.cc:256
+#: plugin_manager.cc:302
+msgid "Discovering AU Plugins"
+msgstr ""
+
+#: plugin_manager.cc:307
 msgid "Plugin Scan Complete..."
 msgstr ""
 
-#: plugin_manager.cc:393
+#: plugin_manager.cc:513
 msgid "LADSPA"
 msgstr ""
 
-#: plugin_manager.cc:445
+#: plugin_manager.cc:565
 msgid "Could not parse rdf file: %1"
 msgstr ""
 
-#: plugin_manager.cc:482
+#: plugin_manager.cc:602
 msgid "LADSPA: cannot load module \"%1\" (%2)"
 msgstr ""
 
-#: plugin_manager.cc:489
+#: plugin_manager.cc:609
 msgid "LADSPA: module \"%1\" has no descriptor function."
 msgstr ""
 
-#: plugin_manager.cc:705
+#: plugin_manager.cc:813
+msgid "--- Windows VST plugins Scan: %1"
+msgstr ""
+
+#: plugin_manager.cc:819
 msgid "VST"
 msgstr ""
 
-#: plugin_manager.cc:732
+#: plugin_manager.cc:824
+msgid "--- Windows VST plugins Scan Done"
+msgstr ""
+
+#: plugin_manager.cc:839
+msgid "cannot open dll"
+msgstr ""
+
+#: plugin_manager.cc:843
+msgid "invalid dll, file too small"
+msgstr ""
+
+#: plugin_manager.cc:847
+msgid "not a dll"
+msgstr ""
+
+#: plugin_manager.cc:853
+msgid "cannot determine dll type"
+msgstr ""
+
+#: plugin_manager.cc:857
+msgid "cannot read dll PE header"
+msgstr ""
+
+#: plugin_manager.cc:862
+msgid "invalid dll PE header"
+msgstr ""
+
+#: plugin_manager.cc:869
+msgid "i386 (32-bit)"
+msgstr ""
+
+#: plugin_manager.cc:872
+msgid "Itanium"
+msgstr ""
+
+#: plugin_manager.cc:875
+msgid "x64 (64-bit)"
+msgstr ""
+
+#: plugin_manager.cc:878
+msgid "Native Architecture"
+msgstr ""
+
+#: plugin_manager.cc:881
+msgid "Unknown Architecture"
+msgstr ""
+
+#: plugin_manager.cc:897
+msgid " *  %1 (cache only)"
+msgstr ""
+
+#: plugin_manager.cc:899
+msgid " *  %1 - %2"
+msgstr ""
+
+#: plugin_manager.cc:913
+msgid " -> Cannot get Windows VST information, plugin ignored."
+msgstr ""
+
+#: plugin_manager.cc:924
 msgid ""
-"VST plugin %1 does not support processReplacing, and so cannot be used in %2 "
-"at this time"
+"VST plugin %1 does not support processReplacing, and cannot be used in %2 at "
+"this time"
 msgstr ""
 
-#: plugin_manager.cc:824
+#: plugin_manager.cc:959
+msgid "Ignoring duplicate Windows VST plugin \"%1\""
+msgstr ""
+
+#: plugin_manager.cc:971
+msgid " -> OK (VST Plugin \"%1\" was added)."
+msgstr ""
+
+#: plugin_manager.cc:1019
 msgid "LXVST"
 msgstr ""
 
-#: plugin_manager.cc:851
+#: plugin_manager.cc:1046
 msgid ""
 "linuxVST plugin %1 does not support processReplacing, and so cannot be used "
 "in %2 at this time"
 msgstr ""
 
-#: plugin_manager.cc:1020
+#: plugin_manager.cc:1213
 msgid "unknown plugin status type \"%1\" - all entries ignored"
 msgstr ""
 
-#: plugin_manager.cc:1037
+#: plugin_manager.cc:1232
 msgid "unknown plugin type \"%1\" - ignored"
 msgstr ""
 
-#: port.cc:450
+#: port.cc:504
 msgid "could not reregister %1"
 msgstr "nie można było zarejestrować %1"
 
@@ -1428,150 +1887,215 @@ msgstr "nie można było zarejestrować %1"
 msgid "insert %1"
 msgstr ""
 
-#: port_insert.cc:197
+#: port_insert.cc:204
 msgid "XML node describing port insert is missing the `type' field"
 msgstr ""
 
-#: port_insert.cc:202
+#: port_insert.cc:209
 msgid "non-port insert XML used for port plugin insert"
 msgstr ""
 
-#: port_manager.cc:287
+#: port_manager.cc:288
 msgid ""
 "a port with the name \"%1\" already exists: check for duplicated track/bus "
 "names"
 msgstr ""
 
-#: port_manager.cc:289
+#: port_manager.cc:290
 msgid ""
 "No more ports are available. You will need to stop %1 and restart with more "
 "ports if you need this many tracks."
 msgstr ""
 
-#: port_manager.cc:292
+#: port_manager.cc:293
 msgid "AudioEngine: cannot register port \"%1\": %2"
 msgstr ""
 
-#: port_manager.cc:331
+#: port_manager.cc:332
 msgid "unable to create port: %1"
 msgstr ""
 
-#: port_manager.cc:418
+#: port_manager.cc:453
 msgid "AudioEngine: cannot connect %1 (%2) to %3 (%4)"
 msgstr ""
 
-#: port_manager.cc:470 port_manager.cc:471
+#: port_manager.cc:505 port_manager.cc:506
 msgid "Re-establising port %1 failed"
 msgstr ""
 
-#: processor.cc:214
+#: processor.cc:218
 msgid "No %1 property flag in element %2"
 msgstr ""
 
-#: processor.cc:223
+#: processor.cc:227
 msgid "No child node with active property"
 msgstr ""
 
-#: rc_configuration.cc:91
+#: rc_configuration.cc:92
 msgid "Loading system configuration file %1"
 msgstr ""
 
-#: rc_configuration.cc:95
+#: rc_configuration.cc:96
 msgid "%1: cannot read system configuration file \"%2\""
 msgstr ""
 
-#: rc_configuration.cc:100
+#: rc_configuration.cc:101
 msgid "%1: system configuration file \"%2\" not loaded successfully."
 msgstr ""
 
-#: rc_configuration.cc:104
+#: rc_configuration.cc:105
 msgid ""
 "Your system %1 configuration file is empty. This probably means that there "
 "was an error installing %1"
 msgstr ""
 
-#: rc_configuration.cc:119
+#: rc_configuration.cc:120
 msgid "Loading user configuration file %1"
 msgstr ""
 
-#: rc_configuration.cc:123
+#: rc_configuration.cc:124
 msgid "%1: cannot read configuration file \"%2\""
 msgstr ""
 
-#: rc_configuration.cc:128
+#: rc_configuration.cc:129
 msgid "%1: user configuration file \"%2\" not loaded successfully."
 msgstr ""
 
-#: rc_configuration.cc:132
+#: rc_configuration.cc:133
 msgid "your %1 configuration file is empty. This is not normal."
 msgstr ""
 
-#: rc_configuration.cc:149
+#: rc_configuration.cc:150
 msgid "Config file %1 not saved"
 msgstr "Plik konfiguracji %1 nie zapisany"
 
-#: recent_sessions.cc:54
+#: recent_sessions.cc:55
 msgid "cannot open recent session file %1 (%2)"
 msgstr ""
 
-#: region_factory.cc:78 region_factory.cc:120 region_factory.cc:161
-#: region_factory.cc:203
+#: recent_sessions.cc:68 recent_sessions.cc:126
+msgid "Error reading recent session file %1 (%2)"
+msgstr ""
+
+#: recent_sessions.cc:113
+msgid "Cannot open recent template file %1 (%2)"
+msgstr ""
+
+#: recent_sessions.cc:176
+msgid "Error writing recent sessions file %1 (%2)"
+msgstr ""
+
+#: recent_sessions.cc:211
+msgid "Error writing saved template file %1 (%2)"
+msgstr ""
+
+#: region_factory.cc:78 region_factory.cc:121 region_factory.cc:162
+#: region_factory.cc:204
 msgid ""
 "programming error: RegionFactory::create() called with unknown Region type"
 msgstr ""
 
-#: region_factory.cc:565
+#: region_factory.cc:566
 msgid "%1 compound-%2 (%3)"
 msgstr ""
 
-#: region_factory.cc:567
+#: region_factory.cc:568
 msgid "%1 compound-%2.1 (%3)"
 msgstr ""
 
-#: region_factory.cc:629
+#: region_factory.cc:630
 msgid "cannot create new name for region \"%1\""
 msgstr ""
 
-#: resampled_source.cc:102
+#: resampled_source.cc:107
 msgid "Import: %1"
 msgstr ""
 
-#: resampled_source.cc:132 srcfilesource.cc:75
+#: resampled_source.cc:136 srcfilesource.cc:75
 msgid "Import: src_new() failed : %1"
 msgstr ""
 
-#: return.cc:41
+#: return.cc:42
 msgid "return %1"
 msgstr ""
 
-#: route.cc:1218 route.cc:2701
+#: route.cc:862 route.cc:2797
 msgid "unknown Processor type \"%1\"; ignored"
 msgstr ""
 
-#: route.cc:1240
+#: route.cc:884
 msgid "processor could not be created. Ignored."
 msgstr ""
 
-#: route.cc:2126 route.cc:2355
+#: route.cc:2338 route.cc:2504
 msgid "Bad node sent to Route::set_state() [%1]"
 msgstr ""
 
-#: route.cc:2186
+#: route.cc:2395
 msgid "Pannable state found for route (%1) without a panner!"
 msgstr ""
 
-#: route.cc:2260 route.cc:2264 route.cc:2469 route.cc:2473
-msgid "badly formed order key string in state file! [%1] ... ignored."
+#: route.cc:3270
+msgid "Invalid Solo-Isolate propagation: from:%1 new:%2 - old:%3 = delta:%4"
+msgstr ""
+
+#: route.cc:4396
+msgid "Amp/Fader on Route '%1' went AWOL. Re-added."
+msgstr ""
+
+#: route.cc:4994
+msgid "lo"
 msgstr ""
 
-#: route.cc:2479
-msgid "Converting deprecated order key for %1 using Editor order %2"
+#: route.cc:4996
+msgid "mid"
 msgstr ""
 
-#: route_group.cc:459
+#: route.cc:4998
+msgid "hi"
+msgstr ""
+
+#: route.cc:5105
+msgid "Leveler"
+msgstr ""
+
+#: route.cc:5107
+msgid "Compressor"
+msgstr ""
+
+#: route.cc:5109 route.cc:5111
+msgid "Limiter"
+msgstr ""
+
+#: route.cc:5111
+msgid "Sidechain"
+msgstr ""
+
+#: route.cc:5114 route.cc:5116 route.cc:5133 route.cc:5135
+msgid "???"
+msgstr ""
+
+#: route.cc:5126
+msgid "Attk"
+msgstr ""
+
+#: route.cc:5128
+msgid "Ratio"
+msgstr ""
+
+#: route.cc:5131
+msgid "Rels"
+msgstr ""
+
+#: route_group.cc:507
 msgid "You cannot subgroup MIDI tracks at this time"
 msgstr ""
 
+#: route_group.cc:514
+msgid ""
+"You cannot subgroup tracks with different number of outputs at this time."
+msgstr ""
+
 #: rb_effect.cc:229 rb_effect.cc:269
 msgid "tempoize: error reading data from %1 at %2 (wanted %3, got %4)"
 msgstr ""
@@ -1580,205 +2104,245 @@ msgstr ""
 msgid "error writing tempo-adjusted data to %1"
 msgstr ""
 
-#: send.cc:61
+#: send.cc:62
 msgid "aux %1"
 msgstr ""
 
-#: send.cc:65
+#: send.cc:66
 msgid "send %1"
 msgstr ""
 
-#: send.cc:67
+#: send.cc:68
 msgid "programming error: send created using role %1"
 msgstr ""
 
-#: session.cc:357
+#: session.cc:348 session.cc:403
+msgid "Cannot connect to audio/midi engine"
+msgstr ""
+
+#: session.cc:358
+msgid "Session initialization failed"
+msgstr ""
+
+#: session.cc:374
+msgid "Failed to load template/snapshot state"
+msgstr ""
+
+#: session.cc:385
+msgid "Failed to load state"
+msgstr ""
+
+#: session.cc:409
+msgid "Cannot configure audio/midi engine with session parameters"
+msgstr ""
+
+#: session.cc:433
 msgid "Connect to engine"
 msgstr ""
 
-#: session.cc:362
+#: session.cc:484
 msgid "Session loading complete"
 msgstr ""
 
-#: session.cc:434
+#: session.cc:575
 msgid "Set up LTC"
 msgstr ""
 
-#: session.cc:436
+#: session.cc:577
 msgid "Set up Click"
 msgstr ""
 
-#: session.cc:438
+#: session.cc:579
 msgid "Set up standard connections"
 msgstr ""
 
-#: session.cc:664
+#: session.cc:888
 msgid "could not setup Click I/O"
 msgstr "nie można było ustawić I/O metronomu"
 
-#: session.cc:727
+#: session.cc:951
 #, c-format
 msgid "out %s"
 msgstr ""
 
-#: session.cc:729
+#: session.cc:953
 #, c-format
 msgid "out %<PRIu32>"
 msgstr "wyjście %<PRIu32>"
 
-#: session.cc:744
+#: session.cc:968
 #, c-format
 msgid "out %<PRIu32>+%<PRIu32>"
 msgstr "wyjście %<PRIu32>+%<PRIu32>"
 
-#: session.cc:761
+#: session.cc:985
 #, c-format
 msgid "in %s"
 msgstr ""
 
-#: session.cc:763
+#: session.cc:987
 #, c-format
 msgid "in %<PRIu32>"
 msgstr "wejście %<PRIu32>"
 
-#: session.cc:778
+#: session.cc:1002
 #, c-format
 msgid "in %<PRIu32>+%<PRIu32>"
 msgstr "wejście %<PRIu32>+%<PRIu32>"
 
-#: session.cc:852
+#: session.cc:1082
 msgid "cannot connect master output %1 to %2"
 msgstr ""
 
-#: session.cc:921
-msgid "Monitor"
+#: session.cc:1170
+msgid "Cannot create monitor section. 'Monitor' Port name is not unique."
 msgstr ""
 
-#: session.cc:966
+#: session.cc:1204 session.cc:1335
 msgid "cannot connect control input %1 to %2"
 msgstr ""
 
-#: session.cc:986
+#: session.cc:1224 session.cc:1354
 msgid "The preferred I/O for the monitor bus (%1) cannot be found"
 msgstr ""
 
-#: session.cc:1017
+#: session.cc:1255 session.cc:1385
 msgid "cannot connect control output %1 to %2"
 msgstr ""
 
-#: session.cc:1085
+#: session.cc:1443
 msgid "cannot create Auditioner: no auditioning of regions possible"
 msgstr ""
 
-#: session.cc:1270
+#: session.cc:1644
 msgid "Session: you can't use that location for auto punch (start <= end)"
 msgstr ""
 
-#: session.cc:1297
+#: session.cc:1671
 msgid "Session: you can't use that location for session start/end)"
 msgstr ""
 
-#: session.cc:1329
+#: session.cc:1703
 msgid ""
 "You cannot use this location for auto-loop because it has zero or negative "
 "length"
 msgstr ""
 
-#: session.cc:1497
+#: session.cc:1886
 msgid "programming error: session range removed!"
 msgstr ""
 
-#: session.cc:1751
+#: session.cc:2158
 msgid "feedback loop setup between %1 and %2"
 msgstr ""
 
-#: session.cc:2047
+#: session.cc:2419
+msgid "Track "
+msgstr ""
+
+#: session.cc:2421
+msgid "Audio "
+msgstr ""
+
+#: session.cc:2426
+msgid "MIDI "
+msgstr ""
+
+#: session.cc:2500
 msgid "Session: could not create new midi track."
 msgstr ""
 
-#: session.cc:2053
+#: session.cc:2506
 msgid ""
 "No more JACK ports are available. You will need to stop %1 and restart JACK "
 "with more ports if you need this many tracks."
 msgstr ""
 
-#: session.cc:2239 session.cc:2242
-msgid "Audio"
+#: session.cc:2547 session.cc:2550
+msgid "Midi Bus"
+msgstr ""
+
+#: session.cc:2572
+msgid "cannot configure new midi bus input"
 msgstr ""
 
-#: session.cc:2266 session.cc:2274 session.cc:2352 session.cc:2360
+#: session.cc:2578
+msgid "cannot configure new midi bus output"
+msgstr ""
+
+#: session.cc:2592 session.cc:3137
+msgid "Session: could not create new audio route."
+msgstr ""
+
+#: session.cc:3022 session.cc:3030 session.cc:3113 session.cc:3121
 msgid "cannot configure %1 in/%2 out configuration for new audio track"
 msgstr ""
 
-#: session.cc:2297
+#: session.cc:3050
 msgid "Session: could not create new audio track."
 msgstr ""
 
-#: session.cc:2330 session.cc:2333
+#: session.cc:3088 session.cc:3091
 msgid "Bus"
 msgstr ""
 
-#: session.cc:2383
-msgid "Session: could not create new audio route."
-msgstr ""
-
-#: session.cc:2443 session.cc:2453
+#: session.cc:3207 session.cc:3217
 msgid "Session: UINT_MAX routes? impossible!"
 msgstr ""
 
-#: session.cc:2475
+#: session.cc:3293
 msgid "Session: cannot create track/bus from template description"
 msgstr ""
 
-#: session.cc:2501
+#: session.cc:3331
 msgid "Session: could not create new route from template"
 msgstr ""
 
-#: session.cc:2531
+#: session.cc:3365
 msgid "Adding new tracks/busses failed"
 msgstr ""
 
-#: session.cc:3671
+#: session.cc:4784
 msgid "Merging embedded file %1: name collision AND md5 hash collision!"
 msgstr ""
 
-#: session.cc:3801 session.cc:3874
+#: session.cc:4914 session.cc:4987
 msgid "There are already %1 recordings for %2, which I consider too many."
 msgstr ""
 
-#: session.cc:4316
+#: session.cc:5663
 msgid "send ID %1 appears to be in use already"
 msgstr ""
 
-#: session.cc:4328
+#: session.cc:5675
 msgid "aux send ID %1 appears to be in use already"
 msgstr ""
 
-#: session.cc:4340
+#: session.cc:5687
 msgid "return ID %1 appears to be in use already"
 msgstr ""
 
-#: session.cc:4352
+#: session.cc:5699
 msgid "insert ID %1 appears to be in use already"
 msgstr ""
 
-#: session.cc:4477
+#: session.cc:5825
 msgid "Cannot write a range where end <= start (e.g. %1 <= %2)"
 msgstr ""
 
-#: session.cc:4486
+#: session.cc:5834
 msgid "Cannot write a range with no data."
 msgstr ""
 
-#: session.cc:4528
+#: session.cc:5876
 msgid "cannot create new file \"%1\" for %2"
 msgstr ""
 
-#: session_click.cc:161
+#: session_click.cc:162
 msgid "cannot open click soundfile %1 (%2)"
 msgstr "nie można otworzyć pliku dźwiękowego metronomu %1 (%2)"
 
-#: session_click.cc:174
+#: session_click.cc:175
 msgid "cannot read data from click soundfile"
 msgstr "nie można odczytać danych z pliku dźwiękowego metronomu"
 
@@ -1817,23 +2381,36 @@ msgstr ""
 msgid "Could not save session options"
 msgstr ""
 
-#: session_directory.cc:59
+#: session_directory.cc:65
 msgid "Cannot create Session directory at path %1 Error: %2"
 msgstr ""
 
-#: session_directory.cc:76
+#: session_directory.cc:82
 msgid "Session subdirectory does not exist at path %1"
 msgstr ""
 
-#: session_events.cc:234
+#: session_directory.cc:161
+msgid ""
+"session-dir and session-name mismatch. Please use 'Menu > Session > Rename' "
+"in the future to rename sessions."
+msgstr ""
+
+#: session_directory.cc:167
+msgid ""
+"The session's interchange dir is tainted.\n"
+"There is more than one folder in '%1'.\n"
+"Please remove extra subdirs to reduce possible filename ambiguties."
+msgstr ""
+
+#: session_events.cc:229
 msgid "Session: cannot have two events of type %1 at the same frame (%2)."
 msgstr ""
 
-#: session_export.cc:125
+#: session_export.cc:152
 msgid "%1: cannot seek to %2 for export"
 msgstr ""
 
-#: session_export.cc:182
+#: session_export.cc:216
 msgid "Export ended unexpectedly: %1"
 msgstr ""
 
@@ -1843,412 +2420,465 @@ msgid ""
 "of this session."
 msgstr ""
 
-#: session_midi.cc:520
+#: session_midi.cc:570
 msgid "Session: cannot send quarter-frame MTC message (%1)"
 msgstr ""
 
-#: session_playlists.cc:378 session_playlists.cc:397
+#: session_playlists.cc:405 session_playlists.cc:424
 msgid "Session: cannot create Playlist from XML description."
 msgstr ""
 
-#: session_process.cc:136
+#: session_process.cc:159
 msgid "Session: error in no roll for %1"
 msgstr ""
 
-#: session_process.cc:1174
+#: session_process.cc:1202
 msgid "Programming error: illegal event type in process_event (%1)"
 msgstr ""
 
-#: session_state.cc:179
+#: session_state.cc:194
 msgid "solo cut control (dB)"
 msgstr ""
 
-#: session_state.cc:203
+#: session_state.cc:216
 msgid "Set block size and sample rate"
 msgstr ""
 
-#: session_state.cc:208
+#: session_state.cc:221
 msgid "Using configuration"
 msgstr ""
 
-#: session_state.cc:331
+#: session_state.cc:348
 msgid "Reset Remote Controls"
 msgstr ""
 
-#: session_state.cc:423
+#: session_state.cc:377 session_state.cc:409
+msgid "Filling playback buffers"
+msgstr ""
+
+#: session_state.cc:475
 msgid "Session: cannot create session peakfile folder \"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:430
+#: session_state.cc:482
 msgid "Session: cannot create session sounds dir \"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:437
+#: session_state.cc:489
 msgid "Session: cannot create session midi dir \"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:444
+#: session_state.cc:496
 msgid "Session: cannot create session dead sounds folder \"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:451
+#: session_state.cc:503
 msgid "Session: cannot create session export folder \"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:458
+#: session_state.cc:510
 msgid "Session: cannot create session analysis folder \"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:465
+#: session_state.cc:517
 msgid "Session: cannot create session plugins folder \"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:472
+#: session_state.cc:524
 msgid "Session: cannot create session externals folder \"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:486
+#: session_state.cc:538
 msgid "Session: cannot create session folder \"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:520
+#: session_state.cc:569
+msgid "Error reading session template file %1 (%2)"
+msgstr ""
+
+#: session_state.cc:584
+msgid "Error writing session template file %1 (%2)"
+msgstr ""
+
+#: session_state.cc:601
 msgid "Could not open %1 for writing session template"
 msgstr ""
 
-#: session_state.cc:526
+#: session_state.cc:608
 msgid "Could not open session template %1 for reading"
 msgstr ""
 
-#: session_state.cc:545
-msgid "Master"
+#: session_state.cc:626
+msgid "Loop"
 msgstr ""
 
-#: session_state.cc:606
+#: session_state.cc:707
 msgid "Could not remove pending capture state at path \"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:630
+#: session_state.cc:731
 msgid "could not rename snapshot %1 to %2 (%3)"
 msgstr ""
 
-#: session_state.cc:658
+#: session_state.cc:759
 msgid "Could not remove session file at path \"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:685
+#: session_state.cc:788
 msgid ""
 "the %1 audio engine is not connected and state saving would lose all I/O "
 "connections. Session not saved"
 msgstr ""
 
-#: session_state.cc:736
+#: session_state.cc:856
 msgid "state could not be saved to %1"
 msgstr ""
 
-#: session_state.cc:738 session_state.cc:749
+#: session_state.cc:858 session_state.cc:871
 msgid "Could not remove temporary session file at path \"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:746
+#: session_state.cc:868
 msgid "could not rename temporary session file %1 to %2 (%3)"
 msgstr ""
 
-#: session_state.cc:814
+#: session_state.cc:942
 msgid "%1: session file \"%2\" doesn't exist!"
 msgstr ""
 
-#: session_state.cc:826
+#: session_state.cc:954
 msgid "Could not understand session file %1"
 msgstr ""
 
-#: session_state.cc:835
+#: session_state.cc:963
 msgid "Session file %1 is not a session"
 msgstr ""
 
-#: session_state.cc:1147
+#: session_state.cc:1332
 msgid "programming error: Session: incorrect XML node sent to set_state()"
 msgstr ""
 
-#: session_state.cc:1201
+#: session_state.cc:1410
 msgid "Session: XML state has no options section"
 msgstr ""
 
-#: session_state.cc:1206
+#: session_state.cc:1415
 msgid "Session: XML state has no metadata section"
 msgstr ""
 
-#: session_state.cc:1217
+#: session_state.cc:1426
 msgid "Session: XML state has no sources section"
 msgstr ""
 
-#: session_state.cc:1224
+#: session_state.cc:1433
 msgid "Session: XML state has no Tempo Map section"
 msgstr ""
 
-#: session_state.cc:1231
+#: session_state.cc:1440
 msgid "Session: XML state has no locations section"
 msgstr ""
 
-#: session_state.cc:1244
+#: session_state.cc:1453
 msgid "Session: XML state has no Regions section"
 msgstr ""
 
-#: session_state.cc:1251
+#: session_state.cc:1460
 msgid "Session: XML state has no playlists section"
 msgstr ""
 
-#: session_state.cc:1271
+#: session_state.cc:1480
 msgid "Session: XML state has no bundles section"
 msgstr ""
 
-#: session_state.cc:1283
+#: session_state.cc:1492
 msgid "Session: XML state has no diskstreams section"
 msgstr ""
 
-#: session_state.cc:1291
+#: session_state.cc:1504
 msgid "Session: XML state has no routes section"
 msgstr ""
 
-#: session_state.cc:1303
+#: session_state.cc:1520
 msgid "Session: XML state has no route groups section"
 msgstr ""
 
-#: session_state.cc:1312
+#: session_state.cc:1529
 msgid "Session: XML state has no edit groups section"
 msgstr ""
 
-#: session_state.cc:1319
+#: session_state.cc:1536
 msgid "Session: XML state has no mix groups section"
 msgstr ""
 
-#: session_state.cc:1327
+#: session_state.cc:1544
 msgid "Session: XML state has no click section"
 msgstr ""
 
-#: session_state.cc:1373
+#: session_state.cc:1606
 msgid "Session: cannot create Route from XML description."
 msgstr ""
 
-#: session_state.cc:1377
+#: session_state.cc:1610
 msgid "Loaded track/bus %1"
 msgstr ""
 
-#: session_state.cc:1382
+#: session_state.cc:1615
 msgid "Tracks/busses loaded;  Adding to Session"
 msgstr ""
 
-#: session_state.cc:1386
+#: session_state.cc:1619
 msgid "Finished adding tracks/busses"
 msgstr ""
 
-#: session_state.cc:1485
+#: session_state.cc:1709
 msgid "Could not find diskstream for route"
 msgstr ""
 
-#: session_state.cc:1545
+#: session_state.cc:1760
 msgid "Session: cannot create Region from XML description."
 msgstr ""
 
-#: session_state.cc:1549
+#: session_state.cc:1764
 msgid "Can not load state for region '%1'"
 msgstr ""
 
-#: session_state.cc:1585
+#: session_state.cc:1800
 msgid "Regions in compound description not found (ID's %1 and %2): ignored"
 msgstr ""
 
-#: session_state.cc:1613
+#: session_state.cc:1828
 msgid "Nested source has no ID info in session file! (ignored)"
 msgstr ""
 
-#: session_state.cc:1625
+#: session_state.cc:1840
 msgid "Cannot reconstruct nested source for region %1"
 msgstr ""
 
-#: session_state.cc:1687
+#: session_state.cc:1902
 msgid "Session: XMLNode describing a AudioRegion is incomplete (no source)"
 msgstr ""
 
-#: session_state.cc:1695 session_state.cc:1716 session_state.cc:1736
+#: session_state.cc:1910 session_state.cc:1931 session_state.cc:1951
 msgid ""
 "Session: XMLNode describing a AudioRegion references an unknown source id =%1"
 msgstr ""
 
-#: session_state.cc:1701 session_state.cc:1722 session_state.cc:1742
+#: session_state.cc:1916 session_state.cc:1937 session_state.cc:1957
 msgid ""
 "Session: XMLNode describing a AudioRegion references a non-audio source id ="
 "%1"
 msgstr ""
 
-#: session_state.cc:1765
+#: session_state.cc:1980
 msgid ""
 "Session: XMLNode describing an AudioRegion is missing some master sources; "
 "ignored"
 msgstr ""
 
-#: session_state.cc:1799
+#: session_state.cc:2014
 msgid "Session: XMLNode describing a MidiRegion is incomplete (no source)"
 msgstr ""
 
-#: session_state.cc:1807
+#: session_state.cc:2022
 msgid ""
 "Session: XMLNode describing a MidiRegion references an unknown source id =%1"
 msgstr ""
 
-#: session_state.cc:1813
+#: session_state.cc:2028
 msgid ""
 "Session: XMLNode describing a MidiRegion references a non-midi source id =%1"
 msgstr ""
 
-#: session_state.cc:1872
+#: session_state.cc:2101
 msgid "Session: cannot create Source from XML description."
 msgstr ""
 
-#: session_state.cc:1880
+#: session_state.cc:2109
 msgid ""
 "A external MIDI file is missing. %1 cannot currently recover from missing "
 "external MIDI files"
 msgstr ""
 
-#: session_state.cc:1962
+#: session_state.cc:2191
 msgid "Found a sound file that cannot be used by %1. Talk to the programmers."
 msgstr ""
 
-#: session_state.cc:1979
+#: session_state.cc:2212
 msgid "Could not create templates directory \"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:1992
+#: session_state.cc:2224
 msgid "Template \"%1\" already exists - new version not created"
 msgstr ""
 
-#: session_state.cc:1998
+#: session_state.cc:2230
 msgid "Could not create directory for Session template\"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:2008
+#: session_state.cc:2259
 msgid "template not saved"
 msgstr ""
 
-#: session_state.cc:2018
-msgid "Could not create directory for Session template plugin state\"%1\" (%2)"
+#: session_state.cc:2501
+msgid "Unknown node \"%1\" found in Bundles list from session file"
 msgstr ""
 
-#: session_state.cc:2261
-msgid "Unknown node \"%1\" found in Bundles list from session file"
+#: session_state.cc:2969
+msgid "Cannot cleanup peak-files for read-only session."
 msgstr ""
 
-#: session_state.cc:2834
+#: session_state.cc:2973
+msgid "Cannot cleanup peak-files while recording"
+msgstr ""
+
+#: session_state.cc:2996
+msgid ""
+"Timeout waiting for peak-file creation to terminate before cleanup, please "
+"try again later."
+msgstr ""
+
+#: session_state.cc:3261
 msgid "Session: cannot create dead file folder \"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:2873
+#: session_state.cc:3296
 msgid "cannot rename unused file source from %1 to %2 (%3)"
 msgstr ""
 
-#: session_state.cc:2891
+#: session_state.cc:3312
 msgid "cannot remove peakfile %1 for %2 (%3)"
 msgstr ""
 
-#: session_state.cc:3204
+#: session_state.cc:3633
 msgid "could not backup old history file, current history not saved"
 msgstr ""
 
-#: session_state.cc:3213
+#: session_state.cc:3642
 msgid "history could not be saved to %1"
 msgstr ""
 
-#: session_state.cc:3216
+#: session_state.cc:3645
 msgid "Could not remove history file at path \"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:3220
+#: session_state.cc:3649
 msgid "could not restore history file from backup %1 (%2)"
 msgstr ""
 
-#: session_state.cc:3245
+#: session_state.cc:3674
 msgid "%1: no history file \"%2\" for this session."
 msgstr ""
 
-#: session_state.cc:3251
+#: session_state.cc:3680
 msgid "Could not understand session history file \"%1\""
 msgstr ""
 
-#: session_state.cc:3293
+#: session_state.cc:3722
 msgid "Failed to downcast MidiSource for NoteDiffCommand"
 msgstr ""
 
-#: session_state.cc:3304
+#: session_state.cc:3733
 msgid "Failed to downcast MidiSource for SysExDiffCommand"
 msgstr ""
 
-#: session_state.cc:3315
+#: session_state.cc:3744
 msgid "Failed to downcast MidiSource for PatchChangeDiffCommand"
 msgstr ""
 
-#: session_state.cc:3323
+#: session_state.cc:3752
 msgid "Couldn't figure out how to make a Command out of a %1 XMLNode."
 msgstr ""
 
-#: session_state.cc:3559
+#: session_state.cc:3990
 msgid "Session: unknown diskstream type in XML"
 msgstr ""
 
-#: session_state.cc:3564
+#: session_state.cc:3995
 msgid "Session: could not load diskstream via XML state"
 msgstr ""
 
-#: session_state.cc:3688 session_state.cc:3716 session_state.cc:3729
-#: session_state.cc:3744
+#: session_state.cc:4092
+msgid "Cannot rename read-only session."
+msgstr ""
+
+#: session_state.cc:4096
+msgid "Cannot rename session while recording"
+msgstr ""
+
+#: session_state.cc:4181 session_state.cc:4182 session_state.cc:4224
+#: session_state.cc:4228
 msgid "renaming %s as %2 failed (%3)"
 msgstr ""
 
+#: session_state.cc:4244 session_state.cc:4245 session_state.cc:4259
+#: session_state.cc:4260
+msgid "renaming %1 as %2 failed (%3)"
+msgstr ""
+
+#: session_state.cc:4571
+msgid "Cannot create new session folder %1"
+msgstr ""
+
+#: session_state.cc:4633 session_state.cc:4708
+msgid ""
+"\n"
+"copying \"%1\" failed !"
+msgstr ""
+
+#: session_state.cc:4906
+msgid "unknown reason"
+msgstr ""
+
 #: session_time.cc:214
 msgid "Unknown transport state %1 in sync callback"
 msgstr ""
 
-#: session_transport.cc:171
+#: session_transport.cc:177
 msgid "Cannot loop - no loop range defined"
 msgstr ""
 
-#: session_transport.cc:833
+#: session_transport.cc:968
 msgid ""
 "Seamless looping cannot be supported while %1 is using JACK transport.\n"
 "Recommend changing the configured options"
 msgstr ""
 
-#: session_transport.cc:915
+#: session_transport.cc:1050
 msgid "Locate called for negative sample position - ignored"
 msgstr ""
 
-#: session_transport.cc:1272
+#: session_transport.cc:1401
 msgid ""
 "Global varispeed cannot be supported while %1 is connected to JACK transport "
 "control"
 msgstr ""
 
-#: smf_source.cc:344
+#: slavable.cc:100
+msgid "Master #%1 not found, assignment lost"
+msgstr ""
+
+#: smf_source.cc:350
 msgid "Unable to read event prefix, corrupt MIDI ring"
 msgstr ""
 
-#: smf_source.cc:357
+#: smf_source.cc:363
 msgid "Event has time and size but no body, corrupt MIDI ring"
 msgstr ""
 
-#: smf_source.cc:363
+#: smf_source.cc:369
 msgid "Event time is before MIDI source position"
 msgstr ""
 
-#: smf_source.cc:409
+#: smf_source.cc:417
 msgid ""
 "Skipping event with unordered beat time %1 < %2 (off by %3 beats, %4 ticks)"
 msgstr ""
 
-#: smf_source.cc:453
+#: smf_source.cc:461
 msgid "Skipping event with unordered frame time %1 < %2"
 msgstr ""
 
-#: smf_source.cc:518
+#: smf_source.cc:526
 msgid "cannot open MIDI file %1 for write"
 msgstr ""
 
@@ -2265,8 +2895,8 @@ msgid "CAF"
 msgstr "CAF"
 
 #: sndfile_helpers.cc:37
-msgid "W64 (64 bit WAV)"
-msgstr "W64 (64 bit WAV)"
+msgid "W64 (64-bit WAV)"
+msgstr ""
 
 #: sndfile_helpers.cc:38
 msgid "FLAC"
@@ -2309,23 +2939,23 @@ msgid ".raw"
 msgstr ".raw"
 
 #: sndfile_helpers.cc:66
-msgid "Signed 16 bit PCM"
+msgid "Signed 16-bit PCM"
 msgstr ""
 
 #: sndfile_helpers.cc:67
-msgid "Signed 24 bit PCM"
+msgid "Signed 24-bit PCM"
 msgstr ""
 
 #: sndfile_helpers.cc:68
-msgid "Signed 32 bit PCM"
+msgid "Signed 32-bit PCM"
 msgstr ""
 
 #: sndfile_helpers.cc:69
-msgid "Signed 8 bit PCM"
+msgid "Signed 8-bit PCM"
 msgstr ""
 
 #: sndfile_helpers.cc:70
-msgid "32 bit float"
+msgid "32-bit float"
 msgstr ""
 
 #: sndfile_helpers.cc:83
@@ -2336,88 +2966,108 @@ msgstr "Little-endian (Intel)"
 msgid "Big-endian (PowerPC)"
 msgstr ""
 
-#: sndfilesource.cc:260
+#: sndfilesource.cc:282
+msgid "SndFileSource: cannot open file \"%1\" for %2"
+msgstr ""
+
+#: sndfilesource.cc:300
 msgid "SndFileSource: cannot open file \"%1\" for %2 (%3)"
 msgstr ""
 
-#: sndfilesource.cc:268
+#: sndfilesource.cc:308
 msgid ""
 "SndFileSource: file only contains %1 channels; %2 is invalid as a channel "
 "number"
 msgstr ""
 
-#: sndfilesource.cc:322 sndfilesource.cc:655
+#: sndfilesource.cc:323
+msgid "Cannot mark RF64 audio file for automatic downgrade to WAV: %1"
+msgstr ""
+
+#: sndfilesource.cc:375 sndfilesource.cc:705
 msgid ""
 "cannot set broadcast info for audio file %1 (%2); dropping broadcast info "
 "for this file"
 msgstr ""
 
-#: sndfilesource.cc:368
-msgid "could not allocate file %1 for reading."
+#: sndfilesource.cc:418
+msgid "could not open file %1 for reading."
 msgstr ""
 
-#: sndfilesource.cc:403
+#: sndfilesource.cc:453
 msgid "SndFileSource: could not seek to frame %1 within %2 (%3)"
 msgstr ""
 
-#: sndfilesource.cc:412
+#: sndfilesource.cc:462
 msgid ""
 "SndFileSource: @ %1 could not read %2 within %3 (%4) (len = %5, ret was %6)"
 msgstr ""
 
-#: sndfilesource.cc:454 sndfilesource.cc:483
+#: sndfilesource.cc:504 sndfilesource.cc:533
 msgid "attempt to write a non-writable audio file source (%1)"
 msgstr ""
 
-#: sndfilesource.cc:459 utils.cc:579 utils.cc:603 utils.cc:617 utils.cc:636
+#: sndfilesource.cc:509 utils.cc:564 utils.cc:588 utils.cc:602 utils.cc:621
 msgid "programming error: %1 %2"
 msgstr ""
 
-#: sndfilesource.cc:586 sndfilesource.cc:604
+#: sndfilesource.cc:636 sndfilesource.cc:654
 msgid "attempt to flush a non-writable audio file source (%1)"
 msgstr ""
 
-#: sndfilesource.cc:591
+#: sndfilesource.cc:641
 msgid "could not allocate file %1 to write header"
 msgstr ""
 
-#: sndfilesource.cc:609
+#: sndfilesource.cc:659
 msgid "could not allocate file %1 to flush contents"
 msgstr ""
 
-#: sndfilesource.cc:621
+#: sndfilesource.cc:671
 msgid ""
 "attempt to store broadcast info in a non-writable audio file source (%1)"
 msgstr ""
 
-#: sndfilesource.cc:626
+#: sndfilesource.cc:676
 msgid "attempt to set BWF info for an un-opened audio file source (%1)"
 msgstr ""
 
-#: sndfilesource.cc:670
+#: sndfilesource.cc:720
 msgid "%1: cannot seek to %2 (libsndfile error: %3)"
 msgstr ""
 
-#: sndfilesource.cc:780
+#: sndfilesource.cc:830
 msgid "SndFileSource: \"%1\" bad read retval: %2 of %5 (%3: %4)"
 msgstr ""
 
-#: sndfilesource.cc:793 sndfilesource.cc:843 sndfilesource.cc:850
+#: sndfilesource.cc:843 sndfilesource.cc:893 sndfilesource.cc:900
 msgid "SndFileSource: \"%1\" bad write (%2)"
 msgstr ""
 
-#: sndfilesource.cc:873
+#: sndfilesource.cc:923
 msgid ""
 "Filesource: start time is already set for existing file (%1): Cannot change "
 "start time."
 msgstr ""
 
+#: sndfilesource.cc:982
+msgid "SndFileSource: cannot open file \"%1\" for reading"
+msgstr ""
+
+#: solo_control.cc:199
+msgid "Cleared Explicit solo: %1\n"
+msgstr ""
+
+#: solo_control.cc:202
+msgid "Cleared Implicit solo: %1 up:%2 down:%3\n"
+msgstr ""
+
 #: soundcloud_upload.cc:129
 msgid ""
 "Upload to Soundcloud failed.  Perhaps your email or password are incorrect?\n"
 msgstr ""
 
-#: source_factory.cc:374
+#: source_factory.cc:390
 msgid "Recovery attempted on a MIDI file - not implemented"
 msgstr ""
 
@@ -2433,7 +3083,7 @@ msgstr ""
 msgid "Speaker information is missing distance - speaker ignored"
 msgstr ""
 
-#: srcfilesource.cc:134
+#: srcfilesource.cc:142
 msgid "SrcFileSource: %1"
 msgstr ""
 
@@ -2441,104 +3091,134 @@ msgstr ""
 msgid "Cannot compile tape track regexp for use (%1)"
 msgstr ""
 
-#: tempo.cc:80
-msgid "TempoSection XML node has no \"start\" property"
+#: tempo.cc:98
+msgid "Legacy session detected. TempoSection XML node will be altered."
+msgstr ""
+
+#: tempo.cc:104
+msgid "TempoSection XML node has an illegal \"pulse\" value"
 msgstr ""
 
-#: tempo.cc:88
-msgid "TempoSection XML node has an illegal \"start\" value"
+#: tempo.cc:112
+msgid "TempoSection XML node has an illegal \"frame\" value"
 msgstr ""
 
-#: tempo.cc:95
+#: tempo.cc:119
 msgid "TempoSection XML node has no \"beats-per-minute\" property"
 msgstr ""
 
-#: tempo.cc:100
+#: tempo.cc:124
 msgid "TempoSection XML node has an illegal \"beats_per_minute\" value"
 msgstr ""
 
-#: tempo.cc:109
+#: tempo.cc:133
 msgid "TempoSection XML node has an illegal \"note-type\" value"
 msgstr ""
 
-#: tempo.cc:115
+#: tempo.cc:139
 msgid "TempoSection XML node has no \"movable\" property"
 msgstr ""
 
-#: tempo.cc:125
-msgid "TempoSection XML node has an illegal \"bar-offset\" value"
+#: tempo.cc:146
+msgid "TempoSection XML node has no \"active\" property"
 msgstr ""
 
-#: tempo.cc:202
-msgid "MeterSection XML node has no \"start\" property"
+#: tempo.cc:471
+msgid "MeterSection XML node has an illegal \"start\" value"
 msgstr ""
 
-#: tempo.cc:210
-msgid "MeterSection XML node has an illegal \"start\" value"
+#: tempo.cc:474
+msgid "Legacy session detected - MeterSection XML node will be altered."
+msgstr ""
+
+#: tempo.cc:481
+msgid "MeterSection XML node has an illegal \"pulse\" value"
+msgstr ""
+
+#: tempo.cc:488
+msgid "MeterSection XML node has an illegal \"beat\" value"
+msgstr ""
+
+#: tempo.cc:495
+msgid "MeterSection XML node has no \"bbt\" property"
+msgstr ""
+
+#: tempo.cc:500
+msgid "MeterSection XML node has an illegal \"bbt\" value"
+msgstr ""
+
+#: tempo.cc:509
+msgid "MeterSection XML node has an illegal \"frame\" value"
 msgstr ""
 
-#: tempo.cc:220
+#: tempo.cc:519
 msgid ""
 "MeterSection XML node has no \"beats-per-bar\" or \"divisions-per-bar\" "
 "property"
 msgstr ""
 
-#: tempo.cc:226
-msgid ""
-"MeterSection XML node has an illegal \"beats-per-bar\" or \"divisions-per-bar"
-"\" value"
+#: tempo.cc:524
+msgid "MeterSection XML node has an illegal \"divisions-per-bar\" value"
 msgstr ""
 
-#: tempo.cc:231
+#: tempo.cc:529
 msgid "MeterSection XML node has no \"note-type\" property"
 msgstr ""
 
-#: tempo.cc:236
+#: tempo.cc:533
 msgid "MeterSection XML node has an illegal \"note-type\" value"
 msgstr ""
 
-#: tempo.cc:241
+#: tempo.cc:538
 msgid "MeterSection XML node has no \"movable\" property"
 msgstr ""
 
-#: tempo.cc:388
+#: tempo.cc:545
+msgid "MeterSection XML node has no \"lock-style\" property"
+msgstr ""
+
+#: tempo.cc:821
 msgid ""
 "Meter changes can only be positioned on the first beat of a bar. Moving from "
 "%1 to %2"
 msgstr ""
 
-#: tempo.cc:650
+#: tempo.cc:1156
 msgid "no tempo sections defined in tempo map - cannot change tempo @ %1"
 msgstr ""
 
-#: tempo.cc:680 tempo.cc:696 tempo.cc:712 tempo.cc:728
-msgid "programming error: no tempo section in tempo map!"
+#: tempo.cc:1186
+msgid "programming error: no meter section in tempo map!"
 msgstr ""
 
-#: tempo.cc:846 tempo.cc:1827
-msgid "programming error: unhandled MetricSection type"
+#: tempo.cc:1204 tempo.cc:1227 tempo.cc:1248
+msgid "programming error: no tempo section in tempo map!"
 msgstr ""
 
-#: tempo.cc:1142
+#: tempo.cc:1959 tempo.cc:1987
 msgid "tempo map asked for BBT time at frame %1\n"
 msgstr ""
 
-#: tempo.cc:1185
+#: tempo.cc:2054
 msgid "tempo map asked for frame time at bar < 1  (%1)\n"
 msgstr ""
 
-#: tempo.cc:1642 tempo.cc:1656
+#: tempo.cc:3472 tempo.cc:3485
 msgid "Tempo map: could not set new state, restoring old one."
 msgstr ""
 
-#: tempo.cc:1677
+#: tempo.cc:3522 tempo.cc:3523
 msgid "Multiple meter definitions found at %1"
 msgstr ""
 
-#: tempo.cc:1682
+#: tempo.cc:3528 tempo.cc:3529
 msgid "Multiple tempo definitions found at %1"
 msgstr ""
 
+#: tempo.cc:3715
+msgid "programming error: unhandled MetricSection type"
+msgstr ""
+
 #: tempo_map_importer.cc:52
 msgid "Tempo map"
 msgstr ""
@@ -2563,6 +3243,14 @@ msgid ""
 "Are you sure you want to do this?"
 msgstr ""
 
+#: unknown_processor.cc:86
+msgid "Using plugin-stub with unknown i/o configuration for: "
+msgstr ""
+
+#: unknown_processor.cc:107
+msgid "Using plugin-stub with mismatching i/o configuration for: "
+msgstr ""
+
 #: user_bundle.cc:47
 msgid "Node for Bundle has no \"name\" property"
 msgstr ""
@@ -2584,62 +3272,74 @@ msgstr ""
 msgid "Node for Port has no \"name\" property"
 msgstr ""
 
-#: utils.cc:422 utils.cc:451
+#: utils.cc:412 utils.cc:441
 msgid "Splice"
 msgstr ""
 
-#: utils.cc:424 utils.cc:441
+#: utils.cc:414 utils.cc:431
 msgid "Slide"
 msgstr ""
 
-#: utils.cc:426 utils.cc:447
+#: utils.cc:416 utils.cc:437
 msgid "Ripple"
 msgstr ""
 
-#: utils.cc:428 utils.cc:444
+#: utils.cc:418 utils.cc:434
 msgid "Lock"
 msgstr ""
 
-#: utils.cc:431
+#: utils.cc:421
 msgid "programming error: unknown edit mode string \"%1\""
 msgstr ""
 
-#: utils.cc:458 utils.cc:490
+#: utils.cc:448 utils.cc:484
 msgid "MIDI Timecode"
 msgstr ""
 
-#: utils.cc:458 utils.cc:488
+#: utils.cc:448 utils.cc:482
 msgid "MTC"
 msgstr "MTC"
 
-#: utils.cc:462 utils.cc:497
+#: utils.cc:452 utils.cc:491
 msgid "MIDI Clock"
 msgstr ""
 
-#: utils.cc:466 utils.cc:484 utils.cc:504
+#: utils.cc:456 utils.cc:478 utils.cc:498
 msgid "JACK"
 msgstr "JACK"
 
-#: utils.cc:470
-msgid "programming error: unknown sync source string \"%1\""
+#: utils.cc:460 utils.cc:495
+msgid "LTC"
 msgstr ""
 
-#: utils.cc:495
-msgid "M-Clock"
+#: utils.cc:464
+msgid "programming error: unknown sync source string \"%1\""
 msgstr ""
 
-#: utils.cc:501
-msgid "LTC"
+#: utils.cc:489
+msgid "M-Clock"
 msgstr ""
 
-#: utils.cc:671
+#: utils.cc:658
 msgid "programming error: unknown native header format: %1"
 msgstr ""
 
-#: utils.cc:686
+#: utils.cc:673
 msgid "cannot open directory %1 (%2)"
 msgstr ""
 
+#: vca.cc:43
+#, c-format
+msgid "VCA %n"
+msgstr ""
+
+#: vca_manager.cc:166
+msgid "Cannot set state of a VCA"
+msgstr ""
+
+#~ msgid "W64 (64 bit WAV)"
+#~ msgstr "W64 (64 bit WAV)"
+
 #~ msgid "monitor"
 #~ msgstr "monitor"
 
diff --git a/libs/ardour/po/ru.mo b/libs/ardour/po/ru.mo
new file mode 100644
index 0000000..30d0a0b
Binary files /dev/null and b/libs/ardour/po/ru.mo differ
diff --git a/libs/ardour/po/ru.po b/libs/ardour/po/ru.po
index dac67d7..62d96a7 100644
--- a/libs/ardour/po/ru.po
+++ b/libs/ardour/po/ru.po
@@ -9,7 +9,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: libardour 4\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-01-07 03:46+0300\n"
+"POT-Creation-Date: 2016-07-14 06:20-0400\n"
 "PO-Revision-Date: 2016-01-07 04:14+0300\n"
 "Last-Translator: Alexandre Prokoudine <alexandre.prokoudine at gmail.com>\n"
 "Language-Team: русский <>\n"
@@ -21,32 +21,23 @@ msgstr ""
 "|| n%100>=20) ? 1 : 2);\n"
 "X-Generator: Gtranslator 2.91.7\n"
 
-#: amp.cc:57 automatable.cc:173
-msgid "Trim"
-msgstr ""
-
-#: amp.cc:57 automatable.cc:171
-msgid "Fader"
-msgstr "Фейдер"
-
-#: amp.cc:448
-#, c-format
-msgid "%3.1f dB"
-msgstr "%3.1f Дб"
-
-#: amp.cc:489
+#: amp.cc:412
 #, c-format
 msgid "%.2fdB"
 msgstr "%.2f Дб"
 
-#: analyser.cc:119 audioregion.cc:1762
+#: analyser.cc:121 audioregion.cc:1789
 msgid "Transient Analysis failed for %1."
 msgstr "Не удалось выполнить анализ транзиентов для %1."
 
-#: analyser.cc:119
+#: analyser.cc:121
 msgid "Audio File Source"
 msgstr "Источник звукового файла"
 
+#: analysis_graph.cc:136
+msgid "%1 (%2..%3)"
+msgstr ""
+
 #: audio_backend.cc:31
 msgid "No Error occurred"
 msgstr ""
@@ -187,7 +178,7 @@ msgstr "Ошибка: закончилась свободная память"
 msgid "Could not reconnect to Audio/MIDI engine"
 msgstr ""
 
-#: audio_backend.cc:107 export_formats.cc:52 session.cc:6238 session.cc:6258
+#: audio_backend.cc:107 export_formats.cc:52 session.cc:6772 session.cc:6792
 msgid "None"
 msgstr "Нет"
 
@@ -262,7 +253,7 @@ msgstr "%1: невозможно создать цельнофайловую о
 msgid "Could not open %1.  Audio Library not saved"
 msgstr "Не удалось открыть %1. Аудио библиотека не сохранена"
 
-#: audio_playlist.cc:504
+#: audio_playlist.cc:509
 msgid ""
 "Legacy crossfade involved an incoming region not present in playlist \"%1\" "
 "- crossfade discarded"
@@ -270,7 +261,7 @@ msgstr ""
 "Плавный переход участвующией входящей области отсутствует плейлисте \"%1\" - "
 "Склейка отменяется"
 
-#: audio_playlist.cc:520
+#: audio_playlist.cc:525
 msgid ""
 "Legacy crossfade involved an outgoing region not present in playlist \"%1\" "
 "- crossfade discarded"
@@ -303,10 +294,11 @@ msgstr "Плохо сформированный XML в импортирован
 msgid "Audio Playlists (unused)"
 msgstr "Плейлисты аудио (неиспользованные)"
 
-#: audio_playlist_source.cc:171 audiosource.cc:1046 midi_playlist_source.cc:147
-#: midi_playlist_source.cc:155 midi_playlist_source.cc:162 midi_source.cc:398
-#: plugin_insert.cc:705 rb_effect.cc:327 session.cc:3550 session.cc:3588
-#: session.cc:4898 session_handle.cc:88 sndfilesource.cc:173
+#: audio_playlist_source.cc:171 audiosource.cc:1046
+#: midi_playlist_source.cc:147 midi_playlist_source.cc:155
+#: midi_playlist_source.cc:162 midi_source.cc:403 plugin_insert.cc:1259
+#: rb_effect.cc:327 session.cc:5314 session.cc:5341 session.cc:5461
+#: session_handle.cc:88 sndfilesource.cc:173
 msgid "programming error: %1"
 msgstr "Ошибка в программе: %1"
 
@@ -334,27 +326,27 @@ msgstr ""
 "\n"
 "Каналов: "
 
-#: audio_track.cc:176
+#: audio_track.cc:177
 msgid "Unknown bundle \"%1\" listed for input of %2"
 msgstr "Неизвестная связка \"%1\" в списке для ввода %2"
 
-#: audio_track.cc:178
+#: audio_track.cc:179
 msgid "in 1"
 msgstr "в 1"
 
-#: audio_track.cc:179
+#: audio_track.cc:180
 msgid "No input bundles available as a replacement"
 msgstr "Нет входных связок, доступных в качестве замены"
 
-#: audio_track.cc:183
+#: audio_track.cc:184
 msgid "Bundle %1 was not available - \"in 1\" used instead"
 msgstr "Связка %1 не была доступна - \"в 1\" использована вместо неё"
 
-#: audio_track.cc:192
+#: audio_track.cc:193
 msgid "improper input channel list in XML node (%1)"
 msgstr "Неадекватный сходящий список каналов в XML узле (% 1)"
 
-#: audio_track.cc:215 diskstream.cc:503 source.cc:149
+#: audio_track.cc:216 diskstream.cc:503 source.cc:149
 msgid "%1: this session uses destructive tracks, which are not supported"
 msgstr ""
 
@@ -378,19 +370,19 @@ msgstr "Не удалось загрузить модуль VAMP под назв
 msgid "VAMP Plugin \"%1\" could not be loaded"
 msgstr "Не удалось загрузить модуль VAMP под названием \"%1\""
 
-#: audioengine.cc:753
+#: audioengine.cc:756
 msgid "AudioEngine: cannot load module \"%1\" (%2)"
 msgstr "AudioEngine: невозможно загрузить модуль \"%1\" (%2)"
 
-#: audioengine.cc:759
+#: audioengine.cc:762
 msgid "AudioEngine: backend at \"%1\" has no descriptor function."
 msgstr "AudioEngine: бэкэнд на \"%1\" не имеет функции дескрипторов."
 
-#: audioengine.cc:838
+#: audioengine.cc:841
 msgid "Could not create backend for %1: %2"
 msgstr "Не удалось создать движок для %1: %2"
 
-#: audioregion.cc:1718
+#: audioregion.cc:1757
 msgid ""
 "You have requested an operation that requires audio analysis.\n"
 "\n"
@@ -398,24 +390,14 @@ msgid ""
 "transient data must be generated every time it is required.\n"
 "\n"
 "If you are doing work that will require transient data on a regular basis, "
-"you should probably enable \"auto-analyse-audio\" then quit %1 and restart.\n"
+"you should probably enable \"auto-analyse-audio\" in Preferences > Audio > "
+"Regions, then quit %1 and restart.\n"
 "\n"
 "This dialog will not display again.  But you may notice a slight delay in "
 "this and future transient-detection operations.\n"
 msgstr ""
-"Вы запросили операцию, требующую аудиоанализ.\n"
-"\n"
-"В настоящее время у Вас \"auto-analyse-audio\" отключен. Это означает, что "
-"переходные данные должны быть сгенерированы каждый раз, когда потребуется.\n"
-"\n"
-"Если вы делаете работу, которая потребует переходных данных на регулярной "
-"основе, то Вам, вероятно, следует включить \"auto-analyse-audio\", затем "
-"закрыть Ardour и перезапустить.\n"
-"\n"
-"Этот диалог не будет отображаться снова, но Вы можете заметить небольшую "
-"задержку в этой и будущих операциях переходных обнаружений.\n"
 
-#: audioregion.cc:1762
+#: audioregion.cc:1789
 msgid "Audio Region"
 msgstr "Звуковая область"
 
@@ -493,73 +475,81 @@ msgstr "%1: не удалось записать пиковые данные ф
 msgid "could not truncate peakfile %1 to %2 (error: %3)"
 msgstr "Не удалось усечь пик-файл %1 в %2 (ошибка: %3)"
 
-#: auditioner.cc:101
+#: auditioner.cc:105
 msgid "Falling back to Reasonable Synth for Midi Audition"
 msgstr "Возврат к Reasonable Synth для прослушивания MIDI"
 
-#: auditioner.cc:103
+#: auditioner.cc:107
 msgid "No synth for midi-audition found."
 msgstr "Синтезатора для прослушивания MIDI не найдено."
 
-#: auditioner.cc:159
+#: auditioner.cc:163
 msgid "no outputs available for auditioner - manual connection required"
 msgstr ""
 "Нет доступных выходов для движка прослушивания. Требуется ручное подключение"
 
-#: auditioner.cc:404 auditioner.cc:451
+#: auditioner.cc:408 auditioner.cc:455
 msgid "Cannot setup auditioner processing flow for %1 channels"
 msgstr "Не удалось установить процесс обработки потока для %1 каналов"
 
-#: auditioner.cc:439
+#: auditioner.cc:443
 msgid "Failed to load synth for MIDI-Audition."
 msgstr "Не удалось загрузить синтезатор MIDI-прослушивания."
 
-#: auditioner.cc:458
+#: auditioner.cc:462
 msgid "Auditioning of regions other than Audio or Midi is not supported."
 msgstr ""
 "Прослушивание в других областях, чем это аудио или MIDI не поддерживается."
 
-#: automatable.cc:84
+#: automatable.cc:87
 msgid "Automation node has no path property"
 msgstr "Узел автоматизации не имеет путевых свойств"
 
-#: automatable.cc:105
+#: automatable.cc:108
 msgid "cannot open %2 to load automation data (%3)"
 msgstr "Не удалось открыть %2 для загрузки данных автоматизации (%3)"
 
-#: automatable.cc:137
+#: automatable.cc:140
 msgid "cannot load automation data from %2"
 msgstr "Не удалось загрузить данные автоматизации из %2"
 
-#: automatable.cc:175
+#: automatable.cc:176 send.cc:95 session.cc:851
+msgid "Fader"
+msgstr "Фейдер"
+
+#: automatable.cc:178
+msgid "Trim"
+msgstr ""
+
+#: automatable.cc:180
 msgid "Mute"
 msgstr "Приглушить"
 
-#: automation_control.cc:170
+#: automation_control.cc:228
 msgid "record %1 automation"
 msgstr ""
 
-#: automation_list.cc:396
+#: automation_list.cc:410
 msgid "automation list: cannot load coordinates from XML, all points ignored"
 msgstr ""
 "Список автоматизации: не удалось загрузить координаты из XML. Все точки "
 "игнорированы"
 
-#: automation_list.cc:442
+#: automation_list.cc:456
 msgid ""
 "automation list: no x-coordinate stored for control point (point ignored)"
 msgstr ""
 "Список автоматизации: нет x-координаты, сохранённой для контрольной точки.\n"
 "Точка игнорируется"
 
-#: automation_list.cc:448
+#: automation_list.cc:462
 msgid ""
 "automation list: no y-coordinate stored for control point (point ignored)"
 msgstr ""
 "Список автоматизации: нет y-координаты, сохранённой для контрольной точки.\n"
 "Точка игнорируется"
 
-#: automation_list.cc:462
+#: automation_list.cc:476
 msgid ""
 "AutomationList: passed XML node called %1, not \"AutomationList\" - ignored"
 msgstr ""
@@ -610,7 +600,7 @@ msgstr "ControlProtocolManager: не удалось загрузить моду
 msgid "ControlProtocolManager: module \"%1\" has no descriptor function."
 msgstr "ControlProtocolManager: модуль \"%1\" не имеет функции дескриптора."
 
-#: control_protocol_manager.cc:514
+#: control_protocol_manager.cc:516
 msgid "Control protocol \"%1\" has no descriptor"
 msgstr ""
 
@@ -630,7 +620,7 @@ msgstr "Не удалось найти частоту CPU в /proc/cpuinfo"
 msgid "audio"
 msgstr "аудио"
 
-#: data_type.cc:28 session.cc:2312
+#: data_type.cc:28 session.cc:2452
 msgid "MIDI"
 msgstr "MIDI"
 
@@ -642,7 +632,7 @@ msgstr "Неизвестно"
 msgid "main outs"
 msgstr "Главные выходы"
 
-#: delivery.cc:121 send.cc:63
+#: delivery.cc:121 send.cc:64
 msgid "listen"
 msgstr "Слушать"
 
@@ -658,25 +648,25 @@ msgstr "Не удалось получить порт для экспорта к
 msgid "Export failed: %1"
 msgstr "Экспорт не удался: %1"
 
-#: export_filename.cc:126
+#: export_filename.cc:128
 msgid "Existing export folder for this session (%1) does not exist - ignored"
 msgstr ""
 "Присутствующая папка экспорта для этой сессии (%1) не существует. "
 "Игнорировано"
 
-#: export_filename.cc:242
+#: export_filename.cc:263
 msgid "No Time"
 msgstr "Без времени"
 
-#: export_filename.cc:251
+#: export_filename.cc:272
 msgid "Invalid time format"
 msgstr "Некорректный формат времени"
 
-#: export_filename.cc:260
+#: export_filename.cc:281
 msgid "No Date"
 msgstr "Без даты"
 
-#: export_filename.cc:275
+#: export_filename.cc:296
 msgid "Invalid date format"
 msgstr "Некорректный формат даты"
 
@@ -712,23 +702,27 @@ msgstr "Сжатие с потерями"
 msgid "Lossless compression"
 msgstr "Сжатие без потерь"
 
-#: export_format_manager.cc:218 export_format_specification.cc:601
+#: export_format_manager.cc:218 export_format_specification.cc:657
 msgid "Session rate"
 msgstr "Частота сессии"
 
-#: export_format_specification.cc:556
-msgid "normalize"
-msgstr "Нормировка"
+#: export_format_specification.cc:609
+msgid "normalize loudness"
+msgstr ""
+
+#: export_format_specification.cc:611
+msgid "normalize peak"
+msgstr ""
 
-#: export_format_specification.cc:560
+#: export_format_specification.cc:616
 msgid "trim"
 msgstr "Обрезка"
 
-#: export_format_specification.cc:562
+#: export_format_specification.cc:618
 msgid "trim start"
 msgstr "Обрезка начала"
 
-#: export_format_specification.cc:564
+#: export_format_specification.cc:620
 msgid "trim end"
 msgstr "Обрезка конца"
 
@@ -780,22 +774,22 @@ msgstr "Формат сэмплов Vorbis"
 msgid "No sample format"
 msgstr "Без формата сэмплов"
 
-#: export_handler.cc:371
+#: export_handler.cc:419
 msgid "File %1 uploaded to %2"
 msgstr "Файл %1 загружен в %2"
 
-#: export_handler.cc:377
+#: export_handler.cc:425
 msgid ""
 "upload to Soundcloud failed. Perhaps your email or password are incorrect?\n"
 msgstr ""
 "Загрузка на Soundcloud не удалось. Возможно, ваша электронная почта или "
 "пароль неверны.\n"
 
-#: export_handler.cc:503 export_handler.cc:506
-msgid "an error occured while writing a TOC/CUE file: %1"
+#: export_handler.cc:551 export_handler.cc:554
+msgid "an error occurred while writing a TOC/CUE file: %1"
 msgstr "Произошла ошибка при записи TOC/CUE файла: %1"
 
-#: export_handler.cc:796 export_handler.cc:854
+#: export_handler.cc:844 export_handler.cc:902
 msgid "Cannot convert %1 to Latin-1 text"
 msgstr "Невозможно преобразовать %1 в Latin-1 текст"
 
@@ -807,59 +801,59 @@ msgstr "Поиск форматов экспорта в %1"
 msgid "Unable to create export format directory %1: %2"
 msgstr "Невозможно создать каталог экспортного формата %1: %2"
 
-#: export_profile_manager.cc:263
+#: export_profile_manager.cc:268
 msgid "Unable to remove export preset %1: %2"
 msgstr "Невозможно удалить профиль экспорта %1: %2"
 
-#: export_profile_manager.cc:352
+#: export_profile_manager.cc:357
 msgid "Selection"
 msgstr "Выделение"
 
-#: export_profile_manager.cc:616
+#: export_profile_manager.cc:621
 msgid "Unable to rename export format %1 to %2: %3"
 msgstr "Невозможно переименовать профиль экспорта %1 в %2: %3"
 
-#: export_profile_manager.cc:648
+#: export_profile_manager.cc:653
 msgid "Unable to remove export profile %1: %2"
 msgstr "Невозможно удалить профиль экспорта %1: %2"
 
-#: export_profile_manager.cc:666
+#: export_profile_manager.cc:671
 msgid "empty format"
 msgstr "Неопределённый формат"
 
-#: export_profile_manager.cc:747
+#: export_profile_manager.cc:752
 msgid "Cannot load export format from %1"
 msgstr "Не удалось загрузить формат экспорта из %1"
 
-#: export_profile_manager.cc:753
+#: export_profile_manager.cc:758
 msgid "Cannot export format read from %1"
 msgstr "Не удалось экспортировать формат чтения из %1"
 
-#: export_profile_manager.cc:847
+#: export_profile_manager.cc:852
 msgid "No timespan has been selected!"
 msgstr "Отрезок времени не указан!"
 
-#: export_profile_manager.cc:851
+#: export_profile_manager.cc:856
 msgid "No channels have been selected!"
 msgstr "Нет выбранных каналов!"
 
-#: export_profile_manager.cc:855
+#: export_profile_manager.cc:860
 msgid "Some channels are empty"
 msgstr "Некоторые каналы пусты"
 
-#: export_profile_manager.cc:888
+#: export_profile_manager.cc:893
 msgid "No format selected!"
 msgstr "Формат не выбран!"
 
-#: export_profile_manager.cc:890
+#: export_profile_manager.cc:895
 msgid "All channels are empty!"
 msgstr "Все каналы пусты!"
 
-#: export_profile_manager.cc:892
+#: export_profile_manager.cc:897
 msgid "One or more of the selected formats is not compatible with this system!"
 msgstr "Один или более из выбранных форматов не совместим с этой системой!"
 
-#: export_profile_manager.cc:895
+#: export_profile_manager.cc:900
 msgid ""
 "%1 supports only %2 channels, but you have %3 channels in your channel "
 "configuration"
@@ -867,7 +861,7 @@ msgstr ""
 "%1 поддерживает только %2 каналов, но вы должны иметь %3 каналов в вашей "
 "Конфигурации каналов"
 
-#: file_source.cc:201 session_state.cc:3144
+#: file_source.cc:201 session_state.cc:3284
 msgid ""
 "there are already 1000 files with names like %1; versioning discontinued"
 msgstr ""
@@ -981,6 +975,11 @@ msgstr "Не удалось определить текущий рабочий 
 msgid "unknown file type for session %1"
 msgstr "Неизвестный тип файла для сессии %1"
 
+#: gain_control.cc:81
+#, c-format
+msgid "%3.1f dB"
+msgstr "%3.1f Дб"
+
 #: globals.cc:266
 msgid "Could not set system open files limit to \"unlimited\""
 msgstr "Не удалось установить системный лимит открытых файлов в \"unlimited\""
@@ -1002,27 +1001,27 @@ msgstr "Не удалось получить системный лимит от
 msgid "Could not set system open files limit. Current limit is %1 open files"
 msgstr ""
 
-#: globals.cc:473
+#: globals.cc:474
 msgid "Loading configuration"
 msgstr "Загрузка конфигурации"
 
-#: globals.cc:553 session.cc:1036
+#: globals.cc:554 route.cc:182 route.cc:4149 session.cc:1157
 msgid "Monitor"
 msgstr "Монитор"
 
-#: globals.cc:554 session_state.cc:633
+#: globals.cc:555 session_state.cc:642
 msgid "Master"
 msgstr "Мастер"
 
-#: globals.cc:555
+#: globals.cc:556
 msgid "Control"
 msgstr ""
 
-#: globals.cc:556
+#: globals.cc:557
 msgid "Click"
 msgstr ""
 
-#: globals.cc:557
+#: globals.cc:558
 msgid "Mackie"
 msgstr "Mackie"
 
@@ -1080,110 +1079,113 @@ msgstr ""
 msgid "Unknown"
 msgstr "Неизвестный"
 
-#: instrument_info.cc:227
+#: instrument_info.cc:243
 msgid "preset %1 (bank %2)"
 msgstr "Предустановки %1 (банк %2)"
 
-#: internal_send.cc:315 internal_send.cc:316
+#: internal_send.cc:338 internal_send.cc:339
 msgid "%1 - cannot find any track/bus with the ID %2 to connect to"
 msgstr "%1 - не удалось найти любую дорожку/шину с ID %2 для подключения к"
 
-#: io.cc:209
+#: io.cc:212
 msgid "IO: cannot disconnect port %1 from %2"
 msgstr "IO: не удалось отключить порт %1 из %2"
 
-#: io.cc:344 io.cc:431
+#: io.cc:347 io.cc:435
 msgid "IO: cannot register input port %1"
 msgstr "IO: не удалось зарегистрировать входной порт %1"
 
-#: io.cc:349 io.cc:436
+#: io.cc:352 io.cc:440
 msgid "IO: cannot register output port %1"
 msgstr "IO: не удалось зарегистрировать выходной порт %1"
 
-#: io.cc:599 io.cc:655
+#: io.cc:607 io.cc:668
 msgid "incorrect XML node \"%1\" passed to IO object"
 msgstr "Неправильный XML узел \"%1\" одобренный для объекта IO"
 
-#: io.cc:717
+#: io.cc:730
 msgid "in"
 msgstr "в"
 
-#: io.cc:717
+#: io.cc:730
 msgid "out"
 msgstr "за"
 
-#: io.cc:718
+#: io.cc:731
 msgid "input"
 msgstr "вход"
 
-#: io.cc:718
+#: io.cc:731
 msgid "output"
 msgstr "выход"
 
-#: io.cc:728
+#: io.cc:741
 msgid "Unknown bundle \"%1\" listed for %2 of %3"
 msgstr "Неизвестный пакет \"%1\" в списке для %2 из %3"
 
-#: io.cc:794
+#: io.cc:807
 msgid "Bundle %1 was not available - \"%2\" used instead"
 msgstr "Пакет %1 не был доступен - \"%2\" использован вместо него"
 
-#: io.cc:797
+#: io.cc:810
 msgid "No %1 bundles available as a replacement"
 msgstr "Нет %1 пакетов, доступных в качестве замены"
 
-#: io.cc:901
+#: io.cc:914
 msgid "%1: cannot create I/O ports"
 msgstr "%1: не удалось создать порты ввода/вывода"
 
-#: io.cc:1029 io.cc:1130
+#: io.cc:1042 io.cc:1143
 msgid "IO: badly formed string in XML node for inputs \"%1\""
 msgstr "IO: плохо сформированная строка в XML узле для входов \"%1\""
 
-#: io.cc:1034 io.cc:1135
+#: io.cc:1047 io.cc:1148
 msgid "bad input string in XML node \"%1\""
 msgstr "Плохая входная строка в XML узле \"%1\""
 
-#: io.cc:1073
+#: io.cc:1086
 msgid "IO: badly formed string in XML node for outputs \"%1\""
 msgstr "IO: плохо сформированная строка в XML узле для выходов \"%1\""
 
-#: io.cc:1078
+#: io.cc:1091
 msgid "IO: bad output string in XML node \"%1\""
 msgstr "IO: плохая выходная строка в XML узле \"%1\""
 
-#: io.cc:1416
+#: io.cc:1256 plugin.cc:275
+msgid "Out"
+msgstr ""
+
+#: io.cc:1256 plugin.cc:273
+msgid "In"
+msgstr ""
+
+#: io.cc:1454
 #, c-format
 msgid "%s %u"
 msgstr "%s %u"
 
-#: io.cc:1463
+#: io.cc:1501
 #, c-format
 msgid "%s in"
 msgstr "%s вх."
 
-#: io.cc:1465
+#: io.cc:1503
 #, c-format
 msgid "%s out"
 msgstr "%s вых."
 
-#: io.cc:1540 session.cc:842 session.cc:876
+#: io.cc:1578 session.cc:957 session.cc:991
 msgid "mono"
 msgstr "Моно"
 
-#: io.cc:1542 session.cc:855 session.cc:890
+#: io.cc:1580 session.cc:970 session.cc:1005
 msgid "L"
 msgstr "L"
 
-#: io.cc:1542 session.cc:857 session.cc:892
+#: io.cc:1580 session.cc:972 session.cc:1007
 msgid "R"
 msgstr "R"
 
-#: io.cc:1544 io.cc:1550
-#, c-format
-msgid "%d"
-msgstr "%d"
-
 #: ladspa_plugin.cc:93
 msgid "LADSPA: Unable to open module: "
 msgstr "LADSPA: Невозможно открыть модуль:"
@@ -1202,7 +1204,7 @@ msgstr ""
 "LADSPA: \"%1\" не может быть использован, т. к . он не может выполнить "
 "INPLACE обработку"
 
-#: ladspa_plugin.cc:311
+#: ladspa_plugin.cc:308
 msgid ""
 "illegal parameter number used with plugin \"%1\". This may indicate a change "
 "in the plugin design, and presets may be invalid"
@@ -1210,75 +1212,75 @@ msgstr ""
 "использован некорректный номер параметра, использованного с плагином \"%1\". "
 "Это может указывать на дизайн плагина или пресеты может быть некорректными"
 
-#: ladspa_plugin.cc:390 ladspa_plugin.cc:440
+#: ladspa_plugin.cc:387 ladspa_plugin.cc:437
 msgid "Bad node sent to LadspaPlugin::set_state"
 msgstr "Отправлен плохой пакет LadspaPlugin::set_state"
 
-#: ladspa_plugin.cc:405 ladspa_plugin.cc:454
+#: ladspa_plugin.cc:402 ladspa_plugin.cc:451
 msgid "LADSPA: no ladspa port number"
 msgstr "LADSPA: нет номера порта LADSPA"
 
-#: ladspa_plugin.cc:411 ladspa_plugin.cc:460
+#: ladspa_plugin.cc:408 ladspa_plugin.cc:457
 msgid "LADSPA: no ladspa port data"
 msgstr "LADSPA: нет данных порта LADSPA"
 
-#: ladspa_plugin.cc:842
+#: ladspa_plugin.cc:863
 msgid "Could not locate HOME.  Preset not removed."
 msgstr "Невозможно найти HOME. Предустановки не удалены."
 
-#: ladspa_plugin.cc:881 ladspa_plugin.cc:887
+#: ladspa_plugin.cc:902 ladspa_plugin.cc:908
 msgid "Could not create %1.  Preset not saved. (%2)"
 msgstr "Не удалось создать %1. Предустановки не сохранены. (%2)"
 
-#: ladspa_plugin.cc:894
+#: ladspa_plugin.cc:915
 msgid "Error saving presets file %1."
 msgstr "Ошибка сохранения файла пресетов %1."
 
-#: ladspa_plugin.cc:936
+#: ladspa_plugin.cc:957
 msgid "Could not locate HOME.  Preset not saved."
 msgstr "Невозможно найти HOME. Предустановки не сохранены."
 
-#: location.cc:459
+#: location.cc:455
 msgid "You cannot put a CD marker at this position"
 msgstr "Вы не можете поставить CD-маркер в это положение"
 
-#: location.cc:611
+#: location.cc:607
 msgid "incorrect XML node passed to Location::set_state"
 msgstr "некорректный XML узел одобрен для Location::set_state"
 
-#: location.cc:616
+#: location.cc:612
 msgid "XML node for Location has no ID information"
 msgstr "У XML-узла позиции нет данных ID"
 
-#: location.cc:620
+#: location.cc:616
 msgid "XML node for Location has no name information"
 msgstr "У XML-узла позиции нет данных имени"
 
-#: location.cc:627
+#: location.cc:623
 msgid "XML node for Location has no start information"
 msgstr "У XML-узла позиции нет данных о начале"
 
-#: location.cc:638
+#: location.cc:634
 msgid "XML node for Location has no end information"
 msgstr "У XML-узла позиции нет данных о конце"
 
-#: location.cc:645
+#: location.cc:641
 msgid "XML node for Location has no flags information"
 msgstr "У XML-узла позиции нет данных о флагах"
 
-#: location.cc:872
+#: location.cc:868
 msgid "Locations: attempt to use unknown location as selected location"
 msgstr "Позиции: попытка использовать неизвестную позицию как выбранную"
 
-#: location.cc:1050
+#: location.cc:1046
 msgid "incorrect XML mode passed to Locations::set_state"
 msgstr "Неверный режим XML одобрен для Locations::set_state"
 
-#: location.cc:1063 session.cc:1542 session.cc:5722 session_state.cc:1169
+#: location.cc:1059 session.cc:1667 session.cc:6305 session_state.cc:1205
 msgid "session"
 msgstr "Сесссия"
 
-#: location.cc:1130
+#: location.cc:1126
 msgid "could not load location from session file - ignored"
 msgstr "Не удалось загрузить позицию из файла сессии, проигнорировано"
 
@@ -1359,6 +1361,46 @@ msgstr "Частота кадров сессии и LTC не соответст
 msgid "flywheel"
 msgstr "Маховик"
 
+#: lua_api.cc:87
+msgid "Script with given name was not found\n"
+msgstr ""
+
+#: lua_api.cc:96
+msgid "Failed to instantiate Lua Processor\n"
+msgstr ""
+
+#: luaproc.cc:876
+msgid "Failed to load Lua script from session state."
+msgstr ""
+
+#: luaproc.cc:886
+msgid "Session State for LuaProcessor did not include a Lua script."
+msgstr ""
+
+#: luaproc.cc:890
+msgid "Invalid/incompatible Lua script found for LuaProcessor."
+msgstr ""
+
+#: luaproc.cc:918
+msgid "Bad node sent to LuaProc::set_state"
+msgstr ""
+
+#: luaproc.cc:928
+msgid "LuaProc: port has no symbol, ignored"
+msgstr ""
+
+#: luaproc.cc:934
+msgid "LuaProc: port has no value, ignored"
+msgstr ""
+
+#: luaproc.cc:1164
+msgid "Unable to create LuaProc presets directory"
+msgstr ""
+
+#: luascripting.cc:132
+msgid "Script '%1' has no valid descriptor."
+msgstr ""
+
 #: midi_diskstream.cc:172
 msgid ""
 "%1: I/O configuration change %4 requested to use %2, but channel setup is %3"
@@ -1440,19 +1482,19 @@ msgstr ""
 msgid "Scene "
 msgstr "Сцена"
 
-#: midi_source.cc:125
+#: midi_source.cc:126
 msgid "Missing parameter property on InterpolationStyle"
 msgstr "Отсутствует сойства параметра на InterpolationStyle"
 
-#: midi_source.cc:131
+#: midi_source.cc:132
 msgid "Missing style property on InterpolationStyle"
 msgstr "Отсутствует стиль свойств на InterpolationStyle"
 
-#: midi_source.cc:140
+#: midi_source.cc:141
 msgid "Missing parameter property on AutomationState"
 msgstr "Отсутствует свойства параметра на AutomationState"
 
-#: midi_source.cc:146
+#: midi_source.cc:147
 msgid "Missing state property on AutomationState"
 msgstr "Отсутствуют свойства состояния на AutomationState"
 
@@ -1460,39 +1502,39 @@ msgstr "Отсутствуют свойства состояния на Automati
 msgid "MIDI stretch created non-MIDI source"
 msgstr "Растягивание MIDI создало не-MIDI источник"
 
-#: monitor_processor.cc:53
+#: monitor_processor.cc:54
 msgid "monitor dim"
 msgstr "Заглушение монитора"
 
-#: monitor_processor.cc:54
+#: monitor_processor.cc:55
 msgid "monitor cut"
 msgstr "Подрезание монитора"
 
-#: monitor_processor.cc:55
+#: monitor_processor.cc:56
 msgid "monitor mono"
 msgstr "Монитор моно"
 
-#: monitor_processor.cc:58
+#: monitor_processor.cc:59
 msgid "monitor dim level"
 msgstr "Уровень затемнения монитора"
 
-#: monitor_processor.cc:62
+#: monitor_processor.cc:63
 msgid "monitor solo boost level"
 msgstr "Монитор уровень усиления соло"
 
-#: monitor_processor.cc:511
+#: monitor_processor.cc:543
 msgid "cut control %1"
 msgstr "Вырезать управление %1"
 
-#: monitor_processor.cc:512
+#: monitor_processor.cc:544
 msgid "dim control"
 msgstr "Контроль тусклости"
 
-#: monitor_processor.cc:513
+#: monitor_processor.cc:545
 msgid "polarity control"
 msgstr "Контроль полярности"
 
-#: monitor_processor.cc:514
+#: monitor_processor.cc:546
 msgid "solo control"
 msgstr "Контроль соло"
 
@@ -1568,7 +1610,7 @@ msgstr "Копирование области"
 msgid "fixed time region copy"
 msgstr "Фиксированное время копирования области"
 
-#: pannable.cc:207
+#: pannable.cc:208
 msgid "Pannable given XML data for %1 - ignored"
 msgstr ""
 "Пригодность к панорамированию согласно XML-данным для %1, проигнорировано"
@@ -1593,7 +1635,7 @@ msgstr "PannerManager: модуль \"%1\" не имеет функции дес
 msgid "no panner discovered for in/out = %1/%2"
 msgstr "Не обнаружен паннер для входа/выхода  =%1/%2"
 
-#: panner_shell.cc:121
+#: panner_shell.cc:122
 msgid ""
 "No panner found: check that panners are being discovered correctly during "
 "startup."
@@ -1601,25 +1643,73 @@ msgstr ""
 "Паннер не найден:  убедитесь, что паннеры обнаруживаются правильно во время "
 "запуска."
 
-#: panner_shell.cc:125
+#: panner_shell.cc:126
 msgid "select panner: %1\n"
 msgstr "Выбор панорамирования: %1\n"
 
-#: panner_shell.cc:254
+#: panner_shell.cc:257
 msgid "Unknown panner plugin \"%1\" found in pan state - ignored"
 msgstr ""
 "Найден неизвестный паннер-плагин \"%1\" в состоянии панорамирования. "
 "Игнорировано"
 
-#: panner_shell.cc:260
+#: panner_shell.cc:263
 msgid "panner plugin node has no type information!"
 msgstr "Узел паннер-плагина не имеет информации о типе!"
 
-#: playlist.cc:2179
+#: parameter_descriptor.cc:201
+msgid "Note|C"
+msgstr ""
+
+#: parameter_descriptor.cc:202
+msgid "Note|C#"
+msgstr ""
+
+#: parameter_descriptor.cc:203
+msgid "Note|D"
+msgstr ""
+
+#: parameter_descriptor.cc:204
+msgid "Note|D#"
+msgstr ""
+
+#: parameter_descriptor.cc:205
+msgid "Note|E"
+msgstr ""
+
+#: parameter_descriptor.cc:206
+msgid "Note|F"
+msgstr ""
+
+#: parameter_descriptor.cc:207
+msgid "Note|F#"
+msgstr ""
+
+#: parameter_descriptor.cc:208
+msgid "Note|G"
+msgstr ""
+
+#: parameter_descriptor.cc:209
+msgid "Note|G#"
+msgstr ""
+
+#: parameter_descriptor.cc:210
+msgid "Note|A"
+msgstr ""
+
+#: parameter_descriptor.cc:211
+msgid "Note|A#"
+msgstr ""
+
+#: parameter_descriptor.cc:212
+msgid "Note|B"
+msgstr ""
+
+#: playlist.cc:2234
 msgid "region state node has no ID, ignored"
 msgstr "Состояние узла области не имеет ID, проигнорировано"
 
-#: playlist.cc:2197
+#: playlist.cc:2252
 msgid "Playlist: cannot create region from XML"
 msgstr "Плейлист: не удалось создать область из XML"
 
@@ -1632,7 +1722,27 @@ msgid "Could not construct playlist for PlaylistSource from session data!"
 msgstr ""
 "Не удалось построить список воспр. для PlaylistSource из данных сессии!"
 
-#: plugin.cc:346
+#: plugin.cc:126
+msgid "Cannot remove plugin factory preset."
+msgstr ""
+
+#: plugin.cc:144
+msgid "Preset with given name already exists."
+msgstr ""
+
+#: plugin.cc:263
+msgid "Audio"
+msgstr "Аудио"
+
+#: plugin.cc:266
+msgid "Midi"
+msgstr ""
+
+#: plugin.cc:269
+msgid "?"
+msgstr ""
+
+#: plugin.cc:412
 msgid ""
 "Plugin presets are not supported in this build of %1. Consider paying for a "
 "full version"
@@ -1640,7 +1750,7 @@ msgstr ""
 "Настройки плагина не поддерживаются в этой сборке %1. Рассмотрите "
 "возможность оплаты за полную версию"
 
-#: plugin.cc:429
+#: plugin.cc:495
 msgid ""
 "Saving plugin settings is not supported in this build of %1. Consider paying "
 "for the full version"
@@ -1648,23 +1758,27 @@ msgstr ""
 "Сохранение настроек плагина не поддерживаются в этой сборке %1. Рассмотрите "
 "возможность оплаты за полную версию"
 
-#: plugin_insert.cc:597
+#: plugin_insert.cc:1148
 msgid "programming error: "
 msgstr "Программная ошибка: "
 
-#: plugin_insert.cc:1022
+#: plugin_insert.cc:1700
+msgid "SC %1"
+msgstr ""
+
+#: plugin_insert.cc:2352
 msgid "XML node describing plugin is missing the `type' field"
 msgstr "В XML-узле описания плагина отсутствует поле `type'"
 
-#: plugin_insert.cc:1037
+#: plugin_insert.cc:2369
 msgid "unknown plugin type %1 in plugin insert state"
 msgstr "Неизвестный тип плагина %1 в статусе вставки плагина"
 
-#: plugin_insert.cc:1065
+#: plugin_insert.cc:2397
 msgid "Plugin has no unique ID field"
 msgstr "Плагин не имеет уникального идентификационного поля"
 
-#: plugin_insert.cc:1090
+#: plugin_insert.cc:2435
 msgid ""
 "Found a reference to a plugin (\"%1\") that is unknown.\n"
 "Perhaps it was removed or moved since it was last used."
@@ -1673,171 +1787,175 @@ msgstr ""
 "Возможно, он был удален или перемещен с тех пор, как был в последний раз "
 "использован."
 
-#: plugin_insert.cc:1247
+#: plugin_insert.cc:2645
 msgid "PluginInsert: Auto: no ladspa port number"
 msgstr "PluginInsert: Auto: нет номера порта LADSPA"
 
-#: plugin_insert.cc:1254
+#: plugin_insert.cc:2652
 msgid "PluginInsert: Auto: port id out of range"
 msgstr "PluginInsert: Auto: ID порта вне диапазона"
 
-#: plugin_insert.cc:1290
+#: plugin_insert.cc:2688
 msgid "PluginInsert: automatable control %1 not found - ignored"
 msgstr ""
 "PluginInsert: управление возможностью автоматизизации %1 не найдено. "
 "Игнорировано"
 
-#: plugin_manager.cc:217
+#: plugin_manager.cc:220
 msgid "Discovering Plugins"
 msgstr "Обнаружение модулей"
 
-#: plugin_manager.cc:245
+#: plugin_manager.cc:251
 msgid "Scanning LADSPA Plugins"
 msgstr "Сканирование плагинов LADSPA"
 
-#: plugin_manager.cc:248
+#: plugin_manager.cc:253
+msgid "Scanning Lua DSP Processors"
+msgstr ""
+
+#: plugin_manager.cc:256
 msgid "Scanning LV2 Plugins"
 msgstr "Сканирование плагинов LV2"
 
-#: plugin_manager.cc:254
+#: plugin_manager.cc:262
 msgid "Scanning Windows VST Plugins"
 msgstr "Сканирование плагинов Windows VST"
 
-#: plugin_manager.cc:256
+#: plugin_manager.cc:264
 msgid "Discovering Windows VST Plugins"
 msgstr ""
 
-#: plugin_manager.cc:265
+#: plugin_manager.cc:273
 msgid "Scanning Linux VST Plugins"
 msgstr "Сканирование плагинов Linux VST"
 
-#: plugin_manager.cc:267
+#: plugin_manager.cc:275
 msgid "Discovering Linux VST Plugins"
 msgstr ""
 
-#: plugin_manager.cc:280
+#: plugin_manager.cc:288
 msgid "VST Blacklist: "
 msgstr "Чёрный список VST"
 
-#: plugin_manager.cc:282
+#: plugin_manager.cc:290
 msgid "VST Blacklist:"
 msgstr "Чёрный список VST:"
 
-#: plugin_manager.cc:292
+#: plugin_manager.cc:300
 msgid "Scanning AU Plugins"
 msgstr "Сканирование плагинов AU"
 
-#: plugin_manager.cc:294
+#: plugin_manager.cc:302
 msgid "Discovering AU Plugins"
 msgstr ""
 
-#: plugin_manager.cc:299
+#: plugin_manager.cc:307
 msgid "Plugin Scan Complete..."
 msgstr "Сканирование плагинов завершено"
 
-#: plugin_manager.cc:483
+#: plugin_manager.cc:513
 msgid "LADSPA"
 msgstr "LADSPA"
 
-#: plugin_manager.cc:535
+#: plugin_manager.cc:565
 msgid "Could not parse rdf file: %1"
 msgstr "Не удалось проанализировать RDF-файл: %1"
 
-#: plugin_manager.cc:572
+#: plugin_manager.cc:602
 msgid "LADSPA: cannot load module \"%1\" (%2)"
 msgstr "LADSPA: не удалось загрузить модуль \"%1\" (%2)"
 
-#: plugin_manager.cc:579
+#: plugin_manager.cc:609
 msgid "LADSPA: module \"%1\" has no descriptor function."
 msgstr "LADSPA: модуль \"%1\" не имеет функции дескриптора."
 
-#: plugin_manager.cc:778
+#: plugin_manager.cc:813
 msgid "--- Windows VST plugins Scan: %1"
 msgstr ""
 
-#: plugin_manager.cc:784
+#: plugin_manager.cc:819
 msgid "VST"
 msgstr "VST"
 
-#: plugin_manager.cc:789
+#: plugin_manager.cc:824
 msgid "--- Windows VST plugins Scan Done"
 msgstr ""
 
-#: plugin_manager.cc:804
+#: plugin_manager.cc:839
 msgid "cannot open dll"
 msgstr ""
 
-#: plugin_manager.cc:808
+#: plugin_manager.cc:843
 msgid "invalid dll, file too small"
 msgstr ""
 
-#: plugin_manager.cc:812
+#: plugin_manager.cc:847
 msgid "not a dll"
 msgstr ""
 
-#: plugin_manager.cc:818
+#: plugin_manager.cc:853
 msgid "cannot determine dll type"
 msgstr ""
 
-#: plugin_manager.cc:822
+#: plugin_manager.cc:857
 msgid "cannot read dll PE header"
 msgstr ""
 
-#: plugin_manager.cc:827
+#: plugin_manager.cc:862
 msgid "invalid dll PE header"
 msgstr ""
 
-#: plugin_manager.cc:834
+#: plugin_manager.cc:869
 msgid "i386 (32-bit)"
 msgstr "i386 (32-bit)"
 
-#: plugin_manager.cc:837
+#: plugin_manager.cc:872
 msgid "Itanium"
 msgstr "Itanium"
 
-#: plugin_manager.cc:840
+#: plugin_manager.cc:875
 msgid "x64 (64-bit)"
 msgstr "x64 (64-bit)"
 
-#: plugin_manager.cc:843
+#: plugin_manager.cc:878
 msgid "Native Architecture"
 msgstr ""
 
-#: plugin_manager.cc:846
+#: plugin_manager.cc:881
 msgid "Unknown Architecture"
 msgstr ""
 
-#: plugin_manager.cc:862
+#: plugin_manager.cc:897
 msgid " *  %1 (cache only)"
 msgstr ""
 
-#: plugin_manager.cc:864
+#: plugin_manager.cc:899
 msgid " *  %1 - %2"
 msgstr ""
 
-#: plugin_manager.cc:878
+#: plugin_manager.cc:913
 msgid " -> Cannot get Windows VST information, plugin ignored."
 msgstr ""
 
-#: plugin_manager.cc:889
+#: plugin_manager.cc:924
 msgid ""
 "VST plugin %1 does not support processReplacing, and cannot be used in %2 at "
 "this time"
 msgstr ""
 
-#: plugin_manager.cc:924
+#: plugin_manager.cc:959
 msgid "Ignoring duplicate Windows VST plugin \"%1\""
 msgstr ""
 
-#: plugin_manager.cc:936
+#: plugin_manager.cc:971
 msgid " -> OK (VST Plugin \"%1\" was added)."
 msgstr ""
 
-#: plugin_manager.cc:984
+#: plugin_manager.cc:1019
 msgid "LXVST"
 msgstr "LXVST"
 
-#: plugin_manager.cc:1011
+#: plugin_manager.cc:1046
 msgid ""
 "linuxVST plugin %1 does not support processReplacing, and so cannot be used "
 "in %2 at this time"
@@ -1845,15 +1963,15 @@ msgstr ""
 "linuxVST плагин %1 не поддерживает processReplacing и поэтому не может быть "
 "использован в %2 в это время"
 
-#: plugin_manager.cc:1175
+#: plugin_manager.cc:1213
 msgid "unknown plugin status type \"%1\" - all entries ignored"
 msgstr "неизвестный статус типа плагина \"%1\". Все данные проигнорированы"
 
-#: plugin_manager.cc:1192
+#: plugin_manager.cc:1232
 msgid "unknown plugin type \"%1\" - ignored"
 msgstr "Неизвестный тип плагина \"%1\" - проигнорирован"
 
-#: port.cc:462
+#: port.cc:504
 msgid "could not reregister %1"
 msgstr "Не удалось перерегистрировать %1"
 
@@ -1869,7 +1987,7 @@ msgstr "Во вставке XML-узла описания порта отсут
 msgid "non-port insert XML used for port plugin insert"
 msgstr "Использована беспортовая вставка XML для вставки порта плагина"
 
-#: port_manager.cc:285
+#: port_manager.cc:288
 msgid ""
 "a port with the name \"%1\" already exists: check for duplicated track/bus "
 "names"
@@ -1877,7 +1995,7 @@ msgstr ""
 "Порт с именем \"%1\" уже существует: проверьте дублированные имена дорожек/"
 "шин "
 
-#: port_manager.cc:287
+#: port_manager.cc:290
 msgid ""
 "No more ports are available. You will need to stop %1 and restart with more "
 "ports if you need this many tracks."
@@ -1885,27 +2003,27 @@ msgstr ""
 "Больше портов нет. Вам нужно будет остановить и перезапустить %1 с большим "
 "количеством портов, если вам нужно много дорожек."
 
-#: port_manager.cc:290
+#: port_manager.cc:293
 msgid "AudioEngine: cannot register port \"%1\": %2"
 msgstr "AudioEngine: не удалось зарегистрировать порт \"%1\": %2"
 
-#: port_manager.cc:329
+#: port_manager.cc:332
 msgid "unable to create port: %1"
 msgstr "Не удалось создать порт: %1"
 
-#: port_manager.cc:416
+#: port_manager.cc:453
 msgid "AudioEngine: cannot connect %1 (%2) to %3 (%4)"
 msgstr "AudioEngine: не удалось подключить %1 (%2) к %3 (%4)"
 
-#: port_manager.cc:468 port_manager.cc:469
+#: port_manager.cc:505 port_manager.cc:506
 msgid "Re-establising port %1 failed"
 msgstr "Переустановка порта %1 не удалась"
 
-#: processor.cc:214
+#: processor.cc:218
 msgid "No %1 property flag in element %2"
 msgstr "Нет %1 флага свойств в элементе %2"
 
-#: processor.cc:223
+#: processor.cc:227
 msgid "No child node with active property"
 msgstr "Нет дочернего  узла с активными свойствами"
 
@@ -1969,123 +2087,111 @@ msgstr ""
 msgid "Error writing saved template file %1 (%2)"
 msgstr ""
 
-#: region_factory.cc:78 region_factory.cc:120 region_factory.cc:161
-#: region_factory.cc:203
+#: region_factory.cc:78 region_factory.cc:121 region_factory.cc:162
+#: region_factory.cc:204
 msgid ""
 "programming error: RegionFactory::create() called with unknown Region type"
 msgstr ""
 "Ошибка в программе: RegionFactory::create() вызывается с неизвестным типом "
 "области"
 
-#: region_factory.cc:565
+#: region_factory.cc:566
 msgid "%1 compound-%2 (%3)"
 msgstr "%1 соединение-%2 (%3)"
 
-#: region_factory.cc:567
+#: region_factory.cc:568
 msgid "%1 compound-%2.1 (%3)"
 msgstr "%1 соединение-%2.1 (%3)"
 
-#: region_factory.cc:629
+#: region_factory.cc:630
 msgid "cannot create new name for region \"%1\""
 msgstr "Невозможно создать новое имя для области \"%1\""
 
-#: resampled_source.cc:106
+#: resampled_source.cc:107
 msgid "Import: %1"
 msgstr "Импорт: %1"
 
-#: resampled_source.cc:135 srcfilesource.cc:75
+#: resampled_source.cc:136 srcfilesource.cc:75
 msgid "Import: src_new() failed : %1"
 msgstr "Импорт: src_new() не удался: %1"
 
-#: return.cc:41
+#: return.cc:42
 msgid "return %1"
 msgstr "Возврат %1"
 
-#: route.cc:840
-msgid "Cleared Explicit solo: %1\n"
-msgstr ""
-
-#: route.cc:843
-msgid "Cleared Implicit solo: %1 up:%2 down:%3\n"
-msgstr ""
-
-#: route.cc:1370 route.cc:2982
+#: route.cc:862 route.cc:2797
 msgid "unknown Processor type \"%1\"; ignored"
 msgstr "Неизвестный тип процессора \"%1\". Игнорирован"
 
-#: route.cc:1392
+#: route.cc:884
 msgid "processor could not be created. Ignored."
 msgstr "Процессор не может быть создан. Игнорирован"
 
-#: route.cc:2405 route.cc:2630
+#: route.cc:2338 route.cc:2504
 msgid "Bad node sent to Route::set_state() [%1]"
 msgstr "Отправлен плохой узел в Route::set_state() [%1]"
 
-#: route.cc:2465
+#: route.cc:2395
 msgid "Pannable state found for route (%1) without a panner!"
 msgstr "Статус панаромирования найден для маршрута (%1) без паннера!"
 
-#: route.cc:2539 route.cc:2543 route.cc:2744 route.cc:2748
-msgid "badly formed order key string in state file! [%1] ... ignored."
-msgstr ""
-"Плохо сформированная строка порядкового ключа в файле состояния! [%1] ... "
-"игнорирован."
-
-#: route.cc:2754
-msgid "Converting deprecated order key for %1 using Editor order %2"
+#: route.cc:3270
+msgid "Invalid Solo-Isolate propagation: from:%1 new:%2 - old:%3 = delta:%4"
 msgstr ""
-"Преобразование устаревшего порядкового ключа для %1 с использованием "
-"редактора порядка %2"
 
-#: route.cc:3388
-msgid "Invalid Solo-Isolate propagation: from:%1 new:%2 - old:%3 = delta:%4"
+#: route.cc:4396
+msgid "Amp/Fader on Route '%1' went AWOL. Re-added."
 msgstr ""
 
-#: route.cc:5333
+#: route.cc:4994
 msgid "lo"
 msgstr ""
 
-#: route.cc:5335
+#: route.cc:4996
 msgid "mid"
 msgstr ""
 
-#: route.cc:5337
+#: route.cc:4998
 msgid "hi"
 msgstr ""
 
-#: route.cc:5444
+#: route.cc:5105
 msgid "Leveler"
 msgstr "Выравниватель"
 
-#: route.cc:5446
+#: route.cc:5107
 msgid "Compressor"
 msgstr "Компрессор"
 
-#: route.cc:5448
+#: route.cc:5109 route.cc:5111
 msgid "Limiter"
 msgstr "Ограничитель"
 
-#: route.cc:5451 route.cc:5453 route.cc:5469 route.cc:5471
+#: route.cc:5111
+msgid "Sidechain"
+msgstr ""
+
+#: route.cc:5114 route.cc:5116 route.cc:5133 route.cc:5135
 msgid "???"
 msgstr ""
 
-#: route.cc:5463
+#: route.cc:5126
 msgid "Attk"
 msgstr ""
 
-#: route.cc:5465
+#: route.cc:5128
 msgid "Ratio"
 msgstr ""
 
-#: route.cc:5467
+#: route.cc:5131
 msgid "Rels"
 msgstr ""
 
-#: route_group.cc:459
+#: route_group.cc:507
 msgid "You cannot subgroup MIDI tracks at this time"
 msgstr "Сейчас вы не можете подгруппировать MIDI-дорожки"
 
-#: route_group.cc:466
+#: route_group.cc:514
 msgid ""
 "You cannot subgroup tracks with different number of outputs at this time."
 msgstr ""
@@ -2098,128 +2204,128 @@ msgstr "tempoize: Ошибка чтения данных из %1 на %2 (ожи
 msgid "error writing tempo-adjusted data to %1"
 msgstr "Ошибка записи темпа с поправкой на данные в %1"
 
-#: send.cc:61
+#: send.cc:62
 msgid "aux %1"
 msgstr "aux %1"
 
-#: send.cc:65
+#: send.cc:66
 msgid "send %1"
 msgstr "Отправить %1"
 
-#: send.cc:67
+#: send.cc:68
 msgid "programming error: send created using role %1"
 msgstr "ошибка в программе: отправка создана при помощи ролей %1"
 
-#: session.cc:317 session.cc:371
+#: session.cc:348 session.cc:403
 msgid "Cannot connect to audio/midi engine"
 msgstr ""
 
-#: session.cc:327
+#: session.cc:358
 msgid "Session initialization failed"
 msgstr ""
 
-#: session.cc:343
+#: session.cc:374
 msgid "Failed to load template/snapshot state"
 msgstr ""
 
-#: session.cc:354
+#: session.cc:385
 msgid "Failed to load state"
 msgstr ""
 
-#: session.cc:377
+#: session.cc:409
 msgid "Cannot configure audio/midi engine with session parameters"
 msgstr ""
 
-#: session.cc:400
+#: session.cc:433
 msgid "Connect to engine"
 msgstr "Соединение со звуковым движком"
 
-#: session.cc:451
+#: session.cc:484
 msgid "Session loading complete"
 msgstr "Загрузка сессии завершена"
 
-#: session.cc:522
+#: session.cc:575
 msgid "Set up LTC"
 msgstr "Настройка LTC"
 
-#: session.cc:524
+#: session.cc:577
 msgid "Set up Click"
 msgstr "Настройка Click"
 
-#: session.cc:526
+#: session.cc:579
 msgid "Set up standard connections"
 msgstr "Настройка обычных соединений"
 
-#: session.cc:773
+#: session.cc:888
 msgid "could not setup Click I/O"
 msgstr "не удалость настроить Click I/O"
 
-#: session.cc:836
+#: session.cc:951
 #, c-format
 msgid "out %s"
 msgstr "out %s"
 
-#: session.cc:838
+#: session.cc:953
 #, c-format
 msgid "out %<PRIu32>"
 msgstr "out %<PRIu32>"
 
-#: session.cc:853
+#: session.cc:968
 #, c-format
 msgid "out %<PRIu32>+%<PRIu32>"
 msgstr "out %<PRIu32>+%<PRIu32>"
 
-#: session.cc:870
+#: session.cc:985
 #, c-format
 msgid "in %s"
 msgstr "in %s"
 
-#: session.cc:872
+#: session.cc:987
 #, c-format
 msgid "in %<PRIu32>"
 msgstr "in %<PRIu32>"
 
-#: session.cc:887
+#: session.cc:1002
 #, c-format
 msgid "in %<PRIu32>+%<PRIu32>"
 msgstr "in %<PRIu32>+%<PRIu32>"
 
-#: session.cc:967
+#: session.cc:1082
 msgid "cannot connect master output %1 to %2"
 msgstr "Не удалось подключить выход master %1 к %2"
 
-#: session.cc:1050
+#: session.cc:1170
 msgid "Cannot create monitor section. 'Monitor' Port name is not unique."
 msgstr ""
 
-#: session.cc:1084 session.cc:1210
+#: session.cc:1204 session.cc:1335
 msgid "cannot connect control input %1 to %2"
 msgstr "Не удалось подключить управление входа %1 к %2"
 
-#: session.cc:1104 session.cc:1229
+#: session.cc:1224 session.cc:1354
 msgid "The preferred I/O for the monitor bus (%1) cannot be found"
 msgstr "Предпочитаемый I/O для шины монитора (%1) не может быть найден"
 
-#: session.cc:1135 session.cc:1260
+#: session.cc:1255 session.cc:1385
 msgid "cannot connect control output %1 to %2"
 msgstr "Не удалось подключить управления выходом %1 к %2"
 
-#: session.cc:1318
+#: session.cc:1443
 msgid "cannot create Auditioner: no auditioning of regions possible"
 msgstr "Невозможно создать Auditioner: прослушивание областей невозможно"
 
-#: session.cc:1519
+#: session.cc:1644
 msgid "Session: you can't use that location for auto punch (start <= end)"
 msgstr ""
 "Сессия: вы не можете использовать эту позицию для автоврезки (начало <= "
 "конец)"
 
-#: session.cc:1546
+#: session.cc:1671
 msgid "Session: you can't use that location for session start/end)"
 msgstr ""
 "Сессия: вы не можете использовать эту позицию в качестве начала/конца сессии"
 
-#: session.cc:1578
+#: session.cc:1703
 msgid ""
 "You cannot use this location for auto-loop because it has zero or negative "
 "length"
@@ -2227,31 +2333,31 @@ msgstr ""
 "Вы не можете использовать эту позицию для автоцикла, поскольку у неё нулевая "
 "или отрицательная длительность"
 
-#: session.cc:1761
+#: session.cc:1886
 msgid "programming error: session range removed!"
 msgstr "Ошибка в программе: диапазон сессии удалён!"
 
-#: session.cc:2021
+#: session.cc:2158
 msgid "feedback loop setup between %1 and %2"
 msgstr "Настройка петли обратной связи между %1 и %2"
 
-#: session.cc:2281
+#: session.cc:2419
 msgid "Track "
 msgstr ""
 
-#: session.cc:2283
+#: session.cc:2421
 msgid "Audio "
 msgstr ""
 
-#: session.cc:2288
+#: session.cc:2426
 msgid "MIDI "
 msgstr ""
 
-#: session.cc:2363
+#: session.cc:2500
 msgid "Session: could not create new midi track."
 msgstr "Сессия: не удалось создать новую MIDI-дорожку"
 
-#: session.cc:2369
+#: session.cc:2506
 msgid ""
 "No more JACK ports are available. You will need to stop %1 and restart JACK "
 "with more ports if you need this many tracks."
@@ -2259,80 +2365,92 @@ msgstr ""
 "Доступных портов JACK больше нет. Вам нужно остановить %1 и перезапустить "
 "JACK с большим количеством портов, если вам нужно больше дорожек."
 
-#: session.cc:2889 session.cc:2897 session.cc:2981 session.cc:2989
+#: session.cc:2547 session.cc:2550
+msgid "Midi Bus"
+msgstr ""
+
+#: session.cc:2572
+msgid "cannot configure new midi bus input"
+msgstr ""
+
+#: session.cc:2578
+msgid "cannot configure new midi bus output"
+msgstr ""
+
+#: session.cc:2592 session.cc:3137
+msgid "Session: could not create new audio route."
+msgstr "Сессия: не удалось создать новый маршрут."
+
+#: session.cc:3022 session.cc:3030 session.cc:3113 session.cc:3121
 msgid "cannot configure %1 in/%2 out configuration for new audio track"
 msgstr ""
 "Не удалось настроить %1 в/%2 из конфигурации для новой звуковой дорожки"
 
-#: session.cc:2922
+#: session.cc:3050
 msgid "Session: could not create new audio track."
 msgstr "Сессия: не удалось создать новую звуковую дорожку."
 
-#: session.cc:2959 session.cc:2962
+#: session.cc:3088 session.cc:3091
 msgid "Bus"
 msgstr "Шина"
 
-#: session.cc:3014
-msgid "Session: could not create new audio route."
-msgstr "Сессия: не удалось создать новый маршрут."
-
-#: session.cc:3087 session.cc:3097
+#: session.cc:3207 session.cc:3217
 msgid "Session: UINT_MAX routes? impossible!"
 msgstr "Сессия: UINT_MAX маршруты? Невозможно!"
 
-#: session.cc:3130
+#: session.cc:3293
 msgid "Session: cannot create track/bus from template description"
 msgstr "Сессия: нельзя создать дорожку/шину из  шаблоннного описания"
 
-#: session.cc:3173
+#: session.cc:3331
 msgid "Session: could not create new route from template"
 msgstr "Сессия: не удалось создать новый маршрут из шаблона"
 
-#: session.cc:3207
+#: session.cc:3365
 msgid "Adding new tracks/busses failed"
 msgstr "Не удалось добавить новые дорожки/шины"
 
-#: session.cc:4445
+#: session.cc:4784
 msgid "Merging embedded file %1: name collision AND md5 hash collision!"
 msgstr "Слияние встроенного файла %1: противоречие названия и MD5 хеша!"
 
-#: session.cc:4575 session.cc:4648
+#: session.cc:4914 session.cc:4987
 msgid "There are already %1 recordings for %2, which I consider too many."
 msgstr "Уже есть %1 записей для %2, которых, считается, слишком много."
 
-#: session.cc:5090
+#: session.cc:5663
 msgid "send ID %1 appears to be in use already"
 msgstr "Отправленное ID %1, кажется, уже используется"
 
-#: session.cc:5102
+#: session.cc:5675
 msgid "aux send ID %1 appears to be in use already"
 msgstr "По-видимому, aux посыл ID %1 уже используется"
 
-#: session.cc:5114
+#: session.cc:5687
 msgid "return ID %1 appears to be in use already"
 msgstr "Возврат ID% 1, по-видимому, уже используется"
 
-#: session.cc:5126
+#: session.cc:5699
 msgid "insert ID %1 appears to be in use already"
 msgstr "По-видимому, вставка ID %1 уже используется"
 
-#: session.cc:5251
+#: session.cc:5825
 msgid "Cannot write a range where end <= start (e.g. %1 <= %2)"
 msgstr "Невозможно записать ряд, где конец <= пуска (например, %1 <= %2)"
 
-#: session.cc:5260
+#: session.cc:5834
 msgid "Cannot write a range with no data."
 msgstr "Невозможно записать область без данных."
 
-#: session.cc:5302
+#: session.cc:5876
 msgid "cannot create new file \"%1\" for %2"
 msgstr "невозможно создать новый файл \"%1\" для %2"
 
-#: session_click.cc:163
+#: session_click.cc:162
 msgid "cannot open click soundfile %1 (%2)"
 msgstr "Не удается открыть кликом звуковой файл %1 (%2)"
 
-#: session_click.cc:176
+#: session_click.cc:175
 msgid "cannot read data from click soundfile"
 msgstr "Не удалось считать данные от клика на звуковой файл"
 
@@ -2400,11 +2518,11 @@ msgstr ""
 msgid "Session: cannot have two events of type %1 at the same frame (%2)."
 msgstr "Сессия: не удалось получить два события типа %1 на том же кадре (%2)."
 
-#: session_export.cc:125
+#: session_export.cc:152
 msgid "%1: cannot seek to %2 for export"
 msgstr "% 1: невозможно искать на %2 для экспорта"
 
-#: session_export.cc:182
+#: session_export.cc:216
 msgid "Export ended unexpectedly: %1"
 msgstr "Экспорт закончился неожиданно: %1"
 
@@ -2416,11 +2534,11 @@ msgstr ""
 "LTC кодер: неверная частота кадров. LTC кодирование отключено для "
 "оставшегося в этой сессии."
 
-#: session_midi.cc:534
+#: session_midi.cc:570
 msgid "Session: cannot send quarter-frame MTC message (%1)"
 msgstr "Сессия: невозможно отправить четверть-кадровое MTC сообщение (%1)"
 
-#: session_playlists.cc:402 session_playlists.cc:421
+#: session_playlists.cc:405 session_playlists.cc:424
 msgid "Session: cannot create Playlist from XML description."
 msgstr "Сессия: невозможно создать список воспроизведения из описания XML."
 
@@ -2428,103 +2546,103 @@ msgstr "Сессия: невозможно создать список восп
 msgid "Session: error in no roll for %1"
 msgstr "Сессия: ошибка непрокрутки для %1"
 
-#: session_process.cc:1199
+#: session_process.cc:1202
 msgid "Programming error: illegal event type in process_event (%1)"
 msgstr "Ошибка в программе: некорректный тип события в process_event (%1)"
 
-#: session_state.cc:187
+#: session_state.cc:194
 msgid "solo cut control (dB)"
 msgstr "Контроль вырезки соло (дБ)"
 
-#: session_state.cc:209
+#: session_state.cc:216
 msgid "Set block size and sample rate"
 msgstr "Установка размера блока и частоты сэмплирования"
 
-#: session_state.cc:214
+#: session_state.cc:221
 msgid "Using configuration"
 msgstr "Применяется конфигурация"
 
-#: session_state.cc:339
+#: session_state.cc:348
 msgid "Reset Remote Controls"
 msgstr "Сброс удалённого управления"
 
-#: session_state.cc:368 session_state.cc:400
+#: session_state.cc:377 session_state.cc:409
 msgid "Filling playback buffers"
 msgstr ""
 
-#: session_state.cc:466
+#: session_state.cc:475
 msgid "Session: cannot create session peakfile folder \"%1\" (%2)"
 msgstr "Сессия: невозможно создать сессионную папку \"%1\" с пик-файлами (%2)"
 
-#: session_state.cc:473
+#: session_state.cc:482
 msgid "Session: cannot create session sounds dir \"%1\" (%2)"
 msgstr ""
 "Сессия: невозможно создать сессионную папку \"%1\" со звуковыми файлами (%2)"
 
-#: session_state.cc:480
+#: session_state.cc:489
 msgid "Session: cannot create session midi dir \"%1\" (%2)"
 msgstr "Сессия: невозможно создать сессионную папку \"%1\" с файлами MIDI (%2)"
 
-#: session_state.cc:487
+#: session_state.cc:496
 msgid "Session: cannot create session dead sounds folder \"%1\" (%2)"
 msgstr ""
 "Сессия: невозможно создать сессионную папку \"%1\" с утерянными звуками (%2)"
 
-#: session_state.cc:494
+#: session_state.cc:503
 msgid "Session: cannot create session export folder \"%1\" (%2)"
 msgstr "Сессия: невозможно создать сессионную папку \"%1\" для экспорта (%2)"
 
-#: session_state.cc:501
+#: session_state.cc:510
 msgid "Session: cannot create session analysis folder \"%1\" (%2)"
 msgstr ""
 "Сессия: невозможно создать сессионную папку \"%1\" с данными анализа (%2)"
 
-#: session_state.cc:508
+#: session_state.cc:517
 msgid "Session: cannot create session plugins folder \"%1\" (%2)"
 msgstr "Сессия: невозможно создать сессионную папку \"%1\" плагинов (%2)"
 
-#: session_state.cc:515
+#: session_state.cc:524
 msgid "Session: cannot create session externals folder \"%1\" (%2)"
 msgstr ""
 "Сессия: невозможно создать сессионную папку \"%1\" с внешними данными (%2)"
 
-#: session_state.cc:529
+#: session_state.cc:538
 msgid "Session: cannot create session folder \"%1\" (%2)"
 msgstr "Сессия: невозможно создать папку сессии \"%1\" (%2)"
 
-#: session_state.cc:560
+#: session_state.cc:569
 msgid "Error reading session template file %1 (%2)"
 msgstr ""
 
-#: session_state.cc:575
+#: session_state.cc:584
 msgid "Error writing session template file %1 (%2)"
 msgstr ""
 
-#: session_state.cc:592
+#: session_state.cc:601
 msgid "Could not open %1 for writing session template"
 msgstr "Не удалось открыть %1 для записи шаблона сессии"
 
-#: session_state.cc:599
+#: session_state.cc:608
 msgid "Could not open session template %1 for reading"
 msgstr "Не удалось открыть шаблон сессии %1 для чтения"
 
-#: session_state.cc:617
+#: session_state.cc:626
 msgid "Loop"
 msgstr "Петля"
 
-#: session_state.cc:698
+#: session_state.cc:707
 msgid "Could not remove pending capture state at path \"%1\" (%2)"
 msgstr "Не удалось удалить состояние отложенного захвата по пути \"%1\" (%2)"
 
-#: session_state.cc:722
+#: session_state.cc:731
 msgid "could not rename snapshot %1 to %2 (%3)"
 msgstr "Не удалось переименовать снимок %1 в %2 (%3)"
 
-#: session_state.cc:750
+#: session_state.cc:759
 msgid "Could not remove session file at path \"%1\" (%2)"
 msgstr "Не удалось удалить файл сессии по пути \"%1\" (%2)"
 
-#: session_state.cc:777
+#: session_state.cc:788
 msgid ""
 "the %1 audio engine is not connected and state saving would lose all I/O "
 "connections. Session not saved"
@@ -2532,143 +2650,143 @@ msgstr ""
 "Звуковой движок %1 не подключен и статус сохранения ведёт к потере всх "
 "операций ввода/вывода I/O соединений. Сессия не сохранена"
 
-#: session_state.cc:841
+#: session_state.cc:856
 msgid "state could not be saved to %1"
 msgstr "Статус не может быть сохранен в %1"
 
-#: session_state.cc:843 session_state.cc:856
+#: session_state.cc:858 session_state.cc:871
 msgid "Could not remove temporary session file at path \"%1\" (%2)"
 msgstr "Не удалось удалить временный файл сессии в каталоге \"%1\" (%2)"
 
-#: session_state.cc:853
+#: session_state.cc:868
 msgid "could not rename temporary session file %1 to %2 (%3)"
 msgstr "Не удалось переименовать временный файл сессии %1 в %2 (%3)"
 
-#: session_state.cc:923
+#: session_state.cc:942
 msgid "%1: session file \"%2\" doesn't exist!"
 msgstr "%1: файл сессии «%2» не существует!"
 
-#: session_state.cc:935
+#: session_state.cc:954
 msgid "Could not understand session file %1"
 msgstr "Не удалось понять файл сессии %1"
 
-#: session_state.cc:944
+#: session_state.cc:963
 msgid "Session file %1 is not a session"
 msgstr "Файл сессии %1 не является сессией"
 
-#: session_state.cc:1273
+#: session_state.cc:1332
 msgid "programming error: Session: incorrect XML node sent to set_state()"
 msgstr ""
 "Ошибка в программе: Сессия: некорректный узел XML отправил в set_state ()"
 
-#: session_state.cc:1327
+#: session_state.cc:1410
 msgid "Session: XML state has no options section"
 msgstr "Сессия: состояние XML не имеет раздел опций"
 
-#: session_state.cc:1332
+#: session_state.cc:1415
 msgid "Session: XML state has no metadata section"
 msgstr "Сессия: состояние XML не имеет раздел метаданных"
 
-#: session_state.cc:1343
+#: session_state.cc:1426
 msgid "Session: XML state has no sources section"
 msgstr "Сессия: состояние XML не имеет раздел источников"
 
-#: session_state.cc:1350
+#: session_state.cc:1433
 msgid "Session: XML state has no Tempo Map section"
 msgstr "Сессия: состояние XML не имеет раздела тeмpoкарты"
 
-#: session_state.cc:1357
+#: session_state.cc:1440
 msgid "Session: XML state has no locations section"
 msgstr "Сессия: состояние XML не имеет раздел расположения"
 
-#: session_state.cc:1370
+#: session_state.cc:1453
 msgid "Session: XML state has no Regions section"
 msgstr "Сессия: состояние XML не имеет раздел областей"
 
-#: session_state.cc:1377
+#: session_state.cc:1460
 msgid "Session: XML state has no playlists section"
 msgstr "Сессия: состояние XML не имеет раздел плейлистов"
 
-#: session_state.cc:1397
+#: session_state.cc:1480
 msgid "Session: XML state has no bundles section"
 msgstr "Сессия: состояние XML не имеет раздел слоёв"
 
-#: session_state.cc:1409
+#: session_state.cc:1492
 msgid "Session: XML state has no diskstreams section"
 msgstr "Сессия: состояние XML не имеет раздел дисковых потоков"
 
-#: session_state.cc:1417
+#: session_state.cc:1504
 msgid "Session: XML state has no routes section"
 msgstr "Сессия: состояние XML не имеет раздел маршрутов"
 
-#: session_state.cc:1429
+#: session_state.cc:1520
 msgid "Session: XML state has no route groups section"
 msgstr "Сессия: состояние XML не имеет раздел маршрут групп"
 
-#: session_state.cc:1438
+#: session_state.cc:1529
 msgid "Session: XML state has no edit groups section"
 msgstr "Сессия: состояние XML не имеет раздел редактирования групп"
 
-#: session_state.cc:1445
+#: session_state.cc:1536
 msgid "Session: XML state has no mix groups section"
 msgstr "Сессия: состояние XML не имеет раздел микс-групп"
 
-#: session_state.cc:1453
+#: session_state.cc:1544
 msgid "Session: XML state has no click section"
 msgstr "Сессия: состояние XML не имеет click-раздела"
 
-#: session_state.cc:1500
+#: session_state.cc:1606
 msgid "Session: cannot create Route from XML description."
 msgstr "Сессия: невозможно создать маршрут из описания XML."
 
-#: session_state.cc:1504
+#: session_state.cc:1610
 msgid "Loaded track/bus %1"
 msgstr "Загружена дорожка/шина %1"
 
-#: session_state.cc:1509
+#: session_state.cc:1615
 msgid "Tracks/busses loaded;  Adding to Session"
 msgstr "Дорожки и шины загружены, добавляются в сессию"
 
-#: session_state.cc:1513
+#: session_state.cc:1619
 msgid "Finished adding tracks/busses"
 msgstr "Добавление дорожек/шин завершено"
 
-#: session_state.cc:1612
+#: session_state.cc:1709
 msgid "Could not find diskstream for route"
 msgstr "Не удалось найти дисковые потоки по маршруту"
 
-#: session_state.cc:1672
+#: session_state.cc:1760
 msgid "Session: cannot create Region from XML description."
 msgstr "Сессия: невозможно создать область из описания XML."
 
-#: session_state.cc:1676
+#: session_state.cc:1764
 msgid "Can not load state for region '%1'"
 msgstr "Не удается загрузить состояние для области '%1'"
 
-#: session_state.cc:1712
+#: session_state.cc:1800
 msgid "Regions in compound description not found (ID's %1 and %2): ignored"
 msgstr "Областей в описании соединения не найдено (ID's %1 и %2): игнорировано"
 
-#: session_state.cc:1740
+#: session_state.cc:1828
 msgid "Nested source has no ID info in session file! (ignored)"
 msgstr "Вложенный источник не имеет ID-данных в файле сессии! (Игнорировано)"
 
-#: session_state.cc:1752
+#: session_state.cc:1840
 msgid "Cannot reconstruct nested source for region %1"
 msgstr "Невозможно восстановить вложенный источник для области %1"
 
-#: session_state.cc:1814
+#: session_state.cc:1902
 msgid "Session: XMLNode describing a AudioRegion is incomplete (no source)"
 msgstr "Сессия: XMLNode описание AudioRegion является неполным (без источника)"
 
-#: session_state.cc:1822 session_state.cc:1843 session_state.cc:1863
+#: session_state.cc:1910 session_state.cc:1931 session_state.cc:1951
 msgid ""
 "Session: XMLNode describing a AudioRegion references an unknown source id =%1"
 msgstr ""
 "Сессия: XMLNode описание AudioRegion ссылается на неизвестный идентификатор "
 "источника = %1"
 
-#: session_state.cc:1828 session_state.cc:1849 session_state.cc:1869
+#: session_state.cc:1916 session_state.cc:1937 session_state.cc:1957
 msgid ""
 "Session: XMLNode describing a AudioRegion references a non-audio source id ="
 "%1"
@@ -2676,7 +2794,7 @@ msgstr ""
 "Сессия: XMLNode описание AudioRegion ссылается на неисходный "
 "аудиоидентификатор = %1"
 
-#: session_state.cc:1892
+#: session_state.cc:1980
 msgid ""
 "Session: XMLNode describing an AudioRegion is missing some master sources; "
 "ignored"
@@ -2684,29 +2802,29 @@ msgstr ""
 "Сессия: XMLNode в описании AudioRegion отсутствуют некоторые мастер-"
 "источники; Игнорировано"
 
-#: session_state.cc:1926
+#: session_state.cc:2014
 msgid "Session: XMLNode describing a MidiRegion is incomplete (no source)"
 msgstr "Сессия: XMLNode описание MidiRegion является неполным (без источника)"
 
-#: session_state.cc:1934
+#: session_state.cc:2022
 msgid ""
 "Session: XMLNode describing a MidiRegion references an unknown source id =%1"
 msgstr ""
 "Сессия: XMLNode описание MidiRegion ссылается на неизвестный идентификатор "
 "источника id = %1"
 
-#: session_state.cc:1940
+#: session_state.cc:2028
 msgid ""
 "Session: XMLNode describing a MidiRegion references a non-midi source id =%1"
 msgstr ""
 "Сессия: XMLNode описание MidiRegion ссылается на неисходный MIDI-"
 "идентификатор id= %1"
 
-#: session_state.cc:2013
+#: session_state.cc:2101
 msgid "Session: cannot create Source from XML description."
 msgstr "Сессия: невозможно создать источник из описания XML."
 
-#: session_state.cc:2021
+#: session_state.cc:2109
 msgid ""
 "A external MIDI file is missing. %1 cannot currently recover from missing "
 "external MIDI files"
@@ -2714,137 +2832,137 @@ msgstr ""
 "Внешний MIDI файл отсутствует. % 1 в настоящее время не может восстановить "
 "данные из утраченных внешних MIDI файлов"
 
-#: session_state.cc:2103
+#: session_state.cc:2191
 msgid "Found a sound file that cannot be used by %1. Talk to the programmers."
 msgstr ""
 "Найден звуковой файл, который не может быть использован %1. Обратитесь к "
 "программистам."
 
-#: session_state.cc:2124
+#: session_state.cc:2212
 msgid "Could not create templates directory \"%1\" (%2)"
 msgstr "Не удалось создать шаблоны каталогоа \"%1\" (%2)"
 
-#: session_state.cc:2136
+#: session_state.cc:2224
 msgid "Template \"%1\" already exists - new version not created"
 msgstr "Шаблон \"%1\" уже существует. Новая версия не создана"
 
-#: session_state.cc:2142
+#: session_state.cc:2230
 msgid "Could not create directory for Session template\"%1\" (%2)"
 msgstr "Не удалось создать каталог для шаблона сессии \"%1\" (%2)"
 
-#: session_state.cc:2171
+#: session_state.cc:2259
 msgid "template not saved"
 msgstr "Шаблон не сохранён"
 
-#: session_state.cc:2413
+#: session_state.cc:2501
 msgid "Unknown node \"%1\" found in Bundles list from session file"
 msgstr "Неизвестный узел \"%1\" найден в списке пакетов файла сессии"
 
-#: session_state.cc:2869
+#: session_state.cc:2969
 msgid "Cannot cleanup peak-files for read-only session."
 msgstr ""
 
-#: session_state.cc:2873
+#: session_state.cc:2973
 msgid "Cannot cleanup peak-files while recording"
 msgstr ""
 
-#: session_state.cc:2896
+#: session_state.cc:2996
 msgid ""
 "Timeout waiting for peak-file creation to terminate before cleanup, please "
 "try again later."
 msgstr ""
 
-#: session_state.cc:3121
+#: session_state.cc:3261
 msgid "Session: cannot create dead file folder \"%1\" (%2)"
 msgstr "Сессия: невозможно создать папку утерянных файлов \"%1\" (%2)"
 
-#: session_state.cc:3160
+#: session_state.cc:3296
 msgid "cannot rename unused file source from %1 to %2 (%3)"
 msgstr ""
 "Невозможно переименовать неиспользованный файл источника из %1 в %2 (%3)"
 
-#: session_state.cc:3178
+#: session_state.cc:3312
 msgid "cannot remove peakfile %1 for %2 (%3)"
 msgstr "Не удалось удалить пик-файл %1 для %2 (%3)"
 
-#: session_state.cc:3495
+#: session_state.cc:3633
 msgid "could not backup old history file, current history not saved"
 msgstr ""
 "Невозможно сделать копию старого файла истории. Текущая история не сохранена"
 
-#: session_state.cc:3504
+#: session_state.cc:3642
 msgid "history could not be saved to %1"
 msgstr "История не может быть сохраненв в %1"
 
-#: session_state.cc:3507
+#: session_state.cc:3645
 msgid "Could not remove history file at path \"%1\" (%2)"
 msgstr "Не удалось удалить файл истории по пути \"%1\" (%2)"
 
-#: session_state.cc:3511
+#: session_state.cc:3649
 msgid "could not restore history file from backup %1 (%2)"
 msgstr "Не удалось восстановить файл истории из резервной %1 (% 2)"
 
-#: session_state.cc:3536
+#: session_state.cc:3674
 msgid "%1: no history file \"%2\" for this session."
 msgstr "%1: нет файла истории \"%2\" для этой сессии."
 
-#: session_state.cc:3542
+#: session_state.cc:3680
 msgid "Could not understand session history file \"%1\""
 msgstr "Не удалось понять файл истории сессии \"%1\""
 
-#: session_state.cc:3584
+#: session_state.cc:3722
 msgid "Failed to downcast MidiSource for NoteDiffCommand"
 msgstr "Не удалось обратное приведение MidiSource для NoteDiffCommand"
 
-#: session_state.cc:3595
+#: session_state.cc:3733
 msgid "Failed to downcast MidiSource for SysExDiffCommand"
 msgstr "Не удалось обратное приведение MidiSource для SysExDiffCommand"
 
-#: session_state.cc:3606
+#: session_state.cc:3744
 msgid "Failed to downcast MidiSource for PatchChangeDiffCommand"
 msgstr "Не удалось обратное приведение MidiSource для PatchChangeDiffCommand"
 
-#: session_state.cc:3614
+#: session_state.cc:3752
 msgid "Couldn't figure out how to make a Command out of a %1 XMLNode."
 msgstr "Не удалось выяснить, как сделать команду из %1 XMLNode."
 
-#: session_state.cc:3852
+#: session_state.cc:3990
 msgid "Session: unknown diskstream type in XML"
 msgstr "Сессия: неизвестный тип дисковых потоков в XML"
 
-#: session_state.cc:3857
+#: session_state.cc:3995
 msgid "Session: could not load diskstream via XML state"
 msgstr "Сессия: Не удалось загрузить дисковые потоки через XML-статус"
 
-#: session_state.cc:3954
+#: session_state.cc:4092
 msgid "Cannot rename read-only session."
 msgstr "Невозможно переименовать сеанс, доступный только для чтения."
 
-#: session_state.cc:3958
+#: session_state.cc:4096
 msgid "Cannot rename session while recording"
 msgstr "Невозможно переименовать сеанс во время записи."
 
-#: session_state.cc:4043 session_state.cc:4044 session_state.cc:4086
-#: session_state.cc:4090
+#: session_state.cc:4181 session_state.cc:4182 session_state.cc:4224
+#: session_state.cc:4228
 msgid "renaming %s as %2 failed (%3)"
 msgstr "Переименование %s в %2 не удалось (%3)"
 
-#: session_state.cc:4106 session_state.cc:4107 session_state.cc:4121
-#: session_state.cc:4122
+#: session_state.cc:4244 session_state.cc:4245 session_state.cc:4259
+#: session_state.cc:4260
 msgid "renaming %1 as %2 failed (%3)"
 msgstr "Не удалось переименовать %1 в %2 (%3)"
 
-#: session_state.cc:4431
+#: session_state.cc:4571
 msgid "Cannot create new session folder %1"
 msgstr ""
 
-#: session_state.cc:4493 session_state.cc:4568
+#: session_state.cc:4633 session_state.cc:4708
 msgid ""
 "\n"
 "copying \"%1\" failed !"
 msgstr ""
 
-#: session_state.cc:4766
+#: session_state.cc:4906
 msgid "unknown reason"
 msgstr ""
 
@@ -2856,7 +2974,7 @@ msgstr "Неизвестное состояние транспорта %1 в о
 msgid "Cannot loop - no loop range defined"
 msgstr "Не удалось запустить цикл - диапазон цикла не определен"
 
-#: session_transport.cc:956
+#: session_transport.cc:968
 msgid ""
 "Seamless looping cannot be supported while %1 is using JACK transport.\n"
 "Recommend changing the configured options"
@@ -2865,11 +2983,11 @@ msgstr ""
 "транспорт.\n"
 "Рекомендуется измененить настроенные параметры"
 
-#: session_transport.cc:1038
+#: session_transport.cc:1050
 msgid "Locate called for negative sample position - ignored"
 msgstr "Размещение, вызываемое для негативной позиции образца,  игнорировано"
 
-#: session_transport.cc:1392
+#: session_transport.cc:1401
 msgid ""
 "Global varispeed cannot be supported while %1 is connected to JACK transport "
 "control"
@@ -2877,6 +2995,10 @@ msgstr ""
 "Глобальная переменная скорость не поддерживается в то время как %1 подключен "
 "к JACK транспортуконтроль"
 
+#: slavable.cc:100
+msgid "Master #%1 not found, assignment lost"
+msgstr ""
+
 #: smf_source.cc:350
 msgid "Unable to read event prefix, corrupt MIDI ring"
 msgstr "Невозможно прочитать префикс событий. MIDI кольцо повреждено"
@@ -3086,6 +3208,14 @@ msgstr ""
 msgid "SndFileSource: cannot open file \"%1\" for reading"
 msgstr ""
 
+#: solo_control.cc:199
+msgid "Cleared Explicit solo: %1\n"
+msgstr ""
+
+#: solo_control.cc:202
+msgid "Cleared Implicit solo: %1 up:%2 down:%3\n"
+msgstr ""
+
 #: soundcloud_upload.cc:129
 msgid ""
 "Upload to Soundcloud failed.  Perhaps your email or password are incorrect?\n"
@@ -3117,43 +3247,67 @@ msgstr "SrcFileSource: %1"
 msgid "Cannot compile tape track regexp for use (%1)"
 msgstr "Не удается скомпилировать регулярное выражение дорожечной ленты (%1)"
 
-#: tempo.cc:80
-msgid "TempoSection XML node has no \"start\" property"
-msgstr "Узел XML TempoSection не имеет свойств \"start\""
+#: tempo.cc:98
+msgid "Legacy session detected. TempoSection XML node will be altered."
+msgstr ""
 
-#: tempo.cc:88
-msgid "TempoSection XML node has an illegal \"start\" value"
-msgstr "Узел XML TempoSection имеет недопустимое значение \"start\""
+#: tempo.cc:104
+msgid "TempoSection XML node has an illegal \"pulse\" value"
+msgstr ""
 
-#: tempo.cc:95
+#: tempo.cc:112
+msgid "TempoSection XML node has an illegal \"frame\" value"
+msgstr ""
+
+#: tempo.cc:119
 msgid "TempoSection XML node has no \"beats-per-minute\" property"
 msgstr "Узел XML TempoSection не имеет свойств \"beats-per-minute\""
 
-#: tempo.cc:100
+#: tempo.cc:124
 msgid "TempoSection XML node has an illegal \"beats_per_minute\" value"
 msgstr "Узел XML TempoSection имеет недопустимое значение \"beats_per_minute\""
 
-#: tempo.cc:109
+#: tempo.cc:133
 msgid "TempoSection XML node has an illegal \"note-type\" value"
 msgstr "Узел XML TempoSection имеет недопустимое значение \"note-type\""
 
-#: tempo.cc:115
+#: tempo.cc:139
 msgid "TempoSection XML node has no \"movable\" property"
 msgstr "Узел XML TempoSection имеет недопустимые свойства \"movable\""
 
-#: tempo.cc:125
-msgid "TempoSection XML node has an illegal \"bar-offset\" value"
-msgstr "Узел XML TempoSection имеет недопустимые свойства \"bar-offset\""
-
-#: tempo.cc:202
-msgid "MeterSection XML node has no \"start\" property"
-msgstr "Узел XML MeterSection не имеет свойств \"start\""
+#: tempo.cc:146
+msgid "TempoSection XML node has no \"active\" property"
+msgstr ""
 
-#: tempo.cc:210
+#: tempo.cc:471
 msgid "MeterSection XML node has an illegal \"start\" value"
 msgstr "Узел XML MeterSection не имеет некорректных значений \"start\""
 
-#: tempo.cc:220
+#: tempo.cc:474
+msgid "Legacy session detected - MeterSection XML node will be altered."
+msgstr ""
+
+#: tempo.cc:481
+msgid "MeterSection XML node has an illegal \"pulse\" value"
+msgstr ""
+
+#: tempo.cc:488
+msgid "MeterSection XML node has an illegal \"beat\" value"
+msgstr ""
+
+#: tempo.cc:495
+msgid "MeterSection XML node has no \"bbt\" property"
+msgstr ""
+
+#: tempo.cc:500
+msgid "MeterSection XML node has an illegal \"bbt\" value"
+msgstr ""
+
+#: tempo.cc:509
+msgid "MeterSection XML node has an illegal \"frame\" value"
+msgstr ""
+
+#: tempo.cc:519
 msgid ""
 "MeterSection XML node has no \"beats-per-bar\" or \"divisions-per-bar\" "
 "property"
@@ -3161,27 +3315,27 @@ msgstr ""
 "Узел XML MeterSection не имеет свойств \"beats-per-bar\" или \"divisions-per-"
 "bar\""
 
-#: tempo.cc:226
-msgid ""
-"MeterSection XML node has an illegal \"beats-per-bar\" or \"divisions-per-bar"
-"\" value"
+#: tempo.cc:524
+msgid "MeterSection XML node has an illegal \"divisions-per-bar\" value"
 msgstr ""
-"Узел XML MeterSection не имеет некорректных значений \"beats-per-bar\" или "
-"\"divisions-per-bar"
 
-#: tempo.cc:231
+#: tempo.cc:529
 msgid "MeterSection XML node has no \"note-type\" property"
 msgstr "Узел XML MeterSection не имеет свойств \"note-type\""
 
-#: tempo.cc:236
+#: tempo.cc:533
 msgid "MeterSection XML node has an illegal \"note-type\" value"
 msgstr "Узел XML MeterSection не имеет "
 
-#: tempo.cc:241
+#: tempo.cc:538
 msgid "MeterSection XML node has no \"movable\" property"
 msgstr "Узел XML MeterSection не имеет некорректных значений \"movable\""
 
-#: tempo.cc:402
+#: tempo.cc:545
+msgid "MeterSection XML node has no \"lock-style\" property"
+msgstr ""
+
+#: tempo.cc:821
 msgid ""
 "Meter changes can only be positioned on the first beat of a bar. Moving from "
 "%1 to %2"
@@ -3189,40 +3343,44 @@ msgstr ""
 "Метрические изменения могут быть расположены только на первой доле бара. "
 "Переход от %1 к %2"
 
-#: tempo.cc:682
+#: tempo.cc:1156
 msgid "no tempo sections defined in tempo map - cannot change tempo @ %1"
 msgstr ""
 "Нет секций теампа, определённых в темп-карте. Не удалось изменить темп @ %1"
 
-#: tempo.cc:712 tempo.cc:730 tempo.cc:748 tempo.cc:764
+#: tempo.cc:1186
+msgid "programming error: no meter section in tempo map!"
+msgstr ""
+
+#: tempo.cc:1204 tempo.cc:1227 tempo.cc:1248
 msgid "programming error: no tempo section in tempo map!"
 msgstr "Ошибка в программе: нет секции темпа в темп-карте!"
 
-#: tempo.cc:882 tempo.cc:1892
-msgid "programming error: unhandled MetricSection type"
-msgstr "Ошибка в программе: необработанный MetricSection тип"
-
-#: tempo.cc:1178
+#: tempo.cc:1959 tempo.cc:1987
 msgid "tempo map asked for BBT time at frame %1\n"
 msgstr "Темп-карта запросила для BBT-времени в кадре %1\n"
 
-#: tempo.cc:1221
+#: tempo.cc:2054
 msgid "tempo map asked for frame time at bar < 1  (%1)\n"
 msgstr "Темп-карта запросила время кадра в баре < 1 (%1)\n"
 
-#: tempo.cc:1705 tempo.cc:1719
+#: tempo.cc:3472 tempo.cc:3485
 msgid "Tempo map: could not set new state, restoring old one."
 msgstr ""
 "Темп-карта: не удалось установить новое состояние, восстанавливая старое."
 
-#: tempo.cc:1740 tempo.cc:1741
+#: tempo.cc:3522 tempo.cc:3523
 msgid "Multiple meter definitions found at %1"
 msgstr "Определения мультиизмерений найдено на %1"
 
-#: tempo.cc:1746 tempo.cc:1747
+#: tempo.cc:3528 tempo.cc:3529
 msgid "Multiple tempo definitions found at %1"
 msgstr "Определения мультитемпа найдено найдено на %1"
 
+#: tempo.cc:3715
+msgid "programming error: unhandled MetricSection type"
+msgstr "Ошибка в программе: необработанный MetricSection тип"
+
 #: tempo_map_importer.cc:52
 msgid "Tempo map"
 msgstr "Карта темпа"
@@ -3255,6 +3413,10 @@ msgstr ""
 msgid "Using plugin-stub with unknown i/o configuration for: "
 msgstr ""
 
+#: unknown_processor.cc:107
+msgid "Using plugin-stub with mismatching i/o configuration for: "
+msgstr ""
+
 #: user_bundle.cc:47
 msgid "Node for Bundle has no \"name\" property"
 msgstr "Узел для Bundle это не свойства \"name\""
@@ -3332,6 +3494,76 @@ msgstr "Ошибка в программе: неизвестный родной
 msgid "cannot open directory %1 (%2)"
 msgstr "Не удалось открыть директорию %1 (%2)"
 
+#: vca.cc:43
+#, c-format
+msgid "VCA %n"
+msgstr ""
+
+#: vca_manager.cc:166
+msgid "Cannot set state of a VCA"
+msgstr ""
+
+#~ msgid "%d"
+#~ msgstr "%d"
+
+#~ msgid ""
+#~ "You have requested an operation that requires audio analysis.\n"
+#~ "\n"
+#~ "You currently have \"auto-analyse-audio\" disabled, which means that "
+#~ "transient data must be generated every time it is required.\n"
+#~ "\n"
+#~ "If you are doing work that will require transient data on a regular "
+#~ "basis, you should probably enable \"auto-analyse-audio\" then quit %1 and "
+#~ "restart.\n"
+#~ "\n"
+#~ "This dialog will not display again.  But you may notice a slight delay in "
+#~ "this and future transient-detection operations.\n"
+#~ msgstr ""
+#~ "Вы запросили операцию, требующую аудиоанализ.\n"
+#~ "\n"
+#~ "В настоящее время у Вас \"auto-analyse-audio\" отключен. Это означает, "
+#~ "что переходные данные должны быть сгенерированы каждый раз, когда "
+#~ "потребуется.\n"
+#~ "\n"
+#~ "Если вы делаете работу, которая потребует переходных данных на регулярной "
+#~ "основе, то Вам, вероятно, следует включить \"auto-analyse-audio\", затем "
+#~ "закрыть Ardour и перезапустить.\n"
+#~ "\n"
+#~ "Этот диалог не будет отображаться снова, но Вы можете заметить небольшую "
+#~ "задержку в этой и будущих операциях переходных обнаружений.\n"
+
+#~ msgid "normalize"
+#~ msgstr "Нормировка"
+
+#~ msgid "badly formed order key string in state file! [%1] ... ignored."
+#~ msgstr ""
+#~ "Плохо сформированная строка порядкового ключа в файле состояния! [%1] ... "
+#~ "игнорирован."
+
+#~ msgid "Converting deprecated order key for %1 using Editor order %2"
+#~ msgstr ""
+#~ "Преобразование устаревшего порядкового ключа для %1 с использованием "
+#~ "редактора порядка %2"
+
+#~ msgid "TempoSection XML node has no \"start\" property"
+#~ msgstr "Узел XML TempoSection не имеет свойств \"start\""
+
+#~ msgid "TempoSection XML node has an illegal \"start\" value"
+#~ msgstr "Узел XML TempoSection имеет недопустимое значение \"start\""
+
+#~ msgid "TempoSection XML node has an illegal \"bar-offset\" value"
+#~ msgstr "Узел XML TempoSection имеет недопустимые свойства \"bar-offset\""
+
+#~ msgid "MeterSection XML node has no \"start\" property"
+#~ msgstr "Узел XML MeterSection не имеет свойств \"start\""
+
+#~ msgid ""
+#~ "MeterSection XML node has an illegal \"beats-per-bar\" or \"divisions-per-"
+#~ "bar\" value"
+#~ msgstr ""
+#~ "Узел XML MeterSection не имеет некорректных значений \"beats-per-bar\" "
+#~ "или \"divisions-per-bar"
+
 #~ msgid ""
 #~ "Could not create directory for Session template plugin state\"%1\" (%2)"
 #~ msgstr ""
@@ -3392,9 +3624,6 @@ msgstr "Не удалось открыть директорию %1 (%2)"
 #~ "VST плагин %1 не поддерживает processReplacing и поэтому не может быть "
 #~ "использован в %2 в это время"
 
-#~ msgid "Audio"
-#~ msgstr "Аудио"
-
 #~ msgid "could not allocate file %1 for reading."
 #~ msgstr "Не удалось выделить файл %1 для чтения."
 
diff --git a/libs/ardour/po/sv.mo b/libs/ardour/po/sv.mo
new file mode 100644
index 0000000..cb4e9a2
Binary files /dev/null and b/libs/ardour/po/sv.mo differ
diff --git a/libs/ardour/po/sv.po b/libs/ardour/po/sv.po
index dd2b060..dc617fd 100644
--- a/libs/ardour/po/sv.po
+++ b/libs/ardour/po/sv.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: ardour\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-03-31 20:13-0400\n"
+"POT-Creation-Date: 2016-07-14 06:20-0400\n"
 "PO-Revision-Date: 2006-10-03 01:09+GMT+1\n"
 "Last-Translator: Petter Sundlöf <petter.sundlof at findus.dhs.org>\n"
 "Language-Team: Swedish <sv at li.org>\n"
@@ -16,86 +16,239 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: amp.cc:57 automatable.cc:165
-msgid "Fader"
-msgstr "Volymreglage"
+#: amp.cc:412
+#, c-format
+msgid "%.2fdB"
+msgstr ""
 
-#: analyser.cc:117 audioregion.cc:1729
+#: analyser.cc:121 audioregion.cc:1789
 msgid "Transient Analysis failed for %1."
 msgstr ""
 
-#: analyser.cc:117
+#: analyser.cc:121
 msgid "Audio File Source"
 msgstr ""
 
-#: audio_diskstream.cc:249
+#: analysis_graph.cc:136
+msgid "%1 (%2..%3)"
+msgstr ""
+
+#: audio_backend.cc:31
+msgid "No Error occurred"
+msgstr ""
+
+#: audio_backend.cc:33
+msgid "Failed to initialize audio backend"
+msgstr ""
+
+#: audio_backend.cc:35
+msgid "Failed to deinitialize audio backend"
+msgstr ""
+
+#: audio_backend.cc:37
+msgid "Failed to reinitialize audio backend"
+msgstr ""
+
+#: audio_backend.cc:39
+msgid "Failed to open audio device"
+msgstr ""
+
+#: audio_backend.cc:41
+msgid "Failed to close audio device"
+msgstr ""
+
+#: audio_backend.cc:43
+msgid "Audio device not valid"
+msgstr ""
+
+#: audio_backend.cc:45
+msgid "Audio device unavailable"
+msgstr ""
+
+#: audio_backend.cc:47
+msgid "Audio device not connected"
+msgstr ""
+
+#: audio_backend.cc:49
+msgid "Failed to request and reserve audio device"
+msgstr ""
+
+#: audio_backend.cc:51
+msgid "Audio device Input/Output error"
+msgstr ""
+
+#: audio_backend.cc:53
+msgid "Failed to open MIDI device"
+msgstr ""
+
+#: audio_backend.cc:55
+msgid "Failed to close MIDI device"
+msgstr ""
+
+#: audio_backend.cc:57
+msgid "MIDI device unavailable"
+msgstr ""
+
+#: audio_backend.cc:59
+msgid "MIDI device not connected"
+msgstr ""
+
+#: audio_backend.cc:61
+msgid "MIDI device Input/Output error"
+msgstr ""
+
+#: audio_backend.cc:63
+msgid "Sample format is not supported"
+msgstr ""
+
+#: audio_backend.cc:65
+msgid "Sample rate is not supported"
+msgstr ""
+
+#: audio_backend.cc:67
+msgid "Requested input latency is not supported"
+msgstr ""
+
+#: audio_backend.cc:69
+msgid "Requested output latency is not supported"
+msgstr ""
+
+#: audio_backend.cc:71
+msgid "Period size is not supported"
+msgstr ""
+
+#: audio_backend.cc:73
+msgid "Period count is not supported"
+msgstr ""
+
+#: audio_backend.cc:75
+msgid "Device configuration not supported"
+msgstr ""
+
+#: audio_backend.cc:77
+msgid "Channel count configuration not supported"
+msgstr ""
+
+#: audio_backend.cc:79
+msgid "Input channel count configuration not supported"
+msgstr ""
+
+#: audio_backend.cc:81
+msgid "Output channel count configuration not supported"
+msgstr ""
+
+#: audio_backend.cc:83
+msgid "Unable to aquire realtime permissions"
+msgstr ""
+
+#: audio_backend.cc:85
+msgid "Setting audio device thread priorities failed"
+msgstr ""
+
+#: audio_backend.cc:87
+msgid "Setting MIDI device thread priorities failed"
+msgstr ""
+
+#: audio_backend.cc:89
+msgid "Failed to start process thread"
+msgstr ""
+
+#: audio_backend.cc:91
+msgid "Failed to start freewheel thread"
+msgstr ""
+
+#: audio_backend.cc:93
+msgid "Failed to register audio/midi ports"
+msgstr ""
+
+#: audio_backend.cc:95
+msgid "Failed to re-connect audio/midi ports"
+msgstr ""
+
+#: audio_backend.cc:97
+msgid "Out Of Memory Error"
+msgstr ""
+
+#: audio_backend.cc:99
+msgid "Could not reconnect to Audio/MIDI engine"
+msgstr ""
+
+#: audio_backend.cc:107 export_formats.cc:52 session.cc:6772 session.cc:6792
+msgid "None"
+msgstr ""
+
+#: audio_backend.cc:109
+msgid "Default"
+msgstr ""
+
+#: audio_diskstream.cc:257
 msgid "AudioDiskstream: Playlist \"%1\" isn't an audio playlist"
 msgstr ""
 
-#: audio_diskstream.cc:301
+#: audio_diskstream.cc:309
 msgid "AudioDiskstream %1: there is no existing playlist to make a copy of!"
 msgstr ""
 
-#: audio_diskstream.cc:861 audio_diskstream.cc:871
+#: audio_diskstream.cc:880 audio_diskstream.cc:890
 msgid ""
 "AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3"
 msgstr ""
 
-#: audio_diskstream.cc:1028
+#: audio_diskstream.cc:1053
 msgid "AudioDiskstream %1: cannot read %2 from playlist at frame %3"
 msgstr ""
 
-#: audio_diskstream.cc:1397 audio_diskstream.cc:1416
+#: audio_diskstream.cc:1469 audio_diskstream.cc:1488
 msgid "AudioDiskstream %1: cannot write to disk"
 msgstr ""
 
-#: audio_diskstream.cc:1459
+#: audio_diskstream.cc:1531
 msgid "AudioDiskstream \"%1\": cannot flush captured data to disk!"
 msgstr ""
 
-#: audio_diskstream.cc:1553
+#: audio_diskstream.cc:1627
 msgid "%1: could not create region for complete audio file"
 msgstr ""
 
-#: audio_diskstream.cc:1585
+#: audio_diskstream.cc:1659
 msgid "AudioDiskstream: could not create region for captured audio!"
 msgstr ""
 
-#: audio_diskstream.cc:1693
+#: audio_diskstream.cc:1755
 msgid "programmer error: %1"
 msgstr ""
 
-#: audio_diskstream.cc:1921
+#: audio_diskstream.cc:2012
 msgid "AudioDiskstream: channel %1 out of range"
 msgstr ""
 
-#: audio_diskstream.cc:1935 midi_diskstream.cc:1274
+#: audio_diskstream.cc:2026 midi_diskstream.cc:1295
 msgid "%1:%2 new capture file not initialized correctly"
 msgstr ""
 
-#: audio_diskstream.cc:2214
+#: audio_diskstream.cc:2305
 msgid "%1: cannot restore pending capture source file %2"
 msgstr ""
 
-#: audio_diskstream.cc:2236
+#: audio_diskstream.cc:2327
 msgid "%1: incorrect number of pending sources listed - ignoring them all"
 msgstr ""
 
-#: audio_diskstream.cc:2270
+#: audio_diskstream.cc:2361
 msgid "%1: cannot create whole-file region from pending capture sources"
 msgstr ""
 
-#: audio_library.cc:81
+#: audio_library.cc:82
 msgid "Could not open %1.  Audio Library not saved"
 msgstr ""
 
-#: audio_playlist.cc:504
+#: audio_playlist.cc:509
 msgid ""
 "Legacy crossfade involved an incoming region not present in playlist \"%1\" "
 "- crossfade discarded"
 msgstr ""
 
-#: audio_playlist.cc:520
+#: audio_playlist.cc:525
 msgid ""
 "Legacy crossfade involved an outgoing region not present in playlist \"%1\" "
 "- crossfade discarded"
@@ -125,10 +278,11 @@ msgstr ""
 msgid "Audio Playlists (unused)"
 msgstr ""
 
-#: audio_playlist_source.cc:171 audiosource.cc:963 midi_playlist_source.cc:147
-#: midi_playlist_source.cc:155 midi_playlist_source.cc:162 midi_source.cc:356
-#: plugin_insert.cc:641 rb_effect.cc:327 session.cc:2845 session.cc:2878
-#: session.cc:4124 session_handle.cc:87 sndfilesource.cc:154
+#: audio_playlist_source.cc:171 audiosource.cc:1046
+#: midi_playlist_source.cc:147 midi_playlist_source.cc:155
+#: midi_playlist_source.cc:162 midi_source.cc:403 plugin_insert.cc:1259
+#: rb_effect.cc:327 session.cc:5314 session.cc:5341 session.cc:5461
+#: session_handle.cc:88 sndfilesource.cc:173
 msgid "programming error: %1"
 msgstr ""
 
@@ -152,26 +306,30 @@ msgid ""
 "Channels: "
 msgstr ""
 
-#: audio_track.cc:161
+#: audio_track.cc:177
 msgid "Unknown bundle \"%1\" listed for input of %2"
 msgstr ""
 
-#: audio_track.cc:163
+#: audio_track.cc:179
 msgid "in 1"
 msgstr ""
 
-#: audio_track.cc:164
+#: audio_track.cc:180
 msgid "No input bundles available as a replacement"
 msgstr ""
 
-#: audio_track.cc:168
+#: audio_track.cc:184
 msgid "Bundle %1 was not available - \"in 1\" used instead"
 msgstr ""
 
-#: audio_track.cc:177
+#: audio_track.cc:193
 msgid "improper input channel list in XML node (%1)"
 msgstr ""
 
+#: audio_track.cc:216 diskstream.cc:503 source.cc:149
+msgid "%1: this session uses destructive tracks, which are not supported"
+msgstr ""
+
 #: audio_track_importer.cc:68
 msgid "Audio Tracks"
 msgstr ""
@@ -192,19 +350,19 @@ msgstr ""
 msgid "VAMP Plugin \"%1\" could not be loaded"
 msgstr ""
 
-#: audioengine.cc:696
+#: audioengine.cc:756
 msgid "AudioEngine: cannot load module \"%1\" (%2)"
 msgstr ""
 
-#: audioengine.cc:702
+#: audioengine.cc:762
 msgid "AudioEngine: backend at \"%1\" has no descriptor function."
 msgstr ""
 
-#: audioengine.cc:779
+#: audioengine.cc:841
 msgid "Could not create backend for %1: %2"
 msgstr ""
 
-#: audioregion.cc:1685
+#: audioregion.cc:1757
 msgid ""
 "You have requested an operation that requires audio analysis.\n"
 "\n"
@@ -212,13 +370,14 @@ msgid ""
 "transient data must be generated every time it is required.\n"
 "\n"
 "If you are doing work that will require transient data on a regular basis, "
-"you should probably enable \"auto-analyse-audio\" then quit %1 and restart.\n"
+"you should probably enable \"auto-analyse-audio\" in Preferences > Audio > "
+"Regions, then quit %1 and restart.\n"
 "\n"
 "This dialog will not display again.  But you may notice a slight delay in "
 "this and future transient-detection operations.\n"
 msgstr ""
 
-#: audioregion.cc:1729
+#: audioregion.cc:1789
 msgid "Audio Region"
 msgstr ""
 
@@ -226,162 +385,190 @@ msgstr ""
 msgid "cannot rename peakfile for %1 from %2 to %3 (%4)"
 msgstr ""
 
-#: audiosource.cc:257
+#: audiosource.cc:262
 msgid "AudioSource: cannot stat peakfile \"%1\""
 msgstr ""
 
-#: audiosource.cc:361
+#: audiosource.cc:368
+msgid "Cannot open peakfile @ %1 for size check (%2)"
+msgstr ""
+
+#: audiosource.cc:389
+msgid "peak file %1 is truncated from %2 to %3"
+msgstr ""
+
+#: audiosource.cc:392
+msgid "Cannot open peakfile @ %1 for size check (%2) after rebuild"
+msgstr ""
+
+#: audiosource.cc:404
 msgid "Cannot open peakfile @ %1 for reading (%2)"
 msgstr ""
 
-#: audiosource.cc:394
+#: audiosource.cc:438
 msgid "cannot read sample data for unscaled peak computation"
 msgstr ""
 
-#: audiosource.cc:430 audiosource.cc:525
+#: audiosource.cc:473 audiosource.cc:568
 msgid "map failed - could not create file mapping for peakfile %1."
 msgstr ""
 
-#: audiosource.cc:436 audiosource.cc:531
+#: audiosource.cc:479 audiosource.cc:574
 msgid "map failed - could not map peakfile %1."
 msgstr ""
 
-#: audiosource.cc:447 audiosource.cc:542
+#: audiosource.cc:490 audiosource.cc:585
 msgid "unmap failed - could not unmap peakfile %1."
 msgstr ""
 
-#: audiosource.cc:453 audiosource.cc:548
+#: audiosource.cc:496 audiosource.cc:591
 msgid "map failed - could not mmap peakfile %1."
 msgstr ""
 
-#: audiosource.cc:638
+#: audiosource.cc:681
 msgid ""
 "AudioSource[%1]: peak read - cannot read %2 samples at offset %3 of %4 (%5)"
 msgstr ""
 
-#: audiosource.cc:705
+#: audiosource.cc:748
 msgid "%1: could not write read raw data for peak computation (%2)"
 msgstr ""
 
-#: audiosource.cc:742
-msgid "AudioSource: cannot open peakpath (c) \"%1\" (%2)"
+#: audiosource.cc:815
+msgid "AudioSource: cannot open _peakpath (c) \"%1\" (%2)"
 msgstr ""
 
-#: audiosource.cc:811 audiosource.cc:933
+#: audiosource.cc:894 audiosource.cc:1016
 msgid "%1: could not seek in peak file data (%2)"
 msgstr ""
 
-#: audiosource.cc:816 audiosource.cc:942
+#: audiosource.cc:899 audiosource.cc:1025
 msgid "%1: could not write peak file data (%2)"
 msgstr ""
 
-#: audiosource.cc:975
+#: audiosource.cc:1058
 msgid "could not truncate peakfile %1 to %2 (error: %3)"
 msgstr ""
 
-#: auditioner.cc:100
+#: auditioner.cc:105
 msgid "Falling back to Reasonable Synth for Midi Audition"
 msgstr ""
 
-#: auditioner.cc:102
+#: auditioner.cc:107
 msgid "No synth for midi-audition found."
 msgstr ""
 
-#: auditioner.cc:158
+#: auditioner.cc:163
 msgid "no outputs available for auditioner - manual connection required"
 msgstr ""
 
-#: auditioner.cc:399 auditioner.cc:446
+#: auditioner.cc:408 auditioner.cc:455
 msgid "Cannot setup auditioner processing flow for %1 channels"
 msgstr ""
 
-#: auditioner.cc:434
+#: auditioner.cc:443
 msgid "Failed to load synth for MIDI-Audition."
 msgstr ""
 
-#: auditioner.cc:453
+#: auditioner.cc:462
 msgid "Auditioning of regions other than Audio or Midi is not supported."
 msgstr ""
 
-#: automatable.cc:84
+#: automatable.cc:87
 msgid "Automation node has no path property"
 msgstr ""
 
-#: automatable.cc:104
+#: automatable.cc:108
 msgid "cannot open %2 to load automation data (%3)"
 msgstr ""
 
-#: automatable.cc:132
+#: automatable.cc:140
 msgid "cannot load automation data from %2"
 msgstr ""
 
-#: automatable.cc:167
+#: automatable.cc:176 send.cc:95 session.cc:851
+msgid "Fader"
+msgstr "Volymreglage"
+
+#: automatable.cc:178
+msgid "Trim"
+msgstr ""
+
+#: automatable.cc:180
 msgid "Mute"
 msgstr ""
 
-#: automation_list.cc:356
+#: automation_control.cc:228
+msgid "record %1 automation"
+msgstr ""
+
+#: automation_list.cc:410
 msgid "automation list: cannot load coordinates from XML, all points ignored"
 msgstr ""
 
-#: automation_list.cc:402
+#: automation_list.cc:456
 msgid ""
 "automation list: no x-coordinate stored for control point (point ignored)"
 msgstr ""
 
-#: automation_list.cc:408
+#: automation_list.cc:462
 msgid ""
 "automation list: no y-coordinate stored for control point (point ignored)"
 msgstr ""
 
-#: automation_list.cc:422
+#: automation_list.cc:476
 msgid ""
 "AutomationList: passed XML node called %1, not \"AutomationList\" - ignored"
 msgstr ""
 
-#: butler.cc:100
+#: butler.cc:126
 msgid "Session: could not create butler thread"
 msgstr ""
 
-#: butler.cc:222 butler.cc:223
+#: butler.cc:254 butler.cc:255
 msgid "Butler read ahead failure on dstream %1"
 msgstr ""
 
-#: butler.cc:270 butler.cc:271
+#: butler.cc:344 butler.cc:345 butler.cc:393 butler.cc:394
 msgid "Butler write-behind failure on dstream %1"
 msgstr ""
 
-#: control_protocol_manager.cc:164
+#: control_protocol_manager.cc:174
 msgid "control protocol name \"%1\" has no descriptor"
 msgstr ""
 
-#: control_protocol_manager.cc:171
+#: control_protocol_manager.cc:181
 msgid "control protocol name \"%1\" could not be initialized"
 msgstr ""
 
-#: control_protocol_manager.cc:237
+#: control_protocol_manager.cc:265
 msgid "Instantiating mandatory control protocol %1"
 msgstr ""
 
-#: control_protocol_manager.cc:281
+#: control_protocol_manager.cc:309
 msgid "looking for control protocols in %1\n"
 msgstr ""
 
-#: control_protocol_manager.cc:306
+#: control_protocol_manager.cc:334
 msgid "Control protocol %1 not usable"
 msgstr ""
 
-#: control_protocol_manager.cc:323
+#: control_protocol_manager.cc:351
 msgid "Control surface protocol discovered: \"%1\"\n"
 msgstr ""
 
-#: control_protocol_manager.cc:341
+#: control_protocol_manager.cc:367
 msgid "ControlProtocolManager: cannot load module \"%1\" (%2)"
 msgstr ""
 
-#: control_protocol_manager.cc:347
+#: control_protocol_manager.cc:373
 msgid "ControlProtocolManager: module \"%1\" has no descriptor function."
 msgstr ""
 
+#: control_protocol_manager.cc:516
+msgid "Control protocol \"%1\" has no descriptor"
+msgstr ""
+
 #: cycle_timer.cc:40
 msgid "CycleTimer::get_mhz(): can't open /proc/cpuinfo"
 msgstr ""
@@ -398,7 +585,7 @@ msgstr ""
 msgid "audio"
 msgstr ""
 
-#: data_type.cc:28 session.cc:1995 session.cc:1998
+#: data_type.cc:28 session.cc:2452
 msgid "MIDI"
 msgstr ""
 
@@ -410,11 +597,11 @@ msgstr ""
 msgid "main outs"
 msgstr ""
 
-#: delivery.cc:121 send.cc:63
+#: delivery.cc:121 send.cc:64
 msgid "listen"
 msgstr ""
 
-#: diskstream.cc:309
+#: diskstream.cc:311
 msgid "Location \"%1\" not valid for track loop (start >= end)"
 msgstr ""
 
@@ -426,23 +613,23 @@ msgstr ""
 msgid "Export failed: %1"
 msgstr ""
 
-#: export_filename.cc:126
+#: export_filename.cc:128
 msgid "Existing export folder for this session (%1) does not exist - ignored"
 msgstr ""
 
-#: export_filename.cc:242
+#: export_filename.cc:263
 msgid "No Time"
 msgstr "Ingen tid"
 
-#: export_filename.cc:251
+#: export_filename.cc:272
 msgid "Invalid time format"
 msgstr ""
 
-#: export_filename.cc:260
+#: export_filename.cc:281
 msgid "No Date"
 msgstr "Inget datum"
 
-#: export_filename.cc:275
+#: export_filename.cc:296
 msgid "Invalid date format"
 msgstr ""
 
@@ -478,23 +665,27 @@ msgstr ""
 msgid "Lossless compression"
 msgstr ""
 
-#: export_format_manager.cc:218 export_format_specification.cc:591
+#: export_format_manager.cc:218 export_format_specification.cc:657
 msgid "Session rate"
 msgstr ""
 
-#: export_format_specification.cc:549
-msgid "normalize"
+#: export_format_specification.cc:609
+msgid "normalize loudness"
+msgstr ""
+
+#: export_format_specification.cc:611
+msgid "normalize peak"
 msgstr ""
 
-#: export_format_specification.cc:553
+#: export_format_specification.cc:616
 msgid "trim"
 msgstr ""
 
-#: export_format_specification.cc:555
+#: export_format_specification.cc:618
 msgid "trim start"
 msgstr ""
 
-#: export_format_specification.cc:557
+#: export_format_specification.cc:620
 msgid "trim end"
 msgstr ""
 
@@ -510,24 +701,20 @@ msgstr ""
 msgid "Rectangular"
 msgstr ""
 
-#: export_formats.cc:52 session.cc:5421 session.cc:5437
-msgid "None"
-msgstr ""
-
 #: export_formats.cc:159
-msgid "8bit"
+msgid "8-bit"
 msgstr ""
 
 #: export_formats.cc:161
-msgid "16bit"
+msgid "16-bit"
 msgstr ""
 
 #: export_formats.cc:163
-msgid "24bit"
+msgid "24-bit"
 msgstr ""
 
 #: export_formats.cc:165
-msgid "32bit"
+msgid "32-bit"
 msgstr ""
 
 #: export_formats.cc:167
@@ -539,7 +726,7 @@ msgid "double"
 msgstr ""
 
 #: export_formats.cc:171
-msgid "8bit unsigned"
+msgid "8-bit unsigned"
 msgstr ""
 
 #: export_formats.cc:173
@@ -550,94 +737,90 @@ msgstr ""
 msgid "No sample format"
 msgstr ""
 
-#: export_handler.cc:360
+#: export_handler.cc:419
 msgid "File %1 uploaded to %2"
 msgstr ""
 
-#: export_handler.cc:366
+#: export_handler.cc:425
 msgid ""
 "upload to Soundcloud failed. Perhaps your email or password are incorrect?\n"
 msgstr ""
 
-#: export_handler.cc:413
-msgid "Editor: cannot open \"%1\" as export file for CD marker file"
+#: export_handler.cc:551 export_handler.cc:554
+msgid "an error occurred while writing a TOC/CUE file: %1"
 msgstr ""
 
-#: export_handler.cc:492 export_handler.cc:495
-msgid "an error occured while writing a TOC/CUE file: %1"
-msgstr ""
-
-#: export_handler.cc:744 export_handler.cc:802
+#: export_handler.cc:844 export_handler.cc:902
 msgid "Cannot convert %1 to Latin-1 text"
 msgstr ""
 
-#: export_profile_manager.cc:93
+#: export_profile_manager.cc:94
 msgid "Searching for export formats in %1"
 msgstr ""
 
-#: export_profile_manager.cc:99
+#: export_profile_manager.cc:100
 msgid "Unable to create export format directory %1: %2"
 msgstr ""
 
-#: export_profile_manager.cc:262
+#: export_profile_manager.cc:268
 msgid "Unable to remove export preset %1: %2"
 msgstr ""
 
-#: export_profile_manager.cc:351
+#: export_profile_manager.cc:357
 msgid "Selection"
 msgstr ""
 
-#: export_profile_manager.cc:604
+#: export_profile_manager.cc:621
 msgid "Unable to rename export format %1 to %2: %3"
 msgstr ""
 
-#: export_profile_manager.cc:636
+#: export_profile_manager.cc:653
 msgid "Unable to remove export profile %1: %2"
 msgstr ""
 
-#: export_profile_manager.cc:654
+#: export_profile_manager.cc:671
 msgid "empty format"
 msgstr ""
 
-#: export_profile_manager.cc:735
+#: export_profile_manager.cc:752
 msgid "Cannot load export format from %1"
 msgstr ""
 
-#: export_profile_manager.cc:741
+#: export_profile_manager.cc:758
 msgid "Cannot export format read from %1"
 msgstr ""
 
-#: export_profile_manager.cc:835
+#: export_profile_manager.cc:852
 msgid "No timespan has been selected!"
 msgstr ""
 
-#: export_profile_manager.cc:839
+#: export_profile_manager.cc:856
 msgid "No channels have been selected!"
 msgstr ""
 
-#: export_profile_manager.cc:843
+#: export_profile_manager.cc:860
 msgid "Some channels are empty"
 msgstr ""
 
-#: export_profile_manager.cc:876
+#: export_profile_manager.cc:893
 msgid "No format selected!"
 msgstr "Inget format valt!"
 
-#: export_profile_manager.cc:878
+#: export_profile_manager.cc:895
 msgid "All channels are empty!"
 msgstr ""
 
-#: export_profile_manager.cc:880
+#: export_profile_manager.cc:897
 msgid "One or more of the selected formats is not compatible with this system!"
 msgstr ""
 
-#: export_profile_manager.cc:883
+#: export_profile_manager.cc:900
 msgid ""
 "%1 supports only %2 channels, but you have %3 channels in your channel "
 "configuration"
 msgstr ""
 
-#: file_source.cc:201 session_state.cc:2857
+#: file_source.cc:201 session_state.cc:3284
 msgid ""
 "there are already 1000 files with names like %1; versioning discontinued"
 msgstr ""
@@ -646,25 +829,25 @@ msgstr ""
 msgid "cannot rename file source from %1 to %2 (%3)"
 msgstr ""
 
-#: file_source.cc:251 file_source.cc:375
+#: file_source.cc:251 file_source.cc:374
 msgid "FileSource: search path not set"
 msgstr ""
 
-#: file_source.cc:435
+#: file_source.cc:434
 msgid ""
 "FileSource: \"%1\" is ambigous when searching\n"
 "\t"
 msgstr ""
 
-#: file_source.cc:442
+#: file_source.cc:441
 msgid "Filesource: cannot find required file (%1)"
 msgstr ""
 
-#: file_source.cc:487
+#: file_source.cc:486
 msgid "Filesource: cannot find required file (%1): %2"
 msgstr ""
 
-#: file_source.cc:495
+#: file_source.cc:494
 msgid "Filesource: cannot check for existing file (%1): %2"
 msgstr ""
 
@@ -678,34 +861,38 @@ msgstr ""
 msgid "cannot rename file %1 to %2 (%3)"
 msgstr ""
 
-#: filesystem_paths.cc:105
+#: filesystem_paths.cc:120
 msgid "Cannot create Configuration directory %1 - cannot run"
 msgstr ""
 
-#: filesystem_paths.cc:110
+#: filesystem_paths.cc:125
 msgid ""
 "Configuration directory %1 already exists and is not a directory/folder - "
 "cannot run"
 msgstr ""
 
-#: filesystem_paths.cc:171
+#: filesystem_paths.cc:186
 msgid "Cannot create cache directory %1 - cannot run"
 msgstr ""
 
-#: filesystem_paths.cc:176
+#: filesystem_paths.cc:191
 msgid ""
 "Cache directory %1 already exists and is not a directory/folder - cannot run"
 msgstr ""
 
-#: filesystem_paths.cc:194
+#: filesystem_paths.cc:209
 msgid "ARDOUR_DLL_PATH not set in environment - exiting\n"
 msgstr ""
 
-#: filesystem_paths.cc:245
+#: filesystem_paths.cc:232
+msgid "Cannot determine %1 package directory"
+msgstr ""
+
+#: filesystem_paths.cc:277
 msgid "ARDOUR_CONFIG_PATH not set in environment\n"
 msgstr ""
 
-#: filesystem_paths.cc:266
+#: filesystem_paths.cc:298
 msgid "ARDOUR_DATA_PATH not set in environment\n"
 msgstr ""
 
@@ -713,50 +900,79 @@ msgstr ""
 msgid "filter: error creating name for new file based on %1"
 msgstr ""
 
-#: filter.cc:79
+#: filter.cc:92
 msgid "filter: error creating new file %1 (%2)"
 msgstr ""
 
-#: find_session.cc:59
+#: find_session.cc:60
 msgid "cannot check session path %1 (%2)"
 msgstr ""
 
-#: find_session.cc:85
+#: find_session.cc:86
 msgid "cannot check statefile %1 (%2)"
 msgstr ""
 
-#: find_session.cc:121
+#: find_session.cc:125
 msgid "%1 is not a snapshot file"
 msgstr ""
 
-#: find_session.cc:138
+#: find_session.cc:142
 msgid "cannot determine current working directory (%1)"
 msgstr ""
 
-#: find_session.cc:155
+#: find_session.cc:159
 msgid "unknown file type for session %1"
 msgstr ""
 
-#: globals.cc:234
+#: gain_control.cc:81
+#, c-format
+msgid "%3.1f dB"
+msgstr ""
+
+#: globals.cc:266
 msgid "Could not set system open files limit to \"unlimited\""
 msgstr ""
 
-#: globals.cc:236
+#: globals.cc:268
 msgid "Could not set system open files limit to %1"
 msgstr ""
 
-#: globals.cc:240
+#: globals.cc:272 globals.cc:289
 msgid "Your system is configured to limit %1 to only %2 open files"
 msgstr ""
 
-#: globals.cc:244
+#: globals.cc:276
 msgid "Could not get system open files limit (%1)"
 msgstr ""
 
-#: globals.cc:415
+#: globals.cc:291
+msgid "Could not set system open files limit. Current limit is %1 open files"
+msgstr ""
+
+#: globals.cc:474
 msgid "Loading configuration"
 msgstr ""
 
+#: globals.cc:554 route.cc:182 route.cc:4149 session.cc:1157
+msgid "Monitor"
+msgstr ""
+
+#: globals.cc:555 session_state.cc:642
+msgid "Master"
+msgstr ""
+
+#: globals.cc:556
+msgid "Control"
+msgstr ""
+
+#: globals.cc:557
+msgid "Click"
+msgstr ""
+
+#: globals.cc:558
+msgid "Mackie"
+msgstr ""
+
 #: import.cc:146
 msgid "Cannot find new filename for imported file %1"
 msgstr ""
@@ -782,7 +998,7 @@ msgid "Track %1 of %2 contained no usable MIDI data"
 msgstr ""
 
 #: import.cc:427
-msgid "MIDI file %1 was not readable (no reason available)"
+msgid "MIDI file could not be written (best guess: %1)"
 msgstr ""
 
 #: import.cc:475
@@ -809,110 +1025,113 @@ msgstr ""
 msgid "Unknown"
 msgstr ""
 
-#: instrument_info.cc:231
+#: instrument_info.cc:243
 msgid "preset %1 (bank %2)"
 msgstr ""
 
-#: internal_send.cc:316 internal_send.cc:317
+#: internal_send.cc:338 internal_send.cc:339
 msgid "%1 - cannot find any track/bus with the ID %2 to connect to"
 msgstr ""
 
-#: io.cc:209
+#: io.cc:212
 msgid "IO: cannot disconnect port %1 from %2"
 msgstr ""
 
-#: io.cc:344 io.cc:431
+#: io.cc:347 io.cc:435
 msgid "IO: cannot register input port %1"
 msgstr ""
 
-#: io.cc:349 io.cc:436
+#: io.cc:352 io.cc:440
 msgid "IO: cannot register output port %1"
 msgstr ""
 
-#: io.cc:598 io.cc:654
+#: io.cc:607 io.cc:668
 msgid "incorrect XML node \"%1\" passed to IO object"
 msgstr ""
 
-#: io.cc:713
+#: io.cc:730
 msgid "in"
 msgstr ""
 
-#: io.cc:713
+#: io.cc:730
 msgid "out"
 msgstr ""
 
-#: io.cc:714
+#: io.cc:731
 msgid "input"
 msgstr "ingång"
 
-#: io.cc:714
+#: io.cc:731
 msgid "output"
 msgstr "utgång"
 
-#: io.cc:724
+#: io.cc:741
 msgid "Unknown bundle \"%1\" listed for %2 of %3"
 msgstr ""
 
-#: io.cc:790
+#: io.cc:807
 msgid "Bundle %1 was not available - \"%2\" used instead"
 msgstr ""
 
-#: io.cc:793
+#: io.cc:810
 msgid "No %1 bundles available as a replacement"
 msgstr ""
 
-#: io.cc:897
+#: io.cc:914
 msgid "%1: cannot create I/O ports"
 msgstr ""
 
-#: io.cc:1025 io.cc:1126
+#: io.cc:1042 io.cc:1143
 msgid "IO: badly formed string in XML node for inputs \"%1\""
 msgstr ""
 
-#: io.cc:1030 io.cc:1131
+#: io.cc:1047 io.cc:1148
 msgid "bad input string in XML node \"%1\""
 msgstr ""
 
-#: io.cc:1069
+#: io.cc:1086
 msgid "IO: badly formed string in XML node for outputs \"%1\""
 msgstr ""
 
-#: io.cc:1074
+#: io.cc:1091
 msgid "IO: bad output string in XML node \"%1\""
 msgstr ""
 
-#: io.cc:1413
+#: io.cc:1256 plugin.cc:275
+msgid "Out"
+msgstr ""
+
+#: io.cc:1256 plugin.cc:273
+msgid "In"
+msgstr ""
+
+#: io.cc:1454
 #, c-format
 msgid "%s %u"
 msgstr ""
 
-#: io.cc:1460
+#: io.cc:1501
 #, c-format
 msgid "%s in"
 msgstr ""
 
-#: io.cc:1462
+#: io.cc:1503
 #, c-format
 msgid "%s out"
 msgstr ""
 
-#: io.cc:1537 session.cc:733 session.cc:767
+#: io.cc:1578 session.cc:957 session.cc:991
 msgid "mono"
 msgstr ""
 
-#: io.cc:1539 session.cc:746 session.cc:781
+#: io.cc:1580 session.cc:970 session.cc:1005
 msgid "L"
 msgstr ""
 
-#: io.cc:1539 session.cc:748 session.cc:783
+#: io.cc:1580 session.cc:972 session.cc:1007
 msgid "R"
 msgstr ""
 
-#: io.cc:1541 io.cc:1547
-#, c-format
-msgid "%d"
-msgstr ""
-
 #: ladspa_plugin.cc:93
 msgid "LADSPA: Unable to open module: "
 msgstr ""
@@ -929,81 +1148,81 @@ msgstr ""
 msgid "LADSPA: \"%1\" cannot be used, since it cannot do inplace processing"
 msgstr ""
 
-#: ladspa_plugin.cc:311
+#: ladspa_plugin.cc:308
 msgid ""
 "illegal parameter number used with plugin \"%1\". This may indicate a change "
 "in the plugin design, and presets may be invalid"
 msgstr ""
 
-#: ladspa_plugin.cc:390 ladspa_plugin.cc:440
+#: ladspa_plugin.cc:387 ladspa_plugin.cc:437
 msgid "Bad node sent to LadspaPlugin::set_state"
 msgstr ""
 
-#: ladspa_plugin.cc:405 ladspa_plugin.cc:454
+#: ladspa_plugin.cc:402 ladspa_plugin.cc:451
 msgid "LADSPA: no ladspa port number"
 msgstr ""
 
-#: ladspa_plugin.cc:411 ladspa_plugin.cc:460
+#: ladspa_plugin.cc:408 ladspa_plugin.cc:457
 msgid "LADSPA: no ladspa port data"
 msgstr ""
 
-#: ladspa_plugin.cc:842
+#: ladspa_plugin.cc:863
 msgid "Could not locate HOME.  Preset not removed."
 msgstr ""
 
-#: ladspa_plugin.cc:881 ladspa_plugin.cc:887
+#: ladspa_plugin.cc:902 ladspa_plugin.cc:908
 msgid "Could not create %1.  Preset not saved. (%2)"
 msgstr ""
 
-#: ladspa_plugin.cc:894
+#: ladspa_plugin.cc:915
 msgid "Error saving presets file %1."
 msgstr ""
 
-#: ladspa_plugin.cc:936
+#: ladspa_plugin.cc:957
 msgid "Could not locate HOME.  Preset not saved."
 msgstr ""
 
-#: location.cc:456
+#: location.cc:455
 msgid "You cannot put a CD marker at this position"
 msgstr ""
 
-#: location.cc:608
+#: location.cc:607
 msgid "incorrect XML node passed to Location::set_state"
 msgstr ""
 
-#: location.cc:613
+#: location.cc:612
 msgid "XML node for Location has no ID information"
 msgstr ""
 
-#: location.cc:617
+#: location.cc:616
 msgid "XML node for Location has no name information"
 msgstr ""
 
-#: location.cc:624
+#: location.cc:623
 msgid "XML node for Location has no start information"
 msgstr ""
 
-#: location.cc:635
+#: location.cc:634
 msgid "XML node for Location has no end information"
 msgstr ""
 
-#: location.cc:642
+#: location.cc:641
 msgid "XML node for Location has no flags information"
 msgstr ""
 
-#: location.cc:856
+#: location.cc:868
 msgid "Locations: attempt to use unknown location as selected location"
 msgstr ""
 
-#: location.cc:1034
+#: location.cc:1046
 msgid "incorrect XML mode passed to Locations::set_state"
 msgstr ""
 
-#: location.cc:1047 session.cc:1293 session.cc:4919 session_state.cc:1053
+#: location.cc:1059 session.cc:1667 session.cc:6305 session_state.cc:1205
 msgid "session"
 msgstr ""
 
-#: location.cc:1112
+#: location.cc:1126
 msgid "could not load location from session file - ignored"
 msgstr ""
 
@@ -1045,48 +1264,104 @@ msgid ""
 "You may rename the imported location:"
 msgstr ""
 
-#: ltc_slave.cc:272
+#: ltc_file_reader.cc:96
+msgid "LTCFileReader: cannot open file \"%1\""
+msgstr ""
+
+#: ltc_file_reader.cc:105
+msgid "LTCFileReader: cannot open file \"%1\" (%3)"
+msgstr ""
+
+#: ltc_file_reader.cc:109
+msgid "LTCFileReader: \"%1\" is an empty audio file"
+msgstr ""
+
+#: ltc_file_reader.cc:134
+msgid "LTCFileReader:: invalid audio channel selected"
+msgstr ""
+
+#: ltc_slave.cc:275
 msgid "Session framerate adjusted from %1 to LTC's %2."
 msgstr ""
 
-#: ltc_slave.cc:286
+#: ltc_slave.cc:289
 msgid "Session and LTC framerate mismatch: LTC:%1 Session:%2."
 msgstr ""
 
-#: ltc_slave.cc:603
+#: ltc_slave.cc:609
 msgid "flywheel"
 msgstr ""
 
-#: midi_diskstream.cc:173
+#: lua_api.cc:87
+msgid "Script with given name was not found\n"
+msgstr ""
+
+#: lua_api.cc:96
+msgid "Failed to instantiate Lua Processor\n"
+msgstr ""
+
+#: luaproc.cc:876
+msgid "Failed to load Lua script from session state."
+msgstr ""
+
+#: luaproc.cc:886
+msgid "Session State for LuaProcessor did not include a Lua script."
+msgstr ""
+
+#: luaproc.cc:890
+msgid "Invalid/incompatible Lua script found for LuaProcessor."
+msgstr ""
+
+#: luaproc.cc:918
+msgid "Bad node sent to LuaProc::set_state"
+msgstr ""
+
+#: luaproc.cc:928
+msgid "LuaProc: port has no symbol, ignored"
+msgstr ""
+
+#: luaproc.cc:934
+msgid "LuaProc: port has no value, ignored"
+msgstr ""
+
+#: luaproc.cc:1164
+msgid "Unable to create LuaProc presets directory"
+msgstr ""
+
+#: luascripting.cc:132
+msgid "Script '%1' has no valid descriptor."
+msgstr ""
+
+#: midi_diskstream.cc:172
 msgid ""
 "%1: I/O configuration change %4 requested to use %2, but channel setup is %3"
 msgstr ""
 
-#: midi_diskstream.cc:225
+#: midi_diskstream.cc:224
 msgid "MidiDiskstream: Playlist \"%1\" isn't a midi playlist"
 msgstr ""
 
-#: midi_diskstream.cc:276
+#: midi_diskstream.cc:275
 msgid "MidiDiskstream %1: there is no existing playlist to make a copy of!"
 msgstr ""
 
-#: midi_diskstream.cc:754
+#: midi_diskstream.cc:753
 msgid "MidiDiskstream %1: cannot read %2 from playlist at frame %3"
 msgstr ""
 
-#: midi_diskstream.cc:891
+#: midi_diskstream.cc:890
 msgid "MidiDiskstream %1: cannot write to disk"
 msgstr ""
 
-#: midi_diskstream.cc:925
+#: midi_diskstream.cc:924
 msgid "MidiDiskstream \"%1\": cannot flush captured data to disk!"
 msgstr ""
 
-#: midi_diskstream.cc:1014
+#: midi_diskstream.cc:1013
 msgid "%1: could not create region for complete midi file"
 msgstr ""
 
-#: midi_diskstream.cc:1055
+#: midi_diskstream.cc:1054
 msgid "MidiDiskstream: could not create region for captured midi!"
 msgstr ""
 
@@ -1106,31 +1381,47 @@ msgstr ""
 msgid "No SysExID found for sys-ex property change - ignored"
 msgstr ""
 
-#: midi_model.cc:1994
-msgid "transpose"
+#: midi_patch_manager.cc:78
+msgid "Loading %1 MIDI patch from %2"
+msgid_plural "Loading %1 MIDI patches from %2"
+msgstr[0] ""
+msgstr[1] ""
+
+#: midi_patch_manager.cc:109
+msgid "Unloading %1 MIDI patch from %2"
+msgid_plural "Unloading %1 MIDI patches from %2"
+msgstr[0] ""
+msgstr[1] ""
+
+#: midi_patch_manager.cc:126
+msgid "Error parsing MIDI patch file %1"
 msgstr ""
 
-#: midi_patch_manager.cc:133
+#: midi_patch_manager.cc:135
 msgid "Duplicate MIDI device `%1' in `%2' ignored"
 msgstr ""
 
-#: midi_scene_changer.cc:295
+#: midi_patch_manager.cc:170
+msgid "Removing MIDI patch file %1"
+msgstr ""
+
+#: midi_scene_changer.cc:312
 msgid "Scene "
 msgstr ""
 
-#: midi_source.cc:125
+#: midi_source.cc:126
 msgid "Missing parameter property on InterpolationStyle"
 msgstr ""
 
-#: midi_source.cc:131
+#: midi_source.cc:132
 msgid "Missing style property on InterpolationStyle"
 msgstr ""
 
-#: midi_source.cc:140
+#: midi_source.cc:141
 msgid "Missing parameter property on AutomationState"
 msgstr ""
 
-#: midi_source.cc:146
+#: midi_source.cc:147
 msgid "Missing state property on AutomationState"
 msgstr ""
 
@@ -1138,57 +1429,57 @@ msgstr ""
 msgid "MIDI stretch created non-MIDI source"
 msgstr ""
 
-#: monitor_processor.cc:53
+#: monitor_processor.cc:54
 msgid "monitor dim"
 msgstr ""
 
-#: monitor_processor.cc:54
+#: monitor_processor.cc:55
 msgid "monitor cut"
 msgstr ""
 
-#: monitor_processor.cc:55
+#: monitor_processor.cc:56
 msgid "monitor mono"
 msgstr ""
 
-#: monitor_processor.cc:58
+#: monitor_processor.cc:59
 msgid "monitor dim level"
 msgstr ""
 
-#: monitor_processor.cc:62
+#: monitor_processor.cc:63
 msgid "monitor solo boost level"
 msgstr ""
 
-#: monitor_processor.cc:512
+#: monitor_processor.cc:543
 msgid "cut control %1"
 msgstr ""
 
-#: monitor_processor.cc:513
+#: monitor_processor.cc:544
 msgid "dim control"
 msgstr ""
 
-#: monitor_processor.cc:514
+#: monitor_processor.cc:545
 msgid "polarity control"
 msgstr ""
 
-#: monitor_processor.cc:515
+#: monitor_processor.cc:546
 msgid "solo control"
 msgstr ""
 
-#: mtc_slave.cc:240
+#: mtc_slave.cc:241
 msgid "MTC Slave: atomic read of current time failed, sleeping!"
 msgstr ""
 
-#: mtc_slave.cc:362
+#: mtc_slave.cc:363
 msgid ""
 "Unknown rate/drop value %1 in incoming MTC stream, session values used "
 "instead"
 msgstr ""
 
-#: mtc_slave.cc:382
+#: mtc_slave.cc:383
 msgid "Session framerate adjusted from %1 TO: MTC's %2."
 msgstr ""
 
-#: mtc_slave.cc:396
+#: mtc_slave.cc:397
 msgid "Session and MTC framerate mismatch: MTC:%1 %2:%3."
 msgstr ""
 
@@ -1244,7 +1535,7 @@ msgstr ""
 msgid "fixed time region copy"
 msgstr ""
 
-#: pannable.cc:207
+#: pannable.cc:208
 msgid "Pannable given XML data for %1 - ignored"
 msgstr ""
 
@@ -1278,19 +1569,67 @@ msgstr ""
 msgid "select panner: %1\n"
 msgstr ""
 
-#: panner_shell.cc:255
+#: panner_shell.cc:257
 msgid "Unknown panner plugin \"%1\" found in pan state - ignored"
 msgstr ""
 
-#: panner_shell.cc:261
+#: panner_shell.cc:263
 msgid "panner plugin node has no type information!"
 msgstr ""
 
-#: playlist.cc:2138
+#: parameter_descriptor.cc:201
+msgid "Note|C"
+msgstr ""
+
+#: parameter_descriptor.cc:202
+msgid "Note|C#"
+msgstr ""
+
+#: parameter_descriptor.cc:203
+msgid "Note|D"
+msgstr ""
+
+#: parameter_descriptor.cc:204
+msgid "Note|D#"
+msgstr ""
+
+#: parameter_descriptor.cc:205
+msgid "Note|E"
+msgstr ""
+
+#: parameter_descriptor.cc:206
+msgid "Note|F"
+msgstr ""
+
+#: parameter_descriptor.cc:207
+msgid "Note|F#"
+msgstr ""
+
+#: parameter_descriptor.cc:208
+msgid "Note|G"
+msgstr ""
+
+#: parameter_descriptor.cc:209
+msgid "Note|G#"
+msgstr ""
+
+#: parameter_descriptor.cc:210
+msgid "Note|A"
+msgstr ""
+
+#: parameter_descriptor.cc:211
+msgid "Note|A#"
+msgstr ""
+
+#: parameter_descriptor.cc:212
+msgid "Note|B"
+msgstr ""
+
+#: playlist.cc:2234
 msgid "region state node has no ID, ignored"
 msgstr ""
 
-#: playlist.cc:2156
+#: playlist.cc:2252
 msgid "Playlist: cannot create region from XML"
 msgstr ""
 
@@ -1302,125 +1641,245 @@ msgstr ""
 msgid "Could not construct playlist for PlaylistSource from session data!"
 msgstr ""
 
-#: plugin.cc:328
+#: plugin.cc:126
+msgid "Cannot remove plugin factory preset."
+msgstr ""
+
+#: plugin.cc:144
+msgid "Preset with given name already exists."
+msgstr ""
+
+#: plugin.cc:263
+msgid "Audio"
+msgstr ""
+
+#: plugin.cc:266
+msgid "Midi"
+msgstr ""
+
+#: plugin.cc:269
+msgid "?"
+msgstr ""
+
+#: plugin.cc:412
 msgid ""
 "Plugin presets are not supported in this build of %1. Consider paying for a "
 "full version"
 msgstr ""
 
-#: plugin.cc:403
+#: plugin.cc:495
 msgid ""
 "Saving plugin settings is not supported in this build of %1. Consider paying "
 "for the full version"
 msgstr ""
 
-#: plugin_insert.cc:596
+#: plugin_insert.cc:1148
 msgid "programming error: "
 msgstr ""
 
-#: plugin_insert.cc:933
+#: plugin_insert.cc:1700
+msgid "SC %1"
+msgstr ""
+
+#: plugin_insert.cc:2352
 msgid "XML node describing plugin is missing the `type' field"
 msgstr ""
 
-#: plugin_insert.cc:948
+#: plugin_insert.cc:2369
 msgid "unknown plugin type %1 in plugin insert state"
 msgstr ""
 
-#: plugin_insert.cc:976
+#: plugin_insert.cc:2397
 msgid "Plugin has no unique ID field"
 msgstr ""
 
-#: plugin_insert.cc:1001
+#: plugin_insert.cc:2435
 msgid ""
 "Found a reference to a plugin (\"%1\") that is unknown.\n"
 "Perhaps it was removed or moved since it was last used."
 msgstr ""
 
-#: plugin_insert.cc:1115
+#: plugin_insert.cc:2645
 msgid "PluginInsert: Auto: no ladspa port number"
 msgstr ""
 
-#: plugin_insert.cc:1122
+#: plugin_insert.cc:2652
 msgid "PluginInsert: Auto: port id out of range"
 msgstr ""
 
-#: plugin_insert.cc:1158
+#: plugin_insert.cc:2688
 msgid "PluginInsert: automatable control %1 not found - ignored"
 msgstr ""
 
-#: plugin_manager.cc:209
+#: plugin_manager.cc:220
 msgid "Discovering Plugins"
 msgstr ""
 
-#: plugin_manager.cc:231
+#: plugin_manager.cc:251
 msgid "Scanning LADSPA Plugins"
 msgstr ""
 
-#: plugin_manager.cc:234
+#: plugin_manager.cc:253
+msgid "Scanning Lua DSP Processors"
+msgstr ""
+
+#: plugin_manager.cc:256
 msgid "Scanning LV2 Plugins"
 msgstr ""
 
-#: plugin_manager.cc:239
+#: plugin_manager.cc:262
 msgid "Scanning Windows VST Plugins"
 msgstr ""
 
-#: plugin_manager.cc:246
+#: plugin_manager.cc:264
+msgid "Discovering Windows VST Plugins"
+msgstr ""
+
+#: plugin_manager.cc:273
 msgid "Scanning Linux VST Plugins"
 msgstr ""
 
-#: plugin_manager.cc:252
+#: plugin_manager.cc:275
+msgid "Discovering Linux VST Plugins"
+msgstr ""
+
+#: plugin_manager.cc:288
+msgid "VST Blacklist: "
+msgstr ""
+
+#: plugin_manager.cc:290
+msgid "VST Blacklist:"
+msgstr ""
+
+#: plugin_manager.cc:300
 msgid "Scanning AU Plugins"
 msgstr ""
 
-#: plugin_manager.cc:256
+#: plugin_manager.cc:302
+msgid "Discovering AU Plugins"
+msgstr ""
+
+#: plugin_manager.cc:307
 msgid "Plugin Scan Complete..."
 msgstr ""
 
-#: plugin_manager.cc:393
+#: plugin_manager.cc:513
 msgid "LADSPA"
 msgstr ""
 
-#: plugin_manager.cc:445
+#: plugin_manager.cc:565
 msgid "Could not parse rdf file: %1"
 msgstr ""
 
-#: plugin_manager.cc:482
+#: plugin_manager.cc:602
 msgid "LADSPA: cannot load module \"%1\" (%2)"
 msgstr ""
 
-#: plugin_manager.cc:489
+#: plugin_manager.cc:609
 msgid "LADSPA: module \"%1\" has no descriptor function."
 msgstr ""
 
-#: plugin_manager.cc:705
+#: plugin_manager.cc:813
+msgid "--- Windows VST plugins Scan: %1"
+msgstr ""
+
+#: plugin_manager.cc:819
 msgid "VST"
 msgstr ""
 
-#: plugin_manager.cc:732
+#: plugin_manager.cc:824
+msgid "--- Windows VST plugins Scan Done"
+msgstr ""
+
+#: plugin_manager.cc:839
+msgid "cannot open dll"
+msgstr ""
+
+#: plugin_manager.cc:843
+msgid "invalid dll, file too small"
+msgstr ""
+
+#: plugin_manager.cc:847
+msgid "not a dll"
+msgstr ""
+
+#: plugin_manager.cc:853
+msgid "cannot determine dll type"
+msgstr ""
+
+#: plugin_manager.cc:857
+msgid "cannot read dll PE header"
+msgstr ""
+
+#: plugin_manager.cc:862
+msgid "invalid dll PE header"
+msgstr ""
+
+#: plugin_manager.cc:869
+msgid "i386 (32-bit)"
+msgstr ""
+
+#: plugin_manager.cc:872
+msgid "Itanium"
+msgstr ""
+
+#: plugin_manager.cc:875
+msgid "x64 (64-bit)"
+msgstr ""
+
+#: plugin_manager.cc:878
+msgid "Native Architecture"
+msgstr ""
+
+#: plugin_manager.cc:881
+msgid "Unknown Architecture"
+msgstr ""
+
+#: plugin_manager.cc:897
+msgid " *  %1 (cache only)"
+msgstr ""
+
+#: plugin_manager.cc:899
+msgid " *  %1 - %2"
+msgstr ""
+
+#: plugin_manager.cc:913
+msgid " -> Cannot get Windows VST information, plugin ignored."
+msgstr ""
+
+#: plugin_manager.cc:924
 msgid ""
-"VST plugin %1 does not support processReplacing, and so cannot be used in %2 "
-"at this time"
+"VST plugin %1 does not support processReplacing, and cannot be used in %2 at "
+"this time"
 msgstr ""
 
-#: plugin_manager.cc:824
+#: plugin_manager.cc:959
+msgid "Ignoring duplicate Windows VST plugin \"%1\""
+msgstr ""
+
+#: plugin_manager.cc:971
+msgid " -> OK (VST Plugin \"%1\" was added)."
+msgstr ""
+
+#: plugin_manager.cc:1019
 msgid "LXVST"
 msgstr ""
 
-#: plugin_manager.cc:851
+#: plugin_manager.cc:1046
 msgid ""
 "linuxVST plugin %1 does not support processReplacing, and so cannot be used "
 "in %2 at this time"
 msgstr ""
 
-#: plugin_manager.cc:1020
+#: plugin_manager.cc:1213
 msgid "unknown plugin status type \"%1\" - all entries ignored"
 msgstr ""
 
-#: plugin_manager.cc:1037
+#: plugin_manager.cc:1232
 msgid "unknown plugin type \"%1\" - ignored"
 msgstr ""
 
-#: port.cc:450
+#: port.cc:504
 msgid "could not reregister %1"
 msgstr ""
 
@@ -1428,150 +1887,215 @@ msgstr ""
 msgid "insert %1"
 msgstr ""
 
-#: port_insert.cc:197
+#: port_insert.cc:204
 msgid "XML node describing port insert is missing the `type' field"
 msgstr ""
 
-#: port_insert.cc:202
+#: port_insert.cc:209
 msgid "non-port insert XML used for port plugin insert"
 msgstr ""
 
-#: port_manager.cc:287
+#: port_manager.cc:288
 msgid ""
 "a port with the name \"%1\" already exists: check for duplicated track/bus "
 "names"
 msgstr ""
 
-#: port_manager.cc:289
+#: port_manager.cc:290
 msgid ""
 "No more ports are available. You will need to stop %1 and restart with more "
 "ports if you need this many tracks."
 msgstr ""
 
-#: port_manager.cc:292
+#: port_manager.cc:293
 msgid "AudioEngine: cannot register port \"%1\": %2"
 msgstr ""
 
-#: port_manager.cc:331
+#: port_manager.cc:332
 msgid "unable to create port: %1"
 msgstr ""
 
-#: port_manager.cc:418
+#: port_manager.cc:453
 msgid "AudioEngine: cannot connect %1 (%2) to %3 (%4)"
 msgstr "AudioEngine: kan inte ansluta %1 (%2) till %3 (%4)"
 
-#: port_manager.cc:470 port_manager.cc:471
+#: port_manager.cc:505 port_manager.cc:506
 msgid "Re-establising port %1 failed"
 msgstr ""
 
-#: processor.cc:214
+#: processor.cc:218
 msgid "No %1 property flag in element %2"
 msgstr ""
 
-#: processor.cc:223
+#: processor.cc:227
 msgid "No child node with active property"
 msgstr ""
 
-#: rc_configuration.cc:91
+#: rc_configuration.cc:92
 msgid "Loading system configuration file %1"
 msgstr ""
 
-#: rc_configuration.cc:95
+#: rc_configuration.cc:96
 msgid "%1: cannot read system configuration file \"%2\""
 msgstr ""
 
-#: rc_configuration.cc:100
+#: rc_configuration.cc:101
 msgid "%1: system configuration file \"%2\" not loaded successfully."
 msgstr ""
 
-#: rc_configuration.cc:104
+#: rc_configuration.cc:105
 msgid ""
 "Your system %1 configuration file is empty. This probably means that there "
 "was an error installing %1"
 msgstr ""
 
-#: rc_configuration.cc:119
+#: rc_configuration.cc:120
 msgid "Loading user configuration file %1"
 msgstr ""
 
-#: rc_configuration.cc:123
+#: rc_configuration.cc:124
 msgid "%1: cannot read configuration file \"%2\""
 msgstr ""
 
-#: rc_configuration.cc:128
+#: rc_configuration.cc:129
 msgid "%1: user configuration file \"%2\" not loaded successfully."
 msgstr ""
 
-#: rc_configuration.cc:132
+#: rc_configuration.cc:133
 msgid "your %1 configuration file is empty. This is not normal."
 msgstr ""
 
-#: rc_configuration.cc:149
+#: rc_configuration.cc:150
 msgid "Config file %1 not saved"
 msgstr ""
 
-#: recent_sessions.cc:54
+#: recent_sessions.cc:55
 msgid "cannot open recent session file %1 (%2)"
 msgstr ""
 
-#: region_factory.cc:78 region_factory.cc:120 region_factory.cc:161
-#: region_factory.cc:203
+#: recent_sessions.cc:68 recent_sessions.cc:126
+msgid "Error reading recent session file %1 (%2)"
+msgstr ""
+
+#: recent_sessions.cc:113
+msgid "Cannot open recent template file %1 (%2)"
+msgstr ""
+
+#: recent_sessions.cc:176
+msgid "Error writing recent sessions file %1 (%2)"
+msgstr ""
+
+#: recent_sessions.cc:211
+msgid "Error writing saved template file %1 (%2)"
+msgstr ""
+
+#: region_factory.cc:78 region_factory.cc:121 region_factory.cc:162
+#: region_factory.cc:204
 msgid ""
 "programming error: RegionFactory::create() called with unknown Region type"
 msgstr ""
 
-#: region_factory.cc:565
+#: region_factory.cc:566
 msgid "%1 compound-%2 (%3)"
 msgstr ""
 
-#: region_factory.cc:567
+#: region_factory.cc:568
 msgid "%1 compound-%2.1 (%3)"
 msgstr ""
 
-#: region_factory.cc:629
+#: region_factory.cc:630
 msgid "cannot create new name for region \"%1\""
 msgstr ""
 
-#: resampled_source.cc:102
+#: resampled_source.cc:107
 msgid "Import: %1"
 msgstr ""
 
-#: resampled_source.cc:132 srcfilesource.cc:75
+#: resampled_source.cc:136 srcfilesource.cc:75
 msgid "Import: src_new() failed : %1"
 msgstr ""
 
-#: return.cc:41
+#: return.cc:42
 msgid "return %1"
 msgstr ""
 
-#: route.cc:1218 route.cc:2701
+#: route.cc:862 route.cc:2797
 msgid "unknown Processor type \"%1\"; ignored"
 msgstr ""
 
-#: route.cc:1240
+#: route.cc:884
 msgid "processor could not be created. Ignored."
 msgstr ""
 
-#: route.cc:2126 route.cc:2355
+#: route.cc:2338 route.cc:2504
 msgid "Bad node sent to Route::set_state() [%1]"
 msgstr ""
 
-#: route.cc:2186
+#: route.cc:2395
 msgid "Pannable state found for route (%1) without a panner!"
 msgstr ""
 
-#: route.cc:2260 route.cc:2264 route.cc:2469 route.cc:2473
-msgid "badly formed order key string in state file! [%1] ... ignored."
+#: route.cc:3270
+msgid "Invalid Solo-Isolate propagation: from:%1 new:%2 - old:%3 = delta:%4"
+msgstr ""
+
+#: route.cc:4396
+msgid "Amp/Fader on Route '%1' went AWOL. Re-added."
 msgstr ""
 
-#: route.cc:2479
-msgid "Converting deprecated order key for %1 using Editor order %2"
+#: route.cc:4994
+msgid "lo"
 msgstr ""
 
-#: route_group.cc:459
+#: route.cc:4996
+msgid "mid"
+msgstr ""
+
+#: route.cc:4998
+msgid "hi"
+msgstr ""
+
+#: route.cc:5105
+msgid "Leveler"
+msgstr ""
+
+#: route.cc:5107
+msgid "Compressor"
+msgstr ""
+
+#: route.cc:5109 route.cc:5111
+msgid "Limiter"
+msgstr ""
+
+#: route.cc:5111
+msgid "Sidechain"
+msgstr ""
+
+#: route.cc:5114 route.cc:5116 route.cc:5133 route.cc:5135
+msgid "???"
+msgstr ""
+
+#: route.cc:5126
+msgid "Attk"
+msgstr ""
+
+#: route.cc:5128
+msgid "Ratio"
+msgstr ""
+
+#: route.cc:5131
+msgid "Rels"
+msgstr ""
+
+#: route_group.cc:507
 msgid "You cannot subgroup MIDI tracks at this time"
 msgstr ""
 
+#: route_group.cc:514
+msgid ""
+"You cannot subgroup tracks with different number of outputs at this time."
+msgstr ""
+
 #: rb_effect.cc:229 rb_effect.cc:269
 msgid "tempoize: error reading data from %1 at %2 (wanted %3, got %4)"
 msgstr ""
@@ -1580,205 +2104,245 @@ msgstr ""
 msgid "error writing tempo-adjusted data to %1"
 msgstr ""
 
-#: send.cc:61
+#: send.cc:62
 msgid "aux %1"
 msgstr ""
 
-#: send.cc:65
+#: send.cc:66
 msgid "send %1"
 msgstr ""
 
-#: send.cc:67
+#: send.cc:68
 msgid "programming error: send created using role %1"
 msgstr ""
 
-#: session.cc:357
+#: session.cc:348 session.cc:403
+msgid "Cannot connect to audio/midi engine"
+msgstr ""
+
+#: session.cc:358
+msgid "Session initialization failed"
+msgstr ""
+
+#: session.cc:374
+msgid "Failed to load template/snapshot state"
+msgstr ""
+
+#: session.cc:385
+msgid "Failed to load state"
+msgstr ""
+
+#: session.cc:409
+msgid "Cannot configure audio/midi engine with session parameters"
+msgstr ""
+
+#: session.cc:433
 msgid "Connect to engine"
 msgstr "Ansluter till ljudmotorn"
 
-#: session.cc:362
+#: session.cc:484
 msgid "Session loading complete"
 msgstr ""
 
-#: session.cc:434
+#: session.cc:575
 msgid "Set up LTC"
 msgstr ""
 
-#: session.cc:436
+#: session.cc:577
 msgid "Set up Click"
 msgstr ""
 
-#: session.cc:438
+#: session.cc:579
 msgid "Set up standard connections"
 msgstr ""
 
-#: session.cc:664
+#: session.cc:888
 msgid "could not setup Click I/O"
 msgstr ""
 
-#: session.cc:727
+#: session.cc:951
 #, c-format
 msgid "out %s"
 msgstr ""
 
-#: session.cc:729
+#: session.cc:953
 #, c-format
 msgid "out %<PRIu32>"
 msgstr ""
 
-#: session.cc:744
+#: session.cc:968
 #, c-format
 msgid "out %<PRIu32>+%<PRIu32>"
 msgstr ""
 
-#: session.cc:761
+#: session.cc:985
 #, c-format
 msgid "in %s"
 msgstr ""
 
-#: session.cc:763
+#: session.cc:987
 #, c-format
 msgid "in %<PRIu32>"
 msgstr ""
 
-#: session.cc:778
+#: session.cc:1002
 #, c-format
 msgid "in %<PRIu32>+%<PRIu32>"
 msgstr ""
 
-#: session.cc:852
+#: session.cc:1082
 msgid "cannot connect master output %1 to %2"
 msgstr ""
 
-#: session.cc:921
-msgid "Monitor"
+#: session.cc:1170
+msgid "Cannot create monitor section. 'Monitor' Port name is not unique."
 msgstr ""
 
-#: session.cc:966
+#: session.cc:1204 session.cc:1335
 msgid "cannot connect control input %1 to %2"
 msgstr ""
 
-#: session.cc:986
+#: session.cc:1224 session.cc:1354
 msgid "The preferred I/O for the monitor bus (%1) cannot be found"
 msgstr ""
 
-#: session.cc:1017
+#: session.cc:1255 session.cc:1385
 msgid "cannot connect control output %1 to %2"
 msgstr ""
 
-#: session.cc:1085
+#: session.cc:1443
 msgid "cannot create Auditioner: no auditioning of regions possible"
 msgstr ""
 
-#: session.cc:1270
+#: session.cc:1644
 msgid "Session: you can't use that location for auto punch (start <= end)"
 msgstr ""
 
-#: session.cc:1297
+#: session.cc:1671
 msgid "Session: you can't use that location for session start/end)"
 msgstr ""
 
-#: session.cc:1329
+#: session.cc:1703
 msgid ""
 "You cannot use this location for auto-loop because it has zero or negative "
 "length"
 msgstr ""
 
-#: session.cc:1497
+#: session.cc:1886
 msgid "programming error: session range removed!"
 msgstr ""
 
-#: session.cc:1751
+#: session.cc:2158
 msgid "feedback loop setup between %1 and %2"
 msgstr ""
 
-#: session.cc:2047
+#: session.cc:2419
+msgid "Track "
+msgstr ""
+
+#: session.cc:2421
+msgid "Audio "
+msgstr ""
+
+#: session.cc:2426
+msgid "MIDI "
+msgstr ""
+
+#: session.cc:2500
 msgid "Session: could not create new midi track."
 msgstr ""
 
-#: session.cc:2053
+#: session.cc:2506
 msgid ""
 "No more JACK ports are available. You will need to stop %1 and restart JACK "
 "with more ports if you need this many tracks."
 msgstr ""
 
-#: session.cc:2239 session.cc:2242
-msgid "Audio"
+#: session.cc:2547 session.cc:2550
+msgid "Midi Bus"
+msgstr ""
+
+#: session.cc:2572
+msgid "cannot configure new midi bus input"
+msgstr ""
+
+#: session.cc:2578
+msgid "cannot configure new midi bus output"
 msgstr ""
 
-#: session.cc:2266 session.cc:2274 session.cc:2352 session.cc:2360
+#: session.cc:2592 session.cc:3137
+msgid "Session: could not create new audio route."
+msgstr ""
+
+#: session.cc:3022 session.cc:3030 session.cc:3113 session.cc:3121
 msgid "cannot configure %1 in/%2 out configuration for new audio track"
 msgstr ""
 
-#: session.cc:2297
+#: session.cc:3050
 msgid "Session: could not create new audio track."
 msgstr ""
 
-#: session.cc:2330 session.cc:2333
+#: session.cc:3088 session.cc:3091
 msgid "Bus"
 msgstr ""
 
-#: session.cc:2383
-msgid "Session: could not create new audio route."
-msgstr ""
-
-#: session.cc:2443 session.cc:2453
+#: session.cc:3207 session.cc:3217
 msgid "Session: UINT_MAX routes? impossible!"
 msgstr ""
 
-#: session.cc:2475
+#: session.cc:3293
 msgid "Session: cannot create track/bus from template description"
 msgstr ""
 
-#: session.cc:2501
+#: session.cc:3331
 msgid "Session: could not create new route from template"
 msgstr ""
 
-#: session.cc:2531
+#: session.cc:3365
 msgid "Adding new tracks/busses failed"
 msgstr ""
 
-#: session.cc:3671
+#: session.cc:4784
 msgid "Merging embedded file %1: name collision AND md5 hash collision!"
 msgstr ""
 
-#: session.cc:3801 session.cc:3874
+#: session.cc:4914 session.cc:4987
 msgid "There are already %1 recordings for %2, which I consider too many."
 msgstr ""
 
-#: session.cc:4316
+#: session.cc:5663
 msgid "send ID %1 appears to be in use already"
 msgstr ""
 
-#: session.cc:4328
+#: session.cc:5675
 msgid "aux send ID %1 appears to be in use already"
 msgstr ""
 
-#: session.cc:4340
+#: session.cc:5687
 msgid "return ID %1 appears to be in use already"
 msgstr ""
 
-#: session.cc:4352
+#: session.cc:5699
 msgid "insert ID %1 appears to be in use already"
 msgstr ""
 
-#: session.cc:4477
+#: session.cc:5825
 msgid "Cannot write a range where end <= start (e.g. %1 <= %2)"
 msgstr ""
 
-#: session.cc:4486
+#: session.cc:5834
 msgid "Cannot write a range with no data."
 msgstr ""
 
-#: session.cc:4528
+#: session.cc:5876
 msgid "cannot create new file \"%1\" for %2"
 msgstr ""
 
-#: session_click.cc:161
+#: session_click.cc:162
 msgid "cannot open click soundfile %1 (%2)"
 msgstr ""
 
-#: session_click.cc:174
+#: session_click.cc:175
 msgid "cannot read data from click soundfile"
 msgstr ""
 
@@ -1817,23 +2381,36 @@ msgstr ""
 msgid "Could not save session options"
 msgstr ""
 
-#: session_directory.cc:59
+#: session_directory.cc:65
 msgid "Cannot create Session directory at path %1 Error: %2"
 msgstr ""
 
-#: session_directory.cc:76
+#: session_directory.cc:82
 msgid "Session subdirectory does not exist at path %1"
 msgstr ""
 
-#: session_events.cc:234
+#: session_directory.cc:161
+msgid ""
+"session-dir and session-name mismatch. Please use 'Menu > Session > Rename' "
+"in the future to rename sessions."
+msgstr ""
+
+#: session_directory.cc:167
+msgid ""
+"The session's interchange dir is tainted.\n"
+"There is more than one folder in '%1'.\n"
+"Please remove extra subdirs to reduce possible filename ambiguties."
+msgstr ""
+
+#: session_events.cc:229
 msgid "Session: cannot have two events of type %1 at the same frame (%2)."
 msgstr ""
 
-#: session_export.cc:125
+#: session_export.cc:152
 msgid "%1: cannot seek to %2 for export"
 msgstr ""
 
-#: session_export.cc:182
+#: session_export.cc:216
 msgid "Export ended unexpectedly: %1"
 msgstr ""
 
@@ -1843,412 +2420,465 @@ msgid ""
 "of this session."
 msgstr ""
 
-#: session_midi.cc:520
+#: session_midi.cc:570
 msgid "Session: cannot send quarter-frame MTC message (%1)"
 msgstr ""
 
-#: session_playlists.cc:378 session_playlists.cc:397
+#: session_playlists.cc:405 session_playlists.cc:424
 msgid "Session: cannot create Playlist from XML description."
 msgstr ""
 
-#: session_process.cc:136
+#: session_process.cc:159
 msgid "Session: error in no roll for %1"
 msgstr ""
 
-#: session_process.cc:1174
+#: session_process.cc:1202
 msgid "Programming error: illegal event type in process_event (%1)"
 msgstr ""
 
-#: session_state.cc:179
+#: session_state.cc:194
 msgid "solo cut control (dB)"
 msgstr ""
 
-#: session_state.cc:203
+#: session_state.cc:216
 msgid "Set block size and sample rate"
 msgstr ""
 
-#: session_state.cc:208
+#: session_state.cc:221
 msgid "Using configuration"
 msgstr ""
 
-#: session_state.cc:331
+#: session_state.cc:348
 msgid "Reset Remote Controls"
 msgstr ""
 
-#: session_state.cc:423
+#: session_state.cc:377 session_state.cc:409
+msgid "Filling playback buffers"
+msgstr ""
+
+#: session_state.cc:475
 msgid "Session: cannot create session peakfile folder \"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:430
+#: session_state.cc:482
 msgid "Session: cannot create session sounds dir \"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:437
+#: session_state.cc:489
 msgid "Session: cannot create session midi dir \"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:444
+#: session_state.cc:496
 msgid "Session: cannot create session dead sounds folder \"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:451
+#: session_state.cc:503
 msgid "Session: cannot create session export folder \"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:458
+#: session_state.cc:510
 msgid "Session: cannot create session analysis folder \"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:465
+#: session_state.cc:517
 msgid "Session: cannot create session plugins folder \"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:472
+#: session_state.cc:524
 msgid "Session: cannot create session externals folder \"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:486
+#: session_state.cc:538
 msgid "Session: cannot create session folder \"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:520
+#: session_state.cc:569
+msgid "Error reading session template file %1 (%2)"
+msgstr ""
+
+#: session_state.cc:584
+msgid "Error writing session template file %1 (%2)"
+msgstr ""
+
+#: session_state.cc:601
 msgid "Could not open %1 for writing session template"
 msgstr ""
 
-#: session_state.cc:526
+#: session_state.cc:608
 msgid "Could not open session template %1 for reading"
 msgstr ""
 
-#: session_state.cc:545
-msgid "Master"
+#: session_state.cc:626
+msgid "Loop"
 msgstr ""
 
-#: session_state.cc:606
+#: session_state.cc:707
 msgid "Could not remove pending capture state at path \"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:630
+#: session_state.cc:731
 msgid "could not rename snapshot %1 to %2 (%3)"
 msgstr ""
 
-#: session_state.cc:658
+#: session_state.cc:759
 msgid "Could not remove session file at path \"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:685
+#: session_state.cc:788
 msgid ""
 "the %1 audio engine is not connected and state saving would lose all I/O "
 "connections. Session not saved"
 msgstr ""
 
-#: session_state.cc:736
+#: session_state.cc:856
 msgid "state could not be saved to %1"
 msgstr ""
 
-#: session_state.cc:738 session_state.cc:749
+#: session_state.cc:858 session_state.cc:871
 msgid "Could not remove temporary session file at path \"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:746
+#: session_state.cc:868
 msgid "could not rename temporary session file %1 to %2 (%3)"
 msgstr ""
 
-#: session_state.cc:814
+#: session_state.cc:942
 msgid "%1: session file \"%2\" doesn't exist!"
 msgstr ""
 
-#: session_state.cc:826
+#: session_state.cc:954
 msgid "Could not understand session file %1"
 msgstr ""
 
-#: session_state.cc:835
+#: session_state.cc:963
 msgid "Session file %1 is not a session"
 msgstr ""
 
-#: session_state.cc:1147
+#: session_state.cc:1332
 msgid "programming error: Session: incorrect XML node sent to set_state()"
 msgstr ""
 
-#: session_state.cc:1201
+#: session_state.cc:1410
 msgid "Session: XML state has no options section"
 msgstr ""
 
-#: session_state.cc:1206
+#: session_state.cc:1415
 msgid "Session: XML state has no metadata section"
 msgstr ""
 
-#: session_state.cc:1217
+#: session_state.cc:1426
 msgid "Session: XML state has no sources section"
 msgstr ""
 
-#: session_state.cc:1224
+#: session_state.cc:1433
 msgid "Session: XML state has no Tempo Map section"
 msgstr ""
 
-#: session_state.cc:1231
+#: session_state.cc:1440
 msgid "Session: XML state has no locations section"
 msgstr ""
 
-#: session_state.cc:1244
+#: session_state.cc:1453
 msgid "Session: XML state has no Regions section"
 msgstr ""
 
-#: session_state.cc:1251
+#: session_state.cc:1460
 msgid "Session: XML state has no playlists section"
 msgstr ""
 
-#: session_state.cc:1271
+#: session_state.cc:1480
 msgid "Session: XML state has no bundles section"
 msgstr ""
 
-#: session_state.cc:1283
+#: session_state.cc:1492
 msgid "Session: XML state has no diskstreams section"
 msgstr ""
 
-#: session_state.cc:1291
+#: session_state.cc:1504
 msgid "Session: XML state has no routes section"
 msgstr ""
 
-#: session_state.cc:1303
+#: session_state.cc:1520
 msgid "Session: XML state has no route groups section"
 msgstr ""
 
-#: session_state.cc:1312
+#: session_state.cc:1529
 msgid "Session: XML state has no edit groups section"
 msgstr ""
 
-#: session_state.cc:1319
+#: session_state.cc:1536
 msgid "Session: XML state has no mix groups section"
 msgstr ""
 
-#: session_state.cc:1327
+#: session_state.cc:1544
 msgid "Session: XML state has no click section"
 msgstr ""
 
-#: session_state.cc:1373
+#: session_state.cc:1606
 msgid "Session: cannot create Route from XML description."
 msgstr ""
 
-#: session_state.cc:1377
+#: session_state.cc:1610
 msgid "Loaded track/bus %1"
 msgstr ""
 
-#: session_state.cc:1382
+#: session_state.cc:1615
 msgid "Tracks/busses loaded;  Adding to Session"
 msgstr ""
 
-#: session_state.cc:1386
+#: session_state.cc:1619
 msgid "Finished adding tracks/busses"
 msgstr ""
 
-#: session_state.cc:1485
+#: session_state.cc:1709
 msgid "Could not find diskstream for route"
 msgstr ""
 
-#: session_state.cc:1545
+#: session_state.cc:1760
 msgid "Session: cannot create Region from XML description."
 msgstr ""
 
-#: session_state.cc:1549
+#: session_state.cc:1764
 msgid "Can not load state for region '%1'"
 msgstr ""
 
-#: session_state.cc:1585
+#: session_state.cc:1800
 msgid "Regions in compound description not found (ID's %1 and %2): ignored"
 msgstr ""
 
-#: session_state.cc:1613
+#: session_state.cc:1828
 msgid "Nested source has no ID info in session file! (ignored)"
 msgstr ""
 
-#: session_state.cc:1625
+#: session_state.cc:1840
 msgid "Cannot reconstruct nested source for region %1"
 msgstr ""
 
-#: session_state.cc:1687
+#: session_state.cc:1902
 msgid "Session: XMLNode describing a AudioRegion is incomplete (no source)"
 msgstr ""
 
-#: session_state.cc:1695 session_state.cc:1716 session_state.cc:1736
+#: session_state.cc:1910 session_state.cc:1931 session_state.cc:1951
 msgid ""
 "Session: XMLNode describing a AudioRegion references an unknown source id =%1"
 msgstr ""
 
-#: session_state.cc:1701 session_state.cc:1722 session_state.cc:1742
+#: session_state.cc:1916 session_state.cc:1937 session_state.cc:1957
 msgid ""
 "Session: XMLNode describing a AudioRegion references a non-audio source id ="
 "%1"
 msgstr ""
 
-#: session_state.cc:1765
+#: session_state.cc:1980
 msgid ""
 "Session: XMLNode describing an AudioRegion is missing some master sources; "
 "ignored"
 msgstr ""
 
-#: session_state.cc:1799
+#: session_state.cc:2014
 msgid "Session: XMLNode describing a MidiRegion is incomplete (no source)"
 msgstr ""
 
-#: session_state.cc:1807
+#: session_state.cc:2022
 msgid ""
 "Session: XMLNode describing a MidiRegion references an unknown source id =%1"
 msgstr ""
 
-#: session_state.cc:1813
+#: session_state.cc:2028
 msgid ""
 "Session: XMLNode describing a MidiRegion references a non-midi source id =%1"
 msgstr ""
 
-#: session_state.cc:1872
+#: session_state.cc:2101
 msgid "Session: cannot create Source from XML description."
 msgstr ""
 
-#: session_state.cc:1880
+#: session_state.cc:2109
 msgid ""
 "A external MIDI file is missing. %1 cannot currently recover from missing "
 "external MIDI files"
 msgstr ""
 
-#: session_state.cc:1962
+#: session_state.cc:2191
 msgid "Found a sound file that cannot be used by %1. Talk to the programmers."
 msgstr ""
 
-#: session_state.cc:1979
+#: session_state.cc:2212
 msgid "Could not create templates directory \"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:1992
+#: session_state.cc:2224
 msgid "Template \"%1\" already exists - new version not created"
 msgstr ""
 
-#: session_state.cc:1998
+#: session_state.cc:2230
 msgid "Could not create directory for Session template\"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:2008
+#: session_state.cc:2259
 msgid "template not saved"
 msgstr ""
 
-#: session_state.cc:2018
-msgid "Could not create directory for Session template plugin state\"%1\" (%2)"
+#: session_state.cc:2501
+msgid "Unknown node \"%1\" found in Bundles list from session file"
 msgstr ""
 
-#: session_state.cc:2261
-msgid "Unknown node \"%1\" found in Bundles list from session file"
+#: session_state.cc:2969
+msgid "Cannot cleanup peak-files for read-only session."
+msgstr ""
+
+#: session_state.cc:2973
+msgid "Cannot cleanup peak-files while recording"
+msgstr ""
+
+#: session_state.cc:2996
+msgid ""
+"Timeout waiting for peak-file creation to terminate before cleanup, please "
+"try again later."
 msgstr ""
 
-#: session_state.cc:2834
+#: session_state.cc:3261
 msgid "Session: cannot create dead file folder \"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:2873
+#: session_state.cc:3296
 msgid "cannot rename unused file source from %1 to %2 (%3)"
 msgstr ""
 
-#: session_state.cc:2891
+#: session_state.cc:3312
 msgid "cannot remove peakfile %1 for %2 (%3)"
 msgstr ""
 
-#: session_state.cc:3204
+#: session_state.cc:3633
 msgid "could not backup old history file, current history not saved"
 msgstr ""
 
-#: session_state.cc:3213
+#: session_state.cc:3642
 msgid "history could not be saved to %1"
 msgstr ""
 
-#: session_state.cc:3216
+#: session_state.cc:3645
 msgid "Could not remove history file at path \"%1\" (%2)"
 msgstr ""
 
-#: session_state.cc:3220
+#: session_state.cc:3649
 msgid "could not restore history file from backup %1 (%2)"
 msgstr ""
 
-#: session_state.cc:3245
+#: session_state.cc:3674
 msgid "%1: no history file \"%2\" for this session."
 msgstr ""
 
-#: session_state.cc:3251
+#: session_state.cc:3680
 msgid "Could not understand session history file \"%1\""
 msgstr ""
 
-#: session_state.cc:3293
+#: session_state.cc:3722
 msgid "Failed to downcast MidiSource for NoteDiffCommand"
 msgstr ""
 
-#: session_state.cc:3304
+#: session_state.cc:3733
 msgid "Failed to downcast MidiSource for SysExDiffCommand"
 msgstr ""
 
-#: session_state.cc:3315
+#: session_state.cc:3744
 msgid "Failed to downcast MidiSource for PatchChangeDiffCommand"
 msgstr ""
 
-#: session_state.cc:3323
+#: session_state.cc:3752
 msgid "Couldn't figure out how to make a Command out of a %1 XMLNode."
 msgstr ""
 
-#: session_state.cc:3559
+#: session_state.cc:3990
 msgid "Session: unknown diskstream type in XML"
 msgstr ""
 
-#: session_state.cc:3564
+#: session_state.cc:3995
 msgid "Session: could not load diskstream via XML state"
 msgstr ""
 
-#: session_state.cc:3688 session_state.cc:3716 session_state.cc:3729
-#: session_state.cc:3744
+#: session_state.cc:4092
+msgid "Cannot rename read-only session."
+msgstr ""
+
+#: session_state.cc:4096
+msgid "Cannot rename session while recording"
+msgstr ""
+
+#: session_state.cc:4181 session_state.cc:4182 session_state.cc:4224
+#: session_state.cc:4228
 msgid "renaming %s as %2 failed (%3)"
 msgstr ""
 
+#: session_state.cc:4244 session_state.cc:4245 session_state.cc:4259
+#: session_state.cc:4260
+msgid "renaming %1 as %2 failed (%3)"
+msgstr ""
+
+#: session_state.cc:4571
+msgid "Cannot create new session folder %1"
+msgstr ""
+
+#: session_state.cc:4633 session_state.cc:4708
+msgid ""
+"\n"
+"copying \"%1\" failed !"
+msgstr ""
+
+#: session_state.cc:4906
+msgid "unknown reason"
+msgstr ""
+
 #: session_time.cc:214
 msgid "Unknown transport state %1 in sync callback"
 msgstr ""
 
-#: session_transport.cc:171
+#: session_transport.cc:177
 msgid "Cannot loop - no loop range defined"
 msgstr ""
 
-#: session_transport.cc:833
+#: session_transport.cc:968
 msgid ""
 "Seamless looping cannot be supported while %1 is using JACK transport.\n"
 "Recommend changing the configured options"
 msgstr ""
 
-#: session_transport.cc:915
+#: session_transport.cc:1050
 msgid "Locate called for negative sample position - ignored"
 msgstr ""
 
-#: session_transport.cc:1272
+#: session_transport.cc:1401
 msgid ""
 "Global varispeed cannot be supported while %1 is connected to JACK transport "
 "control"
 msgstr ""
 
-#: smf_source.cc:344
+#: slavable.cc:100
+msgid "Master #%1 not found, assignment lost"
+msgstr ""
+
+#: smf_source.cc:350
 msgid "Unable to read event prefix, corrupt MIDI ring"
 msgstr ""
 
-#: smf_source.cc:357
+#: smf_source.cc:363
 msgid "Event has time and size but no body, corrupt MIDI ring"
 msgstr ""
 
-#: smf_source.cc:363
+#: smf_source.cc:369
 msgid "Event time is before MIDI source position"
 msgstr ""
 
-#: smf_source.cc:409
+#: smf_source.cc:417
 msgid ""
 "Skipping event with unordered beat time %1 < %2 (off by %3 beats, %4 ticks)"
 msgstr ""
 
-#: smf_source.cc:453
+#: smf_source.cc:461
 msgid "Skipping event with unordered frame time %1 < %2"
 msgstr ""
 
-#: smf_source.cc:518
+#: smf_source.cc:526
 msgid "cannot open MIDI file %1 for write"
 msgstr ""
 
@@ -2265,7 +2895,7 @@ msgid "CAF"
 msgstr ""
 
 #: sndfile_helpers.cc:37
-msgid "W64 (64 bit WAV)"
+msgid "W64 (64-bit WAV)"
 msgstr ""
 
 #: sndfile_helpers.cc:38
@@ -2309,23 +2939,23 @@ msgid ".raw"
 msgstr ""
 
 #: sndfile_helpers.cc:66
-msgid "Signed 16 bit PCM"
+msgid "Signed 16-bit PCM"
 msgstr ""
 
 #: sndfile_helpers.cc:67
-msgid "Signed 24 bit PCM"
+msgid "Signed 24-bit PCM"
 msgstr ""
 
 #: sndfile_helpers.cc:68
-msgid "Signed 32 bit PCM"
+msgid "Signed 32-bit PCM"
 msgstr ""
 
 #: sndfile_helpers.cc:69
-msgid "Signed 8 bit PCM"
+msgid "Signed 8-bit PCM"
 msgstr ""
 
 #: sndfile_helpers.cc:70
-msgid "32 bit float"
+msgid "32-bit float"
 msgstr ""
 
 #: sndfile_helpers.cc:83
@@ -2336,88 +2966,108 @@ msgstr ""
 msgid "Big-endian (PowerPC)"
 msgstr ""
 
-#: sndfilesource.cc:260
+#: sndfilesource.cc:282
+msgid "SndFileSource: cannot open file \"%1\" for %2"
+msgstr ""
+
+#: sndfilesource.cc:300
 msgid "SndFileSource: cannot open file \"%1\" for %2 (%3)"
 msgstr ""
 
-#: sndfilesource.cc:268
+#: sndfilesource.cc:308
 msgid ""
 "SndFileSource: file only contains %1 channels; %2 is invalid as a channel "
 "number"
 msgstr ""
 
-#: sndfilesource.cc:322 sndfilesource.cc:655
+#: sndfilesource.cc:323
+msgid "Cannot mark RF64 audio file for automatic downgrade to WAV: %1"
+msgstr ""
+
+#: sndfilesource.cc:375 sndfilesource.cc:705
 msgid ""
 "cannot set broadcast info for audio file %1 (%2); dropping broadcast info "
 "for this file"
 msgstr ""
 
-#: sndfilesource.cc:368
-msgid "could not allocate file %1 for reading."
+#: sndfilesource.cc:418
+msgid "could not open file %1 for reading."
 msgstr ""
 
-#: sndfilesource.cc:403
+#: sndfilesource.cc:453
 msgid "SndFileSource: could not seek to frame %1 within %2 (%3)"
 msgstr ""
 
-#: sndfilesource.cc:412
+#: sndfilesource.cc:462
 msgid ""
 "SndFileSource: @ %1 could not read %2 within %3 (%4) (len = %5, ret was %6)"
 msgstr ""
 
-#: sndfilesource.cc:454 sndfilesource.cc:483
+#: sndfilesource.cc:504 sndfilesource.cc:533
 msgid "attempt to write a non-writable audio file source (%1)"
 msgstr ""
 
-#: sndfilesource.cc:459 utils.cc:579 utils.cc:603 utils.cc:617 utils.cc:636
+#: sndfilesource.cc:509 utils.cc:564 utils.cc:588 utils.cc:602 utils.cc:621
 msgid "programming error: %1 %2"
 msgstr ""
 
-#: sndfilesource.cc:586 sndfilesource.cc:604
+#: sndfilesource.cc:636 sndfilesource.cc:654
 msgid "attempt to flush a non-writable audio file source (%1)"
 msgstr ""
 
-#: sndfilesource.cc:591
+#: sndfilesource.cc:641
 msgid "could not allocate file %1 to write header"
 msgstr ""
 
-#: sndfilesource.cc:609
+#: sndfilesource.cc:659
 msgid "could not allocate file %1 to flush contents"
 msgstr ""
 
-#: sndfilesource.cc:621
+#: sndfilesource.cc:671
 msgid ""
 "attempt to store broadcast info in a non-writable audio file source (%1)"
 msgstr ""
 
-#: sndfilesource.cc:626
+#: sndfilesource.cc:676
 msgid "attempt to set BWF info for an un-opened audio file source (%1)"
 msgstr ""
 
-#: sndfilesource.cc:670
+#: sndfilesource.cc:720
 msgid "%1: cannot seek to %2 (libsndfile error: %3)"
 msgstr ""
 
-#: sndfilesource.cc:780
+#: sndfilesource.cc:830
 msgid "SndFileSource: \"%1\" bad read retval: %2 of %5 (%3: %4)"
 msgstr ""
 
-#: sndfilesource.cc:793 sndfilesource.cc:843 sndfilesource.cc:850
+#: sndfilesource.cc:843 sndfilesource.cc:893 sndfilesource.cc:900
 msgid "SndFileSource: \"%1\" bad write (%2)"
 msgstr ""
 
-#: sndfilesource.cc:873
+#: sndfilesource.cc:923
 msgid ""
 "Filesource: start time is already set for existing file (%1): Cannot change "
 "start time."
 msgstr ""
 
+#: sndfilesource.cc:982
+msgid "SndFileSource: cannot open file \"%1\" for reading"
+msgstr ""
+
+#: solo_control.cc:199
+msgid "Cleared Explicit solo: %1\n"
+msgstr ""
+
+#: solo_control.cc:202
+msgid "Cleared Implicit solo: %1 up:%2 down:%3\n"
+msgstr ""
+
 #: soundcloud_upload.cc:129
 msgid ""
 "Upload to Soundcloud failed.  Perhaps your email or password are incorrect?\n"
 msgstr ""
 
-#: source_factory.cc:374
+#: source_factory.cc:390
 msgid "Recovery attempted on a MIDI file - not implemented"
 msgstr ""
 
@@ -2433,7 +3083,7 @@ msgstr ""
 msgid "Speaker information is missing distance - speaker ignored"
 msgstr ""
 
-#: srcfilesource.cc:134
+#: srcfilesource.cc:142
 msgid "SrcFileSource: %1"
 msgstr ""
 
@@ -2441,104 +3091,134 @@ msgstr ""
 msgid "Cannot compile tape track regexp for use (%1)"
 msgstr ""
 
-#: tempo.cc:80
-msgid "TempoSection XML node has no \"start\" property"
+#: tempo.cc:98
+msgid "Legacy session detected. TempoSection XML node will be altered."
 msgstr ""
 
-#: tempo.cc:88
-msgid "TempoSection XML node has an illegal \"start\" value"
+#: tempo.cc:104
+msgid "TempoSection XML node has an illegal \"pulse\" value"
 msgstr ""
 
-#: tempo.cc:95
+#: tempo.cc:112
+msgid "TempoSection XML node has an illegal \"frame\" value"
+msgstr ""
+
+#: tempo.cc:119
 msgid "TempoSection XML node has no \"beats-per-minute\" property"
 msgstr ""
 
-#: tempo.cc:100
+#: tempo.cc:124
 msgid "TempoSection XML node has an illegal \"beats_per_minute\" value"
 msgstr ""
 
-#: tempo.cc:109
+#: tempo.cc:133
 msgid "TempoSection XML node has an illegal \"note-type\" value"
 msgstr ""
 
-#: tempo.cc:115
+#: tempo.cc:139
 msgid "TempoSection XML node has no \"movable\" property"
 msgstr ""
 
-#: tempo.cc:125
-msgid "TempoSection XML node has an illegal \"bar-offset\" value"
+#: tempo.cc:146
+msgid "TempoSection XML node has no \"active\" property"
 msgstr ""
 
-#: tempo.cc:202
-msgid "MeterSection XML node has no \"start\" property"
+#: tempo.cc:471
+msgid "MeterSection XML node has an illegal \"start\" value"
 msgstr ""
 
-#: tempo.cc:210
-msgid "MeterSection XML node has an illegal \"start\" value"
+#: tempo.cc:474
+msgid "Legacy session detected - MeterSection XML node will be altered."
+msgstr ""
+
+#: tempo.cc:481
+msgid "MeterSection XML node has an illegal \"pulse\" value"
+msgstr ""
+
+#: tempo.cc:488
+msgid "MeterSection XML node has an illegal \"beat\" value"
+msgstr ""
+
+#: tempo.cc:495
+msgid "MeterSection XML node has no \"bbt\" property"
+msgstr ""
+
+#: tempo.cc:500
+msgid "MeterSection XML node has an illegal \"bbt\" value"
+msgstr ""
+
+#: tempo.cc:509
+msgid "MeterSection XML node has an illegal \"frame\" value"
 msgstr ""
 
-#: tempo.cc:220
+#: tempo.cc:519
 msgid ""
 "MeterSection XML node has no \"beats-per-bar\" or \"divisions-per-bar\" "
 "property"
 msgstr ""
 
-#: tempo.cc:226
-msgid ""
-"MeterSection XML node has an illegal \"beats-per-bar\" or \"divisions-per-bar"
-"\" value"
+#: tempo.cc:524
+msgid "MeterSection XML node has an illegal \"divisions-per-bar\" value"
 msgstr ""
 
-#: tempo.cc:231
+#: tempo.cc:529
 msgid "MeterSection XML node has no \"note-type\" property"
 msgstr ""
 
-#: tempo.cc:236
+#: tempo.cc:533
 msgid "MeterSection XML node has an illegal \"note-type\" value"
 msgstr ""
 
-#: tempo.cc:241
+#: tempo.cc:538
 msgid "MeterSection XML node has no \"movable\" property"
 msgstr ""
 
-#: tempo.cc:388
+#: tempo.cc:545
+msgid "MeterSection XML node has no \"lock-style\" property"
+msgstr ""
+
+#: tempo.cc:821
 msgid ""
 "Meter changes can only be positioned on the first beat of a bar. Moving from "
 "%1 to %2"
 msgstr ""
 
-#: tempo.cc:650
+#: tempo.cc:1156
 msgid "no tempo sections defined in tempo map - cannot change tempo @ %1"
 msgstr ""
 
-#: tempo.cc:680 tempo.cc:696 tempo.cc:712 tempo.cc:728
-msgid "programming error: no tempo section in tempo map!"
+#: tempo.cc:1186
+msgid "programming error: no meter section in tempo map!"
 msgstr ""
 
-#: tempo.cc:846 tempo.cc:1827
-msgid "programming error: unhandled MetricSection type"
+#: tempo.cc:1204 tempo.cc:1227 tempo.cc:1248
+msgid "programming error: no tempo section in tempo map!"
 msgstr ""
 
-#: tempo.cc:1142
+#: tempo.cc:1959 tempo.cc:1987
 msgid "tempo map asked for BBT time at frame %1\n"
 msgstr ""
 
-#: tempo.cc:1185
+#: tempo.cc:2054
 msgid "tempo map asked for frame time at bar < 1  (%1)\n"
 msgstr ""
 
-#: tempo.cc:1642 tempo.cc:1656
+#: tempo.cc:3472 tempo.cc:3485
 msgid "Tempo map: could not set new state, restoring old one."
 msgstr ""
 
-#: tempo.cc:1677
+#: tempo.cc:3522 tempo.cc:3523
 msgid "Multiple meter definitions found at %1"
 msgstr ""
 
-#: tempo.cc:1682
+#: tempo.cc:3528 tempo.cc:3529
 msgid "Multiple tempo definitions found at %1"
 msgstr ""
 
+#: tempo.cc:3715
+msgid "programming error: unhandled MetricSection type"
+msgstr ""
+
 #: tempo_map_importer.cc:52
 msgid "Tempo map"
 msgstr ""
@@ -2563,6 +3243,14 @@ msgid ""
 "Are you sure you want to do this?"
 msgstr ""
 
+#: unknown_processor.cc:86
+msgid "Using plugin-stub with unknown i/o configuration for: "
+msgstr ""
+
+#: unknown_processor.cc:107
+msgid "Using plugin-stub with mismatching i/o configuration for: "
+msgstr ""
+
 #: user_bundle.cc:47
 msgid "Node for Bundle has no \"name\" property"
 msgstr ""
@@ -2584,58 +3272,67 @@ msgstr ""
 msgid "Node for Port has no \"name\" property"
 msgstr ""
 
-#: utils.cc:422 utils.cc:451
+#: utils.cc:412 utils.cc:441
 msgid "Splice"
 msgstr "Skarv"
 
-#: utils.cc:424 utils.cc:441
+#: utils.cc:414 utils.cc:431
 msgid "Slide"
 msgstr "Glid"
 
-#: utils.cc:426 utils.cc:447
+#: utils.cc:416 utils.cc:437
 msgid "Ripple"
 msgstr ""
 
-#: utils.cc:428 utils.cc:444
+#: utils.cc:418 utils.cc:434
 msgid "Lock"
 msgstr "LÃ¥s"
 
-#: utils.cc:431
+#: utils.cc:421
 msgid "programming error: unknown edit mode string \"%1\""
 msgstr ""
 
-#: utils.cc:458 utils.cc:490
+#: utils.cc:448 utils.cc:484
 msgid "MIDI Timecode"
 msgstr ""
 
-#: utils.cc:458 utils.cc:488
+#: utils.cc:448 utils.cc:482
 msgid "MTC"
 msgstr ""
 
-#: utils.cc:462 utils.cc:497
+#: utils.cc:452 utils.cc:491
 msgid "MIDI Clock"
 msgstr ""
 
-#: utils.cc:466 utils.cc:484 utils.cc:504
+#: utils.cc:456 utils.cc:478 utils.cc:498
 msgid "JACK"
 msgstr ""
 
-#: utils.cc:470
-msgid "programming error: unknown sync source string \"%1\""
+#: utils.cc:460 utils.cc:495
+msgid "LTC"
 msgstr ""
 
-#: utils.cc:495
-msgid "M-Clock"
+#: utils.cc:464
+msgid "programming error: unknown sync source string \"%1\""
 msgstr ""
 
-#: utils.cc:501
-msgid "LTC"
+#: utils.cc:489
+msgid "M-Clock"
 msgstr ""
 
-#: utils.cc:671
+#: utils.cc:658
 msgid "programming error: unknown native header format: %1"
 msgstr ""
 
-#: utils.cc:686
+#: utils.cc:673
 msgid "cannot open directory %1 (%2)"
 msgstr ""
+
+#: vca.cc:43
+#, c-format
+msgid "VCA %n"
+msgstr ""
+
+#: vca_manager.cc:166
+msgid "Cannot set state of a VCA"
+msgstr ""
diff --git a/libs/ardour/po/zh.mo b/libs/ardour/po/zh.mo
new file mode 100644
index 0000000..6e1b972
Binary files /dev/null and b/libs/ardour/po/zh.mo differ
diff --git a/libs/ardour/po/zh.po b/libs/ardour/po/zh.po
index 32fb0c3..756cfa3 100644
--- a/libs/ardour/po/zh.po
+++ b/libs/ardour/po/zh.po
@@ -1,13686 +1,3455 @@
-# Copyright (C) YEAR Free Software Foundation, Inc.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR "Paul Davis"
+# This file is distributed under the same license as the PACKAGE package.
 # FIRST AUTHOR <EMAIL at ADDRESS>, YEAR.
-# 一善鱼 YQ-YSY at 163.com 完成翻译于 2015-12-09 在 Rui-huai Zhang <zrhzrh at mail.ustc.edu.cn> 的基础上
-#
+# 一善鱼 <YQ-YSY at 163.com> 翻译于 2016-02-06
 msgid ""
 msgstr ""
-"Project-Id-Version: Ardour 3\n"
+"Project-Id-Version: Ardour 4\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-03-31 20:13-0400\n"
-"PO-Revision-Date: 2016-01-04 23:21+0800\n"
-"Last-Translator: Rui-huai Zhang <zrhzrh>\n"
-"Language-Team: zrhzrh <zrhzrh at mail.ustc.edu.cn>\n"
-"Language: zh_CN\n"
+"POT-Creation-Date: 2016-07-14 06:20-0400\n"
+"PO-Revision-Date: 2016-03-27 10:49+0800\n"
+"Last-Translator: \n"
+"Language-Team: 一善鱼 YQ-YSY at 163.com\n"
+"Language: zh\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Poedit-KeywordsList: _;gettext;gettext_noop\n"
-"X-Poedit-Basepath: ../..\n"
-"X-Poedit-SourceCharset: utf-8\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
 "X-Generator: Poedit 1.8.4\n"
-"X-Poedit-SearchPath-0: gtk2_ardour\n"
 
-#: about.cc:125
-msgid "Brian Ahr"
-msgstr ""
-
-#: about.cc:126
-msgid "John Anderson"
-msgstr ""
-
-#: about.cc:127
-msgid "Marcus Andersson"
-msgstr ""
-
-#: about.cc:128
-msgid "Nedko Arnaudov"
-msgstr ""
-
-#: about.cc:129
-msgid "Hans Baier"
-msgstr ""
-
-#: about.cc:130
-msgid "Ben Bell"
-msgstr ""
-
-#: about.cc:131
-msgid "Sakari Bergen"
-msgstr ""
-
-#: about.cc:132
-msgid "Christian Borss"
-msgstr ""
-
-#: about.cc:133
-msgid "Chris Cannam"
-msgstr ""
-
-#: about.cc:134
-msgid "Jeremy Carter"
-msgstr ""
-
-#: about.cc:135
-msgid "Jesse Chappell"
-msgstr ""
-
-#: about.cc:136
-msgid "Thomas Charbonnel"
-msgstr ""
-
-#: about.cc:137
-msgid "Sam Chessman"
-msgstr ""
-
-#: about.cc:138
-msgid "André Colomb"
-msgstr ""
-
-#: about.cc:139
-msgid "Paul Davis"
-msgstr ""
-
-#: about.cc:140
-msgid "Gerard van Dongen"
-msgstr ""
-
-#: about.cc:141
-msgid "John Emmas"
-msgstr ""
-
-#: about.cc:142
-msgid "Colin Fletcher"
-msgstr ""
-
-#: about.cc:143
-msgid "Dave Flick"
-msgstr ""
-
-#: about.cc:144
-msgid "Hans Fugal"
-msgstr ""
-
-#: about.cc:145
-msgid "Robin Gareus"
-msgstr ""
-
-#: about.cc:146
-msgid "Christopher George"
-msgstr ""
-
-#: about.cc:147
-msgid "Chris Goddard"
-msgstr ""
-
-#: about.cc:148
-msgid "J. Abelardo Gutierrez"
-msgstr ""
-
-#: about.cc:149
-msgid "Jeremy Hall"
-msgstr ""
-
-#: about.cc:150
-msgid "Audun Halland"
-msgstr ""
-
-#: about.cc:151
-msgid "David Halter"
-msgstr ""
-
-#: about.cc:152
-msgid "Steve Harris"
-msgstr ""
-
-#: about.cc:153
-msgid "Melvin Ray Herr"
-msgstr ""
-
-#: about.cc:154
-msgid "Carl Hetherington"
-msgstr ""
-
-#: about.cc:155
-msgid "Rob Holland"
-msgstr ""
-
-#: about.cc:156
-msgid "Robert Jordens"
-msgstr ""
-
-#: about.cc:157
-msgid "Stefan Kersten"
-msgstr ""
-
-#: about.cc:158
-msgid "Armand Klenk"
-msgstr ""
-
-#: about.cc:159
-msgid "Julien de Kozak"
-msgstr ""
-
-#: about.cc:160
-msgid "Matt Krai"
-msgstr ""
-
-#: about.cc:161
-msgid "Georg Krause"
-msgstr ""
-
-#: about.cc:162
-msgid "Nick Lanham"
-msgstr ""
-
-#: about.cc:163
-msgid "Colin Law"
-msgstr ""
-
-#: about.cc:164
-msgid "Joshua Leach"
-msgstr ""
-
-#: about.cc:165
-msgid "Ben Loftis"
-msgstr ""
-
-#: about.cc:166
-msgid "Nick Mainsbridge"
-msgstr ""
-
-#: about.cc:167
-msgid "Tim Mayberry"
-msgstr ""
-
-#: about.cc:168
-msgid "Doug Mclain"
-msgstr ""
-
-#: about.cc:169
-msgid "Todd Naugle"
-msgstr ""
-
-#: about.cc:170
-msgid "Jack O'Quin"
-msgstr ""
-
-#: about.cc:171
-msgid "Nimal Ratnayake"
-msgstr ""
-
-#: about.cc:172
-msgid "David Robillard"
-msgstr ""
-
-#: about.cc:173
-msgid "Taybin Rutkin"
-msgstr ""
-
-#: about.cc:174
-msgid "Andreas Ruge"
-msgstr ""
-
-#: about.cc:175
-msgid "Sampo Savolainen"
-msgstr ""
-
-#: about.cc:176
-msgid "Rodrigo Severo"
-msgstr ""
-
-#: about.cc:177
-msgid "Per Sigmond"
-msgstr ""
-
-#: about.cc:178
-msgid "Lincoln Spiteri"
-msgstr ""
-
-#: about.cc:179
-msgid "Mike Start"
-msgstr ""
-
-#: about.cc:180
-msgid "Mark Stewart"
-msgstr ""
-
-#: about.cc:181
-msgid "Roland Stigge"
-msgstr ""
-
-#: about.cc:182
-msgid "Petter Sundlöf"
-msgstr ""
-
-#: about.cc:183
-msgid "Mike Täht"
-msgstr ""
-
-#: about.cc:184
-msgid "Roy Vegard"
-msgstr ""
-
-#: about.cc:185
-msgid "Thorsten Wilms"
-msgstr ""
-
-#: about.cc:186
-msgid "Grygorii Zharun"
-msgstr ""
-
-#: about.cc:191
-msgid ""
-"French:\n"
-"\tAlain Fréhel <alain.frehel at free.fr>\n"
-"\tChristophe Combelles <ccomb at free.fr>\n"
-"\tMartin Blanchard\n"
-"\tRomain Arnaud <roming22 at gmail.com>\n"
-msgstr ""
-"法语:\n"
-"\tAlain Fréhel <alain.frehel at free.fr>\n"
-"\tChristophe Combelles <ccomb at free.fr>\n"
-"\tMartin Blanchard\n"
-"\tRomain Arnaud <roming22 at gmail.com>\n"
-
-#: about.cc:192
-msgid ""
-"German:\n"
-"\tKarsten Petersen <kapet at kapet.de>\n"
-"\tSebastian Arnold <mail at sebastian-arnold.net>\n"
-"\tRobert Schwede <schwede at ironshark.com>\n"
-"\tBenjamin Scherrer <realhangman at web.de>\n"
-"\tEdgar Aichinger <edogawa at aon.at>\n"
-"\tRichard Oax <richard at pagliacciempire.de>\n"
-"\tRobin Gloster <robin at loc-com.de>\n"
-msgstr ""
-"德语:\n"
-"\tKarsten Petersen <kapet at kapet.de>\n"
-"\tSebastian Arnold <mail at sebastian-arnold.net>\n"
-"\tRobert Schwede <schwede at ironshark.com>\n"
-"\tBenjamin Scherrer <realhangman at web.de>\n"
-"\tEdgar Aichinger <edogawa at aon.at>\n"
-"\tRichard Oax <richard at pagliacciempire.de>\n"
-"\tRobin Gloster <robin at loc-com.de>\n"
-
-#: about.cc:199
-msgid ""
-"Italian:\n"
-"\tFilippo Pappalardo <filippo at email.it>\n"
-"\tRaffaele Morelli <raffaele.morelli at gmail.com>\n"
-msgstr ""
-"意大利语:\n"
-"\tFilippo Pappalardo <filippo at email.it>\n"
-"\tRaffaele Morelli <raffaele.morelli at gmail.com>\n"
-
-#: about.cc:200
-msgid ""
-"Portuguese:\n"
-"\tRui Nuno Capela <rncbc at rncbc.org>\n"
-msgstr ""
-"葡萄牙语:\n"
-"\tRui Nuno Capela <rncbc at rncbc.org>\n"
-
-#: about.cc:201
-msgid ""
-"Brazilian Portuguese:\n"
-"\tAlexander da Franca Fernandes <alexander at nautae.eti.br>\n"
-"\tChris Ross <chris at tebibyte.org>\n"
-msgstr ""
-"巴西葡萄牙语:\n"
-"\tAlexander da Franca Fernandes <alexander at nautae.eti.br>\n"
-"\tChris Ross <chris at tebibyte.org>\n"
-
-#: about.cc:203
-msgid ""
-"Spanish:\n"
-"\t Alex Krohn <alexkrohn at fastmail.fm>\n"
-"\tPablo Fernández <pablo.fbus at gmail.com>\n"
-msgstr ""
-"西班牙语:\n"
-"\t Alex Krohn <alexkrohn at fastmail.fm>\n"
-"\tPablo Fernández <pablo.fbus at gmail.com>\n"
-
-#: about.cc:204
-msgid ""
-"Russian:\n"
-"\t Igor Blinov <pitstop at nm.ru>\n"
-"\tAlexandre Prokoudine <alexandre.prokoudine at gmail.com>\n"
-msgstr ""
-"俄语:\n"
-"\t Igor Blinov <pitstop at nm.ru>\n"
-"\tAlexandre Prokoudine <alexandre.prokoudine at gmail.com>\n"
-
-#: about.cc:206
-msgid ""
-"Greek:\n"
-"\t Klearchos Gourgourinis <muadib at in.gr>\n"
-msgstr ""
-"希腊语:\n"
-"\t Klearchos Gourgourinis <muadib at in.gr>\n"
-
-#: about.cc:207
-msgid ""
-"Swedish:\n"
-"\t Petter Sundlöf <petter.sundlof at gmail.com>\n"
-msgstr ""
-"瑞典语:\n"
-"\t Petter Sundlöf <petter.sundlof at gmail.com>\n"
-
-#: about.cc:208
-msgid ""
-"Polish:\n"
-"\t Piotr Zaryk <pzaryk at gmail.com>\n"
-msgstr ""
-"波兰语:\n"
-"\t Piotr Zaryk <pzaryk at gmail.com>\n"
-
-#: about.cc:209
-msgid ""
-"Czech:\n"
-"\t Pavel Fric <pavelfric at seznam.cz>\n"
-msgstr ""
-"捷克语:\n"
-"\t Pavel Fric <pavelfric at seznam.cz>\n"
-
-#: about.cc:210
-msgid ""
-"Norwegian:\n"
-"\t Eivind Ødegård\n"
-msgstr ""
-"挪威语:\n"
-"\t Eivind Ødegård\n"
-
-#: about.cc:211
-msgid ""
-"Chinese:\n"
-"\t Rui-huai Zhang <zrhzrh at mail.ustc.edu.cn>\n"
-msgstr ""
-"汉语:\n"
-"\t Rui-huai Zhang <zrhzrh at mail.ustc.edu.cn>\n"
-
-#: about.cc:591
-msgid "Copyright (C) 1999-2015 Paul Davis\n"
-msgstr "版权所有 (C) 1999-2015 Paul Davis\n"
-
-#: about.cc:595
-msgid "http://ardour.org/"
-msgstr ""
-
-#: about.cc:596
-msgid ""
-"%1%2\n"
-"(built from revision %3)"
-msgstr ""
-"%1%2\n"
-"(修订自版本 %3)"
-
-#: about.cc:600
-msgid "Config"
-msgstr "配置"
-
-#: actions.cc:85
-msgid "Loading menus from %1"
-msgstr "正在载入菜单 %1"
-
-#: actions.cc:88 actions.cc:89
-msgid "badly formatted menu definition file: %1"
-msgstr "带有错误格式的菜单定义文件: %1"
-
-#: actions.cc:91
-msgid "%1 menu definition file not found"
-msgstr "%1 菜单定义文件未找到"
-
-#: actions.cc:95 actions.cc:96
-msgid "%1 will not work without a valid menu definition file"
-msgstr "缺失有效的菜单定义文件将导致 %1 无法工作。"
-
-#: add_route_dialog.cc:54 route_params_ui.cc:524
-msgid "Add Track or Bus"
-msgstr "添加音轨或总线"
-
-#: add_route_dialog.cc:57
-msgid "Configuration:"
-msgstr "配置:"
-
-#: add_route_dialog.cc:58
-msgid "Record Mode:"
-msgstr "录制模式:"
-
-#: add_route_dialog.cc:59
-msgid "Instrument:"
-msgstr "乐器:"
-
-#: add_route_dialog.cc:77
-msgid "Audio Tracks"
-msgstr "音频轨道"
-
-#: add_route_dialog.cc:78 add_route_dialog.cc:209
-msgid "MIDI Tracks"
-msgstr "MIDI 轨道"
-
-#: add_route_dialog.cc:79 add_route_dialog.cc:211
-msgid "Audio+MIDI Tracks"
-msgstr "音频+MIDI 轨道"
-
-#: add_route_dialog.cc:80 add_route_dialog.cc:207
-msgid "Busses"
-msgstr "总线"
-
-#: add_route_dialog.cc:83 add_route_dialog.cc:559
-msgid "First"
-msgstr "起始点"
-
-#: add_route_dialog.cc:84 add_route_dialog.cc:561
-msgid "After Editor Selection"
-msgstr "在编辑器已选择部分之后"
-
-#: add_route_dialog.cc:85 add_route_dialog.cc:563
-msgid "After Mixer Selection"
-msgstr "在混音器已选择部分之后"
-
-#: add_route_dialog.cc:86
-msgid "Last"
-msgstr "结束点"
-
-#: add_route_dialog.cc:103
-msgid "Add:"
-msgstr "添加:"
-
-#: add_route_dialog.cc:116 time_fx_dialog.cc:91 add_video_dialog.cc:135
-#: video_server_dialog.cc:121
-msgid "<b>Options</b>"
-msgstr "<b>选项</b>"
-
-#: add_route_dialog.cc:126 bundle_manager.cc:193 region_editor.cc:50
-#: route_group_dialog.cc:71
-msgid "Name:"
-msgstr "名称:"
-
-#: add_route_dialog.cc:156
-msgid "Group:"
-msgstr "分组:"
-
-#: add_route_dialog.cc:162
-msgid "Insert:"
-msgstr "插入:"
-
-#: add_route_dialog.cc:223 add_route_dialog.cc:232 add_route_dialog.cc:306
-#: ardour_ui_ed.cc:539 engine_dialog.cc:237 rc_option_editor.cc:1805
-#: rc_option_editor.cc:1807 rc_option_editor.cc:1809 rc_option_editor.cc:1827
-#: rc_option_editor.cc:1829 rc_option_editor.cc:1837 rc_option_editor.cc:1839
-#: rc_option_editor.cc:1857 rc_option_editor.cc:1870 rc_option_editor.cc:1872
-#: rc_option_editor.cc:1874 rc_option_editor.cc:1919 rc_option_editor.cc:1921
-#: rc_option_editor.cc:1923 rc_option_editor.cc:1931 rc_option_editor.cc:1939
-#: rc_option_editor.cc:1941 rc_option_editor.cc:1949
-msgid "Audio"
-msgstr "音频"
-
-#: add_route_dialog.cc:224 add_route_dialog.cc:235 add_route_dialog.cc:307
-#: editor_actions.cc:109 engine_dialog.cc:239 missing_file_dialog.cc:56
-#: rc_option_editor.cc:2084 rc_option_editor.cc:2094 rc_option_editor.cc:2102
-#: rc_option_editor.cc:2110 rc_option_editor.cc:2119 rc_option_editor.cc:2127
-#: rc_option_editor.cc:2135 rc_option_editor.cc:2143 rc_option_editor.cc:2152
-#: rc_option_editor.cc:2161 rc_option_editor.cc:2170 rc_option_editor.cc:2178
-#: rc_option_editor.cc:2186 rc_option_editor.cc:2194 rc_option_editor.cc:2217
-msgid "MIDI"
-msgstr "MIDI"
-
-#: add_route_dialog.cc:225 add_route_dialog.cc:238 add_route_dialog.cc:308
-msgid "Audio+MIDI"
-msgstr "Audio+MIDI"
-
-#: add_route_dialog.cc:226 add_route_dialog.cc:241 add_route_dialog.cc:309
-msgid "Bus"
-msgstr "总线"
-
-#: add_route_dialog.cc:268
-msgid ""
-"Audio+MIDI tracks are intended for use <b>ONLY</b> with plugins that use both "
-"audio and MIDI input data\n"
-"\n"
-"If you do not plan to use such a plugin, then use a normal audio or MIDI track "
-"instead."
-msgstr ""
-"音频+MIDI 轨道已经准备就绪 ,<b>但仅限于</b> 使用音频和MIDI输入数据的插件。\n"
-"\n"
-"如果您不打算使用这样一个插件,那么请使用普通的音频或MIDI轨道作为替代。"
-
-#: add_route_dialog.cc:327 add_route_dialog.cc:346 editor_actions.cc:422
-#: editor_rulers.cc:251 time_axis_view.cc:1374
-msgid "Normal"
-msgstr "普通"
-
-#: add_route_dialog.cc:330 add_route_dialog.cc:348
-msgid "Non Layered"
-msgstr "不分层的"
-
-#: add_route_dialog.cc:331 add_route_dialog.cc:350
-msgid "Tape"
-msgstr "磁带"
-
-#: add_route_dialog.cc:431 monitor_section.cc:290
-msgid "Mono"
-msgstr "单声道"
-
-#: add_route_dialog.cc:435
-msgid "Stereo"
-msgstr "双声道立体声"
-
-#: add_route_dialog.cc:459
-msgid "3 Channel"
-msgstr "三声道"
-
-#: add_route_dialog.cc:463
-msgid "4 Channel"
-msgstr "四声道"
-
-#: add_route_dialog.cc:467
-msgid "5 Channel"
-msgstr "五声道"
-
-#: add_route_dialog.cc:471
-msgid "6 Channel"
-msgstr "六声道"
-
-#: add_route_dialog.cc:475
-msgid "8 Channel"
-msgstr "八声道"
-
-#: add_route_dialog.cc:479
-msgid "12 Channel"
-msgstr "十二声道"
-
-#: add_route_dialog.cc:483 mixer_strip.cc:1836 mixer_strip.cc:2244
-msgid "Custom"
-msgstr "自定义"
-
-#: add_route_dialog.cc:516 add_route_dialog.cc:532 route_group_menu.cc:81
-msgid "New Group..."
-msgstr "新建群组…"
-
-#: add_route_dialog.cc:520 route_group_menu.cc:85
-msgid "No Group"
-msgstr "没有群组"
-
-#: ambiguous_file_dialog.cc:30
-msgid "Ambiguous File"
-msgstr "模糊的文件"
-
-#: ambiguous_file_dialog.cc:35
-msgid ""
-"%1 has found the file <i>%2</i> in the following places:\n"
-"\n"
-msgstr ""
-"%1 被发现位于文件 <i>%2</i> 的以下位置:\n"
-"\n"
-
-#: ambiguous_file_dialog.cc:44
-msgid ""
-"\n"
-"\n"
-"Please select the path that you want to get the file from."
-msgstr ""
-"\n"
-"\n"
-"请选择您想获取的文件所在的路径。"
-
-#: ambiguous_file_dialog.cc:46 missing_file_dialog.cc:46
-msgid "Done"
-msgstr "完成"
-
-#: analysis_window.cc:46
-msgid "Signal source"
-msgstr "信号源"
-
-#: analysis_window.cc:47
-msgid "Selected ranges"
-msgstr "选择范围"
-
-#: analysis_window.cc:48
-msgid "Selected regions"
-msgstr "选择区域"
-
-#: analysis_window.cc:50
-msgid "Display model"
-msgstr "显示模式"
-
-#: analysis_window.cc:51
-msgid "Composite graphs for each track"
-msgstr "每个音轨的合成图"
-
-#: analysis_window.cc:52
-msgid "Composite graph of all tracks"
-msgstr "所有音轨的合成图"
-
-#: analysis_window.cc:54
-msgid "Show frequency power range"
-msgstr "显示频率的功率范围"
-
-#: analysis_window.cc:55
-msgid "Normalize values"
-msgstr "规范化数值"
-
-#: analysis_window.cc:59
-msgid "FFT analysis window"
-msgstr "FFT 快速傅立叶变换分析视窗"
-
-#: analysis_window.cc:60 editor.cc:1823
-msgid "Spectral Analysis"
-msgstr "频谱分析"
-
-#: analysis_window.cc:67 editor_actions.cc:142 export_channel_selector.cc:557
-#: session_metadata_dialog.cc:667
-msgid "Track"
-msgstr "音轨"
-
-#: analysis_window.cc:68 editor_actions.cc:648 mixer_ui.cc:131 mixer_ui.cc:1854
-msgid "Show"
-msgstr "显示"
-
-#: analysis_window.cc:135
-msgid "Re-analyze data"
-msgstr "重新分析数据"
-
-#: ardour_button.cc:887
-msgid "button cannot watch state of non-existing Controllable\n"
-msgstr "按钮无法显示不存在的操控状态\n"
-
-#: ardour_button.cc:1155
-msgid "ABCDEFGHIJLKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
-msgstr "ABCDEFGHIJLKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
-
-#: ardour_ui.cc:164
-msgid ""
-"%1 %2.x has discovered configuration files from %1 %3.x.\n"
-"\n"
-"Would you like to copy the relevant files before starting to use the program?\n"
-"\n"
-"(This will require you to restart %1.)"
-msgstr ""
-"%1 %2.x 发现配置文件来源于 %1 %3.x.\n"
-"\n"
-"在启用这个程序前,您打算复制关联文件吗?\n"
-"\n"
-"(这将需要你重新启动 %1.)"
-
-#: ardour_ui.cc:211 editor_actions.cc:642 region_editor.cc:51
-msgid "Audition"
-msgstr "监听"
-
-#: ardour_ui.cc:212 editor_actions.cc:136 mixer_strip.cc:2016
-#: rc_option_editor.cc:1959 route_time_axis.cc:252 route_time_axis.cc:2711
-msgid "Solo"
-msgstr "独奏"
-
-#: ardour_ui.cc:213 rc_option_editor.cc:741
-msgid "Feedback"
-msgstr "反馈"
-
-#: ardour_ui.cc:219 speaker_dialog.cc:36
-msgid "Speaker Configuration"
-msgstr "扬声器配置"
-
-#: ardour_ui.cc:220 keyeditor.cc:53
-msgid "Key Bindings"
-msgstr "按键绑定"
-
-#: ardour_ui.cc:221
-msgid "Preferences"
-msgstr "首选项"
-
-#: ardour_ui.cc:222 ardour_ui.cc:229
-msgid "Add Tracks/Busses"
-msgstr "添加音轨/总线"
-
-#: ardour_ui.cc:223
-msgid "About"
-msgstr "关于"
-
-#: ardour_ui.cc:224 location_ui.cc:1141 session_option_editor.cc:189
-#: session_option_editor.cc:195 session_option_editor.cc:202
-msgid "Locations"
-msgstr "位置"
-
-#: ardour_ui.cc:225 route_params_ui.cc:59 route_params_ui.cc:630
-msgid "Tracks and Busses"
-msgstr "音轨和总线"
-
-#: ardour_ui.cc:226 engine_dialog.cc:70
-msgid "Audio/MIDI Setup"
-msgstr "音频/MIDI设置"
-
-#: ardour_ui.cc:227
-msgid "Video Export Dialog"
-msgstr "视频导出对话框"
-
-#: ardour_ui.cc:228
-msgid "Properties"
-msgstr "属性"
-
-#: ardour_ui.cc:230 bundle_manager.cc:264
-msgid "Bundle Manager"
-msgstr "包裹管理器"
-
-#: ardour_ui.cc:231 big_clock_window.cc:37
-msgid "Big Clock"
-msgstr "Big Clock 大计时器"
-
-#: ardour_ui.cc:232
-msgid "Audio Connections"
-msgstr "音频连接"
-
-#: ardour_ui.cc:233
-msgid "MIDI Connections"
-msgstr "MIDI 连接"
-
-#: ardour_ui.cc:242
-msgid "Your configuration files were copied. You can now restart %1."
-msgstr "您的配置文件已经备份完成。现在可以重新启动 %1 。"
-
-#: ardour_ui.cc:481
-msgid ""
-"The audio backend was shutdown because:\n"
-"\n"
-"%1"
-msgstr ""
-"音频后端已关闭,因为:\n"
-"\n"
-"%1"
-
-#: ardour_ui.cc:483
-msgid ""
-"The audio backend has either been shutdown or it\n"
-"disconnected %1 because %1\n"
-"was not fast enough. Try to restart\n"
-"the audio backend and save the session."
-msgstr ""
-"音频后端要么已经关闭,\n"
-"要么它与 %1 失去了连接,\n"
-"因为 %1不够快。\n"
-"请尝试重新启动音频后端并保存会话。"
-
-#: ardour_ui.cc:507
-msgid ""
-"Audio Unit Plugin Scan Failed. Automatic AU scanning has been disabled. Please see "
-"the log window for further details."
-msgstr "音频单元插件扫描失败。自动 AU 扫描已被禁用。详情请参阅日志窗口。"
-
-#: ardour_ui.cc:508
-msgid "Audio Unit Plugin Scan Failed:"
-msgstr "音频单元插件扫描失败:"
-
-# NSM (network service manager)
-#: ardour_ui.cc:827
-msgid "NSM server did not announce itself"
-msgstr "NSM服务器没有表明身份"
-
-#: ardour_ui.cc:840
-msgid "NSM: no client ID provided"
-msgstr "NSM:没有提供客户机识别号"
-
-#: ardour_ui.cc:847
-msgid "NSM: no session created"
-msgstr "NSM:没有已创建的会话"
-
-#: ardour_ui.cc:870
-msgid "NSM: initialization failed"
-msgstr "NSM:初始化失败"
-
-#: ardour_ui.cc:900
-msgid "Free/Demo Version Warning"
-msgstr "免费/演示版本的警告"
-
-#: ardour_ui.cc:902
-msgid "Subscribe and support development of %1"
-msgstr "订阅和支持发展 %1"
-
-#: ardour_ui.cc:903
-msgid "Don't warn me about this again"
-msgstr "不再提醒我这个"
-
-#: ardour_ui.cc:905
-msgid ""
-"<span weight=\"bold\" size=\"large\">%1</span>\n"
-"\n"
-"<b>%2</b>\n"
-"\n"
-"<i>%3</i>\n"
-"\n"
-"%4"
-msgstr ""
-"<span weight=\"bold\" size=\"large\">%1</span>\n"
-"\n"
-"<b>%2</b>\n"
-"\n"
-"<i>%3</i>\n"
-"\n"
-"%4"
-
-#: ardour_ui.cc:906
-msgid "This is a free/demo version of %1"
-msgstr "这是一个免费/演示版本 %1"
-
-#: ardour_ui.cc:907
-msgid "It will not restore OR save any plugin settings"
-msgstr "它不会恢复或保存任何插件设置"
-
-#: ardour_ui.cc:908
-msgid ""
-"If you load an existing session with plugin settings\n"
-"they will not be used and will be lost."
-msgstr ""
-"如果您载入一个带有插件设置的已存在的会话\n"
-"它们将不会被采用并将会被丢失。"
-
-#: ardour_ui.cc:910 plugin_ui.cc:569
-msgid ""
-"To get full access to updates without this limitation\n"
-"consider becoming a subscriber for a low cost every month."
-msgstr ""
-"为了不受这个限制地升级而得到完整使用权,\n"
-"请考虑以每月极低的成本而成为一个用户。"
-
-#: ardour_ui.cc:920
-msgid "Quit now"
-msgstr "立即退出"
-
-#: ardour_ui.cc:921
-msgid "Continue using %1"
-msgstr "继续使用 %1"
-
-#: ardour_ui.cc:954 startup.cc:345
-msgid "%1 is ready for use"
-msgstr "%1 准备就绪"
-
-#: ardour_ui.cc:996
-msgid ""
-"WARNING: Your system has a limit for maximum amount of locked memory. This might "
-"cause %1 to run out of memory before your system runs out of memory. \n"
-"\n"
-"You can view the memory limit with 'ulimit -l', and it is normally controlled by %2"
-msgstr ""
-"警告:您的系统有对于锁定内存的最大数量限制。这可能会在您的系统耗尽内存之前,首先导"
-"致 %1 无内存可用。\n"
-"\n"
-"您可以使用“ulimit -l”命令来查看内存限制,通常它由 %2 来控制。"
-
-#: ardour_ui.cc:1013
-msgid "Do not show this window again"
-msgstr "不再显示此窗口"
-
-#: ardour_ui.cc:1057
-msgid "Don't quit"
-msgstr "不退出"
-
-#: ardour_ui.cc:1058
-msgid "Just quit"
-msgstr "不保存而退出"
-
-#: ardour_ui.cc:1059
-msgid "Save and quit"
-msgstr "保存并退出"
-
-#: ardour_ui.cc:1069
-msgid ""
-"%1 was unable to save your session.\n"
-"\n"
-"If you still wish to quit, please use the\n"
-"\n"
-"\"Just quit\" option."
-msgstr ""
-"%1 无法保存您的会话。\n"
-"\n"
-"如果您仍打算退出,\n"
-"\n"
-"请启用“不保存而退出”选项。"
-
-#: ardour_ui.cc:1119
-msgid "Unsaved Session"
-msgstr " 尚未保存的会话"
-
-#: ardour_ui.cc:1140
-msgid ""
-"The session \"%1\"\n"
-"has not been saved.\n"
-"\n"
-"Any changes made this time\n"
-"will be lost unless you save it.\n"
-"\n"
-"What do you want to do?"
-msgstr ""
-"此会话 \"%1\" 尚未保存.\n"
-"\n"
-"刚才所作的修改将会丢失\n"
-"除非您保存它。\n"
-"\n"
-"您打算如何做?"
-
-#: ardour_ui.cc:1143
-msgid ""
-"The snapshot \"%1\"\n"
-"has not been saved.\n"
-"\n"
-"Any changes made this time\n"
-"will be lost unless you save it.\n"
-"\n"
-"What do you want to do?"
-msgstr ""
-"此快照 \"%1\" 尚未保存。\n"
-"\n"
-"刚才所作的修改将会丢失\n"
-"除非您保存它。\n"
-"\n"
-"您打算如何做?"
-
-#: ardour_ui.cc:1157
-msgid "Prompter"
-msgstr "提词机"
-
-#: ardour_ui.cc:1269 ardour_ui.cc:1277
-msgid "Audio: <span foreground=\"red\">none</span>"
-msgstr "音频:<span foreground=\"red\">无</span>"
-
-#: ardour_ui.cc:1281
-#, c-format
-msgid "Audio: <span foreground=\"green\">%.1f kHz / %4.1f ms</span>"
-msgstr "音频: <span foreground=\"green\">%.1f kHz / %4.1f ms</span>"
-
-#: ardour_ui.cc:1285
-#, c-format
-msgid "Audio: <span foreground=\"green\">%<PRId64> kHz / %4.1f ms</span>"
-msgstr "音频:<span foreground=\"green\">%<PRId64> kHz / %4.1f ms</span>"
-
-#: ardour_ui.cc:1303 export_video_dialog.cc:80
-msgid "File:"
-msgstr "文件:"
-
-#: ardour_ui.cc:1307
-msgid "BWF"
-msgstr ""
-
-#: ardour_ui.cc:1310
-msgid "WAV"
-msgstr ""
-
-#: ardour_ui.cc:1313
-msgid "WAV64"
-msgstr ""
-
-#: ardour_ui.cc:1316 session_option_editor.cc:185
-msgid "CAF"
-msgstr ""
-
-#: ardour_ui.cc:1319
-msgid "AIFF"
-msgstr ""
-
-#: ardour_ui.cc:1322
-msgid "iXML"
-msgstr ""
-
-#: ardour_ui.cc:1325
-msgid "RF64"
-msgstr ""
-
-#: ardour_ui.cc:1333
-msgid "32-float"
-msgstr ""
-
-#: ardour_ui.cc:1336
-msgid "24-int"
-msgstr ""
-
-#: ardour_ui.cc:1339
-msgid "16-int"
-msgstr ""
-
-# DSP 数字信号处理器(Digital Signal Processor)
-#: ardour_ui.cc:1358
-#, c-format
-msgid "DSP: <span foreground=\"%s\">%5.1f%%</span>"
-msgstr "数字信号处理器: <span foreground=\"%s\">%5.1f%%</span>"
-
-#: ardour_ui.cc:1377
-#, c-format
-msgid ""
-"Buffers: <span foreground=\"green\">p:</span><span foreground=\"%s\">%<PRIu32>%%</"
-"span> <span foreground=\"green\">c:</span><span foreground=\"%s\">%<PRIu32>%%</"
-"span>"
-msgstr ""
-"缓冲区: <span foreground=\"green\">p:</span><span foreground=\"%s\">%<PRIu32>%%</"
-"span> <span foreground=\"green\">c:</span><span foreground=\"%s\">%<PRIu32>%%</"
-"span>"
-
-#: ardour_ui.cc:1418
-msgid "Disk: <span foreground=\"green\">Unknown</span>"
-msgstr "硬盘: <span foreground=\"green\">Unknown</span>"
-
-#: ardour_ui.cc:1420
-msgid "Disk: <span foreground=\"green\">24hrs+</span>"
-msgstr "硬盘:<span foreground=\"green\">24hrs+</span>"
-
-#: ardour_ui.cc:1438
-msgid "Disk: <span foreground=\"green\">>24 hrs</span>"
-msgstr "硬盘:<span foreground=\"green\">>24 hrs</span>"
-
-#: ardour_ui.cc:1449
-#, c-format
-msgid "Disk: <span foreground=\"%s\">%02dh:%02dm:%02ds</span>"
-msgstr "硬盘:<span foreground=\"%s\">%02dh:%02dm:%02ds</span>"
-
-#: ardour_ui.cc:1475
-#, c-format
-msgid "Timecode|TC: <span foreground=\"%s\">%s</span>"
-msgstr "时间码|TC:<span foreground=\"%s\">%s</span>"
-
-#: ardour_ui.cc:1596 ardour_ui.cc:1605 session_dialog.cc:318 session_dialog.cc:323
-msgid "Recent Sessions"
-msgstr "最近的会话"
-
-#: ardour_ui.cc:1684
-msgid ""
-"%1 is not connected to any audio backend.\n"
-"You cannot open or close sessions in this condition"
-msgstr ""
-"%1 没有连接到任何音频后端。\n"
-"在这种情况下您不能打开或关闭会话"
-
-#: ardour_ui.cc:1708
-msgid "Open Session"
-msgstr "打开会话"
-
-#: ardour_ui.cc:1733 session_dialog.cc:349 session_import_dialog.cc:170
-#: session_metadata_dialog.cc:858
-msgid "%1 sessions"
-msgstr "%1 会话"
-
-#: ardour_ui.cc:1770
-msgid "You cannot add a track without a session already loaded."
-msgstr "在没有任何一个会话被载入之前,您不能添加音轨。"
-
-#: ardour_ui.cc:1778
-msgid "could not create %1 new mixed track"
-msgid_plural "could not create %1 new mixed tracks"
-msgstr[0] "无法创建 %1 新的混音轨道"
-
-#: ardour_ui.cc:1784 ardour_ui.cc:1845
-msgid ""
-"There are insufficient ports available\n"
-"to create a new track or bus.\n"
-"You should save %1, exit and\n"
-"restart with more ports."
-msgstr ""
-"没有足够可用的端口\n"
-"去创建一个新的音轨或总线。\n"
-"您应当保存 %1,\n"
-"退出并且带着更多的端口重新启动。"
-
-#: ardour_ui.cc:1819
-msgid "You cannot add a track or bus without a session already loaded."
-msgstr "在没有任何一个会话被载入之前,您不能添加音轨或总线。"
-
-#: ardour_ui.cc:1828
-msgid "could not create %1 new audio track"
-msgid_plural "could not create %1 new audio tracks"
-msgstr[0] "无法创建 %1 新的音频轨道"
-
-#: ardour_ui.cc:1837
-msgid "could not create %1 new audio bus"
-msgid_plural "could not create %1 new audio busses"
-msgstr[0] "无法创建 %1 新的音频总线"
-
-#: ardour_ui.cc:1990
-msgid ""
-"Please create one or more tracks before trying to record.\n"
-"You can do this with the \"Add Track or Bus\" option in the Session menu."
-msgstr ""
-"在录制之前请先创建一条或多条音轨。\n"
-"您可以使用会话菜单中的“添加音轨或总线”选项来实现。"
-
-#: ardour_ui.cc:2376
-msgid "Save as..."
-msgstr "另存为…"
-
-#: ardour_ui.cc:2377 ardour_ui.cc:2456
-msgid "New session name"
-msgstr "新建快照的名称"
-
-#: ardour_ui.cc:2379
-msgid "Take Snapshot"
-msgstr "生成快照"
-
-#: ardour_ui.cc:2380
-msgid "Name of new snapshot"
-msgstr "新建快照的名称"
-
-#: ardour_ui.cc:2405
-msgid ""
-"To ensure compatibility with various systems\n"
-"snapshot names may not contain a '%1' character"
-msgstr ""
-"为了确保在不同系统间的兼容性\n"
-"快照名称不能包含' % 1 '字符"
-
-#: ardour_ui.cc:2417
-msgid "Confirm Snapshot Overwrite"
-msgstr "确定覆盖快照"
-
-#: ardour_ui.cc:2418
-msgid "A snapshot already exists with that name.  Do you want to overwrite it?"
-msgstr "已存在相同名称的快照。您打算覆盖它?"
-
-#: ardour_ui.cc:2421 utils_videotl.cc:74
-msgid "Overwrite"
-msgstr "覆盖"
-
-#: ardour_ui.cc:2455
-msgid "Rename Session"
-msgstr "重命名会话"
-
-#: ardour_ui.cc:2470 ardour_ui.cc:2886 ardour_ui.cc:2924
-msgid ""
-"To ensure compatibility with various systems\n"
-"session names may not contain a '%1' character"
-msgstr ""
-"为了确保在不同系统间的兼容性\n"
-"会话名称不能包含' % 1 '字符"
-
-#: ardour_ui.cc:2478
-msgid "That name is already in use by another directory/folder. Please try again."
-msgstr "此名称已被另一个目录/文件夹使用。 请再尝试另一个。"
-
-#: ardour_ui.cc:2487
-msgid ""
-"Renaming this session failed.\n"
-"Things could be seriously messed up at this point"
-msgstr ""
-"重命名会话失败.\n"
-"从现在开始事情真的将会变得很麻烦。"
-
-#: ardour_ui.cc:2602
-msgid "Save Template"
-msgstr "保存模板..."
-
-#: ardour_ui.cc:2603
-msgid "Name for template:"
-msgstr "模板名:"
-
-#: ardour_ui.cc:2604
-msgid "-template"
-msgstr "-模板"
-
-#: ardour_ui.cc:2643
-msgid ""
-"This session\n"
-"%1\n"
-"already exists. Do you want to open it?"
-msgstr ""
-"会话\n"
-"%1\n"
-"已存在。是否 打开它?"
-
-#: ardour_ui.cc:2653
-msgid "Open Existing Session"
-msgstr "打开已存在的会话"
-
-#: ardour_ui.cc:2914
-msgid "There is no existing session at \"%1\""
-msgstr "在 \"%1\" 没有会话文件"
-
-#: ardour_ui.cc:3006
-msgid "Please wait while %1 loads your session"
-msgstr "请等待 %1 载入您的会话"
-
-#: ardour_ui.cc:3021
-msgid "Port Registration Error"
-msgstr "端口注册错误"
-
-#: ardour_ui.cc:3022
-msgid "Click the Close button to try again."
-msgstr "请单击关闭按钮,再尝试一遍"
-
-#: ardour_ui.cc:3043
-msgid "Session \"%1 (snapshot %2)\" did not load successfully"
-msgstr "会话  \"%1 (快照 %2)\" 载入失败"
-
-#: ardour_ui.cc:3049
-msgid "Loading Error"
-msgstr "载入错误"
-
-#: ardour_ui.cc:3068
-msgid ""
-"This session has been opened in read-only mode.\n"
-"\n"
-"You will not be able to record or save."
-msgstr ""
-"本次会话已经以只读模式打开。\n"
-"\n"
-"您不能录制或者保存。"
-
-#: ardour_ui.cc:3073
-msgid "Read-only Session"
-msgstr "只读会话"
-
-#: ardour_ui.cc:3139
-msgid "Could not create session in \"%1\""
-msgstr "在 \"%1\" 无法创建会话"
-
-#: ardour_ui.cc:3288
-msgid "No files were ready for clean-up"
-msgstr "没有可以清空的文件"
-
-#: ardour_ui.cc:3292 ardour_ui.cc:3302 ardour_ui.cc:3435 ardour_ui.cc:3442
-#: ardour_ui_ed.cc:103
-msgid "Clean-up"
-msgstr "清空"
-
-#: ardour_ui.cc:3293
-msgid ""
-"If this seems suprising, \n"
-"check for any existing snapshots.\n"
-"These may still include regions that\n"
-"require some unused files to continue to exist."
-msgstr ""
-"如果这情况看起来有点异常,\n"
-"请检查任何已存在的快照。\n"
-"它们也许仍包括有某些范围\n"
-" 需要继续保留某些未使用的文件。"
-
-#: ardour_ui.cc:3352
-msgid "kilo"
-msgstr "千"
-
-#: ardour_ui.cc:3355
-msgid "mega"
-msgstr "兆(百万)"
-
-#: ardour_ui.cc:3358
-msgid "giga"
-msgstr "十亿(千兆)"
-
-#: ardour_ui.cc:3363
-msgid ""
-"The following file was deleted from %2,\n"
-"releasing %3 %4bytes of disk space"
-msgid_plural ""
-"The following %1 files were deleted from %2,\n"
-"releasing %3 %4bytes of disk space"
-msgstr[0] ""
-"以下 %1 文件被从 %2 删除,\n"
-"释放 %3 %4 字节的磁盘空间"
-
-#: ardour_ui.cc:3370
-msgid ""
-"The following file was not in use and \n"
-"has been moved to: %2\n"
-"\n"
-"After a restart of %5\n"
-"\n"
-"<span face=\"mono\">Session -> Clean-up -> Flush Wastebasket</span>\n"
-"\n"
-"will release an additional %3 %4bytes of disk space.\n"
-msgid_plural ""
-"The following %1 files were not in use and \n"
-"have been moved to: %2\n"
-"\n"
-"After a restart of %5\n"
-"\n"
-"<span face=\"mono\">Session -> Clean-up -> Flush Wastebasket</span>\n"
-"\n"
-"will release an additional %3 %4bytes of disk space.\n"
-msgstr[0] ""
-"以下 %1 文件未被使用\n"
-"并且被移动到: %2  \n"
-"\n"
-
-#: ardour_ui.cc:3430
-msgid "Are you sure you want to clean-up?"
-msgstr "您确认要清空?"
-
-#: ardour_ui.cc:3437
-msgid ""
-"Clean-up is a destructive operation.\n"
-"ALL undo/redo information will be lost if you clean-up.\n"
-"Clean-up will move all unused files to a \"dead\" location."
-msgstr ""
-"清空是毁灭性的操作。\n"
-"如果你清空了, 所有的撤销/重做信息将会丢失。\n"
-"清空将会把所有未使用过的文件移动到 \"死亡\" 位置。"
-
-#: ardour_ui.cc:3445
-msgid "CleanupDialog"
-msgstr "清空对话框"
-
-#: ardour_ui.cc:3475
-msgid "Cleaned Files"
-msgstr "清除文件"
-
-#: ardour_ui.cc:3492
-msgid "deleted file"
-msgstr "删除文件"
-
-#: ardour_ui.cc:3637
-msgid "Video-Server was not launched by %1. The request to stop it is ignored."
-msgstr "视频服务器未被 %1 触发。请求停止视频服务器的要求被忽略。"
-
-#: ardour_ui.cc:3641
-msgid "Stop Video-Server"
-msgstr "停止视频服务器"
-
-#: ardour_ui.cc:3642
-msgid "Do you really want to stop the Video Server?"
-msgstr "您真的打算停止视频服务器?"
-
-#: ardour_ui.cc:3645
-msgid "Yes, Stop It"
-msgstr "是的,停止它"
-
-#: ardour_ui.cc:3671
-msgid "The Video Server is already started."
-msgstr "视频服务器已经启动。"
-
-#: ardour_ui.cc:3673
-msgid ""
-"An external Video Server is configured and can be reached. Not starting a new "
-"instance."
-msgstr "一个外部视频服务器已经配置且可以实现。尚未启动一个新的实例。"
-
-#: ardour_ui.cc:3681 ardour_ui.cc:3786
-msgid ""
-"Could not connect to the Video Server. Start it or configure its access URL in "
-"Preferences."
-msgstr "无法连接到视频服务器。请启动或者配置视频服务器的访问URL网址首选项。"
-
-#: ardour_ui.cc:3711
-msgid "Specified docroot is not an existing directory."
-msgstr "指定的文档根目录不存在。"
-
-#: ardour_ui.cc:3717 ardour_ui.cc:3723
-msgid "Given Video Server is not an executable file."
-msgstr "给定的视频服务器不是一个可执行文件。"
-
-#: ardour_ui.cc:3757
-msgid "Cannot launch the video-server"
-msgstr "无法启动视频服务器"
-
-#: ardour_ui.cc:3767
-msgid "Video-server was started but does not respond to requests..."
-msgstr "视频服务器已经启动但没有响应请求……"
-
-#: ardour_ui.cc:3812 editor_audio_import.cc:641
-msgid "could not open %1"
-msgstr "无法打开%1"
-
-#: ardour_ui.cc:3816
-msgid "no video-file selected"
-msgstr "尚未选择视频文件"
-
-#: ardour_ui.cc:4014
-msgid "Recording was stopped because your system could not keep up."
-msgstr "由于您的系统无法继续工作导致录制停止。"
-
-#: ardour_ui.cc:4043
-msgid ""
-"The disk system on your computer\n"
-"was not able to keep up with %1.\n"
-"\n"
-"Specifically, it failed to write data to disk\n"
-"quickly enough to keep up with recording.\n"
-msgstr ""
-"您电脑的硬盘系统\n"
-"无法持续跟进 %1 。\n"
-"\n"
-"确切地说,失败的原因是硬盘的写入速度\n"
-"不足以持续跟上录制的速度。\n"
-
-#: ardour_ui.cc:4113
-msgid "Scanning for plugins"
-msgstr "正在扫描插件"
-
-#: ardour_ui.cc:4115
-msgid "Cancel plugin scan"
-msgstr "取消插件扫描"
-
-#: ardour_ui.cc:4124
-msgid "Stop Timeout"
-msgstr "停止超时"
-
-#: ardour_ui.cc:4131
-msgid "Scan Timeout"
-msgstr "扫描超时"
-
-#: ardour_ui.cc:4174
-msgid ""
-"The disk system on your computer\n"
-"was not able to keep up with %1.\n"
-"\n"
-"Specifically, it failed to read data from disk\n"
-"quickly enough to keep up with playback.\n"
-msgstr ""
-"您电脑的硬盘系统\n"
-"无法持续跟进 %1 。\n"
-"\n"
-"确切地说,失败的原因是硬盘的读取速度\n"
-"不足以持续跟上回放的速度。\n"
-
-#: ardour_ui.cc:4214
-msgid "Crash Recovery"
-msgstr "崩溃恢复"
-
-#: ardour_ui.cc:4215
-msgid ""
-"This session appears to have been in the\n"
-"middle of recording when %1 or\n"
-"the computer was shutdown.\n"
-"\n"
-"%1 can recover any captured audio for\n"
-"you, or it can ignore it. Please decide\n"
-"what you would like to do.\n"
-msgstr ""
-"本会话似乎是一直处在\n"
-"录制的中段,当 %1 时\n"
-"或者在计算机关闭时。\n"
-"\n"
-" %1 可以为您恢复任何已捕获的音频,\n"
-"或者忽略它。\n"
-"请确认您的决定。\n"
-
-#: ardour_ui.cc:4227
-msgid "Ignore crash data"
-msgstr "忽略崩溃的数据"
-
-#: ardour_ui.cc:4228
-msgid "Recover from crash"
-msgstr "恢复到崩溃前"
-
-#: ardour_ui.cc:4248
-msgid "Sample Rate Mismatch"
-msgstr "采样率不匹配"
-
-#: ardour_ui.cc:4249
-msgid ""
-"This session was created with a sample rate of %1 Hz, but\n"
-"%2 is currently running at %3 Hz.  If you load this session,\n"
-"audio may be played at the wrong sample rate.\n"
-msgstr ""
-"本会话已经创建 %1 Hz 的采样率,\n"
-"但是 %2 目前运行在 %3 Hz。如果您加载这个会话,\n"
-"音频可能会处在错误的采样率上播放。\n"
-
-#: ardour_ui.cc:4258
-msgid "Do not load session"
-msgstr "不要载入会话"
-
-#: ardour_ui.cc:4259
-msgid "Load session anyway"
-msgstr "只管载入会话"
-
-#: ardour_ui.cc:4286
-msgid "Could not disconnect from Audio/MIDI engine"
-msgstr "无法从音频/MIDI引擎上取消连接"
-
-#: ardour_ui.cc:4303 ardour_ui.cc:4306
-msgid "Could not reconnect to the Audio/MIDI engine"
-msgstr "无法重新连接到音频/MIDI引擎"
-
-#: ardour_ui.cc:4590
-msgid ""
-"%4This is a session from an older version of %3%5\n"
-"\n"
-"%3 has copied the old session file\n"
-"\n"
-"%6%1%7\n"
-"\n"
-"to\n"
-"\n"
-"%6%2%7\n"
-"\n"
-"From now on, use the -2000 version with older versions of %3"
-msgstr ""
-"%4 这是一个来源于 %3%5 旧版本的会话\n"
-"\n"
-"%3 已经被复制到旧的会话文件\n"
-"\n"
-"%6%1%7\n"
-"\n"
-"to\n"
-"\n"
-"%6%2%7\n"
-"\n"
-"从现在开始,使用连带旧版 %3 的 -2000 版本"
-
-#: ardour_ui2.cc:73
-msgid "UI: cannot setup editor"
-msgstr "用户界面:无法设置编辑器"
-
-#: ardour_ui2.cc:78
-msgid "UI: cannot setup mixer"
-msgstr "用户界面:无法设置混音器"
-
-#: ardour_ui2.cc:83
-msgid "UI: cannot setup meterbridge"
-msgstr "用户界面:无法设置节拍桥接"
-
-#: ardour_ui2.cc:128
-msgid "Play from playhead"
-msgstr "从指针开始播放"
-
-#: ardour_ui2.cc:129
-msgid "Stop playback"
-msgstr "停止回放"
-
-#: ardour_ui2.cc:130
-msgid "Toggle record"
-msgstr "切换录制"
-
-#: ardour_ui2.cc:131
-msgid "Play range/selection"
-msgstr "播放范围/已选择部分"
-
-#: ardour_ui2.cc:132
-msgid "Go to start of session"
-msgstr "转至会话起点"
-
-#: ardour_ui2.cc:133
-msgid "Go to end of session"
-msgstr "转至会话终点"
-
-#: ardour_ui2.cc:134
-msgid "Play loop range"
-msgstr "播放循环范围"
-
-#: ardour_ui2.cc:135
-msgid ""
-"MIDI Panic\n"
-"Send note off and reset controller messages on all MIDI channels"
-msgstr ""
-"MIDI 终止\n"
-"发送音符关闭和复位控制器信息到所有 MIDI 通道"
-
-#: ardour_ui2.cc:136
-msgid "Return to last playback start when stopped"
-msgstr "当停止时返回至最后一次回放的起点"
-
-#: ardour_ui2.cc:137
-msgid "Playhead follows Range Selections and Edits"
-msgstr "指针跟随范围已选择部分并编辑"
-
-#: ardour_ui2.cc:138
-msgid "Be sensible about input monitoring"
-msgstr "确保清晰的输入监控"
-
-#: ardour_ui2.cc:139
-msgid "Enable/Disable audio click"
-msgstr "启用/禁用音频识别声(节拍器) "
-
-#: ardour_ui2.cc:140 monitor_section.cc:111
-msgid ""
-"When active, something is soloed.\n"
-"Click to de-solo everything"
-msgstr ""
-"启用时,仅独奏某部分。\n"
-"Click to de-solo everything 点击全部不独奏"
-
-#: ardour_ui2.cc:141
-msgid ""
-"When active, auditioning is taking place\n"
-"Click to stop the audition"
-msgstr ""
-"当启用时监听开始.\n"
-"点击停止监听."
-
-#: ardour_ui2.cc:142
-msgid "When active, there is a feedback loop."
-msgstr "启用时,有一个反馈回路。"
-
-#: ardour_ui2.cc:143
-msgid ""
-"<b>Primary Clock</b> right-click to set display mode. Click to edit, click+drag a "
-"digit or mouse-over+scroll wheel to modify.\n"
-"Text edits: right-to-left overwrite <tt>Esc</tt>: cancel; <tt>Enter</tt>: confirm; "
-"postfix the edit with '+' or '-' to enter delta times.\n"
-msgstr ""
-"<b>主计时器</b>右键点击设置显示模式。点击即可编辑,点击+拖动数字或者鼠标放在数字上"
-"面滚动滚轮即可修改数字。\n"
-"文本编辑:从右到左覆盖 <tt>Esc 键</tt>:取消; <tt>回车键</tt>:确认;编辑后加"
-"上“+”号或者“-”号即可进入下一级时间\n"
-
-#: ardour_ui2.cc:144
-msgid ""
-"<b>Secondary Clock</b> right-click to set display mode. Click to edit, click+drag "
-"a digit or mouse-over+scroll wheel to modify.\n"
-"Text edits: right-to-left overwrite <tt>Esc</tt>: cancel; <tt>Enter</tt>: confirm; "
-"postfix the edit with '+' or '-' to enter delta times.\n"
-msgstr ""
-"<b>第二计时器</b>右键点击设置显示模式。点击即可编辑,点击+拖动数字或者鼠标放在数字"
-"上面滚动滚轮即可修改数字。\n"
-"文本编辑:从右到左覆盖 <tt>Esc 键</tt>:取消; <tt>回车键</tt>:确认;编辑后加"
-"上“+”号或者“-”号即可进入下一级时间\n"
-
-#: ardour_ui2.cc:145
-msgid "Reset All Peak Indicators"
-msgstr "重置所有峰值指标"
-
-#: ardour_ui2.cc:146
-msgid "Show Error Log and acknowledge warnings"
-msgstr "显示错误日志并确认警报"
-
-#: ardour_ui2.cc:179
-msgid "[ERROR]: "
-msgstr "【错误】:"
-
-#: ardour_ui2.cc:182
-msgid "[WARNING]: "
-msgstr "【警告】:"
-
-#: ardour_ui2.cc:185
-msgid "[INFO]: "
-msgstr "【信息】:"
-
-#: ardour_ui2.cc:253 ardour_ui_ed.cc:403
-msgid "Auto Return"
-msgstr "自动返回"
-
-#: ardour_ui2.cc:255 ardour_ui_ed.cc:406
-msgid "Follow Edits"
-msgstr "跟随编辑"
-
-# GUI - Graphical User Interface
-#: ardour_ui2.cc:716 rc_option_editor.cc:2300
-msgid "GUI"
-msgstr "图形用户界面"
-
-#: ardour_ui2.cc:733 rc_option_editor.cc:1309 rc_option_editor.cc:1327
-#: rc_option_editor.cc:1330 rc_option_editor.cc:1332 rc_option_editor.cc:1334
-#: rc_option_editor.cc:1342 rc_option_editor.cc:1350 rc_option_editor.cc:1352
-#: rc_option_editor.cc:1360 rc_option_editor.cc:1367 rc_option_editor.cc:1376
-#: rc_option_editor.cc:1378 rc_option_editor.cc:1380 rc_option_editor.cc:1388
-#: rc_option_editor.cc:1390 rc_option_editor.cc:1399 session_option_editor.cc:321
-#: session_option_editor.cc:323 session_option_editor.cc:344
-#: session_option_editor.cc:346 session_option_editor.cc:348
-#: session_option_editor.cc:355 session_option_editor.cc:362
-#: session_option_editor.cc:366
-msgid "Misc"
-msgstr "杂项"
-
-#: ardour_ui_dependents.cc:76
-msgid "Setup Editor"
-msgstr "设置编辑器"
-
-#: ardour_ui_dependents.cc:78
-msgid "Setup Mixer"
-msgstr "设置混音器"
-
-#: ardour_ui_dependents.cc:84
-msgid "Reload Session History"
-msgstr "重新装摘会话历史"
-
-#: ardour_ui_dialogs.cc:250
-msgid "Don't close"
-msgstr "请勿关闭"
-
-#: ardour_ui_dialogs.cc:251
-msgid "Just close"
-msgstr "只管关闭"
-
-#: ardour_ui_dialogs.cc:252
-msgid "Save and close"
-msgstr "保存并关闭"
-
-#: ardour_ui_dialogs.cc:362
-msgid "This screen is not tall enough to display the mixer window"
-msgstr "这个屏幕的高度不足以显示混音器窗口"
-
-#: ardour_ui_ed.cc:102
-msgid "Session"
-msgstr "会话"
-
-#: ardour_ui_ed.cc:105 editor_actions.cc:138 editor_regions.cc:116 port_group.cc:458
-#: session_option_editor.cc:82 session_option_editor.cc:89
-msgid "Sync"
-msgstr "同步"
-
-#: ardour_ui_ed.cc:106
-msgid "Options"
-msgstr "选项"
-
-#: ardour_ui_ed.cc:107
-msgid "Window"
-msgstr "窗口"
-
-#: ardour_ui_ed.cc:108
-msgid "Help"
-msgstr "帮助"
-
-#: ardour_ui_ed.cc:109
-msgid "Misc. Shortcuts"
-msgstr "杂项、 快捷键"
-
-#: ardour_ui_ed.cc:110
-msgid "Audio File Format"
-msgstr "音频文件格式"
-
-#: ardour_ui_ed.cc:111
-msgid "File Type"
-msgstr "文件类型"
-
-#: ardour_ui_ed.cc:112 export_format_dialog.cc:67
-msgid "Sample Format"
-msgstr "采样格式"
-
-#: ardour_ui_ed.cc:113 rc_option_editor.cc:2245 rc_option_editor.cc:2257
-msgid "Control Surfaces"
-msgstr "控制面"
-
-#: ardour_ui_ed.cc:114 rc_option_editor.cc:1921 rc_option_editor.cc:2264
-msgid "Plugins"
-msgstr "插件"
-
-#: ardour_ui_ed.cc:115 rc_option_editor.cc:2351
-msgid "Metering"
-msgstr "节拍"
-
-#: ardour_ui_ed.cc:116
-msgid "Fall Off Rate"
-msgstr "衰减率"
-
-#: ardour_ui_ed.cc:117
-msgid "Hold Time"
-msgstr "持续时间"
-
-#: ardour_ui_ed.cc:118
-msgid "Denormal Handling"
-msgstr "非常规处理"
-
-#: ardour_ui_ed.cc:122 route_time_axis.cc:1677
-msgid "New..."
-msgstr "新建…"
-
-#: ardour_ui_ed.cc:124
-msgid "Open..."
-msgstr "打开…"
-
-#: ardour_ui_ed.cc:125
-msgid "Recent..."
-msgstr "最近的…"
-
-#: ardour_ui_ed.cc:126 panner_editor.cc:29 playlist_selector.cc:64
-msgid "Close"
-msgstr "关闭"
-
-#: ardour_ui_ed.cc:129
-msgid "Add Track or Bus..."
-msgstr "添加音轨或总线…"
-
-#: ardour_ui_ed.cc:134
-msgid "Open Video"
-msgstr "打开视频"
-
-#: ardour_ui_ed.cc:137
-msgid "Remove Video"
-msgstr "移除视频"
-
-#: ardour_ui_ed.cc:140
-msgid "Export To Video File"
-msgstr "导出为视频文件"
-
-#: ardour_ui_ed.cc:144
-msgid "Snapshot..."
-msgstr "快照…"
-
-#: ardour_ui_ed.cc:148
-msgid "Save As..."
-msgstr "另存为…"
-
-#: ardour_ui_ed.cc:152 editor_actions.cc:1771 editor_markers.cc:903
-#: editor_snapshots.cc:124 mixer_strip.cc:1518 route_time_axis.cc:1673
-msgid "Rename..."
-msgstr "重命名…"
-
-#: ardour_ui_ed.cc:156
-msgid "Save Template..."
-msgstr "保存模板…"
-
-#: ardour_ui_ed.cc:159
-msgid "Metadata"
-msgstr "元数据"
-
-#: ardour_ui_ed.cc:162
-msgid "Edit Metadata..."
-msgstr "编辑元数据…"
-
-#: ardour_ui_ed.cc:165
-msgid "Import Metadata..."
-msgstr "导入元数据…"
-
-#: ardour_ui_ed.cc:168
-msgid "Export To Audio File(s)..."
-msgstr "导出为音频文件…"
-
-#: ardour_ui_ed.cc:171
-msgid "Stem export..."
-msgstr "主体导出…"
-
-#: ardour_ui_ed.cc:174 editor_export_audio.cc:65 export_dialog.cc:129
-#: export_video_dialog.cc:84
-msgid "Export"
-msgstr "导出"
-
-#: ardour_ui_ed.cc:177
-msgid "Clean-up Unused Sources..."
-msgstr "清空未使用的源…"
-
-#: ardour_ui_ed.cc:181
-msgid "Flush Wastebasket"
-msgstr "清空回收站"
-
-#: ardour_ui_ed.cc:188
-msgid "Quit"
-msgstr "退出"
-
-#: ardour_ui_ed.cc:192
-msgid "Maximise Editor Space"
-msgstr "最大化编辑器空间"
-
-#: ardour_ui_ed.cc:193
-msgid "Maximise Mixer Space"
-msgstr "最大化混音器空间"
-
-#: ardour_ui_ed.cc:194
-msgid "Show Toolbars"
-msgstr "显示工具栏"
-
-#: ardour_ui_ed.cc:198
-msgid "Show more UI preferences"
-msgstr "显示更多用户界面首选项"
-
-#: ardour_ui_ed.cc:200 mixer_ui.cc:1924 mixer_ui.cc:1930
-msgid "Window|Mixer"
-msgstr "窗口|混音器"
-
-#: ardour_ui_ed.cc:201
-msgid "Toggle Editor+Mixer"
-msgstr "切换编辑器+混音器"
-
-#: ardour_ui_ed.cc:202 meterbridge.cc:218 meterbridge.cc:224
-msgid "Window|Meterbridge"
-msgstr "窗口|节拍桥接"
-
-#: ardour_ui_ed.cc:204
-msgid "Reattach All Tearoffs"
-msgstr "重新附加所有的片段"
-
-#: ardour_ui_ed.cc:206 midi_tracer.cc:45
-msgid "MIDI Tracer"
-msgstr "MIDI 音轨"
-
-#: ardour_ui_ed.cc:208
-msgid "Chat"
-msgstr "聊天"
-
-#: ardour_ui_ed.cc:210
-msgid "Help|Manual"
-msgstr "帮助|手册"
-
-#: ardour_ui_ed.cc:211
-msgid "Reference"
-msgstr "参考"
-
-#: ardour_ui_ed.cc:212
-msgid "Report A Bug"
-msgstr "报告故障"
-
-#: ardour_ui_ed.cc:213
-msgid "Cheat Sheet"
-msgstr "备忘录"
-
-#: ardour_ui_ed.cc:214
-msgid "Ardour Website"
-msgstr "Ardour 官网"
-
-#: ardour_ui_ed.cc:215
-msgid "Ardour Development"
-msgstr "Ardour 开发 "
-
-#: ardour_ui_ed.cc:216
-msgid "User Forums"
-msgstr "用户论坛"
-
-#: ardour_ui_ed.cc:217
-msgid "How to report a bug"
-msgstr "如何报告故障"
-
-#: ardour_ui_ed.cc:219 plugin_ui.cc:419
-msgid "Save"
-msgstr "保存"
-
-#: ardour_ui_ed.cc:227 rc_option_editor.cc:1419 rc_option_editor.cc:1430
-#: rc_option_editor.cc:1441 rc_option_editor.cc:1450 rc_option_editor.cc:1463
-#: rc_option_editor.cc:1476 rc_option_editor.cc:1485 rc_option_editor.cc:1495
-#: rc_option_editor.cc:1497 rc_option_editor.cc:1506 rc_option_editor.cc:1522
-#: rc_option_editor.cc:1543 rc_option_editor.cc:1561 rc_option_editor.cc:1563
-#: rc_option_editor.cc:1579 rc_option_editor.cc:1582 rc_option_editor.cc:1584
-#: rc_option_editor.cc:1601 rc_option_editor.cc:1612
-msgid "Transport"
-msgstr "播送"
-
-#: ardour_ui_ed.cc:233
-msgid "Stop"
-msgstr "停止"
-
-#: ardour_ui_ed.cc:236
-msgid "Roll"
-msgstr "滚动"
-
-#: ardour_ui_ed.cc:240 ardour_ui_ed.cc:243
-msgid "Start/Stop"
-msgstr "开始/停止"
-
-#: ardour_ui_ed.cc:246
-msgid "Start/Continue/Stop"
-msgstr "开始/继续/停止"
-
-#: ardour_ui_ed.cc:249
-msgid "Stop and Forget Capture"
-msgstr "暂停并且废弃已捕获内容"
-
-#: ardour_ui_ed.cc:259
-msgid "Transition To Roll"
-msgstr "过渡到滚动"
-
-#: ardour_ui_ed.cc:263
-msgid "Transition To Reverse"
-msgstr "过渡到反向"
-
-#: ardour_ui_ed.cc:267
-msgid "Play Loop Range"
-msgstr "循环播放范围"
-
-#: ardour_ui_ed.cc:270
-msgid "Play Selection"
-msgstr "播放已选择部分"
-
-#: ardour_ui_ed.cc:273
-msgid "Play Selection w/Preroll"
-msgstr "播放已选择部分预滚"
-
-#: ardour_ui_ed.cc:277
-msgid "Enable Record"
-msgstr "启用录制"
-
-#: ardour_ui_ed.cc:280 ardour_ui_ed.cc:284
-msgid "Start Recording"
-msgstr "开始录制"
-
-#: ardour_ui_ed.cc:288
-msgid "Rewind"
-msgstr "倒带"
-
-#: ardour_ui_ed.cc:291
-msgid "Rewind (Slow)"
-msgstr "倒带(慢速)"
-
-#: ardour_ui_ed.cc:294
-msgid "Rewind (Fast)"
-msgstr "倒带(快速)"
-
-#: ardour_ui_ed.cc:297
-msgid "Forward"
-msgstr "å¿«è¿›"
-
-#: ardour_ui_ed.cc:300
-msgid "Forward (Slow)"
-msgstr "快进(慢速)"
-
-#: ardour_ui_ed.cc:303
-msgid "Forward (Fast)"
-msgstr "快进(快速)"
-
-#: ardour_ui_ed.cc:306
-msgid "Go to Zero"
-msgstr "转到零点"
-
-#: ardour_ui_ed.cc:309 ardour_ui_ed.cc:312
-msgid "Go to Start"
-msgstr "转到起始位置"
-
-#: ardour_ui_ed.cc:315
-msgid "Go to End"
-msgstr "转到末尾位置"
-
-#: ardour_ui_ed.cc:318
-msgid "Go to Wall Clock"
-msgstr "转到计时点"
-
-#: ardour_ui_ed.cc:323 ardour_ui_ed.cc:326
-msgid "Numpad Decimal"
-msgstr "数字键盘十进制"
-
-#: ardour_ui_ed.cc:329
-msgid "Numpad 0"
-msgstr "数字键盘 0"
-
-#: ardour_ui_ed.cc:332
-msgid "Numpad 1"
-msgstr "数字键盘 1"
-
-#: ardour_ui_ed.cc:335
-msgid "Numpad 2"
-msgstr "数字键盘 2"
-
-#: ardour_ui_ed.cc:338
-msgid "Numpad 3"
-msgstr "数字键盘 3"
-
-#: ardour_ui_ed.cc:341
-msgid "Numpad 4"
-msgstr "数字键盘 4"
-
-#: ardour_ui_ed.cc:344
-msgid "Numpad 5"
-msgstr "数字键盘 5"
-
-#: ardour_ui_ed.cc:347
-msgid "Numpad 6"
-msgstr "数字键盘 6"
-
-#: ardour_ui_ed.cc:350
-msgid "Numpad 7"
-msgstr "数字键盘 7"
-
-#: ardour_ui_ed.cc:353
-msgid "Numpad 8"
-msgstr "数字键盘 8"
-
-#: ardour_ui_ed.cc:356
-msgid "Numpad 9"
-msgstr "数字键盘 9"
-
-#: ardour_ui_ed.cc:360
-msgid "Focus On Clock"
-msgstr "聚焦于计时器"
-
-#: ardour_ui_ed.cc:364 ardour_ui_ed.cc:373 audio_clock.cc:2091 editor.cc:258
-#: editor_actions.cc:569 editor_actions.cc:578 export_timespan_selector.cc:88
-#: session_option_editor.cc:41 session_option_editor.cc:61
-#: session_option_editor.cc:80 session_option_editor.cc:96
-#: session_option_editor.cc:109 session_option_editor.cc:122
-#: session_option_editor.cc:124 session_option_editor.cc:126
-msgid "Timecode"
-msgstr "时间码"
-
-#: ardour_ui_ed.cc:366 ardour_ui_ed.cc:375 editor_actions.cc:567
-msgid "Bars & Beats"
-msgstr "小节 & 拍子"
-
-#: ardour_ui_ed.cc:368 ardour_ui_ed.cc:377
-msgid "Minutes & Seconds"
-msgstr "分&秒"
-
-#: ardour_ui_ed.cc:370 ardour_ui_ed.cc:379 audio_clock.cc:2095 editor.cc:259
-#: editor_actions.cc:568
-msgid "Samples"
-msgstr "采样"
-
-#: ardour_ui_ed.cc:382
-msgid "Punch In"
-msgstr "切入"
-
-#: ardour_ui_ed.cc:383 mixer_strip.cc:1819 mixer_strip.cc:1843 mixer_strip.cc:2007
-#: route_ui.cc:162 time_info_box.cc:116
-msgid "In"
-msgstr "å…¥"
-
-#: ardour_ui_ed.cc:386
-msgid "Punch Out"
-msgstr "切出"
-
-#: ardour_ui_ed.cc:387 mixer_strip.cc:1831 time_info_box.cc:117
-msgid "Out"
-msgstr "出"
-
-#: ardour_ui_ed.cc:390
-msgid "Punch In/Out"
-msgstr "切入/切出"
-
-#: ardour_ui_ed.cc:391
-msgid "In/Out"
-msgstr "入/出"
-
-#: ardour_ui_ed.cc:394 rc_option_editor.cc:1376
-msgid "Click"
-msgstr "点击"
-
-#: ardour_ui_ed.cc:397
-msgid "Auto Input"
-msgstr "自动输入"
-
-#: ardour_ui_ed.cc:400
-msgid "Auto Play"
-msgstr "自动播放"
-
-#: ardour_ui_ed.cc:411
-msgid "Sync Startup to Video"
-msgstr "同步启动到视频"
-
-#: ardour_ui_ed.cc:413
-msgid "Time Master"
-msgstr "计时器主控"
-
-#: ardour_ui_ed.cc:420
-msgid "Toggle Record Enable Track %1"
-msgstr "切换录制可用音轨 %1"
-
-#: ardour_ui_ed.cc:427
-msgid "Percentage"
-msgstr "百分比"
-
-#: ardour_ui_ed.cc:428 shuttle_control.cc:178
-msgid "Semitones"
-msgstr "半音"
-
-#: ardour_ui_ed.cc:432
-msgid "Send MTC"
-msgstr "发送MTC"
-
-#: ardour_ui_ed.cc:434
-msgid "Send MMC"
-msgstr "发送MMC"
-
-#: ardour_ui_ed.cc:436
-msgid "Use MMC"
-msgstr "使用MMC"
-
-#: ardour_ui_ed.cc:438 rc_option_editor.cc:2097
-msgid "Send MIDI Clock"
-msgstr "发送MIDI计时器"
-
-#: ardour_ui_ed.cc:440
-msgid "Send MIDI Feedback"
-msgstr "发送MIDI反馈"
-
-#: ardour_ui_ed.cc:446
-msgid "Panic"
-msgstr "终止"
-
-#: ardour_ui_ed.cc:534
-msgid "Wall Clock"
-msgstr "计时点"
-
-#: ardour_ui_ed.cc:536
-msgid "Disk Space"
-msgstr "硬盘空间"
-
-#: ardour_ui_ed.cc:537
-msgid "DSP"
-msgstr "数字信号处理"
-
-#: ardour_ui_ed.cc:538
-msgid "Buffers"
-msgstr "缓冲"
-
-#: ardour_ui_ed.cc:540
-msgid "Timecode Format"
-msgstr " 时间码格式"
-
-#: ardour_ui_ed.cc:541
-msgid "File Format"
-msgstr "文件格式"
-
-#: ardour_ui_options.cc:63
-msgid ""
-"It is not possible to use JACK as the the sync source\n"
-"when the pull up/down setting is non-zero."
-msgstr ""
-"当拖动上/下的设置为非零时,\n"
-"不可能使用JACK作为同步源。"
-
-#: ardour_ui_options.cc:317
-msgid "Internal"
-msgstr "内部的"
-
-#: ardour_ui_options.cc:498
-msgid "Enable/Disable external positional sync"
-msgstr "启用/禁用外部位置同步"
-
-#: ardour_ui_options.cc:500
-msgid "Sync to JACK is not possible: video pull up/down is set"
-msgstr "不可能同步JACK:视频拖动上/下当前设置"
-
-#: audio_clock.cc:1047 audio_clock.cc:1066
-msgid "--pending--"
-msgstr "—搁置—"
-
-#: audio_clock.cc:1118
-msgid "SR"
-msgstr ""
-
-#: audio_clock.cc:1124 audio_clock.cc:1128
-msgid "Pull"
-msgstr "拖动"
-
-#: audio_clock.cc:1126
-#, c-format
-msgid "%+.4f%%"
-msgstr "%+.4f%%"
-
-#: audio_clock.cc:1282 editor.cc:260 editor_actions.cc:139 editor_actions.cc:561
-msgid "Tempo"
-msgstr "节奏"
-
-#: audio_clock.cc:1286 editor.cc:261 editor_actions.cc:562
-msgid "Meter"
-msgstr "节拍"
-
-#: audio_clock.cc:1864 audio_streamview.cc:115 editor_actions.cc:1089
-#: session_metadata_dialog.cc:452 session_metadata_dialog.cc:500
-#: session_metadata_dialog.cc:556 session_metadata_dialog.cc:845 streamview.cc:470
-msgid "programming error: %1"
-msgstr "程序错误: %1"
-
-#: audio_clock.cc:1997 audio_clock.cc:2025
-msgid "programming error: %1 %2"
-msgstr "程序错误:%1 %2"
-
-#: audio_clock.cc:2093 editor.cc:257 export_timespan_selector.cc:98
-msgid "Bars:Beats"
-msgstr "小节:拍子"
-
-#: audio_clock.cc:2094 export_timespan_selector.cc:93
-msgid "Minutes:Seconds"
-msgstr "分:秒"
-
-#: audio_clock.cc:2099
-msgid "Set From Playhead"
-msgstr "从指针设置"
-
-#: audio_clock.cc:2100
-msgid "Locate to This Time"
-msgstr "放置此时间"
-
-#: audio_region_editor.cc:64 control_point_dialog.cc:49 rhythm_ferret.cc:124
-#: rhythm_ferret.cc:129 rhythm_ferret.cc:134
-msgid "dB"
-msgstr ""
-
-#: audio_region_editor.cc:67
-msgid "Region gain:"
-msgstr "区域增益:"
-
-#: audio_region_editor.cc:77 export_format_dialog.cc:43
-msgid "dBFS"
-msgstr ""
-
-#: audio_region_editor.cc:80
-msgid "Peak amplitude:"
-msgstr "峰值幅度:"
-
-#: audio_region_editor.cc:91
-msgid "Calculating..."
-msgstr "计算中…"
-
-#: audio_region_view.cc:1243
-msgid "add gain control point"
-msgstr "添加增益控制点"
-
-#: automation_controller.cc:286 automation_controller.cc:302
-msgid "Select Note..."
-msgstr "选择音符…"
-
-#: automation_controller.cc:293
-msgid "Halve"
-msgstr "减半"
-
-#: automation_controller.cc:296
-msgid "Double"
-msgstr "加倍"
-
-#: automation_controller.cc:307
-msgid "Set to %1 beat(s)"
-msgstr "设为 %1 拍"
-
-#: automation_line.cc:286 automation_line.cc:462
-msgid "automation event move"
-msgstr "自动化事件移动"
-
-#: automation_line.cc:488 automation_line.cc:508
-msgid "automation range move"
-msgstr "自动化范围移动"
-
-#: automation_line.cc:880 region_gain_line.cc:72
-msgid "remove control point"
-msgstr "移除控制点"
-
-#: automation_line.cc:1003
-msgid "Ignoring illegal points on AutomationLine \"%1\""
-msgstr "忽略自动化线路上的非法点:“ %1 ”"
-
-#: automation_region_view.cc:190 automation_time_axis.cc:644
-msgid "add automation event"
-msgstr "添加自动化事件"
-
-#: automation_streamview.cc:95
-msgid "unable to display automation region for control without list"
-msgstr "无法显示没有列表的自动化区域控制"
-
-#: automation_time_axis.cc:163
-msgid "automation state"
-msgstr "自动化状态"
-
-#: automation_time_axis.cc:164
-msgid "hide track"
-msgstr "隐藏音轨"
-
-#: automation_time_axis.cc:308 automation_time_axis.cc:360
-#: automation_time_axis.cc:554 gain_meter.cc:220 generic_pluginui.cc:523
-#: generic_pluginui.cc:817 panner_ui.cc:151
-msgid "Automation|Manual"
-msgstr "自动化 | 手册"
-
-#: automation_time_axis.cc:310 automation_time_axis.cc:371
-#: automation_time_axis.cc:559 editor.cc:1904 editor.cc:1981 editor_actions.cc:122
-#: editor_actions.cc:1920 gain_meter.cc:223 generic_pluginui.cc:99
-#: generic_pluginui.cc:526 generic_pluginui.cc:819 midi_time_axis.cc:1606
-#: midi_time_axis.cc:1609 midi_time_axis.cc:1612 panner_ui.cc:154
-msgid "Play"
-msgstr "播放"
-
-#: automation_time_axis.cc:312 automation_time_axis.cc:382
-#: automation_time_axis.cc:564 gain_meter.cc:226 generic_pluginui.cc:101
-#: generic_pluginui.cc:529 generic_pluginui.cc:821 panner_ui.cc:157
-msgid "Write"
-msgstr "写入"
-
-#: automation_time_axis.cc:314 automation_time_axis.cc:393
-#: automation_time_axis.cc:569 gain_meter.cc:229 generic_pluginui.cc:103
-#: generic_pluginui.cc:532 generic_pluginui.cc:823 panner_ui.cc:160
-msgid "Touch"
-msgstr "触碰"
-
-#: automation_time_axis.cc:404 generic_pluginui.cc:535 meter_patterns.cc:112
-msgid "???"
-msgstr "???"
-
-#: automation_time_axis.cc:445
-msgid "clear automation"
-msgstr "清除自动化"
-
-#: automation_time_axis.cc:543 editor_actions.cc:645 editor_markers.cc:902
-#: location_ui.cc:57 plugin_selector.cc:86 route_time_axis.cc:854
-msgid "Hide"
-msgstr "隐藏"
-
-#: automation_time_axis.cc:545
-msgid "Clear"
-msgstr "清除"
-
-#: automation_time_axis.cc:576
-msgid "State"
-msgstr "状态"
-
-#: automation_time_axis.cc:592
-msgid "Discrete"
-msgstr "离散"
-
-#: automation_time_axis.cc:598 export_format_dialog.cc:485
-msgid "Linear"
-msgstr "线性"
-
-#: automation_time_axis.cc:604 rhythm_ferret.cc:109 shuttle_control.cc:197
-msgid "Mode"
-msgstr "模式"
-
-#: bundle_manager.cc:182
-msgid "Disassociate"
-msgstr "分隔"
-
-#: bundle_manager.cc:186
-msgid "Edit Bundle"
-msgstr "编辑包裹"
-
-#: bundle_manager.cc:201
-msgid "Direction:"
-msgstr "方向:"
-
-#: bundle_manager.cc:206 bundle_manager.cc:210 engine_dialog.cc:662
-#: mixer_strip.cc:162 mixer_strip.cc:367 mixer_strip.cc:2240
-#: rc_option_editor.cc:2326
-msgid "Input"
-msgstr "输入"
-
-#: bundle_manager.cc:207 bundle_manager.cc:212 bundle_manager.cc:246
-#: engine_dialog.cc:664 mixer_strip.cc:166 mixer_strip.cc:371 mixer_strip.cc:2243
-#: rc_option_editor.cc:2330
-msgid "Output"
-msgstr "输出"
-
-#: bundle_manager.cc:265 editor.cc:1945 editor_actions.cc:94 editor_actions.cc:104
-#: rc_option_editor.cc:1087 rc_option_editor.cc:1094
-msgid "Edit"
-msgstr "编辑"
-
-#: bundle_manager.cc:266 editor.cc:5902 editor.cc:5930 editor_actions.cc:338
-#: editor_actions.cc:339 editor_actions.cc:405 plugin_ui.cc:420
-#: processor_box.cc:2458 route_time_axis.cc:859
-msgid "Delete"
-msgstr "删除"
-
-#: bundle_manager.cc:272 bundle_manager.cc:439 editor_route_groups.cc:97
-#: editor_routes.cc:206 midi_list_editor.cc:107 session_metadata_dialog.cc:646
-msgid "Name"
-msgstr "名称"
-
-#: bundle_manager.cc:283
-msgid "New"
-msgstr "新建"
-
-#: bundle_manager.cc:333
-msgid "Bundle"
-msgstr "包裹"
-
-#: bundle_manager.cc:418
-msgid "Add Channel"
-msgstr "添加声道"
-
-#: bundle_manager.cc:425
-msgid "Rename Channel"
-msgstr "重命名声道"
-
-#: configinfo.cc:28
-msgid "Build Configuration"
-msgstr "创建配置"
-
-#: control_point_dialog.cc:33
-msgid "Control point"
-msgstr "控制点"
-
-#: control_point_dialog.cc:45
-msgid "Value"
-msgstr "值"
-
-#: edit_note_dialog.cc:42
-msgid "Note"
-msgstr "音符"
-
-#: edit_note_dialog.cc:45
-msgid "Set selected notes to this channel"
-msgstr "设置已选中的音符为本声道"
-
-#: edit_note_dialog.cc:46
-msgid "Set selected notes to this pitch"
-msgstr "设置已选中的音符为本音高"
-
-#: edit_note_dialog.cc:47
-msgid "Set selected notes to this velocity"
-msgstr "设置已选中的音符为本力度"
-
-#: edit_note_dialog.cc:49
-msgid "Set selected notes to this time"
-msgstr "设置已选中的音符为本时间"
-
-#: edit_note_dialog.cc:51
-msgid "Set selected notes to this length"
-msgstr "设置已选中的音符为本长度"
-
-#: edit_note_dialog.cc:58 midi_list_editor.cc:105 patch_change_dialog.cc:90
-#: step_entry.cc:394
-msgid "Channel"
-msgstr "音轨"
-
-#: edit_note_dialog.cc:68
-msgid "Pitch"
-msgstr "音高"
-
-#: edit_note_dialog.cc:78 step_entry.cc:408
-msgid "Velocity"
-msgstr "力度"
-
-#: edit_note_dialog.cc:88 patch_change_dialog.cc:66
-msgid "Time"
-msgstr "时间"
-
-#: edit_note_dialog.cc:98 editor_regions.cc:115 export_timespan_selector.cc:378
-#: export_timespan_selector.cc:440 location_ui.cc:320 midi_list_editor.cc:115
-#: time_info_box.cc:108
-msgid "Length"
-msgstr "长度"
-
-#: edit_note_dialog.cc:165
-msgid "edit note"
-msgstr "编辑音符"
-
-#: editor.cc:147
-msgid "CD Frames"
-msgstr "CD 框架"
-
-#: editor.cc:148
-msgid "TC Frames"
-msgstr "TC 框架"
-
-#: editor.cc:149
-msgid "TC Seconds"
-msgstr "TC 秒"
-
-#: editor.cc:150
-msgid "TC Minutes"
-msgstr "TC 分"
-
-#: editor.cc:151
-msgid "Seconds"
-msgstr "秒"
-
-#: editor.cc:152
-msgid "Minutes"
-msgstr "分"
-
-#: editor.cc:153 quantize_dialog.cc:37 quantize_dialog.cc:141
-msgid "Beats/128"
-msgstr "128拍"
-
-#: editor.cc:154 quantize_dialog.cc:38 quantize_dialog.cc:143
-msgid "Beats/64"
-msgstr "64拍"
-
-#: editor.cc:155 quantize_dialog.cc:39 quantize_dialog.cc:145
-msgid "Beats/32"
-msgstr "32拍"
-
-#: editor.cc:156
-msgid "Beats/28"
-msgstr "28拍"
-
-#: editor.cc:157
-msgid "Beats/24"
-msgstr "24拍"
-
-#: editor.cc:158
-msgid "Beats/20"
-msgstr "20拍"
-
-#: editor.cc:159 quantize_dialog.cc:40 quantize_dialog.cc:147
-msgid "Beats/16"
-msgstr "16拍"
-
-#: editor.cc:160
-msgid "Beats/14"
-msgstr "14拍"
-
-#: editor.cc:161
-msgid "Beats/12"
-msgstr "12拍"
-
-#: editor.cc:162
-msgid "Beats/10"
-msgstr "10拍"
-
-#: editor.cc:163 quantize_dialog.cc:41 quantize_dialog.cc:149
-msgid "Beats/8"
-msgstr "8拍"
-
-#: editor.cc:164
-msgid "Beats/7"
-msgstr "7拍"
-
-#: editor.cc:165
-msgid "Beats/6"
-msgstr "6拍"
-
-#: editor.cc:166
-msgid "Beats/5"
-msgstr "5拍"
-
-#: editor.cc:167 quantize_dialog.cc:42 quantize_dialog.cc:151
-msgid "Beats/4"
-msgstr "4拍"
-
-#: editor.cc:168 quantize_dialog.cc:43 quantize_dialog.cc:153
-msgid "Beats/3"
-msgstr "3拍"
-
-#: editor.cc:169 quantize_dialog.cc:44 quantize_dialog.cc:155
-msgid "Beats/2"
-msgstr "2拍"
-
-#: editor.cc:170 quantize_dialog.cc:45 quantize_dialog.cc:157
-msgid "Beats"
-msgstr "1拍"
-
-#: editor.cc:171
-msgid "Bars"
-msgstr "小节"
-
-#: editor.cc:172
-msgid "Marks"
-msgstr "标记"
-
-#: editor.cc:173
-msgid "Region starts"
-msgstr "区域开始"
-
-#: editor.cc:174
-msgid "Region ends"
-msgstr "区域结束"
-
-#: editor.cc:175
-msgid "Region syncs"
-msgstr "区域同步"
-
-#: editor.cc:176
-msgid "Region bounds"
-msgstr "区域边界"
-
-#: editor.cc:181 editor_actions.cc:510
-msgid "No Grid"
-msgstr "无网格"
-
-#: editor.cc:182 editor_actions.cc:511
-msgid "Grid"
-msgstr "网格"
-
-#: editor.cc:183 editor_actions.cc:512
-msgid "Magnetic"
-msgstr "磁性吸附"
-
-#: editor.cc:188 editor.cc:206 editor_actions.cc:121 editor_actions.cc:493
-msgid "Playhead"
-msgstr "指针"
-
-#: editor.cc:189 editor_actions.cc:495
-msgid "Marker"
-msgstr "标记"
-
-#: editor.cc:190 editor.cc:207 editor_actions.cc:494
-msgid "Mouse"
-msgstr "é¼ æ ‡"
-
-#: editor.cc:195 editor_actions.cc:502
-msgid "Slide"
-msgstr "滑行"
-
-#: editor.cc:196
-msgid "Splice"
-msgstr "拼接"
-
-#: editor.cc:197 editor_actions.cc:501
-msgid "Ripple"
-msgstr "波纹"
-
-#: editor.cc:198 editor_actions.cc:157 editor_actions.cc:503 editor_actions.cc:1789
-#: editor_markers.cc:905 editor_rulers.cc:260 location_ui.cc:58 mixer_strip.cc:195
-#: mixer_strip.cc:2028
-msgid "Lock"
-msgstr "锁定"
-
-#: editor.cc:203 mono_panner_editor.cc:42
-msgid "Left"
-msgstr "å·¦"
-
-#: editor.cc:204 mono_panner_editor.cc:47
-msgid "Right"
-msgstr "右"
-
-#: editor.cc:205
-msgid "Center"
-msgstr "中"
-
-#: editor.cc:208 editor.cc:3231
-msgid "Edit point"
-msgstr "编辑点"
-
-#: editor.cc:214
-msgid "Mushy"
-msgstr "模糊"
-
-#: editor.cc:215
-msgid "Smooth"
-msgstr "平滑"
-
-#: editor.cc:216
-msgid "Balanced multitimbral mixture"
-msgstr "平衡的多重音色混响乐"
-
-#: editor.cc:217
-msgid "Unpitched percussion with stable notes"
-msgstr "带有稳定音符的未定音高打击乐"
-
-#: editor.cc:218
-msgid "Crisp monophonic instrumental"
-msgstr "欢快的单声调乐器"
-
-#: editor.cc:219
-msgid "Unpitched solo percussion"
-msgstr "未定音高的独奏打击乐"
-
-#: editor.cc:220
-msgid "Resample without preserving pitch"
-msgstr "不保持音高的重新采样"
-
-#: editor.cc:256
-msgid "Mins:Secs"
-msgstr "分:秒"
-
-#: editor.cc:262
-msgid "Location Markers"
-msgstr "位置标记"
-
-#: editor.cc:263
-msgid "Range Markers"
-msgstr "范围标记"
-
-#: editor.cc:264
-msgid "Loop/Punch Ranges"
-msgstr "循环 / 切换范围"
-
-#: editor.cc:265 editor_actions.cc:565
-msgid "CD Markers"
-msgstr "CD标记"
-
-#: editor.cc:266
-msgid "Video Timeline"
-msgstr "视频时间线"
-
-#: editor.cc:283
-msgid "mode"
-msgstr "模式"
-
-#: editor.cc:459 editor_actions.cc:114 editor_actions.cc:564
-msgid "Markers"
-msgstr "标记"
-
-#: editor.cc:577 rc_option_editor.cc:1939
-msgid "Regions"
-msgstr "区域"
-
-#: editor.cc:578
-msgid "Tracks & Busses"
-msgstr "音轨 & 总线"
-
-#: editor.cc:579
-msgid "Snapshots"
-msgstr "å¿«ç…§"
-
-#: editor.cc:580
-msgid "Track & Bus Groups"
-msgstr "音轨 & 总线分组"
-
-#: editor.cc:581
-msgid "Ranges & Marks"
-msgstr "范围 & 标记"
-
-#: editor.cc:728 editor.cc:5754 rc_option_editor.cc:1619 rc_option_editor.cc:1627
-#: rc_option_editor.cc:1635 rc_option_editor.cc:1643 rc_option_editor.cc:1667
-#: rc_option_editor.cc:1679 rc_option_editor.cc:1681 rc_option_editor.cc:1689
-#: rc_option_editor.cc:1697 rc_option_editor.cc:1717 rc_option_editor.cc:1729
-#: rc_option_editor.cc:1731 rc_option_editor.cc:1733 rc_option_editor.cc:1741
-#: rc_option_editor.cc:1749 rc_option_editor.cc:1757 rc_option_editor.cc:1772
-#: rc_option_editor.cc:1776 rc_option_editor.cc:1800
-msgid "Editor"
-msgstr "编辑器"
-
-#: editor.cc:1331 editor.cc:4735 editor_actions.cc:134 editor_actions.cc:1865
-msgid "Loop"
-msgstr "循环"
-
-#: editor.cc:1337 editor.cc:4762 editor_actions.cc:135 time_info_box.cc:68
-msgid "Punch"
-msgstr "切换"
-
-#: editor.cc:1449 rc_option_editor.cc:1661
-msgid "Linear (for highly correlated material)"
-msgstr "线性(高度相关的材料)"
-
-#: editor.cc:1459 rc_option_editor.cc:1662
-msgid "Constant power"
-msgstr "恒定功率"
-
-#: editor.cc:1468 rc_option_editor.cc:1663
-msgid "Symmetric"
-msgstr "对称"
-
-#: editor.cc:1478 rc_option_editor.cc:1664
-msgid "Slow"
-msgstr "æ…¢"
-
-#: editor.cc:1487 rc_option_editor.cc:1665 sfdb_ui.cc:1771 sfdb_ui.cc:1881
-msgid "Fast"
-msgstr "å¿«"
-
-#: editor.cc:1509 editor.cc:1534
-msgid "Deactivate"
-msgstr "取消激活"
-
-#: editor.cc:1511 editor.cc:1536
-msgid "Activate"
-msgstr "激活"
-
-#: editor.cc:1637 editor.cc:1645 editor_ops.cc:3824
-msgid "Freeze"
-msgstr "冻结"
-
-#: editor.cc:1641
-msgid "Unfreeze"
-msgstr "取消冻结"
-
-#: editor.cc:1780
-msgid "Selected Regions"
-msgstr "已选择的区域"
-
-#: editor.cc:1816 editor_markers.cc:940
-msgid "Play Range"
-msgstr "播放范围"
-
-#: editor.cc:1817 editor_markers.cc:943
-msgid "Loop Range"
-msgstr "循环范围"
-
-#: editor.cc:1820 editor_markers.cc:950
-msgid "Zoom to Range"
-msgstr "缩放至整个范围"
-
-#: editor.cc:1829 editor_actions.cc:369
-msgid "Move Range Start to Previous Region Boundary"
-msgstr "移动范围起点到上一个区域边界"
-
-#: editor.cc:1836 editor_actions.cc:376
-msgid "Move Range Start to Next Region Boundary"
-msgstr "移动范围起点到下一个区域边界"
-
-#: editor.cc:1843 editor_actions.cc:383
-msgid "Move Range End to Previous Region Boundary"
-msgstr "移动范围终点到上一个区域边界"
-
-#: editor.cc:1850 editor_actions.cc:390
-msgid "Move Range End to Next Region Boundary"
-msgstr "移动范围终点到下一个区域边界"
-
-#: editor.cc:1856 editor_actions.cc:133 editor_actions.cc:325
-msgid "Separate"
-msgstr "分离"
-
-#: editor.cc:1857
-msgid "Convert to Region in Region List"
-msgstr "在区域列表转换至区域"
-
-#: editor.cc:1860 editor_markers.cc:970
-msgid "Select All in Range"
-msgstr "在范围内全选"
-
-#: editor.cc:1863 editor_actions.cc:297
-msgid "Set Loop from Selection"
-msgstr "从已选择部分设置循环"
-
-#: editor.cc:1864 editor_actions.cc:298
-msgid "Set Punch from Selection"
-msgstr "从已选择部分设置切换"
-
-#: editor.cc:1865 editor_actions.cc:299
-msgid "Set Session Start/End from Selection"
-msgstr "从已选择部分设置会话起点/终点"
-
-#: editor.cc:1868
-msgid "Add Range Markers"
-msgstr "添加范围标记"
-
-#: editor.cc:1871
-msgid "Crop Region to Range"
-msgstr "裁剪区域到范围"
-
-#: editor.cc:1872
-msgid "Fill Range with Region"
-msgstr "用区域填充范围"
-
-#: editor.cc:1873 editor_actions.cc:311
-msgid "Duplicate Range"
-msgstr "复制范围"
-
-#: editor.cc:1876
-msgid "Consolidate Range"
-msgstr "合并范围"
-
-#: editor.cc:1877
-msgid "Consolidate Range With Processing"
-msgstr "合并范围并处理"
-
-#: editor.cc:1878
-msgid "Bounce Range to Region List"
-msgstr "欢跳弹奏范围到区域列表"
-
-#: editor.cc:1879
-msgid "Bounce Range to Region List With Processing"
-msgstr "欢跳弹奏范围到区域列表并处理"
-
-#: editor.cc:1880 editor_markers.cc:953
-msgid "Export Range..."
-msgstr "导出范围…"
-
-#: editor.cc:1882
-msgid "Export Video Range..."
-msgstr "导出视频范围…"
-
-#: editor.cc:1898 editor.cc:1979 editor_actions.cc:303
-msgid "Play From Edit Point"
-msgstr "从编辑点播放"
-
-#: editor.cc:1899 editor.cc:1980
-msgid "Play From Start"
-msgstr "从起点播放"
-
-#: editor.cc:1900
-msgid "Play Region"
-msgstr "播放区域"
-
-#: editor.cc:1902
-msgid "Loop Region"
-msgstr "循环区域"
-
-#: editor.cc:1912 editor.cc:1989
-msgid "Select All in Track"
-msgstr "在音轨上全选所有"
-
-#: editor.cc:1913 editor.cc:1990 editor_actions.cc:194
-msgid "Select All Objects"
-msgstr "全选所有对象物体"
-
-#: editor.cc:1914 editor.cc:1991
-msgid "Invert Selection in Track"
-msgstr "在音轨反选"
-
-#: editor.cc:1915 editor.cc:1992 editor_actions.cc:197
-msgid "Invert Selection"
-msgstr "反选"
-
-#: editor.cc:1917
-msgid "Set Range to Loop Range"
-msgstr "设置范围到循环范围"
-
-#: editor.cc:1918
-msgid "Set Range to Punch Range"
-msgstr "设置范围到切换区间"
-
-#: editor.cc:1920 editor.cc:1994 editor_actions.cc:199 editor_actions.cc:200
-msgid "Select All After Edit Point"
-msgstr "全选编辑点后所有"
-
-#: editor.cc:1921 editor.cc:1995 editor_actions.cc:201 editor_actions.cc:202
-msgid "Select All Before Edit Point"
-msgstr "全选编辑前所有"
-
-#: editor.cc:1922 editor.cc:1996
-msgid "Select All After Playhead"
-msgstr "全选指针后所有"
-
-#: editor.cc:1923 editor.cc:1997
-msgid "Select All Before Playhead"
-msgstr "全选指针前所有"
-
-#: editor.cc:1924
-msgid "Select All Between Playhead and Edit Point"
-msgstr "全选指针和编辑点之间所有"
-
-#: editor.cc:1925
-msgid "Select All Within Playhead and Edit Point"
-msgstr "全选指针和编辑点内部所有"
-
-#: editor.cc:1926
-msgid "Select Range Between Playhead and Edit Point"
-msgstr "选择指针和编辑点之间范围"
-
-#: editor.cc:1928 editor.cc:1999 editor_actions.cc:131 editor_actions.cc:132
-msgid "Select"
-msgstr "选择"
-
-#: editor.cc:1936 editor.cc:2007 editor_actions.cc:337 processor_box.cc:2451
-msgid "Cut"
-msgstr "剪切"
-
-#: editor.cc:1937 editor.cc:2008 editor_actions.cc:341 processor_box.cc:2454
-msgid "Copy"
-msgstr "复制"
-
-#: editor.cc:1938 editor.cc:2009 editor_actions.cc:342 processor_box.cc:2462
-msgid "Paste"
-msgstr "粘贴"
-
-#: editor.cc:1942 editor_actions.cc:91
-msgid "Align"
-msgstr "对齐"
-
-#: editor.cc:1943
-msgid "Align Relative"
-msgstr "对齐相关"
-
-#: editor.cc:1950
-msgid "Insert Selected Region"
-msgstr "插入已选择的区域"
-
-#: editor.cc:1951
-msgid "Insert Existing Media"
-msgstr "插入已存在的媒体"
-
-#: editor.cc:1960 editor.cc:2016
-msgid "Nudge Entire Track Later"
-msgstr "向后微调整个音轨"
-
-#: editor.cc:1961 editor.cc:2017
-msgid "Nudge Track After Edit Point Later"
-msgstr "向后微调编辑点以后的音轨"
-
-#: editor.cc:1962 editor.cc:2018
-msgid "Nudge Entire Track Earlier"
-msgstr "向前微调整个音轨"
-
-#: editor.cc:1963 editor.cc:2019
-msgid "Nudge Track After Edit Point Earlier"
-msgstr "向前微调编辑点以后的音轨"
-
-#: editor.cc:1965 editor.cc:2021
-msgid "Nudge"
-msgstr "微调"
-
-#: editor.cc:2235
-msgid "Playhead position stored with a negative value - ignored (use zero instead)"
-msgstr "指针位置存储为一个负值——忽略(用零代替)"
-
-#: editor.cc:3006 editor.cc:3707 editor.cc:3778 midi_channel_selector.cc:157
-#: midi_channel_selector.cc:395 midi_channel_selector.cc:431
-msgid "All"
-msgstr "所有"
-
-#: editor.cc:3210
-msgid "Smart Mode (add Range functions to Grab mode)"
-msgstr "智能模式(添加范围功能到抓取模式)"
-
-#: editor.cc:3211
-msgid "Grab Mode (select/move objects)"
-msgstr "抓取模式(选择/移动对象物体)"
-
-#: editor.cc:3212
-msgid "Cut Mode (split regions)"
-msgstr "切割模式(拆分区域)"
-
-#: editor.cc:3213
-msgid "Range Mode (select time ranges)"
-msgstr "范围模式(选择时间范围)"
-
-#: editor.cc:3214
-msgid "Draw Mode (draw and edit gain/notes/automation)"
-msgstr "描绘模式(描绘和编辑增益/音符/自动化)"
-
-#: editor.cc:3215
-msgid "Stretch Mode (time-stretch audio and midi regions, preserving pitch)"
-msgstr "延伸模式(时间延伸音频和MIDI区域,保持音高)"
-
-#: editor.cc:3216
-msgid "Audition Mode (listen to regions)"
-msgstr "监听模式(试听区域)"
-
-#: editor.cc:3217
-msgid "Internal Edit Mode (edit notes and gain curves inside regions)"
-msgstr "内部编辑模式(在区域内编辑音符和增益曲线)"
-
-#: editor.cc:3218
-msgid ""
-"Groups: click to (de)activate\n"
-"Context-click for other operations"
-msgstr ""
-"分组:点击(不)启用\n"
-"右键点击其它操作"
-
-#: editor.cc:3219
-msgid "Nudge Region/Selection Later"
-msgstr "向后微调区域/已选择部分"
-
-#: editor.cc:3220
-msgid "Nudge Region/Selection Earlier"
-msgstr "向前微调区域/已选择部分"
-
-#: editor.cc:3221 editor_actions.cc:262
-msgid "Zoom In"
-msgstr "放大"
-
-#: editor.cc:3222 editor_actions.cc:261
-msgid "Zoom Out"
-msgstr "缩小"
-
-#: editor.cc:3223
-msgid "Zoom to Time Scale"
-msgstr "缩放至时间比例"
-
-#: editor.cc:3224 editor.cc:3729 editor_actions.cc:263
-msgid "Zoom to Session"
-msgstr "缩放至整个会话"
-
-#: editor.cc:3225
-msgid "Zoom focus"
-msgstr "缩放焦点"
-
-#: editor.cc:3226
-msgid "Expand Tracks"
-msgstr "扩展音轨"
-
-#: editor.cc:3227
-msgid "Shrink Tracks"
-msgstr "收缩音轨"
-
-#: editor.cc:3228
-msgid "Number of visible tracks"
-msgstr "可见音轨数量"
-
-#: editor.cc:3229
-msgid "Snap/Grid Units"
-msgstr "吸附/网格单位"
-
-#: editor.cc:3230
-msgid "Snap/Grid Mode"
-msgstr "吸附/网格模式"
-
-#: editor.cc:3232
-msgid "Edit Mode"
-msgstr "编辑模式"
-
-#: editor.cc:3233
-msgid ""
-"Nudge Clock\n"
-"(controls distance used to nudge regions and selections)"
-msgstr ""
-"微调计时器\n"
-"(使用微调区域和已选择部分来控制距离)"
-
-#: editor.cc:3501 editor_actions.cc:313
-msgid "Command|Undo"
-msgstr "命令|撤销"
-
-#: editor.cc:3503
-msgid "Command|Undo (%1)"
-msgstr "命令|撤销(%1)"
-
-#: editor.cc:3510 editor_actions.cc:315 editor_actions.cc:316 editor_actions.cc:317
-msgid "Redo"
-msgstr "重做"
-
-#: editor.cc:3512
-msgid "Redo (%1)"
-msgstr "重做(%1)"
-
-#: editor.cc:3531 editor.cc:3555 editor_actions.cc:110 editor_actions.cc:1846
-msgid "Duplicate"
-msgstr "复制"
-
-#: editor.cc:3532
-msgid "Number of duplications:"
-msgstr "复制数量:"
-
-#: editor.cc:3706 route_group_dialog.cc:51 time_info_box.cc:67
-msgid "Selection"
-msgstr "已选择部分"
-
-#: editor.cc:3709
-msgid "Fit 1 track"
-msgstr "匹配音轨"
-
-#: editor.cc:3710
-msgid "Fit 2 tracks"
-msgstr "匹配2音轨"
-
-#: editor.cc:3711
-msgid "Fit 4 tracks"
-msgstr "匹配4音轨"
-
-#: editor.cc:3712
-msgid "Fit 8 tracks"
-msgstr "匹配8音轨"
-
-#: editor.cc:3713
-msgid "Fit 16 tracks"
-msgstr "匹配16音轨"
-
-#: editor.cc:3714
-msgid "Fit 24 tracks"
-msgstr "匹配24音轨"
-
-#: editor.cc:3715
-msgid "Fit 32 tracks"
-msgstr "匹配32音轨"
-
-#: editor.cc:3716
-msgid "Fit 48 tracks"
-msgstr "匹配48音轨"
-
-#: editor.cc:3717
-msgid "Fit All tracks"
-msgstr "匹配所有音轨"
-
-#: editor.cc:3718
-msgid "Fit Selection"
-msgstr "匹配已选择部分"
-
-#: editor.cc:3720
-msgid "Zoom to 10 ms"
-msgstr "缩放至 10 毫秒"
-
-#: editor.cc:3721
-msgid "Zoom to 100 ms"
-msgstr "缩放至 100 毫秒"
-
-#: editor.cc:3722
-msgid "Zoom to 1 sec"
-msgstr "缩放至 1 秒"
-
-#: editor.cc:3723
-msgid "Zoom to 10 sec"
-msgstr "缩放至 10 秒"
-
-#: editor.cc:3724
-msgid "Zoom to 1 min"
-msgstr "缩放至 1 分钟"
-
-#: editor.cc:3725
-msgid "Zoom to 10 min"
-msgstr "缩放至 10 分钟"
-
-#: editor.cc:3726
-msgid "Zoom to 1 hour"
-msgstr "缩放至 1 小时"
-
-#: editor.cc:3727
-msgid "Zoom to 8 hours"
-msgstr "缩放至 8 小时"
-
-#: editor.cc:3728
-msgid "Zoom to 24 hours"
-msgstr "缩放至 24 小时"
-
-#: editor.cc:3730
-msgid "Zoom to Range/Region Selection"
-msgstr "缩放至范围/区域已选择部分"
-
-#: editor.cc:3800
-msgid "*"
-msgstr ""
-
-#: editor.cc:4120
-msgid "Playlist Deletion"
-msgstr "播放列表删除部分"
-
-#: editor.cc:4121
-msgid ""
-"Playlist %1 is currently unused.\n"
-"If it is kept, its audio files will not be cleaned.\n"
-"If it is deleted, audio files used by it alone will be cleaned."
-msgstr ""
-"播放列表 %1 当前未被使用。\n"
-"如果保留它,它的音频文件将不会被清除。\n"
-"如果删除它,它单独使用过的音频文件将会被清除。"
-
-#: editor.cc:4131
-msgid "Delete Playlist"
-msgstr "删除播放列表"
-
-#: editor.cc:4132
-msgid "Keep Playlist"
-msgstr "保留播放列表"
-
-#: editor.cc:4133 editor_audio_import.cc:594 editor_ops.cc:6174
-#: engine_dialog.cc:2083 sfdb_freesound_mootcher.cc:69 processor_box.cc:2219
-#: processor_box.cc:2244
-msgid "Cancel"
-msgstr "取消"
-
-#: editor.cc:4275
-msgid "new playlists"
-msgstr "新建播放列表"
-
-#: editor.cc:4291
-msgid "copy playlists"
-msgstr "复制播放列表"
-
-#: editor.cc:4306
-msgid "clear playlists"
-msgstr "清除播放列表"
-
-#: editor.cc:5046
-msgid "Please wait while %1 loads visual data."
-msgstr "请等候 %1 载入可见数据。"
-
-#: editor.cc:5901 editor.cc:5932 editor_markers.cc:985 panner_ui.cc:410
-#: processor_box.cc:2482
-msgid "Edit..."
-msgstr "编辑…"
-
-#: editor.cc:5934 editor_actions.cc:1941
-msgid "Legatize"
-msgstr " 合法化"
-
-#: editor.cc:5936 editor_actions.cc:1940
-msgid "Quantize..."
-msgstr "量化…"
-
-#: editor.cc:5938 editor_actions.cc:1943
-msgid "Remove Overlap"
-msgstr "移除重叠"
-
-#: editor.cc:5940 editor_actions.cc:1942
-msgid "Transform..."
-msgstr "变换…"
-
-#: editor_actions.cc:92
-msgid "Autoconnect"
-msgstr "自动连接"
-
-#: editor_actions.cc:93
-msgid "Crossfades"
-msgstr "淡入淡出(交叉淡化)"
-
-#: editor_actions.cc:95
-msgid "Move Selected Marker"
-msgstr "移动已选择的标记"
-
-#: editor_actions.cc:96
-msgid "Select Range Operations"
-msgstr "选择范围操作"
-
-#: editor_actions.cc:97
-msgid "Select Regions"
-msgstr "选择区域"
-
-#: editor_actions.cc:98
-msgid "Edit Point"
-msgstr "编辑点"
-
-#: editor_actions.cc:99
-msgid "Fade"
-msgstr "淡化"
-
-#: editor_actions.cc:100
-msgid "Latch"
-msgstr "短锁"
-
-#: editor_actions.cc:101 editor_regions.cc:112 region_editor.cc:46
-msgid "Region"
-msgstr "区域"
-
-#: editor_actions.cc:102
-msgid "Layering"
-msgstr "分层"
-
-#: editor_actions.cc:103 editor_regions.cc:113 stereo_panner_editor.cc:44
-msgid "Position"
-msgstr "位置"
-
-#: editor_actions.cc:105 gain_meter.cc:156 gain_meter.cc:825 panner_ui.cc:178
-#: panner_ui.cc:635
-msgid "Trim"
-msgstr "修剪"
-
-#: editor_actions.cc:106 editor_actions.cc:126 route_group_dialog.cc:46
-msgid "Gain"
-msgstr "增益"
-
-#: editor_actions.cc:107 editor_actions.cc:563
-msgid "Ranges"
-msgstr "范围"
-
-#: editor_actions.cc:108 editor_actions.cc:1842 session_option_editor.cc:135
-#: session_option_editor.cc:144 session_option_editor.cc:151
-msgid "Fades"
-msgstr "淡化"
-
-#: editor_actions.cc:111
-msgid "Link"
-msgstr "链接"
-
-#: editor_actions.cc:112 editor_actions.cc:145
-msgid "Zoom Focus"
-msgstr "缩放焦点"
-
-#: editor_actions.cc:113
-msgid "Locate to Markers"
-msgstr "定位到标记"
-
-#: editor_actions.cc:115
-msgid "Meter falloff"
-msgstr "节拍衰减"
-
-#: editor_actions.cc:116
-msgid "Meter hold"
-msgstr "节拍保持"
-
-#: editor_actions.cc:117 session_option_editor.cc:321
-msgid "MIDI Options"
-msgstr "MIDI选项"
-
-#: editor_actions.cc:118
-msgid "Misc Options"
-msgstr "其它选项"
-
-#: editor_actions.cc:119 rc_option_editor.cc:1809 route_group_dialog.cc:54
-#: session_option_editor.cc:243 session_option_editor.cc:250
-msgid "Monitoring"
-msgstr "监控中"
-
-#: editor_actions.cc:120
-msgid "Active Mark"
-msgstr "启用标记"
-
-#: editor_actions.cc:123
-msgid "Primary Clock"
-msgstr "主计时器"
-
-#: editor_actions.cc:124
-msgid "Pullup / Pulldown"
-msgstr "向上拖动/向下拖动"
-
-#: editor_actions.cc:125
-msgid "Region operations"
-msgstr "区域操作"
-
-#: editor_actions.cc:127 ruler_dialog.cc:28
-msgid "Rulers"
-msgstr "标尺"
-
-#: editor_actions.cc:128
-msgid "Views"
-msgstr "视图"
-
-#: editor_actions.cc:129
-msgid "Scroll"
-msgstr "滚动"
-
-#: editor_actions.cc:130
-msgid "Secondary Clock"
-msgstr "第二计时器"
-
-#: editor_actions.cc:137
-msgid "Subframes"
-msgstr "子框架"
-
-#: editor_actions.cc:140
-msgid "Timecode fps"
-msgstr "时间码FPS"
-
-#: editor_actions.cc:141 route_time_axis.cc:575
-msgid "Height"
-msgstr "高度"
-
-#: editor_actions.cc:143
-msgid "Tools"
-msgstr "工具"
-
-#: editor_actions.cc:144
-msgid "View"
-msgstr "视图"
-
-#: editor_actions.cc:146
-msgid "Zoom"
-msgstr "缩放"
-
-#: editor_actions.cc:152
-msgid "Break drag or deselect all"
-msgstr "终止拖拽或取消选择所有"
-
-#: editor_actions.cc:159
-msgid "Show Editor Mixer"
-msgstr "显示编辑器混音器"
-
-#: editor_actions.cc:160
-msgid "Show Editor List"
-msgstr "显示编辑器列表"
-
-#: editor_actions.cc:162
-msgid "Playhead to Next Region Boundary"
-msgstr "指针到下一个区域边界"
-
-#: editor_actions.cc:163
-msgid "Playhead to Next Region Boundary (No Track Selection)"
-msgstr "指针到下一个区域边界(无音轨已选择部分)"
-
-#: editor_actions.cc:164
-msgid "Playhead to Previous Region Boundary"
-msgstr "指针到上一个区域边界"
-
-#: editor_actions.cc:165
-msgid "Playhead to Previous Region Boundary (No Track Selection)"
-msgstr "指针到上一个区域边界(无音轨已选择部分)"
-
-#: editor_actions.cc:167
-msgid "Playhead to Next Region Start"
-msgstr "指针到下一个区域起点"
-
-#: editor_actions.cc:168
-msgid "Playhead to Next Region End"
-msgstr "指针到下一个区域终点"
-
-#: editor_actions.cc:169
-msgid "Playhead to Next Region Sync"
-msgstr "播放头到下一个区域同步"
-
-#: editor_actions.cc:171
-msgid "Playhead to Previous Region Start"
-msgstr "指针到上一个区域起点"
-
-#: editor_actions.cc:172
-msgid "Playhead to Previous Region End"
-msgstr "指针到上一个区域终点"
-
-#: editor_actions.cc:173
-msgid "Playhead to Previous Region Sync"
-msgstr "指针到下一个区域同步"
-
-#: editor_actions.cc:175
-msgid "To Next Region Boundary"
-msgstr "到下一个区域边界"
-
-#: editor_actions.cc:176
-msgid "To Next Region Boundary (No Track Selection)"
-msgstr "到下一个区域边界(无音轨已选择部分)"
-
-#: editor_actions.cc:177
-msgid "To Previous Region Boundary"
-msgstr "到上一个区域边界"
-
-#: editor_actions.cc:178
-msgid "To Previous Region Boundary (No Track Selection)"
-msgstr "到上一个区域边界(无音轨已选择部分)"
-
-#: editor_actions.cc:180
-msgid "To Next Region Start"
-msgstr "到下一个区域起点"
-
-#: editor_actions.cc:181
-msgid "To Next Region End"
-msgstr "到下一个区域终点"
-
-#: editor_actions.cc:182
-msgid "To Next Region Sync"
-msgstr "到下一个区域同步"
-
-#: editor_actions.cc:184
-msgid "To Previous Region Start"
-msgstr "到上一个区域起点"
-
-#: editor_actions.cc:185
-msgid "To Previous Region End"
-msgstr "到上一个区域终点"
-
-#: editor_actions.cc:186
-msgid "To Previous Region Sync"
-msgstr "到上一个区域同步"
-
-#: editor_actions.cc:188
-msgid "To Range Start"
-msgstr "到范围起点"
-
-#: editor_actions.cc:189
-msgid "To Range End"
-msgstr "到范围终点"
-
-#: editor_actions.cc:191
-msgid "Playhead to Range Start"
-msgstr "指针到范围起点"
-
-#: editor_actions.cc:192
-msgid "Playhead to Range End"
-msgstr "指针到范围终点"
-
-#: editor_actions.cc:195
-msgid "Select All Tracks"
-msgstr "选择所有音轨"
-
-#: editor_actions.cc:196 export_timespan_selector.cc:61 processor_box.cc:2468
-msgid "Deselect All"
-msgstr "反选所有"
-
-#: editor_actions.cc:204
-msgid "Select All Overlapping Edit Range"
-msgstr "选择所有重叠的编辑范围"
-
-#: editor_actions.cc:205
-msgid "Select All Inside Edit Range"
-msgstr "选择所有内部的编辑范围"
-
-#: editor_actions.cc:207
-msgid "Select Edit Range"
-msgstr "选择编辑范围"
-
-#: editor_actions.cc:209
-msgid "Select All in Punch Range"
-msgstr "选择所有在切换范围内的"
-
-#: editor_actions.cc:210
-msgid "Select All in Loop Range"
-msgstr "选择所有在循环范围内的"
-
-#: editor_actions.cc:212
-msgid "Select Next Track or Bus"
-msgstr "选择下一个音轨或总线"
-
-#: editor_actions.cc:213
-msgid "Select Previous Track or Bus"
-msgstr "选择上一个音轨或总线"
-
-#: editor_actions.cc:215
-msgid "Toggle Record Enable"
-msgstr "切换录制启用"
-
-#: editor_actions.cc:217
-msgid "Toggle Solo"
-msgstr "切独奏"
-
-#: editor_actions.cc:219
-msgid "Toggle Mute"
-msgstr "切换静音"
-
-#: editor_actions.cc:221
-msgid "Toggle Solo Isolate"
-msgstr "切换独奏隔离"
-
-#: editor_actions.cc:226
-msgid "Save View %1"
-msgstr "保存视图 %1"
-
-#: editor_actions.cc:232
-msgid "Go to View %1"
-msgstr "跳转到视图 %1"
-
-#: editor_actions.cc:238
-msgid "Locate to Mark %1"
-msgstr "定位到标记 %1"
-
-#: editor_actions.cc:242 editor_actions.cc:243
-msgid "Jump to Next Mark"
-msgstr "跳到下一个标记"
-
-#: editor_actions.cc:244 editor_actions.cc:245
-msgid "Jump to Previous Mark"
-msgstr "跳到上一个标记"
-
-#: editor_actions.cc:247 editor_actions.cc:248
-msgid "Add Mark from Playhead"
-msgstr "从指针起添加标记"
-
-#: editor_actions.cc:250 editor_actions.cc:251
-msgid "Remove Mark at Playhead"
-msgstr "移除指针处的标记"
-
-#: editor_actions.cc:253
-msgid "Nudge Next Later"
-msgstr "向后微调下一个"
-
-#: editor_actions.cc:254
-msgid "Nudge Next Earlier"
-msgstr "向前微调下一个"
-
-#: editor_actions.cc:256
-msgid "Nudge Playhead Forward"
-msgstr "微调指针前进"
-
-#: editor_actions.cc:257
-msgid "Nudge Playhead Backward"
-msgstr "微调指针后退"
-
-#: editor_actions.cc:258
-msgid "Playhead To Next Grid"
-msgstr "指针转到下一个网格"
-
-#: editor_actions.cc:259
-msgid "Playhead To Previous Grid"
-msgstr "指针转到上一个网格"
-
-#: editor_actions.cc:264
-msgid "Zoom to Selection"
-msgstr "缩放至已选择部分"
-
-#: editor_actions.cc:265
-msgid "Toggle Zoom State"
-msgstr "切换缩放状态"
-
-#: editor_actions.cc:267
-msgid "Expand Track Height"
-msgstr "扩展音轨高度"
-
-#: editor_actions.cc:268
-msgid "Shrink Track Height"
-msgstr "收缩扩展音轨高度"
-
-#: editor_actions.cc:270
-msgid "Move Selected Tracks Up"
-msgstr "向上移动已选中音轨"
-
-#: editor_actions.cc:272
-msgid "Move Selected Tracks Down"
-msgstr "向下移动已选中音轨"
-
-#: editor_actions.cc:275
-msgid "Scroll Tracks Up"
-msgstr "向上滚动音轨"
-
-#: editor_actions.cc:277
-msgid "Scroll Tracks Down"
-msgstr "向下滚动音轨"
-
-#: editor_actions.cc:279
-msgid "Step Tracks Up"
-msgstr "向上步进音轨"
-
-#: editor_actions.cc:281
-msgid "Step Tracks Down"
-msgstr "向下步进音轨"
-
-#: editor_actions.cc:284
-msgid "Scroll Backward"
-msgstr "向后滚动"
-
-#: editor_actions.cc:285
-msgid "Scroll Forward"
-msgstr "向前滚动"
-
-#: editor_actions.cc:286
-msgid "Center Playhead"
-msgstr "指针置中"
-
-#: editor_actions.cc:287
-msgid "Center Edit Point"
-msgstr "编辑点置中"
-
-#: editor_actions.cc:289
-msgid "Playhead Forward"
-msgstr "指针前进"
-
-#: editor_actions.cc:290
-msgid "Playhead Backward"
-msgstr "指针后退"
-
-#: editor_actions.cc:292
-msgid "Playhead to Active Mark"
-msgstr "指针跳转到激活的标记处"
-
-#: editor_actions.cc:293
-msgid "Active Mark to Playhead"
-msgstr "激活的标记跳转到指针处"
-
-#: editor_actions.cc:295
-msgid "Use Skip Ranges"
-msgstr "使用不连续的范围"
-
-#: editor_actions.cc:302
-msgid "Play Selected Regions"
-msgstr "播放已选中的区域"
-
-#: editor_actions.cc:304
-msgid "Play from Edit Point and Return"
-msgstr "从编辑点播放并返回"
-
-#: editor_actions.cc:306
-msgid "Play Edit Range"
-msgstr "播放编辑范围"
-
-#: editor_actions.cc:308
-msgid "Playhead to Mouse"
-msgstr "指针跳转到鼠标处"
-
-#: editor_actions.cc:309
-msgid "Active Marker to Mouse"
-msgstr "激活的标记跳转到鼠标处"
-
-#: editor_actions.cc:319
-msgid "Undo Selection Change"
-msgstr "撤销已选中部分的改动"
-
-#: editor_actions.cc:320
-msgid "Redo Selection Change"
-msgstr "重做已选中部分的改动"
-
-#: editor_actions.cc:322
-msgid "Export Audio"
-msgstr "导出音频"
-
-#: editor_actions.cc:323 export_dialog.cc:396
-msgid "Export Range"
-msgstr "导出范围"
-
-#: editor_actions.cc:328
-msgid "Separate Using Punch Range"
-msgstr "使用切换范围分离"
-
-#: editor_actions.cc:331
-msgid "Separate Using Loop Range"
-msgstr "使用循环范围分离"
-
-#: editor_actions.cc:334 editor_actions.cc:356
-msgid "Crop"
-msgstr "剪裁"
-
-#: editor_actions.cc:344
-msgid "Fade Range Selection"
-msgstr "淡化范围已选中部分"
-
-#: editor_actions.cc:346
-msgid "Set Tempo from Edit Range = Bar"
-msgstr "从编辑范围设置节奏 = 小节"
-
-#: editor_actions.cc:348
-msgid "Log"
-msgstr "日志"
-
-#: editor_actions.cc:351 editor_actions.cc:353
-msgid "Move to Next Transient"
-msgstr "移动到下一个过渡"
-
-#: editor_actions.cc:352 editor_actions.cc:354
-msgid "Move to Previous Transient"
-msgstr "移动到上一个过渡"
-
-#: editor_actions.cc:358 editor_actions.cc:361
-msgid "Start Range"
-msgstr "开始范围"
-
-#: editor_actions.cc:359 editor_actions.cc:362
-msgid "Finish Range"
-msgstr "结束范围"
-
-#: editor_actions.cc:394
-msgid "Follow Playhead"
-msgstr "跟随指针"
-
-#: editor_actions.cc:395
-msgid "Remove Last Capture"
-msgstr "移除已捕获内容"
-
-#: editor_actions.cc:397
-msgid "Stationary Playhead"
-msgstr "固定指针"
-
-#: editor_actions.cc:399 insert_time_dialog.cc:32
-msgid "Insert Time"
-msgstr "插入时间"
-
-#: editor_actions.cc:402
-msgid "Toggle Active"
-msgstr "切换激活"
-
-#: editor_actions.cc:407 editor_actions.cc:1768 editor_markers.cc:921
-#: editor_markers.cc:986 editor_snapshots.cc:122 mixer_strip.cc:1543
-#: route_time_axis.cc:856
-msgid "Remove"
-msgstr "移除"
-
-#: editor_actions.cc:411
-msgid "Fit Selection (Vertical)"
-msgstr " 匹配已选择部分(垂直)"
-
-#: editor_actions.cc:413 time_axis_view.cc:1371
-msgid "Largest"
-msgstr "最大的"
-
-#: editor_actions.cc:416 time_axis_view.cc:1372
-msgid "Larger"
-msgstr "更大的"
-
-#: editor_actions.cc:419 editor_rulers.cc:249 time_axis_view.cc:1373
-msgid "Large"
-msgstr "大"
-
-#: editor_actions.cc:425 editor_rulers.cc:253 time_axis_view.cc:1375
-msgid "Small"
-msgstr "小"
-
-#: editor_actions.cc:429
-msgid "Sound Selected MIDI Notes"
-msgstr "声音已选择部分MIDI音符"
-
-#: editor_actions.cc:434
-msgid "Zoom Focus Left"
-msgstr "以左侧为焦点缩放"
-
-#: editor_actions.cc:435
-msgid "Zoom Focus Right"
-msgstr "以右侧为焦点缩放"
-
-#: editor_actions.cc:436
-msgid "Zoom Focus Center"
-msgstr "以中央为焦点缩放"
-
-#: editor_actions.cc:437
-msgid "Zoom Focus Playhead"
-msgstr "以指针为焦点缩放"
-
-#: editor_actions.cc:438
-msgid "Zoom Focus Mouse"
-msgstr "以鼠标为焦点缩放"
-
-#: editor_actions.cc:439
-msgid "Zoom Focus Edit Point"
-msgstr "以编辑点为焦点缩放"
-
-#: editor_actions.cc:441
-msgid "Next Zoom Focus"
-msgstr "下一个缩放焦点"
-
-#: editor_actions.cc:447
-msgid "Smart Object Mode"
-msgstr "智能对象物体模式"
-
-#: editor_actions.cc:450
-msgid "Smart"
-msgstr "智能"
-
-#: editor_actions.cc:453
-msgid "Object Tool"
-msgstr "对象物体工具"
-
-#: editor_actions.cc:458
-msgid "Range Tool"
-msgstr "范围工具"
-
-#: editor_actions.cc:463
-msgid "Note Drawing Tool"
-msgstr "音符描绘工具"
-
-#: editor_actions.cc:468
-msgid "Audition Tool"
-msgstr "监听工具"
-
-#: editor_actions.cc:473
-msgid "Time FX Tool"
-msgstr "时间特效工具"
-
-#: editor_actions.cc:478
-msgid "Content Tool"
-msgstr "内容工具"
-
-#: editor_actions.cc:484
-msgid "Cut Tool"
-msgstr " 切割工具"
-
-#: editor_actions.cc:490
-msgid "Step Mouse Mode"
-msgstr "步进鼠标模式"
-
-#: editor_actions.cc:497
-msgid "Change Edit Point"
-msgstr "改变编辑点"
-
-#: editor_actions.cc:498
-msgid "Change Edit Point Including Marker"
-msgstr "改变编辑点包括标记"
-
-#: editor_actions.cc:504
-msgid "Cycle Edit Mode"
-msgstr "循环编辑模式"
-
-#: editor_actions.cc:506
-msgid "Snap to"
-msgstr "吸附到"
-
-#: editor_actions.cc:507
-msgid "Snap Mode"
-msgstr "吸附模式"
-
-#: editor_actions.cc:514
-msgid "Next Snap Mode"
-msgstr "下一个吸附模式"
-
-#: editor_actions.cc:515
-msgid "Next Snap Choice"
-msgstr "下一个吸附选择"
-
-#: editor_actions.cc:516
-msgid "Next Musical Snap Choice"
-msgstr "下一个配乐的吸附选择"
-
-#: editor_actions.cc:517
-msgid "Previous Snap Choice"
-msgstr "上一个吸附选择"
-
-#: editor_actions.cc:518
-msgid "Previous Musical Snap Choice"
-msgstr "上一个配乐的吸附选择"
-
-#: editor_actions.cc:523
-msgid "Snap to CD Frame"
-msgstr "吸附到CD框架"
-
-#: editor_actions.cc:524
-msgid "Snap to Timecode Frame"
-msgstr "吸附到时间码框架"
-
-#: editor_actions.cc:525
-msgid "Snap to Timecode Seconds"
-msgstr "吸附到时间码秒"
-
-#: editor_actions.cc:526
-msgid "Snap to Timecode Minutes"
-msgstr "吸附到时间码分"
-
-#: editor_actions.cc:527
-msgid "Snap to Seconds"
-msgstr "吸附到秒"
-
-#: editor_actions.cc:528
-msgid "Snap to Minutes"
-msgstr "吸附到分"
-
-#: editor_actions.cc:530
-msgid "Snap to One Twenty Eighths"
-msgstr "吸附到一百二十八分之一"
-
-#: editor_actions.cc:531
-msgid "Snap to Sixty Fourths"
-msgstr "吸附到六十四分之一"
-
-#: editor_actions.cc:532
-msgid "Snap to Thirty Seconds"
-msgstr "吸附到三十二分之一"
-
-#: editor_actions.cc:533
-msgid "Snap to Twenty Eighths"
-msgstr "吸附到二十八分之一"
-
-#: editor_actions.cc:534
-msgid "Snap to Twenty Fourths"
-msgstr "吸附到二十四分之一"
-
-#: editor_actions.cc:535
-msgid "Snap to Twentieths"
-msgstr "吸附到二十分之一"
-
-#: editor_actions.cc:536
-msgid "Snap to Sixteenths"
-msgstr "吸附到十六分之一"
-
-#: editor_actions.cc:537
-msgid "Snap to Fourteenths"
-msgstr "吸附到十四分之一"
-
-#: editor_actions.cc:538
-msgid "Snap to Twelfths"
-msgstr "吸附到十二分之一"
-
-#: editor_actions.cc:539
-msgid "Snap to Tenths"
-msgstr "吸附到十分之一"
-
-#: editor_actions.cc:540
-msgid "Snap to Eighths"
-msgstr "吸附到八分之一"
-
-#: editor_actions.cc:541
-msgid "Snap to Sevenths"
-msgstr "吸附到七分之一"
-
-#: editor_actions.cc:542
-msgid "Snap to Sixths"
-msgstr "吸附到六分之一"
-
-#: editor_actions.cc:543
-msgid "Snap to Fifths"
-msgstr "吸附到五分之一"
-
-#: editor_actions.cc:544
-msgid "Snap to Quarters"
-msgstr "吸附到四分之一"
-
-#: editor_actions.cc:545
-msgid "Snap to Thirds"
-msgstr "吸附到三分之一"
-
-#: editor_actions.cc:546
-msgid "Snap to Halves"
-msgstr "吸附到二分之一"
-
-#: editor_actions.cc:548
-msgid "Snap to Beat"
-msgstr "吸附到拍子"
-
-#: editor_actions.cc:549
-msgid "Snap to Bar"
-msgstr "吸附到小节"
-
-#: editor_actions.cc:550
-msgid "Snap to Mark"
-msgstr "吸附到标记"
-
-#: editor_actions.cc:551
-msgid "Snap to Region Start"
-msgstr "吸附到区域起点"
-
-#: editor_actions.cc:552
-msgid "Snap to Region End"
-msgstr "吸附到区域终点"
-
-#: editor_actions.cc:553
-msgid "Snap to Region Sync"
-msgstr "吸附到区域同步"
-
-#: editor_actions.cc:554
-msgid "Snap to Region Boundary"
-msgstr "吸附到区域边界"
-
-#: editor_actions.cc:556
-msgid "Show Marker Lines"
-msgstr "显示标记线条"
-
-#: editor_actions.cc:566
-msgid "Loop/Punch"
-msgstr "循环/切换"
-
-#: editor_actions.cc:570
-msgid "Min:Sec"
-msgstr "分:秒"
-
-#: editor_actions.cc:572 editor_actions.cc:575 editor_rulers.cc:271
-msgid "Video Monitor"
-msgstr "视频监控"
-
-#: editor_actions.cc:574 rc_option_editor.cc:2260
-msgid "Video"
-msgstr "视频"
-
-#: editor_actions.cc:577
-msgid "Always on Top"
-msgstr "总是置顶"
-
-#: editor_actions.cc:579
-msgid "Frame number"
-msgstr "帧号码"
-
-#: editor_actions.cc:580
-msgid "Timecode Background"
-msgstr "时间码背景"
-
-#: editor_actions.cc:581
-msgid "Fullscreen"
-msgstr "全屏"
-
-#: editor_actions.cc:582
-msgid "Letterbox"
-msgstr "宽银幕式"
-
-#: editor_actions.cc:583
-msgid "Original Size"
-msgstr "原始尺寸"
-
-#: editor_actions.cc:640
-msgid "Sort"
-msgstr "排序"
-
-#: editor_actions.cc:651 editor_routes.cc:476 mixer_ui.cc:1196
-msgid "Show All"
-msgstr "显示所有"
-
-#: editor_actions.cc:652
-msgid "Show Automatic Regions"
-msgstr "显示自动的区域"
-
-#: editor_actions.cc:654
-msgid "Ascending"
-msgstr "升序"
-
-#: editor_actions.cc:656
-msgid "Descending"
-msgstr "降序"
-
-#: editor_actions.cc:659
-msgid "By Region Name"
-msgstr "以区域名称"
-
-#: editor_actions.cc:661
-msgid "By Region Length"
-msgstr "以区域长度"
-
-#: editor_actions.cc:663
-msgid "By Region Position"
-msgstr "以区域位置"
-
-#: editor_actions.cc:665
-msgid "By Region Timestamp"
-msgstr "以区域时间戳"
-
-#: editor_actions.cc:667
-msgid "By Region Start in File"
-msgstr "以文件内的区域起点"
-
-#: editor_actions.cc:669
-msgid "By Region End in File"
-msgstr "以文件内的区域终点"
-
-#: editor_actions.cc:671
-msgid "By Source File Name"
-msgstr "以源文件名称"
-
-#: editor_actions.cc:673
-msgid "By Source File Length"
-msgstr "以源文件长度"
-
-#: editor_actions.cc:675
-msgid "By Source File Creation Date"
-msgstr "以源文件创建日期"
-
-#: editor_actions.cc:677
-msgid "By Source Filesystem"
-msgstr "以源文件系统"
-
-#: editor_actions.cc:680
-msgid "Remove Unused"
-msgstr "移除未使用的"
-
-#: editor_actions.cc:684 editor_audio_import.cc:282 session_import_dialog.cc:75
-#: session_import_dialog.cc:95 session_metadata_dialog.cc:418
-#: editor_videotimeline.cc:91
-msgid "Import"
-msgstr "导入"
-
-#: editor_actions.cc:687
-msgid "Import to Region List..."
-msgstr "导入到区域列表…"
-
-#: editor_actions.cc:690 session_import_dialog.cc:44
-msgid "Import From Session"
-msgstr "从会话导入"
-
-#: editor_actions.cc:694
-msgid "Bring all media into session folder"
-msgstr "将所有媒体引入会话文件夹"
-
-#: editor_actions.cc:697
-msgid "Show Summary"
-msgstr "显示摘要"
-
-#: editor_actions.cc:699
-msgid "Show Group Tabs"
-msgstr "显示群组标签页"
-
-#: editor_actions.cc:701
-msgid "Show Measure Lines"
-msgstr "显示测量线"
-
-#: editor_actions.cc:705
-msgid "Show Logo"
-msgstr "显示商标"
-
-#: editor_actions.cc:709
-msgid "Toggle MIDI Input Active for Editor-Selected Tracks/Busses"
-msgstr "切换是否为编辑器中已选择的音轨/总线激活MIDI输入"
-
-#: editor_actions.cc:732
-msgid "Loaded editor bindings from %1"
-msgstr "已从 %1 载入编辑器绑定"
-
-#: editor_actions.cc:734
-msgid "Could not find editor.bindings in search path %1"
-msgstr "在搜索路径 %1 找不到编辑器绑定"
-
-#: editor_actions.cc:1078 editor_actions.cc:1474 editor_actions.cc:1485
-#: editor_actions.cc:1538 editor_actions.cc:1549 editor_actions.cc:1596
-#: editor_actions.cc:1606 editor_regions.cc:1563
-msgid "programming error: %1: %2"
-msgstr "程序错误: %1: %2"
-
-#: editor_actions.cc:1774
-msgid "Raise"
-msgstr "提升"
-
-#: editor_actions.cc:1777
-msgid "Raise to Top"
-msgstr "提升到顶部"
-
-#: editor_actions.cc:1780
-msgid "Lower"
-msgstr "沉降"
-
-#: editor_actions.cc:1783
-msgid "Lower to Bottom"
-msgstr "沉降到底部"
-
-#: editor_actions.cc:1786
-msgid "Move to Original Position"
-msgstr "移动到原始位置"
-
-#: editor_actions.cc:1791
-msgid "Lock to Video"
-msgstr "锁定到视频"
-
-#: editor_actions.cc:1796 editor_markers.cc:912
-msgid "Glue to Bars and Beats"
-msgstr "粘连到小节和拍子"
-
-#: editor_actions.cc:1801
-msgid "Remove Sync"
-msgstr "移除同步"
-
-#: editor_actions.cc:1804 mixer_strip.cc:2006 monitor_section.cc:272
-#: route_time_axis.cc:253 route_time_axis.cc:526
-msgid "Mute"
-msgstr "静音"
-
-#: editor_actions.cc:1807
-msgid "Normalize..."
-msgstr "规范化…"
-
-#: editor_actions.cc:1810
-msgid "Reverse"
-msgstr "反转"
-
-#: editor_actions.cc:1813
-msgid "Make Mono Regions"
-msgstr "设为单声道区域"
-
-#: editor_actions.cc:1816
-msgid "Boost Gain"
-msgstr "放大增益"
-
-#: editor_actions.cc:1819
-msgid "Cut Gain"
-msgstr "减小增益"
-
-#: editor_actions.cc:1822
-msgid "Pitch Shift..."
-msgstr "音高替换…"
-
-#: editor_actions.cc:1825
-msgid "Transpose..."
-msgstr "变调…"
-
-#: editor_actions.cc:1828
-msgid "Opaque"
-msgstr "模糊度"
-
-#: editor_actions.cc:1832 editor_regions.cc:117
-msgid "Fade In"
-msgstr "æ·¡å…¥"
-
-#: editor_actions.cc:1837 editor_regions.cc:118
-msgid "Fade Out"
-msgstr "淡出"
-
-#: editor_actions.cc:1852
-msgid "Multi-Duplicate..."
-msgstr "多个副本…"
-
-#: editor_actions.cc:1857
-msgid "Fill Track"
-msgstr "填充音轨"
-
-#: editor_actions.cc:1861 editor_markers.cc:1000
-msgid "Set Loop Range"
-msgstr "设置循环范围"
-
-#: editor_actions.cc:1868
-msgid "Set Punch"
-msgstr "设置切换"
-
-#: editor_actions.cc:1872
-msgid "Add Single Range Marker"
-msgstr "添加单个范围标记"
-
-#: editor_actions.cc:1877
-msgid "Add Range Marker Per Region"
-msgstr "为每个区域添加范围标记"
-
-#: editor_actions.cc:1881
-msgid "Snap Position To Grid"
-msgstr "吸附位置到网格"
-
-#: editor_actions.cc:1884
-msgid "Close Gaps"
-msgstr "封闭间隙"
-
-# 使用方法 http://linuxaudioblog.com/?tag=rhythm-ferret
-#: editor_actions.cc:1887
-msgid "Rhythm Ferret..."
-msgstr "节奏探测…"
-
-#: editor_actions.cc:1890
-msgid "Export..."
-msgstr "导出..."
-
-#: editor_actions.cc:1896
-msgid "Separate Under"
-msgstr "分离位于"
-
-#: editor_actions.cc:1900 editor_actions.cc:1901
-msgid "Set Fade In Length"
-msgstr "设置淡入长度"
-
-#: editor_actions.cc:1902 editor_actions.cc:1903
-msgid "Set Fade Out Length"
-msgstr "设置淡出长度"
-
-#: editor_actions.cc:1905
-msgid "Set Tempo from Region = Bar"
-msgstr "从区域设置节奏=小节"
-
-#: editor_actions.cc:1910
-msgid "Split at Percussion Onsets"
-msgstr "在打击乐击发处拆分"
-
-#: editor_actions.cc:1915
-msgid "List Editor..."
-msgstr "列表编辑器…"
-
-#: editor_actions.cc:1918
-msgid "Properties..."
-msgstr "属性…"
-
-#: editor_actions.cc:1922
-msgid "Bounce (with processing)"
-msgstr "欢跳弹奏(并处理)"
-
-#: editor_actions.cc:1923
-msgid "Bounce (without processing)"
-msgstr "欢跳弹奏(不处理)"
-
-#: editor_actions.cc:1924
-msgid "Combine"
-msgstr "整合"
-
-#: editor_actions.cc:1925
-msgid "Uncombine"
-msgstr "不整合"
-
-#: editor_actions.cc:1927
-msgid "Spectral Analysis..."
-msgstr "频谱分析…"
-
-#: editor_actions.cc:1929
-msgid "Reset Envelope"
-msgstr "重置封装"
-
-#: editor_actions.cc:1931
-msgid "Reset Gain"
-msgstr "重置增益"
-
-#: editor_actions.cc:1936
-msgid "Envelope Active"
-msgstr "封装激活"
-
-#: editor_actions.cc:1944 editor_actions.cc:1945
-msgid "Insert Patch Change..."
-msgstr "插入切变音色…"
-
-#: editor_actions.cc:1946
-msgid "Unlink from other copies"
-msgstr "解除链接其它拷贝"
-
-#: editor_actions.cc:1947
-msgid "Strip Silence..."
-msgstr "片段无声…"
-
-#: editor_actions.cc:1948
-msgid "Set Range Selection"
-msgstr "设置范围已选择部分"
-
-#: editor_actions.cc:1950 editor_actions.cc:1951
-msgid "Nudge Later"
-msgstr "向后微调"
-
-#: editor_actions.cc:1952 editor_actions.cc:1953
-msgid "Nudge Earlier"
-msgstr "向前微调"
-
-#: editor_actions.cc:1955
-msgid "Sequence Regions"
-msgstr "序列区域"
-
-#: editor_actions.cc:1960
-msgid "Nudge Later by Capture Offset"
-msgstr "以捕获部分偏移向后微调"
-
-#: editor_actions.cc:1967
-msgid "Nudge Earlier by Capture Offset"
-msgstr "以捕获部分偏移向前微调"
-
-#: editor_actions.cc:1971
-msgid "Trim to Loop"
-msgstr "修剪到循环"
-
-#: editor_actions.cc:1972
-msgid "Trim to Punch"
-msgstr "修剪到切换"
-
-#: editor_actions.cc:1974
-msgid "Trim to Previous"
-msgstr "修剪到上一个"
-
-#: editor_actions.cc:1975
-msgid "Trim to Next"
-msgstr "修剪到下一个"
-
-#: editor_actions.cc:1982
-msgid "Insert Region From Region List"
-msgstr "从区域列表插入区域"
-
-#: editor_actions.cc:1988
-msgid "Set Sync Position"
-msgstr "设置同步位置"
-
-#: editor_actions.cc:1989
-msgid "Place Transient"
-msgstr "放置过渡"
-
-#: editor_actions.cc:1990
-msgid "Split/Separate"
-msgstr "拆分/分离"
-
-#: editor_actions.cc:1991
-msgid "Trim Start at Edit Point"
-msgstr "在编辑点修剪起点"
-
-#: editor_actions.cc:1992
-msgid "Trim End at Edit Point"
-msgstr "在编辑点修剪终点"
-
-#: editor_actions.cc:1997
-msgid "Align Start"
-msgstr "对齐起点"
-
-#: editor_actions.cc:2004
-msgid "Align Start Relative"
-msgstr "对齐起点相关"
-
-#: editor_actions.cc:2008
-msgid "Align End"
-msgstr "对齐终点"
-
-#: editor_actions.cc:2013
-msgid "Align End Relative"
-msgstr "对齐终点相关"
-
-#: editor_actions.cc:2020
-msgid "Align Sync"
-msgstr "对齐同步"
-
-#: editor_actions.cc:2027
-msgid "Align Sync Relative"
-msgstr "对齐同步相关"
-
-#: editor_actions.cc:2031 editor_actions.cc:2034
-msgid "Choose Top..."
-msgstr "选择顶部…"
-
-#: editor_audio_import.cc:77 editor_audio_import.cc:99
-msgid "You can't import or embed an audiofile until you have a session loaded."
-msgstr "无法导入嵌入的的音频文件,,除非您已经载入一个会话文件。"
-
-#: editor_audio_import.cc:83 editor_audio_import.cc:127
-msgid "Add Existing Media"
-msgstr "添加已存在的媒体"
-
-#: editor_audio_import.cc:175
-msgid ""
-"The session already contains a source file named %1.  Do you want to import %1 as "
-"a new file, or skip it?"
-msgstr ""
-"此会话已经存在一个名为 %1 的源文件。您想把 %1 作为一个新文件导入进来,,或者跳过它?"
-
-#: editor_audio_import.cc:177
-msgid ""
-"The session already contains a source file named %1.  Do you want to import %2 as "
-"a new source, or skip it?"
-msgstr ""
-"此会话已经存在一个名为 %1 的源文件。您想把 %2 作为一个新的源导入进来,,或者跳过它?"
-
-#: editor_audio_import.cc:282 editor_videotimeline.cc:91
-msgid "Cancel Import"
-msgstr "取消导入"
-
-#: editor_audio_import.cc:559
-msgid "Editor: cannot open file \"%1\", (%2)"
-msgstr "编辑器: 无法打开文件 \"%1\", (%2)"
-
-#: editor_audio_import.cc:567
-msgid "Cancel entire import"
-msgstr "取消整体导入"
-
-#: editor_audio_import.cc:568
-msgid "Don't embed it"
-msgstr "不嵌入它"
-
-#: editor_audio_import.cc:569
-msgid "Embed all without questions"
-msgstr "嵌入所有,不必询问"
-
-#: editor_audio_import.cc:572 editor_audio_import.cc:598 export_format_dialog.cc:60
-msgid "Sample rate"
-msgstr "采样率"
-
-#: editor_audio_import.cc:573 editor_audio_import.cc:599
-msgid ""
-"%1\n"
-"This audiofile's sample rate doesn't match the session sample rate!"
-msgstr ""
-"%1\n"
-"此音频文件的采样率与会话的采样率不匹配!"
-
-#: editor_audio_import.cc:595
-msgid "Embed it anyway"
-msgstr "只管嵌入它"
-
-#: editor_canvas_events.cc:1306 editor_drag.cc:1381
-msgid "Could not create new track after region placed in the drop zone"
-msgstr "区域被放置在落选区后,无法创建新音轨"
-
-#: editor_drag.cc:1266
-msgid "fixed time region drag"
-msgstr "已定型的时间区域拖拽"
-
-#: editor_drag.cc:2214
-msgid "Ripple drag"
-msgstr "波纹拖拽"
-
-#: editor_drag.cc:2365 midi_region_view.cc:2813
-msgid "resize notes"
-msgstr "重设音符大小"
-
-#: editor_drag.cc:2517
-msgid "Video Start:"
-msgstr "视频起点:"
-
-#: editor_drag.cc:2519
-msgid "Diff:"
-msgstr "差别:"
-
-#: editor_drag.cc:2538
-msgid "Move Video"
-msgstr "移动视频"
-
-#: editor_drag.cc:3046
-msgid "copy meter mark"
-msgstr "复制节拍标记"
-
-#: editor_drag.cc:3054
-msgid "move meter mark"
-msgstr "移动节拍标记"
-
-#: editor_drag.cc:3177
-msgid "copy tempo mark"
-msgstr "复制节奏标记"
-
-#: editor_drag.cc:3185
-msgid "move tempo mark"
-msgstr "移动节奏标记"
-
-#: editor_drag.cc:3412
-msgid "change fade in length"
-msgstr "改变渐入长度"
-
-#: editor_drag.cc:3526
-msgid "change fade out length"
-msgstr "改变渐出长度"
-
-#: editor_drag.cc:3880
-msgid "move marker"
-msgstr "移动标记"
-
-#: editor_drag.cc:4490
-msgid "An error occurred while executing time stretch operation"
-msgstr "当执行时间延伸操作时出现错误"
-
-#: editor_drag.cc:4947
-msgid "programming_error: %1"
-msgstr "程序错误:%1"
-
-#: editor_drag.cc:5016 editor_drag.cc:5026
-msgid "new skip marker"
-msgstr "新建跳跃标记"
-
-#: editor_drag.cc:5017
-msgid "skip"
-msgstr "跳跃"
-
-#: editor_drag.cc:5021 location_ui.cc:56
-msgid "CD"
-msgstr ""
-
-#: editor_drag.cc:5022
-msgid "new CD marker"
-msgstr "新建CD标记"
-
-#: editor_drag.cc:5027 editor_route_groups.cc:437 mixer_ui.cc:1493
-msgid "unnamed"
-msgstr "未命名的"
-
-#: editor_drag.cc:5309
-msgid "Automation range drag created for invalid region type"
-msgstr "为无效的区域类型已创建自动范围拖拽"
-
-#: editor_route_groups.cc:96
-msgid "Col"
-msgstr "列"
-
-#: editor_route_groups.cc:96
-msgid "Group Tab Color"
-msgstr "分组标签页颜色"
-
-#: editor_route_groups.cc:97
-msgid "Name of Group"
-msgstr "分组名称"
-
-#: editor_route_groups.cc:98 editor_routes.cc:207
-msgid "V"
-msgstr ""
-
-#: editor_route_groups.cc:98
-msgid "Group is visible?"
-msgstr "分组是否可见?"
-
-#: editor_route_groups.cc:99
-msgid "On"
-msgstr "开启"
-
-#: editor_route_groups.cc:99
-msgid "Group is enabled?"
-msgstr "分组是否可用?"
-
-#: editor_route_groups.cc:100
-msgid "group|G"
-msgstr "分组|G"
-
-#: editor_route_groups.cc:100
-msgid "Sharing Gain?"
-msgstr "分享增益?"
-
-#: editor_route_groups.cc:101
-msgid "relative|Rel"
-msgstr "相关|Rel"
-
-#: editor_route_groups.cc:101
-msgid "Relative Gain Changes?"
-msgstr "相关增益改变?"
-
-#: editor_route_groups.cc:102
-msgid "mute|M"
-msgstr "静音|M"
-
-#: editor_route_groups.cc:102
-msgid "Sharing Mute?"
-msgstr "分享静音?"
-
-#: editor_route_groups.cc:103
-msgid "solo|S"
-msgstr "独奏|S"
-
-#: editor_route_groups.cc:103
-msgid "Sharing Solo?"
-msgstr "分享独奏?"
-
-#: editor_route_groups.cc:104 midi_time_axis.cc:1622 midi_time_axis.cc:1625
-#: midi_time_axis.cc:1628
-msgid "Rec"
-msgstr "录制"
-
-#: editor_route_groups.cc:104
-msgid "Sharing Record-enable Status?"
-msgstr "分享静音?"
-
-#: editor_route_groups.cc:105
-msgid "monitoring|Mon"
-msgstr "监控|Mon"
-
-#: editor_route_groups.cc:105
-msgid "Sharing Monitoring Choice?"
-msgstr "分享监控选择?"
-
-#: editor_route_groups.cc:106
-msgid "selection|Sel"
-msgstr "已选择部分|Sel"
-
-#: editor_route_groups.cc:106
-msgid "Sharing Selected/Editing Status?"
-msgstr "分享已选择/编辑状态?"
-
-#: editor_route_groups.cc:107
-msgid "active|A"
-msgstr "激活"
-
-#: editor_route_groups.cc:107
-msgid "Sharing Active Status?"
-msgstr "分享激活状态?"
-
-#: editor_export_audio.cc:92 editor_markers.cc:740 editor_markers.cc:827
-#: editor_markers.cc:1012 editor_markers.cc:1030 editor_markers.cc:1048
-#: editor_markers.cc:1067 editor_markers.cc:1086 editor_markers.cc:1116
-#: editor_markers.cc:1147 editor_markers.cc:1177 editor_markers.cc:1205
-#: editor_markers.cc:1236 editor_markers.cc:1261 editor_markers.cc:1312
-#: editor_markers.cc:1356 editor_markers.cc:1382 editor_markers.cc:1576
-#: editor_mouse.cc:2120
-msgid "programming error: marker canvas item has no marker object pointer!"
-msgstr "程序错误:标记版面条目没有标记对象物体指示!"
-
-#: editor_export_audio.cc:145 editor_export_audio.cc:150
-msgid "File Exists!"
-msgstr "文件已存在!"
-
-#: editor_export_audio.cc:153
-msgid "Overwrite Existing File"
-msgstr "覆盖已存在文件"
-
-#: editor_group_tabs.cc:176
-msgid "Fit to Window"
-msgstr "匹配适合窗口"
-
-#: editor_markers.cc:139
-msgid "start"
-msgstr "start"
-
-#: editor_markers.cc:140
-msgid "end"
-msgstr "终点"
-
-#: editor_markers.cc:657 editor_ops.cc:2085 editor_ops.cc:2107 editor_ops.cc:2164
-#: editor_ops.cc:2193 location_ui.cc:1023
-msgid "add marker"
-msgstr "添加标记"
-
-#: editor_markers.cc:689 editor_markers.cc:1456
-msgid "set loop range"
-msgstr "设置切换范围"
-
-#: editor_markers.cc:705 editor_markers.cc:1462
-msgid "set punch range"
-msgstr "设置切换范围"
-
-#: editor_markers.cc:722 editor_ops.cc:4055
-msgid "range"
-msgstr "范围"
-
-#: editor_markers.cc:725
-msgid "new range marker"
-msgstr "新建范围标记"
-
-#: editor_markers.cc:758 editor_ops.cc:2129 location_ui.cc:859
-msgid "remove marker"
-msgstr "移除标记"
-
-#: editor_markers.cc:894
-msgid "Locate to Here"
-msgstr "定位到此处"
-
-#: editor_markers.cc:895
-msgid "Play from Here"
-msgstr "从此处开始播放"
-
-#: editor_markers.cc:896
-msgid "Move Mark to Playhead"
-msgstr "移动标记到指针"
-
-#: editor_markers.cc:900
-msgid "Create Range to Next Marker"
-msgstr "创建范围到下一个标记"
-
-#: editor_markers.cc:941
-msgid "Locate to Marker"
-msgstr "定位到标记"
-
-#: editor_markers.cc:942
-msgid "Play from Marker"
-msgstr "从标记开始播放"
-
-#: editor_markers.cc:945
-msgid "Set Marker from Playhead"
-msgstr "从指针起设置标记"
-
-#: editor_markers.cc:947
-msgid "Set Range from Selection"
-msgstr "从已选择部分起设置范围"
-
-#: editor_markers.cc:957
-msgid "Hide Range"
-msgstr "隐藏范围"
-
-#: editor_markers.cc:958
-msgid "Rename Range..."
-msgstr "重命名范围…"
-
-#: editor_markers.cc:962
-msgid "Remove Range"
-msgstr "移除范围"
-
-#: editor_markers.cc:969
-msgid "Separate Regions in Range"
-msgstr "在范围中分离区域"
-
-#: editor_markers.cc:972
-msgid "Select Range"
-msgstr "选择范围"
-
-#: editor_markers.cc:1001
-msgid "Set Punch Range"
-msgstr "设置切换范围"
-
-#: editor_markers.cc:1407 editor_ops.cc:2040
-msgid "New Name:"
-msgstr "新名称:"
-
-#: editor_markers.cc:1410
-msgid "Rename Mark"
-msgstr "重命名标记"
-
-#: editor_markers.cc:1412
-msgid "Rename Range"
-msgstr "重命名范围"
-
-#: editor_markers.cc:1419 editor_mouse.cc:2137 processor_box.cc:1994
-#: processor_box.cc:2464 route_time_axis.cc:1100 route_ui.cc:1628
-msgid "Rename"
-msgstr "重命名"
-
-#: editor_markers.cc:1432
-msgid "rename marker"
-msgstr "重命名标记"
-
-#: editor_mixer.cc:90
-msgid "This screen is not tall enough to display the editor mixer"
-msgstr "屏幕高度不足以显示编辑器或混音器"
-
-#: editor_mouse.cc:1223 editor_mouse.cc:1241 editor_tempodisplay.cc:270
-msgid "programming error: tempo marker canvas item has no marker object pointer!"
-msgstr "程序错误:节奏标记版面条目没有标记对象物体指示!"
-
-#: editor_mouse.cc:1228 editor_tempodisplay.cc:275
-msgid "programming error: marker for tempo is not a tempo marker!"
-msgstr "程序错误:节奏上的标记不是一个节奏标记!"
-
-#: editor_mouse.cc:1246 editor_tempodisplay.cc:375
-msgid "programming error: marker for meter is not a meter marker!"
-msgstr "程序错误:节拍上的标记不是一个节拍标记!"
-
-#: editor_mouse.cc:1885 editor_mouse.cc:1910 editor_mouse.cc:1923
-msgid ""
-"programming error: control point canvas item has no control point object pointer!"
-msgstr "程序错误:控制点版面条目没有控制点对象物体指示!"
-
-#: editor_mouse.cc:2058
-msgid "start point trim"
-msgstr "起点修剪"
-
-#: editor_mouse.cc:2083
-msgid "End point trim"
-msgstr "终点修剪"
-
-#: editor_mouse.cc:2135
-msgid "Name for region:"
-msgstr "区域名:"
-
-#: editor_ops.cc:165
-msgid "split"
-msgstr "拆分"
-
-#: editor_ops.cc:339
-msgid "alter selection"
-msgstr "更改已选择部分"
-
-#: editor_ops.cc:381
-msgid "nudge regions forward"
-msgstr "向前微调区域"
-
-#: editor_ops.cc:404 editor_ops.cc:489
-msgid "nudge location forward"
-msgstr "向前微调位置"
-
-#: editor_ops.cc:462
-msgid "nudge regions backward"
-msgstr "向后微调区域"
-
-#: editor_ops.cc:551
-msgid "nudge forward"
-msgstr "向前微调"
-
-#: editor_ops.cc:575
-msgid "nudge backward"
-msgstr "向后微调"
-
-#: editor_ops.cc:618
-msgid "sequence regions"
-msgstr "序列区域"
-
-#: editor_ops.cc:694
-msgid "build_region_boundary_cache called with snap_type = %1"
-msgstr "构建区域边界缓存调用吸附类型 = %1"
-
-#: editor_ops.cc:2042
-msgid "New Location Marker"
-msgstr "新建位置标记"
-
-#: editor_ops.cc:2164
-msgid "add markers"
-msgstr "添加标记"
-
-#: editor_ops.cc:2274
-msgid "clear markers"
-msgstr "清除表己"
-
-#: editor_ops.cc:2289
-msgid "clear ranges"
-msgstr "清除范围"
-
-#: editor_ops.cc:2305
-msgid "clear locations"
-msgstr "清除位置"
-
-#: editor_ops.cc:2368
-msgid "insert region"
-msgstr "插入区域"
-
-#: editor_ops.cc:2559
-msgid "raise regions"
-msgstr "提升区域"
-
-#: editor_ops.cc:2561
-msgid "raise region"
-msgstr "提升区域"
-
-#: editor_ops.cc:2567
-msgid "raise regions to top"
-msgstr "提升区域到顶部"
-
-#: editor_ops.cc:2569
-msgid "raise region to top"
-msgstr "提升区域到顶部"
-
-#: editor_ops.cc:2575
-msgid "lower regions"
-msgstr "沉降区域"
-
-#: editor_ops.cc:2577 editor_ops.cc:2585
-msgid "lower region"
-msgstr "沉降区域"
-
-#: editor_ops.cc:2583
-msgid "lower regions to bottom"
-msgstr "沉降区域到底部"
-
-#: editor_ops.cc:2668
-msgid "Rename Region"
-msgstr "重命名区域"
-
-#: editor_ops.cc:2670 processor_box.cc:1992 route_ui.cc:1626
-msgid "New name:"
-msgstr "新名称:"
-
-#: editor_ops.cc:2987
-msgid "separate"
-msgstr "分离"
-
-#: editor_ops.cc:3099
-msgid "separate region under"
-msgstr "分离区域位于"
-
-#: editor_ops.cc:3220
-msgid "trim to selection"
-msgstr "修剪到已选中部分"
-
-#: editor_ops.cc:3356
-msgid "set sync point"
-msgstr "设置同步点"
-
-#: editor_ops.cc:3380
-msgid "remove region sync"
-msgstr "移除区域同步"
-
-#: editor_ops.cc:3402
-msgid "move regions to original position"
-msgstr "移动区域到原始位置"
-
-#: editor_ops.cc:3404
-msgid "move region to original position"
-msgstr "移动区域到原始位置"
-
-#: editor_ops.cc:3425
-msgid "align selection"
-msgstr "对齐已选中部分"
-
-#: editor_ops.cc:3499
-msgid "align selection (relative)"
-msgstr "对齐已选中部分(相关)"
-
-#: editor_ops.cc:3533
-msgid "align region"
-msgstr "对齐区域"
-
-#: editor_ops.cc:3584
-msgid "trim front"
-msgstr "修剪前部"
-
-#: editor_ops.cc:3584
-msgid "trim back"
-msgstr "修剪后部"
-
-#: editor_ops.cc:3614
-msgid "trim to loop"
-msgstr "修剪到循环"
-
-#: editor_ops.cc:3624
-msgid "trim to punch"
-msgstr "修剪到切换"
-
-#: editor_ops.cc:3686
-msgid "trim to region"
-msgstr "修剪到区域"
-
-#: editor_ops.cc:3794
-msgid ""
-"This track/bus cannot be frozen because the signal adds or loses channels before "
-"reaching the outputs.\n"
-"This is typically caused by plugins that generate stereo output from mono input or "
-"vice versa."
-msgstr ""
-"这个音轨/总线不能被冻结,因为在信号到达输出前添加或丢失了声道。\n"
-"这通常是由于从单声道输入生成立体声输出(反之亦然)的插件引起的。"
-
-#: editor_ops.cc:3797
-msgid "Cannot freeze"
-msgstr "无法冻结"
-
-#: editor_ops.cc:3803
-msgid ""
-"<b>%1</b>\n"
-"\n"
-"This track has at least one send/insert/return as part of its signal flow.\n"
-"\n"
-"Freezing will only process the signal as far as the first send/insert/return."
-msgstr ""
-"<b>%1</b>\n"
-"\n"
-"这个音轨至少有一个发送/插入/返回作为它的信号流的一部分。\n"
-"\n"
-"冻结将只会处理到信号的第一个发送/插入/返回为止。"
-
-#: editor_ops.cc:3807
-msgid "Freeze anyway"
-msgstr "只管冻结"
-
-#: editor_ops.cc:3808
-msgid "Don't freeze"
-msgstr "不要冻结"
-
-#: editor_ops.cc:3809
-msgid "Freeze Limits"
-msgstr "冻结限制"
-
-#: editor_ops.cc:3824
-msgid "Cancel Freeze"
-msgstr "取消冻结"
-
-#: editor_ops.cc:3854
-msgid ""
-"You can't perform this operation because the processing of the signal will cause "
-"one or more of the tracks to end up with a region with more channels than this "
-"track has inputs.\n"
-"\n"
-"You can do this without processing, which is a different operation."
-msgstr ""
-"您不能执行此操作,因为信号的处理将导致一个或多个音轨以带着多个声道的区域结束,而不"
-"是以这个音轨拥有的输入声道结束。\n"
-"\n"
-"您可以不做任何处理,这是一个不同的操作。"
-
-#: editor_ops.cc:3858
-msgid "Cannot bounce"
-msgstr "不能欢跳弹奏"
-
-#: editor_ops.cc:3869
-msgid "bounce range"
-msgstr "欢跳弹奏范围"
-
-#: editor_ops.cc:3971
-msgid "delete"
-msgstr "删除"
-
-#: editor_ops.cc:3974
-msgid "cut"
-msgstr "剪切"
-
-#: editor_ops.cc:3977
-msgid "copy"
-msgstr "复制"
-
-#: editor_ops.cc:3980
-msgid "clear"
-msgstr "清除"
-
-#: editor_ops.cc:4028
-msgid "objects"
-msgstr "对象物体"
-
-#: editor_ops.cc:4238 editor_ops.cc:4270
-msgid "remove region"
-msgstr "删除区间"
-
-#: editor_ops.cc:4719
-msgid "duplicate selection"
-msgstr "复制已选择部分"
-
-#: editor_ops.cc:4803
-msgid "nudge track"
-msgstr "微调音轨"
-
-#: editor_ops.cc:4840
-msgid ""
-"Do you really want to destroy the last capture?\n"
-"(This is destructive and cannot be undone)"
-msgstr ""
-"您是否确定要销毁最后已捕获内容?\n"
-"(这个操作有破坏性且不能撤销!)"
-
-#: editor_ops.cc:4843 editor_ops.cc:6838 editor_regions.cc:462
-#: editor_snapshots.cc:159 route_ui.cc:1569
-msgid "No, do nothing."
-msgstr "否, 什么都不做。"
-
-#: editor_ops.cc:4844
-msgid "Yes, destroy it."
-msgstr "是,销毁它。"
-
-#: editor_ops.cc:4846
-msgid "Destroy last capture"
-msgstr "销毁最后捕获的部分"
-
-#: editor_ops.cc:4906
-msgid "normalize"
-msgstr "规范化"
-
-#: editor_ops.cc:5000
-msgid "reverse regions"
-msgstr "反转区域"
-
-#: editor_ops.cc:5034
-msgid "strip silence"
-msgstr "片段无声"
-
-#: editor_ops.cc:5091
-msgid "Fork Region(s)"
-msgstr "分解区域"
-
-#: editor_ops.cc:5112
-msgid "Could not unlink %1"
-msgstr "无法解除链接 %1"
-
-#: editor_ops.cc:5326
-msgid "reset region gain"
-msgstr "重设区域增益"
-
-#: editor_ops.cc:5379
-msgid "region gain envelope active"
-msgstr "区域增益封装激活"
-
-#: editor_ops.cc:5406
-msgid "toggle region lock"
-msgstr "切换区域锁定"
-
-#: editor_ops.cc:5430
-msgid "Toggle Video Lock"
-msgstr "切换视频锁定"
-
-#: editor_ops.cc:5454
-msgid "region lock style"
-msgstr "区域锁定风格"
-
-#: editor_ops.cc:5479
-msgid "change region opacity"
-msgstr "改变区域的模糊度"
-
-#: editor_ops.cc:5572
-msgid "fade range"
-msgstr "淡化范围"
-
-#: editor_ops.cc:5610
-msgid "set fade in length"
-msgstr "设置淡入长度"
-
-#: editor_ops.cc:5617
-msgid "set fade out length"
-msgstr "设置淡出长度"
-
-#: editor_ops.cc:5662
-msgid "set fade in shape"
-msgstr "设置淡入形状"
-
-#: editor_ops.cc:5693
-msgid "set fade out shape"
-msgstr "设置淡出形状"
-
-#: editor_ops.cc:5723
-msgid "set fade in active"
-msgstr "设置淡入启用"
-
-#: editor_ops.cc:5752
-msgid "set fade out active"
-msgstr "设置淡出长度"
-
-#: editor_ops.cc:5994
-msgid "set loop range from selection"
-msgstr "从已选择部分设置循环范围"
-
-#: editor_ops.cc:6008
-msgid "set loop range from region"
-msgstr "从区域设置循环范围"
-
-#: editor_ops.cc:6027
-msgid "set punch range from selection"
-msgstr "从已选择部分设置切换范围"
-
-#: editor_ops.cc:6041
-msgid "set session start/end from selection"
-msgstr "从已选择部分设置会话起点/终点"
-
-#: editor_ops.cc:6066
-msgid "set punch range from region"
-msgstr "从区域设置切换范围"
-
-#: editor_ops.cc:6175
-msgid "Add new marker"
-msgstr "添加新标记"
-
-#: editor_ops.cc:6176
-msgid "Set global tempo"
-msgstr "设置全局节奏"
-
-#: editor_ops.cc:6179
-msgid "Define one bar"
-msgstr "定义一个小节"
-
-#: editor_ops.cc:6180
-msgid "Do you want to set the global tempo or add a new tempo marker?"
-msgstr "您是否要设置全局节奏或者添加一个新的节奏标签?"
-
-#: editor_ops.cc:6206
-msgid "set tempo from region"
-msgstr "从区域设置节奏"
-
-#: editor_ops.cc:6236
-msgid "split regions"
-msgstr "拆分区域"
-
-#: editor_ops.cc:6278
-msgid ""
-"You are about to split\n"
-"%1\n"
-"into %2 pieces.\n"
-"This could take a long time."
-msgstr ""
-"您试图拆分\n"
-" %1\n"
-" 成为 %2 部分。\n"
-"这需要一些时间。"
-
-#: editor_ops.cc:6285
-msgid "Call for the Ferret!"
-msgstr "调用探测!"
-
-#: editor_ops.cc:6286
-msgid ""
-"Press OK to continue with this split operation\n"
-"or ask the Ferret dialog to tune the analysis"
-msgstr ""
-"按OK继续拆分操作\n"
-"或者请求探测对话框进行优化分析"
-
-#: editor_ops.cc:6288
-msgid "Press OK to continue with this split operation"
-msgstr "按OK继续拆分操作"
-
-#: editor_ops.cc:6291
-msgid "Excessive split?"
-msgstr "过多的拆分?"
-
-#: editor_ops.cc:6443
-msgid "place transient"
-msgstr "放置过渡"
-
-#: editor_ops.cc:6478
-msgid "snap regions to grid"
-msgstr "吸附区域到网格"
-
-#: editor_ops.cc:6517
-msgid "Close Region Gaps"
-msgstr "关闭区域空缺"
-
-#: editor_ops.cc:6522
-msgid "Crossfade length"
-msgstr "交叉淡化长度"
-
-#: editor_ops.cc:6531 editor_ops.cc:6542 rhythm_ferret.cc:119
-#: session_option_editor.cc:141
-msgid "ms"
-msgstr ""
-
-#: editor_ops.cc:6533
-msgid "Pull-back length"
-msgstr "撤回长度"
-
-#: editor_ops.cc:6546
-msgid "Ok"
-msgstr ""
-
-#: editor_ops.cc:6561
-msgid "close region gaps"
-msgstr "关闭区域空缺"
-
-#: editor_ops.cc:6786 route_ui.cc:1543
-msgid "That would be bad news ...."
-msgstr "这将是个坏消息…"
-
-#: editor_ops.cc:6791 route_ui.cc:1548
-msgid ""
-"Removing the master or monitor bus is such a bad idea\n"
-"that %1 is not going to allow it.\n"
-"\n"
-"If you really want to do this sort of thing\n"
-"edit your ardour.rc file to set the\n"
-"\"allow-special-bus-removal\" option to be \"yes\""
-msgstr ""
-"删除主控或监控总线可不是个好主意\n"
-"且 %1 不允许这样做。\n"
-"\n"
-"如果您真的想做这种事\n"
-"编辑您的 ardour.rc 文件\n"
-"把\"allow-special-bus-removal\" 选项设为 \"yes\" "
-
-#: editor_ops.cc:6809
-msgid "tracks"
-msgstr "音轨"
-
-#: editor_ops.cc:6811 route_ui.cc:1992
-msgid "track"
-msgstr "音轨"
-
-#: editor_ops.cc:6815
-msgid "busses"
-msgstr "总线"
-
-#: editor_ops.cc:6817 route_ui.cc:1992
-msgid "bus"
-msgstr "总线"
-
-#: editor_ops.cc:6822
-msgid ""
-"Do you really want to remove %1 %2 and %3 %4?\n"
-"(You may also lose the playlists associated with the %2)\n"
-"\n"
-"This action cannot be undone, and the session file will be overwritten!"
-msgstr ""
-"您是否确定移除 %1 %2 和 %3 %4 ?\n"
-"(您也可能会丢失与 %2 相关的播放列表)\n"
-"\n"
-"此操作不可撤销, 而且此会话文件将会被重写覆盖!(您也可能会丢失与 %2 相关的播放列"
-"表)"
-
-#: editor_ops.cc:6827
-msgid ""
-"Do you really want to remove %1 %2?\n"
-"(You may also lose the playlists associated with the %2)\n"
-"\n"
-"This action cannot be undone, and the session file will be overwritten!"
-msgstr ""
-"您是否确定移除 %1 %2 \n"
-"(您也可能会丢失与 %2 相关的播放列表)\n"
-"\n"
-"此操作不可撤销, 而且此会话文件将会被重写覆盖!"
-
-#: editor_ops.cc:6833
-msgid ""
-"Do you really want to remove %1 %2?\n"
-"\n"
-"This action cannot be undone, and the session file will be overwritten"
-msgstr ""
-"您是否确定移除 %1 %2 ?\n"
-"\n"
-"此操作不可撤销, 而且此会话文件将会被重写覆盖"
-
-#: editor_ops.cc:6840
-msgid "Yes, remove them."
-msgstr "是的,移除它们。"
-
-#: editor_ops.cc:6842 editor_snapshots.cc:160 route_ui.cc:1570
-msgid "Yes, remove it."
-msgstr "是的,移除它。"
-
-#: editor_ops.cc:6847 editor_ops.cc:6849
-msgid "Remove %1"
-msgstr "移除 %1"
-
-#: editor_ops.cc:6912
-msgid "insert time"
-msgstr "插入时间"
-
-#: editor_ops.cc:7076
-msgid "There are too many tracks to fit in the current window"
-msgstr "音轨太多以至于无法匹配当前窗口。"
-
-#: editor_ops.cc:7137
-msgid "Sel"
-msgstr "选择"
-
-#: editor_ops.cc:7176
-#, c-format
-msgid "Saved view %u"
-msgstr "保存视图 %u"
-
-#: editor_ops.cc:7201
-msgid "mute regions"
-msgstr "静音区域"
-
-#: editor_ops.cc:7203
-msgid "mute region"
-msgstr "静音区域"
-
-#: editor_ops.cc:7240
-msgid "combine regions"
-msgstr "整合区域"
-
-#: editor_ops.cc:7278
-msgid "uncombine regions"
-msgstr "解除整合区域"
-
-#: editor_ops.cc:7315
-msgid "%1: Locked"
-msgstr "%1: 锁定"
-
-#: editor_ops.cc:7322
-msgid "Click to unlock"
-msgstr "点击解除锁定"
-
-#: editor_ops.cc:7376
-msgid "Moving embedded files into session folder"
-msgstr "移动已嵌入的文件到会话文件夹"
-
-#: editor_regions.cc:112
-msgid "Region name, with number of channels in []'s"
-msgstr "区域名,在 [ ] 方括号内附带声道编号"
-
-#: editor_regions.cc:113
-msgid "Position of start of region"
-msgstr "区域起点的位置"
-
-#: editor_regions.cc:114 editor_regions.cc:851 time_info_box.cc:101
-msgid "End"
-msgstr "终点"
-
-#: editor_regions.cc:114
-msgid "Position of end of region"
-msgstr "区域终点的位置"
-
-#: editor_regions.cc:115
-msgid "Length of the region"
-msgstr "区域的长度"
-
-#: editor_regions.cc:116
-msgid "Position of region sync point, relative to start of the region"
-msgstr "区域同步点的位置,与区域起点相关"
-
-#: editor_regions.cc:117
-msgid "Length of region fade-in (units: secondary clock), () if disabled"
-msgstr "区域淡入的长度(如果无效时,加上单位:秒计时器)"
-
-#: editor_regions.cc:118
-msgid "Length of region fade-out (units: secondary clock), () if disabled"
-msgstr "区域淡出的长度(如果无效时,加上单位:秒计时器)"
-
-#: editor_regions.cc:119 mixer_strip.cc:2055 mono_panner.cc:203 panner2d.cc:240
-#: stereo_panner.cc:251 stereo_panner.cc:274
-msgid "L"
-msgstr ""
-
-#: editor_regions.cc:119
-msgid "Region position locked?"
-msgstr "区域位置锁定?"
-
-#: editor_regions.cc:120 route_time_axis.cc:103
-msgid "G"
-msgstr ""
-
-#: editor_regions.cc:120
-msgid "Region position glued to Bars|Beats time?"
-msgstr "区域位置粘连到小节|拍子时间?"
-
-#: editor_regions.cc:121 editor_routes.cc:211 gain_meter.cc:793 mixer_strip.cc:2032
-#: meter_strip.cc:359 panner_ui.cc:603 route_time_axis.cc:2713 stereo_panner.cc:271
-#: time_axis_view.cc:1190
-msgid "M"
-msgstr ""
-
-#: editor_regions.cc:121
-msgid "Region muted?"
-msgstr "区域静音?"
-
-#: editor_regions.cc:122 mixer_strip.cc:1855
-msgid "O"
-msgstr ""
-
-#: editor_regions.cc:122
-msgid "Region opaque (blocks regions below it from being heard)?"
-msgstr "区域模糊(从区域块以下的部分起可以被听见)?"
-
-#: editor_regions.cc:311 editor_regions.cc:316 editor_regions.cc:318
-msgid "Hidden"
-msgstr "隐藏"
-
-#: editor_regions.cc:391
-msgid "(MISSING) "
-msgstr "(缺失)"
-
-#: editor_regions.cc:459
-msgid ""
-"Do you really want to remove unused regions?\n"
-"(This is destructive and cannot be undone)"
-msgstr ""
-"您真的打算移除未使用的区域?\n"
-"(这是破坏性的且无法撤销)"
-
-#: editor_regions.cc:463
-msgid "Yes, remove."
-msgstr "是的,移除。"
-
-#: editor_regions.cc:465
-msgid "Remove unused regions"
-msgstr "移除未使用的区域"
-
-#: editor_regions.cc:818 editor_regions.cc:832 editor_regions.cc:846
-msgid "Mult."
-msgstr "多"
-
-#: editor_regions.cc:849 midi_list_editor.cc:104 time_info_box.cc:94
-msgid "Start"
-msgstr "起点"
-
-#: editor_regions.cc:867 editor_regions.cc:883
-msgid "Multiple"
-msgstr "多个"
-
-#: editor_regions.cc:952
-msgid "MISSING "
-msgstr "缺失"
-
-#: editor_routes.cc:182 editor_routes.cc:214
-msgid "SS"
-msgstr ""
-
-#: editor_routes.cc:206
-msgid "Track/Bus Name"
-msgstr "音轨/总线名称"
-
-#: editor_routes.cc:207
-msgid "Track/Bus visible ?"
-msgstr "音轨/总线可见?"
-
-#: editor_routes.cc:208 mixer_strip.cc:2046 meter_strip.cc:371
-#: route_time_axis.cc:105 route_time_axis.cc:2701
-msgid "A"
-msgstr ""
-
-#: editor_routes.cc:208
-msgid "Track/Bus active ?"
-msgstr "音轨/总线启用?"
-
-#: editor_routes.cc:209 mixer_strip.cc:2033 mixer_strip.cc:2054 meter_strip.cc:379
-msgid "I"
-msgstr ""
-
-#: editor_routes.cc:209
-msgid "MIDI input enabled"
-msgstr "MIDI输入已启用"
-
-#: editor_routes.cc:210 mono_panner.cc:220 panner2d.cc:241 stereo_panner.cc:249
-#: stereo_panner.cc:276
-msgid "R"
-msgstr ""
-
-#: editor_routes.cc:210
-msgid "Record enabled"
-msgstr "录制已启用"
-
-#: editor_routes.cc:211
-msgid "Muted"
-msgstr "已静音"
-
-#: editor_routes.cc:212 mixer_strip.cc:2042 meter_strip.cc:367
-#: route_time_axis.cc:2710
-msgid "S"
-msgstr ""
-
-#: editor_routes.cc:212
-msgid "Soloed"
-msgstr "已独奏"
-
-#: editor_routes.cc:213
-msgid "SI"
-msgstr ""
-
-#: editor_routes.cc:213
-msgid "Solo Isolated"
-msgstr "独奏已隔离"
-
-#: editor_routes.cc:214
-msgid "Solo Safe (Locked)"
-msgstr "独奏安全(锁定)"
-
-#: editor_routes.cc:477 mixer_ui.cc:1197
-msgid "Hide All"
-msgstr "隐藏所有"
-
-#: editor_routes.cc:478 mixer_ui.cc:1198
-msgid "Show All Audio Tracks"
-msgstr "显示所有音频轨道"
-
-#: editor_routes.cc:479 mixer_ui.cc:1199
-msgid "Hide All Audio Tracks"
-msgstr "隐藏所有音频轨道"
-
-#: editor_routes.cc:480 mixer_ui.cc:1200
-msgid "Show All Audio Busses"
-msgstr "显示所有音频总线"
-
-#: editor_routes.cc:481 mixer_ui.cc:1201
-msgid "Hide All Audio Busses"
-msgstr "隐藏所有音频总线"
-
-#: editor_routes.cc:482
-msgid "Show All Midi Tracks"
-msgstr "显示所有MIDI轨"
-
-#: editor_routes.cc:483
-msgid "Hide All Midi Tracks"
-msgstr "隐藏所有MIDI轨"
-
-#: editor_routes.cc:484
-msgid "Show Tracks With Regions Under Playhead"
-msgstr "显示指针后面区域的轨道"
-
-#: editor_rulers.cc:211
-msgid "New location marker"
-msgstr "新建位置标记"
-
-#: editor_rulers.cc:212
-msgid "Clear all locations"
-msgstr "清除所有位置"
-
-#: editor_rulers.cc:213
-msgid "Unhide locations"
-msgstr "取消隐藏位置"
-
-#: editor_rulers.cc:217
-msgid "New range"
-msgstr "新建范围"
-
-#: editor_rulers.cc:218
-msgid "Clear all ranges"
-msgstr "清除所有范围"
-
-#: editor_rulers.cc:219
-msgid "Unhide ranges"
-msgstr "取消隐藏范围"
-
-#: editor_rulers.cc:224
-msgid "Make Loop range"
-msgstr "设为循环范围"
-
-#: editor_rulers.cc:225
-msgid "Make Punch range"
-msgstr "设为切换范围"
-
-#: editor_rulers.cc:230
-msgid "New CD track marker"
-msgstr "新建CD音轨标签"
-
-#: editor_rulers.cc:235 tempo_dialog.cc:38
-msgid "New Tempo"
-msgstr "新节奏"
-
-#: editor_rulers.cc:239 tempo_dialog.cc:296
-msgid "New Meter"
-msgstr "新节拍"
-
-#: editor_snapshots.cc:137
-msgid "Rename Snapshot"
-msgstr "重命名快照"
-
-#: editor_snapshots.cc:139
-msgid "New name of snapshot"
-msgstr "快照的新名称"
-
-#: editor_snapshots.cc:157
-msgid ""
-"Do you really want to remove snapshot \"%1\" ?\n"
-"(which cannot be undone)"
-msgstr ""
-"您是否确定移除快照 \"%1\"?\n"
-"(此操作不可撤销)"
-
-#: editor_snapshots.cc:162
-msgid "Remove snapshot"
-msgstr "移除快照"
-
-#: editor_tempodisplay.cc:194 editor_tempodisplay.cc:234
-msgid "add"
-msgstr "添加"
-
-#: editor_tempodisplay.cc:215
-msgid "add tempo mark"
-msgstr "添加节奏标记"
-
-#: editor_tempodisplay.cc:254
-msgid "add meter mark"
-msgstr "添加节拍标记"
-
-#: editor_tempodisplay.cc:287 editor_tempodisplay.cc:315
-msgid "done"
-msgstr "完成"
-
-#: editor_tempodisplay.cc:304 editor_tempodisplay.cc:330
-msgid "replace tempo mark"
-msgstr "替换节奏标记"
-
-#: editor_tempodisplay.cc:353 editor_tempodisplay.cc:387
-msgid "remove tempo mark"
-msgstr "移除节奏标记"
-
-#: editor_tempodisplay.cc:370
-msgid "programming error: meter marker canvas item has no marker object pointer!"
-msgstr "程序错误:节拍标记版面条目没有标记对象物体指示!"
-
-#: editor_timefx.cc:68
-msgid "stretch/shrink"
-msgstr "延伸/收缩"
-
-#: editor_timefx.cc:129
-msgid "pitch shift"
-msgstr "音高替换"
-
-#: editor_timefx.cc:301
-msgid "timefx cannot be started - thread creation error"
-msgstr "间特效无法启动 - 线程创建错误"
-
-#: engine_dialog.cc:83
-msgid "Device Control Panel"
-msgstr "设备控制面板"
-
-#: engine_dialog.cc:84
-msgid "Midi Device Setup"
-msgstr "MIDI设备设置"
-
-#: engine_dialog.cc:85 engine_dialog.cc:2097
-msgid "Measure"
-msgstr "测量"
-
-#: engine_dialog.cc:86
-msgid "Use results"
-msgstr "使用结果"
-
-#: engine_dialog.cc:87
-msgid "Back to settings ... (ignore results)"
-msgstr "回到设置…(忽略结果)"
-
-#: engine_dialog.cc:88
-msgid "Calibrate Audio"
-msgstr "校正音频"
-
-#: engine_dialog.cc:92
-msgid "Back to settings"
-msgstr "回到设置"
-
-#: engine_dialog.cc:111
-msgid ""
-"No audio/MIDI backends detected. %1 cannot run\n"
-"\n"
-"(This is a build/packaging/system error. It should never happen.)"
-msgstr ""
-"未检测到音频/MIDI后端。 %1 无法运行\n"
-"\n"
-"(这是一个构建/包装/系统错误。它应该永远不会发生。)"
-
-#: engine_dialog.cc:137
-msgid "Latency Measurement Tool"
-msgstr "延迟测量工具"
-
-#: engine_dialog.cc:149
-msgid ""
-"<span weight=\"bold\">Turn down the volume on your audio equipment to a very low "
-"level.</span>"
-msgstr "<span weight=\"bold\">调低您的音频设备音量到一个非常低的水平。</span>"
-
-#: engine_dialog.cc:158
-msgid "Select two channels below and connect them using a cable."
-msgstr "选择下面两个声道并和使用线条连接它们。"
-
-#: engine_dialog.cc:163
-msgid "Output channel"
-msgstr "输出声道"
-
-#: engine_dialog.cc:171
-msgid "Input channel"
-msgstr "输入声道"
-
-#: engine_dialog.cc:206
-msgid "Once the channels are connected, click the \"Measure\" button."
-msgstr "一旦声道已连接好,单击“测量”按钮。"
-
-#: engine_dialog.cc:213
-msgid "When satisfied with the results, click the \"Use results\" button."
-msgstr "如果得到了令人满意的结果,请点击“使用结果”按钮。"
-
-#: engine_dialog.cc:228 engine_dialog.cc:2217 engine_dialog.cc:2227
-msgid "No measurement results yet"
-msgstr "还没有测量结果"
-
-#: engine_dialog.cc:238 route_params_ui.cc:106
-msgid "Latency"
-msgstr "延迟"
-
-#: engine_dialog.cc:372
-msgid "Audio System:"
-msgstr "音频系统:"
-
-#: engine_dialog.cc:409
-msgid "Driver:"
-msgstr "驱动:"
-
-#: engine_dialog.cc:415
-msgid "Device:"
-msgstr "设备:"
-
-#: engine_dialog.cc:420 engine_dialog.cc:519 sfdb_ui.cc:153 sfdb_ui.cc:348
-#: sfdb_ui.cc:353
-msgid "Sample rate:"
-msgstr "采样率:"
-
-#: engine_dialog.cc:426 engine_dialog.cc:526
-msgid "Buffer size:"
-msgstr "缓冲区大小:"
-
-#: engine_dialog.cc:444
-msgid "Input Channels:"
-msgstr "输入声道:"
-
-#: engine_dialog.cc:457
-msgid "Output Channels:"
-msgstr "输出声道:"
-
-#: engine_dialog.cc:469
-msgid "Hardware input latency:"
-msgstr "硬件输入延迟:"
-
-#: engine_dialog.cc:472 engine_dialog.cc:485
-msgid "samples"
-msgstr "采样"
-
-#: engine_dialog.cc:482
-msgid "Hardware output latency:"
-msgstr "硬件输出延迟:"
-
-#: engine_dialog.cc:493
-msgid "MIDI System:"
-msgstr "MIDI系统:"
-
-#: engine_dialog.cc:511
-msgid ""
-"The %1 audio backend was configured and started externally.\n"
-"This limits your control over it."
-msgstr ""
-"音频后端已配置并已在外部启动。\n"
-"这限制了您对它的控制力。"
-
-#: engine_dialog.cc:564
-msgid ""
-"Failed to start or connect to audio-engine.\n"
-"\n"
-"Latency calibration requires a working audio interface."
-msgstr ""
-"启动或链接音频引擎失败。\n"
-"\n"
-"延迟校准需要有一个音频接口在工作。"
-
-#: engine_dialog.cc:570
-msgid ""
-"Your selected audio configuration is playback- or capture-only.\n"
-"\n"
-"Latency calibration requires playback and capture"
-msgstr ""
-"您已选择的音频配置仅供回放或仅供捕获。\n"
-"\n"
-"延迟校准需要回放和捕捉"
-
-#: engine_dialog.cc:651
-msgid "MIDI Devices"
-msgstr "MIDI 设备"
-
-#: engine_dialog.cc:657
-msgid "Device"
-msgstr "设备"
-
-#: engine_dialog.cc:659
-msgid "Hardware Latencies"
-msgstr "硬件延迟"
-
-#: engine_dialog.cc:700
-msgid "Calibrate"
-msgstr "æ ¡æ­£"
-
-#: engine_dialog.cc:800
-msgid "all available channels"
-msgstr "所有可用的声道"
-
-#: engine_dialog.cc:1039 latency_gui.cc:39
-msgid "sample"
-msgid_plural "samples"
-msgstr[0] "采样"
-
-#: engine_dialog.cc:1090
-#, c-format
-msgid "(%.1f ms)"
-msgstr ""
-
-#: engine_dialog.cc:1593
-msgid "Could not start backend engine %1"
-msgstr "无法启动后端引擎 %1"
-
-#: engine_dialog.cc:1644
-msgid "Cannot set driver to %1"
-msgstr "无法设置驱动到 %1"
-
-#: engine_dialog.cc:1648
-msgid "Cannot set device name to %1"
-msgstr "无法设置设备名称到 %1"
-
-#: engine_dialog.cc:1652
-msgid "Cannot set sample rate to %1"
-msgstr "无法设置采样率到 %1"
-
-#: engine_dialog.cc:1656
-msgid "Cannot set buffer size to %1"
-msgstr "无法设置缓冲区大小到 %1"
-
-#: engine_dialog.cc:1662
-msgid "Cannot set input channels to %1"
-msgstr "无法设置输入声道到 %1"
-
-#: engine_dialog.cc:1666
-msgid "Cannot set output channels to %1"
-msgstr "无法设置输出声道到 %1"
-
-#: engine_dialog.cc:1672
-msgid "Cannot set input latency to %1"
-msgstr "无法设置输入延迟到 %1"
-
-#: engine_dialog.cc:1676
-msgid "Cannot set output latency to %1"
-msgstr "无法设置输出延迟到 %1"
-
-#: engine_dialog.cc:1955 engine_dialog.cc:2014
-msgid "No signal detected "
-msgstr "未检测到信号"
-
-#: engine_dialog.cc:1968 engine_dialog.cc:2022 port_insert_ui.cc:70
-#: port_insert_ui.cc:98
-msgid "Disconnected from audio engine"
-msgstr "与音频引擎已断开连接"
-
-#: engine_dialog.cc:1977 engine_dialog.cc:2030
-msgid "Detected roundtrip latency: "
-msgstr "检测到往返延迟:"
-
-#: engine_dialog.cc:1979 engine_dialog.cc:2032
-msgid "Systemic latency: "
-msgstr "系统延迟:"
-
-#: engine_dialog.cc:1986
-msgid "(signal detection error)"
-msgstr "(信号检测错误)"
-
-#: engine_dialog.cc:1992
-msgid "(inverted - bad wiring)"
-msgstr "(反向 - 损坏接线)"
-
-#: engine_dialog.cc:2039
-msgid "(averaging)"
-msgstr "(平均)"
-
-#: engine_dialog.cc:2045
-msgid "(too large jitter)"
-msgstr "(振幅过大)"
-
-#: engine_dialog.cc:2049
-msgid "(large jitter)"
-msgstr "(大振幅)"
-
-#: engine_dialog.cc:2061
-msgid "Timeout - large MIDI jitter."
-msgstr "超时 - 大MIDI振幅。"
-
-#: engine_dialog.cc:2077 port_insert_ui.cc:134
-msgid "Detecting ..."
-msgstr "检测中…"
-
-#: engine_dialog.cc:2171
-msgid "Disconnect from %1"
-msgstr "与 %1 失去连接"
-
-#: engine_dialog.cc:2175 mixer_strip.cc:1522 route_group_dialog.cc:45
-#: route_time_axis.cc:841
-msgid "Active"
-msgstr "激活"
-
-#: engine_dialog.cc:2185
-msgid "Connect to %1"
-msgstr "连接到 %1"
-
-#: engine_dialog.cc:2190
-msgid "Inactive"
-msgstr "未激活"
-
-#: export_channel_selector.cc:45 sfdb_ui.cc:151
-msgid "Channels:"
-msgstr "声道:"
-
-#: export_channel_selector.cc:46
-msgid "Split to mono files"
-msgstr "拆分到单声道文件"
-
-#: export_channel_selector.cc:182
-msgid "Bus or Track"
-msgstr "总线或音轨"
-
-#: export_channel_selector.cc:459
-msgid "Region contents without fades nor region gain (channels: %1)"
-msgstr "区域内容没有淡化也没有区域增益(声道: %1)"
-
-#: export_channel_selector.cc:463
-msgid "Region contents with fades and region gain (channels: %1)"
-msgstr "区域内容带有淡化和区域增益(声道: %1)"
-
-#: export_channel_selector.cc:467
-msgid "Track output (channels: %1)"
-msgstr "音轨输出 (声道: %1)"
-
-#: export_channel_selector.cc:536
-msgid "Export region contents"
-msgstr "导出区域内容"
-
-#: export_channel_selector.cc:537
-msgid "Export track output"
-msgstr "导出音轨输出"
-
-#: export_dialog.cc:46
-msgid ""
-"<span color=\"#ffa755\">Some already existing files will be overwritten.</span>"
-msgstr "<span color=\"#ffa755\">一些已存在的文件将会被写入覆盖。</span>"
-
-#: export_dialog.cc:47
-msgid "List files"
-msgstr "列表文件"
-
-#: export_dialog.cc:158 export_format_dialog.cc:59
-msgid "File format"
-msgstr "文件格式"
-
-#: export_dialog.cc:159 export_timespan_selector.cc:374
-#: export_timespan_selector.cc:436
-msgid "Time Span"
-msgstr "时间跨度"
-
-#: export_dialog.cc:160
-msgid "Channels"
-msgstr "声道"
-
-#: export_dialog.cc:182
-msgid ""
-"Export has been aborted due to an error!\n"
-"See the Log for details."
-msgstr ""
-"导出意外中止,因为有个错误!\n"
-"详情请见日志。"
-
-#: export_dialog.cc:251
-msgid "Files that will be overwritten"
-msgstr "将会被被写入覆盖的文件"
-
-#: export_dialog.cc:296
-msgid "Export initialization failed: %1"
-msgstr "导出初始化失败: %1"
-
-#: export_dialog.cc:306
-msgid "Stop Export"
-msgstr "Stop Export 停止导出"
-
-#: export_dialog.cc:327
-msgid "export"
-msgstr "导出"
-
-#: export_dialog.cc:346
-msgid "Normalizing '%3' (timespan %1 of %2)"
-msgstr "规范化 '%3' (时间跨度 %1 的 %2)"
-
-#: export_dialog.cc:350
-msgid "Exporting '%3' (timespan %1 of %2)"
-msgstr "导出 '%3' (时间跨度 %1 的 %2)"
-
-#: export_dialog.cc:373 export_dialog.cc:375
-msgid "<span color=\"#ffa755\">Error: "
-msgstr "<span color=\"#ffa755\">错误:"
-
-#: export_dialog.cc:385
-msgid "<span color=\"#ffa755\">Warning: "
-msgstr "<span color=\"#ffa755\">警告:"
-
-#: export_dialog.cc:387
-msgid ""
-"\n"
-"<span color=\"#ffa755\">Warning: "
-msgstr ""
-"\n"
-"<span color=\"#ffa755\">警告:"
-
-#: export_dialog.cc:411
-msgid "Export Selection"
-msgstr "导出已选择部分"
-
-#: export_dialog.cc:425
-msgid "Export Region"
-msgstr "导出区域"
-
-#: export_dialog.cc:434
-msgid "Source"
-msgstr "源"
-
-#: export_dialog.cc:450
-msgid "Stem Export"
-msgstr "逆向导出"
-
-#: export_file_notebook.cc:39
-msgid "Add another format"
-msgstr "添加另一个格式"
-
-#: export_file_notebook.cc:193
-msgid "Format"
-msgstr "格式"
-
-#: export_file_notebook.cc:194
-msgid "Location"
-msgstr "位置"
-
-#: export_file_notebook.cc:195
-msgid "Upload to Soundcloud"
-msgstr "上传到Soundcloud"
-
-#: export_file_notebook.cc:273
-msgid "No format!"
-msgstr "不格式化!"
-
-#: export_file_notebook.cc:291
-msgid "Format %1: %2"
-msgstr "格式化 %1: %2"
-
-#: export_filename_selector.cc:32
-msgid "Label:"
-msgstr "标签:"
-
-#: export_filename_selector.cc:33
-msgid "Session Name"
-msgstr "会话名称"
-
-#: export_filename_selector.cc:34
-msgid "Revision:"
-msgstr "修订版本:"
-
-#: export_filename_selector.cc:36
-msgid "Folder:"
-msgstr "文件夹:"
-
-#: export_filename_selector.cc:37 session_import_dialog.cc:45
-#: transcode_video_dialog.cc:59 video_server_dialog.cc:54 video_server_dialog.cc:56
-#: export_video_dialog.cc:81 export_video_dialog.cc:83
-msgid "Browse"
-msgstr "浏览"
-
-#: export_filename_selector.cc:41
-msgid "<i>Build filename(s) from these components:</i>"
-msgstr "<i>从这些组件构建文件名:</i>"
-
-#: export_filename_selector.cc:212
-msgid "<small><i>Sorry, no example filename can be shown at the moment</i></small>"
-msgstr "<small><i>对不起,目前没有例子文件名可以显示</i></small>"
-
-#: export_filename_selector.cc:214
-msgid "<small><i>Current (approximate) filename: \"%1\"</i></small>"
-msgstr "<small><i>当前(近似)文件名: ”%1“</i></small>"
-
-#: export_filename_selector.cc:250 export_filename_selector.cc:336
-msgid ""
-"%1: this is only the directory/folder name, not the filename.\n"
-"The filename will be chosen from the information just above the folder selector."
-msgstr ""
-"%1:这仅是目录/文件夹名称,不是文件名\n"
-"将会从刚才上面的文件选择器信息里选出文件名。"
-
-#: export_filename_selector.cc:322
-msgid "Choose export folder"
-msgstr "选择导出文件夹"
-
-#: export_format_dialog.cc:31
-msgid "New Export Format Profile"
-msgstr "新建导出格式配置文件"
-
-#: export_format_dialog.cc:31
-msgid "Edit Export Format Profile"
-msgstr "编辑导出格式配置文件"
-
-#: export_format_dialog.cc:38
-msgid "Label: "
-msgstr "标签:"
-
-#: export_format_dialog.cc:41 normalize_dialog.cc:42
-msgid "Normalize to:"
-msgstr "规范化到:"
-
-#: export_format_dialog.cc:46
-msgid "Trim silence at start"
-msgstr "在起点修剪无声"
-
-#: export_format_dialog.cc:47
-msgid "Add silence at start:"
-msgstr "在起点添加无声:"
-
-#: export_format_dialog.cc:50
-msgid "Trim silence at end"
-msgstr "在终点修剪无声"
-
-#: export_format_dialog.cc:51
-msgid "Add silence at end:"
-msgstr "在终点添加无声:"
-
-#: export_format_dialog.cc:54
-msgid ""
-"Command to run post-export\n"
-"(%f=full path & filename, %d=directory, %b=basename):"
-msgstr ""
-"运行后置-导出的命令\n"
-"(%f=完整路径和文件名,%d=目录,%b=基本名称):"
-
-#: export_format_dialog.cc:57
-msgid "Compatibility"
-msgstr "兼容性"
-
-#: export_format_dialog.cc:58
-msgid "Quality"
-msgstr "质量"
-
-#: export_format_dialog.cc:61
-msgid "Sample rate conversion quality:"
-msgstr "采样率转换质量:"
-
-#: export_format_dialog.cc:68
-msgid "Dithering"
-msgstr "抖动"
-
-# CUE  cuesheet 是指光盘映像(镜像)辅助文件或称标记文件
-#: export_format_dialog.cc:70
-msgid "Create CUE file for disk-at-once CD/DVD creation"
-msgstr "为创建一次性CD/DVD光盘而创建CUE文件"
-
-# 目录数据 (Table of Content,TOC)
-#: export_format_dialog.cc:71
-msgid "Create TOC file for disk-at-once CD/DVD creation"
-msgstr "为创建一次性CD/DVD光盘而创建TOC文件"
-
-#: export_format_dialog.cc:73
-msgid "Tag file with session's metadata"
-msgstr "会话元数据的标签文件"
-
-#: export_format_dialog.cc:470
-msgid "Best (sinc)"
-msgstr "最佳(sinc)"
-
-#: export_format_dialog.cc:475
-msgid "Medium (sinc)"
-msgstr "中等(sinc)"
-
-#: export_format_dialog.cc:480
-msgid "Fast (sinc)"
-msgstr "快速(sinc)"
-
-#: export_format_dialog.cc:490
-msgid "Zero order hold"
-msgstr "零阶保持"
-
-#: export_format_dialog.cc:895
-msgid "Linear encoding options"
-msgstr "线性编码选项"
-
-#: export_format_dialog.cc:911
-msgid "Ogg Vorbis options"
-msgstr "Ogg Vorbis 选项"
-
-#: export_format_dialog.cc:922
-msgid "FLAC options"
-msgstr "FLAC 选项"
-
-#: export_format_dialog.cc:939
-msgid "Broadcast Wave options"
-msgstr "广播Wave选项"
-
-#: export_format_selector.cc:136
-msgid "Do you really want to remove the format?"
-msgstr "您是否真的要移除这个格式?"
-
-#: export_preset_selector.cc:28
-msgid "Preset"
-msgstr "预设"
-
-#: export_preset_selector.cc:104
-msgid ""
-"The selected preset did not load successfully!\n"
-"Perhaps it references a format that has been removed?"
-msgstr ""
-"被选中的预设载入失败!\n"
-"也许它引用了一个已被删除的格式?"
-
-#: export_preset_selector.cc:156
-msgid "Do you really want to remove this preset?"
-msgstr "您是否真的要移除这个预设?"
-
-#: export_timespan_selector.cc:46
-msgid "Show Times as:"
-msgstr "显示时间为:"
-
-#: export_timespan_selector.cc:53 processor_box.cc:2466
-msgid "Select All"
-msgstr "选择所有"
-
-#: export_timespan_selector.cc:223 transform_dialog.cc:93
-msgid " to "
-msgstr "到"
-
-#: export_timespan_selector.cc:367 export_timespan_selector.cc:426
-msgid "Range"
-msgstr "范围"
-
-#: sfdb_freesound_mootcher.cc:189 sfdb_freesound_mootcher.cc:324
-msgid "curl error %1 (%2)"
-msgstr "回旋错误 %1 (%2)"
-
-#: sfdb_freesound_mootcher.cc:266
-msgid "getSoundResourceFile: There is no valid root in the xml file"
-msgstr "获取声音资源文件:在 xml 文件里没有正确的根"
-
-#: sfdb_freesound_mootcher.cc:271
-msgid "getSoundResourceFile: root = %1, != response"
-msgstr "获取声音资源文件:根 = %1, ! = 响应"
-
-#: sfdb_freesound_mootcher.cc:410 rc_option_editor.cc:1824
-msgid "%1"
-msgstr ""
-
-#: gain_meter.cc:132 gain_meter.cc:400 gain_meter.cc:505 gain_meter.cc:896
-msgid "-inf"
-msgstr ""
-
-#: gain_meter.cc:147 gain_meter.cc:958
-msgid "Fader automation mode"
-msgstr "淡化器自动模式"
-
-#: gain_meter.cc:148 gain_meter.cc:959
-msgid "Fader automation type"
-msgstr "淡化器自动类型"
-
-#: gain_meter.cc:157 gain_meter.cc:829 panner_ui.cc:179 panner_ui.cc:639
-msgid "Abs"
-msgstr ""
-
-#: gain_meter.cc:796 mixer_strip.cc:2049 meter_strip.cc:374 panner_ui.cc:606
-#: route_time_axis.cc:104 route_time_axis.cc:2705
-msgid "P"
-msgstr ""
-
-#: gain_meter.cc:799 panner_ui.cc:609
-msgid "T"
-msgstr ""
-
-#: gain_meter.cc:802 panner_ui.cc:612
-msgid "W"
-msgstr ""
-
-#: generic_pluginui.cc:83
-msgid "<span size=\"large\">Presets</span>"
-msgstr "<span size=\"large\">预设</span>"
-
-#: generic_pluginui.cc:97
-msgid "Manual"
-msgstr "手册"
-
-#: generic_pluginui.cc:106
-msgid "All Automation"
-msgstr "全部自动化"
-
-#: generic_pluginui.cc:250
-msgid "Switches"
-msgstr "转换"
-
-#: generic_pluginui.cc:260 generic_pluginui.cc:436 processor_box.cc:2440
-msgid "Controls"
-msgstr "控制"
-
-#: generic_pluginui.cc:293
-msgid "Plugin Editor: could not build control element for port %1"
-msgstr "插件编辑器:无法为端口 %1 建立控制元素"
-
-#: generic_pluginui.cc:318
-msgid "Plugin Editor: no control for property %1"
-msgstr "插件编辑器:无法控制 %1 属性"
-
-#: generic_pluginui.cc:324
-msgid "Plugin Editor: could not build control element for property %1"
-msgstr "插件编辑器:无法为 %1 属性建立控制元素"
-
-#: generic_pluginui.cc:468
-msgid "Meters"
-msgstr "节拍"
-
-#: generic_pluginui.cc:490
-msgid "Automation control"
-msgstr "自动控制"
-
-#: generic_pluginui.cc:497
-msgid "Mgnual"
-msgstr ""
-
-#: global_port_matrix.cc:158
-msgid "Audio Connection Manager"
-msgstr "音频连结管理器"
-
-#: global_port_matrix.cc:161
-msgid "MIDI Connection Manager"
-msgstr "MIDI连接管理器"
-
-#: global_port_matrix.cc:201 io_selector.cc:211 mixer_strip.cc:793
-#: mixer_strip.cc:894
-msgid "Disconnect"
-msgstr "取消连接"
-
-#: global_port_matrix.cc:207 io_selector.cc:217
-msgid "port"
-msgstr "端口"
-
-#: group_tabs.cc:312
-msgid "Selection..."
-msgstr "已选择部分…"
-
-#: group_tabs.cc:313
-msgid "Record Enabled..."
-msgstr "启用录制…"
-
-#: group_tabs.cc:314
-msgid "Soloed..."
-msgstr "独奏…"
-
-#: group_tabs.cc:320
-msgid "Create New Group ..."
-msgstr "创建新的分组…"
-
-#: group_tabs.cc:321
-msgid "Create New Group From"
-msgstr "创建新的分组来自于"
-
-#: group_tabs.cc:324
-msgid "Edit Group..."
-msgstr "编辑分组…"
-
-#: group_tabs.cc:325
-msgid "Collect Group"
-msgstr "收集分组"
-
-#: group_tabs.cc:326
-msgid "Remove Group"
-msgstr "移除分组"
-
-#: group_tabs.cc:329
-msgid "Remove Subgroup Bus"
-msgstr "移除次级分组总线"
-
-#: group_tabs.cc:331
-msgid "Add New Subgroup Bus"
-msgstr "添加新的次级分组总线"
-
-#: group_tabs.cc:333
-msgid "Add New Aux Bus (pre-fader)"
-msgstr "添加新的辅助总线(前置淡化)"
-
-#: group_tabs.cc:334
-msgid "Add New Aux Bus (post-fader)"
-msgstr "添加新的辅助总线(后置淡化)"
-
-#: group_tabs.cc:340
-msgid "Enable All Groups"
-msgstr "启用所有分组"
-
-#: group_tabs.cc:341
-msgid "Disable All Groups"
-msgstr "禁用所有分组"
-
-#: insert_time_dialog.cc:46
-msgid "Time to insert:"
-msgstr "要插入的时间位置:"
-
-#: insert_time_dialog.cc:54
-msgid "Intersected regions should:"
-msgstr "相交的区域应该:"
-
-#: insert_time_dialog.cc:57
-msgid "stay in position"
-msgstr "停留在原位"
-
-#: insert_time_dialog.cc:58
-msgid "move"
-msgstr "移动"
-
-#: insert_time_dialog.cc:59
-msgid "be split"
-msgstr "拆分"
-
-#: insert_time_dialog.cc:65
-msgid "Insert time on all the track's playlists"
-msgstr "在所有的音轨播放列表上插入时间"
-
-#: insert_time_dialog.cc:68
-msgid "Move glued regions"
-msgstr "移动被粘连的区域"
-
-#: insert_time_dialog.cc:70
-msgid "Move markers"
-msgstr "移动标记"
-
-#: insert_time_dialog.cc:73
-msgid "Move glued markers"
-msgstr "移动被粘连的标记"
-
-#: insert_time_dialog.cc:78
-msgid "Move locked markers"
-msgstr "移动被锁定的标记"
-
-#: insert_time_dialog.cc:83
-msgid ""
-"Move tempo and meter changes\n"
-"<i>(may cause oddities in the tempo map)</i>"
-msgstr ""
-"移动节奏和节拍变化\n"
-"(也许会在节奏图中引发异常)"
-
-#: insert_time_dialog.cc:91
-msgid "Insert time"
-msgstr "插入时间"
-
-#: instrument_selector.cc:62
-msgid "-none-"
-msgstr "— 无 —"
-
-#: interthread_progress_window.cc:103
-msgid "Importing file: %1 of %2"
-msgstr "导入文件: %2 的 %1"
-
-#: io_selector.cc:221
-msgid "I/O selector"
-msgstr "输入/输出选择器"
-
-#: io_selector.cc:266
-msgid "%1 input"
-msgstr "%1 输入"
-
-#: io_selector.cc:268
-msgid "%1 output"
-msgstr "%1 输出"
-
-#: keyboard.cc:70
-msgid "your own"
-msgstr "您自己的"
-
-#: keyboard.cc:133 keyboard.cc:157
-msgid "Default keybindings not found - %1 will be hard to use!"
-msgstr "找不到默认的按键绑定—— %1 将很难使用!"
-
-#: keyboard.cc:136
-msgid "Key bindings file \"%1\" not found. Default bindings used instead"
-msgstr "找不到按键绑定文件 \"%1\"。使用默认绑定替代。"
-
-#: keyeditor.cc:54
-msgid "Remove shortcut"
-msgstr "移除快捷键"
-
-#: keyeditor.cc:63
-msgid "Action"
-msgstr "操作"
-
-#: keyeditor.cc:64
-msgid "Shortcut"
-msgstr "快捷键"
-
-#: keyeditor.cc:84
-msgid "Select an action, then press the key(s) to (re)set its shortcut"
-msgstr "选择一个操作,然后按下按键来(重新)设置快捷键"
-
-#: keyeditor.cc:98
-msgid "Reset Bindings to Defaults"
-msgstr "重置为默认绑定"
-
-#: keyeditor.cc:263
-msgid "Main_menu"
-msgstr "主菜单"
-
-#: keyeditor.cc:265
-msgid "redirectmenu"
-msgstr "重定向菜单"
-
-#: keyeditor.cc:267
-msgid "Editor_menus"
-msgstr "编辑器菜单"
-
-#: keyeditor.cc:269
-msgid "RegionList"
-msgstr "区域列表"
-
-#: keyeditor.cc:271
-msgid "ProcessorMenu"
-msgstr "处理器菜单"
-
-#: latency_gui.cc:40
-msgid "msec"
-msgstr "毫秒"
-
-#: latency_gui.cc:41
-msgid "period"
-msgstr "周期"
-
-#: latency_gui.cc:55
-msgid "%1 sample"
-msgid_plural "%1 samples"
-msgstr[0] "%1 采样"
-
-#: latency_gui.cc:72 panner_ui.cc:409
-msgid "Reset"
-msgstr "预设"
-
-#: latency_gui.cc:149 rhythm_ferret.cc:273 sfdb_ui.cc:1912
-msgid "programming error: %1 (%2)"
-msgstr "程序错误: %1 (%2)"
-
-#: location_ui.cc:52 location_ui.cc:54
-msgid "Use PH"
-msgstr "使用 PH"
-
-#: location_ui.cc:59
-msgid "Glue"
-msgstr "粘连"
-
-#: location_ui.cc:87
-msgid "Performer:"
-msgstr "演奏者:"
-
-#: location_ui.cc:88
-msgid "Composer:"
-msgstr "作曲家:"
-
-#: location_ui.cc:90
-msgid "Pre-Emphasis"
-msgstr "预加重"
-
-#: location_ui.cc:317
-msgid "Remove this range"
-msgstr "移除这个范围"
-
-#: location_ui.cc:318
-msgid "Start time - middle click to locate here"
-msgstr "起点时间——鼠标中键点击放置在此处"
-
-#: location_ui.cc:319
-msgid "End time - middle click to locate here"
-msgstr "终点时间——鼠标中键点击放置在此处"
-
-#: location_ui.cc:322
-msgid "Set range start from playhead location"
-msgstr "从指针位置设置范围起点"
-
-#: location_ui.cc:323
-msgid "Set range end from playhead location"
-msgstr "从指针位置设置范围终点"
-
-#: location_ui.cc:327
-msgid "Remove this marker"
-msgstr "移除这个标记"
-
-#: location_ui.cc:328
-msgid "Position - middle click to locate here"
-msgstr "位置——鼠标中键点击放置在此处"
-
-#: location_ui.cc:330
-msgid "Set marker time from playhead location"
-msgstr "从指针位置设置标记时间"
-
-#: location_ui.cc:499
-msgid "You cannot put a CD marker at the start of the session"
-msgstr "您不能在会话起点处放置CD标记"
-
-#: location_ui.cc:725
-msgid "New Marker"
-msgstr "新建标记"
-
-#: location_ui.cc:726
-msgid "New Range"
-msgstr "新建范围"
-
-#: location_ui.cc:739
-msgid "<b>Loop/Punch Ranges</b>"
-msgstr "<b>循环/切换范围</b>"
-
-#: location_ui.cc:764
-msgid "<b>Markers (Including CD Index)</b>"
-msgstr "<b>标记(包括CD索引)</b>"
-
-#: location_ui.cc:799
-msgid "<b>Ranges (Including CD Track Ranges)</b>"
-msgstr "<b>范围(包括CD音轨范围)</b>"
-
-#: location_ui.cc:1042
-msgid "add range marker"
-msgstr "添加范围标记"
-
-#: main.cc:82
-msgid "%1 could not connect to the audio backend."
-msgstr "%1无法连接到音频后端。"
-
-#: main.cc:107 main.cc:123
-msgid "The audio backend (%1) has failed, or terminated"
-msgstr "音频后端(%1)失效或者中止。"
-
-#: main.cc:110
-msgid ""
-"%2 exited unexpectedly, and without notifying %1.\n"
-"\n"
-"This could be due to misconfiguration or to an error inside %2.\n"
-"\n"
-"Click OK to exit %1."
-msgstr ""
-"%2 意外退出,且没有通知 %1 。\n"
-"\n"
-"这可能是由于错误配置或者定向到错误 %2 内部错误。\n"
-"点击 OK 退出 %1。"
-
-#: main.cc:124
-msgid "%2 exited unexpectedly, and without notifying %1."
-msgstr "%2 exited unexpectedly, and without notifying %1."
-
-#: main.cc:219
-msgid ""
-"\n"
-"   %1 could not understand your command line      "
-msgstr ""
-"\n"
-"   %1 无法识别您的命令行      "
-
-#: main.cc:221
-msgid "An error was encountered while launching %1"
-msgstr "启动 %1 时遇到一个意外错误"
-
-#: main.cc:310
-msgid " (built using "
-msgstr "(构建使用 "
-
-#: main.cc:313
-msgid " and GCC version "
-msgstr "和 GCC 版本 "
-
-#: main.cc:323
-msgid "Copyright (C) 1999-2012 Paul Davis"
-msgstr " 版权 (C) 1999-2012 Paul Davis"
-
-#: main.cc:324
-msgid ""
-"Some portions Copyright (C) Steve Harris, Ari Johnson, Brett Viren, Joel Baker, "
-"Robin Gareus"
-msgstr ""
-"部分版权 (C) Steve Harris, Ari Johnson, Brett Viren, Joel Baker, Robin Gareus"
-
-#: main.cc:326
-msgid "%1 comes with ABSOLUTELY NO WARRANTY"
-msgstr "%1 绝对不附带任何担保"
-
-#: main.cc:327
-msgid "not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
-msgstr " 甚至不包括可销售性质和适用于任何特定目的的保证。"
-
-#: main.cc:328
-msgid "This is free software, and you are welcome to redistribute it "
-msgstr "这是自由软件,且欢迎您分发推广它,"
-
-#: main.cc:329
-msgid "under certain conditions; see the source for copying conditions."
-msgstr "在一定条件下;请参阅复制协议的源文件。"
-
-#: main.cc:334
-msgid "could not initialize %1."
-msgstr "无法初始化 %1 。"
-
-#: main.cc:344
-msgid "Cannot xinstall SIGPIPE error handler"
-msgstr "无法安装卸载 SIGPIPE 错误处理程序"
-
-#: main.cc:351
-msgid "could not create %1 GUI"
-msgstr "无法创建  %1 图形用户界面"
-
-#: main_clock.cc:52
-msgid "Display delta to edit cursor"
-msgstr "显示次级以编辑游标"
-
-#: marker.cc:273
-msgid "MarkerText"
-msgstr "标记文本"
-
-#: midi_channel_selector.cc:161 midi_channel_selector.cc:400
-#: midi_channel_selector.cc:436 rc_option_editor.cc:1573 rc_option_editor.cc:2203
-#: sfdb_ui.cc:665
-msgid "None"
-msgstr "æ— "
-
-#: midi_channel_selector.cc:165 midi_channel_selector.cc:405
-#: midi_channel_selector.cc:441
-msgid "Invert"
-msgstr "反转"
-
-#: midi_channel_selector.cc:169
-msgid "Force"
-msgstr "强制"
-
-#: midi_channel_selector.cc:328 midi_channel_selector.cc:370
-msgid "MIDI Channel Control"
-msgstr "MIDI 声道控制"
-
-#: midi_channel_selector.cc:330
-msgid "Playback all channels"
-msgstr "回放所有声道"
-
-#: midi_channel_selector.cc:331
-msgid "Play only selected channels"
-msgstr "仅播放已选中的声道"
-
-#: midi_channel_selector.cc:332
-msgid "Use a single fixed channel for all playback"
-msgstr "所有回放使用一个单独固定的声道"
-
-#: midi_channel_selector.cc:333
-msgid "Record all channels"
-msgstr "录制所有声道"
-
-#: midi_channel_selector.cc:334
-msgid "Record only selected channels"
-msgstr "仅录制已选中的声道"
-
-#: midi_channel_selector.cc:335
-msgid "Force all channels to 1 channel"
-msgstr "强制所有声道为 1 声道"
-
-#: midi_channel_selector.cc:376
-msgid "Inbound"
-msgstr "进场"
-
-#: midi_channel_selector.cc:396
-msgid "Click to enable recording all channels"
-msgstr "点击启用录制所有声道"
-
-#: midi_channel_selector.cc:401
-msgid "Click to disable recording all channels"
-msgstr "点击禁用录制所有声道"
-
-#: midi_channel_selector.cc:406
-msgid "Click to invert currently selected recording channels"
-msgstr "点击反转当前已选择的录制声道"
-
-#: midi_channel_selector.cc:413
-msgid "Playback"
-msgstr "回放"
-
-#: midi_channel_selector.cc:432
-msgid "Click to enable playback of all channels"
-msgstr "点击启用回放所有声道"
-
-#: midi_channel_selector.cc:437
-msgid "Click to disable playback of all channels"
-msgstr "点击禁用回放所有声道"
-
-#: midi_channel_selector.cc:442
-msgid "Click to invert current selected playback channels"
-msgstr "点击反转当前已选择的回放声道"
-
-#: midi_channel_selector.cc:620
-msgid "Click to toggle playback of channel %1"
-msgstr "点击切换回放声道 %1"
-
-#: midi_channel_selector.cc:628
-msgid "Click to force all MIDI channel messages to channel %1"
-msgstr "点击强制所有MIDI声道发送信息到声道 %1"
-
-#: midi_channel_selector.cc:718
-msgid "Click to toggle recording of channel %1"
-msgstr "点击切换录制声道 %1"
-
-#: midi_channel_selector.cc:726
-msgid "Click to force all recorded channels to %1"
-msgstr "点击强制所有已录制声道到 %1"
-
-#: midi_export_dialog.cc:35
-msgid "Export MIDI: %1"
-msgstr "导出MIDI: %1"
-
-#: midi_list_editor.cc:56
-msgid "Whole"
-msgstr "整体"
-
-#: midi_list_editor.cc:57
-msgid "Half"
-msgstr "一半"
-
-#: midi_list_editor.cc:58
-msgid "Triplet"
-msgstr "三分之一"
-
-#: midi_list_editor.cc:59
-msgid "Quarter"
-msgstr "四分之一"
-
-#: midi_list_editor.cc:60
-msgid "Eighth"
-msgstr "八分之一"
-
-#: midi_list_editor.cc:61
-msgid "Sixteenth"
-msgstr "十六分之一"
-
-#: midi_list_editor.cc:62
-msgid "Thirty-second"
-msgstr "三十二分之一"
-
-#: midi_list_editor.cc:63
-msgid "Sixty-fourth"
-msgstr "六十四分之一"
-
-#: midi_list_editor.cc:106
-msgid "Num"
-msgstr "数值"
-
-#: midi_list_editor.cc:108
-msgid "Vel"
-msgstr "力度"
-
-#: midi_list_editor.cc:216
-msgid "edit note start"
-msgstr "编辑音符起点"
-
-#: midi_list_editor.cc:225
-msgid "edit note channel"
-msgstr "编辑音符声道"
-
-#: midi_list_editor.cc:235
-msgid "edit note number"
-msgstr "编辑音符编号"
-
-#: midi_list_editor.cc:245
-msgid "edit note velocity"
-msgstr "编辑音符力度"
-
-#: midi_list_editor.cc:259
-msgid "edit note length"
-msgstr "编辑音符长度"
-
-#: midi_list_editor.cc:463
-msgid "insert new note"
-msgstr "插入新的音符"
-
-#: midi_list_editor.cc:527
-msgid "delete notes (from list)"
-msgstr "删除音符(从列表中)"
-
-#: midi_list_editor.cc:602
-msgid "change note channel"
-msgstr "切换音符声道"
-
-#: midi_list_editor.cc:610
-msgid "change note number"
-msgstr "切换音符编号"
-
-#: midi_list_editor.cc:620
-msgid "change note velocity"
-msgstr "切换音符力度"
-
-#: midi_list_editor.cc:690
-msgid "change note length"
-msgstr "切换音符长度"
-
-#: midi_port_dialog.cc:39
-msgid "Add MIDI Port"
-msgstr "添加MIDI端口"
-
-#: midi_port_dialog.cc:40
-msgid "Port name:"
-msgstr "端口名称:"
-
-#: midi_port_dialog.cc:45
-msgid "MidiPortDialog"
-msgstr "MIDI端口对话框"
-
-#: midi_region_view.cc:859
-msgid "channel edit"
-msgstr "声道编辑"
-
-#: midi_region_view.cc:895
-msgid "velocity edit"
-msgstr "力度编辑"
-
-#: midi_region_view.cc:954
-msgid "add note"
-msgstr "添加音符"
-
-#: midi_region_view.cc:1885
-msgid "step add"
-msgstr "步进添加"
-
-#: midi_region_view.cc:1979 midi_region_view.cc:2002
-msgid "alter patch change"
-msgstr "更改音色变换"
-
-#: midi_region_view.cc:2038
-msgid "add patch change"
-msgstr "添加音色变换"
-
-#: midi_region_view.cc:2060 midi_region_view.cc:2061
-msgid "move patch change"
-msgstr "移动音色变换"
-
-#: midi_region_view.cc:2073 midi_region_view.cc:2074
-msgid "delete patch change"
-msgstr "删除音色变换"
-
-#: midi_region_view.cc:2112
-msgid "delete selection"
-msgstr "删除已选取部分"
-
-#: midi_region_view.cc:2128
-msgid "delete note"
-msgstr "删除音符"
-
-#: midi_region_view.cc:2587
-msgid "move notes"
-msgstr "移动音符"
-
-#: midi_region_view.cc:3070
-msgid "change velocities"
-msgstr "改变力度"
-
-#: midi_region_view.cc:3136
-msgid "transpose"
-msgstr "变调"
-
-#: midi_region_view.cc:3164
-msgid "change note lengths"
-msgstr "改变音符长度"
-
-#: midi_region_view.cc:3240
-msgid "nudge"
-msgstr "微调"
-
-#: midi_region_view.cc:3255
-msgid "change channel"
-msgstr "改变声道"
-
-#: midi_region_view.cc:3295
-msgid "Bank "
-msgstr "库"
-
-#: midi_region_view.cc:3296
-msgid "Program "
-msgstr "程序"
-
-#: midi_region_view.cc:3297
-msgid "Channel "
-msgstr "声道"
-
-#: midi_region_view.cc:3484
-msgid "paste"
-msgstr "粘贴"
-
-#: midi_streamview.cc:185
-msgid "attempt to display MIDI region with no source"
-msgstr "尝试显示无来源的 MIDI 区域"
-
-#: midi_streamview.cc:195
-msgid "attempt to display MIDI region with no model"
-msgstr "尝试显示无模式的 MIDI 区域"
-
-#: midi_streamview.cc:506
-msgid "failed to create MIDI region"
-msgstr "创建 MIDI 区域失败"
-
-#: midi_time_axis.cc:309
-msgid "External MIDI Device"
-msgstr "外部 MIDI 设备"
-
-#: midi_time_axis.cc:310
-msgid "External Device Mode"
-msgstr "外部设备模式"
-
-#: midi_time_axis.cc:318
-msgid "Chns"
-msgstr "声道"
-
-#: midi_time_axis.cc:320
-msgid "Click to edit channel settings"
-msgstr "点击编辑声道设置"
-
-#: midi_time_axis.cc:519
-msgid "Show Full Range"
-msgstr "显示全部范围"
-
-#: midi_time_axis.cc:524
-msgid "Fit Contents"
-msgstr "匹配内容"
-
-#: midi_time_axis.cc:528
-msgid "Note Range"
-msgstr "音符范围"
-
-#: midi_time_axis.cc:529
-msgid "Note Mode"
-msgstr "音符模式"
-
-#: midi_time_axis.cc:530
-msgid "Channel Selector"
-msgstr "声道选择器"
-
-#: midi_time_axis.cc:535
-msgid "Color Mode"
-msgstr "颜色模式"
-
-#: midi_time_axis.cc:594
-msgid "Bender"
-msgstr "滑音器"
-
-#: midi_time_axis.cc:598
-msgid "Pressure"
-msgstr "压力"
-
-#: midi_time_axis.cc:610
-msgid "Controllers"
-msgstr "控制器 "
-
-#: midi_time_axis.cc:615
-msgid "No MIDI Channels selected"
-msgstr "未选择 MIDI 声道"
-
-#: midi_time_axis.cc:672 midi_time_axis.cc:801
-msgid "Hide all channels"
-msgstr "隐藏所有声道"
-
-#: midi_time_axis.cc:676 midi_time_axis.cc:805
-msgid "Show all channels"
-msgstr "显示所有声道"
-
-#: midi_time_axis.cc:687 midi_time_axis.cc:816
-msgid "Channel %1"
-msgstr "声道 %1"
-
-#: midi_time_axis.cc:942 midi_time_axis.cc:974
-msgid "Controllers %1-%2"
-msgstr "控制器 %1-%2"
-
-#: midi_time_axis.cc:965 midi_time_axis.cc:968
-msgid "Controller %1"
-msgstr "控制器 %1"
-
-#: midi_time_axis.cc:991
-msgid "Sustained"
-msgstr "持续"
-
-#: midi_time_axis.cc:998
-msgid "Percussive"
-msgstr "敲击"
-
-#: midi_time_axis.cc:1018
-msgid "Meter Colors"
-msgstr "节拍颜色"
-
-#: midi_time_axis.cc:1025
-msgid "Channel Colors"
-msgstr " 声道颜色"
-
-#: midi_time_axis.cc:1032
-msgid "Track Color"
-msgstr "音轨颜色"
-
-#: midi_time_axis.cc:1606 midi_time_axis.cc:1612 midi_time_axis.cc:1622
-#: midi_time_axis.cc:1628
-msgid "all"
-msgstr "所有"
-
-#: midi_time_axis.cc:1609 midi_time_axis.cc:1625
-msgid "some"
-msgstr "一些"
-
-#: midi_tracer.cc:48
-msgid "Line history: "
-msgstr "线条历史:"
-
-#: midi_tracer.cc:55
-msgid "Auto-Scroll"
-msgstr "自动滚动"
-
-#: midi_tracer.cc:56
-msgid "Decimal"
-msgstr "十进制"
-
-#: midi_tracer.cc:57 rc_option_editor.cc:740
-msgid "Enabled"
-msgstr "启用"
-
-#: midi_tracer.cc:58
-msgid "Delta times"
-msgstr "次级时间"
-
-#: midi_tracer.cc:71
-msgid "Port:"
-msgstr "端口:"
-
-#: midi_velocity_dialog.cc:31
-msgid "New velocity"
-msgstr "新建力度"
-
-#: missing_file_dialog.cc:35
-msgid "Missing File"
-msgstr "缺失文件"
-
-#: missing_file_dialog.cc:37
-msgid "Select a folder to search"
-msgstr "选择一个要搜索的文件夹"
-
-#: missing_file_dialog.cc:38
-msgid "Add chosen folder to search path, and try again"
-msgstr "请添加已选择的文件夹到搜索路径,然后再试一次"
-
-#: missing_file_dialog.cc:40
-msgid "Stop loading this session"
-msgstr "停止载入此会话"
-
-#: missing_file_dialog.cc:41
-msgid "Skip all missing files"
-msgstr "跳过所有缺失的文件"
-
-#: missing_file_dialog.cc:42
-msgid "Skip this file"
-msgstr "跳过这个文件"
-
-#: missing_file_dialog.cc:53
-msgid "audio"
-msgstr "音频"
-
-#: missing_file_dialog.cc:70
-msgid ""
-"%1 cannot find the %2 file\n"
-"\n"
-"<i>%3</i>\n"
-"\n"
-"in any of these folders:\n"
-"\n"
-"<tt>%4</tt>\n"
-"\n"
-msgstr ""
-"%1 找不到文件 %2\n"
-"\n"
-"<i>%3</i>\n"
-"\n"
-"在下列任何文件夹中:\n"
-"\n"
-"<tt>%4</tt>\n"
-"\n"
-
-#: missing_file_dialog.cc:104
-msgid "Click to choose an additional folder"
-msgstr "点击选择一个额外的文件夹"
-
-#: missing_plugin_dialog.cc:29
-msgid "Missing Plugins"
-msgstr "缺失插件"
-
-#: missing_plugin_dialog.cc:33 transcode_video_dialog.cc:60
-msgid "OK"
-msgstr ""
-
-#: mixer_actor.cc:55
-msgid "Toggle Solo on Mixer-Selected Tracks/Busses"
-msgstr "在混音器已选中的音轨/总线上切换独奏"
-
-#: mixer_actor.cc:56
-msgid "Toggle Mute on Mixer-Selected Tracks/Busses"
-msgstr "在混音器已选中的音轨/总线上切换静音"
-
-#: mixer_actor.cc:57
-msgid "Toggle Rec-enable on Mixer-Selected Tracks/Busses"
-msgstr "在混音器已选中的音轨/总线上切换可录制"
-
-#: mixer_actor.cc:58
-msgid "Decrease Gain on Mixer-Selected Tracks/Busses"
-msgstr "在混音器已选中的音轨/总线上减小增益"
-
-#: mixer_actor.cc:59
-msgid "Increase Gain on Mixer-Selected Tracks/Busses"
-msgstr "在混音器已选中的音轨/总线上加大增益"
-
-#: mixer_actor.cc:60
-msgid "Set Gain to 0dB on Mixer-Selected Tracks/Busses"
-msgstr "在混音器已选中的音轨/总线上设置增益为 0dB"
-
-#: mixer_actor.cc:63
-msgid "Copy Selected Processors"
-msgstr "复制已选中的处理器"
-
-#: mixer_actor.cc:64
-msgid "Cut Selected Processors"
-msgstr "剪切已选中的处理器"
-
-#: mixer_actor.cc:65
-msgid "Paste Selected Processors"
-msgstr "粘贴已选中的处理器"
-
-#: mixer_actor.cc:66
-msgid "Delete Selected Processors"
-msgstr "删除已选中的处理器"
-
-#: mixer_actor.cc:67
-msgid "Select All (visible) Processors"
-msgstr "选择所有(可见的)处理器"
-
-#: mixer_actor.cc:68
-msgid "Toggle Selected Processors"
-msgstr "切换已选中的处理器"
-
-#: mixer_actor.cc:69
-msgid "Toggle Selected Plugins"
-msgstr "切换已选中的插件"
-
-#: mixer_actor.cc:70
-msgid "Deselect all strips and processors"
-msgstr "不选中所有片段和处理器"
-
-#: mixer_actor.cc:72 mixer_actor.cc:73
-msgid "Scroll Mixer Window to the left"
-msgstr "滚动混音器窗口到左侧"
-
-#: mixer_actor.cc:75
-msgid "Toggle MIDI Input Active for Mixer-Selected Tracks/Busses"
-msgstr "为混音器已选中的音轨/总线激活切换 MIDI 输入"
-
-#: mixer_actor.cc:90
-msgid "Loaded mixer bindings from %1"
-msgstr "从 %1 载入混音器绑定"
-
-#: mixer_actor.cc:92
-msgid "Could not find mixer.bindings in search path %1"
-msgstr "在搜索路径 %1 找不到混音器绑定"
-
-#: mixer_strip.cc:96 mixer_strip.cc:125
-msgid "pre"
-msgstr "预先"
-
-#: mixer_strip.cc:98 mixer_strip.cc:127 mixer_strip.cc:372 mixer_strip.cc:1410
-#: rc_option_editor.cc:2331
-msgid "Comments"
-msgstr "注释"
-
-#: mixer_strip.cc:149
-msgid "Click to toggle the width of this mixer strip."
-msgstr "点击切换此混音器片段的宽度。"
-
-#: mixer_strip.cc:151
-msgid ""
-"\n"
-"%1-%2-click to toggle the width of all strips."
-msgstr ""
-"\n"
-"%1-%2-点击切换所有片段的宽度。"
-
-#: mixer_strip.cc:158
-msgid "Hide this mixer strip"
-msgstr "隐藏此混音器片段"
-
-#: mixer_strip.cc:169
-msgid "Click to select metering point"
-msgstr "点击选择节拍点"
-
-#: mixer_strip.cc:185
-msgid "Isolate Solo"
-msgstr "隔离独奏"
-
-#: mixer_strip.cc:193
-msgid "Lock Solo Status"
-msgstr "锁定独奏状态"
-
-#: mixer_strip.cc:196 mixer_strip.cc:2027
-msgid "Iso"
-msgstr "隔离"
-
-#: mixer_strip.cc:250
-msgid "Mix group"
-msgstr "混合分组"
-
-#: mixer_strip.cc:368 rc_option_editor.cc:2327
-msgid "Phase Invert"
-msgstr "相位反转"
-
-#: mixer_strip.cc:369 rc_option_editor.cc:2328
-msgid "Record & Monitor"
-msgstr "录制和监控"
-
-#: mixer_strip.cc:370 rc_option_editor.cc:2329
-msgid "Solo Iso / Lock"
-msgstr "独奏隔离/锁定"
-
-#: mixer_strip.cc:524
-msgid "Enable/Disable MIDI input"
-msgstr "启用/禁用 MIDI 输入"
-
-#: mixer_strip.cc:688
-msgid "Aux"
-msgstr "辅助"
-
-#: mixer_strip.cc:710
-msgid "Snd"
-msgstr "声音"
-
-#: mixer_strip.cc:776 mixer_strip.cc:879 processor_box.cc:2382
-msgid "Not connected to audio engine - no I/O changes are possible"
-msgstr "未连接到音频引擎——不可能改变输入/输出"
-
-#: mixer_strip.cc:833 mixer_strip.cc:935
-msgid "Add %1 port"
-msgstr "添加 %1 端口"
-
-#: mixer_strip.cc:840 mixer_strip.cc:942
-msgid "Routing Grid"
-msgstr "路由网格"
-
-#: mixer_strip.cc:1171
-msgid "<b>INPUT</b> to %1"
-msgstr "<b>输入</b> 到 %1"
-
-#: mixer_strip.cc:1174
-msgid "<b>OUTPUT</b> from %1"
-msgstr "<b>输出</b> 来自 %1"
-
-#: mixer_strip.cc:1287
-msgid "Disconnected"
-msgstr "失去连接"
-
-#: mixer_strip.cc:1413
-msgid "*Comments*"
-msgstr "*注释*"
-
-#: mixer_strip.cc:1420
-msgid "Cmt"
-msgstr "注释"
-
-#: mixer_strip.cc:1423
-msgid "*Cmt*"
-msgstr "*注释*"
-
-#: mixer_strip.cc:1429
-msgid "Click to Add/Edit Comments"
-msgstr "点击添加/编辑注释"
-
-#: mixer_strip.cc:1473
-msgid "Grp"
-msgstr "分组"
-
-#: mixer_strip.cc:1476
-msgid "~G"
-msgstr "~G"
-
-#: mixer_strip.cc:1505 route_time_axis.cc:561
-msgid "Color..."
-msgstr "颜色…"
-
-#: mixer_strip.cc:1507 route_time_axis.cc:563
-msgid "Comments..."
-msgstr "注释…"
-
-#: mixer_strip.cc:1509 route_time_axis.cc:565
-msgid "Inputs..."
-msgstr "输入…"
-
-#: mixer_strip.cc:1511 route_time_axis.cc:567
-msgid "Outputs..."
-msgstr "输出…"
-
-#: mixer_strip.cc:1516
-msgid "Save As Template..."
-msgstr "保存为模板..."
-
-#: mixer_strip.cc:1530
-msgid "Adjust Latency..."
-msgstr "调整延迟..."
-
-#: mixer_strip.cc:1533
-msgid "Protect Against Denormals"
-msgstr "防止异常违反"
-
-#: mixer_strip.cc:1539 route_time_axis.cc:580
-msgid "Remote Control ID..."
-msgstr "远程控制 ID…"
-
-#: mixer_strip.cc:1823
-msgid "Pre"
-msgstr "预先"
-
-#: mixer_strip.cc:1827
-msgid "Post"
-msgstr "后置"
-
-#: mixer_strip.cc:1847
-msgid "Pr"
-msgstr "预先"
-
-#: mixer_strip.cc:1851
-msgid "Po"
-msgstr "后置"
-
-#: mixer_strip.cc:1860
-msgid "C"
-msgstr ""
-
-#: mixer_strip.cc:2008 route_ui.cc:168
-msgid "Disk"
-msgstr "硬盘"
-
-# AFL - Aside Fade Listen. 衰减后监听
-#: mixer_strip.cc:2020 monitor_section.cc:70
-msgid "AFL"
-msgstr "后置淡化试听"
-
-# PFL Pre-Fader-Listen衰减前监听
-#: mixer_strip.cc:2023 monitor_section.cc:71
-msgid "PFL"
-msgstr "前置淡化试听"
-
-#: mixer_strip.cc:2034 meter_strip.cc:380
-msgid "D"
-msgstr ""
-
-#: mixer_strip.cc:2241
-msgid "Pre Fader"
-msgstr "前置淡化"
-
-#: mixer_strip.cc:2242
-msgid "Post Fader"
-msgstr "后置淡化"
-
-#: mixer_strip.cc:2286 meter_strip.cc:847
-msgid "Change all in Group to %1"
-msgstr "改变分组里所有的到 %1"
-
-#: mixer_strip.cc:2288 meter_strip.cc:849
-msgid "Change all to %1"
-msgstr "改变所有的到 %1"
-
-#: mixer_strip.cc:2290 meter_strip.cc:851
-msgid "Change same track-type to %1"
-msgstr "改变相同轨道类型的到 %1"
-
-#: mixer_ui.cc:130 route_time_axis.cc:818
-msgid "Group"
-msgstr "分组"
-
-#: mixer_ui.cc:1224
-msgid "track display list item for renamed strip not found!"
-msgstr "未找到音轨显示列表的重命名片段条目!"
-
-#: mixer_ui.cc:1316
-msgid "-all-"
-msgstr "—所有—"
-
-#: mixer_ui.cc:1853
-msgid "Strips"
-msgstr "片段"
-
-#: meter_strip.cc:157
-msgid "Reset Peak"
-msgstr "重置峰值"
-
-#: meter_strip.cc:883
-msgid "Variable height"
-msgstr "变量高度"
-
-#: meter_strip.cc:884
-msgid "Short"
-msgstr "短小的"
-
-#: meter_strip.cc:885
-msgid "Tall"
-msgstr "高大的"
-
-#: meter_strip.cc:886
-msgid "Grande"
-msgstr ""
-
-#: meter_strip.cc:887
-msgid "Venti"
-msgstr ""
-
-#: meter_patterns.cc:82
-msgid "Peak"
-msgstr "峰值"
-
-#: meter_patterns.cc:85
-msgid "RMS + Peak"
-msgstr "均方根 + 峰值"
-
-#: meter_patterns.cc:88
-msgid "IEC1/DIN"
-msgstr ""
-
-#: meter_patterns.cc:91
-msgid "IEC1/Nordic"
-msgstr ""
-
-#: meter_patterns.cc:94
-msgid "IEC2/BBC"
-msgstr ""
-
-#: meter_patterns.cc:97
-msgid "IEC2/EBU"
-msgstr ""
-
-#: meter_patterns.cc:100
-msgid "K20"
-msgstr ""
-
-#: meter_patterns.cc:103
-msgid "K14"
-msgstr ""
-
-#: meter_patterns.cc:106
-msgid "K12"
-msgstr ""
-
-#: meter_patterns.cc:109
-msgid "VU"
-msgstr ""
-
-#: monitor_section.cc:69
-msgid "SiP"
-msgstr ""
-
-#: monitor_section.cc:96 route_group_dialog.cc:49
-msgid "Soloing"
-msgstr "独奏中"
-
-#: monitor_section.cc:100
-msgid "Isolated"
-msgstr "已隔离"
-
-#: monitor_section.cc:104
-msgid "Auditioning"
-msgstr "监听中"
-
-#: monitor_section.cc:114
-msgid ""
-"When active, something is solo-isolated.\n"
-"Click to de-isolate everything"
-msgstr ""
-"启用时,某些被独奏隔离。\n"
-"点击解除所有的隔离"
-
-#: monitor_section.cc:117
-msgid ""
-"When active, auditioning is active.\n"
-"Click to stop the audition"
-msgstr ""
-"启用时,监听激活。\n"
-"点击停止监听."
-
-#: monitor_section.cc:134
-msgid "Solo controls affect solo-in-place"
-msgstr "独奏控制影响独奏入位"
-
-#: monitor_section.cc:140
-msgid "Solo controls toggle after-fader-listen"
-msgstr "独奏控制切换后置淡化试听"
-
-#: monitor_section.cc:146
-msgid "Solo controls toggle pre-fader-listen"
-msgstr "独奏控制切换前置淡化试听"
-
-#: monitor_section.cc:156
-msgid "Gain increase for soloed signals (0dB is normal)"
-msgstr "为独奏信号加大增益(正常值为 0dB)"
-
-#: monitor_section.cc:170
-msgid "Solo Boost"
-msgstr "独奏提升"
-
-#: monitor_section.cc:185
-msgid ""
-"Gain reduction non-soloed signals\n"
-"A value above -inf dB causes \"solo-in-front\""
-msgstr ""
-"增益减少非独奏信号\n"
-"一个数值高于 -inf dB 引起”独奏在前“"
-
-#: monitor_section.cc:196
-msgid "SiP Cut"
-msgstr "SiP 剪切"
-
-#: monitor_section.cc:211
-msgid "Gain reduction to use when dimming monitor outputs"
-msgstr "当减弱监控输出时,减小增益的使用"
-
-#: monitor_section.cc:225 monitor_section.cc:283
-msgid "Dim"
-msgstr "减弱"
-
-#: monitor_section.cc:235
-msgid "Excl. Solo"
-msgstr "把独奏排除在外"
-
-#: monitor_section.cc:237
-msgid "Exclusive solo means that only 1 solo is active at a time"
-msgstr "专属独奏意味着在同一时间仅有一个独奏是激活的"
-
-#: monitor_section.cc:244
-msgid "Solo » Mute"
-msgstr "独奏 » 静音"
-
-#: monitor_section.cc:246
-msgid ""
-"If enabled, solo will override mute\n"
-"(a soloed & muted track or bus will be audible)"
-msgstr ""
-"如果启用,独奏将覆盖静音\n"
-"(一个独奏且静音的音轨或总线将成为可听见)"
-
-#: monitor_section.cc:323
-msgid "Monitor"
-msgstr "监控"
-
-#: monitor_section.cc:744
-msgid "Switch monitor to mono"
-msgstr "转换监控到单声道"
-
-#: monitor_section.cc:747
-msgid "Cut monitor"
-msgstr "剪切监控"
-
-#: monitor_section.cc:750
-msgid "Dim monitor"
-msgstr "减弱监控"
-
-#: monitor_section.cc:753
-msgid "Toggle exclusive solo mode"
-msgstr "切换专属的独奏模式"
-
-#: monitor_section.cc:759
-msgid "Toggle mute overrides solo mode"
-msgstr "切换静音覆盖独奏模式"
-
-#: monitor_section.cc:771
-msgid "Cut monitor channel %1"
-msgstr "剪切监控声道 %1"
-
-#: monitor_section.cc:776
-msgid "Dim monitor channel %1"
-msgstr "减弱监控声道 %1"
-
-#: monitor_section.cc:781
-msgid "Solo monitor channel %1"
-msgstr "独奏监控声道 %1"
-
-#: monitor_section.cc:786
-msgid "Invert monitor channel %1"
-msgstr "反转监控声道 %1"
-
-#: monitor_section.cc:796
-msgid "In-place solo"
-msgstr "入位独奏"
-
-#: monitor_section.cc:798
-msgid "After Fade Listen (AFL) solo"
-msgstr "衰减后监听(AFL)独奏"
-
-#: monitor_section.cc:800
-msgid "Pre Fade Listen (PFL) solo"
-msgstr "衰减前监听(PFL)独奏"
-
-#: mono_panner.cc:109 stereo_panner.cc:119
-msgid "bypassed"
-msgstr "支路"
-
-#: mono_panner.cc:123
-#, c-format
-msgid "L:%3d R:%3d"
-msgstr "左:%3d 右:%3d"
-
-#: mono_panner_editor.cc:33
-msgid "Mono Panner"
-msgstr "单声道面板"
-
-#: mono_panner_editor.cc:44 mono_panner_editor.cc:49 stereo_panner_editor.cc:46
-#: stereo_panner_editor.cc:51
-msgid "%"
-msgstr ""
-
-#: nag.cc:41
-msgid "Support %1 Development"
-msgstr "支持 %1 的开发"
-
-#: nag.cc:42
-msgid "I'd like to make a one-time donation"
-msgstr "我愿意给予一次性捐助"
-
-#: nag.cc:43
-msgid "Tell me more about becoming a subscriber"
-msgstr "请告知我关于成为捐助者的信息"
-
-#: nag.cc:44
-msgid "I'm already a subscriber!"
-msgstr "我已经是捐助者了!"
-
-#: nag.cc:45
-msgid "Ask about this the next time I export"
-msgstr "在下次我导出时询问这事"
-
-#: nag.cc:46
-msgid "Never ever ask me about this again"
-msgstr "再也不要询问我这事"
-
-#: nag.cc:49
-msgid ""
-"Congratulations on your session export.\n"
-"\n"
-"It looks as if you may already be a subscriber. If so, thanks, and sorry\n"
-"to bother you again about this - I'm working on improving our subscriber system\n"
-"so that I don't have to keep annoying you with this message.\n"
-"\n"
-"If you're not a subscriber, perhaps you might consider supporting my work\n"
-"on Ardour with either a one-time donation or subscription. Nothing will \n"
-"happen if you choose not to do so. However Ardour's continuing development\n"
-"relies on a stable, sustainable income stream. Thanks for using Ardour!"
-msgstr ""
-"恭喜!你的会话已导出。\n"
-"\n"
-"看起来您可能已经是捐助者。 如果是的话,感谢您,\n"
-"抱歉为这事而再次打扰了您——我们正致力于改善我们的捐助系统\n"
-"希望我们就不会再因为这条信息而打扰您。\n"
-"\n"
-"如果您不是捐助者,也许您可以考虑一下支持我们在Ardour上的工作\n"
-"您可以一次性捐赠或者定期捐助均可。 如果您不想这样做的话也没事。\n"
-"不管怎样, Ardour的后续开发需要一个稳定、持续的资金来源。\n"
-"感谢使用Ardour!"
-
-#: nag.cc:58
-msgid ""
-"Congratulations on your session export.\n"
-"\n"
-"I hope you find Ardour a useful tool. I'd like to ask you to consider supporting\n"
-"its development with either a one-time donation or subscription. Nothing\n"
-"will happen if you choose not to do so. However Ardour's continuing development\n"
-"relies on a stable, sustainable income stream. Thanks for using Ardour!"
-msgstr ""
-"恭喜!你的会话已导出。\n"
-"\n"
-"我们希望您觉得Ardour是个有用的工具。我想建议您考虑一下支持它的开发。\n"
-"不论是一次性捐赠或者捐助均可。如果您不想这样做的话也没事。\n"
-"不管怎样, Ardour后续的开发需要一个稳定、持续的资金来源。\n"
-"感谢使用Ardour!"
-
-#: new_plugin_preset_dialog.cc:29
-msgid "New Preset"
-msgstr "新建预设"
-
-#: new_plugin_preset_dialog.cc:30
-msgid "Replace existing preset with this name"
-msgstr "用这个名称替代已存在的预设"
-
-#: new_plugin_preset_dialog.cc:34
-msgid "Name of new preset"
-msgstr "新建预设的名称"
-
-#: normalize_dialog.cc:34
-msgid "Normalize regions"
-msgstr "规范化区域"
-
-#: normalize_dialog.cc:34
-msgid "Normalize region"
-msgstr "规范化区域"
-
-#: normalize_dialog.cc:49 strip_silence_dialog.cc:66
-msgid "dbFS"
-msgstr ""
-
-#: normalize_dialog.cc:56
-msgid "Normalize each region using its own peak value"
-msgstr "用每个区域它自己的峰值数值规范化每个区域"
-
-#: normalize_dialog.cc:58
-msgid "Normalize each region using the peak value of all regions"
-msgstr "用所有区域的峰值数值规范化每个区域"
-
-#: normalize_dialog.cc:73
-msgid "Normalize"
-msgstr "规范化"
-
-#: note_select_dialog.cc:33
-msgid "Select Note"
-msgstr "选择音符"
-
-#: opts.cc:57
-msgid "Usage: "
-msgstr "用法:"
-
-#: opts.cc:58
-msgid "  [SESSION_NAME]              Name of session to load\n"
-msgstr "  [SESSION_NAME]              要载入的会话的名称\n"
-
-#: opts.cc:59
-msgid "  -v, --version               Show version information\n"
-msgstr "  -v, --version               显示版本信息\n"
-
-#: opts.cc:60
-msgid "  -h, --help                  Print this message\n"
-msgstr "  -h, --help                  打印本信息\n"
-
-#: opts.cc:61
-msgid "  -a, --no-announcements      Do not contact website for announcements\n"
-msgstr "  -a, --no-announcements      不联系网站公告\n"
-
-#: opts.cc:62
-msgid "  -b, --bindings              Print all possible keyboard binding names\n"
-msgstr "  -b, --bindings              打印所有可能的键盘绑定名称\n"
-
-#: opts.cc:63
-msgid ""
-"  -c, --name <name>           Use a specific backend client name, default is "
-"ardour\n"
-msgstr "  -c, --name <name>           使用一个特定的后端客户名称,默认是ardour\n"
-
-#: opts.cc:64
-msgid "  -d, --disable-plugins       Disable all plugins in an existing session\n"
-msgstr "  -d, --disable-plugins       在一个已存在的会话中禁用所有插件\n"
-
-#: opts.cc:65
-msgid ""
-"  -D, --debug <options>       Set debug flags. Use \"-D list\" to see available "
-"options\n"
-msgstr ""
-"  -D, --debug <options>       设置调试标志. 使用 \"-D list\" 显示可用的选项\n"
-
-#: opts.cc:66
-msgid "  -n, --no-splash             Do not show splash screen\n"
-msgstr "  -n, --no-splash             不显示闪屏\n"
-
-#: opts.cc:67
-msgid "  -m, --menus file            Use \"file\" to define menus\n"
-msgstr "  -m, --menus file            使用 \"file\" (文件)来定义菜单\n"
-
-#: opts.cc:68
-msgid "  -N, --new session-name      Create a new session from the command line\n"
-msgstr "  -N, --new session-name      从命令行创建一个新的会话\n"
-
-#: opts.cc:69
-msgid "  -O, --no-hw-optimizations   Disable h/w specific optimizations\n"
-msgstr "  -O, --no-hw-optimizations   禁用 h/w 特殊的优化\n"
-
-#: opts.cc:70
-msgid "  -P, --no-connect-ports      Do not connect any ports at startup\n"
-msgstr "  -P, --no-connect-ports     在启动时不连接任何端口 \n"
-
-#: opts.cc:71
-msgid "  -S, --sync                  Draw the gui synchronously \n"
-msgstr "  -S, --sync                  同步绘制用户图形界面 \n"
-
-#: opts.cc:73
-msgid "  -V, --novst                 Do not use VST support\n"
-msgstr "  -V, --novst                 不使用VST支持\n"
-
-#: opts.cc:75
-msgid ""
-"  -E, --save <file>           Load the specified session, save it to <file> and "
-"then quit\n"
-msgstr ""
-"  -E, --save <file>           载入指定的会话, 保存它在 <file 文件> 中并退出\n"
-
-#: opts.cc:76
-msgid "  -C, --curvetest filename    Curve algorithm debugger\n"
-msgstr "  -C, --curvetest filename    曲线算法调试器\n"
-
-#: opts.cc:77
-msgid ""
-"  -k, --keybindings filename  Name of key bindings to load (default is ~/.ardour3/"
-"ardour.bindings)\n"
-msgstr ""
-"  -k, --keybindings 文件名  要载入的按键绑定名称(默认是 ~/.ardour3/ardour."
-"bindings)\n"
-
-#: panner2d.cc:854
-msgid "Panner (2D)"
-msgstr "面板(2D)"
-
-#: panner2d.cc:856 panner_ui.cc:400 plugin_ui.cc:452
-msgid "Bypass"
-msgstr "支路"
-
-#: panner2d.cc:862
-msgid "Panner"
-msgstr "面板"
-
-#: panner_ui.cc:72
-msgid "Pan automation mode"
-msgstr "筛选自动模式"
-
-#: panner_ui.cc:73
-msgid "Pan automation type"
-msgstr "筛选自动类型"
-
-#: playlist_selector.cc:43
-msgid "Playlists"
-msgstr "播放列表"
-
-#: playlist_selector.cc:54
-msgid "Playlists grouped by track"
-msgstr "以音轨对播放列表分组"
-
-#: playlist_selector.cc:101
-msgid "Playlist for %1"
-msgstr "%1 的播放列表"
-
-#: playlist_selector.cc:114
-msgid "Other tracks"
-msgstr "其他音轨"
-
-#: playlist_selector.cc:139
-msgid "unassigned"
-msgstr "未指定"
-
-#: playlist_selector.cc:194
-msgid "Imported"
-msgstr "已导入"
-
-#: plugin_eq_gui.cc:85 plugin_eq_gui.cc:109
-msgid "dB scale"
-msgstr "dB 比例"
-
-#: plugin_eq_gui.cc:116
-msgid "Show phase"
-msgstr "显示相位"
-
-#: plugin_selector.cc:53 plugin_selector.cc:229
-msgid "Name contains"
-msgstr "名称包含"
-
-#: plugin_selector.cc:54 plugin_selector.cc:233
-msgid "Type contains"
-msgstr "类型包含"
-
-#: plugin_selector.cc:55 plugin_selector.cc:231
-msgid "Category contains"
-msgstr "类型包含"
-
-#: plugin_selector.cc:56 plugin_selector.cc:253
-msgid "Author contains"
-msgstr "作者包含"
-
-#: plugin_selector.cc:57 plugin_selector.cc:255
-msgid "Library contains"
-msgstr "库包含"
-
-#: plugin_selector.cc:58 plugin_selector.cc:219 plugin_selector.cc:537
-msgid "Favorites only"
-msgstr "仅收藏"
-
-#: plugin_selector.cc:59 plugin_selector.cc:223 plugin_selector.cc:537
-msgid "Hidden only"
-msgstr "仅隐藏"
-
-#: plugin_selector.cc:64
-msgid "Plugin Manager"
-msgstr "插件管理"
-
-#: plugin_selector.cc:85
-msgid "Fav"
-msgstr "收藏"
-
-#: plugin_selector.cc:87
-msgid "Available Plugins"
-msgstr "可用插件"
-
-#: plugin_selector.cc:88
-msgid "Type"
-msgstr "类型"
-
-#: plugin_selector.cc:89
-msgid "Category"
-msgstr "类别"
-
-#: plugin_selector.cc:90
-msgid "Creator"
-msgstr "创建者"
-
-#: plugin_selector.cc:91
-msgid "# Audio In"
-msgstr "# 音频输入"
-
-#: plugin_selector.cc:92
-msgid "# Audio Out"
-msgstr "# 音频输出"
-
-#: plugin_selector.cc:93
-msgid "# MIDI In"
-msgstr "# MIDI输入"
-
-#: plugin_selector.cc:94
-msgid "# MIDI Out"
-msgstr "# MIDI输出"
-
-#: plugin_selector.cc:116
-msgid "Plugins to be connected"
-msgstr "被连接的插件"
-
-#: plugin_selector.cc:129
-msgid "Add a plugin to the effect list"
-msgstr "添加一个插件到效果列表"
-
-#: plugin_selector.cc:133
-msgid "Remove a plugin from the effect list"
-msgstr "从效果列表中移除一个插件"
-
-#: plugin_selector.cc:135
-msgid "Update available plugins"
-msgstr "更新可用插件"
-
-#: plugin_selector.cc:172
-msgid "Insert Plugin(s)"
-msgstr "插入插件"
-
-#: plugin_selector.cc:337 plugin_selector.cc:338 plugin_selector.cc:339
-#: plugin_selector.cc:340
-msgid "variable"
-msgstr "变量"
-
-#: plugin_selector.cc:496
-msgid ""
-"The plugin \"%1\" could not be loaded\n"
-"\n"
-"See the Log window for more details (maybe)"
-msgstr ""
-"无法载入插件 \"%1\"\n"
-"\n"
-"更多的信息(也许可以)参阅日志窗口"
-
-#: plugin_selector.cc:644
-msgid "Favorites"
-msgstr "收藏"
-
-#: plugin_selector.cc:646
-msgid "Plugin Manager..."
-msgstr "插件管理器…"
-
-#: plugin_selector.cc:650
-msgid "By Creator"
-msgstr "根据创建者"
-
-#: plugin_selector.cc:653
-msgid "By Category"
-msgstr "根据类别"
-
-#: plugin_ui.cc:113
-msgid "Eh? LADSPA plugins don't have editors!"
-msgstr "噢?LADSPA插件没有编辑器!"
-
-#: plugin_ui.cc:122 plugin_ui.cc:227
-msgid ""
-"unknown type of editor-supplying plugin (note: no VST support in this version of "
-"%1)"
-msgstr "未知的编辑器应用插件类型(注意:在这个 %1 版本无 VST 支持)"
-
-#: plugin_ui.cc:125
-msgid "unknown type of editor-supplying plugin"
-msgstr "未知的编辑器应用插件类型"
-
-#: plugin_ui.cc:257
-msgid ""
-"unknown type of editor-supplying plugin (note: no linuxVST support in this version "
-"of %1)"
-msgstr "未知的编辑器应用插件类型(注意:在这个 %1 版本无 linuxVST 支持)"
-
-#: plugin_ui.cc:329
-msgid "create_lv2_editor called on non-LV2 plugin"
-msgstr "创建_lv2_编辑器调用 non-LV2 插件"
-
-#: plugin_ui.cc:418
-msgid "Add"
-msgstr "添加"
-
-#: plugin_ui.cc:422
-msgid "Description"
-msgstr "说明"
-
-#: plugin_ui.cc:423
-msgid "Plugin analysis"
-msgstr "插件分析"
-
-#: plugin_ui.cc:430
-msgid ""
-"Presets (if any) for this plugin\n"
-"(Both factory and user-created)"
-msgstr ""
-"预设这个插件(如果有的话)\n"
-"(包括出厂设置和用户创建的设置)"
-
-#: plugin_ui.cc:431
-msgid "Save a new preset"
-msgstr "保存一个新的预设"
-
-#: plugin_ui.cc:432
-msgid "Save the current preset"
-msgstr "保存当前预设"
-
-#: plugin_ui.cc:433
-msgid "Delete the current preset"
-msgstr "删除当前预设"
-
-#: plugin_ui.cc:434
-msgid "Disable signal processing by the plugin"
-msgstr "按插件禁用信号处理"
-
-#: plugin_ui.cc:467 plugin_ui.cc:663
-msgid ""
-"Click to allow the plugin to receive keyboard events that %1 would normally use as "
-"a shortcut"
-msgstr "单击允许此插件接受键盘事件,以便 %1 可以正常地作为一个快捷键使用"
-
-#: plugin_ui.cc:468
-msgid "Click to enable/disable this plugin"
-msgstr "单击启用/禁用此插件"
-
-#: plugin_ui.cc:507
-msgid "latency (%1 sample)"
-msgid_plural "latency (%1 samples)"
-msgstr[0] "延迟(%1 采样)"
-
-#: plugin_ui.cc:509
-msgid "latency (%1 ms)"
-msgstr "延迟(%1 毫秒)"
-
-#: plugin_ui.cc:520
-msgid "Edit Latency"
-msgstr "编辑延迟"
-
-#: plugin_ui.cc:566
-msgid ""
-"Plugin presets are not supported in this build of %1. Consider paying for a full "
-"version"
-msgstr "插件预设在本个 %1 构建中不支持。请考虑为完整版本付"
-
-#: plugin_ui.cc:574
-msgid ""
-"Plugin presets are not supported in this build, see the Log window for more "
-"information."
-msgstr "插件预设在本构建中不支持,更多信息请参阅日志窗口。"
-
-#: plugin_ui.cc:670
-msgid "Click to allow normal use of %1 keyboard shortcuts"
-msgstr "单击允许正常使用 %1 键盘快捷键"
-
-#: port_group.cc:337
-msgid "%1 Busses"
-msgstr "%1 总线"
-
-#: port_group.cc:338
-msgid "%1 Tracks"
-msgstr "%1 音轨"
-
-#: port_group.cc:339
-msgid "Hardware"
-msgstr "硬件"
-
-#: port_group.cc:340
-msgid "%1 Misc"
-msgstr "%1 杂项"
-
-#: port_group.cc:341
-msgid "Other"
-msgstr "其它"
-
-#: port_group.cc:432 port_group.cc:433
-msgid "LTC Out"
-msgstr "LTC 输出"
-
-#: port_group.cc:436 port_group.cc:437
-msgid "LTC In"
-msgstr "LTC 输入"
-
-#: port_group.cc:463
-msgid "MTC in"
-msgstr "MTC 输入"
-
-#: port_group.cc:466
-msgid "MIDI control in"
-msgstr "MIDI 控制输入"
-
-#: port_group.cc:469
-msgid "MIDI clock in"
-msgstr "MIDI 计时器输入"
-
-#: port_group.cc:472
-msgid "MMC in"
-msgstr "MMC 输入"
-
-#: port_group.cc:476
-msgid "MTC out"
-msgstr "MTC 输出"
-
-#: port_group.cc:479
-msgid "MIDI control out"
-msgstr "MIDI 控制输出"
-
-#: port_group.cc:482
-msgid "MIDI clock out"
-msgstr "MIDI 计时器输出"
-
-#: port_group.cc:485
-msgid "MMC out"
-msgstr "MMC 输出"
-
-#: port_group.cc:532
-msgid ":monitor"
-msgstr ":监控"
-
-#: port_group.cc:544
-msgid "system:"
-msgstr "系统:"
-
-#: port_group.cc:545
-msgid "alsa_pcm"
-msgstr ""
-
-#: port_insert_ui.cc:39
-msgid "Measure Latency"
-msgstr "测量延迟"
-
-#: port_insert_ui.cc:50
-msgid "Send/Output"
-msgstr "发送/输出"
-
-#: port_insert_ui.cc:51
-msgid "Return/Input"
-msgstr "返回/输入"
-
-#: port_insert_ui.cc:85
-msgid "No signal detected"
-msgstr "未检测到信号"
-
-#: port_insert_ui.cc:165
-msgid "Port Insert "
-msgstr "端口插入"
-
-#: port_matrix.cc:331 port_matrix.cc:357
-msgid "<b>Sources</b>"
-msgstr "<b>源</b>"
-
-#: port_matrix.cc:332 port_matrix.cc:358
-msgid "<b>Destinations</b>"
-msgstr "<b>目的地</b>"
-
-#: port_matrix.cc:440 port_matrix.cc:448
-#, c-format
-msgid "Add %s %s"
-msgstr "添加 %s %s"
-
-#: port_matrix.cc:456
-#, c-format
-msgid "Rename '%s'..."
-msgstr "重命名 '%s'..."
-
-#: port_matrix.cc:472
-msgid "Remove all"
-msgstr "移除所有"
-
-#: port_matrix.cc:492 port_matrix.cc:504
-#, c-format
-msgid "%s all"
-msgstr "%s 所有"
-
-#: port_matrix.cc:527
-msgid "Rescan"
-msgstr "重新扫描"
-
-#: port_matrix.cc:529
-msgid "Show individual ports"
-msgstr "显示各个端口"
-
-#: port_matrix.cc:535
-msgid "Flip"
-msgstr "轻弹"
-
-#: port_matrix.cc:722
-msgid ""
-"It is not possible to add a port here, as the first processor in the track or buss "
-"cannot support the new configuration."
-msgstr "不可能在此添加一个端口,作为在音轨或总线里的第一个处理器无法支持新的配置。"
-
-#: port_matrix.cc:725
-msgid "Cannot add port"
-msgstr "无法添加端口"
-
-#: port_matrix.cc:747
-msgid "Port removal not allowed"
-msgstr "不允许移除端口"
-
-#: port_matrix.cc:748
-msgid ""
-"This port cannot be removed.\n"
-"Either the first plugin in the track or buss cannot accept\n"
-"the new number of inputs or the last plugin has more outputs."
-msgstr ""
-"该端口不能被移除。\n"
-"不论是新的输入号码或者最后一个插件有更多的输出,\n"
-"在音轨或总线里的第一个插件都无法接受。"
-
-#: port_matrix.cc:965
-#, c-format
-msgid "Remove '%s'"
-msgstr "移除 '%s'"
-
-#: port_matrix.cc:980
-#, c-format
-msgid "%s all from '%s'"
-msgstr "%s 所有来自于 '%s'"
-
-#: port_matrix.cc:1046 transform_dialog.cc:62
-msgid "channel"
-msgstr "声道"
-
-#: port_matrix_body.cc:82
-msgid "There are no ports to connect."
-msgstr "没有端口可连接。"
-
-#: port_matrix_body.cc:84
-msgid "There are no %1 ports to connect."
-msgstr "没有 %1 端口可连接."
-
-#: processor_box.cc:150
-msgid "Send"
-msgstr "发送"
-
-#: processor_box.cc:152
-msgid "Return"
-msgstr "返回"
-
-#: processor_box.cc:310
-msgid ""
-"\n"
-"This mono plugin has been replicated %1 times."
-msgstr ""
-"\n"
-"这个单声道插件已经被复制了 %1 次。"
-
-#: processor_box.cc:314
-msgid ""
-"<b>%1</b>\n"
-"Double-click to show GUI.\n"
-"Alt+double-click to show generic GUI.%2"
-msgstr ""
-"<b>%1</b>\n"
-"双击显示图形用户界面。\n"
-"Alt+双击显示通用图形用户界面。%2"
-
-#: processor_box.cc:317
-msgid ""
-"<b>%1</b>\n"
-"Double-click to show generic GUI.%2"
-msgstr ""
-"<b>%1</b>\n"
-"双击显示通用图形用户界面。%2"
-
-#: processor_box.cc:361
-#, c-format
-msgid "(%1x1) "
-msgstr ""
-
-#: processor_box.cc:437
-msgid "Show All Controls"
-msgstr "显示所有控制"
-
-#: processor_box.cc:441
-msgid "Hide All Controls"
-msgstr "隐藏所有控制"
-
-#: processor_box.cc:475
-msgid "Link panner controls"
-msgstr "链接面板控制"
-
-#: processor_box.cc:575
-msgid "on"
-msgstr "开启"
-
-#: processor_box.cc:575 rc_option_editor.cc:2360 rc_option_editor.cc:2374
-msgid "off"
-msgstr "关闭"
-
-#: processor_box.cc:957
-msgid ""
-"Right-click to add/remove/edit\n"
-"plugins,inserts,sends and more"
-msgstr ""
-"右键点击添加/移除/编辑\n"
-"插件、插入、发送以及更多"
-
-#: processor_box.cc:1429 processor_box.cc:1804
-msgid "Plugin Incompatibility"
-msgstr "插件不兼容"
-
-#: processor_box.cc:1432
-msgid "You attempted to add the plugin \"%1\" in slot %2.\n"
-msgstr "您试图在空位 %2 中添加插件 \"%1\" 。\n"
-
-#: processor_box.cc:1438
-msgid ""
-"\n"
-"This plugin has:\n"
-msgstr ""
-"\n"
-"此插件有:\n"
-
-#: processor_box.cc:1441
-msgid "\t%1 MIDI input\n"
-msgid_plural "\t%1 MIDI inputs\n"
-msgstr[0] "\t%1 MIDI 输入\n"
-
-#: processor_box.cc:1445
-msgid "\t%1 audio input\n"
-msgid_plural "\t%1 audio inputs\n"
-msgstr[0] "\t%1 音频输出\n"
-
-#: processor_box.cc:1448
-msgid ""
-"\n"
-"but at the insertion point, there are:\n"
-msgstr ""
-"\n"
-"但在插入点那里有:\n"
-
-#: processor_box.cc:1451
-msgid "\t%1 MIDI channel\n"
-msgid_plural "\t%1 MIDI channels\n"
-msgstr[0] "\t%1 MIDI 声道\n"
-
-#: processor_box.cc:1455
-msgid "\t%1 audio channel\n"
-msgid_plural "\t%1 audio channels\n"
-msgstr[0] "\t%1 音频声道\n"
-
-#: processor_box.cc:1458
-msgid ""
-"\n"
-"%1 is unable to insert this plugin here.\n"
-msgstr ""
-"\n"
-"%1 无法在此处再次插入插件.\n"
-
-#: processor_box.cc:1495
-msgid "Cannot set up new send: %1"
-msgstr "无法建立新的发送: %1"
-
-#: processor_box.cc:1807
-msgid ""
-"You cannot reorder these plugins/sends/inserts\n"
-"in that way because the inputs and\n"
-"outputs will not work correctly."
-msgstr ""
-"您不能以这种方式\n"
-"要求这些插件/发送/插入\n"
-"因为输入和输出将无法正确工作。"
-
-#: processor_box.cc:1991
-msgid "Rename Processor"
-msgstr "重命名处理器"
-
-#: processor_box.cc:2022
-msgid "At least 100 IO objects exist with a name like %1 - name not changed"
-msgstr "至少有100个输入输出对象物体存在着像 %1这样的名称——名称没有改变"
-
-#: processor_box.cc:2159
-msgid "plugin insert constructor failed"
-msgstr "插件插入构造函数失败"
-
-#: processor_box.cc:2170
-msgid ""
-"Copying the set of processors on the clipboard failed,\n"
-"probably because the I/O configuration of the plugins\n"
-"could not match the configuration of this track."
-msgstr ""
-"复制剪贴板上的处理器集成失败,\n"
-"可能是因为插件的输入/输出配置\n"
-"无法匹配这条音轨的配置。"
-
-#: processor_box.cc:2216
-msgid ""
-"Do you really want to remove all processors from %1?\n"
-"(this cannot be undone)"
-msgstr ""
-"您是否真的要从 %1 移除所有的处理器?\n"
-"(此操作不可撤销)"
-
-#: processor_box.cc:2220 processor_box.cc:2245
-msgid "Yes, remove them all"
-msgstr "是的,全部移除它们"
-
-#: processor_box.cc:2222 processor_box.cc:2247
-msgid "Remove processors"
-msgstr "移除处理器"
-
-#: processor_box.cc:2237
-msgid ""
-"Do you really want to remove all pre-fader processors from %1?\n"
-"(this cannot be undone)"
-msgstr ""
-"您是否真的要从 %1 移除所有的前置淡化处理器?\n"
-"(此操作不可撤销)"
-
-#: processor_box.cc:2240
-msgid ""
-"Do you really want to remove all post-fader processors from %1?\n"
-"(this cannot be undone)"
-msgstr ""
-"您是否真的要从 %1 移除所有的后置淡化处理器?\n"
-"(此操作不可撤销)"
-
-#: processor_box.cc:2428
-msgid "New Plugin"
-msgstr "新建插件"
-
-#: processor_box.cc:2431
-msgid "New Insert"
-msgstr "新建插入"
-
-#: processor_box.cc:2434
-msgid "New External Send ..."
-msgstr "新建外部发送…"
-
-#: processor_box.cc:2438
-msgid "New Aux Send ..."
-msgstr "新建辅助发送"
-
-#: processor_box.cc:2441
-msgid "Send Options"
-msgstr "发送选项"
-
-#: processor_box.cc:2443
-msgid "Clear (all)"
-msgstr "清除(所有)"
-
-#: processor_box.cc:2445
-msgid "Clear (pre-fader)"
-msgstr "清除(前置淡化)"
-
-#: processor_box.cc:2447
-msgid "Clear (post-fader)"
-msgstr "清除(后置淡化)"
-
-#: processor_box.cc:2473
-msgid "Activate All"
-msgstr "激活所有"
-
-#: processor_box.cc:2475
-msgid "Deactivate All"
-msgstr "不激活所有"
-
-#: processor_box.cc:2477
-msgid "A/B Plugins"
-msgstr "A/B 插件"
-
-#: processor_box.cc:2486
-msgid "Edit with generic controls..."
-msgstr "以通用控制编辑…"
-
-#: processor_box.cc:2789
-msgid "%1: %2 (by %3)"
-msgstr "%1: %2(通过 %3)"
-
-#: processor_box.cc:2791
-msgid "%1 (by %2)"
-msgstr "%1(通过 %2)"
-
-#: patch_change_dialog.cc:50
-msgid "Patch Change"
-msgstr "音色变换"
-
-#: patch_change_dialog.cc:76
-msgid "Patch Bank"
-msgstr "音色库"
-
-#: patch_change_dialog.cc:83
-msgid "Patch"
-msgstr "音色"
-
-#: patch_change_dialog.cc:98 step_entry.cc:430
-msgid "Program"
-msgstr "程序"
-
-#: patch_change_dialog.cc:106 step_entry.cc:422
-msgid "Bank"
-msgstr "库"
-
-#: quantize_dialog.cc:36
-msgid "main grid"
-msgstr "主要网格"
-
-#: quantize_dialog.cc:52 quantize_dialog.cc:109
-msgid "Quantize"
-msgstr "数字转换"
-
-#: quantize_dialog.cc:56
-msgid "Strength"
-msgstr "强度"
-
-#: quantize_dialog.cc:59
-msgid "Swing"
-msgstr "摆动"
-
-#: quantize_dialog.cc:62
-msgid "Threshold (ticks)"
-msgstr "临界值(识别声)"
-
-#: quantize_dialog.cc:63
-msgid "Snap note start"
-msgstr "对齐音符起点"
-
-#: quantize_dialog.cc:64
-msgid "Snap note end"
-msgstr "对齐音符终点"
-
-#: rc_option_editor.cc:77
-msgid "Click audio file:"
-msgstr "单击音频文件:"
-
-#: rc_option_editor.cc:80 rc_option_editor.cc:87
-msgid "Browse..."
-msgstr "浏览…"
-
-#: rc_option_editor.cc:84
-msgid "Click emphasis audio file:"
-msgstr "点击加重音频文件:"
-
-#: rc_option_editor.cc:116
-msgid "Choose Click"
-msgstr "选择点击"
-
-#: rc_option_editor.cc:139
-msgid "Choose Click Emphasis"
-msgstr "选择点击加重"
-
-#: rc_option_editor.cc:170
-msgid "Limit undo history to"
-msgstr "限制撤销历史到"
-
-#: rc_option_editor.cc:171
-msgid "Save undo history of"
-msgstr "保存撤销历史"
-
-#: rc_option_editor.cc:180 rc_option_editor.cc:187
-msgid "commands"
-msgstr "命令"
-
-#: rc_option_editor.cc:325
-msgid "Edit using:"
-msgstr "编辑使用:"
-
-#: rc_option_editor.cc:331 rc_option_editor.cc:357 rc_option_editor.cc:384
-msgid "+ button"
-msgstr "+按钮"
-
-#: rc_option_editor.cc:351
-msgid "Delete using:"
-msgstr "删除使用:"
-
-#: rc_option_editor.cc:378
-msgid "Insert note using:"
-msgstr "插入音符使用:"
-
-#: rc_option_editor.cc:405
-msgid "Ignore snap using:"
-msgstr "忽略音符使用:"
-
-#: rc_option_editor.cc:421
-msgid "Keyboard layout:"
-msgstr "键盘布局:"
-
-#: rc_option_editor.cc:544
-msgid "Font scaling:"
-msgstr "字体缩放:"
-
-#: rc_option_editor.cc:547
-msgid "Default"
-msgstr "默认"
-
-#: rc_option_editor.cc:573
-msgid "Major font-scale changes require an application restart to re-layout."
-msgstr "重要的字体缩放变化要求应用程序重新启动以便于重新布局。"
-
-#: rc_option_editor.cc:614
-msgid "Waveform Clip Level (dBFS):"
-msgstr "波形截波电平(dBFS):"
-
-#: rc_option_editor.cc:666
-msgid "Playback (seconds of buffering):"
-msgstr "回放(缓冲的秒数):"
-
-#: rc_option_editor.cc:679
-msgid "Recording (seconds of buffering):"
-msgstr "录制(缓冲的秒数):"
-
-#: rc_option_editor.cc:737
-msgid "Control Surface Protocol"
-msgstr "控制面协议"
-
-#: rc_option_editor.cc:746
-msgid "Double-click on a name to edit settings for an enabled protocol"
-msgstr "双击名称以便编辑已启用协议的设置"
-
-#: rc_option_editor.cc:903
-msgid "Show Video Export Info before export"
-msgstr "导出前显示视频导出信息"
-
-#: rc_option_editor.cc:904
-msgid "Show Video Server Startup Dialog"
-msgstr "显示视频服务启动对话框"
-
-#: rc_option_editor.cc:905
-msgid "Advanced Setup (remote video server)"
-msgstr "高级设置(远程视频服务)"
-
-#: rc_option_editor.cc:913
-msgid ""
-"<b>When enabled</b> you can speficify a custom video-server URL and docroot. - Do "
-"not enable this option unless you know what you are doing."
-msgstr ""
-"<b>启用时</b> 您可以指定一个定制的视频服务器网址和文档根。——不要启用该选项,除非您"
-"知道您正在做什么。"
-
-#: rc_option_editor.cc:915
-msgid "Video Server URL:"
-msgstr "视频服务器网址:"
-
-#: rc_option_editor.cc:920
-msgid ""
-"Base URL of the video-server including http prefix. This is usually 'http://"
-"hostname.example.org:1554/' and defaults to 'http://localhost:1554/' when the "
-"video-server is running locally"
-msgstr ""
-"基于网址的视频服务包括 http 前缀。当视频服务器是运行在本地时,这网址通常是 “http://"
-"hostname.example.org:1554/” 以及默认是 “http://localhost:1554/” 。"
-
-#: rc_option_editor.cc:922
-msgid "Video Folder:"
-msgstr "视频文件夹:"
-
-#: rc_option_editor.cc:927
-msgid ""
-"Local path to the video-server document-root. Only files below this directory will "
-"be accessible by the video-server. If the server run on a remote host, it should "
-"point to a network mounted folder of the server's docroot or be left empty if it "
-"is unvailable. It is used for the local video-monitor and file-browsing when "
-"opening/adding a video file."
-msgstr ""
-"视频服务器文档根的本地路径。视频服务器仅访问这个目录下的文件。如果服务器运行在远程"
-"主机上,它将指向服务器文档根的一个网络挂载文件夹,或者如果它不可用就留着空白。这是"
-"用于在打开/添加一个视频文件时的本地视频监控以及文件浏览。"
-
-#: rc_option_editor.cc:934
-msgid ""
-"<b>When enabled</b> an information window with details is displayed before the "
-"video-export dialog."
-msgstr "<b>启用时</b> 在视频输出对话框前显示一个细节信息窗口。"
-
-#: rc_option_editor.cc:939
-msgid ""
-"<b>When enabled</b> the video server is never launched automatically without "
-"confirmation"
-msgstr "<b>启用时</b> 视频服务器在没有得到确认前不会自动启动。"
-
-#: rc_option_editor.cc:1022
-msgid "Always Display Plugin Scan Progress"
-msgstr "总是显示插件扫描程序"
-
-#: rc_option_editor.cc:1023
-msgid "Scan for [new] VST Plugins on Application Start"
-msgstr "在应用起点扫描 [新] VST 插件"
-
-#: rc_option_editor.cc:1024
-msgid "Scan for AudioUnit Plugins on Application Start"
-msgstr "在应用起点扫描音频单位插件"
-
-#: rc_option_editor.cc:1035
-msgid "General"
-msgstr "通用"
-
-#: rc_option_editor.cc:1041
-msgid "Scan for Plugins"
-msgstr "扫描插件"
-
-#: rc_option_editor.cc:1048
-msgid ""
-"<b>When enabled</b> a popup window showing plugin scan progress is displayed for "
-"indexing (cache load) and discovery (detect new plugins)"
-msgstr ""
-"<b>启用时</b> 一个弹出窗口显示插件扫描程序,以展示索引(缓存载入)和发现(探测新插"
-"件)。"
-
-#: rc_option_editor.cc:1055
-msgid ""
-"Specify the default timeout for plugin instantiation in 1/10 seconds. Plugins that "
-"require more time to load will be blacklisted. A value of 0 disables the timeout."
-msgstr ""
-"插件实例化指定的默认超时在 1/10 以内。需要更多时间载入的插件将被列入黑名单。数值为 "
-"0 则禁用超时。"
-
-#: rc_option_editor.cc:1057
-msgid "Scan Time Out [deciseconds]"
-msgstr "扫描超时 [十分之一秒]"
-
-#: rc_option_editor.cc:1065
-msgid "VST"
-msgstr ""
-
-#: rc_option_editor.cc:1071
-msgid "Clear VST Cache"
-msgstr "清除 VST 缓存"
-
-#: rc_option_editor.cc:1075
-msgid "Clear VST Blacklist"
-msgstr "清除 VST 黑名单"
-
-#: rc_option_editor.cc:1083
-msgid ""
-"<b>When enabled</b> new VST plugins are searched, tested and added to the cache "
-"index on application start. When disabled new plugins will only be available after "
-"triggering a 'Scan' manually"
-msgstr ""
-"<b>启用时</b> 新的 VST 插件被搜索、测试以及添加到应用起点的缓存索引中。当禁用新插件"
-"时,仅在手动触发“扫描”时可用。"
-
-#: rc_option_editor.cc:1086
-msgid "Linux VST Path:"
-msgstr "Linux VST 路径:"
-
-#: rc_option_editor.cc:1093
-msgid "Windows VST Path:"
-msgstr "Windows VST 路径:"
-
-#: rc_option_editor.cc:1102
-msgid "Audio Unit"
-msgstr "音频单位"
-
-#: rc_option_editor.cc:1111
-msgid ""
-"<b>When enabled</b> Audio Unit Plugins are discovered on application start. When "
-"disabled AU plugins will only be available after triggering a 'Scan' manually. The "
-"first successful scan will enable AU auto-scan, Any crash during plugin discovery "
-"will disable it."
-msgstr ""
-"<b>启用时</b> 音频单位插件被应用起点发现。当禁用音频单位插件时,仅在手动触发“扫"
-"描”时可用。第一次成功的扫描将启用音频单位自动扫描,若插件发现任何崩溃的情况都将禁用"
-"自动扫描。"
-
-#: rc_option_editor.cc:1114
-msgid "Clear AU Cache"
-msgstr "清除音频单位缓存"
-
-#: rc_option_editor.cc:1118
-msgid "Clear AU Blacklist"
-msgstr "清除音频单位黑名单"
-
-#: rc_option_editor.cc:1201
-msgid "Set Windows VST Search Path"
-msgstr "设置 Windows VST 搜索路径"
-
-#: rc_option_editor.cc:1216
-msgid "Set Linux VST Search Path"
-msgstr "设置 Linux VST 搜索路径"
-
-#: rc_option_editor.cc:1297
-msgid "%1 Preferences"
-msgstr "%1 首选项"
-
-#: rc_option_editor.cc:1309
-msgid "DSP CPU Utilization"
-msgstr "DSP 的 CPU 利用率"
-
-#: rc_option_editor.cc:1313
-msgid "Signal processing uses"
-msgstr "信号处理使用"
-
-#: rc_option_editor.cc:1318
-msgid "all but one processor"
-msgstr "除了一个处理器外所有的"
-
-#: rc_option_editor.cc:1319
-msgid "all available processors"
-msgstr "所有可用的处理器"
-
-#: rc_option_editor.cc:1322
-msgid "%1 processors"
-msgstr "%1 处理器"
-
-#: rc_option_editor.cc:1325
-msgid "This setting will only take effect when %1 is restarted."
-msgstr "该设置将仅仅在 %1 重新启动时起作用"
-
-#: rc_option_editor.cc:1330
-msgid "Options|Undo"
-msgstr "选项|撤销"
-
-#: rc_option_editor.cc:1337
-msgid "Verify removal of last capture"
-msgstr "确认移除最后的捕获部分"
-
-#: rc_option_editor.cc:1345
-msgid "Make periodic backups of the session file"
-msgstr "定期备份会话文件"
-
-#: rc_option_editor.cc:1350
-msgid "Session Management"
-msgstr "会话管理"
-
-#: rc_option_editor.cc:1355
-msgid "Always copy imported files"
-msgstr "总是复制导入的文件"
-
-#: rc_option_editor.cc:1362
-msgid "Default folder for new sessions:"
-msgstr "新会话的默认文件夹:"
-
-#: rc_option_editor.cc:1370
-msgid "Maximum number of recent sessions"
-msgstr "当前会话的最大数量"
-
-#: rc_option_editor.cc:1383
-msgid "Click gain level"
-msgstr "点击增益电平"
-
-#: rc_option_editor.cc:1388 route_time_axis.cc:266 route_time_axis.cc:821
-msgid "Automation"
-msgstr "自动化"
-
-#: rc_option_editor.cc:1393
-msgid "Thinning factor (larger value => less data)"
-msgstr " 稀释参数(较大的数值 => 较少的数据)"
-
-#: rc_option_editor.cc:1402
-msgid "Automation sampling interval (milliseconds)"
-msgstr "自动化样本间隔(毫秒)"
-
-#: rc_option_editor.cc:1414
-msgid "Keep record-enable engaged on stop"
-msgstr "停止时,保持启用的录制仍在启用中"
-
-#: rc_option_editor.cc:1423
-msgid "Play loop is a transport mode"
-msgstr "播放循环是一个播送模式"
-
-#: rc_option_editor.cc:1428
-msgid ""
-"<b>When enabled</b> the loop button does not start playback but forces playback to "
-"always play the loop\n"
-"\n"
-"<b>When disabled</b> the loop button starts playing the loop, but stop then "
-"cancels loop playback"
-msgstr ""
-"<b>启用时</b> 循环按钮不启动回放,但强制回放总是播放循环\n"
-"\n"
-"<b>禁用时</b> 循环按钮启动播放循环,但停止也取消循环回放"
-
-#: rc_option_editor.cc:1434
-msgid "Stop recording when an xrun occurs"
-msgstr "在x运行出现时停止录制"
-
-#: rc_option_editor.cc:1439
-msgid ""
-"<b>When enabled</b> %1 will stop recording if an over- or underrun is detected by "
-"the audio engine"
-msgstr "<b>启用时</b> 如果音频引擎检测到一个超载或者欠载运行 %1 将停止录制"
-
-#: rc_option_editor.cc:1445
-msgid "Create markers where xruns occur"
-msgstr "在x运行出现时创建标记"
-
-#: rc_option_editor.cc:1454
-msgid "Stop at the end of the session"
-msgstr "在会话终点停止"
-
-#: rc_option_editor.cc:1459
-msgid ""
-"<b>When enabled</b> if %1 is <b>not recording</b>, it will stop the transport when "
-"it reaches the current session end marker\n"
-"\n"
-"<b>When disabled</b> %1 will continue to roll past the session end marker at all "
-"times"
-msgstr ""
-"<b>启用时</b> 如果 %1 是 <b>非录制中</b>,当它达到当前会话的终点标记时它将停止播"
-"送\n"
-"\n"
-"<b>禁用时</b> %1 将继续一直滚动运行到会话终点标记"
-
-#: rc_option_editor.cc:1467
-msgid "Do seamless looping (not possible when slaved to MTC, LTC etc)"
-msgstr "做无缝循环(当从属于 MTC,LTC 诸如此类时不可能实现)"
-
-#: rc_option_editor.cc:1472
-msgid ""
-"<b>When enabled</b> this will loop by reading ahead and wrapping around at the "
-"loop point, preventing any need to do a transport locate at the end of the loop\n"
-"\n"
-"<b>When disabled</b> looping is done by locating back to the start of the loop "
-"when %1 reaches the end which will often cause a small click or delay"
-msgstr ""
-"<b>启用时</b>这将通过预先读取来循环并且在循环点围绕,防止任何需要把播送定位在循环的"
-"终点的情况\n"
-"\n"
-"<b>禁用时</b> 当 %1 到达会经常引起一个轻微识别声或延迟的终点时,通过定位回到循环的"
-"起点而完成循环"
-
-#: rc_option_editor.cc:1480
-msgid "Disable per-track record disarm while rolling"
-msgstr "当滚动时禁用预先音轨录制解除"
-
-#: rc_option_editor.cc:1484
-msgid ""
-"<b>When enabled</b> this will prevent you from accidentally stopping specific "
-"tracks recording during a take"
-msgstr "<b>启用时</b> 这将防止您在这过程中意外停止指定的音轨录制"
-
-#: rc_option_editor.cc:1489
-msgid "12dB gain reduction during fast-forward and fast-rewind"
-msgstr "快进和倒带时有 12dB 的增益减少"
-
-#: rc_option_editor.cc:1493
-msgid ""
-"This will reduce the unpleasant increase in perceived volume that occurs when fast-"
-"forwarding or rewinding through some kinds of audio"
-msgstr "当快进或倒带通过某些音频类型时,这将减少令人感到不适的可感知音量增加的现像"
-
-#: rc_option_editor.cc:1497
-msgid "Sync/Slave"
-msgstr "同步/从属"
-
-#: rc_option_editor.cc:1501
-msgid "External timecode source"
-msgstr "外部时间码源"
-
-#: rc_option_editor.cc:1510
-msgid "Match session video frame rate to external timecode"
-msgstr "匹配会话视频帧率到外部时间码"
-
-#: rc_option_editor.cc:1516
-msgid ""
-"This option controls the value of the video frame rate <i>while chasing</i> an "
-"external timecode source.\n"
-"\n"
-"<b>When enabled</b> the session video frame rate will be changed to match that of "
-"the selected external timecode source.\n"
-"\n"
-"<b>When disabled</b> the session video frame rate will not be changed to match "
-"that of the selected external timecode source.Instead the frame rate indication in "
-"the main clock will flash red and %1 will convert between the external timecode "
-"standard and the session standard."
-msgstr ""
-"这个选项控制视频帧率的数值<i>当追随</i>一个外部时间码源时\n"
-"\n"
-"<b>启用时</b> 会话视频帧率将被改变为匹配到已选中的外部时间码源。\n"
-"\n"
-"<b>禁用时</b> 会话视频帧率将不会被改变为匹配到已选中的外部时间码源。取而代之的是,"
-"帧率在主计时器里的指示将在转换外部时间代码标准和会话标准两者间转换。"
-
-#: rc_option_editor.cc:1526
-msgid "Sync lock timecode to clock - Disable drift compensation."
-msgstr "同步时间代码到计时器——禁用漂移补偿。"
-
-#: rc_option_editor.cc:1532
-msgid ""
-"<b>When enabled</b> %1 will never varispeed when slaved to external timecode. Sync "
-"Lock indicates that the selected external timecode source shares clock-sync (Black "
-"& Burst, Wordclock, etc) with the audio interface. This option disables drift "
-"compensation. The transport speed is fixed at 1.0.Varispeed LTC will be ignored "
-"and cause drift.\n"
-"\n"
-"<b>When disabled</b> %1 will compensate for potential drift, regardless if the "
-"timecode sources shares clock sync."
-msgstr ""
-"<b>启用时</b> 在从属于外部时间码时 %1 将不会变速。同步锁定表明已选中的外部时间码源"
-"与音频界面共享计时器同步( Black & Burst, Wordclock,等等)。这个选项禁用漂移"
-"补偿。播送速度被修正于 1.0.Varispeed LTC 将被忽略且引起漂移。\n"
-"\n"
-"<b>禁用时</b> %1 将补偿潜在的漂移,不论时间码源是否共享时间同步。"
-
-#: rc_option_editor.cc:1547
-msgid "Lock to 29.9700 fps instead of 30000/1001"
-msgstr "锁定到 29.9700 fps 以替代 30000/1001"
-
-#: rc_option_editor.cc:1553
-msgid ""
-"<b>When enabled</b> the external timecode source is assumed to use 29.97 fps "
-"instead of 30000/1001.\n"
-"SMPTE 12M-1999 specifies 29.97df as 30000/1001. The spec further mentions that "
-"drop-frame timecode has an accumulated error of -86ms over a 24-hour period.\n"
-"Drop-frame timecode would compensate exactly for a NTSC color frame rate of 30 * "
-"0.9990 (ie 29.970000). That is not the actual rate. However, some vendors use that "
-"rate - despite it being against the specs - because the variant of using exactly "
-"29.97 fps has zero timecode drift.\n"
-msgstr ""
-"<b>启用时</b> 外部时间码源被假定使用 29.97 fps 以替代 30000/1001 。\n"
-"SMPTE 12M-1999 指定 29.97df 为 30000/1001 。进一步的规范提到丢帧时间码有一个在 24 "
-"小时内 -86ms 的累积错误。\n"
-"丢帧时间码将完全补偿 30 * 0.9990 (ie 29.970000)的 NTSC 色彩帧率。那不是实际帧率。"
-"然而,某些厂商使用这帧率——尽管它违背规范——因为使用实际 29.97 fps 的时间码漂移变化"
-"为 0 。\n"
-
-#: rc_option_editor.cc:1563
-msgid "LTC Reader"
-msgstr "LTC 阅读器"
-
-#: rc_option_editor.cc:1567
-msgid "LTC incoming port"
-msgstr "LTC 导入端口"
-
-#: rc_option_editor.cc:1582
-msgid "LTC Generator"
-msgstr "LTC 生成器"
-
-#: rc_option_editor.cc:1587
-msgid "Enable LTC generator"
-msgstr "启用 LTC 生成器"
-
-#: rc_option_editor.cc:1594
-msgid "Send LTC while stopped"
-msgstr "停止时发送 LTC "
-
-#: rc_option_editor.cc:1600
-msgid ""
-"<b>When enabled</b> %1 will continue to send LTC information even when the "
-"transport (playhead) is not moving"
-msgstr "<b>启用时</b> %1 将继续发送 LTC 信息,即使当播送(指针)不再移动"
-
-#: rc_option_editor.cc:1606
-msgid "LTC generator level"
-msgstr "LTC 生成器电平"
-
-#: rc_option_editor.cc:1610
-msgid ""
-"Specify the Peak Volume of the generated LTC signal in dbFS. A good value is  0dBu "
-"^= -18dbFS in an EBU calibrated system"
-msgstr ""
-"以 dbFS 指定生成 LTC 信号音量的峰值。建议的数值是 0dBu ^= -18dbFS 在一个 EBU 校准系"
-"统里"
-
-#: rc_option_editor.cc:1622
-msgid "Allow dragging of playhead"
-msgstr "允许拖拽指针"
-
-#: rc_option_editor.cc:1630
-msgid "Move relevant automation when audio regions are moved"
-msgstr "当音频区域移动时,也移动相关的自动化"
-
-#: rc_option_editor.cc:1638
-msgid "Show meters on tracks in the editor"
-msgstr "在编辑器的音轨上显示节拍"
-
-#: rc_option_editor.cc:1646
-msgid "Display master-meter in the toolbar"
-msgstr "在工具栏里显示主控节拍"
-
-#: rc_option_editor.cc:1653
-msgid "Default fade shape"
-msgstr "默认淡化形状"
-
-#: rc_option_editor.cc:1672
-msgid "Regions in active edit groups are edited together"
-msgstr "区域位于激活编辑的分组里会被彼此编辑"
-
-#: rc_option_editor.cc:1673
-msgid "whenever they overlap in time"
-msgstr "不论何时都及时重叠它们"
-
-#: rc_option_editor.cc:1674
-msgid "only if they have identical length, position and origin"
-msgstr "仅在当它们拥有完全相同的长度、位置和原点时"
-
-#: rc_option_editor.cc:1684
-msgid "Make rubberband selection rectangle snap to the grid"
-msgstr "使橡皮带已选择部分矩形吸附到网格对齐"
-
-#: rc_option_editor.cc:1692
-msgid "Show waveforms in regions"
-msgstr "在区域内显示波形"
-
-#: rc_option_editor.cc:1700
-msgid "Show gain envelopes in audio regions"
-msgstr "在音频区域内显示增益封装"
-
-#: rc_option_editor.cc:1701
-msgid "in all modes"
-msgstr "在所有模式内"
-
-#: rc_option_editor.cc:1702
-msgid "only in region gain mode"
-msgstr "仅在区域增益模式内"
-
-#: rc_option_editor.cc:1709
-msgid "Waveform scale"
-msgstr "波形比例"
-
-#: rc_option_editor.cc:1714
-msgid "linear"
-msgstr "线性"
-
-#: rc_option_editor.cc:1715
-msgid "logarithmic"
-msgstr "对数"
-
-#: rc_option_editor.cc:1721
-msgid "Waveform shape"
-msgstr "波形形状"
-
-#: rc_option_editor.cc:1726
-msgid "traditional"
-msgstr "传统的"
-
-#: rc_option_editor.cc:1727
-msgid "rectified"
-msgstr "已矫正的"
-
-#: rc_option_editor.cc:1736
-msgid "Show waveforms for audio while it is being recorded"
-msgstr "在音频被录制时显示它的波形"
-
-#: rc_option_editor.cc:1744
-msgid "Show zoom toolbar"
-msgstr "显示缩放工具栏"
-
-#: rc_option_editor.cc:1752
-msgid "Update editor window during drags of the summary"
-msgstr "当拖拽摘要时,更新编辑器窗口"
-
-#: rc_option_editor.cc:1760
-msgid "Synchronise editor and mixer selection"
-msgstr "同步编辑器和混音器已选中部分"
-
-#: rc_option_editor.cc:1767
-msgid "Name new markers"
-msgstr "命名新标签"
-
-#: rc_option_editor.cc:1773
-msgid ""
-"If enabled, popup a dialog when a new marker is created to allow its name to be "
-"set as it is created.\n"
-"\n"
-"You can always rename markers by right-clicking on them"
+#: amp.cc:412
+#, c-format
+msgid "%.2fdB"
 msgstr ""
-"如果启用,当创建一个新标记时会弹出一个对话框,允许为创建它而设置它的名称。\n"
-"\n"
-"您总是可以通过右键单击它们来重命名标志"
-
-#: rc_option_editor.cc:1779
-msgid "Auto-scroll editor window when dragging near its edges"
-msgstr "当拖动边缘附近时,自动滚动编辑器窗口"
 
-#: rc_option_editor.cc:1786
-msgid "After splitting selected regions, select"
-msgstr "在拆分已选中区域之后,选择"
+#: analyser.cc:121 audioregion.cc:1789
+msgid "Transient Analysis failed for %1."
+msgstr " %1 瞬态分析失败"
 
-#: rc_option_editor.cc:1791
-msgid "no regions"
-msgstr "无区域"
+#: analyser.cc:121
+msgid "Audio File Source"
+msgstr "音频文件来源"
 
-#: rc_option_editor.cc:1794
-msgid "newly-created regions"
-msgstr "新创建的区域"
+#: analysis_graph.cc:136
+msgid "%1 (%2..%3)"
+msgstr ""
 
-#: rc_option_editor.cc:1798
-msgid "existing selection and newly-created regions"
-msgstr "已存在的已选中部分和新创建的区域"
+#: audio_backend.cc:31
+msgid "No Error occurred"
+msgstr " 未发生任何错误"
 
-#: rc_option_editor.cc:1805
-msgid "Buffering"
-msgstr "缓冲中"
-
-#: rc_option_editor.cc:1813
-msgid "Record monitoring handled by"
-msgstr "录制监控的处理是通过"
-
-#: rc_option_editor.cc:1819
-msgid "via Audio Driver"
-msgstr "via 音频驱动"
-
-#: rc_option_editor.cc:1825
-msgid "audio hardware"
-msgstr "音频硬件"
-
-#: rc_option_editor.cc:1832
-msgid "Tape machine mode"
-msgstr "磁带机器模式"
-
-#: rc_option_editor.cc:1837
-msgid "Connection of tracks and busses"
-msgstr "音轨和总线的连接"
-
-#: rc_option_editor.cc:1842
-msgid "Auto-connect master/monitor busses"
-msgstr "自动连接主控/监控总线"
-
-#: rc_option_editor.cc:1849
-msgid "Connect track inputs"
-msgstr "连接音轨输入"
-
-#: rc_option_editor.cc:1854
-msgid "automatically to physical inputs"
-msgstr "自动化物理输入"
-
-#: rc_option_editor.cc:1855 rc_option_editor.cc:1868
-msgid "manually"
-msgstr "手动"
-
-#: rc_option_editor.cc:1861
-msgid "Connect track and bus outputs"
-msgstr "连接音轨和总线输出"
-
-#: rc_option_editor.cc:1866
-msgid "automatically to physical outputs"
-msgstr "自动化物理输出"
-
-#: rc_option_editor.cc:1867
-msgid "automatically to master bus"
-msgstr "自动化主控总线"
-
-#: rc_option_editor.cc:1872
-msgid "Denormals"
-msgstr "异常"
-
-#: rc_option_editor.cc:1877
-msgid "Use DC bias to protect against denormals"
-msgstr "使用直流偏压针对异常防护"
-
-#: rc_option_editor.cc:1884
-msgid "Processor handling"
-msgstr "处理器处理"
-
-#: rc_option_editor.cc:1890
-msgid "no processor handling"
-msgstr "无处理器处理"
-
-#: rc_option_editor.cc:1896
-msgid "use FlushToZero"
-msgstr "使用齐平为零"
-
-#: rc_option_editor.cc:1903
-msgid "use DenormalsAreZero"
-msgstr "使用异常齐平为零"
-
-#: rc_option_editor.cc:1910
-msgid "use FlushToZero and DenormalsAreZero"
-msgstr "使用齐平为零和异常齐平为零"
-
-#: rc_option_editor.cc:1926
-msgid "Silence plugins when the transport is stopped"
-msgstr "当播送停止时插件也无声"
-
-#: rc_option_editor.cc:1934
-msgid "Make new plugins active"
-msgstr "启用新插件"
-
-#: rc_option_editor.cc:1944
-msgid "Enable automatic analysis of audio"
-msgstr "启用音频自动分析"
-
-#: rc_option_editor.cc:1952
-msgid "Replicate missing region channels"
-msgstr "复制缺失的区域声道"
-
-#: rc_option_editor.cc:1959 rc_option_editor.cc:1961 rc_option_editor.cc:1976
-#: rc_option_editor.cc:1988 rc_option_editor.cc:2000 rc_option_editor.cc:2012
-#: rc_option_editor.cc:2016 rc_option_editor.cc:2024 rc_option_editor.cc:2032
-#: rc_option_editor.cc:2040 rc_option_editor.cc:2042 rc_option_editor.cc:2050
-#: rc_option_editor.cc:2058 rc_option_editor.cc:2066 rc_option_editor.cc:2074
-#: rc_option_editor.cc:2076
-msgid "Solo / mute"
-msgstr "独奏 / 静音"
-
-#: rc_option_editor.cc:1964
-msgid "Solo-in-place mute cut (dB)"
-msgstr "适当的独奏削减静音(dB)"
-
-#: rc_option_editor.cc:1971
-msgid "Solo controls are Listen controls"
-msgstr "单独控制即是试听控制"
-
-#: rc_option_editor.cc:1980
-msgid "Listen Position"
-msgstr "试听位置"
-
-#: rc_option_editor.cc:1985
-msgid "after-fader (AFL)"
-msgstr "后置淡化(AFL)"
-
-#: rc_option_editor.cc:1986
-msgid "pre-fader (PFL)"
-msgstr "前置淡化(PFL)"
-
-#: rc_option_editor.cc:1992
-msgid "PFL signals come from"
-msgstr "前置淡化信号来自"
-
-#: rc_option_editor.cc:1997
-msgid "before pre-fader processors"
-msgstr "在前置淡化处理器之前"
-
-#: rc_option_editor.cc:1998
-msgid "pre-fader but after pre-fader processors"
-msgstr "前置淡化但在前置淡化处理器之后"
-
-#: rc_option_editor.cc:2004
-msgid "AFL signals come from"
-msgstr "后置淡化信号来自于"
-
-#: rc_option_editor.cc:2009
-msgid "immediately post-fader"
-msgstr "立即后置淡化"
-
-#: rc_option_editor.cc:2010
-msgid "after post-fader processors (before pan)"
-msgstr "后置淡化处理器之后(平移之前)"
-
-#: rc_option_editor.cc:2019
-msgid "Exclusive solo"
-msgstr "专属独奏"
-
-#: rc_option_editor.cc:2027
-msgid "Show solo muting"
-msgstr "显示独奏静音"
-
-#: rc_option_editor.cc:2035
-msgid "Soloing overrides muting"
-msgstr "独奏覆盖静音"
-
-#: rc_option_editor.cc:2040
-msgid "Default track / bus muting options"
-msgstr "默认音轨 / 总线静音选项"
-
-#: rc_option_editor.cc:2045
-msgid "Mute affects pre-fader sends"
-msgstr "静音效果前置淡化发送"
-
-#: rc_option_editor.cc:2053
-msgid "Mute affects post-fader sends"
-msgstr "静音效果后置淡化发送"
-
-#: rc_option_editor.cc:2061
-msgid "Mute affects control outputs"
-msgstr "静音效果控制输出"
-
-#: rc_option_editor.cc:2069
-msgid "Mute affects main outputs"
-msgstr "静音效果主要输出"
-
-#: rc_option_editor.cc:2074
-msgid "Send Routing"
-msgstr "发送路由"
-
-#: rc_option_editor.cc:2079
-msgid "Link panners of Aux and External Sends with main panner by default"
-msgstr "链接辅助和外部发送面板和默认的主要面板"
-
-#: rc_option_editor.cc:2087
-msgid "MIDI read-ahead time (seconds)"
-msgstr "MIDI 预先读取时间(秒)"
-
-#: rc_option_editor.cc:2105
-msgid "Send MIDI Time Code"
-msgstr "发送 MIDI 时间码"
-
-#: rc_option_editor.cc:2113
-msgid "Percentage either side of normal transport speed to transmit MTC"
-msgstr "正常播送速度与传输 MTC 之间的百分比"
+#: audio_backend.cc:33
+msgid "Failed to initialize audio backend"
+msgstr "初始化音频后端失败"
 
-#: rc_option_editor.cc:2122
-msgid "Obey MIDI Machine Control commands"
-msgstr "遵守 MIDI 机器控制命令"
+#: audio_backend.cc:35
+msgid "Failed to deinitialize audio backend"
+msgstr "撤销初始化音频后端失败"
 
-#: rc_option_editor.cc:2130
-msgid "Send MIDI Machine Control commands"
-msgstr "发送 MIDI 机器控制命令"
+#: audio_backend.cc:37
+msgid "Failed to reinitialize audio backend"
+msgstr "重新初始化音频后端失败"
 
-#: rc_option_editor.cc:2138
-msgid "Send MIDI control feedback"
-msgstr "发送 MIDI 控制反馈"
+#: audio_backend.cc:39
+msgid "Failed to open audio device"
+msgstr "打开音频设备失败"
 
-#: rc_option_editor.cc:2146
-msgid "Inbound MMC device ID"
-msgstr "进场的 MMC 设备 ID"
+#: audio_backend.cc:41
+msgid "Failed to close audio device"
+msgstr "关闭音频设备失败"
 
-#: rc_option_editor.cc:2155
-msgid "Outbound MMC device ID"
-msgstr "出场的 MMC 设备 ID"
+#: audio_backend.cc:43
+msgid "Audio device not valid"
+msgstr "音频设备无效"
 
-#: rc_option_editor.cc:2164
-msgid "Initial program change"
-msgstr "初始程序改变"
+#: audio_backend.cc:45
+msgid "Audio device unavailable"
+msgstr "音频设备不可用"
 
-#: rc_option_editor.cc:2173
-msgid "Display first MIDI bank/program as 0"
-msgstr "显示第一个 MIDI 库/程序为 0"
+#: audio_backend.cc:47
+msgid "Audio device not connected"
+msgstr "音频设备尚未连接"
 
-#: rc_option_editor.cc:2181
-msgid "Never display periodic MIDI messages (MTC, MIDI Clock)"
-msgstr "不再显示定期 MIDI 信息(MTC, MIDI 计时器)"
+#: audio_backend.cc:49
+msgid "Failed to request and reserve audio device"
+msgstr "请求和储备音频设备失败"
 
-#: rc_option_editor.cc:2189
-msgid "Sound MIDI notes as they are selected"
-msgstr "当 MIDI 音符被选中时发出声音"
+#: audio_backend.cc:51
+msgid "Audio device Input/Output error"
+msgstr "音频设备输入/输出错误"
 
-#: rc_option_editor.cc:2194
-msgid "Midi Audition"
-msgstr "Midi 监听"
+#: audio_backend.cc:53
+msgid "Failed to open MIDI device"
+msgstr "打开 MIDI 设备失败"
 
-#: rc_option_editor.cc:2198
-msgid "Midi Audition Synth (LV2)"
-msgstr "Midi 监听合成(LV2)"
+#: audio_backend.cc:55
+msgid "Failed to close MIDI device"
+msgstr "关闭 MIDI 设备失败"
 
-#: rc_option_editor.cc:2229 rc_option_editor.cc:2239 rc_option_editor.cc:2241
-msgid "User interaction"
-msgstr "用户交互"
+#: audio_backend.cc:57
+msgid "MIDI device unavailable"
+msgstr " MIDI 设备不可用"
 
-#: rc_option_editor.cc:2232
-msgid ""
-"Use translations of %1 messages\n"
-"   <i>(requires a restart of %1 to take effect)</i>\n"
-"   <i>(if available for your language preferences)</i>"
-msgstr ""
-"%1 信息的用户交互\n"
-"    <i>(要求重启 %1 以生效)</i>\n"
-"     <i>(如果您的语言首选项可用)</i>"
-
-#: rc_option_editor.cc:2239
-msgid "Keyboard"
-msgstr "键盘"
-
-#: rc_option_editor.cc:2249
-msgid "Control surface remote ID"
-msgstr "控制面远程 ID"
-
-#: rc_option_editor.cc:2254
-msgid "assigned by user"
-msgstr "由用户指定"
-
-#: rc_option_editor.cc:2255
-msgid "follows order of mixer"
-msgstr "混音器按如下排序"
-
-#: rc_option_editor.cc:2269 rc_option_editor.cc:2278 rc_option_editor.cc:2287
-#: rc_option_editor.cc:2297 rc_option_editor.cc:2321 rc_option_editor.cc:2334
-#: rc_option_editor.cc:2343
-msgid "Preferences|GUI"
-msgstr "首选项|图形用户界面"
-
-#: rc_option_editor.cc:2272
-msgid "Graphically indicate mouse pointer hovering over various widgets"
-msgstr "当悬停在各种小部件上面时显示鼠标指针"
-
-#: rc_option_editor.cc:2281
-msgid "Show tooltips if mouse hovers over a control"
-msgstr "如果鼠标悬停在一个控件上面时显示工具提示"
-
-#: rc_option_editor.cc:2290
-msgid "Use name highlight bars in region displays (requires a restart)"
-msgstr "在区域显示中使用名称突出显示栏(需要重新启动)"
-
-#: rc_option_editor.cc:2303
-msgid "update transport clock display at FPS instead of every 100ms"
-msgstr "以 FPS 替代每 100ms 更新播送计时器显示"
-
-#: rc_option_editor.cc:2312
-msgid "Lock timeout (seconds)"
-msgstr "锁定超时(秒)"
-
-#: rc_option_editor.cc:2320
-msgid "Lock GUI after this many idle seconds (zero to never lock)"
-msgstr "在空闲这么多秒之后锁定图形用户界面(零则永不锁定)"
-
-#: rc_option_editor.cc:2336
-msgid "Mixer Strip"
-msgstr "混音器栏"
-
-#: rc_option_editor.cc:2346
-msgid "Use narrow strips in the mixer by default"
-msgstr "默认在混音器里使用细长栏"
-
-#: rc_option_editor.cc:2351 rc_option_editor.cc:2365 rc_option_editor.cc:2384
-#: rc_option_editor.cc:2400 rc_option_editor.cc:2416 rc_option_editor.cc:2430
-#: rc_option_editor.cc:2444 rc_option_editor.cc:2446
-msgid "Preferences|Metering"
-msgstr "首选项|节拍"
-
-#: rc_option_editor.cc:2355
-msgid "Peak hold time"
-msgstr "峰值停留时间"
-
-#: rc_option_editor.cc:2361
-msgid "short"
-msgstr "短"
-
-#: rc_option_editor.cc:2362
-msgid "medium"
-msgstr "中"
+#: audio_backend.cc:59
+msgid "MIDI device not connected"
+msgstr " MIDI 设备尚未连接"
 
-#: rc_option_editor.cc:2363
-msgid "long"
-msgstr "é•¿"
+#: audio_backend.cc:61
+msgid "MIDI device Input/Output error"
+msgstr " MIDI 设备输入输出错误"
 
-#: rc_option_editor.cc:2369
-msgid "DPM fall-off"
-msgstr "DPM 衰减"
+#: audio_backend.cc:63
+msgid "Sample format is not supported"
+msgstr "样本格式不被支持"
 
-#: rc_option_editor.cc:2375
-msgid "slowest [6.6dB/sec]"
-msgstr "最慢 [6.6dB/sec]"
+#: audio_backend.cc:65
+msgid "Sample rate is not supported"
+msgstr "采样率不受支持"
 
-#: rc_option_editor.cc:2376
-msgid "slow [8.6dB/sec] (BBC PPM, EBU PPM)"
-msgstr "æ…¢ [8.6dB/sec] (BBC PPM, EBU PPM)"
+#: audio_backend.cc:67
+msgid "Requested input latency is not supported"
+msgstr "所请求的输入延迟不受支持"
 
-#: rc_option_editor.cc:2377
-msgid "slowish [12.0dB/sec] (DIN)"
-msgstr "稍慢 [12.0dB/sec] (DIN)"
+#: audio_backend.cc:69
+msgid "Requested output latency is not supported"
+msgstr "所请求的输出延迟不受支持"
 
-#: rc_option_editor.cc:2378
-msgid "moderate [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"
-msgstr "稳健 [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"
+#: audio_backend.cc:71
+msgid "Period size is not supported"
+msgstr "乐段大小不受支持"
 
-#: rc_option_editor.cc:2379
-msgid "medium [20dB/sec]"
-msgstr "中等 [20dB/sec]"
+#: audio_backend.cc:73
+msgid "Period count is not supported"
+msgstr "乐段计数不受支持"
 
-#: rc_option_editor.cc:2380
-msgid "fast [32dB/sec]"
-msgstr "å¿« [32dB/sec]"
+#: audio_backend.cc:75
+msgid "Device configuration not supported"
+msgstr "设备配置不受支持"
 
-#: rc_option_editor.cc:2381
-msgid "faster [46dB/sec]"
-msgstr "较快 [46dB/sec]"
+#: audio_backend.cc:77
+msgid "Channel count configuration not supported"
+msgstr "声道计数配置不受支持"
 
-#: rc_option_editor.cc:2382
-msgid "fastest [70dB/sec]"
-msgstr "最快 [70dB/sec]"
+#: audio_backend.cc:79
+msgid "Input channel count configuration not supported"
+msgstr "输入声道计数配置不受支持"
 
-#: rc_option_editor.cc:2388
-msgid "Meter line-up level; 0dBu"
-msgstr "节拍排队电平;0dBu"
+#: audio_backend.cc:81
+msgid "Output channel count configuration not supported"
+msgstr "输出声道计数配置不受支持"
 
-#: rc_option_editor.cc:2393 rc_option_editor.cc:2409
-msgid "-24dBFS (SMPTE US: 4dBu = -20dBFS)"
-msgstr ""
+#: audio_backend.cc:83
+msgid "Unable to aquire realtime permissions"
+msgstr "无法获得实时权限"
 
-#: rc_option_editor.cc:2394 rc_option_editor.cc:2410
-msgid "-20dBFS (SMPTE RP.0155)"
-msgstr ""
+#: audio_backend.cc:85
+msgid "Setting audio device thread priorities failed"
+msgstr "设置音频设备线程优先级失败"
 
-#: rc_option_editor.cc:2395 rc_option_editor.cc:2411
-msgid "-18dBFS (EBU, BBC)"
-msgstr ""
+#: audio_backend.cc:87
+msgid "Setting MIDI device thread priorities failed"
+msgstr "设置 MIDI 设备线程优先级失败"
 
-#: rc_option_editor.cc:2396 rc_option_editor.cc:2412
-msgid "-15dBFS (DIN)"
-msgstr ""
+#: audio_backend.cc:89
+msgid "Failed to start process thread"
+msgstr "启动进程线程失败"
 
-#: rc_option_editor.cc:2398
-msgid ""
-"Configure meter-marks and color-knee point for dBFS scale DPM, set reference level "
-"for IEC1/Nordic, IEC2 PPM and VU meter."
-msgstr ""
-"配置节拍标志和转角颜色点用于 dBFS 缩放 DPM,为 IEC1/Nordic、IEC2 PPM 和 VU 节拍设置"
-"参考电平。"
+#: audio_backend.cc:91
+msgid "Failed to start freewheel thread"
+msgstr "启动飞轮线程失败"
 
-#: rc_option_editor.cc:2404
-msgid "IEC1/DIN Meter line-up level; 0dBu"
-msgstr "IEC1/DIN 节拍排队电平;0dBu"
+#: audio_backend.cc:93
+msgid "Failed to register audio/midi ports"
+msgstr "注册音频/MIDI端口失败"
 
-#: rc_option_editor.cc:2414
-msgid "Reference level for IEC1/DIN meter."
-msgstr "IEC1/DIN 节拍参考电平。"
+#: audio_backend.cc:95
+msgid "Failed to re-connect audio/midi ports"
+msgstr "无法连接音频/MIDI引擎"
 
-#: rc_option_editor.cc:2420
-msgid "VU Meter standard"
-msgstr "VU 节拍标准"
+#: audio_backend.cc:97
+msgid "Out Of Memory Error"
+msgstr "内存溢出错误"
 
-#: rc_option_editor.cc:2425
-msgid "0VU = -2dBu (France)"
-msgstr "0VU = -2dBu (法国)"
+#: audio_backend.cc:99
+msgid "Could not reconnect to Audio/MIDI engine"
+msgstr "无法连接音频/MIDI引擎"
 
-#: rc_option_editor.cc:2426
-msgid "0VU = 0dBu (North America, Australia)"
-msgstr "0VU = 0dBu (北美,澳洲)"
+#: audio_backend.cc:107 export_formats.cc:52 session.cc:6772 session.cc:6792
+msgid "None"
+msgstr "æ— "
 
-#: rc_option_editor.cc:2427
-msgid "0VU = +4dBu (standard)"
-msgstr "0VU = +4dBu (标准)"
+#: audio_backend.cc:109
+msgid "Default"
+msgstr "默认"
 
-#: rc_option_editor.cc:2428
-msgid "0VU = +8dBu"
-msgstr ""
+#: audio_diskstream.cc:257
+msgid "AudioDiskstream: Playlist \"%1\" isn't an audio playlist"
+msgstr "音频硬盘流:播放列表 \"%1\" 并不是一个音频播放列表"
 
-#: rc_option_editor.cc:2434
-msgid "Peak threshold [dBFS]"
-msgstr "峰值临界值 [dBFS]"
+#: audio_diskstream.cc:309
+msgid "AudioDiskstream %1: there is no existing playlist to make a copy of!"
+msgstr "音频硬盘流 %1:没有已存在的播放列表可用于复制!"
 
-#: rc_option_editor.cc:2442
+#: audio_diskstream.cc:880 audio_diskstream.cc:890
 msgid ""
-"Specify the audio signal level in dbFS at and above which the meter-peak indicator "
-"will flash red."
-msgstr "以 dbFS 指定音频信号电平,达到以及超过节拍峰时,值指示器将闪烁红灯。"
-
-#: rc_option_editor.cc:2449
-msgid "LED meter style"
-msgstr "LED 节拍类型"
-
-#: rc_option_editor.cc:2457
-msgid "Theme"
-msgstr "主题"
-
-#: region_editor.cc:79
-msgid "audition this region"
-msgstr "监听此区域"
+"AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3"
+msgstr "音频硬盘流 %1:重新填充时,在 %3 帧无法从播放列表读取 %2 "
 
-#: region_editor.cc:88 region_layering_order_editor.cc:75
-msgid "Position:"
-msgstr "位置:"
+#: audio_diskstream.cc:1053
+msgid "AudioDiskstream %1: cannot read %2 from playlist at frame %3"
+msgstr "音频硬盘流 %1:无法在 %3 帧从播放列表读取 %2 "
 
-#: region_editor.cc:90 add_video_dialog.cc:155
-msgid "End:"
-msgstr "终点:"
+#: audio_diskstream.cc:1469 audio_diskstream.cc:1488
+msgid "AudioDiskstream %1: cannot write to disk"
+msgstr "音频硬盘流 %1:无法写入硬盘"
 
-#: region_editor.cc:92 sfdb_ui.cc:145
-msgid "Length:"
-msgstr "长度:"
+#: audio_diskstream.cc:1531
+msgid "AudioDiskstream \"%1\": cannot flush captured data to disk!"
+msgstr "音频硬盘流 \"%1\":无法注入已捕获的数据到硬盘!"
 
-#: region_editor.cc:94
-msgid "Sync point (relative to region):"
-msgstr "同步点(相对于区域):"
+#: audio_diskstream.cc:1627
+msgid "%1: could not create region for complete audio file"
+msgstr "%1:无法为完整的音频文件创建区域"
 
-#: region_editor.cc:96
-msgid "Sync point (absolute):"
-msgstr "同步点(绝对):"
+#: audio_diskstream.cc:1659
+msgid "AudioDiskstream: could not create region for captured audio!"
+msgstr "音频硬盘流:无法为捕获的音频创建区域!"
 
-#: region_editor.cc:98
-msgid "File start:"
-msgstr "文件起点:"
+#: audio_diskstream.cc:1755
+msgid "programmer error: %1"
+msgstr "程序错误:%1"
 
-#: region_editor.cc:102
-msgid "Sources:"
-msgstr "源:"
+#: audio_diskstream.cc:2012
+msgid "AudioDiskstream: channel %1 out of range"
+msgstr "音频硬盘流:声道 %1 超出范围"
 
-#: region_editor.cc:104
-msgid "Source:"
-msgstr "源:"
+#: audio_diskstream.cc:2026 midi_diskstream.cc:1295
+msgid "%1:%2 new capture file not initialized correctly"
+msgstr "%1:%2 新捕获的文件没有正确初始化"
 
-#: region_editor.cc:166
-msgid "Region '%1'"
-msgstr "区域 '%1'"
+#: audio_diskstream.cc:2305
+msgid "%1: cannot restore pending capture source file %2"
+msgstr "%1:无法恢复等候中的捕获源文件 %2"
 
-#: region_editor.cc:273
-msgid "change region start position"
-msgstr "改变区域起点位置"
+#: audio_diskstream.cc:2327
+msgid "%1: incorrect number of pending sources listed - ignoring them all"
+msgstr "%1:等候中已列出的来源编号错误——全部忽略它们"
 
-#: region_editor.cc:289
-msgid "change region end position"
-msgstr "改变区域终点位置"
+#: audio_diskstream.cc:2361
+msgid "%1: cannot create whole-file region from pending capture sources"
+msgstr "%1:无法从等候中的捕获来源创建整个文件区域"
 
-#: region_editor.cc:309
-msgid "change region length"
-msgstr "改变区域长度"
+#: audio_library.cc:82
+msgid "Could not open %1.  Audio Library not saved"
+msgstr "无法打开 %1。音频库尚未保存"
 
-#: region_editor.cc:403 region_editor.cc:415
-msgid "change region sync point"
-msgstr "改变区域同步点"
+#: audio_playlist.cc:509
+msgid ""
+"Legacy crossfade involved an incoming region not present in playlist \"%1\" "
+"- crossfade discarded"
+msgstr ""
+"所遗留的交叉淡化(淡入淡出)涉及一个在播放列表 \"%1\" 里并不存在的导入区域——"
+"交叉淡化(淡入淡出)被弃用"
 
-#: region_layering_order_editor.cc:42
-msgid "RegionLayeringOrderEditor"
-msgstr "区域分层排序编辑器"
+#: audio_playlist.cc:525
+msgid ""
+"Legacy crossfade involved an outgoing region not present in playlist \"%1\" "
+"- crossfade discarded"
+msgstr ""
+"所遗留的交叉淡化(淡入淡出)涉及一个在播放列表 \"%1\" 里并不存在的导出区域——"
+"交叉淡化(淡入淡出)被弃用"
 
-#: region_layering_order_editor.cc:55
-msgid "Region Name"
-msgstr "区域名称"
+#: audio_playlist_importer.cc:68
+msgid "Audio Playlists"
+msgstr "音频播放列表"
 
-#: region_layering_order_editor.cc:72
-msgid "Track:"
-msgstr "音轨:"
+#: audio_playlist_importer.cc:161
+msgid "region"
+msgstr "区域"
 
-#: region_layering_order_editor.cc:104
-msgid "Choose Top Region"
-msgstr "选择顶部区域"
+#: audio_playlist_importer.cc:163
+msgid "regions"
+msgstr "区域"
 
-#: region_view.cc:277
-msgid "SilenceText"
-msgstr "无声文本"
+#: audio_playlist_importer.cc:174 audio_track_importer.cc:244
+msgid "A playlist with this name already exists, please rename it."
+msgstr "已经存在有相同名称的播放列表,请重新命名它。"
 
-#: region_view.cc:292 region_view.cc:311
-msgid "minutes"
-msgstr "分钟"
+#: audio_playlist_importer.cc:183
+msgid "badly-formed XML in imported playlist"
+msgstr "导入的播放列表中 XML 形式混乱"
 
-#: region_view.cc:295 region_view.cc:314
-msgid "msecs"
-msgstr "毫秒"
+#: audio_playlist_importer.cc:267
+msgid "Audio Playlists (unused)"
+msgstr "音频播放列表(未使用的)"
 
-#: region_view.cc:298 region_view.cc:317
-msgid "secs"
-msgstr "秒"
+#: audio_playlist_source.cc:171 audiosource.cc:1046
+#: midi_playlist_source.cc:147 midi_playlist_source.cc:155
+#: midi_playlist_source.cc:162 midi_source.cc:403 plugin_insert.cc:1259
+#: rb_effect.cc:327 session.cc:5314 session.cc:5341 session.cc:5461
+#: session_handle.cc:88 sndfilesource.cc:173
+msgid "programming error: %1"
+msgstr "程序错误:%1"
 
-#: region_view.cc:301
-msgid "%1 silent segment"
-msgid_plural "%1 silent segments"
-msgstr[0] "%1 无声片段"
+#: audio_region_importer.cc:75
+msgid "Audio Regions"
+msgstr "音频区域"
 
-#: region_view.cc:303
-msgid "shortest = %1 %2"
-msgstr "最短 = %1 %2"
+#: audio_region_importer.cc:145
+msgid "Length: "
+msgstr "长度:"
 
-#: region_view.cc:320
+#: audio_region_importer.cc:147
 msgid ""
 "\n"
-"  (shortest audible segment = %1 %2)"
+"Position: "
 msgstr ""
 "\n"
-"  (最短的可听见片段 = %1 %2)"
+"位置:"
 
-#: return_ui.cc:102
-msgid "Return "
-msgstr "返回"
-
-#: rhythm_ferret.cc:48
-msgid "Percussive Onset"
-msgstr "敲击启动"
-
-#: rhythm_ferret.cc:49
-msgid "Note Onset"
-msgstr "音符启动"
-
-#: rhythm_ferret.cc:54
-msgid "Energy Based"
-msgstr "能量基准"
-
-#: rhythm_ferret.cc:55
-msgid "Spectral Difference"
-msgstr "波谱差异"
-
-#: rhythm_ferret.cc:56
-msgid "High-Frequency Content"
-msgstr "高频内容"
-
-#: rhythm_ferret.cc:57
-msgid "Complex Domain"
-msgstr "复合领域"
-
-#: rhythm_ferret.cc:58
-msgid "Phase Deviation"
-msgstr "相位偏差"
-
-#: rhythm_ferret.cc:59
-msgid "Kullback-Liebler"
+#: audio_region_importer.cc:149
+msgid ""
+"\n"
+"Channels: "
 msgstr ""
+"\n"
+"声道:"
 
-#: rhythm_ferret.cc:60
-msgid "Modified Kullback-Liebler"
-msgstr "改良的 Kullback-Liebler"
-
-#: rhythm_ferret.cc:65
-msgid "Split region"
-msgstr "拆分区域"
-
-#: rhythm_ferret.cc:66
-msgid "Snap regions"
-msgstr "吸附区域"
-
-#: rhythm_ferret.cc:67
-msgid "Conform regions"
-msgstr "适应区域"
-
-#: rhythm_ferret.cc:72
-msgid "Rhythm Ferret"
-msgstr "节奏探测"
-
-#: rhythm_ferret.cc:78
-msgid "Analyze"
-msgstr "分析"
-
-#: rhythm_ferret.cc:113
-msgid "Detection function"
-msgstr "检测功能"
-
-#: rhythm_ferret.cc:117
-msgid "Trigger gap"
-msgstr "触发间隙"
-
-#: rhythm_ferret.cc:122 strip_silence_dialog.cc:64
-msgid "Threshold"
-msgstr "临界值"
-
-#: rhythm_ferret.cc:127
-msgid "Peak threshold"
-msgstr "峰值临界值"
-
-#: rhythm_ferret.cc:132
-msgid "Silence threshold"
-msgstr "无声临界值"
-
-#: rhythm_ferret.cc:137
-msgid "Sensitivity"
-msgstr "灵敏度"
-
-#: rhythm_ferret.cc:141
-msgid "Operation"
-msgstr "操作"
-
-#: rhythm_ferret.cc:355
-msgid "split regions (rhythm ferret)"
-msgstr "拆分区域(节奏探测)"
-
-#: route_group_dialog.cc:42
-msgid "Track/bus Group"
-msgstr "音轨/总线分组"
-
-#: route_group_dialog.cc:47
-msgid "Relative"
-msgstr "关联的"
-
-#: route_group_dialog.cc:48
-msgid "Muting"
-msgstr "静音中"
-
-#: route_group_dialog.cc:50
-msgid "Record enable"
-msgstr "启用录制"
-
-#: route_group_dialog.cc:52
-msgid "Active state"
-msgstr "激活状态"
-
-#: route_group_dialog.cc:53 route_group_dialog.cc:82 theme_manager.cc:90
-msgid "Color"
-msgstr "颜色"
-
-#: route_group_dialog.cc:59
-msgid "RouteGroupDialog"
-msgstr "路由分组对话框"
-
-#: route_group_dialog.cc:100
-msgid "<b>Sharing</b>"
-msgstr "<b>共享中</b>"
+#: audio_track.cc:177
+msgid "Unknown bundle \"%1\" listed for input of %2"
+msgstr "未知的集束 \"%1\" 罗列在 %2 的输入"
 
-#: route_group_dialog.cc:200
-msgid "The group name is not unique. Please use a different name."
-msgstr "分组名称有重复。请使用另一个名称。"
+#: audio_track.cc:179
+msgid "in 1"
+msgstr "在 1 内"
 
-#: route_params_ui.cc:84
-msgid "Tracks/Busses"
-msgstr "音轨/总线"
+#: audio_track.cc:180
+msgid "No input bundles available as a replacement"
+msgstr "没有可用的输入集束可作为替代"
 
-#: route_params_ui.cc:103
-msgid "Inputs"
-msgstr "输入"
+#: audio_track.cc:184
+msgid "Bundle %1 was not available - \"in 1\" used instead"
+msgstr "集束 %1 不可用——使用“在 1 内”替代"
 
-#: route_params_ui.cc:104
-msgid "Outputs"
-msgstr "输出"
+#: audio_track.cc:193
+msgid "improper input channel list in XML node (%1)"
+msgstr "在 XML 节点中有不恰当的输入声道列表(%1)"
 
-#: route_params_ui.cc:105
-msgid "Plugins, Inserts & Sends"
-msgstr "插件,插入和发送"
+#: audio_track.cc:216 diskstream.cc:503 source.cc:149
+msgid "%1: this session uses destructive tracks, which are not supported"
+msgstr "本会话使用破坏性的音轨,在此不受支持。"
 
-#: route_params_ui.cc:209
-msgid "route display list item for renamed route not found!"
-msgstr "未找到已重命名路由的路由显示列表条目!"
+#: audio_track_importer.cc:68
+msgid "Audio Tracks"
+msgstr "音频轨道"
 
-#: route_params_ui.cc:279 route_params_ui.cc:307
-#, c-format
-msgid "Playback delay: %<PRId64> samples"
-msgstr "回放延迟: %<PRId64> 采样"
+#: audio_track_importer.cc:253 audio_track_importer.cc:259
+msgid "badly-formed XML in imported track"
+msgstr "导入的音轨中 XML 形式混乱"
 
-#: route_params_ui.cc:499
-msgid "NO TRACK"
-msgstr "没有音轨"
+#: audio_track_importer.cc:287
+msgid "Error Importing Audio track %1"
+msgstr "导入音频轨道 %1 出错"
 
-#: route_params_ui.cc:637 route_params_ui.cc:638
-msgid "No Track or Bus Selected"
-msgstr "没有音轨或总线被选中"
+#: audioanalyser.cc:50
+msgid "cannot load VAMP plugin \"%1\""
+msgstr "无法载入 VAMP 插件 \"%1\""
 
-#: route_time_axis.cc:181
-msgid "Record (Right-click for Step Edit)"
-msgstr "录制(右键点击步进编辑)"
+#: audioanalyser.cc:70
+msgid "VAMP Plugin \"%1\" could not be loaded"
+msgstr " VAMP 插件 \"%1\" 无法被加载"
 
-#: route_time_axis.cc:184
-msgid "Record"
-msgstr "录制"
+#: audioengine.cc:756
+msgid "AudioEngine: cannot load module \"%1\" (%2)"
+msgstr "音频引擎:无法载入模式 \"%1\" (%2)"
 
-#: route_time_axis.cc:254
-msgid "Route Group"
-msgstr "路由分组"
+#: audioengine.cc:762
+msgid "AudioEngine: backend at \"%1\" has no descriptor function."
+msgstr "音频引擎:在 \"%1\" 的后端没有描述符函数。"
 
-#: route_time_axis.cc:264
-msgid "MIDI Controllers and Automation"
-msgstr "MIDI 控制器和自动化"
+#: audioengine.cc:841
+msgid "Could not create backend for %1: %2"
+msgstr "无法为 %1 创建后端:%2"
 
-#: route_time_axis.cc:495
-msgid "Show All Automation"
-msgstr "显示所有的自动化"
+#: audioregion.cc:1757
+msgid ""
+"You have requested an operation that requires audio analysis.\n"
+"\n"
+"You currently have \"auto-analyse-audio\" disabled, which means that "
+"transient data must be generated every time it is required.\n"
+"\n"
+"If you are doing work that will require transient data on a regular basis, "
+"you should probably enable \"auto-analyse-audio\" in Preferences > Audio > "
+"Regions, then quit %1 and restart.\n"
+"\n"
+"This dialog will not display again.  But you may notice a slight delay in "
+"this and future transient-detection operations.\n"
+msgstr ""
 
-#: route_time_axis.cc:498
-msgid "Show Existing Automation"
-msgstr "显示已有的自动化"
+#: audioregion.cc:1789
+msgid "Audio Region"
+msgstr "音频区域"
 
-#: route_time_axis.cc:501
-msgid "Hide All Automation"
-msgstr "隐藏所有自动化"
+#: audiosource.cc:228
+msgid "cannot rename peakfile for %1 from %2 to %3 (%4)"
+msgstr "无法为 %1 从 %2 到 %3(%4)重命名峰值文件"
 
-#: route_time_axis.cc:510
-msgid "Processor automation"
-msgstr "处理器自动化"
+#: audiosource.cc:262
+msgid "AudioSource: cannot stat peakfile \"%1\""
+msgstr "音频来源:无法启动峰值文件 \"%1\""
 
-#: route_time_axis.cc:517
-msgid "Fader"
-msgstr "淡化"
+#: audiosource.cc:368
+msgid "Cannot open peakfile @ %1 for size check (%2)"
+msgstr "无法为尺寸校核(%2)打开峰值文件 @ %1 "
 
-#: route_time_axis.cc:535
-msgid "Pan"
-msgstr "平移"
+#: audiosource.cc:389
+msgid "peak file %1 is truncated from %2 to %3"
+msgstr "峰值文件 %1 被从 %2 到 %3 截短删节"
 
-#: route_time_axis.cc:626
-msgid "Overlaid"
-msgstr "重叠"
+#: audiosource.cc:392
+msgid "Cannot open peakfile @ %1 for size check (%2) after rebuild"
+msgstr "无法为尺寸校核(%2)重建之后打开峰值文件 @ %1 "
 
-#: route_time_axis.cc:632
-msgid "Stacked"
-msgstr "堆栈"
+#: audiosource.cc:404
+msgid "Cannot open peakfile @ %1 for reading (%2)"
+msgstr "无法为读取(%2)打开峰值文件 @ %1 "
 
-#: route_time_axis.cc:640
-msgid "Layers"
-msgstr "层"
+#: audiosource.cc:438
+msgid "cannot read sample data for unscaled peak computation"
+msgstr "无法为尚未比例化的峰值计算读取采样数据"
 
-#: route_time_axis.cc:709
-msgid "Automatic (based on I/O connections)"
-msgstr "自动的(基于输入/输出连接)"
+#: audiosource.cc:473 audiosource.cc:568
+msgid "map failed - could not create file mapping for peakfile %1."
+msgstr "映射失败——无法为峰值文件 %1 创建文件映射。"
 
-#: route_time_axis.cc:718
-msgid "(Currently: Existing Material)"
-msgstr "(当前:现有材料)"
+#: audiosource.cc:479 audiosource.cc:574
+msgid "map failed - could not map peakfile %1."
+msgstr "映射失败——无法映射峰值文件 %1。"
 
-#: route_time_axis.cc:721
-msgid "(Currently: Capture Time)"
-msgstr "(当前:捕获时间)"
+#: audiosource.cc:490 audiosource.cc:585
+msgid "unmap failed - could not unmap peakfile %1."
+msgstr "撤销映射失败——无法撤销映射峰值文件 %1。"
 
-#: route_time_axis.cc:729
-msgid "Align With Existing Material"
-msgstr "与现有材料对齐"
+#: audiosource.cc:496 audiosource.cc:591
+msgid "map failed - could not mmap peakfile %1."
+msgstr "映射失败——无法内存映射峰值文件 %1。"
 
-#: route_time_axis.cc:734
-msgid "Align With Capture Time"
-msgstr "与捕获时间对齐"
+#: audiosource.cc:681
+msgid ""
+"AudioSource[%1]: peak read - cannot read %2 samples at offset %3 of %4 (%5)"
+msgstr "音频来源 [%1]:峰值读取——在 %4(%5)偏移 %3 处无法读取 %2 样本"
 
-#: route_time_axis.cc:739
-msgid "Alignment"
-msgstr "对齐"
+#: audiosource.cc:748
+msgid "%1: could not write read raw data for peak computation (%2)"
+msgstr "%1:无法为峰值计算(%2)写入读取原始数据"
 
-#: route_time_axis.cc:774
-msgid "Normal Mode"
-msgstr "正常模式"
+#: audiosource.cc:815
+msgid "AudioSource: cannot open _peakpath (c) \"%1\" (%2)"
+msgstr "音频来源:无法打开 _peakpath (c) \"%1\" (%2)"
 
-#: route_time_axis.cc:780
-msgid "Tape Mode"
-msgstr "磁带模式"
+#: audiosource.cc:894 audiosource.cc:1016
+msgid "%1: could not seek in peak file data (%2)"
+msgstr "%1:无法搜寻峰值文件数据(%2)"
 
-#: route_time_axis.cc:786
-msgid "Non-Layered Mode"
-msgstr "不分层模式"
+#: audiosource.cc:899 audiosource.cc:1025
+msgid "%1: could not write peak file data (%2)"
+msgstr "%1:无法写入峰值文件数据(%2)"
 
-#: route_time_axis.cc:792
-msgid "Record Mode"
-msgstr "录制模式"
+#: audiosource.cc:1058
+msgid "could not truncate peakfile %1 to %2 (error: %3)"
+msgstr "无法从 %1 到 %2 截短峰值文件(错误:%3)"
 
-#: route_time_axis.cc:799 route_time_axis.cc:1789
-msgid "Playlist"
-msgstr "播放列表"
+#: auditioner.cc:105
+msgid "Falling back to Reasonable Synth for Midi Audition"
+msgstr "为 MIDI 监听后撤到合理的合成。"
 
-#: route_time_axis.cc:1097
-msgid "Rename Playlist"
-msgstr "重命名播放列表"
+#: auditioner.cc:107
+msgid "No synth for midi-audition found."
+msgstr "无合成可用于 MIDI 监听。"
 
-#: route_time_axis.cc:1098
-msgid "New name for playlist:"
-msgstr "播放列表的新名称:"
+#: auditioner.cc:163
+msgid "no outputs available for auditioner - manual connection required"
+msgstr "无输出可用于监听器——需要手动连接"
 
-#: route_time_axis.cc:1183
-msgid "New Copy Playlist"
-msgstr "新建播放列表拷贝"
+#: auditioner.cc:408 auditioner.cc:455
+msgid "Cannot setup auditioner processing flow for %1 channels"
+msgstr "无法为 %1 声道设置监听器处理流程"
 
-#: route_time_axis.cc:1184 route_time_axis.cc:1237
-msgid "Name for new playlist:"
-msgstr "新播放列表名称:"
+#: auditioner.cc:443
+msgid "Failed to load synth for MIDI-Audition."
+msgstr "为 MIDI 监听载入合成失败。"
 
-#: route_time_axis.cc:1236
-msgid "New Playlist"
-msgstr "新建播放列表"
+#: auditioner.cc:462
+msgid "Auditioning of regions other than Audio or Midi is not supported."
+msgstr "不同于音频或MIDI的区域监听不受支持。"
 
-#: route_time_axis.cc:1436
-msgid "You cannot create a track with that name as it is reserved for %1"
-msgstr "无法以此名称创建音轨,因为它被 %1 保留使用"
+#: automatable.cc:87
+msgid "Automation node has no path property"
+msgstr "自动化节点没有路径属性"
 
-#: route_time_axis.cc:1678
-msgid "New Copy..."
-msgstr "新建拷贝…"
+#: automatable.cc:108
+msgid "cannot open %2 to load automation data (%3)"
+msgstr "无法打开 %2 来载入自动化数据(%3)"
 
-#: route_time_axis.cc:1682
-msgid "New Take"
-msgstr "新建磁带"
+#: automatable.cc:140
+msgid "cannot load automation data from %2"
+msgstr "无法从 %2 载入自动化数据"
 
-#: route_time_axis.cc:1683
-msgid "Copy Take"
-msgstr "拷贝磁带"
+#: automatable.cc:176 send.cc:95 session.cc:851
+msgid "Fader"
+msgstr "淡化器"
 
-#: route_time_axis.cc:1688
-msgid "Clear Current"
-msgstr "清除当前"
+#: automatable.cc:178
+msgid "Trim"
+msgstr "修剪"
 
-#: route_time_axis.cc:1691
-msgid "Select From All..."
-msgstr "选择所有…"
+#: automatable.cc:180
+msgid "Mute"
+msgstr "静音"
 
-#: route_time_axis.cc:1779
-msgid "Take: %1.%2"
-msgstr "磁带:%1.%2"
+#: automation_control.cc:228
+msgid "record %1 automation"
+msgstr "录制 %1 自动化"
 
-#: route_time_axis.cc:2169 selection.cc:1007 selection.cc:1061
-msgid "programming error: "
-msgstr "程序错误:"
+#: automation_list.cc:410
+msgid "automation list: cannot load coordinates from XML, all points ignored"
+msgstr "自动化列表:无法从 XML 载入坐标,已忽略所有的点"
 
-#: route_time_axis.cc:2585
-msgid "Underlays"
-msgstr "底层"
+#: automation_list.cc:456
+msgid ""
+"automation list: no x-coordinate stored for control point (point ignored)"
+msgstr "自动化列表:无控制点所存储的 X 坐标(已忽略点)"
 
-#: route_time_axis.cc:2588
-msgid "Remove \"%1\""
-msgstr "移除 \"%1\""
+#: automation_list.cc:462
+msgid ""
+"automation list: no y-coordinate stored for control point (point ignored)"
+msgstr "自动化列表:无控制点所存储的 Y 坐标(已忽略点)"
 
-#: route_time_axis.cc:2638 route_time_axis.cc:2675
-msgid "programming error: underlay reference pointer pairs are inconsistent!"
-msgstr "程序错误:底层参考指针搭配不一致!"
+#: automation_list.cc:476
+msgid ""
+"AutomationList: passed XML node called %1, not \"AutomationList\" - ignored"
+msgstr "自动化列表:已通过的 XML 节点被成为 %1,不是“自动化列表”——已忽略"
 
-#: route_time_axis.cc:2702
-msgid "After-fade listen (AFL)"
-msgstr "后置淡化试听(AFL)"
+#: butler.cc:126
+msgid "Session: could not create butler thread"
+msgstr "会话:无法创建管家线程"
 
-#: route_time_axis.cc:2706
-msgid "Pre-fade listen (PFL)"
-msgstr "前置淡化试听(PFL)"
+#: butler.cc:254 butler.cc:255
+msgid "Butler read ahead failure on dstream %1"
+msgstr "管家在数据流聚类算法  %1 提前读取失败"
 
-#: route_ui.cc:140
-msgid "Mute this track"
-msgstr "静音此音轨"
+#: butler.cc:344 butler.cc:345 butler.cc:393 butler.cc:394
+msgid "Butler write-behind failure on dstream %1"
+msgstr "管家在数据流聚类算法  %1 滞后写入失败"
 
-#: route_ui.cc:144
-msgid "Mute other (non-soloed) tracks"
-msgstr "静音其它(非独奏)音轨"
+#: control_protocol_manager.cc:174
+msgid "control protocol name \"%1\" has no descriptor"
+msgstr "控制协议名称 \"%1\" 没有描述符"
 
-#: route_ui.cc:150
-msgid "Enable recording on this track"
-msgstr "在此音轨启用录制"
+#: control_protocol_manager.cc:181
+msgid "control protocol name \"%1\" could not be initialized"
+msgstr "控制协议名称 \"%1\" 无法被初始化"
 
-#: route_ui.cc:158
-msgid "make mixer strips show sends to this bus"
-msgstr "让混音器栏显示发送到该总线"
+#: control_protocol_manager.cc:265
+msgid "Instantiating mandatory control protocol %1"
+msgstr "正在强制性实例化控制协议 %1"
 
-#: route_ui.cc:163
-msgid "Monitor input"
-msgstr "监控输入"
+#: control_protocol_manager.cc:309
+msgid "looking for control protocols in %1\n"
+msgstr "正在 \"%1\" 中查找控制协议\n"
 
-#: route_ui.cc:169
-msgid "Monitor playback"
-msgstr "监控回放"
+#: control_protocol_manager.cc:334
+msgid "Control protocol %1 not usable"
+msgstr "控制协议 %1 不可用"
 
-#: route_ui.cc:676
-msgid "Not connected to AudioEngine - cannot engage record"
-msgstr "未连接到音频引擎——无法从事录制"
+#: control_protocol_manager.cc:351
+msgid "Control surface protocol discovered: \"%1\"\n"
+msgstr "已发现控制面协议:\"%1\"\n"
 
-#: route_ui.cc:875
-msgid "Step Entry"
-msgstr "步进入口"
+#: control_protocol_manager.cc:367
+msgid "ControlProtocolManager: cannot load module \"%1\" (%2)"
+msgstr "控制面协议管理器:无法载入模式 \"%1\" (%2)"
 
-#: route_ui.cc:948
-msgid "Assign all tracks (prefader)"
-msgstr "指定所有音轨(前置淡化)"
+#: control_protocol_manager.cc:373
+msgid "ControlProtocolManager: module \"%1\" has no descriptor function."
+msgstr "控制面协议管理器:模式 \"%1\" 没有描述符函数。"
 
-#: route_ui.cc:952
-msgid "Assign all tracks and buses (prefader)"
-msgstr "指定所有音轨和总线(前置淡化)"
+#: control_protocol_manager.cc:516
+msgid "Control protocol \"%1\" has no descriptor"
+msgstr "控制面协议 \"%1\" 没有描述符"
 
-#: route_ui.cc:956
-msgid "Assign all tracks (postfader)"
-msgstr "指定所有音轨(后置淡化)"
+#: cycle_timer.cc:40
+msgid "CycleTimer::get_mhz(): can't open /proc/cpuinfo"
+msgstr "CycleTimer::get_mhz():无法打开 /proc/cpuinfo"
 
-#: route_ui.cc:960
-msgid "Assign all tracks and buses (postfader)"
-msgstr "指定所有音轨和总线(后置淡化)"
+#: cycle_timer.cc:52
+msgid "CycleTimer::get_mhz(): cannot locate cpu MHz in /proc/cpuinfo"
+msgstr "CycleTimer::get_mhz():在 /proc/cpuinfo 里无法定位 cpu MHz"
 
-#: route_ui.cc:964
-msgid "Assign selected tracks (prefader)"
-msgstr "指定已选中的音轨(前置淡化)"
+#: cycle_timer.cc:75
+msgid "cannot locate cpu MHz in /proc/cpuinfo"
+msgstr "在 /proc/cpuinfo 里无法定位 cpu MHz"
 
-#: route_ui.cc:968
-msgid "Assign selected tracks and buses (prefader)"
-msgstr "指定已选中的音轨和总线(前置淡化)"
+#: data_type.cc:27
+msgid "audio"
+msgstr "音频"
 
-#: route_ui.cc:971
-msgid "Assign selected tracks (postfader)"
-msgstr "指定已选中的音轨(后置淡化)"
+#: data_type.cc:28 session.cc:2452
+msgid "MIDI"
+msgstr ""
 
-#: route_ui.cc:975
-msgid "Assign selected tracks and buses (postfader)"
-msgstr "指定已选中的音轨和总线(后置淡化)"
+#: data_type.cc:29
+msgid "unknown"
+msgstr "未知的"
 
-#: route_ui.cc:978
-msgid "Copy track/bus gains to sends"
-msgstr "复制音轨/总线增益到发送"
+#: delivery.cc:118
+msgid "main outs"
+msgstr "主输出"
 
-#: route_ui.cc:979
-msgid "Set sends gain to -inf"
-msgstr "设置发送增益到 -inf"
+#: delivery.cc:121 send.cc:64
+msgid "listen"
+msgstr "听"
 
-#: route_ui.cc:980
-msgid "Set sends gain to 0dB"
-msgstr "设置发送增益到 0dB"
+#: diskstream.cc:311
+msgid "Location \"%1\" not valid for track loop (start >= end)"
+msgstr "位置 \"%1\" 在音轨循环里无效(起点 >= 终点)"
 
-#: route_ui.cc:1300
-msgid "Solo Isolate"
-msgstr "独奏隔离"
+#: export_channel.cc:110
+msgid "Could not get port for export channel \"%1\", dropping the channel"
+msgstr "无法为导出声道 \"%1\" 获取端口,正在弃用声道"
 
-#: route_ui.cc:1307
-msgid "Solo Safe"
-msgstr "独奏安全"
+#: export_failed.cc:32
+msgid "Export failed: %1"
+msgstr "导出失败:%1"
 
-#: route_ui.cc:1329
-msgid "Pre Fader Sends"
-msgstr "前置淡化发送"
+#: export_filename.cc:128
+msgid "Existing export folder for this session (%1) does not exist - ignored"
+msgstr "为本会话(%1)而存在的导出文件夹不存在——已忽略"
 
-#: route_ui.cc:1335
-msgid "Post Fader Sends"
-msgstr "后置淡化发送"
+#: export_filename.cc:263
+msgid "No Time"
+msgstr "无时间"
 
-#: route_ui.cc:1341
-msgid "Control Outs"
-msgstr "控制输出"
+#: export_filename.cc:272
+msgid "Invalid time format"
+msgstr "无效的时间格式"
 
-#: route_ui.cc:1347
-msgid "Main Outs"
-msgstr "主要输出"
+#: export_filename.cc:281
+msgid "No Date"
+msgstr "无日期"
 
-#: route_ui.cc:1479
-msgid "Color Selection"
-msgstr "颜色已选择部分"
+#: export_filename.cc:296
+msgid "Invalid date format"
+msgstr "无效的日期格式"
 
-#: route_ui.cc:1564
-msgid ""
-"Do you really want to remove track \"%1\" ?\n"
-"\n"
-"You may also lose the playlist used by this track.\n"
-"\n"
-"(This action cannot be undone, and the session file will be overwritten)"
+#: export_format_manager.cc:57
+msgid "CD"
 msgstr ""
-"您是否真的要移除音轨 \"%1\"?\n"
-"\n"
-"您也可能会失去使用此音轨使用的播放列表。\n"
-"\n"
-"(此操作不可撤销,而且此会话文件将会被重写覆盖)"
 
-#: route_ui.cc:1566
-msgid ""
-"Do you really want to remove bus \"%1\" ?\n"
-"\n"
-"(This action cannot be undone, and the session file will be overwritten)"
+#: export_format_manager.cc:66
+msgid "DVD-A"
 msgstr ""
-"您是否真的要移除总线\"%1\" ?\n"
-"\n"
-"(此操作不可撤销,而且此会话文件将会被重写覆盖)"
-
-#: route_ui.cc:1574
-msgid "Remove track"
-msgstr "移除音轨"
 
-#: route_ui.cc:1576
-msgid "Remove bus"
-msgstr "移除总线"
-
-#: route_ui.cc:1604
-msgid ""
-"The use of colons (':') is discouraged in track and bus names.\n"
-"Do you want to use this new name?"
+#: export_format_manager.cc:80
+msgid "iPod"
 msgstr ""
-"建议不要在音轨和总线名称中使用冒号(“ : ”)。\n"
-"您是否确定使用这个新名称?"
-
-#: route_ui.cc:1608
-msgid "Use the new name"
-msgstr "使用新名称"
-
-#: route_ui.cc:1609
-msgid "Re-edit the name"
-msgstr "重新编辑名称"
 
-#: route_ui.cc:1622
-msgid "Rename Track"
-msgstr "重命名音轨"
+#: export_format_manager.cc:91
+msgid "Something else"
+msgstr "其它的东西"
 
-#: route_ui.cc:1624
-msgid "Rename Bus"
-msgstr "重命名总线"
+#: export_format_manager.cc:110
+msgid "Any"
+msgstr "任何"
 
-#: route_ui.cc:1692
-msgid ": comment editor"
-msgstr ":注释编辑器"
+#: export_format_manager.cc:111
+msgid "Lossless (linear PCM)"
+msgstr "无损(线性 PCM)"
 
-#: route_ui.cc:1858
-msgid " latency"
-msgstr "延迟"
+#: export_format_manager.cc:112
+msgid "Lossy compression"
+msgstr "有损压缩"
 
-#: route_ui.cc:1871
-msgid "Cannot create route template directory %1"
-msgstr "无法创建路由模板目录 %1"
+#: export_format_manager.cc:113
+msgid "Lossless compression"
+msgstr "无损压缩"
 
-#: route_ui.cc:1877
-msgid "Save As Template"
-msgstr "另存为模板"
+#: export_format_manager.cc:218 export_format_specification.cc:657
+msgid "Session rate"
+msgstr "会话速率"
 
-#: route_ui.cc:1878
-msgid "Template name:"
-msgstr "模板名称:"
-
-#: route_ui.cc:1959
-msgid "Remote Control ID"
-msgstr "移除控制 ID"
-
-#: route_ui.cc:1969
-msgid "Remote control ID:"
-msgstr "移除控制 ID:"
-
-#: route_ui.cc:1983
-msgid ""
-"The remote control ID of %1 is: %2\n"
-"\n"
-"\n"
-"The remote control ID of %3 cannot be changed."
+#: export_format_specification.cc:609
+msgid "normalize loudness"
 msgstr ""
-" %1 的远程控制 ID 是:%2\n"
-"\n"
-"\n"
-"%3 的远程控制 ID 无法改变。"
 
-#: route_ui.cc:1987
-msgid "the master bus"
-msgstr "主控总线"
-
-#: route_ui.cc:1987
-msgid "the monitor bus"
-msgstr "监控总线"
-
-#: route_ui.cc:1989
-msgid ""
-"The remote control ID of %5 is: %2\n"
-"\n"
-"\n"
-"Remote Control IDs are currently determined by track/bus ordering in %6.\n"
-"\n"
-"%3Use the User Interaction tab of the Preferences window if you want to change this"
-"%4"
+#: export_format_specification.cc:611
+msgid "normalize peak"
 msgstr ""
-"%5 的远程控制 ID 是:%2\n"
-"\n"
-"\n"
-"远程控制 IDs 是由当前音轨/总线在 %6 里的排序所决定的。\n"
-"\n"
-"如果您想改变 %4,%3 使用首选项窗口的用户交互选项卡"
-
-#: route_ui.cc:2046
-msgid ""
-"Left-click to invert (phase reverse) channel %1 of this track.  Right-click to "
-"show menu."
-msgstr "左键点击反转(相位反转)该音轨的声道 %1 。右键点击显示菜单。"
-
-#: route_ui.cc:2048
-msgid "Click to show a menu of channels for inversion (phase reverse)"
-msgstr "点击显示声道反转(相位反转)菜单"
-
-#: search_path_option.cc:35
-msgid "Select folder to search for media"
-msgstr "选择目录以便搜索媒体"
-
-#: search_path_option.cc:44
-msgid "Click to add a new location"
-msgstr "点击添加一个新位置"
-
-#: search_path_option.cc:51
-msgid "the session folder"
-msgstr "会话文件夹"
-
-#: send_ui.cc:134
-msgid "Send "
-msgstr "发送"
 
-#: session_dialog.cc:61
-msgid "Session Setup"
-msgstr "发送设置"
-
-#: session_dialog.cc:66
-msgid "Advanced options ..."
-msgstr "高级选项…"
-
-#: session_dialog.cc:263
-msgid "New Session"
-msgstr "新建会话"
-
-#: session_dialog.cc:301
-msgid "Check the website for more..."
-msgstr "查询网站以得到更多…"
-
-#: session_dialog.cc:304
-msgid "Click to open the program website in your web browser"
-msgstr "点击以便在您的网页浏览器打开程序网站"
-
-#: session_dialog.cc:324
-msgid "Sample Rate"
-msgstr "采样率"
-
-#: session_dialog.cc:325
-msgid "Disk Format"
-msgstr "硬盘格式化"
-
-#: session_dialog.cc:343
-msgid "Select session file"
-msgstr "选择会话文件"
-
-#: session_dialog.cc:358
-msgid "Other Sessions"
-msgstr "其它会话"
-
-#: session_dialog.cc:384
-msgid "Open"
-msgstr "打开"
-
-#: session_dialog.cc:451
-msgid "Session name:"
-msgstr "会话名称:"
+#: export_format_specification.cc:616
+msgid "trim"
+msgstr "修剪"
 
-#: session_dialog.cc:473
-msgid "Create session folder in:"
-msgstr "创建会话文件夹在:"
+#: export_format_specification.cc:618
+msgid "trim start"
+msgstr "修剪起点"
 
-#: session_dialog.cc:496
-msgid "Select folder for session"
-msgstr "为会话选择文件夹"
+#: export_format_specification.cc:620
+msgid "trim end"
+msgstr "修剪终点"
 
-#: session_dialog.cc:525
-msgid "Use this template"
-msgstr "使用此模板"
+#: export_formats.cc:49
+msgid "Shaped Noise"
+msgstr "已成形的噪声"
 
-#: session_dialog.cc:528
-msgid "no template"
-msgstr "没有模板"
+#: export_formats.cc:50
+msgid "Triangular"
+msgstr "三角"
 
-#: session_dialog.cc:663 session_dialog.cc:699
-msgid "32 bit float"
-msgstr "32 位浮点"
+#: export_formats.cc:51
+msgid "Rectangular"
+msgstr "矩形"
 
-#: session_dialog.cc:666 session_dialog.cc:702
-msgid "24 bit"
-msgstr "24 位"
+#: export_formats.cc:159
+msgid "8-bit"
+msgstr "8 位"
 
-#: session_dialog.cc:669 session_dialog.cc:705
-msgid "16 bit"
+#: export_formats.cc:161
+msgid "16-bit"
 msgstr "16 位"
 
-#: session_dialog.cc:747 session_dialog.cc:748 session_dialog.cc:749
-msgid "channels"
-msgstr "声道"
-
-#: session_dialog.cc:763
-msgid "<b>Busses</b>"
-msgstr "<b>总线</b>"
-
-#: session_dialog.cc:764
-msgid "<b>Inputs</b>"
-msgstr "<b>输入</b>"
-
-#: session_dialog.cc:765
-msgid "<b>Outputs</b>"
-msgstr "<b>输出</b>"
-
-#: session_dialog.cc:773
-msgid "Create master bus"
-msgstr "创建主控总线"
-
-#: session_dialog.cc:783
-msgid "Automatically connect to physical inputs"
-msgstr "自动连接到物理输入"
-
-#: session_dialog.cc:790 session_dialog.cc:849
-msgid "Use only"
-msgstr "仅使用"
-
-#: session_dialog.cc:843
-msgid "Automatically connect outputs"
-msgstr "自动连接到输出"
-
-#: session_dialog.cc:865
-msgid "... to master bus"
-msgstr "…到主控总线"
-
-#: session_dialog.cc:875
-msgid "... to physical outputs"
-msgstr "…到物理输出"
-
-#: session_import_dialog.cc:65
-msgid "Import from Session"
-msgstr "从会话导入"
-
-#: session_import_dialog.cc:74
-msgid "Elements"
-msgstr "元素"
-
-#: session_import_dialog.cc:111
-msgid "Cannot load XML for session from %1"
-msgstr "无法从 %1 为会话载入 XML"
-
-#: session_import_dialog.cc:128 session_import_dialog.cc:212
-msgid "Some elements had errors in them. Please see the log for details"
-msgstr "一些元素出错,详情请参阅日志文件"
-
-#: session_import_dialog.cc:164
-msgid "Import from session"
-msgstr "从会话导入"
-
-#: session_import_dialog.cc:228
-msgid "This will select all elements of this type!"
-msgstr "这将选择此类型的所有元素!"
-
-#: session_metadata_dialog.cc:285
-msgid "EAN Check digit OK"
-msgstr "EAN 校验数位正常"
-
-#: session_metadata_dialog.cc:289
-msgid "EAN Check digit error"
-msgstr "EAN 校验数位出错"
-
-#: session_metadata_dialog.cc:289
-msgid "expected"
-msgstr "期望"
-
-#: session_metadata_dialog.cc:294
-msgid "EAN Length error"
-msgstr "EAN 长度错误"
-
-#: session_metadata_dialog.cc:423
-msgid "Field"
-msgstr "字段"
-
-#: session_metadata_dialog.cc:427
-msgid "Values (current value on top)"
-msgstr "数值(当前数值位于顶部)"
-
-#: session_metadata_dialog.cc:641
-msgid "User"
-msgstr "用户"
-
-#: session_metadata_dialog.cc:649
-msgid "Email"
-msgstr "电子邮件"
-
-#: session_metadata_dialog.cc:652
-msgid "Web"
-msgstr "网站"
-
-#: session_metadata_dialog.cc:655
-msgid "Organization"
-msgstr "组织"
-
-#: session_metadata_dialog.cc:658
-msgid "Country"
-msgstr "国家"
-
-#: session_metadata_dialog.cc:672
-msgid "Title"
-msgstr "标题"
-
-#: session_metadata_dialog.cc:675
-msgid "Track Number"
-msgstr "音轨序号"
-
-#: session_metadata_dialog.cc:678
-msgid "Subtitle"
-msgstr "副标题"
-
-#: session_metadata_dialog.cc:681
-msgid "Grouping"
-msgstr "组合"
-
-#: session_metadata_dialog.cc:684
-msgid "Artist"
-msgstr "艺术家"
-
-#: session_metadata_dialog.cc:687
-msgid "Genre"
-msgstr "流派"
+#: export_formats.cc:163
+msgid "24-bit"
+msgstr "24 位"
 
-#: session_metadata_dialog.cc:690
-msgid "Comment"
-msgstr "注释"
+#: export_formats.cc:165
+msgid "32-bit"
+msgstr "32 位"
 
-#: session_metadata_dialog.cc:693
-msgid "Copyright"
-msgstr "版权"
+#: export_formats.cc:167
+msgid "float"
+msgstr "浮点"
 
-#: session_metadata_dialog.cc:701 session_metadata_dialog.cc:706
-msgid "Album"
-msgstr "专辑"
+#: export_formats.cc:169
+msgid "double"
+msgstr "双倍"
 
-#: session_metadata_dialog.cc:709
-msgid "Year"
-msgstr "年份"
+#: export_formats.cc:171
+msgid "8-bit unsigned"
+msgstr "8位无符号"
 
-#: session_metadata_dialog.cc:712
-msgid "Album Artist"
-msgstr "专辑艺术家"
+#: export_formats.cc:173
+msgid "Vorbis sample format"
+msgstr "Vorbis 采样格式"
 
-#: session_metadata_dialog.cc:715
-msgid "Total Tracks"
-msgstr "音轨总数"
+#: export_formats.cc:175
+msgid "No sample format"
+msgstr "无采样格式"
 
-#: session_metadata_dialog.cc:718
-msgid "Disc Subtitle"
-msgstr "光盘副标题"
+#: export_handler.cc:419
+msgid "File %1 uploaded to %2"
+msgstr "文件 %1 已更新到 %2"
 
-#: session_metadata_dialog.cc:721
-msgid "Disc Number"
-msgstr "光盘编号"
+#: export_handler.cc:425
+msgid ""
+"upload to Soundcloud failed. Perhaps your email or password are incorrect?\n"
+msgstr "上传声云失败。也许您的电子邮件或密码不正确?\n"
 
-#: session_metadata_dialog.cc:724
-msgid "Total Discs"
-msgstr "光盘总数"
+#: export_handler.cc:551 export_handler.cc:554
+msgid "an error occurred while writing a TOC/CUE file: %1"
+msgstr "当写入 TOC/CUE(目录数据/光盘映像辅助)文件时出现一个错误:%1"
 
-#: session_metadata_dialog.cc:727
-msgid "Compilation"
-msgstr "编纂"
+#: export_handler.cc:844 export_handler.cc:902
+msgid "Cannot convert %1 to Latin-1 text"
+msgstr "无法转换 %1 为 拉丁-1 文本"
 
-#: session_metadata_dialog.cc:730
-msgid "ISRC"
-msgstr "ISRC 国际标准音像制品编码"
+#: export_profile_manager.cc:94
+msgid "Searching for export formats in %1"
+msgstr "正在 %1 中搜索导出格式"
 
-#: session_metadata_dialog.cc:733
-msgid "EAN barcode"
-msgstr "EAN 条形码"
+#: export_profile_manager.cc:100
+msgid "Unable to create export format directory %1: %2"
+msgstr "无法创建导出格式目录 %1:%2"
 
-#: session_metadata_dialog.cc:746
-msgid "People"
-msgstr "民族"
+#: export_profile_manager.cc:268
+msgid "Unable to remove export preset %1: %2"
+msgstr "无法移除导出预设 %1:%2"
 
-#: session_metadata_dialog.cc:751
-msgid "Lyricist"
-msgstr "作词"
+#: export_profile_manager.cc:357
+msgid "Selection"
+msgstr "已选择部分"
 
-#: session_metadata_dialog.cc:754
-msgid "Composer"
-msgstr "作曲家"
+#: export_profile_manager.cc:621
+msgid "Unable to rename export format %1 to %2: %3"
+msgstr "无法重命名导出格式 %1 到 %2:%3"
 
-#: session_metadata_dialog.cc:757
-msgid "Conductor"
-msgstr "指挥家"
+#: export_profile_manager.cc:653
+msgid "Unable to remove export profile %1: %2"
+msgstr "无法移除导出配置文件 %1:%2"
 
-#: session_metadata_dialog.cc:760
-msgid "Remixer"
-msgstr "混音师"
+#: export_profile_manager.cc:671
+msgid "empty format"
+msgstr "空白格式"
 
-#: session_metadata_dialog.cc:763
-msgid "Arranger"
-msgstr "编曲者"
+#: export_profile_manager.cc:752
+msgid "Cannot load export format from %1"
+msgstr "无法从 %1 载入导出格式"
 
-#: session_metadata_dialog.cc:766
-msgid "Engineer"
-msgstr "工程师"
+#: export_profile_manager.cc:758
+msgid "Cannot export format read from %1"
+msgstr "无法从 %1 读取导出格式"
 
-#: session_metadata_dialog.cc:769
-msgid "Producer"
-msgstr "制片人"
+#: export_profile_manager.cc:852
+msgid "No timespan has been selected!"
+msgstr "无已选中的时间跨度!"
 
-#: session_metadata_dialog.cc:772
-msgid "DJ Mixer"
-msgstr "DJ 混音器"
+#: export_profile_manager.cc:856
+msgid "No channels have been selected!"
+msgstr "无已选中的声道!"
 
-#: session_metadata_dialog.cc:775
-msgid "Metadata|Mixer"
-msgstr "元数据|混音器"
+#: export_profile_manager.cc:860
+msgid "Some channels are empty"
+msgstr "有些声道是空白的"
 
-#: session_metadata_dialog.cc:783
-msgid "School"
-msgstr "院校"
+#: export_profile_manager.cc:893
+msgid "No format selected!"
+msgstr "无选中的格式!"
 
-#: session_metadata_dialog.cc:788
-msgid "Instructor"
-msgstr "指导员"
+#: export_profile_manager.cc:895
+msgid "All channels are empty!"
+msgstr "所有声道都是空白的!"
 
-#: session_metadata_dialog.cc:791
-msgid "Course"
-msgstr "过程"
+#: export_profile_manager.cc:897
+msgid "One or more of the selected formats is not compatible with this system!"
+msgstr "一个或多个已选中的格式与这个系统不兼容!"
 
-#: session_metadata_dialog.cc:799
-msgid "Edit Session Metadata"
-msgstr "标记会话元数据"
+#: export_profile_manager.cc:900
+msgid ""
+"%1 supports only %2 channels, but you have %3 channels in your channel "
+"configuration"
+msgstr "%1 仅支持 %2 声道,但在您的声道配置中您有 %3 声道"
 
-#: session_metadata_dialog.cc:830
-msgid "Import session metadata"
-msgstr "导入会话元数据"
+#: file_source.cc:201 session_state.cc:3284
+msgid ""
+"there are already 1000 files with names like %1; versioning discontinued"
+msgstr "已经有 1000 个文件的名称类似 %1;版本控制中断"
 
-#: session_metadata_dialog.cc:851
-msgid "Choose session to import metadata from"
-msgstr "选择导入元数据的来源会话"
+#: file_source.cc:210
+msgid "cannot rename file source from %1 to %2 (%3)"
+msgstr "无法重命名文件来源从 %1 到 %2((%3)"
 
-#: session_metadata_dialog.cc:889
-msgid "This session file could not be read!"
-msgstr "此会话文件无法读取!"
+#: file_source.cc:251 file_source.cc:374
+msgid "FileSource: search path not set"
+msgstr "文件来源:搜索路径未设置"
 
-#: session_metadata_dialog.cc:899
+#: file_source.cc:434
 msgid ""
-"The session file didn't contain metadata!\n"
-"Maybe this is an old session format?"
+"FileSource: \"%1\" is ambigous when searching\n"
+"\t"
 msgstr ""
-"此会话文件不包含元数据!\n"
-"也许这是一个旧的会话格式?"
-
-#: session_metadata_dialog.cc:918
-msgid "Import all from:"
-msgstr "导入所有从:"
+"文件来源: 搜索时 \"%1\" 不可确定\n"
+"\t"
 
-#: session_option_editor.cc:32
-msgid "Session Properties"
-msgstr "会话属性 "
+#: file_source.cc:441
+msgid "Filesource: cannot find required file (%1)"
+msgstr "文件来源:找不到所需的文件(%1)"
 
-#: session_option_editor.cc:41
-msgid "Timecode Settings"
-msgstr "时间码设置"
+#: file_source.cc:486
+msgid "Filesource: cannot find required file (%1): %2"
+msgstr "文件来源:找不到所需的文件(%1):%2"
 
-#: session_option_editor.cc:45
-msgid "Timecode frames-per-second"
-msgstr "时间码帧数每秒"
-
-#: session_option_editor.cc:50
-msgid "23.976"
-msgstr ""
-
-#: session_option_editor.cc:51
-msgid "24"
-msgstr ""
+#: file_source.cc:494
+msgid "Filesource: cannot check for existing file (%1): %2"
+msgstr "文件来源:无法检查现有文件(%1):%2"
 
-#: session_option_editor.cc:52
-msgid "24.975"
+#: file_source.cc:589
+msgid ""
+"Programming error! %1 tried to rename a file over another file! It's safe to "
+"continue working, but please report this to the developers."
 msgstr ""
+"程序错误!%1 试图在另一个文件上重命名一个文件!它可以继续工作,但请把这件事报"
+"告给开发人员。"
 
-#: session_option_editor.cc:53
-msgid "25"
-msgstr ""
+#: file_source.cc:596
+msgid "cannot rename file %1 to %2 (%3)"
+msgstr "无法重命名文件 %1 为 %2(%3)"
 
-#: session_option_editor.cc:54
-msgid "29.97"
-msgstr ""
+#: filesystem_paths.cc:120
+msgid "Cannot create Configuration directory %1 - cannot run"
+msgstr "无法创建配置目录 %1 ——无法运行"
 
-#: session_option_editor.cc:55
-msgid "29.97 drop"
-msgstr "29.97 丢帧"
+#: filesystem_paths.cc:125
+msgid ""
+"Configuration directory %1 already exists and is not a directory/folder - "
+"cannot run"
+msgstr "配置目录 %1 已存在并且不是一个目录/文件夹——无法运行"
 
-#: session_option_editor.cc:56
-msgid "30"
-msgstr ""
+#: filesystem_paths.cc:186
+msgid "Cannot create cache directory %1 - cannot run"
+msgstr "无法创建缓存目录 %1 ——无法运行"
 
-#: session_option_editor.cc:57
-msgid "30 drop"
-msgstr "30 丢帧"
+#: filesystem_paths.cc:191
+msgid ""
+"Cache directory %1 already exists and is not a directory/folder - cannot run"
+msgstr "缓存目录 %1 已存在并且不是一个目录/文件夹——无法运行"
 
-#: session_option_editor.cc:58
-msgid "59.94"
-msgstr ""
+#: filesystem_paths.cc:209
+msgid "ARDOUR_DLL_PATH not set in environment - exiting\n"
+msgstr "在环境中未设置ARDOUR_DLL_PATH ——正在退出\n"
 
-#: session_option_editor.cc:59
-msgid "60"
-msgstr ""
+#: filesystem_paths.cc:232
+msgid "Cannot determine %1 package directory"
+msgstr "无法确定 %1 软件包目录"
 
-#: session_option_editor.cc:65
-msgid "Pull-up / pull-down"
-msgstr "上拉 / 下拉"
+#: filesystem_paths.cc:277
+msgid "ARDOUR_CONFIG_PATH not set in environment\n"
+msgstr "在环境中未设置ARDOUR_CONFIG_PATH\n"
 
-#: session_option_editor.cc:70
-msgid "4.1667 + 0.1%"
-msgstr ""
+#: filesystem_paths.cc:298
+msgid "ARDOUR_DATA_PATH not set in environment\n"
+msgstr "在环境中未设置ARDOUR_DATA_PATH\n"
 
-#: session_option_editor.cc:71
-msgid "4.1667"
-msgstr ""
+#: filter.cc:67
+msgid "filter: error creating name for new file based on %1"
+msgstr "滤镜:基于 %1 为新文件创建名称出错"
 
-#: session_option_editor.cc:72
-msgid "4.1667 - 0.1%"
-msgstr ""
+#: filter.cc:92
+msgid "filter: error creating new file %1 (%2)"
+msgstr "滤镜:创建新文件 %1(%2)出错"
 
-#: session_option_editor.cc:73
-msgid "0.1"
-msgstr ""
+#: find_session.cc:60
+msgid "cannot check session path %1 (%2)"
+msgstr "无法检查会话路径 %1(%2)"
 
-#: session_option_editor.cc:74
-msgid "none"
-msgstr "æ— "
+#: find_session.cc:86
+msgid "cannot check statefile %1 (%2)"
+msgstr "无法检查状态文件 %1(%2)"
 
-#: session_option_editor.cc:75
-msgid "-0.1"
-msgstr ""
+#: find_session.cc:125
+msgid "%1 is not a snapshot file"
+msgstr "%1不是一个快照文件"
 
-#: session_option_editor.cc:76
-msgid "-4.1667 + 0.1%"
-msgstr ""
+#: find_session.cc:142
+msgid "cannot determine current working directory (%1)"
+msgstr "无法确定当前工作中的目录(%1)"
 
-#: session_option_editor.cc:77
-msgid "-4.1667"
-msgstr ""
+#: find_session.cc:159
+msgid "unknown file type for session %1"
+msgstr "关于会话 %1 未知的文件类型"
 
-#: session_option_editor.cc:78
-msgid "-4.1667 - 0.1%"
+#: gain_control.cc:81
+#, c-format
+msgid "%3.1f dB"
 msgstr ""
 
-#: session_option_editor.cc:84
-msgid ""
-"Use Video File's FPS Instead of Timecode Value for Timeline and Video Monitor."
-msgstr "为时间线和视频监控使用视频文件的 FPS 替代时间码数值。"
-
-#: session_option_editor.cc:91
-msgid ""
-"Apply Pull-Up/Down to Video Timeline and Video Monitor (Unless using JACK-sync)."
-msgstr "应用上拉/下拉到视频时间线和视频监控(除非使用 JACK-同步)"
-
-#: session_option_editor.cc:96
-msgid "Ext Timecode Offsets"
-msgstr "外部时间码偏移"
-
-#: session_option_editor.cc:100
-msgid "Slave Timecode offset"
-msgstr "从属时间码偏移"
-
-#: session_option_editor.cc:107
-msgid "The specified offset is added to the received timecode (MTC or LTC)."
-msgstr "指定的偏移已被添加到已接收的时间码(MTC 或 LTC)。"
-
-#: session_option_editor.cc:113
-msgid "Timecode Generator offset"
-msgstr "时间码生成器偏移"
+#: globals.cc:266
+msgid "Could not set system open files limit to \"unlimited\""
+msgstr "无法设置系统打开文件限制为“无限制”"
 
-#: session_option_editor.cc:120
-msgid "Specify an offset which is added to the generated timecode (so far only LTC)."
-msgstr "指定一个已被添加到通用时间码的偏移(迄今为止仅有 LTC)。"
+#: globals.cc:268
+msgid "Could not set system open files limit to %1"
+msgstr "无法设置系统打开文件限制为 %1"
 
-#: session_option_editor.cc:124
-msgid "JACK Transport/Time Settings"
-msgstr "JACK 播送/时间设置"
+#: globals.cc:272 globals.cc:289
+msgid "Your system is configured to limit %1 to only %2 open files"
+msgstr "您的系统已配置限定 %1 到仅  %2 打开文件"
 
-#: session_option_editor.cc:128
-msgid "%1 is JACK Time Master (provides Bar|Beat|Tick and other information to JACK)"
-msgstr "%1 是 JACK 时间主控(提供小节|拍子|识别声以及其它信息给 JACK)"
+#: globals.cc:276
+msgid "Could not get system open files limit (%1)"
+msgstr "无法获取系统打开文件限制(%1)"
 
-#: session_option_editor.cc:136
-msgid "destructive-xfade-seconds"
-msgstr "销毁前置后置淡化秒数"
+#: globals.cc:291
+msgid "Could not set system open files limit. Current limit is %1 open files"
+msgstr "无法设置系统打开文件限制。当前限制是 %1 打开文件"
 
-#: session_option_editor.cc:137
-msgid "Destructive crossfade length"
-msgstr "销毁交叉淡化长度"
+#: globals.cc:474
+msgid "Loading configuration"
+msgstr "正在载入配置中"
 
-#: session_option_editor.cc:146
-msgid "Region fades active"
-msgstr "区域淡化激活"
+#: globals.cc:554 route.cc:182 route.cc:4149 session.cc:1157
+msgid "Monitor"
+msgstr "监控"
 
-#: session_option_editor.cc:153
-msgid "Region fades visible"
-msgstr "区域淡化可见"
+#: globals.cc:555 session_state.cc:642
+msgid "Master"
+msgstr "主控"
 
-#: session_option_editor.cc:160 session_option_editor.cc:173
-#: session_option_editor.cc:187
-msgid "Media"
-msgstr "媒体"
+#: globals.cc:556
+msgid "Control"
+msgstr "控制"
 
-#: session_option_editor.cc:160
-msgid "Audio file format"
-msgstr "音频文件格式"
+#: globals.cc:557
+msgid "Click"
+msgstr "音频识别声(节拍器)"
 
-#: session_option_editor.cc:164
-msgid "Sample format"
-msgstr "采样格式"
+#: globals.cc:558
+msgid "Mackie"
+msgstr ""
 
-#: session_option_editor.cc:169
-msgid "32-bit floating point"
-msgstr "32 位浮点"
+#: import.cc:146
+msgid "Cannot find new filename for imported file %1"
+msgstr "无法为导入的文件 %1 找到新的文件名"
 
-#: session_option_editor.cc:170
-msgid "24-bit integer"
-msgstr "24 位整数"
+#: import.cc:166
+msgid "Could not find a source for %1 even though we are updating this file!"
+msgstr "无法为 %1 找到一个来源,尽管我们正在更新这个文件!"
 
-#: session_option_editor.cc:171
-msgid "16-bit integer"
-msgstr "16 位整数"
+#: import.cc:195
+msgid "Unable to create file %1 during import"
+msgstr "导入过程中无法创建文件 %1 "
 
-#: session_option_editor.cc:177
-msgid "File type"
-msgstr "文件类型"
+#: import.cc:221
+msgid "Resampling %1 from %2kHz to %3kHz"
+msgstr " 重新采样 %1 从 %2kHz 到 %3kHz"
 
-#: session_option_editor.cc:182
-msgid "Broadcast WAVE"
-msgstr "广播 WAVE"
+#: import.cc:227
+msgid "Copying %1"
+msgstr "正在复制 %1 中"
 
-#: session_option_editor.cc:183
-msgid "WAVE"
-msgstr ""
+#: import.cc:420
+msgid "Track %1 of %2 contained no usable MIDI data"
+msgstr "%2 的 %1 音轨包含有不可用的 MIDI 数据"
 
-#: session_option_editor.cc:184
-msgid "WAVE-64"
-msgstr ""
+#: import.cc:427
+msgid "MIDI file could not be written (best guess: %1)"
+msgstr "MIDI 文件无法写入(最乐观猜测:%1)"
 
-#: session_option_editor.cc:189
-msgid "File locations"
-msgstr "文件位置"
-
-#: session_option_editor.cc:191
-msgid "Search for audio files in:"
-msgstr "搜索音频文件于:"
-
-#: session_option_editor.cc:197
-msgid "Search for MIDI files in:"
-msgstr "搜索 MIDI 文件于:"
-
-#: session_option_editor.cc:206 session_option_editor.cc:218
-#: session_option_editor.cc:228 session_option_editor.cc:239
-msgid "Filenames"
-msgstr "文件名"
-
-#: session_option_editor.cc:206
-msgid "File Naming"
-msgstr "文件命名"
-
-#: session_option_editor.cc:212
-msgid "Prefix Track number"
-msgstr "音轨编号前缀"
-
-#: session_option_editor.cc:217
-msgid "Adds the current track number to the beginning of the recorded file name."
-msgstr "添加当前音轨编号到已录制文件名的前端。"
-
-#: session_option_editor.cc:222
-msgid "Prefix Take Name"
-msgstr "磁带名称前缀"
-
-#: session_option_editor.cc:227
-msgid "Adds the Take Name to the beginning of the recorded file name."
-msgstr "添加磁带名称到已录制文件名的前端。"
-
-#: session_option_editor.cc:232
-msgid "Take Name"
-msgstr "磁带名称"
-
-#: session_option_editor.cc:245
-msgid "Track Input Monitoring automatically follows transport state (\"auto-input\")"
-msgstr "音轨输入监控自动化跟随播送状态(“自动输入”)"
-
-#: session_option_editor.cc:252
-msgid "Use monitor section in this session"
-msgstr "在该会话中使用的监控面"
-
-#: session_option_editor.cc:257 session_option_editor.cc:259
-#: session_option_editor.cc:266 session_option_editor.cc:273
-#: session_option_editor.cc:280 session_option_editor.cc:282
-#: session_option_editor.cc:289 session_option_editor.cc:296
-#: session_option_editor.cc:303 session_option_editor.cc:310
-#: session_option_editor.cc:312
-msgid "Meterbridge"
-msgstr "节拍桥接"
-
-#: session_option_editor.cc:257
-msgid "Route Display"
-msgstr "路由显示"
-
-#: session_option_editor.cc:261
-msgid "Show Midi Tracks"
-msgstr "显示 MIDI 音轨"
-
-#: session_option_editor.cc:268
-msgid "Show Busses"
-msgstr "显示总线"
-
-#: session_option_editor.cc:275
-msgid "Include Master Bus"
-msgstr "包括主控总线"
-
-#: session_option_editor.cc:280
-msgid "Button Area"
-msgstr "按钮区域"
-
-#: session_option_editor.cc:284
-msgid "Rec-enable Button"
-msgstr "可录制按钮"
-
-#: session_option_editor.cc:291
-msgid "Mute Button"
-msgstr "静音按钮"
-
-#: session_option_editor.cc:298
-msgid "Solo Button"
-msgstr "独奏按钮"
-
-#: session_option_editor.cc:305
-msgid "Monitor Buttons"
-msgstr "监控按钮"
-
-#: session_option_editor.cc:310
-msgid "Name Labels"
-msgstr "名称标签"
-
-#: session_option_editor.cc:314
-msgid "Track Name"
-msgstr "音轨名称"
-
-#: session_option_editor.cc:325
-msgid "MIDI region copies are independent"
-msgstr "MIDI 区域拷贝不受约束"
-
-#: session_option_editor.cc:332
-msgid ""
-"Policy for handling overlapping notes\n"
-" on the same MIDI channel"
-msgstr "处理位于同一个 MIDI 声道上的重叠音符的策略"
+#: import.cc:475
+msgid "Import: cannot open input sound file \"%1\""
+msgstr "导入:无法打开输入声音文件 \"%1\""
 
-#: session_option_editor.cc:337
-msgid "never allow them"
-msgstr "从不允许它们"
+#: import.cc:486
+msgid "Import: error opening MIDI file"
+msgstr "导入:打开 MIDI 文件出错"
 
-#: session_option_editor.cc:338
-msgid "don't do anything in particular"
-msgstr "不做任何特殊处理"
+#: import.cc:493
+msgid "Import: file contains no channels."
+msgstr "导入:文件不包含声道"
 
-#: session_option_editor.cc:339
-msgid "replace any overlapped existing note"
-msgstr "替换所有已存在的重叠音符"
+#: import.cc:527
+msgid "Loading MIDI file %1"
+msgstr "正在载入 MIDI 文件 %1 中"
 
-#: session_option_editor.cc:340
-msgid "shorten the overlapped existing note"
-msgstr "缩短已存在的重叠音符"
+#: import.cc:592
+msgid "Failed to remove some files after failed/cancelled import operation"
+msgstr "在导入操作失败/取消后移除一些文件失败"
 
-#: session_option_editor.cc:341
-msgid "shorten the overlapping new note"
-msgstr "缩短已存在的新音符"
+#: instrument_info.cc:41 instrument_info.cc:62
+msgid "Unknown"
+msgstr "未知的"
 
-#: session_option_editor.cc:342
-msgid "replace both overlapping notes with a single note"
-msgstr "把重叠的音符替换为一个单个音符"
+#: instrument_info.cc:243
+msgid "preset %1 (bank %2)"
+msgstr "预设 %1(库 %2)"
 
-#: session_option_editor.cc:346
-msgid "Glue to bars and beats"
-msgstr "粘连到小节和拍子"
+#: internal_send.cc:338 internal_send.cc:339
+msgid "%1 - cannot find any track/bus with the ID %2 to connect to"
+msgstr "%1 ——无法找到任何带有 %2 的 ID 号的音轨/总线来连接"
 
-#: session_option_editor.cc:350
-msgid "Glue new markers to bars and beats"
-msgstr "粘连新的标记到小节和拍子"
+#: io.cc:212
+msgid "IO: cannot disconnect port %1 from %2"
+msgstr "输入输出:无法从 %2 撤销连接端口 %1"
 
-#: session_option_editor.cc:357
-msgid "Glue new regions to bars and beats"
-msgstr "粘连新的区域到小节和拍子"
+#: io.cc:347 io.cc:435
+msgid "IO: cannot register input port %1"
+msgstr "输入输出:无法注册输入端口 %1"
 
-#: session_option_editor.cc:362
-msgid "Defaults"
-msgstr "默认"
+#: io.cc:352 io.cc:440
+msgid "IO: cannot register output port %1"
+msgstr "输入输出:无法注册输出端口 %1"
 
-#: session_option_editor.cc:364
-msgid "Use these settings as defaults"
-msgstr "使用这些设置作为默认"
+#: io.cc:607 io.cc:668
+msgid "incorrect XML node \"%1\" passed to IO object"
+msgstr "错误的 XML 节点 \"%1\" 已通过输入输出对象物体"
 
-#: sfdb_ui.cc:90 sfdb_ui.cc:110 sfdb_ui.cc:119
-msgid "as new tracks"
-msgstr "作为新的音轨"
+#: io.cc:730
+msgid "in"
+msgstr "å…¥"
 
-#: sfdb_ui.cc:92 sfdb_ui.cc:112
-msgid "to selected tracks"
-msgstr "到已选中的音轨"
+#: io.cc:730
+msgid "out"
+msgstr "出"
 
-#: sfdb_ui.cc:94 sfdb_ui.cc:114
-msgid "to region list"
-msgstr "到区域列表"
+#: io.cc:731
+msgid "input"
+msgstr "输入"
 
-#: sfdb_ui.cc:96 sfdb_ui.cc:116
-msgid "as new tape tracks"
-msgstr "作为新的磁带音轨"
+#: io.cc:731
+msgid "output"
+msgstr "输出"
 
-#: sfdb_ui.cc:100
-msgid "programming error: unknown import mode string %1"
-msgstr "程序错误:未知的导入模式字符串 %1"
+#: io.cc:741
+msgid "Unknown bundle \"%1\" listed for %2 of %3"
+msgstr "未知的集束 \"%1\" 已为 %3 的 %2 罗列出"
 
-#: sfdb_ui.cc:127
-msgid "Auto-play"
-msgstr "自动播放"
+#: io.cc:807
+msgid "Bundle %1 was not available - \"%2\" used instead"
+msgstr "集束 %1 不可用——使用 \"%2\" 代替"
 
-#: sfdb_ui.cc:135 sfdb_ui.cc:324
-msgid "<b>Sound File Information</b>"
-msgstr "<b>声音文件信息</b>"
+#: io.cc:810
+msgid "No %1 bundles available as a replacement"
+msgstr "无 %1 集束可用于作为替代"
 
-#: sfdb_ui.cc:147
-msgid "Timestamp:"
-msgstr "时间戳:"
+#: io.cc:914
+msgid "%1: cannot create I/O ports"
+msgstr "%1:无法创建输入/输出端口"
 
-#: sfdb_ui.cc:149
-msgid "Format:"
-msgstr "格式:"
+#: io.cc:1042 io.cc:1143
+msgid "IO: badly formed string in XML node for inputs \"%1\""
+msgstr "输入输出:在 XML 节点里用于输入 \"%1\" 的字符串形式混乱"
 
-#: sfdb_ui.cc:188 sfdb_ui.cc:653
-msgid "Tags:"
-msgstr "标签:"
+#: io.cc:1047 io.cc:1148
+msgid "bad input string in XML node \"%1\""
+msgstr "在 XML 节点 \"%1\" 里错误输入的字符串"
 
-#: sfdb_ui.cc:293 sfdb_ui.cc:409
-msgid "Could not read file: %1 (%2)."
-msgstr "无法读取文件: %1 (%2)."
+#: io.cc:1086
+msgid "IO: badly formed string in XML node for outputs \"%1\""
+msgstr "输入输出:在 XML 节点里用于输出 \"%1\" 的字符串形式混乱"
 
-#: sfdb_ui.cc:297
-msgid "<b>Midi File Information</b>"
-msgstr "<b>Midi 文件信息</b>"
+#: io.cc:1091
+msgid "IO: bad output string in XML node \"%1\""
+msgstr "输入输出:在 XML 节点 \"%1\" 里错误输出的字符串"
 
-#: sfdb_ui.cc:458
-msgid "Could not access soundfile: "
-msgstr "无法访问声音文件: "
+#: io.cc:1256 plugin.cc:275
+msgid "Out"
+msgstr ""
 
-#: sfdb_ui.cc:530
-msgid "SoundFileBox: Could not tokenize string: "
-msgstr "声音文件盒:无法令牌化字符串: "
+#: io.cc:1256 plugin.cc:273
+msgid "In"
+msgstr ""
 
-#: sfdb_ui.cc:550 sfdb_ui.cc:552
-msgid "Search"
-msgstr "搜索"
+#: io.cc:1454
+#, c-format
+msgid "%s %u"
+msgstr ""
 
-#: sfdb_ui.cc:576
-msgid "Audio and MIDI files"
-msgstr "音频和 MIDI 文件"
+#: io.cc:1501
+#, c-format
+msgid "%s in"
+msgstr "%s å…¥"
 
-#: sfdb_ui.cc:579
-msgid "Audio files"
-msgstr "音频文件"
+#: io.cc:1503
+#, c-format
+msgid "%s out"
+msgstr "%s 出"
 
-#: sfdb_ui.cc:582
-msgid "MIDI files"
-msgstr "MIDI 文件"
+#: io.cc:1578 session.cc:957 session.cc:991
+msgid "mono"
+msgstr "单声道"
 
-#: sfdb_ui.cc:585 add_video_dialog.cc:123
-msgid "All files"
-msgstr "所有文件"
+#: io.cc:1580 session.cc:970 session.cc:1005
+msgid "L"
+msgstr "å·¦"
 
-#: sfdb_ui.cc:604 add_video_dialog.cc:246
-msgid "Browse Files"
-msgstr "浏览文件"
+#: io.cc:1580 session.cc:972 session.cc:1007
+msgid "R"
+msgstr "右"
 
-#: sfdb_ui.cc:633
-msgid "Paths"
-msgstr "路径"
+#: ladspa_plugin.cc:93
+msgid "LADSPA: Unable to open module: "
+msgstr "LADSPA:无法打开模块:"
 
-#: sfdb_ui.cc:642
-msgid "Search Tags"
-msgstr "搜索标签"
+#: ladspa_plugin.cc:99
+msgid "LADSPA: module has no descriptor function."
+msgstr "LADSPA:模块没有描述符函数。"
 
-#: sfdb_ui.cc:658
-msgid "Sort:"
-msgstr "排序:"
+#: ladspa_plugin.cc:106
+msgid "LADSPA: plugin has gone away since discovery!"
+msgstr "LADSPA:插件自从被发现以来就已经消失!"
 
-#: sfdb_ui.cc:666
-msgid "Longest"
-msgstr "最长"
+#: ladspa_plugin.cc:113
+msgid "LADSPA: \"%1\" cannot be used, since it cannot do inplace processing"
+msgstr "LADSPA:无法使用\"%1\",因为它无法就地处理"
 
-#: sfdb_ui.cc:667
-msgid "Shortest"
-msgstr "最短"
+#: ladspa_plugin.cc:308
+msgid ""
+"illegal parameter number used with plugin \"%1\". This may indicate a change "
+"in the plugin design, and presets may be invalid"
+msgstr ""
+"插件 \"%1\" 使用了非法参数编号。这可能表明一个插件设计的变化,以及预设可能是"
+"无效的"
 
-#: sfdb_ui.cc:668
-msgid "Newest"
-msgstr "最新"
+#: ladspa_plugin.cc:387 ladspa_plugin.cc:437
+msgid "Bad node sent to LadspaPlugin::set_state"
+msgstr "错误节点发送到 LadspaPlugin::set_state"
 
-#: sfdb_ui.cc:669
-msgid "Oldest"
-msgstr "最旧"
+#: ladspa_plugin.cc:402 ladspa_plugin.cc:451
+msgid "LADSPA: no ladspa port number"
+msgstr "LADSPA:没有 ladspa 端口号"
 
-#: sfdb_ui.cc:670
-msgid "Most downloaded"
-msgstr "最多下载"
+#: ladspa_plugin.cc:408 ladspa_plugin.cc:457
+msgid "LADSPA: no ladspa port data"
+msgstr "LADSPA:没有 ladspa 端口数据"
 
-#: sfdb_ui.cc:671
-msgid "Least downloaded"
-msgstr "最新下载"
+#: ladspa_plugin.cc:863
+msgid "Could not locate HOME.  Preset not removed."
+msgstr "无法定位 HOME。预设未删除。"
 
-#: sfdb_ui.cc:672
-msgid "Highest rated"
-msgstr "最高评价"
+#: ladspa_plugin.cc:902 ladspa_plugin.cc:908
+msgid "Could not create %1.  Preset not saved. (%2)"
+msgstr "无法创建 %1。预设未保存。(%2)"
 
-#: sfdb_ui.cc:673
-msgid "Lowest rated"
-msgstr "最低评价"
+#: ladspa_plugin.cc:915
+msgid "Error saving presets file %1."
+msgstr "保存预设文件 %1 时出错。"
 
-#: sfdb_ui.cc:678
-msgid "More"
-msgstr "更多"
+#: ladspa_plugin.cc:957
+msgid "Could not locate HOME.  Preset not saved."
+msgstr "无法定位 HOME。预设未保存。"
 
-#: sfdb_ui.cc:682
-msgid "Similar"
-msgstr "类似的"
+#: location.cc:455
+msgid "You cannot put a CD marker at this position"
+msgstr "您不能安放一个 CD 标记在这个位置"
 
-#: sfdb_ui.cc:694
-msgid "ID"
-msgstr ""
+#: location.cc:607
+msgid "incorrect XML node passed to Location::set_state"
+msgstr "不正确的 XML节点传递给 Location::set_state"
 
-#: sfdb_ui.cc:695 add_video_dialog.cc:83
-msgid "Filename"
-msgstr "文件名"
+#: location.cc:612
+msgid "XML node for Location has no ID information"
+msgstr "用于定位的 XML 节点没有 ID 信息"
 
-#: sfdb_ui.cc:697
-msgid "Duration"
-msgstr "音长"
+#: location.cc:616
+msgid "XML node for Location has no name information"
+msgstr "用于定位的 XML 节点没有名称信息"
 
-#: sfdb_ui.cc:698
-msgid "Size"
-msgstr "尺寸"
+#: location.cc:623
+msgid "XML node for Location has no start information"
+msgstr "用于定位的 XML 节点没有起点信息"
 
-#: sfdb_ui.cc:699
-msgid "Samplerate"
-msgstr "采样率"
+#: location.cc:634
+msgid "XML node for Location has no end information"
+msgstr "用于定位的 XML 节点没有终点信息"
 
-#: sfdb_ui.cc:700
-msgid "License"
-msgstr "许可证"
+#: location.cc:641
+msgid "XML node for Location has no flags information"
+msgstr "用于定位的 XML 节点没有标志信息"
 
-#: sfdb_ui.cc:718
-msgid "Search Freesound"
-msgstr "搜索自由声音"
+#: location.cc:868
+msgid "Locations: attempt to use unknown location as selected location"
+msgstr "位置:尝试使用未知的位置作为已选择的位置"
 
-#: sfdb_ui.cc:738
-msgid "Press to import selected files and close this window"
-msgstr "按下插入已选中的文件并且关闭此窗口"
+#: location.cc:1046
+msgid "incorrect XML mode passed to Locations::set_state"
+msgstr "不正确的 XML模式传递给 Location::set_state"
 
-#: sfdb_ui.cc:739
-msgid "Press to import selected files and leave this window open"
-msgstr "按下插入已选中的文件并且保留此窗口"
+#: location.cc:1059 session.cc:1667 session.cc:6305 session_state.cc:1205
+msgid "session"
+msgstr "会话"
 
-#: sfdb_ui.cc:740
-msgid "Press to close this window without importing any files"
-msgstr "按下关闭此窗口并且不插入任何文件"
+#: location.cc:1126
+msgid "could not load location from session file - ignored"
+msgstr "无法从会话文件载入位置——已忽略"
 
-#: sfdb_ui.cc:936
-msgid "SoundFileBrowser: Could not tokenize string: "
-msgstr "声音文件浏览器:无法令牌化字符串: "
+#: location_importer.cc:61
+msgid "Locations"
+msgstr "位置"
 
-#: sfdb_ui.cc:1136
-msgid "%1 more page of 100 results available"
-msgid_plural "%1 more pages of 100 results available"
-msgstr[0] "%1 有 100 多页结果可用"
+#: location_importer.cc:123
+msgid "Location: "
+msgstr "位置:"
 
-#: sfdb_ui.cc:1141
-msgid "No more results available"
-msgstr "无更多结果可用"
+#: location_importer.cc:125
+msgid ""
+"Range\n"
+"start: "
+msgstr ""
+"范围\n"
+"起点:"
 
-#: sfdb_ui.cc:1205
-msgid "B"
+#: location_importer.cc:126
+msgid ""
+"\n"
+"end: "
 msgstr ""
+"\n"
+"终点:"
 
-#: sfdb_ui.cc:1207
-msgid "kB"
+#: location_importer.cc:146
+msgid ""
+"The location is the Punch range. It will be imported as a normal range.\n"
+"You may rename the imported location:"
 msgstr ""
+"该位置是个切换范围。它将被作为一个普通范围而导入。\n"
+"您可以重命名被导入的位置:"
 
-#: sfdb_ui.cc:1209 sfdb_ui.cc:1211
-msgid "MB"
+#: location_importer.cc:157
+msgid ""
+"The location is a Loop range. It will be imported as a normal range.\n"
+"You may rename the imported location:"
 msgstr ""
+"该位置是个循环范围。它将被作为一个普通范围而导入。\n"
+"您可以重命名被导入的位置:"
 
-#: sfdb_ui.cc:1213
-msgid "GB"
+#: location_importer.cc:168
+msgid ""
+"A location with that name already exists.\n"
+"You may rename the imported location:"
 msgstr ""
+"已经有一个相同名称的位置存在。\n"
+"您可以重命名导入的位置:"
 
-#: sfdb_ui.cc:1425 sfdb_ui.cc:1738 sfdb_ui.cc:1801 sfdb_ui.cc:1819
-msgid "one track per file"
-msgstr "每个文件一个音轨"
+#: ltc_file_reader.cc:96
+msgid "LTCFileReader: cannot open file \"%1\""
+msgstr "LTC(纵向时间码)文件阅读器:无法打开文件 \"%1\""
 
-#: sfdb_ui.cc:1428 sfdb_ui.cc:1802 sfdb_ui.cc:1820
-msgid "one track per channel"
-msgstr "每个声道一个音轨"
+#: ltc_file_reader.cc:105
+msgid "LTCFileReader: cannot open file \"%1\" (%3)"
+msgstr "纵向时间码)文件阅读器:无法打开文件 \"%1\" (%3)"
 
-#: sfdb_ui.cc:1436 sfdb_ui.cc:1804 sfdb_ui.cc:1821
-msgid "sequence files"
-msgstr "序列文件"
+#: ltc_file_reader.cc:109
+msgid "LTCFileReader: \"%1\" is an empty audio file"
+msgstr "LTC(纵向时间码)文件阅读器: \"%1\" 是一个空白音频文件"
 
-#: sfdb_ui.cc:1439 sfdb_ui.cc:1809
-msgid "all files in one track"
-msgstr "所有文件在一个音轨上"
+#: ltc_file_reader.cc:134
+msgid "LTCFileReader:: invalid audio channel selected"
+msgstr "LTC(纵向时间码)文件阅读器 :: 无效的音频声道已选择"
 
-#: sfdb_ui.cc:1440 sfdb_ui.cc:1803
-msgid "merge files"
-msgstr "合并文件"
+#: ltc_slave.cc:275
+msgid "Session framerate adjusted from %1 to LTC's %2."
+msgstr "会话帧率从 %1 已调整为 LTC(纵向时间码)的 %2。"
 
-#: sfdb_ui.cc:1446 sfdb_ui.cc:1806
-msgid "one region per file"
-msgstr "每个文件一个区域"
+#: ltc_slave.cc:289
+msgid "Session and LTC framerate mismatch: LTC:%1 Session:%2."
+msgstr ""
+"会话与LTC(纵向时间码)的帧率不匹配: LTC(纵向时间码):%1 会话: %2。"
 
-#: sfdb_ui.cc:1449 sfdb_ui.cc:1807
-msgid "one region per channel"
-msgstr "每个声道一个区域"
+#: ltc_slave.cc:609
+msgid "flywheel"
+msgstr "飞轮"
 
-#: sfdb_ui.cc:1454 sfdb_ui.cc:1808 sfdb_ui.cc:1822
-msgid "all files in one region"
-msgstr "所有文件在一个区域里"
+#: lua_api.cc:87
+msgid "Script with given name was not found\n"
+msgstr "未找到带有给定名称的脚本\n"
 
-#: sfdb_ui.cc:1521
-msgid ""
-"One or more of the selected files\n"
-"cannot be used by %1"
-msgstr ""
-"一个或多个已选中的文件\n"
-"不能被用于 %1"
+#: lua_api.cc:96
+msgid "Failed to instantiate Lua Processor\n"
+msgstr "实例化 Lua 处理器失败\n"
 
-#: sfdb_ui.cc:1665
-msgid "Copy files to session"
-msgstr "复制文件到会话"
+#: luaproc.cc:876
+msgid "Failed to load Lua script from session state."
+msgstr "从会话状态载入 Lua 脚本失败。"
 
-#: sfdb_ui.cc:1682 sfdb_ui.cc:1859
-msgid "file timestamp"
-msgstr "文件时间戳"
+#: luaproc.cc:886
+msgid "Session State for LuaProcessor did not include a Lua script."
+msgstr "用于 LuaProcessor 的会话状态没有包括一个 Lua 脚本。"
 
-#: sfdb_ui.cc:1683 sfdb_ui.cc:1861
-msgid "edit point"
-msgstr "编辑点"
+#: luaproc.cc:890
+msgid "Invalid/incompatible Lua script found for LuaProcessor."
+msgstr "发现用于 LuaProcessor 的无效的/不兼容的 Lua 脚本。"
 
-#: sfdb_ui.cc:1684 sfdb_ui.cc:1863
-msgid "playhead"
-msgstr "指针"
+#: luaproc.cc:918
+msgid "Bad node sent to LuaProc::set_state"
+msgstr "坏节点发送到 LuaProc::set_state"
 
-#: sfdb_ui.cc:1685
-msgid "session start"
-msgstr "会话起点"
+#: luaproc.cc:928
+msgid "LuaProc: port has no symbol, ignored"
+msgstr "LuaProc:端口没有符号,已忽略"
 
-#: sfdb_ui.cc:1691
-msgid "<b>Add files as ...</b>"
-msgstr "<b>添加文件为…</b>"
+#: luaproc.cc:934
+msgid "LuaProc: port has no value, ignored"
+msgstr "LuaProc:端口没有数值,已忽略"
 
-#: sfdb_ui.cc:1713
-msgid "<b>Insert at</b>"
-msgstr "<b>插入于</b>"
+#: luaproc.cc:1164
+msgid "Unable to create LuaProc presets directory"
+msgstr ""
 
-#: sfdb_ui.cc:1726
-msgid "<b>Mapping</b>"
-msgstr "<b>映射</b>"
+#: luascripting.cc:132
+msgid "Script '%1' has no valid descriptor."
+msgstr "脚本 '%1' 没有有效的描述符。"
 
-#: sfdb_ui.cc:1744
-msgid "<b>Conversion quality</b>"
-msgstr "<b>转换质量</b>"
+#: midi_diskstream.cc:172
+msgid ""
+"%1: I/O configuration change %4 requested to use %2, but channel setup is %3"
+msgstr "%1:输入/输出配置改变  %4 要求使用 %2,但声道设置是 %3"
 
-#: sfdb_ui.cc:1756
-msgid "<b>Instrument</b>"
-msgstr "<b>乐器</b>"
+#: midi_diskstream.cc:224
+msgid "MidiDiskstream: Playlist \"%1\" isn't a midi playlist"
+msgstr "Midi 硬盘流:播放列表 \"%1\" 不是一个 midi 播放列表"
 
-#: sfdb_ui.cc:1768 sfdb_ui.cc:1875
-msgid "Best"
-msgstr "最佳"
+#: midi_diskstream.cc:275
+msgid "MidiDiskstream %1: there is no existing playlist to make a copy of!"
+msgstr "Midi 硬盘流 %1:没有已存在的播放列表可用于复制!"
 
-#: sfdb_ui.cc:1769 sfdb_ui.cc:1877
-msgid "Good"
-msgstr "好"
+#: midi_diskstream.cc:753
+msgid "MidiDiskstream %1: cannot read %2 from playlist at frame %3"
+msgstr "Midi 硬盘流 %1:在 %3 帧无法从播放列表读取 %2"
 
-#: sfdb_ui.cc:1770 sfdb_ui.cc:1879
-msgid "Quick"
-msgstr "å¿«"
+#: midi_diskstream.cc:890
+msgid "MidiDiskstream %1: cannot write to disk"
+msgstr "Midi 硬盘流 %1:无法写入硬盘"
 
-#: sfdb_ui.cc:1772
-msgid "Fastest"
-msgstr "最快"
+#: midi_diskstream.cc:924
+msgid "MidiDiskstream \"%1\": cannot flush captured data to disk!"
+msgstr "Midi 硬盘流 \"%1\":无法注入已捕获的数据到硬盘!"
 
-#: shuttle_control.cc:56
-msgid "Shuttle speed control (Context-click for options)"
-msgstr "往复速度控制(右键点击查看更多选项)"
+#: midi_diskstream.cc:1013
+msgid "%1: could not create region for complete midi file"
+msgstr "%1:无法为完成 MIDI 文件而创建区域"
 
-#: shuttle_control.cc:174
-msgid "Percent"
-msgstr "百分比"
+#: midi_diskstream.cc:1054
+msgid "MidiDiskstream: could not create region for captured midi!"
+msgstr "Midi 硬盘流:无法为已捕获的 MIDI 创建区域!"
 
-#: shuttle_control.cc:182
-msgid "Units"
-msgstr "单位"
+#: midi_model.cc:589
+msgid "Change has no note, using note ID"
+msgstr "变化没有节点,正在使用节点 ID"
 
-#: shuttle_control.cc:188 shuttle_control.cc:609
-msgid "Sprung"
-msgstr "弹动"
+#: midi_model.cc:593
+msgid "Change has no note or note ID"
+msgstr "变化没有节点或节点ID"
 
-#: shuttle_control.cc:192 shuttle_control.cc:612
-msgid "Wheel"
-msgstr "轮转"
+#: midi_model.cc:614
+msgid "No NoteID found for note property change - ignored"
+msgstr "未找到用于音符参数变化的 NoteID ——已忽略"
 
-#: shuttle_control.cc:226
-msgid "Maximum speed"
-msgstr "最大速度"
+#: midi_model.cc:890
+msgid "No SysExID found for sys-ex property change - ignored"
+msgstr "未找到用于 sys-ex 变化的 SysExID ——已忽略"
 
-#: shuttle_control.cc:568
-msgid "Playing"
-msgstr "播放中"
+#: midi_patch_manager.cc:78
+msgid "Loading %1 MIDI patch from %2"
+msgid_plural "Loading %1 MIDI patches from %2"
+msgstr[0] "正在从 %2 载入 %1 MIDI 音色"
 
-#: shuttle_control.cc:583
-#, c-format
-msgid "<<< %+d semitones"
-msgstr "<<< %+d 半音"
+#: midi_patch_manager.cc:109
+msgid "Unloading %1 MIDI patch from %2"
+msgid_plural "Unloading %1 MIDI patches from %2"
+msgstr[0] "正在撤销从 %2 载入 %1 MIDI 音色"
 
-#: shuttle_control.cc:585
-#, c-format
-msgid ">>> %+d semitones"
-msgstr ">>> %+d 半音"
+#: midi_patch_manager.cc:126
+msgid "Error parsing MIDI patch file %1"
+msgstr "解析 MIDI 音色文件 %1 出错"
 
-#: shuttle_control.cc:590
-msgid "Stopped"
-msgstr "已停止"
+#: midi_patch_manager.cc:135
+msgid "Duplicate MIDI device `%1' in `%2' ignored"
+msgstr "在`%2' 内复制 MIDI 设备 `%1' 已忽略"
 
-#: soundcloud_export_selector.cc:44
-msgid "User Email"
-msgstr "用户电子信箱"
+#: midi_patch_manager.cc:170
+msgid "Removing MIDI patch file %1"
+msgstr "移除 MIDI 音色文件 %1"
 
-#: soundcloud_export_selector.cc:45
-msgid "Password"
-msgstr "密码"
+#: midi_scene_changer.cc:312
+msgid "Scene "
+msgstr "场景"
 
-#: soundcloud_export_selector.cc:46
-msgid "Make files public"
-msgstr "文件公开"
+#: midi_source.cc:126
+msgid "Missing parameter property on InterpolationStyle"
+msgstr "在 InterpolationStyle(插值类型)上缺少参数属性"
 
-#: soundcloud_export_selector.cc:47
-msgid "Open uploaded files in browser"
-msgstr "在浏览器里打开已上传的文件"
+#: midi_source.cc:132
+msgid "Missing style property on InterpolationStyle"
+msgstr "在 InterpolationStyle(插值类型)上缺少类型属性"
 
-#: soundcloud_export_selector.cc:48
-msgid "Make files downloadable"
-msgstr "文件可下载"
+#: midi_source.cc:141
+msgid "Missing parameter property on AutomationState"
+msgstr "在 AutomationState(自动化状态)上缺少参数属性"
 
-#: soundcloud_export_selector.cc:107
-msgid "%1: %2 of %3 bytes uploaded"
-msgstr "%1: %2 的 %3 字节已上传"
+#: midi_source.cc:147
+msgid "Missing state property on AutomationState"
+msgstr "在 AutomationState(自动化状态)上缺少状态属性"
 
-#: splash.cc:73
-msgid "%1 loading ..."
-msgstr "%1 载入中…"
+#: midi_stretch.cc:88
+msgid "MIDI stretch created non-MIDI source"
+msgstr "MIDI 延伸已创建 non-MIDI 来源"
 
-#: speaker_dialog.cc:40
-msgid "Add Speaker"
-msgstr "添加扬声器"
+#: monitor_processor.cc:54
+msgid "monitor dim"
+msgstr "监控减弱"
 
-#: speaker_dialog.cc:41
-msgid "Remove Speaker"
-msgstr "移除扬声器"
+#: monitor_processor.cc:55
+msgid "monitor cut"
+msgstr "监控剪切"
 
-#: speaker_dialog.cc:63
-msgid "Azimuth:"
-msgstr "方位角:"
+#: monitor_processor.cc:56
+msgid "monitor mono"
+msgstr "监控单声道"
 
-#: startup.cc:67
-msgid ""
-"Use an external mixer or the hardware mixer of your audio interface.\n"
-"%1 will play NO role in monitoring"
-msgstr ""
-"使用一个外部混音器或您的音频接口硬件混音器。\n"
-"%1 将不会出现在监控中"
+#: monitor_processor.cc:59
+msgid "monitor dim level"
+msgstr "监控减弱电平"
 
-#: startup.cc:69
-msgid "Ask %1 to play back material as it is being recorded"
-msgstr "当 %1 被录制时请求其回放材料"
+#: monitor_processor.cc:63
+msgid "monitor solo boost level"
+msgstr "监控独奏放大电平"
 
-#: startup.cc:142
-msgid ""
-"<span size=\"larger\">%1 is a digital audio workstation. You can use it to record, "
-"edit and mix multi-track audio. You can produce your own CDs, mix video "
-"soundtracks, or experiment with new ideas about music and sound. \n"
-"\n"
-"There are a few things that need to be configured before you start using the "
-"program.</span> "
-msgstr ""
-"<span size=\"larger\">%1 是一个数字音频工作站。您可以用它录制、编辑并混合多声道音"
-"频。您可以创作自己的CD光盘、混合视频音轨、或者试验与音乐和声音有关的新想法。\n"
-"\n"
-"在您开始使用这个程序之前,需要完成一些配置。</span> "
+#: monitor_processor.cc:543
+msgid "cut control %1"
+msgstr "剪切控制 %1"
 
-#: startup.cc:168
-msgid "Welcome to %1"
-msgstr "欢迎使用 %1"
+#: monitor_processor.cc:544
+msgid "dim control"
+msgstr "减弱控制"
 
-#: startup.cc:191
-msgid "Default folder for %1 sessions"
-msgstr "会话 %1 的默认文件夹"
+#: monitor_processor.cc:545
+msgid "polarity control"
+msgstr "极性控制"
 
-#: startup.cc:197
-msgid ""
-"Each project that you work on with %1 has its own folder.\n"
-"These can require a lot of disk space if you are recording audio.\n"
-"\n"
-"Where would you like new %1 sessions to be stored by default?\n"
-"\n"
-"<i>(You can put new sessions anywhere, this is just a default)</i>"
-msgstr ""
-"您在 %1 工作的每个项目都有它各自的文件夹。\n"
-"当您在录制音频时,可能需要大量的磁盘空间。\n"
-"\n"
-"您希望新的 %1 会话被默认存放在哪儿?\n"
-"\n"
-"<i>(您可以把新的会话存放在任何位置,这里只是默认文件夹)</i>"
+#: monitor_processor.cc:546
+msgid "solo control"
+msgstr "独奏控制"
 
-#: startup.cc:220
-msgid "Default folder for new sessions"
-msgstr "新会话的默认文件夹"
+#: mtc_slave.cc:241
+msgid "MTC Slave: atomic read of current time failed, sleeping!"
+msgstr "MTC(MIDI 时间码)从属:当前时间的 atomic read 原子读取失败,睡眠!"
 
-#: startup.cc:241
+#: mtc_slave.cc:363
 msgid ""
-"While recording instruments or vocals, you probably want to listen to the\n"
-"signal as well as record it. This is called \"monitoring\". There are\n"
-"different ways to do this depending on the equipment you have and the\n"
-"configuration of that equipment. The two most common are presented here.\n"
-"Please choose whichever one is right for your setup.\n"
-"\n"
-"<i>(You can change this preference at any time, via the Preferences dialog)</i>\n"
-"\n"
-"<i>If you do not understand what this is about, just accept the default.</i>"
+"Unknown rate/drop value %1 in incoming MTC stream, session values used "
+"instead"
 msgstr ""
-"当录制乐器或人声时,您可能希望在录制的同时听到信号。\n"
-"这被称为“监控”。\n"
-"有不同的方法可以做到这一点,这取决于您所拥有的设备以及这些设备的配置。\n"
-"这里有两个最常见的方式。\n"
-"请选择最适合您的设置的那一个。\n"
-"\n"
-"<i>(您可以在任何时候改变这个首选项,就在首选项对话框里)</i>\n"
-"\n"
-"<i>如果您不大了解这方面的信息,保持默认即可。</i>"
-
-#: startup.cc:262
-msgid "Monitoring Choices"
-msgstr "监控选择"
+"在引入的 MTC(MIDI 时间码)流里有未知的比率/沉降数值 %1 ,使用会话数值代替"
 
-#: startup.cc:285
-msgid "Use a Master bus directly"
-msgstr "直接使用主控总线"
+#: mtc_slave.cc:383
+msgid "Session framerate adjusted from %1 TO: MTC's %2."
+msgstr "会话帧率从 %1 调整为:MTC(MIDI 时间码)的 %2。"
 
-#: startup.cc:287
-msgid ""
-"Connect the Master bus directly to your hardware outputs. This is preferable for "
-"simple usage."
-msgstr "直接连接主控总线到您的硬件输出。这可能更简单易用。"
+#: mtc_slave.cc:397
+msgid "Session and MTC framerate mismatch: MTC:%1 %2:%3."
+msgstr "会话与MTC(MIDI 时间码)帧率不匹配:MTC(MIDI 时间码):%1 %2:%3。"
 
-#: startup.cc:296
-msgid "Use an additional Monitor bus"
-msgstr "使用一个额外的监控总线"
+#: operations.cc:41
+msgid "capture"
+msgstr "捕获"
 
-#: startup.cc:299
-msgid ""
-"Use a Monitor bus between Master bus and hardware outputs for \n"
-"greater control in monitoring without affecting the mix."
-msgstr ""
-"在主控总线和硬件输入之间使用一个监控总线\n"
-"监控时可更好的控制,不会影响混音。"
+#: operations.cc:42
+msgid "paste"
+msgstr "粘贴"
 
-#: startup.cc:321
-msgid ""
-"<i>You can change this preference at any time via the Preferences dialog.\n"
-"You can also add or remove the monitor section to/from any session.</i>\n"
-"\n"
-"<i>If you do not understand what this is about, just accept the default.</i>"
-msgstr ""
-"<i>您可以在任何时候改变这个首选项,就在首选项对话框里。\n"
-"您也可以添加监控面到任何会话,或着从任何会话移除监控面。</i>\n"
-"\n"
-"<i>如果您不大了解这方面的信息,保持默认即可。</i>"
+#: operations.cc:43
+msgid "duplicate region"
+msgstr "复制区域"
 
-#: startup.cc:332
-msgid "Monitor Section"
-msgstr "监控面"
+#: operations.cc:44
+msgid "insert file"
+msgstr "插入文件"
 
-#: step_entry.cc:60
-msgid "Step Entry: %1"
-msgstr "步进入口:%1"
+#: operations.cc:45
+msgid "insert region"
+msgstr "插入区域"
 
-#: step_entry.cc:65
-msgid ">beat"
-msgstr ">拍子"
+#: operations.cc:46
+msgid "drag region brush"
+msgstr "拖拽区域笔刷"
 
-#: step_entry.cc:66
-msgid ">bar"
-msgstr ">小节"
+#: operations.cc:47
+msgid "region drag"
+msgstr "区域拖拽"
 
-#: step_entry.cc:67
-msgid ">EP"
-msgstr ">采样"
+#: operations.cc:48
+msgid "selection grab"
+msgstr "已选择部分抓取"
 
-#: step_entry.cc:68
-msgid "sustain"
-msgstr "持续"
+#: operations.cc:49
+msgid "region fill"
+msgstr "区域填充"
 
-#: step_entry.cc:69
-msgid "rest"
-msgstr "休止"
+#: operations.cc:50
+msgid "fill selection"
+msgstr "填充已选择部分"
 
-#: step_entry.cc:70
-msgid "g-rest"
-msgstr "g-休止"
+#: operations.cc:51
+msgid "create region"
+msgstr "创建区域"
 
-#: step_entry.cc:71
-msgid "back"
-msgstr "后退"
+#: operations.cc:52
+msgid "region copy"
+msgstr "区域复制"
 
-#: step_entry.cc:82 step_entry.cc:85
-msgid "+"
-msgstr ""
+#: operations.cc:53
+msgid "fixed time region copy"
+msgstr "固定时间区域复制"
 
-#: step_entry.cc:191
-msgid "Set note length to a whole note"
-msgstr "设置音符长度为全音符"
+#: pannable.cc:208
+msgid "Pannable given XML data for %1 - ignored"
+msgstr "可用声相为 %1 指定的 XML 数据——已忽略"
 
-#: step_entry.cc:192
-msgid "Set note length to a half note"
-msgstr "设置音符长度为半音符"
+#: panner_manager.cc:95
+msgid "looking for panners in %1\n"
+msgstr "正在 %1 中查找声相器\n"
 
-#: step_entry.cc:193
-msgid "Set note length to a quarter note"
-msgstr "设置音符长度为四分音符"
+#: panner_manager.cc:121
+msgid "Panner discovered: \"%1\" in %2\n"
+msgstr "已发现声相器:在 %2 中的 \"%1\"\n"
 
-#: step_entry.cc:194
-msgid "Set note length to a eighth note"
-msgstr "设置音符长度为八分音符"
+#: panner_manager.cc:140
+msgid "PannerManager: cannot load module \"%1\" (%2)"
+msgstr "声相器管理器:无法载入模式 \"%1\"(%2)"
 
-#: step_entry.cc:195
-msgid "Set note length to a sixteenth note"
-msgstr "设置音符长度为十六分音符"
+#: panner_manager.cc:147
+msgid "PannerManager: module \"%1\" has no descriptor function."
+msgstr "声相器管理器: \"%1\" 没有描述符函数。"
 
-#: step_entry.cc:196
-msgid "Set note length to a thirty-second note"
-msgstr "设置音符长度为三十二分音符"
+#: panner_manager.cc:234
+msgid "no panner discovered for in/out = %1/%2"
+msgstr "未发现用于输入/输出的声相器 = %1/%2"
 
-#: step_entry.cc:197
-msgid "Set note length to a sixty-fourth note"
-msgstr "设置音符长度为六十四分音符"
+#: panner_shell.cc:122
+msgid ""
+"No panner found: check that panners are being discovered correctly during "
+"startup."
+msgstr "找不到声相器:检查启动时被正确发现的声相器。"
 
-#: step_entry.cc:276
-msgid "Set volume (velocity) to pianississimo"
-msgstr "设置音量(力度)为最弱音"
+#: panner_shell.cc:126
+msgid "select panner: %1\n"
+msgstr "选择声相器:%1\n"
 
-#: step_entry.cc:277
-msgid "Set volume (velocity) to pianissimo"
-msgstr "设置音量(力度)为极弱音"
+#: panner_shell.cc:257
+msgid "Unknown panner plugin \"%1\" found in pan state - ignored"
+msgstr "在声相状态中发现未知的声相器插件 \"%1\" ——已忽略"
 
-#: step_entry.cc:278
-msgid "Set volume (velocity) to piano"
-msgstr "设置音量(力度)为弱音"
+#: panner_shell.cc:263
+msgid "panner plugin node has no type information!"
+msgstr "声相器插件节点没有类型信息!"
 
-#: step_entry.cc:279
-msgid "Set volume (velocity) to mezzo-piano"
-msgstr "设置音量(力度)为中弱音"
+#: parameter_descriptor.cc:201
+msgid "Note|C"
+msgstr ""
 
-#: step_entry.cc:280
-msgid "Set volume (velocity) to mezzo-forte"
-msgstr "设置音量(力度)为中强音"
+#: parameter_descriptor.cc:202
+msgid "Note|C#"
+msgstr ""
 
-#: step_entry.cc:281
-msgid "Set volume (velocity) to forte"
-msgstr "设置音量(力度)为强音"
+#: parameter_descriptor.cc:203
+msgid "Note|D"
+msgstr ""
 
-#: step_entry.cc:282
-msgid "Set volume (velocity) to fortissimo"
-msgstr "设置音量(力度)为极强音"
+#: parameter_descriptor.cc:204
+msgid "Note|D#"
+msgstr ""
 
-#: step_entry.cc:283
-msgid "Set volume (velocity) to fortississimo"
-msgstr "设置音量(力度)为最强音"
+#: parameter_descriptor.cc:205
+msgid "Note|E"
+msgstr ""
 
-#: step_entry.cc:331
-msgid "Stack inserted notes to form a chord"
-msgstr "堆栈已插入的音符形成一个和弦"
+#: parameter_descriptor.cc:206
+msgid "Note|F"
+msgstr ""
 
-#: step_entry.cc:332
-msgid "Extend selected notes by note length"
-msgstr "通过音符长度延伸已选择的音符"
+#: parameter_descriptor.cc:207
+msgid "Note|F#"
+msgstr ""
 
-#: step_entry.cc:333
-msgid "Use undotted note lengths"
-msgstr "使用不带点音符长度"
+#: parameter_descriptor.cc:208
+msgid "Note|G"
+msgstr ""
 
-#: step_entry.cc:334
-msgid "Use dotted (* 1.5) note lengths"
-msgstr "使用带点(*1.5)音符长度"
+#: parameter_descriptor.cc:209
+msgid "Note|G#"
+msgstr ""
 
-#: step_entry.cc:335
-msgid "Use double-dotted (* 1.75) note lengths"
-msgstr "使用带双点(*1.75)音符长度"
+#: parameter_descriptor.cc:210
+msgid "Note|A"
+msgstr ""
 
-#: step_entry.cc:336
-msgid "Use triple-dotted (* 1.875) note lengths"
-msgstr "使用带三点(* 1.875)音符长度"
+#: parameter_descriptor.cc:211
+msgid "Note|A#"
+msgstr ""
 
-#: step_entry.cc:337
-msgid "Insert a note-length's rest"
-msgstr "插入一个音符长度的休止符"
+#: parameter_descriptor.cc:212
+msgid "Note|B"
+msgstr ""
 
-#: step_entry.cc:338
-msgid "Insert a grid-unit's rest"
-msgstr "插入一个网格单位的休止符"
+#: playlist.cc:2234
+msgid "region state node has no ID, ignored"
+msgstr "区域状态节点没有 ID,已忽略"
 
-#: step_entry.cc:339
-msgid "Insert a rest until the next beat"
-msgstr "插入一个休止符直到下一拍"
+#: playlist.cc:2252
+msgid "Playlist: cannot create region from XML"
+msgstr "播放列表:无法从 XML 创建区域"
 
-#: step_entry.cc:340
-msgid "Insert a rest until the next bar"
-msgstr "插入一个休止符直到下一小节"
+#: playlist_source.cc:99
+msgid "No playlist ID in PlaylistSource XML!"
+msgstr "在 PlaylistSource 播放列表来源 XML 里没有播放列表 ID!"
 
-#: step_entry.cc:341
-msgid "Insert a bank change message"
-msgstr "插入一个库变换信息"
+#: playlist_source.cc:118
+msgid "Could not construct playlist for PlaylistSource from session data!"
+msgstr "无法从会话数据为 PlaylistSource 构造播放列表!"
 
-#: step_entry.cc:342
-msgid "Insert a program change message"
-msgstr "插入一个程式变换信息"
+#: plugin.cc:126
+msgid "Cannot remove plugin factory preset."
+msgstr "无法移除插件出厂预设。"
 
-#: step_entry.cc:343 step_entry.cc:700
-msgid "Move Insert Position Back by Note Length"
-msgstr "按音符长度向后移动插入位置"
+#: plugin.cc:144
+msgid "Preset with given name already exists."
+msgstr "指定的预设名称已存在。"
 
-#: step_entry.cc:344 step_entry.cc:698
-msgid "Move Insert Position to Edit Point"
-msgstr "移动插入位置到编辑位置"
+#: plugin.cc:263
+msgid "Audio"
+msgstr ""
 
-#: step_entry.cc:401
-msgid "1/Note"
-msgstr "1/音符"
+#: plugin.cc:266
+msgid "Midi"
+msgstr ""
 
-#: step_entry.cc:415
-msgid "Octave"
-msgstr "八度"
+#: plugin.cc:269
+msgid "?"
+msgstr ""
 
-#: step_entry.cc:598
-msgid "Insert Note A"
-msgstr "插入音符A"
+#: plugin.cc:412
+msgid ""
+"Plugin presets are not supported in this build of %1. Consider paying for a "
+"full version"
+msgstr "在 %1 的这个编译版中不支持插件预设。请考虑为一个完整的版本付费"
 
-#: step_entry.cc:599
-msgid "Insert Note A-sharp"
-msgstr "插入音符A#"
+#: plugin.cc:495
+msgid ""
+"Saving plugin settings is not supported in this build of %1. Consider paying "
+"for the full version"
+msgstr "在 %1 的这个编译版中不支持保存插件。请考虑为一个完整的版本付费"
 
-#: step_entry.cc:600
-msgid "Insert Note B"
-msgstr "插入音符B"
+#: plugin_insert.cc:1148
+msgid "programming error: "
+msgstr "程序错误:"
 
-#: step_entry.cc:601
-msgid "Insert Note C"
-msgstr "插入音符C"
+#: plugin_insert.cc:1700
+msgid "SC %1"
+msgstr ""
 
-#: step_entry.cc:602
-msgid "Insert Note C-sharp"
-msgstr "插入音符C#"
+#: plugin_insert.cc:2352
+msgid "XML node describing plugin is missing the `type' field"
+msgstr "XML节点正在描述的插件缺失 “type” 字段"
 
-#: step_entry.cc:603
-msgid "Insert Note D"
-msgstr "插入音符D"
+#: plugin_insert.cc:2369
+msgid "unknown plugin type %1 in plugin insert state"
+msgstr "在插件插入状态中有未知的插件类型 %1"
 
-#: step_entry.cc:604
-msgid "Insert Note D-sharp"
-msgstr "插入音符D#"
+#: plugin_insert.cc:2397
+msgid "Plugin has no unique ID field"
+msgstr "插件没有唯一的 ID 字段"
 
-#: step_entry.cc:605
-msgid "Insert Note E"
-msgstr "插入音符E"
+#: plugin_insert.cc:2435
+msgid ""
+"Found a reference to a plugin (\"%1\") that is unknown.\n"
+"Perhaps it was removed or moved since it was last used."
+msgstr ""
+"发现一个引用指向到一个未知的插件(\"%1\")。\n"
+"也许自从它最后一次使用之后被移除或者移动了。"
 
-#: step_entry.cc:606
-msgid "Insert Note F"
-msgstr "插入音符F"
+#: plugin_insert.cc:2645
+msgid "PluginInsert: Auto: no ladspa port number"
+msgstr "插件插入:自动:无 ladspa 端口号"
 
-#: step_entry.cc:607
-msgid "Insert Note F-sharp"
-msgstr "插入音符F#"
+#: plugin_insert.cc:2652
+msgid "PluginInsert: Auto: port id out of range"
+msgstr "插件插入:自动:端口 ID 超出范围"
 
-#: step_entry.cc:608
-msgid "Insert Note G"
-msgstr "插入音符G"
+#: plugin_insert.cc:2688
+msgid "PluginInsert: automatable control %1 not found - ignored"
+msgstr "插件插入:未找到可自动化控制 %1 ——已忽略"
 
-#: step_entry.cc:609
-msgid "Insert Note G-sharp"
-msgstr "插入音符G#"
+#: plugin_manager.cc:220
+msgid "Discovering Plugins"
+msgstr "正在查找插件"
 
-#: step_entry.cc:611
-msgid "Insert a Note-length Rest"
-msgstr "插入一个全休止符"
+#: plugin_manager.cc:251
+msgid "Scanning LADSPA Plugins"
+msgstr "正在扫描 LADSPA 插件"
 
-#: step_entry.cc:612
-msgid "Insert a Snap-length Rest"
-msgstr "插入一个吸附长度的休止符"
+#: plugin_manager.cc:253
+msgid "Scanning Lua DSP Processors"
+msgstr ""
 
-#: step_entry.cc:614 step_entry.cc:615
-msgid "Move to next octave"
-msgstr "移动到下一个八度"
+#: plugin_manager.cc:256
+msgid "Scanning LV2 Plugins"
+msgstr "正在扫描 LV2 插件"
 
-#: step_entry.cc:617
-msgid "Move to Next Note Length"
-msgstr "移动到下一个音符长度"
+#: plugin_manager.cc:262
+msgid "Scanning Windows VST Plugins"
+msgstr "正在扫描 Windows VST 插件"
 
-#: step_entry.cc:618
-msgid "Move to Previous Note Length"
-msgstr "移动到上一个音符长度"
+#: plugin_manager.cc:264
+msgid "Discovering Windows VST Plugins"
+msgstr "正在查找 Windows VST 插件"
 
-#: step_entry.cc:620
-msgid "Increase Note Length"
-msgstr "增加音符长度"
+#: plugin_manager.cc:273
+msgid "Scanning Linux VST Plugins"
+msgstr "正在扫描 Linux VST 插件"
 
-#: step_entry.cc:621
-msgid "Decrease Note Length"
-msgstr "减少音符长度"
+#: plugin_manager.cc:275
+msgid "Discovering Linux VST Plugins"
+msgstr "正在查找 Linux VST 插件"
 
-#: step_entry.cc:623
-msgid "Move to Next Note Velocity"
-msgstr "移动到下一个音符力度"
+#: plugin_manager.cc:288
+msgid "VST Blacklist: "
+msgstr "VST 黑名单:"
 
-#: step_entry.cc:624
-msgid "Move to Previous Note Velocity"
-msgstr "移动到上一个音符力度"
+#: plugin_manager.cc:290
+msgid "VST Blacklist:"
+msgstr "VST 黑名单:"
 
-#: step_entry.cc:626
-msgid "Increase Note Velocity"
-msgstr "增加音符力度"
+#: plugin_manager.cc:300
+msgid "Scanning AU Plugins"
+msgstr "正在扫描 AU 插件"
 
-#: step_entry.cc:627
-msgid "Decrease Note Velocity"
-msgstr "减少音符力度"
+#: plugin_manager.cc:302
+msgid "Discovering AU Plugins"
+msgstr "正在查找 AU 插件"
 
-#: step_entry.cc:629
-msgid "Switch to the 1st octave"
-msgstr "切换到第一个八度"
+#: plugin_manager.cc:307
+msgid "Plugin Scan Complete..."
+msgstr "插件扫描完成…"
 
-#: step_entry.cc:630
-msgid "Switch to the 2nd octave"
-msgstr "切换到第二个八度"
+#: plugin_manager.cc:513
+msgid "LADSPA"
+msgstr ""
 
-#: step_entry.cc:631
-msgid "Switch to the 3rd octave"
-msgstr "切换到第三个八度"
+#: plugin_manager.cc:565
+msgid "Could not parse rdf file: %1"
+msgstr "无法解析 rdf 文件:%1"
 
-#: step_entry.cc:632
-msgid "Switch to the 4th octave"
-msgstr "切换到第四个八度"
+#: plugin_manager.cc:602
+msgid "LADSPA: cannot load module \"%1\" (%2)"
+msgstr "LADSPA:无法载入模块 \"%1\"(%2)"
 
-#: step_entry.cc:633
-msgid "Switch to the 5th octave"
-msgstr "切换到第五个八度"
+#: plugin_manager.cc:609
+msgid "LADSPA: module \"%1\" has no descriptor function."
+msgstr "LADSPA:模块 \"%1\" 没有描述符函数。"
 
-#: step_entry.cc:634
-msgid "Switch to the 6th octave"
-msgstr "切换到第六个八度"
+#: plugin_manager.cc:813
+msgid "--- Windows VST plugins Scan: %1"
+msgstr "--- Windows VST 插件扫描:%1"
 
-#: step_entry.cc:635
-msgid "Switch to the 7th octave"
-msgstr "切换到第七个八度"
+#: plugin_manager.cc:819
+msgid "VST"
+msgstr ""
 
-#: step_entry.cc:636
-msgid "Switch to the 8th octave"
-msgstr "切换到第八个八度"
+#: plugin_manager.cc:824
+msgid "--- Windows VST plugins Scan Done"
+msgstr "--- Windows VST 插件扫描完毕"
 
-#: step_entry.cc:637
-msgid "Switch to the 9th octave"
-msgstr "切换到第九个八度"
+#: plugin_manager.cc:839
+msgid "cannot open dll"
+msgstr "无法打开 dll"
 
-#: step_entry.cc:638
-msgid "Switch to the 10th octave"
-msgstr "切换到第十个八度"
+#: plugin_manager.cc:843
+msgid "invalid dll, file too small"
+msgstr "无效的 dll,文件太小"
 
-#: step_entry.cc:639
-msgid "Switch to the 11th octave"
-msgstr "切换到第十一个八度"
+#: plugin_manager.cc:847
+msgid "not a dll"
+msgstr "不是一个 dll"
 
-#: step_entry.cc:644
-msgid "Set Note Length to Whole"
-msgstr "设置为全音符"
+#: plugin_manager.cc:853
+msgid "cannot determine dll type"
+msgstr "无法确定的 dll 类型"
 
-#: step_entry.cc:646
-msgid "Set Note Length to 1/2"
-msgstr "设置为二分音符"
+#: plugin_manager.cc:857
+msgid "cannot read dll PE header"
+msgstr "无法读取 dll PE 文件头"
 
-#: step_entry.cc:648
-msgid "Set Note Length to 1/3"
-msgstr "设置为三分音符"
+#: plugin_manager.cc:862
+msgid "invalid dll PE header"
+msgstr "无效的 dll PE 文件头"
 
-#: step_entry.cc:650
-msgid "Set Note Length to 1/4"
-msgstr "设置为四分音符"
+#: plugin_manager.cc:869
+msgid "i386 (32-bit)"
+msgstr "i386(32位)"
 
-#: step_entry.cc:652
-msgid "Set Note Length to 1/8"
-msgstr "设置为八分音符"
+#: plugin_manager.cc:872
+msgid "Itanium"
+msgstr ""
 
-#: step_entry.cc:654
-msgid "Set Note Length to 1/16"
-msgstr "设置为十六分音符"
+#: plugin_manager.cc:875
+msgid "x64 (64-bit)"
+msgstr "x64(64位)"
 
-#: step_entry.cc:656
-msgid "Set Note Length to 1/32"
-msgstr "设置为三十二分音符"
+#: plugin_manager.cc:878
+msgid "Native Architecture"
+msgstr "本地架构"
 
-#: step_entry.cc:658
-msgid "Set Note Length to 1/64"
-msgstr "设置为六十四分音符"
+#: plugin_manager.cc:881
+msgid "Unknown Architecture"
+msgstr "未知架构"
 
-#: step_entry.cc:663
-msgid "Set Note Velocity to Pianississimo"
-msgstr "设置音符力度为最弱音"
+#: plugin_manager.cc:897
+msgid " *  %1 (cache only)"
+msgstr " *  %1(仅缓存)"
 
-#: step_entry.cc:665
-msgid "Set Note Velocity to Pianissimo"
-msgstr "设置音符力度为极弱音"
+#: plugin_manager.cc:899
+msgid " *  %1 - %2"
+msgstr ""
 
-#: step_entry.cc:667
-msgid "Set Note Velocity to Piano"
-msgstr "设置音符力度为弱音"
+#: plugin_manager.cc:913
+msgid " -> Cannot get Windows VST information, plugin ignored."
+msgstr " -> 无法获取 Windows VST 信息,插件已忽略。"
 
-#: step_entry.cc:669
-msgid "Set Note Velocity to Mezzo-Piano"
-msgstr "设置音符力度为中弱音"
+#: plugin_manager.cc:924
+msgid ""
+"VST plugin %1 does not support processReplacing, and cannot be used in %2 at "
+"this time"
+msgstr "VST 插件 %1 不支持 processReplacing,且此时无法在 %2 中使用"
 
-#: step_entry.cc:671
-msgid "Set Note Velocity to Mezzo-Forte"
-msgstr "设置音符力度为中强音"
+#: plugin_manager.cc:959
+msgid "Ignoring duplicate Windows VST plugin \"%1\""
+msgstr "正在忽略复制 Windows VST 插件 \"%1\""
 
-#: step_entry.cc:673
-msgid "Set Note Velocity to Forte"
-msgstr "设置音符力度为强音"
+#: plugin_manager.cc:971
+msgid " -> OK (VST Plugin \"%1\" was added)."
+msgstr " -> OK(VST 插件 \"%1\" 已添加)。"
 
-#: step_entry.cc:675 step_entry.cc:677
-msgid "Set Note Velocity to Fortississimo"
-msgstr "设置音符力度为最强音"
+#: plugin_manager.cc:1019
+msgid "LXVST"
+msgstr ""
 
-#: step_entry.cc:679
-msgid "Toggle Triple Notes"
-msgstr "切换三分音符"
+#: plugin_manager.cc:1046
+msgid ""
+"linuxVST plugin %1 does not support processReplacing, and so cannot be used "
+"in %2 at this time"
+msgstr "linuxVST 插件 %1 不支持 processReplacing,且此时无法在 %2 中使用"
 
-#: step_entry.cc:684
-msgid "No Dotted Notes"
-msgstr "无带点音符"
+#: plugin_manager.cc:1213
+msgid "unknown plugin status type \"%1\" - all entries ignored"
+msgstr "未知的插件状态类型 \"%1\" ——所有入口都已忽略"
 
-#: step_entry.cc:686
-msgid "Toggled Dotted Notes"
-msgstr "切换带点音符"
+#: plugin_manager.cc:1232
+msgid "unknown plugin type \"%1\" - ignored"
+msgstr "未知的插件类型 \"%1\" ——已忽略"
 
-#: step_entry.cc:688
-msgid "Toggled Double-Dotted Notes"
-msgstr "切换带双点音符"
+#: port.cc:504
+msgid "could not reregister %1"
+msgstr "无法重新注册 %1"
 
-#: step_entry.cc:690
-msgid "Toggled Triple-Dotted Notes"
-msgstr "切换带三点音符"
+#: port_insert.cc:43
+msgid "insert %1"
+msgstr "插入 %1"
 
-#: step_entry.cc:693
-msgid "Toggle Chord Entry"
-msgstr "切换和弦入口"
+#: port_insert.cc:204
+msgid "XML node describing port insert is missing the `type' field"
+msgstr "XML节点正在描述的端口插入缺失 “type” 字段"
 
-#: step_entry.cc:695
-msgid "Sustain Selected Notes by Note Length"
-msgstr "通过音符长度持续已选择的音符"
+#: port_insert.cc:209
+msgid "non-port insert XML used for port plugin insert"
+msgstr "non-port 插入 XML 已用于端口插件插入"
 
-#: stereo_panner.cc:133
-#, c-format
-msgid "L:%3d R:%3d Width:%d%%"
-msgstr "左:%3d 右:%3d 宽度:%d%%"
+#: port_manager.cc:288
+msgid ""
+"a port with the name \"%1\" already exists: check for duplicated track/bus "
+"names"
+msgstr "名称为 \"%1\" 的端口已存在:检查已复制的音轨/总线名称"
 
-#: stereo_panner_editor.cc:35
-msgid "Stereo Panner"
-msgstr "立体声面板"
+#: port_manager.cc:290
+msgid ""
+"No more ports are available. You will need to stop %1 and restart with more "
+"ports if you need this many tracks."
+msgstr ""
+"无更多的可用端口。如果您需要这么多音轨,您将必须停止 %1 ,然后带着更多的端口"
+"重启。"
 
-#: stereo_panner_editor.cc:49
-msgid "Width"
-msgstr "宽度"
+#: port_manager.cc:293
+msgid "AudioEngine: cannot register port \"%1\": %2"
+msgstr "音频引擎:无法注册端口 \"%1\": %2"
 
-#: strip_silence_dialog.cc:44
-msgid "Strip Silence"
-msgstr "片段无声"
+#: port_manager.cc:332
+msgid "unable to create port: %1"
+msgstr "不能创建端口:%1"
 
-#: strip_silence_dialog.cc:75
-msgid "Minimum length"
-msgstr "最小长度"
+#: port_manager.cc:453
+msgid "AudioEngine: cannot connect %1 (%2) to %3 (%4)"
+msgstr "音频引擎:无法连接 %1(%2)到 %3(%4)"
 
-#: strip_silence_dialog.cc:83
-msgid "Fade length"
-msgstr "淡化长度"
+#: port_manager.cc:505 port_manager.cc:506
+msgid "Re-establising port %1 failed"
+msgstr "重新确立端口 %1 失败"
 
-#: tempo_dialog.cc:41 tempo_dialog.cc:57
-msgid "bar:"
-msgstr "小节:"
+#: processor.cc:218
+msgid "No %1 property flag in element %2"
+msgstr "在元素 %2 中无 %1 属性标志"
 
-#: tempo_dialog.cc:42 tempo_dialog.cc:58
-msgid "beat:"
-msgstr "拍子:"
+#: processor.cc:227
+msgid "No child node with active property"
+msgstr "无带激活属性的子节点"
 
-#: tempo_dialog.cc:43 tempo_dialog.cc:59
-msgid "Pulse note"
-msgstr "脉冲音符"
+#: rc_configuration.cc:92
+msgid "Loading system configuration file %1"
+msgstr "正在载入系统配置文件 %1"
 
-#: tempo_dialog.cc:44 tempo_dialog.cc:60
-msgid "Tap tempo"
-msgstr "节拍节奏"
+#: rc_configuration.cc:96
+msgid "%1: cannot read system configuration file \"%2\""
+msgstr "%1: 无法读取系统配置文件 \"%2\""
 
-#: tempo_dialog.cc:54
-msgid "Edit Tempo"
-msgstr "编辑节奏"
+#: rc_configuration.cc:101
+msgid "%1: system configuration file \"%2\" not loaded successfully."
+msgstr "%1: 系统配置文件 \"%2\" 没有成功载入。"
 
-#: tempo_dialog.cc:77 tempo_dialog.cc:78 tempo_dialog.cc:324 tempo_dialog.cc:325
-msgid "whole"
-msgstr "å…¨"
+#: rc_configuration.cc:105
+msgid ""
+"Your system %1 configuration file is empty. This probably means that there "
+"was an error installing %1"
+msgstr "您的系统配置文件 %1 是空白的。这可能意味着安装 %1 时有一个错误。"
 
-#: tempo_dialog.cc:79 tempo_dialog.cc:80 tempo_dialog.cc:326 tempo_dialog.cc:327
-msgid "second"
-msgstr "二分之一"
+#: rc_configuration.cc:120
+msgid "Loading user configuration file %1"
+msgstr "正在载入用户配置文件 %1"
 
-#: tempo_dialog.cc:81 tempo_dialog.cc:82 tempo_dialog.cc:328 tempo_dialog.cc:329
-msgid "third"
-msgstr "三分之一"
+#: rc_configuration.cc:124
+msgid "%1: cannot read configuration file \"%2\""
+msgstr "%1: 无法读取配置文件 \"%2\""
 
-#: tempo_dialog.cc:83 tempo_dialog.cc:84 tempo_dialog.cc:330 tempo_dialog.cc:331
-msgid "quarter"
-msgstr "四分之一"
+#: rc_configuration.cc:129
+msgid "%1: user configuration file \"%2\" not loaded successfully."
+msgstr "%1: 用户配置文件 \"%2\" 没有成功载入。"
 
-#: tempo_dialog.cc:85 tempo_dialog.cc:86 tempo_dialog.cc:332 tempo_dialog.cc:333
-msgid "eighth"
-msgstr "八分之一"
+#: rc_configuration.cc:133
+msgid "your %1 configuration file is empty. This is not normal."
+msgstr "您的配置文件 %1 是空白的。这不正常。"
 
-#: tempo_dialog.cc:87 tempo_dialog.cc:88 tempo_dialog.cc:334 tempo_dialog.cc:335
-msgid "sixteenth"
-msgstr "十六分之一"
+#: rc_configuration.cc:150
+msgid "Config file %1 not saved"
+msgstr "配置文件 %1 未保存"
 
-#: tempo_dialog.cc:89 tempo_dialog.cc:90 tempo_dialog.cc:336 tempo_dialog.cc:337
-msgid "thirty-second"
-msgstr "三十二分之一"
+#: recent_sessions.cc:55
+msgid "cannot open recent session file %1 (%2)"
+msgstr "无法打开最近的会话文件 %1(%2)"
 
-#: tempo_dialog.cc:91 tempo_dialog.cc:92 tempo_dialog.cc:338 tempo_dialog.cc:339
-msgid "sixty-fourth"
-msgstr "六十四分之一"
+#: recent_sessions.cc:68 recent_sessions.cc:126
+msgid "Error reading recent session file %1 (%2)"
+msgstr "读取最近的会话文件 %1(%2)出错"
 
-#: tempo_dialog.cc:93 tempo_dialog.cc:94 tempo_dialog.cc:340 tempo_dialog.cc:341
-msgid "one-hundred-twenty-eighth"
-msgstr "一百二十八分之一"
+#: recent_sessions.cc:113
+msgid "Cannot open recent template file %1 (%2)"
+msgstr "无法打开最近的模板文件 %1(%2)"
 
-#: tempo_dialog.cc:121
-msgid "Beats per minute:"
-msgstr "每分钟拍子数:"
+#: recent_sessions.cc:176
+msgid "Error writing recent sessions file %1 (%2)"
+msgstr "写入最近的会话文件 %1(%2)出错"
 
-#: tempo_dialog.cc:155
-msgid "Tempo begins at"
-msgstr "节奏开始位于"
+#: recent_sessions.cc:211
+msgid "Error writing saved template file %1 (%2)"
+msgstr "写入已保存的模板文件 %1(%2)出错"
 
-#: tempo_dialog.cc:251
-msgid "incomprehensible pulse note type (%1)"
-msgstr "不可理解的脉冲音符类型(%1)"
+#: region_factory.cc:78 region_factory.cc:121 region_factory.cc:162
+#: region_factory.cc:204
+msgid ""
+"programming error: RegionFactory::create() called with unknown Region type"
+msgstr "程序错误:RegionFactory::create() 被未知的区域类型调用"
 
-#: tempo_dialog.cc:307
-msgid "Edit Meter"
-msgstr "编辑节拍"
+#: region_factory.cc:566
+msgid "%1 compound-%2 (%3)"
+msgstr "%1 合成-%2 (%3)"
 
-#: tempo_dialog.cc:356
-msgid "Note value:"
-msgstr "音符值:"
+#: region_factory.cc:568
+msgid "%1 compound-%2.1 (%3)"
+msgstr "%1 合成-%2.1 (%3)"
 
-#: tempo_dialog.cc:357
-msgid "Beats per bar:"
-msgstr "每小节拍子数:"
+#: region_factory.cc:630
+msgid "cannot create new name for region \"%1\""
+msgstr "无法为区域 \"%1\" 创建新的名称"
 
-#: tempo_dialog.cc:371
-msgid "Meter begins at bar:"
-msgstr "节拍开始位于小节:"
+#: resampled_source.cc:107
+msgid "Import: %1"
+msgstr "导入:%1"
 
-#: tempo_dialog.cc:484
-msgid "incomprehensible meter note type (%1)"
-msgstr "不可理解的节拍音符类型(%1)"
+#: resampled_source.cc:136 srcfilesource.cc:75
+msgid "Import: src_new() failed : %1"
+msgstr "导入:src_new() 失败:%1"
 
-#: theme_manager.cc:65
-msgid "Dark Theme"
-msgstr "深暗主题"
+#: return.cc:42
+msgid "return %1"
+msgstr "返回 %1"
 
-#: theme_manager.cc:66
-msgid "Light Theme"
-msgstr "明亮主题"
+#: route.cc:862 route.cc:2797
+msgid "unknown Processor type \"%1\"; ignored"
+msgstr "未知的处理器类型 \"%1\",已忽略"
 
-#: theme_manager.cc:67
-msgid "Restore Defaults"
-msgstr "重置恢复默认值"
+#: route.cc:884
+msgid "processor could not be created. Ignored."
+msgstr "无法创建处理器。已忽略。"
 
-#: theme_manager.cc:68
-msgid "Draw \"flat\" buttons"
-msgstr "描绘“降调”按钮"
+#: route.cc:2338 route.cc:2504
+msgid "Bad node sent to Route::set_state() [%1]"
+msgstr "坏的节点发送到 Route::set_state() [%1]"
 
-#: theme_manager.cc:69
-msgid "Blink Rec-Arm buttons"
-msgstr "闪光录制臂按钮"
+#: route.cc:2395
+msgid "Pannable state found for route (%1) without a panner!"
+msgstr "为路由(%1)找到的可用声相状态不带有一个声相器!"
 
-#: theme_manager.cc:70
-msgid "Color regions using their track's color"
-msgstr "使用区域的音轨颜色作为区域色"
+#: route.cc:3270
+msgid "Invalid Solo-Isolate propagation: from:%1 new:%2 - old:%3 = delta:%4"
+msgstr "无效的独奏隔离传播:从:%1 新:%2 - 旧:%3 = 增量:%4"
 
-#: theme_manager.cc:71
-msgid "Show waveform clipping"
-msgstr "显示波形截波"
+#: route.cc:4396
+msgid "Amp/Fader on Route '%1' went AWOL. Re-added."
+msgstr ""
 
-#: theme_manager.cc:73
-msgid "Waveforms color gradient depth"
-msgstr "波形颜色梯度深度"
+#: route.cc:4994
+msgid "lo"
+msgstr "低"
 
-#: theme_manager.cc:75
-msgid "Timeline item gradient depth"
-msgstr "时间线条目梯度深度"
+#: route.cc:4996
+msgid "mid"
+msgstr "中"
 
-#: theme_manager.cc:76
-msgid "All floating windows are dialogs"
-msgstr "所有浮动窗口都是对话框"
+#: route.cc:4998
+msgid "hi"
+msgstr "高"
 
-#: theme_manager.cc:77
-msgid "Transient windows follow front window."
-msgstr "临时窗口跟随前方窗口。"
+#: route.cc:5105
+msgid "Leveler"
+msgstr "校平器"
 
-#: theme_manager.cc:78
-msgid "Icon Set"
-msgstr "图标集"
+#: route.cc:5107
+msgid "Compressor"
+msgstr "压缩器"
 
-#: theme_manager.cc:87
-msgid "Object"
-msgstr "对象物体"
+#: route.cc:5109 route.cc:5111
+msgid "Limiter"
+msgstr "限制器"
 
-#: theme_manager.cc:163
-msgid "Items"
-msgstr "条目"
+#: route.cc:5111
+msgid "Sidechain"
+msgstr "侧链"
 
-#: theme_manager.cc:164
-msgid "Palette"
-msgstr "调色板"
+#: route.cc:5114 route.cc:5116 route.cc:5133 route.cc:5135
+msgid "???"
+msgstr ""
 
-#: theme_manager.cc:165
-msgid "Transparency"
-msgstr "透明度"
+#: route.cc:5126
+msgid "Attk"
+msgstr "上冲"
 
-#: theme_manager.cc:195
-msgid ""
-"Mark all floating windows to be type \"Dialog\" rather than using \"Utility\" for "
-"some.\n"
-"This may help with some window managers. This requires a restart of %1 to take "
-"effect"
-msgstr ""
-"标记所有窗口类型为“对话框”,而不是把某些窗口标记为“工具”。\n"
-"这也许对于某些窗口管理有所帮助。这需要重新启动 %1以生效。"
+#: route.cc:5128
+msgid "Ratio"
+msgstr "比率"
 
-#: theme_manager.cc:199
-msgid ""
-"Make transient windows follow the front window when toggling between the editor "
-"and mixer.\n"
-"This requires a restart of %1 to take effect"
-msgstr ""
-"在编辑器和混音器之间切换时,让临时窗口跟随前方窗口。\n"
-"这需要重新启动 %1以生效。"
+#: route.cc:5131
+msgid "Rels"
+msgstr "释放"
 
-#: theme_manager.cc:620
-msgid "Color Palette"
-msgstr "颜料调色板"
+#: route_group.cc:507
+msgid "You cannot subgroup MIDI tracks at this time"
+msgstr "您无法在此时创建 MIDI 音轨子群组"
 
-#: time_axis_view.cc:148
-msgid "Track/Bus name (double click to edit)"
-msgstr "音轨/总线名称(双击即可编辑)"
+#: route_group.cc:514
+msgid ""
+"You cannot subgroup tracks with different number of outputs at this time."
+msgstr "您无法在此时创建带不同输出端编号的音轨子群组。"
 
-#: time_axis_view_item.cc:345
-msgid "new duration %1 frame is out of bounds for %2"
-msgid_plural "new duration of %1 frames is out of bounds for %2"
-msgstr[0] "新的音长 %1 帧超出了 %2 的边界"
+#: rb_effect.cc:229 rb_effect.cc:269
+msgid "tempoize: error reading data from %1 at %2 (wanted %3, got %4)"
+msgstr "节奏尺寸:从 %1 位于 %2 处读取数据出错(需要 %3,得到 %4)"
 
-#: time_fx_dialog.cc:62
-msgid "Quick but Ugly"
-msgstr "快速(但不优美)"
+#: rb_effect.cc:298 rb_effect.cc:320
+msgid "error writing tempo-adjusted data to %1"
+msgstr "写入节奏已调整数据到 %1 时出错"
 
-#: time_fx_dialog.cc:63
-msgid "Skip Anti-aliasing"
-msgstr "跳过自动对齐"
+#: send.cc:62
+msgid "aux %1"
+msgstr "辅助 %1"
 
-#: time_fx_dialog.cc:64
-msgid "Contents:"
-msgstr "内容:"
+#: send.cc:66
+msgid "send %1"
+msgstr "发送端 %1"
 
-#: time_fx_dialog.cc:65
-msgid "Minimize time distortion"
-msgstr "减少时间扭曲"
+#: send.cc:68
+msgid "programming error: send created using role %1"
+msgstr "程序错误:使用角色 %1 已创建发送端"
 
-#: time_fx_dialog.cc:66
-msgid "Preserve Formants"
-msgstr "保持共振峰"
+#: session.cc:348 session.cc:403
+msgid "Cannot connect to audio/midi engine"
+msgstr "无法连接到音频/MIDI引擎"
 
-#: time_fx_dialog.cc:71
-msgid "TimeFXDialog"
-msgstr "时间特效对话框"
+#: session.cc:358
+msgid "Session initialization failed"
+msgstr "会话初始化失败"
 
-#: time_fx_dialog.cc:74
-msgid "Pitch Shift Audio"
-msgstr "音高替换音频"
+#: session.cc:374
+msgid "Failed to load template/snapshot state"
+msgstr "载入模板/快照状态失败"
 
-#: time_fx_dialog.cc:76
-msgid "Time Stretch Audio"
-msgstr "时间延伸音频"
+#: session.cc:385
+msgid "Failed to load state"
+msgstr "载入状态失败"
 
-#: time_fx_dialog.cc:104 transpose_dialog.cc:41
-msgid "Octaves:"
-msgstr "八度:"
+#: session.cc:409
+msgid "Cannot configure audio/midi engine with session parameters"
+msgstr "无法用会话参数配置音频/MIDI引擎"
 
-#: time_fx_dialog.cc:109 transpose_dialog.cc:46
-msgid "Semitones:"
-msgstr "半音:"
+#: session.cc:433
+msgid "Connect to engine"
+msgstr "连接到引擎"
 
-#: time_fx_dialog.cc:114
-msgid "Cents:"
-msgstr "音分:"
+#: session.cc:484
+msgid "Session loading complete"
+msgstr "会话加载完成"
 
-#: time_fx_dialog.cc:122
-msgid "Time|Shift"
-msgstr "时间|替换"
+#: session.cc:575
+msgid "Set up LTC"
+msgstr "建立 LTC(纵向时间码)"
 
-#: time_fx_dialog.cc:146 time_fx_dialog.cc:149
-msgid "TimeFXButton"
-msgstr "时间特效按钮"
+#: session.cc:577
+msgid "Set up Click"
+msgstr "建立音频识别声(节拍器)"
 
-#: time_fx_dialog.cc:154
-msgid "Stretch/Shrink"
-msgstr "延伸/收缩"
+#: session.cc:579
+msgid "Set up standard connections"
+msgstr "建立标准连接"
 
-#: time_fx_dialog.cc:164
-msgid "<b>Progress</b>"
-msgstr "<b>进程</b>"
+#: session.cc:888
+msgid "could not setup Click I/O"
+msgstr "无法设置音频识别声(节拍器)输入/输出"
 
-#: time_info_box.cc:124
-msgid "Start recording at auto-punch start"
-msgstr "在自动切换起点开始录制"
+#: session.cc:951
+#, c-format
+msgid "out %s"
+msgstr "输出 %s"
 
-#: time_info_box.cc:125
-msgid "Stop recording at auto-punch end"
-msgstr "在自动切换终点停止录制"
+#: session.cc:953
+#, c-format
+msgid "out %<PRIu32>"
+msgstr "输出 %<PRIu32>"
 
-#: time_selection.cc:40
-msgid "programming error: request for non-existent audio range (%1)!"
-msgstr "程序错误: 需要的音频范围(%1)不存在!"
+#: session.cc:968
+#, c-format
+msgid "out %<PRIu32>+%<PRIu32>"
+msgstr "输出 %<PRIu32>+%<PRIu32>"
 
-#: transform_dialog.cc:39
-msgid "this note's"
-msgstr "这个音符的"
+#: session.cc:985
+#, c-format
+msgid "in %s"
+msgstr "输入 %s"
 
-#: transform_dialog.cc:40
-msgid "the previous note's"
-msgstr "上一个音符的"
+#: session.cc:987
+#, c-format
+msgid "in %<PRIu32>"
+msgstr "输入 %<PRIu32>"
 
-#: transform_dialog.cc:41
-msgid "this note's index"
-msgstr "这个音符的索引"
+#: session.cc:1002
+#, c-format
+msgid "in %<PRIu32>+%<PRIu32>"
+msgstr "输入 %<PRIu32>+%<PRIu32>"
 
-#: transform_dialog.cc:42
-msgid "the number of notes"
-msgstr "音符的数目"
+#: session.cc:1082
+msgid "cannot connect master output %1 to %2"
+msgstr "无法连接主控输出 %1 到 %2"
 
-#: transform_dialog.cc:43
-msgid "exactly"
-msgstr "精确地"
+#: session.cc:1170
+msgid "Cannot create monitor section. 'Monitor' Port name is not unique."
+msgstr "无法创建监控部分。”监控“端口名称不是唯一的。"
 
-#: transform_dialog.cc:44
-msgid "a random number from"
-msgstr "一个随机数来自于"
+#: session.cc:1204 session.cc:1335
+msgid "cannot connect control input %1 to %2"
+msgstr "无法连接控制输入 %1 到 %2"
 
-#: transform_dialog.cc:55
-msgid "equal steps from"
-msgstr "相同步长来自于"
+#: session.cc:1224 session.cc:1354
+msgid "The preferred I/O for the monitor bus (%1) cannot be found"
+msgstr "找不到用于监控总线(%1)的优先输入/输出"
 
-#: transform_dialog.cc:58
-msgid "note number"
-msgstr "音符编号"
+#: session.cc:1255 session.cc:1385
+msgid "cannot connect control output %1 to %2"
+msgstr "无法连接控制输出 %1 到 %2"
 
-#: transform_dialog.cc:59
-msgid "velocity"
-msgstr "力度"
+#: session.cc:1443
+msgid "cannot create Auditioner: no auditioning of regions possible"
+msgstr "无法创建监听器:不可能监听区域"
 
-#: transform_dialog.cc:60
-msgid "start time"
-msgstr "起点时间"
+#: session.cc:1644
+msgid "Session: you can't use that location for auto punch (start <= end)"
+msgstr "会话:您不能为自动切换使用该位置(起点 <= 终点)"
 
-#: transform_dialog.cc:61
-msgid "length"
-msgstr "长度"
+#: session.cc:1671
+msgid "Session: you can't use that location for session start/end)"
+msgstr "会话:您不能为会话使用该位置(起点/终点)"
 
-#: transform_dialog.cc:82 transform_dialog.cc:113
-msgid "Transform"
-msgstr "变换"
+#: session.cc:1703
+msgid ""
+"You cannot use this location for auto-loop because it has zero or negative "
+"length"
+msgstr "您不能为自动循环使用该位置,因为它的长度是零或者负值"
 
-#: transform_dialog.cc:91
-msgid "Set "
-msgstr "集"
+#: session.cc:1886
+msgid "programming error: session range removed!"
+msgstr "程序错误:会话范围已移除!"
 
-#: transpose_dialog.cc:30
-msgid "Transpose MIDI"
-msgstr "变调 MIDI"
+#: session.cc:2158
+msgid "feedback loop setup between %1 and %2"
+msgstr "反馈环路设置在 %1 和 %2 之间"
 
-#: transpose_dialog.cc:55
-msgid "Transpose"
-msgstr "变调"
+#: session.cc:2419
+msgid "Track "
+msgstr "音轨"
 
-#: ui_config.cc:163 ui_config.cc:300
-msgid "Loading default ui configuration file %1"
-msgstr "载入默认用户界面配置文件 %1"
+#: session.cc:2421
+msgid "Audio "
+msgstr "音频"
 
-#: ui_config.cc:166 ui_config.cc:303
-msgid "cannot read default ui configuration file \"%1\""
-msgstr "无法读取默认用户界面配置文件 \"%1\""
+#: session.cc:2426
+msgid "MIDI "
+msgstr ""
 
-#: ui_config.cc:169 ui_config.cc:308
-msgid "default ui configuration file \"%1\" not loaded successfully."
-msgstr "默认用户界面配置文件 \"%1\" 载入不成功。"
+#: session.cc:2500
+msgid "Session: could not create new midi track."
+msgstr "会话:无法创建新的 MIDI 音轨。"
 
-#: ui_config.cc:177
-msgid "Could not find default UI configuration file %1"
-msgstr "无法找到默认用户界面配置文件\"%1\""
+#: session.cc:2506
+msgid ""
+"No more JACK ports are available. You will need to stop %1 and restart JACK "
+"with more ports if you need this many tracks."
+msgstr ""
+"无更多的 JACK 端口可用。如果您需要这么多音轨,您将必须停止 %1 ,然后带着更多"
+"的端口重启 JACK。"
 
-#: ui_config.cc:219
-msgid "Loading color file %1"
-msgstr "载入颜色文件 %1"
+#: session.cc:2547 session.cc:2550
+msgid "Midi Bus"
+msgstr "MIDI 总线"
 
-#: ui_config.cc:222
-msgid "cannot read color file \"%1\""
-msgstr "无法读取颜色文件 %1"
+#: session.cc:2572
+msgid "cannot configure new midi bus input"
+msgstr "无法配置新的 MIDI 总线输入"
 
-#: ui_config.cc:227
-msgid "color file \"%1\" not loaded successfully."
-msgstr "颜色文件 %1载入不成功"
+#: session.cc:2578
+msgid "cannot configure new midi bus output"
+msgstr "无法配置新的 MIDI 总线输出"
 
-#: ui_config.cc:233
-msgid "Color file %1 not found"
-msgstr "找不到颜色文件 %1"
+#: session.cc:2592 session.cc:3137
+msgid "Session: could not create new audio route."
+msgstr "会话:无法创建新的音频路由。"
 
-#: ui_config.cc:282 ui_config.cc:361
-msgid "Color file %1 not saved"
-msgstr "尚未保存颜色文件 %1"
+#: session.cc:3022 session.cc:3030 session.cc:3113 session.cc:3121
+msgid "cannot configure %1 in/%2 out configuration for new audio track"
+msgstr "无法为新的音频轨道配置 %1 入/ %2 出的配位"
 
-#: ui_config.cc:317
-msgid "Loading user ui configuration file %1"
-msgstr "载入用户界面配置文件 %1"
+#: session.cc:3050
+msgid "Session: could not create new audio track."
+msgstr "会话:无法创建新的音频轨道。"
 
-#: ui_config.cc:320
-msgid "cannot read ui configuration file \"%1\""
-msgstr "无法读取用户界面配置文件 \"%1\""
+#: session.cc:3088 session.cc:3091
+msgid "Bus"
+msgstr "总线"
 
-#: ui_config.cc:325
-msgid "user ui configuration file \"%1\" not loaded successfully."
-msgstr "用户的用户界面配置文件 \"%1\" 载入不成功。"
+#: session.cc:3207 session.cc:3217
+msgid "Session: UINT_MAX routes? impossible!"
+msgstr "会话:UINT_MAX 路由?不可能!"
 
-#: ui_config.cc:333
-msgid "could not find any ui configuration file, canvas will look broken."
-msgstr "找不到任何用户界面配置文件,版面看起来将不大美观。"
+#: session.cc:3293
+msgid "Session: cannot create track/bus from template description"
+msgstr "会话:无法从模板描述创建新的音轨/总线"
 
-#: ui_config.cc:351
-msgid "Config file %1 not saved"
-msgstr "尚未保存配置文件 %1"
+#: session.cc:3331
+msgid "Session: could not create new route from template"
+msgstr "会话:无法从模板创建新的音频路由"
 
-#: ui_config.cc:592
-msgid "Color %1 not found"
-msgstr "找不到颜色 %1"
+#: session.cc:3365
+msgid "Adding new tracks/busses failed"
+msgstr "添加新的音轨/总线失败"
 
-#: ui_config.cc:662
-msgid "Unable to find UI style file %1 in search path %2. %3 will look strange"
-msgstr "在搜索路径 %2 下找不到用户界面样式文件 %1。%3 看起来将不大美观。"
+#: session.cc:4784
+msgid "Merging embedded file %1: name collision AND md5 hash collision!"
+msgstr "合并嵌入的文件 %1:名称冲突并且 md5 哈希冲突!"
 
-#: utils.cc:117 utils.cc:160
-msgid "bad XPM header %1"
-msgstr "损坏的 XPM 报头 %1"
+#: session.cc:4914 session.cc:4987
+msgid "There are already %1 recordings for %2, which I consider too many."
+msgstr "在此 %1 已经为 %2 录制中,我考虑太多。"
 
-#: utils.cc:577
-msgid "cannot find XPM file for %1"
-msgstr "找不到 XPM 文件提供给 %1"
+#: session.cc:5663
+msgid "send ID %1 appears to be in use already"
+msgstr "发送端 ID 似乎已经在使用中"
 
-#: utils.cc:597 utils.cc:627 utils.cc:641
-msgid "default"
-msgstr "默认"
+#: session.cc:5675
+msgid "aux send ID %1 appears to be in use already"
+msgstr "辅助发送端 ID 似乎已经在使用中"
 
-#: utils.cc:642
-msgid "icon \"%1\" not found for icon set \"%2\", fallback to default"
-msgstr "找不到图标 \"%1\" 提供给图标集 \"%2\",退回默认状态"
+#: session.cc:5687
+msgid "return ID %1 appears to be in use already"
+msgstr "返回 ID 似乎已经在使用中"
 
-#: utils.cc:649
-msgid "cannot find icon image for %1 using %2"
-msgstr "找不到图标图像提供给 %1 使用 %2"
+#: session.cc:5699
+msgid "insert ID %1 appears to be in use already"
+msgstr "插入 ID 似乎已经在使用中"
 
-#: utils.cc:666 utils.cc:682
-msgid "Caught exception while loading icon named %1"
-msgstr "载入命名为 %1 的图标时遇到异常"
+#: session.cc:5825
+msgid "Cannot write a range where end <= start (e.g. %1 <= %2)"
+msgstr "无法写入一个位于终点 <= 起点的范围(例如 %1 <= %2)"
 
-#: add_video_dialog.cc:54
-msgid "Set Video Track"
-msgstr "设置视频轨道"
+#: session.cc:5834
+msgid "Cannot write a range with no data."
+msgstr "没有数据无法写入一个范围。"
 
-#: add_video_dialog.cc:62
-msgid "Open Video Monitor Window"
-msgstr "打开视频监控窗口"
+#: session.cc:5876
+msgid "cannot create new file \"%1\" for %2"
+msgstr "无法为 %2 创建新的文件 \"%1\""
 
-#: add_video_dialog.cc:63
-msgid "Adjust Session Framerate to Match Video Framerate"
-msgstr "调整会话帧率匹配视频帧率"
+#: session_click.cc:162
+msgid "cannot open click soundfile %1 (%2)"
+msgstr "无法打开音频识别声(节拍器)声音文件 %1(%2)"
 
-#: add_video_dialog.cc:65
-msgid "Reload docroot"
-msgstr "重新载入文档根"
+#: session_click.cc:175
+msgid "cannot read data from click soundfile"
+msgstr "无法从音频识别声(节拍器)声音文件读取数据"
 
-#: add_video_dialog.cc:120
-msgid "Video files"
-msgstr "视频文件"
+#: session_command.cc:87
+msgid "Tried to reconstitute a MementoCommand with no contents, failing. id=%1"
+msgstr "试图以无内容来重新组成一个 MementoCommand,失败。id=%1"
 
-#: add_video_dialog.cc:149
-msgid "<b>Video Information</b>"
-msgstr "<b>视频信息</b>"
+#: session_command.cc:148
+msgid ""
+"could not reconstitute MementoCommand from XMLNode. object type = %1 id = %2"
+msgstr ""
+"试图从 XML 节点来重新组成一个 MementoCommand 命令 。对象物体类型= %1 id=%2"
 
-#: add_video_dialog.cc:152
-msgid "Start:"
-msgstr "起点:"
+#: session_command.cc:177
+msgid ""
+"could not reconstitute StatefulDiffCommand from XMLNode. object type = %1 id "
+"= %2"
+msgstr ""
+"试图从 XML 节点来重新组成一个 StatefulDiffCommand 命令 。对象物体类型= %1 id="
+"%2"
 
-#: add_video_dialog.cc:158
-msgid "Frame rate:"
-msgstr "帧率:"
+#: session_configuration.cc:150
+msgid "%1: cannot part default session options \"%2\""
+msgstr "%1:无法分开默认会话选项 \"%2\""
 
-#: add_video_dialog.cc:161
-msgid "Aspect Ratio:"
-msgstr "长宽比:"
+#: session_configuration.cc:156
+msgid "Invalid session default XML Root."
+msgstr "无效的会话默认XML根。"
 
-#: add_video_dialog.cc:244
-msgid "VideoServerIndex"
-msgstr "视频服务索引"
+#: session_configuration.cc:164
+msgid "Loaded custom session defaults."
+msgstr "已载入自定义会话默认值。"
 
-#: add_video_dialog.cc:675
-msgid " %1 fps"
-msgstr ""
+#: session_configuration.cc:166
+msgid "Found no session defaults in XML file."
+msgstr "在 XML 文件中找不到会话默认值。"
 
-#: video_timeline.cc:468
-msgid ""
-"Parsing video file info failed. Is the Video Server running? Is the file readable "
-"by the Video Server? Does the docroot match? Is it a video file?"
-msgstr ""
-"解析视频文件信息失败。视频服务器是否正在运行吗?视频服务器是否可辨识该文件?文档根"
-"是否匹配?这是一个视频文件吗?"
+#: session_configuration.cc:192
+msgid "Could not save session options"
+msgstr "无法保存会话选项"
 
-#: video_timeline.cc:506
-msgid ""
-"Failed to set session-framerate: '%1' does not have a corresponding option setting "
-"in %2."
-msgstr "设置会话帧率失败:'%1' 的选项设置与在 %2 里的不一致。"
+#: session_directory.cc:65
+msgid "Cannot create Session directory at path %1 Error: %2"
+msgstr "无法创建会话目录在路径 %1 上,错误:%2"
 
-#: video_timeline.cc:514
-msgid ""
-"Video file's framerate is not equal to %1 session timecode's framerate: '%2' vs "
-"'%3'"
-msgstr "视频文件的帧率不等于 %1 会话时间码帧率: '%2' vs '%3'"
+#: session_directory.cc:82
+msgid "Session subdirectory does not exist at path %1"
+msgstr "会话子目录不存在于路径 %1"
 
-#: video_timeline.cc:587
+#: session_directory.cc:161
 msgid ""
-"Video-server docroot mismatch. %1: '%2', video-server: '%3'. This usually means "
-"that the video server was not started by %1 and uses a different document-root."
+"session-dir and session-name mismatch. Please use 'Menu > Session > Rename' "
+"in the future to rename sessions."
 msgstr ""
-"视频文件文档根不匹配。%1: '%2',视频服务器:'%3'。这通常意味着视频服务器未能通过 "
-"%1 启动,并且使用着一个不同的文档根。"
+"会话目录和会话名称不匹配。以后请使用“菜单 > 会话  > 重命名”来重命名会话。"
 
-#: video_timeline.cc:724
+#: session_directory.cc:167
 msgid ""
-"Video-monitor 'xjadeo' was not found. Please install http://xjadeo.sf.net/ (a "
-"custom path to xjadeo can be specified by setting the XJREMOTE environment "
-"variable. It should point to an application compatible with xjadeo's remote-"
-"control interface 'xjremote').\n"
-"\n"
-"see also http://manual.ardour.org/video-timeline/setup/"
+"The session's interchange dir is tainted.\n"
+"There is more than one folder in '%1'.\n"
+"Please remove extra subdirs to reduce possible filename ambiguties."
 msgstr ""
-"视频监控 'xjadeo' 未找到。请安装 http://xjadeo.sf.net/ (可以通过设置 XJREMOTE 环境"
-"变量来指定一个到 xjadeo 的定制路径。它应该指向一个兼容 xjadeo 遥控界面  'xjremote' "
-"的应用程序)。\n"
-"\n"
-"请参阅 http://manual.ardour.org/video-timeline/setup/"
+"会话的交换目录已被污染。\n"
+"在 '%1' 里有不止一个文件夹。\n"
+"请移除额外的子目录以减少文件名产生歧义的可能性。"
 
-#: video_timeline.cc:739
-msgid "Video-monitor 'xjadeo' cannot be launched."
-msgstr "视频监控 'xjadeo' 无法启动。"
+#: session_events.cc:229
+msgid "Session: cannot have two events of type %1 at the same frame (%2)."
+msgstr "会话:在相同的帧(%2)里不能有两个类型为 %1 的事件。"
 
-#: video_timeline.cc:766
-msgid ""
-"Video-monitor 'xjadeo' is too old. Please install xjadeo version 0.7.7 or later. "
-"http://xjadeo.sf.net/"
-msgstr ""
-"视频监控 'xjadeo' 太过老旧。请安装 xjadeo 0.7.7 或者更新的版本。 http://xjadeo.sf."
-"net/"
+#: session_export.cc:152
+msgid "%1: cannot seek to %2 for export"
+msgstr "%1:无法搜寻到 %2 用于导出"
 
-#: video_monitor.cc:285
-msgid "Video Monitor: File Not Found."
-msgstr "视频监控:找不到文件。"
+#: session_export.cc:216
+msgid "Export ended unexpectedly: %1"
+msgstr "导出意外结束:%1"
 
-#: transcode_ffmpeg.cc:56
+#: session_ltc.cc:221
 msgid ""
-"No ffprobe or ffmpeg executables could be found on this system.\n"
-"Video import and export is not possible until you install those tools.\n"
-"%1 requires ffmpeg and ffprobe from ffmpeg.org - version 1.1 or newer.\n"
-"\n"
-"The tools are included with the %1 releases from ardour.org and also available "
-"with the video-server at http://x42.github.com/harvid/\n"
-"\n"
-"Important: the files need to be installed in $PATH and named ffmpeg_harvid and "
-"ffprobe_harvid.\n"
-"If you already have a suitable ffmpeg installation on your system, we recommend "
-"creating symbolic links from ffmpeg to ffmpeg_harvid and from ffprobe to "
-"ffprobe_harvid.\n"
-"\n"
-"see also http://manual.ardour.org/video-timeline/setup/"
+"LTC encoder: invalid framerate - LTC encoding is disabled for the remainder "
+"of this session."
 msgstr ""
-"在这个系统上没找到 ffprobe 或者 ffmpeg 可执行文件。\n"
-"视频导入和导出无法进行,除非您安装这些工具。\n"
-"%1 需要 ffmpeg 和 ffprobe,来自 ffmpeg.org 1.1 或者更新的版本。\n"
-"\n"
-"这工具包括来自 ardour.org 的 %1,并且也可用于 http://x42.github.com/harvid/  上的视"
-"频服务。\n"
-"\n"
-"注意:这些文件需要安装在 $PATH 并且命名为 ffmpeg_harvid 和 ffprobe_harvid 。\n"
-"如果您在您的系统上已经安装有一个合适的 ffmpeg,我们建议给 ffmpeg 创建符号链接为 "
-"ffmpeg_harvid,给 ffprobe 创建符号链接为  ffprobe_harvid 。\n"
-"\n"
-"请参阅 http://manual.ardour.org/video-timeline/setup/"
+"LTC(纵向时间码)编码器:无效的帧率——LTC(纵向时间码)编码已被禁用于本会话余"
+"下的部分。"
 
-#: transcode_video_dialog.cc:56
-msgid "Transcode/Import Video File "
-msgstr "转码/导入视频文件"
+#: session_midi.cc:570
+msgid "Session: cannot send quarter-frame MTC message (%1)"
+msgstr "会话:无法发送四分之一帧MTC(MIDI 时间码)信息(%1)"
 
-#: transcode_video_dialog.cc:58
-msgid "Output File:"
-msgstr "导出文件:"
+#: session_playlists.cc:405 session_playlists.cc:424
+msgid "Session: cannot create Playlist from XML description."
+msgstr "会话:无法从 XML 描述创建播放列表。"
 
-#: transcode_video_dialog.cc:61 export_video_dialog.cc:85
-msgid "Abort"
-msgstr "中止"
+#: session_process.cc:159
+msgid "Session: error in no roll for %1"
+msgstr "会话:在为 %1 无滚动中出错"
 
-#: transcode_video_dialog.cc:63
-msgid "Height = "
-msgstr "高度 = "
+#: session_process.cc:1202
+msgid "Programming error: illegal event type in process_event (%1)"
+msgstr "程序错误:非法事件类型位于 process_event (%1)"
 
-#: transcode_video_dialog.cc:66
-msgid "Manual Override"
-msgstr "手动覆盖"
+#: session_state.cc:194
+msgid "solo cut control (dB)"
+msgstr "独奏剪切控制(dB)"
 
-#: transcode_video_dialog.cc:70 export_video_dialog.cc:103
-msgid "Debug Mode: Print ffmpeg command and output to stdout."
-msgstr "调试模式:打印 ffmpeg 命令并输出到标准输出。"
+#: session_state.cc:216
+msgid "Set block size and sample rate"
+msgstr "设置块大小和采样率"
 
-#: transcode_video_dialog.cc:107
-msgid "<b>File Information</b>"
-msgstr "<b>文件信息</b>"
+#: session_state.cc:221
+msgid "Using configuration"
+msgstr "正在使用配置"
 
-#: transcode_video_dialog.cc:113
-msgid ""
-"No ffprobe or ffmpeg executables could be found on this system. Video Import is "
-"not possible until you install those tools. See the Log window for more "
-"information."
-msgstr ""
-"在这个系统上没找到 ffprobe 或者 ffmpeg 可执行文件。视频导入无法进行,除非您安装这些"
-"工具。更多的信息请参阅日志窗口。"
+#: session_state.cc:348
+msgid "Reset Remote Controls"
+msgstr "重置遥控控制"
 
-#: transcode_video_dialog.cc:120
-msgid ""
-"File-info can not be read. Most likely '%1' is not a valid video-file or an "
-"unsupported video codec or format."
-msgstr ""
-"无法读取文件信息。极有可能 '‘% 1' 不是一个有效的视频文件,或者是一个不支持的视频编"
-"解码器或格式。"
+#: session_state.cc:377 session_state.cc:409
+msgid "Filling playback buffers"
+msgstr "正在填充回放缓冲"
 
-#: transcode_video_dialog.cc:134
-msgid "FPS:"
-msgstr ""
+#: session_state.cc:475
+msgid "Session: cannot create session peakfile folder \"%1\" (%2)"
+msgstr "会话:无法创建会话峰值文件的文件夹 \"%1\" (%2)"
 
-#: transcode_video_dialog.cc:136
-msgid "Duration:"
-msgstr "音长:"
+#: session_state.cc:482
+msgid "Session: cannot create session sounds dir \"%1\" (%2)"
+msgstr "会话:无法创建会话声音目录 \"%1\" (%2)"
 
-#: transcode_video_dialog.cc:138
-msgid "Codec:"
-msgstr "编码:"
+#: session_state.cc:489
+msgid "Session: cannot create session midi dir \"%1\" (%2)"
+msgstr "会话:无法创建会话 MIDI 目录 \"%1\" (%2)"
 
-#: transcode_video_dialog.cc:140
-msgid "Geometry:"
-msgstr "几何形状:"
+#: session_state.cc:496
+msgid "Session: cannot create session dead sounds folder \"%1\" (%2)"
+msgstr "会话:无法创建会话沉寂声音文件夹 \"%1\" (%2)"
 
-#: transcode_video_dialog.cc:155
-msgid "??"
-msgstr ""
+#: session_state.cc:503
+msgid "Session: cannot create session export folder \"%1\" (%2)"
+msgstr "会话:无法创建会话导出文件夹 \"%1\" (%2)"
 
-#: transcode_video_dialog.cc:176
-msgid "<b>Import Settings</b>"
-msgstr "<b>导入设置</b>"
+#: session_state.cc:510
+msgid "Session: cannot create session analysis folder \"%1\" (%2)"
+msgstr "会话:无法创建会话分析文件夹 \"%1\" (%2)"
 
-#: transcode_video_dialog.cc:181
-msgid "Reference From Current Location (Previously Transcoded Files Only)"
-msgstr "从当前位置引用(仅上一个已转码文件)"
+#: session_state.cc:517
+msgid "Session: cannot create session plugins folder \"%1\" (%2)"
+msgstr "会话:无法创建会话插件文件夹 \"%1\" (%2)"
 
-#: transcode_video_dialog.cc:183
-msgid "Import/Transcode Video to Session"
-msgstr "导入/转码视频到会话"
+#: session_state.cc:524
+msgid "Session: cannot create session externals folder \"%1\" (%2)"
+msgstr "会话:无法创建会话外部文件夹 \"%1\" (%2)"
 
-#: transcode_video_dialog.cc:191
-msgid "Do Not Import Video (Audio Import Only)"
-msgstr "不要导入视频(仅导入音频)"
+#: session_state.cc:538
+msgid "Session: cannot create session folder \"%1\" (%2)"
+msgstr "会话:无法创建会话文件夹 \"%1\" (%2)"
 
-#: transcode_video_dialog.cc:200
-msgid "Scale Video: Width = "
-msgstr "缩放视频:宽度 = "
+#: session_state.cc:569
+msgid "Error reading session template file %1 (%2)"
+msgstr "读取会话模板文件 %1 (%2) 时出错"
 
-#: transcode_video_dialog.cc:207
-msgid "Original Width"
-msgstr "原始宽度"
+#: session_state.cc:584
+msgid "Error writing session template file %1 (%2)"
+msgstr "写入会话模板文件 %1 (%2) 时出错"
 
-#: transcode_video_dialog.cc:222
-msgid "Bitrate (KBit/s):"
-msgstr "比特率(码率 KBit/s):"
+#: session_state.cc:601
+msgid "Could not open %1 for writing session template"
+msgstr "无法打开 %1 用于写入会话模板"
 
-#: transcode_video_dialog.cc:227
-msgid "Extract Audio:"
-msgstr "提取音频:"
+#: session_state.cc:608
+msgid "Could not open session template %1 for reading"
+msgstr "无法打开会话模板 %1 用于读取"
 
-#: transcode_video_dialog.cc:232
-msgid "No Audio Track Present"
-msgstr "无音频轨道呈现"
+#: session_state.cc:626
+msgid "Loop"
+msgstr "循环"
 
-#: transcode_video_dialog.cc:235
-msgid "Do Not Extract Audio"
-msgstr "无法提取音频"
+#: session_state.cc:707
+msgid "Could not remove pending capture state at path \"%1\" (%2)"
+msgstr "无法移除在路径 \"%1\" (%2) 上待定的捕获状态"
 
-#: transcode_video_dialog.cc:350
-msgid "Extracting Audio.."
-msgstr "音频提取中…"
+#: session_state.cc:731
+msgid "could not rename snapshot %1 to %2 (%3)"
+msgstr "无法重命名快照 %1 为 %2(%3)"
 
-#: transcode_video_dialog.cc:353
-msgid "Audio Extraction Failed."
-msgstr "音频提取失败。"
+#: session_state.cc:759
+msgid "Could not remove session file at path \"%1\" (%2)"
+msgstr "无法移除在路径 \"%1\" (%2) 上的会话文件"
 
-#: transcode_video_dialog.cc:379
-msgid "Transcoding Video.."
-msgstr "视频转码中…"
+#: session_state.cc:788
+msgid ""
+"the %1 audio engine is not connected and state saving would lose all I/O "
+"connections. Session not saved"
+msgstr "%1 音频引擎未连接,且该状态保存时将丢失所有的输入/输出连接。会话未保存"
 
-#: transcode_video_dialog.cc:413
-msgid "Transcoding Failed."
-msgstr "转码失败。"
+#: session_state.cc:856
+msgid "state could not be saved to %1"
+msgstr "状态无法保存到 %1"
 
-#: transcode_video_dialog.cc:503
-msgid "Save Transcoded Video File"
-msgstr "保存已转码视频文件"
+#: session_state.cc:858 session_state.cc:871
+msgid "Could not remove temporary session file at path \"%1\" (%2)"
+msgstr "无法移除在路径 \"%1\" (%2) 上的临时会话文件"
 
-#: video_server_dialog.cc:52
-msgid "Launch Video Server"
-msgstr "启动视频服务器"
+#: session_state.cc:868
+msgid "could not rename temporary session file %1 to %2 (%3)"
+msgstr "无法重命名在路径 \"%1\" (%2) 上的临时会话文件"
 
-#: video_server_dialog.cc:53
-msgid "Server Executable:"
-msgstr "服务器可执行:"
+#: session_state.cc:942
+msgid "%1: session file \"%2\" doesn't exist!"
+msgstr "%1:会话文件 \"%2\" 不存在!"
 
-#: video_server_dialog.cc:55
-msgid "Server Docroot:"
-msgstr "服务器文档根:"
+#: session_state.cc:954
+msgid "Could not understand session file %1"
+msgstr "无法理解的会话文件 %1"
 
-#: video_server_dialog.cc:61
-msgid "Don't show this dialog again. (Reset in Edit->Preferences)."
-msgstr "不再显示这个对话框。(可在 编辑 -> 首选项 里重置)。"
+#: session_state.cc:963
+msgid "Session file %1 is not a session"
+msgstr "会话文件 %1不是一个会话"
 
-#: video_server_dialog.cc:97
-msgid ""
-"The external video server 'harvid' can not be found.\n"
-"The tool is included with the %1 releases from ardour.org, alternatively you can "
-"download it from http://x42.github.com/harvid/ or acquire it from your "
-"distribution.\n"
-"\n"
-"see also http://manual.ardour.org/video-timeline/setup/"
-msgstr ""
-"找不到外部视频服务器 'harvid' 。\n"
-"这工具包括来自 ardour.org 的 %1,另外您可以从 http://x42.github.com/harvid/ 下载"
-"它,或者从您的发行版获得它。\n"
-"\n"
-"请参阅 http://manual.ardour.org/video-timeline/setup/"
+#: session_state.cc:1332
+msgid "programming error: Session: incorrect XML node sent to set_state()"
+msgstr "程序错误:会话:不正确的 XML 节点发送到 set_state()"
 
-#: video_server_dialog.cc:129
-msgid "Listen Address:"
-msgstr "试听地址:"
+#: session_state.cc:1410
+msgid "Session: XML state has no options section"
+msgstr "会话:XML 状态没有选项部分"
 
-#: video_server_dialog.cc:134
-msgid "Listen Port:"
-msgstr "试听端口:"
+#: session_state.cc:1415
+msgid "Session: XML state has no metadata section"
+msgstr "会话:XML 状态没有元数据部分"
 
-#: video_server_dialog.cc:139
-msgid "Cache Size:"
-msgstr "缓存大小:"
+#: session_state.cc:1426
+msgid "Session: XML state has no sources section"
+msgstr "会话:XML 状态没有来源部分"
 
-#: video_server_dialog.cc:145
-msgid ""
-"%1 relies on an external video server for the videotimeline.\n"
-"The server configured in Edit -> Preferences -> Video is not reachable.\n"
-"Do you want %1 to launch 'harvid' on this machine?"
-msgstr ""
-"%1 依赖于外部视频服务器以获取视频时间线。\n"
-"这个已配置在 编辑 -> 首选项 -> 视频 的服务器无法访问。\n"
-"您是否要 %1 在这台机器上启动 'harvid' ?"
+#: session_state.cc:1433
+msgid "Session: XML state has no Tempo Map section"
+msgstr "会话:XML 状态没有节奏映射部分"
 
-#: video_server_dialog.cc:189
-msgid "Set Video Server Executable"
-msgstr "设置视频服务器可执行"
+#: session_state.cc:1440
+msgid "Session: XML state has no locations section"
+msgstr "会话:XML 状态没有位置部分"
 
-#: video_server_dialog.cc:209
-msgid "Server docroot"
-msgstr "服务器文档根"
+#: session_state.cc:1453
+msgid "Session: XML state has no Regions section"
+msgstr "会话:XML 状态没有区域部分"
 
-#: utils_videotl.cc:60
-msgid "Destination is outside Video Server's docroot. "
-msgstr "目的地是视频服务器的文档根之外。"
+#: session_state.cc:1460
+msgid "Session: XML state has no playlists section"
+msgstr "会话:XML 状态没有播放列表部分"
 
-#: utils_videotl.cc:61
-msgid ""
-"The destination file path is outside of the Video Server's docroot. The file will "
-"not be readable by the Video Server. Do you still want to continue?"
-msgstr ""
-"目的地文件路径是处在视频服务器文档根之外。这个文件将无法被视频服务器读取。您是否要"
-"继续?"
+#: session_state.cc:1480
+msgid "Session: XML state has no bundles section"
+msgstr "会话:XML 状态没有包裹部分"
+
+#: session_state.cc:1492
+msgid "Session: XML state has no diskstreams section"
+msgstr "会话:XML 状态没有硬盘流部分"
 
-#: utils_videotl.cc:64
-msgid "Continue"
-msgstr "继续"
+#: session_state.cc:1504
+msgid "Session: XML state has no routes section"
+msgstr "会话:XML 状态没有路由部分"
 
-#: utils_videotl.cc:70
-msgid "Confirm Overwrite"
-msgstr "确认覆盖"
+#: session_state.cc:1520
+msgid "Session: XML state has no route groups section"
+msgstr "会话:XML 状态没有路由群组部分"
 
-#: utils_videotl.cc:71
-msgid "A file with the same name already exists.  Do you want to overwrite it?"
-msgstr "已有相同名称的文件存在。您是否要重写覆盖它?"
+#: session_state.cc:1529
+msgid "Session: XML state has no edit groups section"
+msgstr "会话:XML 状态没有编辑群组部分"
 
-#: utils_videotl.cc:81 utils_videotl.cc:97
-msgid "Cannot create video folder \"%1\" (%2)"
-msgstr "无法创建视频文件夹 \"%1\" (%2)"
+#: session_state.cc:1536
+msgid "Session: XML state has no mix groups section"
+msgstr "会话:XML 状态没有混音群组部分"
 
-#: export_video_dialog.cc:71
-msgid "Export Video File "
-msgstr "导出视频文件"
+#: session_state.cc:1544
+msgid "Session: XML state has no click section"
+msgstr "会话:XML 状态没有音频识别声(节拍器)部分"
 
-#: export_video_dialog.cc:82
-msgid "Video:"
-msgstr "视频:"
+#: session_state.cc:1606
+msgid "Session: cannot create Route from XML description."
+msgstr "会话:无法从 XML 描述创建路由。"
 
-#: export_video_dialog.cc:87
-msgid "Scale Video (W x H):"
-msgstr "缩放视频(宽 x 高):"
+#: session_state.cc:1610
+msgid "Loaded track/bus %1"
+msgstr "已载入音轨/总线 %1"
 
-#: export_video_dialog.cc:88
-msgid "Retain Aspect"
-msgstr "保持长宽比"
+#: session_state.cc:1615
+msgid "Tracks/busses loaded;  Adding to Session"
+msgstr "音轨/总线已载入;正在添加到会话"
 
-#: export_video_dialog.cc:93
-msgid "Set Aspect Ratio:"
-msgstr "设置长宽比:"
+#: session_state.cc:1619
+msgid "Finished adding tracks/busses"
+msgstr "添加音轨/总线已结束"
 
-#: export_video_dialog.cc:94
-msgid "Normalize Audio"
-msgstr "规范化音频"
+#: session_state.cc:1709
+msgid "Could not find diskstream for route"
+msgstr "无法找到用于路由的硬盘流"
 
-#: export_video_dialog.cc:95
-msgid "2 Pass Encoding"
-msgstr "二次编码"
+#: session_state.cc:1760
+msgid "Session: cannot create Region from XML description."
+msgstr "会话:无法从 XML 描述创建区域。"
 
-#: export_video_dialog.cc:96
-msgid "Codec Optimizations:"
-msgstr "解码器优化:"
+#: session_state.cc:1764
+msgid "Can not load state for region '%1'"
+msgstr "无法为区域 '%1' 载入状态"
 
-#: export_video_dialog.cc:98
-msgid "Deinterlace"
-msgstr "反交错"
+#: session_state.cc:1800
+msgid "Regions in compound description not found (ID's %1 and %2): ignored"
+msgstr "在合成描述中找不到区域(ID的 %1 和 %2):已忽略"
 
-#: export_video_dialog.cc:99
-msgid "Use [2] B-frames (MPEG 2 or 4 only)"
-msgstr "使用 [2] B-帧(仅 MPEG 2 或 4)"
+#: session_state.cc:1828
+msgid "Nested source has no ID info in session file! (ignored)"
+msgstr "在会话文件里嵌入的来源没有 ID 信息!(已忽略)"
 
-#: export_video_dialog.cc:100
-msgid "Override FPS (Default is to retain FPS from the input video file):"
-msgstr "覆盖 FPS(默认是覆盖到从输入视频文件保留的 FPS):"
+#: session_state.cc:1840
+msgid "Cannot reconstruct nested source for region %1"
+msgstr "无法为区域 %1 重建嵌入的来源"
 
-#: export_video_dialog.cc:101
-msgid "Include Session Metadata"
-msgstr "包括会话元数据"
+#: session_state.cc:1902
+msgid "Session: XMLNode describing a AudioRegion is incomplete (no source)"
+msgstr "会话:XML 节点描述的一个音频区域是不完整的(无来源)"
 
-#: export_video_dialog.cc:119
+#: session_state.cc:1910 session_state.cc:1931 session_state.cc:1951
 msgid ""
-"No ffprobe or ffmpeg executables could be found on this system. Video Export is "
-"not possible until you install those tools. See the Log window for more "
-"information."
-msgstr ""
-"在这个系统上没找到 ffprobe 或者 ffmpeg 可执行文件。视频导出无法进行,除非您安装这些"
-"工具。更多的信息请参阅日志窗口。"
+"Session: XMLNode describing a AudioRegion references an unknown source id =%1"
+msgstr "会话:XML 节点描述的一个音频区域引用一个未知来源 id =%1"
+
+#: session_state.cc:1916 session_state.cc:1937 session_state.cc:1957
+msgid ""
+"Session: XMLNode describing a AudioRegion references a non-audio source id ="
+"%1"
+msgstr "会话:XML 节点描述的一个音频区域引用一个非音频来源 id =%1"
 
-#: export_video_dialog.cc:130
-msgid "<b>Output:</b> (file extension defines format)"
-msgstr "<b>导出:</b>(以文件扩展名决定格式)"
+#: session_state.cc:1980
+msgid ""
+"Session: XMLNode describing an AudioRegion is missing some master sources; "
+"ignored"
+msgstr "会话:XML 节点描述的一个音频区域缺失一些主控来源;已忽略"
+
+#: session_state.cc:2014
+msgid "Session: XMLNode describing a MidiRegion is incomplete (no source)"
+msgstr "会话:XML 节点描述的一个 MIDI 区域是不完整的(无来源)"
 
-#: export_video_dialog.cc:140
-msgid "<b>Input Video:</b>"
-msgstr "<b>导入视频</b>"
+#: session_state.cc:2022
+msgid ""
+"Session: XMLNode describing a MidiRegion references an unknown source id =%1"
+msgstr "会话:XML 节点描述的一个 MIDI 区域引用一个未知来源 id =%1"
 
-#: export_video_dialog.cc:151
-msgid "Audio:"
-msgstr "音频:"
+#: session_state.cc:2028
+msgid ""
+"Session: XMLNode describing a MidiRegion references a non-midi source id =%1"
+msgstr "会话:XML 节点描述的一个音频区域引用一个非 MIDI 来源 id =%1"
 
-#: export_video_dialog.cc:153
-msgid "Master Bus"
-msgstr "主控总线"
+#: session_state.cc:2101
+msgid "Session: cannot create Source from XML description."
+msgstr "会话:无法从 XML 描述创建来源。"
 
-#: export_video_dialog.cc:158
-msgid "from the %1 session's start to the session's end"
-msgstr "从 %1 会话的起点到会话的终点"
+#: session_state.cc:2109
+msgid ""
+"A external MIDI file is missing. %1 cannot currently recover from missing "
+"external MIDI files"
+msgstr "缺失一个外部 MIDI 文件。%1 目前无法从缺失外部 MIDI 文件中恢复"
 
-#: export_video_dialog.cc:161
-msgid "<b>Settings:</b>"
-msgstr "<b>设置</b>"
+#: session_state.cc:2191
+msgid "Found a sound file that cannot be used by %1. Talk to the programmers."
+msgstr "发现一个无法被 %1 使用的声音文件。请转告程序员。"
 
-#: export_video_dialog.cc:169
-msgid "Range:"
-msgstr "范围:"
+#: session_state.cc:2212
+msgid "Could not create templates directory \"%1\" (%2)"
+msgstr "无法创建模板目录 \"%1\" (%2)"
 
-#: export_video_dialog.cc:172
-msgid "Preset:"
-msgstr "预设:"
+#: session_state.cc:2224
+msgid "Template \"%1\" already exists - new version not created"
+msgstr "模板 \"%1\" 已存在——新版本未创建"
 
-#: export_video_dialog.cc:175
-msgid "Video Codec:"
-msgstr "视频编码:"
+#: session_state.cc:2230
+msgid "Could not create directory for Session template\"%1\" (%2)"
+msgstr "无法为会话模板 \"%1\" (%2) 创建目录"
 
-#: export_video_dialog.cc:178
-msgid "Video KBit/s:"
-msgstr "视频 KBit/s:"
+#: session_state.cc:2259
+msgid "template not saved"
+msgstr "模板未保存"
 
-#: export_video_dialog.cc:181
-msgid "Audio Codec:"
-msgstr "音频编码:"
+#: session_state.cc:2501
+msgid "Unknown node \"%1\" found in Bundles list from session file"
+msgstr "从会话文件的包裹列表里发现未知的节点 \"%1\""
 
-#: export_video_dialog.cc:184
-msgid "Audio KBit/s:"
-msgstr "音频 KBit/s:"
+#: session_state.cc:2969
+msgid "Cannot cleanup peak-files for read-only session."
+msgstr "无法为只读会话清除峰值文件。"
 
-#: export_video_dialog.cc:187
-msgid "Audio Samplerate:"
-msgstr "音频采样率:"
+#: session_state.cc:2973
+msgid "Cannot cleanup peak-files while recording"
+msgstr "录制时无法清除峰值文件。"
 
-#: export_video_dialog.cc:222 export_video_dialog.cc:231 export_video_dialog.cc:830
-#: export_video_dialog.cc:833
-msgid "(default for format)"
-msgstr "(默认格式)"
+#: session_state.cc:2996
+msgid ""
+"Timeout waiting for peak-file creation to terminate before cleanup, please "
+"try again later."
+msgstr "为峰值文件的创建而超时的等待在清理前终止,请稍后再次尝试。"
 
-#: export_video_dialog.cc:242 export_video_dialog.cc:255 export_video_dialog.cc:837
-#: export_video_dialog.cc:846
-msgid "(default)"
-msgstr "(默认)"
+#: session_state.cc:3261
+msgid "Session: cannot create dead file folder \"%1\" (%2)"
+msgstr "会话:无法创建沉寂文件的文件夹 \"%1\" (%2)"
 
-#: export_video_dialog.cc:256 export_video_dialog.cc:840
-msgid "(retain)"
-msgstr "(保留)"
+#: session_state.cc:3296
+msgid "cannot rename unused file source from %1 to %2 (%3)"
+msgstr "无法重命名未使用的文件来源从 %1 到 %2 (%3)"
 
-#: export_video_dialog.cc:348
-msgid "from 00:00:00:00 to the video's end"
-msgstr "从 00:00:00:00 到视频终点"
+#: session_state.cc:3312
+msgid "cannot remove peakfile %1 for %2 (%3)"
+msgstr "无法移除峰值文件 %1 为 %2 (%3)"
 
-#: export_video_dialog.cc:350
-msgid "from the video's start to the video's end"
-msgstr "从视频起点到视频终点"
+#: session_state.cc:3633
+msgid "could not backup old history file, current history not saved"
+msgstr "无法备份旧的历史文件,目前历史未保存"
 
-#: export_video_dialog.cc:353
-msgid "Selected range"
-msgstr "已选择的范围"
+#: session_state.cc:3642
+msgid "history could not be saved to %1"
+msgstr "历史无法保存为 %1"
 
-#: export_video_dialog.cc:589
-msgid "Normalizing audio"
-msgstr "规范化音频"
+#: session_state.cc:3645
+msgid "Could not remove history file at path \"%1\" (%2)"
+msgstr "在路径 \"%1\" (%2) 上无法移除历史文件"
 
-#: export_video_dialog.cc:593
-msgid "Exporting audio"
-msgstr "音频导出中"
+#: session_state.cc:3649
+msgid "could not restore history file from backup %1 (%2)"
+msgstr "无法从备份 %1 (%2) 恢复历史文件"
 
-#: export_video_dialog.cc:648
-msgid "Exporting Audio..."
-msgstr "音频导出中…"
+#: session_state.cc:3674
+msgid "%1: no history file \"%2\" for this session."
+msgstr "%1:无历史文件 \"%2\" 用于本会话。"
 
-#: export_video_dialog.cc:705
-msgid ""
-"Export Video: Cannot query duration of video-file, using duration from timeline "
-"instead."
-msgstr "导出视频:无法查询视频文件长度,视频时间线长度代替。"
+#: session_state.cc:3680
+msgid "Could not understand session history file \"%1\""
+msgstr "无法理解会话历史文件 \"%1\""
 
-#: export_video_dialog.cc:735
-msgid "Export Video: export-range does not include video."
-msgstr "导出视频:导出范围无法包括视频。"
+#: session_state.cc:3722
+msgid "Failed to downcast MidiSource for NoteDiffCommand"
+msgstr "向下转换 MidiSource 为 NoteDiffCommand 失败"
 
-#: export_video_dialog.cc:748
-msgid "Export Video: No Master Out Ports to Connect for Audio Export"
-msgstr "导出视频:没有主控输出端口可连接给音频导出"
+#: session_state.cc:3733
+msgid "Failed to downcast MidiSource for SysExDiffCommand"
+msgstr "向下转换 MidiSource 为 SysExDiffCommand 失败"
 
-#: export_video_dialog.cc:790
-msgid "Encoding Video..."
-msgstr "视频编码中…"
+#: session_state.cc:3744
+msgid "Failed to downcast MidiSource for PatchChangeDiffCommand"
+msgstr "向下转换 MidiSource 为 PatchChangeDiffCommand 失败"
 
-#: export_video_dialog.cc:810
-msgid "Export Video: Video input file cannot be read."
-msgstr "导出视频:无法读取视频导入文件。"
+#: session_state.cc:3752
+msgid "Couldn't figure out how to make a Command out of a %1 XMLNode."
+msgstr "无法推算出如何用一个 %1 XML 节点来实现一个命令"
 
-#: export_video_dialog.cc:916
-msgid "Encoding Video.. Pass 1/2"
-msgstr "视频编码中…通过 1/2"
+#: session_state.cc:3990
+msgid "Session: unknown diskstream type in XML"
+msgstr "会话:在 XML 里未知的硬盘流类型"
 
-#: export_video_dialog.cc:928
-msgid "Encoding Video.. Pass 2/2"
-msgstr "视频编码中…通过 2/2"
+#: session_state.cc:3995
+msgid "Session: could not load diskstream via XML state"
+msgstr "会话:无法通过 XML 状态载入硬盘流"
 
-#: export_video_dialog.cc:1031
-msgid "Transcoding failed."
-msgstr "转码失败。"
+#: session_state.cc:4092
+msgid "Cannot rename read-only session."
+msgstr "无法重命名只读会话。"
 
-#: export_video_dialog.cc:1267 export_video_dialog.cc:1287
-msgid "Save Exported Video File"
-msgstr "保存已导出的视频文件"
+#: session_state.cc:4096
+msgid "Cannot rename session while recording"
+msgstr "录制时无法重命名会话"
 
-#: export_video_infobox.cc:33
-msgid "Video Export Info"
-msgstr "视频导出信息"
+#: session_state.cc:4181 session_state.cc:4182 session_state.cc:4224
+#: session_state.cc:4228
+msgid "renaming %s as %2 failed (%3)"
+msgstr "重命名 %s 为 %2 失败(%3)"
 
-#: export_video_infobox.cc:34
-msgid "Do Not Show This Dialog Again (Reset in Edit > Preferences > Video)."
-msgstr "不再显示这个对话框。(可在 编辑 > 首选项 > 视频 里重置)。"
+#: session_state.cc:4244 session_state.cc:4245 session_state.cc:4259
+#: session_state.cc:4260
+msgid "renaming %1 as %2 failed (%3)"
+msgstr "重命名 %1 为 %2 失败(%3)"
 
-#: export_video_infobox.cc:46
-msgid "<b>Video Export Info</b>"
-msgstr "<b>视频导出信息</b>"
+#: session_state.cc:4571
+msgid "Cannot create new session folder %1"
+msgstr "无法创建新的会话文件夹 %1"
 
-#: export_video_infobox.cc:51
+#: session_state.cc:4633 session_state.cc:4708
 msgid ""
-"Video encoding is a non-trivial task with many details.\n"
-"\n"
-"Please see the manual at %1/video-timeline/operations/#export.\n"
 "\n"
-"Open Manual in Browser? "
+"copying \"%1\" failed !"
 msgstr ""
-"视频编码是一项带有许多细节的不简单的任务。\n"
 "\n"
-"请参阅手册,位于 %1/video-timeline/operations/#export 。\n"
-"\n"
-"在浏览器里打开手册?"
+"复制 \"%1\" 失败!"
 
-#~ msgid "Track mode:"
-#~ msgstr "音轨模式:"
+#: session_state.cc:4906
+msgid "unknown reason"
+msgstr "不明原因"
 
-#~ msgid "Theme Manager"
-#~ msgstr "主题管理"
+#: session_time.cc:214
+msgid "Unknown transport state %1 in sync callback"
+msgstr "在同步回调中未知的播送状态 %1"
 
-#~ msgid "Errors"
-#~ msgstr "错误"
+#: session_transport.cc:177
+msgid "Cannot loop - no loop range defined"
+msgstr "无法循环——未定义循环范围"
 
-#~ msgid "Play Selected Range"
-#~ msgstr "播放已选择的范围"
+#: session_transport.cc:968
+msgid ""
+"Seamless looping cannot be supported while %1 is using JACK transport.\n"
+"Recommend changing the configured options"
+msgstr ""
+"当 %1 正在使用 JACK 播送时不支持无缝循环。\n"
+"建议修改已配置的选项"
 
-#~ msgid "Convert to Region In-Place"
-#~ msgstr "在此转换至区域"
+#: session_transport.cc:1050
+msgid "Locate called for negative sample position - ignored"
+msgstr "定位调用负值样本位置——已忽略"
 
-#~ msgid "Set Loop from Range"
-#~ msgstr "从范围设置循环"
+#: session_transport.cc:1401
+msgid ""
+"Global varispeed cannot be supported while %1 is connected to JACK transport "
+"control"
+msgstr "当 %1 已连接到 JACK 播送控制时不支持全局变速"
 
-#~ msgid "Set Punch from Range"
-#~ msgstr "从范围设置Punch"
+#: slavable.cc:100
+msgid "Master #%1 not found, assignment lost"
+msgstr ""
 
-#~ msgid "Draw/Edit MIDI Notes"
-#~ msgstr "绘画/编辑MIDI音符"
+#: smf_source.cc:350
+msgid "Unable to read event prefix, corrupt MIDI ring"
+msgstr "无法读取事件前缀,污染的 MIDI 回环"
 
-#~ msgid "Draw Region Gain"
-#~ msgstr "绘制区域增益"
+#: smf_source.cc:363
+msgid "Event has time and size but no body, corrupt MIDI ring"
+msgstr "事件拥有时间和大小但没有本体,污染的 MIDI 回环"
 
-#~ msgid "Select Zoom Range"
-#~ msgstr "选择变焦范围"
+#: smf_source.cc:369
+msgid "Event time is before MIDI source position"
+msgstr "事件时间位于 MIDI 来源位置之前"
 
-#~ msgid "Stretch/Shrink Regions and MIDI Notes"
-#~ msgstr "伸/缩区域和MIDI音符"
+#: smf_source.cc:417
+msgid ""
+"Skipping event with unordered beat time %1 < %2 (off by %3 beats, %4 ticks)"
+msgstr "跳过带有无序拍子时间的事件 %1 < %2 (脱离于 %3 拍子, %4 识别声)"
 
-#~ msgid "Listen to Specific Regions"
-#~ msgstr "听特定区域"
+#: smf_source.cc:461
+msgid "Skipping event with unordered frame time %1 < %2"
+msgstr "跳过带有无序帧时间的事件 %1 < %2"
 
-#~ msgid "Set Punch from Edit Range"
-#~ msgstr "在编辑范围设置Punch"
+#: smf_source.cc:526
+msgid "cannot open MIDI file %1 for write"
+msgstr "无法打开 MIDI 文件 %1 用于写入"
 
-#~ msgid "Edit MIDI"
-#~ msgstr "编辑MIDI"
+#: sndfile_helpers.cc:34
+msgid "WAV"
+msgstr ""
 
-#~ msgid "Show Measures"
-#~ msgstr "显示测量"
+#: sndfile_helpers.cc:35
+msgid "AIFF"
+msgstr ""
 
-#~ msgid " range"
-#~ msgstr "范围"
+#: sndfile_helpers.cc:36
+msgid "CAF"
+msgstr ""
 
-#~ msgid "set loop range from edit range"
-#~ msgstr "从编辑范围设置循环范围"
+#: sndfile_helpers.cc:37
+msgid "W64 (64-bit WAV)"
+msgstr "W64(64位 WAV)"
 
-#~ msgid "set punch range from edit range"
-#~ msgstr "从编辑范围设置punch区间"
+#: sndfile_helpers.cc:38
+msgid "FLAC"
+msgstr ""
 
-#~ msgid ""
-#~ "Do you really want to remove %1 %2?\n"
-#~ "\n"
-#~ "This action cannot be undon, and the session file will be overwritten"
-#~ msgstr ""
-#~ "你确定移除 %1 %2?\n"
-#~ "\n"
-#~ "此动作不可撤销, 而且此会话文件将会被重新写入!"
+#: sndfile_helpers.cc:39
+msgid "Ogg/Vorbis"
+msgstr ""
 
-#~ msgid "set selected regions"
-#~ msgstr "设置所选区域"
+#: sndfile_helpers.cc:40
+msgid "raw (no header)"
+msgstr "raw(无文件头)"
 
-#~ msgid "select all"
-#~ msgstr "选择所有"
+#: sndfile_helpers.cc:45
+msgid ".wav"
+msgstr ""
 
-#~ msgid "select all within"
-#~ msgstr "在内选择所有"
+#: sndfile_helpers.cc:46
+msgid ".aiff"
+msgstr ""
 
-#~ msgid "set selection from range"
-#~ msgstr "从范围设置选区"
+#: sndfile_helpers.cc:47
+msgid ".caf"
+msgstr ""
 
-#~ msgid "select all from range"
-#~ msgstr "从范围选择所有"
+#: sndfile_helpers.cc:48
+msgid ".w64"
+msgstr ""
 
-#~ msgid "select all from punch"
-#~ msgstr "从punch选择所有"
+#: sndfile_helpers.cc:49
+msgid ".flac"
+msgstr ""
 
-#~ msgid "select all from loop"
-#~ msgstr "从循环选择所有"
+#: sndfile_helpers.cc:50
+msgid ".ogg"
+msgstr ""
 
-#~ msgid "select all after cursor"
-#~ msgstr "在光标后选择所有"
+#: sndfile_helpers.cc:51
+msgid ".raw"
+msgstr ""
 
-#~ msgid "select all before cursor"
-#~ msgstr "在光标前选择所有"
+#: sndfile_helpers.cc:66
+msgid "Signed 16-bit PCM"
+msgstr "带符号 16 位 PCM(脉冲编码调制)"
 
-#~ msgid "select all after edit"
-#~ msgstr "编辑后选择所有"
+#: sndfile_helpers.cc:67
+msgid "Signed 24-bit PCM"
+msgstr "带符号 24 位 PCM(脉冲编码调制)"
 
-#~ msgid "select all before edit"
-#~ msgstr "编辑前选择所有"
+#: sndfile_helpers.cc:68
+msgid "Signed 32-bit PCM"
+msgstr "带符号 32 位 PCM(脉冲编码调制)"
 
-#~ msgid "Plugin preset %1 not found"
-#~ msgstr "未找到插件预设%1"
+#: sndfile_helpers.cc:69
+msgid "Signed 8-bit PCM"
+msgstr "带符号 8 位 PCM(脉冲编码调制)"
 
-#~ msgid "Set volume (velocity) to forteissimo"
-#~ msgstr "设置音量(力度)为极强音"
+#: sndfile_helpers.cc:70
+msgid "32-bit float"
+msgstr "32 位浮点"
 
-#~ msgid "Set volume (velocity) to forteississimo"
-#~ msgstr "设置音量(力度)为最强音"
+#: sndfile_helpers.cc:83
+msgid "Little-endian (Intel)"
+msgstr "低位优先(Intel 英特尔)"
 
-#~ msgid "badly formatted UI definition file: %1"
-#~ msgstr "错误的用户界面格式文件 %1"
+#: sndfile_helpers.cc:84
+msgid "Big-endian (PowerPC)"
+msgstr "大端存储(PowerPC 强力电脑)"
 
-#~ msgid ""
-#~ "There are insufficient JACK ports available\n"
-#~ "to create a new track or bus.\n"
-#~ "You should save %1, exit and\n"
-#~ "restart JACK with more ports."
-#~ msgstr ""
-#~ "JACK端口(port)不足\n"
-#~ "无法继续新建音轨或总线\n"
-#~ "请保存 %1,重新启动JACK带来更多的端口.\n"
+#: sndfilesource.cc:282
+msgid "SndFileSource: cannot open file \"%1\" for %2"
+msgstr "发送端文件来源:无法为 %2 打开文件 \"%1\""
 
-#~ msgid "Timecode Frames"
-#~ msgstr "时间码框架"
+#: sndfilesource.cc:300
+msgid "SndFileSource: cannot open file \"%1\" for %2 (%3)"
+msgstr "发送端文件来源:无法为 %2 (%3) 打开文件 \"%1\""
 
-#~ msgid "Timecode Seconds"
-#~ msgstr "时间码秒"
+#: sndfilesource.cc:308
+msgid ""
+"SndFileSource: file only contains %1 channels; %2 is invalid as a channel "
+"number"
+msgstr "发送端文件来源:文件仅包含 %1 声道;%2 是无效的声道数量"
 
-#~ msgid "Timecode Minutes"
-#~ msgstr "时间码分"
+#: sndfilesource.cc:323
+msgid "Cannot mark RF64 audio file for automatic downgrade to WAV: %1"
+msgstr "无法为自动化降级到 WAV 标记 RF64 音频文件:%1"
 
-#~ msgid "Slowest"
-#~ msgstr "最慢"
+#: sndfilesource.cc:375 sndfilesource.cc:705
+msgid ""
+"cannot set broadcast info for audio file %1 (%2); dropping broadcast info "
+"for this file"
+msgstr "无法为音频文件 %1 (%2) 设置广播信息;正在为该文件丢弃广播信息"
 
-#~ msgid "insert dragged region"
-#~ msgstr "插入拖拽区域"
+#: sndfilesource.cc:418
+msgid "could not open file %1 for reading."
+msgstr "无法打开 %1 文件用于读取。"
 
-#~ msgid " objects"
-#~ msgstr "对象"
+#: sndfilesource.cc:453
+msgid "SndFileSource: could not seek to frame %1 within %2 (%3)"
+msgstr "发送端文件来源:无法在 %2 (%3) 内搜寻到帧 %1"
 
-#~ msgid "No edit range defined"
-#~ msgstr "没有定义的编辑范围"
+#: sndfilesource.cc:462
+msgid ""
+"SndFileSource: @ %1 could not read %2 within %3 (%4) (len = %5, ret was %6)"
+msgstr ""
+"发送端文件来源:@ %1 无法在 %3 (%4) 内读取 %2(长度 = %5,剩余的是 %6)"
 
-#~ msgid ""
-#~ "the edit point is Selected Marker\n"
-#~ "but there is no selected marker."
-#~ msgstr ""
-#~ "这个编辑点是已选择的标记,\n"
-#~ "但是没有已选择的标记."
+#: sndfilesource.cc:504 sndfilesource.cc:533
+msgid "attempt to write a non-writable audio file source (%1)"
+msgstr "尝试写入一个非可写音频文件来源(%1)"
 
-#~ msgid "Position of mark on the ruler"
-#~ msgstr "标尺的标记位置"
+#: sndfilesource.cc:509 utils.cc:564 utils.cc:588 utils.cc:602 utils.cc:621
+msgid "programming error: %1 %2"
+msgstr "程序错误:%1 %2"
 
-#~ msgid "Max Size"
-#~ msgstr "最大化尺寸"
+#: sndfilesource.cc:636 sndfilesource.cc:654
+msgid "attempt to flush a non-writable audio file source (%1)"
+msgstr "尝试注入一个非可写音频文件来源(%1)"
 
-#~ msgid "Maximum size of the ruler"
-#~ msgstr "标尺的最大化尺寸"
+#: sndfilesource.cc:641
+msgid "could not allocate file %1 to write header"
+msgstr "无法分配文件 %1 到写入文件头"
 
-#~ msgid "Show Position"
-#~ msgstr "显示位置"
+#: sndfilesource.cc:659
+msgid "could not allocate file %1 to flush contents"
+msgstr "无法分配文件 %1 到注入内容"
 
-#~ msgid "Draw current ruler position"
-#~ msgstr "绘制当前标尺位置"
+#: sndfilesource.cc:671
+msgid ""
+"attempt to store broadcast info in a non-writable audio file source (%1)"
+msgstr "尝试在一个非可写音频文件来源内储存广播信息(%1)"
 
-#~ msgid "cannot open pango.rc file %1"
-#~ msgstr "无法打开pango.rc 文件 %1"
+#: sndfilesource.cc:676
+msgid "attempt to set BWF info for an un-opened audio file source (%1)"
+msgstr "尝试为一个非可写音频文件来源设置 BWF 信息(%1)"
 
-#~ msgid "Missing File!"
-#~ msgstr "找不到文件!"
+#: sndfilesource.cc:720
+msgid "%1: cannot seek to %2 (libsndfile error: %3)"
+msgstr "%1:无法搜寻 %2(libsndfile 错误:%3)"
 
-#~ msgid "auditioning"
-#~ msgstr "监听中"
+#: sndfilesource.cc:830
+msgid "SndFileSource: \"%1\" bad read retval: %2 of %5 (%3: %4)"
+msgstr "发送端文件来源:\"%1\" 错误读取返回值:%5 的 %2(%3: %4)"
 
-#~ msgid "mono"
-#~ msgstr "单声道"
+#: sndfilesource.cc:843 sndfilesource.cc:893 sndfilesource.cc:900
+msgid "SndFileSource: \"%1\" bad write (%2)"
+msgstr "发送端文件来源:\"%1\" 错误写入(%2)"
 
-#~ msgid "Link selection of regions and tracks"
-#~ msgstr "链接所选的区域和音轨"
+#: sndfilesource.cc:923
+msgid ""
+"Filesource: start time is already set for existing file (%1): Cannot change "
+"start time."
+msgstr "文件来源:起点时间已经设置于已存在的文件(%1):无法修改起点时间。"
 
-#~ msgid "ardour"
-#~ msgstr "ardour"
+#: sndfilesource.cc:982
+msgid "SndFileSource: cannot open file \"%1\" for reading"
+msgstr "发送端文件来源:无法打开文件 \"%1\" 用于读取"
 
-#~ msgid "x1"
-#~ msgstr "x1"
+#: solo_control.cc:199
+msgid "Cleared Explicit solo: %1\n"
+msgstr "已清除明确的单声道:%1\n"
 
-#~ msgid "x coordinate of upper left corner of rect"
-#~ msgstr "x与矩形的左上角相关"
+#: solo_control.cc:202
+msgid "Cleared Implicit solo: %1 up:%2 down:%3\n"
+msgstr "已清除隐晦的单声道:%1 上:%2 下:%3\n"
 
-#~ msgid "y1"
-#~ msgstr "y1"
+#: soundcloud_upload.cc:129
+msgid ""
+"Upload to Soundcloud failed.  Perhaps your email or password are incorrect?\n"
+msgstr "上传 Soundcloud 失败。可能您的电子邮件或者密码不正确?\n"
 
-#~ msgid "y coordinate of upper left corner of rect "
-#~ msgstr "y与矩形的右下角相关"
+#: source_factory.cc:390
+msgid "Recovery attempted on a MIDI file - not implemented"
+msgstr "在一个 MIDI 文件上恢复未遂——未实施"
 
-#~ msgid "x2"
-#~ msgstr "x1"
+#: speakers.cc:280
+msgid "Speaker information is missing azimuth - speaker ignored"
+msgstr "扬声器信息缺失方位角——扬声器已忽略"
 
-#~ msgid "x coordinate of lower right corner of rect"
-#~ msgstr "x与矩形的右下角相关"
+#: speakers.cc:286
+msgid "Speaker information is missing elevation - speaker ignored"
+msgstr "扬声器信息缺失仰角——扬声器已忽略"
 
-#~ msgid "y coordinate of lower right corner of rect "
-#~ msgstr "y与矩形的右下角相关"
+#: speakers.cc:292
+msgid "Speaker information is missing distance - speaker ignored"
+msgstr "扬声器信息缺失距离——扬声器已忽略"
 
-#~ msgid "color rgba"
-#~ msgstr "RGBA颜色"
+#: srcfilesource.cc:142
+msgid "SrcFileSource: %1"
+msgstr "同步遥控文件来源:%1"
 
-#~ msgid "color of line"
-#~ msgstr "线条颜色"
+#: tape_file_matcher.cc:46
+msgid "Cannot compile tape track regexp for use (%1)"
+msgstr "无法编译磁带音轨 regexp 来使用(%1)"
 
-#~ msgid "outline pixels"
-#~ msgstr "轮廓像素"
+#: tempo.cc:98
+msgid "Legacy session detected. TempoSection XML node will be altered."
+msgstr ""
 
-#~ msgid "width in pixels of outline"
-#~ msgstr "轮廓的像素宽度"
+#: tempo.cc:104
+msgid "TempoSection XML node has an illegal \"pulse\" value"
+msgstr ""
 
-#~ msgid "fill"
-#~ msgstr "å¡«å……"
+#: tempo.cc:112
+msgid "TempoSection XML node has an illegal \"frame\" value"
+msgstr ""
 
-#~ msgid "fill rectangle"
-#~ msgstr "填充矩形"
+#: tempo.cc:119
+msgid "TempoSection XML node has no \"beats-per-minute\" property"
+msgstr "节奏部分 XML 节点没有“每分钟拍子数”属性"
 
-#~ msgid "draw"
-#~ msgstr "绘制"
+#: tempo.cc:124
+msgid "TempoSection XML node has an illegal \"beats_per_minute\" value"
+msgstr "节奏部分 XML 节点有一个非法的“每分钟拍子数”数值"
 
-#~ msgid "draw rectangle"
-#~ msgstr "绘制矩形"
+#: tempo.cc:133
+msgid "TempoSection XML node has an illegal \"note-type\" value"
+msgstr "节奏部分 XML 节点有一个非法的“音符类型”数值"
 
-#~ msgid "outline color rgba"
-#~ msgstr "RGBA轮廓颜色"
+#: tempo.cc:139
+msgid "TempoSection XML node has no \"movable\" property"
+msgstr "节奏部分 XML 节点没有“可移动”属性"
 
-#~ msgid "color of outline"
-#~ msgstr "落括的颜色"
+#: tempo.cc:146
+msgid "TempoSection XML node has no \"active\" property"
+msgstr ""
 
-#~ msgid "fill color rgba"
-#~ msgstr "填充RGBA颜色"
+#: tempo.cc:471
+msgid "MeterSection XML node has an illegal \"start\" value"
+msgstr "节拍部分 XML 节点有一个非法的“起点”数值"
 
-#~ msgid "color of fill"
-#~ msgstr "填充的颜色"
+#: tempo.cc:474
+msgid "Legacy session detected - MeterSection XML node will be altered."
+msgstr ""
 
-#~ msgid "Auditioning of MIDI files is not yet supported"
-#~ msgstr "暂不支持监听MIDI文件"
+#: tempo.cc:481
+msgid "MeterSection XML node has an illegal \"pulse\" value"
+msgstr ""
 
-#~ msgid "Starting audio engine"
-#~ msgstr "启动音频引擎"
+#: tempo.cc:488
+msgid "MeterSection XML node has an illegal \"beat\" value"
+msgstr ""
 
-#~ msgid "disconnected"
-#~ msgstr "取消连接"
+#: tempo.cc:495
+msgid "MeterSection XML node has no \"bbt\" property"
+msgstr ""
 
-#~ msgid ""
-#~ "%1 is not connected to JACK\n"
-#~ "You cannot open or close sessions in this condition"
-#~ msgstr ""
-#~ "%1 未连接到 JACK.\n"
-#~ "再此情况下,你无法打开或关闭会话"
+#: tempo.cc:500
+msgid "MeterSection XML node has an illegal \"bbt\" value"
+msgstr ""
 
-#~ msgid ""
-#~ "The audio backend (JACK) was shutdown because:\n"
-#~ "\n"
-#~ "%1"
-#~ msgstr ""
-#~ "音频后台(JACK)关闭了,原因如下:\n"
-#~ "\n"
-#~ "%1"
+#: tempo.cc:509
+msgid "MeterSection XML node has an illegal \"frame\" value"
+msgstr ""
 
-#~ msgid ""
-#~ "JACK has either been shutdown or it\n"
-#~ "disconnected %1 because %1\n"
-#~ "was not fast enough. Try to restart\n"
-#~ "JACK, reconnect and save the session."
-#~ msgstr ""
-#~ "JACK 被关闭了,或与 %1 失去了连接\n"
-#~ "原因是 %1 不够快.\n"
-#~ "尝试重启JACK,重新连接并且保存会话."
+#: tempo.cc:519
+msgid ""
+"MeterSection XML node has no \"beats-per-bar\" or \"divisions-per-bar\" "
+"property"
+msgstr "节奏部分 XML 节点没有“每分钟拍子数”或者“每小节细分”属性"
 
-#~ msgid "Unable to start the session running"
-#~ msgstr "无法启动会话"
+#: tempo.cc:524
+msgid "MeterSection XML node has an illegal \"divisions-per-bar\" value"
+msgstr ""
 
-#~ msgid "Click the Refresh button to try again."
-#~ msgstr "单击刷新按钮,再尝试一遍"
+#: tempo.cc:529
+msgid "MeterSection XML node has no \"note-type\" property"
+msgstr "节拍部分 XML 节点没有“音符类型”属性"
 
-#~ msgid "Could not disconnect from JACK"
-#~ msgstr "无法断开JACK的连接"
+#: tempo.cc:533
+msgid "MeterSection XML node has an illegal \"note-type\" value"
+msgstr "节拍部分 XML 节点有一个非法的“音符类型”数值"
 
-#~ msgid "Could not reconnect to JACK"
-#~ msgstr "无法重新连接到JACK"
+#: tempo.cc:538
+msgid "MeterSection XML node has no \"movable\" property"
+msgstr "节拍部分 XML 节点没有“可移动”属性"
 
-#~ msgid "JACK"
-#~ msgstr "JACK"
+#: tempo.cc:545
+msgid "MeterSection XML node has no \"lock-style\" property"
+msgstr ""
 
-#~ msgid "Reconnect"
-#~ msgstr "重新链接"
+#: tempo.cc:821
+msgid ""
+"Meter changes can only be positioned on the first beat of a bar. Moving from "
+"%1 to %2"
+msgstr "节拍的修改只能放置在一个小节的第一拍子上。正在从 %1 移动到 %2"
 
-#~ msgid "JACK Sampling Rate and Latency"
-#~ msgstr "JACK采样率和延迟"
+#: tempo.cc:1156
+msgid "no tempo sections defined in tempo map - cannot change tempo @ %1"
+msgstr "在节奏映射中没有定义节奏部分——无法改变节奏 @ %1"
 
-#~ msgid "Realtime"
-#~ msgstr "实时"
+#: tempo.cc:1186
+msgid "programming error: no meter section in tempo map!"
+msgstr ""
 
-#~ msgid "Do not lock memory"
-#~ msgstr "不锁内存"
+#: tempo.cc:1204 tempo.cc:1227 tempo.cc:1248
+msgid "programming error: no tempo section in tempo map!"
+msgstr "程序错误:在节奏映射中无节奏部分!"
 
-#~ msgid "Unlock memory"
-#~ msgstr "解锁内存"
+#: tempo.cc:1959 tempo.cc:1987
+msgid "tempo map asked for BBT time at frame %1\n"
+msgstr "节奏映射要求在帧 %1 处的 BBT 时间\n"
 
-#~ msgid "8000Hz"
-#~ msgstr "8000 Hz"
+#: tempo.cc:2054
+msgid "tempo map asked for frame time at bar < 1  (%1)\n"
+msgstr "节奏映射要求在小节 < 1  (%1) 处的帧时间\n"
 
-#~ msgid "22050Hz"
-#~ msgstr "22050 Hz"
+#: tempo.cc:3472 tempo.cc:3485
+msgid "Tempo map: could not set new state, restoring old one."
+msgstr "节奏映射:无法设置新的状态,正在恢复为旧的那个。"
 
-#~ msgid "44100Hz"
-#~ msgstr "44100 Hz"
+#: tempo.cc:3522 tempo.cc:3523
+msgid "Multiple meter definitions found at %1"
+msgstr "在 %1 发现多个节拍定义"
 
-#~ msgid "48000Hz"
-#~ msgstr "48000 Hz"
+#: tempo.cc:3528 tempo.cc:3529
+msgid "Multiple tempo definitions found at %1"
+msgstr "在 %1 发现多个节奏定义"
 
-#~ msgid "88200Hz"
-#~ msgstr "88200 Hz"
+#: tempo.cc:3715
+msgid "programming error: unhandled MetricSection type"
+msgstr "程序错误:未处理的 MetricSection 类型"
 
-#~ msgid "96000Hz"
-#~ msgstr "96000 Hz"
+#: tempo_map_importer.cc:52
+msgid "Tempo map"
+msgstr "节奏映射"
 
-#~ msgid "192000Hz"
-#~ msgstr "192000 Hz"
+#: tempo_map_importer.cc:60
+msgid "Tempo Map"
+msgstr "节奏映射"
 
-#~ msgid "Triangular"
-#~ msgstr "三角形"
+#: tempo_map_importer.cc:80
+msgid "Tempo marks: "
+msgstr "节奏标记:"
 
-#~ msgid "Rectangular"
-#~ msgstr "矩形"
+#: tempo_map_importer.cc:80
+msgid ""
+"\n"
+"Meter marks: "
+msgstr ""
+"\n"
+"节拍标记:"
 
-#~ msgid "Shaped"
-#~ msgstr "形状"
+#: tempo_map_importer.cc:89
+msgid ""
+"This will replace the current tempo map!\n"
+"Are you sure you want to do this?"
+msgstr ""
+"这将取代当前的节奏映射!\n"
+"您是否确定您要这样做?"
 
-#~ msgid "Playback/recording on 1 device"
-#~ msgstr "在设备1 播放/录音"
+#: unknown_processor.cc:86
+msgid "Using plugin-stub with unknown i/o configuration for: "
+msgstr "正在使用带有未知输入/输出配置的插件存根用于:"
 
-#~ msgid "Playback/recording on 2 devices"
-#~ msgstr "在设备2 播放/录音"
+#: unknown_processor.cc:107
+msgid "Using plugin-stub with mismatching i/o configuration for: "
+msgstr ""
 
-#~ msgid "Playback only"
-#~ msgstr "仅播放"
+#: user_bundle.cc:47
+msgid "Node for Bundle has no \"name\" property"
+msgstr "用于包裹的节点没有“名称”属性"
 
-#~ msgid "Recording only"
-#~ msgstr "仅录音"
+#: user_bundle.cc:59 user_bundle.cc:80
+#, c-format
+msgid "Unknown node \"%s\" in Bundle"
+msgstr "在包裹中未知的节点 \"%s\""
 
-#~ msgid "Number of buffers:"
-#~ msgstr "缓冲区数量:"
+#: user_bundle.cc:64
+msgid "Node for Channel has no \"name\" property"
+msgstr "用于声道的节点没有“名称”属性"
 
-#~ msgid "Approximate latency:"
-#~ msgstr "大约延迟:"
+#: user_bundle.cc:70
+msgid "Node for Channel has no \"type\" property"
+msgstr "用于声道的节点没有“类型”属性"
 
-#~ msgid "Audio mode:"
-#~ msgstr "音频模式:"
+#: user_bundle.cc:85
+msgid "Node for Port has no \"name\" property"
+msgstr "用于端口的节点没有“名称”属性"
 
-#~ msgid "Ignore"
-#~ msgstr "忽略"
+#: utils.cc:412 utils.cc:441
+msgid "Splice"
+msgstr "拼接"
 
-#~ msgid "Client timeout"
-#~ msgstr "客户端超时"
+#: utils.cc:414 utils.cc:431
+msgid "Slide"
+msgstr "滑行"
 
-#~ msgid "Number of ports:"
-#~ msgstr "端口数量:"
+#: utils.cc:416 utils.cc:437
+msgid "Ripple"
+msgstr "波纹"
 
-#~ msgid "MIDI driver:"
-#~ msgstr "MIDI驱动:"
+#: utils.cc:418 utils.cc:434
+msgid "Lock"
+msgstr "锁定"
 
-#~ msgid ""
-#~ "No JACK server found anywhere on this system. Please install JACK and restart"
-#~ msgstr ""
-#~ "No JACK server found anywhere on this system. Please install JACK and restart"
+#: utils.cc:421
+msgid "programming error: unknown edit mode string \"%1\""
+msgstr "程序错误:未知的编辑模式字符串 \"%1\""
 
-#~ msgid "Server:"
-#~ msgstr "服务器:"
+#: utils.cc:448 utils.cc:484
+msgid "MIDI Timecode"
+msgstr "MIDI 时间码"
 
-#~ msgid "Input device:"
-#~ msgstr "输入设备:"
+#: utils.cc:448 utils.cc:482
+msgid "MTC"
+msgstr "MTC MIDI 时间码"
 
-#~ msgid "Output device:"
-#~ msgstr "输出设备:"
+#: utils.cc:452 utils.cc:491
+msgid "MIDI Clock"
+msgstr "MIDI 计时器"
 
-#~ msgid "Advanced"
-#~ msgstr "高级"
+#: utils.cc:456 utils.cc:478 utils.cc:498
+msgid "JACK"
+msgstr ""
 
-#~ msgid "cannot open JACK rc file %1 to store parameters"
-#~ msgstr "无法打开JACK的rc文件%1来储存参数"
+#: utils.cc:460 utils.cc:495
+msgid "LTC"
+msgstr "LTC 纵向时间码"
 
-#~ msgid "No suitable audio devices"
-#~ msgstr "没有合适的音频设备"
+#: utils.cc:464
+msgid "programming error: unknown sync source string \"%1\""
+msgstr "程序错误:未知的同步来源字符串 \"%1\""
 
-#~ msgid "JACK appears to be missing from the %1 bundle"
-#~ msgstr "JACK%1"
+#: utils.cc:489
+msgid "M-Clock"
+msgstr "M-计时器"
 
-#~ msgid "You need to choose an audio device first."
-#~ msgstr "你需要先选择一个音频设备"
+#: utils.cc:658
+msgid "programming error: unknown native header format: %1"
+msgstr "程序错误:未知的本地文件头字符串 \"%1\""
 
-#~ msgid "Audio device \"%1\" not known on this computer."
-#~ msgstr "电脑无法识别音频设备 %1"
+#: utils.cc:673
+msgid "cannot open directory %1 (%2)"
+msgstr "无法打开目录 %1 (%2)"
 
-#~ msgid "%1 could not connect to JACK."
-#~ msgstr "%1 无法连接到JACK"
+#: vca.cc:43
+#, c-format
+msgid "VCA %n"
+msgstr ""
 
-#~ msgid "JACK exited"
-#~ msgstr "JACK已经退出"
+#: vca_manager.cc:166
+msgid "Cannot set state of a VCA"
+msgstr ""
 
 #~ msgid ""
-#~ "JACK exited unexpectedly, and without notifying %1.\n"
+#~ "You have requested an operation that requires audio analysis.\n"
 #~ "\n"
-#~ "This could be due to misconfiguration or to an error inside JACK.\n"
+#~ "You currently have \"auto-analyse-audio\" disabled, which means that "
+#~ "transient data must be generated every time it is required.\n"
 #~ "\n"
-#~ "Click OK to exit %1."
-#~ msgstr ""
-#~ "JACK出乎意料地退出了, 没有任何报告 %1.\n"
+#~ "If you are doing work that will require transient data on a regular "
+#~ "basis, you should probably enable \"auto-analyse-audio\" then quit %1 and "
+#~ "restart.\n"
 #~ "\n"
-#~ "这可能是微配置或JACK里面的错误.\n"
+#~ "This dialog will not display again.  But you may notice a slight delay in "
+#~ "this and future transient-detection operations.\n"
+#~ msgstr ""
+#~ "您所要求的操作需要音频分析。\n"
 #~ "\n"
-#~ "单击OK退出 %1."
-
-#~ msgid ""
-#~ "JACK exited unexpectedly, and without notifying %1.\n"
+#~ "您当前禁用“自动分析音频”,这意味着每次需要要它时都必须生成瞬态数据。\n"
 #~ "\n"
-#~ "This is probably due to an error inside JACK. You should restart JACK\n"
-#~ "and reconnect %1 to it, or exit %1 now. You cannot save your\n"
-#~ "session at this time, because we would lose your connection information.\n"
-#~ msgstr ""
-#~ "JACK出乎意料地退出了, 没有任何报告 %1.\n"
+#~ "如果您正做着需要定期瞬态数据的工作,您应该启用“自动分析音频”然后退出 %1 并"
+#~ "重新启动。\n"
 #~ "\n"
-#~ "这可能是JACK里面的错误. 你最好重启JACK\n"
-#~ "然后连接到%1, 或者现在退出%1.\n"
-#~ "现在你没办法保存会话, 因为你的连接信息可能会丢失.\n"
+#~ "这个对话框将不会再次显示。但您可能会注意到在现在和将来的瞬态检测操作中有一"
+#~ "个轻微的延迟。\n"
 
-#~ msgid ""
-#~ "  -c, --name <name>           Use a specific jack client name, default is "
-#~ "ardour\n"
-#~ msgstr ""
-#~ "  -c, --name <name>           用一个特殊的JACK用户名称, 默认名称是: ardour\n"
+#~ msgid "normalize"
+#~ msgstr "规范化"
+
+#~ msgid "badly formed order key string in state file! [%1] ... ignored."
+#~ msgstr "在状态文件 [%1] 里错误形式的命令键字符串!…已忽略。"
 
-#~ msgid "follows order of editor"
-#~ msgstr "编辑器的如下顺序"
+#~ msgid "Converting deprecated order key for %1 using Editor order %2"
+#~ msgstr "正在为 %1 使用编辑器命令 %2 转换废弃的命令键"
 
-#~ msgid "Open an existing session"
-#~ msgstr "打开一个已存在的会话"
+#~ msgid "programming error: %1%2\n"
+#~ msgstr "程序错误:%1%2\n"
 
-#~ msgid "I'd like more options for this session"
-#~ msgstr "我想要关于这个会话的更多选项"
+#~ msgid "TempoSection XML node has no \"start\" property"
+#~ msgstr "节奏部分 XML 节点没有“起点”属性"
 
-#~ msgid "Audio / MIDI Setup"
-#~ msgstr "音频/MIDI设置"
+#~ msgid "TempoSection XML node has an illegal \"start\" value"
+#~ msgstr "节奏部分 XML 节点有一个非法的“起点”数值"
 
-#~ msgid "Use an existing session as a template:"
-#~ msgstr "使用一个存在的会话当作模板"
+#~ msgid "TempoSection XML node has an illegal \"bar-offset\" value"
+#~ msgstr "节奏部分 XML 节点有一个非法的“小节偏移”数值"
 
-#~ msgid "Select template"
-#~ msgstr "选择模板"
+#~ msgid "MeterSection XML node has no \"start\" property"
+#~ msgstr "节拍部分 XML 节点没有“起点”属性"
 
-#~ msgid "Browse:"
-#~ msgstr "浏览:"
+#~ msgid ""
+#~ "MeterSection XML node has an illegal \"beats-per-bar\" or \"divisions-per-"
+#~ "bar\" value"
+#~ msgstr "节拍部分 XML 节点有一个非法的“每分钟拍子数”或者“每小节细分”数值"
+
+#~ msgid "an error occured while writing a TOC/CUE file: %1"
+#~ msgstr "当写入 TOC/CUE(目录数据/光盘映像辅助)文件时出现一个错误:%1"
 
-#~ msgid "Select a session"
-#~ msgstr "选择一个会话"
+#~ msgid "Session: you can't use that location for session (start/end)"
+#~ msgstr "会话:您不能为会话使用该位置(起点/终点)"
 
-#~ msgid "Advanced Session Options"
-#~ msgstr "高级会话选项"
+#~ msgid ""
+#~ "The session's interchange dir is tainted.\n"
+#~ "There is more than one folder in '%1'.\n"
+#~ "Please remove extra subdirs to reduce possible filename ambiguities."
+#~ msgstr ""
+#~ "会话的交换目录已被污染。\n"
+#~ "在 '%1' 里有不止一个文件夹。\n"
+#~ "请移除额外的子目录以减少文件名产生歧义的可能性。"
diff --git a/libs/ardour/port.cc b/libs/ardour/port.cc
index 06169dd..33b41f5 100644
--- a/libs/ardour/port.cc
+++ b/libs/ardour/port.cc
@@ -30,7 +30,7 @@
 #include "ardour/port.h"
 #include "ardour/port_engine.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
@@ -38,6 +38,7 @@ using namespace PBD;
 
 PBD::Signal2<void,boost::shared_ptr<Port>, boost::shared_ptr<Port> > Port::PostDisconnect;
 PBD::Signal0<void> Port::PortDrop;
+PBD::Signal0<void> Port::PortSignalDrop;
 
 bool         Port::_connecting_blocked = false;
 pframes_t    Port::_global_port_buffer_offset = 0;
@@ -75,6 +76,9 @@ Port::Port (std::string const & n, DataType t, PortFlags f)
 	}
 
 	PortDrop.connect_same_thread (drop_connection, boost::bind (&Port::drop, this));
+	PortSignalDrop.connect_same_thread (drop_connection, boost::bind (&Port::signal_drop, this));
+	port_manager->PortConnectedOrDisconnected.connect_same_thread (engine_connection,
+			boost::bind (&Port::port_connected_or_disconnected, this, _1, _3, _5));
 }
 
 /** Port destructor */
@@ -103,6 +107,25 @@ Port::pretty_name(bool fallback_to_name) const
 	return "";
 }
 
+bool
+Port::set_pretty_name(const std::string& n)
+{
+	if (_port_handle) {
+		if (0 == port_engine.set_port_property (_port_handle,
+					"http://jackaudio.org/metadata/pretty-name", n, ""))
+		{
+			return true;
+		}
+	}
+	return false;
+}
+
+void
+Port::signal_drop ()
+{
+	engine_connection.disconnect ();
+}
+
 void
 Port::drop ()
 {
@@ -113,6 +136,26 @@ Port::drop ()
 	}
 }
 
+void
+Port::port_connected_or_disconnected (boost::weak_ptr<Port> w0, boost::weak_ptr<Port> w1, bool con)
+{
+	if (con) {
+		/* we're only interested in disconnect */
+		return;
+	}
+	boost::shared_ptr<Port> p0 = w0.lock ();
+	boost::shared_ptr<Port> p1 = w1.lock ();
+	/* a cheaper, less hacky way to do boost::shared_from_this() ...  */
+	boost::shared_ptr<Port> pself = AudioEngine::instance()->get_port_by_name (name());
+
+	if (p0 == pself) {
+		PostDisconnect (p0, p1); // emit signal
+	}
+	if (p1 == pself) {
+		PostDisconnect (p1, p0); // emit signal
+	}
+}
+
 /** @return true if this port is connected to anything */
 bool
 Port::connected () const
@@ -225,8 +268,7 @@ Port::disconnect (std::string const & other)
 		_connections.erase (other);
 	}
 
-	/* a cheaper, less hacky way to do boost::shared_from_this() ...
-	 */
+	/* a cheaper, less hacky way to do boost::shared_from_this() ...  */
 	boost::shared_ptr<Port> pself = AudioEngine::instance()->get_port_by_name (name());
 	boost::shared_ptr<Port> pother = AudioEngine::instance()->get_port_by_name (other);
 
@@ -465,6 +507,8 @@ Port::reestablish ()
 
 	reset ();
 
+	port_manager->PortConnectedOrDisconnected.connect_same_thread (engine_connection,
+			boost::bind (&Port::port_connected_or_disconnected, this, _1, _3, _5));
 	return 0;
 }
 
@@ -543,7 +587,7 @@ Port::get_state () const
 int
 Port::set_state (const XMLNode& node, int)
 {
-	const XMLProperty* prop;
+	XMLProperty const * prop;
 
 	if (node.name() != state_node_name) {
 		return -1;
diff --git a/libs/ardour/port_insert.cc b/libs/ardour/port_insert.cc
index ce34048..3b53454 100644
--- a/libs/ardour/port_insert.cc
+++ b/libs/ardour/port_insert.cc
@@ -30,7 +30,7 @@
 #include "ardour/session.h"
 #include "ardour/types.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
@@ -107,7 +107,7 @@ PortInsert::latency() const
 }
 
 void
-PortInsert::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, bool)
+PortInsert::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, double speed, pframes_t nframes, bool)
 {
 	if (_output->n_ports().n_total() == 0) {
 		return;
@@ -134,7 +134,7 @@ PortInsert::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame,
                    hear the remnants of whatever MTDM pumped into the pipeline.
                 */
 
-                silence (nframes);
+                silence (nframes, start_frame);
 
                 if (_latency_flush_frames > nframes) {
                         _latency_flush_frames -= nframes;
@@ -147,11 +147,11 @@ PortInsert::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame,
 
 	if (!_active && !_pending_active) {
 		/* deliver silence */
-		silence (nframes);
+		silence (nframes, start_frame);
 		goto out;
 	}
 
-	_out->run (bufs, start_frame, end_frame, nframes, true);
+	_out->run (bufs, start_frame, end_frame, speed, nframes, true);
 	_input->collect_input (bufs, nframes, ChanCount::ZERO);
 
   out:
@@ -186,7 +186,7 @@ PortInsert::set_state (const XMLNode& node, int version)
 	XMLNodeList nlist = node.children();
 	XMLNodeIterator niter;
 	XMLPropertyList plist;
-	const XMLProperty *prop;
+	XMLProperty const * prop;
 
 	const XMLNode* insert_node = &node;
 
diff --git a/libs/ardour/port_manager.cc b/libs/ardour/port_manager.cc
index 874d36d..10c19a9 100644
--- a/libs/ardour/port_manager.cc
+++ b/libs/ardour/port_manager.cc
@@ -28,8 +28,9 @@
 #include "ardour/midiport_manager.h"
 #include "ardour/port_manager.h"
 #include "ardour/profile.h"
+#include "ardour/session.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 using namespace PBD;
@@ -158,6 +159,7 @@ void
 PortManager::get_physical_outputs (DataType type, std::vector<std::string>& s)
 {
 	if (!_backend) {
+		s.clear ();
 		return;
 	}
 	_backend->get_physical_outputs (type, s);
@@ -167,6 +169,7 @@ void
 PortManager::get_physical_inputs (DataType type, std::vector<std::string>& s)
 {
 	if (!_backend) {
+		s.clear ();
 		return;
 	}
 
@@ -350,6 +353,12 @@ PortManager::register_output_port (DataType type, const string& portname, bool a
 int
 PortManager::unregister_port (boost::shared_ptr<Port> port)
 {
+	/* This is a little subtle. We do not call the backend's port
+	 * unregistration code from here. That is left for the Port
+	 * destructor. We are trying to drop references to the Port object
+	 * here, so that its destructor will run and it will unregister itself.
+	 */
+
 	/* caller must hold process lock */
 
 	{
@@ -385,6 +394,40 @@ PortManager::connected (const string& port_name)
 	return _backend->connected (handle);
 }
 
+bool
+PortManager::physically_connected (const string& port_name)
+{
+	if (!_backend) {
+		return false;
+	}
+
+	PortEngine::PortHandle handle = _backend->get_port_by_name (port_name);
+
+	if (!handle) {
+		return false;
+	}
+
+	return _backend->physically_connected (handle);
+}
+
+int
+PortManager::get_connections (const string& port_name, std::vector<std::string>& s)
+{
+	if (!_backend) {
+		s.clear ();
+		return 0;
+	}
+
+	PortEngine::PortHandle handle = _backend->get_port_by_name (port_name);
+
+	if (!handle) {
+		s.clear ();
+		return 0;
+	}
+
+	return _backend->get_connections (handle, s);
+}
+
 int
 PortManager::connect (const string& source, const string& destination)
 {
@@ -629,9 +672,18 @@ PortManager::cycle_end (pframes_t nframes)
 }
 
 void
-PortManager::silence (pframes_t nframes)
+PortManager::silence (pframes_t nframes, Session *s)
 {
 	for (Ports::iterator i = _cycle_ports->begin(); i != _cycle_ports->end(); ++i) {
+		if (s && i->second == s->mtc_output_port ()) {
+			continue;
+		}
+		if (s && i->second == s->midi_clock_output_port ()) {
+			continue;
+		}
+		if (s && i->second == s->ltc_output_port ()) {
+			continue;
+		}
 		if (i->second->sends_output()) {
 			i->second->get_buffer(nframes).silence(nframes);
 		}
diff --git a/libs/ardour/presentation_info.cc b/libs/ardour/presentation_info.cc
new file mode 100644
index 0000000..b335f54
--- /dev/null
+++ b/libs/ardour/presentation_info.cc
@@ -0,0 +1,236 @@
+/*
+    Copyright (C) 2016 Paul Davis
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#include <sstream>
+#include <typeinfo>
+
+#include <cassert>
+
+#include "pbd/convert.h"
+#include "pbd/debug.h"
+#include "pbd/enumwriter.h"
+#include "pbd/error.h"
+#include "pbd/failed_constructor.h"
+#include "pbd/xml++.h"
+
+#include "ardour/presentation_info.h"
+
+#include "pbd/i18n.h"
+
+using namespace ARDOUR;
+using namespace PBD;
+using std::string;
+
+string PresentationInfo::state_node_name = X_("PresentationInfo");
+PBD::Signal0<void> PresentationInfo::Change;
+
+namespace ARDOUR {
+	namespace Properties {
+		PBD::PropertyDescriptor<bool>     selected;
+		PBD::PropertyDescriptor<uint32_t> order;
+		PBD::PropertyDescriptor<uint32_t> color;
+	}
+}
+
+const PresentationInfo::order_t PresentationInfo::max_order = UINT32_MAX;
+const PresentationInfo::Flag PresentationInfo::Bus = PresentationInfo::Flag (PresentationInfo::AudioBus|PresentationInfo::MidiBus);
+const PresentationInfo::Flag PresentationInfo::Track = PresentationInfo::Flag (PresentationInfo::AudioTrack|PresentationInfo::MidiTrack);
+const PresentationInfo::Flag PresentationInfo::Route = PresentationInfo::Flag (PresentationInfo::Bus|PresentationInfo::Track);
+const PresentationInfo::Flag PresentationInfo::AllRoutes = PresentationInfo::Flag (PresentationInfo::Route|PresentationInfo::MasterOut|PresentationInfo::MonitorOut);
+const PresentationInfo::Flag PresentationInfo::AllStripables = PresentationInfo::Flag (PresentationInfo::AllRoutes|PresentationInfo::VCA);
+
+void
+PresentationInfo::make_property_quarks ()
+{
+        Properties::selected.property_id = g_quark_from_static_string (X_("selected"));
+        DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for selected = %1\n",	Properties::selected.property_id));
+        Properties::color.property_id = g_quark_from_static_string (X_("color"));
+        DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for color = %1\n",	Properties::color.property_id));
+        Properties::order.property_id = g_quark_from_static_string (X_("order"));
+        DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for order = %1\n",	Properties::order.property_id));
+}
+
+PresentationInfo::PresentationInfo (Flag f)
+	: _order (0)
+	, _flags (Flag (f & ~OrderSet))
+	, _color (0)
+{
+	/* OrderSet is not set */
+}
+
+PresentationInfo::PresentationInfo (order_t o, Flag f)
+	: _order (o)
+	, _flags (Flag (f | OrderSet))
+	, _color (0)
+{
+	/* OrderSet is set */
+}
+PresentationInfo::PresentationInfo (PresentationInfo const& other)
+	: _order (other.order())
+	, _flags (other.flags())
+	, _color (other.color())
+{
+}
+
+XMLNode&
+PresentationInfo::get_state ()
+{
+	XMLNode* node = new XMLNode (state_node_name);
+	node->add_property ("order", PBD::to_string (_order, std::dec));
+	node->add_property ("flags", enum_2_string (_flags));
+	node->add_property ("color", PBD::to_string (_color, std::dec));
+
+	return *node;
+}
+
+int
+PresentationInfo::set_state (XMLNode const& node, int /* version */)
+{
+	if (node.name() != state_node_name) {
+		return -1;
+	}
+
+	XMLProperty const* prop;
+	PropertyChange pc;
+
+	if ((prop = node.property (X_("order"))) != 0) {
+		order_t o = atoi (prop->value());
+		if (o != _order) {
+			pc.add (Properties::order);
+			_order = o;
+		}
+		_order = atoi (prop->value());
+	}
+
+	if ((prop = node.property (X_("flags"))) != 0) {
+		Flag f = Flag (string_2_enum (prop->value(), f));
+		if ((f&Hidden) != (_flags&Hidden)) {
+			pc.add (Properties::hidden);
+		}
+		_flags = f;
+	}
+
+	if ((prop = node.property (X_("color"))) != 0) {
+		color_t c = atoi (prop->value());
+		if (c != _color) {
+			pc.add (Properties::color);
+			_color = c;
+		}
+	}
+
+	send_change (PropertyChange (pc));
+
+	return 0;
+
+}
+
+PresentationInfo::Flag
+PresentationInfo::get_flags (XMLNode const& node)
+{
+	XMLNodeList nlist = node.children ();
+
+	for (XMLNodeConstIterator niter = nlist.begin(); niter != nlist.end(); ++niter){
+		XMLNode* child = *niter;
+
+		if (child->name() == PresentationInfo::state_node_name) {
+			XMLProperty const* prop = child->property (X_("flags"));
+			if (prop) {
+				Flag f = (Flag) string_2_enum (prop->value(), f);
+				return f;
+			}
+		}
+	}
+	return Flag (0);
+}
+
+void
+PresentationInfo::set_color (PresentationInfo::color_t c)
+{
+	if (c != _color) {
+		_color = c;
+		send_change (PropertyChange (Properties::color));
+	}
+}
+
+bool
+PresentationInfo::color_set () const
+{
+	/* all RGBA values zero? not set.
+	 *
+	 * this is heuristic, but it is fairly realistic. who will ever set
+	 * a color to completely transparent black? only the constructor ..
+	 */
+	return _color != 0;
+}
+
+void
+PresentationInfo::set_selected (bool yn)
+{
+	if (yn != selected()) {
+		if (yn) {
+			_flags = Flag (_flags | Selected);
+		} else {
+			_flags = Flag (_flags & ~Selected);
+		}
+		send_change (PropertyChange (Properties::selected));
+	}
+}
+
+void
+PresentationInfo::set_hidden (bool yn)
+{
+	if (yn != hidden()) {
+
+		if (yn) {
+			_flags = Flag (_flags | Hidden);
+		} else {
+			_flags = Flag (_flags & ~Hidden);
+		}
+
+		send_change (PropertyChange (Properties::hidden));
+	}
+}
+
+void
+PresentationInfo::set_order (order_t order)
+{
+	_flags = Flag (_flags|OrderSet);
+
+	if (order != _order) {
+		_order = order;
+		send_change (PropertyChange (Properties::order));
+	}
+}
+
+PresentationInfo&
+PresentationInfo::operator= (PresentationInfo const& other)
+{
+	if (this != &other) {
+		_order = other.order();
+		_flags = other.flags();
+		_color = other.color();
+	}
+
+	return *this;
+}
+
+std::ostream&
+operator<<(std::ostream& o, ARDOUR::PresentationInfo const& pi)
+{
+	return o << pi.order() << '/' << enum_2_string (pi.flags()) << '/' << pi.color();
+}
diff --git a/libs/ardour/process_thread.cc b/libs/ardour/process_thread.cc
index cf48c50..efcc47f 100644
--- a/libs/ardour/process_thread.cc
+++ b/libs/ardour/process_thread.cc
@@ -117,6 +117,25 @@ ProcessThread::get_scratch_buffers (ChanCount count, bool silence)
 }
 
 BufferSet&
+ProcessThread::get_noinplace_buffers (ChanCount count)
+{
+	ThreadBuffers* tb = _private_thread_buffers.get();
+	assert (tb);
+
+	BufferSet* sb = tb->noinplace_buffers;
+	assert (sb);
+
+	if (count != ChanCount::ZERO) {
+		assert(sb->available() >= count);
+		sb->set_count (count);
+	} else {
+		sb->set_count (sb->available());
+	}
+
+	return *sb;
+}
+
+BufferSet&
 ProcessThread::get_route_buffers (ChanCount count, bool silence)
 {
 	ThreadBuffers* tb = _private_thread_buffers.get();
diff --git a/libs/ardour/processor.cc b/libs/ardour/processor.cc
index 315fb66..60a2337 100644
--- a/libs/ardour/processor.cc
+++ b/libs/ardour/processor.cc
@@ -42,7 +42,7 @@
 #include "ardour/session.h"
 #include "ardour/types.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
@@ -64,6 +64,7 @@ Processor::Processor(Session& session, const string& name)
 	, _pre_fader (false)
 	, _ui_pointer (0)
 	, _window_proxy (0)
+	, _pinmgr_proxy (0)
 	, _owner (0)
 {
 }
@@ -81,6 +82,7 @@ Processor::Processor (const Processor& other)
 	, _pre_fader (false)
 	, _ui_pointer (0)
 	, _window_proxy (0)
+	, _pinmgr_proxy (0)
 	, _owner (0)
 {
 }
@@ -124,6 +126,8 @@ Processor::state (bool full_state)
 		XMLNode& automation = Automatable::get_automation_xml_state();
 		if (!automation.children().empty() || !automation.properties().empty()) {
 			node->add_child_nocopy (automation);
+		} else {
+			delete &automation;
 		}
 	}
 
@@ -176,8 +180,8 @@ Processor::set_state (const XMLNode& node, int version)
 		return set_state_2X (node, version);
 	}
 
-	const XMLProperty *prop;
-	const XMLProperty *legacy_active = 0;
+	XMLProperty const * prop;
+	XMLProperty const * legacy_active = 0;
 	bool leave_name_alone = (node.property ("ignore-name") != 0);
 
 	if (!leave_name_alone) {
@@ -201,7 +205,7 @@ Processor::set_state (const XMLNode& node, int version)
 
 		if ((*niter)->name() == X_("Automation")) {
 
-			XMLProperty *prop;
+			XMLProperty const * prop;
 
 			if ((prop = (*niter)->property ("path")) != 0) {
 				old_set_automation_state (*(*niter));
@@ -278,12 +282,6 @@ Processor::set_ui (void* p)
 }
 
 void
-Processor::set_window_proxy (ProcessorWindowProxy* wp)
-{
-	_window_proxy = wp;
-}
-
-void
 Processor::set_owner (SessionObject* o)
 {
 	_owner = o;
diff --git a/libs/ardour/quantize.cc b/libs/ardour/quantize.cc
index f484a16..b60b63d 100644
--- a/libs/ardour/quantize.cc
+++ b/libs/ardour/quantize.cc
@@ -23,7 +23,7 @@
 #include "ardour/quantize.h"
 #include "ardour/midi_model.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace PBD;
diff --git a/libs/ardour/rb_effect.cc b/libs/ardour/rb_effect.cc
index 03ce918..bc127e2 100644
--- a/libs/ardour/rb_effect.cc
+++ b/libs/ardour/rb_effect.cc
@@ -32,7 +32,7 @@
 #include "ardour/stretch.h"
 #include "ardour/types.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
@@ -352,9 +352,9 @@ RBEffect::run (boost::shared_ptr<Region> r, Progress* progress)
 					  shift);
 		(*x)->set_master_sources (region->master_sources());
 		/* multiply the old (possibly previously stretched) region length by the extra
-		   stretch this time around to get its new length
+		   stretch this time around to get its new length. this is a non-music based edit atm.
 		*/
-		(*x)->set_length ((*x)->length() * tsr.time_fraction);
+		(*x)->set_length ((*x)->length() * tsr.time_fraction, 0);
 	}
 
 	/* stretch region gain envelope */
diff --git a/libs/ardour/rc_configuration.cc b/libs/ardour/rc_configuration.cc
index 2abf347..7fc2f51 100644
--- a/libs/ardour/rc_configuration.cc
+++ b/libs/ardour/rc_configuration.cc
@@ -36,7 +36,7 @@
 #include "ardour/rc_configuration.h"
 #include "ardour/session_metadata.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 using namespace std;
@@ -89,7 +89,7 @@ RCConfiguration::load_state ()
 		}
 
 		if (statbuf.st_size != 0) {
-			info << string_compose (_("Loading system configuration file %1"), rcfile) << endl;
+			info << string_compose (_("Loading system configuration file %1"), rcfile) << endmsg;
 
 			XMLTree tree;
 			if (!tree.read (rcfile.c_str())) {
@@ -117,7 +117,7 @@ RCConfiguration::load_state ()
 		}
 
 		if (statbuf.st_size != 0) {
-			info << string_compose (_("Loading user configuration file %1"), rcfile) << endl;
+			info << string_compose (_("Loading user configuration file %1"), rcfile) << endmsg;
 
 			XMLTree tree;
 			if (!tree.read (rcfile)) {
@@ -172,7 +172,7 @@ XMLNode&
 RCConfiguration::get_state ()
 {
 	XMLNode* root;
-	LocaleGuard lg (X_("C"));
+	LocaleGuard lg;
 
 	root = new XMLNode("Ardour");
 
@@ -193,7 +193,7 @@ XMLNode&
 RCConfiguration::get_variables ()
 {
 	XMLNode* node;
-	LocaleGuard lg (X_("C"));
+	LocaleGuard lg;
 
 	node = new XMLNode ("Config");
 
@@ -220,6 +220,7 @@ RCConfiguration::set_state (const XMLNode& root, int version)
 	XMLNodeList nlist = root.children();
 	XMLNodeConstIterator niter;
 	XMLNode *node;
+	LocaleGuard lg;
 
 	Stateful::save_extra_xml (root);
 
diff --git a/libs/ardour/recent_sessions.cc b/libs/ardour/recent_sessions.cc
index 39d517c..fd0b9b1 100644
--- a/libs/ardour/recent_sessions.cc
+++ b/libs/ardour/recent_sessions.cc
@@ -31,7 +31,7 @@
 #include "ardour/filesystem_paths.h"
 #include "ardour/recent_sessions.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
diff --git a/libs/ardour/record_enable_control.cc b/libs/ardour/record_enable_control.cc
new file mode 100644
index 0000000..f3512c3
--- /dev/null
+++ b/libs/ardour/record_enable_control.cc
@@ -0,0 +1,75 @@
+/*
+    Copyright (C) 2016 Paul Davis
+
+    This program is free software; you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by the Free
+    Software Foundation; either version 2 of the License, or (at your option)
+    any later version.
+
+    This program is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc.,
+    675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#include "ardour/audioengine.h"
+#include "ardour/record_enable_control.h"
+
+#include "pbd/i18n.h"
+
+using namespace ARDOUR;
+using namespace PBD;
+
+RecordEnableControl::RecordEnableControl (Session& session, std::string const & name, Recordable& r)
+	: SlavableAutomationControl (session, RecEnableAutomation, ParameterDescriptor (RecEnableAutomation),
+	                             boost::shared_ptr<AutomationList>(new AutomationList(Evoral::Parameter(RecEnableAutomation))),
+	                             name)
+	, _recordable (r)
+{
+	_list->set_interpolation(Evoral::ControlList::Discrete);
+
+	/* record-enable changes must be synchronized by the process cycle */
+	set_flags (Controllable::Flag (flags() | Controllable::RealTime));
+}
+
+void
+RecordEnableControl::set_value (double val, Controllable::GroupControlDisposition gcd)
+{
+	/* Because we are marked as a RealTime control, this will queue
+	   up the control change to be executed in a realtime context.
+	*/
+	SlavableAutomationControl::set_value (val, gcd);
+}
+
+void
+RecordEnableControl::actually_set_value (double val, Controllable::GroupControlDisposition gcd)
+{
+	if (val && !_recordable.can_be_record_enabled()) {
+		std::cerr << "rec-enable not allowed\n";
+		return;
+	}
+
+	SlavableAutomationControl::actually_set_value (val, gcd);
+}
+
+void
+RecordEnableControl::do_pre_realtime_queue_stuff (double newval)
+{
+	/* do the non-RT part of rec-enabling first - the RT part will be done
+	 * on the next process cycle. This does mean that theoretically we are
+	 * doing things provisionally on the assumption that the rec-enable
+	 * change will work, but this had better be a solid assumption for
+	 * other reasons.
+	 *
+	 * this is guaranteed to be called from a non-process thread.
+	 */
+
+	if (_recordable.prep_record_enabled (newval)) {
+		/* failed */
+		std::cerr << "Prep rec-enable failed\n";
+	}
+}
diff --git a/libs/ardour/record_safe_control.cc b/libs/ardour/record_safe_control.cc
new file mode 100644
index 0000000..f3036e0
--- /dev/null
+++ b/libs/ardour/record_safe_control.cc
@@ -0,0 +1,49 @@
+/*
+    Copyright (C) 2016 Paul Davis
+
+    This program is free software; you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by the Free
+    Software Foundation; either version 2 of the License, or (at your option)
+    any later version.
+
+    This program is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc.,
+    675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#include "ardour/audioengine.h"
+#include "ardour/record_safe_control.h"
+
+#include "pbd/i18n.h"
+
+using namespace ARDOUR;
+using namespace PBD;
+
+RecordSafeControl::RecordSafeControl (Session& session, std::string const & name, Recordable& r)
+	: SlavableAutomationControl (session, RecSafeAutomation, ParameterDescriptor (RecSafeAutomation),
+	                             boost::shared_ptr<AutomationList>(new AutomationList(Evoral::Parameter(RecSafeAutomation))),
+	                             name)
+	, _recordable (r)
+{
+	_list->set_interpolation(Evoral::ControlList::Discrete);
+
+	/* record-enable changes must be synchronized by the process cycle */
+	set_flags (Controllable::Flag (flags() | Controllable::RealTime));
+}
+
+void
+RecordSafeControl::actually_set_value (double val, Controllable::GroupControlDisposition gcd)
+{
+	if (val && !_recordable.can_be_record_safe()) {
+		std::cerr << "rec-enable not allowed\n";
+		return;
+	}
+
+	SlavableAutomationControl::actually_set_value (val, gcd);
+}
+
diff --git a/libs/ardour/region.cc b/libs/ardour/region.cc
index bd99403..f787466 100644
--- a/libs/ardour/region.cc
+++ b/libs/ardour/region.cc
@@ -36,8 +36,9 @@
 #include "ardour/session.h"
 #include "ardour/source.h"
 #include "ardour/tempo.h"
+#include "ardour/transient_detector.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
@@ -63,6 +64,7 @@ namespace ARDOUR {
 		PBD::PropertyDescriptor<framepos_t> start;
 		PBD::PropertyDescriptor<framecnt_t> length;
 		PBD::PropertyDescriptor<framepos_t> position;
+		PBD::PropertyDescriptor<double> beat;
 		PBD::PropertyDescriptor<framecnt_t> sync_position;
 		PBD::PropertyDescriptor<layer_t> layer;
 		PBD::PropertyDescriptor<framepos_t> ancestral_start;
@@ -80,55 +82,57 @@ void
 Region::make_property_quarks ()
 {
 	Properties::muted.property_id = g_quark_from_static_string (X_("muted"));
-	DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for muted = %1\n", 	Properties::muted.property_id));
+	DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for muted = %1\n",	Properties::muted.property_id));
 	Properties::opaque.property_id = g_quark_from_static_string (X_("opaque"));
-	DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for opaque = %1\n", 	Properties::opaque.property_id));
+	DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for opaque = %1\n",	Properties::opaque.property_id));
 	Properties::locked.property_id = g_quark_from_static_string (X_("locked"));
-	DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for locked = %1\n", 	Properties::locked.property_id));
+	DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for locked = %1\n",	Properties::locked.property_id));
 	Properties::video_locked.property_id = g_quark_from_static_string (X_("video-locked"));
-	DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for video-locked = %1\n", 	Properties::video_locked.property_id));
+	DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for video-locked = %1\n",	Properties::video_locked.property_id));
 	Properties::automatic.property_id = g_quark_from_static_string (X_("automatic"));
-	DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for automatic = %1\n", 	Properties::automatic.property_id));
+	DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for automatic = %1\n",	Properties::automatic.property_id));
 	Properties::whole_file.property_id = g_quark_from_static_string (X_("whole-file"));
-	DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for whole-file = %1\n", 	Properties::whole_file.property_id));
+	DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for whole-file = %1\n",	Properties::whole_file.property_id));
 	Properties::import.property_id = g_quark_from_static_string (X_("import"));
-	DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for import = %1\n", 	Properties::import.property_id));
+	DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for import = %1\n",	Properties::import.property_id));
 	Properties::external.property_id = g_quark_from_static_string (X_("external"));
-	DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for external = %1\n", 	Properties::external.property_id));
+	DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for external = %1\n",	Properties::external.property_id));
 	Properties::sync_marked.property_id = g_quark_from_static_string (X_("sync-marked"));
-	DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for sync-marked = %1\n", 	Properties::sync_marked.property_id));
+	DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for sync-marked = %1\n",		Properties::sync_marked.property_id));
 	Properties::left_of_split.property_id = g_quark_from_static_string (X_("left-of-split"));
-	DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for left-of-split = %1\n", 	Properties::left_of_split.property_id));
+	DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for left-of-split = %1\n",	Properties::left_of_split.property_id));
 	Properties::right_of_split.property_id = g_quark_from_static_string (X_("right-of-split"));
-	DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for right-of-split = %1\n", 	Properties::right_of_split.property_id));
+	DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for right-of-split = %1\n",	Properties::right_of_split.property_id));
 	Properties::hidden.property_id = g_quark_from_static_string (X_("hidden"));
-	DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for hidden = %1\n", 	Properties::hidden.property_id));
+	DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for hidden = %1\n",	Properties::hidden.property_id));
 	Properties::position_locked.property_id = g_quark_from_static_string (X_("position-locked"));
-	DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for position-locked = %1\n", 	Properties::position_locked.property_id));
+	DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for position-locked = %1\n",	Properties::position_locked.property_id));
 	Properties::valid_transients.property_id = g_quark_from_static_string (X_("valid-transients"));
-	DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for valid-transients = %1\n", 	Properties::valid_transients.property_id));
+	DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for valid-transients = %1\n",	Properties::valid_transients.property_id));
 	Properties::start.property_id = g_quark_from_static_string (X_("start"));
-	DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for start = %1\n", 	Properties::start.property_id));
+	DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for start = %1\n",	Properties::start.property_id));
 	Properties::length.property_id = g_quark_from_static_string (X_("length"));
-	DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for length = %1\n", 	Properties::length.property_id));
+	DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for length = %1\n",	Properties::length.property_id));
 	Properties::position.property_id = g_quark_from_static_string (X_("position"));
-	DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for position = %1\n", 	Properties::position.property_id));
+	DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for position = %1\n",	Properties::position.property_id));
+	Properties::beat.property_id = g_quark_from_static_string (X_("beat"));
+	DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for beat = %1\n",	Properties::beat.property_id));
 	Properties::sync_position.property_id = g_quark_from_static_string (X_("sync-position"));
-	DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for sync-position = %1\n", 	Properties::sync_position.property_id));
+	DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for sync-position = %1\n",	Properties::sync_position.property_id));
 	Properties::layer.property_id = g_quark_from_static_string (X_("layer"));
-	DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for layer = %1\n", 	Properties::layer.property_id));
+	DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for layer = %1\n",	Properties::layer.property_id));
 	Properties::ancestral_start.property_id = g_quark_from_static_string (X_("ancestral-start"));
-	DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for ancestral-start = %1\n", 	Properties::ancestral_start.property_id));
+	DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for ancestral-start = %1\n",	Properties::ancestral_start.property_id));
 	Properties::ancestral_length.property_id = g_quark_from_static_string (X_("ancestral-length"));
-	DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for ancestral-length = %1\n", 	Properties::ancestral_length.property_id));
+	DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for ancestral-length = %1\n",	Properties::ancestral_length.property_id));
 	Properties::stretch.property_id = g_quark_from_static_string (X_("stretch"));
-	DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for stretch = %1\n", 	Properties::stretch.property_id));
+	DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for stretch = %1\n",	Properties::stretch.property_id));
 	Properties::shift.property_id = g_quark_from_static_string (X_("shift"));
-	DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for shift = %1\n", 	Properties::shift.property_id));
+	DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for shift = %1\n",	Properties::shift.property_id));
 	Properties::position_lock_style.property_id = g_quark_from_static_string (X_("positional-lock-style"));
-	DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for position_lock_style = %1\n", 	Properties::position_lock_style.property_id));
+	DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for position_lock_style = %1\n",		Properties::position_lock_style.property_id));
 	Properties::layering_index.property_id = g_quark_from_static_string (X_("layering-index"));
-	DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for layering_index = %1\n", 	Properties::layering_index.property_id));
+	DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for layering_index = %1\n",	Properties::layering_index.property_id));
 }
 
 void
@@ -153,6 +157,7 @@ Region::register_properties ()
 	add_property (_start);
 	add_property (_length);
 	add_property (_position);
+	add_property (_beat);
 	add_property (_sync_position);
 	add_property (_ancestral_start);
 	add_property (_ancestral_length);
@@ -170,7 +175,11 @@ Region::register_properties ()
 	, _start (Properties::start, (s))	\
 	, _length (Properties::length, (l))	\
 	, _position (Properties::position, 0) \
+	, _beat (Properties::beat, 0.0) \
 	, _sync_position (Properties::sync_position, (s)) \
+	, _transient_user_start (0) \
+	, _transient_analysis_start (0) \
+	, _transient_analysis_end (0) \
 	, _muted (Properties::muted, false) \
 	, _opaque (Properties::opaque, true) \
 	, _locked (Properties::locked, false) \
@@ -196,8 +205,14 @@ Region::register_properties ()
 	, _start(Properties::start, other->_start)		\
 	, _length(Properties::length, other->_length)		\
 	, _position(Properties::position, other->_position)	\
+	, _beat (Properties::beat, other->_beat)                \
 	, _sync_position(Properties::sync_position, other->_sync_position) \
-        , _muted (Properties::muted, other->_muted)	        \
+	, _user_transients (other->_user_transients) \
+	, _transient_user_start (other->_transient_user_start) \
+	, _transients (other->_transients) \
+	, _transient_analysis_start (other->_transient_analysis_start) \
+	, _transient_analysis_end (other->_transient_analysis_end) \
+	, _muted (Properties::muted, other->_muted)	        \
 	, _opaque (Properties::opaque, other->_opaque)		\
 	, _locked (Properties::locked, other->_locked)		\
   , _video_locked (Properties::video_locked, other->_video_locked) \
@@ -264,17 +279,19 @@ Region::Region (boost::shared_ptr<const Region> other)
 	/* override state that may have been incorrectly inherited from the other region
 	 */
 
-	_position = 0;
+	_position = other->_position;
 	_locked = false;
 	_whole_file = false;
 	_hidden = false;
 
 	use_sources (other->_sources);
+	set_master_sources (other->_master_sources);
 
 	_position_lock_style = other->_position_lock_style;
 	_first_edit = other->_first_edit;
 
-	_start = 0; // It seems strange _start is not inherited here?
+	_start = other->_start;
+	_beat = other->_beat;
 
 	/* sync pos is relative to start of file. our start-in-file is now zero,
 	   so set our sync position to whatever the the difference between
@@ -301,17 +318,6 @@ Region::Region (boost::shared_ptr<const Region> other)
 		_sync_position = _start;
 	}
 
-	if (Profile->get_sae()) {
-		/* reset sync point to start if its ended up
-		   outside region bounds.
-		*/
-
-		if (_sync_position < _start || _sync_position >= _start + _length) {
-			_sync_marked = false;
-			_sync_position = _start;
-		}
-	}
-
 	assert (_type == other->data_type());
 }
 
@@ -320,7 +326,7 @@ Region::Region (boost::shared_ptr<const Region> other)
     the start within \a other is given by \a offset
     (i.e. relative to the start of \a other's sources, the start is \a offset + \a other.start()
 */
-Region::Region (boost::shared_ptr<const Region> other, frameoffset_t offset)
+Region::Region (boost::shared_ptr<const Region> other, frameoffset_t offset, const int32_t sub_num)
 	: SessionObject(other->session(), other->name())
 	, _type (other->data_type())
 	, REGION_COPY_STATE (other)
@@ -334,14 +340,16 @@ Region::Region (boost::shared_ptr<const Region> other, frameoffset_t offset)
 	/* override state that may have been incorrectly inherited from the other region
 	 */
 
-	_position = 0;
+	_position = other->_position + offset;
 	_locked = false;
 	_whole_file = false;
 	_hidden = false;
 
 	use_sources (other->_sources);
+	set_master_sources (other->_master_sources);
 
 	_start = other->_start + offset;
+	_beat = _session.tempo_map().exact_beat_at_frame (_position, sub_num);
 
 	/* if the other region had a distinct sync point
 	   set, then continue to use it as best we can.
@@ -360,17 +368,6 @@ Region::Region (boost::shared_ptr<const Region> other, frameoffset_t offset)
 		_sync_position = _start;
 	}
 
-	if (Profile->get_sae()) {
-		/* reset sync point to start if its ended up
-		   outside region bounds.
-		*/
-
-		if (_sync_position < _start || _sync_position >= _start + _length) {
-			_sync_marked = false;
-			_sync_position = _start;
-		}
-	}
-
 	assert (_type == other->data_type());
 }
 
@@ -427,7 +424,7 @@ Region::set_name (const std::string& str)
 }
 
 void
-Region::set_length (framecnt_t len)
+Region::set_length (framecnt_t len, const int32_t sub_num)
 {
 	//cerr << "Region::set_length() len = " << len << endl;
 	if (locked()) {
@@ -449,12 +446,11 @@ Region::set_length (framecnt_t len)
 		}
 
 
-		_last_length = _length;
-		set_length_internal (len);
+		set_length_internal (len, sub_num);
 		_whole_file = false;
 		first_edit ();
 		maybe_uncopy ();
-		invalidate_transients ();
+		maybe_invalidate_transients ();
 
 		if (!property_changes_suspended()) {
 			recompute_at_end ();
@@ -465,8 +461,9 @@ Region::set_length (framecnt_t len)
 }
 
 void
-Region::set_length_internal (framecnt_t len)
+Region::set_length_internal (framecnt_t len, const int32_t sub_num)
 {
+	_last_length = _length;
 	_length = len;
 }
 
@@ -549,7 +546,7 @@ Region::set_position_lock_style (PositionLockStyle ps)
 		_position_lock_style = ps;
 
 		if (_position_lock_style == MusicTime) {
-			_session.bbt_time (_position, _bbt_time);
+			_beat = _session.tempo_map().beat_at_frame (_position);
 		}
 
 		send_change (Properties::position_lock_style);
@@ -557,7 +554,7 @@ Region::set_position_lock_style (PositionLockStyle ps)
 }
 
 void
-Region::update_after_tempo_map_change ()
+Region::update_after_tempo_map_change (bool send)
 {
 	boost::shared_ptr<Playlist> pl (playlist());
 
@@ -565,29 +562,50 @@ Region::update_after_tempo_map_change ()
 		return;
 	}
 
-	TempoMap& map (_session.tempo_map());
-	framepos_t pos = map.frame_time (_bbt_time);
-	set_position_internal (pos, false);
+	const framepos_t pos = _session.tempo_map().frame_at_beat (_beat);
+	/* we have _beat. update frame position non-musically */
+	set_position_internal (pos, false, 0);
 
 	/* do this even if the position is the same. this helps out
 	   a GUI that has moved its representation already.
 	*/
-	send_change (Properties::position);
+
+	if (send) {
+		send_change (Properties::position);
+	}
 }
 
 void
-Region::set_position (framepos_t pos)
+Region::set_position (framepos_t pos, int32_t sub_num)
 {
 	if (!can_move()) {
 		return;
 	}
 
-	set_position_internal (pos, true);
+	if (sub_num == 0) {
+		set_position_internal (pos, true, 0);
+	} else {
+		double beat = _session.tempo_map().exact_beat_at_frame (pos, sub_num);
+		_beat = beat;
+		set_position_internal (pos, false, sub_num);
+	}
 
 	/* do this even if the position is the same. this helps out
 	   a GUI that has moved its representation already.
 	*/
-	send_change (Properties::position);
+	PropertyChange p_and_l;
+
+	p_and_l.add (Properties::position);
+	/* Currently length change due to position change is only implemented
+	   for MidiRegion (Region has no length in beats).
+	   Notify a length change regardless (its more efficient for MidiRegions),
+	   and when Region has a _length_beats we will need it here anyway).
+	*/
+	if (position_lock_style() == MusicTime) {
+		p_and_l.add (Properties::length);
+	}
+
+	send_change (p_and_l);
 
 }
 
@@ -617,7 +635,7 @@ Region::set_initial_position (framepos_t pos)
 			_length = max_framepos - _position;
 		}
 
-		recompute_position_from_lock_style ();
+		recompute_position_from_lock_style (0);
 		/* ensure that this move doesn't cause a range move */
 		_last_position = _position;
 	}
@@ -630,7 +648,7 @@ Region::set_initial_position (framepos_t pos)
 }
 
 void
-Region::set_position_internal (framepos_t pos, bool allow_bbt_recompute)
+Region::set_position_internal (framepos_t pos, bool allow_bbt_recompute, const int32_t sub_num)
 {
 	/* We emit a change of Properties::position even if the position hasn't changed
 	   (see Region::set_position), so we must always set this up so that
@@ -641,31 +659,25 @@ Region::set_position_internal (framepos_t pos, bool allow_bbt_recompute)
 	if (_position != pos) {
 		_position = pos;
 
+		if (allow_bbt_recompute) {
+			recompute_position_from_lock_style (sub_num);
+		}
 		/* check that the new _position wouldn't make the current
 		   length impossible - if so, change the length.
 
 		   XXX is this the right thing to do?
 		*/
-
 		if (max_framepos - _length < _position) {
 			_last_length = _length;
 			_length = max_framepos - _position;
 		}
-
-		if (allow_bbt_recompute) {
-			recompute_position_from_lock_style ();
-		}
-
-		//invalidate_transients ();
 	}
 }
 
 void
-Region::recompute_position_from_lock_style ()
+Region::recompute_position_from_lock_style (const int32_t sub_num)
 {
-	if (_position_lock_style == MusicTime) {
-		_session.bbt_time (_position, _bbt_time);
-	}
+	_beat = _session.tempo_map().exact_beat_at_frame (_position, sub_num);
 }
 
 void
@@ -694,8 +706,8 @@ Region::nudge_position (frameoffset_t n)
 			new_position += n;
 		}
 	}
-
-	set_position_internal (new_position, true);
+	/* assumes non-musical nudge */
+	set_position_internal (new_position, true, 0);
 
 	send_change (Properties::position);
 }
@@ -729,14 +741,14 @@ Region::set_start (framepos_t pos)
 		set_start_internal (pos);
 		_whole_file = false;
 		first_edit ();
-		invalidate_transients ();
+		maybe_invalidate_transients ();
 
 		send_change (Properties::start);
 	}
 }
 
 void
-Region::move_start (frameoffset_t distance)
+Region::move_start (frameoffset_t distance, const int32_t sub_num)
 {
 	if (locked() || position_locked() || video_locked()) {
 		return;
@@ -772,7 +784,7 @@ Region::move_start (frameoffset_t distance)
 		return;
 	}
 
-	set_start_internal (new_start);
+	set_start_internal (new_start, sub_num);
 
 	_whole_file = false;
 	first_edit ();
@@ -781,25 +793,25 @@ Region::move_start (frameoffset_t distance)
 }
 
 void
-Region::trim_front (framepos_t new_position)
+Region::trim_front (framepos_t new_position, const int32_t sub_num)
 {
-	modify_front (new_position, false);
+	modify_front (new_position, false, sub_num);
 }
 
 void
-Region::cut_front (framepos_t new_position)
+Region::cut_front (framepos_t new_position, const int32_t sub_num)
 {
-	modify_front (new_position, true);
+	modify_front (new_position, true, sub_num);
 }
 
 void
-Region::cut_end (framepos_t new_endpoint)
+Region::cut_end (framepos_t new_endpoint, const int32_t sub_num)
 {
-	modify_end (new_endpoint, true);
+	modify_end (new_endpoint, true, sub_num);
 }
 
 void
-Region::modify_front (framepos_t new_position, bool reset_fade)
+Region::modify_front (framepos_t new_position, bool reset_fade, const int32_t sub_num)
 {
 	if (locked()) {
 		return;
@@ -817,7 +829,6 @@ Region::modify_front (framepos_t new_position, bool reset_fade)
 	if (new_position < end) { /* can't trim it zero or negative length */
 
 		framecnt_t newlen = 0;
-		framepos_t delta = 0;
 
 		if (!can_trim_start_before_source_start ()) {
 			/* can't trim it back past where source position zero is located */
@@ -826,13 +837,11 @@ Region::modify_front (framepos_t new_position, bool reset_fade)
 
 		if (new_position > _position) {
 			newlen = _length - (new_position - _position);
-			delta = -1 * (new_position - _position);
 		} else {
 			newlen = _length + (_position - new_position);
-			delta = _position - new_position;
 		}
 
-		trim_to_internal (new_position, newlen);
+		trim_to_internal (new_position, newlen, sub_num);
 
 		if (reset_fade) {
 			_right_of_split = true;
@@ -842,21 +851,19 @@ Region::modify_front (framepos_t new_position, bool reset_fade)
 			recompute_at_start ();
 		}
 
-		if (_transients.size() > 0){
-			adjust_transients(delta);
-		}
+		maybe_invalidate_transients ();
 	}
 }
 
 void
-Region::modify_end (framepos_t new_endpoint, bool reset_fade)
+Region::modify_end (framepos_t new_endpoint, bool reset_fade, const int32_t sub_num)
 {
 	if (locked()) {
 		return;
 	}
 
 	if (new_endpoint > _position) {
-		trim_to_internal (_position, new_endpoint - _position);
+		trim_to_internal (_position, new_endpoint - _position, sub_num);
 		if (reset_fade) {
 			_left_of_split = true;
 		}
@@ -871,19 +878,19 @@ Region::modify_end (framepos_t new_endpoint, bool reset_fade)
  */
 
 void
-Region::trim_end (framepos_t new_endpoint)
+Region::trim_end (framepos_t new_endpoint, const int32_t sub_num)
 {
-	modify_end (new_endpoint, false);
+	modify_end (new_endpoint, false, sub_num);
 }
 
 void
-Region::trim_to (framepos_t position, framecnt_t length)
+Region::trim_to (framepos_t position, framecnt_t length, const int32_t sub_num)
 {
 	if (locked()) {
 		return;
 	}
 
-	trim_to_internal (position, length);
+	trim_to_internal (position, length, sub_num);
 
 	if (!property_changes_suspended()) {
 		recompute_at_start ();
@@ -892,7 +899,7 @@ Region::trim_to (framepos_t position, framecnt_t length)
 }
 
 void
-Region::trim_to_internal (framepos_t position, framecnt_t length)
+Region::trim_to_internal (framepos_t position, framecnt_t length, const int32_t sub_num)
 {
 	framepos_t new_start;
 
@@ -929,10 +936,11 @@ Region::trim_to_internal (framepos_t position, framecnt_t length)
 	PropertyChange what_changed;
 
 	if (_start != new_start) {
-		set_start_internal (new_start);
+		set_start_internal (new_start, sub_num);
 		what_changed.add (Properties::start);
 	}
 
+
 	/* Set position before length, otherwise for MIDI regions this bad thing happens:
 	 * 1. we call set_length_internal; length in beats is computed using the region's current
 	 *    (soon-to-be old) position
@@ -945,7 +953,7 @@ Region::trim_to_internal (framepos_t position, framecnt_t length)
 		if (!property_changes_suspended()) {
 			_last_position = _position;
 		}
-		set_position_internal (position, true);
+		set_position_internal (position, true, sub_num);
 		what_changed.add (Properties::position);
 	}
 
@@ -953,7 +961,7 @@ Region::trim_to_internal (framepos_t position, framecnt_t length)
 		if (!property_changes_suspended()) {
 			_last_length = _length;
 		}
-		set_length_internal (length);
+		set_length_internal (length, sub_num);
 		what_changed.add (Properties::length);
 	}
 
@@ -1176,7 +1184,7 @@ Region::state ()
 	XMLNode *node = new XMLNode ("Region");
 	char buf[64];
 	char buf2[64];
-	LocaleGuard lg (X_("C"));
+	LocaleGuard lg;
 	const char* fe = NULL;
 
 	/* custom version of 'add_properties (*node);'
@@ -1215,12 +1223,6 @@ Region::state ()
 
 	/* note: flags are stored by derived classes */
 
-	if (_position_lock_style != AudioTime) {
-		stringstream str;
-		str << _bbt_time;
-		node->add_property ("bbt-position", str.str());
-	}
-
 	for (uint32_t n=0; n < _sources.size(); ++n) {
 		snprintf (buf2, sizeof(buf2), "source-%d", n);
 		_sources[n]->id().print (buf, sizeof(buf));
@@ -1278,7 +1280,8 @@ Region::set_state (const XMLNode& node, int version)
 int
 Region::_set_state (const XMLNode& node, int /*version*/, PropertyChange& what_changed, bool send)
 {
-	const XMLProperty* prop;
+	XMLProperty const * prop;
+	Timecode::BBT_Time bbt_time;
 
 	Stateful::save_extra_xml (node);
 
@@ -1287,15 +1290,14 @@ Region::_set_state (const XMLNode& node, int /*version*/, PropertyChange& what_c
 	set_id (node);
 
 	if (_position_lock_style == MusicTime) {
-		if ((prop = node.property ("bbt-position")) == 0) {
-			/* missing BBT info, revert to audio time locking */
-			_position_lock_style = AudioTime;
-		} else {
+		if ((prop = node.property ("bbt-position")) != 0) {
 			if (sscanf (prop->value().c_str(), "%d|%d|%d",
-				    &_bbt_time.bars,
-				    &_bbt_time.beats,
-				    &_bbt_time.ticks) != 3) {
+				    &bbt_time.bars,
+				    &bbt_time.beats,
+				    &bbt_time.ticks) != 3) {
 				_position_lock_style = AudioTime;
+			} else {
+				_beat = _session.tempo_map().beat_at_bbt (bbt_time);
 			}
 		}
 	}
@@ -1323,7 +1325,7 @@ Region::_set_state (const XMLNode& node, int /*version*/, PropertyChange& what_c
 	}
 
 	// saved property is invalid, region-transients are not saved
-	if (_transients.size() == 0){
+	if (_user_transients.size() == 0){
 		_valid_transients = false;
 	}
 
@@ -1515,19 +1517,59 @@ Region::source_string () const
 	return res.str();
 }
 
+void
+Region::deep_sources (std::set<boost::shared_ptr<Source> > & sources) const
+{
+	for (SourceList::const_iterator i = _sources.begin(); i != _sources.end(); ++i) {
+
+		boost::shared_ptr<PlaylistSource> ps = boost::dynamic_pointer_cast<PlaylistSource> (*i);
+
+		if (ps) {
+			if (sources.find (ps) == sources.end()) {
+				/* (Playlist)Source not currently in
+				   accumulating set, so recurse.
+				*/
+				ps->playlist()->deep_sources (sources);
+			}
+		}
+
+		/* add this source */
+		sources.insert (*i);
+	}
+
+	for (SourceList::const_iterator i = _master_sources.begin(); i != _master_sources.end(); ++i) {
+
+		boost::shared_ptr<PlaylistSource> ps = boost::dynamic_pointer_cast<PlaylistSource> (*i);
+
+		if (ps) {
+			if (sources.find (ps) == sources.end()) {
+				/* (Playlist)Source not currently in
+				   accumulating set, so recurse.
+				*/
+				ps->playlist()->deep_sources (sources);
+			}
+		}
+
+		/* add this source */
+		sources.insert (*i);
+	}
+}
+
 bool
-Region::uses_source (boost::shared_ptr<const Source> source) const
+Region::uses_source (boost::shared_ptr<const Source> source, bool shallow) const
 {
 	for (SourceList::const_iterator i = _sources.begin(); i != _sources.end(); ++i) {
 		if (*i == source) {
 			return true;
 		}
 
-		boost::shared_ptr<PlaylistSource> ps = boost::dynamic_pointer_cast<PlaylistSource> (*i);
+		if (!shallow) {
+			boost::shared_ptr<PlaylistSource> ps = boost::dynamic_pointer_cast<PlaylistSource> (*i);
 
-		if (ps) {
-			if (ps->playlist()->uses_source (source)) {
-				return true;
+			if (ps) {
+				if (ps->playlist()->uses_source (source)) {
+					return true;
+				}
 			}
 		}
 	}
@@ -1537,11 +1579,13 @@ Region::uses_source (boost::shared_ptr<const Source> source) const
 			return true;
 		}
 
-		boost::shared_ptr<PlaylistSource> ps = boost::dynamic_pointer_cast<PlaylistSource> (*i);
+		if (!shallow) {
+			boost::shared_ptr<PlaylistSource> ps = boost::dynamic_pointer_cast<PlaylistSource> (*i);
 
-		if (ps) {
-			if (ps->playlist()->uses_source (source)) {
-				return true;
+			if (ps) {
+				if (ps->playlist()->uses_source (source)) {
+					return true;
+				}
 			}
 		}
 	}
@@ -1549,6 +1593,7 @@ Region::uses_source (boost::shared_ptr<const Source> source) const
 	return false;
 }
 
+
 framecnt_t
 Region::source_length(uint32_t n) const
 {
@@ -1647,12 +1692,60 @@ Region::apply (Filter& filter, Progress* progress)
 
 
 void
-Region::invalidate_transients ()
+Region::maybe_invalidate_transients ()
 {
-	_valid_transients = false;
-	_transients.clear ();
+	bool changed = !_onsets.empty();
+	_onsets.clear ();
 
-	send_change (PropertyChange (Properties::valid_transients));
+	if (_valid_transients || changed) {
+		send_change (PropertyChange (Properties::valid_transients));
+		return;
+	}
+}
+
+void
+Region::transients (AnalysisFeatureList& afl)
+{
+	int cnt = afl.empty() ? 0 : 1;
+
+	Region::merge_features (afl, _onsets, _position);
+	Region::merge_features (afl, _user_transients, _position + _transient_user_start - _start);
+	if (!_onsets.empty ()) {
+		++cnt;
+	}
+	if (!_user_transients.empty ()) {
+		++cnt;
+	}
+	if (cnt > 1 ) {
+		afl.sort ();
+		// remove exact duplicates
+		TransientDetector::cleanup_transients (afl, _session.frame_rate(), 0);
+	}
+}
+
+bool
+Region::has_transients () const
+{
+	if (!_user_transients.empty ()) {
+		assert (_valid_transients);
+		return true;
+	}
+	if (!_onsets.empty ()) {
+		return true;
+	}
+	return false;
+}
+
+void
+Region::merge_features (AnalysisFeatureList& result, const AnalysisFeatureList& src, const frameoffset_t off) const
+{
+	for (AnalysisFeatureList::const_iterator x = src.begin(); x != src.end(); ++x) {
+		const frameoffset_t p = (*x) + off;
+		if (p < first_frame() || p > last_frame()) {
+			continue;
+		}
+		result.push_back (p);
+	}
 }
 
 void
@@ -1742,12 +1835,12 @@ void
 Region::post_set (const PropertyChange& pc)
 {
 	if (pc.contains (Properties::position)) {
-		recompute_position_from_lock_style ();
+		recompute_position_from_lock_style (0);
 	}
 }
 
 void
-Region::set_start_internal (framecnt_t s)
+Region::set_start_internal (framecnt_t s, const int32_t sub_num)
 {
 	_start = s;
 }
@@ -1780,4 +1873,3 @@ Region::latest_possible_frame () const
 
 	return _position + (minlen - _start) - 1;
 }
-
diff --git a/libs/ardour/region_factory.cc b/libs/ardour/region_factory.cc
index 33c714c..16a9e02 100644
--- a/libs/ardour/region_factory.cc
+++ b/libs/ardour/region_factory.cc
@@ -30,7 +30,7 @@
 #include "ardour/region_factory.h"
 #include "ardour/session.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 using namespace PBD;
@@ -46,7 +46,7 @@ std::map<std::string, PBD::ID>                RegionFactory::region_name_map;
 RegionFactory::CompoundAssociations           RegionFactory::_compound_associations;
 
 boost::shared_ptr<Region>
-RegionFactory::create (boost::shared_ptr<const Region> region, bool announce)
+RegionFactory::create (boost::shared_ptr<const Region> region, bool announce, const int32_t sub_num)
 {
 	boost::shared_ptr<Region> ret;
 	boost::shared_ptr<const AudioRegion> ar;
@@ -54,7 +54,7 @@ RegionFactory::create (boost::shared_ptr<const Region> region, bool announce)
 
 	if ((ar = boost::dynamic_pointer_cast<const AudioRegion>(region)) != 0) {
 
-		ret = boost::shared_ptr<Region> (new AudioRegion (ar, 0));
+		ret = boost::shared_ptr<Region> (new AudioRegion (ar, 0, sub_num));
 
 	} else if ((mr = boost::dynamic_pointer_cast<const MidiRegion>(region)) != 0) {
 
@@ -71,7 +71,7 @@ RegionFactory::create (boost::shared_ptr<const Region> region, bool announce)
 			source->set_ancestor_name(mr->sources().front()->name());
 			ret = mr->clone(source);
 		} else {
-			ret = boost::shared_ptr<Region> (new MidiRegion (mr, 0));
+			ret = boost::shared_ptr<Region> (new MidiRegion (mr, 0, sub_num));
 		}
 
 	} else {
@@ -82,12 +82,13 @@ RegionFactory::create (boost::shared_ptr<const Region> region, bool announce)
 
 	if (ret) {
 		ret->set_name (new_region_name(ret->name()));
-		ret->set_position (region->position());
 
-		if (ret->session().config.get_glue_new_regions_to_bars_and_beats ()) {
+		if (ret->session().config.get_glue_new_regions_to_bars_and_beats() && ret->position_lock_style() != MusicTime) {
 			ret->set_position_lock_style (MusicTime);
 		}
 
+		ret->set_position (region->position(), sub_num);
+
 		/* pure copy constructor - no property list */
 		if (announce) {
 			map_add (ret);
@@ -126,7 +127,7 @@ RegionFactory::create (boost::shared_ptr<Region> region, const PropertyList& pli
 	if (ret) {
 		ret->apply_changes (plist);
 
-		if (ret->session().config.get_glue_new_regions_to_bars_and_beats ()) {
+		if (ret->session().config.get_glue_new_regions_to_bars_and_beats() && ret->position_lock_style() != MusicTime) {
 			ret->set_position_lock_style (MusicTime);
 		}
 
@@ -143,7 +144,7 @@ RegionFactory::create (boost::shared_ptr<Region> region, const PropertyList& pli
 }
 
 boost::shared_ptr<Region>
-RegionFactory::create (boost::shared_ptr<Region> region, frameoffset_t offset, const PropertyList& plist, bool announce)
+RegionFactory::create (boost::shared_ptr<Region> region, frameoffset_t offset, const PropertyList& plist, bool announce, const int32_t sub_num)
 {
 	boost::shared_ptr<Region> ret;
 	boost::shared_ptr<const AudioRegion> other_a;
@@ -151,11 +152,11 @@ RegionFactory::create (boost::shared_ptr<Region> region, frameoffset_t offset, c
 
 	if ((other_a = boost::dynamic_pointer_cast<AudioRegion>(region)) != 0) {
 
-		ret = boost::shared_ptr<Region> (new AudioRegion (other_a, offset));
+		ret = boost::shared_ptr<Region> (new AudioRegion (other_a, offset, sub_num));
 
 	} else if ((other_m = boost::dynamic_pointer_cast<MidiRegion>(region)) != 0) {
 
-		ret = boost::shared_ptr<Region> (new MidiRegion (other_m, offset));
+		ret = boost::shared_ptr<Region> (new MidiRegion (other_m, offset, sub_num));
 
 	} else {
 		fatal << _("programming error: RegionFactory::create() called with unknown Region type")
@@ -167,7 +168,7 @@ RegionFactory::create (boost::shared_ptr<Region> region, frameoffset_t offset, c
 	if (ret) {
 		ret->apply_changes (plist);
 
-		if (ret->session().config.get_glue_new_regions_to_bars_and_beats ()) {
+		if (ret->session().config.get_glue_new_regions_to_bars_and_beats() && ret->position_lock_style() != MusicTime) {
 			ret->set_position_lock_style (MusicTime);
 		}
 
@@ -208,7 +209,7 @@ RegionFactory::create (boost::shared_ptr<Region> region, const SourceList& srcs,
 	if (ret) {
 		ret->apply_changes (plist);
 
-		if (ret->session().config.get_glue_new_regions_to_bars_and_beats ()) {
+		if (ret->session().config.get_glue_new_regions_to_bars_and_beats() && ret->position_lock_style() != MusicTime) {
 			ret->set_position_lock_style (MusicTime);
 		}
 
@@ -252,7 +253,7 @@ RegionFactory::create (const SourceList& srcs, const PropertyList& plist, bool a
 	if (ret) {
 		ret->apply_changes (plist);
 
-		if (ret->session().config.get_glue_new_regions_to_bars_and_beats ()) {
+		if (ret->session().config.get_glue_new_regions_to_bars_and_beats() && ret->position_lock_style() != MusicTime) {
 			ret->set_position_lock_style (MusicTime);
 		}
 
@@ -635,7 +636,7 @@ RegionFactory::get_regions_using_source (boost::shared_ptr<Source> s, std::set<b
 {
 	Glib::Threads::Mutex::Lock lm (region_map_lock);
 
-	for (RegionMap::iterator i = region_map.begin(); i != region_map.end(); ++i) {
+	for (RegionMap::const_iterator i = region_map.begin(); i != region_map.end(); ++i) {
 		if (i->second->uses_source (s)) {
 			r.insert (i->second);
 		}
diff --git a/libs/ardour/resampled_source.cc b/libs/ardour/resampled_source.cc
index 5c81170..24eb12a 100644
--- a/libs/ardour/resampled_source.cc
+++ b/libs/ardour/resampled_source.cc
@@ -21,7 +21,7 @@
 #include "ardour/resampled_source.h"
 #include "pbd/failed_constructor.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 using namespace PBD;
@@ -73,14 +73,15 @@ framecnt_t
 ResampledImportableSource::read (Sample* output, framecnt_t nframes)
 {
 	int err;
+	size_t bs = floor ((float)(blocksize / source->channels())) *  source->channels();
 
 	/* If the input buffer is empty, refill it. */
 	if (_src_data.input_frames == 0) {
 
-		_src_data.input_frames = source->read (_input, blocksize);
+		_src_data.input_frames = source->read (_input, bs);
 
 		/* The last read will not be a full buffer, so set end_of_input. */
-		if ((framecnt_t) _src_data.input_frames < blocksize) {
+		if ((size_t) _src_data.input_frames < bs) {
 			_end_of_input = true;
 		}
 
diff --git a/libs/ardour/return.cc b/libs/ardour/return.cc
index db81568..5c92b90 100644
--- a/libs/ardour/return.cc
+++ b/libs/ardour/return.cc
@@ -30,7 +30,7 @@
 #include "ardour/return.h"
 #include "ardour/session.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 using namespace PBD;
@@ -86,7 +86,7 @@ Return::set_state (const XMLNode& node, int version)
 {
 	XMLNodeList nlist = node.children();
 	XMLNodeIterator niter;
-	const XMLProperty* prop;
+	XMLProperty const * prop;
 	const XMLNode* insert_node = &node;
 
 	/* Return has regular IO automation (gain, pan) */
@@ -115,7 +115,7 @@ Return::set_state (const XMLNode& node, int version)
 }
 
 void
-Return::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, bool)
+Return::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, double speed, pframes_t nframes, bool)
 {
 	if ((!_active && !_pending_active) || _input->n_ports() == ChanCount::ZERO) {
 		return;
@@ -127,13 +127,13 @@ Return::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pfra
 	// Can't automate gain for sends or returns yet because we need different buffers
 	// so that we don't overwrite the main automation data for the route amp
 	// _amp->setup_gain_automation (start_frame, end_frame, nframes);
-	_amp->run (bufs, start_frame, end_frame, nframes, true);
+	_amp->run (bufs, start_frame, end_frame, speed, nframes, true);
 
 	if (_metering) {
 		if (_amp->gain_control()->get_value() == 0) {
 			_meter->reset();
 		} else {
-			_meter->run (bufs, start_frame, end_frame, nframes, true);
+			_meter->run (bufs, start_frame, end_frame, speed, nframes, true);
 		}
 	}
 
diff --git a/libs/ardour/revision.cc b/libs/ardour/revision.cc
new file mode 100644
index 0000000..bb79402
--- /dev/null
+++ b/libs/ardour/revision.cc
@@ -0,0 +1,2 @@
+#include "ardour/revision.h"
+namespace ARDOUR { const char* revision = "5.0"; }
diff --git a/libs/ardour/route.cc b/libs/ardour/route.cc
index 5eb962d..11db732 100644
--- a/libs/ardour/route.cc
+++ b/libs/ardour/route.cc
@@ -33,7 +33,6 @@
 #include "pbd/memento_command.h"
 #include "pbd/stacktrace.h"
 #include "pbd/convert.h"
-#include "pbd/boost_debug.h"
 #include "pbd/unwind.h"
 
 #include "ardour/amp.h"
@@ -41,6 +40,7 @@
 #include "ardour/audio_track.h"
 #include "ardour/audio_port.h"
 #include "ardour/audioengine.h"
+#include "ardour/boost_debug.h"
 #include "ardour/buffer.h"
 #include "ardour/buffer_set.h"
 #include "ardour/capturing_processor.h"
@@ -58,6 +58,7 @@
 #include "ardour/panner.h"
 #include "ardour/panner_shell.h"
 #include "ardour/parameter_descriptor.h"
+#include "ardour/phase_control.h"
 #include "ardour/plugin_insert.h"
 #include "ardour/port.h"
 #include "ardour/port_insert.h"
@@ -67,22 +68,26 @@
 #include "ardour/route_group.h"
 #include "ardour/send.h"
 #include "ardour/session.h"
+#include "ardour/solo_control.h"
+#include "ardour/solo_isolate_control.h"
 #include "ardour/unknown_processor.h"
 #include "ardour/utils.h"
+#include "ardour/vca.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
 using namespace PBD;
 
-PBD::Signal0<void> Route::SyncOrderKeys;
-PBD::Signal0<void> Route::RemoteControlIDChange;
+PBD::Signal3<int,boost::shared_ptr<Route>, boost::shared_ptr<PluginInsert>, Route::PluginSetupOptions > Route::PluginSetup;
 
-Route::Route (Session& sess, string name, Flag flg, DataType default_type)
-	: SessionObject (sess, name)
-	, Automatable (sess)
+/** Base class for all routable/mixable objects (tracks and busses) */
+Route::Route (Session& sess, string name, PresentationInfo::Flag flag, DataType default_type)
+	: Stripable (sess, name, PresentationInfo (flag))
 	, GraphNode (sess._process_graph)
+	, Muteable (sess, name)
+	, Automatable (sess)
 	, _active (true)
 	, _signal_latency (0)
 	, _signal_latency_at_amp_position (0)
@@ -91,31 +96,23 @@ Route::Route (Session& sess, string name, Flag flg, DataType default_type)
 	, _roll_delay (0)
 	, _pending_process_reorder (0)
 	, _pending_signals (0)
-	, _flags (flg)
 	, _pending_declick (true)
 	, _meter_point (MeterPostFader)
 	, _pending_meter_point (MeterPostFader)
 	, _meter_type (MeterPeak)
-	, _self_solo (false)
-	, _soloed_by_others_upstream (0)
-	, _soloed_by_others_downstream (0)
-	, _solo_isolated (false)
-	, _solo_isolated_by_upstream (0)
 	, _denormal_protection (false)
 	, _recordable (true)
 	, _silent (false)
 	, _declickable (false)
-	, _mute_master (new MuteMaster (sess, name))
 	, _have_internal_generator (false)
-	, _solo_safe (false)
 	, _default_type (default_type)
-	, _order_key (0)
-	, _has_order_key (false)
-	, _remote_control_id (0)
 	, _track_number (0)
 	, _in_configure_processors (false)
 	, _initial_io_setup (false)
+	, _in_sidechain_setup (false)
+	, _strict_io (false)
 	, _custom_meter_position_noted (false)
+	, _pinmgr_proxy (0)
 {
 	processor_max_streams.reset();
 }
@@ -135,24 +132,31 @@ Route::init ()
 
 	/* add standard controls */
 
-	_solo_control.reset (new SoloControllable (X_("solo"), shared_from_this ()));
-	_mute_control.reset (new MuteControllable (X_("mute"), shared_from_this ()));
-	_phase_control.reset (new PhaseControllable (X_("phase"), shared_from_this ()));
-
-	_solo_isolate_control.reset (new SoloIsolateControllable (X_("solo-iso"), shared_from_this ()));
-	_solo_safe_control.reset (new SoloSafeControllable (X_("solo-safe"), shared_from_this ()));
+	_gain_control.reset (new GainControl (_session, GainAutomation));
+	add_control (_gain_control);
 
-	_solo_control->set_flags (Controllable::Flag (_solo_control->flags() | Controllable::Toggle));
-	_mute_control->set_flags (Controllable::Flag (_mute_control->flags() | Controllable::Toggle));
-	_phase_control->set_flags (Controllable::Flag (_phase_control->flags() | Controllable::Toggle));
+	_trim_control.reset (new GainControl (_session, TrimAutomation));
+	add_control (_trim_control);
 
+	_solo_control.reset (new SoloControl (_session, X_("solo"), *this, *this));
 	add_control (_solo_control);
+	_solo_control->Changed.connect_same_thread (*this, boost::bind (&Route::solo_control_changed, this, _1, _2));
+
+	_mute_control.reset (new MuteControl (_session, X_("mute"), *this));
 	add_control (_mute_control);
+
+	_phase_control.reset (new PhaseControl (_session, X_("phase")));
 	add_control (_phase_control);
 
+	_solo_isolate_control.reset (new SoloIsolateControl (_session, X_("solo-iso"), *this, *this));
+	add_control (_solo_isolate_control);
+
+	_solo_safe_control.reset (new SoloSafeControl (_session, X_("solo-safe")));
+	add_control (_solo_safe_control);
+
 	/* panning */
 
-	if (!(_flags & Route::MonitorOut)) {
+	if (!(_presentation_info.flags() & PresentationInfo::MonitorOut)) {
 		_pannable.reset (new Pannable (_session));
 	}
 
@@ -167,17 +171,9 @@ Route::init ()
 	_output->changed.connect_same_thread (*this, boost::bind (&Route::output_change_handler, this, _1, _2));
 	_output->PortCountChanging.connect_same_thread (*this, boost::bind (&Route::output_port_count_changing, this, _1));
 
-#if 0 // not used - just yet
-	if (!is_master() && !is_monitor() && !is_auditioner()) {
-		_delayline.reset (new DelayLine (_session, _name));
-		add_processor (_delayline, PreFader);
-	}
-#endif
-
-	/* add amp processor  */
-
-	_gain_control = boost::shared_ptr<GainControllable> (new GainControllable (_session, GainAutomation, shared_from_this ()));
-	add_control (_gain_control);
+	/* add the amp/fader processor.
+	 * it should be the first processor to be added on every route.
+	 */
 
 	_amp.reset (new Amp (_session, X_("Fader"), _gain_control, true));
 	add_processor (_amp, PostFader);
@@ -186,10 +182,14 @@ Route::init ()
 		_amp->set_display_name (_("Monitor"));
 	}
 
-	/* and input trim */
+#if 0 // not used - just yet
+	if (!is_master() && !is_monitor() && !is_auditioner()) {
+		_delayline.reset (new DelayLine (_session, _name));
+		add_processor (_delayline, PreFader);
+	}
+#endif
 
-	_trim_control = boost::shared_ptr<GainControllable> (new GainControllable (_session, TrimAutomation, shared_from_this ()));
-	add_control (_trim_control);
+	/* and input trim */
 
 	_trim.reset (new Amp (_session, X_("Trim"), _trim_control, false));
 	_trim->set_display_to_user (false);
@@ -229,10 +229,6 @@ Route::init ()
 		_monitor_control->activate ();
 	}
 
-	if (is_master() || is_monitor() || is_auditioner()) {
-		_mute_master->set_solo_ignore (true);
-	}
-
 	/* now that we have _meter, its safe to connect to this */
 
 	{
@@ -264,120 +260,6 @@ Route::~Route ()
 	_processors.clear ();
 }
 
-void
-Route::set_remote_control_id (uint32_t id, bool notify_class_listeners)
-{
-	if (Config->get_remote_model() != UserOrdered) {
-		return;
-	}
-
-	set_remote_control_id_internal (id, notify_class_listeners);
-}
-
-void
-Route::set_remote_control_id_internal (uint32_t id, bool notify_class_listeners)
-{
-	/* force IDs for master/monitor busses and prevent
-	   any other route from accidentally getting these IDs
-	   (i.e. legacy sessions)
-	*/
-
-	if (is_master() && id != MasterBusRemoteControlID) {
-		id = MasterBusRemoteControlID;
-	}
-
-	if (is_monitor() && id != MonitorBusRemoteControlID) {
-		id = MonitorBusRemoteControlID;
-	}
-
-	if (id < 1) {
-		return;
-	}
-
-	/* don't allow it to collide */
-
-	if (!is_master () && !is_monitor() &&
-	    (id == MasterBusRemoteControlID || id == MonitorBusRemoteControlID)) {
-		id += MonitorBusRemoteControlID;
-	}
-
-	if (id != remote_control_id()) {
-		_remote_control_id = id;
-		RemoteControlIDChanged ();
-
-		if (notify_class_listeners) {
-			RemoteControlIDChange ();
-		}
-	}
-}
-
-uint32_t
-Route::remote_control_id() const
-{
-	if (is_master()) {
-		return MasterBusRemoteControlID;
-	}
-
-	if (is_monitor()) {
-		return MonitorBusRemoteControlID;
-	}
-
-	return _remote_control_id;
-}
-
-bool
-Route::has_order_key () const
-{
-	return _has_order_key;
-}
-
-uint32_t
-Route::order_key () const
-{
-	return _order_key;
-}
-
-void
-Route::set_remote_control_id_explicit (uint32_t rid)
-{
-	if (is_master() || is_monitor() || is_auditioner()) {
-		/* hard-coded remote IDs, or no remote ID */
-		return;
-	}
-
-	if (_remote_control_id != rid) {
-		DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("%1: set edit-based RID to %2\n", name(), rid));
-		_remote_control_id = rid;
-		RemoteControlIDChanged (); /* EMIT SIGNAL (per-route) */
-	}
-
-	/* don't emit the class-level RID signal RemoteControlIDChange here,
-	   leave that to the entity that changed the order key, so that we
-	   don't get lots of emissions for no good reasons (e.g. when changing
-	   all route order keys).
-
-	   See Session::sync_remote_id_from_order_keys() for the (primary|only)
-	   spot where that is emitted.
-	*/
-}
-
-void
-Route::set_order_key (uint32_t n)
-{
-	_has_order_key = true;
-
-	if (_order_key == n) {
-		return;
-	}
-
-	_order_key = n;
-
-	DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("%1 order key set to %2\n",
-						       name(), order_key ()));
-
-	_session.set_dirty ();
-}
-
 string
 Route::ensure_track_or_route_name(string name, Session &session)
 {
@@ -391,82 +273,10 @@ Route::ensure_track_or_route_name(string name, Session &session)
 }
 
 void
-Route::inc_gain (gain_t factor)
-{
-	/* To be used ONLY when doing group-relative gain adjustment, from
-	 * ::set_gain()
-	 */
-
-	float desired_gain = _gain_control->user_double();
-
-	if (fabsf (desired_gain) < GAIN_COEFF_SMALL) {
-		// really?! what's the idea here?
-		_gain_control->route_set_value (0.000001f + (0.000001f * factor));
-	} else {
-		_gain_control->route_set_value (desired_gain + (desired_gain * factor));
-	}
-}
-
-void
-Route::set_gain (gain_t val, Controllable::GroupControlDisposition group_override)
-{
-	if (use_group (group_override, &RouteGroup::is_gain)) {
-
-		if (_route_group->is_relative()) {
-
-			gain_t usable_gain = _gain_control->get_value();
-			if (usable_gain < 0.000001f) {
-				usable_gain = 0.000001f;
-			}
-
-			gain_t delta = val;
-			if (delta < 0.000001f) {
-				delta = 0.000001f;
-			}
-
-			delta -= usable_gain;
-
-			if (delta == 0.0f)
-				return;
-
-			gain_t factor = delta / usable_gain;
-
-			if (factor > 0.0f) {
-				factor = _route_group->get_max_factor(factor);
-				if (factor == 0.0f) {
-					_amp->gain_control()->Changed(); /* EMIT SIGNAL */
-					return;
-				}
-			} else {
-				factor = _route_group->get_min_factor(factor);
-				if (factor == 0.0f) {
-					_amp->gain_control()->Changed(); /* EMIT SIGNAL */
-					return;
-				}
-			}
-
-			_route_group->foreach_route (boost::bind (&Route::inc_gain, _1, factor));
-
-		} else {
-
-			_route_group->foreach_route (boost::bind (&Route::set_gain, _1, val, Controllable::NoGroup));
-		}
-
-		return;
-	}
-
-	if (val == _gain_control->get_value()) {
-		return;
-	}
-
-	_gain_control->route_set_value (val);
-}
-
-void
 Route::set_trim (gain_t val, Controllable::GroupControlDisposition /* group override */)
 {
 	// TODO route group, see set_gain()
-	_trim_control->route_set_value (val);
+	// _trim_control->route_set_value (val);
 }
 
 void
@@ -503,6 +313,8 @@ Route::process_output_buffers (BufferSet& bufs,
 		return;
 	}
 
+	_mute_control->automation_run (start_frame, nframes);
+
 	/* figure out if we're going to use gain automation */
 	if (gain_automation_ok) {
 		_amp->set_gain_automation_buffer (_session.gain_automation_buffer ());
@@ -543,7 +355,7 @@ Route::process_output_buffers (BufferSet& bufs,
 	   DENORMAL CONTROL/PHASE INVERT
 	   ----------------------------------------------------------------------------------------- */
 
-	if (_phase_invert.any ()) {
+	if (!_phase_control->none()) {
 
 		int chn = 0;
 
@@ -552,7 +364,7 @@ Route::process_output_buffers (BufferSet& bufs,
 			for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++chn) {
 				Sample* const sp = i->data();
 
-				if (_phase_invert[chn]) {
+				if (_phase_control->inverted (chn)) {
 					for (pframes_t nx = 0; nx < nframes; ++nx) {
 						sp[nx]  = -sp[nx];
 						sp[nx] += 1.0e-27f;
@@ -569,7 +381,7 @@ Route::process_output_buffers (BufferSet& bufs,
 			for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++chn) {
 				Sample* const sp = i->data();
 
-				if (_phase_invert[chn]) {
+				if (_phase_control->inverted (chn)) {
 					for (pframes_t nx = 0; nx < nframes; ++nx) {
 						sp[nx] = -sp[nx];
 					}
@@ -599,6 +411,7 @@ Route::process_output_buffers (BufferSet& bufs,
 	bool const meter_already_run = metering_state() == MeteringInput;
 
 	framecnt_t latency = 0;
+	const double speed = _session.transport_speed ();
 
 	for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
 
@@ -628,8 +441,13 @@ Route::process_output_buffers (BufferSet& bufs,
 		if (boost::dynamic_pointer_cast<Send>(*i) != 0) {
 			boost::dynamic_pointer_cast<Send>(*i)->set_delay_in(_signal_latency - latency);
 		}
+		if (boost::dynamic_pointer_cast<PluginInsert>(*i) != 0) {
+			const framecnt_t longest_session_latency = _initial_delay + _signal_latency;
+			boost::dynamic_pointer_cast<PluginInsert>(*i)->set_sidechain_latency (
+					_initial_delay + latency, longest_session_latency - latency);
+		}
 
-		(*i)->run (bufs, start_frame - latency, end_frame - latency, nframes, *i != _processors.back());
+		(*i)->run (bufs, start_frame - latency, end_frame - latency, speed, nframes, *i != _processors.back());
 		bufs.set_count ((*i)->output_streams());
 
 		if ((*i)->active ()) {
@@ -657,13 +475,14 @@ Route::bounce_process (BufferSet& buffers, framepos_t start, framecnt_t nframes,
 	_trim->setup_gain_automation (start, start + nframes, nframes);
 
 	latency = 0;
+	const double speed = _session.transport_speed ();
 	for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
 
 		if (!include_endpoint && (*i) == endpoint) {
 			break;
 		}
 
-		/* if we're not exporting, stop processing if we come across a routing processor. */
+		/* if we're *not* exporting, stop processing if we come across a routing processor. */
 		if (!for_export && boost::dynamic_pointer_cast<PortInsert>(*i)) {
 			break;
 		}
@@ -671,11 +490,23 @@ Route::bounce_process (BufferSet& buffers, framepos_t start, framecnt_t nframes,
 			break;
 		}
 
-		/* don't run any processors that does routing.
-		 * oh, and don't bother with the peak meter either.
+		/* special case the panner (export outputs)
+		 * Ideally we'd only run the panner, not the delivery itself...
+		 * but panners need separate input/output buffers and some context
+		 * (panshell, panner type, etc). AFAICT there is no ill side effect
+		 * of re-using the main delivery when freewheeling/exporting a region.
+		 */
+		if ((*i) == _main_outs) {
+			assert ((*i)->does_routing());
+			(*i)->run (buffers, start - latency, start - latency + nframes, speed, nframes, true);
+			buffers.set_count ((*i)->output_streams());
+		}
+
+		/* don't run any processors that do routing.
+		 * Also don't bother with metering.
 		 */
 		if (!(*i)->does_routing() && !boost::dynamic_pointer_cast<PeakMeter>(*i)) {
-			(*i)->run (buffers, start - latency, start - latency + nframes, nframes, true);
+			(*i)->run (buffers, start - latency, start - latency + nframes, 1.0, nframes, true);
 			buffers.set_count ((*i)->output_streams());
 			latency += (*i)->signal_latency ();
 		}
@@ -788,291 +619,38 @@ Route::passthru_silence (framepos_t start_frame, framepos_t end_frame, pframes_t
 }
 
 void
-Route::set_listen (bool yn, Controllable::GroupControlDisposition group_override)
-{
-	if (_solo_safe) {
-		return;
-	}
-
-	if (use_group (group_override, &RouteGroup::is_solo)) {
-		_route_group->foreach_route (boost::bind (&Route::set_listen, _1, yn, Controllable::NoGroup));
-		return;
-	}
-
-	if (_monitor_send) {
-		if (yn != _monitor_send->active()) {
-			if (yn) {
-				_monitor_send->activate ();
-				_mute_master->set_soloed_by_self (true);
-			} else {
-				_monitor_send->deactivate ();
-				_mute_master->set_soloed_by_self (false);
-			}
-			_mute_master->set_soloed_by_others (false);
-
-			listen_changed (group_override); /* EMIT SIGNAL */
-		}
-	}
-}
-
-bool
-Route::listening_via_monitor () const
+Route::set_listen (bool yn)
 {
 	if (_monitor_send) {
-		return _monitor_send->active ();
-	} else {
-		return false;
-	}
-}
-
-void
-Route::set_solo_safe (bool yn, Controllable::GroupControlDisposition /* group_override */)
-{
-	if (_solo_safe != yn) {
-		_solo_safe = yn;
-		solo_safe_changed (); /* EMIT SIGNAL */
-		_solo_safe_control->Changed(); /* EMIT SIGNAL */
-	}
-}
-
-bool
-Route::solo_safe() const
-{
-	return _solo_safe;
-}
-
-void
-Route::clear_all_solo_state ()
-{
-	// ideally this function will never do anything, it only exists to forestall Murphy
-	bool emit_changed = false;
-
-#ifndef NDEBUG
-	// these are really debug messages, but of possible interest.
-	if (_self_solo) {
-		PBD::info << string_compose (_("Cleared Explicit solo: %1\n"), name());
-	}
-	if (_soloed_by_others_upstream || _soloed_by_others_downstream) {
-		PBD::info << string_compose (_("Cleared Implicit solo: %1 up:%2 down:%3\n"),
-				name(), _soloed_by_others_upstream, _soloed_by_others_downstream);
-	}
-#endif
-
-	if (!_self_solo && (_soloed_by_others_upstream || _soloed_by_others_downstream)) {
-		// if self-soled, set_solo() will do signal emission
-		emit_changed = true;
-	}
-
-	_soloed_by_others_upstream = 0;
-	_soloed_by_others_downstream = 0;
-
-	{
-		PBD::Unwinder<bool> uw (_solo_safe, false);
-		set_solo (false, Controllable::NoGroup);
-	}
-
-	if (emit_changed) {
-		set_mute_master_solo ();
-		solo_changed (false, Controllable::UseGroup); /* EMIT SIGNAL */
-	}
-}
-
-void
-Route::set_solo (bool yn, Controllable::GroupControlDisposition group_override)
-{
-	if (_solo_safe) {
-		DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 ignore solo change due to solo-safe\n", name()));
-		return;
-	}
-
-	if (is_master() || is_monitor() || is_auditioner()) {
-		DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 ignore solo change (master, monitor or auditioner)\n", name()));
-		return;
-	}
-
-	if (use_group (group_override, &RouteGroup::is_solo)) {
-		_route_group->foreach_route (boost::bind (&Route::set_solo, _1, yn, Controllable::NoGroup));
-		return;
-	}
-
-	DEBUG_TRACE (DEBUG::Solo, string_compose ("%1: set solo => %2, grp ? %3 currently self-soloed ? %4\n",
-	                                          name(), yn, enum_2_string(group_override), self_soloed()));
-
-	if (self_soloed() != yn) {
-		set_self_solo (yn);
-		solo_changed (true, group_override); /* EMIT SIGNAL */
-		_solo_control->Changed (); /* EMIT SIGNAL */
-	}
-
-	assert (Config->get_solo_control_is_listen_control() || !_monitor_send || !_monitor_send->active());
-
-	/* XXX TRACKS DEVELOPERS: THIS LOGIC SUGGESTS THAT YOU ARE NOT AWARE OF
-	   Config->get_solo_mute_overrride().
-	*/
-
-	if (yn && Profile->get_trx()) {
-		set_mute (false, Controllable::UseGroup);
-	}
-}
-
-void
-Route::set_self_solo (bool yn)
-{
-	DEBUG_TRACE (DEBUG::Solo, string_compose ("%1: set SELF solo => %2\n", name(), yn));
-	_self_solo = yn;
-	set_mute_master_solo ();
-}
-
-void
-Route::mod_solo_by_others_upstream (int32_t delta)
-{
-	DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 mod solo-by-upstream by %2, current up = %3 down = %4\n",
-						  name(), delta, _soloed_by_others_upstream, _soloed_by_others_downstream));
-
-	uint32_t old_sbu = _soloed_by_others_upstream;
-
-	if (delta < 0) {
-		if (_soloed_by_others_upstream >= (uint32_t) abs (delta)) {
-			_soloed_by_others_upstream += delta;
-		} else {
-			_soloed_by_others_upstream = 0;
-		}
-	} else {
-		_soloed_by_others_upstream += delta;
-	}
-
-	DEBUG_TRACE (DEBUG::Solo, string_compose (
-		             "%1 SbU delta %2 = %3 old = %4 sbd %5 ss %6 exclusive %7\n",
-		             name(), delta, _soloed_by_others_upstream, old_sbu,
-		             _soloed_by_others_downstream, _self_solo, Config->get_exclusive_solo()));
-
-	/* push the inverse solo change to everything that feeds us.
-
-	   This is important for solo-within-group. When we solo 1 track out of N that
-	   feed a bus, that track will cause mod_solo_by_upstream (+1) to be called
-	   on the bus. The bus then needs to call mod_solo_by_downstream (-1) on all
-	   tracks that feed it. This will silence them if they were audible because
-	   of a bus solo, but the newly soloed track will still be audible (because
-	   it is self-soloed).
-
-	   but .. do this only when we are being told to solo-by-upstream (i.e delta = +1),
-	   not in reverse.
-	*/
-
-	if ((_self_solo || _soloed_by_others_downstream) &&
-	    ((old_sbu == 0 && _soloed_by_others_upstream > 0) ||
-	     (old_sbu > 0 && _soloed_by_others_upstream == 0))) {
-
-		if (delta > 0 || !Config->get_exclusive_solo()) {
-			DEBUG_TRACE (DEBUG::Solo, string_compose("\t ... INVERT push from %1\n", _name));
-			for (FedBy::iterator i = _fed_by.begin(); i != _fed_by.end(); ++i) {
-				if (i->sends_only) {
-					continue;
-				}
-				boost::shared_ptr<Route> sr = i->r.lock();
-				if (sr) {
-					sr->mod_solo_by_others_downstream (-delta);
-				}
-			}
-		}
-	}
-
-	set_mute_master_solo ();
-	solo_changed (false, Controllable::UseGroup); /* EMIT SIGNAL */
-}
-
-void
-Route::mod_solo_by_others_downstream (int32_t delta)
-{
-	DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 mod solo-by-downstream by %2, current up = %3 down = %4\n",
-						  name(), delta, _soloed_by_others_upstream, _soloed_by_others_downstream));
-
-	if (delta < 0) {
-		if (_soloed_by_others_downstream >= (uint32_t) abs (delta)) {
-			_soloed_by_others_downstream += delta;
+		if (yn) {
+			_monitor_send->activate ();
 		} else {
-			_soloed_by_others_downstream = 0;
+			_monitor_send->deactivate ();
 		}
-	} else {
-		_soloed_by_others_downstream += delta;
 	}
-
-	DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 SbD delta %2 = %3\n", name(), delta, _soloed_by_others_downstream));
-
-	set_mute_master_solo ();
-	solo_changed (false, Controllable::UseGroup); /* EMIT SIGNAL */
-}
-
-void
-Route::set_mute_master_solo ()
-{
-	_mute_master->set_soloed_by_self (self_soloed());
-	_mute_master->set_soloed_by_others (soloed_by_others_downstream() || soloed_by_others_upstream());
 }
 
 void
-Route::mod_solo_isolated_by_upstream (bool yn)
+Route::solo_control_changed (bool, Controllable::GroupControlDisposition)
 {
-	bool old = solo_isolated ();
-	DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 mod_solo_isolated_by_upstream cur: %2 d: %3\n",
-				name(), _solo_isolated_by_upstream, yn ? "+1" : "-1"));
-
-	if (!yn) {
-		if (_solo_isolated_by_upstream >= 1) {
-			_solo_isolated_by_upstream--;
-		} else {
-			_solo_isolated_by_upstream = 0;
-		}
-	} else {
-		_solo_isolated_by_upstream++;
-	}
+	/* nothing to do if we're not using AFL/PFL. But if we are, we need
+	   to alter the active state of the monitor send.
+	*/
 
-	if (solo_isolated() != old) {
-		/* solo isolated status changed */
-		_mute_master->set_solo_ignore (solo_isolated());
-		solo_isolated_changed (); /* EMIT SIGNAL */
+	if (Config->get_solo_control_is_listen_control ()) {
+		set_listen (_solo_control->self_soloed() || _solo_control->get_masters_value());
 	}
 }
 
 void
-Route::set_solo_isolated (bool yn, Controllable::GroupControlDisposition group_override)
+Route::push_solo_isolate_upstream (int32_t delta)
 {
-	if (is_master() || is_monitor() || is_auditioner()) {
-		return;
-	}
-
-	if (use_group (group_override, &RouteGroup::is_solo)) {
-		_route_group->foreach_route (boost::bind (&Route::set_solo_isolated, _1, yn, Controllable::NoGroup));
-		return;
-	}
-
-	bool changed = false;
-
-	if (yn) {
-		if (_solo_isolated == false) {
-			_mute_master->set_solo_ignore (true);
-			changed = true;
-		}
-		_solo_isolated = true;
-	} else {
-		if (_solo_isolated == true) {
-			_solo_isolated = false;
-			_mute_master->set_solo_ignore (false);
-			changed = true;
-		}
-	}
-
-
-	if (!changed) {
-		return;
-	}
-
 	/* forward propagate solo-isolate status to everything fed by this route, but not those via sends only */
 
 	boost::shared_ptr<RouteList> routes = _session.get_routes ();
 	for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
 
-		if ((*i).get() == this || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
+		if ((*i).get() == this || !(*i)->can_solo()) {
 			continue;
 		}
 
@@ -1080,75 +658,26 @@ Route::set_solo_isolated (bool yn, Controllable::GroupControlDisposition group_o
 		bool does_feed = feeds (*i, &sends_only);
 
 		if (does_feed && !sends_only) {
-			(*i)->mod_solo_isolated_by_upstream (yn);
+			(*i)->solo_isolate_control()->mod_solo_isolated_by_upstream (delta);
 		}
 	}
-
-	/* XXX should we back-propagate as well? (April 2010: myself and chris goddard think not) */
-
-	solo_isolated_changed (); /* EMIT SIGNAL */
-	_solo_isolate_control->Changed(); /* EMIT SIGNAL */
-}
-
-bool
-Route::solo_isolated () const
-{
-	return (_solo_isolated == true) || (_solo_isolated_by_upstream > 0);
 }
 
 void
-Route::set_mute_points (MuteMaster::MutePoint mp)
+Route::push_solo_upstream (int delta)
 {
-	_mute_master->set_mute_points (mp);
-	mute_points_changed (); /* EMIT SIGNAL */
-
-	if (_mute_master->muted_by_self()) {
-		mute_changed (); /* EMIT SIGNAL */
-		_mute_control->Changed (); /* EMIT SIGNAL */
-	}
-}
-
-void
-Route::set_mute (bool yn, Controllable::GroupControlDisposition group_override)
-{
-	if (use_group (group_override, &RouteGroup::is_mute)) {
-		_route_group->foreach_route (boost::bind (&Route::set_mute, _1, yn, Controllable::NoGroup));
-		return;
-	}
-
-	if (muted() != yn) {
-		_mute_master->set_muted_by_self (yn);
-		/* allow any derived classes to respond to the mute change
-		   before anybody else knows about it.
-		*/
-		act_on_mute ();
-		/* tell everyone else */
-		mute_changed (); /* EMIT SIGNAL */
-		_mute_control->Changed (); /* EMIT SIGNAL */
+	DEBUG_TRACE (DEBUG::Solo, string_compose("\t ... INVERT push from %1\n", _name));
+	for (FedBy::iterator i = _fed_by.begin(); i != _fed_by.end(); ++i) {
+		if (i->sends_only) {
+			continue;
+		}
+		boost::shared_ptr<Route> sr (i->r.lock());
+		if (sr) {
+			sr->solo_control()->mod_solo_by_others_downstream (-delta);
+		}
 	}
 }
 
-bool
-Route::muted () const
-{
-	return _mute_master->muted_by_self();
-}
-
-bool
-Route::muted_by_others () const
-{
-	// This method is only used by route_ui for display state.
-	// The real thing is MuteMaster::muted_by_others_at()
-
-	//master is never muted by others
-	if (is_master())
-		return false;
-
-	//now check to see if something is soloed (and I am not)
-	//see also MuteMaster::mute_gain_at()
-	return (_session.soloing() && !soloed() && !solo_isolated());
-}
-
 #if 0
 static void
 dump_processors(const string& name, const list<boost::shared_ptr<Processor> >& procs)
@@ -1241,89 +770,37 @@ Route::add_processor (boost::shared_ptr<Processor> processor, boost::shared_ptr<
 	DEBUG_TRACE (DEBUG::Processors, string_compose (
 		             "%1 adding processor %2\n", name(), processor->name()));
 
-	if (!AudioEngine::instance()->connected() || !processor) {
-		return 1;
-	}
+	ProcessorList pl;
 
-	{
-		Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
-		Glib::Threads::RWLock::WriterLock lm (_processor_lock);
-		ProcessorState pstate (this);
-
-		boost::shared_ptr<PluginInsert> pi;
-		boost::shared_ptr<PortInsert> porti;
-
-		if (processor == _amp) {
-			/* Ensure that only one amp is in the list at any time */
-			ProcessorList::iterator check = find (_processors.begin(), _processors.end(), processor);
-			if (check != _processors.end()) {
-				if (before == _amp) {
-					/* Already in position; all is well */
-					return 0;
-				} else {
-					_processors.erase (check);
-				}
-			}
-		}
-
-		assert (find (_processors.begin(), _processors.end(), processor) == _processors.end ());
+	pl.push_back (processor);
+	int rv = add_processors (pl, before, err);
 
-		ProcessorList::iterator loc;
-		if (before) {
-			/* inserting before a processor; find it */
-			loc = find (_processors.begin(), _processors.end(), before);
-			if (loc == _processors.end ()) {
-				/* Not found */
-				return 1;
-			}
-		} else {
-			/* inserting at end */
-			loc = _processors.end ();
-		}
-
-		_processors.insert (loc, processor);
-		processor->set_owner (this);
-
-		// Set up processor list channels.  This will set processor->[input|output]_streams(),
-		// configure redirect ports properly, etc.
-
-		{
-			if (configure_processors_unlocked (err)) {
-				pstate.restore ();
-				configure_processors_unlocked (0); // it worked before we tried to add it ...
-				return -1;
-			}
-		}
-
-		if ((pi = boost::dynamic_pointer_cast<PluginInsert>(processor)) != 0) {
-
-			if (pi->has_no_inputs ()) {
-				/* generator plugin */
-				_have_internal_generator = true;
-			}
-
-		}
-
-		if (activation_allowed && (!_session.get_bypass_all_loaded_plugins () || !processor->display_to_user ())) {
-			processor->activate ();
-		}
-
-		processor->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
-
-		_output->set_user_latency (0);
+	if (rv) {
+		return rv;
 	}
 
-	reset_instrument_info ();
-	processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
-	set_processor_positions ();
+	if (activation_allowed && (!_session.get_bypass_all_loaded_plugins () || !processor->display_to_user ())) {
+		processor->activate ();
+	}
 
 	return 0;
 }
 
+void
+Route::processor_selfdestruct (boost::weak_ptr<Processor> wp)
+{
+	/* We cannot destruct the processor here (usually RT-thread
+	 * with various locks held - in case of sends also io_locks).
+	 * Queue for deletion in low-priority thread.
+	 */
+	Glib::Threads::Mutex::Lock lx (selfdestruct_lock);
+	selfdestruct_sequence.push_back (wp);
+}
+
 bool
 Route::add_processor_from_xml_2X (const XMLNode& node, int version)
 {
-	const XMLProperty *prop;
+	XMLProperty const * prop;
 
 	try {
 		boost::shared_ptr<Processor> processor;
@@ -1361,6 +838,7 @@ Route::add_processor_from_xml_2X (const XMLNode& node, int version)
 						processor.reset (new UnknownProcessor (_session, node));
 					} else {
 						processor.reset (new PluginInsert (_session));
+						processor->set_owner (this);
 					}
 
 				} else {
@@ -1404,29 +882,89 @@ Route::add_processor_from_xml_2X (const XMLNode& node, int version)
 	}
 }
 
+
+inline Route::PluginSetupOptions operator|= (Route::PluginSetupOptions& a, const Route::PluginSetupOptions& b) {
+	return a = static_cast<Route::PluginSetupOptions> (static_cast <int>(a) | static_cast<int> (b));
+}
+
+inline Route::PluginSetupOptions operator&= (Route::PluginSetupOptions& a, const Route::PluginSetupOptions& b) {
+	return a = static_cast<Route::PluginSetupOptions> (static_cast <int>(a) & static_cast<int> (b));
+}
+
 int
 Route::add_processors (const ProcessorList& others, boost::shared_ptr<Processor> before, ProcessorStreams* err)
 {
-	/* NOTE: this is intended to be used ONLY when copying
-	   processors from another Route. Hence the subtle
-	   differences between this and ::add_processor()
-	*/
+	ProcessorList::iterator loc;
+
+	if (before) {
+		loc = find(_processors.begin(), _processors.end(), before);
+		if (loc == _processors.end ()) {
+			return 1;
+		}
+	} else {
+		/* nothing specified - at end */
+		loc = _processors.end ();
+	}
+
+	if (!AudioEngine::instance()->connected()) {
+		return 1;
+	}
+
+	if (others.empty()) {
+		return 0;
+	}
+
+	ProcessorList to_skip;
+
+	// check if there's an instrument to replace or configure
+	for (ProcessorList::const_iterator i = others.begin(); i != others.end(); ++i) {
+		boost::shared_ptr<PluginInsert> pi;
+		if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) == 0) {
+			continue;
+		}
+		if (!pi->plugin ()->get_info ()->is_instrument ()) {
+			continue;
+		}
+		boost::shared_ptr<Processor> instrument = the_instrument ();
+		ChanCount in (DataType::MIDI, 1);
+		ChanCount out (DataType::AUDIO, 2); // XXX route's out?!
+
+		PluginSetupOptions flags = None;
+		if (instrument) {
+			flags |= CanReplace;
+			in = instrument->input_streams ();
+			out = instrument->output_streams ();
+		}
+		if (pi->has_output_presets (in, out)) {
+			flags |= MultiOut;
+		}
 
-	ProcessorList::iterator loc;
+		pi->set_strict_io (_strict_io);
 
-	if (before) {
-		loc = find(_processors.begin(), _processors.end(), before);
-	} else {
-		/* nothing specified - at end */
-		loc = _processors.end ();
-	}
+		PluginSetupOptions mask = None;
+		if (Config->get_ask_replace_instrument ()) {
+			mask |= CanReplace;
+		}
+		if (Config->get_ask_setup_instrument ()) {
+			mask |= MultiOut;
+		}
 
-	if (!_session.engine().connected()) {
-		return 1;
-	}
+		flags &= mask;
 
-	if (others.empty()) {
-		return 0;
+		if (flags != None) {
+			boost::optional<int> rv = PluginSetup (shared_from_this (), pi, flags);  /* EMIT SIGNAL */
+			switch (rv.get_value_or (0)) {
+				case 1:
+					to_skip.push_back (*i); // don't add this one;
+					break;
+				case 2:
+					replace_processor (instrument, *i, err);
+					to_skip.push_back (*i);
+					break;
+				default:
+					break;
+			}
+		}
 	}
 
 	{
@@ -1439,30 +977,59 @@ Route::add_processors (const ProcessorList& others, boost::shared_ptr<Processor>
 			if (*i == _meter) {
 				continue;
 			}
+			ProcessorList::iterator check = find (to_skip.begin(), to_skip.end(), *i);
+			if (check != to_skip.end()) {
+				continue;
+			}
 
 			boost::shared_ptr<PluginInsert> pi;
 
 			if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
-				pi->set_count (1);
+				pi->set_strict_io (_strict_io);
+			}
+
+			if (*i == _amp) {
+				/* Ensure that only one amp is in the list at any time */
+				ProcessorList::iterator check = find (_processors.begin(), _processors.end(), *i);
+				if (check != _processors.end()) {
+					if (before == _amp) {
+						/* Already in position; all is well */
+						continue;
+					} else {
+						_processors.erase (check);
+					}
+				}
 			}
 
+			assert (find (_processors.begin(), _processors.end(), *i) == _processors.end ());
+
 			_processors.insert (loc, *i);
 			(*i)->set_owner (this);
 
-			if ((*i)->active()) {
-				(*i)->activate ();
-			}
-
-			/* Think: does this really need to be called for every processor in the loop? */
 			{
-				if (configure_processors_unlocked (err)) {
+				if (configure_processors_unlocked (err, &lm)) {
 					pstate.restore ();
-					configure_processors_unlocked (0); // it worked before we tried to add it ...
+					configure_processors_unlocked (0, &lm); // it worked before we tried to add it ...
 					return -1;
 				}
 			}
 
+			if (pi && pi->has_sidechain ()) {
+				pi->sidechain_input ()->changed.connect_same_thread (*this, boost::bind (&Route::sidechain_change_handler, this, _1, _2));
+			}
+
+			if ((*i)->active()) {
+				// emit ActiveChanged() and latency_changed() if needed
+				(*i)->activate ();
+			}
+
 			(*i)->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
+
+			boost::shared_ptr<Send> send;
+			if ((send = boost::dynamic_pointer_cast<Send> (*i))) {
+				send->SelfDestruct.connect_same_thread (*this,
+						boost::bind (&Route::processor_selfdestruct, this, boost::weak_ptr<Processor> (*i)));
+			}
 		}
 
 		for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
@@ -1511,7 +1078,7 @@ Route::disable_processors (Placement p)
 	placement_range(p, start, end);
 
 	for (ProcessorList::iterator i = start; i != end; ++i) {
-		(*i)->deactivate ();
+		(*i)->enable (false);
 	}
 
 	_session.set_dirty ();
@@ -1525,7 +1092,7 @@ Route::disable_processors ()
 	Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
 
 	for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
-		(*i)->deactivate ();
+		(*i)->enable (false);
 	}
 
 	_session.set_dirty ();
@@ -1544,7 +1111,7 @@ Route::disable_plugins (Placement p)
 
 	for (ProcessorList::iterator i = start; i != end; ++i) {
 		if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
-			(*i)->deactivate ();
+			(*i)->enable (false);
 		}
 	}
 
@@ -1560,7 +1127,7 @@ Route::disable_plugins ()
 
 	for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
 		if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
-			(*i)->deactivate ();
+			(*i)->enable (false);
 		}
 	}
 
@@ -1584,8 +1151,8 @@ Route::ab_plugins (bool forward)
 				continue;
 			}
 
-			if ((*i)->active()) {
-				(*i)->deactivate ();
+			if ((*i)->enabled ()) {
+				(*i)->enable (false);
 				(*i)->set_next_ab_is_active (true);
 			} else {
 				(*i)->set_next_ab_is_active (false);
@@ -1602,11 +1169,7 @@ Route::ab_plugins (bool forward)
 				continue;
 			}
 
-			if ((*i)->get_next_ab_is_active()) {
-				(*i)->activate ();
-			} else {
-				(*i)->deactivate ();
-			}
+			(*i)->enable ((*i)->get_next_ab_is_active ());
 		}
 	}
 
@@ -1675,7 +1238,7 @@ Route::clear_processors (Placement p)
 		}
 
 		_processors = new_list;
-		configure_processors_unlocked (&err); // this can't fail
+		configure_processors_unlocked (&err, &lm); // this can't fail
 	}
 
 	processor_max_streams.reset();
@@ -1747,9 +1310,15 @@ Route::remove_processor (boost::shared_ptr<Processor> processor, ProcessorStream
 				   run.
 				*/
 
-				boost::shared_ptr<IOProcessor> iop;
+				boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor> (*i);
+				boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert>(*i);
+
+				if (pi != 0) {
+					assert (iop == 0);
+					iop = pi->sidechain();
+				}
 
-				if ((iop = boost::dynamic_pointer_cast<IOProcessor> (*i)) != 0) {
+				if (iop != 0) {
 					iop->disconnect ();
 				}
 
@@ -1769,10 +1338,10 @@ Route::remove_processor (boost::shared_ptr<Processor> processor, ProcessorStream
 			return 1;
 		}
 
-		if (configure_processors_unlocked (err)) {
+		if (configure_processors_unlocked (err, &lm)) {
 			pstate.restore ();
 			/* we know this will work, because it worked before :) */
-			configure_processors_unlocked (0);
+			configure_processors_unlocked (0, &lm);
 			return -1;
 		}
 
@@ -1802,6 +1371,104 @@ Route::remove_processor (boost::shared_ptr<Processor> processor, ProcessorStream
 }
 
 int
+Route::replace_processor (boost::shared_ptr<Processor> old, boost::shared_ptr<Processor> sub, ProcessorStreams* err)
+{
+	/* these can never be removed */
+	if (old == _amp || old == _meter || old == _main_outs || old == _delayline || old == _trim) {
+		return 1;
+	}
+	/* and can't be used as substitute, either */
+	if (sub == _amp || sub == _meter || sub == _main_outs || sub == _delayline || sub == _trim) {
+		return 1;
+	}
+
+	/* I/Os are out, too */
+	if (boost::dynamic_pointer_cast<IOProcessor> (old) || boost::dynamic_pointer_cast<IOProcessor> (sub)) {
+		return 1;
+	}
+
+	/* this function cannot be used to swap/reorder processors */
+	if (find (_processors.begin(), _processors.end(), sub) != _processors.end ()) {
+		return 1;
+	}
+
+	if (!AudioEngine::instance()->connected() || !old || !sub) {
+		return 1;
+	}
+
+	/* ensure that sub is not owned by another route */
+	if (sub->owner ()) {
+		return 1;
+	}
+
+	{
+		Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
+		Glib::Threads::RWLock::WriterLock lm (_processor_lock);
+		ProcessorState pstate (this);
+
+		assert (find (_processors.begin(), _processors.end(), sub) == _processors.end ());
+
+		ProcessorList::iterator i;
+		bool replaced = false;
+		bool enable = old->enabled ();
+
+		for (i = _processors.begin(); i != _processors.end(); ) {
+			if (*i == old) {
+				i = _processors.erase (i);
+				_processors.insert (i, sub);
+				sub->set_owner (this);
+				replaced = true;
+				break;
+			} else {
+				++i;
+			}
+		}
+
+		if (!replaced) {
+			return 1;
+		}
+
+		if (_strict_io) {
+			boost::shared_ptr<PluginInsert> pi;
+			if ((pi = boost::dynamic_pointer_cast<PluginInsert>(sub)) != 0) {
+				pi->set_strict_io (true);
+			}
+		}
+
+		if (configure_processors_unlocked (err, &lm)) {
+			pstate.restore ();
+			configure_processors_unlocked (0, &lm);
+			return -1;
+		}
+
+		_have_internal_generator = false;
+
+		for (i = _processors.begin(); i != _processors.end(); ++i) {
+			boost::shared_ptr<PluginInsert> pi;
+			if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
+				if (pi->has_no_inputs ()) {
+					_have_internal_generator = true;
+					break;
+				}
+			}
+		}
+
+		if (enable) {
+			sub->enable (true);
+		}
+
+		sub->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
+		_output->set_user_latency (0);
+	}
+
+	reset_instrument_info ();
+	old->drop_references ();
+	processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
+	set_processor_positions ();
+	return 0;
+}
+
+int
 Route::remove_processors (const ProcessorList& to_be_deleted, ProcessorStreams* err)
 {
 	ProcessorList deleted;
@@ -1843,9 +1510,14 @@ Route::remove_processors (const ProcessorList& to_be_deleted, ProcessorStreams*
 			   run.
 			*/
 
-			boost::shared_ptr<IOProcessor> iop;
+			boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor>(processor);
+			boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert>(processor);
+			if (pi != 0) {
+				assert (iop == 0);
+				iop = pi->sidechain();
+			}
 
-			if ((iop = boost::dynamic_pointer_cast<IOProcessor> (processor)) != 0) {
+			if (iop != 0) {
 				iop->disconnect ();
 			}
 
@@ -1860,10 +1532,10 @@ Route::remove_processors (const ProcessorList& to_be_deleted, ProcessorStreams*
 
 		_output->set_user_latency (0);
 
-		if (configure_processors_unlocked (err)) {
+		if (configure_processors_unlocked (err, &lm)) {
 			pstate.restore ();
 			/* we know this will work, because it worked before :) */
-			configure_processors_unlocked (0);
+			configure_processors_unlocked (0, &lm);
 			return -1;
 		}
 		//lx.unlock();
@@ -1914,7 +1586,7 @@ Route::configure_processors (ProcessorStreams* err)
 
 	if (!_in_configure_processors) {
 		Glib::Threads::RWLock::WriterLock lm (_processor_lock);
-		return configure_processors_unlocked (err);
+		return configure_processors_unlocked (err, &lm);
 	}
 
 	return 0;
@@ -1948,6 +1620,33 @@ Route::try_configure_processors_unlocked (ChanCount in, ProcessorStreams* err)
 	for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++index) {
 
 		if ((*p)->can_support_io_configuration(in, out)) {
+
+			if (boost::dynamic_pointer_cast<Delivery> (*p)
+					&& boost::dynamic_pointer_cast<Delivery> (*p)->role() == Delivery::Main
+					&& !is_auditioner()
+					&& (is_monitor() || _strict_io || Profile->get_mixbus ())) {
+				/* with strict I/O the panner + output are forced to
+				 * follow the last processor's output.
+				 *
+				 * Delivery::can_support_io_configuration() will only add ports,
+				 * but not remove excess ports.
+				 *
+				 * This works because the delivery only requires
+				 * as many outputs as there are inputs.
+				 * Delivery::configure_io() will do the actual removal
+				 * by calling _output->ensure_io()
+				 */
+				if (!is_master() && _session.master_out () && in.n_audio() > 0) {
+					/* ..but at least as many as there are master-inputs, if
+					 * the delivery is dealing with audio */
+					// XXX this may need special-casing for mixbus (master-outputs)
+					// and should maybe be a preference anyway ?!
+					out = ChanCount::max (in, _session.master_out ()->n_inputs ());
+				} else {
+					out = in;
+				}
+			}
+
 			DEBUG_TRACE (DEBUG::Processors, string_compose ("\t%1 ID=%2 in=%3 out=%4\n",(*p)->name(), (*p)->id(), in, out));
 			configuration.push_back(make_pair(in, out));
 
@@ -2004,7 +1703,7 @@ Route::try_configure_processors_unlocked (ChanCount in, ProcessorStreams* err)
  *  Return 0 on success, otherwise configuration is impossible.
  */
 int
-Route::configure_processors_unlocked (ProcessorStreams* err)
+Route::configure_processors_unlocked (ProcessorStreams* err, Glib::Threads::RWLock::WriterLock* lm)
 {
 #ifndef PLATFORM_WINDOWS
 	assert (!AudioEngine::instance()->process_lock().trylock());
@@ -2031,21 +1730,54 @@ Route::configure_processors_unlocked (ProcessorStreams* err)
 	processor_out_streams = _input->n_ports();
 	processor_max_streams.reset();
 
+	/* processor configure_io() may result in adding ports
+	 * e.g. Delivery::configure_io -> ARDOUR::IO::ensure_io ()
+	 *
+	 * with jack2 adding ports results in a graph-order callback,
+	 * which calls Session::resort_routes() and eventually
+	 * Route::direct_feeds_according_to_reality()
+	 * which takes a ReaderLock (_processor_lock).
+	 *
+	 * so we can't hold a WriterLock here until jack2 threading
+	 * is fixed.
+	 *
+	 * NB. we still hold the process lock
+	 *
+	 * (ardour's own engines do call graph-order from the
+	 * process-thread and hence do not have this issue; besides
+	 * merely adding ports won't trigger a graph-order, only
+	 * making connections does)
+	 */
+	lm->release ();
+
+	// TODO check for a potential ReaderLock after ReaderLock ??
+	Glib::Threads::RWLock::ReaderLock lr (_processor_lock);
+
 	list< pair<ChanCount,ChanCount> >::iterator c = configuration.begin();
 	for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++c) {
 
 		if (!(*p)->configure_io(c->first, c->second)) {
 			DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configuration failed\n", _name));
+			_in_configure_processors = false;
+			lr.release ();
+			lm->acquire ();
+			return -1;
 		}
 		processor_max_streams = ChanCount::max(processor_max_streams, c->first);
 		processor_max_streams = ChanCount::max(processor_max_streams, c->second);
 
+		boost::shared_ptr<IOProcessor> iop;
 		boost::shared_ptr<PluginInsert> pi;
 		if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*p)) != 0) {
-			/* plugins connected via Split Match may have more channels.
-			 * route/scratch buffers are needed for all of them*/
-			processor_max_streams = ChanCount::max(processor_max_streams, pi->input_streams());
-			processor_max_streams = ChanCount::max(processor_max_streams, pi->natural_input_streams());
+			/* plugins connected via Split or Hide Match may have more channels.
+			 * route/scratch buffers are needed for all of them
+			 * The configuration may only be a subset (both input and output)
+			 */
+			processor_max_streams = ChanCount::max(processor_max_streams, pi->required_buffers());
+		}
+		else if ((iop = boost::dynamic_pointer_cast<IOProcessor>(*p)) != 0) {
+			processor_max_streams = ChanCount::max(processor_max_streams, iop->natural_input_streams());
+			processor_max_streams = ChanCount::max(processor_max_streams, iop->natural_output_streams());
 		}
 		out = c->second;
 
@@ -2062,6 +1794,9 @@ Route::configure_processors_unlocked (ProcessorStreams* err)
 		}
 	}
 
+	lr.release ();
+	lm->acquire ();
+
 
 	if (_meter) {
 		_meter->set_max_channels (processor_max_streams);
@@ -2094,12 +1829,7 @@ Route::all_visible_processors_active (bool state)
 		if (!(*i)->display_to_user() || boost::dynamic_pointer_cast<Amp> (*i)) {
 			continue;
 		}
-
-		if (state) {
-			(*i)->activate ();
-		} else {
-			(*i)->deactivate ();
-		}
+		(*i)->enable (state);
 	}
 
 	_session.set_dirty ();
@@ -2249,33 +1979,233 @@ Route::reorder_processors (const ProcessorList& new_order, ProcessorStreams* err
 
 	if (processors_reorder_needs_configure (new_order) || !AudioEngine::instance()->running()) {
 
-		Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
-		Glib::Threads::RWLock::WriterLock lm (_processor_lock);
-		ProcessorState pstate (this);
+		Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
+		Glib::Threads::RWLock::WriterLock lm (_processor_lock);
+		ProcessorState pstate (this);
+
+		apply_processor_order (new_order);
+
+		if (configure_processors_unlocked (err, &lm)) {
+			pstate.restore ();
+			return -1;
+		}
+
+		lm.release();
+		lx.release();
+
+		processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
+		set_processor_positions ();
+
+	} else {
+		DEBUG_TRACE (DEBUG::Processors, "Queue clickless processor re-order.\n");
+		Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
+
+		// _pending_processor_order is protected by _processor_lock
+		_pending_processor_order = new_order;
+		g_atomic_int_set (&_pending_process_reorder, 1);
+	}
+
+	return 0;
+}
+
+bool
+Route::add_remove_sidechain (boost::shared_ptr<Processor> proc, bool add)
+{
+	boost::shared_ptr<PluginInsert> pi;
+	if ((pi = boost::dynamic_pointer_cast<PluginInsert>(proc)) == 0) {
+		return false;
+	}
+
+	if (pi->has_sidechain () == add) {
+		return true; // ?? call failed, but result is as expected.
+	}
+
+	{
+		Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
+		ProcessorList::iterator i = find (_processors.begin(), _processors.end(), proc);
+		if (i == _processors.end ()) {
+			return false;
+		}
+	}
+
+	{
+		Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ()); // take before Writerlock to avoid deadlock
+		Glib::Threads::RWLock::WriterLock lm (_processor_lock);
+		PBD::Unwinder<bool> uw (_in_sidechain_setup, true);
+
+		lx.release (); // IO::add_port() and ~IO takes process lock  - XXX check if this is safe
+		if (add) {
+			if (!pi->add_sidechain ()) {
+				return false;
+			}
+		} else {
+			if (!pi->del_sidechain ()) {
+				return false;
+			}
+		}
+
+		lx.acquire ();
+		list<pair<ChanCount, ChanCount> > c = try_configure_processors_unlocked (n_inputs (), 0);
+		lx.release ();
+
+		if (c.empty()) {
+			if (add) {
+				pi->del_sidechain ();
+			} else {
+				pi->add_sidechain ();
+				// TODO restore side-chain's state.
+			}
+			return false;
+		}
+		lx.acquire ();
+		configure_processors_unlocked (0, &lm);
+	}
+
+	if (pi->has_sidechain ()) {
+		pi->sidechain_input ()->changed.connect_same_thread (*this, boost::bind (&Route::sidechain_change_handler, this, _1, _2));
+	}
+
+	processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
+	_session.set_dirty ();
+	return true;
+}
+
+bool
+Route::plugin_preset_output (boost::shared_ptr<Processor> proc, ChanCount outs)
+{
+	boost::shared_ptr<PluginInsert> pi;
+	if ((pi = boost::dynamic_pointer_cast<PluginInsert>(proc)) == 0) {
+		return false;
+	}
+
+	{
+		Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
+		ProcessorList::iterator i = find (_processors.begin(), _processors.end(), proc);
+		if (i == _processors.end ()) {
+			return false;
+		}
+	}
+
+	{
+		Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
+		Glib::Threads::RWLock::WriterLock lm (_processor_lock);
+
+		const ChanCount& old (pi->preset_out ());
+		if (!pi->set_preset_out (outs)) {
+			return true; // no change, OK
+		}
+
+		list<pair<ChanCount, ChanCount> > c = try_configure_processors_unlocked (n_inputs (), 0);
+		if (c.empty()) {
+			/* not possible */
+			pi->set_preset_out (old);
+			return false;
+		}
+		configure_processors_unlocked (0, &lm);
+	}
+
+	processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
+	_session.set_dirty ();
+	return true;
+}
+
+bool
+Route::reset_plugin_insert (boost::shared_ptr<Processor> proc)
+{
+	ChanCount unused;
+	return customize_plugin_insert (proc, 0, unused, unused);
+}
+
+bool
+Route::customize_plugin_insert (boost::shared_ptr<Processor> proc, uint32_t count, ChanCount outs, ChanCount sinks)
+{
+	boost::shared_ptr<PluginInsert> pi;
+	if ((pi = boost::dynamic_pointer_cast<PluginInsert>(proc)) == 0) {
+		return false;
+	}
+
+	{
+		Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
+		ProcessorList::iterator i = find (_processors.begin(), _processors.end(), proc);
+		if (i == _processors.end ()) {
+			return false;
+		}
+	}
+
+	{
+		Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
+		Glib::Threads::RWLock::WriterLock lm (_processor_lock);
+
+		bool      old_cust  = pi->custom_cfg ();
+		uint32_t  old_cnt   = pi->get_count ();
+		ChanCount old_chan  = pi->output_streams ();
+		ChanCount old_sinks = pi->natural_input_streams ();
+
+		if (count == 0) {
+			pi->set_custom_cfg (false);
+		} else {
+			pi->set_custom_cfg (true);
+			pi->set_count (count);
+			pi->set_outputs (outs);
+			pi->set_sinks (sinks);
+		}
+
+		list<pair<ChanCount, ChanCount> > c = try_configure_processors_unlocked (n_inputs (), 0);
+		if (c.empty()) {
+			/* not possible */
+
+			pi->set_count (old_cnt);
+			pi->set_sinks (old_sinks);
+			pi->set_outputs (old_chan);
+			pi->set_custom_cfg (old_cust);
+
+			return false;
+		}
+		configure_processors_unlocked (0, &lm);
+	}
+
+	processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
+	_session.set_dirty ();
+	return true;
+}
 
-		apply_processor_order (new_order);
+bool
+Route::set_strict_io (const bool enable)
+{
+	Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
 
-		if (configure_processors_unlocked (err)) {
-			pstate.restore ();
-			return -1;
+	if (_strict_io != enable) {
+		_strict_io = enable;
+		Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
+		for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p) {
+			boost::shared_ptr<PluginInsert> pi;
+			if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*p)) != 0) {
+				pi->set_strict_io (_strict_io);
+			}
 		}
 
-		lm.release();
-		lx.release();
+		list<pair<ChanCount, ChanCount> > c = try_configure_processors_unlocked (n_inputs (), 0);
 
-		processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
-		set_processor_positions ();
+		if (c.empty()) {
+			// not possible
+			_strict_io = !enable; // restore old value
+			for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p) {
+				boost::shared_ptr<PluginInsert> pi;
+				if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*p)) != 0) {
+					pi->set_strict_io (_strict_io);
+				}
+			}
+			return false;
+		}
+		lm.release ();
 
-	} else {
-		DEBUG_TRACE (DEBUG::Processors, "Queue clickless processor re-order.\n");
-		Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
+		configure_processors (0);
+		lx.release ();
 
-		// _pending_processor_order is protected by _processor_lock
-		_pending_processor_order = new_order;
-		g_atomic_int_set (&_pending_process_reorder, 1);
+		processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
+		_session.set_dirty ();
 	}
-
-	return 0;
+	return true;
 }
 
 XMLNode&
@@ -2293,6 +2223,7 @@ Route::get_template()
 XMLNode&
 Route::state(bool full_state)
 {
+	LocaleGuard lg;
 	if (!_session._template_state_dir.empty()) {
 		assert (!full_state); // only for templates
 		foreach_processor (sigc::bind (sigc::mem_fun (*this, &Route::set_plugin_state_dir), _session._template_state_dir));
@@ -2306,15 +2237,12 @@ Route::state(bool full_state)
 	node->add_property("id", buf);
 	node->add_property ("name", _name);
 	node->add_property("default-type", _default_type.to_string());
+	node->add_property ("strict-io", _strict_io);
 
-	if (_flags) {
-		node->add_property("flags", enum_2_string (_flags));
-	}
+	node->add_child_nocopy (_presentation_info.get_state());
 
 	node->add_property("active", _active?"yes":"no");
 	string p;
-	boost::to_string (_phase_invert, p);
-	node->add_property("phase-invert", p);
 	node->add_property("denormal-protection", _denormal_protection?"yes":"no");
 	node->add_property("meter-point", enum_2_string (_meter_point));
 
@@ -2324,31 +2252,21 @@ Route::state(bool full_state)
 		node->add_property("route-group", _route_group->name());
 	}
 
-	snprintf (buf, sizeof (buf), "%d", _order_key);
-	node->add_property ("order-key", buf);
-	node->add_property ("self-solo", (_self_solo ? "yes" : "no"));
-	snprintf (buf, sizeof (buf), "%d", _soloed_by_others_upstream);
-	node->add_property ("soloed-by-upstream", buf);
-	snprintf (buf, sizeof (buf), "%d", _soloed_by_others_downstream);
-	node->add_property ("soloed-by-downstream", buf);
-	node->add_property ("solo-isolated", solo_isolated() ? "yes" : "no");
-	node->add_property ("solo-safe", _solo_safe ? "yes" : "no");
+	node->add_child_nocopy (_solo_control->get_state ());
+	node->add_child_nocopy (_solo_isolate_control->get_state ());
+	node->add_child_nocopy (_solo_safe_control->get_state ());
 
 	node->add_child_nocopy (_input->state (full_state));
 	node->add_child_nocopy (_output->state (full_state));
-	node->add_child_nocopy (_solo_control->get_state ());
-	node->add_child_nocopy (_mute_control->get_state ());
 	node->add_child_nocopy (_mute_master->get_state ());
 
+	node->add_child_nocopy (_mute_control->get_state ());
+	node->add_child_nocopy (_phase_control->get_state ());
+
 	if (full_state) {
 		node->add_child_nocopy (Automatable::get_automation_xml_state ());
 	}
 
-	XMLNode* remote_control_node = new XMLNode (X_("RemoteControl"));
-	snprintf (buf, sizeof (buf), "%d", _remote_control_id);
-	remote_control_node->add_property (X_("id"), buf);
-	node->add_child_nocopy (*remote_control_node);
-
 	if (_comment.length()) {
 		XMLNode *cmt = node->add_child ("Comment");
 		cmt->add_content (_comment);
@@ -2358,26 +2276,29 @@ Route::state(bool full_state)
 		node->add_child_nocopy (_pannable->state (full_state));
 	}
 
-	for (i = _processors.begin(); i != _processors.end(); ++i) {
-		if (!full_state) {
-			/* template save: do not include internal sends functioning as
-			   aux sends because the chance of the target ID
-			   in the session where this template is used
-			   is not very likely.
-
-			   similarly, do not save listen sends which connect to
-			   the monitor section, because these will always be
-			   added if necessary.
-			*/
-			boost::shared_ptr<InternalSend> is;
+	{
+		Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
+		for (i = _processors.begin(); i != _processors.end(); ++i) {
+			if (!full_state) {
+				/* template save: do not include internal sends functioning as
+					 aux sends because the chance of the target ID
+					 in the session where this template is used
+					 is not very likely.
+
+					 similarly, do not save listen sends which connect to
+					 the monitor section, because these will always be
+					 added if necessary.
+					 */
+				boost::shared_ptr<InternalSend> is;
 
-			if ((is = boost::dynamic_pointer_cast<InternalSend> (*i)) != 0) {
-				if (is->role() == Delivery::Listen) {
-					continue;
+				if ((is = boost::dynamic_pointer_cast<InternalSend> (*i)) != 0) {
+					if (is->role() == Delivery::Listen) {
+						continue;
+					}
 				}
 			}
+			node->add_child_nocopy((*i)->state (full_state));
 		}
-		node->add_child_nocopy((*i)->state (full_state));
 	}
 
 	if (_extra_xml) {
@@ -2396,6 +2317,8 @@ Route::state(bool full_state)
 		foreach_processor (sigc::bind (sigc::mem_fun (*this, &Route::set_plugin_state_dir), ""));
 	}
 
+	node->add_child_copy (Slavable::get_state());
+
 	return *node;
 }
 
@@ -2409,7 +2332,7 @@ Route::set_state (const XMLNode& node, int version)
 	XMLNodeList nlist;
 	XMLNodeConstIterator niter;
 	XMLNode *child;
-	const XMLProperty *prop;
+	XMLProperty const * prop;
 
 	if (node.name() != "Route"){
 		error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
@@ -2423,14 +2346,10 @@ Route::set_state (const XMLNode& node, int version)
 	set_id (node);
 	_initial_io_setup = true;
 
-	if ((prop = node.property (X_("flags"))) != 0) {
-		_flags = Flag (string_2_enum (prop->value(), _flags));
-	} else {
-		_flags = Flag (0);
-	}
+	Stripable::set_state (node, version);
 
-	if (is_master() || is_monitor() || is_auditioner()) {
-		_mute_master->set_solo_ignore (true);
+	if ((prop = node.property (X_("strict-io"))) != 0) {
+		_strict_io = string_is_affirmative (prop->value());
 	}
 
 	if (is_monitor()) {
@@ -2462,18 +2381,17 @@ Route::set_state (const XMLNode& node, int version)
 			} else if (prop->value() == "Output") {
 				_output->set_state (*child, version);
 			}
-		}
 
-		if (child->name() == X_("Processor")) {
+		} else if (child->name() == X_("Processor")) {
 			processor_state.add_child_copy (*child);
-		}
-
-		if (child->name() == X_("Pannable")) {
+		} else if (child->name() == X_("Pannable")) {
 			if (_pannable) {
 				_pannable->set_state (*child, version);
 			} else {
 				warning << string_compose (_("Pannable state found for route (%1) without a panner!"), name()) << endmsg;
 			}
+		} else if (child->name() == Slavable::xml_node_name) {
+			Slavable::set_state (*child, version);
 		}
 	}
 
@@ -2496,82 +2414,15 @@ Route::set_state (const XMLNode& node, int version)
 	// this looks up the internal instrument in processors
 	reset_instrument_info();
 
-	if ((prop = node.property ("self-solo")) != 0) {
-		set_self_solo (string_is_affirmative (prop->value()));
-	}
-
-	if ((prop = node.property ("soloed-by-upstream")) != 0) {
-		_soloed_by_others_upstream = 0; // needed for mod_.... () to work
-		mod_solo_by_others_upstream (atoi (prop->value()));
-	}
-
-	if ((prop = node.property ("soloed-by-downstream")) != 0) {
-		_soloed_by_others_downstream = 0; // needed for mod_.... () to work
-		mod_solo_by_others_downstream (atoi (prop->value()));
-	}
-
-	if ((prop = node.property ("solo-isolated")) != 0) {
-		set_solo_isolated (string_is_affirmative (prop->value()), Controllable::NoGroup);
-	}
-
-	if ((prop = node.property ("solo-safe")) != 0) {
-		set_solo_safe (string_is_affirmative (prop->value()), Controllable::NoGroup);
-	}
-
-	if ((prop = node.property (X_("phase-invert"))) != 0) {
-		set_phase_invert (boost::dynamic_bitset<> (prop->value ()));
-	}
-
 	if ((prop = node.property (X_("denormal-protection"))) != 0) {
 		set_denormal_protection (string_is_affirmative (prop->value()));
 	}
 
 	if ((prop = node.property (X_("active"))) != 0) {
 		bool yn = string_is_affirmative (prop->value());
-		_active = !yn; // force switch
 		set_active (yn, this);
 	}
 
-	if ((prop = node.property (X_("order-key"))) != 0) { // New order key (no separate mixer/editor ordering)
-		set_order_key (atoi(prop->value()));
-	}
-
-	if ((prop = node.property (X_("order-keys"))) != 0) { // Deprecated order keys
-
-		int32_t n;
-
-		string::size_type colon, equal;
-		string remaining = prop->value();
-
-		while (remaining.length()) {
-
-			if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
-				error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
-				      << endmsg;
-			} else {
-				if (sscanf (remaining.substr (equal+1).c_str(), "%d", &n) != 1) {
-					error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
-					      << endmsg;
-				} else {
-					string keyname = remaining.substr (0, equal);
-
-					if ((keyname == "EditorSort") || (keyname == "editor")) {
-						cerr << "Setting " << name() << " order key to " << n << " using saved Editor order." << endl;
-						set_order_key (n);
-					}
-				}
-			}
-
-			colon = remaining.find_first_of (':');
-
-			if (colon != string::npos) {
-				remaining = remaining.substr (colon+1);
-			} else {
-				break;
-			}
-		}
-	}
-
 	if ((prop = node.property (X_("processor-after-last-custom-meter"))) != 0) {
 		PBD::ID id (prop->value ());
 		Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
@@ -2596,21 +2447,25 @@ Route::set_state (const XMLNode& node, int version)
 			XMLNode *cmt = *(child->children().begin());
 			_comment = cmt->content();
 
-		} else if (child->name() == Controllable::xml_node_name && (prop = child->property("name")) != 0) {
-			if (prop->value() == "solo") {
-				_solo_control->set_state (*child, version);
-			} else if (prop->value() == "mute") {
-				_mute_control->set_state (*child, version);
+		}  else if (child->name() == Controllable::xml_node_name) {
+			if ((prop = child->property (X_("name"))) == 0) {
+				continue;
 			}
 
-		} else if (child->name() == X_("RemoteControl")) {
-			if ((prop = child->property (X_("id"))) != 0) {
-				int32_t x;
-				sscanf (prop->value().c_str(), "%d", &x);
-				set_remote_control_id_internal (x);
+			if (prop->value() == _gain_control->name()) {
+				_gain_control->set_state (*child, version);
+			} else if (prop->value() == _solo_control->name()) {
+				_solo_control->set_state (*child, version);
+			} else if (prop->value() == _solo_safe_control->name()) {
+				_solo_safe_control->set_state (*child, version);
+			} else if (prop->value() == _solo_isolate_control->name()) {
+				_solo_isolate_control->set_state (*child, version);
+			} else if (prop->value() == _solo_control->name()) {
+				_mute_control->set_state (*child, version);
+			} else if (prop->value() == _phase_control->name()) {
+				_phase_control->set_state (*child, version);
 			}
-
-		} else if (child->name() == X_("MuteMaster")) {
+		} else if (child->name() == MuteMaster::xml_node_name) {
 			_mute_master->set_state (*child, version);
 
 		} else if (child->name() == Automatable::xml_node_name) {
@@ -2624,11 +2479,11 @@ Route::set_state (const XMLNode& node, int version)
 int
 Route::set_state_2X (const XMLNode& node, int version)
 {
-	LocaleGuard lg (X_("C"));
+	LocaleGuard lg;
 	XMLNodeList nlist;
 	XMLNodeConstIterator niter;
 	XMLNode *child;
-	const XMLProperty *prop;
+	XMLProperty const * prop;
 
 	/* 2X things which still remain to be handled:
 	 * default-type
@@ -2641,38 +2496,12 @@ Route::set_state_2X (const XMLNode& node, int version)
 		return -1;
 	}
 
-	if ((prop = node.property (X_("flags"))) != 0) {
-		string f = prop->value ();
-		boost::replace_all (f, "ControlOut", "MonitorOut");
-		_flags = Flag (string_2_enum (f, _flags));
-	} else {
-		_flags = Flag (0);
-	}
-
-	if (is_master() || is_monitor() || is_auditioner()) {
-		_mute_master->set_solo_ignore (true);
-	}
-
-	if ((prop = node.property (X_("phase-invert"))) != 0) {
-		boost::dynamic_bitset<> p (_input->n_ports().n_audio ());
-		if (string_is_affirmative (prop->value ())) {
-			p.set ();
-		}
-		set_phase_invert (p);
-	}
+	Stripable::set_state (node, version);
 
 	if ((prop = node.property (X_("denormal-protection"))) != 0) {
 		set_denormal_protection (string_is_affirmative (prop->value()));
 	}
 
-	if ((prop = node.property (X_("soloed"))) != 0) {
-		bool yn = string_is_affirmative (prop->value());
-
-		/* XXX force reset of solo status */
-
-		set_solo (yn);
-	}
-
 	if ((prop = node.property (X_("muted"))) != 0) {
 
 		bool first = true;
@@ -2737,46 +2566,6 @@ Route::set_state_2X (const XMLNode& node, int version)
 		_meter_point = MeterPoint (string_2_enum (prop->value (), _meter_point));
 	}
 
-	/* do not carry over edit/mix groups from 2.X because (a) its hard (b) they
-	   don't mean the same thing.
-	*/
-
-	if ((prop = node.property (X_("order-keys"))) != 0) {
-
-		int32_t n;
-
-		string::size_type colon, equal;
-		string remaining = prop->value();
-
-		while (remaining.length()) {
-
-			if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
-				error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
-					<< endmsg;
-			} else {
-				if (sscanf (remaining.substr (equal+1).c_str(), "%d", &n) != 1) {
-					error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
-						<< endmsg;
-				} else {
-					string keyname = remaining.substr (0, equal);
-
-					if (keyname == "EditorSort" || keyname == "editor") {
-						info << string_compose(_("Converting deprecated order key for %1 using Editor order %2"), name (), n) << endmsg;
-						set_order_key (n);
-					}
-				}
-			}
-
-			colon = remaining.find_first_of (':');
-
-			if (colon != string::npos) {
-				remaining = remaining.substr (colon+1);
-			} else {
-				break;
-			}
-		}
-	}
-
 	/* IOs */
 
 	nlist = node.children ();
@@ -2866,13 +2655,6 @@ Route::set_state_2X (const XMLNode& node, int version)
 				_mute_control->set_state (*child, version);
 			}
 
-		} else if (child->name() == X_("RemoteControl")) {
-			if ((prop = child->property (X_("id"))) != 0) {
-				int32_t x;
-				sscanf (prop->value().c_str(), "%d", &x);
-				set_remote_control_id_internal (x);
-			}
-
 		}
 	}
 
@@ -2951,7 +2733,7 @@ Route::set_processor_state (const XMLNode& node)
 			ProcessorList::iterator o;
 
 			for (o = _processors.begin(); o != _processors.end(); ++o) {
-				XMLProperty* id_prop = (*niter)->property(X_("id"));
+				XMLProperty const * id_prop = (*niter)->property(X_("id"));
 				if (id_prop && (*o)->id() == id_prop->value()) {
 					(*o)->set_state (**niter, Stateful::current_state_version);
 					new_order.push_back (*o);
@@ -2972,13 +2754,20 @@ Route::set_processor_state (const XMLNode& node)
 				} else if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
 				           prop->value() == "lv2" ||
 				           prop->value() == "windows-vst" ||
-					   prop->value() == "lxvst" ||
+				           prop->value() == "lxvst" ||
+				           prop->value() == "luaproc" ||
 				           prop->value() == "audiounit") {
 
 					if (_session.get_disable_all_loaded_plugins ()) {
 						processor.reset (new UnknownProcessor (_session, **niter));
 					} else {
 						processor.reset (new PluginInsert (_session));
+						processor->set_owner (this);
+						if (_strict_io) {
+							boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert>(processor);
+							pi->set_strict_io (true);
+						}
+
 					}
 				} else if (prop->value() == "port") {
 
@@ -2987,6 +2776,9 @@ Route::set_processor_state (const XMLNode& node)
 				} else if (prop->value() == "send") {
 
 					processor.reset (new Send (_session, _pannable, _mute_master, Delivery::Send, true));
+					boost::shared_ptr<Send> send = boost::dynamic_pointer_cast<Send> (processor);
+					send->SelfDestruct.connect_same_thread (*this,
+							boost::bind (&Route::processor_selfdestruct, this, boost::weak_ptr<Processor> (processor)));
 
 				} else {
 					error << string_compose(_("unknown Processor type \"%1\"; ignored"), prop->value()) << endmsg;
@@ -2998,6 +2790,12 @@ Route::set_processor_state (const XMLNode& node)
 					processor.reset (new UnknownProcessor (_session, **niter));
 				}
 
+				/* subscribe to Sidechain IO changes */
+				boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert> (processor);
+				if (pi && pi->has_sidechain ()) {
+					pi->sidechain_input ()->changed.connect_same_thread (*this, boost::bind (&Route::sidechain_change_handler, this, _1, _2));
+				}
+
 				/* we have to note the monitor send here, otherwise a new one will be created
 				   and the state of this one will be lost.
 				*/
@@ -3017,12 +2815,17 @@ Route::set_processor_state (const XMLNode& node)
 	}
 
 	{
-		Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
 		Glib::Threads::RWLock::WriterLock lm (_processor_lock);
+		/* re-assign _processors w/o process-lock.
+		 * if there's an IO-processor present in _processors but
+		 * not in new_order, it will be deleted and ~IO takes
+		 * a process lock.
+		 */
 		_processors = new_order;
+		Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
 
 		if (must_configure) {
-			configure_processors_unlocked (0);
+			configure_processors_unlocked (0, &lm);
 		}
 
 		for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
@@ -3069,6 +2872,8 @@ Route::silence_unlocked (framecnt_t nframes)
 {
 	/* Must be called with the processor lock held */
 
+	const framepos_t now = _session.transport_frame ();
+
 	if (!_silent) {
 
 		_output->silence (nframes);
@@ -3081,7 +2886,7 @@ Route::silence_unlocked (framecnt_t nframes)
 				continue;
 			}
 
-			(*i)->silence (nframes);
+			(*i)->silence (nframes, now);
 		}
 
 		if (nframes == _session.get_block_size()) {
@@ -3287,12 +3092,53 @@ Route::feeds (boost::shared_ptr<Route> other, bool* via_sends_only)
 	return false;
 }
 
+IOVector
+Route::all_inputs () const
+{
+	/* TODO, if this works as expected,
+	 * cache the IOVector and maintain it via
+	 * input_change_handler(), sidechain_change_handler() etc
+	 */
+	IOVector ios;
+	ios.push_back (_input);
+
+	Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
+	for (ProcessorList::const_iterator r = _processors.begin(); r != _processors.end(); ++r) {
+
+		boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor>(*r);
+		boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert>(*r);
+		if (pi != 0) {
+			assert (iop == 0);
+			iop = pi->sidechain();
+		}
+
+		if (iop != 0 && iop->input()) {
+			ios.push_back (iop->input());
+		}
+	}
+	return ios;
+}
+
+IOVector
+Route::all_outputs () const
+{
+	IOVector ios;
+	// _output is included via Delivery
+	Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
+	for (ProcessorList::const_iterator r = _processors.begin(); r != _processors.end(); ++r) {
+		boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor>(*r);
+		if (iop != 0 && iop->output()) {
+			ios.push_back (iop->output());
+		}
+	}
+	return ios;
+}
+
 bool
 Route::direct_feeds_according_to_reality (boost::shared_ptr<Route> other, bool* via_send_only)
 {
 	DEBUG_TRACE (DEBUG::Graph, string_compose ("Feeds? %1\n", _name));
-
-	if (_output->connected_to (other->input())) {
+	if (other->all_inputs().fed_by (_output)) {
 		DEBUG_TRACE (DEBUG::Graph, string_compose ("\tdirect FEEDS %2\n", other->name()));
 		if (via_send_only) {
 			*via_send_only = false;
@@ -3301,13 +3147,25 @@ Route::direct_feeds_according_to_reality (boost::shared_ptr<Route> other, bool*
 		return true;
 	}
 
+	Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
 
 	for (ProcessorList::iterator r = _processors.begin(); r != _processors.end(); ++r) {
 
-		boost::shared_ptr<IOProcessor> iop;
+		boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor>(*r);
+		boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert>(*r);
+		if (pi != 0) {
+			assert (iop == 0);
+			iop = pi->sidechain();
+		}
 
-		if ((iop = boost::dynamic_pointer_cast<IOProcessor>(*r)) != 0) {
-			if (iop->feeds (other)) {
+		if (iop != 0) {
+			boost::shared_ptr<const IO> iop_out = iop->output();
+			if (other.get() == this && iop_out && iop->input() && iop_out->connected_to (iop->input())) {
+				// TODO this needs a delaylines in the Insert to align connections (!)
+				DEBUG_TRACE (DEBUG::Graph,  string_compose ("\tIOP %1 does feed its own return (%2)\n", iop->name(), other->name()));
+				continue;
+			}
+			if ((iop_out && other->all_inputs().fed_by (iop_out)) || iop->feeds (other)) {
 				DEBUG_TRACE (DEBUG::Graph,  string_compose ("\tIOP %1 does feed %2\n", iop->name(), other->name()));
 				if (via_send_only) {
 					*via_send_only = true;
@@ -3332,6 +3190,12 @@ Route::direct_feeds_according_to_graph (boost::shared_ptr<Route> other, bool* vi
 	return _session._current_route_graph.has (shared_from_this (), other, via_send_only);
 }
 
+bool
+Route::feeds_according_to_graph (boost::shared_ptr<Route> other)
+{
+	return _session._current_route_graph.feeds (shared_from_this (), other);
+}
+
 /** Called from the (non-realtime) butler thread when the transport is stopped */
 void
 Route::nonrealtime_handle_transport_stopped (bool /*abort_ignored*/, bool /*did_locate*/, bool can_flush_processors)
@@ -3364,11 +3228,11 @@ Route::input_change_handler (IOChange change, void * /*src*/)
 		   contains ConfigurationChanged
 		*/
 		configure_processors (0);
-		_phase_invert.resize (_input->n_ports().n_audio ());
+		_phase_control->resize (_input->n_ports().n_audio ());
 		io_changed (); /* EMIT SIGNAL */
 	}
 
-	if (_soloed_by_others_upstream || _solo_isolated_by_upstream) {
+	if (_solo_control->soloed_by_others_upstream() || _solo_isolate_control->solo_isolated_by_upstream()) {
 		int sbou = 0;
 		int ibou = 0;
 		boost::shared_ptr<RouteList> routes = _session.get_routes ();
@@ -3383,38 +3247,36 @@ Route::input_change_handler (IOChange change, void * /*src*/)
 					if ((*i)->soloed()) {
 						++sbou;
 					}
-					if ((*i)->solo_isolated()) {
+					if ((*i)->solo_isolate_control()->solo_isolated()) {
 						++ibou;
 					}
 				}
 			}
 		}
 
-		int delta  = sbou - _soloed_by_others_upstream;
-		int idelta = ibou - _solo_isolated_by_upstream;
+		int delta  = sbou - _solo_control->soloed_by_others_upstream();
+		int idelta = ibou - _solo_isolate_control->solo_isolated_by_upstream();
 
 		if (idelta < -1) {
 			PBD::warning << string_compose (
 			                _("Invalid Solo-Isolate propagation: from:%1 new:%2 - old:%3 = delta:%4"),
-			                _name, ibou, _solo_isolated_by_upstream, idelta)
+			                _name, ibou, _solo_isolate_control->solo_isolated_by_upstream(), idelta)
 			             << endmsg;
 
 		}
 
-		if (_soloed_by_others_upstream) {
+		if (_solo_control->soloed_by_others_upstream()) {
 			// ignore new connections (they're not propagated)
 			if (delta <= 0) {
-				mod_solo_by_others_upstream (delta);
+				_solo_control->mod_solo_by_others_upstream (delta);
 			}
 		}
 
-		if (_solo_isolated_by_upstream) {
+		if (_solo_isolate_control->solo_isolated_by_upstream()) {
 			// solo-isolate currently only propagates downstream
 			if (idelta < 0) {
-				mod_solo_isolated_by_upstream (false);
+				_solo_isolate_control->mod_solo_isolated_by_upstream (1);
 			}
-			// TODO think: mod_solo_isolated_by_upstream() does not take delta arg,
-			// but idelta can't be smaller than -1, can it?
 			//_solo_isolated_by_upstream = ibou;
 		}
 
@@ -3427,11 +3289,11 @@ Route::input_change_handler (IOChange change, void * /*src*/)
 			bool sends_only;
 			bool does_feed = feeds (*i, &sends_only);
 			if (delta <= 0 && does_feed && !sends_only) {
-				(*i)->mod_solo_by_others_upstream (delta);
+				(*i)->solo_control()->mod_solo_by_others_upstream (delta);
 			}
 
 			if (idelta < 0 && does_feed && !sends_only) {
-				(*i)->mod_solo_isolated_by_upstream (false);
+				(*i)->solo_isolate_control()->mod_solo_isolated_by_upstream (-1);
 			}
 		}
 	}
@@ -3457,7 +3319,7 @@ Route::output_change_handler (IOChange change, void * /*src*/)
 		io_changed (); /* EMIT SIGNAL */
 	}
 
-	if (_soloed_by_others_downstream) {
+	if (_solo_control->soloed_by_others_downstream()) {
 		int sbod = 0;
 		/* checking all all downstream routes for
 		 * explicit of implict solo is a rather drastic measure,
@@ -3480,20 +3342,20 @@ Route::output_change_handler (IOChange change, void * /*src*/)
 				}
 			}
 		}
-		int delta = sbod - _soloed_by_others_downstream;
+		int delta = sbod - _solo_control->soloed_by_others_downstream();
 		if (delta <= 0) {
 			// do not allow new connections to change implicit solo (no propagation)
-			mod_solo_by_others_downstream (delta);
+			_solo_control->mod_solo_by_others_downstream (delta);
 			// Session::route_solo_changed() does not propagate indirect solo-changes
 			// propagate upstream to tracks
 			for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
-				if ((*i).get() == this || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
+				if ((*i).get() == this || !can_solo()) {
 					continue;
 				}
 				bool sends_only;
 				bool does_feed = (*i)->feeds (shared_from_this(), &sends_only);
 				if (delta != 0 && does_feed && !sends_only) {
-					(*i)->mod_solo_by_others_downstream (delta);
+					(*i)->solo_control()->mod_solo_by_others_downstream (delta);
 				}
 			}
 
@@ -3501,6 +3363,16 @@ Route::output_change_handler (IOChange change, void * /*src*/)
 	}
 }
 
+void
+Route::sidechain_change_handler (IOChange change, void* src)
+{
+	if (_initial_io_setup || _in_sidechain_setup) {
+		return;
+	}
+
+	input_change_handler (change, src);
+}
+
 uint32_t
 Route::pans_required () const
 {
@@ -3511,6 +3383,22 @@ Route::pans_required () const
 	return max (n_inputs ().n_audio(), processor_max_streams.n_audio());
 }
 
+void
+Route::flush_processor_buffers_locked (framecnt_t nframes)
+{
+	for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
+		boost::shared_ptr<Delivery> d = boost::dynamic_pointer_cast<Delivery> (*i);
+		if (d) {
+			d->flush_buffers (nframes);
+		} else {
+			boost::shared_ptr<PortInsert> p = boost::dynamic_pointer_cast<PortInsert> (*i);
+			if (p) {
+				p->flush_buffers (nframes);
+			}
+		}
+	}
+}
+
 int
 Route::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, bool session_state_changing)
 {
@@ -3549,13 +3437,15 @@ Route::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame,
 	fill_buffers_with_input (bufs, _input, nframes);
 
 	if (_meter_point == MeterInput) {
-		_meter->run (bufs, start_frame, end_frame, nframes, true);
+		_meter->run (bufs, start_frame, end_frame, 0.0, nframes, true);
 	}
 
 	_amp->apply_gain_automation (false);
 	_trim->apply_gain_automation (false);
 	passthru (bufs, start_frame, end_frame, nframes, 0);
 
+	flush_processor_buffers_locked (nframes);
+
 	return 0;
 }
 
@@ -3589,11 +3479,13 @@ Route::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, in
 	fill_buffers_with_input (bufs, _input, nframes);
 
 	if (_meter_point == MeterInput) {
-		_meter->run (bufs, start_frame, end_frame, nframes, true);
+		_meter->run (bufs, start_frame, end_frame, 1.0, nframes, true);
 	}
 
 	passthru (bufs, start_frame, end_frame, nframes, declick);
 
+	flush_processor_buffers_locked (nframes);
+
 	return 0;
 }
 
@@ -3601,6 +3493,7 @@ int
 Route::silent_roll (pframes_t nframes, framepos_t /*start_frame*/, framepos_t /*end_frame*/, bool& /* need_butler */)
 {
 	silence (nframes);
+	flush_processor_buffers_locked (nframes);
 	return 0;
 }
 
@@ -3658,13 +3551,12 @@ Route::apply_processor_changes_rt ()
 		g_atomic_int_set (&_pending_signals, emissions);
 		return true;
 	}
-	return false;
+	return (!selfdestruct_sequence.empty ());
 }
 
 void
 Route::emit_pending_signals ()
 {
-
 	int sig = g_atomic_int_and (&_pending_signals, 0);
 	if (sig & EmitMeterChanged) {
 		_meter->emit_configuration_changed();
@@ -3678,6 +3570,24 @@ Route::emit_pending_signals ()
 	if (sig & EmitRtProcessorChange) {
 		processors_changed (RouteProcessorChange (RouteProcessorChange::RealTimeChange)); /* EMIT SIGNAL */
 	}
+
+	/* this would be a job for the butler.
+	 * Conceptually we should not take processe/processor locks here.
+	 * OTOH its more efficient (less overhead for summoning the butler and
+	 * telling her what do do) and signal emission is called
+	 * directly after the process callback, which decreases the chance
+	 * of x-runs when taking the locks.
+	 */
+	while (!selfdestruct_sequence.empty ()) {
+		Glib::Threads::Mutex::Lock lx (selfdestruct_lock);
+		if (selfdestruct_sequence.empty ()) { break; } // re-check with lock
+		boost::shared_ptr<Processor> proc = selfdestruct_sequence.back ().lock ();
+		selfdestruct_sequence.pop_back ();
+		lx.release ();
+		if (proc) {
+			remove_processor (proc);
+		}
+	}
 }
 
 void
@@ -3786,10 +3696,10 @@ Route::listen_position_changed ()
 		Glib::Threads::RWLock::WriterLock lm (_processor_lock);
 		ProcessorState pstate (this);
 
-		if (configure_processors_unlocked (0)) {
+		if (configure_processors_unlocked (0, &lm)) {
 			DEBUG_TRACE (DEBUG::Processors, "---- CONFIGURATION FAILED.\n");
 			pstate.restore ();
-			configure_processors_unlocked (0); // it worked before we tried to add it ...
+			configure_processors_unlocked (0, &lm); // it worked before we tried to add it ...
 			return;
 		}
 	}
@@ -3807,10 +3717,12 @@ Route::add_export_point()
 		Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
 		Glib::Threads::RWLock::WriterLock lw (_processor_lock);
 
-		_capturing_processor.reset (new CapturingProcessor (_session));
+		// this aligns all tracks; but not tracks + busses
+		assert (_session.worst_track_latency () >= _initial_delay);
+		_capturing_processor.reset (new CapturingProcessor (_session, _session.worst_track_latency () - _initial_delay));
 		_capturing_processor->activate ();
 
-		configure_processors_unlocked (0);
+		configure_processors_unlocked (0, &lw);
 
 	}
 
@@ -4072,7 +3984,7 @@ Route::set_name_in_state (XMLNode& node, string const & name, bool rename_playli
 
 		} else if ((*i)->name() == X_("Processor")) {
 
-			XMLProperty* role = (*i)->property (X_("role"));
+			XMLProperty const * role = (*i)->property (X_("role"));
 			if (role && role->value() == X_("Main")) {
 				(*i)->add_property (X_("name"), name);
 			}
@@ -4106,42 +4018,6 @@ Route::internal_send_for (boost::shared_ptr<const Route> target) const
 	return boost::shared_ptr<Send>();
 }
 
-/** @param c Audio channel index.
- *  @param yn true to invert phase, otherwise false.
- */
-void
-Route::set_phase_invert (uint32_t c, bool yn)
-{
-	if (_phase_invert[c] != yn) {
-		_phase_invert[c] = yn;
-		phase_invert_changed (); /* EMIT SIGNAL */
-		_phase_control->Changed(); /* EMIT SIGNAL */
-		_session.set_dirty ();
-	}
-}
-
-void
-Route::set_phase_invert (boost::dynamic_bitset<> p)
-{
-	if (_phase_invert != p) {
-		_phase_invert = p;
-		phase_invert_changed (); /* EMIT SIGNAL */
-		_session.set_dirty ();
-	}
-}
-
-bool
-Route::phase_invert (uint32_t c) const
-{
-	return _phase_invert[c];
-}
-
-boost::dynamic_bitset<>
-Route::phase_invert () const
-{
-	return _phase_invert;
-}
-
 void
 Route::set_denormal_protection (bool yn)
 {
@@ -4209,14 +4085,10 @@ Route::trim_control() const
 	return _trim_control;
 }
 
-boost::shared_ptr<Route::PhaseControllable>
+boost::shared_ptr<PhaseControl>
 Route::phase_control() const
 {
-	if (phase_invert().size()) {
-		return _phase_control;
-	} else {
-		return boost::shared_ptr<PhaseControllable>();
-	}
+	return _phase_control;
 }
 
 boost::shared_ptr<AutomationControl>
@@ -4309,12 +4181,6 @@ Route::has_io_processor_named (const string& name)
 	return false;
 }
 
-MuteMaster::MutePoint
-Route::mute_points () const
-{
-	return _mute_master->mute_points ();
-}
-
 void
 Route::set_processor_positions ()
 {
@@ -4349,6 +4215,9 @@ Route::input_port_count_changing (ChanCount to)
 bool
 Route::output_port_count_changing (ChanCount to)
 {
+	if (_strict_io && !_in_configure_processors) {
+		return true;
+	}
 	for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
 		if (processor_out_streams.get(*t) > to.get(*t)) {
 			return true;
@@ -4522,12 +4391,13 @@ Route::setup_invisible_processors ()
 
 	/* find the amp */
 
-	ProcessorList::iterator amp = new_processors.begin ();
-	while (amp != new_processors.end() && *amp != _amp) {
-		++amp;
-	}
+	ProcessorList::iterator amp = find (new_processors.begin(), new_processors.end(), _amp);
 
-	assert (amp != new_processors.end ());
+	if (amp == new_processors.end ()) {
+		error << string_compose (_("Amp/Fader on Route '%1' went AWOL. Re-added."), name()) << endmsg;
+		new_processors.push_front (_amp);
+		amp = find (new_processors.begin(), new_processors.end(), _amp);
+	}
 
 	/* and the processor after the amp */
 
@@ -4627,10 +4497,17 @@ Route::setup_invisible_processors ()
 		new_processors.insert (amp, _monitor_control);
 	}
 
+	/* TRIM CONTROL */
+
+	if (_trim && _trim->active()) {
+		assert (!_trim->display_to_user ());
+		new_processors.push_front (_trim);
+	}
+
 	/* INTERNAL RETURN */
 
-	/* doing this here means that any monitor control will come just after
-	   the return.
+	/* doing this here means that any monitor control will come after
+	   the return and trim.
 	*/
 
 	if (_intreturn) {
@@ -4638,10 +4515,6 @@ Route::setup_invisible_processors ()
 		new_processors.push_front (_intreturn);
 	}
 
-	if (_trim && _trim->active()) {
-		assert (!_trim->display_to_user ());
-		new_processors.push_front (_trim);
-	}
 	/* EXPORT PROCESSOR */
 
 	if (_capturing_processor) {
@@ -4652,8 +4525,8 @@ Route::setup_invisible_processors ()
 	_processors = new_processors;
 
 	for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
-		if (!(*i)->display_to_user () && !(*i)->active () && (*i) != _monitor_send) {
-			(*i)->activate ();
+		if (!(*i)->display_to_user () && !(*i)->enabled () && (*i) != _monitor_send) {
+			(*i)->enable (true);
 		}
 	}
 
@@ -4781,11 +4654,9 @@ boost::shared_ptr<Processor>
 Route::the_instrument_unlocked () const
 {
 	for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
-		if (boost::dynamic_pointer_cast<PluginInsert>(*i)) {
-			if ((*i)->input_streams().n_midi() > 0 &&
-			    (*i)->output_streams().n_audio() > 0) {
-				return (*i);
-			}
+		boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert>(*i);
+		if (pi && pi->plugin ()->get_info ()->is_instrument ()) {
+			return (*i);
 		}
 	}
 	return boost::shared_ptr<Processor>();
@@ -5353,3 +5224,47 @@ Route::master_send_enable_controllable () const
 	return boost::shared_ptr<AutomationControl>();
 #endif
 }
+
+bool
+Route::slaved () const
+{
+	if (!_gain_control) {
+		return false;
+	}
+	/* just test one particular control, not all of them */
+	return _gain_control->slaved ();
+}
+
+bool
+Route::slaved_to (boost::shared_ptr<VCA> vca) const
+{
+	if (!vca || !_gain_control) {
+		return false;
+	}
+
+	/* just test one particular control, not all of them */
+
+	return _gain_control->slaved_to (vca->gain_control());
+}
+
+bool
+Route::muted_by_others_soloing () const
+{
+	if (!can_be_muted_by_others ()) {
+		return false;
+	}
+
+	return  _session.soloing() && !_solo_control->soloed() && !_solo_isolate_control->solo_isolated();
+}
+
+void
+Route::clear_all_solo_state ()
+{
+	double v = _solo_safe_control->get_value ();
+
+	_solo_control->clear_all_solo_state ();
+
+	if (v != 0.0) {
+		_solo_safe_control->set_value (v, Controllable::NoGroup);
+	}
+}
diff --git a/libs/ardour/route_controls.cc b/libs/ardour/route_controls.cc
deleted file mode 100644
index 5ab7524..0000000
--- a/libs/ardour/route_controls.cc
+++ /dev/null
@@ -1,352 +0,0 @@
-/*
-    Copyright (C) 2000 Paul Davis
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-*/
-
-#ifdef WAF_BUILD
-#include "libardour-config.h"
-#endif
-
-#include "ardour/automation_control.h"
-#include "ardour/parameter_descriptor.h"
-#include "ardour/route.h"
-#include "ardour/session.h"
-
-#include "i18n.h"
-
-using namespace std;
-using namespace ARDOUR;
-using namespace PBD;
-
-void
-Route::set_control (AutomationType type, double val, PBD::Controllable::GroupControlDisposition group_override)
-{
-	boost::shared_ptr<RouteList> rl;
-
-	switch (type) {
-	case GainAutomation:
-		/* route must mediate group control */
-		set_gain (val, group_override);
-		break;
-
-	case TrimAutomation:
-		/* route must mediate group control */
-		set_trim (val, group_override);
-		break;
-
-	case RecEnableAutomation:
-		/* session must mediate group control */
-		rl.reset (new RouteList);
-		rl->push_back (shared_from_this());
-		_session.set_record_enabled (rl, val >= 0.5 ? true : false, Session::rt_cleanup, group_override);
-		break;
-
-	case SoloAutomation:
-		/* session must mediate group control */
-		rl.reset (new RouteList);
-		rl->push_back (shared_from_this());
-		if (Config->get_solo_control_is_listen_control()) {
-			_session.set_listen (rl, val >= 0.5 ? true : false, Session::rt_cleanup, group_override);
-		} else {
-			_session.set_solo (rl, val >= 0.5 ? true : false, Session::rt_cleanup, group_override);
-		}
-		break;
-
-	case MuteAutomation:
-		/* session must mediate group control */
-		rl.reset (new RouteList);
-		rl->push_back (shared_from_this());
-		_session.set_mute (rl, val >= 0.5 ? true : false, Session::rt_cleanup, group_override);
-		return;
-		break;
-
-	default:
-		/* Not a route automation control */
-		fatal << string_compose (_("programming error: %1%2\n"), X_("illegal type of route automation control passed to Route::set_control(): "), enum_2_string(type)) << endmsg;
-		/*NOTREACHED*/
-		return;
-	}
-}
-
-
-Route::RouteAutomationControl::RouteAutomationControl (const std::string& name,
-                                                       AutomationType atype,
-                                                       boost::shared_ptr<AutomationList> alist,
-                                                       boost::shared_ptr<Route> r)
-	: AutomationControl (r->session(), Evoral::Parameter (atype),
-	                     ParameterDescriptor (Evoral::Parameter (atype)),
-	                     alist, name)
-	, _route (r)
-{
-}
-
-Route::GainControllable::GainControllable (Session& s, AutomationType atype, boost::shared_ptr<Route> r)
-	: GainControl (s, Evoral::Parameter(atype))
-	, _route (r)
-{
-
-}
-
-Route::SoloControllable::SoloControllable (std::string name, boost::shared_ptr<Route> r)
-	: RouteAutomationControl (name, SoloAutomation, boost::shared_ptr<AutomationList>(), r)
-{
-	boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(SoloAutomation)));
-	gl->set_interpolation(Evoral::ControlList::Discrete);
-	set_list (gl);
-}
-
-void
-Route::SoloControllable::set_value (double val, PBD::Controllable::GroupControlDisposition group_override)
-{
-	if (writable()) {
-		_set_value (val, group_override);
-	}
-}
-
-void
-Route::SoloControllable::_set_value (double val, PBD::Controllable::GroupControlDisposition group_override)
-{
-	boost::shared_ptr<Route> r = _route.lock ();
-	if (!r) {
-		return;
-	}
-	r->set_control (SoloAutomation, val, group_override);
-}
-
-void
-Route::SoloControllable::set_value_unchecked (double val)
-{
-	/* Used only by automation playback */
-
-	_set_value (val, Controllable::NoGroup);
-}
-
-double
-Route::SoloControllable::get_value () const
-{
-	boost::shared_ptr<Route> r = _route.lock ();
-	if (!r) {
-		return 0;
-	}
-
-	if (Config->get_solo_control_is_listen_control()) {
-		return r->listening_via_monitor() ? GAIN_COEFF_UNITY : GAIN_COEFF_ZERO;
-	} else {
-		return r->self_soloed() ? GAIN_COEFF_UNITY : GAIN_COEFF_ZERO;
-	}
-}
-
-Route::MuteControllable::MuteControllable (std::string name, boost::shared_ptr<Route> r)
-	: RouteAutomationControl (name, MuteAutomation, boost::shared_ptr<AutomationList>(), r)
-	, _route (r)
-{
-	boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(MuteAutomation)));
-	gl->set_interpolation(Evoral::ControlList::Discrete);
-	set_list (gl);
-}
-
-void
-Route::MuteControllable::set_superficial_value(bool muted)
-{
-	/* Note we can not use AutomationControl::set_value here since it will emit
-	   Changed(), but the value will not be correct to the observer. */
-
-	const bool to_list = _list && ((AutomationList*)_list.get ())->automation_write ();
-	const double where = _session.audible_frame ();
-	if (to_list) {
-		/* Note that we really need this:
-		 *  if (as == Touch && _list->in_new_write_pass ()) {
-		 *       alist->start_write_pass (_session.audible_frame ());
-		 *  }
-		 * here in the case of the user calling from a GUI or whatever.
-		 * Without the ability to distinguish between user and
-		 * automation-initiated changes, we lose the "touch mute"
-		 * behaviour we have in AutomationController::toggled ().
-		 */
-		_list->set_in_write_pass (true, false, where);
-	}
-
-	Control::set_double (muted, where, to_list);
-}
-
-void
-Route::MuteControllable::set_value (double val, PBD::Controllable::GroupControlDisposition group_override)
-{
-	if (writable()) {
-		_set_value (val, group_override);
-	}
-}
-
-void
-Route::MuteControllable::set_value_unchecked (double val)
-{
-	/* used only automation playback */
-	_set_value (val, Controllable::NoGroup);
-}
-
-void
-Route::MuteControllable::_set_value (double val, Controllable::GroupControlDisposition group_override)
-{
-	boost::shared_ptr<Route> r = _route.lock ();
-
-	if (!r) {
-		return;
-	}
-
-	if (_list && ((AutomationList*)_list.get())->automation_playback()) {
-		// Set superficial/automation value to drive controller (and possibly record)
-		const bool bval = ((val >= 0.5) ? true : false);
-		set_superficial_value (bval);
-		// Playing back automation, set route mute directly
-		r->set_mute (bval, Controllable::NoGroup);
-	} else {
-		r->set_control (MuteAutomation, val, group_override);
-	}
-}
-
-double
-Route::MuteControllable::get_value () const
-{
-	if (_list && ((AutomationList*)_list.get())->automation_playback()) {
-		// Playing back automation, get the value from the list
-		return AutomationControl::get_value();
-	}
-
-	// Not playing back automation, get the actual route mute value
-	boost::shared_ptr<Route> r = _route.lock ();
-	return (r && r->muted()) ? GAIN_COEFF_UNITY : GAIN_COEFF_ZERO;
-}
-
-Route::PhaseControllable::PhaseControllable (std::string name, boost::shared_ptr<Route> r)
-	: RouteAutomationControl (name, PhaseAutomation, boost::shared_ptr<AutomationList>(), r)
-	, _current_phase (0)
-{
-	boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(PhaseAutomation)));
-	gl->set_interpolation(Evoral::ControlList::Discrete);
-	set_list (gl);
-}
-
-void
-Route::PhaseControllable::set_value (double v, PBD::Controllable::GroupControlDisposition /* group_override */)
-{
-	boost::shared_ptr<Route> r = _route.lock ();
-	if (r->phase_invert().size()) {
-		if (v == 0 || (v < 1 && v > 0.9) ) {
-			r->set_phase_invert (_current_phase, false);
-		} else {
-			r->set_phase_invert (_current_phase, true);
-		}
-	}
-}
-
-double
-Route::PhaseControllable::get_value () const
-{
-	boost::shared_ptr<Route> r = _route.lock ();
-	if (!r) {
-		return 0.0;
-	}
-	return (double) r->phase_invert (_current_phase);
-}
-
-void
-Route::PhaseControllable::set_channel (uint32_t c)
-{
-	_current_phase = c;
-}
-
-uint32_t
-Route::PhaseControllable::channel () const
-{
-	return _current_phase;
-}
-
-Route::SoloIsolateControllable::SoloIsolateControllable (std::string name, boost::shared_ptr<Route> r)
-	: RouteAutomationControl (name, SoloIsolateAutomation, boost::shared_ptr<AutomationList>(), r)
-{
-	boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(SoloIsolateAutomation)));
-	gl->set_interpolation(Evoral::ControlList::Discrete);
-	set_list (gl);
-}
-
-
-double
-Route::SoloIsolateControllable::get_value () const
-{
-	boost::shared_ptr<Route> r = _route.lock ();
-	if (!r) {
-		return 0.0; /* "false" */
-	}
-
-	return r->solo_isolated() ? 1.0 : 0.0;
-}
-
-void
-Route::SoloIsolateControllable::set_value (double val, PBD::Controllable::GroupControlDisposition gcd)
-{
-	_set_value (val, gcd);
-}
-
-void
-Route::SoloIsolateControllable::_set_value (double val, PBD::Controllable::GroupControlDisposition)
-{
-	boost::shared_ptr<Route> r = _route.lock ();
-	if (!r) {
-		return;
-	}
-
-	/* no group semantics yet */
-	r->set_solo_isolated (val >= 0.5 ? true : false);
-}
-
-Route::SoloSafeControllable::SoloSafeControllable (std::string name, boost::shared_ptr<Route> r)
-	: RouteAutomationControl (name, SoloSafeAutomation, boost::shared_ptr<AutomationList>(), r)
-{
-	boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(SoloSafeAutomation)));
-	gl->set_interpolation(Evoral::ControlList::Discrete);
-	set_list (gl);
-}
-
-void
-Route::SoloSafeControllable::set_value (double val, PBD::Controllable::GroupControlDisposition gcd)
-{
-	_set_value (val, gcd);
-}
-
-void
-Route::SoloSafeControllable::_set_value (double val, PBD::Controllable::GroupControlDisposition)
-{
-	boost::shared_ptr<Route> r = _route.lock ();
-	if (!r) {
-		return;
-	}
-
-	/* no group semantics yet */
-	r->set_solo_safe (val >= 0.5 ? true : false);
-}
-
-double
-Route::SoloSafeControllable::get_value () const
-{
-	boost::shared_ptr<Route> r = _route.lock ();
-	if (!r) {
-		return 0.0; /* "false" */
-	}
-
-	return r->solo_safe() ? 1.0 : 0.0;
-}
-
diff --git a/libs/ardour/route_graph.cc b/libs/ardour/route_graph.cc
index ab88a0d..dfe61c4 100644
--- a/libs/ardour/route_graph.cc
+++ b/libs/ardour/route_graph.cc
@@ -20,8 +20,9 @@
 
 #include "ardour/route.h"
 #include "ardour/route_graph.h"
+#include "ardour/track.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
@@ -59,6 +60,24 @@ GraphEdges::find_in_from_to_with_sends (GraphVertex from, GraphVertex to)
 	return _from_to_with_sends.end ();
 }
 
+GraphEdges::EdgeMapWithSends::iterator
+GraphEdges::find_recursively_in_from_to_with_sends (GraphVertex from, GraphVertex to)
+{
+	typedef EdgeMapWithSends::iterator Iter;
+	pair<Iter, Iter> r = _from_to_with_sends.equal_range (from);
+	for (Iter i = r.first; i != r.second; ++i) {
+		if (i->second.first == to) {
+			return i;
+		}
+		GraphEdges::EdgeMapWithSends::iterator t = find_recursively_in_from_to_with_sends (i->second.first, to);
+		if (t != _from_to_with_sends.end ()) {
+			return t;
+		}
+	}
+
+	return _from_to_with_sends.end ();
+}
+
 /** @param via_sends_only if non-0, filled in with true if the edge is a
  *  path via a send only.
  *  @return true if the given edge is present.
@@ -78,6 +97,16 @@ GraphEdges::has (GraphVertex from, GraphVertex to, bool* via_sends_only)
 	return true;
 }
 
+bool
+GraphEdges::feeds (GraphVertex from, GraphVertex to)
+{
+	EdgeMapWithSends::iterator i = find_recursively_in_from_to_with_sends (from, to);
+	if (i == _from_to_with_sends.end ()) {
+		return false;
+	}
+	return true;
+}
+
 /** @return the vertices that are fed from `r' */
 set<GraphVertex>
 GraphEdges::from (GraphVertex r) const
@@ -167,21 +196,41 @@ struct RouteRecEnabledComparator
 {
 	bool operator () (GraphVertex r1, GraphVertex r2) const
 	{
-		if (r1->record_enabled()) {
-			if (r2->record_enabled()) {
+		boost::shared_ptr<Track> t1 (boost::dynamic_pointer_cast<Track>(r1));
+		boost::shared_ptr<Track> t2 (boost::dynamic_pointer_cast<Track>(r2));
+		PresentationInfo::order_t r1o = r1->presentation_info().order();
+		PresentationInfo::order_t r2o = r2->presentation_info().order();
+
+		if (!t1) {
+			if (!t2) {
+				/* makes no difference which is first, use presentation order */
+				return r1o < r2o;
+			} else {
+				/* r1 is not a track, r2 is, run it early */
+				return false;
+			}
+		}
+
+		if (!t2) {
+			/* we already tested !t1, so just use presentation order */
+			return r1o < r2o;
+		}
+
+		if (t1->rec_enable_control()->get_value()) {
+			if (t2->rec_enable_control()->get_value()) {
 				/* both rec-enabled, just use signal order */
-				return r1->order_key () < r2->order_key ();
+				return r1o < r2o;
 			} else {
-				/* r1 rec-enabled, r2 not rec-enabled, run r2 early */
+				/* t1 rec-enabled, t2 not rec-enabled, run t2 early */
 				return false;
 			}
 		} else {
-			if (r2->record_enabled()) {
-				/* r2 rec-enabled, r1 not rec-enabled, run r1 early */
+			if (t2->rec_enable_control()->get_value()) {
+				/* t2 rec-enabled, t1 not rec-enabled, run t1 early */
 				return true;
 			} else {
-				/* neither rec-enabled, use signal order */
-				return r1->order_key () < r2->order_key ();
+				/* neither rec-enabled, use presentation order */
+				return r1o < r2o;
 			}
 		}
 	}
diff --git a/libs/ardour/route_group.cc b/libs/ardour/route_group.cc
index 5b5a8f2..1a7b980 100644
--- a/libs/ardour/route_group.cc
+++ b/libs/ardour/route_group.cc
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2000-2009 Paul Davis
+    Copyright (C) 2000-2016 Paul Davis
 
     This program is free software; you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
@@ -24,14 +24,19 @@
 #include "pbd/error.h"
 #include "pbd/enumwriter.h"
 #include "pbd/strsplit.h"
+#include "pbd/debug.h"
 
 #include "ardour/amp.h"
 #include "ardour/audio_track.h"
+#include "ardour/debug.h"
+#include "ardour/monitor_control.h"
 #include "ardour/route.h"
 #include "ardour/route_group.h"
 #include "ardour/session.h"
+#include "ardour/vca.h"
+#include "ardour/vca_manager.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 using namespace PBD;
@@ -39,62 +44,70 @@ using namespace std;
 
 namespace ARDOUR {
 	namespace Properties {
-		PropertyDescriptor<bool> relative;
 		PropertyDescriptor<bool> active;
-		PropertyDescriptor<bool> gain;
-		PropertyDescriptor<bool> mute;
-		PropertyDescriptor<bool> solo;
-		PropertyDescriptor<bool> recenable;
-		PropertyDescriptor<bool> select;
-		PropertyDescriptor<bool> route_active;
-		PropertyDescriptor<bool> color;
-		PropertyDescriptor<bool> monitoring;
+		PropertyDescriptor<bool> group_relative;
+		PropertyDescriptor<bool> group_gain;
+		PropertyDescriptor<bool> group_mute;
+		PropertyDescriptor<bool> group_solo;
+		PropertyDescriptor<bool> group_recenable;
+		PropertyDescriptor<bool> group_select;
+		PropertyDescriptor<bool> group_route_active;
+		PropertyDescriptor<bool> group_color;
+		PropertyDescriptor<bool> group_monitoring;
+		PropertyDescriptor<int32_t> group_master_number;
 	}
 }
 
 void
 RouteGroup::make_property_quarks ()
 {
-	Properties::relative.property_id = g_quark_from_static_string (X_("relative"));
-        DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for relative = %1\n", 	Properties::relative.property_id));
 	Properties::active.property_id = g_quark_from_static_string (X_("active"));
-        DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for active = %1\n", 	Properties::active.property_id));
-	Properties::hidden.property_id = g_quark_from_static_string (X_("hidden"));
-        DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for hidden = %1\n", 	Properties::hidden.property_id));
-	Properties::gain.property_id = g_quark_from_static_string (X_("gain"));
-        DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for gain = %1\n", 	Properties::gain.property_id));
-	Properties::mute.property_id = g_quark_from_static_string (X_("mute"));
-        DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for mute = %1\n", 	Properties::mute.property_id));
-	Properties::solo.property_id = g_quark_from_static_string (X_("solo"));
-        DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for solo = %1\n", 	Properties::solo.property_id));
-	Properties::recenable.property_id = g_quark_from_static_string (X_("recenable"));
-        DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for recenable = %1\n", 	Properties::recenable.property_id));
-	Properties::select.property_id = g_quark_from_static_string (X_("select"));
-        DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for select = %1\n", 	Properties::select.property_id));
-	Properties::route_active.property_id = g_quark_from_static_string (X_("route-active"));
-        DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for route-active = %1\n", Properties::route_active.property_id));
-	Properties::color.property_id = g_quark_from_static_string (X_("color"));
-        DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for color = %1\n",       Properties::color.property_id));
-	Properties::monitoring.property_id = g_quark_from_static_string (X_("monitoring"));
-        DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for monitoring = %1\n",       Properties::monitoring.property_id));
-}
-
-#define ROUTE_GROUP_DEFAULT_PROPERTIES  _relative (Properties::relative, true) \
+        DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for active = %1\n",	Properties::active.property_id));
+
+        Properties::group_relative.property_id = g_quark_from_static_string (X_("relative"));
+        DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for relative = %1\n",	Properties::group_relative.property_id));
+	Properties::group_gain.property_id = g_quark_from_static_string (X_("gain"));
+        DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for gain = %1\n",	Properties::group_gain.property_id));
+	Properties::group_mute.property_id = g_quark_from_static_string (X_("mute"));
+        DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for mute = %1\n",	Properties::group_mute.property_id));
+	Properties::group_solo.property_id = g_quark_from_static_string (X_("solo"));
+        DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for solo = %1\n",	Properties::group_solo.property_id));
+	Properties::group_recenable.property_id = g_quark_from_static_string (X_("recenable"));
+        DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for recenable = %1\n",	Properties::group_recenable.property_id));
+	Properties::group_select.property_id = g_quark_from_static_string (X_("select"));
+        DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for select = %1\n",	Properties::group_select.property_id));
+	Properties::group_route_active.property_id = g_quark_from_static_string (X_("route-active"));
+        DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for route-active = %1\n", Properties::group_route_active.property_id));
+	Properties::group_color.property_id = g_quark_from_static_string (X_("color"));
+        DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for color = %1\n", Properties::group_color.property_id));
+	Properties::group_monitoring.property_id = g_quark_from_static_string (X_("monitoring"));
+        DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for monitoring = %1\n", Properties::group_monitoring.property_id));
+	Properties::group_master_number.property_id = g_quark_from_static_string (X_("group-master-number"));
+        DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for group-master-number = %1\n", Properties::group_master_number.property_id));
+}
+
+#define ROUTE_GROUP_DEFAULT_PROPERTIES  _relative (Properties::group_relative, true) \
 	, _active (Properties::active, true) \
 	, _hidden (Properties::hidden, false) \
-	, _gain (Properties::gain, true) \
-	, _mute (Properties::mute, true) \
-	, _solo (Properties::solo, true) \
-	, _recenable (Properties::recenable, true) \
-	, _select (Properties::select, true) \
-	, _route_active (Properties::route_active, true) \
-	, _color (Properties::color, true) \
-	, _monitoring (Properties::monitoring, true)
+	, _gain (Properties::group_gain, true) \
+	, _mute (Properties::group_mute, true) \
+	, _solo (Properties::group_solo, true) \
+	, _recenable (Properties::group_recenable, true) \
+	, _select (Properties::group_select, true) \
+	, _route_active (Properties::group_route_active, true) \
+	, _color (Properties::group_color, true) \
+	, _monitoring (Properties::group_monitoring, true) \
+	, _group_master_number (Properties::group_master_number, -1)
 
 RouteGroup::RouteGroup (Session& s, const string &n)
 	: SessionObject (s, n)
 	, routes (new RouteList)
 	, ROUTE_GROUP_DEFAULT_PROPERTIES
+	, _solo_group (new ControlGroup (SoloAutomation))
+	, _mute_group (new ControlGroup (MuteAutomation))
+	, _rec_enable_group (new ControlGroup (RecEnableAutomation))
+	, _gain_group (new GainControlGroup ())
+	, _monitoring_group (new ControlGroup (MonitoringAutomation))
 {
 	_xml_node_name = X_("RouteGroup");
 
@@ -109,16 +122,29 @@ RouteGroup::RouteGroup (Session& s, const string &n)
 	add_property (_route_active);
 	add_property (_color);
 	add_property (_monitoring);
+	add_property (_group_master_number);
 }
 
 RouteGroup::~RouteGroup ()
 {
+	_solo_group->clear ();
+	_mute_group->clear ();
+	_gain_group->clear ();
+	_rec_enable_group->clear ();
+	_monitoring_group->clear ();
+
+	boost::shared_ptr<VCA> vca (group_master.lock());
+
 	for (RouteList::iterator i = routes->begin(); i != routes->end();) {
 		RouteList::iterator tmp = i;
 		++tmp;
 
 		(*i)->set_route_group (0);
 
+		if (vca) {
+			(*i)->unassign (vca);
+		}
+
 		i = tmp;
 	}
 }
@@ -139,9 +165,24 @@ RouteGroup::add (boost::shared_ptr<Route> r)
 
 	routes->push_back (r);
 
+	_solo_group->add_control (r->solo_control());
+	_mute_group->add_control (r->mute_control());
+	_gain_group->add_control (r->gain_control());
+	boost::shared_ptr<Track> trk = boost::dynamic_pointer_cast<Track> (r);
+	if (trk) {
+		_rec_enable_group->add_control (trk->rec_enable_control());
+		_monitoring_group->add_control (trk->monitoring_control());
+	}
+
 	r->set_route_group (this);
 	r->DropReferences.connect_same_thread (*this, boost::bind (&RouteGroup::remove_when_going_away, this, boost::weak_ptr<Route> (r)));
 
+	boost::shared_ptr<VCA> vca (group_master.lock());
+
+	if (vca) {
+		r->assign  (vca);
+	}
+
 	_session.set_dirty ();
 	RouteAdded (this, boost::weak_ptr<Route> (r)); /* EMIT SIGNAL */
 	return 0;
@@ -164,58 +205,30 @@ RouteGroup::remove (boost::shared_ptr<Route> r)
 
 	if ((i = find (routes->begin(), routes->end(), r)) != routes->end()) {
 		r->set_route_group (0);
-		routes->erase (i);
-		_session.set_dirty ();
-		RouteRemoved (this, boost::weak_ptr<Route> (r)); /* EMIT SIGNAL */
-		return 0;
-	}
-
-	return -1;
-}
 
+		boost::shared_ptr<VCA> vca = group_master.lock();
 
-gain_t
-RouteGroup::get_min_factor (gain_t factor)
-{
-	for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
-		gain_t const g = (*i)->gain_control()->get_value();
-
-		if ((g + g * factor) >= 0.0f) {
-			continue;
+		if (vca) {
+			r->unassign (vca);
 		}
 
-		if (g <= 0.0000003f) {
-			return 0.0f;
+		_solo_group->remove_control (r->solo_control());
+		_mute_group->remove_control (r->mute_control());
+		_gain_group->remove_control (r->gain_control());
+		boost::shared_ptr<Track> trk = boost::dynamic_pointer_cast<Track> (r);
+		if (trk) {
+			_rec_enable_group->remove_control (trk->rec_enable_control());
+			_monitoring_group->remove_control (trk->monitoring_control());
 		}
-
-		factor = 0.0000003f / g - 1.0f;
+		routes->erase (i);
+		_session.set_dirty ();
+		RouteRemoved (this, boost::weak_ptr<Route> (r)); /* EMIT SIGNAL */
+		return 0;
 	}
 
-	return factor;
+	return -1;
 }
 
-gain_t
-RouteGroup::get_max_factor (gain_t factor)
-{
-	for (RouteList::iterator i = routes->begin(); i != routes->end(); i++) {
-		gain_t const g = (*i)->gain_control()->get_value();
-
-		// if the current factor woulnd't raise this route above maximum
-		if ((g + g * factor) <= 1.99526231f) {
-			continue;
-		}
-
-		// if route gain is already at peak, return 0.0f factor
-		if (g >= 1.99526231f) {
-			return 0.0f;
-		}
-
-		// factor is calculated so that it would raise current route to max
-		factor = 1.99526231f / g - 1.0f;
-	}
-
-	return factor;
-}
 
 XMLNode&
 RouteGroup::get_state ()
@@ -248,7 +261,7 @@ RouteGroup::set_state (const XMLNode& node, int version)
 		return set_state_2X (node, version);
 	}
 
-	const XMLProperty *prop;
+	XMLProperty const * prop;
 
 	set_id (node);
 	set_values (node);
@@ -268,6 +281,19 @@ RouteGroup::set_state (const XMLNode& node, int version)
 		}
 	}
 
+	if (_group_master_number.val() > 0) {
+		boost::shared_ptr<VCA> vca = _session.vca_manager().vca_by_number (_group_master_number.val());
+		if (vca) {
+			/* no need to do the assignment because slaves will
+			   handle that themselves. But we can set group_master
+			   to use with future assignments of newly added routes.
+			*/
+			group_master = vca;
+		}
+	}
+
+	push_to_groups ();
+
 	return 0;
 }
 
@@ -292,6 +318,8 @@ RouteGroup::set_state_2X (const XMLNode& node, int /*version*/)
 		_color = false;
 	}
 
+	push_to_groups ();
+
 	return 0;
 }
 
@@ -301,8 +329,14 @@ RouteGroup::set_gain (bool yn)
 	if (is_gain() == yn) {
 		return;
 	}
+	if (has_control_master()) {
+		return;
+	}
+
 	_gain = yn;
-	send_change (PropertyChange (Properties::gain));
+	_gain_group->set_active (yn);
+
+	send_change (PropertyChange (Properties::group_gain));
 }
 
 void
@@ -312,7 +346,9 @@ RouteGroup::set_mute (bool yn)
 		return;
 	}
 	_mute = yn;
-	send_change (PropertyChange (Properties::mute));
+	_mute_group->set_active (yn);
+
+	send_change (PropertyChange (Properties::group_mute));
 }
 
 void
@@ -322,7 +358,9 @@ RouteGroup::set_solo (bool yn)
 		return;
 	}
 	_solo = yn;
-	send_change (PropertyChange (Properties::solo));
+	_solo_group->set_active (yn);
+
+	send_change (PropertyChange (Properties::group_solo));
 }
 
 void
@@ -332,7 +370,8 @@ RouteGroup::set_recenable (bool yn)
 		return;
 	}
 	_recenable = yn;
-	send_change (PropertyChange (Properties::recenable));
+	_rec_enable_group->set_active (yn);
+	send_change (PropertyChange (Properties::group_recenable));
 }
 
 void
@@ -342,7 +381,7 @@ RouteGroup::set_select (bool yn)
 		return;
 	}
 	_select = yn;
-	send_change (PropertyChange (Properties::select));
+	send_change (PropertyChange (Properties::group_select));
 }
 
 void
@@ -352,7 +391,7 @@ RouteGroup::set_route_active (bool yn)
 		return;
 	}
 	_route_active = yn;
-	send_change (PropertyChange (Properties::route_active));
+	send_change (PropertyChange (Properties::group_route_active));
 }
 
 void
@@ -363,7 +402,7 @@ RouteGroup::set_color (bool yn)
 	}
 	_color = yn;
 
-	send_change (PropertyChange (Properties::color));
+	send_change (PropertyChange (Properties::group_color));
 
 	/* This is a bit of a hack, but this might change
 	   our route's effective color, so emit gui_changed
@@ -383,7 +422,9 @@ RouteGroup::set_monitoring (bool yn)
 	}
 
 	_monitoring = yn;
-	send_change (PropertyChange (Properties::monitoring));
+	_monitoring_group->set_active (yn);
+
+	send_change (PropertyChange (Properties::group_monitoring));
 
 	_session.set_dirty ();
 }
@@ -396,6 +437,9 @@ RouteGroup::set_active (bool yn, void* /*src*/)
 	}
 
 	_active = yn;
+
+	push_to_groups ();
+
 	send_change (PropertyChange (Properties::active));
 	_session.set_dirty ();
 }
@@ -406,8 +450,12 @@ RouteGroup::set_relative (bool yn, void* /*src*/)
 	if (is_relative() == yn) {
 		return;
 	}
+
 	_relative = yn;
-	send_change (PropertyChange (Properties::relative));
+
+	push_to_groups ();
+
+	send_change (PropertyChange (Properties::group_relative));
 	_session.set_dirty ();
 }
 
@@ -475,7 +523,7 @@ RouteGroup::make_subgroup (bool aux, Placement placement)
 		 * (since tracks can't have fewer outs than ins,
 		 * "nin" currently defines the number of outpus if nin > 2)
 		 */
-		rl = _session.new_audio_route (nin, 2 /*XXX*/, 0, 1);
+		rl = _session.new_audio_route (nin, 2, 0, 1, string(), PresentationInfo::AudioBus, PresentationInfo::max_order);
 	} catch (...) {
 		return;
 	}
@@ -530,3 +578,91 @@ RouteGroup::enabled_property (PBD::PropertyID prop)
 
 	return dynamic_cast<const PropertyTemplate<bool>* > (i->second)->val ();
 }
+
+void
+RouteGroup::post_set (PBD::PropertyChange const &)
+{
+	push_to_groups ();
+}
+
+void
+RouteGroup::push_to_groups ()
+{
+	if (is_relative()) {
+		_gain_group->set_mode (ControlGroup::Mode (_gain_group->mode()|ControlGroup::Relative));
+	} else {
+		_gain_group->set_mode (ControlGroup::Mode (_gain_group->mode()&~ControlGroup::Relative));
+	}
+
+	if (_active) {
+		_gain_group->set_active (is_gain());
+		_solo_group->set_active (is_solo());
+		_mute_group->set_active (is_mute());
+		_rec_enable_group->set_active (is_recenable());
+		_monitoring_group->set_active (is_monitoring());
+	} else {
+		_gain_group->set_active (false);
+		_solo_group->set_active (false);
+		_mute_group->set_active (false);
+		_rec_enable_group->set_active (false);
+		_monitoring_group->set_active (false);
+	}
+}
+
+void
+RouteGroup::assign_master (boost::shared_ptr<VCA> master)
+{
+	if (!routes || routes->empty()) {
+		return;
+	}
+
+	boost::shared_ptr<Route> front = routes->front ();
+
+	if (front->slaved_to (master)) {
+		return;
+	}
+
+	for (RouteList::iterator r = routes->begin(); r != routes->end(); ++r) {
+		(*r)->assign (master);
+	}
+
+	group_master = master;
+	_group_master_number = master->number();
+}
+
+void
+RouteGroup::unassign_master (boost::shared_ptr<VCA> master)
+{
+	if (!routes || routes->empty()) {
+		return;
+	}
+
+	boost::shared_ptr<Route> front = routes->front ();
+
+	if (!front->slaved_to (master)) {
+		return;
+	}
+
+	for (RouteList::iterator r = routes->begin(); r != routes->end(); ++r) {
+		(*r)->unassign (master);
+	}
+
+	group_master.reset ();
+	_group_master_number = -1;
+}
+
+bool
+RouteGroup::slaved () const
+{
+	if (!routes || routes->empty()) {
+		return false;
+	}
+
+	return routes->front()->slaved ();
+}
+
+bool
+RouteGroup::has_control_master() const
+{
+	return group_master.lock() != 0;
+}
diff --git a/libs/ardour/route_group_member.cc b/libs/ardour/route_group_member.cc
index 9ca94bf..280d193 100644
--- a/libs/ardour/route_group_member.cc
+++ b/libs/ardour/route_group_member.cc
@@ -41,7 +41,7 @@ RouteGroupMember::use_group (PBD::Controllable::GroupControlDisposition gcd, boo
 {
 	bool active_for_predicate = _route_group && (_route_group->*predicate)() && _route_group->is_active();
 
-	return (gcd != PBD::Controllable::NoGroup) &&
+	return ((gcd != PBD::Controllable::NoGroup) && (gcd != PBD::Controllable::ForGroup)) &&
 		_route_group && 
 		((active_for_predicate && (gcd != PBD::Controllable::InverseGroup)) ||
 		 (!active_for_predicate && (gcd == PBD::Controllable::InverseGroup)));
diff --git a/libs/ardour/scene_change.cc b/libs/ardour/scene_change.cc
index aed8995..e9d3195 100644
--- a/libs/ardour/scene_change.cc
+++ b/libs/ardour/scene_change.cc
@@ -19,7 +19,7 @@
 
 #include "ardour/midi_scene_change.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace PBD;
 using namespace ARDOUR;
@@ -30,7 +30,7 @@ const uint32_t SceneChange::out_of_bound_color = 0x00000000; /* note: zero alpha
 boost::shared_ptr<SceneChange>
 SceneChange::factory (const XMLNode& node, int version)
 {
-	const XMLProperty* prop = node.property (X_("type"));
+	XMLProperty const * prop = node.property (X_("type"));
 
 	if (prop->value() == X_("MIDI")) {
 		return boost::shared_ptr<SceneChange> (new MIDISceneChange (node, version));
diff --git a/libs/ardour/search_paths.cc b/libs/ardour/search_paths.cc
index 50ecac6..96df905 100644
--- a/libs/ardour/search_paths.cc
+++ b/libs/ardour/search_paths.cc
@@ -38,6 +38,7 @@ namespace {
 	const char * const backend_env_variable_name = "ARDOUR_BACKEND_PATH";
 	const char * const surfaces_env_variable_name = "ARDOUR_SURFACES_PATH";
 	const char * const export_env_variable_name = "ARDOUR_EXPORT_FORMATS_PATH";
+	const char * const theme_env_variable_name = "ARDOUR_THEMES_PATH";
 	const char * const ladspa_env_variable_name = "LADSPA_PATH";
 	const char * const midi_patch_env_variable_name = "ARDOUR_MIDI_PATCH_PATH";
 	const char * const panner_env_variable_name = "ARDOUR_PANNER_PATH";
@@ -70,6 +71,16 @@ control_protocol_search_path ()
 }
 
 Searchpath
+theme_search_path ()
+{
+	Searchpath spath (ardour_data_search_path ());
+	spath.add_subdirectory_to_paths (theme_dir_name);
+
+	spath += Searchpath(Glib::getenv(theme_env_variable_name));
+	return spath;
+}
+
+Searchpath
 export_formats_search_path ()
 {
 	Searchpath spath (ardour_data_search_path());
@@ -163,6 +174,15 @@ route_template_search_path ()
 	return spath;
 }
 
+Searchpath
+lua_search_path ()
+{
+	Searchpath spath (ardour_data_search_path());
+	spath.add_subdirectory_to_paths(lua_dir_name);
+
+	return spath;
+}
+
 #ifdef PLATFORM_WINDOWS
 
 const char*
@@ -195,6 +215,7 @@ vst_search_path ()
 	}
 
 	if (p == 0) {
+#if ( (defined __i386__) || (defined _M_IX86) )
 		char *pVSTx86 = 0;
 		std::string pProgFilesX86 = PBD::get_win_special_folder_path (CSIDL_PROGRAM_FILESX86);
 
@@ -209,22 +230,21 @@ vst_search_path ()
 				g_free (pVSTx86);
 			}
 		}
+#else
+		// Look for a VST folder under C:\Program Files
+		char *pVST = 0;
+		std::string pProgFiles = PBD::get_win_special_folder_path (CSIDL_PROGRAM_FILES);
 
-		if (p == 0) {
-			// Look for a VST folder under C:\Program Files
-			char *pVST = 0;
-			std::string pProgFiles = PBD::get_win_special_folder_path (CSIDL_PROGRAM_FILES);
-
-			if (!pProgFiles.empty()) {
-				if ((pVST = g_build_filename (pProgFiles.c_str(), "Steinberg", "VSTPlugins", NULL))) {
-					if (Glib::file_test (pVST, Glib::FILE_TEST_EXISTS))
-						if (Glib::file_test (pVST, Glib::FILE_TEST_IS_DIR))
-							p = g_build_filename (pVST, NULL);
+		if (!pProgFiles.empty()) {
+			if ((pVST = g_build_filename (pProgFiles.c_str(), "Steinberg", "VSTPlugins", NULL))) {
+				if (Glib::file_test (pVST, Glib::FILE_TEST_EXISTS))
+					if (Glib::file_test (pVST, Glib::FILE_TEST_IS_DIR))
+						p = g_build_filename (pVST, NULL);
 
-					g_free (pVST);
-				}
+				g_free (pVST);
 			}
 		}
+#endif
 	}
 
 	if (p == 0) {
diff --git a/libs/ardour/send.cc b/libs/ardour/send.cc
index 23ae860..d0049ff 100644
--- a/libs/ardour/send.cc
+++ b/libs/ardour/send.cc
@@ -21,9 +21,9 @@
 #include <algorithm>
 
 #include "pbd/xml++.h"
-#include "pbd/boost_debug.h"
 
 #include "ardour/amp.h"
+#include "ardour/boost_debug.h"
 #include "ardour/buffer_set.h"
 #include "ardour/debug.h"
 #include "ardour/gain_control.h"
@@ -33,7 +33,7 @@
 #include "ardour/send.h"
 #include "ardour/session.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 namespace ARDOUR {
 class AutomationControl;
@@ -77,6 +77,7 @@ Send::Send (Session& s, boost::shared_ptr<Pannable> p, boost::shared_ptr<MuteMas
 	, _metering (false)
 	, _delay_in (0)
 	, _delay_out (0)
+	, _remove_on_disconnect (false)
 {
 	if (_role == Listen) {
 		/* we don't need to do this but it keeps things looking clean
@@ -99,6 +100,9 @@ Send::Send (Session& s, boost::shared_ptr<Pannable> p, boost::shared_ptr<MuteMas
 	if (panner_shell()) {
 		panner_shell()->Changed.connect_same_thread (*this, boost::bind (&Send::panshell_changed, this));
 	}
+	if (_output) {
+		_output->changed.connect_same_thread (*this, boost::bind (&Send::snd_output_changed, this, _1, _2));
+	}
 }
 
 Send::~Send ()
@@ -155,7 +159,7 @@ Send::set_delay_out(framecnt_t delay)
 }
 
 void
-Send::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, bool)
+Send::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, double speed, pframes_t nframes, bool)
 {
 	if (_output->n_ports() == ChanCount::ZERO) {
 		_meter->reset ();
@@ -181,13 +185,13 @@ Send::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframe
 
 	_amp->set_gain_automation_buffer (_session.send_gain_automation_buffer ());
 	_amp->setup_gain_automation (start_frame, end_frame, nframes);
-	_amp->run (sendbufs, start_frame, end_frame, nframes, true);
+	_amp->run (sendbufs, start_frame, end_frame, speed, nframes, true);
 
-	_delayline->run (sendbufs, start_frame, end_frame, nframes, true);
+	_delayline->run (sendbufs, start_frame, end_frame, speed, nframes, true);
 
 	/* deliver to outputs */
 
-	Delivery::run (sendbufs, start_frame, end_frame, nframes, true);
+	Delivery::run (sendbufs, start_frame, end_frame, speed, nframes, true);
 
 	/* consider metering */
 
@@ -195,7 +199,7 @@ Send::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframe
 		if (_amp->gain_control()->get_value() == 0) {
 			_meter->reset();
 		} else {
-			_meter->run (*_output_buffers, start_frame, end_frame, nframes, true);
+			_meter->run (*_output_buffers, start_frame, end_frame, speed, nframes, true);
 		}
 	}
 
@@ -221,6 +225,8 @@ Send::state (bool full)
 		node.add_property ("bitslot", buf);
 	}
 
+	node.add_property("selfdestruct", _remove_on_disconnect ? "yes" : "no");
+
 	node.add_child_nocopy (_amp->state (full));
 
 	return node;
@@ -233,7 +239,7 @@ Send::set_state (const XMLNode& node, int version)
 		return set_state_2X (node, version);
 	}
 
-	const XMLProperty* prop;
+	XMLProperty const * prop;
 
 	Delivery::set_state (node, version);
 
@@ -268,6 +274,10 @@ Send::set_state (const XMLNode& node, int version)
 		}
 	}
 
+	if ((prop = node.property (X_("selfdestruct"))) != 0) {
+		_remove_on_disconnect = string_is_affirmative (prop->value());
+	}
+
 	XMLNodeList nlist = node.children();
 	for (XMLNodeIterator i = nlist.begin(); i != nlist.end(); ++i) {
 		if ((*i)->name() == X_("Processor")) {
@@ -399,7 +409,18 @@ Send::display_to_user () const
 }
 
 string
-Send::value_as_string (boost::shared_ptr<AutomationControl> ac) const
+Send::value_as_string (boost::shared_ptr<const AutomationControl> ac) const
 {
 	return _amp->value_as_string (ac);
 }
+
+void
+Send::snd_output_changed (IOChange change, void* /*src*/)
+{
+	if (change.type & IOChange::ConnectionsChanged) {
+		if (!_output->connected() && _remove_on_disconnect) {
+			_remove_on_disconnect = false;
+			SelfDestruct (); /* EMIT SIGNAL */
+		}
+	}
+}
diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc
index 75547b5..61bfce1 100644
--- a/libs/ardour/session.cc
+++ b/libs/ardour/session.cc
@@ -36,12 +36,12 @@
 #include <boost/algorithm/string/erase.hpp>
 
 #include "pbd/basename.h"
-#include "pbd/boost_debug.h"
 #include "pbd/convert.h"
 #include "pbd/convert.h"
 #include "pbd/error.h"
 #include "pbd/file_utils.h"
 #include "pbd/md5.h"
+#include "pbd/pthread_utils.h"
 #include "pbd/search_path.h"
 #include "pbd/stacktrace.h"
 #include "pbd/stl_delete.h"
@@ -58,6 +58,7 @@
 #include "ardour/audioengine.h"
 #include "ardour/audiofilesource.h"
 #include "ardour/auditioner.h"
+#include "ardour/boost_debug.h"
 #include "ardour/buffer_manager.h"
 #include "ardour/buffer_set.h"
 #include "ardour/bundle.h"
@@ -73,6 +74,7 @@
 #include "ardour/filename_extensions.h"
 #include "ardour/gain_control.h"
 #include "ardour/graph.h"
+#include "ardour/luabindings.h"
 #include "ardour/midiport_manager.h"
 #include "ardour/scene_changer.h"
 #include "ardour/midi_patch_manager.h"
@@ -88,25 +90,31 @@
 #include "ardour/recent_sessions.h"
 #include "ardour/region.h"
 #include "ardour/region_factory.h"
+#include "ardour/revision.h"
 #include "ardour/route_graph.h"
 #include "ardour/route_group.h"
-#include "ardour/route_sorters.h"
 #include "ardour/send.h"
 #include "ardour/session.h"
 #include "ardour/session_directory.h"
 #include "ardour/session_playlists.h"
 #include "ardour/smf_source.h"
+#include "ardour/solo_isolate_control.h"
 #include "ardour/source_factory.h"
 #include "ardour/speakers.h"
 #include "ardour/tempo.h"
+#include "ardour/ticker.h"
 #include "ardour/track.h"
 #include "ardour/user_bundle.h"
 #include "ardour/utils.h"
+#include "ardour/vca_manager.h"
+#include "ardour/vca.h"
 
 #include "midi++/port.h"
 #include "midi++/mmc.h"
 
-#include "i18n.h"
+#include "LuaBridge/LuaBridge.h"
+
+#include "pbd/i18n.h"
 
 #include <glibmm/checksum.h>
 
@@ -122,11 +130,13 @@ using namespace PBD;
 
 bool Session::_disable_all_loaded_plugins = false;
 bool Session::_bypass_all_loaded_plugins = false;
+guint Session::_name_id_counter = 0;
 
 PBD::Signal1<int,uint32_t> Session::AudioEngineSetupRequired;
 PBD::Signal1<void,std::string> Session::Dialog;
 PBD::Signal0<int> Session::AskAboutPendingState;
 PBD::Signal2<int, framecnt_t, framecnt_t> Session::AskAboutSampleRateMismatch;
+PBD::Signal2<void, framecnt_t, framecnt_t> Session::NotifyAboutSampleRateMismatch;
 PBD::Signal0<void> Session::SendFeedback;
 PBD::Signal3<int,Session*,std::string,DataType> Session::MissingFile;
 
@@ -162,12 +172,13 @@ Session::Session (AudioEngine &eng,
 	, _bounce_processing_active (false)
 	, waiting_for_sync_offset (false)
 	, _base_frame_rate (0)
-	, _current_frame_rate (0)
 	, _nominal_frame_rate (0)
+	, _current_frame_rate (0)
 	, transport_sub_state (0)
 	, _record_status (Disabled)
 	, _transport_frame (0)
 	, _session_range_location (0)
+	, _session_range_end_is_free (true)
 	, _slave (0)
 	, _silent (false)
 	, _transport_speed (0)
@@ -201,8 +212,10 @@ Session::Session (AudioEngine &eng,
 	, post_export_sync (false)
 	, post_export_position (0)
 	, _exporting (false)
-	, _export_started (false)
 	, _export_rolling (false)
+	, _realtime_export (false)
+	, _export_preroll (0)
+	, _export_latency (0)
 	, _pre_export_mmc_enabled (false)
 	, _name (snapshot_name)
 	, _is_new (true)
@@ -227,6 +240,9 @@ Session::Session (AudioEngine &eng,
 	, pending_locate_flush (false)
 	, pending_abort (false)
 	, pending_auto_loop (false)
+	, _mempool ("Session", 2097152)
+	, lua (lua_newstate (&PBD::ReallocPool::lalloc, &_mempool))
+	, _n_lua_scripts (0)
 	, _butler (new Butler (*this))
 	, _post_transport_work (0)
 	,  cumulative_rf_motion (0)
@@ -235,6 +251,8 @@ Session::Session (AudioEngine &eng,
 	, _ignore_skips_updates (false)
 	, _rt_thread_active (false)
 	, _rt_emit_pending (false)
+	, _ac_thread_active (false)
+	, _latency_recompute_pending (0)
 	, step_speed (0)
 	, outbound_mtc_timecode_frame (0)
 	, next_quarter_frame_to_send (-1)
@@ -290,23 +308,34 @@ Session::Session (AudioEngine &eng,
 	, first_file_header_format_reset (true)
 	, have_looped (false)
 	, _have_rec_enabled_track (false)
-    , _have_rec_disabled_track (true)
+	, _have_rec_disabled_track (true)
 	, _step_editors (0)
 	, _suspend_timecode_transmission (0)
 	,  _speakers (new Speakers)
-	, _order_hint (-1)
 	, ignore_route_processor_changes (false)
+	, midi_clock (0)
 	, _scene_changer (0)
 	, _midi_ports (0)
 	, _mmc (0)
+	, _vca_manager (new VCAManager (*this))
 {
 	uint32_t sr = 0;
 
+	created_with = string_compose ("%1 %2", PROGRAM_NAME, revision);
+
 	pthread_mutex_init (&_rt_emit_mutex, 0);
 	pthread_cond_init (&_rt_emit_cond, 0);
 
+	pthread_mutex_init (&_auto_connect_mutex, 0);
+	pthread_cond_init (&_auto_connect_cond, 0);
+
+	init_name_id_counter (1); // reset for new sessions, start at 1
+	VCA::set_next_vca_number (1); // reset for new sessions, start at 1
+
 	pre_engine_init (fullpath);
 
+	setup_lua ();
+
 	if (_is_new) {
 
 		Stateful::loading_state_version = CURRENT_SESSION_FILE_VERSION;
@@ -314,7 +343,7 @@ Session::Session (AudioEngine &eng,
 #ifdef USE_TRACKS_CODE_FEATURES
 		sr = EngineStateController::instance()->get_current_sample_rate();
 #endif
-		if (ensure_engine (sr)) {
+		if (ensure_engine (sr, true)) {
 			destroy ();
 			throw SessionException (_("Cannot connect to audio/midi engine"));
 		}
@@ -362,13 +391,14 @@ Session::Session (AudioEngine &eng,
 		 */
 
 		if (state_tree) {
-			const XMLProperty* prop;
-			if ((prop = state_tree->root()->property (X_("sample-rate"))) != 0) {
+			XMLProperty const * prop;
+			XMLNode const * root (state_tree->root());
+			if ((prop = root->property (X_("sample-rate"))) != 0) {
 				sr = atoi (prop->value());
 			}
 		}
 
-		if (ensure_engine (sr)) {
+		if (ensure_engine (sr, false)) {
 			destroy ();
 			throw SessionException (_("Cannot connect to audio/midi engine"));
 		}
@@ -396,6 +426,7 @@ Session::Session (AudioEngine &eng,
 	EndTimeChanged.connect_same_thread (*this, boost::bind (&Session::end_time_changed, this, _1));
 
 	emit_thread_start ();
+	auto_connect_thread_start ();
 
 	/* hook us up to the engine since we are now completely constructed */
 
@@ -461,8 +492,26 @@ Session::~Session ()
 	destroy ();
 }
 
+unsigned int
+Session::next_name_id ()
+{
+	return g_atomic_int_add (&_name_id_counter, 1);
+}
+
+unsigned int
+Session::name_id_counter ()
+{
+	return g_atomic_int_get (&_name_id_counter);
+}
+
+void
+Session::init_name_id_counter (guint n)
+{
+	g_atomic_int_set (&_name_id_counter, n);
+}
+
 int
-Session::ensure_engine (uint32_t desired_sample_rate)
+Session::ensure_engine (uint32_t desired_sample_rate, bool isnew)
 {
 	if (_engine.current_backend() == 0) {
 		/* backend is unknown ... */
@@ -470,6 +519,8 @@ Session::ensure_engine (uint32_t desired_sample_rate)
 		if (r.get_value_or (-1) != 0) {
 			return -1;
 		}
+	} else if (!isnew && _engine.running() && _engine.sample_rate () == desired_sample_rate) {
+		/* keep engine */
 	} else if (_engine.setup_required()) {
 		/* backend is known, but setup is needed */
 		boost::optional<int> r = AudioEngineSetupRequired (desired_sample_rate);
@@ -482,8 +533,7 @@ Session::ensure_engine (uint32_t desired_sample_rate)
 		}
 	}
 
-	/* at this point the engine should be running
-	*/
+	/* at this point the engine should be running */
 
 	if (!_engine.running()) {
 		return -1;
@@ -521,6 +571,7 @@ Session::immediately_post_engine ()
 	}
 
 	try {
+		LocaleGuard lg;
 		BootMessage (_("Set up LTC"));
 		setup_ltc ();
 		BootMessage (_("Set up Click"));
@@ -555,8 +606,12 @@ Session::destroy ()
 
 	_state_of_the_state = StateOfTheState (CannotSave|Deletion);
 
+	/* stop autoconnecting */
+	auto_connect_thread_terminate ();
+
 	/* disconnect from any and all signals that we are connected to */
 
+	Port::PortSignalDrop (); /* EMIT SIGNAL */
 	drop_connections ();
 
 	/* shutdown control surface protocols while we still have ports
@@ -590,8 +645,19 @@ Session::destroy ()
 	delete state_tree;
 	state_tree = 0;
 
-	/* reset dynamic state version back to default */
+	// unregister all lua functions, drop held references (if any)
+	(*_lua_cleanup)();
+	lua.do_command ("Session = nil");
+	delete _lua_run;
+	delete _lua_add;
+	delete _lua_del;
+	delete _lua_list;
+	delete _lua_save;
+	delete _lua_load;
+	delete _lua_cleanup;
+	lua.collect_garbage ();
 
+	/* reset dynamic state version back to default */
 	Stateful::loading_state_version = 0;
 
 	_butler->drop_references ();
@@ -638,6 +704,11 @@ Session::destroy ()
 	DEBUG_TRACE (DEBUG::Destruction, "delete regions\n");
 	RegionFactory::delete_all_regions ();
 
+	/* Do this early so that VCAs no longer hold references to routes */
+
+	DEBUG_TRACE (DEBUG::Destruction, "delete vcas\n");
+	delete _vca_manager;
+
 	DEBUG_TRACE (DEBUG::Destruction, "delete routes\n");
 
 	/* reset these three references to special routes before we do the usual route delete thing */
@@ -678,6 +749,9 @@ Session::destroy ()
 	pthread_cond_destroy (&_rt_emit_cond);
 	pthread_mutex_destroy (&_rt_emit_mutex);
 
+	pthread_cond_destroy (&_auto_connect_cond);
+	pthread_mutex_destroy (&_auto_connect_mutex);
+
 	delete _scene_changer; _scene_changer = 0;
 	delete midi_control_ui; midi_control_ui = 0;
 
@@ -685,13 +759,48 @@ Session::destroy ()
 	delete _midi_ports; _midi_ports = 0;
 	delete _locations; _locations = 0;
 
+	delete midi_clock;
 	delete _tempo_map;
 
+	/* clear event queue, the session is gone, nobody is interested in
+	 * those anymore, but they do leak memory if not removed
+	 */
+	while (!immediate_events.empty ()) {
+		Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
+		SessionEvent *ev = immediate_events.front ();
+		DEBUG_TRACE (DEBUG::SessionEvents, string_compose ("Drop event: %1\n", enum_2_string (ev->type)));
+		immediate_events.pop_front ();
+		bool remove = true;
+		bool del = true;
+		switch (ev->type) {
+			case SessionEvent::AutoLoop:
+			case SessionEvent::AutoLoopDeclick:
+			case SessionEvent::Skip:
+			case SessionEvent::PunchIn:
+			case SessionEvent::PunchOut:
+			case SessionEvent::StopOnce:
+			case SessionEvent::RangeStop:
+			case SessionEvent::RangeLocate:
+				remove = false;
+				del = false;
+				break;
+			case SessionEvent::RealTimeOperation:
+				process_rtop (ev);
+				del = false;
+			default:
+				break;
+		}
+		if (remove) {
+			del = del && !_remove_event (ev);
+		}
+		if (del) {
+			delete ev;
+		}
+	}
+
 	DEBUG_TRACE (DEBUG::Destruction, "Session::destroy() done\n");
 
-#ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
-	boost_debug_list_ptrs ();
-#endif
+	BOOST_SHOW_POINTERS ();
 }
 
 void
@@ -1023,11 +1132,16 @@ Session::remove_monitor_section ()
 	}
 
 	remove_route (_monitor_out);
+	if (_state_of_the_state & Deletion) {
+		return;
+	}
+
 	auto_connect_master_bus ();
 
 	if (auditioner) {
 		auditioner->connect ();
 	}
+
 	Config->ParameterChanged ("use-monitor-bus");
 }
 
@@ -1040,15 +1154,14 @@ Session::add_monitor_section ()
 		return;
 	}
 
-	boost::shared_ptr<Route> r (new Route (*this, _("Monitor"), Route::MonitorOut, DataType::AUDIO));
+	boost::shared_ptr<Route> r (new Route (*this, _("Monitor"), PresentationInfo::MonitorOut, DataType::AUDIO));
 
 	if (r->init ()) {
 		return;
 	}
 
-#ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
-	// boost_debug_shared_ptr_mark_interesting (r.get(), "Route");
-#endif
+	BOOST_MARK_ROUTE(r);
+
 	try {
 		Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
 		r->input()->ensure_io (_master_out->output()->n_ports(), false, this);
@@ -1059,7 +1172,7 @@ Session::add_monitor_section ()
 	}
 
 	rl.push_back (r);
-	add_routes (rl, false, false, false);
+	add_routes (rl, false, false, false, 0);
 
 	assert (_monitor_out);
 
@@ -1099,7 +1212,7 @@ Session::add_monitor_section ()
 	/* if monitor section is not connected, connect it to physical outs
 	 */
 
-	if (Config->get_auto_connect_standard_busses() && !_monitor_out->output()->connected ()) {
+	if ((Config->get_auto_connect_standard_busses () || Profile->get_mixbus ()) && !_monitor_out->output()->connected ()) {
 
 		if (!Config->get_monitor_bus_preferred_bundle().empty()) {
 
@@ -1205,8 +1318,12 @@ Session::reset_monitor_section ()
 	_master_out->output()->disconnect (this);
 	_monitor_out->output()->disconnect (this);
 
-	_monitor_out->input()->ensure_io (_master_out->output()->n_ports(), false, this);
-	_monitor_out->output()->ensure_io (_master_out->output()->n_ports(), false, this);
+	// monitor section follow master bus - except midi
+	ChanCount mon_chn (_master_out->output()->n_ports());
+	mon_chn.set_midi (0);
+
+	_monitor_out->input()->ensure_io (mon_chn, false, this);
+	_monitor_out->output()->ensure_io (mon_chn, false, this);
 
 	for (uint32_t n = 0; n < limit; ++n) {
 		boost::shared_ptr<AudioPort> p = _monitor_out->input()->ports().nth_audio_port (n);
@@ -1401,7 +1518,7 @@ Session::set_track_monitor_input_status (bool yn)
 	boost::shared_ptr<RouteList> rl = routes.reader ();
 	for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
 		boost::shared_ptr<AudioTrack> tr = boost::dynamic_pointer_cast<AudioTrack> (*i);
-		if (tr && tr->record_enabled ()) {
+		if (tr && tr->rec_enable_control()->get_value()) {
 			//cerr << "switching to input = " << !auto_input << __FILE__ << __LINE__ << endl << endl;
 			tr->request_input_monitoring (yn);
 		}
@@ -1836,15 +1953,9 @@ void
 Session::set_all_tracks_record_enabled (bool enable )
 {
 	boost::shared_ptr<RouteList> rl = routes.reader();
-	for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
-		boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
-		if (tr) {
-			tr->set_record_enabled (enable, Controllable::NoGroup);
-		}
-	}
+	set_controls (route_list_to_control_list (rl, &Stripable::rec_enable_control), enable, Controllable::NoGroup);
 }
 
-
 void
 Session::disable_record (bool rt_context, bool force)
 {
@@ -1919,59 +2030,55 @@ framepos_t
 Session::audible_frame () const
 {
 	framepos_t ret;
-	framepos_t tf;
-	framecnt_t offset;
 
-	offset = worst_playback_latency ();
+	frameoffset_t offset = worst_playback_latency (); // - _engine.samples_since_cycle_start ();
+	offset *= transport_speed ();
 
 	if (synced_to_engine()) {
 		/* Note: this is basically just sync-to-JACK */
-		tf = _engine.transport_frame();
+		ret = _engine.transport_frame();
 	} else {
-		tf = _transport_frame;
+		ret = _transport_frame;
 	}
 
-	ret = tf;
-
-	if (!non_realtime_work_pending()) {
-
-		/* MOVING */
+	if (transport_rolling()) {
+		ret -= offset;
 
 		/* Check to see if we have passed the first guaranteed
-		   audible frame past our last start position. if not,
-		   return that last start point because in terms
-		   of audible frames, we have not moved yet.
-
-		   `Start position' in this context means the time we last
-		   either started, located, or changed transport direction.
-		*/
+		 * audible frame past our last start position. if not,
+		 * return that last start point because in terms
+		 * of audible frames, we have not moved yet.
+		 *
+		 * `Start position' in this context means the time we last
+		 * either started, located, or changed transport direction.
+		 */
 
 		if (_transport_speed > 0.0f) {
 
 			if (!play_loop || !have_looped) {
-				if (tf < _last_roll_or_reversal_location + offset) {
+				if (ret < _last_roll_or_reversal_location) {
 					return _last_roll_or_reversal_location;
 				}
+			} else {
+				// latent loops
+				Location *location = _locations->auto_loop_location();
+				frameoffset_t lo = location->start() - ret;
+				if (lo > 0) {
+					ret = location->end () - lo;
+				}
 			}
 
-
-			/* forwards */
-			ret -= offset;
-
 		} else if (_transport_speed < 0.0f) {
 
 			/* XXX wot? no backward looping? */
 
-			if (tf > _last_roll_or_reversal_location - offset) {
+			if (ret > _last_roll_or_reversal_location) {
 				return _last_roll_or_reversal_location;
-			} else {
-				/* backwards */
-				ret += offset;
 			}
 		}
 	}
 
-	return ret;
+	return std::max ((framepos_t)0, ret);
 }
 
 void
@@ -1984,7 +2091,12 @@ Session::set_frame_rate (framecnt_t frames_per_second)
 		here.
 	*/
 
-	_base_frame_rate = frames_per_second;
+	if (_base_frame_rate == 0) {
+		_base_frame_rate = frames_per_second;
+	}
+	else if (_base_frame_rate != frames_per_second && frames_per_second != _nominal_frame_rate) {
+		NotifyAboutSampleRateMismatch (_base_frame_rate, frames_per_second);
+	}
 	_nominal_frame_rate = frames_per_second;
 
 	sync_time_vars();
@@ -2107,16 +2219,18 @@ Session::resort_routes ()
 	}
 
 #ifndef NDEBUG
-	boost::shared_ptr<RouteList> rl = routes.reader ();
-	for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
-		DEBUG_TRACE (DEBUG::Graph, string_compose ("%1 fed by ...\n", (*i)->name()));
+	if (DEBUG_ENABLED(DEBUG::Graph)) {
+		boost::shared_ptr<RouteList> rl = routes.reader ();
+		for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
+			DEBUG_TRACE (DEBUG::Graph, string_compose ("%1 fed by ...\n", (*i)->name()));
 
-		const Route::FedBy& fb ((*i)->fed_by());
+			const Route::FedBy& fb ((*i)->fed_by());
 
-		for (Route::FedBy::const_iterator f = fb.begin(); f != fb.end(); ++f) {
-			boost::shared_ptr<Route> sf = f->r.lock();
-			if (sf) {
-				DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 (sends only ? %2)\n", sf->name(), f->sends_only));
+			for (Route::FedBy::const_iterator f = fb.begin(); f != fb.end(); ++f) {
+				boost::shared_ptr<Route> sf = f->r.lock();
+				if (sf) {
+					DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 (sends only ? %2)\n", sf->name(), f->sends_only));
+				}
 			}
 		}
 	}
@@ -2198,8 +2312,7 @@ Session::resort_routes_using (boost::shared_ptr<RouteList> r)
 #ifndef NDEBUG
 		DEBUG_TRACE (DEBUG::Graph, "Routes resorted, order follows:\n");
 		for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
-			DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 signal order %2\n",
-								   (*i)->name(), (*i)->order_key ()));
+			DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 presentation order %2\n", (*i)->name(), (*i)->presentation_info().order()));
 		}
 #endif
 
@@ -2317,8 +2430,10 @@ Session::default_track_name_pattern (DataType t)
  *  @param instrument plugin info for the instrument to insert pre-fader, if any
  */
 list<boost::shared_ptr<MidiTrack> >
-Session::new_midi_track (const ChanCount& input, const ChanCount& output, boost::shared_ptr<PluginInfo> instrument,
-			 TrackMode mode, RouteGroup* route_group, uint32_t how_many, string name_template)
+Session::new_midi_track (const ChanCount& input, const ChanCount& output,
+                         boost::shared_ptr<PluginInfo> instrument, Plugin::PresetRecord* pset,
+                         RouteGroup* route_group, uint32_t how_many, string name_template, PresentationInfo::order_t order,
+                         TrackMode mode)
 {
 	string track_name;
 	uint32_t track_id = 0;
@@ -2338,17 +2453,20 @@ Session::new_midi_track (const ChanCount& input, const ChanCount& output, boost:
 		boost::shared_ptr<MidiTrack> track;
 
 		try {
-			track.reset (new MidiTrack (*this, track_name, Route::Flag (0), mode));
+			track.reset (new MidiTrack (*this, track_name, mode));
 
 			if (track->init ()) {
 				goto failed;
 			}
 
+			if (Profile->get_mixbus ()) {
+				track->set_strict_io (true);
+			}
+
 			track->use_new_diskstream();
 
-#ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
-			// boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
-#endif
+			BOOST_MARK_TRACK (track);
+
 			{
 				Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
 				if (track->input()->ensure_io (input, false, this)) {
@@ -2370,14 +2488,8 @@ Session::new_midi_track (const ChanCount& input, const ChanCount& output, boost:
 
 			track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
 
-			if (Config->get_remote_model() == UserOrdered) {
-				track->set_remote_control_id (next_control_id());
-			}
-
 			new_routes.push_back (track);
 			ret.push_back (track);
-
-			RouteAddedOrRemoved (true); /* EMIT SIGNAL */
 		}
 
 		catch (failed_constructor &err) {
@@ -2398,14 +2510,17 @@ Session::new_midi_track (const ChanCount& input, const ChanCount& output, boost:
 	if (!new_routes.empty()) {
 		StateProtector sp (this);
 		if (Profile->get_trx()) {
-			add_routes (new_routes, false, false, false);
+			add_routes (new_routes, false, false, false, order);
 		} else {
-			add_routes (new_routes, true, true, false);
+			add_routes (new_routes, true, true, false, order);
 		}
 
 		if (instrument) {
 			for (RouteList::iterator r = new_routes.begin(); r != new_routes.end(); ++r) {
 				PluginPtr plugin = instrument->load (*this);
+				if (pset) {
+					plugin->load_preset (*pset);
+				}
 				boost::shared_ptr<Processor> p (new PluginInsert (*this, plugin));
 				(*r)->add_processor (p, PreFader);
 
@@ -2416,154 +2531,118 @@ Session::new_midi_track (const ChanCount& input, const ChanCount& output, boost:
 	return ret;
 }
 
-void
-Session::midi_output_change_handler (IOChange change, void * /*src*/, boost::weak_ptr<Route> wmt)
+RouteList
+Session::new_midi_route (RouteGroup* route_group, uint32_t how_many, string name_template, boost::shared_ptr<PluginInfo> instrument, Plugin::PresetRecord* pset,
+                         PresentationInfo::Flag flag, PresentationInfo::order_t order)
 {
-        boost::shared_ptr<Route> midi_track (wmt.lock());
-
-        if (!midi_track) {
-                return;
-        }
-
-	if ((change.type & IOChange::ConfigurationChanged) && Config->get_output_auto_connect() != ManualConnect) {
-
-                if (change.after.n_audio() <= change.before.n_audio()) {
-                        return;
-                }
-
-                /* new audio ports: make sure the audio goes somewhere useful,
-                   unless the user has no-auto-connect selected.
-
-                   The existing ChanCounts don't matter for this call as they are only
-                   to do with matching input and output indices, and we are only changing
-                   outputs here.
-                */
+	string bus_name;
+	uint32_t bus_id = 0;
+	string port;
+	RouteList ret;
 
-                ChanCount dummy;
+	bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Midi Bus");
 
-                auto_connect_route (midi_track, dummy, dummy, false, false, ChanCount(), change.before);
-        }
-}
+	while (how_many) {
+		if (!find_route_name (name_template.empty () ? _("Midi Bus") : name_template, ++bus_id, bus_name, use_number)) {
+			error << "cannot find name for new midi bus" << endmsg;
+			goto failure;
+		}
 
-/** @param connect_inputs true to connect inputs as well as outputs, false to connect just outputs.
- *  @param input_start Where to start from when auto-connecting inputs; e.g. if this is 0, auto-connect starting from input 0.
- *  @param output_start As \a input_start, but for outputs.
- */
-void
-Session::auto_connect_route (boost::shared_ptr<Route> route, ChanCount& existing_inputs, ChanCount& existing_outputs,
-                             bool with_lock, bool connect_inputs, ChanCount input_start, ChanCount output_start)
-{
-	if (!IO::connecting_legal) {
-		return;
-	}
+		try {
+			boost::shared_ptr<Route> bus (new Route (*this, bus_name, flag, DataType::AUDIO)); // XXX Editor::add_routes is not ready for ARDOUR::DataType::MIDI
 
-	Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
+			if (bus->init ()) {
+				goto failure;
+			}
 
-	if (with_lock) {
-		lm.acquire ();
-	}
+			if (Profile->get_mixbus ()) {
+				bus->set_strict_io (true);
+			}
 
-	/* If both inputs and outputs are auto-connected to physical ports,
-	   use the max of input and output offsets to ensure auto-connected
-	   port numbers always match up (e.g. the first audio input and the
-	   first audio output of the route will have the same physical
-	   port number).  Otherwise just use the lowest input or output
-	   offset possible.
-	*/
+			BOOST_MARK_ROUTE(bus);
 
-	DEBUG_TRACE (DEBUG::Graph,
-	             string_compose("Auto-connect: existing in = %1 out = %2\n",
-	                            existing_inputs, existing_outputs));
+			{
+				Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
 
-	const bool in_out_physical =
-		(Config->get_input_auto_connect() & AutoConnectPhysical)
-		&& (Config->get_output_auto_connect() & AutoConnectPhysical)
-		&& connect_inputs;
+				if (bus->input()->ensure_io (ChanCount(DataType::MIDI, 1), false, this)) {
+					error << _("cannot configure new midi bus input") << endmsg;
+					goto failure;
+				}
 
-	const ChanCount in_offset = in_out_physical
-		? ChanCount::max(existing_inputs, existing_outputs)
-                : existing_inputs;
 
-	const ChanCount out_offset = in_out_physical
-		? ChanCount::max(existing_inputs, existing_outputs)
-		: existing_outputs;
+				if (bus->output()->ensure_io (ChanCount(DataType::MIDI, 1), false, this)) {
+					error << _("cannot configure new midi bus output") << endmsg;
+					goto failure;
+				}
+			}
 
-	for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
-		vector<string> physinputs;
-		vector<string> physoutputs;
+			if (route_group) {
+				route_group->add (bus);
+			}
 
-		_engine.get_physical_outputs (*t, physoutputs);
-		_engine.get_physical_inputs (*t, physinputs);
+			bus->add_internal_return ();
+			ret.push_back (bus);
+		}
 
-		if (!physinputs.empty() && connect_inputs) {
-			uint32_t nphysical_in = physinputs.size();
+		catch (failed_constructor &err) {
+			error << _("Session: could not create new audio route.") << endmsg;
+			goto failure;
+		}
 
-			DEBUG_TRACE (DEBUG::Graph,
-			             string_compose("There are %1 physical inputs of type %2\n",
-			                            nphysical_in, *t));
+		catch (AudioEngine::PortRegistrationFailure& pfe) {
+			error << pfe.what() << endmsg;
+			goto failure;
+		}
 
-			for (uint32_t i = input_start.get(*t); i < route->n_inputs().get(*t) && i < nphysical_in; ++i) {
-				string port;
 
-				if (Config->get_input_auto_connect() & AutoConnectPhysical) {
-					DEBUG_TRACE (DEBUG::Graph,
-					             string_compose("Get index %1 + %2 % %3 = %4\n",
-					                            in_offset.get(*t), i, nphysical_in,
-					                            (in_offset.get(*t) + i) % nphysical_in));
-					port = physinputs[(in_offset.get(*t) + i) % nphysical_in];
-				}
+		--how_many;
+	}
 
-				DEBUG_TRACE (DEBUG::Graph,
-				             string_compose("Connect route %1 IN to %2\n",
-				                            route->name(), port));
+  failure:
+	if (!ret.empty()) {
+		StateProtector sp (this);
+		add_routes (ret, false, false, false, order);
 
-				if (!port.empty() && route->input()->connect (route->input()->ports().port(*t, i), port, this)) {
-					break;
+		if (instrument) {
+			for (RouteList::iterator r = ret.begin(); r != ret.end(); ++r) {
+				PluginPtr plugin = instrument->load (*this);
+				if (pset) {
+					plugin->load_preset (*pset);
 				}
-
-                                ChanCount one_added (*t, 1);
-                                existing_inputs += one_added;
+				boost::shared_ptr<Processor> p (new PluginInsert (*this, plugin));
+				(*r)->add_processor (p, PreFader);
 			}
 		}
+	}
 
-		if (!physoutputs.empty()) {
-			uint32_t nphysical_out = physoutputs.size();
-			for (uint32_t i = output_start.get(*t); i < route->n_outputs().get(*t); ++i) {
-				string port;
+	return ret;
 
-				/* Waves Tracks:
-				 * do not create new connections if we reached the limit of physical outputs
-				 * in Multi Out mode
-				 */
+}
 
-				if (!(Config->get_output_auto_connect() & AutoConnectMaster) &&
-				    ARDOUR::Profile->get_trx () &&
-				    existing_outputs.get(*t) == nphysical_out ) {
-					break;
-				}
 
-				if ((*t) == DataType::MIDI && (Config->get_output_auto_connect() & AutoConnectPhysical)) {
-					port = physoutputs[(out_offset.get(*t) + i) % nphysical_out];
-				} else if ((*t) == DataType::AUDIO && (Config->get_output_auto_connect() & AutoConnectMaster)) {
-                                        /* master bus is audio only */
-					if (_master_out && _master_out->n_inputs().get(*t) > 0) {
-						port = _master_out->input()->ports().port(*t,
-								i % _master_out->input()->n_ports().get(*t))->name();
-					}
-				}
+void
+Session::midi_output_change_handler (IOChange change, void * /*src*/, boost::weak_ptr<Route> wmt)
+{
+	boost::shared_ptr<Route> midi_track (wmt.lock());
 
-				DEBUG_TRACE (DEBUG::Graph,
-				             string_compose("Connect route %1 OUT to %2\n",
-				                            route->name(), port));
+	if (!midi_track) {
+		return;
+	}
 
-				if (!port.empty() && route->output()->connect (route->output()->ports().port(*t, i), port, this)) {
-					break;
-				}
+	if ((change.type & IOChange::ConfigurationChanged) && Config->get_output_auto_connect() != ManualConnect) {
 
-                                ChanCount one_added (*t, 1);
-                                existing_outputs += one_added;
-			}
+		if (change.after.n_audio() <= change.before.n_audio()) {
+			return;
 		}
+
+		/* new audio ports: make sure the audio goes somewhere useful,
+		 * unless the user has no-auto-connect selected.
+		 *
+		 * The existing ChanCounts don't matter for this call as they are only
+		 * to do with matching input and output indices, and we are only changing
+		 * outputs here.
+		 */
+		auto_connect_route (midi_track, false, ChanCount(), change.before);
 	}
 }
 
@@ -2725,8 +2804,6 @@ Session::reconnect_existing_routes (bool withLock, bool reconnect_master, bool r
 					}
 				}
 			}
-
-			//auto_connect_route (*rIter, inputs, outputs, false, reconnectIputs);
 		}
 
 		_master_out->output()->disconnect (this);
@@ -2851,12 +2928,40 @@ Session::reconnect_mmc_ports(bool inputs)
 
 #endif
 
+void
+Session::ensure_route_presentation_info_gap (PresentationInfo::order_t first_new_order, uint32_t how_many)
+{
+	if (first_new_order == PresentationInfo::max_order) {
+		/* adding at end, no worries */
+		return;
+	}
+
+	/* create a gap in the presentation info to accomodate @param how_many
+	 * new objects.
+	 */
+	StripableList sl;
+	get_stripables (sl);
+
+	for (StripableList::iterator si = sl.begin(); si != sl.end(); ++si) {
+		boost::shared_ptr<Stripable> s (*si);
+
+		if (s->is_monitor() || s->is_auditioner()) {
+			continue;
+		}
+
+		if (s->presentation_info().order () >= first_new_order) {
+			s->set_presentation_order (s->presentation_info().order () + how_many);
+		}
+	}
+}
+
 /** Caller must not hold process lock
  *  @param name_template string to use for the start of the name, or "" to use "Audio".
  */
 list< boost::shared_ptr<AudioTrack> >
-Session::new_audio_track (int input_channels, int output_channels, TrackMode mode, RouteGroup* route_group,
-			  uint32_t how_many, string name_template)
+Session::new_audio_track (int input_channels, int output_channels, RouteGroup* route_group,
+                          uint32_t how_many, string name_template, PresentationInfo::order_t order,
+                          TrackMode mode)
 {
 	string track_name;
 	uint32_t track_id = 0;
@@ -2877,12 +2982,16 @@ Session::new_audio_track (int input_channels, int output_channels, TrackMode mod
 		boost::shared_ptr<AudioTrack> track;
 
 		try {
-			track.reset (new AudioTrack (*this, track_name, Route::Flag (0), mode));
+			track.reset (new AudioTrack (*this, track_name, mode));
 
 			if (track->init ()) {
 				goto failed;
 			}
 
+			if (Profile->get_mixbus ()) {
+				track->set_strict_io (true);
+			}
+
 			if (ARDOUR::Profile->get_trx ()) {
 				// TRACKS considers it's not a USE CASE, it's
 				// a piece of behavior of the session model:
@@ -2893,15 +3002,14 @@ Session::new_audio_track (int input_channels, int output_channels, TrackMode mod
 				//  0 for Stereo Out mode
 				//  0 Multi Out mode
 				if (Config->get_output_auto_connect() & AutoConnectMaster) {
-					track->set_gain (dB_to_coefficient (0), Controllable::NoGroup);
+					track->gain_control()->set_value (dB_to_coefficient (0), Controllable::NoGroup);
 				}
 			}
 
 			track->use_new_diskstream();
 
-#ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
-			// boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
-#endif
+			BOOST_MARK_TRACK (track);
+
 			{
 				Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
 
@@ -2929,14 +3037,9 @@ Session::new_audio_track (int input_channels, int output_channels, TrackMode mod
 			track->non_realtime_input_change();
 
 			track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
-			if (Config->get_remote_model() == UserOrdered) {
-				track->set_remote_control_id (next_control_id());
-			}
 
 			new_routes.push_back (track);
 			ret.push_back (track);
-
-			RouteAddedOrRemoved (true); /* EMIT SIGNAL */
 		}
 
 		catch (failed_constructor &err) {
@@ -2957,9 +3060,9 @@ Session::new_audio_track (int input_channels, int output_channels, TrackMode mod
 	if (!new_routes.empty()) {
 		StateProtector sp (this);
 		if (Profile->get_trx()) {
-			add_routes (new_routes, false, false, false);
+			add_routes (new_routes, false, false, false, order);
 		} else {
-			add_routes (new_routes, true, true, false);
+			add_routes (new_routes, true, true, false, order);
 		}
 	}
 
@@ -2970,7 +3073,8 @@ Session::new_audio_track (int input_channels, int output_channels, TrackMode mod
  *  @param name_template string to use for the start of the name, or "" to use "Bus".
  */
 RouteList
-Session::new_audio_route (int input_channels, int output_channels, RouteGroup* route_group, uint32_t how_many, string name_template)
+Session::new_audio_route (int input_channels, int output_channels, RouteGroup* route_group, uint32_t how_many, string name_template,
+                          PresentationInfo::Flag flags, PresentationInfo::order_t order)
 {
 	string bus_name;
 	uint32_t bus_id = 0;
@@ -2986,15 +3090,18 @@ Session::new_audio_route (int input_channels, int output_channels, RouteGroup* r
 		}
 
 		try {
-			boost::shared_ptr<Route> bus (new Route (*this, bus_name, Route::Flag(0), DataType::AUDIO));
+			boost::shared_ptr<Route> bus (new Route (*this, bus_name, flags, DataType::AUDIO));
 
 			if (bus->init ()) {
 				goto failure;
 			}
 
-#ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
-			// boost_debug_shared_ptr_mark_interesting (bus.get(), "Route");
-#endif
+			if (Profile->get_mixbus ()) {
+				bus->set_strict_io (true);
+			}
+
+			BOOST_MARK_ROUTE(bus);
+
 			{
 				Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
 
@@ -3017,20 +3124,11 @@ Session::new_audio_route (int input_channels, int output_channels, RouteGroup* r
 			if (route_group) {
 				route_group->add (bus);
 			}
-			if (Config->get_remote_model() == UserOrdered) {
-				bus->set_remote_control_id (next_control_id());
-			}
 
 			bus->add_internal_return ();
-
 			ret.push_back (bus);
-
-			RouteAddedOrRemoved (true); /* EMIT SIGNAL */
-
-			ARDOUR::GUIIdle ();
 		}
 
-
 		catch (failed_constructor &err) {
 			error << _("Session: could not create new audio route.") << endmsg;
 			goto failure;
@@ -3049,9 +3147,9 @@ Session::new_audio_route (int input_channels, int output_channels, RouteGroup* r
 	if (!ret.empty()) {
 		StateProtector sp (this);
 		if (Profile->get_trx()) {
-			add_routes (ret, false, false, false);
+			add_routes (ret, false, false, false, order);
 		} else {
-			add_routes (ret, false, true, true); // autoconnect // outputs only
+			add_routes (ret, false, true, true, order); // autoconnect // outputs only
 		}
 	}
 
@@ -3075,7 +3173,6 @@ RouteList
 Session::new_route_from_template (uint32_t how_many, XMLNode& node, const std::string& name_base, PlaylistDisposition pd)
 {
 	RouteList ret;
-	uint32_t control_id;
 	uint32_t number = 0;
 	const uint32_t being_added = how_many;
 	/* This will prevent the use of any existing XML-provided PBD::ID
@@ -3084,8 +3181,6 @@ Session::new_route_from_template (uint32_t how_many, XMLNode& node, const std::s
 	Stateful::ForceIDRegeneration force_ids;
 	IO::disable_connecting ();
 
-	control_id = next_control_id ();
-
 	while (how_many) {
 
 		/* We're going to modify the node contents a bit so take a
@@ -3127,6 +3222,7 @@ Session::new_route_from_template (uint32_t how_many, XMLNode& node, const std::s
 			case NewPlaylist:
 				rename_playlist = true;
 				break;
+			default:
 			case CopyPlaylist:
 			case SharePlaylist:
 				rename_playlist = false;
@@ -3138,10 +3234,52 @@ Session::new_route_from_template (uint32_t how_many, XMLNode& node, const std::s
 			XMLNodeList children = node_copy.children ();
 			for (XMLNodeList::iterator i = children.begin(); i != children.end(); ++i) {
 				if ((*i)->name() == X_("Processor")) {
-					XMLProperty* role = (*i)->property (X_("role"));
+					/* ForceIDRegeneration does not catch the following */
+					XMLProperty const * role = (*i)->property (X_("role"));
+					XMLProperty const * type = (*i)->property (X_("type"));
+					if (role && role->value() == X_("Aux")) {
+						/* check if the target bus exists.
+						 * we should not save aux-sends in templates.
+						 */
+						XMLProperty const * target = (*i)->property (X_("target"));
+						if (!target) {
+							(*i)->add_property ("type", "dangling-aux-send");
+							continue;
+						}
+						boost::shared_ptr<Route> r = route_by_id (target->value());
+						if (!r || boost::dynamic_pointer_cast<Track>(r)) {
+							(*i)->add_property ("type", "dangling-aux-send");
+							continue;
+						}
+					}
 					if (role && role->value() == X_("Listen")) {
 						(*i)->remove_property (X_("bitslot"));
 					}
+					else if (role && (role->value() == X_("Send") || role->value() == X_("Aux"))) {
+						char buf[32];
+						Delivery::Role xrole;
+						uint32_t bitslot = 0;
+						xrole = Delivery::Role (string_2_enum (role->value(), xrole));
+						std::string name = Send::name_and_id_new_send(*this, xrole, bitslot, false);
+						snprintf (buf, sizeof (buf), "%" PRIu32, bitslot);
+						(*i)->remove_property (X_("bitslot"));
+						(*i)->remove_property (X_("name"));
+						(*i)->add_property ("bitslot", buf);
+						(*i)->add_property ("name", name);
+					}
+					else if (type && type->value() == X_("intreturn")) {
+						(*i)->remove_property (X_("bitslot"));
+						(*i)->add_property ("ignore-bitslot", "1");
+					}
+					else if (type && type->value() == X_("return")) {
+						// Return::set_state() generates a new one
+						(*i)->remove_property (X_("bitslot"));
+					}
+					else if (type && type->value() == X_("port")) {
+						// PortInsert::set_state() handles the bitslot
+						(*i)->remove_property (X_("bitslot"));
+						(*i)->add_property ("ignore-name", "1");
+					}
 				}
 			}
 
@@ -3167,9 +3305,6 @@ Session::new_route_from_template (uint32_t how_many, XMLNode& node, const std::s
 				route->output()->changed (change, this);
 			}
 
-			route->set_remote_control_id (control_id);
-			++control_id;
-
 			boost::shared_ptr<Track> track;
 
 			if ((track = boost::dynamic_pointer_cast<Track> (route))) {
@@ -3186,8 +3321,6 @@ Session::new_route_from_template (uint32_t how_many, XMLNode& node, const std::s
 			};
 
 			ret.push_back (route);
-
-			RouteAddedOrRemoved (true); /* EMIT SIGNAL */
 		}
 
 		catch (failed_constructor &err) {
@@ -3207,9 +3340,9 @@ Session::new_route_from_template (uint32_t how_many, XMLNode& node, const std::s
 	if (!ret.empty()) {
 		StateProtector sp (this);
 		if (Profile->get_trx()) {
-			add_routes (ret, false, false, false);
+			add_routes (ret, false, false, false, PresentationInfo::max_order);
 		} else {
-			add_routes (ret, true, true, false);
+			add_routes (ret, true, true, false, PresentationInfo::max_order);
 		}
 		IO::enable_connecting ();
 	}
@@ -3218,11 +3351,11 @@ Session::new_route_from_template (uint32_t how_many, XMLNode& node, const std::s
 }
 
 void
-Session::add_routes (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect, bool save)
+Session::add_routes (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect, bool save, PresentationInfo::order_t order)
 {
 	try {
 		PBD::Unwinder<bool> aip (_adding_routes_in_progress, true);
-		add_routes_inner (new_routes, input_auto_connect, output_auto_connect);
+		add_routes_inner (new_routes, input_auto_connect, output_auto_connect, order);
 
 	} catch (...) {
 		error << _("Adding new tracks/busses failed") << endmsg;
@@ -3239,54 +3372,53 @@ Session::add_routes (RouteList& new_routes, bool input_auto_connect, bool output
 		save_state (_current_snapshot_name);
 	}
 
-	reassign_track_numbers();
-
 	update_route_record_state ();
 
 	RouteAdded (new_routes); /* EMIT SIGNAL */
 }
 
 void
-Session::add_routes_inner (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect)
+Session::add_routes_inner (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect, PresentationInfo::order_t order)
 {
-        ChanCount existing_inputs;
-        ChanCount existing_outputs;
-	uint32_t order = next_control_id();
-
-	if (_order_hint > -1) {
-		order = _order_hint;
-		_order_hint = -1;
-	}
+	ChanCount existing_inputs;
+	ChanCount existing_outputs;
+	uint32_t n_routes;
+	uint32_t added = 0;
 
-        count_existing_track_channels (existing_inputs, existing_outputs);
+	count_existing_track_channels (existing_inputs, existing_outputs);
 
 	{
 		RCUWriter<RouteList> writer (routes);
 		boost::shared_ptr<RouteList> r = writer.get_copy ();
 		r->insert (r->end(), new_routes.begin(), new_routes.end());
+		n_routes = r->size();
 
 		/* if there is no control out and we're not in the middle of loading,
-		   resort the graph here. if there is a control out, we will resort
-		   toward the end of this method. if we are in the middle of loading,
-		   we will resort when done.
-		*/
+		 * resort the graph here. if there is a control out, we will resort
+		 * toward the end of this method. if we are in the middle of loading,
+		 * we will resort when done.
+		 */
 
 		if (!_monitor_out && IO::connecting_legal) {
 			resort_routes_using (r);
 		}
 	}
 
-	for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
+	DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("ensure order gap starting at %1 for %2\n", order, new_routes.size()));
+	ensure_route_presentation_info_gap (order, new_routes.size());
+
+	for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x, ++added) {
 
 		boost::weak_ptr<Route> wpr (*x);
 		boost::shared_ptr<Route> r (*x);
 
-		r->listen_changed.connect_same_thread (*this, boost::bind (&Session::route_listen_changed, this, _1, wpr));
-		r->solo_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_changed, this, _1, _2, wpr));
-		r->solo_isolated_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_isolated_changed, this, wpr));
-		r->mute_changed.connect_same_thread (*this, boost::bind (&Session::route_mute_changed, this));
+		r->solo_control()->Changed.connect_same_thread (*this, boost::bind (&Session::route_solo_changed, this, _1, _2,wpr));
+		r->solo_isolate_control()->Changed.connect_same_thread (*this, boost::bind (&Session::route_solo_isolated_changed, this, wpr));
+		r->mute_control()->Changed.connect_same_thread (*this, boost::bind (&Session::route_mute_changed, this));
+
 		r->output()->changed.connect_same_thread (*this, boost::bind (&Session::set_worst_io_latencies_x, this, _1, _2));
 		r->processors_changed.connect_same_thread (*this, boost::bind (&Session::route_processors_changed, this, _1));
+		r->processor_latency_changed.connect_same_thread (*this, boost::bind (&Session::queue_latency_recompute, this));
 
 		if (r->is_master()) {
 			_master_out = r;
@@ -3300,34 +3432,52 @@ Session::add_routes_inner (RouteList& new_routes, bool input_auto_connect, bool
 		if (tr) {
 			tr->PlaylistChanged.connect_same_thread (*this, boost::bind (&Session::track_playlist_changed, this, boost::weak_ptr<Track> (tr)));
 			track_playlist_changed (boost::weak_ptr<Track> (tr));
-			tr->RecordEnableChanged.connect_same_thread (*this, boost::bind (&Session::update_route_record_state, this));
+			tr->rec_enable_control()->Changed.connect_same_thread (*this, boost::bind (&Session::update_route_record_state, this));
 
 			boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (tr);
 			if (mt) {
 				mt->StepEditStatusChange.connect_same_thread (*this, boost::bind (&Session::step_edit_status_change, this, _1));
-                                mt->output()->changed.connect_same_thread (*this, boost::bind (&Session::midi_output_change_handler, this, _1, _2, boost::weak_ptr<Route>(mt)));
+				mt->output()->changed.connect_same_thread (*this, boost::bind (&Session::midi_output_change_handler, this, _1, _2, boost::weak_ptr<Route>(mt)));
 			}
 		}
 
+		if (!r->presentation_info().special()) {
 
-		if (input_auto_connect || output_auto_connect) {
-			auto_connect_route (r, existing_inputs, existing_outputs, true, input_auto_connect);
-		}
+			DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("checking PI state for %1\n", r->name()));
 
-		/* order keys are a GUI responsibility but we need to set up
-		   reasonable defaults because they also affect the remote control
-		   ID in most situations.
-		*/
+			/* presentation info order may already have been set from XML */
 
-		if (!r->has_order_key ()) {
-			if (r->is_auditioner()) {
-				/* use an arbitrarily high value */
-				r->set_order_key (UINT_MAX);
-			} else {
-				DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("while adding, set %1 to order key %2\n", r->name(), order));
-				r->set_order_key (order);
-				order++;
-			}
+			if (!r->presentation_info().order_set()) {
+
+				if (order == PresentationInfo::max_order) {
+					/* just add to the end */
+					r->set_presentation_order (n_routes + added, false);
+					DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("group order not set, set to NR %1 + %2 = %3\n", n_routes, added, n_routes + added));
+				} else {
+					r->set_presentation_order (order + added);
+					DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("group order not set, set to %1 + %2 = %3\n", order, added, order + added));
+				}
+			} else {
+				DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("group order already set to %1\n", r->presentation_info().order()));
+			}
+		}
+
+#if !defined(__APPLE__) && !defined(__FreeBSD__)
+		/* clang complains: 'operator<<' should be declared prior to the call site or in an associated namespace of one of its
+		 * arguments std::ostream& operator<<(std::ostream& o, ARDOUR::PresentationInfo const& rid)"
+		 */
+		DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("added route %1, group order %2 type %3 (summary: %4)\n",
+		                                               r->name(),
+		                                               r->presentation_info().order(),
+		                                               enum_2_string (r->presentation_info().flags()),
+		                                               r->presentation_info()));
+#endif
+
+
+		if (input_auto_connect || output_auto_connect) {
+			auto_connect_route (r, input_auto_connect, ChanCount (), ChanCount (), existing_inputs, existing_outputs);
+			existing_inputs += r->n_inputs();
+			existing_outputs += r->n_outputs();
 		}
 
 		ARDOUR::GUIIdle ();
@@ -3340,12 +3490,14 @@ Session::add_routes_inner (RouteList& new_routes, bool input_auto_connect, bool
 			if ((*x)->is_monitor()) {
 				/* relax */
 			} else if ((*x)->is_master()) {
-					/* relax */
+				/* relax */
 			} else {
 				(*x)->enable_monitor_send ();
 			}
 		}
 	}
+
+	reassign_track_numbers ();
 }
 
 void
@@ -3434,7 +3586,6 @@ Session::add_internal_send (boost::shared_ptr<Route> dest, boost::shared_ptr<Pro
 	graph_reordered ();
 }
 
-
 void
 Session::remove_routes (boost::shared_ptr<RouteList> routes_to_remove)
 {
@@ -3450,7 +3601,7 @@ Session::remove_routes (boost::shared_ptr<RouteList> routes_to_remove)
 				continue;
 			}
 
-			(*iter)->set_solo (false, Controllable::NoGroup);
+			(*iter)->solo_control()->set_value (0.0, Controllable::NoGroup);
 
 			rs->remove (*iter);
 
@@ -3504,7 +3655,6 @@ Session::remove_routes (boost::shared_ptr<RouteList> routes_to_remove)
 	} // end of RCU Writer scope
 
 	update_route_solo_state ();
-	RouteAddedOrRemoved (false); /* EMIT SIGNAL */
 	update_latency_compensation ();
 	set_dirty();
 
@@ -3520,7 +3670,7 @@ Session::remove_routes (boost::shared_ptr<RouteList> routes_to_remove)
 		resort_routes ();
 #endif
 
-	if (_process_graph) {
+	if (_process_graph && !(_state_of_the_state & Deletion)) {
 		_process_graph->clear_other_chain ();
 	}
 
@@ -3537,7 +3687,11 @@ Session::remove_routes (boost::shared_ptr<RouteList> routes_to_remove)
 		(*iter)->drop_references ();
 	}
 
-	Route::RemoteControlIDChange(); /* EMIT SIGNAL */
+	if (_state_of_the_state & Deletion) {
+		return;
+	}
+
+	PresentationInfo::Change(); /* EMIT SIGNAL */
 
 	/* save the new state of the world */
 
@@ -3545,7 +3699,6 @@ Session::remove_routes (boost::shared_ptr<RouteList> routes_to_remove)
 		save_history (_current_snapshot_name);
 	}
 
-	reassign_track_numbers();
 	update_route_record_state ();
 }
 
@@ -3566,18 +3719,20 @@ Session::route_mute_changed ()
 void
 Session::route_listen_changed (Controllable::GroupControlDisposition group_override, boost::weak_ptr<Route> wpr)
 {
-	boost::shared_ptr<Route> route = wpr.lock();
+	boost::shared_ptr<Route> route (wpr.lock());
+
 	if (!route) {
-		error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_listen_changed")) << endmsg;
 		return;
 	}
 
-	if (route->listening_via_monitor ()) {
+	assert (Config->get_solo_control_is_listen_control());
+
+	if (route->solo_control()->soloed_by_self_or_masters()) {
 
 		if (Config->get_exclusive_solo()) {
 
 			RouteGroup* rg = route->route_group ();
-			const bool group_already_accounted_for = route->use_group (group_override, &RouteGroup::is_solo);
+			const bool group_already_accounted_for = (group_override == Controllable::ForGroup);
 
 			boost::shared_ptr<RouteList> r = routes.reader ();
 
@@ -3587,7 +3742,7 @@ Session::route_listen_changed (Controllable::GroupControlDisposition group_overr
 					continue;
 				}
 
-				if ((*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
+				if ((*i)->solo_isolate_control()->solo_isolated() || !(*i)->can_solo()) {
 					/* route does not get solo propagated to it */
 					continue;
 				}
@@ -3600,7 +3755,7 @@ Session::route_listen_changed (Controllable::GroupControlDisposition group_overr
 					 */
 					continue;
 				}
-				(*i)->set_listen (false, Controllable::NoGroup);
+				(*i)->solo_control()->set_value (0.0, Controllable::NoGroup);
 			}
 		}
 
@@ -3613,20 +3768,19 @@ Session::route_listen_changed (Controllable::GroupControlDisposition group_overr
 
 	update_route_solo_state ();
 }
+
 void
 Session::route_solo_isolated_changed (boost::weak_ptr<Route> wpr)
 {
-	boost::shared_ptr<Route> route = wpr.lock ();
+	boost::shared_ptr<Route> route (wpr.lock());
 
 	if (!route) {
-		/* should not happen */
-		error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_isolated_changed")) << endmsg;
 		return;
 	}
 
 	bool send_changed = false;
 
-	if (route->solo_isolated()) {
+	if (route->solo_isolate_control()->solo_isolated()) {
 		if (_solo_isolated_cnt == 0) {
 			send_changed = true;
 		}
@@ -3644,27 +3798,42 @@ Session::route_solo_isolated_changed (boost::weak_ptr<Route> wpr)
 }
 
 void
-Session::route_solo_changed (bool self_solo_change, Controllable::GroupControlDisposition group_override,  boost::weak_ptr<Route> wpr)
+Session::route_solo_changed (bool self_solo_changed, Controllable::GroupControlDisposition group_override,  boost::weak_ptr<Route> wpr)
 {
-	DEBUG_TRACE (DEBUG::Solo, string_compose ("route solo change, self = %1\n", self_solo_change));
+	DEBUG_TRACE (DEBUG::Solo, string_compose ("route solo change, self = %1\n", self_solo_changed));
+
+	boost::shared_ptr<Route> route (wpr.lock());
 
-	if (!self_solo_change) {
-		// session doesn't care about changes to soloed-by-others
+	if (!route) {
 		return;
 	}
 
-	boost::shared_ptr<Route> route = wpr.lock ();
-	assert (route);
+	if (Config->get_solo_control_is_listen_control()) {
+		route_listen_changed (group_override, wpr);
+		return;
+	}
 
-	boost::shared_ptr<RouteList> r = routes.reader ();
-	int32_t delta;
+	DEBUG_TRACE (DEBUG::Solo, string_compose ("%1: self %2 masters %3 transition %4\n", route->name(), route->self_soloed(), route->solo_control()->get_masters_value(), route->solo_control()->transitioned_into_solo()));
 
-	if (route->self_soloed()) {
-		delta = 1;
-	} else {
-		delta = -1;
+	if (route->solo_control()->transitioned_into_solo() == 0) {
+		/* route solo changed by upstream/downstream; not interesting
+		   to Session.
+		*/
+		DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 not self-soloed nor soloed by master (%2), ignoring\n", route->name(), route->solo_control()->get_masters_value()));
+		return;
 	}
 
+	if (route->solo_control()->transitioned_into_solo() == 0) {
+		/* reason for being soloed changed (e.g. master went away, we
+		 * took over the master state), but actual status did
+		 * not. nothing to do.
+		 */
+		DEBUG_TRACE (DEBUG::Solo, string_compose ("%1: solo change was change in reason, not status\n", route->name()));
+	}
+
+	boost::shared_ptr<RouteList> r = routes.reader ();
+	int32_t delta = route->solo_control()->transitioned_into_solo ();
+
 	/* the route may be a member of a group that has shared-solo
 	 * semantics. If so, then all members of that group should follow the
 	 * solo of the changed route. But ... this is optional, controlled by a
@@ -3682,7 +3851,7 @@ Session::route_solo_changed (bool self_solo_change, Controllable::GroupControlDi
 	 */
 
 	RouteGroup* rg = route->route_group ();
-	const bool group_already_accounted_for = route->use_group (group_override, &RouteGroup::is_solo);
+	const bool group_already_accounted_for = (group_override == Controllable::ForGroup);
 
 	if (delta == 1 && Config->get_exclusive_solo()) {
 
@@ -3695,7 +3864,7 @@ Session::route_solo_changed (bool self_solo_change, Controllable::GroupControlDi
 				continue;
 			}
 
-			if ((*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
+			if ((*i)->solo_isolate_control()->solo_isolated() || !(*i)->can_solo()) {
 				/* route does not get solo propagated to it */
 				continue;
 			}
@@ -3709,7 +3878,7 @@ Session::route_solo_changed (bool self_solo_change, Controllable::GroupControlDi
 				continue;
 			}
 
-			(*i)->set_solo (false, group_override);
+			(*i)->solo_control()->set_value (0.0, group_override);
 		}
 	}
 
@@ -3728,8 +3897,10 @@ Session::route_solo_changed (bool self_solo_change, Controllable::GroupControlDi
 			continue;
 		}
 
-		if ((*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
+		if ((*i)->solo_isolate_control()->solo_isolated() || !(*i)->can_solo()) {
 			/* route does not get solo propagated to it */
+			DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 excluded from solo because iso = %2 can_solo = %3\n", (*i)->name(), (*i)->solo_isolate_control()->solo_isolated(),
+			                                          (*i)->can_solo()));
 			continue;
 		}
 
@@ -3750,7 +3921,7 @@ Session::route_solo_changed (bool self_solo_change, Controllable::GroupControlDi
 			DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a feed from %1\n", (*i)->name()));
 			if (!via_sends_only) {
 				if (!route->soloed_by_others_upstream()) {
-					(*i)->mod_solo_by_others_downstream (delta);
+					(*i)->solo_control()->mod_solo_by_others_downstream (delta);
 				} else {
 					DEBUG_TRACE (DEBUG::Solo, "\talready soloed by others upstream\n");
 				}
@@ -3771,15 +3942,15 @@ Session::route_solo_changed (bool self_solo_change, Controllable::GroupControlDi
 			   sends are involved.
 			*/
 			DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 feeds %2 via sends only %3 sboD %4 sboU %5\n",
-								  route->name(),
-								  (*i)->name(),
-								  via_sends_only,
-								  route->soloed_by_others_downstream(),
-								  route->soloed_by_others_upstream()));
+			                                          route->name(),
+			                                          (*i)->name(),
+			                                          via_sends_only,
+			                                          route->soloed_by_others_downstream(),
+			                                          route->soloed_by_others_upstream()));
 			if (!via_sends_only) {
 				//NB. Triggers Invert Push, which handles soloed by downstream
 				DEBUG_TRACE (DEBUG::Solo, string_compose ("\tmod %1 by %2\n", (*i)->name(), delta));
-				(*i)->mod_solo_by_others_upstream (delta);
+				(*i)->solo_control()->mod_solo_by_others_upstream (delta);
 			} else {
 				DEBUG_TRACE (DEBUG::Solo, string_compose ("\tfeed to %1 ignored, sends-only\n", (*i)->name()));
 			}
@@ -3804,7 +3975,7 @@ Session::route_solo_changed (bool self_solo_change, Controllable::GroupControlDi
 	for (RouteList::iterator i = uninvolved.begin(); i != uninvolved.end(); ++i) {
 		DEBUG_TRACE (DEBUG::Solo, string_compose ("mute change for %1, which neither feeds or is fed by %2\n", (*i)->name(), route->name()));
 		(*i)->act_on_mute ();
-		(*i)->mute_changed ();
+		(*i)->mute_control()->Changed (false, Controllable::NoGroup);
 	}
 
 	SoloChanged (); /* EMIT SIGNAL */
@@ -3826,20 +3997,21 @@ Session::update_route_solo_state (boost::shared_ptr<RouteList> r)
 	}
 
 	for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
-		if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_auditioner() && (*i)->self_soloed()) {
-			something_soloed = true;
-		}
-
-		if (!(*i)->is_auditioner() && (*i)->listening_via_monitor()) {
+		if ((*i)->can_solo()) {
 			if (Config->get_solo_control_is_listen_control()) {
-				listeners++;
-				something_listening = true;
+				if ((*i)->self_soloed() || (*i)->solo_control()->get_masters_value()) {
+					listeners++;
+					something_listening = true;
+				}
 			} else {
-				(*i)->set_listen (false, Controllable::NoGroup);
+				(*i)->set_listen (false);
+				if ((*i)->can_solo() && ((*i)->self_soloed() || (*i)->solo_control()->get_masters_value())) {
+					something_soloed = true;
+				}
 			}
 		}
 
-		if ((*i)->solo_isolated()) {
+		if ((*i)->solo_isolate_control()->solo_isolated()) {
 			isolated++;
 		}
 	}
@@ -3865,6 +4037,16 @@ Session::update_route_solo_state (boost::shared_ptr<RouteList> r)
 						  something_soloed, listeners, isolated));
 }
 
+void
+Session::get_stripables (StripableList& sl) const
+{
+	boost::shared_ptr<RouteList> r = routes.reader ();
+	sl.insert (sl.end(), r->begin(), r->end());
+
+	VCAList v = _vca_manager->vcas ();
+	sl.insert (sl.end(), v.begin(), v.end());
+}
+
 boost::shared_ptr<RouteList>
 Session::get_routes_with_internal_returns() const
 {
@@ -3880,7 +4062,7 @@ Session::get_routes_with_internal_returns() const
 }
 
 bool
-Session::io_name_is_legal (const std::string& name)
+Session::io_name_is_legal (const std::string& name) const
 {
 	boost::shared_ptr<RouteList> r = routes.reader ();
 
@@ -3989,7 +4171,7 @@ Session::routes_using_input_from (const string& str, RouteList& rl)
 }
 
 boost::shared_ptr<Route>
-Session::route_by_name (string name)
+Session::route_by_name (string name) const
 {
 	boost::shared_ptr<RouteList> r = routes.reader ();
 
@@ -4003,7 +4185,7 @@ Session::route_by_name (string name)
 }
 
 boost::shared_ptr<Route>
-Session::route_by_id (PBD::ID id)
+Session::route_by_id (PBD::ID id) const
 {
 	boost::shared_ptr<RouteList> r = routes.reader ();
 
@@ -4016,8 +4198,23 @@ Session::route_by_id (PBD::ID id)
 	return boost::shared_ptr<Route> ((Route*) 0);
 }
 
+boost::shared_ptr<Processor>
+Session::processor_by_id (PBD::ID id) const
+{
+	boost::shared_ptr<RouteList> r = routes.reader ();
+
+	for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
+		boost::shared_ptr<Processor> p = (*i)->Route::processor_by_id (id);
+		if (p) {
+			return p;
+		}
+	}
+
+	return boost::shared_ptr<Processor> ();
+}
+
 boost::shared_ptr<Track>
-Session::track_by_diskstream_id (PBD::ID id)
+Session::track_by_diskstream_id (PBD::ID id) const
 {
 	boost::shared_ptr<RouteList> r = routes.reader ();
 
@@ -4032,19 +4229,75 @@ Session::track_by_diskstream_id (PBD::ID id)
 }
 
 boost::shared_ptr<Route>
-Session::route_by_remote_id (uint32_t id)
+Session::get_remote_nth_route (PresentationInfo::order_t n) const
+{
+	return boost::dynamic_pointer_cast<Route> (get_remote_nth_stripable (n, PresentationInfo::Route));
+}
+
+boost::shared_ptr<Stripable>
+Session::get_remote_nth_stripable (PresentationInfo::order_t n, PresentationInfo::Flag flags) const
+{
+	StripableList sl;
+	PresentationInfo::order_t match_cnt = 0;
+
+	get_stripables (sl);
+	sl.sort (Stripable::PresentationOrderSorter());
+
+	for (StripableList::const_iterator s = sl.begin(); s != sl.end(); ++s) {
+
+		if ((*s)->presentation_info().hidden()) {
+			/* if the caller didn't explicitly ask for hidden
+			   stripables, ignore hidden ones. This matches
+			   the semantics of the pre-PresentationOrder
+			   "get by RID" logic of Ardour 4.x and earlier.
+
+			   XXX at some point we should likely reverse
+			   the logic of the flags, because asking for "the
+			   hidden stripables" is not going to be common,
+			   whereas asking for visible ones is normal.
+			*/
+
+			if (! (flags & PresentationInfo::Hidden)) {
+				continue;
+			}
+		}
+
+		if ((*s)->presentation_info().flag_match (flags)) {
+			if (match_cnt++ == n) {
+				return *s;
+			}
+		}
+	}
+
+	/* there is no nth stripable that matches the given flags */
+	return boost::shared_ptr<Stripable>();
+}
+
+boost::shared_ptr<Route>
+Session::route_by_selected_count (uint32_t id) const
 {
 	boost::shared_ptr<RouteList> r = routes.reader ();
 
 	for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
-		if ((*i)->remote_control_id() == id) {
-			return *i;
-		}
+		/* NOT IMPLEMENTED */
 	}
 
 	return boost::shared_ptr<Route> ((Route*) 0);
 }
 
+struct PresentationOrderSorter {
+	bool operator() (boost::shared_ptr<Stripable> a, boost::shared_ptr<Stripable> b) {
+		if (a->presentation_info().special() && !b->presentation_info().special()) {
+			/* a is not ordered, b is; b comes before a */
+			return false;
+		} else if (!b->presentation_info().order_set() && a->presentation_info().order_set()) {
+			/* b is not ordered, a is; a comes before b */
+			return true;
+		} else {
+			return a->presentation_info().order() < b->presentation_info().order();
+		}
+	}
+};
 
 void
 Session::reassign_track_numbers ()
@@ -4052,7 +4305,7 @@ Session::reassign_track_numbers ()
 	int64_t tn = 0;
 	int64_t bn = 0;
 	RouteList r (*(routes.reader ()));
-	SignalOrderRouteSorter sorter;
+	PresentationOrderSorter sorter;
 	r.sort (sorter);
 
 	StateProtector sp (this);
@@ -4079,6 +4332,16 @@ Session::reassign_track_numbers ()
 		// trigger GUI re-layout
 		config.ParameterChanged("track-name-number");
 	}
+
+#ifndef NDEBUG
+	if (DEBUG_ENABLED(DEBUG::OrderKeys)) {
+		boost::shared_ptr<RouteList> rl = routes.reader ();
+		for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
+			DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("%1 numbered %2\n", (*i)->name(), (*i)->track_number()));
+		}
+	}
+#endif /* NDEBUG */
+
 }
 
 void
@@ -4144,13 +4407,19 @@ Session::maybe_update_session_range (framepos_t a, framepos_t b)
 			_session_range_location->set_start (a);
 		}
 
-		if (b > _session_range_location->end()) {
+		if (_session_range_end_is_free && (b > _session_range_location->end())) {
 			_session_range_location->set_end (b);
 		}
 	}
 }
 
 void
+Session::set_end_is_free (bool yn)
+{
+	_session_range_end_is_free = yn;
+}
+
+void
 Session::playlist_ranges_moved (list<Evoral::RangeMove<framepos_t> > const & ranges)
 {
 	for (list<Evoral::RangeMove<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
@@ -4868,6 +5137,230 @@ Session::audition_playlist ()
 	queue_event (ev);
 }
 
+
+void
+Session::register_lua_function (
+		const std::string& name,
+		const std::string& script,
+		const LuaScriptParamList& args
+		)
+{
+	Glib::Threads::Mutex::Lock lm (lua_lock);
+
+	lua_State* L = lua.getState();
+
+	const std::string& bytecode = LuaScripting::get_factory_bytecode (script);
+	luabridge::LuaRef tbl_arg (luabridge::newTable(L));
+	for (LuaScriptParamList::const_iterator i = args.begin(); i != args.end(); ++i) {
+		if ((*i)->optional && !(*i)->is_set) { continue; }
+		tbl_arg[(*i)->name] = (*i)->value;
+	}
+	(*_lua_add)(name, bytecode, tbl_arg); // throws luabridge::LuaException
+	set_dirty();
+}
+
+void
+Session::unregister_lua_function (const std::string& name)
+{
+	Glib::Threads::Mutex::Lock lm (lua_lock);
+	(*_lua_del)(name); // throws luabridge::LuaException
+	lua.collect_garbage ();
+	set_dirty();
+}
+
+std::vector<std::string>
+Session::registered_lua_functions ()
+{
+	Glib::Threads::Mutex::Lock lm (lua_lock);
+	std::vector<std::string> rv;
+
+	try {
+		luabridge::LuaRef list ((*_lua_list)());
+		for (luabridge::Iterator i (list); !i.isNil (); ++i) {
+			if (!i.key ().isString ()) { assert(0); continue; }
+			rv.push_back (i.key ().cast<std::string> ());
+		}
+	} catch (luabridge::LuaException const& e) { }
+	return rv;
+}
+
+#ifndef NDEBUG
+static void _lua_print (std::string s) {
+	std::cout << "SessionLua: " << s << "\n";
+}
+#endif
+
+void
+Session::try_run_lua (pframes_t nframes)
+{
+	if (_n_lua_scripts == 0) return;
+	Glib::Threads::Mutex::Lock tm (lua_lock, Glib::Threads::TRY_LOCK);
+	if (tm.locked ()) {
+		try { (*_lua_run)(nframes); } catch (luabridge::LuaException const& e) { }
+		lua.collect_garbage_step ();
+	}
+}
+
+void
+Session::setup_lua ()
+{
+#ifndef NDEBUG
+	lua.Print.connect (&_lua_print);
+#endif
+	lua.tweak_rt_gc ();
+	lua.do_command (
+			"function ArdourSession ()"
+			"  local self = { scripts = {}, instances = {} }"
+			""
+			"  local remove = function (n)"
+			"   self.scripts[n] = nil"
+			"   self.instances[n] = nil"
+			"   Session:scripts_changed()" // call back
+			"  end"
+			""
+			"  local addinternal = function (n, f, a)"
+			"   assert(type(n) == 'string', 'function-name must be string')"
+			"   assert(type(f) == 'function', 'Given script is a not a function')"
+			"   assert(type(a) == 'table' or type(a) == 'nil', 'Given argument is invalid')"
+			"   assert(self.scripts[n] == nil, 'Callback \"'.. n ..'\" already exists.')"
+			"   self.scripts[n] = { ['f'] = f, ['a'] = a }"
+			"   local env = _ENV;  env.f = nil env.io = nil env.os = nil env.loadfile = nil env.require = nil env.dofile = nil env.package = nil env.debug = nil"
+			"   local env = { print = print, tostring = tostring, assert = assert, ipairs = ipairs, error = error, select = select, string = string, type = type, tonumber = tonumber, collectgarbage = collectgarbage, pairs = pairs, math = math, table = table, pcall = pcall, Session = Session, PBD = PBD, Timecode = Timecode, Evoral = Evoral, C = C, ARDOUR = ARDOUR }"
+			"   self.instances[n] = load (string.dump(f, true), nil, nil, env)(a)"
+			"   Session:scripts_changed()" // call back
+			"  end"
+			""
+			"  local add = function (n, b, a)"
+			"   assert(type(b) == 'string', 'ByteCode must be string')"
+			"   load (b)()" // assigns f
+			"   assert(type(f) == 'string', 'Assigned ByteCode must be string')"
+			"   addinternal (n, load(f), a)"
+			"  end"
+			""
+			"  local run = function (...)"
+			"   for n, s in pairs (self.instances) do"
+			"     local status, err = pcall (s, ...)"
+			"     if not status then"
+			"       print ('fn \"'.. n .. '\": ', err)"
+			"       remove (n)"
+			"      end"
+			"   end"
+			"   collectgarbage()"
+			"  end"
+			""
+			"  local cleanup = function ()"
+			"   self.scripts = nil"
+			"   self.instances = nil"
+			"  end"
+			""
+			"  local list = function ()"
+			"   local rv = {}"
+			"   for n, _ in pairs (self.scripts) do"
+			"     rv[n] = true"
+			"   end"
+			"   return rv"
+			"  end"
+			""
+			"  local function basic_serialize (o)"
+			"    if type(o) == \"number\" then"
+			"     return tostring(o)"
+			"    else"
+			"     return string.format(\"%q\", o)"
+			"    end"
+			"  end"
+			""
+			"  local function serialize (name, value)"
+			"   local rv = name .. ' = '"
+			"   collectgarbage()"
+			"   if type(value) == \"number\" or type(value) == \"string\" or type(value) == \"nil\" then"
+			"    return rv .. basic_serialize(value) .. ' '"
+			"   elseif type(value) == \"table\" then"
+			"    rv = rv .. '{} '"
+			"    for k,v in pairs(value) do"
+			"     local fieldname = string.format(\"%s[%s]\", name, basic_serialize(k))"
+			"     rv = rv .. serialize(fieldname, v) .. ' '"
+			"     collectgarbage()" // string concatenation allocates a new string :(
+			"    end"
+			"    return rv;"
+			"   elseif type(value) == \"function\" then"
+			"     return rv .. string.format(\"%q\", string.dump(value, true))"
+			"   else"
+			"    error('cannot save a ' .. type(value))"
+			"   end"
+			"  end"
+			""
+			""
+			"  local save = function ()"
+			"   return (serialize('scripts', self.scripts))"
+			"  end"
+			""
+			"  local restore = function (state)"
+			"   self.scripts = {}"
+			"   load (state)()"
+			"   for n, s in pairs (scripts) do"
+			"    addinternal (n, load(s['f']), s['a'])"
+			"   end"
+			"  end"
+			""
+			" return { run = run, add = add, remove = remove,"
+		  "          list = list, restore = restore, save = save, cleanup = cleanup}"
+			" end"
+			" "
+			" sess = ArdourSession ()"
+			" ArdourSession = nil"
+			" "
+			"function ardour () end"
+			);
+
+	lua_State* L = lua.getState();
+
+	try {
+		luabridge::LuaRef lua_sess = luabridge::getGlobal (L, "sess");
+		lua.do_command ("sess = nil"); // hide it.
+		lua.do_command ("collectgarbage()");
+
+		_lua_run = new luabridge::LuaRef(lua_sess["run"]);
+		_lua_add = new luabridge::LuaRef(lua_sess["add"]);
+		_lua_del = new luabridge::LuaRef(lua_sess["remove"]);
+		_lua_list = new luabridge::LuaRef(lua_sess["list"]);
+		_lua_save = new luabridge::LuaRef(lua_sess["save"]);
+		_lua_load = new luabridge::LuaRef(lua_sess["restore"]);
+		_lua_cleanup = new luabridge::LuaRef(lua_sess["cleanup"]);
+	} catch (luabridge::LuaException const& e) {
+		fatal << string_compose (_("programming error: %1"),
+				X_("Failed to setup Lua interpreter"))
+			<< endmsg;
+		abort(); /*NOTREACHED*/
+	}
+
+	LuaBindings::stddef (L);
+	LuaBindings::common (L);
+	LuaBindings::dsp (L);
+	luabridge::push <Session *> (L, this);
+	lua_setglobal (L, "Session");
+}
+
+void
+Session::scripts_changed ()
+{
+	assert (!lua_lock.trylock()); // must hold lua_lock
+
+	try {
+		luabridge::LuaRef list ((*_lua_list)());
+		int cnt = 0;
+		for (luabridge::Iterator i (list); !i.isNil (); ++i) {
+			if (!i.key ().isString ()) { assert(0); continue; }
+			++cnt;
+		}
+		_n_lua_scripts = cnt;
+	} catch (luabridge::LuaException const& e) {
+		fatal << string_compose (_("programming error: %1"),
+				X_("Indexing Lua Session Scripts failed."))
+			<< endmsg;
+		abort(); /*NOTREACHED*/
+	}
+}
+
 void
 Session::non_realtime_set_audition ()
 {
@@ -4906,7 +5399,7 @@ Session::RoutePublicOrderSorter::operator() (boost::shared_ptr<Route> a, boost::
 	if (b->is_monitor()) {
 		return false;
 	}
-	return a->order_key () < b->order_key ();
+	return a->presentation_info().order() < b->presentation_info().order();
 }
 
 bool
@@ -5062,6 +5555,16 @@ Session::tempo_map_changed (const PropertyChange&)
 }
 
 void
+Session::gui_tempo_map_changed ()
+{
+	clear_clicks ();
+
+	playlists->update_after_tempo_map_change ();
+
+	_locations->apply (*this, &Session::update_locations_after_tempo_map_change);
+}
+
+void
 Session::update_locations_after_tempo_map_change (const Locations::LocationList& loc)
 {
 	for (Locations::LocationList::const_iterator i = loc.begin(); i != loc.end(); ++i) {
@@ -5092,7 +5595,7 @@ Session::next_insert_id ()
 	/* this doesn't really loop forever. just think about it */
 
 	while (true) {
-		for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < insert_bitset.size(); ++n) {
+		for (boost::dynamic_bitset<uint32_t>::size_type n = 1; n < insert_bitset.size(); ++n) {
 			if (!insert_bitset[n]) {
 				insert_bitset[n] = true;
 				return n;
@@ -5112,7 +5615,7 @@ Session::next_send_id ()
 	/* this doesn't really loop forever. just think about it */
 
 	while (true) {
-		for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < send_bitset.size(); ++n) {
+		for (boost::dynamic_bitset<uint32_t>::size_type n = 1; n < send_bitset.size(); ++n) {
 			if (!send_bitset[n]) {
 				send_bitset[n] = true;
 				return n;
@@ -5132,7 +5635,7 @@ Session::next_aux_send_id ()
 	/* this doesn't really loop forever. just think about it */
 
 	while (true) {
-		for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < aux_send_bitset.size(); ++n) {
+		for (boost::dynamic_bitset<uint32_t>::size_type n = 1; n < aux_send_bitset.size(); ++n) {
 			if (!aux_send_bitset[n]) {
 				aux_send_bitset[n] = true;
 				return n;
@@ -5152,7 +5655,7 @@ Session::next_return_id ()
 	/* this doesn't really loop forever. just think about it */
 
 	while (true) {
-		for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < return_bitset.size(); ++n) {
+		for (boost::dynamic_bitset<uint32_t>::size_type n = 1; n < return_bitset.size(); ++n) {
 			if (!return_bitset[n]) {
 				return_bitset[n] = true;
 				return n;
@@ -5233,6 +5736,7 @@ Session::unmark_aux_send_id (uint32_t id)
 void
 Session::unmark_return_id (uint32_t id)
 {
+	if (_state_of_the_state & Deletion) { return; }
 	if (id < return_bitset.size()) {
 		return_bitset[id] = false;
 	}
@@ -5583,6 +6087,12 @@ Session::get_scratch_buffers (ChanCount count, bool silence)
 }
 
 BufferSet&
+Session::get_noinplace_buffers (ChanCount count)
+{
+	return ProcessThread::get_noinplace_buffers (count);
+}
+
+BufferSet&
 Session::get_route_buffers (ChanCount count, bool silence)
 {
 	return ProcessThread::get_route_buffers (count, silence);
@@ -5653,7 +6163,7 @@ Session::update_route_record_state ()
 	while (i != rl->end ()) {
 
 		boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
-		if (tr && tr->record_enabled ()) {
+	                            if (tr && tr->rec_enable_control()->get_value()) {
 			break;
 		}
 
@@ -5670,7 +6180,7 @@ Session::update_route_record_state ()
 
 	for (i = rl->begin(); i != rl->end (); ++i) {
 		boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
-		if (tr && !tr->record_enabled ()) {
+		if (tr && !tr->rec_enable_control()->get_value()) {
 			break;
 		}
 	}
@@ -5698,12 +6208,15 @@ Session::listen_position_changed ()
 void
 Session::solo_control_mode_changed ()
 {
-	/* cancel all solo or all listen when solo control mode changes */
-
-	if (soloing()) {
-		set_solo (get_routes(), false);
-	} else if (listening()) {
-		set_listen (get_routes(), false);
+	if (soloing() || listening()) {
+		/* We can't use ::clear_all_solo_state() here because during
+		   session loading at program startup, that will queue a call
+		   to rt_clear_all_solo_state() that will not execute until
+		   AFTER solo states have been established (thus throwing away
+		   the session's saved solo state). So just explicitly turn
+		   them all off.
+		*/
+		set_controls (route_list_to_control_list (get_routes(), &Stripable::solo_control), 0.0, Controllable::NoGroup);
 	}
 }
 
@@ -6019,9 +6532,10 @@ Session::unknown_processors () const
 void
 Session::update_latency (bool playback)
 {
+
 	DEBUG_TRACE (DEBUG::Latency, string_compose ("JACK latency callback: %1\n", (playback ? "PLAYBACK" : "CAPTURE")));
 
-	if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress) {
+	if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress || _route_deletion_in_progress) {
 		return;
 	}
 
@@ -6225,75 +6739,25 @@ Session::session_name_is_legal (const string& path)
 	return 0;
 }
 
-uint32_t
-Session::next_control_id () const
-{
-	int subtract = 0;
-
-	/* the monitor bus remote ID is in a different
-	 * "namespace" than regular routes. its existence doesn't
-	 * affect normal (low) numbered routes.
-	 */
-
-	if (_monitor_out) {
-		subtract++;
-	}
-
-	/* the same about masterbus in Waves Tracks */
-
-	if (Profile->get_trx() && _master_out) {
-		subtract++;
-	}
-
-	return nroutes() - subtract;
-}
-
 void
-Session::notify_remote_id_change ()
+Session::notify_presentation_info_change ()
 {
 	if (deletion_in_progress()) {
 		return;
 	}
 
-	switch (Config->get_remote_model()) {
-	case MixerOrdered:
-		Route::RemoteControlIDChange (); /* EMIT SIGNAL */
-		break;
-	default:
-		break;
-	}
+	PresentationInfo::Change (); /* EMIT SIGNAL */
+	reassign_track_numbers();
 
 #ifdef USE_TRACKS_CODE_FEATURES
-		/* Waves Tracks: for Waves Tracks session it's required to reconnect their IOs
-		 * if track order has been changed by user
-		 */
-		reconnect_existing_routes(true, true);
+	/* Waves Tracks: for Waves Tracks session it's required to reconnect their IOs
+	 * if track order has been changed by user
+	 */
+	reconnect_existing_routes(true, true);
 #endif
 
 }
 
-void
-Session::sync_order_keys ()
-{
-	if (deletion_in_progress()) {
-		return;
-	}
-
-	/* tell everyone that something has happened to the sort keys
-	   and let them sync up with the change(s)
-	   this will give objects that manage the sort order keys the
-	   opportunity to keep them in sync if they wish to.
-	*/
-
-	DEBUG_TRACE (DEBUG::OrderKeys, "Sync Order Keys.\n");
-
-	reassign_track_numbers();
-
-	Route::SyncOrderKeys (); /* EMIT SIGNAL */
-
-	DEBUG_TRACE (DEBUG::OrderKeys, "\tsync done\n");
-}
-
 bool
 Session::operation_in_progress (GQuark op) const
 {
@@ -6382,3 +6846,226 @@ Session::clear_object_selection ()
 	follow_playhead_priority ();
 #endif
 }
+
+void
+Session::auto_connect_route (boost::shared_ptr<Route> route, bool connect_inputs,
+		const ChanCount& input_start,
+		const ChanCount& output_start,
+		const ChanCount& input_offset,
+		const ChanCount& output_offset)
+{
+	Glib::Threads::Mutex::Lock lx (_auto_connect_queue_lock);
+	_auto_connect_queue.push (AutoConnectRequest (route, connect_inputs,
+				input_start, output_start,
+				input_offset, output_offset));
+
+	if (pthread_mutex_trylock (&_auto_connect_mutex) == 0) {
+		pthread_cond_signal (&_auto_connect_cond);
+		pthread_mutex_unlock (&_auto_connect_mutex);
+	}
+}
+
+void
+Session::queue_latency_recompute ()
+{
+	g_atomic_int_inc (&_latency_recompute_pending);
+	if (pthread_mutex_trylock (&_auto_connect_mutex) == 0) {
+		pthread_cond_signal (&_auto_connect_cond);
+		pthread_mutex_unlock (&_auto_connect_mutex);
+	}
+}
+
+void
+Session::auto_connect (const AutoConnectRequest& ar)
+{
+	boost::shared_ptr<Route> route = ar.route.lock();
+
+	if (!route) { return; }
+
+	if (!IO::connecting_legal) {
+		return;
+	}
+
+	/* If both inputs and outputs are auto-connected to physical ports,
+	 * use the max of input and output offsets to ensure auto-connected
+	 * port numbers always match up (e.g. the first audio input and the
+	 * first audio output of the route will have the same physical
+	 * port number).  Otherwise just use the lowest input or output
+	 * offset possible.
+	 */
+
+	const bool in_out_physical =
+		(Config->get_input_auto_connect() & AutoConnectPhysical)
+		&& (Config->get_output_auto_connect() & AutoConnectPhysical)
+		&& ar.connect_inputs;
+
+	const ChanCount in_offset = in_out_physical
+		? ChanCount::max(ar.input_offset, ar.output_offset)
+		: ar.input_offset;
+
+	const ChanCount out_offset = in_out_physical
+		? ChanCount::max(ar.input_offset, ar.output_offset)
+		: ar.output_offset;
+
+	for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
+		vector<string> physinputs;
+		vector<string> physoutputs;
+
+		_engine.get_physical_outputs (*t, physoutputs);
+		_engine.get_physical_inputs (*t, physinputs);
+
+		if (!physinputs.empty() && ar.connect_inputs) {
+			uint32_t nphysical_in = physinputs.size();
+
+			for (uint32_t i = ar.input_start.get(*t); i < route->n_inputs().get(*t) && i < nphysical_in; ++i) {
+				string port;
+
+				if (Config->get_input_auto_connect() & AutoConnectPhysical) {
+					port = physinputs[(in_offset.get(*t) + i) % nphysical_in];
+				}
+
+				if (!port.empty() && route->input()->connect (route->input()->ports().port(*t, i), port, this)) {
+					break;
+				}
+			}
+		}
+
+		if (!physoutputs.empty()) {
+			uint32_t nphysical_out = physoutputs.size();
+			for (uint32_t i = ar.output_start.get(*t); i < route->n_outputs().get(*t); ++i) {
+				string port;
+
+				/* Waves Tracks:
+				 * do not create new connections if we reached the limit of physical outputs
+				 * in Multi Out mode
+				 */
+				if (!(Config->get_output_auto_connect() & AutoConnectMaster) &&
+						ARDOUR::Profile->get_trx () &&
+						ar.output_offset.get(*t) == nphysical_out ) {
+					break;
+				}
+
+				if ((*t) == DataType::MIDI && (Config->get_output_auto_connect() & AutoConnectPhysical)) {
+					port = physoutputs[(out_offset.get(*t) + i) % nphysical_out];
+				} else if ((*t) == DataType::AUDIO && (Config->get_output_auto_connect() & AutoConnectMaster)) {
+					/* master bus is audio only */
+					if (_master_out && _master_out->n_inputs().get(*t) > 0) {
+						port = _master_out->input()->ports().port(*t,
+								i % _master_out->input()->n_ports().get(*t))->name();
+					}
+				}
+
+				if (!port.empty() && route->output()->connect (route->output()->ports().port(*t, i), port, this)) {
+					break;
+				}
+			}
+		}
+	}
+}
+
+void
+Session::auto_connect_thread_start ()
+{
+	if (_ac_thread_active) {
+		return;
+	}
+
+	while (!_auto_connect_queue.empty ()) {
+		_auto_connect_queue.pop ();
+	}
+
+	_ac_thread_active = true;
+	if (pthread_create (&_auto_connect_thread, NULL, auto_connect_thread, this)) {
+		_ac_thread_active = false;
+	}
+}
+
+void
+Session::auto_connect_thread_terminate ()
+{
+	if (!_ac_thread_active) {
+		return;
+	}
+	_ac_thread_active = false;
+
+	{
+		Glib::Threads::Mutex::Lock lx (_auto_connect_queue_lock);
+		while (!_auto_connect_queue.empty ()) {
+			_auto_connect_queue.pop ();
+		}
+	}
+
+	if (pthread_mutex_lock (&_auto_connect_mutex) == 0) {
+		pthread_cond_signal (&_auto_connect_cond);
+		pthread_mutex_unlock (&_auto_connect_mutex);
+	}
+
+	void *status;
+	pthread_join (_auto_connect_thread, &status);
+}
+
+void *
+Session::auto_connect_thread (void *arg)
+{
+	Session *s = static_cast<Session *>(arg);
+	s->auto_connect_thread_run ();
+	pthread_exit (0);
+	return 0;
+}
+
+void
+Session::auto_connect_thread_run ()
+{
+	pthread_set_name (X_("autoconnect"));
+	SessionEvent::create_per_thread_pool (X_("autoconnect"), 1024);
+	PBD::notify_event_loops_about_thread_creation (pthread_self(), X_("autoconnect"), 1024);
+	pthread_mutex_lock (&_auto_connect_mutex);
+	while (_ac_thread_active) {
+
+		if (!_auto_connect_queue.empty ()) {
+			// Why would we need the process lock ??
+			// A: if ports are added while we're connecting, the backend's iterator may be invalidated:
+			//   graph_order_callback() -> resort_routes() -> direct_feeds_according_to_reality () -> backend::connected_to()
+			//   All ardour-internal backends use a std::vector   xxxAudioBackend::find_port()
+			//   We have control over those, but what does jack do?
+			Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
+
+			Glib::Threads::Mutex::Lock lx (_auto_connect_queue_lock);
+			while (!_auto_connect_queue.empty ()) {
+				const AutoConnectRequest ar (_auto_connect_queue.front());
+				_auto_connect_queue.pop ();
+				lx.release ();
+				auto_connect (ar);
+				lx.acquire ();
+			}
+		}
+
+		if (!actively_recording ()) { // might not be needed,
+			/* this is only used for updating plugin latencies, the
+			 * graph does not change. so it's safe in general.
+			 * BUT..
+			 * .. update_latency_compensation () entails set_capture_offset()
+			 * which calls Diskstream::set_capture_offset () which
+			 * modifies the capture offset... which can be a proplem
+			 * in "prepare_to_stop"
+			 */
+			while (g_atomic_int_and (&_latency_recompute_pending, 0)) {
+				update_latency_compensation ();
+			}
+		}
+
+		pthread_cond_wait (&_auto_connect_cond, &_auto_connect_mutex);
+	}
+	pthread_mutex_unlock (&_auto_connect_mutex);
+}
+
+void
+Session::cancel_all_solo ()
+{
+	StripableList sl;
+
+	get_stripables (sl);
+
+	set_controls (stripable_list_to_control_list (sl, &Stripable::solo_control), 0.0, Controllable::NoGroup);
+	clear_all_solo_state (routes.reader());
+}
diff --git a/libs/ardour/session_butler.cc b/libs/ardour/session_butler.cc
index 613233c..259a3a1 100644
--- a/libs/ardour/session_butler.cc
+++ b/libs/ardour/session_butler.cc
@@ -28,7 +28,7 @@
 #include "ardour/track.h"
 #include "ardour/types.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
diff --git a/libs/ardour/session_click.cc b/libs/ardour/session_click.cc
index 4cb556c..9c67ebe 100644
--- a/libs/ardour/session_click.cc
+++ b/libs/ardour/session_click.cc
@@ -31,7 +31,7 @@
 
 #include <sndfile.h>
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
@@ -42,8 +42,7 @@ Pool Click::pool ("click", sizeof (Click), 1024);
 void
 Session::click (framepos_t start, framecnt_t nframes)
 {
-	TempoMap::BBTPointList::const_iterator points_begin;
-	TempoMap::BBTPointList::const_iterator points_end;
+	vector<TempoMap::BBTPoint> points;
 	Sample *buf;
 	framecnt_t click_distance;
 
@@ -72,13 +71,13 @@ Session::click (framepos_t start, framecnt_t nframes)
 	BufferSet& bufs = get_scratch_buffers(ChanCount(DataType::AUDIO, 1));
 	buf = bufs.get_audio(0).data();
 
-	_tempo_map->get_grid (points_begin, points_end, start, end);
+	_tempo_map->get_grid (points, start, end);
 
-	if (distance (points_begin, points_end) == 0) {
+	if (distance (points.begin(), points.end()) == 0) {
 		goto run_clicks;
 	}
 
-	for (TempoMap::BBTPointList::const_iterator i = points_begin; i != points_end; ++i) {
+	for (vector<TempoMap::BBTPoint>::iterator i = points.begin(); i != points.end(); ++i) {
 		switch ((*i).beat) {
 		case 1:
 			if (click_emphasis_data && Config->get_use_click_emphasis () == true) {
@@ -134,7 +133,7 @@ Session::click (framepos_t start, framecnt_t nframes)
 		}
 	}
 
-	_click_gain->run (bufs, 0, 0, nframes, false);
+	_click_gain->run (bufs, 0, 0, 1.0, nframes, false);
 	_click_io->copy_to_outputs (bufs, DataType::AUDIO, nframes, 0);
 }
 
diff --git a/libs/ardour/session_command.cc b/libs/ardour/session_command.cc
index f2909ea..a99738a 100644
--- a/libs/ardour/session_command.cc
+++ b/libs/ardour/session_command.cc
@@ -43,7 +43,7 @@ class Command;
 using namespace PBD;
 using namespace ARDOUR;
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 void Session::register_with_memento_command_factory(PBD::ID id, PBD::StatefulDestructible *ptr)
 {
@@ -145,7 +145,7 @@ Session::memento_command_factory(XMLNode *n)
     }
 
     /* we failed */
-    error << string_compose (_("could not reconstitute MementoCommand from XMLNode. object type = %1 id = %2"), obj_T, id.to_s()) << endmsg;
+    info << string_compose (_("could not reconstitute MementoCommand from XMLNode. object type = %1 id = %2"), obj_T, id.to_s()) << endmsg;
 
     return 0 ;
 }
diff --git a/libs/ardour/session_configuration.cc b/libs/ardour/session_configuration.cc
index c8e09ad..b881471 100644
--- a/libs/ardour/session_configuration.cc
+++ b/libs/ardour/session_configuration.cc
@@ -30,7 +30,7 @@
 #include "ardour/filesystem_paths.h"
 #include "ardour/session_configuration.h"
 #include "ardour/utils.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 using namespace PBD;
@@ -54,7 +54,7 @@ XMLNode&
 SessionConfiguration::get_state ()
 {
 	XMLNode* root;
-	LocaleGuard lg (X_("C"));
+	LocaleGuard lg;
 
 	root = new XMLNode ("Ardour");
 	root->add_child_nocopy (get_variables ());
@@ -67,7 +67,7 @@ XMLNode&
 SessionConfiguration::get_variables ()
 {
 	XMLNode* node;
-	LocaleGuard lg (X_("C"));
+	LocaleGuard lg;
 
 	node = new XMLNode ("Config");
 
@@ -159,7 +159,7 @@ SessionConfiguration::load_state ()
 
 		XMLNode* node;
 		if (((node = find_named_node (root, X_("Config"))) != 0)) {
-			LocaleGuard lg (X_("C"));
+			LocaleGuard lg;
 			set_variables(*node);
 			info << _("Loaded custom session defaults.") << endmsg;
 		} else {
diff --git a/libs/ardour/session_directory.cc b/libs/ardour/session_directory.cc
index 3a4d049..c52fe1a 100644
--- a/libs/ardour/session_directory.cc
+++ b/libs/ardour/session_directory.cc
@@ -30,7 +30,7 @@
 #include "ardour/session_directory.h"
 #include "ardour/utils.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 namespace ARDOUR {
 
diff --git a/libs/ardour/session_events.cc b/libs/ardour/session_events.cc
index 9d11cb0..6e17545 100644
--- a/libs/ardour/session_events.cc
+++ b/libs/ardour/session_events.cc
@@ -28,7 +28,7 @@
 #include "ardour/debug.h"
 #include "ardour/session_event.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
diff --git a/libs/ardour/session_export.cc b/libs/ardour/session_export.cc
index 8908716..463f504 100644
--- a/libs/ardour/session_export.cc
+++ b/libs/ardour/session_export.cc
@@ -31,7 +31,7 @@
 #include "ardour/session.h"
 #include "ardour/track.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
@@ -73,12 +73,16 @@ Session::pre_export ()
 		}
 	}
 
-	/* make sure we are actually rolling */
+	/* prepare transport */
+
+	realtime_stop (true, true);
 
 	if (get_record_enabled()) {
 		disable_record (false);
 	}
 
+	unset_play_loop ();
+
 	/* no slaving */
 
 	post_export_sync = config.get_external_sync ();
@@ -100,12 +104,35 @@ Session::pre_export ()
 
 /** Called for each range that is being exported */
 int
-Session::start_audio_export (framepos_t position)
+Session::start_audio_export (framepos_t position, bool realtime)
 {
 	if (!_exporting) {
 		pre_export ();
 	}
-	_export_started = false;
+
+	_realtime_export = realtime;
+
+	if (realtime) {
+		_export_preroll = nominal_frame_rate ();
+	} else {
+		_export_preroll = Config->get_export_preroll() * nominal_frame_rate ();
+	}
+
+	if (_export_preroll == 0) {
+		// must be > 0 so that transport is started in sync.
+		_export_preroll = 1;
+	}
+
+	/* "worst_track_latency" is the correct value for stem-exports
+	 * see to Route::add_export_point(),
+	 *
+	 * for master-bus export, we'd need to add the master's latency.
+	 * or actually longest-total-session-latency.
+	 *
+	 * We can't use worst_playback_latency because that includes
+	 * includes external latencies and would overcompensate.
+	 */
+	_export_latency = worst_track_latency ();
 
 	/* We're about to call Track::seek, so the butler must have finished everything
 	   up otherwise it could be doing do_refill in its thread while we are doing
@@ -151,11 +178,19 @@ Session::start_audio_export (framepos_t position)
 	}
 
 	_engine.Freewheel.connect_same_thread (export_freewheel_connection, boost::bind (&Session::process_export_fw, this, _1));
-	_export_rolling = true;
-	return _engine.freewheel (true);
+
+	if (_realtime_export) {
+		Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
+		_export_rolling = true;
+		process_function = &Session::process_export_fw;
+		return 0;
+	} else {
+		_export_rolling = true;
+		return _engine.freewheel (true);
+	}
 }
 
-int
+void
 Session::process_export (pframes_t nframes)
 {
 	if (_export_rolling && export_status->stop) {
@@ -163,14 +198,18 @@ Session::process_export (pframes_t nframes)
 	}
 
 	if (_export_rolling) {
-		/* make sure we've caught up with disk i/o, since
-		we're running faster than realtime c/o JACK.
-		*/
-		_butler->wait_until_finished ();
+		if (!_realtime_export)  {
+			/* make sure we've caught up with disk i/o, since
+			 * we're running faster than realtime c/o JACK.
+			 */
+			_butler->wait_until_finished ();
+		}
 
 		/* do the usual stuff */
 
 		process_without_events (nframes);
+	} else if (_realtime_export) {
+		fail_roll (nframes); // somehow we need to silence _ALL_ output buffers
 	}
 
 	try {
@@ -181,29 +220,66 @@ Session::process_export (pframes_t nframes)
 	} catch (std::exception & e) {
 		error << string_compose (_("Export ended unexpectedly: %1"), e.what()) << endmsg;
 		export_status->abort (true);
-		return -1;
 	}
-
-	return 0;
 }
 
-int
+void
 Session::process_export_fw (pframes_t nframes)
 {
-	if (!_export_started) {
-		_export_started = true;
+	const bool need_buffers = _engine.freewheeling ();
+	if (_export_preroll > 0) {
+
+		if (need_buffers) {
+			_engine.main_thread()->get_buffers ();
+		}
+		fail_roll (nframes);
+		if (need_buffers) {
+			_engine.main_thread()->drop_buffers ();
+		}
+
+		_export_preroll -= std::min ((framepos_t)nframes, _export_preroll);
+
+		if (_export_preroll > 0) {
+			// clear out buffers (reverb tails etc).
+			return;
+		}
+
 		set_transport_speed (1.0, 0, false);
 		butler_transport_work ();
 		g_atomic_int_set (&_butler->should_do_transport_work, 0);
 		post_transport ();
-		return 0;
+
+		return;
+	}
+
+	if (_export_latency > 0) {
+		framepos_t remain = std::min ((framepos_t)nframes, _export_latency);
+
+		if (need_buffers) {
+			_engine.main_thread()->get_buffers ();
+		}
+		process_without_events (remain);
+		if (need_buffers) {
+			_engine.main_thread()->drop_buffers ();
+		}
+
+		_export_latency -= remain;
+		nframes -= remain;
+
+		if (nframes == 0) {
+			return;
+		}
 	}
 
-        _engine.main_thread()->get_buffers ();
+	if (need_buffers) {
+		_engine.main_thread()->get_buffers ();
+	}
 	process_export (nframes);
-        _engine.main_thread()->drop_buffers ();
+	if (need_buffers) {
+		_engine.main_thread()->drop_buffers ();
+	}
 
-	return 0;
+	return;
 }
 
 int
@@ -232,8 +308,11 @@ Session::finalize_audio_export ()
 
 	/* Clean up */
 
+	if (_realtime_export) {
+		Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
+		process_function = &Session::process_with_events;
+	}
 	_engine.freewheel (false);
-
 	export_freewheel_connection.disconnect();
 
 	_mmc->enable_send (_pre_export_mmc_enabled);
diff --git a/libs/ardour/session_handle.cc b/libs/ardour/session_handle.cc
index 99358da..2a14f8a 100644
--- a/libs/ardour/session_handle.cc
+++ b/libs/ardour/session_handle.cc
@@ -19,12 +19,12 @@
 
 #include "pbd/demangle.h"
 #include "pbd/error.h"
-#include "pbd/boost_debug.h"
 
+#include "ardour/boost_debug.h"
 #include "ardour/session.h"
 #include "ardour/session_handle.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
diff --git a/libs/ardour/session_ltc.cc b/libs/ardour/session_ltc.cc
index 2cd21f9..945f965 100644
--- a/libs/ardour/session_ltc.cc
+++ b/libs/ardour/session_ltc.cc
@@ -27,7 +27,7 @@
 #include "ardour/session.h"
 #include "ardour/slave.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
diff --git a/libs/ardour/session_midi.cc b/libs/ardour/session_midi.cc
index baff2c7..fa23880 100644
--- a/libs/ardour/session_midi.cc
+++ b/libs/ardour/session_midi.cc
@@ -48,7 +48,7 @@
 #include "ardour/slave.h"
 #include "ardour/ticker.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
@@ -335,6 +335,36 @@ Session::mmc_shuttle (MIDI::MachineControl &/*mmc*/, float speed, bool forw)
 	}
 }
 
+boost::shared_ptr<Route>
+Session::get_midi_nth_route_by_id (PresentationInfo::order_t n) const
+{
+	PresentationInfo::Flag f;
+
+	/* These numbers are defined by the MMC specification.
+	 */
+
+	if (n == 318) {
+		f = PresentationInfo::MasterOut;
+	} else if (n == 319) {
+		f = PresentationInfo::MonitorOut;
+	} else {
+		f = PresentationInfo::Route;
+	}
+
+	boost::shared_ptr<RouteList> r = routes.reader ();
+	PresentationInfo::order_t match_cnt = 0;
+
+	for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
+		if ((*i)->presentation_info().flag_match (f)) {
+			if (match_cnt++ == n) {
+				return *i;
+			}
+		}
+	}
+
+	return boost::shared_ptr<Route>();
+}
+
 void
 Session::mmc_record_enable (MIDI::MachineControl &mmc, size_t trk, bool enabled)
 {
@@ -342,17 +372,13 @@ Session::mmc_record_enable (MIDI::MachineControl &mmc, size_t trk, bool enabled)
 		return;
 	}
 
-	RouteList::iterator i;
-	boost::shared_ptr<RouteList> r = routes.reader();
+	boost::shared_ptr<Route> r = get_midi_nth_route_by_id (trk);
 
-	for (i = r->begin(); i != r->end(); ++i) {
-		AudioTrack *at;
+	if (r) {
+		boost::shared_ptr<AudioTrack> at;
 
-		if ((at = dynamic_cast<AudioTrack*>((*i).get())) != 0) {
-			if (trk == at->remote_control_id()) {
-				at->set_record_enabled (enabled, Controllable::UseGroup);
-				break;
-			}
+		if ((at = boost::dynamic_pointer_cast<AudioTrack> (r))) {
+			at->rec_enable_control()->set_value (enabled, Controllable::UseGroup);
 		}
 	}
 }
@@ -387,16 +413,29 @@ Session::send_full_time_code (framepos_t const t, MIDI::pframes_t nframes)
 	framepos_t mtc_tc;
 	timecode_to_sample(timecode, mtc_tc, true, false);
 	outbound_mtc_timecode_frame = mtc_tc;
-
 	transmitting_timecode_time = timecode;
 
+	LatencyRange mtc_out_latency = {0, 0}; // TODO cache this, update on engine().GraphReordered()
+	_midi_ports->mtc_output_port ()->get_connected_latency_range (ltc_out_latency, true);
+	frameoffset_t mtc_offset = worst_playback_latency() - mtc_out_latency.max;
+
+	// only if rolling.. ?
+	outbound_mtc_timecode_frame += mtc_offset;
+
+	// outbound_mtc_timecode_frame needs to be >= _transport_frame
+	// or a new full timecode will be queued next cycle.
+	while (outbound_mtc_timecode_frame < t) {
+		Timecode::increment (transmitting_timecode_time, config.get_subframes_per_frame());
+		outbound_mtc_timecode_frame += _frames_per_timecode_frame;
+	}
+
 	double const quarter_frame_duration = ((framecnt_t) _frames_per_timecode_frame) / 4.0;
 	if (ceil((t - mtc_tc) / quarter_frame_duration) > 0) {
 		Timecode::increment (transmitting_timecode_time, config.get_subframes_per_frame());
 		outbound_mtc_timecode_frame += _frames_per_timecode_frame;
 	}
 
-	DEBUG_TRACE (DEBUG::MTC, string_compose ("Full MTC TC %1\n", outbound_mtc_timecode_frame));
+	DEBUG_TRACE (DEBUG::MTC, string_compose ("Full MTC TC %1 (off %2)\n", outbound_mtc_timecode_frame, mtc_offset));
 
 	// I don't understand this bit yet.. [DR]
 	// I do [rg]:
@@ -407,21 +446,6 @@ Session::send_full_time_code (framepos_t const t, MIDI::pframes_t nframes)
 		outbound_mtc_timecode_frame += _frames_per_timecode_frame;
 	}
 
-#if 0 // compensate for audio latency  -- disabled [rg]
-	/* this needs more thought and work.
-	 * the proper solution will be to just offset MTC by the MIDI port's latency.
-	 *
-	 * using worst_playback_latency() is wrong when the generated MTC is used to sync
-	 * clients which send audio to Ardour for recording.
-	 * worst_capture_latency() vs. worst_playback_latency()
-	 *
-	 * NB. similarly to session_ltc, the offset should be subtracted from the timecode to send,
-	 * instead of being added to timestamp when to send the timecode.
-	 * Otherwise the timestamp may not fall into the jack-cycle of the current _transport frame.
-	 * and no MTC QF will be sent.
-	 */
-	outbound_mtc_timecode_frame += worst_playback_latency();
-#endif
 	next_quarter_frame_to_send = 0;
 
 	// Sync slave to the same Timecode time as we are on
@@ -456,6 +480,8 @@ Session::send_full_time_code (framepos_t const t, MIDI::pframes_t nframes)
 int
 Session::send_midi_time_code_for_cycle (framepos_t start_frame, framepos_t end_frame, ARDOUR::pframes_t nframes)
 {
+	// start_frame == start_frame  for normal cycles
+	// start_frame > _transport_frame  for split cycles
 	if (_engine.freewheeling() || !_send_qf_mtc || transmitting_timecode_time.negative || (next_quarter_frame_to_send < 0)) {
 		// cerr << "(MTC) Not sending MTC\n";
 		return 0;
@@ -464,6 +490,11 @@ Session::send_midi_time_code_for_cycle (framepos_t start_frame, framepos_t end_f
 		return 0;
 	}
 
+	if (_transport_speed < 0) {
+		// we don't support rolling backwards
+		return 0;
+	}
+
 	/* MTC is max. 30 fps - assert() below will fail
 	 * TODO actually limit it to 24,25,29df,30fps
 	 * talk to oofus, first.
@@ -483,7 +514,12 @@ Session::send_midi_time_code_for_cycle (framepos_t start_frame, framepos_t end_f
 				next_quarter_frame_to_send, quarter_frame_duration));
 
 	if (rint(outbound_mtc_timecode_frame + (next_quarter_frame_to_send * quarter_frame_duration)) < _transport_frame) {
+		// send full timecode and set outbound_mtc_timecode_frame, next_quarter_frame_to_send
 		send_full_time_code (_transport_frame, nframes);
+	}
+
+	if (rint(outbound_mtc_timecode_frame + (next_quarter_frame_to_send * quarter_frame_duration)) < start_frame) {
+		// no QF for this cycle
 		return 0;
 	}
 
@@ -555,8 +591,7 @@ Session::send_midi_time_code_for_cycle (framepos_t start_frame, framepos_t end_f
 			// Increment timecode time twice
 			Timecode::increment (transmitting_timecode_time, config.get_subframes_per_frame());
 			Timecode::increment (transmitting_timecode_time, config.get_subframes_per_frame());
-			// Re-calculate timing of first quarter frame
-			//timecode_to_sample( transmitting_timecode_time, outbound_mtc_timecode_frame, true /* use_offset */, false );
+			// Increment timing of first quarter frame
 			outbound_mtc_timecode_frame += 2.0 * _frames_per_timecode_frame;
 		}
 	}
@@ -687,4 +722,3 @@ Session::mtc_input_port () const
 {
 	return _midi_ports->mtc_input_port ();
 }
-
diff --git a/libs/ardour/session_object.cc b/libs/ardour/session_object.cc
index 39b3155..683d174 100644
--- a/libs/ardour/session_object.cc
+++ b/libs/ardour/session_object.cc
@@ -22,7 +22,7 @@
 #include "ardour/debug.h"
 #include "ardour/session_object.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 using namespace PBD;
diff --git a/libs/ardour/session_playlists.cc b/libs/ardour/session_playlists.cc
index 649d429..95982b6 100644
--- a/libs/ardour/session_playlists.cc
+++ b/libs/ardour/session_playlists.cc
@@ -23,7 +23,7 @@
 #include "ardour/playlist_factory.h"
 #include "ardour/session_playlists.h"
 #include "ardour/track.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
 #include "pbd/compose.h"
 #include "pbd/xml++.h"
 
@@ -244,7 +244,6 @@ SessionPlaylists::destroy_region (boost::shared_ptr<Region> r)
 	}
 }
 
-
 void
 SessionPlaylists::find_equivalent_playlist_regions (boost::shared_ptr<Region> region, vector<boost::shared_ptr<Region> >& result)
 {
@@ -260,6 +259,10 @@ SessionPlaylists::source_use_count (boost::shared_ptr<const Source> src) const
 {
 	uint32_t count = 0;
 
+	/* XXXX this can go wildly wrong in the presence of circular references
+	 * between compound regions.
+	 */
+
 	for (List::const_iterator p = playlists.begin(); p != playlists.end(); ++p) {
                 if ((*p)->uses_source (src)) {
                         ++count;
@@ -500,3 +503,19 @@ SessionPlaylists::playlists_for_track (boost::shared_ptr<Track> tr) const
 
 	return pl_tr;
 }
+
+void
+SessionPlaylists::foreach (boost::function<void(boost::shared_ptr<const Playlist>)> functor)
+{
+	Glib::Threads::Mutex::Lock lm (lock);
+	for (List::iterator i = playlists.begin(); i != playlists.end(); i++) {
+		if (!(*i)->hidden()) {
+			functor (*i);
+		}
+	}
+	for (List::iterator i = unused_playlists.begin(); i != unused_playlists.end(); i++) {
+		if (!(*i)->hidden()) {
+			functor (*i);
+		}
+	}
+}
diff --git a/libs/ardour/session_process.cc b/libs/ardour/session_process.cc
index 6f4ae53..eaa1d05 100644
--- a/libs/ardour/session_process.cc
+++ b/libs/ardour/session_process.cc
@@ -43,7 +43,7 @@
 
 #include "midi++/mmc.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 using namespace PBD;
@@ -358,6 +358,7 @@ Session::process_with_events (pframes_t nframes)
 	}
 
 	if (events.empty() || next_event == events.end()) {
+		try_run_lua (nframes); // also during export ?? ->move to process_without_events()
 		process_without_events (nframes);
 		return;
 	}
@@ -425,6 +426,8 @@ Session::process_with_events (pframes_t nframes)
 				this_nframes = abs (floor(frames_moved / _transport_speed));
 			}
 
+			try_run_lua (this_nframes);
+
 			if (this_nframes) {
 
 				click (_transport_frame, this_nframes);
diff --git a/libs/ardour/session_rtevents.cc b/libs/ardour/session_rtevents.cc
index 132f706..00d966a 100644
--- a/libs/ardour/session_rtevents.cc
+++ b/libs/ardour/session_rtevents.cc
@@ -21,11 +21,13 @@
 #include "pbd/error.h"
 #include "pbd/compose.h"
 
-#include "ardour/session.h"
+#include "ardour/monitor_control.h"
 #include "ardour/route.h"
+#include "ardour/session.h"
 #include "ardour/track.h"
+#include "ardour/vca_manager.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace PBD;
@@ -33,231 +35,59 @@ using namespace ARDOUR;
 using namespace Glib;
 
 void
-Session::set_monitoring (boost::shared_ptr<RouteList> rl, MonitorChoice mc, 
-                         SessionEvent::RTeventCallback after,
-                         Controllable::GroupControlDisposition group_override)
-{
-	queue_event (get_rt_event (rl, mc, after, group_override, &Session::rt_set_monitoring));
-}
-
-void
-Session::rt_set_monitoring (boost::shared_ptr<RouteList> rl, MonitorChoice mc, Controllable::GroupControlDisposition group_override)
-{
-	for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
-		if (!(*i)->is_auditioner()) {
-			boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*i);
-			if (t) {
-				t->set_monitoring (mc, group_override);
-			}
-		}
-	}
-
-	set_dirty();
-}
-
-void
-Session::clear_all_solo_state (boost::shared_ptr<RouteList> rl)
-{
-	queue_event (get_rt_event (rl, false, rt_cleanup, Controllable::NoGroup, &Session::rt_clear_all_solo_state));
-}
-
-void
-Session::rt_clear_all_solo_state (boost::shared_ptr<RouteList> rl, bool /* yn */, Controllable::GroupControlDisposition /* group_override */)
-{
-	for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
-		if ((*i)->is_auditioner()) {
-			continue;
-		}
-		(*i)->clear_all_solo_state();
-	}
-	set_dirty();
-}
-
-void
-Session::set_solo (boost::shared_ptr<RouteList> rl, bool yn, SessionEvent::RTeventCallback after,
-                   Controllable::GroupControlDisposition group_override)
-{
-	queue_event (get_rt_event (rl, yn, after, group_override, &Session::rt_set_solo));
-}
-
-void
-Session::rt_set_solo (boost::shared_ptr<RouteList> rl, bool yn, Controllable::GroupControlDisposition group_override)
-{
-	for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
-		if (!(*i)->is_auditioner()) {
-			(*i)->set_solo (yn, group_override);
-		}
-	}
-
-	set_dirty();
-	/* XXX boost::shared_ptr<RouteList>  goes out of scope here and is likley free()ed in RT context
-	 * because boost's shared_ptr does reference counting and free/delete in the dtor.
-	 * (this also applies to other rt_  methods here)
-	 */
-}
-
-void
-Session::set_just_one_solo (boost::shared_ptr<Route> r, bool yn, SessionEvent::RTeventCallback after)
-{
-	/* its a bit silly to have to do this, but it keeps the API for this public method sane (we're
-	   only going to solo one route) and keeps our ability to use get_rt_event() for the internal
-	   private method.
-	*/
-
-	boost::shared_ptr<RouteList> rl (new RouteList);
-	rl->push_back (r);
-
-	queue_event (get_rt_event (rl, yn, after, Controllable::NoGroup, &Session::rt_set_just_one_solo));
-}
-
-void
-Session::rt_set_just_one_solo (boost::shared_ptr<RouteList> just_one, bool yn, Controllable::GroupControlDisposition /*ignored*/)
-{
-	boost::shared_ptr<RouteList> rl = routes.reader ();
-	boost::shared_ptr<Route> r = just_one->front();
-
-	for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
-		if (!(*i)->is_auditioner() && r != *i) {
-			(*i)->set_solo (!yn, Controllable::NoGroup);
-		}
-	}
-
-	r->set_solo (yn, Controllable::NoGroup);
-
-	set_dirty();
-}
-
-void
-Session::set_listen (boost::shared_ptr<RouteList> rl, bool yn, SessionEvent::RTeventCallback after, Controllable::GroupControlDisposition group_override)
-{
-	queue_event (get_rt_event (rl, yn, after, group_override, &Session::rt_set_listen));
-}
-
-void
-Session::rt_set_listen (boost::shared_ptr<RouteList> rl, bool yn, Controllable::GroupControlDisposition group_override)
+Session::set_controls (boost::shared_ptr<ControlList> cl, double val, Controllable::GroupControlDisposition gcd)
 {
-	for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
-		if (!(*i)->is_auditioner()) {
-			(*i)->set_listen (yn, group_override);
-		}
+	if (cl->empty()) {
+		return;
 	}
 
-	set_dirty();
-}
-
-void
-Session::set_mute (boost::shared_ptr<RouteList> rl, bool yn, SessionEvent::RTeventCallback after, Controllable::GroupControlDisposition group_override)
-{
-	/* Set superficial value of mute controls for automation. */
-	for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
-		boost::shared_ptr<Route::MuteControllable> mc = (*i)->mute_control();
-		mc->set_superficial_value(yn);
+	for (ControlList::iterator ci = cl->begin(); ci != cl->end(); ++ci) {
+		/* as of july 2017 this is a no-op for everything except record enable */
+		(*ci)->do_pre_realtime_queue_stuff (val);
 	}
 
-	queue_event (get_rt_event (rl, yn, after, group_override, &Session::rt_set_mute));
+	queue_event (get_rt_event (cl, val, gcd));
 }
 
 void
-Session::rt_set_mute (boost::shared_ptr<RouteList> rl, bool yn, Controllable::GroupControlDisposition group_override)
+Session::set_control (boost::shared_ptr<AutomationControl> ac, double val, Controllable::GroupControlDisposition gcd)
 {
-	for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
-		if (!(*i)->is_monitor() && !(*i)->is_auditioner()) {
-			(*i)->set_mute (yn, group_override);
-		}
+	if (!ac) {
+		return;
 	}
 
-	set_dirty();
-}
-
-void
-Session::set_solo_isolated (boost::shared_ptr<RouteList> rl, bool yn, SessionEvent::RTeventCallback after, Controllable::GroupControlDisposition group_override)
-{
-	queue_event (get_rt_event (rl, yn, after, group_override, &Session::rt_set_solo_isolated));
+	boost::shared_ptr<ControlList> cl (new ControlList);
+	cl->push_back (ac);
+	set_controls (cl, val, gcd);
 }
 
 void
-Session::rt_set_solo_isolated (boost::shared_ptr<RouteList> rl, bool yn, Controllable::GroupControlDisposition group_override)
+Session::rt_set_controls (boost::shared_ptr<ControlList> cl, double val, Controllable::GroupControlDisposition gcd)
 {
-	for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
-		if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_auditioner()) {
-			(*i)->set_solo_isolated (yn, group_override);
-		}
+	for (ControlList::iterator c = cl->begin(); c != cl->end(); ++c) {
+		(*c)->set_value (val, gcd);
 	}
-
-	set_dirty();
 }
 
 void
-Session::set_record_enabled (boost::shared_ptr<RouteList> rl, bool yn, SessionEvent::RTeventCallback after, Controllable::GroupControlDisposition group_override)
+Session::clear_all_solo_state (boost::shared_ptr<RouteList> rl)
 {
-	if (!writable()) {
-		return;
-	}
-
-	/* do the non-RT part of rec-enabling first - the RT part will be done
-	 * on the next process cycle. This does mean that theoretically we are
-	 * doing things provisionally on the assumption that the rec-enable
-	 * change will work, but this had better be a solid assumption for
-	 * other reasons.
-	 */
-
-	for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
-		if ((*i)->is_auditioner() || (*i)->record_safe ()) {
-			continue;
-		}
-
-		boost::shared_ptr<Track> t;
-
-		if ((t = boost::dynamic_pointer_cast<Track>(*i)) != 0) {
-			t->prep_record_enabled (yn, group_override);
-		}
-	}
-
-	queue_event (get_rt_event (rl, yn, after, group_override, &Session::rt_set_record_enabled));
+	queue_event (get_rt_event (rl, false, rt_cleanup, Controllable::NoGroup, &Session::rt_clear_all_solo_state));
 }
 
 void
-Session::rt_set_record_enabled (boost::shared_ptr<RouteList> rl, bool yn, Controllable::GroupControlDisposition group_override)
+Session::rt_clear_all_solo_state (boost::shared_ptr<RouteList> rl, bool /* yn */, Controllable::GroupControlDisposition /* group_override */)
 {
 	for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
-		if ((*i)->is_auditioner() || (*i)->record_safe ()) {
+		if ((*i)->is_auditioner()) {
 			continue;
 		}
-
-		boost::shared_ptr<Track> t;
-
-		if ((t = boost::dynamic_pointer_cast<Track>(*i)) != 0) {
-			t->set_record_enabled (yn, group_override);
-		}
+		(*i)->clear_all_solo_state();
 	}
 
-	set_dirty ();
-}
+	_vca_manager->clear_all_solo_state ();
 
-
-void
-Session::set_record_safe (boost::shared_ptr<RouteList> rl, bool yn, SessionEvent::RTeventCallback after, Controllable::GroupControlDisposition group_override)
-{
-	set_record_enabled (rl, false, after, group_override);
-	queue_event (get_rt_event (rl, yn, after, group_override, &Session::rt_set_record_safe));
-}
-
-void
-Session::rt_set_record_safe (boost::shared_ptr<RouteList> rl, bool yn, Controllable::GroupControlDisposition group_override)
-{
-	for (RouteList::iterator i = rl->begin (); i != rl->end (); ++i) {
-		if ((*i)->is_auditioner ()) { // REQUIRES REVIEW Can audiotioner be in Record Safe mode?
-			continue;
-		}
-
-		boost::shared_ptr<Track> t;
-
-		if ((t = boost::dynamic_pointer_cast<Track>(*i)) != 0) {
-			t->set_record_safe (yn, group_override);
-		}
-	}
-
-	set_dirty ();
+	set_dirty();
 }
 
 void
diff --git a/libs/ardour/session_state.cc b/libs/ardour/session_state.cc
index 5ad9769..76cf2d3 100644
--- a/libs/ardour/session_state.cc
+++ b/libs/ardour/session_state.cc
@@ -29,6 +29,7 @@
 #include <cerrno>
 #include <cstdio> /* snprintf(3) ... grrr */
 #include <cmath>
+
 #include <unistd.h>
 #include <climits>
 #include <signal.h>
@@ -38,7 +39,7 @@
 #include <sys/vfs.h>
 #endif
 
-#ifdef __APPLE__
+#if defined(__APPLE__) || defined(__FreeBSD__)
 #include <sys/param.h>
 #include <sys/mount.h>
 #endif
@@ -61,9 +62,7 @@
 
 #include "evoral/SMF.hpp"
 
-#include "pbd/boost_debug.h"
 #include "pbd/basename.h"
-#include "pbd/controllable_descriptor.h"
 #include "pbd/debug.h"
 #include "pbd/enumwriter.h"
 #include "pbd/error.h"
@@ -82,8 +81,11 @@
 #include "ardour/audioengine.h"
 #include "ardour/audiofilesource.h"
 #include "ardour/audioregion.h"
+#include "ardour/auditioner.h"
 #include "ardour/automation_control.h"
+#include "ardour/boost_debug.h"
 #include "ardour/butler.h"
+#include "ardour/controllable_descriptor.h"
 #include "ardour/control_protocol_manager.h"
 #include "ardour/directory_names.h"
 #include "ardour/filename_extensions.h"
@@ -104,6 +106,7 @@
 #include "ardour/proxy_controllable.h"
 #include "ardour/recent_sessions.h"
 #include "ardour/region_factory.h"
+#include "ardour/revision.h"
 #include "ardour/route_group.h"
 #include "ardour/send.h"
 #include "ardour/session.h"
@@ -119,10 +122,14 @@
 #include "ardour/tempo.h"
 #include "ardour/ticker.h"
 #include "ardour/user_bundle.h"
+#include "ardour/vca.h"
+#include "ardour/vca_manager.h"
 
 #include "control_protocol/control_protocol.h"
 
-#include "i18n.h"
+#include "LuaBridge/LuaBridge.h"
+
+#include "pbd/i18n.h"
 #include <locale.h>
 
 using namespace std;
@@ -246,9 +253,11 @@ Session::post_engine_init ()
 		delete _tempo_map;
 		_tempo_map = new TempoMap (_current_frame_rate);
 		_tempo_map->PropertyChanged.connect_same_thread (*this, boost::bind (&Session::tempo_map_changed, this, _1));
+		_tempo_map->MetricPositionChanged.connect_same_thread (*this, boost::bind (&Session::gui_tempo_map_changed, this));
 
 		/* MidiClock requires a tempo map */
 
+		delete midi_clock;
 		midi_clock = new MidiClockTicker ();
 		midi_clock->set_session (this);
 
@@ -621,7 +630,7 @@ Session::create (const string& session_template, BusProfile* bus_profile)
 
 	_state_of_the_state = Clean;
 
-        /* set up Master Out and Control Out if necessary */
+        /* set up Master Out and Monitor Out if necessary */
 
         if (bus_profile) {
 
@@ -630,14 +639,14 @@ Session::create (const string& session_template, BusProfile* bus_profile)
 
                 // Waves Tracks: always create master bus for Tracks
                 if (ARDOUR::Profile->get_trx() || bus_profile->master_out_channels) {
-	                boost::shared_ptr<Route> r (new Route (*this, _("Master"), Route::MasterOut, DataType::AUDIO));
+	                boost::shared_ptr<Route> r (new Route (*this, _("Master"), PresentationInfo::MasterOut, DataType::AUDIO));
                         if (r->init ()) {
                                 return -1;
                         }
-#ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
-			// boost_debug_shared_ptr_mark_interesting (r.get(), "Route");
-#endif
-			{
+
+                        BOOST_MARK_ROUTE(r);
+
+                        {
 				Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
 				r->input()->ensure_io (count, false, this);
 				r->output()->ensure_io (count, false, this);
@@ -651,7 +660,7 @@ Session::create (const string& session_template, BusProfile* bus_profile)
 		}
 
 		if (!rl.empty()) {
-			add_routes (rl, false, false, false);
+			add_routes (rl, false, false, false, PresentationInfo::max_order);
 		}
 
 		// Waves Tracks: Skip this. Always use autoconnection for Tracks
@@ -756,6 +765,8 @@ Session::remove_state (string snapshot_name)
 int
 Session::save_state (string snapshot_name, bool pending, bool switch_to_snapshot, bool template_only)
 {
+	DEBUG_TRACE (DEBUG::Locale, string_compose ("Session::save_state locale '%1'\n", setlocale (LC_NUMERIC, NULL)));
+
 	XMLTree tree;
 	std::string xml_path(_session_dir->root_path());
 
@@ -780,6 +791,10 @@ Session::save_state (string snapshot_name, bool pending, bool switch_to_snapshot
 		return 1;
 	}
 
+#ifndef NDEBUG
+	const int64_t save_start_time = g_get_monotonic_time();
+#endif
+
 	/* tell sources we're saving first, in case they write out to a new file
 	 * which should be saved with the state rather than the old one */
 	for (SourceMap::const_iterator i = sources.begin(); i != sources.end(); ++i) {
@@ -877,6 +892,10 @@ Session::save_state (string snapshot_name, bool pending, bool switch_to_snapshot
 		StateSaved (snapshot_name); /* EMIT SIGNAL */
 	}
 
+#ifndef NDEBUG
+	const int64_t elapsed_time_us = g_get_monotonic_time() - save_start_time;
+	cerr << "saved state in " << fixed << setprecision (1) << elapsed_time_us / 1000. << " ms\n";
+#endif
 	return 0;
 }
 
@@ -938,7 +957,7 @@ Session::load_state (string snapshot_name)
 		return -1;
 	}
 
-	XMLNode& root (*state_tree->root());
+	XMLNode const & root (*state_tree->root());
 
 	if (root.name() != X_("Session")) {
 		error << string_compose (_("Session file %1 is not a session"), xmlpath) << endmsg;
@@ -947,7 +966,7 @@ Session::load_state (string snapshot_name)
 		return -1;
 	}
 
-	const XMLProperty* prop;
+	XMLProperty const * prop;
 
 	if ((prop = root.property ("version")) == 0) {
 		/* no version implies very old version of Ardour */
@@ -991,7 +1010,7 @@ Session::load_state (string snapshot_name)
 int
 Session::load_options (const XMLNode& node)
 {
-	LocaleGuard lg (X_("C"));
+	LocaleGuard lg;
 	config.set_variables (node);
 	return 0;
 }
@@ -1024,6 +1043,7 @@ Session::get_template()
 XMLNode&
 Session::state (bool full_state)
 {
+	LocaleGuard lg;
 	XMLNode* node = new XMLNode("Session");
 	XMLNode* child;
 
@@ -1031,12 +1051,18 @@ Session::state (bool full_state)
 	snprintf(buf, sizeof(buf), "%d", CURRENT_SESSION_FILE_VERSION);
 	node->add_property("version", buf);
 
+	child = node->add_child ("ProgramVersion");
+	child->add_property("created-with", created_with);
+
+	std::string modified_with = string_compose ("%1 %2", PROGRAM_NAME, revision);
+	child->add_property("modified-with", modified_with);
+
 	/* store configuration settings */
 
 	if (full_state) {
 
 		node->add_property ("name", _name);
-		snprintf (buf, sizeof (buf), "%" PRId64, _nominal_frame_rate);
+		snprintf (buf, sizeof (buf), "%" PRId64, _base_frame_rate);
 		node->add_property ("sample-rate", buf);
 
 		if (session_dirs.size() > 1) {
@@ -1069,16 +1095,26 @@ Session::state (bool full_state)
 		}
 	}
 
+	node->add_property ("end-is-free", _session_range_end_is_free ? X_("yes") : X_("no"));
+
 	/* save the ID counter */
 
 	snprintf (buf, sizeof (buf), "%" PRIu64, ID::counter());
 	node->add_property ("id-counter", buf);
 
+	snprintf (buf, sizeof (buf), "%u", name_id_counter ());
+	node->add_property ("name-counter", buf);
+
 	/* save the event ID counter */
 
 	snprintf (buf, sizeof (buf), "%d", Evoral::event_id_counter());
 	node->add_property ("event-counter", buf);
 
+	/* save the VCA counter */
+
+	snprintf (buf, sizeof (buf), "%" PRIu32, VCA::get_next_vca_number());
+	node->add_property ("vca-counter", buf);
+
 	/* various options */
 
 	list<XMLNode*> midi_port_nodes = _midi_ports->get_midi_port_states();
@@ -1193,6 +1229,8 @@ Session::state (bool full_state)
 		}
 	}
 
+	node->add_child_nocopy (_vca_manager->get_state());
+
 	child = node->add_child ("Routes");
 	{
 		boost::shared_ptr<RouteList> r = routes.reader ();
@@ -1201,7 +1239,7 @@ Session::state (bool full_state)
 		RouteList public_order (*r);
 		public_order.sort (cmp);
 
-		/* the sort should have put control outs first */
+		/* the sort should have put the monitor out first */
 
 		if (_monitor_out) {
 			assert (_monitor_out == public_order.front());
@@ -1249,6 +1287,26 @@ Session::state (bool full_state)
 		node->add_child_copy (*_extra_xml);
 	}
 
+	{
+		Glib::Threads::Mutex::Lock lm (lua_lock);
+		std::string saved;
+		{
+			luabridge::LuaRef savedstate ((*_lua_save)());
+			saved = savedstate.cast<std::string>();
+		}
+		lua.collect_garbage ();
+		lm.release ();
+
+		gchar* b64 = g_base64_encode ((const guchar*)saved.c_str (), saved.size ());
+		std::string b64s (b64);
+		g_free (b64);
+
+		XMLNode* script_node = new XMLNode (X_("Script"));
+		script_node->add_property (X_("lua"), LUA_VERSION);
+		script_node->add_content (b64s);
+		node->add_child_nocopy (*script_node);
+	}
+
 	return *node;
 }
 
@@ -1262,9 +1320,10 @@ Session::get_control_protocol_state ()
 int
 Session::set_state (const XMLNode& node, int version)
 {
+	LocaleGuard lg;
 	XMLNodeList nlist;
 	XMLNode* child;
-	const XMLProperty* prop;
+	XMLProperty const * prop;
 	int ret = -1;
 
 	_state_of_the_state = StateOfTheState (_state_of_the_state|CannotSave);
@@ -1280,18 +1339,31 @@ Session::set_state (const XMLNode& node, int version)
 
 	if ((prop = node.property (X_("sample-rate"))) != 0) {
 
-		_nominal_frame_rate = atoi (prop->value());
+		_base_frame_rate = atoi (prop->value());
+		_nominal_frame_rate = _base_frame_rate;
 
-		if (_nominal_frame_rate != _current_frame_rate) {
-                        boost::optional<int> r = AskAboutSampleRateMismatch (_nominal_frame_rate, _current_frame_rate);
+		assert (AudioEngine::instance()->running ());
+		if (_base_frame_rate != AudioEngine::instance()->sample_rate ()) {
+			boost::optional<int> r = AskAboutSampleRateMismatch (_base_frame_rate, _current_frame_rate);
 			if (r.get_value_or (0)) {
 				goto out;
 			}
 		}
 	}
 
+	created_with = "unknown";
+	if ((child = find_named_node (node, "ProgramVersion")) != 0) {
+		if ((prop = child->property (X_("created-with"))) != 0) {
+			created_with = prop->value ();
+		}
+	}
+
 	setup_raid_path(_session_dir->root_path());
 
+	if ((prop = node.property (X_("end-is-free"))) != 0) {
+		_session_range_end_is_free = string_is_affirmative (prop->value());
+	}
+
 	if ((prop = node.property (X_("id-counter"))) != 0) {
 		uint64_t x;
 		sscanf (prop->value().c_str(), "%" PRIu64, &x);
@@ -1306,10 +1378,21 @@ Session::set_state (const XMLNode& node, int version)
 		ID::init_counter (now);
 	}
 
-        if ((prop = node.property (X_("event-counter"))) != 0) {
-                Evoral::init_event_id_counter (atoi (prop->value()));
-        }
+	if ((prop = node.property (X_("name-counter"))) != 0) {
+		init_name_id_counter (atoi (prop->value()));
+	}
 
+	if ((prop = node.property (X_("event-counter"))) != 0) {
+		Evoral::init_event_id_counter (atoi (prop->value()));
+	}
+
+	if ((prop = node.property (X_("vca-counter"))) != 0) {
+		uint32_t x;
+		sscanf (prop->value().c_str(), "%" PRIu32, &x);
+		VCA::set_next_vca_number (x);
+	} else {
+		VCA::set_next_vca_number (1);
+	}
 
 	if ((child = find_named_node (node, "MIDIPorts")) != 0) {
 		_midi_ports->set_midi_port_states (child->children());
@@ -1413,6 +1496,10 @@ Session::set_state (const XMLNode& node, int version)
 		}
 	}
 
+	if ((child = find_named_node (node, VCAManager::xml_node_name)) != 0) {
+		_vca_manager->set_state (*child, version);
+	}
+
 	if ((child = find_named_node (node, "Routes")) == 0) {
 		error << _("Session: XML state has no routes section") << endmsg;
 		goto out;
@@ -1420,6 +1507,10 @@ Session::set_state (const XMLNode& node, int version)
 		goto out;
 	}
 
+	/* Now that we have Routes and masters loaded, connect them if appropriate */
+
+	Slavable::Assign (_vca_manager); /* EMIT SIGNAL */
+
 	/* our diskstreams list is no longer needed as they are now all owned by their Route */
 	_diskstreams_2X.clear ();
 
@@ -1459,6 +1550,21 @@ Session::set_state (const XMLNode& node, int version)
 		ControlProtocolManager::instance().set_state (*child, version);
 	}
 
+	if ((child = find_named_node (node, "Script"))) {
+		for (XMLNodeList::const_iterator n = child->children ().begin (); n != child->children ().end (); ++n) {
+			if (!(*n)->is_content ()) { continue; }
+			gsize size;
+			guchar* buf = g_base64_decode ((*n)->content ().c_str (), &size);
+			try {
+				Glib::Threads::Mutex::Lock lm (lua_lock);
+				(*_lua_load)(std::string ((const char*)buf, size));
+			} catch (luabridge::LuaException const& e) {
+				cerr << "LuaException:" << e.what () << endl;
+			}
+			g_free (buf);
+		}
+	}
+
 	update_route_record_state ();
 
 	/* here beginneth the second phase ... */
@@ -1508,7 +1614,7 @@ Session::load_routes (const XMLNode& node, int version)
 
 	BootMessage (_("Tracks/busses loaded;  Adding to Session"));
 
-	add_routes (new_routes, false, false, false);
+	add_routes (new_routes, false, false, false, PresentationInfo::max_order);
 
 	BootMessage (_("Finished adding tracks/busses"));
 
@@ -1527,7 +1633,7 @@ Session::XMLRouteFactory (const XMLNode& node, int version)
 	XMLNode* ds_child = find_named_node (node, X_("Diskstream"));
 
 	DataType type = DataType::AUDIO;
-	const XMLProperty* prop = node.property("default-type");
+	XMLProperty const * prop = node.property("default-type");
 
 	if (prop) {
 		type = DataType (prop->value());
@@ -1553,24 +1659,15 @@ Session::XMLRouteFactory (const XMLNode& node, int version)
                         return ret;
                 }
 
-#ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
-                // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
-#endif
+                BOOST_MARK_TRACK (track);
                 ret = track;
 
 	} else {
-		enum Route::Flag flags = Route::Flag(0);
-		const XMLProperty* prop = node.property("flags");
-		if (prop) {
-			flags = Route::Flag (string_2_enum (prop->value(), flags));
-		}
-
+		PresentationInfo::Flag flags = PresentationInfo::get_flags (node);
 		boost::shared_ptr<Route> r (new Route (*this, X_("toBeResetFroXML"), flags));
 
                 if (r->init () == 0 && r->set_state (node, version) == 0) {
-#ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
-                        // boost_debug_shared_ptr_mark_interesting (r.get(), "Route");
-#endif
+	                BOOST_MARK_ROUTE (r);
                         ret = r;
                 }
 	}
@@ -1593,7 +1690,7 @@ Session::XMLRouteFactory_2X (const XMLNode& node, int version)
 	}
 
 	DataType type = DataType::AUDIO;
-	const XMLProperty* prop = node.property("default-type");
+	XMLProperty const * prop = node.property("default-type");
 
 	if (prop) {
 		type = DataType (prop->value());
@@ -1631,24 +1728,15 @@ Session::XMLRouteFactory_2X (const XMLNode& node, int version)
 
 		track->set_diskstream (*i);
 
-#ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
-                // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
-#endif
+		BOOST_MARK_TRACK (track);
                 ret = track;
 
 	} else {
-		enum Route::Flag flags = Route::Flag(0);
-		const XMLProperty* prop = node.property("flags");
-		if (prop) {
-			flags = Route::Flag (string_2_enum (prop->value(), flags));
-		}
-
+		PresentationInfo::Flag flags = PresentationInfo::get_flags (node);
 		boost::shared_ptr<Route> r (new Route (*this, X_("toBeResetFroXML"), flags));
 
                 if (r->init () == 0 && r->set_state (node, version) == 0) {
-#ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
-                        // boost_debug_shared_ptr_mark_interesting (r.get(), "Route");
-#endif
+	                BOOST_MARK_ROUTE (r);
                         ret = r;
                 }
 	}
@@ -1670,7 +1758,7 @@ Session::load_regions (const XMLNode& node)
 	for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
 		if ((region = XMLRegionFactory (**niter, false)) == 0) {
 			error << _("Session: cannot create Region from XML description.");
-			const XMLProperty *name = (**niter).property("name");
+			XMLProperty const * name = (**niter).property("name");
 
 			if (name) {
 				error << " " << string_compose (_("Can not load state for region '%1'"), name->value());
@@ -1688,7 +1776,7 @@ Session::load_compounds (const XMLNode& node)
 {
 	XMLNodeList calist = node.children();
 	XMLNodeConstIterator caiter;
-	XMLProperty *caprop;
+	XMLProperty const * caprop;
 
 	for (caiter = calist.begin(); caiter != calist.end(); ++caiter) {
 		XMLNode* ca = *caiter;
@@ -1735,7 +1823,7 @@ Session::load_nested_sources (const XMLNode& node)
 			/* it may already exist, so don't recreate it unnecessarily
 			 */
 
-			XMLProperty* prop = (*niter)->property (X_("id"));
+			XMLProperty const * prop = (*niter)->property (X_("id"));
 			if (!prop) {
 				error << _("Nested source has no ID info in session file! (ignored)") << endmsg;
 				continue;
@@ -1759,7 +1847,7 @@ Session::load_nested_sources (const XMLNode& node)
 boost::shared_ptr<Region>
 Session::XMLRegionFactory (const XMLNode& node, bool full)
 {
-	const XMLProperty* type = node.property("type");
+	XMLProperty const * type = node.property("type");
 
 	try {
 
@@ -1788,7 +1876,7 @@ Session::XMLRegionFactory (const XMLNode& node, bool full)
 boost::shared_ptr<AudioRegion>
 Session::XMLAudioRegionFactory (const XMLNode& node, bool /*full*/)
 {
-	const XMLProperty* prop;
+	XMLProperty const * prop;
 	boost::shared_ptr<Source> source;
 	boost::shared_ptr<AudioSource> as;
 	SourceList sources;
@@ -1907,7 +1995,7 @@ Session::XMLAudioRegionFactory (const XMLNode& node, bool /*full*/)
 boost::shared_ptr<MidiRegion>
 Session::XMLMidiRegionFactory (const XMLNode& node, bool /*full*/)
 {
-	const XMLProperty* prop;
+	XMLProperty const * prop;
 	boost::shared_ptr<Source> source;
 	boost::shared_ptr<MidiSource> ms;
 	SourceList sources;
@@ -2180,7 +2268,7 @@ Session::save_template (string template_name, bool replace_existing)
 void
 Session::refresh_disk_space ()
 {
-#if __APPLE__ || (HAVE_SYS_VFS_H && HAVE_SYS_STATVFS_H)
+#if __APPLE__ || __FreeBSD__ || (HAVE_SYS_VFS_H && HAVE_SYS_STATVFS_H)
 
 	Glib::Threads::Mutex::Lock lm (space_lock);
 
@@ -2569,6 +2657,15 @@ Session::add_command (Command* const cmd)
 	                    cmd->name ()));
 	_current_trans->add_command (cmd);
 }
+
+PBD::StatefulDiffCommand*
+Session::add_stateful_diff_command (boost::shared_ptr<PBD::StatefulDestructible> sfd)
+{
+	PBD::StatefulDiffCommand* cmd = new PBD::StatefulDiffCommand (sfd);
+	add_command (cmd);
+	return cmd;
+}
+
 void
 Session::begin_reversible_command (const string& name)
 {
@@ -2730,7 +2827,7 @@ Session::find_all_sources (string path, set<string>& result)
 
 	for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
 
-		XMLProperty* prop;
+		XMLProperty const * prop;
 
 		if ((prop = (*niter)->property (X_("type"))) == 0) {
 			continue;
@@ -2781,14 +2878,17 @@ Session::find_all_sources_across_snapshots (set<string>& result, bool exclude_th
 		return 0;
 	}
 
-	this_snapshot_path = _path;
-	this_snapshot_path += legalize_for_path (_current_snapshot_name);
+	this_snapshot_path = Glib::build_filename (_path, legalize_for_path (_current_snapshot_name));
 	this_snapshot_path += statefile_suffix;
 
 	for (vector<string>::iterator i = state_files.begin(); i != state_files.end(); ++i) {
 
+		cerr << "Looking at snapshot " << (*i) << " ( with this = [" << this_snapshot_path << "])\n";
+
 		if (exclude_this_snapshot && *i == this_snapshot_path) {
+			cerr << "\texcluded\n";
 			continue;
+
 		}
 
 		if (find_all_sources (*i, result) < 0) {
@@ -2919,6 +3019,12 @@ Session::cleanup_peakfiles ()
 	return 0;
 }
 
+static void
+merge_all_sources (boost::shared_ptr<const Playlist> pl, std::set<boost::shared_ptr<Source> >* all_sources)
+{
+	pl->deep_sources (*all_sources);
+}
+
 int
 Session::cleanup_sources (CleanupReport& rep)
 {
@@ -2929,14 +3035,14 @@ Session::cleanup_sources (CleanupReport& rep)
 	string midi_path;
 	vector<string> candidates;
 	vector<string> unused;
-	set<string> all_sources;
-	bool used;
+	set<string> sources_used_by_all_snapshots;
 	string spath;
 	int ret = -1;
 	string tmppath1;
 	string tmppath2;
 	Searchpath asp;
 	Searchpath msp;
+	set<boost::shared_ptr<Source> > sources_used_by_this_snapshot;
 
 	_state_of_the_state = (StateOfTheState) (_state_of_the_state | InCleanup);
 
@@ -3007,12 +3113,21 @@ Session::cleanup_sources (CleanupReport& rep)
 	find_files_matching_filter (candidates, audio_path, accept_all_audio_files, (void *) 0, true, true);
 	find_files_matching_filter (candidates, midi_path, accept_all_midi_files, (void *) 0, true, true);
 
-	/* find all sources, but don't use this snapshot because the
-	   state file on disk still references sources we may have already
-	   dropped.
+	/* add sources from all other snapshots as "used", but don't use this
+	   snapshot because the state file on disk still references sources we
+	   may have already dropped.
 	*/
 
-	find_all_sources_across_snapshots (all_sources, true);
+	find_all_sources_across_snapshots (sources_used_by_all_snapshots, true);
+
+	/* Although the region factory has a list of all regions ever created
+	 * for this session, we're only interested in regions actually in
+	 * playlists right now. So merge all playlist regions lists together.
+	 *
+	 * This will include the playlists used within compound regions.
+	 */
+
+	playlists->foreach (boost::bind (merge_all_sources, _1, &sources_used_by_this_snapshot));
 
 	/*  add our current source list
 	 */
@@ -3022,59 +3137,76 @@ Session::cleanup_sources (CleanupReport& rep)
                 SourceMap::iterator tmp = i;
                 ++tmp;
 
-		if ((fs = boost::dynamic_pointer_cast<FileSource> (i->second)) != 0) {
+		if ((fs = boost::dynamic_pointer_cast<FileSource> (i->second)) == 0) {
+			/* not a file */
+			i = tmp;
+			continue;
+		}
 
-			/* this is mostly for windows which doesn't allow file
-			 * renaming if the file is in use. But we don't special
-			 * case it because we need to know if this causes
-			 * problems, and the easiest way to notice that is to
-			 * keep it in place for all platforms.
-			 */
+		/* this is mostly for windows which doesn't allow file
+		 * renaming if the file is in use. But we do not special
+		 * case it because we need to know if this causes
+		 * problems, and the easiest way to notice that is to
+		 * keep it in place for all platforms.
+		 */
 
-			fs->close ();
+		fs->close ();
 
-			if (!fs->is_stub()) {
+		if (!fs->is_stub()) {
 
-				if (playlists->source_use_count (fs) != 0) {
-					all_sources.insert (fs->path());
-				} else {
+			/* Note that we're checking a list of all
+			 * sources across all snapshots with the list
+			 * of sources used by this snapshot.
+			 */
 
-					/* we might not remove this source from disk, because it may be used
-					   by other snapshots, but its not being used in this version
-					   so lets get rid of it now, along with any representative regions
-					   in the region list.
-					*/
+			if (sources_used_by_this_snapshot.find (i->second) != sources_used_by_this_snapshot.end()) {
+				/* this source is in use by this snapshot */
+				sources_used_by_all_snapshots.insert (fs->path());
+				cerr << "Source from source list found in used_by_this_snapshot (" << fs->path() << ")\n";
+			} else {
+				cerr << "Source from source list NOT found in used_by_this_snapshot (" << fs->path() << ")\n";
+				/* this source is NOT in use by this snapshot
+				 */
 
-					RegionFactory::remove_regions_using_source (i->second);
+				/* remove all related regions from RegionFactory master list
+				 */
 
-					// also remove source from all_sources
+				RegionFactory::remove_regions_using_source (i->second);
 
-					for (set<string>::iterator j = all_sources.begin(); j != all_sources.end(); ++j) {
-						spath = Glib::path_get_basename (*j);
-						if (spath == i->second->name()) {
-							all_sources.erase (j);
-							break;
-						}
-					}
+				/* remove from our current source list
+				 * also. We may not remove it from
+				 * disk, because it may be used by
+				 * other snapshots, but it isn't used inside this
+				 * snapshot anymore, so we don't need a
+				 * reference to it.
+				 */
 
-					sources.erase (i);
-				}
+				sources.erase (i);
 			}
 		}
 
                 i = tmp;
 	}
 
+	/* now check each candidate source to see if it exists in the list of
+	   sources_used_by_all_snapshots. If it doesn't, put it into "unused".
+	*/
+
+	cerr << "Candidates: " << candidates.size() << endl;
+	cerr << "Used by others: " << sources_used_by_all_snapshots.size() << endl;
+
 	for (vector<string>::iterator x = candidates.begin(); x != candidates.end(); ++x) {
 
-		used = false;
+		bool used = false;
 		spath = *x;
 
-		for (set<string>::iterator i = all_sources.begin(); i != all_sources.end(); ++i) {
+		for (set<string>::iterator i = sources_used_by_all_snapshots.begin(); i != sources_used_by_all_snapshots.end(); ++i) {
 
 			tmppath1 = canonical_path (spath);
 			tmppath2 = canonical_path ((*i));
 
+			cerr << "\t => " << tmppath2 << endl;
+
 			if (tmppath1 == tmppath2) {
 				used = true;
 				break;
@@ -3086,6 +3218,14 @@ Session::cleanup_sources (CleanupReport& rep)
 		}
 	}
 
+	cerr << "Actually unused: " << unused.size() << endl;
+
+	if (unused.empty()) {
+		/* Nothing to do */
+		ret = 0;
+		goto out;
+	}
+
 	/* now try to move all unused files into the "dead" directory(ies) */
 
 	for (vector<string>::iterator x = unused.begin(); x != unused.end(); ++x) {
@@ -3148,19 +3288,13 @@ Session::cleanup_sources (CleanupReport& rep)
 				newpath = newpath_v;
 			}
 
-		} else {
-
-			/* it doesn't exist, or we can't read it or something */
-
 		}
 
 		g_stat ((*x).c_str(), &statbuf);
 
 		if (::rename ((*x).c_str(), newpath.c_str()) != 0) {
-			error << string_compose (_("cannot rename unused file source from %1 to %2 (%3)"),
-					  (*x), newpath, strerror (errno))
-			      << endmsg;
-			goto out;
+			error << string_compose (_("cannot rename unused file source from %1 to %2 (%3)"), (*x), newpath, strerror (errno)) << endmsg;
+			continue;
 		}
 
 		/* see if there an easy to find peakfile for this file, and remove it.
@@ -3320,68 +3454,85 @@ boost::shared_ptr<Controllable>
 Session::controllable_by_descriptor (const ControllableDescriptor& desc)
 {
 	boost::shared_ptr<Controllable> c;
+	boost::shared_ptr<Stripable> s;
 	boost::shared_ptr<Route> r;
 
 	switch (desc.top_level_type()) {
 	case ControllableDescriptor::NamedRoute:
 	{
 		std::string str = desc.top_level_name();
+
 		if (str == "Master" || str == "master") {
-			r = _master_out;
-		} else if (str == "control" || str == "listen") {
-			r = _monitor_out;
+			s = _master_out;
+		} else if (str == "control" || str == "listen" || str == "monitor" || str == "Monitor") {
+			s = _monitor_out;
+		} else if (str == "auditioner") {
+			s = auditioner;
 		} else {
-			r = route_by_name (desc.top_level_name());
+			s = route_by_name (desc.top_level_name());
 		}
+
 		break;
 	}
 
-	case ControllableDescriptor::RemoteControlID:
-		r = route_by_remote_id (desc.rid());
+	case ControllableDescriptor::PresentationOrderRoute:
+		s = get_remote_nth_stripable (desc.presentation_order(), PresentationInfo::Route);
+		break;
+
+	case ControllableDescriptor::PresentationOrderTrack:
+		s = get_remote_nth_stripable (desc.presentation_order(), PresentationInfo::Track);
+		break;
+
+	case ControllableDescriptor::PresentationOrderBus:
+		s = get_remote_nth_stripable (desc.presentation_order(), PresentationInfo::Bus);
+		break;
+
+	case ControllableDescriptor::PresentationOrderVCA:
+		s = get_remote_nth_stripable (desc.presentation_order(), PresentationInfo::VCA);
+		break;
+
+	case ControllableDescriptor::SelectionCount:
+		s = route_by_selected_count (desc.selection_id());
 		break;
 	}
 
-	if (!r) {
+	if (!s) {
 		return c;
 	}
 
+	r = boost::dynamic_pointer_cast<Route> (s);
+
 	switch (desc.subtype()) {
 	case ControllableDescriptor::Gain:
-		c = r->gain_control ();
+		c = s->gain_control ();
 		break;
 
 	case ControllableDescriptor::Trim:
-		c = r->trim()->gain_control ();
+		c = s->trim_control ();
 		break;
 
 	case ControllableDescriptor::Solo:
-                c = r->solo_control();
+                c = s->solo_control();
 		break;
 
 	case ControllableDescriptor::Mute:
-		c = r->mute_control();
+		c = s->mute_control();
 		break;
 
 	case ControllableDescriptor::Recenable:
-	{
-		boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track>(r);
-
-		if (t) {
-			c = t->rec_enable_control ();
-		}
+		c = s->rec_enable_control ();
 		break;
-	}
 
 	case ControllableDescriptor::PanDirection:
-		c = r->pan_azimuth_control();
+		c = s->pan_azimuth_control();
 		break;
 
 	case ControllableDescriptor::PanWidth:
-	        c = r->pan_width_control();
+	        c = s->pan_width_control();
 		break;
 
 	case ControllableDescriptor::PanElevation:
-	        c = r->pan_elevation_control();
+	        c = s->pan_elevation_control();
 		break;
 
 	case ControllableDescriptor::Balance:
@@ -3403,6 +3554,10 @@ Session::controllable_by_descriptor (const ControllableDescriptor& desc)
 			--parameter_index;
 		}
 
+		if (!r) {
+			return c;
+		}
+
 		boost::shared_ptr<Processor> p = r->nth_plugin (plugin);
 
 		if (p) {
@@ -3417,6 +3572,9 @@ Session::controllable_by_descriptor (const ControllableDescriptor& desc)
 		if (send > 0) {
 			--send;
 		}
+		if (!r) {
+			return c;
+		}
 		c = r->send_level_controllable (send);
 		break;
 	}
@@ -3789,7 +3947,7 @@ Session::config_changed (std::string p, bool ours)
 	} else if (p == "solo-control-is-listen-control") {
 		solo_control_mode_changed ();
 	} else if (p == "solo-mute-gain") {
-		_solo_cut_control->Changed();
+		_solo_cut_control->Changed (true, Controllable::NoGroup);
 	} else if (p == "timecode-offset" || p == "timecode-offset-negative") {
 		last_timecode_valid = false;
 	} else if (p == "playback-buffer-seconds") {
@@ -4163,27 +4321,29 @@ Session::get_info_from_path (const string& xmlpath, float& sample_rate, SampleFo
 
 	/* sample rate */
 
-	const XMLProperty* prop;
-	if ((prop = tree.root()->property (X_("sample-rate"))) != 0) {
+	XMLProperty const * prop;
+	XMLNode const * root (tree.root());
+
+	if ((prop = root->property (X_("sample-rate"))) != 0) {
 		sample_rate = atoi (prop->value());
 		found_sr = true;
 	}
 
-	const XMLNodeList& children (tree.root()->children());
+	const XMLNodeList& children (root->children());
 	for (XMLNodeList::const_iterator c = children.begin(); c != children.end(); ++c) {
 		const XMLNode* child = *c;
 		if (child->name() == "Config") {
 			const XMLNodeList& options (child->children());
 			for (XMLNodeList::const_iterator oc = options.begin(); oc != options.end(); ++oc) {
-				const XMLNode* option = *oc;
-				const XMLProperty* name = option->property("name");
+				XMLNode const * option = *oc;
+				XMLProperty const * name = option->property("name");
 
 				if (!name) {
 					continue;
 				}
 
 				if (name->value() == "native-file-data-format") {
-					const XMLProperty* value = option->property ("value");
+					XMLProperty const * value = option->property ("value");
 					if (value) {
 						SampleFormat fmt = (SampleFormat) string_2_enum (option->property ("value")->value(), fmt);
 						data_format = fmt;
@@ -4215,7 +4375,7 @@ Session::get_snapshot_from_instant (const std::string& session_dir)
 		return "";
 	}
 
-	const XMLProperty* prop;
+	XMLProperty const * prop;
 	XMLNode *last_used_snapshot = tree.root()->child("LastUsedSnapshot");
 	if (last_used_snapshot && (prop = last_used_snapshot->property ("name")) != 0) {
 		return prop->value();
diff --git a/libs/ardour/session_state_utils.cc b/libs/ardour/session_state_utils.cc
index 5d5c9cc..28cfbb2 100644
--- a/libs/ardour/session_state_utils.cc
+++ b/libs/ardour/session_state_utils.cc
@@ -30,7 +30,7 @@
 #include "ardour/session_state_utils.h"
 #include "ardour/filename_extensions.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace PBD;
diff --git a/libs/ardour/session_time.cc b/libs/ardour/session_time.cc
index ab5a470..8f08028 100644
--- a/libs/ardour/session_time.cc
+++ b/libs/ardour/session_time.cc
@@ -35,7 +35,7 @@
 #include "ardour/session.h"
 #include "ardour/tempo.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
@@ -46,7 +46,7 @@ using namespace PBD;
 void
 Session::bbt_time (framepos_t when, Timecode::BBT_Time& bbt)
 {
-	_tempo_map->bbt_time (when, bbt);
+	bbt = _tempo_map->bbt_at_frame (when);
 }
 
 /* Timecode TIME */
@@ -66,7 +66,7 @@ Session::timecode_drop_frames() const
 void
 Session::sync_time_vars ()
 {
-	_current_frame_rate = (framecnt_t) round (_base_frame_rate * (1.0 + (config.get_video_pullup()/100.0)));
+	_current_frame_rate = (framecnt_t) round (_nominal_frame_rate * (1.0 + (config.get_video_pullup()/100.0)));
 	_frames_per_timecode_frame = (double) _current_frame_rate / (double) timecode_frames_per_second();
 	if (timecode_drop_frames()) {
 	  _frames_per_hour = (int32_t)(107892 * _frames_per_timecode_frame);
@@ -226,7 +226,7 @@ Session::convert_to_frames (AnyTime const & position)
 
 	switch (position.type) {
 	case AnyTime::BBT:
-		return _tempo_map->frame_time (position.bbt);
+		return _tempo_map->frame_at_bbt (position.bbt);
 		break;
 
 	case AnyTime::Timecode:
diff --git a/libs/ardour/session_transport.cc b/libs/ardour/session_transport.cc
index f1486ad..8771af4 100644
--- a/libs/ardour/session_transport.cc
+++ b/libs/ardour/session_transport.cc
@@ -47,7 +47,7 @@
 #include "ardour/slave.h"
 #include "ardour/operations.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
@@ -373,6 +373,12 @@ Session::butler_transport_work ()
 	}
 
 	if (ptw & PostTransportAdjustPlaybackBuffering) {
+		/* non_realtime_locate() calls Automatable::transport_located()
+		 * for every route. This eventually calls
+		 * ARDOUR::AutomationList::state () which has a LocaleGuard,
+		 * and would switch locales forth/back every time.
+		 */
+		LocaleGuard lg;
 		for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
 			boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
 			if (tr) {
@@ -421,7 +427,7 @@ Session::butler_transport_work ()
 		/* don't seek if locate will take care of that in non_realtime_stop() */
 
 		if (!(ptw & PostTransportLocate)) {
-
+			LocaleGuard lg; // see note for non_realtime_locate() above
 			for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
 				(*i)->non_realtime_locate (_transport_frame);
 
@@ -530,9 +536,12 @@ Session::non_realtime_locate ()
 	}
 
 
-	boost::shared_ptr<RouteList> rl = routes.reader();
-	for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
-		(*i)->non_realtime_locate (_transport_frame);
+	{
+		LocaleGuard lg; // see note for non_realtime_locate() above
+		boost::shared_ptr<RouteList> rl = routes.reader();
+		for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
+			(*i)->non_realtime_locate (_transport_frame);
+		}
 	}
 
 	_scene_changer->locate (_transport_frame);
@@ -789,15 +798,18 @@ Session::non_realtime_stop (bool abort, int on_entry, bool& finished)
 
 	/* this for() block can be put inside the previous if() and has the effect of ... ??? what */
 
-	DEBUG_TRACE (DEBUG::Transport, X_("Butler PTW: locate\n"));
-	for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
-		DEBUG_TRACE (DEBUG::Transport, string_compose ("Butler PTW: locate on %1\n", (*i)->name()));
-		(*i)->non_realtime_locate (_transport_frame);
+	{
+		LocaleGuard lg; // see note for non_realtime_locate() above
+		DEBUG_TRACE (DEBUG::Transport, X_("Butler PTW: locate\n"));
+		for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
+			DEBUG_TRACE (DEBUG::Transport, string_compose ("Butler PTW: locate on %1\n", (*i)->name()));
+			(*i)->non_realtime_locate (_transport_frame);
 
-		if (on_entry != g_atomic_int_get (&_butler->should_do_transport_work)) {
-			finished = false;
-			/* we will be back */
-			return;
+			if (on_entry != g_atomic_int_get (&_butler->should_do_transport_work)) {
+				finished = false;
+				/* we will be back */
+				return;
+			}
 		}
 	}
 
@@ -1144,12 +1156,9 @@ Session::locate (framepos_t target_frame, bool with_roll, bool with_flush, bool
 	}
 
 	// Update Timecode time
-	// [DR] FIXME: find out exactly where this should go below
 	_transport_frame = target_frame;
 	_last_roll_or_reversal_location = target_frame;
 	timecode_time(_transport_frame, transmitting_timecode_time);
-	outbound_mtc_timecode_frame = _transport_frame;
-	next_quarter_frame_to_send = 0;
 
 	/* do "stopped" stuff if:
 	 *
@@ -1256,7 +1265,7 @@ Session::locate (framepos_t target_frame, bool with_roll, bool with_flush, bool
 				for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
 					boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
 
-					if (tr && tr->record_enabled ()) {
+					if (tr && tr->rec_enable_control()->get_value()) {
 						// tell it we've looped, so it can deal with the record state
 						tr->transport_looped (_transport_frame);
 					}
diff --git a/libs/ardour/session_vst.cc b/libs/ardour/session_vst.cc
index c6978ed..7b52b3c 100644
--- a/libs/ardour/session_vst.cc
+++ b/libs/ardour/session_vst.cc
@@ -26,6 +26,7 @@
 #include "ardour/debug.h"
 #include "ardour/session.h"
 #include "ardour/tempo.h"
+#include "ardour/plugin_insert.h"
 #include "ardour/windows_vst_plugin.h"
 #include "ardour/vestige/aeffectx.h"
 #include "ardour/vst_types.h"
@@ -33,11 +34,40 @@
 #include <fst.h>
 #endif
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 
-#define SHOW_CALLBACK(MSG) DEBUG_TRACE (PBD::DEBUG::VSTCallbacks, string_compose (MSG " val = %1 idx = %2", index, value))
+#define SHOW_CALLBACK(MSG) DEBUG_TRACE (PBD::DEBUG::VSTCallbacks, string_compose (MSG " val = %1 idx = %2\n", index, value))
+
+static double
+vst_ppq (const TempoMetric& tm, const Timecode::BBT_Time& bbt, double& ppqBar)
+{
+
+	/* PPQ = pulse per quarter
+	 * VST's "pulse" is our "division".
+	 *
+	 * 8 divisions per bar, 1 division = quarter, so 8 quarters per bar, ppq = 1
+	 * 8 divisions per bar, 1 division = eighth, so  4 quarters per bar, ppq = 2
+	 * 4 divisions per bar, 1 division = quarter, so  4 quarters per bar, ppq = 1
+	 * 4 divisions per bar, 1 division = half, so 8 quarters per bar, ppq = 0.5
+	 * 4 divisions per bar, 1 division = fifth, so (4 * 5/4) quarters per bar, ppq = 5/4
+	 *
+	 * general: divs_per_bar / (note_type / 4.0)
+	 */
+	const double ppq_scaling =  tm.meter().note_divisor() / 4.0;
+
+	/* Note that this assumes constant meter/tempo throughout the session. Stupid VST */
+	ppqBar = double(bbt.bars - 1) * tm.meter().divisions_per_bar();
+	double ppqBeat = double(bbt.beats - 1);
+	double ppqTick = double(bbt.ticks) / Timecode::BBT_Time::ticks_per_beat;
+
+	ppqBar *= ppq_scaling;
+	ppqBeat *= ppq_scaling;
+	ppqTick *= ppq_scaling;
+
+	return ppqBar + ppqBeat + ppqTick;
+}
 
 int Session::vst_current_loading_id = 0;
 const char* Session::vst_can_do_strings[] = {
@@ -62,20 +92,24 @@ intptr_t Session::vst_callback (
 	float opt
 	)
 {
-	static VstTimeInfo _timeInfo;
 	VSTPlugin* plug;
 	Session* session;
+	static VstTimeInfo _timeinfo; // only uses as fallback
+	VstTimeInfo* timeinfo;
+	int32_t newflags = 0;
 
 	if (effect && effect->user) {
 		plug = (VSTPlugin *) (effect->user);
 		session = &plug->session();
-		DEBUG_TRACE (PBD::DEBUG::VSTCallbacks, string_compose ("am callback 0x%1%2, opcode = %3%4, plugin = \"%5\" ",
+		timeinfo = plug->timeinfo ();
+		DEBUG_TRACE (PBD::DEBUG::VSTCallbacks, string_compose ("am callback 0x%1%2, opcode = %3%4, plugin = \"%5\"\n",
 					std::hex, (void*) DEBUG_THREAD_SELF,
 					std::dec, opcode, plug->name()));
 	} else {
 		plug = 0;
 		session = 0;
-		DEBUG_TRACE (PBD::DEBUG::VSTCallbacks, string_compose ("am callback 0x%1%2, opcode = %3%4",
+		timeinfo = &_timeinfo;
+		DEBUG_TRACE (PBD::DEBUG::VSTCallbacks, string_compose ("am callback 0x%1%2, opcode = %3%4\n",
 					std::hex, (void*) DEBUG_THREAD_SELF,
 					std::dec, opcode));
 	}
@@ -124,11 +158,25 @@ intptr_t Session::vst_callback (
 		}
 		switch (value) {
 			case 0:
+				if (plug->plugin_insert ()) {
+					bool valid;
+					const ChanMapping& map (plug->plugin_insert ()->input_map (plug->plugin_number ()));
+					map.get (DataType::AUDIO, index, &valid);
+					return valid ? 0 : 1;
+				}
 				if (index < plug->plugin()->numInputs) {
 					return 0;
 				}
 				break;
 			case 1:
+#if 0 // investigate, the outputs *are* connected to scratch buffers
+				if (plug->plugin_insert ()) {
+					bool valid;
+					const ChanMapping& map (plug->plugin_insert ()->output_map (plug->plugin_number ()));
+					map.get (DataType::AUDIO, index, &valid);
+					return valid ? 0 : 1;
+				}
+#endif
 				if (index < plug->plugin()->numOutputs) {
 					return 0;
 				}
@@ -148,67 +196,46 @@ intptr_t Session::vst_callback (
 
 	case audioMasterGetTime:
 		SHOW_CALLBACK ("audioMasterGetTime");
-		// returns const VstTimeInfo* (or 0 if not supported)
-		// <value> should contain a mask indicating which fields are required
-		// (see valid masks above), as some items may require extensive
-		// conversions
-		_timeInfo.flags = 0;
+		newflags = kVstNanosValid | kVstAutomationWriting | kVstAutomationReading;
 
-		if (session) {
-			framepos_t now = session->transport_frame();
+		timeinfo->nanoSeconds = g_get_monotonic_time () * 1000;
+
+		if (plug && session) {
+			framepos_t now = plug->transport_frame();
 
-			_timeInfo.samplePos = now;
-			_timeInfo.sampleRate = session->frame_rate();
+			timeinfo->samplePos = now;
+			timeinfo->sampleRate = session->frame_rate();
 
 			const TempoMetric& tm (session->tempo_map().metric_at (now));
 
 			if (value & (kVstTempoValid)) {
 				const Tempo& t (tm.tempo());
-				_timeInfo.tempo = t.beats_per_minute ();
-				_timeInfo.flags |= (kVstTempoValid);
+				timeinfo->tempo = t.beats_per_minute ();
+				newflags |= (kVstTempoValid);
 			}
 			if (value & (kVstTimeSigValid)) {
 				const Meter& m (tm.meter());
-				_timeInfo.timeSigNumerator = m.divisions_per_bar ();
-				_timeInfo.timeSigDenominator = m.note_divisor ();
-				_timeInfo.flags |= (kVstTimeSigValid);
+				timeinfo->timeSigNumerator = m.divisions_per_bar ();
+				timeinfo->timeSigDenominator = m.note_divisor ();
+				newflags |= (kVstTimeSigValid);
 			}
 			if ((value & (kVstPpqPosValid)) || (value & (kVstBarsValid))) {
 				Timecode::BBT_Time bbt;
 
 				try {
-					session->tempo_map().bbt_time_rt (now, bbt);
-
-					/* PPQ = pulse per quarter
-					 * VST's "pulse" is our "division".
-					 *
-					 * 8 divisions per bar, 1 division = quarter, so 8 quarters per bar, ppq = 1
-					 * 8 divisions per bar, 1 division = eighth, so  4 quarters per bar, ppq = 2
-					 * 4 divisions per bar, 1 division = quarter, so  4 quarters per bar, ppq = 1
-					 * 4 divisions per bar, 1 division = half, so 8 quarters per bar, ppq = 0.5
-					 * 4 divisions per bar, 1 division = fifth, so (4 * 5/4) quarters per bar, ppq = 5/4
-					 *
-					 * general: divs_per_bar / (note_type / 4.0)
-					 */
-					double ppq_scaling =  tm.meter().note_divisor() / 4.0;
-
-					/* Note that this assumes constant meter/tempo throughout the session. Stupid VST */
-					double ppqBar = double(bbt.bars - 1) * tm.meter().divisions_per_bar();
-					double ppqBeat = double(bbt.beats - 1);
-					double ppqTick = double(bbt.ticks) / Timecode::BBT_Time::ticks_per_beat;
-
-					ppqBar *= ppq_scaling;
-					ppqBeat *= ppq_scaling;
-					ppqTick *= ppq_scaling;
+					bbt = session->tempo_map().bbt_at_frame_rt (now);
+
+					double ppqBar;
+					double ppqPos = vst_ppq (tm, bbt, ppqBar);
 
 					if (value & (kVstPpqPosValid)) {
-						_timeInfo.ppqPos = ppqBar + ppqBeat + ppqTick;
-						_timeInfo.flags |= (kVstPpqPosValid);
+						timeinfo->ppqPos = ppqPos;
+						newflags |= kVstPpqPosValid;
 					}
 
 					if (value & (kVstBarsValid)) {
-						_timeInfo.barStartPos = ppqBar;
-						_timeInfo.flags |= (kVstBarsValid);
+						timeinfo->barStartPos = ppqBar;
+						newflags |= kVstBarsValid;
 					}
 
 				} catch (...) {
@@ -221,54 +248,73 @@ intptr_t Session::vst_callback (
 
 				session->timecode_time (now, t);
 
-				_timeInfo.smpteOffset = (t.hours * t.rate * 60.0 * 60.0) +
+				timeinfo->smpteOffset = (t.hours * t.rate * 60.0 * 60.0) +
 					(t.minutes * t.rate * 60.0) +
 					(t.seconds * t.rate) +
 					(t.frames) +
 					(t.subframes);
 
-				_timeInfo.smpteOffset *= 80.0; /* VST spec is 1/80th frames */
+				timeinfo->smpteOffset *= 80.0; /* VST spec is 1/80th frames */
 
 				if (session->timecode_drop_frames()) {
 					if (session->timecode_frames_per_second() == 30.0) {
-						_timeInfo.smpteFrameRate = 5;
+						timeinfo->smpteFrameRate = 5;
 					} else {
-						_timeInfo.smpteFrameRate = 4; /* 29.97 assumed, thanks VST */
+						timeinfo->smpteFrameRate = 4; /* 29.97 assumed, thanks VST */
 					}
 				} else {
 					if (session->timecode_frames_per_second() == 24.0) {
-						_timeInfo.smpteFrameRate = 0;
+						timeinfo->smpteFrameRate = 0;
 					} else if (session->timecode_frames_per_second() == 24.975) {
-						_timeInfo.smpteFrameRate = 2;
+						timeinfo->smpteFrameRate = 2;
 					} else if (session->timecode_frames_per_second() == 25.0) {
-						_timeInfo.smpteFrameRate = 1;
+						timeinfo->smpteFrameRate = 1;
 					} else {
-						_timeInfo.smpteFrameRate = 3; /* 30 fps */
+						timeinfo->smpteFrameRate = 3; /* 30 fps */
 					}
 				}
-				_timeInfo.flags |= (kVstSmpteValid);
+				newflags |= (kVstSmpteValid);
 			}
 
-			//ToDo: 
-			//if this is found to be burdensome to plugins,
-			//we should cache the previous state at a global level,
-			//and only set this flag when the transport changes state
-			_timeInfo.flags |= (kVstTransportChanged);
+			if (session->actively_recording ()) {
+				newflags |= kVstTransportRecording;
+			}
 
-			if (session->transport_speed() != 0.0f) {
-				_timeInfo.flags |= (kVstTransportPlaying);
+			if (plug->transport_speed () != 0.0f) {
+				newflags |= kVstTransportPlaying;
 			}
 
-			if (session->get_play_loop()) {
-				_timeInfo.flags |= (kVstTransportCycleActive);
+			if (session->get_play_loop ()) {
+				newflags |= kVstTransportCycleActive;
+				Location * looploc = session->locations ()->auto_loop_location ();
+				if (looploc) try {
+					double ppqBar;
+					Timecode::BBT_Time bbt;
+
+					bbt = session->tempo_map ().bbt_at_frame_rt (looploc->start ());
+					timeinfo->cycleStartPos = vst_ppq (tm, bbt, ppqBar);
+
+					bbt = session->tempo_map ().bbt_at_frame_rt (looploc->end ());
+					timeinfo->cycleEndPos = vst_ppq (tm, bbt, ppqBar);
+
+					newflags |= kVstCyclePosValid;
+				} catch (...) { }
 			}
 
 		} else {
-			_timeInfo.samplePos = 0;
-			_timeInfo.sampleRate = AudioEngine::instance()->sample_rate();
+			timeinfo->samplePos = 0;
+			timeinfo->sampleRate = AudioEngine::instance()->sample_rate();
+		}
+
+		if ((timeinfo->flags & (kVstTransportPlaying | kVstTransportRecording | kVstTransportCycleActive))
+		    !=
+		    (newflags        & (kVstTransportPlaying | kVstTransportRecording | kVstTransportCycleActive)))
+		{
+			newflags |= kVstTransportChanged;
 		}
 
-		return (intptr_t) &_timeInfo;
+		timeinfo->flags = newflags;
+		return (intptr_t) timeinfo;
 
 	case audioMasterProcessEvents:
 		SHOW_CALLBACK ("audioMasterProcessEvents");
@@ -292,7 +338,7 @@ intptr_t Session::vst_callback (
 		SHOW_CALLBACK ("audioMasterTempoAt");
 		// returns tempo (in bpm * 10000) at sample frame location passed in <value>
 		if (session) {
-			const Tempo& t (session->tempo_map().tempo_at (value));
+			const Tempo& t (session->tempo_map().tempo_at_frame (value));
 			return t.beats_per_minute() * 1000;
 		} else {
 			return 0;
@@ -503,4 +549,3 @@ intptr_t Session::vst_callback (
 
 	return 0;
 }
-
diff --git a/libs/ardour/sidechain.cc b/libs/ardour/sidechain.cc
new file mode 100644
index 0000000..e759af3
--- /dev/null
+++ b/libs/ardour/sidechain.cc
@@ -0,0 +1,102 @@
+/*
+ * Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+ * Copyright (C) 2006 Paul Davis
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+
+#include <algorithm>
+
+#include "pbd/xml++.h"
+
+#include "ardour/audioengine.h"
+#include "ardour/buffer.h"
+#include "ardour/buffer_set.h"
+#include "ardour/io.h"
+#include "ardour/session.h"
+#include "ardour/sidechain.h"
+
+#include "pbd/i18n.h"
+
+using namespace ARDOUR;
+using namespace PBD;
+
+
+SideChain::SideChain (Session& s, const std::string& name)
+	: IOProcessor (s, true, false, name)
+{
+}
+
+SideChain::~SideChain ()
+{
+	disconnect ();
+}
+
+XMLNode&
+SideChain::state (bool full)
+{
+	XMLNode& node = IOProcessor::state (full);
+	node.add_property ("type", "sidechain");
+	return node;
+}
+
+
+int
+SideChain::set_state (const XMLNode& node, int version)
+{
+	IOProcessor::set_state (node, version);
+	return 0;
+}
+
+void
+SideChain::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, double /*speed*/, pframes_t nframes, bool)
+{
+	if (_input->n_ports () == ChanCount::ZERO) {
+		// inplace pass-through
+		return;
+	}
+
+	if (!_active && !_pending_active) {
+		// zero buffers
+		for (DataType::iterator t = DataType::begin (); t != DataType::end (); ++t) {
+			for (uint32_t out = _configured_input.get (*t); out < bufs.count ().get (*t); ++out) {
+				bufs.get (*t, out).silence (nframes);
+			}
+		}
+		return;
+	}
+
+	_input->collect_input (bufs, nframes, _configured_input);
+	bufs.set_count (_configured_output);
+
+	_active = _pending_active;
+}
+
+bool
+SideChain::can_support_io_configuration (const ChanCount& in, ChanCount& out)
+{
+	out = in + _input->n_ports ();
+	return true;
+}
+
+bool
+SideChain::configure_io (ChanCount in, ChanCount out)
+{
+	if (out != in + _input->n_ports ()) {
+		/* disabled for now - see PluginInsert::configure_io() */
+		// return false;
+	}
+	return Processor::configure_io (in, out);
+}
diff --git a/libs/ardour/slavable.cc b/libs/ardour/slavable.cc
new file mode 100644
index 0000000..10eb084
--- /dev/null
+++ b/libs/ardour/slavable.cc
@@ -0,0 +1,210 @@
+/*
+    Copyright (C) 2016 Paul Davis
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#include <vector>
+
+#include <glibmm/threads.h>
+
+#include "pbd/convert.h"
+#include "pbd/error.h"
+#include "pbd/xml++.h"
+
+#include "ardour/slavable.h"
+#include "ardour/slavable_automation_control.h"
+#include "ardour/vca.h"
+#include "ardour/vca_manager.h"
+
+#include "pbd/i18n.h"
+
+using namespace PBD;
+using namespace ARDOUR;
+
+std::string Slavable::xml_node_name = X_("Slavable");
+PBD::Signal1<void,VCAManager*> Slavable::Assign; /* signal sent once
+                                                  * assignment is possible */
+
+Slavable::Slavable ()
+{
+	Assign.connect_same_thread (assign_connection, boost::bind (&Slavable::do_assign, this, _1));
+}
+
+XMLNode&
+Slavable::get_state () const
+{
+	XMLNode* node = new XMLNode (xml_node_name);
+	XMLNode* child;
+
+	Glib::Threads::RWLock::ReaderLock lm (master_lock);
+	for (std::set<uint32_t>::const_iterator i = _masters.begin(); i != _masters.end(); ++i) {
+		child = new XMLNode (X_("Master"));
+		child->add_property (X_("number"), to_string (*i, std::dec));
+		node->add_child_nocopy (*child);
+	}
+
+	return *node;
+}
+
+int
+Slavable::set_state (XMLNode const& node, int version)
+{
+	if (node.name() != xml_node_name) {
+		return -1;
+	}
+
+	XMLNodeList const& children (node.children());
+	Glib::Threads::RWLock::WriterLock lm (master_lock);
+
+	for (XMLNodeList::const_iterator i = children.begin(); i != children.end(); ++i) {
+		if ((*i)->name() == X_("Master")) {
+			XMLProperty const* prop = (*i)->property (X_("number"));
+			if (prop) {
+				uint32_t n = atoi (prop->value());
+				_masters.insert (n);
+			}
+		}
+	}
+
+	return 0;
+}
+
+
+int
+Slavable::do_assign (VCAManager* manager)
+{
+	std::vector<boost::shared_ptr<VCA> > vcas;
+
+	{
+		Glib::Threads::RWLock::ReaderLock lm (master_lock);
+
+		for (std::set<uint32_t>::const_iterator i = _masters.begin(); i != _masters.end(); ++i) {
+			boost::shared_ptr<VCA> v = manager->vca_by_number (*i);
+			if (v) {
+				vcas.push_back (v);
+			} else {
+				warning << string_compose (_("Master #%1 not found, assignment lost"), *i) << endmsg;
+			}
+		}
+	}
+
+	/* now that we've released the lock, we can do the assignments */
+
+	for (std::vector<boost::shared_ptr<VCA> >::iterator v = vcas.begin(); v != vcas.end(); ++v) {
+		assign (*v);
+	}
+
+	assign_connection.disconnect ();
+
+	return 0;
+}
+
+void
+Slavable::assign (boost::shared_ptr<VCA> v)
+{
+	assert (v);
+	Glib::Threads::RWLock::WriterLock lm (master_lock);
+	if (assign_controls (v) == 0) {
+		_masters.insert (v->number());
+	}
+
+	/* Do NOT use ::unassign() because it will store a
+	 * boost::shared_ptr<VCA> in the functor, leaving a dangling ref to the
+	 * VCA.
+	 */
+
+
+	v->Drop.connect_same_thread (unassign_connections, boost::bind (&Slavable::weak_unassign, this, boost::weak_ptr<VCA>(v)));
+	v->DropReferences.connect_same_thread (unassign_connections, boost::bind (&Slavable::weak_unassign, this, boost::weak_ptr<VCA>(v)));
+}
+
+void
+Slavable::weak_unassign (boost::weak_ptr<VCA> v)
+{
+	boost::shared_ptr<VCA> sv (v.lock());
+	if (sv) {
+		unassign (sv);
+	}
+}
+
+void
+Slavable::unassign (boost::shared_ptr<VCA> v)
+{
+	Glib::Threads::RWLock::WriterLock lm (master_lock);
+	(void) unassign_controls (v);
+	if (v) {
+		_masters.erase (v->number());
+	} else {
+		_masters.clear ();
+	}
+}
+
+/* Gain, solo & mute are currently the only controls that are
+ * automatically slaved to the master's own equivalent controls.
+ */
+
+static AutomationType auto_slave_types[] = {
+	GainAutomation,
+	SoloAutomation,
+	MuteAutomation,
+	NullAutomation
+};
+
+int
+Slavable::assign_controls (boost::shared_ptr<VCA> vca)
+{
+	boost::shared_ptr<SlavableAutomationControl> slave;
+	boost::shared_ptr<AutomationControl> master;
+
+	for (uint32_t n = 0; auto_slave_types[n] != NullAutomation; ++n) {
+
+		slave = boost::dynamic_pointer_cast<SlavableAutomationControl> (automation_control (auto_slave_types[n]));
+		master = vca->automation_control (auto_slave_types[n]);
+
+		if (slave && master) {
+			slave->add_master (master);
+		}
+	}
+
+	return 0;
+}
+
+int
+Slavable::unassign_controls (boost::shared_ptr<VCA> vca)
+{
+	boost::shared_ptr<SlavableAutomationControl> slave;
+	boost::shared_ptr<AutomationControl> master;
+
+	for (uint32_t n = 0; auto_slave_types[n] != NullAutomation; ++n) {
+
+		slave = boost::dynamic_pointer_cast<SlavableAutomationControl> (automation_control (auto_slave_types[n]));
+
+		if (!vca) {
+			/* unassign from all */
+			if (slave) {
+				slave->clear_masters ();
+			}
+		} else {
+			master = vca->automation_control (auto_slave_types[n]);
+			if (slave && master) {
+				slave->remove_master (master);
+			}
+		}
+	}
+
+	return 0;
+}
diff --git a/libs/ardour/slavable_automation_control.cc b/libs/ardour/slavable_automation_control.cc
new file mode 100644
index 0000000..d400234
--- /dev/null
+++ b/libs/ardour/slavable_automation_control.cc
@@ -0,0 +1,334 @@
+/*
+    Copyright (C) 2016 Paul Davis
+
+    This program is free software; you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by the Free
+    Software Foundation; either version 2 of the License, or (at your option)
+    any later version.
+
+    This program is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc.,
+    675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#ifndef __libardour_slavable_automation_control_h__
+#define __libardour_slavable_automation_control_h__
+
+#include "pbd/enumwriter.h"
+
+#include "ardour/slavable_automation_control.h"
+#include "ardour/session.h"
+
+using namespace std;
+using namespace ARDOUR;
+using namespace PBD;
+
+SlavableAutomationControl::SlavableAutomationControl(ARDOUR::Session& s,
+                                                     const Evoral::Parameter&                  parameter,
+                                                     const ParameterDescriptor&                desc,
+                                                     boost::shared_ptr<ARDOUR::AutomationList> l,
+                                                     const std::string&                        name)
+	: AutomationControl (s, parameter, desc, l, name)
+{
+}
+
+double
+SlavableAutomationControl::get_masters_value_locked () const
+{
+	double v = _desc.normal;
+
+	if (_desc.toggled) {
+		for (Masters::const_iterator mr = _masters.begin(); mr != _masters.end(); ++mr) {
+			if (mr->second.master()->get_value()) {
+				return _desc.upper;
+			}
+		}
+		return _desc.lower;
+	}
+
+	for (Masters::const_iterator mr = _masters.begin(); mr != _masters.end(); ++mr) {
+		/* get current master value, scale by our current ratio with that master */
+		v *= mr->second.master()->get_value () * mr->second.ratio();
+	}
+
+	return min ((double) _desc.upper, v);
+}
+
+double
+SlavableAutomationControl::get_value_locked() const
+{
+	/* read or write masters lock must be held */
+
+	if (_masters.empty()) {
+		return Control::get_double (false, _session.transport_frame());
+	}
+
+	if (_desc.toggled) {
+		/* for boolean/toggle controls, if this slave OR any master is
+		 * enabled, this slave is enabled. So check our own value
+		 * first, because if we are enabled, we can return immediately.
+		 */
+		if (Control::get_double (false, _session.transport_frame())) {
+			return _desc.upper;
+		}
+	}
+
+	return get_masters_value_locked ();
+}
+
+/** Get the current effective `user' value based on automation state */
+double
+SlavableAutomationControl::get_value() const
+{
+	bool from_list = _list && boost::dynamic_pointer_cast<AutomationList>(_list)->automation_playback();
+
+	if (!from_list) {
+		Glib::Threads::RWLock::ReaderLock lm (master_lock);
+		return get_value_locked ();
+	} else {
+		return Control::get_double (from_list, _session.transport_frame());
+	}
+}
+
+void
+SlavableAutomationControl::actually_set_value (double val, Controllable::GroupControlDisposition group_override)
+{
+	val = std::max (std::min (val, (double)_desc.upper), (double)_desc.lower);
+
+	{
+		Glib::Threads::RWLock::WriterLock lm (master_lock);
+
+		if (!_masters.empty()) {
+			recompute_masters_ratios (val);
+		}
+	}
+
+	/* this sets the Evoral::Control::_user_value for us, which will
+	   be retrieved by AutomationControl::get_value ()
+	*/
+	AutomationControl::actually_set_value (val, group_override);
+
+	_session.set_dirty ();
+}
+
+void
+SlavableAutomationControl::add_master (boost::shared_ptr<AutomationControl> m)
+{
+	std::pair<Masters::iterator,bool> res;
+
+	{
+		Glib::Threads::RWLock::WriterLock lm (master_lock);
+		const double current_value = get_value_locked ();
+
+		/* ratio will be recomputed below */
+
+		pair<PBD::ID,MasterRecord> newpair (m->id(), MasterRecord (m, 1.0));
+		res = _masters.insert (newpair);
+
+		if (res.second) {
+
+			recompute_masters_ratios (current_value);
+
+			/* note that we bind @param m as a weak_ptr<AutomationControl>, thus
+			   avoiding holding a reference to the control in the binding
+			   itself.
+			*/
+
+			m->DropReferences.connect_same_thread (masters_connections, boost::bind (&SlavableAutomationControl::master_going_away, this, boost::weak_ptr<AutomationControl>(m)));
+
+			/* Store the connection inside the MasterRecord, so
+			   that when we destroy it, the connection is destroyed
+			   and we no longer hear about changes to the
+			   AutomationControl. 
+
+			   Note that this also makes it safe to store a
+			   boost::shared_ptr<AutomationControl> in the functor,
+			   since we know we will destroy the functor when the 
+			   connection is destroyed, which happens when we
+			   disconnect from the master (for any reason).
+
+			   Note that we fix the "from_self" argument that will
+			   be given to our own Changed signal to "false",
+			   because the change came from the master.
+			*/
+
+			m->Changed.connect_same_thread (res.first->second.connection, boost::bind (&SlavableAutomationControl::master_changed, this, _1, _2, m));
+			cerr << this << enum_2_string ((AutomationType) _parameter.type()) << " now listening to Changed from " << m << endl;
+		}
+	}
+
+	if (res.second) {
+		/* this will notify everyone that we're now slaved to the master */
+		MasterStatusChange (); /* EMIT SIGNAL */
+	}
+
+	post_add_master (m);
+
+	update_boolean_masters_records (m);
+}
+
+int32_t
+SlavableAutomationControl::get_boolean_masters () const
+{
+	int32_t n = 0;
+
+	if (_desc.toggled) {
+		Glib::Threads::RWLock::ReaderLock lm (master_lock);
+		for (Masters::const_iterator mr = _masters.begin(); mr != _masters.end(); ++mr) {
+			if (mr->second.yn()) {
+				++n;
+			}
+		}
+	}
+
+	return n;
+}
+
+void
+SlavableAutomationControl::update_boolean_masters_records (boost::shared_ptr<AutomationControl> m)
+{
+	if (_desc.toggled) {
+		/* We may modify a MasterRecord, but we not modify the master
+		 * map, so we use a ReaderLock
+		 */
+		Glib::Threads::RWLock::ReaderLock lm (master_lock);
+		Masters::iterator mi = _masters.find (m->id());
+		if (mi != _masters.end()) {
+			/* update MasterRecord to show whether the master is
+			   on/off. We need to store this because the master
+			   may change (in the sense of emitting Changed())
+			   several times without actually changing the result
+			   of ::get_value(). This is a feature of
+			   AutomationControls (or even just Controllables,
+			   really) which have more than a simple scalar
+			   value. For example, the master may be a mute control
+			   which can be muted_by_self() and/or
+			   muted_by_masters(). When either of those two
+			   conditions changes, Changed() will be emitted, even
+			   though ::get_value() will return the same value each
+			   time (1.0 if either are true, 0.0 if neither is).
+
+			   This provides a way for derived types to check
+			   the last known state of a Master when the Master
+			   changes. We update it after calling
+			   ::master_changed() (though derived types must do
+			   this themselves).
+			*/
+			mi->second.set_yn (m->get_value());
+		}
+	}
+}
+
+void
+SlavableAutomationControl::master_changed (bool /*from_self*/, GroupControlDisposition gcd, boost::shared_ptr<AutomationControl> m)
+{
+	update_boolean_masters_records (m);
+	Changed (false, Controllable::NoGroup); /* EMIT SIGNAL */
+}
+
+void
+SlavableAutomationControl::master_going_away (boost::weak_ptr<AutomationControl> wm)
+{
+	boost::shared_ptr<AutomationControl> m = wm.lock();
+	if (m) {
+		remove_master (m);
+	}
+}
+
+void
+SlavableAutomationControl::remove_master (boost::shared_ptr<AutomationControl> m)
+{
+	double current_value;
+	double new_value;
+	bool masters_left;
+	Masters::size_type erased = 0;
+
+	pre_remove_master (m);
+
+	{
+		Glib::Threads::RWLock::WriterLock lm (master_lock);
+		current_value = get_value_locked ();
+		erased = _masters.erase (m->id());
+		if (erased && !_session.deletion_in_progress()) {
+			recompute_masters_ratios (current_value);
+		}
+		masters_left = _masters.size ();
+		new_value = get_value_locked ();
+	}
+
+	if (_session.deletion_in_progress()) {
+		/* no reason to care about new values or sending signals */
+		return;
+	}
+
+	if (erased) {
+		MasterStatusChange (); /* EMIT SIGNAL */
+	}
+
+	if (new_value != current_value) {
+		if (masters_left == 0) {
+			/* no masters left, make sure we keep the same value
+			   that we had before.
+			*/
+			actually_set_value (current_value, Controllable::UseGroup);
+		}
+	}
+
+	/* no need to update boolean masters records, since the MR will have
+	 * been removed already.
+	 */
+}
+
+void
+SlavableAutomationControl::clear_masters ()
+{
+	double current_value;
+	double new_value;
+	bool had_masters = false;
+
+	/* null ptr means "all masters */
+	pre_remove_master (boost::shared_ptr<AutomationControl>());
+
+	{
+		Glib::Threads::RWLock::WriterLock lm (master_lock);
+		current_value = get_value_locked ();
+		if (!_masters.empty()) {
+			had_masters = true;
+		}
+		_masters.clear ();
+		new_value = get_value_locked ();
+	}
+
+	if (had_masters) {
+		MasterStatusChange (); /* EMIT SIGNAL */
+	}
+
+	if (new_value != current_value) {
+		actually_set_value (current_value, Controllable::UseGroup);
+	}
+
+	/* no need to update boolean masters records, since all MRs will have
+	 * been removed already.
+	 */
+}
+
+bool
+SlavableAutomationControl::slaved_to (boost::shared_ptr<AutomationControl> m) const
+{
+	Glib::Threads::RWLock::ReaderLock lm (master_lock);
+	return _masters.find (m->id()) != _masters.end();
+}
+
+bool
+SlavableAutomationControl::slaved () const
+{
+	Glib::Threads::RWLock::ReaderLock lm (master_lock);
+	return !_masters.empty();
+}
+
+#endif /* __libardour_slavable_automation_control_h__ */
diff --git a/libs/ardour/smf_source.cc b/libs/ardour/smf_source.cc
index 9d332b5..2aae26d 100644
--- a/libs/ardour/smf_source.cc
+++ b/libs/ardour/smf_source.cc
@@ -46,7 +46,7 @@
 #include "ardour/session.h"
 #include "ardour/smf_source.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 using namespace Glib;
diff --git a/libs/ardour/sndfile_helpers.cc b/libs/ardour/sndfile_helpers.cc
index 1b69ca2..3bd5473 100644
--- a/libs/ardour/sndfile_helpers.cc
+++ b/libs/ardour/sndfile_helpers.cc
@@ -25,7 +25,7 @@
 #include <sndfile.h>
 #include "ardour/sndfile_helpers.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using std::map;
 using namespace std;
diff --git a/libs/ardour/sndfilesource.cc b/libs/ardour/sndfilesource.cc
index 73361c3..4522e8a 100644
--- a/libs/ardour/sndfilesource.cc
+++ b/libs/ardour/sndfilesource.cc
@@ -41,7 +41,7 @@
 #include "ardour/utils.h"
 #include "ardour/session.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
diff --git a/libs/ardour/solo_control.cc b/libs/ardour/solo_control.cc
new file mode 100644
index 0000000..c31644b
--- /dev/null
+++ b/libs/ardour/solo_control.cc
@@ -0,0 +1,343 @@
+/*
+    Copyright (C) 2016 Paul Davis
+
+    This program is free software; you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by the Free
+    Software Foundation; either version 2 of the License, or (at your option)
+    any later version.
+
+    This program is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc.,
+    675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#include "ardour/debug.h"
+#include "ardour/mute_master.h"
+#include "ardour/session.h"
+#include "ardour/solo_control.h"
+
+#include "pbd/i18n.h"
+
+using namespace ARDOUR;
+using namespace std;
+using namespace PBD;
+
+SoloControl::SoloControl (Session& session, std::string const & name, Soloable& s, Muteable& m)
+	: SlavableAutomationControl (session, SoloAutomation, ParameterDescriptor (SoloAutomation),
+	                             boost::shared_ptr<AutomationList>(new AutomationList(Evoral::Parameter(SoloAutomation))),
+	                             name)
+	, _soloable (s)
+	, _muteable (m)
+	, _self_solo (false)
+	, _soloed_by_others_upstream (0)
+	, _soloed_by_others_downstream (0)
+	, _transition_into_solo (false)
+{
+	_list->set_interpolation (Evoral::ControlList::Discrete);
+	/* solo changes must be synchronized by the process cycle */
+	set_flags (Controllable::Flag (flags() | Controllable::RealTime));
+}
+
+void
+SoloControl::set_self_solo (bool yn)
+{
+	DEBUG_TRACE (DEBUG::Solo, string_compose ("%1: set SELF solo => %2\n", name(), yn));
+	_self_solo = yn;
+	set_mute_master_solo ();
+
+	_transition_into_solo = 0;
+
+	if (yn) {
+		if (get_masters_value() == 0) {
+			_transition_into_solo = 1;
+		}
+	} else {
+		if (get_masters_value() == 0) {
+			_transition_into_solo = -1;
+		}
+	}
+}
+
+void
+SoloControl::set_mute_master_solo ()
+{
+	_muteable.mute_master()->set_soloed_by_self (self_soloed() || get_masters_value());
+
+	if (Config->get_solo_control_is_listen_control()) {
+		_muteable.mute_master()->set_soloed_by_others (false);
+	} else {
+		_muteable.mute_master()->set_soloed_by_others (soloed_by_others_downstream() || soloed_by_others_upstream() || get_masters_value());
+	}
+}
+
+void
+SoloControl::mod_solo_by_others_downstream (int32_t delta)
+{
+	if (_soloable.is_safe() || !_soloable.can_solo()) {
+		return;
+	}
+
+	DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 mod solo-by-downstream by %2, current up = %3 down = %4\n",
+						  name(), delta, _soloed_by_others_upstream, _soloed_by_others_downstream));
+
+	if (delta < 0) {
+		if (_soloed_by_others_downstream >= (uint32_t) abs (delta)) {
+			_soloed_by_others_downstream += delta;
+		} else {
+			_soloed_by_others_downstream = 0;
+		}
+	} else {
+		_soloed_by_others_downstream += delta;
+	}
+
+	DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 SbD delta %2 = %3\n", name(), delta, _soloed_by_others_downstream));
+
+	set_mute_master_solo ();
+	_transition_into_solo = 0;
+	Changed (false, Controllable::UseGroup); /* EMIT SIGNAL */
+}
+
+void
+SoloControl::mod_solo_by_others_upstream (int32_t delta)
+{
+	if (_soloable.is_safe() || !_soloable.can_solo()) {
+		return;
+	}
+
+	DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 mod solo-by-upstream by %2, current up = %3 down = %4\n",
+	                                          name(), delta, _soloed_by_others_upstream, _soloed_by_others_downstream));
+
+	uint32_t old_sbu = _soloed_by_others_upstream;
+
+	if (delta < 0) {
+		if (_soloed_by_others_upstream >= (uint32_t) abs (delta)) {
+			_soloed_by_others_upstream += delta;
+		} else {
+			_soloed_by_others_upstream = 0;
+		}
+	} else {
+		_soloed_by_others_upstream += delta;
+	}
+
+	DEBUG_TRACE (DEBUG::Solo, string_compose (
+		             "%1 SbU delta %2 = %3 old = %4 sbd %5 ss %6 exclusive %7\n",
+		             name(), delta, _soloed_by_others_upstream, old_sbu,
+		             _soloed_by_others_downstream, _self_solo, Config->get_exclusive_solo()));
+
+
+	/* push the inverse solo change to everything that feeds us.
+
+	   This is important for solo-within-group. When we solo 1 track out of N that
+	   feed a bus, that track will cause mod_solo_by_upstream (+1) to be called
+	   on the bus. The bus then needs to call mod_solo_by_downstream (-1) on all
+	   tracks that feed it. This will silence them if they were audible because
+	   of a bus solo, but the newly soloed track will still be audible (because
+	   it is self-soloed).
+
+	   but .. do this only when we are being told to solo-by-upstream (i.e delta = +1),
+		   not in reverse.
+	*/
+
+	if ((_self_solo || _soloed_by_others_downstream) &&
+	    ((old_sbu == 0 && _soloed_by_others_upstream > 0) ||
+	     (old_sbu > 0 && _soloed_by_others_upstream == 0))) {
+
+		if (delta > 0 || !Config->get_exclusive_solo()) {
+			_soloable.push_solo_upstream (delta);
+		}
+	}
+
+	set_mute_master_solo ();
+	_transition_into_solo = 0;
+	Changed (false, Controllable::NoGroup); /* EMIT SIGNAL */
+}
+
+void
+SoloControl::actually_set_value (double val, PBD::Controllable::GroupControlDisposition group_override)
+{
+	if (_soloable.is_safe() || !_soloable.can_solo()) {
+		return;
+	}
+
+	set_self_solo (val == 1.0);
+
+	/* this sets the Evoral::Control::_user_value for us, which will
+	   be retrieved by AutomationControl::get_value (), and emits Changed
+	*/
+
+	SlavableAutomationControl::actually_set_value (val, group_override);
+}
+
+double
+SoloControl::get_value () const
+{
+	if (slaved()) {
+		return self_soloed() || get_masters_value ();
+	}
+
+	if (_list && boost::dynamic_pointer_cast<AutomationList>(_list)->automation_playback()) {
+		// Playing back automation, get the value from the list
+		return AutomationControl::get_value();
+	}
+
+	return soloed();
+}
+
+void
+SoloControl::clear_all_solo_state ()
+{
+	// ideally this function will never do anything, it only exists to forestall Murphy
+
+#ifndef NDEBUG
+	// these are really debug messages, but of possible interest.
+	if (self_soloed()) {
+		PBD::info << string_compose (_("Cleared Explicit solo: %1\n"), name());
+	}
+	if (_soloed_by_others_upstream || _soloed_by_others_downstream) {
+		PBD::info << string_compose (_("Cleared Implicit solo: %1 up:%2 down:%3\n"),
+				name(), _soloed_by_others_upstream, _soloed_by_others_downstream);
+	}
+#endif
+
+	_soloed_by_others_upstream = 0;
+	_soloed_by_others_downstream = 0;
+
+	set_self_solo (false);
+	_transition_into_solo = 0; /* Session does not need to propagate */
+	Changed (false, Controllable::UseGroup); /* EMIT SIGNAL */
+}
+
+int
+SoloControl::set_state (XMLNode const & node, int)
+{
+	XMLProperty const * prop;
+
+	if ((prop = node.property ("self-solo")) != 0) {
+		set_self_solo (string_is_affirmative (prop->value()));
+	}
+
+	if ((prop = node.property ("soloed-by-upstream")) != 0) {
+		_soloed_by_others_upstream = 0; // needed for mod_.... () to work
+		mod_solo_by_others_upstream (atoi (prop->value()));
+	}
+
+	if ((prop = node.property ("soloed-by-downstream")) != 0) {
+		_soloed_by_others_downstream = 0; // needed for mod_.... () to work
+		mod_solo_by_others_downstream (atoi (prop->value()));
+	}
+
+	return 0;
+}
+
+XMLNode&
+SoloControl::get_state ()
+{
+	XMLNode& node (SlavableAutomationControl::get_state());
+
+	node.add_property (X_("self-solo"), _self_solo ? X_("yes") : X_("no"));
+	char buf[32];
+	snprintf (buf, sizeof(buf), "%d",  _soloed_by_others_upstream);
+	node.add_property (X_("soloed-by-upstream"), buf);
+	snprintf (buf, sizeof(buf), "%d",  _soloed_by_others_downstream);
+	node.add_property (X_("soloed-by-downstream"), buf);
+
+	return node;
+}
+
+void
+SoloControl::master_changed (bool /*from self*/, GroupControlDisposition, boost::shared_ptr<AutomationControl> m)
+{
+	bool send_signal = false;
+
+	_transition_into_solo = 0;
+
+	/* Notice that we call get_boolean_masters() BEFORE we call
+	 * update_boolean_masters_records(), in order to know what
+	 * our master state was BEFORE it gets changed.
+	 */
+
+
+	if (m->get_value()) {
+		/* this master is now enabled */
+		if (!self_soloed() && get_boolean_masters() == 0) {
+			/* not self-soloed, wasn't soloed by masters before */
+			send_signal = true;
+			_transition_into_solo = 1;
+		}
+	} else {
+		if (!self_soloed() && get_boolean_masters() == 1) {
+			/* not self-soloed, soloed by just 1 master before */
+			_transition_into_solo = -1;
+			send_signal = true;
+		}
+	}
+
+	update_boolean_masters_records (m);
+
+	if (send_signal) {
+		set_mute_master_solo ();
+		Changed (false, Controllable::UseGroup);
+	}
+
+}
+
+void
+SoloControl::post_add_master (boost::shared_ptr<AutomationControl> m)
+{
+	if (m->get_value()) {
+
+		/* boolean masters records are not updated until AFTER
+		 * ::post_add_master() is called, so we can use them to check
+		 * on whether any master was already enabled before the new
+		 * one was added.
+		 */
+
+		if (!self_soloed() && !get_boolean_masters()) {
+			_transition_into_solo = 1;
+			Changed (false, Controllable::NoGroup);
+		}
+	}
+}
+
+void
+SoloControl::pre_remove_master (boost::shared_ptr<AutomationControl> m)
+{
+	if (!m) {
+		/* null control ptr means we're removing all masters. Nothing
+		 * to do. Changed will be emitted in
+		 * SlavableAutomationControl::clear_masters()
+		 */
+		return;
+	}
+
+	if (m->get_value()) {
+		if (!self_soloed() && (get_boolean_masters() == 1)) {
+			/* we're not self-soloed, this master is, and we're
+			   removing
+			   it. SlavableAutomationControl::remove_master() will
+			   ensure that we reset our own value after actually
+			   removing the master, so that our state does not
+			   change (this is a precondition of the
+			   SlavableAutomationControl API). This will emit
+			   Changed(), and we need to make sure that any
+			   listener knows that there has been no transition.
+			*/
+			_transition_into_solo = 0;
+		} else {
+			_transition_into_solo = 1;
+		}
+	} else {
+		_transition_into_solo = 0;
+	}
+}
+
+bool
+SoloControl::can_solo () const
+{
+	return _soloable.can_solo ();
+}
diff --git a/libs/ardour/solo_isolate_control.cc b/libs/ardour/solo_isolate_control.cc
new file mode 100644
index 0000000..3be57dc
--- /dev/null
+++ b/libs/ardour/solo_isolate_control.cc
@@ -0,0 +1,174 @@
+/*
+    Copyright (C) 2016 Paul Davis
+
+    This program is free software; you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by the Free
+    Software Foundation; either version 2 of the License, or (at your option)
+    any later version.
+
+    This program is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc.,
+    675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#include "ardour/debug.h"
+#include "ardour/mute_master.h"
+#include "ardour/session.h"
+#include "ardour/solo_isolate_control.h"
+
+#include "pbd/i18n.h"
+
+using namespace ARDOUR;
+using namespace std;
+using namespace PBD;
+
+SoloIsolateControl::SoloIsolateControl (Session& session, std::string const & name, Soloable& s, Muteable& m)
+	: SlavableAutomationControl (session, SoloIsolateAutomation, ParameterDescriptor (SoloIsolateAutomation),
+	                             boost::shared_ptr<AutomationList>(new AutomationList(Evoral::Parameter(SoloIsolateAutomation))),
+	                             name)
+	, _soloable (s)
+	, _muteable (m)
+	, _solo_isolated (false)
+	, _solo_isolated_by_upstream (0)
+{
+	_list->set_interpolation (Evoral::ControlList::Discrete);
+	/* isolate changes must be synchronized by the process cycle */
+	set_flags (Controllable::Flag (flags() | Controllable::RealTime));
+}
+
+void
+SoloIsolateControl::master_changed (bool from_self, PBD::Controllable::GroupControlDisposition gcd, boost::shared_ptr<AutomationControl>)
+{
+	if (!_soloable.can_solo()) {
+		return;
+	}
+
+	bool master_soloed;
+
+	{
+		Glib::Threads::RWLock::ReaderLock lm (master_lock);
+		master_soloed = (bool) get_masters_value_locked ();
+	}
+
+	/* Master is considered equivalent to an upstream solo control, not
+	 * direct control over self-soloed.
+	 */
+
+	mod_solo_isolated_by_upstream (master_soloed ? 1 : -1);
+
+	/* no need to call AutomationControl::master_changed() since it just
+	   emits Changed() which we already did in mod_solo_by_others_upstream()
+	*/
+}
+
+void
+SoloIsolateControl::mod_solo_isolated_by_upstream (int32_t delta)
+{
+	bool old = solo_isolated ();
+	DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 mod_solo_isolated_by_upstream cur: %2 d: %3\n",
+	                                          name(), _solo_isolated_by_upstream, delta));
+
+	if (delta < 0) {
+		if (_solo_isolated_by_upstream >= (uint32_t) abs(delta)) {
+			_solo_isolated_by_upstream += delta;
+		} else {
+			_solo_isolated_by_upstream = 0;
+		}
+	} else {
+		_solo_isolated_by_upstream += delta;
+	}
+
+	if (solo_isolated() != old) {
+		Changed (false, Controllable::NoGroup); /* EMIT SIGNAL */
+	}
+}
+
+void
+SoloIsolateControl::actually_set_value (double val, PBD::Controllable::GroupControlDisposition gcd)
+{
+	if (!_soloable.can_solo()) {
+		return;
+	}
+
+	set_solo_isolated (val, gcd);
+
+	/* this sets the Evoral::Control::_user_value for us, which will
+	   be retrieved by AutomationControl::get_value (), and emits Changed
+	*/
+
+	AutomationControl::actually_set_value (val, gcd);
+	_session.set_dirty ();
+}
+
+void
+SoloIsolateControl::set_solo_isolated (bool yn, Controllable::GroupControlDisposition group_override)
+{
+	if (!_soloable.can_solo()) {
+		return;
+	}
+
+	bool changed = false;
+
+	if (yn) {
+		if (_solo_isolated == false) {
+			changed = true;
+		}
+		_solo_isolated = true;
+	} else {
+		if (_solo_isolated == true) {
+			_solo_isolated = false;
+			changed = true;
+		}
+	}
+
+	if (!changed) {
+		return;
+	}
+
+	_soloable.push_solo_isolate_upstream (yn ? 1 : -1);
+
+	/* XXX should we back-propagate as well? (April 2010: myself and chris goddard think not) */
+
+	Changed (true, group_override); /* EMIT SIGNAL */
+}
+
+
+double
+SoloIsolateControl::get_value () const
+{
+	if (slaved()) {
+		return solo_isolated() || get_masters_value ();
+	}
+
+	if (_list && boost::dynamic_pointer_cast<AutomationList>(_list)->automation_playback()) {
+		// Playing back automation, get the value from the list
+		return AutomationControl::get_value();
+	}
+
+	return solo_isolated ();
+}
+
+int
+SoloIsolateControl::set_state (XMLNode const & node, int)
+{
+	XMLProperty const * prop;
+
+	if ((prop = node.property ("solo-isolated")) != 0) {
+		_solo_isolated = string_is_affirmative (prop->value());
+	}
+
+	return 0;
+}
+
+XMLNode&
+SoloIsolateControl::get_state ()
+{
+	XMLNode& node (SlavableAutomationControl::get_state());
+	node.add_property (X_("solo-isolated"), _solo_isolated ? X_("yes") : X_("no"));
+	return node;
+}
diff --git a/libs/ardour/solo_safe_control.cc b/libs/ardour/solo_safe_control.cc
new file mode 100644
index 0000000..92c6c9e
--- /dev/null
+++ b/libs/ardour/solo_safe_control.cc
@@ -0,0 +1,86 @@
+/*
+    Copyright (C) 2016 Paul Davis
+
+    This program is free software; you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by the Free
+    Software Foundation; either version 2 of the License, or (at your option)
+    any later version.
+
+    This program is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc.,
+    675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#include "ardour/debug.h"
+#include "ardour/mute_master.h"
+#include "ardour/session.h"
+#include "ardour/solo_isolate_control.h"
+
+#include "pbd/i18n.h"
+
+using namespace ARDOUR;
+using namespace std;
+using namespace PBD;
+
+SoloSafeControl::SoloSafeControl (Session& session, std::string const & name)
+	: SlavableAutomationControl (session, SoloSafeAutomation, ParameterDescriptor (SoloSafeAutomation),
+	                             boost::shared_ptr<AutomationList>(new AutomationList(Evoral::Parameter(SoloSafeAutomation))),
+	                             name)
+	, _solo_safe (false)
+{
+	_list->set_interpolation(Evoral::ControlList::Discrete);
+}
+
+void
+SoloSafeControl::actually_set_value (double val, PBD::Controllable::GroupControlDisposition gcd)
+{
+	_solo_safe = (val ? true : false);
+
+	/* this sets the Evoral::Control::_user_value for us, which will
+	   be retrieved by AutomationControl::get_value (), and emits Changed
+	*/
+
+	AutomationControl::actually_set_value (val, gcd);
+	_session.set_dirty ();
+}
+
+double
+SoloSafeControl::get_value () const
+{
+	if (slaved()) {
+		Glib::Threads::RWLock::ReaderLock lm (master_lock);
+		return get_masters_value_locked () ? 1.0 : 0.0;
+	}
+
+	if (_list && boost::dynamic_pointer_cast<AutomationList>(_list)->automation_playback()) {
+		// Playing back automation, get the value from the list
+		return AutomationControl::get_value();
+	}
+
+	return _solo_safe ? 1.0 : 0.0;
+}
+
+int
+SoloSafeControl::set_state (XMLNode const & node, int)
+{
+	XMLProperty const * prop;
+
+	if ((prop = node.property ("solo-safe")) != 0) {
+		_solo_safe = string_is_affirmative (prop->value());
+	}
+
+	return 0;
+}
+
+XMLNode&
+SoloSafeControl::get_state ()
+{
+	XMLNode& node (SlavableAutomationControl::get_state());
+	node.add_property (X_("solo-safe"), _solo_safe ? X_("yes") : X_("no"));
+	return node;
+}
diff --git a/libs/ardour/soundcloud_upload.cc b/libs/ardour/soundcloud_upload.cc
index 68ab2fa..caef957 100644
--- a/libs/ardour/soundcloud_upload.cc
+++ b/libs/ardour/soundcloud_upload.cc
@@ -31,7 +31,7 @@
 #include <iostream>
 #include "pbd/gstdio_compat.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace PBD;
 
diff --git a/libs/ardour/source.cc b/libs/ardour/source.cc
index aaa50ff..f9772ec 100644
--- a/libs/ardour/source.cc
+++ b/libs/ardour/source.cc
@@ -40,7 +40,7 @@
 #include "ardour/source.h"
 #include "ardour/transient_detector.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
@@ -113,7 +113,7 @@ Source::get_state ()
 int
 Source::set_state (const XMLNode& node, int version)
 {
-	const XMLProperty* prop;
+	XMLProperty const * prop;
 
 	if ((prop = node.property ("name")) != 0) {
 		_name = prop->value();
diff --git a/libs/ardour/source_factory.cc b/libs/ardour/source_factory.cc
index 7697535..834014b 100644
--- a/libs/ardour/source_factory.cc
+++ b/libs/ardour/source_factory.cc
@@ -22,7 +22,6 @@
 #include "libardour-config.h"
 #endif
 
-#include "pbd/boost_debug.h"
 #include "pbd/error.h"
 #include "pbd/convert.h"
 #include "pbd/pthread_utils.h"
@@ -30,6 +29,7 @@
 
 #include "ardour/audioplaylist.h"
 #include "ardour/audio_playlist_source.h"
+#include "ardour/boost_debug.h"
 #include "ardour/midi_playlist.h"
 #include "ardour/midi_playlist_source.h"
 #include "ardour/source.h"
@@ -44,7 +44,7 @@
 #endif
 
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 using namespace std;
@@ -150,7 +150,7 @@ boost::shared_ptr<Source>
 SourceFactory::create (Session& s, const XMLNode& node, bool defer_peaks)
 {
 	DataType type = DataType::AUDIO;
-	const XMLProperty* prop = node.property("type");
+	XMLProperty const * prop = node.property("type");
 
 	if (prop) {
 		type = DataType (prop->value());
diff --git a/libs/ardour/speakers.cc b/libs/ardour/speakers.cc
index 7c7b02f..624ad5c 100644
--- a/libs/ardour/speakers.cc
+++ b/libs/ardour/speakers.cc
@@ -23,7 +23,7 @@
 #include "ardour/speaker.h"
 #include "ardour/speakers.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 using namespace PBD;
@@ -245,7 +245,7 @@ Speakers::get_state ()
 {
         XMLNode* node = new XMLNode (X_("Speakers"));
         char buf[32];
-        LocaleGuard lg (X_("C"));
+        LocaleGuard lg;
 
         for (vector<Speaker>::const_iterator i = _speakers.begin(); i != _speakers.end(); ++i) {
                 XMLNode* speaker = new XMLNode (X_("Speaker"));
@@ -267,9 +267,9 @@ int
 Speakers::set_state (const XMLNode& node, int /*version*/)
 {
         XMLNodeConstIterator i;
-        const XMLProperty* prop;
+        XMLProperty const * prop;
         double a, e, d;
-        LocaleGuard lg (X_("C"));
+        LocaleGuard lg;
         int n = 0;
 
         _speakers.clear ();
diff --git a/libs/ardour/srcfilesource.cc b/libs/ardour/srcfilesource.cc
index b9421d2..98389bf 100644
--- a/libs/ardour/srcfilesource.cc
+++ b/libs/ardour/srcfilesource.cc
@@ -25,7 +25,7 @@
 #include "ardour/debug.h"
 #include "ardour/srcfilesource.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 using namespace PBD;
diff --git a/libs/ardour/st_pitch.cc b/libs/ardour/st_pitch.cc
index 8e65ea2..752fdd8 100644
--- a/libs/ardour/st_pitch.cc
+++ b/libs/ardour/st_pitch.cc
@@ -28,7 +28,7 @@
 #include "ardour/session.h"
 #include "ardour/audioregion.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
diff --git a/libs/ardour/st_stretch.cc b/libs/ardour/st_stretch.cc
index b031ee2..d12ceed 100644
--- a/libs/ardour/st_stretch.cc
+++ b/libs/ardour/st_stretch.cc
@@ -28,7 +28,7 @@
 #include "ardour/session.h"
 #include "ardour/audioregion.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
diff --git a/libs/ardour/stripable.cc b/libs/ardour/stripable.cc
new file mode 100644
index 0000000..84d2baf
--- /dev/null
+++ b/libs/ardour/stripable.cc
@@ -0,0 +1,108 @@
+/*
+    Copyright (C) 2016 Paul Davis
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#include <boost/algorithm/string.hpp>
+
+#include "pbd/compose.h"
+#include "pbd/convert.h"
+
+#include "ardour/debug.h"
+#include "ardour/rc_configuration.h"
+#include "ardour/stripable.h"
+
+#include "pbd/i18n.h"
+
+using namespace ARDOUR;
+using namespace PBD;
+using std::string;
+
+Stripable::Stripable (Session& s, string const & name, PresentationInfo const & pi)
+	: SessionObject (s, name)
+	, _presentation_info (pi)
+{
+}
+
+void
+Stripable::set_presentation_order (PresentationInfo::order_t order, bool notify_class_listeners)
+{
+	_presentation_info.set_order (order);
+
+	if (notify_class_listeners) {
+		PresentationInfo::Change ();
+	}
+}
+
+int
+Stripable::set_state (XMLNode const& node, int version)
+{
+	const XMLProperty *prop;
+	XMLNodeList const & nlist (node.children());
+	XMLNodeConstIterator niter;
+	XMLNode *child;
+
+	if (version > 3001) {
+
+		for (niter = nlist.begin(); niter != nlist.end(); ++niter){
+			child = *niter;
+
+			if (child->name() == PresentationInfo::state_node_name) {
+				_presentation_info.set_state (*child, version);
+			}
+		}
+
+	} else {
+
+		/* Older versions of Ardour stored "_flags" as a property of the Route
+		 * node, only for 3 special Routes (MasterOut, MonitorOut, Auditioner.
+		 *
+		 * Their presentation order was stored in a node called "RemoteControl"
+		 *
+		 * This information is now part of the PresentationInfo of every Stripable.
+		 */
+
+		if ((prop = node.property (X_("flags"))) != 0) {
+
+			/* 4.x and earlier - didn't have Stripable but the
+			 * relevant enums have the same names (MasterOut,
+			 * MonitorOut, Auditioner), so we can use string_2_enum
+			 */
+
+			PresentationInfo::Flag flags;
+
+			if (version < 3000) {
+				string f (prop->value());
+				boost::replace_all (f, "ControlOut", "MonitorOut");
+				flags = PresentationInfo::Flag (string_2_enum (f, flags));
+			} else {
+				flags = PresentationInfo::Flag (string_2_enum (prop->value(), flags));
+			}
+
+			_presentation_info.set_flags (flags);
+
+		}
+
+		if (!_presentation_info.special()) {
+			if ((prop = node.property (X_("order-key"))) != 0) {
+				_presentation_info.set_order (atol (prop->value()));
+			}
+		}
+	}
+
+	return 0;
+}
diff --git a/libs/ardour/tape_file_matcher.cc b/libs/ardour/tape_file_matcher.cc
index 0f8594d..0be884c 100644
--- a/libs/ardour/tape_file_matcher.cc
+++ b/libs/ardour/tape_file_matcher.cc
@@ -20,7 +20,7 @@
 
 #include "ardour/tape_file_matcher.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 
diff --git a/libs/ardour/tempo.cc b/libs/ardour/tempo.cc
index b3207e1..11da2fc 100644
--- a/libs/ardour/tempo.cc
+++ b/libs/ardour/tempo.cc
@@ -24,13 +24,16 @@
 #include <unistd.h>
 
 #include <glibmm/threads.h>
+
+#include "pbd/enumwriter.h"
 #include "pbd/xml++.h"
-#include "evoral/types.hpp"
+#include "evoral/Beats.hpp"
+
 #include "ardour/debug.h"
 #include "ardour/lmath.h"
 #include "ardour/tempo.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 #include <locale.h>
 
 using namespace std;
@@ -70,26 +73,47 @@ Meter::frames_per_bar (const Tempo& tempo, framecnt_t sr) const
 const string TempoSection::xml_state_node_name = "Tempo";
 
 TempoSection::TempoSection (const XMLNode& node)
-	: MetricSection (BBT_Time()), Tempo (TempoMap::default_tempo())
+	: MetricSection (0.0, 0, MusicTime, true)
+	, Tempo (TempoMap::default_tempo())
+	, _c_func (0.0)
+	, _active (true)
+	, _locked_to_meter (false)
 {
-	const XMLProperty *prop;
-	BBT_Time start;
-	LocaleGuard lg (X_("C"));
+	XMLProperty const * prop;
+	LocaleGuard lg;
+	BBT_Time bbt;
+	double pulse;
+	uint32_t frame;
 
-	if ((prop = node.property ("start")) == 0) {
-		error << _("TempoSection XML node has no \"start\" property") << endmsg;
-		throw failed_constructor();
+	_legacy_bbt = BBT_Time (0, 0, 0);
+
+	if ((prop = node.property ("start")) != 0) {
+		if (sscanf (prop->value().c_str(), "%" PRIu32 "|%" PRIu32 "|%" PRIu32,
+			    &bbt.bars,
+			    &bbt.beats,
+			    &bbt.ticks) == 3) {
+			/* legacy session - start used to be in bbt*/
+			_legacy_bbt = bbt;
+			pulse = -1.0;
+			info << _("Legacy session detected. TempoSection XML node will be altered.") << endmsg;
+		}
 	}
 
-	if (sscanf (prop->value().c_str(), "%" PRIu32 "|%" PRIu32 "|%" PRIu32,
-		    &start.bars,
-		    &start.beats,
-		    &start.ticks) < 3) {
-		error << _("TempoSection XML node has an illegal \"start\" value") << endmsg;
-		throw failed_constructor();
+	if ((prop = node.property ("pulse")) != 0) {
+		if (sscanf (prop->value().c_str(), "%lf", &pulse) != 1) {
+			error << _("TempoSection XML node has an illegal \"pulse\" value") << endmsg;
+		}
 	}
 
-	set_start (start);
+	set_pulse (pulse);
+
+	if ((prop = node.property ("frame")) != 0) {
+		if (sscanf (prop->value().c_str(), "%" PRIu32, &frame) != 1) {
+			error << _("TempoSection XML node has an illegal \"frame\" value") << endmsg;
+		} else {
+			set_frame (frame);
+		}
+	}
 
 	if ((prop = node.property ("beats-per-minute")) == 0) {
 		error << _("TempoSection XML node has no \"beats-per-minute\" property") << endmsg;
@@ -118,13 +142,33 @@ TempoSection::TempoSection (const XMLNode& node)
 
 	set_movable (string_is_affirmative (prop->value()));
 
-	if ((prop = node.property ("bar-offset")) == 0) {
-		_bar_offset = -1.0;
+	if ((prop = node.property ("active")) == 0) {
+		warning << _("TempoSection XML node has no \"active\" property") << endmsg;
+		set_active(true);
 	} else {
-		if (sscanf (prop->value().c_str(), "%lf", &_bar_offset) != 1 || _bar_offset < 0.0) {
-			error << _("TempoSection XML node has an illegal \"bar-offset\" value") << endmsg;
-			throw failed_constructor();
+		set_active (string_is_affirmative (prop->value()));
+	}
+
+	if ((prop = node.property ("tempo-type")) == 0) {
+		_type = Constant;
+	} else {
+		_type = Type (string_2_enum (prop->value(), _type));
+	}
+
+	if ((prop = node.property ("lock-style")) == 0) {
+		if (movable()) {
+			set_position_lock_style (MusicTime);
+		} else {
+			set_position_lock_style (AudioTime);
 		}
+	} else {
+		set_position_lock_style (PositionLockStyle (string_2_enum (prop->value(), position_lock_style())));
+	}
+
+	if ((prop = node.property ("locked-to-meter")) == 0) {
+		set_locked_to_meter (false);
+	} else {
+		set_locked_to_meter (string_is_affirmative (prop->value()));
 	}
 }
 
@@ -133,58 +177,275 @@ TempoSection::get_state() const
 {
 	XMLNode *root = new XMLNode (xml_state_node_name);
 	char buf[256];
-	LocaleGuard lg (X_("C"));
+	LocaleGuard lg;
 
-	snprintf (buf, sizeof (buf), "%" PRIu32 "|%" PRIu32 "|%" PRIu32,
-		  start().bars,
-		  start().beats,
-		  start().ticks);
-	root->add_property ("start", buf);
-	snprintf (buf, sizeof (buf), "%f", _beats_per_minute);
+	snprintf (buf, sizeof (buf), "%lf", pulse());
+	root->add_property ("pulse", buf);
+	snprintf (buf, sizeof (buf), "%li", frame());
+	root->add_property ("frame", buf);
+	snprintf (buf, sizeof (buf), "%lf", _beats_per_minute);
 	root->add_property ("beats-per-minute", buf);
-	snprintf (buf, sizeof (buf), "%f", _note_type);
+	snprintf (buf, sizeof (buf), "%lf", _note_type);
 	root->add_property ("note-type", buf);
-	// snprintf (buf, sizeof (buf), "%f", _bar_offset);
-	// root->add_property ("bar-offset", buf);
 	snprintf (buf, sizeof (buf), "%s", movable()?"yes":"no");
 	root->add_property ("movable", buf);
+	snprintf (buf, sizeof (buf), "%s", active()?"yes":"no");
+	root->add_property ("active", buf);
+	root->add_property ("tempo-type", enum_2_string (_type));
+	root->add_property ("lock-style", enum_2_string (position_lock_style()));
+	root->add_property ("locked-to-meter", locked_to_meter()?"yes":"no");
 
 	return *root;
 }
 
 void
+TempoSection::set_type (Type type)
+{
+	_type = type;
+}
 
-TempoSection::update_bar_offset_from_bbt (const Meter& m)
+/** returns the tempo in whole pulses per minute at the zero-based (relative to session) frame.
+*/
+double
+TempoSection::tempo_at_frame (const framepos_t& f, const framecnt_t& frame_rate) const
 {
-	_bar_offset = ((start().beats - 1) * BBT_Time::ticks_per_beat + start().ticks) /
-		(m.divisions_per_bar() * BBT_Time::ticks_per_beat);
 
-	DEBUG_TRACE (DEBUG::TempoMath, string_compose ("Tempo set bar offset to %1 from %2 w/%3\n", _bar_offset, start(), m.divisions_per_bar()));
+	if (_type == Constant || _c_func == 0.0) {
+		return pulses_per_minute();
+	}
+
+	return pulse_tempo_at_time (frame_to_minute (f - frame(), frame_rate));
 }
 
-void
-TempoSection::update_bbt_time_from_bar_offset (const Meter& meter)
+/** returns the zero-based frame (relative to session)
+   where the tempo in whole pulses per minute occurs in this section.
+   pulse p is only used for constant tempos.
+   note that the tempo map may have multiple such values.
+*/
+framepos_t
+TempoSection::frame_at_tempo (const double& ppm, const double& p, const framecnt_t& frame_rate) const
 {
-	BBT_Time new_start;
+	if (_type == Constant || _c_func == 0.0) {
+		return ((p - pulse()) * frames_per_pulse (frame_rate))  + frame();
+	}
 
-	if (_bar_offset < 0.0) {
-		/* not set yet */
-		return;
+	return minute_to_frame (time_at_pulse_tempo (ppm), frame_rate) + frame();
+}
+/** returns the tempo in pulses per minute at the zero-based (relative to session) beat.
+*/
+double
+TempoSection::tempo_at_pulse (const double& p) const
+{
+
+	if (_type == Constant || _c_func == 0.0) {
+		return pulses_per_minute();
+	}
+	double const ppm = pulse_tempo_at_pulse (p - pulse());
+	return ppm;
+}
+
+/** returns the zero-based beat (relative to session)
+   where the tempo in whole pulses per minute occurs given frame f. frame f is only used for constant tempos.
+   note that the session tempo map may have multiple beats at a given tempo.
+*/
+double
+TempoSection::pulse_at_tempo (const double& ppm, const framepos_t& f, const framecnt_t& frame_rate) const
+{
+	if (_type == Constant || _c_func == 0.0) {
+		double const pulses = ((f - frame()) / frames_per_pulse (frame_rate)) + pulse();
+		return  pulses;
+	}
+	return pulse_at_pulse_tempo (ppm) + pulse();
+}
+
+/** returns the zero-based pulse (relative to session origin)
+   where the zero-based frame (relative to session)
+   lies.
+*/
+double
+TempoSection::pulse_at_frame (const framepos_t& f, const framecnt_t& frame_rate) const
+{
+	if (_type == Constant || _c_func == 0.0) {
+		return ((f - frame()) / frames_per_pulse (frame_rate)) + pulse();
+	}
+
+	return pulse_at_time (frame_to_minute (f - frame(), frame_rate)) + pulse();
+}
+
+/** returns the zero-based frame (relative to session start frame)
+   where the zero-based pulse (relative to session start)
+   falls.
+*/
+
+framepos_t
+TempoSection::frame_at_pulse (const double& p, const framecnt_t& frame_rate) const
+{
+	if (_type == Constant || _c_func == 0.0) {
+		return (framepos_t) floor ((p - pulse()) * frames_per_pulse (frame_rate)) + frame();
 	}
 
-	new_start.bars = start().bars;
+	return minute_to_frame (time_at_pulse (p - pulse()), frame_rate) + frame();
+}
+
+/*
+Ramp Overview
+
+      |                     *
+Tempo |                   *
+Tt----|-----------------*|
+Ta----|--------------|*  |
+      |            * |   |
+      |         *    |   |
+      |     *        |   |
+T0----|*             |   |
+  *   |              |   |
+      _______________|___|____
+      time           a   t (next tempo)
+      [        c         ] defines c
+
+Duration in beats at time a is the integral of some Tempo function.
+In our case, the Tempo function (Tempo at time t) is
+T(t) = T0(e^(ct))
 
-	double ticks = BBT_Time::ticks_per_beat * meter.divisions_per_bar() * _bar_offset;
-	new_start.beats = (uint32_t) floor (ticks/BBT_Time::ticks_per_beat);
-	new_start.ticks = 0; /* (uint32_t) fmod (ticks, BBT_Time::ticks_per_beat); */
+with function constant
+c = log(Ta/T0)/a
+so
+a = log(Ta/T0)/c
 
-	/* remember the 1-based counting properties of beats */
-	new_start.beats += 1;
+The integral over t of our Tempo function (the beat function, which is the duration in beats at some time t) is:
+b(t) = T0(e^(ct) - 1) / c
 
-	DEBUG_TRACE (DEBUG::TempoMath, string_compose ("from bar offset %1 and dpb %2, ticks = %3->%4 beats = %5\n",
-						       _bar_offset, meter.divisions_per_bar(), ticks, new_start.ticks, new_start.beats));
+To find the time t at beat duration b, we use the inverse function of the beat function (the time function) which can be shown to be:
+t(b) = log((c.b / T0) + 1) / c
 
-	set_start (new_start);
+The time t at which Tempo T occurs is a as above:
+t(T) = log(T / T0) / c
+
+The beat at which a Tempo T occurs is:
+b(T) = (T - T0) / c
+
+The Tempo at which beat b occurs is:
+T(b) = b.c + T0
+
+We define c for this tempo ramp by placing a new tempo section at some time t after this one.
+Our problem is that we usually don't know t.
+We almost always know the duration in beats between this and the new section, so we need to find c in terms of the beat function.
+Where a = t (i.e. when a is equal to the time of the next tempo section), the beat function reveals:
+t = b log (Ta / T0) / (T0 (e^(log (Ta / T0)) - 1))
+
+By substituting our expanded t as a in the c function above, our problem is reduced to:
+c = T0 (e^(log (Ta / T0)) - 1) / b
+
+Of course the word 'beat' has been left loosely defined above.
+In music, a beat is defined by the musical pulse (which comes from the tempo)
+and the meter in use at a particular time (how many  pulse divisions there are in one bar).
+It would be more accurate to substitute the work 'pulse' for 'beat' above.
+
+Anyway ...
+
+We can now store c for future time calculations.
+If the following tempo section (the one that defines c in conjunction with this one)
+is changed or moved, c is no longer valid.
+
+The public methods are session-relative.
+
+Most of this stuff is taken from this paper:
+
+WHERE’S THE BEAT?
+TOOLS FOR DYNAMIC TEMPO CALCULATIONS
+Jan C. Schacher
+Martin Neukom
+Zurich University of Arts
+Institute for Computer Music and Sound Technology
+
+https://www.zhdk.ch/fileadmin/data_subsites/data_icst/Downloads/Timegrid/ICST_Tempopolyphony_ICMC07.pdf
+
+*/
+
+/*
+  compute this ramp's function constant using the end tempo (in whole pulses per minute)
+  and duration (pulses into global start) of some later tempo section.
+*/
+double
+TempoSection::compute_c_func_pulse (const double& end_bpm, const double& end_pulse, const framecnt_t& frame_rate)
+{
+	double const log_tempo_ratio = log (end_bpm / pulses_per_minute());
+	return pulses_per_minute() *  (expm1 (log_tempo_ratio)) / (end_pulse - pulse());
+}
+
+/* compute the function constant from some later tempo section, given tempo (whole pulses/min.) and distance (in frames) from session origin */
+double
+TempoSection::compute_c_func_frame (const double& end_bpm, const framepos_t& end_frame, const framecnt_t& frame_rate) const
+{
+	return c_func (end_bpm, frame_to_minute (end_frame - frame(), frame_rate));
+}
+
+framepos_t
+TempoSection::minute_to_frame (const double& time, const framecnt_t& frame_rate) const
+{
+	return (framepos_t) floor ((time * 60.0 * frame_rate) + 0.5);
+}
+
+double
+TempoSection::frame_to_minute (const framepos_t& frame, const framecnt_t& frame_rate) const
+{
+	return (frame / (double) frame_rate) / 60.0;
+}
+
+/* position function */
+double
+TempoSection::a_func (double end_ppm, double c_func) const
+{
+	return log (end_ppm / pulses_per_minute()) /  c_func;
+}
+
+/*function constant*/
+double
+TempoSection::c_func (double end_ppm, double end_time) const
+{
+	return log (end_ppm / pulses_per_minute()) /  end_time;
+}
+
+/* tempo in ppm at time in minutes */
+double
+TempoSection::pulse_tempo_at_time (const double& time) const
+{
+	return exp (_c_func * time) * pulses_per_minute();
+}
+
+/* time in minutes at tempo in ppm */
+double
+TempoSection::time_at_pulse_tempo (const double& pulse_tempo) const
+{
+	return log (pulse_tempo / pulses_per_minute()) / _c_func;
+}
+
+/* tick at tempo in ppm */
+double
+TempoSection::pulse_at_pulse_tempo (const double& pulse_tempo) const
+{
+	return (pulse_tempo - pulses_per_minute()) / _c_func;
+}
+
+/* tempo in ppm at tick */
+double
+TempoSection::pulse_tempo_at_pulse (const double& pulse) const
+{
+	return (pulse * _c_func) + pulses_per_minute();
+}
+
+/* pulse at time in minutes */
+double
+TempoSection::pulse_at_time (const double& time) const
+{
+	return expm1 (_c_func * time) * (pulses_per_minute() / _c_func);
+}
+
+/* time in minutes at pulse */
+double
+TempoSection::time_at_pulse (const double& pulse) const
+{
+	return log1p ((_c_func * pulse) / pulses_per_minute()) / _c_func;
 }
 
 /***********************************************************************/
@@ -192,26 +453,64 @@ TempoSection::update_bbt_time_from_bar_offset (const Meter& meter)
 const string MeterSection::xml_state_node_name = "Meter";
 
 MeterSection::MeterSection (const XMLNode& node)
-	: MetricSection (BBT_Time()), Meter (TempoMap::default_meter())
+	: MetricSection (0.0, 0, MusicTime, false), Meter (TempoMap::default_meter())
 {
-	const XMLProperty *prop;
-	BBT_Time start;
-	LocaleGuard lg (X_("C"));
+	XMLProperty const * prop;
+	LocaleGuard lg;
+	BBT_Time bbt;
+	double pulse = 0.0;
+	double beat = 0.0;
+	framepos_t frame = 0;
+	pair<double, BBT_Time> start;
+
+	if ((prop = node.property ("start")) != 0) {
+		if (sscanf (prop->value().c_str(), "%" PRIu32 "|%" PRIu32 "|%" PRIu32,
+		    &bbt.bars,
+		    &bbt.beats,
+		    &bbt.ticks) < 3) {
+			error << _("MeterSection XML node has an illegal \"start\" value") << endmsg;
+		} else {
+			/* legacy session - start used to be in bbt*/
+			info << _("Legacy session detected - MeterSection XML node will be altered.") << endmsg;
+			pulse = -1.0;
+		}
+	}
 
-	if ((prop = node.property ("start")) == 0) {
-		error << _("MeterSection XML node has no \"start\" property") << endmsg;
-		throw failed_constructor();
+	if ((prop = node.property ("pulse")) != 0) {
+		if (sscanf (prop->value().c_str(), "%lf", &pulse) != 1) {
+			error << _("MeterSection XML node has an illegal \"pulse\" value") << endmsg;
+		}
+	}
+	set_pulse (pulse);
+
+	if ((prop = node.property ("beat")) != 0) {
+		if (sscanf (prop->value().c_str(), "%lf", &beat) != 1) {
+			error << _("MeterSection XML node has an illegal \"beat\" value") << endmsg;
+		}
 	}
 
-	if (sscanf (prop->value().c_str(), "%" PRIu32 "|%" PRIu32 "|%" PRIu32,
-		    &start.bars,
-		    &start.beats,
-		    &start.ticks) < 3) {
-		error << _("MeterSection XML node has an illegal \"start\" value") << endmsg;
+	start.first = beat;
+
+	if ((prop = node.property ("bbt")) == 0) {
+		warning << _("MeterSection XML node has no \"bbt\" property") << endmsg;
+	} else if (sscanf (prop->value().c_str(), "%" PRIu32 "|%" PRIu32 "|%" PRIu32,
+		    &bbt.bars,
+		    &bbt.beats,
+		    &bbt.ticks) < 3) {
+		error << _("MeterSection XML node has an illegal \"bbt\" value") << endmsg;
 		throw failed_constructor();
 	}
 
-	set_start (start);
+	start.second = bbt;
+	set_beat (start);
+
+	if ((prop = node.property ("frame")) != 0) {
+		if (sscanf (prop->value().c_str(), "%li", &frame) != 1) {
+			error << _("MeterSection XML node has an illegal \"frame\" value") << endmsg;
+		} else {
+			set_frame (frame);
+		}
+	}
 
 	/* beats-per-bar is old; divisions-per-bar is new */
 
@@ -221,9 +520,8 @@ MeterSection::MeterSection (const XMLNode& node)
 			throw failed_constructor();
 		}
 	}
-
 	if (sscanf (prop->value().c_str(), "%lf", &_divisions_per_bar) != 1 || _divisions_per_bar < 0.0) {
-		error << _("MeterSection XML node has an illegal \"beats-per-bar\" or \"divisions-per-bar\" value") << endmsg;
+		error << _("MeterSection XML node has an illegal \"divisions-per-bar\" value") << endmsg;
 		throw failed_constructor();
 	}
 
@@ -231,7 +529,6 @@ MeterSection::MeterSection (const XMLNode& node)
 		error << _("MeterSection XML node has no \"note-type\" property") << endmsg;
 		throw failed_constructor();
 	}
-
 	if (sscanf (prop->value().c_str(), "%lf", &_note_type) != 1 || _note_type < 0.0) {
 		error << _("MeterSection XML node has an illegal \"note-type\" value") << endmsg;
 		throw failed_constructor();
@@ -243,6 +540,17 @@ MeterSection::MeterSection (const XMLNode& node)
 	}
 
 	set_movable (string_is_affirmative (prop->value()));
+
+	if ((prop = node.property ("lock-style")) == 0) {
+		warning << _("MeterSection XML node has no \"lock-style\" property") << endmsg;
+		if (movable()) {
+			set_position_lock_style (MusicTime);
+		} else {
+			set_position_lock_style (AudioTime);
+		}
+	} else {
+		set_position_lock_style (PositionLockStyle (string_2_enum (prop->value(), position_lock_style())));
+	}
 }
 
 XMLNode&
@@ -250,16 +558,23 @@ MeterSection::get_state() const
 {
 	XMLNode *root = new XMLNode (xml_state_node_name);
 	char buf[256];
-	LocaleGuard lg (X_("C"));
+	LocaleGuard lg;
 
+	snprintf (buf, sizeof (buf), "%lf", pulse());
+	root->add_property ("pulse", buf);
 	snprintf (buf, sizeof (buf), "%" PRIu32 "|%" PRIu32 "|%" PRIu32,
-		  start().bars,
-		  start().beats,
-		  start().ticks);
-	root->add_property ("start", buf);
-	snprintf (buf, sizeof (buf), "%f", _note_type);
+		  bbt().bars,
+		  bbt().beats,
+		  bbt().ticks);
+	root->add_property ("bbt", buf);
+	snprintf (buf, sizeof (buf), "%lf", beat());
+	root->add_property ("beat", buf);
+	snprintf (buf, sizeof (buf), "%lf", _note_type);
 	root->add_property ("note-type", buf);
-	snprintf (buf, sizeof (buf), "%f", _divisions_per_bar);
+	snprintf (buf, sizeof (buf), "%li", frame());
+	root->add_property ("frame", buf);
+	root->add_property ("lock-style", enum_2_string (position_lock_style()));
+	snprintf (buf, sizeof (buf), "%lf", _divisions_per_bar);
 	root->add_property ("divisions-per-bar", buf);
 	snprintf (buf, sizeof (buf), "%s", movable()?"yes":"no");
 	root->add_property ("movable", buf);
@@ -268,36 +583,132 @@ MeterSection::get_state() const
 }
 
 /***********************************************************************/
+/*
+  Tempo Map Overview
+
+  The Shaggs - Things I Wonder
+  https://www.youtube.com/watch?v=9wQK6zMJOoQ
+
+  Tempo is the rate of the musical pulse.
+  Meters divide the pulses into measures and beats.
+
+  TempoSections - provide pulses in the form of beats_per_minute() and note_type() where note_type is the division of a whole pulse,
+  and beats_per_minute is the number of note_types in one minute (unlike what its name suggests).
+  Note that Tempo::beats_per_minute() has nothing to do with musical beats. It has been left that way because
+  a shorter one hasn't been found yet (pulse_divisions_per_minute()?).
+
+  MeterSecions - divide pulses into measures (via divisions_per_bar) and beats (via note_divisor).
+
+  Both tempos and meters have a pulse position and a frame position.
+  Meters also have a beat position, which is always 0.0 for the first meter.
+  TempoSections and MeterSections may be locked to either audio or music (position lock style).
+  The lock style determines the 'true' position of the section wich is used to calculate the other postion parameters of the section.
+
+  The first tempo and first meter are special. they must move together, and must be locked to audio.
+  Audio locked tempos which lie before the first meter are made inactive.
+  They will be re-activated if the first meter is again placed before them.
+
+  With tepo sections potentially being ramped, meters provide a way of mapping beats to whole pulses without
+  referring to the tempo function(s) involved as the distance in whole pulses between a meter and a subsequent beat is
+  sb->beat() - meter->beat() / meter->note_divisor().
+  Because every meter falls on a known pulse, (derived from its bar), the rest is easy as the duration in pulses between
+  two meters is of course
+  (meater_b->bar - meter_a->bar) * meter_a->divisions_per_bar / meter_a->note_divisor.
+
+  Below, beat calculations are based on meter sections and all pulse and tempo calculations are based on tempo sections.
+  Beat to frame conversion of course requires the use of meter and tempo.
+
+  Remembering that ramped tempo sections interact, it is important to avoid referring to any other tempos when moving tempo sections,
+  Here, beats (meters) are used to determine the new pulse (see predict_tempo_position())
+
+  Recomputing the map is the process where the 'missing' position
+  (tempo pulse or meter pulse & beat in the case of AudioTime, frame for MusicTime) is calculated.
+  We construct the tempo map by first using the frame or pulse position (depending on position lock style) of each tempo.
+  We then use this tempo map (really just the tempos) to find the pulse or frame position of each meter (again depending on lock style).
+
+  Having done this, we can now find any musical duration by selecting the tempo and meter covering the position (or tempo) in question
+  and querying its appropriate meter/tempo.
+
+  It is important to keep the _metrics in an order that makes sense.
+  Because ramped MusicTime and AudioTime tempos can interact with each other,
+  reordering is frequent. Care must be taken to keep _metrics in a solved state.
+  Solved means ordered by frame or pulse with frame-accurate precision (see check_solved()).
+
+  Music and Audio
 
+  Music and audio-locked objects may seem interchangeable on the surface, but when translating
+  between audio samples and beats, keep in mind that a sample is only a quantised approximation
+  of the actual time (in minutes) of a beat.
+  Thus if a gui user points to the frame occupying the start of a music-locked object on 1|3|0, it does not
+  mean that this frame is the actual location in time of 1|3|0.
+
+  You cannot use a frame measurement to determine beat distance except under special circumstances
+  (e.g. where the user has requested that a beat lie on a SMPTE frame or if the tempo is known to be constant over the duration).
+
+  This means is that a user operating on a musical grid must supply the desired beat position and/or current beat quantization in order for the
+  sample space the user is operating at to be translated correctly to the object.
+
+  The current approach is to interpret the supplied frame using the grid division the user has currently selected.
+  If the user has no musical grid set, they are actually operating in sample space (even SMPTE frames are rounded to audio frame), so
+  the supplied audio frame is interpreted as the desired musical location (beat_at_frame()).
+
+  tldr: Beat, being a function of time, has nothing to do with sample rate, but time quantization can get in the way of precision.
+
+  When frame_at_beat() is called, the position calculation is performed in pulses and minutes.
+  The result is rounded to audio frames.
+  When beat_at_frame() is called, the frame is converted to minutes, with no rounding performed on the result.
+
+  So :
+  frame_at_beat (beat_at_frame (frame)) == frame
+  but :
+  beat_at_frame (frame_at_beat (beat)) != beat due to the time quantization of frame_at_beat().
+
+  Doing the second one will result in a beat distance error of up to 0.5 audio samples.
+  So instead work in pulses and/or beats and only use beat position to caclulate frame position (e.g. after tempo change).
+  For audio-locked objects, use frame position to calculate beat position.
+
+  The above pointless example would then do:
+  beat_at_pulse (pulse_at_beat (beat)) to avoid rounding.
+
+*/
 struct MetricSectionSorter {
     bool operator() (const MetricSection* a, const MetricSection* b) {
-	    return a->start() < b->start();
+	    return a->pulse() < b->pulse();
+    }
+};
+
+struct MetricSectionFrameSorter {
+    bool operator() (const MetricSection* a, const MetricSection* b) {
+	    return a->frame() < b->frame();
     }
 };
 
 TempoMap::TempoMap (framecnt_t fr)
 {
 	_frame_rate = fr;
-	BBT_Time start;
+	BBT_Time start (1, 1, 0);
 
-	start.bars = 1;
-	start.beats = 1;
-	start.ticks = 0;
-
-	TempoSection *t = new TempoSection (start, _default_tempo.beats_per_minute(), _default_tempo.note_type());
-	MeterSection *m = new MeterSection (start, _default_meter.divisions_per_bar(), _default_meter.note_divisor());
+	TempoSection *t = new TempoSection (0.0, 0, _default_tempo.beats_per_minute(), _default_tempo.note_type(), TempoSection::Ramp, AudioTime);
+	MeterSection *m = new MeterSection (0.0, 0, 0.0, start, _default_meter.divisions_per_bar(), _default_meter.note_divisor(), AudioTime);
 
 	t->set_movable (false);
 	m->set_movable (false);
 
 	/* note: frame time is correct (zero) for both of these */
 
-	metrics.push_back (t);
-	metrics.push_back (m);
+	_metrics.push_back (t);
+	_metrics.push_back (m);
+
 }
 
 TempoMap::~TempoMap ()
 {
+	Metrics::const_iterator d = _metrics.begin();
+	while (d != _metrics.end()) {
+		delete (*d);
+		++d;
+	}
+	_metrics.clear();
 }
 
 void
@@ -309,7 +720,7 @@ TempoMap::remove_tempo (const TempoSection& tempo, bool complete_operation)
 		Glib::Threads::RWLock::WriterLock lm (lock);
 		if ((removed = remove_tempo_locked (tempo))) {
 			if (complete_operation) {
-				recompute_map (true);
+				recompute_map (_metrics);
 			}
 		}
 	}
@@ -324,11 +735,12 @@ TempoMap::remove_tempo_locked (const TempoSection& tempo)
 {
 	Metrics::iterator i;
 
-	for (i = metrics.begin(); i != metrics.end(); ++i) {
+	for (i = _metrics.begin(); i != _metrics.end(); ++i) {
 		if (dynamic_cast<TempoSection*> (*i) != 0) {
 			if (tempo.frame() == (*i)->frame()) {
 				if ((*i)->movable()) {
-					metrics.erase (i);
+					delete (*i);
+					_metrics.erase (i);
 					return true;
 				}
 			}
@@ -347,7 +759,7 @@ TempoMap::remove_meter (const MeterSection& tempo, bool complete_operation)
 		Glib::Threads::RWLock::WriterLock lm (lock);
 		if ((removed = remove_meter_locked (tempo))) {
 			if (complete_operation) {
-				recompute_map (true);
+				recompute_map (_metrics);
 			}
 		}
 	}
@@ -358,15 +770,29 @@ TempoMap::remove_meter (const MeterSection& tempo, bool complete_operation)
 }
 
 bool
-TempoMap::remove_meter_locked (const MeterSection& tempo)
+TempoMap::remove_meter_locked (const MeterSection& meter)
 {
-	Metrics::iterator i;
 
-	for (i = metrics.begin(); i != metrics.end(); ++i) {
+	if (meter.position_lock_style() == AudioTime) {
+		/* remove meter-locked tempo */
+		for (Metrics::iterator i = _metrics.begin(); i != _metrics.end(); ++i) {
+			TempoSection* t = 0;
+			if ((t = dynamic_cast<TempoSection*> (*i)) != 0) {
+				if (t->locked_to_meter() && meter.frame() == (*i)->frame()) {
+					delete (*i);
+					_metrics.erase (i);
+					break;
+				}
+			}
+		}
+	}
+
+	for (Metrics::iterator i = _metrics.begin(); i != _metrics.end(); ++i) {
 		if (dynamic_cast<MeterSection*> (*i) != 0) {
-			if (tempo.frame() == (*i)->frame()) {
+			if (meter.frame() == (*i)->frame()) {
 				if ((*i)->movable()) {
-					metrics.erase (i);
+					delete (*i);
+					_metrics.erase (i);
 					return true;
 				}
 			}
@@ -380,34 +806,24 @@ void
 TempoMap::do_insert (MetricSection* section)
 {
 	bool need_add = true;
-
-	assert (section->start().ticks == 0);
-
 	/* we only allow new meters to be inserted on beat 1 of an existing
 	 * measure.
 	 */
+	MeterSection* m = 0;
+	if ((m = dynamic_cast<MeterSection*>(section)) != 0) {
 
-	if (dynamic_cast<MeterSection*>(section)) {
-
-		/* we need to (potentially) update the BBT times of tempo
-		   sections based on this new meter.
-		*/
-
-		if ((section->start().beats != 1) || (section->start().ticks != 0)) {
-
-			BBT_Time corrected = section->start();
-			corrected.beats = 1;
-			corrected.ticks = 0;
+		if ((m->bbt().beats != 1) || (m->bbt().ticks != 0)) {
 
+			pair<double, BBT_Time> corrected = make_pair (m->beat(), m->bbt());
+			corrected.second.beats = 1;
+			corrected.second.ticks = 0;
+			corrected.first = beat_at_bbt_locked (_metrics, corrected.second);
 			warning << string_compose (_("Meter changes can only be positioned on the first beat of a bar. Moving from %1 to %2"),
-						   section->start(), corrected) << endmsg;
-
-			section->set_start (corrected);
+						   m->bbt(), corrected.second) << endmsg;
+			//m->set_pulse (corrected);
 		}
 	}
 
-
-
 	/* Look for any existing MetricSection that is of the same type and
 	   in the same bar as the new one, and remove it before adding
 	   the new one. Note that this means that if we find a matching,
@@ -415,51 +831,61 @@ TempoMap::do_insert (MetricSection* section)
 	   guaranteed that there is only one such match.
 	*/
 
-	for (Metrics::iterator i = metrics.begin(); i != metrics.end(); ++i) {
+	for (Metrics::iterator i = _metrics.begin(); i != _metrics.end(); ++i) {
 
-		bool const iter_is_tempo = dynamic_cast<TempoSection*> (*i) != 0;
-		bool const insert_is_tempo = dynamic_cast<TempoSection*> (section) != 0;
+		TempoSection* const tempo = dynamic_cast<TempoSection*> (*i);
+		TempoSection* const insert_tempo = dynamic_cast<TempoSection*> (section);
+		MeterSection* const meter = dynamic_cast<MeterSection*> (*i);
+		MeterSection* const insert_meter = dynamic_cast<MeterSection*> (section);
 
-		if (iter_is_tempo && insert_is_tempo) {
+		if (tempo && insert_tempo) {
 
 			/* Tempo sections */
+			bool const ipm = insert_tempo->position_lock_style() == MusicTime;
+			if ((ipm && tempo->pulse() == insert_tempo->pulse()) || (!ipm && tempo->frame() == insert_tempo->frame())) {
 
-			if ((*i)->start().bars == section->start().bars &&
-			    (*i)->start().beats == section->start().beats) {
-
-				if (!(*i)->movable()) {
+				if (!tempo->movable()) {
 
 					/* can't (re)move this section, so overwrite
 					 * its data content (but not its properties as
 					 * a section).
 					 */
 
-					*(dynamic_cast<Tempo*>(*i)) = *(dynamic_cast<Tempo*>(section));
+					*(dynamic_cast<Tempo*>(*i)) = *(dynamic_cast<Tempo*>(insert_tempo));
+					(*i)->set_position_lock_style (AudioTime);
+					TempoSection* t;
+					if ((t = dynamic_cast<TempoSection*>(*i)) != 0) {
+						t->set_type (insert_tempo->type());
+					}
 					need_add = false;
 				} else {
-					metrics.erase (i);
+					delete (*i);
+					_metrics.erase (i);
 				}
 				break;
 			}
 
-		} else if (!iter_is_tempo && !insert_is_tempo) {
+		} else if (meter && insert_meter) {
 
 			/* Meter Sections */
 
-			if ((*i)->start().bars == section->start().bars) {
+			bool const ipm = insert_meter->position_lock_style() == MusicTime;
 
-				if (!(*i)->movable()) {
+			if ((ipm && meter->beat() == insert_meter->beat()) || (!ipm && meter->frame() == insert_meter->frame())) {
+
+				if (!meter->movable()) {
 
 					/* can't (re)move this section, so overwrite
 					 * its data content (but not its properties as
 					 * a section
 					 */
 
-					*(dynamic_cast<Meter*>(*i)) = *(dynamic_cast<Meter*>(section));
+					*(dynamic_cast<Meter*>(*i)) = *(dynamic_cast<Meter*>(insert_meter));
+					(*i)->set_position_lock_style (AudioTime);
 					need_add = false;
 				} else {
-					metrics.erase (i);
-
+					delete (*i);
+					_metrics.erase (i);
 				}
 
 				break;
@@ -474,34 +900,73 @@ TempoMap::do_insert (MetricSection* section)
 	 */
 
 	if (need_add) {
-
+		MeterSection* const insert_meter = dynamic_cast<MeterSection*> (section);
+		TempoSection* const insert_tempo = dynamic_cast<TempoSection*> (section);
 		Metrics::iterator i;
-
-		for (i = metrics.begin(); i != metrics.end(); ++i) {
-			if ((*i)->start() > section->start()) {
-				break;
+		if (insert_meter) {
+			for (i = _metrics.begin(); i != _metrics.end(); ++i) {
+				MeterSection* const meter = dynamic_cast<MeterSection*> (*i);
+
+				if (meter) {
+					bool const ipm = insert_meter->position_lock_style() == MusicTime;
+					if ((ipm && meter->beat() > insert_meter->beat()) || (!ipm && meter->frame() > insert_meter->frame())) {
+						break;
+					}
+				}
+			}
+		} else if (insert_tempo) {
+			for (i = _metrics.begin(); i != _metrics.end(); ++i) {
+				TempoSection* const tempo = dynamic_cast<TempoSection*> (*i);
+
+				if (tempo) {
+					bool const ipm = insert_tempo->position_lock_style() == MusicTime;
+					if ((ipm && tempo->pulse() > insert_tempo->pulse()) || (!ipm && tempo->frame() > insert_tempo->frame())) {
+						break;
+					}
+				}
 			}
 		}
 
-		metrics.insert (i, section);
+		_metrics.insert (i, section);
+		//dump (_metrics, std::cout);
 	}
 }
 
+TempoSection*
+TempoMap::add_tempo (const Tempo& tempo, const double& pulse, const framepos_t& frame, ARDOUR::TempoSection::Type type, PositionLockStyle pls)
+{
+	TempoSection* ts = 0;
+	{
+		Glib::Threads::RWLock::WriterLock lm (lock);
+		ts = add_tempo_locked (tempo, pulse, frame, type, pls, true);
+	}
+
+
+	PropertyChanged (PropertyChange ());
+
+	return ts;
+}
+
 void
-TempoMap::replace_tempo (const TempoSection& ts, const Tempo& tempo, const BBT_Time& where)
+TempoMap::replace_tempo (const TempoSection& ts, const Tempo& tempo, const double& pulse, const framepos_t& frame, TempoSection::Type type, PositionLockStyle pls)
 {
+	const bool locked_to_meter = ts.locked_to_meter();
+
 	{
 		Glib::Threads::RWLock::WriterLock lm (lock);
 		TempoSection& first (first_tempo());
-
-		if (ts.start() != first.start()) {
+		if (ts.frame() != first.frame()) {
 			remove_tempo_locked (ts);
-			add_tempo_locked (tempo, where, true);
+			add_tempo_locked (tempo, pulse, frame, type, pls, true, locked_to_meter);
 		} else {
+			first.set_type (type);
+			first.set_pulse (0.0);
+			first.set_frame (frame);
+			first.set_position_lock_style (AudioTime);
 			{
 				/* cannot move the first tempo section */
 				*static_cast<Tempo*>(&first) = tempo;
-				recompute_map (false);
+				recompute_map (_metrics);
 			}
 		}
 	}
@@ -509,125 +974,128 @@ TempoMap::replace_tempo (const TempoSection& ts, const Tempo& tempo, const BBT_T
 	PropertyChanged (PropertyChange ());
 }
 
-void
-TempoMap::add_tempo (const Tempo& tempo, BBT_Time where)
+TempoSection*
+TempoMap::add_tempo_locked (const Tempo& tempo, double pulse, framepos_t frame
+			    , TempoSection::Type type, PositionLockStyle pls, bool recompute, bool locked_to_meter)
+{
+	TempoSection* t = new TempoSection (pulse, frame, tempo.beats_per_minute(), tempo.note_type(), type, pls);
+	t->set_locked_to_meter (locked_to_meter);
+	bool solved = false;
+
+	do_insert (t);
+
+	if (recompute) {
+		if (pls == AudioTime) {
+			solved = solve_map_frame (_metrics, t, t->frame());
+		} else {
+			solved = solve_map_pulse (_metrics, t, t->pulse());
+		}
+		recompute_meters (_metrics);
+	}
+
+	if (!solved && recompute) {
+		warning << "Adding tempo may have left the tempo map unsolved." << endmsg;
+		recompute_map (_metrics);
+	}
+
+	return t;
+}
+
+MeterSection*
+TempoMap::add_meter (const Meter& meter, const double& beat, const Timecode::BBT_Time& where, const framepos_t& frame, PositionLockStyle pls)
 {
+	MeterSection* m = 0;
 	{
 		Glib::Threads::RWLock::WriterLock lm (lock);
-		add_tempo_locked (tempo, where, true);
+		m = add_meter_locked (meter, beat, where, frame, pls, true);
 	}
 
 
+#ifndef NDEBUG
+	if (DEBUG_ENABLED(DEBUG::TempoMap)) {
+		dump (_metrics, std::cerr);
+	}
+#endif
+
 	PropertyChanged (PropertyChange ());
+	return m;
 }
 
 void
-TempoMap::add_tempo_locked (const Tempo& tempo, BBT_Time where, bool recompute)
+TempoMap::replace_meter (const MeterSection& ms, const Meter& meter, const BBT_Time& where, const framepos_t& frame, PositionLockStyle pls)
 {
-	/* new tempos always start on a beat */
-	where.ticks = 0;
+	{
+		Glib::Threads::RWLock::WriterLock lm (lock);
+		const double beat = beat_at_bbt_locked (_metrics, where);
 
-	TempoSection* ts = new TempoSection (where, tempo.beats_per_minute(), tempo.note_type());
+		if (ms.movable()) {
+			remove_meter_locked (ms);
+			add_meter_locked (meter, beat, where, frame, pls, true);
+		} else {
+			MeterSection& first (first_meter());
+			TempoSection& first_t (first_tempo());
+			/* cannot move the first meter section */
+			*static_cast<Meter*>(&first) = meter;
+			first.set_position_lock_style (AudioTime);
+			first.set_pulse (0.0);
+			first.set_frame (frame);
+			pair<double, BBT_Time> beat = make_pair (0.0, BBT_Time (1, 1, 0));
+			first.set_beat (beat);
+			first_t.set_frame (first.frame());
+			first_t.set_pulse (0.0);
+			first_t.set_position_lock_style (AudioTime);
+			recompute_map (_metrics);
+		}
+	}
 
-	/* find the meter to use to set the bar offset of this
-	 * tempo section.
-	 */
+	PropertyChanged (PropertyChange ());
+}
 
-	const Meter* meter = &first_meter();
+MeterSection*
+TempoMap::add_meter_locked (const Meter& meter, double beat, const BBT_Time& where, framepos_t frame, PositionLockStyle pls, bool recompute)
+{
+	const MeterSection& prev_m = meter_section_at_frame_locked  (_metrics, frame - 1);
+	const double pulse = ((where.bars - prev_m.bbt().bars) * (prev_m.divisions_per_bar() / prev_m.note_divisor())) + prev_m.pulse();
+	TempoSection* mlt = 0;
 
-	/* as we start, we are *guaranteed* to have m.meter and m.tempo pointing
-	   at something, because we insert the default tempo and meter during
-	   TempoMap construction.
+	if (pls == AudioTime) {
+		/* add meter-locked tempo */
+		mlt = add_tempo_locked (tempo_at_frame_locked (_metrics, frame), pulse,  frame, TempoSection::Ramp, AudioTime, true, true);
 
-	   now see if we can find better candidates.
-	*/
+		if (!mlt) {
+			return 0;
+		}
 
-	for (Metrics::const_iterator i = metrics.begin(); i != metrics.end(); ++i) {
-
-		const MeterSection* m;
-
-		if (where < (*i)->start()) {
-			break;
-		}
-
-		if ((m = dynamic_cast<const MeterSection*>(*i)) != 0) {
-			meter = m;
-		}
 	}
 
-	ts->update_bar_offset_from_bbt (*meter);
-
-	/* and insert it */
+	MeterSection* new_meter = new MeterSection (pulse, frame, beat, where, meter.divisions_per_bar(), meter.note_divisor(), pls);
+	bool solved = false;
 
-	do_insert (ts);
+	do_insert (new_meter);
 
 	if (recompute) {
-		recompute_map (false);
-	}
-}
-
-void
-TempoMap::replace_meter (const MeterSection& ms, const Meter& meter, const BBT_Time& where)
-{
-	{
-		Glib::Threads::RWLock::WriterLock lm (lock);
-		MeterSection& first (first_meter());
 
-		if (ms.start() != first.start()) {
-			remove_meter_locked (ms);
-			add_meter_locked (meter, where, true);
+		if (pls == AudioTime) {
+			solved = solve_map_frame (_metrics, new_meter, frame);
 		} else {
-			/* cannot move the first meter section */
-			*static_cast<Meter*>(&first) = meter;
-			recompute_map (true);
+			solved = solve_map_bbt (_metrics, new_meter, where);
+			/* required due to resetting the pulse of meter-locked tempi above.
+			   Arguably  solve_map_bbt() should use solve_map_pulse (_metrics, TempoSection) instead,
+			   but afaict this cannot cause the map to be left unsolved (these tempi are all audio locked).
+			*/
+			recompute_map (_metrics);
 		}
 	}
 
-	PropertyChanged (PropertyChange ());
-}
-
-void
-TempoMap::add_meter (const Meter& meter, BBT_Time where)
-{
-	{
-		Glib::Threads::RWLock::WriterLock lm (lock);
-		add_meter_locked (meter, where, true);
-	}
-
-
-#ifndef NDEBUG
-	if (DEBUG_ENABLED(DEBUG::TempoMap)) {
-		dump (std::cerr);
-	}
-#endif
-
-	PropertyChanged (PropertyChange ());
-}
-
-void
-TempoMap::add_meter_locked (const Meter& meter, BBT_Time where, bool recompute)
-{
-	/* a new meter always starts a new bar on the first beat. so
-	   round the start time appropriately. remember that
-	   `where' is based on the existing tempo map, not
-	   the result after we insert the new meter.
-
-	*/
-
-	if (where.beats != 1) {
-		where.beats = 1;
-		where.bars++;
-	}
-
-	/* new meters *always* start on a beat. */
-	where.ticks = 0;
-
-	do_insert (new MeterSection (where, meter.divisions_per_bar(), meter.note_divisor()));
-
-	if (recompute) {
-		recompute_map (true);
+	if (!solved && recompute) {
+		/* if this has failed to solve, there is little we can do other than to ensure that
+		   the new map is recalculated.
+		*/
+		warning << "Adding meter may have left the tempo map unsolved." << endmsg;
+		recompute_map (_metrics);
 	}
 
+	return new_meter;
 }
 
 void
@@ -636,12 +1104,15 @@ TempoMap::change_initial_tempo (double beats_per_minute, double note_type)
 	Tempo newtempo (beats_per_minute, note_type);
 	TempoSection* t;
 
-	for (Metrics::iterator i = metrics.begin(); i != metrics.end(); ++i) {
+	for (Metrics::iterator i = _metrics.begin(); i != _metrics.end(); ++i) {
 		if ((t = dynamic_cast<TempoSection*> (*i)) != 0) {
+			if (!t->active()) {
+				continue;
+			}
 			{
 				Glib::Threads::RWLock::WriterLock lm (lock);
 				*((Tempo*) t) = newtempo;
-				recompute_map (false);
+				recompute_map (_metrics);
 			}
 			PropertyChanged (PropertyChange ());
 			break;
@@ -661,7 +1132,7 @@ TempoMap::change_existing_tempo_at (framepos_t where, double beats_per_minute, d
 	/* find the TempoSection immediately preceding "where"
 	 */
 
-	for (first = 0, i = metrics.begin(), prev = 0; i != metrics.end(); ++i) {
+	for (first = 0, i = _metrics.begin(), prev = 0; i != _metrics.end(); ++i) {
 
 		if ((*i)->frame() > where) {
 			break;
@@ -670,6 +1141,9 @@ TempoMap::change_existing_tempo_at (framepos_t where, double beats_per_minute, d
 		TempoSection* t;
 
 		if ((t = dynamic_cast<TempoSection*>(*i)) != 0) {
+			if (!t->active()) {
+				continue;
+			}
 			if (!first) {
 				first = t;
 			}
@@ -692,7 +1166,7 @@ TempoMap::change_existing_tempo_at (framepos_t where, double beats_per_minute, d
 		Glib::Threads::RWLock::WriterLock lm (lock);
 		/* cannot move the first tempo section */
 		*((Tempo*)prev) = newtempo;
-		recompute_map (false);
+		recompute_map (_metrics);
 	}
 
 	PropertyChanged (PropertyChange ());
@@ -703,13 +1177,13 @@ TempoMap::first_meter () const
 {
 	const MeterSection *m = 0;
 
-	for (Metrics::const_iterator i = metrics.begin(); i != metrics.end(); ++i) {
+	for (Metrics::const_iterator i = _metrics.begin(); i != _metrics.end(); ++i) {
 		if ((m = dynamic_cast<const MeterSection *> (*i)) != 0) {
 			return *m;
 		}
 	}
 
-	fatal << _("programming error: no tempo section in tempo map!") << endmsg;
+	fatal << _("programming error: no meter section in tempo map!") << endmsg;
 	abort(); /*NOTREACHED*/
 	return *m;
 }
@@ -721,7 +1195,7 @@ TempoMap::first_meter ()
 
 	/* CALLER MUST HOLD LOCK */
 
-	for (Metrics::iterator i = metrics.begin(); i != metrics.end(); ++i) {
+	for (Metrics::iterator i = _metrics.begin(); i != _metrics.end(); ++i) {
 		if ((m = dynamic_cast<MeterSection *> (*i)) != 0) {
 			return *m;
 		}
@@ -739,9 +1213,14 @@ TempoMap::first_tempo () const
 
 	/* CALLER MUST HOLD LOCK */
 
-	for (Metrics::const_iterator i = metrics.begin(); i != metrics.end(); ++i) {
+	for (Metrics::const_iterator i = _metrics.begin(); i != _metrics.end(); ++i) {
 		if ((t = dynamic_cast<const TempoSection *> (*i)) != 0) {
-			return *t;
+			if (!t->active()) {
+				continue;
+			}
+			if (!t->movable()) {
+				return *t;
+			}
 		}
 	}
 
@@ -755,9 +1234,14 @@ TempoMap::first_tempo ()
 {
 	TempoSection *t = 0;
 
-	for (Metrics::const_iterator i = metrics.begin(); i != metrics.end(); ++i) {
+	for (Metrics::const_iterator i = _metrics.begin(); i != _metrics.end(); ++i) {
 		if ((t = dynamic_cast<TempoSection *> (*i)) != 0) {
-			return *t;
+			if (!t->active()) {
+				continue;
+			}
+			if (!t->movable()) {
+				return *t;
+			}
 		}
 	}
 
@@ -765,50 +1249,130 @@ TempoMap::first_tempo ()
 	abort(); /*NOTREACHED*/
 	return *t;
 }
-
 void
-TempoMap::require_map_to (framepos_t pos)
+TempoMap::recompute_tempi (Metrics& metrics)
 {
-	Glib::Threads::RWLock::WriterLock lm (lock);
+	TempoSection* prev_t = 0;
+
+	for (Metrics::const_iterator i = metrics.begin(); i != metrics.end(); ++i) {
+		TempoSection* t;
+
+		if ((*i)->is_tempo()) {
+			t = static_cast<TempoSection*> (*i);
+			if (!t->active()) {
+				continue;
+			}
+			if (!t->movable()) {
+				if (!prev_t) {
+					t->set_pulse (0.0);
+					prev_t = t;
+					continue;
+				}
+			}
+			if (prev_t) {
+				if (t->position_lock_style() == AudioTime) {
+					prev_t->set_c_func (prev_t->compute_c_func_frame (t->pulses_per_minute(), t->frame(), _frame_rate));
+					if (!t->locked_to_meter()) {
+						t->set_pulse (prev_t->pulse_at_tempo (t->pulses_per_minute(), t->frame(), _frame_rate));
+					}
+
+				} else {
+					prev_t->set_c_func (prev_t->compute_c_func_pulse (t->pulses_per_minute(), t->pulse(), _frame_rate));
+					t->set_frame (prev_t->frame_at_tempo (t->pulses_per_minute(), t->pulse(), _frame_rate));
 
-	if (_map.empty() || _map.back().frame < pos) {
-		extend_map (pos);
+				}
+			}
+			prev_t = t;
+		}
 	}
+	prev_t->set_c_func (0.0);
 }
 
+/* tempos must be positioned correctly.
+   the current approach is to use a meter's bbt time as its base position unit.
+   an audio-locked meter requires a recomputation of pulse and beat (but not bbt),
+   while a music-locked meter requires recomputations of frame pulse and beat (but not bbt)
+*/
 void
-TempoMap::require_map_to (const BBT_Time& bbt)
+TempoMap::recompute_meters (Metrics& metrics)
 {
-	Glib::Threads::RWLock::WriterLock lm (lock);
+	MeterSection* meter = 0;
+	MeterSection* prev_m = 0;
+
+	for (Metrics::const_iterator mi = metrics.begin(); mi != metrics.end(); ++mi) {
+		if (!(*mi)->is_tempo()) {
+			meter = static_cast<MeterSection*> (*mi);
+			if (meter->position_lock_style() == AudioTime) {
+				double pulse = 0.0;
+				pair<double, BBT_Time> b_bbt;
+				TempoSection* meter_locked_tempo = 0;
+				for (Metrics::const_iterator ii = metrics.begin(); ii != metrics.end(); ++ii) {
+					TempoSection* t;
+					if ((*ii)->is_tempo()) {
+						t = static_cast<TempoSection*> (*ii);
+						if ((t->locked_to_meter() || !t->movable()) && t->frame() == meter->frame()) {
+							meter_locked_tempo = t;
+							break;
+						}
+					}
+				}
 
-	/* since we have no idea where BBT is if its off the map, see the last
-	 * point in the map is past BBT, and if not add an arbitrary amount of
-	 * time until it is.
-	 */
+				if (prev_m) {
+					const double beats = (meter->bbt().bars - prev_m->bbt().bars) * prev_m->divisions_per_bar();
+					if (beats + prev_m->beat() != meter->beat()) {
+						/* reordering caused a bbt change */
+						b_bbt = make_pair (beats + prev_m->beat()
+								   , BBT_Time ((beats / prev_m->divisions_per_bar()) + prev_m->bbt().bars, 1, 0));
+						pulse = prev_m->pulse() + (beats / prev_m->note_divisor());
+
+					} else if (meter->movable()) {
+						b_bbt = make_pair (meter->beat(), meter->bbt());
+						pulse = prev_m->pulse() + (beats / prev_m->note_divisor());
+					}
+				} else {
+					b_bbt = make_pair (0.0, BBT_Time (1, 1, 0));
+				}
+				if (meter_locked_tempo) {
+					meter_locked_tempo->set_pulse (pulse);
+				}
+				meter->set_beat (b_bbt);
+				meter->set_pulse (pulse);
 
-	int additional_minutes = 1;
+			} else {
+				/* MusicTime */
+				double pulse = 0.0;
+				pair<double, BBT_Time> b_bbt;
+				if (prev_m) {
+					const double beats = (meter->bbt().bars - prev_m->bbt().bars) * prev_m->divisions_per_bar();
+					if (beats + prev_m->beat() != meter->beat()) {
+						/* reordering caused a bbt change */
+						b_bbt = make_pair (beats + prev_m->beat()
+								   , BBT_Time ((beats / prev_m->divisions_per_bar()) + prev_m->bbt().bars, 1, 0));
+					} else {
+						b_bbt = make_pair (beats + prev_m->beat(), meter->bbt());
+					}
+					pulse = (beats / prev_m->note_divisor()) + prev_m->pulse();
+				} else {
+					/* shouldn't happen - the first is audio-locked */
+					pulse = pulse_at_beat_locked (metrics, meter->beat());
+					b_bbt = make_pair (meter->beat(), meter->bbt());
+				}
 
-	while (1) {
-		if (!_map.empty() && _map.back().bar >= (bbt.bars + 1)) {
-			break;
+				meter->set_beat (b_bbt);
+				meter->set_pulse (pulse);
+				meter->set_frame (frame_at_pulse_locked (metrics, pulse));
+			}
+
+			prev_m = meter;
 		}
-		/* add some more distance, using bigger steps each time */
-		extend_map (_map.back().frame + (_frame_rate * 60 * additional_minutes));
-		additional_minutes *= 2;
 	}
 }
 
 void
-TempoMap::recompute_map (bool reassign_tempo_bbt, framepos_t end)
+TempoMap::recompute_map (Metrics& metrics, framepos_t end)
 {
 	/* CALLER MUST HOLD WRITE LOCK */
 
-	MeterSection* meter = 0;
-	TempoSection* tempo = 0;
-	double current_frame;
-	BBT_Time current;
-	Metrics::iterator next_metric;
-
 	if (end < 0) {
 
 		/* we will actually stop once we hit
@@ -816,296 +1380,18 @@ TempoMap::recompute_map (bool reassign_tempo_bbt, framepos_t end)
 		*/
 		end = max_framepos;
 
-	} else {
-		if (!_map.empty ()) {
-			/* never allow the map to be shortened */
-			end = max (end, _map.back().frame);
-		}
 	}
 
 	DEBUG_TRACE (DEBUG::TempoMath, string_compose ("recomputing tempo map, zero to %1\n", end));
 
-	for (Metrics::iterator i = metrics.begin(); i != metrics.end(); ++i) {
-		MeterSection* ms;
-
-		if ((ms = dynamic_cast<MeterSection *> (*i)) != 0) {
-			meter = ms;
-			break;
-		}
-	}
-
-	assert(meter);
-
-	for (Metrics::iterator i = metrics.begin(); i != metrics.end(); ++i) {
-		TempoSection* ts;
-
-		if ((ts = dynamic_cast<TempoSection *> (*i)) != 0) {
-			tempo = ts;
-			break;
-		}
-	}
-
-	assert(tempo);
-
-	/* assumes that the first meter & tempo are at frame zero */
-	current_frame = 0;
-	meter->set_frame (0);
-	tempo->set_frame (0);
-
-	/* assumes that the first meter & tempo are at 1|1|0 */
-	current.bars = 1;
-	current.beats = 1;
-	current.ticks = 0;
-
-	if (reassign_tempo_bbt) {
-
-		MeterSection* rmeter = meter;
-
-		DEBUG_TRACE (DEBUG::TempoMath, "\tUpdating tempo marks BBT time from bar offset\n");
-
-		for (Metrics::iterator i = metrics.begin(); i != metrics.end(); ++i) {
-
-			TempoSection* ts;
-			MeterSection* ms;
-
-			if ((ts = dynamic_cast<TempoSection*>(*i)) != 0) {
-
-				/* reassign the BBT time of this tempo section
-				 * based on its bar offset position.
-				 */
-
-				ts->update_bbt_time_from_bar_offset (*rmeter);
-
-			} else if ((ms = dynamic_cast<MeterSection*>(*i)) != 0) {
-				rmeter = ms;
-			} else {
-				fatal << _("programming error: unhandled MetricSection type") << endmsg;
-				abort(); /*NOTREACHED*/
-			}
-		}
-	}
-
-	DEBUG_TRACE (DEBUG::TempoMath, string_compose ("start with meter = %1 tempo = %2\n", *((Meter*)meter), *((Tempo*)tempo)));
-
-	next_metric = metrics.begin();
-	++next_metric; // skip meter (or tempo)
-	++next_metric; // skip tempo (or meter)
-
-	_map.clear ();
-
-	DEBUG_TRACE (DEBUG::TempoMath, string_compose ("Add first bar at 1|1 @ %2\n", current.bars, current_frame));
-	_map.push_back (BBTPoint (*meter, *tempo,(framepos_t) llrint(current_frame), 1, 1));
-
 	if (end == 0) {
 		/* silly call from Session::process() during startup
 		 */
 		return;
 	}
 
-	_extend_map (tempo, meter, next_metric, current, current_frame, end);
-}
-
-void
-TempoMap::extend_map (framepos_t end)
-{
-	/* CALLER MUST HOLD WRITE LOCK */
-
-	if (_map.empty()) {
-		recompute_map (false, end);
-		return;
-	}
-
-	BBTPointList::const_iterator i = _map.end();
-	Metrics::iterator next_metric;
-
-	--i;
-
-	BBT_Time last_metric_start;
-
-	if ((*i).tempo->frame() > (*i).meter->frame()) {
-		last_metric_start = (*i).tempo->start();
-	} else {
-		last_metric_start = (*i).meter->start();
-	}
-
-	/* find the metric immediately after the tempo + meter sections for the
-	 * last point in the map
-	 */
-
-	for (next_metric = metrics.begin(); next_metric != metrics.end(); ++next_metric) {
-		if ((*next_metric)->start() > last_metric_start) {
-			break;
-		}
-	}
-
-	/* we cast away const here because this is the one place where we need
-	 * to actually modify the frame time of each metric section.
-	 */
-
-	_extend_map (const_cast<TempoSection*> ((*i).tempo),
-		     const_cast<MeterSection*> ((*i).meter),
-		     next_metric, BBT_Time ((*i).bar, (*i).beat, 0), (*i).frame, end);
-}
-
-void
-TempoMap::_extend_map (TempoSection* tempo, MeterSection* meter,
-		       Metrics::iterator next_metric,
-		       BBT_Time current, framepos_t current_frame, framepos_t end)
-{
-	/* CALLER MUST HOLD WRITE LOCK */
-
-	TempoSection* ts;
-	MeterSection* ms;
-	double beat_frames;
-	double current_frame_exact;
-	framepos_t bar_start_frame;
-
-	DEBUG_TRACE (DEBUG::TempoMath, string_compose ("Extend map to %1 from %2 = %3\n", end, current, current_frame));
-
-	if (current.beats == 1) {
-		bar_start_frame = current_frame;
-	} else {
-		bar_start_frame = 0;
-	}
-
-	beat_frames = meter->frames_per_grid (*tempo,_frame_rate);
-	current_frame_exact = current_frame;
-
-	while (current_frame < end) {
-
-		current.beats++;
-		current_frame_exact += beat_frames;
-		current_frame = llrint(current_frame_exact);
-
-		if (current.beats > meter->divisions_per_bar()) {
-			current.bars++;
-			current.beats = 1;
-		}
-
-		if (next_metric != metrics.end()) {
-
-			/* no operator >= so invert operator < */
-
-			DEBUG_TRACE (DEBUG::TempoMath, string_compose ("now at %1 next metric @ %2\n", current, (*next_metric)->start()));
-
-			if (!(current < (*next_metric)->start())) {
-
-		set_metrics:
-				if (((ts = dynamic_cast<TempoSection*> (*next_metric)) != 0)) {
-
-					tempo = ts;
-
-					/* new tempo section: if its on a beat,
-					 * we don't have to do anything other
-					 * than recompute various distances,
-					 * done further below as we transition
-					 * the next metric section.
-					 *
-					 * if its not on the beat, we have to
-					 * compute the duration of the beat it
-					 * is within, which will be different
-					 * from the preceding following ones
-					 * since it takes part of its duration
-					 * from the preceding tempo and part
-					 * from this new tempo.
-					 */
-
-					if (tempo->start().ticks != 0) {
-
-						double next_beat_frames = tempo->frames_per_beat (_frame_rate);
-
-						DEBUG_TRACE (DEBUG::TempoMath, string_compose ("bumped into non-beat-aligned tempo metric at %1 = %2, adjust next beat using %3\n",
-						                                               tempo->start(), current_frame, tempo->bar_offset()));
-
-						/* back up to previous beat */
-						current_frame_exact -= beat_frames;
-						current_frame = llrint(current_frame_exact);
-
-						/* set tempo section location
-						 * based on offset from last
-						 * bar start
-						 */
-						tempo->set_frame (bar_start_frame +
-						                  llrint ((ts->bar_offset() * meter->divisions_per_bar() * beat_frames)));
-
-						/* advance to the location of
-						 * the new (adjusted) beat. do
-						 * this by figuring out the
-						 * offset within the beat that
-						 * would have been there
-						 * without the tempo
-						 * change. then stretch the
-						 * beat accordingly.
-						 */
-
-						double offset_within_old_beat = (tempo->frame() - current_frame) / beat_frames;
-
-						current_frame_exact += (offset_within_old_beat * beat_frames) + ((1.0 - offset_within_old_beat) * next_beat_frames);
-						current_frame = llrint(current_frame_exact);
-
-						/* next metric doesn't have to
-						 * match this precisely to
-						 * merit a reloop ...
-						 */
-						DEBUG_TRACE (DEBUG::TempoMath, string_compose ("Adjusted last beat to %1\n", current_frame));
-
-					} else {
-
-						DEBUG_TRACE (DEBUG::TempoMath, string_compose ("bumped into beat-aligned tempo metric at %1 = %2\n",
-						                                               tempo->start(), current_frame));
-						tempo->set_frame (current_frame);
-					}
-
-				} else if ((ms = dynamic_cast<MeterSection*>(*next_metric)) != 0) {
-
-					meter = ms;
-
-					/* new meter section: always defines the
-					 * start of a bar.
-					 */
-
-					DEBUG_TRACE (DEBUG::TempoMath, string_compose ("bumped into meter section at %1 vs %2 (%3)\n",
-					                                               meter->start(), current, current_frame));
-
-					assert (current.beats == 1);
-
-					meter->set_frame (current_frame);
-				}
-
-				beat_frames = meter->frames_per_grid (*tempo, _frame_rate);
-
-				DEBUG_TRACE (DEBUG::TempoMath, string_compose ("New metric with beat frames = %1 dpb %2 meter %3 tempo %4\n",
-				                                               beat_frames, meter->divisions_per_bar(), *((Meter*)meter), *((Tempo*)tempo)));
-
-				++next_metric;
-
-				if (next_metric != metrics.end() && ((*next_metric)->start() == current)) {
-					/* same position so go back and set this one up before advancing
-					 */
-					goto set_metrics;
-				}
-
-			}
-		}
-
-		if (current.beats == 1) {
-			DEBUG_TRACE (DEBUG::TempoMath, string_compose ("Add Bar at %1|1 @ %2\n", current.bars, current_frame));
-			_map.push_back (BBTPoint (*meter, *tempo, current_frame, current.bars, 1));
-			bar_start_frame = current_frame;
-		} else {
-			DEBUG_TRACE (DEBUG::TempoMath, string_compose ("Add Beat at %1|%2 @ %3\n", current.bars, current.beats, current_frame));
-			_map.push_back (BBTPoint (*meter, *tempo, current_frame, current.bars, current.beats));
-		}
-
-		if (next_metric == metrics.end()) {
-			/* no more metrics - we've timestamped them all, stop here */
-			if (end == max_framepos) {
-				DEBUG_TRACE (DEBUG::TempoMath, string_compose ("stop extending map now that we've reach the end @ %1|%2 = %3\n",
-				                                               current.bars, current.beats, current_frame));
-				break;
-			}
-		}
-	}
+	recompute_tempi (metrics);
+	recompute_meters (metrics);
 }
 
 TempoMetric
@@ -1121,7 +1407,7 @@ TempoMap::metric_at (framepos_t frame, Metrics::const_iterator* last) const
 	   now see if we can find better candidates.
 	*/
 
-	for (Metrics::const_iterator i = metrics.begin(); i != metrics.end(); ++i) {
+	for (Metrics::const_iterator i = _metrics.begin(); i != _metrics.end(); ++i) {
 
 		if ((*i)->frame() > frame) {
 			break;
@@ -1137,6 +1423,7 @@ TempoMap::metric_at (framepos_t frame, Metrics::const_iterator* last) const
 	return m;
 }
 
+/* XX meters only */
 TempoMetric
 TempoMap::metric_at (BBT_Time bbt) const
 {
@@ -1150,145 +1437,1583 @@ TempoMap::metric_at (BBT_Time bbt) const
 	   now see if we can find better candidates.
 	*/
 
-	for (Metrics::const_iterator i = metrics.begin(); i != metrics.end(); ++i) {
+	for (Metrics::const_iterator i = _metrics.begin(); i != _metrics.end(); ++i) {
+		MeterSection* mw;
+		if (!(*i)->is_tempo()) {
+			mw = static_cast<MeterSection*> (*i);
+			BBT_Time section_start (mw->bbt());
 
-		BBT_Time section_start ((*i)->start());
+			if (section_start.bars > bbt.bars || (section_start.bars == bbt.bars && section_start.beats > bbt.beats)) {
+				break;
+			}
 
-		if (section_start.bars > bbt.bars || (section_start.bars == bbt.bars && section_start.beats > bbt.beats)) {
-			break;
+			m.set_metric (*i);
 		}
-
-		m.set_metric (*i);
 	}
 
 	return m;
 }
 
-void
-TempoMap::bbt_time (framepos_t frame, BBT_Time& bbt)
+double
+TempoMap::beat_at_frame (const framecnt_t& frame) const
 {
-	require_map_to (frame);
-
 	Glib::Threads::RWLock::ReaderLock lm (lock);
-
-	if (frame < 0) {
-		bbt.bars = 1;
-		bbt.beats = 1;
-		bbt.ticks = 0;
-		warning << string_compose (_("tempo map asked for BBT time at frame %1\n"), frame) << endmsg;
-		return;
-	}
-
-	return bbt_time (frame, bbt, bbt_before_or_at (frame));
+	return beat_at_frame_locked (_metrics, frame);
 }
 
-void
-TempoMap::bbt_time_rt (framepos_t frame, BBT_Time& bbt)
+/* meter / tempo section based */
+double
+TempoMap::beat_at_frame_locked (const Metrics& metrics, const framecnt_t& frame) const
 {
-	Glib::Threads::RWLock::ReaderLock lm (lock, Glib::Threads::TRY_LOCK);
+	const TempoSection& ts = tempo_section_at_frame_locked (metrics, frame);
+	MeterSection* prev_m = 0;
+	MeterSection* next_m = 0;
 
-	if (!lm.locked()) {
-		throw std::logic_error ("TempoMap::bbt_time_rt() could not lock tempo map");
+	for (Metrics::const_iterator i = metrics.begin(); i != metrics.end(); ++i) {
+		if (!(*i)->is_tempo()) {
+			if (prev_m && (*i)->frame() > frame) {
+				next_m = static_cast<MeterSection*> (*i);
+				break;
+			}
+			prev_m = static_cast<MeterSection*> (*i);
+		}
 	}
+	if (frame < prev_m->frame()) {
+		return 0.0;
+	}
+	const double beat = prev_m->beat() + (ts.pulse_at_frame (frame, _frame_rate) - prev_m->pulse()) * prev_m->note_divisor();
 
-	if (_map.empty() || _map.back().frame < frame) {
-		throw std::logic_error (string_compose ("map not long enough to reach %1", frame));
+	/* audio locked meters fake their beat */
+	if (next_m && next_m->beat() < beat) {
+		return next_m->beat();
 	}
 
-	return bbt_time (frame, bbt, bbt_before_or_at (frame));
+	return beat;
 }
 
-void
-TempoMap::bbt_time (framepos_t frame, BBT_Time& bbt, const BBTPointList::const_iterator& i)
+framepos_t
+TempoMap::frame_at_beat (const double& beat) const
 {
-	/* CALLER MUST HOLD READ LOCK */
-
-	bbt.bars = (*i).bar;
-	bbt.beats = (*i).beat;
-
-	if ((*i).frame == frame) {
-		bbt.ticks = 0;
-	} else {
-		bbt.ticks = llrint (((frame - (*i).frame) / (*i).tempo->frames_per_beat(_frame_rate)) *
-		                    BBT_Time::ticks_per_beat);
-	}
+	Glib::Threads::RWLock::ReaderLock lm (lock);
+	return frame_at_beat_locked (_metrics, beat);
 }
 
+/* meter & tempo section based */
 framepos_t
-TempoMap::frame_time (const BBT_Time& bbt)
+TempoMap::frame_at_beat_locked (const Metrics& metrics, const double& beat) const
 {
-	if (bbt.bars < 1) {
-		warning << string_compose (_("tempo map asked for frame time at bar < 1  (%1)\n"), bbt) << endmsg;
-		return 0;
-	}
-
-	if (bbt.beats < 1) {
-		throw std::logic_error ("beats are counted from one");
-	}
+	MeterSection* prev_m = 0;
+	TempoSection* prev_t = 0;
 
-	require_map_to (bbt);
+	MeterSection* m;
 
-	Glib::Threads::RWLock::ReaderLock lm (lock);
+	for (Metrics::const_iterator i = metrics.begin(); i != metrics.end(); ++i) {
+		if (!(*i)->is_tempo()) {
+			m = static_cast<MeterSection*> (*i);
+			if (prev_m && m->beat() > beat) {
+				break;
+			}
+			prev_m = m;
+		}
+	}
+
+	TempoSection* t;
+
+	for (Metrics::const_iterator i = metrics.begin(); i != metrics.end(); ++i) {
+		if ((*i)->is_tempo()) {
+			t = static_cast<TempoSection*> (*i);
+			if (prev_t && ((t->pulse() - prev_m->pulse()) * prev_m->note_divisor()) + prev_m->beat() > beat) {
+				break;
+			}
+			prev_t = t;
+		}
+
+	}
+
+	return prev_t->frame_at_pulse (((beat - prev_m->beat()) / prev_m->note_divisor()) + prev_m->pulse(), _frame_rate);
+}
+
+Tempo
+TempoMap::tempo_at_frame (const framepos_t& frame) const
+{
+	Glib::Threads::RWLock::ReaderLock lm (lock);
+	return tempo_at_frame_locked (_metrics, frame);
+}
+
+Tempo
+TempoMap::tempo_at_frame_locked (const Metrics& metrics, const framepos_t& frame) const
+{
+	TempoSection* prev_t = 0;
+
+	TempoSection* t;
+
+	for (Metrics::const_iterator i = _metrics.begin(); i != _metrics.end(); ++i) {
+		if ((*i)->is_tempo()) {
+			t = static_cast<TempoSection*> (*i);
+			if (!t->active()) {
+				continue;
+			}
+			if ((prev_t) && t->frame() > frame) {
+				/* t is the section past frame */
+				const double ret_bpm = prev_t->tempo_at_frame (frame, _frame_rate) * prev_t->note_type();
+				const Tempo ret_tempo (ret_bpm, prev_t->note_type());
+				return ret_tempo;
+			}
+			prev_t = t;
+		}
+	}
+
+	const double ret = prev_t->beats_per_minute();
+	const Tempo ret_tempo (ret, prev_t->note_type ());
+
+	return ret_tempo;
+}
+
+/** returns the frame at which the supplied tempo occurs, or
+ *  the frame of the last tempo section (search exhausted)
+ *  only the position of the first occurence will be returned
+ *  (extend me)
+*/
+framepos_t
+TempoMap::frame_at_tempo (const Tempo& tempo) const
+{
+	Glib::Threads::RWLock::ReaderLock lm (lock);
+	return frame_at_tempo_locked (_metrics, tempo);
+}
+
+
+framepos_t
+TempoMap::frame_at_tempo_locked (const Metrics& metrics, const Tempo& tempo) const
+{
+	TempoSection* prev_t = 0;
+	const double tempo_ppm = tempo.beats_per_minute() / tempo.note_type();
+
+	Metrics::const_iterator i;
+
+	for (i = _metrics.begin(); i != _metrics.end(); ++i) {
+		TempoSection* t;
+		if ((*i)->is_tempo()) {
+			t = static_cast<TempoSection*> (*i);
+
+			if (!t->active()) {
+				continue;
+			}
+
+			const double t_ppm = t->beats_per_minute() / t->note_type();
+
+			if (t_ppm == tempo_ppm) {
+				return t->frame();
+			}
+
+			if (prev_t) {
+				const double prev_t_ppm = prev_t->beats_per_minute() / prev_t->note_type();
+
+				if ((t_ppm > tempo_ppm && prev_t_ppm < tempo_ppm) || (t_ppm < tempo_ppm && prev_t_ppm > tempo_ppm)) {
+					return prev_t->frame_at_tempo (tempo_ppm, prev_t->pulse(), _frame_rate);
+				}
+			}
+			prev_t = t;
+		}
+	}
+
+	return prev_t->frame();
+}
+
+/** more precise than doing tempo_at_frame (frame_at_beat (b)),
+ *  as there is no intermediate frame rounding.
+ */
+Tempo
+TempoMap::tempo_at_beat (const double& beat) const
+{
+	Glib::Threads::RWLock::ReaderLock lm (lock);
+	const MeterSection* prev_m = &meter_section_at_beat_locked (_metrics, beat);
+	const TempoSection* prev_t = &tempo_section_at_beat_locked (_metrics, beat);
+	const double note_type = prev_t->note_type();
+
+	return Tempo (prev_t->tempo_at_pulse (((beat - prev_m->beat()) / prev_m->note_divisor()) + prev_m->pulse()) * note_type, note_type);
+}
+
+double
+TempoMap::pulse_at_beat (const double& beat) const
+{
+	Glib::Threads::RWLock::ReaderLock lm (lock);
+	return pulse_at_beat_locked (_metrics, beat);
+}
+
+double
+TempoMap::pulse_at_beat_locked (const Metrics& metrics, const double& beat) const
+{
+	const MeterSection* prev_m = &meter_section_at_beat_locked (metrics, beat);
+
+	return prev_m->pulse() + ((beat - prev_m->beat()) / prev_m->note_divisor());
+}
+
+double
+TempoMap::beat_at_pulse (const double& pulse) const
+{
+	Glib::Threads::RWLock::ReaderLock lm (lock);
+	return beat_at_pulse_locked (_metrics, pulse);
+}
+
+double
+TempoMap::beat_at_pulse_locked (const Metrics& metrics, const double& pulse) const
+{
+	MeterSection* prev_m = 0;
+
+	for (Metrics::const_iterator i = metrics.begin(); i != metrics.end(); ++i) {
+		MeterSection* m;
+		if (!(*i)->is_tempo()) {
+			m = static_cast<MeterSection*> (*i);
+			if (prev_m && m->pulse() > pulse) {
+				if (((pulse - prev_m->pulse()) * prev_m->note_divisor()) + prev_m->beat() > m->beat()) {
+					break;
+				}
+			}
+			prev_m = m;
+		}
+	}
+
+	double const ret = ((pulse - prev_m->pulse()) * prev_m->note_divisor()) + prev_m->beat();
+	return ret;
+}
+
+double
+TempoMap::pulse_at_frame (const framepos_t& frame) const
+{
+	Glib::Threads::RWLock::ReaderLock lm (lock);
+	return pulse_at_frame_locked (_metrics, frame);
+}
+
+/* tempo section based */
+double
+TempoMap::pulse_at_frame_locked (const Metrics& metrics, const framepos_t& frame) const
+{
+	/* HOLD (at least) THE READER LOCK */
+	TempoSection* prev_t = 0;
+
+	for (Metrics::const_iterator i = metrics.begin(); i != metrics.end(); ++i) {
+		TempoSection* t;
+		if ((*i)->is_tempo()) {
+			t = static_cast<TempoSection*> (*i);
+			if (!t->active()) {
+				continue;
+			}
+			if (prev_t && t->frame() > frame) {
+				/*the previous ts is the one containing the frame */
+				const double ret = prev_t->pulse_at_frame (frame, _frame_rate);
+				return ret;
+			}
+			prev_t = t;
+		}
+	}
+
+	/* treated as constant for this ts */
+	const double pulses_in_section = (frame - prev_t->frame()) / prev_t->frames_per_pulse (_frame_rate);
+
+	return pulses_in_section + prev_t->pulse();
+}
+
+framepos_t
+TempoMap::frame_at_pulse (const double& pulse) const
+{
+	Glib::Threads::RWLock::ReaderLock lm (lock);
+	return frame_at_pulse_locked (_metrics, pulse);
+}
+
+/* tempo section based */
+framepos_t
+TempoMap::frame_at_pulse_locked (const Metrics& metrics, const double& pulse) const
+{
+	/* HOLD THE READER LOCK */
+
+	const TempoSection* prev_t = 0;
+
+	for (Metrics::const_iterator i = metrics.begin(); i != metrics.end(); ++i) {
+		TempoSection* t;
+
+		if ((*i)->is_tempo()) {
+			t = static_cast<TempoSection*> (*i);
+			if (!t->active()) {
+				continue;
+			}
+			if (prev_t && t->pulse() > pulse) {
+				return prev_t->frame_at_pulse (pulse, _frame_rate);
+			}
+
+			prev_t = t;
+		}
+	}
+	/* must be treated as constant, irrespective of _type */
+	double const dtime = (pulse - prev_t->pulse()) * prev_t->frames_per_pulse (_frame_rate);
+
+	return (framecnt_t) floor (dtime) + prev_t->frame();
+}
+
+double
+TempoMap::beat_at_bbt (const Timecode::BBT_Time& bbt)
+{
+	Glib::Threads::RWLock::ReaderLock lm (lock);
+	return beat_at_bbt_locked (_metrics, bbt);
+}
+
+
+double
+TempoMap::beat_at_bbt_locked (const Metrics& metrics, const Timecode::BBT_Time& bbt) const
+{
+	/* CALLER HOLDS READ LOCK */
+
+	MeterSection* prev_m = 0;
+
+	/* because audio-locked meters have 'fake' integral beats,
+	   there is no pulse offset here.
+	*/
+	MeterSection* m;
+
+	for (Metrics::const_iterator i = metrics.begin(); i != metrics.end(); ++i) {
+		if (!(*i)->is_tempo()) {
+			m = static_cast<MeterSection*> (*i);
+			if (prev_m) {
+				const double bars_to_m = (m->beat() - prev_m->beat()) / prev_m->divisions_per_bar();
+				if ((bars_to_m + (prev_m->bbt().bars - 1)) > (bbt.bars - 1)) {
+					break;
+				}
+			}
+			prev_m = m;
+		}
+	}
+
+	const double remaining_bars = bbt.bars - prev_m->bbt().bars;
+	const double remaining_bars_in_beats = remaining_bars * prev_m->divisions_per_bar();
+	const double ret = remaining_bars_in_beats + prev_m->beat() + (bbt.beats - 1) + (bbt.ticks / BBT_Time::ticks_per_beat);
+
+	return ret;
+}
+
+Timecode::BBT_Time
+TempoMap::bbt_at_beat (const double& beats)
+{
+	Glib::Threads::RWLock::ReaderLock lm (lock);
+	return bbt_at_beat_locked (_metrics, beats);
+}
+
+Timecode::BBT_Time
+TempoMap::bbt_at_beat_locked (const Metrics& metrics, const double& b) const
+{
+	/* CALLER HOLDS READ LOCK */
+	MeterSection* prev_m = 0;
+	const double beats = max (0.0, b);
+
+	MeterSection* m = 0;
+
+	for (Metrics::const_iterator i = metrics.begin(); i != metrics.end(); ++i) {
+		if (!(*i)->is_tempo()) {
+			m = static_cast<MeterSection*> (*i);
+			if (prev_m) {
+				if (m->beat() > beats) {
+					/* this is the meter after the one our beat is on*/
+					break;
+				}
+			}
+
+			prev_m = m;
+		}
+	}
+
+	const double beats_in_ms = beats - prev_m->beat();
+	const uint32_t bars_in_ms = (uint32_t) floor (beats_in_ms / prev_m->divisions_per_bar());
+	const uint32_t total_bars = bars_in_ms + (prev_m->bbt().bars - 1);
+	const double remaining_beats = beats_in_ms - (bars_in_ms * prev_m->divisions_per_bar());
+	const double remaining_ticks = (remaining_beats - floor (remaining_beats)) * BBT_Time::ticks_per_beat;
+
+	BBT_Time ret;
+
+	ret.ticks = (uint32_t) floor (remaining_ticks + 0.5);
+	ret.beats = (uint32_t) floor (remaining_beats);
+	ret.bars = total_bars;
+
+	/* 0 0 0 to 1 1 0 - based mapping*/
+	++ret.bars;
+	++ret.beats;
+
+	if (ret.ticks >= BBT_Time::ticks_per_beat) {
+		++ret.beats;
+		ret.ticks -= BBT_Time::ticks_per_beat;
+	}
+
+	if (ret.beats >= prev_m->divisions_per_bar() + 1) {
+		++ret.bars;
+		ret.beats = 1;
+	}
+
+	return ret;
+}
+
+double
+TempoMap::pulse_at_bbt (const Timecode::BBT_Time& bbt)
+{
+	Glib::Threads::RWLock::ReaderLock lm (lock);
+
+	return pulse_at_bbt_locked (_metrics, bbt);
+}
+
+double
+TempoMap::pulse_at_bbt_locked (const Metrics& metrics, const Timecode::BBT_Time& bbt) const
+{
+	/* CALLER HOLDS READ LOCK */
+
+	MeterSection* prev_m = 0;
+
+	/* because audio-locked meters have 'fake' integral beats,
+	   there is no pulse offset here.
+	*/
+	MeterSection* m;
+
+	for (Metrics::const_iterator i = metrics.begin(); i != metrics.end(); ++i) {
+		if (!(*i)->is_tempo()) {
+			m = static_cast<MeterSection*> (*i);
+			if (prev_m) {
+				if (m->bbt().bars > bbt.bars) {
+					break;
+				}
+			}
+			prev_m = m;
+		}
+	}
+
+	const double remaining_bars = bbt.bars - prev_m->bbt().bars;
+	const double remaining_pulses = remaining_bars * prev_m->divisions_per_bar() / prev_m->note_divisor();
+	const double ret = remaining_pulses + prev_m->pulse() + (((bbt.beats - 1) + (bbt.ticks / BBT_Time::ticks_per_beat)) / prev_m->note_divisor());
+
+	return ret;
+}
+
+Timecode::BBT_Time
+TempoMap::bbt_at_pulse (const double& pulse)
+{
+	Glib::Threads::RWLock::ReaderLock lm (lock);
+
+	return bbt_at_pulse_locked (_metrics, pulse);
+}
+
+Timecode::BBT_Time
+TempoMap::bbt_at_pulse_locked (const Metrics& metrics, const double& pulse) const
+{
+	MeterSection* prev_m = 0;
+
+	MeterSection* m = 0;
+
+	for (Metrics::const_iterator i = metrics.begin(); i != metrics.end(); ++i) {
+
+		if (!(*i)->is_tempo()) {
+			m = static_cast<MeterSection*> (*i);
+
+			if (prev_m) {
+				double const pulses_to_m = m->pulse() - prev_m->pulse();
+				if (prev_m->pulse() + pulses_to_m > pulse) {
+					/* this is the meter after the one our beat is on*/
+					break;
+				}
+			}
+
+			prev_m = m;
+		}
+	}
+
+	const double beats_in_ms = (pulse - prev_m->pulse()) * prev_m->note_divisor();
+	const uint32_t bars_in_ms = (uint32_t) floor (beats_in_ms / prev_m->divisions_per_bar());
+	const uint32_t total_bars = bars_in_ms + (prev_m->bbt().bars - 1);
+	const double remaining_beats = beats_in_ms - (bars_in_ms * prev_m->divisions_per_bar());
+	const double remaining_ticks = (remaining_beats - floor (remaining_beats)) * BBT_Time::ticks_per_beat;
+
+	BBT_Time ret;
+
+	ret.ticks = (uint32_t) floor (remaining_ticks + 0.5);
+	ret.beats = (uint32_t) floor (remaining_beats);
+	ret.bars = total_bars;
+
+	/* 0 0 0 to 1 1 0 mapping*/
+	++ret.bars;
+	++ret.beats;
+
+	if (ret.ticks >= BBT_Time::ticks_per_beat) {
+		++ret.beats;
+		ret.ticks -= BBT_Time::ticks_per_beat;
+	}
+
+	if (ret.beats >= prev_m->divisions_per_bar() + 1) {
+		++ret.bars;
+		ret.beats = 1;
+	}
+
+	return ret;
+}
+
+BBT_Time
+TempoMap::bbt_at_frame (framepos_t frame)
+{
+	if (frame < 0) {
+		BBT_Time bbt;
+		bbt.bars = 1;
+		bbt.beats = 1;
+		bbt.ticks = 0;
+		warning << string_compose (_("tempo map asked for BBT time at frame %1\n"), frame) << endmsg;
+		return bbt;
+	}
+	Glib::Threads::RWLock::ReaderLock lm (lock);
+
+	return bbt_at_frame_locked (_metrics, frame);
+}
+
+BBT_Time
+TempoMap::bbt_at_frame_rt (framepos_t frame)
+{
+	Glib::Threads::RWLock::ReaderLock lm (lock, Glib::Threads::TRY_LOCK);
+
+	if (!lm.locked()) {
+		throw std::logic_error ("TempoMap::bbt_time_rt() could not lock tempo map");
+	}
+
+	return bbt_at_frame_locked (_metrics, frame);
+}
+
+Timecode::BBT_Time
+TempoMap::bbt_at_frame_locked (const Metrics& metrics, const framepos_t& frame) const
+{
+	if (frame < 0) {
+		BBT_Time bbt;
+		bbt.bars = 1;
+		bbt.beats = 1;
+		bbt.ticks = 0;
+		warning << string_compose (_("tempo map asked for BBT time at frame %1\n"), frame) << endmsg;
+		return bbt;
+	}
+
+	const TempoSection& ts = tempo_section_at_frame_locked (metrics, frame);
+	MeterSection* prev_m = 0;
+	MeterSection* next_m = 0;
+
+	MeterSection* m;
+
+	for (Metrics::const_iterator i = metrics.begin(); i != metrics.end(); ++i) {
+		if (!(*i)->is_tempo()) {
+			m = static_cast<MeterSection*> (*i);
+			if (prev_m && m->frame() > frame) {
+				next_m = m;
+				break;
+			}
+			prev_m = m;
+		}
+	}
+
+	double beat = prev_m->beat() + (ts.pulse_at_frame (frame, _frame_rate) - prev_m->pulse()) * prev_m->note_divisor();
+
+	/* handle frame before first meter */
+	if (frame < prev_m->frame()) {
+		beat = 0.0;
+	}
+	/* audio locked meters fake their beat */
+	if (next_m && next_m->beat() < beat) {
+		beat = next_m->beat();
+	}
+
+	beat = max (0.0, beat);
+
+	const double beats_in_ms = beat - prev_m->beat();
+	const uint32_t bars_in_ms = (uint32_t) floor (beats_in_ms / prev_m->divisions_per_bar());
+	const uint32_t total_bars = bars_in_ms + (prev_m->bbt().bars - 1);
+	const double remaining_beats = beats_in_ms - (bars_in_ms * prev_m->divisions_per_bar());
+	const double remaining_ticks = (remaining_beats - floor (remaining_beats)) * BBT_Time::ticks_per_beat;
+
+	BBT_Time ret;
+
+	ret.ticks = (uint32_t) floor (remaining_ticks + 0.5);
+	ret.beats = (uint32_t) floor (remaining_beats);
+	ret.bars = total_bars;
+
+	/* 0 0 0 to 1 1 0 - based mapping*/
+	++ret.bars;
+	++ret.beats;
+
+	if (ret.ticks >= BBT_Time::ticks_per_beat) {
+		++ret.beats;
+		ret.ticks -= BBT_Time::ticks_per_beat;
+	}
+
+	if (ret.beats >= prev_m->divisions_per_bar() + 1) {
+		++ret.bars;
+		ret.beats = 1;
+	}
+
+	return ret;
+}
+
+framepos_t
+TempoMap::frame_at_bbt (const BBT_Time& bbt)
+{
+	if (bbt.bars < 1) {
+		warning << string_compose (_("tempo map asked for frame time at bar < 1  (%1)\n"), bbt) << endmsg;
+		return 0;
+	}
+
+	if (bbt.beats < 1) {
+		throw std::logic_error ("beats are counted from one");
+	}
+	Glib::Threads::RWLock::ReaderLock lm (lock);
+
+	return frame_at_bbt_locked (_metrics, bbt);
+}
+
+/* meter & tempo section based */
+framepos_t
+TempoMap::frame_at_bbt_locked (const Metrics& metrics, const BBT_Time& bbt) const
+{
+	/* HOLD THE READER LOCK */
+
+	const framepos_t ret = frame_at_beat_locked (metrics, beat_at_bbt_locked (metrics, bbt));
+	return ret;
+}
+
+bool
+TempoMap::check_solved (const Metrics& metrics) const
+{
+	TempoSection* prev_t = 0;
+	MeterSection* prev_m = 0;
+
+	for (Metrics::const_iterator i = metrics.begin(); i != metrics.end(); ++i) {
+		TempoSection* t;
+		MeterSection* m;
+		if ((*i)->is_tempo()) {
+			t = static_cast<TempoSection*> (*i);
+			if (!t->active()) {
+				continue;
+			}
+			if (prev_t) {
+				/* check ordering */
+				if ((t->frame() <= prev_t->frame()) || (t->pulse() <= prev_t->pulse())) {
+					return false;
+				}
+
+				/* precision check ensures tempo and frames align.*/
+				if (t->frame() != prev_t->frame_at_tempo (t->pulses_per_minute(), t->pulse(), _frame_rate)) {
+					if (!t->locked_to_meter()) {
+						return false;
+					}
+				}
+
+				/* gradient limit - who knows what it should be?
+				   things are also ok (if a little chaotic) without this
+				*/
+				if (fabs (prev_t->c_func()) > 1000.0) {
+					//std::cout << "c : " << prev_t->c_func() << std::endl;
+					return false;
+				}
+			}
+			prev_t = t;
+		}
+
+		if (!(*i)->is_tempo()) {
+			m = static_cast<MeterSection*> (*i);
+			if (prev_m && m->position_lock_style() == AudioTime) {
+				const TempoSection* t = &tempo_section_at_frame_locked (metrics, m->frame() - 1);
+				const framepos_t nascent_m_frame = t->frame_at_pulse (m->pulse(), _frame_rate);
+				/* Here we check that a preceding section of music doesn't overlap a subsequent one.
+				   It is complicated by the fact that audio locked meters represent a discontinuity in the pulse
+				   (they place an exact pulse at a particular time expressed only in frames).
+				   This has the effect of shifting the calculated frame at the meter pulse (wrt the previous section of music)
+				   away from its actual frame (which is now the frame location of the exact pulse).
+				   This can result in the calculated frame (from the previous musical section)
+				   differing from the exact frame by one sample.
+				   Allow for that.
+				*/
+				if (t && (nascent_m_frame > m->frame() + 1 || nascent_m_frame < 0)) {
+					return false;
+				}
+			}
+
+			prev_m = m;
+		}
+
+	}
+
+	return true;
+}
+
+bool
+TempoMap::set_active_tempos (const Metrics& metrics, const framepos_t& frame)
+{
+	for (Metrics::const_iterator i = metrics.begin(); i != metrics.end(); ++i) {
+		TempoSection* t;
+		if ((*i)->is_tempo()) {
+			t = static_cast<TempoSection*> (*i);
+			if (!t->movable()) {
+				t->set_active (true);
+				continue;
+			}
+			if (t->movable() && t->active () && t->position_lock_style() == AudioTime && t->frame() < frame) {
+				t->set_active (false);
+				t->set_pulse (0.0);
+			} else if (t->movable() && t->position_lock_style() == AudioTime && t->frame() > frame) {
+				t->set_active (true);
+			} else if (t->movable() && t->position_lock_style() == AudioTime && t->frame() == frame) {
+				return false;
+			}
+		}
+	}
+	return true;
+}
+
+bool
+TempoMap::solve_map_frame (Metrics& imaginary, TempoSection* section, const framepos_t& frame)
+{
+	TempoSection* prev_t = 0;
+	TempoSection* section_prev = 0;
+	framepos_t first_m_frame = 0;
+
+	/* can't move a tempo before the first meter */
+	for (Metrics::iterator i = imaginary.begin(); i != imaginary.end(); ++i) {
+		MeterSection* m;
+		if (!(*i)->is_tempo()) {
+			m = static_cast<MeterSection*> (*i);
+			if (!m->movable()) {
+				first_m_frame = m->frame();
+				break;
+			}
+		}
+	}
+	if (section->movable() && frame <= first_m_frame) {
+		return false;
+	}
+
+	section->set_active (true);
+	section->set_frame (frame);
+
+	for (Metrics::iterator i = imaginary.begin(); i != imaginary.end(); ++i) {
+		TempoSection* t;
+		if ((*i)->is_tempo()) {
+			t = static_cast<TempoSection*> (*i);
+
+			if (!t->active()) {
+				continue;
+			}
+			if (prev_t) {
+				if (t == section) {
+					section_prev = prev_t;
+					if (t->locked_to_meter()) {
+						prev_t = t;
+					}
+					continue;
+				}
+				if (t->position_lock_style() == MusicTime) {
+					prev_t->set_c_func (prev_t->compute_c_func_pulse (t->pulses_per_minute(), t->pulse(), _frame_rate));
+					t->set_frame (prev_t->frame_at_pulse (t->pulse(), _frame_rate));
+				} else {
+					prev_t->set_c_func (prev_t->compute_c_func_frame (t->pulses_per_minute(), t->frame(), _frame_rate));
+					if (!t->locked_to_meter()) {
+						t->set_pulse (prev_t->pulse_at_frame (t->frame(), _frame_rate));
+					}
+				}
+			}
+			prev_t = t;
+		}
+	}
+
+	if (section_prev) {
+		section_prev->set_c_func (section_prev->compute_c_func_frame (section->pulses_per_minute(), frame, _frame_rate));
+		if (!section->locked_to_meter()) {
+			section->set_pulse (section_prev->pulse_at_frame (frame, _frame_rate));
+		}
+	}
+
+#if (0)
+	recompute_tempi (imaginary);
+
+	if (check_solved (imaginary)) {
+		return true;
+	} else {
+		dunp (imaginary, std::cout);
+	}
+#endif
+
+	MetricSectionFrameSorter fcmp;
+	imaginary.sort (fcmp);
+
+	recompute_tempi (imaginary);
+
+	if (check_solved (imaginary)) {
+		return true;
+	}
+
+	return false;
+}
+
+bool
+TempoMap::solve_map_pulse (Metrics& imaginary, TempoSection* section, const double& pulse)
+{
+	TempoSection* prev_t = 0;
+	TempoSection* section_prev = 0;
+
+	section->set_pulse (pulse);
+
+	for (Metrics::iterator i = imaginary.begin(); i != imaginary.end(); ++i) {
+		TempoSection* t;
+		if ((*i)->is_tempo()) {
+			t = static_cast<TempoSection*> (*i);
+			if (!t->active()) {
+				continue;
+			}
+			if (!t->movable()) {
+				t->set_pulse (0.0);
+				prev_t = t;
+				continue;
+			}
+			if (prev_t) {
+				if (t == section) {
+					section_prev = prev_t;
+					continue;
+				}
+				if (t->position_lock_style() == MusicTime) {
+					prev_t->set_c_func (prev_t->compute_c_func_pulse (t->pulses_per_minute(), t->pulse(), _frame_rate));
+					t->set_frame (prev_t->frame_at_pulse (t->pulse(), _frame_rate));
+				} else {
+					prev_t->set_c_func (prev_t->compute_c_func_frame (t->pulses_per_minute(), t->frame(), _frame_rate));
+					if (!t->locked_to_meter()) {
+						t->set_pulse (prev_t->pulse_at_frame (t->frame(), _frame_rate));
+					}
+				}
+			}
+			prev_t = t;
+		}
+	}
+
+	if (section_prev) {
+		section_prev->set_c_func (section_prev->compute_c_func_pulse (section->pulses_per_minute(), pulse, _frame_rate));
+		section->set_frame (section_prev->frame_at_pulse (pulse, _frame_rate));
+	}
+
+#if (0)
+	recompute_tempi (imaginary);
+
+	if (check_solved (imaginary)) {
+		return true;
+	} else {
+		dunp (imaginary, std::cout);
+	}
+#endif
+
+	MetricSectionSorter cmp;
+	imaginary.sort (cmp);
+
+	recompute_tempi (imaginary);
+	/* Reordering
+	 * XX need a restriction here, but only for this case,
+	 * as audio locked tempos don't interact in the same way.
+	 *
+	 * With music-locked tempos, the solution to cross-dragging can fly off the screen
+	 * e.g.
+	 * |50 bpm                        |250 bpm |60 bpm
+	 *                drag 250 to the pulse after 60->
+	 * a clue: dragging the second 60 <- past the 250 would cause no such problem.
+	 */
+	if (check_solved (imaginary)) {
+		return true;
+	}
+
+	return false;
+}
+
+bool
+TempoMap::solve_map_frame (Metrics& imaginary, MeterSection* section, const framepos_t& frame)
+{
+	/* disallow moving first meter past any subsequent one, and any movable meter before the first one */
+	const MeterSection* other =  &meter_section_at_frame_locked (imaginary, frame);
+	if ((!section->movable() && other->movable()) || (!other->movable() && section->movable() && other->frame() >= frame)) {
+		return false;
+	}
+
+	if (!section->movable()) {
+		/* lock the first tempo to our first meter */
+		if (!set_active_tempos (imaginary, frame)) {
+			return false;
+		}
+	}
+
+	TempoSection* meter_locked_tempo = 0;
+
+	for (Metrics::const_iterator ii = imaginary.begin(); ii != imaginary.end(); ++ii) {
+		TempoSection* t;
+		if ((*ii)->is_tempo()) {
+			t = static_cast<TempoSection*> (*ii);
+			if ((t->locked_to_meter() || !t->movable()) && t->frame() == section->frame()) {
+				meter_locked_tempo = t;
+				break;
+			}
+		}
+	}
+
+	if (!meter_locked_tempo) {
+		return false;
+	}
+
+	MeterSection* prev_m = 0;
+	Metrics future_map;
+	TempoSection* tempo_copy = copy_metrics_and_point (imaginary, future_map, meter_locked_tempo);
+	bool solved = false;
+
+	for (Metrics::iterator i = imaginary.begin(); i != imaginary.end(); ++i) {
+		MeterSection* m;
+		if (!(*i)->is_tempo()) {
+			m = static_cast<MeterSection*> (*i);
+			if (m == section){
+				if (prev_m && section->movable()) {
+					const double beats = (pulse_at_frame_locked (imaginary, frame) - prev_m->pulse()) * prev_m->note_divisor();
+					if (beats + prev_m->beat() < section->beat()) {
+						/* set the frame/pulse corresponding to its musical position,
+						 * as an earlier time than this has been requested.
+						*/
+						const double new_pulse = ((section->beat() - prev_m->beat())
+									  / prev_m->note_divisor()) + prev_m->pulse();
+
+						const framepos_t smallest_frame = frame_at_pulse_locked (future_map, new_pulse);
+
+						if ((solved = solve_map_frame (future_map, tempo_copy, smallest_frame))) {
+							meter_locked_tempo->set_pulse (new_pulse);
+							solve_map_frame (imaginary, meter_locked_tempo, smallest_frame);
+							section->set_frame (smallest_frame);
+							section->set_pulse (new_pulse);
+						} else {
+							solved = false;
+						}
+
+						Metrics::const_iterator d = future_map.begin();
+						while (d != future_map.end()) {
+							delete (*d);
+							++d;
+						}
+
+						if (!solved) {
+							return false;
+						}
+					} else {
+						/* all is ok. set section's locked tempo if allowed.
+						   possibly disallowed if there is an adjacent audio-locked tempo.
+						   XX this check could possibly go. its never actually happened here.
+						*/
+						MeterSection* meter_copy = const_cast<MeterSection*> (&meter_section_at_frame_locked (future_map, section->frame()));
+						meter_copy->set_frame (frame);
+
+						if ((solved = solve_map_frame (future_map, tempo_copy, frame))) {
+							section->set_frame (frame);
+							meter_locked_tempo->set_pulse (((section->beat() - prev_m->beat())
+												/ prev_m->note_divisor()) + prev_m->pulse());
+							solve_map_frame (imaginary, meter_locked_tempo, frame);
+						} else {
+							solved = false;
+						}
+
+						Metrics::const_iterator d = future_map.begin();
+						while (d != future_map.end()) {
+							delete (*d);
+							++d;
+						}
+
+						if (!solved) {
+							return false;
+						}
+					}
+				} else {
+					/* not movable (first meter atm) */
+
+					tempo_copy->set_frame (frame);
+					tempo_copy->set_pulse (0.0);
+
+					if ((solved = solve_map_frame (future_map, tempo_copy, frame))) {
+						section->set_frame (frame);
+						meter_locked_tempo->set_frame (frame);
+						meter_locked_tempo->set_pulse (0.0);
+						solve_map_frame (imaginary, meter_locked_tempo, frame);
+					} else {
+						solved = false;
+					}
+
+					Metrics::const_iterator d = future_map.begin();
+					while (d != future_map.end()) {
+						delete (*d);
+						++d;
+					}
+
+					if (!solved) {
+						return false;
+					}
+
+					pair<double, BBT_Time> b_bbt = make_pair (0.0, BBT_Time (1, 1, 0));
+					section->set_beat (b_bbt);
+					section->set_pulse (0.0);
+
+				}
+				break;
+			}
+
+			prev_m = m;
+		}
+	}
+
+	MetricSectionFrameSorter fcmp;
+	imaginary.sort (fcmp);
+
+	recompute_meters (imaginary);
+
+	return true;
+}
+
+bool
+TempoMap::solve_map_bbt (Metrics& imaginary, MeterSection* section, const BBT_Time& when)
+{
+	/* disallow setting section to an existing meter's bbt */
+	for (Metrics::iterator i = imaginary.begin(); i != imaginary.end(); ++i) {
+		MeterSection* m;
+		if (!(*i)->is_tempo()) {
+			m = static_cast<MeterSection*> (*i);
+			if (m != section && m->bbt().bars == when.bars) {
+				return false;
+			}
+		}
+	}
+
+	MeterSection* prev_m = 0;
+	MeterSection* section_prev = 0;
+
+	for (Metrics::iterator i = imaginary.begin(); i != imaginary.end(); ++i) {
+		MeterSection* m;
+		if (!(*i)->is_tempo()) {
+			m = static_cast<MeterSection*> (*i);
+			pair<double, BBT_Time> b_bbt;
+			double new_pulse = 0.0;
+
+			if (prev_m && m->bbt().bars > when.bars && !section_prev){
+				section_prev = prev_m;
+				const double beats = (when.bars - section_prev->bbt().bars) * section_prev->divisions_per_bar();
+				const double pulse = (beats / section_prev->note_divisor()) + section_prev->pulse();
+				pair<double, BBT_Time> b_bbt = make_pair (beats + section_prev->beat(), when);
+
+				section->set_beat (b_bbt);
+				section->set_pulse (pulse);
+				section->set_frame (frame_at_pulse_locked (imaginary, pulse));
+				prev_m = section;
+				continue;
+			}
+
+			if (m->position_lock_style() == AudioTime) {
+				TempoSection* meter_locked_tempo = 0;
+
+				for (Metrics::const_iterator ii = imaginary.begin(); ii != imaginary.end(); ++ii) {
+					TempoSection* t;
+					if ((*ii)->is_tempo()) {
+						t = static_cast<TempoSection*> (*ii);
+						if ((t->locked_to_meter() || !t->movable()) && t->frame() == m->frame()) {
+							meter_locked_tempo = t;
+							break;
+						}
+					}
+				}
+
+				if (!meter_locked_tempo) {
+					return false;
+				}
+
+				if (prev_m) {
+					const double beats = ((m->bbt().bars - prev_m->bbt().bars) * prev_m->divisions_per_bar());
+
+					if (beats + prev_m->beat() != m->beat()) {
+						/* tempo/ meter change caused a change in beat (bar). */
+						b_bbt = make_pair (beats + prev_m->beat()
+								   , BBT_Time ((beats / prev_m->divisions_per_bar()) + prev_m->bbt().bars, 1, 0));
+						new_pulse = prev_m->pulse() + (beats / prev_m->note_divisor());
+					} else if (m->movable()) {
+						b_bbt = make_pair (m->beat(), m->bbt());
+						new_pulse = prev_m->pulse() + (beats / prev_m->note_divisor());
+					}
+				} else {
+					b_bbt = make_pair (0.0, BBT_Time (1, 1, 0));
+				}
+
+				meter_locked_tempo->set_pulse (new_pulse);
+				m->set_beat (b_bbt);
+				m->set_pulse (new_pulse);
+
+			} else {
+				/* MusicTime */
+				const double beats = ((m->bbt().bars - prev_m->bbt().bars) * prev_m->divisions_per_bar());
+				if (beats + prev_m->beat() != m->beat()) {
+					/* tempo/ meter change caused a change in beat (bar). */
+					b_bbt = make_pair (beats + prev_m->beat()
+							   , BBT_Time ((beats / prev_m->divisions_per_bar()) + prev_m->bbt().bars, 1, 0));
+				} else {
+					b_bbt = make_pair (beats + prev_m->beat()
+							   , m->bbt());
+				}
+				new_pulse = (beats / prev_m->note_divisor()) + prev_m->pulse();
+				m->set_beat (b_bbt);
+				m->set_pulse (new_pulse);
+				m->set_frame (frame_at_pulse_locked (imaginary, new_pulse));
+			}
+
+			prev_m = m;
+		}
+	}
+
+	if (!section_prev) {
+
+		const double beats = (when.bars - prev_m->bbt().bars) * prev_m->divisions_per_bar();
+		const double pulse = (beats / prev_m->note_divisor()) + prev_m->pulse();
+		pair<double, BBT_Time> b_bbt = make_pair (beats + prev_m->beat(), when);
+
+		section->set_beat (b_bbt);
+		section->set_pulse (pulse);
+		section->set_frame (frame_at_pulse_locked (imaginary, pulse));
+	}
+
+	MetricSectionSorter cmp;
+	imaginary.sort (cmp);
+
+	recompute_meters (imaginary);
+
+	return true;
+}
+
+/** places a copy of _metrics into copy and returns a pointer
+ *  to section's equivalent in copy.
+ */
+TempoSection*
+TempoMap::copy_metrics_and_point (const Metrics& metrics, Metrics& copy, TempoSection* section)
+{
+	TempoSection* ret = 0;
+
+	for (Metrics::const_iterator i = metrics.begin(); i != metrics.end(); ++i) {
+		TempoSection* t;
+		MeterSection* m;
+		if ((*i)->is_tempo()) {
+			t = static_cast<TempoSection*> (*i);
+			if (t == section) {
+				ret = new TempoSection (*t);
+				copy.push_back (ret);
+				continue;
+			}
+
+			TempoSection* cp = new TempoSection (*t);
+			copy.push_back (cp);
+		}
+		if (!(*i)->is_tempo()) {
+			m = static_cast<MeterSection *> (*i);
+			MeterSection* cp = new MeterSection (*m);
+			copy.push_back (cp);
+		}
+	}
+
+	return ret;
+}
+
+MeterSection*
+TempoMap::copy_metrics_and_point (const Metrics& metrics, Metrics& copy, MeterSection* section)
+{
+	MeterSection* ret = 0;
+
+	for (Metrics::const_iterator i = metrics.begin(); i != metrics.end(); ++i) {
+		TempoSection* t;
+		MeterSection* m;
+		if ((*i)->is_tempo()) {
+			t = static_cast<TempoSection*> (*i);
+			TempoSection* cp = new TempoSection (*t);
+			copy.push_back (cp);
+		}
+
+		if (!(*i)->is_tempo()) {
+			m = static_cast<MeterSection *> (*i);
+			if (m == section) {
+				ret = new MeterSection (*m);
+				copy.push_back (ret);
+				continue;
+			}
+			MeterSection* cp = new MeterSection (*m);
+			copy.push_back (cp);
+		}
+	}
+
+	return ret;
+}
+
+/** answers the question "is this a valid beat position for this tempo section?".
+ *  it returns true if the tempo section can be moved to the requested bbt position,
+ *  leaving the tempo map in a solved state.
+ * @param section the tempo section to be moved
+ * @param bbt the requested new position for the tempo section
+ * @return true if the tempo section can be moved to the position, otherwise false.
+ */
+bool
+TempoMap::can_solve_bbt (TempoSection* ts, const BBT_Time& bbt)
+{
+	Metrics copy;
+	TempoSection* tempo_copy = 0;
+
+	{
+		Glib::Threads::RWLock::ReaderLock lm (lock);
+		tempo_copy = copy_metrics_and_point (_metrics, copy, ts);
+		if (!tempo_copy) {
+			return false;
+		}
+	}
+
+	const bool ret = solve_map_pulse (copy, tempo_copy, pulse_at_bbt_locked (copy, bbt));
+
+	Metrics::const_iterator d = copy.begin();
+	while (d != copy.end()) {
+		delete (*d);
+		++d;
+	}
+
+	return ret;
+}
+
+/**
+* This is for a gui that needs to know the pulse or frame of a tempo section if it were to be moved to some bbt time,
+* taking any possible reordering as a consequence of this into account.
+* @param section - the section to be altered
+* @param bbt - the bbt where the altered tempo will fall
+* @return returns - the position in pulses and frames (as a pair) where the new tempo section will lie.
+*/
+pair<double, framepos_t>
+TempoMap::predict_tempo_position (TempoSection* section, const BBT_Time& bbt)
+{
+	Metrics future_map;
+	pair<double, framepos_t> ret = make_pair (0.0, 0);
+
+	Glib::Threads::RWLock::ReaderLock lm (lock);
+
+	TempoSection* tempo_copy = copy_metrics_and_point (_metrics, future_map, section);
+
+	const double beat = beat_at_bbt_locked (future_map, bbt);
+
+	if (solve_map_pulse (future_map, tempo_copy, pulse_at_beat_locked (future_map, beat))) {
+		ret.first = tempo_copy->pulse();
+		ret.second = tempo_copy->frame();
+	} else {
+		ret.first = section->pulse();
+		ret.second = section->frame();
+	}
+
+	Metrics::const_iterator d = future_map.begin();
+	while (d != future_map.end()) {
+		delete (*d);
+		++d;
+	}
+	return ret;
+}
+
+void
+TempoMap::gui_move_tempo (TempoSection* ts, const framepos_t& frame, const int& sub_num)
+{
+	Metrics future_map;
+	bool was_musical = ts->position_lock_style() == MusicTime;
+
+	if (sub_num == 0 && was_musical) {
+		/* if we're not snapping to music,
+		   AudioTime and MusicTime may be treated identically.
+		*/
+		ts->set_position_lock_style (AudioTime);
+	}
 
-	BBTPointList::const_iterator s = bbt_before_or_at (BBT_Time (1, 1, 0));
-	BBTPointList::const_iterator e = bbt_before_or_at (BBT_Time (bbt.bars, bbt.beats, 0));
+	if (ts->position_lock_style() == MusicTime) {
+		{
+			/* if we're snapping to a musical grid, set the pulse exactly instead of via the supplied frame. */
+			Glib::Threads::RWLock::WriterLock lm (lock);
+			TempoSection* tempo_copy = copy_metrics_and_point (_metrics, future_map, ts);
+			const double beat = exact_beat_at_frame_locked (future_map, frame, sub_num);
+			double pulse = pulse_at_beat_locked (future_map, beat);
+
+			if (solve_map_pulse (future_map, tempo_copy, pulse)) {
+				solve_map_pulse (_metrics, ts, pulse);
+				recompute_meters (_metrics);
+			}
+		}
 
-	if (bbt.ticks != 0) {
-		return ((*e).frame - (*s).frame) +
-			llrint ((*e).tempo->frames_per_beat (_frame_rate) * (bbt.ticks/BBT_Time::ticks_per_beat));
 	} else {
-		return ((*e).frame - (*s).frame);
+
+		{
+			Glib::Threads::RWLock::WriterLock lm (lock);
+			TempoSection* tempo_copy = copy_metrics_and_point (_metrics, future_map, ts);
+			if (solve_map_frame (future_map, tempo_copy, frame)) {
+				solve_map_frame (_metrics, ts, frame);
+				recompute_meters (_metrics);
+			}
+		}
 	}
+
+	if (sub_num == 0 && was_musical) {
+		ts->set_position_lock_style (MusicTime);
+	}
+
+	Metrics::const_iterator d = future_map.begin();
+	while (d != future_map.end()) {
+		delete (*d);
+		++d;
+	}
+
+	MetricPositionChanged (); // Emit Signal
 }
 
-framecnt_t
-TempoMap::bbt_duration_at (framepos_t pos, const BBT_Time& bbt, int dir)
+void
+TempoMap::gui_move_meter (MeterSection* ms, const framepos_t& frame)
 {
-	BBT_Time when;
-	bbt_time (pos, when);
+	Metrics future_map;
 
-	Glib::Threads::RWLock::ReaderLock lm (lock);
-	return bbt_duration_at_unlocked (when, bbt, dir);
+	if (ms->position_lock_style() == AudioTime) {
+
+		{
+			Glib::Threads::RWLock::WriterLock lm (lock);
+			MeterSection* copy = copy_metrics_and_point (_metrics, future_map, ms);
+
+			if (solve_map_frame (future_map, copy, frame)) {
+				solve_map_frame (_metrics, ms, frame);
+				recompute_tempi (_metrics);
+			}
+		}
+	} else {
+		{
+			Glib::Threads::RWLock::WriterLock lm (lock);
+			MeterSection* copy = copy_metrics_and_point (_metrics, future_map, ms);
+
+			const double beat = beat_at_frame_locked (_metrics, frame);
+			const Timecode::BBT_Time bbt = bbt_at_beat_locked (_metrics, beat);
+
+			if (solve_map_bbt (future_map, copy, bbt)) {
+				solve_map_bbt (_metrics, ms, bbt);
+				recompute_tempi (_metrics);
+			}
+		}
+	}
+
+	Metrics::const_iterator d = future_map.begin();
+	while (d != future_map.end()) {
+		delete (*d);
+		++d;
+	}
+
+	MetricPositionChanged (); // Emit Signal
 }
 
-framecnt_t
-TempoMap::bbt_duration_at_unlocked (const BBT_Time& when, const BBT_Time& bbt, int /*dir*/)
+bool
+TempoMap::gui_change_tempo (TempoSection* ts, const Tempo& bpm)
 {
-	if (bbt.bars == 0 && bbt.beats == 0 && bbt.ticks == 0) {
-		return 0;
+	Metrics future_map;
+	bool can_solve = false;
+	{
+		Glib::Threads::RWLock::WriterLock lm (lock);
+		TempoSection* tempo_copy = copy_metrics_and_point (_metrics, future_map, ts);
+		tempo_copy->set_beats_per_minute (bpm.beats_per_minute());
+		recompute_tempi (future_map);
+
+		if (check_solved (future_map)) {
+			ts->set_beats_per_minute (bpm.beats_per_minute());
+			recompute_map (_metrics);
+			can_solve = true;
+		}
+	}
+
+	Metrics::const_iterator d = future_map.begin();
+	while (d != future_map.end()) {
+		delete (*d);
+		++d;
+	}
+	if (can_solve) {
+		MetricPositionChanged (); // Emit Signal
 	}
+	return can_solve;
+}
+
+void
+TempoMap::gui_dilate_tempo (TempoSection* ts, const framepos_t& frame, const framepos_t& end_frame, const double& pulse)
+{
+	/*
+	  Ts (future prev_t)   Tnext
+	  |                    |
+	  |     [drag^]        |
+	  |----------|----------
+	        e_f  pulse(frame)
+	*/
+
+	Metrics future_map;
+
+	{
+		Glib::Threads::RWLock::WriterLock lm (lock);
+
+		if (!ts) {
+			return;
+		}
+
+		TempoSection* prev_t = copy_metrics_and_point (_metrics, future_map, ts);
+		TempoSection* prev_to_prev_t = 0;
+		const frameoffset_t fr_off = end_frame - frame;
+
+		if (prev_t && prev_t->pulse() > 0.0) {
+			prev_to_prev_t = const_cast<TempoSection*>(&tempo_section_at_frame_locked (future_map, prev_t->frame() - 1));
+		}
+
+		TempoSection* next_t = 0;
+		for (Metrics::iterator i = future_map.begin(); i != future_map.end(); ++i) {
+			TempoSection* t = 0;
+			if ((*i)->is_tempo()) {
+				t = static_cast<TempoSection*> (*i);
+				if (t->frame() > ts->frame()) {
+					next_t = t;
+					break;
+				}
+			}
+		}
+		/* minimum allowed measurement distance in frames */
+		const framepos_t min_dframe = 2;
+
+		/* the change in frames is the result of changing the slope of at most 2 previous tempo sections.
+		   constant to constant is straightforward, as the tempo prev to prev_t has constant slope.
+		*/
+		double contribution = 0.0;
+
+		if (next_t && prev_to_prev_t && prev_to_prev_t->type() == TempoSection::Ramp) {
+			contribution = (prev_t->frame() - prev_to_prev_t->frame()) / (double) (next_t->frame() - prev_to_prev_t->frame());
+		}
+
+		const frameoffset_t prev_t_frame_contribution = fr_off - (contribution * (double) fr_off);
+
+		const double start_pulse = prev_t->pulse_at_frame (frame, _frame_rate);
+		const double end_pulse = prev_t->pulse_at_frame (end_frame, _frame_rate);
+
+		double new_bpm;
+
+		if (prev_t->type() == TempoSection::Constant || prev_t->c_func() == 0.0) {
+
+			if (prev_t->position_lock_style() == MusicTime) {
+				if (prev_to_prev_t && prev_to_prev_t->type() == TempoSection::Ramp) {
+					if (frame > prev_to_prev_t->frame() + min_dframe && (frame + prev_t_frame_contribution) > prev_to_prev_t->frame() + min_dframe) {
+
+						new_bpm = prev_t->beats_per_minute() * ((frame - prev_to_prev_t->frame())
+											/ (double) ((frame + prev_t_frame_contribution) - prev_to_prev_t->frame()));
+					} else {
+						new_bpm = prev_t->beats_per_minute();
+					}
+				} else {
+					/* prev to prev is irrelevant */
+
+					if (start_pulse > prev_t->pulse() && end_pulse > prev_t->pulse()) {
+						new_bpm = prev_t->beats_per_minute() * ((start_pulse - prev_t->pulse()) / (end_pulse - prev_t->pulse()));
+					} else {
+						new_bpm = prev_t->beats_per_minute();
+					}
+				}
+			} else {
+				/* AudioTime */
+				if (prev_to_prev_t && prev_to_prev_t->type() == TempoSection::Ramp) {
+					if (frame > prev_to_prev_t->frame() + min_dframe && end_frame > prev_to_prev_t->frame() + min_dframe) {
+
+						new_bpm = prev_t->beats_per_minute() * ((frame - prev_to_prev_t->frame())
+											/ (double) ((end_frame) - prev_to_prev_t->frame()));
+					} else {
+						new_bpm = prev_t->beats_per_minute();
+					}
+				} else {
+					/* prev_to_prev_t is irrelevant */
+
+					if (frame > prev_t->frame() + min_dframe && end_frame > prev_t->frame() + min_dframe) {
+						new_bpm = prev_t->beats_per_minute() * ((frame - prev_t->frame()) / (double) (end_frame - prev_t->frame()));
+					} else {
+						new_bpm = prev_t->beats_per_minute();
+					}
+				}
+			}
+		} else {
 
-	/* round back to the previous precise beat */
-	BBTPointList::const_iterator wi = bbt_before_or_at (BBT_Time (when.bars, when.beats, 0));
-	BBTPointList::const_iterator start (wi);
+			double frame_ratio = 1.0;
+			double pulse_ratio = 1.0;
+			const framepos_t pulse_pos = prev_t->frame_at_pulse (pulse, _frame_rate);
 
-	assert (wi != _map.end());
+			if (prev_to_prev_t) {
+				if (pulse_pos > prev_to_prev_t->frame() + min_dframe && (pulse_pos - fr_off) > prev_to_prev_t->frame() + min_dframe) {
+					frame_ratio = (((pulse_pos - fr_off) - prev_to_prev_t->frame()) / (double) ((pulse_pos) - prev_to_prev_t->frame()));
+				}
+				if (end_pulse > prev_to_prev_t->pulse() && start_pulse > prev_to_prev_t->pulse()) {
+					pulse_ratio = ((start_pulse - prev_to_prev_t->pulse()) / (end_pulse - prev_to_prev_t->pulse()));
+				}
+			} else {
+				if (pulse_pos > prev_t->frame() + min_dframe && (pulse_pos - fr_off) > prev_t->frame() + min_dframe) {
+					frame_ratio = (((pulse_pos - fr_off) - prev_t->frame()) / (double) ((pulse_pos) - prev_t->frame()));
+				}
+				pulse_ratio = (start_pulse / end_pulse);
+			}
+			new_bpm = prev_t->beats_per_minute() * (pulse_ratio * frame_ratio);
+		}
 
-	uint32_t bars = 0;
-	uint32_t beats = 0;
+		/* don't clamp and proceed here.
+		   testing has revealed that this can go negative,
+		   which is an entirely different thing to just being too low.
+		*/
+		if (new_bpm < 0.5) {
+			return;
+		}
+		new_bpm = min (new_bpm, (double) 1000.0);
+		prev_t->set_beats_per_minute (new_bpm);
+		recompute_tempi (future_map);
+		recompute_meters (future_map);
 
-	while (wi != _map.end() && bars < bbt.bars) {
-		++wi;
-		if ((*wi).is_bar()) {
-			++bars;
+		if (check_solved (future_map)) {
+			ts->set_beats_per_minute (new_bpm);
+			recompute_tempi (_metrics);
+			recompute_meters (_metrics);
 		}
 	}
-	assert (wi != _map.end());
 
-	while (wi != _map.end() && beats < bbt.beats) {
-		++wi;
-		++beats;
+	Metrics::const_iterator d = future_map.begin();
+	while (d != future_map.end()) {
+		delete (*d);
+		++d;
 	}
-	assert (wi != _map.end());
 
-	/* add any additional frames related to ticks in the added value */
+	MetricPositionChanged (); // Emit Signal
+}
 
-	if (bbt.ticks != 0) {
-		return ((*wi).frame - (*start).frame) +
-			(*wi).tempo->frames_per_beat (_frame_rate) * (bbt.ticks/BBT_Time::ticks_per_beat);
-	} else {
-		return ((*wi).frame - (*start).frame);
+double
+TempoMap::exact_beat_at_frame (const framepos_t& frame, const int32_t sub_num)
+{
+	Glib::Threads::RWLock::ReaderLock lm (lock);
+
+	return exact_beat_at_frame_locked (_metrics, frame, sub_num);
+}
+
+double
+TempoMap::exact_beat_at_frame_locked (const Metrics& metrics, const framepos_t& frame, const int32_t sub_num)
+{
+	double beat = beat_at_frame_locked (metrics, frame);
+	if (sub_num > 1) {
+		beat = floor (beat) + (floor (((beat - floor (beat)) * (double) sub_num) + 0.5) / sub_num);
+	} else if (sub_num == 1) {
+		/* snap to beat */
+		beat = floor (beat + 0.5);
+	} else if (sub_num == -1) {
+		/* snap to  bar */
+		Timecode::BBT_Time bbt = bbt_at_beat_locked (metrics, beat);
+		bbt.beats = 1;
+		bbt.ticks = 0;
+		beat = beat_at_bbt_locked (metrics, bbt);
 	}
+	return beat;
+}
+
+framecnt_t
+TempoMap::bbt_duration_at (framepos_t pos, const BBT_Time& bbt, int dir)
+{
+	Glib::Threads::RWLock::ReaderLock lm (lock);
+
+	const double tick_at_time = beat_at_frame_locked (_metrics, pos) * BBT_Time::ticks_per_beat;
+	const double bbt_ticks = bbt.ticks + (bbt.beats * BBT_Time::ticks_per_beat);
+	const double total_beats = (tick_at_time + bbt_ticks) / BBT_Time::ticks_per_beat;
+
+	return frame_at_beat_locked (_metrics, total_beats);
 }
 
 framepos_t
@@ -1306,52 +3031,39 @@ TempoMap::round_to_beat (framepos_t fr, RoundMode dir)
 framepos_t
 TempoMap::round_to_beat_subdivision (framepos_t fr, int sub_num, RoundMode dir)
 {
-	require_map_to (fr);
-
 	Glib::Threads::RWLock::ReaderLock lm (lock);
-	BBTPointList::const_iterator i = bbt_before_or_at (fr);
-	BBT_Time the_beat;
-	uint32_t ticks_one_subdivisions_worth;
-
-	bbt_time (fr, the_beat, i);
-
-	DEBUG_TRACE (DEBUG::SnapBBT, string_compose ("round %1 to nearest 1/%2 beat, before-or-at = %3 @ %4|%5 precise = %6\n",
-						     fr, sub_num, (*i).frame, (*i).bar, (*i).beat, the_beat));
+	uint32_t ticks = (uint32_t) floor (beat_at_frame_locked (_metrics, fr) * BBT_Time::ticks_per_beat);
+	uint32_t beats = (uint32_t) floor (ticks / BBT_Time::ticks_per_beat);
+	uint32_t ticks_one_subdivisions_worth = (uint32_t) BBT_Time::ticks_per_beat / sub_num;
 
-	ticks_one_subdivisions_worth = (uint32_t)BBT_Time::ticks_per_beat / sub_num;
+	ticks -= beats * BBT_Time::ticks_per_beat;
 
 	if (dir > 0) {
-
 		/* round to next (or same iff dir == RoundUpMaybe) */
 
-		uint32_t mod = the_beat.ticks % ticks_one_subdivisions_worth;
+		uint32_t mod = ticks % ticks_one_subdivisions_worth;
 
 		if (mod == 0 && dir == RoundUpMaybe) {
 			/* right on the subdivision, which is fine, so do nothing */
 
 		} else if (mod == 0) {
 			/* right on the subdivision, so the difference is just the subdivision ticks */
-			the_beat.ticks += ticks_one_subdivisions_worth;
+			ticks += ticks_one_subdivisions_worth;
 
 		} else {
 			/* not on subdivision, compute distance to next subdivision */
 
-			the_beat.ticks += ticks_one_subdivisions_worth - mod;
+			ticks += ticks_one_subdivisions_worth - mod;
 		}
 
-		if (the_beat.ticks > BBT_Time::ticks_per_beat) {
-			assert (i != _map.end());
-			++i;
-			assert (i != _map.end());
-			the_beat.ticks -= BBT_Time::ticks_per_beat;
+		if (ticks >= BBT_Time::ticks_per_beat) {
+			ticks -= BBT_Time::ticks_per_beat;
 		}
-
-
 	} else if (dir < 0) {
 
 		/* round to previous (or same iff dir == RoundDownMaybe) */
 
-		uint32_t difference = the_beat.ticks % ticks_one_subdivisions_worth;
+		uint32_t difference = ticks % ticks_one_subdivisions_worth;
 
 		if (difference == 0 && dir == RoundDownAlways) {
 			/* right on the subdivision, but force-rounding down,
@@ -1359,245 +3071,161 @@ TempoMap::round_to_beat_subdivision (framepos_t fr, int sub_num, RoundMode dir)
 			difference = ticks_one_subdivisions_worth;
 		}
 
-		if (the_beat.ticks < difference) {
-			if (i == _map.begin()) {
-				/* can't go backwards from wherever pos is, so just return it */
-				return fr;
-			}
-			--i;
-			the_beat.ticks = BBT_Time::ticks_per_beat - the_beat.ticks;
+		if (ticks < difference) {
+			ticks = BBT_Time::ticks_per_beat - ticks;
 		} else {
-			the_beat.ticks -= difference;
+			ticks -= difference;
 		}
 
 	} else {
 		/* round to nearest */
-
 		double rem;
 
 		/* compute the distance to the previous and next subdivision */
 
-		if ((rem = fmod ((double) the_beat.ticks, (double) ticks_one_subdivisions_worth)) > ticks_one_subdivisions_worth/2.0) {
+		if ((rem = fmod ((double) ticks, (double) ticks_one_subdivisions_worth)) > ticks_one_subdivisions_worth/2.0) {
 
 			/* closer to the next subdivision, so shift forward */
 
-			the_beat.ticks = lrint (the_beat.ticks + (ticks_one_subdivisions_worth - rem));
+			ticks = lrint (ticks + (ticks_one_subdivisions_worth - rem));
 
-			DEBUG_TRACE (DEBUG::SnapBBT, string_compose ("moved forward to %1\n", the_beat.ticks));
+			DEBUG_TRACE (DEBUG::SnapBBT, string_compose ("moved forward to %1\n", ticks));
 
-			if (the_beat.ticks > BBT_Time::ticks_per_beat) {
-				assert (i != _map.end());
-				++i;
-				assert (i != _map.end());
-				the_beat.ticks -= BBT_Time::ticks_per_beat;
-				DEBUG_TRACE (DEBUG::SnapBBT, string_compose ("fold beat to %1\n", the_beat));
+			if (ticks > BBT_Time::ticks_per_beat) {
+				++beats;
+				ticks -= BBT_Time::ticks_per_beat;
+				DEBUG_TRACE (DEBUG::SnapBBT, string_compose ("fold beat to %1\n", beats));
 			}
 
 		} else if (rem > 0) {
 
 			/* closer to previous subdivision, so shift backward */
 
-			if (rem > the_beat.ticks) {
-				if (i == _map.begin()) {
+			if (rem > ticks) {
+				if (beats == 0) {
 					/* can't go backwards past zero, so ... */
 					return 0;
 				}
 				/* step back to previous beat */
-				--i;
-				the_beat.ticks = lrint (BBT_Time::ticks_per_beat - rem);
-				DEBUG_TRACE (DEBUG::SnapBBT, string_compose ("step back beat to %1\n", the_beat));
+				--beats;
+				ticks = lrint (BBT_Time::ticks_per_beat - rem);
+				DEBUG_TRACE (DEBUG::SnapBBT, string_compose ("step back beat to %1\n", beats));
 			} else {
-				the_beat.ticks = lrint (the_beat.ticks - rem);
-				DEBUG_TRACE (DEBUG::SnapBBT, string_compose ("moved backward to %1\n", the_beat.ticks));
+				ticks = lrint (ticks - rem);
+				DEBUG_TRACE (DEBUG::SnapBBT, string_compose ("moved backward to %1\n", ticks));
 			}
 		} else {
 			/* on the subdivision, do nothing */
 		}
 	}
 
-	return (*i).frame + (the_beat.ticks/BBT_Time::ticks_per_beat) *
-		(*i).tempo->frames_per_beat (_frame_rate);
+	const framepos_t ret_frame = frame_at_beat_locked (_metrics, beats + (ticks / BBT_Time::ticks_per_beat));
+
+	return ret_frame;
 }
 
 framepos_t
 TempoMap::round_to_type (framepos_t frame, RoundMode dir, BBTPointType type)
 {
-	require_map_to (frame);
-
 	Glib::Threads::RWLock::ReaderLock lm (lock);
-	BBTPointList::const_iterator fi;
-
-	if (dir > 0) {
-		fi = bbt_after_or_at (frame);
-	} else {
-		fi = bbt_before_or_at (frame);
-	}
-
-	assert (fi != _map.end());
 
-	DEBUG_TRACE (DEBUG::SnapBBT, string_compose ("round from %1 (%3|%4 @ %5) to %6 in direction %2\n", frame, dir, (*fi).bar, (*fi).beat, (*fi).frame,
-						     (type == Bar ? "bar" : "beat")));
+	const double beat_at_framepos = beat_at_frame_locked (_metrics, frame);
+	BBT_Time bbt (bbt_at_beat_locked (_metrics, beat_at_framepos));
 
 	switch (type) {
 	case Bar:
 		if (dir < 0) {
 			/* find bar previous to 'frame' */
-
-			if (fi == _map.begin()) {
-				return 0;
-			}
-
-			if ((*fi).is_bar() && (*fi).frame == frame) {
-				if (dir == RoundDownMaybe) {
-					return frame;
-				}
-				--fi;
-			}
-
-			while (!(*fi).is_bar()) {
-				if (fi == _map.begin()) {
-					break;
-				}
-				fi--;
-			}
-			DEBUG_TRACE (DEBUG::SnapBBT, string_compose ("rounded to bar: map iter at %1|%2 %3, return\n",
-								     (*fi).bar, (*fi).beat, (*fi).frame));
-			return (*fi).frame;
+			bbt.beats = 1;
+			bbt.ticks = 0;
+			return frame_at_bbt_locked (_metrics, bbt);
 
 		} else if (dir > 0) {
-
 			/* find bar following 'frame' */
-
-			if ((*fi).is_bar() && (*fi).frame == frame) {
-				if (dir == RoundUpMaybe) {
-					return frame;
-				}
-				++fi;
-			}
-
-			while (!(*fi).is_bar()) {
-				fi++;
-				if (fi == _map.end()) {
-					--fi;
-					break;
-				}
-			}
-
-			DEBUG_TRACE (DEBUG::SnapBBT, string_compose ("rounded to bar: map iter at %1|%2 %3, return\n",
-								     (*fi).bar, (*fi).beat, (*fi).frame));
-			return (*fi).frame;
-
+			++bbt.bars;
+			bbt.beats = 1;
+			bbt.ticks = 0;
+			return frame_at_bbt_locked (_metrics, bbt);
 		} else {
-
 			/* true rounding: find nearest bar */
-
-			BBTPointList::const_iterator prev = fi;
-			BBTPointList::const_iterator next = fi;
-
-			if ((*fi).frame == frame) {
-				return frame;
-			}
-
-			while ((*prev).beat != 1) {
-				if (prev == _map.begin()) {
-					break;
-				}
-				prev--;
-			}
-
-			while ((next != _map.end()) && (*next).beat != 1) {
-				next++;
-			}
-
-			if ((next == _map.end()) || (frame - (*prev).frame) < ((*next).frame - frame)) {
-				return (*prev).frame;
+			framepos_t raw_ft = frame_at_bbt_locked (_metrics, bbt);
+			bbt.beats = 1;
+			bbt.ticks = 0;
+			framepos_t prev_ft = frame_at_bbt_locked (_metrics, bbt);
+			++bbt.bars;
+			framepos_t next_ft = frame_at_bbt_locked (_metrics, bbt);
+
+			if ((raw_ft - prev_ft) > (next_ft - prev_ft) / 2) { 
+				return next_ft;
 			} else {
-				return (*next).frame;
+				return prev_ft;
 			}
-
 		}
 
 		break;
 
 	case Beat:
 		if (dir < 0) {
-
-			if (fi == _map.begin()) {
-				return 0;
-			}
-
-			if ((*fi).frame > frame || ((*fi).frame == frame && dir == RoundDownAlways)) {
-				DEBUG_TRACE (DEBUG::SnapBBT, "requested frame is on beat, step back\n");
-				--fi;
-			}
-			DEBUG_TRACE (DEBUG::SnapBBT, string_compose ("rounded to beat: map iter at %1|%2 %3, return\n",
-								     (*fi).bar, (*fi).beat, (*fi).frame));
-			return (*fi).frame;
+			return frame_at_beat_locked (_metrics, floor (beat_at_framepos));
 		} else if (dir > 0) {
-			if ((*fi).frame < frame || ((*fi).frame == frame && dir == RoundUpAlways)) {
-				DEBUG_TRACE (DEBUG::SnapBBT, "requested frame is on beat, step forward\n");
-				++fi;
-			}
-			DEBUG_TRACE (DEBUG::SnapBBT, string_compose ("rounded to beat: map iter at %1|%2 %3, return\n",
-								     (*fi).bar, (*fi).beat, (*fi).frame));
-			return (*fi).frame;
+			return frame_at_beat_locked (_metrics, ceil (beat_at_framepos));
 		} else {
-			/* find beat nearest to frame */
-			if ((*fi).frame == frame) {
-				return frame;
-			}
-
-			BBTPointList::const_iterator prev = fi;
-			BBTPointList::const_iterator next = fi;
-
-			/* fi is already the beat before_or_at frame, and
-			   we've just established that its not at frame, so its
-			   the beat before frame.
-			*/
-			++next;
-
-			if ((next == _map.end()) || (frame - (*prev).frame) < ((*next).frame - frame)) {
-				return (*prev).frame;
-			} else {
-				return (*next).frame;
-			}
+			return frame_at_beat_locked (_metrics, floor (beat_at_framepos + 0.5));
 		}
 		break;
 	}
 
-	abort(); /* NOTREACHED */
 	return 0;
 }
 
 void
-TempoMap::get_grid (TempoMap::BBTPointList::const_iterator& begin,
-		    TempoMap::BBTPointList::const_iterator& end,
+TempoMap::get_grid (vector<TempoMap::BBTPoint>& points,
 		    framepos_t lower, framepos_t upper)
 {
-	{
-		Glib::Threads::RWLock::WriterLock lm (lock);
-		if (_map.empty() || (_map.back().frame < upper)) {
-			recompute_map (false, upper);
-		}
+	Glib::Threads::RWLock::ReaderLock lm (lock);
+	int32_t cnt = ceil (beat_at_frame_locked (_metrics, lower));
+	framecnt_t pos = 0;
+	/* although the map handles negative beats, bbt doesn't. */
+	if (cnt < 0.0) {
+		cnt = 0.0;
+	}
+
+	if (frame_at_beat_locked (_metrics, cnt) >= upper) {
+		return;
 	}
 
-	begin = lower_bound (_map.begin(), _map.end(), lower);
-	end = upper_bound (_map.begin(), _map.end(), upper);
+	while (pos < upper) {
+		pos = frame_at_beat_locked (_metrics, cnt);
+		const TempoSection tempo = tempo_section_at_frame_locked (_metrics, pos);
+		const MeterSection meter = meter_section_at_frame_locked (_metrics, pos);
+		const BBT_Time bbt = bbt_at_beat_locked (_metrics, cnt);
+		points.push_back (BBTPoint (meter, tempo_at_frame_locked (_metrics, pos), pos, bbt.bars, bbt.beats, tempo.c_func()));
+		++cnt;
+	}
 }
 
 const TempoSection&
-TempoMap::tempo_section_at (framepos_t frame) const
+TempoMap::tempo_section_at_frame (framepos_t frame) const
 {
 	Glib::Threads::RWLock::ReaderLock lm (lock);
-	Metrics::const_iterator i;
+	return tempo_section_at_frame_locked (_metrics, frame);
+}
+
+const TempoSection&
+TempoMap::tempo_section_at_frame_locked (const Metrics& metrics, framepos_t frame) const
+{
 	TempoSection* prev = 0;
 
-	for (i = metrics.begin(); i != metrics.end(); ++i) {
-		TempoSection* t;
+	TempoSection* t;
 
-		if ((t = dynamic_cast<TempoSection*> (*i)) != 0) {
+	for (Metrics::const_iterator i = metrics.begin(); i != metrics.end(); ++i) {
 
-			if ((*i)->frame() > frame) {
+		if ((*i)->is_tempo()) {
+			t = static_cast<TempoSection*> (*i);
+			if (!t->active()) {
+				continue;
+			}
+			if (prev && t->frame() > frame) {
 				break;
 			}
 
@@ -1613,48 +3241,194 @@ TempoMap::tempo_section_at (framepos_t frame) const
 	return *prev;
 }
 
-const Tempo&
-TempoMap::tempo_at (framepos_t frame) const
+const TempoSection&
+TempoMap::tempo_section_at_beat_locked (const Metrics& metrics, const double& beat) const
 {
-	TempoMetric m (metric_at (frame));
-	return m.tempo();
+	TempoSection* prev_t = 0;
+	const MeterSection* prev_m = &meter_section_at_beat_locked (metrics, beat);
+
+	TempoSection* t;
+
+	for (Metrics::const_iterator i = metrics.begin(); i != metrics.end(); ++i) {
+		if ((*i)->is_tempo()) {
+			t = static_cast<TempoSection*> (*i);
+			if (prev_t && ((t->pulse() - prev_m->pulse()) * prev_m->note_divisor()) + prev_m->beat() > beat) {
+				break;
+			}
+			prev_t = t;
+		}
+
+	}
+	return *prev_t;
 }
 
-const MeterSection&
-TempoMap::meter_section_at (framepos_t frame) const
+/* don't use this to calculate length (the tempo is only correct for this frame).
+   do that stuff based on the beat_at_frame and frame_at_beat api
+*/
+double
+TempoMap::frames_per_beat_at (const framepos_t& frame, const framecnt_t& sr) const
 {
 	Glib::Threads::RWLock::ReaderLock lm (lock);
+
+	const TempoSection* ts_at = 0;
+	const TempoSection* ts_after = 0;
+	Metrics::const_iterator i;
+	TempoSection* t;
+
+	for (i = _metrics.begin(); i != _metrics.end(); ++i) {
+
+		if ((*i)->is_tempo()) {
+			t = static_cast<TempoSection*> (*i);
+			if (!t->active()) {
+				continue;
+			}
+			if (ts_at && (*i)->frame() > frame) {
+				ts_after = t;
+				break;
+			}
+			ts_at = t;
+		}
+	}
+
+	if (ts_after) {
+		return  (60.0 * _frame_rate) / (ts_at->tempo_at_frame (frame, _frame_rate) * ts_at->note_type());
+	}
+	/* must be treated as constant tempo */
+	return ts_at->frames_per_beat (_frame_rate);
+}
+
+const MeterSection&
+TempoMap::meter_section_at_frame_locked (const Metrics& metrics, framepos_t frame) const
+{
 	Metrics::const_iterator i;
 	MeterSection* prev = 0;
 
+	MeterSection* m;
+
 	for (i = metrics.begin(); i != metrics.end(); ++i) {
-		MeterSection* t;
 
-		if ((t = dynamic_cast<MeterSection*> (*i)) != 0) {
+		if (!(*i)->is_tempo()) {
+			m = static_cast<MeterSection*> (*i);
 
-			if ((*i)->frame() > frame) {
+			if (prev && (*i)->frame() > frame) {
 				break;
 			}
 
-			prev = t;
+			prev = m;
+		}
+	}
+
+	if (prev == 0) {
+		fatal << endmsg;
+		abort(); /*NOTREACHED*/
+	}
+
+	return *prev;
+}
+
+
+const MeterSection&
+TempoMap::meter_section_at_frame (framepos_t frame) const
+{
+	Glib::Threads::RWLock::ReaderLock lm (lock);
+	return meter_section_at_frame_locked (_metrics, frame);
+}
+
+const MeterSection&
+TempoMap::meter_section_at_beat_locked (const Metrics& metrics, const double& beat) const
+{
+	MeterSection* prev_m = 0;
+
+	for (Metrics::const_iterator i = metrics.begin(); i != metrics.end(); ++i) {
+		MeterSection* m;
+		if (!(*i)->is_tempo()) {
+			m = static_cast<MeterSection*> (*i);
+			if (prev_m && m->beat() > beat) {
+				break;
+			}
+			prev_m = m;
 		}
-	}
 
-	if (prev == 0) {
-		fatal << endmsg;
-		abort(); /*NOTREACHED*/
 	}
+	return *prev_m;
+}
 
-	return *prev;
+const MeterSection&
+TempoMap::meter_section_at_beat (double beat) const
+{
+	Glib::Threads::RWLock::ReaderLock lm (lock);
+	return meter_section_at_beat_locked (_metrics, beat);
 }
 
 const Meter&
-TempoMap::meter_at (framepos_t frame) const
+TempoMap::meter_at_frame (framepos_t frame) const
 {
 	TempoMetric m (metric_at (frame));
 	return m.meter();
 }
 
+void
+TempoMap::fix_legacy_session ()
+{
+	MeterSection* prev_m = 0;
+	TempoSection* prev_t = 0;
+
+	for (Metrics::iterator i = _metrics.begin(); i != _metrics.end(); ++i) {
+		MeterSection* m;
+		TempoSection* t;
+
+		if ((m = dynamic_cast<MeterSection*>(*i)) != 0) {
+			if (!m->movable()) {
+				pair<double, BBT_Time> bbt = make_pair (0.0, BBT_Time (1, 1, 0));
+				m->set_beat (bbt);
+				m->set_pulse (0.0);
+				m->set_frame (0);
+				m->set_position_lock_style (AudioTime);
+				prev_m = m;
+				continue;
+			}
+			if (prev_m) {
+				pair<double, BBT_Time> start = make_pair (((m->bbt().bars - 1) * prev_m->note_divisor())
+									  + (m->bbt().beats - 1)
+									  + (m->bbt().ticks / BBT_Time::ticks_per_beat)
+									  , m->bbt());
+				m->set_beat (start);
+				const double start_beat = ((m->bbt().bars - 1) * prev_m->note_divisor())
+					+ (m->bbt().beats - 1)
+					+ (m->bbt().ticks / BBT_Time::ticks_per_beat);
+				m->set_pulse (start_beat / prev_m->note_divisor());
+			}
+			prev_m = m;
+		} else if ((t = dynamic_cast<TempoSection*>(*i)) != 0) {
+
+			if (!t->active()) {
+				continue;
+			}
+
+			if (!t->movable()) {
+				t->set_pulse (0.0);
+				t->set_frame (0);
+				t->set_position_lock_style (AudioTime);
+				prev_t = t;
+				continue;
+			}
+
+			if (prev_t) {
+				const double beat = ((t->legacy_bbt().bars - 1) * ((prev_m) ? prev_m->note_divisor() : 4.0))
+					+ (t->legacy_bbt().beats - 1)
+					+ (t->legacy_bbt().ticks / BBT_Time::ticks_per_beat);
+				if (prev_m) {
+					t->set_pulse (beat / prev_m->note_divisor());
+				} else {
+					/* really shouldn't happen but.. */
+					t->set_pulse (beat / 4.0);
+				}
+			}
+			prev_t = t;
+		}
+	}
+}
+
 XMLNode&
 TempoMap::get_state ()
 {
@@ -1663,7 +3437,7 @@ TempoMap::get_state ()
 
 	{
 		Glib::Threads::RWLock::ReaderLock lm (lock);
-		for (i = metrics.begin(); i != metrics.end(); ++i) {
+		for (i = _metrics.begin(); i != _metrics.end(); ++i) {
 			root->add_child_nocopy ((*i)->get_state());
 		}
 	}
@@ -1679,9 +3453,8 @@ TempoMap::set_state (const XMLNode& node, int /*version*/)
 
 		XMLNodeList nlist;
 		XMLNodeConstIterator niter;
-		Metrics old_metrics (metrics);
-		MeterSection* last_meter = 0;
-		metrics.clear();
+		Metrics old_metrics (_metrics);
+		_metrics.clear();
 
 		nlist = node.children();
 
@@ -1692,18 +3465,13 @@ TempoMap::set_state (const XMLNode& node, int /*version*/)
 
 				try {
 					TempoSection* ts = new TempoSection (*child);
-					metrics.push_back (ts);
-
-					if (ts->bar_offset() < 0.0) {
-						if (last_meter) {
-							ts->update_bar_offset_from_bbt (*last_meter);
-						}
-					}
+					_metrics.push_back (ts);
 				}
 
 				catch (failed_constructor& err){
 					error << _("Tempo map: could not set new state, restoring old one.") << endmsg;
-					metrics = old_metrics;
+					_metrics = old_metrics;
+					old_metrics.clear();
 					break;
 				}
 
@@ -1711,13 +3479,13 @@ TempoMap::set_state (const XMLNode& node, int /*version*/)
 
 				try {
 					MeterSection* ms = new MeterSection (*child);
-					metrics.push_back (ms);
-					last_meter = ms;
+					_metrics.push_back (ms);
 				}
 
 				catch (failed_constructor& err) {
 					error << _("Tempo map: could not set new state, restoring old one.") << endmsg;
-					metrics = old_metrics;
+					_metrics = old_metrics;
+					old_metrics.clear();
 					break;
 				}
 			}
@@ -1725,26 +3493,42 @@ TempoMap::set_state (const XMLNode& node, int /*version*/)
 
 		if (niter == nlist.end()) {
 			MetricSectionSorter cmp;
-			metrics.sort (cmp);
+			_metrics.sort (cmp);
+		}
+
+		/* check for legacy sessions where bbt was the base musical unit for tempo */
+		for (Metrics::const_iterator i = _metrics.begin(); i != _metrics.end(); ++i) {
+			TempoSection* t;
+			if ((t = dynamic_cast<TempoSection*> (*i)) != 0) {
+				if (t->legacy_bbt().bars != 0) {
+					fix_legacy_session();
+					break;
+				}
+				break;
+			}
 		}
 
 		/* check for multiple tempo/meters at the same location, which
 		   ardour2 somehow allowed.
 		*/
 
-		Metrics::iterator prev = metrics.end();
-		for (Metrics::iterator i = metrics.begin(); i != metrics.end(); ++i) {
-			if (prev != metrics.end()) {
-				if (dynamic_cast<MeterSection*>(*prev) && dynamic_cast<MeterSection*>(*i)) {
-					if ((*prev)->start() == (*i)->start()) {
-						cerr << string_compose (_("Multiple meter definitions found at %1"), (*prev)->start()) << endmsg;
-						error << string_compose (_("Multiple meter definitions found at %1"), (*prev)->start()) << endmsg;
+		Metrics::iterator prev = _metrics.end();
+		for (Metrics::iterator i = _metrics.begin(); i != _metrics.end(); ++i) {
+			if (prev != _metrics.end()) {
+				MeterSection* ms;
+				MeterSection* prev_m;
+				TempoSection* ts;
+				TempoSection* prev_t;
+				if ((prev_m = dynamic_cast<MeterSection*>(*prev)) != 0 && (ms = dynamic_cast<MeterSection*>(*i)) != 0) {
+					if (prev_m->pulse() == ms->pulse()) {
+						cerr << string_compose (_("Multiple meter definitions found at %1"), prev_m->pulse()) << endmsg;
+						error << string_compose (_("Multiple meter definitions found at %1"), prev_m->pulse()) << endmsg;
 						return -1;
 					}
-				} else if (dynamic_cast<TempoSection*>(*prev) && dynamic_cast<TempoSection*>(*i)) {
-					if ((*prev)->start() == (*i)->start()) {
-						cerr << string_compose (_("Multiple tempo definitions found at %1"), (*prev)->start()) << endmsg;
-						error << string_compose (_("Multiple tempo definitions found at %1"), (*prev)->start()) << endmsg;
+				} else if ((prev_t = dynamic_cast<TempoSection*>(*prev)) != 0 && (ts = dynamic_cast<TempoSection*>(*i)) != 0) {
+					if (prev_t->pulse() == ts->pulse()) {
+						cerr << string_compose (_("Multiple tempo definitions found at %1"), prev_t->pulse()) << endmsg;
+						error << string_compose (_("Multiple tempo definitions found at %1"), prev_t->pulse()) << endmsg;
 						return -1;
 					}
 				}
@@ -1752,7 +3536,14 @@ TempoMap::set_state (const XMLNode& node, int /*version*/)
 			prev = i;
 		}
 
-		recompute_map (true, -1);
+		recompute_map (_metrics);
+
+		Metrics::const_iterator d = old_metrics.begin();
+		while (d != old_metrics.end()) {
+			delete (*d);
+			++d;
+		}
+		old_metrics.clear ();
 	}
 
 	PropertyChanged (PropertyChange ());
@@ -1761,22 +3552,30 @@ TempoMap::set_state (const XMLNode& node, int /*version*/)
 }
 
 void
-TempoMap::dump (std::ostream& o) const
+TempoMap::dump (const Metrics& metrics, std::ostream& o) const
 {
 	Glib::Threads::RWLock::ReaderLock lm (lock, Glib::Threads::TRY_LOCK);
 	const MeterSection* m;
 	const TempoSection* t;
+	const TempoSection* prev_t = 0;
 
 	for (Metrics::const_iterator i = metrics.begin(); i != metrics.end(); ++i) {
 
 		if ((t = dynamic_cast<const TempoSection*>(*i)) != 0) {
-			o << "Tempo @ " << *i << " (Bar-offset: " << t->bar_offset() << ") " << t->beats_per_minute() << " BPM (pulse = 1/" << t->note_type() << ") at " << t->start() << " frame= " << t->frame() << " (movable? "
-			  << t->movable() << ')' << endl;
+			o << "Tempo @ " << *i << t->beats_per_minute() << " BPM (pulse = 1/" << t->note_type() << ") at " << t->pulse() << " frame= " << t->frame() << " (movable? "
+			  << t->movable() << ')' << " pos lock: " << enum_2_string (t->position_lock_style()) << std::endl;
+			o << "current      : " << t->beats_per_minute() << " | " << t->pulse() << " | " << t->frame() << std::endl;
+			if (prev_t) {
+				o << "previous     : " << prev_t->beats_per_minute() << " | " << prev_t->pulse() << " | " << prev_t->frame() << std::endl;
+				o << "calculated   : " << prev_t->tempo_at_pulse (t->pulse()) *  prev_t->note_type() << " | " << prev_t->pulse_at_tempo (t->pulses_per_minute(), t->frame(), _frame_rate) <<  " | " << prev_t->frame_at_tempo (t->pulses_per_minute(), t->pulse(), _frame_rate) << std::endl;
+			}
+			prev_t = t;
 		} else if ((m = dynamic_cast<const MeterSection*>(*i)) != 0) {
-			o << "Meter @ " << *i << ' ' << m->divisions_per_bar() << '/' << m->note_divisor() << " at " << m->start() << " frame= " << m->frame()
-			  << " (movable? " << m->movable() << ')' << endl;
+			o << "Meter @ " << *i << ' ' << m->divisions_per_bar() << '/' << m->note_divisor() << " at " << m->bbt() << " frame= " << m->frame()
+			  << " pulse: " << m->pulse() <<  " beat : " << m->beat() << " pos lock: " << enum_2_string (m->position_lock_style()) << " (movable? " << m->movable() << ')' << endl;
 		}
 	}
+	o << "------" << std::endl;
 }
 
 int
@@ -1785,8 +3584,8 @@ TempoMap::n_tempos() const
 	Glib::Threads::RWLock::ReaderLock lm (lock);
 	int cnt = 0;
 
-	for (Metrics::const_iterator i = metrics.begin(); i != metrics.end(); ++i) {
-		if (dynamic_cast<const TempoSection*>(*i) != 0) {
+	for (Metrics::const_iterator i = _metrics.begin(); i != _metrics.end(); ++i) {
+		if ((*i)->is_tempo()) {
 			cnt++;
 		}
 	}
@@ -1800,8 +3599,8 @@ TempoMap::n_meters() const
 	Glib::Threads::RWLock::ReaderLock lm (lock);
 	int cnt = 0;
 
-	for (Metrics::const_iterator i = metrics.begin(); i != metrics.end(); ++i) {
-		if (dynamic_cast<const MeterSection*>(*i) != 0) {
+	for (Metrics::const_iterator i = _metrics.begin(); i != _metrics.end(); ++i) {
+		if (!(*i)->is_tempo()) {
 			cnt++;
 		}
 	}
@@ -1814,7 +3613,7 @@ TempoMap::insert_time (framepos_t where, framecnt_t amount)
 {
 	{
 		Glib::Threads::RWLock::WriterLock lm (lock);
-		for (Metrics::iterator i = metrics.begin(); i != metrics.end(); ++i) {
+		for (Metrics::iterator i = _metrics.begin(); i != _metrics.end(); ++i) {
 			if ((*i)->frame() >= where && (*i)->movable ()) {
 				(*i)->set_frame ((*i)->frame() + amount);
 			}
@@ -1842,52 +3641,85 @@ TempoMap::insert_time (framepos_t where, framecnt_t amount)
 		bool first = true;
 		MetricSection* prev = 0;
 
-		for (i = metrics.begin(); i != metrics.end(); ++i) {
+		for (i = _metrics.begin(); i != _metrics.end(); ++i) {
 
 			BBT_Time bbt;
-			TempoMetric metric (*meter, *tempo);
-
+			//TempoMetric metric (*meter, *tempo);
+			MeterSection* ms = const_cast<MeterSection*>(meter);
+			TempoSection* ts = const_cast<TempoSection*>(tempo);
 			if (prev) {
-				metric.set_start (prev->start());
-				metric.set_frame (prev->frame());
+				if (ts){
+					if ((t = dynamic_cast<TempoSection*>(prev)) != 0) {
+						if (!t->active()) {
+							continue;
+						}
+						ts->set_pulse (t->pulse());
+					}
+					if ((m = dynamic_cast<MeterSection*>(prev)) != 0) {
+						ts->set_pulse (m->pulse());
+					}
+					ts->set_frame (prev->frame());
+
+				}
+				if (ms) {
+					if ((m = dynamic_cast<MeterSection*>(prev)) != 0) {
+						pair<double, BBT_Time> start = make_pair (m->beat(), m->bbt());
+						ms->set_beat (start);
+						ms->set_pulse (m->pulse());
+					}
+					if ((t = dynamic_cast<TempoSection*>(prev)) != 0) {
+						if (!t->active()) {
+							continue;
+						}
+						const double beat = beat_at_pulse_locked (_metrics, t->pulse());
+						pair<double, BBT_Time> start = make_pair (beat, bbt_at_beat_locked (_metrics, beat));
+						ms->set_beat (start);
+						ms->set_pulse (t->pulse());
+					}
+					ms->set_frame (prev->frame());
+				}
+
 			} else {
 				// metric will be at frames=0 bbt=1|1|0 by default
 				// which is correct for our purpose
 			}
 
-			BBTPointList::const_iterator bi = bbt_before_or_at ((*i)->frame());
-			bbt_time ((*i)->frame(), bbt, bi);
-
-			// cerr << "timestamp @ " << (*i)->frame() << " with " << bbt.bars << "|" << bbt.beats << "|" << bbt.ticks << " => ";
-
-			if (first) {
-				first = false;
-			} else {
+			// cerr << bbt << endl;
 
-				if (bbt.ticks > BBT_Time::ticks_per_beat/2) {
-					/* round up to next beat */
-					bbt.beats += 1;
+			if ((t = dynamic_cast<TempoSection*>(*i)) != 0) {
+				if (!t->active()) {
+					continue;
 				}
+				t->set_pulse (pulse_at_frame_locked (_metrics, m->frame()));
+				tempo = t;
+				// cerr << "NEW TEMPO, frame = " << (*i)->frame() << " beat = " << (*i)->pulse() <<endl;
+			} else if ((m = dynamic_cast<MeterSection*>(*i)) != 0) {
+				bbt = bbt_at_frame_locked (_metrics, m->frame());
 
-				bbt.ticks = 0;
+				// cerr << "timestamp @ " << (*i)->frame() << " with " << bbt.bars << "|" << bbt.beats << "|" << bbt.ticks << " => ";
 
-				if (bbt.beats != 1) {
-					/* round up to next bar */
-					bbt.bars += 1;
-					bbt.beats = 1;
-				}
-			}
+				if (first) {
+					first = false;
+				} else {
 
-			// cerr << bbt << endl;
+					if (bbt.ticks > BBT_Time::ticks_per_beat/2) {
+						/* round up to next beat */
+						bbt.beats += 1;
+					}
 
-			(*i)->set_start (bbt);
+					bbt.ticks = 0;
 
-			if ((t = dynamic_cast<TempoSection*>(*i)) != 0) {
-				tempo = t;
-				// cerr << "NEW TEMPO, frame = " << (*i)->frame() << " start = " << (*i)->start() <<endl;
-			} else if ((m = dynamic_cast<MeterSection*>(*i)) != 0) {
+					if (bbt.beats != 1) {
+						/* round up to next bar */
+						bbt.bars += 1;
+						bbt.beats = 1;
+					}
+				}
+				pair<double, BBT_Time> start = make_pair (beat_at_frame_locked (_metrics, m->frame()), bbt);
+				m->set_beat (start);
+				m->set_pulse (pulse_at_frame_locked (_metrics, m->frame()));
 				meter = m;
-				// cerr << "NEW METER, frame = " << (*i)->frame() << " start = " << (*i)->start() <<endl;
+				// cerr << "NEW METER, frame = " << (*i)->frame() << " beat = " << (*i)->pulse() <<endl;
 			} else {
 				fatal << _("programming error: unhandled MetricSection type") << endmsg;
 				abort(); /*NOTREACHED*/
@@ -1896,7 +3728,7 @@ TempoMap::insert_time (framepos_t where, framecnt_t amount)
 			prev = (*i);
 		}
 
-		recompute_map (true);
+		recompute_map (_metrics);
 	}
 
 
@@ -1915,7 +3747,7 @@ TempoMap::remove_time (framepos_t where, framecnt_t amount)
 	bool meter_after = false; // is there a meter marker likewise?
 	{
 		Glib::Threads::RWLock::WriterLock lm (lock);
-		for (Metrics::iterator i = metrics.begin(); i != metrics.end(); ++i) {
+		for (Metrics::iterator i = _metrics.begin(); i != _metrics.end(); ++i) {
 			if ((*i)->frame() >= where && (*i)->frame() < where+amount) {
 				metric_kill_list.push_back(*i);
 				TempoSection *lt = dynamic_cast<TempoSection*> (*i);
@@ -1951,12 +3783,12 @@ TempoMap::remove_time (framepos_t where, framecnt_t amount)
 
 		//remove all the remaining metrics
 		for (std::list<MetricSection*>::iterator i = metric_kill_list.begin(); i != metric_kill_list.end(); ++i) {
-			metrics.remove(*i);
+			_metrics.remove(*i);
 			moved = true;
 		}
 
 		if (moved) {
-			recompute_map (true);
+			recompute_map (_metrics);
 		}
 	}
 	PropertyChanged (PropertyChange ());
@@ -1967,94 +3799,32 @@ TempoMap::remove_time (framepos_t where, framecnt_t amount)
  *  pos can be -ve, if required.
  */
 framepos_t
-TempoMap::framepos_plus_beats (framepos_t pos, Evoral::Beats beats) const
+TempoMap::framepos_plus_beats (framepos_t frame, Evoral::Beats beats) const
 {
 	Glib::Threads::RWLock::ReaderLock lm (lock);
-	Metrics::const_iterator next_tempo;
-	const TempoSection* tempo = 0;
-
-	/* Find the starting tempo metric */
 
-	for (next_tempo = metrics.begin(); next_tempo != metrics.end(); ++next_tempo) {
+	const TempoSection& ts = tempo_section_at_frame_locked (_metrics, frame);
+	MeterSection* prev_m = 0;
+	MeterSection* next_m = 0;
 
-		const TempoSection* t;
-
-		if ((t = dynamic_cast<const TempoSection*>(*next_tempo)) != 0) {
-
-			/* This is a bit of a hack, but pos could be -ve, and if it is,
-			   we consider the initial metric changes (at time 0) to actually
-			   be in effect at pos.
-			*/
-
-			framepos_t f = (*next_tempo)->frame ();
-
-			if (pos < 0 && f == 0) {
-				f = pos;
-			}
-
-			if (f > pos) {
+	for (Metrics::const_iterator i = _metrics.begin(); i != _metrics.end(); ++i) {
+		if (!(*i)->is_tempo()) {
+			if (prev_m && (*i)->frame() > frame) {
+				next_m = static_cast<MeterSection*> (*i);
 				break;
 			}
-
-			tempo = t;
+			prev_m = static_cast<MeterSection*> (*i);
 		}
 	}
 
-	/* We now have:
-
-	   tempo       -> the Tempo for "pos"
-	   next_tempo  -> first tempo after "pos", possibly metrics.end()
-	*/
-	assert(tempo);
-
-	DEBUG_TRACE (DEBUG::TempoMath,
-	             string_compose ("frame %1 plus %2 beats, start with tempo = %3 @ %4\n",
-	                             pos, beats, *((const Tempo*)tempo), tempo->frame()));
-
-	while (!!beats) {
-
-		/* Distance to the end of this section in frames */
-		framecnt_t distance_frames = (next_tempo == metrics.end() ? max_framepos : ((*next_tempo)->frame() - pos));
-
-		/* Distance to the end in beats */
-		Evoral::Beats distance_beats = Evoral::Beats::ticks_at_rate(
-			distance_frames, tempo->frames_per_beat (_frame_rate));
-
-		/* Amount to subtract this time */
-		Evoral::Beats const delta = min (distance_beats, beats);
-
-		DEBUG_TRACE (DEBUG::TempoMath, string_compose ("\tdistance to %1 = %2 (%3 beats)\n",
-							       (next_tempo == metrics.end() ? max_framepos : (*next_tempo)->frame()),
-							       distance_frames, distance_beats));
-
-		/* Update */
-		beats -= delta;
-		pos += delta.to_ticks(tempo->frames_per_beat (_frame_rate));
-
-		DEBUG_TRACE (DEBUG::TempoMath, string_compose ("\tnow at %1, %2 beats left\n", pos, beats));
-
-		/* step forwards to next tempo section */
-
-		if (next_tempo != metrics.end()) {
-
-			tempo = dynamic_cast<const TempoSection*>(*next_tempo);
-
-			DEBUG_TRACE (DEBUG::TempoMath, string_compose ("\tnew tempo = %1 @ %2 fpb = %3\n",
-								       *((const Tempo*)tempo), tempo->frame(),
-								       tempo->frames_per_beat (_frame_rate)));
-
-			while (next_tempo != metrics.end ()) {
-
-				++next_tempo;
+	double pos_beat = prev_m->beat() + (ts.pulse_at_frame (frame, _frame_rate) - prev_m->pulse()) * prev_m->note_divisor();
 
-				if (next_tempo != metrics.end() && dynamic_cast<const TempoSection*>(*next_tempo)) {
-					break;
-				}
-			}
-		}
+	/* audio locked meters fake their beat */
+	if (next_m && next_m->beat() < pos_beat) {
+		pos_beat = next_m->beat();
 	}
 
-	return pos;
+	return frame_at_beat_locked (_metrics, pos_beat + beats.to_double());
 }
 
 /** Subtract some (fractional) beats from a frame position, and return the result in frames */
@@ -2062,112 +3832,8 @@ framepos_t
 TempoMap::framepos_minus_beats (framepos_t pos, Evoral::Beats beats) const
 {
 	Glib::Threads::RWLock::ReaderLock lm (lock);
-	Metrics::const_reverse_iterator prev_tempo;
-	const TempoSection* tempo = 0;
-
-	/* Find the starting tempo metric */
-
-	for (prev_tempo = metrics.rbegin(); prev_tempo != metrics.rend(); ++prev_tempo) {
-
-		const TempoSection* t;
-
-		if ((t = dynamic_cast<const TempoSection*>(*prev_tempo)) != 0) {
-
-			/* This is a bit of a hack, but pos could be -ve, and if it is,
-			   we consider the initial metric changes (at time 0) to actually
-			   be in effect at pos.
-			*/
-
-			framepos_t f = (*prev_tempo)->frame ();
-
-			if (pos < 0 && f == 0) {
-				f = pos;
-			}
-
-			/* this is slightly more complex than the forward case
-			   because we reach the tempo in effect at pos after
-			   passing through pos (rather before, as in the
-			   forward case). having done that, we then need to
-			   keep going to get the previous tempo (or
-			   metrics.rend())
-			*/
-
-			if (f <= pos) {
-				if (tempo == 0) {
-					/* first tempo with position at or
-					   before pos
-					*/
-					tempo = t;
-				} else if (f < pos) {
-					/* some other tempo section that
-					   is even earlier than 'tempo'
-					*/
-					break;
-				}
-			}
-		}
-	}
-
-	assert(tempo);
-	DEBUG_TRACE (DEBUG::TempoMath,
-	             string_compose ("frame %1 minus %2 beats, start with tempo = %3 @ %4 prev at beg? %5\n",
-	                             pos, beats, *((const Tempo*)tempo), tempo->frame(),
-	                             prev_tempo == metrics.rend()));
-
-	/* We now have:
-
-	   tempo       -> the Tempo for "pos"
-	   prev_tempo  -> the first metric before "pos", possibly metrics.rend()
-	*/
-
-	while (!!beats) {
-
-		/* Distance to the start of this section in frames */
-		framecnt_t distance_frames = (pos - tempo->frame());
-
-		/* Distance to the start in beats */
-		Evoral::Beats distance_beats = Evoral::Beats::ticks_at_rate(
-			distance_frames, tempo->frames_per_beat (_frame_rate));
-
-		/* Amount to subtract this time */
-		Evoral::Beats const sub = min (distance_beats, beats);
-
-		DEBUG_TRACE (DEBUG::TempoMath, string_compose ("\tdistance to %1 = %2 (%3 beats)\n",
-							       tempo->frame(), distance_frames, distance_beats));
-		/* Update */
-
-		beats -= sub;
-		pos -= sub.to_double() * tempo->frames_per_beat (_frame_rate);
-
-		DEBUG_TRACE (DEBUG::TempoMath, string_compose ("\tnow at %1, %2 beats left, prev at end ? %3\n", pos, beats,
-							       (prev_tempo == metrics.rend())));
 
-		/* step backwards to prior TempoSection */
-
-		if (prev_tempo != metrics.rend()) {
-
-			tempo = dynamic_cast<const TempoSection*>(*prev_tempo);
-
-			DEBUG_TRACE (DEBUG::TempoMath,
-			             string_compose ("\tnew tempo = %1 @ %2 fpb = %3\n",
-			                             *((const Tempo*)tempo), tempo->frame(),
-			                             tempo->frames_per_beat (_frame_rate)));
-
-			while (prev_tempo != metrics.rend ()) {
-
-				++prev_tempo;
-
-				if (prev_tempo != metrics.rend() && dynamic_cast<const TempoSection*>(*prev_tempo) != 0) {
-					break;
-				}
-			}
-		} else {
-			pos -= llrint (beats.to_double() * tempo->frames_per_beat (_frame_rate));
-			beats = Evoral::Beats();
-		}
-	}
-
-	return pos;
+	return frame_at_beat_locked (_metrics, beat_at_frame_locked (_metrics, pos) - beats.to_double());
 }
 
 /** Add the BBT interval op to pos and return the result */
@@ -2175,135 +3841,24 @@ framepos_t
 TempoMap::framepos_plus_bbt (framepos_t pos, BBT_Time op) const
 {
 	Glib::Threads::RWLock::ReaderLock lm (lock);
-	Metrics::const_iterator i;
-	const MeterSection* meter;
-	const MeterSection* m;
-	const TempoSection* tempo;
-	const TempoSection* t;
-	double frames_per_beat;
-	framepos_t effective_pos = max (pos, (framepos_t) 0);
-
-	meter = &first_meter ();
-	tempo = &first_tempo ();
-
-	assert (meter);
-	assert (tempo);
-
-	/* find the starting metrics for tempo & meter */
-
-	for (i = metrics.begin(); i != metrics.end(); ++i) {
-
-		if ((*i)->frame() > effective_pos) {
-			break;
-		}
-
-		if ((t = dynamic_cast<const TempoSection*>(*i)) != 0) {
-			tempo = t;
-		} else if ((m = dynamic_cast<const MeterSection*>(*i)) != 0) {
-			meter = m;
-		}
-	}
-
-	/* We now have:
-
-	   meter -> the Meter for "pos"
-	   tempo -> the Tempo for "pos"
-	   i     -> for first new metric after "pos", possibly metrics.end()
-	*/
-
-	/* now comes the complicated part. we have to add one beat a time,
-	   checking for a new metric on every beat.
-	*/
-
-	frames_per_beat = tempo->frames_per_beat (_frame_rate);
-
-	uint64_t bars = 0;
-
-	while (op.bars) {
-
-		bars++;
-		op.bars--;
-
-		/* check if we need to use a new metric section: has adding frames moved us
-		   to or after the start of the next metric section? in which case, use it.
-		*/
-
-		if (i != metrics.end()) {
-			if ((*i)->frame() <= pos) {
-
-				/* about to change tempo or meter, so add the
-				 * number of frames for the bars we've just
-				 * traversed before we change the
-				 * frames_per_beat value.
-				 */
-
-				pos += llrint (frames_per_beat * (bars * meter->divisions_per_bar()));
-				bars = 0;
-
-				if ((t = dynamic_cast<const TempoSection*>(*i)) != 0) {
-					tempo = t;
-				} else if ((m = dynamic_cast<const MeterSection*>(*i)) != 0) {
-					meter = m;
-				}
-				++i;
-				frames_per_beat = tempo->frames_per_beat (_frame_rate);
-
-			}
-		}
 
+	BBT_Time pos_bbt = bbt_at_beat_locked (_metrics, beat_at_frame_locked (_metrics, pos));
+	pos_bbt.ticks += op.ticks;
+	if (pos_bbt.ticks >= BBT_Time::ticks_per_beat) {
+		++pos_bbt.beats;
+		pos_bbt.ticks -= BBT_Time::ticks_per_beat;
 	}
-
-	pos += llrint (frames_per_beat * (bars * meter->divisions_per_bar()));
-
-	uint64_t beats = 0;
-
-	while (op.beats) {
-
-		/* given the current meter, have we gone past the end of the bar ? */
-
-		beats++;
-		op.beats--;
-
-		/* check if we need to use a new metric section: has adding frames moved us
-		   to or after the start of the next metric section? in which case, use it.
-		*/
-
-		if (i != metrics.end()) {
-			if ((*i)->frame() <= pos) {
-
-				/* about to change tempo or meter, so add the
-				 * number of frames for the beats we've just
-				 * traversed before we change the
-				 * frames_per_beat value.
-				 */
-
-				pos += llrint (beats * frames_per_beat);
-				beats = 0;
-
-				if ((t = dynamic_cast<const TempoSection*>(*i)) != 0) {
-					tempo = t;
-				} else if ((m = dynamic_cast<const MeterSection*>(*i)) != 0) {
-					meter = m;
-				}
-				++i;
-				frames_per_beat = tempo->frames_per_beat (_frame_rate);
-			}
-		}
-	}
-
-	pos += llrint (beats * frames_per_beat);
-
-	if (op.ticks) {
-		if (op.ticks >= BBT_Time::ticks_per_beat) {
-			pos += llrint (frames_per_beat + /* extra beat */
-				       (frames_per_beat * ((op.ticks % (uint32_t) BBT_Time::ticks_per_beat) /
-							   (double) BBT_Time::ticks_per_beat)));
-		} else {
-			pos += llrint (frames_per_beat * (op.ticks / (double) BBT_Time::ticks_per_beat));
-		}
+	pos_bbt.beats += op.beats;
+	/* the meter in effect will start on the bar */
+	double divisions_per_bar = meter_section_at_beat (beat_at_bbt_locked (_metrics, BBT_Time (pos_bbt.bars + op.bars, 1, 0))).divisions_per_bar();
+	while (pos_bbt.beats >= divisions_per_bar + 1) {
+		++pos_bbt.bars;
+		divisions_per_bar = meter_section_at_beat (beat_at_bbt_locked (_metrics, BBT_Time (pos_bbt.bars + op.bars, 1, 0))).divisions_per_bar();
+		pos_bbt.beats -= divisions_per_bar;
 	}
+	pos_bbt.bars += op.bars;
 
-	return pos;
+	return frame_at_bbt_locked (_metrics, pos_bbt);
 }
 
 /** Count the number of beats that are equivalent to distance when going forward,
@@ -2313,125 +3868,8 @@ Evoral::Beats
 TempoMap::framewalk_to_beats (framepos_t pos, framecnt_t distance) const
 {
 	Glib::Threads::RWLock::ReaderLock lm (lock);
-	Metrics::const_iterator next_tempo;
-	const TempoSection* tempo = 0;
-	framepos_t effective_pos = max (pos, (framepos_t) 0);
-
-	/* Find the relevant initial tempo metric  */
-
-	for (next_tempo = metrics.begin(); next_tempo != metrics.end(); ++next_tempo) {
-
-		const TempoSection* t;
-
-		if ((t = dynamic_cast<const TempoSection*>(*next_tempo)) != 0) {
-
-			if ((*next_tempo)->frame() > effective_pos) {
-				break;
-			}
-
-			tempo = t;
-		}
-	}
-
-	/* We now have:
-
-	   tempo -> the Tempo for "pos"
-	   next_tempo -> the next tempo after "pos", possibly metrics.end()
-	*/
-	assert (tempo);
-
-	DEBUG_TRACE (DEBUG::TempoMath,
-	             string_compose ("frame %1 walk by %2 frames, start with tempo = %3 @ %4\n",
-	                             pos, distance, *((const Tempo*)tempo), tempo->frame()));
-
-	Evoral::Beats beats = Evoral::Beats();
-
-	while (distance) {
-
-		/* End of this section */
-		framepos_t end;
-		/* Distance to `end' in frames */
-		framepos_t distance_to_end;
-
-		if (next_tempo == metrics.end ()) {
-			/* We can't do (end - pos) if end is max_framepos, as it will overflow if pos is -ve */
-			end = max_framepos;
-			distance_to_end = max_framepos;
-		} else {
-			end = (*next_tempo)->frame ();
-			distance_to_end = end - pos;
-		}
-
-		/* Amount to subtract this time in frames */
-		framecnt_t const sub = min (distance, distance_to_end);
-
-		DEBUG_TRACE (DEBUG::TempoMath, string_compose ("to reach end at %1 (end ? %2), distance= %3 sub=%4\n", end, (next_tempo == metrics.end()),
-							       distance_to_end, sub));
-
-		/* Update */
-		pos += sub;
-		distance -= sub;
-		assert (tempo);
-		beats += Evoral::Beats::ticks_at_rate(sub, tempo->frames_per_beat (_frame_rate));
-
-		DEBUG_TRACE (DEBUG::TempoMath, string_compose ("now at %1, beats = %2 distance left %3\n",
-							       pos, beats, distance));
-
-		/* Move on if there's anything to move to */
-
-		if (next_tempo != metrics.end()) {
-
-			tempo = dynamic_cast<const TempoSection*>(*next_tempo);
-
-			DEBUG_TRACE (DEBUG::TempoMath,
-			             string_compose ("\tnew tempo = %1 @ %2 fpb = %3\n",
-			                             *((const Tempo*)tempo), tempo->frame(),
-			                             tempo->frames_per_beat (_frame_rate)));
-
-			while (next_tempo != metrics.end ()) {
 
-				++next_tempo;
-
-				if (next_tempo != metrics.end() && dynamic_cast<const TempoSection*>(*next_tempo)) {
-					break;
-				}
-			}
-
-			if (next_tempo == metrics.end()) {
-				DEBUG_TRACE (DEBUG::TempoMath, "no more tempo sections\n");
-			} else {
-				DEBUG_TRACE (DEBUG::TempoMath, string_compose ("next tempo section is %1 @ %2\n",
-									       **next_tempo, (*next_tempo)->frame()));
-			}
-
-		}
-		assert (tempo);
-	}
-
-	return beats;
-}
-
-TempoMap::BBTPointList::const_iterator
-TempoMap::bbt_before_or_at (framepos_t pos)
-{
-	/* CALLER MUST HOLD READ LOCK */
-
-	BBTPointList::const_iterator i;
-
-	if (pos < 0) {
-		/* not really correct, but we should catch pos < 0 at a higher
-		   level
-		*/
-		return _map.begin();
-	}
-
-	i = lower_bound (_map.begin(), _map.end(), pos);
-	assert (i != _map.end());
-	if ((*i).frame > pos) {
-		assert (i != _map.begin());
-		--i;
-	}
-	return i;
+	return Evoral::Beats (beat_at_frame_locked (_metrics, pos + distance) - beat_at_frame_locked (_metrics, pos));
 }
 
 struct bbtcmp {
@@ -2440,40 +3878,6 @@ struct bbtcmp {
     }
 };
 
-TempoMap::BBTPointList::const_iterator
-TempoMap::bbt_before_or_at (const BBT_Time& bbt)
-{
-	BBTPointList::const_iterator i;
-	bbtcmp cmp;
-
-	i = lower_bound (_map.begin(), _map.end(), bbt, cmp);
-	assert (i != _map.end());
-	if ((*i).bar > bbt.bars || (*i).beat > bbt.beats) {
-		assert (i != _map.begin());
-		--i;
-	}
-	return i;
-}
-
-TempoMap::BBTPointList::const_iterator
-TempoMap::bbt_after_or_at (framepos_t pos)
-{
-	/* CALLER MUST HOLD READ LOCK */
-
-	BBTPointList::const_iterator i;
-
-	if (_map.back().frame == pos) {
-		i = _map.end();
-		assert (i != _map.begin());
-		--i;
-		return i;
-	}
-
-	i = upper_bound (_map.begin(), _map.end(), pos);
-	assert (i != _map.end());
-	return i;
-}
-
 std::ostream&
 operator<< (std::ostream& o, const Meter& m) {
 	return o << m.divisions_per_bar() << '/' << m.note_divisor();
@@ -2487,7 +3891,7 @@ operator<< (std::ostream& o, const Tempo& t) {
 std::ostream&
 operator<< (std::ostream& o, const MetricSection& section) {
 
-	o << "MetricSection @ " << section.frame() << " aka " << section.start() << ' ';
+	o << "MetricSection @ " << section.frame() << ' ';
 
 	const TempoSection* ts;
 	const MeterSection* ms;
diff --git a/libs/ardour/tempo_map_importer.cc b/libs/ardour/tempo_map_importer.cc
index 5a6a2a4..91e2320 100644
--- a/libs/ardour/tempo_map_importer.cc
+++ b/libs/ardour/tempo_map_importer.cc
@@ -26,7 +26,7 @@
 #include "ardour/tempo.h"
 #include "pbd/failed_constructor.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace PBD;
diff --git a/libs/ardour/test/bbt_test.cc b/libs/ardour/test/bbt_test.cc
index 416d02b..8ca626d 100644
--- a/libs/ardour/test/bbt_test.cc
+++ b/libs/ardour/test/bbt_test.cc
@@ -16,7 +16,8 @@ BBTTest::addTest ()
 	Tempo    tempo(120);
 	Meter    meter(4.0, 4.0);
 
-	map.add_meter (meter, BBT_Time(1, 1, 0));
+	/* no need to supply the frame for a new music-locked meter */
+	map.add_meter (meter, 4.0, BBT_Time(2, 1, 0), 0, MusicTime);
 
 	/* add some good stuff here */
 }
diff --git a/libs/ardour/test/control_surfaces_test.cc b/libs/ardour/test/control_surfaces_test.cc
index 82b9653..440339c 100644
--- a/libs/ardour/test/control_surfaces_test.cc
+++ b/libs/ardour/test/control_surfaces_test.cc
@@ -31,7 +31,7 @@ using namespace ARDOUR;
 void
 ControlSurfacesTest::instantiateAndTeardownTest ()
 {
-	_session->new_audio_track (1, 2, Normal, 0, 1, "Test");
+	_session->new_audio_track (1, 2, NULL, 1, "Test", PresentationInfo::max_order, Normal);
 
 	ControlProtocolManager& m = ControlProtocolManager::instance ();
 	for (list<ControlProtocolInfo*>::iterator i = m.control_protocol_info.begin(); i != m.control_protocol_info.end(); ++i) {
diff --git a/libs/ardour/test/framepos_minus_beats_test.cc b/libs/ardour/test/framepos_minus_beats_test.cc
index 12f020e..85032d2 100644
--- a/libs/ardour/test/framepos_minus_beats_test.cc
+++ b/libs/ardour/test/framepos_minus_beats_test.cc
@@ -22,8 +22,8 @@ FrameposMinusBeatsTest::singleTempoTest ()
 	Tempo tempo (bpm);
 	Meter meter (4, 4);
 
-	map.add_meter (meter, BBT_Time (1, 1, 0));
-	map.add_tempo (tempo, BBT_Time (1, 1, 0));
+	map.replace_meter (map.first_meter(), meter, BBT_Time (1, 1, 0), (framepos_t) 0, AudioTime);
+	map.replace_tempo (map.first_tempo(), tempo, 0.0, 0, TempoSection::Constant, AudioTime);
 
 	/* Subtract 1 beat from beat 3 of the first bar */
 	framepos_t r = map.framepos_minus_beats (frames_per_beat * 2, Beats(1));
@@ -42,7 +42,7 @@ FrameposMinusBeatsTest::doubleTempoTest ()
 
 	TempoMap map (sampling_rate);
 	Meter meter (4, 4);
-	map.add_meter (meter, BBT_Time (1, 1, 0));
+	map.replace_meter (map.first_meter(), meter, BBT_Time (1, 1, 0), (framepos_t) 0, AudioTime);
 
 	/*
 	  120bpm at bar 1, 240bpm at bar 4
@@ -57,15 +57,16 @@ FrameposMinusBeatsTest::doubleTempoTest ()
 	  120bpm                                                240bpm
 	  0 beats                                               12 beats
 	  0 frames                                              288e3 frames
+	  0 pulses                                              4 pulses
 	  |                 |                 |                 |                 |
 	  | 1.1 1.2 1.3 1.4 | 2.1 2.2 2.3.2.4 | 3.1 3.2 3.3 3.4 | 4.1 4.2 4.3 4.4 |
 
 	*/
 
 	Tempo tempoA (120);
-	map.add_tempo (tempoA, BBT_Time (1, 1, 0));
+	map.replace_tempo (map.first_tempo(), tempoA, 0.0, 0, TempoSection::Constant, AudioTime);
 	Tempo tempoB (240);
-	map.add_tempo (tempoB, BBT_Time (4, 1, 0));
+	map.add_tempo (tempoB, 12.0 / tempoA.note_type(), 0, TempoSection::Constant, MusicTime);
 
 	/* Now some tests */
 
@@ -94,7 +95,7 @@ FrameposMinusBeatsTest::doubleTempoWithMeterTest ()
 
 	TempoMap map (sampling_rate);
 	Meter meterA (4, 4);
-	map.add_meter (meterA, BBT_Time (1, 1, 0));
+	map.replace_meter (map.first_meter(), meterA, BBT_Time (1, 1, 0), (framepos_t) 0, AudioTime);
 
 	/*
 	  120bpm at bar 1, 240bpm at bar 4
@@ -109,17 +110,18 @@ FrameposMinusBeatsTest::doubleTempoWithMeterTest ()
 	  120bpm                                                240bpm
 	  0 beats                                               12 beats
 	  0 frames                                              288e3 frames
+	  0 pulses                                              3 pulses
 	  |                 |                 |                 |             |
 	  | 1.1 1.2 1.3 1.4 | 2.1 2.2 2.3.2.4 | 3.1 3.2 3.3 3.4 | 4.1 4.2 4.3 |
 
 	*/
 
 	Tempo tempoA (120);
-	map.add_tempo (tempoA, BBT_Time (1, 1, 0));
+	map.replace_tempo (map.first_tempo(), tempoA, 0.0, 0, TempoSection::Constant, AudioTime);
 	Tempo tempoB (240);
-	map.add_tempo (tempoB, BBT_Time (4, 1, 0));
+	map.add_tempo (tempoB, 12.0 / tempoA.note_type(), 0, TempoSection::Constant, MusicTime);
 	Meter meterB (3, 4);
-	map.add_meter (meterB, BBT_Time (4, 1, 0));
+	map.add_meter (meterB, 12.0, BBT_Time (4, 1, 0), 0, MusicTime);
 
 	/* Now some tests */
 
diff --git a/libs/ardour/test/framepos_plus_beats_test.cc b/libs/ardour/test/framepos_plus_beats_test.cc
index 69fd9a5..8193eaf 100644
--- a/libs/ardour/test/framepos_plus_beats_test.cc
+++ b/libs/ardour/test/framepos_plus_beats_test.cc
@@ -21,8 +21,8 @@ FrameposPlusBeatsTest::singleTempoTest ()
 	Tempo tempo (bpm);
 	Meter meter (4, 4);
 
-	map.add_meter (meter, BBT_Time (1, 1, 0));
-	map.add_tempo (tempo, BBT_Time (1, 1, 0));
+	map.replace_meter (map.first_meter(), meter, BBT_Time (1, 1, 0), (framepos_t) 0, AudioTime);
+	map.replace_tempo (map.first_tempo(), tempo, 0.0, 0, TempoSection::Constant, AudioTime);
 
 	/* Add 1 beat to beat 3 of the first bar */
 	framepos_t r = map.framepos_plus_beats (frames_per_beat * 2, Evoral::Beats(1));
@@ -41,7 +41,7 @@ FrameposPlusBeatsTest::doubleTempoTest ()
 
 	TempoMap map (sampling_rate);
 	Meter meter (4, 4);
-	map.add_meter (meter, BBT_Time (1, 1, 0));
+	map.replace_meter (map.first_meter(), meter, BBT_Time (1, 1, 0), (framepos_t) 0, AudioTime);
 
 	/*
 	  120bpm at bar 1, 240bpm at bar 4
@@ -56,15 +56,16 @@ FrameposPlusBeatsTest::doubleTempoTest ()
 	  120bpm                                                240bpm
 	  0 beats                                               12 beats
 	  0 frames                                              288e3 frames
+	  0 pulses                                              3 pulses
 	  |                 |                 |                 |                 |
 	  | 1.1 1.2 1.3 1.4 | 2.1 2.2 2.3.2.4 | 3.1 3.2 3.3 3.4 | 4.1 4.2 4.3 4.4 |
 
 	*/
 
 	Tempo tempoA (120);
-	map.add_tempo (tempoA, BBT_Time (1, 1, 0));
+	map.replace_tempo (map.first_tempo(), tempoA, 0.0, 0, TempoSection::Constant, AudioTime);
 	Tempo tempoB (240);
-	map.add_tempo (tempoB, BBT_Time (4, 1, 0));
+	map.add_tempo (tempoB, 12.0 / tempoA.note_type(), 0, TempoSection::Constant, MusicTime);
 
 	/* Now some tests */
 
@@ -93,7 +94,7 @@ FrameposPlusBeatsTest::doubleTempoWithMeterTest ()
 
 	TempoMap map (sampling_rate);
 	Meter meterA (4, 4);
-	map.add_meter (meterA, BBT_Time (1, 1, 0));
+	map.replace_meter (map.first_meter(), meterA, BBT_Time (1, 1, 0), (framepos_t) 0, AudioTime);
 
 	/*
 	  120bpm at bar 1, 240bpm at bar 4
@@ -108,17 +109,18 @@ FrameposPlusBeatsTest::doubleTempoWithMeterTest ()
 	  120bpm                                                240bpm
 	  0 beats                                               12 beats
 	  0 frames                                              288e3 frames
+	  0 pulses                                              3 pulses
 	  |                 |                 |                 |             |
 	  | 1.1 1.2 1.3 1.4 | 2.1 2.2 2.3.2.4 | 3.1 3.2 3.3 3.4 | 4.1 4.2 4.3 |
 
 	*/
 
 	Tempo tempoA (120);
-	map.add_tempo (tempoA, BBT_Time (1, 1, 0));
+	map.replace_tempo (map.first_tempo(), tempoA, 0.0, 0, TempoSection::Constant, AudioTime);
 	Tempo tempoB (240);
-	map.add_tempo (tempoB, BBT_Time (4, 1, 0));
+	map.add_tempo (tempoB, 12.0 / tempoA.note_type(), 0, TempoSection::Constant, MusicTime);
 	Meter meterB (3, 4);
-	map.add_meter (meterB, BBT_Time (4, 1, 0));
+	map.add_meter (meterB, 12.0, BBT_Time (4, 1, 0), 0, MusicTime);
 
 	/* Now some tests */
 
diff --git a/libs/ardour/test/framewalk_to_beats_test.cc b/libs/ardour/test/framewalk_to_beats_test.cc
index 8b7748c..75a1e57 100644
--- a/libs/ardour/test/framewalk_to_beats_test.cc
+++ b/libs/ardour/test/framewalk_to_beats_test.cc
@@ -20,8 +20,8 @@ FramewalkToBeatsTest::singleTempoTest ()
 	Tempo tempo (bpm);
 	Meter meter (4, 4);
 
-	map.add_meter (meter, BBT_Time (1, 1, 0));
-	map.add_tempo (tempo, BBT_Time (1, 1, 0));
+	map.replace_meter (map.meter_section_at_frame (0), meter, BBT_Time (1, 1, 0), (framepos_t) 0, AudioTime);
+	map.replace_tempo (map.tempo_section_at_frame (0), tempo, 0.0, 0, TempoSection::Constant, AudioTime);
 
 	/* Walk 1 beats-worth of frames from beat 3 */
 	double r = map.framewalk_to_beats (frames_per_beat * 2, frames_per_beat * 1).to_double();
@@ -47,7 +47,7 @@ FramewalkToBeatsTest::doubleTempoTest ()
 
 	TempoMap map (sampling_rate);
 	Meter meter (4, 4);
-	map.add_meter (meter, BBT_Time (1, 1, 0));
+	map.replace_meter (map.meter_section_at_frame (0), meter, BBT_Time (1, 1, 0), (framepos_t) 0, AudioTime);
 
 	/*
 	  120bpm at bar 1, 240bpm at bar 4
@@ -63,6 +63,7 @@ FramewalkToBeatsTest::doubleTempoTest ()
 	  0 beats                                         12 beats
 	  0 frames                                        288e3 frames
 	  24e3 frames per beat                            12e3 frames per beat
+	  0 pulses                                        4 pulses
 	  |               |               |               |               |
 	  1.1 1.2 1.3 1.4 2.1 2.2 2.3 2.4 3.1 3.2 3.3 3.4 4.1 4.2 4.3 4.4 5.1
 	  0   1   2   3   4   5   6   7   8   9   10  11  12  13  14  15  16
@@ -70,9 +71,9 @@ FramewalkToBeatsTest::doubleTempoTest ()
 	*/
 
 	Tempo tempoA (120);
-	map.add_tempo (tempoA, BBT_Time (1, 1, 0));
+	map.replace_tempo (map.tempo_section_at_frame (0), tempoA, 0.0, 0, TempoSection::Constant, AudioTime);
 	Tempo tempoB (240);
-	map.add_tempo (tempoB, BBT_Time (4, 1, 0));
+	map.add_tempo (tempoB, 12.0 / tempoB.note_type(), 0, TempoSection::Constant, MusicTime);
 
 	/* Now some tests */
 
@@ -103,7 +104,7 @@ FramewalkToBeatsTest::tripleTempoTest ()
 
 	TempoMap map (sampling_rate);
 	Meter meter (4, 4);
-	map.add_meter (meter, BBT_Time (1, 1, 0));
+	map.replace_meter (map.meter_section_at_frame (0), meter, BBT_Time (1, 1, 0), (framepos_t) 0, AudioTime);
 
 	/*
 	  120bpm at bar 1, 240bpm at bar 2, 160bpm at bar 3
@@ -119,17 +120,18 @@ FramewalkToBeatsTest::tripleTempoTest ()
 	  120bpm            240bpm            160bpm
 	  0 beats           4 beats           8 beats
 	  0 frames          96e3 frames       144e3 frames
+	  0 pulses          1 pulse           2 pulses
 	  |                 |                 |                 |                 |
 	  | 1.1 1.2 1.3 1.4 | 2.1 2.2 2.3.2.4 | 3.1 3.2 3.3 3.4 | 4.1 4.2 4.3 4.4 |
 
 	*/
 
 	Tempo tempoA (120);
-	map.add_tempo (tempoA, BBT_Time (1, 1, 0));
+	map.replace_tempo (map.tempo_section_at_frame (0), tempoA, 0.0, 0, TempoSection::Constant, AudioTime);
 	Tempo tempoB (240);
-	map.add_tempo (tempoB, BBT_Time (2, 1, 0));
+	map.add_tempo (tempoB, 4.0 / tempoB.note_type(), 0, TempoSection::Constant, MusicTime);
 	Tempo tempoC (160);
-	map.add_tempo (tempoC, BBT_Time (3, 1, 0));
+	map.add_tempo (tempoC, 8.0 / tempoB.note_type(), 0, TempoSection::Constant, MusicTime);
 
 	/* Walk from 1|3 to 4|1 */
 	double r = map.framewalk_to_beats (2 * 24e3, (2 * 24e3) + (4 * 12e3) + (4 * 18e3)).to_double();
diff --git a/libs/ardour/test/midi_clock_slave_test.h b/libs/ardour/test/midi_clock_slave_test.h
index 0899eed..7bb5e28 100644
--- a/libs/ardour/test/midi_clock_slave_test.h
+++ b/libs/ardour/test/midi_clock_slave_test.h
@@ -48,8 +48,8 @@ class TestSlaveSessionProxy : public ISlaveSessionProxy {
           meter             (4.0, 4.0)
         {
           _tempo_map = new TempoMap (FRAME_RATE);
-          _tempo_map->add_tempo (tempo, Timecode::BBT_Time(1, 1, 0));
-          _tempo_map->add_meter (meter, Timecode::BBT_Time(1, 1, 0));
+          _tempo_map->add_tempo (tempo, 0.0, 0, TempoSection::Constant, AudioTime);
+          _tempo_map->add_meter (meter, 0.0, Timecode::BBT_Time(1, 1, 0), 0, AudioTime);
         }
 
         // Controlling the mock object
diff --git a/libs/ardour/test/profiling/lots_of_regions.cc b/libs/ardour/test/profiling/lots_of_regions.cc
index 4467822..0e5a4c2 100644
--- a/libs/ardour/test/profiling/lots_of_regions.cc
+++ b/libs/ardour/test/profiling/lots_of_regions.cc
@@ -29,7 +29,7 @@ main (int argc, char* argv[])
 	assert (playlist);
 
 	/* And the region */
-	boost::shared_ptr<MidiRegion> region = boost::dynamic_pointer_cast<MidiRegion> (playlist->region_list().rlist().front());
+	boost::shared_ptr<MidiRegion> region = boost::dynamic_pointer_cast<MidiRegion> (playlist->region_list_property().rlist().front());
 	assert (region);
 
 	/* Duplicate it a lot */
diff --git a/libs/ardour/test/tempo_test.cc b/libs/ardour/test/tempo_test.cc
index 4905259..04bf071 100644
--- a/libs/ardour/test/tempo_test.cc
+++ b/libs/ardour/test/tempo_test.cc
@@ -14,7 +14,7 @@ TempoTest::recomputeMapTest ()
 
 	TempoMap map (sampling_rate);
 	Meter meterA (4, 4);
-	map.add_meter (meterA, BBT_Time (1, 1, 0));
+	map.replace_meter (map.first_meter(), meterA, BBT_Time (1, 1, 0), (framepos_t) 0, AudioTime);
 
 	/*
 	  120bpm at bar 1, 240bpm at bar 4
@@ -29,22 +29,81 @@ TempoTest::recomputeMapTest ()
 	  120bpm                                                240bpm
 	  0 beats                                               12 beats
 	  0 frames                                              288e3 frames
+	  0 pulses                                              3 pulses
 	  |                 |                 |                 |             |
 	  | 1.1 1.2 1.3 1.4 | 2.1 2.2 2.3.2.4 | 3.1 3.2 3.3 3.4 | 4.1 4.2 4.3 |
 
 	*/
 
 	Tempo tempoA (120);
-	map.add_tempo (tempoA, BBT_Time (1, 1, 0));
+	map.replace_tempo (map.first_tempo(), tempoA, 0.0, 0, TempoSection::Constant, AudioTime);
 	Tempo tempoB (240);
-	map.add_tempo (tempoB, BBT_Time (4, 1, 0));
+	map.add_tempo (tempoB, 3.0, 0, TempoSection::Constant, MusicTime);
 	Meter meterB (3, 4);
-	map.add_meter (meterB, BBT_Time (4, 1, 0));
+	map.add_meter (meterB, 12.0, BBT_Time (4, 1, 0), 0, MusicTime);
 
-	list<MetricSection*>::iterator i = map.metrics.begin();
+	list<MetricSection*>::iterator i = map._metrics.begin();
 	CPPUNIT_ASSERT_EQUAL (framepos_t (0), (*i)->frame ());
 
-	i = map.metrics.end();
+	i = map._metrics.end();
 	--i;
 	CPPUNIT_ASSERT_EQUAL (framepos_t (288e3), (*i)->frame ());
 }
+
+void
+TempoTest::rampTest ()
+{
+	int const sampling_rate = 48000;
+
+	TempoMap map (sampling_rate);
+	Meter meterA (4, 4);
+	Tempo tempoA (77.0, 4.0);
+	Tempo tempoB (217.0, 4.0);
+	map.replace_tempo (map.first_tempo(), tempoA, 0.0, 0, TempoSection::Ramp, AudioTime);
+	map.add_tempo (tempoB, 0.0, (framepos_t) 60 * sampling_rate, TempoSection::Ramp, AudioTime);
+	map.replace_meter (map.first_meter(), meterA, BBT_Time (1, 1, 0), (framepos_t) 0, AudioTime);
+
+	/*
+
+	  77bpm / note typeA                                    217bpm / note type B
+	  0 frames                                              60 * sample rate frames
+	  |                 |                 |                 |             |
+	  |                                                    *|
+	  |                                                  *  |
+	  |                                                *    |
+	  |                                             *       |
+	  |                                          *          |
+	  |                                      *              |
+	  |                                 *                   |
+	  |                           *  |                      |
+	  |                  *           |                      |
+	  |     *            |           |                      |
+	  -------------------|-----------|-----------------------
+                             20 seconds  125.0 bpm / note_type
+	*/
+
+	TempoSection* tA = 0;
+	TempoSection* tB;
+	list<MetricSection*>::iterator i;
+
+	for (i = map._metrics.begin(); i != map._metrics.end(); ++i) {
+		if ((tB = dynamic_cast<TempoSection*> (*i)) != 0) {
+			if (tA) {
+				break;
+			}
+			tA = tB;
+		}
+	}
+	map.recompute_map (map._metrics);
+
+	CPPUNIT_ASSERT_EQUAL (tB->frame(), tA->frame_at_tempo (tB->beats_per_minute() / tB->note_type(), 300.0, sampling_rate));
+	CPPUNIT_ASSERT_EQUAL (tB->frame(), tA->frame_at_pulse (tB->pulse(), sampling_rate));
+
+	/* self-check tempo at pulse @ 125 bpm. */
+	CPPUNIT_ASSERT_DOUBLES_EQUAL (125.0 / 4.0, tA->tempo_at_pulse (tA->pulse_at_tempo (125.0 / 4.0, 0, sampling_rate)), 0.00000000000000001);
+
+	/* self-check frame at pulse 20 seconds in. */
+	const framepos_t target = 20 * sampling_rate;
+	const framepos_t result = tA->frame_at_pulse (tA->pulse_at_frame (target, sampling_rate), sampling_rate);
+	CPPUNIT_ASSERT_EQUAL (target, result);
+}
diff --git a/libs/ardour/test/tempo_test.h b/libs/ardour/test/tempo_test.h
index 3252650..e2a6701 100644
--- a/libs/ardour/test/tempo_test.h
+++ b/libs/ardour/test/tempo_test.h
@@ -6,6 +6,7 @@ class TempoTest : public CppUnit::TestFixture
 {
 	CPPUNIT_TEST_SUITE (TempoTest);
 	CPPUNIT_TEST (recomputeMapTest);
+	CPPUNIT_TEST (rampTest);
 	CPPUNIT_TEST_SUITE_END ();
 
 public:
@@ -13,5 +14,6 @@ public:
 	void tearDown () {}
 
 	void recomputeMapTest ();
+	void rampTest ();
 };
 
diff --git a/libs/ardour/thread_buffers.cc b/libs/ardour/thread_buffers.cc
index 2336ee5..9b08f5c 100644
--- a/libs/ardour/thread_buffers.cc
+++ b/libs/ardour/thread_buffers.cc
@@ -30,6 +30,7 @@ using namespace std;
 ThreadBuffers::ThreadBuffers ()
 	: silent_buffers (new BufferSet)
 	, scratch_buffers (new BufferSet)
+	, noinplace_buffers (new BufferSet)
 	, route_buffers (new BufferSet)
 	, mix_buffers (new BufferSet)
 	, gain_automation_buffer (0)
@@ -71,6 +72,7 @@ ThreadBuffers::ensure_buffers (ChanCount howmany, size_t custom)
 		}
 
 		scratch_buffers->ensure_buffers (*t, count, size);
+		noinplace_buffers->ensure_buffers (*t, count, size);
 		mix_buffers->ensure_buffers (*t, count, size);
 		silent_buffers->ensure_buffers (*t, count, size);
 		route_buffers->ensure_buffers (*t, count, size);
diff --git a/libs/ardour/ticker.cc b/libs/ardour/ticker.cc
index e02143e..def219a 100644
--- a/libs/ardour/ticker.cc
+++ b/libs/ardour/ticker.cc
@@ -68,9 +68,10 @@ public:
 	    s->bbt_time (this->frame, *this);
 
 	    const TempoMap& tempo = s->tempo_map();
+	    const Meter& meter = tempo.meter_at_frame (frame);
 
-	    const double divisions   = tempo.meter_at(frame).divisions_per_bar();
-	    const double divisor     = tempo.meter_at(frame).note_divisor();
+	    const double divisions   = meter.divisions_per_bar();
+	    const double divisor     = meter.note_divisor();
 	    const double qnote_scale = divisor * 0.25f;
 	    double mb;
 
@@ -307,8 +308,8 @@ MidiClockTicker::tick (const framepos_t& /* transport_frame */, pframes_t nframe
 double
 MidiClockTicker::one_ppqn_in_frames (framepos_t transport_position)
 {
-	const Tempo& current_tempo = _session->tempo_map().tempo_at (transport_position);
-	double frames_per_beat = current_tempo.frames_per_beat (_session->nominal_frame_rate());
+	const Tempo& current_tempo = _session->tempo_map().tempo_at_frame (transport_position);
+	double frames_per_beat = _session->tempo_map().frames_per_beat_at (transport_position, _session->nominal_frame_rate());
 
 	double quarter_notes_per_beat = 4.0 / current_tempo.note_type();
 	double frames_per_quarter_note = frames_per_beat / quarter_notes_per_beat;
diff --git a/libs/ardour/track.cc b/libs/ardour/track.cc
index f279eae..02c44ed 100644
--- a/libs/ardour/track.cc
+++ b/libs/ardour/track.cc
@@ -23,26 +23,28 @@
 #include "ardour/diskstream.h"
 #include "ardour/io_processor.h"
 #include "ardour/meter.h"
+#include "ardour/monitor_control.h"
 #include "ardour/playlist.h"
 #include "ardour/port.h"
 #include "ardour/processor.h"
+#include "ardour/record_enable_control.h"
+#include "ardour/record_safe_control.h"
 #include "ardour/route_group_specialized.h"
 #include "ardour/session.h"
 #include "ardour/session_playlists.h"
 #include "ardour/track.h"
 #include "ardour/utils.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
 using namespace PBD;
 
-Track::Track (Session& sess, string name, Route::Flag flag, TrackMode mode, DataType default_type)
+Track::Track (Session& sess, string name, PresentationInfo::Flag flag, TrackMode mode, DataType default_type)
 	: Route (sess, name, flag, default_type)
         , _saved_meter_point (_meter_point)
         , _mode (mode)
-	, _monitoring (MonitorAuto)
 {
 	_freeze_record.state = NoFreeze;
         _declickable = true;
@@ -62,17 +64,23 @@ Track::init ()
 
 	boost::shared_ptr<Route> rp (shared_from_this());
 	boost::shared_ptr<Track> rt = boost::dynamic_pointer_cast<Track> (rp);
-	_rec_enable_control = boost::shared_ptr<RecEnableControl> (new RecEnableControl(rt));
-	_rec_enable_control->set_flags (Controllable::Toggle);
-        _monitoring_control.reset (new MonitoringControllable (X_("monitoring"), rt));
 
-	/* don't add rec_enable_control to controls because we don't want it to
-	 * appear as an automatable parameter
-	 */
-	track_number_changed.connect_same_thread (*this, boost::bind (&Track::resync_track_name, this));
+	_record_enable_control.reset (new RecordEnableControl (_session, X_("recenable"), *this));
+	add_control (_record_enable_control);
+
+	_record_safe_control.reset (new RecordSafeControl (_session, X_("recsafe"), *this));
+	add_control (_record_safe_control);
+
+	_monitoring_control.reset (new MonitorControl (_session, X_("monitoring"), *this));
+	add_control (_monitoring_control);
+
 	_session.config.ParameterChanged.connect_same_thread (*this, boost::bind (&Track::parameter_changed, this, _1));
 
-	return 0;
+        _monitoring_control->Changed.connect_same_thread (*this, boost::bind (&Track::monitoring_changed, this, _1, _2));
+        _record_safe_control->Changed.connect_same_thread (*this, boost::bind (&Track::record_safe_changed, this, _1, _2));
+        _record_enable_control->Changed.connect_same_thread (*this, boost::bind (&Track::record_enable_changed, this, _1, _2));
+
+        return 0;
 }
 
 void
@@ -97,9 +105,12 @@ XMLNode&
 Track::state (bool full)
 {
 	XMLNode& root (Route::state (full));
-	root.add_property (X_("monitoring"), enum_2_string (_monitoring));
+
+	root.add_child_nocopy (_monitoring_control->get_state ());
+	root.add_child_nocopy (_record_safe_control->get_state ());
+	root.add_child_nocopy (_record_enable_control->get_state ());
+
 	root.add_property (X_("saved-meter-point"), enum_2_string (_saved_meter_point));
-	root.add_child_nocopy (_rec_enable_control->get_state());
 	root.add_child_nocopy (_diskstream->get_state ());
 
 	return root;
@@ -134,21 +145,24 @@ Track::set_state (const XMLNode& node, int version)
 	for (XMLNodeConstIterator niter = nlist.begin(); niter != nlist.end(); ++niter) {
 		child = *niter;
 
-		XMLProperty* prop;
-		if (child->name() == Controllable::xml_node_name && (prop = child->property ("name")) != 0) {
-			if (prop->value() == X_("recenable")) {
-				_rec_enable_control->set_state (*child, version);
+		XMLProperty const * prop;
+
+		if (child->name() == Controllable::xml_node_name) {
+			if ((prop = child->property ("name")) == 0) {
+				continue;
+			}
+
+			if (prop->value() == _record_enable_control->name()) {
+				_record_enable_control->set_state (*child, version);
+			} else if (prop->value() == _record_safe_control->name()) {
+				_record_safe_control->set_state (*child, version);
+			} else if (prop->value() == _monitoring_control->name()) {
+				_monitoring_control->set_state (*child, version);
 			}
 		}
 	}
 
-	const XMLProperty* prop;
-
-	if ((prop = node.property (X_("monitoring"))) != 0) {
-		_monitoring = MonitorChoice (string_2_enum (prop->value(), _monitoring));
-	} else {
-		_monitoring = MonitorAuto;
-	}
+	XMLProperty const * prop;
 
 	if ((prop = node.property (X_("saved-meter-point"))) != 0) {
 		_saved_meter_point = MeterPoint (string_2_enum (prop->value(), _saved_meter_point));
@@ -178,62 +192,6 @@ Track::freeze_state() const
 	return _freeze_record.state;
 }
 
-Track::RecEnableControl::RecEnableControl (boost::shared_ptr<Track> t)
-	: AutomationControl (t->session(),
-	                     RecEnableAutomation,
-	                     ParameterDescriptor(Evoral::Parameter(RecEnableAutomation)),
-	                     boost::shared_ptr<AutomationList>(),
-	                     X_("recenable"))
-	, track (t)
-{
-	boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(RecEnableAutomation)));
-	set_list (gl);
-}
-
-void
-Track::RecEnableControl::set_value (double val, Controllable::GroupControlDisposition group_override)
-{
-	if (writable()) {
-		_set_value (val, group_override);
-	}
-}
-
-void
-Track::RecEnableControl::set_value_unchecked (double val)
-{
-	if (writable()) {
-		_set_value (val, Controllable::NoGroup);
-	}
-}
-
-void
-Track::RecEnableControl::_set_value (double val, Controllable::GroupControlDisposition group_override)
-{
-	boost::shared_ptr<Track> t = track.lock ();
-	if (!t) {
-		return;
-	}
-
-	t->set_record_enabled (val >= 0.5 ? true : false, group_override);
-}
-
-double
-Track::RecEnableControl::get_value () const
-{
-	boost::shared_ptr<Track> t = track.lock ();
-	if (!t) {
-		return 0;
-	}
-
-	return (t->record_enabled() ? 1.0 : 0.0);
-}
-
-bool
-Track::record_enabled () const
-{
-	return _diskstream && _diskstream->record_enabled ();
-}
-
 bool
 Track::can_record()
 {
@@ -246,24 +204,15 @@ Track::can_record()
 	return will_record;
 }
 
-void
-Track::prep_record_enabled (bool yn, Controllable::GroupControlDisposition group_override)
+int
+Track::prep_record_enabled (bool yn)
 {
-	if (yn && record_safe ()) {
-	    return;
-	}
-
-	if (!_session.writable()) {
-		return;
-	}
-
-	if (_freeze_record.state == Frozen) {
-		return;
+	if (yn && _record_safe_control->get_value()) {
+		return -1;
 	}
 
-	if (use_group (group_override, &RouteGroup::is_recenable)) {
-		_route_group->apply (&Track::prep_record_enabled, yn, Controllable::NoGroup);
-		return;
+	if (!can_be_record_enabled()) {
+		return -1;
 	}
 
 	/* keep track of the meter point as it was before we rec-enabled */
@@ -288,56 +237,32 @@ Track::prep_record_enabled (bool yn, Controllable::GroupControlDisposition group
 			set_meter_point (_saved_meter_point);
 		}
 	}
+
+	return 0;
 }
 
 void
-Track::set_record_enabled (bool yn, Controllable::GroupControlDisposition group_override)
+Track::record_enable_changed (bool, Controllable::GroupControlDisposition)
 {
-	if (_diskstream->record_safe ()) {
-	    return;
-	}
-
-	if (!_session.writable()) {
-		return;
-	}
-
-	if (_freeze_record.state == Frozen) {
-		return;
-	}
-
-	if (use_group (group_override, &RouteGroup::is_recenable)) {
-		_route_group->apply (&Track::set_record_enabled, yn, Controllable::NoGroup);
-		return;
-	}
-
-	_diskstream->set_record_enabled (yn);
+	_diskstream->set_record_enabled (_record_enable_control->get_value());
+}
 
-	_rec_enable_control->Changed ();
+void
+Track::record_safe_changed (bool, Controllable::GroupControlDisposition)
+{
+	_diskstream->set_record_safe (_record_safe_control->get_value());
 }
 
 bool
-Track::record_safe () const
+Track::can_be_record_safe ()
 {
-	return _diskstream && _diskstream->record_safe ();
+	return !_record_enable_control->get_value() && _diskstream && _session.writable() && (_freeze_record.state != Frozen);
 }
 
-void
-Track::set_record_safe (bool yn, Controllable::GroupControlDisposition group_override)
+bool
+Track::can_be_record_enabled ()
 {
-	if (!_session.writable()) {
-		return;
-	}
-
-	if (_freeze_record.state == Frozen) {
-		return;
-	}
-
-	if (use_group (group_override, &RouteGroup::is_recenable)) {
-		_route_group->apply (&Track::set_record_safe, yn, Controllable::NoGroup);
-		return;
-	}
-
-	_diskstream->set_record_safe (yn);
+	return !_record_safe_control->get_value() && _diskstream && !_diskstream->record_safe() && _session.writable() && (_freeze_record.state != Frozen);
 }
 
 void
@@ -367,7 +292,7 @@ Track::set_name (const string& str)
 {
 	bool ret;
 
-	if (record_enabled() && _session.actively_recording()) {
+	if (_record_enable_control->get_value() && _session.actively_recording()) {
 		/* this messes things up if done while recording */
 		return false;
 	}
@@ -448,7 +373,7 @@ Track::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame,
 
 	if (!_active) {
 		silence (nframes);
-		if (_meter_point == MeterInput && (_monitoring & MonitorInput || _diskstream->record_enabled())) {
+		if (_meter_point == MeterInput && ((_monitoring_control->monitoring_choice() & MonitorInput) || _diskstream->record_enabled())) {
 			_meter->reset();
 		}
 		return 0;
@@ -533,10 +458,10 @@ Track::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame,
 
 			if (no_meter) {
 				BufferSet& bufs (_session.get_silent_buffers (n_process_buffers()));
-				_meter->run (bufs, 0, 0, nframes, true);
-				_input->process_input (boost::shared_ptr<Processor>(), start_frame, end_frame, nframes);
+				_meter->run (bufs, start_frame, end_frame, 1.0, nframes, true);
+				_input->process_input (boost::shared_ptr<Processor>(), start_frame, end_frame, speed(), nframes);
 			} else {
-				_input->process_input (_meter, start_frame, end_frame, nframes);
+				_input->process_input (_meter, start_frame, end_frame, speed(), nframes);
 			}
 		}
 
@@ -549,18 +474,13 @@ Track::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame,
 		fill_buffers_with_input (bufs, _input, nframes);
 
 		if (_meter_point == MeterInput) {
-			_meter->run (bufs, start_frame, end_frame, nframes, true);
+			_meter->run (bufs, start_frame, end_frame, 1.0 /*speed()*/, nframes, true);
 		}
 
 		passthru (bufs, start_frame, end_frame, nframes, false);
 	}
 
-	for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
-		boost::shared_ptr<Delivery> d = boost::dynamic_pointer_cast<Delivery> (*i);
-		if (d) {
-			d->flush_buffers (nframes);
-		}
-	}
+	flush_processor_buffers_locked (nframes);
 
 	return 0;
 }
@@ -590,6 +510,7 @@ Track::silent_roll (pframes_t nframes, framepos_t /*start_frame*/, framepos_t /*
 	_amp->apply_gain_automation(false);
 
 	silence (nframes);
+	flush_processor_buffers_locked (nframes);
 
 	framecnt_t playback_distance;
 
@@ -607,8 +528,6 @@ Track::set_diskstream (boost::shared_ptr<Diskstream> ds)
 
 	ds->PlaylistChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_playlist_changed, this));
 	diskstream_playlist_changed ();
-	ds->RecordEnableChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_record_enable_changed, this));
-	ds->RecordSafeChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_record_safe_changed, this));
 	ds->SpeedChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_speed_changed, this));
 	ds->AlignmentStyleChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_alignment_style_changed, this));
 }
@@ -620,18 +539,6 @@ Track::diskstream_playlist_changed ()
 }
 
 void
-Track::diskstream_record_enable_changed ()
-{
-	RecordEnableChanged (); /* EMIT SIGNAL */
-}
-
-void
-Track::diskstream_record_safe_changed ()
-{
-	RecordSafeChanged (); /* EMIT SIGNAL */
-}
-
-void
 Track::diskstream_speed_changed ()
 {
 	SpeedChanged (); /* EMIT SIGNAL */
@@ -1010,12 +917,13 @@ MonitorState
 Track::monitoring_state () const
 {
 	/* Explicit requests */
+	MonitorChoice m (_monitoring_control->monitoring_choice());
 
-	if (_monitoring & MonitorInput) {
+	if (m & MonitorInput) {
 		return MonitoringInput;
 	}
 
-	if (_monitoring & MonitorDisk) {
+	if (m & MonitorDisk) {
 		return MonitoringDisk;
 	}
 
@@ -1082,7 +990,7 @@ Track::maybe_declick (BufferSet& bufs, framecnt_t nframes, int declick)
 	   ditto if we are monitoring inputs.
         */
 
-        if (_have_internal_generator || monitoring_choice() == MonitorInput) {
+	if (_have_internal_generator || (_monitoring_control->monitoring_choice() == MonitorInput)) {
                 return;
         }
 
@@ -1132,22 +1040,10 @@ Track::check_initial_delay (framecnt_t nframes, framepos_t& transport_frame)
 }
 
 void
-Track::set_monitoring (MonitorChoice mc, Controllable::GroupControlDisposition gcd)
+Track::monitoring_changed (bool, Controllable::GroupControlDisposition)
 {
-	if (use_group (gcd, &RouteGroup::is_monitoring)) {
-		_route_group->apply (&Track::set_monitoring, mc, Controllable::NoGroup);
-		return;
-	}
-
-	if (mc !=  _monitoring) {
-		_monitoring = mc;
-
-		for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
-			(*i)->monitoring_changed ();
-		}
-
-		MonitoringChanged (); /* EMIT SIGNAL */
-		_monitoring_control->Changed (); /* EMIT SIGNAL */
+	for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
+		(*i)->monitoring_changed ();
 	}
 }
 
@@ -1157,64 +1053,10 @@ Track::metering_state () const
 	bool rv;
 	if (_session.transport_rolling ()) {
 		// audio_track.cc || midi_track.cc roll() runs meter IFF:
-		rv = _meter_point == MeterInput && (_monitoring & MonitorInput || _diskstream->record_enabled());
+		rv = _meter_point == MeterInput && ((_monitoring_control->monitoring_choice() & MonitorInput) || _diskstream->record_enabled());
 	} else {
 		// track no_roll() always metering if
 		rv = _meter_point == MeterInput;
 	}
 	return rv ? MeteringInput : MeteringRoute;
 }
-
-Track::MonitoringControllable::MonitoringControllable (std::string name, boost::shared_ptr<Track> r)
-	: RouteAutomationControl (name, MonitoringAutomation, boost::shared_ptr<AutomationList>(), r)
-{
-	boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(MonitoringAutomation)));
-	gl->set_interpolation(Evoral::ControlList::Discrete);
-	set_list (gl);
-}
-
-void
-Track::MonitoringControllable::set_value (double val, Controllable::GroupControlDisposition gcd)
-{
-	_set_value (val, gcd);
-}
-
-void
-Track::MonitoringControllable::_set_value (double val, Controllable::GroupControlDisposition gcd)
-{
-	boost::shared_ptr<Route> r = _route.lock();
-	if (!r) {
-		return;
-	}
-
-	boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (r);
-	if (!t) {
-		return;
-	}
-
-	int mc = (int) val;
-
-	if (mc < MonitorAuto || mc > MonitorDisk) {
-		return;
-	}
-
-	/* no group effect at present */
-
-	t->set_monitoring ((MonitorChoice) mc, gcd);
-}
-
-double
-Track::MonitoringControllable::get_value () const
-{
-	boost::shared_ptr<Route> r = _route.lock();
-	if (!r) {
-		return 0.0;
-	}
-
-	boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (r);
-	if (!t) {
-		return 0.0;
-	}
-
-	return t->monitoring_choice();
-}
diff --git a/libs/ardour/transient_detector.cc b/libs/ardour/transient_detector.cc
index 41bb51f..6eed836 100644
--- a/libs/ardour/transient_detector.cc
+++ b/libs/ardour/transient_detector.cc
@@ -22,7 +22,7 @@
 #include "ardour/readable.h"
 #include "ardour/transient_detector.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace Vamp;
 using namespace ARDOUR;
@@ -86,11 +86,15 @@ TransientDetector::set_threshold (float val)
 }
 
 void
-TransientDetector::set_sensitivity (float val)
+TransientDetector::set_sensitivity (uint32_t mode, float val)
 {
 	if (plugin) {
-		plugin->selectProgram ("Percussive onsets");
-		plugin->setParameter ("sensitivity", val);
+		// see libs/vamp-plugins/OnsetDetect.cpp
+		//plugin->selectProgram ("General purpose"); // dftype = 3, sensitivity = 50, whiten = 0 (default)
+		//plugin->selectProgram ("Percussive onsets"); // dftype = 4, sensitivity = 40, whiten = 0
+		plugin->setParameter ("dftype", mode);
+		plugin->setParameter ("sensitivity", std::min (100.f, std::max (0.f, val)));
+		plugin->setParameter ("whiten", 0);
 	}
 }
 
@@ -119,7 +123,7 @@ TransientDetector::cleanup_transients (AnalysisFeatureList& t, float sr, float g
 
 		// move f until we find a new value that is far enough away
 
-		while ((f != t.end()) && (((*f) - (*i)) < gap_frames)) {
+		while ((f != t.end()) && gap_frames > 0 && (((*f) - (*i)) < gap_frames)) {
 			++f;
 		}
 
diff --git a/libs/ardour/unknown_processor.cc b/libs/ardour/unknown_processor.cc
index df40d4d..8fbb178 100644
--- a/libs/ardour/unknown_processor.cc
+++ b/libs/ardour/unknown_processor.cc
@@ -20,7 +20,7 @@
 #include "ardour/audio_buffer.h"
 #include "ardour/unknown_processor.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
@@ -103,12 +103,15 @@ UnknownProcessor::can_support_io_configuration (const ChanCount &in, ChanCount &
 		out = in;
 #endif
 		return true;
+	} else {
+		PBD::error << _("Using plugin-stub with mismatching i/o configuration for: ") << name() << endmsg;
+		out = in;
 	}
-	return false;
+	return true;
 }
 
 void
-UnknownProcessor::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end_frame*/, pframes_t nframes, bool)
+UnknownProcessor::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end_frame*/, double /*speed*/, pframes_t nframes, bool)
 {
 	if (!have_ioconfig) {
 		return;
diff --git a/libs/ardour/uri_map.cc b/libs/ardour/uri_map.cc
index 6fac103..4bdb405 100644
--- a/libs/ardour/uri_map.cc
+++ b/libs/ardour/uri_map.cc
@@ -27,6 +27,7 @@
 #include "pbd/error.h"
 
 #include "ardour/uri_map.h"
+#include "ardour/lv2_extensions.h"
 
 namespace ARDOUR {
 
@@ -46,6 +47,7 @@ URIMap::URIDs::init(URIMap& uri_map)
 	atom_Float          = uri_map.uri_to_id("http://lv2plug.in/ns/ext/atom#Float");
 	log_Error           = uri_map.uri_to_id("http://lv2plug.in/ns/ext/log#Error");
 	log_Note            = uri_map.uri_to_id("http://lv2plug.in/ns/ext/log#Note");
+	log_Trace           = uri_map.uri_to_id("http://lv2plug.in/ns/ext/log#Trace");
 	log_Warning         = uri_map.uri_to_id("http://lv2plug.in/ns/ext/log#Warning");
 	midi_MidiEvent      = uri_map.uri_to_id("http://lv2plug.in/ns/ext/midi#MidiEvent");
 	time_Position       = uri_map.uri_to_id("http://lv2plug.in/ns/ext/time#Position");
@@ -60,6 +62,15 @@ URIMap::URIDs::init(URIMap& uri_map)
 	patch_Set           = uri_map.uri_to_id("http://lv2plug.in/ns/ext/patch#Set");
 	patch_property      = uri_map.uri_to_id("http://lv2plug.in/ns/ext/patch#property");
 	patch_value         = uri_map.uri_to_id("http://lv2plug.in/ns/ext/patch#value");
+#ifdef LV2_EXTENDED
+	auto_event         = uri_map.uri_to_id(LV2_AUTOMATE_URI__event);
+	auto_setup         = uri_map.uri_to_id(LV2_AUTOMATE_URI__setup);
+	auto_finalize      = uri_map.uri_to_id(LV2_AUTOMATE_URI__finalize);
+	auto_start         = uri_map.uri_to_id(LV2_AUTOMATE_URI__start);
+	auto_end           = uri_map.uri_to_id(LV2_AUTOMATE_URI__end);
+	auto_parameter     = uri_map.uri_to_id(LV2_AUTOMATE_URI__parameter);
+	auto_value         = uri_map.uri_to_id(LV2_AUTOMATE_URI__value);
+#endif
 }
 
 URIMap&
diff --git a/libs/ardour/user_bundle.cc b/libs/ardour/user_bundle.cc
index aaafcb0..dda0a6d 100644
--- a/libs/ardour/user_bundle.cc
+++ b/libs/ardour/user_bundle.cc
@@ -18,7 +18,7 @@
 */
 
 #include "ardour/user_bundle.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
 #include "pbd/compose.h"
 #include "pbd/error.h"
 #include "pbd/failed_constructor.h"
diff --git a/libs/ardour/utils.cc b/libs/ardour/utils.cc
index 08bb610..8e57cde 100644
--- a/libs/ardour/utils.cc
+++ b/libs/ardour/utils.cc
@@ -57,7 +57,7 @@
 #include "ardour/utils.h"
 #include "ardour/rc_configuration.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 using namespace std;
@@ -754,3 +754,4 @@ ARDOUR::slider_position_to_gain_with_max (double g, double max_gain)
 extern "C" {
 	void c_stacktrace() { stacktrace (cerr); }
 }
+
diff --git a/libs/ardour/vca.cc b/libs/ardour/vca.cc
new file mode 100644
index 0000000..a2b1691
--- /dev/null
+++ b/libs/ardour/vca.cc
@@ -0,0 +1,200 @@
+/*
+  Copyright (C) 2016 Paul Davis
+
+  This program is free software; you can redistribute it and/or modify it
+  under the terms of the GNU General Public License as published by the Free
+  Software Foundation; either version 2 of the License, or (at your option)
+  any later version.
+
+  This program is distributed in the hope that it will be useful, but WITHOUT
+  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+  for more details.
+
+  You should have received a copy of the GNU General Public License along
+  with this program; if not, write to the Free Software Foundation, Inc.,
+  675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#include "pbd/convert.h"
+
+#include "ardour/automation_control.h"
+#include "ardour/debug.h"
+#include "ardour/gain_control.h"
+#include "ardour/monitor_control.h"
+#include "ardour/rc_configuration.h"
+#include "ardour/route.h"
+#include "ardour/session.h"
+#include "ardour/vca.h"
+
+#include "pbd/i18n.h"
+
+using namespace ARDOUR;
+using namespace PBD;
+using std::string;
+
+Glib::Threads::Mutex VCA::number_lock;
+int32_t VCA::next_number = 1;
+string VCA::xml_node_name (X_("VCA"));
+
+string
+VCA::default_name_template ()
+{
+	return _("VCA %n");
+}
+
+int32_t
+VCA::next_vca_number ()
+{
+	/* we could use atomic inc here, but elsewhere we need more complete
+	   mutex semantics, so we have to do it here also.
+	*/
+	Glib::Threads::Mutex::Lock lm (number_lock);
+	return next_number++;
+}
+
+void
+VCA::set_next_vca_number (int32_t n)
+{
+	Glib::Threads::Mutex::Lock lm (number_lock);
+	next_number = n;
+}
+
+int32_t
+VCA::get_next_vca_number ()
+{
+	Glib::Threads::Mutex::Lock lm (number_lock);
+	return next_number;
+}
+
+VCA::VCA (Session& s,  int32_t num, const string& name)
+	: Stripable (s, name, PresentationInfo (num, PresentationInfo::VCA))
+	, Muteable (s, name)
+	, Automatable (s)
+	, _number (num)
+	, _gain_control (new GainControl (s, Evoral::Parameter (GainAutomation), boost::shared_ptr<AutomationList> ()))
+{
+}
+
+int
+VCA::init ()
+{
+	_solo_control.reset (new SoloControl (_session, X_("solo"), *this, *this));
+	_mute_control.reset (new MuteControl (_session, X_("mute"), *this));
+
+	add_control (_gain_control);
+	add_control (_solo_control);
+	add_control (_mute_control);
+
+	return 0;
+}
+
+VCA::~VCA ()
+{
+	DEBUG_TRACE (DEBUG::Destruction, string_compose ("delete VCA %1\n", number()));
+	{
+		Glib::Threads::Mutex::Lock lm (number_lock);
+		if (_number == next_number - 1) {
+			/* this was the "last" VCA added, so rewind the next number so
+			 * that future VCAs get numbered as intended
+			 */
+			next_number--;
+		}
+	}
+}
+
+XMLNode&
+VCA::get_state ()
+{
+	XMLNode* node = new XMLNode (xml_node_name);
+	node->add_property (X_("name"), _name);
+	node->add_property (X_("number"), _number);
+
+	node->add_child_nocopy (_presentation_info.get_state());
+
+	node->add_child_nocopy (_gain_control->get_state());
+	node->add_child_nocopy (_solo_control->get_state());
+	node->add_child_nocopy (_mute_control->get_state());
+	node->add_child_nocopy (get_automation_xml_state());
+
+	node->add_child_nocopy (Slavable::get_state());
+
+	return *node;
+}
+
+int
+VCA::set_state (XMLNode const& node, int version)
+{
+	XMLProperty const* prop;
+
+	Stripable::set_state (node, version);
+
+	if ((prop = node.property ("name")) != 0) {
+		set_name (prop->value());
+	}
+
+	if ((prop = node.property ("number")) != 0) {
+		_number = atoi (prop->value());
+	}
+
+	XMLNodeList const &children (node.children());
+	for (XMLNodeList::const_iterator i = children.begin(); i != children.end(); ++i) {
+		if ((*i)->name() == Controllable::xml_node_name) {
+
+			XMLProperty* prop = (*i)->property ("name");
+
+			if (!prop) {
+				continue;
+			}
+
+			if (prop->value() == _gain_control->name()) {
+				_gain_control->set_state (**i, version);
+			}
+			if (prop->value() == _solo_control->name()) {
+				_solo_control->set_state (**i, version);
+			}
+			if (prop->value() == _mute_control->name()) {
+				_mute_control->set_state (**i, version);
+			}
+		} else if ((*i)->name() == Slavable::xml_node_name) {
+			Slavable::set_state (**i, version);
+		}
+	}
+
+	return 0;
+}
+
+void
+VCA::clear_all_solo_state ()
+{
+	_solo_control->clear_all_solo_state ();
+}
+
+MonitorState
+VCA::monitoring_state () const
+{
+	/* XXX this has to get more complex but not clear how */
+	return MonitoringInput;
+}
+
+bool
+VCA::slaved () const
+{
+	if (!_gain_control) {
+		return false;
+	}
+	/* just test one particular control, not all of them */
+	return _gain_control->slaved ();
+}
+
+bool
+VCA::slaved_to (boost::shared_ptr<VCA> vca) const
+{
+	if (!vca || !_gain_control) {
+		return false;
+	}
+
+	/* just test one particular control, not all of them */
+
+	return _gain_control->slaved_to (vca->gain_control());
+}
diff --git a/libs/ardour/vca_manager.cc b/libs/ardour/vca_manager.cc
new file mode 100644
index 0000000..20e9e38
--- /dev/null
+++ b/libs/ardour/vca_manager.cc
@@ -0,0 +1,199 @@
+/*
+  Copyright (C) 2016 Paul Davis
+
+  This program is free software; you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation; either version 2 of the License, or
+  (at your option) any later version.
+
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#include "pbd/convert.h"
+#include "pbd/error.h"
+#include "pbd/replace_all.h"
+
+#include "ardour/boost_debug.h"
+#include "ardour/session.h"
+#include "ardour/slavable.h"
+#include "ardour/vca.h"
+#include "ardour/vca_manager.h"
+
+#include "pbd/i18n.h"
+
+using namespace ARDOUR;
+using namespace Glib::Threads;
+using namespace PBD;
+using std::string;
+
+string VCAManager::xml_node_name (X_("VCAManager"));
+
+VCAManager::VCAManager (Session& s)
+	: SessionHandleRef (s)
+	, _vcas_loaded (false)
+{
+}
+
+VCAManager::~VCAManager ()
+{
+	clear ();
+}
+
+void
+VCAManager::clear ()
+{
+	Mutex::Lock lm (lock);
+	for (VCAList::const_iterator i = _vcas.begin(); i != _vcas.end(); ++i) {
+		(*i)->DropReferences ();
+	}
+	_vcas.clear ();
+}
+
+VCAList
+VCAManager::vcas () const
+{
+	Mutex::Lock lm (lock);
+	return _vcas;
+}
+
+int
+VCAManager::create_vca (uint32_t howmany, std::string const & name_template)
+{
+	VCAList vcal;
+
+	{
+		Mutex::Lock lm (lock);
+
+		for (uint32_t n = 0; n < howmany; ++n) {
+
+			int num = VCA::next_vca_number ();
+			string name = name_template;
+
+			if (name.find ("%n")) {
+				string sn = PBD::to_string (num, std::dec);
+				replace_all (name, "%n", sn);
+			}
+
+			boost::shared_ptr<VCA> vca = boost::shared_ptr<VCA> (new VCA (_session, num, name));
+			BOOST_MARK_VCA (vca);
+
+			vca->init ();
+
+			_vcas.push_back (vca);
+			vcal.push_back (vca);
+		}
+	}
+
+	VCAAdded (vcal); /* EMIT SIGNAL */
+
+	_session.set_dirty ();
+
+	return 0;
+}
+
+
+void
+VCAManager::remove_vca (boost::shared_ptr<VCA> vca)
+{
+	{
+		Mutex::Lock lm (lock);
+		_vcas.remove (vca);
+	}
+
+	/* this should cause deassignment and deletion */
+
+	vca->DropReferences ();
+
+	_session.set_dirty ();
+}
+
+boost::shared_ptr<VCA>
+VCAManager::vca_by_number (int32_t n) const
+{
+	Mutex::Lock lm (lock);
+
+	for (VCAList::const_iterator i = _vcas.begin(); i != _vcas.end(); ++i) {
+		if ((*i)->number() == n) {
+			return *i;
+		}
+	}
+
+	return boost::shared_ptr<VCA>();
+}
+
+XMLNode&
+VCAManager::get_state ()
+{
+	XMLNode* node = new XMLNode (xml_node_name);
+
+	{
+		Mutex::Lock lm (lock);
+
+		for (VCAList::const_iterator i = _vcas.begin(); i != _vcas.end(); ++i) {
+			node->add_child_nocopy ((*i)->get_state());
+		}
+	}
+
+	return *node;
+}
+
+int
+VCAManager::set_state (XMLNode const& node, int version)
+{
+	if (node.name() != xml_node_name) {
+		return -1;
+	}
+
+	XMLNodeList const & children = node.children();
+	VCAList vcal;
+
+	_vcas_loaded = false;
+
+	for (XMLNodeList::const_iterator i = children.begin(); i != children.end(); ++i) {
+		if ((*i)->name() == VCA::xml_node_name) {
+			boost::shared_ptr<VCA> vca = boost::shared_ptr<VCA> (new VCA (_session, 0, X_("tobereset")));
+			BOOST_MARK_VCA (vca);
+
+			if (vca->init() || vca->set_state (**i, version)) {
+				error << _("Cannot set state of a VCA") << endmsg;
+				return -1;
+			}
+
+			/* can't hold the lock for the entire loop,
+			 * because the new VCA maybe slaved and needs
+			 * to call back into us to set up its own
+			 * slave/master relationship
+			 */
+
+			{
+				Mutex::Lock lm (lock);
+				_vcas.push_back (vca);
+				vcal.push_back (vca);
+			}
+		}
+	}
+
+	_vcas_loaded = true;
+
+	VCAAdded (vcal); /* EMIT SIGNAL */
+
+	return 0;
+}
+
+void
+VCAManager::clear_all_solo_state ()
+{
+	Mutex::Lock lm (lock);
+
+	for (VCAList::const_iterator i = _vcas.begin(); i != _vcas.end(); ++i) {
+		(*i)->clear_all_solo_state ();
+	}
+}
diff --git a/libs/ardour/vst_info_file.cc b/libs/ardour/vst_info_file.cc
index 68b376d..ca2ef91 100644
--- a/libs/ardour/vst_info_file.cc
+++ b/libs/ardour/vst_info_file.cc
@@ -52,7 +52,7 @@
 #include "ardour/plugin_types.h"
 #include "ardour/vst_info_file.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 #include "sha1.c"
 
 #define MAX_STRING_LEN 256
diff --git a/libs/ardour/vst_plugin.cc b/libs/ardour/vst_plugin.cc
index f04aa2b..8188354 100644
--- a/libs/ardour/vst_plugin.cc
+++ b/libs/ardour/vst_plugin.cc
@@ -33,7 +33,7 @@
 #include "ardour/filesystem_paths.h"
 #include "ardour/audio_buffer.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace PBD;
@@ -44,8 +44,12 @@ VSTPlugin::VSTPlugin (AudioEngine& engine, Session& session, VSTHandle* handle)
 	, _handle (handle)
 	, _state (0)
 	, _plugin (0)
+	, _pi (0)
+	, _num (0)
+	, _transport_frame (0)
+	, _transport_speed (0.f)
 {
-
+	memset (&_timeInfo, 0, sizeof(_timeInfo));
 }
 
 VSTPlugin::~VSTPlugin ()
@@ -87,9 +91,9 @@ VSTPlugin::set_block_size (pframes_t nframes)
 }
 
 float
-VSTPlugin::default_value (uint32_t)
+VSTPlugin::default_value (uint32_t which)
 {
-	return 0;
+	return _parameter_defaults[which];
 }
 
 float
@@ -158,7 +162,7 @@ VSTPlugin::set_chunk (gchar const * data, bool single)
 void
 VSTPlugin::add_state (XMLNode* root) const
 {
-	LocaleGuard lg (X_("C"));
+	LocaleGuard lg;
 
 	if (_plugin->flags & 32 /* effFlagsProgramsChunks */) {
 
@@ -195,7 +199,7 @@ VSTPlugin::add_state (XMLNode* root) const
 int
 VSTPlugin::set_state (const XMLNode& node, int version)
 {
-	LocaleGuard lg (X_("C"));
+	LocaleGuard lg;
 	int ret = -1;
 
 	if (node.name() != state_node_name()) {
@@ -319,6 +323,9 @@ VSTPlugin::get_parameter_descriptor (uint32_t which, ParameterDescriptor& desc)
 		desc.sr_dependent = false;
 	}
 
+	desc.normal = get_parameter (which);
+	_parameter_defaults[which] = desc.normal;
+
 	return 0;
 }
 
@@ -375,7 +382,7 @@ VSTPlugin::load_user_preset (PresetRecord r)
 	XMLNode* root = t->root ();
 
 	for (XMLNodeList::const_iterator i = root->children().begin(); i != root->children().end(); ++i) {
-		XMLProperty* label = (*i)->property (X_("label"));
+		XMLProperty const * label = (*i)->property (X_("label"));
 
 		assert (label);
 
@@ -409,8 +416,8 @@ VSTPlugin::load_user_preset (PresetRecord r)
 
 			for (XMLNodeList::const_iterator j = (*i)->children().begin(); j != (*i)->children().end(); ++j) {
 				if ((*j)->name() == X_("Parameter")) {
-						XMLProperty* index = (*j)->property (X_("index"));
-						XMLProperty* value = (*j)->property (X_("value"));
+						XMLProperty const * index = (*j)->property (X_("index"));
+						XMLProperty const * value = (*j)->property (X_("value"));
 
 						assert (index);
 						assert (value);
@@ -510,7 +517,11 @@ VSTPlugin::signal_latency () const
 		return _user_latency;
 	}
 
+#if ( defined(__x86_64__) || defined(_M_X64) )
+	return *((int32_t *) (((char *) &_plugin->flags) + 24)); /* initialDelay */
+#else
 	return *((int32_t *) (((char *) &_plugin->flags) + 12)); /* initialDelay */
+#endif
 }
 
 set<Evoral::Parameter>
@@ -527,10 +538,14 @@ VSTPlugin::automatable () const
 
 int
 VSTPlugin::connect_and_run (BufferSet& bufs,
+		framepos_t start, framepos_t end, double speed,
 		ChanMapping in_map, ChanMapping out_map,
 		pframes_t nframes, framecnt_t offset)
 {
-	Plugin::connect_and_run (bufs, in_map, out_map, nframes, offset);
+	Plugin::connect_and_run(bufs, start, end, speed, in_map, out_map, nframes, offset);
+
+	_transport_frame = start;
+	_transport_speed = speed;
 
 	ChanCount bufs_count;
 	bufs_count.set(DataType::AUDIO, 1);
@@ -565,7 +580,12 @@ VSTPlugin::connect_and_run (BufferSet& bufs,
 
 	uint32_t out_index = 0;
 	for (i = 0; i < (int32_t) _plugin->numOutputs; ++i) {
-		outs[i] = scratch_bufs.get_audio(i).data(offset);
+		uint32_t  index;
+		bool      valid = false;
+		index = out_map.get(DataType::AUDIO, out_index++, &valid);
+		outs[i] = (valid)
+			? bufs.get_audio(index).data(offset)
+			: scratch_bufs.get_audio(0).data(offset);
 	}
 
 	if (bufs.count().n_midi() > 0) {
@@ -592,16 +612,6 @@ VSTPlugin::connect_and_run (BufferSet& bufs,
 	_plugin->processReplacing (_plugin, &ins[0], &outs[0], nframes);
 	_midi_out_buf = 0;
 
-	out_index = 0;
-	for (i = 0; i < (int32_t) _plugin->numOutputs; ++i) {
-		uint32_t  index;
-		bool      valid = false;
-		index = out_map.get(DataType::AUDIO, out_index++, &valid);
-		if (!valid) {
-			continue;
-		}
-		copy_vector (bufs.get_audio(index).data(offset), outs[i], nframes);
-	}
 	return 0;
 }
 
@@ -703,8 +713,8 @@ VSTPlugin::find_presets ()
 		XMLNode* root = t->root ();
 		for (XMLNodeList::const_iterator i = root->children().begin(); i != root->children().end(); ++i) {
 
-			XMLProperty* uri = (*i)->property (X_("uri"));
-			XMLProperty* label = (*i)->property (X_("label"));
+			XMLProperty const * uri = (*i)->property (X_("uri"));
+			XMLProperty const * label = (*i)->property (X_("label"));
 
 			assert (uri);
 			assert (label);
diff --git a/libs/ardour/windows_vst_plugin.cc b/libs/ardour/windows_vst_plugin.cc
index a480642..17cfa1e 100644
--- a/libs/ardour/windows_vst_plugin.cc
+++ b/libs/ardour/windows_vst_plugin.cc
@@ -26,7 +26,7 @@
 #include "ardour/windows_vst_plugin.h"
 #include "ardour/session.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
@@ -115,8 +115,8 @@ WindowsVSTPluginInfo::get_presets (bool user_only) const
 		if (t->read ()) {
 			XMLNode* root = t->root ();
 			for (XMLNodeList::const_iterator i = root->children().begin(); i != root->children().end(); ++i) {
-				XMLProperty* uri = (*i)->property (X_("uri"));
-				XMLProperty* label = (*i)->property (X_("label"));
+				XMLProperty const * uri = (*i)->property (X_("uri"));
+				XMLProperty const * label = (*i)->property (X_("label"));
 				p.push_back (Plugin::PresetRecord (uri->value(), label->value(), true));
 			}
 		}
diff --git a/libs/ardour/worker.cc b/libs/ardour/worker.cc
index ce71c92..f8a5e44 100644
--- a/libs/ardour/worker.cc
+++ b/libs/ardour/worker.cc
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2012 Paul Davis
+  Copyright (C) 2012-2016 Paul Davis
   Author: David Robillard
 
   This program is free software; you can redistribute it and/or modify
@@ -27,26 +27,38 @@
 
 namespace ARDOUR {
 
-Worker::Worker(Workee* workee, uint32_t ring_size)
+Worker::Worker(Workee* workee, uint32_t ring_size, bool threaded)
 	: _workee(workee)
-	, _requests(new RingBuffer<uint8_t>(ring_size))
+	, _requests(threaded ? new RingBuffer<uint8_t>(ring_size) : NULL)
 	, _responses(new RingBuffer<uint8_t>(ring_size))
 	, _response((uint8_t*)malloc(ring_size))
-	, _sem ("worker_semaphore", 0)
+	, _sem("worker_semaphore", 0)
+	, _thread(NULL)
 	, _exit(false)
-	, _thread (Glib::Threads::Thread::create(sigc::mem_fun(*this, &Worker::run)))
-{}
+	, _synchronous(!threaded)
+{
+	if (threaded) {
+		_thread = Glib::Threads::Thread::create(
+			sigc::mem_fun(*this, &Worker::run));
+	}
+}
 
 Worker::~Worker()
 {
 	_exit = true;
 	_sem.signal();
-	_thread->join();
+	if (_thread) {
+		_thread->join();
+	}
 }
 
 bool
 Worker::schedule(uint32_t size, const void* data)
 {
+	if (_synchronous || !_requests) {
+		_workee->work(*this, size, data);
+		return true;
+	}
 	if (_requests->write_space() < size + sizeof(size)) {
 		return false;
 	}
@@ -63,7 +75,7 @@ Worker::schedule(uint32_t size, const void* data)
 bool
 Worker::respond(uint32_t size, const void* data)
 {
-	if (_requests->write_space() < size + sizeof(size)) {
+	if (_responses->write_space() < size + sizeof(size)) {
 		return false;
 	}
 	if (_responses->write((const uint8_t*)&size, sizeof(size)) != sizeof(size)) {
@@ -124,7 +136,7 @@ Worker::run()
 	while (true) {
 		_sem.wait();
 		if (_exit) {
-			if (buf) free(buf);
+			free(buf);
 			return;
 		}
 
@@ -163,7 +175,7 @@ Worker::run()
 			continue;  // TODO: This is probably fatal
 		}
 
-		_workee->work(size, buf);
+		_workee->work(*this, size, buf);
 	}
 }
 
diff --git a/libs/ardour/wscript b/libs/ardour/wscript
index 22aeb21..d85e6a4 100644
--- a/libs/ardour/wscript
+++ b/libs/ardour/wscript
@@ -8,7 +8,7 @@ import subprocess
 import sys
 
 # default state file version for this build
-CURRENT_SESSION_FILE_VERSION = 3001
+CURRENT_SESSION_FILE_VERSION = 3002
 
 I18N_PACKAGE = 'ardour'
 
@@ -21,6 +21,7 @@ path_prefix = 'libs/ardour/'
 libardour_sources = [
         'amp.cc',
         'analyser.cc',
+        'analysis_graph.cc',
         'async_midi_port.cc',
         'audio_backend.cc',
         'audio_buffer.cc',
@@ -56,6 +57,8 @@ libardour_sources = [
         'chan_count.cc',
         'chan_mapping.cc',
         'config_text.cc',
+        'controllable_descriptor.cc',
+        'control_group.cc',
         'control_protocol_manager.cc',
         'cycle_timer.cc',
         'data_type.cc',
@@ -65,6 +68,7 @@ libardour_sources = [
         'delivery.cc',
         'directory_names.cc',
         'diskstream.cc',
+        'dsp_filter.cc',
         'ebur128_analysis.cc',
         'element_import_handler.cc',
         'element_importer.cc',
@@ -90,6 +94,7 @@ libardour_sources = [
         'filesystem_paths.cc',
         'filter.cc',
         'find_session.cc',
+        'fixed_delay.cc',
         'gain_control.cc',
         'globals.cc',
         'graph.cc',
@@ -110,6 +115,10 @@ libardour_sources = [
         'location_importer.cc',
         'ltc_file_reader.cc',
         'ltc_slave.cc',
+        'lua_api.cc',
+        'luabindings.cc',
+        'luaproc.cc',
+        'luascripting.cc',
         'meter.cc',
         'midi_automation_list_binder.cc',
         'midi_buffer.cc',
@@ -130,12 +139,15 @@ libardour_sources = [
         'midi_stretch.cc',
         'midi_track.cc',
         'midi_ui.cc',
+        'mididm.cc',
         'midiport_manager.cc',
         'mix.cc',
+        'monitor_control.cc',
         'monitor_processor.cc',
         'mtc_slave.cc',
-        'mididm.cc',
         'mtdm.cc',
+        'muteable.cc',
+        'mute_control.cc',
         'mute_master.cc',
         'note_fixer.cc',
         'onset_detector.cc',
@@ -147,6 +159,7 @@ libardour_sources = [
         'panner_shell.cc',
         'parameter_descriptor.cc',
         'pcm_utils.cc',
+        'phase_control.cc',
         'playlist.cc',
         'playlist_factory.cc',
         'playlist_source.cc',
@@ -157,19 +170,21 @@ libardour_sources = [
         'port_insert.cc',
         'port_manager.cc',
         'port_set.cc',
+        'presentation_info.cc',
         'process_thread.cc',
         'processor.cc',
         'progress.cc',
         'quantize.cc',
         'rc_configuration.cc',
         'recent_sessions.cc',
+        'record_enable_control.cc',
+        'record_safe_control.cc',
         'region_factory.cc',
         'resampled_source.cc',
         'region.cc',
         'return.cc',
         'reverse.cc',
         'route.cc',
-        'route_controls.cc',
         'route_graph.cc',
         'route_group.cc',
         'route_group_member.cc',
@@ -197,16 +212,23 @@ libardour_sources = [
         'session_state_utils.cc',
         'session_time.cc',
         'session_transport.cc',
+        'sidechain.cc',
         'slave.cc',
+        'slavable.cc',
+        'slavable_automation_control.cc',
         'smf_source.cc',
         'sndfile_helpers.cc',
         'sndfileimportable.cc',
         'sndfilesource.cc',
+        'solo_control.cc',
+        'solo_isolate_control.cc',
+        'solo_safe_control.cc',
         'soundcloud_upload.cc',
         'source.cc',
         'source_factory.cc',
         'speakers.cc',
         'srcfilesource.cc',
+        'stripable.cc',
         'strip_silence.cc',
         'system_exec.cc',
         'revision.cc',
@@ -223,6 +245,8 @@ libardour_sources = [
         'unknown_processor.cc',
         'user_bundle.cc',
         'utils.cc',
+        'vca.cc',
+        'vca_manager.cc',
         'vumeterdsp.cc',
         'worker.cc'
 ]
@@ -290,6 +314,10 @@ def configure(conf):
                           atleast_version='0.6.0', mandatory=False)
         conf.define ('LV2_SUPPORT', 1)
 
+    # non-standard LV2 extention -- TODO: add option to disable??
+    if conf.is_defined ('HAVE_LV2_1_10_0'):
+        conf.define ('LV2_EXTENDED', 1)
+
 #    autowaf.check_pkg(conf, 'soundtouch-1.0', uselib_store='SOUNDTOUCH',
 #                      mandatory=False)
     autowaf.check_pkg(conf, 'cppunit', uselib_store='CPPUNIT',
@@ -357,12 +385,13 @@ def build(bld):
     obj.includes     = ['.', '../surfaces/control_protocol', '..']
     obj.name         = 'libardour'
     obj.target       = 'ardour'
-    obj.uselib       = ['GLIBMM','GTHREAD','AUBIO','SIGCPP','XML','UUID',
-                        'SNDFILE','SAMPLERATE','LRDF','AUDIOUNITS',
+    obj.uselib       = ['GLIBMM','GTHREAD','AUBIO','SIGCPP','XML','UUID', 'LO',
+                        'SNDFILE','SAMPLERATE','LRDF','AUDIOUNITS', 'GIOMM',
                         'OSX','BOOST','CURL','TAGLIB','VAMPSDK','VAMPHOSTSDK','RUBBERBAND']
     obj.use          = ['libpbd','libmidipp','libevoral',
                         'libaudiographer',
                         'libtimecode',
+                        'liblua',
                         ]
     if bld.env['build_target'] != 'mingw':
         obj.uselib += ['DL']
@@ -442,7 +471,8 @@ def build(bld):
                 source   = avx_sources,
                 cxxflags = avx_cxxflags,
                 includes = [ '.' ],
-                use = [ 'libtimecode', 'libpbd', 'libevoral', ],
+                use = [ 'libtimecode', 'libpbd', 'libevoral', 'liblua' ],
+                uselib = [ 'GLIBMM', 'XML' ],
                 target   = 'sse_avx_functions')
 
             obj.use += ['sse_avx_functions' ]
diff --git a/libs/ardouralsautil/devicelist.cc b/libs/ardouralsautil/devicelist.cc
index 3fdb140..f642733 100644
--- a/libs/ardouralsautil/devicelist.cc
+++ b/libs/ardouralsautil/devicelist.cc
@@ -18,6 +18,8 @@
  */
 
 #include <alsa/asoundlib.h>
+#include <glib.h>
+
 #include "pbd/convert.h"
 #include "ardouralsautil/devicelist.h"
 
@@ -34,6 +36,12 @@ ARDOUR::get_alsa_audio_device_names (std::map<std::string, std::string>& devices
 	string devname;
 	int cardnum = -1;
 	int device = -1;
+	const char* fixed_name;
+
+	if ((fixed_name = g_getenv ("ARDOUR_ALSA_DEVICE"))) {
+		devices.insert (make_pair<string,string> (fixed_name, fixed_name));
+		return;
+	}
 
 	assert (duplex > 0);
 
diff --git a/libs/ardouralsautil/wscript b/libs/ardouralsautil/wscript
index 60be052..fe53ddb 100644
--- a/libs/ardouralsautil/wscript
+++ b/libs/ardouralsautil/wscript
@@ -34,7 +34,7 @@ def build(bld):
             obj.name     = 'ardouralsautil'
             obj.target   = 'ardouralsautil'
             obj.use      = 'libpbd'
-            obj.uselib   = [ 'ALSA' ]
+            obj.uselib   = [ 'ALSA', 'GLIBMM' ]
             obj.vnum     = '0.0.1'
             obj.install_path = os.path.join(bld.env['LIBDIR'])
 
diff --git a/libs/audiographer/MSVCaudiographer/audiographer.vcproj b/libs/audiographer/MSVCaudiographer/audiographer.vcproj
index e3ffeaf..40e7d1f 100644
--- a/libs/audiographer/MSVCaudiographer/audiographer.vcproj
+++ b/libs/audiographer/MSVCaudiographer/audiographer.vcproj
@@ -42,7 +42,7 @@
 				AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
 				Optimization="0"
 				AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\timecode;..\..\rubberband;"..\..\vamp-sdk";"..\..\midi++2";..\..\taglib;..\..\taglib\taglib;..\..\taglib\taglib\toolkit;..\..\audiographer;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\glibmm";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor";"$(GenericIncludeFolder)\lilv-0";"$(GenericIncludeFolder)\suil-0";"$(GenericIncludeFolder)\serd-0";"$(GenericIncludeFolder)\sord-0";"$(GenericIncludeFolder)\lv2";"$(GenericIncludeFolder)\sratom-0""
-				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;BUILDING_AUDIOGRAPHER;LIBAUDIOGRAPHER_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_DEBUG;DEBUG="Debug";ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PACKAGE="\"audiographer\"";PROGRAM_NAME="\"Mixbus3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;BUILDING_AUDIOGRAPHER;LIBAUDIOGRAPHER_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_DEBUG;DEBUG="Debug";ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PACKAGE="\"audiographer\"";PROGRAM_NAME="\"Mixbus3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
 				MinimalRebuild="true"
 				RuntimeLibrary="3"
 				WarningLevel="3"
@@ -122,7 +122,7 @@
 				Optimization="2"
 				InlineFunctionExpansion="1"
 				AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\timecode;..\..\rubberband;"..\..\vamp-sdk";"..\..\midi++2";..\..\taglib;..\..\taglib\taglib;..\..\taglib\taglib\toolkit;..\..\audiographer;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\glibmm";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor";"$(GenericIncludeFolder)\lilv-0";"$(GenericIncludeFolder)\suil-0";"$(GenericIncludeFolder)\serd-0";"$(GenericIncludeFolder)\sord-0";"$(GenericIncludeFolder)\lv2";"$(GenericIncludeFolder)\sratom-0""
-				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_AUDIOGRAPHER;LIBAUDIOGRAPHER_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;NDEBUG;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PACKAGE="\"audiographer\"";PROGRAM_NAME="\"Mixbus3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_AUDIOGRAPHER;LIBAUDIOGRAPHER_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;NDEBUG;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PACKAGE="\"audiographer\"";PROGRAM_NAME="\"Mixbus3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
 				StringPooling="false"
 				RuntimeLibrary="2"
 				EnableEnhancedInstructionSet="1"
@@ -201,7 +201,7 @@
 				AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
 				Optimization="0"
 				AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\timecode;..\..\rubberband;"..\..\vamp-sdk";"..\..\midi++2";..\..\taglib;..\..\taglib\taglib;..\..\taglib\taglib\toolkit;..\..\audiographer;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\glibmm";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor";"$(GenericIncludeFolder)\lilv-0";"$(GenericIncludeFolder)\suil-0";"$(GenericIncludeFolder)\serd-0";"$(GenericIncludeFolder)\sord-0";"$(GenericIncludeFolder)\lv2";"$(GenericIncludeFolder)\sratom-0""
-				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_AUDIOGRAPHER;LIBAUDIOGRAPHER_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PACKAGE="\"audiographer\"";PROGRAM_NAME="\"Mixbus3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_AUDIOGRAPHER;LIBAUDIOGRAPHER_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PACKAGE="\"audiographer\"";PROGRAM_NAME="\"Mixbus3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
 				StringPooling="false"
 				RuntimeLibrary="2"
 				EnableEnhancedInstructionSet="1"
@@ -281,6 +281,10 @@
 					>
 				</File>
 				<File
+					RelativePath="..\src\general\loudness_reader.cc"
+					>
+				</File>
+				<File
 					RelativePath="..\src\general\normalizer.cc"
 					>
 				</File>
@@ -372,6 +376,10 @@
 				>
 			</File>
 			<File
+				RelativePath="..\audiographer\general\loudness_reader.h"
+				>
+			</File>
+			<File
 				RelativePath="..\private\gdither\noise.h"
 				>
 			</File>
@@ -434,7 +442,7 @@
 			UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
 			>
 			<File
-				RelativePath="..\..\..\icons\win32\msvc_resources.rc"
+				RelativePath="..\..\..\gtk2_ardour\win32\msvc_resources.rc"
 				>
 			</File>
 		</Filter>
diff --git a/libs/audiographer/audiographer/flag_debuggable.h b/libs/audiographer/audiographer/flag_debuggable.h
index f5d4fbf..5816fe8 100644
--- a/libs/audiographer/audiographer/flag_debuggable.h
+++ b/libs/audiographer/audiographer/flag_debuggable.h
@@ -14,7 +14,7 @@ namespace AudioGrapher
 
 /// A debugging class for nodes that support a certain set of flags.
 template<DebugLevel L = DEFAULT_DEBUG_LEVEL>
-class /*LIBAUDIOGRAPHER_API*/ FlagDebuggable : public Debuggable<L>
+class LIBAUDIOGRAPHER_API FlagDebuggable : public Debuggable<L>
 {
   public:
 	typedef FlagField::Flag Flag;
diff --git a/libs/audiographer/audiographer/general/analyser.h b/libs/audiographer/audiographer/general/analyser.h
index e8ca534..9bd49b3 100644
--- a/libs/audiographer/audiographer/general/analyser.h
+++ b/libs/audiographer/audiographer/general/analyser.h
@@ -20,20 +20,13 @@
 #define AUDIOGRAPHER_ANALYSER_H
 
 #include <fftw3.h>
-
-#include <vamp-hostsdk/PluginLoader.h>
-#include <vamp-sdk/Plugin.h>
-
-#include "audiographer/visibility.h"
-#include "audiographer/sink.h"
-#include "audiographer/utils/listed_source.h"
-
+#include "loudness_reader.h"
 #include "ardour/export_analysis.h"
 
 namespace AudioGrapher
 {
 
-class LIBAUDIOGRAPHER_API Analyser : public ListedSource<float>, public Sink<float>
+class LIBAUDIOGRAPHER_API Analyser : public LoudnessReader
 {
   public:
 	Analyser (float sample_rate, unsigned int channels, framecnt_t bufsize, framecnt_t n_samples);
@@ -46,27 +39,20 @@ class LIBAUDIOGRAPHER_API Analyser : public ListedSource<float>, public Sink<flo
 		_result.norm_gain_factor = gain;
 	}
 
-	using Sink<float>::process;
-
 	static const float fft_range_db;
 
+	using Sink<float>::process;
+
 	private:
 	float fft_power_at_bin (const uint32_t b, const float norm) const;
 
 	ARDOUR::ExportAnalysis _result;
-	Vamp::Plugin*  _ebur128_plugin;
-	Vamp::Plugin** _dbtp_plugin;
 
-	float        _sample_rate;
-	unsigned int _channels;
-	framecnt_t   _bufsize;
 	framecnt_t   _n_samples;
 	framecnt_t   _pos;
 	framecnt_t   _spp;
 	framecnt_t   _fpp;
 
-	float* _bufs[2];
-
 	float*     _hann_window;
 	uint32_t   _fft_data_size;
 	double     _fft_freq_per_bin;
@@ -74,7 +60,6 @@ class LIBAUDIOGRAPHER_API Analyser : public ListedSource<float>, public Sink<flo
 	float*     _fft_data_out;
 	float*     _fft_power;
 	fftwf_plan _fft_plan;
-
 };
 
 } // namespace
diff --git a/libs/audiographer/audiographer/general/loudness_reader.h b/libs/audiographer/audiographer/general/loudness_reader.h
new file mode 100644
index 0000000..7431f5e
--- /dev/null
+++ b/libs/audiographer/audiographer/general/loudness_reader.h
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+
+#ifndef AUDIOGRAPHER_LOUDNESS_READER_H
+#define AUDIOGRAPHER_LOUDNESS_READER_H
+
+#include <vamp-hostsdk/PluginLoader.h>
+#include <vamp-sdk/Plugin.h>
+
+#include "audiographer/visibility.h"
+#include "audiographer/sink.h"
+#include "audiographer/routines.h"
+#include "audiographer/utils/listed_source.h"
+
+namespace AudioGrapher
+{
+
+class LIBAUDIOGRAPHER_API LoudnessReader : public ListedSource<float>, public Sink<float>
+{
+  public:
+	LoudnessReader (float sample_rate, unsigned int channels, framecnt_t bufsize);
+	~LoudnessReader ();
+
+	void reset ();
+
+	float get_normalize_gain (float target_lufs, float target_dbtp);
+	float get_peak (float target_lufs = -23.f, float target_dbtp = -1.f) {
+		return 1.f / get_normalize_gain (target_lufs, target_dbtp);
+	}
+
+	virtual void process (ProcessContext<float> const & c);
+
+	using Sink<float>::process;
+
+  protected:
+	Vamp::Plugin*  _ebur_plugin;
+	Vamp::Plugin** _dbtp_plugin;
+
+	float        _sample_rate;
+	unsigned int _channels;
+	framecnt_t   _bufsize;
+	framecnt_t   _pos;
+	float*       _bufs[2];
+};
+
+} // namespace
+
+
+#endif // AUDIOGRAPHER_LOUDNESS_READER_H
diff --git a/libs/audiographer/audiographer/sndfile/sndfile_writer.h b/libs/audiographer/audiographer/sndfile/sndfile_writer.h
index 57ad968..81f0ddb 100644
--- a/libs/audiographer/audiographer/sndfile/sndfile_writer.h
+++ b/libs/audiographer/audiographer/sndfile/sndfile_writer.h
@@ -40,19 +40,13 @@ class SndfileWriter
 
 	virtual ~SndfileWriter () {}
 
-	SndfileWriter (SndfileWriter const & other)
-		: SndfileHandle (other)
-	{
-		init();
-	}
-
 	using SndfileHandle::operator=;
 
 	framecnt_t get_frames_written() const { return frames_written; }
 	void       reset_frames_written_count() { frames_written = 0; }
 
 	/// Writes data to file
-	void process (ProcessContext<T> const & c)
+	virtual void process (ProcessContext<T> const & c)
 	{
 		check_flags (*this, c);
 
@@ -88,7 +82,7 @@ class SndfileWriter
 		init();
 	}
 
-	void init()
+	virtual void init()
 	{
 		frames_written = 0;
 		add_supported_flag (ProcessContext<T>::EndOfInput);
@@ -97,6 +91,9 @@ class SndfileWriter
   protected:
 	std::string path;
 	framecnt_t frames_written;
+
+	private:
+	SndfileWriter (SndfileWriter const & other) {}
 };
 
 } // namespace
diff --git a/libs/audiographer/audiographer/sndfile/tmp_file.h b/libs/audiographer/audiographer/sndfile/tmp_file.h
index 296fcdf..d6bc554 100644
--- a/libs/audiographer/audiographer/sndfile/tmp_file.h
+++ b/libs/audiographer/audiographer/sndfile/tmp_file.h
@@ -15,36 +15,14 @@ namespace AudioGrapher
 
 /// A temporary file deleted after this class is destructed
 template<typename T = DefaultSampleType>
-class TmpFile : public SndfileWriter<T>, public SndfileReader<T>
+class TmpFile
+	: public SndfileWriter<T>
+	, public SndfileReader<T>
 {
   public:
+	virtual ~TmpFile () {}
+	PBD::Signal0<void> FileFlushed;
 
-	/// \a filename_template must match the requirements for mkstemp, i.e. end in "XXXXXX"
-	TmpFile (char * filename_template, int format, ChannelCount channels, framecnt_t samplerate)
-		: SndfileHandle (g_mkstemp(filename_template), true, SndfileBase::ReadWrite, format, channels, samplerate)
-		, filename (filename_template)
-	{}
-
-	TmpFile (int format, ChannelCount channels, framecnt_t samplerate)
-	  : SndfileHandle (fileno (tmpfile()), true, SndfileBase::ReadWrite, format, channels, samplerate)
-	{}
-
-	TmpFile (TmpFile const & other) : SndfileHandle (other) {}
-	using SndfileHandle::operator=;
-
-	~TmpFile()
-	{
-		/* explicitly close first, some OS (yes I'm looking at you windows)
-		 * cannot delet files that are still open
-		 */
-		if (!filename.empty()) {
-			SndfileBase::close();
-			std::remove(filename.c_str());
-		}
-	}
-
-  private:
-	std::string filename;
 };
 
 } // namespace
diff --git a/libs/audiographer/audiographer/sndfile/tmp_file_rt.h b/libs/audiographer/audiographer/sndfile/tmp_file_rt.h
new file mode 100644
index 0000000..86e363c
--- /dev/null
+++ b/libs/audiographer/audiographer/sndfile/tmp_file_rt.h
@@ -0,0 +1,171 @@
+#ifndef AUDIOGRAPHER_TMP_FILE_RT_H
+#define AUDIOGRAPHER_TMP_FILE_RT_H
+
+#include <cstdio>
+#include <string>
+
+#include <glib.h>
+#include "pbd/gstdio_compat.h"
+#include "pbd/ringbuffer.h"
+
+#include "audiographer/flag_debuggable.h"
+#include "audiographer/sink.h"
+#include "sndfile_writer.h"
+#include "sndfile_reader.h"
+#include "tmp_file.h"
+
+namespace AudioGrapher
+{
+
+	static const framecnt_t rb_chunksize = 8192; // samples
+
+/** A temporary file deleted after this class is destructed
+ * with realtime safe background thread writer.
+ */
+template<typename T = DefaultSampleType>
+class TmpFileRt
+	: public TmpFile<T>
+{
+  public:
+
+	/// \a filename_template must match the requirements for mkstemp, i.e. end in "XXXXXX"
+	TmpFileRt (char * filename_template, int format, ChannelCount channels, framecnt_t samplerate)
+		: SndfileHandle (g_mkstemp(filename_template), true, SndfileBase::ReadWrite, format, channels, samplerate)
+		, filename (filename_template)
+  , _chunksize (rb_chunksize * channels)
+  , _rb (std::max (_chunksize * 16, 5 * samplerate * channels))
+	{
+		init ();
+	}
+
+	using SndfileHandle::operator=;
+
+	~TmpFileRt()
+	{
+		end_write ();
+		/* explicitly close first, some OS (yes I'm looking at you windows)
+		 * cannot delete files that are still open
+		 */
+		if (!filename.empty()) {
+			SndfileBase::close();
+			std::remove(filename.c_str());
+		}
+		pthread_mutex_destroy (&_disk_thread_lock);
+		pthread_cond_destroy  (&_data_ready);
+	}
+
+	/// Writes data to file
+	void process (ProcessContext<T> const & c)
+	{
+		SndfileWriter<T>::check_flags (*this, c);
+
+		if (SndfileWriter<T>::throw_level (ThrowStrict) && c.channels() != SndfileHandle::channels()) {
+			throw Exception (*this, boost::str (boost::format
+				("Wrong number of channels given to process(), %1% instead of %2%")
+				% c.channels() % SndfileHandle::channels()));
+		}
+
+		if (SndfileWriter<T>::throw_level (ThrowProcess) && _rb.write_space() < c.frames()) {
+			throw Exception (*this, boost::str (boost::format
+				("Could not write data to ringbuffer/output file (%1%)")
+				% SndfileHandle::strError()));
+		}
+
+		_rb.write (c.data(), c.frames());
+
+		if (c.has_flag(ProcessContext<T>::EndOfInput)) {
+			_capture = false;
+			SndfileWriter<T>::FileWritten (filename);
+		}
+
+		if (pthread_mutex_trylock (&_disk_thread_lock) == 0) {
+			pthread_cond_signal (&_data_ready);
+			pthread_mutex_unlock (&_disk_thread_lock);
+		}
+	}
+
+	using Sink<T>::process;
+
+	void disk_thread ()
+	{
+		T *framebuf = (T*) malloc (_chunksize * sizeof (T));
+
+		pthread_mutex_lock (&_disk_thread_lock);
+
+		while (_capture) {
+			if ((framecnt_t)_rb.read_space () >= _chunksize) {
+				_rb.read (framebuf, _chunksize);
+				framecnt_t const written = SndfileBase::write (framebuf, _chunksize);
+				assert (written == _chunksize);
+				SndfileWriter<T>::frames_written += written;
+			}
+			if (!_capture) {
+				break;
+			}
+			pthread_cond_wait (&_data_ready, &_disk_thread_lock);
+		}
+
+		// flush ringbuffer
+		while (_rb.read_space () > 0) {
+			size_t remain = std::min ((framecnt_t)_rb.read_space (), _chunksize);
+			_rb.read (framebuf, remain);
+			framecnt_t const written = SndfileBase::write (framebuf, remain);
+			SndfileWriter<T>::frames_written += written;
+		}
+
+		SndfileWriter<T>::writeSync();
+		pthread_mutex_unlock (&_disk_thread_lock);
+		free (framebuf);
+		TmpFile<T>::FileFlushed ();
+	}
+
+  protected:
+	std::string filename;
+
+	bool _capture;
+	framecnt_t _chunksize;
+	RingBuffer<T> _rb;
+
+	pthread_mutex_t _disk_thread_lock;
+	pthread_cond_t  _data_ready;
+	pthread_t _thread_id;
+
+	static void * _disk_thread (void *arg)
+	{
+		TmpFileRt *d = static_cast<TmpFileRt *>(arg);
+		d->disk_thread ();
+		pthread_exit (0);
+		return 0;
+	}
+
+	void end_write () {
+		pthread_mutex_lock (&_disk_thread_lock);
+		_capture = false;
+		pthread_cond_signal (&_data_ready);
+		pthread_mutex_unlock (&_disk_thread_lock);
+		pthread_join (_thread_id, NULL);
+	}
+
+	void init()
+	{
+		SndfileWriter<T>::frames_written = 0;
+		_capture = true;
+		SndfileWriter<T>::add_supported_flag (ProcessContext<T>::EndOfInput);
+		pthread_mutex_init (&_disk_thread_lock, 0);
+		pthread_cond_init  (&_data_ready, 0);
+
+		if (pthread_create (&_thread_id, NULL, _disk_thread, this)) {
+			_capture = false;
+			if (SndfileWriter<T>::throw_level (ThrowStrict)) {
+				throw Exception (*this, "Cannot create export disk writer");
+			}
+		}
+	}
+
+	private:
+	TmpFileRt (TmpFileRt const & other) : SndfileHandle (other) {}
+};
+
+} // namespace
+
+#endif // AUDIOGRAPHER_TMP_FILE_RT_H
diff --git a/libs/audiographer/audiographer/sndfile/tmp_file_sync.h b/libs/audiographer/audiographer/sndfile/tmp_file_sync.h
new file mode 100644
index 0000000..7807346
--- /dev/null
+++ b/libs/audiographer/audiographer/sndfile/tmp_file_sync.h
@@ -0,0 +1,65 @@
+#ifndef AUDIOGRAPHER_TMP_FILE_SYNC_H
+#define AUDIOGRAPHER_TMP_FILE_SYNC_H
+
+#include <cstdio>
+#include <string>
+
+#include <glib.h>
+#include "pbd/gstdio_compat.h"
+
+#include "sndfile_writer.h"
+#include "sndfile_reader.h"
+#include "tmp_file.h"
+
+namespace AudioGrapher
+{
+
+/// A temporary file deleted after this class is destructed
+template<typename T = DefaultSampleType>
+class TmpFileSync
+	: public TmpFile<T>
+{
+  public:
+
+	/// \a filename_template must match the requirements for mkstemp, i.e. end in "XXXXXX"
+	TmpFileSync (char * filename_template, int format, ChannelCount channels, framecnt_t samplerate)
+		: SndfileHandle (g_mkstemp(filename_template), true, SndfileBase::ReadWrite, format, channels, samplerate)
+		, filename (filename_template)
+	{}
+
+	TmpFileSync (int format, ChannelCount channels, framecnt_t samplerate)
+	  : SndfileHandle (fileno (tmpfile()), true, SndfileBase::ReadWrite, format, channels, samplerate)
+	{}
+
+	TmpFileSync (TmpFileSync const & other) : SndfileHandle (other) {}
+	using SndfileHandle::operator=;
+
+	~TmpFileSync()
+	{
+		/* explicitly close first, some OS (yes I'm looking at you windows)
+		 * cannot delete files that are still open
+		 */
+		if (!filename.empty()) {
+			SndfileBase::close();
+			std::remove(filename.c_str());
+		}
+	}
+
+	void process (ProcessContext<T> const & c)
+	{
+		SndfileWriter<T>::process (c);
+
+		if (c.has_flag(ProcessContext<T>::EndOfInput)) {
+			TmpFile<T>::FileFlushed ();
+		}
+	}
+
+	using Sink<T>::process;
+
+  private:
+	std::string filename;
+};
+
+} // namespace
+
+#endif // AUDIOGRAPHER_TMP_FILE_SYNC_H
diff --git a/libs/audiographer/audiographer/throwing.h b/libs/audiographer/audiographer/throwing.h
index 8bd8415..0d8c2a8 100644
--- a/libs/audiographer/audiographer/throwing.h
+++ b/libs/audiographer/audiographer/throwing.h
@@ -40,7 +40,7 @@ enum /*LIBAUDIOGRAPHER_API*/ ThrowLevel
   * logical and (short-circuiting).
   */
 template<ThrowLevel L = DEFAULT_THROW_LEVEL>
-class /*LIBAUDIOGRAPHER_API*/ Throwing
+class LIBAUDIOGRAPHER_API Throwing
 {
   protected:
 	Throwing() {}
diff --git a/libs/audiographer/src/general/analyser.cc b/libs/audiographer/src/general/analyser.cc
index 459cd6a..84120b6 100644
--- a/libs/audiographer/src/general/analyser.cc
+++ b/libs/audiographer/src/general/analyser.cc
@@ -24,44 +24,16 @@ using namespace AudioGrapher;
 const float Analyser::fft_range_db (120); // dB
 
 Analyser::Analyser (float sample_rate, unsigned int channels, framecnt_t bufsize, framecnt_t n_samples)
-	: _ebur128_plugin (0)
-	, _dbtp_plugin (0)
-	, _sample_rate (sample_rate)
-	, _channels (channels)
-	, _bufsize (bufsize / channels)
+	: LoudnessReader (sample_rate, channels, bufsize)
 	, _n_samples (n_samples)
 	, _pos (0)
 {
 	//printf ("NEW ANALYSER %p r:%.1f c:%d f:%ld l%ld\n", this, sample_rate, channels, bufsize, n_samples);
 	assert (bufsize % channels == 0);
 	assert (bufsize > 1);
-	if (channels > 0 && channels <= 2) {
-		using namespace Vamp::HostExt;
-		PluginLoader* loader (PluginLoader::getInstance ());
-		_ebur128_plugin = loader->loadPlugin ("libardourvampplugins:ebur128", sample_rate, PluginLoader::ADAPT_ALL_SAFE);
-		assert (_ebur128_plugin);
-		_ebur128_plugin->reset ();
-		if (!_ebur128_plugin->initialise (channels, _bufsize, _bufsize)) {
-			delete _ebur128_plugin;
-			_ebur128_plugin = 0;
-		}
-	}
+	assert (_bufsize > 0);
 
-	_dbtp_plugin = (Vamp::Plugin**) malloc (sizeof(Vamp::Plugin*) * channels);
-	for (unsigned int c = 0; c < _channels; ++c) {
-		using namespace Vamp::HostExt;
-		PluginLoader* loader (PluginLoader::getInstance ());
-		_dbtp_plugin[c] = loader->loadPlugin ("libardourvampplugins:dBTP", sample_rate, PluginLoader::ADAPT_ALL_SAFE);
-		assert (_dbtp_plugin[c]);
-		_dbtp_plugin[c]->reset ();
-		if (!_dbtp_plugin[c]->initialise (1, _bufsize, _bufsize)) {
-			delete _dbtp_plugin[c];
-			_dbtp_plugin[c] = 0;
-		}
-	}
 
-	_bufs[0] = (float*) malloc (sizeof (float) * _bufsize);
-	_bufs[1] = (float*) malloc (sizeof (float) * _bufsize);
 
 	const size_t peaks = sizeof (_result.peaks) / sizeof (ARDOUR::PeakData::PeakDatum) / 4;
 	_spp = ceil ((_n_samples + 2.f) / (float) peaks);
@@ -122,13 +94,6 @@ Analyser::Analyser (float sample_rate, unsigned int channels, framecnt_t bufsize
 
 Analyser::~Analyser ()
 {
-	delete _ebur128_plugin;
-	for (unsigned int c = 0; c < _channels; ++c) {
-		delete _dbtp_plugin[c];
-	}
-	free (_dbtp_plugin);
-	free (_bufs[0]);
-	free (_bufs[1]);
 	fftwf_destroy_plan (_fft_plan);
 	fftwf_free (_fft_data_in);
 	fftwf_free (_fft_data_out);
@@ -161,7 +126,9 @@ Analyser::process (ProcessContext<float> const & ctx)
 		for (unsigned int c = 0; c < _channels; ++c) {
 			const float v = *d;
 			if (fabsf(v) > _result.peak) { _result.peak = fabsf(v); }
-			_bufs[c][s] = v;
+			if (c < _result.n_channels) {
+				_bufs[c][s] = v;
+			}
 			const unsigned int cc = c & cmask;
 			if (_result.peaks[cc][pbin].min > v) { _result.peaks[cc][pbin].min = *d; }
 			if (_result.peaks[cc][pbin].max < v) { _result.peaks[cc][pbin].max = *d; }
@@ -172,13 +139,13 @@ Analyser::process (ProcessContext<float> const & ctx)
 
 	for (; s < _bufsize; ++s) {
 		_fft_data_in[s] = 0;
-		for (unsigned int c = 0; c < _channels; ++c) {
+		for (unsigned int c = 0; c < _result.n_channels; ++c) {
 			_bufs[c][s] = 0.f;
 		}
 	}
 
-	if (_ebur128_plugin) {
-		_ebur128_plugin->process (_bufs, Vamp::RealTime::fromSeconds ((double) _pos / _sample_rate));
+	if (_ebur_plugin) {
+		_ebur_plugin->process (_bufs, Vamp::RealTime::fromSeconds ((double) _pos / _sample_rate));
 	}
 
 	float const * const data = ctx.data ();
@@ -265,8 +232,8 @@ Analyser::result ()
 		}
 	}
 
-	if (_ebur128_plugin) {
-		Vamp::Plugin::FeatureSet features = _ebur128_plugin->getRemainingFeatures ();
+	if (_ebur_plugin) {
+		Vamp::Plugin::FeatureSet features = _ebur_plugin->getRemainingFeatures ();
 		if (!features.empty () && features.size () == 3) {
 			_result.loudness = features[0][0].values[0];
 			_result.loudness_range = features[1][0].values[0];
diff --git a/libs/audiographer/src/general/loudness_reader.cc b/libs/audiographer/src/general/loudness_reader.cc
new file mode 100644
index 0000000..0c2e361
--- /dev/null
+++ b/libs/audiographer/src/general/loudness_reader.cc
@@ -0,0 +1,194 @@
+/*
+ * Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+
+#include "audiographer/general/loudness_reader.h"
+#include "pbd/fastlog.h"
+
+using namespace AudioGrapher;
+
+LoudnessReader::LoudnessReader (float sample_rate, unsigned int channels, framecnt_t bufsize)
+	: _ebur_plugin (0)
+	, _dbtp_plugin (0)
+	, _sample_rate (sample_rate)
+	, _channels (channels)
+	, _bufsize (bufsize / channels)
+	, _pos (0)
+{
+	//printf ("NEW LoudnessReader %p r:%.1f c:%d f:%ld\n", this, sample_rate, channels, bufsize);
+	assert (bufsize % channels == 0);
+	assert (bufsize > 1);
+	assert (_bufsize > 0);
+
+	if (channels > 0 && channels <= 2) {
+		using namespace Vamp::HostExt;
+		PluginLoader* loader (PluginLoader::getInstance ());
+		_ebur_plugin = loader->loadPlugin ("libardourvampplugins:ebur128", sample_rate, PluginLoader::ADAPT_ALL_SAFE);
+		assert (_ebur_plugin);
+		_ebur_plugin->reset ();
+		if (!_ebur_plugin->initialise (channels, _bufsize, _bufsize)) {
+			delete _ebur_plugin;
+			_ebur_plugin = 0;
+		}
+	}
+
+	_dbtp_plugin = (Vamp::Plugin**) malloc (sizeof(Vamp::Plugin*) * channels);
+	for (unsigned int c = 0; c < _channels; ++c) {
+		using namespace Vamp::HostExt;
+		PluginLoader* loader (PluginLoader::getInstance ());
+		_dbtp_plugin[c] = loader->loadPlugin ("libardourvampplugins:dBTP", sample_rate, PluginLoader::ADAPT_ALL_SAFE);
+		assert (_dbtp_plugin[c]);
+		_dbtp_plugin[c]->reset ();
+		if (!_dbtp_plugin[c]->initialise (1, _bufsize, _bufsize)) {
+			delete _dbtp_plugin[c];
+			_dbtp_plugin[c] = 0;
+		}
+	}
+
+	_bufs[0] = (float*) malloc (sizeof (float) * _bufsize);
+	_bufs[1] = (float*) malloc (sizeof (float) * _bufsize);
+}
+
+LoudnessReader::~LoudnessReader ()
+{
+	delete _ebur_plugin;
+	for (unsigned int c = 0; c < _channels; ++c) {
+		delete _dbtp_plugin[c];
+	}
+	free (_dbtp_plugin);
+	free (_bufs[0]);
+	free (_bufs[1]);
+}
+
+void
+LoudnessReader::reset ()
+{
+	if (_ebur_plugin) {
+		_ebur_plugin->reset ();
+	}
+
+	for (unsigned int c = 0; c < _channels; ++c) {
+		if (_dbtp_plugin[c]) {
+			_dbtp_plugin[c]->reset ();
+		}
+	}
+}
+
+void
+LoudnessReader::process (ProcessContext<float> const & ctx)
+{
+	const framecnt_t n_samples = ctx.frames () / ctx.channels ();
+	assert (ctx.channels () == _channels);
+	assert (ctx.frames () % ctx.channels () == 0);
+	assert (n_samples <= _bufsize);
+	//printf ("PROC %p @%ld F: %ld, S: %ld C:%d\n", this, _pos, ctx.frames (), n_samples, ctx.channels ());
+
+	unsigned processed_channels = 0;
+	if (_ebur_plugin) {
+		assert (_channels <= 2);
+		processed_channels = _channels;
+		framecnt_t s;
+		float const * d = ctx.data ();
+		for (s = 0; s < n_samples; ++s) {
+			for (unsigned int c = 0; c < _channels; ++c, ++d) {
+				_bufs[c][s] = *d;
+			}
+		}
+		for (; s < _bufsize; ++s) {
+			for (unsigned int c = 0; c < _channels; ++c) {
+				_bufs[c][s] = 0.f;
+			}
+		}
+		_ebur_plugin->process (_bufs, Vamp::RealTime::fromSeconds ((double) _pos / _sample_rate));
+		if (_dbtp_plugin[0]) {
+			_dbtp_plugin[0]->process (&_bufs[0], Vamp::RealTime::fromSeconds ((double) _pos / _sample_rate));
+		}
+		if (_channels == 2 && _dbtp_plugin[1]) {
+			_dbtp_plugin[0]->process (&_bufs[1], Vamp::RealTime::fromSeconds ((double) _pos / _sample_rate));
+		}
+	}
+
+	for (unsigned int c = processed_channels; c < _channels; ++c) {
+		if (!_dbtp_plugin[c]) {
+			continue;
+		}
+		framecnt_t s;
+		float const * const d = ctx.data ();
+		for (s = 0; s < n_samples; ++s) {
+			_bufs[0][s] = d[s * _channels + c];
+		}
+		for (; s < _bufsize; ++s) {
+			_bufs[0][s] = 0.f;
+		}
+		_dbtp_plugin[c]->process (_bufs, Vamp::RealTime::fromSeconds ((double) _pos / _sample_rate));
+	}
+
+	_pos += n_samples;
+	ListedSource<float>::output (ctx);
+}
+
+float
+LoudnessReader::get_normalize_gain (float target_lufs, float target_dbtp)
+{
+	float dBTP = 0;
+	float LUFS = -200;
+	uint32_t have_lufs = 0;
+	uint32_t have_dbtp = 0;
+
+	if (_ebur_plugin) {
+		Vamp::Plugin::FeatureSet features = _ebur_plugin->getRemainingFeatures ();
+		if (!features.empty () && features.size () == 3) {
+			const float lufs = features[0][0].values[0];
+			LUFS = std::max (LUFS, lufs);
+			++have_lufs;
+		}
+	}
+
+	for (unsigned int c = 0; c < _channels; ++c) {
+		if (_dbtp_plugin[c]) {
+			Vamp::Plugin::FeatureSet features = _dbtp_plugin[c]->getRemainingFeatures ();
+			if (!features.empty () && features.size () == 2) {
+				const float dbtp = features[0][0].values[0];
+				dBTP = std::max (dBTP, dbtp);
+				++have_dbtp;
+			}
+		}
+	}
+
+	float g = 100000.0; // +100dB
+	bool set = false;
+	if (have_lufs && LUFS > -180.0f && target_lufs <= 0.f) {
+		const float ge = pow (10.f, (target_lufs * 0.05f)) / pow (10.f, (LUFS * 0.05f));
+		//printf ("LU: %f LUFS, %f\n", LUFS, ge);
+		g = std::min (g, ge);
+		set = true;
+	}
+
+	// TODO check that all channels were used.. ? (have_dbtp == _channels)
+	if (have_dbtp && dBTP > 0.f && target_dbtp <= 0.f) {
+		const float ge = pow (10.f, (target_dbtp * 0.05f)) / dBTP;
+		//printf ("TP:(%d chn) %fdBTP -> %f\n", have_dbtp, dBTP, ge);
+		g = std::min (g, ge);
+		set = true;
+	}
+
+	if (!set) {
+		g = 1.f;
+	}
+	//printf ("LF %f  / %f\n", g, 1.f / g);
+	return g;
+}
diff --git a/libs/audiographer/src/general/sr_converter.cc b/libs/audiographer/src/general/sr_converter.cc
index 9b5fa80..74da2ae 100644
--- a/libs/audiographer/src/general/sr_converter.cc
+++ b/libs/audiographer/src/general/sr_converter.cc
@@ -89,7 +89,7 @@ SampleRateConverter::allocate_buffers (framecnt_t max_frames)
 		max_leftover_frames = 4 * max_frames;
 		leftover_data = (float *) realloc (leftover_data, max_leftover_frames * sizeof (float));
 		if (throw_level (ThrowObject) && !leftover_data) {
-			throw Exception (*this, "A memory allocation error occured");
+			throw Exception (*this, "A memory allocation error occurred");
 		}
 
 		max_frames_in = max_frames;
@@ -164,7 +164,7 @@ SampleRateConverter::process (ProcessContext<float> const & c)
 		err = src_process (src_state, &src_data);
 		if (throw_level (ThrowProcess) && err) {
 			throw Exception (*this, str (format
-			("An error occured during sample rate conversion: %1%")
+			("An error occurred during sample rate conversion: %1%")
 			% src_strerror (err)));
 		}
 
diff --git a/libs/audiographer/tests/sndfile/tmp_file_test.cc b/libs/audiographer/tests/sndfile/tmp_file_test.cc
index 32e3913..9748623 100644
--- a/libs/audiographer/tests/sndfile/tmp_file_test.cc
+++ b/libs/audiographer/tests/sndfile/tmp_file_test.cc
@@ -1,5 +1,5 @@
 #include "tests/utils.h"
-#include "audiographer/sndfile/tmp_file.h"
+#include "audiographer/sndfile/tmp_file_sync.h"
 
 using namespace AudioGrapher;
 
@@ -24,7 +24,7 @@ class TmpFileTest : public CppUnit::TestFixture
 	void testProcess()
 	{
 		uint32_t channels = 2;
-		file.reset (new TmpFile<float>(SF_FORMAT_WAV | SF_FORMAT_FLOAT, channels, 44100));
+		file.reset (new TmpFileSync<float>(SF_FORMAT_WAV | SF_FORMAT_FLOAT, channels, 44100));
 		AllocatingProcessContext<float> c (random_data, frames, channels);
 		c.set_flag (ProcessContext<float>::EndOfInput);
 		file->process (c);
@@ -37,7 +37,7 @@ class TmpFileTest : public CppUnit::TestFixture
 	}
 
   private:
-	boost::shared_ptr<TmpFile<float> > file;
+	boost::shared_ptr<TmpFileSync<float> > file;
 
 	float * random_data;
 	framecnt_t frames;
diff --git a/libs/audiographer/wscript b/libs/audiographer/wscript
index 17e7482..7ac9f8f 100644
--- a/libs/audiographer/wscript
+++ b/libs/audiographer/wscript
@@ -66,6 +66,7 @@ def build(bld):
         'src/debug_utils.cc',
         'src/general/analyser.cc',
         'src/general/broadcast_info.cc',
+        'src/general/loudness_reader.cc',
         'src/general/normalizer.cc'
         ]
     if bld.is_defined('HAVE_SAMPLERATE'):
@@ -85,7 +86,7 @@ def build(bld):
     audiographer.target         = 'audiographer'
     audiographer.export_includes = ['.', './src']
     audiographer.includes       = ['.', './src','../ardour','../timecode','../evoral']
-    audiographer.uselib         = 'GLIB GLIBMM GTHREAD SAMPLERATE SNDFILE FFTW3F VAMPSDK VAMPHOSTSDK'
+    audiographer.uselib         = 'GLIB GLIBMM GTHREAD SAMPLERATE SNDFILE FFTW3F VAMPSDK VAMPHOSTSDK XML'
     audiographer.use            = 'libpbd'
     audiographer.vnum           = AUDIOGRAPHER_LIB_VERSION
     audiographer.install_path   = bld.env['LIBDIR']
diff --git a/libs/backends/MSVCbackends/dummy_audiobackend.vcproj b/libs/backends/MSVCbackends/dummy_audiobackend.vcproj
index f7f45c2..e37ac97 100644
--- a/libs/backends/MSVCbackends/dummy_audiobackend.vcproj
+++ b/libs/backends/MSVCbackends/dummy_audiobackend.vcproj
@@ -42,7 +42,7 @@
 				AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
 				Optimization="0"
 				AdditionalIncludeDirectories="..;..\dummy;..\..\ardour;..\..\pbd;..\..\timecode;..\..\evoral;"..\..\midi++2";"$(GenericIncludeFolder)\ardourext";"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor";"$(GenericIncludeFolder)\boost";..\.."
-				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;BUILDING_DUMMY_BACKEND;ARDOURBACKEND_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_WINDOWS;_DEBUG;DEBUG="Debug";ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_dummy\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;BUILDING_DUMMY_BACKEND;ARDOURBACKEND_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_WINDOWS;_DEBUG;DEBUG="Debug";ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_dummy\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
 				MinimalRebuild="true"
 				RuntimeLibrary="3"
 				WarningLevel="3"
@@ -124,7 +124,7 @@
 				Optimization="2"
 				InlineFunctionExpansion="1"
 				AdditionalIncludeDirectories="..;..\dummy;..\..\ardour;..\..\pbd;..\..\timecode;..\..\evoral;"..\..\midi++2";"$(GenericIncludeFolder)\ardourext";"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor";"$(GenericIncludeFolder)\boost";..\.."
-				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_DUMMY_BACKEND;ARDOURBACKEND_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_WINDOWS;NDEBUG;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_dummy\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_DUMMY_BACKEND;ARDOURBACKEND_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_WINDOWS;NDEBUG;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_dummy\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
 				StringPooling="false"
 				RuntimeLibrary="2"
 				EnableEnhancedInstructionSet="1"
@@ -206,7 +206,7 @@
 				AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
 				Optimization="0"
 				AdditionalIncludeDirectories="..;..\dummy;..\..\ardour;..\..\pbd;..\..\timecode;..\..\evoral;"..\..\midi++2";"$(GenericIncludeFolder)\ardourext";"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor";"$(GenericIncludeFolder)\boost";..\.."
-				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_DUMMY_BACKEND;ARDOURBACKEND_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_WINDOWS;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_dummy\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_DUMMY_BACKEND;ARDOURBACKEND_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_WINDOWS;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_dummy\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
 				StringPooling="false"
 				RuntimeLibrary="2"
 				EnableEnhancedInstructionSet="1"
@@ -293,7 +293,7 @@
 			UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
 			>
 			<File
-				RelativePath="..\..\..\icons\win32\msvc_resources.rc"
+				RelativePath="..\..\..\gtk2_ardour\win32\msvc_resources.rc"
 				>
 			</File>
 		</Filter>
diff --git a/libs/backends/MSVCbackends/jack_audiobackend.vcproj b/libs/backends/MSVCbackends/jack_audiobackend.vcproj
index 2c22fe8..ad93d7f 100644
--- a/libs/backends/MSVCbackends/jack_audiobackend.vcproj
+++ b/libs/backends/MSVCbackends/jack_audiobackend.vcproj
@@ -41,8 +41,8 @@
 				Name="VCCLCompilerTool"
 				AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
 				Optimization="0"
-				AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\timecode;..\..\rubberband;"..\..\vamp-sdk";"..\..\midi++2";..\..\taglib;..\..\taglib\taglib;..\..\taglib\taglib\toolkit;..\..\audiographer;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor";..\..\..\..\support\MB3JackPortaudio\include"
-				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;BUILDING_JACK_BACKEND;ARDOURBACKEND_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_DEBUG;DEBUG="Debug";ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_jack\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_PORTAUDIO=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;NO_JACK_METADATA=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+				AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\timecode;..\..\rubberband;"..\..\vamp-sdk";"..\..\midi++2";..\..\taglib;..\..\taglib\taglib;..\..\taglib\taglib\toolkit;..\..\audiographer;..\..\lua;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor";..\..\..\..\support\MB3JackPortaudio\include"
+				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;BUILDING_JACK_BACKEND;ARDOURBACKEND_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_DEBUG;DEBUG="Debug";ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_jack\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_PORTAUDIO=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_JACK_PORT_RENAME=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;NO_JACK_METADATA=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
 				MinimalRebuild="true"
 				RuntimeLibrary="3"
 				WarningLevel="3"
@@ -123,8 +123,8 @@
 				AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
 				Optimization="2"
 				InlineFunctionExpansion="1"
-				AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\timecode;..\..\rubberband;"..\..\vamp-sdk";"..\..\midi++2";..\..\taglib;..\..\taglib\taglib;..\..\taglib\taglib\toolkit;..\..\audiographer;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor";..\..\..\..\support\MB3JackPortaudio\include"
-				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_JACK_BACKEND;ARDOURBACKEND_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;NDEBUG;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_jack\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_PORTAUDIO=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;NO_JACK_METADATA=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+				AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\timecode;..\..\rubberband;"..\..\vamp-sdk";"..\..\midi++2";..\..\taglib;..\..\taglib\taglib;..\..\taglib\taglib\toolkit;..\..\audiographer;..\..\lua;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor";..\..\..\..\support\MB3JackPortaudio\include"
+				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_JACK_BACKEND;ARDOURBACKEND_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;NDEBUG;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_jack\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_PORTAUDIO=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_JACK_PORT_RENAME=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;NO_JACK_METADATA=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
 				StringPooling="false"
 				RuntimeLibrary="2"
 				EnableEnhancedInstructionSet="1"
@@ -204,8 +204,8 @@
 				Name="VCCLCompilerTool"
 				AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
 				Optimization="0"
-				AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\timecode;..\..\rubberband;"..\..\vamp-sdk";"..\..\midi++2";..\..\taglib;..\..\taglib\taglib;..\..\taglib\taglib\toolkit;..\..\audiographer;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor";..\..\..\..\support\MB3JackPortaudio\include"
-				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_JACK_BACKEND;ARDOURBACKEND_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_jack\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_PORTAUDIO=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;NO_JACK_METADATA=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+				AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\timecode;..\..\rubberband;"..\..\vamp-sdk";"..\..\midi++2";..\..\taglib;..\..\taglib\taglib;..\..\taglib\taglib\toolkit;..\..\audiographer;..\..\lua;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor";..\..\..\..\support\MB3JackPortaudio\include"
+				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_JACK_BACKEND;ARDOURBACKEND_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_jack\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_PORTAUDIO=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_JACK_PORT_RENAME=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;NO_JACK_METADATA=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
 				StringPooling="false"
 				RuntimeLibrary="2"
 				EnableEnhancedInstructionSet="1"
@@ -324,7 +324,7 @@
 			UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
 			>
 			<File
-				RelativePath="..\..\..\icons\win32\msvc_resources.rc"
+				RelativePath="..\..\..\gtk2_ardour\win32\msvc_resources.rc"
 				>
 			</File>
 		</Filter>
diff --git a/libs/backends/MSVCbackends/portaudio_audiobackend.vcproj b/libs/backends/MSVCbackends/portaudio_audiobackend.vcproj
index 5562f42..c8ec8c4 100644
--- a/libs/backends/MSVCbackends/portaudio_audiobackend.vcproj
+++ b/libs/backends/MSVCbackends/portaudio_audiobackend.vcproj
@@ -42,7 +42,7 @@
 				AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
 				Optimization="0"
 				AdditionalIncludeDirectories="..;..\portaudio;..\..\ardour;..\..\pbd;..\..\timecode;..\..\evoral;"..\..\midi++2";"$(GenericIncludeFolder)\ardourext";"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor";"$(GenericIncludeFolder)\boost";..\..;..\..\..\..\support\MB3Portaudio\include"
-				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;BUILDING_PORTAUDIO_BACKEND;BACKEND_NAME="\"PortAudio\x0020(default)\"";WITH_ASIO;ARDOURBACKEND_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_WINDOWS;_DEBUG;DEBUG="Debug";ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_portaudio\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_PORTAUDIO=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;BUILDING_PORTAUDIO_BACKEND;BACKEND_NAME="\"PortAudio\x0020(default)\"";WITH_ASIO;ARDOURBACKEND_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_WINDOWS;_DEBUG;DEBUG="Debug";ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_portaudio\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_PORTAUDIO=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
 				MinimalRebuild="true"
 				RuntimeLibrary="3"
 				WarningLevel="3"
@@ -124,7 +124,7 @@
 				Optimization="2"
 				InlineFunctionExpansion="1"
 				AdditionalIncludeDirectories="..;..\portaudio;..\..\ardour;..\..\pbd;..\..\timecode;..\..\evoral;"..\..\midi++2";"$(GenericIncludeFolder)\ardourext";"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor";"$(GenericIncludeFolder)\boost";..\..;..\..\..\..\support\MB3Portaudio\include"
-				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_PORTAUDIO_BACKEND;BACKEND_NAME="\"PortAudio\x0020(default)\"";WITH_ASIO;ARDOURBACKEND_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_WINDOWS;NDEBUG;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_portaudio\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_PORTAUDIO=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_PORTAUDIO_BACKEND;BACKEND_NAME="\"PortAudio\x0020(default)\"";WITH_ASIO;ARDOURBACKEND_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_WINDOWS;NDEBUG;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_portaudio\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_PORTAUDIO=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
 				StringPooling="false"
 				RuntimeLibrary="2"
 				EnableEnhancedInstructionSet="1"
@@ -206,7 +206,7 @@
 				AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
 				Optimization="0"
 				AdditionalIncludeDirectories="..;..\portaudio;..\..\ardour;..\..\pbd;..\..\timecode;..\..\evoral;"..\..\midi++2";"$(GenericIncludeFolder)\ardourext";"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor";"$(GenericIncludeFolder)\boost";..\..;..\..\..\..\support\MB3Portaudio\include"
-				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_PORTAUDIO_BACKEND;BACKEND_NAME="\"PortAudio\x0020(default)\"";WITH_ASIO;ARDOURBACKEND_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_WINDOWS;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_portaudio\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_PORTAUDIO=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_PORTAUDIO_BACKEND;BACKEND_NAME="\"PortAudio\x0020(default)\"";WITH_ASIO;ARDOURBACKEND_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_WINDOWS;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_portaudio\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_PORTAUDIO=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
 				StringPooling="false"
 				RuntimeLibrary="2"
 				EnableEnhancedInstructionSet="1"
@@ -349,7 +349,7 @@
 			UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
 			>
 			<File
-				RelativePath="..\..\..\icons\win32\msvc_resources.rc"
+				RelativePath="..\..\..\gtk2_ardour\win32\msvc_resources.rc"
 				>
 			</File>
 		</Filter>
diff --git a/libs/backends/MSVCbackends/waves_audiobackend.vcproj b/libs/backends/MSVCbackends/waves_audiobackend.vcproj
index 06f4ae1..4816b0c 100644
--- a/libs/backends/MSVCbackends/waves_audiobackend.vcproj
+++ b/libs/backends/MSVCbackends/waves_audiobackend.vcproj
@@ -42,7 +42,7 @@
 				AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
 				Optimization="0"
 				AdditionalIncludeDirectories="..;..\wavesaudio;..\wavesaudio\wavesapi;..\wavesaudio\wavesapi\wavespublicapi;..\wavesaudio\wavesapi\devicemanager;..\wavesaudio\wavesapi\refmanager;..\wavesaudio\wavesapi\threads;..\wavesaudio\wavesapi\miscutils;..\wavesaudio\portmidi\src\pm_common;..\wavesaudio\portmidi;..\..\ardour;..\..\pbd;..\..\timecode;..\..\evoral;"..\..\midi++2";"$(GenericIncludeFolder)\ardourext";"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor";..\..\..\..\support\MB3WavesPortaudio\include;..\..\..\..\support\MB3WavesPortaudio\src\hostapi\asio\ASIOSDK\common;..\.."
-				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;BUILDING_WAVES_BACKEND;ARDOURBACKEND_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_WINDOWS;_DEBUG;DEBUG="Debug";ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_waves\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;BUILDING_WAVES_BACKEND;ARDOURBACKEND_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_WINDOWS;_DEBUG;DEBUG="Debug";ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_waves\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
 				MinimalRebuild="true"
 				RuntimeLibrary="3"
 				WarningLevel="3"
@@ -124,7 +124,7 @@
 				Optimization="2"
 				InlineFunctionExpansion="1"
 				AdditionalIncludeDirectories="..;..\wavesaudio;..\wavesaudio\wavesapi;..\wavesaudio\wavesapi\wavespublicapi;..\wavesaudio\wavesapi\devicemanager;..\wavesaudio\wavesapi\refmanager;..\wavesaudio\wavesapi\threads;..\wavesaudio\wavesapi\miscutils;..\wavesaudio\portmidi\src\pm_common;..\wavesaudio\portmidi;..\..\ardour;..\..\pbd;..\..\timecode;..\..\evoral;"..\..\midi++2";"$(GenericIncludeFolder)\ardourext";"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor";..\..\..\..\support\MB3WavesPortaudio\include;..\..\..\..\support\MB3WavesPortaudio\src\hostapi\asio\ASIOSDK\common;..\.."
-				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_WAVES_BACKEND;ARDOURBACKEND_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_WINDOWS;NDEBUG;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_waves\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_WAVES_BACKEND;ARDOURBACKEND_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_WINDOWS;NDEBUG;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_waves\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
 				StringPooling="false"
 				RuntimeLibrary="2"
 				EnableEnhancedInstructionSet="1"
@@ -205,7 +205,7 @@
 				AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
 				Optimization="0"
 				AdditionalIncludeDirectories="..;..\wavesaudio;..\wavesaudio\wavesapi;..\wavesaudio\wavesapi\wavespublicapi;..\wavesaudio\wavesapi\devicemanager;..\wavesaudio\wavesapi\refmanager;..\wavesaudio\wavesapi\threads;..\wavesaudio\wavesapi\miscutils;..\wavesaudio\portmidi\src\pm_common;..\wavesaudio\portmidi;..\..\ardour;..\..\pbd;..\..\timecode;..\..\evoral;"..\..\midi++2";"$(GenericIncludeFolder)\ardourext";"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor";..\..\..\..\support\MB3WavesPortaudio\include;..\..\..\..\support\MB3WavesPortaudio\src\hostapi\asio\ASIOSDK\common;..\.."
-				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_WAVES_BACKEND;ARDOURBACKEND_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_WINDOWS;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_waves\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_WAVES_BACKEND;ARDOURBACKEND_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_WINDOWS;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_waves\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
 				StringPooling="false"
 				RuntimeLibrary="2"
 				EnableEnhancedInstructionSet="1"
@@ -524,7 +524,7 @@
 			UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
 			>
 			<File
-				RelativePath="..\..\..\icons\win32\msvc_resources.rc"
+				RelativePath="..\..\..\gtk2_ardour\win32\msvc_resources.rc"
 				>
 			</File>
 		</Filter>
diff --git a/libs/backends/alsa/alsa_audiobackend.cc b/libs/backends/alsa/alsa_audiobackend.cc
index 3658aa3..5c267d6 100644
--- a/libs/backends/alsa/alsa_audiobackend.cc
+++ b/libs/backends/alsa/alsa_audiobackend.cc
@@ -32,7 +32,7 @@
 #include "ardour/filesystem_paths.h"
 #include "ardour/port_manager.h"
 #include "ardouralsautil/devicelist.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 
@@ -809,13 +809,14 @@ AlsaAudioBackend::_start (bool for_latency_measurement)
 		return BackendReinitializationError;
 	}
 
-	if (_ports.size()) {
+	if (_ports.size () || _portmap.size ()) {
 		PBD::warning << _("AlsaAudioBackend: recovering from unclean shutdown, port registry is not empty.") << endmsg;
 		_system_inputs.clear();
 		_system_outputs.clear();
 		_system_midi_in.clear();
 		_system_midi_out.clear();
 		_ports.clear();
+		_portmap.clear();
 	}
 
 	/* reset internal state */
@@ -1209,11 +1210,20 @@ AlsaAudioBackend::port_name_size () const
 int
 AlsaAudioBackend::set_port_name (PortEngine::PortHandle port, const std::string& name)
 {
+	std::string newname (_instance_name + ":" + name);
 	if (!valid_port (port)) {
-		PBD::error << _("AlsaBackend::set_port_name: Invalid Port(s)") << endmsg;
+		PBD::error << _("AlsaBackend::set_port_name: Invalid Port") << endmsg;
 		return -1;
 	}
-	return static_cast<AlsaPort*>(port)->set_name (_instance_name + ":" + name);
+	if (find_port (newname)) {
+		PBD::error << _("AlsaBackend::set_port_name: Port with given name already exists") << endmsg;
+		return -1;
+	}
+
+	AlsaPort* p = static_cast<AlsaPort*>(port);
+	_portmap.erase (p->name());
+	_portmap.insert (make_pair (newname, p));
+	return p->set_name (newname);
 }
 
 std::string
@@ -1243,6 +1253,20 @@ AlsaAudioBackend::get_port_property (PortHandle port, const std::string& key, st
 	return -1;
 }
 
+int
+AlsaAudioBackend::set_port_property (PortHandle port, const std::string& key, const std::string& value, const std::string& type)
+{
+	if (!valid_port (port)) {
+		PBD::warning << _("AlsaBackend::set_port_property: Invalid Port(s)") << endmsg;
+		return -1;
+	}
+	if (key == "http://jackaudio.org/metadata/pretty-name" && type.empty ()) {
+		static_cast<AlsaPort*>(port)->set_pretty_name (value);
+		return 0;
+	}
+	return -1;
+}
+
 PortEngine::PortHandle
 AlsaAudioBackend::get_port_by_name (const std::string& name) const
 {
@@ -1264,8 +1288,9 @@ AlsaAudioBackend::get_ports (
 			use_regexp = true;
 		}
 	}
-	for (size_t i = 0; i < _ports.size (); ++i) {
-		AlsaPort* port = _ports[i];
+
+	for (PortIndex::const_iterator i = _ports.begin (); i != _ports.end (); ++i) {
+		AlsaPort* port = *i;
 		if ((port->type () == type) && flags == (port->flags () & flags)) {
 			if (!use_regexp || !regexec (&port_regex, port->name ().c_str (), 0, NULL, 0)) {
 				port_names.push_back (port->name ());
@@ -1324,7 +1349,8 @@ AlsaAudioBackend::add_port (
 			return 0;
 	}
 
-	_ports.push_back (port);
+	_ports.insert (port);
+	_portmap.insert (make_pair (name, port));
 
 	return port;
 }
@@ -1336,12 +1362,13 @@ AlsaAudioBackend::unregister_port (PortEngine::PortHandle port_handle)
 		return;
 	}
 	AlsaPort* port = static_cast<AlsaPort*>(port_handle);
-	std::vector<AlsaPort*>::iterator i = std::find (_ports.begin (), _ports.end (), static_cast<AlsaPort*>(port_handle));
+	PortIndex::iterator i = std::find (_ports.begin(), _ports.end(), static_cast<AlsaPort*>(port_handle));
 	if (i == _ports.end ()) {
 		PBD::error << _("AlsaBackend::unregister_port: Failed to find port") << endmsg;
 		return;
 	}
 	disconnect_all(port_handle);
+	_portmap.erase (port->name());
 	_ports.erase (i);
 	delete port;
 }
@@ -1490,19 +1517,19 @@ AlsaAudioBackend::register_system_midi_ports(const std::string device)
 void
 AlsaAudioBackend::unregister_ports (bool system_only)
 {
-	size_t i = 0;
 	_system_inputs.clear();
 	_system_outputs.clear();
 	_system_midi_in.clear();
 	_system_midi_out.clear();
-	while (i <  _ports.size ()) {
-		AlsaPort* port = _ports[i];
+
+	for (PortIndex::iterator i = _ports.begin (); i != _ports.end ();) {
+		PortIndex::iterator cur = i++;
+		AlsaPort* port = *cur;
 		if (! system_only || (port->is_physical () && port->is_terminal ())) {
 			port->disconnect_all ();
+			_portmap.erase (port->name());
 			delete port;
-			_ports.erase (_ports.begin() + i);
-		} else {
-			++i;
+			_ports.erase (cur);
 		}
 	}
 }
@@ -1591,10 +1618,12 @@ bool
 AlsaAudioBackend::connected_to (PortEngine::PortHandle src, const std::string& dst, bool /*process_callback_safe*/)
 {
 	AlsaPort* dst_port = find_port (dst);
+#ifndef NDEBUG
 	if (!valid_port (src) || !dst_port) {
 		PBD::error << _("AlsaBackend::connected_to: Invalid Port") << endmsg;
 		return false;
 	}
+#endif
 	return static_cast<AlsaPort*>(src)->is_connected (dst_port);
 }
 
@@ -1618,9 +1647,9 @@ AlsaAudioBackend::get_connections (PortEngine::PortHandle port, std::vector<std:
 
 	assert (0 == names.size ());
 
-	const std::vector<AlsaPort*>& connected_ports = static_cast<AlsaPort*>(port)->get_connections ();
+	const std::set<AlsaPort*>& connected_ports = static_cast<AlsaPort*>(port)->get_connections ();
 
-	for (std::vector<AlsaPort*>::const_iterator i = connected_ports.begin (); i != connected_ports.end (); ++i) {
+	for (std::set<AlsaPort*>::const_iterator i = connected_ports.begin (); i != connected_ports.end (); ++i) {
 		names.push_back ((*i)->name ());
 	}
 
@@ -1761,8 +1790,8 @@ AlsaAudioBackend::port_is_physical (PortEngine::PortHandle port) const
 void
 AlsaAudioBackend::get_physical_outputs (DataType type, std::vector<std::string>& port_names)
 {
-	for (size_t i = 0; i < _ports.size (); ++i) {
-		AlsaPort* port = _ports[i];
+	for (PortIndex::iterator i = _ports.begin (); i != _ports.end (); ++i) {
+		AlsaPort* port = *i;
 		if ((port->type () == type) && port->is_input () && port->is_physical ()) {
 			port_names.push_back (port->name ());
 		}
@@ -1772,8 +1801,8 @@ AlsaAudioBackend::get_physical_outputs (DataType type, std::vector<std::string>&
 void
 AlsaAudioBackend::get_physical_inputs (DataType type, std::vector<std::string>& port_names)
 {
-	for (size_t i = 0; i < _ports.size (); ++i) {
-		AlsaPort* port = _ports[i];
+	for (PortIndex::iterator i = _ports.begin (); i != _ports.end (); ++i) {
+		AlsaPort* port = *i;
 		if ((port->type () == type) && port->is_output () && port->is_physical ()) {
 			port_names.push_back (port->name ());
 		}
@@ -1785,8 +1814,8 @@ AlsaAudioBackend::n_physical_outputs () const
 {
 	int n_midi = 0;
 	int n_audio = 0;
-	for (size_t i = 0; i < _ports.size (); ++i) {
-		AlsaPort* port = _ports[i];
+	for (PortIndex::const_iterator i = _ports.begin (); i != _ports.end (); ++i) {
+		AlsaPort* port = *i;
 		if (port->is_output () && port->is_physical ()) {
 			switch (port->type ()) {
 				case DataType::AUDIO: ++n_audio; break;
@@ -1806,8 +1835,8 @@ AlsaAudioBackend::n_physical_inputs () const
 {
 	int n_midi = 0;
 	int n_audio = 0;
-	for (size_t i = 0; i < _ports.size (); ++i) {
-		AlsaPort* port = _ports[i];
+	for (PortIndex::const_iterator i = _ports.begin (); i != _ports.end (); ++i) {
+		AlsaPort* port = *i;
 		if (port->is_input () && port->is_physical ()) {
 			switch (port->type ()) {
 				case DataType::AUDIO: ++n_audio; break;
@@ -2161,7 +2190,7 @@ int AlsaPort::connect (AlsaPort *port)
 
 void AlsaPort::_connect (AlsaPort *port, bool callback)
 {
-	_connections.push_back (port);
+	_connections.insert (port);
 	if (callback) {
 		port->_connect (this, false);
 		_alsa_backend.port_connect_callback (name(),  port->name(), true);
@@ -2187,12 +2216,9 @@ int AlsaPort::disconnect (AlsaPort *port)
 
 void AlsaPort::_disconnect (AlsaPort *port, bool callback)
 {
-	std::vector<AlsaPort*>::iterator it = std::find (_connections.begin (), _connections.end (), port);
-
+	std::set<AlsaPort*>::iterator it = _connections.find (port);
 	assert (it != _connections.end ());
-
 	_connections.erase (it);
-
 	if (callback) {
 		port->_disconnect (this, false);
 		_alsa_backend.port_connect_callback (name(),  port->name(), false);
@@ -2203,21 +2229,22 @@ void AlsaPort::_disconnect (AlsaPort *port, bool callback)
 void AlsaPort::disconnect_all ()
 {
 	while (!_connections.empty ()) {
-		_connections.back ()->_disconnect (this, false);
-		_alsa_backend.port_connect_callback (name(),  _connections.back ()->name(), false);
-		_connections.pop_back ();
+		std::set<AlsaPort*>::iterator it = _connections.begin ();
+		(*it)->_disconnect (this, false);
+		_alsa_backend.port_connect_callback (name(), (*it)->name(), false);
+		_connections.erase (it);
 	}
 }
 
 bool
 AlsaPort::is_connected (const AlsaPort *port) const
 {
-	return std::find (_connections.begin (), _connections.end (), port) != _connections.end ();
+	return _connections.find (const_cast<AlsaPort *>(port)) != _connections.end ();
 }
 
 bool AlsaPort::is_physically_connected () const
 {
-	for (std::vector<AlsaPort*>::const_iterator it = _connections.begin (); it != _connections.end (); ++it) {
+	for (std::set<AlsaPort*>::const_iterator it = _connections.begin (); it != _connections.end (); ++it) {
 		if ((*it)->is_physical ()) {
 			return true;
 		}
@@ -2239,14 +2266,15 @@ AlsaAudioPort::~AlsaAudioPort () { }
 void* AlsaAudioPort::get_buffer (pframes_t n_samples)
 {
 	if (is_input ()) {
-		std::vector<AlsaPort*>::const_iterator it = get_connections ().begin ();
-		if (it == get_connections ().end ()) {
+		const std::set<AlsaPort *>& connections = get_connections ();
+		std::set<AlsaPort*>::const_iterator it = connections.begin ();
+		if (it == connections.end ()) {
 			memset (_buffer, 0, n_samples * sizeof (Sample));
 		} else {
 			AlsaAudioPort const * source = static_cast<const AlsaAudioPort*>(*it);
 			assert (source && source->is_output ());
 			memcpy (_buffer, source->const_buffer (), n_samples * sizeof (Sample));
-			while (++it != get_connections ().end ()) {
+			while (++it != connections.end ()) {
 				source = static_cast<const AlsaAudioPort*>(*it);
 				assert (source && source->is_output ());
 				Sample* dst = buffer ();
@@ -2282,8 +2310,9 @@ void* AlsaMidiPort::get_buffer (pframes_t /* nframes */)
 {
 	if (is_input ()) {
 		(_buffer[_bufperiod]).clear ();
-		for (std::vector<AlsaPort*>::const_iterator i = get_connections ().begin ();
-				i != get_connections ().end ();
+		const std::set<AlsaPort*>& connections = get_connections ();
+		for (std::set<AlsaPort*>::const_iterator i = connections.begin ();
+				i != connections.end ();
 				++i) {
 			const AlsaMidiBuffer * src = static_cast<const AlsaMidiPort*>(*i)->const_buffer ();
 			for (AlsaMidiBuffer::const_iterator it = src->begin (); it != src->end (); ++it) {
diff --git a/libs/backends/alsa/alsa_audiobackend.h b/libs/backends/alsa/alsa_audiobackend.h
index 01f7579..d8dfb31 100644
--- a/libs/backends/alsa/alsa_audiobackend.h
+++ b/libs/backends/alsa/alsa_audiobackend.h
@@ -30,6 +30,7 @@
 
 #include <boost/shared_ptr.hpp>
 
+#include "pbd/natsort.h"
 #include "ardour/audio_backend.h"
 #include "ardour/dsp_load_calculator.h"
 #include "ardour/system_exec.h"
@@ -86,7 +87,7 @@ class AlsaPort {
 		bool is_connected (const AlsaPort *port) const;
 		bool is_physically_connected () const;
 
-		const std::vector<AlsaPort *>& get_connections () const { return _connections; }
+		const std::set<AlsaPort *>& get_connections () const { return _connections; }
 
 		int connect (AlsaPort *port);
 		int disconnect (AlsaPort *port);
@@ -118,7 +119,7 @@ class AlsaPort {
 		const PortFlags _flags;
 		LatencyRange _capture_latency_range;
 		LatencyRange _playback_latency_range;
-		std::vector<AlsaPort*> _connections;
+		std::set<AlsaPort*> _connections;
 
 		void _connect (AlsaPort* , bool);
 		void _disconnect (AlsaPort* , bool);
@@ -266,7 +267,9 @@ class AlsaAudioBackend : public AudioBackend {
 		int         set_port_name (PortHandle, const std::string&);
 		std::string get_port_name (PortHandle) const;
 		PortHandle  get_port_by_name (const std::string&) const;
+
 		int get_port_property (PortHandle, const std::string& key, std::string& value, std::string& type) const;
+		int set_port_property (PortHandle, const std::string& key, const std::string& value, const std::string& type);
 
 		int get_ports (const std::string& port_name_pattern, DataType type, PortFlags flags, std::vector<std::string>&) const;
 
@@ -402,12 +405,24 @@ class AlsaAudioBackend : public AudioBackend {
 		int register_system_midi_ports (const std::string device = "");
 		void unregister_ports (bool system_only = false);
 
-		std::vector<AlsaPort *> _ports;
 		std::vector<AlsaPort *> _system_inputs;
 		std::vector<AlsaPort *> _system_outputs;
 		std::vector<AlsaPort *> _system_midi_in;
 		std::vector<AlsaPort *> _system_midi_out;
 
+		struct SortByPortName
+		{
+			bool operator ()(const AlsaPort* lhs, const AlsaPort* rhs) const
+			{
+				return PBD::naturally_less (lhs->name ().c_str (), rhs->name ().c_str ());
+			}
+		};
+
+		typedef std::map<std::string, AlsaPort *> PortMap; // fast lookup in _ports
+		typedef std::set<AlsaPort *, SortByPortName> PortIndex; // fast lookup in _ports
+		PortMap _portmap;
+		PortIndex _ports;
+
 		std::vector<AlsaMidiOut *> _rmidi_out;
 		std::vector<AlsaMidiIn  *> _rmidi_in;
 
@@ -440,16 +455,15 @@ class AlsaAudioBackend : public AudioBackend {
 		}
 
 		bool valid_port (PortHandle port) const {
-			return std::find (_ports.begin (), _ports.end (), (AlsaPort*)port) != _ports.end ();
+			return std::find (_ports.begin(), _ports.end(), static_cast<AlsaPort*>(port)) != _ports.end ();
 		}
 
-		AlsaPort * find_port (const std::string& port_name) const {
-			for (std::vector<AlsaPort*>::const_iterator it = _ports.begin (); it != _ports.end (); ++it) {
-				if ((*it)->name () == port_name) {
-					return *it;
-				}
+		AlsaPort* find_port (const std::string& port_name) const {
+			PortMap::const_iterator it = _portmap.find (port_name);
+			if (it == _portmap.end()) {
+				return NULL;
 			}
-			return NULL;
+			return (*it).second;
 		}
 
 		void update_systemic_audio_latencies ();
diff --git a/libs/backends/alsa/alsa_midi.cc b/libs/backends/alsa/alsa_midi.cc
index 43c11c3..76738e9 100644
--- a/libs/backends/alsa/alsa_midi.cc
+++ b/libs/backends/alsa/alsa_midi.cc
@@ -24,7 +24,7 @@
 #include "rt_thread.h"
 
 #include "pbd/error.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 
diff --git a/libs/backends/alsa/alsa_rawmidi.cc b/libs/backends/alsa/alsa_rawmidi.cc
index 303649b..0702c63 100644
--- a/libs/backends/alsa/alsa_rawmidi.cc
+++ b/libs/backends/alsa/alsa_rawmidi.cc
@@ -24,7 +24,7 @@
 #include "alsa_rawmidi.h"
 
 #include "pbd/error.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 
diff --git a/libs/backends/alsa/alsa_sequencer.cc b/libs/backends/alsa/alsa_sequencer.cc
index cb77c3c..a9c3adf 100644
--- a/libs/backends/alsa/alsa_sequencer.cc
+++ b/libs/backends/alsa/alsa_sequencer.cc
@@ -23,7 +23,7 @@
 #include "alsa_sequencer.h"
 
 #include "pbd/error.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 
diff --git a/libs/backends/alsa/wscript b/libs/backends/alsa/wscript
index 7a4649f..465260d 100644
--- a/libs/backends/alsa/wscript
+++ b/libs/backends/alsa/wscript
@@ -29,7 +29,7 @@ def build(bld):
     obj.name     = 'alsa_audiobackend'
     obj.target   = 'alsa_audiobackend'
     obj.use      = 'libardour libpbd ardouralsautil'
-    obj.uselib   = 'ALSA'
+    obj.uselib   = 'ALSA GLIBMM XML'
     obj.install_path  = os.path.join(bld.env['LIBDIR'], 'backends')
     obj.defines = ['PACKAGE="' + I18N_PACKAGE + '"',
                    'ARDOURBACKEND_DLL_EXPORTS'
diff --git a/libs/backends/alsa/zita-alsa-pcmi.h b/libs/backends/alsa/zita-alsa-pcmi.h
index 27af022..48c2396 100644
--- a/libs/backends/alsa/zita-alsa-pcmi.h
+++ b/libs/backends/alsa/zita-alsa-pcmi.h
@@ -123,7 +123,7 @@ private:
 	typedef char *(Alsa_pcmi::*play_function)(const float *, char *, int, int);
 	typedef const char *(Alsa_pcmi::*capt_function) (const char *, float *, int, int);
 
-	enum { MAXPFD = 16, MAXCHAN = 64 };
+	enum { MAXPFD = 16, MAXCHAN = 128 };
 
 	void initialise (const char *play_name, const char *capt_name, const char *ctrl_name);
 	int set_hwpar (snd_pcm_t *handle, snd_pcm_hw_params_t *hwpar, const char *sname, unsigned int nfrag, unsigned int *nchan);
diff --git a/libs/backends/asio/asio_backend.cc b/libs/backends/asio/asio_backend.cc
deleted file mode 100644
index 60b6016..0000000
--- a/libs/backends/asio/asio_backend.cc
+++ /dev/null
@@ -1,1839 +0,0 @@
-/*
- * Copyright (C) 2014 Robin Gareus <robin at gareus.org>
- * Copyright (C) 2013 Paul Davis
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <regex.h>
-#include <sys/mman.h>
-#include <sys/time.h>
-
-#include <glibmm.h>
-
-#include "asio_backend.h"
-#include "rt_thread.h"
-
-#include "pbd/compose.h"
-#include "pbd/error.h"
-#include "pbd/file_utils.h"
-#include "ardour/filesystem_paths.h"
-#include "ardour/port_manager.h"
-#include "i18n.h"
-
-using namespace ARDOUR;
-
-static std::string s_instance_name;
-size_t ASIOBackend::_max_buffer_size = 8192;
-std::vector<std::string> ASIOBackend::_midi_options;
-std::vector<AudioBackend::DeviceStatus> ASIOBackend::_audio_device_status;
-
-
-/* static class instance access */
-static void hw_changed_callback_ptr (void *arg)
-{
-	ASIOBackend *d = static_cast<ASIOBackend*> (arg);
-	d->hw_changed_callback();
-}
-
-static void error_callback_ptr (void *arg)
-{
-	ASIOBackend *d = static_cast<ASIOBackend*> (arg);
-	d->error_callback();
-}
-
-static void xrun_callback_ptr (void *arg)
-{
-	ASIOBackend *d = static_cast<ASIOBackend*> (arg);
-	d->xrun_callback();
-}
-
-static void buffer_size_callback_ptr (void *arg)
-{
-	ASIOBackend *d = static_cast<ASIOBackend*> (arg);
-	d->buffer_size_callback();
-}
-
-static void sample_rate_callback_ptr (void *arg)
-{
-	ASIOBackend *d = static_cast<ASIOBackend*> (arg);
-	d->sample_rate_callback();
-}
-
-
-ASIOBackend::ASIOBackend (AudioEngine& e, AudioBackendInfo& info)
-	: AudioBackend (e, info)
-	, _run (false)
-	, _active_cb (false)
-	, _active_fw (false)
-	, _freewheeling (false)
-	, _freewheel (false)
-	, _freewheel_ack (false)
-	, _reinit_thread_callback (false)
-	, _measure_latency (false)
-	, _last_process_start (0)
-	, _audio_device("")
-	, _midi_driver_option(_("None"))
-	, _samplerate (48000)
-	, _samples_per_period (1024)
-	, _n_inputs (0)
-	, _n_outputs (0)
-	, _systemic_audio_input_latency (0)
-	, _systemic_audio_output_latency (0)
-	, _dsp_load (0)
-	, _processed_samples (0)
-	, _port_change_flag (false)
-{
-	_instance_name = s_instance_name;
-	pthread_mutex_init (&_port_callback_mutex, 0);
-	pthread_mutex_init (&_process_callback_mutex, 0);
-	pthread_mutex_init (&_freewheel_mutex, 0);
-	pthread_cond_init  (&_freewheel_signal, 0);
-
-#if 0 // TODO
-	//_pcmio = new ASIOPCM ();
-	//_midiio = new WindowsMidiIo ();
-
-	_pcmio->set_hw_changed_callback (hw_changed_callback_ptr, this);
-	_pcmio->discover();
-#endif
-}
-
-ASIOBackend::~ASIOBackend ()
-{
-#if 0
-	delete _pcmio; _pcmio = 0; // TODO
-	delete _midiio; _midiio = 0; // TODO
-#endif
-	pthread_mutex_destroy (&_port_callback_mutex);
-	pthread_mutex_destroy (&_process_callback_mutex);
-	pthread_mutex_destroy (&_freewheel_mutex);
-	pthread_cond_destroy  (&_freewheel_signal);
-}
-
-/* AUDIOBACKEND API */
-
-std::string
-ASIOBackend::name () const
-{
-	return X_("ASIO");
-}
-
-bool
-ASIOBackend::is_realtime () const
-{
-	return true;
-}
-
-std::vector<AudioBackend::DeviceStatus>
-ASIOBackend::enumerate_devices () const
-{
-	_audio_device_status.clear();
-#if 0 // TODO
-	std::map<size_t, std::string> devices;
-	_pcmio->device_list(devices);
-
-	for (std::map<size_t, std::string>::const_iterator i = devices.begin (); i != devices.end(); ++i) {
-		if (_audio_device == "") _audio_device = i->second;
-		_audio_device_status.push_back (DeviceStatus (i->second, true));
-	}
-#endif
-	return _audio_device_status;
-}
-
-std::vector<float>
-ASIOBackend::available_sample_rates (const std::string&) const
-{
-	std::vector<float> sr;
-#if 0 // TODO
-	_pcmio->available_sample_rates(_audio_device, sr);
-#endif
-	return sr;
-}
-
-std::vector<uint32_t>
-ASIOBackend::available_buffer_sizes (const std::string&) const
-{
-	std::vector<uint32_t> bs;
-#if 0 // TODO
-	_pcmio->available_buffer_sizes(_audio_device, bs);
-#endif
-	return bs;
-}
-
-uint32_t
-ASIOBackend::available_input_channel_count (const std::string&) const
-{
-	return 128; // TODO query current device
-}
-
-uint32_t
-ASIOBackend::available_output_channel_count (const std::string&) const
-{
-	return 128; // TODO query current device
-}
-
-bool
-ASIOBackend::can_change_sample_rate_when_running () const
-{
-	return false;
-}
-
-bool
-ASIOBackend::can_change_buffer_size_when_running () const
-{
-	return true;
-}
-
-int
-ASIOBackend::set_device_name (const std::string& d)
-{
-	_audio_device = d;
-#if 0 // TODO
-	const float sr = _pcmio->current_sample_rate(_audio_device);
-#endif
-	//if (sr > 0) { set_sample_rate(sr); }
-	return 0;
-}
-
-int
-ASIOBackend::set_sample_rate (float sr)
-{
-	if (sr <= 0) { return -1; }
-	// TODO check if it's in the list of valid SR
-	_samplerate = sr;
-	engine.sample_rate_change (sr);
-	return 0;
-}
-
-int
-ASIOBackend::set_buffer_size (uint32_t bs)
-{
-	if (bs <= 0 || bs >= _max_buffer_size) {
-		return -1;
-	}
-	_samples_per_period = bs;
-#if 0 // TODO
-	_pcmio->set_samples_per_period(bs);
-#endif
-	engine.buffer_size_change (bs);
-	return 0;
-}
-
-int
-ASIOBackend::set_interleaved (bool yn)
-{
-	if (!yn) { return 0; }
-	return -1;
-}
-
-int
-ASIOBackend::set_input_channels (uint32_t cc)
-{
-	_n_inputs = cc;
-	return 0;
-}
-
-int
-ASIOBackend::set_output_channels (uint32_t cc)
-{
-	_n_outputs = cc;
-	return 0;
-}
-
-int
-ASIOBackend::set_systemic_input_latency (uint32_t sl)
-{
-	_systemic_audio_input_latency = sl;
-	return 0;
-}
-
-int
-ASIOBackend::set_systemic_output_latency (uint32_t sl)
-{
-	_systemic_audio_output_latency = sl;
-	return 0;
-}
-
-/* Retrieving parameters */
-std::string
-ASIOBackend::device_name () const
-{
-	return _audio_device;
-}
-
-float
-ASIOBackend::sample_rate () const
-{
-	return _samplerate;
-}
-
-uint32_t
-ASIOBackend::buffer_size () const
-{
-	return _samples_per_period;
-}
-
-bool
-ASIOBackend::interleaved () const
-{
-	return false;
-}
-
-uint32_t
-ASIOBackend::input_channels () const
-{
-	return _n_inputs;
-}
-
-uint32_t
-ASIOBackend::output_channels () const
-{
-	return _n_outputs;
-}
-
-uint32_t
-ASIOBackend::systemic_input_latency () const
-{
-	return _systemic_audio_input_latency;
-}
-
-uint32_t
-ASIOBackend::systemic_output_latency () const
-{
-	return _systemic_audio_output_latency;
-}
-
-/* MIDI */
-
-std::vector<std::string>
-ASIOBackend::enumerate_midi_options () const
-{
-	if (_midi_options.empty()) {
-		_midi_options.push_back (_("WindowsMidi"));
-		_midi_options.push_back (_("None"));
-	}
-	return _midi_options;
-}
-
-int
-ASIOBackend::set_midi_option (const std::string& opt)
-{
-	if (opt != _("None") && opt != _("WindowsMidi")) {
-		return -1;
-	}
-	_midi_driver_option = opt;
-	return 0;
-}
-
-std::string
-ASIOBackend::midi_option () const
-{
-	return _midi_driver_option;
-}
-
-void
-ASIOBackend::launch_control_app ()
-{
-	// TODO
-}
-
-/* State Control */
-
-static void * pthread_freewheel (void *arg)
-{
-	ASIOBackend *d = static_cast<ASIOBackend *>(arg);
-	d->freewheel_thread ();
-	pthread_exit (0);
-	return 0;
-}
-
-static int process_callback_ptr (void *arg, const uint32_t n_samples, const uint64_t host_time)
-{
-	ASIOBackend *d = static_cast<ASIOBackend*> (arg);
-	return d->process_callback(n_samples, host_time);
-}
-
-int
-ASIOBackend::_start (bool for_latency_measurement)
-{
-	if ((!_active_cb || !_active_fw)  && _run) {
-		// recover from 'halted', reap threads
-		stop();
-	}
-
-	if (_active_cb || _active_fw || _run) {
-		PBD::error << _("ASIOBackend: already active.") << endmsg;
-		return -1;
-	}
-
-	if (_ports.size()) {
-		PBD::warning << _("ASIOBackend: recovering from unclean shutdown, port registry is not empty.") << endmsg;
-		_system_inputs.clear();
-		_system_outputs.clear();
-		_system_midi_in.clear();
-		_system_midi_out.clear();
-		_ports.clear();
-	}
-
-	assert(_active_cb == false);
-	assert(_active_fw == false);
-
-	_freewheel_ack = false;
-	_reinit_thread_callback = true;
-	_last_process_start = 0;
-
-#if 0 // TODO
-	_pcmio->set_error_callback (error_callback_ptr, this);
-	_pcmio->set_buffer_size_callback (buffer_size_callback_ptr, this);
-	_pcmio->set_sample_rate_callback (sample_rate_callback_ptr, this);
-
-	_pcmio->pcm_start (device1, device2, _samplerate, _samples_per_period, process_callback_ptr, this);
-
-	switch (_pcmio->state ()) {
-		case 0: /* OK */ break;
-		case -1: PBD::error << _("ASIOBackend: failed to open device.") << endmsg; break;
-		default: PBD::error << _("ASIOBackend: initialization failed.") << endmsg; break;
-	}
-	if (_pcmio->state ()) {
-		return -1;
-	}
-
-	if (_n_outputs != _pcmio->n_playback_channels ()) {
-		if (_n_outputs == 0) {
-		 _n_outputs = _pcmio->n_playback_channels ();
-		} else {
-		 _n_outputs = std::min (_n_outputs, _pcmio->n_playback_channels ());
-		}
-		PBD::info << _("ASIOBackend: adjusted output channel count to match device.") << endmsg;
-	}
-
-	if (_n_inputs != _pcmio->n_capture_channels ()) {
-		if (_n_inputs == 0) {
-		 _n_inputs = _pcmio->n_capture_channels ();
-		} else {
-		 _n_inputs = std::min (_n_inputs, _pcmio->n_capture_channels ());
-		}
-		PBD::info << _("ASIOBackend: adjusted input channel count to match device.") << endmsg;
-	}
-
-	if (_pcmio->samples_per_period() != _samples_per_period) {
-		_samples_per_period = _pcmio->samples_per_period();
-		PBD::warning << _("ASIOBackend: samples per period does not match.") << endmsg;
-	}
-
-	if (_pcmio->sample_rate() != _samplerate) {
-		_samplerate = _pcmio->sample_rate();
-		engine.sample_rate_change (_samplerate);
-		PBD::warning << _("ASIOBackend: sample rate does not match.") << endmsg;
-	}
-#endif
-
-	_measure_latency = for_latency_measurement;
-
-	_preinit = true;
-	_run = true;
-	_port_change_flag = false;
-
-#if 0 // TODO
-	if (_midi_driver_option == _("WindowsMidi")) {
-		// TODO
-		//_midiio->set_enabled(true);
-		//_midiio->set_port_changed_callback(midi_port_change, this);
-		//_midiio->start(); // triggers port discovery, callback coremidi_rediscover()
-	}
-#endif
-
-	if (register_system_audio_ports()) {
-		PBD::error << _("ASIOBackend: failed to register system ports.") << endmsg;
-		_run = false;
-		return -1;
-	}
-
-	engine.sample_rate_change (_samplerate);
-	engine.buffer_size_change (_samples_per_period);
-
-	if (engine.reestablish_ports ()) {
-		PBD::error << _("ASIOBackend: Could not re-establish ports.") << endmsg;
-		_run = false;
-		return -1;
-	}
-
-	if (pthread_create (&_freeewheel_thread, NULL, pthread_freewheel, this))
-	{
-		PBD::error << _("ASIOBackend: failed to create process thread.") << endmsg;
-#if 0 // TODO
-		delete _pcmio; _pcmio = 0;
-#endif
-		_run = false;
-		return -1;
-	}
-
-	int timeout = 5000;
-	while ((!_active_cb || !_active_fw) && --timeout > 0) { Glib::usleep (1000); }
-
-	if (timeout == 0) {
-		PBD::error << _("ASIOBackend: failed to start.") << endmsg;
-	}
-
-	if (!_active_fw) {
-		PBD::error << _("ASIOBackend: failed to start freewheeling thread.") << endmsg;
-		_run = false;
-#if 0 // TODO
-		_pcmio->pcm_stop();
-#endif
-		unregister_ports();
-		_active_cb = false;
-		_active_fw = false;
-		return -1;
-	}
-
-	if (!_active_cb) {
-		PBD::error << _("ASIOBackend: failed to start ASIO.") << endmsg;
-		stop();
-		_run = false;
-		return -1;
-	}
-
-	engine.reconnect_ports ();
-
-	// force  an initial registration_callback() & latency re-compute
-	_port_change_flag = true;
-	pre_process ();
-
-	// all systems go.
-#if 0 // TODO
-	_pcmio->set_xrun_callback (xrun_callback_ptr, this);
-#endif
-	_preinit = false;
-
-	return 0;
-}
-
-int
-ASIOBackend::stop ()
-{
-	void *status;
-	if (!_run) {
-		return 0;
-	}
-
-	_run = false;
-#if 0 // TODO
-	_pcmio->pcm_stop();
-	_midiio->set_port_changed_callback(NULL, NULL);
-	_midiio->stop();
-#endif
-	pthread_mutex_lock (&_freewheel_mutex);
-	pthread_cond_signal (&_freewheel_signal);
-	pthread_mutex_unlock (&_freewheel_mutex);
-
-	if (pthread_join (_freeewheel_thread, &status)) {
-		PBD::error << _("ASIOBackend: failed to terminate.") << endmsg;
-		return -1;
-	}
-
-	unregister_ports();
-
-	_active_cb = false;
-	_active_fw = false; // ??
-
-	return 0;
-}
-
-int
-ASIOBackend::freewheel (bool onoff)
-{
-	if (onoff == _freewheeling) {
-		return 0;
-	}
-	_freewheeling = onoff;
-	// wake up freewheeling thread
-	if (0 == pthread_mutex_trylock (&_freewheel_mutex)) {
-		pthread_cond_signal (&_freewheel_signal);
-		pthread_mutex_unlock (&_freewheel_mutex);
-	}
-	return 0;
-}
-
-float
-ASIOBackend::dsp_load () const
-{
-	return 100.f * _dsp_load;
-}
-
-size_t
-ASIOBackend::raw_buffer_size (DataType t)
-{
-	switch (t) {
-		case DataType::AUDIO:
-			return _samples_per_period * sizeof(Sample);
-		case DataType::MIDI:
-			return _max_buffer_size; // XXX not really limited
-	}
-	return 0;
-}
-
-/* Process time */
-framepos_t
-ASIOBackend::sample_time ()
-{
-	return _processed_samples;
-}
-
-framepos_t
-ASIOBackend::sample_time_at_cycle_start ()
-{
-	return _processed_samples;
-}
-
-pframes_t
-ASIOBackend::samples_since_cycle_start ()
-{
-	if (!_active_cb || !_run || _freewheeling || _freewheel) {
-		return 0;
-	}
-	if (_last_process_start == 0) {
-		return 0;
-	}
-
-#if 0 // TODO
-	const uint64_t now = AudioGetCurrentHostTime ();
-	const int64_t elapsed_time_ns = AudioConvertHostTimeToNanos(now - _last_process_start);
-	return std::max((pframes_t)0, (pframes_t)rint(1e-9 * elapsed_time_ns * _samplerate));
-#else
-	return 0;
-#endif
-}
-
-void *
-ASIOBackend::asio_process_thread (void *arg)
-{
-	ThreadData* td = reinterpret_cast<ThreadData*> (arg);
-	boost::function<void ()> f = td->f;
-	delete td;
-	f ();
-	return 0;
-}
-
-int
-ASIOBackend::create_process_thread (boost::function<void()> func)
-{
-	pthread_t thread_id;
-	pthread_attr_t attr;
-	size_t stacksize = 100000;
-
-	ThreadData* td = new ThreadData (this, func, stacksize);
-
-	if (_realtime_pthread_create (SCHED_FIFO, -21, stacksize,
-				&thread_id, asio_process_thread, td)) {
-		pthread_attr_init (&attr);
-		pthread_attr_setstacksize (&attr, stacksize);
-		if (pthread_create (&thread_id, &attr, asio_process_thread, td)) {
-			PBD::error << _("AudioEngine: cannot create process thread.") << endmsg;
-			pthread_attr_destroy (&attr);
-			return -1;
-		}
-		pthread_attr_destroy (&attr);
-	}
-
-	_threads.push_back (thread_id);
-	return 0;
-}
-
-int
-ASIOBackend::join_process_threads ()
-{
-	int rv = 0;
-
-	for (std::vector<pthread_t>::const_iterator i = _threads.begin (); i != _threads.end (); ++i)
-	{
-		void *status;
-		if (pthread_join (*i, &status)) {
-			PBD::error << _("AudioEngine: cannot terminate process thread.") << endmsg;
-			rv -= 1;
-		}
-	}
-	_threads.clear ();
-	return rv;
-}
-
-bool
-ASIOBackend::in_process_thread ()
-{
-	if (pthread_equal (_main_thread, pthread_self()) != 0) {
-		return true;
-	}
-
-	for (std::vector<pthread_t>::const_iterator i = _threads.begin (); i != _threads.end (); ++i)
-	{
-		if (pthread_equal (*i, pthread_self ()) != 0) {
-			return true;
-		}
-	}
-	return false;
-}
-
-uint32_t
-ASIOBackend::process_thread_count ()
-{
-	return _threads.size ();
-}
-
-void
-ASIOBackend::update_latencies ()
-{
-	// trigger latency callback in RT thread (locked graph)
-	port_connect_add_remove_callback();
-}
-
-/* PORTENGINE API */
-
-void*
-ASIOBackend::private_handle () const
-{
-	return NULL;
-}
-
-const std::string&
-ASIOBackend::my_name () const
-{
-	return _instance_name;
-}
-
-bool
-ASIOBackend::available () const
-{
-	return _run && _active_fw && _active_cb;
-}
-
-uint32_t
-ASIOBackend::port_name_size () const
-{
-	return 256;
-}
-
-int
-ASIOBackend::set_port_name (PortEngine::PortHandle port, const std::string& name)
-{
-	if (!valid_port (port)) {
-		PBD::error << _("ASIOBackend::set_port_name: Invalid Port(s)") << endmsg;
-		return -1;
-	}
-	return static_cast<ASIOBackendPort*>(port)->set_name (_instance_name + ":" + name);
-}
-
-std::string
-ASIOBackend::get_port_name (PortEngine::PortHandle port) const
-{
-	if (!valid_port (port)) {
-		PBD::error << _("ASIOBackend::get_port_name: Invalid Port(s)") << endmsg;
-		return std::string ();
-	}
-	return static_cast<ASIOBackendPort*>(port)->name ();
-}
-
-int
-ASIOBackend::get_port_property (PortHandle port, const std::string& key, std::string& value, std::string& type) const
-{
-	if (!valid_port (port)) {
-		PBD::error << _("ASIOBackend::get_port_name: Invalid Port(s)") << endmsg;
-		return -1;
-	}
-	if (key == "http://jackaudio.org/metadata/pretty-name") {
-		type = "";
-		value = static_cast<ASIOBackendPort*>(port)->pretty_name ();
-		if (!value.empty()) {
-			return 0;
-		}
-	}
-	return -1;
-}
-
-PortEngine::PortHandle
-ASIOBackend::get_port_by_name (const std::string& name) const
-{
-	PortHandle port = (PortHandle) find_port (name);
-	return port;
-}
-
-int
-ASIOBackend::get_ports (
-		const std::string& port_name_pattern,
-		DataType type, PortFlags flags,
-		std::vector<std::string>& port_names) const
-{
-	int rv = 0;
-	regex_t port_regex;
-	bool use_regexp = false;
-	if (port_name_pattern.size () > 0) {
-		if (!regcomp (&port_regex, port_name_pattern.c_str (), REG_EXTENDED|REG_NOSUB)) {
-			use_regexp = true;
-		}
-	}
-	for (size_t i = 0; i < _ports.size (); ++i) {
-		ASIOBackendPort* port = _ports[i];
-		if ((port->type () == type) && (port->flags () & flags)) {
-			if (!use_regexp || !regexec (&port_regex, port->name ().c_str (), 0, NULL, 0)) {
-				port_names.push_back (port->name ());
-				++rv;
-			}
-		}
-	}
-	if (use_regexp) {
-		regfree (&port_regex);
-	}
-	return rv;
-}
-
-DataType
-ASIOBackend::port_data_type (PortEngine::PortHandle port) const
-{
-	if (!valid_port (port)) {
-		return DataType::NIL;
-	}
-	return static_cast<ASIOBackendPort*>(port)->type ();
-}
-
-PortEngine::PortHandle
-ASIOBackend::register_port (
-		const std::string& name,
-		ARDOUR::DataType type,
-		ARDOUR::PortFlags flags)
-{
-	if (name.size () == 0) { return 0; }
-	if (flags & IsPhysical) { return 0; }
-	return add_port (_instance_name + ":" + name, type, flags);
-}
-
-PortEngine::PortHandle
-ASIOBackend::add_port (
-		const std::string& name,
-		ARDOUR::DataType type,
-		ARDOUR::PortFlags flags)
-{
-	assert(name.size ());
-	if (find_port (name)) {
-		PBD::error << _("ASIOBackend::register_port: Port already exists:")
-				<< " (" << name << ")" << endmsg;
-		return 0;
-	}
-	ASIOBackendPort* port = NULL;
-	switch (type) {
-		case DataType::AUDIO:
-			port = new ASIOPort (*this, name, flags);
-			break;
-		case DataType::MIDI:
-			port = new WindowsMidiPort (*this, name, flags);
-			break;
-		default:
-			PBD::error << _("ASIOBackend::register_port: Invalid Data Type.") << endmsg;
-			return 0;
-	}
-
-	_ports.push_back (port);
-
-	return port;
-}
-
-void
-ASIOBackend::unregister_port (PortEngine::PortHandle port_handle)
-{
-	if (!_run) {
-		return;
-	}
-	ASIOBackendPort* port = static_cast<ASIOBackendPort*>(port_handle);
-	std::vector<ASIOBackendPort*>::iterator i = std::find (_ports.begin (), _ports.end (), static_cast<ASIOBackendPort*>(port_handle));
-	if (i == _ports.end ()) {
-		PBD::error << _("ASIOBackend::unregister_port: Failed to find port") << endmsg;
-		return;
-	}
-	disconnect_all(port_handle);
-	_ports.erase (i);
-	delete port;
-}
-
-int
-ASIOBackend::register_system_audio_ports()
-{
-	LatencyRange lr;
-
-	const uint32_t a_ins = _n_inputs;
-	const uint32_t a_out = _n_outputs;
-
-	const uint32_t asio_reported_input_latency =  0; // TODO _pcmio->get_latency(_audio_device, true);
-	const uint32_t asio_reported_output_latency = 0; // TODO _pcmio->get_latency(_audio_device, false);
-
-	/* audio ports */
-	lr.min = lr.max = asio_reported_input_latency + (_measure_latency ? 0 : _systemic_audio_input_latency);
-	for (uint32_t i = 0; i < a_ins; ++i) {
-		char tmp[64];
-		snprintf(tmp, sizeof(tmp), "system:capture_%d", i+1);
-		PortHandle p = add_port(std::string(tmp), DataType::AUDIO, static_cast<PortFlags>(IsOutput | IsPhysical | IsTerminal));
-		if (!p) return -1;
-		set_latency_range (p, false, lr);
-		ASIOBackendPort *cp = static_cast<ASIOBackendPort*>(p);
-		//cp->set_pretty_name (_pcmio->cached_port_name(i, true)); // TODO
-		_system_inputs.push_back(cp);
-	}
-
-	lr.min = lr.max = asio_reported_output_latency + (_measure_latency ? 0 : _systemic_audio_output_latency);
-	for (uint32_t i = 0; i < a_out; ++i) {
-		char tmp[64];
-		snprintf(tmp, sizeof(tmp), "system:playback_%d", i+1);
-		PortHandle p = add_port(std::string(tmp), DataType::AUDIO, static_cast<PortFlags>(IsInput | IsPhysical | IsTerminal));
-		if (!p) return -1;
-		set_latency_range (p, true, lr);
-		ASIOBackendPort *cp = static_cast<ASIOBackendPort*>(p);
-		//cp->set_pretty_name (_pcmio->cached_port_name(i, false)); // TODO
-		_system_outputs.push_back(cp);
-	}
-	return 0;
-}
-
-void
-ASIOBackend::unregister_ports (bool system_only)
-{
-	size_t i = 0;
-	_system_inputs.clear();
-	_system_outputs.clear();
-	_system_midi_in.clear();
-	_system_midi_out.clear();
-	while (i <  _ports.size ()) {
-		ASIOBackendPort* port = _ports[i];
-		if (! system_only || (port->is_physical () && port->is_terminal ())) {
-			port->disconnect_all ();
-			delete port;
-			_ports.erase (_ports.begin() + i);
-		} else {
-			++i;
-		}
-	}
-}
-
-int
-ASIOBackend::connect (const std::string& src, const std::string& dst)
-{
-	ASIOBackendPort* src_port = find_port (src);
-	ASIOBackendPort* dst_port = find_port (dst);
-
-	if (!src_port) {
-		PBD::error << _("ASIOBackend::connect: Invalid Source port:")
-				<< " (" << src <<")" << endmsg;
-		return -1;
-	}
-	if (!dst_port) {
-		PBD::error << _("ASIOBackend::connect: Invalid Destination port:")
-			<< " (" << dst <<")" << endmsg;
-		return -1;
-	}
-	return src_port->connect (dst_port);
-}
-
-int
-ASIOBackend::disconnect (const std::string& src, const std::string& dst)
-{
-	ASIOBackendPort* src_port = find_port (src);
-	ASIOBackendPort* dst_port = find_port (dst);
-
-	if (!src_port || !dst_port) {
-		PBD::error << _("ASIOBackend::disconnect: Invalid Port(s)") << endmsg;
-		return -1;
-	}
-	return src_port->disconnect (dst_port);
-}
-
-int
-ASIOBackend::connect (PortEngine::PortHandle src, const std::string& dst)
-{
-	ASIOBackendPort* dst_port = find_port (dst);
-	if (!valid_port (src)) {
-		PBD::error << _("ASIOBackend::connect: Invalid Source Port Handle") << endmsg;
-		return -1;
-	}
-	if (!dst_port) {
-		PBD::error << _("ASIOBackend::connect: Invalid Destination Port")
-			<< " (" << dst << ")" << endmsg;
-		return -1;
-	}
-	return static_cast<ASIOBackendPort*>(src)->connect (dst_port);
-}
-
-int
-ASIOBackend::disconnect (PortEngine::PortHandle src, const std::string& dst)
-{
-	ASIOBackendPort* dst_port = find_port (dst);
-	if (!valid_port (src) || !dst_port) {
-		PBD::error << _("ASIOBackend::disconnect: Invalid Port(s)") << endmsg;
-		return -1;
-	}
-	return static_cast<ASIOBackendPort*>(src)->disconnect (dst_port);
-}
-
-int
-ASIOBackend::disconnect_all (PortEngine::PortHandle port)
-{
-	if (!valid_port (port)) {
-		PBD::error << _("ASIOBackend::disconnect_all: Invalid Port") << endmsg;
-		return -1;
-	}
-	static_cast<ASIOBackendPort*>(port)->disconnect_all ();
-	return 0;
-}
-
-bool
-ASIOBackend::connected (PortEngine::PortHandle port, bool /* process_callback_safe*/)
-{
-	if (!valid_port (port)) {
-		PBD::error << _("ASIOBackend::disconnect_all: Invalid Port") << endmsg;
-		return false;
-	}
-	return static_cast<ASIOBackendPort*>(port)->is_connected ();
-}
-
-bool
-ASIOBackend::connected_to (PortEngine::PortHandle src, const std::string& dst, bool /*process_callback_safe*/)
-{
-	ASIOBackendPort* dst_port = find_port (dst);
-	if (!valid_port (src) || !dst_port) {
-		PBD::error << _("ASIOBackend::connected_to: Invalid Port") << endmsg;
-		return false;
-	}
-	return static_cast<ASIOBackendPort*>(src)->is_connected (dst_port);
-}
-
-bool
-ASIOBackend::physically_connected (PortEngine::PortHandle port, bool /*process_callback_safe*/)
-{
-	if (!valid_port (port)) {
-		PBD::error << _("ASIOBackend::physically_connected: Invalid Port") << endmsg;
-		return false;
-	}
-	return static_cast<ASIOBackendPort*>(port)->is_physically_connected ();
-}
-
-int
-ASIOBackend::get_connections (PortEngine::PortHandle port, std::vector<std::string>& names, bool /*process_callback_safe*/)
-{
-	if (!valid_port (port)) {
-		PBD::error << _("ASIOBackend::get_connections: Invalid Port") << endmsg;
-		return -1;
-	}
-
-	assert (0 == names.size ());
-
-	const std::vector<ASIOBackendPort*>& connected_ports = static_cast<ASIOBackendPort*>(port)->get_connections ();
-
-	for (std::vector<ASIOBackendPort*>::const_iterator i = connected_ports.begin (); i != connected_ports.end (); ++i) {
-		names.push_back ((*i)->name ());
-	}
-
-	return (int)names.size ();
-}
-
-/* MIDI */
-int
-ASIOBackend::midi_event_get (
-		pframes_t& timestamp,
-		size_t& size, uint8_t** buf, void* port_buffer,
-		uint32_t event_index)
-{
-	if (!buf || !port_buffer) return -1;
-	WindowsMidiBuffer& source = * static_cast<WindowsMidiBuffer*>(port_buffer);
-	if (event_index >= source.size ()) {
-		return -1;
-	}
-	WindowsMidiEvent * const event = source[event_index].get ();
-
-	timestamp = event->timestamp ();
-	size = event->size ();
-	*buf = event->data ();
-	return 0;
-}
-
-int
-ASIOBackend::midi_event_put (
-		void* port_buffer,
-		pframes_t timestamp,
-		const uint8_t* buffer, size_t size)
-{
-	if (!buffer || !port_buffer) return -1;
-	WindowsMidiBuffer& dst = * static_cast<WindowsMidiBuffer*>(port_buffer);
-	if (dst.size () && (pframes_t)dst.back ()->timestamp () > timestamp) {
-#ifndef NDEBUG
-		// nevermind, ::get_buffer() sorts events
-		fprintf (stderr, "WindowsMidiBuffer: unordered event: %d > %d\n",
-				(pframes_t)dst.back ()->timestamp (), timestamp);
-#endif
-	}
-	dst.push_back (boost::shared_ptr<WindowsMidiEvent>(new WindowsMidiEvent (timestamp, buffer, size)));
-	return 0;
-}
-
-uint32_t
-ASIOBackend::get_midi_event_count (void* port_buffer)
-{
-	if (!port_buffer) return 0;
-	return static_cast<WindowsMidiBuffer*>(port_buffer)->size ();
-}
-
-void
-ASIOBackend::midi_clear (void* port_buffer)
-{
-	if (!port_buffer) return;
-	WindowsMidiBuffer * buf = static_cast<WindowsMidiBuffer*>(port_buffer);
-	assert (buf);
-	buf->clear ();
-}
-
-/* Monitoring */
-
-bool
-ASIOBackend::can_monitor_input () const
-{
-	return false;
-}
-
-int
-ASIOBackend::request_input_monitoring (PortEngine::PortHandle, bool)
-{
-	return -1;
-}
-
-int
-ASIOBackend::ensure_input_monitoring (PortEngine::PortHandle, bool)
-{
-	return -1;
-}
-
-bool
-ASIOBackend::monitoring_input (PortEngine::PortHandle)
-{
-	return false;
-}
-
-/* Latency management */
-
-void
-ASIOBackend::set_latency_range (PortEngine::PortHandle port, bool for_playback, LatencyRange latency_range)
-{
-	if (!valid_port (port)) {
-		PBD::error << _("ASIOBackendPort::set_latency_range (): invalid port.") << endmsg;
-	}
-	static_cast<ASIOBackendPort*>(port)->set_latency_range (latency_range, for_playback);
-}
-
-LatencyRange
-ASIOBackend::get_latency_range (PortEngine::PortHandle port, bool for_playback)
-{
-	LatencyRange r;
-	if (!valid_port (port)) {
-		PBD::error << _("ASIOBackendPort::get_latency_range (): invalid port.") << endmsg;
-		r.min = 0;
-		r.max = 0;
-		return r;
-	}
-	ASIOBackendPort* p = static_cast<ASIOBackendPort*>(port);
-	assert(p);
-
-	r = p->latency_range (for_playback);
-	if (p->is_physical() && p->is_terminal() && p->type() == DataType::AUDIO) {
-		if (p->is_input() && for_playback) {
-			r.min += _samples_per_period;
-			r.max += _samples_per_period;
-		}
-		if (p->is_output() && !for_playback) {
-			r.min += _samples_per_period;
-			r.max += _samples_per_period;
-		}
-	}
-	return r;
-}
-
-/* Discovering physical ports */
-
-bool
-ASIOBackend::port_is_physical (PortEngine::PortHandle port) const
-{
-	if (!valid_port (port)) {
-		PBD::error << _("ASIOBackendPort::port_is_physical (): invalid port.") << endmsg;
-		return false;
-	}
-	return static_cast<ASIOBackendPort*>(port)->is_physical ();
-}
-
-void
-ASIOBackend::get_physical_outputs (DataType type, std::vector<std::string>& port_names)
-{
-	for (size_t i = 0; i < _ports.size (); ++i) {
-		ASIOBackendPort* port = _ports[i];
-		if ((port->type () == type) && port->is_input () && port->is_physical ()) {
-			port_names.push_back (port->name ());
-		}
-	}
-}
-
-void
-ASIOBackend::get_physical_inputs (DataType type, std::vector<std::string>& port_names)
-{
-	for (size_t i = 0; i < _ports.size (); ++i) {
-		ASIOBackendPort* port = _ports[i];
-		if ((port->type () == type) && port->is_output () && port->is_physical ()) {
-			port_names.push_back (port->name ());
-		}
-	}
-}
-
-ChanCount
-ASIOBackend::n_physical_outputs () const
-{
-	int n_midi = 0;
-	int n_audio = 0;
-	for (size_t i = 0; i < _ports.size (); ++i) {
-		ASIOBackendPort* port = _ports[i];
-		if (port->is_output () && port->is_physical ()) {
-			switch (port->type ()) {
-				case DataType::AUDIO: ++n_audio; break;
-				case DataType::MIDI: ++n_midi; break;
-				default: break;
-			}
-		}
-	}
-	ChanCount cc;
-	cc.set (DataType::AUDIO, n_audio);
-	cc.set (DataType::MIDI, n_midi);
-	return cc;
-}
-
-ChanCount
-ASIOBackend::n_physical_inputs () const
-{
-	int n_midi = 0;
-	int n_audio = 0;
-	for (size_t i = 0; i < _ports.size (); ++i) {
-		ASIOBackendPort* port = _ports[i];
-		if (port->is_input () && port->is_physical ()) {
-			switch (port->type ()) {
-				case DataType::AUDIO: ++n_audio; break;
-				case DataType::MIDI: ++n_midi; break;
-				default: break;
-			}
-		}
-	}
-	ChanCount cc;
-	cc.set (DataType::AUDIO, n_audio);
-	cc.set (DataType::MIDI, n_midi);
-	return cc;
-}
-
-/* Getting access to the data buffer for a port */
-
-void*
-ASIOBackend::get_buffer (PortEngine::PortHandle port, pframes_t nframes)
-{
-	if (!port || !valid_port (port)) return NULL;
-	return static_cast<ASIOBackendPort*>(port)->get_buffer (nframes);
-}
-
-void
-ASIOBackend::pre_process ()
-{
-	bool connections_changed = false;
-	bool ports_changed = false;
-	if (!pthread_mutex_trylock (&_port_callback_mutex)) {
-		if (_port_change_flag) {
-			ports_changed = true;
-			_port_change_flag = false;
-		}
-		if (!_port_connection_queue.empty ()) {
-			connections_changed = true;
-		}
-		while (!_port_connection_queue.empty ()) {
-			PortConnectData *c = _port_connection_queue.back ();
-			manager.connect_callback (c->a, c->b, c->c);
-			_port_connection_queue.pop_back ();
-			delete c;
-		}
-		pthread_mutex_unlock (&_port_callback_mutex);
-	}
-	if (ports_changed) {
-		manager.registration_callback();
-	}
-	if (connections_changed) {
-		manager.graph_order_callback();
-	}
-	if (connections_changed || ports_changed) {
-		engine.latency_callback(false);
-		engine.latency_callback(true);
-	}
-}
-
-void *
-ASIOBackend::freewheel_thread ()
-{
-	_active_fw = true;
-	bool first_run = false;
-	/* Freewheeling - use for export.   The first call to
-	 * engine.process_callback() after engine.freewheel_callback will
-	 * if the first export cycle.
-	 * For reliable precise export timing, the calls need to be in sync.
-	 *
-	 * Furthermore we need to make sure the registered process thread
-	 * is correct.
-	 *
-	 * _freewheeling = GUI thread state as set by ::freewheel()
-	 * _freewheel = in sync here (export thread)
-	 */
-	pthread_mutex_lock (&_freewheel_mutex);
-	while (_run) {
-		// check if we should run,
-		if (_freewheeling != _freewheel) {
-			if (!_freewheeling) {
-				// prepare leaving freewheeling mode
-				_freewheel = false; // first mark as disabled
-				_reinit_thread_callback = true; // hand over _main_thread
-				_freewheel_ack = false; // prepare next handshake
-#if 0 // TODO disable hadrware MIDI threads during freewheeling
-				_midiio->set_enabled(true);
-#endif
-			} else {
-				first_run = true;
-				_freewheel = true;
-			}
-		}
-
-		if (!_freewheel || !_freewheel_ack) {
-			// wait for a change, we use a timed wait to
-			// terminate early in case some error sets _run = 0
-			struct timeval tv;
-			struct timespec ts;
-			gettimeofday (&tv, NULL);
-			ts.tv_sec = tv.tv_sec + 3;
-			ts.tv_nsec = 0;
-			pthread_cond_timedwait (&_freewheel_signal, &_freewheel_mutex, &ts);
-			continue;
-		}
-
-		if (first_run) {
-			// tell the engine we're ready to GO.
-			engine.freewheel_callback (_freewheeling);
-			first_run = false;
-			_main_thread = pthread_self();
-			AudioEngine::thread_init_callback (this);
-#if 0 // TODO
-			_midiio->set_enabled(false);
-#endif
-		}
-
-		// process port updates first in every cycle.
-		pre_process();
-
-		// prevent device changes
-		pthread_mutex_lock (&_process_callback_mutex);
-
-		/* Freewheelin' */
-
-		// clear input buffers
-		for (std::vector<ASIOBackendPort*>::const_iterator it = _system_inputs.begin (); it != _system_inputs.end (); ++it) {
-			memset ((*it)->get_buffer (_samples_per_period), 0, _samples_per_period * sizeof (Sample));
-		}
-		for (std::vector<ASIOBackendPort*>::const_iterator it = _system_midi_in.begin (); it != _system_midi_in.end (); ++it) {
-			static_cast<WindowsMidiBuffer*>((*it)->get_buffer(0))->clear ();
-		}
-
-		_last_process_start = 0;
-		if (engine.process_callback (_samples_per_period)) {
-			pthread_mutex_unlock (&_process_callback_mutex);
-			break;
-		}
-
-		pthread_mutex_unlock (&_process_callback_mutex);
-		_dsp_load = 1.0;
-		Glib::usleep (100); // don't hog cpu
-	}
-
-	pthread_mutex_unlock (&_freewheel_mutex);
-
-	_active_fw = false;
-
-	if (_run) {
-		// engine.process_callback() returner error
-		engine.halted_callback("ASIO Freehweeling aborted.");
-	}
-	return 0;
-}
-
-int
-ASIOBackend::process_callback (const uint32_t n_samples, const uint64_t host_time)
-{
-	uint32_t i = 0;
-	uint64_t clock1, clock2;
-
-	_active_cb = true;
-
-	if (_run && _freewheel && !_freewheel_ack) {
-		// acknowledge freewheeling; hand-over thread ID
-		pthread_mutex_lock (&_freewheel_mutex);
-		if (_freewheel) _freewheel_ack = true;
-		pthread_cond_signal (&_freewheel_signal);
-		pthread_mutex_unlock (&_freewheel_mutex);
-	}
-
-	if (!_run || _freewheel || _preinit) {
-		// NB if we return 1, the output is
-		// zeroed by the asio callback
-		return 1;
-	}
-
-	if (_reinit_thread_callback || _main_thread != pthread_self()) {
-		_reinit_thread_callback = false;
-		_main_thread = pthread_self();
-		AudioEngine::thread_init_callback (this);
-	}
-
-	if (pthread_mutex_trylock (&_process_callback_mutex)) {
-		// block while devices are added/removed
-#ifndef NDEBUG
-		printf("Xrun due to device change\n");
-#endif
-		engine.Xrun();
-		return 1;
-	}
-	/* port-connection change */
-	pre_process();
-
-	// cycle-length in usec
-	const double nominal_time = 1e6 * n_samples / _samplerate;
-
-	clock1 = g_get_monotonic_time();
-
-	/* get midi */
-	i=0;
-	for (std::vector<ASIOBackendPort*>::const_iterator it = _system_midi_in.begin (); it != _system_midi_in.end (); ++it, ++i) {
-		WindowsMidiBuffer* mbuf = static_cast<WindowsMidiBuffer*>((*it)->get_buffer(0));
-		mbuf->clear();
-#if 0 // TODO
-		uint64_t time_ns;
-		uint8_t data[128];
-		size_t size = sizeof(data);
-		while (_midiio->recv_event (i, nominal_time, time_ns, data, size)) {
-			pframes_t time = floor((float) time_ns * _samplerate * 1e-9);
-			assert (time < n_samples);
-			midi_event_put((void*)mbuf, time, data, size);
-			size = sizeof(data);
-		}
-#endif
-	}
-
-	/* get audio */
-	i = 0;
-	for (std::vector<ASIOBackendPort*>::const_iterator it = _system_inputs.begin (); it != _system_inputs.end (); ++it, ++i) {
-#if 0 // TODO
-		_pcmio->get_capture_channel (i, (float*)((*it)->get_buffer(n_samples)), n_samples);
-#else
-		memset ((*it)->get_buffer (n_samples), 0, n_samples * sizeof (Sample));
-#endif
-	}
-
-	/* clear output buffers */
-	for (std::vector<ASIOBackendPort*>::const_iterator it = _system_outputs.begin (); it != _system_outputs.end (); ++it) {
-		memset ((*it)->get_buffer (n_samples), 0, n_samples * sizeof (Sample));
-	}
-
-#if 0 // TODO; sync Audio + midi
-	_midiio->start_cycle();
-#endif
-	_last_process_start = host_time;
-
-	if (engine.process_callback (n_samples)) {
-		fprintf(stderr, "ENGINE PROCESS ERROR\n");
-		_active_cb = false;
-		pthread_mutex_unlock (&_process_callback_mutex);
-		return -1;
-	}
-
-	/* mixdown midi */
-	for (std::vector<ASIOBackendPort*>::const_iterator it = _system_midi_out.begin (); it != _system_midi_out.end (); ++it) {
-		static_cast<WindowsMidiPort*>(*it)->get_buffer(0);
-	}
-
-	/* queue outgoing midi */
-#if 0 // TODO
-	i = 0;
-	for (std::vector<ASIOBackendPort*>::const_iterator it = _system_midi_out.begin (); it != _system_midi_out.end (); ++it, ++i) {
-#if 0 // something's still b0rked with WindowsMidiIo::send_events()
-		const WindowsMidiBuffer *src = static_cast<const WindowsMidiPort*>(*it)->const_buffer();
-		_midiio->send_events (i, nominal_time, (void*)src);
-#else // works..
-		const WindowsMidiBuffer *src = static_cast<const WindowsMidiPort*>(*it)->const_buffer();
-		for (WindowsMidiBuffer::const_iterator mit = src->begin (); mit != src->end (); ++mit) {
-			_midiio->send_event (i, (*mit)->timestamp() / nominal_time, (*mit)->data(), (*mit)->size());
-		}
-#endif
-	}
-#endif
-
-	/* write back audio */
-#if 0 // TODO
-	i = 0;
-	for (std::vector<ASIOBackendPort*>::const_iterator it = _system_outputs.begin (); it != _system_outputs.end (); ++it, ++i) {
-		_pcmio->set_playback_channel (i, (float const*)(*it)->get_buffer (n_samples), n_samples);
-	}
-#endif
-
-	_processed_samples += n_samples;
-
-	/* calc DSP load. */
-	clock2 = g_get_monotonic_time();
-	const int64_t elapsed_time = clock2 - clock1;
-	_dsp_load = elapsed_time / nominal_time;
-
-	pthread_mutex_unlock (&_process_callback_mutex);
-	return 0;
-}
-
-void
-ASIOBackend::error_callback ()
-{
-#if 0 // TODO
-	_pcmio->set_error_callback (NULL, NULL);
-	_pcmio->set_sample_rate_callback (NULL, NULL);
-	_pcmio->set_xrun_callback (NULL, NULL);
-	_midiio->set_port_changed_callback(NULL, NULL);
-#endif
-	engine.halted_callback("ASIO Process aborted.");
-	_active_cb = false;
-}
-
-void
-ASIOBackend::xrun_callback ()
-{
-	engine.Xrun ();
-}
-
-void
-ASIOBackend::buffer_size_callback ()
-{
-#if 0 // TODO
-	uint32_t bs = _pcmio->samples_per_period();
-	if (bs == _samples_per_period) {
-		return;
-	}
-	_samples_per_period = bs;
-	engine.buffer_size_change (_samples_per_period);
-#endif
-}
-
-void
-ASIOBackend::sample_rate_callback ()
-{
-#if 0  // TODO
-	_pcmio->set_error_callback (NULL, NULL);
-	_pcmio->set_sample_rate_callback (NULL, NULL);
-	_pcmio->set_xrun_callback (NULL, NULL);
-	_midiio->set_port_changed_callback(NULL, NULL);
-	engine.halted_callback("Sample Rate Changed.");
-	stop();
-#endif
-}
-
-void
-ASIOBackend::hw_changed_callback ()
-{
-#if 0 // TODO
-	_reinit_thread_callback = true;
-	engine.request_device_list_update();
-#endif
-}
-
-/******************************************************************************/
-
-static boost::shared_ptr<ASIOBackend> _instance;
-
-static boost::shared_ptr<AudioBackend> backend_factory (AudioEngine& e);
-static int instantiate (const std::string& arg1, const std::string& /* arg2 */);
-static int deinstantiate ();
-static bool already_configured ();
-static bool available ();
-
-static ARDOUR::AudioBackendInfo _descriptor = {
-	"ASIO",
-	instantiate,
-	deinstantiate,
-	backend_factory,
-	already_configured,
-	available
-};
-
-static boost::shared_ptr<AudioBackend>
-backend_factory (AudioEngine& e)
-{
-	if (!_instance) {
-		_instance.reset (new ASIOBackend (e, _descriptor));
-	}
-	return _instance;
-}
-
-static int
-instantiate (const std::string& arg1, const std::string& /* arg2 */)
-{
-	s_instance_name = arg1;
-	return 0;
-}
-
-static int
-deinstantiate ()
-{
-	_instance.reset ();
-	return 0;
-}
-
-static bool
-already_configured ()
-{
-	return false;
-}
-
-static bool
-available ()
-{
-	return true;
-}
-
-extern "C" ARDOURBACKEND_API ARDOUR::AudioBackendInfo* descriptor ()
-{
-	return &_descriptor;
-}
-
-
-/******************************************************************************/
-ASIOBackendPort::ASIOBackendPort (ASIOBackend &b, const std::string& name, PortFlags flags)
-	: _osx_backend (b)
-	, _name  (name)
-	, _flags (flags)
-{
-	_capture_latency_range.min = 0;
-	_capture_latency_range.max = 0;
-	_playback_latency_range.min = 0;
-	_playback_latency_range.max = 0;
-}
-
-ASIOBackendPort::~ASIOBackendPort () {
-	disconnect_all ();
-}
-
-
-int ASIOBackendPort::connect (ASIOBackendPort *port)
-{
-	if (!port) {
-		PBD::error << _("ASIOBackendPort::connect (): invalid (null) port") << endmsg;
-		return -1;
-	}
-
-	if (type () != port->type ()) {
-		PBD::error << _("ASIOBackendPort::connect (): wrong port-type") << endmsg;
-		return -1;
-	}
-
-	if (is_output () && port->is_output ()) {
-		PBD::error << _("ASIOBackendPort::connect (): cannot inter-connect output ports.") << endmsg;
-		return -1;
-	}
-
-	if (is_input () && port->is_input ()) {
-		PBD::error << _("ASIOBackendPort::connect (): cannot inter-connect input ports.") << endmsg;
-		return -1;
-	}
-
-	if (this == port) {
-		PBD::error << _("ASIOBackendPort::connect (): cannot self-connect ports.") << endmsg;
-		return -1;
-	}
-
-	if (is_connected (port)) {
-#if 0 // don't bother to warn about this for now. just ignore it
-		PBD::error << _("ASIOBackendPort::connect (): ports are already connected:")
-			<< " (" << name () << ") -> (" << port->name () << ")"
-			<< endmsg;
-#endif
-		return -1;
-	}
-
-	_connect (port, true);
-	return 0;
-}
-
-
-void ASIOBackendPort::_connect (ASIOBackendPort *port, bool callback)
-{
-	_connections.push_back (port);
-	if (callback) {
-		port->_connect (this, false);
-		_osx_backend.port_connect_callback (name(),  port->name(), true);
-	}
-}
-
-int ASIOBackendPort::disconnect (ASIOBackendPort *port)
-{
-	if (!port) {
-		PBD::error << _("ASIOBackendPort::disconnect (): invalid (null) port") << endmsg;
-		return -1;
-	}
-
-	if (!is_connected (port)) {
-		PBD::error << _("ASIOBackendPort::disconnect (): ports are not connected:")
-			<< " (" << name () << ") -> (" << port->name () << ")"
-			<< endmsg;
-		return -1;
-	}
-	_disconnect (port, true);
-	return 0;
-}
-
-void ASIOBackendPort::_disconnect (ASIOBackendPort *port, bool callback)
-{
-	std::vector<ASIOBackendPort*>::iterator it = std::find (_connections.begin (), _connections.end (), port);
-
-	assert (it != _connections.end ());
-
-	_connections.erase (it);
-
-	if (callback) {
-		port->_disconnect (this, false);
-		_osx_backend.port_connect_callback (name(),  port->name(), false);
-	}
-}
-
-
-void ASIOBackendPort::disconnect_all ()
-{
-	while (!_connections.empty ()) {
-		_connections.back ()->_disconnect (this, false);
-		_osx_backend.port_connect_callback (name(),  _connections.back ()->name(), false);
-		_connections.pop_back ();
-	}
-}
-
-bool
-ASIOBackendPort::is_connected (const ASIOBackendPort *port) const
-{
-	return std::find (_connections.begin (), _connections.end (), port) != _connections.end ();
-}
-
-bool ASIOBackendPort::is_physically_connected () const
-{
-	for (std::vector<ASIOBackendPort*>::const_iterator it = _connections.begin (); it != _connections.end (); ++it) {
-		if ((*it)->is_physical ()) {
-			return true;
-		}
-	}
-	return false;
-}
-
-/******************************************************************************/
-
-ASIOPort::ASIOPort (ASIOBackend &b, const std::string& name, PortFlags flags)
-	: ASIOBackendPort (b, name, flags)
-{
-	memset (_buffer, 0, sizeof (_buffer));
-	mlock(_buffer, sizeof (_buffer));
-}
-
-ASIOPort::~ASIOPort () { }
-
-void* ASIOPort::get_buffer (pframes_t n_samples)
-{
-	if (is_input ()) {
-		std::vector<ASIOBackendPort*>::const_iterator it = get_connections ().begin ();
-		if (it == get_connections ().end ()) {
-			memset (_buffer, 0, n_samples * sizeof (Sample));
-		} else {
-			ASIOPort const * source = static_cast<const ASIOPort*>(*it);
-			assert (source && source->is_output ());
-			memcpy (_buffer, source->const_buffer (), n_samples * sizeof (Sample));
-			while (++it != get_connections ().end ()) {
-				source = static_cast<const ASIOPort*>(*it);
-				assert (source && source->is_output ());
-				Sample* dst = buffer ();
-				const Sample* src = source->const_buffer ();
-				for (uint32_t s = 0; s < n_samples; ++s, ++dst, ++src) {
-					*dst += *src;
-				}
-			}
-		}
-	}
-	return _buffer;
-}
-
-
-WindowsMidiPort::WindowsMidiPort (ASIOBackend &b, const std::string& name, PortFlags flags)
-	: ASIOBackendPort (b, name, flags)
-	, _n_periods (1)
-	, _bufperiod (0)
-{
-	_buffer[0].clear ();
-	_buffer[1].clear ();
-}
-
-WindowsMidiPort::~WindowsMidiPort () { }
-
-struct MidiEventSorter {
-	bool operator() (const boost::shared_ptr<WindowsMidiEvent>& a, const boost::shared_ptr<WindowsMidiEvent>& b) {
-		return *a < *b;
-	}
-};
-
-void* WindowsMidiPort::get_buffer (pframes_t /* nframes */)
-{
-	if (is_input ()) {
-		(_buffer[_bufperiod]).clear ();
-		for (std::vector<ASIOBackendPort*>::const_iterator i = get_connections ().begin ();
-				i != get_connections ().end ();
-				++i) {
-			const WindowsMidiBuffer * src = static_cast<const WindowsMidiPort*>(*i)->const_buffer ();
-			for (WindowsMidiBuffer::const_iterator it = src->begin (); it != src->end (); ++it) {
-				(_buffer[_bufperiod]).push_back (boost::shared_ptr<WindowsMidiEvent>(new WindowsMidiEvent (**it)));
-			}
-		}
-		std::sort ((_buffer[_bufperiod]).begin (), (_buffer[_bufperiod]).end (), MidiEventSorter());
-	}
-	return &(_buffer[_bufperiod]);
-}
-
-WindowsMidiEvent::WindowsMidiEvent (const pframes_t timestamp, const uint8_t* data, size_t size)
-	: _size (size)
-	, _timestamp (timestamp)
-	, _data (0)
-{
-	if (size > 0) {
-		_data = (uint8_t*) malloc (size);
-		memcpy (_data, data, size);
-	}
-}
-
-WindowsMidiEvent::WindowsMidiEvent (const WindowsMidiEvent& other)
-	: _size (other.size ())
-	, _timestamp (other.timestamp ())
-	, _data (0)
-{
-	if (other.size () && other.const_data ()) {
-		_data = (uint8_t*) malloc (other.size ());
-		memcpy (_data, other.const_data (), other.size ());
-	}
-};
-
-WindowsMidiEvent::~WindowsMidiEvent () {
-	free (_data);
-};
diff --git a/libs/backends/asio/asio_backend.h b/libs/backends/asio/asio_backend.h
deleted file mode 100644
index bef1589..0000000
--- a/libs/backends/asio/asio_backend.h
+++ /dev/null
@@ -1,434 +0,0 @@
-/*
- * Copyright (C) 2014 Robin Gareus <robin at gareus.org>
- * Copyright (C) 2013 Paul Davis
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#ifndef __libbackend_asio_backend_h__
-#define __libbackend_asio_backend_h__
-
-#include <string>
-#include <vector>
-#include <map>
-#include <set>
-
-#include <stdint.h>
-#include <pthread.h>
-
-#include <boost/shared_ptr.hpp>
-
-#include "ardour/audio_backend.h"
-#include "ardour/types.h"
-
-namespace ARDOUR {
-
-class ASIOBackend;
-
-class WindowsMidiEvent {
-	public:
-		WindowsMidiEvent (const pframes_t timestamp, const uint8_t* data, size_t size);
-		WindowsMidiEvent (const WindowsMidiEvent& other);
-		~WindowsMidiEvent ();
-		size_t size () const { return _size; };
-		pframes_t timestamp () const { return _timestamp; };
-		const unsigned char* const_data () const { return _data; };
-		unsigned char* data () { return _data; };
-		bool operator< (const WindowsMidiEvent &other) const { return timestamp () < other.timestamp (); };
-	private:
-		size_t _size;
-		pframes_t _timestamp;
-		uint8_t *_data;
-};
-
-typedef std::vector<boost::shared_ptr<WindowsMidiEvent> > WindowsMidiBuffer;
-
-class ASIOBackendPort {
-	protected:
-		ASIOBackendPort (ASIOBackend &b, const std::string&, PortFlags);
-	public:
-		virtual ~ASIOBackendPort ();
-
-		const std::string& name () const { return _name; }
-		const std::string& pretty_name () const { return _pretty_name; }
-		PortFlags flags () const { return _flags; }
-
-		int set_name (const std::string &name) { _name = name; return 0; }
-		int set_pretty_name (const std::string &name) { _pretty_name = name; return 0; }
-
-		virtual DataType type () const = 0;
-
-		bool is_input ()     const { return flags () & IsInput; }
-		bool is_output ()    const { return flags () & IsOutput; }
-		bool is_physical ()  const { return flags () & IsPhysical; }
-		bool is_terminal ()  const { return flags () & IsTerminal; }
-		bool is_connected () const { return _connections.size () != 0; }
-		bool is_connected (const ASIOBackendPort *port) const;
-		bool is_physically_connected () const;
-
-		const std::vector<ASIOBackendPort *>& get_connections () const { return _connections; }
-
-		int connect (ASIOBackendPort *port);
-		int disconnect (ASIOBackendPort *port);
-		void disconnect_all ();
-
-		virtual void* get_buffer (pframes_t nframes) = 0;
-
-		const LatencyRange latency_range (bool for_playback) const
-		{
-			return for_playback ? _playback_latency_range : _capture_latency_range;
-		}
-
-		void set_latency_range (const LatencyRange &latency_range, bool for_playback)
-		{
-			if (for_playback)
-			{
-				_playback_latency_range = latency_range;
-			}
-			else
-			{
-				_capture_latency_range = latency_range;
-			}
-		}
-
-	private:
-		ASIOBackend &_osx_backend;
-		std::string _name;
-		std::string _pretty_name;
-		const PortFlags _flags;
-		LatencyRange _capture_latency_range;
-		LatencyRange _playback_latency_range;
-		std::vector<ASIOBackendPort*> _connections;
-
-		void _connect (ASIOBackendPort* , bool);
-		void _disconnect (ASIOBackendPort* , bool);
-
-}; // class ASIOBackendPort
-
-class ASIOPort : public ASIOBackendPort {
-	public:
-		ASIOPort (ASIOBackend &b, const std::string&, PortFlags);
-		~ASIOPort ();
-
-		DataType type () const { return DataType::AUDIO; };
-
-		Sample* buffer () { return _buffer; }
-		const Sample* const_buffer () const { return _buffer; }
-		void* get_buffer (pframes_t nframes);
-
-	private:
-		Sample _buffer[8192];
-}; // class ASIOPort
-
-class WindowsMidiPort : public ASIOBackendPort {
-	public:
-		WindowsMidiPort (ASIOBackend &b, const std::string&, PortFlags);
-		~WindowsMidiPort ();
-
-		DataType type () const { return DataType::MIDI; };
-
-		void* get_buffer (pframes_t nframes);
-		const WindowsMidiBuffer * const_buffer () const { return & _buffer[_bufperiod]; }
-
-		void next_period() { if (_n_periods > 1) { get_buffer(0); _bufperiod = (_bufperiod + 1) % _n_periods; } }
-		void set_n_periods(int n) { if (n > 0 && n < 3) { _n_periods = n; } }
-
-	private:
-		WindowsMidiBuffer _buffer[2];
-		int _n_periods;
-		int _bufperiod;
-}; // class WindowsMidiPort
-
-class ASIOBackend : public AudioBackend {
-	friend class ASIOBackendPort;
-	public:
-		ASIOBackend (AudioEngine& e, AudioBackendInfo& info);
-		~ASIOBackend ();
-
-		/* AUDIOBACKEND API */
-
-		std::string name () const;
-		bool is_realtime () const;
-
-		std::vector<DeviceStatus> enumerate_devices () const;
-		std::vector<float> available_sample_rates (const std::string& device) const;
-		std::vector<uint32_t> available_buffer_sizes (const std::string& device) const;
-		uint32_t available_input_channel_count (const std::string& device) const;
-		uint32_t available_output_channel_count (const std::string& device) const;
-
-		bool can_change_sample_rate_when_running () const;
-		bool can_change_buffer_size_when_running () const;
-
-		int set_device_name (const std::string&);
-		int set_sample_rate (float);
-		int set_buffer_size (uint32_t);
-		int set_interleaved (bool yn);
-		int set_input_channels (uint32_t);
-		int set_output_channels (uint32_t);
-		int set_systemic_input_latency (uint32_t);
-		int set_systemic_output_latency (uint32_t);
-		int set_systemic_midi_input_latency (std::string const, uint32_t) { return 0; }
-		int set_systemic_midi_output_latency (std::string const, uint32_t) { return 0; }
-
-		int reset_device () { return 0; };
-
-		/* Retrieving parameters */
-		std::string  device_name () const;
-		float        sample_rate () const;
-		uint32_t     buffer_size () const;
-		bool         interleaved () const;
-		uint32_t     input_channels () const;
-		uint32_t     output_channels () const;
-		uint32_t     systemic_input_latency () const;
-		uint32_t     systemic_output_latency () const;
-		uint32_t     systemic_midi_input_latency (std::string const) const { return 0; }
-		uint32_t     systemic_midi_output_latency (std::string const) const { return 0; }
-
-		bool can_set_systemic_midi_latencies () const { return false; /* TODO */}
-
-		/* External control app - TODO */
-		std::string control_app_name () const { return std::string (); /* return std::string ("Windows"); */ }
-		void launch_control_app ();
-
-		/* MIDI */
-		std::vector<std::string> enumerate_midi_options () const;
-		int set_midi_option (const std::string&);
-		std::string midi_option () const;
-
-		std::vector<DeviceStatus> enumerate_midi_devices () const {
-			return std::vector<AudioBackend::DeviceStatus> ();
-		}
-		int set_midi_device_enabled (std::string const, bool) {
-			return true;
-		}
-		bool midi_device_enabled (std::string const) const {
-			return false;
-		}
-
-		// really private, but needing static access:
-		int process_callback(uint32_t, uint64_t);
-		void error_callback();
-		void xrun_callback();
-		void buffer_size_callback();
-		void sample_rate_callback();
-		void hw_changed_callback();
-
-	protected:
-		/* State Control */
-		int _start (bool for_latency_measurement);
-	public:
-		int stop ();
-		int freewheel (bool);
-		float dsp_load () const;
-		size_t raw_buffer_size (DataType t);
-
-		/* Process time */
-		framepos_t sample_time ();
-		framepos_t sample_time_at_cycle_start ();
-		pframes_t samples_since_cycle_start ();
-
-		int create_process_thread (boost::function<void()> func);
-		int join_process_threads ();
-		bool in_process_thread ();
-		uint32_t process_thread_count ();
-
-		void update_latencies ();
-
-		/* PORTENGINE API */
-
-		void* private_handle () const;
-		const std::string& my_name () const;
-		bool available () const;
-		uint32_t port_name_size () const;
-
-		int         set_port_name (PortHandle, const std::string&);
-		std::string get_port_name (PortHandle) const;
-		PortHandle  get_port_by_name (const std::string&) const;
-		int get_port_property (PortHandle, const std::string& key, std::string& value, std::string& type) const;
-
-		int get_ports (const std::string& port_name_pattern, DataType type, PortFlags flags, std::vector<std::string>&) const;
-
-		DataType port_data_type (PortHandle) const;
-
-		PortHandle register_port (const std::string& shortname, ARDOUR::DataType, ARDOUR::PortFlags);
-		void unregister_port (PortHandle);
-
-		int  connect (const std::string& src, const std::string& dst);
-		int  disconnect (const std::string& src, const std::string& dst);
-		int  connect (PortHandle, const std::string&);
-		int  disconnect (PortHandle, const std::string&);
-		int  disconnect_all (PortHandle);
-
-		bool connected (PortHandle, bool process_callback_safe);
-		bool connected_to (PortHandle, const std::string&, bool process_callback_safe);
-		bool physically_connected (PortHandle, bool process_callback_safe);
-		int  get_connections (PortHandle, std::vector<std::string>&, bool process_callback_safe);
-
-		/* MIDI */
-		int midi_event_get (pframes_t& timestamp, size_t& size, uint8_t** buf, void* port_buffer, uint32_t event_index);
-		int midi_event_put (void* port_buffer, pframes_t timestamp, const uint8_t* buffer, size_t size);
-		uint32_t get_midi_event_count (void* port_buffer);
-		void     midi_clear (void* port_buffer);
-
-		/* Monitoring */
-
-		bool can_monitor_input () const;
-		int  request_input_monitoring (PortHandle, bool);
-		int  ensure_input_monitoring (PortHandle, bool);
-		bool monitoring_input (PortHandle);
-
-		/* Latency management */
-
-		void         set_latency_range (PortHandle, bool for_playback, LatencyRange);
-		LatencyRange get_latency_range (PortHandle, bool for_playback);
-
-		/* Discovering physical ports */
-
-		bool      port_is_physical (PortHandle) const;
-		void      get_physical_outputs (DataType type, std::vector<std::string>&);
-		void      get_physical_inputs (DataType type, std::vector<std::string>&);
-		ChanCount n_physical_outputs () const;
-		ChanCount n_physical_inputs () const;
-
-		/* Getting access to the data buffer for a port */
-
-		void* get_buffer (PortHandle, pframes_t);
-
-		void* freewheel_thread ();
-		void pre_process ();
-
-	private:
-		std::string _instance_name;
-		//ASIOPCM *_pcmio; // TODO
-		//WindowsMidiIo *_midiio; // TODO
-
-		bool  _run; /* keep going or stop, ardour thread */
-		bool  _active_cb; /* is running, asio callback */
-		bool  _active_fw; /* is running, freewheel thread */
-		bool  _preinit;
-		bool  _freewheeling;
-		bool  _freewheel;
-		bool  _freewheel_ack;
-		bool  _reinit_thread_callback;
-		bool  _measure_latency;
-
-		uint64_t _last_process_start;
-
-		pthread_mutex_t _process_callback_mutex;
-
-		pthread_mutex_t _freewheel_mutex;
-		pthread_cond_t  _freewheel_signal;
-
-		static std::vector<std::string> _midi_options;
-		static std::vector<AudioBackend::DeviceStatus> _audio_device_status;
-		static std::vector<AudioBackend::DeviceStatus> _midi_device_status;
-
-		mutable std::string _audio_device;
-		std::string _midi_driver_option;
-
-		/* audio settings */
-		float  _samplerate;
-		size_t _samples_per_period;
-		static size_t _max_buffer_size;
-
-		uint32_t _n_inputs;
-		uint32_t _n_outputs;
-
-		uint32_t _systemic_audio_input_latency;
-		uint32_t _systemic_audio_output_latency;
-
-		/* processing */
-		float  _dsp_load;
-		uint64_t _processed_samples;
-
-		pthread_t _main_thread;
-		pthread_t _freeewheel_thread;
-
-		/* process threads */
-		static void* asio_process_thread (void *);
-		std::vector<pthread_t> _threads;
-
-		struct ThreadData {
-			ASIOBackend* engine;
-			boost::function<void ()> f;
-			size_t stacksize;
-
-			ThreadData (ASIOBackend* e, boost::function<void ()> fp, size_t stacksz)
-				: engine (e) , f (fp) , stacksize (stacksz) {}
-		};
-
-		/* port engine */
-		PortHandle add_port (const std::string& shortname, ARDOUR::DataType, ARDOUR::PortFlags);
-		int register_system_audio_ports ();
-		void unregister_ports (bool system_only = false);
-
-		std::vector<ASIOBackendPort *> _ports;
-		std::vector<ASIOBackendPort *> _system_inputs;
-		std::vector<ASIOBackendPort *> _system_outputs;
-		std::vector<ASIOBackendPort *> _system_midi_in;
-		std::vector<ASIOBackendPort *> _system_midi_out;
-
-		struct PortConnectData {
-			std::string a;
-			std::string b;
-			bool c;
-
-			PortConnectData (const std::string& a, const std::string& b, bool c)
-				: a (a) , b (b) , c (c) {}
-		};
-
-		std::vector<PortConnectData *> _port_connection_queue;
-		pthread_mutex_t _port_callback_mutex;
-		bool _port_change_flag;
-
-		void port_connect_callback (const std::string& a, const std::string& b, bool conn) {
-			pthread_mutex_lock (&_port_callback_mutex);
-			_port_connection_queue.push_back(new PortConnectData(a, b, conn));
-			pthread_mutex_unlock (&_port_callback_mutex);
-		}
-
-		void port_connect_add_remove_callback () {
-			pthread_mutex_lock (&_port_callback_mutex);
-			_port_change_flag = true;
-			pthread_mutex_unlock (&_port_callback_mutex);
-		}
-
-		bool valid_port (PortHandle port) const {
-			return std::find (_ports.begin (), _ports.end (), (ASIOBackendPort*)port) != _ports.end ();
-		}
-
-		ASIOBackendPort * find_port (const std::string& port_name) const {
-			for (std::vector<ASIOBackendPort*>::const_iterator it = _ports.begin (); it != _ports.end (); ++it) {
-				if ((*it)->name () == port_name) {
-					return *it;
-				}
-			}
-			return NULL;
-		}
-
-		ASIOBackendPort * find_port_in (std::vector<ASIOBackendPort *> plist, const std::string& port_name) const {
-			for (std::vector<ASIOBackendPort*>::const_iterator it = plist.begin (); it != plist.end (); ++it) {
-				if ((*it)->name () == port_name) {
-					return *it;
-				}
-			}
-			return NULL;
-		}
-
-}; // class ASIOBackend
-
-} // namespace
-
-#endif /* __libbackend_asio_backend_h__ */
diff --git a/libs/backends/asio/rt_thread.h b/libs/backends/asio/rt_thread.h
deleted file mode 100644
index 0535602..0000000
--- a/libs/backends/asio/rt_thread.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright (C) 2014 Robin Gareus <robin at gareus.org>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#ifndef __libbackend_portaudio_rthread_h__
-#define __libbackend_portaudio_rthread_h__
-
-#include <pthread.h>
-#include <sched.h>
-
-static int
-_realtime_pthread_create (
-		const int policy, int priority, const size_t stacksize,
-		pthread_t *thread,
-		void *(*start_routine) (void *),
-		void *arg)
-{
-	int rv;
-
-	pthread_attr_t attr;
-	struct sched_param parm;
-
-	const int p_min = sched_get_priority_min (policy);
-	const int p_max = sched_get_priority_max (policy);
-	priority += p_max;
-	if (priority > p_max) priority = p_max;
-	if (priority < p_min) priority = p_min;
-	parm.sched_priority = priority;
-
-	pthread_attr_init (&attr);
-	pthread_attr_setschedpolicy (&attr, policy);
-	pthread_attr_setschedparam (&attr, &parm);
-	pthread_attr_setscope (&attr, PTHREAD_SCOPE_SYSTEM);
-	pthread_attr_setinheritsched (&attr, PTHREAD_EXPLICIT_SCHED);
-	pthread_attr_setstacksize (&attr, stacksize);
-	rv = pthread_create (thread, &attr, start_routine, arg);
-	pthread_attr_destroy (&attr);
-	return rv;
-}
-
-#endif
diff --git a/libs/backends/asio/wscript b/libs/backends/asio/wscript
deleted file mode 100644
index fd12219..0000000
--- a/libs/backends/asio/wscript
+++ /dev/null
@@ -1,33 +0,0 @@
-#!/usr/bin/env python
-from waflib.extras import autowaf as autowaf
-from waflib import Options
-import os
-import sys
-import re
-
-I18N_PACKAGE = 'asio-backend'
-
-# Mandatory variables
-top = '.'
-out = 'build'
-
-def options(opt):
-    autowaf.set_options(opt)
-
-def configure(conf):
-    autowaf.configure(conf)
-
-def build(bld):
-    obj = bld(features = 'cxx cxxshlib')
-    obj.source = [ 'asio_backend.cc',
-#                  'asio_io.cc',
-#                  'mme_io.cc'
-                 ]
-    obj.includes = ['.']
-    obj.name     = 'asio_backend'
-    obj.target   = 'asio_backend'
-    obj.use      = 'libardour libpbd'
-    obj.install_path  = os.path.join(bld.env['LIBDIR'], 'backends')
-    obj.defines = ['PACKAGE="' + I18N_PACKAGE + '"',
-                   'ARDOURBACKEND_DLL_EXPORTS'
-                  ]
diff --git a/libs/backends/coreaudio/coreaudio_backend.cc b/libs/backends/coreaudio/coreaudio_backend.cc
index a620bf0..a0eeb3d 100644
--- a/libs/backends/coreaudio/coreaudio_backend.cc
+++ b/libs/backends/coreaudio/coreaudio_backend.cc
@@ -31,7 +31,7 @@
 #include "pbd/file_utils.h"
 #include "ardour/filesystem_paths.h"
 #include "ardour/port_manager.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 
@@ -497,13 +497,14 @@ CoreAudioBackend::_start (bool for_latency_measurement)
 		return BackendReinitializationError;
 	}
 
-	if (_ports.size()) {
+	if (_ports.size () || _portmap.size ()) {
 		PBD::warning << _("CoreAudioBackend: recovering from unclean shutdown, port registry is not empty.") << endmsg;
 		_system_inputs.clear();
 		_system_outputs.clear();
 		_system_midi_in.clear();
 		_system_midi_out.clear();
 		_ports.clear();
+		_portmap.clear();
 	}
 
 	uint32_t device1 = name_to_id(_input_audio_device);
@@ -901,11 +902,20 @@ CoreAudioBackend::port_name_size () const
 int
 CoreAudioBackend::set_port_name (PortEngine::PortHandle port, const std::string& name)
 {
+	std::string newname (_instance_name + ":" + name);
 	if (!valid_port (port)) {
 		PBD::warning << _("CoreAudioBackend::set_port_name: Invalid Port(s)") << endmsg;
 		return -1;
 	}
-	return static_cast<CoreBackendPort*>(port)->set_name (_instance_name + ":" + name);
+	if (find_port (newname)) {
+		PBD::error << _("CoreAudioBackend::set_port_name: Port with given name already exists") << endmsg;
+		return -1;
+	}
+
+	CoreBackendPort* p = static_cast<CoreBackendPort*>(port);
+	_portmap.erase (p->name());
+	_portmap.insert (make_pair (newname, p));
+	return p->set_name (newname);
 }
 
 std::string
@@ -935,6 +945,20 @@ CoreAudioBackend::get_port_property (PortHandle port, const std::string& key, st
 	return -1;
 }
 
+int
+CoreAudioBackend::set_port_property (PortHandle port, const std::string& key, const std::string& value, const std::string& type)
+{
+	if (!valid_port (port)) {
+		PBD::warning << _("CoreAudioBackend::set_port_property: Invalid Port(s)") << endmsg;
+		return -1;
+	}
+	if (key == "http://jackaudio.org/metadata/pretty-name" && type.empty ()) {
+		static_cast<CoreBackendPort*>(port)->set_pretty_name (value);
+		return 0;
+	}
+	return -1;
+}
+
 PortEngine::PortHandle
 CoreAudioBackend::get_port_by_name (const std::string& name) const
 {
@@ -956,8 +980,9 @@ CoreAudioBackend::get_ports (
 			use_regexp = true;
 		}
 	}
-	for (size_t i = 0; i < _ports.size (); ++i) {
-		CoreBackendPort* port = _ports[i];
+
+	for (PortIndex::const_iterator i = _ports.begin (); i != _ports.end (); ++i) {
+		CoreBackendPort* port = *i;
 		if ((port->type () == type) && flags == (port->flags () & flags)) {
 			if (!use_regexp || !regexec (&port_regex, port->name ().c_str (), 0, NULL, 0)) {
 				port_names.push_back (port->name ());
@@ -1016,7 +1041,8 @@ CoreAudioBackend::add_port (
 		return 0;
 	}
 
-	_ports.push_back (port);
+	_ports.insert (port);
+	_portmap.insert (make_pair (name, port));
 
 	return port;
 }
@@ -1028,12 +1054,13 @@ CoreAudioBackend::unregister_port (PortEngine::PortHandle port_handle)
 		return;
 	}
 	CoreBackendPort* port = static_cast<CoreBackendPort*>(port_handle);
-	std::vector<CoreBackendPort*>::iterator i = std::find (_ports.begin (), _ports.end (), static_cast<CoreBackendPort*>(port_handle));
+	PortIndex::iterator i = std::find (_ports.begin(), _ports.end(), static_cast<CoreBackendPort*>(port_handle));
 	if (i == _ports.end ()) {
 		PBD::warning << _("CoreAudioBackend::unregister_port: Failed to find port") << endmsg;
 		return;
 	}
 	disconnect_all(port_handle);
+	_portmap.erase (port->name());
 	_ports.erase (i);
 	delete port;
 }
@@ -1186,19 +1213,19 @@ CoreAudioBackend::coremidi_rediscover()
 void
 CoreAudioBackend::unregister_ports (bool system_only)
 {
-	size_t i = 0;
 	_system_inputs.clear();
 	_system_outputs.clear();
 	_system_midi_in.clear();
 	_system_midi_out.clear();
-	while (i <  _ports.size ()) {
-		CoreBackendPort* port = _ports[i];
+
+	for (PortIndex::iterator i = _ports.begin (); i != _ports.end ();) {
+		PortIndex::iterator cur = i++;
+		CoreBackendPort* port = *cur;
 		if (! system_only || (port->is_physical () && port->is_terminal ())) {
 			port->disconnect_all ();
+			_portmap.erase (port->name());
 			delete port;
-			_ports.erase (_ports.begin() + i);
-		} else {
-			++i;
+			_ports.erase (cur);
 		}
 	}
 }
@@ -1287,10 +1314,12 @@ bool
 CoreAudioBackend::connected_to (PortEngine::PortHandle src, const std::string& dst, bool /*process_callback_safe*/)
 {
 	CoreBackendPort* dst_port = find_port (dst);
+#ifndef NDEBUG
 	if (!valid_port (src) || !dst_port) {
 		PBD::warning << _("CoreAudioBackend::connected_to: Invalid Port") << endmsg;
 		return false;
 	}
+#endif
 	return static_cast<CoreBackendPort*>(src)->is_connected (dst_port);
 }
 
@@ -1314,9 +1343,9 @@ CoreAudioBackend::get_connections (PortEngine::PortHandle port, std::vector<std:
 
 	assert (0 == names.size ());
 
-	const std::vector<CoreBackendPort*>& connected_ports = static_cast<CoreBackendPort*>(port)->get_connections ();
+	const std::set<CoreBackendPort*>& connected_ports = static_cast<CoreBackendPort*>(port)->get_connections ();
 
-	for (std::vector<CoreBackendPort*>::const_iterator i = connected_ports.begin (); i != connected_ports.end (); ++i) {
+	for (std::set<CoreBackendPort*>::const_iterator i = connected_ports.begin (); i != connected_ports.end (); ++i) {
 		names.push_back ((*i)->name ());
 	}
 
@@ -1459,8 +1488,8 @@ CoreAudioBackend::port_is_physical (PortEngine::PortHandle port) const
 void
 CoreAudioBackend::get_physical_outputs (DataType type, std::vector<std::string>& port_names)
 {
-	for (size_t i = 0; i < _ports.size (); ++i) {
-		CoreBackendPort* port = _ports[i];
+	for (PortIndex::iterator i = _ports.begin (); i != _ports.end (); ++i) {
+		CoreBackendPort* port = *i;
 		if ((port->type () == type) && port->is_input () && port->is_physical ()) {
 			port_names.push_back (port->name ());
 		}
@@ -1470,8 +1499,8 @@ CoreAudioBackend::get_physical_outputs (DataType type, std::vector<std::string>&
 void
 CoreAudioBackend::get_physical_inputs (DataType type, std::vector<std::string>& port_names)
 {
-	for (size_t i = 0; i < _ports.size (); ++i) {
-		CoreBackendPort* port = _ports[i];
+	for (PortIndex::iterator i = _ports.begin (); i != _ports.end (); ++i) {
+		CoreBackendPort* port = *i;
 		if ((port->type () == type) && port->is_output () && port->is_physical ()) {
 			port_names.push_back (port->name ());
 		}
@@ -1483,8 +1512,8 @@ CoreAudioBackend::n_physical_outputs () const
 {
 	int n_midi = 0;
 	int n_audio = 0;
-	for (size_t i = 0; i < _ports.size (); ++i) {
-		CoreBackendPort* port = _ports[i];
+	for (PortIndex::const_iterator i = _ports.begin (); i != _ports.end (); ++i) {
+		CoreBackendPort* port = *i;
 		if (port->is_output () && port->is_physical ()) {
 			switch (port->type ()) {
 			case DataType::AUDIO: ++n_audio; break;
@@ -1504,8 +1533,8 @@ CoreAudioBackend::n_physical_inputs () const
 {
 	int n_midi = 0;
 	int n_audio = 0;
-	for (size_t i = 0; i < _ports.size (); ++i) {
-		CoreBackendPort* port = _ports[i];
+	for (PortIndex::const_iterator i = _ports.begin (); i != _ports.end (); ++i) {
+		CoreBackendPort* port = *i;
 		if (port->is_input () && port->is_physical ()) {
 			switch (port->type ()) {
 			case DataType::AUDIO: ++n_audio; break;
@@ -1962,7 +1991,7 @@ int CoreBackendPort::connect (CoreBackendPort *port)
 
 void CoreBackendPort::_connect (CoreBackendPort *port, bool callback)
 {
-	_connections.push_back (port);
+	_connections.insert (port);
 	if (callback) {
 		port->_connect (this, false);
 		_osx_backend.port_connect_callback (name(),  port->name(), true);
@@ -1988,12 +2017,9 @@ int CoreBackendPort::disconnect (CoreBackendPort *port)
 
 void CoreBackendPort::_disconnect (CoreBackendPort *port, bool callback)
 {
-	std::vector<CoreBackendPort*>::iterator it = std::find (_connections.begin (), _connections.end (), port);
-
+	std::set<CoreBackendPort*>::iterator it = _connections.find (port);
 	assert (it != _connections.end ());
-
 	_connections.erase (it);
-
 	if (callback) {
 		port->_disconnect (this, false);
 		_osx_backend.port_connect_callback (name(),  port->name(), false);
@@ -2004,21 +2030,22 @@ void CoreBackendPort::_disconnect (CoreBackendPort *port, bool callback)
 void CoreBackendPort::disconnect_all ()
 {
 	while (!_connections.empty ()) {
-		_connections.back ()->_disconnect (this, false);
-		_osx_backend.port_connect_callback (name(),  _connections.back ()->name(), false);
-		_connections.pop_back ();
+		std::set<CoreBackendPort*>::iterator it = _connections.begin ();
+		(*it)->_disconnect (this, false);
+		_osx_backend.port_connect_callback (name(), (*it)->name(), false);
+		_connections.erase (it);
 	}
 }
 
 bool
 CoreBackendPort::is_connected (const CoreBackendPort *port) const
 {
-	return std::find (_connections.begin (), _connections.end (), port) != _connections.end ();
+	return _connections.find (const_cast<CoreBackendPort *>(port)) != _connections.end ();
 }
 
 bool CoreBackendPort::is_physically_connected () const
 {
-	for (std::vector<CoreBackendPort*>::const_iterator it = _connections.begin (); it != _connections.end (); ++it) {
+	for (std::set<CoreBackendPort*>::const_iterator it = _connections.begin (); it != _connections.end (); ++it) {
 		if ((*it)->is_physical ()) {
 			return true;
 		}
@@ -2040,14 +2067,15 @@ CoreAudioPort::~CoreAudioPort () { }
 void* CoreAudioPort::get_buffer (pframes_t n_samples)
 {
 	if (is_input ()) {
-		std::vector<CoreBackendPort*>::const_iterator it = get_connections ().begin ();
-		if (it == get_connections ().end ()) {
+		const std::set<CoreBackendPort *>& connections = get_connections ();
+		std::set<CoreBackendPort*>::const_iterator it = connections.begin ();
+		if (it == connections.end ()) {
 			memset (_buffer, 0, n_samples * sizeof (Sample));
 		} else {
 			CoreAudioPort const * source = static_cast<const CoreAudioPort*>(*it);
 			assert (source && source->is_output ());
 			memcpy (_buffer, source->const_buffer (), n_samples * sizeof (Sample));
-			while (++it != get_connections ().end ()) {
+			while (++it != connections.end ()) {
 				source = static_cast<const CoreAudioPort*>(*it);
 				assert (source && source->is_output ());
 				Sample* dst = buffer ();
@@ -2090,8 +2118,9 @@ void* CoreMidiPort::get_buffer (pframes_t /* nframes */)
 {
 	if (is_input ()) {
 		(_buffer[_bufperiod]).clear ();
-		for (std::vector<CoreBackendPort*>::const_iterator i = get_connections ().begin ();
-		     i != get_connections ().end ();
+		const std::set<CoreBackendPort*>& connections = get_connections ();
+		for (std::set<CoreBackendPort*>::const_iterator i = connections.begin ();
+		     i != connections.end ();
 		     ++i) {
 			const CoreMidiBuffer * src = static_cast<const CoreMidiPort*>(*i)->const_buffer ();
 			for (CoreMidiBuffer::const_iterator it = src->begin (); it != src->end (); ++it) {
diff --git a/libs/backends/coreaudio/coreaudio_backend.h b/libs/backends/coreaudio/coreaudio_backend.h
index e36e936..d37ef6c 100644
--- a/libs/backends/coreaudio/coreaudio_backend.h
+++ b/libs/backends/coreaudio/coreaudio_backend.h
@@ -30,6 +30,7 @@
 
 #include <boost/shared_ptr.hpp>
 
+#include "pbd/natsort.h"
 #include "ardour/audio_backend.h"
 #include "ardour/dsp_load_calculator.h"
 #include "ardour/types.h"
@@ -82,7 +83,7 @@ class CoreBackendPort {
 	bool is_connected (const CoreBackendPort *port) const;
 	bool is_physically_connected () const;
 
-	const std::vector<CoreBackendPort *>& get_connections () const { return _connections; }
+	const std::set<CoreBackendPort *>& get_connections () const { return _connections; }
 
 	int connect (CoreBackendPort *port);
 	int disconnect (CoreBackendPort *port);
@@ -114,7 +115,7 @@ class CoreBackendPort {
 	const PortFlags _flags;
 	LatencyRange _capture_latency_range;
 	LatencyRange _playback_latency_range;
-	std::vector<CoreBackendPort*> _connections;
+	std::set<CoreBackendPort*> _connections;
 
 	void _connect (CoreBackendPort* , bool);
 	void _disconnect (CoreBackendPort* , bool);
@@ -330,6 +331,7 @@ class CoreAudioBackend : public AudioBackend {
 	std::string get_port_name (PortHandle) const;
 	PortHandle  get_port_by_name (const std::string&) const;
 	int get_port_property (PortHandle, const std::string& key, std::string& value, std::string& type) const;
+	int set_port_property (PortHandle, const std::string& key, const std::string& value, const std::string& type);
 
 	int get_ports (const std::string& port_name_pattern, DataType type, PortFlags flags, std::vector<std::string>&) const;
 
@@ -460,12 +462,24 @@ class CoreAudioBackend : public AudioBackend {
 	int register_system_audio_ports ();
 	void unregister_ports (bool system_only = false);
 
-	std::vector<CoreBackendPort *> _ports;
 	std::vector<CoreBackendPort *> _system_inputs;
 	std::vector<CoreBackendPort *> _system_outputs;
 	std::vector<CoreBackendPort *> _system_midi_in;
 	std::vector<CoreBackendPort *> _system_midi_out;
 
+	struct SortByPortName
+	{
+		bool operator ()(const CoreBackendPort* lhs, const CoreBackendPort* rhs) const
+		{
+			return PBD::naturally_less (lhs->name ().c_str (), rhs->name ().c_str ());
+		}
+	};
+
+	typedef std::map<std::string, CoreBackendPort *> PortMap; // fast lookup in _ports
+	typedef std::set<CoreBackendPort *, SortByPortName> PortIndex; // fast lookup in _ports
+	PortMap _portmap;
+	PortIndex _ports;
+
 	struct PortConnectData {
 		std::string a;
 		std::string b;
@@ -492,16 +506,15 @@ class CoreAudioBackend : public AudioBackend {
 	}
 
 	bool valid_port (PortHandle port) const {
-		return std::find (_ports.begin (), _ports.end (), (CoreBackendPort*)port) != _ports.end ();
+		return std::find (_ports.begin(), _ports.end(), static_cast<CoreBackendPort*>(port)) != _ports.end ();
 	}
 
-	CoreBackendPort * find_port (const std::string& port_name) const {
-		for (std::vector<CoreBackendPort*>::const_iterator it = _ports.begin (); it != _ports.end (); ++it) {
-			if ((*it)->name () == port_name) {
-				return *it;
-			}
+	CoreBackendPort* find_port (const std::string& port_name) const {
+		PortMap::const_iterator it = _portmap.find (port_name);
+		if (it == _portmap.end()) {
+			return NULL;
 		}
-		return NULL;
+		return (*it).second;
 	}
 
 	CoreBackendPort * find_port_in (std::vector<CoreBackendPort *> plist, const std::string& port_name) const {
diff --git a/libs/backends/coreaudio/wscript b/libs/backends/coreaudio/wscript
index 9aad9cd..8dc0300 100644
--- a/libs/backends/coreaudio/wscript
+++ b/libs/backends/coreaudio/wscript
@@ -29,8 +29,9 @@ def build(bld):
     obj.name     = 'coreaudio_backend'
     obj.target   = 'coreaudio_backend'
     obj.use      = 'libardour libpbd'
+    obj.uselib   = 'GLIBMM XML'
     obj.framework = [ 'CoreAudio', 'AudioToolbox', 'CoreServices' ]
-    if bld.env['build_target'] not in [ 'lion' ] and (not bld.env['build_arch'] == "ppc"):
+    if bld.env['build_target'] not in [ 'lion', 'el_capitan' ] and (not bld.env['build_arch'] == "ppc"):
         obj.framework += [ 'CoreMidi' ]
     else:
         obj.framework += [ 'CoreMIDI' ]
diff --git a/libs/backends/dummy/dummy_audiobackend.cc b/libs/backends/dummy/dummy_audiobackend.cc
index 130a92d..28d73d4 100644
--- a/libs/backends/dummy/dummy_audiobackend.cc
+++ b/libs/backends/dummy/dummy_audiobackend.cc
@@ -17,6 +17,7 @@
  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
 
+#include <math.h>
 #include <sys/time.h>
 #include <regex.h>
 #include <stdlib.h>
@@ -33,7 +34,7 @@
 
 #include "pbd/error.h"
 #include "ardour/port_manager.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 
@@ -112,7 +113,10 @@ DummyAudioBackend::enumerate_devices () const
 {
 	if (_device_status.empty()) {
 		_device_status.push_back (DeviceStatus (_("Silence"), true));
+		_device_status.push_back (DeviceStatus (_("DC -6dBFS (+.5)"), true));
+		_device_status.push_back (DeviceStatus (_("Demolition"), true));
 		_device_status.push_back (DeviceStatus (_("Sine Wave"), true));
+		_device_status.push_back (DeviceStatus (_("Sine Wave 1K, 1/3 Oct"), true));
 		_device_status.push_back (DeviceStatus (_("Square Wave"), true));
 		_device_status.push_back (DeviceStatus (_("Impulses"), true));
 		_device_status.push_back (DeviceStatus (_("Uniform White Noise"), true));
@@ -427,16 +431,20 @@ DummyAudioBackend::_start (bool /*for_latency_measurement*/)
 		return BackendReinitializationError;
 	}
 
-	if (_ports.size()) {
+	if (_ports.size () || _portmap.size ()) {
 		PBD::warning << _("DummyAudioBackend: recovering from unclean shutdown, port registry is not empty.") << endmsg;
-		for (std::vector<DummyPort*>::const_iterator it = _ports.begin (); it != _ports.end (); ++it) {
+		for (PortIndex::const_iterator it = _ports.begin (); it != _ports.end (); ++it) {
 			PBD::info << _("DummyAudioBackend: port '") << (*it)->name () << "' exists." << endmsg;
 		}
+		for (PortMap::const_iterator it = _portmap.begin (); it != _portmap.end (); ++it) {
+			PBD::info << _("DummyAudioBackend: portmap '") << (*it).first << "' exists." << endmsg;
+		}
 		_system_inputs.clear();
 		_system_outputs.clear();
 		_system_midi_in.clear();
 		_system_midi_out.clear();
 		_ports.clear();
+		_portmap.clear();
 	}
 
 	if (register_system_ports()) {
@@ -642,11 +650,22 @@ DummyAudioBackend::port_name_size () const
 int
 DummyAudioBackend::set_port_name (PortEngine::PortHandle port, const std::string& name)
 {
+	std::string newname (_instance_name + ":" + name);
+
 	if (!valid_port (port)) {
 		PBD::error << _("DummyBackend::set_port_name: Invalid Port(s)") << endmsg;
 		return -1;
 	}
-	return static_cast<DummyPort*>(port)->set_name (_instance_name + ":" + name);
+
+	if (find_port (newname)) {
+		PBD::error << _("DummyBackend::set_port_name: Port with given name already exists") << endmsg;
+		return -1;
+	}
+
+	DummyPort* p = static_cast<DummyPort*>(port);
+	_portmap.erase (p->name());
+	_portmap.insert (make_pair (newname, p));
+	return p->set_name (newname);
 }
 
 std::string
@@ -659,6 +678,37 @@ DummyAudioBackend::get_port_name (PortEngine::PortHandle port) const
 	return static_cast<DummyPort*>(port)->name ();
 }
 
+int
+DummyAudioBackend::get_port_property (PortHandle port, const std::string& key, std::string& value, std::string& type) const
+{
+	if (!valid_port (port)) {
+		PBD::warning << _("DummyBackend::get_port_property: Invalid Port(s)") << endmsg;
+		return -1;
+	}
+	if (key == "http://jackaudio.org/metadata/pretty-name") {
+		type = "";
+		value = static_cast<DummyPort*>(port)->pretty_name ();
+		if (!value.empty()) {
+			return 0;
+		}
+	}
+	return -1;
+}
+
+int
+DummyAudioBackend::set_port_property (PortHandle port, const std::string& key, const std::string& value, const std::string& type)
+{
+	if (!valid_port (port)) {
+		PBD::warning << _("DummyBackend::set_port_property: Invalid Port(s)") << endmsg;
+		return -1;
+	}
+	if (key == "http://jackaudio.org/metadata/pretty-name" && type.empty ()) {
+		static_cast<DummyPort*>(port)->set_pretty_name (value);
+		return 0;
+	}
+	return -1;
+}
+
 PortEngine::PortHandle
 DummyAudioBackend::get_port_by_name (const std::string& name) const
 {
@@ -680,8 +730,9 @@ DummyAudioBackend::get_ports (
 			use_regexp = true;
 		}
 	}
-	for (size_t i = 0; i < _ports.size (); ++i) {
-		DummyPort* port = _ports[i];
+
+	for (PortIndex::const_iterator i = _ports.begin (); i != _ports.end (); ++i) {
+		DummyPort* port = *i;
 		if ((port->type () == type) && flags == (port->flags () & flags)) {
 			if (!use_regexp || !regexec (&port_regex, port->name ().c_str (), 0, NULL, 0)) {
 				port_names.push_back (port->name ());
@@ -743,7 +794,8 @@ DummyAudioBackend::add_port (
 			return 0;
 	}
 
-	_ports.push_back (port);
+	_ports.insert (port);
+	_portmap.insert (make_pair (name, port));
 
 	return port;
 }
@@ -757,12 +809,13 @@ DummyAudioBackend::unregister_port (PortEngine::PortHandle port_handle)
 		return;
 	}
 	DummyPort* port = static_cast<DummyPort*>(port_handle);
-	std::vector<DummyPort*>::iterator i = std::find (_ports.begin (), _ports.end (), static_cast<DummyPort*>(port_handle));
+	PortIndex::iterator i = std::find (_ports.begin(), _ports.end(), static_cast<DummyPort*>(port_handle));
 	if (i == _ports.end ()) {
 		PBD::error << _("DummyBackend::unregister_port: Failed to find port") << endmsg;
 		return;
 	}
 	disconnect_all(port_handle);
+	_portmap.erase (port->name());
 	_ports.erase (i);
 	delete port;
 }
@@ -782,6 +835,8 @@ DummyAudioBackend::register_system_ports()
 		gt = DummyAudioPort::PonyNoise;
 	} else if (_device == _("Sine Wave")) {
 		gt = DummyAudioPort::SineWave;
+	} else if (_device == _("Sine Wave 1K, 1/3 Oct")) {
+		gt = DummyAudioPort::SineWaveOctaves;
 	} else if (_device == _("Square Wave")) {
 		gt = DummyAudioPort::SquareWave;
 	} else if (_device == _("Impulses")) {
@@ -796,6 +851,10 @@ DummyAudioBackend::register_system_ports()
 		gt = DummyAudioPort::SquareSweepSwell;
 	} else if (_device == _("Loopback")) {
 		gt = DummyAudioPort::Loopback;
+	} else if (_device == _("Demolition")) {
+		gt = DummyAudioPort::Demolition;
+	} else if (_device == _("DC -6dBFS (+.5)")) {
+		gt = DummyAudioPort::DC05;
 	} else {
 		gt = DummyAudioPort::Silence;
 	}
@@ -819,7 +878,10 @@ DummyAudioBackend::register_system_ports()
 		if (!p) return -1;
 		set_latency_range (p, false, lr);
 		_system_inputs.push_back (static_cast<DummyAudioPort*>(p));
-		static_cast<DummyAudioPort*>(p)->setup_generator (gt, _samplerate);
+		std::string name = static_cast<DummyAudioPort*>(p)->setup_generator (gt, _samplerate, i - 1, a_ins);
+		if (!name.empty ()) {
+			static_cast<DummyAudioPort*>(p)->set_pretty_name (name);
+		}
 	}
 
 	lr.min = lr.max = _systemic_output_latency;
@@ -842,7 +904,10 @@ DummyAudioBackend::register_system_ports()
 		set_latency_range (p, false, lr);
 		_system_midi_in.push_back (static_cast<DummyMidiPort*>(p));
 		if (_midi_mode == MidiGenerator) {
-			static_cast<DummyMidiPort*>(p)->setup_generator (i % NUM_MIDI_EVENT_GENERATORS, _samplerate);
+			std::string name = static_cast<DummyMidiPort*>(p)->setup_generator (i % NUM_MIDI_EVENT_GENERATORS, _samplerate);
+			if (!name.empty ()) {
+				static_cast<DummyMidiPort*>(p)->set_pretty_name (name);
+			}
 		}
 	}
 
@@ -854,6 +919,17 @@ DummyAudioBackend::register_system_ports()
 		if (!p) return -1;
 		set_latency_range (p, true, lr);
 		_system_midi_out.push_back (static_cast<DummyMidiPort*>(p));
+
+		if (_device == _("Loopback") && _midi_mode == MidiToAudio) {
+			std::stringstream ss;
+			ss << "Midi2Audio";
+			for (int apc = 0; apc < (int)_system_inputs.size(); ++apc) {
+				if ((apc % m_out) + 1 == i) {
+					ss << " >" << (apc + 1);
+				}
+			}
+			static_cast<DummyMidiPort*>(p)->set_pretty_name (ss.str());
+		}
 	}
 	return 0;
 }
@@ -866,14 +942,14 @@ DummyAudioBackend::unregister_ports (bool system_only)
 	_system_midi_in.clear();
 	_system_midi_out.clear();
 
-	for (std::vector<DummyPort*>::iterator i = _ports.begin (); i != _ports.end ();) {
-		DummyPort* port = *i;
+	for (PortIndex::iterator i = _ports.begin (); i != _ports.end ();) {
+		PortIndex::iterator cur = i++;
+		DummyPort* port = *cur;
 		if (! system_only || (port->is_physical () && port->is_terminal ())) {
 			port->disconnect_all ();
+			_portmap.erase (port->name());
 			delete port;
-			i = _ports.erase (i);
-		} else {
-			++i;
+			_ports.erase (cur);
 		}
 	}
 }
@@ -962,10 +1038,12 @@ bool
 DummyAudioBackend::connected_to (PortEngine::PortHandle src, const std::string& dst, bool /*process_callback_safe*/)
 {
 	DummyPort* dst_port = find_port (dst);
+#ifndef NDEBUG
 	if (!valid_port (src) || !dst_port) {
 		PBD::error << _("DummyBackend::connected_to: Invalid Port") << endmsg;
 		return false;
 	}
+#endif
 	return static_cast<DummyPort*>(src)->is_connected (dst_port);
 }
 
@@ -989,9 +1067,9 @@ DummyAudioBackend::get_connections (PortEngine::PortHandle port, std::vector<std
 
 	assert (0 == names.size ());
 
-	const std::vector<DummyPort*>& connected_ports = static_cast<DummyPort*>(port)->get_connections ();
+	const std::set<DummyPort*>& connected_ports = static_cast<DummyPort*>(port)->get_connections ();
 
-	for (std::vector<DummyPort*>::const_iterator i = connected_ports.begin (); i != connected_ports.end (); ++i) {
+	for (std::set<DummyPort*>::const_iterator i = connected_ports.begin (); i != connected_ports.end (); ++i) {
 		names.push_back ((*i)->name ());
 	}
 
@@ -1140,8 +1218,8 @@ DummyAudioBackend::port_is_physical (PortEngine::PortHandle port) const
 void
 DummyAudioBackend::get_physical_outputs (DataType type, std::vector<std::string>& port_names)
 {
-	for (size_t i = 0; i < _ports.size (); ++i) {
-		DummyPort* port = _ports[i];
+	for (PortIndex::iterator i = _ports.begin (); i != _ports.end (); ++i) {
+		DummyPort* port = *i;
 		if ((port->type () == type) && port->is_input () && port->is_physical ()) {
 			port_names.push_back (port->name ());
 		}
@@ -1151,8 +1229,8 @@ DummyAudioBackend::get_physical_outputs (DataType type, std::vector<std::string>
 void
 DummyAudioBackend::get_physical_inputs (DataType type, std::vector<std::string>& port_names)
 {
-	for (size_t i = 0; i < _ports.size (); ++i) {
-		DummyPort* port = _ports[i];
+	for (PortIndex::iterator i = _ports.begin (); i != _ports.end (); ++i) {
+		DummyPort* port = *i;
 		if ((port->type () == type) && port->is_output () && port->is_physical ()) {
 			port_names.push_back (port->name ());
 		}
@@ -1164,8 +1242,8 @@ DummyAudioBackend::n_physical_outputs () const
 {
 	int n_midi = 0;
 	int n_audio = 0;
-	for (size_t i = 0; i < _ports.size (); ++i) {
-		DummyPort* port = _ports[i];
+	for (PortIndex::const_iterator i = _ports.begin (); i != _ports.end (); ++i) {
+		DummyPort* port = *i;
 		if (port->is_output () && port->is_physical ()) {
 			switch (port->type ()) {
 				case DataType::AUDIO: ++n_audio; break;
@@ -1185,8 +1263,8 @@ DummyAudioBackend::n_physical_inputs () const
 {
 	int n_midi = 0;
 	int n_audio = 0;
-	for (size_t i = 0; i < _ports.size (); ++i) {
-		DummyPort* port = _ports[i];
+	for (PortIndex::const_iterator i = _ports.begin (); i != _ports.end (); ++i) {
+		DummyPort* port = *i;
 		if (port->is_input () && port->is_physical ()) {
 			switch (port->type ()) {
 				case DataType::AUDIO: ++n_audio; break;
@@ -1456,7 +1534,7 @@ int DummyPort::connect (DummyPort *port)
 
 void DummyPort::_connect (DummyPort *port, bool callback)
 {
-	_connections.push_back (port);
+	_connections.insert (port);
 	if (callback) {
 		port->_connect (this, false);
 		_dummy_backend.port_connect_callback (name(),  port->name(), true);
@@ -1482,12 +1560,9 @@ int DummyPort::disconnect (DummyPort *port)
 
 void DummyPort::_disconnect (DummyPort *port, bool callback)
 {
-	std::vector<DummyPort*>::iterator it = std::find (_connections.begin (), _connections.end (), port);
-
+	std::set<DummyPort*>::iterator it = _connections.find (port);
 	assert (it != _connections.end ());
-
 	_connections.erase (it);
-
 	if (callback) {
 		port->_disconnect (this, false);
 		_dummy_backend.port_connect_callback (name(),  port->name(), false);
@@ -1498,21 +1573,22 @@ void DummyPort::_disconnect (DummyPort *port, bool callback)
 void DummyPort::disconnect_all ()
 {
 	while (!_connections.empty ()) {
-		_connections.back ()->_disconnect (this, false);
-		_dummy_backend.port_connect_callback (name(),  _connections.back ()->name(), false);
-		_connections.pop_back ();
+		std::set<DummyPort*>::iterator it = _connections.begin ();
+		(*it)->_disconnect (this, false);
+		_dummy_backend.port_connect_callback (name(), (*it)->name(), false);
+		_connections.erase (it);
 	}
 }
 
 bool
 DummyPort::is_connected (const DummyPort *port) const
 {
-	return std::find (_connections.begin (), _connections.end (), port) != _connections.end ();
+	return _connections.find (const_cast<DummyPort *>(port)) != _connections.end ();
 }
 
 bool DummyPort::is_physically_connected () const
 {
-	for (std::vector<DummyPort*>::const_iterator it = _connections.begin (); it != _connections.end (); ++it) {
+	for (std::set<DummyPort*>::const_iterator it = _connections.begin (); it != _connections.end (); ++it) {
 		if ((*it)->is_physical ()) {
 			return true;
 		}
@@ -1588,8 +1664,42 @@ DummyAudioPort::~DummyAudioPort () {
 	_wavetable = 0;
 }
 
-void DummyAudioPort::setup_generator (GeneratorType const g, float const samplerate)
+static std::string format_hz (float freq) {
+	std::stringstream ss;
+	if (freq >= 10000) {
+		ss <<  std::setprecision (1) << std::fixed << freq / 1000 << "kHz";
+	} else if (freq >= 1000) {
+		ss <<  std::setprecision (2) << std::fixed << freq / 1000 << "kHz";
+	} else {
+		ss <<  std::setprecision (1) << std::fixed << freq << "Hz";
+	}
+	return ss.str ();
+}
+
+static size_t fit_wave (float freq, float rate, float precision = 0.001) {
+	const size_t max_mult = floor (freq * rate);
+	float minErr = 2;
+	size_t fact = 1;
+	for (size_t i = 1; i < max_mult; ++i) {
+		const float isc = rate * (float)i / freq; // ideal sample count
+		const float rsc = rintf (isc); // rounded sample count
+		const float err = fabsf (isc - rsc);
+		if (err < minErr) {
+			minErr = err;
+			fact = i;
+		}
+		if (err < precision) {
+			break;
+		}
+	}
+	//printf(" FIT %8.1f Hz / %8.1f Hz * %ld = %.0f (err: %e)\n", freq, rate, fact, fact * rate / freq, minErr);
+	return fact;
+}
+
+std::string
+DummyAudioPort::setup_generator (GeneratorType const g, float const samplerate, int c, int total)
 {
+	std::string name;
 	DummyPort::setup_random_number_generator();
 	_gen_type = g;
 
@@ -1598,16 +1708,37 @@ void DummyAudioPort::setup_generator (GeneratorType const g, float const sampler
 		case PonyNoise:
 		case UniformWhiteNoise:
 		case GaussianWhiteNoise:
+		case DC05:
 		case Silence:
 			break;
+		case Demolition:
+			_gen_period = 3 * samplerate;
+			break;
 		case KronekerDelta:
 			_gen_period = (5 + randi() % (int)(samplerate / 20.f));
+			name = "Delta " + format_hz (samplerate / _gen_period);
 			break;
 		case SquareWave:
 			_gen_period = (5 + randi() % (int)(samplerate / 20.f)) & ~1;
+			name = "Square " + format_hz (samplerate / _gen_period);
+			break;
+		case SineWaveOctaves:
+			{
+				const int x = c - floor (((float)total / 2));
+				float f = powf (2.f, x / 3.f) * 1000.f;
+				f = std::max (10.f, std::min (samplerate *.5f, f));
+				const size_t mult = fit_wave (f, samplerate);
+				_gen_period = rintf ((float)mult * samplerate / f);
+				name = "Sine " + format_hz (samplerate * mult / (float)_gen_period);
+				_wavetable = (Sample*) malloc (_gen_period * sizeof(Sample));
+				for (uint32_t i = 0 ; i < _gen_period; ++i) {
+					_wavetable[i] = .12589f * sinf(2.0f * M_PI * (float)mult * (float)i / (float)(_gen_period)); // -18dBFS
+				}
+			}
 			break;
 		case SineWave:
 			_gen_period = 5 + randi() % (int)(samplerate / 20.f);
+			name = "Sine " + format_hz (samplerate / _gen_period);
 			_wavetable = (Sample*) malloc (_gen_period * sizeof(Sample));
 			for (uint32_t i = 0 ; i < _gen_period; ++i) {
 				_wavetable[i] = .12589f * sinf(2.0f * M_PI * (float)i / (float)_gen_period); // -18dBFS
@@ -1666,6 +1797,7 @@ void DummyAudioPort::setup_generator (GeneratorType const g, float const sampler
 			_wavetable = (Sample*) malloc (DummyAudioBackend::max_buffer_size() * sizeof(Sample));
 			break;
 	}
+	return name;
 }
 
 void DummyAudioPort::midi_to_wavetable (DummyMidiBuffer const * const src, size_t n_samples)
@@ -1720,6 +1852,23 @@ float DummyAudioPort::grandf ()
 	return r * x1;
 }
 
+/* inspired by jack-demolition by Steve Harris */
+static const float _demolition[] = {
+	 0.0f,           /* special case - 0dbFS white noise */
+	 0.0f,           /* zero, may cause denomrals following a signal */
+	 0.73 / 1e45,    /* very small - should be denormal when floated */
+	 3.7f,           /* arbitrary number > 0dBFS */
+	-4.3f,           /* arbitrary negative number > 0dBFS */
+	 4294967395.0f,  /* 2^16 + 100 */
+	-4294967395.0f,
+	 HUGE,           /* Big, non-inf number */
+	 INFINITY,       /* +inf */
+	-INFINITY,       /* -inf */
+	-NAN,            /* -nan */
+	 NAN,            /*  nan */
+	 0.0f,           /* some silence to check for recovery */
+};
+
 void DummyAudioPort::generate (const pframes_t n_samples)
 {
 	Glib::Threads::Mutex::Lock lm (generator_lock);
@@ -1731,6 +1880,30 @@ void DummyAudioPort::generate (const pframes_t n_samples)
 		case Silence:
 			memset (_buffer, 0, n_samples * sizeof (Sample));
 			break;
+		case DC05:
+			for (pframes_t i = 0 ; i < n_samples; ++i) {
+				_buffer[i] = 0.5f;
+			}
+			break;
+		case Demolition:
+			switch (_gen_count2) {
+				case 0: // noise
+					for (pframes_t i = 0 ; i < n_samples; ++i) {
+						_buffer[i] = randf();
+					}
+					break;
+				default:
+					for (pframes_t i = 0 ; i < n_samples; ++i) {
+						_buffer[i] = _demolition [_gen_count2];
+					}
+					break;
+			}
+			_gen_offset += n_samples;
+			if (_gen_offset > _gen_period) {
+				_gen_offset = 0;
+				_gen_count2 = (_gen_count2 + 1) % (sizeof (_demolition) / sizeof (float));
+			}
+			break;
 		case SquareWave:
 			assert(_gen_period > 0);
 			for (pframes_t i = 0 ; i < n_samples; ++i) {
@@ -1768,6 +1941,7 @@ void DummyAudioPort::generate (const pframes_t n_samples)
 		case Loopback:
 			_gen_period = n_samples; // XXX DummyBackend::_samples_per_period;
 		case SineWave:
+		case SineWaveOctaves:
 		case SineSweep:
 		case SquareSweep:
 			assert(_wavetable && _gen_period > 0);
@@ -1829,8 +2003,9 @@ void DummyAudioPort::generate (const pframes_t n_samples)
 void* DummyAudioPort::get_buffer (pframes_t n_samples)
 {
 	if (is_input ()) {
-		std::vector<DummyPort*>::const_iterator it = get_connections ().begin ();
-		if (it == get_connections ().end ()) {
+		const std::set<DummyPort *>& connections = get_connections ();
+		std::set<DummyPort*>::const_iterator it = connections.begin ();
+		if (it == connections.end ()) {
 			memset (_buffer, 0, n_samples * sizeof (Sample));
 		} else {
 			DummyAudioPort * source = static_cast<DummyAudioPort*>(*it);
@@ -1839,7 +2014,7 @@ void* DummyAudioPort::get_buffer (pframes_t n_samples)
 				source->get_buffer(n_samples); // generate signal.
 			}
 			memcpy (_buffer, source->const_buffer (), n_samples * sizeof (Sample));
-			while (++it != get_connections ().end ()) {
+			while (++it != connections.end ()) {
 				source = static_cast<DummyAudioPort*>(*it);
 				assert (source && source->is_output ());
 				Sample* dst = buffer ();
@@ -1890,13 +2065,15 @@ void DummyMidiPort::set_loopback (DummyMidiBuffer const * const src)
 	}
 }
 
-void DummyMidiPort::setup_generator (int seq_id, const float sr)
+std::string
+DummyMidiPort::setup_generator (int seq_id, const float sr)
 {
 	DummyPort::setup_random_number_generator();
 	_midi_seq_dat = DummyMidiData::sequences[seq_id % NUM_MIDI_EVENT_GENERATORS];
 	_midi_seq_spb = sr * .5f; // 120 BPM, beat_time 1.0 per beat.
 	_midi_seq_pos = 0;
 	_midi_seq_time = 0;
+	return DummyMidiData::sequence_names[seq_id];
 }
 
 void DummyMidiPort::midi_generate (const pframes_t n_samples)
@@ -1944,8 +2121,9 @@ void* DummyMidiPort::get_buffer (pframes_t n_samples)
 {
 	if (is_input ()) {
 		_buffer.clear ();
-		for (std::vector<DummyPort*>::const_iterator i = get_connections ().begin ();
-				i != get_connections ().end ();
+		const std::set<DummyPort*>& connections = get_connections ();
+		for (std::set<DummyPort*>::const_iterator i = connections.begin ();
+				i != connections.end ();
 				++i) {
 			DummyMidiPort * source = static_cast<DummyMidiPort*>(*i);
 			if (source->is_physical() && source->is_terminal()) {
diff --git a/libs/backends/dummy/dummy_audiobackend.h b/libs/backends/dummy/dummy_audiobackend.h
index b235d10..db4f191 100644
--- a/libs/backends/dummy/dummy_audiobackend.h
+++ b/libs/backends/dummy/dummy_audiobackend.h
@@ -30,6 +30,7 @@
 
 #include <boost/shared_ptr.hpp>
 
+#include "pbd/natsort.h"
 #include "ardour/types.h"
 #include "ardour/audio_backend.h"
 #include "ardour/dsp_load_calculator.h"
@@ -42,7 +43,7 @@ namespace DummyMidiData {
 	typedef struct _MIDISequence {
 		float   beat_time;
 		uint8_t size;
-		uint8_t event[3];
+		uint8_t event[10];
 	} MIDISequence;
 };
 
@@ -72,9 +73,11 @@ class DummyPort {
 		virtual ~DummyPort ();
 
 		const std::string& name () const { return _name; }
+		const std::string& pretty_name () const { return _pretty_name; }
 		PortFlags flags () const { return _flags; }
 
 		int set_name (const std::string &name) { _name = name; return 0; }
+		int set_pretty_name (const std::string &name) { _pretty_name = name; return 0; }
 
 		virtual DataType type () const = 0;
 
@@ -86,7 +89,7 @@ class DummyPort {
 		bool is_connected (const DummyPort *port) const;
 		bool is_physically_connected () const;
 
-		const std::vector<DummyPort *>& get_connections () const { return _connections; }
+		const std::set<DummyPort *>& get_connections () const { return _connections; }
 
 		int connect (DummyPort *port);
 		int disconnect (DummyPort *port);
@@ -115,10 +118,11 @@ class DummyPort {
 	private:
 		DummyAudioBackend &_dummy_backend;
 		std::string _name;
+		std::string _pretty_name;
 		const PortFlags _flags;
 		LatencyRange _capture_latency_range;
 		LatencyRange _playback_latency_range;
-		std::vector<DummyPort*> _connections;
+		std::set<DummyPort*> _connections;
 
 		void _connect (DummyPort* , bool);
 		void _disconnect (DummyPort* , bool);
@@ -149,11 +153,14 @@ class DummyAudioPort : public DummyPort {
 
 		enum GeneratorType {
 			Silence,
+			DC05,
+			Demolition,
 			UniformWhiteNoise,
 			GaussianWhiteNoise,
 			PinkNoise,
 			PonyNoise,
 			SineWave,
+			SineWaveOctaves,
 			SquareWave,
 			KronekerDelta,
 			SineSweep,
@@ -162,7 +169,7 @@ class DummyAudioPort : public DummyPort {
 			SquareSweepSwell,
 			Loopback,
 		};
-		void setup_generator (GeneratorType const, float const);
+		std::string setup_generator (GeneratorType const, float const, int, int);
 		void fill_wavetable (const float* d, size_t n_samples) { assert(_wavetable != 0);  memcpy(_wavetable, d, n_samples * sizeof(float)); }
 		void midi_to_wavetable (DummyMidiBuffer const * const src, size_t n_samples);
 
@@ -200,7 +207,7 @@ class DummyMidiPort : public DummyPort {
 		void* get_buffer (pframes_t nframes);
 		const DummyMidiBuffer * const_buffer () const { return &_buffer; }
 
-		void setup_generator (int, float const);
+		std::string setup_generator (int, float const);
 		void set_loopback (DummyMidiBuffer const * const src);
 
 	private:
@@ -321,6 +328,9 @@ class DummyAudioBackend : public AudioBackend {
 		std::string get_port_name (PortHandle) const;
 		PortHandle  get_port_by_name (const std::string&) const;
 
+		int get_port_property (PortHandle, const std::string& key, std::string& value, std::string& type) const;
+		int set_port_property (PortHandle, const std::string& key, const std::string& value, const std::string& type);
+
 		int get_ports (const std::string& port_name_pattern, DataType type, PortFlags flags, std::vector<std::string>&) const;
 
 		DataType port_data_type (PortHandle) const;
@@ -441,7 +451,19 @@ class DummyAudioBackend : public AudioBackend {
 		std::vector<DummyAudioPort *> _system_outputs;
 		std::vector<DummyMidiPort *> _system_midi_in;
 		std::vector<DummyMidiPort *> _system_midi_out;
-		std::vector<DummyPort *> _ports;
+
+		struct SortByPortName
+		{
+			bool operator ()(const DummyPort* lhs, const DummyPort* rhs) const
+			{
+				return PBD::naturally_less (lhs->name ().c_str (), rhs->name ().c_str ());
+			}
+		};
+
+		typedef std::map<std::string, DummyPort *> PortMap; // fast lookup in _ports
+		typedef std::set<DummyPort *, SortByPortName> PortIndex; // fast lookup in _ports
+		PortMap _portmap;
+		PortIndex _ports;
 
 		struct PortConnectData {
 			std::string a;
@@ -469,16 +491,15 @@ class DummyAudioBackend : public AudioBackend {
 		}
 
 		bool valid_port (PortHandle port) const {
-			return std::find (_ports.begin (), _ports.end (), (DummyPort*)port) != _ports.end ();
+			return std::find (_ports.begin(), _ports.end(), static_cast<DummyPort*>(port)) != _ports.end ();
 		}
 
-		DummyPort * find_port (const std::string& port_name) const {
-			for (std::vector<DummyPort*>::const_iterator it = _ports.begin (); it != _ports.end (); ++it) {
-				if ((*it)->name () == port_name) {
-					return *it;
-				}
+		DummyPort* find_port (const std::string& port_name) const {
+			PortMap::const_iterator it = _portmap.find (port_name);
+			if (it == _portmap.end()) {
+				return NULL;
 			}
-			return NULL;
+			return (*it).second;
 		}
 
 }; // class DummyAudioBackend
diff --git a/libs/backends/dummy/dummy_midi_seq.h b/libs/backends/dummy/dummy_midi_seq.h
index 810cb53..e809a47 100644
--- a/libs/backends/dummy/dummy_midi_seq.h
+++ b/libs/backends/dummy/dummy_midi_seq.h
@@ -754,7 +754,20 @@ static const MIDISequence s5[] = { // channel1, CCs only
 	{ 5.00, 3, {0xff,  255, 0xff} }, // sentinel
 };
 
-static const MIDISequence s6[] = { // channel1, nonsense
+
+static const MIDISequence s6[] = { // Keypressure, Aftertouch
+	{ 0.00, 3, {0x90,  64, 0x7f} },
+	{ 0.25, 3, {0xa0,  64, 0x40} },
+	{ 0.50, 3, {0xa0,  64, 0x60} },
+	{ 0.75, 3, {0xa0,  64, 0x7f} },
+	{ 1.00, 3, {0xa0,  64, 0x7f} },
+	{ 1.25, 3, {0xa0,  64, 0x00} },
+	{ 1.50, 3, {0x80,  64, 0x00} },
+	{ 2.00, 3, {0xff, 255, 0xff} }, // sentinel
+};
+
+
+static const MIDISequence s7[] = { // channel1, nonsense
 	{ 0.00, 3, {0x90,   64, 0x7f} }, // note-on
 	{ 0.50, 3, {0x90,   64, 0x7f} }, // duplicate note-on
 	{ 1.00, 3, {0x80,   64, 0x00} }, // note-off
@@ -766,8 +779,253 @@ static const MIDISequence s6[] = { // channel1, nonsense
 	{ 4.00, 3, {0xff,  255, 0xff} }, // sentinel
 };
 
+static const MIDISequence s8[] = { // sysex
+	{ 0.00, 10, {0xf0, 0x7f, 0x7f, 0x01, 0x01, /*hour + tc */ 0x20, /*min*/ 0x00, /*sec*/ 0x00, /*frame*/ 0x00, 0xf7} },  // 25fps, 00:00:00:00
+	// quarter frames spacing (in samples) at 25fps: SR / (25 * 4)
+	// DummyMidiPort::setup_generator uses 120bpm ie (SR / 2)
+	// hence the spacing is: SR / (25 * 4) / (SR / 2) = 0.2
+	{ 1.00,  2, {0xf1, 0x00} },
+	{ 1.02,  2, {0xf1, 0x10} },
+	{ 1.04,  2, {0xf1, 0x20} },
+	{ 1.06,  2, {0xf1, 0x30} },
+	{ 1.08,  2, {0xf1, 0x40} },
+	{ 1.10,  2, {0xf1, 0x50} },
+	{ 1.12,  2, {0xf1, 0x60} },
+	{ 1.14,  2, {0xf1, 0x72} },
+
+	{ 1.16,  2, {0xf1, 0x02} },
+	{ 1.18,  2, {0xf1, 0x10} },
+	{ 1.20,  2, {0xf1, 0x20} },
+	{ 1.22,  2, {0xf1, 0x30} },
+	{ 1.24,  2, {0xf1, 0x40} },
+	{ 1.26,  2, {0xf1, 0x50} },
+	{ 1.28,  2, {0xf1, 0x60} },
+	{ 1.30,  2, {0xf1, 0x72} },
+
+	{ 1.32,  2, {0xf1, 0x04} },
+	{ 1.34,  2, {0xf1, 0x10} },
+	{ 1.36,  2, {0xf1, 0x20} },
+	{ 1.38,  2, {0xf1, 0x30} },
+	{ 1.40,  2, {0xf1, 0x40} },
+	{ 1.42,  2, {0xf1, 0x50} },
+	{ 1.43,  2, {0xf1, 0x60} },
+	{ 1.46,  2, {0xf1, 0x72} },
+
+	{ 1.48,  2, {0xf1, 0x06} },
+	{ 1.50,  2, {0xf1, 0x10} },
+	{ 1.52,  2, {0xf1, 0x20} },
+	{ 1.54,  2, {0xf1, 0x30} },
+	{ 1.56,  2, {0xf1, 0x40} },
+	{ 1.58,  2, {0xf1, 0x50} },
+	{ 1.60,  2, {0xf1, 0x60} },
+	{ 1.62,  2, {0xf1, 0x72} },
+
+	{ 1.64,  2, {0xf1, 0x08} },
+	{ 1.66,  2, {0xf1, 0x10} },
+	{ 1.68,  2, {0xf1, 0x20} },
+	{ 1.70,  2, {0xf1, 0x30} },
+	{ 1.72,  2, {0xf1, 0x40} },
+	{ 1.74,  2, {0xf1, 0x50} },
+	{ 1.76,  2, {0xf1, 0x60} },
+	{ 1.78,  2, {0xf1, 0x72} },
+
+	{ 1.80,  2, {0xf1, 0x0a} },
+	{ 1.82,  2, {0xf1, 0x10} },
+	{ 1.84,  2, {0xf1, 0x20} },
+	{ 1.86,  2, {0xf1, 0x30} },
+	{ 1.88,  2, {0xf1, 0x40} },
+	{ 1.90,  2, {0xf1, 0x50} },
+	{ 1.92,  2, {0xf1, 0x60} },
+	{ 1.94,  2, {0xf1, 0x72} },
+
+	{ 1.96,  2, {0xf1, 0x0c} },
+	{ 1.98,  2, {0xf1, 0x10} },
+	{ 2.00,  2, {0xf1, 0x20} },
+	{ 2.02,  2, {0xf1, 0x30} },
+	{ 2.04,  2, {0xf1, 0x40} },
+	{ 2.06,  2, {0xf1, 0x50} },
+	{ 2.08,  2, {0xf1, 0x60} },
+	{ 2.10,  2, {0xf1, 0x72} },
+
+	{ 2.12,  2, {0xf1, 0x0e} },
+	{ 2.14,  2, {0xf1, 0x10} },
+	{ 2.16,  2, {0xf1, 0x20} },
+	{ 2.18,  2, {0xf1, 0x30} },
+	{ 2.20,  2, {0xf1, 0x40} },
+	{ 2.22,  2, {0xf1, 0x50} },
+	{ 2.24,  2, {0xf1, 0x60} },
+	{ 2.26,  2, {0xf1, 0x72} },
+
+	{ 2.28,  2, {0xf1, 0x00} },
+	{ 2.30,  2, {0xf1, 0x11} },
+	{ 2.32,  2, {0xf1, 0x20} },
+	{ 2.34,  2, {0xf1, 0x30} },
+	{ 2.36,  2, {0xf1, 0x40} },
+	{ 2.38,  2, {0xf1, 0x50} },
+	{ 2.40,  2, {0xf1, 0x60} },
+	{ 2.42,  2, {0xf1, 0x72} },
+
+	{ 2.44,  2, {0xf1, 0x02} },
+	{ 2.46,  2, {0xf1, 0x11} },
+	{ 2.48,  2, {0xf1, 0x20} },
+	{ 2.50,  2, {0xf1, 0x30} },
+	{ 2.52,  2, {0xf1, 0x40} },
+	{ 2.54,  2, {0xf1, 0x50} },
+	{ 2.56,  2, {0xf1, 0x60} },
+	{ 2.58,  2, {0xf1, 0x72} },
+
+	{ 2.60,  2, {0xf1, 0x04} },
+	{ 2.62,  2, {0xf1, 0x11} },
+	{ 2.64,  2, {0xf1, 0x20} },
+	{ 2.66,  2, {0xf1, 0x30} },
+	{ 2.68,  2, {0xf1, 0x40} },
+	{ 2.70,  2, {0xf1, 0x50} },
+	{ 2.72,  2, {0xf1, 0x60} },
+	{ 2.74,  2, {0xf1, 0x72} },
+
+	{ 2.76,  2, {0xf1, 0x06} },
+	{ 2.78,  2, {0xf1, 0x11} },
+	{ 2.80,  2, {0xf1, 0x20} },
+	{ 2.82,  2, {0xf1, 0x30} },
+	{ 2.84,  2, {0xf1, 0x40} },
+	{ 2.86,  2, {0xf1, 0x50} },
+	{ 2.88,  2, {0xf1, 0x60} },
+	{ 2.90,  2, {0xf1, 0x72} },
+
+	{ 2.92,  2, {0xf1, 0x08} },
+	{ 2.94,  2, {0xf1, 0x11} },
+	{ 2.96,  2, {0xf1, 0x20} },
+	{ 2.98,  2, {0xf1, 0x30} },
+	{ 3.00,  2, {0xf1, 0x40} },
+	{ 3.02,  2, {0xf1, 0x50} },
+	{ 3.04,  2, {0xf1, 0x60} },
+	{ 3.06,  2, {0xf1, 0x72} },
+
+	{ 3.08,  2, {0xf1, 0x01} },
+	{ 3.10,  2, {0xf1, 0x10} },
+	{ 3.12,  2, {0xf1, 0x21} },
+	{ 3.14,  2, {0xf1, 0x30} },
+	{ 3.16,  2, {0xf1, 0x40} },
+	{ 3.18,  2, {0xf1, 0x50} },
+	{ 3.20,  2, {0xf1, 0x60} },
+	{ 3.22,  2, {0xf1, 0x72} },
+
+	{ 3.24,  2, {0xf1, 0x03} },
+	{ 3.26,  2, {0xf1, 0x10} },
+	{ 3.28,  2, {0xf1, 0x21} },
+	{ 3.30,  2, {0xf1, 0x30} },
+	{ 3.32,  2, {0xf1, 0x40} },
+	{ 3.34,  2, {0xf1, 0x50} },
+	{ 3.36,  2, {0xf1, 0x60} },
+	{ 3.38,  2, {0xf1, 0x72} },
+
+	{ 3.40,  2, {0xf1, 0x05} },
+	{ 3.42,  2, {0xf1, 0x10} },
+	{ 3.44,  2, {0xf1, 0x21} },
+	{ 3.46,  2, {0xf1, 0x30} },
+	{ 3.48,  2, {0xf1, 0x40} },
+	{ 3.50,  2, {0xf1, 0x50} },
+	{ 3.52,  2, {0xf1, 0x60} },
+	{ 3.54,  2, {0xf1, 0x72} },
+
+	{ 3.56,  2, {0xf1, 0x07} },
+	{ 3.58,  2, {0xf1, 0x10} },
+	{ 3.60,  2, {0xf1, 0x21} },
+	{ 3.62,  2, {0xf1, 0x30} },
+	{ 3.64,  2, {0xf1, 0x40} },
+	{ 3.66,  2, {0xf1, 0x50} },
+	{ 3.68,  2, {0xf1, 0x60} },
+	{ 3.70,  2, {0xf1, 0x72} },
+
+	{ 3.72,  2, {0xf1, 0x09} },
+	{ 3.74,  2, {0xf1, 0x10} },
+	{ 3.76,  2, {0xf1, 0x21} },
+	{ 3.78,  2, {0xf1, 0x30} },
+	{ 3.80,  2, {0xf1, 0x40} },
+	{ 3.82,  2, {0xf1, 0x50} },
+	{ 3.84,  2, {0xf1, 0x60} },
+	{ 3.86,  2, {0xf1, 0x72} },
+
+	{ 3.88,  2, {0xf1, 0x0b} },
+	{ 3.90,  2, {0xf1, 0x10} },
+	{ 3.92,  2, {0xf1, 0x21} },
+	{ 3.94,  2, {0xf1, 0x30} },
+	{ 3.96,  2, {0xf1, 0x40} },
+	{ 3.98,  2, {0xf1, 0x50} },
+	{ 4.00,  2, {0xf1, 0x60} },
+	{ 4.02,  2, {0xf1, 0x72} },
+
+	{ 4.04,  2, {0xf1, 0x0d} },
+	{ 4.06,  2, {0xf1, 0x10} },
+	{ 4.08,  2, {0xf1, 0x21} },
+	{ 4.10,  2, {0xf1, 0x30} },
+	{ 4.12,  2, {0xf1, 0x40} },
+	{ 4.14,  2, {0xf1, 0x50} },
+	{ 4.16,  2, {0xf1, 0x60} },
+	{ 4.18,  2, {0xf1, 0x72} },
+
+	{ 4.20,  2, {0xf1, 0x0f} },
+	{ 4.22,  2, {0xf1, 0x10} },
+	{ 4.24,  2, {0xf1, 0x21} },
+	{ 4.26,  2, {0xf1, 0x30} },
+	{ 4.28,  2, {0xf1, 0x40} },
+	{ 4.30,  2, {0xf1, 0x50} },
+	{ 4.32,  2, {0xf1, 0x60} },
+	{ 4.34,  2, {0xf1, 0x72} },
+
+	{ 4.36,  2, {0xf1, 0x01} },
+	{ 4.38,  2, {0xf1, 0x11} },
+	{ 4.40,  2, {0xf1, 0x21} },
+	{ 4.42,  2, {0xf1, 0x30} },
+	{ 4.44,  2, {0xf1, 0x40} },
+	{ 4.46,  2, {0xf1, 0x50} },
+	{ 4.48,  2, {0xf1, 0x60} },
+	{ 4.50,  2, {0xf1, 0x72} },
+
+	{ 4.52,  2, {0xf1, 0x03} },
+	{ 4.54,  2, {0xf1, 0x11} },
+	{ 4.56,  2, {0xf1, 0x21} },
+	{ 4.58,  2, {0xf1, 0x30} },
+	{ 4.60,  2, {0xf1, 0x40} },
+	{ 4.62,  2, {0xf1, 0x50} },
+	{ 4.64,  2, {0xf1, 0x60} },
+	{ 4.66,  2, {0xf1, 0x72} },
+
+	{ 4.68,  2, {0xf1, 0x05} },
+	{ 4.70,  2, {0xf1, 0x11} },
+	{ 4.72,  2, {0xf1, 0x21} },
+	{ 4.74,  2, {0xf1, 0x30} },
+	{ 4.76,  2, {0xf1, 0x40} },
+	{ 4.78,  2, {0xf1, 0x50} },
+	{ 4.80,  2, {0xf1, 0x60} },
+	{ 4.82,  2, {0xf1, 0x72} },
+
+	{ 4.84,  2, {0xf1, 0x07} },
+	{ 4.86,  2, {0xf1, 0x11} },
+	{ 4.88,  2, {0xf1, 0x21} },
+	{ 4.90,  2, {0xf1, 0x30} },
+	{ 4.92,  2, {0xf1, 0x40} },
+	{ 4.94,  2, {0xf1, 0x50} },
+	{ 4.96,  2, {0xf1, 0x60} },
+	{ 4.98,  2, {0xf1, 0x72} },
+
+	{ 5.00,  3, {0xff,  255, 0xff} }, // sentinel
+};
+
 static const MIDISequence *sequences[] = {
-	s0, s1, s2, s3, s4, s5, s6
+	s0, s1, s2, s3, s4, s5, s6, s7, s8
+};
+
+static const char *sequence_names[] = {
+	"Short Sequence",
+	"Cmaj7, all channels",
+	"Note Sweep, chan 1",
+	"Velocity Sweep, chan 1",
+	"Sustain Pedal Test",
+	"CCs only",
+	"Aftertouch",
+	"Nonsense, Dups",
+	"MTC (2sec)"
 };
 
 }} // namespace
diff --git a/libs/backends/dummy/wscript b/libs/backends/dummy/wscript
index e1a5985..e674d35 100644
--- a/libs/backends/dummy/wscript
+++ b/libs/backends/dummy/wscript
@@ -25,6 +25,7 @@ def build(bld):
     obj.name     = 'dummy_audiobackend'
     obj.target   = 'dummy_audiobackend'
     obj.use      = 'libardour libpbd'
+    obj.uselib   = 'GLIBMM XML'
     obj.install_path  = os.path.join(bld.env['LIBDIR'], 'backends')
     obj.defines = ['PACKAGE="' + I18N_PACKAGE + '"',
                    'ARDOURBACKEND_DLL_EXPORTS'
diff --git a/libs/backends/jack/jack_audiobackend.cc b/libs/backends/jack/jack_audiobackend.cc
index 32c9f20..8b9e4af 100644
--- a/libs/backends/jack/jack_audiobackend.cc
+++ b/libs/backends/jack/jack_audiobackend.cc
@@ -36,7 +36,7 @@
 #include "jack_utils.h"
 #include "jack_session.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 using namespace PBD;
diff --git a/libs/backends/jack/jack_audiobackend.h b/libs/backends/jack/jack_audiobackend.h
index 54eea35..847b21b 100644
--- a/libs/backends/jack/jack_audiobackend.h
+++ b/libs/backends/jack/jack_audiobackend.h
@@ -133,6 +133,7 @@ class JACKAudioBackend : public AudioBackend {
     std::string get_port_name (PortHandle) const;
     PortHandle  get_port_by_name (const std::string&) const;
     int get_port_property (PortHandle, const std::string& key, std::string& value, std::string& type) const;
+    int set_port_property (PortHandle, const std::string& key, const std::string& value, const std::string& type);
 
     int get_ports (const std::string& port_name_pattern, DataType type, PortFlags flags, std::vector<std::string>&) const;
 
diff --git a/libs/backends/jack/jack_portengine.cc b/libs/backends/jack/jack_portengine.cc
index 10b2efe..934f8b5 100644
--- a/libs/backends/jack/jack_portengine.cc
+++ b/libs/backends/jack/jack_portengine.cc
@@ -27,7 +27,7 @@
 
 #include "ardour/port_manager.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 using namespace PBD;
@@ -147,6 +147,20 @@ JACKAudioBackend::get_port_property (PortHandle port, const std::string& key, st
 #endif
 }
 
+int
+JACKAudioBackend::set_port_property (PortHandle port, const std::string& key, const std::string& value, const std::string& type)
+{
+#ifdef HAVE_JACK_METADATA // really everyone ought to have this by now.
+	int rv = -1;
+	jack_client_t* client = _jack_connection->jack();
+	jack_uuid_t uuid = jack_port_uuid((jack_port_t*) port);
+	return jack_set_property(client, uuid, key.c_str(), value.c_str(), type.c_str());
+	return rv;
+#else
+	return -1;
+#endif
+}
+
 PortEngine::PortHandle
 JACKAudioBackend:: get_port_by_name (const std::string& name) const
 {
diff --git a/libs/backends/jack/jack_session.cc b/libs/backends/jack/jack_session.cc
index 1e9d956..0c78d9a 100644
--- a/libs/backends/jack/jack_session.cc
+++ b/libs/backends/jack/jack_session.cc
@@ -121,7 +121,7 @@ JACKSession::timebase_callback (jack_transport_state_t /*state*/,
 	TempoMetric metric (tempo_map.metric_at (tf));
 
 	try {
-		tempo_map.bbt_time_rt (tf, bbt);
+		bbt = tempo_map.bbt_at_frame (tf);
 
 		pos->bar = bbt.bars;
 		pos->beat = bbt.beats;
diff --git a/libs/backends/jack/jack_utils.cc b/libs/backends/jack/jack_utils.cc
index 6fb3201..b26cb40 100644
--- a/libs/backends/jack/jack_utils.cc
+++ b/libs/backends/jack/jack_utils.cc
@@ -55,7 +55,7 @@
 #include <CFBundle.h>
 #endif
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace PBD;
diff --git a/libs/backends/jack/wscript b/libs/backends/jack/wscript
index 17b4d16..8de15ef 100644
--- a/libs/backends/jack/wscript
+++ b/libs/backends/jack/wscript
@@ -49,7 +49,7 @@ def configure(conf):
                    uselib = 'JACK')
 
     # Check to see if jack_port_rename() is available and working
-    if Options.options.libjack_link == 'link':
+    if conf.env['libjack_link'] == 'link':
             conf.check_cxx(fragment = "#include <jack/jack.h>\nint main(void) { jack_client_t* c; jack_port_t* p; jack_port_rename (c, p, \"foo\"); return 0; }\n",
                    mandatory = False,
                    execute = False,
@@ -108,6 +108,8 @@ def build(bld):
         obj.defines += [ 'USE_WEAK_JACK', 'HAVE_JACK_PORT_RENAME' ]
         obj.deps = [ 'weak_libjack.def' ]
 
+    obj.uselib   += [ 'GLIBMM', 'XML' ];
+
     #
     # device discovery code in the jack backend needs ALSA
     # on Linux.
diff --git a/libs/backends/portaudio/portaudio_backend.cc b/libs/backends/portaudio/portaudio_backend.cc
index 616ee1d..b25a54f 100644
--- a/libs/backends/portaudio/portaudio_backend.cc
+++ b/libs/backends/portaudio/portaudio_backend.cc
@@ -41,7 +41,7 @@
 
 #include "ardour/filesystem_paths.h"
 #include "ardour/port_manager.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 #include "audio_utils.h"
 
@@ -912,6 +912,7 @@ PortAudioBackend::freewheel_process_thread()
 				_reinit_thread_callback = true; // hand over _main_thread
 				_freewheel_ack = false; // prepare next handshake
 				_midiio->set_enabled(true);
+				engine.freewheel_callback (_freewheeling);
 			} else {
 				first_run = true;
 				_freewheel = true;
@@ -1237,6 +1238,24 @@ PortAudioBackend::get_port_property (PortHandle port,
 	return -1;
 }
 
+int
+PortAudioBackend::set_port_property (PortHandle port,
+                                     const std::string& key,
+                                     const std::string& value,
+                                     const std::string& type)
+{
+	if (!valid_port (port)) {
+		DEBUG_PORTS("get_port_name: Invalid Port(s)\n");
+		return -1;
+	}
+
+	if (key == "http://jackaudio.org/metadata/pretty-name" && type.empty ()) {
+		static_cast<PamPort*>(port)->set_pretty_name (value);
+		return 0;
+	}
+	return -1;
+}
+
 PortEngine::PortHandle
 PortAudioBackend::get_port_by_name (const std::string& name) const
 {
diff --git a/libs/backends/portaudio/portaudio_backend.h b/libs/backends/portaudio/portaudio_backend.h
index 3e329a4..601c343 100644
--- a/libs/backends/portaudio/portaudio_backend.h
+++ b/libs/backends/portaudio/portaudio_backend.h
@@ -267,6 +267,7 @@ class PortAudioBackend : public AudioBackend {
 		std::string get_port_name (PortHandle) const;
 		PortHandle  get_port_by_name (const std::string&) const;
 		int get_port_property (PortHandle, const std::string& key, std::string& value, std::string& type) const;
+		int set_port_property (PortHandle, const std::string& key, const std::string& value, const std::string& type);
 
 		int get_ports (const std::string& port_name_pattern, DataType type, PortFlags flags, std::vector<std::string>&) const;
 
diff --git a/libs/backends/portaudio/winmmemidi_io.cc b/libs/backends/portaudio/winmmemidi_io.cc
index c7e465e..0c321ec 100644
--- a/libs/backends/portaudio/winmmemidi_io.cc
+++ b/libs/backends/portaudio/winmmemidi_io.cc
@@ -18,6 +18,7 @@
 
 #include <windows.h>
 #include <mmsystem.h>
+#include <glibmm.h>
 
 #include <sstream>
 #include <set>
@@ -29,7 +30,7 @@
 #include "winmmemidi_io.h"
 #include "debug.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 
@@ -223,7 +224,7 @@ WinMMEMidiIO::get_input_name_from_index (int index, std::string& name)
 		                          capabilities.wMid,
 		                          capabilities.wPid));
 
-		name = capabilities.szPname;
+		name = Glib::locale_to_utf8 (capabilities.szPname);
 		return true;
 	} else {
 		DEBUG_MIDI ("Unable to get WinMME input device capabilities\n");
@@ -241,7 +242,8 @@ WinMMEMidiIO::get_output_name_from_index (int index, std::string& name)
 		                          capabilities.szPname,
 		                          capabilities.wMid,
 		                          capabilities.wPid));
-		name = capabilities.szPname;
+
+		name = Glib::locale_to_utf8 (capabilities.szPname);
 		return true;
 	} else {
 		DEBUG_MIDI ("Unable to get WinMME output device capabilities\n");
diff --git a/libs/backends/portaudio/wscript b/libs/backends/portaudio/wscript
index 1c6af9f..150b176 100644
--- a/libs/backends/portaudio/wscript
+++ b/libs/backends/portaudio/wscript
@@ -32,7 +32,7 @@ def build_portaudio (bld, name, defines):
     obj.name     = name
     obj.target   = name
     obj.use      = 'libardour libpbd'
-    obj.uselib   = ['PORTAUDIO']
+    obj.uselib   = 'PORTAUDIO GLIBMM XML'
     obj.install_path  = os.path.join(bld.env['LIBDIR'], 'backends')
     obj.defines = ['PACKAGE="' + I18N_PACKAGE + '"',
                    'ARDOURBACKEND_DLL_EXPORTS',
diff --git a/libs/canvas/MSVCcanvas/cairocanvas.vcproj b/libs/canvas/MSVCcanvas/cairocanvas.vcproj
index 56f3fb1..7384a89 100644
--- a/libs/canvas/MSVCcanvas/cairocanvas.vcproj
+++ b/libs/canvas/MSVCcanvas/cairocanvas.vcproj
@@ -41,8 +41,8 @@
 				Name="VCCLCompilerTool"
 				AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
 				Optimization="0"
-				AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;..\..\gtkmm2ext;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\timecode;..\..\rubberband;"..\..\vamp-sdk";"..\..\midi++2";..\..\taglib;..\..\taglib\taglib;..\..\taglib\taglib\toolkit;..\..\audiographer;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\glibmm";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor";"$(GenericIncludeFolder)\lilv-0";"$(GenericIncludeFolder)\suil-0";"$(GenericIncludeFolder)\serd-0";"$(GenericIncludeFolder)\sord-0";"$(GenericIncludeFolder)\lv2";"$(GenericIncludeFolder)\sratom-0""
-				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;BUILDING_CAIROCANVAS;CANVAS_COMPATIBILITY;USE_CAIRO_IMAGE_SURFACE;CANVAS_DEBUG;LIBCANVAS_STATIC;RUBBERBAND_IS_IN_WIN_STATIC_LIB;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_DEBUG;DEBUG="Debug";ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PACKAGE="\"cairocanvas\"";PROGRAM_NAME="\"Mixbus3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+				AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;..\..\gtkmm2ext;..\..\lua;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\timecode;..\..\rubberband;"..\..\vamp-sdk";"..\..\midi++2";..\..\taglib;..\..\taglib\taglib;..\..\taglib\taglib\toolkit;..\..\audiographer;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\glibmm";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor";"$(GenericIncludeFolder)\lilv-0";"$(GenericIncludeFolder)\suil-0";"$(GenericIncludeFolder)\serd-0";"$(GenericIncludeFolder)\sord-0";"$(GenericIncludeFolder)\lv2";"$(GenericIncludeFolder)\sratom-0""
+				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;BUILDING_CAIROCANVAS;CANVAS_COMPATIBILITY;USE_CAIRO_IMAGE_SURFACE;CANVAS_DEBUG;LIBCANVAS_STATIC;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_DEBUG;DEBUG="Debug";ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PACKAGE="\"cairocanvas\"";PROGRAM_NAME="\"Mixbus3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
 				MinimalRebuild="true"
 				RuntimeLibrary="3"
 				WarningLevel="3"
@@ -109,8 +109,8 @@
 				AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
 				Optimization="2"
 				InlineFunctionExpansion="1"
-				AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;..\..\gtkmm2ext;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\timecode;..\..\rubberband;"..\..\vamp-sdk";"..\..\midi++2";..\..\taglib;..\..\taglib\taglib;..\..\taglib\taglib\toolkit;..\..\audiographer;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\glibmm";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor";"$(GenericIncludeFolder)\lilv-0";"$(GenericIncludeFolder)\suil-0";"$(GenericIncludeFolder)\serd-0";"$(GenericIncludeFolder)\sord-0";"$(GenericIncludeFolder)\lv2";"$(GenericIncludeFolder)\sratom-0""
-				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_CAIROCANVAS;CANVAS_COMPATIBILITY;USE_CAIRO_IMAGE_SURFACE;LIBCANVAS_STATIC;RUBBERBAND_IS_IN_WIN_STATIC_LIB;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;NDEBUG;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PACKAGE="\"cairocanvas\"";PROGRAM_NAME="\"Mixbus3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+				AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;..\..\gtkmm2ext;..\..\lua;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\timecode;..\..\rubberband;"..\..\vamp-sdk";"..\..\midi++2";..\..\taglib;..\..\taglib\taglib;..\..\taglib\taglib\toolkit;..\..\audiographer;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\glibmm";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor";"$(GenericIncludeFolder)\lilv-0";"$(GenericIncludeFolder)\suil-0";"$(GenericIncludeFolder)\serd-0";"$(GenericIncludeFolder)\sord-0";"$(GenericIncludeFolder)\lv2";"$(GenericIncludeFolder)\sratom-0""
+				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_CAIROCANVAS;CANVAS_COMPATIBILITY;USE_CAIRO_IMAGE_SURFACE;LIBCANVAS_STATIC;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;NDEBUG;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PACKAGE="\"cairocanvas\"";PROGRAM_NAME="\"Mixbus3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
 				StringPooling="false"
 				RuntimeLibrary="2"
 				EnableEnhancedInstructionSet="1"
@@ -174,8 +174,8 @@
 				Name="VCCLCompilerTool"
 				AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
 				Optimization="0"
-				AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;..\..\gtkmm2ext;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\timecode;..\..\rubberband;"..\..\vamp-sdk";"..\..\midi++2";..\..\taglib;..\..\taglib\taglib;..\..\taglib\taglib\toolkit;..\..\audiographer;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\glibmm";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor";"$(GenericIncludeFolder)\lilv-0";"$(GenericIncludeFolder)\suil-0";"$(GenericIncludeFolder)\serd-0";"$(GenericIncludeFolder)\sord-0";"$(GenericIncludeFolder)\lv2";"$(GenericIncludeFolder)\sratom-0""
-				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_CAIROCANVAS;CANVAS_COMPATIBILITY;USE_CAIRO_IMAGE_SURFACE;CANVAS_DEBUG;LIBCANVAS_STATIC;RUBBERBAND_IS_IN_WIN_STATIC_LIB;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PACKAGE="\"cairocanvas\"";PROGRAM_NAME="\"Mixbus3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+				AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;..\..\gtkmm2ext;..\..\lua;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\timecode;..\..\rubberband;"..\..\vamp-sdk";"..\..\midi++2";..\..\taglib;..\..\taglib\taglib;..\..\taglib\taglib\toolkit;..\..\audiographer;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\glibmm";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor";"$(GenericIncludeFolder)\lilv-0";"$(GenericIncludeFolder)\suil-0";"$(GenericIncludeFolder)\serd-0";"$(GenericIncludeFolder)\sord-0";"$(GenericIncludeFolder)\lv2";"$(GenericIncludeFolder)\sratom-0""
+				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_CAIROCANVAS;CANVAS_COMPATIBILITY;USE_CAIRO_IMAGE_SURFACE;CANVAS_DEBUG;LIBCANVAS_STATIC;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PACKAGE="\"cairocanvas\"";PROGRAM_NAME="\"Mixbus3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
 				StringPooling="false"
 				RuntimeLibrary="2"
 				EnableEnhancedInstructionSet="1"
@@ -267,6 +267,10 @@
 				>
 			</File>
 			<File
+				RelativePath="..\framed_curve.cc"
+				>
+			</File>
+			<File
 				RelativePath="..\image.cc"
 				>
 			</File>
@@ -405,11 +409,11 @@
 				>
 			</File>
 			<File
-				RelativePath="..\canvas\fwd.h"
+				RelativePath="..\canvas\framed_curve.h"
 				>
 			</File>
 			<File
-				RelativePath="..\i18n.h"
+				RelativePath="..\canvas\fwd.h"
 				>
 			</File>
 			<File
diff --git a/libs/canvas/canvas.cc b/libs/canvas/canvas.cc
index 6bf1959..22c5860 100644
--- a/libs/canvas/canvas.cc
+++ b/libs/canvas/canvas.cc
@@ -32,6 +32,8 @@
 #include <gtkmm/label.h>
 #include <gtkmm/window.h>
 
+#include "gtkmm2ext/persistent_tooltip.h"
+
 #include "pbd/compose.h"
 #include "pbd/stacktrace.h"
 
@@ -1145,7 +1147,7 @@ GtkCanvas::start_tooltip_timeout (Item* item)
 {
 	stop_tooltip_timeout ();
 
-	if (item) {
+	if (item && Gtkmm2ext::PersistentTooltip::tooltips_enabled ()) {
 		current_tooltip_item = item;
 
 		/* wait for the first idle that happens after this is
@@ -1161,7 +1163,7 @@ GtkCanvas::start_tooltip_timeout (Item* item)
 bool
 GtkCanvas::really_start_tooltip_timeout ()
 {
-	/* an idle has occured since we entered a tooltip-bearing widget. Now
+	/* an idle has occurred since we entered a tooltip-bearing widget. Now
 	 * wait 1 second and if the timeout isn't cancelled, show the tooltip.
 	 */
 
diff --git a/libs/canvas/canvas/colors.h b/libs/canvas/canvas/colors.h
index 2a3cbb2..b2f6c1e 100644
--- a/libs/canvas/canvas/colors.h
+++ b/libs/canvas/canvas/colors.h
@@ -35,6 +35,7 @@ extern LIBCANVAS_API Color change_alpha (Color, double alpha);
 
 extern LIBCANVAS_API Color hsva_to_color (double h, double s, double v, double a = 1.0);
 extern LIBCANVAS_API void  color_to_hsva (Color color, double& h, double& s, double& v, double& a);
+extern LIBCANVAS_API Color color_at_alpha (Color, double a);
 extern LIBCANVAS_API void  color_to_hsv (Color color, double& h, double& s, double& v);
 extern LIBCANVAS_API void  color_to_rgba (Color, double& r, double& g, double& b, double& a);
 extern LIBCANVAS_API Color rgba_to_color (double r, double g, double b, double a);
diff --git a/libs/canvas/canvas/framed_curve.h b/libs/canvas/canvas/framed_curve.h
new file mode 100644
index 0000000..9e99c59
--- /dev/null
+++ b/libs/canvas/canvas/framed_curve.h
@@ -0,0 +1,66 @@
+/*
+    Copyright (C) 2013 Paul Davis
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#ifndef __CANVAS_FRAMED_CURVE_H__
+#define __CANVAS_FRAMED_CURVE_H__
+
+#include "canvas/visibility.h"
+
+#include "canvas/interpolated_curve.h"
+#include "canvas/poly_item.h"
+#include "canvas/fill.h"
+
+/* similar to a Curve, with the first point being a height definition rather than a point to
+   interpolate.
+*/
+
+namespace ArdourCanvas {
+
+class LIBCANVAS_API FramedCurve : public PolyItem, public InterpolatedCurve
+{
+  public:
+    FramedCurve (Canvas*);
+    FramedCurve (Item*);
+
+    enum CurveFill {
+	    None,
+	    Inside,
+	    Outside,
+    };
+
+    void compute_bounding_box () const;
+    void render (Rect const & area, Cairo::RefPtr<Cairo::Context>) const;
+    void set (Points const &);
+
+    void set_points_per_segment (uint32_t n);
+
+    bool covers (Duple const &) const;
+    void set_fill_mode (CurveFill cf) { curve_fill = cf; }
+
+  private:
+    Points samples;
+    Points::size_type n_samples;
+    uint32_t points_per_segment;
+    CurveFill curve_fill;
+
+    void interpolate ();
+};
+
+}
+
+#endif
diff --git a/libs/canvas/canvas/poly_item.h b/libs/canvas/canvas/poly_item.h
index bdb7c20..311ca80 100644
--- a/libs/canvas/canvas/poly_item.h
+++ b/libs/canvas/canvas/poly_item.h
@@ -32,7 +32,7 @@ public:
 	PolyItem (Canvas*);
 	PolyItem (Item*);
 
-	void compute_bounding_box () const;
+	virtual void compute_bounding_box () const;
 
 	virtual void set (Points const &);
 	Points const & get () const;
diff --git a/libs/canvas/canvas/poly_line.h b/libs/canvas/canvas/poly_line.h
index fce013d..7c68947 100644
--- a/libs/canvas/canvas/poly_line.h
+++ b/libs/canvas/canvas/poly_line.h
@@ -28,15 +28,16 @@ namespace ArdourCanvas {
 
 class LIBCANVAS_API PolyLine : public PolyItem
 {
-  public:
+public:
 	PolyLine (Canvas*);
 	PolyLine (Item*);
 
 	void render (Rect const & area, Cairo::RefPtr<Cairo::Context>) const;
 
 	virtual void set_steps (Points const &, bool stepped);
+	virtual void compute_bounding_box () const;
 
-        bool covers (Duple const &) const;
+	bool covers (Duple const &) const;
 	/**
 	 * Set the distance at which a point will be considered to be covered
 	 * by the line. For the definition of "distance" see
@@ -44,8 +45,11 @@ class LIBCANVAS_API PolyLine : public PolyItem
 	 */
 	void set_covers_threshold (double);
 
-  private:
+	void set_fill_y1 (double);
+
+private:
 	double _threshold;
+	double _y1;
 };
 
 }
diff --git a/libs/canvas/canvas/ruler.h b/libs/canvas/canvas/ruler.h
index 0a2e435..751ddcc 100644
--- a/libs/canvas/canvas/ruler.h
+++ b/libs/canvas/canvas/ruler.h
@@ -60,14 +60,18 @@ public:
 	Ruler (Item*, const Metric& m);
 	Ruler (Item*, const Metric& m, Rect const&);
 
+	virtual ~Ruler () {
+		delete _font_description;
+	}
+
 	void set_range (double lower, double upper);
 	void set_font_description (Pango::FontDescription);
 	void set_metric (const Metric&);
 
 	void render (Rect const & area, Cairo::RefPtr<Cairo::Context>) const;
 
-        void set_divide_colors (Color top, Color bottom);
-        void set_divide_height (double);
+	void set_divide_colors (Color top, Color bottom);
+	void set_divide_height (double);
 private:
 	const Metric* _metric;
 
@@ -76,9 +80,9 @@ private:
 
 	Coord         _lower;
 	Coord         _upper;
-        double        _divide_height;
-        Color         _divider_color_top;
-        Color         _divider_color_bottom;
+	double        _divide_height;
+	Color         _divider_color_top;
+	Color         _divider_color_bottom;
 
 	Pango::FontDescription* _font_description;
 	mutable std::vector<Mark> marks;
diff --git a/libs/canvas/colors.cc b/libs/canvas/colors.cc
index 19c5226..7a108e7 100644
--- a/libs/canvas/colors.cc
+++ b/libs/canvas/colors.cc
@@ -259,6 +259,7 @@ HSV::HSV (const std::string& str)
 string
 HSV::to_string () const
 {
+	PBD::LocaleGuard lg;
 	stringstream ss;
 	ss << h << ' ';
 	ss << s << ' ';
@@ -596,7 +597,7 @@ SVAModifier::from_string (string const & str)
 string
 SVAModifier::to_string () const
 {
-	PBD::LocaleGuard lg ("C");
+	PBD::LocaleGuard lg;
 	stringstream ss;
 
 	switch (type) {
@@ -658,3 +659,10 @@ SVAModifier::operator () (HSV& hsv)  const
 	return r;
 }
 
+ArdourCanvas::Color
+ArdourCanvas::color_at_alpha (ArdourCanvas::Color c, double a)
+{
+	double r, g, b, unused;
+	color_to_rgba (c, r, g, b, unused);
+	return rgba_to_color( r,g,b, a );
+}
diff --git a/libs/canvas/framed_curve.cc b/libs/canvas/framed_curve.cc
new file mode 100644
index 0000000..748fb03
--- /dev/null
+++ b/libs/canvas/framed_curve.cc
@@ -0,0 +1,287 @@
+/*
+    Copyright (C) 2013 Paul Davis
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#include <cmath>
+#include <exception>
+#include <algorithm>
+
+#include "canvas/framed_curve.h"
+
+using namespace ArdourCanvas;
+using std::min;
+using std::max;
+
+FramedCurve::FramedCurve (Canvas* c)
+	: PolyItem (c)
+	, n_samples (0)
+	, points_per_segment (16)
+	, curve_fill (None)
+{
+}
+
+FramedCurve::FramedCurve (Item* parent)
+	: PolyItem (parent)
+	, n_samples (0)
+	, points_per_segment (16)
+	, curve_fill (None)
+{
+}
+
+/** When rendering the curve, we will always draw a fixed number of straight
+ * line segments to span the x-axis extent of the curve. More segments:
+ * smoother visual rendering. Less rendering: closer to a visibily poly-line
+ * render.
+ */
+void
+FramedCurve::set_points_per_segment (uint32_t n)
+{
+	/* this only changes our appearance rather than the bounding box, so we
+	   just need to schedule a redraw rather than notify the parent of any
+	   changes
+	*/
+	points_per_segment = max (n, (uint32_t) 3);
+	interpolate ();
+	redraw ();
+}
+
+void
+FramedCurve::compute_bounding_box () const
+{
+	PolyItem::compute_bounding_box ();
+
+	/* possibly add extents of any point indicators here if we ever do that */
+}
+
+void
+FramedCurve::set (Points const& p)
+{
+	PolyItem::set (p);
+	interpolate ();
+}
+
+void
+FramedCurve::interpolate ()
+{
+	Points curve_points = _points;
+
+	if (curve_points.size()) {
+		curve_points.erase (curve_points.begin());
+	}
+	samples.clear ();
+
+	InterpolatedCurve::interpolate (curve_points, points_per_segment, CatmullRomCentripetal, false, samples);
+	n_samples = samples.size();
+}
+
+void
+FramedCurve::render (Rect const & area, Cairo::RefPtr<Cairo::Context> context) const
+{
+	if (!_outline || _points.size() < 3 || !_bounding_box) {
+		return;
+	}
+
+	Rect self = item_to_window (_bounding_box.get());
+	boost::optional<Rect> d = self.intersection (area);
+	assert (d);
+	Rect draw = d.get ();
+
+	/* Our approach is to always draw n_segments across our total size.
+	 *
+	 * This is very inefficient if we are asked to only draw a small
+	 * section of the curve. For now we rely on cairo clipping to help
+	 * with this.
+	 */
+
+	/* x-axis limits of the curve, in window space coordinates */
+
+	Duple w1 = item_to_window (Duple (_points.front().x, 0.0));
+	Duple w2 = item_to_window (Duple (_points.back().x, 0.0));
+
+	/* clamp actual draw to area bound by points, rather than our bounding box which is slightly different */
+
+	context->save ();
+	context->rectangle (draw.x0, draw.y0, draw.width(), draw.height());
+	context->clip ();
+
+	/* expand drawing area by several pixels on each side to avoid cairo stroking effects at the boundary.
+	   they will still occur, but cairo's clipping will hide them.
+	*/
+
+	draw = draw.expand (4.0);
+
+	/* now clip it to the actual points in the curve */
+
+	if (draw.x0 < w1.x) {
+		draw.x0 = w1.x;
+	}
+
+	if (draw.x1 >= w2.x) {
+		draw.x1 = w2.x;
+	}
+
+	setup_outline_context (context);
+
+	if (_points.size() == 3) {
+
+		/* straight line */
+
+		Duple window_space;
+		Points::const_iterator it = _points.begin();
+		window_space = item_to_window (*it);
+		context->move_to (window_space.x, window_space.y);
+		++it;
+		window_space = item_to_window (*it, false);
+		context->line_to (window_space.x, window_space.y);
+		window_space = item_to_window (_points.back(), false);
+		context->line_to (window_space.x, window_space.y);
+
+		switch (curve_fill) {
+			case None:
+				context->stroke();
+				break;
+			case Inside:
+				context->stroke_preserve ();
+				window_space = item_to_window (Duple(_points.back().x, draw.height()));
+				context->line_to (window_space.x, window_space.y);
+				window_space = item_to_window (Duple(_points.front().x, draw.height()));
+				context->line_to (window_space.x, window_space.y);
+				context->close_path();
+				setup_fill_context(context);
+				context->fill ();
+				break;
+			case Outside:
+				context->stroke_preserve ();
+				window_space = item_to_window (Duple(_points.back().x, 0.0));
+				context->line_to (window_space.x, window_space.y);
+				window_space = item_to_window (Duple(_points.front().x, 0.0));
+				context->line_to (window_space.x, window_space.y);
+				context->close_path();
+				setup_fill_context(context);
+				context->fill ();
+				break;
+		}
+	} else {
+
+		/* curve of at least 3 points */
+
+		/* find left and right-most sample */
+		Duple window_space;
+		Points::size_type left = 0;
+		Points::size_type right = n_samples - 1;
+
+		for (Points::size_type idx = 0; idx < n_samples - 1; ++idx) {
+			window_space = item_to_window (Duple (samples[idx].x, 0.0));
+			if (window_space.x >= draw.x0) {
+				break;
+			}
+			left = idx;
+		}
+
+		for (Points::size_type idx = left; idx < n_samples - 1; ++idx) {
+			window_space = item_to_window (Duple (samples[idx].x, 0.0));
+			if (window_space.x > draw.x1) {
+				right = idx;
+				break;
+			}
+		}
+
+		const Duple first_sample = Duple (samples[left].x, samples[left].y);
+
+		/* move to the first sample's x and the draw height */
+		window_space = item_to_window (Duple (first_sample.x, draw.height()));
+		context->move_to (window_space.x, window_space.y);
+
+		/* draw line to first sample and then between samples */
+		for (uint32_t idx = left; idx <= right; ++idx) {
+			window_space = item_to_window (Duple (samples[idx].x, samples[idx].y), false);
+			context->line_to (window_space.x, window_space.y);
+		}
+
+		/* a redraw may have been requested between the last sample and the last point.
+		   if so, draw a line to the last _point.
+		*/
+		Duple last_sample = Duple (samples[right].x, samples[right].y);
+
+		if (draw.x1 > last_sample.x) {
+			last_sample = Duple (_points.back().x, _points.back().y);
+			window_space = item_to_window (last_sample, false);
+			context->line_to (window_space.x, window_space.y);
+		}
+
+		switch (curve_fill) {
+			case None:
+				context->stroke();
+				break;
+			case Inside:
+				context->stroke_preserve ();
+				/* close the frame, possibly using the last _point's x rather than samples[right].x */
+				window_space = item_to_window (Duple (last_sample.x, draw.height()));
+				context->line_to (window_space.x, window_space.y);
+				window_space = item_to_window (Duple (first_sample.x, draw.height()));
+				context->line_to (window_space.x, window_space.y);
+				context->close_path();
+				setup_fill_context(context);
+				context->fill ();
+				break;
+			case Outside:
+				context->stroke_preserve ();
+				window_space = item_to_window (Duple (last_sample.x, 0.0));
+				context->line_to (window_space.x, window_space.y);
+				window_space = item_to_window (Duple (first_sample.x, 0.0));
+				context->line_to (window_space.x, window_space.y);
+				context->close_path();
+				setup_fill_context(context);
+				context->fill ();
+				break;
+		}
+	}
+	context->restore ();
+
+#if 0
+	/* add points */
+	setup_outline_context (context);
+	for (Points::const_iterator p = _points.begin(); p != _points.end(); ++p) {
+		Duple window_space (item_to_window (*p));
+		context->arc (window_space.x, window_space.y, 5.0, 0.0, 2 * M_PI);
+		context->stroke ();
+	}
+#endif
+}
+
+bool
+FramedCurve::covers (Duple const & pc) const
+{
+	Duple point = window_to_item (pc);
+
+	/* O(N) N = number of points, and not accurate */
+
+	for (Points::const_iterator p = _points.begin(); p != _points.end(); ++p) {
+
+		const Coord dx = point.x - (*p).x;
+		const Coord dy = point.y - (*p).y;
+		const Coord dx2 = dx * dx;
+		const Coord dy2 = dy * dy;
+
+		if ((dx2 < 2.0 && dy2 < 2.0) || (dx2 + dy2 < 4.0)) {
+			return true;
+		}
+	}
+
+	return false;
+}
diff --git a/libs/canvas/i18n.h b/libs/canvas/i18n.h
deleted file mode 100644
index 43ae07c..0000000
--- a/libs/canvas/i18n.h
+++ /dev/null
@@ -1,20 +0,0 @@
-#ifndef __i18n_h__
-#define __i18n_h__
-
-#include "pbd/compose.h"
-#include "pbd/convert.h"
-#include "gettext.h"
-
-#include <vector>
-#include <string>
-
-#define _(Text)  dgettext (PACKAGE,Text)
-#define N_(Text) gettext_noop (Text)
-#define X_(Text) Text
-#define I18N(Array) PBD::internationalize (PACKAGE, Array)
-/** Use this to translate strings that have different meanings in different places.
- *  Text should be of the form Context|Message.
- */
-#define S_(Text) PBD::sgettext (PACKAGE, Text)
-
-#endif // __i18n_h__
diff --git a/libs/canvas/poly_line.cc b/libs/canvas/poly_line.cc
index 5d6abb9..c0e233b 100644
--- a/libs/canvas/poly_line.cc
+++ b/libs/canvas/poly_line.cc
@@ -28,18 +28,66 @@ using namespace ArdourCanvas;
 PolyLine::PolyLine (Canvas* c)
 	: PolyItem (c)
 	, _threshold (1.0)
+	, _y1 (0)
 {
 }
 
 PolyLine::PolyLine (Item* parent)
 	: PolyItem (parent)
 	, _threshold (1.0)
+	, _y1 (0)
 {
 }
 
 void
+PolyLine::compute_bounding_box () const
+{
+	PolyItem::compute_bounding_box ();
+	if (_y1 > 0 && _bounding_box) {
+		_bounding_box.get().x0 = 0;
+		_bounding_box.get().x1 = COORD_MAX;
+		if (_y1 > _bounding_box.get().y1) {
+			_bounding_box.get().y1 = _y1;
+		}
+	}
+}
+
+void
+PolyLine::set_fill_y1 (double y1) {
+	begin_change ();
+	_bounding_box_dirty = true;
+	_y1 = y1;
+	end_change ();
+}
+
+void
 PolyLine::render (Rect const & area, Cairo::RefPtr<Cairo::Context> context) const
 {
+	if (_fill && _y1 > 0 && _points.size() > 0) {
+		const ArdourCanvas::Rect& vp (_canvas->visible_area());
+		setup_fill_context (context);
+
+		Duple y (0, _y1);
+		float y1 = item_to_window (y).y;
+		render_path (area, context);
+		Duple c0 (item_to_window (_points.back()));
+		Duple c1 (item_to_window (_points.front()));
+		if (c0.x < vp.x1) {
+			context->line_to (vp.x1, c0.y);
+			context->line_to (vp.x1, y1);
+		} else {
+			context->line_to (vp.x1, y1);
+		}
+		if (c1.x > vp.x0) {
+			context->line_to (vp.x0, y1);
+			context->line_to (vp.x0, c1.y);
+		} else {
+			context->line_to (vp.x0, y1);
+		}
+		context->close_path ();
+		context->fill ();
+	}
+
 	if (_outline) {
 		setup_outline_context (context);
 		render_path (area, context);
diff --git a/libs/canvas/ruler.cc b/libs/canvas/ruler.cc
index e3f23fb..1c11def 100644
--- a/libs/canvas/ruler.cc
+++ b/libs/canvas/ruler.cc
@@ -36,7 +36,8 @@ Ruler::Ruler (Canvas* c, const Metric& m)
 	, _metric (&m)
 	, _lower (0)
 	, _upper (0)
-        , _divide_height (-1.0)
+	, _divide_height (-1.0)
+	, _font_description (0)
 	, _need_marks (true)
 {
 }
@@ -46,7 +47,8 @@ Ruler::Ruler (Canvas* c, const Metric& m, Rect const& r)
 	, _metric (&m)
 	, _lower (0)
 	, _upper (0)
-        , _divide_height (-1.0)
+	, _divide_height (-1.0)
+	, _font_description (0)
 	, _need_marks (true)
 {
 }
@@ -56,7 +58,8 @@ Ruler::Ruler (Item* parent, const Metric& m)
 	, _metric (&m)
 	, _lower (0)
 	, _upper (0)
-        , _divide_height (-1.0)
+	, _divide_height (-1.0)
+	, _font_description (0)
 	, _need_marks (true)
 {
 }
@@ -66,7 +69,8 @@ Ruler::Ruler (Item* parent, const Metric& m, Rect const& r)
 	, _metric (&m)
 	, _lower (0)
 	, _upper (0)
-        , _divide_height (-1.0)
+	, _divide_height (-1.0)
+	, _font_description (0)
 	, _need_marks (true)
 {
 }
@@ -85,6 +89,7 @@ void
 Ruler::set_font_description (Pango::FontDescription fd)
 {
 	begin_visual_change ();
+	delete _font_description;
 	_font_description = new Pango::FontDescription (fd);
 	end_visual_change ();
 }
@@ -165,10 +170,10 @@ Ruler::render (Rect const & area, Cairo::RefPtr<Cairo::Context> cr) const
                         }
 			break;
 		case Mark::Minor:
-			cr->rel_line_to (0, -height/4.0);
+			cr->rel_line_to (0, -height/3.0);
 			break;
 		case Mark::Micro:
-			cr->rel_line_to (0, -height/16.0);
+			cr->rel_line_to (0, -height/5.0);
 			break;
 		}
 		cr->stroke ();
diff --git a/libs/canvas/stateful_image.cc b/libs/canvas/stateful_image.cc
index fb0abf4..5f04d94 100644
--- a/libs/canvas/stateful_image.cc
+++ b/libs/canvas/stateful_image.cc
@@ -11,7 +11,7 @@
 #include "canvas/stateful_image.h"
 #include "canvas/utils.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ArdourCanvas;
 using PBD::error;
diff --git a/libs/canvas/text.cc b/libs/canvas/text.cc
index d1f76eb..3b309e5 100644
--- a/libs/canvas/text.cc
+++ b/libs/canvas/text.cc
@@ -70,6 +70,10 @@ Text::~Text ()
 void
 Text::set (string const & text)
 {
+	if (text == _text) {
+		return;
+	}
+
 	begin_change ();
 
 	_text = text;
@@ -237,6 +241,10 @@ Text::compute_bounding_box () const
 void
 Text::set_alignment (Pango::Alignment alignment)
 {
+	if (alignment == _alignment) {
+		return;
+	}
+
 	begin_change ();
 
 	_alignment = alignment;
@@ -261,6 +269,10 @@ Text::set_font_description (Pango::FontDescription font_description)
 void
 Text::set_color (Color color)
 {
+	if (color == _color) {
+		return;
+	}
+
 	begin_change ();
 
 	_color = color;
diff --git a/libs/canvas/wave_view.cc b/libs/canvas/wave_view.cc
index ca3b43d..17ee860 100644
--- a/libs/canvas/wave_view.cc
+++ b/libs/canvas/wave_view.cc
@@ -73,7 +73,13 @@ WaveView::DrawingRequestQueue WaveView::request_queue;
 PBD::Signal0<void> WaveView::VisualPropertiesChanged;
 PBD::Signal0<void> WaveView::ClipLevelChanged;
 
-/*#define ENABLE_THREADED_WAVEFORM_RENDERING */
+/* NO_THREAD_WAVEVIEWS is defined by the top level wscript
+ * if --no-threaded-waveviws is provided at the configure step.
+ */
+
+#ifndef NO_THREADED_WAVEVIEWS
+#define ENABLE_THREADED_WAVEFORM_RENDERING
+#endif
 
 WaveView::WaveView (Canvas* c, boost::shared_ptr<ARDOUR::AudioRegion> region)
 	: Item (c)
@@ -158,7 +164,7 @@ WaveView::debug_name() const
 void
 WaveView::image_ready ()
 {
-        DEBUG_TRACE (DEBUG::WaveView, string_compose ("queue draw for %1 at %2 (vis = %3 CR %4)\n", this, g_get_monotonic_time(), visible(), current_request));
+	DEBUG_TRACE (DEBUG::WaveView, string_compose ("queue draw for %1 at %2 (vis = %3 CR %4)\n", this, g_get_monotonic_time(), visible(), current_request));
 	redraw ();
 }
 
@@ -264,7 +270,7 @@ WaveView::set_clip_level (double dB)
 void
 WaveView::invalidate_image_cache ()
 {
-        DEBUG_TRACE (DEBUG::WaveView, string_compose ("%1 invalidates image cache and cancels current request\n", this));
+	DEBUG_TRACE (DEBUG::WaveView, string_compose ("%1 invalidates image cache and cancels current request\n", this));
 	cancel_my_render_request ();
 	Glib::Threads::Mutex::Lock lci (current_image_lock);
 	_current_image.reset ();
@@ -745,7 +751,7 @@ boost::shared_ptr<WaveViewCache::Entry>
 WaveView::cache_request_result (boost::shared_ptr<WaveViewThreadRequest> req) const
 {
 	if (!req->image) {
-		cerr << "asked to cache null image!!!\n";
+		// cerr << "asked to cache null image!!!\n";
 		return boost::shared_ptr<WaveViewCache::Entry> ();
 	}
 
@@ -792,9 +798,9 @@ WaveView::get_image (framepos_t start, framepos_t end, bool& full_image) const
 		 * while we're here.
 		 */
 
-                DEBUG_TRACE (DEBUG::WaveView, string_compose ("%1 CR %2 stop? %3 image %4\n", this, current_request,
-                                                              (current_request ? current_request->should_stop() : false),
-                                                              (current_request ? current_request->image : 0)));
+		DEBUG_TRACE (DEBUG::WaveView, string_compose ("%1 CR %2 stop? %3 image %4\n", this, current_request,
+					(current_request ? current_request->should_stop() : false),
+					(current_request ? current_request->image : 0)));
 
 		if (current_request && !current_request->should_stop() && current_request->image) {
 
@@ -857,7 +863,7 @@ WaveView::get_image (framepos_t start, framepos_t end, bool& full_image) const
 			req->height = _height;
 			req->fill_color = _fill_color;
 			req->amplitude = _region_amplitude * _amplitude_above_axis;
-                        req->width = desired_image_width ();
+			req->width = desired_image_width ();
 
 			/* draw image in this (the GUI thread) */
 
@@ -901,21 +907,21 @@ WaveView::get_image_from_cache (framepos_t start, framepos_t end, bool& full) co
 framecnt_t
 WaveView::desired_image_width () const
 {
-        /* compute how wide the image should be, in samples.
-         *
-         * We want at least 1 canvas width's worth, but if that
-         * represents less than 1/10th of a second, use 1/10th of
-         * a second instead.
-         */
+	/* compute how wide the image should be, in samples.
+	 *
+	 * We want at least 1 canvas width's worth, but if that
+	 * represents less than 1/10th of a second, use 1/10th of
+	 * a second instead.
+	 */
 
-        framecnt_t canvas_width_samples = _canvas->visible_area().width() * _samples_per_pixel;
-        const framecnt_t one_tenth_of_second = _region->session().frame_rate() / 10;
+	framecnt_t canvas_width_samples = _canvas->visible_area().width() * _samples_per_pixel;
+	const framecnt_t one_tenth_of_second = _region->session().frame_rate() / 10;
 
-        if (canvas_width_samples > one_tenth_of_second) {
-                return  canvas_width_samples;
-        }
+	if (canvas_width_samples > one_tenth_of_second) {
+		return  canvas_width_samples;
+	}
 
-        return one_tenth_of_second;
+	return one_tenth_of_second;
 }
 
 void
@@ -932,13 +938,16 @@ WaveView::queue_get_image (boost::shared_ptr<const ARDOUR::Region> region, frame
 	req->height = _height;
 	req->fill_color = _fill_color;
 	req->amplitude = _region_amplitude * _amplitude_above_axis;
-        req->width = desired_image_width ();
+	req->width = desired_image_width ();
 
 	if (current_request) {
 		/* this will stop rendering in progress (which might otherwise
 		   be long lived) for any current request.
 		*/
-		current_request->cancel ();
+		Glib::Threads::Mutex::Lock lm (request_queue_lock);
+		if (current_request) {
+			current_request->cancel ();
+		}
 	}
 
 	start_drawing_thread ();
@@ -949,14 +958,14 @@ WaveView::queue_get_image (boost::shared_ptr<const ARDOUR::Region> region, frame
 		Glib::Threads::Mutex::Lock lm (request_queue_lock);
 		current_request = req;
 
-                DEBUG_TRACE (DEBUG::WaveView, string_compose ("%1 now has current request %2\n", this, req));
+		DEBUG_TRACE (DEBUG::WaveView, string_compose ("%1 now has current request %2\n", this, req));
 
-                if (request_queue.insert (this).second) {
-                        /* this waveview was not already in the request queue, make sure we wake
-                           the rendering thread in case it is asleep.
-                        */
-                        request_cond.signal ();
-                }
+		if (request_queue.insert (this).second) {
+			/* this waveview was not already in the request queue, make sure we wake
+				 the rendering thread in case it is asleep.
+				 */
+			request_cond.signal ();
+		}
 	}
 }
 
@@ -967,8 +976,8 @@ WaveView::generate_image (boost::shared_ptr<WaveViewThreadRequest> req, bool in_
 
 		/* sample position is canonical here, and we want to generate
 		 * an image that spans about 3x the canvas width. We get to that
-                 * width by using an image sample count of the screen width added
-                 * on each side of the desired image center.
+		 * width by using an image sample count of the screen width added
+		 * on each side of the desired image center.
 		 */
 
 		const framepos_t center = req->start + ((req->end - req->start) / 2);
@@ -979,7 +988,9 @@ WaveView::generate_image (boost::shared_ptr<WaveViewThreadRequest> req, bool in_
 
 		framepos_t sample_start = max (_region_start, (center - image_samples));
 		framepos_t sample_end = min (center + image_samples, region_end());
-		const int n_peaks = llrintf ((sample_end - sample_start)/ (req->samples_per_pixel));
+		const int n_peaks = std::max (1LL, llrint (ceil ((sample_end - sample_start) / (req->samples_per_pixel))));
+
+		assert (n_peaks > 0 && n_peaks < 32767);
 
 		boost::scoped_array<ARDOUR::PeakData> peaks (new PeakData[n_peaks]);
 
@@ -993,7 +1004,19 @@ WaveView::generate_image (boost::shared_ptr<WaveViewThreadRequest> req, bool in_
 		                                             req->channel,
 		                                             req->samples_per_pixel);
 
+		if (req->should_stop()) {
+			// cerr << "Request stopped after reading peaks\n";
+			return;
+		}
+
 		req->image = Cairo::ImageSurface::create (Cairo::FORMAT_ARGB32, n_peaks, req->height);
+
+		// http://cairographics.org/manual/cairo-Image-Surfaces.html#cairo-image-surface-create
+		// This function always returns a valid pointer, but it will return a pointer to a "nil" surface..
+		// but there's some evidence that req->image can be NULL.
+		// http://tracker.ardour.org/view.php?id=6478
+		assert (req->image);
+
 		/* make sure we record the sample positions that were actually used */
 		req->start = sample_start;
 		req->end = sample_end;
@@ -1018,11 +1041,11 @@ WaveView::generate_image (boost::shared_ptr<WaveViewThreadRequest> req, bool in_
 			draw_absent_image (req->image, peaks.get(), n_peaks);
 		}
 	} else {
-		cerr << "Request stopped before image generation\n";
+		// cerr << "Request stopped before image generation\n";
 	}
 
 	if (in_render_thread && !req->should_stop()) {
-                DEBUG_TRACE (DEBUG::WaveView, string_compose ("done with request for %1 at %2 CR %3 req %4 range %5 .. %6\n", this, g_get_monotonic_time(), current_request, req, req->start, req->end));
+		DEBUG_TRACE (DEBUG::WaveView, string_compose ("done with request for %1 at %2 CR %3 req %4 range %5 .. %6\n", this, g_get_monotonic_time(), current_request, req, req->start, req->end));
 		const_cast<WaveView*>(this)->ImageReady (); /* emit signal */
 	}
 
@@ -1052,7 +1075,7 @@ WaveView::render (Rect const & area, Cairo::RefPtr<Cairo::Context> context) cons
 		return;
 	}
 
-        DEBUG_TRACE (DEBUG::WaveView, string_compose ("render %1 at %2\n", this, g_get_monotonic_time()));
+	DEBUG_TRACE (DEBUG::WaveView, string_compose ("render %1 at %2\n", this, g_get_monotonic_time()));
 
 	/* a WaveView is intimately connected to an AudioRegion. It will
 	 * display the waveform within the region, anywhere from the start of
@@ -1207,13 +1230,12 @@ WaveView::render (Rect const & area, Cairo::RefPtr<Cairo::Context> context) cons
 		 * draw or the available width of the image.
 		 */
 
-		draw_width = min ((double) image_to_draw->image->get_width() - (draw_start - image_to_draw->start),
-		                  (draw_end - draw_start));
+		draw_width = min ((double) image_to_draw->image->get_width(), (draw_end - draw_start));
 
 
-		DEBUG_TRACE (DEBUG::WaveView, string_compose ("%1 draw just %2 of %3 (iwidth %4 off %5 img @ %6 rs @ %7)\n", name, draw_width, (draw_end - draw_start),
+		DEBUG_TRACE (DEBUG::WaveView, string_compose ("%1 draw just %2 of %3 @ %8 (iwidth %4 off %5 img @ %6 rs @ %7)\n", name, draw_width, (draw_end - draw_start),
 		                                              image_to_draw->image->get_width(), image_origin_in_self_coordinates,
-		                                              image_to_draw->start, _region_start));
+		                                              image_to_draw->start, _region_start, draw_start));
 	} else {
 		draw_width = draw_end - draw_start;
 		DEBUG_TRACE (DEBUG::WaveView, string_compose ("use current image, span entire render width %1..%2\n", draw_start, draw_end));
@@ -1476,19 +1498,19 @@ WaveView::cancel_my_render_request () const
 	 * ever starting up.
 	 */
 
+	Glib::Threads::Mutex::Lock lm (request_queue_lock);
+
 	if (current_request) {
 		current_request->cancel ();
 	}
 
-	Glib::Threads::Mutex::Lock lm (request_queue_lock);
-
 	/* now remove it from the queue and reset our request pointer so that
 	   have no outstanding request (that we know about)
 	*/
 
 	request_queue.erase (this);
 	current_request.reset ();
-        DEBUG_TRACE (DEBUG::WaveView, string_compose ("%1 now has no request %2\n", this));
+	DEBUG_TRACE (DEBUG::WaveView, string_compose ("%1 now has no request %2\n", this));
 
 }
 
@@ -1554,7 +1576,7 @@ WaveView::drawing_thread ()
 		requestor = *(request_queue.begin());
 		request_queue.erase (request_queue.begin());
 
-                DEBUG_TRACE (DEBUG::WaveView, string_compose ("start request for %1 at %2\n", requestor, g_get_monotonic_time()));
+		DEBUG_TRACE (DEBUG::WaveView, string_compose ("start request for %1 at %2\n", requestor, g_get_monotonic_time()));
 
 		boost::shared_ptr<WaveViewThreadRequest> req = requestor->current_request;
 
@@ -1567,7 +1589,7 @@ WaveView::drawing_thread ()
 		 * as we do rendering.
 		 */
 
-		request_queue_lock.unlock (); /* some RAII would be good here */
+		lm.release (); /* some RAII would be good here */
 
 		try {
 			requestor->generate_image (req, true);
@@ -1575,7 +1597,7 @@ WaveView::drawing_thread ()
 			req->image.clear(); /* just in case it was set before the exception, whatever it was */
 		}
 
-		request_queue_lock.lock ();
+		lm.acquire ();
 
 		req.reset (); /* drop/delete request as appropriate */
 	}
@@ -1633,25 +1655,25 @@ WaveViewCache::lookup_image (boost::shared_ptr<ARDOUR::AudioSource> src,
 			continue;
 		}
 
-                switch (Evoral::coverage (start, end, e->start, e->end)) {
-                case Evoral::OverlapExternal:  /* required range is inside image range */
-			DEBUG_TRACE (DEBUG::WaveView, string_compose ("found image spanning %1..%2 covers %3..%4\n",
-			                                              e->start, e->end, start, end));
-			use (src, e);
-                        full_coverage = true;
-                        return e;
-
-                case Evoral::OverlapStart: /* required range start is covered by image range */
-                        if ((e->end - start) > max_coverage) {
-                                best_partial = e;
-                                max_coverage = e->end - start;
-                        }
-                        break;
-
-                case Evoral::OverlapNone:
-                case Evoral::OverlapEnd:
-                case Evoral::OverlapInternal:
-                        break;
+		switch (Evoral::coverage (start, end, e->start, e->end)) {
+			case Evoral::OverlapExternal:  /* required range is inside image range */
+				DEBUG_TRACE (DEBUG::WaveView, string_compose ("found image spanning %1..%2 covers %3..%4\n",
+							e->start, e->end, start, end));
+				use (src, e);
+				full_coverage = true;
+				return e;
+
+			case Evoral::OverlapStart: /* required range start is covered by image range */
+				if ((e->end - start) > max_coverage) {
+					best_partial = e;
+					max_coverage = e->end - start;
+				}
+				break;
+
+			case Evoral::OverlapNone:
+			case Evoral::OverlapEnd:
+			case Evoral::OverlapInternal:
+				break;
 		}
 	}
 
diff --git a/libs/canvas/wscript b/libs/canvas/wscript
index 2a4cc0b..b40f724 100644
--- a/libs/canvas/wscript
+++ b/libs/canvas/wscript
@@ -40,6 +40,7 @@ canvas_sources = [
         'item.cc',
         'fill.cc',
         'flag.cc',
+        'framed_curve.cc',
         'image.cc',
         'line.cc',
         'line_set.cc',
@@ -84,7 +85,7 @@ def build(bld):
 
     obj.export_includes = ['.']
     obj.includes     = ['.']
-    obj.uselib       = 'SIGCPP CAIROMM GTKMM BOOST'
+    obj.uselib       = 'SIGCPP CAIROMM GTKMM BOOST XML'
     obj.use          = [ 'libpbd', 'libevoral', 'libardour', 'libgtkmm2ext', 'libevoral' ]
     obj.name         = 'libcanvas'
     obj.target       = 'canvas'
@@ -92,7 +93,32 @@ def build(bld):
     obj.install_path = bld.env['LIBDIR']
     obj.defines      += [ 'PACKAGE="' + I18N_PACKAGE + '"' ]
 
-    if bld.env['BUILD_TESTS'] and bld.env['HAVE_CPPUNIT']:
+    # canvas unit-tests are outdated
+    if False and bld.env['BUILD_TESTS'] and bld.is_defined('HAVE_CPPUNIT'):
+            unit_testobj              = bld(features = 'cxx cxxprogram')
+            unit_testobj.source       = '''
+                    test/group.cc
+                    test/arrow.cc
+                    test/optimizing_lookup_table.cc
+                    test/polygon.cc
+                    test/types.cc
+                    test/render.cc
+                    test/xml.cc
+                    test/wave_view.cc
+                    test/item.cc
+                    test/testrunner.cpp
+                '''.split()
+
+            unit_testobj.includes     = obj.includes + ['test', '../pbd']
+            unit_testobj.uselib       = 'CPPUNIT SIGCPP CAIROMM GTKMM'
+            unit_testobj.uselib_local = 'libcanvas libevoral libardour libgtkmm2ext'
+            unit_testobj.name         = 'libcanvas-unit-tests'
+            unit_testobj.target       = 'run-tests'
+            unit_testobj.install_path = ''
+            unit_testobj.cxxflags     = ['-DPACKAGE="libcanvastest"']
+            unit_testobj.cxxflags     += ['-DDATA_DIR="' + os.path.normpath(bld.env['DATADIR']) + '"']
+            unit_testobj.cxxflags     += ['-DCONFIG_DIR="' + os.path.normpath(bld.env['CONFDIR']) + '"']
+            unit_testobj.cxxflags     += ['-DMODULE_DIR="' + os.path.normpath(bld.env['LIBDIR']) + '"']
 
             manual_tests              = '''
                         test/hello_world.cc
@@ -106,7 +132,7 @@ def build(bld):
             for t in manual_tests:
                     target = t[:-3]
                     name = t[t.find('/')+1:-3]
-                    manual_testobj = bld.new_task_gen('cxx', 'program')
+                    manual_testobj = bld(features = 'cxx cxxprogram')
                     manual_testobj.source = t
                     manual_testobj.includes = obj.includes + ['test', '../pbd']
                     manual_testobj.uselib       = 'CPPUNIT SIGCPP CAIROMM GTKMM'
@@ -115,31 +141,6 @@ def build(bld):
                     manual_testobj.target       = target
                     manual_testobj.install_path = ''
 
-                    unit_testobj              = bld.new_task_gen('cxx', 'program')
-                    unit_testobj.source       = '''
-                        test/group.cc
-                        test/arrow.cc
-                        test/optimizing_lookup_table.cc
-                        test/polygon.cc
-                        test/types.cc
-                        test/render.cc
-                        test/xml.cc
-                        test/wave_view.cc
-                        test/item.cc
-                        test/testrunner.cpp
-                '''.split()
-
-                    unit_testobj.includes     = obj.includes + ['test', '../pbd']
-                    unit_testobj.uselib       = 'CPPUNIT SIGCPP CAIROMM GTKMM'
-                    unit_testobj.uselib_local = 'libcanvas libevoral libardour libgtkmm2ext'
-                    unit_testobj.name         = 'libcanvas-unit-tests'
-                    unit_testobj.target       = 'run-tests'
-                    unit_testobj.install_path = ''
-                    unit_testobj.cxxflags     = ['-DPACKAGE="libcanvastest"']
-                    unit_testobj.cxxflags     += ['-DDATA_DIR="' + os.path.normpath(bld.env['DATADIR']) + '"']
-                    unit_testobj.cxxflags     += ['-DCONFIG_DIR="' + os.path.normpath(bld.env['CONFIGDIR']) + '"']
-                    unit_testobj.cxxflags     += ['-DMODULE_DIR="' + os.path.normpath(bld.env['LIBDIR']) + '"']
-
             benchmarks = '''
                         benchmark/items_at_point.cc
                         benchmark/render_parts.cc
@@ -150,7 +151,7 @@ def build(bld):
             for t in benchmarks:
                     target = t[:-3]
                     name = t[t.find('/')+1:-3]
-                    manual_testobj = bld.new_task_gen('cxx', 'program')
+                    manual_testobj = bld(features = 'cxx cxxprogram')
                     manual_testobj.source = [ t, 'benchmark/benchmark.cc' ]
                     manual_testobj.includes = obj.includes + ['test', '../pbd']
                     manual_testobj.uselib       = 'CPPUNIT SIGCPP CAIROMM GTKMM'
diff --git a/libs/canvas/xfade_curve.cc b/libs/canvas/xfade_curve.cc
index c8e4776..e93331e 100644
--- a/libs/canvas/xfade_curve.cc
+++ b/libs/canvas/xfade_curve.cc
@@ -185,7 +185,7 @@ XFadeCurve::get_path(Rect const & area, Cairo::RefPtr<Cairo::Context> context, C
 			window_space = item_to_window (Duple (c.samples[idx].x, 0.0), false);
 			if (window_space.x >= area.x0) break;
 		}
-		for (Points::size_type idx = c.n_samples; right > left;) {
+		for (Points::size_type idx = c.n_samples - 1; right > left;) {
 			if (--idx <= left) break;
 			window_space = item_to_window (Duple (c.samples[idx].x, 0.0), false);
 			if (window_space.x <= area.x1) break;
diff --git a/libs/clearlooks-newer/MSVCclearlooks/clearlooks.vcproj b/libs/clearlooks-newer/MSVCclearlooks/clearlooks.vcproj
index 2d0bda0..eec3958 100644
--- a/libs/clearlooks-newer/MSVCclearlooks/clearlooks.vcproj
+++ b/libs/clearlooks-newer/MSVCclearlooks/clearlooks.vcproj
@@ -42,7 +42,7 @@
 				AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
 				Optimization="0"
 				AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\timecode;..\..\rubberband;"..\..\vamp-sdk";"..\..\midi++2";..\..\taglib;..\..\taglib\taglib;..\..\taglib\taglib\toolkit;..\..\audiographer;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor""
-				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;BUILDING_CLEARLOOKS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_DEBUG;DEBUG="Debug";ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;BUILDING_CLEARLOOKS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_DEBUG;DEBUG="Debug";ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
 				MinimalRebuild="true"
 				RuntimeLibrary="3"
 				WarningLevel="3"
@@ -123,7 +123,7 @@
 				Optimization="2"
 				InlineFunctionExpansion="1"
 				AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\timecode;..\..\rubberband;"..\..\vamp-sdk";"..\..\midi++2";..\..\taglib;..\..\taglib\taglib;..\..\taglib\taglib\toolkit;..\..\audiographer;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor""
-				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_CLEARLOOKS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;NDEBUG;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_CLEARLOOKS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;NDEBUG;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
 				StringPooling="false"
 				RuntimeLibrary="2"
 				EnableEnhancedInstructionSet="1"
@@ -202,7 +202,7 @@
 				AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
 				Optimization="0"
 				AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\timecode;..\..\rubberband;"..\..\vamp-sdk";"..\..\midi++2";..\..\taglib;..\..\taglib\taglib;..\..\taglib\taglib\toolkit;..\..\audiographer;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor""
-				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_CLEARLOOKS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_CLEARLOOKS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
 				StringPooling="false"
 				RuntimeLibrary="2"
 				EnableEnhancedInstructionSet="1"
@@ -363,7 +363,7 @@
 			UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
 			>
 			<File
-				RelativePath="..\..\..\icons\win32\msvc_resources.rc"
+				RelativePath="..\..\..\gtk2_ardour\win32\msvc_resources.rc"
 				>
 			</File>
 		</Filter>
diff --git a/libs/clearlooks-newer/animation.c b/libs/clearlooks-newer/animation.c
index 9fd530f..f9b5ba5 100644
--- a/libs/clearlooks-newer/animation.c
+++ b/libs/clearlooks-newer/animation.c
@@ -128,7 +128,7 @@ lookup_animation_info (const GtkWidget *widget)
 
 /* Create all the relevant information for the animation, and insert it into the hash table. */
 static void
-add_animation (const GtkWidget *widget, gdouble stop_time)
+add_animation (GtkWidget *widget, gdouble stop_time)
 {
 	AnimationInfo *value;
 
diff --git a/libs/clearlooks-newer/clearlooks_draw.c b/libs/clearlooks-newer/clearlooks_draw.c
index bf01a00..502d2e7 100644
--- a/libs/clearlooks-newer/clearlooks_draw.c
+++ b/libs/clearlooks-newer/clearlooks_draw.c
@@ -2010,12 +2010,12 @@ clearlooks_draw_radiobutton (cairo_t *cr,
 	cairo_pattern_t *pt;
 	gboolean inconsistent;
 
-	gboolean draw_bullet = (checkbox->shadow_type == GTK_SHADOW_IN);
+	gboolean draw_bullet = (checkbox->shadow_type == (ClearlooksShadowType)GTK_SHADOW_IN);
 
 	(void) width;
 	(void) height;
 
-	inconsistent = (checkbox->shadow_type == GTK_SHADOW_ETCHED_IN);
+	inconsistent = (checkbox->shadow_type == (ClearlooksShadowType)GTK_SHADOW_ETCHED_IN);
 	draw_bullet |= inconsistent;
 
 	if (widget->disabled)
@@ -2095,9 +2095,9 @@ clearlooks_draw_checkbox (cairo_t *cr,
 	const CairoColor *border;
 	const CairoColor *dot;
 	gboolean inconsistent = FALSE;
-	gboolean draw_bullet = (checkbox->shadow_type == GTK_SHADOW_IN);
+	gboolean draw_bullet = (checkbox->shadow_type == (ClearlooksShadowType)GTK_SHADOW_IN);
 
-	inconsistent = (checkbox->shadow_type == GTK_SHADOW_ETCHED_IN);
+	inconsistent = (checkbox->shadow_type == (ClearlooksShadowType)GTK_SHADOW_ETCHED_IN);
 	draw_bullet |= inconsistent;
 
 	if (widget->disabled)
diff --git a/libs/clearlooks-newer/clearlooks_draw_glossy.c b/libs/clearlooks-newer/clearlooks_draw_glossy.c
index cf3c96a..26b239f 100644
--- a/libs/clearlooks-newer/clearlooks_draw_glossy.c
+++ b/libs/clearlooks-newer/clearlooks_draw_glossy.c
@@ -1241,12 +1241,12 @@ clearlooks_glossy_draw_radiobutton (cairo_t *cr,
 	CairoColor highlight;
 	cairo_pattern_t *pt;
 	gboolean inconsistent;
-	gboolean draw_bullet = (checkbox->shadow_type == GTK_SHADOW_IN);
+	gboolean draw_bullet = (checkbox->shadow_type == (ClearlooksShadowType)GTK_SHADOW_IN);
 
 	(void) width;
 	(void) height;
 
-	inconsistent = (checkbox->shadow_type == GTK_SHADOW_ETCHED_IN);
+	inconsistent = (checkbox->shadow_type == (ClearlooksShadowType)GTK_SHADOW_ETCHED_IN);
 	draw_bullet |= inconsistent;
 
 	if (widget->disabled)
@@ -1332,9 +1332,9 @@ clearlooks_glossy_draw_checkbox (cairo_t *cr,
 	const CairoColor *border;
 	const CairoColor *dot;
 	gboolean inconsistent = FALSE;
-	gboolean draw_bullet = (checkbox->shadow_type == GTK_SHADOW_IN);
+	gboolean draw_bullet = (checkbox->shadow_type == (ClearlooksShadowType)GTK_SHADOW_IN);
 
-	inconsistent = (checkbox->shadow_type == GTK_SHADOW_ETCHED_IN);
+	inconsistent = (checkbox->shadow_type == (ClearlooksShadowType)GTK_SHADOW_ETCHED_IN);
 	draw_bullet |= inconsistent;
 
 	if (widget->disabled)
diff --git a/libs/clearlooks-newer/clearlooks_draw_gummy.c b/libs/clearlooks-newer/clearlooks_draw_gummy.c
index 97aca7e..caba520 100644
--- a/libs/clearlooks-newer/clearlooks_draw_gummy.c
+++ b/libs/clearlooks-newer/clearlooks_draw_gummy.c
@@ -1340,12 +1340,12 @@ clearlooks_gummy_draw_radiobutton (cairo_t                  *cr,
 	CairoColor highlight;
 	cairo_pattern_t *pt;
 	gboolean inconsistent;
-	gboolean draw_bullet = (checkbox->shadow_type == GTK_SHADOW_IN);
+	gboolean draw_bullet = (checkbox->shadow_type == (ClearlooksShadowType)GTK_SHADOW_IN);
 
 	(void) width;
 	(void) height;
 
-	inconsistent = (checkbox->shadow_type == GTK_SHADOW_ETCHED_IN);
+	inconsistent = (checkbox->shadow_type == (ClearlooksShadowType)GTK_SHADOW_ETCHED_IN);
 	draw_bullet |= inconsistent;
 
 	if (widget->disabled)
@@ -1431,9 +1431,9 @@ clearlooks_gummy_draw_checkbox (cairo_t                  *cr,
 	const CairoColor *border;
 	const CairoColor *dot;
 	gboolean inconsistent = FALSE;
-	gboolean draw_bullet = (checkbox->shadow_type == GTK_SHADOW_IN);
+	gboolean draw_bullet = (checkbox->shadow_type == (ClearlooksShadowType)GTK_SHADOW_IN);
 
-	inconsistent = (checkbox->shadow_type == GTK_SHADOW_ETCHED_IN);
+	inconsistent = (checkbox->shadow_type == (ClearlooksShadowType)GTK_SHADOW_ETCHED_IN);
 	draw_bullet |= inconsistent;
 
 	if (widget->disabled)
diff --git a/libs/clearlooks-newer/clearlooks_style.c b/libs/clearlooks-newer/clearlooks_style.c
index b1257f4..fb0ca33 100644
--- a/libs/clearlooks-newer/clearlooks_style.c
+++ b/libs/clearlooks-newer/clearlooks_style.c
@@ -56,7 +56,7 @@ static ClearlooksStyleClass *clearlooks_style_class;
 static GtkStyleClass *clearlooks_parent_class;
 
 static void
-clearlooks_set_widget_parameters (const GtkWidget      *widget,
+clearlooks_set_widget_parameters (GtkWidget      *widget,
                                   const GtkStyle       *style,
                                   GtkStateType          state_type,
                                   WidgetParameters     *params)
@@ -709,9 +709,9 @@ clearlooks_style_draw_box (DRAW_ARGS)
 
 		if (!params.ltr)
 		{
-			if (progressbar.orientation == GTK_PROGRESS_LEFT_TO_RIGHT)
+			if (progressbar.orientation == (ClearlooksOrientation)GTK_PROGRESS_LEFT_TO_RIGHT)
 				progressbar.orientation = GTK_PROGRESS_RIGHT_TO_LEFT;
-			else if (progressbar.orientation == GTK_PROGRESS_RIGHT_TO_LEFT)
+			else if (progressbar.orientation == (ClearlooksOrientation)GTK_PROGRESS_RIGHT_TO_LEFT)
 				progressbar.orientation = GTK_PROGRESS_LEFT_TO_RIGHT;
 		}
 
@@ -738,8 +738,8 @@ clearlooks_style_draw_box (DRAW_ARGS)
 			}
 			else
 			{
-				if (progressbar.orientation == GTK_PROGRESS_RIGHT_TO_LEFT ||
-				    progressbar.orientation == GTK_PROGRESS_LEFT_TO_RIGHT)
+				if (progressbar.orientation == (ClearlooksOrientation)GTK_PROGRESS_RIGHT_TO_LEFT ||
+				    progressbar.orientation == (ClearlooksOrientation)GTK_PROGRESS_LEFT_TO_RIGHT)
 				{
 					tmp.x -= 1;
 					tmp.width += 2;
diff --git a/libs/clearlooks-newer/clearlooks_theme_main.c b/libs/clearlooks-newer/clearlooks_theme_main.c
index e4c35b4..ae85627 100644
--- a/libs/clearlooks-newer/clearlooks_theme_main.c
+++ b/libs/clearlooks-newer/clearlooks_theme_main.c
@@ -4,11 +4,21 @@
 #include "clearlooks_style.h"
 #include "clearlooks_rc_style.h"
 
+/* declare those three functions first to avoid warnings using gcc */
 GE_EXPORT void
-theme_init (GTypeModule *module)
+theme_init (GTypeModule* module);
+
+GE_EXPORT void
+theme_exit (void);
+
+GE_EXPORT GtkRcStyle*
+theme_create_rc_style (void);
+
+GE_EXPORT void
+theme_init (GTypeModule* module)
 {
-  clearlooks_rc_style_register_type (module);
-  clearlooks_style_register_type (module);
+	clearlooks_rc_style_register_type (module);
+	clearlooks_style_register_type (module);
 }
 
 GE_EXPORT void
@@ -16,8 +26,8 @@ theme_exit (void)
 {
 }
 
-GE_EXPORT GtkRcStyle *
+GE_EXPORT GtkRcStyle*
 theme_create_rc_style (void)
 {
-  return GTK_RC_STYLE (g_object_new (CLEARLOOKS_TYPE_RC_STYLE, NULL));
+	return GTK_RC_STYLE (g_object_new (CLEARLOOKS_TYPE_RC_STYLE, NULL));
 }
diff --git a/libs/clearlooks-newer/widget-information.c b/libs/clearlooks-newer/widget-information.c
index 1a4fe31..41a3c5a 100644
--- a/libs/clearlooks-newer/widget-information.c
+++ b/libs/clearlooks-newer/widget-information.c
@@ -11,7 +11,7 @@
    Smooth-Engine.
 */
 gboolean
-ge_object_is_a (const GObject * object, const gchar * type_name)
+ge_object_is_a (GObject * object, const gchar * type_name)
 {
   gboolean result = FALSE;
 
diff --git a/libs/clearlooks-newer/widget-information.h b/libs/clearlooks-newer/widget-information.h
index a6dd807..75be4c8 100644
--- a/libs/clearlooks-newer/widget-information.h
+++ b/libs/clearlooks-newer/widget-information.h
@@ -73,7 +73,7 @@
 
 #define GE_WIDGET_HAS_DEFAULT(object) ((object) && GE_IS_WIDGET(object) && GTK_WIDGET_HAS_DEFAULT(object))
 
-GE_INTERNAL gboolean ge_object_is_a (const GObject * object, const gchar * type_name);
+GE_INTERNAL gboolean ge_object_is_a (GObject * object, const gchar * type_name);
 
 GE_INTERNAL gboolean ge_is_combo_box_entry (GtkWidget * widget);
 GE_INTERNAL gboolean ge_is_combo_box (GtkWidget * widget, gboolean as_list);
diff --git a/libs/evoral/MSVCevoral/evoral.vcproj b/libs/evoral/MSVCevoral/evoral.vcproj
index 2a299d3..4e2de98 100644
--- a/libs/evoral/MSVCevoral/evoral.vcproj
+++ b/libs/evoral/MSVCevoral/evoral.vcproj
@@ -284,10 +284,6 @@
 				>
 			</File>
 			<File
-				RelativePath="..\src\midi_util.cpp"
-				>
-			</File>
-			<File
 				RelativePath="..\src\MIDIEvent.cpp"
 				>
 			</File>
@@ -570,7 +566,7 @@
 			UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
 			>
 			<File
-				RelativePath="..\..\..\icons\win32\msvc_resources.rc"
+				RelativePath="..\..\..\gtk2_ardour\win32\msvc_resources.rc"
 				>
 			</File>
 		</Filter>
diff --git a/libs/evoral/evoral/ControlList.hpp b/libs/evoral/evoral/ControlList.hpp
index f1a4627..7d6b294 100644
--- a/libs/evoral/evoral/ControlList.hpp
+++ b/libs/evoral/evoral/ControlList.hpp
@@ -31,7 +31,6 @@
 #include "pbd/signals.h"
 
 #include "evoral/visibility.h"
-#include "evoral/types.hpp"
 #include "evoral/Range.hpp"
 #include "evoral/Parameter.hpp"
 #include "evoral/ParameterDescriptor.hpp"
@@ -124,10 +123,17 @@ public:
 	void slide (iterator before, double distance);
 	void shift (double before, double distance);
 
+	/** add automation events
+	 * @param when absolute time in samples
+	 * @param value parameter value
+	 * @param with_guards if true, add guard-points
+	 * @param with_initial if true, add an initial point if the list is empty
+	 */
 	virtual void add (double when, double value, bool with_guards=true, bool with_initial=true);
 
 	virtual bool editor_add (double when, double value, bool with_guard);
 
+	/* to be used only for loading pre-sorted data from saved state */
 	void fast_simple_add (double when, double value);
 
 	void erase_range (double start, double end);
@@ -139,9 +145,12 @@ public:
 
 	/** Thin the number of events in this list.
 	 *
-	 * The thinning factor has no units but corresponds to the area of a
-	 * triangle computed between three points in the list.  If the area is
-	 * large, it indicates significant non-linearity between the points.
+	 * The thinning factor corresponds to the area of a triangle computed
+	 * between three points in the list (time-difference * value-difference).
+	 * If the area is large, it indicates significant non-linearity between
+	 * the points.
+	 *
+	 * Time is measured in samples, value is usually normalized to 0..1.
 	 *
 	 * During automation recording we thin the recorded points using this
 	 * value.  If a point is sufficiently co-linear with its neighbours (as
@@ -149,12 +158,19 @@ public:
 	 * not include it in the list.  The larger the value, the more points are
 	 * excluded, so this effectively measures the amount of thinning to be
 	 * done.
+	 *
+	 * @param thinning_factor area-size (default: 20)
 	 */
 	void thin (double thinning_factor);
 
 	boost::shared_ptr<ControlList> cut (double, double);
 	boost::shared_ptr<ControlList> copy (double, double);
-	void clear (double, double);
+
+	/** remove all automation events between the given time range
+	 * @param start start of range (inclusive) in audio samples
+	 * @param end end of range (inclusive) in audio samples
+	 */
+	void clear (double start, double end);
 
 	bool paste (const ControlList&, double position, float times);
 
@@ -166,8 +182,14 @@ public:
 	double get_max_y() const { return _max_yval; }
 	double get_min_y() const { return _min_yval; }
 
-	void truncate_end (double length);
-	void truncate_start (double length);
+	/** truncate the event list after the given time
+	 * @param last_coordinate last event to include
+	 */
+	void truncate_end (double last_coordinate);
+	/** truncate the event list to the given time
+	 * @param overall_length overall length
+	 */
+	void truncate_start (double overall_length);
 
 	iterator            begin()       { return _events.begin(); }
 	const_iterator      begin() const { return _events.begin(); }
@@ -189,11 +211,20 @@ public:
 		(obj.*method)(*this);
 	}
 
+	/** query value at given time (takes a read-lock, not safe while writing automation)
+	 * @param where absolute time in samples
+	 * @returns parameter value
+	 */
 	double eval (double where) {
 		Glib::Threads::RWLock::ReaderLock lm (_lock);
 		return unlocked_eval (where);
 	}
 
+	/** realtime safe version of eval, may fail if read-lock cannot be taken
+	 * @param where absolute time in samples
+	 * @param ok boolean reference if returned value is valid
+	 * @returns parameter value
+	 */
 	double rt_safe_eval (double where, bool& ok) {
 
 		Glib::Threads::RWLock::ReaderLock lm (_lock, Glib::Threads::TRY_LOCK);
@@ -257,16 +288,23 @@ public:
 		Curved
 	};
 
+	/** query interpolation style of the automation data
+	 * @returns Interpolation Style
+	 */
 	InterpolationStyle interpolation() const { return _interpolation; }
-	void set_interpolation (InterpolationStyle);
+
+	/** set the interpolation style of the automation data
+	 * @param is interpolation style
+	 */
+	void set_interpolation (InterpolationStyle is);
 
 	virtual bool touching() const { return false; }
 	virtual bool writing() const { return false; }
 	virtual bool touch_enabled() const { return false; }
-        void start_write_pass (double time);
-        void write_pass_finished (double when, double thinning_factor=0.0);
-        void set_in_write_pass (bool, bool add_point = false, double when = 0.0);
-        bool in_write_pass () const;
+	void start_write_pass (double when);
+	void write_pass_finished (double when, double thinning_factor=0.0);
+	void set_in_write_pass (bool, bool add_point = false, double when = 0.0);
+	bool in_write_pass () const;
 	bool in_new_write_pass () { return new_write_pass; }
 
 	/** Emitted when mark_dirty() is called on this object */
diff --git a/libs/evoral/evoral/ControlSet.hpp b/libs/evoral/evoral/ControlSet.hpp
index f1c2d96..5a9fc58 100644
--- a/libs/evoral/evoral/ControlSet.hpp
+++ b/libs/evoral/evoral/ControlSet.hpp
@@ -27,7 +27,6 @@
 #include "pbd/signals.h"
 
 #include "evoral/visibility.h"
-#include "evoral/types.hpp"
 #include "evoral/Parameter.hpp"
 #include "evoral/ControlList.hpp"
 
diff --git a/libs/evoral/evoral/Event.hpp b/libs/evoral/evoral/Event.hpp
index 2a6810a..cbb62e2 100644
--- a/libs/evoral/evoral/Event.hpp
+++ b/libs/evoral/evoral/Event.hpp
@@ -92,6 +92,11 @@ public:
 
 	inline bool owns_buffer() const { return _owns_buf; }
 
+	/** set event data (e.g. midi data)
+	 * @param size number of bytes
+	 * @param buf raw 8bit data
+	 * @param own set to true if the buffer owns the data (copy, allocate/free) or false to reference previously allocated data.
+	 */
 	inline void set_buffer(uint32_t size, uint8_t* buf, bool own) {
 		if (_owns_buf) {
 			free(_buf);
diff --git a/libs/evoral/evoral/EventList.hpp b/libs/evoral/evoral/EventList.hpp
index 0766d48..38ade74 100644
--- a/libs/evoral/evoral/EventList.hpp
+++ b/libs/evoral/evoral/EventList.hpp
@@ -20,10 +20,9 @@
 
 #include <list>
 
-#include "evoral/visibility.h"
-#include "evoral/EventSink.hpp"
-#include "evoral/types.hpp"
 #include "evoral/Event.hpp"
+#include "evoral/EventSink.hpp"
+#include "evoral/visibility.h"
 
 namespace Evoral {
 
diff --git a/libs/evoral/evoral/Sequence.hpp b/libs/evoral/evoral/Sequence.hpp
index 93e97c6..8485f94 100644
--- a/libs/evoral/evoral/Sequence.hpp
+++ b/libs/evoral/evoral/Sequence.hpp
@@ -28,7 +28,6 @@
 #include <glibmm/threads.h>
 
 #include "evoral/visibility.h"
-#include "evoral/types.hpp"
 #include "evoral/Note.hpp"
 #include "evoral/ControlSet.hpp"
 #include "evoral/ControlList.hpp"
diff --git a/libs/evoral/evoral/midi_util.h b/libs/evoral/evoral/midi_util.h
index 2ad5b3f..20ff949 100644
--- a/libs/evoral/evoral/midi_util.h
+++ b/libs/evoral/evoral/midi_util.h
@@ -133,8 +133,6 @@ midi_event_is_valid(const uint8_t* buffer, size_t len)
 	return true;
 }
 
-LIBEVORAL_API std::string midi_note_name (uint8_t noteval);
-
 } // namespace Evoral
 
 #endif // EVORAL_MIDI_UTIL_H
diff --git a/libs/evoral/evoral/types.hpp b/libs/evoral/evoral/types.hpp
index 7d3f415..a5d4a8c 100644
--- a/libs/evoral/evoral/types.hpp
+++ b/libs/evoral/evoral/types.hpp
@@ -27,11 +27,7 @@
 #include <limits>
 #include <list>
 
-#include "pbd/debug.h"
-
-#include "evoral/Beats.hpp"
 #include "evoral/visibility.h"
-
 #include "pbd/debug.h"
 
 namespace Evoral {
@@ -44,6 +40,8 @@ typedef int32_t event_id_t;
 /** Type of an event (opaque, mapped by application) */
 typedef uint32_t EventType;
 
+class Beats;
+
 } // namespace Evoral
 
 namespace PBD {
diff --git a/libs/evoral/src/ControlList.cpp b/libs/evoral/src/ControlList.cpp
index 73c1675..c665b69 100644
--- a/libs/evoral/src/ControlList.cpp
+++ b/libs/evoral/src/ControlList.cpp
@@ -36,6 +36,7 @@
 #include "evoral/Curve.hpp"
 #include "evoral/ParameterDescriptor.hpp"
 #include "evoral/TypeMap.hpp"
+#include "evoral/types.hpp"
 
 #include "pbd/compose.h"
 #include "pbd/debug.h"
@@ -138,6 +139,7 @@ ControlList::~ControlList()
 	for (EventList::iterator x = _events.begin(); x != _events.end(); ++x) {
 		delete (*x);
 	}
+	_events.clear ();
 
 	delete _curve;
 }
@@ -177,6 +179,9 @@ ControlList::copy_events (const ControlList& other)
 {
 	{
 		Glib::Threads::RWLock::WriterLock lm (_lock);
+		for (EventList::iterator x = _events.begin(); x != _events.end(); ++x) {
+			delete (*x);
+		}
 		_events.clear ();
 		for (const_iterator i = other.begin(); i != other.end(); ++i) {
 			_events.push_back (new ControlEvent ((*i)->when, (*i)->value));
@@ -215,6 +220,9 @@ ControlList::clear ()
 {
 	{
 		Glib::Threads::RWLock::WriterLock lm (_lock);
+		for (EventList::iterator x = _events.begin(); x != _events.end(); ++x) {
+			delete (*x);
+		}
 		_events.clear ();
 		unlocked_invalidate_insert_iterator ();
 		mark_dirty ();
@@ -1659,6 +1667,12 @@ ControlList::paste (const ControlList& alist, double pos, float /*times*/)
 			if (alist.parameter() != parameter()) {
 				const ParameterDescriptor& src_desc = alist.descriptor();
 
+				// This does not work for logscale and will probably also not do
+				// the right thing for integer_step and sr_dependent parameters.
+				//
+				// TODO various flags from from ARDOUR::ParameterDescriptor
+				// to Evoral::ParameterDescriptor
+
 				value -= src_desc.lower;  // translate to 0-relative
 				value /= (src_desc.upper - src_desc.lower);  // normalize range
 				value *= (_desc.upper - _desc.lower);  // scale to our range
diff --git a/libs/evoral/src/Event.cpp b/libs/evoral/src/Event.cpp
index 64caba3..09b2402 100644
--- a/libs/evoral/src/Event.cpp
+++ b/libs/evoral/src/Event.cpp
@@ -17,7 +17,9 @@
  */
 
 #include <glib.h>
+
 #include "evoral/Event.hpp"
+#include "evoral/Beats.hpp"
 
 namespace Evoral {
 
diff --git a/libs/evoral/src/MIDIEvent.cpp b/libs/evoral/src/MIDIEvent.cpp
index 4985f66..d03a3ff 100644
--- a/libs/evoral/src/MIDIEvent.cpp
+++ b/libs/evoral/src/MIDIEvent.cpp
@@ -17,6 +17,7 @@
  */
 
 #include <string>
+#include "evoral/Beats.hpp"
 #include "evoral/MIDIEvent.hpp"
 #ifdef EVORAL_MIDI_XML
 	#include "pbd/xml++.h"
diff --git a/libs/evoral/src/Note.cpp b/libs/evoral/src/Note.cpp
index afd7330..a63bf43 100644
--- a/libs/evoral/src/Note.cpp
+++ b/libs/evoral/src/Note.cpp
@@ -23,6 +23,8 @@
 #include "evoral/Note.hpp"
 #endif
 
+#include "evoral/Beats.hpp"
+
 namespace Evoral {
 
 template<typename Time>
diff --git a/libs/evoral/src/SMF.cpp b/libs/evoral/src/SMF.cpp
index b6ec8ec..45109b5 100644
--- a/libs/evoral/src/SMF.cpp
+++ b/libs/evoral/src/SMF.cpp
@@ -22,7 +22,11 @@
 #include <cmath>
 #include <iostream>
 #include <stdint.h>
+
+#include <glib/gstdio.h>
+
 #include "libsmf/smf.h"
+
 #include "evoral/Event.hpp"
 #include "evoral/SMF.hpp"
 #include "evoral/midi_util.h"
@@ -78,7 +82,7 @@ SMF::seek_to_track(int track)
 bool
 SMF::test(const std::string& path)
 {
-	FILE* f = fopen(path.c_str(), "r");
+	FILE* f = g_fopen(path.c_str(), "r");
 	if (f == 0) {
 		return false;
 	}
@@ -108,7 +112,7 @@ SMF::open(const std::string& path, int track) THROW_FILE_ERROR
 		smf_delete(_smf);
 	}
 
-	FILE* f = fopen(path.c_str(), "r");
+	FILE* f = g_fopen(path.c_str(), "r");
 	if (f == 0) {
 		return -1;
 	} else if ((_smf = smf_load(f)) == 0) {
@@ -176,7 +180,7 @@ SMF::create(const std::string& path, int track, uint16_t ppqn) THROW_FILE_ERROR
 	{
 		/* put a stub file on disk */
 
-		FILE* f = fopen (path.c_str(), "w+");
+		FILE* f = g_fopen (path.c_str(), "w+");
 		if (f == 0) {
 			return -1;
 		}
@@ -405,7 +409,7 @@ SMF::end_write(string const & path) THROW_FILE_ERROR
 		return;
 	}
 
-	FILE* f = fopen (path.c_str(), "w+");
+	FILE* f = g_fopen (path.c_str(), "w+");
 	if (f == 0) {
 		throw FileError (path);
 	}
diff --git a/libs/evoral/src/Sequence.cpp b/libs/evoral/src/Sequence.cpp
index 7f03248..19a0fb1 100644
--- a/libs/evoral/src/Sequence.cpp
+++ b/libs/evoral/src/Sequence.cpp
@@ -31,6 +31,7 @@
 #include "pbd/compose.h"
 #include "pbd/error.h"
 
+#include "evoral/Beats.hpp"
 #include "evoral/Control.hpp"
 #include "evoral/ControlList.hpp"
 #include "evoral/ControlSet.hpp"
@@ -40,7 +41,7 @@
 #include "evoral/TypeMap.hpp"
 #include "evoral/midi_util.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace PBD;
diff --git a/libs/evoral/src/i18n.h b/libs/evoral/src/i18n.h
deleted file mode 100644
index dcbbfcf..0000000
--- a/libs/evoral/src/i18n.h
+++ /dev/null
@@ -1,16 +0,0 @@
-#ifndef __i18n_h__
-#define __i18n_h__
-
-#include "pbd/compose.h"
-#include "pbd/convert.h"
-#include "gettext.h"
-
-#include <vector>
-#include <string>
-
-#define _(Text)  dgettext (PACKAGE,Text)
-#define N_(Text) gettext_noop (Text)
-#define X_(Text) Text
-#define I18N(Array) PBD::internationalize (PACKAGE, Array)
-
-#endif // __i18n_h__
diff --git a/libs/evoral/src/midi_util.cpp b/libs/evoral/src/midi_util.cpp
deleted file mode 100644
index be7010c..0000000
--- a/libs/evoral/src/midi_util.cpp
+++ /dev/null
@@ -1,56 +0,0 @@
-/* This file is part of Evoral.
- * Copyright (C) 2008 David Robillard <http://drobilla.net>
- * Copyright (C) 2009 Paul Davis
- *
- * Evoral is free software; you can redistribute it and/or modify it under the
- * terms of the GNU General Public License as published by the Free Software
- * Foundation; either version 2 of the License, or (at your option) any later
- * version.
- *
- * Evoral 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 details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-#include "evoral/midi_util.h"
-#include <cstdio>
-
-namespace Evoral {
-
-std::string
-midi_note_name (uint8_t val)
-{
-	if (val > 127) {
-		return "???";
-	}
-
-	static const char* notes[] = {
-		"C",
-		"C#",
-		"D",
-		"D#",
-		"E",
-		"F",
-		"F#",
-		"G",
-		"G#",
-		"A",
-		"A#",
-		"B"
-	};
-
-	/* MIDI note 0 is in octave -1 (in scientific pitch notation) */
-	int octave = val / 12 - 1;
-	static char buf[8];
-
-	val = val % 12;
-
-	snprintf (buf, sizeof (buf), "%s%d", notes[val], octave);
-	return buf;
-}
-
-}
diff --git a/libs/evoral/src/types.cpp b/libs/evoral/src/types.cpp
index 50c2975..db061fd 100644
--- a/libs/evoral/src/types.cpp
+++ b/libs/evoral/src/types.cpp
@@ -18,6 +18,7 @@
 
 #include <limits.h>
 
+#include "evoral/Beats.hpp"
 #include "evoral/types.hpp"
 
 namespace Evoral {
diff --git a/libs/evoral/test/SequenceTest.hpp b/libs/evoral/test/SequenceTest.hpp
index 3207541..de51f71 100644
--- a/libs/evoral/test/SequenceTest.hpp
+++ b/libs/evoral/test/SequenceTest.hpp
@@ -2,6 +2,7 @@
 #include <sigc++/sigc++.h>
 #include <cppunit/TestFixture.h>
 #include <cppunit/extensions/HelperMacros.h>
+#include "evoral/Beats.hpp"
 #include "evoral/Sequence.hpp"
 #include "evoral/TypeMap.hpp"
 #include "evoral/EventSink.hpp"
diff --git a/libs/evoral/wscript b/libs/evoral/wscript
index 12ebffe..7649bb8 100644
--- a/libs/evoral/wscript
+++ b/libs/evoral/wscript
@@ -82,7 +82,6 @@ def build(bld):
             src/ControlSet.cpp
             src/Curve.cpp
             src/Event.cpp
-            src/midi_util.cpp
             src/MIDIEvent.cpp
             src/Note.cpp
             src/SMF.cpp
@@ -107,7 +106,7 @@ def build(bld):
     obj.includes       = ['.', './src']
     obj.name           = 'libevoral'
     obj.target         = 'evoral'
-    obj.uselib         = 'GLIBMM GTHREAD SMF'
+    obj.uselib         = 'GLIBMM GTHREAD SMF XML'
     obj.use            = 'libsmf libpbd'
     obj.vnum           = EVORAL_LIB_VERSION
     obj.install_path   = bld.env['LIBDIR']
@@ -122,7 +121,7 @@ def build(bld):
         obj.includes       = ['.', './src']
         obj.name           = 'libevoral_static'
         obj.target         = 'evoral_static'
-        obj.uselib         = 'GLIBMM GTHREAD SMF'
+        obj.uselib         = 'GLIBMM GTHREAD SMF XML'
         obj.use            = 'libsmf libpbd'
         obj.vnum           = EVORAL_LIB_VERSION
         obj.install_path   = ''
diff --git a/libs/gtkmm2ext/MSVCgtkmm2ext/gtkmm2ext.vcproj b/libs/gtkmm2ext/MSVCgtkmm2ext/gtkmm2ext.vcproj
index f86add8..9e61bd4 100644
--- a/libs/gtkmm2ext/MSVCgtkmm2ext/gtkmm2ext.vcproj
+++ b/libs/gtkmm2ext/MSVCgtkmm2ext/gtkmm2ext.vcproj
@@ -42,7 +42,7 @@
 				AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
 				Optimization="0"
 				AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\timecode;..\..\rubberband;"..\..\vamp-sdk";"..\..\midi++2";..\..\taglib;..\..\taglib\taglib;..\..\taglib\taglib\toolkit;..\..\audiographer;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\glibmm";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor";"$(GenericIncludeFolder)\lilv-0";"$(GenericIncludeFolder)\suil-0";"$(GenericIncludeFolder)\serd-0";"$(GenericIncludeFolder)\sord-0";"$(GenericIncludeFolder)\lv2";"$(GenericIncludeFolder)\sratom-0""
-				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;BUILDING_GTKMM2EXT;LIBGTKMM2EXT_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_DEBUG;DEBUG="Debug";ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PACKAGE="\"gtkmm2ext\"";PROGRAM_NAME="\"Mixbus3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;BUILDING_GTKMM2EXT;LIBGTKMM2EXT_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_DEBUG;DEBUG="Debug";ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PACKAGE="\"gtkmm2ext\"";PROGRAM_NAME="\"Mixbus3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
 				MinimalRebuild="true"
 				RuntimeLibrary="3"
 				WarningLevel="3"
@@ -122,7 +122,7 @@
 				Optimization="2"
 				InlineFunctionExpansion="1"
 				AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\timecode;..\..\rubberband;"..\..\vamp-sdk";"..\..\midi++2";..\..\taglib;..\..\taglib\taglib;..\..\taglib\taglib\toolkit;..\..\audiographer;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\glibmm";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor";"$(GenericIncludeFolder)\lilv-0";"$(GenericIncludeFolder)\suil-0";"$(GenericIncludeFolder)\serd-0";"$(GenericIncludeFolder)\sord-0";"$(GenericIncludeFolder)\lv2";"$(GenericIncludeFolder)\sratom-0""
-				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_GTKMM2EXT;LIBGTKMM2EXT_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;NDEBUG;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PACKAGE="\"gtkmm2ext\"";PROGRAM_NAME="\"Mixbus3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_GTKMM2EXT;LIBGTKMM2EXT_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;NDEBUG;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PACKAGE="\"gtkmm2ext\"";PROGRAM_NAME="\"Mixbus3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
 				StringPooling="false"
 				RuntimeLibrary="2"
 				EnableEnhancedInstructionSet="1"
@@ -201,7 +201,7 @@
 				AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
 				Optimization="0"
 				AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\timecode;..\..\rubberband;"..\..\vamp-sdk";"..\..\midi++2";..\..\taglib;..\..\taglib\taglib;..\..\taglib\taglib\toolkit;..\..\audiographer;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\glibmm";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor";"$(GenericIncludeFolder)\lilv-0";"$(GenericIncludeFolder)\suil-0";"$(GenericIncludeFolder)\serd-0";"$(GenericIncludeFolder)\sord-0";"$(GenericIncludeFolder)\lv2";"$(GenericIncludeFolder)\sratom-0""
-				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_GTKMM2EXT;LIBGTKMM2EXT_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PACKAGE="\"gtkmm2ext\"";PROGRAM_NAME="\"Mixbus3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_GTKMM2EXT;LIBGTKMM2EXT_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PACKAGE="\"gtkmm2ext\"";PROGRAM_NAME="\"Mixbus3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
 				StringPooling="false"
 				RuntimeLibrary="2"
 				EnableEnhancedInstructionSet="1"
@@ -294,6 +294,10 @@
 				>
 			</File>
 			<File
+				RelativePath="..\cairo_icon.cc"
+				>
+			</File>
+			<File
 				RelativePath="..\cairo_packer.cc"
 				>
 			</File>
@@ -378,6 +382,10 @@
 				>
 			</File>
 			<File
+				RelativePath="..\pane.cc"
+				>
+			</File>
+			<File
 				RelativePath="..\paths_dialog.cc"
 				>
 			</File>
@@ -406,6 +414,10 @@
 				>
 			</File>
 			<File
+				RelativePath="..\searchbar.cc"
+				>
+			</File>
+			<File
 				RelativePath="..\selector.cc"
 				>
 			</File>
@@ -418,6 +430,10 @@
 				>
 			</File>
 			<File
+				RelativePath="..\tabbable.cc"
+				>
+			</File>
+			<File
 				RelativePath="..\tearoff.cc"
 				>
 			</File>
@@ -442,6 +458,10 @@
 				>
 			</File>
 			<File
+				RelativePath="..\window_proxy.cc"
+				>
+			</File>
+			<File
 				RelativePath="..\window_title.cc"
 				>
 			</File>
@@ -488,6 +508,10 @@
 				>
 			</File>
 			<File
+				RelativePath="..\gtkmm2ext\cairo_icon.h"
+				>
+			</File>
+			<File
 				RelativePath="..\gtkmm2ext\cairo_packer.h"
 				>
 			</File>
@@ -588,6 +612,10 @@
 				>
 			</File>
 			<File
+				RelativePath="..\gtkmm2ext\pane.h"
+				>
+			</File>
+			<File
 				RelativePath="..\gtkmm2ext\persistent_tooltip.h"
 				>
 			</File>
@@ -616,6 +644,10 @@
 				>
 			</File>
 			<File
+				RelativePath="..\gtkmm2ext\searchbar.h"
+				>
+			</File>
+			<File
 				RelativePath="..\gtkmm2ext\selector.h"
 				>
 			</File>
@@ -632,6 +664,10 @@
 				>
 			</File>
 			<File
+				RelativePath="..\gtkmm2ext\tabbable.h"
+				>
+			</File>
+			<File
 				RelativePath="..\gtkmm2ext\tearoff.h"
 				>
 			</File>
@@ -656,6 +692,10 @@
 				>
 			</File>
 			<File
+				RelativePath="..\gtkmm2ext\window_proxy.h"
+				>
+			</File>
+			<File
 				RelativePath="..\gtkmm2ext\window_title.h"
 				>
 			</File>
@@ -666,7 +706,7 @@
 			UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
 			>
 			<File
-				RelativePath="..\..\..\icons\win32\msvc_resources.rc"
+				RelativePath="..\..\..\gtk2_ardour\win32\msvc_resources.rc"
 				>
 			</File>
 		</Filter>
diff --git a/libs/gtkmm2ext/actions.cc b/libs/gtkmm2ext/actions.cc
index 9471067..840c9dc 100644
--- a/libs/gtkmm2ext/actions.cc
+++ b/libs/gtkmm2ext/actions.cc
@@ -41,7 +41,7 @@
 #include "gtkmm2ext/actions.h"
 #include "gtkmm2ext/utils.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace Gtk;
@@ -53,234 +53,6 @@ using namespace Gtkmm2ext;
 RefPtr<UIManager> ActionManager::ui_manager;
 string ActionManager::unbound_string = "--";
 
-
-RefPtr<Action>
-ActionManager::register_action (RefPtr<ActionGroup> group, const char * name, const char * label, slot<void> sl)
-{
-	RefPtr<Action> act;
-
-	act = Action::create (name, label);
-	group->add (act, sl);
-
-	return act;
-}
-
-RefPtr<Action>
-ActionManager::register_action (RefPtr<ActionGroup> group, const char * name, const char * label)
-{
-	RefPtr<Action> act;
-
-	act = Action::create (name, label);
-	group->add (act);
-
-	return act;
-}
-
-
-RefPtr<Action>
-ActionManager::register_radio_action (RefPtr<ActionGroup> group, RadioAction::Group& rgroup, const char * name, const char * label, slot<void> sl)
-{
-	RefPtr<Action> act;
-
-	act = RadioAction::create (rgroup, name, label);
-	group->add (act, sl);
-
-	return act;
-}
-
-RefPtr<Action>
-ActionManager::register_radio_action (
-	RefPtr<ActionGroup> group, RadioAction::Group& rgroup, string const & name, string const & label, string const & tooltip, slot<void> sl
-	)
-{
-	RefPtr<Action> act;
-
-	act = RadioAction::create (rgroup, name, label, tooltip);
-	group->add (act, sl);
-
-	return act;
-}
-
-RefPtr<Action>
-ActionManager::register_toggle_action (RefPtr<ActionGroup> group, const char * name, const char * label, slot<void> sl)
-{
-	RefPtr<Action> act;
-
-	act = ToggleAction::create (name, label);
-	group->add (act, sl);
-
-	return act;
-}
-
-RefPtr<Action>
-ActionManager::register_toggle_action (RefPtr<ActionGroup> group, string const & name, string const & label, string const & tooltip, slot<void> sl)
-{
-	RefPtr<Action> act;
-
-	act = ToggleAction::create (name, label, tooltip);
-	group->add (act, sl);
-
-	return act;
-}
-
-bool
-ActionManager::lookup_entry (const ustring accel_path, Gtk::AccelKey& key)
-{
-	GtkAccelKey gkey;
-	bool known = gtk_accel_map_lookup_entry (accel_path.c_str(), &gkey);
-
-	if (known) {
-		key = AccelKey (gkey.accel_key, Gdk::ModifierType (gkey.accel_mods));
-	} else {
-		key = AccelKey (GDK_VoidSymbol, Gdk::ModifierType (0));
-	}
-
-	return known;
-}
-
-struct SortActionsByLabel {
-	bool operator() (Glib::RefPtr<Gtk::Action> a, Glib::RefPtr<Gtk::Action> b) {
-		ustring astr = a->get_accel_path();
-		ustring bstr = b->get_accel_path();
-		return astr < bstr;
-	}
-};
-
-void
-ActionManager::get_all_actions (vector<string>& groups, vector<string>& names, vector<string>& tooltips, vector<AccelKey>& bindings)
-{
-	/* the C++ API for functions used here appears to be broken in
-	   gtkmm2.6, so we fall back to the C level.
-	*/
-
-	GList* list = gtk_ui_manager_get_action_groups (ui_manager->gobj());
-	GList* node;
-	GList* acts;
-
-	for (node = list; node; node = g_list_next (node)) {
-
-		GtkActionGroup* group = (GtkActionGroup*) node->data;
-
-		/* first pass: collect them all */
-
-		typedef std::list<Glib::RefPtr<Gtk::Action> > action_list;
-		action_list the_acts;
-
-		for (acts = gtk_action_group_list_actions (group); acts; acts = g_list_next (acts)) {
-			GtkAction* action = (GtkAction*) acts->data;
-			the_acts.push_back (Glib::wrap (action, true));
-		}
-
-		/* now sort by label */
-
-		SortActionsByLabel cmp;
-		the_acts.sort (cmp);
-
-		for (action_list::iterator a = the_acts.begin(); a != the_acts.end(); ++a) {
-
-			string accel_path = (*a)->get_accel_path ();
-
-			groups.push_back (gtk_action_group_get_name(group));
-			names.push_back (accel_path.substr (accel_path.find_last_of ('/') + 1));
-			tooltips.push_back ((*a)->get_tooltip ());
-
-			AccelKey key;
-			lookup_entry (accel_path, key);
-			bindings.push_back (AccelKey (key.get_key(), Gdk::ModifierType (key.get_mod())));
-		}
-	}
-}
-
-void
-ActionManager::get_all_actions (vector<string>& names, vector<string>& paths, vector<string>& tooltips, vector<string>& keys, vector<AccelKey>& bindings)
-{
-	/* the C++ API for functions used here appears to be broken in
-	   gtkmm2.6, so we fall back to the C level.
-	*/
-
-	GList* list = gtk_ui_manager_get_action_groups (ui_manager->gobj());
-	GList* node;
-	GList* acts;
-
-	for (node = list; node; node = g_list_next (node)) {
-
-		GtkActionGroup* group = (GtkActionGroup*) node->data;
-
-		/* first pass: collect them all */
-
-		typedef std::list<Glib::RefPtr<Gtk::Action> > action_list;
-		action_list the_acts;
-
-		for (acts = gtk_action_group_list_actions (group); acts; acts = g_list_next (acts)) {
-			GtkAction* action = (GtkAction*) acts->data;
-			the_acts.push_back (Glib::wrap (action, true));
-		}
-
-		/* now sort by label */
-
-		SortActionsByLabel cmp;
-		the_acts.sort (cmp);
-
-		for (action_list::iterator a = the_acts.begin(); a != the_acts.end(); ++a) {
-
-			ustring const label = (*a)->property_label ();
-			string const accel_path = (*a)->get_accel_path ();
-
-			names.push_back (label);
-			paths.push_back (accel_path);
-			tooltips.push_back ((*a)->get_tooltip ());
-
-			AccelKey key;
-			keys.push_back (get_key_representation (accel_path, key));
-			bindings.push_back (AccelKey (key.get_key(), Gdk::ModifierType (key.get_mod())));
-		}
-	}
-}
-
-void
-ActionManager::enable_accelerators ()
-{
-	/* the C++ API for functions used here appears to be broken in
-	   gtkmm2.6, so we fall back to the C level.
-	*/
-
-	GList* list = gtk_ui_manager_get_action_groups (ui_manager->gobj());
-	GList* node;
-	GList* acts;
-	string ui_string = "<ui>";
-
-	/* get all actions, build a string describing them all as <accelerator
-	 * action="name"/>
-	 */
-
-	for (node = list; node; node = g_list_next (node)) {
-
-		GtkActionGroup* group = (GtkActionGroup*) node->data;
-
-		for (acts = gtk_action_group_list_actions (group); acts; acts = g_list_next (acts)) {
-			ui_string += "<accelerator action=\"";
-
-			/* OK, this is pretty stupid ... there is the full
-			 * accel path returned by gtk_action_get_accel_path ()
-			 * but of course the UIManager doesn't use that, but
-			 * just a name, which is the last component of the
-			 * path. What a totally ridiculous design.
-			 */
-
-			string fullpath = gtk_action_get_accel_path ((GtkAction*) acts->data);
-
-			ui_string += Glib::path_get_basename (fullpath);
-			ui_string += "\"/>";
-		}
-	}
-
-	ui_string += "</ui>";
-
-	/* and load it */
-
-	ui_manager->add_ui_from_string (ui_string);
-}
-
 struct ActionState {
 	GtkAction* action;
 	bool       sensitive;
@@ -348,12 +120,6 @@ ActionManager::disable_active_actions ()
 	actions_disabled = true;
 }
 
-void
-ActionManager::add_action_group (RefPtr<ActionGroup> grp)
-{
-	ui_manager->insert_action_group (grp);
-}
-
 Widget*
 ActionManager::get_widget (const char * name)
 {
@@ -401,7 +167,7 @@ ActionManager::get_action (const char* group_name, const char* action_name)
 	   gtkmm2.6, so we fall back to the C level.
 	*/
 
-	if (ui_manager == 0) {
+	if (! ui_manager) {
 		return RefPtr<Action> ();
 	}
 
@@ -421,36 +187,12 @@ ActionManager::get_action (const char* group_name, const char* action_name)
 				act = Glib::wrap (_act, true);
 				break;
 			}
-		}
-	}
-
-	return act;
-}
-
-RefPtr<Action>
-ActionManager::get_action_from_name (const char* name)
-{
-	/* the C++ API for functions used here appears to be broken in
-	   gtkmm2.6, so we fall back to the C level.
-	*/
-
-	GList* list = gtk_ui_manager_get_action_groups (ui_manager->gobj());
-	GList* node;
-	GList* acts;
-
-	for (node = list; node; node = g_list_next (node)) {
-
-		GtkActionGroup* group = (GtkActionGroup*) node->data;
 
-		for (acts = gtk_action_group_list_actions (group); acts; acts = g_list_next (acts)) {
-			GtkAction* action = (GtkAction*) acts->data;
-			if (!strcmp (gtk_action_get_name (action), name)) {
-				return Glib::wrap (action, true);
-			}
+			break;
 		}
 	}
 
-	return RefPtr<Action>();
+	return act;
 }
 
 void
@@ -522,20 +264,6 @@ ActionManager::set_toggleaction_state (string n, bool s)
 	delete [] group_name;
 }
 
-string
-ActionManager::get_key_representation (const string& accel_path, AccelKey& key)
-{
-	bool known = lookup_entry (accel_path, key);
-
-	if (known) {
-		uint32_t k = possibly_translate_legal_accelerator_to_real_key (key.get_key());
-		key = AccelKey (k, Gdk::ModifierType (key.get_mod()));
-		return ui_manager->get_accel_group()->get_label (key.get_key(), Gdk::ModifierType (key.get_mod()));
-	}
-
-	return unbound_string;
-}
-
 void
 ActionManager::do_action (const char* group, const char*action)
 {
@@ -556,4 +284,3 @@ ActionManager::set_toggle_action (const char* group, const char*action, bool yn)
 		}
 	}
 }
-
diff --git a/libs/gtkmm2ext/ardour_icon.cc b/libs/gtkmm2ext/ardour_icon.cc
index e06d489..6a7cabe 100644
--- a/libs/gtkmm2ext/ardour_icon.cc
+++ b/libs/gtkmm2ext/ardour_icon.cc
@@ -522,10 +522,15 @@ static void icon_rec_enable (cairo_t *cr, const int width, const int height, con
 	const double y = height * .5;
 	const double r = std::min (x, y) * .55;
 	cairo_arc (cr, x, y, r, 0, 2 * M_PI);
-	if (state == Gtkmm2ext::ExplicitActive)
-		cairo_set_source_rgba (cr, 0.95, 0.10, 0.10, 1.0);
-	else
-		cairo_set_source_rgba (cr, 0.95, 0.44, 0.44, 1.0); // #f46f6f
+	if (state == Gtkmm2ext::ExplicitActive) {
+		cairo_set_source_rgba (cr, 1.0, .1, .1, 1.0);
+	}
+	else if (state == Gtkmm2ext::ImplicitActive) {
+		cairo_set_source_rgba (cr, .9, .3, .3, 1.0);
+	}
+	else {
+		cairo_set_source_rgba (cr, .4, .3, .3, 1.0);
+	}
 	cairo_fill_preserve (cr);
 	cairo_set_source_rgba (cr, 0.0, 0.0, 0.0, 0.8); // outline
 	cairo_set_line_width (cr, 1);
@@ -543,9 +548,13 @@ static void icon_rec_tape (cairo_t *cr, const int width, const int height, const
 
 	cairo_arc (cr, 0, 0, r, 0, 2 * M_PI);
 	if (state == Gtkmm2ext::ExplicitActive) {
-		cairo_set_source_rgba (cr, .95, .1, .1, 1.);
-	} else {
-		cairo_set_source_rgba (cr, .95, .44, .44, 1.); // #f46f6f
+		cairo_set_source_rgba (cr, 1.0, .1, .1, 1.0);
+	}
+	else if (state == Gtkmm2ext::ImplicitActive) {
+		cairo_set_source_rgba (cr, .9, .3, .3, 1.0);
+	}
+	else {
+		cairo_set_source_rgba (cr, .4, .3, .3, 1.0);
 	}
 	cairo_fill_preserve (cr);
 	cairo_set_source_rgba (cr, .0, .0, .0, .5);
@@ -580,10 +589,15 @@ static void icon_rec_tape (cairo_t *cr, const int width, const int height, const
 	cairo_restore (cr);
 
 	cairo_arc (cr, 0, 0, r * .3, 0, 2 * M_PI);
-	if (state == Gtkmm2ext::ExplicitActive)
-		cairo_set_source_rgba (cr, .95, .1, .1, 1.);
-	else
-		cairo_set_source_rgba (cr, .95, .44, .44, 1.); // #f46f6f
+	if (state == Gtkmm2ext::ExplicitActive) {
+		cairo_set_source_rgba (cr, 1.0, .1, .1, 1.0);
+	}
+	else if (state == Gtkmm2ext::ImplicitActive) {
+		cairo_set_source_rgba (cr, .9, .3, .3, 1.0);
+	}
+	else {
+		cairo_set_source_rgba (cr, .4, .3, .3, 1.0);
+	}
 	cairo_fill (cr);
 	cairo_set_source_rgba (cr, .0, .0, .0, 1.0);
 	cairo_arc (cr, 0, 0, r *.15, 0, 2 * M_PI); // hole in the middle
@@ -849,7 +863,7 @@ static void icon_close_cross (cairo_t *cr, const int width, const int height, co
 	const double y = height * .5;
 	const double o = .5 + std::min (x, y) * .4;
 	ardour_icon_set_source_rgba (cr, fg_color);
-	cairo_set_line_width (cr, 1);
+	cairo_set_line_width (cr, 1.0);
 	cairo_move_to (cr, x-o, y-o);
 	cairo_line_to (cr, x+o, y+o);
 	cairo_move_to (cr, x+o, y-o);
@@ -898,15 +912,15 @@ static void icon_strip_width (cairo_t *cr, const int width, const int height, co
 	const double x1 = width   * .8;
 
 	const double y0 = height  * .25;
-	const double y1= height   * .75;
+	const double y1 = height  * .75;
 
-	const double ym= height   * .5;
+	const double ym = height  * .5;
 
 	// arrow
-	const double xa0= height  * .39;
-	const double xa1= height  * .61;
-	const double ya0= height  * .35;
-	const double ya1= height  * .65;
+	const double xa0= width  * .39;
+	const double xa1= width  * .61;
+	const double ya0= height * .35;
+	const double ya1= height * .65;
 
 	ardour_icon_set_source_rgba (cr, fg_color);
 	cairo_set_line_width (cr, 1);
diff --git a/libs/gtkmm2ext/barcontroller.cc b/libs/gtkmm2ext/barcontroller.cc
index 0c777ed..d213f22 100644
--- a/libs/gtkmm2ext/barcontroller.cc
+++ b/libs/gtkmm2ext/barcontroller.cc
@@ -31,7 +31,7 @@
 #include "gtkmm2ext/barcontroller.h"
 #include "gtkmm2ext/cairo_widget.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace Gtk;
diff --git a/libs/gtkmm2ext/bindable_button.cc b/libs/gtkmm2ext/bindable_button.cc
index 5c0cc3c..cc9695f 100644
--- a/libs/gtkmm2ext/bindable_button.cc
+++ b/libs/gtkmm2ext/bindable_button.cc
@@ -26,7 +26,7 @@
 #include "gtkmm2ext/bindable_button.h"
 #include "gtkmm2ext/gui_thread.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace Gtkmm2ext;
 using namespace std;
diff --git a/libs/gtkmm2ext/binding_proxy.cc b/libs/gtkmm2ext/binding_proxy.cc
index dfa2b4a..5ba5f7e 100644
--- a/libs/gtkmm2ext/binding_proxy.cc
+++ b/libs/gtkmm2ext/binding_proxy.cc
@@ -25,7 +25,7 @@
 
 #include <gtkmm2ext/binding_proxy.h>
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace Gtkmm2ext;
 using namespace std;
diff --git a/libs/gtkmm2ext/bindings.cc b/libs/gtkmm2ext/bindings.cc
index 5efb40e..e25ed20 100644
--- a/libs/gtkmm2ext/bindings.cc
+++ b/libs/gtkmm2ext/bindings.cc
@@ -1,607 +1,1329 @@
 /*
-    Copyright (C) 2012 Paul Davis
+  Copyright (C) 2012 Paul Davis
 
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
+  This program is free software; you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation; either version 2 of the License, or
+  (at your option) any later version.
 
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
 
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 
 */
 
 #include <iostream>
 
 #include "pbd/gstdio_compat.h"
+#include <gtkmm/accelmap.h>
+#include <gtkmm/uimanager.h>
 
-#include "pbd/xml++.h"
 #include "pbd/convert.h"
+#include "pbd/debug.h"
+#include "pbd/error.h"
+#include "pbd/replace_all.h"
+#include "pbd/xml++.h"
 
 #include "gtkmm2ext/actions.h"
 #include "gtkmm2ext/bindings.h"
+#include "gtkmm2ext/debug.h"
 #include "gtkmm2ext/keyboard.h"
+#include "gtkmm2ext/utils.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace Glib;
 using namespace Gtk;
 using namespace Gtkmm2ext;
+using namespace PBD;
 
-uint32_t Bindings::_ignored_state = 0;
+list<Bindings*> Bindings::bindings; /* global. Gulp */
+list<ActionMap*> ActionMap::action_maps; /* global. Gulp */
+PBD::Signal1<void,Bindings*> Bindings::BindingsChanged;
 
-MouseButton::MouseButton (uint32_t state, uint32_t keycode)
+template <typename IteratorValueType>
+struct ActionNameRegistered
 {
-        uint32_t ignore = Bindings::ignored_state();
-
-        if (gdk_keyval_is_upper (keycode) && gdk_keyval_is_lower (keycode)) {
-                /* key is not subject to case, so ignore SHIFT
-                 */
-                ignore |= GDK_SHIFT_MASK;
-        }
+	ActionNameRegistered(std::string const& name)
+		: action_name(name)
+	{}
+
+	bool operator()(IteratorValueType elem) const {
+		return elem.second.action_name == action_name;
+	}
+	std::string const& action_name;
+};
 
-        _val = (state & ~ignore);
-        _val <<= 32;
-        _val |= keycode;
+MouseButton::MouseButton (uint32_t state, uint32_t keycode)
+{
+	uint32_t ignore = ~Keyboard::RelevantModifierKeyMask;
+
+	/* this is a slightly wierd test that relies on
+	 * gdk_keyval_is_{upper,lower}() returning true for keys that have no
+	 * case-sensitivity. This covers mostly non-alphanumeric keys.
+	 */
+
+	if (gdk_keyval_is_upper (keycode) && gdk_keyval_is_lower (keycode)) {
+		/* key is not subject to case, so ignore SHIFT
+		 */
+		ignore |= GDK_SHIFT_MASK;
+	}
+
+	_val = (state & ~ignore);
+	_val <<= 32;
+	_val |= keycode;
 };
 
 bool
 MouseButton::make_button (const string& str, MouseButton& b)
 {
-        int s = 0;
+	int s = 0;
 
-        if (str.find ("Primary") != string::npos) {
-                s |= Keyboard::PrimaryModifier;
-        }
+	if (str.find ("Primary") != string::npos) {
+		s |= Keyboard::PrimaryModifier;
+	}
 
-        if (str.find ("Secondary") != string::npos) {
-                s |= Keyboard::SecondaryModifier;
-        }
+	if (str.find ("Secondary") != string::npos) {
+		s |= Keyboard::SecondaryModifier;
+	}
 
-        if (str.find ("Tertiary") != string::npos) {
-                s |= Keyboard::TertiaryModifier;
-        }
+	if (str.find ("Tertiary") != string::npos) {
+		s |= Keyboard::TertiaryModifier;
+	}
 
-        if (str.find ("Level4") != string::npos) {
-                s |= Keyboard::Level4Modifier;
-        }
+	if (str.find ("Level4") != string::npos) {
+		s |= Keyboard::Level4Modifier;
+	}
 
-        string::size_type lastmod = str.find_last_of ('-');
-        uint32_t button_number;
+	string::size_type lastmod = str.find_last_of ('-');
+	uint32_t button_number;
 
-        if (lastmod == string::npos) {
-                button_number = PBD::atoi (str);
-        } else {
-                button_number = PBD::atoi (str.substr (lastmod+1));
-        }
+	if (lastmod == string::npos) {
+		button_number = PBD::atoi (str);
+	} else {
+		button_number = PBD::atoi (str.substr (lastmod+1));
+	}
 
-        b = MouseButton (s, button_number);
-        return true;
+	b = MouseButton (s, button_number);
+	return true;
 }
 
 string
 MouseButton::name () const
 {
-        int s = state();
-
-        string str;
-
-        if (s & Keyboard::PrimaryModifier) {
-                str += "Primary";
-        }
-        if (s & Keyboard::SecondaryModifier) {
-                if (!str.empty()) {
-                        str += '-';
-                }
-                str += "Secondary";
-        }
-        if (s & Keyboard::TertiaryModifier) {
-                if (!str.empty()) {
-                        str += '-';
-                }
-                str += "Tertiary";
-        }
-        if (s & Keyboard::Level4Modifier) {
-                if (!str.empty()) {
-                        str += '-';
-                }
-                str += "Level4";
-        }
-
-        if (!str.empty()) {
-                str += '-';
-        }
-
-        char buf[16];
-        snprintf (buf, sizeof (buf), "%u", button());
-        str += buf;
-
-        return str;
+	int s = state();
+
+	string str;
+
+	if (s & Keyboard::PrimaryModifier) {
+		str += "Primary";
+	}
+	if (s & Keyboard::SecondaryModifier) {
+		if (!str.empty()) {
+			str += '-';
+		}
+		str += "Secondary";
+	}
+	if (s & Keyboard::TertiaryModifier) {
+		if (!str.empty()) {
+			str += '-';
+		}
+		str += "Tertiary";
+	}
+	if (s & Keyboard::Level4Modifier) {
+		if (!str.empty()) {
+			str += '-';
+		}
+		str += "Level4";
+	}
+
+	if (!str.empty()) {
+		str += '-';
+	}
+
+	char buf[16];
+	snprintf (buf, sizeof (buf), "%u", button());
+	str += buf;
+
+	return str;
 }
 
+/*================================ KeyboardKey ================================*/
 KeyboardKey::KeyboardKey (uint32_t state, uint32_t keycode)
 {
-        uint32_t ignore = Bindings::ignored_state();
+	uint32_t ignore = ~Keyboard::RelevantModifierKeyMask;
 
-        if (gdk_keyval_is_upper (keycode) && gdk_keyval_is_lower (keycode)) {
-                /* key is not subject to case, so ignore SHIFT
-                 */
-                ignore |= GDK_SHIFT_MASK;
-        }
+	_val = (state & ~ignore);
+	_val <<= 32;
+	_val |= keycode;
+}
 
-        _val = (state & ~ignore);
-        _val <<= 32;
-        _val |= keycode;
-};
+string
+KeyboardKey::display_label () const
+{
+	if (key() == 0) {
+		return string();
+	}
+
+	/* This magically returns a string that will display the right thing
+	 *  on all platforms, notably the command key on OS X.
+	 */
 
+	uint32_t mod = state();
+
+#ifdef __APPLE__
+	/* We use both bits (MOD2|META) for Primary on OS X,
+	 * but we don't want MOD2 showing up in listings. So remove
+	 * it and add back META.
+	 */
+
+	if (mod & GDK_MOD2_MASK) {
+		mod = (mod & ~GDK_MOD2_MASK) | GDK_META_MASK;
+	}
+#endif
+
+
+	return gtk_accelerator_get_label (key(), (GdkModifierType) mod);
+}
 
 string
 KeyboardKey::name () const
 {
-        int s = state();
-
-        string str;
-
-        if (s & Keyboard::PrimaryModifier) {
-                str += "Primary";
-        }
-        if (s & Keyboard::SecondaryModifier) {
-                if (!str.empty()) {
-                        str += '-';
-                }
-                str += "Secondary";
-        }
-        if (s & Keyboard::TertiaryModifier) {
-                if (!str.empty()) {
-                        str += '-';
-                }
-                str += "Tertiary";
-        }
-        if (s & Keyboard::Level4Modifier) {
-                if (!str.empty()) {
-                        str += '-';
-                }
-                str += "Level4";
-        }
-
-        if (!str.empty()) {
-                str += '-';
-        }
-
-        str += gdk_keyval_name (key());
-
-        return str;
+	int s = state();
+
+	string str;
+
+	if (s & Keyboard::PrimaryModifier) {
+		str += "Primary";
+	}
+	if (s & Keyboard::SecondaryModifier) {
+		if (!str.empty()) {
+			str += '-';
+		}
+		str += "Secondary";
+	}
+	if (s & Keyboard::TertiaryModifier) {
+		if (!str.empty()) {
+			str += '-';
+		}
+		str += "Tertiary";
+	}
+	if (s & Keyboard::Level4Modifier) {
+		if (!str.empty()) {
+			str += '-';
+		}
+		str += "Level4";
+	}
+
+	if (!str.empty()) {
+		str += '-';
+	}
+
+	char const *gdk_name = gdk_keyval_name (key());
+
+	if (gdk_name) {
+		str += gdk_name;
+	} else {
+		/* fail! */
+		return string();
+	}
+
+	return str;
+}
+
+string
+KeyboardKey::native_name () const
+{
+	int s = state();
+
+	string str;
+
+	if (s & Keyboard::PrimaryModifier) {
+		str += Keyboard::primary_modifier_name ();
+	}
+	if (s & Keyboard::SecondaryModifier) {
+		if (!str.empty()) {
+			str += '-';
+		}
+		str += Keyboard::secondary_modifier_name ();
+	}
+	if (s & Keyboard::TertiaryModifier) {
+		if (!str.empty()) {
+			str += '-';
+		}
+		str += Keyboard::tertiary_modifier_name ();
+	}
+	if (s & Keyboard::Level4Modifier) {
+		if (!str.empty()) {
+			str += '-';
+		}
+		str += Keyboard::level4_modifier_name ();
+	}
+
+	if (!str.empty()) {
+		str += '-';
+	}
+
+	char const *gdk_name = gdk_keyval_name (key());
+
+	if (gdk_name) {
+		str += gdk_name;
+	} else {
+		/* fail! */
+		return string();
+	}
+
+	return str;
+}
+
+string
+KeyboardKey::native_short_name () const
+{
+	int s = state();
+
+	string str;
+
+	if (s & Keyboard::PrimaryModifier) {
+		str += Keyboard::primary_modifier_short_name ();
+	}
+	if (s & Keyboard::SecondaryModifier) {
+		if (!str.empty()) {
+			str += '-';
+		}
+		str += Keyboard::secondary_modifier_short_name ();
+	}
+	if (s & Keyboard::TertiaryModifier) {
+		if (!str.empty()) {
+			str += '-';
+		}
+		str += Keyboard::tertiary_modifier_short_name ();
+	}
+	if (s & Keyboard::Level4Modifier) {
+		if (!str.empty()) {
+			str += '-';
+		}
+		str += Keyboard::level4_modifier_short_name ();
+	}
+
+	if (!str.empty()) {
+		str += '-';
+	}
+
+	char const *gdk_name = gdk_keyval_name (key());
+
+	if (gdk_name) {
+		str += gdk_name;
+	} else {
+		/* fail! */
+		return string();
+	}
+
+	return str;
 }
 
 bool
 KeyboardKey::make_key (const string& str, KeyboardKey& k)
 {
-        int s = 0;
+	int s = 0;
+
+	if (str.find ("Primary") != string::npos) {
+		s |= Keyboard::PrimaryModifier;
+	}
+
+	if (str.find ("Secondary") != string::npos) {
+		s |= Keyboard::SecondaryModifier;
+	}
+
+	if (str.find ("Tertiary") != string::npos) {
+		s |= Keyboard::TertiaryModifier;
+	}
+
+	if (str.find ("Level4") != string::npos) {
+		s |= Keyboard::Level4Modifier;
+	}
+
+	/* since all SINGLE key events keycodes are changed to lower case
+	 * before looking them up, make sure we only store lower case here. The
+	 * Shift part will be stored in the modifier part of the KeyboardKey.
+	 *
+	 * And yes Mildred, this doesn't cover CapsLock cases. Oh well.
+	 */
 
-        if (str.find ("Primary") != string::npos) {
-                s |= Keyboard::PrimaryModifier;
-        }
+	string actual;
 
-        if (str.find ("Secondary") != string::npos) {
-                s |= Keyboard::SecondaryModifier;
-        }
+	string::size_type lastmod = str.find_last_of ('-');
 
-        if (str.find ("Tertiary") != string::npos) {
-                s |= Keyboard::TertiaryModifier;
-        }
+	if (lastmod != string::npos) {
+		actual = str.substr (lastmod+1);
+	}
+	else {
+		actual = str;
+	}
 
-        if (str.find ("Level4") != string::npos) {
-                s |= Keyboard::Level4Modifier;
-        }
+	if (actual.size() == 1) {
+		actual = PBD::downcase (actual);
+	}
 
-        string::size_type lastmod = str.find_last_of ('-');
-        guint keyval;
+	guint keyval;
+	keyval = gdk_keyval_from_name (actual.c_str());
 
-        if (lastmod == string::npos) {
-                keyval = gdk_keyval_from_name (str.c_str());
-        } else {
-                keyval = gdk_keyval_from_name (str.substr (lastmod+1).c_str());
-        }
+	if (keyval == GDK_VoidSymbol || keyval == 0) {
+		return false;
+	}
 
-        if (keyval == GDK_VoidSymbol) {
-                return false;
-        }
+	k = KeyboardKey (s, keyval);
 
-        k = KeyboardKey (s, keyval);
-        return true;
+	return true;
 }
 
-Bindings::Bindings ()
-        : action_map (0)
+/*================================= Bindings =================================*/
+Bindings::Bindings (std::string const& name)
+	: _name (name)
+	, _action_map (0)
 {
+	bindings.push_back (this);
 }
 
 Bindings::~Bindings()
 {
+	bindings.remove (this);
+}
+
+string
+Bindings::ardour_action_name (RefPtr<Action> action)
+{
+	/* Skip "<Actions>/" */
+	return action->get_accel_path ().substr (10);
+}
+
+KeyboardKey
+Bindings::get_binding_for_action (RefPtr<Action> action, Operation& op)
+{
+	const string action_name = ardour_action_name (action);
+
+	for (KeybindingMap::iterator k = press_bindings.begin(); k != press_bindings.end(); ++k) {
+
+		/* option one: action has already been associated with the
+		 * binding
+		 */
+
+		if (k->second.action == action) {
+			return k->first;
+		}
+
+		/* option two: action name matches, so lookup the action,
+		 * setup the association while we're here, and return the binding.
+		 */
+
+		if (_action_map && k->second.action_name == action_name) {
+			k->second.action = _action_map->find_action (action_name);
+			return k->first;
+		}
+
+	}
+
+	for (KeybindingMap::iterator k = release_bindings.begin(); k != release_bindings.end(); ++k) {
+
+		/* option one: action has already been associated with the
+		 * binding
+		 */
+
+		if (k->second.action == action) {
+			return k->first;
+		}
+
+		/* option two: action name matches, so lookup the action,
+		 * setup the association while we're here, and return the binding.
+		 */
+
+		if (_action_map && k->second.action_name == action_name) {
+			k->second.action = _action_map->find_action (action_name);
+			return k->first;
+		}
+
+	}
+
+	return KeyboardKey::null_key();
 }
 
 void
-Bindings::set_action_map (ActionMap& am)
+Bindings::set_action_map (ActionMap& actions)
+{
+	if (_action_map) {
+		_action_map->set_bindings (0);
+	}
+
+	_action_map = &actions;
+	_action_map->set_bindings (this);
+
+	dissociate ();
+	associate ();
+}
+
+bool
+Bindings::empty_keys() const
+{
+	return press_bindings.empty() && release_bindings.empty();
+}
+
+bool
+Bindings::empty_mouse () const
+{
+	return button_press_bindings.empty() && button_release_bindings.empty();
+}
+
+bool
+Bindings::empty() const
 {
-        action_map = &am;
-        press_bindings.clear ();
-        release_bindings.clear ();
+	return empty_keys() && empty_mouse ();
 }
 
 bool
 Bindings::activate (KeyboardKey kb, Operation op)
 {
-        KeybindingMap* kbm = 0;
+	KeybindingMap& kbm = get_keymap (op);
+
+	/* if shift was pressed, GDK will send us (e.g) 'E' rather than 'e'.
+	   Our bindings all use the lower case character/keyname, so switch
+	   to the lower case before doing the lookup.
+	*/
 
-        switch (op) {
-        case Press:
-                kbm = &press_bindings;
-                break;
-        case Release:
-                kbm = &release_bindings;
-                break;
-        }
+	KeyboardKey unshifted (kb.state(), gdk_keyval_to_lower (kb.key()));
 
-        KeybindingMap::iterator k = kbm->find (kb);
+	KeybindingMap::iterator k = kbm.find (unshifted);
 
-        if (k == kbm->end()) {
-                /* no entry for this key in the state map */
-                return false;
-        }
+	if (k == kbm.end()) {
+		/* no entry for this key in the state map */
+		DEBUG_TRACE (DEBUG::Bindings, string_compose ("no binding for %1\n", unshifted));
+		return false;
+	}
 
-        /* lets do it ... */
+	RefPtr<Action> action;
 
-        k->second->activate ();
-        return true;
+	if (k->second.action) {
+		action = k->second.action;
+	} else {
+		if (_action_map) {
+			action = _action_map->find_action (k->second.action_name);
+		}
+	}
+
+	if (action) {
+		/* lets do it ... */
+		DEBUG_TRACE (DEBUG::Bindings, string_compose ("binding for %1: %2\n", unshifted, k->second.action_name));
+		action->activate ();
+	}
+
+	/* return true even if the action could not be found */
+
+	return true;
 }
 
 void
-Bindings::add (KeyboardKey kb, Operation op, RefPtr<Action> what)
+Bindings::associate ()
 {
-        KeybindingMap* kbm = 0;
-
-        switch (op) {
-        case Press:
-                kbm = &press_bindings;
-                break;
-        case Release:
-                kbm = &release_bindings;
-                break;
-        }
-
-        KeybindingMap::iterator k = kbm->find (kb);
+	KeybindingMap::iterator k;
+
+	if (!_action_map) {
+		return;
+	}
+
+	for (k = press_bindings.begin(); k != press_bindings.end(); ++k) {
+		k->second.action = _action_map->find_action (k->second.action_name);
+		if (k->second.action) {
+			push_to_gtk (k->first, k->second.action);
+		} else {
+			cerr << _name << " didn't find " << k->second.action_name << " in " << _action_map->name() << endl;
+		}
+	}
+
+	for (k = release_bindings.begin(); k != release_bindings.end(); ++k) {
+		k->second.action = _action_map->find_action (k->second.action_name);
+		/* no working support in GTK for release bindings */
+	}
+
+	MouseButtonBindingMap::iterator b;
+
+	for (b = button_press_bindings.begin(); b != button_press_bindings.end(); ++b) {
+		b->second.action = _action_map->find_action (b->second.action_name);
+	}
+
+	for (b = button_release_bindings.begin(); b != button_release_bindings.end(); ++b) {
+		b->second.action = _action_map->find_action (b->second.action_name);
+	}
+}
 
-        if (k == kbm->end()) {
-                pair<KeyboardKey,RefPtr<Action> > newpair (kb, what);
-                kbm->insert (newpair);
-                // cerr << "Bindings added " << kb.key() << " w/ " << kb.state() << " => " << what->get_name() << endl;
-        } else {
-                k->second = what;
-        }
+void
+Bindings::dissociate ()
+{
+	KeybindingMap::iterator k;
+
+	for (k = press_bindings.begin(); k != press_bindings.end(); ++k) {
+		k->second.action.clear ();
+	}
+	for (k = release_bindings.begin(); k != release_bindings.end(); ++k) {
+		k->second.action.clear ();
+	}
 }
 
 void
-Bindings::remove (KeyboardKey kb, Operation op)
+Bindings::push_to_gtk (KeyboardKey kb, RefPtr<Action> what)
+{
+	/* GTK has the useful feature of showing key bindings for actions in
+	 * menus. As of August 2015, we have no interest in trying to
+	 * reimplement this functionality, so we will use it even though we no
+	 * longer use GTK accelerators for handling key events. To do this, we
+	 * need to make sure that there is a fully populated GTK AccelMap set
+	 * up with all bindings/actions.
+	 */
+
+	Gtk::AccelKey gtk_key;
+	bool entry_exists = Gtk::AccelMap::lookup_entry (what->get_accel_path(), gtk_key);
+
+	if (!entry_exists) {
+
+		/* there is a trick happening here. It turns out that
+		 * gtk_accel_map_add_entry() performs no validation checks on
+		 * the accelerator keyval. This means we can use it to define
+		 * ANY accelerator, even if they violate GTK's rules
+		 * (e.g. about not using navigation keys). This works ONLY when
+		 * the entry in the GTK accelerator map has not already been
+		 * added. The entries will be added by the GTK UIManager when
+		 * building menus, so this code must be called before that
+		 * happens.
+		 */
+
+
+		int mod = kb.state();
+#ifdef __APPLE__
+		/* See comments in Keyboard::Keyboard about GTK handling of MOD2, META and the Command key.
+		 *
+		 * If we do not do this, GTK+ won't show the correct text for shortcuts in menus.
+		 */
+
+		if (mod & GDK_MOD2_MASK) {
+			mod =  mod | GDK_META_MASK;
+		}
+#endif
+
+		Gtk::AccelMap::add_entry (what->get_accel_path(), kb.key(), (Gdk::ModifierType) mod);
+	}
+}
+
+bool
+Bindings::replace (KeyboardKey kb, Operation op, string const & action_name, bool can_save)
 {
-        KeybindingMap* kbm = 0;
+	if (!_action_map) {
+		return false;
+	}
 
-        switch (op) {
-        case Press:
-                kbm = &press_bindings;
-                break;
-        case Release:
-                kbm = &release_bindings;
-                break;
-        }
+	if (is_registered(op, action_name)) {
+		remove (op, action_name, can_save);
+	}
 
-        KeybindingMap::iterator k = kbm->find (kb);
+	/* XXX need a way to get the old group name */
+	add (kb, op, action_name, 0, can_save);
 
-        if (k != kbm->end()) {
-                kbm->erase (k);
-        }
+	return true;
 }
 
 bool
+Bindings::add (KeyboardKey kb, Operation op, string const& action_name, XMLProperty const* group, bool can_save)
+{
+	if (is_registered (op, action_name)) {
+		return false;
+	}
+
+	KeybindingMap& kbm = get_keymap (op);
+	if (group) {
+		KeybindingMap::value_type new_pair = make_pair (kb, ActionInfo (action_name, group->value()));
+		(void) kbm.insert (new_pair).first;
+	} else {
+		KeybindingMap::value_type new_pair = make_pair (kb, ActionInfo (action_name));
+		(void) kbm.insert (new_pair).first;
+	}
+
+	if (can_save) {
+		Keyboard::keybindings_changed ();
+	}
+
+	BindingsChanged (this); /* EMIT SIGNAL */
+	return true;
+}
+
+bool
+Bindings::remove (Operation op, std::string const& action_name, bool can_save)
+{
+	bool erased_action = false;
+	KeybindingMap& kbm = get_keymap (op);
+	for (KeybindingMap::iterator k = kbm.begin(); k != kbm.end(); ++k) {
+		if (k->second.action_name == action_name) {
+			kbm.erase (k);
+			erased_action = true;
+			break;
+		}
+	}
+
+	if (!erased_action) {
+		return erased_action;
+	}
+
+	if (can_save) {
+		Keyboard::keybindings_changed ();
+	}
+
+	BindingsChanged (this); /* EMIT SIGNAL */
+	return erased_action;
+}
+
+
+bool
 Bindings::activate (MouseButton bb, Operation op)
 {
-        MouseButtonBindingMap* bbm = 0;
+	MouseButtonBindingMap& bbm = get_mousemap(op);
 
-        switch (op) {
-        case Press:
-                bbm = &button_press_bindings;
-                break;
-        case Release:
-                bbm = &button_release_bindings;
-                break;
-        }
+	MouseButtonBindingMap::iterator b = bbm.find (bb);
 
-        MouseButtonBindingMap::iterator b = bbm->find (bb);
+	if (b == bbm.end()) {
+		/* no entry for this key in the state map */
+		return false;
+	}
 
-        if (b == bbm->end()) {
-                /* no entry for this key in the state map */
-                return false;
-        }
+	RefPtr<Action> action;
 
-        /* lets do it ... */
+	if (b->second.action) {
+		action = b->second.action;
+	} else {
+		if (_action_map) {
+			action = _action_map->find_action (b->second.action_name);
+		}
+	}
 
-        b->second->activate ();
-        return true;
+	if (action) {
+		/* lets do it ... */
+		DEBUG_TRACE (DEBUG::Bindings, string_compose ("activating action %1\n", ardour_action_name (action)));
+		action->activate ();
+	}
+
+	/* return true even if the action could not be found */
+
+	return true;
 }
 
 void
-Bindings::add (MouseButton bb, Operation op, RefPtr<Action> what)
+Bindings::add (MouseButton bb, Operation op, string const& action_name, XMLProperty const* /*group*/)
 {
-        MouseButtonBindingMap* bbm = 0;
+	MouseButtonBindingMap& bbm = get_mousemap(op);
 
-        switch (op) {
-        case Press:
-                bbm = &button_press_bindings;
-                break;
-        case Release:
-                bbm = &button_release_bindings;
-                break;
-        }
+	MouseButtonBindingMap::value_type newpair (bb, ActionInfo (action_name));
+	bbm.insert (newpair);
+}
 
-        MouseButtonBindingMap::iterator b = bbm->find (bb);
+void
+Bindings::remove (MouseButton bb, Operation op)
+{
+	MouseButtonBindingMap& bbm = get_mousemap(op);
+	MouseButtonBindingMap::iterator b = bbm.find (bb);
 
-        if (b == bbm->end()) {
-                pair<MouseButton,RefPtr<Action> > newpair (bb, what);
-                bbm->insert (newpair);
-                // cerr << "Bindings added mouse button " << bb.button() << " w/ " << bb.state() << " => " << what->get_name() << endl;
-        } else {
-                b->second = what;
-        }
+	if (b != bbm.end()) {
+		bbm.erase (b);
+	}
 }
 
 void
-Bindings::remove (MouseButton bb, Operation op)
+Bindings::save (XMLNode& root)
 {
-        MouseButtonBindingMap* bbm = 0;
+	XMLNode* presses = new XMLNode (X_("Press"));
+
+	for (KeybindingMap::iterator k = press_bindings.begin(); k != press_bindings.end(); ++k) {
+		XMLNode* child;
+
+		if (k->first.name().empty()) {
+			continue;
+		}
+
+		child = new XMLNode (X_("Binding"));
+		child->add_property (X_("key"), k->first.name());
+		child->add_property (X_("action"), k->second.action_name);
+		presses->add_child_nocopy (*child);
+	}
+
+	for (MouseButtonBindingMap::iterator k = button_press_bindings.begin(); k != button_press_bindings.end(); ++k) {
+		XMLNode* child;
+		child = new XMLNode (X_("Binding"));
+		child->add_property (X_("button"), k->first.name());
+		child->add_property (X_("action"), k->second.action_name);
+		presses->add_child_nocopy (*child);
+	}
+
+	XMLNode* releases = new XMLNode (X_("Release"));
+
+	for (KeybindingMap::iterator k = release_bindings.begin(); k != release_bindings.end(); ++k) {
+		XMLNode* child;
+
+		if (k->first.name().empty()) {
+			continue;
+		}
+
+		child = new XMLNode (X_("Binding"));
+		child->add_property (X_("key"), k->first.name());
+		child->add_property (X_("action"), k->second.action_name);
+		releases->add_child_nocopy (*child);
+	}
+
+	for (MouseButtonBindingMap::iterator k = button_release_bindings.begin(); k != button_release_bindings.end(); ++k) {
+		XMLNode* child;
+		child = new XMLNode (X_("Binding"));
+		child->add_property (X_("button"), k->first.name());
+		child->add_property (X_("action"), k->second.action_name);
+		releases->add_child_nocopy (*child);
+	}
+
+	root.add_child_nocopy (*presses);
+	root.add_child_nocopy (*releases);
+}
+
+void
+Bindings::save_all_bindings_as_html (ostream& ostr)
+{
+	if (bindings.empty()) {
+		return;
+	}
+
+
+	ostr << "<html>\n<head>\n<title>";
+	ostr << PROGRAM_NAME;
+	ostr << "</title>\n";
 
-        switch (op) {
-        case Press:
-                bbm = &button_press_bindings;
-                break;
-        case Release:
-                bbm = &button_release_bindings;
-                break;
-        }
 
-        MouseButtonBindingMap::iterator b = bbm->find (bb);
+	ostr << "<style>\n";
+	ostr << "\n\
+.key-name-even, .key-name-odd\n\
+{\n\
+    font-weight: bold;\n\
+}\n\
+\n\
+.key-action-odd, .key-action-even\n\
+{\n\
+    font-weight: normal;\n\
+    font-style: italic;\n\
+}";
+	ostr << "</style>\n";
+
+	ostr << "</head>\n<body>\n";
+
+	ostr << "<div class=\"container\">\n";
+
+	for (list<Bindings*>::const_iterator b = bindings.begin(); b != bindings.end(); ++b) {
+		(*b)->save_as_html (ostr);
+	}
+
+	ostr << "</div>\n";
+	ostr << "</body>\n";
+	ostr << "</html>\n";
+}
+
+void
+Bindings::save_as_html (ostream& ostr) const
+{
 
-        if (b != bbm->end()) {
-                bbm->erase (b);
-        }
+	if (!press_bindings.empty()) {
+
+		ostr << "<div class=\"binding-set\">\n";
+		ostr << "<h1>";
+		ostr << name();
+		ostr << "</h1>\n\n";
+
+		/* first pass: separate by group */
+
+		typedef std::map<std::string, std::vector<KeybindingMap::const_iterator> > GroupMap;
+		GroupMap group_map;
+
+		for (KeybindingMap::const_iterator k = press_bindings.begin(); k != press_bindings.end(); ++k) {
+			if (k->first.name().empty()) {
+				continue;
+			}
+
+			string group_name;
+			if (!k->second.group_name.empty()) {
+				group_name = k->second.group_name;
+			} else {
+				group_name = X_("nogroup");
+			}
+
+			GroupMap::iterator gm = group_map.find (group_name);
+			if (gm == group_map.end()) {
+				std::vector<KeybindingMap::const_iterator> li;
+				li.push_back (k);
+				group_map.insert (make_pair (group_name,li));
+			} else {
+				gm->second.push_back (k);
+			}
+		}
+
+		for (GroupMap::const_iterator gm = group_map.begin(); gm != group_map.end(); ++gm) {
+
+			ostr << "<div class=\"group\">\n";
+			ostr << "<div class=\"group-name\">" << gm->first << "</div>\n";
+
+			for (vector<KeybindingMap::const_iterator>::const_iterator k = gm->second.begin(); k != gm->second.end(); ++k) {
+
+				if ((*k)->first.name().empty()) {
+					continue;
+				}
+
+				RefPtr<Action> action;
+
+				if ((*k)->second.action) {
+					action = (*k)->second.action;
+				} else {
+					if (_action_map) {
+						action = _action_map->find_action ((*k)->second.action_name);
+					}
+				}
+
+				if (!action) {
+					continue;
+				}
+
+				string key_name = (*k)->first.native_short_name ();
+				replace_all (key_name, X_("KP_"), X_("Numpad "));
+
+				string::size_type pos;
+
+				char const *targets[] = { X_("Separator"), X_("Add"), X_("Subtract"), X_("Decimal"), X_("Divide"),
+				                          X_("grave"), X_("comma"), X_("period"), X_("asterisk"), X_("backslash"),
+				                          X_("apostrophe"), X_("minus"), X_("plus"), X_("slash"), X_("semicolon"),
+				                          X_("colon"), X_("equal"), X_("bracketleft"), X_("bracketright"),
+				                          X_("ampersand"), X_("numbersign"), X_("parenleft"), X_("parenright"),
+				                          X_("quoteright"), X_("quoteleft"), X_("exclam"), X_("quotedbl"),
+				                          0
+				};
+
+				char const *replacements[] = { X_("-"), X_("+"), X_("-"), X_("."), X_("/"),
+				                               X_("`"), X_(","), X_("."), X_("*"), X_("\\"),
+				                               X_("'"), X_("-"), X_("+"), X_("/"), X_(";"),
+				                               X_(":"), X_("="), X_("{"), X_("{"),
+				                               X_("&"), X_("#"), X_("("), X_(")"),
+				                               X_("`"), X_("'"), X_("!"), X_("\""),
+				};
+
+				for (size_t n = 0; targets[n]; ++n) {
+					if ((pos = key_name.find (targets[n])) != string::npos) {
+						key_name.replace (pos, strlen (targets[n]), replacements[n]);
+					}
+				}
+
+				ostr << "<div class=\"key\">" << key_name << "</div>";
+				ostr << "<div class=\"action\">" << action->get_label() << "</div>\n";
+			}
+			ostr << "</div>\n\n";
+		}
+
+		ostr << "</div>\n";
+	}
 }
 
 bool
-Bindings::save (const string& path)
+Bindings::load (XMLNode const& node)
 {
-        XMLTree tree;
-        XMLNode* root = new XMLNode (X_("Bindings"));
-        tree.set_root (root);
+	const XMLNodeList& children (node.children());
 
-        save (*root);
+	press_bindings.clear ();
+	release_bindings.clear ();
 
-        if (!tree.write (path)) {
-                ::g_unlink (path.c_str());
-                return false;
-        }
+	for (XMLNodeList::const_iterator i = children.begin(); i != children.end(); ++i) {
+		/* each node could be Press or Release */
+		load_operation (**i);
+	}
 
-        return true;
+	return true;
 }
 
 void
-Bindings::save (XMLNode& root)
+Bindings::load_operation (XMLNode const& node)
+{
+	if (node.name() == X_("Press") || node.name() == X_("Release")) {
+
+		Operation op;
+
+		if (node.name() == X_("Press")) {
+			op = Press;
+		} else {
+			op = Release;
+		}
+
+		const XMLNodeList& children (node.children());
+
+		for (XMLNodeList::const_iterator p = children.begin(); p != children.end(); ++p) {
+
+			XMLProperty const * ap;
+			XMLProperty const * kp;
+			XMLProperty const * bp;
+			XMLProperty const * gp;
+			XMLNode const * child = *p;
+
+			ap = child->property ("action");
+			kp = child->property ("key");
+			bp = child->property ("button");
+			gp = child->property ("group");
+
+			if (!ap || (!kp && !bp)) {
+				continue;
+			}
+
+			if (kp) {
+				KeyboardKey k;
+				if (!KeyboardKey::make_key (kp->value(), k)) {
+					continue;
+				}
+				add (k, op, ap->value(), gp);
+			} else {
+				MouseButton b;
+				if (!MouseButton::make_button (bp->value(), b)) {
+					continue;
+				}
+				add (b, op, ap->value(), gp);
+			}
+		}
+	}
+}
+
+void
+Bindings::get_all_actions (std::vector<std::string>& paths,
+                           std::vector<std::string>& labels,
+                           std::vector<std::string>& tooltips,
+                           std::vector<std::string>& keys,
+                           std::vector<RefPtr<Action> >& actions)
 {
-        XMLNode* presses = new XMLNode (X_("Press"));
-        root.add_child_nocopy (*presses);
-
-        for (KeybindingMap::iterator k = press_bindings.begin(); k != press_bindings.end(); ++k) {
-                XMLNode* child;
-                child = new XMLNode (X_("Binding"));
-                child->add_property (X_("key"), k->first.name());
-                string ap = k->second->get_accel_path();
-                child->add_property (X_("action"), ap.substr (ap.find ('/') + 1));
-                presses->add_child_nocopy (*child);
-        }
-
-        for (MouseButtonBindingMap::iterator k = button_press_bindings.begin(); k != button_press_bindings.end(); ++k) {
-                XMLNode* child;
-                child = new XMLNode (X_("Binding"));
-                child->add_property (X_("button"), k->first.name());
-                string ap = k->second->get_accel_path();
-                child->add_property (X_("action"), ap.substr (ap.find ('/') + 1));
-                presses->add_child_nocopy (*child);
-        }
-
-        XMLNode* releases = new XMLNode (X_("Release"));
-        root.add_child_nocopy (*releases);
-
-        for (KeybindingMap::iterator k = release_bindings.begin(); k != release_bindings.end(); ++k) {
-                XMLNode* child;
-                child = new XMLNode (X_("Binding"));
-                child->add_property (X_("key"), k->first.name());
-                string ap = k->second->get_accel_path();
-                child->add_property (X_("action"), ap.substr (ap.find ('/') + 1));
-                releases->add_child_nocopy (*child);
-        }
-
-        for (MouseButtonBindingMap::iterator k = button_release_bindings.begin(); k != button_release_bindings.end(); ++k) {
-                XMLNode* child;
-                child = new XMLNode (X_("Binding"));
-                child->add_property (X_("button"), k->first.name());
-                string ap = k->second->get_accel_path();
-                child->add_property (X_("action"), ap.substr (ap.find ('/') + 1));
-                releases->add_child_nocopy (*child);
-        }
+	if (!_action_map) {
+		return;
+	}
+
+	/* build a reverse map from actions to bindings */
+
+	typedef map<Glib::RefPtr<Gtk::Action>,KeyboardKey> ReverseMap;
+	ReverseMap rmap;
+
+	for (KeybindingMap::const_iterator k = press_bindings.begin(); k != press_bindings.end(); ++k) {
+		rmap.insert (make_pair (k->second.action, k->first));
+	}
+
+	/* get a list of all actions */
+
+	ActionMap::Actions all_actions;
+	_action_map->get_actions (all_actions);
 
+	for (ActionMap::Actions::const_iterator act = all_actions.begin(); act != all_actions.end(); ++act) {
+
+		paths.push_back ((*act)->get_accel_path());
+		labels.push_back ((*act)->get_label());
+		tooltips.push_back ((*act)->get_tooltip());
+
+		ReverseMap::iterator r = rmap.find (*act);
+
+		if (r != rmap.end()) {
+			keys.push_back (r->second.display_label());
+		} else {
+			keys.push_back (string());
+		}
+
+		actions.push_back (*act);
+	}
+}
+
+Bindings*
+Bindings::get_bindings (string const& name, ActionMap& map)
+{
+	for (list<Bindings*>::iterator b = bindings.begin(); b != bindings.end(); b++) {
+		if ((*b)->name() == name) {
+			(*b)->set_action_map (map);
+			return *b;
+		}
+	}
+
+	return 0;
+}
+
+void
+Bindings::associate_all ()
+{
+	for (list<Bindings*>::iterator b = bindings.begin(); b != bindings.end(); b++) {
+		(*b)->associate ();
+	}
 }
 
 bool
-Bindings::load (const string& path)
+Bindings::is_bound (KeyboardKey const& kb, Operation op) const
 {
-        XMLTree tree;
+	const KeybindingMap& km = get_keymap(op);
+	return km.find(kb) != km.end();
+}
 
-        if (!action_map) {
-                return false;
-        }
+bool
+Bindings::is_registered (Operation op, std::string const& action_name) const
+{
+	const KeybindingMap& km = get_keymap(op);
+	return std::find_if(km.begin(),  km.end(),  ActionNameRegistered<KeybindingMap::const_iterator::value_type>(action_name)) != km.end();
+}
+
+Bindings::KeybindingMap&
+Bindings::get_keymap (Operation op)
+{
+	switch (op) {
+	case Press:
+		return press_bindings;
+	case Release:
+	default:
+		return release_bindings;
+	}
+}
 
-        if (!tree.read (path)) {
-                return false;
-        }
+const Bindings::KeybindingMap&
+Bindings::get_keymap (Operation op) const
+{
+	switch (op) {
+	case Press:
+		return press_bindings;
+	case Release:
+	default:
+		return release_bindings;
+	}
+}
+
+Bindings::MouseButtonBindingMap&
+Bindings::get_mousemap (Operation op)
+{
+	switch (op) {
+	case Press:
+		return button_press_bindings;
+	case Release:
+	default:
+		return button_release_bindings;
+	}
+}
 
-        press_bindings.clear ();
-        release_bindings.clear ();
+/*==========================================ACTION MAP =========================================*/
 
-        XMLNode& root (*tree.root());
-        const XMLNodeList& children (root.children());
+ActionMap::ActionMap (string const & name)
+	: _name (name)
+	, _bindings (0)
+{
+	action_maps.push_back (this);
+}
 
-        for (XMLNodeList::const_iterator i = children.begin(); i != children.end(); ++i) {
-                load (**i);
-        }
+ActionMap::~ActionMap ()
+{
+	action_maps.remove (this);
+}
 
-        return true;
+void
+ActionMap::set_bindings (Bindings* b)
+{
+	_bindings = b;
 }
 
 void
-Bindings::load (const XMLNode& node)
-{
-        if (node.name() == X_("Press") || node.name() == X_("Release")) {
-
-                Operation op;
-
-                if (node.name() == X_("Press")) {
-                        op = Press;
-                } else {
-                        op = Release;
-                }
-
-                const XMLNodeList& children (node.children());
-
-                for (XMLNodeList::const_iterator p = children.begin(); p != children.end(); ++p) {
-
-                        XMLProperty* ap;
-                        XMLProperty* kp;
-                        XMLProperty* bp;
-
-                        ap = (*p)->property ("action");
-                        kp = (*p)->property ("key");
-                        bp = (*p)->property ("button");
-
-                        if (!ap || (!kp && !bp)) {
-                                continue;
-                        }
-
-                        RefPtr<Action> act;
-
-                        if (action_map) {
-                                act = action_map->find_action (ap->value());
-                        }
-
-                        if (!act) {
-                                string::size_type slash = ap->value().find ('/');
-                                if (slash != string::npos) {
-                                        string group = ap->value().substr (0, slash);
-                                        string action = ap->value().substr (slash+1);
-                                        act = ActionManager::get_action (group.c_str(), action.c_str());
-                                }
-                        }
-
-                        if (!act) {
-                                continue;
-                        }
-
-                        if (kp) {
-                                KeyboardKey k;
-                                if (!KeyboardKey::make_key (kp->value(), k)) {
-                                        continue;
-                                }
-                                add (k, op, act);
-                        } else {
-                                MouseButton b;
-                                if (!MouseButton::make_button (bp->value(), b)) {
-                                        continue;
-                                }
-                                add (b, op, act);
-                        }
-                }
-        }
+ActionMap::get_actions (ActionMap::Actions& acts)
+{
+	for (_ActionMap::iterator a = _actions.begin(); a != _actions.end(); ++a) {
+		acts.push_back (a->second);
+	}
 }
 
 RefPtr<Action>
 ActionMap::find_action (const string& name)
 {
-        _ActionMap::iterator a = actions.find (name);
+	_ActionMap::iterator a = _actions.find (name);
+
+	if (a != _actions.end()) {
+		return a->second;
+	}
+
+	return RefPtr<Action>();
+}
+
+RefPtr<ActionGroup>
+ActionMap::create_action_group (const string& name)
+{
+	RefPtr<ActionGroup> g = ActionGroup::create (name);
 
-        if (a != actions.end()) {
-                return a->second;
-        }
+	/* this is one of the places where our own Action management code
+	   has to touch the GTK one, because we want the GtkUIManager to
+	   be able to create widgets (particularly Menus) from our actions.
 
-        return RefPtr<Action>();
+	   This is a a necessary step for that to happen.
+	*/
+
+	if (g) {
+		ActionManager::ui_manager->insert_action_group (g);
+	}
+
+	return g;
+}
+
+RefPtr<Action>
+ActionMap::register_action (RefPtr<ActionGroup> group, const char* name, const char* label)
+{
+	string fullpath;
+
+	RefPtr<Action> act = Action::create (name, label);
+
+	fullpath = group->get_name();
+	fullpath += '/';
+	fullpath += name;
+
+	if (_actions.insert (_ActionMap::value_type (fullpath, act)).second) {
+		group->add (act);
+		return act;
+	}
+
+	/* already registered */
+	return RefPtr<Action> ();
 }
 
 RefPtr<Action>
-ActionMap::register_action (const char* path,
+ActionMap::register_action (RefPtr<ActionGroup> group,
                             const char* name, const char* label, sigc::slot<void> sl)
 {
-        string fullpath;
+	string fullpath;
 
-        RefPtr<Action> act = Action::create (name, label);
+	RefPtr<Action> act = Action::create (name, label);
 
-        act->signal_activate().connect (sl);
+	fullpath = group->get_name();
+	fullpath += '/';
+	fullpath += name;
 
-        fullpath = path;
-        fullpath += '/';
-        fullpath += name;
+	if (_actions.insert (_ActionMap::value_type (fullpath, act)).second) {
+		group->add (act, sl);
+		return act;
+	}
 
-        actions.insert (_ActionMap::value_type (fullpath, act));
-        return act;
+	/* already registered */
+	return RefPtr<Action>();
 }
 
 RefPtr<Action>
-ActionMap::register_radio_action (const char* path, Gtk::RadioAction::Group& rgroup,
+ActionMap::register_radio_action (RefPtr<ActionGroup> group,
+                                  Gtk::RadioAction::Group& rgroup,
+                                  const char* name, const char* label,
+                                  sigc::slot<void> sl)
+{
+	string fullpath;
+
+	RefPtr<Action> act = RadioAction::create (rgroup, name, label);
+	RefPtr<RadioAction> ract = RefPtr<RadioAction>::cast_dynamic(act);
+
+	fullpath = group->get_name();
+	fullpath += '/';
+	fullpath += name;
+
+	if (_actions.insert (_ActionMap::value_type (fullpath, act)).second) {
+		group->add (act, sl);
+		return act;
+	}
+
+	/* already registered */
+	return RefPtr<Action>();
+}
+
+RefPtr<Action>
+ActionMap::register_radio_action (RefPtr<ActionGroup> group,
+                                  Gtk::RadioAction::Group& rgroup,
                                   const char* name, const char* label,
                                   sigc::slot<void,GtkAction*> sl,
                                   int value)
 {
-        string fullpath;
+	string fullpath;
+
+	RefPtr<Action> act = RadioAction::create (rgroup, name, label);
+	RefPtr<RadioAction> ract = RefPtr<RadioAction>::cast_dynamic(act);
+	ract->property_value() = value;
 
-        RefPtr<Action> act = RadioAction::create (rgroup, name, label);
-        RefPtr<RadioAction> ract = RefPtr<RadioAction>::cast_dynamic(act);
-        ract->property_value() = value;
+	fullpath = group->get_name();
+	fullpath += '/';
+	fullpath += name;
 
-        act->signal_activate().connect (sigc::bind (sl, act->gobj()));
+	if (_actions.insert (_ActionMap::value_type (fullpath, act)).second) {
+		group->add (act, sigc::bind (sl, act->gobj()));
+		return act;
+	}
 
-        fullpath = path;
-        fullpath += '/';
-        fullpath += name;
+	/* already registered */
 
-        actions.insert (_ActionMap::value_type (fullpath, act));
-        return act;
+	return RefPtr<Action>();
 }
 
 RefPtr<Action>
-ActionMap::register_toggle_action (const char* path,
+ActionMap::register_toggle_action (RefPtr<ActionGroup> group,
                                    const char* name, const char* label, sigc::slot<void> sl)
 {
-        string fullpath;
+	string fullpath;
+
+	fullpath = group->get_name();
+	fullpath += '/';
+	fullpath += name;
 
-        RefPtr<Action> act = ToggleAction::create (name, label);
+	RefPtr<Action> act = ToggleAction::create (name, label);
 
-        act->signal_activate().connect (sl);
+	if (_actions.insert (_ActionMap::value_type (fullpath, act)).second) {
+		group->add (act, sl);
+		return act;
+	}
 
-        fullpath = path;
-        fullpath += '/';
-        fullpath += name;
+	/* already registered */
+	return RefPtr<Action>();
+}
+
+void
+ActionMap::get_all_actions (std::vector<std::string>& paths,
+                            std::vector<std::string>& labels,
+                            std::vector<std::string>& tooltips,
+                            std::vector<std::string>& keys,
+                            std::vector<RefPtr<Action> >& actions)
+{
+	for (list<ActionMap*>::const_iterator map = action_maps.begin(); map != action_maps.end(); ++map) {
+
+		ActionMap::Actions these_actions;
+		(*map)->get_actions (these_actions);
+
+		for (ActionMap::Actions::const_iterator act = these_actions.begin(); act != these_actions.end(); ++act) {
+
+			paths.push_back ((*act)->get_accel_path());
+			labels.push_back ((*act)->get_label());
+			tooltips.push_back ((*act)->get_tooltip());
+			actions.push_back (*act);
+
+			Bindings* bindings = (*map)->bindings();
+
+			if (bindings) {
+
+				KeyboardKey key;
+				Bindings::Operation op;
+
+				key = bindings->get_binding_for_action (*act, op);
+
+				if (key == KeyboardKey::null_key()) {
+					keys.push_back (string());
+				} else {
+					keys.push_back (key.display_label());
+				}
+			} else {
+				keys.push_back (string());
+			}
+		}
+
+		these_actions.clear ();
+	}
+}
 
-        actions.insert (_ActionMap::value_type (fullpath, act));
-        return act;
+std::ostream& operator<<(std::ostream& out, Gtkmm2ext::KeyboardKey const & k) {
+	char const *gdk_name = gdk_keyval_name (k.key());
+	return out << "Key " << k.key() << " (" << (gdk_name ? gdk_name : "no-key") << ") state " << hex << k.state() << dec;
 }
diff --git a/libs/gtkmm2ext/cairo_icon.cc b/libs/gtkmm2ext/cairo_icon.cc
new file mode 100644
index 0000000..11b3726
--- /dev/null
+++ b/libs/gtkmm2ext/cairo_icon.cc
@@ -0,0 +1,115 @@
+/*
+    Copyright (C) 2015 Paul Davis
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#if !defined USE_CAIRO_IMAGE_SURFACE && !defined NDEBUG
+#define OPTIONAL_CAIRO_IMAGE_SURFACE
+#endif
+
+
+#include "gtkmm2ext/cairo_icon.h"
+#include "gtkmm2ext/gtk_ui.h"
+
+using namespace Gtkmm2ext;
+
+CairoIcon::CairoIcon (ArdourIcon::Icon t, uint32_t foreground_color)
+	: icon_type (t)
+	, fg (foreground_color)
+{
+	add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK);
+}
+
+CairoIcon::~CairoIcon ()
+{
+}
+
+void
+CairoIcon::set_fg (uint32_t color)
+{
+	fg = color;
+	queue_draw ();
+}
+
+void
+CairoIcon::render (cairo_t* cr , cairo_rectangle_t* area)
+{
+	const double scale = UI::instance()->ui_scale;
+	int width = get_width() * scale;
+	int height = get_height () * scale;
+
+	ArdourIcon::render (cr, icon_type, width, height, Off, fg);
+}
+
+bool
+CairoIcon::on_expose_event (GdkEventExpose *ev)
+{
+#ifdef OPTIONAL_CAIRO_IMAGE_SURFACE
+	Cairo::RefPtr<Cairo::Context> cr;
+	if (getenv("ARDOUR_IMAGE_SURFACE")) {
+		if (!image_surface) {
+			image_surface = Cairo::ImageSurface::create (Cairo::FORMAT_ARGB32, get_width(), get_height());
+		}
+		cr = Cairo::Context::create (image_surface);
+	} else {
+		cr = get_window()->create_cairo_context ();
+	}
+#elif defined USE_CAIRO_IMAGE_SURFACE
+
+	if (!image_surface) {
+		image_surface = Cairo::ImageSurface::create (Cairo::FORMAT_ARGB32, get_width(), get_height());
+	}
+
+	Cairo::RefPtr<Cairo::Context> cr = Cairo::Context::create (image_surface);
+#else
+	Cairo::RefPtr<Cairo::Context> cr = get_window()->create_cairo_context ();
+#endif
+
+	cr->rectangle (ev->area.x, ev->area.y, ev->area.width, ev->area.height);
+	cr->clip ();
+
+	cr->translate (ev->area.x, ev->area.y);
+
+	cairo_rectangle_t expose_area;
+	expose_area.x = ev->area.x;
+	expose_area.y = ev->area.y;
+	expose_area.width = ev->area.width;
+	expose_area.height = ev->area.height;
+
+	CairoIcon::render (cr->cobj(), &expose_area);
+
+#ifdef OPTIONAL_CAIRO_IMAGE_SURFACE
+	if (getenv("ARDOUR_IMAGE_SURFACE")) {
+#endif
+#if defined USE_CAIRO_IMAGE_SURFACE || defined OPTIONAL_CAIRO_IMAGE_SURFACE
+	image_surface->flush();
+	/* now blit our private surface back to the GDK one */
+
+	Cairo::RefPtr<Cairo::Context> cairo_context = get_window()->create_cairo_context ();
+
+	cairo_context->rectangle (ev->area.x, ev->area.y, ev->area.width, ev->area.height);
+	cairo_context->clip ();
+	cairo_context->set_source (image_surface, 0, 0);
+	cairo_context->set_operator (Cairo::OPERATOR_SOURCE);
+	cairo_context->paint ();
+#endif
+#ifdef OPTIONAL_CAIRO_IMAGE_SURFACE
+	}
+#endif
+
+	return true;
+}
diff --git a/libs/gtkmm2ext/cairo_widget.cc b/libs/gtkmm2ext/cairo_widget.cc
index 0f34a3f..8349a68 100644
--- a/libs/gtkmm2ext/cairo_widget.cc
+++ b/libs/gtkmm2ext/cairo_widget.cc
@@ -23,15 +23,14 @@
 #include "gtkmm2ext/cairo_widget.h"
 #include "gtkmm2ext/gui_thread.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 static const char* has_cairo_widget_background_info = "has_cairo_widget_background_info";
 
 bool CairoWidget::_flat_buttons = false;
 bool CairoWidget::_widget_prelight = true;
 
-static void noop() { }
-sigc::slot<void> CairoWidget::focus_handler (sigc::ptr_fun (noop));
+sigc::slot<void,Gtk::Widget*> CairoWidget::focus_handler;
 
 void CairoWidget::set_source_rgb_a( cairo_t* cr, Gdk::Color col, float a)  //ToDo:  this one and the Canvas version should be in a shared file (?)
 {
@@ -61,7 +60,7 @@ CairoWidget::~CairoWidget ()
 bool
 CairoWidget::on_button_press_event (GdkEventButton*)
 {
-	focus_handler();
+	focus_handler (this);
 	return false;
 }
 
@@ -183,15 +182,21 @@ CairoWidget::on_expose_event (GdkEventExpose *ev)
 #endif
 
 	cr->rectangle (ev->area.x, ev->area.y, ev->area.width, ev->area.height);
-	cr->clip_preserve ();
 
-	/* paint expose area the color of the parent window bg
-	*/
+	if (_need_bg) {
+		cr->clip_preserve ();
+
+		/* paint expose area the color of the parent window bg
+		 */
 
-	Gdk::Color bg (get_parent_bg());
+		Gdk::Color bg (get_parent_bg());
 
-	cr->set_source_rgb (bg.get_red_p(), bg.get_green_p(), bg.get_blue_p());
-	cr->fill ();
+		cr->set_source_rgb (bg.get_red_p(), bg.get_green_p(), bg.get_blue_p());
+		cr->fill ();
+	} else {
+		std::cerr << get_name() << " skipped bg fill\n";
+		cr->clip ();
+	}
 
 	cairo_rectangle_t expose_area;
 	expose_area.x = ev->area.x;
@@ -388,7 +393,7 @@ CairoWidget::set_widget_prelight (bool yn)
 }
 
 void
-CairoWidget::set_focus_handler (sigc::slot<void> s)
+CairoWidget::set_focus_handler (sigc::slot<void,Gtk::Widget*> s)
 {
 	focus_handler = s;
 }
diff --git a/libs/gtkmm2ext/cairocell.cc b/libs/gtkmm2ext/cairocell.cc
index 4de898c..7ce7735 100644
--- a/libs/gtkmm2ext/cairocell.cc
+++ b/libs/gtkmm2ext/cairocell.cc
@@ -79,6 +79,10 @@ CairoFontDescription::CairoFontDescription (Pango::FontDescription& fd)
 		_weight = Cairo::FONT_WEIGHT_BOLD;
 		break;
 
+	/* to silence warnings when compiling with newer pango versions. */
+	default:
+		_weight = Cairo::FONT_WEIGHT_NORMAL;
+		break;
 	}
 
 	face = fd.get_family();
diff --git a/libs/gtkmm2ext/cursors.cc b/libs/gtkmm2ext/cursors.cc
index f886283..2ac0dba 100644
--- a/libs/gtkmm2ext/cursors.cc
+++ b/libs/gtkmm2ext/cursors.cc
@@ -25,7 +25,7 @@
 
 #include "gtkmm2ext/cursors.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace Gtkmm2ext;
 
diff --git a/libs/gtkmm2ext/dndtreeview.cc b/libs/gtkmm2ext/dndtreeview.cc
index bc6745d..4686702 100644
--- a/libs/gtkmm2ext/dndtreeview.cc
+++ b/libs/gtkmm2ext/dndtreeview.cc
@@ -141,5 +141,3 @@ DnDTreeViewBase::on_drag_drop(const Glib::RefPtr<Gdk::DragContext>& context, int
 	drag_data.source = 0;
 	return TreeView::on_drag_drop (context, x, y, time);
 }
-
-
diff --git a/libs/gtkmm2ext/emscale.cc b/libs/gtkmm2ext/emscale.cc
index 5d28218..6d4697f 100644
--- a/libs/gtkmm2ext/emscale.cc
+++ b/libs/gtkmm2ext/emscale.cc
@@ -22,7 +22,7 @@
 
 #include "gtkmm2ext/emscale.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace Gtkmm2ext;
 
diff --git a/libs/gtkmm2ext/fader.cc b/libs/gtkmm2ext/fader.cc
index 9a2f5a2..f6fe487 100644
--- a/libs/gtkmm2ext/fader.cc
+++ b/libs/gtkmm2ext/fader.cc
@@ -240,7 +240,7 @@ Fader::on_size_allocate (Gtk::Allocation& alloc)
 bool
 Fader::on_button_press_event (GdkEventButton* ev)
 {
-	focus_handler();
+	focus_handler(this);
 
 	if (_read_only) {
 		return false;
diff --git a/libs/gtkmm2ext/fastmeter.cc b/libs/gtkmm2ext/fastmeter.cc
index c144a96..f392891 100644
--- a/libs/gtkmm2ext/fastmeter.cc
+++ b/libs/gtkmm2ext/fastmeter.cc
@@ -731,7 +731,7 @@ FastMeter::set (float lvl, float peak)
 
 	Glib::RefPtr<Gdk::Window> win;
 
-	if ((win = get_window()) == 0) {
+	if (! (win = get_window())) {
 		queue_draw ();
 		return;
 	}
diff --git a/libs/gtkmm2ext/focus_entry.cc b/libs/gtkmm2ext/focus_entry.cc
index a005fcf..1e2823a 100644
--- a/libs/gtkmm2ext/focus_entry.cc
+++ b/libs/gtkmm2ext/focus_entry.cc
@@ -22,8 +22,8 @@
 using namespace Gtkmm2ext;
 
 FocusEntry::FocusEntry ()
+	: next_release_selects (false)
 {
-	next_release_selects = false;
 }
 
 bool
diff --git a/libs/gtkmm2ext/gtk_ui.cc b/libs/gtkmm2ext/gtk_ui.cc
index b550b6c..c96c31b 100644
--- a/libs/gtkmm2ext/gtk_ui.cc
+++ b/libs/gtkmm2ext/gtk_ui.cc
@@ -35,6 +35,7 @@
 #include "pbd/replace_all.h"
 
 #include "gtkmm2ext/application.h"
+#include "gtkmm2ext/bindings.h"
 #include "gtkmm2ext/gtk_ui.h"
 #include "gtkmm2ext/textviewer.h"
 #include "gtkmm2ext/popup.h"
@@ -45,7 +46,7 @@
 #include "gtkmm2ext/actions.h"
 #include "gtkmm2ext/gui_thread.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace Gtkmm2ext;
 using namespace Gtk;
@@ -53,7 +54,8 @@ using namespace Glib;
 using namespace PBD;
 using std::map;
 
-UI       *UI::theGtkUI = 0;
+UI*   UI::theGtkUI = 0;
+float UI::ui_scale = 1.0;
 
 BaseUI::RequestType Gtkmm2ext::NullMessage = BaseUI::new_request_type();
 BaseUI::RequestType Gtkmm2ext::ErrorMessage = BaseUI::new_request_type();
@@ -70,8 +72,8 @@ template class AbstractUI<Gtkmm2ext::UIRequest>;
 UI::UI (string application_name, string thread_name, int *argc, char ***argv)
 	: AbstractUI<UIRequest> (thread_name)
 	, _receiver (*this)
+	, global_bindings (0)
 	, errors (0)
-
 {
 	theMain = new Main (argc, argv);
 
@@ -364,10 +366,22 @@ UI::set_tip (Widget *w, const gchar *tip, const gchar *hlp)
 	}
 
 	if (action) {
-		Gtk::AccelKey key;
-		ustring ap = action->get_accel_path();
-		if (!ap.empty()) {
-			string shortcut = ActionManager::get_key_representation (ap, key);
+		Bindings* bindings = (Bindings*) w->get_data ("ardour-bindings");
+		if (!bindings) {
+			Gtk::Window* win = (Gtk::Window*) w->get_toplevel();
+			if (win) {
+				bindings = (Bindings*) win->get_data ("ardour-bindings");
+			}
+		}
+
+		if (!bindings) {
+			bindings = global_bindings;
+		}
+
+		if (bindings) {
+			Bindings::Operation op;
+			KeyboardKey kb = bindings->get_binding_for_action (action, op);
+			string shortcut = kb.display_label ();
 			if (!shortcut.empty()) {
 				replace_all (shortcut, "<", "");
 				replace_all (shortcut, ">", "-");
@@ -714,7 +728,7 @@ UI::popup_error (const string& text)
 }
 
 void
-UI::flush_pending ()
+UI::flush_pending (float timeout)
 {
 	if (!caller_is_ui_thread()) {
 		error << "non-UI threads cannot call UI::flush_pending()"
@@ -722,9 +736,15 @@ UI::flush_pending ()
 		return;
 	}
 
+	int64_t end = g_get_monotonic_time () + timeout * 1e6;
+
 	gtk_main_iteration();
 
 	while (gtk_events_pending()) {
+		if (timeout > 0 && end < g_get_monotonic_time ()) {
+			cerr << "UI::flush_pending timed out after " << timeout << "s.\n";
+			break;
+		}
 		gtk_main_iteration();
 	}
 }
diff --git a/libs/gtkmm2ext/gtkmm2ext/actions.h b/libs/gtkmm2ext/gtkmm2ext/actions.h
index b03e351..88b9628 100644
--- a/libs/gtkmm2ext/gtkmm2ext/actions.h
+++ b/libs/gtkmm2ext/gtkmm2ext/actions.h
@@ -45,50 +45,10 @@ namespace ActionManager {
 	LIBGTKMM2EXT_API extern Gtk::Widget* get_widget (const char * name);
 	LIBGTKMM2EXT_API extern Glib::RefPtr<Gtk::Action> get_action (const char* group, const char* name);
 	LIBGTKMM2EXT_API extern Glib::RefPtr<Gtk::Action> get_action (const char* path);
-	LIBGTKMM2EXT_API extern Glib::RefPtr<Gtk::Action> get_action_from_name (const char* name);
+
 	LIBGTKMM2EXT_API extern void do_action (const char* group, const char* name);
 	LIBGTKMM2EXT_API extern void set_toggle_action (const char* group, const char* name, bool);
 
-	LIBGTKMM2EXT_API extern void add_action_group (Glib::RefPtr<Gtk::ActionGroup>);
-	LIBGTKMM2EXT_API extern void enable_accelerators ();
-
-	LIBGTKMM2EXT_API extern Glib::RefPtr<Gtk::Action> register_action (Glib::RefPtr<Gtk::ActionGroup> group,
-						   const char * name, const char * label);
-	LIBGTKMM2EXT_API extern Glib::RefPtr<Gtk::Action> register_action (Glib::RefPtr<Gtk::ActionGroup> group,
-						   const char * name, const char * label, sigc::slot<void> sl,
-						   guint key, Gdk::ModifierType mods);
-	LIBGTKMM2EXT_API extern Glib::RefPtr<Gtk::Action> register_action (Glib::RefPtr<Gtk::ActionGroup> group,
-						   const char * name, const char * label, sigc::slot<void> sl);
-
-	LIBGTKMM2EXT_API extern Glib::RefPtr<Gtk::Action> register_radio_action (Glib::RefPtr<Gtk::ActionGroup> group, Gtk::RadioAction::Group&,
-								const char * name, const char * label, sigc::slot<void> sl,
-								guint key, Gdk::ModifierType mods);
-	LIBGTKMM2EXT_API extern Glib::RefPtr<Gtk::Action> register_radio_action (Glib::RefPtr<Gtk::ActionGroup> group, Gtk::RadioAction::Group&,
-								const char * name, const char * label, sigc::slot<void> sl);
-	LIBGTKMM2EXT_API extern Glib::RefPtr<Gtk::Action> register_radio_action (Glib::RefPtr<Gtk::ActionGroup> group, Gtk::RadioAction::Group&,
-								std::string const &, std::string const &, std::string const &, sigc::slot<void> sl);
-
-	LIBGTKMM2EXT_API extern Glib::RefPtr<Gtk::Action> register_toggle_action (Glib::RefPtr<Gtk::ActionGroup> group,
-							  const char * name, const char * label, sigc::slot<void> sl,
-							  guint key, Gdk::ModifierType mods);
-	LIBGTKMM2EXT_API extern Glib::RefPtr<Gtk::Action> register_toggle_action (Glib::RefPtr<Gtk::ActionGroup> group,
-								 std::string const &, std::string const &, std::string const &, sigc::slot<void> sl);
-	LIBGTKMM2EXT_API extern Glib::RefPtr<Gtk::Action> register_toggle_action (Glib::RefPtr<Gtk::ActionGroup> group,
-								 const char * name, const char * label, sigc::slot<void> sl);
-
-	LIBGTKMM2EXT_API extern bool lookup_entry (const Glib::ustring accel_path, Gtk::AccelKey& key);
-
-	LIBGTKMM2EXT_API extern void get_all_actions (std::vector<std::string>& names,
-				     std::vector<std::string>& paths,
-				     std::vector<std::string>& tooltips,
-				     std::vector<std::string>& keys,
-				     std::vector<Gtk::AccelKey>& bindings);
-
-	LIBGTKMM2EXT_API extern void get_all_actions (std::vector<std::string>& groups,
-				     std::vector<std::string>& paths,
-				     std::vector<std::string>& tooltips,
-				     std::vector<Gtk::AccelKey>& bindings);
-
 	LIBGTKMM2EXT_API extern void check_toggleaction (std::string);
 	LIBGTKMM2EXT_API extern void uncheck_toggleaction (std::string);
 	LIBGTKMM2EXT_API extern void set_toggleaction_state (std::string, bool);
diff --git a/libs/gtkmm2ext/gtkmm2ext/bindings.h b/libs/gtkmm2ext/gtkmm2ext/bindings.h
index 5277fd7..d216e04 100644
--- a/libs/gtkmm2ext/gtkmm2ext/bindings.h
+++ b/libs/gtkmm2ext/gtkmm2ext/bindings.h
@@ -2,136 +2,242 @@
 #define __libgtkmm2ext_bindings_h__
 
 #include <map>
+#include <vector>
+#include <list>
+
 #include <stdint.h>
+
 #include <gdk/gdkkeysyms.h>
 #include <gtkmm/action.h>
-#include <gtkmm/action.h>
 #include <gtkmm/radioaction.h>
 #include <gtkmm/toggleaction.h>
 
+#include "pbd/signals.h"
+
 #include "gtkmm2ext/visibility.h"
 
 class XMLNode;
+class XMLProperty;
 
 namespace Gtkmm2ext {
 
 class LIBGTKMM2EXT_API KeyboardKey
 {
   public:
-        KeyboardKey () {
-                _val = GDK_VoidSymbol;
-        }
+	KeyboardKey () {
+		_val = GDK_VoidSymbol;
+	}
+
+	KeyboardKey (uint32_t state, uint32_t keycode);
+
+	static KeyboardKey null_key() { return KeyboardKey (0, 0); }
 
-        KeyboardKey (uint32_t state, uint32_t keycode);
+	uint32_t state() const { return _val >> 32; }
+	uint32_t key() const { return _val & 0xffff; }
 
-        uint32_t state() const { return _val >> 32; }
-        uint32_t key() const { return _val & 0xffff; }
+	bool operator<(const KeyboardKey& other) const {
+		return _val < other._val;
+	}
 
-        bool operator<(const KeyboardKey& other) const {
-                return _val < other._val;
-        }
+	bool operator==(const KeyboardKey& other) const {
+		return _val == other._val;
+	}
 
-        bool operator==(const KeyboardKey& other) const {
-                return _val == other._val;
-        }
+	std::string name() const;
+	std::string native_name() const;
+	std::string native_short_name() const;
+	static bool make_key (const std::string&, KeyboardKey&);
 
-        std::string name() const;
-        static bool make_key (const std::string&, KeyboardKey&);
+	std::string display_label() const;
 
   private:
-        uint64_t _val;
+	uint64_t _val;
 };
 
 class LIBGTKMM2EXT_API MouseButton {
   public:
-        MouseButton () {
-                _val = ~0ULL;
-        }
+	MouseButton () {
+		_val = ~0ULL;
+	}
 
-        MouseButton (uint32_t state, uint32_t button_number);
-        uint32_t state() const { return _val >> 32; }
-        uint32_t button() const { return _val & 0xffff; }
+	MouseButton (uint32_t state, uint32_t button_number);
+	uint32_t state() const { return _val >> 32; }
+	uint32_t button() const { return _val & 0xffff; }
 
-        bool operator<(const MouseButton& other) const {
-                return _val < other._val;
-        }
+	bool operator<(const MouseButton& other) const {
+		return _val < other._val;
+	}
 
-        bool operator==(const MouseButton& other) const {
-                return _val == other._val;
-        }
+	bool operator==(const MouseButton& other) const {
+		return _val == other._val;
+	}
 
-        std::string name() const;
-        static bool make_button (const std::string&, MouseButton&);
+	std::string name() const;
+	static bool make_button (const std::string&, MouseButton&);
 
   private:
-        uint64_t _val;
+	uint64_t _val;
 };
 
+class LIBGTKMM2EXT_API Bindings;
+
 class LIBGTKMM2EXT_API ActionMap {
   public:
-        ActionMap() {}
-        ~ActionMap() {}
+	ActionMap (std::string const& name);
+	~ActionMap();
 
-	Glib::RefPtr<Gtk::Action> register_action (const char* path,
-						   const char* name, const char* label, sigc::slot<void> sl);
-	Glib::RefPtr<Gtk::Action> register_radio_action (const char* path, Gtk::RadioAction::Group&,
-							 const char* name, const char* label,
-                                                         sigc::slot<void,GtkAction*> sl,
-                                                         int value);
-	Glib::RefPtr<Gtk::Action> register_toggle_action (const char*path,
-							  const char* name, const char* label, sigc::slot<void> sl);
+	std::string name() const { return _name; }
 
-        Glib::RefPtr<Gtk::Action> find_action (const std::string& name);
+	Glib::RefPtr<Gtk::ActionGroup> create_action_group (const std::string& group_name);
 
-  private:
-        typedef std::map<std::string, Glib::RefPtr<Gtk::Action> > _ActionMap;
-        _ActionMap actions;
-};
+	Glib::RefPtr<Gtk::Action> register_action (Glib::RefPtr<Gtk::ActionGroup> group, const char* name, const char* label);
+	Glib::RefPtr<Gtk::Action> register_action (Glib::RefPtr<Gtk::ActionGroup> group,
+	                                           const char* name, const char* label, sigc::slot<void> sl);
+	Glib::RefPtr<Gtk::Action> register_radio_action (Glib::RefPtr<Gtk::ActionGroup> group,
+	                                                 Gtk::RadioAction::Group&,
+	                                                 const char* name, const char* label,
+	                                                 sigc::slot<void,GtkAction*> sl,
+	                                                 int value);
+	Glib::RefPtr<Gtk::Action> register_radio_action (Glib::RefPtr<Gtk::ActionGroup> group,
+	                                                 Gtk::RadioAction::Group&,
+	                                                 const char* name, const char* label,
+	                                                 sigc::slot<void> sl);
+	Glib::RefPtr<Gtk::Action> register_toggle_action (Glib::RefPtr<Gtk::ActionGroup> group,
+	                                                  const char* name, const char* label, sigc::slot<void> sl);
 
-class LIBGTKMM2EXT_API Bindings {
-  public:
-        enum Operation {
-                Press,
-                Release
-        };
+	Glib::RefPtr<Gtk::Action> find_action (const std::string& name);
 
-        Bindings();
-        ~Bindings ();
+	void set_bindings (Bindings*);
+	Bindings* bindings() const { return _bindings; }
 
-        void add (KeyboardKey, Operation, Glib::RefPtr<Gtk::Action>);
-        void remove (KeyboardKey, Operation);
-        bool activate (KeyboardKey, Operation);
+	typedef std::vector<Glib::RefPtr<Gtk::Action> > Actions;
+	void get_actions (Actions&);
 
-        void add (MouseButton, Operation, Glib::RefPtr<Gtk::Action>);
-        void remove (MouseButton, Operation);
-        bool activate (MouseButton, Operation);
+	static std::list<ActionMap*> action_maps;
 
-        bool load (const std::string& path);
-        void load (const XMLNode& node);
-        bool save (const std::string& path);
-        void save (XMLNode& root);
+	/* used by control surface protocols and other UIs */
+	static void get_all_actions (std::vector<std::string>& paths,
+	                             std::vector<std::string>& labels,
+	                             std::vector<std::string>& tooltips,
+	                             std::vector<std::string>& keys,
+	                             std::vector<Glib::RefPtr<Gtk::Action> >& actions);
 
-        void set_action_map (ActionMap&);
+  private:
+	std::string _name;
+
+	/* hash for faster lookup of actions by name */
+
+	typedef std::map<std::string, Glib::RefPtr<Gtk::Action> > _ActionMap;
+	_ActionMap _actions;
+
+	/* initialized to null; set after a Bindings object has ::associated()
+	 * itself with this action map.
+	 */
+
+	Bindings* _bindings;
 
-        static void set_ignored_state (int mask) {
-                _ignored_state = mask;
-        }
-        static uint32_t ignored_state() { return _ignored_state; }
+};
+
+class LIBGTKMM2EXT_API Bindings {
+  public:
+	enum Operation {
+		Press,
+		Release
+	};
+
+	struct ActionInfo {
+		ActionInfo (std::string const& name) : action_name (name) {}
+		ActionInfo (std::string const& name, std::string const& grp) : action_name (name), group_name (grp) {}
+
+		std::string action_name;
+		std::string group_name; /* may be empty */
+		Glib::RefPtr<Gtk::Action> action;
+	};
+	typedef std::map<KeyboardKey,ActionInfo> KeybindingMap;
+
+	Bindings (std::string const& name);
+	~Bindings ();
+
+	std::string const& name() const { return _name; }
+
+	void associate ();
+	void dissociate ();
+
+	bool empty() const;
+	bool empty_keys () const;
+	bool empty_mouse () const;
+
+	bool add (KeyboardKey, Operation, std::string const&, XMLProperty const*, bool can_save = false);
+	bool replace (KeyboardKey, Operation, std::string const& action_name, bool can_save = true);
+	bool remove (Operation, std::string const& action_name, bool can_save = false);
+
+	bool activate (KeyboardKey, Operation);
+
+	void add (MouseButton, Operation, std::string const&, XMLProperty const*);
+	void remove (MouseButton, Operation);
+	bool activate (MouseButton, Operation);
+
+	bool is_bound (KeyboardKey const&, Operation) const;
+	bool is_registered (Operation op, std::string const& action_name) const;
+
+	KeyboardKey get_binding_for_action (Glib::RefPtr<Gtk::Action>, Operation& op);
+
+	bool load (XMLNode const& node);
+	void load_operation (XMLNode const& node);
+	void save (XMLNode& root);
+	void save_as_html (std::ostream&) const;
+
+	/* GTK has the following position a Gtk::Action:
+	 *
+	 *  accel_path: <Actions>/GroupName/ActionName
+	 *  name: ActionName
+	 *
+	 * We want proper namespacing and we're not interested in
+	 * the silly <Actions> "extra" namespace. So in Ardour:
+	 *
+	 * accel_path: <Actions>/GroupName/ActionName
+	 * name: GroupName/ActionName
+	 *
+	 * This (static) method returns the "ardour" name for the action.
+	 */
+	static std::string ardour_action_name (Glib::RefPtr<Gtk::Action>);
+
+	void set_action_map (ActionMap&);
+
+	/* used for editing bindings */
+	void get_all_actions (std::vector<std::string>& paths,
+	                      std::vector<std::string>& labels,
+	                      std::vector<std::string>& tooltips,
+	                      std::vector<std::string>& keys,
+	                      std::vector<Glib::RefPtr<Gtk::Action> >& actions);
+
+	/* all bindings currently in existence, as grouped into Bindings */
+	static std::list<Bindings*> bindings;
+	static Bindings* get_bindings (std::string const& name, ActionMap&);
+	static void associate_all ();
+	static void save_all_bindings_as_html (std::ostream&);
+
+	static PBD::Signal1<void,Bindings*> BindingsChanged;
 
   private:
-        typedef std::map<KeyboardKey,Glib::RefPtr<Gtk::Action> > KeybindingMap;
+	std::string  _name;
+	ActionMap*   _action_map;
+	KeybindingMap press_bindings;
+	KeybindingMap release_bindings;
 
-        KeybindingMap press_bindings;
-        KeybindingMap release_bindings;
+	typedef std::map<MouseButton,ActionInfo> MouseButtonBindingMap;
+	MouseButtonBindingMap button_press_bindings;
+	MouseButtonBindingMap button_release_bindings;
 
-        typedef std::map<MouseButton,Glib::RefPtr<Gtk::Action> > MouseButtonBindingMap;
-        MouseButtonBindingMap button_press_bindings;
-        MouseButtonBindingMap button_release_bindings;
+	void push_to_gtk (KeyboardKey, Glib::RefPtr<Gtk::Action>);
 
-        ActionMap* action_map;
-        static uint32_t _ignored_state;
+	KeybindingMap& get_keymap (Operation op);
+	const KeybindingMap& get_keymap (Operation op) const;
+	MouseButtonBindingMap& get_mousemap (Operation op);
 };
 
 } // namespace
 
+std::ostream& operator<<(std::ostream& out, Gtkmm2ext::KeyboardKey const & k);
+
 #endif /* __libgtkmm2ext_bindings_h__ */
diff --git a/libs/gtkmm2ext/gtkmm2ext/cairo_icon.h b/libs/gtkmm2ext/gtkmm2ext/cairo_icon.h
new file mode 100644
index 0000000..aebf577
--- /dev/null
+++ b/libs/gtkmm2ext/gtkmm2ext/cairo_icon.h
@@ -0,0 +1,53 @@
+/*
+    Copyright (C) 2015 Paul Davis
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#ifndef __gtk2_ardour_cairo_icon_h__
+#define __gtk2_ardour_cairo_icon_h__
+
+#include <gtkmm/bin.h>
+
+#include "gtkmm2ext/visibility.h"
+#include "gtkmm2ext/ardour_icon.h"
+
+/** A parent class for icons that are rendered using Cairo but need to be
+ * widgets for event handling
+ */
+
+namespace Gtkmm2ext {
+
+class LIBGTKMM2EXT_API CairoIcon : public Gtk::Bin
+{
+public:
+	CairoIcon (Gtkmm2ext::ArdourIcon::Icon, uint32_t fg = 0x000000ff);
+	virtual ~CairoIcon ();
+
+	void render (cairo_t *, cairo_rectangle_t*);
+	void set_fg (uint32_t fg);
+
+	bool on_expose_event (GdkEventExpose*);
+
+  private:
+	Cairo::RefPtr<Cairo::Surface> image_surface;
+	ArdourIcon::Icon icon_type;
+	uint32_t fg;
+};
+
+}
+
+#endif /* __gtk2_ardour_cairo_icon_h__ */
diff --git a/libs/gtkmm2ext/gtkmm2ext/cairo_widget.h b/libs/gtkmm2ext/gtkmm2ext/cairo_widget.h
index 2a48384..2588adc 100644
--- a/libs/gtkmm2ext/gtkmm2ext/cairo_widget.h
+++ b/libs/gtkmm2ext/gtkmm2ext/cairo_widget.h
@@ -93,7 +93,7 @@ public:
 	   they wish to invoke any existing focus handler from their own
 	   button press handler, they can just use: focus_handler();
 	*/
-	static void set_focus_handler (sigc::slot<void>);
+	static void set_focus_handler (sigc::slot<void,Gtk::Widget*>);
 
 protected:
 	/** Render the widget to the given Cairo context */
@@ -118,7 +118,7 @@ protected:
 	static bool	_widget_prelight;
 	bool		_grabbed;
 
-	static sigc::slot<void> focus_handler;
+	static sigc::slot<void,Gtk::Widget*> focus_handler;
 
   private:
 	Cairo::RefPtr<Cairo::Surface> image_surface;
diff --git a/libs/gtkmm2ext/gtkmm2ext/dndtreeview.h b/libs/gtkmm2ext/gtkmm2ext/dndtreeview.h
index 29ae084..0801058 100644
--- a/libs/gtkmm2ext/gtkmm2ext/dndtreeview.h
+++ b/libs/gtkmm2ext/gtkmm2ext/dndtreeview.h
@@ -142,11 +142,16 @@ class /*LIBGTKMM2EXT_API*/ DnDTreeView : public DnDTreeViewBase
 
 		if (selection_data.get_target() == "GTK_TREE_MODEL_ROW") {
 			TreeView::on_drag_data_received (context, x, y, selection_data, info, time);
-		} else if (selection_data.get_target() == object_type) {
-			signal_drop (context, selection_data);
-			context->drag_finish (true, false, time);
 		} else {
-			/* some kind of target type added by the app, which will be handled by a signal handler */
+			/* some kind of target type, usually 'object_type' added by the app,
+			 * which will be handled by a signal handler */
+			for (std::list<Gtk::TargetEntry>::const_iterator i = draggable.begin(); i != draggable.end (); ++i) {
+				if (selection_data.get_target() == (*i).get_target()) {
+					signal_drop (context, selection_data);
+					context->drag_finish (true, false, time);
+					break;
+				}
+			}
 		}
 	}
 
diff --git a/libs/gtkmm2ext/gtkmm2ext/dndvbox.h b/libs/gtkmm2ext/gtkmm2ext/dndvbox.h
index aba413b..750ba5c 100644
--- a/libs/gtkmm2ext/gtkmm2ext/dndvbox.h
+++ b/libs/gtkmm2ext/gtkmm2ext/dndvbox.h
@@ -46,6 +46,8 @@ public:
 	virtual bool is_selectable () const = 0;
 
 	virtual bool drag_data_get (Glib::RefPtr<Gdk::DragContext> const, Gtk::SelectionData &) { return false; }
+
+	virtual bool can_copy_state (DnDVBoxChild*) const = 0;
 };
 
 /** A VBox whose contents can be dragged and dropped */
@@ -59,6 +61,7 @@ public:
 		, _drag_icon (0)
 		, _expecting_unwanted_button_event (false)
 		, _placeholder (0)
+		, _drag_child (0)
 	{
 
 		add (_internal_vbox);
@@ -415,6 +418,7 @@ private:
 	{
 		delete _drag_icon;
 		_drag_icon = 0;
+		_drag_source = 0;
 
 		_drag_child = 0;
 		remove_placeholder ();
@@ -440,21 +444,33 @@ private:
 		return n;
 	}
 
-	bool drag_motion (Glib::RefPtr<Gdk::DragContext> const &, int /*x*/, int y, guint)
+	bool drag_motion (Glib::RefPtr<Gdk::DragContext> const & ctx, int /*x*/, int y, guint tme)
 	{
 		if (_children.empty ()) {
 			return false;
 		}
 
 		T* before;
-		T* at;
+		T* at = NULL;
 		T* after;
 
 		/* decide where we currently are */
 		double const c = get_children_around_position (y, &before, &at, &after);
 
 		/* whether we're in the top or bottom half of the child that we're over */
-		bool top_half = (c - int (c)) < 0.5;
+		bool top_half = (c - int (c)) < .5;
+		bool bottom_half = !top_half;
+
+		if (_drag_source != this /* re-order */
+				&& _drag_source && at
+				&& _drag_source->_drag_child
+				&& _drag_source->selection ().size () == 1
+				&& at != _drag_source->_drag_child // can't happen or can it?
+				&& at->can_copy_state (_drag_source->_drag_child))
+		{
+			top_half = (c - int (c)) < 0.33;
+			bottom_half = (c - int (c)) > 0.8; // increase area >> 0.66; plugin below will move, or there's space
+		}
 
 		/* Note that when checking on whether to remove a placeholder, we never do
 		   so if _drag_child is 0 as this means that the child being dragged is
@@ -468,14 +484,24 @@ private:
 			return false;
 		}
 
-		if (!top_half && _drag_child && (at == _drag_child || after == _drag_child)) {
+		if (bottom_half && _drag_child && (at == _drag_child || after == _drag_child)) {
 			/* dropping here would have no effect, so remove the visual cue */
 			remove_placeholder ();
 			return false;
 		}
 
-		create_or_update_placeholder (c);
-		return false;
+		if (top_half || bottom_half) {
+			create_or_update_placeholder (c);
+			if (_drag_source == this /* re-order */) {
+				ctx->drag_status (Gdk::ACTION_MOVE, tme);
+			} else {
+				ctx->drag_status (Gdk::ACTION_COPY, tme);
+			}
+		} else {
+			ctx->drag_status (Gdk::ACTION_LINK, tme);
+			remove_placeholder ();
+		}
+		return true;
 	}
 
 	void drag_leave (Glib::RefPtr<Gdk::DragContext> const &, guint)
diff --git a/libs/gtkmm2ext/gtkmm2ext/gtk_ui.h b/libs/gtkmm2ext/gtkmm2ext/gtk_ui.h
index acddbe7..dbe1739 100644
--- a/libs/gtkmm2ext/gtkmm2ext/gtk_ui.h
+++ b/libs/gtkmm2ext/gtkmm2ext/gtk_ui.h
@@ -58,6 +58,7 @@ class Touchable;
 namespace Gtkmm2ext {
 
 class TextViewer;
+class Bindings;
 
 extern BaseUI::RequestType NullMessage;
 extern BaseUI::RequestType ErrorMessage;
@@ -135,7 +136,7 @@ class LIBGTKMM2EXT_API UI : public AbstractUI<UIRequest>
 
 	void set_state (Gtk::Widget *w, Gtk::StateType state);
 	void popup_error (const std::string& text);
-	void flush_pending ();
+	void flush_pending (float timeout = 0);
 	void toggle_errors ();
 	void show_errors ();
 	void dump_errors (std::ostream&);
@@ -167,6 +168,9 @@ class LIBGTKMM2EXT_API UI : public AbstractUI<UIRequest>
 	sigc::signal<void> theme_changed;
 
 	static bool just_hide_it (GdkEventAny *, Gtk::Window *);
+	static float ui_scale;
+
+	Gtkmm2ext::Bindings* global_bindings;
 
   protected:
 	virtual void handle_fatal (const char *);
diff --git a/libs/gtkmm2ext/gtkmm2ext/keyboard.h b/libs/gtkmm2ext/gtkmm2ext/keyboard.h
index 4319c9a..58af25f 100644
--- a/libs/gtkmm2ext/gtkmm2ext/keyboard.h
+++ b/libs/gtkmm2ext/gtkmm2ext/keyboard.h
@@ -24,11 +24,11 @@
 #include <vector>
 #include <string>
 
-#include <sigc++/signal.h>
 #include <gtk/gtk.h>
 #include <gtkmm/accelkey.h>
 
 #include "pbd/stateful.h"
+#include "pbd/signals.h"
 
 #include "gtkmm2ext/visibility.h"
 
@@ -38,6 +38,9 @@ namespace Gtk {
 
 namespace Gtkmm2ext {
 
+class Bindings;
+class ActionMap;
+
 class LIBGTKMM2EXT_API Keyboard : public sigc::trackable, PBD::Stateful
 {
   public:
@@ -71,6 +74,11 @@ class LIBGTKMM2EXT_API Keyboard : public sigc::trackable, PBD::Stateful
 	static const char* tertiary_modifier_name ();
 	static const char* level4_modifier_name ();
 
+	static const char* primary_modifier_short_name ();
+	static const char* secondary_modifier_short_name ();
+	static const char* tertiary_modifier_short_name ();
+	static const char* level4_modifier_short_name ();
+
 	static void set_primary_modifier (uint32_t newval) {
 		set_modifier (newval, PrimaryModifier);
 	}
@@ -161,22 +169,18 @@ class LIBGTKMM2EXT_API Keyboard : public sigc::trackable, PBD::Stateful
 
 	static void keybindings_changed ();
 	static void save_keybindings ();
-	static bool load_keybindings (std::string path);
 	static void set_can_save_keybindings (bool yn);
 	static std::string current_binding_name () { return _current_binding_name; }
 	static std::map<std::string,std::string> binding_files;
 
-	int reset_bindings ();
+        static bool catch_user_event_for_pre_dialog_focus (GdkEvent* ev, Gtk::Window* w);
 
-	struct AccelKeyLess {
-	    bool operator() (const Gtk::AccelKey a, const Gtk::AccelKey b) const {
-		    if (a.get_key() != b.get_key()) {
-			    return a.get_key() < b.get_key();
-		    } else {
-			    return a.get_mod() < b.get_mod();
-		    }
-	    }
-	};
+	static bool load_keybindings (std::string const& path);
+	static void save_keybindings (std::string const& path);
+
+	static std::string binding_filename_suffix;
+
+	int reset_bindings ();
 
 	sigc::signal0<void> ZoomVerticalModifierReleased;
 
@@ -203,14 +207,17 @@ class LIBGTKMM2EXT_API Keyboard : public sigc::trackable, PBD::Stateful
 
 	typedef std::pair<std::string,std::string> two_strings;
 
-	static std::map<Gtk::AccelKey,two_strings,AccelKeyLess> release_keys;
-
 	static gint _snooper (GtkWidget*, GdkEventKey*, gpointer);
 	gint snooper (GtkWidget*, GdkEventKey*);
 
 	static void set_modifier (uint32_t newval, uint32_t& variable);
 
 	static bool _some_magic_widget_has_focus;
+
+        static Gtk::Window* pre_dialog_active_window;
+
+	static int read_keybindings (std::string const& path);
+	static int store_keybindings (std::string const& path);
 };
 
 } /* namespace */
diff --git a/libs/gtkmm2ext/gtkmm2ext/pane.h b/libs/gtkmm2ext/gtkmm2ext/pane.h
new file mode 100644
index 0000000..9612da0
--- /dev/null
+++ b/libs/gtkmm2ext/gtkmm2ext/pane.h
@@ -0,0 +1,131 @@
+/*
+    Copyright (C) 2016 Paul Davis
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#ifndef __libgtkmm2ext_pane_h__
+#define __libgtkmm2ext_pane_h__
+
+#include <vector>
+#include <algorithm>
+
+#include <stdint.h>
+
+#include <gdkmm/cursor.h>
+#include <gtkmm/container.h>
+#include <gtkmm/eventbox.h>
+
+#include "gtkmm2ext/visibility.h"
+
+namespace Gtk {
+	class Widget;
+}
+
+namespace Gtkmm2ext {
+
+class LIBGTKMM2EXT_API Pane : public Gtk::Container
+{
+  private:
+	class Divider;
+
+
+  public:
+	struct Child
+	{
+		Pane* pane;
+		Gtk::Widget* w;
+		int32_t minsize;
+
+		Child (Pane* p, Gtk::Widget* widget, uint32_t ms) : pane (p), w (widget), minsize (ms) {}
+	};
+
+	typedef std::list<Child> Children;
+
+	Pane (bool horizontal);
+	~Pane();
+
+	void set_divider (std::vector<float>::size_type divider, float fract);
+	float get_divider (std::vector<float>::size_type divider = 0);
+	void set_child_minsize (Gtk::Widget const &, int32_t);
+
+	GType child_type_vfunc() const;
+	void set_drag_cursor (Gdk::Cursor);
+
+	void set_check_divider_position (bool);
+
+  protected:
+	bool horizontal;
+
+	void on_add (Gtk::Widget*);
+	void on_remove (Gtk::Widget*);
+	void on_size_request (GtkRequisition*);
+	void on_size_allocate (Gtk::Allocation&);
+	bool on_expose_event (GdkEventExpose*);
+
+	bool handle_press_event (GdkEventButton*, Divider*);
+	bool handle_release_event (GdkEventButton*, Divider*);
+	bool handle_motion_event (GdkEventMotion*, Divider*);
+	bool handle_enter_event (GdkEventCrossing*, Divider*);
+	bool handle_leave_event (GdkEventCrossing*, Divider*);
+
+	void forall_vfunc (gboolean include_internals, GtkCallback callback, gpointer callback_data);
+
+  private:
+	Gdk::Cursor drag_cursor;
+	bool did_move;
+
+	void reallocate (Gtk::Allocation const &);
+
+	Children children;
+
+	struct Divider : public Gtk::EventBox {
+		Divider ();
+
+		float fract;
+		bool dragging;
+
+		bool on_expose_event (GdkEventExpose* ev);
+	};
+
+	typedef std::list<Divider*> Dividers;
+	Dividers dividers;
+	int divider_width;
+	bool check_fract;
+
+	void add_divider ();
+	void handle_child_visibility ();
+	bool fract_is_ok (Dividers::size_type, float fract);
+
+	static void* notify_child_destroyed (void*);
+	void* child_destroyed (Gtk::Widget*);
+};
+
+class LIBGTKMM2EXT_API HPane : public Pane
+{
+  public:
+	HPane () : Pane (true) {}
+};
+
+class LIBGTKMM2EXT_API VPane : public Pane
+{
+  public:
+	VPane () : Pane (false) {}
+};
+
+} /* namespace */
+
+#endif /* __libgtkmm2ext_pane_h__ */
diff --git a/libs/gtkmm2ext/gtkmm2ext/persistent_tooltip.h b/libs/gtkmm2ext/gtkmm2ext/persistent_tooltip.h
index 9883fd2..9e87f89 100644
--- a/libs/gtkmm2ext/gtkmm2ext/persistent_tooltip.h
+++ b/libs/gtkmm2ext/gtkmm2ext/persistent_tooltip.h
@@ -40,8 +40,12 @@ class LIBGTKMM2EXT_API PersistentTooltip : public sigc::trackable
 	void set_center_alignment (bool align_to_center);
 
 	virtual bool dragging () const;
+	static void set_tooltips_enabled (bool en) { _tooltips_enabled = en; }
+	static bool tooltips_enabled () { return _tooltips_enabled; }
 
   private:
+	static bool _tooltips_enabled;
+	static unsigned int _tooltip_timeout;
 	bool timeout ();
 	void show ();
 	void hide ();
diff --git a/libs/gtkmm2ext/gtkmm2ext/searchbar.h b/libs/gtkmm2ext/gtkmm2ext/searchbar.h
new file mode 100644
index 0000000..b8a209c
--- /dev/null
+++ b/libs/gtkmm2ext/gtkmm2ext/searchbar.h
@@ -0,0 +1,37 @@
+#pragma once
+
+#include <gtkmm/entry.h>
+#include <string>
+
+#include "gtkmm2ext/visibility.h"
+
+namespace Gtkmm2ext {
+
+class LIBGTKMM2EXT_API SearchBar : public Gtk::Entry
+{
+public:
+	SearchBar(
+		const std::string& placeholder_text = "Search...",
+		bool icon_click_resets = true);
+
+	// resets the searchbar to the initial state
+	void reset ();
+	// emitted when the filter has been updated
+	sigc::signal<void, const std::string&> signal_search_string_updated () { return sig_search_string_updated; }
+protected:
+	bool focus_in_event (GdkEventFocus*);
+	bool focus_out_event (GdkEventFocus*);
+
+	bool key_press_event (GdkEventKey*);
+	void icon_clicked_event (Gtk::EntryIconPosition, const GdkEventButton*);
+
+	const std::string placeholder_text;
+	sigc::signal<void, const std::string&> sig_search_string_updated;
+private:
+	void search_string_changed () const;
+
+	Glib::RefPtr<Gdk::Pixbuf> icon;
+	bool icon_click_resets;
+};
+
+}
diff --git a/libs/gtkmm2ext/gtkmm2ext/tabbable.h b/libs/gtkmm2ext/gtkmm2ext/tabbable.h
new file mode 100644
index 0000000..e72a86d
--- /dev/null
+++ b/libs/gtkmm2ext/gtkmm2ext/tabbable.h
@@ -0,0 +1,101 @@
+/*
+    Copyright (C) 2015 Paul Davis
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#ifndef __gtkmm2ext_tabbable_h__
+#define __gtkmm2ext_tabbable_h__
+
+#include <gtkmm/bin.h>
+#include <gtkmm/box.h>
+#include <gtkmm/button.h>
+#include <gtkmm/image.h>
+#include <gtkmm/label.h>
+#include <gtkmm/notebook.h>
+
+#include "gtkmm2ext/cairo_icon.h"
+#include "gtkmm2ext/window_proxy.h"
+#include "gtkmm2ext/visibility.h"
+
+namespace Gtk {
+	class Window;
+	class Notebook;
+}
+
+namespace Gtkmm2ext {
+
+class VisibilityTracker;
+
+class LIBGTKMM2EXT_API Tabbable : public WindowProxy {
+  public:
+	Tabbable (Gtk::Widget&, const std::string&);
+	~Tabbable ();
+
+	void add_to_notebook (Gtk::Notebook& notebook, const std::string& tab_title);
+	void make_visible ();
+	void make_invisible ();
+	void change_visibility ();
+	void attach ();
+	void detach ();
+
+	Gtk::Widget& contents() const { return _contents; }
+
+	Gtk::Window* get (bool create = false);
+	Gtk::Window* own_window () { return get (false); }
+	virtual Gtk::Window* use_own_window (bool and_pack_it);
+
+	void set_default_tabbed (bool yn);
+
+	virtual void show_window ();
+
+	bool window_visible () const;
+	bool tabbed() const;
+	bool tabbed_by_default () const;
+
+	Gtk::Window* current_toplevel () const;
+
+	Gtk::Notebook* tab_root_drop ();
+
+	int set_state (const XMLNode&, int version);
+	XMLNode& get_state ();
+
+	static std::string xml_node_name();
+
+	sigc::signal1<void,Tabbable&> StateChange;
+
+  protected:
+	bool delete_event_handler (GdkEventAny *ev);
+
+  private:
+	Gtk::Widget&   _contents;
+	Gtk::Notebook  _own_notebook;
+	Gtk::Notebook* _parent_notebook;
+	std::string    _tab_title;
+	bool            tab_requested_by_state;
+
+	void show_tab ();
+	void hide_tab ();
+	bool tab_close_clicked (GdkEventButton*);
+	void show_own_window (bool and_pack_it);
+	void window_mapped ();
+	void window_unmapped ();
+};
+
+
+}
+
+#endif
diff --git a/libs/gtkmm2ext/gtkmm2ext/utils.h b/libs/gtkmm2ext/gtkmm2ext/utils.h
index 43baf59..bd09e29 100644
--- a/libs/gtkmm2ext/gtkmm2ext/utils.h
+++ b/libs/gtkmm2ext/gtkmm2ext/utils.h
@@ -29,6 +29,7 @@
 
 #include <gtkmm/container.h>
 #include <gtkmm/filechooser.h>
+#include <gtkmm/menu.h>
 #include <gtkmm/treeview.h>
 #include <gdkmm/window.h> /* for WMDecoration */
 #include <gdkmm/pixbuf.h>
@@ -54,8 +55,8 @@ namespace Gtkmm2ext {
 
 	LIBGTKMM2EXT_API std::string fit_to_pixels (const std::string&, int pixel_width, Pango::FontDescription& font, int& actual_width, bool with_ellipses = false);
 	LIBGTKMM2EXT_API std::pair<std::string, double> fit_to_pixels (cairo_t *, std::string, double);
-	LIBGTKMM2EXT_API int pixel_width (const std::string& str, Pango::FontDescription& font);
-	LIBGTKMM2EXT_API void pixel_size (const std::string& str, Pango::FontDescription& font, int& width, int& height);
+	LIBGTKMM2EXT_API int pixel_width (const std::string& str, const Pango::FontDescription& font);
+	LIBGTKMM2EXT_API void pixel_size (const std::string& str, const Pango::FontDescription& font, int& width, int& height);
 
 	LIBGTKMM2EXT_API void get_ink_pixel_size (Glib::RefPtr<Pango::Layout>,
 						  int& width, int& height);
@@ -96,6 +97,11 @@ namespace Gtkmm2ext {
 								       int clip_height,
 								       Gdk::Color fg);
 
+	LIBGTKMM2EXT_API void position_menu_anchored (const Gtk::Menu* const menu,
+	                                              Gtk::Widget* const anchor,
+	                                              const std::string& selected,
+	                                              int& x, int& y, bool& push_in);
+
 	LIBGTKMM2EXT_API void set_popdown_strings (Gtk::ComboBoxText&,
 	                          const std::vector<std::string>&);
 
@@ -123,7 +129,6 @@ namespace Gtkmm2ext {
 	LIBGTKMM2EXT_API Glib::RefPtr<Gdk::Window> window_to_draw_on (Gtk::Widget& w, Gtk::Widget** parent);
 
         LIBGTKMM2EXT_API bool possibly_translate_keyval_to_make_legal_accelerator (uint32_t& keyval);
-        LIBGTKMM2EXT_API bool possibly_translate_mod_to_make_legal_accelerator (GdkModifierType& mod);
         LIBGTKMM2EXT_API uint32_t possibly_translate_legal_accelerator_to_real_key (uint32_t keyval);
 
         LIBGTKMM2EXT_API int physical_screen_height (Glib::RefPtr<Gdk::Window>);
@@ -173,6 +178,11 @@ namespace Gtkmm2ext {
 	LIBGTKMM2EXT_API std::string markup_escape_text (std::string const& s);
 
 	LIBGTKMM2EXT_API void add_volume_shortcuts (Gtk::FileChooser& c);
+
+	LIBGTKMM2EXT_API float paned_position_as_fraction (Gtk::Paned& paned, bool h);
+	LIBGTKMM2EXT_API void  paned_set_position_as_fraction (Gtk::Paned& paned, float fraction, bool h);
+
+	LIBGTKMM2EXT_API std::string show_gdk_event_state (int state);
 };
 
 #endif /*  __gtkmm2ext_utils_h__ */
diff --git a/libs/gtkmm2ext/gtkmm2ext/visibility_tracker.h b/libs/gtkmm2ext/gtkmm2ext/visibility_tracker.h
index 43f5b24..8860aba 100644
--- a/libs/gtkmm2ext/gtkmm2ext/visibility_tracker.h
+++ b/libs/gtkmm2ext/gtkmm2ext/visibility_tracker.h
@@ -35,6 +35,8 @@ class LIBGTKMM2EXT_API VisibilityTracker : public virtual sigc::trackable {
     VisibilityTracker (Gtk::Window&);
     virtual ~VisibilityTracker() {}
 
+    static void set_use_window_manager_visibility (bool);
+    static bool use_window_manager_visibility() { return _use_window_manager_visibility; }
     void cycle_visibility ();
 
     bool fully_visible() const;
@@ -46,6 +48,9 @@ class LIBGTKMM2EXT_API VisibilityTracker : public virtual sigc::trackable {
   private:
     Gtk::Window& _window;
     GdkVisibilityState _visibility;
+
+    static bool _use_window_manager_visibility;
+
     bool handle_visibility_notify_event (GdkEventVisibility*);
 };
 
diff --git a/libs/gtkmm2ext/gtkmm2ext/window_proxy.h b/libs/gtkmm2ext/gtkmm2ext/window_proxy.h
new file mode 100644
index 0000000..2aa7aec
--- /dev/null
+++ b/libs/gtkmm2ext/gtkmm2ext/window_proxy.h
@@ -0,0 +1,119 @@
+/*
+  Copyright (C) 2015 Paul Davis
+
+  This program is free software; you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation; either version 2 of the License, or
+  (at your option) any later version.
+
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#ifndef __gtkmm2ext_window_proxy_h__
+#define __gtkmm2ext_window_proxy_h__
+
+#include <string>
+#include <gdkmm/event.h>
+#include <glibmm/refptr.h>
+#include <sigc++/trackable.h>
+
+#include "pbd/statefuldestructible.h"
+
+#include "gtkmm2ext/visibility.h"
+
+namespace Gtk {
+class Window;
+class Action;
+}
+
+namespace Gtkmm2ext {
+
+class VisibilityTracker;
+
+class LIBGTKMM2EXT_API WindowProxy : public PBD::StatefulDestructible, public virtual sigc::trackable
+{
+  public:
+	WindowProxy (const std::string& name);
+	WindowProxy (const std::string& name, const std::string& menu_name);
+	WindowProxy (const std::string& name, const std::string& menu_name, const XMLNode&);
+	virtual ~WindowProxy();
+
+	void show ();
+	void show_all ();
+	void hide ();
+	void present ();
+	void maybe_show ();
+
+	bool visible() const;
+	bool fully_visible() const;
+	const std::string& name() const { return _name; }
+	const std::string& menu_name() const { return _menu_name; }
+
+	std::string action_name() const;
+	void set_action (Glib::RefPtr<Gtk::Action>);
+	Glib::RefPtr<Gtk::Action> action() const { return _action; };
+
+	void drop_window ();
+	void use_window (Gtk::Window&);
+
+	virtual Gtk::Window* get (bool create = false) = 0;
+
+	virtual int set_state (const XMLNode&, int version);
+	virtual XMLNode& get_state ();
+
+	enum StateMask {
+		Position = 0x1,
+		Size = 0x2
+	};
+
+	void set_state_mask (StateMask);
+	StateMask state_mask () const { return _state_mask; }
+
+	operator bool() const { return _window != 0; }
+
+	static std::string xml_node_name();
+
+	sigc::signal0<void> signal_map;
+	sigc::signal0<void> signal_unmap;
+
+  protected:
+	std::string  _name;
+	std::string  _menu_name;
+	Glib::RefPtr<Gtk::Action> _action;
+	Gtk::Window* _window;
+	mutable bool _visible; ///< true if the window should be visible on startup
+	mutable int  _x_off; ///< x position
+	mutable int  _y_off; ///< y position
+	mutable int  _width; ///< width
+	mutable int  _height; ///< height
+	Gtkmm2ext::VisibilityTracker* vistracker;
+	StateMask _state_mask;
+	sigc::connection delete_connection;
+	sigc::connection configure_connection;
+	sigc::connection map_connection;
+	sigc::connection unmap_connection;
+
+
+	void save_pos_and_size ();
+	void set_pos_and_size ();
+	void set_pos ();
+
+	virtual bool delete_event_handler (GdkEventAny *ev);
+	virtual bool configure_handler (GdkEventConfigure*);
+	void map_handler ();
+	void unmap_handler ();
+	virtual void setup ();
+	void toggle ();
+};
+
+}
+
+#endif /* __gtkmm2ext_window_proxy_h__ */
diff --git a/libs/gtkmm2ext/gtkmm2ext3.pot b/libs/gtkmm2ext/gtkmm2ext3.pot
new file mode 100644
index 0000000..0f96336
--- /dev/null
+++ b/libs/gtkmm2ext/gtkmm2ext3.pot
@@ -0,0 +1,145 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR "Paul Davis"
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2016-08-08 20:24-0400\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
+"Language-Team: LANGUAGE <LL at li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: actions.cc:261
+msgid "Unknown action name: %1"
+msgstr ""
+
+#: binding_proxy.cc:81
+msgid "operate controller now"
+msgstr ""
+
+#: bindable_button.cc:48
+msgid "button cannot watch state of non-existing Controllable\n"
+msgstr ""
+
+#: cursors.cc:82
+msgid "cursor hotspots info file %1 has an error on line %2"
+msgstr ""
+
+#: emscale.cc:52
+msgid "ABCDEFGHIJLKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
+msgstr ""
+
+#: gtk_ui.cc:119
+msgid "Log"
+msgstr ""
+
+#: gtk_ui.cc:388
+msgid ""
+"\n"
+"\n"
+"Shortcut: "
+msgstr ""
+
+#: gtk_ui.cc:688
+msgid "Press To Exit"
+msgstr ""
+
+#: gtk_ui.cc:724
+msgid "I'm sorry %1, I can't do that"
+msgstr ""
+
+#: keyboard.cc:71
+msgid "Command"
+msgstr ""
+
+#: keyboard.cc:72 keyboard.cc:94
+msgid "Control"
+msgstr ""
+
+#: keyboard.cc:73 keyboard.cc:78 keyboard.cc:96 keyboard.cc:101
+msgid "Key|Shift"
+msgstr ""
+
+#: keyboard.cc:74
+msgid "Option"
+msgstr ""
+
+#: keyboard.cc:76
+msgid "Cmd"
+msgstr ""
+
+#: keyboard.cc:77 keyboard.cc:99
+msgid "Ctrl"
+msgstr ""
+
+#: keyboard.cc:79
+msgid "Opt"
+msgstr ""
+
+#: keyboard.cc:95 keyboard.cc:100
+msgid "Alt"
+msgstr ""
+
+#: keyboard.cc:97
+msgid "Windows"
+msgstr ""
+
+#: keyboard.cc:102
+msgid "Win"
+msgstr ""
+
+#: keyboard.cc:153 keyboard.cc:628
+msgid "Unknown"
+msgstr ""
+
+#: keyboard.cc:639
+msgid "key bindings file not found at \"%2\" or contains errors."
+msgstr ""
+
+#: keyboard.cc:665
+msgid "Keyboard binding found without a name"
+msgstr ""
+
+#: keyboard.cc:695
+msgid "Cannot save key bindings to %1"
+msgstr ""
+
+#: keyboard.cc:711
+msgid "Cannot rename your own keybinding file (%1)"
+msgstr ""
+
+#: paths_dialog.cc:32
+msgid "Add"
+msgstr ""
+
+#: paths_dialog.cc:33
+msgid "Delete"
+msgstr ""
+
+#: paths_dialog.cc:34
+msgid "Reset to Default"
+msgstr ""
+
+#: paths_dialog.cc:109
+msgid "Add folder to search path"
+msgstr ""
+
+#: tearoff.cc:57
+msgid "Click to tear this into its own window"
+msgstr ""
+
+#: tearoff.cc:63
+msgid "Click to put this back in the main window"
+msgstr ""
+
+#: textviewer.cc:32
+msgid "Close"
+msgstr ""
diff --git a/libs/gtkmm2ext/i18n.h b/libs/gtkmm2ext/i18n.h
deleted file mode 100644
index 2f1c52a..0000000
--- a/libs/gtkmm2ext/i18n.h
+++ /dev/null
@@ -1,16 +0,0 @@
-#ifndef __i18n_h__
-#define __i18n_h__
-
-#include <pbd/compose.h>
-#include <pbd/convert.h>
-#include "gettext.h"
-
-#define _(Text) dgettext (PACKAGE, Text)
-#define N_(Text) gettext_noop (Text)
-#define X_(Text) (Text)
-/** Use this to translate strings that have different meanings in different places.
- *  Text should be of the form Context|Message.
- */
-#define S_(Text) PBD::sgettext (PACKAGE, Text)
-
-#endif // __i18n_h__
diff --git a/libs/gtkmm2ext/keyboard.cc b/libs/gtkmm2ext/keyboard.cc
index 0f9aeb0..135e1fd 100644
--- a/libs/gtkmm2ext/keyboard.cc
+++ b/libs/gtkmm2ext/keyboard.cc
@@ -38,11 +38,13 @@
 #include "pbd/debug.h"
 #include "pbd/unwind.h"
 
-#include "gtkmm2ext/keyboard.h"
 #include "gtkmm2ext/actions.h"
+#include "gtkmm2ext/bindings.h"
+#include "gtkmm2ext/keyboard.h"
 #include "gtkmm2ext/debug.h"
+#include "gtkmm2ext/utils.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace PBD;
 using namespace Gtk;
@@ -56,7 +58,7 @@ guint Keyboard::delete_mod = GDK_SHIFT_MASK;
 guint Keyboard::insert_note_but = 1;
 guint Keyboard::insert_note_mod = GDK_CONTROL_MASK;
 
-#ifdef GTKOSX
+#ifdef __APPLE__
 
 uint Keyboard::PrimaryModifier = GDK_MOD2_MASK;   // Command
 guint Keyboard::SecondaryModifier = GDK_CONTROL_MASK; // Control
@@ -71,6 +73,11 @@ const char* Keyboard::secondary_modifier_name() { return _("Control"); }
 const char* Keyboard::tertiary_modifier_name() { return S_("Key|Shift"); }
 const char* Keyboard::level4_modifier_name() { return _("Option"); }
 
+const char* Keyboard::primary_modifier_short_name() { return _("Cmd"); }
+const char* Keyboard::secondary_modifier_short_name() { return _("Ctrl"); }
+const char* Keyboard::tertiary_modifier_short_name() { return S_("Key|Shift"); }
+const char* Keyboard::level4_modifier_short_name() { return _("Opt"); }
+
 guint Keyboard::snap_mod = Keyboard::Level4Modifier|Keyboard::TertiaryModifier; // XXX this is probably completely wrong
 guint Keyboard::snap_delta_mod = Keyboard::Level4Modifier;
 
@@ -89,6 +96,11 @@ const char* Keyboard::secondary_modifier_name() { return _("Alt"); }
 const char* Keyboard::tertiary_modifier_name() { return S_("Key|Shift"); }
 const char* Keyboard::level4_modifier_name() { return _("Windows"); }
 
+const char* Keyboard::primary_modifier_short_name() { return _("Ctrl"); }
+const char* Keyboard::secondary_modifier_short_name() { return _("Alt"); }
+const char* Keyboard::tertiary_modifier_short_name() { return S_("Key|Shift"); }
+const char* Keyboard::level4_modifier_short_name() { return _("Win"); }
+
 guint Keyboard::snap_mod = Keyboard::SecondaryModifier;
 guint Keyboard::snap_delta_mod = Keyboard::SecondaryModifier|Keyboard::Level4Modifier;
 
@@ -110,10 +122,10 @@ bool Keyboard::can_save_keybindings = false;
 bool Keyboard::bindings_changed_after_save_became_legal = false;
 map<string,string> Keyboard::binding_files;
 string Keyboard::_current_binding_name;
-map<AccelKey,pair<string,string>,Keyboard::AccelKeyLess> Keyboard::release_keys;
+string Keyboard::binding_filename_suffix = X_(".keys");
+Gtk::Window* Keyboard::pre_dialog_active_window = 0;
 
 /* set this to initially contain the modifiers we care about, then track changes in ::set_edit_modifier() etc. */
-
 GdkModifierType Keyboard::RelevantModifierKeyMask;
 
 void
@@ -143,11 +155,31 @@ Keyboard::Keyboard ()
 
 	RelevantModifierKeyMask = (GdkModifierType) gtk_accelerator_get_default_mod_mask ();
 
+	RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | PrimaryModifier);
+	RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | SecondaryModifier);
+	RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | TertiaryModifier);
+	RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | Level4Modifier);
+	RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | CopyModifier);
+	RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | RangeSelectModifier);
+
+	gtk_accelerator_set_default_mod_mask (RelevantModifierKeyMask);
+
 #ifdef __APPLE__
         /* Remove SUPER,HYPER,META.
          *
          * GTK on OS X adds META when Command is pressed for various indefensible reasons, since
-         * it also uses MOD2 to indicate Command.
+         * it also uses MOD2 to indicate Command. Our code assumes that each
+         * modifier (Primary, Secondary etc.) is represented by a single bit in
+         * the modifier mask, but GTK's (STUPID) design uses two (MOD2 + META)
+         * to represent the Command key. Some discussion about this is here:
+         * https://bugzilla.gnome.org/show_bug.cgi?id=692597 
+         *
+         * We cannot do this until AFTER we told GTK what the default modifier
+         * was, because otherwise it will fail to recognize MOD2-META-<key> as
+         * an accelerator.
+         *
+         * Note that in the tabbed branch, we no longer use GTK accelerators
+         * for functional purposes, so this is as critical for that branch.
          */
 
 	RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask & ~GDK_SUPER_MASK);
@@ -155,15 +187,6 @@ Keyboard::Keyboard ()
 	RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask & ~GDK_META_MASK);
 #endif
 
-	RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | PrimaryModifier);
-	RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | SecondaryModifier);
-	RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | TertiaryModifier);
-	RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | Level4Modifier);
-	RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | CopyModifier);
-	RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | RangeSelectModifier);
-
-	gtk_accelerator_set_default_mod_mask (RelevantModifierKeyMask);
-
 	snooper_id = gtk_key_snooper_install (_snooper, (gpointer) this);
 }
 
@@ -203,7 +226,7 @@ Keyboard::get_state (void)
 int
 Keyboard::set_state (const XMLNode& node, int /*version*/)
 {
-	const XMLProperty* prop;
+	XMLProperty const * prop;
 
 	if ((prop = node.property ("copy-modifier")) != 0) {
 		sscanf (prop->value().c_str(), "%d", &CopyModifier);
@@ -250,64 +273,6 @@ Keyboard::_snooper (GtkWidget *widget, GdkEventKey *event, gpointer data)
 	return ((Keyboard *) data)->snooper (widget, event);
 }
 
-static string
-show_gdk_event_state (int state)
-{
-	string s;
-	if (state & GDK_SHIFT_MASK) {
-		s += "+SHIFT";
-	}
-	if (state & GDK_LOCK_MASK) {
-		s += "+LOCK";
-	}
-	if (state & GDK_CONTROL_MASK) {
-		s += "+CONTROL";
-	}
-	if (state & GDK_MOD1_MASK) {
-		s += "+MOD1";
-	}
-	if (state & GDK_MOD2_MASK) {
-		s += "+MOD2";
-	}
-	if (state & GDK_MOD3_MASK) {
-		s += "+MOD3";
-	}
-	if (state & GDK_MOD4_MASK) {
-		s += "+MOD4";
-	}
-	if (state & GDK_MOD5_MASK) {
-		s += "+MOD5";
-	}
-	if (state & GDK_BUTTON1_MASK) {
-		s += "+BUTTON1";
-	}
-	if (state & GDK_BUTTON2_MASK) {
-		s += "+BUTTON2";
-	}
-	if (state & GDK_BUTTON3_MASK) {
-		s += "+BUTTON3";
-	}
-	if (state & GDK_BUTTON4_MASK) {
-		s += "+BUTTON4";
-	}
-	if (state & GDK_BUTTON5_MASK) {
-		s += "+BUTTON5";
-	}
-	if (state & GDK_SUPER_MASK) {
-		s += "+SUPER";
-	}
-	if (state & GDK_HYPER_MASK) {
-		s += "+HYPER";
-	}
-	if (state & GDK_META_MASK) {
-		s += "+META";
-	}
-	if (state & GDK_RELEASE_MASK) {
-		s += "+RELEASE";
-	}
-
-	return s;
-}
 
 gint
 Keyboard::snooper (GtkWidget *widget, GdkEventKey *event)
@@ -357,6 +322,10 @@ Keyboard::snooper (GtkWidget *widget, GdkEventKey *event)
 			   prevent auto-repeat events.
 			*/
 
+#if 0
+			/* August 2015: we don't have any release bindings
+			 */
+
 			for (map<AccelKey,two_strings,AccelKeyLess>::iterator k = release_keys.begin(); k != release_keys.end(); ++k) {
 
 				const AccelKey& ak (k->first);
@@ -367,32 +336,7 @@ Keyboard::snooper (GtkWidget *widget, GdkEventKey *event)
 					break;
 				}
 			}
-		}
-
-	} else if (event->type == GDK_KEY_RELEASE) {
-
-		State::iterator i;
-
-		if ((i = find (state.begin(), state.end(), keyval)) != state.end()) {
-			state.erase (i);
-			sort (state.begin(), state.end());
-		}
-
-		for (map<AccelKey,two_strings,AccelKeyLess>::iterator k = release_keys.begin(); k != release_keys.end(); ++k) {
-
-			const AccelKey& ak (k->first);
-			two_strings ts (k->second);
-
-			if (keyval == ak.get_key() && (Gdk::ModifierType)((event->state & Keyboard::RelevantModifierKeyMask) | Gdk::RELEASE_MASK) == ak.get_mod()) {
-				Glib::RefPtr<Gtk::Action> act = ActionManager::get_action (ts.first.c_str(), ts.second.c_str());
-				if (act) {
-					DEBUG_TRACE (DEBUG::Keyboard, string_compose ("Activate %1 %2\n", ts.first, ts.second));
-					act->activate();
-					DEBUG_TRACE (DEBUG::Keyboard, string_compose ("Use repeat, suppress other\n", ts.first, ts.second));
-					ret = true;
-				}
-				break;
-			}
+#endif
 		}
 	}
 
@@ -421,10 +365,38 @@ Keyboard::close_current_dialog ()
 	if (current_window) {
 		current_window->hide ();
 		current_window = 0;
+
+                if (pre_dialog_active_window) {
+                        pre_dialog_active_window->present ();
+                        pre_dialog_active_window = 0;
+                }
 	}
 }
 
 bool
+Keyboard::catch_user_event_for_pre_dialog_focus (GdkEvent* ev, Gtk::Window* w)
+{
+        switch (ev->type) {
+        case GDK_BUTTON_PRESS:
+        case GDK_BUTTON_RELEASE:
+        case GDK_KEY_PRESS:
+        case GDK_KEY_RELEASE:
+                pre_dialog_active_window = w;
+                break;
+
+        case GDK_FOCUS_CHANGE:
+                if (ev->focus_change.in) {
+                        pre_dialog_active_window = w;
+                }
+                break;
+
+        default:
+                break;
+        }
+        return false;
+}
+
+bool
 Keyboard::key_is_down (uint32_t keyval)
 {
 	return find (state.begin(), state.end(), keyval) != state.end();
@@ -458,6 +430,7 @@ Keyboard::leave_window (GdkEventCrossing *ev, Gtk::Window* /*win*/)
 			current_window = 0;
 		}
 	} else {
+		DEBUG_TRACE (DEBUG::Keyboard, "LEAVE window without event\n");
 		current_window = 0;
 	}
 
@@ -479,7 +452,9 @@ Keyboard::focus_out_window (GdkEventFocus * ev, Gtk::Window* win)
 		state.clear ();
 		current_window = 0;
 	}  else {
-		current_window = 0;
+		if (win == current_window) {
+			current_window = 0;
+		}
 	}
 
 	DEBUG_TRACE (DEBUG::Keyboard, string_compose ("Foucusing out window, title = %1\n", win->get_title()));
@@ -573,7 +548,7 @@ Keyboard::is_insert_note_event (GdkEventButton *ev)
 bool
 Keyboard::is_button2_event (GdkEventButton* ev)
 {
-#ifdef GTKOSX
+#ifdef __APPLE__
 	return (ev->button == 2) ||
 		((ev->button == 1) &&
 		 ((ev->state & Keyboard::button2_modifiers) == Keyboard::button2_modifiers));
@@ -636,17 +611,19 @@ void
 Keyboard::save_keybindings ()
 {
 	if (can_save_keybindings && bindings_changed_after_save_became_legal) {
-		Gtk::AccelMap::save (user_keybindings_path);
+		/* Call to specific implementation to save bindings to path */
+		store_keybindings (user_keybindings_path);
 	}
 }
 
 bool
-Keyboard::load_keybindings (string path)
+Keyboard::load_keybindings (string const & path)
 {
 	try {
 		info << "Loading bindings from " << path << endl;
 
-		Gtk::AccelMap::load (path);
+		/* Call to specific implementation to load bindings from path */
+		read_keybindings (path);
 
 		_current_binding_name = _("Unknown");
 
@@ -664,41 +641,62 @@ Keyboard::load_keybindings (string path)
 		return false;
 	}
 
-	/* now find all release-driven bindings */
+	return true;
+}
 
-	vector<string> groups;
-	vector<string> names;
-	vector<string> tooltips;
-	vector<AccelKey> bindings;
+int
+Keyboard::read_keybindings (string const & path)
+{
+	XMLTree tree;
 
-	ActionManager::get_all_actions (groups, names, tooltips, bindings);
+	if (!tree.read (path.c_str())) {
+		return -1;
+	}
 
-	vector<string>::iterator g;
-	vector<AccelKey>::iterator b;
-	vector<string>::iterator n;
+	/* toplevel node is "BindingSet; children are "Bindings" */
 
-	release_keys.clear ();
+	XMLNodeList const& children = tree.root()->children();
 
-	for (n = names.begin(), b = bindings.begin(), g = groups.begin(); n != names.end(); ++n, ++b, ++g) {
-		stringstream s;
-		s << "Action: " << *n << " Group: " << *g << " Binding: ";
+	for (XMLNodeList::const_iterator i = children.begin(); i != children.end(); ++i) {
+		XMLNode const * child = *i;
+		if (child->name() == X_("Bindings")) {
+		        XMLProperty const* name = child->property (X_("name"));
+		        if (!name) {
+			        warning << _("Keyboard binding found without a name") << endmsg;
+			        continue;
+		        }
 
-		if ((*b).get_key() != GDK_VoidSymbol) {
-			s << b->get_key() << " w/mod " << hex << b->get_mod() << dec << " = " << b->get_abbrev () << "\n";
-		} else {
-			s << "unbound\n";
-		}
+		        Bindings* b = new Bindings (name->value());
+		        b->load (**i);
+	        }
+        }
+
+	return 0;
+}
 
-		DEBUG_TRACE (DEBUG::Bindings, s.str ());
+int
+Keyboard::store_keybindings (string const & path)
+{
+	XMLNode* node = new XMLNode (X_("BindingSet"));
+	XMLNode* bnode;
+	int ret = 0;
+
+	for (list<Bindings*>::const_iterator b = Bindings::bindings.begin(); b != Bindings::bindings.end(); ++b) {
+		bnode = new XMLNode (X_("Bindings"));
+		bnode->add_property (X_("name"), (*b)->name());
+		(*b)->save (*bnode);
+		node->add_child_nocopy (*bnode);
 	}
 
-	for (n = names.begin(), b = bindings.begin(), g = groups.begin(); n != names.end(); ++n, ++b, ++g) {
-		if ((*b).get_mod() & Gdk::RELEASE_MASK) {
-			release_keys.insert (pair<AccelKey,two_strings> (*b, two_strings (*g, *n)));
-		}
+	XMLTree tree;
+	tree.set_root (node); /* tree now owns root and will delete it */
+
+	if (!tree.write (path)) {
+		error << string_compose (_("Cannot save key bindings to %1"), path) << endmsg;
+		ret = -1;
 	}
 
-	return true;
+	return ret;
 }
 
 int
@@ -718,6 +716,7 @@ Keyboard::reset_bindings ()
 	{
 		PBD::Unwinder<bool> uw (can_save_keybindings, false);
 		setup_keybindings ();
+		Bindings::associate_all ();
 	}
 
 	return 0;
diff --git a/libs/gtkmm2ext/pane.cc b/libs/gtkmm2ext/pane.cc
new file mode 100644
index 0000000..be1f63c
--- /dev/null
+++ b/libs/gtkmm2ext/pane.cc
@@ -0,0 +1,610 @@
+/*
+    Copyright (C) 2016 Paul Davis
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#include <gdkmm/cursor.h>
+#include "gtkmm2ext/pane.h"
+
+#include "pbd/i18n.h"
+
+using namespace PBD;
+using namespace Gtk;
+using namespace Gtkmm2ext;
+using namespace std;
+
+Pane::Pane (bool h)
+	: horizontal (h)
+	, did_move (false)
+	, divider_width (2)
+	, check_fract (false)
+{
+	using namespace Gdk;
+
+	set_name ("Pane");
+	set_has_window (false);
+
+	if (horizontal) {
+		drag_cursor = Cursor (SB_H_DOUBLE_ARROW);
+	} else {
+		drag_cursor = Cursor (SB_V_DOUBLE_ARROW);
+	}
+}
+
+Pane::~Pane ()
+{
+	for (Children::iterator c = children.begin(); c != children.end(); ++c) {
+		c->w->remove_destroy_notify_callback (&(*c));
+		c->w->unparent ();
+	}
+}
+
+void
+Pane::set_child_minsize (Gtk::Widget const& w, int32_t minsize)
+{
+	for (Children::iterator c = children.begin(); c != children.end(); ++c) {
+		if (c->w == &w) {
+			c->minsize = minsize;
+			break;
+		}
+	}
+}
+
+void
+Pane::set_drag_cursor (Gdk::Cursor c)
+{
+	drag_cursor = c;
+}
+
+void
+Pane::on_size_request (GtkRequisition* req)
+{
+	GtkRequisition largest;
+
+	/* iterate over all children, get their size requests */
+
+	/* horizontal pane is as high as its tallest child, including the dividers.
+	 * Its width is the sum of the children plus the dividers.
+	 *
+	 * vertical pane is as wide as its widest child, including the dividers.
+	 * Its height is the sum of the children plus the dividers.
+	 */
+
+	if (horizontal) {
+		largest.width = (children.size()  - 1) * divider_width;
+		largest.height = 0;
+	} else {
+		largest.height = (children.size() - 1) * divider_width;
+		largest.width = 0;
+	}
+
+	for (Children::iterator child = children.begin(); child != children.end(); ++child) {
+		GtkRequisition r;
+
+		child->w->size_request (r);
+
+		if (horizontal) {
+			largest.height = max (largest.height, r.height);
+			largest.width += r.width;
+		} else {
+			largest.width = max (largest.width, r.width);
+			largest.height += r.height;
+		}
+	}
+
+	*req = largest;
+}
+
+GType
+Pane::child_type_vfunc() const
+{
+	/* We accept any number of any types of widgets */
+	return Gtk::Widget::get_type();
+}
+
+void
+Pane::add_divider ()
+{
+	Divider* d = new Divider;
+	d->set_name (X_("Divider"));
+	d->signal_button_press_event().connect (sigc::bind (sigc::mem_fun (*this, &Pane::handle_press_event), d), false);
+	d->signal_button_release_event().connect (sigc::bind (sigc::mem_fun (*this, &Pane::handle_release_event), d), false);
+	d->signal_motion_notify_event().connect (sigc::bind (sigc::mem_fun (*this, &Pane::handle_motion_event), d), false);
+	d->signal_enter_notify_event().connect (sigc::bind (sigc::mem_fun (*this, &Pane::handle_enter_event), d), false);
+	d->signal_leave_notify_event().connect (sigc::bind (sigc::mem_fun (*this, &Pane::handle_leave_event), d), false);
+	d->set_parent (*this);
+	d->show ();
+	d->fract = 0.5;
+	dividers.push_back (d);
+}
+
+void
+Pane::handle_child_visibility ()
+{
+	reallocate (get_allocation());
+}
+
+void
+Pane::on_add (Widget* w)
+{
+	children.push_back (Child (this, w, 0));
+
+	w->set_parent (*this);
+	/* Gtkmm 2.4 does not correctly arrange for ::on_remove() to be called
+	   for custom containers that derive from Gtk::Container. So ... we need
+	   to ensure that we hear about child destruction ourselves.
+	*/
+	w->add_destroy_notify_callback (&children.back(), &Pane::notify_child_destroyed);
+
+	w->signal_show().connect (sigc::mem_fun (*this, &Pane::handle_child_visibility));
+	w->signal_hide().connect (sigc::mem_fun (*this, &Pane::handle_child_visibility));
+
+	while (dividers.size() < (children.size() - 1)) {
+		add_divider ();
+	}
+}
+
+void*
+Pane::notify_child_destroyed (void* data)
+{
+	Child* child = reinterpret_cast<Child*> (data);
+	return child->pane->child_destroyed (child->w);
+}
+
+void*
+Pane::child_destroyed (Gtk::Widget* w)
+{
+	for (Children::iterator c = children.begin(); c != children.end(); ++c) {
+		if (c->w == w) {
+			children.erase (c);
+			break;
+		}
+	}
+	return 0;
+}
+
+void
+Pane::on_remove (Widget* w)
+{
+	for (Children::iterator c = children.begin(); c != children.end(); ++c) {
+		if (c->w == w) {
+			w->remove_destroy_notify_callback (&(*c));
+			w->unparent ();
+			children.erase (c);
+			break;
+		}
+	}
+}
+
+void
+Pane::on_size_allocate (Gtk::Allocation& alloc)
+{
+	reallocate (alloc);
+	Container::on_size_allocate (alloc);
+}
+
+void
+Pane::reallocate (Gtk::Allocation const & alloc)
+{
+        int remaining;
+        int xpos = alloc.get_x();
+        int ypos = alloc.get_y();
+        float fract;
+
+        if (children.empty()) {
+	        return;
+        }
+
+        if (children.size() == 1) {
+	        /* only child gets the full allocation */
+	        children.front().w->size_allocate (alloc);
+	        return;
+        }
+
+        if (horizontal) {
+	        remaining = alloc.get_width ();
+        } else {
+	        remaining = alloc.get_height ();
+        }
+
+        Children::iterator child;
+        Children::iterator next;
+        Dividers::iterator div;
+
+        child = children.begin();
+
+        /* skip initial hidden children */
+
+        while (child != children.end()) {
+	        if (child->w->is_visible()) {
+		        break;
+	        }
+	        ++child;
+        }
+
+        for (div = dividers.begin(); child != children.end(); ) {
+
+	        Gtk::Allocation child_alloc;
+
+	        next = child;
+
+	        /* Move on to next *visible* child */
+
+	        while (++next != children.end()) {
+		        if (next->w->is_visible()) {
+			        break;
+		        }
+	        }
+
+	        child_alloc.set_x (xpos);
+	        child_alloc.set_y (ypos);
+
+	        if (next == children.end()) {
+		        /* last child gets all the remaining space */
+		        fract = 1.0;
+	        } else {
+		        /* child gets the fraction of the remaining space given by the divider that follows it */
+		        fract = (*div)->fract;
+	        }
+
+	        Gtk::Requisition cr;
+	        child->w->size_request (cr);
+
+	        if (horizontal) {
+		        child_alloc.set_width ((gint) floor (remaining * fract));
+		        child_alloc.set_height (alloc.get_height());
+		        remaining = max (0, (remaining - child_alloc.get_width()));
+		        xpos += child_alloc.get_width();
+	        } else {
+		        child_alloc.set_width (alloc.get_width());
+		        child_alloc.set_height ((gint) floor (remaining * fract));
+		        remaining = max (0, (remaining - child_alloc.get_height()));
+		        ypos += child_alloc.get_height ();
+	        }
+
+	        if (child->minsize) {
+		        if (horizontal) {
+			        child_alloc.set_width (max (child_alloc.get_width(), child->minsize));
+		        } else {
+			        child_alloc.set_height (max (child_alloc.get_height(), child->minsize));
+		        }
+	        }
+
+	        child->w->size_allocate (child_alloc);
+
+	        if (next == children.end()) {
+		        /* done, no more children, no need for a divider */
+		        break;
+	        }
+
+	        child = next;
+
+	        /* add a divider between children */
+
+	        Gtk::Allocation divider_allocation;
+
+	        divider_allocation.set_x (xpos);
+	        divider_allocation.set_y (ypos);
+
+	        if (horizontal) {
+		        divider_allocation.set_width (divider_width);
+		        divider_allocation.set_height (alloc.get_height());
+		        remaining = max (0, remaining - divider_width);
+		        xpos += divider_width;
+	        } else {
+		        divider_allocation.set_width (alloc.get_width());
+		        divider_allocation.set_height (divider_width);
+		        remaining = max (0, remaining - divider_width);
+		        ypos += divider_width;
+	        }
+
+	        (*div)->size_allocate (divider_allocation);
+	        (*div)->show ();
+	        ++div;
+        }
+
+        /* hide all remaining dividers */
+
+        while (div != dividers.end()) {
+	        (*div)->hide ();
+	        ++div;
+        }
+}
+
+bool
+Pane::on_expose_event (GdkEventExpose* ev)
+{
+	Children::iterator child;
+	Dividers::iterator div;
+
+	for (child = children.begin(), div = dividers.begin(); child != children.end(); ++child) {
+
+		if (child->w->is_visible()) {
+			propagate_expose (*(child->w), ev);
+		}
+
+		if (div != dividers.end()) {
+			if ((*div)->is_visible()) {
+				propagate_expose (**div, ev);
+			}
+			++div;
+		}
+        }
+
+        return true;
+}
+
+bool
+Pane::handle_press_event (GdkEventButton* ev, Divider* d)
+{
+	d->dragging = true;
+	d->queue_draw ();
+
+	return false;
+}
+
+bool
+Pane::handle_release_event (GdkEventButton* ev, Divider* d)
+{
+	d->dragging = false;
+
+	if (did_move && !children.empty()) {
+		children.front().w->queue_resize ();
+		did_move = false;
+	}
+
+	return false;
+}
+void
+Pane::set_check_divider_position (bool yn)
+{
+	check_fract = yn;
+}
+
+bool
+Pane::fract_is_ok (Dividers::size_type div, float fract)
+{
+#ifdef __APPLE__
+	if (!check_fract) {
+		return true;
+	}
+
+
+	if (get_allocation().get_width() == 1 && get_allocation().get_height() == 1) {
+		/* space not * allocated - * divider being set from startup code. Let it pass,
+		   since our goal is mostly to catch drags to a position that will interfere with window
+		   resizing.
+		*/
+		return true;
+	}
+
+	/* On Quartz, if the pane handle (divider) gets to
+	   be adjacent to the window edge, you can no longer grab it:
+	   any attempt to do so is interpreted by the Quartz window
+	   manager ("Finder") as a resize drag on the window edge.
+	*/
+
+	if (horizontal) {
+		if (div == dividers.size() - 1) {
+			if (get_allocation().get_width() * (1.0 - fract) < (divider_width*2)) {
+				/* too close to right edge */
+				return false;
+			}
+		}
+
+		if (div == 0) {
+			if (get_allocation().get_width() * fract < (divider_width*2)) {
+				/* too close to left edge */
+				return false;
+			}
+		}
+	} else {
+		if (div == dividers.size() - 1) {
+			if (get_allocation().get_height() * (1.0 - fract) < (divider_width*2)) {
+				/* too close to bottom */
+				return false;
+			}
+		}
+
+		if (div == 0) {
+			if (get_allocation().get_width() * fract < (divider_width*2)) {
+				/* too close to top */
+				return false;
+			}
+		}
+	}
+#endif
+	return true;
+}
+
+bool
+Pane::handle_motion_event (GdkEventMotion* ev, Divider* d)
+{
+	did_move = true;
+
+	if (!d->dragging) {
+		return true;
+	}
+
+	/* determine new position for handle */
+
+	float new_fract;
+	int px, py;
+
+	d->translate_coordinates (*this, ev->x, ev->y, px, py);
+
+	Dividers::iterator prev = dividers.end();
+	Dividers::size_type div = 0;
+
+	for (Dividers::iterator di = dividers.begin(); di != dividers.end(); ++di, ++div) {
+		if (*di == d) {
+			break;
+		}
+		prev = di;
+	}
+
+	int space_remaining;
+	int prev_edge;
+
+	if (horizontal) {
+		if (prev != dividers.end()) {
+			prev_edge = (*prev)->get_allocation().get_x() + (*prev)->get_allocation().get_width();
+		} else {
+			prev_edge = 0;
+		}
+		space_remaining = get_allocation().get_width() - prev_edge;
+		new_fract = (float) (px - prev_edge) / space_remaining;
+	} else {
+		if (prev != dividers.end()) {
+			prev_edge = (*prev)->get_allocation().get_y() + (*prev)->get_allocation().get_height();
+		} else {
+			prev_edge = 0;
+		}
+		space_remaining = get_allocation().get_height() - prev_edge;
+		new_fract = (float) (py - prev_edge) / space_remaining;
+	}
+
+	new_fract = min (1.0f, max (0.0f, new_fract));
+
+	if (!fract_is_ok (div, new_fract)) {
+		return true;
+	}
+
+	if (new_fract != d->fract) {
+		d->fract = new_fract;
+		reallocate (get_allocation ());
+		queue_draw ();
+	}
+
+	return true;
+}
+
+void
+Pane::set_divider (Dividers::size_type div, float fract)
+{
+	Dividers::iterator d = dividers.begin();
+
+	for (d = dividers.begin(); d != dividers.end() && div != 0; ++d, --div) {
+		/* relax */
+	}
+
+	if (d == dividers.end()) {
+		/* caller is trying to set divider that does not exist
+		 * yet.
+		 */
+		return;
+	}
+
+	fract = max (0.0f, min (1.0f, fract));
+
+	if (!fract_is_ok (div, fract)) {
+		return;
+	}
+
+	if (fract != (*d)->fract) {
+		(*d)->fract = fract;
+		/* our size hasn't changed, but our internal allocations have */
+		reallocate (get_allocation());
+		queue_draw ();
+	}
+}
+
+float
+Pane::get_divider (Dividers::size_type div)
+{
+	Dividers::iterator d = dividers.begin();
+
+	for (d = dividers.begin(); d != dividers.end() && div != 0; ++d, --div) {
+		/* relax */
+	}
+
+	if (d == dividers.end()) {
+		/* caller is trying to set divider that does not exist
+		 * yet.
+		 */
+		return -1.0f;
+	}
+
+	return (*d)->fract;
+}
+
+void
+Pane::forall_vfunc (gboolean include_internals, GtkCallback callback, gpointer callback_data)
+{
+	/* since the callback could modify the child list(s), make sure we keep
+	 * the iterators safe;
+	 */
+
+	for (Children::iterator c = children.begin(); c != children.end(); ) {
+		Children::iterator next = c;
+		++next;
+		callback (c->w->gobj(), callback_data);
+		c = next;
+	}
+
+	if (include_internals) {
+		for (Dividers::iterator d = dividers.begin(); d != dividers.end(); ) {
+			Dividers::iterator next = d;
+			++next;
+			callback (GTK_WIDGET((*d)->gobj()), callback_data);
+			d = next;
+		}
+	}
+}
+
+Pane::Divider::Divider ()
+	: fract (0.0)
+	, dragging (false)
+{
+	set_events (Gdk::EventMask (Gdk::BUTTON_PRESS|
+	                            Gdk::BUTTON_RELEASE|
+	                            Gdk::MOTION_NOTIFY|
+	                            Gdk::ENTER_NOTIFY|
+	                            Gdk::LEAVE_NOTIFY));
+}
+
+bool
+Pane::Divider::on_expose_event (GdkEventExpose* ev)
+{
+	Gdk::Color c = (dragging ? get_style()->get_fg (Gtk::STATE_ACTIVE) :
+	                get_style()->get_fg (get_state()));
+
+	Cairo::RefPtr<Cairo::Context> draw_context = get_window()->create_cairo_context ();
+	draw_context->rectangle (ev->area.x, ev->area.y, ev->area.width, ev->area.height);
+        draw_context->clip_preserve ();
+        draw_context->set_source_rgba (c.get_red_p(), c.get_green_p(), c.get_blue_p(), 1.0);
+        draw_context->fill ();
+
+        return true;
+}
+
+bool
+Pane::handle_enter_event (GdkEventCrossing*, Divider* d)
+{
+	d->get_window()->set_cursor (drag_cursor);
+	d->set_state (Gtk::STATE_SELECTED);
+	return true;
+}
+
+bool
+Pane::handle_leave_event (GdkEventCrossing*, Divider* d)
+{
+	d->get_window()->set_cursor ();
+	d->set_state (Gtk::STATE_NORMAL);
+	d->queue_draw ();
+	return true;
+}
diff --git a/libs/gtkmm2ext/paths_dialog.cc b/libs/gtkmm2ext/paths_dialog.cc
index f169a5a..2f2ff0c 100644
--- a/libs/gtkmm2ext/paths_dialog.cc
+++ b/libs/gtkmm2ext/paths_dialog.cc
@@ -18,7 +18,7 @@
 */
 #include <cstdio>
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 #include "pbd/pathexpand.h"
 #include "gtkmm2ext/paths_dialog.h"
 
diff --git a/libs/gtkmm2ext/persistent_tooltip.cc b/libs/gtkmm2ext/persistent_tooltip.cc
index c7cb3f4..d45ef01 100644
--- a/libs/gtkmm2ext/persistent_tooltip.cc
+++ b/libs/gtkmm2ext/persistent_tooltip.cc
@@ -19,16 +19,20 @@
 
 #include <gtkmm/window.h>
 #include <gtkmm/label.h>
+#include <gtkmm/settings.h>
 #include "gtkmm2ext/persistent_tooltip.h"
 
 #include "pbd/stacktrace.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace Gtk;
 using namespace Gtkmm2ext;
 
+bool PersistentTooltip::_tooltips_enabled = true;
+unsigned int PersistentTooltip::_tooltip_timeout = 500;
+
 /** @param target The widget to provide the tooltip for */
 PersistentTooltip::PersistentTooltip (Gtk::Widget* target, bool  draggable, int margin_y)
 	: _target (target)
@@ -43,6 +47,7 @@ PersistentTooltip::PersistentTooltip (Gtk::Widget* target, bool  draggable, int
 	target->signal_leave_notify_event().connect (sigc::mem_fun (*this, &PersistentTooltip::leave), false);
 	target->signal_button_press_event().connect (sigc::mem_fun (*this, &PersistentTooltip::press), false);
 	target->signal_button_release_event().connect (sigc::mem_fun (*this, &PersistentTooltip::release), false);
+	_tooltip_timeout = Gtk::Settings::get_default()->property_gtk_tooltip_timeout ();
 }
 
 PersistentTooltip::~PersistentTooltip ()
@@ -56,7 +61,7 @@ PersistentTooltip::enter (GdkEventCrossing *)
 	if (_timeout.connected()) {
 		leave(NULL);
 	}
-	_timeout = Glib::signal_timeout().connect (sigc::mem_fun (*this, &PersistentTooltip::timeout), 500);
+	_timeout = Glib::signal_timeout().connect (sigc::mem_fun (*this, &PersistentTooltip::timeout), _tooltip_timeout);
 	return false;
 }
 
@@ -115,7 +120,7 @@ PersistentTooltip::hide ()
 void
 PersistentTooltip::show ()
 {
-	if (_tip.empty()) {
+	if (_tip.empty() || !_tooltips_enabled) {
 		return;
 	}
 
diff --git a/libs/gtkmm2ext/pixfader.cc b/libs/gtkmm2ext/pixfader.cc
index 0c43588..64ee449 100644
--- a/libs/gtkmm2ext/pixfader.cc
+++ b/libs/gtkmm2ext/pixfader.cc
@@ -356,6 +356,9 @@ PixFader::on_size_request (GtkRequisition* req)
 void
 PixFader::on_size_allocate (Gtk::Allocation& alloc)
 {
+	int old_girth = _girth;
+	int old_span = _span;
+
 	CairoWidget::on_size_allocate(alloc);
 
 	if (_orien == VERT) {
@@ -366,7 +369,7 @@ PixFader::on_size_allocate (Gtk::Allocation& alloc)
 		_span = alloc.get_width ();
 	}
 
-	if (is_realized()) {
+	if (is_realized() && ((old_girth != _girth) || (old_span != _span))) {
 		/* recreate patterns in case we've changed size */
 		create_patterns ();
 	}
diff --git a/libs/gtkmm2ext/po/cs.mo b/libs/gtkmm2ext/po/cs.mo
new file mode 100644
index 0000000..aa3d1ee
Binary files /dev/null and b/libs/gtkmm2ext/po/cs.mo differ
diff --git a/libs/gtkmm2ext/po/cs.po b/libs/gtkmm2ext/po/cs.po
index 55ff3bb..4392dcd 100644
--- a/libs/gtkmm2ext/po/cs.po
+++ b/libs/gtkmm2ext/po/cs.po
@@ -6,7 +6,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-03-31 20:13-0400\n"
+"POT-Creation-Date: 2016-07-13 18:09-0400\n"
 "PO-Revision-Date: 2013-06-13 22:33+0200\n"
 "Last-Translator: Pavel Fric <pavelfric at seznam.cz>\n"
 "Language-Team: Czech <kde-i18n-doc at kde.org>\n"
@@ -17,11 +17,7 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 "X-Generator: Lokalize 1.5\n"
 
-#: actions.cc:336
-msgid "programming error: %1"
-msgstr ""
-
-#: actions.cc:511
+#: actions.cc:261
 msgid "Unknown action name: %1"
 msgstr "Neznámý název pro činnost: %1"
 
@@ -41,11 +37,11 @@ msgstr ""
 msgid "ABCDEFGHIJLKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
 msgstr ""
 
-#: gtk_ui.cc:113
+#: gtk_ui.cc:119
 msgid "Log"
 msgstr "Zápis"
 
-#: gtk_ui.cc:370
+#: gtk_ui.cc:388
 msgid ""
 "\n"
 "\n"
@@ -55,65 +51,73 @@ msgstr ""
 "\n"
 "Kurzbefehl: "
 
-#: gtk_ui.cc:638
+#: gtk_ui.cc:688
 msgid "Press To Exit"
 msgstr "Stisknout pro ukončení"
 
-#: gtk_ui.cc:674
+#: gtk_ui.cc:724
 msgid "I'm sorry %1, I can't do that"
 msgstr "Bohužel to nelze udělat, %1"
 
-#: keyboard.cc:73
+#: keyboard.cc:70
 msgid "Command"
 msgstr "Příkaz"
 
-#: keyboard.cc:74 keyboard.cc:77 keyboard.cc:90 keyboard.cc:94
+#: keyboard.cc:71 keyboard.cc:93
 msgid "Control"
 msgstr "Ctrl"
 
-#: keyboard.cc:75 keyboard.cc:78 keyboard.cc:92 keyboard.cc:95
+#: keyboard.cc:72 keyboard.cc:77 keyboard.cc:95 keyboard.cc:100
 msgid "Key|Shift"
 msgstr "Key|Shift"
 
-#: keyboard.cc:76
+#: keyboard.cc:73
 msgid "Option"
 msgstr "Volba"
 
-#: keyboard.cc:91
+#: keyboard.cc:75
+msgid "Cmd"
+msgstr ""
+
+#: keyboard.cc:76 keyboard.cc:98
+msgid "Ctrl"
+msgstr ""
+
+#: keyboard.cc:78
+msgid "Opt"
+msgstr ""
+
+#: keyboard.cc:94 keyboard.cc:99
 msgid "Alt"
 msgstr "Alt"
 
-#: keyboard.cc:93
-msgid "Meta"
-msgstr "Meta"
+#: keyboard.cc:96
+msgid "Windows"
+msgstr ""
+
+#: keyboard.cc:101
+msgid "Win"
+msgstr ""
 
-#: keyboard.cc:144 keyboard.cc:540
+#: keyboard.cc:152 keyboard.cc:685
 msgid "Unknown"
 msgstr "Neznámý"
 
-#: keyboard.cc:551
+#: keyboard.cc:696
 msgid "key bindings file not found at \"%2\" or contains errors."
 msgstr ""
 "Soubor s přiřazením kláves \"%2\"se nepodařilo najít, nebo obsahuje chyby."
 
-#: keyboard.cc:602
-msgid "Cannot rename your own keybinding file (%1)"
-msgstr ""
-
-#: motionfeedback.cc:486
-msgid "motionfeedback: failed to open a temporary file for writing: %1"
-msgstr ""
-
-#: motionfeedback.cc:516
-msgid "motionfeedback: could not save image set to %1"
+#: keyboard.cc:722
+msgid "Keyboard binding found without a name"
 msgstr ""
 
-#: motionfeedback.cc:526
-msgid "motionfeedback: caught PixbufError: %1"
+#: keyboard.cc:752
+msgid "Cannot save key bindings to %1"
 msgstr ""
 
-#: motionfeedback.cc:528
-msgid "motionfeedback: unknown exception"
+#: keyboard.cc:768
+msgid "Cannot rename your own keybinding file (%1)"
 msgstr ""
 
 #: paths_dialog.cc:32
@@ -140,6 +144,9 @@ msgstr "Klepněte pro odtržení do vlastního okna"
 msgid "Click to put this back in the main window"
 msgstr "Klepněte pro ukotvení do hlavního okna"
 
-#: textviewer.cc:34
+#: textviewer.cc:32
 msgid "Close"
 msgstr "Zavřít"
+
+#~ msgid "Meta"
+#~ msgstr "Meta"
diff --git a/libs/gtkmm2ext/po/de.mo b/libs/gtkmm2ext/po/de.mo
new file mode 100644
index 0000000..6b4f324
Binary files /dev/null and b/libs/gtkmm2ext/po/de.mo differ
diff --git a/libs/gtkmm2ext/po/de.po b/libs/gtkmm2ext/po/de.po
index d3b6039..90de990 100644
--- a/libs/gtkmm2ext/po/de.po
+++ b/libs/gtkmm2ext/po/de.po
@@ -1,23 +1,23 @@
 # Copyright (C) YEAR "Paul Davis"
 # This file is distributed under the same license as the PACKAGE package.
 #
-# Edgar Aichinger <edgar.aichinger at aon.at>, 2013, 2015.
+# Edgar Aichinger <edgar.aichinger at aon.at>, 2013, 2015, 2016.
 msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-11-11 15:37+0100\n"
-"PO-Revision-Date: 2015-12-09 12:33+0100\n"
-"Last-Translator: Edgar Aichinger <edogawa at aon.at>\n"
+"POT-Creation-Date: 2016-08-06 14:10+0200\n"
+"PO-Revision-Date: 2016-08-06 15:49+0100\n"
+"Last-Translator: Edgar Aichinger <edgar.aichinger at aon.at>\n"
 "Language-Team: German <ardour-dev at lists.ardour.org>\n"
 "Language: de\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-Generator: Lokalize 1.5\n"
+"X-Generator: Lokalize 2.0\n"
 
-#: actions.cc:519
+#: actions.cc:261
 msgid "Unknown action name: %1"
 msgstr "Unbekannter Aktionsname: %1"
 
@@ -39,11 +39,11 @@ msgstr "Die Datei mit den Cursor-Hotspot-Infos %1 hat einen Fehler in Zeile %2"
 msgid "ABCDEFGHIJLKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
 msgstr "ABCDEFGHIJLKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
 
-#: gtk_ui.cc:113
+#: gtk_ui.cc:119
 msgid "Log"
 msgstr "Log"
 
-#: gtk_ui.cc:370
+#: gtk_ui.cc:388
 msgid ""
 "\n"
 "\n"
@@ -53,68 +53,75 @@ msgstr ""
 "\n"
 "Kurzbefehl: "
 
-#: gtk_ui.cc:670
+#: gtk_ui.cc:688
 msgid "Press To Exit"
 msgstr "Zum Beenden drücken"
 
-#: gtk_ui.cc:706
+#: gtk_ui.cc:724
 msgid "I'm sorry %1, I can't do that"
 msgstr "Leider kann ich das nicht tun, %1"
 
-#: keyboard.cc:69
+#: keyboard.cc:71
 msgid "Command"
 msgstr "Befehl"
 
-#: keyboard.cc:70 keyboard.cc:87
+#: keyboard.cc:72 keyboard.cc:94
 msgid "Control"
 msgstr "Strg"
 
-#: keyboard.cc:71 keyboard.cc:89
+#: keyboard.cc:73 keyboard.cc:78 keyboard.cc:96 keyboard.cc:101
 msgid "Key|Shift"
-msgstr "Key|Shift"
+msgstr "Umschalt"
 
-#: keyboard.cc:72
+#: keyboard.cc:74
 msgid "Option"
 msgstr "Option"
 
-#: keyboard.cc:88
+#: keyboard.cc:76
+msgid "Cmd"
+msgstr "Cmd"
+
+#: keyboard.cc:77 keyboard.cc:99
+msgid "Ctrl"
+msgstr "Ctrl"
+
+#: keyboard.cc:79
+msgid "Opt"
+msgstr "Alt"
+
+#: keyboard.cc:95 keyboard.cc:100
 msgid "Alt"
 msgstr "Alt"
 
-#: keyboard.cc:90
+#: keyboard.cc:97
 msgid "Windows"
 msgstr "Windows"
 
-#: keyboard.cc:141 keyboard.cc:580
+#: keyboard.cc:102
+msgid "Win"
+msgstr "Win"
+
+#: keyboard.cc:153 keyboard.cc:628
 msgid "Unknown"
 msgstr "Unbekannt"
 
-#: keyboard.cc:591
+#: keyboard.cc:639
 msgid "key bindings file not found at \"%2\" or contains errors."
 msgstr ""
 "Die Tastenkürzel-Datei \"%1\" konnte nicht gefunden werden oder enthält "
 "Fehler."
 
-#: keyboard.cc:642
-msgid "Cannot rename your own keybinding file (%1)"
-msgstr "Kann Ihre eigene Tastaturkürzeldatei nicht umbenennen (%1)"
+#: keyboard.cc:665
+msgid "Keyboard binding found without a name"
+msgstr "Tastenzuordnung ohne Namen gefunden"
 
-#: motionfeedback.cc:486
-msgid "motionfeedback: failed to open a temporary file for writing: %1"
-msgstr ""
-"motionfeedback: konnte eine Temporärdatei nicht zum Schreiben öffnen: %1"
-
-#: motionfeedback.cc:516
-msgid "motionfeedback: could not save image set to %1"
-msgstr "motionfeedback: konnte den Satz Bilder nicht in %1 speichern"
-
-#: motionfeedback.cc:526
-msgid "motionfeedback: caught PixbufError: %1"
-msgstr "motionfeedback: abgefangener PixbufError: %1"
+#: keyboard.cc:695
+msgid "Cannot save key bindings to %1"
+msgstr "Kann Tastenzuordnungen nicht nach %1 sichern"
 
-#: motionfeedback.cc:528
-msgid "motionfeedback: unknown exception"
-msgstr "motionfeedback: unbekannter Ausnahmefehler"
+#: keyboard.cc:711
+msgid "Cannot rename your own keybinding file (%1)"
+msgstr "Kann Ihre eigene Tastaturkürzeldatei nicht umbenennen (%1)"
 
 #: paths_dialog.cc:32
 msgid "Add"
@@ -143,3 +150,4 @@ msgstr "Klicken, um an das Hauptfenster anzudocken"
 #: textviewer.cc:32
 msgid "Close"
 msgstr "Schließen"
+
diff --git a/libs/gtkmm2ext/po/el.mo b/libs/gtkmm2ext/po/el.mo
new file mode 100644
index 0000000..2b5e05c
Binary files /dev/null and b/libs/gtkmm2ext/po/el.mo differ
diff --git a/libs/gtkmm2ext/po/el.po b/libs/gtkmm2ext/po/el.po
index c7c5e78..09b13cb 100644
--- a/libs/gtkmm2ext/po/el.po
+++ b/libs/gtkmm2ext/po/el.po
@@ -7,20 +7,16 @@ msgid ""
 msgstr ""
 "Project-Id-Version: 0.99beta23\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-03-31 20:13-0400\n"
+"POT-Creation-Date: 2016-07-13 18:09-0400\n"
 "PO-Revision-Date: 2005-01-11\n"
 "Last-Translator: Muadibas\n"
 "Language-Team: Hellenic(Greek) <LL at li.org>\n"
-"Language: \n"
+"Language: Greek\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: actions.cc:336
-msgid "programming error: %1"
-msgstr ""
-
-#: actions.cc:511
+#: actions.cc:261
 msgid "Unknown action name: %1"
 msgstr ""
 
@@ -40,75 +36,83 @@ msgstr ""
 msgid "ABCDEFGHIJLKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
 msgstr ""
 
-#: gtk_ui.cc:113
+#: gtk_ui.cc:119
 msgid "Log"
 msgstr ""
 
-#: gtk_ui.cc:370
+#: gtk_ui.cc:388
 msgid ""
 "\n"
 "\n"
 "Shortcut: "
 msgstr ""
 
-#: gtk_ui.cc:638
+#: gtk_ui.cc:688
 msgid "Press To Exit"
 msgstr ""
 
-#: gtk_ui.cc:674
+#: gtk_ui.cc:724
 msgid "I'm sorry %1, I can't do that"
 msgstr ""
 
-#: keyboard.cc:73
+#: keyboard.cc:70
 msgid "Command"
 msgstr ""
 
-#: keyboard.cc:74 keyboard.cc:77 keyboard.cc:90 keyboard.cc:94
+#: keyboard.cc:71 keyboard.cc:93
 msgid "Control"
 msgstr ""
 
-#: keyboard.cc:75 keyboard.cc:78 keyboard.cc:92 keyboard.cc:95
+#: keyboard.cc:72 keyboard.cc:77 keyboard.cc:95 keyboard.cc:100
 msgid "Key|Shift"
 msgstr ""
 
-#: keyboard.cc:76
+#: keyboard.cc:73
 msgid "Option"
 msgstr ""
 
-#: keyboard.cc:91
-msgid "Alt"
+#: keyboard.cc:75
+msgid "Cmd"
 msgstr ""
 
-#: keyboard.cc:93
-msgid "Meta"
+#: keyboard.cc:76 keyboard.cc:98
+msgid "Ctrl"
 msgstr ""
 
-#: keyboard.cc:144 keyboard.cc:540
-msgid "Unknown"
+#: keyboard.cc:78
+msgid "Opt"
 msgstr ""
 
-#: keyboard.cc:551
-msgid "key bindings file not found at \"%2\" or contains errors."
+#: keyboard.cc:94 keyboard.cc:99
+msgid "Alt"
 msgstr ""
 
-#: keyboard.cc:602
-msgid "Cannot rename your own keybinding file (%1)"
+#: keyboard.cc:96
+msgid "Windows"
+msgstr ""
+
+#: keyboard.cc:101
+msgid "Win"
+msgstr ""
+
+#: keyboard.cc:152 keyboard.cc:685
+msgid "Unknown"
 msgstr ""
 
-#: motionfeedback.cc:486
-msgid "motionfeedback: failed to open a temporary file for writing: %1"
+#: keyboard.cc:696
+msgid "key bindings file not found at \"%2\" or contains errors."
 msgstr ""
 
-#: motionfeedback.cc:516
-msgid "motionfeedback: could not save image set to %1"
+#: keyboard.cc:722
+msgid "Keyboard binding found without a name"
 msgstr ""
 
-#: motionfeedback.cc:526
-msgid "motionfeedback: caught PixbufError: %1"
+#: keyboard.cc:752
+msgid "Cannot save key bindings to %1"
 msgstr ""
 
-#: motionfeedback.cc:528
-msgid "motionfeedback: unknown exception"
+#: keyboard.cc:768
+msgid "Cannot rename your own keybinding file (%1)"
 msgstr ""
 
 #: paths_dialog.cc:32
@@ -135,6 +139,6 @@ msgstr ""
 msgid "Click to put this back in the main window"
 msgstr ""
 
-#: textviewer.cc:34
+#: textviewer.cc:32
 msgid "Close"
 msgstr "Κλείσιμο"
diff --git a/libs/gtkmm2ext/po/es.mo b/libs/gtkmm2ext/po/es.mo
new file mode 100644
index 0000000..88947ef
Binary files /dev/null and b/libs/gtkmm2ext/po/es.mo differ
diff --git a/libs/gtkmm2ext/po/es.po b/libs/gtkmm2ext/po/es.po
index b844851..f2bdffa 100644
--- a/libs/gtkmm2ext/po/es.po
+++ b/libs/gtkmm2ext/po/es.po
@@ -6,20 +6,16 @@ msgid ""
 msgstr ""
 "Project-Id-Version: gtkmm2ext\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-03-31 20:13-0400\n"
+"POT-Creation-Date: 2016-07-13 18:09-0400\n"
 "PO-Revision-Date: 2013-02-09 16:21+0100\n"
 "Last-Translator: Pablo Fernández <pablo.fbus at gmail.com>\n"
 "Language-Team: Spanish\n"
-"Language: \n"
+"Language: Spanish\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=ISO-8859-1\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: actions.cc:336
-msgid "programming error: %1"
-msgstr ""
-
-#: actions.cc:511
+#: actions.cc:261
 msgid "Unknown action name: %1"
 msgstr ""
 
@@ -39,11 +35,11 @@ msgstr ""
 msgid "ABCDEFGHIJLKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
 msgstr ""
 
-#: gtk_ui.cc:113
+#: gtk_ui.cc:119
 msgid "Log"
 msgstr "Log"
 
-#: gtk_ui.cc:370
+#: gtk_ui.cc:388
 msgid ""
 "\n"
 "\n"
@@ -53,66 +49,74 @@ msgstr ""
 "\n"
 "Atajo: "
 
-#: gtk_ui.cc:638
+#: gtk_ui.cc:688
 msgid "Press To Exit"
 msgstr "Pulse para salir"
 
-#: gtk_ui.cc:674
+#: gtk_ui.cc:724
 msgid "I'm sorry %1, I can't do that"
 msgstr "Lo siento %1, no puedo hacer eso"
 
-#: keyboard.cc:73
+#: keyboard.cc:70
 msgid "Command"
 msgstr ""
 
-#: keyboard.cc:74 keyboard.cc:77 keyboard.cc:90 keyboard.cc:94
+#: keyboard.cc:71 keyboard.cc:93
 msgid "Control"
 msgstr ""
 
-#: keyboard.cc:75 keyboard.cc:78 keyboard.cc:92 keyboard.cc:95
+#: keyboard.cc:72 keyboard.cc:77 keyboard.cc:95 keyboard.cc:100
 msgid "Key|Shift"
 msgstr ""
 
-#: keyboard.cc:76
+#: keyboard.cc:73
 msgid "Option"
 msgstr "Opción"
 
-#: keyboard.cc:91
+#: keyboard.cc:75
+msgid "Cmd"
+msgstr ""
+
+#: keyboard.cc:76 keyboard.cc:98
+msgid "Ctrl"
+msgstr ""
+
+#: keyboard.cc:78
+msgid "Opt"
+msgstr ""
+
+#: keyboard.cc:94 keyboard.cc:99
 msgid "Alt"
 msgstr ""
 
-#: keyboard.cc:93
-msgid "Meta"
+#: keyboard.cc:96
+msgid "Windows"
+msgstr ""
+
+#: keyboard.cc:101
+msgid "Win"
 msgstr ""
 
-#: keyboard.cc:144 keyboard.cc:540
+#: keyboard.cc:152 keyboard.cc:685
 msgid "Unknown"
 msgstr ""
 
-#: keyboard.cc:551
+#: keyboard.cc:696
 msgid "key bindings file not found at \"%2\" or contains errors."
 msgstr ""
 "El archivo de combinaciones de teclado no se encontró en \"%2\" o contiene "
 "errores."
 
-#: keyboard.cc:602
-msgid "Cannot rename your own keybinding file (%1)"
+#: keyboard.cc:722
+msgid "Keyboard binding found without a name"
 msgstr ""
 
-#: motionfeedback.cc:486
-msgid "motionfeedback: failed to open a temporary file for writing: %1"
+#: keyboard.cc:752
+msgid "Cannot save key bindings to %1"
 msgstr ""
 
-#: motionfeedback.cc:516
-msgid "motionfeedback: could not save image set to %1"
-msgstr ""
-
-#: motionfeedback.cc:526
-msgid "motionfeedback: caught PixbufError: %1"
-msgstr ""
-
-#: motionfeedback.cc:528
-msgid "motionfeedback: unknown exception"
+#: keyboard.cc:768
+msgid "Cannot rename your own keybinding file (%1)"
 msgstr ""
 
 #: paths_dialog.cc:32
@@ -139,6 +143,6 @@ msgstr "Pulsa para tener esto en su propia ventana"
 msgid "Click to put this back in the main window"
 msgstr "Pulsa para llevarlo a la ventana principal"
 
-#: textviewer.cc:34
+#: textviewer.cc:32
 msgid "Close"
 msgstr "Cerrar"
diff --git a/libs/gtkmm2ext/po/fr.mo b/libs/gtkmm2ext/po/fr.mo
new file mode 100644
index 0000000..c7d2d16
Binary files /dev/null and b/libs/gtkmm2ext/po/fr.mo differ
diff --git a/libs/gtkmm2ext/po/fr.po b/libs/gtkmm2ext/po/fr.po
index 0c1553e..49db41a 100644
--- a/libs/gtkmm2ext/po/fr.po
+++ b/libs/gtkmm2ext/po/fr.po
@@ -5,7 +5,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: gtkmm2ext\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-03-28 20:55+0100\n"
+"POT-Creation-Date: 2016-07-13 18:09-0400\n"
 "PO-Revision-Date: 2015-03-28 20:57+0100\n"
 "Last-Translator: Raphaël Doursenaud <rdoursenaud at free.fr>\n"
 "Language-Team: \n"
@@ -18,12 +18,7 @@ msgstr ""
 "X-Poedit-SourceCharset: UTF-8\n"
 "X-Poedit-Basepath: ../\n"
 
-#: actions.cc:336
-#, fuzzy
-msgid "programming error: %1"
-msgstr "erreur de programmation : %1"
-
-#: actions.cc:511
+#: actions.cc:261
 msgid "Unknown action name: %1"
 msgstr "Nom d'action inconnu : %1"
 
@@ -43,11 +38,11 @@ msgstr ""
 msgid "ABCDEFGHIJLKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
 msgstr "ABCDEFGHIJLKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
 
-#: gtk_ui.cc:113
+#: gtk_ui.cc:119
 msgid "Log"
 msgstr "Journal"
 
-#: gtk_ui.cc:370
+#: gtk_ui.cc:388
 msgid ""
 "\n"
 "\n"
@@ -57,72 +52,75 @@ msgstr ""
 "\n"
 "Raccourci : "
 
-#: gtk_ui.cc:638
+#: gtk_ui.cc:688
 msgid "Press To Exit"
 msgstr "Appuyer pour quitter"
 
-#: gtk_ui.cc:674
+#: gtk_ui.cc:724
 msgid "I'm sorry %1, I can't do that"
 msgstr "Je suis désolé %1, je ne peux pas faire ça"
 
-#: keyboard.cc:73
+#: keyboard.cc:70
 msgid "Command"
 msgstr "Commande"
 
-#: keyboard.cc:74 keyboard.cc:77 keyboard.cc:90 keyboard.cc:94
+#: keyboard.cc:71 keyboard.cc:93
 msgid "Control"
 msgstr "Ctrl"
 
-#: keyboard.cc:75 keyboard.cc:78 keyboard.cc:92 keyboard.cc:95
+#: keyboard.cc:72 keyboard.cc:77 keyboard.cc:95 keyboard.cc:100
 msgid "Key|Shift"
 msgstr "Maj."
 
-#: keyboard.cc:76
+#: keyboard.cc:73
 msgid "Option"
 msgstr "Option"
 
-#: keyboard.cc:91
+#: keyboard.cc:75
+msgid "Cmd"
+msgstr ""
+
+#: keyboard.cc:76 keyboard.cc:98
+msgid "Ctrl"
+msgstr ""
+
+#: keyboard.cc:78
+msgid "Opt"
+msgstr ""
+
+#: keyboard.cc:94 keyboard.cc:99
 msgid "Alt"
 msgstr "Alt"
 
-#: keyboard.cc:93
-msgid "Meta"
-msgstr "Meta"
+#: keyboard.cc:96
+msgid "Windows"
+msgstr ""
 
-#: keyboard.cc:144 keyboard.cc:540
+#: keyboard.cc:101
+msgid "Win"
+msgstr ""
+
+#: keyboard.cc:152 keyboard.cc:685
 msgid "Unknown"
 msgstr "Inconnu"
 
-#: keyboard.cc:551
+#: keyboard.cc:696
 msgid "key bindings file not found at \"%2\" or contains errors."
 msgstr ""
 "fichier de raccourcis claviers contient des erreurs ou introuvable dans "
 "« %2 »."
 
-#: keyboard.cc:602
-msgid "Cannot rename your own keybinding file (%1)"
-msgstr "Impossible de renommer votre propre fichier de raccourcis clavier (%1)"
-
-#: motionfeedback.cc:486
-msgid "motionfeedback: failed to open a temporary file for writing: %1"
+#: keyboard.cc:722
+msgid "Keyboard binding found without a name"
 msgstr ""
-"rétroaction de mouvement : impossible d'ouvrir un fichier temporaire en "
-"écriture : %1"
 
-# Or is it "image set"?
-#: motionfeedback.cc:516
-#, fuzzy
-msgid "motionfeedback: could not save image set to %1"
+#: keyboard.cc:752
+msgid "Cannot save key bindings to %1"
 msgstr ""
-"rétroaction de mouvement : impossible de sauvegarder l'image réglée à %1"
-
-#: motionfeedback.cc:526
-msgid "motionfeedback: caught PixbufError: %1"
-msgstr "rétroaction de mouvement : PixbufError attrapée : %1"
 
-#: motionfeedback.cc:528
-msgid "motionfeedback: unknown exception"
-msgstr "rétroaction de mouvement : exception inconnue"
+#: keyboard.cc:768
+msgid "Cannot rename your own keybinding file (%1)"
+msgstr "Impossible de renommer votre propre fichier de raccourcis clavier (%1)"
 
 #: paths_dialog.cc:32
 msgid "Add"
@@ -148,6 +146,30 @@ msgstr "Cliquez pour afficher dans une fenêtre séparée"
 msgid "Click to put this back in the main window"
 msgstr "Cliquez pour remettre dans la fenêtre principale"
 
-#: textviewer.cc:34
+#: textviewer.cc:32
 msgid "Close"
 msgstr "Fermer"
+
+#, fuzzy
+#~ msgid "programming error: %1"
+#~ msgstr "erreur de programmation : %1"
+
+#~ msgid "Meta"
+#~ msgstr "Meta"
+
+#~ msgid "motionfeedback: failed to open a temporary file for writing: %1"
+#~ msgstr ""
+#~ "rétroaction de mouvement : impossible d'ouvrir un fichier temporaire en "
+#~ "écriture : %1"
+
+# Or is it "image set"?
+#, fuzzy
+#~ msgid "motionfeedback: could not save image set to %1"
+#~ msgstr ""
+#~ "rétroaction de mouvement : impossible de sauvegarder l'image réglée à %1"
+
+#~ msgid "motionfeedback: caught PixbufError: %1"
+#~ msgstr "rétroaction de mouvement : PixbufError attrapée : %1"
+
+#~ msgid "motionfeedback: unknown exception"
+#~ msgstr "rétroaction de mouvement : exception inconnue"
diff --git a/libs/gtkmm2ext/po/nn.mo b/libs/gtkmm2ext/po/nn.mo
new file mode 100644
index 0000000..33ab9ee
Binary files /dev/null and b/libs/gtkmm2ext/po/nn.mo differ
diff --git a/libs/gtkmm2ext/po/nn.po b/libs/gtkmm2ext/po/nn.po
index e33cfbc..d02bf23 100644
--- a/libs/gtkmm2ext/po/nn.po
+++ b/libs/gtkmm2ext/po/nn.po
@@ -8,11 +8,11 @@ msgid ""
 msgstr ""
 "Project-Id-Version: libardour\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-03-31 20:13-0400\n"
+"POT-Creation-Date: 2016-07-13 18:09-0400\n"
 "PO-Revision-Date: 2013-01-01 20:30+0100\n"
 "Last-Translator: Eivind Ødegård <meinmycell-lists at yahoo.no>\n"
 "Language-Team: Nynorsk <i18n-nn at lister.ping.uio.no>\n"
-"Language: \n"
+"Language: Norwegian Nynorsk\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
@@ -20,11 +20,7 @@ msgstr ""
 "X-Poedit-Country: NORWAY\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: actions.cc:336
-msgid "programming error: %1"
-msgstr ""
-
-#: actions.cc:511
+#: actions.cc:261
 msgid "Unknown action name: %1"
 msgstr ""
 
@@ -44,75 +40,83 @@ msgstr ""
 msgid "ABCDEFGHIJLKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
 msgstr ""
 
-#: gtk_ui.cc:113
+#: gtk_ui.cc:119
 msgid "Log"
 msgstr ""
 
-#: gtk_ui.cc:370
+#: gtk_ui.cc:388
 msgid ""
 "\n"
 "\n"
 "Shortcut: "
 msgstr ""
 
-#: gtk_ui.cc:638
+#: gtk_ui.cc:688
 msgid "Press To Exit"
 msgstr ""
 
-#: gtk_ui.cc:674
+#: gtk_ui.cc:724
 msgid "I'm sorry %1, I can't do that"
 msgstr ""
 
-#: keyboard.cc:73
+#: keyboard.cc:70
 msgid "Command"
 msgstr ""
 
-#: keyboard.cc:74 keyboard.cc:77 keyboard.cc:90 keyboard.cc:94
+#: keyboard.cc:71 keyboard.cc:93
 msgid "Control"
 msgstr ""
 
-#: keyboard.cc:75 keyboard.cc:78 keyboard.cc:92 keyboard.cc:95
+#: keyboard.cc:72 keyboard.cc:77 keyboard.cc:95 keyboard.cc:100
 msgid "Key|Shift"
 msgstr ""
 
-#: keyboard.cc:76
+#: keyboard.cc:73
 msgid "Option"
 msgstr ""
 
-#: keyboard.cc:91
-msgid "Alt"
+#: keyboard.cc:75
+msgid "Cmd"
 msgstr ""
 
-#: keyboard.cc:93
-msgid "Meta"
+#: keyboard.cc:76 keyboard.cc:98
+msgid "Ctrl"
 msgstr ""
 
-#: keyboard.cc:144 keyboard.cc:540
-msgid "Unknown"
-msgstr "Ukjend"
+#: keyboard.cc:78
+msgid "Opt"
+msgstr ""
 
-#: keyboard.cc:551
-msgid "key bindings file not found at \"%2\" or contains errors."
+#: keyboard.cc:94 keyboard.cc:99
+msgid "Alt"
 msgstr ""
 
-#: keyboard.cc:602
-msgid "Cannot rename your own keybinding file (%1)"
+#: keyboard.cc:96
+msgid "Windows"
 msgstr ""
 
-#: motionfeedback.cc:486
-msgid "motionfeedback: failed to open a temporary file for writing: %1"
+#: keyboard.cc:101
+msgid "Win"
 msgstr ""
 
-#: motionfeedback.cc:516
-msgid "motionfeedback: could not save image set to %1"
+#: keyboard.cc:152 keyboard.cc:685
+msgid "Unknown"
+msgstr "Ukjend"
+
+#: keyboard.cc:696
+msgid "key bindings file not found at \"%2\" or contains errors."
+msgstr ""
+
+#: keyboard.cc:722
+msgid "Keyboard binding found without a name"
 msgstr ""
 
-#: motionfeedback.cc:526
-msgid "motionfeedback: caught PixbufError: %1"
+#: keyboard.cc:752
+msgid "Cannot save key bindings to %1"
 msgstr ""
 
-#: motionfeedback.cc:528
-msgid "motionfeedback: unknown exception"
+#: keyboard.cc:768
+msgid "Cannot rename your own keybinding file (%1)"
 msgstr ""
 
 #: paths_dialog.cc:32
@@ -139,6 +143,6 @@ msgstr ""
 msgid "Click to put this back in the main window"
 msgstr ""
 
-#: textviewer.cc:34
+#: textviewer.cc:32
 msgid "Close"
 msgstr ""
diff --git a/libs/gtkmm2ext/po/pl.mo b/libs/gtkmm2ext/po/pl.mo
new file mode 100644
index 0000000..de5359e
Binary files /dev/null and b/libs/gtkmm2ext/po/pl.mo differ
diff --git a/libs/gtkmm2ext/po/pl.po b/libs/gtkmm2ext/po/pl.po
index 1905a49..ada719f 100644
--- a/libs/gtkmm2ext/po/pl.po
+++ b/libs/gtkmm2ext/po/pl.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: libgtkmm2ext\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-03-31 20:13-0400\n"
+"POT-Creation-Date: 2016-07-13 18:09-0400\n"
 "PO-Revision-Date: 2008-04-10 10:54+0100\n"
 "Last-Translator: Piotr Zaryk <pzaryk at gmail.com>\n"
 "Language-Team: Polish <pl at li.org>\n"
@@ -16,11 +16,7 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: actions.cc:336
-msgid "programming error: %1"
-msgstr ""
-
-#: actions.cc:511
+#: actions.cc:261
 msgid "Unknown action name: %1"
 msgstr ""
 
@@ -40,75 +36,83 @@ msgstr ""
 msgid "ABCDEFGHIJLKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
 msgstr ""
 
-#: gtk_ui.cc:113
+#: gtk_ui.cc:119
 msgid "Log"
 msgstr "Log"
 
-#: gtk_ui.cc:370
+#: gtk_ui.cc:388
 msgid ""
 "\n"
 "\n"
 "Shortcut: "
 msgstr ""
 
-#: gtk_ui.cc:638
+#: gtk_ui.cc:688
 msgid "Press To Exit"
 msgstr "Wciśnij by zakończyć"
 
-#: gtk_ui.cc:674
+#: gtk_ui.cc:724
 msgid "I'm sorry %1, I can't do that"
 msgstr ""
 
-#: keyboard.cc:73
+#: keyboard.cc:70
 msgid "Command"
 msgstr ""
 
-#: keyboard.cc:74 keyboard.cc:77 keyboard.cc:90 keyboard.cc:94
+#: keyboard.cc:71 keyboard.cc:93
 msgid "Control"
 msgstr ""
 
-#: keyboard.cc:75 keyboard.cc:78 keyboard.cc:92 keyboard.cc:95
+#: keyboard.cc:72 keyboard.cc:77 keyboard.cc:95 keyboard.cc:100
 msgid "Key|Shift"
 msgstr ""
 
-#: keyboard.cc:76
+#: keyboard.cc:73
 msgid "Option"
 msgstr ""
 
-#: keyboard.cc:91
-msgid "Alt"
+#: keyboard.cc:75
+msgid "Cmd"
 msgstr ""
 
-#: keyboard.cc:93
-msgid "Meta"
+#: keyboard.cc:76 keyboard.cc:98
+msgid "Ctrl"
 msgstr ""
 
-#: keyboard.cc:144 keyboard.cc:540
-msgid "Unknown"
+#: keyboard.cc:78
+msgid "Opt"
 msgstr ""
 
-#: keyboard.cc:551
-msgid "key bindings file not found at \"%2\" or contains errors."
+#: keyboard.cc:94 keyboard.cc:99
+msgid "Alt"
 msgstr ""
 
-#: keyboard.cc:602
-msgid "Cannot rename your own keybinding file (%1)"
+#: keyboard.cc:96
+msgid "Windows"
+msgstr ""
+
+#: keyboard.cc:101
+msgid "Win"
+msgstr ""
+
+#: keyboard.cc:152 keyboard.cc:685
+msgid "Unknown"
 msgstr ""
 
-#: motionfeedback.cc:486
-msgid "motionfeedback: failed to open a temporary file for writing: %1"
+#: keyboard.cc:696
+msgid "key bindings file not found at \"%2\" or contains errors."
 msgstr ""
 
-#: motionfeedback.cc:516
-msgid "motionfeedback: could not save image set to %1"
+#: keyboard.cc:722
+msgid "Keyboard binding found without a name"
 msgstr ""
 
-#: motionfeedback.cc:526
-msgid "motionfeedback: caught PixbufError: %1"
+#: keyboard.cc:752
+msgid "Cannot save key bindings to %1"
 msgstr ""
 
-#: motionfeedback.cc:528
-msgid "motionfeedback: unknown exception"
+#: keyboard.cc:768
+msgid "Cannot rename your own keybinding file (%1)"
 msgstr ""
 
 #: paths_dialog.cc:32
@@ -135,6 +139,6 @@ msgstr ""
 msgid "Click to put this back in the main window"
 msgstr ""
 
-#: textviewer.cc:34
+#: textviewer.cc:32
 msgid "Close"
 msgstr "Zamknij"
diff --git a/libs/gtkmm2ext/po/pt.mo b/libs/gtkmm2ext/po/pt.mo
new file mode 100644
index 0000000..5c966c8
Binary files /dev/null and b/libs/gtkmm2ext/po/pt.mo differ
diff --git a/libs/gtkmm2ext/po/pt.po b/libs/gtkmm2ext/po/pt.po
index 4761f05..d79566a 100644
--- a/libs/gtkmm2ext/po/pt.po
+++ b/libs/gtkmm2ext/po/pt.po
@@ -7,20 +7,16 @@ msgid ""
 msgstr ""
 "Project-Id-Version: gtkmm2ext\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-03-31 20:13-0400\n"
+"POT-Creation-Date: 2016-07-13 18:09-0400\n"
 "PO-Revision-Date: 2004-05-17 20:36+0200\n"
 "Last-Translator: Chris Ross <chris.ross at tebibyte.org>\n"
 "Language-Team: Portuguese\n"
-"Language: \n"
+"Language: Portugese\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=ISO-8859-15\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: actions.cc:336
-msgid "programming error: %1"
-msgstr ""
-
-#: actions.cc:511
+#: actions.cc:261
 msgid "Unknown action name: %1"
 msgstr ""
 
@@ -40,75 +36,83 @@ msgstr ""
 msgid "ABCDEFGHIJLKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
 msgstr ""
 
-#: gtk_ui.cc:113
+#: gtk_ui.cc:119
 msgid "Log"
 msgstr ""
 
-#: gtk_ui.cc:370
+#: gtk_ui.cc:388
 msgid ""
 "\n"
 "\n"
 "Shortcut: "
 msgstr ""
 
-#: gtk_ui.cc:638
+#: gtk_ui.cc:688
 msgid "Press To Exit"
 msgstr ""
 
-#: gtk_ui.cc:674
+#: gtk_ui.cc:724
 msgid "I'm sorry %1, I can't do that"
 msgstr ""
 
-#: keyboard.cc:73
+#: keyboard.cc:70
 msgid "Command"
 msgstr ""
 
-#: keyboard.cc:74 keyboard.cc:77 keyboard.cc:90 keyboard.cc:94
+#: keyboard.cc:71 keyboard.cc:93
 msgid "Control"
 msgstr ""
 
-#: keyboard.cc:75 keyboard.cc:78 keyboard.cc:92 keyboard.cc:95
+#: keyboard.cc:72 keyboard.cc:77 keyboard.cc:95 keyboard.cc:100
 msgid "Key|Shift"
 msgstr ""
 
-#: keyboard.cc:76
+#: keyboard.cc:73
 msgid "Option"
 msgstr ""
 
-#: keyboard.cc:91
-msgid "Alt"
+#: keyboard.cc:75
+msgid "Cmd"
 msgstr ""
 
-#: keyboard.cc:93
-msgid "Meta"
+#: keyboard.cc:76 keyboard.cc:98
+msgid "Ctrl"
 msgstr ""
 
-#: keyboard.cc:144 keyboard.cc:540
-msgid "Unknown"
+#: keyboard.cc:78
+msgid "Opt"
 msgstr ""
 
-#: keyboard.cc:551
-msgid "key bindings file not found at \"%2\" or contains errors."
+#: keyboard.cc:94 keyboard.cc:99
+msgid "Alt"
 msgstr ""
 
-#: keyboard.cc:602
-msgid "Cannot rename your own keybinding file (%1)"
+#: keyboard.cc:96
+msgid "Windows"
+msgstr ""
+
+#: keyboard.cc:101
+msgid "Win"
+msgstr ""
+
+#: keyboard.cc:152 keyboard.cc:685
+msgid "Unknown"
 msgstr ""
 
-#: motionfeedback.cc:486
-msgid "motionfeedback: failed to open a temporary file for writing: %1"
+#: keyboard.cc:696
+msgid "key bindings file not found at \"%2\" or contains errors."
 msgstr ""
 
-#: motionfeedback.cc:516
-msgid "motionfeedback: could not save image set to %1"
+#: keyboard.cc:722
+msgid "Keyboard binding found without a name"
 msgstr ""
 
-#: motionfeedback.cc:526
-msgid "motionfeedback: caught PixbufError: %1"
+#: keyboard.cc:752
+msgid "Cannot save key bindings to %1"
 msgstr ""
 
-#: motionfeedback.cc:528
-msgid "motionfeedback: unknown exception"
+#: keyboard.cc:768
+msgid "Cannot rename your own keybinding file (%1)"
 msgstr ""
 
 #: paths_dialog.cc:32
@@ -135,6 +139,6 @@ msgstr ""
 msgid "Click to put this back in the main window"
 msgstr ""
 
-#: textviewer.cc:34
+#: textviewer.cc:32
 msgid "Close"
 msgstr "Fechar"
diff --git a/libs/gtkmm2ext/po/ru.mo b/libs/gtkmm2ext/po/ru.mo
new file mode 100644
index 0000000..681e373
Binary files /dev/null and b/libs/gtkmm2ext/po/ru.mo differ
diff --git a/libs/gtkmm2ext/po/ru.po b/libs/gtkmm2ext/po/ru.po
index b89d478..e4c5a7b 100644
--- a/libs/gtkmm2ext/po/ru.po
+++ b/libs/gtkmm2ext/po/ru.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: gtkmm2ext\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-03-23 23:09+0300\n"
+"POT-Creation-Date: 2016-07-13 18:09-0400\n"
 "PO-Revision-Date: 2014-10-10 23:22+0300\n"
 "Last-Translator: Александр Кольцов <ag1455 at mail.ru>\n"
 "Language-Team: русский <ru>\n"
@@ -20,11 +20,7 @@ msgstr ""
 "%100>=20) ? 1 : 2);\n"
 "X-Generator: Poedit 1.5.4\n"
 
-#: actions.cc:336
-msgid "programming error: %1"
-msgstr "программная ошибка: %1"
-
-#: actions.cc:511
+#: actions.cc:261
 msgid "Unknown action name: %1"
 msgstr "Неизвестное название действия: %1"
 
@@ -44,11 +40,11 @@ msgstr "Информационный файл курсора горячих то
 msgid "ABCDEFGHIJLKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
 msgstr ""
 
-#: gtk_ui.cc:113
+#: gtk_ui.cc:119
 msgid "Log"
 msgstr "Журнал"
 
-#: gtk_ui.cc:370
+#: gtk_ui.cc:388
 msgid ""
 "\n"
 "\n"
@@ -58,65 +54,73 @@ msgstr ""
 "\n"
 "Комбинация клавиш: "
 
-#: gtk_ui.cc:638
+#: gtk_ui.cc:688
 msgid "Press To Exit"
 msgstr "Нажмите для выхода"
 
-#: gtk_ui.cc:674
+#: gtk_ui.cc:724
 msgid "I'm sorry %1, I can't do that"
 msgstr "Простите, %1, я не могу этого сделать"
 
-#: keyboard.cc:73
+#: keyboard.cc:70
 msgid "Command"
 msgstr "Команда"
 
-#: keyboard.cc:74 keyboard.cc:77 keyboard.cc:90 keyboard.cc:94
+#: keyboard.cc:71 keyboard.cc:93
 msgid "Control"
 msgstr "Ctrl"
 
-#: keyboard.cc:75 keyboard.cc:78 keyboard.cc:92 keyboard.cc:95
+#: keyboard.cc:72 keyboard.cc:77 keyboard.cc:95 keyboard.cc:100
 msgid "Key|Shift"
 msgstr "Shift"
 
-#: keyboard.cc:76
+#: keyboard.cc:73
 msgid "Option"
 msgstr "Опции"
 
-#: keyboard.cc:91
+#: keyboard.cc:75
+msgid "Cmd"
+msgstr ""
+
+#: keyboard.cc:76 keyboard.cc:98
+msgid "Ctrl"
+msgstr ""
+
+#: keyboard.cc:78
+msgid "Opt"
+msgstr ""
+
+#: keyboard.cc:94 keyboard.cc:99
 msgid "Alt"
 msgstr "Alt"
 
-#: keyboard.cc:93
-msgid "Meta"
-msgstr "Meta"
+#: keyboard.cc:96
+msgid "Windows"
+msgstr ""
+
+#: keyboard.cc:101
+msgid "Win"
+msgstr ""
 
-#: keyboard.cc:144 keyboard.cc:540
+#: keyboard.cc:152 keyboard.cc:685
 msgid "Unknown"
 msgstr "Неизвестно"
 
-#: keyboard.cc:551
+#: keyboard.cc:696
 msgid "key bindings file not found at \"%2\" or contains errors."
 msgstr "Файл привязки клавиш не найден в \"% 2 \" или содержит ошибки."
 
-#: keyboard.cc:602
-msgid "Cannot rename your own keybinding file (%1)"
-msgstr "Невозможно переименовать ваш ​​файл биндинга клавиш (%1)"
-
-#: motionfeedback.cc:486
-msgid "motionfeedback: failed to open a temporary file for writing: %1"
-msgstr "motionfeedback: не удалось открыть временный файл для записи: %1"
-
-#: motionfeedback.cc:516
-msgid "motionfeedback: could not save image set to %1"
-msgstr "motionfeedback: невозможно сохранить установки изображения в %1"
+#: keyboard.cc:722
+msgid "Keyboard binding found without a name"
+msgstr ""
 
-#: motionfeedback.cc:526
-msgid "motionfeedback: caught PixbufError: %1"
-msgstr "motionfeedback: PixbufError поймал: %1"
+#: keyboard.cc:752
+msgid "Cannot save key bindings to %1"
+msgstr ""
 
-#: motionfeedback.cc:528
-msgid "motionfeedback: unknown exception"
-msgstr "motionfeedback: неизвестное исключение"
+#: keyboard.cc:768
+msgid "Cannot rename your own keybinding file (%1)"
+msgstr "Невозможно переименовать ваш ​​файл биндинга клавиш (%1)"
 
 #: paths_dialog.cc:32
 msgid "Add"
@@ -142,6 +146,24 @@ msgstr "Щёлкните, чтобы превратить эту панель и
 msgid "Click to put this back in the main window"
 msgstr "Щёлкните, чтобы превратить это плавающее окно в панель инструментов"
 
-#: textviewer.cc:34
+#: textviewer.cc:32
 msgid "Close"
 msgstr "Закрыть"
+
+#~ msgid "programming error: %1"
+#~ msgstr "программная ошибка: %1"
+
+#~ msgid "Meta"
+#~ msgstr "Meta"
+
+#~ msgid "motionfeedback: failed to open a temporary file for writing: %1"
+#~ msgstr "motionfeedback: не удалось открыть временный файл для записи: %1"
+
+#~ msgid "motionfeedback: could not save image set to %1"
+#~ msgstr "motionfeedback: невозможно сохранить установки изображения в %1"
+
+#~ msgid "motionfeedback: caught PixbufError: %1"
+#~ msgstr "motionfeedback: PixbufError поймал: %1"
+
+#~ msgid "motionfeedback: unknown exception"
+#~ msgstr "motionfeedback: неизвестное исключение"
diff --git a/libs/gtkmm2ext/po/zh.mo b/libs/gtkmm2ext/po/zh.mo
new file mode 100644
index 0000000..81de1f1
Binary files /dev/null and b/libs/gtkmm2ext/po/zh.mo differ
diff --git a/libs/gtkmm2ext/po/zh.po b/libs/gtkmm2ext/po/zh.po
new file mode 100644
index 0000000..c86bfcb
--- /dev/null
+++ b/libs/gtkmm2ext/po/zh.po
@@ -0,0 +1,160 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR "Paul Davis"
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, YEAR.
+# 一善鱼 <YQ-YSY at 163.com> 翻译于 2016-03-27
+msgid ""
+msgstr ""
+"Project-Id-Version: Ardour 4\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2016-07-13 18:09-0400\n"
+"PO-Revision-Date: 2016-03-27 10:27+0800\n"
+"Last-Translator: 一善鱼 <YQ-YSY at 163.com>\n"
+"Language-Team: 一善鱼 YQ-YSY at 163.com\n"
+"Language: zh\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.8.4\n"
+
+#: actions.cc:261
+msgid "Unknown action name: %1"
+msgstr "未知的动作名称:%1"
+
+#: binding_proxy.cc:81
+msgid "operate controller now"
+msgstr "操作控制器现状"
+
+#: bindable_button.cc:48
+msgid "button cannot watch state of non-existing Controllable\n"
+msgstr "按钮无法观察非存在的可控状态\n"
+
+#: cursors.cc:82
+msgid "cursor hotspots info file %1 has an error on line %2"
+msgstr "游标热点信息文件 %1 在线路 %2 上有一个错误"
+
+#: emscale.cc:52
+msgid "ABCDEFGHIJLKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
+msgstr ""
+
+#: gtk_ui.cc:119
+msgid "Log"
+msgstr "日志"
+
+#: gtk_ui.cc:388
+msgid ""
+"\n"
+"\n"
+"Shortcut: "
+msgstr ""
+"\n"
+"\n"
+"快捷键:"
+
+#: gtk_ui.cc:688
+msgid "Press To Exit"
+msgstr "按下退出"
+
+#: gtk_ui.cc:724
+msgid "I'm sorry %1, I can't do that"
+msgstr "对不起 %1,我不能那样做"
+
+#: keyboard.cc:70
+msgid "Command"
+msgstr "命令"
+
+#: keyboard.cc:71 keyboard.cc:93
+msgid "Control"
+msgstr ""
+
+#: keyboard.cc:72 keyboard.cc:77 keyboard.cc:95 keyboard.cc:100
+msgid "Key|Shift"
+msgstr "é”®|Shift"
+
+#: keyboard.cc:73
+msgid "Option"
+msgstr "选项"
+
+#: keyboard.cc:75
+msgid "Cmd"
+msgstr ""
+
+#: keyboard.cc:76 keyboard.cc:98
+msgid "Ctrl"
+msgstr ""
+
+#: keyboard.cc:78
+msgid "Opt"
+msgstr ""
+
+#: keyboard.cc:94 keyboard.cc:99
+msgid "Alt"
+msgstr ""
+
+#: keyboard.cc:96
+msgid "Windows"
+msgstr ""
+
+#: keyboard.cc:101
+msgid "Win"
+msgstr ""
+
+#: keyboard.cc:152 keyboard.cc:685
+msgid "Unknown"
+msgstr "未知"
+
+#: keyboard.cc:696
+msgid "key bindings file not found at \"%2\" or contains errors."
+msgstr "在 \"%2\" 找不到按键绑定文件或者包含有错误。"
+
+#: keyboard.cc:722
+msgid "Keyboard binding found without a name"
+msgstr "键盘绑定未发现一个名称"
+
+#: keyboard.cc:752
+msgid "Cannot save key bindings to %1"
+msgstr "无法保存按键绑定到 %1"
+
+#: keyboard.cc:768
+msgid "Cannot rename your own keybinding file (%1)"
+msgstr "无法重命名您自己的按键绑定文件(%1)"
+
+#: paths_dialog.cc:32
+msgid "Add"
+msgstr "添加"
+
+#: paths_dialog.cc:33
+msgid "Delete"
+msgstr "删除"
+
+#: paths_dialog.cc:34
+msgid "Reset to Default"
+msgstr "重置为默认"
+
+#: paths_dialog.cc:109
+msgid "Add folder to search path"
+msgstr "添加文件夹到搜索路径"
+
+#: tearoff.cc:57
+msgid "Click to tear this into its own window"
+msgstr "点击可把这个拆解到它自己的窗口中"
+
+#: tearoff.cc:63
+msgid "Click to put this back in the main window"
+msgstr "点击可把这个放回到主窗口中"
+
+#: textviewer.cc:32
+msgid "Close"
+msgstr "关闭"
+
+#~ msgid "motionfeedback: failed to open a temporary file for writing: %1"
+#~ msgstr "运动反馈:打开一个用于写入的模板文件失败:%1"
+
+#~ msgid "motionfeedback: could not save image set to %1"
+#~ msgstr "运动反馈:无法保存图像设置到 %1"
+
+#~ msgid "motionfeedback: caught PixbufError: %1"
+#~ msgstr "运动反馈:捕捉到 Pixbuf 错误:%1"
+
+#~ msgid "motionfeedback: unknown exception"
+#~ msgstr "运动反馈:未知异常"
diff --git a/libs/gtkmm2ext/prompter.cc b/libs/gtkmm2ext/prompter.cc
index 1f5e13b..51628ab 100644
--- a/libs/gtkmm2ext/prompter.cc
+++ b/libs/gtkmm2ext/prompter.cc
@@ -25,7 +25,7 @@
 #include <gtkmm/stock.h>
 #include <gtkmm2ext/prompter.h>
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace Gtkmm2ext;
diff --git a/libs/gtkmm2ext/searchbar.cc b/libs/gtkmm2ext/searchbar.cc
new file mode 100644
index 0000000..6bfb7e0
--- /dev/null
+++ b/libs/gtkmm2ext/searchbar.cc
@@ -0,0 +1,93 @@
+#include "gtkmm2ext/searchbar.h"
+#include "gtkmm2ext/keyboard.h"
+#include <iostream>
+
+namespace Gtkmm2ext {
+
+SearchBar::SearchBar (const std::string& label, bool icon_resets)
+	: placeholder_text (label)
+	, icon_click_resets (icon_resets)
+{
+	set_text (placeholder_text);
+	set_alignment (Gtk::ALIGN_CENTER);
+	signal_key_press_event().connect (sigc::mem_fun (*this, &SearchBar::key_press_event));
+	signal_focus_in_event().connect (sigc::mem_fun (*this, &SearchBar::focus_in_event));
+	signal_focus_out_event().connect (sigc::mem_fun (*this, &SearchBar::focus_out_event));
+	signal_changed().connect (sigc::mem_fun (*this, &SearchBar::search_string_changed));
+	signal_icon_release().connect (sigc::mem_fun (*this, &SearchBar::icon_clicked_event));
+}
+
+bool
+SearchBar::focus_in_event (GdkEventFocus*)
+{
+	if (get_text ().compare (placeholder_text) == 0) {
+		set_text ("");
+	}
+
+	icon = get_icon_pixbuf ();
+	if (icon) {
+		set_icon_from_pixbuf (Glib::RefPtr<Gdk::Pixbuf> ());
+	}
+	return true;
+}
+
+bool
+SearchBar::focus_out_event (GdkEventFocus*)
+{
+	if (get_text ().empty ()) {
+		set_text (placeholder_text);
+	}
+
+	if (icon) {
+		set_icon_from_pixbuf (icon);
+		icon.reset ();
+	}
+
+	search_string_changed ();
+	return false;
+}
+
+bool
+SearchBar::key_press_event (GdkEventKey* ev)
+{
+	switch (ev->keyval) {
+	case GDK_Escape: 
+		set_text (placeholder_text);
+		return true;
+	default:
+		break;
+	}
+
+	return false;
+}
+
+void
+SearchBar::icon_clicked_event (Gtk::EntryIconPosition, const GdkEventButton*)
+{
+	if (icon_click_resets) {
+		reset ();
+	}
+	else {
+		search_string_changed ();
+	}
+}
+
+void
+SearchBar::search_string_changed () const
+{
+	const std::string& text = get_text ();
+	if (text.empty() || text.compare (placeholder_text) == 0) {
+		sig_search_string_updated ("");
+		return;
+	}
+	sig_search_string_updated (text);
+}
+
+void
+SearchBar::reset ()
+{
+	set_text (placeholder_text);
+	search_string_changed ();
+}
+
+}
\ No newline at end of file
diff --git a/libs/gtkmm2ext/slider_controller.cc b/libs/gtkmm2ext/slider_controller.cc
index f0ad19d..9b55efb 100644
--- a/libs/gtkmm2ext/slider_controller.cc
+++ b/libs/gtkmm2ext/slider_controller.cc
@@ -24,7 +24,7 @@
 #include <gtkmm2ext/slider_controller.h>
 #include "pbd/controllable.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace Gtkmm2ext;
 using namespace PBD;
diff --git a/libs/gtkmm2ext/tabbable.cc b/libs/gtkmm2ext/tabbable.cc
new file mode 100644
index 0000000..5e47524
--- /dev/null
+++ b/libs/gtkmm2ext/tabbable.cc
@@ -0,0 +1,384 @@
+/*
+    Copyright (C) 2015 Paul Davis
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#include <gtkmm/action.h>
+#include <gtkmm/notebook.h>
+#include <gtkmm/window.h>
+#include <gtkmm/stock.h>
+
+#include "gtkmm2ext/tabbable.h"
+#include "gtkmm2ext/gtk_ui.h"
+#include "gtkmm2ext/utils.h"
+#include "gtkmm2ext/visibility_tracker.h"
+
+#include "pbd/stacktrace.h"
+
+#include "pbd/i18n.h"
+
+using namespace Gtkmm2ext;
+using namespace Gtk;
+using std::string;
+
+Tabbable::Tabbable (Widget& w, const string& name)
+	: WindowProxy (name)
+	, _contents (w)
+	, _parent_notebook (0)
+	, tab_requested_by_state (true)
+{
+}
+
+Tabbable::~Tabbable ()
+{
+	if (_window) {
+		delete _window;
+		_window = 0;
+	}
+}
+
+void
+Tabbable::add_to_notebook (Notebook& notebook, const string& tab_title)
+{
+	_parent_notebook = ¬ebook;
+
+	if (tab_requested_by_state) {
+		attach ();
+	}
+}
+
+Window*
+Tabbable::use_own_window (bool and_pack_it)
+{
+	Gtk::Window* win = get (true);
+
+	if (and_pack_it) {
+		Gtk::Container* parent = _contents.get_parent();
+		if (parent) {
+			parent->remove (_contents);
+		}
+		_own_notebook.append_page (_contents);
+	}
+
+	return win;
+
+}
+
+bool
+Tabbable::window_visible () const
+{
+	if (!_window) {
+		return false;
+	}
+
+	return _window->is_visible();
+}
+
+Window*
+Tabbable::get (bool create)
+{
+	if (_window) {
+		return _window;
+	}
+
+	if (!create) {
+		return 0;
+	}
+
+	/* From here on, we're creating the window
+	 */
+
+	if ((_window = new Window (WINDOW_TOPLEVEL)) == 0) {
+		return 0;
+	}
+
+	_window->add (_own_notebook);
+	_own_notebook.show ();
+	_own_notebook.set_show_tabs (false);
+
+	_window->signal_map().connect (sigc::mem_fun (*this, &Tabbable::window_mapped));
+	_window->signal_unmap().connect (sigc::mem_fun (*this, &Tabbable::window_unmapped));
+
+	/* do other window-related setup */
+
+	setup ();
+
+	/* window should be ready for derived classes to do something with it */
+
+	return _window;
+}
+
+void
+Tabbable::show_own_window (bool and_pack_it)
+{
+	Gtk::Widget* parent = _contents.get_parent();
+	Gtk::Allocation alloc;
+
+	if (parent) {
+		alloc = parent->get_allocation();
+	}
+
+	(void) use_own_window (and_pack_it);
+
+	if (parent) {
+		_window->set_default_size (alloc.get_width(), alloc.get_height());
+	}
+
+	tab_requested_by_state = false;
+
+	_window->present ();
+}
+
+Gtk::Notebook*
+Tabbable::tab_root_drop ()
+{
+	/* This is called after a drop of a tab onto the root window. Its
+	 * responsibility xois to return the notebook that this Tabbable's
+	 * contents should be packed into before the drop handling is
+	 * completed. It is not responsible for actually taking care of this
+	 * packing.
+	 */
+
+	show_own_window (false);
+	return &_own_notebook;
+}
+
+void
+Tabbable::show_window ()
+{
+	make_visible ();
+
+	if (_window && (current_toplevel() == _window)) {
+		if (!_visible) { /* was hidden, update status */
+			set_pos_and_size ();
+		}
+	}
+}
+
+/** If this Tabbable is currently parented by a tab, ensure that the tab is the
+ * current one. If it is parented by a window, then toggle the visibility of
+ * that window.
+ */
+void
+Tabbable::change_visibility ()
+{
+	if (tabbed()) {
+		_parent_notebook->set_current_page (_parent_notebook->page_num (_contents));
+		return;
+	}
+
+	if (tab_requested_by_state) {
+		/* should be tabbed, but currently isn't parented by a notebook */
+		return;
+	}
+
+	if (_window && (current_toplevel() == _window)) {
+		/* Use WindowProxy method which will rotate then hide */
+		toggle();
+	}
+}
+
+void
+Tabbable::make_visible ()
+{
+	if (_window && (current_toplevel() == _window)) {
+		set_pos ();
+		_window->present ();
+	} else {
+
+		if (!tab_requested_by_state) {
+			show_own_window (true);
+		} else {
+			show_tab ();
+		}
+	}
+}
+
+void
+Tabbable::make_invisible ()
+{
+	if (_window && (current_toplevel() == _window)) {
+		_window->hide ();
+	} else {
+		hide_tab ();
+	}
+}
+
+void
+Tabbable::detach ()
+{
+	show_own_window (true);
+}
+
+void
+Tabbable::attach ()
+{
+	if (!_parent_notebook) {
+		return;
+	}
+
+	if (tabbed()) {
+		/* already tabbed */
+		return;
+	}
+
+
+	if (_window && current_toplevel() == _window) {
+		/* unpack Tabbable from parent, put it back in the main tabbed
+		 * notebook
+		 */
+
+		save_pos_and_size ();
+
+		_contents.get_parent()->remove (_contents);
+
+		/* leave the window around */
+
+		_window->hide ();
+	}
+
+	_parent_notebook->append_page (_contents);
+	_parent_notebook->set_tab_detachable (_contents);
+	_parent_notebook->set_tab_reorderable (_contents);
+	_parent_notebook->set_current_page (_parent_notebook->page_num (_contents));
+
+	/* have to force this on, which is semantically correct, since
+	 * the user has effectively asked for it.
+	 */
+
+	tab_requested_by_state = true;
+	StateChange (*this);
+}
+
+bool
+Tabbable::delete_event_handler (GdkEventAny *ev)
+{
+	_window->hide();
+
+	return true;
+}
+
+bool
+Tabbable::tabbed () const
+{
+	if (_window && (current_toplevel() == _window)) {
+		return false;
+	}
+
+	if (_parent_notebook && (_parent_notebook->page_num (_contents) >= 0)) {
+		return true;
+	}
+
+	return false;
+}
+
+void
+Tabbable::hide_tab ()
+{
+	if (tabbed()) {
+		_parent_notebook->remove_page (_contents);
+		StateChange (*this);
+	}
+}
+
+void
+Tabbable::show_tab ()
+{
+	if (!window_visible() && _parent_notebook) {
+		if (_contents.get_parent() == 0) {
+			tab_requested_by_state = true;
+			add_to_notebook (*_parent_notebook, _tab_title);
+		}
+		_parent_notebook->set_current_page (_parent_notebook->page_num (_contents));
+		current_toplevel()->present ();
+	}
+}
+
+Gtk::Window*
+Tabbable::current_toplevel () const
+{
+	return dynamic_cast<Gtk::Window*> (contents().get_toplevel());
+}
+
+string
+Tabbable::xml_node_name()
+{
+	return WindowProxy::xml_node_name();
+}
+
+bool
+Tabbable::tabbed_by_default() const
+{
+	return tab_requested_by_state;
+}
+
+XMLNode&
+Tabbable::get_state()
+{
+	XMLNode& node (WindowProxy::get_state());
+
+	node.add_property (X_("tabbed"),  tabbed() ? X_("yes") : X_("no"));
+
+	return node;
+}
+
+int
+Tabbable::set_state (const XMLNode& node, int version)
+{
+	int ret;
+
+	if ((ret = WindowProxy::set_state (node, version)) != 0) {
+		return ret;
+	}
+
+	if (_visible) {
+		show_own_window (true);
+	}
+
+	XMLNodeList children = node.children ();
+	XMLNode* window_node = node.child ("Window");
+
+	if (window_node) {
+		XMLProperty const * prop = window_node->property (X_("tabbed"));
+		if (prop) {
+			tab_requested_by_state = PBD::string_is_affirmative (prop->value());
+		}
+	}
+
+	if (!_visible) {
+		if (tab_requested_by_state) {
+			attach ();
+		} else {
+			/* this does nothing if not tabbed */
+			hide_tab ();
+		}
+	}
+
+	return ret;
+}
+
+void
+Tabbable::window_mapped ()
+{
+	StateChange (*this);
+}
+
+void
+Tabbable::window_unmapped ()
+{
+	StateChange (*this);
+}
diff --git a/libs/gtkmm2ext/tearoff.cc b/libs/gtkmm2ext/tearoff.cc
index dbe5c3d..bb30e56 100644
--- a/libs/gtkmm2ext/tearoff.cc
+++ b/libs/gtkmm2ext/tearoff.cc
@@ -26,7 +26,7 @@
 #include "gtkmm2ext/tearoff.h"
 #include "gtkmm2ext/utils.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace Gtkmm2ext;
 using namespace Gtk;
@@ -286,7 +286,7 @@ void
 TearOff::set_state (const XMLNode& node)
 {
         Glib::RefPtr<Gdk::Window> win;
-        const XMLProperty* prop;
+        XMLProperty const * prop;
 
         if ((prop = node.property (X_("tornoff"))) == 0) {
                 return;
diff --git a/libs/gtkmm2ext/textviewer.cc b/libs/gtkmm2ext/textviewer.cc
index 7de9b02..22c26aa 100644
--- a/libs/gtkmm2ext/textviewer.cc
+++ b/libs/gtkmm2ext/textviewer.cc
@@ -20,7 +20,7 @@
 #include <string>
 #include <gtkmm2ext/textviewer.h>
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace Gtkmm2ext;
diff --git a/libs/gtkmm2ext/utils.cc b/libs/gtkmm2ext/utils.cc
index a7790e6..2b3a29f 100644
--- a/libs/gtkmm2ext/utils.cc
+++ b/libs/gtkmm2ext/utils.cc
@@ -31,10 +31,12 @@
 #include <gtkmm/label.h>
 #include <gtkmm/comboboxtext.h>
 #include <gtkmm/tooltip.h>
+#include <gtkmm/menuitem.h>
 
 #include "gtkmm2ext/utils.h"
+#include "gtkmm2ext/persistent_tooltip.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 
@@ -272,6 +274,18 @@ Gtkmm2ext::pixbuf_from_string(const string& name, const Pango::FontDescription&
 		return *empty_pixbuf;
 	}
 
+	if (clip_width <= 0 || clip_height <= 0) {
+		/* negative values mean padding around natural size */
+		int width, height;
+		pixel_size (name, font, width, height);
+		if (clip_width <= 0) {
+			clip_width = width - clip_width;
+		}
+		if (clip_height <= 0) {
+			clip_height = height - clip_height;
+		}
+	}
+
 	Glib::RefPtr<Gdk::Pixbuf> buf = Gdk::Pixbuf::create(Gdk::COLORSPACE_RGB, true, 8, clip_width, clip_height);
 
 	cairo_surface_t* surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, clip_width, clip_height);
@@ -296,6 +310,113 @@ Gtkmm2ext::pixbuf_from_string(const string& name, const Pango::FontDescription&
 }
 
 void
+Gtkmm2ext::position_menu_anchored (const Gtk::Menu* const menu,
+                                   Gtk::Widget* const anchor,
+                                   const std::string& selected,
+                                   int& x, int& y, bool& push_in) {
+	using namespace Gdk;
+	using namespace Gtk;
+	using namespace Gtk::Menu_Helpers;
+
+	 /* TODO: lacks support for rotated dropdown buttons */
+
+	if (!anchor->has_screen () || !anchor->get_has_window ()) {
+		return;
+	}
+
+	Rectangle monitor;
+	{
+		const int monitor_num = anchor->get_screen ()->get_monitor_at_window (
+				anchor->get_window ());
+		anchor->get_screen ()->get_monitor_geometry (
+				(monitor_num < 0) ? 0 : monitor_num, monitor);
+	}
+
+	const Requisition menu_req = menu->size_request();
+	const Rectangle allocation = anchor->get_allocation();
+
+	/* The x and y position are handled separately.
+	 *
+	 * For the x position if the direction is LTR (or RTL), then we try in order:
+	 *  a) align the left (right) of the menu with the left (right) of the button
+	 *     if there's enough room until the right (left) border of the screen;
+	 *  b) align the right (left) of the menu with the right (left) of the button
+	 *     if there's enough room until the left (right) border of the screen;
+	 *  c) align the right (left) border of the menu with the right (left) border
+	 *     of the screen if there's enough space;
+	 *  d) align the left (right) border of the menu with the left (right) border
+	 *     of the screen, with the rightmost (leftmost) part of the menu that
+	 *     overflows the screen.
+	 *     XXX We always align left regardless of the direction because if x is
+	 *     left of the current monitor, the menu popup code after us notices it
+	 *     and enforces that the menu stays in the monitor that's at the left...*/
+
+	anchor->get_window ()->get_origin (x, y);
+
+	if (anchor->get_direction() == TEXT_DIR_RTL) {
+		if (monitor.get_x() <= x + allocation.get_width() - menu_req.width) {
+			/* a) align menu right and button right */
+			x += allocation.get_width() - menu_req.width;
+		} else if (x + menu_req.width <= monitor.get_x() + monitor.get_width()) {
+			/* b) align menu left and button left: nothing to do*/
+		} else if (menu_req.width > monitor.get_width()) {
+			/* c) align menu left and screen left, guaranteed to fit */
+			x = monitor.get_x();
+		} else {
+			/* d) XXX align left or the menu might change monitors */
+			x = monitor.get_x();
+		}
+	} else { /* LTR */
+		if (x + menu_req.width <= monitor.get_x() + monitor.get_width()) {
+			/* a) align menu left and button left: nothing to do*/
+		} else if (monitor.get_x() <= x + allocation.get_width() - menu_req.width) {
+			/* b) align menu right and button right */
+			x += allocation.get_width() - menu_req.width;
+		} else if (menu_req.width > monitor.get_width()) {
+			/* c) align menu right and screen right, guaranteed to fit */
+			x = monitor.get_x() + monitor.get_width() - menu_req.width;
+		} else {
+			/* d) align left */
+			x = monitor.get_x();
+		}
+	}
+
+	/* For the y position, try in order:
+	 *  a) if there is a menu item with the same text as the button, align it
+	 *     with the button, unless that makes the menu overflow the monitor.
+	 *  b) align the top of the menu with the bottom of the button if there is
+	 *     enough room below the button;
+	 *  c) align the bottom of the menu with the top of the button if there is
+	 *     enough room above the button;
+	 *  d) align the bottom of the menu with the bottom of the monitor if there
+	 *     is enough room, but avoid moving the menu to another monitor */
+
+	const MenuList& items = menu->items ();
+	int offset = 0;
+
+	MenuList::const_iterator i = items.begin();
+	for ( ; i != items.end(); ++i) {
+		if (selected == ((std::string) i->get_label())) {
+			break;
+		}
+		offset += i->size_request().height;
+	}
+	if (i != items.end() &&
+	    y - offset >= monitor.get_y() &&
+	    y - offset + menu_req.height <= monitor.get_y() + monitor.get_height()) {
+		y -= offset;
+	} else if (y + allocation.get_height() + menu_req.height <= monitor.get_y() + monitor.get_height()) {
+		y += allocation.get_height(); /* a) */
+	} else if ((y - menu_req.height) >= monitor.get_y()) {
+		y -= menu_req.height; /* b) */
+	} else {
+		y = monitor.get_y() + max(0, monitor.get_height() - menu_req.height);
+	}
+
+	push_in = false;
+}
+
+void
 Gtkmm2ext::set_popdown_strings (Gtk::ComboBoxText& cr, const vector<string>& strings)
 {
 	vector<string>::const_iterator i;
@@ -382,30 +503,6 @@ Gtkmm2ext::detach_menu (Gtk::Menu& menu)
 }
 
 bool
-Gtkmm2ext::possibly_translate_mod_to_make_legal_accelerator (GdkModifierType& mod)
-{
-#ifdef GTKOSX
-	/* GTK on OS X is currently (February 2012) setting both
-	   the Meta and Mod2 bits in the event modifier state if
-	   the Command key is down.
-
-	   gtk_accel_groups_activate() does not invoke any of the logic
-	   that gtk_window_activate_key() will that sorts out that stupid
-	   state of affairs, and as a result it fails to find a match
-	   for the key event and the current set of accelerators.
-
-	   to fix this, if the meta bit is set, remove the mod2 bit
-	   from the modifier. this assumes that our bindings use Primary
-	   which will have set the meta bit in the accelerator entry.
-	*/
-	if (mod & GDK_META_MASK) {
-		mod = GdkModifierType (mod & ~GDK_MOD2_MASK);
-	}
-#endif
-	return true;
-}
-
-bool
 Gtkmm2ext::possibly_translate_keyval_to_make_legal_accelerator (uint32_t& keyval)
 {
 	int fakekey = GDK_VoidSymbol;
@@ -702,7 +799,7 @@ Gtkmm2ext::window_to_draw_on (Gtk::Widget& w, Gtk::Widget** parent)
 }
 
 int
-Gtkmm2ext::pixel_width (const string& str, Pango::FontDescription& font)
+Gtkmm2ext::pixel_width (const string& str, const Pango::FontDescription& font)
 {
 	Glib::RefPtr<Pango::Context> context = Glib::wrap (gdk_pango_context_get());
 	Glib::RefPtr<Pango::Layout> layout = Pango::Layout::create (context);
@@ -730,7 +827,7 @@ Gtkmm2ext::pixel_width (const string& str, Pango::FontDescription& font)
 }
 
 void
-Gtkmm2ext::pixel_size (const string& str, Pango::FontDescription& font, int& width, int& height)
+Gtkmm2ext::pixel_size (const string& str, const Pango::FontDescription& font, int& width, int& height)
 {
 	Gtk::Label foo;
 	Glib::RefPtr<Pango::Layout> layout = foo.create_pango_layout ("");
@@ -756,9 +853,9 @@ Gtkmm2ext::fit_to_pixels (const string& str, int pixel_width, Pango::FontDescrip
 	layout->set_width (pixel_width * PANGO_SCALE);
 
 	if (with_ellipses) {
-        	layout->set_ellipsize (Pango::ELLIPSIZE_END);
+		layout->set_ellipsize (Pango::ELLIPSIZE_END);
 	} else {
-        	layout->set_wrap (Pango::WRAP_CHAR);
+		layout->set_wrap (Pango::WRAP_CHAR);
 	}
 
 	line = layout->get_line (0);
@@ -848,12 +945,14 @@ void
 Gtkmm2ext::enable_tooltips ()
 {
 	gtk_rc_parse_string ("gtk-enable-tooltips = 1");
+	PersistentTooltip::set_tooltips_enabled (true);
 }
 
 void
 Gtkmm2ext::disable_tooltips ()
 {
 	gtk_rc_parse_string ("gtk-enable-tooltips = 0");
+	PersistentTooltip::set_tooltips_enabled (false);
 }
 
 bool
@@ -1001,3 +1100,81 @@ Gtkmm2ext::add_volume_shortcuts (Gtk::FileChooser& c)
 	}
 #endif
 }
+
+float
+Gtkmm2ext::paned_position_as_fraction (Gtk::Paned& paned, bool h)
+{
+	const guint pos = gtk_paned_get_position (const_cast<GtkPaned*>(static_cast<const Gtk::Paned*>(&paned)->gobj()));
+	return (double) pos / (h ? paned.get_allocation().get_height() : paned.get_allocation().get_width());
+}
+
+void
+Gtkmm2ext::paned_set_position_as_fraction (Gtk::Paned& paned, float fraction, bool h)
+{
+	gint v = (h ? paned.get_allocation().get_height() : paned.get_allocation().get_width());
+
+	if (v < 1) {
+		return;
+	}
+
+	paned.set_position ((guint) floor (fraction * v));
+}
+
+string
+Gtkmm2ext::show_gdk_event_state (int state)
+{
+	string s;
+	if (state & GDK_SHIFT_MASK) {
+		s += "+SHIFT";
+	}
+	if (state & GDK_LOCK_MASK) {
+		s += "+LOCK";
+	}
+	if (state & GDK_CONTROL_MASK) {
+		s += "+CONTROL";
+	}
+	if (state & GDK_MOD1_MASK) {
+		s += "+MOD1";
+	}
+	if (state & GDK_MOD2_MASK) {
+		s += "+MOD2";
+	}
+	if (state & GDK_MOD3_MASK) {
+		s += "+MOD3";
+	}
+	if (state & GDK_MOD4_MASK) {
+		s += "+MOD4";
+	}
+	if (state & GDK_MOD5_MASK) {
+		s += "+MOD5";
+	}
+	if (state & GDK_BUTTON1_MASK) {
+		s += "+BUTTON1";
+	}
+	if (state & GDK_BUTTON2_MASK) {
+		s += "+BUTTON2";
+	}
+	if (state & GDK_BUTTON3_MASK) {
+		s += "+BUTTON3";
+	}
+	if (state & GDK_BUTTON4_MASK) {
+		s += "+BUTTON4";
+	}
+	if (state & GDK_BUTTON5_MASK) {
+		s += "+BUTTON5";
+	}
+	if (state & GDK_SUPER_MASK) {
+		s += "+SUPER";
+	}
+	if (state & GDK_HYPER_MASK) {
+		s += "+HYPER";
+	}
+	if (state & GDK_META_MASK) {
+		s += "+META";
+	}
+	if (state & GDK_RELEASE_MASK) {
+		s += "+RELEASE";
+	}
+
+	return s;
+}
diff --git a/libs/gtkmm2ext/visibility_tracker.cc b/libs/gtkmm2ext/visibility_tracker.cc
index aac76a5..170036e 100644
--- a/libs/gtkmm2ext/visibility_tracker.cc
+++ b/libs/gtkmm2ext/visibility_tracker.cc
@@ -23,6 +23,8 @@
 
 using namespace Gtkmm2ext;
 
+bool VisibilityTracker::_use_window_manager_visibility = true;
+
 VisibilityTracker::VisibilityTracker (Gtk::Window& win)
 	: _window (win)
 	, _visibility (GdkVisibilityState (0))
@@ -31,11 +33,16 @@ VisibilityTracker::VisibilityTracker (Gtk::Window& win)
 	_window.signal_visibility_notify_event().connect (sigc::mem_fun (*this, &VisibilityTracker::handle_visibility_notify_event));
 }
 
+void
+VisibilityTracker::set_use_window_manager_visibility (bool yn)
+{
+	_use_window_manager_visibility = yn;
+}
+
 bool
 VisibilityTracker::handle_visibility_notify_event (GdkEventVisibility* ev)
 {
 	_visibility = ev->state;
-	// std::cerr << "VT: " << _window.get_title() << " vis event, fv = " << fully_visible() << " pv = " << partially_visible() << " nv = " << not_visible() << std::endl;
 	return false;
 }
 
@@ -52,17 +59,29 @@ VisibilityTracker::cycle_visibility ()
 bool
 VisibilityTracker::fully_visible () const
 {
-	return _window.is_mapped() && (_visibility == GDK_VISIBILITY_UNOBSCURED);
+	if (_use_window_manager_visibility) {
+		return _window.is_mapped() && (_visibility == GDK_VISIBILITY_UNOBSCURED);
+	} else {
+		return _window.is_mapped();
+	}
 }
 
 bool
 VisibilityTracker::not_visible () const
 {
-	return !_window.is_mapped() || (_visibility == GDK_VISIBILITY_FULLY_OBSCURED);
+	if (_use_window_manager_visibility) {
+		return !_window.is_mapped() || (_visibility == GDK_VISIBILITY_FULLY_OBSCURED);
+	} else {
+		return !_window.is_mapped();
+	}
 }
 
 bool
 VisibilityTracker::partially_visible () const
 {
-	return _window.is_mapped() && ((_visibility == GDK_VISIBILITY_PARTIAL) || (_visibility == GDK_VISIBILITY_UNOBSCURED));
+	if (_use_window_manager_visibility) {
+		return _window.is_mapped() && ((_visibility == GDK_VISIBILITY_PARTIAL) || (_visibility == GDK_VISIBILITY_UNOBSCURED));
+	} else {
+		return _window.is_mapped();
+	}
 }
diff --git a/libs/gtkmm2ext/window_proxy.cc b/libs/gtkmm2ext/window_proxy.cc
new file mode 100644
index 0000000..1f2fa54
--- /dev/null
+++ b/libs/gtkmm2ext/window_proxy.cc
@@ -0,0 +1,427 @@
+/*
+    Copyright (C) 2015 Paul Davis
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#include <gtkmm/action.h>
+#include <gtkmm/window.h>
+
+#include "pbd/convert.h"
+#include "pbd/xml++.h"
+#include "pbd/stacktrace.h"
+
+#include "gtkmm2ext/window_proxy.h"
+#include "gtkmm2ext/visibility_tracker.h"
+
+#include "pbd/i18n.h"
+
+using namespace Gtk;
+using namespace Gtkmm2ext;
+using namespace PBD;
+
+WindowProxy::WindowProxy (const std::string& name)
+	: _name (name)
+	, _window (0)
+	, _visible (false)
+	, _x_off (-1)
+	, _y_off (-1)
+	, _width (-1)
+	, _height (-1)
+	, vistracker (0)
+	, _state_mask (StateMask (Position|Size))
+{
+}
+
+WindowProxy::WindowProxy (const std::string& name, const std::string& menu_name)
+	: _name (name)
+	, _menu_name (menu_name)
+	, _window (0)
+	, _visible (false)
+	, _x_off (-1)
+	, _y_off (-1)
+	, _width (-1)
+	, _height (-1)
+	, vistracker (0)
+	, _state_mask (StateMask (Position|Size))
+{
+}
+
+WindowProxy::WindowProxy (const std::string& name, const std::string& menu_name, const XMLNode& node)
+	: _name (name)
+	, _menu_name (menu_name)
+	, _window (0)
+	, _visible (false)
+	, _x_off (-1)
+	, _y_off (-1)
+	, _width (-1)
+	, _height (-1)
+	, vistracker (0)
+{
+	set_state (node, 0);
+}
+
+WindowProxy::~WindowProxy ()
+{
+	delete vistracker;
+	delete _window;
+}
+
+int
+WindowProxy::set_state (const XMLNode& node, int /* version */)
+{
+	XMLNodeList children = node.children ();
+	XMLNode const * child;
+	XMLNodeList::const_iterator i = children.begin ();
+
+	while (i != children.end()) {
+		child = *i;
+		XMLProperty const * prop = child->property (X_("name"));
+		if (child->name() == X_("Window") && prop && prop->value() == _name) {
+			break;
+		}
+
+		++i;
+	}
+
+	if (i != children.end()) {
+
+		XMLProperty const * prop;
+		child = *i;
+
+		if ((prop = child->property (X_("visible"))) != 0) {
+			_visible = PBD::string_is_affirmative (prop->value ());
+		}
+
+		if ((prop = child->property (X_("x-off"))) != 0) {
+			_x_off = atoi (prop->value());
+		}
+		if ((prop = child->property (X_("y-off"))) != 0) {
+			_y_off = atoi (prop->value());
+		}
+		if ((prop = child->property (X_("x-size"))) != 0) {
+			_width = atoi (prop->value());
+		}
+		if ((prop = child->property (X_("y-size"))) != 0) {
+			_height = atoi (prop->value());
+		}
+	}
+
+	if (_window) {
+		setup ();
+	}
+
+	return 0;
+}
+
+void
+WindowProxy::set_action (Glib::RefPtr<Gtk::Action> act)
+{
+	_action = act;
+}
+
+std::string
+WindowProxy::action_name() const
+{
+	return string_compose (X_("toggle-%1"), _name);
+}
+
+void
+WindowProxy::toggle()
+{
+	if (!_window) {
+		(void) get (true);
+		setup ();
+		assert (_window);
+		/* XXX this is a hack - the window object should really
+		   ensure its components are all visible. sigh.
+		*/
+		_window->show_all();
+		/* we'd like to just call this and nothing else */
+		_window->present ();
+	} else {
+		if (_window->is_mapped()) {
+			save_pos_and_size();
+		}
+
+		vistracker->cycle_visibility ();
+
+		if (_window->is_mapped()) {
+			if (_width != -1 && _height != -1) {
+				_window->set_default_size (_width, _height);
+			}
+			if (_x_off != -1 && _y_off != -1) {
+				_window->move (_x_off, _y_off);
+			}
+		}
+	}
+}
+
+std::string
+WindowProxy::xml_node_name()
+{
+	return X_("Window");
+}
+
+XMLNode&
+WindowProxy::get_state ()
+{
+	XMLNode* node = new XMLNode (xml_node_name());
+	char buf[32];
+
+	node->add_property (X_("name"), _name);
+
+	if (_window && vistracker) {
+
+		/* we have a window, so use current state */
+
+		_visible = vistracker->partially_visible ();
+		_window->get_position (_x_off, _y_off);
+		_window->get_size (_width, _height);
+	}
+
+	int x, y, w, h;
+
+	if (_state_mask & Position) {
+		x = _x_off;
+		y = _y_off;
+	} else {
+		x = -1;
+		y = -1;
+	}
+
+	if (_state_mask & Size) {
+		w = _width;
+		h = _height;
+	} else {
+		w = -1;
+		h = -1;
+	}
+
+	node->add_property (X_("visible"), _visible? X_("yes") : X_("no"));
+	snprintf (buf, sizeof (buf), "%d", x);
+	node->add_property (X_("x-off"), buf);
+	snprintf (buf, sizeof (buf), "%d", y);
+	node->add_property (X_("y-off"), buf);
+	snprintf (buf, sizeof (buf), "%d", w);
+	node->add_property (X_("x-size"), buf);
+	snprintf (buf, sizeof (buf), "%d", h);
+	node->add_property (X_("y-size"), buf);
+
+	return *node;
+}
+
+void
+WindowProxy::drop_window ()
+{
+	if (_window) {
+		delete_connection.disconnect ();
+		configure_connection.disconnect ();
+		map_connection.disconnect ();
+		unmap_connection.disconnect ();
+		_window->hide ();
+		delete _window;
+		_window = 0;
+		delete vistracker;
+		vistracker = 0;
+	}
+}
+
+void
+WindowProxy::use_window (Gtk::Window& win)
+{
+	drop_window ();
+	_window = &win;
+	setup ();
+}
+
+void
+WindowProxy::setup ()
+{
+	assert (_window);
+
+	vistracker = new Gtkmm2ext::VisibilityTracker (*_window);
+
+	delete_connection = _window->signal_delete_event().connect (sigc::mem_fun (*this, &WindowProxy::delete_event_handler));
+	configure_connection = _window->signal_configure_event().connect (sigc::mem_fun (*this, &WindowProxy::configure_handler), false);
+	map_connection = _window->signal_map().connect (sigc::mem_fun (*this, &WindowProxy::map_handler), false);
+	unmap_connection = _window->signal_unmap().connect (sigc::mem_fun (*this, &WindowProxy::unmap_handler), false);
+
+	set_pos_and_size ();
+}
+
+void
+WindowProxy::map_handler ()
+{
+	/* emit our own signal */
+	signal_map ();
+}
+
+void
+WindowProxy::unmap_handler ()
+{
+	/* emit out own signal */
+	signal_unmap ();
+}
+
+bool
+WindowProxy::configure_handler (GdkEventConfigure* ev)
+{
+	/* stupidly, the geometry data in the event isn't the same as we get
+	   from the window geometry APIs.so we have to actively interrogate
+	   them to get the new information.
+
+	   the difference is generally down to window manager framing.
+	*/
+	save_pos_and_size ();
+	return false;
+}
+
+
+bool
+WindowProxy::visible() const
+{
+	if (vistracker) {
+		/* update with current state */
+		_visible = vistracker->partially_visible();
+	}
+	return _visible;
+}
+
+bool
+WindowProxy::fully_visible () const
+{
+	if (!vistracker) {
+		/* no vistracker .. no window .. cannot be fully visible */
+		return false;
+	}
+	return vistracker->fully_visible();
+}
+
+void
+WindowProxy::show ()
+{
+	get (true);
+	assert (_window);
+	_window->show ();
+}
+
+void
+WindowProxy::maybe_show ()
+{
+	if (_visible) {
+		show ();
+	}
+}
+
+void
+WindowProxy::show_all ()
+{
+	get (true);
+	assert (_window);
+	_window->show_all ();
+}
+
+void
+WindowProxy::present ()
+{
+	get (true);
+	assert (_window);
+
+	_window->show_all ();
+	_window->present ();
+
+	/* turn off any mouse-based positioning */
+	_window->set_position (Gtk::WIN_POS_NONE);
+}
+
+void
+WindowProxy::hide ()
+{
+	if (_window) {
+		save_pos_and_size();
+		_window->hide ();
+	}
+}
+
+bool
+WindowProxy::delete_event_handler (GdkEventAny* /*ev*/)
+{
+	if (_action) {
+		_action->activate ();
+	} else {
+		hide();
+	}
+
+	return true;
+}
+
+void
+WindowProxy::save_pos_and_size ()
+{
+	if (_window) {
+		_window->get_position (_x_off, _y_off);
+		_window->get_size (_width, _height);
+	}
+}
+
+void
+WindowProxy::set_pos_and_size ()
+{
+	if (!_window) {
+		return;
+	}
+
+	if ((_state_mask & Position) && (_width != -1 || _height != -1 || _x_off != -1 || _y_off != -1)) {
+		/* cancel any mouse-based positioning */
+		_window->set_position (Gtk::WIN_POS_NONE);
+	}
+
+	if ((_state_mask & Size) && _width != -1 && _height != -1) {
+		_window->resize (_width, _height);
+	}
+
+	if ((_state_mask & Position) && _x_off != -1 && _y_off != -1) {
+		_window->move (_x_off, _y_off);
+	}
+}
+
+void
+WindowProxy::set_pos ()
+{
+	if (!_window) {
+		return;
+	}
+
+	if (!(_state_mask & Position)) {
+		return;
+	}
+
+	if (_width != -1 || _height != -1 || _x_off != -1 || _y_off != -1) {
+		/* cancel any mouse-based positioning */
+		_window->set_position (Gtk::WIN_POS_NONE);
+	}
+
+	if (_x_off != -1 && _y_off != -1) {
+		_window->move (_x_off, _y_off);
+	}
+}
+
+void
+WindowProxy::set_state_mask (StateMask sm)
+{
+	_state_mask = sm;
+}
diff --git a/libs/gtkmm2ext/window_title.cc b/libs/gtkmm2ext/window_title.cc
index eaf25a9..5cb9ed9 100644
--- a/libs/gtkmm2ext/window_title.cc
+++ b/libs/gtkmm2ext/window_title.cc
@@ -19,7 +19,7 @@
 
 #include "gtkmm2ext/window_title.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 
diff --git a/libs/gtkmm2ext/wscript b/libs/gtkmm2ext/wscript
index 2e9df40..4e1a031 100644
--- a/libs/gtkmm2ext/wscript
+++ b/libs/gtkmm2ext/wscript
@@ -2,6 +2,8 @@
 from waflib.extras import autowaf as autowaf
 from waflib import Options
 import os
+import sys
+import platform as PLATFORM
 
 # Version of this package (even if built as a child)
 MAJOR = '0'
@@ -30,6 +32,7 @@ gtkmm2ext_sources = [
         'bindable_button.cc',
         'bindings.cc',
         'cairocell.cc',
+        'cairo_icon.cc',
         'cairo_packer.cc',
         'cairo_widget.cc',
         'cell_renderer_color_selector.cc',
@@ -47,6 +50,7 @@ gtkmm2ext_sources = [
         'gtkapplication.c',
         'idle_adjustment.cc',
         'keyboard.cc',
+        'pane.cc',
         'paths_dialog.cc',
         'persistent_tooltip.cc',
         'pixfader.cc',
@@ -54,14 +58,17 @@ gtkmm2ext_sources = [
         'popup.cc',
         'prompter.cc',
         'scroomer.cc',
+        'searchbar.cc',
         'selector.cc',
         'slider_controller.cc',
         'stateful_button.cc',
+        'tabbable.cc',
         'tearoff.cc',
         'textviewer.cc',
         'treeutils.cc',
         'utils.cc',
         'visibility_tracker.cc',
+        'window_proxy.cc',
         'window_title.cc'
 ]
 
@@ -102,7 +109,7 @@ def build(bld):
     obj.includes     = ['.']
     obj.name         = 'libgtkmm2ext'
     obj.target       = 'gtkmm2ext'
-    obj.uselib       = 'GTKMM GTK GTKOSX OSX GDK'
+    obj.uselib       = 'GTKMM GTK XML'
     obj.use          = [ 'libpbd', 'libardour' ]
     obj.vnum         = GTKMM2EXT_LIB_VERSION
     obj.install_path = bld.env['LIBDIR']
@@ -110,7 +117,7 @@ def build(bld):
                     'PACKAGE="' + I18N_PACKAGE + '"',
                     'LOCALEDIR="' + os.path.join(
                             os.path.normpath(bld.env['DATADIR']), 'locale') + '"']
-    if bld.is_defined('GTKOSX'):
+    if sys.platform == 'darwin':
         obj.source += ['gtkapplication_quartz.mm']
     else:
         obj.source += ['gtkapplication_x11.c']
diff --git a/libs/lua/LuaBridge/LuaBridge.h b/libs/lua/LuaBridge/LuaBridge.h
new file mode 100644
index 0000000..01f9e90
--- /dev/null
+++ b/libs/lua/LuaBridge/LuaBridge.h
@@ -0,0 +1,197 @@
+//------------------------------------------------------------------------------
+/*
+  https://github.com/vinniefalco/LuaBridge
+
+  Copyright 2016, Robin Gareus <robin at gareus.org>
+  Copyright 2012, Vinnie Falco <vinnie.falco at gmail.com>
+  Copyright 2007, Nathan Reed
+
+  License: The MIT License (http://www.opensource.org/licenses/mit-license.php)
+
+  Permission is hereby granted, free of charge, to any person obtaining a copy
+  of this software and associated documentation files (the "Software"), to deal
+  in the Software without restriction, including without limitation the rights
+  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+  copies of the Software, and to permit persons to whom the Software is
+  furnished to do so, subject to the following conditions:
+
+  The above copyright notice and this permission notice shall be included in all
+  copies or substantial portions of the Software.
+
+  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+  SOFTWARE.
+*/
+//==============================================================================
+
+#ifndef LUABRIDGE_LUABRIDGE_HEADER
+#define LUABRIDGE_LUABRIDGE_HEADER
+
+// All #include dependencies are listed here
+// instead of in the individual header files.
+//
+#include <cassert>
+#include <sstream>
+#include <stdexcept>
+#include <string>
+#include <typeinfo>
+
+#include <bitset>
+#include <list>
+#include <map>
+#include <set>
+#include <vector>
+
+#include <inttypes.h>
+#include <boost/type_traits.hpp>
+#include <boost/shared_ptr.hpp>
+
+#include "lua/luastate.h"
+
+#define LUABRIDGE_MAJOR_VERSION 2
+#define LUABRIDGE_MINOR_VERSION 0
+#define LUABRIDGE_VERSION 200
+
+namespace luabridge
+{
+
+// Forward declaration
+//
+template <class T>
+struct Stack;
+
+#include "detail/LuaHelpers.h"
+
+#include "detail/TypeTraits.h"
+#include "detail/TypeList.h"
+#include "detail/FuncTraits.h"
+#include "detail/Constructor.h"
+#include "detail/Stack.h"
+#include "detail/ClassInfo.h"
+
+class LuaRef;
+
+#include "detail/LuaException.h"
+#include "detail/LuaRef.h"
+#include "detail/Iterator.h"
+#include "detail/FuncArgs.h"
+
+//------------------------------------------------------------------------------
+/**
+    security options.
+*/
+class Security
+{
+public:
+  static bool hideMetatables ()
+  {
+    return getSettings().hideMetatables;
+  }
+
+  static void setHideMetatables (bool shouldHide)
+  {
+    getSettings().hideMetatables = shouldHide;
+  }
+
+private:
+  struct Settings
+  {
+    Settings () : hideMetatables (true)
+    {
+    }
+
+    bool hideMetatables;
+  };
+
+  static Settings& getSettings ()
+  {
+    static Settings settings;
+    return settings;
+  }
+};
+
+//------------------------------------------------------------------------------
+
+#ifdef LUABINDINGDOC
+class LuaBindingDoc
+{
+public:
+	static bool printBindings ()
+	{
+		return getSettings().print_bindings;
+	}
+
+	static void setPrintBindings (bool en)
+	{
+		getSettings().print_bindings = en;
+	}
+
+private:
+	struct Settings
+	{
+		Settings () : print_bindings (false) { }
+		bool print_bindings;
+	};
+
+	static Settings& getSettings ()
+	{
+		static Settings settings;
+		return settings;
+	}
+};
+#endif
+
+//------------------------------------------------------------------------------
+
+
+#include "detail/Userdata.h"
+#include "detail/CFunctions.h"
+#include "detail/Namespace.h"
+
+//------------------------------------------------------------------------------
+/**
+    Push an object onto the Lua stack.
+*/
+template <class T>
+inline void push (lua_State* L, T t)
+{
+  Stack <T>::push (L, t);
+}
+
+//------------------------------------------------------------------------------
+/**
+  Set a global value in the lua_State.
+
+  @note This works on any type specialized by `Stack`, including `LuaRef` and
+        its table proxies.
+*/
+template <class T>
+inline void setGlobal (lua_State* L, T t, char const* name)
+{
+  push (L, t);
+  lua_setglobal (L, name);
+}
+
+//------------------------------------------------------------------------------
+/**
+  Change whether or not metatables are hidden (on by default).
+*/
+inline void setHideMetatables (bool shouldHide)
+{
+  Security::setHideMetatables (shouldHide);
+}
+
+#ifdef LUABINDINGDOC
+inline void setPrintBindings (bool en)
+{
+  LuaBindingDoc::setPrintBindings (en);
+}
+#endif
+
+} // end Namespace
+
+#endif
diff --git a/libs/lua/LuaBridge/README b/libs/lua/LuaBridge/README
new file mode 100644
index 0000000..82cbd53
--- /dev/null
+++ b/libs/lua/LuaBridge/README
@@ -0,0 +1,28 @@
+https://github.com/vinniefalco/LuaBridge  --  1.0.2-111-g04b47d7
+
+LuaBridge is published under the terms of the MIT License.
+
+  Copyright 2012, Vinnie Falco (<vinnie.falco at gmail.com>)
+	Copyright 2008, Nigel Atkinson
+	Copyright 2007, Nathan Reed
+
+	Portions from The Loki Library:
+	Copyright (C) 2001 by Andrei Alexandrescu
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/libs/lua/LuaBridge/detail/CFunctions.h b/libs/lua/LuaBridge/detail/CFunctions.h
new file mode 100644
index 0000000..9f17129
--- /dev/null
+++ b/libs/lua/LuaBridge/detail/CFunctions.h
@@ -0,0 +1,1334 @@
+//------------------------------------------------------------------------------
+/*
+  https://github.com/vinniefalco/LuaBridge
+
+  Copyright 2016, Robin Gareus <robin at gareus.org>
+  Copyright 2012, Vinnie Falco <vinnie.falco at gmail.com>
+
+  License: The MIT License (http://www.opensource.org/licenses/mit-license.php)
+
+  Permission is hereby granted, free of charge, to any person obtaining a copy
+  of this software and associated documentation files (the "Software"), to deal
+  in the Software without restriction, including without limitation the rights
+  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+  copies of the Software, and to permit persons to whom the Software is
+  furnished to do so, subject to the following conditions:
+
+  The above copyright notice and this permission notice shall be included in all
+  copies or substantial portions of the Software.
+
+  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+  SOFTWARE.
+*/
+//==============================================================================
+
+// We use a structure so we can define everything in the header.
+//
+struct CFunc
+{
+  //----------------------------------------------------------------------------
+  /**
+      __index metamethod for a namespace or class static members.
+
+      This handles:
+        Retrieving functions and class static methods, stored in the metatable.
+        Reading global and class static data, stored in the __propget table.
+        Reading global and class properties, stored in the __propget table.
+  */
+  static int indexMetaMethod (lua_State* L)
+  {
+    int result = 0;
+    lua_getmetatable (L, 1);                // push metatable of arg1
+    for (;;)
+    {
+      lua_pushvalue (L, 2);                 // push key arg2
+      lua_rawget (L, -2);                   // lookup key in metatable
+      if (lua_isnil (L, -1))                // not found
+      {
+        lua_pop (L, 1);                     // discard nil
+        rawgetfield (L, -1, "__propget");   // lookup __propget in metatable
+        lua_pushvalue (L, 2);               // push key arg2
+        lua_rawget (L, -2);                 // lookup key in __propget
+        lua_remove (L, -2);                 // discard __propget
+        if (lua_iscfunction (L, -1))
+        {
+          lua_remove (L, -2);               // discard metatable
+          lua_pushvalue (L, 1);             // push arg1
+          lua_call (L, 1, 1);               // call cfunction
+          result = 1;
+          break;
+        }
+        else
+        {
+          assert (lua_isnil (L, -1));
+          lua_pop (L, 1);                   // discard nil and fall through
+        }
+      }
+      else
+      {
+        assert (lua_istable (L, -1) || lua_iscfunction (L, -1));
+        lua_remove (L, -2);
+        result = 1;
+        break;
+      }
+
+      rawgetfield (L, -1, "__parent");
+      if (lua_istable (L, -1))
+      {
+        // Remove metatable and repeat the search in __parent.
+        lua_remove (L, -2);
+      }
+      else
+      {
+        // Discard metatable and return nil.
+        assert (lua_isnil (L, -1));
+        lua_remove (L, -2);
+        result = 1;
+        break;
+      }
+    }
+
+    return result;
+  }
+
+  //----------------------------------------------------------------------------
+  /**
+      __newindex metamethod for a namespace or class static members.
+
+      The __propset table stores proxy functions for assignment to:
+        Global and class static data.
+        Global and class properties.
+  */
+  static int newindexMetaMethod (lua_State* L)
+  {
+    int result = 0;
+    lua_getmetatable (L, 1);                // push metatable of arg1
+    for (;;)
+    {
+      rawgetfield (L, -1, "__propset");     // lookup __propset in metatable
+      assert (lua_istable (L, -1));
+      lua_pushvalue (L, 2);                 // push key arg2
+      lua_rawget (L, -2);                   // lookup key in __propset
+      lua_remove (L, -2);                   // discard __propset
+      if (lua_iscfunction (L, -1))          // ensure value is a cfunction
+      {
+        lua_remove (L, -2);                 // discard metatable
+        lua_pushvalue (L, 3);               // push new value arg3
+        lua_call (L, 1, 0);                 // call cfunction
+        result = 0;
+        break;
+      }
+      else
+      {
+        assert (lua_isnil (L, -1));
+        lua_pop (L, 1);
+      }
+
+      rawgetfield (L, -1, "__parent");
+      if (lua_istable (L, -1))
+      {
+        // Remove metatable and repeat the search in __parent.
+        lua_remove (L, -2);
+      }
+      else
+      {
+        assert (lua_isnil (L, -1));
+        lua_pop (L, 2);
+        result = luaL_error (L,"no writable variable '%s'", lua_tostring (L, 2));
+      }
+    }
+
+    return result;
+  }
+
+  //----------------------------------------------------------------------------
+  /**
+      lua_CFunction to report an error writing to a read-only value.
+
+      The name of the variable is in the first upvalue.
+  */
+  static int readOnlyError (lua_State* L)
+  {
+    std::string s;
+
+    s = s + "'" + lua_tostring (L, lua_upvalueindex (1)) + "' is read-only";
+
+    return luaL_error (L, s.c_str ());
+  }
+
+  //----------------------------------------------------------------------------
+  /**
+      lua_CFunction to get a variable.
+
+      This is used for global variables or class static data members.
+
+      The pointer to the data is in the first upvalue.
+  */
+  template <class T>
+  static int getVariable (lua_State* L)
+  {
+    assert (lua_islightuserdata (L, lua_upvalueindex (1)));
+    T const* ptr = static_cast <T const*> (lua_touserdata (L, lua_upvalueindex (1)));
+    assert (ptr != 0);
+    Stack <T>::push (L, *ptr);
+    return 1;
+  }
+
+  //----------------------------------------------------------------------------
+  /**
+      lua_CFunction to set a variable.
+
+      This is used for global variables or class static data members.
+
+      The pointer to the data is in the first upvalue.
+  */
+  template <class T>
+  static int setVariable (lua_State* L)
+  {
+    assert (lua_islightuserdata (L, lua_upvalueindex (1)));
+    T* ptr = static_cast <T*> (lua_touserdata (L, lua_upvalueindex (1)));
+    assert (ptr != 0);
+    *ptr = Stack <T>::get (L, 1);
+    return 0;
+  }
+
+  //----------------------------------------------------------------------------
+  /**
+      lua_CFunction to call a function with a return value.
+
+      This is used for global functions, global properties, class static methods,
+      and class static properties.
+
+      The function pointer is in the first upvalue.
+  */
+  template <class FnPtr,
+            class ReturnType = typename FuncTraits <FnPtr>::ReturnType>
+  struct Call
+  {
+    typedef typename FuncTraits <FnPtr>::Params Params;
+    static int f (lua_State* L)
+    {
+      assert (isfulluserdata (L, lua_upvalueindex (1)));
+      FnPtr const& fnptr = *static_cast <FnPtr const*> (lua_touserdata (L, lua_upvalueindex (1)));
+      assert (fnptr != 0);
+      ArgList <Params> args (L);
+      Stack <typename FuncTraits <FnPtr>::ReturnType>::push (L, FuncTraits <FnPtr>::call (fnptr, args));
+      return 1;
+    }
+  };
+
+  //----------------------------------------------------------------------------
+  /**
+      lua_CFunction to call a function with no return value.
+
+      This is used for global functions, global properties, class static methods,
+      and class static properties.
+
+      The function pointer is in the first upvalue.
+  */
+  template <class FnPtr>
+  struct Call <FnPtr, void>
+  {
+    typedef typename FuncTraits <FnPtr>::Params Params;
+    static int f (lua_State* L)
+    {
+      assert (isfulluserdata (L, lua_upvalueindex (1)));
+      FnPtr const& fnptr = *static_cast <FnPtr const*> (lua_touserdata (L, lua_upvalueindex (1)));
+      assert (fnptr != 0);
+      ArgList <Params> args (L);
+      FuncTraits <FnPtr>::call (fnptr, args);
+      return 0;
+    }
+  };
+
+  //----------------------------------------------------------------------------
+  /**
+      lua_CFunction to call a function with references as arguments.
+  */
+  template <class FnPtr,
+            class ReturnType = typename FuncTraits <FnPtr>::ReturnType>
+  struct CallRef
+  {
+    typedef typename FuncTraits <FnPtr>::Params Params;
+    static int f (lua_State* L)
+    {
+      assert (isfulluserdata (L, lua_upvalueindex (1)));
+      FnPtr const& fnptr = *static_cast <FnPtr const*> (lua_touserdata (L, lua_upvalueindex (1)));
+      assert (fnptr != 0);
+      ArgList <Params, 1> args (L);
+      Stack <typename FuncTraits <FnPtr>::ReturnType>::push (L, FuncTraits <FnPtr>::call (fnptr, args));
+      LuaRef v (newTable (L));
+      FuncArgs <Params, 0>::refs (v, args);
+      v.push(L);
+      return 2;
+    }
+  };
+
+  template <class FnPtr>
+  struct CallRef <FnPtr, void>
+  {
+    typedef typename FuncTraits <FnPtr>::Params Params;
+    static int f (lua_State* L)
+    {
+      assert (isfulluserdata (L, lua_upvalueindex (1)));
+      FnPtr const& fnptr = *static_cast <FnPtr const*> (lua_touserdata (L, lua_upvalueindex (1)));
+      assert (fnptr != 0);
+      ArgList <Params, 1> args (L);
+      FuncTraits <FnPtr>::call (fnptr, args);
+      LuaRef v (newTable (L));
+      FuncArgs <Params, 0>::refs (v, args);
+      v.push(L);
+      return 1;
+    }
+  };
+
+
+  //----------------------------------------------------------------------------
+  /**
+      lua_CFunction to call a class member function with a return value.
+
+      The member function pointer is in the first upvalue.
+      The class userdata object is at the top of the Lua stack.
+  */
+  template <class MemFnPtr,
+            class ReturnType = typename FuncTraits <MemFnPtr>::ReturnType>
+  struct CallMember
+  {
+    typedef typename FuncTraits <MemFnPtr>::ClassType T;
+    typedef typename FuncTraits <MemFnPtr>::Params Params;
+
+    static int f (lua_State* L)
+    {
+      assert (isfulluserdata (L, lua_upvalueindex (1)));
+      T* const t = Userdata::get <T> (L, 1, false);
+      MemFnPtr const& fnptr = *static_cast <MemFnPtr const*> (lua_touserdata (L, lua_upvalueindex (1)));
+      assert (fnptr != 0);
+      ArgList <Params, 2> args (L);
+      Stack <ReturnType>::push (L, FuncTraits <MemFnPtr>::call (t, fnptr, args));
+      return 1;
+    }
+  };
+
+  template <class MemFnPtr,
+            class ReturnType = typename FuncTraits <MemFnPtr>::ReturnType>
+  struct CallConstMember
+  {
+    typedef typename FuncTraits <MemFnPtr>::ClassType T;
+    typedef typename FuncTraits <MemFnPtr>::Params Params;
+
+    static int f (lua_State* L)
+    {
+      assert (isfulluserdata (L, lua_upvalueindex (1)));
+      T const* const t = Userdata::get <T> (L, 1, true);
+      MemFnPtr const& fnptr = *static_cast <MemFnPtr const*> (lua_touserdata (L, lua_upvalueindex (1)));
+      assert (fnptr != 0);
+      ArgList <Params, 2> args(L);
+      Stack <ReturnType>::push (L, FuncTraits <MemFnPtr>::call (t, fnptr, args));
+      return 1;
+    }
+  };
+
+  template <class MemFnPtr, class T,
+           class ReturnType = typename FuncTraits <MemFnPtr>::ReturnType>
+  struct CallMemberPtr
+  {
+    typedef typename FuncTraits <MemFnPtr>::Params Params;
+
+    static int f (lua_State* L)
+    {
+      assert (isfulluserdata (L, lua_upvalueindex (1)));
+      boost::shared_ptr<T>* const t = Userdata::get <boost::shared_ptr<T> > (L, 1, false);
+      T* const tt = t->get();
+      if (!tt) {
+        return luaL_error (L, "shared_ptr is nil");
+      }
+      MemFnPtr const& fnptr = *static_cast <MemFnPtr const*> (lua_touserdata (L, lua_upvalueindex (1)));
+      assert (fnptr != 0);
+      ArgList <Params, 2> args (L);
+      Stack <ReturnType>::push (L, FuncTraits <MemFnPtr>::call (tt, fnptr, args));
+      return 1;
+    }
+  };
+
+  template <class T, class R>
+  struct CastMemberPtr
+  {
+    static int f (lua_State* L)
+    {
+      boost::shared_ptr<T> t = luabridge::Stack<boost::shared_ptr<T> >::get (L, 1);
+      Stack <boost::shared_ptr<R> >::push (L, boost::dynamic_pointer_cast<R> (t));
+      return 1;
+    }
+  };
+
+  template <class T>
+  struct ClassEqualCheck
+  {
+    static int f (lua_State* L)
+    {
+      T const* const t0 = Userdata::get <T> (L, 1, true);
+      T const* const t1 = Userdata::get <T> (L, 2, true);
+      Stack <bool>::push (L, t0 == t1);
+      return 1;
+    }
+  };
+
+
+  template <class T, class R>
+  struct CastClass
+  {
+    static int f (lua_State* L)
+    {
+      T * const t = Userdata::get <T> (L, 1, false );
+      Stack <R*>::push (L, dynamic_cast<R*>(t));
+      return 1;
+    }
+  };
+
+  template <class T, class R>
+  struct CastConstClass
+  {
+    static int f (lua_State* L)
+    {
+      T const* const t = Userdata::get <T> (L, 1, true);
+      Stack <R const*>::push (L, dynamic_cast<R const*>(t));
+      return 1;
+    }
+  };
+
+
+  template <class T>
+  struct PtrNullCheck
+  {
+    static int f (lua_State* L)
+    {
+      boost::shared_ptr<T> t = luabridge::Stack<boost::shared_ptr<T> >::get (L, 1);
+      Stack <bool>::push (L, t == 0);
+      return 1;
+    }
+  };
+
+  template <class T>
+  struct WPtrNullCheck
+  {
+    static int f (lua_State* L)
+    {
+      bool rv = true;
+      boost::weak_ptr<T> tw = luabridge::Stack<boost::weak_ptr<T> >::get (L, 1);
+      boost::shared_ptr<T> const t = tw.lock();
+      if (t) {
+        T* const tt = t.get();
+        rv = (tt == 0);
+      }
+      Stack <bool>::push (L, rv);
+      return 1;
+    }
+  };
+
+  template <class MemFnPtr, class T,
+           class ReturnType = typename FuncTraits <MemFnPtr>::ReturnType>
+  struct CallMemberWPtr
+  {
+    typedef typename FuncTraits <MemFnPtr>::Params Params;
+
+    static int f (lua_State* L)
+    {
+      assert (isfulluserdata (L, lua_upvalueindex (1)));
+      boost::weak_ptr<T>* const tw = Userdata::get <boost::weak_ptr<T> > (L, 1, false);
+      boost::shared_ptr<T> const t = tw->lock();
+      if (!t) {
+        return luaL_error (L, "cannot lock weak_ptr");
+      }
+      T* const tt = t.get();
+      if (!tt) {
+        return luaL_error (L, "weak_ptr is nil");
+      }
+      MemFnPtr const& fnptr = *static_cast <MemFnPtr const*> (lua_touserdata (L, lua_upvalueindex (1)));
+      assert (fnptr != 0);
+      ArgList <Params, 2> args (L);
+      Stack <ReturnType>::push (L, FuncTraits <MemFnPtr>::call (tt, fnptr, args));
+      return 1;
+    }
+  };
+
+  /**
+      lua_CFunction to calls for function references.
+  */
+  template <class MemFnPtr,
+            class ReturnType = typename FuncTraits <MemFnPtr>::ReturnType>
+  struct CallMemberRef
+  {
+    typedef typename FuncTraits <MemFnPtr>::ClassType T;
+    typedef typename FuncTraits <MemFnPtr>::Params Params;
+
+    static int f (lua_State* L)
+    {
+      assert (isfulluserdata (L, lua_upvalueindex (1)));
+      T* const t = Userdata::get <T> (L, 1, false);
+      MemFnPtr const& fnptr = *static_cast <MemFnPtr const*> (lua_touserdata (L, lua_upvalueindex (1)));
+      assert (fnptr != 0);
+      ArgList <Params, 2> args (L);
+      Stack <ReturnType>::push (L, FuncTraits <MemFnPtr>::call (t, fnptr, args));
+      LuaRef v (newTable (L));
+      FuncArgs <Params, 0>::refs (v, args);
+      v.push(L);
+      return 2;
+    }
+  };
+
+  template <class MemFnPtr,
+            class ReturnType = typename FuncTraits <MemFnPtr>::ReturnType>
+  struct CallConstMemberRef
+  {
+    typedef typename FuncTraits <MemFnPtr>::ClassType T;
+    typedef typename FuncTraits <MemFnPtr>::Params Params;
+
+    static int f (lua_State* L)
+    {
+      assert (isfulluserdata (L, lua_upvalueindex (1)));
+      T const* const t = Userdata::get <T> (L, 1, true);
+      MemFnPtr const& fnptr = *static_cast <MemFnPtr const*> (lua_touserdata (L, lua_upvalueindex (1)));
+      assert (fnptr != 0);
+      ArgList <Params, 2> args(L);
+      Stack <ReturnType>::push (L, FuncTraits <MemFnPtr>::call (t, fnptr, args));
+      LuaRef v (newTable (L));
+      FuncArgs <Params, 0>::refs (v, args);
+      v.push(L);
+      return 2;
+    }
+  };
+
+  template <class MemFnPtr, class T,
+            class ReturnType = typename FuncTraits <MemFnPtr>::ReturnType>
+  struct CallMemberRefPtr
+  {
+    typedef typename FuncTraits <MemFnPtr>::Params Params;
+
+    static int f (lua_State* L)
+    {
+      assert (isfulluserdata (L, lua_upvalueindex (1)));
+      boost::shared_ptr<T>* const t = Userdata::get <boost::shared_ptr<T> > (L, 1, false);
+      T* const tt = t->get();
+      if (!tt) {
+        return luaL_error (L, "shared_ptr is nil");
+      }
+      MemFnPtr const& fnptr = *static_cast <MemFnPtr const*> (lua_touserdata (L, lua_upvalueindex (1)));
+      assert (fnptr != 0);
+      ArgList <Params, 2> args (L);
+      Stack <ReturnType>::push (L, FuncTraits <MemFnPtr>::call (tt, fnptr, args));
+      LuaRef v (newTable (L));
+      FuncArgs <Params, 0>::refs (v, args);
+      v.push(L);
+      return 2;
+    }
+  };
+
+  template <class MemFnPtr, class T,
+            class ReturnType = typename FuncTraits <MemFnPtr>::ReturnType>
+  struct CallMemberRefWPtr
+  {
+    typedef typename FuncTraits <MemFnPtr>::Params Params;
+
+    static int f (lua_State* L)
+    {
+      assert (isfulluserdata (L, lua_upvalueindex (1)));
+      boost::weak_ptr<T>* const tw = Userdata::get <boost::weak_ptr<T> > (L, 1, false);
+      boost::shared_ptr<T> const t = tw->lock();
+      if (!t) {
+        return luaL_error (L, "cannot lock weak_ptr");
+      }
+      T* const tt = t.get();
+      if (!tt) {
+        return luaL_error (L, "weak_ptr is nil");
+      }
+      MemFnPtr const& fnptr = *static_cast <MemFnPtr const*> (lua_touserdata (L, lua_upvalueindex (1)));
+      assert (fnptr != 0);
+      ArgList <Params, 2> args (L);
+      Stack <ReturnType>::push (L, FuncTraits <MemFnPtr>::call (tt, fnptr, args));
+      LuaRef v (newTable (L));
+      FuncArgs <Params, 0>::refs (v, args);
+      v.push(L);
+      return 2;
+    }
+  };
+
+  //----------------------------------------------------------------------------
+  /**
+      lua_CFunction to call a class member function with no return value.
+
+      The member function pointer is in the first upvalue.
+      The class userdata object is at the top of the Lua stack.
+  */
+  template <class MemFnPtr>
+  struct CallMember <MemFnPtr, void>
+  {
+    typedef typename FuncTraits <MemFnPtr>::ClassType T;
+    typedef typename FuncTraits <MemFnPtr>::Params Params;
+
+    static int f (lua_State* L)
+    {
+      assert (isfulluserdata (L, lua_upvalueindex (1)));
+      T* const t = Userdata::get <T> (L, 1, false);
+      MemFnPtr const& fnptr = *static_cast <MemFnPtr const*> (lua_touserdata (L, lua_upvalueindex (1)));
+      assert (fnptr != 0);
+      ArgList <Params, 2> args (L);
+      FuncTraits <MemFnPtr>::call (t, fnptr, args);
+      return 0;
+    }
+  };
+
+  template <class MemFnPtr>
+  struct CallConstMember <MemFnPtr, void>
+  {
+    typedef typename FuncTraits <MemFnPtr>::ClassType T;
+    typedef typename FuncTraits <MemFnPtr>::Params Params;
+
+    static int f (lua_State* L)
+    {
+      assert (isfulluserdata (L, lua_upvalueindex (1)));
+      T const* const t = Userdata::get <T> (L, 1, true);
+      MemFnPtr const& fnptr = *static_cast <MemFnPtr const*> (lua_touserdata (L, lua_upvalueindex (1)));
+      assert (fnptr != 0);
+      ArgList <Params, 2> args (L);
+      FuncTraits <MemFnPtr>::call (t, fnptr, args);
+      return 0;
+    }
+  };
+
+  template <class MemFnPtr, class T>
+  struct CallMemberPtr <MemFnPtr, T, void>
+  {
+    typedef typename FuncTraits <MemFnPtr>::Params Params;
+
+    static int f (lua_State* L)
+    {
+      assert (isfulluserdata (L, lua_upvalueindex (1)));
+      boost::shared_ptr<T>* const t = Userdata::get <boost::shared_ptr<T> > (L, 1, false);
+      T* const tt = t->get();
+      MemFnPtr const& fnptr = *static_cast <MemFnPtr const*> (lua_touserdata (L, lua_upvalueindex (1)));
+      assert (fnptr != 0);
+      ArgList <Params, 2> args (L);
+      FuncTraits <MemFnPtr>::call (tt, fnptr, args);
+      return 0;
+    }
+  };
+
+  template <class MemFnPtr, class T>
+  struct CallMemberWPtr <MemFnPtr, T, void>
+  {
+    typedef typename FuncTraits <MemFnPtr>::Params Params;
+
+    static int f (lua_State* L)
+    {
+      assert (isfulluserdata (L, lua_upvalueindex (1)));
+      boost::weak_ptr<T>* const tw = Userdata::get <boost::weak_ptr<T> > (L, 1, false);
+      boost::shared_ptr<T> const t = tw->lock();
+      if (!t) {
+        return luaL_error (L, "cannot lock weak_ptr");
+      }
+      T* const tt = t.get();
+      if (!tt) {
+        return luaL_error (L, "weak_ptr is nil");
+      }
+      MemFnPtr const& fnptr = *static_cast <MemFnPtr const*> (lua_touserdata (L, lua_upvalueindex (1)));
+      assert (fnptr != 0);
+      ArgList <Params, 2> args (L);
+      FuncTraits <MemFnPtr>::call (tt, fnptr, args);
+      return 0;
+    }
+  };
+
+  template <class MemFnPtr>
+  struct CallMemberRef <MemFnPtr, void>
+  {
+    typedef typename FuncTraits <MemFnPtr>::ClassType T;
+    typedef typename FuncTraits <MemFnPtr>::Params Params;
+
+    static int f (lua_State* L)
+    {
+      assert (isfulluserdata (L, lua_upvalueindex (1)));
+      T* const t = Userdata::get <T> (L, 1, false);
+      MemFnPtr const& fnptr = *static_cast <MemFnPtr const*> (lua_touserdata (L, lua_upvalueindex (1)));
+      assert (fnptr != 0);
+      ArgList <Params, 2> args (L);
+      FuncTraits <MemFnPtr>::call (t, fnptr, args);
+      LuaRef v (newTable (L));
+      FuncArgs <Params, 0>::refs (v, args);
+      v.push(L);
+      return 1;
+    }
+  };
+
+  template <class MemFnPtr>
+  struct CallConstMemberRef <MemFnPtr, void>
+  {
+    typedef typename FuncTraits <MemFnPtr>::ClassType T;
+    typedef typename FuncTraits <MemFnPtr>::Params Params;
+
+    static int f (lua_State* L)
+    {
+      assert (isfulluserdata (L, lua_upvalueindex (1)));
+      T const* const t = Userdata::get <T> (L, 1, true);
+      MemFnPtr const& fnptr = *static_cast <MemFnPtr const*> (lua_touserdata (L, lua_upvalueindex (1)));
+      assert (fnptr != 0);
+      ArgList <Params, 2> args (L);
+      FuncTraits <MemFnPtr>::call (t, fnptr, args);
+      LuaRef v (newTable (L));
+      FuncArgs <Params, 0>::refs (v, args);
+      v.push(L);
+      return 1;
+    }
+  };
+
+  template <class MemFnPtr, class T>
+  struct CallMemberRefPtr <MemFnPtr, T, void>
+  {
+    typedef typename FuncTraits <MemFnPtr>::Params Params;
+
+    static int f (lua_State* L)
+    {
+      assert (isfulluserdata (L, lua_upvalueindex (1)));
+      boost::shared_ptr<T>* const t = Userdata::get <boost::shared_ptr<T> > (L, 1, false);
+      T* const tt = t->get();
+      if (!tt) {
+        return luaL_error (L, "shared_ptr is nil");
+      }
+      MemFnPtr const& fnptr = *static_cast <MemFnPtr const*> (lua_touserdata (L, lua_upvalueindex (1)));
+      assert (fnptr != 0);
+      ArgList <Params, 2> args (L);
+      FuncTraits <MemFnPtr>::call (tt, fnptr, args);
+      LuaRef v (newTable (L));
+      FuncArgs <Params, 0>::refs (v, args);
+      v.push(L);
+      return 1;
+    }
+  };
+
+  template <class MemFnPtr, class T>
+  struct CallMemberRefWPtr <MemFnPtr, T, void>
+  {
+    typedef typename FuncTraits <MemFnPtr>::Params Params;
+
+    static int f (lua_State* L)
+    {
+      assert (isfulluserdata (L, lua_upvalueindex (1)));
+      boost::weak_ptr<T>* const tw = Userdata::get <boost::weak_ptr<T> > (L, 1, false);
+      boost::shared_ptr<T> const t = tw->lock();
+      if (!t) {
+        return luaL_error (L, "cannot lock weak_ptr");
+      }
+      T* const tt = t.get();
+      if (!tt) {
+        return luaL_error (L, "weak_ptr is nil");
+      }
+      MemFnPtr const& fnptr = *static_cast <MemFnPtr const*> (lua_touserdata (L, lua_upvalueindex (1)));
+      assert (fnptr != 0);
+      ArgList <Params, 2> args (L);
+      FuncTraits <MemFnPtr>::call (tt, fnptr, args);
+      LuaRef v (newTable (L));
+      FuncArgs <Params, 0>::refs (v, args);
+      v.push(L);
+      return 1;
+    }
+  };
+
+  //--------------------------------------------------------------------------
+  /**
+      lua_CFunction to call a class member lua_CFunction.
+
+      The member function pointer is in the first upvalue.
+      The class userdata object is at the top of the Lua stack.
+  */
+  template <class T>
+  struct CallMemberCFunction
+  {
+    static int f (lua_State* L)
+    {
+      assert (isfulluserdata (L, lua_upvalueindex (1)));
+      typedef int (T::*MFP)(lua_State* L);
+      T* const t = Userdata::get <T> (L, 1, false);
+      MFP const& fnptr = *static_cast <MFP const*> (lua_touserdata (L, lua_upvalueindex (1)));
+      assert (fnptr != 0);
+      return (t->*fnptr) (L);
+    }
+  };
+
+  template <class T>
+  struct CallConstMemberCFunction
+  {
+    static int f (lua_State* L)
+    {
+      assert (isfulluserdata (L, lua_upvalueindex (1)));
+      typedef int (T::*MFP)(lua_State* L);
+      T const* const t = Userdata::get <T> (L, 1, true);
+      MFP const& fnptr = *static_cast <MFP const*> (lua_touserdata (L, lua_upvalueindex (1)));
+      assert (fnptr != 0);
+      return (t->*fnptr) (L);
+    }
+  };
+
+  //--------------------------------------------------------------------------
+
+  // SFINAE Helpers
+
+  template <class MemFnPtr, bool isConst>
+  struct CallMemberFunctionHelper
+  {
+    static void add (lua_State* L, char const* name, MemFnPtr mf)
+    {
+      new (lua_newuserdata (L, sizeof (MemFnPtr))) MemFnPtr (mf);
+      lua_pushcclosure (L, &CallConstMember <MemFnPtr>::f, 1);
+      lua_pushvalue (L, -1);
+      rawsetfield (L, -5, name); // const table
+      rawsetfield (L, -3, name); // class table
+    }
+  };
+
+  template <class MemFnPtr>
+  struct CallMemberFunctionHelper <MemFnPtr, false>
+  {
+    static void add (lua_State* L, char const* name, MemFnPtr mf)
+    {
+      new (lua_newuserdata (L, sizeof (MemFnPtr))) MemFnPtr (mf);
+      lua_pushcclosure (L, &CallMember <MemFnPtr>::f, 1);
+      rawsetfield (L, -3, name); // class table
+    }
+  };
+
+  template <class MemFnPtr>
+  struct CallMemberPtrFunctionHelper
+  {
+    typedef typename FuncTraits <MemFnPtr>::ClassType T;
+    static void add (lua_State* L, char const* name, MemFnPtr mf)
+    {
+      new (lua_newuserdata (L, sizeof (MemFnPtr))) MemFnPtr (mf);
+      lua_pushcclosure (L, &CallMemberPtr <MemFnPtr, T>::f, 1);
+      rawsetfield (L, -3, name); // class table
+    }
+  };
+
+  template <class MemFnPtr>
+  struct CallMemberRefPtrFunctionHelper
+  {
+    typedef typename FuncTraits <MemFnPtr>::ClassType T;
+    static void add (lua_State* L, char const* name, MemFnPtr mf)
+    {
+      new (lua_newuserdata (L, sizeof (MemFnPtr))) MemFnPtr (mf);
+      lua_pushcclosure (L, &CallMemberRefPtr <MemFnPtr, T>::f, 1);
+      rawsetfield (L, -3, name); // class table
+    }
+  };
+
+  template <class MemFnPtr>
+  struct CallMemberWPtrFunctionHelper
+  {
+    typedef typename FuncTraits <MemFnPtr>::ClassType T;
+    static void add (lua_State* L, char const* name, MemFnPtr mf)
+    {
+      new (lua_newuserdata (L, sizeof (MemFnPtr))) MemFnPtr (mf);
+      lua_pushcclosure (L, &CallMemberWPtr <MemFnPtr, T>::f, 1);
+      rawsetfield (L, -3, name); // class table
+    }
+  };
+
+  template <class MemFnPtr>
+  struct CallMemberRefWPtrFunctionHelper
+  {
+    typedef typename FuncTraits <MemFnPtr>::ClassType T;
+    static void add (lua_State* L, char const* name, MemFnPtr mf)
+    {
+      new (lua_newuserdata (L, sizeof (MemFnPtr))) MemFnPtr (mf);
+      lua_pushcclosure (L, &CallMemberRefWPtr <MemFnPtr, T>::f, 1);
+      rawsetfield (L, -3, name); // class table
+    }
+  };
+
+  template <class MemFnPtr, bool isConst>
+  struct CallMemberRefFunctionHelper
+  {
+    static void add (lua_State* L, char const* name, MemFnPtr mf)
+    {
+      new (lua_newuserdata (L, sizeof (MemFnPtr))) MemFnPtr (mf);
+      lua_pushcclosure (L, &CallConstMemberRef <MemFnPtr>::f, 1);
+      lua_pushvalue (L, -1);
+      rawsetfield (L, -5, name); // const table
+      rawsetfield (L, -3, name); // class table
+    }
+  };
+
+  template <class MemFnPtr>
+  struct CallMemberRefFunctionHelper <MemFnPtr, false>
+  {
+    static void add (lua_State* L, char const* name, MemFnPtr mf)
+    {
+      new (lua_newuserdata (L, sizeof (MemFnPtr))) MemFnPtr (mf);
+      lua_pushcclosure (L, &CallMemberRef <MemFnPtr>::f, 1);
+      rawsetfield (L, -3, name); // class table
+    }
+  };
+
+  //--------------------------------------------------------------------------
+  /**
+      __gc metamethod for a class.
+  */
+  template <class C>
+  static int gcMetaMethod (lua_State* L)
+  {
+    Userdata* const ud = Userdata::getExact <C> (L, 1);
+    ud->~Userdata ();
+    return 0;
+  }
+
+  static int gcNOOPMethod (lua_State* L)
+  {
+    return 0;
+  }
+
+  //--------------------------------------------------------------------------
+  /**
+      lua_CFunction to get a class data member.
+
+      The pointer-to-member is in the first upvalue.
+      The class userdata object is at the top of the Lua stack.
+  */
+  template <class C, typename T>
+  static int getProperty (lua_State* L)
+  {
+    C const* const c = Userdata::get <C> (L, 1, true);
+    T C::** mp = static_cast <T C::**> (lua_touserdata (L, lua_upvalueindex (1)));
+    Stack <T>::push (L, c->**mp);
+    return 1;
+  }
+
+  //--------------------------------------------------------------------------
+
+  /**
+      lua_CFunction to get a constant (enum)
+  */
+  template <typename U>
+  static int getConst (lua_State* L)
+  {
+    U *v = static_cast <U *> (lua_touserdata (L, lua_upvalueindex (1)));
+    assert (v);
+    Stack <U>::push (L, *v);
+    return 1;
+  }
+
+  //--------------------------------------------------------------------------
+  /**
+      lua_CFunction to set a class data member.
+
+      The pointer-to-member is in the first upvalue.
+      The class userdata object is at the top of the Lua stack.
+  */
+  template <class C, typename T>
+  static int setProperty (lua_State* L)
+  {
+    C* const c = Userdata::get <C> (L, 1, false);
+    T C::** mp = static_cast <T C::**> (lua_touserdata (L, lua_upvalueindex (1)));
+    c->**mp = Stack <T>::get (L, 2);
+    return 0;
+  }
+
+  //--------------------------------------------------------------------------
+
+  // metatable callback for "array[index]"
+  template <typename T>
+  static int array_index (lua_State* L) {
+    T** parray = (T**) luaL_checkudata (L, 1, typeid(T).name());
+    int const index = luabridge::Stack<int>::get (L, 2);
+    luabridge::Stack<T>::push (L, (*parray)[index-1]);
+    return 1;
+  }
+
+  // metatable callback for "array[index] = value"
+  template <typename T>
+  static int array_newindex (lua_State* L) {
+    T** parray = (T**) luaL_checkudata (L, 1, typeid(T).name());
+    int const index = luabridge::Stack<int>::get (L, 2);
+    T const value = luabridge::Stack<T>::get (L, 3);
+    (*parray)[index-1] = value;
+    return 0;
+  }
+
+  template <typename T>
+  static int getArray (lua_State* L) {
+    T *v = luabridge::Stack<T*>::get (L, 1);
+    T** parray = (T**) lua_newuserdata(L, sizeof(T**));
+    *parray = v;
+    luaL_getmetatable(L, typeid(T).name());
+    lua_setmetatable(L, -2);
+    return 1;
+  }
+
+  // copy complete c array to lua table
+  template <typename T>
+  static int getTable (lua_State* L) {
+    T *v = luabridge::Stack<T*>::get (L, 1);
+    const int cnt = luabridge::Stack<int>::get (L, 2);
+    LuaRef t (L);
+    t = newTable (L);
+    for (int i = 0; i < cnt; ++i) {
+      t[i + 1] = v[i];
+    }
+    t.push(L);
+    return 1;
+  }
+
+  // copy lua table to c array
+  template <typename T>
+  static int setTable (lua_State* L) {
+    T *v = luabridge::Stack<T*>::get (L, 1);
+    LuaRef t (LuaRef::fromStack(L, 2));
+    const int cnt = luabridge::Stack<int>::get (L, 3);
+    for (int i = 0; i < cnt; ++i) {
+      v[i] = t[i + 1];
+    }
+    return 0;
+  }
+
+  // return same array at an offset
+  template <typename T>
+  static int offsetArray (lua_State* L) {
+    T *v = luabridge::Stack<T*>::get (L, 1);
+    const unsigned int i = luabridge::Stack<unsigned int>::get (L, 2);
+    Stack <T*>::push (L, &v[i]);
+    return 1;
+  }
+
+  //--------------------------------------------------------------------------
+  /**
+    C++ STL iterators
+   */
+
+  // read lua table into C++ std::list
+  template <class T, class C>
+  static int tableToListHelper (lua_State *L, C * const t)
+  {
+    if (!t) { return luaL_error (L, "invalid pointer to std::list<>/std::vector"); }
+    if (!lua_istable (L, -1)) { return luaL_error (L, "argument is not a table"); }
+    lua_pushvalue (L, -1);
+    lua_pushnil (L);
+    while (lua_next (L, -2)) {
+      lua_pushvalue (L, -2);
+      T const value = Stack<T>::get (L, -2);
+      t->push_back (value);
+      lua_pop (L, 2);
+    }
+    lua_pop (L, 1);
+    lua_pop (L, 2);
+    Stack<C>::push (L, *t);
+    return 1;
+  }
+
+  template <class T, class C>
+  static int tableToList (lua_State *L)
+  {
+    C * const t = Userdata::get<C> (L, 1, false);
+    return tableToListHelper<T, C> (L, t);
+  }
+
+  template <class T, class C>
+  static int ptrTableToList (lua_State *L)
+  {
+    boost::shared_ptr<C> const* const t = Userdata::get<boost::shared_ptr<C> > (L, 1, true);
+    if (!t) { return luaL_error (L, "cannot derefencee shared_ptr"); }
+    return tableToListHelper<T, C> (L, t->get());
+  }
+
+  //--------------------------------------------------------------------------
+  template <class T, class C>
+  static int listIterIter (lua_State *L) {
+    typedef typename C::const_iterator IterType;
+    IterType * const end = static_cast <IterType * const> (lua_touserdata (L, lua_upvalueindex (2)));
+    IterType * const iter = static_cast <IterType * const> (lua_touserdata (L, lua_upvalueindex (1)));
+    assert (end);
+    assert (iter);
+    if ((*iter) == (*end)) {
+      return 0;
+    }
+    Stack <T>::push (L, **iter);
+    ++(*iter);
+    return 1;
+  }
+
+  // generate an iterator
+  template <class T, class C>
+  static int listIterHelper (lua_State *L, C * const t)
+  {
+    if (!t) { return luaL_error (L, "invalid pointer to std::list<>/std::vector"); }
+    typedef typename C::const_iterator IterType;
+    new (lua_newuserdata (L, sizeof (IterType*))) IterType (t->begin());
+    new (lua_newuserdata (L, sizeof (IterType*))) IterType (t->end());
+    lua_pushcclosure (L, listIterIter<T, C>, 2);
+    return 1;
+  }
+
+  template <class T, class C>
+  static int listIter (lua_State *L)
+  {
+    C * const t = Userdata::get <C> (L, 1, false);
+    return listIterHelper<T, C> (L, t);
+  }
+
+  template <class T, class C>
+  static int ptrListIter (lua_State *L)
+  {
+    boost::shared_ptr<C> const* const t = Userdata::get <boost::shared_ptr<C> >(L, 1, true);
+    if (!t) { return luaL_error (L, "cannot derefencee shared_ptr"); }
+    return listIterHelper<T, C> (L, t->get());
+  }
+
+  //--------------------------------------------------------------------------
+  // generate table from std::list
+  template <class T, class C>
+  static int listToTableHelper (lua_State *L, C const* const t)
+  {
+    if (!t) { return luaL_error (L, "invalid pointer to std::list<>/std::vector"); }
+#if 0 // direct lua api
+    lua_createtable(L, t->size(), 0);
+    int newTable = lua_gettop(L);
+    int index = 1;
+    for (typename C::const_iterator iter = t->begin(); iter != t->end(); ++iter, ++index) {
+      Stack<T>::push(L, (*iter));
+      lua_rawseti (L, newTable, index);
+    }
+#else // luabridge way
+    LuaRef v (L);
+    v = newTable (L);
+    int index = 1;
+    for (typename C::const_iterator iter = t->begin(); iter != t->end(); ++iter, ++index) {
+      v[index] = (*iter);
+    }
+    v.push(L);
+#endif
+    return 1;
+  }
+
+  template <class T, class C>
+  static int listToTable (lua_State *L)
+  {
+    C const* const t = Userdata::get <C> (L, 1, true);
+    return listToTableHelper<T, C> (L, t);
+  }
+
+  template <class T, class C>
+  static int ptrListToTable (lua_State *L)
+  {
+    boost::shared_ptr<C> const* const t = Userdata::get <boost::shared_ptr<C> > (L, 1, true);
+    if (!t) { return luaL_error (L, "cannot derefencee shared_ptr"); }
+    return listToTableHelper<T, C> (L, t->get());
+  }
+
+  //--------------------------------------------------------------------------
+  // generate std::map from table
+
+  template <class K, class V>
+  static int tableToMap (lua_State *L)
+  {
+    typedef std::map<K, V> C;
+    C * const t = Userdata::get <C> (L, 1, true);
+    if (!t) { return luaL_error (L, "invalid pointer to std::map"); }
+    if (!lua_istable (L, -1)) { return luaL_error (L, "argument is not a table"); }
+
+    lua_pushvalue (L, -1);
+    lua_pushnil (L);
+    while (lua_next (L, -2)) {
+      lua_pushvalue (L, -2);
+      K const key = Stack<K>::get (L, -1);
+      V const value = Stack<V>::get (L, -2);
+      t->insert (std::pair<K,V> (key, value));
+      //(*t)[key] = value;
+      lua_pop (L, 2);
+    }
+    lua_pop (L, 1);
+    lua_pop (L, 2);
+    Stack<C>::push (L, *t);
+    return 1;
+  }
+
+  // iterate over a std::map
+  template <class K, class V>
+  static int mapIterIter (lua_State *L)
+  {
+    typedef std::map<K, V> C;
+    typedef typename C::const_iterator IterType;
+    IterType * const end = static_cast <IterType * const> (lua_touserdata (L, lua_upvalueindex (2)));
+    IterType * const iter = static_cast <IterType * const> (lua_touserdata (L, lua_upvalueindex (1)));
+    assert (end);
+    assert (iter);
+    if ((*iter) == (*end)) {
+      return 0;
+    }
+    Stack <K>::push (L, (*iter)->first);
+    Stack <V>::push (L, (*iter)->second);
+    ++(*iter);
+    return 2;
+  }
+
+  // generate iterator
+  template <class K, class V>
+  static int mapIter (lua_State *L)
+  {
+    typedef std::map<K, V> C;
+    C * const t = Userdata::get <C> (L, 1, false);
+    if (!t) { return luaL_error (L, "invalid pointer to std::map"); }
+    typedef typename C::const_iterator IterType;
+    new (lua_newuserdata (L, sizeof (IterType*))) IterType (t->begin());
+    new (lua_newuserdata (L, sizeof (IterType*))) IterType (t->end());
+    lua_pushcclosure (L, mapIterIter<K, V>, 2);
+    return 1;
+  }
+
+  // generate table from std::map
+  template <class K, class V>
+  static int mapToTable (lua_State *L)
+  {
+    typedef std::map<K, V> C;
+    C const* const t = Userdata::get <C> (L, 1, true);
+    if (!t) { return luaL_error (L, "invalid pointer to std::map"); }
+
+    LuaRef v (L);
+    v = newTable (L);
+    for (typename C::const_iterator iter = t->begin(); iter != t->end(); ++iter) {
+      v[(*iter).first] = (*iter).second;
+    }
+    v.push(L);
+    return 1;
+  }
+
+  //--------------------------------------------------------------------------
+  // generate std::set from table keys ( table[member] = true )
+  // http://www.lua.org/pil/11.5.html
+
+  template <class T>
+  static int tableToSet (lua_State *L)
+  {
+    typedef std::set<T> C;
+    C * const t = Userdata::get <C> (L, 1, true);
+    if (!t) { return luaL_error (L, "invalid pointer to std::set"); }
+    if (!lua_istable (L, -1)) { return luaL_error (L, "argument is not a table"); }
+
+    lua_pushvalue (L, -1);
+    lua_pushnil (L);
+    while (lua_next (L, -2)) {
+      lua_pushvalue (L, -2);
+      T const member = Stack<T>::get (L, -1);
+      bool const v = Stack<bool>::get (L, -2);
+      if (v) {
+        t->insert (member);
+      }
+      lua_pop (L, 2);
+    }
+    lua_pop (L, 1);
+    lua_pop (L, 2);
+    Stack<C>::push (L, *t);
+    return 1;
+  }
+
+  // iterate over a std::set, explicit "true" value.
+  // compare to http://www.lua.org/pil/11.5.html
+  template <class T>
+  static int setIterIter (lua_State *L)
+  {
+    typedef std::set<T> C;
+    typedef typename C::const_iterator IterType;
+    IterType * const end = static_cast <IterType * const> (lua_touserdata (L, lua_upvalueindex (2)));
+    IterType * const iter = static_cast <IterType * const> (lua_touserdata (L, lua_upvalueindex (1)));
+    assert (end);
+    assert (iter);
+    if ((*iter) == (*end)) {
+      return 0;
+    }
+    Stack <T>::push (L, **iter);
+    Stack <bool>::push (L, true);
+    ++(*iter);
+    return 2;
+  }
+
+  // generate iterator
+  template <class T>
+  static int setIter (lua_State *L)
+  {
+    typedef std::set<T> C;
+    C * const t = Userdata::get <C> (L, 1, false);
+    if (!t) { return luaL_error (L, "invalid pointer to std::set"); }
+    typedef typename C::const_iterator IterType;
+    new (lua_newuserdata (L, sizeof (IterType*))) IterType (t->begin());
+    new (lua_newuserdata (L, sizeof (IterType*))) IterType (t->end());
+    lua_pushcclosure (L, setIterIter<T>, 2);
+    return 1;
+  }
+
+  // generate table from std::set
+  template <class T>
+  static int setToTable (lua_State *L)
+  {
+    typedef std::set<T> C;
+    C const* const t = Userdata::get <C> (L, 1, true);
+    if (!t) { return luaL_error (L, "invalid pointer to std::set"); }
+
+    LuaRef v (L);
+    v = newTable (L);
+    for (typename C::const_iterator iter = t->begin(); iter != t->end(); ++iter) {
+      v[(*iter)] = true;
+    }
+    v.push(L);
+    return 1;
+  }
+
+  //--------------------------------------------------------------------------
+  // bitset { num = true }
+  // compare to http://www.lua.org/pil/11.5.html
+  template <unsigned int T>
+  static int tableToBitSet (lua_State *L)
+  {
+    typedef std::bitset<T> C;
+    C * const t = Userdata::get <C> (L, 1, true);
+    if (!t) { return luaL_error (L, "invalid pointer to std::bitset"); }
+    if (!lua_istable (L, -1)) { return luaL_error (L, "argument is not a table"); }
+
+    lua_pushvalue (L, -1);
+    lua_pushnil (L);
+    while (lua_next (L, -2)) {
+      lua_pushvalue (L, -2);
+      unsigned int const member = Stack<unsigned int>::get (L, -1);
+      bool const v = Stack<bool>::get (L, -2);
+      if (member < T && v) {
+        t->set (member);
+      }
+      lua_pop (L, 2);
+    }
+    lua_pop (L, 1);
+    lua_pop (L, 2);
+    Stack<C>::push (L, *t);
+    return 1;
+  }
+
+  // generate table from std::bitset
+  template <unsigned int T>
+  static int bitSetToTable (lua_State *L)
+  {
+    typedef std::bitset<T> C;
+    C const* const t = Userdata::get <C> (L, 1, true);
+    if (!t) { return luaL_error (L, "invalid pointer to std::bitset"); }
+
+    LuaRef v (L);
+    v = newTable (L);
+    for (unsigned int i = 0; i < T; ++i) {
+      if (t->test (i)) {
+        v[i] = true;
+      }
+    }
+    v.push(L);
+    return 1;
+  }
+
+};
+
+/* vim: set et sw=2: */
diff --git a/libs/lua/LuaBridge/detail/ClassInfo.h b/libs/lua/LuaBridge/detail/ClassInfo.h
new file mode 100644
index 0000000..8507591
--- /dev/null
+++ b/libs/lua/LuaBridge/detail/ClassInfo.h
@@ -0,0 +1,93 @@
+//------------------------------------------------------------------------------
+/*
+  https://github.com/vinniefalco/LuaBridge
+
+  Copyright 2012, Vinnie Falco <vinnie.falco at gmail.com>
+
+  License: The MIT License (http://www.opensource.org/licenses/mit-license.php)
+
+  Permission is hereby granted, free of charge, to any person obtaining a copy
+  of this software and associated documentation files (the "Software"), to deal
+  in the Software without restriction, including without limitation the rights
+  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+  copies of the Software, and to permit persons to whom the Software is
+  furnished to do so, subject to the following conditions:
+
+  The above copyright notice and this permission notice shall be included in all
+  copies or substantial portions of the Software.
+
+  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+  SOFTWARE.
+*/
+//==============================================================================
+
+#ifdef COMPILER_MSVC
+#ifdef LIBARDOUR_DLL_EXPORTS
+# define LuaBridge_API __declspec(dllexport)
+#else
+# define LuaBridge_API __declspec(dllimport)
+#endif
+#else
+# define LuaBridge_API // mingw is sane WRT to static class members
+#endif
+
+/** Unique Lua registry keys for a class.
+
+    Each registered class inserts three keys into the registry, whose
+    values are the corresponding static, class, and const metatables. This
+    allows a quick and reliable lookup for a metatable from a template type.
+*/
+template <class T>
+class LuaBridge_API ClassInfo
+{
+public:
+#ifdef PLATFORM_WINDOWS
+	/* static symbols on windows (even identical symbols) are not
+	 * mapped to the same address when mixing .dll + .exe.
+	 * the implementation is moved to libardour/gtk2_ardour.
+	 */
+  static void const* getStaticKey ();
+  static void const* getClassKey ();
+  static void const* getConstKey ();
+#else
+  /** Get the key for the static table.
+
+      The static table holds the static data members, static properties, and
+      static member functions for a class.
+  */
+  static void const* getStaticKey ()
+  {
+    static char value;
+    return &value;
+  }
+
+  /** Get the key for the class table.
+
+      The class table holds the data members, properties, and member functions
+      of a class. Read-only data and properties, and const member functions are
+      also placed here (to save a lookup in the const table).
+  */
+  static void const* getClassKey ()
+  {
+    static char value;
+    return &value;
+  }
+
+  /** Get the key for the const table.
+
+      The const table holds read-only data members and properties, and const
+      member functions of a class.
+  */
+  static void const* getConstKey ()
+  {
+    static char value;
+    return &value;
+  }
+#endif
+};
+
diff --git a/libs/lua/LuaBridge/detail/Constructor.h b/libs/lua/LuaBridge/detail/Constructor.h
new file mode 100644
index 0000000..bcd4a37
--- /dev/null
+++ b/libs/lua/LuaBridge/detail/Constructor.h
@@ -0,0 +1,204 @@
+//------------------------------------------------------------------------------
+/*
+  https://github.com/vinniefalco/LuaBridge
+
+  Copyright 2012, Vinnie Falco <vinnie.falco at gmail.com>
+  Copyright 2007, Nathan Reed
+
+  License: The MIT License (http://www.opensource.org/licenses/mit-license.php)
+
+  Permission is hereby granted, free of charge, to any person obtaining a copy
+  of this software and associated documentation files (the "Software"), to deal
+  in the Software without restriction, including without limitation the rights
+  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+  copies of the Software, and to permit persons to whom the Software is
+  furnished to do so, subject to the following conditions:
+
+  The above copyright notice and this permission notice shall be included in all
+  copies or substantial portions of the Software.
+
+  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+  SOFTWARE.
+*/
+//==============================================================================
+
+#ifndef LUABRIDGE_CONSTRUCTOR_HEADER
+#define LUABRIDGE_CONSTRUCTOR_HEADER
+
+/*
+* Constructor generators.  These templates allow you to call operator new and
+* pass the contents of a type/value list to the Constructor.  Like the
+* function pointer containers, these are only defined up to 8 parameters.
+*/
+
+/** Constructor generators.
+
+    These templates call operator new with the contents of a type/value
+    list passed to the Constructor with up to 8 parameters. Two versions
+    of call() are provided. One performs a regular new, the other performs
+    a placement new.
+*/
+template <class T, typename List>
+struct Constructor {};
+
+template <class T>
+struct Constructor <T, None>
+{
+  static T* call (TypeListValues <None> const&)
+  {
+    return new T;
+  }
+  static T* call (void* mem, TypeListValues <None> const&)
+  {
+    return new (mem) T;
+  }
+};
+
+template <class T, class P1>
+struct Constructor <T, TypeList <P1> >
+{
+  static T* call (const TypeListValues<TypeList <P1> > &tvl)
+  {
+    return new T(tvl.hd);
+  }
+  static T* call (void* mem, const TypeListValues<TypeList <P1> > &tvl)
+  {
+    return new (mem) T(tvl.hd);
+  }
+};
+
+template <class T, class P1, class P2>
+struct Constructor <T, TypeList <P1, TypeList <P2> > >
+{
+  static T* call (const TypeListValues<TypeList <P1, TypeList <P2> > > &tvl)
+  {
+    return new T(tvl.hd, tvl.tl.hd);
+  }
+  static T* call (void* mem, const TypeListValues<TypeList <P1, TypeList <P2> > > &tvl)
+  {
+    return new (mem) T(tvl.hd, tvl.tl.hd);
+  }
+};
+
+template <class T, class P1, class P2, class P3>
+struct Constructor <T, TypeList <P1, TypeList <P2, TypeList <P3> > > >
+{
+  static T* call (const TypeListValues<TypeList <P1, TypeList <P2,
+    TypeList <P3> > > > &tvl)
+  {
+    return new T(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd);
+  }
+  static T* call (void* mem, const TypeListValues<TypeList <P1, TypeList <P2,
+    TypeList <P3> > > > &tvl)
+  {
+    return new (mem) T(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd);
+  }
+};
+
+template <class T, class P1, class P2, class P3, class P4>
+struct Constructor <T, TypeList <P1, TypeList <P2, TypeList <P3,
+  TypeList <P4> > > > >
+{
+  static T* call (const TypeListValues<TypeList <P1, TypeList <P2,
+    TypeList <P3, TypeList <P4> > > > > &tvl)
+  {
+    return new T(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd);
+  }
+  static T* call (void* mem, const TypeListValues<TypeList <P1, TypeList <P2,
+    TypeList <P3, TypeList <P4> > > > > &tvl)
+  {
+    return new (mem) T(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd);
+  }
+};
+
+template <class T, class P1, class P2, class P3, class P4,
+  class P5>
+struct Constructor <T, TypeList <P1, TypeList <P2, TypeList <P3,
+  TypeList <P4, TypeList <P5> > > > > >
+{
+  static T* call (const TypeListValues<TypeList <P1, TypeList <P2,
+    TypeList <P3, TypeList <P4, TypeList <P5> > > > > > &tvl)
+  {
+    return new T(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd,
+      tvl.tl.tl.tl.tl.hd);
+  }
+  static T* call (void* mem, const TypeListValues<TypeList <P1, TypeList <P2,
+    TypeList <P3, TypeList <P4, TypeList <P5> > > > > > &tvl)
+  {
+    return new (mem) T(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd,
+      tvl.tl.tl.tl.tl.hd);
+  }
+};
+
+template <class T, class P1, class P2, class P3, class P4,
+  class P5, class P6>
+struct Constructor <T, TypeList <P1, TypeList <P2, TypeList <P3,
+  TypeList <P4, TypeList <P5, TypeList <P6> > > > > > >
+{
+  static T* call (const TypeListValues<TypeList <P1, TypeList <P2,
+    TypeList <P3, TypeList <P4, TypeList <P5, TypeList <P6> > > > > > > &tvl)
+  {
+    return new T(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd,
+      tvl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.hd);
+  }
+  static T* call (void* mem, const TypeListValues<TypeList <P1, TypeList <P2,
+    TypeList <P3, TypeList <P4, TypeList <P5, TypeList <P6> > > > > > > &tvl)
+  {
+    return new (mem) T(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd,
+      tvl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.hd);
+  }
+};
+
+template <class T, class P1, class P2, class P3, class P4,
+  class P5, class P6, class P7>
+struct Constructor <T, TypeList <P1, TypeList <P2, TypeList <P3,
+  TypeList <P4, TypeList <P5, TypeList <P6, TypeList <P7> > > > > > > >
+{
+  static T* call (const TypeListValues<TypeList <P1, TypeList <P2,
+    TypeList <P3, TypeList <P4, TypeList <P5, TypeList <P6,
+    TypeList <P7> > > > > > > > &tvl)
+  {
+    return new T(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd,
+      tvl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.hd,
+      tvl.tl.tl.tl.tl.tl.tl.hd);
+  }
+  static T* call (void* mem, const TypeListValues<TypeList <P1, TypeList <P2,
+    TypeList <P3, TypeList <P4, TypeList <P5, TypeList <P6,
+    TypeList <P7> > > > > > > > &tvl)
+  {
+    return new (mem) T(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd,
+      tvl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.hd,
+      tvl.tl.tl.tl.tl.tl.tl.hd);
+  }
+};
+
+template <class T, class P1, class P2, class P3, class P4,
+  class P5, class P6, class P7, class P8>
+struct Constructor <T, TypeList <P1, TypeList <P2, TypeList <P3,
+  TypeList <P4, TypeList <P5, TypeList <P6, TypeList <P7,
+  TypeList <P8> > > > > > > > >
+{
+  static T* call (const TypeListValues<TypeList <P1, TypeList <P2,
+    TypeList <P3, TypeList <P4, TypeList <P5, TypeList <P6,
+    TypeList <P7, TypeList <P8> > > > > > > > > &tvl)
+  {
+    return new T(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd,
+      tvl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.hd,
+      tvl.tl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.tl.hd);
+  }
+  static T* call (void* mem, const TypeListValues<TypeList <P1, TypeList <P2,
+    TypeList <P3, TypeList <P4, TypeList <P5, TypeList <P6,
+    TypeList <P7, TypeList <P8> > > > > > > > > &tvl)
+  {
+    return new (mem) T(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd,
+      tvl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.hd,
+      tvl.tl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.tl.hd);
+  }
+};
+
+#endif
diff --git a/libs/lua/LuaBridge/detail/FuncArgs.h b/libs/lua/LuaBridge/detail/FuncArgs.h
new file mode 100644
index 0000000..38d0543
--- /dev/null
+++ b/libs/lua/LuaBridge/detail/FuncArgs.h
@@ -0,0 +1,51 @@
+//------------------------------------------------------------------------------
+/*
+  https://github.com/vinniefalco/LuaBridge
+
+  Copyright 2016, Robin Gareus <robin at gareus.org>
+  Copyright 2012, Vinnie Falco <vinnie.falco at gmail.com>
+
+  License: The MIT License (http://www.opensource.org/licenses/mit-license.php)
+
+  Permission is hereby granted, free of charge, to any person obtaining a copy
+  of this software and associated documentation files (the "Software"), to deal
+  in the Software without restriction, including without limitation the rights
+  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+  copies of the Software, and to permit persons to whom the Software is
+  furnished to do so, subject to the following conditions:
+
+  The above copyright notice and this permission notice shall be included in all
+  copies or substantial portions of the Software.
+
+  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+  SOFTWARE.
+*/
+//==============================================================================
+
+template <typename List, int Start = 1>
+struct FuncArgs
+{
+};
+
+template <int Start>
+struct FuncArgs<None, Start>
+{
+  static void refs (LuaRef, TypeListValues <None>)
+	{
+	}
+};
+
+template <typename Head, typename Tail, int Start>
+struct FuncArgs<TypeList <Head, Tail>, Start >
+{
+  static void refs (LuaRef l, TypeListValues <TypeList <Head, Tail> > tvl)
+	{
+		l[Start + 1] = tvl.hd;
+    FuncArgs <Tail, Start + 1>::refs (l, tvl.tl);
+	}
+};
diff --git a/libs/lua/LuaBridge/detail/FuncTraits.h b/libs/lua/LuaBridge/detail/FuncTraits.h
new file mode 100644
index 0000000..5cece7b
--- /dev/null
+++ b/libs/lua/LuaBridge/detail/FuncTraits.h
@@ -0,0 +1,943 @@
+//------------------------------------------------------------------------------
+/*
+  https://github.com/vinniefalco/LuaBridge
+
+  Copyright 2012, Vinnie Falco <vinnie.falco at gmail.com>
+
+  License: The MIT License (http://www.opensource.org/licenses/mit-license.php)
+
+  Permission is hereby granted, free of charge, to any person obtaining a copy
+  of this software and associated documentation files (the "Software"), to deal
+  in the Software without restriction, including without limitation the rights
+  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+  copies of the Software, and to permit persons to whom the Software is
+  furnished to do so, subject to the following conditions:
+
+  The above copyright notice and this permission notice shall be included in all
+  copies or substantial portions of the Software.
+
+  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+  SOFTWARE.
+*/
+//==============================================================================
+
+/**
+  Since the throw specification is part of a function signature, the FuncTraits
+  family of templates needs to be specialized for both types. The
+  LUABRIDGE_THROWSPEC macro controls whether we use the 'throw ()' form, or
+  'noexcept' (if C++11 is available) to distinguish the functions.
+*/
+#if defined (__APPLE_CPP__) || defined(__APPLE_CC__) || defined(__clang__) || defined(__GNUC__) || \
+    (defined (_MSC_VER) && (_MSC_VER >= 1700))
+// Do not define LUABRIDGE_THROWSPEC since the Xcode and gcc  compilers do not
+// distinguish the throw specification in the function signature.
+#else
+// Visual Studio 10 and earlier pay too much mind to useless throw() spec.
+//
+# define LUABRIDGE_THROWSPEC throw()
+#endif
+
+//==============================================================================
+/**
+    Traits for function pointers.
+
+    There are three types of functions: global, non-const member, and const
+    member. These templates determine the type of function, which class type it
+    belongs to if it is a class member, the const-ness if it is a member
+    function, and the type information for the return value and argument list.
+
+    Expansions are provided for functions with up to 8 parameters. This can be
+    manually extended, or expanded to an arbitrary amount using C++11 features.
+*/
+template <class MemFn, class D = MemFn>
+struct FuncTraits
+{
+};
+
+/* Ordinary function pointers. */
+
+template <class R, class D>
+struct FuncTraits <R (*) (), D>
+{
+  static bool const isMemberFunction = false;
+  typedef D DeclType;
+  typedef R ReturnType;
+  typedef None Params;
+  static R call (D fp, TypeListValues <Params>)
+  {
+    return fp ();
+  }
+};
+
+template <class R, class P1, class D>
+struct FuncTraits <R (*) (P1), D>
+{
+  static bool const isMemberFunction = false;
+  typedef D DeclType;
+  typedef R ReturnType;
+  typedef TypeList <P1> Params;
+  static R call (D fp, TypeListValues <Params>& tvl)
+  {
+    return fp (tvl.hd);
+  }
+};
+
+template <class R, class P1, class P2, class D>
+struct FuncTraits <R (*) (P1, P2), D>
+{
+  static bool const isMemberFunction = false;
+  typedef D DeclType;
+  typedef R ReturnType;
+  typedef TypeList <P1, TypeList <P2> > Params;
+  static R call (D fp, TypeListValues <Params>& tvl)
+  {
+    return fp (tvl.hd, tvl.tl.hd);
+  }
+};
+
+template <class R, class P1, class P2, class P3, class D>
+struct FuncTraits <R (*) (P1, P2, P3), D>
+{
+  static bool const isMemberFunction = false;
+  typedef D DeclType;
+  typedef R ReturnType;
+  typedef TypeList <P1, TypeList <P2, TypeList <P3> > > Params;
+  static R call (D fp, TypeListValues <Params>& tvl)
+  {
+    return fp (tvl.hd, tvl.tl.hd, tvl.tl.tl.hd);
+  }
+};
+
+template <class R, class P1, class P2, class P3, class P4, class D>
+struct FuncTraits <R (*) (P1, P2, P3, P4), D>
+{
+  static bool const isMemberFunction = false;
+  typedef D DeclType;
+  typedef R ReturnType;
+  typedef TypeList <P1, TypeList <P2, TypeList <P3, TypeList <P4> > > > Params;
+  static R call (D fp, TypeListValues <Params>& tvl)
+  {
+    return fp (tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd);
+  }
+};
+
+template <class R, class P1, class P2, class P3, class P4, class P5, class D>
+struct FuncTraits <R (*) (P1, P2, P3, P4, P5), D>
+{
+  static bool const isMemberFunction = false;
+  typedef D DeclType;
+  typedef R ReturnType;
+  typedef TypeList <P1, TypeList <P2, TypeList <P3, TypeList <P4, TypeList <P5> > > > > Params;
+  static R call (D fp, TypeListValues <Params>& tvl)
+  {
+    return fp (tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.hd);
+  }
+};
+
+template <class R, class P1, class P2, class P3, class P4, class P5, class P6, class D>
+struct FuncTraits <R (*) (P1, P2, P3, P4, P5, P6), D>
+{
+  static bool const isMemberFunction = false;
+  typedef D DeclType;
+  typedef R ReturnType;
+  typedef TypeList <P1, TypeList <P2, TypeList <P3, TypeList <P4, TypeList <P5,  TypeList <P6> > > > > > Params;
+  static R call (D fp, TypeListValues <Params>& tvl)
+  {
+    return fp (tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.hd);
+  }
+};
+
+template <class R, class P1, class P2, class P3, class P4, class P5, class P6, class P7, class D>
+struct FuncTraits <R (*) (P1, P2, P3, P4, P5, P6, P7), D>
+{
+  static bool const isMemberFunction = false;
+  typedef D DeclType;
+  typedef R ReturnType;
+  typedef TypeList <P1, TypeList <P2, TypeList <P3, TypeList <P4, TypeList <P5, TypeList <P6, TypeList <P7> > > > > > > Params;
+  static R call (D fp, TypeListValues <Params>& tvl)
+  {
+    return fp (tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.hd);
+  }
+};
+
+template <class R, class P1, class P2, class P3, class P4, class P5, class P6, class P7, class P8, class D>
+struct FuncTraits <R (*) (P1, P2, P3, P4, P5, P6, P7, P8), D>
+{
+  static bool const isMemberFunction = false;
+  typedef D DeclType;
+  typedef R ReturnType;
+  typedef TypeList <P1, TypeList <P2, TypeList <P3, TypeList <P4, TypeList <P5, TypeList <P6, TypeList <P7, TypeList <P8> > > > > > > > Params;
+  static R call (D fp, TypeListValues <Params>& tvl)
+  {
+    return fp (tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.tl.hd);
+  }
+};
+
+template <class R, class P1, class P2, class P3, class P4, class P5, class P6, class P7, class P8, class P9, class D>
+struct FuncTraits <R (*) (P1, P2, P3, P4, P5, P6, P7, P8, P9), D>
+{
+  static bool const isMemberFunction = false;
+  typedef D DeclType;
+  typedef R ReturnType;
+  typedef TypeList <P1, TypeList <P2, TypeList <P3, TypeList <P4, TypeList <P5, TypeList <P6, TypeList <P7, TypeList <P8, TypeList <P9> > > > > > > > > Params;
+  static R call (D fp, TypeListValues <Params>& tvl)
+  {
+    return fp (tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.tl.tl.hd);
+  }
+};
+
+
+/* Non-const member function pointers. */
+
+template <class T, class R, class D>
+struct FuncTraits <R (T::*) (), D>
+{
+  static bool const isMemberFunction = true;
+  static bool const isConstMemberFunction = false;
+  typedef D DeclType;
+  typedef T ClassType;
+  typedef R ReturnType;
+  typedef None Params;
+  static R call (T* obj, D fp, TypeListValues <Params>)
+  {
+    return (obj->*fp)();
+  }
+};
+
+template <class T, class R, class P1, class D>
+struct FuncTraits <R (T::*) (P1), D>
+{
+  static bool const isMemberFunction = true;
+  static bool const isConstMemberFunction = false;
+  typedef D DeclType;
+  typedef T ClassType;
+  typedef R ReturnType;
+  typedef TypeList <P1> Params;
+  static R call (T* obj, D fp, TypeListValues <Params> &tvl)
+  {
+    return (obj->*fp)(tvl.hd);
+  }
+};
+
+template <class T, class R, class P1, class P2, class D>
+struct FuncTraits <R (T::*) (P1, P2), D>
+{
+  static bool const isMemberFunction = true;
+  static bool const isConstMemberFunction = false;
+  typedef D DeclType;
+  typedef T ClassType;
+  typedef R ReturnType;
+  typedef TypeList <P1, TypeList <P2> > Params;
+  static R call (T* obj, D fp, TypeListValues <Params>& tvl)
+  {
+    return (obj->*fp)(tvl.hd, tvl.tl.hd);
+  }
+};
+
+template <class T, class R, class P1, class P2, class P3, class D>
+struct FuncTraits <R (T::*) (P1, P2, P3), D>
+{
+  static bool const isMemberFunction = true;
+  static bool const isConstMemberFunction = false;
+  typedef D DeclType;
+  typedef T ClassType;
+  typedef R ReturnType;
+  typedef TypeList <P1, TypeList <P2, TypeList <P3> > > Params;
+  static R call (T* obj, D fp, TypeListValues <Params>& tvl)
+  {
+    return (obj->*fp)(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd);
+  }
+};
+
+template <class T, class R, class P1, class P2, class P3, class P4, class D>
+struct FuncTraits <R (T::*) (P1, P2, P3, P4), D>
+{
+  static bool const isMemberFunction = true;
+  static bool const isConstMemberFunction = false;
+  typedef D DeclType;
+  typedef T ClassType;
+  typedef R ReturnType;
+  typedef TypeList <P1, TypeList <P2, TypeList <P3, TypeList <P4> > > > Params;
+  static R call (T* obj, D fp, TypeListValues <Params>& tvl)
+  {
+    return (obj->*fp)(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd);
+  }
+};
+
+template <class T, class R, class P1, class P2, class P3, class P4, class P5, class D>
+struct FuncTraits <R (T::*) (P1, P2, P3, P4, P5), D>
+{
+  static bool const isMemberFunction = true;
+  static bool const isConstMemberFunction = false;
+  typedef D DeclType;
+  typedef T ClassType;
+  typedef R ReturnType;
+  typedef TypeList <P1, TypeList <P2, TypeList <P3, TypeList <P4, TypeList <P5> > > > > Params;
+  static R call (T* obj, D fp, TypeListValues <Params>& tvl)
+  {
+    return (obj->*fp)(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.hd);
+  }
+};
+
+template <class T, class R, class P1, class P2, class P3, class P4, class P5, class P6, class D>
+struct FuncTraits <R (T::*) (P1, P2, P3, P4, P5, P6), D>
+{
+  static bool const isMemberFunction = true;
+  static bool const isConstMemberFunction = false;
+  typedef D DeclType;
+  typedef T ClassType;
+  typedef R ReturnType;
+  typedef TypeList <P1, TypeList <P2, TypeList <P3, TypeList <P4, TypeList <P5, TypeList <P6> > > > > > Params;
+  static R call (T* obj, D fp, TypeListValues <Params>& tvl)
+  {
+    return (obj->*fp)(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.hd);
+  }
+};
+
+template <class T, class R, class P1, class P2, class P3, class P4, class P5, class P6, class P7, class D>
+struct FuncTraits <R (T::*) (P1, P2, P3, P4, P5, P6, P7), D>
+{
+  static bool const isMemberFunction = true;
+  static bool const isConstMemberFunction = false;
+  typedef D DeclType;
+  typedef T ClassType;
+  typedef R ReturnType;
+  typedef TypeList <P1, TypeList <P2, TypeList <P3, TypeList <P4, TypeList <P5, TypeList <P6, TypeList <P7> > > > > > > Params;
+  static R call (T* obj, D fp, TypeListValues <Params>& tvl)
+  {
+    return (obj->*fp)(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.hd);
+  }
+};
+
+template <class T, class R, class P1, class P2, class P3, class P4, class P5, class P6, class P7, class P8, class D>
+struct FuncTraits <R (T::*) (P1, P2, P3, P4, P5, P6, P7, P8), D>
+{
+  static bool const isMemberFunction = true;
+  static bool const isConstMemberFunction = false;
+  typedef D DeclType;
+  typedef T ClassType;
+  typedef R ReturnType;
+  typedef TypeList <P1, TypeList <P2, TypeList <P3, TypeList <P4, TypeList <P5, TypeList <P6, TypeList <P7, TypeList <P8> > > > > > > > Params;
+  static R call (T* obj, D fp, TypeListValues <Params>& tvl)
+  {
+    return (obj->*fp)(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.tl.hd);
+  }
+};
+
+template <class T, class R, class P1, class P2, class P3, class P4, class P5, class P6, class P7, class P8, class P9, class D>
+struct FuncTraits <R (T::*) (P1, P2, P3, P4, P5, P6, P7, P8, P9), D>
+{
+  static bool const isMemberFunction = true;
+  static bool const isConstMemberFunction = false;
+  typedef D DeclType;
+  typedef T ClassType;
+  typedef R ReturnType;
+  typedef TypeList <P1, TypeList <P2, TypeList <P3, TypeList <P4, TypeList <P5, TypeList <P6, TypeList <P7, TypeList <P8, TypeList <P9> > > > > > > > > Params;
+  static R call (T* obj, D fp, TypeListValues <Params>& tvl)
+  {
+    return (obj->*fp)(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.tl.tl.hd);
+  }
+};
+
+
+/* Const member function pointers. */
+
+template <class T, class R, class D>
+struct FuncTraits <R (T::*) () const, D>
+{
+  static bool const isMemberFunction = true;
+  static bool const isConstMemberFunction = true;
+  typedef D DeclType;
+  typedef T ClassType;
+  typedef R ReturnType;
+  typedef None Params;
+  static R call (T const* obj, D fp, TypeListValues <Params>)
+  {
+    return (obj->*fp)();
+  }
+};
+
+template <class T, class R, class P1, class D>
+struct FuncTraits <R (T::*) (P1) const, D>
+{
+  static bool const isMemberFunction = true;
+  static bool const isConstMemberFunction = true;
+  typedef D DeclType;
+  typedef T ClassType;
+  typedef R ReturnType;
+  typedef TypeList <P1> Params;
+  static R call (T const* obj, D fp, TypeListValues <Params>& tvl)
+  {
+    return (obj->*fp)(tvl.hd);
+  }
+};
+
+template <class T, class R, class P1, class P2, class D>
+struct FuncTraits <R (T::*) (P1, P2) const, D>
+{
+  static bool const isMemberFunction = true;
+  static bool const isConstMemberFunction = true;
+  typedef D DeclType;
+  typedef T ClassType;
+  typedef R ReturnType;
+  typedef TypeList <P1, TypeList <P2> > Params;
+  static R call (T const* obj, R (T::*fp) (P1, P2) const,
+    TypeListValues <Params>& tvl)
+  {
+    return (obj->*fp)(tvl.hd, tvl.tl.hd);
+  }
+};
+
+template <class T, class R, class P1, class P2, class P3, class D>
+struct FuncTraits <R (T::*) (P1, P2, P3) const, D>
+{
+  static bool const isMemberFunction = true;
+  static bool const isConstMemberFunction = true;
+  typedef D DeclType;
+  typedef T ClassType;
+  typedef R ReturnType;
+  typedef TypeList <P1, TypeList <P2, TypeList <P3> > > Params;
+  static R call (T const* obj, D fp, TypeListValues <Params>& tvl)
+  {
+    return (obj->*fp)(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd);
+  }
+};
+
+template <class T, class R, class P1, class P2, class P3, class P4, class D>
+struct FuncTraits <R (T::*) (P1, P2, P3, P4) const, D>
+{
+  static bool const isMemberFunction = true;
+  static bool const isConstMemberFunction = true;
+  typedef D DeclType;
+  typedef T ClassType;
+  typedef R ReturnType;
+  typedef TypeList <P1, TypeList <P2, TypeList <P3, TypeList <P4> > > > Params;
+  static R call (T const* obj, D fp, TypeListValues <Params>& tvl)
+  {
+    return (obj->*fp)(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd);
+  }
+};
+
+template <class T, class R, class P1, class P2, class P3, class P4, class P5, class D>
+struct FuncTraits <R (T::*) (P1, P2, P3, P4, P5) const, D>
+{
+  static bool const isMemberFunction = true;
+  static bool const isConstMemberFunction = true;
+  typedef D DeclType;
+  typedef T ClassType;
+  typedef R ReturnType;
+  typedef TypeList <P1, TypeList <P2, TypeList <P3, TypeList <P4, TypeList <P5> > > > > Params;
+  static R call (T const* obj, D fp, TypeListValues <Params>& tvl)
+  {
+    return (obj->*fp)(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.hd);
+  }
+};
+
+template <class T, class R, class P1, class P2, class P3, class P4, class P5, class P6, class D>
+struct FuncTraits <R (T::*) (P1, P2, P3, P4, P5, P6) const, D>
+{
+  static bool const isMemberFunction = true;
+  static bool const isConstMemberFunction = true;
+  typedef D DeclType;
+  typedef T ClassType;
+  typedef R ReturnType;
+  typedef TypeList <P1, TypeList <P2, TypeList <P3, TypeList <P4, TypeList <P5, TypeList <P6> > > > > > Params;
+  static R call (T const* obj, D fp, TypeListValues <Params>& tvl)
+  {
+    return (obj->*fp)(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.hd);
+  }
+};
+
+template <class T, class R, class P1, class P2, class P3, class P4, class P5, class P6, class P7, class D>
+struct FuncTraits <R (T::*) (P1, P2, P3, P4, P5, P6, P7) const, D>
+{
+  static bool const isMemberFunction = true;
+  static bool const isConstMemberFunction = true;
+  typedef D DeclType;
+  typedef T ClassType;
+  typedef R ReturnType;
+  typedef TypeList <P1, TypeList <P2, TypeList <P3, TypeList <P4, TypeList <P5, TypeList <P6, TypeList <P7> > > > > > > Params;
+  static R call (T const* obj, D fp, TypeListValues <Params>& tvl)
+  {
+    return (obj->*fp)(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.hd);
+  }
+};
+
+template <class T, class R, class P1, class P2, class P3, class P4, class P5, class P6, class P7, class P8, class D>
+struct FuncTraits <R (T::*) (P1, P2, P3, P4, P5, P6, P7, P8) const, D>
+{
+  static bool const isMemberFunction = true;
+  static bool const isConstMemberFunction = true;
+  typedef D DeclType;
+  typedef T ClassType;
+  typedef R ReturnType;
+  typedef TypeList <P1, TypeList <P2, TypeList <P3, TypeList <P4, TypeList <P5, TypeList <P6, TypeList <P7, TypeList <P8> > > > > > > > Params;
+  static R call (T const* obj, D fp, TypeListValues <Params>& tvl)
+  {
+    return (obj->*fp)(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.tl.hd);
+  }
+};
+
+template <class T, class R, class P1, class P2, class P3, class P4, class P5, class P6, class P7, class P8, class P9, class D>
+struct FuncTraits <R (T::*) (P1, P2, P3, P4, P5, P6, P7, P8, P9) const, D>
+{
+  static bool const isMemberFunction = true;
+  static bool const isConstMemberFunction = true;
+  typedef D DeclType;
+  typedef T ClassType;
+  typedef R ReturnType;
+  typedef TypeList <P1, TypeList <P2, TypeList <P3, TypeList <P4, TypeList <P5, TypeList <P6, TypeList <P7, TypeList <P8, TypeList <P9> > > > > > > > > Params;
+  static R call (T const* obj, D fp, TypeListValues <Params>& tvl)
+  {
+    return (obj->*fp)(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.tl.tl.hd);
+  }
+};
+
+
+#if defined (LUABRIDGE_THROWSPEC)
+
+/* Ordinary function pointers. */
+
+template <class R, class D>
+struct FuncTraits <R (*) () LUABRIDGE_THROWSPEC, D>
+{
+  static bool const isMemberFunction = false;
+  typedef D DeclType;
+  typedef R ReturnType;
+  typedef None Params;
+  static R call (D fp, TypeListValues <Params> const&)
+  {
+    return fp ();
+  }
+};
+
+template <class R, class P1, class D>
+struct FuncTraits <R (*) (P1) LUABRIDGE_THROWSPEC, D>
+{
+  static bool const isMemberFunction = false;
+  typedef D DeclType;
+  typedef R ReturnType;
+  typedef TypeList <P1> Params;
+  static R call (D fp, TypeListValues <Params>& tvl)
+  {
+    return fp (tvl.hd);
+  }
+};
+
+template <class R, class P1, class P2, class D>
+struct FuncTraits <R (*) (P1, P2) LUABRIDGE_THROWSPEC, D>
+{
+  static bool const isMemberFunction = false;
+  typedef D DeclType;
+  typedef R ReturnType;
+  typedef TypeList <P1, TypeList <P2> > Params;
+  static R call (D fp, TypeListValues <Params>& tvl)
+  {
+    return fp (tvl.hd, tvl.tl.hd);
+  }
+};
+
+template <class R, class P1, class P2, class P3, class D>
+struct FuncTraits <R (*) (P1, P2, P3) LUABRIDGE_THROWSPEC, D>
+{
+  static bool const isMemberFunction = false;
+  typedef D DeclType;
+  typedef R ReturnType;
+  typedef TypeList <P1, TypeList <P2, TypeList <P3> > > Params;
+  static R call (D fp, TypeListValues <Params>& tvl)
+  {
+    return fp (tvl.hd, tvl.tl.hd, tvl.tl.tl.hd);
+  }
+};
+
+template <class R, class P1, class P2, class P3, class P4, class D>
+struct FuncTraits <R (*) (P1, P2, P3, P4) LUABRIDGE_THROWSPEC, D>
+{
+  static bool const isMemberFunction = false;
+  typedef D DeclType;
+  typedef R ReturnType;
+  typedef TypeList <P1, TypeList <P2, TypeList <P3, TypeList <P4> > > > Params;
+  static R call (D fp, TypeListValues <Params>& tvl)
+  {
+    return fp (tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd);
+  }
+};
+
+template <class R, class P1, class P2, class P3, class P4, class P5, class D>
+struct FuncTraits <R (*) (P1, P2, P3, P4, P5) LUABRIDGE_THROWSPEC, D>
+{
+  static bool const isMemberFunction = false;
+  typedef D DeclType;
+  typedef R ReturnType;
+  typedef TypeList <P1, TypeList <P2, TypeList <P3, TypeList <P4, TypeList <P5> > > > > Params;
+  static R call (D fp, TypeListValues <Params>& tvl)
+  {
+    return fp (tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.hd);
+  }
+};
+
+template <class R, class P1, class P2, class P3, class P4, class P5, class P6, class D>
+struct FuncTraits <R (*) (P1, P2, P3, P4, P5, P6) LUABRIDGE_THROWSPEC, D>
+{
+  static bool const isMemberFunction = false;
+  typedef D DeclType;
+  typedef R ReturnType;
+  typedef TypeList <P1, TypeList <P2, TypeList <P3, TypeList <P4, TypeList <P5,  TypeList <P6> > > > > > Params;
+  static R call (D fp, TypeListValues <Params>& tvl)
+  {
+    return fp (tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.hd);
+  }
+};
+
+template <class R, class P1, class P2, class P3, class P4, class P5, class P6, class P7, class D>
+struct FuncTraits <R (*) (P1, P2, P3, P4, P5, P6, P7) LUABRIDGE_THROWSPEC, D>
+{
+  static bool const isMemberFunction = false;
+  typedef D DeclType;
+  typedef R ReturnType;
+  typedef TypeList <P1, TypeList <P2, TypeList <P3, TypeList <P4, TypeList <P5, TypeList <P6, TypeList <P7> > > > > > > Params;
+  static R call (D fp, TypeListValues <Params>& tvl)
+  {
+    return fp (tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.hd);
+  }
+};
+
+template <class R, class P1, class P2, class P3, class P4, class P5, class P6, class P7, class P8, class D>
+struct FuncTraits <R (*) (P1, P2, P3, P4, P5, P6, P7, P8) LUABRIDGE_THROWSPEC, D>
+{
+  static bool const isMemberFunction = false;
+  typedef D DeclType;
+  typedef R ReturnType;
+  typedef TypeList <P1, TypeList <P2, TypeList <P3, TypeList <P4, TypeList <P5, TypeList <P6, TypeList <P7, TypeList <P8> > > > > > > > Params;
+  static R call (D fp, TypeListValues <Params>& tvl)
+  {
+    return fp (tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.tl.hd);
+  }
+};
+
+template <class R, class P1, class P2, class P3, class P4, class P5, class P6, class P7, class P8, class P9, class D>
+struct FuncTraits <R (*) (P1, P2, P3, P4, P5, P6, P7, P8, P9) LUABRIDGE_THROWSPEC, D>
+{
+  static bool const isMemberFunction = false;
+  typedef D DeclType;
+  typedef R ReturnType;
+  typedef TypeList <P1, TypeList <P2, TypeList <P3, TypeList <P4, TypeList <P5, TypeList <P6, TypeList <P7, TypeList <P8, TypeList <P9> > > > > > > > > Params;
+  static R call (D fp, TypeListValues <Params>& tvl)
+  {
+    return fp (tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.tl.tl.hd);
+  }
+};
+
+/* Non-const member function pointers with THROWSPEC. */
+
+template <class T, class R, class D>
+struct FuncTraits <R (T::*) () LUABRIDGE_THROWSPEC, D>
+{
+  static bool const isMemberFunction = true;
+  static bool const isConstMemberFunction = false;
+  typedef D DeclType;
+  typedef T ClassType;
+  typedef R ReturnType;
+  typedef None Params;
+  static R call (T* obj, D fp, TypeListValues <Params> const&)
+  {
+    return (obj->*fp)();
+  }
+};
+
+template <class T, class R, class P1, class D>
+struct FuncTraits <R (T::*) (P1) LUABRIDGE_THROWSPEC, D>
+{
+  static bool const isMemberFunction = true;
+  static bool const isConstMemberFunction = false;
+  typedef D DeclType;
+  typedef T ClassType;
+  typedef R ReturnType;
+  typedef TypeList <P1> Params;
+  static R call (T* obj, D fp, TypeListValues <Params>& tvl)
+  {
+    return (obj->*fp)(tvl.hd);
+  }
+};
+
+template <class T, class R, class P1, class P2, class D>
+struct FuncTraits <R (T::*) (P1, P2) LUABRIDGE_THROWSPEC, D>
+{
+  static bool const isMemberFunction = true;
+  static bool const isConstMemberFunction = false;
+  typedef D DeclType;
+  typedef T ClassType;
+  typedef R ReturnType;
+  typedef TypeList <P1, TypeList <P2> > Params;
+  static R call (T* obj, D fp, TypeListValues <Params>& tvl)
+  {
+    return (obj->*fp)(tvl.hd, tvl.tl.hd);
+  }
+};
+
+template <class T, class R, class P1, class P2, class P3, class D>
+struct FuncTraits <R (T::*) (P1, P2, P3) LUABRIDGE_THROWSPEC, D>
+{
+  static bool const isMemberFunction = true;
+  static bool const isConstMemberFunction = false;
+  typedef D DeclType;
+  typedef T ClassType;
+  typedef R ReturnType;
+  typedef TypeList <P1, TypeList <P2, TypeList <P3> > > Params;
+  static R call (T* obj, D fp, TypeListValues <Params>& tvl)
+  {
+    return (obj->*fp)(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd);
+  }
+};
+
+template <class T, class R, class P1, class P2, class P3, class P4, class D>
+struct FuncTraits <R (T::*) (P1, P2, P3, P4) LUABRIDGE_THROWSPEC, D>
+{
+  static bool const isMemberFunction = true;
+  static bool const isConstMemberFunction = false;
+  typedef D DeclType;
+  typedef T ClassType;
+  typedef R ReturnType;
+  typedef TypeList <P1, TypeList <P2, TypeList <P3, TypeList <P4> > > > Params;
+  static R call (T* obj, D fp, TypeListValues <Params>& tvl)
+  {
+    return (obj->*fp)(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd);
+  }
+};
+
+template <class T, class R, class P1, class P2, class P3, class P4, class P5, class D>
+struct FuncTraits <R (T::*) (P1, P2, P3, P4, P5) LUABRIDGE_THROWSPEC, D>
+{
+  static bool const isMemberFunction = true;
+  static bool const isConstMemberFunction = false;
+  typedef D DeclType;
+  typedef T ClassType;
+  typedef R ReturnType;
+  typedef TypeList <P1, TypeList <P2, TypeList <P3, TypeList <P4, TypeList <P5> > > > > Params;
+  static R call (T* obj, D fp, TypeListValues <Params>& tvl)
+  {
+    return (obj->*fp)(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.hd);
+  }
+};
+
+template <class T, class R, class P1, class P2, class P3, class P4, class P5, class P6, class D>
+struct FuncTraits <R (T::*) (P1, P2, P3, P4, P5, P6) LUABRIDGE_THROWSPEC, D>
+{
+  static bool const isMemberFunction = true;
+  static bool const isConstMemberFunction = false;
+  typedef D DeclType;
+  typedef T ClassType;
+  typedef R ReturnType;
+  typedef TypeList <P1, TypeList <P2, TypeList <P3, TypeList <P4, TypeList <P5, TypeList <P6> > > > > > Params;
+  static R call (T* obj, D fp, TypeListValues <Params>& tvl)
+  {
+    return (obj->*fp)(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.hd);
+  }
+};
+
+template <class T, class R, class P1, class P2, class P3, class P4, class P5, class P6, class P7, class D>
+struct FuncTraits <R (T::*) (P1, P2, P3, P4, P5, P6, P7) LUABRIDGE_THROWSPEC, D>
+{
+  static bool const isMemberFunction = true;
+  static bool const isConstMemberFunction = false;
+  typedef D DeclType;
+  typedef T ClassType;
+  typedef R ReturnType;
+  typedef TypeList <P1, TypeList <P2, TypeList <P3, TypeList <P4, TypeList <P5, TypeList <P6, TypeList <P7> > > > > > > Params;
+  static R call (T* obj, D fp, TypeListValues <Params>& tvl)
+  {
+    return (obj->*fp)(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.hd);
+  }
+};
+
+template <class T, class R, class P1, class P2, class P3, class P4, class P5, class P6, class P7, class P8, class D>
+struct FuncTraits <R (T::*) (P1, P2, P3, P4, P5, P6, P7, P8) LUABRIDGE_THROWSPEC, D>
+{
+  static bool const isMemberFunction = true;
+  static bool const isConstMemberFunction = false;
+  typedef D DeclType;
+  typedef T ClassType;
+  typedef R ReturnType;
+  typedef TypeList <P1, TypeList <P2, TypeList <P3, TypeList <P4, TypeList <P5, TypeList <P6, TypeList <P7, TypeList <P8> > > > > > > > Params;
+  static R call (T* obj, D fp, TypeListValues <Params>& tvl)
+  {
+    return (obj->*fp)(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.tl.hd);
+  }
+};
+
+template <class T, class R, class P1, class P2, class P3, class P4, class P5, class P6, class P7, class P8, class P9, class D>
+struct FuncTraits <R (T::*) (P1, P2, P3, P4, P5, P6, P7, P8, P9) LUABRIDGE_THROWSPEC, D>
+{
+  static bool const isMemberFunction = true;
+  static bool const isConstMemberFunction = false;
+  typedef D DeclType;
+  typedef T ClassType;
+  typedef R ReturnType;
+  typedef TypeList <P1, TypeList <P2, TypeList <P3, TypeList <P4, TypeList <P5, TypeList <P6, TypeList <P7, TypeList <P8, TypeList <P9> > > > > > > > > Params;
+  static R call (T* obj, D fp, TypeListValues <Params>& tvl)
+  {
+    return (obj->*fp)(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.tl.tl.hd);
+  }
+};
+
+
+/* Const member function pointers with THROWSPEC. */
+
+template <class T, class R, class D>
+struct FuncTraits <R (T::*) () const LUABRIDGE_THROWSPEC, D>
+{
+  static bool const isMemberFunction = true;
+  static bool const isConstMemberFunction = true;
+  typedef D DeclType;
+  typedef T ClassType;
+  typedef R ReturnType;
+  typedef None Params;
+  static R call (T const* obj, D fp, TypeListValues <Params>)
+  {
+    return (obj->*fp)();
+  }
+};
+
+template <class T, class R, class P1, class D>
+struct FuncTraits <R (T::*) (P1) const LUABRIDGE_THROWSPEC, D>
+{
+  static bool const isMemberFunction = true;
+  static bool const isConstMemberFunction = true;
+  typedef D DeclType;
+  typedef T ClassType;
+  typedef R ReturnType;
+  typedef TypeList <P1> Params;
+  static R call (T const* obj, D fp, TypeListValues <Params>& tvl)
+  {
+    return (obj->*fp)(tvl.hd);
+  }
+};
+
+template <class T, class R, class P1, class P2, class D>
+struct FuncTraits <R (T::*) (P1, P2) const LUABRIDGE_THROWSPEC, D>
+{
+  static bool const isMemberFunction = true;
+  static bool const isConstMemberFunction = true;
+  typedef D DeclType;
+  typedef T ClassType;
+  typedef R ReturnType;
+  typedef TypeList <P1, TypeList <P2> > Params;
+  static R call (T const* obj, D fp, TypeListValues <Params>& tvl)
+  {
+    return (obj->*fp)(tvl.hd, tvl.tl.hd);
+  }
+};
+
+template <class T, class R, class P1, class P2, class P3, class D>
+struct FuncTraits <R (T::*) (P1, P2, P3) const LUABRIDGE_THROWSPEC, D>
+{
+  static bool const isMemberFunction = true;
+  static bool const isConstMemberFunction = true;
+  typedef D DeclType;
+  typedef T ClassType;
+  typedef R ReturnType;
+  typedef TypeList <P1, TypeList <P2, TypeList <P3> > > Params;
+  static R call (T const* obj, D fp, TypeListValues <Params>& tvl)
+  {
+    return (obj->*fp)(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd);
+  }
+};
+
+template <class T, class R, class P1, class P2, class P3, class P4, class D>
+struct FuncTraits <R (T::*) (P1, P2, P3, P4) const LUABRIDGE_THROWSPEC, D>
+{
+  static bool const isMemberFunction = true;
+  static bool const isConstMemberFunction = true;
+  typedef D DeclType;
+  typedef T ClassType;
+  typedef R ReturnType;
+  typedef TypeList <P1, TypeList <P2, TypeList <P3, TypeList <P4> > > > Params;
+  static R call (T const* obj, D fp, TypeListValues <Params>& tvl)
+  {
+    return (obj->*fp)(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd);
+  }
+};
+
+template <class T, class R, class P1, class P2, class P3, class P4, class P5, class D>
+struct FuncTraits <R (T::*) (P1, P2, P3, P4, P5) const LUABRIDGE_THROWSPEC, D>
+{
+  static bool const isMemberFunction = true;
+  static bool const isConstMemberFunction = true;
+  typedef D DeclType;
+  typedef T ClassType;
+  typedef R ReturnType;
+  typedef TypeList <P1, TypeList <P2, TypeList <P3, TypeList <P4, TypeList <P5> > > > > Params;
+  static R call (T const* obj, D fp, TypeListValues <Params>& tvl)
+  {
+    return (obj->*fp)(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd,
+      tvl.tl.tl.tl.tl.hd);
+  }
+};
+
+template <class T, class R, class P1, class P2, class P3, class P4, class P5, class P6, class D>
+struct FuncTraits <R (T::*) (P1, P2, P3, P4, P5, P6) const LUABRIDGE_THROWSPEC, D>
+{
+  static bool const isMemberFunction = true;
+  static bool const isConstMemberFunction = true;
+  typedef D DeclType;
+  typedef T ClassType;
+  typedef R ReturnType;
+  typedef TypeList <P1, TypeList <P2, TypeList <P3, TypeList <P4, TypeList <P5, TypeList <P6> > > > > > Params;
+  static R call (T const* obj, D fp, TypeListValues <Params>& tvl)
+  {
+    return (obj->*fp)(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.hd);
+  }
+};
+
+template <class T, class R, class P1, class P2, class P3, class P4, class P5, class P6, class P7, class D>
+struct FuncTraits <R (T::*) (P1, P2, P3, P4, P5, P6, P7) const LUABRIDGE_THROWSPEC, D>
+{
+  static bool const isMemberFunction = true;
+  static bool const isConstMemberFunction = true;
+  typedef D DeclType;
+  typedef T ClassType;
+  typedef R ReturnType;
+  typedef TypeList <P1, TypeList <P2, TypeList <P3, TypeList <P4, TypeList <P5, TypeList <P6, TypeList <P7> > > > > > > Params;
+  static R call (T const* obj, D fp, TypeListValues <Params>& tvl)
+  {
+    return (obj->*fp)(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.hd);
+  }
+};
+
+template <class T, class R, class P1, class P2, class P3, class P4, class P5, class P6, class P7, class P8, class D>
+struct FuncTraits <R (T::*) (P1, P2, P3, P4, P5, P6, P7, P8) const LUABRIDGE_THROWSPEC, D>
+{
+  static bool const isMemberFunction = true;
+  static bool const isConstMemberFunction = true;
+  typedef D DeclType;
+  typedef T ClassType;
+  typedef R ReturnType;
+  typedef TypeList <P1, TypeList <P2, TypeList <P3, TypeList <P4, TypeList <P5, TypeList <P6, TypeList <P7, TypeList <P8> > > > > > > > Params;
+  static R call (T const* obj, D fp, TypeListValues <Params>& tvl)
+  {
+    return (obj->*fp)(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.tl.hd);
+  }
+};
+
+template <class T, class R, class P1, class P2, class P3, class P4, class P5, class P6, class P7, class P8, class P9, class D>
+struct FuncTraits <R (T::*) (P1, P2, P3, P4, P5, P6, P7, P8, P9) const LUABRIDGE_THROWSPEC, D>
+{
+  static bool const isMemberFunction = true;
+  static bool const isConstMemberFunction = true;
+  typedef D DeclType;
+  typedef T ClassType;
+  typedef R ReturnType;
+  typedef TypeList <P1, TypeList <P2, TypeList <P3, TypeList <P4, TypeList <P5, TypeList <P6, TypeList <P7, TypeList <P8, TypeList <P9> > > > > > > > > Params;
+  static R call (T const* obj, D fp, TypeListValues <Params>& tvl)
+  {
+    return (obj->*fp)(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.tl.tl.hd);
+  }
+};
+
+
+#endif
diff --git a/libs/lua/LuaBridge/detail/Iterator.h b/libs/lua/LuaBridge/detail/Iterator.h
new file mode 100644
index 0000000..d383743
--- /dev/null
+++ b/libs/lua/LuaBridge/detail/Iterator.h
@@ -0,0 +1,114 @@
+//------------------------------------------------------------------------------
+/*
+  https://github.com/vinniefalco/LuaBridge
+
+  Copyright 2012, Vinnie Falco <vinnie.falco at gmail.com>
+
+  License: The MIT License (http://www.opensource.org/licenses/mit-license.php)
+
+  Permission is hereby granted, free of charge, to any person obtaining a copy
+  of this software and associated documentation files (the "Software"), to deal
+  in the Software without restriction, including without limitation the rights
+  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+  copies of the Software, and to permit persons to whom the Software is
+  furnished to do so, subject to the following conditions:
+
+  The above copyright notice and this permission notice shall be included in all
+  copies or substantial portions of the Software.
+
+  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+  SOFTWARE.
+*/
+//==============================================================================
+
+/** Allows table iteration.
+*/
+class Iterator
+{
+private:
+  lua_State* m_L;
+  LuaRef m_table;
+  LuaRef m_key;
+  LuaRef m_value;
+
+  void next ()
+  {
+    m_table.push(m_L);
+    m_key.push (m_L);
+    if (lua_next (m_L, -2))
+    {
+      m_value.pop (m_L);
+      m_key.pop (m_L);
+    }
+    else
+    {
+      m_key = Nil();
+      m_value = Nil();
+    }
+    lua_pop(m_L, 1);
+  }
+
+public:
+  explicit Iterator (LuaRef table)
+    : m_L (table.state ())
+    , m_table (table)
+    , m_key (table.state ()) // m_key is nil
+    , m_value (table.state ()) // m_value is nil
+  {
+    next (); // get the first (key, value) pair from table
+  }
+
+  lua_State* state () const
+  {
+    return m_L;
+  }
+
+  LuaRef operator* () const
+  {
+    return m_value;
+  }
+
+  LuaRef operator-> () const
+  {
+    return m_value;
+  }
+
+  Iterator& operator++ ()
+  {
+    if (isNil())
+    {
+      // if the iterator reaches the end, do nothing
+      return *this;
+    }
+    else
+    {
+      next();
+      return *this;
+    }
+  }
+
+  inline bool isNil () const
+  {
+    return m_key.isNil ();
+  }
+
+  inline LuaRef key () const
+  {
+    return m_key;
+  }
+
+  inline LuaRef value () const
+  {
+    return m_value;
+  }
+
+private:
+  // Don't use postfix increment, it is less efficient
+  Iterator operator++ (int);
+};
+
diff --git a/libs/lua/LuaBridge/detail/LuaException.h b/libs/lua/LuaBridge/detail/LuaException.h
new file mode 100644
index 0000000..a9a3f28
--- /dev/null
+++ b/libs/lua/LuaBridge/detail/LuaException.h
@@ -0,0 +1,113 @@
+//------------------------------------------------------------------------------
+/*
+  https://github.com/vinniefalco/LuaBridge
+
+  Copyright 2012, Vinnie Falco <vinnie.falco at gmail.com>
+  Copyright 2008, Nigel Atkinson <suprapilot+LuaCode at gmail.com>
+
+  License: The MIT License (http://www.opensource.org/licenses/mit-license.php)
+
+  Permission is hereby granted, free of charge, to any person obtaining a copy
+  of this software and associated documentation files (the "Software"), to deal
+  in the Software without restriction, including without limitation the rights
+  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+  copies of the Software, and to permit persons to whom the Software is
+  furnished to do so, subject to the following conditions:
+
+  The above copyright notice and this permission notice shall be included in all
+  copies or substantial portions of the Software.
+
+  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+  SOFTWARE.
+*/
+//==============================================================================
+
+class LuaException : public std::exception
+{
+private:
+  lua_State* m_L;
+  std::string m_what;
+
+public:
+  //----------------------------------------------------------------------------
+  /**
+      Construct a LuaException after a lua_pcall().
+  */
+  LuaException (lua_State* L, int /*code*/)
+    : m_L (L)
+  {
+    whatFromStack ();
+  }
+
+  //----------------------------------------------------------------------------
+
+  LuaException (lua_State *L,
+                char const*,
+                char const*,
+                long)
+    : m_L (L)
+  {
+    whatFromStack ();
+  }
+
+  //----------------------------------------------------------------------------
+
+  ~LuaException() throw ()
+  {
+  }
+
+  //----------------------------------------------------------------------------
+
+  char const* what() const throw ()
+  {
+    return m_what.c_str();
+  }
+
+  //============================================================================
+  /**
+      Throw an exception.
+
+      This centralizes all the exceptions thrown, so that we can set
+      breakpoints before the stack is unwound, or otherwise customize the
+      behavior.
+  */
+  template <class Exception>
+  static void Throw (Exception e)
+  {
+    throw e;
+  }
+
+  //----------------------------------------------------------------------------
+  /**
+      Wrapper for lua_pcall that throws.
+  */
+  static void pcall (lua_State* L, int nargs = 0, int nresults = 0, int msgh = 0)
+  {
+    int code = lua_pcall (L, nargs, nresults, msgh);
+
+    if (code != LUABRIDGE_LUA_OK)
+      Throw (LuaException (L, code));
+  }
+
+  //----------------------------------------------------------------------------
+
+protected:
+  void whatFromStack ()
+  {
+    if (lua_gettop (m_L) > 0)
+    {
+      char const* s = lua_tostring (m_L, -1);
+      m_what = s ? s : "";
+    }
+    else
+    {
+      // stack is empty
+      m_what = "missing error";
+    }
+  }
+};
diff --git a/libs/lua/LuaBridge/detail/LuaHelpers.h b/libs/lua/LuaBridge/detail/LuaHelpers.h
new file mode 100644
index 0000000..02e9b29
--- /dev/null
+++ b/libs/lua/LuaBridge/detail/LuaHelpers.h
@@ -0,0 +1,143 @@
+//------------------------------------------------------------------------------
+/*
+  https://github.com/vinniefalco/LuaBridge
+
+  Copyright 2012, Vinnie Falco <vinnie.falco at gmail.com>
+  Copyright 2007, Nathan Reed
+
+  License: The MIT License (http://www.opensource.org/licenses/mit-license.php)
+
+  Permission is hereby granted, free of charge, to any person obtaining a copy
+  of this software and associated documentation files (the "Software"), to deal
+  in the Software without restriction, including without limitation the rights
+  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+  copies of the Software, and to permit persons to whom the Software is
+  furnished to do so, subject to the following conditions:
+
+  The above copyright notice and this permission notice shall be included in all
+  copies or substantial portions of the Software.
+
+  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+  SOFTWARE.
+*/
+//==============================================================================
+
+// These are for Lua versions prior to 5.2.0.
+//
+#if LUA_VERSION_NUM < 502
+inline int lua_absindex (lua_State* L, int idx)
+{
+  if (idx > LUA_REGISTRYINDEX && idx < 0)
+    return lua_gettop (L) + idx + 1;
+  else
+    return idx;
+}
+
+inline void lua_rawgetp (lua_State* L, int idx, void const* p)
+{
+  idx = lua_absindex (L, idx);
+  lua_pushlightuserdata (L, const_cast <void*> (p));
+  lua_rawget (L,idx);
+}
+
+inline void lua_rawsetp (lua_State* L, int idx, void const* p)
+{
+  idx = lua_absindex (L, idx);
+  lua_pushlightuserdata (L, const_cast <void*> (p));
+  // put key behind value
+  lua_insert (L, -2);
+  lua_rawset (L, idx);
+}
+
+#define LUA_OPEQ 1
+#define LUA_OPLT 2
+#define LUA_OPLE 3
+
+inline int lua_compare (lua_State* L, int idx1, int idx2, int op)
+{
+  switch (op)
+  {
+  case LUA_OPEQ:
+    return lua_equal (L, idx1, idx2);
+    break;
+
+  case LUA_OPLT:
+    return lua_lessthan (L, idx1, idx2);
+    break;
+
+  case LUA_OPLE:
+    return lua_equal (L, idx1, idx2) || lua_lessthan (L, idx1, idx2);
+    break;
+
+  default:
+    return 0;
+  };
+}
+
+inline int get_length (lua_State* L, int idx)
+{
+  return int (lua_objlen (L, idx));
+}
+
+#else
+inline int get_length (lua_State* L, int idx)
+{
+  lua_len (L, idx);
+  int len = int (luaL_checknumber (L, -1));
+  lua_pop (L, 1);
+  return len;
+}
+
+#endif
+
+#ifndef LUA_OK
+# define LUABRIDGE_LUA_OK 0
+#else
+# define LUABRIDGE_LUA_OK LUA_OK
+#endif
+
+/** Get a table value, bypassing metamethods.
+*/
+inline void rawgetfield (lua_State* L, int index, char const* key)
+{
+  assert (lua_istable (L, index));
+  index = lua_absindex (L, index);
+  lua_pushstring (L, key);
+  lua_rawget (L, index);
+}
+
+/** Set a table value, bypassing metamethods.
+*/
+inline void rawsetfield (lua_State* L, int index, char const* key)
+{
+  assert (lua_istable (L, index));
+  index = lua_absindex (L, index);
+  lua_pushstring (L, key);
+  lua_insert (L, -2);
+  lua_rawset (L, index);
+}
+
+/** Returns true if the value is a full userdata (not light).
+*/
+inline bool isfulluserdata (lua_State* L, int index)
+{
+  return lua_isuserdata (L, index) && !lua_islightuserdata (L, index);
+}
+
+/** Test lua_State objects for global equality.
+
+    This can determine if two different lua_State objects really point
+    to the same global state, such as when using coroutines.
+
+    @note This is used for assertions.
+*/
+inline bool equalstates (lua_State* L1, lua_State* L2)
+{
+  return lua_topointer (L1, LUA_REGISTRYINDEX) ==
+         lua_topointer (L2, LUA_REGISTRYINDEX);
+}
diff --git a/libs/lua/LuaBridge/detail/LuaRef.h b/libs/lua/LuaBridge/detail/LuaRef.h
new file mode 100644
index 0000000..46c7564
--- /dev/null
+++ b/libs/lua/LuaBridge/detail/LuaRef.h
@@ -0,0 +1,1221 @@
+//------------------------------------------------------------------------------
+/*
+  https://github.com/vinniefalco/LuaBridge
+
+  Copyright 2012, Vinnie Falco <vinnie.falco at gmail.com>
+  Copyright 2008, Nigel Atkinson <suprapilot+LuaCode at gmail.com>
+
+  License: The MIT License (http://www.opensource.org/licenses/mit-license.php)
+
+  Permission is hereby granted, free of charge, to any person obtaining a copy
+  of this software and associated documentation files (the "Software"), to deal
+  in the Software without restriction, including without limitation the rights
+  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+  copies of the Software, and to permit persons to whom the Software is
+  furnished to do so, subject to the following conditions:
+
+  The above copyright notice and this permission notice shall be included in all
+  copies or substantial portions of the Software.
+
+  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+  SOFTWARE.
+*/
+//==============================================================================
+
+//------------------------------------------------------------------------------
+/**
+    Type tag for representing LUA_TNIL.
+
+    Construct one of these using `Nil()` to represent a Lua nil. This is faster
+    than creating a reference in the registry to nil. Example:
+
+        LuaRef t (LuaRef::createTable (L));
+        ...
+        t ["k"] = Nil(); // assign nil
+*/
+struct Nil
+{
+};
+
+//------------------------------------------------------------------------------
+/**
+    Lightweight reference to a Lua object.
+
+    The reference is maintained for the lifetime of the C++ object.
+*/
+class LuaRef
+{
+private:
+  class Proxy;
+  friend struct Stack <Proxy>;
+
+  //----------------------------------------------------------------------------
+  /**
+      Pop the Lua stack.
+
+      Pops the specified number of stack items on destruction. We use this
+      when returning objects, to avoid an explicit temporary variable, since
+      the destructor executes after the return statement. For example:
+
+          template <class U>
+          U cast (lua_State* L)
+          {
+            StackPop p (L, 1);
+            ...
+            return U (); // dtor called after this line
+          }
+
+      @note The `StackPop` object must always be a named local variable.
+  */
+  class StackPop
+  {
+  public:
+    /** Create a StackPop object.
+
+        @param count The number of stack entries to pop on destruction.
+    */
+    StackPop (lua_State* L, int count)
+      : m_L (L)
+      , m_count (count)
+    {
+    }
+
+    ~StackPop ()
+    {
+      lua_pop (m_L, m_count);
+    }
+
+  private:
+    lua_State* m_L;
+    int m_count;
+  };
+
+  //----------------------------------------------------------------------------
+  /**
+      A proxy for representing table values.
+  */
+  class Proxy
+  {
+  private:
+    lua_State* m_L;
+    int m_tableRef;
+    int m_keyRef;
+
+  public:
+    //--------------------------------------------------------------------------
+    /**
+        Construct a Proxy from a table value.
+
+        The table is in the registry, and the key is at the top of the stack.
+        The key is popped off the stack.
+    */
+    Proxy (lua_State* L, int tableRef)
+      : m_L (L)
+      , m_tableRef (tableRef)
+      , m_keyRef (luaL_ref (L, LUA_REGISTRYINDEX))
+    {
+    }
+
+    //--------------------------------------------------------------------------
+    /**
+        Create a Proxy via copy constructor.
+
+        It is best to avoid code paths that invoke this, because it creates
+        an extra temporary Lua reference. Typically this is done by passing
+        the Proxy parameter as a `const` reference.
+    */
+    Proxy (Proxy const& other)
+      : m_L (other.m_L)
+      , m_tableRef (other.m_tableRef)
+    {
+      // If this assert goes off it means code is taking this path,
+      // which is better avoided.
+      //
+      assert (0);
+
+      lua_rawgeti (m_L, LUA_REGISTRYINDEX, other.m_keyRef);
+      m_keyRef = luaL_ref (m_L, LUA_REGISTRYINDEX);
+    }
+
+    //--------------------------------------------------------------------------
+    /**
+        Destroy the proxy.
+
+        This does not destroy the table value.
+    */
+    ~Proxy ()
+    {
+      luaL_unref (m_L, LUA_REGISTRYINDEX, m_keyRef);
+    }
+
+    //--------------------------------------------------------------------------
+    /**
+        Return a reference to the table value.
+    */
+    int createRef () const
+    {
+      push (m_L);
+      return luaL_ref (m_L, LUA_REGISTRYINDEX);
+    }
+
+    //--------------------------------------------------------------------------
+    /**
+        Assign a new value to this table key.
+
+        This may invoke metamethods.
+    */
+    template <class T>
+    Proxy& operator= (T v)
+    {
+      StackPop p (m_L, 1);
+      lua_rawgeti (m_L, LUA_REGISTRYINDEX, m_tableRef);
+      lua_rawgeti (m_L, LUA_REGISTRYINDEX, m_keyRef);
+      Stack <T>::push (m_L, v);
+      lua_rawset (m_L, -3);
+      return *this;
+    }
+
+    // the implementation needs UserdataPtr, which
+    // is not yet defined here.
+    // -> libs/ardour/lua_api.cc
+    Proxy& clone_instance (const void* key, void* p);
+
+    //--------------------------------------------------------------------------
+    /**
+        Assign a new value to this table key.
+
+        The assignment is raw, no metamethods are invoked.
+    */
+    template <class T>
+    Proxy& rawset (T v)
+    {
+      StackPop p (m_L, 1);
+      lua_rawgeti (m_L, LUA_REGISTRYINDEX, m_tableRef);
+      lua_rawgeti (m_L, LUA_REGISTRYINDEX, m_keyRef);
+      Stack <T>::push (m_L, v);
+      lua_settable (m_L, -3);
+      return *this;
+    }
+
+    //==========================================================================
+    //
+    // This group of member functions mirrors the member functions in LuaRef.
+
+    /** Retrieve the lua_State associated with the table value.
+    */
+    lua_State* state () const
+    {
+      return m_L;
+    }
+
+    //--------------------------------------------------------------------------
+    /**
+        Push the value onto the Lua stack.
+    */
+    void push (lua_State* L) const
+    {
+      assert (equalstates (L, m_L));
+      lua_rawgeti (L, LUA_REGISTRYINDEX, m_tableRef);
+      lua_rawgeti (L, LUA_REGISTRYINDEX, m_keyRef);
+      lua_gettable (L, -2);
+      lua_remove (L, -2); // remove the table
+    }
+
+    //--------------------------------------------------------------------------
+    /**
+        Determine the object type.
+
+        The return values are the same as for `lua_type`.
+    */
+    int type () const
+    {
+      int result;
+      push (m_L);
+      result = lua_type (m_L, -1);
+      lua_pop (m_L, 1);
+      return result;
+    }
+
+    inline bool isNil () const { return type () == LUA_TNIL; }
+    inline bool isBoolean () const { return type () == LUA_TBOOLEAN; }
+    inline bool isNumber () const { return type () == LUA_TNUMBER; }
+    inline bool isString () const { return type () == LUA_TSTRING; }
+    inline bool isTable () const { return type () == LUA_TTABLE; }
+    inline bool isFunction () const { return type () == LUA_TFUNCTION; }
+    inline bool isUserdata () const { return type () == LUA_TUSERDATA; }
+    inline bool isThread () const { return type () == LUA_TTHREAD; }
+    inline bool isLightUserdata () const { return type () == LUA_TLIGHTUSERDATA; }
+
+    //--------------------------------------------------------------------------
+    /**
+        Perform an explicit conversion.
+    */
+    template <class T>
+    T cast () const
+    {
+      StackPop p (m_L, 1);
+      push (m_L);
+
+      // lua_gettop is used because Userdata::getClass() doesn't handle
+      // negative stack indexes.
+      //
+      return Stack <T>::get (m_L, lua_gettop (m_L));
+    }
+
+    //--------------------------------------------------------------------------
+    /**
+        Universal implicit conversion operator.
+
+        NOTE: Visual Studio 2010 and 2012 have a bug where this function
+              is not used. See:
+
+        http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/e30b2664-a92d-445c-9db2-e8e0fbde2014
+        https://connect.microsoft.com/VisualStudio/feedback/details/771509/correct-code-doesnt-compile
+
+            // This code snippet fails to compile in vs2010,vs2012
+            struct S {
+              template <class T> inline operator T () const { return T (); }
+            };
+            int main () {
+              S () || false;
+              return 0;
+            }
+    */
+    template <class T>
+    inline operator T () const
+    {
+      return cast <T> ();
+    }
+
+    //--------------------------------------------------------------------------
+    /**
+        Universal comparison operators.
+    */
+    /** @{ */
+    template <class T>
+    bool operator== (T rhs) const
+    {
+      StackPop p (m_L, 2);
+      push (m_L);
+      Stack <T>::push (m_L, rhs);
+      return lua_compare (m_L, -2, -1, LUA_OPEQ) == 1;
+    }
+
+    template <class T>
+    bool operator< (T rhs) const
+    {
+      StackPop p (m_L, 2);
+      push (m_L);
+      Stack <T>::push (m_L, rhs);
+      return lua_compare (m_L, -2, -1, LUA_OPLT) == 1;
+    }
+
+    template <class T>
+    bool operator<= (T rhs) const
+    {
+      StackPop p (m_L, 2);
+      push (m_L);
+      Stack <T>::push (m_L, rhs);
+      return lua_compare (m_L, -2, -1, LUA_OPLE) == 1;
+    }
+
+    template <class T>
+    bool operator> (T rhs) const
+    {
+      StackPop p (m_L, 2);
+      push (m_L);
+      Stack <T>::push (m_L, rhs);
+      return lua_compare (m_L, -1, -2, LUA_OPLT) == 1;
+    }
+
+    template <class T>
+    bool operator>= (T rhs) const
+    {
+      StackPop p (m_L, 2);
+      push (m_L);
+      Stack <T>::push (m_L, rhs);
+      return lua_compare (m_L, -1, -2, LUA_OPLE) == 1;
+    }
+
+    template <class T>
+    bool rawequal (T rhs) const
+    {
+      StackPop p (m_L, 2);
+      push (m_L);
+      Stack <T>::push (m_L, rhs);
+      return lua_rawequal (m_L, -1, -2) == 1;
+    }
+    /** @} */
+
+    //--------------------------------------------------------------------------
+    /**
+        Access a table value using a key.
+
+        This invokes metamethods.
+    */
+    template <class T>
+    Proxy operator[] (T key) const
+    {
+      return LuaRef (*this) [key];
+    }
+
+    //--------------------------------------------------------------------------
+    /**
+        Access a table value using a key.
+
+        The operation is raw, metamethods are not invoked. The result is
+        passed by value and may not be modified.
+    */
+    template <class T>
+    LuaRef rawget (T key) const
+    {
+      StackPop (m_L, 1);
+      push (m_L);
+      Stack <T>::push (m_L, key);
+      lua_rawget (m_L, -2);
+      return LuaRef (m_L, FromStack ());
+    }
+
+    //--------------------------------------------------------------------------
+    /**
+        Append a value to the table.
+
+        If the table is a sequence this will add another element to it.
+    */
+    template <class T>
+    void append (T v) const
+    {
+      push (m_L);
+      Stack <T>::push (m_L, v);
+      luaL_ref (m_L, -2);
+      lua_pop (m_L, 1);
+    }
+
+    //--------------------------------------------------------------------------
+    /**
+        Call the length operator.
+
+        This is identical to applying the Lua # operator.
+    */
+    int length () const
+    {
+      StackPop p (m_L, 1);
+      push (m_L);
+      return get_length (m_L, -1);
+    }
+
+    //--------------------------------------------------------------------------
+    /**
+        Call Lua code.
+
+        These overloads allow Lua code to be called with up to 8 parameters.
+        The return value is provided as a LuaRef (which may be LUA_REFNIL).
+        If an error occurs, a LuaException is thrown.
+    */
+    /** @{ */
+    LuaRef const operator() () const
+    {
+      push (m_L);
+      LuaException::pcall (m_L, 0, 1);
+      return LuaRef (m_L, FromStack ());
+    }
+
+    template <class P1>
+    LuaRef const operator() (P1 p1) const
+    {
+      push (m_L);
+      Stack <P1>::push (m_L, p1);
+      LuaException::pcall (m_L, 1, 1);
+      return LuaRef (m_L, FromStack ());
+    }
+
+    template <class P1, class P2>
+    LuaRef const operator() (P1 p1, P2 p2) const
+    {
+      push (m_L);
+      Stack <P1>::push (m_L, p1);
+      Stack <P2>::push (m_L, p2);
+      LuaException::pcall (m_L, 2, 1);
+      return LuaRef (m_L, FromStack ());
+    }
+
+    template <class P1, class P2, class P3>
+    LuaRef const operator() (P1 p1, P2 p2, P3 p3) const
+    {
+      push (m_L);
+      Stack <P1>::push (m_L, p1);
+      Stack <P2>::push (m_L, p2);
+      Stack <P3>::push (m_L, p3);
+      LuaException::pcall (m_L, 3, 1);
+      return LuaRef (m_L, FromStack ());
+    }
+
+    template <class P1, class P2, class P3, class P4>
+    LuaRef const operator() (P1 p1, P2 p2, P3 p3, P4 p4) const
+    {
+      push (m_L);
+      Stack <P1>::push (m_L, p1);
+      Stack <P2>::push (m_L, p2);
+      Stack <P3>::push (m_L, p3);
+      Stack <P4>::push (m_L, p4);
+      LuaException::pcall (m_L, 4, 1);
+      return LuaRef (m_L, FromStack ());
+    }
+
+    template <class P1, class P2, class P3, class P4, class P5>
+    LuaRef const operator() (P1 p1, P2 p2, P3 p3, P4 p4, P5 p5) const
+    {
+      push (m_L);
+      Stack <P1>::push (m_L, p1);
+      Stack <P2>::push (m_L, p2);
+      Stack <P3>::push (m_L, p3);
+      Stack <P4>::push (m_L, p4);
+      Stack <P5>::push (m_L, p5);
+      LuaException::pcall (m_L, 5, 1);
+      return LuaRef (m_L, FromStack ());
+    }
+
+    template <class P1, class P2, class P3, class P4, class P5, class P6>
+    LuaRef const operator() (P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6) const
+    {
+      push (m_L);
+      Stack <P1>::push (m_L, p1);
+      Stack <P2>::push (m_L, p2);
+      Stack <P3>::push (m_L, p3);
+      Stack <P4>::push (m_L, p4);
+      Stack <P5>::push (m_L, p5);
+      Stack <P6>::push (m_L, p6);
+      LuaException::pcall (m_L, 6, 1);
+      return LuaRef (m_L, FromStack ());
+    }
+
+    template <class P1, class P2, class P3, class P4, class P5, class P6, class P7>
+    LuaRef const operator() (P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7) const
+    {
+      push (m_L);
+      Stack <P1>::push (m_L, p1);
+      Stack <P2>::push (m_L, p2);
+      Stack <P3>::push (m_L, p3);
+      Stack <P4>::push (m_L, p4);
+      Stack <P5>::push (m_L, p5);
+      Stack <P6>::push (m_L, p6);
+      Stack <P7>::push (m_L, p7);
+      LuaException::pcall (m_L, 7, 1);
+      return LuaRef (m_L, FromStack ());
+    }
+
+    template <class P1, class P2, class P3, class P4, class P5, class P6, class P7, class P8>
+    LuaRef const operator() (P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7, P8 p8) const
+    {
+      push (m_L);
+      Stack <P1>::push (m_L, p1);
+      Stack <P2>::push (m_L, p2);
+      Stack <P3>::push (m_L, p3);
+      Stack <P4>::push (m_L, p4);
+      Stack <P5>::push (m_L, p5);
+      Stack <P6>::push (m_L, p6);
+      Stack <P7>::push (m_L, p7);
+      Stack <P8>::push (m_L, p8);
+      LuaException::pcall (m_L, 8, 1);
+      return LuaRef (m_L, FromStack ());
+    }
+    /** @} */
+
+    //==========================================================================
+  };
+
+private:
+  friend struct Stack <LuaRef>;
+
+  //----------------------------------------------------------------------------
+  /**
+      Type tag for stack construction.
+  */
+  struct FromStack { };
+
+  //----------------------------------------------------------------------------
+  /**
+      Create a reference to an object at the top of the Lua stack and pop it.
+
+      This constructor is private and not invoked directly.
+      Instead, use the `fromStack` function.
+
+      @note The object is popped.
+  */
+  LuaRef (lua_State* L, FromStack)
+    : m_L (L)
+  {
+    m_ref = luaL_ref (m_L, LUA_REGISTRYINDEX);
+  }
+
+  //----------------------------------------------------------------------------
+  /**
+      Create a reference to an object on the Lua stack.
+
+      This constructor is private and not invoked directly.
+      Instead, use the `fromStack` function.
+
+      @note The object is not popped.
+  */
+  LuaRef (lua_State* L, int index, FromStack)
+    : m_L (L)
+  {
+    lua_pushvalue (m_L, index);
+    m_ref = luaL_ref (m_L, LUA_REGISTRYINDEX);
+  }
+
+  //----------------------------------------------------------------------------
+
+  // This type of construction is disallowed, since we don't have a `lua_State`.
+  //
+  template <class T>
+  LuaRef (T)
+  {
+  }
+
+  //----------------------------------------------------------------------------
+  /**
+      Create a reference to this ref.
+
+      This is used internally.
+  */
+  int createRef () const
+  {
+    if (m_ref != LUA_REFNIL)
+    {
+      push (m_L);
+      return luaL_ref (m_L, LUA_REGISTRYINDEX);
+    }
+    else
+    {
+      return LUA_REFNIL;
+    }
+  }
+
+public:
+  //----------------------------------------------------------------------------
+  /**
+      Create a nil reference.
+
+      The LuaRef may be assigned later.
+  */
+  LuaRef (lua_State* L)
+    : m_L (L)
+    , m_ref (LUA_REFNIL)
+  {
+  }
+
+  //----------------------------------------------------------------------------
+  /**
+      Create a reference to a value.
+  */
+  template <class T>
+  LuaRef (lua_State* L, T v)
+    : m_L (L)
+  {
+    Stack <T>::push (m_L, v);
+    m_ref = luaL_ref (m_L, LUA_REGISTRYINDEX);
+  }
+
+  //----------------------------------------------------------------------------
+  /**
+      Create a reference to a table value.
+  */
+  LuaRef (Proxy const& v)
+    : m_L (v.state ())
+    , m_ref (v.createRef ())
+  {
+  }
+
+  //----------------------------------------------------------------------------
+  /**
+      Create a new reference to an existing reference.
+  */
+  LuaRef (LuaRef const& other)
+    : m_L (other.m_L)
+    , m_ref (other.createRef ())
+  {
+  }
+
+  //----------------------------------------------------------------------------
+  /**
+      Destroy a reference.
+
+      The corresponding Lua registry reference will be released.
+
+      @note If the state refers to a thread, it is the responsibility of the
+            caller to ensure that the thread still exists when the LuaRef
+            is destroyed.
+  */
+  ~LuaRef ()
+  {
+    luaL_unref (m_L, LUA_REGISTRYINDEX, m_ref);
+  }
+
+  //----------------------------------------------------------------------------
+  /**
+      Return a LuaRef from a stack item.
+
+      The stack item is not popped.
+  */
+  static LuaRef fromStack (lua_State* L, int index)
+  {
+    lua_pushvalue (L, index);
+    return LuaRef (L, FromStack ());
+  }
+
+  //----------------------------------------------------------------------------
+  /**
+      Create a new empty table and return a reference to it.
+
+      It is also possible to use the free function `newTable`.
+
+      @see ::getGlobal
+  */
+  static LuaRef newTable (lua_State* L)
+  {
+    lua_newtable (L);
+    return LuaRef (L, FromStack ());
+  }
+
+  //----------------------------------------------------------------------------
+  /**
+      Return a reference to a named global.
+
+      It is also possible to use the free function `getGlobal`.
+
+      @see ::getGlobal
+  */
+  static LuaRef getGlobal (lua_State *L, char const* name)
+  {
+    lua_getglobal (L, name);
+    return LuaRef (L, FromStack ());
+  }
+
+  //----------------------------------------------------------------------------
+  /**
+      Assign a different value to this LuaRef.
+  */
+  template <class T>
+  LuaRef& operator= (T rhs)
+  {
+    luaL_unref (m_L, LUA_REGISTRYINDEX, m_ref);
+    Stack <T>::push (m_L, rhs);
+    m_ref = luaL_ref (m_L, LUA_REGISTRYINDEX);
+    return *this;
+  }
+
+  //----------------------------------------------------------------------------
+  /**
+      Assign another LuaRef to this LuaRef.
+  */
+  LuaRef& operator= (LuaRef const& rhs)
+  {
+    luaL_unref (m_L, LUA_REGISTRYINDEX, m_ref);
+    rhs.push (m_L);
+    m_L = rhs.state ();
+    m_ref = luaL_ref (m_L, LUA_REGISTRYINDEX);
+    return *this;
+  }
+
+  //----------------------------------------------------------------------------
+  /**
+      converts to a string using luas tostring function
+  */
+  std::string tostring() const
+  {
+    lua_getglobal (m_L, "tostring");
+    push (m_L);
+    lua_call (m_L, 1, 1);
+    const char* str = lua_tostring(m_L, 1);
+    lua_pop(m_L, 1);
+    return std::string(str);
+  }
+
+  //----------------------------------------------------------------------------
+  /**
+      Print a text description of the value to a stream.
+
+      This is used for diagnostics.
+  */
+  void print (std::ostream& os) const
+  {
+    switch (type ())
+    {
+    case LUA_TNIL:
+      os << "nil";
+      break;
+
+    case LUA_TNUMBER:
+      os << cast <lua_Number> ();
+      break;
+
+    case LUA_TBOOLEAN:
+      os << (cast <bool> () ? "true" : "false");
+      break;
+
+    case LUA_TSTRING:
+      os << '"' << cast <std::string> () << '"';
+      break;
+
+    case LUA_TTABLE:
+      os << "table: " << tostring();
+      break;
+
+    case LUA_TFUNCTION:
+      os << "function: " << tostring();
+      break;
+
+    case LUA_TUSERDATA:
+      os << "userdata: " << tostring();
+      break;
+
+    case LUA_TTHREAD:
+      os << "thread: " << tostring();
+      break;
+
+    case LUA_TLIGHTUSERDATA:
+      os << "lightuserdata: " << tostring();
+      break;
+
+    default:
+      os << "unknown";
+      break;
+    }
+  }
+
+  //============================================================================
+  //
+  // This group of member functions is mirrored in Proxy
+  //
+
+  /** Retrieve the lua_State associated with the reference.
+  */
+  lua_State* state () const
+  {
+    return m_L;
+  }
+
+  //----------------------------------------------------------------------------
+  /**
+      Place the object onto the Lua stack.
+  */
+  void push (lua_State* L) const
+  {
+    assert (equalstates (L, m_L));
+    lua_rawgeti (L, LUA_REGISTRYINDEX, m_ref);
+  }
+
+  //----------------------------------------------------------------------------
+  /**
+      Pop the top of Lua stack and assign the ref to m_ref
+  */
+  void pop (lua_State* L)
+  {
+    assert (equalstates (L, m_L));
+    luaL_unref (m_L, LUA_REGISTRYINDEX, m_ref);
+    m_ref = luaL_ref (m_L, LUA_REGISTRYINDEX);
+  }
+
+  //----------------------------------------------------------------------------
+  /**
+      Determine the object type.
+
+      The return values are the same as for `lua_type`.
+  */
+  /** @{ */
+  int type () const
+  {
+    int result;
+    if (m_ref != LUA_REFNIL)
+    {
+      push (m_L);
+      result = lua_type (m_L, -1);
+      lua_pop (m_L, 1);
+    }
+    else
+    {
+      result = LUA_TNIL;
+    }
+
+    return result;
+  }
+
+  // should never happen
+  //inline bool isNone () const { return m_ref == LUA_NOREF; }
+
+  inline bool isNil () const { return type () == LUA_TNIL; }
+  inline bool isNumber () const { return type () == LUA_TNUMBER; }
+  inline bool isString () const { return type () == LUA_TSTRING; }
+  inline bool isTable () const { return type () == LUA_TTABLE; }
+  inline bool isFunction () const { return type () == LUA_TFUNCTION; }
+  inline bool isUserdata () const { return type () == LUA_TUSERDATA; }
+  inline bool isThread () const { return type () == LUA_TTHREAD; }
+  inline bool isLightUserdata () const { return type () == LUA_TLIGHTUSERDATA; }
+  /** @} */
+
+  //----------------------------------------------------------------------------
+  /**
+      Perform an explicit conversion.
+  */
+  template <class T>
+  T cast () const
+  {
+    StackPop p (m_L, 1);
+    push (m_L);
+
+    // lua_gettop is used because Userdata::getClass() doesn't handle
+    // negative stack indexes.
+    //
+    return Stack <T>::get (m_L, lua_gettop (m_L));
+  }
+
+  //----------------------------------------------------------------------------
+  /**
+      Universal implicit conversion operator.
+
+      NOTE: Visual Studio 2010 and 2012 have a bug where this function
+            is not used. See:
+
+      http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/e30b2664-a92d-445c-9db2-e8e0fbde2014
+      https://connect.microsoft.com/VisualStudio/feedback/details/771509/correct-code-doesnt-compile
+
+          // This code snippet fails to compile in vs2010,vs2012
+          struct S {
+            template <class T> inline operator T () const { return T (); }
+          };
+          int main () {
+            S () || false;
+            return 0;
+          }
+  */
+  template <class T>
+  inline operator T () const
+  {
+    return cast <T> ();
+  }
+
+  //----------------------------------------------------------------------------
+  /**
+      Universal comparison operators.
+  */
+  /** @{ */
+  template <class T>
+  bool operator== (T rhs) const
+  {
+    StackPop p (m_L, 2);
+    push (m_L);
+    Stack <T>::push (m_L, rhs);
+    return lua_compare (m_L, -2, -1, LUA_OPEQ) == 1;
+  }
+
+  template <class T>
+  bool operator< (T rhs) const
+  {
+    StackPop p (m_L, 2);
+    push (m_L);
+    Stack <T>::push (m_L, rhs);
+    return lua_compare (m_L, -2, -1, LUA_OPLT) == 1;
+  }
+
+  template <class T>
+  bool operator<= (T rhs) const
+  {
+    StackPop p (m_L, 2);
+    push (m_L);
+    Stack <T>::push (m_L, rhs);
+    return lua_compare (m_L, -2, -1, LUA_OPLE) == 1;
+  }
+
+  template <class T>
+  bool operator> (T rhs) const
+  {
+    StackPop p (m_L, 2);
+    push (m_L);
+    Stack <T>::push (m_L, rhs);
+    return lua_compare (m_L, -1, -2, LUA_OPLT) == 1;
+  }
+
+  template <class T>
+  bool operator>= (T rhs) const
+  {
+    StackPop p (m_L, 2);
+    push (m_L);
+    Stack <T>::push (m_L, rhs);
+    return lua_compare (m_L, -1, -2, LUA_OPLE) == 1;
+  }
+
+  template <class T>
+  bool rawequal (T rhs) const
+  {
+    StackPop p (m_L, 2);
+    push (m_L);
+    Stack <T>::push (m_L, rhs);
+    return lua_rawequal (m_L, -1, -2) == 1;
+  }
+  /** @} */
+
+  //----------------------------------------------------------------------------
+  /**
+      Append a value to the table.
+
+      If the table is a sequence this will add another element to it.
+  */
+  template <class T>
+  void append (T v) const
+  {
+    push (m_L);
+    Stack <T>::push (m_L, v);
+    luaL_ref (m_L, -2);
+    lua_pop (m_L, 1);
+  }
+
+  //----------------------------------------------------------------------------
+  /**
+      Call the length operator.
+
+      This is identical to applying the Lua # operator.
+  */
+  int length () const
+  {
+    StackPop p (m_L, 1);
+    push (m_L);
+    return get_length (m_L, -1);
+  }
+
+  //----------------------------------------------------------------------------
+  /**
+      Access a table value using a key.
+
+      This invokes metamethods.
+  */
+  template <class T>
+  Proxy operator[] (T key) const
+  {
+    Stack <T>::push (m_L, key);
+    return Proxy (m_L, m_ref);
+  }
+
+  //----------------------------------------------------------------------------
+  /**
+      Call Lua code.
+
+      These overloads allow Lua code to be called with up to 8 parameters.
+      The return value is provided as a LuaRef (which may be LUA_REFNIL).
+      If an error occurs, a LuaException is thrown.
+  */
+  /** @{ */
+  LuaRef const operator() () const
+  {
+    push (m_L);
+    LuaException::pcall (m_L, 0, 1);
+    return LuaRef (m_L, FromStack ());
+  }
+
+  template <class P1>
+  LuaRef const operator() (P1 p1) const
+  {
+    push (m_L);
+    Stack <P1>::push (m_L, p1);
+    LuaException::pcall (m_L, 1, 1);
+    return LuaRef (m_L, FromStack ());
+  }
+
+  template <class P1, class P2>
+  LuaRef const operator() (P1 p1, P2 p2) const
+  {
+    push (m_L);
+    Stack <P1>::push (m_L, p1);
+    Stack <P2>::push (m_L, p2);
+    LuaException::pcall (m_L, 2, 1);
+    return LuaRef (m_L, FromStack ());
+  }
+
+  template <class P1, class P2, class P3>
+  LuaRef const operator() (P1 p1, P2 p2, P3 p3) const
+  {
+    push (m_L);
+    Stack <P1>::push (m_L, p1);
+    Stack <P2>::push (m_L, p2);
+    Stack <P3>::push (m_L, p3);
+    LuaException::pcall (m_L, 3, 1);
+    return LuaRef (m_L, FromStack ());
+  }
+
+  template <class P1, class P2, class P3, class P4>
+  LuaRef const operator() (P1 p1, P2 p2, P3 p3, P4 p4) const
+  {
+    push (m_L);
+    Stack <P1>::push (m_L, p1);
+    Stack <P2>::push (m_L, p2);
+    Stack <P3>::push (m_L, p3);
+    Stack <P4>::push (m_L, p4);
+    LuaException::pcall (m_L, 4, 1);
+    return LuaRef (m_L, FromStack ());
+  }
+
+  template <class P1, class P2, class P3, class P4, class P5>
+  LuaRef const operator() (P1 p1, P2 p2, P3 p3, P4 p4, P5 p5) const
+  {
+    push (m_L);
+    Stack <P1>::push (m_L, p1);
+    Stack <P2>::push (m_L, p2);
+    Stack <P3>::push (m_L, p3);
+    Stack <P4>::push (m_L, p4);
+    Stack <P5>::push (m_L, p5);
+    LuaException::pcall (m_L, 5, 1);
+    return LuaRef (m_L, FromStack ());
+  }
+
+  template <class P1, class P2, class P3, class P4, class P5, class P6>
+  LuaRef const operator() (P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6) const
+  {
+    push (m_L);
+    Stack <P1>::push (m_L, p1);
+    Stack <P2>::push (m_L, p2);
+    Stack <P3>::push (m_L, p3);
+    Stack <P4>::push (m_L, p4);
+    Stack <P5>::push (m_L, p5);
+    Stack <P6>::push (m_L, p6);
+    LuaException::pcall (m_L, 6, 1);
+    return LuaRef (m_L, FromStack ());
+  }
+
+  template <class P1, class P2, class P3, class P4, class P5, class P6, class P7>
+  LuaRef const operator() (P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7) const
+  {
+    push (m_L);
+    Stack <P1>::push (m_L, p1);
+    Stack <P2>::push (m_L, p2);
+    Stack <P3>::push (m_L, p3);
+    Stack <P4>::push (m_L, p4);
+    Stack <P5>::push (m_L, p5);
+    Stack <P6>::push (m_L, p6);
+    Stack <P7>::push (m_L, p7);
+    LuaException::pcall (m_L, 7, 1);
+    return LuaRef (m_L, FromStack ());
+  }
+
+  template <class P1, class P2, class P3, class P4, class P5, class P6, class P7, class P8>
+  LuaRef const operator() (P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7, P8 p8) const
+  {
+    push (m_L);
+    Stack <P1>::push (m_L, p1);
+    Stack <P2>::push (m_L, p2);
+    Stack <P3>::push (m_L, p3);
+    Stack <P4>::push (m_L, p4);
+    Stack <P5>::push (m_L, p5);
+    Stack <P6>::push (m_L, p6);
+    Stack <P7>::push (m_L, p7);
+    Stack <P8>::push (m_L, p8);
+    LuaException::pcall (m_L, 8, 1);
+    return LuaRef (m_L, FromStack ());
+  }
+  /** @} */
+
+  //============================================================================
+
+private:
+  lua_State* m_L;
+  int m_ref;
+};
+
+//------------------------------------------------------------------------------
+/**
+    Stack specialization for Nil
+*/
+template <>
+struct Stack <Nil>
+{
+public:
+  static inline void push (lua_State* L, Nil)
+  {
+    lua_pushnil (L);
+  }
+};
+
+//------------------------------------------------------------------------------
+/**
+    Stack specialization for LuaRef.
+*/
+template <>
+struct Stack <LuaRef>
+{
+public:
+  // The value is const& to prevent a copy construction.
+  //
+  static inline void push (lua_State* L, LuaRef const& v)
+  {
+    v.push (L);
+  }
+
+  static inline LuaRef get (lua_State* L, int index)
+  {
+    return LuaRef (L, index, LuaRef::FromStack ());
+  }
+};
+
+//------------------------------------------------------------------------------
+/**
+    Stack specialization for Proxy.
+*/
+template <>
+struct Stack <LuaRef::Proxy>
+{
+public:
+  // The value is const& to prevent a copy construction.
+  //
+  static inline void push (lua_State* L, LuaRef::Proxy const& v)
+  {
+    v.push (L);
+  }
+};
+
+//------------------------------------------------------------------------------
+/**
+    Create a reference to a new, empty table.
+
+    This is a syntactic abbreviation for LuaRef::newTable().
+*/
+inline LuaRef newTable (lua_State* L)
+{
+  return LuaRef::newTable (L);
+}
+
+//------------------------------------------------------------------------------
+/**
+    Create a reference to a value in the global table.
+
+    This is a syntactic abbreviation for LuaRef::getGlobal().
+*/
+inline LuaRef getGlobal (lua_State *L, char const* name)
+{
+  return LuaRef::getGlobal (L, name);
+}
+
+//------------------------------------------------------------------------------
+/**
+    Write a LuaRef to a stream.
+
+    This allows LuaRef and table proxies to work with streams.
+*/
+inline std::ostream& operator<< (std::ostream& os, LuaRef const& ref)
+{
+  ref.print (os);
+  return os;
+}
+
+//------------------------------------------------------------------------------
+
+// more C++-like cast syntax
+//
+template<class T>
+inline T LuaRef_cast(LuaRef const& lr)
+{
+  return lr.cast<T>();
+}
diff --git a/libs/lua/LuaBridge/detail/Namespace.h b/libs/lua/LuaBridge/detail/Namespace.h
new file mode 100644
index 0000000..92aed81
--- /dev/null
+++ b/libs/lua/LuaBridge/detail/Namespace.h
@@ -0,0 +1,1834 @@
+//------------------------------------------------------------------------------
+/*
+  https://github.com/vinniefalco/LuaBridge
+
+  Copyright 2016, Robin Gareus <robin at gareus.org>
+  Copyright 2012, Vinnie Falco <vinnie.falco at gmail.com>
+  Copyright 2007, Nathan Reed
+
+  License: The MIT License (http://www.opensource.org/licenses/mit-license.php)
+
+  Permission is hereby granted, free of charge, to any person obtaining a copy
+  of this software and associated documentation files (the "Software"), to deal
+  in the Software without restriction, including without limitation the rights
+  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+  copies of the Software, and to permit persons to whom the Software is
+  furnished to do so, subject to the following conditions:
+
+  The above copyright notice and this permission notice shall be included in all
+  copies or substantial portions of the Software.
+
+  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+  SOFTWARE.
+*/
+//==============================================================================
+
+#ifdef LUABINDINGDOC
+#include <iostream>
+#include <typeinfo>
+#include <execinfo.h>
+#include <type_traits>
+#include <cxxabi.h>
+#include <memory>
+#include <string>
+#include <cstdlib>
+
+template <class T>
+std::string type_name()
+{
+	typedef typename std::remove_reference<T>::type TR;
+	std::unique_ptr<char, void(*)(void*)> own
+		(
+		 abi::__cxa_demangle(typeid(TR).name(), nullptr,
+			 nullptr, nullptr),
+		 std::free
+		);
+	std::string r = own != nullptr ? own.get() : typeid(TR).name();
+	if (std::is_const<TR>::value)
+		r += " const";
+	if (std::is_volatile<TR>::value)
+		r += " volatile";
+	if (std::is_lvalue_reference<T>::value)
+		r += "&";
+	else if (std::is_rvalue_reference<T>::value)
+		r += "&&";
+	return r;
+}
+
+//#define LUADOCOUT
+
+#ifdef LUADOCOUT // lua
+#define KEYSTA "[\""
+#define KEYEND "\"] = "
+#else // JSON
+#define KEYSTA "\""
+#define KEYEND "\" : "
+#endif
+
+#define CLASSDOC(TYPE, LUANAME, DECL, PARENTDECL) \
+  if (LuaBindingDoc::printBindings ()) { \
+    std::cout <<   "{ " << KEYSTA << "type"   << KEYEND << "  \""  << TYPE << "\",\n"; \
+    std::cout <<   "  " << KEYSTA << "lua"    << KEYEND << "   \"" << LUANAME << "\",\n"; \
+    std::cout <<   "  " << KEYSTA << "decl"   << KEYEND << "  \"" << DECL << "\",\n"; \
+    std::cout <<   "  " << KEYSTA << "parent" << KEYEND << "\""  << PARENTDECL << "\"\n"; \
+    std::cout <<   "},\n"; \
+  }
+
+#define PRINTDOC(TYPE, LUANAME, RETVAL, DECL) \
+  if (LuaBindingDoc::printBindings ()) { \
+    std::cout <<   "{ " << KEYSTA << "type"   << KEYEND << "  \""  << TYPE << "\",\n"; \
+    std::cout <<   "  " << KEYSTA << "lua"    << KEYEND << "   \"" << LUANAME << "\",\n"; \
+    if (!(RETVAL).empty()) { \
+      std::cout << "  " << KEYSTA << "ret"    << KEYEND << "   \"" << (RETVAL) << "\",\n"; \
+    } \
+    std::cout <<   "  " << KEYSTA << "decl"   << KEYEND << "  \""  << DECL << "\"\n"; \
+    std::cout <<   "},\n"; \
+  }
+
+#define FUNDOC(TYPE, NAME, FUNCTOR) \
+  PRINTDOC(TYPE, _name << NAME, \
+      type_name< typename FuncTraits <FUNCTOR>::ReturnType >(), \
+      type_name< typename FuncTraits <FUNCTOR>::DeclType >())
+
+#define DATADOC(TYPE, NAME, FUNCTOR) \
+  PRINTDOC(TYPE, _name << NAME, \
+      std::string(), \
+      type_name< decltype(FUNCTOR) >())\
+
+
+#else
+
+#define CLASSDOC(TYPE, LUANAME, DECL, PARENTDECL)
+#define PRINTDOC(TYPE, LUANAME, RETVAL, DECL)
+#define FUNDOC(TYPE, NAME, FUNCTOR)
+#define DATADOC(TYPE, NAME, FUNCTOR)
+
+#endif
+
+/** Provides C++ to Lua registration capabilities.
+
+    This class is not instantiated directly, call `getGlobalNamespace` to start
+    the registration process.
+*/
+class Namespace
+{
+private:
+  Namespace& operator= (Namespace const& other);
+
+  lua_State* const L;
+  int mutable m_stackSize;
+
+private:
+  //============================================================================
+  /**
+    Error reporting.
+
+    VF: This function looks handy, why aren't we using it?
+  */
+#if 0
+  static int luaError (lua_State* L, std::string message)
+  {
+    assert (lua_isstring (L, lua_upvalueindex (1)));
+    std::string s;
+
+    // Get information on the caller's caller to format the message,
+    // so the error appears to originate from the Lua source.
+    lua_Debug ar;
+    int result = lua_getstack (L, 2, &ar);
+    if (result != 0)
+    {
+      lua_getinfo (L, "Sl", &ar);
+      s = ar.short_src;
+      if (ar.currentline != -1)
+      {
+        // poor mans int to string to avoid <strstrream>.
+        lua_pushnumber (L, ar.currentline);
+        s = s + ":" + lua_tostring (L, -1) + ": ";
+        lua_pop (L, 1);
+      }
+    }
+
+    s = s + message;
+
+    return luaL_error (L, s.c_str ());
+  }
+#endif
+
+  //----------------------------------------------------------------------------
+  /**
+    Pop the Lua stack.
+  */
+  void pop (int n) const
+  {
+    if (m_stackSize >= n && lua_gettop (L) >= n)
+    {
+      lua_pop (L, n);
+      m_stackSize -= n;
+    }
+    else
+    {
+      throw std::logic_error ("invalid stack");
+    }
+  }
+
+private:
+  /**
+    Factored base to reduce template instantiations.
+  */
+  class ClassBase
+  {
+  private:
+    ClassBase& operator= (ClassBase const& other);
+
+  protected:
+    friend class Namespace;
+
+    lua_State* const L;
+    int mutable m_stackSize;
+
+#ifdef LUABINDINGDOC
+    std::string _name;
+    const Namespace* _parent;
+#endif
+
+  protected:
+    //--------------------------------------------------------------------------
+    /**
+      __index metamethod for a class.
+
+      This implements member functions, data members, and property members.
+      Functions are stored in the metatable and const metatable. Data members
+      and property members are in the __propget table.
+
+      If the key is not found, the search proceeds up the hierarchy of base
+      classes.
+    */
+    static int indexMetaMethod (lua_State* L)
+    {
+      int result = 0;
+
+      assert (lua_isuserdata (L, 1));               // warn on security bypass
+      lua_getmetatable (L, 1);                      // get metatable for object
+      for (;;)
+      {
+        lua_pushvalue (L, 2);                       // push key arg2
+        lua_rawget (L, -2);                         // lookup key in metatable
+        if (lua_iscfunction (L, -1))                // ensure its a cfunction
+        {
+          lua_remove (L, -2);                       // remove metatable
+          result = 1;
+          break;
+        }
+        else if (lua_isnil (L, -1))
+        {
+          lua_pop (L, 1);
+        }
+        else
+        {
+          lua_pop (L, 2);
+          throw std::logic_error ("not a cfunction");
+        }
+
+        rawgetfield (L, -1, "__propget");           // get __propget table
+        if (lua_istable (L, -1))                    // ensure it is a table
+        {
+          lua_pushvalue (L, 2);                     // push key arg2
+          lua_rawget (L, -2);                       // lookup key in __propget
+          lua_remove (L, -2);                       // remove __propget
+          if (lua_iscfunction (L, -1))              // ensure its a cfunction
+          {
+            lua_remove (L, -2);                     // remove metatable
+            lua_pushvalue (L, 1);                   // push class arg1
+            lua_call (L, 1, 1);
+            result = 1;
+            break;
+          }
+          else if (lua_isnil (L, -1))
+          {
+            lua_pop (L, 1);
+          }
+          else
+          {
+            lua_pop (L, 2);
+
+            // We only put cfunctions into __propget.
+            throw std::logic_error ("not a cfunction");
+          }
+        }
+        else
+        {
+          lua_pop (L, 2);
+
+          // __propget is missing, or not a table.
+          throw std::logic_error ("missing __propget table");
+        }
+
+        // Repeat the lookup in the __parent metafield,
+        // or return nil if the field doesn't exist.
+        rawgetfield (L, -1, "__parent");
+        if (lua_istable (L, -1))
+        {
+          // Remove metatable and repeat the search in __parent.
+          lua_remove (L, -2);
+        }
+        else if (lua_isnil (L, -1))
+        {
+          result = 1;
+          break;
+        }
+        else
+        {
+          lua_pop (L, 2);
+
+          throw std::logic_error ("__parent is not a table");
+        }
+      }
+
+      return result;
+    }
+
+    //--------------------------------------------------------------------------
+    /**
+      __newindex metamethod for classes.
+
+      This supports writable variables and properties on class objects. The
+      corresponding object is passed in the first parameter to the set function.
+    */
+    static int newindexMetaMethod (lua_State* L)
+    {
+      int result = 0;
+
+      lua_getmetatable (L, 1);
+
+      for (;;)
+      {
+        // Check __propset
+        rawgetfield (L, -1, "__propset");
+        if (!lua_isnil (L, -1))
+        {
+          lua_pushvalue (L, 2);
+          lua_rawget (L, -2);
+          if (!lua_isnil (L, -1))
+          {
+            // found it, call the setFunction.
+            assert (lua_isfunction (L, -1));
+            lua_pushvalue (L, 1);
+            lua_pushvalue (L, 3);
+            lua_call (L, 2, 0);
+            result = 0;
+            break;
+          }
+          lua_pop (L, 1);
+        }
+        lua_pop (L, 1);
+
+        // Repeat the lookup in the __parent metafield.
+        rawgetfield (L, -1, "__parent");
+        if (lua_isnil (L, -1))
+        {
+          // Either the property or __parent must exist.
+          result = luaL_error (L,
+            "no member named '%s'", lua_tostring (L, 2));
+        }
+        lua_remove (L, -2);
+      }
+
+      return result;
+    }
+
+    //--------------------------------------------------------------------------
+    /**
+      Create the const table.
+    */
+    void createConstTable (char const* name)
+    {
+      lua_newtable (L);
+      lua_pushvalue (L, -1);
+      lua_setmetatable (L, -2);
+      lua_pushboolean (L, 1);
+      lua_rawsetp (L, -2, getIdentityKey ());
+      lua_pushstring (L, (std::string ("const ") + name).c_str ());
+      rawsetfield (L, -2, "__type");
+      lua_pushcfunction (L, &indexMetaMethod);
+      rawsetfield (L, -2, "__index");
+      lua_pushcfunction (L, &newindexMetaMethod);
+      rawsetfield (L, -2, "__newindex");
+      lua_newtable (L);
+      rawsetfield (L, -2, "__propget");
+
+      if (Security::hideMetatables ())
+      {
+        lua_pushnil (L);
+        rawsetfield (L, -2, "__metatable");
+      }
+    }
+
+    //--------------------------------------------------------------------------
+    /**
+      Create the class table.
+
+      The Lua stack should have the const table on top.
+    */
+    void createClassTable (char const* name)
+    {
+      lua_newtable (L);
+      lua_pushvalue (L, -1);
+      lua_setmetatable (L, -2);
+      lua_pushboolean (L, 1);
+      lua_rawsetp (L, -2, getIdentityKey ());
+      lua_pushstring (L, name);
+      rawsetfield (L, -2, "__type");
+      lua_pushcfunction (L, &indexMetaMethod);
+      rawsetfield (L, -2, "__index");
+      lua_pushcfunction (L, &newindexMetaMethod);
+      rawsetfield (L, -2, "__newindex");
+      lua_newtable (L);
+      rawsetfield (L, -2, "__propget");
+      lua_newtable (L);
+      rawsetfield (L, -2, "__propset");
+
+      lua_pushvalue (L, -2);
+      rawsetfield (L, -2, "__const"); // point to const table
+
+      lua_pushvalue (L, -1);
+      rawsetfield (L, -3, "__class"); // point const table to class table
+
+      if (Security::hideMetatables ())
+      {
+        lua_pushnil (L);
+        rawsetfield (L, -2, "__metatable");
+      }
+    }
+
+    //--------------------------------------------------------------------------
+    /**
+      Create the static table.
+
+      The Lua stack should have:
+        -1 class table
+        -2 const table
+        -3 enclosing namespace
+    */
+    void createStaticTable (char const* name)
+    {
+      lua_newtable (L);
+      lua_newtable (L);
+      lua_pushvalue (L, -1);
+      lua_setmetatable (L, -3);
+      lua_insert (L, -2);
+      rawsetfield (L, -5, name);
+
+#if 0
+      lua_pushlightuserdata (L, this);
+      lua_pushcclosure (L, &tostringMetaMethod, 1);
+      rawsetfield (L, -2, "__tostring");
+#endif
+      lua_pushcfunction (L, &CFunc::indexMetaMethod);
+      rawsetfield (L, -2, "__index");
+      lua_pushcfunction (L, &CFunc::newindexMetaMethod);
+      rawsetfield (L, -2, "__newindex");
+      lua_newtable (L);
+      rawsetfield (L, -2, "__propget");
+      lua_newtable (L);
+      rawsetfield (L, -2, "__propset");
+
+      lua_pushvalue (L, -2);
+      rawsetfield (L, -2, "__class"); // point to class table
+
+      if (Security::hideMetatables ())
+      {
+        lua_pushnil (L);
+        rawsetfield (L, -2, "__metatable");
+      }
+    }
+
+    //==========================================================================
+    /**
+      lua_CFunction to construct a class object wrapped in a container.
+    */
+    template <class Params, class C>
+    static int ctorContainerProxy (lua_State* L)
+    {
+      typedef typename ContainerTraits <C>::Type T;
+      ArgList <Params, 2> args (L);
+      T* const p = Constructor <T, Params>::call (args);
+      UserdataSharedHelper <C, false>::push (L, p);
+      return 1;
+    }
+
+    //--------------------------------------------------------------------------
+    /**
+      lua_CFunction to construct a class object in-place in the userdata.
+    */
+    template <class Params, class T>
+    static int ctorPlacementProxy (lua_State* L)
+    {
+      ArgList <Params, 2> args (L);
+      Constructor <T, Params>::call (UserdataValue <T>::place (L), args);
+      return 1;
+    }
+
+    //--------------------------------------------------------------------------
+    /**
+      Pop the Lua stack.
+    */
+    void pop (int n) const
+    {
+      if (m_stackSize >= n && lua_gettop (L) >= n)
+      {
+        lua_pop (L, n);
+        m_stackSize -= n;
+      }
+      else
+      {
+        throw std::logic_error ("invalid stack");
+      }
+    }
+
+  public:
+    //--------------------------------------------------------------------------
+    explicit ClassBase (lua_State* L_)
+      : L (L_)
+      , m_stackSize (0)
+    {
+    }
+
+    //--------------------------------------------------------------------------
+    /**
+      Copy Constructor.
+    */
+    ClassBase (ClassBase const& other)
+      : L (other.L)
+      , m_stackSize (0)
+#ifdef LUABINDINGDOC
+      , _name (other._name)
+      , _parent (other._parent)
+#endif
+    {
+      m_stackSize = other.m_stackSize;
+      other.m_stackSize = 0;
+    }
+
+    ~ClassBase ()
+    {
+      pop (m_stackSize);
+    }
+  };
+
+  //============================================================================
+  //
+  // Class
+  //
+  //============================================================================
+  /**
+    Provides a class registration in a lua_State.
+
+    After contstruction the Lua stack holds these objects:
+      -1 static table
+      -2 class table
+      -3 const table
+      -4 (enclosing namespace)
+  */
+  template <class T>
+  class Class : virtual public ClassBase
+  {
+  public:
+    //==========================================================================
+    /**
+      Register a new class or add to an existing class registration.
+    */
+    Class (char const* name, Namespace const* parent) : ClassBase (parent->L)
+    {
+#ifdef LUABINDINGDOC
+      _parent = parent;
+      _name = parent->_name + name + ":";
+#endif
+      PRINTDOC ("[C] Class", parent->_name << name, std::string(), type_name <T>())
+      m_stackSize = parent->m_stackSize + 3;
+      parent->m_stackSize = 0;
+
+      assert (lua_istable (L, -1));
+      rawgetfield (L, -1, name);
+
+      if (lua_isnil (L, -1))
+      {
+        lua_pop (L, 1);
+
+        createConstTable (name);
+        lua_pushcfunction (L, &CFunc::gcMetaMethod <T>);
+        rawsetfield (L, -2, "__gc");
+
+        createClassTable (name);
+        lua_pushcfunction (L, &CFunc::gcMetaMethod <T>);
+        rawsetfield (L, -2, "__gc");
+
+        createStaticTable (name);
+
+        // Map T back to its tables.
+        lua_pushvalue (L, -1);
+        lua_rawsetp (L, LUA_REGISTRYINDEX, ClassInfo <T>::getStaticKey ());
+        lua_pushvalue (L, -2);
+        lua_rawsetp (L, LUA_REGISTRYINDEX, ClassInfo <T>::getClassKey ());
+        lua_pushvalue (L, -3);
+        lua_rawsetp (L, LUA_REGISTRYINDEX, ClassInfo <T>::getConstKey ());
+      }
+      else
+      {
+        lua_pop (L, 1);
+        lua_rawgetp (L, LUA_REGISTRYINDEX, ClassInfo <T>::getStaticKey ());
+        rawgetfield (L, -1, "__class");
+        rawgetfield (L, -1, "__const");
+
+        // Reverse the top 3 stack elements
+        lua_insert (L, -3);
+        lua_insert (L, -2);
+      }
+    }
+
+    //==========================================================================
+    /**
+      Derive a new class.
+    */
+    Class (char const* name, Namespace const* parent, void const* const staticKey)
+      : ClassBase (parent->L)
+    {
+#ifdef LUABINDINGDOC
+      _parent = parent;
+      _name = parent->_name + name + ":";
+#endif
+      m_stackSize = parent->m_stackSize + 3;
+      parent->m_stackSize = 0;
+
+      assert (lua_istable (L, -1));
+
+      createConstTable (name);
+      lua_pushcfunction (L, &CFunc::gcMetaMethod <T>);
+      rawsetfield (L, -2, "__gc");
+
+      createClassTable (name);
+      lua_pushcfunction (L, &CFunc::gcMetaMethod <T>);
+      rawsetfield (L, -2, "__gc");
+
+      createStaticTable (name);
+
+      lua_rawgetp (L, LUA_REGISTRYINDEX, staticKey);
+      assert (lua_istable (L, -1));
+      rawgetfield (L, -1, "__class");
+      assert (lua_istable (L, -1));
+      rawgetfield (L, -1, "__const");
+      assert (lua_istable (L, -1));
+
+      rawsetfield (L, -6, "__parent");
+      rawsetfield (L, -4, "__parent");
+      rawsetfield (L, -2, "__parent");
+
+      lua_pushvalue (L, -1);
+      lua_rawsetp (L, LUA_REGISTRYINDEX, ClassInfo <T>::getStaticKey ());
+      lua_pushvalue (L, -2);
+      lua_rawsetp (L, LUA_REGISTRYINDEX, ClassInfo <T>::getClassKey ());
+      lua_pushvalue (L, -3);
+      lua_rawsetp (L, LUA_REGISTRYINDEX, ClassInfo <T>::getConstKey ());
+    }
+
+    //--------------------------------------------------------------------------
+    /**
+      Continue registration in the enclosing namespace.
+    */
+    Namespace endClass ()
+    {
+      return Namespace (this);
+    }
+
+    //--------------------------------------------------------------------------
+    /**
+      Add or replace a static data member.
+    */
+    template <class U>
+    Class <T>& addStaticData (char const* name, U* pu, bool isWritable = true)
+    {
+      DATADOC ("Static Data Member", name, pu)
+      assert (lua_istable (L, -1));
+
+      rawgetfield (L, -1, "__propget");
+      assert (lua_istable (L, -1));
+      lua_pushlightuserdata (L, pu);
+      lua_pushcclosure (L, &CFunc::getVariable <U>, 1);
+      rawsetfield (L, -2, name);
+      lua_pop (L, 1);
+
+      rawgetfield (L, -1, "__propset");
+      assert (lua_istable (L, -1));
+      if (isWritable)
+      {
+        lua_pushlightuserdata (L, pu);
+        lua_pushcclosure (L, &CFunc::setVariable <U>, 1);
+      }
+      else
+      {
+        lua_pushstring (L, name);
+        lua_pushcclosure (L, &CFunc::readOnlyError, 1);
+      }
+      rawsetfield (L, -2, name);
+      lua_pop (L, 1);
+
+      return *this;
+    }
+
+    //--------------------------------------------------------------------------
+#if 0 // unused
+    /**
+      Add or replace a static property member.
+
+      If the set function is null, the property is read-only.
+    */
+    template <class U>
+    Class <T>& addStaticProperty (char const* name, U (*get)(), void (*set)(U) = 0)
+    {
+      typedef U (*get_t)();
+      typedef void (*set_t)(U);
+
+      assert (lua_istable (L, -1));
+
+      rawgetfield (L, -1, "__propget");
+      assert (lua_istable (L, -1));
+      new (lua_newuserdata (L, sizeof (get))) get_t (get);
+      lua_pushcclosure (L, &CFunc::Call <U (*) (void)>::f, 1);
+      rawsetfield (L, -2, name);
+      lua_pop (L, 1);
+
+      rawgetfield (L, -1, "__propset");
+      assert (lua_istable (L, -1));
+      if (set != 0)
+      {
+        new (lua_newuserdata (L, sizeof (set))) set_t (set);
+        lua_pushcclosure (L, &CFunc::Call <void (*) (U)>::f, 1);
+      }
+      else
+      {
+        lua_pushstring (L, name);
+        lua_pushcclosure (L, &CFunc::readOnlyError, 1);
+      }
+      rawsetfield (L, -2, name);
+      lua_pop (L, 1);
+
+      return *this;
+    }
+#endif
+
+    //--------------------------------------------------------------------------
+    /**
+      Add or replace a static member function.
+    */
+    template <class FP>
+    Class <T>& addStaticFunction (char const* name, FP const fp)
+    {
+      FUNDOC ("Static Member Function", name, FP)
+      new (lua_newuserdata (L, sizeof (fp))) FP (fp);
+      lua_pushcclosure (L, &CFunc::Call <FP>::f, 1);
+      rawsetfield (L, -2, name);
+
+      return *this;
+    }
+
+    //--------------------------------------------------------------------------
+    /**
+      Add or replace a lua_CFunction.
+    */
+    Class <T>& addStaticCFunction (char const* name, int (*const fp)(lua_State*))
+    {
+      DATADOC ("Static C Function", name, fp)
+      lua_pushcfunction (L, fp);
+      rawsetfield (L, -2, name);
+      return *this;
+    }
+
+    //--------------------------------------------------------------------------
+    /**
+      Add or replace a data member.
+    */
+    template <class U>
+    Class <T>& addData (char const* name, const U T::* mp, bool isWritable = true)
+    {
+      DATADOC ("Data Member", name, mp)
+      typedef const U T::*mp_t;
+
+      // Add to __propget in class and const tables.
+      {
+        rawgetfield (L, -2, "__propget");
+        rawgetfield (L, -4, "__propget");
+        new (lua_newuserdata (L, sizeof (mp_t))) mp_t (mp);
+        lua_pushcclosure (L, &CFunc::getProperty <T,U>, 1);
+        lua_pushvalue (L, -1);
+        rawsetfield (L, -4, name);
+        rawsetfield (L, -2, name);
+        lua_pop (L, 2);
+      }
+
+      if (isWritable)
+      {
+        // Add to __propset in class table.
+        rawgetfield (L, -2, "__propset");
+        assert (lua_istable (L, -1));
+        new (lua_newuserdata (L, sizeof (mp_t))) mp_t (mp);
+        lua_pushcclosure (L, &CFunc::setProperty <T,U>, 1);
+        rawsetfield (L, -2, name);
+        lua_pop (L, 1);
+      }
+
+      return *this;
+    }
+
+#if 0 // unused
+    //--------------------------------------------------------------------------
+    /**
+      Add or replace a property member.
+    */
+    template <class TG, class TS>
+    Class <T>& addProperty (char const* name, TG (T::* get) () const, void (T::* set) (TS))
+    {
+      // Add to __propget in class and const tables.
+      {
+        rawgetfield (L, -2, "__propget");
+        rawgetfield (L, -4, "__propget");
+        typedef TG (T::*get_t) () const;
+        new (lua_newuserdata (L, sizeof (get_t))) get_t (get);
+        lua_pushcclosure (L, &CFunc::CallConstMember <get_t>::f, 1);
+        lua_pushvalue (L, -1);
+        rawsetfield (L, -4, name);
+        rawsetfield (L, -2, name);
+        lua_pop (L, 2);
+      }
+
+      {
+        // Add to __propset in class table.
+        rawgetfield (L, -2, "__propset");
+        assert (lua_istable (L, -1));
+        typedef void (T::* set_t) (TS);
+        new (lua_newuserdata (L, sizeof (set_t))) set_t (set);
+        lua_pushcclosure (L, &CFunc::CallMember <set_t>::f, 1);
+        rawsetfield (L, -2, name);
+        lua_pop (L, 1);
+      }
+
+      return *this;
+    }
+
+    // read-only
+    template <class TG>
+    Class <T>& addProperty (char const* name, TG (T::* get) () const)
+    {
+      // Add to __propget in class and const tables.
+      rawgetfield (L, -2, "__propget");
+      rawgetfield (L, -4, "__propget");
+      typedef TG (T::*get_t) () const;
+      new (lua_newuserdata (L, sizeof (get_t))) get_t (get);
+      lua_pushcclosure (L, &CFunc::CallConstMember <get_t>::f, 1);
+      lua_pushvalue (L, -1);
+      rawsetfield (L, -4, name);
+      rawsetfield (L, -2, name);
+      lua_pop (L, 2);
+
+      return *this;
+    }
+
+    //--------------------------------------------------------------------------
+    /**
+      Add or replace a property member, by proxy.
+
+      When a class is closed for modification and does not provide (or cannot
+      provide) the function signatures necessary to implement get or set for
+      a property, this will allow non-member functions act as proxies.
+
+      Both the get and the set functions require a T const* and T* in the first
+      argument respectively.
+    */
+    template <class TG, class TS>
+    Class <T>& addProperty (char const* name, TG (*get) (T const*), void (*set) (T*, TS))
+    {
+      // Add to __propget in class and const tables.
+      {
+        rawgetfield (L, -2, "__propget");
+        rawgetfield (L, -4, "__propget");
+        typedef TG (*get_t) (T const*);
+        new (lua_newuserdata (L, sizeof (get_t))) get_t (get);
+        lua_pushcclosure (L, &CFunc::Call <get_t>::f, 1);
+        lua_pushvalue (L, -1);
+        rawsetfield (L, -4, name);
+        rawsetfield (L, -2, name);
+        lua_pop (L, 2);
+      }
+
+      if (set != 0)
+      {
+        // Add to __propset in class table.
+        rawgetfield (L, -2, "__propset");
+        assert (lua_istable (L, -1));
+        typedef void (*set_t) (T*, TS);
+        new (lua_newuserdata (L, sizeof (set_t))) set_t (set);
+        lua_pushcclosure (L, &CFunc::Call <set_t>::f, 1);
+        rawsetfield (L, -2, name);
+        lua_pop (L, 1);
+      }
+
+      return *this;
+    }
+
+    // read-only
+    template <class TG, class TS>
+    Class <T>& addProperty (char const* name, TG (*get) (T const*))
+    {
+      // Add to __propget in class and const tables.
+      rawgetfield (L, -2, "__propget");
+      rawgetfield (L, -4, "__propget");
+      typedef TG (*get_t) (T const*);
+      new (lua_newuserdata (L, sizeof (get_t))) get_t (get);
+      lua_pushcclosure (L, &CFunc::Call <get_t>::f, 1);
+      lua_pushvalue (L, -1);
+      rawsetfield (L, -4, name);
+      rawsetfield (L, -2, name);
+      lua_pop (L, 2);
+
+      return *this;
+    }
+#endif
+    //--------------------------------------------------------------------------
+    /**
+        Add or replace a member function.
+    */
+    template <class MemFn>
+    Class <T>& addFunction (char const* name, MemFn mf)
+    {
+      FUNDOC("Member Function", name, MemFn)
+      CFunc::CallMemberFunctionHelper <MemFn, FuncTraits <MemFn>::isConstMemberFunction>::add (L, name, mf);
+      return *this;
+    }
+
+    template <class MemFn>
+    Class <T>& addPtrFunction (char const* name, MemFn mf)
+    {
+      FUNDOC("Member Pointer Function", name, MemFn)
+      CFunc::CallMemberPtrFunctionHelper <MemFn>::add (L, name, mf);
+      return *this;
+    }
+
+    template <class MemFn>
+    Class <T>& addWPtrFunction (char const* name, MemFn mf)
+    {
+      FUNDOC("Member Weak Pointer Function", name, MemFn)
+      CFunc::CallMemberWPtrFunctionHelper <MemFn>::add (L, name, mf);
+      return *this;
+    }
+
+    template <class MemFn>
+    Class <T>& addRefFunction (char const* name, MemFn mf)
+    {
+      FUNDOC("Member Function RefReturn", name, MemFn)
+      CFunc::CallMemberRefFunctionHelper <MemFn, FuncTraits <MemFn>::isConstMemberFunction>::add (L, name, mf);
+      return *this;
+    }
+
+
+    //--------------------------------------------------------------------------
+    /**
+        Add or replace a member lua_CFunction.
+    */
+    Class <T>& addCFunction (char const* name, int (T::*mfp)(lua_State*))
+    {
+      DATADOC ("C Function", name, mfp)
+      typedef int (T::*MFP)(lua_State*);
+      assert (lua_istable (L, -1));
+      new (lua_newuserdata (L, sizeof (mfp))) MFP (mfp);
+      lua_pushcclosure (L, &CFunc::CallMemberCFunction <T>::f, 1);
+      rawsetfield (L, -3, name); // class table
+
+      return *this;
+    }
+
+    // custom callback - extend existing classes
+    // with non-class member functions (e.g STL iterator)
+    Class <T>& addExtCFunction (char const* name, int (*const fp)(lua_State*))
+    {
+      DATADOC ("Ext C Function", name, fp)
+      assert (lua_istable (L, -1));
+      lua_pushcclosure (L, fp, 0);
+      rawsetfield (L, -3, name); // class table
+      return *this;
+    }
+
+    //--------------------------------------------------------------------------
+    /**
+        Add or replace a const member lua_CFunction.
+    */
+    Class <T>& addCFunction (char const* name, int (T::*mfp)(lua_State*) const)
+    {
+      DATADOC ("Const C Member Function", name, mfp)
+      typedef int (T::*MFP)(lua_State*) const;
+      assert (lua_istable (L, -1));
+      new (lua_newuserdata (L, sizeof (mfp))) MFP (mfp);
+      lua_pushcclosure (L, &CFunc::CallConstMemberCFunction <T>::f, 1);
+      lua_pushvalue (L, -1);
+      rawsetfield (L, -5, name); // const table
+      rawsetfield (L, -3, name); // class table
+
+      return *this;
+    }
+
+    /**
+        Add or replace a static const data
+    */
+    template <typename U>
+      Class <T>& addConst (char const* name, const U val)
+      {
+        DATADOC ("Constant/Enum Member", name, val)
+        assert (lua_istable (L, -1));
+
+        rawgetfield (L, -1, "__propget"); // static
+        new (lua_newuserdata (L, sizeof (val))) U (val);
+        lua_pushcclosure (L, &CFunc::getConst <U>, 1);
+        rawsetfield (L, -2, name);
+        lua_pop (L, 1);
+
+        rawgetfield (L, -1, "__propset"); // static
+        lua_pushstring (L, name);
+        lua_pushcclosure (L, &CFunc::readOnlyError, 1);
+        rawsetfield (L, -2, name);
+        lua_pop (L, 1);
+        return *this;
+      }
+
+    //--------------------------------------------------------------------------
+    /**
+      Add or replace a primary Constructor.
+
+      The primary Constructor is invoked when calling the class type table
+      like a function.
+
+      The template parameter should be a function pointer type that matches
+      the desired Constructor (since you can't take the address of a Constructor
+      and pass it as an argument).
+    */
+    template <class MemFn, class C>
+    Class <T>& addConstructor ()
+    {
+      FUNDOC("Constructor", "", MemFn)
+      lua_pushcclosure (L,
+        &ctorContainerProxy <typename FuncTraits <MemFn>::Params, C>, 0);
+      rawsetfield(L, -2, "__call");
+
+      return *this;
+    }
+
+    template <class MemFn>
+    Class <T>& addConstructor ()
+    {
+      FUNDOC("Constructor", "", MemFn)
+      lua_pushcclosure (L,
+        &ctorPlacementProxy <typename FuncTraits <MemFn>::Params, T>, 0);
+      rawsetfield(L, -2, "__call");
+
+      return *this;
+    }
+
+    Class <T>& addVoidConstructor ()
+    {
+      return addConstructor <void (*) ()> ();
+    }
+
+    Class <T>& addEqualCheck ()
+    {
+      PRINTDOC("Member Function", _name << "sameinstance", std::string("bool"), std::string("void (*)(" + type_name <T>() + ")"))
+      assert (lua_istable (L, -1));
+      lua_pushcclosure (L, &CFunc::ClassEqualCheck <T>::f, 0);
+      rawsetfield (L, -3, "sameinstance");
+      return *this;
+    }
+
+    template <class U>
+    Class <T>& addCast (char const* name)
+    {
+      PRINTDOC("Cast", _name << name,
+          type_name< U >(),
+          type_name< U >() << " (" << type_name< T >() << "::*)()")
+
+      assert (lua_istable (L, -1));
+      lua_pushcclosure (L, &CFunc::CastClass <T, U>::f, 0);
+      rawsetfield (L, -3, name); // class table
+
+      lua_pushcclosure (L, &CFunc::CastConstClass <T, U>::f, 0);
+      rawsetfield (L, -4, name); // const table
+      return *this;
+    }
+
+  };
+
+  /** C Array to/from table */
+  template <typename T>
+  class Array : virtual public ClassBase
+  {
+  public:
+    Array (char const* name, Namespace const* parent) : ClassBase (parent->L)
+    {
+#ifdef LUABINDINGDOC
+      _parent = parent;
+      _name = parent->_name + name + ":";
+#endif
+      PRINTDOC ("[C] Array", parent->_name << name,
+          std::string(), type_name <T>() + "*")
+      PRINTDOC ("Ext C Function", _name << "array",
+          std::string(""), "int (*)(lua_State*)")
+      PRINTDOC ("Ext C Function", _name << "get_table",
+          std::string(""), "int (*)(lua_State*)")
+      PRINTDOC ("Ext C Function", _name << "set_table",
+          std::string(""), "int (*)(lua_State*)")
+      PRINTDOC("Member Function", _name << "sameinstance",
+          std::string("bool"), std::string("bool (*)(" + type_name <T>() + "*)"))
+      PRINTDOC("Member Function", _name << "offset",
+          std::string(type_name <T>() + "*"), std::string(type_name <T>() + "* (*)(unsigned int)"))
+
+      m_stackSize = parent->m_stackSize + 3;
+      parent->m_stackSize = 0;
+
+#if 0 // don't allow to duplicates handlers for same array-type
+      assert (lua_istable (L, -1));
+      lua_rawgetp (L, LUA_REGISTRYINDEX, ClassInfo <T>::getClassKey ());
+      if (lua_istable (L, -1)) {
+        lua_pushnil (L);
+        lua_pushnil (L);
+        return;
+      }
+      lua_pop (L, 1);
+#endif
+
+      assert (lua_istable (L, -1));
+      rawgetfield (L, -1, name);
+
+      if (lua_isnil (L, -1))
+      {
+        lua_pop (L, 1);
+
+        // register array access in global namespace
+        luaL_newmetatable (L, typeid(T).name());
+        lua_pushcclosure (L, CFunc::array_index<T>, 0);
+        lua_setfield(L, -2, "__index");
+        lua_pushcclosure (L, CFunc::array_newindex<T>, 0);
+        lua_setfield(L, -2, "__newindex");
+        lua_pop (L, 1);
+
+        createConstTable (name);
+        lua_pushcfunction (L, &CFunc::gcMetaMethod <T>);
+        rawsetfield (L, -2, "__gc");
+
+        createClassTable (name);
+        lua_pushcfunction (L, &CFunc::gcMetaMethod <T>);
+        rawsetfield (L, -2, "__gc");
+
+        createStaticTable (name);
+
+        // Map T back to its tables.
+        lua_pushvalue (L, -1);
+        lua_rawsetp (L, LUA_REGISTRYINDEX, ClassInfo <T>::getStaticKey ());
+        lua_pushvalue (L, -2);
+        lua_rawsetp (L, LUA_REGISTRYINDEX, ClassInfo <T>::getClassKey ());
+        lua_pushvalue (L, -3);
+        lua_rawsetp (L, LUA_REGISTRYINDEX, ClassInfo <T>::getConstKey ());
+
+        assert (lua_istable (L, -1));
+        lua_pushcclosure (L, &CFunc::getArray <T>, 0);
+        rawsetfield (L, -3, "array"); // class table
+
+        lua_pushcclosure (L, &CFunc::getTable <T>, 0);
+        rawsetfield (L, -3, "get_table"); // class table
+
+        lua_pushcclosure (L, &CFunc::setTable <T>, 0);
+        rawsetfield (L, -3, "set_table"); // class table
+
+        lua_pushcclosure (L, &CFunc::ClassEqualCheck <T>::f, 0);
+        rawsetfield (L, -3, "sameinstance");
+
+        lua_pushcclosure (L, &CFunc::offsetArray <T>, 0);
+        rawsetfield (L, -3, "offset"); // class table
+
+      }
+      else
+      {
+        lua_pushnil (L);
+        lua_pushnil (L);
+      }
+    }
+
+    Namespace endArray ()
+    {
+      return Namespace (this);
+    }
+  };
+
+  /** Boost Weak & Shared Pointer Class Wrapper */
+  template <class T>
+  class WSPtrClass : virtual public ClassBase
+  {
+  public:
+    WSPtrClass (char const* name, Namespace const* parent)
+      : ClassBase (parent->L)
+      , weak (name, parent)
+      , shared (name, parent)
+    {
+#ifdef LUABINDINGDOC
+      _parent = parent;
+      _name = parent->_name + name + ":";
+#endif
+      PRINTDOC ("[C] Weak/Shared Pointer Class",
+          parent->_name + name,
+          std::string(), type_name <T>())
+      m_stackSize = weak.m_stackSize;
+      parent->m_stackSize = weak.m_stackSize = shared.m_stackSize = 0;
+      lua_pop (L, 3);
+    }
+
+    WSPtrClass (char const* name, Namespace const* parent, void const* const sharedkey, void const* const weakkey)
+      : ClassBase (parent->L)
+      , weak (name, parent, weakkey)
+      , shared (name, parent, sharedkey)
+    {
+#ifdef LUABINDINGDOC
+      _parent = parent;
+      _name = parent->_name + name + ":";
+#endif
+      m_stackSize = weak.m_stackSize;
+      parent->m_stackSize = weak.m_stackSize = shared.m_stackSize = 0;
+      lua_pop (L, 3);
+    }
+
+    template <class MemFn>
+    WSPtrClass <T>& addFunction (char const* name, MemFn mf)
+    {
+      FUNDOC ("Weak/Shared Pointer Function", name, MemFn)
+      set_weak_class ();
+      CFunc::CallMemberWPtrFunctionHelper <MemFn>::add (L, name, mf);
+
+      set_shared_class ();
+      CFunc::CallMemberPtrFunctionHelper <MemFn>::add (L, name, mf);
+      return *this;
+    }
+
+    template <class MemFn>
+    WSPtrClass <T>& addRefFunction (char const* name, MemFn mf)
+    {
+      FUNDOC ("Weak/Shared Pointer Function RefReturn", name, MemFn)
+      set_weak_class ();
+      CFunc::CallMemberRefWPtrFunctionHelper <MemFn>::add (L, name, mf);
+
+      set_shared_class ();
+      CFunc::CallMemberRefPtrFunctionHelper <MemFn>::add (L, name, mf);
+      return *this;
+    }
+
+    template <class MemFn>
+    WSPtrClass <T>& addConstructor ()
+    {
+      FUNDOC ("Weak/Shared Pointer Constructor", "", MemFn)
+      set_weak_class ();
+      lua_pushcclosure (L,
+          &weak. template ctorPlacementProxy <typename FuncTraits <MemFn>::Params, boost::weak_ptr<T> >, 0);
+      rawsetfield(L, -2, "__call");
+
+      set_shared_class ();
+      lua_pushcclosure (L,
+          &shared. template ctorPlacementProxy <typename FuncTraits <MemFn>::Params, boost::shared_ptr<T> >, 0);
+      rawsetfield(L, -2, "__call");
+      return *this;
+    }
+
+    WSPtrClass <T>& addVoidConstructor ()
+    {
+      return addConstructor <void (*) ()> ();
+    }
+
+    WSPtrClass <T>& addExtCFunction (char const* name, int (*const fp)(lua_State*))
+    {
+      DATADOC ("Weak/Shared Ext C Function", name, fp)
+      set_weak_class ();
+      assert (lua_istable (L, -1));
+      lua_pushcclosure (L, fp, 0);
+      rawsetfield (L, -3, name); // class table
+
+      set_shared_class ();
+      assert (lua_istable (L, -1));
+      lua_pushcclosure (L, fp, 0);
+      rawsetfield (L, -3, name); // class table
+
+      return *this;
+    }
+
+    template <class U>
+    WSPtrClass <T>& addCast (char const* name)
+    {
+      PRINTDOC("Weak/Shared Pointer Cast", _name << name,
+          type_name< U >(),
+          type_name< U >() << " (" << type_name< T >() << "::*)()")
+
+      // TODO weak ptr
+      set_shared_class ();
+      assert (lua_istable (L, -1));
+      lua_pushcclosure (L, &CFunc::CastMemberPtr <T, U>::f, 0);
+      rawsetfield (L, -3, name); // class table
+      return *this;
+    }
+
+    WSPtrClass <T>& addNullCheck ()
+    {
+      PRINTDOC("Weak/Shared Null Check", _name << "isnil", std::string("bool"), std::string("void (*)()"))
+      set_weak_class ();
+      assert (lua_istable (L, -1));
+      lua_pushcclosure (L, &CFunc::WPtrNullCheck <T>::f, 0);
+      rawsetfield (L, -3, "isnil"); // class table
+
+      set_shared_class ();
+      assert (lua_istable (L, -1));
+      lua_pushcclosure (L, &CFunc::PtrNullCheck <T>::f, 0);
+      rawsetfield (L, -3, "isnil"); // class table
+
+      return *this;
+    }
+
+
+    Namespace endClass ()
+    {
+      return Namespace (this);
+    }
+
+  private:
+    void set_weak_class () {
+      lua_pop (L, 3);
+      lua_rawgetp (L, LUA_REGISTRYINDEX, ClassInfo <boost::weak_ptr<T> >::getStaticKey ());
+      rawgetfield (L, -1, "__class");
+      rawgetfield (L, -1, "__const");
+      lua_insert (L, -3);
+      lua_insert (L, -2);
+    }
+    void set_shared_class () {
+      lua_pop (L, 3);
+      lua_rawgetp (L, LUA_REGISTRYINDEX, ClassInfo <boost::shared_ptr<T> >::getStaticKey ());
+      rawgetfield (L, -1, "__class");
+      rawgetfield (L, -1, "__const");
+      lua_insert (L, -3);
+      lua_insert (L, -2);
+    }
+    Class<boost::weak_ptr<T> > weak;
+    Class<boost::shared_ptr<T> > shared;
+  };
+
+
+private:
+  //----------------------------------------------------------------------------
+  /**
+      Open the global namespace for registrations.
+  */
+  explicit Namespace (lua_State* L_)
+    : L (L_)
+    , m_stackSize (0)
+#ifdef LUABINDINGDOC
+    , _name ("")
+    , _parent (0)
+#endif
+  {
+    lua_getglobal (L, "_G");
+    ++m_stackSize;
+  }
+
+#ifdef LUABINDINGDOC
+  std::string _name;
+  Namespace const * _parent;
+#endif
+
+  //----------------------------------------------------------------------------
+  /**
+      Open a namespace for registrations.
+
+      The namespace is created if it doesn't already exist.
+      The parent namespace is at the top of the Lua stack.
+  */
+  Namespace (char const* name, Namespace const* parent)
+    : L (parent->L)
+    , m_stackSize (0)
+#ifdef LUABINDINGDOC
+    , _name (parent->_name + name + ":")
+    , _parent (parent)
+#endif
+  {
+    m_stackSize = parent->m_stackSize + 1;
+    parent->m_stackSize = 0;
+
+    assert (lua_istable (L, -1));
+    rawgetfield (L, -1, name);
+    if (lua_isnil (L, -1))
+    {
+      lua_pop (L, 1);
+
+      lua_newtable (L);
+      lua_pushvalue (L, -1);
+      lua_setmetatable (L, -2);
+      lua_pushcfunction (L, &CFunc::indexMetaMethod);
+      rawsetfield (L, -2, "__index");
+      lua_pushcfunction (L, &CFunc::newindexMetaMethod);
+      rawsetfield (L, -2, "__newindex");
+      lua_newtable (L);
+      rawsetfield (L, -2, "__propget");
+      lua_newtable (L);
+      rawsetfield (L, -2, "__propset");
+      lua_pushvalue (L, -1);
+      rawsetfield (L, -3, name);
+#if 0
+      lua_pushcfunction (L, &tostringMetaMethod);
+      rawsetfield (L, -2, "__tostring");
+#endif
+    }
+  }
+
+  //----------------------------------------------------------------------------
+  /**
+      Creates a continued registration from a child namespace.
+  */
+  explicit Namespace (Namespace const* child)
+    : L (child->L)
+    , m_stackSize (0)
+#ifdef LUABINDINGDOC
+    , _name (child->_parent ? child->_parent->_name : "")
+    , _parent (child->_parent ? child->_parent->_parent : NULL)
+#endif
+  {
+    m_stackSize = child->m_stackSize - 1;
+    child->m_stackSize = 1;
+    child->pop (1);
+
+    // It is not necessary or valid to call
+    // endNamespace() for the global namespace!
+    //
+    assert (m_stackSize != 0);
+  }
+
+  //----------------------------------------------------------------------------
+  /**
+      Creates a continued registration from a child class.
+  */
+  explicit Namespace (ClassBase const* child)
+    : L (child->L)
+    , m_stackSize (0)
+#ifdef LUABINDINGDOC
+    , _name (child->_parent ? child->_parent->_name : "")
+    , _parent (child->_parent ? child->_parent->_parent : NULL)
+#endif
+  {
+    m_stackSize = child->m_stackSize - 3;
+    child->m_stackSize = 3;
+    child->pop (3);
+  }
+
+public:
+  //----------------------------------------------------------------------------
+  /**
+      Copy Constructor.
+
+      Ownership of the stack is transferred to the new object. This happens
+      when the compiler emits temporaries to hold these objects while chaining
+      registrations across namespaces.
+  */
+  Namespace (Namespace const& other) : L (other.L)
+  {
+    m_stackSize = other.m_stackSize;
+    other.m_stackSize = 0;
+#ifdef LUABINDINGDOC
+    _name = other._name;
+    _parent = other._parent;
+#endif
+  }
+
+  //----------------------------------------------------------------------------
+  /**
+      Closes this namespace registration.
+  */
+  ~Namespace ()
+  {
+    pop (m_stackSize);
+  }
+
+  //----------------------------------------------------------------------------
+  /**
+      Open the global namespace.
+  */
+  static Namespace getGlobalNamespace (lua_State* L)
+  {
+    return Namespace (L);
+  }
+
+  //----------------------------------------------------------------------------
+  /**
+      Open a new or existing namespace for registrations.
+  */
+  Namespace beginNamespace (char const* name)
+  {
+    return Namespace (name, this);
+  }
+
+  //----------------------------------------------------------------------------
+  /**
+      Continue namespace registration in the parent.
+
+      Do not use this on the global namespace.
+  */
+  Namespace endNamespace ()
+  {
+    return Namespace (this);
+  }
+
+  //----------------------------------------------------------------------------
+  /**
+      Add or replace a variable.
+  */
+  template <class T>
+  Namespace& addVariable (char const* name, T* pt, bool isWritable = true)
+  {
+    assert (lua_istable (L, -1));
+
+    rawgetfield (L, -1, "__propget");
+    assert (lua_istable (L, -1));
+    lua_pushlightuserdata (L, pt);
+    lua_pushcclosure (L, &CFunc::getVariable <T>, 1);
+    rawsetfield (L, -2, name);
+    lua_pop (L, 1);
+
+    rawgetfield (L, -1, "__propset");
+    assert (lua_istable (L, -1));
+    if (isWritable)
+    {
+      lua_pushlightuserdata (L, pt);
+      lua_pushcclosure (L, &CFunc::setVariable <T>, 1);
+    }
+    else
+    {
+      lua_pushstring (L, name);
+      lua_pushcclosure (L, &CFunc::readOnlyError, 1);
+    }
+    rawsetfield (L, -2, name);
+    lua_pop (L, 1);
+
+    return *this;
+  }
+
+  template <typename U>
+  Namespace& addConst (char const* name, const U val)
+  {
+    DATADOC ("Constant/Enum", name, val)
+    assert (lua_istable (L, -1));
+    rawgetfield (L, -1, "__propget");
+    new (lua_newuserdata (L, sizeof (val))) U (val);
+    lua_pushcclosure (L, &CFunc::getConst <U>, 1);
+    rawsetfield (L, -2, name);
+    lua_pop (L, 1);
+
+    rawgetfield (L, -1, "__propset");
+    assert (lua_istable (L, -1));
+    lua_pushstring (L, name);
+    lua_pushcclosure (L, &CFunc::readOnlyError, 1);
+    rawsetfield (L, -2, name);
+    lua_pop (L, 1);
+    return *this;
+  }
+
+  //----------------------------------------------------------------------------
+  /**
+      Add or replace a property.
+
+      If the set function is omitted or null, the property is read-only.
+  */
+  template <class TG, class TS>
+  Namespace& addProperty (char const* name, TG (*get) (), void (*set)(TS) = 0)
+  {
+    assert (lua_istable (L, -1));
+
+    rawgetfield (L, -1, "__propget");
+    assert (lua_istable (L, -1));
+    typedef TG (*get_t) ();
+    new (lua_newuserdata (L, sizeof (get_t))) get_t (get);
+    lua_pushcclosure (L, &CFunc::Call <TG (*) (void)>::f, 1);
+    rawsetfield (L, -2, name);
+    lua_pop (L, 1);
+
+    rawgetfield (L, -1, "__propset");
+    assert (lua_istable (L, -1));
+    if (set != 0)
+    {
+      typedef void (*set_t) (TS);
+      new (lua_newuserdata (L, sizeof (set_t))) set_t (set);
+      lua_pushcclosure (L, &CFunc::Call <void (*) (TS)>::f, 1);
+    }
+    else
+    {
+      lua_pushstring (L, name);
+      lua_pushcclosure (L, &CFunc::readOnlyError, 1);
+    }
+    rawsetfield (L, -2, name);
+    lua_pop (L, 1);
+
+    return *this;
+  }
+
+  //----------------------------------------------------------------------------
+  /**
+      Add or replace a free function.
+  */
+  template <class FP>
+  Namespace& addFunction (char const* name, FP const fp)
+  {
+    FUNDOC ("Free Function", name, FP)
+    assert (lua_istable (L, -1));
+
+    new (lua_newuserdata (L, sizeof (fp))) FP (fp);
+    lua_pushcclosure (L, &CFunc::Call <FP>::f, 1);
+    rawsetfield (L, -2, name);
+
+    return *this;
+  }
+
+  template <class FP>
+  Namespace& addRefFunction (char const* name, FP const fp)
+  {
+    FUNDOC ("Free Function RefReturn", name, FP)
+    assert (lua_istable (L, -1));
+
+    new (lua_newuserdata (L, sizeof (fp))) FP (fp);
+    lua_pushcclosure (L, &CFunc::CallRef <FP>::f, 1);
+    rawsetfield (L, -2, name);
+
+    return *this;
+  }
+
+  //----------------------------------------------------------------------------
+  /**
+      Add or replace a array type
+  */
+
+  template <typename T>
+  Namespace registerArray (char const* name)
+  {
+    return Array <T> (name, this).endArray();
+  }
+
+
+  //----------------------------------------------------------------------------
+  /**
+      Add or replace a lua_CFunction.
+  */
+  Namespace& addCFunction (char const* name, int (*const fp)(lua_State*))
+  {
+    DATADOC ("Free C Function", name, fp)
+    lua_pushcfunction (L, fp);
+    rawsetfield (L, -2, name);
+
+    return *this;
+  }
+
+  //----------------------------------------------------------------------------
+  /**
+      Open a new or existing class for registrations.
+  */
+  template <class T>
+  Class <T> beginClass (char const* name)
+  {
+    return Class <T> (name, this);
+  }
+
+  /** weak & shared pointer class */
+  template <class T>
+  WSPtrClass <T> beginWSPtrClass (char const* name)
+  {
+    return WSPtrClass <T> (name, this)
+      .addNullCheck();
+  }
+
+  //----------------------------------------------------------------------------
+
+  template <class K, class V>
+  Class<std::map<K, V> > beginStdMap (char const* name)
+  {
+    typedef std::map<K, V> LT;
+    typedef std::pair<const K, V> T;
+
+    typedef typename std::map<K, V>::size_type T_SIZE;
+
+    return beginClass<LT> (name)
+      .addVoidConstructor ()
+      .addFunction ("empty", &LT::empty)
+      .addFunction ("size", &LT::size)
+      .addFunction ("clear", (void (LT::*)())&LT::clear)
+      .addFunction ("count", (T_SIZE (LT::*)(const K&) const)&LT::count)
+      .addExtCFunction ("add", &CFunc::tableToMap<K, V>)
+      .addExtCFunction ("iter", &CFunc::mapIter<K, V>)
+      .addExtCFunction ("table", &CFunc::mapToTable<K, V>);
+  }
+
+  template <class T>
+  Class<std::set<T> > beginStdSet (char const* name)
+  {
+    typedef std::set<T> LT;
+    return beginClass<LT> (name)
+      .addVoidConstructor ()
+      .addFunction ("clear", (void (LT::*)())&LT::clear)
+      .addFunction ("empty", &LT::empty)
+      .addFunction ("size", &LT::size)
+      .addExtCFunction ("add", &CFunc::tableToSet<T>)
+      .addExtCFunction ("iter", &CFunc::setIter<T>)
+      .addExtCFunction ("table", &CFunc::setToTable<T>);
+  }
+
+  template <unsigned int T>
+  Class<std::bitset<T> > beginStdBitSet (char const* name)
+  {
+    typedef std::bitset<T> BS;
+    return beginClass<BS> (name)
+      .addVoidConstructor ()
+      .addFunction ("reset", (BS& (BS::*)())&BS::reset)
+      .addFunction ("set", (BS& (BS::*)(size_t, bool))&BS::set)
+      .addFunction ("count", &BS::count)
+      .addFunction ("any", &BS::any)
+      .addFunction ("none", &BS::none)
+      .addFunction ("test", &BS::test)
+      .addFunction ("size", &BS::size)
+      .addExtCFunction ("add", &CFunc::tableToBitSet<T>)
+      .addExtCFunction ("table", &CFunc::bitSetToTable<T>);
+  }
+
+  template <class T>
+  Class<std::list<T> > beginConstStdList (char const* name)
+  {
+    typedef std::list<T> LT;
+    return beginClass<LT> (name)
+      .addVoidConstructor ()
+      .addFunction ("empty", &LT::empty)
+      .addFunction ("size", &LT::size)
+      .addFunction ("reverse", &LT::reverse)
+      .addExtCFunction ("iter", &CFunc::listIter<T, LT>)
+      .addExtCFunction ("table", &CFunc::listToTable<T, LT>);
+  }
+
+  template <class T>
+  Class<std::list<T> > beginStdList (char const* name)
+  {
+    typedef std::list<T> LT;
+    return beginConstStdList<T> (name)
+      .addFunction ("unique", (void (LT::*)())&LT::unique)
+      .addFunction ("push_back", (void (LT::*)(const T&))&LT::push_back)
+      .addExtCFunction ("add", &CFunc::tableToList<T, LT>);
+  }
+
+  template <class T>
+  Class<std::vector<T> > beginStdVector (char const* name)
+  {
+    typedef std::vector<T> LT;
+    typedef typename std::vector<T>::reference T_REF;
+    typedef typename std::vector<T>::size_type T_SIZE;
+
+    return beginClass<LT> (name)
+      .addVoidConstructor ()
+      .addFunction ("empty", &LT::empty)
+      .addFunction ("size", &LT::size)
+      .addFunction ("push_back", (void (LT::*)(const T&))&LT::push_back)
+      .addFunction ("at", (T_REF (LT::*)(T_SIZE))&LT::at)
+      .addExtCFunction ("add", &CFunc::tableToList<T, LT>)
+      .addExtCFunction ("iter", &CFunc::listIter<T, LT>)
+      .addExtCFunction ("table", &CFunc::listToTable<T, LT>);
+  }
+
+  //----------------------------------------------------------------------------
+
+  template <class T>
+  Class<boost::shared_ptr<std::list<T> > > beginPtrStdList (char const* name)
+  {
+    typedef std::list<T> LT;
+
+    return beginClass<boost::shared_ptr<LT> > (name)
+      .addVoidConstructor ()
+      .addPtrFunction ("empty", &LT::empty)
+      .addPtrFunction ("size", &LT::size)
+      .addPtrFunction ("reverse", &LT::reverse)
+      .addPtrFunction ("unique", (void (LT::*)())&LT::unique)
+      .addPtrFunction ("push_back", (void (LT::*)(const T&))&LT::push_back)
+      .addExtCFunction ("add", &CFunc::ptrTableToList<T, LT>)
+      .addExtCFunction ("iter", &CFunc::ptrListIter<T, LT>)
+      .addExtCFunction ("table", &CFunc::ptrListToTable<T, LT>);
+  }
+
+  template <class T>
+  Class<boost::shared_ptr<std::vector<T> > > beginPtrStdVector (char const* name)
+  {
+    typedef std::vector<T> LT;
+    typedef typename std::vector<T>::reference T_REF;
+    typedef typename std::vector<T>::size_type T_SIZE;
+
+    return beginClass<boost::shared_ptr<LT> > (name)
+      .addVoidConstructor ()
+      .addPtrFunction ("empty", &LT::empty)
+      .addPtrFunction ("empty", &LT::empty)
+      .addPtrFunction ("size", &LT::size)
+      .addPtrFunction ("push_back", (void (LT::*)(const T&))&LT::push_back)
+      .addPtrFunction ("at", (T_REF (LT::*)(T_SIZE))&LT::at)
+      .addExtCFunction ("add", &CFunc::ptrTableToList<T, LT>)
+      .addExtCFunction ("iter", &CFunc::ptrListIter<T, LT>)
+      .addExtCFunction ("table", &CFunc::ptrListToTable<T, LT>);
+  }
+
+  //----------------------------------------------------------------------------
+  /**
+      Derive a new class for registrations.
+
+      To continue registrations for the class later, use beginClass().
+      Do not call deriveClass() again.
+  */
+  template <class T, class U>
+  Class <T> deriveClass (char const* name)
+  {
+    CLASSDOC ("[C] Derived Class", _name << name, type_name <T>(), type_name <U>())
+    return Class <T> (name, this, ClassInfo <U>::getStaticKey ());
+  }
+
+  template <class T, class U>
+  WSPtrClass <T> deriveWSPtrClass (char const* name)
+  {
+
+    CLASSDOC ("[C] Derived Class", _name << name, type_name <boost::shared_ptr<T> >(), type_name <boost::shared_ptr<U> >())
+    CLASSDOC ("[C] Derived Class", _name << name, type_name <boost::weak_ptr<T> >(), type_name <boost::weak_ptr<U> >())
+    CLASSDOC ("[C] Derived Pointer Class", _name << name, type_name <T>(), type_name <U>())
+    return WSPtrClass <T> (name, this,
+        ClassInfo <boost::shared_ptr<U> >::getStaticKey (),
+        ClassInfo <boost::weak_ptr<U> >::getStaticKey ())
+      .addNullCheck();
+  }
+
+};
+
+//------------------------------------------------------------------------------
+/**
+    Retrieve the global namespace.
+
+    It is recommended to put your namespace inside the global namespace, and
+    then add your classes and functions to it, rather than adding many classes
+    and functions directly to the global namespace.
+*/
+inline Namespace getGlobalNamespace (lua_State* L)
+{
+  return Namespace::getGlobalNamespace (L);
+}
+
+
+#undef KEYSTA
+#undef KEYEND
+#undef CLASSDOC
+#undef PRINTDOC
+#undef FUNDOC
+#undef DATADOC
+
+/* vim: set et sw=2: */
diff --git a/libs/lua/LuaBridge/detail/Stack.h b/libs/lua/LuaBridge/detail/Stack.h
new file mode 100644
index 0000000..e6ff637
--- /dev/null
+++ b/libs/lua/LuaBridge/detail/Stack.h
@@ -0,0 +1,760 @@
+//------------------------------------------------------------------------------
+/*
+  https://github.com/vinniefalco/LuaBridge
+
+  Copyright 2016, Robin Gareus <robin at gareus.org>
+  Copyright 2012, Vinnie Falco <vinnie.falco at gmail.com>
+  Copyright 2007, Nathan Reed
+
+  License: The MIT License (http://www.opensource.org/licenses/mit-license.php)
+
+  Permission is hereby granted, free of charge, to any person obtaining a copy
+  of this software and associated documentation files (the "Software"), to deal
+  in the Software without restriction, including without limitation the rights
+  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+  copies of the Software, and to permit persons to whom the Software is
+  furnished to do so, subject to the following conditions:
+
+  The above copyright notice and this permission notice shall be included in all
+  copies or substantial portions of the Software.
+
+  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+  SOFTWARE.
+*/
+//==============================================================================
+
+//------------------------------------------------------------------------------
+/**
+    Receive the lua_State* as an argument.
+*/
+template <>
+struct Stack <lua_State*>
+{
+  static lua_State* get (lua_State* L, int)
+  {
+    return L;
+  }
+};
+
+//------------------------------------------------------------------------------
+/**
+    Push a lua_CFunction.
+*/
+template <>
+struct Stack <lua_CFunction>
+{
+  static void push (lua_State* L, lua_CFunction f)
+  {
+    lua_pushcfunction (L, f);
+  }
+
+  static lua_CFunction get (lua_State* L, int index)
+  {
+    return lua_tocfunction (L, index);
+  }
+};
+
+//------------------------------------------------------------------------------
+/**
+    Stack specialization for passing references to built-in types.
+
+    This allows to call functions using primitives, but
+    the value assigned by the C++ function is *lost*.
+
+    http://sourceforge.net/p/luabind/mailman/message/32692027/
+
+    Alternatives:
+     - wrap all C++ function that have non const reference arguments
+    (cleanest solution)
+
+     - use a struct to wrap the value (not a primitive)
+    (needs major work to special case arguments in CFunc::)
+
+     - wrap the function and provide the assigned value
+     as addition return values
+
+    Either would place hard constraints on the lua code though.
+
+    We currently only need this for Ardour::Editor::do_import() framecnt_t&
+    and the returned position is not important.
+*/
+
+//------------------------------------------------------------------------------
+/**
+    Stack specialization for `int`.
+*/
+template <>
+struct Stack <int>
+{
+  static inline void push (lua_State* L, int value)
+  {
+    lua_pushinteger (L, static_cast <lua_Integer> (value));
+  }
+
+  static inline int get (lua_State* L, int index)
+  {
+    return static_cast <int> (luaL_checkinteger (L, index));
+  }
+};
+
+template <>
+struct Stack <int const&>
+{
+  static inline void push (lua_State* L, int value)
+  {
+    lua_pushnumber (L, static_cast <lua_Number> (value));
+  }
+
+  static inline int get (lua_State* L, int index)
+  {
+    return static_cast <int > (luaL_checknumber (L, index));
+  }
+};
+
+template <>
+struct Stack <int &>
+{
+  static inline void push (lua_State* L, int &value)
+  {
+    lua_pushnumber (L, static_cast <lua_Number> (value));
+  }
+
+  static inline int& get (lua_State* L, int index)
+  {
+    int l = static_cast <int> (luaL_checknumber (L, index));
+    int* x = new (lua_newuserdata (L, sizeof (int))) int (l);
+    return *x;
+  }
+};
+
+//------------------------------------------------------------------------------
+/**
+    Stack specialization for `unsigned int`.
+*/
+template <>
+struct Stack <unsigned int>
+{
+  static inline void push (lua_State* L, unsigned int value)
+  {
+    lua_pushinteger (L, static_cast <lua_Integer> (value));
+  }
+
+  static inline unsigned int get (lua_State* L, int index)
+  {
+    return static_cast <unsigned int> (luaL_checkinteger (L, index));
+  }
+};
+
+template <>
+struct Stack <unsigned int const&>
+{
+  static inline void push (lua_State* L, unsigned int value)
+  {
+    lua_pushnumber (L, static_cast <lua_Number> (value));
+  }
+
+  static inline unsigned int get (lua_State* L, int index)
+  {
+    return static_cast <unsigned int > (luaL_checknumber (L, index));
+  }
+};
+
+template <>
+struct Stack <unsigned int &>
+{
+  static inline void push (lua_State* L, unsigned int& value)
+  {
+    lua_pushnumber (L, static_cast <lua_Number> (value));
+  }
+
+  static inline unsigned int& get (lua_State* L, int index)
+  {
+    unsigned int l = static_cast <unsigned int> (luaL_checknumber (L, index));
+    unsigned int* x = new (lua_newuserdata (L, sizeof (unsigned int))) unsigned int (l);
+    return *x;
+  }
+};
+
+//------------------------------------------------------------------------------
+/**
+    Stack specialization for `unsigned char`.
+*/
+template <>
+struct Stack <unsigned char>
+{
+  static inline void push (lua_State* L, unsigned char value)
+  {
+    lua_pushinteger (L, static_cast <lua_Integer> (value));
+  }
+
+  static inline unsigned char get (lua_State* L, int index)
+  {
+    return static_cast <unsigned char> (luaL_checkinteger (L, index));
+  }
+};
+
+template <>
+struct Stack <unsigned char const&>
+{
+  static inline void push (lua_State* L, unsigned char value)
+  {
+    lua_pushnumber (L, static_cast <lua_Number> (value));
+  }
+
+  static inline unsigned char get (lua_State* L, int index)
+  {
+    return static_cast <unsigned char> (luaL_checknumber (L, index));
+  }
+};
+
+template <>
+struct Stack <unsigned char &>
+{
+  static inline void push (lua_State* L, unsigned char& value)
+  {
+    lua_pushnumber (L, static_cast <lua_Number> (value));
+  }
+
+  static inline unsigned char& get (lua_State* L, int index)
+  {
+    unsigned char l = static_cast <unsigned char> (luaL_checknumber (L, index));
+    unsigned char* x = new (lua_newuserdata (L, sizeof (unsigned char))) unsigned char (l);
+    return *x;
+  }
+};
+
+//------------------------------------------------------------------------------
+/**
+    Stack specialization for `short`.
+*/
+template <>
+struct Stack <short>
+{
+  static inline void push (lua_State* L, short value)
+  {
+    lua_pushinteger (L, static_cast <lua_Integer> (value));
+  }
+
+  static inline short get (lua_State* L, int index)
+  {
+    return static_cast <short> (luaL_checkinteger (L, index));
+  }
+};
+
+template <>
+struct Stack <short const&>
+{
+  static inline void push (lua_State* L, short value)
+  {
+    lua_pushnumber (L, static_cast <lua_Number> (value));
+  }
+
+  static inline short get (lua_State* L, int index)
+  {
+    return static_cast <short> (luaL_checknumber (L, index));
+  }
+};
+
+template <>
+struct Stack <short &>
+{
+  static inline void push (lua_State* L, short& value)
+  {
+    lua_pushnumber (L, static_cast <lua_Number> (value));
+  }
+
+  static inline short& get (lua_State* L, int index)
+  {
+    short l = static_cast <short> (luaL_checknumber (L, index));
+    short* x = new (lua_newuserdata (L, sizeof (short))) short (l);
+    return *x;
+  }
+};
+
+//------------------------------------------------------------------------------
+/**
+    Stack specialization for `unsigned short`.
+*/
+template <>
+struct Stack <unsigned short>
+{
+  static inline void push (lua_State* L, unsigned short value)
+  {
+    lua_pushinteger (L, static_cast <lua_Integer> (value));
+  }
+
+  static inline unsigned short get (lua_State* L, int index)
+  {
+    return static_cast <unsigned short> (luaL_checkinteger (L, index));
+  }
+};
+
+template <>
+struct Stack <unsigned short const&>
+{
+  static inline void push (lua_State* L, unsigned short value)
+  {
+    lua_pushnumber (L, static_cast <lua_Number> (value));
+  }
+
+  static inline unsigned short get (lua_State* L, int index)
+  {
+    return static_cast <unsigned short> (luaL_checknumber (L, index));
+  }
+};
+
+template <>
+struct Stack <unsigned short &>
+{
+  static inline void push (lua_State* L, unsigned short& value)
+  {
+    lua_pushnumber (L, static_cast <lua_Number> (value));
+  }
+
+  static inline unsigned short& get (lua_State* L, int index)
+  {
+    unsigned short l = static_cast <unsigned short> (luaL_checknumber (L, index));
+    unsigned short* x = new (lua_newuserdata (L, sizeof (unsigned short))) unsigned short (l);
+    return *x;
+  }
+};
+
+//------------------------------------------------------------------------------
+/**
+    Stack specialization for `long`.
+*/
+template <>
+struct Stack <long>
+{
+  static inline void push (lua_State* L, long value)
+  {
+    lua_pushinteger (L, static_cast <lua_Integer> (value));
+  }
+
+  static inline long get (lua_State* L, int index)
+  {
+    return static_cast <long> (luaL_checkinteger (L, index));
+  }
+};
+
+template <>
+struct Stack <long const&>
+{
+  static inline void push (lua_State* L, long value)
+  {
+    lua_pushnumber (L, static_cast <lua_Number> (value));
+  }
+
+  static inline long get (lua_State* L, int index)
+  {
+    return static_cast <long> (luaL_checknumber (L, index));
+  }
+};
+
+template <>
+struct Stack <long &>
+{
+  static inline void push (lua_State* L, long& value)
+  {
+    lua_pushnumber (L, static_cast <lua_Number> (value));
+  }
+
+  static inline long& get (lua_State* L, int index)
+  {
+    long l = static_cast <long> (luaL_checknumber (L, index));
+    long* x = new (lua_newuserdata (L, sizeof (long))) long (l);
+    return *x;
+  }
+};
+
+//------------------------------------------------------------------------------
+/**
+    Stack specialization for `unsigned long`.
+*/
+template <>
+struct Stack <unsigned long>
+{
+  static inline void push (lua_State* L, unsigned long value)
+  {
+    lua_pushinteger (L, static_cast <lua_Integer> (value));
+  }
+
+  static inline unsigned long get (lua_State* L, int index)
+  {
+    return static_cast <unsigned long> (luaL_checkinteger (L, index));
+  }
+};
+
+template <>
+struct Stack <unsigned long const&>
+{
+  static inline void push (lua_State* L, unsigned long value)
+  {
+    lua_pushnumber (L, static_cast <lua_Number> (value));
+  }
+
+  static inline unsigned long get (lua_State* L, int index)
+  {
+    return static_cast <unsigned long> (luaL_checknumber (L, index));
+  }
+};
+
+template <>
+struct Stack <unsigned long &>
+{
+  static inline void push (lua_State* L, unsigned long& value)
+  {
+    lua_pushnumber (L, static_cast <lua_Number> (value));
+  }
+
+  static inline unsigned long& get (lua_State* L, int index)
+  {
+    unsigned long l = static_cast <unsigned long> (luaL_checknumber (L, index));
+    unsigned long* x = new (lua_newuserdata (L, sizeof (unsigned long))) unsigned long (l);
+    return *x;
+  }
+};
+
+//------------------------------------------------------------------------------
+/**
+    Stack specialization for `long long`.
+*/
+template <>
+struct Stack <long long>
+{
+  static inline void push (lua_State* L, long long value)
+  {
+    lua_pushinteger (L, static_cast <lua_Integer> (value));
+  }
+
+  static inline long long get (lua_State* L, int index)
+  {
+    return static_cast <long long> (luaL_checkinteger (L, index));
+  }
+};
+
+template <>
+struct Stack <long long const&>
+{
+  static inline void push (lua_State* L, long long value)
+  {
+    lua_pushnumber (L, static_cast <lua_Number> (value));
+  }
+
+  static inline long long get (lua_State* L, int index)
+  {
+    return static_cast <long long> (luaL_checknumber (L, index));
+  }
+};
+
+template <>
+struct Stack <long long &>
+{
+  static inline void push (lua_State* L, long long& value)
+  {
+    lua_pushnumber (L, static_cast <lua_Number> (value));
+  }
+
+  static inline long long& get (lua_State* L, int index)
+  {
+    long long l = static_cast <long long> (luaL_checknumber (L, index));
+    long long* x = new (lua_newuserdata (L, sizeof (long long))) long long (l);
+    return *x;
+  }
+};
+
+//------------------------------------------------------------------------------
+/**
+    Stack specialization for `unsigned long long`.
+*/
+template <>
+struct Stack <unsigned long long>
+{
+  static inline void push (lua_State* L, unsigned long long value)
+  {
+    lua_pushinteger (L, static_cast <lua_Integer> (value));
+  }
+
+  static inline unsigned long long get (lua_State* L, int index)
+  {
+    return static_cast <unsigned long long> (luaL_checkinteger (L, index));
+  }
+};
+
+template <>
+struct Stack <unsigned long long const&>
+{
+  static inline void push (lua_State* L, unsigned long long value)
+  {
+    lua_pushnumber (L, static_cast <lua_Number> (value));
+  }
+
+  static inline unsigned long long get (lua_State* L, int index)
+  {
+    return static_cast <unsigned long long> (luaL_checknumber (L, index));
+  }
+};
+
+//------------------------------------------------------------------------------
+/**
+    Stack specialization for `float`.
+*/
+template <>
+struct Stack <float>
+{
+  static inline void push (lua_State* L, float value)
+  {
+    lua_pushnumber (L, static_cast <lua_Number> (value));
+  }
+
+  static inline float get (lua_State* L, int index)
+  {
+    return static_cast <float> (luaL_checknumber (L, index));
+  }
+};
+
+template <>
+struct Stack <float const&>
+{
+  static inline void push (lua_State* L, float value)
+  {
+    lua_pushnumber (L, static_cast <lua_Number> (value));
+  }
+
+  static inline float get (lua_State* L, int index)
+  {
+    return static_cast <float> (luaL_checknumber (L, index));
+  }
+};
+
+template <>
+struct Stack <float &>
+{
+  static inline void push (lua_State* L, float& value)
+  {
+    lua_pushnumber (L, static_cast <lua_Number> (value));
+  }
+
+  static inline float& get (lua_State* L, int index)
+  {
+    float l = static_cast <float> (luaL_checknumber (L, index));
+    float* x = new (lua_newuserdata (L, sizeof (float))) float (l);
+    return *x;
+  }
+};
+
+//------------------------------------------------------------------------------
+/**
+    Stack specialization for `double`.
+*/
+template <> struct Stack <double>
+{
+  static inline void push (lua_State* L, double value)
+  {
+    lua_pushnumber (L, static_cast <lua_Number> (value));
+  }
+
+  static inline double get (lua_State* L, int index)
+  {
+    return static_cast <double> (luaL_checknumber (L, index));
+  }
+};
+
+template <> struct Stack <double const&>
+{
+  static inline void push (lua_State* L, double value)
+  {
+    lua_pushnumber (L, static_cast <lua_Number> (value));
+  }
+
+  static inline double get (lua_State* L, int index)
+  {
+    return static_cast <double> (luaL_checknumber (L, index));
+  }
+};
+
+template <> struct Stack <double &>
+{
+  static inline void push (lua_State* L, double& value)
+  {
+    lua_pushnumber (L, static_cast <lua_Number> (value));
+  }
+
+  static inline double& get (lua_State* L, int index)
+  {
+    double l = static_cast <double> (luaL_checknumber (L, index));
+    double* x = new (lua_newuserdata (L, sizeof (double))) double (l);
+    return *x;
+  }
+};
+
+//------------------------------------------------------------------------------
+/**
+    Stack specialization for `bool`.
+*/
+template <>
+struct Stack <bool> {
+  static inline void push (lua_State* L, bool value)
+  {
+    lua_pushboolean (L, value ? 1 : 0);
+  }
+
+  static inline bool get (lua_State* L, int index)
+  {
+    return lua_toboolean (L, index) ? true : false;
+  }
+};
+
+template <>
+struct Stack <bool const&> {
+  static inline void push (lua_State* L, bool value)
+  {
+    lua_pushboolean (L, value ? 1 : 0);
+  }
+
+  static inline bool get (lua_State* L, int index)
+  {
+    return lua_toboolean (L, index) ? true : false;
+  }
+};
+
+template <>
+struct Stack <bool &> {
+  static inline void push (lua_State* L, bool& value)
+  {
+    lua_pushboolean (L, value ? 1 : 0);
+  }
+
+  static inline bool& get (lua_State* L, int index)
+  {
+    bool l = lua_toboolean (L, index) ? true : false;
+    bool* x = new (lua_newuserdata (L, sizeof (bool))) bool (l);
+    return *x;
+  }
+};
+
+//------------------------------------------------------------------------------
+/**
+    Stack specialization for `char`.
+*/
+template <>
+struct Stack <char>
+{
+  static inline void push (lua_State* L, char value)
+  {
+    char str [2] = { value, 0 };
+    lua_pushstring (L, str);
+  }
+
+  static inline char get (lua_State* L, int index)
+  {
+    return luaL_checkstring (L, index) [0];
+  }
+};
+
+template <>
+struct Stack <char const&>
+{
+  static inline void push (lua_State* L, char value)
+  {
+    char str [2] = { value, 0 };
+    lua_pushstring (L, str);
+  }
+
+  static inline char get (lua_State* L, int index)
+  {
+    return luaL_checkstring (L, index) [0];
+  }
+};
+
+template <>
+struct Stack <char const *>
+{
+  static inline void push (lua_State* L, char const* str)
+  {
+    if (str != 0)
+      lua_pushstring (L, str);
+    else
+      lua_pushnil (L);
+  }
+
+  static inline char const *get (lua_State* L, int index)
+  {
+    return lua_isnil (L, index) ? 0 : luaL_checkstring (L, index);
+  }
+};
+
+template <>
+struct Stack <char &>
+{
+  static inline void push (lua_State* L, char& value)
+  {
+    char str [2] = { value, 0 };
+    lua_pushstring (L, str);
+  }
+
+  static inline char get (lua_State* L, int index)
+  {
+    char l = luaL_checkstring (L, index) [0];
+    char* x = new (lua_newuserdata (L, sizeof (char))) char (l);
+    return *x;
+  }
+};
+
+//------------------------------------------------------------------------------
+/**
+    Stack specialization for `std::string`.
+*/
+template <>
+struct Stack <std::string>
+{
+  static inline void push (lua_State* L, std::string const& str)
+  {
+    lua_pushlstring (L, str.c_str (), str.size());
+  }
+
+  static inline std::string get (lua_State* L, int index)
+  {
+    size_t len;
+    const char *str = luaL_checklstring(L, index, &len);
+    return std::string (str, len);
+  }
+};
+
+template <>
+struct Stack <std::string const&>
+{
+  static inline void push (lua_State* L, std::string const& str)
+  {
+    lua_pushstring (L, str.c_str());
+  }
+
+  static inline std::string get (lua_State* L, int index)
+  {
+    size_t len;
+    const char *str = luaL_checklstring(L, index, &len);
+    return std::string (str, len);
+  }
+};
+
+template <>
+struct Stack <std::string &>
+{
+  static inline void push (lua_State* L, std::string& str)
+  {
+    lua_pushlstring (L, str.c_str (), str.size());
+  }
+
+  static inline std::string& get (lua_State* L, int index)
+  {
+    size_t len;
+    const char *str = luaL_checklstring(L, index, &len);
+    std::string* x = new (lua_newuserdata (L, sizeof (std::string))) std::string (str, len);
+    return *x;
+  }
+};
diff --git a/libs/lua/LuaBridge/detail/TypeList.h b/libs/lua/LuaBridge/detail/TypeList.h
new file mode 100644
index 0000000..fc4ce39
--- /dev/null
+++ b/libs/lua/LuaBridge/detail/TypeList.h
@@ -0,0 +1,174 @@
+//------------------------------------------------------------------------------
+/*
+  https://github.com/vinniefalco/LuaBridge
+
+  Copyright 2012, Vinnie Falco <vinnie.falco at gmail.com>
+  Copyright 2007, Nathan Reed
+
+  License: The MIT License (http://www.opensource.org/licenses/mit-license.php)
+
+  Permission is hereby granted, free of charge, to any person obtaining a copy
+  of this software and associated documentation files (the "Software"), to deal
+  in the Software without restriction, including without limitation the rights
+  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+  copies of the Software, and to permit persons to whom the Software is
+  furnished to do so, subject to the following conditions:
+
+  The above copyright notice and this permission notice shall be included in all
+  copies or substantial portions of the Software.
+
+  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+  SOFTWARE.
+
+  This file incorporates work covered by the following copyright and
+  permission notice:
+
+    The Loki Library
+    Copyright (c) 2001 by Andrei Alexandrescu
+    This code accompanies the book:
+    Alexandrescu, Andrei. "Modern C++ Design: Generic Programming and Design
+        Patterns Applied". Copyright (c) 2001. Addison-Wesley.
+    Permission to use, copy, modify, distribute and sell this software for any
+        purpose is hereby granted without fee, provided that the above copyright
+        notice appear in all copies and that both that copyright notice and this
+        permission notice appear in supporting documentation.
+    The author or Addison-Welsey Longman make no representations about the
+        suitability of this software for any purpose. It is provided "as is"
+        without express or implied warranty.
+*/
+//==============================================================================
+
+/**
+  None type means void parameters or return value.
+*/
+typedef void None;
+
+template <typename Head, typename Tail = None>
+struct TypeList
+{
+};
+
+/**
+  A TypeList with actual values.
+*/
+template <typename List>
+struct TypeListValues
+{
+  static std::string const tostring (bool)
+  {
+    return "";
+  }
+};
+
+/**
+  TypeListValues recursive template definition.
+*/
+template <typename Head, typename Tail>
+struct TypeListValues <TypeList <Head, Tail> >
+{
+  Head hd;
+  TypeListValues <Tail> tl;
+
+  TypeListValues (Head hd_, TypeListValues <Tail> const& tl_)
+    : hd (hd_), tl (tl_)
+  {
+  }
+
+  static std::string const tostring (bool comma = false)
+  {
+    std::string s;
+
+    if (comma)
+      s = ", ";
+
+    s = s + typeid (Head).name ();
+
+    return s + TypeListValues <Tail>::tostring (true);
+  }
+};
+
+// Specializations of type/value list for head types that are references and
+// const-references.  We need to handle these specially since we can't count
+// on the referenced object hanging around for the lifetime of the list.
+
+template <typename Head, typename Tail>
+struct TypeListValues <TypeList <Head&, Tail> >
+{
+  Head hd;
+  TypeListValues <Tail> tl;
+
+  TypeListValues (Head& hd_, TypeListValues <Tail> const& tl_)
+    : hd (hd_), tl (tl_)
+  {
+  }
+
+  static std::string const tostring (bool comma = false)
+  {
+    std::string s;
+
+    if (comma)
+      s = ", ";
+
+    s = s + typeid (Head).name () + "&";
+
+    return s + TypeListValues <Tail>::tostring (true);
+  }
+};
+
+template <typename Head, typename Tail>
+struct TypeListValues <TypeList <Head const&, Tail> >
+{
+  Head hd;
+  TypeListValues <Tail> tl;
+
+  TypeListValues (Head const& hd_, const TypeListValues <Tail>& tl_)
+    : hd (hd_), tl (tl_)
+  {
+  }
+
+  static std::string const tostring (bool comma = false)
+  {
+    std::string s;
+
+    if (comma)
+      s = ", ";
+
+    s = s + typeid (Head).name () + " const&";
+
+    return s + TypeListValues <Tail>::tostring (true);
+  }
+};
+
+//==============================================================================
+/**
+  Subclass of a TypeListValues constructable from the Lua stack.
+*/
+
+template <typename List, int Start = 1>
+struct ArgList
+{
+};
+
+template <int Start>
+struct ArgList <None, Start> : public TypeListValues <None>
+{
+  ArgList (lua_State*)
+  {
+  }
+};
+
+template <typename Head, typename Tail, int Start>
+struct ArgList <TypeList <Head, Tail>, Start>
+  : public TypeListValues <TypeList <Head, Tail> >
+{
+  ArgList (lua_State* L)
+    : TypeListValues <TypeList <Head, Tail> > (Stack <Head>::get (L, Start),
+                                            ArgList <Tail, Start + 1> (L))
+  {
+  }
+};
diff --git a/libs/lua/LuaBridge/detail/TypeTraits.h b/libs/lua/LuaBridge/detail/TypeTraits.h
new file mode 100644
index 0000000..ffb437f
--- /dev/null
+++ b/libs/lua/LuaBridge/detail/TypeTraits.h
@@ -0,0 +1,135 @@
+//------------------------------------------------------------------------------
+/*
+  https://github.com/vinniefalco/LuaBridge
+
+  Copyright 2012, Vinnie Falco <vinnie.falco at gmail.com>
+
+  License: The MIT License (http://www.opensource.org/licenses/mit-license.php)
+
+  Permission is hereby granted, free of charge, to any person obtaining a copy
+  of this software and associated documentation files (the "Software"), to deal
+  in the Software without restriction, including without limitation the rights
+  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+  copies of the Software, and to permit persons to whom the Software is
+  furnished to do so, subject to the following conditions:
+
+  The above copyright notice and this permission notice shall be included in all
+  copies or substantial portions of the Software.
+
+  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+  SOFTWARE.
+*/
+//==============================================================================
+
+#ifndef LUABRIDGE_TYPEINFO_HEADER
+#define LUABRIDGE_TYPEINFO_HEADER
+
+//------------------------------------------------------------------------------
+/**
+    Container traits.
+
+    Unspecialized ContainerTraits has the isNotContainer typedef for SFINAE.
+    All user defined containers must supply an appropriate specialization for
+    ContinerTraits (without the typedef isNotContainer). The containers that
+    come with LuaBridge also come with the appropriate ContainerTraits
+    specialization. See the corresponding declaration for details.
+
+    A specialization of ContainerTraits for some generic type ContainerType
+    looks like this:
+
+        template <class T>
+        struct ContainerTraits <ContainerType <T> >
+        {
+          typedef typename T Type;
+
+          static T* get (ContainerType <T> const& c)
+          {
+            return c.get (); // Implementation-dependent on ContainerType
+          }
+        };
+*/
+template <class T>
+struct ContainerTraits
+{
+  typedef bool isNotContainer;
+};
+
+//------------------------------------------------------------------------------
+/**
+    Type traits.
+
+    Specializations return information about a type.
+*/
+struct TypeTraits
+{
+  /** Determine if type T is a container.
+
+      To be considered a container, there must be a specialization of
+      ContainerTraits with the required fields.
+  */
+  template <typename T>
+  class isContainer
+  {
+  private:
+    typedef char yes[1]; // sizeof (yes) == 1
+    typedef char no [2]; // sizeof (no)  == 2
+
+    template <typename C>
+    static no& test (typename C::isNotContainer*);
+
+    template <typename>
+    static yes& test (...);
+
+  public:
+    static const bool value = sizeof (test <ContainerTraits <T> >(0)) == sizeof (yes);
+  };
+
+  /** Determine if T is an enum */
+  template <typename T>
+  class isEnum
+  {
+  public:
+    //static const bool value = std::is_enum<T>::value; // C++11
+    static const bool value = boost::is_enum<T>::value;
+  };
+
+
+  /** Determine if T is const qualified.
+  */
+  /** @{ */
+  template <class T>
+  struct isConst
+  {
+    static bool const value = false;
+  };
+
+  template <class T>
+  struct isConst <T const>
+  {
+    static bool const value = true;
+  };
+  /** @} */
+
+  /** Remove the const qualifier from T.
+  */
+  /** @{ */
+  template <class T>
+  struct removeConst
+  {
+    typedef T Type;
+  };
+
+  template <class T>
+  struct removeConst <T const>
+  {
+    typedef T Type;
+  };
+  /**@}*/
+};
+
+#endif
diff --git a/libs/lua/LuaBridge/detail/Userdata.h b/libs/lua/LuaBridge/detail/Userdata.h
new file mode 100644
index 0000000..feab28f
--- /dev/null
+++ b/libs/lua/LuaBridge/detail/Userdata.h
@@ -0,0 +1,860 @@
+//------------------------------------------------------------------------------
+/*
+  https://github.com/vinniefalco/LuaBridge
+
+  Copyright 2016, Robin Gareus <robin at gareus.org>
+  Copyright 2012, Vinnie Falco <vinnie.falco at gmail.com>
+
+  License: The MIT License (http://www.opensource.org/licenses/mit-license.php)
+
+  Permission is hereby granted, free of charge, to any person obtaining a copy
+  of this software and associated documentation files (the "Software"), to deal
+  in the Software without restriction, including without limitation the rights
+  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+  copies of the Software, and to permit persons to whom the Software is
+  furnished to do so, subject to the following conditions:
+
+  The above copyright notice and this permission notice shall be included in all
+  copies or substantial portions of the Software.
+
+  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+  SOFTWARE.
+*/
+//==============================================================================
+
+//==============================================================================
+/**
+  Return the identity pointer for our lightuserdata tokens.
+
+  LuaBridge metatables are tagged with a security "token." The token is a
+  lightuserdata created from the identity pointer, used as a key in the
+  metatable. The value is a boolean = true, although any value could have been
+  used.
+
+  Because of Lua's dynamic typing and our improvised system of imposing C++
+  class structure, there is the possibility that executing scripts may
+  knowingly or unknowingly cause invalid data to get passed to the C functions
+  created by LuaBridge. In particular, our security model addresses the
+  following:
+
+  Notes:
+    1. Scripts cannot create a userdata (ignoring the debug lib).
+    2. Scripts cannot create a lightuserdata (ignoring the debug lib).
+    3. Scripts cannot set the metatable on a userdata.
+    4. Our identity key is a unique pointer in the process.
+    5. Our metatables have a lightuserdata identity key / value pair.
+    6. Our metatables have "__metatable" set to a boolean = false.
+    7. Our lightuserdata is unique.
+*/
+
+#ifdef  PLATFORM_WINDOWS
+# ifdef COMPILER_MSVC
+#include "LuaBridge/LuaBridge.h" /* Needed for LuaBridge_API */
+LuaBridge_API void* getIdentityKey ();
+# else
+extern void* getIdentityKey ();
+# endif
+#else
+inline void* getIdentityKey ()
+{
+  static char value;
+  return &value;
+}
+#endif
+
+/**
+  Interface to a class pointer retrievable from a userdata.
+*/
+class Userdata
+{
+protected:
+  void* m_p; // subclasses must set this
+
+  //--------------------------------------------------------------------------
+  /**
+    Get an untyped pointer to the contained class.
+  */
+  inline void* getPointer () const
+  {
+    return m_p;
+  }
+
+private:
+  //--------------------------------------------------------------------------
+  /**
+    Validate and retrieve a Userdata on the stack.
+
+    The Userdata must exactly match the corresponding class table or
+    const table, or else a Lua error is raised. This is used for the
+    __gc metamethod.
+  */
+  static Userdata* getExactClass (lua_State* L,
+                                  int narg,
+                                  void const* classKey)
+  {
+    Userdata* ud = 0;
+    int const index = lua_absindex (L, narg);
+
+    bool mismatch = false;
+    char const* got = 0;
+
+    lua_rawgetp (L, LUA_REGISTRYINDEX, classKey);
+    assert (lua_istable (L, -1));
+
+    // Make sure we have a userdata.
+    if (!lua_isuserdata (L, index))
+      mismatch = true;
+
+    // Make sure it's metatable is ours.
+    if (!mismatch)
+    {
+      lua_getmetatable (L, index);
+      lua_rawgetp (L, -1, getIdentityKey ());
+      if (lua_isboolean (L, -1))
+      {
+        lua_pop (L, 1);
+      }
+      else
+      {
+        lua_pop (L, 2);
+        mismatch = true;
+      }
+    }
+
+    if (!mismatch)
+    {
+      if (lua_rawequal (L, -1, -2))
+      {
+        // Matches class table.
+        lua_pop (L, 2);
+        ud = static_cast <Userdata*> (lua_touserdata (L, index));
+      }
+      else
+      {
+        rawgetfield (L, -2, "__const");
+        if (lua_rawequal (L, -1, -2))
+        {
+          // Matches const table
+          lua_pop (L, 3);
+          ud = static_cast <Userdata*> (lua_touserdata (L, index));
+        }
+        else
+        {
+          // Mismatch, but its one of ours so get a type name.
+          rawgetfield (L, -2, "__type");
+          lua_insert (L, -4);
+          lua_pop (L, 2);
+          got = lua_tostring (L, -2);
+          mismatch = true;
+        }
+      }
+    }
+
+    if (mismatch)
+    {
+      rawgetfield (L, -1, "__type");
+      assert (lua_type (L, -1) == LUA_TSTRING);
+      char const* const expected = lua_tostring (L, -1);
+
+      if (got == 0)
+        got = lua_typename (L, lua_type (L, index));
+
+      char const* const msg = lua_pushfstring (
+        L, "%s expected, got %s", expected, got);
+
+      if (narg > 0)
+        luaL_argerror (L, narg, msg);
+      else
+        lua_error (L);
+    }
+
+    return ud;
+  }
+
+  //--------------------------------------------------------------------------
+  /**
+    Validate and retrieve a Userdata on the stack.
+
+    The Userdata must be derived from or the same as the given base class,
+    identified by the key. If canBeConst is false, generates an error if
+    the resulting Userdata represents to a const object. We do the type check
+    first so that the error message is informative.
+  */
+  static Userdata* getClass (lua_State* L,
+                             int index,
+                             void const* baseClassKey,
+                             bool canBeConst)
+  {
+    assert (index > 0);
+    Userdata* ud = 0;
+
+    bool mismatch = false;
+    char const* got = 0;
+
+    lua_rawgetp (L, LUA_REGISTRYINDEX, baseClassKey);
+    assert (lua_istable (L, -1));
+
+    // Make sure we have a userdata.
+    if (lua_isuserdata (L, index))
+    {
+      // Make sure it's metatable is ours.
+      lua_getmetatable (L, index);
+      lua_rawgetp (L, -1, getIdentityKey ());
+      if (lua_isboolean (L, -1))
+      {
+        lua_pop (L, 1);
+
+        // If __const is present, object is NOT const.
+        rawgetfield (L, -1, "__const");
+        assert (lua_istable (L, -1) || lua_isnil (L, -1));
+        bool const isConst = lua_isnil (L, -1);
+        lua_pop (L, 1);
+
+        // Replace the class table with the const table if needed.
+        if (isConst)
+        {
+          rawgetfield (L, -2, "__const");
+          assert (lua_istable (L, -1));
+          lua_replace (L, -3);
+        }
+
+        for (;;)
+        {
+          if (lua_rawequal (L, -1, -2))
+          {
+            lua_pop (L, 2);
+
+            // Match, now check const-ness.
+            if (isConst && !canBeConst)
+            {
+              luaL_argerror (L, index, "cannot be const");
+            }
+            else
+            {
+              ud = static_cast <Userdata*> (lua_touserdata (L, index));
+              break;
+            }
+          }
+          else
+          {
+            // Replace current metatable with it's base class.
+            rawgetfield (L, -1, "__parent");
+/*
+ud
+class metatable
+ud metatable
+ud __parent (nil)
+*/
+
+            if (lua_isnil (L, -1))
+            {
+              lua_remove (L, -1);
+              // Mismatch, but its one of ours so get a type name.
+              rawgetfield (L, -1, "__type");
+              lua_insert (L, -3);
+              lua_pop (L, 1);
+              got = lua_tostring (L, -2);
+              mismatch = true;
+              break;
+            }
+            else
+            {
+              lua_remove (L, -2);
+            }
+          }
+        }
+      }
+      else
+      {
+        lua_pop (L, 2);
+        mismatch = true;
+      }
+    }
+    else
+    {
+      mismatch = true;
+    }
+
+    if (mismatch)
+    {
+      assert (lua_type (L, -1) == LUA_TTABLE);
+      rawgetfield (L, -1, "__type");
+      assert (lua_type (L, -1) == LUA_TSTRING);
+      char const* const expected = lua_tostring (L, -1);
+
+      if (got == 0)
+        got = lua_typename (L, lua_type (L, index));
+
+      char const* const msg = lua_pushfstring (
+        L, "%s expected, got %s", expected, got);
+
+      luaL_argerror (L, index, msg);
+    }
+
+    return ud;
+  }
+
+public:
+  virtual ~Userdata () { }
+
+  static void* get_ptr (lua_State* L, int index) {
+    Userdata* ud = static_cast <Userdata*> (lua_touserdata (L, index));
+    return ud->m_p;
+  }
+
+  //--------------------------------------------------------------------------
+  /**
+    Returns the Userdata* if the class on the Lua stack matches.
+
+    If the class does not match, a Lua error is raised.
+  */
+  template <class T>
+  static inline Userdata* getExact (lua_State* L, int index)
+  {
+    return getExactClass (L, index, ClassInfo <T>::getClassKey ());
+  }
+
+  //--------------------------------------------------------------------------
+  /**
+    Get a pointer to the class from the Lua stack.
+
+    If the object is not the class or a subclass, or it violates the
+    const-ness, a Lua error is raised.
+  */
+  template <class T>
+  static inline T* get (lua_State* L, int index, bool canBeConst)
+  {
+    if (lua_isnil (L, index))
+      return 0;
+    else
+      return static_cast <T*> (getClass (L, index,
+        ClassInfo <T>::getClassKey (), canBeConst)->getPointer ());
+  }
+};
+
+//----------------------------------------------------------------------------
+/**
+  Wraps a class object stored in a Lua userdata.
+
+  The lifetime of the object is managed by Lua. The object is constructed
+  inside the userdata using placement new.
+*/
+template <class T>
+class UserdataValue : public Userdata
+{
+private:
+  UserdataValue <T> (UserdataValue <T> const&);
+  UserdataValue <T> operator= (UserdataValue <T> const&);
+
+  char m_storage [sizeof (T)];
+
+  inline T* getObject ()
+  {
+    // If this fails to compile it means you forgot to provide
+    // a Container specialization for your container!
+    //
+    return reinterpret_cast <T*> (&m_storage [0]);
+  }
+
+private:
+  /**
+    Used for placement construction.
+  */
+  UserdataValue ()
+  {
+    m_p = getObject ();
+  }
+
+  ~UserdataValue ()
+  {
+    getObject ()->~T ();
+  }
+
+public:
+  /**
+    Push a T via placement new.
+
+    The caller is responsible for calling placement new using the
+    returned uninitialized storage.
+  */
+  static void* place (lua_State* const L)
+  {
+    UserdataValue <T>* const ud = new (
+      lua_newuserdata (L, sizeof (UserdataValue <T>))) UserdataValue <T> ();
+    lua_rawgetp (L, LUA_REGISTRYINDEX, ClassInfo <T>::getClassKey ());
+    // If this goes off it means you forgot to register the class!
+    assert (lua_istable (L, -1));
+    lua_setmetatable (L, -2);
+    return ud->getPointer ();
+  }
+
+  /**
+    Push T via copy construction from U.
+  */
+  template <class U>
+  static inline void push (lua_State* const L, U const& u)
+  {
+    new (place (L)) U (u);
+  }
+};
+
+//----------------------------------------------------------------------------
+/**
+  Wraps a pointer to a class object inside a Lua userdata.
+
+  The lifetime of the object is managed by C++.
+*/
+class UserdataPtr : public Userdata
+{
+private:
+  UserdataPtr (UserdataPtr const&);
+  UserdataPtr operator= (UserdataPtr const&);
+
+private:
+  /** Push non-const pointer to object using metatable key.
+  */
+  static void push (lua_State* L, void* const p, void const* const key)
+  {
+    if (p)
+    {
+      new (lua_newuserdata (L, sizeof (UserdataPtr))) UserdataPtr (p);
+      lua_rawgetp (L, LUA_REGISTRYINDEX, key);
+      // If this goes off it means you forgot to register the class!
+      assert (lua_istable (L, -1));
+      lua_setmetatable (L, -2);
+    }
+    else
+    {
+      lua_pushnil (L);
+    }
+  }
+
+  /** Push const pointer to object using metatable key.
+  */
+  static void push (lua_State* L, void const* const p, void const* const key)
+  {
+    if (p)
+    {
+      new (lua_newuserdata (L, sizeof (UserdataPtr)))
+        UserdataPtr (const_cast <void*> (p));
+      lua_rawgetp (L, LUA_REGISTRYINDEX, key);
+      // If this goes off it means you forgot to register the class!
+      assert (lua_istable (L, -1));
+      lua_setmetatable (L, -2);
+    }
+    else
+    {
+      lua_pushnil (L);
+    }
+  }
+
+  explicit UserdataPtr (void* const p)
+  {
+    m_p = p;
+
+    // Can't construct with a null pointer!
+    //
+    assert (m_p != 0);
+  }
+
+  friend class LuaRef;
+  static inline void push_raw (lua_State* const L, void* p, const void* classkey)
+  {
+    new (lua_newuserdata (L, sizeof (UserdataPtr))) UserdataPtr (p);
+    lua_rawgetp (L, LUA_REGISTRYINDEX, classkey);
+    assert (lua_istable (L, -1));
+    lua_setmetatable (L, -2);
+  }
+
+public:
+  /** Push non-const pointer to object.
+  */
+  template <class T>
+  static inline void push (lua_State* const L, T* const p)
+  {
+    if (p)
+      push (L, p, ClassInfo <T>::getClassKey ());
+    else
+      lua_pushnil (L);
+  }
+
+  /** Push const pointer to object.
+  */
+  template <class T>
+  static inline void push (lua_State* const L, T const* const p)
+  {
+    if (p)
+      push (L, p, ClassInfo <T>::getConstKey ());
+    else
+      lua_pushnil (L);
+  }
+};
+
+//============================================================================
+/**
+  Wraps a container thet references a class object.
+
+  The template argument C is the container type, ContainerTraits must be
+  specialized on C or else a compile error will result.
+*/
+template <class C>
+class UserdataShared : public Userdata
+{
+private:
+  UserdataShared (UserdataShared <C> const&);
+  UserdataShared <C>& operator= (UserdataShared <C> const&);
+
+  typedef typename TypeTraits::removeConst <
+    typename ContainerTraits <C>::Type>::Type T;
+
+  C m_c;
+
+private:
+  ~UserdataShared ()
+  {
+  }
+
+public:
+  /**
+    Construct from a container to the class or a derived class.
+  */
+  template <class U>
+  explicit UserdataShared (U const& u) : m_c (u)
+  {
+    m_p = const_cast <void*> (reinterpret_cast <void const*> (
+        (ContainerTraits <C>::get (m_c))));
+  }
+
+  /**
+    Construct from a pointer to the class or a derived class.
+  */
+  template <class U>
+  explicit UserdataShared (U* u) : m_c (u)
+  {
+    m_p = const_cast <void*> (reinterpret_cast <void const*> (
+        (ContainerTraits <C>::get (m_c))));
+  }
+};
+
+//----------------------------------------------------------------------------
+//
+// SFINAE helpers.
+//
+
+// non-const objects
+template <class C, bool makeObjectConst>
+struct UserdataSharedHelper
+{
+  typedef typename TypeTraits::removeConst <
+    typename ContainerTraits <C>::Type>::Type T;
+
+  static void push (lua_State* L, C const& c)
+  {
+    if (ContainerTraits <C>::get (c) != 0)
+    {
+      new (lua_newuserdata (L, sizeof (UserdataShared <C>))) UserdataShared <C> (c);
+      lua_rawgetp (L, LUA_REGISTRYINDEX, ClassInfo <T>::getClassKey ());
+      // If this goes off it means the class T is unregistered!
+      assert (lua_istable (L, -1));
+      lua_setmetatable (L, -2);
+    }
+    else
+    {
+      lua_pushnil (L);
+    }
+  }
+
+  static void push (lua_State* L, T* const t)
+  {
+    if (t)
+    {
+      new (lua_newuserdata (L, sizeof (UserdataShared <C>))) UserdataShared <C> (t);
+      lua_rawgetp (L, LUA_REGISTRYINDEX, ClassInfo <T>::getClassKey ());
+      // If this goes off it means the class T is unregistered!
+      assert (lua_istable (L, -1));
+      lua_setmetatable (L, -2);
+    }
+    else
+    {
+      lua_pushnil (L);
+    }
+  }
+};
+
+// const objects
+template <class C>
+struct UserdataSharedHelper <C, true>
+{
+  typedef typename TypeTraits::removeConst <
+    typename ContainerTraits <C>::Type>::Type T;
+
+  static void push (lua_State* L, C const& c)
+  {
+    if (ContainerTraits <C>::get (c) != 0)
+    {
+      new (lua_newuserdata (L, sizeof (UserdataShared <C>))) UserdataShared <C> (c);
+      lua_rawgetp (L, LUA_REGISTRYINDEX, ClassInfo <T>::getConstKey ());
+      // If this goes off it means the class T is unregistered!
+      assert (lua_istable (L, -1));
+      lua_setmetatable (L, -2);
+    }
+    else
+    {
+      lua_pushnil (L);
+    }
+  }
+
+  static void push (lua_State* L, T* const t)
+  {
+    if (t)
+    {
+      new (lua_newuserdata (L, sizeof (UserdataShared <C>))) UserdataShared <C> (t);
+      lua_rawgetp (L, LUA_REGISTRYINDEX, ClassInfo <T>::getConstKey ());
+      // If this goes off it means the class T is unregistered!
+      assert (lua_istable (L, -1));
+      lua_setmetatable (L, -2);
+    }
+    else
+    {
+      lua_pushnil (L);
+    }
+  }
+};
+
+/**
+  Pass by container.
+
+  The container controls the object lifetime. Typically this will be a
+  lifetime shared by C++ and Lua using a reference count. Because of type
+  erasure, containers like std::shared_ptr will not work. Containers must
+  either be of the intrusive variety, or in the style of the RefCountedPtr
+  type provided by LuaBridge (that uses a global hash table).
+*/
+template <class C, bool byContainer, bool isEnum>
+struct StackHelper
+{
+  static inline void push (lua_State* L, C const& c)
+  {
+    UserdataSharedHelper <C,
+      TypeTraits::isConst <typename ContainerTraits <C>::Type>::value>::push (L, c);
+  }
+
+  typedef typename TypeTraits::removeConst <
+    typename ContainerTraits <C>::Type>::Type T;
+
+  static inline C get (lua_State* L, int index)
+  {
+    return Userdata::get <T> (L, index, true);
+  }
+};
+
+/**
+  Pass by value.
+
+  Lifetime is managed by Lua. A C++ function which accesses a pointer or
+  reference to an object outside the activation record in which it was
+  retrieved may result in undefined behavior if Lua garbage collected it.
+*/
+template <class T>
+struct StackHelper <T, false, false>
+{
+  static inline void push (lua_State* L, T const& t)
+  {
+    UserdataValue <T>::push (L, t);
+  }
+
+  static inline T const& get (lua_State* L, int index)
+  {
+    return *Userdata::get <T> (L, index, true);
+  }
+};
+
+template <class T>
+struct StackHelper <T, false, true>
+{
+  static inline void push (lua_State* L, T const& t)
+  {
+    int v = static_cast <int> (t);
+    lua_pushinteger (L, static_cast <lua_Integer> (v));
+  }
+
+  static inline T get (lua_State* L, int index)
+  {
+    int v = static_cast <int> (luaL_checkinteger (L, index));
+    return T (v);
+  }
+};
+
+//==============================================================================
+
+/**
+  Lua stack conversions for class objects passed by value.
+*/
+template <class T>
+struct Stack
+{
+public:
+  static inline void push (lua_State* L, T const& t)
+  {
+    StackHelper <T,
+      TypeTraits::isContainer <T>::value,
+      TypeTraits::isEnum<T>::value>::push (L, t);
+  }
+
+  static inline T get (lua_State* L, int index)
+  {
+    return StackHelper <T,
+      TypeTraits::isContainer <T>::value,
+      TypeTraits::isEnum<T>::value>::get (L, index);
+  }
+};
+
+//------------------------------------------------------------------------------
+/**
+  Lua stack conversions for pointers and references to class objects.
+
+  Lifetime is managed by C++. Lua code which remembers a reference to the
+  value may result in undefined behavior if C++ destroys the object. The
+  handling of the const and volatile qualifiers happens in UserdataPtr.
+*/
+
+// pointer
+template <class T>
+struct Stack <T*>
+{
+  static inline void push (lua_State* L, T* const p)
+  {
+    UserdataPtr::push (L, p);
+  }
+
+  static inline T* get (lua_State* L, int index)
+  {
+    return Userdata::get <T> (L, index, false);
+  }
+};
+
+// Strips the const off the right side of *
+template <class T>
+struct Stack <T* const>
+{
+  static inline void push (lua_State* L, T* const p)
+  {
+    UserdataPtr::push (L, p);
+  }
+
+  static inline T* get (lua_State* L, int index)
+  {
+    return Userdata::get <T> (L, index, false);
+  }
+};
+
+// pointer to const
+template <class T>
+struct Stack <T const*>
+{
+  static inline void push (lua_State* L, T const* const p)
+  {
+    UserdataPtr::push (L, p);
+  }
+
+  static inline T const* get (lua_State* L, int index)
+  {
+    return Userdata::get <T> (L, index, true);
+  }
+};
+
+// Strips the const off the right side of *
+template <class T>
+struct Stack <T const* const>
+{
+  static inline void push (lua_State* L, T const* const p)
+  {
+    UserdataPtr::push (L, p);
+  }
+
+  static inline T const* get (lua_State* L, int index)
+  {
+    return Userdata::get <T> (L, index, true);
+  }
+};
+
+// reference
+template <class T>
+struct Stack <T&>
+{
+  static inline void push (lua_State* L, T& t)
+  {
+    UserdataPtr::push (L, &t);
+  }
+
+  static T& get (lua_State* L, int index)
+  {
+    T* const t = Userdata::get <T> (L, index, false);
+    if (!t)
+      luaL_error (L, "nil passed to reference");
+    return *t;
+  }
+};
+
+template <class C, bool byContainer>
+struct RefStackHelper
+{
+  typedef C return_type;
+
+  static inline void push (lua_State* L, C const& t)
+  {
+    UserdataSharedHelper <C,
+      TypeTraits::isConst <typename ContainerTraits <C>::Type>::value>::push (L, t);
+  }
+
+  typedef typename TypeTraits::removeConst <
+    typename ContainerTraits <C>::Type>::Type T;
+
+  static return_type get (lua_State* L, int index)
+  {
+    return Userdata::get <T> (L, index, true);
+  }
+};
+
+template <class T>
+struct RefStackHelper <T, false>
+{
+  typedef T const& return_type;
+
+  static inline void push (lua_State* L, T const& t)
+  {
+    UserdataPtr::push (L, &t);
+  }
+
+  static return_type get (lua_State* L, int index)
+  {
+    T const* const t = Userdata::get <T> (L, index, true);
+
+    if (!t)
+      luaL_error (L, "nil passed to reference");
+    return *t;
+  }
+
+};
+
+// reference to const
+template <class T>
+struct Stack <T const&>
+{
+  typedef RefStackHelper <T, TypeTraits::isContainer <T>::value> helper_t;
+
+  static inline void push (lua_State* L, T const& t)
+  {
+    helper_t::push (L, t);
+  }
+
+  static typename helper_t::return_type get (lua_State* L, int index)
+  {
+    return helper_t::get (L, index);
+  }
+};
diff --git a/libs/lua/LuaBridge/detail/dump.h b/libs/lua/LuaBridge/detail/dump.h
new file mode 100644
index 0000000..b9b79ce
--- /dev/null
+++ b/libs/lua/LuaBridge/detail/dump.h
@@ -0,0 +1,28 @@
+#include <sstream>
+#include <string>
+
+static std::string dumpLuaState(lua_State *L) {
+	std::stringstream ostr;
+	int i;
+	int top = lua_gettop(L);
+	ostr << "top=" << top << ":\n";
+	for (i = 1; i <= top; ++i) {
+		int t = lua_type(L, i);
+		switch(t) {
+		case LUA_TSTRING:
+			ostr << "  " << i << ": '" << lua_tostring(L, i) << "'\n";
+			break;
+		case LUA_TBOOLEAN:
+			ostr << "  " << i << ": " <<
+					(lua_toboolean(L, i) ? "true" : "false") << "\n";
+			break;
+		case LUA_TNUMBER:
+			ostr << "  " << i << ": " << lua_tonumber(L, i) << "\n";
+			break;
+		default:
+			ostr << "  " << i << ": TYPE=" << lua_typename(L, t) << ": " << lua_topointer(L, i)<< "\n";
+			break;
+		}
+	}
+	return ostr.str();
+}
diff --git a/libs/lua/MSVClua/lua.vcproj b/libs/lua/MSVClua/lua.vcproj
new file mode 100644
index 0000000..0c34950
--- /dev/null
+++ b/libs/lua/MSVClua/lua.vcproj
@@ -0,0 +1,363 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="8.00"
+	Name="lua"
+	ProjectGUID="{1FC0A845-7A3D-40FC-B4DD-95F4DD4B0A2D}"
+	RootNamespace="lua"
+	>
+	<Platforms>
+		<Platform
+			Name="Win32"
+		/>
+	</Platforms>
+	<ToolFiles>
+	</ToolFiles>
+	<Configurations>
+		<Configuration
+			Name="Debug 32|Win32"
+			OutputDirectory="$(ProjectDir)\$(ConfigurationName)\bin"
+			IntermediateDirectory="$(ProjectDir)\$(ConfigurationName)\obj\$(ProjectName)"
+			ConfigurationType="2"
+			InheritedPropertySheets="..\..\..\MSVCMixbus3\MSVCMixbus3.vsprops"
+			CharacterSet="2"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
+				Optimization="0"
+				AdditionalIncludeDirectories="..;"$(GenericIncludeFolder)";"$(GenericIncludeFolder)\ardourext""
+				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;BUILDING_LUA;LIBLUA_DLL_EXPORTS;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;WIN32;_WIN32;_DEBUG;DEBUG="Debug";LUA_DEBUG;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PACKAGE="\"liblua\"";PROGRAM_NAME="\"Mixbus3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+				MinimalRebuild="true"
+				RuntimeLibrary="3"
+				WarningLevel="3"
+				DebugInformationFormat="3"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLinkerTool"
+				AdditionalDependencies="$(DllPrefix)sigc++32-2.0D.lib"
+				OutputFile="$(OutDir)\$(DllPrefix)$(ProjectName)32D.dll"
+				AdditionalLibraryDirectories="F:\pthread-win32\Pre-built.2\lib"
+				IgnoreDefaultLibraryNames="libboost_regex-vc80-mt-gd-1_40.lib;msvcrt.lib;dsound.lib"
+				GenerateDebugInformation="true"
+				SubSystem="2"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCManifestTool"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCAppVerifierTool"
+			/>
+			<Tool
+				Name="VCWebDeploymentTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+				CommandLine="copy /Y "$(OutDir)\$(TargetName).dll" "$(Debug32TargetFolder)\$(TargetName).dll"&#x0D;&#x0A;copy /Y "$(OutDir)\$(TargetName).dll" "$(Debug32TestSuiteFolder)\$(TargetName).dll"&#x0D;&#x0A;copy /Y "$(OutDir)\$(TargetName).lib" "$(GenericWin32LibraryFolder)\$(TargetName).lib"&#x0D;&#x0A;"
+			/>
+		</Configuration>
+		<Configuration
+			Name="Release 32|Win32"
+			OutputDirectory="$(ProjectDir)\$(ConfigurationName)\bin"
+			IntermediateDirectory="$(ProjectDir)\$(ConfigurationName)\obj\$(ProjectName)"
+			ConfigurationType="2"
+			InheritedPropertySheets="..\..\..\MSVCMixbus3\MSVCMixbus3.vsprops"
+			CharacterSet="2"
+			WholeProgramOptimization="1"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
+				Optimization="2"
+				InlineFunctionExpansion="1"
+				AdditionalIncludeDirectories="..;"$(GenericIncludeFolder)";"$(GenericIncludeFolder)\ardourext""
+				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_LUA;LIBLUA_DLL_EXPORTS;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;WIN32;_WIN32;NDEBUG;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PACKAGE="\"liblua\"";PROGRAM_NAME="\"Mixbus3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+				StringPooling="false"
+				RuntimeLibrary="2"
+				EnableEnhancedInstructionSet="1"
+				WarningLevel="3"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLinkerTool"
+				AdditionalDependencies="$(DllPrefix)sigc++32-2.0.lib"
+				OutputFile="$(OutDir)\$(DllPrefix)$(ProjectName)32.dll"
+				AdditionalLibraryDirectories="F:\pthread-win32\Pre-built.2\lib"
+				IgnoreDefaultLibraryNames="libboost_regex-vc80-mt-gd-1_40.lib;dsound.lib"
+				GenerateDebugInformation="true"
+				SubSystem="2"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCManifestTool"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCAppVerifierTool"
+			/>
+			<Tool
+				Name="VCWebDeploymentTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+				CommandLine="copy /Y "$(OutDir)\$(TargetName).dll" "$(Release32TargetFolder)\$(TargetName).dll"&#x0D;&#x0A;copy /Y "$(OutDir)\$(TargetName).dll" "$(Release32TestSuiteFolder)\$(TargetName).dll"&#x0D;&#x0A;copy /Y "$(OutDir)\$(TargetName).lib" "$(GenericWin32LibraryFolder)\$(TargetName).lib"&#x0D;&#x0A;"
+			/>
+		</Configuration>
+		<Configuration
+			Name="Release 32 with Debugging Capability|Win32"
+			OutputDirectory="$(ProjectDir)\$(ConfigurationName)\bin"
+			IntermediateDirectory="$(ProjectDir)\$(ConfigurationName)\obj\$(ProjectName)"
+			ConfigurationType="2"
+			InheritedPropertySheets="..\..\..\MSVCMixbus3\MSVCMixbus3.vsprops"
+			CharacterSet="2"
+			WholeProgramOptimization="0"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+				CommandLine="&#x0D;&#x0A;"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
+				Optimization="0"
+				AdditionalIncludeDirectories="..;"$(GenericIncludeFolder)";"$(GenericIncludeFolder)\ardourext""
+				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_LUA;LIBLUA_DLL_EXPORTS;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;WIN32;_WIN32;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PACKAGE="\"liblua\"";PROGRAM_NAME="\"Mixbus3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+				StringPooling="false"
+				RuntimeLibrary="2"
+				EnableEnhancedInstructionSet="1"
+				WarningLevel="3"
+				DebugInformationFormat="3"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLinkerTool"
+				AdditionalDependencies="$(DllPrefix)sigc++32-2.0RDC.lib"
+				OutputFile="$(OutDir)\$(DllPrefix)$(ProjectName)32RDC.dll"
+				AdditionalLibraryDirectories="F:\pthread-win32\Pre-built.2\lib"
+				IgnoreDefaultLibraryNames="libboost_regex-vc80-mt-gd-1_40.lib;dsound.lib"
+				GenerateDebugInformation="true"
+				SubSystem="2"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCManifestTool"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCAppVerifierTool"
+			/>
+			<Tool
+				Name="VCWebDeploymentTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+				CommandLine="copy /Y "$(OutDir)\$(TargetName).dll" "$(Release32TestSuiteFolder)\$(TargetName).dll"&#x0D;&#x0A;copy /Y "$(OutDir)\$(TargetName).lib" "$(GenericWin32LibraryFolder)\$(TargetName).lib"&#x0D;&#x0A;"
+			/>
+		</Configuration>
+	</Configurations>
+	<References>
+	</References>
+	<Files>
+		<Filter
+			Name="Source Files"
+			Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+			>
+			<File
+				RelativePath="..\lua.cc"
+				>
+			</File>
+			<File
+				RelativePath="..\luastate.cc"
+				>
+			</File>
+		</Filter>
+		<Filter
+			Name="Header Files"
+			Filter="h;hpp;hxx;hm;inl;inc;xsd"
+			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+			>
+			<File
+				RelativePath="..\lua\lua.h"
+				>
+			</File>
+			<File
+				RelativePath="..\lua\luastate.h"
+				>
+			</File>
+			<Filter
+				Name="LuaBridge"
+				>
+				<File
+					RelativePath="..\LuaBridge\LuaBridge.h"
+					>
+				</File>
+				<Filter
+					Name="detail"
+					>
+					<File
+						RelativePath="..\LuaBridge\detail\CFunctions.h"
+						>
+					</File>
+					<File
+						RelativePath="..\LuaBridge\detail\ClassInfo.h"
+						>
+					</File>
+					<File
+						RelativePath="..\LuaBridge\detail\Constructor.h"
+						>
+					</File>
+					<File
+						RelativePath="..\LuaBridge\detail\dump.h"
+						>
+					</File>
+					<File
+						RelativePath="..\LuaBridge\detail\FuncArgs.h"
+						>
+					</File>
+					<File
+						RelativePath="..\LuaBridge\detail\FuncTraits.h"
+						>
+					</File>
+					<File
+						RelativePath="..\LuaBridge\detail\Iterator.h"
+						>
+					</File>
+					<File
+						RelativePath="..\LuaBridge\detail\LuaException.h"
+						>
+					</File>
+					<File
+						RelativePath="..\LuaBridge\detail\LuaHelpers.h"
+						>
+					</File>
+					<File
+						RelativePath="..\LuaBridge\detail\LuaRef.h"
+						>
+					</File>
+					<File
+						RelativePath="..\LuaBridge\detail\Namespace.h"
+						>
+					</File>
+					<File
+						RelativePath="..\LuaBridge\detail\Stack.h"
+						>
+					</File>
+					<File
+						RelativePath="..\LuaBridge\detail\TypeList.h"
+						>
+					</File>
+					<File
+						RelativePath="..\LuaBridge\detail\TypeTraits.h"
+						>
+					</File>
+					<File
+						RelativePath="..\LuaBridge\detail\Userdata.h"
+						>
+					</File>
+				</Filter>
+			</Filter>
+		</Filter>
+	</Files>
+	<Globals>
+	</Globals>
+</VisualStudioProject>
diff --git a/libs/lua/lua-5.3.3/README b/libs/lua/lua-5.3.3/README
new file mode 100644
index 0000000..dd74fdf
--- /dev/null
+++ b/libs/lua/lua-5.3.3/README
@@ -0,0 +1,28 @@
+This is Lua 5.3.3, released on 30 May 2016.
+
+The Lua source is imported in the repository in order to ensure that it
+is compiled with the same C++ compiler as Ardour (setjmp/longjmp, exceptions)
+and available on all platforms that Ardour is.
+
+This directory contains files from src/ directory from lua-5.3.3.
+The original source can be downloaded from https://www.lua.org/ftp/lua-5.3.3.tar.gz
+
+
+Copyright © 1994–2016 Lua.org, PUC-Rio.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/libs/lua/lua-5.3.3/lapi.c b/libs/lua/lua-5.3.3/lapi.c
new file mode 100644
index 0000000..c9455a5
--- /dev/null
+++ b/libs/lua/lua-5.3.3/lapi.c
@@ -0,0 +1,1298 @@
+/*
+** $Id: lapi.c,v 2.259 2016/02/29 14:27:14 roberto Exp $
+** Lua API
+** See Copyright Notice in lua.h
+*/
+
+#define lapi_c
+#define LUA_CORE
+
+#include "lprefix.h"
+
+
+#include <stdarg.h>
+#include <string.h>
+
+#include "lua.h"
+
+#include "lapi.h"
+#include "ldebug.h"
+#include "ldo.h"
+#include "lfunc.h"
+#include "lgc.h"
+#include "lmem.h"
+#include "lobject.h"
+#include "lstate.h"
+#include "lstring.h"
+#include "ltable.h"
+#include "ltm.h"
+#include "lundump.h"
+#include "lvm.h"
+
+
+
+const char lua_ident[] =
+  "$LuaVersion: " LUA_COPYRIGHT " $"
+  "$LuaAuthors: " LUA_AUTHORS " $";
+
+
+/* value at a non-valid index */
+#define NONVALIDVALUE		cast(TValue *, luaO_nilobject)
+
+/* corresponding test */
+#define isvalid(o)	((o) != luaO_nilobject)
+
+/* test for pseudo index */
+#define ispseudo(i)		((i) <= LUA_REGISTRYINDEX)
+
+/* test for upvalue */
+#define isupvalue(i)		((i) < LUA_REGISTRYINDEX)
+
+/* test for valid but not pseudo index */
+#define isstackindex(i, o)	(isvalid(o) && !ispseudo(i))
+
+#define api_checkvalidindex(l,o)  api_check(l, isvalid(o), "invalid index")
+
+#define api_checkstackindex(l, i, o)  \
+	api_check(l, isstackindex(i, o), "index not in the stack")
+
+
+static TValue *index2addr (lua_State *L, int idx) {
+  CallInfo *ci = L->ci;
+  if (idx > 0) {
+    TValue *o = ci->func + idx;
+    api_check(L, idx <= ci->top - (ci->func + 1), "unacceptable index");
+    if (o >= L->top) return NONVALIDVALUE;
+    else return o;
+  }
+  else if (!ispseudo(idx)) {  /* negative index */
+    api_check(L, idx != 0 && -idx <= L->top - (ci->func + 1), "invalid index");
+    return L->top + idx;
+  }
+  else if (idx == LUA_REGISTRYINDEX)
+    return &G(L)->l_registry;
+  else {  /* upvalues */
+    idx = LUA_REGISTRYINDEX - idx;
+    api_check(L, idx <= MAXUPVAL + 1, "upvalue index too large");
+    if (ttislcf(ci->func))  /* light C function? */
+      return NONVALIDVALUE;  /* it has no upvalues */
+    else {
+      CClosure *func = clCvalue(ci->func);
+      return (idx <= func->nupvalues) ? &func->upvalue[idx-1] : NONVALIDVALUE;
+    }
+  }
+}
+
+
+/*
+** to be called by 'lua_checkstack' in protected mode, to grow stack
+** capturing memory errors
+*/
+static void growstack (lua_State *L, void *ud) {
+  int size = *(int *)ud;
+  luaD_growstack(L, size);
+}
+
+
+LUA_API int lua_checkstack (lua_State *L, int n) {
+  int res;
+  CallInfo *ci = L->ci;
+  lua_lock(L);
+  api_check(L, n >= 0, "negative 'n'");
+  if (L->stack_last - L->top > n)  /* stack large enough? */
+    res = 1;  /* yes; check is OK */
+  else {  /* no; need to grow stack */
+    int inuse = cast_int(L->top - L->stack) + EXTRA_STACK;
+    if (inuse > LUAI_MAXSTACK - n)  /* can grow without overflow? */
+      res = 0;  /* no */
+    else  /* try to grow stack */
+      res = (luaD_rawrunprotected(L, &growstack, &n) == LUA_OK);
+  }
+  if (res && ci->top < L->top + n)
+    ci->top = L->top + n;  /* adjust frame top */
+  lua_unlock(L);
+  return res;
+}
+
+
+LUA_API void lua_xmove (lua_State *from, lua_State *to, int n) {
+  int i;
+  if (from == to) return;
+  lua_lock(to);
+  api_checknelems(from, n);
+  api_check(from, G(from) == G(to), "moving among independent states");
+  api_check(from, to->ci->top - to->top >= n, "stack overflow");
+  from->top -= n;
+  for (i = 0; i < n; i++) {
+    setobj2s(to, to->top, from->top + i);
+    to->top++;  /* stack already checked by previous 'api_check' */
+  }
+  lua_unlock(to);
+}
+
+
+LUA_API lua_CFunction lua_atpanic (lua_State *L, lua_CFunction panicf) {
+  lua_CFunction old;
+  lua_lock(L);
+  old = G(L)->panic;
+  G(L)->panic = panicf;
+  lua_unlock(L);
+  return old;
+}
+
+
+LUA_API const lua_Number *lua_version (lua_State *L) {
+  static const lua_Number version = LUA_VERSION_NUM;
+  if (L == NULL) return &version;
+  else return G(L)->version;
+}
+
+
+
+/*
+** basic stack manipulation
+*/
+
+
+/*
+** convert an acceptable stack index into an absolute index
+*/
+LUA_API int lua_absindex (lua_State *L, int idx) {
+  return (idx > 0 || ispseudo(idx))
+         ? idx
+         : cast_int(L->top - L->ci->func) + idx;
+}
+
+
+LUA_API int lua_gettop (lua_State *L) {
+  return cast_int(L->top - (L->ci->func + 1));
+}
+
+
+LUA_API void lua_settop (lua_State *L, int idx) {
+  StkId func = L->ci->func;
+  lua_lock(L);
+  if (idx >= 0) {
+    api_check(L, idx <= L->stack_last - (func + 1), "new top too large");
+    while (L->top < (func + 1) + idx)
+      setnilvalue(L->top++);
+    L->top = (func + 1) + idx;
+  }
+  else {
+    api_check(L, -(idx+1) <= (L->top - (func + 1)), "invalid new top");
+    L->top += idx+1;  /* 'subtract' index (index is negative) */
+  }
+  lua_unlock(L);
+}
+
+
+/*
+** Reverse the stack segment from 'from' to 'to'
+** (auxiliary to 'lua_rotate')
+*/
+static void reverse (lua_State *L, StkId from, StkId to) {
+  for (; from < to; from++, to--) {
+    TValue temp;
+    setobj(L, &temp, from);
+    setobjs2s(L, from, to);
+    setobj2s(L, to, &temp);
+  }
+}
+
+
+/*
+** Let x = AB, where A is a prefix of length 'n'. Then,
+** rotate x n == BA. But BA == (A^r . B^r)^r.
+*/
+LUA_API void lua_rotate (lua_State *L, int idx, int n) {
+  StkId p, t, m;
+  lua_lock(L);
+  t = L->top - 1;  /* end of stack segment being rotated */
+  p = index2addr(L, idx);  /* start of segment */
+  api_checkstackindex(L, idx, p);
+  api_check(L, (n >= 0 ? n : -n) <= (t - p + 1), "invalid 'n'");
+  m = (n >= 0 ? t - n : p - n - 1);  /* end of prefix */
+  reverse(L, p, m);  /* reverse the prefix with length 'n' */
+  reverse(L, m + 1, t);  /* reverse the suffix */
+  reverse(L, p, t);  /* reverse the entire segment */
+  lua_unlock(L);
+}
+
+
+LUA_API void lua_copy (lua_State *L, int fromidx, int toidx) {
+  TValue *fr, *to;
+  lua_lock(L);
+  fr = index2addr(L, fromidx);
+  to = index2addr(L, toidx);
+  api_checkvalidindex(L, to);
+  setobj(L, to, fr);
+  if (isupvalue(toidx))  /* function upvalue? */
+    luaC_barrier(L, clCvalue(L->ci->func), fr);
+  /* LUA_REGISTRYINDEX does not need gc barrier
+     (collector revisits it before finishing collection) */
+  lua_unlock(L);
+}
+
+
+LUA_API void lua_pushvalue (lua_State *L, int idx) {
+  lua_lock(L);
+  setobj2s(L, L->top, index2addr(L, idx));
+  api_incr_top(L);
+  lua_unlock(L);
+}
+
+
+
+/*
+** access functions (stack -> C)
+*/
+
+
+LUA_API int lua_type (lua_State *L, int idx) {
+  StkId o = index2addr(L, idx);
+  return (isvalid(o) ? ttnov(o) : LUA_TNONE);
+}
+
+
+LUA_API const char *lua_typename (lua_State *L, int t) {
+  UNUSED(L);
+  api_check(L, LUA_TNONE <= t && t < LUA_NUMTAGS, "invalid tag");
+  return ttypename(t);
+}
+
+
+LUA_API int lua_iscfunction (lua_State *L, int idx) {
+  StkId o = index2addr(L, idx);
+  return (ttislcf(o) || (ttisCclosure(o)));
+}
+
+
+LUA_API int lua_isinteger (lua_State *L, int idx) {
+  StkId o = index2addr(L, idx);
+  return ttisinteger(o);
+}
+
+
+LUA_API int lua_isnumber (lua_State *L, int idx) {
+  lua_Number n;
+  const TValue *o = index2addr(L, idx);
+  return tonumber(o, &n);
+}
+
+
+LUA_API int lua_isstring (lua_State *L, int idx) {
+  const TValue *o = index2addr(L, idx);
+  return (ttisstring(o) || cvt2str(o));
+}
+
+
+LUA_API int lua_isuserdata (lua_State *L, int idx) {
+  const TValue *o = index2addr(L, idx);
+  return (ttisfulluserdata(o) || ttislightuserdata(o));
+}
+
+
+LUA_API int lua_rawequal (lua_State *L, int index1, int index2) {
+  StkId o1 = index2addr(L, index1);
+  StkId o2 = index2addr(L, index2);
+  return (isvalid(o1) && isvalid(o2)) ? luaV_rawequalobj(o1, o2) : 0;
+}
+
+
+LUA_API void lua_arith (lua_State *L, int op) {
+  lua_lock(L);
+  if (op != LUA_OPUNM && op != LUA_OPBNOT)
+    api_checknelems(L, 2);  /* all other operations expect two operands */
+  else {  /* for unary operations, add fake 2nd operand */
+    api_checknelems(L, 1);
+    setobjs2s(L, L->top, L->top - 1);
+    api_incr_top(L);
+  }
+  /* first operand at top - 2, second at top - 1; result go to top - 2 */
+  luaO_arith(L, op, L->top - 2, L->top - 1, L->top - 2);
+  L->top--;  /* remove second operand */
+  lua_unlock(L);
+}
+
+
+LUA_API int lua_compare (lua_State *L, int index1, int index2, int op) {
+  StkId o1, o2;
+  int i = 0;
+  lua_lock(L);  /* may call tag method */
+  o1 = index2addr(L, index1);
+  o2 = index2addr(L, index2);
+  if (isvalid(o1) && isvalid(o2)) {
+    switch (op) {
+      case LUA_OPEQ: i = luaV_equalobj(L, o1, o2); break;
+      case LUA_OPLT: i = luaV_lessthan(L, o1, o2); break;
+      case LUA_OPLE: i = luaV_lessequal(L, o1, o2); break;
+      default: api_check(L, 0, "invalid option");
+    }
+  }
+  lua_unlock(L);
+  return i;
+}
+
+
+LUA_API size_t lua_stringtonumber (lua_State *L, const char *s) {
+  size_t sz = luaO_str2num(s, L->top);
+  if (sz != 0)
+    api_incr_top(L);
+  return sz;
+}
+
+
+LUA_API lua_Number lua_tonumberx (lua_State *L, int idx, int *pisnum) {
+  lua_Number n;
+  const TValue *o = index2addr(L, idx);
+  int isnum = tonumber(o, &n);
+  if (!isnum)
+    n = 0;  /* call to 'tonumber' may change 'n' even if it fails */
+  if (pisnum) *pisnum = isnum;
+  return n;
+}
+
+
+LUA_API lua_Integer lua_tointegerx (lua_State *L, int idx, int *pisnum) {
+  lua_Integer res;
+  const TValue *o = index2addr(L, idx);
+  int isnum = tointeger(o, &res);
+  if (!isnum)
+    res = 0;  /* call to 'tointeger' may change 'n' even if it fails */
+  if (pisnum) *pisnum = isnum;
+  return res;
+}
+
+
+LUA_API int lua_toboolean (lua_State *L, int idx) {
+  const TValue *o = index2addr(L, idx);
+  return !l_isfalse(o);
+}
+
+
+LUA_API const char *lua_tolstring (lua_State *L, int idx, size_t *len) {
+  StkId o = index2addr(L, idx);
+  if (!ttisstring(o)) {
+    if (!cvt2str(o)) {  /* not convertible? */
+      if (len != NULL) *len = 0;
+      return NULL;
+    }
+    lua_lock(L);  /* 'luaO_tostring' may create a new string */
+    luaO_tostring(L, o);
+    luaC_checkGC(L);
+    o = index2addr(L, idx);  /* previous call may reallocate the stack */
+    lua_unlock(L);
+  }
+  if (len != NULL)
+    *len = vslen(o);
+  return svalue(o);
+}
+
+
+LUA_API size_t lua_rawlen (lua_State *L, int idx) {
+  StkId o = index2addr(L, idx);
+  switch (ttype(o)) {
+    case LUA_TSHRSTR: return tsvalue(o)->shrlen;
+    case LUA_TLNGSTR: return tsvalue(o)->u.lnglen;
+    case LUA_TUSERDATA: return uvalue(o)->len;
+    case LUA_TTABLE: return luaH_getn(hvalue(o));
+    default: return 0;
+  }
+}
+
+
+LUA_API lua_CFunction lua_tocfunction (lua_State *L, int idx) {
+  StkId o = index2addr(L, idx);
+  if (ttislcf(o)) return fvalue(o);
+  else if (ttisCclosure(o))
+    return clCvalue(o)->f;
+  else return NULL;  /* not a C function */
+}
+
+
+LUA_API void *lua_touserdata (lua_State *L, int idx) {
+  StkId o = index2addr(L, idx);
+  switch (ttnov(o)) {
+    case LUA_TUSERDATA: return getudatamem(uvalue(o));
+    case LUA_TLIGHTUSERDATA: return pvalue(o);
+    default: return NULL;
+  }
+}
+
+
+LUA_API lua_State *lua_tothread (lua_State *L, int idx) {
+  StkId o = index2addr(L, idx);
+  return (!ttisthread(o)) ? NULL : thvalue(o);
+}
+
+
+LUA_API const void *lua_topointer (lua_State *L, int idx) {
+  StkId o = index2addr(L, idx);
+  switch (ttype(o)) {
+    case LUA_TTABLE: return hvalue(o);
+    case LUA_TLCL: return clLvalue(o);
+    case LUA_TCCL: return clCvalue(o);
+    case LUA_TLCF: return cast(void *, cast(size_t, fvalue(o)));
+    case LUA_TTHREAD: return thvalue(o);
+    case LUA_TUSERDATA: return getudatamem(uvalue(o));
+    case LUA_TLIGHTUSERDATA: return pvalue(o);
+    default: return NULL;
+  }
+}
+
+
+
+/*
+** push functions (C -> stack)
+*/
+
+
+LUA_API void lua_pushnil (lua_State *L) {
+  lua_lock(L);
+  setnilvalue(L->top);
+  api_incr_top(L);
+  lua_unlock(L);
+}
+
+
+LUA_API void lua_pushnumber (lua_State *L, lua_Number n) {
+  lua_lock(L);
+  setfltvalue(L->top, n);
+  api_incr_top(L);
+  lua_unlock(L);
+}
+
+
+LUA_API void lua_pushinteger (lua_State *L, lua_Integer n) {
+  lua_lock(L);
+  setivalue(L->top, n);
+  api_incr_top(L);
+  lua_unlock(L);
+}
+
+
+/*
+** Pushes on the stack a string with given length. Avoid using 's' when
+** 'len' == 0 (as 's' can be NULL in that case), due to later use of
+** 'memcmp' and 'memcpy'.
+*/
+LUA_API const char *lua_pushlstring (lua_State *L, const char *s, size_t len) {
+  TString *ts;
+  lua_lock(L);
+  ts = (len == 0) ? luaS_new(L, "") : luaS_newlstr(L, s, len);
+  setsvalue2s(L, L->top, ts);
+  api_incr_top(L);
+  luaC_checkGC(L);
+  lua_unlock(L);
+  return getstr(ts);
+}
+
+
+LUA_API const char *lua_pushstring (lua_State *L, const char *s) {
+  lua_lock(L);
+  if (s == NULL)
+    setnilvalue(L->top);
+  else {
+    TString *ts;
+    ts = luaS_new(L, s);
+    setsvalue2s(L, L->top, ts);
+    s = getstr(ts);  /* internal copy's address */
+  }
+  api_incr_top(L);
+  luaC_checkGC(L);
+  lua_unlock(L);
+  return s;
+}
+
+
+LUA_API const char *lua_pushvfstring (lua_State *L, const char *fmt,
+                                      va_list argp) {
+  const char *ret;
+  lua_lock(L);
+  ret = luaO_pushvfstring(L, fmt, argp);
+  luaC_checkGC(L);
+  lua_unlock(L);
+  return ret;
+}
+
+
+LUA_API const char *lua_pushfstring (lua_State *L, const char *fmt, ...) {
+  const char *ret;
+  va_list argp;
+  lua_lock(L);
+  va_start(argp, fmt);
+  ret = luaO_pushvfstring(L, fmt, argp);
+  va_end(argp);
+  luaC_checkGC(L);
+  lua_unlock(L);
+  return ret;
+}
+
+
+LUA_API void lua_pushcclosure (lua_State *L, lua_CFunction fn, int n) {
+  lua_lock(L);
+  if (n == 0) {
+    setfvalue(L->top, fn);
+  }
+  else {
+    CClosure *cl;
+    api_checknelems(L, n);
+    api_check(L, n <= MAXUPVAL, "upvalue index too large");
+    cl = luaF_newCclosure(L, n);
+    cl->f = fn;
+    L->top -= n;
+    while (n--) {
+      setobj2n(L, &cl->upvalue[n], L->top + n);
+      /* does not need barrier because closure is white */
+    }
+    setclCvalue(L, L->top, cl);
+  }
+  api_incr_top(L);
+  luaC_checkGC(L);
+  lua_unlock(L);
+}
+
+
+LUA_API void lua_pushboolean (lua_State *L, int b) {
+  lua_lock(L);
+  setbvalue(L->top, (b != 0));  /* ensure that true is 1 */
+  api_incr_top(L);
+  lua_unlock(L);
+}
+
+
+LUA_API void lua_pushlightuserdata (lua_State *L, void *p) {
+  lua_lock(L);
+  setpvalue(L->top, p);
+  api_incr_top(L);
+  lua_unlock(L);
+}
+
+
+LUA_API int lua_pushthread (lua_State *L) {
+  lua_lock(L);
+  setthvalue(L, L->top, L);
+  api_incr_top(L);
+  lua_unlock(L);
+  return (G(L)->mainthread == L);
+}
+
+
+
+/*
+** get functions (Lua -> stack)
+*/
+
+
+static int auxgetstr (lua_State *L, const TValue *t, const char *k) {
+  const TValue *slot;
+  TString *str = luaS_new(L, k);
+  if (luaV_fastget(L, t, str, slot, luaH_getstr)) {
+    setobj2s(L, L->top, slot);
+    api_incr_top(L);
+  }
+  else {
+    setsvalue2s(L, L->top, str);
+    api_incr_top(L);
+    luaV_finishget(L, t, L->top - 1, L->top - 1, slot);
+  }
+  lua_unlock(L);
+  return ttnov(L->top - 1);
+}
+
+
+LUA_API int lua_getglobal (lua_State *L, const char *name) {
+  Table *reg = hvalue(&G(L)->l_registry);
+  lua_lock(L);
+  return auxgetstr(L, luaH_getint(reg, LUA_RIDX_GLOBALS), name);
+}
+
+
+LUA_API int lua_gettable (lua_State *L, int idx) {
+  StkId t;
+  lua_lock(L);
+  t = index2addr(L, idx);
+  luaV_gettable(L, t, L->top - 1, L->top - 1);
+  lua_unlock(L);
+  return ttnov(L->top - 1);
+}
+
+
+LUA_API int lua_getfield (lua_State *L, int idx, const char *k) {
+  lua_lock(L);
+  return auxgetstr(L, index2addr(L, idx), k);
+}
+
+
+LUA_API int lua_geti (lua_State *L, int idx, lua_Integer n) {
+  StkId t;
+  const TValue *slot;
+  lua_lock(L);
+  t = index2addr(L, idx);
+  if (luaV_fastget(L, t, n, slot, luaH_getint)) {
+    setobj2s(L, L->top, slot);
+    api_incr_top(L);
+  }
+  else {
+    setivalue(L->top, n);
+    api_incr_top(L);
+    luaV_finishget(L, t, L->top - 1, L->top - 1, slot);
+  }
+  lua_unlock(L);
+  return ttnov(L->top - 1);
+}
+
+
+LUA_API int lua_rawget (lua_State *L, int idx) {
+  StkId t;
+  lua_lock(L);
+  t = index2addr(L, idx);
+  api_check(L, ttistable(t), "table expected");
+  setobj2s(L, L->top - 1, luaH_get(hvalue(t), L->top - 1));
+  lua_unlock(L);
+  return ttnov(L->top - 1);
+}
+
+
+LUA_API int lua_rawgeti (lua_State *L, int idx, lua_Integer n) {
+  StkId t;
+  lua_lock(L);
+  t = index2addr(L, idx);
+  api_check(L, ttistable(t), "table expected");
+  setobj2s(L, L->top, luaH_getint(hvalue(t), n));
+  api_incr_top(L);
+  lua_unlock(L);
+  return ttnov(L->top - 1);
+}
+
+
+LUA_API int lua_rawgetp (lua_State *L, int idx, const void *p) {
+  StkId t;
+  TValue k;
+  lua_lock(L);
+  t = index2addr(L, idx);
+  api_check(L, ttistable(t), "table expected");
+  setpvalue(&k, cast(void *, p));
+  setobj2s(L, L->top, luaH_get(hvalue(t), &k));
+  api_incr_top(L);
+  lua_unlock(L);
+  return ttnov(L->top - 1);
+}
+
+
+LUA_API void lua_createtable (lua_State *L, int narray, int nrec) {
+  Table *t;
+  lua_lock(L);
+  t = luaH_new(L);
+  sethvalue(L, L->top, t);
+  api_incr_top(L);
+  if (narray > 0 || nrec > 0)
+    luaH_resize(L, t, narray, nrec);
+  luaC_checkGC(L);
+  lua_unlock(L);
+}
+
+
+LUA_API int lua_getmetatable (lua_State *L, int objindex) {
+  const TValue *obj;
+  Table *mt;
+  int res = 0;
+  lua_lock(L);
+  obj = index2addr(L, objindex);
+  switch (ttnov(obj)) {
+    case LUA_TTABLE:
+      mt = hvalue(obj)->metatable;
+      break;
+    case LUA_TUSERDATA:
+      mt = uvalue(obj)->metatable;
+      break;
+    default:
+      mt = G(L)->mt[ttnov(obj)];
+      break;
+  }
+  if (mt != NULL) {
+    sethvalue(L, L->top, mt);
+    api_incr_top(L);
+    res = 1;
+  }
+  lua_unlock(L);
+  return res;
+}
+
+
+LUA_API int lua_getuservalue (lua_State *L, int idx) {
+  StkId o;
+  lua_lock(L);
+  o = index2addr(L, idx);
+  api_check(L, ttisfulluserdata(o), "full userdata expected");
+  getuservalue(L, uvalue(o), L->top);
+  api_incr_top(L);
+  lua_unlock(L);
+  return ttnov(L->top - 1);
+}
+
+
+/*
+** set functions (stack -> Lua)
+*/
+
+/*
+** t[k] = value at the top of the stack (where 'k' is a string)
+*/
+static void auxsetstr (lua_State *L, const TValue *t, const char *k) {
+  const TValue *slot;
+  TString *str = luaS_new(L, k);
+  api_checknelems(L, 1);
+  if (luaV_fastset(L, t, str, slot, luaH_getstr, L->top - 1))
+    L->top--;  /* pop value */
+  else {
+    setsvalue2s(L, L->top, str);  /* push 'str' (to make it a TValue) */
+    api_incr_top(L);
+    luaV_finishset(L, t, L->top - 1, L->top - 2, slot);
+    L->top -= 2;  /* pop value and key */
+  }
+  lua_unlock(L);  /* lock done by caller */
+}
+
+
+LUA_API void lua_setglobal (lua_State *L, const char *name) {
+  Table *reg = hvalue(&G(L)->l_registry);
+  lua_lock(L);  /* unlock done in 'auxsetstr' */
+  auxsetstr(L, luaH_getint(reg, LUA_RIDX_GLOBALS), name);
+}
+
+
+LUA_API void lua_settable (lua_State *L, int idx) {
+  StkId t;
+  lua_lock(L);
+  api_checknelems(L, 2);
+  t = index2addr(L, idx);
+  luaV_settable(L, t, L->top - 2, L->top - 1);
+  L->top -= 2;  /* pop index and value */
+  lua_unlock(L);
+}
+
+
+LUA_API void lua_setfield (lua_State *L, int idx, const char *k) {
+  lua_lock(L);  /* unlock done in 'auxsetstr' */
+  auxsetstr(L, index2addr(L, idx), k);
+}
+
+
+LUA_API void lua_seti (lua_State *L, int idx, lua_Integer n) {
+  StkId t;
+  const TValue *slot;
+  lua_lock(L);
+  api_checknelems(L, 1);
+  t = index2addr(L, idx);
+  if (luaV_fastset(L, t, n, slot, luaH_getint, L->top - 1))
+    L->top--;  /* pop value */
+  else {
+    setivalue(L->top, n);
+    api_incr_top(L);
+    luaV_finishset(L, t, L->top - 1, L->top - 2, slot);
+    L->top -= 2;  /* pop value and key */
+  }
+  lua_unlock(L);
+}
+
+
+LUA_API void lua_rawset (lua_State *L, int idx) {
+  StkId o;
+  TValue *slot;
+  lua_lock(L);
+  api_checknelems(L, 2);
+  o = index2addr(L, idx);
+  api_check(L, ttistable(o), "table expected");
+  slot = luaH_set(L, hvalue(o), L->top - 2);
+  setobj2t(L, slot, L->top - 1);
+  invalidateTMcache(hvalue(o));
+  luaC_barrierback(L, hvalue(o), L->top-1);
+  L->top -= 2;
+  lua_unlock(L);
+}
+
+
+LUA_API void lua_rawseti (lua_State *L, int idx, lua_Integer n) {
+  StkId o;
+  lua_lock(L);
+  api_checknelems(L, 1);
+  o = index2addr(L, idx);
+  api_check(L, ttistable(o), "table expected");
+  luaH_setint(L, hvalue(o), n, L->top - 1);
+  luaC_barrierback(L, hvalue(o), L->top-1);
+  L->top--;
+  lua_unlock(L);
+}
+
+
+LUA_API void lua_rawsetp (lua_State *L, int idx, const void *p) {
+  StkId o;
+  TValue k, *slot;
+  lua_lock(L);
+  api_checknelems(L, 1);
+  o = index2addr(L, idx);
+  api_check(L, ttistable(o), "table expected");
+  setpvalue(&k, cast(void *, p));
+  slot = luaH_set(L, hvalue(o), &k);
+  setobj2t(L, slot, L->top - 1);
+  luaC_barrierback(L, hvalue(o), L->top - 1);
+  L->top--;
+  lua_unlock(L);
+}
+
+
+LUA_API int lua_setmetatable (lua_State *L, int objindex) {
+  TValue *obj;
+  Table *mt;
+  lua_lock(L);
+  api_checknelems(L, 1);
+  obj = index2addr(L, objindex);
+  if (ttisnil(L->top - 1))
+    mt = NULL;
+  else {
+    api_check(L, ttistable(L->top - 1), "table expected");
+    mt = hvalue(L->top - 1);
+  }
+  switch (ttnov(obj)) {
+    case LUA_TTABLE: {
+      hvalue(obj)->metatable = mt;
+      if (mt) {
+        luaC_objbarrier(L, gcvalue(obj), mt);
+        luaC_checkfinalizer(L, gcvalue(obj), mt);
+      }
+      break;
+    }
+    case LUA_TUSERDATA: {
+      uvalue(obj)->metatable = mt;
+      if (mt) {
+        luaC_objbarrier(L, uvalue(obj), mt);
+        luaC_checkfinalizer(L, gcvalue(obj), mt);
+      }
+      break;
+    }
+    default: {
+      G(L)->mt[ttnov(obj)] = mt;
+      break;
+    }
+  }
+  L->top--;
+  lua_unlock(L);
+  return 1;
+}
+
+
+LUA_API void lua_setuservalue (lua_State *L, int idx) {
+  StkId o;
+  lua_lock(L);
+  api_checknelems(L, 1);
+  o = index2addr(L, idx);
+  api_check(L, ttisfulluserdata(o), "full userdata expected");
+  setuservalue(L, uvalue(o), L->top - 1);
+  luaC_barrier(L, gcvalue(o), L->top - 1);
+  L->top--;
+  lua_unlock(L);
+}
+
+
+/*
+** 'load' and 'call' functions (run Lua code)
+*/
+
+
+#define checkresults(L,na,nr) \
+     api_check(L, (nr) == LUA_MULTRET || (L->ci->top - L->top >= (nr) - (na)), \
+	"results from function overflow current stack size")
+
+
+LUA_API void lua_callk (lua_State *L, int nargs, int nresults,
+                        lua_KContext ctx, lua_KFunction k) {
+  StkId func;
+  lua_lock(L);
+  api_check(L, k == NULL || !isLua(L->ci),
+    "cannot use continuations inside hooks");
+  api_checknelems(L, nargs+1);
+  api_check(L, L->status == LUA_OK, "cannot do calls on non-normal thread");
+  checkresults(L, nargs, nresults);
+  func = L->top - (nargs+1);
+  if (k != NULL && L->nny == 0) {  /* need to prepare continuation? */
+    L->ci->u.c.k = k;  /* save continuation */
+    L->ci->u.c.ctx = ctx;  /* save context */
+    luaD_call(L, func, nresults);  /* do the call */
+  }
+  else  /* no continuation or no yieldable */
+    luaD_callnoyield(L, func, nresults);  /* just do the call */
+  adjustresults(L, nresults);
+  lua_unlock(L);
+}
+
+
+
+/*
+** Execute a protected call.
+*/
+struct CallS {  /* data to 'f_call' */
+  StkId func;
+  int nresults;
+};
+
+
+static void f_call (lua_State *L, void *ud) {
+  struct CallS *c = cast(struct CallS *, ud);
+  luaD_callnoyield(L, c->func, c->nresults);
+}
+
+
+
+LUA_API int lua_pcallk (lua_State *L, int nargs, int nresults, int errfunc,
+                        lua_KContext ctx, lua_KFunction k) {
+  struct CallS c;
+  int status;
+  ptrdiff_t func;
+  lua_lock(L);
+  api_check(L, k == NULL || !isLua(L->ci),
+    "cannot use continuations inside hooks");
+  api_checknelems(L, nargs+1);
+  api_check(L, L->status == LUA_OK, "cannot do calls on non-normal thread");
+  checkresults(L, nargs, nresults);
+  if (errfunc == 0)
+    func = 0;
+  else {
+    StkId o = index2addr(L, errfunc);
+    api_checkstackindex(L, errfunc, o);
+    func = savestack(L, o);
+  }
+  c.func = L->top - (nargs+1);  /* function to be called */
+  if (k == NULL || L->nny > 0) {  /* no continuation or no yieldable? */
+    c.nresults = nresults;  /* do a 'conventional' protected call */
+    status = luaD_pcall(L, f_call, &c, savestack(L, c.func), func);
+  }
+  else {  /* prepare continuation (call is already protected by 'resume') */
+    CallInfo *ci = L->ci;
+    ci->u.c.k = k;  /* save continuation */
+    ci->u.c.ctx = ctx;  /* save context */
+    /* save information for error recovery */
+    ci->extra = savestack(L, c.func);
+    ci->u.c.old_errfunc = L->errfunc;
+    L->errfunc = func;
+    setoah(ci->callstatus, L->allowhook);  /* save value of 'allowhook' */
+    ci->callstatus |= CIST_YPCALL;  /* function can do error recovery */
+    luaD_call(L, c.func, nresults);  /* do the call */
+    ci->callstatus &= ~CIST_YPCALL;
+    L->errfunc = ci->u.c.old_errfunc;
+    status = LUA_OK;  /* if it is here, there were no errors */
+  }
+  adjustresults(L, nresults);
+  lua_unlock(L);
+  return status;
+}
+
+
+LUA_API int lua_load (lua_State *L, lua_Reader reader, void *data,
+                      const char *chunkname, const char *mode) {
+  ZIO z;
+  int status;
+  lua_lock(L);
+  if (!chunkname) chunkname = "?";
+  luaZ_init(L, &z, reader, data);
+  status = luaD_protectedparser(L, &z, chunkname, mode);
+  if (status == LUA_OK) {  /* no errors? */
+    LClosure *f = clLvalue(L->top - 1);  /* get newly created function */
+    if (f->nupvalues >= 1) {  /* does it have an upvalue? */
+      /* get global table from registry */
+      Table *reg = hvalue(&G(L)->l_registry);
+      const TValue *gt = luaH_getint(reg, LUA_RIDX_GLOBALS);
+      /* set global table as 1st upvalue of 'f' (may be LUA_ENV) */
+      setobj(L, f->upvals[0]->v, gt);
+      luaC_upvalbarrier(L, f->upvals[0]);
+    }
+  }
+  lua_unlock(L);
+  return status;
+}
+
+
+LUA_API int lua_dump (lua_State *L, lua_Writer writer, void *data, int strip) {
+  int status;
+  TValue *o;
+  lua_lock(L);
+  api_checknelems(L, 1);
+  o = L->top - 1;
+  if (isLfunction(o))
+    status = luaU_dump(L, getproto(o), writer, data, strip);
+  else
+    status = 1;
+  lua_unlock(L);
+  return status;
+}
+
+
+LUA_API int lua_status (lua_State *L) {
+  return L->status;
+}
+
+
+/*
+** Garbage-collection function
+*/
+
+LUA_API int lua_gc (lua_State *L, int what, int data) {
+  int res = 0;
+  global_State *g;
+  lua_lock(L);
+  g = G(L);
+  switch (what) {
+    case LUA_GCSTOP: {
+      g->gcrunning = 0;
+      break;
+    }
+    case LUA_GCRESTART: {
+      luaE_setdebt(g, 0);
+      g->gcrunning = 1;
+      break;
+    }
+    case LUA_GCCOLLECT: {
+      luaC_fullgc(L, 0);
+      break;
+    }
+    case LUA_GCCOUNT: {
+      /* GC values are expressed in Kbytes: #bytes/2^10 */
+      res = cast_int(gettotalbytes(g) >> 10);
+      break;
+    }
+    case LUA_GCCOUNTB: {
+      res = cast_int(gettotalbytes(g) & 0x3ff);
+      break;
+    }
+    case LUA_GCSTEP: {
+      l_mem debt = 1;  /* =1 to signal that it did an actual step */
+      lu_byte oldrunning = g->gcrunning;
+      g->gcrunning = 1;  /* allow GC to run */
+      if (data == 0) {
+        luaE_setdebt(g, -GCSTEPSIZE);  /* to do a "small" step */
+        luaC_step(L);
+      }
+      else {  /* add 'data' to total debt */
+        debt = cast(l_mem, data) * 1024 + g->GCdebt;
+        luaE_setdebt(g, debt);
+        luaC_checkGC(L);
+      }
+      g->gcrunning = oldrunning;  /* restore previous state */
+      if (debt > 0 && g->gcstate == GCSpause)  /* end of cycle? */
+        res = 1;  /* signal it */
+      break;
+    }
+    case LUA_GCSETPAUSE: {
+      res = g->gcpause;
+      g->gcpause = data;
+      break;
+    }
+    case LUA_GCSETSTEPMUL: {
+      res = g->gcstepmul;
+      if (data < 40) data = 40;  /* avoid ridiculous low values (and 0) */
+      g->gcstepmul = data;
+      break;
+    }
+    case LUA_GCISRUNNING: {
+      res = g->gcrunning;
+      break;
+    }
+    default: res = -1;  /* invalid option */
+  }
+  lua_unlock(L);
+  return res;
+}
+
+
+
+/*
+** miscellaneous functions
+*/
+
+
+LUA_API int lua_error (lua_State *L) {
+  lua_lock(L);
+  api_checknelems(L, 1);
+  luaG_errormsg(L);
+  /* code unreachable; will unlock when control actually leaves the kernel */
+  return 0;  /* to avoid warnings */
+}
+
+
+LUA_API int lua_next (lua_State *L, int idx) {
+  StkId t;
+  int more;
+  lua_lock(L);
+  t = index2addr(L, idx);
+  api_check(L, ttistable(t), "table expected");
+  more = luaH_next(L, hvalue(t), L->top - 1);
+  if (more) {
+    api_incr_top(L);
+  }
+  else  /* no more elements */
+    L->top -= 1;  /* remove key */
+  lua_unlock(L);
+  return more;
+}
+
+
+LUA_API void lua_concat (lua_State *L, int n) {
+  lua_lock(L);
+  api_checknelems(L, n);
+  if (n >= 2) {
+    luaV_concat(L, n);
+  }
+  else if (n == 0) {  /* push empty string */
+    setsvalue2s(L, L->top, luaS_newlstr(L, "", 0));
+    api_incr_top(L);
+  }
+  /* else n == 1; nothing to do */
+  luaC_checkGC(L);
+  lua_unlock(L);
+}
+
+
+LUA_API void lua_len (lua_State *L, int idx) {
+  StkId t;
+  lua_lock(L);
+  t = index2addr(L, idx);
+  luaV_objlen(L, L->top, t);
+  api_incr_top(L);
+  lua_unlock(L);
+}
+
+
+LUA_API lua_Alloc lua_getallocf (lua_State *L, void **ud) {
+  lua_Alloc f;
+  lua_lock(L);
+  if (ud) *ud = G(L)->ud;
+  f = G(L)->frealloc;
+  lua_unlock(L);
+  return f;
+}
+
+
+LUA_API void lua_setallocf (lua_State *L, lua_Alloc f, void *ud) {
+  lua_lock(L);
+  G(L)->ud = ud;
+  G(L)->frealloc = f;
+  lua_unlock(L);
+}
+
+
+LUA_API void *lua_newuserdata (lua_State *L, size_t size) {
+  Udata *u;
+  lua_lock(L);
+  u = luaS_newudata(L, size);
+  setuvalue(L, L->top, u);
+  api_incr_top(L);
+  luaC_checkGC(L);
+  lua_unlock(L);
+  return getudatamem(u);
+}
+
+
+
+static const char *aux_upvalue (StkId fi, int n, TValue **val,
+                                CClosure **owner, UpVal **uv) {
+  switch (ttype(fi)) {
+    case LUA_TCCL: {  /* C closure */
+      CClosure *f = clCvalue(fi);
+      if (!(1 <= n && n <= f->nupvalues)) return NULL;
+      *val = &f->upvalue[n-1];
+      if (owner) *owner = f;
+      return "";
+    }
+    case LUA_TLCL: {  /* Lua closure */
+      LClosure *f = clLvalue(fi);
+      TString *name;
+      Proto *p = f->p;
+      if (!(1 <= n && n <= p->sizeupvalues)) return NULL;
+      *val = f->upvals[n-1]->v;
+      if (uv) *uv = f->upvals[n - 1];
+      name = p->upvalues[n-1].name;
+      return (name == NULL) ? "(*no name)" : getstr(name);
+    }
+    default: return NULL;  /* not a closure */
+  }
+}
+
+
+LUA_API const char *lua_getupvalue (lua_State *L, int funcindex, int n) {
+  const char *name;
+  TValue *val = NULL;  /* to avoid warnings */
+  lua_lock(L);
+  name = aux_upvalue(index2addr(L, funcindex), n, &val, NULL, NULL);
+  if (name) {
+    setobj2s(L, L->top, val);
+    api_incr_top(L);
+  }
+  lua_unlock(L);
+  return name;
+}
+
+
+LUA_API const char *lua_setupvalue (lua_State *L, int funcindex, int n) {
+  const char *name;
+  TValue *val = NULL;  /* to avoid warnings */
+  CClosure *owner = NULL;
+  UpVal *uv = NULL;
+  StkId fi;
+  lua_lock(L);
+  fi = index2addr(L, funcindex);
+  api_checknelems(L, 1);
+  name = aux_upvalue(fi, n, &val, &owner, &uv);
+  if (name) {
+    L->top--;
+    setobj(L, val, L->top);
+    if (owner) { luaC_barrier(L, owner, L->top); }
+    else if (uv) { luaC_upvalbarrier(L, uv); }
+  }
+  lua_unlock(L);
+  return name;
+}
+
+
+static UpVal **getupvalref (lua_State *L, int fidx, int n, LClosure **pf) {
+  LClosure *f;
+  StkId fi = index2addr(L, fidx);
+  api_check(L, ttisLclosure(fi), "Lua function expected");
+  f = clLvalue(fi);
+  api_check(L, (1 <= n && n <= f->p->sizeupvalues), "invalid upvalue index");
+  if (pf) *pf = f;
+  return &f->upvals[n - 1];  /* get its upvalue pointer */
+}
+
+
+LUA_API void *lua_upvalueid (lua_State *L, int fidx, int n) {
+  StkId fi = index2addr(L, fidx);
+  switch (ttype(fi)) {
+    case LUA_TLCL: {  /* lua closure */
+      return *getupvalref(L, fidx, n, NULL);
+    }
+    case LUA_TCCL: {  /* C closure */
+      CClosure *f = clCvalue(fi);
+      api_check(L, 1 <= n && n <= f->nupvalues, "invalid upvalue index");
+      return &f->upvalue[n - 1];
+    }
+    default: {
+      api_check(L, 0, "closure expected");
+      return NULL;
+    }
+  }
+}
+
+
+LUA_API void lua_upvaluejoin (lua_State *L, int fidx1, int n1,
+                                            int fidx2, int n2) {
+  LClosure *f1;
+  UpVal **up1 = getupvalref(L, fidx1, n1, &f1);
+  UpVal **up2 = getupvalref(L, fidx2, n2, NULL);
+  luaC_upvdeccount(L, *up1);
+  *up1 = *up2;
+  (*up1)->refcount++;
+  if (upisopen(*up1)) (*up1)->u.open.touched = 1;
+  luaC_upvalbarrier(L, *up1);
+}
+
+
diff --git a/libs/lua/lua-5.3.3/lapi.h b/libs/lua/lua-5.3.3/lapi.h
new file mode 100644
index 0000000..6d36dee
--- /dev/null
+++ b/libs/lua/lua-5.3.3/lapi.h
@@ -0,0 +1,24 @@
+/*
+** $Id: lapi.h,v 2.9 2015/03/06 19:49:50 roberto Exp $
+** Auxiliary functions from Lua API
+** See Copyright Notice in lua.h
+*/
+
+#ifndef lapi_h
+#define lapi_h
+
+
+#include "llimits.h"
+#include "lstate.h"
+
+#define api_incr_top(L)   {L->top++; api_check(L, L->top <= L->ci->top, \
+				"stack overflow");}
+
+#define adjustresults(L,nres) \
+    { if ((nres) == LUA_MULTRET && L->ci->top < L->top) L->ci->top = L->top; }
+
+#define api_checknelems(L,n)	api_check(L, (n) < (L->top - L->ci->func), \
+				  "not enough elements in the stack")
+
+
+#endif
diff --git a/libs/lua/lua-5.3.3/lauxlib.c b/libs/lua/lua-5.3.3/lauxlib.c
new file mode 100644
index 0000000..bacf43b
--- /dev/null
+++ b/libs/lua/lua-5.3.3/lauxlib.c
@@ -0,0 +1,1035 @@
+/*
+** $Id: lauxlib.c,v 1.286 2016/01/08 15:33:09 roberto Exp $
+** Auxiliary functions for building Lua libraries
+** See Copyright Notice in lua.h
+*/
+
+#define lauxlib_c
+#define LUA_LIB
+
+#include "lprefix.h"
+
+
+#include <errno.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+
+/*
+** This file uses only the official API of Lua.
+** Any function declared here could be written as an application function.
+*/
+
+#include "lua.h"
+
+#include "lauxlib.h"
+
+
+/*
+** {======================================================
+** Traceback
+** =======================================================
+*/
+
+
+#define LEVELS1	10	/* size of the first part of the stack */
+#define LEVELS2	11	/* size of the second part of the stack */
+
+
+
+/*
+** search for 'objidx' in table at index -1.
+** return 1 + string at top if find a good name.
+*/
+static int findfield (lua_State *L, int objidx, int level) {
+  if (level == 0 || !lua_istable(L, -1))
+    return 0;  /* not found */
+  lua_pushnil(L);  /* start 'next' loop */
+  while (lua_next(L, -2)) {  /* for each pair in table */
+    if (lua_type(L, -2) == LUA_TSTRING) {  /* ignore non-string keys */
+      if (lua_rawequal(L, objidx, -1)) {  /* found object? */
+        lua_pop(L, 1);  /* remove value (but keep name) */
+        return 1;
+      }
+      else if (findfield(L, objidx, level - 1)) {  /* try recursively */
+        lua_remove(L, -2);  /* remove table (but keep name) */
+        lua_pushliteral(L, ".");
+        lua_insert(L, -2);  /* place '.' between the two names */
+        lua_concat(L, 3);
+        return 1;
+      }
+    }
+    lua_pop(L, 1);  /* remove value */
+  }
+  return 0;  /* not found */
+}
+
+
+/*
+** Search for a name for a function in all loaded modules
+** (registry._LOADED).
+*/
+static int pushglobalfuncname (lua_State *L, lua_Debug *ar) {
+  int top = lua_gettop(L);
+  lua_getinfo(L, "f", ar);  /* push function */
+  lua_getfield(L, LUA_REGISTRYINDEX, "_LOADED");
+  if (findfield(L, top + 1, 2)) {
+    const char *name = lua_tostring(L, -1);
+    if (strncmp(name, "_G.", 3) == 0) {  /* name start with '_G.'? */
+      lua_pushstring(L, name + 3);  /* push name without prefix */
+      lua_remove(L, -2);  /* remove original name */
+    }
+    lua_copy(L, -1, top + 1);  /* move name to proper place */
+    lua_pop(L, 2);  /* remove pushed values */
+    return 1;
+  }
+  else {
+    lua_settop(L, top);  /* remove function and global table */
+    return 0;
+  }
+}
+
+
+static void pushfuncname (lua_State *L, lua_Debug *ar) {
+  if (pushglobalfuncname(L, ar)) {  /* try first a global name */
+    lua_pushfstring(L, "function '%s'", lua_tostring(L, -1));
+    lua_remove(L, -2);  /* remove name */
+  }
+  else if (*ar->namewhat != '\0')  /* is there a name from code? */
+    lua_pushfstring(L, "%s '%s'", ar->namewhat, ar->name);  /* use it */
+  else if (*ar->what == 'm')  /* main? */
+      lua_pushliteral(L, "main chunk");
+  else if (*ar->what != 'C')  /* for Lua functions, use <file:line> */
+    lua_pushfstring(L, "function <%s:%d>", ar->short_src, ar->linedefined);
+  else  /* nothing left... */
+    lua_pushliteral(L, "?");
+}
+
+
+static int lastlevel (lua_State *L) {
+  lua_Debug ar;
+  int li = 1, le = 1;
+  /* find an upper bound */
+  while (lua_getstack(L, le, &ar)) { li = le; le *= 2; }
+  /* do a binary search */
+  while (li < le) {
+    int m = (li + le)/2;
+    if (lua_getstack(L, m, &ar)) li = m + 1;
+    else le = m;
+  }
+  return le - 1;
+}
+
+
+LUALIB_API void luaL_traceback (lua_State *L, lua_State *L1,
+                                const char *msg, int level) {
+  lua_Debug ar;
+  int top = lua_gettop(L);
+  int last = lastlevel(L1);
+  int n1 = (last - level > LEVELS1 + LEVELS2) ? LEVELS1 : -1;
+  if (msg)
+    lua_pushfstring(L, "%s\n", msg);
+  luaL_checkstack(L, 10, NULL);
+  lua_pushliteral(L, "stack traceback:");
+  while (lua_getstack(L1, level++, &ar)) {
+    if (n1-- == 0) {  /* too many levels? */
+      lua_pushliteral(L, "\n\t...");  /* add a '...' */
+      level = last - LEVELS2 + 1;  /* and skip to last ones */
+    }
+    else {
+      lua_getinfo(L1, "Slnt", &ar);
+      lua_pushfstring(L, "\n\t%s:", ar.short_src);
+      if (ar.currentline > 0)
+        lua_pushfstring(L, "%d:", ar.currentline);
+      lua_pushliteral(L, " in ");
+      pushfuncname(L, &ar);
+      if (ar.istailcall)
+        lua_pushliteral(L, "\n\t(...tail calls...)");
+      lua_concat(L, lua_gettop(L) - top);
+    }
+  }
+  lua_concat(L, lua_gettop(L) - top);
+}
+
+/* }====================================================== */
+
+
+/*
+** {======================================================
+** Error-report functions
+** =======================================================
+*/
+
+LUALIB_API int luaL_argerror (lua_State *L, int arg, const char *extramsg) {
+  lua_Debug ar;
+  if (!lua_getstack(L, 0, &ar))  /* no stack frame? */
+    return luaL_error(L, "bad argument #%d (%s)", arg, extramsg);
+  lua_getinfo(L, "n", &ar);
+  if (strcmp(ar.namewhat, "method") == 0) {
+    arg--;  /* do not count 'self' */
+    if (arg == 0)  /* error is in the self argument itself? */
+      return luaL_error(L, "calling '%s' on bad self (%s)",
+                           ar.name, extramsg);
+  }
+  if (ar.name == NULL)
+    ar.name = (pushglobalfuncname(L, &ar)) ? lua_tostring(L, -1) : "?";
+  return luaL_error(L, "bad argument #%d to '%s' (%s)",
+                        arg, ar.name, extramsg);
+}
+
+
+static int typeerror (lua_State *L, int arg, const char *tname) {
+  const char *msg;
+  const char *typearg;  /* name for the type of the actual argument */
+  if (luaL_getmetafield(L, arg, "__name") == LUA_TSTRING)
+    typearg = lua_tostring(L, -1);  /* use the given type name */
+  else if (lua_type(L, arg) == LUA_TLIGHTUSERDATA)
+    typearg = "light userdata";  /* special name for messages */
+  else
+    typearg = luaL_typename(L, arg);  /* standard name */
+  msg = lua_pushfstring(L, "%s expected, got %s", tname, typearg);
+  return luaL_argerror(L, arg, msg);
+}
+
+
+static void tag_error (lua_State *L, int arg, int tag) {
+  typeerror(L, arg, lua_typename(L, tag));
+}
+
+
+/*
+** The use of 'lua_pushfstring' ensures this function does not
+** need reserved stack space when called.
+*/
+LUALIB_API void luaL_where (lua_State *L, int level) {
+  lua_Debug ar;
+  if (lua_getstack(L, level, &ar)) {  /* check function at level */
+    lua_getinfo(L, "Sl", &ar);  /* get info about it */
+    if (ar.currentline > 0) {  /* is there info? */
+      lua_pushfstring(L, "%s:%d: ", ar.short_src, ar.currentline);
+      return;
+    }
+  }
+  lua_pushfstring(L, "");  /* else, no information available... */
+}
+
+
+/*
+** Again, the use of 'lua_pushvfstring' ensures this function does
+** not need reserved stack space when called. (At worst, it generates
+** an error with "stack overflow" instead of the given message.)
+*/
+LUALIB_API int luaL_error (lua_State *L, const char *fmt, ...) {
+  va_list argp;
+  va_start(argp, fmt);
+  luaL_where(L, 1);
+  lua_pushvfstring(L, fmt, argp);
+  va_end(argp);
+  lua_concat(L, 2);
+  return lua_error(L);
+}
+
+
+LUALIB_API int luaL_fileresult (lua_State *L, int stat, const char *fname) {
+  int en = errno;  /* calls to Lua API may change this value */
+  if (stat) {
+    lua_pushboolean(L, 1);
+    return 1;
+  }
+  else {
+    lua_pushnil(L);
+    if (fname)
+      lua_pushfstring(L, "%s: %s", fname, strerror(en));
+    else
+      lua_pushstring(L, strerror(en));
+    lua_pushinteger(L, en);
+    return 3;
+  }
+}
+
+
+#if !defined(l_inspectstat)	/* { */
+
+#if defined(LUA_USE_POSIX)
+
+#include <sys/wait.h>
+
+/*
+** use appropriate macros to interpret 'pclose' return status
+*/
+#define l_inspectstat(stat,what)  \
+   if (WIFEXITED(stat)) { stat = WEXITSTATUS(stat); } \
+   else if (WIFSIGNALED(stat)) { stat = WTERMSIG(stat); what = "signal"; }
+
+#else
+
+#define l_inspectstat(stat,what)  /* no op */
+
+#endif
+
+#endif				/* } */
+
+
+LUALIB_API int luaL_execresult (lua_State *L, int stat) {
+  const char *what = "exit";  /* type of termination */
+  if (stat == -1)  /* error? */
+    return luaL_fileresult(L, 0, NULL);
+  else {
+    l_inspectstat(stat, what);  /* interpret result */
+    if (*what == 'e' && stat == 0)  /* successful termination? */
+      lua_pushboolean(L, 1);
+    else
+      lua_pushnil(L);
+    lua_pushstring(L, what);
+    lua_pushinteger(L, stat);
+    return 3;  /* return true/nil,what,code */
+  }
+}
+
+/* }====================================================== */
+
+
+/*
+** {======================================================
+** Userdata's metatable manipulation
+** =======================================================
+*/
+
+LUALIB_API int luaL_newmetatable (lua_State *L, const char *tname) {
+  if (luaL_getmetatable(L, tname) != LUA_TNIL)  /* name already in use? */
+    return 0;  /* leave previous value on top, but return 0 */
+  lua_pop(L, 1);
+  lua_createtable(L, 0, 2);  /* create metatable */
+  lua_pushstring(L, tname);
+  lua_setfield(L, -2, "__name");  /* metatable.__name = tname */
+  lua_pushvalue(L, -1);
+  lua_setfield(L, LUA_REGISTRYINDEX, tname);  /* registry.name = metatable */
+  return 1;
+}
+
+
+LUALIB_API void luaL_setmetatable (lua_State *L, const char *tname) {
+  luaL_getmetatable(L, tname);
+  lua_setmetatable(L, -2);
+}
+
+
+LUALIB_API void *luaL_testudata (lua_State *L, int ud, const char *tname) {
+  void *p = lua_touserdata(L, ud);
+  if (p != NULL) {  /* value is a userdata? */
+    if (lua_getmetatable(L, ud)) {  /* does it have a metatable? */
+      luaL_getmetatable(L, tname);  /* get correct metatable */
+      if (!lua_rawequal(L, -1, -2))  /* not the same? */
+        p = NULL;  /* value is a userdata with wrong metatable */
+      lua_pop(L, 2);  /* remove both metatables */
+      return p;
+    }
+  }
+  return NULL;  /* value is not a userdata with a metatable */
+}
+
+
+LUALIB_API void *luaL_checkudata (lua_State *L, int ud, const char *tname) {
+  void *p = luaL_testudata(L, ud, tname);
+  if (p == NULL) typeerror(L, ud, tname);
+  return p;
+}
+
+/* }====================================================== */
+
+
+/*
+** {======================================================
+** Argument check functions
+** =======================================================
+*/
+
+LUALIB_API int luaL_checkoption (lua_State *L, int arg, const char *def,
+                                 const char *const lst[]) {
+  const char *name = (def) ? luaL_optstring(L, arg, def) :
+                             luaL_checkstring(L, arg);
+  int i;
+  for (i=0; lst[i]; i++)
+    if (strcmp(lst[i], name) == 0)
+      return i;
+  return luaL_argerror(L, arg,
+                       lua_pushfstring(L, "invalid option '%s'", name));
+}
+
+
+/*
+** Ensures the stack has at least 'space' extra slots, raising an error
+** if it cannot fulfill the request. (The error handling needs a few
+** extra slots to format the error message. In case of an error without
+** this extra space, Lua will generate the same 'stack overflow' error,
+** but without 'msg'.)
+*/
+LUALIB_API void luaL_checkstack (lua_State *L, int space, const char *msg) {
+  if (!lua_checkstack(L, space)) {
+    if (msg)
+      luaL_error(L, "stack overflow (%s)", msg);
+    else
+      luaL_error(L, "stack overflow");
+  }
+}
+
+
+LUALIB_API void luaL_checktype (lua_State *L, int arg, int t) {
+  if (lua_type(L, arg) != t)
+    tag_error(L, arg, t);
+}
+
+
+LUALIB_API void luaL_checkany (lua_State *L, int arg) {
+  if (lua_type(L, arg) == LUA_TNONE)
+    luaL_argerror(L, arg, "value expected");
+}
+
+
+LUALIB_API const char *luaL_checklstring (lua_State *L, int arg, size_t *len) {
+  const char *s = lua_tolstring(L, arg, len);
+  if (!s) tag_error(L, arg, LUA_TSTRING);
+  return s;
+}
+
+
+LUALIB_API const char *luaL_optlstring (lua_State *L, int arg,
+                                        const char *def, size_t *len) {
+  if (lua_isnoneornil(L, arg)) {
+    if (len)
+      *len = (def ? strlen(def) : 0);
+    return def;
+  }
+  else return luaL_checklstring(L, arg, len);
+}
+
+
+LUALIB_API lua_Number luaL_checknumber (lua_State *L, int arg) {
+  int isnum;
+  lua_Number d = lua_tonumberx(L, arg, &isnum);
+  if (!isnum)
+    tag_error(L, arg, LUA_TNUMBER);
+  return d;
+}
+
+
+LUALIB_API lua_Number luaL_optnumber (lua_State *L, int arg, lua_Number def) {
+  return luaL_opt(L, luaL_checknumber, arg, def);
+}
+
+
+static void interror (lua_State *L, int arg) {
+  if (lua_isnumber(L, arg))
+    luaL_argerror(L, arg, "number has no integer representation");
+  else
+    tag_error(L, arg, LUA_TNUMBER);
+}
+
+
+LUALIB_API lua_Integer luaL_checkinteger (lua_State *L, int arg) {
+  int isnum;
+  lua_Integer d = lua_tointegerx(L, arg, &isnum);
+  if (!isnum) {
+    interror(L, arg);
+  }
+  return d;
+}
+
+
+LUALIB_API lua_Integer luaL_optinteger (lua_State *L, int arg,
+                                                      lua_Integer def) {
+  return luaL_opt(L, luaL_checkinteger, arg, def);
+}
+
+/* }====================================================== */
+
+
+/*
+** {======================================================
+** Generic Buffer manipulation
+** =======================================================
+*/
+
+/* userdata to box arbitrary data */
+typedef struct UBox {
+  void *box;
+  size_t bsize;
+} UBox;
+
+
+static void *resizebox (lua_State *L, int idx, size_t newsize) {
+  void *ud;
+  lua_Alloc allocf = lua_getallocf(L, &ud);
+  UBox *box = (UBox *)lua_touserdata(L, idx);
+  void *temp = allocf(ud, box->box, box->bsize, newsize);
+  if (temp == NULL && newsize > 0) {  /* allocation error? */
+    resizebox(L, idx, 0);  /* free buffer */
+    luaL_error(L, "not enough memory for buffer allocation");
+  }
+  box->box = temp;
+  box->bsize = newsize;
+  return temp;
+}
+
+
+static int boxgc (lua_State *L) {
+  resizebox(L, 1, 0);
+  return 0;
+}
+
+
+static void *newbox (lua_State *L, size_t newsize) {
+  UBox *box = (UBox *)lua_newuserdata(L, sizeof(UBox));
+  box->box = NULL;
+  box->bsize = 0;
+  if (luaL_newmetatable(L, "LUABOX")) {  /* creating metatable? */
+    lua_pushcfunction(L, boxgc);
+    lua_setfield(L, -2, "__gc");  /* metatable.__gc = boxgc */
+  }
+  lua_setmetatable(L, -2);
+  return resizebox(L, -1, newsize);
+}
+
+
+/*
+** check whether buffer is using a userdata on the stack as a temporary
+** buffer
+*/
+#define buffonstack(B)	((B)->b != (B)->initb)
+
+
+/*
+** returns a pointer to a free area with at least 'sz' bytes
+*/
+LUALIB_API char *luaL_prepbuffsize (luaL_Buffer *B, size_t sz) {
+  lua_State *L = B->L;
+  if (B->size - B->n < sz) {  /* not enough space? */
+    char *newbuff;
+    size_t newsize = B->size * 2;  /* double buffer size */
+    if (newsize - B->n < sz)  /* not big enough? */
+      newsize = B->n + sz;
+    if (newsize < B->n || newsize - B->n < sz)
+      luaL_error(L, "buffer too large");
+    /* create larger buffer */
+    if (buffonstack(B))
+      newbuff = (char *)resizebox(L, -1, newsize);
+    else {  /* no buffer yet */
+      newbuff = (char *)newbox(L, newsize);
+      memcpy(newbuff, B->b, B->n * sizeof(char));  /* copy original content */
+    }
+    B->b = newbuff;
+    B->size = newsize;
+  }
+  return &B->b[B->n];
+}
+
+
+LUALIB_API void luaL_addlstring (luaL_Buffer *B, const char *s, size_t l) {
+  if (l > 0) {  /* avoid 'memcpy' when 's' can be NULL */
+    char *b = luaL_prepbuffsize(B, l);
+    memcpy(b, s, l * sizeof(char));
+    luaL_addsize(B, l);
+  }
+}
+
+
+LUALIB_API void luaL_addstring (luaL_Buffer *B, const char *s) {
+  luaL_addlstring(B, s, strlen(s));
+}
+
+
+LUALIB_API void luaL_pushresult (luaL_Buffer *B) {
+  lua_State *L = B->L;
+  lua_pushlstring(L, B->b, B->n);
+  if (buffonstack(B)) {
+    resizebox(L, -2, 0);  /* delete old buffer */
+    lua_remove(L, -2);  /* remove its header from the stack */
+  }
+}
+
+
+LUALIB_API void luaL_pushresultsize (luaL_Buffer *B, size_t sz) {
+  luaL_addsize(B, sz);
+  luaL_pushresult(B);
+}
+
+
+LUALIB_API void luaL_addvalue (luaL_Buffer *B) {
+  lua_State *L = B->L;
+  size_t l;
+  const char *s = lua_tolstring(L, -1, &l);
+  if (buffonstack(B))
+    lua_insert(L, -2);  /* put value below buffer */
+  luaL_addlstring(B, s, l);
+  lua_remove(L, (buffonstack(B)) ? -2 : -1);  /* remove value */
+}
+
+
+LUALIB_API void luaL_buffinit (lua_State *L, luaL_Buffer *B) {
+  B->L = L;
+  B->b = B->initb;
+  B->n = 0;
+  B->size = LUAL_BUFFERSIZE;
+}
+
+
+LUALIB_API char *luaL_buffinitsize (lua_State *L, luaL_Buffer *B, size_t sz) {
+  luaL_buffinit(L, B);
+  return luaL_prepbuffsize(B, sz);
+}
+
+/* }====================================================== */
+
+
+/*
+** {======================================================
+** Reference system
+** =======================================================
+*/
+
+/* index of free-list header */
+#define freelist	0
+
+
+LUALIB_API int luaL_ref (lua_State *L, int t) {
+  int ref;
+  if (lua_isnil(L, -1)) {
+    lua_pop(L, 1);  /* remove from stack */
+    return LUA_REFNIL;  /* 'nil' has a unique fixed reference */
+  }
+  t = lua_absindex(L, t);
+  lua_rawgeti(L, t, freelist);  /* get first free element */
+  ref = (int)lua_tointeger(L, -1);  /* ref = t[freelist] */
+  lua_pop(L, 1);  /* remove it from stack */
+  if (ref != 0) {  /* any free element? */
+    lua_rawgeti(L, t, ref);  /* remove it from list */
+    lua_rawseti(L, t, freelist);  /* (t[freelist] = t[ref]) */
+  }
+  else  /* no free elements */
+    ref = (int)lua_rawlen(L, t) + 1;  /* get a new reference */
+  lua_rawseti(L, t, ref);
+  return ref;
+}
+
+
+LUALIB_API void luaL_unref (lua_State *L, int t, int ref) {
+  if (ref >= 0) {
+    t = lua_absindex(L, t);
+    lua_rawgeti(L, t, freelist);
+    lua_rawseti(L, t, ref);  /* t[ref] = t[freelist] */
+    lua_pushinteger(L, ref);
+    lua_rawseti(L, t, freelist);  /* t[freelist] = ref */
+  }
+}
+
+/* }====================================================== */
+
+
+/*
+** {======================================================
+** Load functions
+** =======================================================
+*/
+
+typedef struct LoadF {
+  int n;  /* number of pre-read characters */
+  FILE *f;  /* file being read */
+  char buff[BUFSIZ];  /* area for reading file */
+} LoadF;
+
+
+static const char *getF (lua_State *L, void *ud, size_t *size) {
+  LoadF *lf = (LoadF *)ud;
+  (void)L;  /* not used */
+  if (lf->n > 0) {  /* are there pre-read characters to be read? */
+    *size = lf->n;  /* return them (chars already in buffer) */
+    lf->n = 0;  /* no more pre-read characters */
+  }
+  else {  /* read a block from file */
+    /* 'fread' can return > 0 *and* set the EOF flag. If next call to
+       'getF' called 'fread', it might still wait for user input.
+       The next check avoids this problem. */
+    if (feof(lf->f)) return NULL;
+    *size = fread(lf->buff, 1, sizeof(lf->buff), lf->f);  /* read block */
+  }
+  return lf->buff;
+}
+
+
+static int errfile (lua_State *L, const char *what, int fnameindex) {
+  const char *serr = strerror(errno);
+  const char *filename = lua_tostring(L, fnameindex) + 1;
+  lua_pushfstring(L, "cannot %s %s: %s", what, filename, serr);
+  lua_remove(L, fnameindex);
+  return LUA_ERRFILE;
+}
+
+
+static int skipBOM (LoadF *lf) {
+  const char *p = "\xEF\xBB\xBF";  /* UTF-8 BOM mark */
+  int c;
+  lf->n = 0;
+  do {
+    c = getc(lf->f);
+    if (c == EOF || c != *(const unsigned char *)p++) return c;
+    lf->buff[lf->n++] = c;  /* to be read by the parser */
+  } while (*p != '\0');
+  lf->n = 0;  /* prefix matched; discard it */
+  return getc(lf->f);  /* return next character */
+}
+
+
+/*
+** reads the first character of file 'f' and skips an optional BOM mark
+** in its beginning plus its first line if it starts with '#'. Returns
+** true if it skipped the first line.  In any case, '*cp' has the
+** first "valid" character of the file (after the optional BOM and
+** a first-line comment).
+*/
+static int skipcomment (LoadF *lf, int *cp) {
+  int c = *cp = skipBOM(lf);
+  if (c == '#') {  /* first line is a comment (Unix exec. file)? */
+    do {  /* skip first line */
+      c = getc(lf->f);
+    } while (c != EOF && c != '\n');
+    *cp = getc(lf->f);  /* skip end-of-line, if present */
+    return 1;  /* there was a comment */
+  }
+  else return 0;  /* no comment */
+}
+
+
+LUALIB_API int luaL_loadfilex (lua_State *L, const char *filename,
+                                             const char *mode) {
+  LoadF lf;
+  int status, readstatus;
+  int c;
+  int fnameindex = lua_gettop(L) + 1;  /* index of filename on the stack */
+  if (filename == NULL) {
+    lua_pushliteral(L, "=stdin");
+    lf.f = stdin;
+  }
+  else {
+    lua_pushfstring(L, "@%s", filename);
+    lf.f = fopen(filename, "r");
+    if (lf.f == NULL) return errfile(L, "open", fnameindex);
+  }
+  if (skipcomment(&lf, &c))  /* read initial portion */
+    lf.buff[lf.n++] = '\n';  /* add line to correct line numbers */
+  if (c == LUA_SIGNATURE[0] && filename) {  /* binary file? */
+    lf.f = freopen(filename, "rb", lf.f);  /* reopen in binary mode */
+    if (lf.f == NULL) return errfile(L, "reopen", fnameindex);
+    skipcomment(&lf, &c);  /* re-read initial portion */
+  }
+  if (c != EOF)
+    lf.buff[lf.n++] = c;  /* 'c' is the first character of the stream */
+  status = lua_load(L, getF, &lf, lua_tostring(L, -1), mode);
+  readstatus = ferror(lf.f);
+  if (filename) fclose(lf.f);  /* close file (even in case of errors) */
+  if (readstatus) {
+    lua_settop(L, fnameindex);  /* ignore results from 'lua_load' */
+    return errfile(L, "read", fnameindex);
+  }
+  lua_remove(L, fnameindex);
+  return status;
+}
+
+
+typedef struct LoadS {
+  const char *s;
+  size_t size;
+} LoadS;
+
+
+static const char *getS (lua_State *L, void *ud, size_t *size) {
+  LoadS *ls = (LoadS *)ud;
+  (void)L;  /* not used */
+  if (ls->size == 0) return NULL;
+  *size = ls->size;
+  ls->size = 0;
+  return ls->s;
+}
+
+
+LUALIB_API int luaL_loadbufferx (lua_State *L, const char *buff, size_t size,
+                                 const char *name, const char *mode) {
+  LoadS ls;
+  ls.s = buff;
+  ls.size = size;
+  return lua_load(L, getS, &ls, name, mode);
+}
+
+
+LUALIB_API int luaL_loadstring (lua_State *L, const char *s) {
+  return luaL_loadbuffer(L, s, strlen(s), s);
+}
+
+/* }====================================================== */
+
+
+
+LUALIB_API int luaL_getmetafield (lua_State *L, int obj, const char *event) {
+  if (!lua_getmetatable(L, obj))  /* no metatable? */
+    return LUA_TNIL;
+  else {
+    int tt;
+    lua_pushstring(L, event);
+    tt = lua_rawget(L, -2);
+    if (tt == LUA_TNIL)  /* is metafield nil? */
+      lua_pop(L, 2);  /* remove metatable and metafield */
+    else
+      lua_remove(L, -2);  /* remove only metatable */
+    return tt;  /* return metafield type */
+  }
+}
+
+
+LUALIB_API int luaL_callmeta (lua_State *L, int obj, const char *event) {
+  obj = lua_absindex(L, obj);
+  if (luaL_getmetafield(L, obj, event) == LUA_TNIL)  /* no metafield? */
+    return 0;
+  lua_pushvalue(L, obj);
+  lua_call(L, 1, 1);
+  return 1;
+}
+
+
+LUALIB_API lua_Integer luaL_len (lua_State *L, int idx) {
+  lua_Integer l;
+  int isnum;
+  lua_len(L, idx);
+  l = lua_tointegerx(L, -1, &isnum);
+  if (!isnum)
+    luaL_error(L, "object length is not an integer");
+  lua_pop(L, 1);  /* remove object */
+  return l;
+}
+
+
+LUALIB_API const char *luaL_tolstring (lua_State *L, int idx, size_t *len) {
+  if (!luaL_callmeta(L, idx, "__tostring")) {  /* no metafield? */
+    switch (lua_type(L, idx)) {
+      case LUA_TNUMBER: {
+        if (lua_isinteger(L, idx))
+          lua_pushfstring(L, "%I", lua_tointeger(L, idx));
+        else
+          lua_pushfstring(L, "%f", lua_tonumber(L, idx));
+        break;
+      }
+      case LUA_TSTRING:
+        lua_pushvalue(L, idx);
+        break;
+      case LUA_TBOOLEAN:
+        lua_pushstring(L, (lua_toboolean(L, idx) ? "true" : "false"));
+        break;
+      case LUA_TNIL:
+        lua_pushliteral(L, "nil");
+        break;
+      default:
+        lua_pushfstring(L, "%s: %p", luaL_typename(L, idx),
+                                            lua_topointer(L, idx));
+        break;
+    }
+  }
+  return lua_tolstring(L, -1, len);
+}
+
+
+/*
+** {======================================================
+** Compatibility with 5.1 module functions
+** =======================================================
+*/
+#if defined(LUA_COMPAT_MODULE)
+
+static const char *luaL_findtable (lua_State *L, int idx,
+                                   const char *fname, int szhint) {
+  const char *e;
+  if (idx) lua_pushvalue(L, idx);
+  do {
+    e = strchr(fname, '.');
+    if (e == NULL) e = fname + strlen(fname);
+    lua_pushlstring(L, fname, e - fname);
+    if (lua_rawget(L, -2) == LUA_TNIL) {  /* no such field? */
+      lua_pop(L, 1);  /* remove this nil */
+      lua_createtable(L, 0, (*e == '.' ? 1 : szhint)); /* new table for field */
+      lua_pushlstring(L, fname, e - fname);
+      lua_pushvalue(L, -2);
+      lua_settable(L, -4);  /* set new table into field */
+    }
+    else if (!lua_istable(L, -1)) {  /* field has a non-table value? */
+      lua_pop(L, 2);  /* remove table and value */
+      return fname;  /* return problematic part of the name */
+    }
+    lua_remove(L, -2);  /* remove previous table */
+    fname = e + 1;
+  } while (*e == '.');
+  return NULL;
+}
+
+
+/*
+** Count number of elements in a luaL_Reg list.
+*/
+static int libsize (const luaL_Reg *l) {
+  int size = 0;
+  for (; l && l->name; l++) size++;
+  return size;
+}
+
+
+/*
+** Find or create a module table with a given name. The function
+** first looks at the _LOADED table and, if that fails, try a
+** global variable with that name. In any case, leaves on the stack
+** the module table.
+*/
+LUALIB_API void luaL_pushmodule (lua_State *L, const char *modname,
+                                 int sizehint) {
+  luaL_findtable(L, LUA_REGISTRYINDEX, "_LOADED", 1);  /* get _LOADED table */
+  if (lua_getfield(L, -1, modname) != LUA_TTABLE) {  /* no _LOADED[modname]? */
+    lua_pop(L, 1);  /* remove previous result */
+    /* try global variable (and create one if it does not exist) */
+    lua_pushglobaltable(L);
+    if (luaL_findtable(L, 0, modname, sizehint) != NULL)
+      luaL_error(L, "name conflict for module '%s'", modname);
+    lua_pushvalue(L, -1);
+    lua_setfield(L, -3, modname);  /* _LOADED[modname] = new table */
+  }
+  lua_remove(L, -2);  /* remove _LOADED table */
+}
+
+
+LUALIB_API void luaL_openlib (lua_State *L, const char *libname,
+                               const luaL_Reg *l, int nup) {
+  luaL_checkversion(L);
+  if (libname) {
+    luaL_pushmodule(L, libname, libsize(l));  /* get/create library table */
+    lua_insert(L, -(nup + 1));  /* move library table to below upvalues */
+  }
+  if (l)
+    luaL_setfuncs(L, l, nup);
+  else
+    lua_pop(L, nup);  /* remove upvalues */
+}
+
+#endif
+/* }====================================================== */
+
+/*
+** set functions from list 'l' into table at top - 'nup'; each
+** function gets the 'nup' elements at the top as upvalues.
+** Returns with only the table at the stack.
+*/
+LUALIB_API void luaL_setfuncs (lua_State *L, const luaL_Reg *l, int nup) {
+  luaL_checkstack(L, nup, "too many upvalues");
+  for (; l->name != NULL; l++) {  /* fill the table with given functions */
+    int i;
+    for (i = 0; i < nup; i++)  /* copy upvalues to the top */
+      lua_pushvalue(L, -nup);
+    lua_pushcclosure(L, l->func, nup);  /* closure with those upvalues */
+    lua_setfield(L, -(nup + 2), l->name);
+  }
+  lua_pop(L, nup);  /* remove upvalues */
+}
+
+
+/*
+** ensure that stack[idx][fname] has a table and push that table
+** into the stack
+*/
+LUALIB_API int luaL_getsubtable (lua_State *L, int idx, const char *fname) {
+  if (lua_getfield(L, idx, fname) == LUA_TTABLE)
+    return 1;  /* table already there */
+  else {
+    lua_pop(L, 1);  /* remove previous result */
+    idx = lua_absindex(L, idx);
+    lua_newtable(L);
+    lua_pushvalue(L, -1);  /* copy to be left at top */
+    lua_setfield(L, idx, fname);  /* assign new table to field */
+    return 0;  /* false, because did not find table there */
+  }
+}
+
+
+/*
+** Stripped-down 'require': After checking "loaded" table, calls 'openf'
+** to open a module, registers the result in 'package.loaded' table and,
+** if 'glb' is true, also registers the result in the global table.
+** Leaves resulting module on the top.
+*/
+LUALIB_API void luaL_requiref (lua_State *L, const char *modname,
+                               lua_CFunction openf, int glb) {
+  luaL_getsubtable(L, LUA_REGISTRYINDEX, "_LOADED");
+  lua_getfield(L, -1, modname);  /* _LOADED[modname] */
+  if (!lua_toboolean(L, -1)) {  /* package not already loaded? */
+    lua_pop(L, 1);  /* remove field */
+    lua_pushcfunction(L, openf);
+    lua_pushstring(L, modname);  /* argument to open function */
+    lua_call(L, 1, 1);  /* call 'openf' to open module */
+    lua_pushvalue(L, -1);  /* make copy of module (call result) */
+    lua_setfield(L, -3, modname);  /* _LOADED[modname] = module */
+  }
+  lua_remove(L, -2);  /* remove _LOADED table */
+  if (glb) {
+    lua_pushvalue(L, -1);  /* copy of module */
+    lua_setglobal(L, modname);  /* _G[modname] = module */
+  }
+}
+
+
+LUALIB_API const char *luaL_gsub (lua_State *L, const char *s, const char *p,
+                                                               const char *r) {
+  const char *wild;
+  size_t l = strlen(p);
+  luaL_Buffer b;
+  luaL_buffinit(L, &b);
+  while ((wild = strstr(s, p)) != NULL) {
+    luaL_addlstring(&b, s, wild - s);  /* push prefix */
+    luaL_addstring(&b, r);  /* push replacement in place of pattern */
+    s = wild + l;  /* continue after 'p' */
+  }
+  luaL_addstring(&b, s);  /* push last suffix */
+  luaL_pushresult(&b);
+  return lua_tostring(L, -1);
+}
+
+
+static void *l_alloc (void *ud, void *ptr, size_t osize, size_t nsize) {
+  (void)ud; (void)osize;  /* not used */
+  if (nsize == 0) {
+    free(ptr);
+    return NULL;
+  }
+  else
+    return realloc(ptr, nsize);
+}
+
+
+static int panic (lua_State *L) {
+  lua_writestringerror("PANIC: unprotected error in call to Lua API (%s)\n",
+                        lua_tostring(L, -1));
+  return 0;  /* return to Lua to abort */
+}
+
+
+LUALIB_API lua_State *luaL_newstate (void) {
+  lua_State *L = lua_newstate(l_alloc, NULL);
+  if (L) lua_atpanic(L, &panic);
+  return L;
+}
+
+
+LUALIB_API void luaL_checkversion_ (lua_State *L, lua_Number ver, size_t sz) {
+  const lua_Number *v = lua_version(L);
+  if (sz != LUAL_NUMSIZES)  /* check numeric types */
+    luaL_error(L, "core and library have incompatible numeric types");
+  if (v != lua_version(NULL))
+    luaL_error(L, "multiple Lua VMs detected");
+  else if (*v != ver)
+    luaL_error(L, "version mismatch: app. needs %f, Lua core provides %f",
+                  ver, *v);
+}
+
diff --git a/libs/lua/lua-5.3.3/lauxlib.h b/libs/lua/lua-5.3.3/lauxlib.h
new file mode 100644
index 0000000..ddb7c22
--- /dev/null
+++ b/libs/lua/lua-5.3.3/lauxlib.h
@@ -0,0 +1,256 @@
+/*
+** $Id: lauxlib.h,v 1.129 2015/11/23 11:29:43 roberto Exp $
+** Auxiliary functions for building Lua libraries
+** See Copyright Notice in lua.h
+*/
+
+
+#ifndef lauxlib_h
+#define lauxlib_h
+
+
+#include <stddef.h>
+#include <stdio.h>
+
+#include "lua.h"
+
+
+
+/* extra error code for 'luaL_load' */
+#define LUA_ERRFILE     (LUA_ERRERR+1)
+
+
+typedef struct luaL_Reg {
+  const char *name;
+  lua_CFunction func;
+} luaL_Reg;
+
+
+#define LUAL_NUMSIZES	(sizeof(lua_Integer)*16 + sizeof(lua_Number))
+
+LUALIB_API void (luaL_checkversion_) (lua_State *L, lua_Number ver, size_t sz);
+#define luaL_checkversion(L)  \
+	  luaL_checkversion_(L, LUA_VERSION_NUM, LUAL_NUMSIZES)
+
+LUALIB_API int (luaL_getmetafield) (lua_State *L, int obj, const char *e);
+LUALIB_API int (luaL_callmeta) (lua_State *L, int obj, const char *e);
+LUALIB_API const char *(luaL_tolstring) (lua_State *L, int idx, size_t *len);
+LUALIB_API int (luaL_argerror) (lua_State *L, int arg, const char *extramsg);
+LUALIB_API const char *(luaL_checklstring) (lua_State *L, int arg,
+                                                          size_t *l);
+LUALIB_API const char *(luaL_optlstring) (lua_State *L, int arg,
+                                          const char *def, size_t *l);
+LUALIB_API lua_Number (luaL_checknumber) (lua_State *L, int arg);
+LUALIB_API lua_Number (luaL_optnumber) (lua_State *L, int arg, lua_Number def);
+
+LUALIB_API lua_Integer (luaL_checkinteger) (lua_State *L, int arg);
+LUALIB_API lua_Integer (luaL_optinteger) (lua_State *L, int arg,
+                                          lua_Integer def);
+
+LUALIB_API void (luaL_checkstack) (lua_State *L, int sz, const char *msg);
+LUALIB_API void (luaL_checktype) (lua_State *L, int arg, int t);
+LUALIB_API void (luaL_checkany) (lua_State *L, int arg);
+
+LUALIB_API int   (luaL_newmetatable) (lua_State *L, const char *tname);
+LUALIB_API void  (luaL_setmetatable) (lua_State *L, const char *tname);
+LUALIB_API void *(luaL_testudata) (lua_State *L, int ud, const char *tname);
+LUALIB_API void *(luaL_checkudata) (lua_State *L, int ud, const char *tname);
+
+LUALIB_API void (luaL_where) (lua_State *L, int lvl);
+LUALIB_API int (luaL_error) (lua_State *L, const char *fmt, ...);
+
+LUALIB_API int (luaL_checkoption) (lua_State *L, int arg, const char *def,
+                                   const char *const lst[]);
+
+LUALIB_API int (luaL_fileresult) (lua_State *L, int stat, const char *fname);
+LUALIB_API int (luaL_execresult) (lua_State *L, int stat);
+
+/* predefined references */
+#define LUA_NOREF       (-2)
+#define LUA_REFNIL      (-1)
+
+LUALIB_API int (luaL_ref) (lua_State *L, int t);
+LUALIB_API void (luaL_unref) (lua_State *L, int t, int ref);
+
+LUALIB_API int (luaL_loadfilex) (lua_State *L, const char *filename,
+                                               const char *mode);
+
+#define luaL_loadfile(L,f)	luaL_loadfilex(L,f,NULL)
+
+LUALIB_API int (luaL_loadbufferx) (lua_State *L, const char *buff, size_t sz,
+                                   const char *name, const char *mode);
+LUALIB_API int (luaL_loadstring) (lua_State *L, const char *s);
+
+LUALIB_API lua_State *(luaL_newstate) (void);
+
+LUALIB_API lua_Integer (luaL_len) (lua_State *L, int idx);
+
+LUALIB_API const char *(luaL_gsub) (lua_State *L, const char *s, const char *p,
+                                                  const char *r);
+
+LUALIB_API void (luaL_setfuncs) (lua_State *L, const luaL_Reg *l, int nup);
+
+LUALIB_API int (luaL_getsubtable) (lua_State *L, int idx, const char *fname);
+
+LUALIB_API void (luaL_traceback) (lua_State *L, lua_State *L1,
+                                  const char *msg, int level);
+
+LUALIB_API void (luaL_requiref) (lua_State *L, const char *modname,
+                                 lua_CFunction openf, int glb);
+
+/*
+** ===============================================================
+** some useful macros
+** ===============================================================
+*/
+
+
+#define luaL_newlibtable(L,l)	\
+  lua_createtable(L, 0, sizeof(l)/sizeof((l)[0]) - 1)
+
+#define luaL_newlib(L,l)  \
+  (luaL_checkversion(L), luaL_newlibtable(L,l), luaL_setfuncs(L,l,0))
+
+#define luaL_argcheck(L, cond,arg,extramsg)	\
+		((void)((cond) || luaL_argerror(L, (arg), (extramsg))))
+#define luaL_checkstring(L,n)	(luaL_checklstring(L, (n), NULL))
+#define luaL_optstring(L,n,d)	(luaL_optlstring(L, (n), (d), NULL))
+
+#define luaL_typename(L,i)	lua_typename(L, lua_type(L,(i)))
+
+#define luaL_dofile(L, fn) \
+	(luaL_loadfile(L, fn) || lua_pcall(L, 0, LUA_MULTRET, 0))
+
+#define luaL_dostring(L, s) \
+	(luaL_loadstring(L, s) || lua_pcall(L, 0, LUA_MULTRET, 0))
+
+#define luaL_getmetatable(L,n)	(lua_getfield(L, LUA_REGISTRYINDEX, (n)))
+
+#define luaL_opt(L,f,n,d)	(lua_isnoneornil(L,(n)) ? (d) : f(L,(n)))
+
+#define luaL_loadbuffer(L,s,sz,n)	luaL_loadbufferx(L,s,sz,n,NULL)
+
+
+/*
+** {======================================================
+** Generic Buffer manipulation
+** =======================================================
+*/
+
+typedef struct luaL_Buffer {
+  char *b;  /* buffer address */
+  size_t size;  /* buffer size */
+  size_t n;  /* number of characters in buffer */
+  lua_State *L;
+  char initb[LUAL_BUFFERSIZE];  /* initial buffer */
+} luaL_Buffer;
+
+
+#define luaL_addchar(B,c) \
+  ((void)((B)->n < (B)->size || luaL_prepbuffsize((B), 1)), \
+   ((B)->b[(B)->n++] = (c)))
+
+#define luaL_addsize(B,s)	((B)->n += (s))
+
+LUALIB_API void (luaL_buffinit) (lua_State *L, luaL_Buffer *B);
+LUALIB_API char *(luaL_prepbuffsize) (luaL_Buffer *B, size_t sz);
+LUALIB_API void (luaL_addlstring) (luaL_Buffer *B, const char *s, size_t l);
+LUALIB_API void (luaL_addstring) (luaL_Buffer *B, const char *s);
+LUALIB_API void (luaL_addvalue) (luaL_Buffer *B);
+LUALIB_API void (luaL_pushresult) (luaL_Buffer *B);
+LUALIB_API void (luaL_pushresultsize) (luaL_Buffer *B, size_t sz);
+LUALIB_API char *(luaL_buffinitsize) (lua_State *L, luaL_Buffer *B, size_t sz);
+
+#define luaL_prepbuffer(B)	luaL_prepbuffsize(B, LUAL_BUFFERSIZE)
+
+/* }====================================================== */
+
+
+
+/*
+** {======================================================
+** File handles for IO library
+** =======================================================
+*/
+
+/*
+** A file handle is a userdata with metatable 'LUA_FILEHANDLE' and
+** initial structure 'luaL_Stream' (it may contain other fields
+** after that initial structure).
+*/
+
+#define LUA_FILEHANDLE          "FILE*"
+
+
+typedef struct luaL_Stream {
+  FILE *f;  /* stream (NULL for incompletely created streams) */
+  lua_CFunction closef;  /* to close stream (NULL for closed streams) */
+} luaL_Stream;
+
+/* }====================================================== */
+
+
+
+/* compatibility with old module system */
+#if defined(LUA_COMPAT_MODULE)
+
+LUALIB_API void (luaL_pushmodule) (lua_State *L, const char *modname,
+                                   int sizehint);
+LUALIB_API void (luaL_openlib) (lua_State *L, const char *libname,
+                                const luaL_Reg *l, int nup);
+
+#define luaL_register(L,n,l)	(luaL_openlib(L,(n),(l),0))
+
+#endif
+
+
+/*
+** {==================================================================
+** "Abstraction Layer" for basic report of messages and errors
+** ===================================================================
+*/
+
+/* print a string */
+#if !defined(lua_writestring)
+#define lua_writestring(s,l)   fwrite((s), sizeof(char), (l), stdout)
+#endif
+
+/* print a newline and flush the output */
+#if !defined(lua_writeline)
+#define lua_writeline()        (lua_writestring("\n", 1), fflush(stdout))
+#endif
+
+/* print an error message */
+#if !defined(lua_writestringerror)
+#define lua_writestringerror(s,p) \
+        (fprintf(stderr, (s), (p)), fflush(stderr))
+#endif
+
+/* }================================================================== */
+
+
+/*
+** {============================================================
+** Compatibility with deprecated conversions
+** =============================================================
+*/
+#if defined(LUA_COMPAT_APIINTCASTS)
+
+#define luaL_checkunsigned(L,a)	((lua_Unsigned)luaL_checkinteger(L,a))
+#define luaL_optunsigned(L,a,d)	\
+	((lua_Unsigned)luaL_optinteger(L,a,(lua_Integer)(d)))
+
+#define luaL_checkint(L,n)	((int)luaL_checkinteger(L, (n)))
+#define luaL_optint(L,n,d)	((int)luaL_optinteger(L, (n), (d)))
+
+#define luaL_checklong(L,n)	((long)luaL_checkinteger(L, (n)))
+#define luaL_optlong(L,n,d)	((long)luaL_optinteger(L, (n), (d)))
+
+#endif
+/* }============================================================ */
+
+
+
+#endif
+
+
diff --git a/libs/lua/lua-5.3.3/lbaselib.c b/libs/lua/lua-5.3.3/lbaselib.c
new file mode 100644
index 0000000..d481c4e
--- /dev/null
+++ b/libs/lua/lua-5.3.3/lbaselib.c
@@ -0,0 +1,498 @@
+/*
+** $Id: lbaselib.c,v 1.313 2016/04/11 19:18:40 roberto Exp $
+** Basic library
+** See Copyright Notice in lua.h
+*/
+
+#define lbaselib_c
+#define LUA_LIB
+
+#include "lprefix.h"
+
+
+#include <ctype.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "lua.h"
+
+#include "lauxlib.h"
+#include "lualib.h"
+
+
+static int luaB_print (lua_State *L) {
+  int n = lua_gettop(L);  /* number of arguments */
+  int i;
+  lua_getglobal(L, "tostring");
+  for (i=1; i<=n; i++) {
+    const char *s;
+    size_t l;
+    lua_pushvalue(L, -1);  /* function to be called */
+    lua_pushvalue(L, i);   /* value to print */
+    lua_call(L, 1, 1);
+    s = lua_tolstring(L, -1, &l);  /* get result */
+    if (s == NULL)
+      return luaL_error(L, "'tostring' must return a string to 'print'");
+    if (i>1) lua_writestring("\t", 1);
+    lua_writestring(s, l);
+    lua_pop(L, 1);  /* pop result */
+  }
+  lua_writeline();
+  return 0;
+}
+
+
+#define SPACECHARS	" \f\n\r\t\v"
+
+static const char *b_str2int (const char *s, int base, lua_Integer *pn) {
+  lua_Unsigned n = 0;
+  int neg = 0;
+  s += strspn(s, SPACECHARS);  /* skip initial spaces */
+  if (*s == '-') { s++; neg = 1; }  /* handle signal */
+  else if (*s == '+') s++;
+  if (!isalnum((unsigned char)*s))  /* no digit? */
+    return NULL;
+  do {
+    int digit = (isdigit((unsigned char)*s)) ? *s - '0'
+                   : (toupper((unsigned char)*s) - 'A') + 10;
+    if (digit >= base) return NULL;  /* invalid numeral */
+    n = n * base + digit;
+    s++;
+  } while (isalnum((unsigned char)*s));
+  s += strspn(s, SPACECHARS);  /* skip trailing spaces */
+  *pn = (lua_Integer)((neg) ? (0u - n) : n);
+  return s;
+}
+
+
+static int luaB_tonumber (lua_State *L) {
+  if (lua_isnoneornil(L, 2)) {  /* standard conversion? */
+    luaL_checkany(L, 1);
+    if (lua_type(L, 1) == LUA_TNUMBER) {  /* already a number? */
+      lua_settop(L, 1);  /* yes; return it */
+      return 1;
+    }
+    else {
+      size_t l;
+      const char *s = lua_tolstring(L, 1, &l);
+      if (s != NULL && lua_stringtonumber(L, s) == l + 1)
+        return 1;  /* successful conversion to number */
+      /* else not a number */
+    }
+  }
+  else {
+    size_t l;
+    const char *s;
+    lua_Integer n = 0;  /* to avoid warnings */
+    lua_Integer base = luaL_checkinteger(L, 2);
+    luaL_checktype(L, 1, LUA_TSTRING);  /* no numbers as strings */
+    s = lua_tolstring(L, 1, &l);
+    luaL_argcheck(L, 2 <= base && base <= 36, 2, "base out of range");
+    if (b_str2int(s, (int)base, &n) == s + l) {
+      lua_pushinteger(L, n);
+      return 1;
+    }  /* else not a number */
+  }  /* else not a number */
+  lua_pushnil(L);  /* not a number */
+  return 1;
+}
+
+
+static int luaB_error (lua_State *L) {
+  int level = (int)luaL_optinteger(L, 2, 1);
+  lua_settop(L, 1);
+  if (lua_type(L, 1) == LUA_TSTRING && level > 0) {
+    luaL_where(L, level);   /* add extra information */
+    lua_pushvalue(L, 1);
+    lua_concat(L, 2);
+  }
+  return lua_error(L);
+}
+
+
+static int luaB_getmetatable (lua_State *L) {
+  luaL_checkany(L, 1);
+  if (!lua_getmetatable(L, 1)) {
+    lua_pushnil(L);
+    return 1;  /* no metatable */
+  }
+  luaL_getmetafield(L, 1, "__metatable");
+  return 1;  /* returns either __metatable field (if present) or metatable */
+}
+
+
+static int luaB_setmetatable (lua_State *L) {
+  int t = lua_type(L, 2);
+  luaL_checktype(L, 1, LUA_TTABLE);
+  luaL_argcheck(L, t == LUA_TNIL || t == LUA_TTABLE, 2,
+                    "nil or table expected");
+  if (luaL_getmetafield(L, 1, "__metatable") != LUA_TNIL)
+    return luaL_error(L, "cannot change a protected metatable");
+  lua_settop(L, 2);
+  lua_setmetatable(L, 1);
+  return 1;
+}
+
+
+static int luaB_rawequal (lua_State *L) {
+  luaL_checkany(L, 1);
+  luaL_checkany(L, 2);
+  lua_pushboolean(L, lua_rawequal(L, 1, 2));
+  return 1;
+}
+
+
+static int luaB_rawlen (lua_State *L) {
+  int t = lua_type(L, 1);
+  luaL_argcheck(L, t == LUA_TTABLE || t == LUA_TSTRING, 1,
+                   "table or string expected");
+  lua_pushinteger(L, lua_rawlen(L, 1));
+  return 1;
+}
+
+
+static int luaB_rawget (lua_State *L) {
+  luaL_checktype(L, 1, LUA_TTABLE);
+  luaL_checkany(L, 2);
+  lua_settop(L, 2);
+  lua_rawget(L, 1);
+  return 1;
+}
+
+static int luaB_rawset (lua_State *L) {
+  luaL_checktype(L, 1, LUA_TTABLE);
+  luaL_checkany(L, 2);
+  luaL_checkany(L, 3);
+  lua_settop(L, 3);
+  lua_rawset(L, 1);
+  return 1;
+}
+
+
+static int luaB_collectgarbage (lua_State *L) {
+  static const char *const opts[] = {"stop", "restart", "collect",
+    "count", "step", "setpause", "setstepmul",
+    "isrunning", NULL};
+  static const int optsnum[] = {LUA_GCSTOP, LUA_GCRESTART, LUA_GCCOLLECT,
+    LUA_GCCOUNT, LUA_GCSTEP, LUA_GCSETPAUSE, LUA_GCSETSTEPMUL,
+    LUA_GCISRUNNING};
+  int o = optsnum[luaL_checkoption(L, 1, "collect", opts)];
+  int ex = (int)luaL_optinteger(L, 2, 0);
+  int res = lua_gc(L, o, ex);
+  switch (o) {
+    case LUA_GCCOUNT: {
+      int b = lua_gc(L, LUA_GCCOUNTB, 0);
+      lua_pushnumber(L, (lua_Number)res + ((lua_Number)b/1024));
+      return 1;
+    }
+    case LUA_GCSTEP: case LUA_GCISRUNNING: {
+      lua_pushboolean(L, res);
+      return 1;
+    }
+    default: {
+      lua_pushinteger(L, res);
+      return 1;
+    }
+  }
+}
+
+
+static int luaB_type (lua_State *L) {
+  int t = lua_type(L, 1);
+  luaL_argcheck(L, t != LUA_TNONE, 1, "value expected");
+  lua_pushstring(L, lua_typename(L, t));
+  return 1;
+}
+
+
+static int pairsmeta (lua_State *L, const char *method, int iszero,
+                      lua_CFunction iter) {
+  if (luaL_getmetafield(L, 1, method) == LUA_TNIL) {  /* no metamethod? */
+    luaL_checktype(L, 1, LUA_TTABLE);  /* argument must be a table */
+    lua_pushcfunction(L, iter);  /* will return generator, */
+    lua_pushvalue(L, 1);  /* state, */
+    if (iszero) lua_pushinteger(L, 0);  /* and initial value */
+    else lua_pushnil(L);
+  }
+  else {
+    lua_pushvalue(L, 1);  /* argument 'self' to metamethod */
+    lua_call(L, 1, 3);  /* get 3 values from metamethod */
+  }
+  return 3;
+}
+
+
+static int luaB_next (lua_State *L) {
+  luaL_checktype(L, 1, LUA_TTABLE);
+  lua_settop(L, 2);  /* create a 2nd argument if there isn't one */
+  if (lua_next(L, 1))
+    return 2;
+  else {
+    lua_pushnil(L);
+    return 1;
+  }
+}
+
+
+static int luaB_pairs (lua_State *L) {
+  return pairsmeta(L, "__pairs", 0, luaB_next);
+}
+
+
+/*
+** Traversal function for 'ipairs'
+*/
+static int ipairsaux (lua_State *L) {
+  lua_Integer i = luaL_checkinteger(L, 2) + 1;
+  lua_pushinteger(L, i);
+  return (lua_geti(L, 1, i) == LUA_TNIL) ? 1 : 2;
+}
+
+
+/*
+** 'ipairs' function. Returns 'ipairsaux', given "table", 0.
+** (The given "table" may not be a table.)
+*/
+static int luaB_ipairs (lua_State *L) {
+#if defined(LUA_COMPAT_IPAIRS)
+  return pairsmeta(L, "__ipairs", 1, ipairsaux);
+#else
+  luaL_checkany(L, 1);
+  lua_pushcfunction(L, ipairsaux);  /* iteration function */
+  lua_pushvalue(L, 1);  /* state */
+  lua_pushinteger(L, 0);  /* initial value */
+  return 3;
+#endif
+}
+
+
+static int load_aux (lua_State *L, int status, int envidx) {
+  if (status == LUA_OK) {
+    if (envidx != 0) {  /* 'env' parameter? */
+      lua_pushvalue(L, envidx);  /* environment for loaded function */
+      if (!lua_setupvalue(L, -2, 1))  /* set it as 1st upvalue */
+        lua_pop(L, 1);  /* remove 'env' if not used by previous call */
+    }
+    return 1;
+  }
+  else {  /* error (message is on top of the stack) */
+    lua_pushnil(L);
+    lua_insert(L, -2);  /* put before error message */
+    return 2;  /* return nil plus error message */
+  }
+}
+
+
+static int luaB_loadfile (lua_State *L) {
+  const char *fname = luaL_optstring(L, 1, NULL);
+  const char *mode = luaL_optstring(L, 2, NULL);
+  int env = (!lua_isnone(L, 3) ? 3 : 0);  /* 'env' index or 0 if no 'env' */
+  int status = luaL_loadfilex(L, fname, mode);
+  return load_aux(L, status, env);
+}
+
+
+/*
+** {======================================================
+** Generic Read function
+** =======================================================
+*/
+
+
+/*
+** reserved slot, above all arguments, to hold a copy of the returned
+** string to avoid it being collected while parsed. 'load' has four
+** optional arguments (chunk, source name, mode, and environment).
+*/
+#define RESERVEDSLOT	5
+
+
+/*
+** Reader for generic 'load' function: 'lua_load' uses the
+** stack for internal stuff, so the reader cannot change the
+** stack top. Instead, it keeps its resulting string in a
+** reserved slot inside the stack.
+*/
+static const char *generic_reader (lua_State *L, void *ud, size_t *size) {
+  (void)(ud);  /* not used */
+  luaL_checkstack(L, 2, "too many nested functions");
+  lua_pushvalue(L, 1);  /* get function */
+  lua_call(L, 0, 1);  /* call it */
+  if (lua_isnil(L, -1)) {
+    lua_pop(L, 1);  /* pop result */
+    *size = 0;
+    return NULL;
+  }
+  else if (!lua_isstring(L, -1))
+    luaL_error(L, "reader function must return a string");
+  lua_replace(L, RESERVEDSLOT);  /* save string in reserved slot */
+  return lua_tolstring(L, RESERVEDSLOT, size);
+}
+
+
+static int luaB_load (lua_State *L) {
+  int status;
+  size_t l;
+  const char *s = lua_tolstring(L, 1, &l);
+  const char *mode = luaL_optstring(L, 3, "bt");
+  int env = (!lua_isnone(L, 4) ? 4 : 0);  /* 'env' index or 0 if no 'env' */
+  if (s != NULL) {  /* loading a string? */
+    const char *chunkname = luaL_optstring(L, 2, s);
+    status = luaL_loadbufferx(L, s, l, chunkname, mode);
+  }
+  else {  /* loading from a reader function */
+    const char *chunkname = luaL_optstring(L, 2, "=(load)");
+    luaL_checktype(L, 1, LUA_TFUNCTION);
+    lua_settop(L, RESERVEDSLOT);  /* create reserved slot */
+    status = lua_load(L, generic_reader, NULL, chunkname, mode);
+  }
+  return load_aux(L, status, env);
+}
+
+/* }====================================================== */
+
+
+static int dofilecont (lua_State *L, int d1, lua_KContext d2) {
+  (void)d1;  (void)d2;  /* only to match 'lua_Kfunction' prototype */
+  return lua_gettop(L) - 1;
+}
+
+
+static int luaB_dofile (lua_State *L) {
+  const char *fname = luaL_optstring(L, 1, NULL);
+  lua_settop(L, 1);
+  if (luaL_loadfile(L, fname) != LUA_OK)
+    return lua_error(L);
+  lua_callk(L, 0, LUA_MULTRET, 0, dofilecont);
+  return dofilecont(L, 0, 0);
+}
+
+
+static int luaB_assert (lua_State *L) {
+  if (lua_toboolean(L, 1))  /* condition is true? */
+    return lua_gettop(L);  /* return all arguments */
+  else {  /* error */
+    luaL_checkany(L, 1);  /* there must be a condition */
+    lua_remove(L, 1);  /* remove it */
+    lua_pushliteral(L, "assertion failed!");  /* default message */
+    lua_settop(L, 1);  /* leave only message (default if no other one) */
+    return luaB_error(L);  /* call 'error' */
+  }
+}
+
+
+static int luaB_select (lua_State *L) {
+  int n = lua_gettop(L);
+  if (lua_type(L, 1) == LUA_TSTRING && *lua_tostring(L, 1) == '#') {
+    lua_pushinteger(L, n-1);
+    return 1;
+  }
+  else {
+    lua_Integer i = luaL_checkinteger(L, 1);
+    if (i < 0) i = n + i;
+    else if (i > n) i = n;
+    luaL_argcheck(L, 1 <= i, 1, "index out of range");
+    return n - (int)i;
+  }
+}
+
+
+/*
+** Continuation function for 'pcall' and 'xpcall'. Both functions
+** already pushed a 'true' before doing the call, so in case of success
+** 'finishpcall' only has to return everything in the stack minus
+** 'extra' values (where 'extra' is exactly the number of items to be
+** ignored).
+*/
+static int finishpcall (lua_State *L, int status, lua_KContext extra) {
+  if (status != LUA_OK && status != LUA_YIELD) {  /* error? */
+    lua_pushboolean(L, 0);  /* first result (false) */
+    lua_pushvalue(L, -2);  /* error message */
+    return 2;  /* return false, msg */
+  }
+  else
+    return lua_gettop(L) - (int)extra;  /* return all results */
+}
+
+
+static int luaB_pcall (lua_State *L) {
+  int status;
+  luaL_checkany(L, 1);
+  lua_pushboolean(L, 1);  /* first result if no errors */
+  lua_insert(L, 1);  /* put it in place */
+  status = lua_pcallk(L, lua_gettop(L) - 2, LUA_MULTRET, 0, 0, finishpcall);
+  return finishpcall(L, status, 0);
+}
+
+
+/*
+** Do a protected call with error handling. After 'lua_rotate', the
+** stack will have <f, err, true, f, [args...]>; so, the function passes
+** 2 to 'finishpcall' to skip the 2 first values when returning results.
+*/
+static int luaB_xpcall (lua_State *L) {
+  int status;
+  int n = lua_gettop(L);
+  luaL_checktype(L, 2, LUA_TFUNCTION);  /* check error function */
+  lua_pushboolean(L, 1);  /* first result */
+  lua_pushvalue(L, 1);  /* function */
+  lua_rotate(L, 3, 2);  /* move them below function's arguments */
+  status = lua_pcallk(L, n - 2, LUA_MULTRET, 2, 2, finishpcall);
+  return finishpcall(L, status, 2);
+}
+
+
+static int luaB_tostring (lua_State *L) {
+  luaL_checkany(L, 1);
+  luaL_tolstring(L, 1, NULL);
+  return 1;
+}
+
+
+static const luaL_Reg base_funcs[] = {
+  {"assert", luaB_assert},
+  {"collectgarbage", luaB_collectgarbage},
+  {"dofile", luaB_dofile},
+  {"error", luaB_error},
+  {"getmetatable", luaB_getmetatable},
+  {"ipairs", luaB_ipairs},
+  {"loadfile", luaB_loadfile},
+  {"load", luaB_load},
+#if defined(LUA_COMPAT_LOADSTRING)
+  {"loadstring", luaB_load},
+#endif
+  {"next", luaB_next},
+  {"pairs", luaB_pairs},
+  {"pcall", luaB_pcall},
+  {"print", luaB_print},
+  {"rawequal", luaB_rawequal},
+  {"rawlen", luaB_rawlen},
+  {"rawget", luaB_rawget},
+  {"rawset", luaB_rawset},
+  {"select", luaB_select},
+  {"setmetatable", luaB_setmetatable},
+  {"tonumber", luaB_tonumber},
+  {"tostring", luaB_tostring},
+  {"type", luaB_type},
+  {"xpcall", luaB_xpcall},
+  /* placeholders */
+  {"_G", NULL},
+  {"_VERSION", NULL},
+  {NULL, NULL}
+};
+
+
+LUAMOD_API int luaopen_base (lua_State *L) {
+  /* open lib into global table */
+  lua_pushglobaltable(L);
+  luaL_setfuncs(L, base_funcs, 0);
+  /* set global _G */
+  lua_pushvalue(L, -1);
+  lua_setfield(L, -2, "_G");
+  /* set global _VERSION */
+  lua_pushliteral(L, LUA_VERSION);
+  lua_setfield(L, -2, "_VERSION");
+  return 1;
+}
+
diff --git a/libs/lua/lua-5.3.3/lbitlib.c b/libs/lua/lua-5.3.3/lbitlib.c
new file mode 100644
index 0000000..1cb1d5b
--- /dev/null
+++ b/libs/lua/lua-5.3.3/lbitlib.c
@@ -0,0 +1,233 @@
+/*
+** $Id: lbitlib.c,v 1.30 2015/11/11 19:08:09 roberto Exp $
+** Standard library for bitwise operations
+** See Copyright Notice in lua.h
+*/
+
+#define lbitlib_c
+#define LUA_LIB
+
+#include "lprefix.h"
+
+
+#include "lua.h"
+
+#include "lauxlib.h"
+#include "lualib.h"
+
+
+#if defined(LUA_COMPAT_BITLIB)		/* { */
+
+
+#define pushunsigned(L,n)	lua_pushinteger(L, (lua_Integer)(n))
+#define checkunsigned(L,i)	((lua_Unsigned)luaL_checkinteger(L,i))
+
+
+/* number of bits to consider in a number */
+#if !defined(LUA_NBITS)
+#define LUA_NBITS	32
+#endif
+
+
+/*
+** a lua_Unsigned with its first LUA_NBITS bits equal to 1. (Shift must
+** be made in two parts to avoid problems when LUA_NBITS is equal to the
+** number of bits in a lua_Unsigned.)
+*/
+#define ALLONES		(~(((~(lua_Unsigned)0) << (LUA_NBITS - 1)) << 1))
+
+
+/* macro to trim extra bits */
+#define trim(x)		((x) & ALLONES)
+
+
+/* builds a number with 'n' ones (1 <= n <= LUA_NBITS) */
+#define mask(n)		(~((ALLONES << 1) << ((n) - 1)))
+
+
+
+static lua_Unsigned andaux (lua_State *L) {
+  int i, n = lua_gettop(L);
+  lua_Unsigned r = ~(lua_Unsigned)0;
+  for (i = 1; i <= n; i++)
+    r &= checkunsigned(L, i);
+  return trim(r);
+}
+
+
+static int b_and (lua_State *L) {
+  lua_Unsigned r = andaux(L);
+  pushunsigned(L, r);
+  return 1;
+}
+
+
+static int b_test (lua_State *L) {
+  lua_Unsigned r = andaux(L);
+  lua_pushboolean(L, r != 0);
+  return 1;
+}
+
+
+static int b_or (lua_State *L) {
+  int i, n = lua_gettop(L);
+  lua_Unsigned r = 0;
+  for (i = 1; i <= n; i++)
+    r |= checkunsigned(L, i);
+  pushunsigned(L, trim(r));
+  return 1;
+}
+
+
+static int b_xor (lua_State *L) {
+  int i, n = lua_gettop(L);
+  lua_Unsigned r = 0;
+  for (i = 1; i <= n; i++)
+    r ^= checkunsigned(L, i);
+  pushunsigned(L, trim(r));
+  return 1;
+}
+
+
+static int b_not (lua_State *L) {
+  lua_Unsigned r = ~checkunsigned(L, 1);
+  pushunsigned(L, trim(r));
+  return 1;
+}
+
+
+static int b_shift (lua_State *L, lua_Unsigned r, lua_Integer i) {
+  if (i < 0) {  /* shift right? */
+    i = -i;
+    r = trim(r);
+    if (i >= LUA_NBITS) r = 0;
+    else r >>= i;
+  }
+  else {  /* shift left */
+    if (i >= LUA_NBITS) r = 0;
+    else r <<= i;
+    r = trim(r);
+  }
+  pushunsigned(L, r);
+  return 1;
+}
+
+
+static int b_lshift (lua_State *L) {
+  return b_shift(L, checkunsigned(L, 1), luaL_checkinteger(L, 2));
+}
+
+
+static int b_rshift (lua_State *L) {
+  return b_shift(L, checkunsigned(L, 1), -luaL_checkinteger(L, 2));
+}
+
+
+static int b_arshift (lua_State *L) {
+  lua_Unsigned r = checkunsigned(L, 1);
+  lua_Integer i = luaL_checkinteger(L, 2);
+  if (i < 0 || !(r & ((lua_Unsigned)1 << (LUA_NBITS - 1))))
+    return b_shift(L, r, -i);
+  else {  /* arithmetic shift for 'negative' number */
+    if (i >= LUA_NBITS) r = ALLONES;
+    else
+      r = trim((r >> i) | ~(trim(~(lua_Unsigned)0) >> i));  /* add signal bit */
+    pushunsigned(L, r);
+    return 1;
+  }
+}
+
+
+static int b_rot (lua_State *L, lua_Integer d) {
+  lua_Unsigned r = checkunsigned(L, 1);
+  int i = d & (LUA_NBITS - 1);  /* i = d % NBITS */
+  r = trim(r);
+  if (i != 0)  /* avoid undefined shift of LUA_NBITS when i == 0 */
+    r = (r << i) | (r >> (LUA_NBITS - i));
+  pushunsigned(L, trim(r));
+  return 1;
+}
+
+
+static int b_lrot (lua_State *L) {
+  return b_rot(L, luaL_checkinteger(L, 2));
+}
+
+
+static int b_rrot (lua_State *L) {
+  return b_rot(L, -luaL_checkinteger(L, 2));
+}
+
+
+/*
+** get field and width arguments for field-manipulation functions,
+** checking whether they are valid.
+** ('luaL_error' called without 'return' to avoid later warnings about
+** 'width' being used uninitialized.)
+*/
+static int fieldargs (lua_State *L, int farg, int *width) {
+  lua_Integer f = luaL_checkinteger(L, farg);
+  lua_Integer w = luaL_optinteger(L, farg + 1, 1);
+  luaL_argcheck(L, 0 <= f, farg, "field cannot be negative");
+  luaL_argcheck(L, 0 < w, farg + 1, "width must be positive");
+  if (f + w > LUA_NBITS)
+    luaL_error(L, "trying to access non-existent bits");
+  *width = (int)w;
+  return (int)f;
+}
+
+
+static int b_extract (lua_State *L) {
+  int w;
+  lua_Unsigned r = trim(checkunsigned(L, 1));
+  int f = fieldargs(L, 2, &w);
+  r = (r >> f) & mask(w);
+  pushunsigned(L, r);
+  return 1;
+}
+
+
+static int b_replace (lua_State *L) {
+  int w;
+  lua_Unsigned r = trim(checkunsigned(L, 1));
+  lua_Unsigned v = trim(checkunsigned(L, 2));
+  int f = fieldargs(L, 3, &w);
+  lua_Unsigned m = mask(w);
+  r = (r & ~(m << f)) | ((v & m) << f);
+  pushunsigned(L, r);
+  return 1;
+}
+
+
+static const luaL_Reg bitlib[] = {
+  {"arshift", b_arshift},
+  {"band", b_and},
+  {"bnot", b_not},
+  {"bor", b_or},
+  {"bxor", b_xor},
+  {"btest", b_test},
+  {"extract", b_extract},
+  {"lrotate", b_lrot},
+  {"lshift", b_lshift},
+  {"replace", b_replace},
+  {"rrotate", b_rrot},
+  {"rshift", b_rshift},
+  {NULL, NULL}
+};
+
+
+
+LUAMOD_API int luaopen_bit32 (lua_State *L) {
+  luaL_newlib(L, bitlib);
+  return 1;
+}
+
+
+#else					/* }{ */
+
+
+LUAMOD_API int luaopen_bit32 (lua_State *L) {
+  return luaL_error(L, "library 'bit32' has been deprecated");
+}
+
+#endif					/* } */
diff --git a/libs/lua/lua-5.3.3/lcode.c b/libs/lua/lua-5.3.3/lcode.c
new file mode 100644
index 0000000..2cd0dd2
--- /dev/null
+++ b/libs/lua/lua-5.3.3/lcode.c
@@ -0,0 +1,1199 @@
+/*
+** $Id: lcode.c,v 2.109 2016/05/13 19:09:21 roberto Exp $
+** Code generator for Lua
+** See Copyright Notice in lua.h
+*/
+
+#define lcode_c
+#define LUA_CORE
+
+#include "lprefix.h"
+
+
+#include <math.h>
+#include <stdlib.h>
+
+#include "lua.h"
+
+#include "lcode.h"
+#include "ldebug.h"
+#include "ldo.h"
+#include "lgc.h"
+#include "llex.h"
+#include "lmem.h"
+#include "lobject.h"
+#include "lopcodes.h"
+#include "lparser.h"
+#include "lstring.h"
+#include "ltable.h"
+#include "lvm.h"
+
+
+/* Maximum number of registers in a Lua function (must fit in 8 bits) */
+#define MAXREGS		255
+
+
+#define hasjumps(e)	((e)->t != (e)->f)
+
+
+/*
+** If expression is a numeric constant, fills 'v' with its value
+** and returns 1. Otherwise, returns 0.
+*/
+static int tonumeral(expdesc *e, TValue *v) {
+  if (hasjumps(e))
+    return 0;  /* not a numeral */
+  switch (e->k) {
+    case VKINT:
+      if (v) setivalue(v, e->u.ival);
+      return 1;
+    case VKFLT:
+      if (v) setfltvalue(v, e->u.nval);
+      return 1;
+    default: return 0;
+  }
+}
+
+
+/*
+** Create a OP_LOADNIL instruction, but try to optimize: if the previous
+** instruction is also OP_LOADNIL and ranges are compatible, adjust
+** range of previous instruction instead of emitting a new one. (For
+** instance, 'local a; local b' will generate a single opcode.)
+*/
+void luaK_nil (FuncState *fs, int from, int n) {
+  Instruction *previous;
+  int l = from + n - 1;  /* last register to set nil */
+  if (fs->pc > fs->lasttarget) {  /* no jumps to current position? */
+    previous = &fs->f->code[fs->pc-1];
+    if (GET_OPCODE(*previous) == OP_LOADNIL) {  /* previous is LOADNIL? */
+      int pfrom = GETARG_A(*previous);  /* get previous range */
+      int pl = pfrom + GETARG_B(*previous);
+      if ((pfrom <= from && from <= pl + 1) ||
+          (from <= pfrom && pfrom <= l + 1)) {  /* can connect both? */
+        if (pfrom < from) from = pfrom;  /* from = min(from, pfrom) */
+        if (pl > l) l = pl;  /* l = max(l, pl) */
+        SETARG_A(*previous, from);
+        SETARG_B(*previous, l - from);
+        return;
+      }
+    }  /* else go through */
+  }
+  luaK_codeABC(fs, OP_LOADNIL, from, n - 1, 0);  /* else no optimization */
+}
+
+
+/*
+** Gets the destination address of a jump instruction. Used to traverse
+** a list of jumps.
+*/ 
+static int getjump (FuncState *fs, int pc) {
+  int offset = GETARG_sBx(fs->f->code[pc]);
+  if (offset == NO_JUMP)  /* point to itself represents end of list */
+    return NO_JUMP;  /* end of list */
+  else
+    return (pc+1)+offset;  /* turn offset into absolute position */
+}
+
+
+/*
+** Fix jump instruction at position 'pc' to jump to 'dest'.
+** (Jump addresses are relative in Lua)
+*/
+static void fixjump (FuncState *fs, int pc, int dest) {
+  Instruction *jmp = &fs->f->code[pc];
+  int offset = dest - (pc + 1);
+  lua_assert(dest != NO_JUMP);
+  if (abs(offset) > MAXARG_sBx)
+    luaX_syntaxerror(fs->ls, "control structure too long");
+  SETARG_sBx(*jmp, offset);
+}
+
+
+/*
+** Concatenate jump-list 'l2' into jump-list 'l1'
+*/
+void luaK_concat (FuncState *fs, int *l1, int l2) {
+  if (l2 == NO_JUMP) return;  /* nothing to concatenate? */
+  else if (*l1 == NO_JUMP)  /* no original list? */
+    *l1 = l2;  /* 'l1' points to 'l2' */
+  else {
+    int list = *l1;
+    int next;
+    while ((next = getjump(fs, list)) != NO_JUMP)  /* find last element */
+      list = next;
+    fixjump(fs, list, l2);  /* last element links to 'l2' */
+  }
+}
+
+
+/*
+** Create a jump instruction and return its position, so its destination
+** can be fixed later (with 'fixjump'). If there are jumps to
+** this position (kept in 'jpc'), link them all together so that
+** 'patchlistaux' will fix all them directly to the final destination.
+*/
+int luaK_jump (FuncState *fs) {
+  int jpc = fs->jpc;  /* save list of jumps to here */
+  int j;
+  fs->jpc = NO_JUMP;  /* no more jumps to here */
+  j = luaK_codeAsBx(fs, OP_JMP, 0, NO_JUMP);
+  luaK_concat(fs, &j, jpc);  /* keep them on hold */
+  return j;
+}
+
+
+/*
+** Code a 'return' instruction
+*/
+void luaK_ret (FuncState *fs, int first, int nret) {
+  luaK_codeABC(fs, OP_RETURN, first, nret+1, 0);
+}
+
+
+/*
+** Code a "conditional jump", that is, a test or comparison opcode
+** followed by a jump. Return jump position.
+*/
+static int condjump (FuncState *fs, OpCode op, int A, int B, int C) {
+  luaK_codeABC(fs, op, A, B, C);
+  return luaK_jump(fs);
+}
+
+
+/*
+** returns current 'pc' and marks it as a jump target (to avoid wrong
+** optimizations with consecutive instructions not in the same basic block).
+*/
+int luaK_getlabel (FuncState *fs) {
+  fs->lasttarget = fs->pc;
+  return fs->pc;
+}
+
+
+/*
+** Returns the position of the instruction "controlling" a given
+** jump (that is, its condition), or the jump itself if it is
+** unconditional.
+*/
+static Instruction *getjumpcontrol (FuncState *fs, int pc) {
+  Instruction *pi = &fs->f->code[pc];
+  if (pc >= 1 && testTMode(GET_OPCODE(*(pi-1))))
+    return pi-1;
+  else
+    return pi;
+}
+
+
+/*
+** Patch destination register for a TESTSET instruction.
+** If instruction in position 'node' is not a TESTSET, return 0 ("fails").
+** Otherwise, if 'reg' is not 'NO_REG', set it as the destination
+** register. Otherwise, change instruction to a simple 'TEST' (produces
+** no register value)
+*/
+static int patchtestreg (FuncState *fs, int node, int reg) {
+  Instruction *i = getjumpcontrol(fs, node);
+  if (GET_OPCODE(*i) != OP_TESTSET)
+    return 0;  /* cannot patch other instructions */
+  if (reg != NO_REG && reg != GETARG_B(*i))
+    SETARG_A(*i, reg);
+  else {
+     /* no register to put value or register already has the value;
+        change instruction to simple test */
+    *i = CREATE_ABC(OP_TEST, GETARG_B(*i), 0, GETARG_C(*i));
+  }
+  return 1;
+}
+
+
+/*
+** Traverse a list of tests ensuring no one produces a value
+*/
+static void removevalues (FuncState *fs, int list) {
+  for (; list != NO_JUMP; list = getjump(fs, list))
+      patchtestreg(fs, list, NO_REG);
+}
+
+
+/*
+** Traverse a list of tests, patching their destination address and
+** registers: tests producing values jump to 'vtarget' (and put their
+** values in 'reg'), other tests jump to 'dtarget'.
+*/
+static void patchlistaux (FuncState *fs, int list, int vtarget, int reg,
+                          int dtarget) {
+  while (list != NO_JUMP) {
+    int next = getjump(fs, list);
+    if (patchtestreg(fs, list, reg))
+      fixjump(fs, list, vtarget);
+    else
+      fixjump(fs, list, dtarget);  /* jump to default target */
+    list = next;
+  }
+}
+
+
+/*
+** Ensure all pending jumps to current position are fixed (jumping
+** to current position with no values) and reset list of pending
+** jumps
+*/
+static void dischargejpc (FuncState *fs) {
+  patchlistaux(fs, fs->jpc, fs->pc, NO_REG, fs->pc);
+  fs->jpc = NO_JUMP;
+}
+
+
+/*
+** Add elements in 'list' to list of pending jumps to "here"
+** (current position)
+*/
+void luaK_patchtohere (FuncState *fs, int list) {
+  luaK_getlabel(fs);  /* mark "here" as a jump target */
+  luaK_concat(fs, &fs->jpc, list);
+}
+
+
+/*
+** Path all jumps in 'list' to jump to 'target'.
+** (The assert means that we cannot fix a jump to a forward address
+** because we only know addresses once code is generated.)
+*/
+void luaK_patchlist (FuncState *fs, int list, int target) {
+  if (target == fs->pc)  /* 'target' is current position? */
+    luaK_patchtohere(fs, list);  /* add list to pending jumps */
+  else {
+    lua_assert(target < fs->pc);
+    patchlistaux(fs, list, target, NO_REG, target);
+  }
+}
+
+
+/*
+** Path all jumps in 'list' to close upvalues up to given 'level'
+** (The assertion checks that jumps either were closing nothing
+** or were closing higher levels, from inner blocks.)
+*/
+void luaK_patchclose (FuncState *fs, int list, int level) {
+  level++;  /* argument is +1 to reserve 0 as non-op */
+  for (; list != NO_JUMP; list = getjump(fs, list)) {
+    lua_assert(GET_OPCODE(fs->f->code[list]) == OP_JMP &&
+                (GETARG_A(fs->f->code[list]) == 0 ||
+                 GETARG_A(fs->f->code[list]) >= level));
+    SETARG_A(fs->f->code[list], level);
+  }
+}
+
+
+/*
+** Emit instruction 'i', checking for array sizes and saving also its
+** line information. Return 'i' position.
+*/
+static int luaK_code (FuncState *fs, Instruction i) {
+  Proto *f = fs->f;
+  dischargejpc(fs);  /* 'pc' will change */
+  /* put new instruction in code array */
+  luaM_growvector(fs->ls->L, f->code, fs->pc, f->sizecode, Instruction,
+                  MAX_INT, "opcodes");
+  f->code[fs->pc] = i;
+  /* save corresponding line information */
+  luaM_growvector(fs->ls->L, f->lineinfo, fs->pc, f->sizelineinfo, int,
+                  MAX_INT, "opcodes");
+  f->lineinfo[fs->pc] = fs->ls->lastline;
+  return fs->pc++;
+}
+
+
+/*
+** Format and emit an 'iABC' instruction. (Assertions check consistency
+** of parameters versus opcode.)
+*/
+int luaK_codeABC (FuncState *fs, OpCode o, int a, int b, int c) {
+  lua_assert(getOpMode(o) == iABC);
+  lua_assert(getBMode(o) != OpArgN || b == 0);
+  lua_assert(getCMode(o) != OpArgN || c == 0);
+  lua_assert(a <= MAXARG_A && b <= MAXARG_B && c <= MAXARG_C);
+  return luaK_code(fs, CREATE_ABC(o, a, b, c));
+}
+
+
+/*
+** Format and emit an 'iABx' instruction.
+*/
+int luaK_codeABx (FuncState *fs, OpCode o, int a, unsigned int bc) {
+  lua_assert(getOpMode(o) == iABx || getOpMode(o) == iAsBx);
+  lua_assert(getCMode(o) == OpArgN);
+  lua_assert(a <= MAXARG_A && bc <= MAXARG_Bx);
+  return luaK_code(fs, CREATE_ABx(o, a, bc));
+}
+
+
+/*
+** Emit an "extra argument" instruction (format 'iAx')
+*/
+static int codeextraarg (FuncState *fs, int a) {
+  lua_assert(a <= MAXARG_Ax);
+  return luaK_code(fs, CREATE_Ax(OP_EXTRAARG, a));
+}
+
+
+/*
+** Emit a "load constant" instruction, using either 'OP_LOADK'
+** (if constant index 'k' fits in 18 bits) or an 'OP_LOADKX'
+** instruction with "extra argument".
+*/
+int luaK_codek (FuncState *fs, int reg, int k) {
+  if (k <= MAXARG_Bx)
+    return luaK_codeABx(fs, OP_LOADK, reg, k);
+  else {
+    int p = luaK_codeABx(fs, OP_LOADKX, reg, 0);
+    codeextraarg(fs, k);
+    return p;
+  }
+}
+
+
+/*
+** Check register-stack level, keeping track of its maximum size
+** in field 'maxstacksize'
+*/
+void luaK_checkstack (FuncState *fs, int n) {
+  int newstack = fs->freereg + n;
+  if (newstack > fs->f->maxstacksize) {
+    if (newstack >= MAXREGS)
+      luaX_syntaxerror(fs->ls,
+        "function or expression needs too many registers");
+    fs->f->maxstacksize = cast_byte(newstack);
+  }
+}
+
+
+/*
+** Reserve 'n' registers in register stack
+*/
+void luaK_reserveregs (FuncState *fs, int n) {
+  luaK_checkstack(fs, n);
+  fs->freereg += n;
+}
+
+
+/*
+** Free register 'reg', if it is neither a constant index nor
+** a local variable.
+)
+*/
+static void freereg (FuncState *fs, int reg) {
+  if (!ISK(reg) && reg >= fs->nactvar) {
+    fs->freereg--;
+    lua_assert(reg == fs->freereg);
+  }
+}
+
+
+/*
+** Free register used by expression 'e' (if any)
+*/
+static void freeexp (FuncState *fs, expdesc *e) {
+  if (e->k == VNONRELOC)
+    freereg(fs, e->u.info);
+}
+
+
+/*
+** Free registers used by expressions 'e1' and 'e2' (if any) in proper
+** order.
+*/
+static void freeexps (FuncState *fs, expdesc *e1, expdesc *e2) {
+  int r1 = (e1->k == VNONRELOC) ? e1->u.info : -1;
+  int r2 = (e2->k == VNONRELOC) ? e2->u.info : -1;
+  if (r1 > r2) {
+    freereg(fs, r1);
+    freereg(fs, r2);
+  }
+  else {
+    freereg(fs, r2);
+    freereg(fs, r1);
+  }
+}
+
+
+/*
+** Add constant 'v' to prototype's list of constants (field 'k').
+** Use scanner's table to cache position of constants in constant list
+** and try to reuse constants. Because some values should not be used
+** as keys (nil cannot be a key, integer keys can collapse with float
+** keys), the caller must provide a useful 'key' for indexing the cache.
+*/
+static int addk (FuncState *fs, TValue *key, TValue *v) {
+  lua_State *L = fs->ls->L;
+  Proto *f = fs->f;
+  TValue *idx = luaH_set(L, fs->ls->h, key);  /* index scanner table */
+  int k, oldsize;
+  if (ttisinteger(idx)) {  /* is there an index there? */
+    k = cast_int(ivalue(idx));
+    /* correct value? (warning: must distinguish floats from integers!) */
+    if (k < fs->nk && ttype(&f->k[k]) == ttype(v) &&
+                      luaV_rawequalobj(&f->k[k], v))
+      return k;  /* reuse index */
+  }
+  /* constant not found; create a new entry */
+  oldsize = f->sizek;
+  k = fs->nk;
+  /* numerical value does not need GC barrier;
+     table has no metatable, so it does not need to invalidate cache */
+  setivalue(idx, k);
+  luaM_growvector(L, f->k, k, f->sizek, TValue, MAXARG_Ax, "constants");
+  while (oldsize < f->sizek) setnilvalue(&f->k[oldsize++]);
+  setobj(L, &f->k[k], v);
+  fs->nk++;
+  luaC_barrier(L, f, v);
+  return k;
+}
+
+
+/*
+** Add a string to list of constants and return its index.
+*/
+int luaK_stringK (FuncState *fs, TString *s) {
+  TValue o;
+  setsvalue(fs->ls->L, &o, s);
+  return addk(fs, &o, &o);  /* use string itself as key */
+}
+
+
+/*
+** Add an integer to list of constants and return its index.
+** Integers use userdata as keys to avoid collision with floats with
+** same value; conversion to 'void*' is used only for hashing, so there
+** are no "precision" problems.
+*/
+int luaK_intK (FuncState *fs, lua_Integer n) {
+  TValue k, o;
+  setpvalue(&k, cast(void*, cast(size_t, n)));
+  setivalue(&o, n);
+  return addk(fs, &k, &o);
+}
+
+/*
+** Add a float to list of constants and return its index.
+*/
+static int luaK_numberK (FuncState *fs, lua_Number r) {
+  TValue o;
+  setfltvalue(&o, r);
+  return addk(fs, &o, &o);  /* use number itself as key */
+}
+
+
+/*
+** Add a boolean to list of constants and return its index.
+*/
+static int boolK (FuncState *fs, int b) {
+  TValue o;
+  setbvalue(&o, b);
+  return addk(fs, &o, &o);  /* use boolean itself as key */
+}
+
+
+/*
+** Add nil to list of constants and return its index.
+*/
+static int nilK (FuncState *fs) {
+  TValue k, v;
+  setnilvalue(&v);
+  /* cannot use nil as key; instead use table itself to represent nil */
+  sethvalue(fs->ls->L, &k, fs->ls->h);
+  return addk(fs, &k, &v);
+}
+
+
+/*
+** Fix an expression to return the number of results 'nresults'.
+** Either 'e' is a multi-ret expression (function call or vararg)
+** or 'nresults' is LUA_MULTRET (as any expression can satisfy that).
+*/
+void luaK_setreturns (FuncState *fs, expdesc *e, int nresults) {
+  if (e->k == VCALL) {  /* expression is an open function call? */
+    SETARG_C(getinstruction(fs, e), nresults + 1);
+  }
+  else if (e->k == VVARARG) {
+    Instruction *pc = &getinstruction(fs, e);
+    SETARG_B(*pc, nresults + 1);
+    SETARG_A(*pc, fs->freereg);
+    luaK_reserveregs(fs, 1);
+  }
+  else lua_assert(nresults == LUA_MULTRET);
+}
+
+
+/*
+** Fix an expression to return one result.
+** If expression is not a multi-ret expression (function call or
+** vararg), it already returns one result, so nothing needs to be done.
+** Function calls become VNONRELOC expressions (as its result comes
+** fixed in the base register of the call), while vararg expressions
+** become VRELOCABLE (as OP_VARARG puts its results where it wants).
+** (Calls are created returning one result, so that does not need
+** to be fixed.)
+*/
+void luaK_setoneret (FuncState *fs, expdesc *e) {
+  if (e->k == VCALL) {  /* expression is an open function call? */
+    /* already returns 1 value */
+    lua_assert(GETARG_C(getinstruction(fs, e)) == 2);
+    e->k = VNONRELOC;  /* result has fixed position */
+    e->u.info = GETARG_A(getinstruction(fs, e));
+  }
+  else if (e->k == VVARARG) {
+    SETARG_B(getinstruction(fs, e), 2);
+    e->k = VRELOCABLE;  /* can relocate its simple result */
+  }
+}
+
+
+/*
+** Ensure that expression 'e' is not a variable.
+*/
+void luaK_dischargevars (FuncState *fs, expdesc *e) {
+  switch (e->k) {
+    case VLOCAL: {  /* already in a register */
+      e->k = VNONRELOC;  /* becomes a non-relocatable value */
+      break;
+    }
+    case VUPVAL: {  /* move value to some (pending) register */
+      e->u.info = luaK_codeABC(fs, OP_GETUPVAL, 0, e->u.info, 0);
+      e->k = VRELOCABLE;
+      break;
+    }
+    case VINDEXED: {
+      OpCode op;
+      freereg(fs, e->u.ind.idx);
+      if (e->u.ind.vt == VLOCAL) {  /* is 't' in a register? */
+        freereg(fs, e->u.ind.t);
+        op = OP_GETTABLE;
+      }
+      else {
+        lua_assert(e->u.ind.vt == VUPVAL);
+        op = OP_GETTABUP;  /* 't' is in an upvalue */
+      }
+      e->u.info = luaK_codeABC(fs, op, 0, e->u.ind.t, e->u.ind.idx);
+      e->k = VRELOCABLE;
+      break;
+    }
+    case VVARARG: case VCALL: {
+      luaK_setoneret(fs, e);
+      break;
+    }
+    default: break;  /* there is one value available (somewhere) */
+  }
+}
+
+
+/*
+** Ensures expression value is in register 'reg' (and therefore
+** 'e' will become a non-relocatable expression).
+*/
+static void discharge2reg (FuncState *fs, expdesc *e, int reg) {
+  luaK_dischargevars(fs, e);
+  switch (e->k) {
+    case VNIL: {
+      luaK_nil(fs, reg, 1);
+      break;
+    }
+    case VFALSE: case VTRUE: {
+      luaK_codeABC(fs, OP_LOADBOOL, reg, e->k == VTRUE, 0);
+      break;
+    }
+    case VK: {
+      luaK_codek(fs, reg, e->u.info);
+      break;
+    }
+    case VKFLT: {
+      luaK_codek(fs, reg, luaK_numberK(fs, e->u.nval));
+      break;
+    }
+    case VKINT: {
+      luaK_codek(fs, reg, luaK_intK(fs, e->u.ival));
+      break;
+    }
+    case VRELOCABLE: {
+      Instruction *pc = &getinstruction(fs, e);
+      SETARG_A(*pc, reg);  /* instruction will put result in 'reg' */
+      break;
+    }
+    case VNONRELOC: {
+      if (reg != e->u.info)
+        luaK_codeABC(fs, OP_MOVE, reg, e->u.info, 0);
+      break;
+    }
+    default: {
+      lua_assert(e->k == VJMP);
+      return;  /* nothing to do... */
+    }
+  }
+  e->u.info = reg;
+  e->k = VNONRELOC;
+}
+
+
+/*
+** Ensures expression value is in any register.
+*/
+static void discharge2anyreg (FuncState *fs, expdesc *e) {
+  if (e->k != VNONRELOC) {  /* no fixed register yet? */
+    luaK_reserveregs(fs, 1);  /* get a register */
+    discharge2reg(fs, e, fs->freereg-1);  /* put value there */
+  }
+}
+
+
+static int code_loadbool (FuncState *fs, int A, int b, int jump) {
+  luaK_getlabel(fs);  /* those instructions may be jump targets */
+  return luaK_codeABC(fs, OP_LOADBOOL, A, b, jump);
+}
+
+
+/*
+** check whether list has any jump that do not produce a value
+** or produce an inverted value
+*/
+static int need_value (FuncState *fs, int list) {
+  for (; list != NO_JUMP; list = getjump(fs, list)) {
+    Instruction i = *getjumpcontrol(fs, list);
+    if (GET_OPCODE(i) != OP_TESTSET) return 1;
+  }
+  return 0;  /* not found */
+}
+
+
+/*
+** Ensures final expression result (including results from its jump
+** lists) is in register 'reg'.
+** If expression has jumps, need to patch these jumps either to
+** its final position or to "load" instructions (for those tests
+** that do not produce values).
+*/
+static void exp2reg (FuncState *fs, expdesc *e, int reg) {
+  discharge2reg(fs, e, reg);
+  if (e->k == VJMP)  /* expression itself is a test? */
+    luaK_concat(fs, &e->t, e->u.info);  /* put this jump in 't' list */
+  if (hasjumps(e)) {
+    int final;  /* position after whole expression */
+    int p_f = NO_JUMP;  /* position of an eventual LOAD false */
+    int p_t = NO_JUMP;  /* position of an eventual LOAD true */
+    if (need_value(fs, e->t) || need_value(fs, e->f)) {
+      int fj = (e->k == VJMP) ? NO_JUMP : luaK_jump(fs);
+      p_f = code_loadbool(fs, reg, 0, 1);
+      p_t = code_loadbool(fs, reg, 1, 0);
+      luaK_patchtohere(fs, fj);
+    }
+    final = luaK_getlabel(fs);
+    patchlistaux(fs, e->f, final, reg, p_f);
+    patchlistaux(fs, e->t, final, reg, p_t);
+  }
+  e->f = e->t = NO_JUMP;
+  e->u.info = reg;
+  e->k = VNONRELOC;
+}
+
+
+/*
+** Ensures final expression result (including results from its jump
+** lists) is in next available register.
+*/
+void luaK_exp2nextreg (FuncState *fs, expdesc *e) {
+  luaK_dischargevars(fs, e);
+  freeexp(fs, e);
+  luaK_reserveregs(fs, 1);
+  exp2reg(fs, e, fs->freereg - 1);
+}
+
+
+/*
+** Ensures final expression result (including results from its jump
+** lists) is in some (any) register and return that register.
+*/
+int luaK_exp2anyreg (FuncState *fs, expdesc *e) {
+  luaK_dischargevars(fs, e);
+  if (e->k == VNONRELOC) {  /* expression already has a register? */
+    if (!hasjumps(e))  /* no jumps? */
+      return e->u.info;  /* result is already in a register */
+    if (e->u.info >= fs->nactvar) {  /* reg. is not a local? */
+      exp2reg(fs, e, e->u.info);  /* put final result in it */
+      return e->u.info;
+    }
+  }
+  luaK_exp2nextreg(fs, e);  /* otherwise, use next available register */
+  return e->u.info;
+}
+
+
+/*
+** Ensures final expression result is either in a register or in an
+** upvalue.
+*/
+void luaK_exp2anyregup (FuncState *fs, expdesc *e) {
+  if (e->k != VUPVAL || hasjumps(e))
+    luaK_exp2anyreg(fs, e);
+}
+
+
+/*
+** Ensures final expression result is either in a register or it is
+** a constant.
+*/
+void luaK_exp2val (FuncState *fs, expdesc *e) {
+  if (hasjumps(e))
+    luaK_exp2anyreg(fs, e);
+  else
+    luaK_dischargevars(fs, e);
+}
+
+
+/*
+** Ensures final expression result is in a valid R/K index
+** (that is, it is either in a register or in 'k' with an index
+** in the range of R/K indices).
+** Returns R/K index.
+*/  
+int luaK_exp2RK (FuncState *fs, expdesc *e) {
+  luaK_exp2val(fs, e);
+  switch (e->k) {  /* move constants to 'k' */
+    case VTRUE: e->u.info = boolK(fs, 1); goto vk;
+    case VFALSE: e->u.info = boolK(fs, 0); goto vk;
+    case VNIL: e->u.info = nilK(fs); goto vk;
+    case VKINT: e->u.info = luaK_intK(fs, e->u.ival); goto vk;
+    case VKFLT: e->u.info = luaK_numberK(fs, e->u.nval); goto vk;
+    case VK:
+     vk:
+      e->k = VK;
+      if (e->u.info <= MAXINDEXRK)  /* constant fits in 'argC'? */
+        return RKASK(e->u.info);
+      else break;
+    default: break;
+  }
+  /* not a constant in the right range: put it in a register */
+  return luaK_exp2anyreg(fs, e);
+}
+
+
+/*
+** Generate code to store result of expression 'ex' into variable 'var'.
+*/
+void luaK_storevar (FuncState *fs, expdesc *var, expdesc *ex) {
+  switch (var->k) {
+    case VLOCAL: {
+      freeexp(fs, ex);
+      exp2reg(fs, ex, var->u.info);  /* compute 'ex' into proper place */
+      return;
+    }
+    case VUPVAL: {
+      int e = luaK_exp2anyreg(fs, ex);
+      luaK_codeABC(fs, OP_SETUPVAL, e, var->u.info, 0);
+      break;
+    }
+    case VINDEXED: {
+      OpCode op = (var->u.ind.vt == VLOCAL) ? OP_SETTABLE : OP_SETTABUP;
+      int e = luaK_exp2RK(fs, ex);
+      luaK_codeABC(fs, op, var->u.ind.t, var->u.ind.idx, e);
+      break;
+    }
+    default: lua_assert(0);  /* invalid var kind to store */
+  }
+  freeexp(fs, ex);
+}
+
+
+/*
+** Emit SELF instruction (convert expression 'e' into 'e:key(e,').
+*/
+void luaK_self (FuncState *fs, expdesc *e, expdesc *key) {
+  int ereg;
+  luaK_exp2anyreg(fs, e);
+  ereg = e->u.info;  /* register where 'e' was placed */
+  freeexp(fs, e);
+  e->u.info = fs->freereg;  /* base register for op_self */
+  e->k = VNONRELOC;  /* self expression has a fixed register */
+  luaK_reserveregs(fs, 2);  /* function and 'self' produced by op_self */
+  luaK_codeABC(fs, OP_SELF, e->u.info, ereg, luaK_exp2RK(fs, key));
+  freeexp(fs, key);
+}
+
+
+/*
+** Negate condition 'e' (where 'e' is a comparison).
+*/
+static void negatecondition (FuncState *fs, expdesc *e) {
+  Instruction *pc = getjumpcontrol(fs, e->u.info);
+  lua_assert(testTMode(GET_OPCODE(*pc)) && GET_OPCODE(*pc) != OP_TESTSET &&
+                                           GET_OPCODE(*pc) != OP_TEST);
+  SETARG_A(*pc, !(GETARG_A(*pc)));
+}
+
+
+/*
+** Emit instruction to jump if 'e' is 'cond' (that is, if 'cond'
+** is true, code will jump if 'e' is true.) Return jump position.
+** Optimize when 'e' is 'not' something, inverting the condition
+** and removing the 'not'.
+*/
+static int jumponcond (FuncState *fs, expdesc *e, int cond) {
+  if (e->k == VRELOCABLE) {
+    Instruction ie = getinstruction(fs, e);
+    if (GET_OPCODE(ie) == OP_NOT) {
+      fs->pc--;  /* remove previous OP_NOT */
+      return condjump(fs, OP_TEST, GETARG_B(ie), 0, !cond);
+    }
+    /* else go through */
+  }
+  discharge2anyreg(fs, e);
+  freeexp(fs, e);
+  return condjump(fs, OP_TESTSET, NO_REG, e->u.info, cond);
+}
+
+
+/*
+** Emit code to go through if 'e' is true, jump otherwise.
+*/
+void luaK_goiftrue (FuncState *fs, expdesc *e) {
+  int pc;  /* pc of new jump */
+  luaK_dischargevars(fs, e);
+  switch (e->k) {
+    case VJMP: {  /* condition? */
+      negatecondition(fs, e);  /* jump when it is false */
+      pc = e->u.info;  /* save jump position */
+      break;
+    }
+    case VK: case VKFLT: case VKINT: case VTRUE: {
+      pc = NO_JUMP;  /* always true; do nothing */
+      break;
+    }
+    default: {
+      pc = jumponcond(fs, e, 0);  /* jump when false */
+      break;
+    }
+  }
+  luaK_concat(fs, &e->f, pc);  /* insert new jump in false list */
+  luaK_patchtohere(fs, e->t);  /* true list jumps to here (to go through) */
+  e->t = NO_JUMP;
+}
+
+
+/*
+** Emit code to go through if 'e' is false, jump otherwise.
+*/
+void luaK_goiffalse (FuncState *fs, expdesc *e) {
+  int pc;  /* pc of new jump */
+  luaK_dischargevars(fs, e);
+  switch (e->k) {
+    case VJMP: {
+      pc = e->u.info;  /* already jump if true */
+      break;
+    }
+    case VNIL: case VFALSE: {
+      pc = NO_JUMP;  /* always false; do nothing */
+      break;
+    }
+    default: {
+      pc = jumponcond(fs, e, 1);  /* jump if true */
+      break;
+    }
+  }
+  luaK_concat(fs, &e->t, pc);  /* insert new jump in 't' list */
+  luaK_patchtohere(fs, e->f);  /* false list jumps to here (to go through) */
+  e->f = NO_JUMP;
+}
+
+
+/*
+** Code 'not e', doing constant folding.
+*/
+static void codenot (FuncState *fs, expdesc *e) {
+  luaK_dischargevars(fs, e);
+  switch (e->k) {
+    case VNIL: case VFALSE: {
+      e->k = VTRUE;  /* true == not nil == not false */
+      break;
+    }
+    case VK: case VKFLT: case VKINT: case VTRUE: {
+      e->k = VFALSE;  /* false == not "x" == not 0.5 == not 1 == not true */
+      break;
+    }
+    case VJMP: {
+      negatecondition(fs, e);
+      break;
+    }
+    case VRELOCABLE:
+    case VNONRELOC: {
+      discharge2anyreg(fs, e);
+      freeexp(fs, e);
+      e->u.info = luaK_codeABC(fs, OP_NOT, 0, e->u.info, 0);
+      e->k = VRELOCABLE;
+      break;
+    }
+    default: lua_assert(0);  /* cannot happen */
+  }
+  /* interchange true and false lists */
+  { int temp = e->f; e->f = e->t; e->t = temp; }
+  removevalues(fs, e->f);  /* values are useless when negated */
+  removevalues(fs, e->t);
+}
+
+
+/*
+** Create expression 't[k]'. 't' must have its final result already in a
+** register or upvalue.
+*/
+void luaK_indexed (FuncState *fs, expdesc *t, expdesc *k) {
+  lua_assert(!hasjumps(t) && (vkisinreg(t->k) || t->k == VUPVAL));
+  t->u.ind.t = t->u.info;  /* register or upvalue index */
+  t->u.ind.idx = luaK_exp2RK(fs, k);  /* R/K index for key */
+  t->u.ind.vt = (t->k == VUPVAL) ? VUPVAL : VLOCAL;
+  t->k = VINDEXED;
+}
+
+
+/*
+** Return false if folding can raise an error.
+** Bitwise operations need operands convertible to integers; division
+** operations cannot have 0 as divisor.
+*/
+static int validop (int op, TValue *v1, TValue *v2) {
+  switch (op) {
+    case LUA_OPBAND: case LUA_OPBOR: case LUA_OPBXOR:
+    case LUA_OPSHL: case LUA_OPSHR: case LUA_OPBNOT: {  /* conversion errors */
+      lua_Integer i;
+      return (tointeger(v1, &i) && tointeger(v2, &i));
+    }
+    case LUA_OPDIV: case LUA_OPIDIV: case LUA_OPMOD:  /* division by 0 */
+      return (nvalue(v2) != 0);
+    default: return 1;  /* everything else is valid */
+  }
+}
+
+
+/*
+** Try to "constant-fold" an operation; return 1 iff successful.
+** (In this case, 'e1' has the final result.)
+*/
+static int constfolding (FuncState *fs, int op, expdesc *e1, expdesc *e2) {
+  TValue v1, v2, res;
+  if (!tonumeral(e1, &v1) || !tonumeral(e2, &v2) || !validop(op, &v1, &v2))
+    return 0;  /* non-numeric operands or not safe to fold */
+  luaO_arith(fs->ls->L, op, &v1, &v2, &res);  /* does operation */
+  if (ttisinteger(&res)) {
+    e1->k = VKINT;
+    e1->u.ival = ivalue(&res);
+  }
+  else {  /* folds neither NaN nor 0.0 (to avoid problems with -0.0) */
+    lua_Number n = fltvalue(&res);
+    if (luai_numisnan(n) || n == 0)
+      return 0;
+    e1->k = VKFLT;
+    e1->u.nval = n;
+  }
+  return 1;
+}
+
+
+/*
+** Emit code for unary expressions that "produce values"
+** (everything but 'not').
+** Expression to produce final result will be encoded in 'e'.
+*/
+static void codeunexpval (FuncState *fs, OpCode op, expdesc *e, int line) {
+  int r = luaK_exp2anyreg(fs, e);  /* opcodes operate only on registers */
+  freeexp(fs, e);
+  e->u.info = luaK_codeABC(fs, op, 0, r, 0);  /* generate opcode */
+  e->k = VRELOCABLE;  /* all those operations are relocatable */
+  luaK_fixline(fs, line);
+}
+
+
+/*
+** Emit code for binary expressions that "produce values"
+** (everything but logical operators 'and'/'or' and comparison
+** operators).
+** Expression to produce final result will be encoded in 'e1'.
+*/
+static void codebinexpval (FuncState *fs, OpCode op,
+                           expdesc *e1, expdesc *e2, int line) {
+  int rk1 = luaK_exp2RK(fs, e1);  /* both operands are "RK" */
+  int rk2 = luaK_exp2RK(fs, e2);
+  freeexps(fs, e1, e2);
+  e1->u.info = luaK_codeABC(fs, op, 0, rk1, rk2);  /* generate opcode */
+  e1->k = VRELOCABLE;  /* all those operations are relocatable */
+  luaK_fixline(fs, line);
+}
+
+
+/*
+** Emit code for comparisons.
+** 'e1' was already put in R/K form by 'luaK_infix'.
+*/
+static void codecomp (FuncState *fs, BinOpr opr, expdesc *e1, expdesc *e2) {
+  int rk1 = (e1->k == VK) ? RKASK(e1->u.info)
+                          : check_exp(e1->k == VNONRELOC, e1->u.info);
+  int rk2 = luaK_exp2RK(fs, e2);
+  freeexps(fs, e1, e2);
+  switch (opr) {
+    case OPR_NE: {  /* '(a ~= b)' ==> 'not (a == b)' */
+      e1->u.info = condjump(fs, OP_EQ, 0, rk1, rk2);
+      break;
+    }
+    case OPR_GT: case OPR_GE: {
+      /* '(a > b)' ==> '(b < a)';  '(a >= b)' ==> '(b <= a)' */
+      OpCode op = cast(OpCode, (opr - OPR_NE) + OP_EQ);
+      e1->u.info = condjump(fs, op, 1, rk2, rk1);  /* invert operands */
+      break;
+    }
+    default: {  /* '==', '<', '<=' use their own opcodes */
+      OpCode op = cast(OpCode, (opr - OPR_EQ) + OP_EQ);
+      e1->u.info = condjump(fs, op, 1, rk1, rk2);
+      break;
+    }
+  }
+  e1->k = VJMP;
+}
+
+
+/*
+** Aplly prefix operation 'op' to expression 'e'.
+*/
+void luaK_prefix (FuncState *fs, UnOpr op, expdesc *e, int line) {
+  static expdesc ef = {VKINT, {0}, NO_JUMP, NO_JUMP};  /* fake 2nd operand */
+  switch (op) {
+    case OPR_MINUS: case OPR_BNOT:
+      if (constfolding(fs, op + LUA_OPUNM, e, &ef))
+        break;
+      /* FALLTHROUGH */
+    case OPR_LEN:
+      codeunexpval(fs, cast(OpCode, op + OP_UNM), e, line);
+      break;
+    case OPR_NOT: codenot(fs, e); break;
+    default: lua_assert(0);
+  }
+}
+
+
+/*
+** Process 1st operand 'v' of binary operation 'op' before reading
+** 2nd operand.
+*/
+void luaK_infix (FuncState *fs, BinOpr op, expdesc *v) {
+  switch (op) {
+    case OPR_AND: {
+      luaK_goiftrue(fs, v);  /* go ahead only if 'v' is true */
+      break;
+    }
+    case OPR_OR: {
+      luaK_goiffalse(fs, v);  /* go ahead only if 'v' is false */
+      break;
+    }
+    case OPR_CONCAT: {
+      luaK_exp2nextreg(fs, v);  /* operand must be on the 'stack' */
+      break;
+    }
+    case OPR_ADD: case OPR_SUB:
+    case OPR_MUL: case OPR_DIV: case OPR_IDIV:
+    case OPR_MOD: case OPR_POW:
+    case OPR_BAND: case OPR_BOR: case OPR_BXOR:
+    case OPR_SHL: case OPR_SHR: {
+      if (!tonumeral(v, NULL))
+        luaK_exp2RK(fs, v);
+      /* else keep numeral, which may be folded with 2nd operand */
+      break;
+    }
+    default: {
+      luaK_exp2RK(fs, v);
+      break;
+    }
+  }
+}
+
+
+/*
+** Finalize code for binary operation, after reading 2nd operand.
+** For '(a .. b .. c)' (which is '(a .. (b .. c))', because
+** concatenation is right associative), merge second CONCAT into first
+** one.
+*/
+void luaK_posfix (FuncState *fs, BinOpr op,
+                  expdesc *e1, expdesc *e2, int line) {
+  switch (op) {
+    case OPR_AND: {
+      lua_assert(e1->t == NO_JUMP);  /* list closed by 'luK_infix' */
+      luaK_dischargevars(fs, e2);
+      luaK_concat(fs, &e2->f, e1->f);
+      *e1 = *e2;
+      break;
+    }
+    case OPR_OR: {
+      lua_assert(e1->f == NO_JUMP);  /* list closed by 'luK_infix' */
+      luaK_dischargevars(fs, e2);
+      luaK_concat(fs, &e2->t, e1->t);
+      *e1 = *e2;
+      break;
+    }
+    case OPR_CONCAT: {
+      luaK_exp2val(fs, e2);
+      if (e2->k == VRELOCABLE &&
+          GET_OPCODE(getinstruction(fs, e2)) == OP_CONCAT) {
+        lua_assert(e1->u.info == GETARG_B(getinstruction(fs, e2))-1);
+        freeexp(fs, e1);
+        SETARG_B(getinstruction(fs, e2), e1->u.info);
+        e1->k = VRELOCABLE; e1->u.info = e2->u.info;
+      }
+      else {
+        luaK_exp2nextreg(fs, e2);  /* operand must be on the 'stack' */
+        codebinexpval(fs, OP_CONCAT, e1, e2, line);
+      }
+      break;
+    }
+    case OPR_ADD: case OPR_SUB: case OPR_MUL: case OPR_DIV:
+    case OPR_IDIV: case OPR_MOD: case OPR_POW:
+    case OPR_BAND: case OPR_BOR: case OPR_BXOR:
+    case OPR_SHL: case OPR_SHR: {
+      if (!constfolding(fs, op + LUA_OPADD, e1, e2))
+        codebinexpval(fs, cast(OpCode, op + OP_ADD), e1, e2, line);
+      break;
+    }
+    case OPR_EQ: case OPR_LT: case OPR_LE:
+    case OPR_NE: case OPR_GT: case OPR_GE: {
+      codecomp(fs, op, e1, e2);
+      break;
+    }
+    default: lua_assert(0);
+  }
+}
+
+
+/*
+** Change line information associated with current position.
+*/
+void luaK_fixline (FuncState *fs, int line) {
+  fs->f->lineinfo[fs->pc - 1] = line;
+}
+
+
+/*
+** Emit a SETLIST instruction.
+** 'base' is register that keeps table;
+** 'nelems' is #table plus those to be stored now;
+** 'tostore' is number of values (in registers 'base + 1',...) to add to
+** table (or LUA_MULTRET to add up to stack top).
+*/
+void luaK_setlist (FuncState *fs, int base, int nelems, int tostore) {
+  int c =  (nelems - 1)/LFIELDS_PER_FLUSH + 1;
+  int b = (tostore == LUA_MULTRET) ? 0 : tostore;
+  lua_assert(tostore != 0 && tostore <= LFIELDS_PER_FLUSH);
+  if (c <= MAXARG_C)
+    luaK_codeABC(fs, OP_SETLIST, base, b, c);
+  else if (c <= MAXARG_Ax) {
+    luaK_codeABC(fs, OP_SETLIST, base, b, 0);
+    codeextraarg(fs, c);
+  }
+  else
+    luaX_syntaxerror(fs->ls, "constructor too long");
+  fs->freereg = base + 1;  /* free registers with list values */
+}
+
diff --git a/libs/lua/lua-5.3.3/lcode.h b/libs/lua/lua-5.3.3/lcode.h
new file mode 100644
index 0000000..cd306d5
--- /dev/null
+++ b/libs/lua/lua-5.3.3/lcode.h
@@ -0,0 +1,88 @@
+/*
+** $Id: lcode.h,v 1.64 2016/01/05 16:22:37 roberto Exp $
+** Code generator for Lua
+** See Copyright Notice in lua.h
+*/
+
+#ifndef lcode_h
+#define lcode_h
+
+#include "llex.h"
+#include "lobject.h"
+#include "lopcodes.h"
+#include "lparser.h"
+
+
+/*
+** Marks the end of a patch list. It is an invalid value both as an absolute
+** address, and as a list link (would link an element to itself).
+*/
+#define NO_JUMP (-1)
+
+
+/*
+** grep "ORDER OPR" if you change these enums  (ORDER OP)
+*/
+typedef enum BinOpr {
+  OPR_ADD, OPR_SUB, OPR_MUL, OPR_MOD, OPR_POW,
+  OPR_DIV,
+  OPR_IDIV,
+  OPR_BAND, OPR_BOR, OPR_BXOR,
+  OPR_SHL, OPR_SHR,
+  OPR_CONCAT,
+  OPR_EQ, OPR_LT, OPR_LE,
+  OPR_NE, OPR_GT, OPR_GE,
+  OPR_AND, OPR_OR,
+  OPR_NOBINOPR
+} BinOpr;
+
+
+typedef enum UnOpr { OPR_MINUS, OPR_BNOT, OPR_NOT, OPR_LEN, OPR_NOUNOPR } UnOpr;
+
+
+/* get (pointer to) instruction of given 'expdesc' */
+#define getinstruction(fs,e)	((fs)->f->code[(e)->u.info])
+
+#define luaK_codeAsBx(fs,o,A,sBx)	luaK_codeABx(fs,o,A,(sBx)+MAXARG_sBx)
+
+#define luaK_setmultret(fs,e)	luaK_setreturns(fs, e, LUA_MULTRET)
+
+#define luaK_jumpto(fs,t)	luaK_patchlist(fs, luaK_jump(fs), t)
+
+LUAI_FUNC int luaK_codeABx (FuncState *fs, OpCode o, int A, unsigned int Bx);
+LUAI_FUNC int luaK_codeABC (FuncState *fs, OpCode o, int A, int B, int C);
+LUAI_FUNC int luaK_codek (FuncState *fs, int reg, int k);
+LUAI_FUNC void luaK_fixline (FuncState *fs, int line);
+LUAI_FUNC void luaK_nil (FuncState *fs, int from, int n);
+LUAI_FUNC void luaK_reserveregs (FuncState *fs, int n);
+LUAI_FUNC void luaK_checkstack (FuncState *fs, int n);
+LUAI_FUNC int luaK_stringK (FuncState *fs, TString *s);
+LUAI_FUNC int luaK_intK (FuncState *fs, lua_Integer n);
+LUAI_FUNC void luaK_dischargevars (FuncState *fs, expdesc *e);
+LUAI_FUNC int luaK_exp2anyreg (FuncState *fs, expdesc *e);
+LUAI_FUNC void luaK_exp2anyregup (FuncState *fs, expdesc *e);
+LUAI_FUNC void luaK_exp2nextreg (FuncState *fs, expdesc *e);
+LUAI_FUNC void luaK_exp2val (FuncState *fs, expdesc *e);
+LUAI_FUNC int luaK_exp2RK (FuncState *fs, expdesc *e);
+LUAI_FUNC void luaK_self (FuncState *fs, expdesc *e, expdesc *key);
+LUAI_FUNC void luaK_indexed (FuncState *fs, expdesc *t, expdesc *k);
+LUAI_FUNC void luaK_goiftrue (FuncState *fs, expdesc *e);
+LUAI_FUNC void luaK_goiffalse (FuncState *fs, expdesc *e);
+LUAI_FUNC void luaK_storevar (FuncState *fs, expdesc *var, expdesc *e);
+LUAI_FUNC void luaK_setreturns (FuncState *fs, expdesc *e, int nresults);
+LUAI_FUNC void luaK_setoneret (FuncState *fs, expdesc *e);
+LUAI_FUNC int luaK_jump (FuncState *fs);
+LUAI_FUNC void luaK_ret (FuncState *fs, int first, int nret);
+LUAI_FUNC void luaK_patchlist (FuncState *fs, int list, int target);
+LUAI_FUNC void luaK_patchtohere (FuncState *fs, int list);
+LUAI_FUNC void luaK_patchclose (FuncState *fs, int list, int level);
+LUAI_FUNC void luaK_concat (FuncState *fs, int *l1, int l2);
+LUAI_FUNC int luaK_getlabel (FuncState *fs);
+LUAI_FUNC void luaK_prefix (FuncState *fs, UnOpr op, expdesc *v, int line);
+LUAI_FUNC void luaK_infix (FuncState *fs, BinOpr op, expdesc *v);
+LUAI_FUNC void luaK_posfix (FuncState *fs, BinOpr op, expdesc *v1,
+                            expdesc *v2, int line);
+LUAI_FUNC void luaK_setlist (FuncState *fs, int base, int nelems, int tostore);
+
+
+#endif
diff --git a/libs/lua/lua-5.3.3/lcorolib.c b/libs/lua/lua-5.3.3/lcorolib.c
new file mode 100644
index 0000000..2303429
--- /dev/null
+++ b/libs/lua/lua-5.3.3/lcorolib.c
@@ -0,0 +1,168 @@
+/*
+** $Id: lcorolib.c,v 1.10 2016/04/11 19:19:55 roberto Exp $
+** Coroutine Library
+** See Copyright Notice in lua.h
+*/
+
+#define lcorolib_c
+#define LUA_LIB
+
+#include "lprefix.h"
+
+
+#include <stdlib.h>
+
+#include "lua.h"
+
+#include "lauxlib.h"
+#include "lualib.h"
+
+
+static lua_State *getco (lua_State *L) {
+  lua_State *co = lua_tothread(L, 1);
+  luaL_argcheck(L, co, 1, "thread expected");
+  return co;
+}
+
+
+static int auxresume (lua_State *L, lua_State *co, int narg) {
+  int status;
+  if (!lua_checkstack(co, narg)) {
+    lua_pushliteral(L, "too many arguments to resume");
+    return -1;  /* error flag */
+  }
+  if (lua_status(co) == LUA_OK && lua_gettop(co) == 0) {
+    lua_pushliteral(L, "cannot resume dead coroutine");
+    return -1;  /* error flag */
+  }
+  lua_xmove(L, co, narg);
+  status = lua_resume(co, L, narg);
+  if (status == LUA_OK || status == LUA_YIELD) {
+    int nres = lua_gettop(co);
+    if (!lua_checkstack(L, nres + 1)) {
+      lua_pop(co, nres);  /* remove results anyway */
+      lua_pushliteral(L, "too many results to resume");
+      return -1;  /* error flag */
+    }
+    lua_xmove(co, L, nres);  /* move yielded values */
+    return nres;
+  }
+  else {
+    lua_xmove(co, L, 1);  /* move error message */
+    return -1;  /* error flag */
+  }
+}
+
+
+static int luaB_coresume (lua_State *L) {
+  lua_State *co = getco(L);
+  int r;
+  r = auxresume(L, co, lua_gettop(L) - 1);
+  if (r < 0) {
+    lua_pushboolean(L, 0);
+    lua_insert(L, -2);
+    return 2;  /* return false + error message */
+  }
+  else {
+    lua_pushboolean(L, 1);
+    lua_insert(L, -(r + 1));
+    return r + 1;  /* return true + 'resume' returns */
+  }
+}
+
+
+static int luaB_auxwrap (lua_State *L) {
+  lua_State *co = lua_tothread(L, lua_upvalueindex(1));
+  int r = auxresume(L, co, lua_gettop(L));
+  if (r < 0) {
+    if (lua_type(L, -1) == LUA_TSTRING) {  /* error object is a string? */
+      luaL_where(L, 1);  /* add extra info */
+      lua_insert(L, -2);
+      lua_concat(L, 2);
+    }
+    return lua_error(L);  /* propagate error */
+  }
+  return r;
+}
+
+
+static int luaB_cocreate (lua_State *L) {
+  lua_State *NL;
+  luaL_checktype(L, 1, LUA_TFUNCTION);
+  NL = lua_newthread(L);
+  lua_pushvalue(L, 1);  /* move function to top */
+  lua_xmove(L, NL, 1);  /* move function from L to NL */
+  return 1;
+}
+
+
+static int luaB_cowrap (lua_State *L) {
+  luaB_cocreate(L);
+  lua_pushcclosure(L, luaB_auxwrap, 1);
+  return 1;
+}
+
+
+static int luaB_yield (lua_State *L) {
+  return lua_yield(L, lua_gettop(L));
+}
+
+
+static int luaB_costatus (lua_State *L) {
+  lua_State *co = getco(L);
+  if (L == co) lua_pushliteral(L, "running");
+  else {
+    switch (lua_status(co)) {
+      case LUA_YIELD:
+        lua_pushliteral(L, "suspended");
+        break;
+      case LUA_OK: {
+        lua_Debug ar;
+        if (lua_getstack(co, 0, &ar) > 0)  /* does it have frames? */
+          lua_pushliteral(L, "normal");  /* it is running */
+        else if (lua_gettop(co) == 0)
+            lua_pushliteral(L, "dead");
+        else
+          lua_pushliteral(L, "suspended");  /* initial state */
+        break;
+      }
+      default:  /* some error occurred */
+        lua_pushliteral(L, "dead");
+        break;
+    }
+  }
+  return 1;
+}
+
+
+static int luaB_yieldable (lua_State *L) {
+  lua_pushboolean(L, lua_isyieldable(L));
+  return 1;
+}
+
+
+static int luaB_corunning (lua_State *L) {
+  int ismain = lua_pushthread(L);
+  lua_pushboolean(L, ismain);
+  return 2;
+}
+
+
+static const luaL_Reg co_funcs[] = {
+  {"create", luaB_cocreate},
+  {"resume", luaB_coresume},
+  {"running", luaB_corunning},
+  {"status", luaB_costatus},
+  {"wrap", luaB_cowrap},
+  {"yield", luaB_yield},
+  {"isyieldable", luaB_yieldable},
+  {NULL, NULL}
+};
+
+
+
+LUAMOD_API int luaopen_coroutine (lua_State *L) {
+  luaL_newlib(L, co_funcs);
+  return 1;
+}
+
diff --git a/libs/lua/lua-5.3.3/lctype.c b/libs/lua/lua-5.3.3/lctype.c
new file mode 100644
index 0000000..ae9367e
--- /dev/null
+++ b/libs/lua/lua-5.3.3/lctype.c
@@ -0,0 +1,55 @@
+/*
+** $Id: lctype.c,v 1.12 2014/11/02 19:19:04 roberto Exp $
+** 'ctype' functions for Lua
+** See Copyright Notice in lua.h
+*/
+
+#define lctype_c
+#define LUA_CORE
+
+#include "lprefix.h"
+
+
+#include "lctype.h"
+
+#if !LUA_USE_CTYPE	/* { */
+
+#include <limits.h>
+
+LUAI_DDEF const lu_byte luai_ctype_[UCHAR_MAX + 2] = {
+  0x00,  /* EOZ */
+  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,	/* 0. */
+  0x00,  0x08,  0x08,  0x08,  0x08,  0x08,  0x00,  0x00,
+  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,	/* 1. */
+  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,
+  0x0c,  0x04,  0x04,  0x04,  0x04,  0x04,  0x04,  0x04,	/* 2. */
+  0x04,  0x04,  0x04,  0x04,  0x04,  0x04,  0x04,  0x04,
+  0x16,  0x16,  0x16,  0x16,  0x16,  0x16,  0x16,  0x16,	/* 3. */
+  0x16,  0x16,  0x04,  0x04,  0x04,  0x04,  0x04,  0x04,
+  0x04,  0x15,  0x15,  0x15,  0x15,  0x15,  0x15,  0x05,	/* 4. */
+  0x05,  0x05,  0x05,  0x05,  0x05,  0x05,  0x05,  0x05,
+  0x05,  0x05,  0x05,  0x05,  0x05,  0x05,  0x05,  0x05,	/* 5. */
+  0x05,  0x05,  0x05,  0x04,  0x04,  0x04,  0x04,  0x05,
+  0x04,  0x15,  0x15,  0x15,  0x15,  0x15,  0x15,  0x05,	/* 6. */
+  0x05,  0x05,  0x05,  0x05,  0x05,  0x05,  0x05,  0x05,
+  0x05,  0x05,  0x05,  0x05,  0x05,  0x05,  0x05,  0x05,	/* 7. */
+  0x05,  0x05,  0x05,  0x04,  0x04,  0x04,  0x04,  0x00,
+  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,	/* 8. */
+  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,
+  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,	/* 9. */
+  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,
+  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,	/* a. */
+  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,
+  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,	/* b. */
+  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,
+  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,	/* c. */
+  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,
+  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,	/* d. */
+  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,
+  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,	/* e. */
+  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,
+  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,	/* f. */
+  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,
+};
+
+#endif			/* } */
diff --git a/libs/lua/lua-5.3.3/lctype.h b/libs/lua/lua-5.3.3/lctype.h
new file mode 100644
index 0000000..99c7d12
--- /dev/null
+++ b/libs/lua/lua-5.3.3/lctype.h
@@ -0,0 +1,95 @@
+/*
+** $Id: lctype.h,v 1.12 2011/07/15 12:50:29 roberto Exp $
+** 'ctype' functions for Lua
+** See Copyright Notice in lua.h
+*/
+
+#ifndef lctype_h
+#define lctype_h
+
+#include "lua.h"
+
+
+/*
+** WARNING: the functions defined here do not necessarily correspond
+** to the similar functions in the standard C ctype.h. They are
+** optimized for the specific needs of Lua
+*/
+
+#if !defined(LUA_USE_CTYPE)
+
+#if 'A' == 65 && '0' == 48
+/* ASCII case: can use its own tables; faster and fixed */
+#define LUA_USE_CTYPE	0
+#else
+/* must use standard C ctype */
+#define LUA_USE_CTYPE	1
+#endif
+
+#endif
+
+
+#if !LUA_USE_CTYPE	/* { */
+
+#include <limits.h>
+
+#include "llimits.h"
+
+
+#define ALPHABIT	0
+#define DIGITBIT	1
+#define PRINTBIT	2
+#define SPACEBIT	3
+#define XDIGITBIT	4
+
+
+#define MASK(B)		(1 << (B))
+
+
+/*
+** add 1 to char to allow index -1 (EOZ)
+*/
+#define testprop(c,p)	(luai_ctype_[(c)+1] & (p))
+
+/*
+** 'lalpha' (Lua alphabetic) and 'lalnum' (Lua alphanumeric) both include '_'
+*/
+#define lislalpha(c)	testprop(c, MASK(ALPHABIT))
+#define lislalnum(c)	testprop(c, (MASK(ALPHABIT) | MASK(DIGITBIT)))
+#define lisdigit(c)	testprop(c, MASK(DIGITBIT))
+#define lisspace(c)	testprop(c, MASK(SPACEBIT))
+#define lisprint(c)	testprop(c, MASK(PRINTBIT))
+#define lisxdigit(c)	testprop(c, MASK(XDIGITBIT))
+
+/*
+** this 'ltolower' only works for alphabetic characters
+*/
+#define ltolower(c)	((c) | ('A' ^ 'a'))
+
+
+/* two more entries for 0 and -1 (EOZ) */
+LUAI_DDEC const lu_byte luai_ctype_[UCHAR_MAX + 2];
+
+
+#else			/* }{ */
+
+/*
+** use standard C ctypes
+*/
+
+#include <ctype.h>
+
+
+#define lislalpha(c)	(isalpha(c) || (c) == '_')
+#define lislalnum(c)	(isalnum(c) || (c) == '_')
+#define lisdigit(c)	(isdigit(c))
+#define lisspace(c)	(isspace(c))
+#define lisprint(c)	(isprint(c))
+#define lisxdigit(c)	(isxdigit(c))
+
+#define ltolower(c)	(tolower(c))
+
+#endif			/* } */
+
+#endif
+
diff --git a/libs/lua/lua-5.3.3/ldblib.c b/libs/lua/lua-5.3.3/ldblib.c
new file mode 100644
index 0000000..786f6cd
--- /dev/null
+++ b/libs/lua/lua-5.3.3/ldblib.c
@@ -0,0 +1,456 @@
+/*
+** $Id: ldblib.c,v 1.151 2015/11/23 11:29:43 roberto Exp $
+** Interface from Lua to its debug API
+** See Copyright Notice in lua.h
+*/
+
+#define ldblib_c
+#define LUA_LIB
+
+#include "lprefix.h"
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "lua.h"
+
+#include "lauxlib.h"
+#include "lualib.h"
+
+
+/*
+** The hook table at registry[&HOOKKEY] maps threads to their current
+** hook function. (We only need the unique address of 'HOOKKEY'.)
+*/
+static const int HOOKKEY = 0;
+
+
+/*
+** If L1 != L, L1 can be in any state, and therefore there are no
+** guarantees about its stack space; any push in L1 must be
+** checked.
+*/
+static void checkstack (lua_State *L, lua_State *L1, int n) {
+  if (L != L1 && !lua_checkstack(L1, n))
+    luaL_error(L, "stack overflow");
+}
+
+
+static int db_getregistry (lua_State *L) {
+  lua_pushvalue(L, LUA_REGISTRYINDEX);
+  return 1;
+}
+
+
+static int db_getmetatable (lua_State *L) {
+  luaL_checkany(L, 1);
+  if (!lua_getmetatable(L, 1)) {
+    lua_pushnil(L);  /* no metatable */
+  }
+  return 1;
+}
+
+
+static int db_setmetatable (lua_State *L) {
+  int t = lua_type(L, 2);
+  luaL_argcheck(L, t == LUA_TNIL || t == LUA_TTABLE, 2,
+                    "nil or table expected");
+  lua_settop(L, 2);
+  lua_setmetatable(L, 1);
+  return 1;  /* return 1st argument */
+}
+
+
+static int db_getuservalue (lua_State *L) {
+  if (lua_type(L, 1) != LUA_TUSERDATA)
+    lua_pushnil(L);
+  else
+    lua_getuservalue(L, 1);
+  return 1;
+}
+
+
+static int db_setuservalue (lua_State *L) {
+  luaL_checktype(L, 1, LUA_TUSERDATA);
+  luaL_checkany(L, 2);
+  lua_settop(L, 2);
+  lua_setuservalue(L, 1);
+  return 1;
+}
+
+
+/*
+** Auxiliary function used by several library functions: check for
+** an optional thread as function's first argument and set 'arg' with
+** 1 if this argument is present (so that functions can skip it to
+** access their other arguments)
+*/
+static lua_State *getthread (lua_State *L, int *arg) {
+  if (lua_isthread(L, 1)) {
+    *arg = 1;
+    return lua_tothread(L, 1);
+  }
+  else {
+    *arg = 0;
+    return L;  /* function will operate over current thread */
+  }
+}
+
+
+/*
+** Variations of 'lua_settable', used by 'db_getinfo' to put results
+** from 'lua_getinfo' into result table. Key is always a string;
+** value can be a string, an int, or a boolean.
+*/
+static void settabss (lua_State *L, const char *k, const char *v) {
+  lua_pushstring(L, v);
+  lua_setfield(L, -2, k);
+}
+
+static void settabsi (lua_State *L, const char *k, int v) {
+  lua_pushinteger(L, v);
+  lua_setfield(L, -2, k);
+}
+
+static void settabsb (lua_State *L, const char *k, int v) {
+  lua_pushboolean(L, v);
+  lua_setfield(L, -2, k);
+}
+
+
+/*
+** In function 'db_getinfo', the call to 'lua_getinfo' may push
+** results on the stack; later it creates the result table to put
+** these objects. Function 'treatstackoption' puts the result from
+** 'lua_getinfo' on top of the result table so that it can call
+** 'lua_setfield'.
+*/
+static void treatstackoption (lua_State *L, lua_State *L1, const char *fname) {
+  if (L == L1)
+    lua_rotate(L, -2, 1);  /* exchange object and table */
+  else
+    lua_xmove(L1, L, 1);  /* move object to the "main" stack */
+  lua_setfield(L, -2, fname);  /* put object into table */
+}
+
+
+/*
+** Calls 'lua_getinfo' and collects all results in a new table.
+** L1 needs stack space for an optional input (function) plus
+** two optional outputs (function and line table) from function
+** 'lua_getinfo'.
+*/
+static int db_getinfo (lua_State *L) {
+  lua_Debug ar;
+  int arg;
+  lua_State *L1 = getthread(L, &arg);
+  const char *options = luaL_optstring(L, arg+2, "flnStu");
+  checkstack(L, L1, 3);
+  if (lua_isfunction(L, arg + 1)) {  /* info about a function? */
+    options = lua_pushfstring(L, ">%s", options);  /* add '>' to 'options' */
+    lua_pushvalue(L, arg + 1);  /* move function to 'L1' stack */
+    lua_xmove(L, L1, 1);
+  }
+  else {  /* stack level */
+    if (!lua_getstack(L1, (int)luaL_checkinteger(L, arg + 1), &ar)) {
+      lua_pushnil(L);  /* level out of range */
+      return 1;
+    }
+  }
+  if (!lua_getinfo(L1, options, &ar))
+    return luaL_argerror(L, arg+2, "invalid option");
+  lua_newtable(L);  /* table to collect results */
+  if (strchr(options, 'S')) {
+    settabss(L, "source", ar.source);
+    settabss(L, "short_src", ar.short_src);
+    settabsi(L, "linedefined", ar.linedefined);
+    settabsi(L, "lastlinedefined", ar.lastlinedefined);
+    settabss(L, "what", ar.what);
+  }
+  if (strchr(options, 'l'))
+    settabsi(L, "currentline", ar.currentline);
+  if (strchr(options, 'u')) {
+    settabsi(L, "nups", ar.nups);
+    settabsi(L, "nparams", ar.nparams);
+    settabsb(L, "isvararg", ar.isvararg);
+  }
+  if (strchr(options, 'n')) {
+    settabss(L, "name", ar.name);
+    settabss(L, "namewhat", ar.namewhat);
+  }
+  if (strchr(options, 't'))
+    settabsb(L, "istailcall", ar.istailcall);
+  if (strchr(options, 'L'))
+    treatstackoption(L, L1, "activelines");
+  if (strchr(options, 'f'))
+    treatstackoption(L, L1, "func");
+  return 1;  /* return table */
+}
+
+
+static int db_getlocal (lua_State *L) {
+  int arg;
+  lua_State *L1 = getthread(L, &arg);
+  lua_Debug ar;
+  const char *name;
+  int nvar = (int)luaL_checkinteger(L, arg + 2);  /* local-variable index */
+  if (lua_isfunction(L, arg + 1)) {  /* function argument? */
+    lua_pushvalue(L, arg + 1);  /* push function */
+    lua_pushstring(L, lua_getlocal(L, NULL, nvar));  /* push local name */
+    return 1;  /* return only name (there is no value) */
+  }
+  else {  /* stack-level argument */
+    int level = (int)luaL_checkinteger(L, arg + 1);
+    if (!lua_getstack(L1, level, &ar))  /* out of range? */
+      return luaL_argerror(L, arg+1, "level out of range");
+    checkstack(L, L1, 1);
+    name = lua_getlocal(L1, &ar, nvar);
+    if (name) {
+      lua_xmove(L1, L, 1);  /* move local value */
+      lua_pushstring(L, name);  /* push name */
+      lua_rotate(L, -2, 1);  /* re-order */
+      return 2;
+    }
+    else {
+      lua_pushnil(L);  /* no name (nor value) */
+      return 1;
+    }
+  }
+}
+
+
+static int db_setlocal (lua_State *L) {
+  int arg;
+  const char *name;
+  lua_State *L1 = getthread(L, &arg);
+  lua_Debug ar;
+  int level = (int)luaL_checkinteger(L, arg + 1);
+  int nvar = (int)luaL_checkinteger(L, arg + 2);
+  if (!lua_getstack(L1, level, &ar))  /* out of range? */
+    return luaL_argerror(L, arg+1, "level out of range");
+  luaL_checkany(L, arg+3);
+  lua_settop(L, arg+3);
+  checkstack(L, L1, 1);
+  lua_xmove(L, L1, 1);
+  name = lua_setlocal(L1, &ar, nvar);
+  if (name == NULL)
+    lua_pop(L1, 1);  /* pop value (if not popped by 'lua_setlocal') */
+  lua_pushstring(L, name);
+  return 1;
+}
+
+
+/*
+** get (if 'get' is true) or set an upvalue from a closure
+*/
+static int auxupvalue (lua_State *L, int get) {
+  const char *name;
+  int n = (int)luaL_checkinteger(L, 2);  /* upvalue index */
+  luaL_checktype(L, 1, LUA_TFUNCTION);  /* closure */
+  name = get ? lua_getupvalue(L, 1, n) : lua_setupvalue(L, 1, n);
+  if (name == NULL) return 0;
+  lua_pushstring(L, name);
+  lua_insert(L, -(get+1));  /* no-op if get is false */
+  return get + 1;
+}
+
+
+static int db_getupvalue (lua_State *L) {
+  return auxupvalue(L, 1);
+}
+
+
+static int db_setupvalue (lua_State *L) {
+  luaL_checkany(L, 3);
+  return auxupvalue(L, 0);
+}
+
+
+/*
+** Check whether a given upvalue from a given closure exists and
+** returns its index
+*/
+static int checkupval (lua_State *L, int argf, int argnup) {
+  int nup = (int)luaL_checkinteger(L, argnup);  /* upvalue index */
+  luaL_checktype(L, argf, LUA_TFUNCTION);  /* closure */
+  luaL_argcheck(L, (lua_getupvalue(L, argf, nup) != NULL), argnup,
+                   "invalid upvalue index");
+  return nup;
+}
+
+
+static int db_upvalueid (lua_State *L) {
+  int n = checkupval(L, 1, 2);
+  lua_pushlightuserdata(L, lua_upvalueid(L, 1, n));
+  return 1;
+}
+
+
+static int db_upvaluejoin (lua_State *L) {
+  int n1 = checkupval(L, 1, 2);
+  int n2 = checkupval(L, 3, 4);
+  luaL_argcheck(L, !lua_iscfunction(L, 1), 1, "Lua function expected");
+  luaL_argcheck(L, !lua_iscfunction(L, 3), 3, "Lua function expected");
+  lua_upvaluejoin(L, 1, n1, 3, n2);
+  return 0;
+}
+
+
+/*
+** Call hook function registered at hook table for the current
+** thread (if there is one)
+*/
+static void hookf (lua_State *L, lua_Debug *ar) {
+  static const char *const hooknames[] =
+    {"call", "return", "line", "count", "tail call"};
+  lua_rawgetp(L, LUA_REGISTRYINDEX, &HOOKKEY);
+  lua_pushthread(L);
+  if (lua_rawget(L, -2) == LUA_TFUNCTION) {  /* is there a hook function? */
+    lua_pushstring(L, hooknames[(int)ar->event]);  /* push event name */
+    if (ar->currentline >= 0)
+      lua_pushinteger(L, ar->currentline);  /* push current line */
+    else lua_pushnil(L);
+    lua_assert(lua_getinfo(L, "lS", ar));
+    lua_call(L, 2, 0);  /* call hook function */
+  }
+}
+
+
+/*
+** Convert a string mask (for 'sethook') into a bit mask
+*/
+static int makemask (const char *smask, int count) {
+  int mask = 0;
+  if (strchr(smask, 'c')) mask |= LUA_MASKCALL;
+  if (strchr(smask, 'r')) mask |= LUA_MASKRET;
+  if (strchr(smask, 'l')) mask |= LUA_MASKLINE;
+  if (count > 0) mask |= LUA_MASKCOUNT;
+  return mask;
+}
+
+
+/*
+** Convert a bit mask (for 'gethook') into a string mask
+*/
+static char *unmakemask (int mask, char *smask) {
+  int i = 0;
+  if (mask & LUA_MASKCALL) smask[i++] = 'c';
+  if (mask & LUA_MASKRET) smask[i++] = 'r';
+  if (mask & LUA_MASKLINE) smask[i++] = 'l';
+  smask[i] = '\0';
+  return smask;
+}
+
+
+static int db_sethook (lua_State *L) {
+  int arg, mask, count;
+  lua_Hook func;
+  lua_State *L1 = getthread(L, &arg);
+  if (lua_isnoneornil(L, arg+1)) {  /* no hook? */
+    lua_settop(L, arg+1);
+    func = NULL; mask = 0; count = 0;  /* turn off hooks */
+  }
+  else {
+    const char *smask = luaL_checkstring(L, arg+2);
+    luaL_checktype(L, arg+1, LUA_TFUNCTION);
+    count = (int)luaL_optinteger(L, arg + 3, 0);
+    func = hookf; mask = makemask(smask, count);
+  }
+  if (lua_rawgetp(L, LUA_REGISTRYINDEX, &HOOKKEY) == LUA_TNIL) {
+    lua_createtable(L, 0, 2);  /* create a hook table */
+    lua_pushvalue(L, -1);
+    lua_rawsetp(L, LUA_REGISTRYINDEX, &HOOKKEY);  /* set it in position */
+    lua_pushstring(L, "k");
+    lua_setfield(L, -2, "__mode");  /** hooktable.__mode = "k" */
+    lua_pushvalue(L, -1);
+    lua_setmetatable(L, -2);  /* setmetatable(hooktable) = hooktable */
+  }
+  checkstack(L, L1, 1);
+  lua_pushthread(L1); lua_xmove(L1, L, 1);  /* key (thread) */
+  lua_pushvalue(L, arg + 1);  /* value (hook function) */
+  lua_rawset(L, -3);  /* hooktable[L1] = new Lua hook */
+  lua_sethook(L1, func, mask, count);
+  return 0;
+}
+
+
+static int db_gethook (lua_State *L) {
+  int arg;
+  lua_State *L1 = getthread(L, &arg);
+  char buff[5];
+  int mask = lua_gethookmask(L1);
+  lua_Hook hook = lua_gethook(L1);
+  if (hook == NULL)  /* no hook? */
+    lua_pushnil(L);
+  else if (hook != hookf)  /* external hook? */
+    lua_pushliteral(L, "external hook");
+  else {  /* hook table must exist */
+    lua_rawgetp(L, LUA_REGISTRYINDEX, &HOOKKEY);
+    checkstack(L, L1, 1);
+    lua_pushthread(L1); lua_xmove(L1, L, 1);
+    lua_rawget(L, -2);   /* 1st result = hooktable[L1] */
+    lua_remove(L, -2);  /* remove hook table */
+  }
+  lua_pushstring(L, unmakemask(mask, buff));  /* 2nd result = mask */
+  lua_pushinteger(L, lua_gethookcount(L1));  /* 3rd result = count */
+  return 3;
+}
+
+
+static int db_debug (lua_State *L) {
+  for (;;) {
+    char buffer[250];
+    lua_writestringerror("%s", "lua_debug> ");
+    if (fgets(buffer, sizeof(buffer), stdin) == 0 ||
+        strcmp(buffer, "cont\n") == 0)
+      return 0;
+    if (luaL_loadbuffer(L, buffer, strlen(buffer), "=(debug command)") ||
+        lua_pcall(L, 0, 0, 0))
+      lua_writestringerror("%s\n", lua_tostring(L, -1));
+    lua_settop(L, 0);  /* remove eventual returns */
+  }
+}
+
+
+static int db_traceback (lua_State *L) {
+  int arg;
+  lua_State *L1 = getthread(L, &arg);
+  const char *msg = lua_tostring(L, arg + 1);
+  if (msg == NULL && !lua_isnoneornil(L, arg + 1))  /* non-string 'msg'? */
+    lua_pushvalue(L, arg + 1);  /* return it untouched */
+  else {
+    int level = (int)luaL_optinteger(L, arg + 2, (L == L1) ? 1 : 0);
+    luaL_traceback(L, L1, msg, level);
+  }
+  return 1;
+}
+
+
+static const luaL_Reg dblib[] = {
+  {"debug", db_debug},
+  {"getuservalue", db_getuservalue},
+  {"gethook", db_gethook},
+  {"getinfo", db_getinfo},
+  {"getlocal", db_getlocal},
+  {"getregistry", db_getregistry},
+  {"getmetatable", db_getmetatable},
+  {"getupvalue", db_getupvalue},
+  {"upvaluejoin", db_upvaluejoin},
+  {"upvalueid", db_upvalueid},
+  {"setuservalue", db_setuservalue},
+  {"sethook", db_sethook},
+  {"setlocal", db_setlocal},
+  {"setmetatable", db_setmetatable},
+  {"setupvalue", db_setupvalue},
+  {"traceback", db_traceback},
+  {NULL, NULL}
+};
+
+
+LUAMOD_API int luaopen_debug (lua_State *L) {
+  luaL_newlib(L, dblib);
+  return 1;
+}
+
diff --git a/libs/lua/lua-5.3.3/ldebug.c b/libs/lua/lua-5.3.3/ldebug.c
new file mode 100644
index 0000000..e499ee3
--- /dev/null
+++ b/libs/lua/lua-5.3.3/ldebug.c
@@ -0,0 +1,679 @@
+/*
+** $Id: ldebug.c,v 2.120 2016/03/31 19:01:21 roberto Exp $
+** Debug Interface
+** See Copyright Notice in lua.h
+*/
+
+#define ldebug_c
+#define LUA_CORE
+
+#include "lprefix.h"
+
+
+#include <stdarg.h>
+#include <stddef.h>
+#include <string.h>
+
+#include "lua.h"
+
+#include "lapi.h"
+#include "lcode.h"
+#include "ldebug.h"
+#include "ldo.h"
+#include "lfunc.h"
+#include "lobject.h"
+#include "lopcodes.h"
+#include "lstate.h"
+#include "lstring.h"
+#include "ltable.h"
+#include "ltm.h"
+#include "lvm.h"
+
+
+
+#define noLuaClosure(f)		((f) == NULL || (f)->c.tt == LUA_TCCL)
+
+
+/* Active Lua function (given call info) */
+#define ci_func(ci)		(clLvalue((ci)->func))
+
+
+static const char *getfuncname (lua_State *L, CallInfo *ci, const char **name);
+
+
+static int currentpc (CallInfo *ci) {
+  lua_assert(isLua(ci));
+  return pcRel(ci->u.l.savedpc, ci_func(ci)->p);
+}
+
+
+static int currentline (CallInfo *ci) {
+  return getfuncline(ci_func(ci)->p, currentpc(ci));
+}
+
+
+/*
+** If function yielded, its 'func' can be in the 'extra' field. The
+** next function restores 'func' to its correct value for debugging
+** purposes. (It exchanges 'func' and 'extra'; so, when called again,
+** after debugging, it also "re-restores" ** 'func' to its altered value.
+*/
+static void swapextra (lua_State *L) {
+  if (L->status == LUA_YIELD) {
+    CallInfo *ci = L->ci;  /* get function that yielded */
+    StkId temp = ci->func;  /* exchange its 'func' and 'extra' values */
+    ci->func = restorestack(L, ci->extra);
+    ci->extra = savestack(L, temp);
+  }
+}
+
+
+/*
+** This function can be called asynchronously (e.g. during a signal).
+** Fields 'oldpc', 'basehookcount', and 'hookcount' (set by
+** 'resethookcount') are for debug only, and it is no problem if they
+** get arbitrary values (causes at most one wrong hook call). 'hookmask'
+** is an atomic value. We assume that pointers are atomic too (e.g., gcc
+** ensures that for all platforms where it runs). Moreover, 'hook' is
+** always checked before being called (see 'luaD_hook').
+*/
+LUA_API void lua_sethook (lua_State *L, lua_Hook func, int mask, int count) {
+  if (func == NULL || mask == 0) {  /* turn off hooks? */
+    mask = 0;
+    func = NULL;
+  }
+  if (isLua(L->ci))
+    L->oldpc = L->ci->u.l.savedpc;
+  L->hook = func;
+  L->basehookcount = count;
+  resethookcount(L);
+  L->hookmask = cast_byte(mask);
+}
+
+
+LUA_API lua_Hook lua_gethook (lua_State *L) {
+  return L->hook;
+}
+
+
+LUA_API int lua_gethookmask (lua_State *L) {
+  return L->hookmask;
+}
+
+
+LUA_API int lua_gethookcount (lua_State *L) {
+  return L->basehookcount;
+}
+
+
+LUA_API int lua_getstack (lua_State *L, int level, lua_Debug *ar) {
+  int status;
+  CallInfo *ci;
+  if (level < 0) return 0;  /* invalid (negative) level */
+  lua_lock(L);
+  for (ci = L->ci; level > 0 && ci != &L->base_ci; ci = ci->previous)
+    level--;
+  if (level == 0 && ci != &L->base_ci) {  /* level found? */
+    status = 1;
+    ar->i_ci = ci;
+  }
+  else status = 0;  /* no such level */
+  lua_unlock(L);
+  return status;
+}
+
+
+static const char *upvalname (Proto *p, int uv) {
+  TString *s = check_exp(uv < p->sizeupvalues, p->upvalues[uv].name);
+  if (s == NULL) return "?";
+  else return getstr(s);
+}
+
+
+static const char *findvararg (CallInfo *ci, int n, StkId *pos) {
+  int nparams = clLvalue(ci->func)->p->numparams;
+  if (n >= cast_int(ci->u.l.base - ci->func) - nparams)
+    return NULL;  /* no such vararg */
+  else {
+    *pos = ci->func + nparams + n;
+    return "(*vararg)";  /* generic name for any vararg */
+  }
+}
+
+
+static const char *findlocal (lua_State *L, CallInfo *ci, int n,
+                              StkId *pos) {
+  const char *name = NULL;
+  StkId base;
+  if (isLua(ci)) {
+    if (n < 0)  /* access to vararg values? */
+      return findvararg(ci, -n, pos);
+    else {
+      base = ci->u.l.base;
+      name = luaF_getlocalname(ci_func(ci)->p, n, currentpc(ci));
+    }
+  }
+  else
+    base = ci->func + 1;
+  if (name == NULL) {  /* no 'standard' name? */
+    StkId limit = (ci == L->ci) ? L->top : ci->next->func;
+    if (limit - base >= n && n > 0)  /* is 'n' inside 'ci' stack? */
+      name = "(*temporary)";  /* generic name for any valid slot */
+    else
+      return NULL;  /* no name */
+  }
+  *pos = base + (n - 1);
+  return name;
+}
+
+
+LUA_API const char *lua_getlocal (lua_State *L, const lua_Debug *ar, int n) {
+  const char *name;
+  lua_lock(L);
+  swapextra(L);
+  if (ar == NULL) {  /* information about non-active function? */
+    if (!isLfunction(L->top - 1))  /* not a Lua function? */
+      name = NULL;
+    else  /* consider live variables at function start (parameters) */
+      name = luaF_getlocalname(clLvalue(L->top - 1)->p, n, 0);
+  }
+  else {  /* active function; get information through 'ar' */
+    StkId pos = NULL;  /* to avoid warnings */
+    name = findlocal(L, ar->i_ci, n, &pos);
+    if (name) {
+      setobj2s(L, L->top, pos);
+      api_incr_top(L);
+    }
+  }
+  swapextra(L);
+  lua_unlock(L);
+  return name;
+}
+
+
+LUA_API const char *lua_setlocal (lua_State *L, const lua_Debug *ar, int n) {
+  StkId pos = NULL;  /* to avoid warnings */
+  const char *name;
+  lua_lock(L);
+  swapextra(L);
+  name = findlocal(L, ar->i_ci, n, &pos);
+  if (name) {
+    setobjs2s(L, pos, L->top - 1);
+    L->top--;  /* pop value */
+  }
+  swapextra(L);
+  lua_unlock(L);
+  return name;
+}
+
+
+static void funcinfo (lua_Debug *ar, Closure *cl) {
+  if (noLuaClosure(cl)) {
+    ar->source = "=[C]";
+    ar->linedefined = -1;
+    ar->lastlinedefined = -1;
+    ar->what = "C";
+  }
+  else {
+    Proto *p = cl->l.p;
+    ar->source = p->source ? getstr(p->source) : "=?";
+    ar->linedefined = p->linedefined;
+    ar->lastlinedefined = p->lastlinedefined;
+    ar->what = (ar->linedefined == 0) ? "main" : "Lua";
+  }
+  luaO_chunkid(ar->short_src, ar->source, LUA_IDSIZE);
+}
+
+
+static void collectvalidlines (lua_State *L, Closure *f) {
+  if (noLuaClosure(f)) {
+    setnilvalue(L->top);
+    api_incr_top(L);
+  }
+  else {
+    int i;
+    TValue v;
+    int *lineinfo = f->l.p->lineinfo;
+    Table *t = luaH_new(L);  /* new table to store active lines */
+    sethvalue(L, L->top, t);  /* push it on stack */
+    api_incr_top(L);
+    setbvalue(&v, 1);  /* boolean 'true' to be the value of all indices */
+    for (i = 0; i < f->l.p->sizelineinfo; i++)  /* for all lines with code */
+      luaH_setint(L, t, lineinfo[i], &v);  /* table[line] = true */
+  }
+}
+
+
+static int auxgetinfo (lua_State *L, const char *what, lua_Debug *ar,
+                       Closure *f, CallInfo *ci) {
+  int status = 1;
+  for (; *what; what++) {
+    switch (*what) {
+      case 'S': {
+        funcinfo(ar, f);
+        break;
+      }
+      case 'l': {
+        ar->currentline = (ci && isLua(ci)) ? currentline(ci) : -1;
+        break;
+      }
+      case 'u': {
+        ar->nups = (f == NULL) ? 0 : f->c.nupvalues;
+        if (noLuaClosure(f)) {
+          ar->isvararg = 1;
+          ar->nparams = 0;
+        }
+        else {
+          ar->isvararg = f->l.p->is_vararg;
+          ar->nparams = f->l.p->numparams;
+        }
+        break;
+      }
+      case 't': {
+        ar->istailcall = (ci) ? ci->callstatus & CIST_TAIL : 0;
+        break;
+      }
+      case 'n': {
+        /* calling function is a known Lua function? */
+        if (ci && !(ci->callstatus & CIST_TAIL) && isLua(ci->previous))
+          ar->namewhat = getfuncname(L, ci->previous, &ar->name);
+        else
+          ar->namewhat = NULL;
+        if (ar->namewhat == NULL) {
+          ar->namewhat = "";  /* not found */
+          ar->name = NULL;
+        }
+        break;
+      }
+      case 'L':
+      case 'f':  /* handled by lua_getinfo */
+        break;
+      default: status = 0;  /* invalid option */
+    }
+  }
+  return status;
+}
+
+
+LUA_API int lua_getinfo (lua_State *L, const char *what, lua_Debug *ar) {
+  int status;
+  Closure *cl;
+  CallInfo *ci;
+  StkId func;
+  lua_lock(L);
+  swapextra(L);
+  if (*what == '>') {
+    ci = NULL;
+    func = L->top - 1;
+    api_check(L, ttisfunction(func), "function expected");
+    what++;  /* skip the '>' */
+    L->top--;  /* pop function */
+  }
+  else {
+    ci = ar->i_ci;
+    func = ci->func;
+    lua_assert(ttisfunction(ci->func));
+  }
+  cl = ttisclosure(func) ? clvalue(func) : NULL;
+  status = auxgetinfo(L, what, ar, cl, ci);
+  if (strchr(what, 'f')) {
+    setobjs2s(L, L->top, func);
+    api_incr_top(L);
+  }
+  swapextra(L);  /* correct before option 'L', which can raise a mem. error */
+  if (strchr(what, 'L'))
+    collectvalidlines(L, cl);
+  lua_unlock(L);
+  return status;
+}
+
+
+/*
+** {======================================================
+** Symbolic Execution
+** =======================================================
+*/
+
+static const char *getobjname (Proto *p, int lastpc, int reg,
+                               const char **name);
+
+
+/*
+** find a "name" for the RK value 'c'
+*/
+static void kname (Proto *p, int pc, int c, const char **name) {
+  if (ISK(c)) {  /* is 'c' a constant? */
+    TValue *kvalue = &p->k[INDEXK(c)];
+    if (ttisstring(kvalue)) {  /* literal constant? */
+      *name = svalue(kvalue);  /* it is its own name */
+      return;
+    }
+    /* else no reasonable name found */
+  }
+  else {  /* 'c' is a register */
+    const char *what = getobjname(p, pc, c, name); /* search for 'c' */
+    if (what && *what == 'c') {  /* found a constant name? */
+      return;  /* 'name' already filled */
+    }
+    /* else no reasonable name found */
+  }
+  *name = "?";  /* no reasonable name found */
+}
+
+
+static int filterpc (int pc, int jmptarget) {
+  if (pc < jmptarget)  /* is code conditional (inside a jump)? */
+    return -1;  /* cannot know who sets that register */
+  else return pc;  /* current position sets that register */
+}
+
+
+/*
+** try to find last instruction before 'lastpc' that modified register 'reg'
+*/
+static int findsetreg (Proto *p, int lastpc, int reg) {
+  int pc;
+  int setreg = -1;  /* keep last instruction that changed 'reg' */
+  int jmptarget = 0;  /* any code before this address is conditional */
+  for (pc = 0; pc < lastpc; pc++) {
+    Instruction i = p->code[pc];
+    OpCode op = GET_OPCODE(i);
+    int a = GETARG_A(i);
+    switch (op) {
+      case OP_LOADNIL: {
+        int b = GETARG_B(i);
+        if (a <= reg && reg <= a + b)  /* set registers from 'a' to 'a+b' */
+          setreg = filterpc(pc, jmptarget);
+        break;
+      }
+      case OP_TFORCALL: {
+        if (reg >= a + 2)  /* affect all regs above its base */
+          setreg = filterpc(pc, jmptarget);
+        break;
+      }
+      case OP_CALL:
+      case OP_TAILCALL: {
+        if (reg >= a)  /* affect all registers above base */
+          setreg = filterpc(pc, jmptarget);
+        break;
+      }
+      case OP_JMP: {
+        int b = GETARG_sBx(i);
+        int dest = pc + 1 + b;
+        /* jump is forward and do not skip 'lastpc'? */
+        if (pc < dest && dest <= lastpc) {
+          if (dest > jmptarget)
+            jmptarget = dest;  /* update 'jmptarget' */
+        }
+        break;
+      }
+      default:
+        if (testAMode(op) && reg == a)  /* any instruction that set A */
+          setreg = filterpc(pc, jmptarget);
+        break;
+    }
+  }
+  return setreg;
+}
+
+
+static const char *getobjname (Proto *p, int lastpc, int reg,
+                               const char **name) {
+  int pc;
+  *name = luaF_getlocalname(p, reg + 1, lastpc);
+  if (*name)  /* is a local? */
+    return "local";
+  /* else try symbolic execution */
+  pc = findsetreg(p, lastpc, reg);
+  if (pc != -1) {  /* could find instruction? */
+    Instruction i = p->code[pc];
+    OpCode op = GET_OPCODE(i);
+    switch (op) {
+      case OP_MOVE: {
+        int b = GETARG_B(i);  /* move from 'b' to 'a' */
+        if (b < GETARG_A(i))
+          return getobjname(p, pc, b, name);  /* get name for 'b' */
+        break;
+      }
+      case OP_GETTABUP:
+      case OP_GETTABLE: {
+        int k = GETARG_C(i);  /* key index */
+        int t = GETARG_B(i);  /* table index */
+        const char *vn = (op == OP_GETTABLE)  /* name of indexed variable */
+                         ? luaF_getlocalname(p, t + 1, pc)
+                         : upvalname(p, t);
+        kname(p, pc, k, name);
+        return (vn && strcmp(vn, LUA_ENV) == 0) ? "global" : "field";
+      }
+      case OP_GETUPVAL: {
+        *name = upvalname(p, GETARG_B(i));
+        return "upvalue";
+      }
+      case OP_LOADK:
+      case OP_LOADKX: {
+        int b = (op == OP_LOADK) ? GETARG_Bx(i)
+                                 : GETARG_Ax(p->code[pc + 1]);
+        if (ttisstring(&p->k[b])) {
+          *name = svalue(&p->k[b]);
+          return "constant";
+        }
+        break;
+      }
+      case OP_SELF: {
+        int k = GETARG_C(i);  /* key index */
+        kname(p, pc, k, name);
+        return "method";
+      }
+      default: break;  /* go through to return NULL */
+    }
+  }
+  return NULL;  /* could not find reasonable name */
+}
+
+
+static const char *getfuncname (lua_State *L, CallInfo *ci, const char **name) {
+  TMS tm = (TMS)0;  /* to avoid warnings */
+  Proto *p = ci_func(ci)->p;  /* calling function */
+  int pc = currentpc(ci);  /* calling instruction index */
+  Instruction i = p->code[pc];  /* calling instruction */
+  if (ci->callstatus & CIST_HOOKED) {  /* was it called inside a hook? */
+    *name = "?";
+    return "hook";
+  }
+  switch (GET_OPCODE(i)) {
+    case OP_CALL:
+    case OP_TAILCALL:  /* get function name */
+      return getobjname(p, pc, GETARG_A(i), name);
+    case OP_TFORCALL: {  /* for iterator */
+      *name = "for iterator";
+       return "for iterator";
+    }
+    /* all other instructions can call only through metamethods */
+    case OP_SELF: case OP_GETTABUP: case OP_GETTABLE:
+      tm = TM_INDEX;
+      break;
+    case OP_SETTABUP: case OP_SETTABLE:
+      tm = TM_NEWINDEX;
+      break;
+    case OP_ADD: case OP_SUB: case OP_MUL: case OP_MOD:
+    case OP_POW: case OP_DIV: case OP_IDIV: case OP_BAND:
+    case OP_BOR: case OP_BXOR: case OP_SHL: case OP_SHR: {
+      int offset = cast_int(GET_OPCODE(i)) - cast_int(OP_ADD);  /* ORDER OP */
+      tm = cast(TMS, offset + cast_int(TM_ADD));  /* ORDER TM */
+      break;
+    }
+    case OP_UNM: tm = TM_UNM; break;
+    case OP_BNOT: tm = TM_BNOT; break;
+    case OP_LEN: tm = TM_LEN; break;
+    case OP_CONCAT: tm = TM_CONCAT; break;
+    case OP_EQ: tm = TM_EQ; break;
+    case OP_LT: tm = TM_LT; break;
+    case OP_LE: tm = TM_LE; break;
+    default: lua_assert(0);  /* other instructions cannot call a function */
+  }
+  *name = getstr(G(L)->tmname[tm]);
+  return "metamethod";
+}
+
+/* }====================================================== */
+
+
+
+/*
+** The subtraction of two potentially unrelated pointers is
+** not ISO C, but it should not crash a program; the subsequent
+** checks are ISO C and ensure a correct result.
+*/
+static int isinstack (CallInfo *ci, const TValue *o) {
+  ptrdiff_t i = o - ci->u.l.base;
+  return (0 <= i && i < (ci->top - ci->u.l.base) && ci->u.l.base + i == o);
+}
+
+
+/*
+** Checks whether value 'o' came from an upvalue. (That can only happen
+** with instructions OP_GETTABUP/OP_SETTABUP, which operate directly on
+** upvalues.)
+*/
+static const char *getupvalname (CallInfo *ci, const TValue *o,
+                                 const char **name) {
+  LClosure *c = ci_func(ci);
+  int i;
+  for (i = 0; i < c->nupvalues; i++) {
+    if (c->upvals[i]->v == o) {
+      *name = upvalname(c->p, i);
+      return "upvalue";
+    }
+  }
+  return NULL;
+}
+
+
+static const char *varinfo (lua_State *L, const TValue *o) {
+  const char *name = NULL;  /* to avoid warnings */
+  CallInfo *ci = L->ci;
+  const char *kind = NULL;
+  if (isLua(ci)) {
+    kind = getupvalname(ci, o, &name);  /* check whether 'o' is an upvalue */
+    if (!kind && isinstack(ci, o))  /* no? try a register */
+      kind = getobjname(ci_func(ci)->p, currentpc(ci),
+                        cast_int(o - ci->u.l.base), &name);
+  }
+  return (kind) ? luaO_pushfstring(L, " (%s '%s')", kind, name) : "";
+}
+
+
+l_noret luaG_typeerror (lua_State *L, const TValue *o, const char *op) {
+  const char *t = luaT_objtypename(L, o);
+  luaG_runerror(L, "attempt to %s a %s value%s", op, t, varinfo(L, o));
+}
+
+
+l_noret luaG_concaterror (lua_State *L, const TValue *p1, const TValue *p2) {
+  if (ttisstring(p1) || cvt2str(p1)) p1 = p2;
+  luaG_typeerror(L, p1, "concatenate");
+}
+
+
+l_noret luaG_opinterror (lua_State *L, const TValue *p1,
+                         const TValue *p2, const char *msg) {
+  lua_Number temp;
+  if (!tonumber(p1, &temp))  /* first operand is wrong? */
+    p2 = p1;  /* now second is wrong */
+  luaG_typeerror(L, p2, msg);
+}
+
+
+/*
+** Error when both values are convertible to numbers, but not to integers
+*/
+l_noret luaG_tointerror (lua_State *L, const TValue *p1, const TValue *p2) {
+  lua_Integer temp;
+  if (!tointeger(p1, &temp))
+    p2 = p1;
+  luaG_runerror(L, "number%s has no integer representation", varinfo(L, p2));
+}
+
+
+l_noret luaG_ordererror (lua_State *L, const TValue *p1, const TValue *p2) {
+  const char *t1 = luaT_objtypename(L, p1);
+  const char *t2 = luaT_objtypename(L, p2);
+  if (strcmp(t1, t2) == 0)
+    luaG_runerror(L, "attempt to compare two %s values", t1);
+  else
+    luaG_runerror(L, "attempt to compare %s with %s", t1, t2);
+}
+
+
+/* add src:line information to 'msg' */
+const char *luaG_addinfo (lua_State *L, const char *msg, TString *src,
+                                        int line) {
+  char buff[LUA_IDSIZE];
+  if (src)
+    luaO_chunkid(buff, getstr(src), LUA_IDSIZE);
+  else {  /* no source available; use "?" instead */
+    buff[0] = '?'; buff[1] = '\0';
+  }
+  return luaO_pushfstring(L, "%s:%d: %s", buff, line, msg);
+}
+
+
+l_noret luaG_errormsg (lua_State *L) {
+  if (L->errfunc != 0) {  /* is there an error handling function? */
+    StkId errfunc = restorestack(L, L->errfunc);
+    setobjs2s(L, L->top, L->top - 1);  /* move argument */
+    setobjs2s(L, L->top - 1, errfunc);  /* push function */
+    L->top++;  /* assume EXTRA_STACK */
+    luaD_callnoyield(L, L->top - 2, 1);  /* call it */
+  }
+  luaD_throw(L, LUA_ERRRUN);
+}
+
+
+l_noret luaG_runerror (lua_State *L, const char *fmt, ...) {
+  CallInfo *ci = L->ci;
+  const char *msg;
+  va_list argp;
+  va_start(argp, fmt);
+  msg = luaO_pushvfstring(L, fmt, argp);  /* format message */
+  va_end(argp);
+  if (isLua(ci))  /* if Lua function, add source:line information */
+    luaG_addinfo(L, msg, ci_func(ci)->p->source, currentline(ci));
+  luaG_errormsg(L);
+}
+
+
+void luaG_traceexec (lua_State *L) {
+  CallInfo *ci = L->ci;
+  lu_byte mask = L->hookmask;
+  int counthook = (--L->hookcount == 0 && (mask & LUA_MASKCOUNT));
+  if (counthook)
+    resethookcount(L);  /* reset count */
+  else if (!(mask & LUA_MASKLINE))
+    return;  /* no line hook and count != 0; nothing to be done */
+  if (ci->callstatus & CIST_HOOKYIELD) {  /* called hook last time? */
+    ci->callstatus &= ~CIST_HOOKYIELD;  /* erase mark */
+    return;  /* do not call hook again (VM yielded, so it did not move) */
+  }
+  if (counthook)
+    luaD_hook(L, LUA_HOOKCOUNT, -1);  /* call count hook */
+  if (mask & LUA_MASKLINE) {
+    Proto *p = ci_func(ci)->p;
+    int npc = pcRel(ci->u.l.savedpc, p);
+    int newline = getfuncline(p, npc);
+    if (npc == 0 ||  /* call linehook when enter a new function, */
+        ci->u.l.savedpc <= L->oldpc ||  /* when jump back (loop), or when */
+        newline != getfuncline(p, pcRel(L->oldpc, p)))  /* enter a new line */
+      luaD_hook(L, LUA_HOOKLINE, newline);  /* call line hook */
+  }
+  L->oldpc = ci->u.l.savedpc;
+  if (L->status == LUA_YIELD) {  /* did hook yield? */
+    if (counthook)
+      L->hookcount = 1;  /* undo decrement to zero */
+    ci->u.l.savedpc--;  /* undo increment (resume will increment it again) */
+    ci->callstatus |= CIST_HOOKYIELD;  /* mark that it yielded */
+    ci->func = L->top - 1;  /* protect stack below results */
+    luaD_throw(L, LUA_YIELD);
+  }
+}
+
diff --git a/libs/lua/lua-5.3.3/ldebug.h b/libs/lua/lua-5.3.3/ldebug.h
new file mode 100644
index 0000000..0e31546
--- /dev/null
+++ b/libs/lua/lua-5.3.3/ldebug.h
@@ -0,0 +1,39 @@
+/*
+** $Id: ldebug.h,v 2.14 2015/05/22 17:45:56 roberto Exp $
+** Auxiliary functions from Debug Interface module
+** See Copyright Notice in lua.h
+*/
+
+#ifndef ldebug_h
+#define ldebug_h
+
+
+#include "lstate.h"
+
+
+#define pcRel(pc, p)	(cast(int, (pc) - (p)->code) - 1)
+
+#define getfuncline(f,pc)	(((f)->lineinfo) ? (f)->lineinfo[pc] : -1)
+
+#define resethookcount(L)	(L->hookcount = L->basehookcount)
+
+
+LUAI_FUNC l_noret luaG_typeerror (lua_State *L, const TValue *o,
+                                                const char *opname);
+LUAI_FUNC l_noret luaG_concaterror (lua_State *L, const TValue *p1,
+                                                  const TValue *p2);
+LUAI_FUNC l_noret luaG_opinterror (lua_State *L, const TValue *p1,
+                                                 const TValue *p2,
+                                                 const char *msg);
+LUAI_FUNC l_noret luaG_tointerror (lua_State *L, const TValue *p1,
+                                                 const TValue *p2);
+LUAI_FUNC l_noret luaG_ordererror (lua_State *L, const TValue *p1,
+                                                 const TValue *p2);
+LUAI_FUNC l_noret luaG_runerror (lua_State *L, const char *fmt, ...);
+LUAI_FUNC const char *luaG_addinfo (lua_State *L, const char *msg,
+                                                  TString *src, int line);
+LUAI_FUNC l_noret luaG_errormsg (lua_State *L);
+LUAI_FUNC void luaG_traceexec (lua_State *L);
+
+
+#endif
diff --git a/libs/lua/lua-5.3.3/ldo.c b/libs/lua/lua-5.3.3/ldo.c
new file mode 100644
index 0000000..8804c99
--- /dev/null
+++ b/libs/lua/lua-5.3.3/ldo.c
@@ -0,0 +1,800 @@
+/*
+** $Id: ldo.c,v 2.151 2015/12/16 16:40:07 roberto Exp $
+** Stack and Call structure of Lua
+** See Copyright Notice in lua.h
+*/
+
+#define ldo_c
+#define LUA_CORE
+
+#include "lprefix.h"
+
+
+#include <setjmp.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "lua.h"
+
+#include "lapi.h"
+#include "ldebug.h"
+#include "ldo.h"
+#include "lfunc.h"
+#include "lgc.h"
+#include "lmem.h"
+#include "lobject.h"
+#include "lopcodes.h"
+#include "lparser.h"
+#include "lstate.h"
+#include "lstring.h"
+#include "ltable.h"
+#include "ltm.h"
+#include "lundump.h"
+#include "lvm.h"
+#include "lzio.h"
+
+
+
+#define errorstatus(s)	((s) > LUA_YIELD)
+
+
+/*
+** {======================================================
+** Error-recovery functions
+** =======================================================
+*/
+
+/*
+** LUAI_THROW/LUAI_TRY define how Lua does exception handling. By
+** default, Lua handles errors with exceptions when compiling as
+** C++ code, with _longjmp/_setjmp when asked to use them, and with
+** longjmp/setjmp otherwise.
+*/
+#if !defined(LUAI_THROW)				/* { */
+
+#if defined(__cplusplus) && !defined(LUA_USE_LONGJMP)	/* { */
+
+/* C++ exceptions */
+#define LUAI_THROW(L,c)		throw(c)
+#define LUAI_TRY(L,c,a) \
+	try { a } catch(...) { if ((c)->status == 0) (c)->status = -1; }
+#define luai_jmpbuf		int  /* dummy variable */
+
+#elif defined(LUA_USE_POSIX)				/* }{ */
+
+/* in POSIX, try _longjmp/_setjmp (more efficient) */
+#define LUAI_THROW(L,c)		_longjmp((c)->b, 1)
+#define LUAI_TRY(L,c,a)		if (_setjmp((c)->b) == 0) { a }
+#define luai_jmpbuf		jmp_buf
+
+#else							/* }{ */
+
+/* ISO C handling with long jumps */
+#define LUAI_THROW(L,c)		longjmp((c)->b, 1)
+#define LUAI_TRY(L,c,a)		if (setjmp((c)->b) == 0) { a }
+#define luai_jmpbuf		jmp_buf
+
+#endif							/* } */
+
+#endif							/* } */
+
+
+
+/* chain list of long jump buffers */
+struct lua_longjmp {
+  struct lua_longjmp *previous;
+  luai_jmpbuf b;
+  volatile int status;  /* error code */
+};
+
+
+static void seterrorobj (lua_State *L, int errcode, StkId oldtop) {
+  switch (errcode) {
+    case LUA_ERRMEM: {  /* memory error? */
+      setsvalue2s(L, oldtop, G(L)->memerrmsg); /* reuse preregistered msg. */
+      break;
+    }
+    case LUA_ERRERR: {
+      setsvalue2s(L, oldtop, luaS_newliteral(L, "error in error handling"));
+      break;
+    }
+    default: {
+      setobjs2s(L, oldtop, L->top - 1);  /* error message on current top */
+      break;
+    }
+  }
+  L->top = oldtop + 1;
+}
+
+
+l_noret luaD_throw (lua_State *L, int errcode) {
+  if (L->errorJmp) {  /* thread has an error handler? */
+    L->errorJmp->status = errcode;  /* set status */
+    LUAI_THROW(L, L->errorJmp);  /* jump to it */
+  }
+  else {  /* thread has no error handler */
+    global_State *g = G(L);
+    L->status = cast_byte(errcode);  /* mark it as dead */
+    if (g->mainthread->errorJmp) {  /* main thread has a handler? */
+      setobjs2s(L, g->mainthread->top++, L->top - 1);  /* copy error obj. */
+      luaD_throw(g->mainthread, errcode);  /* re-throw in main thread */
+    }
+    else {  /* no handler at all; abort */
+      if (g->panic) {  /* panic function? */
+        seterrorobj(L, errcode, L->top);  /* assume EXTRA_STACK */
+        if (L->ci->top < L->top)
+          L->ci->top = L->top;  /* pushing msg. can break this invariant */
+        lua_unlock(L);
+        g->panic(L);  /* call panic function (last chance to jump out) */
+      }
+      abort();
+    }
+  }
+}
+
+
+int luaD_rawrunprotected (lua_State *L, Pfunc f, void *ud) {
+  unsigned short oldnCcalls = L->nCcalls;
+  struct lua_longjmp lj;
+  lj.status = LUA_OK;
+  lj.previous = L->errorJmp;  /* chain new error handler */
+  L->errorJmp = &lj;
+  LUAI_TRY(L, &lj,
+    (*f)(L, ud);
+  );
+  L->errorJmp = lj.previous;  /* restore old error handler */
+  L->nCcalls = oldnCcalls;
+  return lj.status;
+}
+
+/* }====================================================== */
+
+
+/*
+** {==================================================================
+** Stack reallocation
+** ===================================================================
+*/
+static void correctstack (lua_State *L, TValue *oldstack) {
+  CallInfo *ci;
+  UpVal *up;
+  L->top = (L->top - oldstack) + L->stack;
+  for (up = L->openupval; up != NULL; up = up->u.open.next)
+    up->v = (up->v - oldstack) + L->stack;
+  for (ci = L->ci; ci != NULL; ci = ci->previous) {
+    ci->top = (ci->top - oldstack) + L->stack;
+    ci->func = (ci->func - oldstack) + L->stack;
+    if (isLua(ci))
+      ci->u.l.base = (ci->u.l.base - oldstack) + L->stack;
+  }
+}
+
+
+/* some space for error handling */
+#define ERRORSTACKSIZE	(LUAI_MAXSTACK + 200)
+
+
+void luaD_reallocstack (lua_State *L, int newsize) {
+  TValue *oldstack = L->stack;
+  int lim = L->stacksize;
+  lua_assert(newsize <= LUAI_MAXSTACK || newsize == ERRORSTACKSIZE);
+  lua_assert(L->stack_last - L->stack == L->stacksize - EXTRA_STACK);
+  luaM_reallocvector(L, L->stack, L->stacksize, newsize, TValue);
+  for (; lim < newsize; lim++)
+    setnilvalue(L->stack + lim); /* erase new segment */
+  L->stacksize = newsize;
+  L->stack_last = L->stack + newsize - EXTRA_STACK;
+  correctstack(L, oldstack);
+}
+
+
+void luaD_growstack (lua_State *L, int n) {
+  int size = L->stacksize;
+  if (size > LUAI_MAXSTACK)  /* error after extra size? */
+    luaD_throw(L, LUA_ERRERR);
+  else {
+    int needed = cast_int(L->top - L->stack) + n + EXTRA_STACK;
+    int newsize = 2 * size;
+    if (newsize > LUAI_MAXSTACK) newsize = LUAI_MAXSTACK;
+    if (newsize < needed) newsize = needed;
+    if (newsize > LUAI_MAXSTACK) {  /* stack overflow? */
+      luaD_reallocstack(L, ERRORSTACKSIZE);
+      luaG_runerror(L, "stack overflow");
+    }
+    else
+      luaD_reallocstack(L, newsize);
+  }
+}
+
+
+static int stackinuse (lua_State *L) {
+  CallInfo *ci;
+  StkId lim = L->top;
+  for (ci = L->ci; ci != NULL; ci = ci->previous) {
+    lua_assert(ci->top <= L->stack_last);
+    if (lim < ci->top) lim = ci->top;
+  }
+  return cast_int(lim - L->stack) + 1;  /* part of stack in use */
+}
+
+
+void luaD_shrinkstack (lua_State *L) {
+  int inuse = stackinuse(L);
+  int goodsize = inuse + (inuse / 8) + 2*EXTRA_STACK;
+  if (goodsize > LUAI_MAXSTACK) goodsize = LUAI_MAXSTACK;
+  if (L->stacksize > LUAI_MAXSTACK)  /* was handling stack overflow? */
+    luaE_freeCI(L);  /* free all CIs (list grew because of an error) */
+  else
+    luaE_shrinkCI(L);  /* shrink list */
+  if (inuse <= LUAI_MAXSTACK &&  /* not handling stack overflow? */
+      goodsize < L->stacksize)  /* trying to shrink? */
+    luaD_reallocstack(L, goodsize);  /* shrink it */
+  else
+    condmovestack(L,,);  /* don't change stack (change only for debugging) */
+}
+
+
+void luaD_inctop (lua_State *L) {
+  luaD_checkstack(L, 1);
+  L->top++;
+}
+
+/* }================================================================== */
+
+
+/*
+** Call a hook for the given event. Make sure there is a hook to be
+** called. (Both 'L->hook' and 'L->hookmask', which triggers this
+** function, can be changed asynchronously by signals.)
+*/
+void luaD_hook (lua_State *L, int event, int line) {
+  lua_Hook hook = L->hook;
+  if (hook && L->allowhook) {  /* make sure there is a hook */
+    CallInfo *ci = L->ci;
+    ptrdiff_t top = savestack(L, L->top);
+    ptrdiff_t ci_top = savestack(L, ci->top);
+    lua_Debug ar;
+    ar.event = event;
+    ar.currentline = line;
+    ar.i_ci = ci;
+    luaD_checkstack(L, LUA_MINSTACK);  /* ensure minimum stack size */
+    ci->top = L->top + LUA_MINSTACK;
+    lua_assert(ci->top <= L->stack_last);
+    L->allowhook = 0;  /* cannot call hooks inside a hook */
+    ci->callstatus |= CIST_HOOKED;
+    lua_unlock(L);
+    (*hook)(L, &ar);
+    lua_lock(L);
+    lua_assert(!L->allowhook);
+    L->allowhook = 1;
+    ci->top = restorestack(L, ci_top);
+    L->top = restorestack(L, top);
+    ci->callstatus &= ~CIST_HOOKED;
+  }
+}
+
+
+static void callhook (lua_State *L, CallInfo *ci) {
+  int hook = LUA_HOOKCALL;
+  ci->u.l.savedpc++;  /* hooks assume 'pc' is already incremented */
+  if (isLua(ci->previous) &&
+      GET_OPCODE(*(ci->previous->u.l.savedpc - 1)) == OP_TAILCALL) {
+    ci->callstatus |= CIST_TAIL;
+    hook = LUA_HOOKTAILCALL;
+  }
+  luaD_hook(L, hook, -1);
+  ci->u.l.savedpc--;  /* correct 'pc' */
+}
+
+
+static StkId adjust_varargs (lua_State *L, Proto *p, int actual) {
+  int i;
+  int nfixargs = p->numparams;
+  StkId base, fixed;
+  /* move fixed parameters to final position */
+  fixed = L->top - actual;  /* first fixed argument */
+  base = L->top;  /* final position of first argument */
+  for (i = 0; i < nfixargs && i < actual; i++) {
+    setobjs2s(L, L->top++, fixed + i);
+    setnilvalue(fixed + i);  /* erase original copy (for GC) */
+  }
+  for (; i < nfixargs; i++)
+    setnilvalue(L->top++);  /* complete missing arguments */
+  return base;
+}
+
+
+/*
+** Check whether __call metafield of 'func' is a function. If so, put
+** it in stack below original 'func' so that 'luaD_precall' can call
+** it. Raise an error if __call metafield is not a function.
+*/
+static void tryfuncTM (lua_State *L, StkId func) {
+  const TValue *tm = luaT_gettmbyobj(L, func, TM_CALL);
+  StkId p;
+  if (!ttisfunction(tm))
+    luaG_typeerror(L, func, "call");
+  /* Open a hole inside the stack at 'func' */
+  for (p = L->top; p > func; p--)
+    setobjs2s(L, p, p-1);
+  L->top++;  /* slot ensured by caller */
+  setobj2s(L, func, tm);  /* tag method is the new function to be called */
+}
+
+
+
+#define next_ci(L) (L->ci = (L->ci->next ? L->ci->next : luaE_extendCI(L)))
+
+
+/* macro to check stack size, preserving 'p' */
+#define checkstackp(L,n,p)  \
+  luaD_checkstackaux(L, n, \
+    ptrdiff_t t__ = savestack(L, p);  /* save 'p' */ \
+    luaC_checkGC(L),  /* stack grow uses memory */ \
+    p = restorestack(L, t__))  /* 'pos' part: restore 'p' */
+
+
+/*
+** Prepares a function call: checks the stack, creates a new CallInfo
+** entry, fills in the relevant information, calls hook if needed.
+** If function is a C function, does the call, too. (Otherwise, leave
+** the execution ('luaV_execute') to the caller, to allow stackless
+** calls.) Returns true iff function has been executed (C function).
+*/
+int luaD_precall (lua_State *L, StkId func, int nresults) {
+  lua_CFunction f;
+  CallInfo *ci;
+  switch (ttype(func)) {
+    case LUA_TCCL:  /* C closure */
+      f = clCvalue(func)->f;
+      goto Cfunc;
+    case LUA_TLCF:  /* light C function */
+      f = fvalue(func);
+     Cfunc: {
+      int n;  /* number of returns */
+      checkstackp(L, LUA_MINSTACK, func);  /* ensure minimum stack size */
+      ci = next_ci(L);  /* now 'enter' new function */
+      ci->nresults = nresults;
+      ci->func = func;
+      ci->top = L->top + LUA_MINSTACK;
+      lua_assert(ci->top <= L->stack_last);
+      ci->callstatus = 0;
+      if (L->hookmask & LUA_MASKCALL)
+        luaD_hook(L, LUA_HOOKCALL, -1);
+      lua_unlock(L);
+      n = (*f)(L);  /* do the actual call */
+      lua_lock(L);
+      api_checknelems(L, n);
+      luaD_poscall(L, ci, L->top - n, n);
+      return 1;
+    }
+    case LUA_TLCL: {  /* Lua function: prepare its call */
+      StkId base;
+      Proto *p = clLvalue(func)->p;
+      int n = cast_int(L->top - func) - 1;  /* number of real arguments */
+      int fsize = p->maxstacksize;  /* frame size */
+      checkstackp(L, fsize, func);
+      if (p->is_vararg != 1) {  /* do not use vararg? */
+        for (; n < p->numparams; n++)
+          setnilvalue(L->top++);  /* complete missing arguments */
+        base = func + 1;
+      }
+      else
+        base = adjust_varargs(L, p, n);
+      ci = next_ci(L);  /* now 'enter' new function */
+      ci->nresults = nresults;
+      ci->func = func;
+      ci->u.l.base = base;
+      L->top = ci->top = base + fsize;
+      lua_assert(ci->top <= L->stack_last);
+      ci->u.l.savedpc = p->code;  /* starting point */
+      ci->callstatus = CIST_LUA;
+      if (L->hookmask & LUA_MASKCALL)
+        callhook(L, ci);
+      return 0;
+    }
+    default: {  /* not a function */
+      checkstackp(L, 1, func);  /* ensure space for metamethod */
+      tryfuncTM(L, func);  /* try to get '__call' metamethod */
+      return luaD_precall(L, func, nresults);  /* now it must be a function */
+    }
+  }
+}
+
+
+/*
+** Given 'nres' results at 'firstResult', move 'wanted' of them to 'res'.
+** Handle most typical cases (zero results for commands, one result for
+** expressions, multiple results for tail calls/single parameters)
+** separated.
+*/
+static int moveresults (lua_State *L, const TValue *firstResult, StkId res,
+                                      int nres, int wanted) {
+  switch (wanted) {  /* handle typical cases separately */
+    case 0: break;  /* nothing to move */
+    case 1: {  /* one result needed */
+      if (nres == 0)   /* no results? */
+        firstResult = luaO_nilobject;  /* adjust with nil */
+      setobjs2s(L, res, firstResult);  /* move it to proper place */
+      break;
+    }
+    case LUA_MULTRET: {
+      int i;
+      for (i = 0; i < nres; i++)  /* move all results to correct place */
+        setobjs2s(L, res + i, firstResult + i);
+      L->top = res + nres;
+      return 0;  /* wanted == LUA_MULTRET */
+    }
+    default: {
+      int i;
+      if (wanted <= nres) {  /* enough results? */
+        for (i = 0; i < wanted; i++)  /* move wanted results to correct place */
+          setobjs2s(L, res + i, firstResult + i);
+      }
+      else {  /* not enough results; use all of them plus nils */
+        for (i = 0; i < nres; i++)  /* move all results to correct place */
+          setobjs2s(L, res + i, firstResult + i);
+        for (; i < wanted; i++)  /* complete wanted number of results */
+          setnilvalue(res + i);
+      }
+      break;
+    }
+  }
+  L->top = res + wanted;  /* top points after the last result */
+  return 1;
+}
+
+
+/*
+** Finishes a function call: calls hook if necessary, removes CallInfo,
+** moves current number of results to proper place; returns 0 iff call
+** wanted multiple (variable number of) results.
+*/
+int luaD_poscall (lua_State *L, CallInfo *ci, StkId firstResult, int nres) {
+  StkId res;
+  int wanted = ci->nresults;
+  if (L->hookmask & (LUA_MASKRET | LUA_MASKLINE)) {
+    if (L->hookmask & LUA_MASKRET) {
+      ptrdiff_t fr = savestack(L, firstResult);  /* hook may change stack */
+      luaD_hook(L, LUA_HOOKRET, -1);
+      firstResult = restorestack(L, fr);
+    }
+    L->oldpc = ci->previous->u.l.savedpc;  /* 'oldpc' for caller function */
+  }
+  res = ci->func;  /* res == final position of 1st result */
+  L->ci = ci->previous;  /* back to caller */
+  /* move results to proper place */
+  return moveresults(L, firstResult, res, nres, wanted);
+}
+
+
+/*
+** Check appropriate error for stack overflow ("regular" overflow or
+** overflow while handling stack overflow). If 'nCalls' is larger than
+** LUAI_MAXCCALLS (which means it is handling a "regular" overflow) but
+** smaller than 9/8 of LUAI_MAXCCALLS, does not report an error (to
+** allow overflow handling to work)
+*/
+static void stackerror (lua_State *L) {
+  if (L->nCcalls == LUAI_MAXCCALLS)
+    luaG_runerror(L, "C stack overflow");
+  else if (L->nCcalls >= (LUAI_MAXCCALLS + (LUAI_MAXCCALLS>>3)))
+    luaD_throw(L, LUA_ERRERR);  /* error while handing stack error */
+}
+
+
+/*
+** Call a function (C or Lua). The function to be called is at *func.
+** The arguments are on the stack, right after the function.
+** When returns, all the results are on the stack, starting at the original
+** function position.
+*/
+void luaD_call (lua_State *L, StkId func, int nResults) {
+  if (++L->nCcalls >= LUAI_MAXCCALLS)
+    stackerror(L);
+  if (!luaD_precall(L, func, nResults))  /* is a Lua function? */
+    luaV_execute(L);  /* call it */
+  L->nCcalls--;
+}
+
+
+/*
+** Similar to 'luaD_call', but does not allow yields during the call
+*/
+void luaD_callnoyield (lua_State *L, StkId func, int nResults) {
+  L->nny++;
+  luaD_call(L, func, nResults);
+  L->nny--;
+}
+
+
+/*
+** Completes the execution of an interrupted C function, calling its
+** continuation function.
+*/
+static void finishCcall (lua_State *L, int status) {
+  CallInfo *ci = L->ci;
+  int n;
+  /* must have a continuation and must be able to call it */
+  lua_assert(ci->u.c.k != NULL && L->nny == 0);
+  /* error status can only happen in a protected call */
+  lua_assert((ci->callstatus & CIST_YPCALL) || status == LUA_YIELD);
+  if (ci->callstatus & CIST_YPCALL) {  /* was inside a pcall? */
+    ci->callstatus &= ~CIST_YPCALL;  /* finish 'lua_pcall' */
+    L->errfunc = ci->u.c.old_errfunc;
+  }
+  /* finish 'lua_callk'/'lua_pcall'; CIST_YPCALL and 'errfunc' already
+     handled */
+  adjustresults(L, ci->nresults);
+  /* call continuation function */
+  lua_unlock(L);
+  n = (*ci->u.c.k)(L, status, ci->u.c.ctx);
+  lua_lock(L);
+  api_checknelems(L, n);
+  /* finish 'luaD_precall' */
+  luaD_poscall(L, ci, L->top - n, n);
+}
+
+
+/*
+** Executes "full continuation" (everything in the stack) of a
+** previously interrupted coroutine until the stack is empty (or another
+** interruption long-jumps out of the loop). If the coroutine is
+** recovering from an error, 'ud' points to the error status, which must
+** be passed to the first continuation function (otherwise the default
+** status is LUA_YIELD).
+*/
+static void unroll (lua_State *L, void *ud) {
+  if (ud != NULL)  /* error status? */
+    finishCcall(L, *(int *)ud);  /* finish 'lua_pcallk' callee */
+  while (L->ci != &L->base_ci) {  /* something in the stack */
+    if (!isLua(L->ci))  /* C function? */
+      finishCcall(L, LUA_YIELD);  /* complete its execution */
+    else {  /* Lua function */
+      luaV_finishOp(L);  /* finish interrupted instruction */
+      luaV_execute(L);  /* execute down to higher C 'boundary' */
+    }
+  }
+}
+
+
+/*
+** Try to find a suspended protected call (a "recover point") for the
+** given thread.
+*/
+static CallInfo *findpcall (lua_State *L) {
+  CallInfo *ci;
+  for (ci = L->ci; ci != NULL; ci = ci->previous) {  /* search for a pcall */
+    if (ci->callstatus & CIST_YPCALL)
+      return ci;
+  }
+  return NULL;  /* no pending pcall */
+}
+
+
+/*
+** Recovers from an error in a coroutine. Finds a recover point (if
+** there is one) and completes the execution of the interrupted
+** 'luaD_pcall'. If there is no recover point, returns zero.
+*/
+static int recover (lua_State *L, int status) {
+  StkId oldtop;
+  CallInfo *ci = findpcall(L);
+  if (ci == NULL) return 0;  /* no recovery point */
+  /* "finish" luaD_pcall */
+  oldtop = restorestack(L, ci->extra);
+  luaF_close(L, oldtop);
+  seterrorobj(L, status, oldtop);
+  L->ci = ci;
+  L->allowhook = getoah(ci->callstatus);  /* restore original 'allowhook' */
+  L->nny = 0;  /* should be zero to be yieldable */
+  luaD_shrinkstack(L);
+  L->errfunc = ci->u.c.old_errfunc;
+  return 1;  /* continue running the coroutine */
+}
+
+
+/*
+** signal an error in the call to 'resume', not in the execution of the
+** coroutine itself. (Such errors should not be handled by any coroutine
+** error handler and should not kill the coroutine.)
+*/
+static l_noret resume_error (lua_State *L, const char *msg, StkId firstArg) {
+  L->top = firstArg;  /* remove args from the stack */
+  setsvalue2s(L, L->top, luaS_new(L, msg));  /* push error message */
+  api_incr_top(L);
+  luaD_throw(L, -1);  /* jump back to 'lua_resume' */
+}
+
+
+/*
+** Do the work for 'lua_resume' in protected mode. Most of the work
+** depends on the status of the coroutine: initial state, suspended
+** inside a hook, or regularly suspended (optionally with a continuation
+** function), plus erroneous cases: non-suspended coroutine or dead
+** coroutine.
+*/
+static void resume (lua_State *L, void *ud) {
+  int nCcalls = L->nCcalls;
+  int n = *(cast(int*, ud));  /* number of arguments */
+  StkId firstArg = L->top - n;  /* first argument */
+  CallInfo *ci = L->ci;
+  if (nCcalls >= LUAI_MAXCCALLS)
+    resume_error(L, "C stack overflow", firstArg);
+  if (L->status == LUA_OK) {  /* may be starting a coroutine */
+    if (ci != &L->base_ci)  /* not in base level? */
+      resume_error(L, "cannot resume non-suspended coroutine", firstArg);
+    /* coroutine is in base level; start running it */
+    if (!luaD_precall(L, firstArg - 1, LUA_MULTRET))  /* Lua function? */
+      luaV_execute(L);  /* call it */
+  }
+  else if (L->status != LUA_YIELD)
+    resume_error(L, "cannot resume dead coroutine", firstArg);
+  else {  /* resuming from previous yield */
+    L->status = LUA_OK;  /* mark that it is running (again) */
+    ci->func = restorestack(L, ci->extra);
+    if (isLua(ci))  /* yielded inside a hook? */
+      luaV_execute(L);  /* just continue running Lua code */
+    else {  /* 'common' yield */
+      if (ci->u.c.k != NULL) {  /* does it have a continuation function? */
+        lua_unlock(L);
+        n = (*ci->u.c.k)(L, LUA_YIELD, ci->u.c.ctx); /* call continuation */
+        lua_lock(L);
+        api_checknelems(L, n);
+        firstArg = L->top - n;  /* yield results come from continuation */
+      }
+      luaD_poscall(L, ci, firstArg, n);  /* finish 'luaD_precall' */
+    }
+    unroll(L, NULL);  /* run continuation */
+  }
+  lua_assert(nCcalls == L->nCcalls);
+}
+
+
+LUA_API int lua_resume (lua_State *L, lua_State *from, int nargs) {
+  int status;
+  unsigned short oldnny = L->nny;  /* save "number of non-yieldable" calls */
+  lua_lock(L);
+  luai_userstateresume(L, nargs);
+  L->nCcalls = (from) ? from->nCcalls + 1 : 1;
+  L->nny = 0;  /* allow yields */
+  api_checknelems(L, (L->status == LUA_OK) ? nargs + 1 : nargs);
+  status = luaD_rawrunprotected(L, resume, &nargs);
+  if (status == -1)  /* error calling 'lua_resume'? */
+    status = LUA_ERRRUN;
+  else {  /* continue running after recoverable errors */
+    while (errorstatus(status) && recover(L, status)) {
+      /* unroll continuation */
+      status = luaD_rawrunprotected(L, unroll, &status);
+    }
+    if (errorstatus(status)) {  /* unrecoverable error? */
+      L->status = cast_byte(status);  /* mark thread as 'dead' */
+      seterrorobj(L, status, L->top);  /* push error message */
+      L->ci->top = L->top;
+    }
+    else lua_assert(status == L->status);  /* normal end or yield */
+  }
+  L->nny = oldnny;  /* restore 'nny' */
+  L->nCcalls--;
+  lua_assert(L->nCcalls == ((from) ? from->nCcalls : 0));
+  lua_unlock(L);
+  return status;
+}
+
+
+LUA_API int lua_isyieldable (lua_State *L) {
+  return (L->nny == 0);
+}
+
+
+LUA_API int lua_yieldk (lua_State *L, int nresults, lua_KContext ctx,
+                        lua_KFunction k) {
+  CallInfo *ci = L->ci;
+  luai_userstateyield(L, nresults);
+  lua_lock(L);
+  api_checknelems(L, nresults);
+  if (L->nny > 0) {
+    if (L != G(L)->mainthread)
+      luaG_runerror(L, "attempt to yield across a C-call boundary");
+    else
+      luaG_runerror(L, "attempt to yield from outside a coroutine");
+  }
+  L->status = LUA_YIELD;
+  ci->extra = savestack(L, ci->func);  /* save current 'func' */
+  if (isLua(ci)) {  /* inside a hook? */
+    api_check(L, k == NULL, "hooks cannot continue after yielding");
+  }
+  else {
+    if ((ci->u.c.k = k) != NULL)  /* is there a continuation? */
+      ci->u.c.ctx = ctx;  /* save context */
+    ci->func = L->top - nresults - 1;  /* protect stack below results */
+    luaD_throw(L, LUA_YIELD);
+  }
+  lua_assert(ci->callstatus & CIST_HOOKED);  /* must be inside a hook */
+  lua_unlock(L);
+  return 0;  /* return to 'luaD_hook' */
+}
+
+
+int luaD_pcall (lua_State *L, Pfunc func, void *u,
+                ptrdiff_t old_top, ptrdiff_t ef) {
+  int status;
+  CallInfo *old_ci = L->ci;
+  lu_byte old_allowhooks = L->allowhook;
+  unsigned short old_nny = L->nny;
+  ptrdiff_t old_errfunc = L->errfunc;
+  L->errfunc = ef;
+  status = luaD_rawrunprotected(L, func, u);
+  if (status != LUA_OK) {  /* an error occurred? */
+    StkId oldtop = restorestack(L, old_top);
+    luaF_close(L, oldtop);  /* close possible pending closures */
+    seterrorobj(L, status, oldtop);
+    L->ci = old_ci;
+    L->allowhook = old_allowhooks;
+    L->nny = old_nny;
+    luaD_shrinkstack(L);
+  }
+  L->errfunc = old_errfunc;
+  return status;
+}
+
+
+
+/*
+** Execute a protected parser.
+*/
+struct SParser {  /* data to 'f_parser' */
+  ZIO *z;
+  Mbuffer buff;  /* dynamic structure used by the scanner */
+  Dyndata dyd;  /* dynamic structures used by the parser */
+  const char *mode;
+  const char *name;
+};
+
+
+static void checkmode (lua_State *L, const char *mode, const char *x) {
+  if (mode && strchr(mode, x[0]) == NULL) {
+    luaO_pushfstring(L,
+       "attempt to load a %s chunk (mode is '%s')", x, mode);
+    luaD_throw(L, LUA_ERRSYNTAX);
+  }
+}
+
+
+static void f_parser (lua_State *L, void *ud) {
+  LClosure *cl;
+  struct SParser *p = cast(struct SParser *, ud);
+  int c = zgetc(p->z);  /* read first character */
+  if (c == LUA_SIGNATURE[0]) {
+    checkmode(L, p->mode, "binary");
+    cl = luaU_undump(L, p->z, p->name);
+  }
+  else {
+    checkmode(L, p->mode, "text");
+    cl = luaY_parser(L, p->z, &p->buff, &p->dyd, p->name, c);
+  }
+  lua_assert(cl->nupvalues == cl->p->sizeupvalues);
+  luaF_initupvals(L, cl);
+}
+
+
+int luaD_protectedparser (lua_State *L, ZIO *z, const char *name,
+                                        const char *mode) {
+  struct SParser p;
+  int status;
+  L->nny++;  /* cannot yield during parsing */
+  p.z = z; p.name = name; p.mode = mode;
+  p.dyd.actvar.arr = NULL; p.dyd.actvar.size = 0;
+  p.dyd.gt.arr = NULL; p.dyd.gt.size = 0;
+  p.dyd.label.arr = NULL; p.dyd.label.size = 0;
+  luaZ_initbuffer(L, &p.buff);
+  status = luaD_pcall(L, f_parser, &p, savestack(L, L->top), L->errfunc);
+  luaZ_freebuffer(L, &p.buff);
+  luaM_freearray(L, p.dyd.actvar.arr, p.dyd.actvar.size);
+  luaM_freearray(L, p.dyd.gt.arr, p.dyd.gt.size);
+  luaM_freearray(L, p.dyd.label.arr, p.dyd.label.size);
+  L->nny--;
+  return status;
+}
+
+
diff --git a/libs/lua/lua-5.3.3/ldo.h b/libs/lua/lua-5.3.3/ldo.h
new file mode 100644
index 0000000..4f5d51c
--- /dev/null
+++ b/libs/lua/lua-5.3.3/ldo.h
@@ -0,0 +1,58 @@
+/*
+** $Id: ldo.h,v 2.29 2015/12/21 13:02:14 roberto Exp $
+** Stack and Call structure of Lua
+** See Copyright Notice in lua.h
+*/
+
+#ifndef ldo_h
+#define ldo_h
+
+
+#include "lobject.h"
+#include "lstate.h"
+#include "lzio.h"
+
+
+/*
+** Macro to check stack size and grow stack if needed.  Parameters
+** 'pre'/'pos' allow the macro to preserve a pointer into the
+** stack across reallocations, doing the work only when needed.
+** 'condmovestack' is used in heavy tests to force a stack reallocation
+** at every check.
+*/
+#define luaD_checkstackaux(L,n,pre,pos)  \
+	if (L->stack_last - L->top <= (n)) \
+	  { pre; luaD_growstack(L, n); pos; } else { condmovestack(L,pre,pos); }
+
+/* In general, 'pre'/'pos' are empty (nothing to save) */
+#define luaD_checkstack(L,n)	luaD_checkstackaux(L,n,(void)0,(void)0)
+
+
+
+#define savestack(L,p)		((char *)(p) - (char *)L->stack)
+#define restorestack(L,n)	((TValue *)((char *)L->stack + (n)))
+
+
+/* type of protected functions, to be ran by 'runprotected' */
+typedef void (*Pfunc) (lua_State *L, void *ud);
+
+LUAI_FUNC int luaD_protectedparser (lua_State *L, ZIO *z, const char *name,
+                                                  const char *mode);
+LUAI_FUNC void luaD_hook (lua_State *L, int event, int line);
+LUAI_FUNC int luaD_precall (lua_State *L, StkId func, int nresults);
+LUAI_FUNC void luaD_call (lua_State *L, StkId func, int nResults);
+LUAI_FUNC void luaD_callnoyield (lua_State *L, StkId func, int nResults);
+LUAI_FUNC int luaD_pcall (lua_State *L, Pfunc func, void *u,
+                                        ptrdiff_t oldtop, ptrdiff_t ef);
+LUAI_FUNC int luaD_poscall (lua_State *L, CallInfo *ci, StkId firstResult,
+                                          int nres);
+LUAI_FUNC void luaD_reallocstack (lua_State *L, int newsize);
+LUAI_FUNC void luaD_growstack (lua_State *L, int n);
+LUAI_FUNC void luaD_shrinkstack (lua_State *L);
+LUAI_FUNC void luaD_inctop (lua_State *L);
+
+LUAI_FUNC l_noret luaD_throw (lua_State *L, int errcode);
+LUAI_FUNC int luaD_rawrunprotected (lua_State *L, Pfunc f, void *ud);
+
+#endif
+
diff --git a/libs/lua/lua-5.3.3/ldump.c b/libs/lua/lua-5.3.3/ldump.c
new file mode 100644
index 0000000..016e300
--- /dev/null
+++ b/libs/lua/lua-5.3.3/ldump.c
@@ -0,0 +1,215 @@
+/*
+** $Id: ldump.c,v 2.37 2015/10/08 15:53:49 roberto Exp $
+** save precompiled Lua chunks
+** See Copyright Notice in lua.h
+*/
+
+#define ldump_c
+#define LUA_CORE
+
+#include "lprefix.h"
+
+
+#include <stddef.h>
+
+#include "lua.h"
+
+#include "lobject.h"
+#include "lstate.h"
+#include "lundump.h"
+
+
+typedef struct {
+  lua_State *L;
+  lua_Writer writer;
+  void *data;
+  int strip;
+  int status;
+} DumpState;
+
+
+/*
+** All high-level dumps go through DumpVector; you can change it to
+** change the endianness of the result
+*/
+#define DumpVector(v,n,D)	DumpBlock(v,(n)*sizeof((v)[0]),D)
+
+#define DumpLiteral(s,D)	DumpBlock(s, sizeof(s) - sizeof(char), D)
+
+
+static void DumpBlock (const void *b, size_t size, DumpState *D) {
+  if (D->status == 0 && size > 0) {
+    lua_unlock(D->L);
+    D->status = (*D->writer)(D->L, b, size, D->data);
+    lua_lock(D->L);
+  }
+}
+
+
+#define DumpVar(x,D)		DumpVector(&x,1,D)
+
+
+static void DumpByte (int y, DumpState *D) {
+  lu_byte x = (lu_byte)y;
+  DumpVar(x, D);
+}
+
+
+static void DumpInt (int x, DumpState *D) {
+  DumpVar(x, D);
+}
+
+
+static void DumpNumber (lua_Number x, DumpState *D) {
+  DumpVar(x, D);
+}
+
+
+static void DumpInteger (lua_Integer x, DumpState *D) {
+  DumpVar(x, D);
+}
+
+
+static void DumpString (const TString *s, DumpState *D) {
+  if (s == NULL)
+    DumpByte(0, D);
+  else {
+    size_t size = tsslen(s) + 1;  /* include trailing '\0' */
+    const char *str = getstr(s);
+    if (size < 0xFF)
+      DumpByte(cast_int(size), D);
+    else {
+      DumpByte(0xFF, D);
+      DumpVar(size, D);
+    }
+    DumpVector(str, size - 1, D);  /* no need to save '\0' */
+  }
+}
+
+
+static void DumpCode (const Proto *f, DumpState *D) {
+  DumpInt(f->sizecode, D);
+  DumpVector(f->code, f->sizecode, D);
+}
+
+
+static void DumpFunction(const Proto *f, TString *psource, DumpState *D);
+
+static void DumpConstants (const Proto *f, DumpState *D) {
+  int i;
+  int n = f->sizek;
+  DumpInt(n, D);
+  for (i = 0; i < n; i++) {
+    const TValue *o = &f->k[i];
+    DumpByte(ttype(o), D);
+    switch (ttype(o)) {
+    case LUA_TNIL:
+      break;
+    case LUA_TBOOLEAN:
+      DumpByte(bvalue(o), D);
+      break;
+    case LUA_TNUMFLT:
+      DumpNumber(fltvalue(o), D);
+      break;
+    case LUA_TNUMINT:
+      DumpInteger(ivalue(o), D);
+      break;
+    case LUA_TSHRSTR:
+    case LUA_TLNGSTR:
+      DumpString(tsvalue(o), D);
+      break;
+    default:
+      lua_assert(0);
+    }
+  }
+}
+
+
+static void DumpProtos (const Proto *f, DumpState *D) {
+  int i;
+  int n = f->sizep;
+  DumpInt(n, D);
+  for (i = 0; i < n; i++)
+    DumpFunction(f->p[i], f->source, D);
+}
+
+
+static void DumpUpvalues (const Proto *f, DumpState *D) {
+  int i, n = f->sizeupvalues;
+  DumpInt(n, D);
+  for (i = 0; i < n; i++) {
+    DumpByte(f->upvalues[i].instack, D);
+    DumpByte(f->upvalues[i].idx, D);
+  }
+}
+
+
+static void DumpDebug (const Proto *f, DumpState *D) {
+  int i, n;
+  n = (D->strip) ? 0 : f->sizelineinfo;
+  DumpInt(n, D);
+  DumpVector(f->lineinfo, n, D);
+  n = (D->strip) ? 0 : f->sizelocvars;
+  DumpInt(n, D);
+  for (i = 0; i < n; i++) {
+    DumpString(f->locvars[i].varname, D);
+    DumpInt(f->locvars[i].startpc, D);
+    DumpInt(f->locvars[i].endpc, D);
+  }
+  n = (D->strip) ? 0 : f->sizeupvalues;
+  DumpInt(n, D);
+  for (i = 0; i < n; i++)
+    DumpString(f->upvalues[i].name, D);
+}
+
+
+static void DumpFunction (const Proto *f, TString *psource, DumpState *D) {
+  if (D->strip || f->source == psource)
+    DumpString(NULL, D);  /* no debug info or same source as its parent */
+  else
+    DumpString(f->source, D);
+  DumpInt(f->linedefined, D);
+  DumpInt(f->lastlinedefined, D);
+  DumpByte(f->numparams, D);
+  DumpByte(f->is_vararg, D);
+  DumpByte(f->maxstacksize, D);
+  DumpCode(f, D);
+  DumpConstants(f, D);
+  DumpUpvalues(f, D);
+  DumpProtos(f, D);
+  DumpDebug(f, D);
+}
+
+
+static void DumpHeader (DumpState *D) {
+  DumpLiteral(LUA_SIGNATURE, D);
+  DumpByte(LUAC_VERSION, D);
+  DumpByte(LUAC_FORMAT, D);
+  DumpLiteral(LUAC_DATA, D);
+  DumpByte(sizeof(int), D);
+  DumpByte(sizeof(size_t), D);
+  DumpByte(sizeof(Instruction), D);
+  DumpByte(sizeof(lua_Integer), D);
+  DumpByte(sizeof(lua_Number), D);
+  DumpInteger(LUAC_INT, D);
+  DumpNumber(LUAC_NUM, D);
+}
+
+
+/*
+** dump Lua function as precompiled chunk
+*/
+int luaU_dump(lua_State *L, const Proto *f, lua_Writer w, void *data,
+              int strip) {
+  DumpState D;
+  D.L = L;
+  D.writer = w;
+  D.data = data;
+  D.strip = strip;
+  D.status = 0;
+  DumpHeader(&D);
+  DumpByte(f->sizeupvalues, &D);
+  DumpFunction(f, NULL, &D);
+  return D.status;
+}
+
diff --git a/libs/lua/lua-5.3.3/lfunc.c b/libs/lua/lua-5.3.3/lfunc.c
new file mode 100644
index 0000000..67967da
--- /dev/null
+++ b/libs/lua/lua-5.3.3/lfunc.c
@@ -0,0 +1,151 @@
+/*
+** $Id: lfunc.c,v 2.45 2014/11/02 19:19:04 roberto Exp $
+** Auxiliary functions to manipulate prototypes and closures
+** See Copyright Notice in lua.h
+*/
+
+#define lfunc_c
+#define LUA_CORE
+
+#include "lprefix.h"
+
+
+#include <stddef.h>
+
+#include "lua.h"
+
+#include "lfunc.h"
+#include "lgc.h"
+#include "lmem.h"
+#include "lobject.h"
+#include "lstate.h"
+
+
+
+CClosure *luaF_newCclosure (lua_State *L, int n) {
+  GCObject *o = luaC_newobj(L, LUA_TCCL, sizeCclosure(n));
+  CClosure *c = gco2ccl(o);
+  c->nupvalues = cast_byte(n);
+  return c;
+}
+
+
+LClosure *luaF_newLclosure (lua_State *L, int n) {
+  GCObject *o = luaC_newobj(L, LUA_TLCL, sizeLclosure(n));
+  LClosure *c = gco2lcl(o);
+  c->p = NULL;
+  c->nupvalues = cast_byte(n);
+  while (n--) c->upvals[n] = NULL;
+  return c;
+}
+
+/*
+** fill a closure with new closed upvalues
+*/
+void luaF_initupvals (lua_State *L, LClosure *cl) {
+  int i;
+  for (i = 0; i < cl->nupvalues; i++) {
+    UpVal *uv = luaM_new(L, UpVal);
+    uv->refcount = 1;
+    uv->v = &uv->u.value;  /* make it closed */
+    setnilvalue(uv->v);
+    cl->upvals[i] = uv;
+  }
+}
+
+
+UpVal *luaF_findupval (lua_State *L, StkId level) {
+  UpVal **pp = &L->openupval;
+  UpVal *p;
+  UpVal *uv;
+  lua_assert(isintwups(L) || L->openupval == NULL);
+  while (*pp != NULL && (p = *pp)->v >= level) {
+    lua_assert(upisopen(p));
+    if (p->v == level)  /* found a corresponding upvalue? */
+      return p;  /* return it */
+    pp = &p->u.open.next;
+  }
+  /* not found: create a new upvalue */
+  uv = luaM_new(L, UpVal);
+  uv->refcount = 0;
+  uv->u.open.next = *pp;  /* link it to list of open upvalues */
+  uv->u.open.touched = 1;
+  *pp = uv;
+  uv->v = level;  /* current value lives in the stack */
+  if (!isintwups(L)) {  /* thread not in list of threads with upvalues? */
+    L->twups = G(L)->twups;  /* link it to the list */
+    G(L)->twups = L;
+  }
+  return uv;
+}
+
+
+void luaF_close (lua_State *L, StkId level) {
+  UpVal *uv;
+  while (L->openupval != NULL && (uv = L->openupval)->v >= level) {
+    lua_assert(upisopen(uv));
+    L->openupval = uv->u.open.next;  /* remove from 'open' list */
+    if (uv->refcount == 0)  /* no references? */
+      luaM_free(L, uv);  /* free upvalue */
+    else {
+      setobj(L, &uv->u.value, uv->v);  /* move value to upvalue slot */
+      uv->v = &uv->u.value;  /* now current value lives here */
+      luaC_upvalbarrier(L, uv);
+    }
+  }
+}
+
+
+Proto *luaF_newproto (lua_State *L) {
+  GCObject *o = luaC_newobj(L, LUA_TPROTO, sizeof(Proto));
+  Proto *f = gco2p(o);
+  f->k = NULL;
+  f->sizek = 0;
+  f->p = NULL;
+  f->sizep = 0;
+  f->code = NULL;
+  f->cache = NULL;
+  f->sizecode = 0;
+  f->lineinfo = NULL;
+  f->sizelineinfo = 0;
+  f->upvalues = NULL;
+  f->sizeupvalues = 0;
+  f->numparams = 0;
+  f->is_vararg = 0;
+  f->maxstacksize = 0;
+  f->locvars = NULL;
+  f->sizelocvars = 0;
+  f->linedefined = 0;
+  f->lastlinedefined = 0;
+  f->source = NULL;
+  return f;
+}
+
+
+void luaF_freeproto (lua_State *L, Proto *f) {
+  luaM_freearray(L, f->code, f->sizecode);
+  luaM_freearray(L, f->p, f->sizep);
+  luaM_freearray(L, f->k, f->sizek);
+  luaM_freearray(L, f->lineinfo, f->sizelineinfo);
+  luaM_freearray(L, f->locvars, f->sizelocvars);
+  luaM_freearray(L, f->upvalues, f->sizeupvalues);
+  luaM_free(L, f);
+}
+
+
+/*
+** Look for n-th local variable at line 'line' in function 'func'.
+** Returns NULL if not found.
+*/
+const char *luaF_getlocalname (const Proto *f, int local_number, int pc) {
+  int i;
+  for (i = 0; i<f->sizelocvars && f->locvars[i].startpc <= pc; i++) {
+    if (pc < f->locvars[i].endpc) {  /* is variable active? */
+      local_number--;
+      if (local_number == 0)
+        return getstr(f->locvars[i].varname);
+    }
+  }
+  return NULL;  /* not found */
+}
+
diff --git a/libs/lua/lua-5.3.3/lfunc.h b/libs/lua/lua-5.3.3/lfunc.h
new file mode 100644
index 0000000..2eeb0d5
--- /dev/null
+++ b/libs/lua/lua-5.3.3/lfunc.h
@@ -0,0 +1,61 @@
+/*
+** $Id: lfunc.h,v 2.15 2015/01/13 15:49:11 roberto Exp $
+** Auxiliary functions to manipulate prototypes and closures
+** See Copyright Notice in lua.h
+*/
+
+#ifndef lfunc_h
+#define lfunc_h
+
+
+#include "lobject.h"
+
+
+#define sizeCclosure(n)	(cast(int, sizeof(CClosure)) + \
+                         cast(int, sizeof(TValue)*((n)-1)))
+
+#define sizeLclosure(n)	(cast(int, sizeof(LClosure)) + \
+                         cast(int, sizeof(TValue *)*((n)-1)))
+
+
+/* test whether thread is in 'twups' list */
+#define isintwups(L)	(L->twups != L)
+
+
+/*
+** maximum number of upvalues in a closure (both C and Lua). (Value
+** must fit in a VM register.)
+*/
+#define MAXUPVAL	255
+
+
+/*
+** Upvalues for Lua closures
+*/
+struct UpVal {
+  TValue *v;  /* points to stack or to its own value */
+  lu_mem refcount;  /* reference counter */
+  union {
+    struct {  /* (when open) */
+      UpVal *next;  /* linked list */
+      int touched;  /* mark to avoid cycles with dead threads */
+    } open;
+    TValue value;  /* the value (when closed) */
+  } u;
+};
+
+#define upisopen(up)	((up)->v != &(up)->u.value)
+
+
+LUAI_FUNC Proto *luaF_newproto (lua_State *L);
+LUAI_FUNC CClosure *luaF_newCclosure (lua_State *L, int nelems);
+LUAI_FUNC LClosure *luaF_newLclosure (lua_State *L, int nelems);
+LUAI_FUNC void luaF_initupvals (lua_State *L, LClosure *cl);
+LUAI_FUNC UpVal *luaF_findupval (lua_State *L, StkId level);
+LUAI_FUNC void luaF_close (lua_State *L, StkId level);
+LUAI_FUNC void luaF_freeproto (lua_State *L, Proto *f);
+LUAI_FUNC const char *luaF_getlocalname (const Proto *func, int local_number,
+                                         int pc);
+
+
+#endif
diff --git a/libs/lua/lua-5.3.3/lgc.c b/libs/lua/lua-5.3.3/lgc.c
new file mode 100644
index 0000000..7c29fb0
--- /dev/null
+++ b/libs/lua/lua-5.3.3/lgc.c
@@ -0,0 +1,1176 @@
+/*
+** $Id: lgc.c,v 2.212 2016/03/31 19:02:03 roberto Exp $
+** Garbage Collector
+** See Copyright Notice in lua.h
+*/
+
+#define lgc_c
+#define LUA_CORE
+
+#include "lprefix.h"
+
+
+#include <string.h>
+
+#include "lua.h"
+
+#include "ldebug.h"
+#include "ldo.h"
+#include "lfunc.h"
+#include "lgc.h"
+#include "lmem.h"
+#include "lobject.h"
+#include "lstate.h"
+#include "lstring.h"
+#include "ltable.h"
+#include "ltm.h"
+
+
+/*
+** internal state for collector while inside the atomic phase. The
+** collector should never be in this state while running regular code.
+*/
+#define GCSinsideatomic		(GCSpause + 1)
+
+/*
+** cost of sweeping one element (the size of a small object divided
+** by some adjust for the sweep speed)
+*/
+#define GCSWEEPCOST	((sizeof(TString) + 4) / 4)
+
+/* maximum number of elements to sweep in each single step */
+#define GCSWEEPMAX	(cast_int((GCSTEPSIZE / GCSWEEPCOST) / 4))
+
+/* cost of calling one finalizer */
+#define GCFINALIZECOST	GCSWEEPCOST
+
+
+/*
+** macro to adjust 'stepmul': 'stepmul' is actually used like
+** 'stepmul / STEPMULADJ' (value chosen by tests)
+*/
+#define STEPMULADJ		200
+
+
+/*
+** macro to adjust 'pause': 'pause' is actually used like
+** 'pause / PAUSEADJ' (value chosen by tests)
+*/
+#define PAUSEADJ		100
+
+
+/*
+** 'makewhite' erases all color bits then sets only the current white
+** bit
+*/
+#define maskcolors	(~(bitmask(BLACKBIT) | WHITEBITS))
+#define makewhite(g,x)	\
+ (x->marked = cast_byte((x->marked & maskcolors) | luaC_white(g)))
+
+#define white2gray(x)	resetbits(x->marked, WHITEBITS)
+#define black2gray(x)	resetbit(x->marked, BLACKBIT)
+
+
+#define valiswhite(x)   (iscollectable(x) && iswhite(gcvalue(x)))
+
+#define checkdeadkey(n)	lua_assert(!ttisdeadkey(gkey(n)) || ttisnil(gval(n)))
+
+
+#define checkconsistency(obj)  \
+  lua_longassert(!iscollectable(obj) || righttt(obj))
+
+
+#define markvalue(g,o) { checkconsistency(o); \
+  if (valiswhite(o)) reallymarkobject(g,gcvalue(o)); }
+
+#define markobject(g,t)	{ if (iswhite(t)) reallymarkobject(g, obj2gco(t)); }
+
+/*
+** mark an object that can be NULL (either because it is really optional,
+** or it was stripped as debug info, or inside an uncompleted structure)
+*/
+#define markobjectN(g,t)	{ if (t) markobject(g,t); }
+
+static void reallymarkobject (global_State *g, GCObject *o);
+
+
+/*
+** {======================================================
+** Generic functions
+** =======================================================
+*/
+
+
+/*
+** one after last element in a hash array
+*/
+#define gnodelast(h)	gnode(h, cast(size_t, sizenode(h)))
+
+
+/*
+** link collectable object 'o' into list pointed by 'p'
+*/
+#define linkgclist(o,p)	((o)->gclist = (p), (p) = obj2gco(o))
+
+
+/*
+** If key is not marked, mark its entry as dead. This allows key to be
+** collected, but keeps its entry in the table.  A dead node is needed
+** when Lua looks up for a key (it may be part of a chain) and when
+** traversing a weak table (key might be removed from the table during
+** traversal). Other places never manipulate dead keys, because its
+** associated nil value is enough to signal that the entry is logically
+** empty.
+*/
+static void removeentry (Node *n) {
+  lua_assert(ttisnil(gval(n)));
+  if (valiswhite(gkey(n)))
+    setdeadvalue(wgkey(n));  /* unused and unmarked key; remove it */
+}
+
+
+/*
+** tells whether a key or value can be cleared from a weak
+** table. Non-collectable objects are never removed from weak
+** tables. Strings behave as 'values', so are never removed too. for
+** other objects: if really collected, cannot keep them; for objects
+** being finalized, keep them in keys, but not in values
+*/
+static int iscleared (global_State *g, const TValue *o) {
+  if (!iscollectable(o)) return 0;
+  else if (ttisstring(o)) {
+    markobject(g, tsvalue(o));  /* strings are 'values', so are never weak */
+    return 0;
+  }
+  else return iswhite(gcvalue(o));
+}
+
+
+/*
+** barrier that moves collector forward, that is, mark the white object
+** being pointed by a black object. (If in sweep phase, clear the black
+** object to white [sweep it] to avoid other barrier calls for this
+** same object.)
+*/
+void luaC_barrier_ (lua_State *L, GCObject *o, GCObject *v) {
+  global_State *g = G(L);
+  lua_assert(isblack(o) && iswhite(v) && !isdead(g, v) && !isdead(g, o));
+  if (keepinvariant(g))  /* must keep invariant? */
+    reallymarkobject(g, v);  /* restore invariant */
+  else {  /* sweep phase */
+    lua_assert(issweepphase(g));
+    makewhite(g, o);  /* mark main obj. as white to avoid other barriers */
+  }
+}
+
+
+/*
+** barrier that moves collector backward, that is, mark the black object
+** pointing to a white object as gray again.
+*/
+void luaC_barrierback_ (lua_State *L, Table *t) {
+  global_State *g = G(L);
+  lua_assert(isblack(t) && !isdead(g, t));
+  black2gray(t);  /* make table gray (again) */
+  linkgclist(t, g->grayagain);
+}
+
+
+/*
+** barrier for assignments to closed upvalues. Because upvalues are
+** shared among closures, it is impossible to know the color of all
+** closures pointing to it. So, we assume that the object being assigned
+** must be marked.
+*/
+void luaC_upvalbarrier_ (lua_State *L, UpVal *uv) {
+  global_State *g = G(L);
+  GCObject *o = gcvalue(uv->v);
+  lua_assert(!upisopen(uv));  /* ensured by macro luaC_upvalbarrier */
+  if (keepinvariant(g))
+    markobject(g, o);
+}
+
+
+void luaC_fix (lua_State *L, GCObject *o) {
+  global_State *g = G(L);
+  lua_assert(g->allgc == o);  /* object must be 1st in 'allgc' list! */
+  white2gray(o);  /* they will be gray forever */
+  g->allgc = o->next;  /* remove object from 'allgc' list */
+  o->next = g->fixedgc;  /* link it to 'fixedgc' list */
+  g->fixedgc = o;
+}
+
+
+/*
+** create a new collectable object (with given type and size) and link
+** it to 'allgc' list.
+*/
+GCObject *luaC_newobj (lua_State *L, int tt, size_t sz) {
+  global_State *g = G(L);
+  GCObject *o = cast(GCObject *, luaM_newobject(L, novariant(tt), sz));
+  o->marked = luaC_white(g);
+  o->tt = tt;
+  o->next = g->allgc;
+  g->allgc = o;
+  return o;
+}
+
+/* }====================================================== */
+
+
+
+/*
+** {======================================================
+** Mark functions
+** =======================================================
+*/
+
+
+/*
+** mark an object. Userdata, strings, and closed upvalues are visited
+** and turned black here. Other objects are marked gray and added
+** to appropriate list to be visited (and turned black) later. (Open
+** upvalues are already linked in 'headuv' list.)
+*/
+static void reallymarkobject (global_State *g, GCObject *o) {
+ reentry:
+  white2gray(o);
+  switch (o->tt) {
+    case LUA_TSHRSTR: {
+      gray2black(o);
+      g->GCmemtrav += sizelstring(gco2ts(o)->shrlen);
+      break;
+    }
+    case LUA_TLNGSTR: {
+      gray2black(o);
+      g->GCmemtrav += sizelstring(gco2ts(o)->u.lnglen);
+      break;
+    }
+    case LUA_TUSERDATA: {
+      TValue uvalue;
+      markobjectN(g, gco2u(o)->metatable);  /* mark its metatable */
+      gray2black(o);
+      g->GCmemtrav += sizeudata(gco2u(o));
+      getuservalue(g->mainthread, gco2u(o), &uvalue);
+      if (valiswhite(&uvalue)) {  /* markvalue(g, &uvalue); */
+        o = gcvalue(&uvalue);
+        goto reentry;
+      }
+      break;
+    }
+    case LUA_TLCL: {
+      linkgclist(gco2lcl(o), g->gray);
+      break;
+    }
+    case LUA_TCCL: {
+      linkgclist(gco2ccl(o), g->gray);
+      break;
+    }
+    case LUA_TTABLE: {
+      linkgclist(gco2t(o), g->gray);
+      break;
+    }
+    case LUA_TTHREAD: {
+      linkgclist(gco2th(o), g->gray);
+      break;
+    }
+    case LUA_TPROTO: {
+      linkgclist(gco2p(o), g->gray);
+      break;
+    }
+    default: lua_assert(0); break;
+  }
+}
+
+
+/*
+** mark metamethods for basic types
+*/
+static void markmt (global_State *g) {
+  int i;
+  for (i=0; i < LUA_NUMTAGS; i++)
+    markobjectN(g, g->mt[i]);
+}
+
+
+/*
+** mark all objects in list of being-finalized
+*/
+static void markbeingfnz (global_State *g) {
+  GCObject *o;
+  for (o = g->tobefnz; o != NULL; o = o->next)
+    markobject(g, o);
+}
+
+
+/*
+** Mark all values stored in marked open upvalues from non-marked threads.
+** (Values from marked threads were already marked when traversing the
+** thread.) Remove from the list threads that no longer have upvalues and
+** not-marked threads.
+*/
+static void remarkupvals (global_State *g) {
+  lua_State *thread;
+  lua_State **p = &g->twups;
+  while ((thread = *p) != NULL) {
+    lua_assert(!isblack(thread));  /* threads are never black */
+    if (isgray(thread) && thread->openupval != NULL)
+      p = &thread->twups;  /* keep marked thread with upvalues in the list */
+    else {  /* thread is not marked or without upvalues */
+      UpVal *uv;
+      *p = thread->twups;  /* remove thread from the list */
+      thread->twups = thread;  /* mark that it is out of list */
+      for (uv = thread->openupval; uv != NULL; uv = uv->u.open.next) {
+        if (uv->u.open.touched) {
+          markvalue(g, uv->v);  /* remark upvalue's value */
+          uv->u.open.touched = 0;
+        }
+      }
+    }
+  }
+}
+
+
+/*
+** mark root set and reset all gray lists, to start a new collection
+*/
+static void restartcollection (global_State *g) {
+  g->gray = g->grayagain = NULL;
+  g->weak = g->allweak = g->ephemeron = NULL;
+  markobject(g, g->mainthread);
+  markvalue(g, &g->l_registry);
+  markmt(g);
+  markbeingfnz(g);  /* mark any finalizing object left from previous cycle */
+}
+
+/* }====================================================== */
+
+
+/*
+** {======================================================
+** Traverse functions
+** =======================================================
+*/
+
+/*
+** Traverse a table with weak values and link it to proper list. During
+** propagate phase, keep it in 'grayagain' list, to be revisited in the
+** atomic phase. In the atomic phase, if table has any white value,
+** put it in 'weak' list, to be cleared.
+*/
+static void traverseweakvalue (global_State *g, Table *h) {
+  Node *n, *limit = gnodelast(h);
+  /* if there is array part, assume it may have white values (it is not
+     worth traversing it now just to check) */
+  int hasclears = (h->sizearray > 0);
+  for (n = gnode(h, 0); n < limit; n++) {  /* traverse hash part */
+    checkdeadkey(n);
+    if (ttisnil(gval(n)))  /* entry is empty? */
+      removeentry(n);  /* remove it */
+    else {
+      lua_assert(!ttisnil(gkey(n)));
+      markvalue(g, gkey(n));  /* mark key */
+      if (!hasclears && iscleared(g, gval(n)))  /* is there a white value? */
+        hasclears = 1;  /* table will have to be cleared */
+    }
+  }
+  if (g->gcstate == GCSpropagate)
+    linkgclist(h, g->grayagain);  /* must retraverse it in atomic phase */
+  else if (hasclears)
+    linkgclist(h, g->weak);  /* has to be cleared later */
+}
+
+
+/*
+** Traverse an ephemeron table and link it to proper list. Returns true
+** iff any object was marked during this traversal (which implies that
+** convergence has to continue). During propagation phase, keep table
+** in 'grayagain' list, to be visited again in the atomic phase. In
+** the atomic phase, if table has any white->white entry, it has to
+** be revisited during ephemeron convergence (as that key may turn
+** black). Otherwise, if it has any white key, table has to be cleared
+** (in the atomic phase).
+*/
+static int traverseephemeron (global_State *g, Table *h) {
+  int marked = 0;  /* true if an object is marked in this traversal */
+  int hasclears = 0;  /* true if table has white keys */
+  int hasww = 0;  /* true if table has entry "white-key -> white-value" */
+  Node *n, *limit = gnodelast(h);
+  unsigned int i;
+  /* traverse array part */
+  for (i = 0; i < h->sizearray; i++) {
+    if (valiswhite(&h->array[i])) {
+      marked = 1;
+      reallymarkobject(g, gcvalue(&h->array[i]));
+    }
+  }
+  /* traverse hash part */
+  for (n = gnode(h, 0); n < limit; n++) {
+    checkdeadkey(n);
+    if (ttisnil(gval(n)))  /* entry is empty? */
+      removeentry(n);  /* remove it */
+    else if (iscleared(g, gkey(n))) {  /* key is not marked (yet)? */
+      hasclears = 1;  /* table must be cleared */
+      if (valiswhite(gval(n)))  /* value not marked yet? */
+        hasww = 1;  /* white-white entry */
+    }
+    else if (valiswhite(gval(n))) {  /* value not marked yet? */
+      marked = 1;
+      reallymarkobject(g, gcvalue(gval(n)));  /* mark it now */
+    }
+  }
+  /* link table into proper list */
+  if (g->gcstate == GCSpropagate)
+    linkgclist(h, g->grayagain);  /* must retraverse it in atomic phase */
+  else if (hasww)  /* table has white->white entries? */
+    linkgclist(h, g->ephemeron);  /* have to propagate again */
+  else if (hasclears)  /* table has white keys? */
+    linkgclist(h, g->allweak);  /* may have to clean white keys */
+  return marked;
+}
+
+
+static void traversestrongtable (global_State *g, Table *h) {
+  Node *n, *limit = gnodelast(h);
+  unsigned int i;
+  for (i = 0; i < h->sizearray; i++)  /* traverse array part */
+    markvalue(g, &h->array[i]);
+  for (n = gnode(h, 0); n < limit; n++) {  /* traverse hash part */
+    checkdeadkey(n);
+    if (ttisnil(gval(n)))  /* entry is empty? */
+      removeentry(n);  /* remove it */
+    else {
+      lua_assert(!ttisnil(gkey(n)));
+      markvalue(g, gkey(n));  /* mark key */
+      markvalue(g, gval(n));  /* mark value */
+    }
+  }
+}
+
+
+static lu_mem traversetable (global_State *g, Table *h) {
+  const char *weakkey, *weakvalue;
+  const TValue *mode = gfasttm(g, h->metatable, TM_MODE);
+  markobjectN(g, h->metatable);
+  if (mode && ttisstring(mode) &&  /* is there a weak mode? */
+      ((weakkey = strchr(svalue(mode), 'k')),
+       (weakvalue = strchr(svalue(mode), 'v')),
+       (weakkey || weakvalue))) {  /* is really weak? */
+    black2gray(h);  /* keep table gray */
+    if (!weakkey)  /* strong keys? */
+      traverseweakvalue(g, h);
+    else if (!weakvalue)  /* strong values? */
+      traverseephemeron(g, h);
+    else  /* all weak */
+      linkgclist(h, g->allweak);  /* nothing to traverse now */
+  }
+  else  /* not weak */
+    traversestrongtable(g, h);
+  return sizeof(Table) + sizeof(TValue) * h->sizearray +
+                         sizeof(Node) * cast(size_t, sizenode(h));
+}
+
+
+/*
+** Traverse a prototype. (While a prototype is being build, its
+** arrays can be larger than needed; the extra slots are filled with
+** NULL, so the use of 'markobjectN')
+*/
+static int traverseproto (global_State *g, Proto *f) {
+  int i;
+  if (f->cache && iswhite(f->cache))
+    f->cache = NULL;  /* allow cache to be collected */
+  markobjectN(g, f->source);
+  for (i = 0; i < f->sizek; i++)  /* mark literals */
+    markvalue(g, &f->k[i]);
+  for (i = 0; i < f->sizeupvalues; i++)  /* mark upvalue names */
+    markobjectN(g, f->upvalues[i].name);
+  for (i = 0; i < f->sizep; i++)  /* mark nested protos */
+    markobjectN(g, f->p[i]);
+  for (i = 0; i < f->sizelocvars; i++)  /* mark local-variable names */
+    markobjectN(g, f->locvars[i].varname);
+  return sizeof(Proto) + sizeof(Instruction) * f->sizecode +
+                         sizeof(Proto *) * f->sizep +
+                         sizeof(TValue) * f->sizek +
+                         sizeof(int) * f->sizelineinfo +
+                         sizeof(LocVar) * f->sizelocvars +
+                         sizeof(Upvaldesc) * f->sizeupvalues;
+}
+
+
+static lu_mem traverseCclosure (global_State *g, CClosure *cl) {
+  int i;
+  for (i = 0; i < cl->nupvalues; i++)  /* mark its upvalues */
+    markvalue(g, &cl->upvalue[i]);
+  return sizeCclosure(cl->nupvalues);
+}
+
+/*
+** open upvalues point to values in a thread, so those values should
+** be marked when the thread is traversed except in the atomic phase
+** (because then the value cannot be changed by the thread and the
+** thread may not be traversed again)
+*/
+static lu_mem traverseLclosure (global_State *g, LClosure *cl) {
+  int i;
+  markobjectN(g, cl->p);  /* mark its prototype */
+  for (i = 0; i < cl->nupvalues; i++) {  /* mark its upvalues */
+    UpVal *uv = cl->upvals[i];
+    if (uv != NULL) {
+      if (upisopen(uv) && g->gcstate != GCSinsideatomic)
+        uv->u.open.touched = 1;  /* can be marked in 'remarkupvals' */
+      else
+        markvalue(g, uv->v);
+    }
+  }
+  return sizeLclosure(cl->nupvalues);
+}
+
+
+static lu_mem traversethread (global_State *g, lua_State *th) {
+  StkId o = th->stack;
+  if (o == NULL)
+    return 1;  /* stack not completely built yet */
+  lua_assert(g->gcstate == GCSinsideatomic ||
+             th->openupval == NULL || isintwups(th));
+  for (; o < th->top; o++)  /* mark live elements in the stack */
+    markvalue(g, o);
+  if (g->gcstate == GCSinsideatomic) {  /* final traversal? */
+    StkId lim = th->stack + th->stacksize;  /* real end of stack */
+    for (; o < lim; o++)  /* clear not-marked stack slice */
+      setnilvalue(o);
+    /* 'remarkupvals' may have removed thread from 'twups' list */ 
+    if (!isintwups(th) && th->openupval != NULL) {
+      th->twups = g->twups;  /* link it back to the list */
+      g->twups = th;
+    }
+  }
+  else if (g->gckind != KGC_EMERGENCY)
+    luaD_shrinkstack(th); /* do not change stack in emergency cycle */
+  return (sizeof(lua_State) + sizeof(TValue) * th->stacksize +
+          sizeof(CallInfo) * th->nci);
+}
+
+
+/*
+** traverse one gray object, turning it to black (except for threads,
+** which are always gray).
+*/
+static void propagatemark (global_State *g) {
+  lu_mem size;
+  GCObject *o = g->gray;
+  lua_assert(isgray(o));
+  gray2black(o);
+  switch (o->tt) {
+    case LUA_TTABLE: {
+      Table *h = gco2t(o);
+      g->gray = h->gclist;  /* remove from 'gray' list */
+      size = traversetable(g, h);
+      break;
+    }
+    case LUA_TLCL: {
+      LClosure *cl = gco2lcl(o);
+      g->gray = cl->gclist;  /* remove from 'gray' list */
+      size = traverseLclosure(g, cl);
+      break;
+    }
+    case LUA_TCCL: {
+      CClosure *cl = gco2ccl(o);
+      g->gray = cl->gclist;  /* remove from 'gray' list */
+      size = traverseCclosure(g, cl);
+      break;
+    }
+    case LUA_TTHREAD: {
+      lua_State *th = gco2th(o);
+      g->gray = th->gclist;  /* remove from 'gray' list */
+      linkgclist(th, g->grayagain);  /* insert into 'grayagain' list */
+      black2gray(o);
+      size = traversethread(g, th);
+      break;
+    }
+    case LUA_TPROTO: {
+      Proto *p = gco2p(o);
+      g->gray = p->gclist;  /* remove from 'gray' list */
+      size = traverseproto(g, p);
+      break;
+    }
+    default: lua_assert(0); return;
+  }
+  g->GCmemtrav += size;
+}
+
+
+static void propagateall (global_State *g) {
+  while (g->gray) propagatemark(g);
+}
+
+
+static void convergeephemerons (global_State *g) {
+  int changed;
+  do {
+    GCObject *w;
+    GCObject *next = g->ephemeron;  /* get ephemeron list */
+    g->ephemeron = NULL;  /* tables may return to this list when traversed */
+    changed = 0;
+    while ((w = next) != NULL) {
+      next = gco2t(w)->gclist;
+      if (traverseephemeron(g, gco2t(w))) {  /* traverse marked some value? */
+        propagateall(g);  /* propagate changes */
+        changed = 1;  /* will have to revisit all ephemeron tables */
+      }
+    }
+  } while (changed);
+}
+
+/* }====================================================== */
+
+
+/*
+** {======================================================
+** Sweep Functions
+** =======================================================
+*/
+
+
+/*
+** clear entries with unmarked keys from all weaktables in list 'l' up
+** to element 'f'
+*/
+static void clearkeys (global_State *g, GCObject *l, GCObject *f) {
+  for (; l != f; l = gco2t(l)->gclist) {
+    Table *h = gco2t(l);
+    Node *n, *limit = gnodelast(h);
+    for (n = gnode(h, 0); n < limit; n++) {
+      if (!ttisnil(gval(n)) && (iscleared(g, gkey(n)))) {
+        setnilvalue(gval(n));  /* remove value ... */
+        removeentry(n);  /* and remove entry from table */
+      }
+    }
+  }
+}
+
+
+/*
+** clear entries with unmarked values from all weaktables in list 'l' up
+** to element 'f'
+*/
+static void clearvalues (global_State *g, GCObject *l, GCObject *f) {
+  for (; l != f; l = gco2t(l)->gclist) {
+    Table *h = gco2t(l);
+    Node *n, *limit = gnodelast(h);
+    unsigned int i;
+    for (i = 0; i < h->sizearray; i++) {
+      TValue *o = &h->array[i];
+      if (iscleared(g, o))  /* value was collected? */
+        setnilvalue(o);  /* remove value */
+    }
+    for (n = gnode(h, 0); n < limit; n++) {
+      if (!ttisnil(gval(n)) && iscleared(g, gval(n))) {
+        setnilvalue(gval(n));  /* remove value ... */
+        removeentry(n);  /* and remove entry from table */
+      }
+    }
+  }
+}
+
+
+void luaC_upvdeccount (lua_State *L, UpVal *uv) {
+  lua_assert(uv->refcount > 0);
+  uv->refcount--;
+  if (uv->refcount == 0 && !upisopen(uv))
+    luaM_free(L, uv);
+}
+
+
+static void freeLclosure (lua_State *L, LClosure *cl) {
+  int i;
+  for (i = 0; i < cl->nupvalues; i++) {
+    UpVal *uv = cl->upvals[i];
+    if (uv)
+      luaC_upvdeccount(L, uv);
+  }
+  luaM_freemem(L, cl, sizeLclosure(cl->nupvalues));
+}
+
+
+static void freeobj (lua_State *L, GCObject *o) {
+  switch (o->tt) {
+    case LUA_TPROTO: luaF_freeproto(L, gco2p(o)); break;
+    case LUA_TLCL: {
+      freeLclosure(L, gco2lcl(o));
+      break;
+    }
+    case LUA_TCCL: {
+      luaM_freemem(L, o, sizeCclosure(gco2ccl(o)->nupvalues));
+      break;
+    }
+    case LUA_TTABLE: luaH_free(L, gco2t(o)); break;
+    case LUA_TTHREAD: luaE_freethread(L, gco2th(o)); break;
+    case LUA_TUSERDATA: luaM_freemem(L, o, sizeudata(gco2u(o))); break;
+    case LUA_TSHRSTR:
+      luaS_remove(L, gco2ts(o));  /* remove it from hash table */
+      luaM_freemem(L, o, sizelstring(gco2ts(o)->shrlen));
+      break;
+    case LUA_TLNGSTR: {
+      luaM_freemem(L, o, sizelstring(gco2ts(o)->u.lnglen));
+      break;
+    }
+    default: lua_assert(0);
+  }
+}
+
+
+#define sweepwholelist(L,p)	sweeplist(L,p,MAX_LUMEM)
+static GCObject **sweeplist (lua_State *L, GCObject **p, lu_mem count);
+
+
+/*
+** sweep at most 'count' elements from a list of GCObjects erasing dead
+** objects, where a dead object is one marked with the old (non current)
+** white; change all non-dead objects back to white, preparing for next
+** collection cycle. Return where to continue the traversal or NULL if
+** list is finished.
+*/
+static GCObject **sweeplist (lua_State *L, GCObject **p, lu_mem count) {
+  global_State *g = G(L);
+  int ow = otherwhite(g);
+  int white = luaC_white(g);  /* current white */
+  while (*p != NULL && count-- > 0) {
+    GCObject *curr = *p;
+    int marked = curr->marked;
+    if (isdeadm(ow, marked)) {  /* is 'curr' dead? */
+      *p = curr->next;  /* remove 'curr' from list */
+      freeobj(L, curr);  /* erase 'curr' */
+    }
+    else {  /* change mark to 'white' */
+      curr->marked = cast_byte((marked & maskcolors) | white);
+      p = &curr->next;  /* go to next element */
+    }
+  }
+  return (*p == NULL) ? NULL : p;
+}
+
+
+/*
+** sweep a list until a live object (or end of list)
+*/
+static GCObject **sweeptolive (lua_State *L, GCObject **p) {
+  GCObject **old = p;
+  do {
+    p = sweeplist(L, p, 1);
+  } while (p == old);
+  return p;
+}
+
+/* }====================================================== */
+
+
+/*
+** {======================================================
+** Finalization
+** =======================================================
+*/
+
+/*
+** If possible, shrink string table
+*/
+static void checkSizes (lua_State *L, global_State *g) {
+  if (g->gckind != KGC_EMERGENCY) {
+    l_mem olddebt = g->GCdebt;
+    if (g->strt.nuse < g->strt.size / 4)  /* string table too big? */
+      luaS_resize(L, g->strt.size / 2);  /* shrink it a little */
+    g->GCestimate += g->GCdebt - olddebt;  /* update estimate */
+  }
+}
+
+
+static GCObject *udata2finalize (global_State *g) {
+  GCObject *o = g->tobefnz;  /* get first element */
+  lua_assert(tofinalize(o));
+  g->tobefnz = o->next;  /* remove it from 'tobefnz' list */
+  o->next = g->allgc;  /* return it to 'allgc' list */
+  g->allgc = o;
+  resetbit(o->marked, FINALIZEDBIT);  /* object is "normal" again */
+  if (issweepphase(g))
+    makewhite(g, o);  /* "sweep" object */
+  return o;
+}
+
+
+static void dothecall (lua_State *L, void *ud) {
+  UNUSED(ud);
+  luaD_callnoyield(L, L->top - 2, 0);
+}
+
+
+static void GCTM (lua_State *L, int propagateerrors) {
+  global_State *g = G(L);
+  const TValue *tm;
+  TValue v;
+  setgcovalue(L, &v, udata2finalize(g));
+  tm = luaT_gettmbyobj(L, &v, TM_GC);
+  if (tm != NULL && ttisfunction(tm)) {  /* is there a finalizer? */
+    int status;
+    lu_byte oldah = L->allowhook;
+    int running  = g->gcrunning;
+    L->allowhook = 0;  /* stop debug hooks during GC metamethod */
+    g->gcrunning = 0;  /* avoid GC steps */
+    setobj2s(L, L->top, tm);  /* push finalizer... */
+    setobj2s(L, L->top + 1, &v);  /* ... and its argument */
+    L->top += 2;  /* and (next line) call the finalizer */
+    status = luaD_pcall(L, dothecall, NULL, savestack(L, L->top - 2), 0);
+    L->allowhook = oldah;  /* restore hooks */
+    g->gcrunning = running;  /* restore state */
+    if (status != LUA_OK && propagateerrors) {  /* error while running __gc? */
+      if (status == LUA_ERRRUN) {  /* is there an error object? */
+        const char *msg = (ttisstring(L->top - 1))
+                            ? svalue(L->top - 1)
+                            : "no message";
+        luaO_pushfstring(L, "error in __gc metamethod (%s)", msg);
+        status = LUA_ERRGCMM;  /* error in __gc metamethod */
+      }
+      luaD_throw(L, status);  /* re-throw error */
+    }
+  }
+}
+
+
+/*
+** call a few (up to 'g->gcfinnum') finalizers
+*/
+static int runafewfinalizers (lua_State *L) {
+  global_State *g = G(L);
+  unsigned int i;
+  lua_assert(!g->tobefnz || g->gcfinnum > 0);
+  for (i = 0; g->tobefnz && i < g->gcfinnum; i++)
+    GCTM(L, 1);  /* call one finalizer */
+  g->gcfinnum = (!g->tobefnz) ? 0  /* nothing more to finalize? */
+                    : g->gcfinnum * 2;  /* else call a few more next time */
+  return i;
+}
+
+
+/*
+** call all pending finalizers
+*/
+static void callallpendingfinalizers (lua_State *L) {
+  global_State *g = G(L);
+  while (g->tobefnz)
+    GCTM(L, 0);
+}
+
+
+/*
+** find last 'next' field in list 'p' list (to add elements in its end)
+*/
+static GCObject **findlast (GCObject **p) {
+  while (*p != NULL)
+    p = &(*p)->next;
+  return p;
+}
+
+
+/*
+** move all unreachable objects (or 'all' objects) that need
+** finalization from list 'finobj' to list 'tobefnz' (to be finalized)
+*/
+static void separatetobefnz (global_State *g, int all) {
+  GCObject *curr;
+  GCObject **p = &g->finobj;
+  GCObject **lastnext = findlast(&g->tobefnz);
+  while ((curr = *p) != NULL) {  /* traverse all finalizable objects */
+    lua_assert(tofinalize(curr));
+    if (!(iswhite(curr) || all))  /* not being collected? */
+      p = &curr->next;  /* don't bother with it */
+    else {
+      *p = curr->next;  /* remove 'curr' from 'finobj' list */
+      curr->next = *lastnext;  /* link at the end of 'tobefnz' list */
+      *lastnext = curr;
+      lastnext = &curr->next;
+    }
+  }
+}
+
+
+/*
+** if object 'o' has a finalizer, remove it from 'allgc' list (must
+** search the list to find it) and link it in 'finobj' list.
+*/
+void luaC_checkfinalizer (lua_State *L, GCObject *o, Table *mt) {
+  global_State *g = G(L);
+  if (tofinalize(o) ||                 /* obj. is already marked... */
+      gfasttm(g, mt, TM_GC) == NULL)   /* or has no finalizer? */
+    return;  /* nothing to be done */
+  else {  /* move 'o' to 'finobj' list */
+    GCObject **p;
+    if (issweepphase(g)) {
+      makewhite(g, o);  /* "sweep" object 'o' */
+      if (g->sweepgc == &o->next)  /* should not remove 'sweepgc' object */
+        g->sweepgc = sweeptolive(L, g->sweepgc);  /* change 'sweepgc' */
+    }
+    /* search for pointer pointing to 'o' */
+    for (p = &g->allgc; *p != o; p = &(*p)->next) { /* empty */ }
+    *p = o->next;  /* remove 'o' from 'allgc' list */
+    o->next = g->finobj;  /* link it in 'finobj' list */
+    g->finobj = o;
+    l_setbit(o->marked, FINALIZEDBIT);  /* mark it as such */
+  }
+}
+
+/* }====================================================== */
+
+
+
+/*
+** {======================================================
+** GC control
+** =======================================================
+*/
+
+
+/*
+** Set a reasonable "time" to wait before starting a new GC cycle; cycle
+** will start when memory use hits threshold. (Division by 'estimate'
+** should be OK: it cannot be zero (because Lua cannot even start with
+** less than PAUSEADJ bytes).
+*/
+static void setpause (global_State *g) {
+  l_mem threshold, debt;
+  l_mem estimate = g->GCestimate / PAUSEADJ;  /* adjust 'estimate' */
+  lua_assert(estimate > 0);
+  threshold = (g->gcpause < MAX_LMEM / estimate)  /* overflow? */
+            ? estimate * g->gcpause  /* no overflow */
+            : MAX_LMEM;  /* overflow; truncate to maximum */
+  debt = gettotalbytes(g) - threshold;
+  luaE_setdebt(g, debt);
+}
+
+
+/*
+** Enter first sweep phase.
+** The call to 'sweeplist' tries to make pointer point to an object
+** inside the list (instead of to the header), so that the real sweep do
+** not need to skip objects created between "now" and the start of the
+** real sweep.
+*/
+static void entersweep (lua_State *L) {
+  global_State *g = G(L);
+  g->gcstate = GCSswpallgc;
+  lua_assert(g->sweepgc == NULL);
+  g->sweepgc = sweeplist(L, &g->allgc, 1);
+}
+
+
+void luaC_freeallobjects (lua_State *L) {
+  global_State *g = G(L);
+  separatetobefnz(g, 1);  /* separate all objects with finalizers */
+  lua_assert(g->finobj == NULL);
+  callallpendingfinalizers(L);
+  lua_assert(g->tobefnz == NULL);
+  g->currentwhite = WHITEBITS; /* this "white" makes all objects look dead */
+  g->gckind = KGC_NORMAL;
+  sweepwholelist(L, &g->finobj);
+  sweepwholelist(L, &g->allgc);
+  sweepwholelist(L, &g->fixedgc);  /* collect fixed objects */
+  lua_assert(g->strt.nuse == 0);
+}
+
+
+static l_mem atomic (lua_State *L) {
+  global_State *g = G(L);
+  l_mem work;
+  GCObject *origweak, *origall;
+  GCObject *grayagain = g->grayagain;  /* save original list */
+  lua_assert(g->ephemeron == NULL && g->weak == NULL);
+  lua_assert(!iswhite(g->mainthread));
+  g->gcstate = GCSinsideatomic;
+  g->GCmemtrav = 0;  /* start counting work */
+  markobject(g, L);  /* mark running thread */
+  /* registry and global metatables may be changed by API */
+  markvalue(g, &g->l_registry);
+  markmt(g);  /* mark global metatables */
+  /* remark occasional upvalues of (maybe) dead threads */
+  remarkupvals(g);
+  propagateall(g);  /* propagate changes */
+  work = g->GCmemtrav;  /* stop counting (do not recount 'grayagain') */
+  g->gray = grayagain;
+  propagateall(g);  /* traverse 'grayagain' list */
+  g->GCmemtrav = 0;  /* restart counting */
+  convergeephemerons(g);
+  /* at this point, all strongly accessible objects are marked. */
+  /* Clear values from weak tables, before checking finalizers */
+  clearvalues(g, g->weak, NULL);
+  clearvalues(g, g->allweak, NULL);
+  origweak = g->weak; origall = g->allweak;
+  work += g->GCmemtrav;  /* stop counting (objects being finalized) */
+  separatetobefnz(g, 0);  /* separate objects to be finalized */
+  g->gcfinnum = 1;  /* there may be objects to be finalized */
+  markbeingfnz(g);  /* mark objects that will be finalized */
+  propagateall(g);  /* remark, to propagate 'resurrection' */
+  g->GCmemtrav = 0;  /* restart counting */
+  convergeephemerons(g);
+  /* at this point, all resurrected objects are marked. */
+  /* remove dead objects from weak tables */
+  clearkeys(g, g->ephemeron, NULL);  /* clear keys from all ephemeron tables */
+  clearkeys(g, g->allweak, NULL);  /* clear keys from all 'allweak' tables */
+  /* clear values from resurrected weak tables */
+  clearvalues(g, g->weak, origweak);
+  clearvalues(g, g->allweak, origall);
+  luaS_clearcache(g);
+  g->currentwhite = cast_byte(otherwhite(g));  /* flip current white */
+  work += g->GCmemtrav;  /* complete counting */
+  return work;  /* estimate of memory marked by 'atomic' */
+}
+
+
+static lu_mem sweepstep (lua_State *L, global_State *g,
+                         int nextstate, GCObject **nextlist) {
+  if (g->sweepgc) {
+    l_mem olddebt = g->GCdebt;
+    g->sweepgc = sweeplist(L, g->sweepgc, GCSWEEPMAX);
+    g->GCestimate += g->GCdebt - olddebt;  /* update estimate */
+    if (g->sweepgc)  /* is there still something to sweep? */
+      return (GCSWEEPMAX * GCSWEEPCOST);
+  }
+  /* else enter next state */
+  g->gcstate = nextstate;
+  g->sweepgc = nextlist;
+  return 0;
+}
+
+
+static lu_mem singlestep (lua_State *L) {
+  global_State *g = G(L);
+  switch (g->gcstate) {
+    case GCSpause: {
+      g->GCmemtrav = g->strt.size * sizeof(GCObject*);
+      restartcollection(g);
+      g->gcstate = GCSpropagate;
+      return g->GCmemtrav;
+    }
+    case GCSpropagate: {
+      g->GCmemtrav = 0;
+      lua_assert(g->gray);
+      propagatemark(g);
+       if (g->gray == NULL)  /* no more gray objects? */
+        g->gcstate = GCSatomic;  /* finish propagate phase */
+      return g->GCmemtrav;  /* memory traversed in this step */
+    }
+    case GCSatomic: {
+      lu_mem work;
+      propagateall(g);  /* make sure gray list is empty */
+      work = atomic(L);  /* work is what was traversed by 'atomic' */
+      entersweep(L);
+      g->GCestimate = gettotalbytes(g);  /* first estimate */;
+      return work;
+    }
+    case GCSswpallgc: {  /* sweep "regular" objects */
+      return sweepstep(L, g, GCSswpfinobj, &g->finobj);
+    }
+    case GCSswpfinobj: {  /* sweep objects with finalizers */
+      return sweepstep(L, g, GCSswptobefnz, &g->tobefnz);
+    }
+    case GCSswptobefnz: {  /* sweep objects to be finalized */
+      return sweepstep(L, g, GCSswpend, NULL);
+    }
+    case GCSswpend: {  /* finish sweeps */
+      makewhite(g, g->mainthread);  /* sweep main thread */
+      checkSizes(L, g);
+      g->gcstate = GCScallfin;
+      return 0;
+    }
+    case GCScallfin: {  /* call remaining finalizers */
+      if (g->tobefnz && g->gckind != KGC_EMERGENCY) {
+        int n = runafewfinalizers(L);
+        return (n * GCFINALIZECOST);
+      }
+      else {  /* emergency mode or no more finalizers */
+        g->gcstate = GCSpause;  /* finish collection */
+        return 0;
+      }
+    }
+    default: lua_assert(0); return 0;
+  }
+}
+
+
+/*
+** advances the garbage collector until it reaches a state allowed
+** by 'statemask'
+*/
+void luaC_runtilstate (lua_State *L, int statesmask) {
+  global_State *g = G(L);
+  while (!testbit(statesmask, g->gcstate))
+    singlestep(L);
+}
+
+
+/*
+** get GC debt and convert it from Kb to 'work units' (avoid zero debt
+** and overflows)
+*/
+static l_mem getdebt (global_State *g) {
+  l_mem debt = g->GCdebt;
+  int stepmul = g->gcstepmul;
+  if (debt <= 0) return 0;  /* minimal debt */
+  else {
+    debt = (debt / STEPMULADJ) + 1;
+    debt = (debt < MAX_LMEM / stepmul) ? debt * stepmul : MAX_LMEM;
+    return debt;
+  }
+}
+
+/*
+** performs a basic GC step when collector is running
+*/
+void luaC_step (lua_State *L) {
+  global_State *g = G(L);
+  l_mem debt = getdebt(g);  /* GC deficit (be paid now) */
+  if (!g->gcrunning) {  /* not running? */
+    luaE_setdebt(g, -GCSTEPSIZE * 10);  /* avoid being called too often */
+    return;
+  }
+  do {  /* repeat until pause or enough "credit" (negative debt) */
+    lu_mem work = singlestep(L);  /* perform one single step */
+    debt -= work;
+  } while (debt > -GCSTEPSIZE && g->gcstate != GCSpause);
+  if (g->gcstate == GCSpause)
+    setpause(g);  /* pause until next cycle */
+  else {
+    debt = (debt / g->gcstepmul) * STEPMULADJ;  /* convert 'work units' to Kb */
+    luaE_setdebt(g, debt);
+    runafewfinalizers(L);
+  }
+}
+
+
+/*
+** Performs a full GC cycle; if 'isemergency', set a flag to avoid
+** some operations which could change the interpreter state in some
+** unexpected ways (running finalizers and shrinking some structures).
+** Before running the collection, check 'keepinvariant'; if it is true,
+** there may be some objects marked as black, so the collector has
+** to sweep all objects to turn them back to white (as white has not
+** changed, nothing will be collected).
+*/
+void luaC_fullgc (lua_State *L, int isemergency) {
+  global_State *g = G(L);
+  lua_assert(g->gckind == KGC_NORMAL);
+  if (isemergency) g->gckind = KGC_EMERGENCY;  /* set flag */
+  if (keepinvariant(g)) {  /* black objects? */
+    entersweep(L); /* sweep everything to turn them back to white */
+  }
+  /* finish any pending sweep phase to start a new cycle */
+  luaC_runtilstate(L, bitmask(GCSpause));
+  luaC_runtilstate(L, ~bitmask(GCSpause));  /* start new collection */
+  luaC_runtilstate(L, bitmask(GCScallfin));  /* run up to finalizers */
+  /* estimate must be correct after a full GC cycle */
+  lua_assert(g->GCestimate == gettotalbytes(g));
+  luaC_runtilstate(L, bitmask(GCSpause));  /* finish collection */
+  g->gckind = KGC_NORMAL;
+  setpause(g);
+}
+
+/* }====================================================== */
+
+
diff --git a/libs/lua/lua-5.3.3/lgc.h b/libs/lua/lua-5.3.3/lgc.h
new file mode 100644
index 0000000..aed3e18
--- /dev/null
+++ b/libs/lua/lua-5.3.3/lgc.h
@@ -0,0 +1,147 @@
+/*
+** $Id: lgc.h,v 2.91 2015/12/21 13:02:14 roberto Exp $
+** Garbage Collector
+** See Copyright Notice in lua.h
+*/
+
+#ifndef lgc_h
+#define lgc_h
+
+
+#include "lobject.h"
+#include "lstate.h"
+
+/*
+** Collectable objects may have one of three colors: white, which
+** means the object is not marked; gray, which means the
+** object is marked, but its references may be not marked; and
+** black, which means that the object and all its references are marked.
+** The main invariant of the garbage collector, while marking objects,
+** is that a black object can never point to a white one. Moreover,
+** any gray object must be in a "gray list" (gray, grayagain, weak,
+** allweak, ephemeron) so that it can be visited again before finishing
+** the collection cycle. These lists have no meaning when the invariant
+** is not being enforced (e.g., sweep phase).
+*/
+
+
+
+/* how much to allocate before next GC step */
+#if !defined(GCSTEPSIZE)
+/* ~100 small strings */
+#define GCSTEPSIZE	(cast_int(100 * sizeof(TString)))
+#endif
+
+
+/*
+** Possible states of the Garbage Collector
+*/
+#define GCSpropagate	0
+#define GCSatomic	1
+#define GCSswpallgc	2
+#define GCSswpfinobj	3
+#define GCSswptobefnz	4
+#define GCSswpend	5
+#define GCScallfin	6
+#define GCSpause	7
+
+
+#define issweepphase(g)  \
+	(GCSswpallgc <= (g)->gcstate && (g)->gcstate <= GCSswpend)
+
+
+/*
+** macro to tell when main invariant (white objects cannot point to black
+** ones) must be kept. During a collection, the sweep
+** phase may break the invariant, as objects turned white may point to
+** still-black objects. The invariant is restored when sweep ends and
+** all objects are white again.
+*/
+
+#define keepinvariant(g)	((g)->gcstate <= GCSatomic)
+
+
+/*
+** some useful bit tricks
+*/
+#define resetbits(x,m)		((x) &= cast(lu_byte, ~(m)))
+#define setbits(x,m)		((x) |= (m))
+#define testbits(x,m)		((x) & (m))
+#define bitmask(b)		(1<<(b))
+#define bit2mask(b1,b2)		(bitmask(b1) | bitmask(b2))
+#define l_setbit(x,b)		setbits(x, bitmask(b))
+#define resetbit(x,b)		resetbits(x, bitmask(b))
+#define testbit(x,b)		testbits(x, bitmask(b))
+
+
+/* Layout for bit use in 'marked' field: */
+#define WHITE0BIT	0  /* object is white (type 0) */
+#define WHITE1BIT	1  /* object is white (type 1) */
+#define BLACKBIT	2  /* object is black */
+#define FINALIZEDBIT	3  /* object has been marked for finalization */
+/* bit 7 is currently used by tests (luaL_checkmemory) */
+
+#define WHITEBITS	bit2mask(WHITE0BIT, WHITE1BIT)
+
+
+#define iswhite(x)      testbits((x)->marked, WHITEBITS)
+#define isblack(x)      testbit((x)->marked, BLACKBIT)
+#define isgray(x)  /* neither white nor black */  \
+	(!testbits((x)->marked, WHITEBITS | bitmask(BLACKBIT)))
+
+#define tofinalize(x)	testbit((x)->marked, FINALIZEDBIT)
+
+#define otherwhite(g)	((g)->currentwhite ^ WHITEBITS)
+#define isdeadm(ow,m)	(!(((m) ^ WHITEBITS) & (ow)))
+#define isdead(g,v)	isdeadm(otherwhite(g), (v)->marked)
+
+#define changewhite(x)	((x)->marked ^= WHITEBITS)
+#define gray2black(x)	l_setbit((x)->marked, BLACKBIT)
+
+#define luaC_white(g)	cast(lu_byte, (g)->currentwhite & WHITEBITS)
+
+
+/*
+** Does one step of collection when debt becomes positive. 'pre'/'pos'
+** allows some adjustments to be done only when needed. macro
+** 'condchangemem' is used only for heavy tests (forcing a full
+** GC cycle on every opportunity)
+*/
+#define luaC_condGC(L,pre,pos) \
+	{ if (G(L)->GCdebt > 0) { pre; luaC_step(L); pos;}; \
+	  condchangemem(L,pre,pos); }
+
+/* more often than not, 'pre'/'pos' are empty */
+#define luaC_checkGC(L)		luaC_condGC(L,(void)0,(void)0)
+
+
+#define luaC_barrier(L,p,v) (  \
+	(iscollectable(v) && isblack(p) && iswhite(gcvalue(v))) ?  \
+	luaC_barrier_(L,obj2gco(p),gcvalue(v)) : cast_void(0))
+
+#define luaC_barrierback(L,p,v) (  \
+	(iscollectable(v) && isblack(p) && iswhite(gcvalue(v))) ? \
+	luaC_barrierback_(L,p) : cast_void(0))
+
+#define luaC_objbarrier(L,p,o) (  \
+	(isblack(p) && iswhite(o)) ? \
+	luaC_barrier_(L,obj2gco(p),obj2gco(o)) : cast_void(0))
+
+#define luaC_upvalbarrier(L,uv) ( \
+	(iscollectable((uv)->v) && !upisopen(uv)) ? \
+         luaC_upvalbarrier_(L,uv) : cast_void(0))
+
+LUAI_FUNC void luaC_fix (lua_State *L, GCObject *o);
+LUAI_FUNC void luaC_freeallobjects (lua_State *L);
+LUAI_FUNC void luaC_step (lua_State *L);
+LUAI_FUNC void luaC_runtilstate (lua_State *L, int statesmask);
+LUAI_FUNC void luaC_fullgc (lua_State *L, int isemergency);
+LUAI_FUNC GCObject *luaC_newobj (lua_State *L, int tt, size_t sz);
+LUAI_FUNC void luaC_barrier_ (lua_State *L, GCObject *o, GCObject *v);
+LUAI_FUNC void luaC_barrierback_ (lua_State *L, Table *o);
+LUAI_FUNC void luaC_upvalbarrier_ (lua_State *L, UpVal *uv);
+LUAI_FUNC void luaC_checkfinalizer (lua_State *L, GCObject *o, Table *mt);
+LUAI_FUNC void luaC_upvdeccount (lua_State *L, UpVal *uv);
+
+
+#endif
diff --git a/libs/lua/lua-5.3.3/linit.c b/libs/lua/lua-5.3.3/linit.c
new file mode 100644
index 0000000..8ce94cc
--- /dev/null
+++ b/libs/lua/lua-5.3.3/linit.c
@@ -0,0 +1,68 @@
+/*
+** $Id: linit.c,v 1.38 2015/01/05 13:48:33 roberto Exp $
+** Initialization of libraries for lua.c and other clients
+** See Copyright Notice in lua.h
+*/
+
+
+#define linit_c
+#define LUA_LIB
+
+/*
+** If you embed Lua in your program and need to open the standard
+** libraries, call luaL_openlibs in your program. If you need a
+** different set of libraries, copy this file to your project and edit
+** it to suit your needs.
+**
+** You can also *preload* libraries, so that a later 'require' can
+** open the library, which is already linked to the application.
+** For that, do the following code:
+**
+**  luaL_getsubtable(L, LUA_REGISTRYINDEX, "_PRELOAD");
+**  lua_pushcfunction(L, luaopen_modname);
+**  lua_setfield(L, -2, modname);
+**  lua_pop(L, 1);  // remove _PRELOAD table
+*/
+
+#include "lprefix.h"
+
+
+#include <stddef.h>
+
+#include "lua.h"
+
+#include "lualib.h"
+#include "lauxlib.h"
+
+
+/*
+** these libs are loaded by lua.c and are readily available to any Lua
+** program
+*/
+static const luaL_Reg loadedlibs[] = {
+  {"_G", luaopen_base},
+  {LUA_LOADLIBNAME, luaopen_package},
+  {LUA_COLIBNAME, luaopen_coroutine},
+  {LUA_TABLIBNAME, luaopen_table},
+  {LUA_IOLIBNAME, luaopen_io},
+  {LUA_OSLIBNAME, luaopen_os},
+  {LUA_STRLIBNAME, luaopen_string},
+  {LUA_MATHLIBNAME, luaopen_math},
+  {LUA_UTF8LIBNAME, luaopen_utf8},
+  {LUA_DBLIBNAME, luaopen_debug},
+#if defined(LUA_COMPAT_BITLIB)
+  {LUA_BITLIBNAME, luaopen_bit32},
+#endif
+  {NULL, NULL}
+};
+
+
+LUALIB_API void luaL_openlibs (lua_State *L) {
+  const luaL_Reg *lib;
+  /* "require" functions from 'loadedlibs' and set results to global table */
+  for (lib = loadedlibs; lib->func; lib++) {
+    luaL_requiref(L, lib->name, lib->func, 1);
+    lua_pop(L, 1);  /* remove lib */
+  }
+}
+
diff --git a/libs/lua/lua-5.3.3/liolib.c b/libs/lua/lua-5.3.3/liolib.c
new file mode 100644
index 0000000..aa78e59
--- /dev/null
+++ b/libs/lua/lua-5.3.3/liolib.c
@@ -0,0 +1,768 @@
+/*
+** $Id: liolib.c,v 2.149 2016/05/02 14:03:19 roberto Exp $
+** Standard I/O (and system) library
+** See Copyright Notice in lua.h
+*/
+
+#define liolib_c
+#define LUA_LIB
+
+#include "lprefix.h"
+
+
+#include <ctype.h>
+#include <errno.h>
+#include <locale.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "lua.h"
+
+#include "lauxlib.h"
+#include "lualib.h"
+
+
+
+
+/*
+** Change this macro to accept other modes for 'fopen' besides
+** the standard ones.
+*/
+#if !defined(l_checkmode)
+
+/* accepted extensions to 'mode' in 'fopen' */
+#if !defined(L_MODEEXT)
+#define L_MODEEXT	"b"
+#endif
+
+/* Check whether 'mode' matches '[rwa]%+?[L_MODEEXT]*' */
+#define l_checkmode(mode) \
+	(*mode != '\0' && strchr("rwa", *(mode++)) != NULL &&	\
+	(*mode != '+' || (++mode, 1)) &&  /* skip if char is '+' */	\
+	(strspn(mode, L_MODEEXT) == strlen(mode)))
+
+#endif
+
+/*
+** {======================================================
+** l_popen spawns a new process connected to the current
+** one through the file streams.
+** =======================================================
+*/
+
+#if !defined(l_popen)		/* { */
+
+#if defined(LUA_USE_POSIX)	/* { */
+
+#define l_popen(L,c,m)		(fflush(NULL), popen(c,m))
+#define l_pclose(L,file)	(pclose(file))
+
+#elif defined(LUA_USE_WINDOWS)	/* }{ */
+
+#define l_popen(L,c,m)		(_popen(c,m))
+#define l_pclose(L,file)	(_pclose(file))
+
+#else				/* }{ */
+
+/* ISO C definitions */
+#define l_popen(L,c,m)  \
+	  ((void)((void)c, m), \
+	  luaL_error(L, "'popen' not supported"), \
+	  (FILE*)0)
+#define l_pclose(L,file)		((void)L, (void)file, -1)
+
+#endif				/* } */
+
+#endif				/* } */
+
+/* }====================================================== */
+
+
+#if !defined(l_getc)		/* { */
+
+#if defined(LUA_USE_POSIX)
+#define l_getc(f)		getc_unlocked(f)
+#define l_lockfile(f)		flockfile(f)
+#define l_unlockfile(f)		funlockfile(f)
+#else
+#define l_getc(f)		getc(f)
+#define l_lockfile(f)		((void)0)
+#define l_unlockfile(f)		((void)0)
+#endif
+
+#endif				/* } */
+
+
+/*
+** {======================================================
+** l_fseek: configuration for longer offsets
+** =======================================================
+*/
+
+#if !defined(l_fseek)		/* { */
+
+#if defined(LUA_USE_POSIX)	/* { */
+
+#include <sys/types.h>
+
+#define l_fseek(f,o,w)		fseeko(f,o,w)
+#define l_ftell(f)		ftello(f)
+#define l_seeknum		off_t
+
+#elif defined(LUA_USE_WINDOWS) && !defined(_CRTIMP_TYPEINFO) \
+   && defined(_MSC_VER) && (_MSC_VER >= 1400)	/* }{ */
+
+/* Windows (but not DDK) and Visual C++ 2005 or higher */
+#define l_fseek(f,o,w)		_fseeki64(f,o,w)
+#define l_ftell(f)		_ftelli64(f)
+#define l_seeknum		__int64
+
+#else				/* }{ */
+
+/* ISO C definitions */
+#define l_fseek(f,o,w)		fseek(f,o,w)
+#define l_ftell(f)		ftell(f)
+#define l_seeknum		long
+
+#endif				/* } */
+
+#endif				/* } */
+
+/* }====================================================== */
+
+
+#define IO_PREFIX	"_IO_"
+#define IOPREF_LEN	(sizeof(IO_PREFIX)/sizeof(char) - 1)
+#define IO_INPUT	(IO_PREFIX "input")
+#define IO_OUTPUT	(IO_PREFIX "output")
+
+
+typedef luaL_Stream LStream;
+
+
+#define tolstream(L)	((LStream *)luaL_checkudata(L, 1, LUA_FILEHANDLE))
+
+#define isclosed(p)	((p)->closef == NULL)
+
+
+static int io_type (lua_State *L) {
+  LStream *p;
+  luaL_checkany(L, 1);
+  p = (LStream *)luaL_testudata(L, 1, LUA_FILEHANDLE);
+  if (p == NULL)
+    lua_pushnil(L);  /* not a file */
+  else if (isclosed(p))
+    lua_pushliteral(L, "closed file");
+  else
+    lua_pushliteral(L, "file");
+  return 1;
+}
+
+
+static int f_tostring (lua_State *L) {
+  LStream *p = tolstream(L);
+  if (isclosed(p))
+    lua_pushliteral(L, "file (closed)");
+  else
+    lua_pushfstring(L, "file (%p)", p->f);
+  return 1;
+}
+
+
+static FILE *tofile (lua_State *L) {
+  LStream *p = tolstream(L);
+  if (isclosed(p))
+    luaL_error(L, "attempt to use a closed file");
+  lua_assert(p->f);
+  return p->f;
+}
+
+
+/*
+** When creating file handles, always creates a 'closed' file handle
+** before opening the actual file; so, if there is a memory error, the
+** handle is in a consistent state.
+*/
+static LStream *newprefile (lua_State *L) {
+  LStream *p = (LStream *)lua_newuserdata(L, sizeof(LStream));
+  p->closef = NULL;  /* mark file handle as 'closed' */
+  luaL_setmetatable(L, LUA_FILEHANDLE);
+  return p;
+}
+
+
+/*
+** Calls the 'close' function from a file handle. The 'volatile' avoids
+** a bug in some versions of the Clang compiler (e.g., clang 3.0 for
+** 32 bits).
+*/
+static int aux_close (lua_State *L) {
+  LStream *p = tolstream(L);
+  volatile lua_CFunction cf = p->closef;
+  p->closef = NULL;  /* mark stream as closed */
+  return (*cf)(L);  /* close it */
+}
+
+
+static int io_close (lua_State *L) {
+  if (lua_isnone(L, 1))  /* no argument? */
+    lua_getfield(L, LUA_REGISTRYINDEX, IO_OUTPUT);  /* use standard output */
+  tofile(L);  /* make sure argument is an open stream */
+  return aux_close(L);
+}
+
+
+static int f_gc (lua_State *L) {
+  LStream *p = tolstream(L);
+  if (!isclosed(p) && p->f != NULL)
+    aux_close(L);  /* ignore closed and incompletely open files */
+  return 0;
+}
+
+
+/*
+** function to close regular files
+*/
+static int io_fclose (lua_State *L) {
+  LStream *p = tolstream(L);
+  int res = fclose(p->f);
+  return luaL_fileresult(L, (res == 0), NULL);
+}
+
+
+static LStream *newfile (lua_State *L) {
+  LStream *p = newprefile(L);
+  p->f = NULL;
+  p->closef = &io_fclose;
+  return p;
+}
+
+
+static void opencheck (lua_State *L, const char *fname, const char *mode) {
+  LStream *p = newfile(L);
+  p->f = fopen(fname, mode);
+  if (p->f == NULL)
+    luaL_error(L, "cannot open file '%s' (%s)", fname, strerror(errno));
+}
+
+
+static int io_open (lua_State *L) {
+  const char *filename = luaL_checkstring(L, 1);
+  const char *mode = luaL_optstring(L, 2, "r");
+  LStream *p = newfile(L);
+  const char *md = mode;  /* to traverse/check mode */
+  luaL_argcheck(L, l_checkmode(md), 2, "invalid mode");
+  p->f = fopen(filename, mode);
+  return (p->f == NULL) ? luaL_fileresult(L, 0, filename) : 1;
+}
+
+
+/*
+** function to close 'popen' files
+*/
+static int io_pclose (lua_State *L) {
+  LStream *p = tolstream(L);
+  return luaL_execresult(L, l_pclose(L, p->f));
+}
+
+
+static int io_popen (lua_State *L) {
+  const char *filename = luaL_checkstring(L, 1);
+  const char *mode = luaL_optstring(L, 2, "r");
+  LStream *p = newprefile(L);
+  p->f = l_popen(L, filename, mode);
+  p->closef = &io_pclose;
+  return (p->f == NULL) ? luaL_fileresult(L, 0, filename) : 1;
+}
+
+
+static int io_tmpfile (lua_State *L) {
+  LStream *p = newfile(L);
+  p->f = tmpfile();
+  return (p->f == NULL) ? luaL_fileresult(L, 0, NULL) : 1;
+}
+
+
+static FILE *getiofile (lua_State *L, const char *findex) {
+  LStream *p;
+  lua_getfield(L, LUA_REGISTRYINDEX, findex);
+  p = (LStream *)lua_touserdata(L, -1);
+  if (isclosed(p))
+    luaL_error(L, "standard %s file is closed", findex + IOPREF_LEN);
+  return p->f;
+}
+
+
+static int g_iofile (lua_State *L, const char *f, const char *mode) {
+  if (!lua_isnoneornil(L, 1)) {
+    const char *filename = lua_tostring(L, 1);
+    if (filename)
+      opencheck(L, filename, mode);
+    else {
+      tofile(L);  /* check that it's a valid file handle */
+      lua_pushvalue(L, 1);
+    }
+    lua_setfield(L, LUA_REGISTRYINDEX, f);
+  }
+  /* return current value */
+  lua_getfield(L, LUA_REGISTRYINDEX, f);
+  return 1;
+}
+
+
+static int io_input (lua_State *L) {
+  return g_iofile(L, IO_INPUT, "r");
+}
+
+
+static int io_output (lua_State *L) {
+  return g_iofile(L, IO_OUTPUT, "w");
+}
+
+
+static int io_readline (lua_State *L);
+
+
+/*
+** maximum number of arguments to 'f:lines'/'io.lines' (it + 3 must fit
+** in the limit for upvalues of a closure)
+*/
+#define MAXARGLINE	250
+
+static void aux_lines (lua_State *L, int toclose) {
+  int n = lua_gettop(L) - 1;  /* number of arguments to read */
+  luaL_argcheck(L, n <= MAXARGLINE, MAXARGLINE + 2, "too many arguments");
+  lua_pushinteger(L, n);  /* number of arguments to read */
+  lua_pushboolean(L, toclose);  /* close/not close file when finished */
+  lua_rotate(L, 2, 2);  /* move 'n' and 'toclose' to their positions */
+  lua_pushcclosure(L, io_readline, 3 + n);
+}
+
+
+static int f_lines (lua_State *L) {
+  tofile(L);  /* check that it's a valid file handle */
+  aux_lines(L, 0);
+  return 1;
+}
+
+
+static int io_lines (lua_State *L) {
+  int toclose;
+  if (lua_isnone(L, 1)) lua_pushnil(L);  /* at least one argument */
+  if (lua_isnil(L, 1)) {  /* no file name? */
+    lua_getfield(L, LUA_REGISTRYINDEX, IO_INPUT);  /* get default input */
+    lua_replace(L, 1);  /* put it at index 1 */
+    tofile(L);  /* check that it's a valid file handle */
+    toclose = 0;  /* do not close it after iteration */
+  }
+  else {  /* open a new file */
+    const char *filename = luaL_checkstring(L, 1);
+    opencheck(L, filename, "r");
+    lua_replace(L, 1);  /* put file at index 1 */
+    toclose = 1;  /* close it after iteration */
+  }
+  aux_lines(L, toclose);
+  return 1;
+}
+
+
+/*
+** {======================================================
+** READ
+** =======================================================
+*/
+
+
+/* maximum length of a numeral */
+#if !defined (L_MAXLENNUM)
+#define L_MAXLENNUM     200
+#endif
+
+
+/* auxiliary structure used by 'read_number' */
+typedef struct {
+  FILE *f;  /* file being read */
+  int c;  /* current character (look ahead) */
+  int n;  /* number of elements in buffer 'buff' */
+  char buff[L_MAXLENNUM + 1];  /* +1 for ending '\0' */
+} RN;
+
+
+/*
+** Add current char to buffer (if not out of space) and read next one
+*/
+static int nextc (RN *rn) {
+  if (rn->n >= L_MAXLENNUM) {  /* buffer overflow? */
+    rn->buff[0] = '\0';  /* invalidate result */
+    return 0;  /* fail */
+  }
+  else {
+    rn->buff[rn->n++] = rn->c;  /* save current char */
+    rn->c = l_getc(rn->f);  /* read next one */
+    return 1;
+  }
+}
+
+
+/*
+** Accept current char if it is in 'set' (of size 2)
+*/
+static int test2 (RN *rn, const char *set) {
+  if (rn->c == set[0] || rn->c == set[1])
+    return nextc(rn);
+  else return 0;
+}
+
+
+/*
+** Read a sequence of (hex)digits
+*/
+static int readdigits (RN *rn, int hex) {
+  int count = 0;
+  while ((hex ? isxdigit(rn->c) : isdigit(rn->c)) && nextc(rn))
+    count++;
+  return count;
+}
+
+
+/*
+** Read a number: first reads a valid prefix of a numeral into a buffer.
+** Then it calls 'lua_stringtonumber' to check whether the format is
+** correct and to convert it to a Lua number
+*/
+static int read_number (lua_State *L, FILE *f) {
+  RN rn;
+  int count = 0;
+  int hex = 0;
+  char decp[2];
+  rn.f = f; rn.n = 0;
+  decp[0] = lua_getlocaledecpoint();  /* get decimal point from locale */
+  decp[1] = '.';  /* always accept a dot */
+  l_lockfile(rn.f);
+  do { rn.c = l_getc(rn.f); } while (isspace(rn.c));  /* skip spaces */
+  test2(&rn, "-+");  /* optional signal */
+  if (test2(&rn, "00")) {
+    if (test2(&rn, "xX")) hex = 1;  /* numeral is hexadecimal */
+    else count = 1;  /* count initial '0' as a valid digit */
+  }
+  count += readdigits(&rn, hex);  /* integral part */
+  if (test2(&rn, decp))  /* decimal point? */
+    count += readdigits(&rn, hex);  /* fractional part */
+  if (count > 0 && test2(&rn, (hex ? "pP" : "eE"))) {  /* exponent mark? */
+    test2(&rn, "-+");  /* exponent signal */
+    readdigits(&rn, 0);  /* exponent digits */
+  }
+  ungetc(rn.c, rn.f);  /* unread look-ahead char */
+  l_unlockfile(rn.f);
+  rn.buff[rn.n] = '\0';  /* finish string */
+  if (lua_stringtonumber(L, rn.buff))  /* is this a valid number? */
+    return 1;  /* ok */
+  else {  /* invalid format */
+   lua_pushnil(L);  /* "result" to be removed */
+   return 0;  /* read fails */
+  }
+}
+
+
+static int test_eof (lua_State *L, FILE *f) {
+  int c = getc(f);
+  ungetc(c, f);  /* no-op when c == EOF */
+  lua_pushliteral(L, "");
+  return (c != EOF);
+}
+
+
+static int read_line (lua_State *L, FILE *f, int chop) {
+  luaL_Buffer b;
+  int c = '\0';
+  luaL_buffinit(L, &b);
+  while (c != EOF && c != '\n') {  /* repeat until end of line */
+    char *buff = luaL_prepbuffer(&b);  /* preallocate buffer */
+    int i = 0;
+    l_lockfile(f);  /* no memory errors can happen inside the lock */
+    while (i < LUAL_BUFFERSIZE && (c = l_getc(f)) != EOF && c != '\n')
+      buff[i++] = c;
+    l_unlockfile(f);
+    luaL_addsize(&b, i);
+  }
+  if (!chop && c == '\n')  /* want a newline and have one? */
+    luaL_addchar(&b, c);  /* add ending newline to result */
+  luaL_pushresult(&b);  /* close buffer */
+  /* return ok if read something (either a newline or something else) */
+  return (c == '\n' || lua_rawlen(L, -1) > 0);
+}
+
+
+static void read_all (lua_State *L, FILE *f) {
+  size_t nr;
+  luaL_Buffer b;
+  luaL_buffinit(L, &b);
+  do {  /* read file in chunks of LUAL_BUFFERSIZE bytes */
+    char *p = luaL_prepbuffer(&b);
+    nr = fread(p, sizeof(char), LUAL_BUFFERSIZE, f);
+    luaL_addsize(&b, nr);
+  } while (nr == LUAL_BUFFERSIZE);
+  luaL_pushresult(&b);  /* close buffer */
+}
+
+
+static int read_chars (lua_State *L, FILE *f, size_t n) {
+  size_t nr;  /* number of chars actually read */
+  char *p;
+  luaL_Buffer b;
+  luaL_buffinit(L, &b);
+  p = luaL_prepbuffsize(&b, n);  /* prepare buffer to read whole block */
+  nr = fread(p, sizeof(char), n, f);  /* try to read 'n' chars */
+  luaL_addsize(&b, nr);
+  luaL_pushresult(&b);  /* close buffer */
+  return (nr > 0);  /* true iff read something */
+}
+
+
+static int g_read (lua_State *L, FILE *f, int first) {
+  int nargs = lua_gettop(L) - 1;
+  int success;
+  int n;
+  clearerr(f);
+  if (nargs == 0) {  /* no arguments? */
+    success = read_line(L, f, 1);
+    n = first+1;  /* to return 1 result */
+  }
+  else {  /* ensure stack space for all results and for auxlib's buffer */
+    luaL_checkstack(L, nargs+LUA_MINSTACK, "too many arguments");
+    success = 1;
+    for (n = first; nargs-- && success; n++) {
+      if (lua_type(L, n) == LUA_TNUMBER) {
+        size_t l = (size_t)luaL_checkinteger(L, n);
+        success = (l == 0) ? test_eof(L, f) : read_chars(L, f, l);
+      }
+      else {
+        const char *p = luaL_checkstring(L, n);
+        if (*p == '*') p++;  /* skip optional '*' (for compatibility) */
+        switch (*p) {
+          case 'n':  /* number */
+            success = read_number(L, f);
+            break;
+          case 'l':  /* line */
+            success = read_line(L, f, 1);
+            break;
+          case 'L':  /* line with end-of-line */
+            success = read_line(L, f, 0);
+            break;
+          case 'a':  /* file */
+            read_all(L, f);  /* read entire file */
+            success = 1; /* always success */
+            break;
+          default:
+            return luaL_argerror(L, n, "invalid format");
+        }
+      }
+    }
+  }
+  if (ferror(f))
+    return luaL_fileresult(L, 0, NULL);
+  if (!success) {
+    lua_pop(L, 1);  /* remove last result */
+    lua_pushnil(L);  /* push nil instead */
+  }
+  return n - first;
+}
+
+
+static int io_read (lua_State *L) {
+  return g_read(L, getiofile(L, IO_INPUT), 1);
+}
+
+
+static int f_read (lua_State *L) {
+  return g_read(L, tofile(L), 2);
+}
+
+
+static int io_readline (lua_State *L) {
+  LStream *p = (LStream *)lua_touserdata(L, lua_upvalueindex(1));
+  int i;
+  int n = (int)lua_tointeger(L, lua_upvalueindex(2));
+  if (isclosed(p))  /* file is already closed? */
+    return luaL_error(L, "file is already closed");
+  lua_settop(L , 1);
+  luaL_checkstack(L, n, "too many arguments");
+  for (i = 1; i <= n; i++)  /* push arguments to 'g_read' */
+    lua_pushvalue(L, lua_upvalueindex(3 + i));
+  n = g_read(L, p->f, 2);  /* 'n' is number of results */
+  lua_assert(n > 0);  /* should return at least a nil */
+  if (lua_toboolean(L, -n))  /* read at least one value? */
+    return n;  /* return them */
+  else {  /* first result is nil: EOF or error */
+    if (n > 1) {  /* is there error information? */
+      /* 2nd result is error message */
+      return luaL_error(L, "%s", lua_tostring(L, -n + 1));
+    }
+    if (lua_toboolean(L, lua_upvalueindex(3))) {  /* generator created file? */
+      lua_settop(L, 0);
+      lua_pushvalue(L, lua_upvalueindex(1));
+      aux_close(L);  /* close it */
+    }
+    return 0;
+  }
+}
+
+/* }====================================================== */
+
+
+static int g_write (lua_State *L, FILE *f, int arg) {
+  int nargs = lua_gettop(L) - arg;
+  int status = 1;
+  for (; nargs--; arg++) {
+    if (lua_type(L, arg) == LUA_TNUMBER) {
+      /* optimization: could be done exactly as for strings */
+      int len = lua_isinteger(L, arg)
+                ? fprintf(f, LUA_INTEGER_FMT, lua_tointeger(L, arg))
+                : fprintf(f, LUA_NUMBER_FMT, lua_tonumber(L, arg));
+      status = status && (len > 0);
+    }
+    else {
+      size_t l;
+      const char *s = luaL_checklstring(L, arg, &l);
+      status = status && (fwrite(s, sizeof(char), l, f) == l);
+    }
+  }
+  if (status) return 1;  /* file handle already on stack top */
+  else return luaL_fileresult(L, status, NULL);
+}
+
+
+static int io_write (lua_State *L) {
+  return g_write(L, getiofile(L, IO_OUTPUT), 1);
+}
+
+
+static int f_write (lua_State *L) {
+  FILE *f = tofile(L);
+  lua_pushvalue(L, 1);  /* push file at the stack top (to be returned) */
+  return g_write(L, f, 2);
+}
+
+
+static int f_seek (lua_State *L) {
+  static const int mode[] = {SEEK_SET, SEEK_CUR, SEEK_END};
+  static const char *const modenames[] = {"set", "cur", "end", NULL};
+  FILE *f = tofile(L);
+  int op = luaL_checkoption(L, 2, "cur", modenames);
+  lua_Integer p3 = luaL_optinteger(L, 3, 0);
+  l_seeknum offset = (l_seeknum)p3;
+  luaL_argcheck(L, (lua_Integer)offset == p3, 3,
+                  "not an integer in proper range");
+  op = l_fseek(f, offset, mode[op]);
+  if (op)
+    return luaL_fileresult(L, 0, NULL);  /* error */
+  else {
+    lua_pushinteger(L, (lua_Integer)l_ftell(f));
+    return 1;
+  }
+}
+
+
+static int f_setvbuf (lua_State *L) {
+  static const int mode[] = {_IONBF, _IOFBF, _IOLBF};
+  static const char *const modenames[] = {"no", "full", "line", NULL};
+  FILE *f = tofile(L);
+  int op = luaL_checkoption(L, 2, NULL, modenames);
+  lua_Integer sz = luaL_optinteger(L, 3, LUAL_BUFFERSIZE);
+  int res = setvbuf(f, NULL, mode[op], (size_t)sz);
+  return luaL_fileresult(L, res == 0, NULL);
+}
+
+
+
+static int io_flush (lua_State *L) {
+  return luaL_fileresult(L, fflush(getiofile(L, IO_OUTPUT)) == 0, NULL);
+}
+
+
+static int f_flush (lua_State *L) {
+  return luaL_fileresult(L, fflush(tofile(L)) == 0, NULL);
+}
+
+
+/*
+** functions for 'io' library
+*/
+static const luaL_Reg iolib[] = {
+  {"close", io_close},
+  {"flush", io_flush},
+  {"input", io_input},
+  {"lines", io_lines},
+  {"open", io_open},
+  {"output", io_output},
+  {"popen", io_popen},
+  {"read", io_read},
+  {"tmpfile", io_tmpfile},
+  {"type", io_type},
+  {"write", io_write},
+  {NULL, NULL}
+};
+
+
+/*
+** methods for file handles
+*/
+static const luaL_Reg flib[] = {
+  {"close", io_close},
+  {"flush", f_flush},
+  {"lines", f_lines},
+  {"read", f_read},
+  {"seek", f_seek},
+  {"setvbuf", f_setvbuf},
+  {"write", f_write},
+  {"__gc", f_gc},
+  {"__tostring", f_tostring},
+  {NULL, NULL}
+};
+
+
+static void createmeta (lua_State *L) {
+  luaL_newmetatable(L, LUA_FILEHANDLE);  /* create metatable for file handles */
+  lua_pushvalue(L, -1);  /* push metatable */
+  lua_setfield(L, -2, "__index");  /* metatable.__index = metatable */
+  luaL_setfuncs(L, flib, 0);  /* add file methods to new metatable */
+  lua_pop(L, 1);  /* pop new metatable */
+}
+
+
+/*
+** function to (not) close the standard files stdin, stdout, and stderr
+*/
+static int io_noclose (lua_State *L) {
+  LStream *p = tolstream(L);
+  p->closef = &io_noclose;  /* keep file opened */
+  lua_pushnil(L);
+  lua_pushliteral(L, "cannot close standard file");
+  return 2;
+}
+
+
+static void createstdfile (lua_State *L, FILE *f, const char *k,
+                           const char *fname) {
+  LStream *p = newprefile(L);
+  p->f = f;
+  p->closef = &io_noclose;
+  if (k != NULL) {
+    lua_pushvalue(L, -1);
+    lua_setfield(L, LUA_REGISTRYINDEX, k);  /* add file to registry */
+  }
+  lua_setfield(L, -2, fname);  /* add file to module */
+}
+
+
+LUAMOD_API int luaopen_io (lua_State *L) {
+  luaL_newlib(L, iolib);  /* new module */
+  createmeta(L);
+  /* create (and set) default files */
+  createstdfile(L, stdin, IO_INPUT, "stdin");
+  createstdfile(L, stdout, IO_OUTPUT, "stdout");
+  createstdfile(L, stderr, NULL, "stderr");
+  return 1;
+}
+
diff --git a/libs/lua/lua-5.3.3/llex.c b/libs/lua/lua-5.3.3/llex.c
new file mode 100644
index 0000000..7032827
--- /dev/null
+++ b/libs/lua/lua-5.3.3/llex.c
@@ -0,0 +1,565 @@
+/*
+** $Id: llex.c,v 2.96 2016/05/02 14:02:12 roberto Exp $
+** Lexical Analyzer
+** See Copyright Notice in lua.h
+*/
+
+#define llex_c
+#define LUA_CORE
+
+#include "lprefix.h"
+
+
+#include <locale.h>
+#include <string.h>
+
+#include "lua.h"
+
+#include "lctype.h"
+#include "ldebug.h"
+#include "ldo.h"
+#include "lgc.h"
+#include "llex.h"
+#include "lobject.h"
+#include "lparser.h"
+#include "lstate.h"
+#include "lstring.h"
+#include "ltable.h"
+#include "lzio.h"
+
+
+
+#define next(ls) (ls->current = zgetc(ls->z))
+
+
+
+#define currIsNewline(ls)	(ls->current == '\n' || ls->current == '\r')
+
+
+/* ORDER RESERVED */
+static const char *const luaX_tokens [] = {
+    "and", "break", "do", "else", "elseif",
+    "end", "false", "for", "function", "goto", "if",
+    "in", "local", "nil", "not", "or", "repeat",
+    "return", "then", "true", "until", "while",
+    "//", "..", "...", "==", ">=", "<=", "~=",
+    "<<", ">>", "::", "<eof>",
+    "<number>", "<integer>", "<name>", "<string>"
+};
+
+
+#define save_and_next(ls) (save(ls, ls->current), next(ls))
+
+
+static l_noret lexerror (LexState *ls, const char *msg, int token);
+
+
+static void save (LexState *ls, int c) {
+  Mbuffer *b = ls->buff;
+  if (luaZ_bufflen(b) + 1 > luaZ_sizebuffer(b)) {
+    size_t newsize;
+    if (luaZ_sizebuffer(b) >= MAX_SIZE/2)
+      lexerror(ls, "lexical element too long", 0);
+    newsize = luaZ_sizebuffer(b) * 2;
+    luaZ_resizebuffer(ls->L, b, newsize);
+  }
+  b->buffer[luaZ_bufflen(b)++] = cast(char, c);
+}
+
+
+void luaX_init (lua_State *L) {
+  int i;
+  TString *e = luaS_newliteral(L, LUA_ENV);  /* create env name */
+  luaC_fix(L, obj2gco(e));  /* never collect this name */
+  for (i=0; i<NUM_RESERVED; i++) {
+    TString *ts = luaS_new(L, luaX_tokens[i]);
+    luaC_fix(L, obj2gco(ts));  /* reserved words are never collected */
+    ts->extra = cast_byte(i+1);  /* reserved word */
+  }
+}
+
+
+const char *luaX_token2str (LexState *ls, int token) {
+  if (token < FIRST_RESERVED) {  /* single-byte symbols? */
+    lua_assert(token == cast_uchar(token));
+    return luaO_pushfstring(ls->L, "'%c'", token);
+  }
+  else {
+    const char *s = luaX_tokens[token - FIRST_RESERVED];
+    if (token < TK_EOS)  /* fixed format (symbols and reserved words)? */
+      return luaO_pushfstring(ls->L, "'%s'", s);
+    else  /* names, strings, and numerals */
+      return s;
+  }
+}
+
+
+static const char *txtToken (LexState *ls, int token) {
+  switch (token) {
+    case TK_NAME: case TK_STRING:
+    case TK_FLT: case TK_INT:
+      save(ls, '\0');
+      return luaO_pushfstring(ls->L, "'%s'", luaZ_buffer(ls->buff));
+    default:
+      return luaX_token2str(ls, token);
+  }
+}
+
+
+static l_noret lexerror (LexState *ls, const char *msg, int token) {
+  msg = luaG_addinfo(ls->L, msg, ls->source, ls->linenumber);
+  if (token)
+    luaO_pushfstring(ls->L, "%s near %s", msg, txtToken(ls, token));
+  luaD_throw(ls->L, LUA_ERRSYNTAX);
+}
+
+
+l_noret luaX_syntaxerror (LexState *ls, const char *msg) {
+  lexerror(ls, msg, ls->t.token);
+}
+
+
+/*
+** creates a new string and anchors it in scanner's table so that
+** it will not be collected until the end of the compilation
+** (by that time it should be anchored somewhere)
+*/
+TString *luaX_newstring (LexState *ls, const char *str, size_t l) {
+  lua_State *L = ls->L;
+  TValue *o;  /* entry for 'str' */
+  TString *ts = luaS_newlstr(L, str, l);  /* create new string */
+  setsvalue2s(L, L->top++, ts);  /* temporarily anchor it in stack */
+  o = luaH_set(L, ls->h, L->top - 1);
+  if (ttisnil(o)) {  /* not in use yet? */
+    /* boolean value does not need GC barrier;
+       table has no metatable, so it does not need to invalidate cache */
+    setbvalue(o, 1);  /* t[string] = true */
+    luaC_checkGC(L);
+  }
+  else {  /* string already present */
+    ts = tsvalue(keyfromval(o));  /* re-use value previously stored */
+  }
+  L->top--;  /* remove string from stack */
+  return ts;
+}
+
+
+/*
+** increment line number and skips newline sequence (any of
+** \n, \r, \n\r, or \r\n)
+*/
+static void inclinenumber (LexState *ls) {
+  int old = ls->current;
+  lua_assert(currIsNewline(ls));
+  next(ls);  /* skip '\n' or '\r' */
+  if (currIsNewline(ls) && ls->current != old)
+    next(ls);  /* skip '\n\r' or '\r\n' */
+  if (++ls->linenumber >= MAX_INT)
+    lexerror(ls, "chunk has too many lines", 0);
+}
+
+
+void luaX_setinput (lua_State *L, LexState *ls, ZIO *z, TString *source,
+                    int firstchar) {
+  ls->t.token = 0;
+  ls->L = L;
+  ls->current = firstchar;
+  ls->lookahead.token = TK_EOS;  /* no look-ahead token */
+  ls->z = z;
+  ls->fs = NULL;
+  ls->linenumber = 1;
+  ls->lastline = 1;
+  ls->source = source;
+  ls->envn = luaS_newliteral(L, LUA_ENV);  /* get env name */
+  luaZ_resizebuffer(ls->L, ls->buff, LUA_MINBUFFER);  /* initialize buffer */
+}
+
+
+
+/*
+** =======================================================
+** LEXICAL ANALYZER
+** =======================================================
+*/
+
+
+static int check_next1 (LexState *ls, int c) {
+  if (ls->current == c) {
+    next(ls);
+    return 1;
+  }
+  else return 0;
+}
+
+
+/*
+** Check whether current char is in set 'set' (with two chars) and
+** saves it
+*/
+static int check_next2 (LexState *ls, const char *set) {
+  lua_assert(set[2] == '\0');
+  if (ls->current == set[0] || ls->current == set[1]) {
+    save_and_next(ls);
+    return 1;
+  }
+  else return 0;
+}
+
+
+/* LUA_NUMBER */
+/*
+** this function is quite liberal in what it accepts, as 'luaO_str2num'
+** will reject ill-formed numerals.
+*/
+static int read_numeral (LexState *ls, SemInfo *seminfo) {
+  TValue obj;
+  const char *expo = "Ee";
+  int first = ls->current;
+  lua_assert(lisdigit(ls->current));
+  save_and_next(ls);
+  if (first == '0' && check_next2(ls, "xX"))  /* hexadecimal? */
+    expo = "Pp";
+  for (;;) {
+    if (check_next2(ls, expo))  /* exponent part? */
+      check_next2(ls, "-+");  /* optional exponent sign */
+    if (lisxdigit(ls->current))
+      save_and_next(ls);
+    else if (ls->current == '.')
+      save_and_next(ls);
+    else break;
+  }
+  save(ls, '\0');
+  if (luaO_str2num(luaZ_buffer(ls->buff), &obj) == 0)  /* format error? */
+    lexerror(ls, "malformed number", TK_FLT);
+  if (ttisinteger(&obj)) {
+    seminfo->i = ivalue(&obj);
+    return TK_INT;
+  }
+  else {
+    lua_assert(ttisfloat(&obj));
+    seminfo->r = fltvalue(&obj);
+    return TK_FLT;
+  }
+}
+
+
+/*
+** skip a sequence '[=*[' or ']=*]'; if sequence is well formed, return
+** its number of '='s; otherwise, return a negative number (-1 iff there
+** are no '='s after initial bracket)
+*/
+static int skip_sep (LexState *ls) {
+  int count = 0;
+  int s = ls->current;
+  lua_assert(s == '[' || s == ']');
+  save_and_next(ls);
+  while (ls->current == '=') {
+    save_and_next(ls);
+    count++;
+  }
+  return (ls->current == s) ? count : (-count) - 1;
+}
+
+
+static void read_long_string (LexState *ls, SemInfo *seminfo, int sep) {
+  int line = ls->linenumber;  /* initial line (for error message) */
+  save_and_next(ls);  /* skip 2nd '[' */
+  if (currIsNewline(ls))  /* string starts with a newline? */
+    inclinenumber(ls);  /* skip it */
+  for (;;) {
+    switch (ls->current) {
+      case EOZ: {  /* error */
+        const char *what = (seminfo ? "string" : "comment");
+        const char *msg = luaO_pushfstring(ls->L,
+                     "unfinished long %s (starting at line %d)", what, line);
+        lexerror(ls, msg, TK_EOS);
+        break;  /* to avoid warnings */
+      }
+      case ']': {
+        if (skip_sep(ls) == sep) {
+          save_and_next(ls);  /* skip 2nd ']' */
+          goto endloop;
+        }
+        break;
+      }
+      case '\n': case '\r': {
+        save(ls, '\n');
+        inclinenumber(ls);
+        if (!seminfo) luaZ_resetbuffer(ls->buff);  /* avoid wasting space */
+        break;
+      }
+      default: {
+        if (seminfo) save_and_next(ls);
+        else next(ls);
+      }
+    }
+  } endloop:
+  if (seminfo)
+    seminfo->ts = luaX_newstring(ls, luaZ_buffer(ls->buff) + (2 + sep),
+                                     luaZ_bufflen(ls->buff) - 2*(2 + sep));
+}
+
+
+static void esccheck (LexState *ls, int c, const char *msg) {
+  if (!c) {
+    if (ls->current != EOZ)
+      save_and_next(ls);  /* add current to buffer for error message */
+    lexerror(ls, msg, TK_STRING);
+  }
+}
+
+
+static int gethexa (LexState *ls) {
+  save_and_next(ls);
+  esccheck (ls, lisxdigit(ls->current), "hexadecimal digit expected");
+  return luaO_hexavalue(ls->current);
+}
+
+
+static int readhexaesc (LexState *ls) {
+  int r = gethexa(ls);
+  r = (r << 4) + gethexa(ls);
+  luaZ_buffremove(ls->buff, 2);  /* remove saved chars from buffer */
+  return r;
+}
+
+
+static unsigned long readutf8esc (LexState *ls) {
+  unsigned long r;
+  int i = 4;  /* chars to be removed: '\', 'u', '{', and first digit */
+  save_and_next(ls);  /* skip 'u' */
+  esccheck(ls, ls->current == '{', "missing '{'");
+  r = gethexa(ls);  /* must have at least one digit */
+  while ((save_and_next(ls), lisxdigit(ls->current))) {
+    i++;
+    r = (r << 4) + luaO_hexavalue(ls->current);
+    esccheck(ls, r <= 0x10FFFF, "UTF-8 value too large");
+  }
+  esccheck(ls, ls->current == '}', "missing '}'");
+  next(ls);  /* skip '}' */
+  luaZ_buffremove(ls->buff, i);  /* remove saved chars from buffer */
+  return r;
+}
+
+
+static void utf8esc (LexState *ls) {
+  char buff[UTF8BUFFSZ];
+  int n = luaO_utf8esc(buff, readutf8esc(ls));
+  for (; n > 0; n--)  /* add 'buff' to string */
+    save(ls, buff[UTF8BUFFSZ - n]);
+}
+
+
+static int readdecesc (LexState *ls) {
+  int i;
+  int r = 0;  /* result accumulator */
+  for (i = 0; i < 3 && lisdigit(ls->current); i++) {  /* read up to 3 digits */
+    r = 10*r + ls->current - '0';
+    save_and_next(ls);
+  }
+  esccheck(ls, r <= UCHAR_MAX, "decimal escape too large");
+  luaZ_buffremove(ls->buff, i);  /* remove read digits from buffer */
+  return r;
+}
+
+
+static void read_string (LexState *ls, int del, SemInfo *seminfo) {
+  save_and_next(ls);  /* keep delimiter (for error messages) */
+  while (ls->current != del) {
+    switch (ls->current) {
+      case EOZ:
+        lexerror(ls, "unfinished string", TK_EOS);
+        break;  /* to avoid warnings */
+      case '\n':
+      case '\r':
+        lexerror(ls, "unfinished string", TK_STRING);
+        break;  /* to avoid warnings */
+      case '\\': {  /* escape sequences */
+        int c;  /* final character to be saved */
+        save_and_next(ls);  /* keep '\\' for error messages */
+        switch (ls->current) {
+          case 'a': c = '\a'; goto read_save;
+          case 'b': c = '\b'; goto read_save;
+          case 'f': c = '\f'; goto read_save;
+          case 'n': c = '\n'; goto read_save;
+          case 'r': c = '\r'; goto read_save;
+          case 't': c = '\t'; goto read_save;
+          case 'v': c = '\v'; goto read_save;
+          case 'x': c = readhexaesc(ls); goto read_save;
+          case 'u': utf8esc(ls);  goto no_save;
+          case '\n': case '\r':
+            inclinenumber(ls); c = '\n'; goto only_save;
+          case '\\': case '\"': case '\'':
+            c = ls->current; goto read_save;
+          case EOZ: goto no_save;  /* will raise an error next loop */
+          case 'z': {  /* zap following span of spaces */
+            luaZ_buffremove(ls->buff, 1);  /* remove '\\' */
+            next(ls);  /* skip the 'z' */
+            while (lisspace(ls->current)) {
+              if (currIsNewline(ls)) inclinenumber(ls);
+              else next(ls);
+            }
+            goto no_save;
+          }
+          default: {
+            esccheck(ls, lisdigit(ls->current), "invalid escape sequence");
+            c = readdecesc(ls);  /* digital escape '\ddd' */
+            goto only_save;
+          }
+        }
+       read_save:
+         next(ls);
+         /* go through */
+       only_save:
+         luaZ_buffremove(ls->buff, 1);  /* remove '\\' */
+         save(ls, c);
+         /* go through */
+       no_save: break;
+      }
+      default:
+        save_and_next(ls);
+    }
+  }
+  save_and_next(ls);  /* skip delimiter */
+  seminfo->ts = luaX_newstring(ls, luaZ_buffer(ls->buff) + 1,
+                                   luaZ_bufflen(ls->buff) - 2);
+}
+
+
+static int llex (LexState *ls, SemInfo *seminfo) {
+  luaZ_resetbuffer(ls->buff);
+  for (;;) {
+    switch (ls->current) {
+      case '\n': case '\r': {  /* line breaks */
+        inclinenumber(ls);
+        break;
+      }
+      case ' ': case '\f': case '\t': case '\v': {  /* spaces */
+        next(ls);
+        break;
+      }
+      case '-': {  /* '-' or '--' (comment) */
+        next(ls);
+        if (ls->current != '-') return '-';
+        /* else is a comment */
+        next(ls);
+        if (ls->current == '[') {  /* long comment? */
+          int sep = skip_sep(ls);
+          luaZ_resetbuffer(ls->buff);  /* 'skip_sep' may dirty the buffer */
+          if (sep >= 0) {
+            read_long_string(ls, NULL, sep);  /* skip long comment */
+            luaZ_resetbuffer(ls->buff);  /* previous call may dirty the buff. */
+            break;
+          }
+        }
+        /* else short comment */
+        while (!currIsNewline(ls) && ls->current != EOZ)
+          next(ls);  /* skip until end of line (or end of file) */
+        break;
+      }
+      case '[': {  /* long string or simply '[' */
+        int sep = skip_sep(ls);
+        if (sep >= 0) {
+          read_long_string(ls, seminfo, sep);
+          return TK_STRING;
+        }
+        else if (sep != -1)  /* '[=...' missing second bracket */
+          lexerror(ls, "invalid long string delimiter", TK_STRING);
+        return '[';
+      }
+      case '=': {
+        next(ls);
+        if (check_next1(ls, '=')) return TK_EQ;
+        else return '=';
+      }
+      case '<': {
+        next(ls);
+        if (check_next1(ls, '=')) return TK_LE;
+        else if (check_next1(ls, '<')) return TK_SHL;
+        else return '<';
+      }
+      case '>': {
+        next(ls);
+        if (check_next1(ls, '=')) return TK_GE;
+        else if (check_next1(ls, '>')) return TK_SHR;
+        else return '>';
+      }
+      case '/': {
+        next(ls);
+        if (check_next1(ls, '/')) return TK_IDIV;
+        else return '/';
+      }
+      case '~': {
+        next(ls);
+        if (check_next1(ls, '=')) return TK_NE;
+        else return '~';
+      }
+      case ':': {
+        next(ls);
+        if (check_next1(ls, ':')) return TK_DBCOLON;
+        else return ':';
+      }
+      case '"': case '\'': {  /* short literal strings */
+        read_string(ls, ls->current, seminfo);
+        return TK_STRING;
+      }
+      case '.': {  /* '.', '..', '...', or number */
+        save_and_next(ls);
+        if (check_next1(ls, '.')) {
+          if (check_next1(ls, '.'))
+            return TK_DOTS;   /* '...' */
+          else return TK_CONCAT;   /* '..' */
+        }
+        else if (!lisdigit(ls->current)) return '.';
+        else return read_numeral(ls, seminfo);
+      }
+      case '0': case '1': case '2': case '3': case '4':
+      case '5': case '6': case '7': case '8': case '9': {
+        return read_numeral(ls, seminfo);
+      }
+      case EOZ: {
+        return TK_EOS;
+      }
+      default: {
+        if (lislalpha(ls->current)) {  /* identifier or reserved word? */
+          TString *ts;
+          do {
+            save_and_next(ls);
+          } while (lislalnum(ls->current));
+          ts = luaX_newstring(ls, luaZ_buffer(ls->buff),
+                                  luaZ_bufflen(ls->buff));
+          seminfo->ts = ts;
+          if (isreserved(ts))  /* reserved word? */
+            return ts->extra - 1 + FIRST_RESERVED;
+          else {
+            return TK_NAME;
+          }
+        }
+        else {  /* single-char tokens (+ - / ...) */
+          int c = ls->current;
+          next(ls);
+          return c;
+        }
+      }
+    }
+  }
+}
+
+
+void luaX_next (LexState *ls) {
+  ls->lastline = ls->linenumber;
+  if (ls->lookahead.token != TK_EOS) {  /* is there a look-ahead token? */
+    ls->t = ls->lookahead;  /* use this one */
+    ls->lookahead.token = TK_EOS;  /* and discharge it */
+  }
+  else
+    ls->t.token = llex(ls, &ls->t.seminfo);  /* read next token */
+}
+
+
+int luaX_lookahead (LexState *ls) {
+  lua_assert(ls->lookahead.token == TK_EOS);
+  ls->lookahead.token = llex(ls, &ls->lookahead.seminfo);
+  return ls->lookahead.token;
+}
+
diff --git a/libs/lua/lua-5.3.3/llex.h b/libs/lua/lua-5.3.3/llex.h
new file mode 100644
index 0000000..2363d87
--- /dev/null
+++ b/libs/lua/lua-5.3.3/llex.h
@@ -0,0 +1,85 @@
+/*
+** $Id: llex.h,v 1.79 2016/05/02 14:02:12 roberto Exp $
+** Lexical Analyzer
+** See Copyright Notice in lua.h
+*/
+
+#ifndef llex_h
+#define llex_h
+
+#include "lobject.h"
+#include "lzio.h"
+
+
+#define FIRST_RESERVED	257
+
+
+#if !defined(LUA_ENV)
+#define LUA_ENV		"_ENV"
+#endif
+
+
+/*
+* WARNING: if you change the order of this enumeration,
+* grep "ORDER RESERVED"
+*/
+enum RESERVED {
+  /* terminal symbols denoted by reserved words */
+  TK_AND = FIRST_RESERVED, TK_BREAK,
+  TK_DO, TK_ELSE, TK_ELSEIF, TK_END, TK_FALSE, TK_FOR, TK_FUNCTION,
+  TK_GOTO, TK_IF, TK_IN, TK_LOCAL, TK_NIL, TK_NOT, TK_OR, TK_REPEAT,
+  TK_RETURN, TK_THEN, TK_TRUE, TK_UNTIL, TK_WHILE,
+  /* other terminal symbols */
+  TK_IDIV, TK_CONCAT, TK_DOTS, TK_EQ, TK_GE, TK_LE, TK_NE,
+  TK_SHL, TK_SHR,
+  TK_DBCOLON, TK_EOS,
+  TK_FLT, TK_INT, TK_NAME, TK_STRING
+};
+
+/* number of reserved words */
+#define NUM_RESERVED	(cast(int, TK_WHILE-FIRST_RESERVED+1))
+
+
+typedef union {
+  lua_Number r;
+  lua_Integer i;
+  TString *ts;
+} SemInfo;  /* semantics information */
+
+
+typedef struct Token {
+  int token;
+  SemInfo seminfo;
+} Token;
+
+
+/* state of the lexer plus state of the parser when shared by all
+   functions */
+typedef struct LexState {
+  int current;  /* current character (charint) */
+  int linenumber;  /* input line counter */
+  int lastline;  /* line of last token 'consumed' */
+  Token t;  /* current token */
+  Token lookahead;  /* look ahead token */
+  struct FuncState *fs;  /* current function (parser) */
+  struct lua_State *L;
+  ZIO *z;  /* input stream */
+  Mbuffer *buff;  /* buffer for tokens */
+  Table *h;  /* to avoid collection/reuse strings */
+  struct Dyndata *dyd;  /* dynamic structures used by the parser */
+  TString *source;  /* current source name */
+  TString *envn;  /* environment variable name */
+} LexState;
+
+
+LUAI_FUNC void luaX_init (lua_State *L);
+LUAI_FUNC void luaX_setinput (lua_State *L, LexState *ls, ZIO *z,
+                              TString *source, int firstchar);
+LUAI_FUNC TString *luaX_newstring (LexState *ls, const char *str, size_t l);
+LUAI_FUNC void luaX_next (LexState *ls);
+LUAI_FUNC int luaX_lookahead (LexState *ls);
+LUAI_FUNC l_noret luaX_syntaxerror (LexState *ls, const char *s);
+LUAI_FUNC const char *luaX_token2str (LexState *ls, int token);
+
+
+#endif
diff --git a/libs/lua/lua-5.3.3/llimits.h b/libs/lua/lua-5.3.3/llimits.h
new file mode 100644
index 0000000..f21377f
--- /dev/null
+++ b/libs/lua/lua-5.3.3/llimits.h
@@ -0,0 +1,323 @@
+/*
+** $Id: llimits.h,v 1.141 2015/11/19 19:16:22 roberto Exp $
+** Limits, basic types, and some other 'installation-dependent' definitions
+** See Copyright Notice in lua.h
+*/
+
+#ifndef llimits_h
+#define llimits_h
+
+
+#include <limits.h>
+#include <stddef.h>
+
+
+#include "lua.h"
+
+/*
+** 'lu_mem' and 'l_mem' are unsigned/signed integers big enough to count
+** the total memory used by Lua (in bytes). Usually, 'size_t' and
+** 'ptrdiff_t' should work, but we use 'long' for 16-bit machines.
+*/
+#if defined(LUAI_MEM)		/* { external definitions? */
+typedef LUAI_UMEM lu_mem;
+typedef LUAI_MEM l_mem;
+#elif LUAI_BITSINT >= 32	/* }{ */
+typedef size_t lu_mem;
+typedef ptrdiff_t l_mem;
+#else  /* 16-bit ints */	/* }{ */
+typedef unsigned long lu_mem;
+typedef long l_mem;
+#endif				/* } */
+
+
+/* chars used as small naturals (so that 'char' is reserved for characters) */
+typedef unsigned char lu_byte;
+
+
+/* maximum value for size_t */
+#define MAX_SIZET	((size_t)(~(size_t)0))
+
+/* maximum size visible for Lua (must be representable in a lua_Integer */
+#define MAX_SIZE	(sizeof(size_t) < sizeof(lua_Integer) ? MAX_SIZET \
+                          : (size_t)(LUA_MAXINTEGER))
+
+
+#define MAX_LUMEM	((lu_mem)(~(lu_mem)0))
+
+#define MAX_LMEM	((l_mem)(MAX_LUMEM >> 1))
+
+
+#define MAX_INT		INT_MAX  /* maximum value of an int */
+
+
+/*
+** conversion of pointer to unsigned integer:
+** this is for hashing only; there is no problem if the integer
+** cannot hold the whole pointer value
+*/
+#define point2uint(p)	((unsigned int)((size_t)(p) & UINT_MAX))
+
+
+
+/* type to ensure maximum alignment */
+#if defined(LUAI_USER_ALIGNMENT_T)
+typedef LUAI_USER_ALIGNMENT_T L_Umaxalign;
+#else
+typedef union {
+  lua_Number n;
+  double u;
+  void *s;
+  lua_Integer i;
+  long l;
+} L_Umaxalign;
+#endif
+
+
+
+/* types of 'usual argument conversions' for lua_Number and lua_Integer */
+typedef LUAI_UACNUMBER l_uacNumber;
+typedef LUAI_UACINT l_uacInt;
+
+
+/* internal assertions for in-house debugging */
+#if defined(lua_assert)
+#define check_exp(c,e)		(lua_assert(c), (e))
+/* to avoid problems with conditions too long */
+#define lua_longassert(c)	((c) ? (void)0 : lua_assert(0))
+#else
+#define lua_assert(c)		((void)0)
+#define check_exp(c,e)		(e)
+#define lua_longassert(c)	((void)0)
+#endif
+
+/*
+** assertion for checking API calls
+*/
+#if !defined(luai_apicheck)
+#define luai_apicheck(l,e)	lua_assert(e)
+#endif
+
+#define api_check(l,e,msg)	luai_apicheck(l,(e) && msg)
+
+
+/* macro to avoid warnings about unused variables */
+#if !defined(UNUSED)
+#define UNUSED(x)	((void)(x))
+#endif
+
+
+/* type casts (a macro highlights casts in the code) */
+#define cast(t, exp)	((t)(exp))
+
+#define cast_void(i)	cast(void, (i))
+#define cast_byte(i)	cast(lu_byte, (i))
+#define cast_num(i)	cast(lua_Number, (i))
+#define cast_int(i)	cast(int, (i))
+#define cast_uchar(i)	cast(unsigned char, (i))
+
+
+/* cast a signed lua_Integer to lua_Unsigned */
+#if !defined(l_castS2U)
+#define l_castS2U(i)	((lua_Unsigned)(i))
+#endif
+
+/*
+** cast a lua_Unsigned to a signed lua_Integer; this cast is
+** not strict ISO C, but two-complement architectures should
+** work fine.
+*/
+#if !defined(l_castU2S)
+#define l_castU2S(i)	((lua_Integer)(i))
+#endif
+
+
+/*
+** non-return type
+*/
+#if defined(__GNUC__)
+#define l_noret		void __attribute__((noreturn))
+#elif defined(_MSC_VER) && _MSC_VER >= 1200
+#define l_noret		void __declspec(noreturn)
+#else
+#define l_noret		void
+#endif
+
+
+
+/*
+** maximum depth for nested C calls and syntactical nested non-terminals
+** in a program. (Value must fit in an unsigned short int.)
+*/
+#if !defined(LUAI_MAXCCALLS)
+#define LUAI_MAXCCALLS		200
+#endif
+
+
+
+/*
+** type for virtual-machine instructions;
+** must be an unsigned with (at least) 4 bytes (see details in lopcodes.h)
+*/
+#if LUAI_BITSINT >= 32
+typedef unsigned int Instruction;
+#else
+typedef unsigned long Instruction;
+#endif
+
+
+
+/*
+** Maximum length for short strings, that is, strings that are
+** internalized. (Cannot be smaller than reserved words or tags for
+** metamethods, as these strings must be internalized;
+** #("function") = 8, #("__newindex") = 10.)
+*/
+#if !defined(LUAI_MAXSHORTLEN)
+#define LUAI_MAXSHORTLEN	40
+#endif
+
+
+/*
+** Initial size for the string table (must be power of 2).
+** The Lua core alone registers ~50 strings (reserved words +
+** metaevent keys + a few others). Libraries would typically add
+** a few dozens more.
+*/
+#if !defined(MINSTRTABSIZE)
+#define MINSTRTABSIZE	128
+#endif
+
+
+/*
+** Size of cache for strings in the API. 'N' is the number of
+** sets (better be a prime) and "M" is the size of each set (M == 1
+** makes a direct cache.)
+*/
+#if !defined(STRCACHE_N)
+#define STRCACHE_N		53
+#define STRCACHE_M		2
+#endif
+
+
+/* minimum size for string buffer */
+#if !defined(LUA_MINBUFFER)
+#define LUA_MINBUFFER	32
+#endif
+
+
+/*
+** macros that are executed whenever program enters the Lua core
+** ('lua_lock') and leaves the core ('lua_unlock')
+*/
+#if !defined(lua_lock)
+#define lua_lock(L)	((void) 0)
+#define lua_unlock(L)	((void) 0)
+#endif
+
+/*
+** macro executed during Lua functions at points where the
+** function can yield.
+*/
+#if !defined(luai_threadyield)
+#define luai_threadyield(L)	{lua_unlock(L); lua_lock(L);}
+#endif
+
+
+/*
+** these macros allow user-specific actions on threads when you defined
+** LUAI_EXTRASPACE and need to do something extra when a thread is
+** created/deleted/resumed/yielded.
+*/
+#if !defined(luai_userstateopen)
+#define luai_userstateopen(L)		((void)L)
+#endif
+
+#if !defined(luai_userstateclose)
+#define luai_userstateclose(L)		((void)L)
+#endif
+
+#if !defined(luai_userstatethread)
+#define luai_userstatethread(L,L1)	((void)L)
+#endif
+
+#if !defined(luai_userstatefree)
+#define luai_userstatefree(L,L1)	((void)L)
+#endif
+
+#if !defined(luai_userstateresume)
+#define luai_userstateresume(L,n)	((void)L)
+#endif
+
+#if !defined(luai_userstateyield)
+#define luai_userstateyield(L,n)	((void)L)
+#endif
+
+
+
+/*
+** The luai_num* macros define the primitive operations over numbers.
+*/
+
+/* floor division (defined as 'floor(a/b)') */
+#if !defined(luai_numidiv)
+#define luai_numidiv(L,a,b)     ((void)L, l_floor(luai_numdiv(L,a,b)))
+#endif
+
+/* float division */
+#if !defined(luai_numdiv)
+#define luai_numdiv(L,a,b)      ((a)/(b))
+#endif
+
+/*
+** modulo: defined as 'a - floor(a/b)*b'; this definition gives NaN when
+** 'b' is huge, but the result should be 'a'. 'fmod' gives the result of
+** 'a - trunc(a/b)*b', and therefore must be corrected when 'trunc(a/b)
+** ~= floor(a/b)'. That happens when the division has a non-integer
+** negative result, which is equivalent to the test below.
+*/
+#if !defined(luai_nummod)
+#define luai_nummod(L,a,b,m)  \
+  { (m) = l_mathop(fmod)(a,b); if ((m)*(b) < 0) (m) += (b); }
+#endif
+
+/* exponentiation */
+#if !defined(luai_numpow)
+#define luai_numpow(L,a,b)      ((void)L, l_mathop(pow)(a,b))
+#endif
+
+/* the others are quite standard operations */
+#if !defined(luai_numadd)
+#define luai_numadd(L,a,b)      ((a)+(b))
+#define luai_numsub(L,a,b)      ((a)-(b))
+#define luai_nummul(L,a,b)      ((a)*(b))
+#define luai_numunm(L,a)        (-(a))
+#define luai_numeq(a,b)         ((a)==(b))
+#define luai_numlt(a,b)         ((a)<(b))
+#define luai_numle(a,b)         ((a)<=(b))
+#define luai_numisnan(a)        (!luai_numeq((a), (a)))
+#endif
+
+
+
+
+
+/*
+** macro to control inclusion of some hard tests on stack reallocation
+*/
+#if !defined(HARDSTACKTESTS)
+#define condmovestack(L,pre,pos)	((void)0)
+#else
+/* realloc stack keeping its size */
+#define condmovestack(L,pre,pos)  \
+	{ int sz_ = (L)->stacksize; pre; luaD_reallocstack((L), sz_); pos; }
+#endif
+
+#if !defined(HARDMEMTESTS)
+#define condchangemem(L,pre,pos)	((void)0)
+#else
+#define condchangemem(L,pre,pos)  \
+	{ if (G(L)->gcrunning) { pre; luaC_fullgc(L, 0); pos; } }
+#endif
+
+#endif
diff --git a/libs/lua/lua-5.3.3/lmathlib.c b/libs/lua/lua-5.3.3/lmathlib.c
new file mode 100644
index 0000000..94815f1
--- /dev/null
+++ b/libs/lua/lua-5.3.3/lmathlib.c
@@ -0,0 +1,407 @@
+/*
+** $Id: lmathlib.c,v 1.117 2015/10/02 15:39:23 roberto Exp $
+** Standard mathematical library
+** See Copyright Notice in lua.h
+*/
+
+#define lmathlib_c
+#define LUA_LIB
+
+#include "lprefix.h"
+
+
+#include <stdlib.h>
+#include <math.h>
+
+#include "lua.h"
+
+#include "lauxlib.h"
+#include "lualib.h"
+
+
+#undef PI
+#define PI	(l_mathop(3.141592653589793238462643383279502884))
+
+
+#if !defined(l_rand)		/* { */
+#if defined(LUA_USE_POSIX)
+#define l_rand()	random()
+#define l_srand(x)	srandom(x)
+#define L_RANDMAX	2147483647	/* (2^31 - 1), following POSIX */
+#else
+#define l_rand()	rand()
+#define l_srand(x)	srand(x)
+#define L_RANDMAX	RAND_MAX
+#endif
+#endif				/* } */
+
+
+static int math_abs (lua_State *L) {
+  if (lua_isinteger(L, 1)) {
+    lua_Integer n = lua_tointeger(L, 1);
+    if (n < 0) n = (lua_Integer)(0u - (lua_Unsigned)n);
+    lua_pushinteger(L, n);
+  }
+  else
+    lua_pushnumber(L, l_mathop(fabs)(luaL_checknumber(L, 1)));
+  return 1;
+}
+
+static int math_sin (lua_State *L) {
+  lua_pushnumber(L, l_mathop(sin)(luaL_checknumber(L, 1)));
+  return 1;
+}
+
+static int math_cos (lua_State *L) {
+  lua_pushnumber(L, l_mathop(cos)(luaL_checknumber(L, 1)));
+  return 1;
+}
+
+static int math_tan (lua_State *L) {
+  lua_pushnumber(L, l_mathop(tan)(luaL_checknumber(L, 1)));
+  return 1;
+}
+
+static int math_asin (lua_State *L) {
+  lua_pushnumber(L, l_mathop(asin)(luaL_checknumber(L, 1)));
+  return 1;
+}
+
+static int math_acos (lua_State *L) {
+  lua_pushnumber(L, l_mathop(acos)(luaL_checknumber(L, 1)));
+  return 1;
+}
+
+static int math_atan (lua_State *L) {
+  lua_Number y = luaL_checknumber(L, 1);
+  lua_Number x = luaL_optnumber(L, 2, 1);
+  lua_pushnumber(L, l_mathop(atan2)(y, x));
+  return 1;
+}
+
+
+static int math_toint (lua_State *L) {
+  int valid;
+  lua_Integer n = lua_tointegerx(L, 1, &valid);
+  if (valid)
+    lua_pushinteger(L, n);
+  else {
+    luaL_checkany(L, 1);
+    lua_pushnil(L);  /* value is not convertible to integer */
+  }
+  return 1;
+}
+
+
+static void pushnumint (lua_State *L, lua_Number d) {
+  lua_Integer n;
+  if (lua_numbertointeger(d, &n))  /* does 'd' fit in an integer? */
+    lua_pushinteger(L, n);  /* result is integer */
+  else
+    lua_pushnumber(L, d);  /* result is float */
+}
+
+
+static int math_floor (lua_State *L) {
+  if (lua_isinteger(L, 1))
+    lua_settop(L, 1);  /* integer is its own floor */
+  else {
+    lua_Number d = l_mathop(floor)(luaL_checknumber(L, 1));
+    pushnumint(L, d);
+  }
+  return 1;
+}
+
+
+static int math_ceil (lua_State *L) {
+  if (lua_isinteger(L, 1))
+    lua_settop(L, 1);  /* integer is its own ceil */
+  else {
+    lua_Number d = l_mathop(ceil)(luaL_checknumber(L, 1));
+    pushnumint(L, d);
+  }
+  return 1;
+}
+
+
+static int math_fmod (lua_State *L) {
+  if (lua_isinteger(L, 1) && lua_isinteger(L, 2)) {
+    lua_Integer d = lua_tointeger(L, 2);
+    if ((lua_Unsigned)d + 1u <= 1u) {  /* special cases: -1 or 0 */
+      luaL_argcheck(L, d != 0, 2, "zero");
+      lua_pushinteger(L, 0);  /* avoid overflow with 0x80000... / -1 */
+    }
+    else
+      lua_pushinteger(L, lua_tointeger(L, 1) % d);
+  }
+  else
+    lua_pushnumber(L, l_mathop(fmod)(luaL_checknumber(L, 1),
+                                     luaL_checknumber(L, 2)));
+  return 1;
+}
+
+
+/*
+** next function does not use 'modf', avoiding problems with 'double*'
+** (which is not compatible with 'float*') when lua_Number is not
+** 'double'.
+*/
+static int math_modf (lua_State *L) {
+  if (lua_isinteger(L ,1)) {
+    lua_settop(L, 1);  /* number is its own integer part */
+    lua_pushnumber(L, 0);  /* no fractional part */
+  }
+  else {
+    lua_Number n = luaL_checknumber(L, 1);
+    /* integer part (rounds toward zero) */
+    lua_Number ip = (n < 0) ? l_mathop(ceil)(n) : l_mathop(floor)(n);
+    pushnumint(L, ip);
+    /* fractional part (test needed for inf/-inf) */
+    lua_pushnumber(L, (n == ip) ? l_mathop(0.0) : (n - ip));
+  }
+  return 2;
+}
+
+
+static int math_sqrt (lua_State *L) {
+  lua_pushnumber(L, l_mathop(sqrt)(luaL_checknumber(L, 1)));
+  return 1;
+}
+
+
+static int math_ult (lua_State *L) {
+  lua_Integer a = luaL_checkinteger(L, 1);
+  lua_Integer b = luaL_checkinteger(L, 2);
+  lua_pushboolean(L, (lua_Unsigned)a < (lua_Unsigned)b);
+  return 1;
+}
+
+static int math_log (lua_State *L) {
+  lua_Number x = luaL_checknumber(L, 1);
+  lua_Number res;
+  if (lua_isnoneornil(L, 2))
+    res = l_mathop(log)(x);
+  else {
+    lua_Number base = luaL_checknumber(L, 2);
+#if !defined(LUA_USE_C89)
+    if (base == 2.0) res = l_mathop(log2)(x); else
+#endif
+    if (base == 10.0) res = l_mathop(log10)(x);
+    else res = l_mathop(log)(x)/l_mathop(log)(base);
+  }
+  lua_pushnumber(L, res);
+  return 1;
+}
+
+static int math_exp (lua_State *L) {
+  lua_pushnumber(L, l_mathop(exp)(luaL_checknumber(L, 1)));
+  return 1;
+}
+
+static int math_deg (lua_State *L) {
+  lua_pushnumber(L, luaL_checknumber(L, 1) * (l_mathop(180.0) / PI));
+  return 1;
+}
+
+static int math_rad (lua_State *L) {
+  lua_pushnumber(L, luaL_checknumber(L, 1) * (PI / l_mathop(180.0)));
+  return 1;
+}
+
+
+static int math_min (lua_State *L) {
+  int n = lua_gettop(L);  /* number of arguments */
+  int imin = 1;  /* index of current minimum value */
+  int i;
+  luaL_argcheck(L, n >= 1, 1, "value expected");
+  for (i = 2; i <= n; i++) {
+    if (lua_compare(L, i, imin, LUA_OPLT))
+      imin = i;
+  }
+  lua_pushvalue(L, imin);
+  return 1;
+}
+
+
+static int math_max (lua_State *L) {
+  int n = lua_gettop(L);  /* number of arguments */
+  int imax = 1;  /* index of current maximum value */
+  int i;
+  luaL_argcheck(L, n >= 1, 1, "value expected");
+  for (i = 2; i <= n; i++) {
+    if (lua_compare(L, imax, i, LUA_OPLT))
+      imax = i;
+  }
+  lua_pushvalue(L, imax);
+  return 1;
+}
+
+/*
+** This function uses 'double' (instead of 'lua_Number') to ensure that
+** all bits from 'l_rand' can be represented, and that 'RANDMAX + 1.0'
+** will keep full precision (ensuring that 'r' is always less than 1.0.)
+*/
+static int math_random (lua_State *L) {
+  lua_Integer low, up;
+  double r = (double)l_rand() * (1.0 / ((double)L_RANDMAX + 1.0));
+  switch (lua_gettop(L)) {  /* check number of arguments */
+    case 0: {  /* no arguments */
+      lua_pushnumber(L, (lua_Number)r);  /* Number between 0 and 1 */
+      return 1;
+    }
+    case 1: {  /* only upper limit */
+      low = 1;
+      up = luaL_checkinteger(L, 1);
+      break;
+    }
+    case 2: {  /* lower and upper limits */
+      low = luaL_checkinteger(L, 1);
+      up = luaL_checkinteger(L, 2);
+      break;
+    }
+    default: return luaL_error(L, "wrong number of arguments");
+  }
+  /* random integer in the interval [low, up] */
+  luaL_argcheck(L, low <= up, 1, "interval is empty"); 
+  luaL_argcheck(L, low >= 0 || up <= LUA_MAXINTEGER + low, 1,
+                   "interval too large");
+  r *= (double)(up - low) + 1.0;
+  lua_pushinteger(L, (lua_Integer)r + low);
+  return 1;
+}
+
+
+static int math_randomseed (lua_State *L) {
+  l_srand((unsigned int)(lua_Integer)luaL_checknumber(L, 1));
+  (void)l_rand(); /* discard first value to avoid undesirable correlations */
+  return 0;
+}
+
+
+static int math_type (lua_State *L) {
+  if (lua_type(L, 1) == LUA_TNUMBER) {
+      if (lua_isinteger(L, 1))
+        lua_pushliteral(L, "integer"); 
+      else
+        lua_pushliteral(L, "float"); 
+  }
+  else {
+    luaL_checkany(L, 1);
+    lua_pushnil(L);
+  }
+  return 1;
+}
+
+
+/*
+** {==================================================================
+** Deprecated functions (for compatibility only)
+** ===================================================================
+*/
+#if defined(LUA_COMPAT_MATHLIB)
+
+static int math_cosh (lua_State *L) {
+  lua_pushnumber(L, l_mathop(cosh)(luaL_checknumber(L, 1)));
+  return 1;
+}
+
+static int math_sinh (lua_State *L) {
+  lua_pushnumber(L, l_mathop(sinh)(luaL_checknumber(L, 1)));
+  return 1;
+}
+
+static int math_tanh (lua_State *L) {
+  lua_pushnumber(L, l_mathop(tanh)(luaL_checknumber(L, 1)));
+  return 1;
+}
+
+static int math_pow (lua_State *L) {
+  lua_Number x = luaL_checknumber(L, 1);
+  lua_Number y = luaL_checknumber(L, 2);
+  lua_pushnumber(L, l_mathop(pow)(x, y));
+  return 1;
+}
+
+static int math_frexp (lua_State *L) {
+  int e;
+  lua_pushnumber(L, l_mathop(frexp)(luaL_checknumber(L, 1), &e));
+  lua_pushinteger(L, e);
+  return 2;
+}
+
+static int math_ldexp (lua_State *L) {
+  lua_Number x = luaL_checknumber(L, 1);
+  int ep = (int)luaL_checkinteger(L, 2);
+  lua_pushnumber(L, l_mathop(ldexp)(x, ep));
+  return 1;
+}
+
+static int math_log10 (lua_State *L) {
+  lua_pushnumber(L, l_mathop(log10)(luaL_checknumber(L, 1)));
+  return 1;
+}
+
+#endif
+/* }================================================================== */
+
+
+
+static const luaL_Reg mathlib[] = {
+  {"abs",   math_abs},
+  {"acos",  math_acos},
+  {"asin",  math_asin},
+  {"atan",  math_atan},
+  {"ceil",  math_ceil},
+  {"cos",   math_cos},
+  {"deg",   math_deg},
+  {"exp",   math_exp},
+  {"tointeger", math_toint},
+  {"floor", math_floor},
+  {"fmod",   math_fmod},
+  {"ult",   math_ult},
+  {"log",   math_log},
+  {"max",   math_max},
+  {"min",   math_min},
+  {"modf",   math_modf},
+  {"rad",   math_rad},
+  {"random",     math_random},
+  {"randomseed", math_randomseed},
+  {"sin",   math_sin},
+  {"sqrt",  math_sqrt},
+  {"tan",   math_tan},
+  {"type", math_type},
+#if defined(LUA_COMPAT_MATHLIB)
+  {"atan2", math_atan},
+  {"cosh",   math_cosh},
+  {"sinh",   math_sinh},
+  {"tanh",   math_tanh},
+  {"pow",   math_pow},
+  {"frexp", math_frexp},
+  {"ldexp", math_ldexp},
+  {"log10", math_log10},
+#endif
+  /* placeholders */
+  {"pi", NULL},
+  {"huge", NULL},
+  {"maxinteger", NULL},
+  {"mininteger", NULL},
+  {NULL, NULL}
+};
+
+
+/*
+** Open math library
+*/
+LUAMOD_API int luaopen_math (lua_State *L) {
+  luaL_newlib(L, mathlib);
+  lua_pushnumber(L, PI);
+  lua_setfield(L, -2, "pi");
+  lua_pushnumber(L, (lua_Number)HUGE_VAL);
+  lua_setfield(L, -2, "huge");
+  lua_pushinteger(L, LUA_MAXINTEGER);
+  lua_setfield(L, -2, "maxinteger");
+  lua_pushinteger(L, LUA_MININTEGER);
+  lua_setfield(L, -2, "mininteger");
+  return 1;
+}
+
diff --git a/libs/lua/lua-5.3.3/lmem.c b/libs/lua/lua-5.3.3/lmem.c
new file mode 100644
index 0000000..0a0476c
--- /dev/null
+++ b/libs/lua/lua-5.3.3/lmem.c
@@ -0,0 +1,100 @@
+/*
+** $Id: lmem.c,v 1.91 2015/03/06 19:45:54 roberto Exp $
+** Interface to Memory Manager
+** See Copyright Notice in lua.h
+*/
+
+#define lmem_c
+#define LUA_CORE
+
+#include "lprefix.h"
+
+
+#include <stddef.h>
+
+#include "lua.h"
+
+#include "ldebug.h"
+#include "ldo.h"
+#include "lgc.h"
+#include "lmem.h"
+#include "lobject.h"
+#include "lstate.h"
+
+
+
+/*
+** About the realloc function:
+** void * frealloc (void *ud, void *ptr, size_t osize, size_t nsize);
+** ('osize' is the old size, 'nsize' is the new size)
+**
+** * frealloc(ud, NULL, x, s) creates a new block of size 's' (no
+** matter 'x').
+**
+** * frealloc(ud, p, x, 0) frees the block 'p'
+** (in this specific case, frealloc must return NULL);
+** particularly, frealloc(ud, NULL, 0, 0) does nothing
+** (which is equivalent to free(NULL) in ISO C)
+**
+** frealloc returns NULL if it cannot create or reallocate the area
+** (any reallocation to an equal or smaller size cannot fail!)
+*/
+
+
+
+#define MINSIZEARRAY	4
+
+
+void *luaM_growaux_ (lua_State *L, void *block, int *size, size_t size_elems,
+                     int limit, const char *what) {
+  void *newblock;
+  int newsize;
+  if (*size >= limit/2) {  /* cannot double it? */
+    if (*size >= limit)  /* cannot grow even a little? */
+      luaG_runerror(L, "too many %s (limit is %d)", what, limit);
+    newsize = limit;  /* still have at least one free place */
+  }
+  else {
+    newsize = (*size)*2;
+    if (newsize < MINSIZEARRAY)
+      newsize = MINSIZEARRAY;  /* minimum size */
+  }
+  newblock = luaM_reallocv(L, block, *size, newsize, size_elems);
+  *size = newsize;  /* update only when everything else is OK */
+  return newblock;
+}
+
+
+l_noret luaM_toobig (lua_State *L) {
+  luaG_runerror(L, "memory allocation error: block too big");
+}
+
+
+
+/*
+** generic allocation routine.
+*/
+void *luaM_realloc_ (lua_State *L, void *block, size_t osize, size_t nsize) {
+  void *newblock;
+  global_State *g = G(L);
+  size_t realosize = (block) ? osize : 0;
+  lua_assert((realosize == 0) == (block == NULL));
+#if defined(HARDMEMTESTS)
+  if (nsize > realosize && g->gcrunning)
+    luaC_fullgc(L, 1);  /* force a GC whenever possible */
+#endif
+  newblock = (*g->frealloc)(g->ud, block, osize, nsize);
+  if (newblock == NULL && nsize > 0) {
+    lua_assert(nsize > realosize);  /* cannot fail when shrinking a block */
+    if (g->version) {  /* is state fully built? */
+      luaC_fullgc(L, 1);  /* try to free some memory... */
+      newblock = (*g->frealloc)(g->ud, block, osize, nsize);  /* try again */
+    }
+    if (newblock == NULL)
+      luaD_throw(L, LUA_ERRMEM);
+  }
+  lua_assert((nsize == 0) == (newblock == NULL));
+  g->GCdebt = (g->GCdebt + nsize) - realosize;
+  return newblock;
+}
+
diff --git a/libs/lua/lua-5.3.3/lmem.h b/libs/lua/lua-5.3.3/lmem.h
new file mode 100644
index 0000000..30f4848
--- /dev/null
+++ b/libs/lua/lua-5.3.3/lmem.h
@@ -0,0 +1,69 @@
+/*
+** $Id: lmem.h,v 1.43 2014/12/19 17:26:14 roberto Exp $
+** Interface to Memory Manager
+** See Copyright Notice in lua.h
+*/
+
+#ifndef lmem_h
+#define lmem_h
+
+
+#include <stddef.h>
+
+#include "llimits.h"
+#include "lua.h"
+
+
+/*
+** This macro reallocs a vector 'b' from 'on' to 'n' elements, where
+** each element has size 'e'. In case of arithmetic overflow of the
+** product 'n'*'e', it raises an error (calling 'luaM_toobig'). Because
+** 'e' is always constant, it avoids the runtime division MAX_SIZET/(e).
+**
+** (The macro is somewhat complex to avoid warnings:  The 'sizeof'
+** comparison avoids a runtime comparison when overflow cannot occur.
+** The compiler should be able to optimize the real test by itself, but
+** when it does it, it may give a warning about "comparison is always
+** false due to limited range of data type"; the +1 tricks the compiler,
+** avoiding this warning but also this optimization.)
+*/
+#define luaM_reallocv(L,b,on,n,e) \
+  (((sizeof(n) >= sizeof(size_t) && cast(size_t, (n)) + 1 > MAX_SIZET/(e)) \
+      ? luaM_toobig(L) : cast_void(0)) , \
+   luaM_realloc_(L, (b), (on)*(e), (n)*(e)))
+
+/*
+** Arrays of chars do not need any test
+*/
+#define luaM_reallocvchar(L,b,on,n)  \
+    cast(char *, luaM_realloc_(L, (b), (on)*sizeof(char), (n)*sizeof(char)))
+
+#define luaM_freemem(L, b, s)	luaM_realloc_(L, (b), (s), 0)
+#define luaM_free(L, b)		luaM_realloc_(L, (b), sizeof(*(b)), 0)
+#define luaM_freearray(L, b, n)   luaM_realloc_(L, (b), (n)*sizeof(*(b)), 0)
+
+#define luaM_malloc(L,s)	luaM_realloc_(L, NULL, 0, (s))
+#define luaM_new(L,t)		cast(t *, luaM_malloc(L, sizeof(t)))
+#define luaM_newvector(L,n,t) \
+		cast(t *, luaM_reallocv(L, NULL, 0, n, sizeof(t)))
+
+#define luaM_newobject(L,tag,s)	luaM_realloc_(L, NULL, tag, (s))
+
+#define luaM_growvector(L,v,nelems,size,t,limit,e) \
+          if ((nelems)+1 > (size)) \
+            ((v)=cast(t *, luaM_growaux_(L,v,&(size),sizeof(t),limit,e)))
+
+#define luaM_reallocvector(L, v,oldn,n,t) \
+   ((v)=cast(t *, luaM_reallocv(L, v, oldn, n, sizeof(t))))
+
+LUAI_FUNC l_noret luaM_toobig (lua_State *L);
+
+/* not to be called directly */
+LUAI_FUNC void *luaM_realloc_ (lua_State *L, void *block, size_t oldsize,
+                                                          size_t size);
+LUAI_FUNC void *luaM_growaux_ (lua_State *L, void *block, int *size,
+                               size_t size_elem, int limit,
+                               const char *what);
+
+#endif
+
diff --git a/libs/lua/lua-5.3.3/loadlib.c b/libs/lua/lua-5.3.3/loadlib.c
new file mode 100644
index 0000000..7911928
--- /dev/null
+++ b/libs/lua/lua-5.3.3/loadlib.c
@@ -0,0 +1,787 @@
+/*
+** $Id: loadlib.c,v 1.127 2015/11/23 11:30:45 roberto Exp $
+** Dynamic library loader for Lua
+** See Copyright Notice in lua.h
+**
+** This module contains an implementation of loadlib for Unix systems
+** that have dlfcn, an implementation for Windows, and a stub for other
+** systems.
+*/
+
+#define loadlib_c
+#define LUA_LIB
+
+#include "lprefix.h"
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "lua.h"
+
+#include "lauxlib.h"
+#include "lualib.h"
+
+
+/*
+** LUA_PATH_VAR and LUA_CPATH_VAR are the names of the environment
+** variables that Lua check to set its paths.
+*/
+#if !defined(LUA_PATH_VAR)
+#define LUA_PATH_VAR	"LUA_PATH"
+#endif
+
+#if !defined(LUA_CPATH_VAR)
+#define LUA_CPATH_VAR	"LUA_CPATH"
+#endif
+
+#define LUA_PATHSUFFIX		"_" LUA_VERSION_MAJOR "_" LUA_VERSION_MINOR
+
+#define LUA_PATHVARVERSION		LUA_PATH_VAR LUA_PATHSUFFIX
+#define LUA_CPATHVARVERSION		LUA_CPATH_VAR LUA_PATHSUFFIX
+
+/*
+** LUA_PATH_SEP is the character that separates templates in a path.
+** LUA_PATH_MARK is the string that marks the substitution points in a
+** template.
+** LUA_EXEC_DIR in a Windows path is replaced by the executable's
+** directory.
+** LUA_IGMARK is a mark to ignore all before it when building the
+** luaopen_ function name.
+*/
+#if !defined (LUA_PATH_SEP)
+#define LUA_PATH_SEP		";"
+#endif
+#if !defined (LUA_PATH_MARK)
+#define LUA_PATH_MARK		"?"
+#endif
+#if !defined (LUA_EXEC_DIR)
+#define LUA_EXEC_DIR		"!"
+#endif
+#if !defined (LUA_IGMARK)
+#define LUA_IGMARK		"-"
+#endif
+
+
+/*
+** LUA_CSUBSEP is the character that replaces dots in submodule names
+** when searching for a C loader.
+** LUA_LSUBSEP is the character that replaces dots in submodule names
+** when searching for a Lua loader.
+*/
+#if !defined(LUA_CSUBSEP)
+#define LUA_CSUBSEP		LUA_DIRSEP
+#endif
+
+#if !defined(LUA_LSUBSEP)
+#define LUA_LSUBSEP		LUA_DIRSEP
+#endif
+
+
+/* prefix for open functions in C libraries */
+#define LUA_POF		"luaopen_"
+
+/* separator for open functions in C libraries */
+#define LUA_OFSEP	"_"
+
+
+/*
+** unique key for table in the registry that keeps handles
+** for all loaded C libraries
+*/
+static const int CLIBS = 0;
+
+#define LIB_FAIL	"open"
+
+#define setprogdir(L)		((void)0)
+
+
+/*
+** system-dependent functions
+*/
+
+/*
+** unload library 'lib'
+*/
+static void lsys_unloadlib (void *lib);
+
+/*
+** load C library in file 'path'. If 'seeglb', load with all names in
+** the library global.
+** Returns the library; in case of error, returns NULL plus an
+** error string in the stack.
+*/
+static void *lsys_load (lua_State *L, const char *path, int seeglb);
+
+/*
+** Try to find a function named 'sym' in library 'lib'.
+** Returns the function; in case of error, returns NULL plus an
+** error string in the stack.
+*/
+static lua_CFunction lsys_sym (lua_State *L, void *lib, const char *sym);
+
+
+
+
+#if defined(LUA_USE_DLOPEN)	/* { */
+/*
+** {========================================================================
+** This is an implementation of loadlib based on the dlfcn interface.
+** The dlfcn interface is available in Linux, SunOS, Solaris, IRIX, FreeBSD,
+** NetBSD, AIX 4.2, HPUX 11, and  probably most other Unix flavors, at least
+** as an emulation layer on top of native functions.
+** =========================================================================
+*/
+
+#include <dlfcn.h>
+
+/*
+** Macro to convert pointer-to-void* to pointer-to-function. This cast
+** is undefined according to ISO C, but POSIX assumes that it works.
+** (The '__extension__' in gnu compilers is only to avoid warnings.)
+*/
+#if defined(__GNUC__)
+#define cast_func(p) (__extension__ (lua_CFunction)(p))
+#else
+#define cast_func(p) ((lua_CFunction)(p))
+#endif
+
+
+static void lsys_unloadlib (void *lib) {
+  dlclose(lib);
+}
+
+
+static void *lsys_load (lua_State *L, const char *path, int seeglb) {
+  void *lib = dlopen(path, RTLD_NOW | (seeglb ? RTLD_GLOBAL : RTLD_LOCAL));
+  if (lib == NULL) lua_pushstring(L, dlerror());
+  return lib;
+}
+
+
+static lua_CFunction lsys_sym (lua_State *L, void *lib, const char *sym) {
+  lua_CFunction f = cast_func(dlsym(lib, sym));
+  if (f == NULL) lua_pushstring(L, dlerror());
+  return f;
+}
+
+/* }====================================================== */
+
+
+
+#elif defined(LUA_DL_DLL)	/* }{ */
+/*
+** {======================================================================
+** This is an implementation of loadlib for Windows using native functions.
+** =======================================================================
+*/
+
+#include <windows.h>
+
+#undef setprogdir
+
+/*
+** optional flags for LoadLibraryEx
+*/
+#if !defined(LUA_LLE_FLAGS)
+#define LUA_LLE_FLAGS	0
+#endif
+
+
+static void setprogdir (lua_State *L) {
+  char buff[MAX_PATH + 1];
+  char *lb;
+  DWORD nsize = sizeof(buff)/sizeof(char);
+  DWORD n = GetModuleFileNameA(NULL, buff, nsize);
+  if (n == 0 || n == nsize || (lb = strrchr(buff, '\\')) == NULL)
+    luaL_error(L, "unable to get ModuleFileName");
+  else {
+    *lb = '\0';
+    luaL_gsub(L, lua_tostring(L, -1), LUA_EXEC_DIR, buff);
+    lua_remove(L, -2);  /* remove original string */
+  }
+}
+
+
+static void pusherror (lua_State *L) {
+  int error = GetLastError();
+  char buffer[128];
+  if (FormatMessageA(FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_FROM_SYSTEM,
+      NULL, error, 0, buffer, sizeof(buffer)/sizeof(char), NULL))
+    lua_pushstring(L, buffer);
+  else
+    lua_pushfstring(L, "system error %d\n", error);
+}
+
+static void lsys_unloadlib (void *lib) {
+  FreeLibrary((HMODULE)lib);
+}
+
+
+static void *lsys_load (lua_State *L, const char *path, int seeglb) {
+  HMODULE lib = LoadLibraryExA(path, NULL, LUA_LLE_FLAGS);
+  (void)(seeglb);  /* not used: symbols are 'global' by default */
+  if (lib == NULL) pusherror(L);
+  return lib;
+}
+
+
+static lua_CFunction lsys_sym (lua_State *L, void *lib, const char *sym) {
+  lua_CFunction f = (lua_CFunction)GetProcAddress((HMODULE)lib, sym);
+  if (f == NULL) pusherror(L);
+  return f;
+}
+
+/* }====================================================== */
+
+
+#else				/* }{ */
+/*
+** {======================================================
+** Fallback for other systems
+** =======================================================
+*/
+
+#undef LIB_FAIL
+#define LIB_FAIL	"absent"
+
+
+#define DLMSG	"dynamic libraries not enabled; check your Lua installation"
+
+
+static void lsys_unloadlib (void *lib) {
+  (void)(lib);  /* not used */
+}
+
+
+static void *lsys_load (lua_State *L, const char *path, int seeglb) {
+  (void)(path); (void)(seeglb);  /* not used */
+  lua_pushliteral(L, DLMSG);
+  return NULL;
+}
+
+
+static lua_CFunction lsys_sym (lua_State *L, void *lib, const char *sym) {
+  (void)(lib); (void)(sym);  /* not used */
+  lua_pushliteral(L, DLMSG);
+  return NULL;
+}
+
+/* }====================================================== */
+#endif				/* } */
+
+
+/*
+** return registry.CLIBS[path]
+*/
+static void *checkclib (lua_State *L, const char *path) {
+  void *plib;
+  lua_rawgetp(L, LUA_REGISTRYINDEX, &CLIBS);
+  lua_getfield(L, -1, path);
+  plib = lua_touserdata(L, -1);  /* plib = CLIBS[path] */
+  lua_pop(L, 2);  /* pop CLIBS table and 'plib' */
+  return plib;
+}
+
+
+/*
+** registry.CLIBS[path] = plib        -- for queries
+** registry.CLIBS[#CLIBS + 1] = plib  -- also keep a list of all libraries
+*/
+static void addtoclib (lua_State *L, const char *path, void *plib) {
+  lua_rawgetp(L, LUA_REGISTRYINDEX, &CLIBS);
+  lua_pushlightuserdata(L, plib);
+  lua_pushvalue(L, -1);
+  lua_setfield(L, -3, path);  /* CLIBS[path] = plib */
+  lua_rawseti(L, -2, luaL_len(L, -2) + 1);  /* CLIBS[#CLIBS + 1] = plib */
+  lua_pop(L, 1);  /* pop CLIBS table */
+}
+
+
+/*
+** __gc tag method for CLIBS table: calls 'lsys_unloadlib' for all lib
+** handles in list CLIBS
+*/
+static int gctm (lua_State *L) {
+  lua_Integer n = luaL_len(L, 1);
+  for (; n >= 1; n--) {  /* for each handle, in reverse order */
+    lua_rawgeti(L, 1, n);  /* get handle CLIBS[n] */
+    lsys_unloadlib(lua_touserdata(L, -1));
+    lua_pop(L, 1);  /* pop handle */
+  }
+  return 0;
+}
+
+
+
+/* error codes for 'lookforfunc' */
+#define ERRLIB		1
+#define ERRFUNC		2
+
+/*
+** Look for a C function named 'sym' in a dynamically loaded library
+** 'path'.
+** First, check whether the library is already loaded; if not, try
+** to load it.
+** Then, if 'sym' is '*', return true (as library has been loaded).
+** Otherwise, look for symbol 'sym' in the library and push a
+** C function with that symbol.
+** Return 0 and 'true' or a function in the stack; in case of
+** errors, return an error code and an error message in the stack.
+*/
+static int lookforfunc (lua_State *L, const char *path, const char *sym) {
+  void *reg = checkclib(L, path);  /* check loaded C libraries */
+  if (reg == NULL) {  /* must load library? */
+    reg = lsys_load(L, path, *sym == '*');  /* global symbols if 'sym'=='*' */
+    if (reg == NULL) return ERRLIB;  /* unable to load library */
+    addtoclib(L, path, reg);
+  }
+  if (*sym == '*') {  /* loading only library (no function)? */
+    lua_pushboolean(L, 1);  /* return 'true' */
+    return 0;  /* no errors */
+  }
+  else {
+    lua_CFunction f = lsys_sym(L, reg, sym);
+    if (f == NULL)
+      return ERRFUNC;  /* unable to find function */
+    lua_pushcfunction(L, f);  /* else create new function */
+    return 0;  /* no errors */
+  }
+}
+
+
+static int ll_loadlib (lua_State *L) {
+  const char *path = luaL_checkstring(L, 1);
+  const char *init = luaL_checkstring(L, 2);
+  int stat = lookforfunc(L, path, init);
+  if (stat == 0)  /* no errors? */
+    return 1;  /* return the loaded function */
+  else {  /* error; error message is on stack top */
+    lua_pushnil(L);
+    lua_insert(L, -2);
+    lua_pushstring(L, (stat == ERRLIB) ?  LIB_FAIL : "init");
+    return 3;  /* return nil, error message, and where */
+  }
+}
+
+
+
+/*
+** {======================================================
+** 'require' function
+** =======================================================
+*/
+
+
+static int readable (const char *filename) {
+  FILE *f = fopen(filename, "r");  /* try to open file */
+  if (f == NULL) return 0;  /* open failed */
+  fclose(f);
+  return 1;
+}
+
+
+static const char *pushnexttemplate (lua_State *L, const char *path) {
+  const char *l;
+  while (*path == *LUA_PATH_SEP) path++;  /* skip separators */
+  if (*path == '\0') return NULL;  /* no more templates */
+  l = strchr(path, *LUA_PATH_SEP);  /* find next separator */
+  if (l == NULL) l = path + strlen(path);
+  lua_pushlstring(L, path, l - path);  /* template */
+  return l;
+}
+
+
+static const char *searchpath (lua_State *L, const char *name,
+                                             const char *path,
+                                             const char *sep,
+                                             const char *dirsep) {
+  luaL_Buffer msg;  /* to build error message */
+  luaL_buffinit(L, &msg);
+  if (*sep != '\0')  /* non-empty separator? */
+    name = luaL_gsub(L, name, sep, dirsep);  /* replace it by 'dirsep' */
+  while ((path = pushnexttemplate(L, path)) != NULL) {
+    const char *filename = luaL_gsub(L, lua_tostring(L, -1),
+                                     LUA_PATH_MARK, name);
+    lua_remove(L, -2);  /* remove path template */
+    if (readable(filename))  /* does file exist and is readable? */
+      return filename;  /* return that file name */
+    lua_pushfstring(L, "\n\tno file '%s'", filename);
+    lua_remove(L, -2);  /* remove file name */
+    luaL_addvalue(&msg);  /* concatenate error msg. entry */
+  }
+  luaL_pushresult(&msg);  /* create error message */
+  return NULL;  /* not found */
+}
+
+
+static int ll_searchpath (lua_State *L) {
+  const char *f = searchpath(L, luaL_checkstring(L, 1),
+                                luaL_checkstring(L, 2),
+                                luaL_optstring(L, 3, "."),
+                                luaL_optstring(L, 4, LUA_DIRSEP));
+  if (f != NULL) return 1;
+  else {  /* error message is on top of the stack */
+    lua_pushnil(L);
+    lua_insert(L, -2);
+    return 2;  /* return nil + error message */
+  }
+}
+
+
+static const char *findfile (lua_State *L, const char *name,
+                                           const char *pname,
+                                           const char *dirsep) {
+  const char *path;
+  lua_getfield(L, lua_upvalueindex(1), pname);
+  path = lua_tostring(L, -1);
+  if (path == NULL)
+    luaL_error(L, "'package.%s' must be a string", pname);
+  return searchpath(L, name, path, ".", dirsep);
+}
+
+
+static int checkload (lua_State *L, int stat, const char *filename) {
+  if (stat) {  /* module loaded successfully? */
+    lua_pushstring(L, filename);  /* will be 2nd argument to module */
+    return 2;  /* return open function and file name */
+  }
+  else
+    return luaL_error(L, "error loading module '%s' from file '%s':\n\t%s",
+                          lua_tostring(L, 1), filename, lua_tostring(L, -1));
+}
+
+
+static int searcher_Lua (lua_State *L) {
+  const char *filename;
+  const char *name = luaL_checkstring(L, 1);
+  filename = findfile(L, name, "path", LUA_LSUBSEP);
+  if (filename == NULL) return 1;  /* module not found in this path */
+  return checkload(L, (luaL_loadfile(L, filename) == LUA_OK), filename);
+}
+
+
+/*
+** Try to find a load function for module 'modname' at file 'filename'.
+** First, change '.' to '_' in 'modname'; then, if 'modname' has
+** the form X-Y (that is, it has an "ignore mark"), build a function
+** name "luaopen_X" and look for it. (For compatibility, if that
+** fails, it also tries "luaopen_Y".) If there is no ignore mark,
+** look for a function named "luaopen_modname".
+*/
+static int loadfunc (lua_State *L, const char *filename, const char *modname) {
+  const char *openfunc;
+  const char *mark;
+  modname = luaL_gsub(L, modname, ".", LUA_OFSEP);
+  mark = strchr(modname, *LUA_IGMARK);
+  if (mark) {
+    int stat;
+    openfunc = lua_pushlstring(L, modname, mark - modname);
+    openfunc = lua_pushfstring(L, LUA_POF"%s", openfunc);
+    stat = lookforfunc(L, filename, openfunc);
+    if (stat != ERRFUNC) return stat;
+    modname = mark + 1;  /* else go ahead and try old-style name */
+  }
+  openfunc = lua_pushfstring(L, LUA_POF"%s", modname);
+  return lookforfunc(L, filename, openfunc);
+}
+
+
+static int searcher_C (lua_State *L) {
+  const char *name = luaL_checkstring(L, 1);
+  const char *filename = findfile(L, name, "cpath", LUA_CSUBSEP);
+  if (filename == NULL) return 1;  /* module not found in this path */
+  return checkload(L, (loadfunc(L, filename, name) == 0), filename);
+}
+
+
+static int searcher_Croot (lua_State *L) {
+  const char *filename;
+  const char *name = luaL_checkstring(L, 1);
+  const char *p = strchr(name, '.');
+  int stat;
+  if (p == NULL) return 0;  /* is root */
+  lua_pushlstring(L, name, p - name);
+  filename = findfile(L, lua_tostring(L, -1), "cpath", LUA_CSUBSEP);
+  if (filename == NULL) return 1;  /* root not found */
+  if ((stat = loadfunc(L, filename, name)) != 0) {
+    if (stat != ERRFUNC)
+      return checkload(L, 0, filename);  /* real error */
+    else {  /* open function not found */
+      lua_pushfstring(L, "\n\tno module '%s' in file '%s'", name, filename);
+      return 1;
+    }
+  }
+  lua_pushstring(L, filename);  /* will be 2nd argument to module */
+  return 2;
+}
+
+
+static int searcher_preload (lua_State *L) {
+  const char *name = luaL_checkstring(L, 1);
+  lua_getfield(L, LUA_REGISTRYINDEX, "_PRELOAD");
+  if (lua_getfield(L, -1, name) == LUA_TNIL)  /* not found? */
+    lua_pushfstring(L, "\n\tno field package.preload['%s']", name);
+  return 1;
+}
+
+
+static void findloader (lua_State *L, const char *name) {
+  int i;
+  luaL_Buffer msg;  /* to build error message */
+  luaL_buffinit(L, &msg);
+  /* push 'package.searchers' to index 3 in the stack */
+  if (lua_getfield(L, lua_upvalueindex(1), "searchers") != LUA_TTABLE)
+    luaL_error(L, "'package.searchers' must be a table");
+  /*  iterate over available searchers to find a loader */
+  for (i = 1; ; i++) {
+    if (lua_rawgeti(L, 3, i) == LUA_TNIL) {  /* no more searchers? */
+      lua_pop(L, 1);  /* remove nil */
+      luaL_pushresult(&msg);  /* create error message */
+      luaL_error(L, "module '%s' not found:%s", name, lua_tostring(L, -1));
+    }
+    lua_pushstring(L, name);
+    lua_call(L, 1, 2);  /* call it */
+    if (lua_isfunction(L, -2))  /* did it find a loader? */
+      return;  /* module loader found */
+    else if (lua_isstring(L, -2)) {  /* searcher returned error message? */
+      lua_pop(L, 1);  /* remove extra return */
+      luaL_addvalue(&msg);  /* concatenate error message */
+    }
+    else
+      lua_pop(L, 2);  /* remove both returns */
+  }
+}
+
+
+static int ll_require (lua_State *L) {
+  const char *name = luaL_checkstring(L, 1);
+  lua_settop(L, 1);  /* _LOADED table will be at index 2 */
+  lua_getfield(L, LUA_REGISTRYINDEX, "_LOADED");
+  lua_getfield(L, 2, name);  /* _LOADED[name] */
+  if (lua_toboolean(L, -1))  /* is it there? */
+    return 1;  /* package is already loaded */
+  /* else must load package */
+  lua_pop(L, 1);  /* remove 'getfield' result */
+  findloader(L, name);
+  lua_pushstring(L, name);  /* pass name as argument to module loader */
+  lua_insert(L, -2);  /* name is 1st argument (before search data) */
+  lua_call(L, 2, 1);  /* run loader to load module */
+  if (!lua_isnil(L, -1))  /* non-nil return? */
+    lua_setfield(L, 2, name);  /* _LOADED[name] = returned value */
+  if (lua_getfield(L, 2, name) == LUA_TNIL) {   /* module set no value? */
+    lua_pushboolean(L, 1);  /* use true as result */
+    lua_pushvalue(L, -1);  /* extra copy to be returned */
+    lua_setfield(L, 2, name);  /* _LOADED[name] = true */
+  }
+  return 1;
+}
+
+/* }====================================================== */
+
+
+
+/*
+** {======================================================
+** 'module' function
+** =======================================================
+*/
+#if defined(LUA_COMPAT_MODULE)
+
+/*
+** changes the environment variable of calling function
+*/
+static void set_env (lua_State *L) {
+  lua_Debug ar;
+  if (lua_getstack(L, 1, &ar) == 0 ||
+      lua_getinfo(L, "f", &ar) == 0 ||  /* get calling function */
+      lua_iscfunction(L, -1))
+    luaL_error(L, "'module' not called from a Lua function");
+  lua_pushvalue(L, -2);  /* copy new environment table to top */
+  lua_setupvalue(L, -2, 1);
+  lua_pop(L, 1);  /* remove function */
+}
+
+
+static void dooptions (lua_State *L, int n) {
+  int i;
+  for (i = 2; i <= n; i++) {
+    if (lua_isfunction(L, i)) {  /* avoid 'calling' extra info. */
+      lua_pushvalue(L, i);  /* get option (a function) */
+      lua_pushvalue(L, -2);  /* module */
+      lua_call(L, 1, 0);
+    }
+  }
+}
+
+
+static void modinit (lua_State *L, const char *modname) {
+  const char *dot;
+  lua_pushvalue(L, -1);
+  lua_setfield(L, -2, "_M");  /* module._M = module */
+  lua_pushstring(L, modname);
+  lua_setfield(L, -2, "_NAME");
+  dot = strrchr(modname, '.');  /* look for last dot in module name */
+  if (dot == NULL) dot = modname;
+  else dot++;
+  /* set _PACKAGE as package name (full module name minus last part) */
+  lua_pushlstring(L, modname, dot - modname);
+  lua_setfield(L, -2, "_PACKAGE");
+}
+
+
+static int ll_module (lua_State *L) {
+  const char *modname = luaL_checkstring(L, 1);
+  int lastarg = lua_gettop(L);  /* last parameter */
+  luaL_pushmodule(L, modname, 1);  /* get/create module table */
+  /* check whether table already has a _NAME field */
+  if (lua_getfield(L, -1, "_NAME") != LUA_TNIL)
+    lua_pop(L, 1);  /* table is an initialized module */
+  else {  /* no; initialize it */
+    lua_pop(L, 1);
+    modinit(L, modname);
+  }
+  lua_pushvalue(L, -1);
+  set_env(L);
+  dooptions(L, lastarg);
+  return 1;
+}
+
+
+static int ll_seeall (lua_State *L) {
+  luaL_checktype(L, 1, LUA_TTABLE);
+  if (!lua_getmetatable(L, 1)) {
+    lua_createtable(L, 0, 1); /* create new metatable */
+    lua_pushvalue(L, -1);
+    lua_setmetatable(L, 1);
+  }
+  lua_pushglobaltable(L);
+  lua_setfield(L, -2, "__index");  /* mt.__index = _G */
+  return 0;
+}
+
+#endif
+/* }====================================================== */
+
+
+
+/* auxiliary mark (for internal use) */
+#define AUXMARK		"\1"
+
+
+/*
+** return registry.LUA_NOENV as a boolean
+*/
+static int noenv (lua_State *L) {
+  int b;
+  lua_getfield(L, LUA_REGISTRYINDEX, "LUA_NOENV");
+  b = lua_toboolean(L, -1);
+  lua_pop(L, 1);  /* remove value */
+  return b;
+}
+
+
+static void setpath (lua_State *L, const char *fieldname, const char *envname1,
+                                   const char *envname2, const char *def) {
+  const char *path = getenv(envname1);
+  if (path == NULL)  /* no environment variable? */
+    path = getenv(envname2);  /* try alternative name */
+  if (path == NULL || noenv(L))  /* no environment variable? */
+    lua_pushstring(L, def);  /* use default */
+  else {
+    /* replace ";;" by ";AUXMARK;" and then AUXMARK by default path */
+    path = luaL_gsub(L, path, LUA_PATH_SEP LUA_PATH_SEP,
+                              LUA_PATH_SEP AUXMARK LUA_PATH_SEP);
+    luaL_gsub(L, path, AUXMARK, def);
+    lua_remove(L, -2);
+  }
+  setprogdir(L);
+  lua_setfield(L, -2, fieldname);
+}
+
+
+static const luaL_Reg pk_funcs[] = {
+  {"loadlib", ll_loadlib},
+  {"searchpath", ll_searchpath},
+#if defined(LUA_COMPAT_MODULE)
+  {"seeall", ll_seeall},
+#endif
+  /* placeholders */
+  {"preload", NULL},
+  {"cpath", NULL},
+  {"path", NULL},
+  {"searchers", NULL},
+  {"loaded", NULL},
+  {NULL, NULL}
+};
+
+
+static const luaL_Reg ll_funcs[] = {
+#if defined(LUA_COMPAT_MODULE)
+  {"module", ll_module},
+#endif
+  {"require", ll_require},
+  {NULL, NULL}
+};
+
+
+static void createsearcherstable (lua_State *L) {
+  static const lua_CFunction searchers[] =
+    {searcher_preload, searcher_Lua, searcher_C, searcher_Croot, NULL};
+  int i;
+  /* create 'searchers' table */
+  lua_createtable(L, sizeof(searchers)/sizeof(searchers[0]) - 1, 0);
+  /* fill it with predefined searchers */
+  for (i=0; searchers[i] != NULL; i++) {
+    lua_pushvalue(L, -2);  /* set 'package' as upvalue for all searchers */
+    lua_pushcclosure(L, searchers[i], 1);
+    lua_rawseti(L, -2, i+1);
+  }
+#if defined(LUA_COMPAT_LOADERS)
+  lua_pushvalue(L, -1);  /* make a copy of 'searchers' table */
+  lua_setfield(L, -3, "loaders");  /* put it in field 'loaders' */
+#endif
+  lua_setfield(L, -2, "searchers");  /* put it in field 'searchers' */
+}
+
+
+/*
+** create table CLIBS to keep track of loaded C libraries,
+** setting a finalizer to close all libraries when closing state.
+*/
+static void createclibstable (lua_State *L) {
+  lua_newtable(L);  /* create CLIBS table */
+  lua_createtable(L, 0, 1);  /* create metatable for CLIBS */
+  lua_pushcfunction(L, gctm);
+  lua_setfield(L, -2, "__gc");  /* set finalizer for CLIBS table */
+  lua_setmetatable(L, -2);
+  lua_rawsetp(L, LUA_REGISTRYINDEX, &CLIBS);  /* set CLIBS table in registry */
+}
+
+
+LUAMOD_API int luaopen_package (lua_State *L) {
+  createclibstable(L);
+  luaL_newlib(L, pk_funcs);  /* create 'package' table */
+  createsearcherstable(L);
+  /* set field 'path' */
+  setpath(L, "path", LUA_PATHVARVERSION, LUA_PATH_VAR, LUA_PATH_DEFAULT);
+  /* set field 'cpath' */
+  setpath(L, "cpath", LUA_CPATHVARVERSION, LUA_CPATH_VAR, LUA_CPATH_DEFAULT);
+  /* store config information */
+  lua_pushliteral(L, LUA_DIRSEP "\n" LUA_PATH_SEP "\n" LUA_PATH_MARK "\n"
+                     LUA_EXEC_DIR "\n" LUA_IGMARK "\n");
+  lua_setfield(L, -2, "config");
+  /* set field 'loaded' */
+  luaL_getsubtable(L, LUA_REGISTRYINDEX, "_LOADED");
+  lua_setfield(L, -2, "loaded");
+  /* set field 'preload' */
+  luaL_getsubtable(L, LUA_REGISTRYINDEX, "_PRELOAD");
+  lua_setfield(L, -2, "preload");
+  lua_pushglobaltable(L);
+  lua_pushvalue(L, -2);  /* set 'package' as upvalue for next lib */
+  luaL_setfuncs(L, ll_funcs, 1);  /* open lib into global table */
+  lua_pop(L, 1);  /* pop global table */
+  return 1;  /* return 'package' table */
+}
+
diff --git a/libs/lua/lua-5.3.3/lobject.c b/libs/lua/lua-5.3.3/lobject.c
new file mode 100644
index 0000000..9fe441f
--- /dev/null
+++ b/libs/lua/lua-5.3.3/lobject.c
@@ -0,0 +1,521 @@
+/*
+** $Id: lobject.c,v 2.111 2016/05/20 14:07:48 roberto Exp $
+** Some generic functions over Lua objects
+** See Copyright Notice in lua.h
+*/
+
+#define lobject_c
+#define LUA_CORE
+
+#include "lprefix.h"
+
+
+#include <locale.h>
+#include <math.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "lua.h"
+
+#include "lctype.h"
+#include "ldebug.h"
+#include "ldo.h"
+#include "lmem.h"
+#include "lobject.h"
+#include "lstate.h"
+#include "lstring.h"
+#include "lvm.h"
+
+
+
+LUAI_DDEF const TValue luaO_nilobject_ = {NILCONSTANT};
+
+
+/*
+** converts an integer to a "floating point byte", represented as
+** (eeeeexxx), where the real value is (1xxx) * 2^(eeeee - 1) if
+** eeeee != 0 and (xxx) otherwise.
+*/
+int luaO_int2fb (unsigned int x) {
+  int e = 0;  /* exponent */
+  if (x < 8) return x;
+  while (x >= (8 << 4)) {  /* coarse steps */
+    x = (x + 0xf) >> 4;  /* x = ceil(x / 16) */
+    e += 4;
+  }
+  while (x >= (8 << 1)) {  /* fine steps */
+    x = (x + 1) >> 1;  /* x = ceil(x / 2) */
+    e++;
+  }
+  return ((e+1) << 3) | (cast_int(x) - 8);
+}
+
+
+/* converts back */
+int luaO_fb2int (int x) {
+  return (x < 8) ? x : ((x & 7) + 8) << ((x >> 3) - 1);
+}
+
+
+/*
+** Computes ceil(log2(x))
+*/
+int luaO_ceillog2 (unsigned int x) {
+  static const lu_byte log_2[256] = {  /* log_2[i] = ceil(log2(i - 1)) */
+    0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+    6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
+    7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
+    7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
+    8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
+    8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
+    8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
+    8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8
+  };
+  int l = 0;
+  x--;
+  while (x >= 256) { l += 8; x >>= 8; }
+  return l + log_2[x];
+}
+
+
+static lua_Integer intarith (lua_State *L, int op, lua_Integer v1,
+                                                   lua_Integer v2) {
+  switch (op) {
+    case LUA_OPADD: return intop(+, v1, v2);
+    case LUA_OPSUB:return intop(-, v1, v2);
+    case LUA_OPMUL:return intop(*, v1, v2);
+    case LUA_OPMOD: return luaV_mod(L, v1, v2);
+    case LUA_OPIDIV: return luaV_div(L, v1, v2);
+    case LUA_OPBAND: return intop(&, v1, v2);
+    case LUA_OPBOR: return intop(|, v1, v2);
+    case LUA_OPBXOR: return intop(^, v1, v2);
+    case LUA_OPSHL: return luaV_shiftl(v1, v2);
+    case LUA_OPSHR: return luaV_shiftl(v1, -v2);
+    case LUA_OPUNM: return intop(-, 0, v1);
+    case LUA_OPBNOT: return intop(^, ~l_castS2U(0), v1);
+    default: lua_assert(0); return 0;
+  }
+}
+
+
+static lua_Number numarith (lua_State *L, int op, lua_Number v1,
+                                                  lua_Number v2) {
+  switch (op) {
+    case LUA_OPADD: return luai_numadd(L, v1, v2);
+    case LUA_OPSUB: return luai_numsub(L, v1, v2);
+    case LUA_OPMUL: return luai_nummul(L, v1, v2);
+    case LUA_OPDIV: return luai_numdiv(L, v1, v2);
+    case LUA_OPPOW: return luai_numpow(L, v1, v2);
+    case LUA_OPIDIV: return luai_numidiv(L, v1, v2);
+    case LUA_OPUNM: return luai_numunm(L, v1);
+    case LUA_OPMOD: {
+      lua_Number m;
+      luai_nummod(L, v1, v2, m);
+      return m;
+    }
+    default: lua_assert(0); return 0;
+  }
+}
+
+
+void luaO_arith (lua_State *L, int op, const TValue *p1, const TValue *p2,
+                 TValue *res) {
+  switch (op) {
+    case LUA_OPBAND: case LUA_OPBOR: case LUA_OPBXOR:
+    case LUA_OPSHL: case LUA_OPSHR:
+    case LUA_OPBNOT: {  /* operate only on integers */
+      lua_Integer i1; lua_Integer i2;
+      if (tointeger(p1, &i1) && tointeger(p2, &i2)) {
+        setivalue(res, intarith(L, op, i1, i2));
+        return;
+      }
+      else break;  /* go to the end */
+    }
+    case LUA_OPDIV: case LUA_OPPOW: {  /* operate only on floats */
+      lua_Number n1; lua_Number n2;
+      if (tonumber(p1, &n1) && tonumber(p2, &n2)) {
+        setfltvalue(res, numarith(L, op, n1, n2));
+        return;
+      }
+      else break;  /* go to the end */
+    }
+    default: {  /* other operations */
+      lua_Number n1; lua_Number n2;
+      if (ttisinteger(p1) && ttisinteger(p2)) {
+        setivalue(res, intarith(L, op, ivalue(p1), ivalue(p2)));
+        return;
+      }
+      else if (tonumber(p1, &n1) && tonumber(p2, &n2)) {
+        setfltvalue(res, numarith(L, op, n1, n2));
+        return;
+      }
+      else break;  /* go to the end */
+    }
+  }
+  /* could not perform raw operation; try metamethod */
+  lua_assert(L != NULL);  /* should not fail when folding (compile time) */
+  luaT_trybinTM(L, p1, p2, res, cast(TMS, (op - LUA_OPADD) + TM_ADD));
+}
+
+
+int luaO_hexavalue (int c) {
+  if (lisdigit(c)) return c - '0';
+  else return (ltolower(c) - 'a') + 10;
+}
+
+
+static int isneg (const char **s) {
+  if (**s == '-') { (*s)++; return 1; }
+  else if (**s == '+') (*s)++;
+  return 0;
+}
+
+
+
+/*
+** {==================================================================
+** Lua's implementation for 'lua_strx2number'
+** ===================================================================
+*/
+
+#if !defined(lua_strx2number)
+
+/* maximum number of significant digits to read (to avoid overflows
+   even with single floats) */
+#define MAXSIGDIG	30
+
+/*
+** convert an hexadecimal numeric string to a number, following
+** C99 specification for 'strtod'
+*/
+static lua_Number lua_strx2number (const char *s, char **endptr) {
+  int dot = lua_getlocaledecpoint();
+  lua_Number r = 0.0;  /* result (accumulator) */
+  int sigdig = 0;  /* number of significant digits */
+  int nosigdig = 0;  /* number of non-significant digits */
+  int e = 0;  /* exponent correction */
+  int neg;  /* 1 if number is negative */
+  int hasdot = 0;  /* true after seen a dot */
+  *endptr = cast(char *, s);  /* nothing is valid yet */
+  while (lisspace(cast_uchar(*s))) s++;  /* skip initial spaces */
+  neg = isneg(&s);  /* check signal */
+  if (!(*s == '0' && (*(s + 1) == 'x' || *(s + 1) == 'X')))  /* check '0x' */
+    return 0.0;  /* invalid format (no '0x') */
+  for (s += 2; ; s++) {  /* skip '0x' and read numeral */
+    if (*s == dot) {
+      if (hasdot) break;  /* second dot? stop loop */
+      else hasdot = 1;
+    }
+    else if (lisxdigit(cast_uchar(*s))) {
+      if (sigdig == 0 && *s == '0')  /* non-significant digit (zero)? */
+        nosigdig++;
+      else if (++sigdig <= MAXSIGDIG)  /* can read it without overflow? */
+          r = (r * cast_num(16.0)) + luaO_hexavalue(*s);
+      else e++; /* too many digits; ignore, but still count for exponent */
+      if (hasdot) e--;  /* decimal digit? correct exponent */
+    }
+    else break;  /* neither a dot nor a digit */
+  }
+  if (nosigdig + sigdig == 0)  /* no digits? */
+    return 0.0;  /* invalid format */
+  *endptr = cast(char *, s);  /* valid up to here */
+  e *= 4;  /* each digit multiplies/divides value by 2^4 */
+  if (*s == 'p' || *s == 'P') {  /* exponent part? */
+    int exp1 = 0;  /* exponent value */
+    int neg1;  /* exponent signal */
+    s++;  /* skip 'p' */
+    neg1 = isneg(&s);  /* signal */
+    if (!lisdigit(cast_uchar(*s)))
+      return 0.0;  /* invalid; must have at least one digit */
+    while (lisdigit(cast_uchar(*s)))  /* read exponent */
+      exp1 = exp1 * 10 + *(s++) - '0';
+    if (neg1) exp1 = -exp1;
+    e += exp1;
+    *endptr = cast(char *, s);  /* valid up to here */
+  }
+  if (neg) r = -r;
+  return l_mathop(ldexp)(r, e);
+}
+
+#endif
+/* }====================================================== */
+
+
+/* maximum length of a numeral */
+#if !defined (L_MAXLENNUM)
+#define L_MAXLENNUM	200
+#endif
+
+static const char *l_str2dloc (const char *s, lua_Number *result, int mode) {
+  char *endptr;
+  *result = (mode == 'x') ? lua_strx2number(s, &endptr)  /* try to convert */
+                          : lua_str2number(s, &endptr);
+  if (endptr == s) return NULL;  /* nothing recognized? */
+  while (lisspace(cast_uchar(*endptr))) endptr++;  /* skip trailing spaces */
+  return (*endptr == '\0') ? endptr : NULL;  /* OK if no trailing characters */
+}
+
+
+/*
+** Convert string 's' to a Lua number (put in 'result'). Return NULL
+** on fail or the address of the ending '\0' on success.
+** 'pmode' points to (and 'mode' contains) special things in the string:
+** - 'x'/'X' means an hexadecimal numeral
+** - 'n'/'N' means 'inf' or 'nan' (which should be rejected)
+** - '.' just optimizes the search for the common case (nothing special)
+** This function accepts both the current locale or a dot as the radix
+** mark. If the convertion fails, it may mean number has a dot but
+** locale accepts something else. In that case, the code copies 's'
+** to a buffer (because 's' is read-only), changes the dot to the
+** current locale radix mark, and tries to convert again.
+*/
+static const char *l_str2d (const char *s, lua_Number *result) {
+  const char *endptr;
+  const char *pmode = strpbrk(s, ".xXnN");
+  int mode = pmode ? ltolower(cast_uchar(*pmode)) : 0;
+  if (mode == 'n')  /* reject 'inf' and 'nan' */
+    return NULL;
+  endptr = l_str2dloc(s, result, mode);  /* try to convert */
+  if (endptr == NULL) {  /* failed? may be a different locale */
+    char buff[L_MAXLENNUM + 1];
+    const char *pdot = strchr(s, '.');
+    if (strlen(s) > L_MAXLENNUM || pdot == NULL)
+      return NULL;  /* string too long or no dot; fail */
+    strcpy(buff, s);  /* copy string to buffer */
+    buff[pdot - s] = lua_getlocaledecpoint();  /* correct decimal point */
+    endptr = l_str2dloc(buff, result, mode);  /* try again */
+    if (endptr != NULL)
+      endptr = s + (endptr - buff);  /* make relative to 's' */
+  }
+  return endptr;
+}
+
+
+#define MAXBY10		cast(lua_Unsigned, LUA_MAXINTEGER / 10)
+#define MAXLASTD	cast_int(LUA_MAXINTEGER % 10)
+
+static const char *l_str2int (const char *s, lua_Integer *result) {
+  lua_Unsigned a = 0;
+  int empty = 1;
+  int neg;
+  while (lisspace(cast_uchar(*s))) s++;  /* skip initial spaces */
+  neg = isneg(&s);
+  if (s[0] == '0' &&
+      (s[1] == 'x' || s[1] == 'X')) {  /* hex? */
+    s += 2;  /* skip '0x' */
+    for (; lisxdigit(cast_uchar(*s)); s++) {
+      a = a * 16 + luaO_hexavalue(*s);
+      empty = 0;
+    }
+  }
+  else {  /* decimal */
+    for (; lisdigit(cast_uchar(*s)); s++) {
+      int d = *s - '0';
+      if (a >= MAXBY10 && (a > MAXBY10 || d > MAXLASTD + neg))  /* overflow? */
+        return NULL;  /* do not accept it (as integer) */
+      a = a * 10 + d;
+      empty = 0;
+    }
+  }
+  while (lisspace(cast_uchar(*s))) s++;  /* skip trailing spaces */
+  if (empty || *s != '\0') return NULL;  /* something wrong in the numeral */
+  else {
+    *result = l_castU2S((neg) ? 0u - a : a);
+    return s;
+  }
+}
+
+
+size_t luaO_str2num (const char *s, TValue *o) {
+  lua_Integer i; lua_Number n;
+  const char *e;
+  if ((e = l_str2int(s, &i)) != NULL) {  /* try as an integer */
+    setivalue(o, i);
+  }
+  else if ((e = l_str2d(s, &n)) != NULL) {  /* else try as a float */
+    setfltvalue(o, n);
+  }
+  else
+    return 0;  /* conversion failed */
+  return (e - s) + 1;  /* success; return string size */
+}
+
+
+int luaO_utf8esc (char *buff, unsigned long x) {
+  int n = 1;  /* number of bytes put in buffer (backwards) */
+  lua_assert(x <= 0x10FFFF);
+  if (x < 0x80)  /* ascii? */
+    buff[UTF8BUFFSZ - 1] = cast(char, x);
+  else {  /* need continuation bytes */
+    unsigned int mfb = 0x3f;  /* maximum that fits in first byte */
+    do {  /* add continuation bytes */
+      buff[UTF8BUFFSZ - (n++)] = cast(char, 0x80 | (x & 0x3f));
+      x >>= 6;  /* remove added bits */
+      mfb >>= 1;  /* now there is one less bit available in first byte */
+    } while (x > mfb);  /* still needs continuation byte? */
+    buff[UTF8BUFFSZ - n] = cast(char, (~mfb << 1) | x);  /* add first byte */
+  }
+  return n;
+}
+
+
+/* maximum length of the conversion of a number to a string */
+#define MAXNUMBER2STR	50
+
+
+/*
+** Convert a number object to a string
+*/
+void luaO_tostring (lua_State *L, StkId obj) {
+  char buff[MAXNUMBER2STR];
+  size_t len;
+  lua_assert(ttisnumber(obj));
+  if (ttisinteger(obj))
+    len = lua_integer2str(buff, sizeof(buff), ivalue(obj));
+  else {
+    len = lua_number2str(buff, sizeof(buff), fltvalue(obj));
+#if !defined(LUA_COMPAT_FLOATSTRING)
+    if (buff[strspn(buff, "-0123456789")] == '\0') {  /* looks like an int? */
+      buff[len++] = lua_getlocaledecpoint();
+      buff[len++] = '0';  /* adds '.0' to result */
+    }
+#endif
+  }
+  setsvalue2s(L, obj, luaS_newlstr(L, buff, len));
+}
+
+
+static void pushstr (lua_State *L, const char *str, size_t l) {
+  setsvalue2s(L, L->top, luaS_newlstr(L, str, l));
+  luaD_inctop(L);
+}
+
+
+/*
+** this function handles only '%d', '%c', '%f', '%p', and '%s' 
+   conventional formats, plus Lua-specific '%I' and '%U'
+*/
+const char *luaO_pushvfstring (lua_State *L, const char *fmt, va_list argp) {
+  int n = 0;
+  for (;;) {
+    const char *e = strchr(fmt, '%');
+    if (e == NULL) break;
+    pushstr(L, fmt, e - fmt);
+    switch (*(e+1)) {
+      case 's': {  /* zero-terminated string */
+        const char *s = va_arg(argp, char *);
+        if (s == NULL) s = "(null)";
+        pushstr(L, s, strlen(s));
+        break;
+      }
+      case 'c': {  /* an 'int' as a character */
+        char buff = cast(char, va_arg(argp, int));
+        if (lisprint(cast_uchar(buff)))
+          pushstr(L, &buff, 1);
+        else  /* non-printable character; print its code */
+          luaO_pushfstring(L, "<\\%d>", cast_uchar(buff));
+        break;
+      }
+      case 'd': {  /* an 'int' */
+        setivalue(L->top, va_arg(argp, int));
+        goto top2str;
+      }
+      case 'I': {  /* a 'lua_Integer' */
+        setivalue(L->top, cast(lua_Integer, va_arg(argp, l_uacInt)));
+        goto top2str;
+      }
+      case 'f': {  /* a 'lua_Number' */
+        setfltvalue(L->top, cast_num(va_arg(argp, l_uacNumber)));
+      top2str:  /* convert the top element to a string */
+        luaD_inctop(L);
+        luaO_tostring(L, L->top - 1);
+        break;
+      }
+      case 'p': {  /* a pointer */
+        char buff[4*sizeof(void *) + 8]; /* should be enough space for a '%p' */
+        int l = l_sprintf(buff, sizeof(buff), "%p", va_arg(argp, void *));
+        pushstr(L, buff, l);
+        break;
+      }
+      case 'U': {  /* an 'int' as a UTF-8 sequence */
+        char buff[UTF8BUFFSZ];
+        int l = luaO_utf8esc(buff, cast(long, va_arg(argp, long)));
+        pushstr(L, buff + UTF8BUFFSZ - l, l);
+        break;
+      }
+      case '%': {
+        pushstr(L, "%", 1);
+        break;
+      }
+      default: {
+        luaG_runerror(L, "invalid option '%%%c' to 'lua_pushfstring'",
+                         *(e + 1));
+      }
+    }
+    n += 2;
+    fmt = e+2;
+  }
+  luaD_checkstack(L, 1);
+  pushstr(L, fmt, strlen(fmt));
+  if (n > 0) luaV_concat(L, n + 1);
+  return svalue(L->top - 1);
+}
+
+
+const char *luaO_pushfstring (lua_State *L, const char *fmt, ...) {
+  const char *msg;
+  va_list argp;
+  va_start(argp, fmt);
+  msg = luaO_pushvfstring(L, fmt, argp);
+  va_end(argp);
+  return msg;
+}
+
+
+/* number of chars of a literal string without the ending \0 */
+#define LL(x)	(sizeof(x)/sizeof(char) - 1)
+
+#define RETS	"..."
+#define PRE	"[string \""
+#define POS	"\"]"
+
+#define addstr(a,b,l)	( memcpy(a,b,(l) * sizeof(char)), a += (l) )
+
+void luaO_chunkid (char *out, const char *source, size_t bufflen) {
+  size_t l = strlen(source);
+  if (*source == '=') {  /* 'literal' source */
+    if (l <= bufflen)  /* small enough? */
+      memcpy(out, source + 1, l * sizeof(char));
+    else {  /* truncate it */
+      addstr(out, source + 1, bufflen - 1);
+      *out = '\0';
+    }
+  }
+  else if (*source == '@') {  /* file name */
+    if (l <= bufflen)  /* small enough? */
+      memcpy(out, source + 1, l * sizeof(char));
+    else {  /* add '...' before rest of name */
+      addstr(out, RETS, LL(RETS));
+      bufflen -= LL(RETS);
+      memcpy(out, source + 1 + l - bufflen, bufflen * sizeof(char));
+    }
+  }
+  else {  /* string; format as [string "source"] */
+    const char *nl = strchr(source, '\n');  /* find first new line (if any) */
+    addstr(out, PRE, LL(PRE));  /* add prefix */
+    bufflen -= LL(PRE RETS POS) + 1;  /* save space for prefix+suffix+'\0' */
+    if (l < bufflen && nl == NULL) {  /* small one-line source? */
+      addstr(out, source, l);  /* keep it */
+    }
+    else {
+      if (nl != NULL) l = nl - source;  /* stop at first newline */
+      if (l > bufflen) l = bufflen;
+      addstr(out, source, l);
+      addstr(out, RETS, LL(RETS));
+    }
+    memcpy(out, POS, (LL(POS) + 1) * sizeof(char));
+  }
+}
+
diff --git a/libs/lua/lua-5.3.3/lobject.h b/libs/lua/lua-5.3.3/lobject.h
new file mode 100644
index 0000000..2d52b41
--- /dev/null
+++ b/libs/lua/lua-5.3.3/lobject.h
@@ -0,0 +1,549 @@
+/*
+** $Id: lobject.h,v 2.116 2015/11/03 18:33:10 roberto Exp $
+** Type definitions for Lua objects
+** See Copyright Notice in lua.h
+*/
+
+
+#ifndef lobject_h
+#define lobject_h
+
+
+#include <stdarg.h>
+
+
+#include "llimits.h"
+#include "lua.h"
+
+
+/*
+** Extra tags for non-values
+*/
+#define LUA_TPROTO	LUA_NUMTAGS		/* function prototypes */
+#define LUA_TDEADKEY	(LUA_NUMTAGS+1)		/* removed keys in tables */
+
+/*
+** number of all possible tags (including LUA_TNONE but excluding DEADKEY)
+*/
+#define LUA_TOTALTAGS	(LUA_TPROTO + 2)
+
+
+/*
+** tags for Tagged Values have the following use of bits:
+** bits 0-3: actual tag (a LUA_T* value)
+** bits 4-5: variant bits
+** bit 6: whether value is collectable
+*/
+
+
+/*
+** LUA_TFUNCTION variants:
+** 0 - Lua function
+** 1 - light C function
+** 2 - regular C function (closure)
+*/
+
+/* Variant tags for functions */
+#define LUA_TLCL	(LUA_TFUNCTION | (0 << 4))  /* Lua closure */
+#define LUA_TLCF	(LUA_TFUNCTION | (1 << 4))  /* light C function */
+#define LUA_TCCL	(LUA_TFUNCTION | (2 << 4))  /* C closure */
+
+
+/* Variant tags for strings */
+#define LUA_TSHRSTR	(LUA_TSTRING | (0 << 4))  /* short strings */
+#define LUA_TLNGSTR	(LUA_TSTRING | (1 << 4))  /* long strings */
+
+
+/* Variant tags for numbers */
+#define LUA_TNUMFLT	(LUA_TNUMBER | (0 << 4))  /* float numbers */
+#define LUA_TNUMINT	(LUA_TNUMBER | (1 << 4))  /* integer numbers */
+
+
+/* Bit mark for collectable types */
+#define BIT_ISCOLLECTABLE	(1 << 6)
+
+/* mark a tag as collectable */
+#define ctb(t)			((t) | BIT_ISCOLLECTABLE)
+
+
+/*
+** Common type for all collectable objects
+*/
+typedef struct GCObject GCObject;
+
+
+/*
+** Common Header for all collectable objects (in macro form, to be
+** included in other objects)
+*/
+#define CommonHeader	GCObject *next; lu_byte tt; lu_byte marked
+
+
+/*
+** Common type has only the common header
+*/
+struct GCObject {
+  CommonHeader;
+};
+
+
+
+
+/*
+** Tagged Values. This is the basic representation of values in Lua,
+** an actual value plus a tag with its type.
+*/
+
+/*
+** Union of all Lua values
+*/
+typedef union Value {
+  GCObject *gc;    /* collectable objects */
+  void *p;         /* light userdata */
+  int b;           /* booleans */
+  lua_CFunction f; /* light C functions */
+  lua_Integer i;   /* integer numbers */
+  lua_Number n;    /* float numbers */
+} Value;
+
+
+#define TValuefields	Value value_; int tt_
+
+
+typedef struct lua_TValue {
+  TValuefields;
+} TValue;
+
+
+
+/* macro defining a nil value */
+#define NILCONSTANT	{NULL}, LUA_TNIL
+
+
+#define val_(o)		((o)->value_)
+
+
+/* raw type tag of a TValue */
+#define rttype(o)	((o)->tt_)
+
+/* tag with no variants (bits 0-3) */
+#define novariant(x)	((x) & 0x0F)
+
+/* type tag of a TValue (bits 0-3 for tags + variant bits 4-5) */
+#define ttype(o)	(rttype(o) & 0x3F)
+
+/* type tag of a TValue with no variants (bits 0-3) */
+#define ttnov(o)	(novariant(rttype(o)))
+
+
+/* Macros to test type */
+#define checktag(o,t)		(rttype(o) == (t))
+#define checktype(o,t)		(ttnov(o) == (t))
+#define ttisnumber(o)		checktype((o), LUA_TNUMBER)
+#define ttisfloat(o)		checktag((o), LUA_TNUMFLT)
+#define ttisinteger(o)		checktag((o), LUA_TNUMINT)
+#define ttisnil(o)		checktag((o), LUA_TNIL)
+#define ttisboolean(o)		checktag((o), LUA_TBOOLEAN)
+#define ttislightuserdata(o)	checktag((o), LUA_TLIGHTUSERDATA)
+#define ttisstring(o)		checktype((o), LUA_TSTRING)
+#define ttisshrstring(o)	checktag((o), ctb(LUA_TSHRSTR))
+#define ttislngstring(o)	checktag((o), ctb(LUA_TLNGSTR))
+#define ttistable(o)		checktag((o), ctb(LUA_TTABLE))
+#define ttisfunction(o)		checktype(o, LUA_TFUNCTION)
+#define ttisclosure(o)		((rttype(o) & 0x1F) == LUA_TFUNCTION)
+#define ttisCclosure(o)		checktag((o), ctb(LUA_TCCL))
+#define ttisLclosure(o)		checktag((o), ctb(LUA_TLCL))
+#define ttislcf(o)		checktag((o), LUA_TLCF)
+#define ttisfulluserdata(o)	checktag((o), ctb(LUA_TUSERDATA))
+#define ttisthread(o)		checktag((o), ctb(LUA_TTHREAD))
+#define ttisdeadkey(o)		checktag((o), LUA_TDEADKEY)
+
+
+/* Macros to access values */
+#define ivalue(o)	check_exp(ttisinteger(o), val_(o).i)
+#define fltvalue(o)	check_exp(ttisfloat(o), val_(o).n)
+#define nvalue(o)	check_exp(ttisnumber(o), \
+	(ttisinteger(o) ? cast_num(ivalue(o)) : fltvalue(o)))
+#define gcvalue(o)	check_exp(iscollectable(o), val_(o).gc)
+#define pvalue(o)	check_exp(ttislightuserdata(o), val_(o).p)
+#define tsvalue(o)	check_exp(ttisstring(o), gco2ts(val_(o).gc))
+#define uvalue(o)	check_exp(ttisfulluserdata(o), gco2u(val_(o).gc))
+#define clvalue(o)	check_exp(ttisclosure(o), gco2cl(val_(o).gc))
+#define clLvalue(o)	check_exp(ttisLclosure(o), gco2lcl(val_(o).gc))
+#define clCvalue(o)	check_exp(ttisCclosure(o), gco2ccl(val_(o).gc))
+#define fvalue(o)	check_exp(ttislcf(o), val_(o).f)
+#define hvalue(o)	check_exp(ttistable(o), gco2t(val_(o).gc))
+#define bvalue(o)	check_exp(ttisboolean(o), val_(o).b)
+#define thvalue(o)	check_exp(ttisthread(o), gco2th(val_(o).gc))
+/* a dead value may get the 'gc' field, but cannot access its contents */
+#define deadvalue(o)	check_exp(ttisdeadkey(o), cast(void *, val_(o).gc))
+
+#define l_isfalse(o)	(ttisnil(o) || (ttisboolean(o) && bvalue(o) == 0))
+
+
+#define iscollectable(o)	(rttype(o) & BIT_ISCOLLECTABLE)
+
+
+/* Macros for internal tests */
+#define righttt(obj)		(ttype(obj) == gcvalue(obj)->tt)
+
+#define checkliveness(L,obj) \
+	lua_longassert(!iscollectable(obj) || \
+		(righttt(obj) && (L == NULL || !isdead(G(L),gcvalue(obj)))))
+
+
+/* Macros to set values */
+#define settt_(o,t)	((o)->tt_=(t))
+
+#define setfltvalue(obj,x) \
+  { TValue *io=(obj); val_(io).n=(x); settt_(io, LUA_TNUMFLT); }
+
+#define chgfltvalue(obj,x) \
+  { TValue *io=(obj); lua_assert(ttisfloat(io)); val_(io).n=(x); }
+
+#define setivalue(obj,x) \
+  { TValue *io=(obj); val_(io).i=(x); settt_(io, LUA_TNUMINT); }
+
+#define chgivalue(obj,x) \
+  { TValue *io=(obj); lua_assert(ttisinteger(io)); val_(io).i=(x); }
+
+#define setnilvalue(obj) settt_(obj, LUA_TNIL)
+
+#define setfvalue(obj,x) \
+  { TValue *io=(obj); val_(io).f=(x); settt_(io, LUA_TLCF); }
+
+#define setpvalue(obj,x) \
+  { TValue *io=(obj); val_(io).p=(x); settt_(io, LUA_TLIGHTUSERDATA); }
+
+#define setbvalue(obj,x) \
+  { TValue *io=(obj); val_(io).b=(x); settt_(io, LUA_TBOOLEAN); }
+
+#define setgcovalue(L,obj,x) \
+  { TValue *io = (obj); GCObject *i_g=(x); \
+    val_(io).gc = i_g; settt_(io, ctb(i_g->tt)); }
+
+#define setsvalue(L,obj,x) \
+  { TValue *io = (obj); TString *x_ = (x); \
+    val_(io).gc = obj2gco(x_); settt_(io, ctb(x_->tt)); \
+    checkliveness(L,io); }
+
+#define setuvalue(L,obj,x) \
+  { TValue *io = (obj); Udata *x_ = (x); \
+    val_(io).gc = obj2gco(x_); settt_(io, ctb(LUA_TUSERDATA)); \
+    checkliveness(L,io); }
+
+#define setthvalue(L,obj,x) \
+  { TValue *io = (obj); lua_State *x_ = (x); \
+    val_(io).gc = obj2gco(x_); settt_(io, ctb(LUA_TTHREAD)); \
+    checkliveness(L,io); }
+
+#define setclLvalue(L,obj,x) \
+  { TValue *io = (obj); LClosure *x_ = (x); \
+    val_(io).gc = obj2gco(x_); settt_(io, ctb(LUA_TLCL)); \
+    checkliveness(L,io); }
+
+#define setclCvalue(L,obj,x) \
+  { TValue *io = (obj); CClosure *x_ = (x); \
+    val_(io).gc = obj2gco(x_); settt_(io, ctb(LUA_TCCL)); \
+    checkliveness(L,io); }
+
+#define sethvalue(L,obj,x) \
+  { TValue *io = (obj); Table *x_ = (x); \
+    val_(io).gc = obj2gco(x_); settt_(io, ctb(LUA_TTABLE)); \
+    checkliveness(L,io); }
+
+#define setdeadvalue(obj)	settt_(obj, LUA_TDEADKEY)
+
+
+
+#define setobj(L,obj1,obj2) \
+	{ TValue *io1=(obj1); *io1 = *(obj2); \
+	  (void)L; checkliveness(L,io1); }
+
+
+/*
+** different types of assignments, according to destination
+*/
+
+/* from stack to (same) stack */
+#define setobjs2s	setobj
+/* to stack (not from same stack) */
+#define setobj2s	setobj
+#define setsvalue2s	setsvalue
+#define sethvalue2s	sethvalue
+#define setptvalue2s	setptvalue
+/* from table to same table */
+#define setobjt2t	setobj
+/* to new object */
+#define setobj2n	setobj
+#define setsvalue2n	setsvalue
+
+/* to table (define it as an expression to be used in macros) */
+#define setobj2t(L,o1,o2)  ((void)L, *(o1)=*(o2), checkliveness(L,(o1)))
+
+
+
+
+/*
+** {======================================================
+** types and prototypes
+** =======================================================
+*/
+
+
+typedef TValue *StkId;  /* index to stack elements */
+
+
+
+
+/*
+** Header for string value; string bytes follow the end of this structure
+** (aligned according to 'UTString'; see next).
+*/
+typedef struct TString {
+  CommonHeader;
+  lu_byte extra;  /* reserved words for short strings; "has hash" for longs */
+  lu_byte shrlen;  /* length for short strings */
+  unsigned int hash;
+  union {
+    size_t lnglen;  /* length for long strings */
+    struct TString *hnext;  /* linked list for hash table */
+  } u;
+} TString;
+
+
+/*
+** Ensures that address after this type is always fully aligned.
+*/
+typedef union UTString {
+  L_Umaxalign dummy;  /* ensures maximum alignment for strings */
+  TString tsv;
+} UTString;
+
+
+/*
+** Get the actual string (array of bytes) from a 'TString'.
+** (Access to 'extra' ensures that value is really a 'TString'.)
+*/
+#define getstr(ts)  \
+  check_exp(sizeof((ts)->extra), cast(char *, (ts)) + sizeof(UTString))
+
+
+/* get the actual string (array of bytes) from a Lua value */
+#define svalue(o)       getstr(tsvalue(o))
+
+/* get string length from 'TString *s' */
+#define tsslen(s)	((s)->tt == LUA_TSHRSTR ? (s)->shrlen : (s)->u.lnglen)
+
+/* get string length from 'TValue *o' */
+#define vslen(o)	tsslen(tsvalue(o))
+
+
+/*
+** Header for userdata; memory area follows the end of this structure
+** (aligned according to 'UUdata'; see next).
+*/
+typedef struct Udata {
+  CommonHeader;
+  lu_byte ttuv_;  /* user value's tag */
+  struct Table *metatable;
+  size_t len;  /* number of bytes */
+  union Value user_;  /* user value */
+} Udata;
+
+
+/*
+** Ensures that address after this type is always fully aligned.
+*/
+typedef union UUdata {
+  L_Umaxalign dummy;  /* ensures maximum alignment for 'local' udata */
+  Udata uv;
+} UUdata;
+
+
+/*
+**  Get the address of memory block inside 'Udata'.
+** (Access to 'ttuv_' ensures that value is really a 'Udata'.)
+*/
+#define getudatamem(u)  \
+  check_exp(sizeof((u)->ttuv_), (cast(char*, (u)) + sizeof(UUdata)))
+
+#define setuservalue(L,u,o) \
+	{ const TValue *io=(o); Udata *iu = (u); \
+	  iu->user_ = io->value_; iu->ttuv_ = rttype(io); \
+	  checkliveness(L,io); }
+
+
+#define getuservalue(L,u,o) \
+	{ TValue *io=(o); const Udata *iu = (u); \
+	  io->value_ = iu->user_; settt_(io, iu->ttuv_); \
+	  checkliveness(L,io); }
+
+
+/*
+** Description of an upvalue for function prototypes
+*/
+typedef struct Upvaldesc {
+  TString *name;  /* upvalue name (for debug information) */
+  lu_byte instack;  /* whether it is in stack (register) */
+  lu_byte idx;  /* index of upvalue (in stack or in outer function's list) */
+} Upvaldesc;
+
+
+/*
+** Description of a local variable for function prototypes
+** (used for debug information)
+*/
+typedef struct LocVar {
+  TString *varname;
+  int startpc;  /* first point where variable is active */
+  int endpc;    /* first point where variable is dead */
+} LocVar;
+
+
+/*
+** Function Prototypes
+*/
+typedef struct Proto {
+  CommonHeader;
+  lu_byte numparams;  /* number of fixed parameters */
+  lu_byte is_vararg;  /* 2: declared vararg; 1: uses vararg */
+  lu_byte maxstacksize;  /* number of registers needed by this function */
+  int sizeupvalues;  /* size of 'upvalues' */
+  int sizek;  /* size of 'k' */
+  int sizecode;
+  int sizelineinfo;
+  int sizep;  /* size of 'p' */
+  int sizelocvars;
+  int linedefined;  /* debug information  */
+  int lastlinedefined;  /* debug information  */
+  TValue *k;  /* constants used by the function */
+  Instruction *code;  /* opcodes */
+  struct Proto **p;  /* functions defined inside the function */
+  int *lineinfo;  /* map from opcodes to source lines (debug information) */
+  LocVar *locvars;  /* information about local variables (debug information) */
+  Upvaldesc *upvalues;  /* upvalue information */
+  struct LClosure *cache;  /* last-created closure with this prototype */
+  TString  *source;  /* used for debug information */
+  GCObject *gclist;
+} Proto;
+
+
+
+/*
+** Lua Upvalues
+*/
+typedef struct UpVal UpVal;
+
+
+/*
+** Closures
+*/
+
+#define ClosureHeader \
+	CommonHeader; lu_byte nupvalues; GCObject *gclist
+
+typedef struct CClosure {
+  ClosureHeader;
+  lua_CFunction f;
+  TValue upvalue[1];  /* list of upvalues */
+} CClosure;
+
+
+typedef struct LClosure {
+  ClosureHeader;
+  struct Proto *p;
+  UpVal *upvals[1];  /* list of upvalues */
+} LClosure;
+
+
+typedef union Closure {
+  CClosure c;
+  LClosure l;
+} Closure;
+
+
+#define isLfunction(o)	ttisLclosure(o)
+
+#define getproto(o)	(clLvalue(o)->p)
+
+
+/*
+** Tables
+*/
+
+typedef union TKey {
+  struct {
+    TValuefields;
+    int next;  /* for chaining (offset for next node) */
+  } nk;
+  TValue tvk;
+} TKey;
+
+
+/* copy a value into a key without messing up field 'next' */
+#define setnodekey(L,key,obj) \
+	{ TKey *k_=(key); const TValue *io_=(obj); \
+	  k_->nk.value_ = io_->value_; k_->nk.tt_ = io_->tt_; \
+	  (void)L; checkliveness(L,io_); }
+
+
+typedef struct Node {
+  TValue i_val;
+  TKey i_key;
+} Node;
+
+
+typedef struct Table {
+  CommonHeader;
+  lu_byte flags;  /* 1<<p means tagmethod(p) is not present */
+  lu_byte lsizenode;  /* log2 of size of 'node' array */
+  unsigned int sizearray;  /* size of 'array' array */
+  TValue *array;  /* array part */
+  Node *node;
+  Node *lastfree;  /* any free position is before this position */
+  struct Table *metatable;
+  GCObject *gclist;
+} Table;
+
+
+
+/*
+** 'module' operation for hashing (size is always a power of 2)
+*/
+#define lmod(s,size) \
+	(check_exp((size&(size-1))==0, (cast(int, (s) & ((size)-1)))))
+
+
+#define twoto(x)	(1<<(x))
+#define sizenode(t)	(twoto((t)->lsizenode))
+
+
+/*
+** (address of) a fixed nil value
+*/
+#define luaO_nilobject		(&luaO_nilobject_)
+
+
+LUAI_DDEC const TValue luaO_nilobject_;
+
+/* size of buffer for 'luaO_utf8esc' function */
+#define UTF8BUFFSZ	8
+
+LUAI_FUNC int luaO_int2fb (unsigned int x);
+LUAI_FUNC int luaO_fb2int (int x);
+LUAI_FUNC int luaO_utf8esc (char *buff, unsigned long x);
+LUAI_FUNC int luaO_ceillog2 (unsigned int x);
+LUAI_FUNC void luaO_arith (lua_State *L, int op, const TValue *p1,
+                           const TValue *p2, TValue *res);
+LUAI_FUNC size_t luaO_str2num (const char *s, TValue *o);
+LUAI_FUNC int luaO_hexavalue (int c);
+LUAI_FUNC void luaO_tostring (lua_State *L, StkId obj);
+LUAI_FUNC const char *luaO_pushvfstring (lua_State *L, const char *fmt,
+                                                       va_list argp);
+LUAI_FUNC const char *luaO_pushfstring (lua_State *L, const char *fmt, ...);
+LUAI_FUNC void luaO_chunkid (char *out, const char *source, size_t len);
+
+
+#endif
+
diff --git a/libs/lua/lua-5.3.3/lopcodes.c b/libs/lua/lua-5.3.3/lopcodes.c
new file mode 100644
index 0000000..a1cbef8
--- /dev/null
+++ b/libs/lua/lua-5.3.3/lopcodes.c
@@ -0,0 +1,124 @@
+/*
+** $Id: lopcodes.c,v 1.55 2015/01/05 13:48:33 roberto Exp $
+** Opcodes for Lua virtual machine
+** See Copyright Notice in lua.h
+*/
+
+#define lopcodes_c
+#define LUA_CORE
+
+#include "lprefix.h"
+
+
+#include <stddef.h>
+
+#include "lopcodes.h"
+
+
+/* ORDER OP */
+
+LUAI_DDEF const char *const luaP_opnames[NUM_OPCODES+1] = {
+  "MOVE",
+  "LOADK",
+  "LOADKX",
+  "LOADBOOL",
+  "LOADNIL",
+  "GETUPVAL",
+  "GETTABUP",
+  "GETTABLE",
+  "SETTABUP",
+  "SETUPVAL",
+  "SETTABLE",
+  "NEWTABLE",
+  "SELF",
+  "ADD",
+  "SUB",
+  "MUL",
+  "MOD",
+  "POW",
+  "DIV",
+  "IDIV",
+  "BAND",
+  "BOR",
+  "BXOR",
+  "SHL",
+  "SHR",
+  "UNM",
+  "BNOT",
+  "NOT",
+  "LEN",
+  "CONCAT",
+  "JMP",
+  "EQ",
+  "LT",
+  "LE",
+  "TEST",
+  "TESTSET",
+  "CALL",
+  "TAILCALL",
+  "RETURN",
+  "FORLOOP",
+  "FORPREP",
+  "TFORCALL",
+  "TFORLOOP",
+  "SETLIST",
+  "CLOSURE",
+  "VARARG",
+  "EXTRAARG",
+  NULL
+};
+
+
+#define opmode(t,a,b,c,m) (((t)<<7) | ((a)<<6) | ((b)<<4) | ((c)<<2) | (m))
+
+LUAI_DDEF const lu_byte luaP_opmodes[NUM_OPCODES] = {
+/*       T  A    B       C     mode		   opcode	*/
+  opmode(0, 1, OpArgR, OpArgN, iABC)		/* OP_MOVE */
+ ,opmode(0, 1, OpArgK, OpArgN, iABx)		/* OP_LOADK */
+ ,opmode(0, 1, OpArgN, OpArgN, iABx)		/* OP_LOADKX */
+ ,opmode(0, 1, OpArgU, OpArgU, iABC)		/* OP_LOADBOOL */
+ ,opmode(0, 1, OpArgU, OpArgN, iABC)		/* OP_LOADNIL */
+ ,opmode(0, 1, OpArgU, OpArgN, iABC)		/* OP_GETUPVAL */
+ ,opmode(0, 1, OpArgU, OpArgK, iABC)		/* OP_GETTABUP */
+ ,opmode(0, 1, OpArgR, OpArgK, iABC)		/* OP_GETTABLE */
+ ,opmode(0, 0, OpArgK, OpArgK, iABC)		/* OP_SETTABUP */
+ ,opmode(0, 0, OpArgU, OpArgN, iABC)		/* OP_SETUPVAL */
+ ,opmode(0, 0, OpArgK, OpArgK, iABC)		/* OP_SETTABLE */
+ ,opmode(0, 1, OpArgU, OpArgU, iABC)		/* OP_NEWTABLE */
+ ,opmode(0, 1, OpArgR, OpArgK, iABC)		/* OP_SELF */
+ ,opmode(0, 1, OpArgK, OpArgK, iABC)		/* OP_ADD */
+ ,opmode(0, 1, OpArgK, OpArgK, iABC)		/* OP_SUB */
+ ,opmode(0, 1, OpArgK, OpArgK, iABC)		/* OP_MUL */
+ ,opmode(0, 1, OpArgK, OpArgK, iABC)		/* OP_MOD */
+ ,opmode(0, 1, OpArgK, OpArgK, iABC)		/* OP_POW */
+ ,opmode(0, 1, OpArgK, OpArgK, iABC)		/* OP_DIV */
+ ,opmode(0, 1, OpArgK, OpArgK, iABC)		/* OP_IDIV */
+ ,opmode(0, 1, OpArgK, OpArgK, iABC)		/* OP_BAND */
+ ,opmode(0, 1, OpArgK, OpArgK, iABC)		/* OP_BOR */
+ ,opmode(0, 1, OpArgK, OpArgK, iABC)		/* OP_BXOR */
+ ,opmode(0, 1, OpArgK, OpArgK, iABC)		/* OP_SHL */
+ ,opmode(0, 1, OpArgK, OpArgK, iABC)		/* OP_SHR */
+ ,opmode(0, 1, OpArgR, OpArgN, iABC)		/* OP_UNM */
+ ,opmode(0, 1, OpArgR, OpArgN, iABC)		/* OP_BNOT */
+ ,opmode(0, 1, OpArgR, OpArgN, iABC)		/* OP_NOT */
+ ,opmode(0, 1, OpArgR, OpArgN, iABC)		/* OP_LEN */
+ ,opmode(0, 1, OpArgR, OpArgR, iABC)		/* OP_CONCAT */
+ ,opmode(0, 0, OpArgR, OpArgN, iAsBx)		/* OP_JMP */
+ ,opmode(1, 0, OpArgK, OpArgK, iABC)		/* OP_EQ */
+ ,opmode(1, 0, OpArgK, OpArgK, iABC)		/* OP_LT */
+ ,opmode(1, 0, OpArgK, OpArgK, iABC)		/* OP_LE */
+ ,opmode(1, 0, OpArgN, OpArgU, iABC)		/* OP_TEST */
+ ,opmode(1, 1, OpArgR, OpArgU, iABC)		/* OP_TESTSET */
+ ,opmode(0, 1, OpArgU, OpArgU, iABC)		/* OP_CALL */
+ ,opmode(0, 1, OpArgU, OpArgU, iABC)		/* OP_TAILCALL */
+ ,opmode(0, 0, OpArgU, OpArgN, iABC)		/* OP_RETURN */
+ ,opmode(0, 1, OpArgR, OpArgN, iAsBx)		/* OP_FORLOOP */
+ ,opmode(0, 1, OpArgR, OpArgN, iAsBx)		/* OP_FORPREP */
+ ,opmode(0, 0, OpArgN, OpArgU, iABC)		/* OP_TFORCALL */
+ ,opmode(0, 1, OpArgR, OpArgN, iAsBx)		/* OP_TFORLOOP */
+ ,opmode(0, 0, OpArgU, OpArgU, iABC)		/* OP_SETLIST */
+ ,opmode(0, 1, OpArgU, OpArgN, iABx)		/* OP_CLOSURE */
+ ,opmode(0, 1, OpArgU, OpArgN, iABC)		/* OP_VARARG */
+ ,opmode(0, 0, OpArgU, OpArgU, iAx)		/* OP_EXTRAARG */
+};
+
diff --git a/libs/lua/lua-5.3.3/lopcodes.h b/libs/lua/lua-5.3.3/lopcodes.h
new file mode 100644
index 0000000..864b8e4
--- /dev/null
+++ b/libs/lua/lua-5.3.3/lopcodes.h
@@ -0,0 +1,295 @@
+/*
+** $Id: lopcodes.h,v 1.148 2014/10/25 11:50:46 roberto Exp $
+** Opcodes for Lua virtual machine
+** See Copyright Notice in lua.h
+*/
+
+#ifndef lopcodes_h
+#define lopcodes_h
+
+#include "llimits.h"
+
+
+/*===========================================================================
+  We assume that instructions are unsigned numbers.
+  All instructions have an opcode in the first 6 bits.
+  Instructions can have the following fields:
+	'A' : 8 bits
+	'B' : 9 bits
+	'C' : 9 bits
+	'Ax' : 26 bits ('A', 'B', and 'C' together)
+	'Bx' : 18 bits ('B' and 'C' together)
+	'sBx' : signed Bx
+
+  A signed argument is represented in excess K; that is, the number
+  value is the unsigned value minus K. K is exactly the maximum value
+  for that argument (so that -max is represented by 0, and +max is
+  represented by 2*max), which is half the maximum for the corresponding
+  unsigned argument.
+===========================================================================*/
+
+
+enum OpMode {iABC, iABx, iAsBx, iAx};  /* basic instruction format */
+
+
+/*
+** size and position of opcode arguments.
+*/
+#define SIZE_C		9
+#define SIZE_B		9
+#define SIZE_Bx		(SIZE_C + SIZE_B)
+#define SIZE_A		8
+#define SIZE_Ax		(SIZE_C + SIZE_B + SIZE_A)
+
+#define SIZE_OP		6
+
+#define POS_OP		0
+#define POS_A		(POS_OP + SIZE_OP)
+#define POS_C		(POS_A + SIZE_A)
+#define POS_B		(POS_C + SIZE_C)
+#define POS_Bx		POS_C
+#define POS_Ax		POS_A
+
+
+/*
+** limits for opcode arguments.
+** we use (signed) int to manipulate most arguments,
+** so they must fit in LUAI_BITSINT-1 bits (-1 for sign)
+*/
+#if SIZE_Bx < LUAI_BITSINT-1
+#define MAXARG_Bx        ((1<<SIZE_Bx)-1)
+#define MAXARG_sBx        (MAXARG_Bx>>1)         /* 'sBx' is signed */
+#else
+#define MAXARG_Bx        MAX_INT
+#define MAXARG_sBx        MAX_INT
+#endif
+
+#if SIZE_Ax < LUAI_BITSINT-1
+#define MAXARG_Ax	((1<<SIZE_Ax)-1)
+#else
+#define MAXARG_Ax	MAX_INT
+#endif
+
+
+#define MAXARG_A        ((1<<SIZE_A)-1)
+#define MAXARG_B        ((1<<SIZE_B)-1)
+#define MAXARG_C        ((1<<SIZE_C)-1)
+
+
+/* creates a mask with 'n' 1 bits at position 'p' */
+#define MASK1(n,p)	((~((~(Instruction)0)<<(n)))<<(p))
+
+/* creates a mask with 'n' 0 bits at position 'p' */
+#define MASK0(n,p)	(~MASK1(n,p))
+
+/*
+** the following macros help to manipulate instructions
+*/
+
+#define GET_OPCODE(i)	(cast(OpCode, ((i)>>POS_OP) & MASK1(SIZE_OP,0)))
+#define SET_OPCODE(i,o)	((i) = (((i)&MASK0(SIZE_OP,POS_OP)) | \
+		((cast(Instruction, o)<<POS_OP)&MASK1(SIZE_OP,POS_OP))))
+
+#define getarg(i,pos,size)	(cast(int, ((i)>>pos) & MASK1(size,0)))
+#define setarg(i,v,pos,size)	((i) = (((i)&MASK0(size,pos)) | \
+                ((cast(Instruction, v)<<pos)&MASK1(size,pos))))
+
+#define GETARG_A(i)	getarg(i, POS_A, SIZE_A)
+#define SETARG_A(i,v)	setarg(i, v, POS_A, SIZE_A)
+
+#define GETARG_B(i)	getarg(i, POS_B, SIZE_B)
+#define SETARG_B(i,v)	setarg(i, v, POS_B, SIZE_B)
+
+#define GETARG_C(i)	getarg(i, POS_C, SIZE_C)
+#define SETARG_C(i,v)	setarg(i, v, POS_C, SIZE_C)
+
+#define GETARG_Bx(i)	getarg(i, POS_Bx, SIZE_Bx)
+#define SETARG_Bx(i,v)	setarg(i, v, POS_Bx, SIZE_Bx)
+
+#define GETARG_Ax(i)	getarg(i, POS_Ax, SIZE_Ax)
+#define SETARG_Ax(i,v)	setarg(i, v, POS_Ax, SIZE_Ax)
+
+#define GETARG_sBx(i)	(GETARG_Bx(i)-MAXARG_sBx)
+#define SETARG_sBx(i,b)	SETARG_Bx((i),cast(unsigned int, (b)+MAXARG_sBx))
+
+
+#define CREATE_ABC(o,a,b,c)	((cast(Instruction, o)<<POS_OP) \
+			| (cast(Instruction, a)<<POS_A) \
+			| (cast(Instruction, b)<<POS_B) \
+			| (cast(Instruction, c)<<POS_C))
+
+#define CREATE_ABx(o,a,bc)	((cast(Instruction, o)<<POS_OP) \
+			| (cast(Instruction, a)<<POS_A) \
+			| (cast(Instruction, bc)<<POS_Bx))
+
+#define CREATE_Ax(o,a)		((cast(Instruction, o)<<POS_OP) \
+			| (cast(Instruction, a)<<POS_Ax))
+
+
+/*
+** Macros to operate RK indices
+*/
+
+/* this bit 1 means constant (0 means register) */
+#define BITRK		(1 << (SIZE_B - 1))
+
+/* test whether value is a constant */
+#define ISK(x)		((x) & BITRK)
+
+/* gets the index of the constant */
+#define INDEXK(r)	((int)(r) & ~BITRK)
+
+#define MAXINDEXRK	(BITRK - 1)
+
+/* code a constant index as a RK value */
+#define RKASK(x)	((x) | BITRK)
+
+
+/*
+** invalid register that fits in 8 bits
+*/
+#define NO_REG		MAXARG_A
+
+
+/*
+** R(x) - register
+** Kst(x) - constant (in constant table)
+** RK(x) == if ISK(x) then Kst(INDEXK(x)) else R(x)
+*/
+
+
+/*
+** grep "ORDER OP" if you change these enums
+*/
+
+typedef enum {
+/*----------------------------------------------------------------------
+name		args	description
+------------------------------------------------------------------------*/
+OP_MOVE,/*	A B	R(A) := R(B)					*/
+OP_LOADK,/*	A Bx	R(A) := Kst(Bx)					*/
+OP_LOADKX,/*	A 	R(A) := Kst(extra arg)				*/
+OP_LOADBOOL,/*	A B C	R(A) := (Bool)B; if (C) pc++			*/
+OP_LOADNIL,/*	A B	R(A), R(A+1), ..., R(A+B) := nil		*/
+OP_GETUPVAL,/*	A B	R(A) := UpValue[B]				*/
+
+OP_GETTABUP,/*	A B C	R(A) := UpValue[B][RK(C)]			*/
+OP_GETTABLE,/*	A B C	R(A) := R(B)[RK(C)]				*/
+
+OP_SETTABUP,/*	A B C	UpValue[A][RK(B)] := RK(C)			*/
+OP_SETUPVAL,/*	A B	UpValue[B] := R(A)				*/
+OP_SETTABLE,/*	A B C	R(A)[RK(B)] := RK(C)				*/
+
+OP_NEWTABLE,/*	A B C	R(A) := {} (size = B,C)				*/
+
+OP_SELF,/*	A B C	R(A+1) := R(B); R(A) := R(B)[RK(C)]		*/
+
+OP_ADD,/*	A B C	R(A) := RK(B) + RK(C)				*/
+OP_SUB,/*	A B C	R(A) := RK(B) - RK(C)				*/
+OP_MUL,/*	A B C	R(A) := RK(B) * RK(C)				*/
+OP_MOD,/*	A B C	R(A) := RK(B) % RK(C)				*/
+OP_POW,/*	A B C	R(A) := RK(B) ^ RK(C)				*/
+OP_DIV,/*	A B C	R(A) := RK(B) / RK(C)				*/
+OP_IDIV,/*	A B C	R(A) := RK(B) // RK(C)				*/
+OP_BAND,/*	A B C	R(A) := RK(B) & RK(C)				*/
+OP_BOR,/*	A B C	R(A) := RK(B) | RK(C)				*/
+OP_BXOR,/*	A B C	R(A) := RK(B) ~ RK(C)				*/
+OP_SHL,/*	A B C	R(A) := RK(B) << RK(C)				*/
+OP_SHR,/*	A B C	R(A) := RK(B) >> RK(C)				*/
+OP_UNM,/*	A B	R(A) := -R(B)					*/
+OP_BNOT,/*	A B	R(A) := ~R(B)					*/
+OP_NOT,/*	A B	R(A) := not R(B)				*/
+OP_LEN,/*	A B	R(A) := length of R(B)				*/
+
+OP_CONCAT,/*	A B C	R(A) := R(B).. ... ..R(C)			*/
+
+OP_JMP,/*	A sBx	pc+=sBx; if (A) close all upvalues >= R(A - 1)	*/
+OP_EQ,/*	A B C	if ((RK(B) == RK(C)) ~= A) then pc++		*/
+OP_LT,/*	A B C	if ((RK(B) <  RK(C)) ~= A) then pc++		*/
+OP_LE,/*	A B C	if ((RK(B) <= RK(C)) ~= A) then pc++		*/
+
+OP_TEST,/*	A C	if not (R(A) <=> C) then pc++			*/
+OP_TESTSET,/*	A B C	if (R(B) <=> C) then R(A) := R(B) else pc++	*/
+
+OP_CALL,/*	A B C	R(A), ... ,R(A+C-2) := R(A)(R(A+1), ... ,R(A+B-1)) */
+OP_TAILCALL,/*	A B C	return R(A)(R(A+1), ... ,R(A+B-1))		*/
+OP_RETURN,/*	A B	return R(A), ... ,R(A+B-2)	(see note)	*/
+
+OP_FORLOOP,/*	A sBx	R(A)+=R(A+2);
+			if R(A) <?= R(A+1) then { pc+=sBx; R(A+3)=R(A) }*/
+OP_FORPREP,/*	A sBx	R(A)-=R(A+2); pc+=sBx				*/
+
+OP_TFORCALL,/*	A C	R(A+3), ... ,R(A+2+C) := R(A)(R(A+1), R(A+2));	*/
+OP_TFORLOOP,/*	A sBx	if R(A+1) ~= nil then { R(A)=R(A+1); pc += sBx }*/
+
+OP_SETLIST,/*	A B C	R(A)[(C-1)*FPF+i] := R(A+i), 1 <= i <= B	*/
+
+OP_CLOSURE,/*	A Bx	R(A) := closure(KPROTO[Bx])			*/
+
+OP_VARARG,/*	A B	R(A), R(A+1), ..., R(A+B-2) = vararg		*/
+
+OP_EXTRAARG/*	Ax	extra (larger) argument for previous opcode	*/
+} OpCode;
+
+
+#define NUM_OPCODES	(cast(int, OP_EXTRAARG) + 1)
+
+
+
+/*===========================================================================
+  Notes:
+  (*) In OP_CALL, if (B == 0) then B = top. If (C == 0), then 'top' is
+  set to last_result+1, so next open instruction (OP_CALL, OP_RETURN,
+  OP_SETLIST) may use 'top'.
+
+  (*) In OP_VARARG, if (B == 0) then use actual number of varargs and
+  set top (like in OP_CALL with C == 0).
+
+  (*) In OP_RETURN, if (B == 0) then return up to 'top'.
+
+  (*) In OP_SETLIST, if (B == 0) then B = 'top'; if (C == 0) then next
+  'instruction' is EXTRAARG(real C).
+
+  (*) In OP_LOADKX, the next 'instruction' is always EXTRAARG.
+
+  (*) For comparisons, A specifies what condition the test should accept
+  (true or false).
+
+  (*) All 'skips' (pc++) assume that next instruction is a jump.
+
+===========================================================================*/
+
+
+/*
+** masks for instruction properties. The format is:
+** bits 0-1: op mode
+** bits 2-3: C arg mode
+** bits 4-5: B arg mode
+** bit 6: instruction set register A
+** bit 7: operator is a test (next instruction must be a jump)
+*/
+
+enum OpArgMask {
+  OpArgN,  /* argument is not used */
+  OpArgU,  /* argument is used */
+  OpArgR,  /* argument is a register or a jump offset */
+  OpArgK   /* argument is a constant or register/constant */
+};
+
+LUAI_DDEC const lu_byte luaP_opmodes[NUM_OPCODES];
+
+#define getOpMode(m)	(cast(enum OpMode, luaP_opmodes[m] & 3))
+#define getBMode(m)	(cast(enum OpArgMask, (luaP_opmodes[m] >> 4) & 3))
+#define getCMode(m)	(cast(enum OpArgMask, (luaP_opmodes[m] >> 2) & 3))
+#define testAMode(m)	(luaP_opmodes[m] & (1 << 6))
+#define testTMode(m)	(luaP_opmodes[m] & (1 << 7))
+
+
+LUAI_DDEC const char *const luaP_opnames[NUM_OPCODES+1];  /* opcode names */
+
+
+/* number of list items to accumulate before a SETLIST instruction */
+#define LFIELDS_PER_FLUSH	50
+
+
+#endif
diff --git a/libs/lua/lua-5.3.3/loslib.c b/libs/lua/lua-5.3.3/loslib.c
new file mode 100644
index 0000000..4810655
--- /dev/null
+++ b/libs/lua/lua-5.3.3/loslib.c
@@ -0,0 +1,403 @@
+/*
+** $Id: loslib.c,v 1.64 2016/04/18 13:06:55 roberto Exp $
+** Standard Operating System library
+** See Copyright Notice in lua.h
+*/
+
+#define loslib_c
+#define LUA_LIB
+
+#include "lprefix.h"
+
+
+#include <errno.h>
+#include <locale.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+
+#include "lua.h"
+
+#include "lauxlib.h"
+#include "lualib.h"
+
+
+/*
+** {==================================================================
+** List of valid conversion specifiers for the 'strftime' function;
+** options are grouped by length; group of length 2 start with '||'.
+** ===================================================================
+*/
+#if !defined(LUA_STRFTIMEOPTIONS)	/* { */
+
+/* options for ANSI C 89 */
+#define L_STRFTIMEC89		"aAbBcdHIjmMpSUwWxXyYZ%"
+
+/* options for ISO C 99 and POSIX */
+#define L_STRFTIMEC99 "aAbBcCdDeFgGhHIjmMnprRStTuUVwWxXyYzZ%" \
+	"||" "EcECExEXEyEY" "OdOeOHOIOmOMOSOuOUOVOwOWOy"
+
+/* options for Windows */
+#define L_STRFTIMEWIN "aAbBcdHIjmMpSUwWxXyYzZ%" \
+	"||" "#c#x#d#H#I#j#m#M#S#U#w#W#y#Y"
+
+#if defined(LUA_USE_WINDOWS)
+#define LUA_STRFTIMEOPTIONS	L_STRFTIMEWIN
+#elif defined(LUA_USE_C89)
+#define LUA_STRFTIMEOPTIONS	L_STRFTIMEC89
+#else  /* C99 specification */
+#define LUA_STRFTIMEOPTIONS	L_STRFTIMEC99
+#endif
+
+#endif					/* } */
+/* }================================================================== */
+
+
+/*
+** {==================================================================
+** Configuration for time-related stuff
+** ===================================================================
+*/
+
+#if !defined(l_time_t)		/* { */
+/*
+** type to represent time_t in Lua
+*/
+#define l_timet			lua_Integer
+#define l_pushtime(L,t)		lua_pushinteger(L,(lua_Integer)(t))
+
+static time_t l_checktime (lua_State *L, int arg) {
+  lua_Integer t = luaL_checkinteger(L, arg);
+  luaL_argcheck(L, (time_t)t == t, arg, "time out-of-bounds");
+  return (time_t)t;
+}
+
+#endif				/* } */
+
+
+#if !defined(l_gmtime)		/* { */
+/*
+** By default, Lua uses gmtime/localtime, except when POSIX is available,
+** where it uses gmtime_r/localtime_r
+*/
+
+#if defined(LUA_USE_POSIX)	/* { */
+
+#define l_gmtime(t,r)		gmtime_r(t,r)
+#define l_localtime(t,r)	localtime_r(t,r)
+
+#else				/* }{ */
+
+/* ISO C definitions */
+#define l_gmtime(t,r)		((void)(r)->tm_sec, gmtime(t))
+#define l_localtime(t,r)  	((void)(r)->tm_sec, localtime(t))
+
+#endif				/* } */
+
+#endif				/* } */
+
+/* }================================================================== */
+
+
+/*
+** {==================================================================
+** Configuration for 'tmpnam':
+** By default, Lua uses tmpnam except when POSIX is available, where
+** it uses mkstemp.
+** ===================================================================
+*/
+#if !defined(lua_tmpnam)	/* { */
+
+#if defined(LUA_USE_POSIX)	/* { */
+
+#include <unistd.h>
+
+#define LUA_TMPNAMBUFSIZE	32
+
+#if !defined(LUA_TMPNAMTEMPLATE)
+#define LUA_TMPNAMTEMPLATE	"/tmp/lua_XXXXXX"
+#endif
+
+#define lua_tmpnam(b,e) { \
+        strcpy(b, LUA_TMPNAMTEMPLATE); \
+        e = mkstemp(b); \
+        if (e != -1) close(e); \
+        e = (e == -1); }
+
+#else				/* }{ */
+
+/* ISO C definitions */
+#define LUA_TMPNAMBUFSIZE	L_tmpnam
+#define lua_tmpnam(b,e)		{ e = (tmpnam(b) == NULL); }
+
+#endif				/* } */
+
+#endif				/* } */
+/* }================================================================== */
+
+
+
+
+static int os_execute (lua_State *L) {
+  const char *cmd = luaL_optstring(L, 1, NULL);
+  int stat = system(cmd);
+  if (cmd != NULL)
+    return luaL_execresult(L, stat);
+  else {
+    lua_pushboolean(L, stat);  /* true if there is a shell */
+    return 1;
+  }
+}
+
+
+static int os_remove (lua_State *L) {
+  const char *filename = luaL_checkstring(L, 1);
+  return luaL_fileresult(L, remove(filename) == 0, filename);
+}
+
+
+static int os_rename (lua_State *L) {
+  const char *fromname = luaL_checkstring(L, 1);
+  const char *toname = luaL_checkstring(L, 2);
+  return luaL_fileresult(L, rename(fromname, toname) == 0, NULL);
+}
+
+
+static int os_tmpname (lua_State *L) {
+  char buff[LUA_TMPNAMBUFSIZE];
+  int err;
+  lua_tmpnam(buff, err);
+  if (err)
+    return luaL_error(L, "unable to generate a unique filename");
+  lua_pushstring(L, buff);
+  return 1;
+}
+
+
+static int os_getenv (lua_State *L) {
+  lua_pushstring(L, getenv(luaL_checkstring(L, 1)));  /* if NULL push nil */
+  return 1;
+}
+
+
+static int os_clock (lua_State *L) {
+  lua_pushnumber(L, ((lua_Number)clock())/(lua_Number)CLOCKS_PER_SEC);
+  return 1;
+}
+
+
+/*
+** {======================================================
+** Time/Date operations
+** { year=%Y, month=%m, day=%d, hour=%H, min=%M, sec=%S,
+**   wday=%w+1, yday=%j, isdst=? }
+** =======================================================
+*/
+
+static void setfield (lua_State *L, const char *key, int value) {
+  lua_pushinteger(L, value);
+  lua_setfield(L, -2, key);
+}
+
+static void setboolfield (lua_State *L, const char *key, int value) {
+  if (value < 0)  /* undefined? */
+    return;  /* does not set field */
+  lua_pushboolean(L, value);
+  lua_setfield(L, -2, key);
+}
+
+
+/*
+** Set all fields from structure 'tm' in the table on top of the stack
+*/
+static void setallfields (lua_State *L, struct tm *stm) {
+  setfield(L, "sec", stm->tm_sec);
+  setfield(L, "min", stm->tm_min);
+  setfield(L, "hour", stm->tm_hour);
+  setfield(L, "day", stm->tm_mday);
+  setfield(L, "month", stm->tm_mon + 1);
+  setfield(L, "year", stm->tm_year + 1900);
+  setfield(L, "wday", stm->tm_wday + 1);
+  setfield(L, "yday", stm->tm_yday + 1);
+  setboolfield(L, "isdst", stm->tm_isdst);
+}
+
+
+static int getboolfield (lua_State *L, const char *key) {
+  int res;
+  res = (lua_getfield(L, -1, key) == LUA_TNIL) ? -1 : lua_toboolean(L, -1);
+  lua_pop(L, 1);
+  return res;
+}
+
+
+/* maximum value for date fields (to avoid arithmetic overflows with 'int') */
+#if !defined(L_MAXDATEFIELD)
+#define L_MAXDATEFIELD	(INT_MAX / 2)
+#endif
+
+static int getfield (lua_State *L, const char *key, int d, int delta) {
+  int isnum;
+  int t = lua_getfield(L, -1, key);  /* get field and its type */
+  lua_Integer res = lua_tointegerx(L, -1, &isnum);
+  if (!isnum) {  /* field is not an integer? */
+    if (t != LUA_TNIL)  /* some other value? */
+      return luaL_error(L, "field '%s' is not an integer", key);
+    else if (d < 0)  /* absent field; no default? */
+      return luaL_error(L, "field '%s' missing in date table", key);
+    res = d;
+  }
+  else {
+    if (!(-L_MAXDATEFIELD <= res && res <= L_MAXDATEFIELD))
+      return luaL_error(L, "field '%s' is out-of-bound", key);
+    res -= delta;
+  }
+  lua_pop(L, 1);
+  return (int)res;
+}
+
+
+static const char *checkoption (lua_State *L, const char *conv, char *buff) {
+  const char *option;
+  int oplen = 1;
+  for (option = LUA_STRFTIMEOPTIONS; *option != '\0'; option += oplen) {
+    if (*option == '|')  /* next block? */
+      oplen++;  /* next length */
+    else if (memcmp(conv, option, oplen) == 0) {  /* match? */
+      memcpy(buff, conv, oplen);  /* copy valid option to buffer */
+      buff[oplen] = '\0';
+      return conv + oplen;  /* return next item */
+    }
+  }
+  luaL_argerror(L, 1,
+    lua_pushfstring(L, "invalid conversion specifier '%%%s'", conv));
+  return conv;  /* to avoid warnings */
+}
+
+
+/* maximum size for an individual 'strftime' item */
+#define SIZETIMEFMT	250
+
+
+static int os_date (lua_State *L) {
+  const char *s = luaL_optstring(L, 1, "%c");
+  time_t t = luaL_opt(L, l_checktime, 2, time(NULL));
+  struct tm tmr, *stm;
+  if (*s == '!') {  /* UTC? */
+    stm = l_gmtime(&t, &tmr);
+    s++;  /* skip '!' */
+  }
+  else
+    stm = l_localtime(&t, &tmr);
+  if (stm == NULL)  /* invalid date? */
+    luaL_error(L, "time result cannot be represented in this installation");
+  if (strcmp(s, "*t") == 0) {
+    lua_createtable(L, 0, 9);  /* 9 = number of fields */
+    setallfields(L, stm);
+  }
+  else {
+    char cc[4];  /* buffer for individual conversion specifiers */
+    luaL_Buffer b;
+    cc[0] = '%';
+    luaL_buffinit(L, &b);
+    while (*s) {
+      if (*s != '%')  /* not a conversion specifier? */
+        luaL_addchar(&b, *s++);
+      else {
+        size_t reslen;
+        char *buff = luaL_prepbuffsize(&b, SIZETIMEFMT);
+        s = checkoption(L, s + 1, cc + 1);  /* copy specifier to 'cc' */
+        reslen = strftime(buff, SIZETIMEFMT, cc, stm);
+        luaL_addsize(&b, reslen);
+      }
+    }
+    luaL_pushresult(&b);
+  }
+  return 1;
+}
+
+
+static int os_time (lua_State *L) {
+  time_t t;
+  if (lua_isnoneornil(L, 1))  /* called without args? */
+    t = time(NULL);  /* get current time */
+  else {
+    struct tm ts;
+    luaL_checktype(L, 1, LUA_TTABLE);
+    lua_settop(L, 1);  /* make sure table is at the top */
+    ts.tm_sec = getfield(L, "sec", 0, 0);
+    ts.tm_min = getfield(L, "min", 0, 0);
+    ts.tm_hour = getfield(L, "hour", 12, 0);
+    ts.tm_mday = getfield(L, "day", -1, 0);
+    ts.tm_mon = getfield(L, "month", -1, 1);
+    ts.tm_year = getfield(L, "year", -1, 1900);
+    ts.tm_isdst = getboolfield(L, "isdst");
+    t = mktime(&ts);
+    setallfields(L, &ts);  /* update fields with normalized values */
+  }
+  if (t != (time_t)(l_timet)t || t == (time_t)(-1))
+    luaL_error(L, "time result cannot be represented in this installation");
+  l_pushtime(L, t);
+  return 1;
+}
+
+
+static int os_difftime (lua_State *L) {
+  time_t t1 = l_checktime(L, 1);
+  time_t t2 = l_checktime(L, 2);
+  lua_pushnumber(L, (lua_Number)difftime(t1, t2));
+  return 1;
+}
+
+/* }====================================================== */
+
+
+static int os_setlocale (lua_State *L) {
+  static const int cat[] = {LC_ALL, LC_COLLATE, LC_CTYPE, LC_MONETARY,
+                      LC_NUMERIC, LC_TIME};
+  static const char *const catnames[] = {"all", "collate", "ctype", "monetary",
+     "numeric", "time", NULL};
+  const char *l = luaL_optstring(L, 1, NULL);
+  int op = luaL_checkoption(L, 2, "all", catnames);
+  lua_pushstring(L, setlocale(cat[op], l));
+  return 1;
+}
+
+
+static int os_exit (lua_State *L) {
+  int status;
+  if (lua_isboolean(L, 1))
+    status = (lua_toboolean(L, 1) ? EXIT_SUCCESS : EXIT_FAILURE);
+  else
+    status = (int)luaL_optinteger(L, 1, EXIT_SUCCESS);
+  if (lua_toboolean(L, 2))
+    lua_close(L);
+  if (L) exit(status);  /* 'if' to avoid warnings for unreachable 'return' */
+  return 0;
+}
+
+
+static const luaL_Reg syslib[] = {
+  {"clock",     os_clock},
+  {"date",      os_date},
+  {"difftime",  os_difftime},
+  {"execute",   os_execute},
+  {"exit",      os_exit},
+  {"getenv",    os_getenv},
+  {"remove",    os_remove},
+  {"rename",    os_rename},
+  {"setlocale", os_setlocale},
+  {"time",      os_time},
+  {"tmpname",   os_tmpname},
+  {NULL, NULL}
+};
+
+/* }====================================================== */
+
+
+
+LUAMOD_API int luaopen_os (lua_State *L) {
+  luaL_newlib(L, syslib);
+  return 1;
+}
+
diff --git a/libs/lua/lua-5.3.3/lparser.c b/libs/lua/lua-5.3.3/lparser.c
new file mode 100644
index 0000000..22530a5
--- /dev/null
+++ b/libs/lua/lua-5.3.3/lparser.c
@@ -0,0 +1,1652 @@
+/*
+** $Id: lparser.c,v 2.153 2016/05/13 19:10:16 roberto Exp $
+** Lua Parser
+** See Copyright Notice in lua.h
+*/
+
+#define lparser_c
+#define LUA_CORE
+
+#include "lprefix.h"
+
+
+#include <string.h>
+
+#include "lua.h"
+
+#include "lcode.h"
+#include "ldebug.h"
+#include "ldo.h"
+#include "lfunc.h"
+#include "llex.h"
+#include "lmem.h"
+#include "lobject.h"
+#include "lopcodes.h"
+#include "lparser.h"
+#include "lstate.h"
+#include "lstring.h"
+#include "ltable.h"
+
+
+
+/* maximum number of local variables per function (must be smaller
+   than 250, due to the bytecode format) */
+#define MAXVARS		200
+
+
+#define hasmultret(k)		((k) == VCALL || (k) == VVARARG)
+
+
+/* because all strings are unified by the scanner, the parser
+   can use pointer equality for string equality */
+#define eqstr(a,b)	((a) == (b))
+
+
+/*
+** nodes for block list (list of active blocks)
+*/
+typedef struct BlockCnt {
+  struct BlockCnt *previous;  /* chain */
+  int firstlabel;  /* index of first label in this block */
+  int firstgoto;  /* index of first pending goto in this block */
+  lu_byte nactvar;  /* # active locals outside the block */
+  lu_byte upval;  /* true if some variable in the block is an upvalue */
+  lu_byte isloop;  /* true if 'block' is a loop */
+} BlockCnt;
+
+
+
+/*
+** prototypes for recursive non-terminal functions
+*/
+static void statement (LexState *ls);
+static void expr (LexState *ls, expdesc *v);
+
+
+/* semantic error */
+static l_noret semerror (LexState *ls, const char *msg) {
+  ls->t.token = 0;  /* remove "near <token>" from final message */
+  luaX_syntaxerror(ls, msg);
+}
+
+
+static l_noret error_expected (LexState *ls, int token) {
+  luaX_syntaxerror(ls,
+      luaO_pushfstring(ls->L, "%s expected", luaX_token2str(ls, token)));
+}
+
+
+static l_noret errorlimit (FuncState *fs, int limit, const char *what) {
+  lua_State *L = fs->ls->L;
+  const char *msg;
+  int line = fs->f->linedefined;
+  const char *where = (line == 0)
+                      ? "main function"
+                      : luaO_pushfstring(L, "function at line %d", line);
+  msg = luaO_pushfstring(L, "too many %s (limit is %d) in %s",
+                             what, limit, where);
+  luaX_syntaxerror(fs->ls, msg);
+}
+
+
+static void checklimit (FuncState *fs, int v, int l, const char *what) {
+  if (v > l) errorlimit(fs, l, what);
+}
+
+
+static int testnext (LexState *ls, int c) {
+  if (ls->t.token == c) {
+    luaX_next(ls);
+    return 1;
+  }
+  else return 0;
+}
+
+
+static void check (LexState *ls, int c) {
+  if (ls->t.token != c)
+    error_expected(ls, c);
+}
+
+
+static void checknext (LexState *ls, int c) {
+  check(ls, c);
+  luaX_next(ls);
+}
+
+
+#define check_condition(ls,c,msg)	{ if (!(c)) luaX_syntaxerror(ls, msg); }
+
+
+
+static void check_match (LexState *ls, int what, int who, int where) {
+  if (!testnext(ls, what)) {
+    if (where == ls->linenumber)
+      error_expected(ls, what);
+    else {
+      luaX_syntaxerror(ls, luaO_pushfstring(ls->L,
+             "%s expected (to close %s at line %d)",
+              luaX_token2str(ls, what), luaX_token2str(ls, who), where));
+    }
+  }
+}
+
+
+static TString *str_checkname (LexState *ls) {
+  TString *ts;
+  check(ls, TK_NAME);
+  ts = ls->t.seminfo.ts;
+  luaX_next(ls);
+  return ts;
+}
+
+
+static void init_exp (expdesc *e, expkind k, int i) {
+  e->f = e->t = NO_JUMP;
+  e->k = k;
+  e->u.info = i;
+}
+
+
+static void codestring (LexState *ls, expdesc *e, TString *s) {
+  init_exp(e, VK, luaK_stringK(ls->fs, s));
+}
+
+
+static void checkname (LexState *ls, expdesc *e) {
+  codestring(ls, e, str_checkname(ls));
+}
+
+
+static int registerlocalvar (LexState *ls, TString *varname) {
+  FuncState *fs = ls->fs;
+  Proto *f = fs->f;
+  int oldsize = f->sizelocvars;
+  luaM_growvector(ls->L, f->locvars, fs->nlocvars, f->sizelocvars,
+                  LocVar, SHRT_MAX, "local variables");
+  while (oldsize < f->sizelocvars)
+    f->locvars[oldsize++].varname = NULL;
+  f->locvars[fs->nlocvars].varname = varname;
+  luaC_objbarrier(ls->L, f, varname);
+  return fs->nlocvars++;
+}
+
+
+static void new_localvar (LexState *ls, TString *name) {
+  FuncState *fs = ls->fs;
+  Dyndata *dyd = ls->dyd;
+  int reg = registerlocalvar(ls, name);
+  checklimit(fs, dyd->actvar.n + 1 - fs->firstlocal,
+                  MAXVARS, "local variables");
+  luaM_growvector(ls->L, dyd->actvar.arr, dyd->actvar.n + 1,
+                  dyd->actvar.size, Vardesc, MAX_INT, "local variables");
+  dyd->actvar.arr[dyd->actvar.n++].idx = cast(short, reg);
+}
+
+
+static void new_localvarliteral_ (LexState *ls, const char *name, size_t sz) {
+  new_localvar(ls, luaX_newstring(ls, name, sz));
+}
+
+#define new_localvarliteral(ls,v) \
+	new_localvarliteral_(ls, "" v, (sizeof(v)/sizeof(char))-1)
+
+
+static LocVar *getlocvar (FuncState *fs, int i) {
+  int idx = fs->ls->dyd->actvar.arr[fs->firstlocal + i].idx;
+  lua_assert(idx < fs->nlocvars);
+  return &fs->f->locvars[idx];
+}
+
+
+static void adjustlocalvars (LexState *ls, int nvars) {
+  FuncState *fs = ls->fs;
+  fs->nactvar = cast_byte(fs->nactvar + nvars);
+  for (; nvars; nvars--) {
+    getlocvar(fs, fs->nactvar - nvars)->startpc = fs->pc;
+  }
+}
+
+
+static void removevars (FuncState *fs, int tolevel) {
+  fs->ls->dyd->actvar.n -= (fs->nactvar - tolevel);
+  while (fs->nactvar > tolevel)
+    getlocvar(fs, --fs->nactvar)->endpc = fs->pc;
+}
+
+
+static int searchupvalue (FuncState *fs, TString *name) {
+  int i;
+  Upvaldesc *up = fs->f->upvalues;
+  for (i = 0; i < fs->nups; i++) {
+    if (eqstr(up[i].name, name)) return i;
+  }
+  return -1;  /* not found */
+}
+
+
+static int newupvalue (FuncState *fs, TString *name, expdesc *v) {
+  Proto *f = fs->f;
+  int oldsize = f->sizeupvalues;
+  checklimit(fs, fs->nups + 1, MAXUPVAL, "upvalues");
+  luaM_growvector(fs->ls->L, f->upvalues, fs->nups, f->sizeupvalues,
+                  Upvaldesc, MAXUPVAL, "upvalues");
+  while (oldsize < f->sizeupvalues)
+    f->upvalues[oldsize++].name = NULL;
+  f->upvalues[fs->nups].instack = (v->k == VLOCAL);
+  f->upvalues[fs->nups].idx = cast_byte(v->u.info);
+  f->upvalues[fs->nups].name = name;
+  luaC_objbarrier(fs->ls->L, f, name);
+  return fs->nups++;
+}
+
+
+static int searchvar (FuncState *fs, TString *n) {
+  int i;
+  for (i = cast_int(fs->nactvar) - 1; i >= 0; i--) {
+    if (eqstr(n, getlocvar(fs, i)->varname))
+      return i;
+  }
+  return -1;  /* not found */
+}
+
+
+/*
+  Mark block where variable at given level was defined
+  (to emit close instructions later).
+*/
+static void markupval (FuncState *fs, int level) {
+  BlockCnt *bl = fs->bl;
+  while (bl->nactvar > level)
+    bl = bl->previous;
+  bl->upval = 1;
+}
+
+
+/*
+  Find variable with given name 'n'. If it is an upvalue, add this
+  upvalue into all intermediate functions.
+*/
+static void singlevaraux (FuncState *fs, TString *n, expdesc *var, int base) {
+  if (fs == NULL)  /* no more levels? */
+    init_exp(var, VVOID, 0);  /* default is global */
+  else {
+    int v = searchvar(fs, n);  /* look up locals at current level */
+    if (v >= 0) {  /* found? */
+      init_exp(var, VLOCAL, v);  /* variable is local */
+      if (!base)
+        markupval(fs, v);  /* local will be used as an upval */
+    }
+    else {  /* not found as local at current level; try upvalues */
+      int idx = searchupvalue(fs, n);  /* try existing upvalues */
+      if (idx < 0) {  /* not found? */
+        singlevaraux(fs->prev, n, var, 0);  /* try upper levels */
+        if (var->k == VVOID)  /* not found? */
+          return;  /* it is a global */
+        /* else was LOCAL or UPVAL */
+        idx  = newupvalue(fs, n, var);  /* will be a new upvalue */
+      }
+      init_exp(var, VUPVAL, idx);  /* new or old upvalue */
+    }
+  }
+}
+
+
+static void singlevar (LexState *ls, expdesc *var) {
+  TString *varname = str_checkname(ls);
+  FuncState *fs = ls->fs;
+  singlevaraux(fs, varname, var, 1);
+  if (var->k == VVOID) {  /* global name? */
+    expdesc key;
+    singlevaraux(fs, ls->envn, var, 1);  /* get environment variable */
+    lua_assert(var->k != VVOID);  /* this one must exist */
+    codestring(ls, &key, varname);  /* key is variable name */
+    luaK_indexed(fs, var, &key);  /* env[varname] */
+  }
+}
+
+
+static void adjust_assign (LexState *ls, int nvars, int nexps, expdesc *e) {
+  FuncState *fs = ls->fs;
+  int extra = nvars - nexps;
+  if (hasmultret(e->k)) {
+    extra++;  /* includes call itself */
+    if (extra < 0) extra = 0;
+    luaK_setreturns(fs, e, extra);  /* last exp. provides the difference */
+    if (extra > 1) luaK_reserveregs(fs, extra-1);
+  }
+  else {
+    if (e->k != VVOID) luaK_exp2nextreg(fs, e);  /* close last expression */
+    if (extra > 0) {
+      int reg = fs->freereg;
+      luaK_reserveregs(fs, extra);
+      luaK_nil(fs, reg, extra);
+    }
+  }
+}
+
+
+static void enterlevel (LexState *ls) {
+  lua_State *L = ls->L;
+  ++L->nCcalls;
+  checklimit(ls->fs, L->nCcalls, LUAI_MAXCCALLS, "C levels");
+}
+
+
+#define leavelevel(ls)	((ls)->L->nCcalls--)
+
+
+static void closegoto (LexState *ls, int g, Labeldesc *label) {
+  int i;
+  FuncState *fs = ls->fs;
+  Labellist *gl = &ls->dyd->gt;
+  Labeldesc *gt = &gl->arr[g];
+  lua_assert(eqstr(gt->name, label->name));
+  if (gt->nactvar < label->nactvar) {
+    TString *vname = getlocvar(fs, gt->nactvar)->varname;
+    const char *msg = luaO_pushfstring(ls->L,
+      "<goto %s> at line %d jumps into the scope of local '%s'",
+      getstr(gt->name), gt->line, getstr(vname));
+    semerror(ls, msg);
+  }
+  luaK_patchlist(fs, gt->pc, label->pc);
+  /* remove goto from pending list */
+  for (i = g; i < gl->n - 1; i++)
+    gl->arr[i] = gl->arr[i + 1];
+  gl->n--;
+}
+
+
+/*
+** try to close a goto with existing labels; this solves backward jumps
+*/
+static int findlabel (LexState *ls, int g) {
+  int i;
+  BlockCnt *bl = ls->fs->bl;
+  Dyndata *dyd = ls->dyd;
+  Labeldesc *gt = &dyd->gt.arr[g];
+  /* check labels in current block for a match */
+  for (i = bl->firstlabel; i < dyd->label.n; i++) {
+    Labeldesc *lb = &dyd->label.arr[i];
+    if (eqstr(lb->name, gt->name)) {  /* correct label? */
+      if (gt->nactvar > lb->nactvar &&
+          (bl->upval || dyd->label.n > bl->firstlabel))
+        luaK_patchclose(ls->fs, gt->pc, lb->nactvar);
+      closegoto(ls, g, lb);  /* close it */
+      return 1;
+    }
+  }
+  return 0;  /* label not found; cannot close goto */
+}
+
+
+static int newlabelentry (LexState *ls, Labellist *l, TString *name,
+                          int line, int pc) {
+  int n = l->n;
+  luaM_growvector(ls->L, l->arr, n, l->size,
+                  Labeldesc, SHRT_MAX, "labels/gotos");
+  l->arr[n].name = name;
+  l->arr[n].line = line;
+  l->arr[n].nactvar = ls->fs->nactvar;
+  l->arr[n].pc = pc;
+  l->n = n + 1;
+  return n;
+}
+
+
+/*
+** check whether new label 'lb' matches any pending gotos in current
+** block; solves forward jumps
+*/
+static void findgotos (LexState *ls, Labeldesc *lb) {
+  Labellist *gl = &ls->dyd->gt;
+  int i = ls->fs->bl->firstgoto;
+  while (i < gl->n) {
+    if (eqstr(gl->arr[i].name, lb->name))
+      closegoto(ls, i, lb);
+    else
+      i++;
+  }
+}
+
+
+/*
+** export pending gotos to outer level, to check them against
+** outer labels; if the block being exited has upvalues, and
+** the goto exits the scope of any variable (which can be the
+** upvalue), close those variables being exited.
+*/
+static void movegotosout (FuncState *fs, BlockCnt *bl) {
+  int i = bl->firstgoto;
+  Labellist *gl = &fs->ls->dyd->gt;
+  /* correct pending gotos to current block and try to close it
+     with visible labels */
+  while (i < gl->n) {
+    Labeldesc *gt = &gl->arr[i];
+    if (gt->nactvar > bl->nactvar) {
+      if (bl->upval)
+        luaK_patchclose(fs, gt->pc, bl->nactvar);
+      gt->nactvar = bl->nactvar;
+    }
+    if (!findlabel(fs->ls, i))
+      i++;  /* move to next one */
+  }
+}
+
+
+static void enterblock (FuncState *fs, BlockCnt *bl, lu_byte isloop) {
+  bl->isloop = isloop;
+  bl->nactvar = fs->nactvar;
+  bl->firstlabel = fs->ls->dyd->label.n;
+  bl->firstgoto = fs->ls->dyd->gt.n;
+  bl->upval = 0;
+  bl->previous = fs->bl;
+  fs->bl = bl;
+  lua_assert(fs->freereg == fs->nactvar);
+}
+
+
+/*
+** create a label named 'break' to resolve break statements
+*/
+static void breaklabel (LexState *ls) {
+  TString *n = luaS_new(ls->L, "break");
+  int l = newlabelentry(ls, &ls->dyd->label, n, 0, ls->fs->pc);
+  findgotos(ls, &ls->dyd->label.arr[l]);
+}
+
+/*
+** generates an error for an undefined 'goto'; choose appropriate
+** message when label name is a reserved word (which can only be 'break')
+*/
+static l_noret undefgoto (LexState *ls, Labeldesc *gt) {
+  const char *msg = isreserved(gt->name)
+                    ? "<%s> at line %d not inside a loop"
+                    : "no visible label '%s' for <goto> at line %d";
+  msg = luaO_pushfstring(ls->L, msg, getstr(gt->name), gt->line);
+  semerror(ls, msg);
+}
+
+
+static void leaveblock (FuncState *fs) {
+  BlockCnt *bl = fs->bl;
+  LexState *ls = fs->ls;
+  if (bl->previous && bl->upval) {
+    /* create a 'jump to here' to close upvalues */
+    int j = luaK_jump(fs);
+    luaK_patchclose(fs, j, bl->nactvar);
+    luaK_patchtohere(fs, j);
+  }
+  if (bl->isloop)
+    breaklabel(ls);  /* close pending breaks */
+  fs->bl = bl->previous;
+  removevars(fs, bl->nactvar);
+  lua_assert(bl->nactvar == fs->nactvar);
+  fs->freereg = fs->nactvar;  /* free registers */
+  ls->dyd->label.n = bl->firstlabel;  /* remove local labels */
+  if (bl->previous)  /* inner block? */
+    movegotosout(fs, bl);  /* update pending gotos to outer block */
+  else if (bl->firstgoto < ls->dyd->gt.n)  /* pending gotos in outer block? */
+    undefgoto(ls, &ls->dyd->gt.arr[bl->firstgoto]);  /* error */
+}
+
+
+/*
+** adds a new prototype into list of prototypes
+*/
+static Proto *addprototype (LexState *ls) {
+  Proto *clp;
+  lua_State *L = ls->L;
+  FuncState *fs = ls->fs;
+  Proto *f = fs->f;  /* prototype of current function */
+  if (fs->np >= f->sizep) {
+    int oldsize = f->sizep;
+    luaM_growvector(L, f->p, fs->np, f->sizep, Proto *, MAXARG_Bx, "functions");
+    while (oldsize < f->sizep)
+      f->p[oldsize++] = NULL;
+  }
+  f->p[fs->np++] = clp = luaF_newproto(L);
+  luaC_objbarrier(L, f, clp);
+  return clp;
+}
+
+
+/*
+** codes instruction to create new closure in parent function.
+** The OP_CLOSURE instruction must use the last available register,
+** so that, if it invokes the GC, the GC knows which registers
+** are in use at that time.
+*/
+static void codeclosure (LexState *ls, expdesc *v) {
+  FuncState *fs = ls->fs->prev;
+  init_exp(v, VRELOCABLE, luaK_codeABx(fs, OP_CLOSURE, 0, fs->np - 1));
+  luaK_exp2nextreg(fs, v);  /* fix it at the last register */
+}
+
+
+static void open_func (LexState *ls, FuncState *fs, BlockCnt *bl) {
+  Proto *f;
+  fs->prev = ls->fs;  /* linked list of funcstates */
+  fs->ls = ls;
+  ls->fs = fs;
+  fs->pc = 0;
+  fs->lasttarget = 0;
+  fs->jpc = NO_JUMP;
+  fs->freereg = 0;
+  fs->nk = 0;
+  fs->np = 0;
+  fs->nups = 0;
+  fs->nlocvars = 0;
+  fs->nactvar = 0;
+  fs->firstlocal = ls->dyd->actvar.n;
+  fs->bl = NULL;
+  f = fs->f;
+  f->source = ls->source;
+  f->maxstacksize = 2;  /* registers 0/1 are always valid */
+  enterblock(fs, bl, 0);
+}
+
+
+static void close_func (LexState *ls) {
+  lua_State *L = ls->L;
+  FuncState *fs = ls->fs;
+  Proto *f = fs->f;
+  luaK_ret(fs, 0, 0);  /* final return */
+  leaveblock(fs);
+  luaM_reallocvector(L, f->code, f->sizecode, fs->pc, Instruction);
+  f->sizecode = fs->pc;
+  luaM_reallocvector(L, f->lineinfo, f->sizelineinfo, fs->pc, int);
+  f->sizelineinfo = fs->pc;
+  luaM_reallocvector(L, f->k, f->sizek, fs->nk, TValue);
+  f->sizek = fs->nk;
+  luaM_reallocvector(L, f->p, f->sizep, fs->np, Proto *);
+  f->sizep = fs->np;
+  luaM_reallocvector(L, f->locvars, f->sizelocvars, fs->nlocvars, LocVar);
+  f->sizelocvars = fs->nlocvars;
+  luaM_reallocvector(L, f->upvalues, f->sizeupvalues, fs->nups, Upvaldesc);
+  f->sizeupvalues = fs->nups;
+  lua_assert(fs->bl == NULL);
+  ls->fs = fs->prev;
+  luaC_checkGC(L);
+}
+
+
+
+/*============================================================*/
+/* GRAMMAR RULES */
+/*============================================================*/
+
+
+/*
+** check whether current token is in the follow set of a block.
+** 'until' closes syntactical blocks, but do not close scope,
+** so it is handled in separate.
+*/
+static int block_follow (LexState *ls, int withuntil) {
+  switch (ls->t.token) {
+    case TK_ELSE: case TK_ELSEIF:
+    case TK_END: case TK_EOS:
+      return 1;
+    case TK_UNTIL: return withuntil;
+    default: return 0;
+  }
+}
+
+
+static void statlist (LexState *ls) {
+  /* statlist -> { stat [';'] } */
+  while (!block_follow(ls, 1)) {
+    if (ls->t.token == TK_RETURN) {
+      statement(ls);
+      return;  /* 'return' must be last statement */
+    }
+    statement(ls);
+  }
+}
+
+
+static void fieldsel (LexState *ls, expdesc *v) {
+  /* fieldsel -> ['.' | ':'] NAME */
+  FuncState *fs = ls->fs;
+  expdesc key;
+  luaK_exp2anyregup(fs, v);
+  luaX_next(ls);  /* skip the dot or colon */
+  checkname(ls, &key);
+  luaK_indexed(fs, v, &key);
+}
+
+
+static void yindex (LexState *ls, expdesc *v) {
+  /* index -> '[' expr ']' */
+  luaX_next(ls);  /* skip the '[' */
+  expr(ls, v);
+  luaK_exp2val(ls->fs, v);
+  checknext(ls, ']');
+}
+
+
+/*
+** {======================================================================
+** Rules for Constructors
+** =======================================================================
+*/
+
+
+struct ConsControl {
+  expdesc v;  /* last list item read */
+  expdesc *t;  /* table descriptor */
+  int nh;  /* total number of 'record' elements */
+  int na;  /* total number of array elements */
+  int tostore;  /* number of array elements pending to be stored */
+};
+
+
+static void recfield (LexState *ls, struct ConsControl *cc) {
+  /* recfield -> (NAME | '['exp1']') = exp1 */
+  FuncState *fs = ls->fs;
+  int reg = ls->fs->freereg;
+  expdesc key, val;
+  int rkkey;
+  if (ls->t.token == TK_NAME) {
+    checklimit(fs, cc->nh, MAX_INT, "items in a constructor");
+    checkname(ls, &key);
+  }
+  else  /* ls->t.token == '[' */
+    yindex(ls, &key);
+  cc->nh++;
+  checknext(ls, '=');
+  rkkey = luaK_exp2RK(fs, &key);
+  expr(ls, &val);
+  luaK_codeABC(fs, OP_SETTABLE, cc->t->u.info, rkkey, luaK_exp2RK(fs, &val));
+  fs->freereg = reg;  /* free registers */
+}
+
+
+static void closelistfield (FuncState *fs, struct ConsControl *cc) {
+  if (cc->v.k == VVOID) return;  /* there is no list item */
+  luaK_exp2nextreg(fs, &cc->v);
+  cc->v.k = VVOID;
+  if (cc->tostore == LFIELDS_PER_FLUSH) {
+    luaK_setlist(fs, cc->t->u.info, cc->na, cc->tostore);  /* flush */
+    cc->tostore = 0;  /* no more items pending */
+  }
+}
+
+
+static void lastlistfield (FuncState *fs, struct ConsControl *cc) {
+  if (cc->tostore == 0) return;
+  if (hasmultret(cc->v.k)) {
+    luaK_setmultret(fs, &cc->v);
+    luaK_setlist(fs, cc->t->u.info, cc->na, LUA_MULTRET);
+    cc->na--;  /* do not count last expression (unknown number of elements) */
+  }
+  else {
+    if (cc->v.k != VVOID)
+      luaK_exp2nextreg(fs, &cc->v);
+    luaK_setlist(fs, cc->t->u.info, cc->na, cc->tostore);
+  }
+}
+
+
+static void listfield (LexState *ls, struct ConsControl *cc) {
+  /* listfield -> exp */
+  expr(ls, &cc->v);
+  checklimit(ls->fs, cc->na, MAX_INT, "items in a constructor");
+  cc->na++;
+  cc->tostore++;
+}
+
+
+static void field (LexState *ls, struct ConsControl *cc) {
+  /* field -> listfield | recfield */
+  switch(ls->t.token) {
+    case TK_NAME: {  /* may be 'listfield' or 'recfield' */
+      if (luaX_lookahead(ls) != '=')  /* expression? */
+        listfield(ls, cc);
+      else
+        recfield(ls, cc);
+      break;
+    }
+    case '[': {
+      recfield(ls, cc);
+      break;
+    }
+    default: {
+      listfield(ls, cc);
+      break;
+    }
+  }
+}
+
+
+static void constructor (LexState *ls, expdesc *t) {
+  /* constructor -> '{' [ field { sep field } [sep] ] '}'
+     sep -> ',' | ';' */
+  FuncState *fs = ls->fs;
+  int line = ls->linenumber;
+  int pc = luaK_codeABC(fs, OP_NEWTABLE, 0, 0, 0);
+  struct ConsControl cc;
+  cc.na = cc.nh = cc.tostore = 0;
+  cc.t = t;
+  init_exp(t, VRELOCABLE, pc);
+  init_exp(&cc.v, VVOID, 0);  /* no value (yet) */
+  luaK_exp2nextreg(ls->fs, t);  /* fix it at stack top */
+  checknext(ls, '{');
+  do {
+    lua_assert(cc.v.k == VVOID || cc.tostore > 0);
+    if (ls->t.token == '}') break;
+    closelistfield(fs, &cc);
+    field(ls, &cc);
+  } while (testnext(ls, ',') || testnext(ls, ';'));
+  check_match(ls, '}', '{', line);
+  lastlistfield(fs, &cc);
+  SETARG_B(fs->f->code[pc], luaO_int2fb(cc.na)); /* set initial array size */
+  SETARG_C(fs->f->code[pc], luaO_int2fb(cc.nh));  /* set initial table size */
+}
+
+/* }====================================================================== */
+
+
+
+static void parlist (LexState *ls) {
+  /* parlist -> [ param { ',' param } ] */
+  FuncState *fs = ls->fs;
+  Proto *f = fs->f;
+  int nparams = 0;
+  f->is_vararg = 0;
+  if (ls->t.token != ')') {  /* is 'parlist' not empty? */
+    do {
+      switch (ls->t.token) {
+        case TK_NAME: {  /* param -> NAME */
+          new_localvar(ls, str_checkname(ls));
+          nparams++;
+          break;
+        }
+        case TK_DOTS: {  /* param -> '...' */
+          luaX_next(ls);
+          f->is_vararg = 2;  /* declared vararg */
+          break;
+        }
+        default: luaX_syntaxerror(ls, "<name> or '...' expected");
+      }
+    } while (!f->is_vararg && testnext(ls, ','));
+  }
+  adjustlocalvars(ls, nparams);
+  f->numparams = cast_byte(fs->nactvar);
+  luaK_reserveregs(fs, fs->nactvar);  /* reserve register for parameters */
+}
+
+
+static void body (LexState *ls, expdesc *e, int ismethod, int line) {
+  /* body ->  '(' parlist ')' block END */
+  FuncState new_fs;
+  BlockCnt bl;
+  new_fs.f = addprototype(ls);
+  new_fs.f->linedefined = line;
+  open_func(ls, &new_fs, &bl);
+  checknext(ls, '(');
+  if (ismethod) {
+    new_localvarliteral(ls, "self");  /* create 'self' parameter */
+    adjustlocalvars(ls, 1);
+  }
+  parlist(ls);
+  checknext(ls, ')');
+  statlist(ls);
+  new_fs.f->lastlinedefined = ls->linenumber;
+  check_match(ls, TK_END, TK_FUNCTION, line);
+  codeclosure(ls, e);
+  close_func(ls);
+}
+
+
+static int explist (LexState *ls, expdesc *v) {
+  /* explist -> expr { ',' expr } */
+  int n = 1;  /* at least one expression */
+  expr(ls, v);
+  while (testnext(ls, ',')) {
+    luaK_exp2nextreg(ls->fs, v);
+    expr(ls, v);
+    n++;
+  }
+  return n;
+}
+
+
+static void funcargs (LexState *ls, expdesc *f, int line) {
+  FuncState *fs = ls->fs;
+  expdesc args;
+  int base, nparams;
+  switch (ls->t.token) {
+    case '(': {  /* funcargs -> '(' [ explist ] ')' */
+      luaX_next(ls);
+      if (ls->t.token == ')')  /* arg list is empty? */
+        args.k = VVOID;
+      else {
+        explist(ls, &args);
+        luaK_setmultret(fs, &args);
+      }
+      check_match(ls, ')', '(', line);
+      break;
+    }
+    case '{': {  /* funcargs -> constructor */
+      constructor(ls, &args);
+      break;
+    }
+    case TK_STRING: {  /* funcargs -> STRING */
+      codestring(ls, &args, ls->t.seminfo.ts);
+      luaX_next(ls);  /* must use 'seminfo' before 'next' */
+      break;
+    }
+    default: {
+      luaX_syntaxerror(ls, "function arguments expected");
+    }
+  }
+  lua_assert(f->k == VNONRELOC);
+  base = f->u.info;  /* base register for call */
+  if (hasmultret(args.k))
+    nparams = LUA_MULTRET;  /* open call */
+  else {
+    if (args.k != VVOID)
+      luaK_exp2nextreg(fs, &args);  /* close last argument */
+    nparams = fs->freereg - (base+1);
+  }
+  init_exp(f, VCALL, luaK_codeABC(fs, OP_CALL, base, nparams+1, 2));
+  luaK_fixline(fs, line);
+  fs->freereg = base+1;  /* call remove function and arguments and leaves
+                            (unless changed) one result */
+}
+
+
+
+
+/*
+** {======================================================================
+** Expression parsing
+** =======================================================================
+*/
+
+
+static void primaryexp (LexState *ls, expdesc *v) {
+  /* primaryexp -> NAME | '(' expr ')' */
+  switch (ls->t.token) {
+    case '(': {
+      int line = ls->linenumber;
+      luaX_next(ls);
+      expr(ls, v);
+      check_match(ls, ')', '(', line);
+      luaK_dischargevars(ls->fs, v);
+      return;
+    }
+    case TK_NAME: {
+      singlevar(ls, v);
+      return;
+    }
+    default: {
+      luaX_syntaxerror(ls, "unexpected symbol");
+    }
+  }
+}
+
+
+static void suffixedexp (LexState *ls, expdesc *v) {
+  /* suffixedexp ->
+       primaryexp { '.' NAME | '[' exp ']' | ':' NAME funcargs | funcargs } */
+  FuncState *fs = ls->fs;
+  int line = ls->linenumber;
+  primaryexp(ls, v);
+  for (;;) {
+    switch (ls->t.token) {
+      case '.': {  /* fieldsel */
+        fieldsel(ls, v);
+        break;
+      }
+      case '[': {  /* '[' exp1 ']' */
+        expdesc key;
+        luaK_exp2anyregup(fs, v);
+        yindex(ls, &key);
+        luaK_indexed(fs, v, &key);
+        break;
+      }
+      case ':': {  /* ':' NAME funcargs */
+        expdesc key;
+        luaX_next(ls);
+        checkname(ls, &key);
+        luaK_self(fs, v, &key);
+        funcargs(ls, v, line);
+        break;
+      }
+      case '(': case TK_STRING: case '{': {  /* funcargs */
+        luaK_exp2nextreg(fs, v);
+        funcargs(ls, v, line);
+        break;
+      }
+      default: return;
+    }
+  }
+}
+
+
+static void simpleexp (LexState *ls, expdesc *v) {
+  /* simpleexp -> FLT | INT | STRING | NIL | TRUE | FALSE | ... |
+                  constructor | FUNCTION body | suffixedexp */
+  switch (ls->t.token) {
+    case TK_FLT: {
+      init_exp(v, VKFLT, 0);
+      v->u.nval = ls->t.seminfo.r;
+      break;
+    }
+    case TK_INT: {
+      init_exp(v, VKINT, 0);
+      v->u.ival = ls->t.seminfo.i;
+      break;
+    }
+    case TK_STRING: {
+      codestring(ls, v, ls->t.seminfo.ts);
+      break;
+    }
+    case TK_NIL: {
+      init_exp(v, VNIL, 0);
+      break;
+    }
+    case TK_TRUE: {
+      init_exp(v, VTRUE, 0);
+      break;
+    }
+    case TK_FALSE: {
+      init_exp(v, VFALSE, 0);
+      break;
+    }
+    case TK_DOTS: {  /* vararg */
+      FuncState *fs = ls->fs;
+      check_condition(ls, fs->f->is_vararg,
+                      "cannot use '...' outside a vararg function");
+      fs->f->is_vararg = 1;  /* function actually uses vararg */
+      init_exp(v, VVARARG, luaK_codeABC(fs, OP_VARARG, 0, 1, 0));
+      break;
+    }
+    case '{': {  /* constructor */
+      constructor(ls, v);
+      return;
+    }
+    case TK_FUNCTION: {
+      luaX_next(ls);
+      body(ls, v, 0, ls->linenumber);
+      return;
+    }
+    default: {
+      suffixedexp(ls, v);
+      return;
+    }
+  }
+  luaX_next(ls);
+}
+
+
+static UnOpr getunopr (int op) {
+  switch (op) {
+    case TK_NOT: return OPR_NOT;
+    case '-': return OPR_MINUS;
+    case '~': return OPR_BNOT;
+    case '#': return OPR_LEN;
+    default: return OPR_NOUNOPR;
+  }
+}
+
+
+static BinOpr getbinopr (int op) {
+  switch (op) {
+    case '+': return OPR_ADD;
+    case '-': return OPR_SUB;
+    case '*': return OPR_MUL;
+    case '%': return OPR_MOD;
+    case '^': return OPR_POW;
+    case '/': return OPR_DIV;
+    case TK_IDIV: return OPR_IDIV;
+    case '&': return OPR_BAND;
+    case '|': return OPR_BOR;
+    case '~': return OPR_BXOR;
+    case TK_SHL: return OPR_SHL;
+    case TK_SHR: return OPR_SHR;
+    case TK_CONCAT: return OPR_CONCAT;
+    case TK_NE: return OPR_NE;
+    case TK_EQ: return OPR_EQ;
+    case '<': return OPR_LT;
+    case TK_LE: return OPR_LE;
+    case '>': return OPR_GT;
+    case TK_GE: return OPR_GE;
+    case TK_AND: return OPR_AND;
+    case TK_OR: return OPR_OR;
+    default: return OPR_NOBINOPR;
+  }
+}
+
+
+static const struct {
+  lu_byte left;  /* left priority for each binary operator */
+  lu_byte right; /* right priority */
+} priority[] = {  /* ORDER OPR */
+   {10, 10}, {10, 10},           /* '+' '-' */
+   {11, 11}, {11, 11},           /* '*' '%' */
+   {14, 13},                  /* '^' (right associative) */
+   {11, 11}, {11, 11},           /* '/' '//' */
+   {6, 6}, {4, 4}, {5, 5},   /* '&' '|' '~' */
+   {7, 7}, {7, 7},           /* '<<' '>>' */
+   {9, 8},                   /* '..' (right associative) */
+   {3, 3}, {3, 3}, {3, 3},   /* ==, <, <= */
+   {3, 3}, {3, 3}, {3, 3},   /* ~=, >, >= */
+   {2, 2}, {1, 1}            /* and, or */
+};
+
+#define UNARY_PRIORITY	12  /* priority for unary operators */
+
+
+/*
+** subexpr -> (simpleexp | unop subexpr) { binop subexpr }
+** where 'binop' is any binary operator with a priority higher than 'limit'
+*/
+static BinOpr subexpr (LexState *ls, expdesc *v, int limit) {
+  BinOpr op;
+  UnOpr uop;
+  enterlevel(ls);
+  uop = getunopr(ls->t.token);
+  if (uop != OPR_NOUNOPR) {
+    int line = ls->linenumber;
+    luaX_next(ls);
+    subexpr(ls, v, UNARY_PRIORITY);
+    luaK_prefix(ls->fs, uop, v, line);
+  }
+  else simpleexp(ls, v);
+  /* expand while operators have priorities higher than 'limit' */
+  op = getbinopr(ls->t.token);
+  while (op != OPR_NOBINOPR && priority[op].left > limit) {
+    expdesc v2;
+    BinOpr nextop;
+    int line = ls->linenumber;
+    luaX_next(ls);
+    luaK_infix(ls->fs, op, v);
+    /* read sub-expression with higher priority */
+    nextop = subexpr(ls, &v2, priority[op].right);
+    luaK_posfix(ls->fs, op, v, &v2, line);
+    op = nextop;
+  }
+  leavelevel(ls);
+  return op;  /* return first untreated operator */
+}
+
+
+static void expr (LexState *ls, expdesc *v) {
+  subexpr(ls, v, 0);
+}
+
+/* }==================================================================== */
+
+
+
+/*
+** {======================================================================
+** Rules for Statements
+** =======================================================================
+*/
+
+
+static void block (LexState *ls) {
+  /* block -> statlist */
+  FuncState *fs = ls->fs;
+  BlockCnt bl;
+  enterblock(fs, &bl, 0);
+  statlist(ls);
+  leaveblock(fs);
+}
+
+
+/*
+** structure to chain all variables in the left-hand side of an
+** assignment
+*/
+struct LHS_assign {
+  struct LHS_assign *prev;
+  expdesc v;  /* variable (global, local, upvalue, or indexed) */
+};
+
+
+/*
+** check whether, in an assignment to an upvalue/local variable, the
+** upvalue/local variable is begin used in a previous assignment to a
+** table. If so, save original upvalue/local value in a safe place and
+** use this safe copy in the previous assignment.
+*/
+static void check_conflict (LexState *ls, struct LHS_assign *lh, expdesc *v) {
+  FuncState *fs = ls->fs;
+  int extra = fs->freereg;  /* eventual position to save local variable */
+  int conflict = 0;
+  for (; lh; lh = lh->prev) {  /* check all previous assignments */
+    if (lh->v.k == VINDEXED) {  /* assigning to a table? */
+      /* table is the upvalue/local being assigned now? */
+      if (lh->v.u.ind.vt == v->k && lh->v.u.ind.t == v->u.info) {
+        conflict = 1;
+        lh->v.u.ind.vt = VLOCAL;
+        lh->v.u.ind.t = extra;  /* previous assignment will use safe copy */
+      }
+      /* index is the local being assigned? (index cannot be upvalue) */
+      if (v->k == VLOCAL && lh->v.u.ind.idx == v->u.info) {
+        conflict = 1;
+        lh->v.u.ind.idx = extra;  /* previous assignment will use safe copy */
+      }
+    }
+  }
+  if (conflict) {
+    /* copy upvalue/local value to a temporary (in position 'extra') */
+    OpCode op = (v->k == VLOCAL) ? OP_MOVE : OP_GETUPVAL;
+    luaK_codeABC(fs, op, extra, v->u.info, 0);
+    luaK_reserveregs(fs, 1);
+  }
+}
+
+
+static void assignment (LexState *ls, struct LHS_assign *lh, int nvars) {
+  expdesc e;
+  check_condition(ls, vkisvar(lh->v.k), "syntax error");
+  if (testnext(ls, ',')) {  /* assignment -> ',' suffixedexp assignment */
+    struct LHS_assign nv;
+    nv.prev = lh;
+    suffixedexp(ls, &nv.v);
+    if (nv.v.k != VINDEXED)
+      check_conflict(ls, lh, &nv.v);
+    checklimit(ls->fs, nvars + ls->L->nCcalls, LUAI_MAXCCALLS,
+                    "C levels");
+    assignment(ls, &nv, nvars+1);
+  }
+  else {  /* assignment -> '=' explist */
+    int nexps;
+    checknext(ls, '=');
+    nexps = explist(ls, &e);
+    if (nexps != nvars) {
+      adjust_assign(ls, nvars, nexps, &e);
+      if (nexps > nvars)
+        ls->fs->freereg -= nexps - nvars;  /* remove extra values */
+    }
+    else {
+      luaK_setoneret(ls->fs, &e);  /* close last expression */
+      luaK_storevar(ls->fs, &lh->v, &e);
+      return;  /* avoid default */
+    }
+  }
+  init_exp(&e, VNONRELOC, ls->fs->freereg-1);  /* default assignment */
+  luaK_storevar(ls->fs, &lh->v, &e);
+}
+
+
+static int cond (LexState *ls) {
+  /* cond -> exp */
+  expdesc v;
+  expr(ls, &v);  /* read condition */
+  if (v.k == VNIL) v.k = VFALSE;  /* 'falses' are all equal here */
+  luaK_goiftrue(ls->fs, &v);
+  return v.f;
+}
+
+
+static void gotostat (LexState *ls, int pc) {
+  int line = ls->linenumber;
+  TString *label;
+  int g;
+  if (testnext(ls, TK_GOTO))
+    label = str_checkname(ls);
+  else {
+    luaX_next(ls);  /* skip break */
+    label = luaS_new(ls->L, "break");
+  }
+  g = newlabelentry(ls, &ls->dyd->gt, label, line, pc);
+  findlabel(ls, g);  /* close it if label already defined */
+}
+
+
+/* check for repeated labels on the same block */
+static void checkrepeated (FuncState *fs, Labellist *ll, TString *label) {
+  int i;
+  for (i = fs->bl->firstlabel; i < ll->n; i++) {
+    if (eqstr(label, ll->arr[i].name)) {
+      const char *msg = luaO_pushfstring(fs->ls->L,
+                          "label '%s' already defined on line %d",
+                          getstr(label), ll->arr[i].line);
+      semerror(fs->ls, msg);
+    }
+  }
+}
+
+
+/* skip no-op statements */
+static void skipnoopstat (LexState *ls) {
+  while (ls->t.token == ';' || ls->t.token == TK_DBCOLON)
+    statement(ls);
+}
+
+
+static void labelstat (LexState *ls, TString *label, int line) {
+  /* label -> '::' NAME '::' */
+  FuncState *fs = ls->fs;
+  Labellist *ll = &ls->dyd->label;
+  int l;  /* index of new label being created */
+  checkrepeated(fs, ll, label);  /* check for repeated labels */
+  checknext(ls, TK_DBCOLON);  /* skip double colon */
+  /* create new entry for this label */
+  l = newlabelentry(ls, ll, label, line, luaK_getlabel(fs));
+  skipnoopstat(ls);  /* skip other no-op statements */
+  if (block_follow(ls, 0)) {  /* label is last no-op statement in the block? */
+    /* assume that locals are already out of scope */
+    ll->arr[l].nactvar = fs->bl->nactvar;
+  }
+  findgotos(ls, &ll->arr[l]);
+}
+
+
+static void whilestat (LexState *ls, int line) {
+  /* whilestat -> WHILE cond DO block END */
+  FuncState *fs = ls->fs;
+  int whileinit;
+  int condexit;
+  BlockCnt bl;
+  luaX_next(ls);  /* skip WHILE */
+  whileinit = luaK_getlabel(fs);
+  condexit = cond(ls);
+  enterblock(fs, &bl, 1);
+  checknext(ls, TK_DO);
+  block(ls);
+  luaK_jumpto(fs, whileinit);
+  check_match(ls, TK_END, TK_WHILE, line);
+  leaveblock(fs);
+  luaK_patchtohere(fs, condexit);  /* false conditions finish the loop */
+}
+
+
+static void repeatstat (LexState *ls, int line) {
+  /* repeatstat -> REPEAT block UNTIL cond */
+  int condexit;
+  FuncState *fs = ls->fs;
+  int repeat_init = luaK_getlabel(fs);
+  BlockCnt bl1, bl2;
+  enterblock(fs, &bl1, 1);  /* loop block */
+  enterblock(fs, &bl2, 0);  /* scope block */
+  luaX_next(ls);  /* skip REPEAT */
+  statlist(ls);
+  check_match(ls, TK_UNTIL, TK_REPEAT, line);
+  condexit = cond(ls);  /* read condition (inside scope block) */
+  if (bl2.upval)  /* upvalues? */
+    luaK_patchclose(fs, condexit, bl2.nactvar);
+  leaveblock(fs);  /* finish scope */
+  luaK_patchlist(fs, condexit, repeat_init);  /* close the loop */
+  leaveblock(fs);  /* finish loop */
+}
+
+
+static int exp1 (LexState *ls) {
+  expdesc e;
+  int reg;
+  expr(ls, &e);
+  luaK_exp2nextreg(ls->fs, &e);
+  lua_assert(e.k == VNONRELOC);
+  reg = e.u.info;
+  return reg;
+}
+
+
+static void forbody (LexState *ls, int base, int line, int nvars, int isnum) {
+  /* forbody -> DO block */
+  BlockCnt bl;
+  FuncState *fs = ls->fs;
+  int prep, endfor;
+  adjustlocalvars(ls, 3);  /* control variables */
+  checknext(ls, TK_DO);
+  prep = isnum ? luaK_codeAsBx(fs, OP_FORPREP, base, NO_JUMP) : luaK_jump(fs);
+  enterblock(fs, &bl, 0);  /* scope for declared variables */
+  adjustlocalvars(ls, nvars);
+  luaK_reserveregs(fs, nvars);
+  block(ls);
+  leaveblock(fs);  /* end of scope for declared variables */
+  luaK_patchtohere(fs, prep);
+  if (isnum)  /* numeric for? */
+    endfor = luaK_codeAsBx(fs, OP_FORLOOP, base, NO_JUMP);
+  else {  /* generic for */
+    luaK_codeABC(fs, OP_TFORCALL, base, 0, nvars);
+    luaK_fixline(fs, line);
+    endfor = luaK_codeAsBx(fs, OP_TFORLOOP, base + 2, NO_JUMP);
+  }
+  luaK_patchlist(fs, endfor, prep + 1);
+  luaK_fixline(fs, line);
+}
+
+
+static void fornum (LexState *ls, TString *varname, int line) {
+  /* fornum -> NAME = exp1,exp1[,exp1] forbody */
+  FuncState *fs = ls->fs;
+  int base = fs->freereg;
+  new_localvarliteral(ls, "(for index)");
+  new_localvarliteral(ls, "(for limit)");
+  new_localvarliteral(ls, "(for step)");
+  new_localvar(ls, varname);
+  checknext(ls, '=');
+  exp1(ls);  /* initial value */
+  checknext(ls, ',');
+  exp1(ls);  /* limit */
+  if (testnext(ls, ','))
+    exp1(ls);  /* optional step */
+  else {  /* default step = 1 */
+    luaK_codek(fs, fs->freereg, luaK_intK(fs, 1));
+    luaK_reserveregs(fs, 1);
+  }
+  forbody(ls, base, line, 1, 1);
+}
+
+
+static void forlist (LexState *ls, TString *indexname) {
+  /* forlist -> NAME {,NAME} IN explist forbody */
+  FuncState *fs = ls->fs;
+  expdesc e;
+  int nvars = 4;  /* gen, state, control, plus at least one declared var */
+  int line;
+  int base = fs->freereg;
+  /* create control variables */
+  new_localvarliteral(ls, "(for generator)");
+  new_localvarliteral(ls, "(for state)");
+  new_localvarliteral(ls, "(for control)");
+  /* create declared variables */
+  new_localvar(ls, indexname);
+  while (testnext(ls, ',')) {
+    new_localvar(ls, str_checkname(ls));
+    nvars++;
+  }
+  checknext(ls, TK_IN);
+  line = ls->linenumber;
+  adjust_assign(ls, 3, explist(ls, &e), &e);
+  luaK_checkstack(fs, 3);  /* extra space to call generator */
+  forbody(ls, base, line, nvars - 3, 0);
+}
+
+
+static void forstat (LexState *ls, int line) {
+  /* forstat -> FOR (fornum | forlist) END */
+  FuncState *fs = ls->fs;
+  TString *varname;
+  BlockCnt bl;
+  enterblock(fs, &bl, 1);  /* scope for loop and control variables */
+  luaX_next(ls);  /* skip 'for' */
+  varname = str_checkname(ls);  /* first variable name */
+  switch (ls->t.token) {
+    case '=': fornum(ls, varname, line); break;
+    case ',': case TK_IN: forlist(ls, varname); break;
+    default: luaX_syntaxerror(ls, "'=' or 'in' expected");
+  }
+  check_match(ls, TK_END, TK_FOR, line);
+  leaveblock(fs);  /* loop scope ('break' jumps to this point) */
+}
+
+
+static void test_then_block (LexState *ls, int *escapelist) {
+  /* test_then_block -> [IF | ELSEIF] cond THEN block */
+  BlockCnt bl;
+  FuncState *fs = ls->fs;
+  expdesc v;
+  int jf;  /* instruction to skip 'then' code (if condition is false) */
+  luaX_next(ls);  /* skip IF or ELSEIF */
+  expr(ls, &v);  /* read condition */
+  checknext(ls, TK_THEN);
+  if (ls->t.token == TK_GOTO || ls->t.token == TK_BREAK) {
+    luaK_goiffalse(ls->fs, &v);  /* will jump to label if condition is true */
+    enterblock(fs, &bl, 0);  /* must enter block before 'goto' */
+    gotostat(ls, v.t);  /* handle goto/break */
+    skipnoopstat(ls);  /* skip other no-op statements */
+    if (block_follow(ls, 0)) {  /* 'goto' is the entire block? */
+      leaveblock(fs);
+      return;  /* and that is it */
+    }
+    else  /* must skip over 'then' part if condition is false */
+      jf = luaK_jump(fs);
+  }
+  else {  /* regular case (not goto/break) */
+    luaK_goiftrue(ls->fs, &v);  /* skip over block if condition is false */
+    enterblock(fs, &bl, 0);
+    jf = v.f;
+  }
+  statlist(ls);  /* 'then' part */
+  leaveblock(fs);
+  if (ls->t.token == TK_ELSE ||
+      ls->t.token == TK_ELSEIF)  /* followed by 'else'/'elseif'? */
+    luaK_concat(fs, escapelist, luaK_jump(fs));  /* must jump over it */
+  luaK_patchtohere(fs, jf);
+}
+
+
+static void ifstat (LexState *ls, int line) {
+  /* ifstat -> IF cond THEN block {ELSEIF cond THEN block} [ELSE block] END */
+  FuncState *fs = ls->fs;
+  int escapelist = NO_JUMP;  /* exit list for finished parts */
+  test_then_block(ls, &escapelist);  /* IF cond THEN block */
+  while (ls->t.token == TK_ELSEIF)
+    test_then_block(ls, &escapelist);  /* ELSEIF cond THEN block */
+  if (testnext(ls, TK_ELSE))
+    block(ls);  /* 'else' part */
+  check_match(ls, TK_END, TK_IF, line);
+  luaK_patchtohere(fs, escapelist);  /* patch escape list to 'if' end */
+}
+
+
+static void localfunc (LexState *ls) {
+  expdesc b;
+  FuncState *fs = ls->fs;
+  new_localvar(ls, str_checkname(ls));  /* new local variable */
+  adjustlocalvars(ls, 1);  /* enter its scope */
+  body(ls, &b, 0, ls->linenumber);  /* function created in next register */
+  /* debug information will only see the variable after this point! */
+  getlocvar(fs, b.u.info)->startpc = fs->pc;
+}
+
+
+static void localstat (LexState *ls) {
+  /* stat -> LOCAL NAME {',' NAME} ['=' explist] */
+  int nvars = 0;
+  int nexps;
+  expdesc e;
+  do {
+    new_localvar(ls, str_checkname(ls));
+    nvars++;
+  } while (testnext(ls, ','));
+  if (testnext(ls, '='))
+    nexps = explist(ls, &e);
+  else {
+    e.k = VVOID;
+    nexps = 0;
+  }
+  adjust_assign(ls, nvars, nexps, &e);
+  adjustlocalvars(ls, nvars);
+}
+
+
+static int funcname (LexState *ls, expdesc *v) {
+  /* funcname -> NAME {fieldsel} [':' NAME] */
+  int ismethod = 0;
+  singlevar(ls, v);
+  while (ls->t.token == '.')
+    fieldsel(ls, v);
+  if (ls->t.token == ':') {
+    ismethod = 1;
+    fieldsel(ls, v);
+  }
+  return ismethod;
+}
+
+
+static void funcstat (LexState *ls, int line) {
+  /* funcstat -> FUNCTION funcname body */
+  int ismethod;
+  expdesc v, b;
+  luaX_next(ls);  /* skip FUNCTION */
+  ismethod = funcname(ls, &v);
+  body(ls, &b, ismethod, line);
+  luaK_storevar(ls->fs, &v, &b);
+  luaK_fixline(ls->fs, line);  /* definition "happens" in the first line */
+}
+
+
+static void exprstat (LexState *ls) {
+  /* stat -> func | assignment */
+  FuncState *fs = ls->fs;
+  struct LHS_assign v;
+  suffixedexp(ls, &v.v);
+  if (ls->t.token == '=' || ls->t.token == ',') { /* stat -> assignment ? */
+    v.prev = NULL;
+    assignment(ls, &v, 1);
+  }
+  else {  /* stat -> func */
+    check_condition(ls, v.v.k == VCALL, "syntax error");
+    SETARG_C(getinstruction(fs, &v.v), 1);  /* call statement uses no results */
+  }
+}
+
+
+static void retstat (LexState *ls) {
+  /* stat -> RETURN [explist] [';'] */
+  FuncState *fs = ls->fs;
+  expdesc e;
+  int first, nret;  /* registers with returned values */
+  if (block_follow(ls, 1) || ls->t.token == ';')
+    first = nret = 0;  /* return no values */
+  else {
+    nret = explist(ls, &e);  /* optional return values */
+    if (hasmultret(e.k)) {
+      luaK_setmultret(fs, &e);
+      if (e.k == VCALL && nret == 1) {  /* tail call? */
+        SET_OPCODE(getinstruction(fs,&e), OP_TAILCALL);
+        lua_assert(GETARG_A(getinstruction(fs,&e)) == fs->nactvar);
+      }
+      first = fs->nactvar;
+      nret = LUA_MULTRET;  /* return all values */
+    }
+    else {
+      if (nret == 1)  /* only one single value? */
+        first = luaK_exp2anyreg(fs, &e);
+      else {
+        luaK_exp2nextreg(fs, &e);  /* values must go to the stack */
+        first = fs->nactvar;  /* return all active values */
+        lua_assert(nret == fs->freereg - first);
+      }
+    }
+  }
+  luaK_ret(fs, first, nret);
+  testnext(ls, ';');  /* skip optional semicolon */
+}
+
+
+static void statement (LexState *ls) {
+  int line = ls->linenumber;  /* may be needed for error messages */
+  enterlevel(ls);
+  switch (ls->t.token) {
+    case ';': {  /* stat -> ';' (empty statement) */
+      luaX_next(ls);  /* skip ';' */
+      break;
+    }
+    case TK_IF: {  /* stat -> ifstat */
+      ifstat(ls, line);
+      break;
+    }
+    case TK_WHILE: {  /* stat -> whilestat */
+      whilestat(ls, line);
+      break;
+    }
+    case TK_DO: {  /* stat -> DO block END */
+      luaX_next(ls);  /* skip DO */
+      block(ls);
+      check_match(ls, TK_END, TK_DO, line);
+      break;
+    }
+    case TK_FOR: {  /* stat -> forstat */
+      forstat(ls, line);
+      break;
+    }
+    case TK_REPEAT: {  /* stat -> repeatstat */
+      repeatstat(ls, line);
+      break;
+    }
+    case TK_FUNCTION: {  /* stat -> funcstat */
+      funcstat(ls, line);
+      break;
+    }
+    case TK_LOCAL: {  /* stat -> localstat */
+      luaX_next(ls);  /* skip LOCAL */
+      if (testnext(ls, TK_FUNCTION))  /* local function? */
+        localfunc(ls);
+      else
+        localstat(ls);
+      break;
+    }
+    case TK_DBCOLON: {  /* stat -> label */
+      luaX_next(ls);  /* skip double colon */
+      labelstat(ls, str_checkname(ls), line);
+      break;
+    }
+    case TK_RETURN: {  /* stat -> retstat */
+      luaX_next(ls);  /* skip RETURN */
+      retstat(ls);
+      break;
+    }
+    case TK_BREAK:   /* stat -> breakstat */
+    case TK_GOTO: {  /* stat -> 'goto' NAME */
+      gotostat(ls, luaK_jump(ls->fs));
+      break;
+    }
+    default: {  /* stat -> func | assignment */
+      exprstat(ls);
+      break;
+    }
+  }
+  lua_assert(ls->fs->f->maxstacksize >= ls->fs->freereg &&
+             ls->fs->freereg >= ls->fs->nactvar);
+  ls->fs->freereg = ls->fs->nactvar;  /* free registers */
+  leavelevel(ls);
+}
+
+/* }====================================================================== */
+
+
+/*
+** compiles the main function, which is a regular vararg function with an
+** upvalue named LUA_ENV
+*/
+static void mainfunc (LexState *ls, FuncState *fs) {
+  BlockCnt bl;
+  expdesc v;
+  open_func(ls, fs, &bl);
+  fs->f->is_vararg = 2;  /* main function is always declared vararg */
+  init_exp(&v, VLOCAL, 0);  /* create and... */
+  newupvalue(fs, ls->envn, &v);  /* ...set environment upvalue */
+  luaX_next(ls);  /* read first token */
+  statlist(ls);  /* parse main body */
+  check(ls, TK_EOS);
+  close_func(ls);
+}
+
+
+LClosure *luaY_parser (lua_State *L, ZIO *z, Mbuffer *buff,
+                       Dyndata *dyd, const char *name, int firstchar) {
+  LexState lexstate;
+  FuncState funcstate;
+  LClosure *cl = luaF_newLclosure(L, 1);  /* create main closure */
+  setclLvalue(L, L->top, cl);  /* anchor it (to avoid being collected) */
+  luaD_inctop(L);
+  lexstate.h = luaH_new(L);  /* create table for scanner */
+  sethvalue(L, L->top, lexstate.h);  /* anchor it */
+  luaD_inctop(L);
+  funcstate.f = cl->p = luaF_newproto(L);
+  funcstate.f->source = luaS_new(L, name);  /* create and anchor TString */
+  lua_assert(iswhite(funcstate.f));  /* do not need barrier here */
+  lexstate.buff = buff;
+  lexstate.dyd = dyd;
+  dyd->actvar.n = dyd->gt.n = dyd->label.n = 0;
+  luaX_setinput(L, &lexstate, z, funcstate.f->source, firstchar);
+  mainfunc(&lexstate, &funcstate);
+  lua_assert(!funcstate.prev && funcstate.nups == 1 && !lexstate.fs);
+  /* all scopes should be correctly finished */
+  lua_assert(dyd->actvar.n == 0 && dyd->gt.n == 0 && dyd->label.n == 0);
+  L->top--;  /* remove scanner's table */
+  return cl;  /* closure is on the stack, too */
+}
+
diff --git a/libs/lua/lua-5.3.3/lparser.h b/libs/lua/lua-5.3.3/lparser.h
new file mode 100644
index 0000000..02e9b03
--- /dev/null
+++ b/libs/lua/lua-5.3.3/lparser.h
@@ -0,0 +1,133 @@
+/*
+** $Id: lparser.h,v 1.76 2015/12/30 18:16:13 roberto Exp $
+** Lua Parser
+** See Copyright Notice in lua.h
+*/
+
+#ifndef lparser_h
+#define lparser_h
+
+#include "llimits.h"
+#include "lobject.h"
+#include "lzio.h"
+
+
+/*
+** Expression and variable descriptor.
+** Code generation for variables and expressions can be delayed to allow
+** optimizations; An 'expdesc' structure describes a potentially-delayed
+** variable/expression. It has a description of its "main" value plus a
+** list of conditional jumps that can also produce its value (generated
+** by short-circuit operators 'and'/'or').
+*/
+
+/* kinds of variables/expressions */
+typedef enum {
+  VVOID,  /* when 'expdesc' describes the last expression a list,
+             this kind means an empty list (so, no expression) */
+  VNIL,  /* constant nil */
+  VTRUE,  /* constant true */
+  VFALSE,  /* constant false */
+  VK,  /* constant in 'k'; info = index of constant in 'k' */
+  VKFLT,  /* floating constant; nval = numerical float value */
+  VKINT,  /* integer constant; nval = numerical integer value */
+  VNONRELOC,  /* expression has its value in a fixed register;
+                 info = result register */
+  VLOCAL,  /* local variable; info = local register */
+  VUPVAL,  /* upvalue variable; info = index of upvalue in 'upvalues' */
+  VINDEXED,  /* indexed variable;
+                ind.vt = whether 't' is register or upvalue;
+                ind.t = table register or upvalue;
+                ind.idx = key's R/K index */
+  VJMP,  /* expression is a test/comparison;
+            info = pc of corresponding jump instruction */
+  VRELOCABLE,  /* expression can put result in any register;
+                  info = instruction pc */
+  VCALL,  /* expression is a function call; info = instruction pc */
+  VVARARG  /* vararg expression; info = instruction pc */
+} expkind;
+
+
+#define vkisvar(k)	(VLOCAL <= (k) && (k) <= VINDEXED)
+#define vkisinreg(k)	((k) == VNONRELOC || (k) == VLOCAL)
+
+typedef struct expdesc {
+  expkind k;
+  union {
+    lua_Integer ival;    /* for VKINT */
+    lua_Number nval;  /* for VKFLT */
+    int info;  /* for generic use */
+    struct {  /* for indexed variables (VINDEXED) */
+      short idx;  /* index (R/K) */
+      lu_byte t;  /* table (register or upvalue) */
+      lu_byte vt;  /* whether 't' is register (VLOCAL) or upvalue (VUPVAL) */
+    } ind;
+  } u;
+  int t;  /* patch list of 'exit when true' */
+  int f;  /* patch list of 'exit when false' */
+} expdesc;
+
+
+/* description of active local variable */
+typedef struct Vardesc {
+  short idx;  /* variable index in stack */
+} Vardesc;
+
+
+/* description of pending goto statements and label statements */
+typedef struct Labeldesc {
+  TString *name;  /* label identifier */
+  int pc;  /* position in code */
+  int line;  /* line where it appeared */
+  lu_byte nactvar;  /* local level where it appears in current block */
+} Labeldesc;
+
+
+/* list of labels or gotos */
+typedef struct Labellist {
+  Labeldesc *arr;  /* array */
+  int n;  /* number of entries in use */
+  int size;  /* array size */
+} Labellist;
+
+
+/* dynamic structures used by the parser */
+typedef struct Dyndata {
+  struct {  /* list of active local variables */
+    Vardesc *arr;
+    int n;
+    int size;
+  } actvar;
+  Labellist gt;  /* list of pending gotos */
+  Labellist label;   /* list of active labels */
+} Dyndata;
+
+
+/* control of blocks */
+struct BlockCnt;  /* defined in lparser.c */
+
+
+/* state needed to generate code for a given function */
+typedef struct FuncState {
+  Proto *f;  /* current function header */
+  struct FuncState *prev;  /* enclosing function */
+  struct LexState *ls;  /* lexical state */
+  struct BlockCnt *bl;  /* chain of current blocks */
+  int pc;  /* next position to code (equivalent to 'ncode') */
+  int lasttarget;   /* 'label' of last 'jump label' */
+  int jpc;  /* list of pending jumps to 'pc' */
+  int nk;  /* number of elements in 'k' */
+  int np;  /* number of elements in 'p' */
+  int firstlocal;  /* index of first local var (in Dyndata array) */
+  short nlocvars;  /* number of elements in 'f->locvars' */
+  lu_byte nactvar;  /* number of active local variables */
+  lu_byte nups;  /* number of upvalues */
+  lu_byte freereg;  /* first free register */
+} FuncState;
+
+
+LUAI_FUNC LClosure *luaY_parser (lua_State *L, ZIO *z, Mbuffer *buff,
+                                 Dyndata *dyd, const char *name, int firstchar);
+
+
+#endif
diff --git a/libs/lua/lua-5.3.3/lprefix.h b/libs/lua/lua-5.3.3/lprefix.h
new file mode 100644
index 0000000..02daa83
--- /dev/null
+++ b/libs/lua/lua-5.3.3/lprefix.h
@@ -0,0 +1,45 @@
+/*
+** $Id: lprefix.h,v 1.2 2014/12/29 16:54:13 roberto Exp $
+** Definitions for Lua code that must come before any other header file
+** See Copyright Notice in lua.h
+*/
+
+#ifndef lprefix_h
+#define lprefix_h
+
+
+/*
+** Allows POSIX/XSI stuff
+*/
+#if !defined(LUA_USE_C89)	/* { */
+
+#if !defined(_XOPEN_SOURCE)
+#define _XOPEN_SOURCE           600
+#elif _XOPEN_SOURCE == 0
+#undef _XOPEN_SOURCE  /* use -D_XOPEN_SOURCE=0 to undefine it */
+#endif
+
+/*
+** Allows manipulation of large files in gcc and some other compilers
+*/
+#if !defined(LUA_32BITS) && !defined(_FILE_OFFSET_BITS)
+#define _LARGEFILE_SOURCE       1
+#define _FILE_OFFSET_BITS       64
+#endif
+
+#endif				/* } */
+
+
+/*
+** Windows stuff
+*/
+#if defined(_WIN32) 	/* { */
+
+#if !defined(_CRT_SECURE_NO_WARNINGS)
+#define _CRT_SECURE_NO_WARNINGS  /* avoid warnings about ISO C functions */
+#endif
+
+#endif			/* } */
+
+#endif
+
diff --git a/libs/lua/lua-5.3.3/lstate.c b/libs/lua/lua-5.3.3/lstate.c
new file mode 100644
index 0000000..9194ac3
--- /dev/null
+++ b/libs/lua/lua-5.3.3/lstate.c
@@ -0,0 +1,347 @@
+/*
+** $Id: lstate.c,v 2.133 2015/11/13 12:16:51 roberto Exp $
+** Global State
+** See Copyright Notice in lua.h
+*/
+
+#define lstate_c
+#define LUA_CORE
+
+#include "lprefix.h"
+
+
+#include <stddef.h>
+#include <string.h>
+
+#include "lua.h"
+
+#include "lapi.h"
+#include "ldebug.h"
+#include "ldo.h"
+#include "lfunc.h"
+#include "lgc.h"
+#include "llex.h"
+#include "lmem.h"
+#include "lstate.h"
+#include "lstring.h"
+#include "ltable.h"
+#include "ltm.h"
+
+
+#if !defined(LUAI_GCPAUSE)
+#define LUAI_GCPAUSE	200  /* 200% */
+#endif
+
+#if !defined(LUAI_GCMUL)
+#define LUAI_GCMUL	200 /* GC runs 'twice the speed' of memory allocation */
+#endif
+
+
+/*
+** a macro to help the creation of a unique random seed when a state is
+** created; the seed is used to randomize hashes.
+*/
+#if !defined(luai_makeseed)
+#include <time.h>
+#define luai_makeseed()		cast(unsigned int, time(NULL))
+#endif
+
+
+
+/*
+** thread state + extra space
+*/
+typedef struct LX {
+  lu_byte extra_[LUA_EXTRASPACE];
+  lua_State l;
+} LX;
+
+
+/*
+** Main thread combines a thread state and the global state
+*/
+typedef struct LG {
+  LX l;
+  global_State g;
+} LG;
+
+
+
+#define fromstate(L)	(cast(LX *, cast(lu_byte *, (L)) - offsetof(LX, l)))
+
+
+/*
+** Compute an initial seed as random as possible. Rely on Address Space
+** Layout Randomization (if present) to increase randomness..
+*/
+#define addbuff(b,p,e) \
+  { size_t t = cast(size_t, e); \
+    memcpy(b + p, &t, sizeof(t)); p += sizeof(t); }
+
+static unsigned int makeseed (lua_State *L) {
+  char buff[4 * sizeof(size_t)];
+  unsigned int h = luai_makeseed();
+  int p = 0;
+  addbuff(buff, p, L);  /* heap variable */
+  addbuff(buff, p, &h);  /* local variable */
+  addbuff(buff, p, luaO_nilobject);  /* global variable */
+  addbuff(buff, p, &lua_newstate);  /* public function */
+  lua_assert(p == sizeof(buff));
+  return luaS_hash(buff, p, h);
+}
+
+
+/*
+** set GCdebt to a new value keeping the value (totalbytes + GCdebt)
+** invariant (and avoiding underflows in 'totalbytes')
+*/
+void luaE_setdebt (global_State *g, l_mem debt) {
+  l_mem tb = gettotalbytes(g);
+  lua_assert(tb > 0);
+  if (debt < tb - MAX_LMEM)
+    debt = tb - MAX_LMEM;  /* will make 'totalbytes == MAX_LMEM' */
+  g->totalbytes = tb - debt;
+  g->GCdebt = debt;
+}
+
+
+CallInfo *luaE_extendCI (lua_State *L) {
+  CallInfo *ci = luaM_new(L, CallInfo);
+  lua_assert(L->ci->next == NULL);
+  L->ci->next = ci;
+  ci->previous = L->ci;
+  ci->next = NULL;
+  L->nci++;
+  return ci;
+}
+
+
+/*
+** free all CallInfo structures not in use by a thread
+*/
+void luaE_freeCI (lua_State *L) {
+  CallInfo *ci = L->ci;
+  CallInfo *next = ci->next;
+  ci->next = NULL;
+  while ((ci = next) != NULL) {
+    next = ci->next;
+    luaM_free(L, ci);
+    L->nci--;
+  }
+}
+
+
+/*
+** free half of the CallInfo structures not in use by a thread
+*/
+void luaE_shrinkCI (lua_State *L) {
+  CallInfo *ci = L->ci;
+  CallInfo *next2;  /* next's next */
+  /* while there are two nexts */
+  while (ci->next != NULL && (next2 = ci->next->next) != NULL) {
+    luaM_free(L, ci->next);  /* free next */
+    L->nci--;
+    ci->next = next2;  /* remove 'next' from the list */
+    next2->previous = ci;
+    ci = next2;  /* keep next's next */
+  }
+}
+
+
+static void stack_init (lua_State *L1, lua_State *L) {
+  int i; CallInfo *ci;
+  /* initialize stack array */
+  L1->stack = luaM_newvector(L, BASIC_STACK_SIZE, TValue);
+  L1->stacksize = BASIC_STACK_SIZE;
+  for (i = 0; i < BASIC_STACK_SIZE; i++)
+    setnilvalue(L1->stack + i);  /* erase new stack */
+  L1->top = L1->stack;
+  L1->stack_last = L1->stack + L1->stacksize - EXTRA_STACK;
+  /* initialize first ci */
+  ci = &L1->base_ci;
+  ci->next = ci->previous = NULL;
+  ci->callstatus = 0;
+  ci->func = L1->top;
+  setnilvalue(L1->top++);  /* 'function' entry for this 'ci' */
+  ci->top = L1->top + LUA_MINSTACK;
+  L1->ci = ci;
+}
+
+
+static void freestack (lua_State *L) {
+  if (L->stack == NULL)
+    return;  /* stack not completely built yet */
+  L->ci = &L->base_ci;  /* free the entire 'ci' list */
+  luaE_freeCI(L);
+  lua_assert(L->nci == 0);
+  luaM_freearray(L, L->stack, L->stacksize);  /* free stack array */
+}
+
+
+/*
+** Create registry table and its predefined values
+*/
+static void init_registry (lua_State *L, global_State *g) {
+  TValue temp;
+  /* create registry */
+  Table *registry = luaH_new(L);
+  sethvalue(L, &g->l_registry, registry);
+  luaH_resize(L, registry, LUA_RIDX_LAST, 0);
+  /* registry[LUA_RIDX_MAINTHREAD] = L */
+  setthvalue(L, &temp, L);  /* temp = L */
+  luaH_setint(L, registry, LUA_RIDX_MAINTHREAD, &temp);
+  /* registry[LUA_RIDX_GLOBALS] = table of globals */
+  sethvalue(L, &temp, luaH_new(L));  /* temp = new table (global table) */
+  luaH_setint(L, registry, LUA_RIDX_GLOBALS, &temp);
+}
+
+
+/*
+** open parts of the state that may cause memory-allocation errors.
+** ('g->version' != NULL flags that the state was completely build)
+*/
+static void f_luaopen (lua_State *L, void *ud) {
+  global_State *g = G(L);
+  UNUSED(ud);
+  stack_init(L, L);  /* init stack */
+  init_registry(L, g);
+  luaS_init(L);
+  luaT_init(L);
+  luaX_init(L);
+  g->gcrunning = 1;  /* allow gc */
+  g->version = lua_version(NULL);
+  luai_userstateopen(L);
+}
+
+
+/*
+** preinitialize a thread with consistent values without allocating
+** any memory (to avoid errors)
+*/
+static void preinit_thread (lua_State *L, global_State *g) {
+  G(L) = g;
+  L->stack = NULL;
+  L->ci = NULL;
+  L->nci = 0;
+  L->stacksize = 0;
+  L->twups = L;  /* thread has no upvalues */
+  L->errorJmp = NULL;
+  L->nCcalls = 0;
+  L->hook = NULL;
+  L->hookmask = 0;
+  L->basehookcount = 0;
+  L->allowhook = 1;
+  resethookcount(L);
+  L->openupval = NULL;
+  L->nny = 1;
+  L->status = LUA_OK;
+  L->errfunc = 0;
+}
+
+
+static void close_state (lua_State *L) {
+  global_State *g = G(L);
+  luaF_close(L, L->stack);  /* close all upvalues for this thread */
+  luaC_freeallobjects(L);  /* collect all objects */
+  if (g->version)  /* closing a fully built state? */
+    luai_userstateclose(L);
+  luaM_freearray(L, G(L)->strt.hash, G(L)->strt.size);
+  freestack(L);
+  lua_assert(gettotalbytes(g) == sizeof(LG));
+  (*g->frealloc)(g->ud, fromstate(L), sizeof(LG), 0);  /* free main block */
+}
+
+
+LUA_API lua_State *lua_newthread (lua_State *L) {
+  global_State *g = G(L);
+  lua_State *L1;
+  lua_lock(L);
+  luaC_checkGC(L);
+  /* create new thread */
+  L1 = &cast(LX *, luaM_newobject(L, LUA_TTHREAD, sizeof(LX)))->l;
+  L1->marked = luaC_white(g);
+  L1->tt = LUA_TTHREAD;
+  /* link it on list 'allgc' */
+  L1->next = g->allgc;
+  g->allgc = obj2gco(L1);
+  /* anchor it on L stack */
+  setthvalue(L, L->top, L1);
+  api_incr_top(L);
+  preinit_thread(L1, g);
+  L1->hookmask = L->hookmask;
+  L1->basehookcount = L->basehookcount;
+  L1->hook = L->hook;
+  resethookcount(L1);
+  /* initialize L1 extra space */
+  memcpy(lua_getextraspace(L1), lua_getextraspace(g->mainthread),
+         LUA_EXTRASPACE);
+  luai_userstatethread(L, L1);
+  stack_init(L1, L);  /* init stack */
+  lua_unlock(L);
+  return L1;
+}
+
+
+void luaE_freethread (lua_State *L, lua_State *L1) {
+  LX *l = fromstate(L1);
+  luaF_close(L1, L1->stack);  /* close all upvalues for this thread */
+  lua_assert(L1->openupval == NULL);
+  luai_userstatefree(L, L1);
+  freestack(L1);
+  luaM_free(L, l);
+}
+
+
+LUA_API lua_State *lua_newstate (lua_Alloc f, void *ud) {
+  int i;
+  lua_State *L;
+  global_State *g;
+  LG *l = cast(LG *, (*f)(ud, NULL, LUA_TTHREAD, sizeof(LG)));
+  if (l == NULL) return NULL;
+  L = &l->l.l;
+  g = &l->g;
+  L->next = NULL;
+  L->tt = LUA_TTHREAD;
+  g->currentwhite = bitmask(WHITE0BIT);
+  L->marked = luaC_white(g);
+  preinit_thread(L, g);
+  g->frealloc = f;
+  g->ud = ud;
+  g->mainthread = L;
+  g->seed = makeseed(L);
+  g->gcrunning = 0;  /* no GC while building state */
+  g->GCestimate = 0;
+  g->strt.size = g->strt.nuse = 0;
+  g->strt.hash = NULL;
+  setnilvalue(&g->l_registry);
+  g->panic = NULL;
+  g->version = NULL;
+  g->gcstate = GCSpause;
+  g->gckind = KGC_NORMAL;
+  g->allgc = g->finobj = g->tobefnz = g->fixedgc = NULL;
+  g->sweepgc = NULL;
+  g->gray = g->grayagain = NULL;
+  g->weak = g->ephemeron = g->allweak = NULL;
+  g->twups = NULL;
+  g->totalbytes = sizeof(LG);
+  g->GCdebt = 0;
+  g->gcfinnum = 0;
+  g->gcpause = LUAI_GCPAUSE;
+  g->gcstepmul = LUAI_GCMUL;
+  for (i=0; i < LUA_NUMTAGS; i++) g->mt[i] = NULL;
+  if (luaD_rawrunprotected(L, f_luaopen, NULL) != LUA_OK) {
+    /* memory allocation error: free partial state */
+    close_state(L);
+    L = NULL;
+  }
+  return L;
+}
+
+
+LUA_API void lua_close (lua_State *L) {
+  L = G(L)->mainthread;  /* only the main thread can be closed */
+  lua_lock(L);
+  close_state(L);
+}
+
+
diff --git a/libs/lua/lua-5.3.3/lstate.h b/libs/lua/lua-5.3.3/lstate.h
new file mode 100644
index 0000000..b3033be
--- /dev/null
+++ b/libs/lua/lua-5.3.3/lstate.h
@@ -0,0 +1,234 @@
+/*
+** $Id: lstate.h,v 2.130 2015/12/16 16:39:38 roberto Exp $
+** Global State
+** See Copyright Notice in lua.h
+*/
+
+#ifndef lstate_h
+#define lstate_h
+
+#include "lua.h"
+
+#include "lobject.h"
+#include "ltm.h"
+#include "lzio.h"
+
+
+/*
+
+** Some notes about garbage-collected objects: All objects in Lua must
+** be kept somehow accessible until being freed, so all objects always
+** belong to one (and only one) of these lists, using field 'next' of
+** the 'CommonHeader' for the link:
+**
+** 'allgc': all objects not marked for finalization;
+** 'finobj': all objects marked for finalization;
+** 'tobefnz': all objects ready to be finalized; 
+** 'fixedgc': all objects that are not to be collected (currently
+** only small strings, such as reserved words).
+
+*/
+
+
+struct lua_longjmp;  /* defined in ldo.c */
+
+
+/*
+** Atomic type (relative to signals) to better ensure that 'lua_sethook' 
+** is thread safe
+*/
+#if !defined(l_signalT)
+#include <signal.h>
+#define l_signalT	sig_atomic_t
+#endif
+
+
+/* extra stack space to handle TM calls and some other extras */
+#define EXTRA_STACK   5
+
+
+#define BASIC_STACK_SIZE        (2*LUA_MINSTACK)
+
+
+/* kinds of Garbage Collection */
+#define KGC_NORMAL	0
+#define KGC_EMERGENCY	1	/* gc was forced by an allocation failure */
+
+
+typedef struct stringtable {
+  TString **hash;
+  int nuse;  /* number of elements */
+  int size;
+} stringtable;
+
+
+/*
+** Information about a call.
+** When a thread yields, 'func' is adjusted to pretend that the
+** top function has only the yielded values in its stack; in that
+** case, the actual 'func' value is saved in field 'extra'. 
+** When a function calls another with a continuation, 'extra' keeps
+** the function index so that, in case of errors, the continuation
+** function can be called with the correct top.
+*/
+typedef struct CallInfo {
+  StkId func;  /* function index in the stack */
+  StkId	top;  /* top for this function */
+  struct CallInfo *previous, *next;  /* dynamic call link */
+  union {
+    struct {  /* only for Lua functions */
+      StkId base;  /* base for this function */
+      const Instruction *savedpc;
+    } l;
+    struct {  /* only for C functions */
+      lua_KFunction k;  /* continuation in case of yields */
+      ptrdiff_t old_errfunc;
+      lua_KContext ctx;  /* context info. in case of yields */
+    } c;
+  } u;
+  ptrdiff_t extra;
+  short nresults;  /* expected number of results from this function */
+  lu_byte callstatus;
+} CallInfo;
+
+
+/*
+** Bits in CallInfo status
+*/
+#define CIST_OAH	(1<<0)	/* original value of 'allowhook' */
+#define CIST_LUA	(1<<1)	/* call is running a Lua function */
+#define CIST_HOOKED	(1<<2)	/* call is running a debug hook */
+#define CIST_FRESH	(1<<3)	/* call is running on a fresh invocation
+                                   of luaV_execute */
+#define CIST_YPCALL	(1<<4)	/* call is a yieldable protected call */
+#define CIST_TAIL	(1<<5)	/* call was tail called */
+#define CIST_HOOKYIELD	(1<<6)	/* last hook called yielded */
+#define CIST_LEQ	(1<<7)  /* using __lt for __le */
+
+#define isLua(ci)	((ci)->callstatus & CIST_LUA)
+
+/* assume that CIST_OAH has offset 0 and that 'v' is strictly 0/1 */
+#define setoah(st,v)	((st) = ((st) & ~CIST_OAH) | (v))
+#define getoah(st)	((st) & CIST_OAH)
+
+
+/*
+** 'global state', shared by all threads of this state
+*/
+typedef struct global_State {
+  lua_Alloc frealloc;  /* function to reallocate memory */
+  void *ud;         /* auxiliary data to 'frealloc' */
+  l_mem totalbytes;  /* number of bytes currently allocated - GCdebt */
+  l_mem GCdebt;  /* bytes allocated not yet compensated by the collector */
+  lu_mem GCmemtrav;  /* memory traversed by the GC */
+  lu_mem GCestimate;  /* an estimate of the non-garbage memory in use */
+  stringtable strt;  /* hash table for strings */
+  TValue l_registry;
+  unsigned int seed;  /* randomized seed for hashes */
+  lu_byte currentwhite;
+  lu_byte gcstate;  /* state of garbage collector */
+  lu_byte gckind;  /* kind of GC running */
+  lu_byte gcrunning;  /* true if GC is running */
+  GCObject *allgc;  /* list of all collectable objects */
+  GCObject **sweepgc;  /* current position of sweep in list */
+  GCObject *finobj;  /* list of collectable objects with finalizers */
+  GCObject *gray;  /* list of gray objects */
+  GCObject *grayagain;  /* list of objects to be traversed atomically */
+  GCObject *weak;  /* list of tables with weak values */
+  GCObject *ephemeron;  /* list of ephemeron tables (weak keys) */
+  GCObject *allweak;  /* list of all-weak tables */
+  GCObject *tobefnz;  /* list of userdata to be GC */
+  GCObject *fixedgc;  /* list of objects not to be collected */
+  struct lua_State *twups;  /* list of threads with open upvalues */
+  unsigned int gcfinnum;  /* number of finalizers to call in each GC step */
+  int gcpause;  /* size of pause between successive GCs */
+  int gcstepmul;  /* GC 'granularity' */
+  lua_CFunction panic;  /* to be called in unprotected errors */
+  struct lua_State *mainthread;
+  const lua_Number *version;  /* pointer to version number */
+  TString *memerrmsg;  /* memory-error message */
+  TString *tmname[TM_N];  /* array with tag-method names */
+  struct Table *mt[LUA_NUMTAGS];  /* metatables for basic types */
+  TString *strcache[STRCACHE_N][STRCACHE_M];  /* cache for strings in API */
+} global_State;
+
+
+/*
+** 'per thread' state
+*/
+struct lua_State {
+  CommonHeader;
+  unsigned short nci;  /* number of items in 'ci' list */
+  lu_byte status;
+  StkId top;  /* first free slot in the stack */
+  global_State *l_G;
+  CallInfo *ci;  /* call info for current function */
+  const Instruction *oldpc;  /* last pc traced */
+  StkId stack_last;  /* last free slot in the stack */
+  StkId stack;  /* stack base */
+  UpVal *openupval;  /* list of open upvalues in this stack */
+  GCObject *gclist;
+  struct lua_State *twups;  /* list of threads with open upvalues */
+  struct lua_longjmp *errorJmp;  /* current error recover point */
+  CallInfo base_ci;  /* CallInfo for first level (C calling Lua) */
+  volatile lua_Hook hook;
+  ptrdiff_t errfunc;  /* current error handling function (stack index) */
+  int stacksize;
+  int basehookcount;
+  int hookcount;
+  unsigned short nny;  /* number of non-yieldable calls in stack */
+  unsigned short nCcalls;  /* number of nested C calls */
+  l_signalT hookmask;
+  lu_byte allowhook;
+};
+
+
+#define G(L)	(L->l_G)
+
+
+/*
+** Union of all collectable objects (only for conversions)
+*/
+union GCUnion {
+  GCObject gc;  /* common header */
+  struct TString ts;
+  struct Udata u;
+  union Closure cl;
+  struct Table h;
+  struct Proto p;
+  struct lua_State th;  /* thread */
+};
+
+
+#define cast_u(o)	cast(union GCUnion *, (o))
+
+/* macros to convert a GCObject into a specific value */
+#define gco2ts(o)  \
+	check_exp(novariant((o)->tt) == LUA_TSTRING, &((cast_u(o))->ts))
+#define gco2u(o)  check_exp((o)->tt == LUA_TUSERDATA, &((cast_u(o))->u))
+#define gco2lcl(o)  check_exp((o)->tt == LUA_TLCL, &((cast_u(o))->cl.l))
+#define gco2ccl(o)  check_exp((o)->tt == LUA_TCCL, &((cast_u(o))->cl.c))
+#define gco2cl(o)  \
+	check_exp(novariant((o)->tt) == LUA_TFUNCTION, &((cast_u(o))->cl))
+#define gco2t(o)  check_exp((o)->tt == LUA_TTABLE, &((cast_u(o))->h))
+#define gco2p(o)  check_exp((o)->tt == LUA_TPROTO, &((cast_u(o))->p))
+#define gco2th(o)  check_exp((o)->tt == LUA_TTHREAD, &((cast_u(o))->th))
+
+
+/* macro to convert a Lua object into a GCObject */
+#define obj2gco(v) \
+	check_exp(novariant((v)->tt) < LUA_TDEADKEY, (&(cast_u(v)->gc)))
+
+
+/* actual number of total bytes allocated */
+#define gettotalbytes(g)	cast(lu_mem, (g)->totalbytes + (g)->GCdebt)
+
+LUAI_FUNC void luaE_setdebt (global_State *g, l_mem debt);
+LUAI_FUNC void luaE_freethread (lua_State *L, lua_State *L1);
+LUAI_FUNC CallInfo *luaE_extendCI (lua_State *L);
+LUAI_FUNC void luaE_freeCI (lua_State *L);
+LUAI_FUNC void luaE_shrinkCI (lua_State *L);
+
+
+#endif
+
diff --git a/libs/lua/lua-5.3.3/lstring.c b/libs/lua/lua-5.3.3/lstring.c
new file mode 100644
index 0000000..9351766
--- /dev/null
+++ b/libs/lua/lua-5.3.3/lstring.c
@@ -0,0 +1,248 @@
+/*
+** $Id: lstring.c,v 2.56 2015/11/23 11:32:51 roberto Exp $
+** String table (keeps all strings handled by Lua)
+** See Copyright Notice in lua.h
+*/
+
+#define lstring_c
+#define LUA_CORE
+
+#include "lprefix.h"
+
+
+#include <string.h>
+
+#include "lua.h"
+
+#include "ldebug.h"
+#include "ldo.h"
+#include "lmem.h"
+#include "lobject.h"
+#include "lstate.h"
+#include "lstring.h"
+
+
+#define MEMERRMSG       "not enough memory"
+
+
+/*
+** Lua will use at most ~(2^LUAI_HASHLIMIT) bytes from a string to
+** compute its hash
+*/
+#if !defined(LUAI_HASHLIMIT)
+#define LUAI_HASHLIMIT		5
+#endif
+
+
+/*
+** equality for long strings
+*/
+int luaS_eqlngstr (TString *a, TString *b) {
+  size_t len = a->u.lnglen;
+  lua_assert(a->tt == LUA_TLNGSTR && b->tt == LUA_TLNGSTR);
+  return (a == b) ||  /* same instance or... */
+    ((len == b->u.lnglen) &&  /* equal length and ... */
+     (memcmp(getstr(a), getstr(b), len) == 0));  /* equal contents */
+}
+
+
+unsigned int luaS_hash (const char *str, size_t l, unsigned int seed) {
+  unsigned int h = seed ^ cast(unsigned int, l);
+  size_t step = (l >> LUAI_HASHLIMIT) + 1;
+  for (; l >= step; l -= step)
+    h ^= ((h<<5) + (h>>2) + cast_byte(str[l - 1]));
+  return h;
+}
+
+
+unsigned int luaS_hashlongstr (TString *ts) {
+  lua_assert(ts->tt == LUA_TLNGSTR);
+  if (ts->extra == 0) {  /* no hash? */
+    ts->hash = luaS_hash(getstr(ts), ts->u.lnglen, ts->hash);
+    ts->extra = 1;  /* now it has its hash */
+  }
+  return ts->hash;
+}
+
+
+/*
+** resizes the string table
+*/
+void luaS_resize (lua_State *L, int newsize) {
+  int i;
+  stringtable *tb = &G(L)->strt;
+  if (newsize > tb->size) {  /* grow table if needed */
+    luaM_reallocvector(L, tb->hash, tb->size, newsize, TString *);
+    for (i = tb->size; i < newsize; i++)
+      tb->hash[i] = NULL;
+  }
+  for (i = 0; i < tb->size; i++) {  /* rehash */
+    TString *p = tb->hash[i];
+    tb->hash[i] = NULL;
+    while (p) {  /* for each node in the list */
+      TString *hnext = p->u.hnext;  /* save next */
+      unsigned int h = lmod(p->hash, newsize);  /* new position */
+      p->u.hnext = tb->hash[h];  /* chain it */
+      tb->hash[h] = p;
+      p = hnext;
+    }
+  }
+  if (newsize < tb->size) {  /* shrink table if needed */
+    /* vanishing slice should be empty */
+    lua_assert(tb->hash[newsize] == NULL && tb->hash[tb->size - 1] == NULL);
+    luaM_reallocvector(L, tb->hash, tb->size, newsize, TString *);
+  }
+  tb->size = newsize;
+}
+
+
+/*
+** Clear API string cache. (Entries cannot be empty, so fill them with
+** a non-collectable string.)
+*/
+void luaS_clearcache (global_State *g) {
+  int i, j;
+  for (i = 0; i < STRCACHE_N; i++)
+    for (j = 0; j < STRCACHE_M; j++) {
+    if (iswhite(g->strcache[i][j]))  /* will entry be collected? */
+      g->strcache[i][j] = g->memerrmsg;  /* replace it with something fixed */
+    }
+}
+
+
+/*
+** Initialize the string table and the string cache
+*/
+void luaS_init (lua_State *L) {
+  global_State *g = G(L);
+  int i, j;
+  luaS_resize(L, MINSTRTABSIZE);  /* initial size of string table */
+  /* pre-create memory-error message */
+  g->memerrmsg = luaS_newliteral(L, MEMERRMSG);
+  luaC_fix(L, obj2gco(g->memerrmsg));  /* it should never be collected */
+  for (i = 0; i < STRCACHE_N; i++)  /* fill cache with valid strings */
+    for (j = 0; j < STRCACHE_M; j++)
+      g->strcache[i][j] = g->memerrmsg;
+}
+
+
+
+/*
+** creates a new string object
+*/
+static TString *createstrobj (lua_State *L, size_t l, int tag, unsigned int h) {
+  TString *ts;
+  GCObject *o;
+  size_t totalsize;  /* total size of TString object */
+  totalsize = sizelstring(l);
+  o = luaC_newobj(L, tag, totalsize);
+  ts = gco2ts(o);
+  ts->hash = h;
+  ts->extra = 0;
+  getstr(ts)[l] = '\0';  /* ending 0 */
+  return ts;
+}
+
+
+TString *luaS_createlngstrobj (lua_State *L, size_t l) {
+  TString *ts = createstrobj(L, l, LUA_TLNGSTR, G(L)->seed);
+  ts->u.lnglen = l;
+  return ts;
+}
+
+
+void luaS_remove (lua_State *L, TString *ts) {
+  stringtable *tb = &G(L)->strt;
+  TString **p = &tb->hash[lmod(ts->hash, tb->size)];
+  while (*p != ts)  /* find previous element */
+    p = &(*p)->u.hnext;
+  *p = (*p)->u.hnext;  /* remove element from its list */
+  tb->nuse--;
+}
+
+
+/*
+** checks whether short string exists and reuses it or creates a new one
+*/
+static TString *internshrstr (lua_State *L, const char *str, size_t l) {
+  TString *ts;
+  global_State *g = G(L);
+  unsigned int h = luaS_hash(str, l, g->seed);
+  TString **list = &g->strt.hash[lmod(h, g->strt.size)];
+  lua_assert(str != NULL);  /* otherwise 'memcmp'/'memcpy' are undefined */
+  for (ts = *list; ts != NULL; ts = ts->u.hnext) {
+    if (l == ts->shrlen &&
+        (memcmp(str, getstr(ts), l * sizeof(char)) == 0)) {
+      /* found! */
+      if (isdead(g, ts))  /* dead (but not collected yet)? */
+        changewhite(ts);  /* resurrect it */
+      return ts;
+    }
+  }
+  if (g->strt.nuse >= g->strt.size && g->strt.size <= MAX_INT/2) {
+    luaS_resize(L, g->strt.size * 2);
+    list = &g->strt.hash[lmod(h, g->strt.size)];  /* recompute with new size */
+  }
+  ts = createstrobj(L, l, LUA_TSHRSTR, h);
+  memcpy(getstr(ts), str, l * sizeof(char));
+  ts->shrlen = cast_byte(l);
+  ts->u.hnext = *list;
+  *list = ts;
+  g->strt.nuse++;
+  return ts;
+}
+
+
+/*
+** new string (with explicit length)
+*/
+TString *luaS_newlstr (lua_State *L, const char *str, size_t l) {
+  if (l <= LUAI_MAXSHORTLEN)  /* short string? */
+    return internshrstr(L, str, l);
+  else {
+    TString *ts;
+    if (l >= (MAX_SIZE - sizeof(TString))/sizeof(char))
+      luaM_toobig(L);
+    ts = luaS_createlngstrobj(L, l);
+    memcpy(getstr(ts), str, l * sizeof(char));
+    return ts;
+  }
+}
+
+
+/*
+** Create or reuse a zero-terminated string, first checking in the
+** cache (using the string address as a key). The cache can contain
+** only zero-terminated strings, so it is safe to use 'strcmp' to
+** check hits.
+*/
+TString *luaS_new (lua_State *L, const char *str) {
+  unsigned int i = point2uint(str) % STRCACHE_N;  /* hash */
+  int j;
+  TString **p = G(L)->strcache[i];
+  for (j = 0; j < STRCACHE_M; j++) {
+    if (strcmp(str, getstr(p[j])) == 0)  /* hit? */
+      return p[j];  /* that is it */
+  }
+  /* normal route */
+  for (j = STRCACHE_M - 1; j > 0; j--)
+    p[j] = p[j - 1];  /* move out last element */
+  /* new element is first in the list */
+  p[0] = luaS_newlstr(L, str, strlen(str));
+  return p[0];
+}
+
+
+Udata *luaS_newudata (lua_State *L, size_t s) {
+  Udata *u;
+  GCObject *o;
+  if (s > MAX_SIZE - sizeof(Udata))
+    luaM_toobig(L);
+  o = luaC_newobj(L, LUA_TUSERDATA, sizeludata(s));
+  u = gco2u(o);
+  u->len = s;
+  u->metatable = NULL;
+  setuservalue(L, u, luaO_nilobject);
+  return u;
+}
+
diff --git a/libs/lua/lua-5.3.3/lstring.h b/libs/lua/lua-5.3.3/lstring.h
new file mode 100644
index 0000000..27efd20
--- /dev/null
+++ b/libs/lua/lua-5.3.3/lstring.h
@@ -0,0 +1,49 @@
+/*
+** $Id: lstring.h,v 1.61 2015/11/03 15:36:01 roberto Exp $
+** String table (keep all strings handled by Lua)
+** See Copyright Notice in lua.h
+*/
+
+#ifndef lstring_h
+#define lstring_h
+
+#include "lgc.h"
+#include "lobject.h"
+#include "lstate.h"
+
+
+#define sizelstring(l)  (sizeof(union UTString) + ((l) + 1) * sizeof(char))
+
+#define sizeludata(l)	(sizeof(union UUdata) + (l))
+#define sizeudata(u)	sizeludata((u)->len)
+
+#define luaS_newliteral(L, s)	(luaS_newlstr(L, "" s, \
+                                 (sizeof(s)/sizeof(char))-1))
+
+
+/*
+** test whether a string is a reserved word
+*/
+#define isreserved(s)	((s)->tt == LUA_TSHRSTR && (s)->extra > 0)
+
+
+/*
+** equality for short strings, which are always internalized
+*/
+#define eqshrstr(a,b)	check_exp((a)->tt == LUA_TSHRSTR, (a) == (b))
+
+
+LUAI_FUNC unsigned int luaS_hash (const char *str, size_t l, unsigned int seed);
+LUAI_FUNC unsigned int luaS_hashlongstr (TString *ts);
+LUAI_FUNC int luaS_eqlngstr (TString *a, TString *b);
+LUAI_FUNC void luaS_resize (lua_State *L, int newsize);
+LUAI_FUNC void luaS_clearcache (global_State *g);
+LUAI_FUNC void luaS_init (lua_State *L);
+LUAI_FUNC void luaS_remove (lua_State *L, TString *ts);
+LUAI_FUNC Udata *luaS_newudata (lua_State *L, size_t s);
+LUAI_FUNC TString *luaS_newlstr (lua_State *L, const char *str, size_t l);
+LUAI_FUNC TString *luaS_new (lua_State *L, const char *str);
+LUAI_FUNC TString *luaS_createlngstrobj (lua_State *L, size_t l);
+
+
+#endif
diff --git a/libs/lua/lua-5.3.3/lstrlib.c b/libs/lua/lua-5.3.3/lstrlib.c
new file mode 100644
index 0000000..cd1ced5
--- /dev/null
+++ b/libs/lua/lua-5.3.3/lstrlib.c
@@ -0,0 +1,1582 @@
+/*
+** $Id: lstrlib.c,v 1.251 2016/05/20 14:13:21 roberto Exp $
+** Standard library for string operations and pattern-matching
+** See Copyright Notice in lua.h
+*/
+
+#define lstrlib_c
+#define LUA_LIB
+
+#include "lprefix.h"
+
+
+#include <ctype.h>
+#include <float.h>
+#include <limits.h>
+#include <locale.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "lua.h"
+
+#include "lauxlib.h"
+#include "lualib.h"
+
+
+/*
+** maximum number of captures that a pattern can do during
+** pattern-matching. This limit is arbitrary, but must fit in
+** an unsigned char.
+*/
+#if !defined(LUA_MAXCAPTURES)
+#define LUA_MAXCAPTURES		32
+#endif
+
+
+/* macro to 'unsign' a character */
+#define uchar(c)	((unsigned char)(c))
+
+
+/*
+** Some sizes are better limited to fit in 'int', but must also fit in
+** 'size_t'. (We assume that 'lua_Integer' cannot be smaller than 'int'.)
+*/
+#define MAX_SIZET	((size_t)(~(size_t)0))
+
+#define MAXSIZE  \
+	(sizeof(size_t) < sizeof(int) ? MAX_SIZET : (size_t)(INT_MAX))
+
+
+
+
+static int str_len (lua_State *L) {
+  size_t l;
+  luaL_checklstring(L, 1, &l);
+  lua_pushinteger(L, (lua_Integer)l);
+  return 1;
+}
+
+
+/* translate a relative string position: negative means back from end */
+static lua_Integer posrelat (lua_Integer pos, size_t len) {
+  if (pos >= 0) return pos;
+  else if (0u - (size_t)pos > len) return 0;
+  else return (lua_Integer)len + pos + 1;
+}
+
+
+static int str_sub (lua_State *L) {
+  size_t l;
+  const char *s = luaL_checklstring(L, 1, &l);
+  lua_Integer start = posrelat(luaL_checkinteger(L, 2), l);
+  lua_Integer end = posrelat(luaL_optinteger(L, 3, -1), l);
+  if (start < 1) start = 1;
+  if (end > (lua_Integer)l) end = l;
+  if (start <= end)
+    lua_pushlstring(L, s + start - 1, (size_t)(end - start) + 1);
+  else lua_pushliteral(L, "");
+  return 1;
+}
+
+
+static int str_reverse (lua_State *L) {
+  size_t l, i;
+  luaL_Buffer b;
+  const char *s = luaL_checklstring(L, 1, &l);
+  char *p = luaL_buffinitsize(L, &b, l);
+  for (i = 0; i < l; i++)
+    p[i] = s[l - i - 1];
+  luaL_pushresultsize(&b, l);
+  return 1;
+}
+
+
+static int str_lower (lua_State *L) {
+  size_t l;
+  size_t i;
+  luaL_Buffer b;
+  const char *s = luaL_checklstring(L, 1, &l);
+  char *p = luaL_buffinitsize(L, &b, l);
+  for (i=0; i<l; i++)
+    p[i] = tolower(uchar(s[i]));
+  luaL_pushresultsize(&b, l);
+  return 1;
+}
+
+
+static int str_upper (lua_State *L) {
+  size_t l;
+  size_t i;
+  luaL_Buffer b;
+  const char *s = luaL_checklstring(L, 1, &l);
+  char *p = luaL_buffinitsize(L, &b, l);
+  for (i=0; i<l; i++)
+    p[i] = toupper(uchar(s[i]));
+  luaL_pushresultsize(&b, l);
+  return 1;
+}
+
+
+static int str_rep (lua_State *L) {
+  size_t l, lsep;
+  const char *s = luaL_checklstring(L, 1, &l);
+  lua_Integer n = luaL_checkinteger(L, 2);
+  const char *sep = luaL_optlstring(L, 3, "", &lsep);
+  if (n <= 0) lua_pushliteral(L, "");
+  else if (l + lsep < l || l + lsep > MAXSIZE / n)  /* may overflow? */
+    return luaL_error(L, "resulting string too large");
+  else {
+    size_t totallen = (size_t)n * l + (size_t)(n - 1) * lsep;
+    luaL_Buffer b;
+    char *p = luaL_buffinitsize(L, &b, totallen);
+    while (n-- > 1) {  /* first n-1 copies (followed by separator) */
+      memcpy(p, s, l * sizeof(char)); p += l;
+      if (lsep > 0) {  /* empty 'memcpy' is not that cheap */
+        memcpy(p, sep, lsep * sizeof(char));
+        p += lsep;
+      }
+    }
+    memcpy(p, s, l * sizeof(char));  /* last copy (not followed by separator) */
+    luaL_pushresultsize(&b, totallen);
+  }
+  return 1;
+}
+
+
+static int str_byte (lua_State *L) {
+  size_t l;
+  const char *s = luaL_checklstring(L, 1, &l);
+  lua_Integer posi = posrelat(luaL_optinteger(L, 2, 1), l);
+  lua_Integer pose = posrelat(luaL_optinteger(L, 3, posi), l);
+  int n, i;
+  if (posi < 1) posi = 1;
+  if (pose > (lua_Integer)l) pose = l;
+  if (posi > pose) return 0;  /* empty interval; return no values */
+  if (pose - posi >= INT_MAX)  /* arithmetic overflow? */
+    return luaL_error(L, "string slice too long");
+  n = (int)(pose -  posi) + 1;
+  luaL_checkstack(L, n, "string slice too long");
+  for (i=0; i<n; i++)
+    lua_pushinteger(L, uchar(s[posi+i-1]));
+  return n;
+}
+
+
+static int str_char (lua_State *L) {
+  int n = lua_gettop(L);  /* number of arguments */
+  int i;
+  luaL_Buffer b;
+  char *p = luaL_buffinitsize(L, &b, n);
+  for (i=1; i<=n; i++) {
+    lua_Integer c = luaL_checkinteger(L, i);
+    luaL_argcheck(L, uchar(c) == c, i, "value out of range");
+    p[i - 1] = uchar(c);
+  }
+  luaL_pushresultsize(&b, n);
+  return 1;
+}
+
+
+static int writer (lua_State *L, const void *b, size_t size, void *B) {
+  (void)L;
+  luaL_addlstring((luaL_Buffer *) B, (const char *)b, size);
+  return 0;
+}
+
+
+static int str_dump (lua_State *L) {
+  luaL_Buffer b;
+  int strip = lua_toboolean(L, 2);
+  luaL_checktype(L, 1, LUA_TFUNCTION);
+  lua_settop(L, 1);
+  luaL_buffinit(L,&b);
+  if (lua_dump(L, writer, &b, strip) != 0)
+    return luaL_error(L, "unable to dump given function");
+  luaL_pushresult(&b);
+  return 1;
+}
+
+
+
+/*
+** {======================================================
+** PATTERN MATCHING
+** =======================================================
+*/
+
+
+#define CAP_UNFINISHED	(-1)
+#define CAP_POSITION	(-2)
+
+
+typedef struct MatchState {
+  const char *src_init;  /* init of source string */
+  const char *src_end;  /* end ('\0') of source string */
+  const char *p_end;  /* end ('\0') of pattern */
+  lua_State *L;
+  int matchdepth;  /* control for recursive depth (to avoid C stack overflow) */
+  unsigned char level;  /* total number of captures (finished or unfinished) */
+  struct {
+    const char *init;
+    ptrdiff_t len;
+  } capture[LUA_MAXCAPTURES];
+} MatchState;
+
+
+/* recursive function */
+static const char *match (MatchState *ms, const char *s, const char *p);
+
+
+/* maximum recursion depth for 'match' */
+#if !defined(MAXCCALLS)
+#define MAXCCALLS	200
+#endif
+
+
+#define L_ESC		'%'
+#define SPECIALS	"^$*+?.([%-"
+
+
+static int check_capture (MatchState *ms, int l) {
+  l -= '1';
+  if (l < 0 || l >= ms->level || ms->capture[l].len == CAP_UNFINISHED)
+    return luaL_error(ms->L, "invalid capture index %%%d", l + 1);
+  return l;
+}
+
+
+static int capture_to_close (MatchState *ms) {
+  int level = ms->level;
+  for (level--; level>=0; level--)
+    if (ms->capture[level].len == CAP_UNFINISHED) return level;
+  return luaL_error(ms->L, "invalid pattern capture");
+}
+
+
+static const char *classend (MatchState *ms, const char *p) {
+  switch (*p++) {
+    case L_ESC: {
+      if (p == ms->p_end)
+        luaL_error(ms->L, "malformed pattern (ends with '%%')");
+      return p+1;
+    }
+    case '[': {
+      if (*p == '^') p++;
+      do {  /* look for a ']' */
+        if (p == ms->p_end)
+          luaL_error(ms->L, "malformed pattern (missing ']')");
+        if (*(p++) == L_ESC && p < ms->p_end)
+          p++;  /* skip escapes (e.g. '%]') */
+      } while (*p != ']');
+      return p+1;
+    }
+    default: {
+      return p;
+    }
+  }
+}
+
+
+static int match_class (int c, int cl) {
+  int res;
+  switch (tolower(cl)) {
+    case 'a' : res = isalpha(c); break;
+    case 'c' : res = iscntrl(c); break;
+    case 'd' : res = isdigit(c); break;
+    case 'g' : res = isgraph(c); break;
+    case 'l' : res = islower(c); break;
+    case 'p' : res = ispunct(c); break;
+    case 's' : res = isspace(c); break;
+    case 'u' : res = isupper(c); break;
+    case 'w' : res = isalnum(c); break;
+    case 'x' : res = isxdigit(c); break;
+    case 'z' : res = (c == 0); break;  /* deprecated option */
+    default: return (cl == c);
+  }
+  return (islower(cl) ? res : !res);
+}
+
+
+static int matchbracketclass (int c, const char *p, const char *ec) {
+  int sig = 1;
+  if (*(p+1) == '^') {
+    sig = 0;
+    p++;  /* skip the '^' */
+  }
+  while (++p < ec) {
+    if (*p == L_ESC) {
+      p++;
+      if (match_class(c, uchar(*p)))
+        return sig;
+    }
+    else if ((*(p+1) == '-') && (p+2 < ec)) {
+      p+=2;
+      if (uchar(*(p-2)) <= c && c <= uchar(*p))
+        return sig;
+    }
+    else if (uchar(*p) == c) return sig;
+  }
+  return !sig;
+}
+
+
+static int singlematch (MatchState *ms, const char *s, const char *p,
+                        const char *ep) {
+  if (s >= ms->src_end)
+    return 0;
+  else {
+    int c = uchar(*s);
+    switch (*p) {
+      case '.': return 1;  /* matches any char */
+      case L_ESC: return match_class(c, uchar(*(p+1)));
+      case '[': return matchbracketclass(c, p, ep-1);
+      default:  return (uchar(*p) == c);
+    }
+  }
+}
+
+
+static const char *matchbalance (MatchState *ms, const char *s,
+                                   const char *p) {
+  if (p >= ms->p_end - 1)
+    luaL_error(ms->L, "malformed pattern (missing arguments to '%%b')");
+  if (*s != *p) return NULL;
+  else {
+    int b = *p;
+    int e = *(p+1);
+    int cont = 1;
+    while (++s < ms->src_end) {
+      if (*s == e) {
+        if (--cont == 0) return s+1;
+      }
+      else if (*s == b) cont++;
+    }
+  }
+  return NULL;  /* string ends out of balance */
+}
+
+
+static const char *max_expand (MatchState *ms, const char *s,
+                                 const char *p, const char *ep) {
+  ptrdiff_t i = 0;  /* counts maximum expand for item */
+  while (singlematch(ms, s + i, p, ep))
+    i++;
+  /* keeps trying to match with the maximum repetitions */
+  while (i>=0) {
+    const char *res = match(ms, (s+i), ep+1);
+    if (res) return res;
+    i--;  /* else didn't match; reduce 1 repetition to try again */
+  }
+  return NULL;
+}
+
+
+static const char *min_expand (MatchState *ms, const char *s,
+                                 const char *p, const char *ep) {
+  for (;;) {
+    const char *res = match(ms, s, ep+1);
+    if (res != NULL)
+      return res;
+    else if (singlematch(ms, s, p, ep))
+      s++;  /* try with one more repetition */
+    else return NULL;
+  }
+}
+
+
+static const char *start_capture (MatchState *ms, const char *s,
+                                    const char *p, int what) {
+  const char *res;
+  int level = ms->level;
+  if (level >= LUA_MAXCAPTURES) luaL_error(ms->L, "too many captures");
+  ms->capture[level].init = s;
+  ms->capture[level].len = what;
+  ms->level = level+1;
+  if ((res=match(ms, s, p)) == NULL)  /* match failed? */
+    ms->level--;  /* undo capture */
+  return res;
+}
+
+
+static const char *end_capture (MatchState *ms, const char *s,
+                                  const char *p) {
+  int l = capture_to_close(ms);
+  const char *res;
+  ms->capture[l].len = s - ms->capture[l].init;  /* close capture */
+  if ((res = match(ms, s, p)) == NULL)  /* match failed? */
+    ms->capture[l].len = CAP_UNFINISHED;  /* undo capture */
+  return res;
+}
+
+
+static const char *match_capture (MatchState *ms, const char *s, int l) {
+  size_t len;
+  l = check_capture(ms, l);
+  len = ms->capture[l].len;
+  if ((size_t)(ms->src_end-s) >= len &&
+      memcmp(ms->capture[l].init, s, len) == 0)
+    return s+len;
+  else return NULL;
+}
+
+
+static const char *match (MatchState *ms, const char *s, const char *p) {
+  if (ms->matchdepth-- == 0)
+    luaL_error(ms->L, "pattern too complex");
+  init: /* using goto's to optimize tail recursion */
+  if (p != ms->p_end) {  /* end of pattern? */
+    switch (*p) {
+      case '(': {  /* start capture */
+        if (*(p + 1) == ')')  /* position capture? */
+          s = start_capture(ms, s, p + 2, CAP_POSITION);
+        else
+          s = start_capture(ms, s, p + 1, CAP_UNFINISHED);
+        break;
+      }
+      case ')': {  /* end capture */
+        s = end_capture(ms, s, p + 1);
+        break;
+      }
+      case '$': {
+        if ((p + 1) != ms->p_end)  /* is the '$' the last char in pattern? */
+          goto dflt;  /* no; go to default */
+        s = (s == ms->src_end) ? s : NULL;  /* check end of string */
+        break;
+      }
+      case L_ESC: {  /* escaped sequences not in the format class[*+?-]? */
+        switch (*(p + 1)) {
+          case 'b': {  /* balanced string? */
+            s = matchbalance(ms, s, p + 2);
+            if (s != NULL) {
+              p += 4; goto init;  /* return match(ms, s, p + 4); */
+            }  /* else fail (s == NULL) */
+            break;
+          }
+          case 'f': {  /* frontier? */
+            const char *ep; char previous;
+            p += 2;
+            if (*p != '[')
+              luaL_error(ms->L, "missing '[' after '%%f' in pattern");
+            ep = classend(ms, p);  /* points to what is next */
+            previous = (s == ms->src_init) ? '\0' : *(s - 1);
+            if (!matchbracketclass(uchar(previous), p, ep - 1) &&
+               matchbracketclass(uchar(*s), p, ep - 1)) {
+              p = ep; goto init;  /* return match(ms, s, ep); */
+            }
+            s = NULL;  /* match failed */
+            break;
+          }
+          case '0': case '1': case '2': case '3':
+          case '4': case '5': case '6': case '7':
+          case '8': case '9': {  /* capture results (%0-%9)? */
+            s = match_capture(ms, s, uchar(*(p + 1)));
+            if (s != NULL) {
+              p += 2; goto init;  /* return match(ms, s, p + 2) */
+            }
+            break;
+          }
+          default: goto dflt;
+        }
+        break;
+      }
+      default: dflt: {  /* pattern class plus optional suffix */
+        const char *ep = classend(ms, p);  /* points to optional suffix */
+        /* does not match at least once? */
+        if (!singlematch(ms, s, p, ep)) {
+          if (*ep == '*' || *ep == '?' || *ep == '-') {  /* accept empty? */
+            p = ep + 1; goto init;  /* return match(ms, s, ep + 1); */
+          }
+          else  /* '+' or no suffix */
+            s = NULL;  /* fail */
+        }
+        else {  /* matched once */
+          switch (*ep) {  /* handle optional suffix */
+            case '?': {  /* optional */
+              const char *res;
+              if ((res = match(ms, s + 1, ep + 1)) != NULL)
+                s = res;
+              else {
+                p = ep + 1; goto init;  /* else return match(ms, s, ep + 1); */
+              }
+              break;
+            }
+            case '+':  /* 1 or more repetitions */
+              s++;  /* 1 match already done */
+              /* FALLTHROUGH */
+            case '*':  /* 0 or more repetitions */
+              s = max_expand(ms, s, p, ep);
+              break;
+            case '-':  /* 0 or more repetitions (minimum) */
+              s = min_expand(ms, s, p, ep);
+              break;
+            default:  /* no suffix */
+              s++; p = ep; goto init;  /* return match(ms, s + 1, ep); */
+          }
+        }
+        break;
+      }
+    }
+  }
+  ms->matchdepth++;
+  return s;
+}
+
+
+
+static const char *lmemfind (const char *s1, size_t l1,
+                               const char *s2, size_t l2) {
+  if (l2 == 0) return s1;  /* empty strings are everywhere */
+  else if (l2 > l1) return NULL;  /* avoids a negative 'l1' */
+  else {
+    const char *init;  /* to search for a '*s2' inside 's1' */
+    l2--;  /* 1st char will be checked by 'memchr' */
+    l1 = l1-l2;  /* 's2' cannot be found after that */
+    while (l1 > 0 && (init = (const char *)memchr(s1, *s2, l1)) != NULL) {
+      init++;   /* 1st char is already checked */
+      if (memcmp(init, s2+1, l2) == 0)
+        return init-1;
+      else {  /* correct 'l1' and 's1' to try again */
+        l1 -= init-s1;
+        s1 = init;
+      }
+    }
+    return NULL;  /* not found */
+  }
+}
+
+
+static void push_onecapture (MatchState *ms, int i, const char *s,
+                                                    const char *e) {
+  if (i >= ms->level) {
+    if (i == 0)  /* ms->level == 0, too */
+      lua_pushlstring(ms->L, s, e - s);  /* add whole match */
+    else
+      luaL_error(ms->L, "invalid capture index %%%d", i + 1);
+  }
+  else {
+    ptrdiff_t l = ms->capture[i].len;
+    if (l == CAP_UNFINISHED) luaL_error(ms->L, "unfinished capture");
+    if (l == CAP_POSITION)
+      lua_pushinteger(ms->L, (ms->capture[i].init - ms->src_init) + 1);
+    else
+      lua_pushlstring(ms->L, ms->capture[i].init, l);
+  }
+}
+
+
+static int push_captures (MatchState *ms, const char *s, const char *e) {
+  int i;
+  int nlevels = (ms->level == 0 && s) ? 1 : ms->level;
+  luaL_checkstack(ms->L, nlevels, "too many captures");
+  for (i = 0; i < nlevels; i++)
+    push_onecapture(ms, i, s, e);
+  return nlevels;  /* number of strings pushed */
+}
+
+
+/* check whether pattern has no special characters */
+static int nospecials (const char *p, size_t l) {
+  size_t upto = 0;
+  do {
+    if (strpbrk(p + upto, SPECIALS))
+      return 0;  /* pattern has a special character */
+    upto += strlen(p + upto) + 1;  /* may have more after \0 */
+  } while (upto <= l);
+  return 1;  /* no special chars found */
+}
+
+
+static void prepstate (MatchState *ms, lua_State *L,
+                       const char *s, size_t ls, const char *p, size_t lp) {
+  ms->L = L;
+  ms->matchdepth = MAXCCALLS;
+  ms->src_init = s;
+  ms->src_end = s + ls;
+  ms->p_end = p + lp;
+}
+
+
+static void reprepstate (MatchState *ms) {
+  ms->level = 0;
+  lua_assert(ms->matchdepth == MAXCCALLS);
+}
+
+
+static int str_find_aux (lua_State *L, int find) {
+  size_t ls, lp;
+  const char *s = luaL_checklstring(L, 1, &ls);
+  const char *p = luaL_checklstring(L, 2, &lp);
+  lua_Integer init = posrelat(luaL_optinteger(L, 3, 1), ls);
+  if (init < 1) init = 1;
+  else if (init > (lua_Integer)ls + 1) {  /* start after string's end? */
+    lua_pushnil(L);  /* cannot find anything */
+    return 1;
+  }
+  /* explicit request or no special characters? */
+  if (find && (lua_toboolean(L, 4) || nospecials(p, lp))) {
+    /* do a plain search */
+    const char *s2 = lmemfind(s + init - 1, ls - (size_t)init + 1, p, lp);
+    if (s2) {
+      lua_pushinteger(L, (s2 - s) + 1);
+      lua_pushinteger(L, (s2 - s) + lp);
+      return 2;
+    }
+  }
+  else {
+    MatchState ms;
+    const char *s1 = s + init - 1;
+    int anchor = (*p == '^');
+    if (anchor) {
+      p++; lp--;  /* skip anchor character */
+    }
+    prepstate(&ms, L, s, ls, p, lp);
+    do {
+      const char *res;
+      reprepstate(&ms);
+      if ((res=match(&ms, s1, p)) != NULL) {
+        if (find) {
+          lua_pushinteger(L, (s1 - s) + 1);  /* start */
+          lua_pushinteger(L, res - s);   /* end */
+          return push_captures(&ms, NULL, 0) + 2;
+        }
+        else
+          return push_captures(&ms, s1, res);
+      }
+    } while (s1++ < ms.src_end && !anchor);
+  }
+  lua_pushnil(L);  /* not found */
+  return 1;
+}
+
+
+static int str_find (lua_State *L) {
+  return str_find_aux(L, 1);
+}
+
+
+static int str_match (lua_State *L) {
+  return str_find_aux(L, 0);
+}
+
+
+/* state for 'gmatch' */
+typedef struct GMatchState {
+  const char *src;  /* current position */
+  const char *p;  /* pattern */
+  const char *lastmatch;  /* end of last match */
+  MatchState ms;  /* match state */
+} GMatchState;
+
+
+static int gmatch_aux (lua_State *L) {
+  GMatchState *gm = (GMatchState *)lua_touserdata(L, lua_upvalueindex(3));
+  const char *src;
+  gm->ms.L = L;
+  for (src = gm->src; src <= gm->ms.src_end; src++) {
+    const char *e;
+    reprepstate(&gm->ms);
+    if ((e = match(&gm->ms, src, gm->p)) != NULL && e != gm->lastmatch) {
+      gm->src = gm->lastmatch = e;
+      return push_captures(&gm->ms, src, e);
+    }
+  }
+  return 0;  /* not found */
+}
+
+
+static int gmatch (lua_State *L) {
+  size_t ls, lp;
+  const char *s = luaL_checklstring(L, 1, &ls);
+  const char *p = luaL_checklstring(L, 2, &lp);
+  GMatchState *gm;
+  lua_settop(L, 2);  /* keep them on closure to avoid being collected */
+  gm = (GMatchState *)lua_newuserdata(L, sizeof(GMatchState));
+  prepstate(&gm->ms, L, s, ls, p, lp);
+  gm->src = s; gm->p = p; gm->lastmatch = NULL;
+  lua_pushcclosure(L, gmatch_aux, 3);
+  return 1;
+}
+
+
+static void add_s (MatchState *ms, luaL_Buffer *b, const char *s,
+                                                   const char *e) {
+  size_t l, i;
+  lua_State *L = ms->L;
+  const char *news = lua_tolstring(L, 3, &l);
+  for (i = 0; i < l; i++) {
+    if (news[i] != L_ESC)
+      luaL_addchar(b, news[i]);
+    else {
+      i++;  /* skip ESC */
+      if (!isdigit(uchar(news[i]))) {
+        if (news[i] != L_ESC)
+          luaL_error(L, "invalid use of '%c' in replacement string", L_ESC);
+        luaL_addchar(b, news[i]);
+      }
+      else if (news[i] == '0')
+          luaL_addlstring(b, s, e - s);
+      else {
+        push_onecapture(ms, news[i] - '1', s, e);
+        luaL_tolstring(L, -1, NULL);  /* if number, convert it to string */
+        lua_remove(L, -2);  /* remove original value */
+        luaL_addvalue(b);  /* add capture to accumulated result */
+      }
+    }
+  }
+}
+
+
+static void add_value (MatchState *ms, luaL_Buffer *b, const char *s,
+                                       const char *e, int tr) {
+  lua_State *L = ms->L;
+  switch (tr) {
+    case LUA_TFUNCTION: {
+      int n;
+      lua_pushvalue(L, 3);
+      n = push_captures(ms, s, e);
+      lua_call(L, n, 1);
+      break;
+    }
+    case LUA_TTABLE: {
+      push_onecapture(ms, 0, s, e);
+      lua_gettable(L, 3);
+      break;
+    }
+    default: {  /* LUA_TNUMBER or LUA_TSTRING */
+      add_s(ms, b, s, e);
+      return;
+    }
+  }
+  if (!lua_toboolean(L, -1)) {  /* nil or false? */
+    lua_pop(L, 1);
+    lua_pushlstring(L, s, e - s);  /* keep original text */
+  }
+  else if (!lua_isstring(L, -1))
+    luaL_error(L, "invalid replacement value (a %s)", luaL_typename(L, -1));
+  luaL_addvalue(b);  /* add result to accumulator */
+}
+
+
+static int str_gsub (lua_State *L) {
+  size_t srcl, lp;
+  const char *src = luaL_checklstring(L, 1, &srcl);  /* subject */
+  const char *p = luaL_checklstring(L, 2, &lp);  /* pattern */
+  const char *lastmatch = NULL;  /* end of last match */
+  int tr = lua_type(L, 3);  /* replacement type */
+  lua_Integer max_s = luaL_optinteger(L, 4, srcl + 1);  /* max replacements */
+  int anchor = (*p == '^');
+  lua_Integer n = 0;  /* replacement count */
+  MatchState ms;
+  luaL_Buffer b;
+  luaL_argcheck(L, tr == LUA_TNUMBER || tr == LUA_TSTRING ||
+                   tr == LUA_TFUNCTION || tr == LUA_TTABLE, 3,
+                      "string/function/table expected");
+  luaL_buffinit(L, &b);
+  if (anchor) {
+    p++; lp--;  /* skip anchor character */
+  }
+  prepstate(&ms, L, src, srcl, p, lp);
+  while (n < max_s) {
+    const char *e;
+    reprepstate(&ms);  /* (re)prepare state for new match */
+    if ((e = match(&ms, src, p)) != NULL && e != lastmatch) {  /* match? */
+      n++;
+      add_value(&ms, &b, src, e, tr);  /* add replacement to buffer */
+      src = lastmatch = e;
+    }
+    else if (src < ms.src_end)  /* otherwise, skip one character */
+      luaL_addchar(&b, *src++);
+    else break;  /* end of subject */
+    if (anchor) break;
+  }
+  luaL_addlstring(&b, src, ms.src_end-src);
+  luaL_pushresult(&b);
+  lua_pushinteger(L, n);  /* number of substitutions */
+  return 2;
+}
+
+/* }====================================================== */
+
+
+
+/*
+** {======================================================
+** STRING FORMAT
+** =======================================================
+*/
+
+#if !defined(lua_number2strx)	/* { */
+
+/*
+** Hexadecimal floating-point formatter
+*/
+
+#include <math.h>
+
+#define SIZELENMOD	(sizeof(LUA_NUMBER_FRMLEN)/sizeof(char))
+
+
+/*
+** Number of bits that goes into the first digit. It can be any value
+** between 1 and 4; the following definition tries to align the number
+** to nibble boundaries by making what is left after that first digit a
+** multiple of 4.
+*/
+#define L_NBFD		((l_mathlim(MANT_DIG) - 1)%4 + 1)
+
+
+/*
+** Add integer part of 'x' to buffer and return new 'x'
+*/
+static lua_Number adddigit (char *buff, int n, lua_Number x) {
+  lua_Number dd = l_mathop(floor)(x);  /* get integer part from 'x' */
+  int d = (int)dd;
+  buff[n] = (d < 10 ? d + '0' : d - 10 + 'a');  /* add to buffer */
+  return x - dd;  /* return what is left */
+}
+
+
+static int num2straux (char *buff, int sz, lua_Number x) {
+  if (x != x || x == HUGE_VAL || x == -HUGE_VAL)  /* inf or NaN? */
+    return l_sprintf(buff, sz, LUA_NUMBER_FMT, x);  /* equal to '%g' */
+  else if (x == 0) {  /* can be -0... */
+    /* create "0" or "-0" followed by exponent */
+    return l_sprintf(buff, sz, LUA_NUMBER_FMT "x0p+0", x);
+  }
+  else {
+    int e;
+    lua_Number m = l_mathop(frexp)(x, &e);  /* 'x' fraction and exponent */
+    int n = 0;  /* character count */
+    if (m < 0) {  /* is number negative? */
+      buff[n++] = '-';  /* add signal */
+      m = -m;  /* make it positive */
+    }
+    buff[n++] = '0'; buff[n++] = 'x';  /* add "0x" */
+    m = adddigit(buff, n++, m * (1 << L_NBFD));  /* add first digit */
+    e -= L_NBFD;  /* this digit goes before the radix point */
+    if (m > 0) {  /* more digits? */
+      buff[n++] = lua_getlocaledecpoint();  /* add radix point */
+      do {  /* add as many digits as needed */
+        m = adddigit(buff, n++, m * 16);
+      } while (m > 0);
+    }
+    n += l_sprintf(buff + n, sz - n, "p%+d", e);  /* add exponent */
+    lua_assert(n < sz);
+    return n;
+  }
+}
+
+
+static int lua_number2strx (lua_State *L, char *buff, int sz,
+                            const char *fmt, lua_Number x) {
+  int n = num2straux(buff, sz, x);
+  if (fmt[SIZELENMOD] == 'A') {
+    int i;
+    for (i = 0; i < n; i++)
+      buff[i] = toupper(uchar(buff[i]));
+  }
+  else if (fmt[SIZELENMOD] != 'a')
+    luaL_error(L, "modifiers for format '%%a'/'%%A' not implemented");
+  return n;
+}
+
+#endif				/* } */
+
+
+/*
+** Maximum size of each formatted item. This maximum size is produced
+** by format('%.99f', -maxfloat), and is equal to 99 + 3 ('-', '.',
+** and '\0') + number of decimal digits to represent maxfloat (which
+** is maximum exponent + 1). (99+3+1 then rounded to 120 for "extra
+** expenses", such as locale-dependent stuff)
+*/
+#define MAX_ITEM        (120 + l_mathlim(MAX_10_EXP))
+
+
+/* valid flags in a format specification */
+#define FLAGS	"-+ #0"
+
+/*
+** maximum size of each format specification (such as "%-099.99d")
+*/
+#define MAX_FORMAT	32
+
+
+static void addquoted (luaL_Buffer *b, const char *s, size_t len) {
+  luaL_addchar(b, '"');
+  while (len--) {
+    if (*s == '"' || *s == '\\' || *s == '\n') {
+      luaL_addchar(b, '\\');
+      luaL_addchar(b, *s);
+    }
+    else if (iscntrl(uchar(*s))) {
+      char buff[10];
+      if (!isdigit(uchar(*(s+1))))
+        l_sprintf(buff, sizeof(buff), "\\%d", (int)uchar(*s));
+      else
+        l_sprintf(buff, sizeof(buff), "\\%03d", (int)uchar(*s));
+      luaL_addstring(b, buff);
+    }
+    else
+      luaL_addchar(b, *s);
+    s++;
+  }
+  luaL_addchar(b, '"');
+}
+
+
+/*
+** Ensures the 'buff' string uses a dot as the radix character.
+*/
+static void checkdp (char *buff, int nb) {
+  if (memchr(buff, '.', nb) == NULL) {  /* no dot? */
+    char point = lua_getlocaledecpoint();  /* try locale point */
+    char *ppoint = (char*) memchr(buff, point, nb);
+    if (ppoint) *ppoint = '.';  /* change it to a dot */
+  }
+}
+
+
+static void addliteral (lua_State *L, luaL_Buffer *b, int arg) {
+  switch (lua_type(L, arg)) {
+    case LUA_TSTRING: {
+      size_t len;
+      const char *s = lua_tolstring(L, arg, &len);
+      addquoted(b, s, len);
+      break;
+    }
+    case LUA_TNUMBER: {
+      char *buff = luaL_prepbuffsize(b, MAX_ITEM);
+      int nb;
+      if (!lua_isinteger(L, arg)) {  /* float? */
+        lua_Number n = lua_tonumber(L, arg);  /* write as hexa ('%a') */
+        nb = lua_number2strx(L, buff, MAX_ITEM, "%" LUA_NUMBER_FRMLEN "a", n);
+        checkdp(buff, nb);  /* ensure it uses a dot */
+      }
+      else {  /* integers */
+        lua_Integer n = lua_tointeger(L, arg);
+        const char *format = (n == LUA_MININTEGER)  /* corner case? */
+                           ? "0x%" LUA_INTEGER_FRMLEN "x"  /* use hexa */
+                           : LUA_INTEGER_FMT;  /* else use default format */
+        nb = l_sprintf(buff, MAX_ITEM, format, n);
+      }
+      luaL_addsize(b, nb);
+      break;
+    }
+    case LUA_TNIL: case LUA_TBOOLEAN: {
+      luaL_tolstring(L, arg, NULL);
+      luaL_addvalue(b);
+      break;
+    }
+    default: {
+      luaL_argerror(L, arg, "value has no literal form");
+    }
+  }
+}
+
+
+static const char *scanformat (lua_State *L, const char *strfrmt, char *form) {
+  const char *p = strfrmt;
+  while (*p != '\0' && strchr(FLAGS, *p) != NULL) p++;  /* skip flags */
+  if ((size_t)(p - strfrmt) >= sizeof(FLAGS)/sizeof(char))
+    luaL_error(L, "invalid format (repeated flags)");
+  if (isdigit(uchar(*p))) p++;  /* skip width */
+  if (isdigit(uchar(*p))) p++;  /* (2 digits at most) */
+  if (*p == '.') {
+    p++;
+    if (isdigit(uchar(*p))) p++;  /* skip precision */
+    if (isdigit(uchar(*p))) p++;  /* (2 digits at most) */
+  }
+  if (isdigit(uchar(*p)))
+    luaL_error(L, "invalid format (width or precision too long)");
+  *(form++) = '%';
+  memcpy(form, strfrmt, ((p - strfrmt) + 1) * sizeof(char));
+  form += (p - strfrmt) + 1;
+  *form = '\0';
+  return p;
+}
+
+
+/*
+** add length modifier into formats
+*/
+static void addlenmod (char *form, const char *lenmod) {
+  size_t l = strlen(form);
+  size_t lm = strlen(lenmod);
+  char spec = form[l - 1];
+  strcpy(form + l - 1, lenmod);
+  form[l + lm - 1] = spec;
+  form[l + lm] = '\0';
+}
+
+
+static int str_format (lua_State *L) {
+  int top = lua_gettop(L);
+  int arg = 1;
+  size_t sfl;
+  const char *strfrmt = luaL_checklstring(L, arg, &sfl);
+  const char *strfrmt_end = strfrmt+sfl;
+  luaL_Buffer b;
+  luaL_buffinit(L, &b);
+  while (strfrmt < strfrmt_end) {
+    if (*strfrmt != L_ESC)
+      luaL_addchar(&b, *strfrmt++);
+    else if (*++strfrmt == L_ESC)
+      luaL_addchar(&b, *strfrmt++);  /* %% */
+    else { /* format item */
+      char form[MAX_FORMAT];  /* to store the format ('%...') */
+      char *buff = luaL_prepbuffsize(&b, MAX_ITEM);  /* to put formatted item */
+      int nb = 0;  /* number of bytes in added item */
+      if (++arg > top)
+        luaL_argerror(L, arg, "no value");
+      strfrmt = scanformat(L, strfrmt, form);
+      switch (*strfrmt++) {
+        case 'c': {
+          nb = l_sprintf(buff, MAX_ITEM, form, (int)luaL_checkinteger(L, arg));
+          break;
+        }
+        case 'd': case 'i':
+        case 'o': case 'u': case 'x': case 'X': {
+          lua_Integer n = luaL_checkinteger(L, arg);
+          addlenmod(form, LUA_INTEGER_FRMLEN);
+          nb = l_sprintf(buff, MAX_ITEM, form, n);
+          break;
+        }
+        case 'a': case 'A':
+          addlenmod(form, LUA_NUMBER_FRMLEN);
+          nb = lua_number2strx(L, buff, MAX_ITEM, form,
+                                  luaL_checknumber(L, arg));
+          break;
+        case 'e': case 'E': case 'f':
+        case 'g': case 'G': {
+          addlenmod(form, LUA_NUMBER_FRMLEN);
+          nb = l_sprintf(buff, MAX_ITEM, form, luaL_checknumber(L, arg));
+          break;
+        }
+        case 'q': {
+          addliteral(L, &b, arg);
+          break;
+        }
+        case 's': {
+          size_t l;
+          const char *s = luaL_tolstring(L, arg, &l);
+          if (form[2] == '\0')  /* no modifiers? */
+            luaL_addvalue(&b);  /* keep entire string */
+          else {
+            luaL_argcheck(L, l == strlen(s), arg, "string contains zeros");
+            if (!strchr(form, '.') && l >= 100) {
+              /* no precision and string is too long to be formatted */
+              luaL_addvalue(&b);  /* keep entire string */
+            }
+            else {  /* format the string into 'buff' */
+              nb = l_sprintf(buff, MAX_ITEM, form, s);
+              lua_pop(L, 1);  /* remove result from 'luaL_tolstring' */
+            }
+          }
+          break;
+        }
+        default: {  /* also treat cases 'pnLlh' */
+          return luaL_error(L, "invalid option '%%%c' to 'format'",
+                               *(strfrmt - 1));
+        }
+      }
+      lua_assert(nb < MAX_ITEM);
+      luaL_addsize(&b, nb);
+    }
+  }
+  luaL_pushresult(&b);
+  return 1;
+}
+
+/* }====================================================== */
+
+
+/*
+** {======================================================
+** PACK/UNPACK
+** =======================================================
+*/
+
+
+/* value used for padding */
+#if !defined(LUAL_PACKPADBYTE)
+#define LUAL_PACKPADBYTE		0x00
+#endif
+
+/* maximum size for the binary representation of an integer */
+#define MAXINTSIZE	16
+
+/* number of bits in a character */
+#define NB	CHAR_BIT
+
+/* mask for one character (NB 1's) */
+#define MC	((1 << NB) - 1)
+
+/* size of a lua_Integer */
+#define SZINT	((int)sizeof(lua_Integer))
+
+
+/* dummy union to get native endianness */
+static const union {
+  int dummy;
+  char little;  /* true iff machine is little endian */
+} nativeendian = {1};
+
+
+/* dummy structure to get native alignment requirements */
+struct cD {
+  char c;
+  union { double d; void *p; lua_Integer i; lua_Number n; } u;
+};
+
+#define MAXALIGN	(offsetof(struct cD, u))
+
+
+/*
+** Union for serializing floats
+*/
+typedef union Ftypes {
+  float f;
+  double d;
+  lua_Number n;
+  char buff[5 * sizeof(lua_Number)];  /* enough for any float type */
+} Ftypes;
+
+
+/*
+** information to pack/unpack stuff
+*/
+typedef struct Header {
+  lua_State *L;
+  int islittle;
+  int maxalign;
+} Header;
+
+
+/*
+** options for pack/unpack
+*/
+typedef enum KOption {
+  Kint,		/* signed integers */
+  Kuint,	/* unsigned integers */
+  Kfloat,	/* floating-point numbers */
+  Kchar,	/* fixed-length strings */
+  Kstring,	/* strings with prefixed length */
+  Kzstr,	/* zero-terminated strings */
+  Kpadding,	/* padding */
+  Kpaddalign,	/* padding for alignment */
+  Knop		/* no-op (configuration or spaces) */
+} KOption;
+
+
+/*
+** Read an integer numeral from string 'fmt' or return 'df' if
+** there is no numeral
+*/
+static int digit (int c) { return '0' <= c && c <= '9'; }
+
+static int getnum (const char **fmt, int df) {
+  if (!digit(**fmt))  /* no number? */
+    return df;  /* return default value */
+  else {
+    int a = 0;
+    do {
+      a = a*10 + (*((*fmt)++) - '0');
+    } while (digit(**fmt) && a <= ((int)MAXSIZE - 9)/10);
+    return a;
+  }
+}
+
+
+/*
+** Read an integer numeral and raises an error if it is larger
+** than the maximum size for integers.
+*/
+static int getnumlimit (Header *h, const char **fmt, int df) {
+  int sz = getnum(fmt, df);
+  if (sz > MAXINTSIZE || sz <= 0)
+    luaL_error(h->L, "integral size (%d) out of limits [1,%d]",
+                     sz, MAXINTSIZE);
+  return sz;
+}
+
+
+/*
+** Initialize Header
+*/
+static void initheader (lua_State *L, Header *h) {
+  h->L = L;
+  h->islittle = nativeendian.little;
+  h->maxalign = 1;
+}
+
+
+/*
+** Read and classify next option. 'size' is filled with option's size.
+*/
+static KOption getoption (Header *h, const char **fmt, int *size) {
+  int opt = *((*fmt)++);
+  *size = 0;  /* default */
+  switch (opt) {
+    case 'b': *size = sizeof(char); return Kint;
+    case 'B': *size = sizeof(char); return Kuint;
+    case 'h': *size = sizeof(short); return Kint;
+    case 'H': *size = sizeof(short); return Kuint;
+    case 'l': *size = sizeof(long); return Kint;
+    case 'L': *size = sizeof(long); return Kuint;
+    case 'j': *size = sizeof(lua_Integer); return Kint;
+    case 'J': *size = sizeof(lua_Integer); return Kuint;
+    case 'T': *size = sizeof(size_t); return Kuint;
+    case 'f': *size = sizeof(float); return Kfloat;
+    case 'd': *size = sizeof(double); return Kfloat;
+    case 'n': *size = sizeof(lua_Number); return Kfloat;
+    case 'i': *size = getnumlimit(h, fmt, sizeof(int)); return Kint;
+    case 'I': *size = getnumlimit(h, fmt, sizeof(int)); return Kuint;
+    case 's': *size = getnumlimit(h, fmt, sizeof(size_t)); return Kstring;
+    case 'c':
+      *size = getnum(fmt, -1);
+      if (*size == -1)
+        luaL_error(h->L, "missing size for format option 'c'");
+      return Kchar;
+    case 'z': return Kzstr;
+    case 'x': *size = 1; return Kpadding;
+    case 'X': return Kpaddalign;
+    case ' ': break;
+    case '<': h->islittle = 1; break;
+    case '>': h->islittle = 0; break;
+    case '=': h->islittle = nativeendian.little; break;
+    case '!': h->maxalign = getnumlimit(h, fmt, MAXALIGN); break;
+    default: luaL_error(h->L, "invalid format option '%c'", opt);
+  }
+  return Knop;
+}
+
+
+/*
+** Read, classify, and fill other details about the next option.
+** 'psize' is filled with option's size, 'notoalign' with its
+** alignment requirements.
+** Local variable 'size' gets the size to be aligned. (Kpadal option
+** always gets its full alignment, other options are limited by 
+** the maximum alignment ('maxalign'). Kchar option needs no alignment
+** despite its size.
+*/
+static KOption getdetails (Header *h, size_t totalsize,
+                           const char **fmt, int *psize, int *ntoalign) {
+  KOption opt = getoption(h, fmt, psize);
+  int align = *psize;  /* usually, alignment follows size */
+  if (opt == Kpaddalign) {  /* 'X' gets alignment from following option */
+    if (**fmt == '\0' || getoption(h, fmt, &align) == Kchar || align == 0)
+      luaL_argerror(h->L, 1, "invalid next option for option 'X'");
+  }
+  if (align <= 1 || opt == Kchar)  /* need no alignment? */
+    *ntoalign = 0;
+  else {
+    if (align > h->maxalign)  /* enforce maximum alignment */
+      align = h->maxalign;
+    if ((align & (align - 1)) != 0)  /* is 'align' not a power of 2? */
+      luaL_argerror(h->L, 1, "format asks for alignment not power of 2");
+    *ntoalign = (align - (int)(totalsize & (align - 1))) & (align - 1);
+  }
+  return opt;
+}
+
+
+/*
+** Pack integer 'n' with 'size' bytes and 'islittle' endianness.
+** The final 'if' handles the case when 'size' is larger than
+** the size of a Lua integer, correcting the extra sign-extension
+** bytes if necessary (by default they would be zeros).
+*/
+static void packint (luaL_Buffer *b, lua_Unsigned n,
+                     int islittle, int size, int neg) {
+  char *buff = luaL_prepbuffsize(b, size);
+  int i;
+  buff[islittle ? 0 : size - 1] = (char)(n & MC);  /* first byte */
+  for (i = 1; i < size; i++) {
+    n >>= NB;
+    buff[islittle ? i : size - 1 - i] = (char)(n & MC);
+  }
+  if (neg && size > SZINT) {  /* negative number need sign extension? */
+    for (i = SZINT; i < size; i++)  /* correct extra bytes */
+      buff[islittle ? i : size - 1 - i] = (char)MC;
+  }
+  luaL_addsize(b, size);  /* add result to buffer */
+}
+
+
+/*
+** Copy 'size' bytes from 'src' to 'dest', correcting endianness if
+** given 'islittle' is different from native endianness.
+*/
+static void copywithendian (volatile char *dest, volatile const char *src,
+                            int size, int islittle) {
+  if (islittle == nativeendian.little) {
+    while (size-- != 0)
+      *(dest++) = *(src++);
+  }
+  else {
+    dest += size - 1;
+    while (size-- != 0)
+      *(dest--) = *(src++);
+  }
+}
+
+
+static int str_pack (lua_State *L) {
+  luaL_Buffer b;
+  Header h;
+  const char *fmt = luaL_checkstring(L, 1);  /* format string */
+  int arg = 1;  /* current argument to pack */
+  size_t totalsize = 0;  /* accumulate total size of result */
+  initheader(L, &h);
+  lua_pushnil(L);  /* mark to separate arguments from string buffer */
+  luaL_buffinit(L, &b);
+  while (*fmt != '\0') {
+    int size, ntoalign;
+    KOption opt = getdetails(&h, totalsize, &fmt, &size, &ntoalign);
+    totalsize += ntoalign + size;
+    while (ntoalign-- > 0)
+     luaL_addchar(&b, LUAL_PACKPADBYTE);  /* fill alignment */
+    arg++;
+    switch (opt) {
+      case Kint: {  /* signed integers */
+        lua_Integer n = luaL_checkinteger(L, arg);
+        if (size < SZINT) {  /* need overflow check? */
+          lua_Integer lim = (lua_Integer)1 << ((size * NB) - 1);
+          luaL_argcheck(L, -lim <= n && n < lim, arg, "integer overflow");
+        }
+        packint(&b, (lua_Unsigned)n, h.islittle, size, (n < 0));
+        break;
+      }
+      case Kuint: {  /* unsigned integers */
+        lua_Integer n = luaL_checkinteger(L, arg);
+        if (size < SZINT)  /* need overflow check? */
+          luaL_argcheck(L, (lua_Unsigned)n < ((lua_Unsigned)1 << (size * NB)),
+                           arg, "unsigned overflow");
+        packint(&b, (lua_Unsigned)n, h.islittle, size, 0);
+        break;
+      }
+      case Kfloat: {  /* floating-point options */
+        volatile Ftypes u;
+        char *buff = luaL_prepbuffsize(&b, size);
+        lua_Number n = luaL_checknumber(L, arg);  /* get argument */
+        if (size == sizeof(u.f)) u.f = (float)n;  /* copy it into 'u' */
+        else if (size == sizeof(u.d)) u.d = (double)n;
+        else u.n = n;
+        /* move 'u' to final result, correcting endianness if needed */
+        copywithendian(buff, u.buff, size, h.islittle);
+        luaL_addsize(&b, size);
+        break;
+      }
+      case Kchar: {  /* fixed-size string */
+        size_t len;
+        const char *s = luaL_checklstring(L, arg, &len);
+        luaL_argcheck(L, len <= (size_t)size, arg,
+                         "string longer than given size");
+        luaL_addlstring(&b, s, len);  /* add string */
+        while (len++ < (size_t)size)  /* pad extra space */
+          luaL_addchar(&b, LUAL_PACKPADBYTE);
+        break;
+      }
+      case Kstring: {  /* strings with length count */
+        size_t len;
+        const char *s = luaL_checklstring(L, arg, &len);
+        luaL_argcheck(L, size >= (int)sizeof(size_t) ||
+                         len < ((size_t)1 << (size * NB)),
+                         arg, "string length does not fit in given size");
+        packint(&b, (lua_Unsigned)len, h.islittle, size, 0);  /* pack length */
+        luaL_addlstring(&b, s, len);
+        totalsize += len;
+        break;
+      }
+      case Kzstr: {  /* zero-terminated string */
+        size_t len;
+        const char *s = luaL_checklstring(L, arg, &len);
+        luaL_argcheck(L, strlen(s) == len, arg, "string contains zeros");
+        luaL_addlstring(&b, s, len);
+        luaL_addchar(&b, '\0');  /* add zero at the end */
+        totalsize += len + 1;
+        break;
+      }
+      case Kpadding: luaL_addchar(&b, LUAL_PACKPADBYTE);  /* FALLTHROUGH */
+      case Kpaddalign: case Knop:
+        arg--;  /* undo increment */
+        break;
+    }
+  }
+  luaL_pushresult(&b);
+  return 1;
+}
+
+
+static int str_packsize (lua_State *L) {
+  Header h;
+  const char *fmt = luaL_checkstring(L, 1);  /* format string */
+  size_t totalsize = 0;  /* accumulate total size of result */
+  initheader(L, &h);
+  while (*fmt != '\0') {
+    int size, ntoalign;
+    KOption opt = getdetails(&h, totalsize, &fmt, &size, &ntoalign);
+    size += ntoalign;  /* total space used by option */
+    luaL_argcheck(L, totalsize <= MAXSIZE - size, 1,
+                     "format result too large");
+    totalsize += size;
+    switch (opt) {
+      case Kstring:  /* strings with length count */
+      case Kzstr:    /* zero-terminated string */
+        luaL_argerror(L, 1, "variable-length format");
+        /* call never return, but to avoid warnings: *//* FALLTHROUGH */
+      default:  break;
+    }
+  }
+  lua_pushinteger(L, (lua_Integer)totalsize);
+  return 1;
+}
+
+
+/*
+** Unpack an integer with 'size' bytes and 'islittle' endianness.
+** If size is smaller than the size of a Lua integer and integer
+** is signed, must do sign extension (propagating the sign to the
+** higher bits); if size is larger than the size of a Lua integer,
+** it must check the unread bytes to see whether they do not cause an
+** overflow.
+*/
+static lua_Integer unpackint (lua_State *L, const char *str,
+                              int islittle, int size, int issigned) {
+  lua_Unsigned res = 0;
+  int i;
+  int limit = (size  <= SZINT) ? size : SZINT;
+  for (i = limit - 1; i >= 0; i--) {
+    res <<= NB;
+    res |= (lua_Unsigned)(unsigned char)str[islittle ? i : size - 1 - i];
+  }
+  if (size < SZINT) {  /* real size smaller than lua_Integer? */
+    if (issigned) {  /* needs sign extension? */
+      lua_Unsigned mask = (lua_Unsigned)1 << (size*NB - 1);
+      res = ((res ^ mask) - mask);  /* do sign extension */
+    }
+  }
+  else if (size > SZINT) {  /* must check unread bytes */
+    int mask = (!issigned || (lua_Integer)res >= 0) ? 0 : MC;
+    for (i = limit; i < size; i++) {
+      if ((unsigned char)str[islittle ? i : size - 1 - i] != mask)
+        luaL_error(L, "%d-byte integer does not fit into Lua Integer", size);
+    }
+  }
+  return (lua_Integer)res;
+}
+
+
+static int str_unpack (lua_State *L) {
+  Header h;
+  const char *fmt = luaL_checkstring(L, 1);
+  size_t ld;
+  const char *data = luaL_checklstring(L, 2, &ld);
+  size_t pos = (size_t)posrelat(luaL_optinteger(L, 3, 1), ld) - 1;
+  int n = 0;  /* number of results */
+  luaL_argcheck(L, pos <= ld, 3, "initial position out of string");
+  initheader(L, &h);
+  while (*fmt != '\0') {
+    int size, ntoalign;
+    KOption opt = getdetails(&h, pos, &fmt, &size, &ntoalign);
+    if ((size_t)ntoalign + size > ~pos || pos + ntoalign + size > ld)
+      luaL_argerror(L, 2, "data string too short");
+    pos += ntoalign;  /* skip alignment */
+    /* stack space for item + next position */
+    luaL_checkstack(L, 2, "too many results");
+    n++;
+    switch (opt) {
+      case Kint:
+      case Kuint: {
+        lua_Integer res = unpackint(L, data + pos, h.islittle, size,
+                                       (opt == Kint));
+        lua_pushinteger(L, res);
+        break;
+      }
+      case Kfloat: {
+        volatile Ftypes u;
+        lua_Number num;
+        copywithendian(u.buff, data + pos, size, h.islittle);
+        if (size == sizeof(u.f)) num = (lua_Number)u.f;
+        else if (size == sizeof(u.d)) num = (lua_Number)u.d;
+        else num = u.n;
+        lua_pushnumber(L, num);
+        break;
+      }
+      case Kchar: {
+        lua_pushlstring(L, data + pos, size);
+        break;
+      }
+      case Kstring: {
+        size_t len = (size_t)unpackint(L, data + pos, h.islittle, size, 0);
+        luaL_argcheck(L, pos + len + size <= ld, 2, "data string too short");
+        lua_pushlstring(L, data + pos + size, len);
+        pos += len;  /* skip string */
+        break;
+      }
+      case Kzstr: {
+        size_t len = (int)strlen(data + pos);
+        lua_pushlstring(L, data + pos, len);
+        pos += len + 1;  /* skip string plus final '\0' */
+        break;
+      }
+      case Kpaddalign: case Kpadding: case Knop:
+        n--;  /* undo increment */
+        break;
+    }
+    pos += size;
+  }
+  lua_pushinteger(L, pos + 1);  /* next position */
+  return n + 1;
+}
+
+/* }====================================================== */
+
+
+static const luaL_Reg strlib[] = {
+  {"byte", str_byte},
+  {"char", str_char},
+  {"dump", str_dump},
+  {"find", str_find},
+  {"format", str_format},
+  {"gmatch", gmatch},
+  {"gsub", str_gsub},
+  {"len", str_len},
+  {"lower", str_lower},
+  {"match", str_match},
+  {"rep", str_rep},
+  {"reverse", str_reverse},
+  {"sub", str_sub},
+  {"upper", str_upper},
+  {"pack", str_pack},
+  {"packsize", str_packsize},
+  {"unpack", str_unpack},
+  {NULL, NULL}
+};
+
+
+static void createmetatable (lua_State *L) {
+  lua_createtable(L, 0, 1);  /* table to be metatable for strings */
+  lua_pushliteral(L, "");  /* dummy string */
+  lua_pushvalue(L, -2);  /* copy table */
+  lua_setmetatable(L, -2);  /* set table as metatable for strings */
+  lua_pop(L, 1);  /* pop dummy string */
+  lua_pushvalue(L, -2);  /* get string library */
+  lua_setfield(L, -2, "__index");  /* metatable.__index = string */
+  lua_pop(L, 1);  /* pop metatable */
+}
+
+
+/*
+** Open string library
+*/
+LUAMOD_API int luaopen_string (lua_State *L) {
+  luaL_newlib(L, strlib);
+  createmetatable(L);
+  return 1;
+}
+
diff --git a/libs/lua/lua-5.3.3/ltable.c b/libs/lua/lua-5.3.3/ltable.c
new file mode 100644
index 0000000..7e15b71
--- /dev/null
+++ b/libs/lua/lua-5.3.3/ltable.c
@@ -0,0 +1,669 @@
+/*
+** $Id: ltable.c,v 2.117 2015/11/19 19:16:22 roberto Exp $
+** Lua tables (hash)
+** See Copyright Notice in lua.h
+*/
+
+#define ltable_c
+#define LUA_CORE
+
+#include "lprefix.h"
+
+
+/*
+** Implementation of tables (aka arrays, objects, or hash tables).
+** Tables keep its elements in two parts: an array part and a hash part.
+** Non-negative integer keys are all candidates to be kept in the array
+** part. The actual size of the array is the largest 'n' such that
+** more than half the slots between 1 and n are in use.
+** Hash uses a mix of chained scatter table with Brent's variation.
+** A main invariant of these tables is that, if an element is not
+** in its main position (i.e. the 'original' position that its hash gives
+** to it), then the colliding element is in its own main position.
+** Hence even when the load factor reaches 100%, performance remains good.
+*/
+
+#include <math.h>
+#include <limits.h>
+
+#include "lua.h"
+
+#include "ldebug.h"
+#include "ldo.h"
+#include "lgc.h"
+#include "lmem.h"
+#include "lobject.h"
+#include "lstate.h"
+#include "lstring.h"
+#include "ltable.h"
+#include "lvm.h"
+
+
+/*
+** Maximum size of array part (MAXASIZE) is 2^MAXABITS. MAXABITS is
+** the largest integer such that MAXASIZE fits in an unsigned int.
+*/
+#define MAXABITS	cast_int(sizeof(int) * CHAR_BIT - 1)
+#define MAXASIZE	(1u << MAXABITS)
+
+/*
+** Maximum size of hash part is 2^MAXHBITS. MAXHBITS is the largest
+** integer such that 2^MAXHBITS fits in a signed int. (Note that the
+** maximum number of elements in a table, 2^MAXABITS + 2^MAXHBITS, still
+** fits comfortably in an unsigned int.)
+*/
+#define MAXHBITS	(MAXABITS - 1)
+
+
+#define hashpow2(t,n)		(gnode(t, lmod((n), sizenode(t))))
+
+#define hashstr(t,str)		hashpow2(t, (str)->hash)
+#define hashboolean(t,p)	hashpow2(t, p)
+#define hashint(t,i)		hashpow2(t, i)
+
+
+/*
+** for some types, it is better to avoid modulus by power of 2, as
+** they tend to have many 2 factors.
+*/
+#define hashmod(t,n)	(gnode(t, ((n) % ((sizenode(t)-1)|1))))
+
+
+#define hashpointer(t,p)	hashmod(t, point2uint(p))
+
+
+#define dummynode		(&dummynode_)
+
+#define isdummy(n)		((n) == dummynode)
+
+static const Node dummynode_ = {
+  {NILCONSTANT},  /* value */
+  {{NILCONSTANT, 0}}  /* key */
+};
+
+
+/*
+** Hash for floating-point numbers.
+** The main computation should be just
+**     n = frexp(n, &i); return (n * INT_MAX) + i
+** but there are some numerical subtleties.
+** In a two-complement representation, INT_MAX does not has an exact
+** representation as a float, but INT_MIN does; because the absolute
+** value of 'frexp' is smaller than 1 (unless 'n' is inf/NaN), the
+** absolute value of the product 'frexp * -INT_MIN' is smaller or equal
+** to INT_MAX. Next, the use of 'unsigned int' avoids overflows when
+** adding 'i'; the use of '~u' (instead of '-u') avoids problems with
+** INT_MIN.
+*/
+#if !defined(l_hashfloat)
+static int l_hashfloat (lua_Number n) {
+  int i;
+  lua_Integer ni;
+  n = l_mathop(frexp)(n, &i) * -cast_num(INT_MIN);
+  if (!lua_numbertointeger(n, &ni)) {  /* is 'n' inf/-inf/NaN? */
+    lua_assert(luai_numisnan(n) || l_mathop(fabs)(n) == cast_num(HUGE_VAL));
+    return 0;
+  }
+  else {  /* normal case */
+    unsigned int u = cast(unsigned int, i) + cast(unsigned int, ni);
+    return cast_int(u <= cast(unsigned int, INT_MAX) ? u : ~u);
+  }
+}
+#endif
+
+
+/*
+** returns the 'main' position of an element in a table (that is, the index
+** of its hash value)
+*/
+static Node *mainposition (const Table *t, const TValue *key) {
+  switch (ttype(key)) {
+    case LUA_TNUMINT:
+      return hashint(t, ivalue(key));
+    case LUA_TNUMFLT:
+      return hashmod(t, l_hashfloat(fltvalue(key)));
+    case LUA_TSHRSTR:
+      return hashstr(t, tsvalue(key));
+    case LUA_TLNGSTR:
+      return hashpow2(t, luaS_hashlongstr(tsvalue(key)));
+    case LUA_TBOOLEAN:
+      return hashboolean(t, bvalue(key));
+    case LUA_TLIGHTUSERDATA:
+      return hashpointer(t, pvalue(key));
+    case LUA_TLCF:
+      return hashpointer(t, fvalue(key));
+    default:
+      lua_assert(!ttisdeadkey(key));
+      return hashpointer(t, gcvalue(key));
+  }
+}
+
+
+/*
+** returns the index for 'key' if 'key' is an appropriate key to live in
+** the array part of the table, 0 otherwise.
+*/
+static unsigned int arrayindex (const TValue *key) {
+  if (ttisinteger(key)) {
+    lua_Integer k = ivalue(key);
+    if (0 < k && (lua_Unsigned)k <= MAXASIZE)
+      return cast(unsigned int, k);  /* 'key' is an appropriate array index */
+  }
+  return 0;  /* 'key' did not match some condition */
+}
+
+
+/*
+** returns the index of a 'key' for table traversals. First goes all
+** elements in the array part, then elements in the hash part. The
+** beginning of a traversal is signaled by 0.
+*/
+static unsigned int findindex (lua_State *L, Table *t, StkId key) {
+  unsigned int i;
+  if (ttisnil(key)) return 0;  /* first iteration */
+  i = arrayindex(key);
+  if (i != 0 && i <= t->sizearray)  /* is 'key' inside array part? */
+    return i;  /* yes; that's the index */
+  else {
+    int nx;
+    Node *n = mainposition(t, key);
+    for (;;) {  /* check whether 'key' is somewhere in the chain */
+      /* key may be dead already, but it is ok to use it in 'next' */
+      if (luaV_rawequalobj(gkey(n), key) ||
+            (ttisdeadkey(gkey(n)) && iscollectable(key) &&
+             deadvalue(gkey(n)) == gcvalue(key))) {
+        i = cast_int(n - gnode(t, 0));  /* key index in hash table */
+        /* hash elements are numbered after array ones */
+        return (i + 1) + t->sizearray;
+      }
+      nx = gnext(n);
+      if (nx == 0)
+        luaG_runerror(L, "invalid key to 'next'");  /* key not found */
+      else n += nx;
+    }
+  }
+}
+
+
+int luaH_next (lua_State *L, Table *t, StkId key) {
+  unsigned int i = findindex(L, t, key);  /* find original element */
+  for (; i < t->sizearray; i++) {  /* try first array part */
+    if (!ttisnil(&t->array[i])) {  /* a non-nil value? */
+      setivalue(key, i + 1);
+      setobj2s(L, key+1, &t->array[i]);
+      return 1;
+    }
+  }
+  for (i -= t->sizearray; cast_int(i) < sizenode(t); i++) {  /* hash part */
+    if (!ttisnil(gval(gnode(t, i)))) {  /* a non-nil value? */
+      setobj2s(L, key, gkey(gnode(t, i)));
+      setobj2s(L, key+1, gval(gnode(t, i)));
+      return 1;
+    }
+  }
+  return 0;  /* no more elements */
+}
+
+
+/*
+** {=============================================================
+** Rehash
+** ==============================================================
+*/
+
+/*
+** Compute the optimal size for the array part of table 't'. 'nums' is a
+** "count array" where 'nums[i]' is the number of integers in the table
+** between 2^(i - 1) + 1 and 2^i. 'pna' enters with the total number of
+** integer keys in the table and leaves with the number of keys that
+** will go to the array part; return the optimal size.
+*/
+static unsigned int computesizes (unsigned int nums[], unsigned int *pna) {
+  int i;
+  unsigned int twotoi;  /* 2^i (candidate for optimal size) */
+  unsigned int a = 0;  /* number of elements smaller than 2^i */
+  unsigned int na = 0;  /* number of elements to go to array part */
+  unsigned int optimal = 0;  /* optimal size for array part */
+  /* loop while keys can fill more than half of total size */
+  for (i = 0, twotoi = 1; *pna > twotoi / 2; i++, twotoi *= 2) {
+    if (nums[i] > 0) {
+      a += nums[i];
+      if (a > twotoi/2) {  /* more than half elements present? */
+        optimal = twotoi;  /* optimal size (till now) */
+        na = a;  /* all elements up to 'optimal' will go to array part */
+      }
+    }
+  }
+  lua_assert((optimal == 0 || optimal / 2 < na) && na <= optimal);
+  *pna = na;
+  return optimal;
+}
+
+
+static int countint (const TValue *key, unsigned int *nums) {
+  unsigned int k = arrayindex(key);
+  if (k != 0) {  /* is 'key' an appropriate array index? */
+    nums[luaO_ceillog2(k)]++;  /* count as such */
+    return 1;
+  }
+  else
+    return 0;
+}
+
+
+/*
+** Count keys in array part of table 't': Fill 'nums[i]' with
+** number of keys that will go into corresponding slice and return
+** total number of non-nil keys.
+*/
+static unsigned int numusearray (const Table *t, unsigned int *nums) {
+  int lg;
+  unsigned int ttlg;  /* 2^lg */
+  unsigned int ause = 0;  /* summation of 'nums' */
+  unsigned int i = 1;  /* count to traverse all array keys */
+  /* traverse each slice */
+  for (lg = 0, ttlg = 1; lg <= MAXABITS; lg++, ttlg *= 2) {
+    unsigned int lc = 0;  /* counter */
+    unsigned int lim = ttlg;
+    if (lim > t->sizearray) {
+      lim = t->sizearray;  /* adjust upper limit */
+      if (i > lim)
+        break;  /* no more elements to count */
+    }
+    /* count elements in range (2^(lg - 1), 2^lg] */
+    for (; i <= lim; i++) {
+      if (!ttisnil(&t->array[i-1]))
+        lc++;
+    }
+    nums[lg] += lc;
+    ause += lc;
+  }
+  return ause;
+}
+
+
+static int numusehash (const Table *t, unsigned int *nums, unsigned int *pna) {
+  int totaluse = 0;  /* total number of elements */
+  int ause = 0;  /* elements added to 'nums' (can go to array part) */
+  int i = sizenode(t);
+  while (i--) {
+    Node *n = &t->node[i];
+    if (!ttisnil(gval(n))) {
+      ause += countint(gkey(n), nums);
+      totaluse++;
+    }
+  }
+  *pna += ause;
+  return totaluse;
+}
+
+
+static void setarrayvector (lua_State *L, Table *t, unsigned int size) {
+  unsigned int i;
+  luaM_reallocvector(L, t->array, t->sizearray, size, TValue);
+  for (i=t->sizearray; i<size; i++)
+     setnilvalue(&t->array[i]);
+  t->sizearray = size;
+}
+
+
+static void setnodevector (lua_State *L, Table *t, unsigned int size) {
+  int lsize;
+  if (size == 0) {  /* no elements to hash part? */
+    t->node = cast(Node *, dummynode);  /* use common 'dummynode' */
+    lsize = 0;
+  }
+  else {
+    int i;
+    lsize = luaO_ceillog2(size);
+    if (lsize > MAXHBITS)
+      luaG_runerror(L, "table overflow");
+    size = twoto(lsize);
+    t->node = luaM_newvector(L, size, Node);
+    for (i = 0; i < (int)size; i++) {
+      Node *n = gnode(t, i);
+      gnext(n) = 0;
+      setnilvalue(wgkey(n));
+      setnilvalue(gval(n));
+    }
+  }
+  t->lsizenode = cast_byte(lsize);
+  t->lastfree = gnode(t, size);  /* all positions are free */
+}
+
+
+void luaH_resize (lua_State *L, Table *t, unsigned int nasize,
+                                          unsigned int nhsize) {
+  unsigned int i;
+  int j;
+  unsigned int oldasize = t->sizearray;
+  int oldhsize = t->lsizenode;
+  Node *nold = t->node;  /* save old hash ... */
+  if (nasize > oldasize)  /* array part must grow? */
+    setarrayvector(L, t, nasize);
+  /* create new hash part with appropriate size */
+  setnodevector(L, t, nhsize);
+  if (nasize < oldasize) {  /* array part must shrink? */
+    t->sizearray = nasize;
+    /* re-insert elements from vanishing slice */
+    for (i=nasize; i<oldasize; i++) {
+      if (!ttisnil(&t->array[i]))
+        luaH_setint(L, t, i + 1, &t->array[i]);
+    }
+    /* shrink array */
+    luaM_reallocvector(L, t->array, oldasize, nasize, TValue);
+  }
+  /* re-insert elements from hash part */
+  for (j = twoto(oldhsize) - 1; j >= 0; j--) {
+    Node *old = nold + j;
+    if (!ttisnil(gval(old))) {
+      /* doesn't need barrier/invalidate cache, as entry was
+         already present in the table */
+      setobjt2t(L, luaH_set(L, t, gkey(old)), gval(old));
+    }
+  }
+  if (!isdummy(nold))
+    luaM_freearray(L, nold, cast(size_t, twoto(oldhsize))); /* free old hash */
+}
+
+
+void luaH_resizearray (lua_State *L, Table *t, unsigned int nasize) {
+  int nsize = isdummy(t->node) ? 0 : sizenode(t);
+  luaH_resize(L, t, nasize, nsize);
+}
+
+/*
+** nums[i] = number of keys 'k' where 2^(i - 1) < k <= 2^i
+*/
+static void rehash (lua_State *L, Table *t, const TValue *ek) {
+  unsigned int asize;  /* optimal size for array part */
+  unsigned int na;  /* number of keys in the array part */
+  unsigned int nums[MAXABITS + 1];
+  int i;
+  int totaluse;
+  for (i = 0; i <= MAXABITS; i++) nums[i] = 0;  /* reset counts */
+  na = numusearray(t, nums);  /* count keys in array part */
+  totaluse = na;  /* all those keys are integer keys */
+  totaluse += numusehash(t, nums, &na);  /* count keys in hash part */
+  /* count extra key */
+  na += countint(ek, nums);
+  totaluse++;
+  /* compute new size for array part */
+  asize = computesizes(nums, &na);
+  /* resize the table to new computed sizes */
+  luaH_resize(L, t, asize, totaluse - na);
+}
+
+
+
+/*
+** }=============================================================
+*/
+
+
+Table *luaH_new (lua_State *L) {
+  GCObject *o = luaC_newobj(L, LUA_TTABLE, sizeof(Table));
+  Table *t = gco2t(o);
+  t->metatable = NULL;
+  t->flags = cast_byte(~0);
+  t->array = NULL;
+  t->sizearray = 0;
+  setnodevector(L, t, 0);
+  return t;
+}
+
+
+void luaH_free (lua_State *L, Table *t) {
+  if (!isdummy(t->node))
+    luaM_freearray(L, t->node, cast(size_t, sizenode(t)));
+  luaM_freearray(L, t->array, t->sizearray);
+  luaM_free(L, t);
+}
+
+
+static Node *getfreepos (Table *t) {
+  while (t->lastfree > t->node) {
+    t->lastfree--;
+    if (ttisnil(gkey(t->lastfree)))
+      return t->lastfree;
+  }
+  return NULL;  /* could not find a free place */
+}
+
+
+
+/*
+** inserts a new key into a hash table; first, check whether key's main
+** position is free. If not, check whether colliding node is in its main
+** position or not: if it is not, move colliding node to an empty place and
+** put new key in its main position; otherwise (colliding node is in its main
+** position), new key goes to an empty position.
+*/
+TValue *luaH_newkey (lua_State *L, Table *t, const TValue *key) {
+  Node *mp;
+  TValue aux;
+  if (ttisnil(key)) luaG_runerror(L, "table index is nil");
+  else if (ttisfloat(key)) {
+    lua_Integer k;
+    if (luaV_tointeger(key, &k, 0)) {  /* index is int? */
+      setivalue(&aux, k);
+      key = &aux;  /* insert it as an integer */
+    }
+    else if (luai_numisnan(fltvalue(key)))
+      luaG_runerror(L, "table index is NaN");
+  }
+  mp = mainposition(t, key);
+  if (!ttisnil(gval(mp)) || isdummy(mp)) {  /* main position is taken? */
+    Node *othern;
+    Node *f = getfreepos(t);  /* get a free place */
+    if (f == NULL) {  /* cannot find a free place? */
+      rehash(L, t, key);  /* grow table */
+      /* whatever called 'newkey' takes care of TM cache */
+      return luaH_set(L, t, key);  /* insert key into grown table */
+    }
+    lua_assert(!isdummy(f));
+    othern = mainposition(t, gkey(mp));
+    if (othern != mp) {  /* is colliding node out of its main position? */
+      /* yes; move colliding node into free position */
+      while (othern + gnext(othern) != mp)  /* find previous */
+        othern += gnext(othern);
+      gnext(othern) = cast_int(f - othern);  /* rechain to point to 'f' */
+      *f = *mp;  /* copy colliding node into free pos. (mp->next also goes) */
+      if (gnext(mp) != 0) {
+        gnext(f) += cast_int(mp - f);  /* correct 'next' */
+        gnext(mp) = 0;  /* now 'mp' is free */
+      }
+      setnilvalue(gval(mp));
+    }
+    else {  /* colliding node is in its own main position */
+      /* new node will go into free position */
+      if (gnext(mp) != 0)
+        gnext(f) = cast_int((mp + gnext(mp)) - f);  /* chain new position */
+      else lua_assert(gnext(f) == 0);
+      gnext(mp) = cast_int(f - mp);
+      mp = f;
+    }
+  }
+  setnodekey(L, &mp->i_key, key);
+  luaC_barrierback(L, t, key);
+  lua_assert(ttisnil(gval(mp)));
+  return gval(mp);
+}
+
+
+/*
+** search function for integers
+*/
+const TValue *luaH_getint (Table *t, lua_Integer key) {
+  /* (1 <= key && key <= t->sizearray) */
+  if (l_castS2U(key) - 1 < t->sizearray)
+    return &t->array[key - 1];
+  else {
+    Node *n = hashint(t, key);
+    for (;;) {  /* check whether 'key' is somewhere in the chain */
+      if (ttisinteger(gkey(n)) && ivalue(gkey(n)) == key)
+        return gval(n);  /* that's it */
+      else {
+        int nx = gnext(n);
+        if (nx == 0) break;
+        n += nx;
+      }
+    }
+    return luaO_nilobject;
+  }
+}
+
+
+/*
+** search function for short strings
+*/
+const TValue *luaH_getshortstr (Table *t, TString *key) {
+  Node *n = hashstr(t, key);
+  lua_assert(key->tt == LUA_TSHRSTR);
+  for (;;) {  /* check whether 'key' is somewhere in the chain */
+    const TValue *k = gkey(n);
+    if (ttisshrstring(k) && eqshrstr(tsvalue(k), key))
+      return gval(n);  /* that's it */
+    else {
+      int nx = gnext(n);
+      if (nx == 0)
+        return luaO_nilobject;  /* not found */
+      n += nx;
+    }
+  }
+}
+
+
+/*
+** "Generic" get version. (Not that generic: not valid for integers,
+** which may be in array part, nor for floats with integral values.)
+*/
+static const TValue *getgeneric (Table *t, const TValue *key) {
+  Node *n = mainposition(t, key);
+  for (;;) {  /* check whether 'key' is somewhere in the chain */
+    if (luaV_rawequalobj(gkey(n), key))
+      return gval(n);  /* that's it */
+    else {
+      int nx = gnext(n);
+      if (nx == 0)
+        return luaO_nilobject;  /* not found */
+      n += nx;
+    }
+  }
+}
+
+
+const TValue *luaH_getstr (Table *t, TString *key) {
+  if (key->tt == LUA_TSHRSTR)
+    return luaH_getshortstr(t, key);
+  else {  /* for long strings, use generic case */
+    TValue ko;
+    setsvalue(cast(lua_State *, NULL), &ko, key);
+    return getgeneric(t, &ko);
+  }
+}
+
+
+/*
+** main search function
+*/
+const TValue *luaH_get (Table *t, const TValue *key) {
+  switch (ttype(key)) {
+    case LUA_TSHRSTR: return luaH_getshortstr(t, tsvalue(key));
+    case LUA_TNUMINT: return luaH_getint(t, ivalue(key));
+    case LUA_TNIL: return luaO_nilobject;
+    case LUA_TNUMFLT: {
+      lua_Integer k;
+      if (luaV_tointeger(key, &k, 0)) /* index is int? */
+        return luaH_getint(t, k);  /* use specialized version */
+      /* else... */
+    }  /* FALLTHROUGH */
+    default:
+      return getgeneric(t, key);
+  }
+}
+
+
+/*
+** beware: when using this function you probably need to check a GC
+** barrier and invalidate the TM cache.
+*/
+TValue *luaH_set (lua_State *L, Table *t, const TValue *key) {
+  const TValue *p = luaH_get(t, key);
+  if (p != luaO_nilobject)
+    return cast(TValue *, p);
+  else return luaH_newkey(L, t, key);
+}
+
+
+void luaH_setint (lua_State *L, Table *t, lua_Integer key, TValue *value) {
+  const TValue *p = luaH_getint(t, key);
+  TValue *cell;
+  if (p != luaO_nilobject)
+    cell = cast(TValue *, p);
+  else {
+    TValue k;
+    setivalue(&k, key);
+    cell = luaH_newkey(L, t, &k);
+  }
+  setobj2t(L, cell, value);
+}
+
+
+static int unbound_search (Table *t, unsigned int j) {
+  unsigned int i = j;  /* i is zero or a present index */
+  j++;
+  /* find 'i' and 'j' such that i is present and j is not */
+  while (!ttisnil(luaH_getint(t, j))) {
+    i = j;
+    if (j > cast(unsigned int, MAX_INT)/2) {  /* overflow? */
+      /* table was built with bad purposes: resort to linear search */
+      i = 1;
+      while (!ttisnil(luaH_getint(t, i))) i++;
+      return i - 1;
+    }
+    j *= 2;
+  }
+  /* now do a binary search between them */
+  while (j - i > 1) {
+    unsigned int m = (i+j)/2;
+    if (ttisnil(luaH_getint(t, m))) j = m;
+    else i = m;
+  }
+  return i;
+}
+
+
+/*
+** Try to find a boundary in table 't'. A 'boundary' is an integer index
+** such that t[i] is non-nil and t[i+1] is nil (and 0 if t[1] is nil).
+*/
+int luaH_getn (Table *t) {
+  unsigned int j = t->sizearray;
+  if (j > 0 && ttisnil(&t->array[j - 1])) {
+    /* there is a boundary in the array part: (binary) search for it */
+    unsigned int i = 0;
+    while (j - i > 1) {
+      unsigned int m = (i+j)/2;
+      if (ttisnil(&t->array[m - 1])) j = m;
+      else i = m;
+    }
+    return i;
+  }
+  /* else must find a boundary in hash part */
+  else if (isdummy(t->node))  /* hash part is empty? */
+    return j;  /* that is easy... */
+  else return unbound_search(t, j);
+}
+
+
+
+#if defined(LUA_DEBUG)
+
+Node *luaH_mainposition (const Table *t, const TValue *key) {
+  return mainposition(t, key);
+}
+
+int luaH_isdummy (Node *n) { return isdummy(n); }
+
+#endif
diff --git a/libs/lua/lua-5.3.3/ltable.h b/libs/lua/lua-5.3.3/ltable.h
new file mode 100644
index 0000000..213cc13
--- /dev/null
+++ b/libs/lua/lua-5.3.3/ltable.h
@@ -0,0 +1,58 @@
+/*
+** $Id: ltable.h,v 2.21 2015/11/03 15:47:30 roberto Exp $
+** Lua tables (hash)
+** See Copyright Notice in lua.h
+*/
+
+#ifndef ltable_h
+#define ltable_h
+
+#include "lobject.h"
+
+
+#define gnode(t,i)	(&(t)->node[i])
+#define gval(n)		(&(n)->i_val)
+#define gnext(n)	((n)->i_key.nk.next)
+
+
+/* 'const' to avoid wrong writings that can mess up field 'next' */ 
+#define gkey(n)		cast(const TValue*, (&(n)->i_key.tvk))
+
+/*
+** writable version of 'gkey'; allows updates to individual fields,
+** but not to the whole (which has incompatible type)
+*/
+#define wgkey(n)		(&(n)->i_key.nk)
+
+#define invalidateTMcache(t)	((t)->flags = 0)
+
+
+/* returns the key, given the value of a table entry */
+#define keyfromval(v) \
+  (gkey(cast(Node *, cast(char *, (v)) - offsetof(Node, i_val))))
+
+
+LUAI_FUNC const TValue *luaH_getint (Table *t, lua_Integer key);
+LUAI_FUNC void luaH_setint (lua_State *L, Table *t, lua_Integer key,
+                                                    TValue *value);
+LUAI_FUNC const TValue *luaH_getshortstr (Table *t, TString *key);
+LUAI_FUNC const TValue *luaH_getstr (Table *t, TString *key);
+LUAI_FUNC const TValue *luaH_get (Table *t, const TValue *key);
+LUAI_FUNC TValue *luaH_newkey (lua_State *L, Table *t, const TValue *key);
+LUAI_FUNC TValue *luaH_set (lua_State *L, Table *t, const TValue *key);
+LUAI_FUNC Table *luaH_new (lua_State *L);
+LUAI_FUNC void luaH_resize (lua_State *L, Table *t, unsigned int nasize,
+                                                    unsigned int nhsize);
+LUAI_FUNC void luaH_resizearray (lua_State *L, Table *t, unsigned int nasize);
+LUAI_FUNC void luaH_free (lua_State *L, Table *t);
+LUAI_FUNC int luaH_next (lua_State *L, Table *t, StkId key);
+LUAI_FUNC int luaH_getn (Table *t);
+
+
+#if defined(LUA_DEBUG)
+LUAI_FUNC Node *luaH_mainposition (const Table *t, const TValue *key);
+LUAI_FUNC int luaH_isdummy (Node *n);
+#endif
+
+
+#endif
diff --git a/libs/lua/lua-5.3.3/ltablib.c b/libs/lua/lua-5.3.3/ltablib.c
new file mode 100644
index 0000000..98b2f87
--- /dev/null
+++ b/libs/lua/lua-5.3.3/ltablib.c
@@ -0,0 +1,450 @@
+/*
+** $Id: ltablib.c,v 1.93 2016/02/25 19:41:54 roberto Exp $
+** Library for Table Manipulation
+** See Copyright Notice in lua.h
+*/
+
+#define ltablib_c
+#define LUA_LIB
+
+#include "lprefix.h"
+
+
+#include <limits.h>
+#include <stddef.h>
+#include <string.h>
+
+#include "lua.h"
+
+#include "lauxlib.h"
+#include "lualib.h"
+
+
+/*
+** Operations that an object must define to mimic a table
+** (some functions only need some of them)
+*/
+#define TAB_R	1			/* read */
+#define TAB_W	2			/* write */
+#define TAB_L	4			/* length */
+#define TAB_RW	(TAB_R | TAB_W)		/* read/write */
+
+
+#define aux_getn(L,n,w)	(checktab(L, n, (w) | TAB_L), luaL_len(L, n))
+
+
+static int checkfield (lua_State *L, const char *key, int n) {
+  lua_pushstring(L, key);
+  return (lua_rawget(L, -n) != LUA_TNIL);
+}
+
+
+/*
+** Check that 'arg' either is a table or can behave like one (that is,
+** has a metatable with the required metamethods)
+*/
+static void checktab (lua_State *L, int arg, int what) {
+  if (lua_type(L, arg) != LUA_TTABLE) {  /* is it not a table? */
+    int n = 1;  /* number of elements to pop */
+    if (lua_getmetatable(L, arg) &&  /* must have metatable */
+        (!(what & TAB_R) || checkfield(L, "__index", ++n)) &&
+        (!(what & TAB_W) || checkfield(L, "__newindex", ++n)) &&
+        (!(what & TAB_L) || checkfield(L, "__len", ++n))) {
+      lua_pop(L, n);  /* pop metatable and tested metamethods */
+    }
+    else
+      luaL_checktype(L, arg, LUA_TTABLE);  /* force an error */
+  }
+}
+
+
+#if defined(LUA_COMPAT_MAXN)
+static int maxn (lua_State *L) {
+  lua_Number max = 0;
+  luaL_checktype(L, 1, LUA_TTABLE);
+  lua_pushnil(L);  /* first key */
+  while (lua_next(L, 1)) {
+    lua_pop(L, 1);  /* remove value */
+    if (lua_type(L, -1) == LUA_TNUMBER) {
+      lua_Number v = lua_tonumber(L, -1);
+      if (v > max) max = v;
+    }
+  }
+  lua_pushnumber(L, max);
+  return 1;
+}
+#endif
+
+
+static int tinsert (lua_State *L) {
+  lua_Integer e = aux_getn(L, 1, TAB_RW) + 1;  /* first empty element */
+  lua_Integer pos;  /* where to insert new element */
+  switch (lua_gettop(L)) {
+    case 2: {  /* called with only 2 arguments */
+      pos = e;  /* insert new element at the end */
+      break;
+    }
+    case 3: {
+      lua_Integer i;
+      pos = luaL_checkinteger(L, 2);  /* 2nd argument is the position */
+      luaL_argcheck(L, 1 <= pos && pos <= e, 2, "position out of bounds");
+      for (i = e; i > pos; i--) {  /* move up elements */
+        lua_geti(L, 1, i - 1);
+        lua_seti(L, 1, i);  /* t[i] = t[i - 1] */
+      }
+      break;
+    }
+    default: {
+      return luaL_error(L, "wrong number of arguments to 'insert'");
+    }
+  }
+  lua_seti(L, 1, pos);  /* t[pos] = v */
+  return 0;
+}
+
+
+static int tremove (lua_State *L) {
+  lua_Integer size = aux_getn(L, 1, TAB_RW);
+  lua_Integer pos = luaL_optinteger(L, 2, size);
+  if (pos != size)  /* validate 'pos' if given */
+    luaL_argcheck(L, 1 <= pos && pos <= size + 1, 1, "position out of bounds");
+  lua_geti(L, 1, pos);  /* result = t[pos] */
+  for ( ; pos < size; pos++) {
+    lua_geti(L, 1, pos + 1);
+    lua_seti(L, 1, pos);  /* t[pos] = t[pos + 1] */
+  }
+  lua_pushnil(L);
+  lua_seti(L, 1, pos);  /* t[pos] = nil */
+  return 1;
+}
+
+
+/*
+** Copy elements (1[f], ..., 1[e]) into (tt[t], tt[t+1], ...). Whenever
+** possible, copy in increasing order, which is better for rehashing.
+** "possible" means destination after original range, or smaller
+** than origin, or copying to another table.
+*/
+static int tmove (lua_State *L) {
+  lua_Integer f = luaL_checkinteger(L, 2);
+  lua_Integer e = luaL_checkinteger(L, 3);
+  lua_Integer t = luaL_checkinteger(L, 4);
+  int tt = !lua_isnoneornil(L, 5) ? 5 : 1;  /* destination table */
+  checktab(L, 1, TAB_R);
+  checktab(L, tt, TAB_W);
+  if (e >= f) {  /* otherwise, nothing to move */
+    lua_Integer n, i;
+    luaL_argcheck(L, f > 0 || e < LUA_MAXINTEGER + f, 3,
+                  "too many elements to move");
+    n = e - f + 1;  /* number of elements to move */
+    luaL_argcheck(L, t <= LUA_MAXINTEGER - n + 1, 4,
+                  "destination wrap around");
+    if (t > e || t <= f || (tt != 1 && !lua_compare(L, 1, tt, LUA_OPEQ))) {
+      for (i = 0; i < n; i++) {
+        lua_geti(L, 1, f + i);
+        lua_seti(L, tt, t + i);
+      }
+    }
+    else {
+      for (i = n - 1; i >= 0; i--) {
+        lua_geti(L, 1, f + i);
+        lua_seti(L, tt, t + i);
+      }
+    }
+  }
+  lua_pushvalue(L, tt);  /* return destination table */
+  return 1;
+}
+
+
+static void addfield (lua_State *L, luaL_Buffer *b, lua_Integer i) {
+  lua_geti(L, 1, i);
+  if (!lua_isstring(L, -1))
+    luaL_error(L, "invalid value (%s) at index %d in table for 'concat'",
+                  luaL_typename(L, -1), i);
+  luaL_addvalue(b);
+}
+
+
+static int tconcat (lua_State *L) {
+  luaL_Buffer b;
+  lua_Integer last = aux_getn(L, 1, TAB_R);
+  size_t lsep;
+  const char *sep = luaL_optlstring(L, 2, "", &lsep);
+  lua_Integer i = luaL_optinteger(L, 3, 1);
+  last = luaL_optinteger(L, 4, last);
+  luaL_buffinit(L, &b);
+  for (; i < last; i++) {
+    addfield(L, &b, i);
+    luaL_addlstring(&b, sep, lsep);
+  }
+  if (i == last)  /* add last value (if interval was not empty) */
+    addfield(L, &b, i);
+  luaL_pushresult(&b);
+  return 1;
+}
+
+
+/*
+** {======================================================
+** Pack/unpack
+** =======================================================
+*/
+
+static int pack (lua_State *L) {
+  int i;
+  int n = lua_gettop(L);  /* number of elements to pack */
+  lua_createtable(L, n, 1);  /* create result table */
+  lua_insert(L, 1);  /* put it at index 1 */
+  for (i = n; i >= 1; i--)  /* assign elements */
+    lua_seti(L, 1, i);
+  lua_pushinteger(L, n);
+  lua_setfield(L, 1, "n");  /* t.n = number of elements */
+  return 1;  /* return table */
+}
+
+
+static int unpack (lua_State *L) {
+  lua_Unsigned n;
+  lua_Integer i = luaL_optinteger(L, 2, 1);
+  lua_Integer e = luaL_opt(L, luaL_checkinteger, 3, luaL_len(L, 1));
+  if (i > e) return 0;  /* empty range */
+  n = (lua_Unsigned)e - i;  /* number of elements minus 1 (avoid overflows) */
+  if (n >= (unsigned int)INT_MAX  || !lua_checkstack(L, (int)(++n)))
+    return luaL_error(L, "too many results to unpack");
+  for (; i < e; i++) {  /* push arg[i..e - 1] (to avoid overflows) */
+    lua_geti(L, 1, i);
+  }
+  lua_geti(L, 1, e);  /* push last element */
+  return (int)n;
+}
+
+/* }====================================================== */
+
+
+
+/*
+** {======================================================
+** Quicksort
+** (based on 'Algorithms in MODULA-3', Robert Sedgewick;
+**  Addison-Wesley, 1993.)
+** =======================================================
+*/
+
+
+/* type for array indices */
+typedef unsigned int IdxT;
+
+
+/*
+** Produce a "random" 'unsigned int' to randomize pivot choice. This
+** macro is used only when 'sort' detects a big imbalance in the result
+** of a partition. (If you don't want/need this "randomness", ~0 is a
+** good choice.)
+*/
+#if !defined(l_randomizePivot)		/* { */
+
+#include <time.h>
+
+/* size of 'e' measured in number of 'unsigned int's */
+#define sof(e)		(sizeof(e) / sizeof(unsigned int))
+
+/*
+** Use 'time' and 'clock' as sources of "randomness". Because we don't
+** know the types 'clock_t' and 'time_t', we cannot cast them to
+** anything without risking overflows. A safe way to use their values
+** is to copy them to an array of a known type and use the array values.
+*/
+static unsigned int l_randomizePivot (void) {
+  clock_t c = clock();
+  time_t t = time(NULL);
+  unsigned int buff[sof(c) + sof(t)];
+  unsigned int i, rnd = 0;
+  memcpy(buff, &c, sof(c) * sizeof(unsigned int));
+  memcpy(buff + sof(c), &t, sof(t) * sizeof(unsigned int));
+  for (i = 0; i < sof(buff); i++)
+    rnd += buff[i];
+  return rnd;
+}
+
+#endif					/* } */
+
+
+/* arrays larger than 'RANLIMIT' may use randomized pivots */
+#define RANLIMIT	100u
+
+
+static void set2 (lua_State *L, IdxT i, IdxT j) {
+  lua_seti(L, 1, i);
+  lua_seti(L, 1, j);
+}
+
+
+/*
+** Return true iff value at stack index 'a' is less than the value at
+** index 'b' (according to the order of the sort).
+*/
+static int sort_comp (lua_State *L, int a, int b) {
+  if (lua_isnil(L, 2))  /* no function? */
+    return lua_compare(L, a, b, LUA_OPLT);  /* a < b */
+  else {  /* function */
+    int res;
+    lua_pushvalue(L, 2);    /* push function */
+    lua_pushvalue(L, a-1);  /* -1 to compensate function */
+    lua_pushvalue(L, b-2);  /* -2 to compensate function and 'a' */
+    lua_call(L, 2, 1);      /* call function */
+    res = lua_toboolean(L, -1);  /* get result */
+    lua_pop(L, 1);          /* pop result */
+    return res;
+  }
+}
+
+
+/*
+** Does the partition: Pivot P is at the top of the stack.
+** precondition: a[lo] <= P == a[up-1] <= a[up],
+** so it only needs to do the partition from lo + 1 to up - 2.
+** Pos-condition: a[lo .. i - 1] <= a[i] == P <= a[i + 1 .. up]
+** returns 'i'.
+*/
+static IdxT partition (lua_State *L, IdxT lo, IdxT up) {
+  IdxT i = lo;  /* will be incremented before first use */
+  IdxT j = up - 1;  /* will be decremented before first use */
+  /* loop invariant: a[lo .. i] <= P <= a[j .. up] */
+  for (;;) {
+    /* next loop: repeat ++i while a[i] < P */
+    while (lua_geti(L, 1, ++i), sort_comp(L, -1, -2)) {
+      if (i == up - 1)  /* a[i] < P  but a[up - 1] == P  ?? */
+        luaL_error(L, "invalid order function for sorting");
+      lua_pop(L, 1);  /* remove a[i] */
+    }
+    /* after the loop, a[i] >= P and a[lo .. i - 1] < P */
+    /* next loop: repeat --j while P < a[j] */
+    while (lua_geti(L, 1, --j), sort_comp(L, -3, -1)) {
+      if (j < i)  /* j < i  but  a[j] > P ?? */
+        luaL_error(L, "invalid order function for sorting");
+      lua_pop(L, 1);  /* remove a[j] */
+    }
+    /* after the loop, a[j] <= P and a[j + 1 .. up] >= P */
+    if (j < i) {  /* no elements out of place? */
+      /* a[lo .. i - 1] <= P <= a[j + 1 .. i .. up] */
+      lua_pop(L, 1);  /* pop a[j] */
+      /* swap pivot (a[up - 1]) with a[i] to satisfy pos-condition */
+      set2(L, up - 1, i);
+      return i;
+    }
+    /* otherwise, swap a[i] - a[j] to restore invariant and repeat */
+    set2(L, i, j);
+  }
+}
+
+
+/*
+** Choose an element in the middle (2nd-3th quarters) of [lo,up]
+** "randomized" by 'rnd'
+*/
+static IdxT choosePivot (IdxT lo, IdxT up, unsigned int rnd) {
+  IdxT r4 = (up - lo) / 4;  /* range/4 */
+  IdxT p = rnd % (r4 * 2) + (lo + r4);
+  lua_assert(lo + r4 <= p && p <= up - r4);
+  return p;
+}
+
+
+/*
+** QuickSort algorithm (recursive function)
+*/
+static void auxsort (lua_State *L, IdxT lo, IdxT up,
+                                   unsigned int rnd) {
+  while (lo < up) {  /* loop for tail recursion */
+    IdxT p;  /* Pivot index */
+    IdxT n;  /* to be used later */
+    /* sort elements 'lo', 'p', and 'up' */
+    lua_geti(L, 1, lo);
+    lua_geti(L, 1, up);
+    if (sort_comp(L, -1, -2))  /* a[up] < a[lo]? */
+      set2(L, lo, up);  /* swap a[lo] - a[up] */
+    else
+      lua_pop(L, 2);  /* remove both values */
+    if (up - lo == 1)  /* only 2 elements? */
+      return;  /* already sorted */
+    if (up - lo < RANLIMIT || rnd == 0)  /* small interval or no randomize? */
+      p = (lo + up)/2;  /* middle element is a good pivot */
+    else  /* for larger intervals, it is worth a random pivot */
+      p = choosePivot(lo, up, rnd);
+    lua_geti(L, 1, p);
+    lua_geti(L, 1, lo);
+    if (sort_comp(L, -2, -1))  /* a[p] < a[lo]? */
+      set2(L, p, lo);  /* swap a[p] - a[lo] */
+    else {
+      lua_pop(L, 1);  /* remove a[lo] */
+      lua_geti(L, 1, up);
+      if (sort_comp(L, -1, -2))  /* a[up] < a[p]? */
+        set2(L, p, up);  /* swap a[up] - a[p] */
+      else
+        lua_pop(L, 2);
+    }
+    if (up - lo == 2)  /* only 3 elements? */
+      return;  /* already sorted */
+    lua_geti(L, 1, p);  /* get middle element (Pivot) */
+    lua_pushvalue(L, -1);  /* push Pivot */
+    lua_geti(L, 1, up - 1);  /* push a[up - 1] */
+    set2(L, p, up - 1);  /* swap Pivot (a[p]) with a[up - 1] */
+    p = partition(L, lo, up);
+    /* a[lo .. p - 1] <= a[p] == P <= a[p + 1 .. up] */
+    if (p - lo < up - p) {  /* lower interval is smaller? */
+      auxsort(L, lo, p - 1, rnd);  /* call recursively for lower interval */
+      n = p - lo;  /* size of smaller interval */
+      lo = p + 1;  /* tail call for [p + 1 .. up] (upper interval) */
+    }
+    else {
+      auxsort(L, p + 1, up, rnd);  /* call recursively for upper interval */
+      n = up - p;  /* size of smaller interval */
+      up = p - 1;  /* tail call for [lo .. p - 1]  (lower interval) */
+    }
+    if ((up - lo) / 128 > n) /* partition too imbalanced? */
+      rnd = l_randomizePivot();  /* try a new randomization */
+  }  /* tail call auxsort(L, lo, up, rnd) */
+}
+
+
+static int sort (lua_State *L) {
+  lua_Integer n = aux_getn(L, 1, TAB_RW);
+  if (n > 1) {  /* non-trivial interval? */
+    luaL_argcheck(L, n < INT_MAX, 1, "array too big");
+    if (!lua_isnoneornil(L, 2))  /* is there a 2nd argument? */
+      luaL_checktype(L, 2, LUA_TFUNCTION);  /* must be a function */
+    lua_settop(L, 2);  /* make sure there are two arguments */
+    auxsort(L, 1, (IdxT)n, 0);
+  }
+  return 0;
+}
+
+/* }====================================================== */
+
+
+static const luaL_Reg tab_funcs[] = {
+  {"concat", tconcat},
+#if defined(LUA_COMPAT_MAXN)
+  {"maxn", maxn},
+#endif
+  {"insert", tinsert},
+  {"pack", pack},
+  {"unpack", unpack},
+  {"remove", tremove},
+  {"move", tmove},
+  {"sort", sort},
+  {NULL, NULL}
+};
+
+
+LUAMOD_API int luaopen_table (lua_State *L) {
+  luaL_newlib(L, tab_funcs);
+#if defined(LUA_COMPAT_UNPACK)
+  /* _G.unpack = table.unpack */
+  lua_getfield(L, -1, "unpack");
+  lua_setglobal(L, "unpack");
+#endif
+  return 1;
+}
+
diff --git a/libs/lua/lua-5.3.3/ltm.c b/libs/lua/lua-5.3.3/ltm.c
new file mode 100644
index 0000000..4650cc2
--- /dev/null
+++ b/libs/lua/lua-5.3.3/ltm.c
@@ -0,0 +1,165 @@
+/*
+** $Id: ltm.c,v 2.37 2016/02/26 19:20:15 roberto Exp $
+** Tag methods
+** See Copyright Notice in lua.h
+*/
+
+#define ltm_c
+#define LUA_CORE
+
+#include "lprefix.h"
+
+
+#include <string.h>
+
+#include "lua.h"
+
+#include "ldebug.h"
+#include "ldo.h" 
+#include "lobject.h"
+#include "lstate.h"
+#include "lstring.h"
+#include "ltable.h"
+#include "ltm.h"
+#include "lvm.h"
+
+
+static const char udatatypename[] = "userdata";
+
+LUAI_DDEF const char *const luaT_typenames_[LUA_TOTALTAGS] = {
+  "no value",
+  "nil", "boolean", udatatypename, "number",
+  "string", "table", "function", udatatypename, "thread",
+  "proto" /* this last case is used for tests only */
+};
+
+
+void luaT_init (lua_State *L) {
+  static const char *const luaT_eventname[] = {  /* ORDER TM */
+    "__index", "__newindex",
+    "__gc", "__mode", "__len", "__eq",
+    "__add", "__sub", "__mul", "__mod", "__pow",
+    "__div", "__idiv",
+    "__band", "__bor", "__bxor", "__shl", "__shr",
+    "__unm", "__bnot", "__lt", "__le",
+    "__concat", "__call"
+  };
+  int i;
+  for (i=0; i<TM_N; i++) {
+    G(L)->tmname[i] = luaS_new(L, luaT_eventname[i]);
+    luaC_fix(L, obj2gco(G(L)->tmname[i]));  /* never collect these names */
+  }
+}
+
+
+/*
+** function to be used with macro "fasttm": optimized for absence of
+** tag methods
+*/
+const TValue *luaT_gettm (Table *events, TMS event, TString *ename) {
+  const TValue *tm = luaH_getshortstr(events, ename);
+  lua_assert(event <= TM_EQ);
+  if (ttisnil(tm)) {  /* no tag method? */
+    events->flags |= cast_byte(1u<<event);  /* cache this fact */
+    return NULL;
+  }
+  else return tm;
+}
+
+
+const TValue *luaT_gettmbyobj (lua_State *L, const TValue *o, TMS event) {
+  Table *mt;
+  switch (ttnov(o)) {
+    case LUA_TTABLE:
+      mt = hvalue(o)->metatable;
+      break;
+    case LUA_TUSERDATA:
+      mt = uvalue(o)->metatable;
+      break;
+    default:
+      mt = G(L)->mt[ttnov(o)];
+  }
+  return (mt ? luaH_getshortstr(mt, G(L)->tmname[event]) : luaO_nilobject);
+}
+
+
+/*
+** Return the name of the type of an object. For tables and userdata
+** with metatable, use their '__name' metafield, if present.
+*/
+const char *luaT_objtypename (lua_State *L, const TValue *o) {
+  Table *mt;
+  if ((ttistable(o) && (mt = hvalue(o)->metatable) != NULL) ||
+      (ttisfulluserdata(o) && (mt = uvalue(o)->metatable) != NULL)) {
+    const TValue *name = luaH_getshortstr(mt, luaS_new(L, "__name"));
+    if (ttisstring(name))  /* is '__name' a string? */
+      return getstr(tsvalue(name));  /* use it as type name */
+  }
+  return ttypename(ttnov(o));  /* else use standard type name */
+}
+
+
+void luaT_callTM (lua_State *L, const TValue *f, const TValue *p1,
+                  const TValue *p2, TValue *p3, int hasres) {
+  ptrdiff_t result = savestack(L, p3);
+  StkId func = L->top;
+  setobj2s(L, func, f);  /* push function (assume EXTRA_STACK) */
+  setobj2s(L, func + 1, p1);  /* 1st argument */
+  setobj2s(L, func + 2, p2);  /* 2nd argument */
+  L->top += 3;
+  if (!hasres)  /* no result? 'p3' is third argument */
+    setobj2s(L, L->top++, p3);  /* 3rd argument */
+  /* metamethod may yield only when called from Lua code */
+  if (isLua(L->ci))
+    luaD_call(L, func, hasres);
+  else
+    luaD_callnoyield(L, func, hasres);
+  if (hasres) {  /* if has result, move it to its place */
+    p3 = restorestack(L, result);
+    setobjs2s(L, p3, --L->top);
+  }
+}
+
+
+int luaT_callbinTM (lua_State *L, const TValue *p1, const TValue *p2,
+                    StkId res, TMS event) {
+  const TValue *tm = luaT_gettmbyobj(L, p1, event);  /* try first operand */
+  if (ttisnil(tm))
+    tm = luaT_gettmbyobj(L, p2, event);  /* try second operand */
+  if (ttisnil(tm)) return 0;
+  luaT_callTM(L, tm, p1, p2, res, 1);
+  return 1;
+}
+
+
+void luaT_trybinTM (lua_State *L, const TValue *p1, const TValue *p2,
+                    StkId res, TMS event) {
+  if (!luaT_callbinTM(L, p1, p2, res, event)) {
+    switch (event) {
+      case TM_CONCAT:
+        luaG_concaterror(L, p1, p2);
+      /* call never returns, but to avoid warnings: *//* FALLTHROUGH */
+      case TM_BAND: case TM_BOR: case TM_BXOR:
+      case TM_SHL: case TM_SHR: case TM_BNOT: {
+        lua_Number dummy;
+        if (tonumber(p1, &dummy) && tonumber(p2, &dummy))
+          luaG_tointerror(L, p1, p2);
+        else
+          luaG_opinterror(L, p1, p2, "perform bitwise operation on");
+      }
+      /* calls never return, but to avoid warnings: *//* FALLTHROUGH */
+      default:
+        luaG_opinterror(L, p1, p2, "perform arithmetic on");
+    }
+  }
+}
+
+
+int luaT_callorderTM (lua_State *L, const TValue *p1, const TValue *p2,
+                      TMS event) {
+  if (!luaT_callbinTM(L, p1, p2, L->top, event))
+    return -1;  /* no metamethod */
+  else
+    return !l_isfalse(L->top);
+}
+
diff --git a/libs/lua/lua-5.3.3/ltm.h b/libs/lua/lua-5.3.3/ltm.h
new file mode 100644
index 0000000..63db726
--- /dev/null
+++ b/libs/lua/lua-5.3.3/ltm.h
@@ -0,0 +1,76 @@
+/*
+** $Id: ltm.h,v 2.22 2016/02/26 19:20:15 roberto Exp $
+** Tag methods
+** See Copyright Notice in lua.h
+*/
+
+#ifndef ltm_h
+#define ltm_h
+
+
+#include "lobject.h"
+
+
+/*
+* WARNING: if you change the order of this enumeration,
+* grep "ORDER TM" and "ORDER OP"
+*/
+typedef enum {
+  TM_INDEX,
+  TM_NEWINDEX,
+  TM_GC,
+  TM_MODE,
+  TM_LEN,
+  TM_EQ,  /* last tag method with fast access */
+  TM_ADD,
+  TM_SUB,
+  TM_MUL,
+  TM_MOD,
+  TM_POW,
+  TM_DIV,
+  TM_IDIV,
+  TM_BAND,
+  TM_BOR,
+  TM_BXOR,
+  TM_SHL,
+  TM_SHR,
+  TM_UNM,
+  TM_BNOT,
+  TM_LT,
+  TM_LE,
+  TM_CONCAT,
+  TM_CALL,
+  TM_N		/* number of elements in the enum */
+} TMS;
+
+
+
+#define gfasttm(g,et,e) ((et) == NULL ? NULL : \
+  ((et)->flags & (1u<<(e))) ? NULL : luaT_gettm(et, e, (g)->tmname[e]))
+
+#define fasttm(l,et,e)	gfasttm(G(l), et, e)
+
+#define ttypename(x)	luaT_typenames_[(x) + 1]
+
+LUAI_DDEC const char *const luaT_typenames_[LUA_TOTALTAGS];
+
+
+LUAI_FUNC const char *luaT_objtypename (lua_State *L, const TValue *o);
+
+LUAI_FUNC const TValue *luaT_gettm (Table *events, TMS event, TString *ename);
+LUAI_FUNC const TValue *luaT_gettmbyobj (lua_State *L, const TValue *o,
+                                                       TMS event);
+LUAI_FUNC void luaT_init (lua_State *L);
+
+LUAI_FUNC void luaT_callTM (lua_State *L, const TValue *f, const TValue *p1,
+                            const TValue *p2, TValue *p3, int hasres);
+LUAI_FUNC int luaT_callbinTM (lua_State *L, const TValue *p1, const TValue *p2,
+                              StkId res, TMS event);
+LUAI_FUNC void luaT_trybinTM (lua_State *L, const TValue *p1, const TValue *p2,
+                              StkId res, TMS event);
+LUAI_FUNC int luaT_callorderTM (lua_State *L, const TValue *p1,
+                                const TValue *p2, TMS event);
+
+
+
+#endif
diff --git a/libs/lua/lua-5.3.3/lua.c b/libs/lua/lua-5.3.3/lua.c
new file mode 100644
index 0000000..545d23d
--- /dev/null
+++ b/libs/lua/lua-5.3.3/lua.c
@@ -0,0 +1,609 @@
+/*
+** $Id: lua.c,v 1.226 2015/08/14 19:11:20 roberto Exp $
+** Lua stand-alone interpreter
+** See Copyright Notice in lua.h
+*/
+
+#define lua_c
+
+#include "lprefix.h"
+
+
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "lua.h"
+
+#include "lauxlib.h"
+#include "lualib.h"
+
+
+#if !defined(LUA_PROMPT)
+#define LUA_PROMPT		"> "
+#define LUA_PROMPT2		">> "
+#endif
+
+#if !defined(LUA_PROGNAME)
+#define LUA_PROGNAME		"lua"
+#endif
+
+#if !defined(LUA_MAXINPUT)
+#define LUA_MAXINPUT		512
+#endif
+
+#if !defined(LUA_INIT_VAR)
+#define LUA_INIT_VAR		"LUA_INIT"
+#endif
+
+#define LUA_INITVARVERSION  \
+	LUA_INIT_VAR "_" LUA_VERSION_MAJOR "_" LUA_VERSION_MINOR
+
+
+/*
+** lua_stdin_is_tty detects whether the standard input is a 'tty' (that
+** is, whether we're running lua interactively).
+*/
+#if !defined(lua_stdin_is_tty)	/* { */
+
+#if defined(LUA_USE_POSIX)	/* { */
+
+#include <unistd.h>
+#define lua_stdin_is_tty()	isatty(0)
+
+#elif defined(LUA_USE_WINDOWS)	/* }{ */
+
+#include <io.h>
+#define lua_stdin_is_tty()	_isatty(_fileno(stdin))
+
+#else				/* }{ */
+
+/* ISO C definition */
+#define lua_stdin_is_tty()	1  /* assume stdin is a tty */
+
+#endif				/* } */
+
+#endif				/* } */
+
+
+/*
+** lua_readline defines how to show a prompt and then read a line from
+** the standard input.
+** lua_saveline defines how to "save" a read line in a "history".
+** lua_freeline defines how to free a line read by lua_readline.
+*/
+#if !defined(lua_readline)	/* { */
+
+#if defined(LUA_USE_READLINE)	/* { */
+
+#include <readline/readline.h>
+#include <readline/history.h>
+#define lua_readline(L,b,p)	((void)L, ((b)=readline(p)) != NULL)
+#define lua_saveline(L,line)	((void)L, add_history(line))
+#define lua_freeline(L,b)	((void)L, free(b))
+
+#else				/* }{ */
+
+#define lua_readline(L,b,p) \
+        ((void)L, fputs(p, stdout), fflush(stdout),  /* show prompt */ \
+        fgets(b, LUA_MAXINPUT, stdin) != NULL)  /* get line */
+#define lua_saveline(L,line)	{ (void)L; (void)line; }
+#define lua_freeline(L,b)	{ (void)L; (void)b; }
+
+#endif				/* } */
+
+#endif				/* } */
+
+
+
+
+static lua_State *globalL = NULL;
+
+static const char *progname = LUA_PROGNAME;
+
+
+/*
+** Hook set by signal function to stop the interpreter.
+*/
+static void lstop (lua_State *L, lua_Debug *ar) {
+  (void)ar;  /* unused arg. */
+  lua_sethook(L, NULL, 0, 0);  /* reset hook */
+  luaL_error(L, "interrupted!");
+}
+
+
+/*
+** Function to be called at a C signal. Because a C signal cannot
+** just change a Lua state (as there is no proper synchronization),
+** this function only sets a hook that, when called, will stop the
+** interpreter.
+*/
+static void laction (int i) {
+  signal(i, SIG_DFL); /* if another SIGINT happens, terminate process */
+  lua_sethook(globalL, lstop, LUA_MASKCALL | LUA_MASKRET | LUA_MASKCOUNT, 1);
+}
+
+
+static void print_usage (const char *badoption) {
+  lua_writestringerror("%s: ", progname);
+  if (badoption[1] == 'e' || badoption[1] == 'l')
+    lua_writestringerror("'%s' needs argument\n", badoption);
+  else
+    lua_writestringerror("unrecognized option '%s'\n", badoption);
+  lua_writestringerror(
+  "usage: %s [options] [script [args]]\n"
+  "Available options are:\n"
+  "  -e stat  execute string 'stat'\n"
+  "  -i       enter interactive mode after executing 'script'\n"
+  "  -l name  require library 'name'\n"
+  "  -v       show version information\n"
+  "  -E       ignore environment variables\n"
+  "  --       stop handling options\n"
+  "  -        stop handling options and execute stdin\n"
+  ,
+  progname);
+}
+
+
+/*
+** Prints an error message, adding the program name in front of it
+** (if present)
+*/
+static void l_message (const char *pname, const char *msg) {
+  if (pname) lua_writestringerror("%s: ", pname);
+  lua_writestringerror("%s\n", msg);
+}
+
+
+/*
+** Check whether 'status' is not OK and, if so, prints the error
+** message on the top of the stack. It assumes that the error object
+** is a string, as it was either generated by Lua or by 'msghandler'.
+*/
+static int report (lua_State *L, int status) {
+  if (status != LUA_OK) {
+    const char *msg = lua_tostring(L, -1);
+    l_message(progname, msg);
+    lua_pop(L, 1);  /* remove message */
+  }
+  return status;
+}
+
+
+/*
+** Message handler used to run all chunks
+*/
+static int msghandler (lua_State *L) {
+  const char *msg = lua_tostring(L, 1);
+  if (msg == NULL) {  /* is error object not a string? */
+    if (luaL_callmeta(L, 1, "__tostring") &&  /* does it have a metamethod */
+        lua_type(L, -1) == LUA_TSTRING)  /* that produces a string? */
+      return 1;  /* that is the message */
+    else
+      msg = lua_pushfstring(L, "(error object is a %s value)",
+                               luaL_typename(L, 1));
+  }
+  luaL_traceback(L, L, msg, 1);  /* append a standard traceback */
+  return 1;  /* return the traceback */
+}
+
+
+/*
+** Interface to 'lua_pcall', which sets appropriate message function
+** and C-signal handler. Used to run all chunks.
+*/
+static int docall (lua_State *L, int narg, int nres) {
+  int status;
+  int base = lua_gettop(L) - narg;  /* function index */
+  lua_pushcfunction(L, msghandler);  /* push message handler */
+  lua_insert(L, base);  /* put it under function and args */
+  globalL = L;  /* to be available to 'laction' */
+  signal(SIGINT, laction);  /* set C-signal handler */
+  status = lua_pcall(L, narg, nres, base);
+  signal(SIGINT, SIG_DFL); /* reset C-signal handler */
+  lua_remove(L, base);  /* remove message handler from the stack */
+  return status;
+}
+
+
+static void print_version (void) {
+  lua_writestring(LUA_COPYRIGHT, strlen(LUA_COPYRIGHT));
+  lua_writeline();
+}
+
+
+/*
+** Create the 'arg' table, which stores all arguments from the
+** command line ('argv'). It should be aligned so that, at index 0,
+** it has 'argv[script]', which is the script name. The arguments
+** to the script (everything after 'script') go to positive indices;
+** other arguments (before the script name) go to negative indices.
+** If there is no script name, assume interpreter's name as base.
+*/
+static void createargtable (lua_State *L, char **argv, int argc, int script) {
+  int i, narg;
+  if (script == argc) script = 0;  /* no script name? */
+  narg = argc - (script + 1);  /* number of positive indices */
+  lua_createtable(L, narg, script + 1);
+  for (i = 0; i < argc; i++) {
+    lua_pushstring(L, argv[i]);
+    lua_rawseti(L, -2, i - script);
+  }
+  lua_setglobal(L, "arg");
+}
+
+
+static int dochunk (lua_State *L, int status) {
+  if (status == LUA_OK) status = docall(L, 0, 0);
+  return report(L, status);
+}
+
+
+static int dofile (lua_State *L, const char *name) {
+  return dochunk(L, luaL_loadfile(L, name));
+}
+
+
+static int dostring (lua_State *L, const char *s, const char *name) {
+  return dochunk(L, luaL_loadbuffer(L, s, strlen(s), name));
+}
+
+
+/*
+** Calls 'require(name)' and stores the result in a global variable
+** with the given name.
+*/
+static int dolibrary (lua_State *L, const char *name) {
+  int status;
+  lua_getglobal(L, "require");
+  lua_pushstring(L, name);
+  status = docall(L, 1, 1);  /* call 'require(name)' */
+  if (status == LUA_OK)
+    lua_setglobal(L, name);  /* global[name] = require return */
+  return report(L, status);
+}
+
+
+/*
+** Returns the string to be used as a prompt by the interpreter.
+*/
+static const char *get_prompt (lua_State *L, int firstline) {
+  const char *p;
+  lua_getglobal(L, firstline ? "_PROMPT" : "_PROMPT2");
+  p = lua_tostring(L, -1);
+  if (p == NULL) p = (firstline ? LUA_PROMPT : LUA_PROMPT2);
+  return p;
+}
+
+/* mark in error messages for incomplete statements */
+#define EOFMARK		"<eof>"
+#define marklen		(sizeof(EOFMARK)/sizeof(char) - 1)
+
+
+/*
+** Check whether 'status' signals a syntax error and the error
+** message at the top of the stack ends with the above mark for
+** incomplete statements.
+*/
+static int incomplete (lua_State *L, int status) {
+  if (status == LUA_ERRSYNTAX) {
+    size_t lmsg;
+    const char *msg = lua_tolstring(L, -1, &lmsg);
+    if (lmsg >= marklen && strcmp(msg + lmsg - marklen, EOFMARK) == 0) {
+      lua_pop(L, 1);
+      return 1;
+    }
+  }
+  return 0;  /* else... */
+}
+
+
+/*
+** Prompt the user, read a line, and push it into the Lua stack.
+*/
+static int pushline (lua_State *L, int firstline) {
+  char buffer[LUA_MAXINPUT];
+  char *b = buffer;
+  size_t l;
+  const char *prmt = get_prompt(L, firstline);
+  int readstatus = lua_readline(L, b, prmt);
+  if (readstatus == 0)
+    return 0;  /* no input (prompt will be popped by caller) */
+  lua_pop(L, 1);  /* remove prompt */
+  l = strlen(b);
+  if (l > 0 && b[l-1] == '\n')  /* line ends with newline? */
+    b[--l] = '\0';  /* remove it */
+  if (firstline && b[0] == '=')  /* for compatibility with 5.2, ... */
+    lua_pushfstring(L, "return %s", b + 1);  /* change '=' to 'return' */
+  else
+    lua_pushlstring(L, b, l);
+  lua_freeline(L, b);
+  return 1;
+}
+
+
+/*
+** Try to compile line on the stack as 'return <line>;'; on return, stack
+** has either compiled chunk or original line (if compilation failed).
+*/
+static int addreturn (lua_State *L) {
+  const char *line = lua_tostring(L, -1);  /* original line */
+  const char *retline = lua_pushfstring(L, "return %s;", line);
+  int status = luaL_loadbuffer(L, retline, strlen(retline), "=stdin");
+  if (status == LUA_OK) {
+    lua_remove(L, -2);  /* remove modified line */
+    if (line[0] != '\0')  /* non empty? */
+      lua_saveline(L, line);  /* keep history */
+  }
+  else
+    lua_pop(L, 2);  /* pop result from 'luaL_loadbuffer' and modified line */
+  return status;
+}
+
+
+/*
+** Read multiple lines until a complete Lua statement
+*/
+static int multiline (lua_State *L) {
+  for (;;) {  /* repeat until gets a complete statement */
+    size_t len;
+    const char *line = lua_tolstring(L, 1, &len);  /* get what it has */
+    int status = luaL_loadbuffer(L, line, len, "=stdin");  /* try it */
+    if (!incomplete(L, status) || !pushline(L, 0)) {
+      lua_saveline(L, line);  /* keep history */
+      return status;  /* cannot or should not try to add continuation line */
+    }
+    lua_pushliteral(L, "\n");  /* add newline... */
+    lua_insert(L, -2);  /* ...between the two lines */
+    lua_concat(L, 3);  /* join them */
+  }
+}
+
+
+/*
+** Read a line and try to load (compile) it first as an expression (by
+** adding "return " in front of it) and second as a statement. Return
+** the final status of load/call with the resulting function (if any)
+** in the top of the stack.
+*/
+static int loadline (lua_State *L) {
+  int status;
+  lua_settop(L, 0);
+  if (!pushline(L, 1))
+    return -1;  /* no input */
+  if ((status = addreturn(L)) != LUA_OK)  /* 'return ...' did not work? */
+    status = multiline(L);  /* try as command, maybe with continuation lines */
+  lua_remove(L, 1);  /* remove line from the stack */
+  lua_assert(lua_gettop(L) == 1);
+  return status;
+}
+
+
+/*
+** Prints (calling the Lua 'print' function) any values on the stack
+*/
+static void l_print (lua_State *L) {
+  int n = lua_gettop(L);
+  if (n > 0) {  /* any result to be printed? */
+    luaL_checkstack(L, LUA_MINSTACK, "too many results to print");
+    lua_getglobal(L, "print");
+    lua_insert(L, 1);
+    if (lua_pcall(L, n, 0, 0) != LUA_OK)
+      l_message(progname, lua_pushfstring(L, "error calling 'print' (%s)",
+                                             lua_tostring(L, -1)));
+  }
+}
+
+
+/*
+** Do the REPL: repeatedly read (load) a line, evaluate (call) it, and
+** print any results.
+*/
+static void doREPL (lua_State *L) {
+  int status;
+  const char *oldprogname = progname;
+  progname = NULL;  /* no 'progname' on errors in interactive mode */
+  while ((status = loadline(L)) != -1) {
+    if (status == LUA_OK)
+      status = docall(L, 0, LUA_MULTRET);
+    if (status == LUA_OK) l_print(L);
+    else report(L, status);
+  }
+  lua_settop(L, 0);  /* clear stack */
+  lua_writeline();
+  progname = oldprogname;
+}
+
+
+/*
+** Push on the stack the contents of table 'arg' from 1 to #arg
+*/
+static int pushargs (lua_State *L) {
+  int i, n;
+  if (lua_getglobal(L, "arg") != LUA_TTABLE)
+    luaL_error(L, "'arg' is not a table");
+  n = (int)luaL_len(L, -1);
+  luaL_checkstack(L, n + 3, "too many arguments to script");
+  for (i = 1; i <= n; i++)
+    lua_rawgeti(L, -i, i);
+  lua_remove(L, -i);  /* remove table from the stack */
+  return n;
+}
+
+
+static int handle_script (lua_State *L, char **argv) {
+  int status;
+  const char *fname = argv[0];
+  if (strcmp(fname, "-") == 0 && strcmp(argv[-1], "--") != 0)
+    fname = NULL;  /* stdin */
+  status = luaL_loadfile(L, fname);
+  if (status == LUA_OK) {
+    int n = pushargs(L);  /* push arguments to script */
+    status = docall(L, n, LUA_MULTRET);
+  }
+  return report(L, status);
+}
+
+
+
+/* bits of various argument indicators in 'args' */
+#define has_error	1	/* bad option */
+#define has_i		2	/* -i */
+#define has_v		4	/* -v */
+#define has_e		8	/* -e */
+#define has_E		16	/* -E */
+
+/*
+** Traverses all arguments from 'argv', returning a mask with those
+** needed before running any Lua code (or an error code if it finds
+** any invalid argument). 'first' returns the first not-handled argument 
+** (either the script name or a bad argument in case of error).
+*/
+static int collectargs (char **argv, int *first) {
+  int args = 0;
+  int i;
+  for (i = 1; argv[i] != NULL; i++) {
+    *first = i;
+    if (argv[i][0] != '-')  /* not an option? */
+        return args;  /* stop handling options */
+    switch (argv[i][1]) {  /* else check option */
+      case '-':  /* '--' */
+        if (argv[i][2] != '\0')  /* extra characters after '--'? */
+          return has_error;  /* invalid option */
+        *first = i + 1;
+        return args;
+      case '\0':  /* '-' */
+        return args;  /* script "name" is '-' */
+      case 'E':
+        if (argv[i][2] != '\0')  /* extra characters after 1st? */
+          return has_error;  /* invalid option */
+        args |= has_E;
+        break;
+      case 'i':
+        args |= has_i;  /* (-i implies -v) *//* FALLTHROUGH */ 
+      case 'v':
+        if (argv[i][2] != '\0')  /* extra characters after 1st? */
+          return has_error;  /* invalid option */
+        args |= has_v;
+        break;
+      case 'e':
+        args |= has_e;  /* FALLTHROUGH */
+      case 'l':  /* both options need an argument */
+        if (argv[i][2] == '\0') {  /* no concatenated argument? */
+          i++;  /* try next 'argv' */
+          if (argv[i] == NULL || argv[i][0] == '-')
+            return has_error;  /* no next argument or it is another option */
+        }
+        break;
+      default:  /* invalid option */
+        return has_error;
+    }
+  }
+  *first = i;  /* no script name */
+  return args;
+}
+
+
+/*
+** Processes options 'e' and 'l', which involve running Lua code.
+** Returns 0 if some code raises an error.
+*/
+static int runargs (lua_State *L, char **argv, int n) {
+  int i;
+  for (i = 1; i < n; i++) {
+    int option = argv[i][1];
+    lua_assert(argv[i][0] == '-');  /* already checked */
+    if (option == 'e' || option == 'l') {
+      int status;
+      const char *extra = argv[i] + 2;  /* both options need an argument */
+      if (*extra == '\0') extra = argv[++i];
+      lua_assert(extra != NULL);
+      status = (option == 'e')
+               ? dostring(L, extra, "=(command line)")
+               : dolibrary(L, extra);
+      if (status != LUA_OK) return 0;
+    }
+  }
+  return 1;
+}
+
+
+static int handle_luainit (lua_State *L) {
+  const char *name = "=" LUA_INITVARVERSION;
+  const char *init = getenv(name + 1);
+  if (init == NULL) {
+    name = "=" LUA_INIT_VAR;
+    init = getenv(name + 1);  /* try alternative name */
+  }
+  if (init == NULL) return LUA_OK;
+  else if (init[0] == '@')
+    return dofile(L, init+1);
+  else
+    return dostring(L, init, name);
+}
+
+
+/*
+** Main body of stand-alone interpreter (to be called in protected mode).
+** Reads the options and handles them all.
+*/
+static int pmain (lua_State *L) {
+  int argc = (int)lua_tointeger(L, 1);
+  char **argv = (char **)lua_touserdata(L, 2);
+  int script;
+  int args = collectargs(argv, &script);
+  luaL_checkversion(L);  /* check that interpreter has correct version */
+  if (argv[0] && argv[0][0]) progname = argv[0];
+  if (args == has_error) {  /* bad arg? */
+    print_usage(argv[script]);  /* 'script' has index of bad arg. */
+    return 0;
+  }
+  if (args & has_v)  /* option '-v'? */
+    print_version();
+  if (args & has_E) {  /* option '-E'? */
+    lua_pushboolean(L, 1);  /* signal for libraries to ignore env. vars. */
+    lua_setfield(L, LUA_REGISTRYINDEX, "LUA_NOENV");
+  }
+  luaL_openlibs(L);  /* open standard libraries */
+  createargtable(L, argv, argc, script);  /* create table 'arg' */
+  if (!(args & has_E)) {  /* no option '-E'? */
+    if (handle_luainit(L) != LUA_OK)  /* run LUA_INIT */
+      return 0;  /* error running LUA_INIT */
+  }
+  if (!runargs(L, argv, script))  /* execute arguments -e and -l */
+    return 0;  /* something failed */
+  if (script < argc &&  /* execute main script (if there is one) */
+      handle_script(L, argv + script) != LUA_OK)
+    return 0;
+  if (args & has_i)  /* -i option? */
+    doREPL(L);  /* do read-eval-print loop */
+  else if (script == argc && !(args & (has_e | has_v))) {  /* no arguments? */
+    if (lua_stdin_is_tty()) {  /* running in interactive mode? */
+      print_version();
+      doREPL(L);  /* do read-eval-print loop */
+    }
+    else dofile(L, NULL);  /* executes stdin as a file */
+  }
+  lua_pushboolean(L, 1);  /* signal no errors */
+  return 1;
+}
+
+
+int main (int argc, char **argv) {
+  int status, result;
+  lua_State *L = luaL_newstate();  /* create state */
+  if (L == NULL) {
+    l_message(argv[0], "cannot create state: not enough memory");
+    return EXIT_FAILURE;
+  }
+  lua_pushcfunction(L, &pmain);  /* to call 'pmain' in protected mode */
+  lua_pushinteger(L, argc);  /* 1st argument */
+  lua_pushlightuserdata(L, argv); /* 2nd argument */
+  status = lua_pcall(L, 2, 1, 0);  /* do the call */
+  result = lua_toboolean(L, -1);  /* get result */
+  report(L, status);
+  lua_close(L);
+  return (result && status == LUA_OK) ? EXIT_SUCCESS : EXIT_FAILURE;
+}
+
diff --git a/libs/lua/lua-5.3.3/lua.h b/libs/lua/lua-5.3.3/lua.h
new file mode 100644
index 0000000..f78899f
--- /dev/null
+++ b/libs/lua/lua-5.3.3/lua.h
@@ -0,0 +1,486 @@
+/*
+** $Id: lua.h,v 1.331 2016/05/30 15:53:28 roberto Exp $
+** Lua - A Scripting Language
+** Lua.org, PUC-Rio, Brazil (http://www.lua.org)
+** See Copyright Notice at the end of this file
+*/
+
+
+#ifndef lua_h
+#define lua_h
+
+#include <stdarg.h>
+#include <stddef.h>
+
+
+#include "luaconf.h"
+
+
+#define LUA_VERSION_MAJOR	"5"
+#define LUA_VERSION_MINOR	"3"
+#define LUA_VERSION_NUM		503
+#define LUA_VERSION_RELEASE	"3"
+
+#define LUA_VERSION	"Lua " LUA_VERSION_MAJOR "." LUA_VERSION_MINOR
+#define LUA_RELEASE	LUA_VERSION "." LUA_VERSION_RELEASE
+#define LUA_COPYRIGHT	LUA_RELEASE "  Copyright (C) 1994-2016 Lua.org, PUC-Rio"
+#define LUA_AUTHORS	"R. Ierusalimschy, L. H. de Figueiredo, W. Celes"
+
+
+/* mark for precompiled code ('<esc>Lua') */
+#define LUA_SIGNATURE	"\x1bLua"
+
+/* option for multiple returns in 'lua_pcall' and 'lua_call' */
+#define LUA_MULTRET	(-1)
+
+
+/*
+** Pseudo-indices
+** (-LUAI_MAXSTACK is the minimum valid index; we keep some free empty
+** space after that to help overflow detection)
+*/
+#define LUA_REGISTRYINDEX	(-LUAI_MAXSTACK - 1000)
+#define lua_upvalueindex(i)	(LUA_REGISTRYINDEX - (i))
+
+
+/* thread status */
+#define LUA_OK		0
+#define LUA_YIELD	1
+#define LUA_ERRRUN	2
+#define LUA_ERRSYNTAX	3
+#define LUA_ERRMEM	4
+#define LUA_ERRGCMM	5
+#define LUA_ERRERR	6
+
+
+typedef struct lua_State lua_State;
+
+
+/*
+** basic types
+*/
+#define LUA_TNONE		(-1)
+
+#define LUA_TNIL		0
+#define LUA_TBOOLEAN		1
+#define LUA_TLIGHTUSERDATA	2
+#define LUA_TNUMBER		3
+#define LUA_TSTRING		4
+#define LUA_TTABLE		5
+#define LUA_TFUNCTION		6
+#define LUA_TUSERDATA		7
+#define LUA_TTHREAD		8
+
+#define LUA_NUMTAGS		9
+
+
+
+/* minimum Lua stack available to a C function */
+#define LUA_MINSTACK	20
+
+
+/* predefined values in the registry */
+#define LUA_RIDX_MAINTHREAD	1
+#define LUA_RIDX_GLOBALS	2
+#define LUA_RIDX_LAST		LUA_RIDX_GLOBALS
+
+
+/* type of numbers in Lua */
+typedef LUA_NUMBER lua_Number;
+
+
+/* type for integer functions */
+typedef LUA_INTEGER lua_Integer;
+
+/* unsigned integer type */
+typedef LUA_UNSIGNED lua_Unsigned;
+
+/* type for continuation-function contexts */
+typedef LUA_KCONTEXT lua_KContext;
+
+
+/*
+** Type for C functions registered with Lua
+*/
+typedef int (*lua_CFunction) (lua_State *L);
+
+/*
+** Type for continuation functions
+*/
+typedef int (*lua_KFunction) (lua_State *L, int status, lua_KContext ctx);
+
+
+/*
+** Type for functions that read/write blocks when loading/dumping Lua chunks
+*/
+typedef const char * (*lua_Reader) (lua_State *L, void *ud, size_t *sz);
+
+typedef int (*lua_Writer) (lua_State *L, const void *p, size_t sz, void *ud);
+
+
+/*
+** Type for memory-allocation functions
+*/
+typedef void * (*lua_Alloc) (void *ud, void *ptr, size_t osize, size_t nsize);
+
+
+
+/*
+** generic extra include file
+*/
+#if defined(LUA_USER_H)
+#include LUA_USER_H
+#endif
+
+
+/*
+** RCS ident string
+*/
+extern const char lua_ident[];
+
+
+/*
+** state manipulation
+*/
+LUA_API lua_State *(lua_newstate) (lua_Alloc f, void *ud);
+LUA_API void       (lua_close) (lua_State *L);
+LUA_API lua_State *(lua_newthread) (lua_State *L);
+
+LUA_API lua_CFunction (lua_atpanic) (lua_State *L, lua_CFunction panicf);
+
+
+LUA_API const lua_Number *(lua_version) (lua_State *L);
+
+
+/*
+** basic stack manipulation
+*/
+LUA_API int   (lua_absindex) (lua_State *L, int idx);
+LUA_API int   (lua_gettop) (lua_State *L);
+LUA_API void  (lua_settop) (lua_State *L, int idx);
+LUA_API void  (lua_pushvalue) (lua_State *L, int idx);
+LUA_API void  (lua_rotate) (lua_State *L, int idx, int n);
+LUA_API void  (lua_copy) (lua_State *L, int fromidx, int toidx);
+LUA_API int   (lua_checkstack) (lua_State *L, int n);
+
+LUA_API void  (lua_xmove) (lua_State *from, lua_State *to, int n);
+
+
+/*
+** access functions (stack -> C)
+*/
+
+LUA_API int             (lua_isnumber) (lua_State *L, int idx);
+LUA_API int             (lua_isstring) (lua_State *L, int idx);
+LUA_API int             (lua_iscfunction) (lua_State *L, int idx);
+LUA_API int             (lua_isinteger) (lua_State *L, int idx);
+LUA_API int             (lua_isuserdata) (lua_State *L, int idx);
+LUA_API int             (lua_type) (lua_State *L, int idx);
+LUA_API const char     *(lua_typename) (lua_State *L, int tp);
+
+LUA_API lua_Number      (lua_tonumberx) (lua_State *L, int idx, int *isnum);
+LUA_API lua_Integer     (lua_tointegerx) (lua_State *L, int idx, int *isnum);
+LUA_API int             (lua_toboolean) (lua_State *L, int idx);
+LUA_API const char     *(lua_tolstring) (lua_State *L, int idx, size_t *len);
+LUA_API size_t          (lua_rawlen) (lua_State *L, int idx);
+LUA_API lua_CFunction   (lua_tocfunction) (lua_State *L, int idx);
+LUA_API void	       *(lua_touserdata) (lua_State *L, int idx);
+LUA_API lua_State      *(lua_tothread) (lua_State *L, int idx);
+LUA_API const void     *(lua_topointer) (lua_State *L, int idx);
+
+
+/*
+** Comparison and arithmetic functions
+*/
+
+#define LUA_OPADD	0	/* ORDER TM, ORDER OP */
+#define LUA_OPSUB	1
+#define LUA_OPMUL	2
+#define LUA_OPMOD	3
+#define LUA_OPPOW	4
+#define LUA_OPDIV	5
+#define LUA_OPIDIV	6
+#define LUA_OPBAND	7
+#define LUA_OPBOR	8
+#define LUA_OPBXOR	9
+#define LUA_OPSHL	10
+#define LUA_OPSHR	11
+#define LUA_OPUNM	12
+#define LUA_OPBNOT	13
+
+LUA_API void  (lua_arith) (lua_State *L, int op);
+
+#define LUA_OPEQ	0
+#define LUA_OPLT	1
+#define LUA_OPLE	2
+
+LUA_API int   (lua_rawequal) (lua_State *L, int idx1, int idx2);
+LUA_API int   (lua_compare) (lua_State *L, int idx1, int idx2, int op);
+
+
+/*
+** push functions (C -> stack)
+*/
+LUA_API void        (lua_pushnil) (lua_State *L);
+LUA_API void        (lua_pushnumber) (lua_State *L, lua_Number n);
+LUA_API void        (lua_pushinteger) (lua_State *L, lua_Integer n);
+LUA_API const char *(lua_pushlstring) (lua_State *L, const char *s, size_t len);
+LUA_API const char *(lua_pushstring) (lua_State *L, const char *s);
+LUA_API const char *(lua_pushvfstring) (lua_State *L, const char *fmt,
+                                                      va_list argp);
+LUA_API const char *(lua_pushfstring) (lua_State *L, const char *fmt, ...);
+LUA_API void  (lua_pushcclosure) (lua_State *L, lua_CFunction fn, int n);
+LUA_API void  (lua_pushboolean) (lua_State *L, int b);
+LUA_API void  (lua_pushlightuserdata) (lua_State *L, void *p);
+LUA_API int   (lua_pushthread) (lua_State *L);
+
+
+/*
+** get functions (Lua -> stack)
+*/
+LUA_API int (lua_getglobal) (lua_State *L, const char *name);
+LUA_API int (lua_gettable) (lua_State *L, int idx);
+LUA_API int (lua_getfield) (lua_State *L, int idx, const char *k);
+LUA_API int (lua_geti) (lua_State *L, int idx, lua_Integer n);
+LUA_API int (lua_rawget) (lua_State *L, int idx);
+LUA_API int (lua_rawgeti) (lua_State *L, int idx, lua_Integer n);
+LUA_API int (lua_rawgetp) (lua_State *L, int idx, const void *p);
+
+LUA_API void  (lua_createtable) (lua_State *L, int narr, int nrec);
+LUA_API void *(lua_newuserdata) (lua_State *L, size_t sz);
+LUA_API int   (lua_getmetatable) (lua_State *L, int objindex);
+LUA_API int  (lua_getuservalue) (lua_State *L, int idx);
+
+
+/*
+** set functions (stack -> Lua)
+*/
+LUA_API void  (lua_setglobal) (lua_State *L, const char *name);
+LUA_API void  (lua_settable) (lua_State *L, int idx);
+LUA_API void  (lua_setfield) (lua_State *L, int idx, const char *k);
+LUA_API void  (lua_seti) (lua_State *L, int idx, lua_Integer n);
+LUA_API void  (lua_rawset) (lua_State *L, int idx);
+LUA_API void  (lua_rawseti) (lua_State *L, int idx, lua_Integer n);
+LUA_API void  (lua_rawsetp) (lua_State *L, int idx, const void *p);
+LUA_API int   (lua_setmetatable) (lua_State *L, int objindex);
+LUA_API void  (lua_setuservalue) (lua_State *L, int idx);
+
+
+/*
+** 'load' and 'call' functions (load and run Lua code)
+*/
+LUA_API void  (lua_callk) (lua_State *L, int nargs, int nresults,
+                           lua_KContext ctx, lua_KFunction k);
+#define lua_call(L,n,r)		lua_callk(L, (n), (r), 0, NULL)
+
+LUA_API int   (lua_pcallk) (lua_State *L, int nargs, int nresults, int errfunc,
+                            lua_KContext ctx, lua_KFunction k);
+#define lua_pcall(L,n,r,f)	lua_pcallk(L, (n), (r), (f), 0, NULL)
+
+LUA_API int   (lua_load) (lua_State *L, lua_Reader reader, void *dt,
+                          const char *chunkname, const char *mode);
+
+LUA_API int (lua_dump) (lua_State *L, lua_Writer writer, void *data, int strip);
+
+
+/*
+** coroutine functions
+*/
+LUA_API int  (lua_yieldk)     (lua_State *L, int nresults, lua_KContext ctx,
+                               lua_KFunction k);
+LUA_API int  (lua_resume)     (lua_State *L, lua_State *from, int narg);
+LUA_API int  (lua_status)     (lua_State *L);
+LUA_API int (lua_isyieldable) (lua_State *L);
+
+#define lua_yield(L,n)		lua_yieldk(L, (n), 0, NULL)
+
+
+/*
+** garbage-collection function and options
+*/
+
+#define LUA_GCSTOP		0
+#define LUA_GCRESTART		1
+#define LUA_GCCOLLECT		2
+#define LUA_GCCOUNT		3
+#define LUA_GCCOUNTB		4
+#define LUA_GCSTEP		5
+#define LUA_GCSETPAUSE		6
+#define LUA_GCSETSTEPMUL	7
+#define LUA_GCISRUNNING		9
+
+LUA_API int (lua_gc) (lua_State *L, int what, int data);
+
+
+/*
+** miscellaneous functions
+*/
+
+LUA_API int   (lua_error) (lua_State *L);
+
+LUA_API int   (lua_next) (lua_State *L, int idx);
+
+LUA_API void  (lua_concat) (lua_State *L, int n);
+LUA_API void  (lua_len)    (lua_State *L, int idx);
+
+LUA_API size_t   (lua_stringtonumber) (lua_State *L, const char *s);
+
+LUA_API lua_Alloc (lua_getallocf) (lua_State *L, void **ud);
+LUA_API void      (lua_setallocf) (lua_State *L, lua_Alloc f, void *ud);
+
+
+
+/*
+** {==============================================================
+** some useful macros
+** ===============================================================
+*/
+
+#define lua_getextraspace(L)	((void *)((char *)(L) - LUA_EXTRASPACE))
+
+#define lua_tonumber(L,i)	lua_tonumberx(L,(i),NULL)
+#define lua_tointeger(L,i)	lua_tointegerx(L,(i),NULL)
+
+#define lua_pop(L,n)		lua_settop(L, -(n)-1)
+
+#define lua_newtable(L)		lua_createtable(L, 0, 0)
+
+#define lua_register(L,n,f) (lua_pushcfunction(L, (f)), lua_setglobal(L, (n)))
+
+#define lua_pushcfunction(L,f)	lua_pushcclosure(L, (f), 0)
+
+#define lua_isfunction(L,n)	(lua_type(L, (n)) == LUA_TFUNCTION)
+#define lua_istable(L,n)	(lua_type(L, (n)) == LUA_TTABLE)
+#define lua_islightuserdata(L,n)	(lua_type(L, (n)) == LUA_TLIGHTUSERDATA)
+#define lua_isnil(L,n)		(lua_type(L, (n)) == LUA_TNIL)
+#define lua_isboolean(L,n)	(lua_type(L, (n)) == LUA_TBOOLEAN)
+#define lua_isthread(L,n)	(lua_type(L, (n)) == LUA_TTHREAD)
+#define lua_isnone(L,n)		(lua_type(L, (n)) == LUA_TNONE)
+#define lua_isnoneornil(L, n)	(lua_type(L, (n)) <= 0)
+
+#define lua_pushliteral(L, s)	lua_pushstring(L, "" s)
+
+#define lua_pushglobaltable(L)  \
+	((void)lua_rawgeti(L, LUA_REGISTRYINDEX, LUA_RIDX_GLOBALS))
+
+#define lua_tostring(L,i)	lua_tolstring(L, (i), NULL)
+
+
+#define lua_insert(L,idx)	lua_rotate(L, (idx), 1)
+
+#define lua_remove(L,idx)	(lua_rotate(L, (idx), -1), lua_pop(L, 1))
+
+#define lua_replace(L,idx)	(lua_copy(L, -1, (idx)), lua_pop(L, 1))
+
+/* }============================================================== */
+
+
+/*
+** {==============================================================
+** compatibility macros for unsigned conversions
+** ===============================================================
+*/
+#if defined(LUA_COMPAT_APIINTCASTS)
+
+#define lua_pushunsigned(L,n)	lua_pushinteger(L, (lua_Integer)(n))
+#define lua_tounsignedx(L,i,is)	((lua_Unsigned)lua_tointegerx(L,i,is))
+#define lua_tounsigned(L,i)	lua_tounsignedx(L,(i),NULL)
+
+#endif
+/* }============================================================== */
+
+/*
+** {======================================================================
+** Debug API
+** =======================================================================
+*/
+
+
+/*
+** Event codes
+*/
+#define LUA_HOOKCALL	0
+#define LUA_HOOKRET	1
+#define LUA_HOOKLINE	2
+#define LUA_HOOKCOUNT	3
+#define LUA_HOOKTAILCALL 4
+
+
+/*
+** Event masks
+*/
+#define LUA_MASKCALL	(1 << LUA_HOOKCALL)
+#define LUA_MASKRET	(1 << LUA_HOOKRET)
+#define LUA_MASKLINE	(1 << LUA_HOOKLINE)
+#define LUA_MASKCOUNT	(1 << LUA_HOOKCOUNT)
+
+typedef struct lua_Debug lua_Debug;  /* activation record */
+
+
+/* Functions to be called by the debugger in specific events */
+typedef void (*lua_Hook) (lua_State *L, lua_Debug *ar);
+
+
+LUA_API int (lua_getstack) (lua_State *L, int level, lua_Debug *ar);
+LUA_API int (lua_getinfo) (lua_State *L, const char *what, lua_Debug *ar);
+LUA_API const char *(lua_getlocal) (lua_State *L, const lua_Debug *ar, int n);
+LUA_API const char *(lua_setlocal) (lua_State *L, const lua_Debug *ar, int n);
+LUA_API const char *(lua_getupvalue) (lua_State *L, int funcindex, int n);
+LUA_API const char *(lua_setupvalue) (lua_State *L, int funcindex, int n);
+
+LUA_API void *(lua_upvalueid) (lua_State *L, int fidx, int n);
+LUA_API void  (lua_upvaluejoin) (lua_State *L, int fidx1, int n1,
+                                               int fidx2, int n2);
+
+LUA_API void (lua_sethook) (lua_State *L, lua_Hook func, int mask, int count);
+LUA_API lua_Hook (lua_gethook) (lua_State *L);
+LUA_API int (lua_gethookmask) (lua_State *L);
+LUA_API int (lua_gethookcount) (lua_State *L);
+
+
+struct lua_Debug {
+  int event;
+  const char *name;	/* (n) */
+  const char *namewhat;	/* (n) 'global', 'local', 'field', 'method' */
+  const char *what;	/* (S) 'Lua', 'C', 'main', 'tail' */
+  const char *source;	/* (S) */
+  int currentline;	/* (l) */
+  int linedefined;	/* (S) */
+  int lastlinedefined;	/* (S) */
+  unsigned char nups;	/* (u) number of upvalues */
+  unsigned char nparams;/* (u) number of parameters */
+  char isvararg;        /* (u) */
+  char istailcall;	/* (t) */
+  char short_src[LUA_IDSIZE]; /* (S) */
+  /* private part */
+  struct CallInfo *i_ci;  /* active function */
+};
+
+/* }====================================================================== */
+
+
+/******************************************************************************
+* Copyright (C) 1994-2016 Lua.org, PUC-Rio.
+*
+* Permission is hereby granted, free of charge, to any person obtaining
+* a copy of this software and associated documentation files (the
+* "Software"), to deal in the Software without restriction, including
+* without limitation the rights to use, copy, modify, merge, publish,
+* distribute, sublicense, and/or sell copies of the Software, and to
+* permit persons to whom the Software is furnished to do so, subject to
+* the following conditions:
+*
+* The above copyright notice and this permission notice shall be
+* included in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+******************************************************************************/
+
+
+#endif
diff --git a/libs/lua/lua-5.3.3/lua.hpp b/libs/lua/lua-5.3.3/lua.hpp
new file mode 100644
index 0000000..ec417f5
--- /dev/null
+++ b/libs/lua/lua-5.3.3/lua.hpp
@@ -0,0 +1,9 @@
+// lua.hpp
+// Lua header files for C++
+// <<extern "C">> not supplied automatically because Lua also compiles as C++
+
+extern "C" {
+#include "lua.h"
+#include "lualib.h"
+#include "lauxlib.h"
+}
diff --git a/libs/lua/lua-5.3.3/luac.c b/libs/lua/lua-5.3.3/luac.c
new file mode 100644
index 0000000..c0c91d0
--- /dev/null
+++ b/libs/lua/lua-5.3.3/luac.c
@@ -0,0 +1,449 @@
+/*
+** $Id: luac.c,v 1.75 2015/03/12 01:58:27 lhf Exp $
+** Lua compiler (saves bytecodes to files; also lists bytecodes)
+** See Copyright Notice in lua.h
+*/
+
+#define luac_c
+#define LUA_CORE
+
+#include "lprefix.h"
+
+#include <ctype.h>
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "lua.h"
+#include "lauxlib.h"
+
+#include "lobject.h"
+#include "lstate.h"
+#include "lundump.h"
+
+static void PrintFunction(const Proto* f, int full);
+#define luaU_print	PrintFunction
+
+#define PROGNAME	"luac"		/* default program name */
+#define OUTPUT		PROGNAME ".out"	/* default output file */
+
+static int listing=0;			/* list bytecodes? */
+static int dumping=1;			/* dump bytecodes? */
+static int stripping=0;			/* strip debug information? */
+static char Output[]={ OUTPUT };	/* default output file name */
+static const char* output=Output;	/* actual output file name */
+static const char* progname=PROGNAME;	/* actual program name */
+
+static void fatal(const char* message)
+{
+ fprintf(stderr,"%s: %s\n",progname,message);
+ exit(EXIT_FAILURE);
+}
+
+static void cannot(const char* what)
+{
+ fprintf(stderr,"%s: cannot %s %s: %s\n",progname,what,output,strerror(errno));
+ exit(EXIT_FAILURE);
+}
+
+static void usage(const char* message)
+{
+ if (*message=='-')
+  fprintf(stderr,"%s: unrecognized option '%s'\n",progname,message);
+ else
+  fprintf(stderr,"%s: %s\n",progname,message);
+ fprintf(stderr,
+  "usage: %s [options] [filenames]\n"
+  "Available options are:\n"
+  "  -l       list (use -l -l for full listing)\n"
+  "  -o name  output to file 'name' (default is \"%s\")\n"
+  "  -p       parse only\n"
+  "  -s       strip debug information\n"
+  "  -v       show version information\n"
+  "  --       stop handling options\n"
+  "  -        stop handling options and process stdin\n"
+  ,progname,Output);
+ exit(EXIT_FAILURE);
+}
+
+#define IS(s)	(strcmp(argv[i],s)==0)
+
+static int doargs(int argc, char* argv[])
+{
+ int i;
+ int version=0;
+ if (argv[0]!=NULL && *argv[0]!=0) progname=argv[0];
+ for (i=1; i<argc; i++)
+ {
+  if (*argv[i]!='-')			/* end of options; keep it */
+   break;
+  else if (IS("--"))			/* end of options; skip it */
+  {
+   ++i;
+   if (version) ++version;
+   break;
+  }
+  else if (IS("-"))			/* end of options; use stdin */
+   break;
+  else if (IS("-l"))			/* list */
+   ++listing;
+  else if (IS("-o"))			/* output file */
+  {
+   output=argv[++i];
+   if (output==NULL || *output==0 || (*output=='-' && output[1]!=0))
+    usage("'-o' needs argument");
+   if (IS("-")) output=NULL;
+  }
+  else if (IS("-p"))			/* parse only */
+   dumping=0;
+  else if (IS("-s"))			/* strip debug information */
+   stripping=1;
+  else if (IS("-v"))			/* show version */
+   ++version;
+  else					/* unknown option */
+   usage(argv[i]);
+ }
+ if (i==argc && (listing || !dumping))
+ {
+  dumping=0;
+  argv[--i]=Output;
+ }
+ if (version)
+ {
+  printf("%s\n",LUA_COPYRIGHT);
+  if (version==argc-1) exit(EXIT_SUCCESS);
+ }
+ return i;
+}
+
+#define FUNCTION "(function()end)();"
+
+static const char* reader(lua_State *L, void *ud, size_t *size)
+{
+ UNUSED(L);
+ if ((*(int*)ud)--)
+ {
+  *size=sizeof(FUNCTION)-1;
+  return FUNCTION;
+ }
+ else
+ {
+  *size=0;
+  return NULL;
+ }
+}
+
+#define toproto(L,i) getproto(L->top+(i))
+
+static const Proto* combine(lua_State* L, int n)
+{
+ if (n==1)
+  return toproto(L,-1);
+ else
+ {
+  Proto* f;
+  int i=n;
+  if (lua_load(L,reader,&i,"=(" PROGNAME ")",NULL)!=LUA_OK) fatal(lua_tostring(L,-1));
+  f=toproto(L,-1);
+  for (i=0; i<n; i++)
+  {
+   f->p[i]=toproto(L,i-n-1);
+   if (f->p[i]->sizeupvalues>0) f->p[i]->upvalues[0].instack=0;
+  }
+  f->sizelineinfo=0;
+  return f;
+ }
+}
+
+static int writer(lua_State* L, const void* p, size_t size, void* u)
+{
+ UNUSED(L);
+ return (fwrite(p,size,1,(FILE*)u)!=1) && (size!=0);
+}
+
+static int pmain(lua_State* L)
+{
+ int argc=(int)lua_tointeger(L,1);
+ char** argv=(char**)lua_touserdata(L,2);
+ const Proto* f;
+ int i;
+ if (!lua_checkstack(L,argc)) fatal("too many input files");
+ for (i=0; i<argc; i++)
+ {
+  const char* filename=IS("-") ? NULL : argv[i];
+  if (luaL_loadfile(L,filename)!=LUA_OK) fatal(lua_tostring(L,-1));
+ }
+ f=combine(L,argc);
+ if (listing) luaU_print(f,listing>1);
+ if (dumping)
+ {
+  FILE* D= (output==NULL) ? stdout : fopen(output,"wb");
+  if (D==NULL) cannot("open");
+  lua_lock(L);
+  luaU_dump(L,f,writer,D,stripping);
+  lua_unlock(L);
+  if (ferror(D)) cannot("write");
+  if (fclose(D)) cannot("close");
+ }
+ return 0;
+}
+
+int main(int argc, char* argv[])
+{
+ lua_State* L;
+ int i=doargs(argc,argv);
+ argc-=i; argv+=i;
+ if (argc<=0) usage("no input files given");
+ L=luaL_newstate();
+ if (L==NULL) fatal("cannot create state: not enough memory");
+ lua_pushcfunction(L,&pmain);
+ lua_pushinteger(L,argc);
+ lua_pushlightuserdata(L,argv);
+ if (lua_pcall(L,2,0,0)!=LUA_OK) fatal(lua_tostring(L,-1));
+ lua_close(L);
+ return EXIT_SUCCESS;
+}
+
+/*
+** $Id: luac.c,v 1.75 2015/03/12 01:58:27 lhf Exp $
+** print bytecodes
+** See Copyright Notice in lua.h
+*/
+
+#include <ctype.h>
+#include <stdio.h>
+
+#define luac_c
+#define LUA_CORE
+
+#include "ldebug.h"
+#include "lobject.h"
+#include "lopcodes.h"
+
+#define VOID(p)		((const void*)(p))
+
+static void PrintString(const TString* ts)
+{
+ const char* s=getstr(ts);
+ size_t i,n=tsslen(ts);
+ printf("%c",'"');
+ for (i=0; i<n; i++)
+ {
+  int c=(int)(unsigned char)s[i];
+  switch (c)
+  {
+   case '"':  printf("\\\""); break;
+   case '\\': printf("\\\\"); break;
+   case '\a': printf("\\a"); break;
+   case '\b': printf("\\b"); break;
+   case '\f': printf("\\f"); break;
+   case '\n': printf("\\n"); break;
+   case '\r': printf("\\r"); break;
+   case '\t': printf("\\t"); break;
+   case '\v': printf("\\v"); break;
+   default:	if (isprint(c))
+   			printf("%c",c);
+		else
+			printf("\\%03d",c);
+  }
+ }
+ printf("%c",'"');
+}
+
+static void PrintConstant(const Proto* f, int i)
+{
+ const TValue* o=&f->k[i];
+ switch (ttype(o))
+ {
+  case LUA_TNIL:
+	printf("nil");
+	break;
+  case LUA_TBOOLEAN:
+	printf(bvalue(o) ? "true" : "false");
+	break;
+  case LUA_TNUMFLT:
+	{
+	char buff[100];
+	sprintf(buff,LUA_NUMBER_FMT,fltvalue(o));
+	printf("%s",buff);
+	if (buff[strspn(buff,"-0123456789")]=='\0') printf(".0");
+	break;
+	}
+  case LUA_TNUMINT:
+	printf(LUA_INTEGER_FMT,ivalue(o));
+	break;
+  case LUA_TSHRSTR: case LUA_TLNGSTR:
+	PrintString(tsvalue(o));
+	break;
+  default:				/* cannot happen */
+	printf("? type=%d",ttype(o));
+	break;
+ }
+}
+
+#define UPVALNAME(x) ((f->upvalues[x].name) ? getstr(f->upvalues[x].name) : "-")
+#define MYK(x)		(-1-(x))
+
+static void PrintCode(const Proto* f)
+{
+ const Instruction* code=f->code;
+ int pc,n=f->sizecode;
+ for (pc=0; pc<n; pc++)
+ {
+  Instruction i=code[pc];
+  OpCode o=GET_OPCODE(i);
+  int a=GETARG_A(i);
+  int b=GETARG_B(i);
+  int c=GETARG_C(i);
+  int ax=GETARG_Ax(i);
+  int bx=GETARG_Bx(i);
+  int sbx=GETARG_sBx(i);
+  int line=getfuncline(f,pc);
+  printf("\t%d\t",pc+1);
+  if (line>0) printf("[%d]\t",line); else printf("[-]\t");
+  printf("%-9s\t",luaP_opnames[o]);
+  switch (getOpMode(o))
+  {
+   case iABC:
+    printf("%d",a);
+    if (getBMode(o)!=OpArgN) printf(" %d",ISK(b) ? (MYK(INDEXK(b))) : b);
+    if (getCMode(o)!=OpArgN) printf(" %d",ISK(c) ? (MYK(INDEXK(c))) : c);
+    break;
+   case iABx:
+    printf("%d",a);
+    if (getBMode(o)==OpArgK) printf(" %d",MYK(bx));
+    if (getBMode(o)==OpArgU) printf(" %d",bx);
+    break;
+   case iAsBx:
+    printf("%d %d",a,sbx);
+    break;
+   case iAx:
+    printf("%d",MYK(ax));
+    break;
+  }
+  switch (o)
+  {
+   case OP_LOADK:
+    printf("\t; "); PrintConstant(f,bx);
+    break;
+   case OP_GETUPVAL:
+   case OP_SETUPVAL:
+    printf("\t; %s",UPVALNAME(b));
+    break;
+   case OP_GETTABUP:
+    printf("\t; %s",UPVALNAME(b));
+    if (ISK(c)) { printf(" "); PrintConstant(f,INDEXK(c)); }
+    break;
+   case OP_SETTABUP:
+    printf("\t; %s",UPVALNAME(a));
+    if (ISK(b)) { printf(" "); PrintConstant(f,INDEXK(b)); }
+    if (ISK(c)) { printf(" "); PrintConstant(f,INDEXK(c)); }
+    break;
+   case OP_GETTABLE:
+   case OP_SELF:
+    if (ISK(c)) { printf("\t; "); PrintConstant(f,INDEXK(c)); }
+    break;
+   case OP_SETTABLE:
+   case OP_ADD:
+   case OP_SUB:
+   case OP_MUL:
+   case OP_POW:
+   case OP_DIV:
+   case OP_IDIV:
+   case OP_BAND:
+   case OP_BOR:
+   case OP_BXOR:
+   case OP_SHL:
+   case OP_SHR:
+   case OP_EQ:
+   case OP_LT:
+   case OP_LE:
+    if (ISK(b) || ISK(c))
+    {
+     printf("\t; ");
+     if (ISK(b)) PrintConstant(f,INDEXK(b)); else printf("-");
+     printf(" ");
+     if (ISK(c)) PrintConstant(f,INDEXK(c)); else printf("-");
+    }
+    break;
+   case OP_JMP:
+   case OP_FORLOOP:
+   case OP_FORPREP:
+   case OP_TFORLOOP:
+    printf("\t; to %d",sbx+pc+2);
+    break;
+   case OP_CLOSURE:
+    printf("\t; %p",VOID(f->p[bx]));
+    break;
+   case OP_SETLIST:
+    if (c==0) printf("\t; %d",(int)code[++pc]); else printf("\t; %d",c);
+    break;
+   case OP_EXTRAARG:
+    printf("\t; "); PrintConstant(f,ax);
+    break;
+   default:
+    break;
+  }
+  printf("\n");
+ }
+}
+
+#define SS(x)	((x==1)?"":"s")
+#define S(x)	(int)(x),SS(x)
+
+static void PrintHeader(const Proto* f)
+{
+ const char* s=f->source ? getstr(f->source) : "=?";
+ if (*s=='@' || *s=='=')
+  s++;
+ else if (*s==LUA_SIGNATURE[0])
+  s="(bstring)";
+ else
+  s="(string)";
+ printf("\n%s <%s:%d,%d> (%d instruction%s at %p)\n",
+ 	(f->linedefined==0)?"main":"function",s,
+	f->linedefined,f->lastlinedefined,
+	S(f->sizecode),VOID(f));
+ printf("%d%s param%s, %d slot%s, %d upvalue%s, ",
+	(int)(f->numparams),f->is_vararg?"+":"",SS(f->numparams),
+	S(f->maxstacksize),S(f->sizeupvalues));
+ printf("%d local%s, %d constant%s, %d function%s\n",
+	S(f->sizelocvars),S(f->sizek),S(f->sizep));
+}
+
+static void PrintDebug(const Proto* f)
+{
+ int i,n;
+ n=f->sizek;
+ printf("constants (%d) for %p:\n",n,VOID(f));
+ for (i=0; i<n; i++)
+ {
+  printf("\t%d\t",i+1);
+  PrintConstant(f,i);
+  printf("\n");
+ }
+ n=f->sizelocvars;
+ printf("locals (%d) for %p:\n",n,VOID(f));
+ for (i=0; i<n; i++)
+ {
+  printf("\t%d\t%s\t%d\t%d\n",
+  i,getstr(f->locvars[i].varname),f->locvars[i].startpc+1,f->locvars[i].endpc+1);
+ }
+ n=f->sizeupvalues;
+ printf("upvalues (%d) for %p:\n",n,VOID(f));
+ for (i=0; i<n; i++)
+ {
+  printf("\t%d\t%s\t%d\t%d\n",
+  i,UPVALNAME(i),f->upvalues[i].instack,f->upvalues[i].idx);
+ }
+}
+
+static void PrintFunction(const Proto* f, int full)
+{
+ int i,n=f->sizep;
+ PrintHeader(f);
+ PrintCode(f);
+ if (full) PrintDebug(f);
+ for (i=0; i<n; i++) PrintFunction(f->p[i],full);
+}
diff --git a/libs/lua/lua-5.3.3/luaconf.h b/libs/lua/lua-5.3.3/luaconf.h
new file mode 100644
index 0000000..fd447cc
--- /dev/null
+++ b/libs/lua/lua-5.3.3/luaconf.h
@@ -0,0 +1,767 @@
+/*
+** $Id: luaconf.h,v 1.255 2016/05/01 20:06:09 roberto Exp $
+** Configuration file for Lua
+** See Copyright Notice in lua.h
+*/
+
+
+#ifndef luaconf_h
+#define luaconf_h
+
+#include <limits.h>
+#include <stddef.h>
+
+
+/*
+** ===================================================================
+** Search for "@@" to find all configurable definitions.
+** ===================================================================
+*/
+
+
+/*
+** {====================================================================
+** System Configuration: macros to adapt (if needed) Lua to some
+** particular platform, for instance compiling it with 32-bit numbers or
+** restricting it to C89.
+** =====================================================================
+*/
+
+/*
+@@ LUA_32BITS enables Lua with 32-bit integers and 32-bit floats. You
+** can also define LUA_32BITS in the make file, but changing here you
+** ensure that all software connected to Lua will be compiled with the
+** same configuration.
+*/
+/* #define LUA_32BITS */
+
+
+/*
+@@ LUA_USE_C89 controls the use of non-ISO-C89 features.
+** Define it if you want Lua to avoid the use of a few C99 features
+** or Windows-specific features on Windows.
+*/
+/* #define LUA_USE_C89 */
+
+
+/*
+** By default, Lua on Windows use (some) specific Windows features
+*/
+#if !defined(LUA_USE_C89) && defined(_WIN32) && !defined(_WIN32_WCE)
+#define LUA_USE_WINDOWS  /* enable goodies for regular Windows */
+#endif
+
+
+#if defined(LUA_USE_WINDOWS)
+#define LUA_DL_DLL	/* enable support for DLL */
+#define LUA_USE_C89	/* broadly, Windows is C89 */
+#endif
+
+
+#if defined(LUA_USE_LINUX)
+#define LUA_USE_POSIX
+#define LUA_USE_DLOPEN		/* needs an extra library: -ldl */
+#define LUA_USE_READLINE	/* needs some extra libraries */
+#endif
+
+
+#if defined(LUA_USE_MACOSX)
+#define LUA_USE_POSIX
+#define LUA_USE_DLOPEN		/* MacOS does not need -ldl */
+#define LUA_USE_READLINE	/* needs an extra library: -lreadline */
+#endif
+
+
+/*
+@@ LUA_C89_NUMBERS ensures that Lua uses the largest types available for
+** C89 ('long' and 'double'); Windows always has '__int64', so it does
+** not need to use this case.
+*/
+#if defined(LUA_USE_C89) && !defined(LUA_USE_WINDOWS)
+#define LUA_C89_NUMBERS
+#endif
+
+
+
+/*
+@@ LUAI_BITSINT defines the (minimum) number of bits in an 'int'.
+*/
+/* avoid undefined shifts */
+#if ((INT_MAX >> 15) >> 15) >= 1
+#define LUAI_BITSINT	32
+#else
+/* 'int' always must have at least 16 bits */
+#define LUAI_BITSINT	16
+#endif
+
+
+/*
+@@ LUA_INT_TYPE defines the type for Lua integers.
+@@ LUA_FLOAT_TYPE defines the type for Lua floats.
+** Lua should work fine with any mix of these options (if supported
+** by your C compiler). The usual configurations are 64-bit integers
+** and 'double' (the default), 32-bit integers and 'float' (for
+** restricted platforms), and 'long'/'double' (for C compilers not
+** compliant with C99, which may not have support for 'long long').
+*/
+
+/* predefined options for LUA_INT_TYPE */
+#define LUA_INT_INT		1
+#define LUA_INT_LONG		2
+#define LUA_INT_LONGLONG	3
+
+/* predefined options for LUA_FLOAT_TYPE */
+#define LUA_FLOAT_FLOAT		1
+#define LUA_FLOAT_DOUBLE	2
+#define LUA_FLOAT_LONGDOUBLE	3
+
+#if defined(LUA_32BITS)		/* { */
+/*
+** 32-bit integers and 'float'
+*/
+#if LUAI_BITSINT >= 32  /* use 'int' if big enough */
+#define LUA_INT_TYPE	LUA_INT_INT
+#else  /* otherwise use 'long' */
+#define LUA_INT_TYPE	LUA_INT_LONG
+#endif
+#define LUA_FLOAT_TYPE	LUA_FLOAT_FLOAT
+
+#elif defined(LUA_C89_NUMBERS)	/* }{ */
+/*
+** largest types available for C89 ('long' and 'double')
+*/
+#define LUA_INT_TYPE	LUA_INT_LONG
+#define LUA_FLOAT_TYPE	LUA_FLOAT_DOUBLE
+
+#endif				/* } */
+
+
+/*
+** default configuration for 64-bit Lua ('long long' and 'double')
+*/
+#if !defined(LUA_INT_TYPE)
+#define LUA_INT_TYPE	LUA_INT_LONGLONG
+#endif
+
+#if !defined(LUA_FLOAT_TYPE)
+#define LUA_FLOAT_TYPE	LUA_FLOAT_DOUBLE
+#endif
+
+/* }================================================================== */
+
+
+
+
+/*
+** {==================================================================
+** Configuration for Paths.
+** ===================================================================
+*/
+
+/*
+@@ LUA_PATH_DEFAULT is the default path that Lua uses to look for
+** Lua libraries.
+@@ LUA_CPATH_DEFAULT is the default path that Lua uses to look for
+** C libraries.
+** CHANGE them if your machine has a non-conventional directory
+** hierarchy or if you want to install your libraries in
+** non-conventional directories.
+*/
+#define LUA_VDIR	LUA_VERSION_MAJOR "." LUA_VERSION_MINOR
+#if defined(_WIN32)	/* { */
+/*
+** In Windows, any exclamation mark ('!') in the path is replaced by the
+** path of the directory of the executable file of the current process.
+*/
+#define LUA_LDIR	"!\\lua\\"
+#define LUA_CDIR	"!\\"
+#define LUA_SHRDIR	"!\\..\\share\\lua\\" LUA_VDIR "\\"
+#define LUA_PATH_DEFAULT  \
+		LUA_LDIR"?.lua;"  LUA_LDIR"?\\init.lua;" \
+		LUA_CDIR"?.lua;"  LUA_CDIR"?\\init.lua;" \
+		LUA_SHRDIR"?.lua;" LUA_SHRDIR"?\\init.lua;" \
+		".\\?.lua;" ".\\?\\init.lua"
+#define LUA_CPATH_DEFAULT \
+		LUA_CDIR"?.dll;" \
+		LUA_CDIR"..\\lib\\lua\\" LUA_VDIR "\\?.dll;" \
+		LUA_CDIR"loadall.dll;" ".\\?.dll"
+
+#else			/* }{ */
+
+#define LUA_ROOT	"/usr/local/"
+#define LUA_LDIR	LUA_ROOT "share/lua/" LUA_VDIR "/"
+#define LUA_CDIR	LUA_ROOT "lib/lua/" LUA_VDIR "/"
+#define LUA_PATH_DEFAULT  \
+		LUA_LDIR"?.lua;"  LUA_LDIR"?/init.lua;" \
+		LUA_CDIR"?.lua;"  LUA_CDIR"?/init.lua;" \
+		"./?.lua;" "./?/init.lua"
+#define LUA_CPATH_DEFAULT \
+		LUA_CDIR"?.so;" LUA_CDIR"loadall.so;" "./?.so"
+#endif			/* } */
+
+
+/*
+@@ LUA_DIRSEP is the directory separator (for submodules).
+** CHANGE it if your machine does not use "/" as the directory separator
+** and is not Windows. (On Windows Lua automatically uses "\".)
+*/
+#if defined(_WIN32)
+#define LUA_DIRSEP	"\\"
+#else
+#define LUA_DIRSEP	"/"
+#endif
+
+/* }================================================================== */
+
+
+/*
+** {==================================================================
+** Marks for exported symbols in the C code
+** ===================================================================
+*/
+
+/*
+@@ LUA_API is a mark for all core API functions.
+@@ LUALIB_API is a mark for all auxiliary library functions.
+@@ LUAMOD_API is a mark for all standard library opening functions.
+** CHANGE them if you need to define those functions in some special way.
+** For instance, if you want to create one Windows DLL with the core and
+** the libraries, you may want to use the following definition (define
+** LUA_BUILD_AS_DLL to get it).
+*/
+#if defined(LUA_BUILD_AS_DLL)	/* { */
+
+#if defined(LUA_CORE) || defined(LUA_LIB)	/* { */
+#define LUA_API __declspec(dllexport)
+#else						/* }{ */
+#define LUA_API __declspec(dllimport)
+#endif						/* } */
+
+#else				/* }{ */
+
+#define LUA_API		extern
+
+#endif				/* } */
+
+
+/* more often than not the libs go together with the core */
+#define LUALIB_API	LUA_API
+#define LUAMOD_API	LUALIB_API
+
+
+/*
+@@ LUAI_FUNC is a mark for all extern functions that are not to be
+** exported to outside modules.
+@@ LUAI_DDEF and LUAI_DDEC are marks for all extern (const) variables
+** that are not to be exported to outside modules (LUAI_DDEF for
+** definitions and LUAI_DDEC for declarations).
+** CHANGE them if you need to mark them in some special way. Elf/gcc
+** (versions 3.2 and later) mark them as "hidden" to optimize access
+** when Lua is compiled as a shared library. Not all elf targets support
+** this attribute. Unfortunately, gcc does not offer a way to check
+** whether the target offers that support, and those without support
+** give a warning about it. To avoid these warnings, change to the
+** default definition.
+*/
+#if defined(__GNUC__) && ((__GNUC__*100 + __GNUC_MINOR__) >= 302) && \
+    defined(__ELF__)		/* { */
+#define LUAI_FUNC	__attribute__((visibility("hidden"))) extern
+#else				/* }{ */
+#define LUAI_FUNC	extern
+#endif				/* } */
+
+#define LUAI_DDEC	LUAI_FUNC
+#define LUAI_DDEF	/* empty */
+
+/* }================================================================== */
+
+
+/*
+** {==================================================================
+** Compatibility with previous versions
+** ===================================================================
+*/
+
+/*
+@@ LUA_COMPAT_5_2 controls other macros for compatibility with Lua 5.2.
+@@ LUA_COMPAT_5_1 controls other macros for compatibility with Lua 5.1.
+** You can define it to get all options, or change specific options
+** to fit your specific needs.
+*/
+#if defined(LUA_COMPAT_5_2)	/* { */
+
+/*
+@@ LUA_COMPAT_MATHLIB controls the presence of several deprecated
+** functions in the mathematical library.
+*/
+#define LUA_COMPAT_MATHLIB
+
+/*
+@@ LUA_COMPAT_BITLIB controls the presence of library 'bit32'.
+*/
+#define LUA_COMPAT_BITLIB
+
+/*
+@@ LUA_COMPAT_IPAIRS controls the effectiveness of the __ipairs metamethod.
+*/
+#define LUA_COMPAT_IPAIRS
+
+/*
+@@ LUA_COMPAT_APIINTCASTS controls the presence of macros for
+** manipulating other integer types (lua_pushunsigned, lua_tounsigned,
+** luaL_checkint, luaL_checklong, etc.)
+*/
+#define LUA_COMPAT_APIINTCASTS
+
+#endif				/* } */
+
+
+#if defined(LUA_COMPAT_5_1)	/* { */
+
+/* Incompatibilities from 5.2 -> 5.3 */
+#define LUA_COMPAT_MATHLIB
+#define LUA_COMPAT_APIINTCASTS
+
+/*
+@@ LUA_COMPAT_UNPACK controls the presence of global 'unpack'.
+** You can replace it with 'table.unpack'.
+*/
+#define LUA_COMPAT_UNPACK
+
+/*
+@@ LUA_COMPAT_LOADERS controls the presence of table 'package.loaders'.
+** You can replace it with 'package.searchers'.
+*/
+#define LUA_COMPAT_LOADERS
+
+/*
+@@ macro 'lua_cpcall' emulates deprecated function lua_cpcall.
+** You can call your C function directly (with light C functions).
+*/
+#define lua_cpcall(L,f,u)  \
+	(lua_pushcfunction(L, (f)), \
+	 lua_pushlightuserdata(L,(u)), \
+	 lua_pcall(L,1,0,0))
+
+
+/*
+@@ LUA_COMPAT_LOG10 defines the function 'log10' in the math library.
+** You can rewrite 'log10(x)' as 'log(x, 10)'.
+*/
+#define LUA_COMPAT_LOG10
+
+/*
+@@ LUA_COMPAT_LOADSTRING defines the function 'loadstring' in the base
+** library. You can rewrite 'loadstring(s)' as 'load(s)'.
+*/
+#define LUA_COMPAT_LOADSTRING
+
+/*
+@@ LUA_COMPAT_MAXN defines the function 'maxn' in the table library.
+*/
+#define LUA_COMPAT_MAXN
+
+/*
+@@ The following macros supply trivial compatibility for some
+** changes in the API. The macros themselves document how to
+** change your code to avoid using them.
+*/
+#define lua_strlen(L,i)		lua_rawlen(L, (i))
+
+#define lua_objlen(L,i)		lua_rawlen(L, (i))
+
+#define lua_equal(L,idx1,idx2)		lua_compare(L,(idx1),(idx2),LUA_OPEQ)
+#define lua_lessthan(L,idx1,idx2)	lua_compare(L,(idx1),(idx2),LUA_OPLT)
+
+/*
+@@ LUA_COMPAT_MODULE controls compatibility with previous
+** module functions 'module' (Lua) and 'luaL_register' (C).
+*/
+#define LUA_COMPAT_MODULE
+
+#endif				/* } */
+
+
+/*
+@@ LUA_COMPAT_FLOATSTRING makes Lua format integral floats without a
+@@ a float mark ('.0').
+** This macro is not on by default even in compatibility mode,
+** because this is not really an incompatibility.
+*/
+/* #define LUA_COMPAT_FLOATSTRING */
+
+/* }================================================================== */
+
+
+
+/*
+** {==================================================================
+** Configuration for Numbers.
+** Change these definitions if no predefined LUA_FLOAT_* / LUA_INT_*
+** satisfy your needs.
+** ===================================================================
+*/
+
+/*
+@@ LUA_NUMBER is the floating-point type used by Lua.
+@@ LUAI_UACNUMBER is the result of an 'usual argument conversion'
+@@ over a floating number.
+@@ l_mathlim(x) corrects limit name 'x' to the proper float type
+** by prefixing it with one of FLT/DBL/LDBL.
+@@ LUA_NUMBER_FRMLEN is the length modifier for writing floats.
+@@ LUA_NUMBER_FMT is the format for writing floats.
+@@ lua_number2str converts a float to a string.
+@@ l_mathop allows the addition of an 'l' or 'f' to all math operations.
+@@ l_floor takes the floor of a float.
+@@ lua_str2number converts a decimal numeric string to a number.
+*/
+
+
+/* The following definitions are good for most cases here */
+
+#define l_floor(x)		(l_mathop(floor)(x))
+
+#define lua_number2str(s,sz,n)	l_sprintf((s), sz, LUA_NUMBER_FMT, (n))
+
+/*
+@@ lua_numbertointeger converts a float number to an integer, or
+** returns 0 if float is not within the range of a lua_Integer.
+** (The range comparisons are tricky because of rounding. The tests
+** here assume a two-complement representation, where MININTEGER always
+** has an exact representation as a float; MAXINTEGER may not have one,
+** and therefore its conversion to float may have an ill-defined value.)
+*/
+#define lua_numbertointeger(n,p) \
+  ((n) >= (LUA_NUMBER)(LUA_MININTEGER) && \
+   (n) < -(LUA_NUMBER)(LUA_MININTEGER) && \
+      (*(p) = (LUA_INTEGER)(n), 1))
+
+
+/* now the variable definitions */
+
+#if LUA_FLOAT_TYPE == LUA_FLOAT_FLOAT		/* { single float */
+
+#define LUA_NUMBER	float
+
+#define l_mathlim(n)		(FLT_##n)
+
+#define LUAI_UACNUMBER	double
+
+#define LUA_NUMBER_FRMLEN	""
+#define LUA_NUMBER_FMT		"%.7g"
+
+#define l_mathop(op)		op##f
+
+#define lua_str2number(s,p)	strtof((s), (p))
+
+
+#elif LUA_FLOAT_TYPE == LUA_FLOAT_LONGDOUBLE	/* }{ long double */
+
+#define LUA_NUMBER	long double
+
+#define l_mathlim(n)		(LDBL_##n)
+
+#define LUAI_UACNUMBER	long double
+
+#define LUA_NUMBER_FRMLEN	"L"
+#define LUA_NUMBER_FMT		"%.19Lg"
+
+#define l_mathop(op)		op##l
+
+#define lua_str2number(s,p)	strtold((s), (p))
+
+#elif LUA_FLOAT_TYPE == LUA_FLOAT_DOUBLE	/* }{ double */
+
+#define LUA_NUMBER	double
+
+#define l_mathlim(n)		(DBL_##n)
+
+#define LUAI_UACNUMBER	double
+
+#define LUA_NUMBER_FRMLEN	""
+#define LUA_NUMBER_FMT		"%.14g"
+
+#define l_mathop(op)		op
+
+#define lua_str2number(s,p)	strtod((s), (p))
+
+#else						/* }{ */
+
+#error "numeric float type not defined"
+
+#endif					/* } */
+
+
+
+/*
+@@ LUA_INTEGER is the integer type used by Lua.
+**
+@@ LUA_UNSIGNED is the unsigned version of LUA_INTEGER.
+**
+@@ LUAI_UACINT is the result of an 'usual argument conversion'
+@@ over a lUA_INTEGER.
+@@ LUA_INTEGER_FRMLEN is the length modifier for reading/writing integers.
+@@ LUA_INTEGER_FMT is the format for writing integers.
+@@ LUA_MAXINTEGER is the maximum value for a LUA_INTEGER.
+@@ LUA_MININTEGER is the minimum value for a LUA_INTEGER.
+@@ lua_integer2str converts an integer to a string.
+*/
+
+
+/* The following definitions are good for most cases here */
+
+#define LUA_INTEGER_FMT		"%" LUA_INTEGER_FRMLEN "d"
+#define lua_integer2str(s,sz,n)	l_sprintf((s), sz, LUA_INTEGER_FMT, (n))
+
+#define LUAI_UACINT		LUA_INTEGER
+
+/*
+** use LUAI_UACINT here to avoid problems with promotions (which
+** can turn a comparison between unsigneds into a signed comparison)
+*/
+#define LUA_UNSIGNED		unsigned LUAI_UACINT
+
+
+/* now the variable definitions */
+
+#if LUA_INT_TYPE == LUA_INT_INT		/* { int */
+
+#define LUA_INTEGER		int
+#define LUA_INTEGER_FRMLEN	""
+
+#define LUA_MAXINTEGER		INT_MAX
+#define LUA_MININTEGER		INT_MIN
+
+#elif LUA_INT_TYPE == LUA_INT_LONG	/* }{ long */
+
+#define LUA_INTEGER		long
+#define LUA_INTEGER_FRMLEN	"l"
+
+#define LUA_MAXINTEGER		LONG_MAX
+#define LUA_MININTEGER		LONG_MIN
+
+#elif LUA_INT_TYPE == LUA_INT_LONGLONG	/* }{ long long */
+
+/* use presence of macro LLONG_MAX as proxy for C99 compliance */
+#if defined(LLONG_MAX)		/* { */
+/* use ISO C99 stuff */
+
+#define LUA_INTEGER		long long
+#define LUA_INTEGER_FRMLEN	"ll"
+
+#define LUA_MAXINTEGER		LLONG_MAX
+#define LUA_MININTEGER		LLONG_MIN
+
+#elif defined(LUA_USE_WINDOWS) /* }{ */
+/* in Windows, can use specific Windows types */
+
+#define LUA_INTEGER		__int64
+#define LUA_INTEGER_FRMLEN	"I64"
+
+#define LUA_MAXINTEGER		_I64_MAX
+#define LUA_MININTEGER		_I64_MIN
+
+#else				/* }{ */
+
+#error "Compiler does not support 'long long'. Use option '-DLUA_32BITS' \
+  or '-DLUA_C89_NUMBERS' (see file 'luaconf.h' for details)"
+
+#endif				/* } */
+
+#else				/* }{ */
+
+#error "numeric integer type not defined"
+
+#endif				/* } */
+
+/* }================================================================== */
+
+
+/*
+** {==================================================================
+** Dependencies with C99 and other C details
+** ===================================================================
+*/
+
+/*
+@@ l_sprintf is equivalent to 'snprintf' or 'sprintf' in C89.
+** (All uses in Lua have only one format item.)
+*/
+#if !defined(LUA_USE_C89)
+#define l_sprintf(s,sz,f,i)	snprintf(s,sz,f,i)
+#else
+#define l_sprintf(s,sz,f,i)	((void)(sz), sprintf(s,f,i))
+#endif
+
+
+/*
+@@ lua_strx2number converts an hexadecimal numeric string to a number.
+** In C99, 'strtod' does that conversion. Otherwise, you can
+** leave 'lua_strx2number' undefined and Lua will provide its own
+** implementation.
+*/
+#if !defined(LUA_USE_C89)
+#define lua_strx2number(s,p)		lua_str2number(s,p)
+#endif
+
+
+/*
+@@ lua_number2strx converts a float to an hexadecimal numeric string. 
+** In C99, 'sprintf' (with format specifiers '%a'/'%A') does that.
+** Otherwise, you can leave 'lua_number2strx' undefined and Lua will
+** provide its own implementation.
+*/
+#if !defined(LUA_USE_C89)
+#define lua_number2strx(L,b,sz,f,n)	((void)L, l_sprintf(b,sz,f,n))
+#endif
+
+
+/*
+** 'strtof' and 'opf' variants for math functions are not valid in
+** C89. Otherwise, the macro 'HUGE_VALF' is a good proxy for testing the
+** availability of these variants. ('math.h' is already included in
+** all files that use these macros.)
+*/
+#if defined(LUA_USE_C89) || (defined(HUGE_VAL) && !defined(HUGE_VALF))
+#undef l_mathop  /* variants not available */
+#undef lua_str2number
+#define l_mathop(op)		(lua_Number)op  /* no variant */
+#define lua_str2number(s,p)	((lua_Number)strtod((s), (p)))
+#endif
+
+
+/*
+@@ LUA_KCONTEXT is the type of the context ('ctx') for continuation
+** functions.  It must be a numerical type; Lua will use 'intptr_t' if
+** available, otherwise it will use 'ptrdiff_t' (the nearest thing to
+** 'intptr_t' in C89)
+*/
+#define LUA_KCONTEXT	ptrdiff_t
+
+#if !defined(LUA_USE_C89) && defined(__STDC_VERSION__) && \
+    __STDC_VERSION__ >= 199901L
+#include <stdint.h>
+#if defined(INTPTR_MAX)  /* even in C99 this type is optional */
+#undef LUA_KCONTEXT
+#define LUA_KCONTEXT	intptr_t
+#endif
+#endif
+
+
+/*
+@@ lua_getlocaledecpoint gets the locale "radix character" (decimal point).
+** Change that if you do not want to use C locales. (Code using this
+** macro must include header 'locale.h'.)
+*/
+#if !defined(lua_getlocaledecpoint)
+#define lua_getlocaledecpoint()		(localeconv()->decimal_point[0])
+#endif
+
+/* }================================================================== */
+
+
+/*
+** {==================================================================
+** Language Variations
+** =====================================================================
+*/
+
+/*
+@@ LUA_NOCVTN2S/LUA_NOCVTS2N control how Lua performs some
+** coercions. Define LUA_NOCVTN2S to turn off automatic coercion from
+** numbers to strings. Define LUA_NOCVTS2N to turn off automatic
+** coercion from strings to numbers.
+*/
+/* #define LUA_NOCVTN2S */
+/* #define LUA_NOCVTS2N */
+
+
+/*
+@@ LUA_USE_APICHECK turns on several consistency checks on the C API.
+** Define it as a help when debugging C code.
+*/
+#if defined(LUA_USE_APICHECK)
+#include <assert.h>
+#define luai_apicheck(l,e)	assert(e)
+#endif
+
+/* }================================================================== */
+
+
+/*
+** {==================================================================
+** Macros that affect the API and must be stable (that is, must be the
+** same when you compile Lua and when you compile code that links to
+** Lua). You probably do not want/need to change them.
+** =====================================================================
+*/
+
+/*
+@@ LUAI_MAXSTACK limits the size of the Lua stack.
+** CHANGE it if you need a different limit. This limit is arbitrary;
+** its only purpose is to stop Lua from consuming unlimited stack
+** space (and to reserve some numbers for pseudo-indices).
+*/
+#if LUAI_BITSINT >= 32
+#define LUAI_MAXSTACK		1000000
+#else
+#define LUAI_MAXSTACK		15000
+#endif
+
+
+/*
+@@ LUA_EXTRASPACE defines the size of a raw memory area associated with
+** a Lua state with very fast access.
+** CHANGE it if you need a different size.
+*/
+#define LUA_EXTRASPACE		(sizeof(void *))
+
+
+/*
+@@ LUA_IDSIZE gives the maximum size for the description of the source
+@@ of a function in debug information.
+** CHANGE it if you want a different size.
+*/
+#define LUA_IDSIZE	60
+
+
+/*
+@@ LUAL_BUFFERSIZE is the buffer size used by the lauxlib buffer system.
+** CHANGE it if it uses too much C-stack space. (For long double,
+** 'string.format("%.99f", 1e4932)' needs ~5030 bytes, so a
+** smaller buffer would force a memory allocation for each call to
+** 'string.format'.)
+*/
+#if defined(LUA_FLOAT_LONGDOUBLE)
+#define LUAL_BUFFERSIZE		8192
+#else
+#define LUAL_BUFFERSIZE   ((int)(0x80 * sizeof(void*) * sizeof(lua_Integer)))
+#endif
+
+/* }================================================================== */
+
+
+/*
+@@ LUA_QL describes how error messages quote program elements.
+** Lua does not use these macros anymore; they are here for
+** compatibility only.
+*/
+#define LUA_QL(x)	"'" x "'"
+#define LUA_QS		LUA_QL("%s")
+
+
+
+
+/* =================================================================== */
+
+/*
+** Local configuration. You can use this space to add your redefinitions
+** without modifying the main part of the file.
+*/
+
+
+
+
+
+#endif
+
diff --git a/libs/lua/lua-5.3.3/lualib.h b/libs/lua/lua-5.3.3/lualib.h
new file mode 100644
index 0000000..5165c0f
--- /dev/null
+++ b/libs/lua/lua-5.3.3/lualib.h
@@ -0,0 +1,58 @@
+/*
+** $Id: lualib.h,v 1.44 2014/02/06 17:32:33 roberto Exp $
+** Lua standard libraries
+** See Copyright Notice in lua.h
+*/
+
+
+#ifndef lualib_h
+#define lualib_h
+
+#include "lua.h"
+
+
+
+LUAMOD_API int (luaopen_base) (lua_State *L);
+
+#define LUA_COLIBNAME	"coroutine"
+LUAMOD_API int (luaopen_coroutine) (lua_State *L);
+
+#define LUA_TABLIBNAME	"table"
+LUAMOD_API int (luaopen_table) (lua_State *L);
+
+#define LUA_IOLIBNAME	"io"
+LUAMOD_API int (luaopen_io) (lua_State *L);
+
+#define LUA_OSLIBNAME	"os"
+LUAMOD_API int (luaopen_os) (lua_State *L);
+
+#define LUA_STRLIBNAME	"string"
+LUAMOD_API int (luaopen_string) (lua_State *L);
+
+#define LUA_UTF8LIBNAME	"utf8"
+LUAMOD_API int (luaopen_utf8) (lua_State *L);
+
+#define LUA_BITLIBNAME	"bit32"
+LUAMOD_API int (luaopen_bit32) (lua_State *L);
+
+#define LUA_MATHLIBNAME	"math"
+LUAMOD_API int (luaopen_math) (lua_State *L);
+
+#define LUA_DBLIBNAME	"debug"
+LUAMOD_API int (luaopen_debug) (lua_State *L);
+
+#define LUA_LOADLIBNAME	"package"
+LUAMOD_API int (luaopen_package) (lua_State *L);
+
+
+/* open all previous libraries */
+LUALIB_API void (luaL_openlibs) (lua_State *L);
+
+
+
+#if !defined(lua_assert)
+#define lua_assert(x)	((void)0)
+#endif
+
+
+#endif
diff --git a/libs/lua/lua-5.3.3/lundump.c b/libs/lua/lua-5.3.3/lundump.c
new file mode 100644
index 0000000..4080af9
--- /dev/null
+++ b/libs/lua/lua-5.3.3/lundump.c
@@ -0,0 +1,279 @@
+/*
+** $Id: lundump.c,v 2.44 2015/11/02 16:09:30 roberto Exp $
+** load precompiled Lua chunks
+** See Copyright Notice in lua.h
+*/
+
+#define lundump_c
+#define LUA_CORE
+
+#include "lprefix.h"
+
+
+#include <string.h>
+
+#include "lua.h"
+
+#include "ldebug.h"
+#include "ldo.h"
+#include "lfunc.h"
+#include "lmem.h"
+#include "lobject.h"
+#include "lstring.h"
+#include "lundump.h"
+#include "lzio.h"
+
+
+#if !defined(luai_verifycode)
+#define luai_verifycode(L,b,f)  /* empty */
+#endif
+
+
+typedef struct {
+  lua_State *L;
+  ZIO *Z;
+  const char *name;
+} LoadState;
+
+
+static l_noret error(LoadState *S, const char *why) {
+  luaO_pushfstring(S->L, "%s: %s precompiled chunk", S->name, why);
+  luaD_throw(S->L, LUA_ERRSYNTAX);
+}
+
+
+/*
+** All high-level loads go through LoadVector; you can change it to
+** adapt to the endianness of the input
+*/
+#define LoadVector(S,b,n)	LoadBlock(S,b,(n)*sizeof((b)[0]))
+
+static void LoadBlock (LoadState *S, void *b, size_t size) {
+  if (luaZ_read(S->Z, b, size) != 0)
+    error(S, "truncated");
+}
+
+
+#define LoadVar(S,x)		LoadVector(S,&x,1)
+
+
+static lu_byte LoadByte (LoadState *S) {
+  lu_byte x;
+  LoadVar(S, x);
+  return x;
+}
+
+
+static int LoadInt (LoadState *S) {
+  int x;
+  LoadVar(S, x);
+  return x;
+}
+
+
+static lua_Number LoadNumber (LoadState *S) {
+  lua_Number x;
+  LoadVar(S, x);
+  return x;
+}
+
+
+static lua_Integer LoadInteger (LoadState *S) {
+  lua_Integer x;
+  LoadVar(S, x);
+  return x;
+}
+
+
+static TString *LoadString (LoadState *S) {
+  size_t size = LoadByte(S);
+  if (size == 0xFF)
+    LoadVar(S, size);
+  if (size == 0)
+    return NULL;
+  else if (--size <= LUAI_MAXSHORTLEN) {  /* short string? */
+    char buff[LUAI_MAXSHORTLEN];
+    LoadVector(S, buff, size);
+    return luaS_newlstr(S->L, buff, size);
+  }
+  else {  /* long string */
+    TString *ts = luaS_createlngstrobj(S->L, size);
+    LoadVector(S, getstr(ts), size);  /* load directly in final place */
+    return ts;
+  }
+}
+
+
+static void LoadCode (LoadState *S, Proto *f) {
+  int n = LoadInt(S);
+  f->code = luaM_newvector(S->L, n, Instruction);
+  f->sizecode = n;
+  LoadVector(S, f->code, n);
+}
+
+
+static void LoadFunction(LoadState *S, Proto *f, TString *psource);
+
+
+static void LoadConstants (LoadState *S, Proto *f) {
+  int i;
+  int n = LoadInt(S);
+  f->k = luaM_newvector(S->L, n, TValue);
+  f->sizek = n;
+  for (i = 0; i < n; i++)
+    setnilvalue(&f->k[i]);
+  for (i = 0; i < n; i++) {
+    TValue *o = &f->k[i];
+    int t = LoadByte(S);
+    switch (t) {
+    case LUA_TNIL:
+      setnilvalue(o);
+      break;
+    case LUA_TBOOLEAN:
+      setbvalue(o, LoadByte(S));
+      break;
+    case LUA_TNUMFLT:
+      setfltvalue(o, LoadNumber(S));
+      break;
+    case LUA_TNUMINT:
+      setivalue(o, LoadInteger(S));
+      break;
+    case LUA_TSHRSTR:
+    case LUA_TLNGSTR:
+      setsvalue2n(S->L, o, LoadString(S));
+      break;
+    default:
+      lua_assert(0);
+    }
+  }
+}
+
+
+static void LoadProtos (LoadState *S, Proto *f) {
+  int i;
+  int n = LoadInt(S);
+  f->p = luaM_newvector(S->L, n, Proto *);
+  f->sizep = n;
+  for (i = 0; i < n; i++)
+    f->p[i] = NULL;
+  for (i = 0; i < n; i++) {
+    f->p[i] = luaF_newproto(S->L);
+    LoadFunction(S, f->p[i], f->source);
+  }
+}
+
+
+static void LoadUpvalues (LoadState *S, Proto *f) {
+  int i, n;
+  n = LoadInt(S);
+  f->upvalues = luaM_newvector(S->L, n, Upvaldesc);
+  f->sizeupvalues = n;
+  for (i = 0; i < n; i++)
+    f->upvalues[i].name = NULL;
+  for (i = 0; i < n; i++) {
+    f->upvalues[i].instack = LoadByte(S);
+    f->upvalues[i].idx = LoadByte(S);
+  }
+}
+
+
+static void LoadDebug (LoadState *S, Proto *f) {
+  int i, n;
+  n = LoadInt(S);
+  f->lineinfo = luaM_newvector(S->L, n, int);
+  f->sizelineinfo = n;
+  LoadVector(S, f->lineinfo, n);
+  n = LoadInt(S);
+  f->locvars = luaM_newvector(S->L, n, LocVar);
+  f->sizelocvars = n;
+  for (i = 0; i < n; i++)
+    f->locvars[i].varname = NULL;
+  for (i = 0; i < n; i++) {
+    f->locvars[i].varname = LoadString(S);
+    f->locvars[i].startpc = LoadInt(S);
+    f->locvars[i].endpc = LoadInt(S);
+  }
+  n = LoadInt(S);
+  for (i = 0; i < n; i++)
+    f->upvalues[i].name = LoadString(S);
+}
+
+
+static void LoadFunction (LoadState *S, Proto *f, TString *psource) {
+  f->source = LoadString(S);
+  if (f->source == NULL)  /* no source in dump? */
+    f->source = psource;  /* reuse parent's source */
+  f->linedefined = LoadInt(S);
+  f->lastlinedefined = LoadInt(S);
+  f->numparams = LoadByte(S);
+  f->is_vararg = LoadByte(S);
+  f->maxstacksize = LoadByte(S);
+  LoadCode(S, f);
+  LoadConstants(S, f);
+  LoadUpvalues(S, f);
+  LoadProtos(S, f);
+  LoadDebug(S, f);
+}
+
+
+static void checkliteral (LoadState *S, const char *s, const char *msg) {
+  char buff[sizeof(LUA_SIGNATURE) + sizeof(LUAC_DATA)]; /* larger than both */
+  size_t len = strlen(s);
+  LoadVector(S, buff, len);
+  if (memcmp(s, buff, len) != 0)
+    error(S, msg);
+}
+
+
+static void fchecksize (LoadState *S, size_t size, const char *tname) {
+  if (LoadByte(S) != size)
+    error(S, luaO_pushfstring(S->L, "%s size mismatch in", tname));
+}
+
+
+#define checksize(S,t)	fchecksize(S,sizeof(t),#t)
+
+static void checkHeader (LoadState *S) {
+  checkliteral(S, LUA_SIGNATURE + 1, "not a");  /* 1st char already checked */
+  if (LoadByte(S) != LUAC_VERSION)
+    error(S, "version mismatch in");
+  if (LoadByte(S) != LUAC_FORMAT)
+    error(S, "format mismatch in");
+  checkliteral(S, LUAC_DATA, "corrupted");
+  checksize(S, int);
+  checksize(S, size_t);
+  checksize(S, Instruction);
+  checksize(S, lua_Integer);
+  checksize(S, lua_Number);
+  if (LoadInteger(S) != LUAC_INT)
+    error(S, "endianness mismatch in");
+  if (LoadNumber(S) != LUAC_NUM)
+    error(S, "float format mismatch in");
+}
+
+
+/*
+** load precompiled chunk
+*/
+LClosure *luaU_undump(lua_State *L, ZIO *Z, const char *name) {
+  LoadState S;
+  LClosure *cl;
+  if (*name == '@' || *name == '=')
+    S.name = name + 1;
+  else if (*name == LUA_SIGNATURE[0])
+    S.name = "binary string";
+  else
+    S.name = name;
+  S.L = L;
+  S.Z = Z;
+  checkHeader(&S);
+  cl = luaF_newLclosure(L, LoadByte(&S));
+  setclLvalue(L, L->top, cl);
+  luaD_inctop(L);
+  cl->p = luaF_newproto(L);
+  LoadFunction(&S, cl->p, NULL);
+  lua_assert(cl->nupvalues == cl->p->sizeupvalues);
+  luai_verifycode(L, buff, cl->p);
+  return cl;
+}
+
diff --git a/libs/lua/lua-5.3.3/lundump.h b/libs/lua/lua-5.3.3/lundump.h
new file mode 100644
index 0000000..aa5cc82
--- /dev/null
+++ b/libs/lua/lua-5.3.3/lundump.h
@@ -0,0 +1,32 @@
+/*
+** $Id: lundump.h,v 1.45 2015/09/08 15:41:05 roberto Exp $
+** load precompiled Lua chunks
+** See Copyright Notice in lua.h
+*/
+
+#ifndef lundump_h
+#define lundump_h
+
+#include "llimits.h"
+#include "lobject.h"
+#include "lzio.h"
+
+
+/* data to catch conversion errors */
+#define LUAC_DATA	"\x19\x93\r\n\x1a\n"
+
+#define LUAC_INT	0x5678
+#define LUAC_NUM	cast_num(370.5)
+
+#define MYINT(s)	(s[0]-'0')
+#define LUAC_VERSION	(MYINT(LUA_VERSION_MAJOR)*16+MYINT(LUA_VERSION_MINOR))
+#define LUAC_FORMAT	0	/* this is the official format */
+
+/* load one chunk; from lundump.c */
+LUAI_FUNC LClosure* luaU_undump (lua_State* L, ZIO* Z, const char* name);
+
+/* dump one chunk; from ldump.c */
+LUAI_FUNC int luaU_dump (lua_State* L, const Proto* f, lua_Writer w,
+                         void* data, int strip);
+
+#endif
diff --git a/libs/lua/lua-5.3.3/lutf8lib.c b/libs/lua/lua-5.3.3/lutf8lib.c
new file mode 100644
index 0000000..9042582
--- /dev/null
+++ b/libs/lua/lua-5.3.3/lutf8lib.c
@@ -0,0 +1,256 @@
+/*
+** $Id: lutf8lib.c,v 1.15 2015/03/28 19:16:55 roberto Exp $
+** Standard library for UTF-8 manipulation
+** See Copyright Notice in lua.h
+*/
+
+#define lutf8lib_c
+#define LUA_LIB
+
+#include "lprefix.h"
+
+
+#include <assert.h>
+#include <limits.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "lua.h"
+
+#include "lauxlib.h"
+#include "lualib.h"
+
+#define MAXUNICODE	0x10FFFF
+
+#define iscont(p)	((*(p) & 0xC0) == 0x80)
+
+
+/* from strlib */
+/* translate a relative string position: negative means back from end */
+static lua_Integer u_posrelat (lua_Integer pos, size_t len) {
+  if (pos >= 0) return pos;
+  else if (0u - (size_t)pos > len) return 0;
+  else return (lua_Integer)len + pos + 1;
+}
+
+
+/*
+** Decode one UTF-8 sequence, returning NULL if byte sequence is invalid.
+*/
+static const char *utf8_decode (const char *o, int *val) {
+  static const unsigned int limits[] = {0xFF, 0x7F, 0x7FF, 0xFFFF};
+  const unsigned char *s = (const unsigned char *)o;
+  unsigned int c = s[0];
+  unsigned int res = 0;  /* final result */
+  if (c < 0x80)  /* ascii? */
+    res = c;
+  else {
+    int count = 0;  /* to count number of continuation bytes */
+    while (c & 0x40) {  /* still have continuation bytes? */
+      int cc = s[++count];  /* read next byte */
+      if ((cc & 0xC0) != 0x80)  /* not a continuation byte? */
+        return NULL;  /* invalid byte sequence */
+      res = (res << 6) | (cc & 0x3F);  /* add lower 6 bits from cont. byte */
+      c <<= 1;  /* to test next bit */
+    }
+    res |= ((c & 0x7F) << (count * 5));  /* add first byte */
+    if (count > 3 || res > MAXUNICODE || res <= limits[count])
+      return NULL;  /* invalid byte sequence */
+    s += count;  /* skip continuation bytes read */
+  }
+  if (val) *val = res;
+  return (const char *)s + 1;  /* +1 to include first byte */
+}
+
+
+/*
+** utf8len(s [, i [, j]]) --> number of characters that start in the
+** range [i,j], or nil + current position if 's' is not well formed in
+** that interval
+*/
+static int utflen (lua_State *L) {
+  int n = 0;
+  size_t len;
+  const char *s = luaL_checklstring(L, 1, &len);
+  lua_Integer posi = u_posrelat(luaL_optinteger(L, 2, 1), len);
+  lua_Integer posj = u_posrelat(luaL_optinteger(L, 3, -1), len);
+  luaL_argcheck(L, 1 <= posi && --posi <= (lua_Integer)len, 2,
+                   "initial position out of string");
+  luaL_argcheck(L, --posj < (lua_Integer)len, 3,
+                   "final position out of string");
+  while (posi <= posj) {
+    const char *s1 = utf8_decode(s + posi, NULL);
+    if (s1 == NULL) {  /* conversion error? */
+      lua_pushnil(L);  /* return nil ... */
+      lua_pushinteger(L, posi + 1);  /* ... and current position */
+      return 2;
+    }
+    posi = s1 - s;
+    n++;
+  }
+  lua_pushinteger(L, n);
+  return 1;
+}
+
+
+/*
+** codepoint(s, [i, [j]])  -> returns codepoints for all characters
+** that start in the range [i,j]
+*/
+static int codepoint (lua_State *L) {
+  size_t len;
+  const char *s = luaL_checklstring(L, 1, &len);
+  lua_Integer posi = u_posrelat(luaL_optinteger(L, 2, 1), len);
+  lua_Integer pose = u_posrelat(luaL_optinteger(L, 3, posi), len);
+  int n;
+  const char *se;
+  luaL_argcheck(L, posi >= 1, 2, "out of range");
+  luaL_argcheck(L, pose <= (lua_Integer)len, 3, "out of range");
+  if (posi > pose) return 0;  /* empty interval; return no values */
+  if (pose - posi >= INT_MAX)  /* (lua_Integer -> int) overflow? */
+    return luaL_error(L, "string slice too long");
+  n = (int)(pose -  posi) + 1;
+  luaL_checkstack(L, n, "string slice too long");
+  n = 0;
+  se = s + pose;
+  for (s += posi - 1; s < se;) {
+    int code;
+    s = utf8_decode(s, &code);
+    if (s == NULL)
+      return luaL_error(L, "invalid UTF-8 code");
+    lua_pushinteger(L, code);
+    n++;
+  }
+  return n;
+}
+
+
+static void pushutfchar (lua_State *L, int arg) {
+  lua_Integer code = luaL_checkinteger(L, arg);
+  luaL_argcheck(L, 0 <= code && code <= MAXUNICODE, arg, "value out of range");
+  lua_pushfstring(L, "%U", (long)code);
+}
+
+
+/*
+** utfchar(n1, n2, ...)  -> char(n1)..char(n2)...
+*/
+static int utfchar (lua_State *L) {
+  int n = lua_gettop(L);  /* number of arguments */
+  if (n == 1)  /* optimize common case of single char */
+    pushutfchar(L, 1);
+  else {
+    int i;
+    luaL_Buffer b;
+    luaL_buffinit(L, &b);
+    for (i = 1; i <= n; i++) {
+      pushutfchar(L, i);
+      luaL_addvalue(&b);
+    }
+    luaL_pushresult(&b);
+  }
+  return 1;
+}
+
+
+/*
+** offset(s, n, [i])  -> index where n-th character counting from
+**   position 'i' starts; 0 means character at 'i'.
+*/
+static int byteoffset (lua_State *L) {
+  size_t len;
+  const char *s = luaL_checklstring(L, 1, &len);
+  lua_Integer n  = luaL_checkinteger(L, 2);
+  lua_Integer posi = (n >= 0) ? 1 : len + 1;
+  posi = u_posrelat(luaL_optinteger(L, 3, posi), len);
+  luaL_argcheck(L, 1 <= posi && --posi <= (lua_Integer)len, 3,
+                   "position out of range");
+  if (n == 0) {
+    /* find beginning of current byte sequence */
+    while (posi > 0 && iscont(s + posi)) posi--;
+  }
+  else {
+    if (iscont(s + posi))
+      luaL_error(L, "initial position is a continuation byte");
+    if (n < 0) {
+       while (n < 0 && posi > 0) {  /* move back */
+         do {  /* find beginning of previous character */
+           posi--;
+         } while (posi > 0 && iscont(s + posi));
+         n++;
+       }
+     }
+     else {
+       n--;  /* do not move for 1st character */
+       while (n > 0 && posi < (lua_Integer)len) {
+         do {  /* find beginning of next character */
+           posi++;
+         } while (iscont(s + posi));  /* (cannot pass final '\0') */
+         n--;
+       }
+     }
+  }
+  if (n == 0)  /* did it find given character? */
+    lua_pushinteger(L, posi + 1);
+  else  /* no such character */
+    lua_pushnil(L);
+  return 1;  
+}
+
+
+static int iter_aux (lua_State *L) {
+  size_t len;
+  const char *s = luaL_checklstring(L, 1, &len);
+  lua_Integer n = lua_tointeger(L, 2) - 1;
+  if (n < 0)  /* first iteration? */
+    n = 0;  /* start from here */
+  else if (n < (lua_Integer)len) {
+    n++;  /* skip current byte */
+    while (iscont(s + n)) n++;  /* and its continuations */
+  }
+  if (n >= (lua_Integer)len)
+    return 0;  /* no more codepoints */
+  else {
+    int code;
+    const char *next = utf8_decode(s + n, &code);
+    if (next == NULL || iscont(next))
+      return luaL_error(L, "invalid UTF-8 code");
+    lua_pushinteger(L, n + 1);
+    lua_pushinteger(L, code);
+    return 2;
+  }
+}
+
+
+static int iter_codes (lua_State *L) {
+  luaL_checkstring(L, 1);
+  lua_pushcfunction(L, iter_aux);
+  lua_pushvalue(L, 1);
+  lua_pushinteger(L, 0);
+  return 3;
+}
+
+
+/* pattern to match a single UTF-8 character */
+#define UTF8PATT	"[\0-\x7F\xC2-\xF4][\x80-\xBF]*"
+
+
+static const luaL_Reg funcs[] = {
+  {"offset", byteoffset},
+  {"codepoint", codepoint},
+  {"char", utfchar},
+  {"len", utflen},
+  {"codes", iter_codes},
+  /* placeholders */
+  {"charpattern", NULL},
+  {NULL, NULL}
+};
+
+
+LUAMOD_API int luaopen_utf8 (lua_State *L) {
+  luaL_newlib(L, funcs);
+  lua_pushlstring(L, UTF8PATT, sizeof(UTF8PATT)/sizeof(char) - 1);
+  lua_setfield(L, -2, "charpattern");
+  return 1;
+}
+
diff --git a/libs/lua/lua-5.3.3/lvm.c b/libs/lua/lua-5.3.3/lvm.c
new file mode 100644
index 0000000..84ade6b
--- /dev/null
+++ b/libs/lua/lua-5.3.3/lvm.c
@@ -0,0 +1,1322 @@
+/*
+** $Id: lvm.c,v 2.268 2016/02/05 19:59:14 roberto Exp $
+** Lua virtual machine
+** See Copyright Notice in lua.h
+*/
+
+#define lvm_c
+#define LUA_CORE
+
+#include "lprefix.h"
+
+#include <float.h>
+#include <limits.h>
+#include <math.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "lua.h"
+
+#include "ldebug.h"
+#include "ldo.h"
+#include "lfunc.h"
+#include "lgc.h"
+#include "lobject.h"
+#include "lopcodes.h"
+#include "lstate.h"
+#include "lstring.h"
+#include "ltable.h"
+#include "ltm.h"
+#include "lvm.h"
+
+
+/* limit for table tag-method chains (to avoid loops) */
+#define MAXTAGLOOP	2000
+
+
+
+/*
+** 'l_intfitsf' checks whether a given integer can be converted to a
+** float without rounding. Used in comparisons. Left undefined if
+** all integers fit in a float precisely.
+*/
+#if !defined(l_intfitsf)
+
+/* number of bits in the mantissa of a float */
+#define NBM		(l_mathlim(MANT_DIG))
+
+/*
+** Check whether some integers may not fit in a float, that is, whether
+** (maxinteger >> NBM) > 0 (that implies (1 << NBM) <= maxinteger).
+** (The shifts are done in parts to avoid shifting by more than the size
+** of an integer. In a worst case, NBM == 113 for long double and
+** sizeof(integer) == 32.)
+*/
+#if ((((LUA_MAXINTEGER >> (NBM / 4)) >> (NBM / 4)) >> (NBM / 4)) \
+	>> (NBM - (3 * (NBM / 4))))  >  0
+
+#define l_intfitsf(i)  \
+  (-((lua_Integer)1 << NBM) <= (i) && (i) <= ((lua_Integer)1 << NBM))
+
+#endif
+
+#endif
+
+
+
+/*
+** Try to convert a value to a float. The float case is already handled
+** by the macro 'tonumber'.
+*/
+int luaV_tonumber_ (const TValue *obj, lua_Number *n) {
+  TValue v;
+  if (ttisinteger(obj)) {
+    *n = cast_num(ivalue(obj));
+    return 1;
+  }
+  else if (cvt2num(obj) &&  /* string convertible to number? */
+            luaO_str2num(svalue(obj), &v) == vslen(obj) + 1) {
+    *n = nvalue(&v);  /* convert result of 'luaO_str2num' to a float */
+    return 1;
+  }
+  else
+    return 0;  /* conversion failed */
+}
+
+
+/*
+** try to convert a value to an integer, rounding according to 'mode':
+** mode == 0: accepts only integral values
+** mode == 1: takes the floor of the number
+** mode == 2: takes the ceil of the number
+*/
+int luaV_tointeger (const TValue *obj, lua_Integer *p, int mode) {
+  TValue v;
+ again:
+  if (ttisfloat(obj)) {
+    lua_Number n = fltvalue(obj);
+    lua_Number f = l_floor(n);
+    if (n != f) {  /* not an integral value? */
+      if (mode == 0) return 0;  /* fails if mode demands integral value */
+      else if (mode > 1)  /* needs ceil? */
+        f += 1;  /* convert floor to ceil (remember: n != f) */
+    }
+    return lua_numbertointeger(f, p);
+  }
+  else if (ttisinteger(obj)) {
+    *p = ivalue(obj);
+    return 1;
+  }
+  else if (cvt2num(obj) &&
+            luaO_str2num(svalue(obj), &v) == vslen(obj) + 1) {
+    obj = &v;
+    goto again;  /* convert result from 'luaO_str2num' to an integer */
+  }
+  return 0;  /* conversion failed */
+}
+
+
+/*
+** Try to convert a 'for' limit to an integer, preserving the
+** semantics of the loop.
+** (The following explanation assumes a non-negative step; it is valid
+** for negative steps mutatis mutandis.)
+** If the limit can be converted to an integer, rounding down, that is
+** it.
+** Otherwise, check whether the limit can be converted to a number.  If
+** the number is too large, it is OK to set the limit as LUA_MAXINTEGER,
+** which means no limit.  If the number is too negative, the loop
+** should not run, because any initial integer value is larger than the
+** limit. So, it sets the limit to LUA_MININTEGER. 'stopnow' corrects
+** the extreme case when the initial value is LUA_MININTEGER, in which
+** case the LUA_MININTEGER limit would still run the loop once.
+*/
+static int forlimit (const TValue *obj, lua_Integer *p, lua_Integer step,
+                     int *stopnow) {
+  *stopnow = 0;  /* usually, let loops run */
+  if (!luaV_tointeger(obj, p, (step < 0 ? 2 : 1))) {  /* not fit in integer? */
+    lua_Number n;  /* try to convert to float */
+    if (!tonumber(obj, &n)) /* cannot convert to float? */
+      return 0;  /* not a number */
+    if (luai_numlt(0, n)) {  /* if true, float is larger than max integer */
+      *p = LUA_MAXINTEGER;
+      if (step < 0) *stopnow = 1;
+    }
+    else {  /* float is smaller than min integer */
+      *p = LUA_MININTEGER;
+      if (step >= 0) *stopnow = 1;
+    }
+  }
+  return 1;
+}
+
+
+/*
+** Finish the table access 'val = t[key]'.
+** if 'slot' is NULL, 't' is not a table; otherwise, 'slot' points to
+** t[k] entry (which must be nil).
+*/
+void luaV_finishget (lua_State *L, const TValue *t, TValue *key, StkId val,
+                      const TValue *slot) {
+  int loop;  /* counter to avoid infinite loops */
+  const TValue *tm;  /* metamethod */
+  for (loop = 0; loop < MAXTAGLOOP; loop++) {
+    if (slot == NULL) {  /* 't' is not a table? */
+      lua_assert(!ttistable(t));
+      tm = luaT_gettmbyobj(L, t, TM_INDEX);
+      if (ttisnil(tm))
+        luaG_typeerror(L, t, "index");  /* no metamethod */
+      /* else will try the metamethod */
+    }
+    else {  /* 't' is a table */
+      lua_assert(ttisnil(slot));
+      tm = fasttm(L, hvalue(t)->metatable, TM_INDEX);  /* table's metamethod */
+      if (tm == NULL) {  /* no metamethod? */
+        setnilvalue(val);  /* result is nil */
+        return;
+      }
+      /* else will try the metamethod */
+    }
+    if (ttisfunction(tm)) {  /* is metamethod a function? */
+      luaT_callTM(L, tm, t, key, val, 1);  /* call it */
+      return;
+    }
+    t = tm;  /* else try to access 'tm[key]' */
+    if (luaV_fastget(L,t,key,slot,luaH_get)) {  /* fast track? */
+      setobj2s(L, val, slot);  /* done */
+      return;
+    }
+    /* else repeat (tail call 'luaV_finishget') */
+  }
+  luaG_runerror(L, "'__index' chain too long; possible loop");
+}
+
+
+/*
+** Finish a table assignment 't[key] = val'.
+** If 'slot' is NULL, 't' is not a table.  Otherwise, 'slot' points
+** to the entry 't[key]', or to 'luaO_nilobject' if there is no such
+** entry.  (The value at 'slot' must be nil, otherwise 'luaV_fastset'
+** would have done the job.)
+*/
+void luaV_finishset (lua_State *L, const TValue *t, TValue *key,
+                     StkId val, const TValue *slot) {
+  int loop;  /* counter to avoid infinite loops */
+  for (loop = 0; loop < MAXTAGLOOP; loop++) {
+    const TValue *tm;  /* '__newindex' metamethod */
+    if (slot != NULL) {  /* is 't' a table? */
+      Table *h = hvalue(t);  /* save 't' table */
+      lua_assert(ttisnil(slot));  /* old value must be nil */
+      tm = fasttm(L, h->metatable, TM_NEWINDEX);  /* get metamethod */
+      if (tm == NULL) {  /* no metamethod? */
+        if (slot == luaO_nilobject)  /* no previous entry? */
+          slot = luaH_newkey(L, h, key);  /* create one */
+        /* no metamethod and (now) there is an entry with given key */
+        setobj2t(L, cast(TValue *, slot), val);  /* set its new value */
+        invalidateTMcache(h);
+        luaC_barrierback(L, h, val);
+        return;
+      }
+      /* else will try the metamethod */
+    }
+    else {  /* not a table; check metamethod */
+      if (ttisnil(tm = luaT_gettmbyobj(L, t, TM_NEWINDEX)))
+        luaG_typeerror(L, t, "index");
+    }
+    /* try the metamethod */
+    if (ttisfunction(tm)) {
+      luaT_callTM(L, tm, t, key, val, 0);
+      return;
+    }
+    t = tm;  /* else repeat assignment over 'tm' */
+    if (luaV_fastset(L, t, key, slot, luaH_get, val))
+      return;  /* done */
+    /* else loop */
+  }
+  luaG_runerror(L, "'__newindex' chain too long; possible loop");
+}
+
+
+/*
+** Compare two strings 'ls' x 'rs', returning an integer smaller-equal-
+** -larger than zero if 'ls' is smaller-equal-larger than 'rs'.
+** The code is a little tricky because it allows '\0' in the strings
+** and it uses 'strcoll' (to respect locales) for each segments
+** of the strings.
+*/
+static int l_strcmp (const TString *ls, const TString *rs) {
+  const char *l = getstr(ls);
+  size_t ll = tsslen(ls);
+  const char *r = getstr(rs);
+  size_t lr = tsslen(rs);
+  for (;;) {  /* for each segment */
+    int temp = strcoll(l, r);
+    if (temp != 0)  /* not equal? */
+      return temp;  /* done */
+    else {  /* strings are equal up to a '\0' */
+      size_t len = strlen(l);  /* index of first '\0' in both strings */
+      if (len == lr)  /* 'rs' is finished? */
+        return (len == ll) ? 0 : 1;  /* check 'ls' */
+      else if (len == ll)  /* 'ls' is finished? */
+        return -1;  /* 'ls' is smaller than 'rs' ('rs' is not finished) */
+      /* both strings longer than 'len'; go on comparing after the '\0' */
+      len++;
+      l += len; ll -= len; r += len; lr -= len;
+    }
+  }
+}
+
+
+/*
+** Check whether integer 'i' is less than float 'f'. If 'i' has an
+** exact representation as a float ('l_intfitsf'), compare numbers as
+** floats. Otherwise, if 'f' is outside the range for integers, result
+** is trivial. Otherwise, compare them as integers. (When 'i' has no
+** float representation, either 'f' is "far away" from 'i' or 'f' has
+** no precision left for a fractional part; either way, how 'f' is
+** truncated is irrelevant.) When 'f' is NaN, comparisons must result
+** in false.
+*/
+static int LTintfloat (lua_Integer i, lua_Number f) {
+#if defined(l_intfitsf)
+  if (!l_intfitsf(i)) {
+    if (f >= -cast_num(LUA_MININTEGER))  /* -minint == maxint + 1 */
+      return 1;  /* f >= maxint + 1 > i */
+    else if (f > cast_num(LUA_MININTEGER))  /* minint < f <= maxint ? */
+      return (i < cast(lua_Integer, f));  /* compare them as integers */
+    else  /* f <= minint <= i (or 'f' is NaN)  -->  not(i < f) */
+      return 0;
+  }
+#endif
+  return luai_numlt(cast_num(i), f);  /* compare them as floats */
+}
+
+
+/*
+** Check whether integer 'i' is less than or equal to float 'f'.
+** See comments on previous function.
+*/
+static int LEintfloat (lua_Integer i, lua_Number f) {
+#if defined(l_intfitsf)
+  if (!l_intfitsf(i)) {
+    if (f >= -cast_num(LUA_MININTEGER))  /* -minint == maxint + 1 */
+      return 1;  /* f >= maxint + 1 > i */
+    else if (f >= cast_num(LUA_MININTEGER))  /* minint <= f <= maxint ? */
+      return (i <= cast(lua_Integer, f));  /* compare them as integers */
+    else  /* f < minint <= i (or 'f' is NaN)  -->  not(i <= f) */
+      return 0;
+  }
+#endif
+  return luai_numle(cast_num(i), f);  /* compare them as floats */
+}
+
+
+/*
+** Return 'l < r', for numbers.
+*/
+static int LTnum (const TValue *l, const TValue *r) {
+  if (ttisinteger(l)) {
+    lua_Integer li = ivalue(l);
+    if (ttisinteger(r))
+      return li < ivalue(r);  /* both are integers */
+    else  /* 'l' is int and 'r' is float */
+      return LTintfloat(li, fltvalue(r));  /* l < r ? */
+  }
+  else {
+    lua_Number lf = fltvalue(l);  /* 'l' must be float */
+    if (ttisfloat(r))
+      return luai_numlt(lf, fltvalue(r));  /* both are float */
+    else if (luai_numisnan(lf))  /* 'r' is int and 'l' is float */
+      return 0;  /* NaN < i is always false */
+    else  /* without NaN, (l < r)  <-->  not(r <= l) */
+      return !LEintfloat(ivalue(r), lf);  /* not (r <= l) ? */
+  }
+}
+
+
+/*
+** Return 'l <= r', for numbers.
+*/
+static int LEnum (const TValue *l, const TValue *r) {
+  if (ttisinteger(l)) {
+    lua_Integer li = ivalue(l);
+    if (ttisinteger(r))
+      return li <= ivalue(r);  /* both are integers */
+    else  /* 'l' is int and 'r' is float */
+      return LEintfloat(li, fltvalue(r));  /* l <= r ? */
+  }
+  else {
+    lua_Number lf = fltvalue(l);  /* 'l' must be float */
+    if (ttisfloat(r))
+      return luai_numle(lf, fltvalue(r));  /* both are float */
+    else if (luai_numisnan(lf))  /* 'r' is int and 'l' is float */
+      return 0;  /*  NaN <= i is always false */
+    else  /* without NaN, (l <= r)  <-->  not(r < l) */
+      return !LTintfloat(ivalue(r), lf);  /* not (r < l) ? */
+  }
+}
+
+
+/*
+** Main operation less than; return 'l < r'.
+*/
+int luaV_lessthan (lua_State *L, const TValue *l, const TValue *r) {
+  int res;
+  if (ttisnumber(l) && ttisnumber(r))  /* both operands are numbers? */
+    return LTnum(l, r);
+  else if (ttisstring(l) && ttisstring(r))  /* both are strings? */
+    return l_strcmp(tsvalue(l), tsvalue(r)) < 0;
+  else if ((res = luaT_callorderTM(L, l, r, TM_LT)) < 0)  /* no metamethod? */
+    luaG_ordererror(L, l, r);  /* error */
+  return res;
+}
+
+
+/*
+** Main operation less than or equal to; return 'l <= r'. If it needs
+** a metamethod and there is no '__le', try '__lt', based on
+** l <= r iff !(r < l) (assuming a total order). If the metamethod
+** yields during this substitution, the continuation has to know
+** about it (to negate the result of r<l); bit CIST_LEQ in the call
+** status keeps that information.
+*/
+int luaV_lessequal (lua_State *L, const TValue *l, const TValue *r) {
+  int res;
+  if (ttisnumber(l) && ttisnumber(r))  /* both operands are numbers? */
+    return LEnum(l, r);
+  else if (ttisstring(l) && ttisstring(r))  /* both are strings? */
+    return l_strcmp(tsvalue(l), tsvalue(r)) <= 0;
+  else if ((res = luaT_callorderTM(L, l, r, TM_LE)) >= 0)  /* try 'le' */
+    return res;
+  else {  /* try 'lt': */
+    L->ci->callstatus |= CIST_LEQ;  /* mark it is doing 'lt' for 'le' */
+    res = luaT_callorderTM(L, r, l, TM_LT);
+    L->ci->callstatus ^= CIST_LEQ;  /* clear mark */
+    if (res < 0)
+      luaG_ordererror(L, l, r);
+    return !res;  /* result is negated */
+  }
+}
+
+
+/*
+** Main operation for equality of Lua values; return 't1 == t2'.
+** L == NULL means raw equality (no metamethods)
+*/
+int luaV_equalobj (lua_State *L, const TValue *t1, const TValue *t2) {
+  const TValue *tm;
+  if (ttype(t1) != ttype(t2)) {  /* not the same variant? */
+    if (ttnov(t1) != ttnov(t2) || ttnov(t1) != LUA_TNUMBER)
+      return 0;  /* only numbers can be equal with different variants */
+    else {  /* two numbers with different variants */
+      lua_Integer i1, i2;  /* compare them as integers */
+      return (tointeger(t1, &i1) && tointeger(t2, &i2) && i1 == i2);
+    }
+  }
+  /* values have same type and same variant */
+  switch (ttype(t1)) {
+    case LUA_TNIL: return 1;
+    case LUA_TNUMINT: return (ivalue(t1) == ivalue(t2));
+    case LUA_TNUMFLT: return luai_numeq(fltvalue(t1), fltvalue(t2));
+    case LUA_TBOOLEAN: return bvalue(t1) == bvalue(t2);  /* true must be 1 !! */
+    case LUA_TLIGHTUSERDATA: return pvalue(t1) == pvalue(t2);
+    case LUA_TLCF: return fvalue(t1) == fvalue(t2);
+    case LUA_TSHRSTR: return eqshrstr(tsvalue(t1), tsvalue(t2));
+    case LUA_TLNGSTR: return luaS_eqlngstr(tsvalue(t1), tsvalue(t2));
+    case LUA_TUSERDATA: {
+      if (uvalue(t1) == uvalue(t2)) return 1;
+      else if (L == NULL) return 0;
+      tm = fasttm(L, uvalue(t1)->metatable, TM_EQ);
+      if (tm == NULL)
+        tm = fasttm(L, uvalue(t2)->metatable, TM_EQ);
+      break;  /* will try TM */
+    }
+    case LUA_TTABLE: {
+      if (hvalue(t1) == hvalue(t2)) return 1;
+      else if (L == NULL) return 0;
+      tm = fasttm(L, hvalue(t1)->metatable, TM_EQ);
+      if (tm == NULL)
+        tm = fasttm(L, hvalue(t2)->metatable, TM_EQ);
+      break;  /* will try TM */
+    }
+    default:
+      return gcvalue(t1) == gcvalue(t2);
+  }
+  if (tm == NULL)  /* no TM? */
+    return 0;  /* objects are different */
+  luaT_callTM(L, tm, t1, t2, L->top, 1);  /* call TM */
+  return !l_isfalse(L->top);
+}
+
+
+/* macro used by 'luaV_concat' to ensure that element at 'o' is a string */
+#define tostring(L,o)  \
+	(ttisstring(o) || (cvt2str(o) && (luaO_tostring(L, o), 1)))
+
+#define isemptystr(o)	(ttisshrstring(o) && tsvalue(o)->shrlen == 0)
+
+/* copy strings in stack from top - n up to top - 1 to buffer */
+static void copy2buff (StkId top, int n, char *buff) {
+  size_t tl = 0;  /* size already copied */
+  do {
+    size_t l = vslen(top - n);  /* length of string being copied */
+    memcpy(buff + tl, svalue(top - n), l * sizeof(char));
+    tl += l;
+  } while (--n > 0);
+}
+
+
+/*
+** Main operation for concatenation: concat 'total' values in the stack,
+** from 'L->top - total' up to 'L->top - 1'.
+*/
+void luaV_concat (lua_State *L, int total) {
+  lua_assert(total >= 2);
+  do {
+    StkId top = L->top;
+    int n = 2;  /* number of elements handled in this pass (at least 2) */
+    if (!(ttisstring(top-2) || cvt2str(top-2)) || !tostring(L, top-1))
+      luaT_trybinTM(L, top-2, top-1, top-2, TM_CONCAT);
+    else if (isemptystr(top - 1))  /* second operand is empty? */
+      cast_void(tostring(L, top - 2));  /* result is first operand */
+    else if (isemptystr(top - 2)) {  /* first operand is an empty string? */
+      setobjs2s(L, top - 2, top - 1);  /* result is second op. */
+    }
+    else {
+      /* at least two non-empty string values; get as many as possible */
+      size_t tl = vslen(top - 1);
+      TString *ts;
+      /* collect total length and number of strings */
+      for (n = 1; n < total && tostring(L, top - n - 1); n++) {
+        size_t l = vslen(top - n - 1);
+        if (l >= (MAX_SIZE/sizeof(char)) - tl)
+          luaG_runerror(L, "string length overflow");
+        tl += l;
+      }
+      if (tl <= LUAI_MAXSHORTLEN) {  /* is result a short string? */
+        char buff[LUAI_MAXSHORTLEN];
+        copy2buff(top, n, buff);  /* copy strings to buffer */
+        ts = luaS_newlstr(L, buff, tl);
+      }
+      else {  /* long string; copy strings directly to final result */
+        ts = luaS_createlngstrobj(L, tl);
+        copy2buff(top, n, getstr(ts));
+      }
+      setsvalue2s(L, top - n, ts);  /* create result */
+    }
+    total -= n-1;  /* got 'n' strings to create 1 new */
+    L->top -= n-1;  /* popped 'n' strings and pushed one */
+  } while (total > 1);  /* repeat until only 1 result left */
+}
+
+
+/*
+** Main operation 'ra' = #rb'.
+*/
+void luaV_objlen (lua_State *L, StkId ra, const TValue *rb) {
+  const TValue *tm;
+  switch (ttype(rb)) {
+    case LUA_TTABLE: {
+      Table *h = hvalue(rb);
+      tm = fasttm(L, h->metatable, TM_LEN);
+      if (tm) break;  /* metamethod? break switch to call it */
+      setivalue(ra, luaH_getn(h));  /* else primitive len */
+      return;
+    }
+    case LUA_TSHRSTR: {
+      setivalue(ra, tsvalue(rb)->shrlen);
+      return;
+    }
+    case LUA_TLNGSTR: {
+      setivalue(ra, tsvalue(rb)->u.lnglen);
+      return;
+    }
+    default: {  /* try metamethod */
+      tm = luaT_gettmbyobj(L, rb, TM_LEN);
+      if (ttisnil(tm))  /* no metamethod? */
+        luaG_typeerror(L, rb, "get length of");
+      break;
+    }
+  }
+  luaT_callTM(L, tm, rb, rb, ra, 1);
+}
+
+
+/*
+** Integer division; return 'm // n', that is, floor(m/n).
+** C division truncates its result (rounds towards zero).
+** 'floor(q) == trunc(q)' when 'q >= 0' or when 'q' is integer,
+** otherwise 'floor(q) == trunc(q) - 1'.
+*/
+lua_Integer luaV_div (lua_State *L, lua_Integer m, lua_Integer n) {
+  if (l_castS2U(n) + 1u <= 1u) {  /* special cases: -1 or 0 */
+    if (n == 0)
+      luaG_runerror(L, "attempt to divide by zero");
+    return intop(-, 0, m);   /* n==-1; avoid overflow with 0x80000...//-1 */
+  }
+  else {
+    lua_Integer q = m / n;  /* perform C division */
+    if ((m ^ n) < 0 && m % n != 0)  /* 'm/n' would be negative non-integer? */
+      q -= 1;  /* correct result for different rounding */
+    return q;
+  }
+}
+
+
+/*
+** Integer modulus; return 'm % n'. (Assume that C '%' with
+** negative operands follows C99 behavior. See previous comment
+** about luaV_div.)
+*/
+lua_Integer luaV_mod (lua_State *L, lua_Integer m, lua_Integer n) {
+  if (l_castS2U(n) + 1u <= 1u) {  /* special cases: -1 or 0 */
+    if (n == 0)
+      luaG_runerror(L, "attempt to perform 'n%%0'");
+    return 0;   /* m % -1 == 0; avoid overflow with 0x80000...%-1 */
+  }
+  else {
+    lua_Integer r = m % n;
+    if (r != 0 && (m ^ n) < 0)  /* 'm/n' would be non-integer negative? */
+      r += n;  /* correct result for different rounding */
+    return r;
+  }
+}
+
+
+/* number of bits in an integer */
+#define NBITS	cast_int(sizeof(lua_Integer) * CHAR_BIT)
+
+/*
+** Shift left operation. (Shift right just negates 'y'.)
+*/
+lua_Integer luaV_shiftl (lua_Integer x, lua_Integer y) {
+  if (y < 0) {  /* shift right? */
+    if (y <= -NBITS) return 0;
+    else return intop(>>, x, -y);
+  }
+  else {  /* shift left */
+    if (y >= NBITS) return 0;
+    else return intop(<<, x, y);
+  }
+}
+
+
+/*
+** check whether cached closure in prototype 'p' may be reused, that is,
+** whether there is a cached closure with the same upvalues needed by
+** new closure to be created.
+*/
+static LClosure *getcached (Proto *p, UpVal **encup, StkId base) {
+  LClosure *c = p->cache;
+  if (c != NULL) {  /* is there a cached closure? */
+    int nup = p->sizeupvalues;
+    Upvaldesc *uv = p->upvalues;
+    int i;
+    for (i = 0; i < nup; i++) {  /* check whether it has right upvalues */
+      TValue *v = uv[i].instack ? base + uv[i].idx : encup[uv[i].idx]->v;
+      if (c->upvals[i]->v != v)
+        return NULL;  /* wrong upvalue; cannot reuse closure */
+    }
+  }
+  return c;  /* return cached closure (or NULL if no cached closure) */
+}
+
+
+/*
+** create a new Lua closure, push it in the stack, and initialize
+** its upvalues. Note that the closure is not cached if prototype is
+** already black (which means that 'cache' was already cleared by the
+** GC).
+*/
+static void pushclosure (lua_State *L, Proto *p, UpVal **encup, StkId base,
+                         StkId ra) {
+  int nup = p->sizeupvalues;
+  Upvaldesc *uv = p->upvalues;
+  int i;
+  LClosure *ncl = luaF_newLclosure(L, nup);
+  ncl->p = p;
+  setclLvalue(L, ra, ncl);  /* anchor new closure in stack */
+  for (i = 0; i < nup; i++) {  /* fill in its upvalues */
+    if (uv[i].instack)  /* upvalue refers to local variable? */
+      ncl->upvals[i] = luaF_findupval(L, base + uv[i].idx);
+    else  /* get upvalue from enclosing function */
+      ncl->upvals[i] = encup[uv[i].idx];
+    ncl->upvals[i]->refcount++;
+    /* new closure is white, so we do not need a barrier here */
+  }
+  if (!isblack(p))  /* cache will not break GC invariant? */
+    p->cache = ncl;  /* save it on cache for reuse */
+}
+
+
+/*
+** finish execution of an opcode interrupted by an yield
+*/
+void luaV_finishOp (lua_State *L) {
+  CallInfo *ci = L->ci;
+  StkId base = ci->u.l.base;
+  Instruction inst = *(ci->u.l.savedpc - 1);  /* interrupted instruction */
+  OpCode op = GET_OPCODE(inst);
+  switch (op) {  /* finish its execution */
+    case OP_ADD: case OP_SUB: case OP_MUL: case OP_DIV: case OP_IDIV:
+    case OP_BAND: case OP_BOR: case OP_BXOR: case OP_SHL: case OP_SHR:
+    case OP_MOD: case OP_POW:
+    case OP_UNM: case OP_BNOT: case OP_LEN:
+    case OP_GETTABUP: case OP_GETTABLE: case OP_SELF: {
+      setobjs2s(L, base + GETARG_A(inst), --L->top);
+      break;
+    }
+    case OP_LE: case OP_LT: case OP_EQ: {
+      int res = !l_isfalse(L->top - 1);
+      L->top--;
+      if (ci->callstatus & CIST_LEQ) {  /* "<=" using "<" instead? */
+        lua_assert(op == OP_LE);
+        ci->callstatus ^= CIST_LEQ;  /* clear mark */
+        res = !res;  /* negate result */
+      }
+      lua_assert(GET_OPCODE(*ci->u.l.savedpc) == OP_JMP);
+      if (res != GETARG_A(inst))  /* condition failed? */
+        ci->u.l.savedpc++;  /* skip jump instruction */
+      break;
+    }
+    case OP_CONCAT: {
+      StkId top = L->top - 1;  /* top when 'luaT_trybinTM' was called */
+      int b = GETARG_B(inst);      /* first element to concatenate */
+      int total = cast_int(top - 1 - (base + b));  /* yet to concatenate */
+      setobj2s(L, top - 2, top);  /* put TM result in proper position */
+      if (total > 1) {  /* are there elements to concat? */
+        L->top = top - 1;  /* top is one after last element (at top-2) */
+        luaV_concat(L, total);  /* concat them (may yield again) */
+      }
+      /* move final result to final position */
+      setobj2s(L, ci->u.l.base + GETARG_A(inst), L->top - 1);
+      L->top = ci->top;  /* restore top */
+      break;
+    }
+    case OP_TFORCALL: {
+      lua_assert(GET_OPCODE(*ci->u.l.savedpc) == OP_TFORLOOP);
+      L->top = ci->top;  /* correct top */
+      break;
+    }
+    case OP_CALL: {
+      if (GETARG_C(inst) - 1 >= 0)  /* nresults >= 0? */
+        L->top = ci->top;  /* adjust results */
+      break;
+    }
+    case OP_TAILCALL: case OP_SETTABUP: case OP_SETTABLE:
+      break;
+    default: lua_assert(0);
+  }
+}
+
+
+
+
+/*
+** {==================================================================
+** Function 'luaV_execute': main interpreter loop
+** ===================================================================
+*/
+
+
+/*
+** some macros for common tasks in 'luaV_execute'
+*/
+
+
+#define RA(i)	(base+GETARG_A(i))
+#define RB(i)	check_exp(getBMode(GET_OPCODE(i)) == OpArgR, base+GETARG_B(i))
+#define RC(i)	check_exp(getCMode(GET_OPCODE(i)) == OpArgR, base+GETARG_C(i))
+#define RKB(i)	check_exp(getBMode(GET_OPCODE(i)) == OpArgK, \
+	ISK(GETARG_B(i)) ? k+INDEXK(GETARG_B(i)) : base+GETARG_B(i))
+#define RKC(i)	check_exp(getCMode(GET_OPCODE(i)) == OpArgK, \
+	ISK(GETARG_C(i)) ? k+INDEXK(GETARG_C(i)) : base+GETARG_C(i))
+
+
+/* execute a jump instruction */
+#define dojump(ci,i,e) \
+  { int a = GETARG_A(i); \
+    if (a != 0) luaF_close(L, ci->u.l.base + a - 1); \
+    ci->u.l.savedpc += GETARG_sBx(i) + e; }
+
+/* for test instructions, execute the jump instruction that follows it */
+#define donextjump(ci)	{ i = *ci->u.l.savedpc; dojump(ci, i, 1); }
+
+
+#define Protect(x)	{ {x;}; base = ci->u.l.base; }
+
+#define checkGC(L,c)  \
+	{ luaC_condGC(L, L->top = (c),  /* limit of live values */ \
+                         Protect(L->top = ci->top));  /* restore top */ \
+           luai_threadyield(L); }
+
+
+/* fetch an instruction and prepare its execution */
+#define vmfetch()	{ \
+  i = *(ci->u.l.savedpc++); \
+  if (L->hookmask & (LUA_MASKLINE | LUA_MASKCOUNT)) \
+    Protect(luaG_traceexec(L)); \
+  ra = RA(i); /* WARNING: any stack reallocation invalidates 'ra' */ \
+  lua_assert(base == ci->u.l.base); \
+  lua_assert(base <= L->top && L->top < L->stack + L->stacksize); \
+}
+
+#define vmdispatch(o)	switch(o)
+#define vmcase(l)	case l:
+#define vmbreak		break
+
+
+/*
+** copy of 'luaV_gettable', but protecting the call to potential
+** metamethod (which can reallocate the stack)
+*/
+#define gettableProtected(L,t,k,v)  { const TValue *slot; \
+  if (luaV_fastget(L,t,k,slot,luaH_get)) { setobj2s(L, v, slot); } \
+  else Protect(luaV_finishget(L,t,k,v,slot)); }
+
+
+/* same for 'luaV_settable' */
+#define settableProtected(L,t,k,v) { const TValue *slot; \
+  if (!luaV_fastset(L,t,k,slot,luaH_get,v)) \
+    Protect(luaV_finishset(L,t,k,v,slot)); }
+
+
+
+void luaV_execute (lua_State *L) {
+  CallInfo *ci = L->ci;
+  LClosure *cl;
+  TValue *k;
+  StkId base;
+  ci->callstatus |= CIST_FRESH;  /* fresh invocation of 'luaV_execute" */
+ newframe:  /* reentry point when frame changes (call/return) */
+  lua_assert(ci == L->ci);
+  cl = clLvalue(ci->func);  /* local reference to function's closure */
+  k = cl->p->k;  /* local reference to function's constant table */
+  base = ci->u.l.base;  /* local copy of function's base */
+  /* main loop of interpreter */
+  for (;;) {
+    Instruction i;
+    StkId ra;
+    vmfetch();
+    vmdispatch (GET_OPCODE(i)) {
+      vmcase(OP_MOVE) {
+        setobjs2s(L, ra, RB(i));
+        vmbreak;
+      }
+      vmcase(OP_LOADK) {
+        TValue *rb = k + GETARG_Bx(i);
+        setobj2s(L, ra, rb);
+        vmbreak;
+      }
+      vmcase(OP_LOADKX) {
+        TValue *rb;
+        lua_assert(GET_OPCODE(*ci->u.l.savedpc) == OP_EXTRAARG);
+        rb = k + GETARG_Ax(*ci->u.l.savedpc++);
+        setobj2s(L, ra, rb);
+        vmbreak;
+      }
+      vmcase(OP_LOADBOOL) {
+        setbvalue(ra, GETARG_B(i));
+        if (GETARG_C(i)) ci->u.l.savedpc++;  /* skip next instruction (if C) */
+        vmbreak;
+      }
+      vmcase(OP_LOADNIL) {
+        int b = GETARG_B(i);
+        do {
+          setnilvalue(ra++);
+        } while (b--);
+        vmbreak;
+      }
+      vmcase(OP_GETUPVAL) {
+        int b = GETARG_B(i);
+        setobj2s(L, ra, cl->upvals[b]->v);
+        vmbreak;
+      }
+      vmcase(OP_GETTABUP) {
+        TValue *upval = cl->upvals[GETARG_B(i)]->v;
+        TValue *rc = RKC(i);
+        gettableProtected(L, upval, rc, ra);
+        vmbreak;
+      }
+      vmcase(OP_GETTABLE) {
+        StkId rb = RB(i);
+        TValue *rc = RKC(i);
+        gettableProtected(L, rb, rc, ra);
+        vmbreak;
+      }
+      vmcase(OP_SETTABUP) {
+        TValue *upval = cl->upvals[GETARG_A(i)]->v;
+        TValue *rb = RKB(i);
+        TValue *rc = RKC(i);
+        settableProtected(L, upval, rb, rc);
+        vmbreak;
+      }
+      vmcase(OP_SETUPVAL) {
+        UpVal *uv = cl->upvals[GETARG_B(i)];
+        setobj(L, uv->v, ra);
+        luaC_upvalbarrier(L, uv);
+        vmbreak;
+      }
+      vmcase(OP_SETTABLE) {
+        TValue *rb = RKB(i);
+        TValue *rc = RKC(i);
+        settableProtected(L, ra, rb, rc);
+        vmbreak;
+      }
+      vmcase(OP_NEWTABLE) {
+        int b = GETARG_B(i);
+        int c = GETARG_C(i);
+        Table *t = luaH_new(L);
+        sethvalue(L, ra, t);
+        if (b != 0 || c != 0)
+          luaH_resize(L, t, luaO_fb2int(b), luaO_fb2int(c));
+        checkGC(L, ra + 1);
+        vmbreak;
+      }
+      vmcase(OP_SELF) {
+        const TValue *aux;
+        StkId rb = RB(i);
+        TValue *rc = RKC(i);
+        TString *key = tsvalue(rc);  /* key must be a string */
+        setobjs2s(L, ra + 1, rb);
+        if (luaV_fastget(L, rb, key, aux, luaH_getstr)) {
+          setobj2s(L, ra, aux);
+        }
+        else Protect(luaV_finishget(L, rb, rc, ra, aux));
+        vmbreak;
+      }
+      vmcase(OP_ADD) {
+        TValue *rb = RKB(i);
+        TValue *rc = RKC(i);
+        lua_Number nb; lua_Number nc;
+        if (ttisinteger(rb) && ttisinteger(rc)) {
+          lua_Integer ib = ivalue(rb); lua_Integer ic = ivalue(rc);
+          setivalue(ra, intop(+, ib, ic));
+        }
+        else if (tonumber(rb, &nb) && tonumber(rc, &nc)) {
+          setfltvalue(ra, luai_numadd(L, nb, nc));
+        }
+        else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_ADD)); }
+        vmbreak;
+      }
+      vmcase(OP_SUB) {
+        TValue *rb = RKB(i);
+        TValue *rc = RKC(i);
+        lua_Number nb; lua_Number nc;
+        if (ttisinteger(rb) && ttisinteger(rc)) {
+          lua_Integer ib = ivalue(rb); lua_Integer ic = ivalue(rc);
+          setivalue(ra, intop(-, ib, ic));
+        }
+        else if (tonumber(rb, &nb) && tonumber(rc, &nc)) {
+          setfltvalue(ra, luai_numsub(L, nb, nc));
+        }
+        else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_SUB)); }
+        vmbreak;
+      }
+      vmcase(OP_MUL) {
+        TValue *rb = RKB(i);
+        TValue *rc = RKC(i);
+        lua_Number nb; lua_Number nc;
+        if (ttisinteger(rb) && ttisinteger(rc)) {
+          lua_Integer ib = ivalue(rb); lua_Integer ic = ivalue(rc);
+          setivalue(ra, intop(*, ib, ic));
+        }
+        else if (tonumber(rb, &nb) && tonumber(rc, &nc)) {
+          setfltvalue(ra, luai_nummul(L, nb, nc));
+        }
+        else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_MUL)); }
+        vmbreak;
+      }
+      vmcase(OP_DIV) {  /* float division (always with floats) */
+        TValue *rb = RKB(i);
+        TValue *rc = RKC(i);
+        lua_Number nb; lua_Number nc;
+        if (tonumber(rb, &nb) && tonumber(rc, &nc)) {
+          setfltvalue(ra, luai_numdiv(L, nb, nc));
+        }
+        else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_DIV)); }
+        vmbreak;
+      }
+      vmcase(OP_BAND) {
+        TValue *rb = RKB(i);
+        TValue *rc = RKC(i);
+        lua_Integer ib; lua_Integer ic;
+        if (tointeger(rb, &ib) && tointeger(rc, &ic)) {
+          setivalue(ra, intop(&, ib, ic));
+        }
+        else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_BAND)); }
+        vmbreak;
+      }
+      vmcase(OP_BOR) {
+        TValue *rb = RKB(i);
+        TValue *rc = RKC(i);
+        lua_Integer ib; lua_Integer ic;
+        if (tointeger(rb, &ib) && tointeger(rc, &ic)) {
+          setivalue(ra, intop(|, ib, ic));
+        }
+        else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_BOR)); }
+        vmbreak;
+      }
+      vmcase(OP_BXOR) {
+        TValue *rb = RKB(i);
+        TValue *rc = RKC(i);
+        lua_Integer ib; lua_Integer ic;
+        if (tointeger(rb, &ib) && tointeger(rc, &ic)) {
+          setivalue(ra, intop(^, ib, ic));
+        }
+        else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_BXOR)); }
+        vmbreak;
+      }
+      vmcase(OP_SHL) {
+        TValue *rb = RKB(i);
+        TValue *rc = RKC(i);
+        lua_Integer ib; lua_Integer ic;
+        if (tointeger(rb, &ib) && tointeger(rc, &ic)) {
+          setivalue(ra, luaV_shiftl(ib, ic));
+        }
+        else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_SHL)); }
+        vmbreak;
+      }
+      vmcase(OP_SHR) {
+        TValue *rb = RKB(i);
+        TValue *rc = RKC(i);
+        lua_Integer ib; lua_Integer ic;
+        if (tointeger(rb, &ib) && tointeger(rc, &ic)) {
+          setivalue(ra, luaV_shiftl(ib, -ic));
+        }
+        else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_SHR)); }
+        vmbreak;
+      }
+      vmcase(OP_MOD) {
+        TValue *rb = RKB(i);
+        TValue *rc = RKC(i);
+        lua_Number nb; lua_Number nc;
+        if (ttisinteger(rb) && ttisinteger(rc)) {
+          lua_Integer ib = ivalue(rb); lua_Integer ic = ivalue(rc);
+          setivalue(ra, luaV_mod(L, ib, ic));
+        }
+        else if (tonumber(rb, &nb) && tonumber(rc, &nc)) {
+          lua_Number m;
+          luai_nummod(L, nb, nc, m);
+          setfltvalue(ra, m);
+        }
+        else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_MOD)); }
+        vmbreak;
+      }
+      vmcase(OP_IDIV) {  /* floor division */
+        TValue *rb = RKB(i);
+        TValue *rc = RKC(i);
+        lua_Number nb; lua_Number nc;
+        if (ttisinteger(rb) && ttisinteger(rc)) {
+          lua_Integer ib = ivalue(rb); lua_Integer ic = ivalue(rc);
+          setivalue(ra, luaV_div(L, ib, ic));
+        }
+        else if (tonumber(rb, &nb) && tonumber(rc, &nc)) {
+          setfltvalue(ra, luai_numidiv(L, nb, nc));
+        }
+        else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_IDIV)); }
+        vmbreak;
+      }
+      vmcase(OP_POW) {
+        TValue *rb = RKB(i);
+        TValue *rc = RKC(i);
+        lua_Number nb; lua_Number nc;
+        if (tonumber(rb, &nb) && tonumber(rc, &nc)) {
+          setfltvalue(ra, luai_numpow(L, nb, nc));
+        }
+        else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_POW)); }
+        vmbreak;
+      }
+      vmcase(OP_UNM) {
+        TValue *rb = RB(i);
+        lua_Number nb;
+        if (ttisinteger(rb)) {
+          lua_Integer ib = ivalue(rb);
+          setivalue(ra, intop(-, 0, ib));
+        }
+        else if (tonumber(rb, &nb)) {
+          setfltvalue(ra, luai_numunm(L, nb));
+        }
+        else {
+          Protect(luaT_trybinTM(L, rb, rb, ra, TM_UNM));
+        }
+        vmbreak;
+      }
+      vmcase(OP_BNOT) {
+        TValue *rb = RB(i);
+        lua_Integer ib;
+        if (tointeger(rb, &ib)) {
+          setivalue(ra, intop(^, ~l_castS2U(0), ib));
+        }
+        else {
+          Protect(luaT_trybinTM(L, rb, rb, ra, TM_BNOT));
+        }
+        vmbreak;
+      }
+      vmcase(OP_NOT) {
+        TValue *rb = RB(i);
+        int res = l_isfalse(rb);  /* next assignment may change this value */
+        setbvalue(ra, res);
+        vmbreak;
+      }
+      vmcase(OP_LEN) {
+        Protect(luaV_objlen(L, ra, RB(i)));
+        vmbreak;
+      }
+      vmcase(OP_CONCAT) {
+        int b = GETARG_B(i);
+        int c = GETARG_C(i);
+        StkId rb;
+        L->top = base + c + 1;  /* mark the end of concat operands */
+        Protect(luaV_concat(L, c - b + 1));
+        ra = RA(i);  /* 'luaV_concat' may invoke TMs and move the stack */
+        rb = base + b;
+        setobjs2s(L, ra, rb);
+        checkGC(L, (ra >= rb ? ra + 1 : rb));
+        L->top = ci->top;  /* restore top */
+        vmbreak;
+      }
+      vmcase(OP_JMP) {
+        dojump(ci, i, 0);
+        vmbreak;
+      }
+      vmcase(OP_EQ) {
+        TValue *rb = RKB(i);
+        TValue *rc = RKC(i);
+        Protect(
+          if (luaV_equalobj(L, rb, rc) != GETARG_A(i))
+            ci->u.l.savedpc++;
+          else
+            donextjump(ci);
+        )
+        vmbreak;
+      }
+      vmcase(OP_LT) {
+        Protect(
+          if (luaV_lessthan(L, RKB(i), RKC(i)) != GETARG_A(i))
+            ci->u.l.savedpc++;
+          else
+            donextjump(ci);
+        )
+        vmbreak;
+      }
+      vmcase(OP_LE) {
+        Protect(
+          if (luaV_lessequal(L, RKB(i), RKC(i)) != GETARG_A(i))
+            ci->u.l.savedpc++;
+          else
+            donextjump(ci);
+        )
+        vmbreak;
+      }
+      vmcase(OP_TEST) {
+        if (GETARG_C(i) ? l_isfalse(ra) : !l_isfalse(ra))
+            ci->u.l.savedpc++;
+          else
+          donextjump(ci);
+        vmbreak;
+      }
+      vmcase(OP_TESTSET) {
+        TValue *rb = RB(i);
+        if (GETARG_C(i) ? l_isfalse(rb) : !l_isfalse(rb))
+          ci->u.l.savedpc++;
+        else {
+          setobjs2s(L, ra, rb);
+          donextjump(ci);
+        }
+        vmbreak;
+      }
+      vmcase(OP_CALL) {
+        int b = GETARG_B(i);
+        int nresults = GETARG_C(i) - 1;
+        if (b != 0) L->top = ra+b;  /* else previous instruction set top */
+        if (luaD_precall(L, ra, nresults)) {  /* C function? */
+          if (nresults >= 0)
+            L->top = ci->top;  /* adjust results */
+          Protect((void)0);  /* update 'base' */
+        }
+        else {  /* Lua function */
+          ci = L->ci;
+          goto newframe;  /* restart luaV_execute over new Lua function */
+        }
+        vmbreak;
+      }
+      vmcase(OP_TAILCALL) {
+        int b = GETARG_B(i);
+        if (b != 0) L->top = ra+b;  /* else previous instruction set top */
+        lua_assert(GETARG_C(i) - 1 == LUA_MULTRET);
+        if (luaD_precall(L, ra, LUA_MULTRET)) {  /* C function? */
+          Protect((void)0);  /* update 'base' */
+        }
+        else {
+          /* tail call: put called frame (n) in place of caller one (o) */
+          CallInfo *nci = L->ci;  /* called frame */
+          CallInfo *oci = nci->previous;  /* caller frame */
+          StkId nfunc = nci->func;  /* called function */
+          StkId ofunc = oci->func;  /* caller function */
+          /* last stack slot filled by 'precall' */
+          StkId lim = nci->u.l.base + getproto(nfunc)->numparams;
+          int aux;
+          /* close all upvalues from previous call */
+          if (cl->p->sizep > 0) luaF_close(L, oci->u.l.base);
+          /* move new frame into old one */
+          for (aux = 0; nfunc + aux < lim; aux++)
+            setobjs2s(L, ofunc + aux, nfunc + aux);
+          oci->u.l.base = ofunc + (nci->u.l.base - nfunc);  /* correct base */
+          oci->top = L->top = ofunc + (L->top - nfunc);  /* correct top */
+          oci->u.l.savedpc = nci->u.l.savedpc;
+          oci->callstatus |= CIST_TAIL;  /* function was tail called */
+          ci = L->ci = oci;  /* remove new frame */
+          lua_assert(L->top == oci->u.l.base + getproto(ofunc)->maxstacksize);
+          goto newframe;  /* restart luaV_execute over new Lua function */
+        }
+        vmbreak;
+      }
+      vmcase(OP_RETURN) {
+        int b = GETARG_B(i);
+        if (cl->p->sizep > 0) luaF_close(L, base);
+        b = luaD_poscall(L, ci, ra, (b != 0 ? b - 1 : cast_int(L->top - ra)));
+        if (ci->callstatus & CIST_FRESH)  /* local 'ci' still from callee */
+          return;  /* external invocation: return */
+        else {  /* invocation via reentry: continue execution */
+          ci = L->ci;
+          if (b) L->top = ci->top;
+          lua_assert(isLua(ci));
+          lua_assert(GET_OPCODE(*((ci)->u.l.savedpc - 1)) == OP_CALL);
+          goto newframe;  /* restart luaV_execute over new Lua function */
+        }
+      }
+      vmcase(OP_FORLOOP) {
+        if (ttisinteger(ra)) {  /* integer loop? */
+          lua_Integer step = ivalue(ra + 2);
+          lua_Integer idx = intop(+, ivalue(ra), step); /* increment index */
+          lua_Integer limit = ivalue(ra + 1);
+          if ((0 < step) ? (idx <= limit) : (limit <= idx)) {
+            ci->u.l.savedpc += GETARG_sBx(i);  /* jump back */
+            chgivalue(ra, idx);  /* update internal index... */
+            setivalue(ra + 3, idx);  /* ...and external index */
+          }
+        }
+        else {  /* floating loop */
+          lua_Number step = fltvalue(ra + 2);
+          lua_Number idx = luai_numadd(L, fltvalue(ra), step); /* inc. index */
+          lua_Number limit = fltvalue(ra + 1);
+          if (luai_numlt(0, step) ? luai_numle(idx, limit)
+                                  : luai_numle(limit, idx)) {
+            ci->u.l.savedpc += GETARG_sBx(i);  /* jump back */
+            chgfltvalue(ra, idx);  /* update internal index... */
+            setfltvalue(ra + 3, idx);  /* ...and external index */
+          }
+        }
+        vmbreak;
+      }
+      vmcase(OP_FORPREP) {
+        TValue *init = ra;
+        TValue *plimit = ra + 1;
+        TValue *pstep = ra + 2;
+        lua_Integer ilimit;
+        int stopnow;
+        if (ttisinteger(init) && ttisinteger(pstep) &&
+            forlimit(plimit, &ilimit, ivalue(pstep), &stopnow)) {
+          /* all values are integer */
+          lua_Integer initv = (stopnow ? 0 : ivalue(init));
+          setivalue(plimit, ilimit);
+          setivalue(init, intop(-, initv, ivalue(pstep)));
+        }
+        else {  /* try making all values floats */
+          lua_Number ninit; lua_Number nlimit; lua_Number nstep;
+          if (!tonumber(plimit, &nlimit))
+            luaG_runerror(L, "'for' limit must be a number");
+          setfltvalue(plimit, nlimit);
+          if (!tonumber(pstep, &nstep))
+            luaG_runerror(L, "'for' step must be a number");
+          setfltvalue(pstep, nstep);
+          if (!tonumber(init, &ninit))
+            luaG_runerror(L, "'for' initial value must be a number");
+          setfltvalue(init, luai_numsub(L, ninit, nstep));
+        }
+        ci->u.l.savedpc += GETARG_sBx(i);
+        vmbreak;
+      }
+      vmcase(OP_TFORCALL) {
+        StkId cb = ra + 3;  /* call base */
+        setobjs2s(L, cb+2, ra+2);
+        setobjs2s(L, cb+1, ra+1);
+        setobjs2s(L, cb, ra);
+        L->top = cb + 3;  /* func. + 2 args (state and index) */
+        Protect(luaD_call(L, cb, GETARG_C(i)));
+        L->top = ci->top;
+        i = *(ci->u.l.savedpc++);  /* go to next instruction */
+        ra = RA(i);
+        lua_assert(GET_OPCODE(i) == OP_TFORLOOP);
+        goto l_tforloop;
+      }
+      vmcase(OP_TFORLOOP) {
+        l_tforloop:
+        if (!ttisnil(ra + 1)) {  /* continue loop? */
+          setobjs2s(L, ra, ra + 1);  /* save control variable */
+           ci->u.l.savedpc += GETARG_sBx(i);  /* jump back */
+        }
+        vmbreak;
+      }
+      vmcase(OP_SETLIST) {
+        int n = GETARG_B(i);
+        int c = GETARG_C(i);
+        unsigned int last;
+        Table *h;
+        if (n == 0) n = cast_int(L->top - ra) - 1;
+        if (c == 0) {
+          lua_assert(GET_OPCODE(*ci->u.l.savedpc) == OP_EXTRAARG);
+          c = GETARG_Ax(*ci->u.l.savedpc++);
+        }
+        h = hvalue(ra);
+        last = ((c-1)*LFIELDS_PER_FLUSH) + n;
+        if (last > h->sizearray)  /* needs more space? */
+          luaH_resizearray(L, h, last);  /* preallocate it at once */
+        for (; n > 0; n--) {
+          TValue *val = ra+n;
+          luaH_setint(L, h, last--, val);
+          luaC_barrierback(L, h, val);
+        }
+        L->top = ci->top;  /* correct top (in case of previous open call) */
+        vmbreak;
+      }
+      vmcase(OP_CLOSURE) {
+        Proto *p = cl->p->p[GETARG_Bx(i)];
+        LClosure *ncl = getcached(p, cl->upvals, base);  /* cached closure */
+        if (ncl == NULL)  /* no match? */
+          pushclosure(L, p, cl->upvals, base, ra);  /* create a new one */
+        else
+          setclLvalue(L, ra, ncl);  /* push cashed closure */
+        checkGC(L, ra + 1);
+        vmbreak;
+      }
+      vmcase(OP_VARARG) {
+        int b = GETARG_B(i) - 1;  /* required results */
+        int j;
+        int n = cast_int(base - ci->func) - cl->p->numparams - 1;
+        if (n < 0)  /* less arguments than parameters? */
+          n = 0;  /* no vararg arguments */
+        if (b < 0) {  /* B == 0? */
+          b = n;  /* get all var. arguments */
+          Protect(luaD_checkstack(L, n));
+          ra = RA(i);  /* previous call may change the stack */
+          L->top = ra + n;
+        }
+        for (j = 0; j < b && j < n; j++)
+          setobjs2s(L, ra + j, base - n + j);
+        for (; j < b; j++)  /* complete required results with nil */
+          setnilvalue(ra + j);
+        vmbreak;
+      }
+      vmcase(OP_EXTRAARG) {
+        lua_assert(0);
+        vmbreak;
+      }
+    }
+  }
+}
+
+/* }================================================================== */
+
diff --git a/libs/lua/lua-5.3.3/lvm.h b/libs/lua/lua-5.3.3/lvm.h
new file mode 100644
index 0000000..bcf52d2
--- /dev/null
+++ b/libs/lua/lua-5.3.3/lvm.h
@@ -0,0 +1,113 @@
+/*
+** $Id: lvm.h,v 2.40 2016/01/05 16:07:21 roberto Exp $
+** Lua virtual machine
+** See Copyright Notice in lua.h
+*/
+
+#ifndef lvm_h
+#define lvm_h
+
+
+#include "ldo.h"
+#include "lobject.h"
+#include "ltm.h"
+
+
+#if !defined(LUA_NOCVTN2S)
+#define cvt2str(o)	ttisnumber(o)
+#else
+#define cvt2str(o)	0	/* no conversion from numbers to strings */
+#endif
+
+
+#if !defined(LUA_NOCVTS2N)
+#define cvt2num(o)	ttisstring(o)
+#else
+#define cvt2num(o)	0	/* no conversion from strings to numbers */
+#endif
+
+
+/*
+** You can define LUA_FLOORN2I if you want to convert floats to integers
+** by flooring them (instead of raising an error if they are not
+** integral values)
+*/
+#if !defined(LUA_FLOORN2I)
+#define LUA_FLOORN2I		0
+#endif
+
+
+#define tonumber(o,n) \
+	(ttisfloat(o) ? (*(n) = fltvalue(o), 1) : luaV_tonumber_(o,n))
+
+#define tointeger(o,i) \
+    (ttisinteger(o) ? (*(i) = ivalue(o), 1) : luaV_tointeger(o,i,LUA_FLOORN2I))
+
+#define intop(op,v1,v2) l_castU2S(l_castS2U(v1) op l_castS2U(v2))
+
+#define luaV_rawequalobj(t1,t2)		luaV_equalobj(NULL,t1,t2)
+
+
+/*
+** fast track for 'gettable': if 't' is a table and 't[k]' is not nil,
+** return 1 with 'slot' pointing to 't[k]' (final result).  Otherwise,
+** return 0 (meaning it will have to check metamethod) with 'slot'
+** pointing to a nil 't[k]' (if 't' is a table) or NULL (otherwise).
+** 'f' is the raw get function to use.
+*/
+#define luaV_fastget(L,t,k,slot,f) \
+  (!ttistable(t)  \
+   ? (slot = NULL, 0)  /* not a table; 'slot' is NULL and result is 0 */  \
+   : (slot = f(hvalue(t), k),  /* else, do raw access */  \
+      !ttisnil(slot)))  /* result not nil? */
+
+/*
+** standard implementation for 'gettable'
+*/
+#define luaV_gettable(L,t,k,v) { const TValue *slot; \
+  if (luaV_fastget(L,t,k,slot,luaH_get)) { setobj2s(L, v, slot); } \
+  else luaV_finishget(L,t,k,v,slot); }
+
+
+/*
+** Fast track for set table. If 't' is a table and 't[k]' is not nil,
+** call GC barrier, do a raw 't[k]=v', and return true; otherwise,
+** return false with 'slot' equal to NULL (if 't' is not a table) or
+** 'nil'. (This is needed by 'luaV_finishget'.) Note that, if the macro
+** returns true, there is no need to 'invalidateTMcache', because the
+** call is not creating a new entry.
+*/
+#define luaV_fastset(L,t,k,slot,f,v) \
+  (!ttistable(t) \
+   ? (slot = NULL, 0) \
+   : (slot = f(hvalue(t), k), \
+     ttisnil(slot) ? 0 \
+     : (luaC_barrierback(L, hvalue(t), v), \
+        setobj2t(L, cast(TValue *,slot), v), \
+        1)))
+
+
+#define luaV_settable(L,t,k,v) { const TValue *slot; \
+  if (!luaV_fastset(L,t,k,slot,luaH_get,v)) \
+    luaV_finishset(L,t,k,v,slot); }
+  
+
+
+LUAI_FUNC int luaV_equalobj (lua_State *L, const TValue *t1, const TValue *t2);
+LUAI_FUNC int luaV_lessthan (lua_State *L, const TValue *l, const TValue *r);
+LUAI_FUNC int luaV_lessequal (lua_State *L, const TValue *l, const TValue *r);
+LUAI_FUNC int luaV_tonumber_ (const TValue *obj, lua_Number *n);
+LUAI_FUNC int luaV_tointeger (const TValue *obj, lua_Integer *p, int mode);
+LUAI_FUNC void luaV_finishget (lua_State *L, const TValue *t, TValue *key,
+                               StkId val, const TValue *slot);
+LUAI_FUNC void luaV_finishset (lua_State *L, const TValue *t, TValue *key,
+                               StkId val, const TValue *slot);
+LUAI_FUNC void luaV_finishOp (lua_State *L);
+LUAI_FUNC void luaV_execute (lua_State *L);
+LUAI_FUNC void luaV_concat (lua_State *L, int total);
+LUAI_FUNC lua_Integer luaV_div (lua_State *L, lua_Integer x, lua_Integer y);
+LUAI_FUNC lua_Integer luaV_mod (lua_State *L, lua_Integer x, lua_Integer y);
+LUAI_FUNC lua_Integer luaV_shiftl (lua_Integer x, lua_Integer y);
+LUAI_FUNC void luaV_objlen (lua_State *L, StkId ra, const TValue *rb);
+
+#endif
diff --git a/libs/lua/lua-5.3.3/lzio.c b/libs/lua/lua-5.3.3/lzio.c
new file mode 100644
index 0000000..c9e1f49
--- /dev/null
+++ b/libs/lua/lua-5.3.3/lzio.c
@@ -0,0 +1,68 @@
+/*
+** $Id: lzio.c,v 1.37 2015/09/08 15:41:05 roberto Exp $
+** Buffered streams
+** See Copyright Notice in lua.h
+*/
+
+#define lzio_c
+#define LUA_CORE
+
+#include "lprefix.h"
+
+
+#include <string.h>
+
+#include "lua.h"
+
+#include "llimits.h"
+#include "lmem.h"
+#include "lstate.h"
+#include "lzio.h"
+
+
+int luaZ_fill (ZIO *z) {
+  size_t size;
+  lua_State *L = z->L;
+  const char *buff;
+  lua_unlock(L);
+  buff = z->reader(L, z->data, &size);
+  lua_lock(L);
+  if (buff == NULL || size == 0)
+    return EOZ;
+  z->n = size - 1;  /* discount char being returned */
+  z->p = buff;
+  return cast_uchar(*(z->p++));
+}
+
+
+void luaZ_init (lua_State *L, ZIO *z, lua_Reader reader, void *data) {
+  z->L = L;
+  z->reader = reader;
+  z->data = data;
+  z->n = 0;
+  z->p = NULL;
+}
+
+
+/* --------------------------------------------------------------- read --- */
+size_t luaZ_read (ZIO *z, void *b, size_t n) {
+  while (n) {
+    size_t m;
+    if (z->n == 0) {  /* no bytes in buffer? */
+      if (luaZ_fill(z) == EOZ)  /* try to read more */
+        return n;  /* no more input; return number of missing bytes */
+      else {
+        z->n++;  /* luaZ_fill consumed first byte; put it back */
+        z->p--;
+      }
+    }
+    m = (n <= z->n) ? n : z->n;  /* min. between n and z->n */
+    memcpy(b, z->p, m);
+    z->n -= m;
+    z->p += m;
+    b = (char *)b + m;
+    n -= m;
+  }
+  return 0;
+}
+
diff --git a/libs/lua/lua-5.3.3/lzio.h b/libs/lua/lua-5.3.3/lzio.h
new file mode 100644
index 0000000..e7b6f34
--- /dev/null
+++ b/libs/lua/lua-5.3.3/lzio.h
@@ -0,0 +1,66 @@
+/*
+** $Id: lzio.h,v 1.31 2015/09/08 15:41:05 roberto Exp $
+** Buffered streams
+** See Copyright Notice in lua.h
+*/
+
+
+#ifndef lzio_h
+#define lzio_h
+
+#include "lua.h"
+
+#include "lmem.h"
+
+
+#define EOZ	(-1)			/* end of stream */
+
+typedef struct Zio ZIO;
+
+#define zgetc(z)  (((z)->n--)>0 ?  cast_uchar(*(z)->p++) : luaZ_fill(z))
+
+
+typedef struct Mbuffer {
+  char *buffer;
+  size_t n;
+  size_t buffsize;
+} Mbuffer;
+
+#define luaZ_initbuffer(L, buff) ((buff)->buffer = NULL, (buff)->buffsize = 0)
+
+#define luaZ_buffer(buff)	((buff)->buffer)
+#define luaZ_sizebuffer(buff)	((buff)->buffsize)
+#define luaZ_bufflen(buff)	((buff)->n)
+
+#define luaZ_buffremove(buff,i)	((buff)->n -= (i))
+#define luaZ_resetbuffer(buff) ((buff)->n = 0)
+
+
+#define luaZ_resizebuffer(L, buff, size) \
+	((buff)->buffer = luaM_reallocvchar(L, (buff)->buffer, \
+				(buff)->buffsize, size), \
+	(buff)->buffsize = size)
+
+#define luaZ_freebuffer(L, buff)	luaZ_resizebuffer(L, buff, 0)
+
+
+LUAI_FUNC void luaZ_init (lua_State *L, ZIO *z, lua_Reader reader,
+                                        void *data);
+LUAI_FUNC size_t luaZ_read (ZIO* z, void *b, size_t n);	/* read next n bytes */
+
+
+
+/* --------- Private Part ------------------ */
+
+struct Zio {
+  size_t n;			/* bytes still unread */
+  const char *p;		/* current position in buffer */
+  lua_Reader reader;		/* reader function */
+  void *data;			/* additional data */
+  lua_State *L;			/* Lua state (for reader) */
+};
+
+
+LUAI_FUNC int luaZ_fill (ZIO *z);
+
+#endif
diff --git a/libs/lua/lua.cc b/libs/lua/lua.cc
new file mode 100644
index 0000000..7eed622
--- /dev/null
+++ b/libs/lua/lua.cc
@@ -0,0 +1,121 @@
+/* This is a C++ wrapper to compile the lua C code
+ * with settings appropriate for including it with
+ * Ardour.
+ */
+
+#include "lua/liblua_visibility.h"
+
+#if _MSC_VER
+# pragma push_macro("_CRT_SECURE_NO_WARNINGS")
+#  ifndef _CRT_SECURE_NO_WARNINGS
+#    define _CRT_SECURE_NO_WARNINGS
+#  endif
+#elif defined(__clang__)
+#  pragma clang diagnostic push
+#  pragma clang diagnostic ignored "-Wcast-qual"
+#elif __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)
+#  pragma GCC diagnostic push
+#  pragma GCC diagnostic ignored "-Wcast-qual"
+#endif
+
+// forward ardour's defines to luaconf.h
+#ifdef PLATFORM_WINDOWS
+#  define LUA_USE_WINDOWS
+#elif defined __APPLE__
+#  define LUA_USE_MACOSX
+#else
+#  define LUA_USE_LINUX
+#endif
+
+// forward liblua visibility to luaconf.h
+#ifdef LIBLUA_BUILD_AS_DLL
+#define LUA_BUILD_AS_DLL
+#endif
+
+extern "C"
+{
+
+#define lobject_c
+#define lvm_c
+#define LUA_CORE
+#define LUA_LIB
+#include "lua-5.3.3/luaconf.h"
+#undef lobject_c
+#undef lvm_c
+#undef LUA_CORE
+#undef LUA_LIB
+
+// override luaconf.h symbol export
+#ifdef LIBLUA_STATIC // static lib (no DLL)
+#  undef LUA_API
+#  undef LUALIB_API
+#  undef LUAMOD_API
+#  define LUA_API     extern "C"
+#  define LUALIB_API  LUA_API
+#  define LUAMOD_API  LUALIB_API
+#endif
+
+// disable support for extenal libs
+#undef LUA_DL_DLL
+#undef LUA_USE_DLOPEN
+
+// enable bit lib
+#define LUA_COMPAT_BITLIB
+
+#if _MSC_VER
+#pragma warning (push)
+#pragma warning (disable: 4244) /* Possible loss of data */
+#pragma warning (disable: 4702) /* Unreachable code */
+#endif
+
+#include "lua-5.3.3/ltable.c"
+
+#include "lua-5.3.3/lauxlib.c"
+#include "lua-5.3.3/lbaselib.c"
+
+#include "lua-5.3.3/lbitlib.c"
+#include "lua-5.3.3/lcorolib.c"
+#include "lua-5.3.3/ldblib.c"
+#include "lua-5.3.3/linit.c"
+#include "lua-5.3.3/liolib.c"
+#include "lua-5.3.3/lmathlib.c"
+#include "lua-5.3.3/loslib.c"
+#include "lua-5.3.3/lstrlib.c"
+#include "lua-5.3.3/ltablib.c"
+
+#include "lua-5.3.3/lapi.c"
+#include "lua-5.3.3/lcode.c"
+#include "lua-5.3.3/lctype.c"
+#include "lua-5.3.3/ldebug.c"
+#include "lua-5.3.3/ldo.c"
+#include "lua-5.3.3/ldump.c"
+#include "lua-5.3.3/lfunc.c"
+#include "lua-5.3.3/lgc.c"
+#include "lua-5.3.3/llex.c"
+#include "lua-5.3.3/lmem.c"
+#include "lua-5.3.3/lobject.c"
+#include "lua-5.3.3/lopcodes.c"
+#include "lua-5.3.3/lparser.c"
+#include "lua-5.3.3/lstate.c"
+#include "lua-5.3.3/lstring.c"
+#include "lua-5.3.3/ltm.c"
+#include "lua-5.3.3/lundump.c"
+#include "lua-5.3.3/lutf8lib.c"
+#include "lua-5.3.3/lvm.c"
+#include "lua-5.3.3/lzio.c"
+
+#include "lua-5.3.3/loadlib.c"
+
+#if _MSC_VER
+#pragma warning (pop)
+#endif
+
+} // end extern "C"
+
+#if _MSC_VER
+#  pragma pop_macro("_CRT_SECURE_NO_WARNINGS")
+#elif defined(__clang__)
+#  pragma clang diagnostic pop
+#elif __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)
+#  pragma GCC diagnostic pop
+#endif
diff --git a/libs/lua/lua/liblua_visibility.h b/libs/lua/lua/liblua_visibility.h
new file mode 100644
index 0000000..494f936
--- /dev/null
+++ b/libs/lua/lua/liblua_visibility.h
@@ -0,0 +1,35 @@
+#ifndef __liblua_visibility_h__
+#define __liblua_visibility_h__
+
+#if defined(COMPILER_MSVC)
+#  define LIBLUA_DLL_IMPORT __declspec(dllimport)
+#  define LIBLUA_DLL_EXPORT __declspec(dllexport)
+#  define LIBLUA_DLL_LOCAL
+#else
+#  define LIBLUA_DLL_IMPORT __attribute__ ((visibility ("default")))
+#  define LIBLUA_DLL_EXPORT __attribute__ ((visibility ("default")))
+#  define LIBLUA_DLL_LOCAL  __attribute__ ((visibility ("hidden")))
+#endif
+
+
+#ifdef COMPILER_MSVC
+// MSVC: build liblua as DLL
+#  define LIBLUA_BUILD_AS_DLL
+#else
+// others currently use a static lib (incl. with libardour)
+#  define LIBLUA_STATIC
+#endif
+
+
+#ifdef LIBLUA_STATIC
+#  define LIBLUA_API
+#else
+// define when building the DLL (instead of using it)
+#  ifdef LIBLUA_DLL_EXPORTS
+#    define LIBLUA_API LIBLUA_DLL_EXPORT
+#  else
+#    define LIBLUA_API LIBLUA_DLL_IMPORT
+#  endif
+#endif
+
+#endif /* __liblua_visibility_h__ */
diff --git a/libs/lua/lua/lua.h b/libs/lua/lua/lua.h
new file mode 100644
index 0000000..3e9a885
--- /dev/null
+++ b/libs/lua/lua/lua.h
@@ -0,0 +1,6 @@
+#ifndef LUA_LIBRARY_H
+#define LUA_LIBRARY_H
+
+#include "lua-5.3.3/lua.hpp"
+
+#endif
diff --git a/libs/lua/lua/luastate.h b/libs/lua/lua/luastate.h
new file mode 100644
index 0000000..5a5c939
--- /dev/null
+++ b/libs/lua/lua/luastate.h
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+
+#ifndef LUA_STATE_H
+#define LUA_STATE_H
+
+#include <string>
+#include <sigc++/sigc++.h>
+
+#include "lua/liblua_visibility.h"
+#include "lua/lua.h"
+
+class LIBLUA_API LuaState {
+public:
+	LuaState();
+	LuaState(lua_State *ls);
+	~LuaState();
+
+	int do_command (std::string);
+	int do_file (std::string);
+	void collect_garbage ();
+	void collect_garbage_step ();
+	void tweak_rt_gc ();
+
+	sigc::signal<void,std::string> Print;
+
+	lua_State* getState () { return L; }
+
+protected:
+	lua_State* L;
+
+private:
+	void init ();
+  static int _print (lua_State *L);
+	void print (std::string text);
+
+};
+
+#endif
diff --git a/libs/lua/luastate.cc b/libs/lua/luastate.cc
new file mode 100644
index 0000000..3b8a7ae
--- /dev/null
+++ b/libs/lua/luastate.cc
@@ -0,0 +1,117 @@
+/*
+ * Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+
+#include <assert.h>
+#include "lua/luastate.h"
+
+// from lauxlib.c
+static int panic (lua_State *L) {
+	lua_writestringerror("PANIC: unprotected error in call to Lua API (%s)\n",
+			lua_tostring(L, -1));
+	return 0;  /* return to Lua to abort */
+}
+
+LuaState::LuaState()
+	: L (luaL_newstate ())
+{
+	assert (L);
+	init ();
+}
+
+LuaState::LuaState(lua_State *ls)
+	: L (ls)
+{
+	assert (L);
+	init ();
+}
+
+LuaState::~LuaState() {
+	lua_close (L);
+}
+
+void
+LuaState::init() {
+	lua_atpanic (L, &panic);
+	luaL_openlibs (L);
+	lua_pushlightuserdata (L, this);
+	lua_pushcclosure (L, &LuaState::_print, 1);
+	lua_setglobal (L, "print");
+}
+
+int
+LuaState::do_command (std::string cmd) {
+	int result = luaL_dostring (L, cmd.c_str());
+	if (result != 0) {
+		print ("Error: " + std::string (lua_tostring (L, -1)));
+	}
+	return result;
+}
+
+int
+LuaState::do_file (std::string fn) {
+	int result = luaL_dofile (L, fn.c_str());
+	if (result != 0) {
+		print ("Error: " + std::string (lua_tostring (L, -1)));
+	}
+	return result;
+}
+
+void
+LuaState::collect_garbage () {
+	lua_gc (L, LUA_GCCOLLECT, 0);
+}
+
+void
+LuaState::collect_garbage_step () {
+	lua_gc (L, LUA_GCSTEP, 0);
+}
+
+void
+LuaState::tweak_rt_gc () {
+	//lua_gc (L, LUA_GCSETPAUSE, 20);
+	lua_gc (L, LUA_GCSETSTEPMUL, 100);
+}
+
+void
+LuaState::print (std::string text) {
+	Print (text); /* EMIT SIGNAL */
+}
+
+int
+LuaState::_print (lua_State *L) {
+	LuaState* const luaState = static_cast <LuaState*> (lua_touserdata (L, lua_upvalueindex (1)));
+	std::string text;
+	int n = lua_gettop(L);  /* number of arguments */
+	int i;
+	lua_getglobal(L, "tostring");
+	for (i=1; i<=n; i++) {
+		const char *s;
+		size_t l;
+		lua_pushvalue(L, -1);  /* function to be called */
+		lua_pushvalue(L, i);   /* value to print */
+		lua_call(L, 1, 1);
+		s = lua_tolstring(L, -1, &l);  /* get result */
+		if (s == NULL)
+			return luaL_error(L, "'tostring' must return a string to 'print'");
+		if (i > 1) text += " ";
+		text += std::string (s, l);
+		lua_pop(L, 1);  /* pop result */
+	}
+	luaState->print (text);
+	return 0;
+}
diff --git a/libs/lua/wscript b/libs/lua/wscript
new file mode 100644
index 0000000..6598e5a
--- /dev/null
+++ b/libs/lua/wscript
@@ -0,0 +1,35 @@
+#!/usr/bin/env python
+from waflib.extras import autowaf as autowaf
+from waflib import TaskGen
+import os
+import sys
+
+# Variables for 'waf dist'
+APPNAME = 'liblua'
+VERSION = "3.5.1"
+I18N_PACKAGE = 'liblua'
+
+# Mandatory variables
+top = '.'
+out = 'build'
+
+def options(opt):
+    autowaf.set_options(opt)
+
+def configure(conf):
+    conf.load('compiler_c')
+    autowaf.configure(conf)
+
+def build(bld):
+    obj=bld.stlib (source = ['lua.cc', 'luastate.cc'],
+               cflags = [ '-fPIC' ],
+               cxxflags = [ '-fPIC' ],
+               includes = ['.'],
+               export_includes = ['.'],
+               target = 'liblua',
+               uselib = [ 'SIGCPP', 'DL' ]
+               )
+    autowaf.ensure_visible_symbols (obj, True)
+
+def shutdown():
+    autowaf.shutdown()
diff --git a/libs/midi++2/MSVCmidi++/midi++.vcproj b/libs/midi++2/MSVCmidi++/midi++.vcproj
index 9325530..361f57b 100644
--- a/libs/midi++2/MSVCmidi++/midi++.vcproj
+++ b/libs/midi++2/MSVCmidi++/midi++.vcproj
@@ -354,7 +354,7 @@
 			UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
 			>
 			<File
-				RelativePath="..\..\..\icons\win32\msvc_resources.rc"
+				RelativePath="..\..\..\gtk2_ardour\win32\msvc_resources.rc"
 				>
 			</File>
 		</Filter>
diff --git a/libs/midi++2/midi++/.DS_Store b/libs/midi++2/midi++/.DS_Store
deleted file mode 100644
index 5008ddf..0000000
Binary files a/libs/midi++2/midi++/.DS_Store and /dev/null differ
diff --git a/libs/midi++2/midi++/ipmidi_port.h b/libs/midi++2/midi++/ipmidi_port.h
index 3132088..d870c79 100644
--- a/libs/midi++2/midi++/ipmidi_port.h
+++ b/libs/midi++2/midi++/ipmidi_port.h
@@ -23,7 +23,7 @@
 #include <iostream>
 #if defined(PLATFORM_WINDOWS)
 #include <winsock.h>
-#elif defined(__FREE_BSD__)
+#elif defined(__FreeBSD__)
 #include <netinet/in.h>
 #include <sys/socket.h>
 #include <sys/_sockaddr_storage.h>
diff --git a/libs/midi++2/parser.cc b/libs/midi++2/parser.cc
index fcee844..ff0702f 100644
--- a/libs/midi++2/parser.cc
+++ b/libs/midi++2/parser.cc
@@ -100,7 +100,7 @@ Parser::midi_event_type_name (eventType t)
 		return "active sense";
 
 	default:
-		return "unknow MIDI event type";
+		return "unknown MIDI event type";
 	}
 }
 
diff --git a/libs/panners/1in2out/panner_1in2out.cc b/libs/panners/1in2out/panner_1in2out.cc
index b522d65..3dc3b53 100644
--- a/libs/panners/1in2out/panner_1in2out.cc
+++ b/libs/panners/1in2out/panner_1in2out.cc
@@ -51,7 +51,7 @@
 #include "ardour/pannable.h"
 #include "ardour/profile.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 #include "panner_1in2out.h"
 
 #include "pbd/mathfix.h"
@@ -363,7 +363,7 @@ Panner1in2out::describe_parameter (Evoral::Parameter p)
 }
 
 string
-Panner1in2out::value_as_string (boost::shared_ptr<AutomationControl> ac) const
+Panner1in2out::value_as_string (boost::shared_ptr<const AutomationControl> ac) const
 {
         /* DO NOT USE LocaleGuard HERE */
         double val = ac->get_value();
diff --git a/libs/panners/1in2out/panner_1in2out.h b/libs/panners/1in2out/panner_1in2out.h
index 9120720..06d68a7 100644
--- a/libs/panners/1in2out/panner_1in2out.h
+++ b/libs/panners/1in2out/panner_1in2out.h
@@ -56,7 +56,7 @@ class Panner1in2out : public Panner
         static Panner* factory (boost::shared_ptr<Pannable>, boost::shared_ptr<Speakers>);
 
         std::string describe_parameter (Evoral::Parameter);
-        std::string value_as_string (boost::shared_ptr<AutomationControl>) const;
+        std::string value_as_string (boost::shared_ptr<const AutomationControl>) const;
 
 	XMLNode& get_state ();
 
diff --git a/libs/panners/1in2out/wscript b/libs/panners/1in2out/wscript
index 2c1d9f1..b28c95d 100644
--- a/libs/panners/1in2out/wscript
+++ b/libs/panners/1in2out/wscript
@@ -22,6 +22,7 @@ def build(bld):
     obj.name         = 'libardour_pan1in2out'
     obj.target       = 'pan1in2out'
     obj.use          = 'libardour libardour_cp libpbd'
+    obj.uselib       = 'GLIBMM XML'
     obj.install_path = os.path.join(bld.env['LIBDIR'], 'panners')
 
 def shutdown():
diff --git a/libs/panners/2in2out/panner_2in2out.cc b/libs/panners/2in2out/panner_2in2out.cc
index d8a7428..9105eff 100644
--- a/libs/panners/2in2out/panner_2in2out.cc
+++ b/libs/panners/2in2out/panner_2in2out.cc
@@ -51,7 +51,7 @@
 
 #include "panner_2in2out.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 #include "pbd/mathfix.h"
 
@@ -508,7 +508,7 @@ Panner2in2out::describe_parameter (Evoral::Parameter p)
 }
 
 string
-Panner2in2out::value_as_string (boost::shared_ptr<AutomationControl> ac) const
+Panner2in2out::value_as_string (boost::shared_ptr<const AutomationControl> ac) const
 {
         /* DO NOT USE LocaleGuard HERE */
         double val = ac->get_value();
diff --git a/libs/panners/2in2out/panner_2in2out.h b/libs/panners/2in2out/panner_2in2out.h
index bc81234..4c71a27 100644
--- a/libs/panners/2in2out/panner_2in2out.h
+++ b/libs/panners/2in2out/panner_2in2out.h
@@ -63,7 +63,7 @@ class Panner2in2out : public Panner
 	static Panner* factory (boost::shared_ptr<Pannable>, boost::shared_ptr<Speakers>);
 
         std::string describe_parameter (Evoral::Parameter);
-        std::string value_as_string (boost::shared_ptr<AutomationControl>) const;
+        std::string value_as_string (boost::shared_ptr<const AutomationControl>) const;
 
 	XMLNode& get_state ();
 
diff --git a/libs/panners/2in2out/wscript b/libs/panners/2in2out/wscript
index bd82526..f49f1cd 100644
--- a/libs/panners/2in2out/wscript
+++ b/libs/panners/2in2out/wscript
@@ -22,6 +22,7 @@ def build(bld):
     obj.name         = 'libardour_pan2in2out'
     obj.target       = 'pan2in2out'
     obj.use          = 'libardour libardour_cp libpbd'
+    obj.uselib       = 'GLIBMM XML'
     obj.install_path = os.path.join(bld.env['LIBDIR'], 'panners')
 
 def shutdown():
diff --git a/libs/panners/MSVCpanners/panner_1in2out.vcproj b/libs/panners/MSVCpanners/panner_1in2out.vcproj
index 445f0f0..67b1a28 100644
--- a/libs/panners/MSVCpanners/panner_1in2out.vcproj
+++ b/libs/panners/MSVCpanners/panner_1in2out.vcproj
@@ -41,8 +41,8 @@
 				Name="VCCLCompilerTool"
 				AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
 				Optimization="0"
-				AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\timecode;..\..\rubberband;"..\..\vamp-sdk";"..\..\midi++2";..\..\taglib;..\..\taglib\taglib;..\..\taglib\taglib\toolkit;..\..\audiographer;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor""
-				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;BUILDING_ARDOURPANNERS;ARDOURPANNER_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_DEBUG;DEBUG="Debug";ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_pan1in2out\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+				AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\timecode;..\..\rubberband;"..\..\vamp-sdk";"..\..\midi++2";..\..\taglib;..\..\taglib\taglib;..\..\taglib\taglib\toolkit;..\..\audiographer;..\..\lua;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor""
+				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;BUILDING_ARDOURPANNERS;ARDOURPANNER_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_DEBUG;DEBUG="Debug";ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_pan1in2out\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
 				MinimalRebuild="true"
 				RuntimeLibrary="3"
 				WarningLevel="3"
@@ -123,8 +123,8 @@
 				AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
 				Optimization="2"
 				InlineFunctionExpansion="1"
-				AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\timecode;..\..\rubberband;"..\..\vamp-sdk";"..\..\midi++2";..\..\taglib;..\..\taglib\taglib;..\..\taglib\taglib\toolkit;..\..\audiographer;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor""
-				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_ARDOURPANNERS;ARDOURPANNER_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;NDEBUG;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_pan1in2out\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+				AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\timecode;..\..\rubberband;"..\..\vamp-sdk";"..\..\midi++2";..\..\taglib;..\..\taglib\taglib;..\..\taglib\taglib\toolkit;..\..\audiographer;..\..\lua;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor""
+				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_ARDOURPANNERS;ARDOURPANNER_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;NDEBUG;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_pan1in2out\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
 				StringPooling="false"
 				RuntimeLibrary="2"
 				EnableEnhancedInstructionSet="1"
@@ -204,8 +204,8 @@
 				Name="VCCLCompilerTool"
 				AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
 				Optimization="0"
-				AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\timecode;..\..\rubberband;"..\..\vamp-sdk";"..\..\midi++2";..\..\taglib;..\..\taglib\taglib;..\..\taglib\taglib\toolkit;..\..\audiographer;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor""
-				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_ARDOURPANNERS;ARDOURPANNER_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_pan1in2out\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+				AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\timecode;..\..\rubberband;"..\..\vamp-sdk";"..\..\midi++2";..\..\taglib;..\..\taglib\taglib;..\..\taglib\taglib\toolkit;..\..\audiographer;..\..\lua;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor""
+				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_ARDOURPANNERS;ARDOURPANNER_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_pan1in2out\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
 				StringPooling="false"
 				RuntimeLibrary="2"
 				EnableEnhancedInstructionSet="1"
@@ -288,7 +288,7 @@
 			UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
 			>
 			<File
-				RelativePath="..\..\..\icons\win32\msvc_resources.rc"
+				RelativePath="..\..\..\gtk2_ardour\win32\msvc_resources.rc"
 				>
 			</File>
 		</Filter>
diff --git a/libs/panners/MSVCpanners/panner_2in2out.vcproj b/libs/panners/MSVCpanners/panner_2in2out.vcproj
index 648d935..6047de5 100644
--- a/libs/panners/MSVCpanners/panner_2in2out.vcproj
+++ b/libs/panners/MSVCpanners/panner_2in2out.vcproj
@@ -41,8 +41,8 @@
 				Name="VCCLCompilerTool"
 				AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
 				Optimization="0"
-				AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\timecode;..\..\rubberband;"..\..\vamp-sdk";"..\..\midi++2";..\..\taglib;..\..\taglib\taglib;..\..\taglib\taglib\toolkit;..\..\audiographer;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor""
-				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;BUILDING_ARDOURPANNERS;ARDOURPANNER_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_DEBUG;DEBUG="Debug";ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_pan2in2out\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+				AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\timecode;..\..\rubberband;"..\..\vamp-sdk";"..\..\midi++2";..\..\taglib;..\..\taglib\taglib;..\..\taglib\taglib\toolkit;..\..\audiographer;..\..\lua;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor""
+				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;BUILDING_ARDOURPANNERS;ARDOURPANNER_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_DEBUG;DEBUG="Debug";ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_pan2in2out\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
 				MinimalRebuild="true"
 				RuntimeLibrary="3"
 				WarningLevel="3"
@@ -123,8 +123,8 @@
 				AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
 				Optimization="2"
 				InlineFunctionExpansion="1"
-				AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\timecode;..\..\rubberband;"..\..\vamp-sdk";"..\..\midi++2";..\..\taglib;..\..\taglib\taglib;..\..\taglib\taglib\toolkit;..\..\audiographer;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor""
-				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_ARDOURPANNERS;ARDOURPANNER_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;NDEBUG;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_pan2in2out\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+				AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\timecode;..\..\rubberband;"..\..\vamp-sdk";"..\..\midi++2";..\..\taglib;..\..\taglib\taglib;..\..\taglib\taglib\toolkit;..\..\audiographer;..\..\lua;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor""
+				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_ARDOURPANNERS;ARDOURPANNER_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;NDEBUG;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_pan2in2out\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
 				StringPooling="false"
 				RuntimeLibrary="2"
 				EnableEnhancedInstructionSet="1"
@@ -204,8 +204,8 @@
 				Name="VCCLCompilerTool"
 				AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
 				Optimization="0"
-				AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\timecode;..\..\rubberband;"..\..\vamp-sdk";"..\..\midi++2";..\..\taglib;..\..\taglib\taglib;..\..\taglib\taglib\toolkit;..\..\audiographer;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor""
-				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_ARDOURPANNERS;ARDOURPANNER_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_pan2in2out\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+				AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\timecode;..\..\rubberband;"..\..\vamp-sdk";"..\..\midi++2";..\..\taglib;..\..\taglib\taglib;..\..\taglib\taglib\toolkit;..\..\audiographer;..\..\lua;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor""
+				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_ARDOURPANNERS;ARDOURPANNER_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_pan2in2out\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
 				StringPooling="false"
 				RuntimeLibrary="2"
 				EnableEnhancedInstructionSet="1"
@@ -288,7 +288,7 @@
 			UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
 			>
 			<File
-				RelativePath="..\..\..\icons\win32\msvc_resources.rc"
+				RelativePath="..\..\..\gtk2_ardour\win32\msvc_resources.rc"
 				>
 			</File>
 		</Filter>
diff --git a/libs/panners/MSVCpanners/panner_vbap.vcproj b/libs/panners/MSVCpanners/panner_vbap.vcproj
index 894bbdf..b0893df 100644
--- a/libs/panners/MSVCpanners/panner_vbap.vcproj
+++ b/libs/panners/MSVCpanners/panner_vbap.vcproj
@@ -42,7 +42,7 @@
 				AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
 				Optimization="0"
 				AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\timecode;..\..\rubberband;"..\..\vamp-sdk";"..\..\midi++2";..\..\taglib;..\..\taglib\taglib;..\..\taglib\taglib\toolkit;..\..\audiographer;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor""
-				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;BUILDING_ARDOURPANNERS;ARDOURPANNER_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_DEBUG;DEBUG="Debug";ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_panvbap\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;BUILDING_ARDOURPANNERS;ARDOURPANNER_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_DEBUG;DEBUG="Debug";ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_panvbap\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
 				MinimalRebuild="true"
 				RuntimeLibrary="3"
 				WarningLevel="3"
@@ -124,7 +124,7 @@
 				Optimization="2"
 				InlineFunctionExpansion="1"
 				AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\timecode;..\..\rubberband;"..\..\vamp-sdk";"..\..\midi++2";..\..\taglib;..\..\taglib\taglib;..\..\taglib\taglib\toolkit;..\..\audiographer;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor""
-				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_ARDOURPANNERS;ARDOURPANNER_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;NDEBUG;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_panvbap\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_ARDOURPANNERS;ARDOURPANNER_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;NDEBUG;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_panvbap\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
 				StringPooling="false"
 				RuntimeLibrary="2"
 				EnableEnhancedInstructionSet="1"
@@ -205,7 +205,7 @@
 				AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
 				Optimization="0"
 				AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\timecode;..\..\rubberband;"..\..\vamp-sdk";"..\..\midi++2";..\..\taglib;..\..\taglib\taglib;..\..\taglib\taglib\toolkit;..\..\audiographer;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor""
-				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_ARDOURPANNERS;ARDOURPANNER_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_panvbap\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_ARDOURPANNERS;ARDOURPANNER_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"libardour_panvbap\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
 				StringPooling="false"
 				RuntimeLibrary="2"
 				EnableEnhancedInstructionSet="1"
@@ -296,7 +296,7 @@
 			UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
 			>
 			<File
-				RelativePath="..\..\..\icons\win32\msvc_resources.rc"
+				RelativePath="..\..\..\gtk2_ardour\win32\msvc_resources.rc"
 				>
 			</File>
 		</Filter>
diff --git a/libs/panners/stereobalance/panner_balance.cc b/libs/panners/stereobalance/panner_balance.cc
index b2efb0f..647c92a 100644
--- a/libs/panners/stereobalance/panner_balance.cc
+++ b/libs/panners/stereobalance/panner_balance.cc
@@ -52,7 +52,7 @@
 
 #include "panner_balance.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 #include "pbd/mathfix.h"
 
@@ -296,7 +296,7 @@ Pannerbalance::describe_parameter (Evoral::Parameter p)
 }
 
 string
-Pannerbalance::value_as_string (boost::shared_ptr<AutomationControl> ac) const
+Pannerbalance::value_as_string (boost::shared_ptr<const AutomationControl> ac) const
 {
 	/* DO NOT USE LocaleGuard HERE */
 	double val = ac->get_value();
diff --git a/libs/panners/stereobalance/panner_balance.h b/libs/panners/stereobalance/panner_balance.h
index f381340..dabb1da 100644
--- a/libs/panners/stereobalance/panner_balance.h
+++ b/libs/panners/stereobalance/panner_balance.h
@@ -57,7 +57,7 @@ class Pannerbalance : public Panner
 	static Panner* factory (boost::shared_ptr<Pannable>, boost::shared_ptr<Speakers>);
 
 	std::string describe_parameter (Evoral::Parameter);
-	std::string value_as_string (boost::shared_ptr<AutomationControl>) const;
+	std::string value_as_string (boost::shared_ptr<const AutomationControl>) const;
 
 	XMLNode& get_state ();
 
diff --git a/libs/panners/stereobalance/wscript b/libs/panners/stereobalance/wscript
index 72b7c46..16d69d9 100644
--- a/libs/panners/stereobalance/wscript
+++ b/libs/panners/stereobalance/wscript
@@ -22,6 +22,7 @@ def build(bld):
     obj.name         = 'libardour_panbalance'
     obj.target       = 'panbalance'
     obj.use          = 'libardour libardour_cp libpbd'
+    obj.uselib       = 'GLIBMM XML'
     obj.install_path = os.path.join(bld.env['LIBDIR'], 'panners')
 
 def shutdown():
diff --git a/libs/panners/vbap/vbap.cc b/libs/panners/vbap/vbap.cc
index df34ddd..e6cbd36 100644
--- a/libs/panners/vbap/vbap.cc
+++ b/libs/panners/vbap/vbap.cc
@@ -42,7 +42,7 @@
 #include "vbap.h"
 #include "vbap_speakers.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace PBD;
 using namespace ARDOUR;
@@ -420,7 +420,7 @@ VBAPanner::describe_parameter (Evoral::Parameter p)
 }
 
 string
-VBAPanner::value_as_string (boost::shared_ptr<AutomationControl> ac) const
+VBAPanner::value_as_string (boost::shared_ptr<const AutomationControl> ac) const
 {
         /* DO NOT USE LocaleGuard HERE */
         double val = ac->get_value();
diff --git a/libs/panners/vbap/vbap.h b/libs/panners/vbap/vbap.h
index ab3c2a6..993bbda 100644
--- a/libs/panners/vbap/vbap.h
+++ b/libs/panners/vbap/vbap.h
@@ -57,7 +57,7 @@ public:
 	void set_azimuth_elevation (double azimuth, double elevation);
 
         std::string describe_parameter (Evoral::Parameter);
-        std::string value_as_string (boost::shared_ptr<AutomationControl>) const;
+        std::string value_as_string (boost::shared_ptr<const AutomationControl>) const;
 
 	XMLNode& get_state ();
 
diff --git a/libs/panners/vbap/wscript b/libs/panners/vbap/wscript
index bb2cb5b..d8f47b2 100644
--- a/libs/panners/vbap/wscript
+++ b/libs/panners/vbap/wscript
@@ -22,6 +22,7 @@ def build(bld):
     obj.name         = 'libardour_panvbap'
     obj.target       = 'panvbap'
     obj.use          = 'libardour libardour_cp libpbd'
+    obj.uselib       = 'GLIBMM XML'
     obj.install_path = os.path.join(bld.env['LIBDIR'], 'panners')
 
 def shutdown():
diff --git a/libs/pbd/MSVCpbd/pbd.vcproj b/libs/pbd/MSVCpbd/pbd.vcproj
index 490090d..906026c 100644
--- a/libs/pbd/MSVCpbd/pbd.vcproj
+++ b/libs/pbd/MSVCpbd/pbd.vcproj
@@ -295,10 +295,6 @@
 				>
 			</File>
 			<File
-				RelativePath="..\controllable_descriptor.cc"
-				>
-			</File>
-			<File
 				RelativePath="..\convert.cc"
 				>
 			</File>
@@ -399,6 +395,10 @@
 				>
 			</File>
 			<File
+				RelativePath="..\reallocpool.cc"
+				>
+			</File>
+			<File
 				RelativePath="..\receiver.cc"
 				>
 			</File>
@@ -701,6 +701,10 @@
 				>
 			</File>
 			<File
+				RelativePath="..\pbd\natsort.h"
+				>
+			</File>
+			<File
 				RelativePath="..\pbd\pathexpand.h"
 				>
 			</File>
@@ -725,6 +729,10 @@
 				>
 			</File>
 			<File
+				RelativePath="..\pbd\reallocpool.h"
+				>
+			</File>
+			<File
 				RelativePath="..\pbd\receiver.h"
 				>
 			</File>
@@ -831,7 +839,7 @@
 			UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
 			>
 			<File
-				RelativePath="..\..\..\icons\win32\msvc_resources.rc"
+				RelativePath="..\..\..\gtk2_ardour\win32\msvc_resources.rc"
 				>
 			</File>
 		</Filter>
diff --git a/libs/pbd/base_ui.cc b/libs/pbd/base_ui.cc
index d303d88..f22d832 100644
--- a/libs/pbd/base_ui.cc
+++ b/libs/pbd/base_ui.cc
@@ -35,7 +35,7 @@
 #include "pbd/compose.h"
 #include "pbd/failed_constructor.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 #include "pbd/debug.h"
 
diff --git a/libs/pbd/configuration_variable.cc b/libs/pbd/configuration_variable.cc
index cacad87..578114e 100644
--- a/libs/pbd/configuration_variable.cc
+++ b/libs/pbd/configuration_variable.cc
@@ -47,7 +47,7 @@ ConfigVariableBase::set_from_node (XMLNode const & node)
 		const XMLProperty* prop;
 		XMLNodeList nlist;
 		XMLNodeConstIterator niter;
-		XMLNode* child;
+		XMLNode const * child;
 
 		nlist = node.children();
 
diff --git a/libs/pbd/controllable.cc b/libs/pbd/controllable.cc
index 2e4b169..b730a42 100644
--- a/libs/pbd/controllable.cc
+++ b/libs/pbd/controllable.cc
@@ -23,7 +23,7 @@
 #include "pbd/error.h"
 #include "pbd/locale_guard.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace PBD;
 using namespace std;
@@ -107,7 +107,7 @@ XMLNode&
 Controllable::get_state ()
 {
 	XMLNode* node = new XMLNode (xml_node_name);
-	LocaleGuard lg (X_("C"));
+	LocaleGuard lg;
 	char buf[64];
 
 	/* Waves' "Pressure3" has a parameter called "µ-iness"
@@ -138,7 +138,7 @@ Controllable::get_state ()
 int
 Controllable::set_state (const XMLNode& node, int /*version*/)
 {
-	LocaleGuard lg (X_("C"));
+	LocaleGuard lg;
 	const XMLProperty* prop;
 
 	Stateful::save_extra_xml (node);
diff --git a/libs/pbd/controllable_descriptor.cc b/libs/pbd/controllable_descriptor.cc
deleted file mode 100644
index 0228d00..0000000
--- a/libs/pbd/controllable_descriptor.cc
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
-    Copyright (C) 2009 Paul Davis
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-
-#include "pbd/controllable_descriptor.h"
-#include "pbd/strsplit.h"
-#include "pbd/convert.h"
-
-using namespace std;
-using namespace PBD;
-
-int
-ControllableDescriptor::set (const std::string& str)
-{
-	string::size_type first_space = str.find_first_of (" ");
-
-	if (first_space == string::npos) {
-		return -1;
-	}
-
-	string front = str.substr (0, first_space);
-	string back = str.substr (first_space);
-
-	vector<string> path;
-	split (front, path, '/');
-
-	if (path.size() < 2) {
-		return -1;
-	}
-
-	vector<string> rest;
-	split (back, rest, ' ');
-
-	if (rest.size() < 1) {
-		return -1;
-	}
-
-	if (path[0] == "route" || path[0] == "rid") {
-
-		_top_level_type = RemoteControlID;
-
-		if (rest[0][0] == 'B') {
-			_banked = true;
-			_rid = atoi (rest[0].substr (1));
-		} else if (isdigit (rest[0][0])) {
-			_banked = false;
-			_rid = atoi (rest[0]);
-		} else {
-			return -1;
-		}
-
-	} else if (path[0] == "bus" || path[0] == "track") {
-
-		_top_level_type = NamedRoute;
-		_top_level_name = rest[0];
-	}
-
-	if (path[1] == "gain") {
-		_subtype = Gain;
-
-	} else if (path[1] == "trim") {
-		_subtype = Trim;
-
-	} else if (path[1] == "solo") {
-		_subtype = Solo;
-
-	} else if (path[1] == "mute") {
-		_subtype = Mute;
-
-	} else if (path[1] == "recenable") {
-		_subtype = Recenable;
-
-	} else if (path[1] == "balance") {
-		_subtype = Balance;
-
-	} else if (path[1] == "panwidth") {
-		_subtype = PanWidth;
-
-	} else if (path[1] == "pandirection") {
-		_subtype = PanDirection;
-
-	} else if (path[1] == "plugin") {
-		if (path.size() == 3 && rest.size() == 3) {
-			if (path[2] == "parameter") {
-				_subtype = PluginParameter;
-				_target.push_back (atoi (rest[1]));
-				_target.push_back (atoi (rest[2]));
-			} else {
-				return -1;
-			}
-		} else {
-			return -1;
-		}
-	} else if (path[1] == "send") {
-
-		if (path.size() == 3 && rest.size() == 2) {
-			if (path[2] == "gain") {
-				_subtype = SendGain;
-				_target.push_back (atoi (rest[1]));
-			} else {
-				return -1;
-			}
-		} else {
-			return -1;
-		}
-	}
-
-	return 0;
-}
-
-uint32_t
-ControllableDescriptor::rid() const
-{
-	if (banked()) {
-		return _rid + _bank_offset;
-	}
-
-	return _rid;
-}
-
-uint32_t
-ControllableDescriptor::target (uint32_t n) const
-{
-	if (n < _target.size()) {
-		return _target[n];
-	}
-
-	return 0;
-}
diff --git a/libs/pbd/convert.cc b/libs/pbd/convert.cc
index 6608910..dd43475 100644
--- a/libs/pbd/convert.cc
+++ b/libs/pbd/convert.cc
@@ -35,7 +35,7 @@
 
 #include "pbd/convert.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using std::string;
 using std::vector;
diff --git a/libs/pbd/cpus.cc b/libs/pbd/cpus.cc
index fb94b47..69421e5 100644
--- a/libs/pbd/cpus.cc
+++ b/libs/pbd/cpus.cc
@@ -43,10 +43,14 @@ hardware_concurrency()
 {
 #if defined(PTW32_VERSION) || defined(__hpux)
         return pthread_num_processors_np();
-#elif defined(__APPLE__) || defined(__FreeBSD__)
+#elif defined(__APPLE__)
         int count;
         size_t size=sizeof(count);
         return sysctlbyname("hw.physicalcpu",&count,&size,NULL,0)?0:count;
+#elif defined(__FreeBSD__)
+        int count;
+        size_t size=sizeof(count);
+        return sysctlbyname("hw.ncpu",&count,&size,NULL,0)?0:count;
 #elif defined(HAVE_UNISTD) && defined(_SC_NPROCESSORS_ONLN)
         int const count=sysconf(_SC_NPROCESSORS_ONLN);
         return (count>0)?count:0;
diff --git a/libs/pbd/crossthread.posix.cc b/libs/pbd/crossthread.posix.cc
index 72a4fad..5035bc4 100644
--- a/libs/pbd/crossthread.posix.cc
+++ b/libs/pbd/crossthread.posix.cc
@@ -29,11 +29,6 @@ CrossThreadChannel::CrossThreadChannel (bool non_blocking)
 
 CrossThreadChannel::~CrossThreadChannel ()
 {
-	if (receive_source) {
-		g_source_destroy (receive_source);
-		receive_source = 0;
-	}
-
 	if (receive_channel) {
                 g_io_channel_unref (receive_channel);
                 receive_channel = 0;
diff --git a/libs/pbd/debug.cc b/libs/pbd/debug.cc
index e6d4abc..419c5bf 100644
--- a/libs/pbd/debug.cc
+++ b/libs/pbd/debug.cc
@@ -28,7 +28,7 @@
 
 #include "pbd/debug.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using PBD::DebugBits;
@@ -56,6 +56,7 @@ DebugBits PBD::DEBUG::Configuration = PBD::new_debug_bit ("configuration");
 DebugBits PBD::DEBUG::UndoHistory = PBD::new_debug_bit ("undohistory");
 DebugBits PBD::DEBUG::Timing = PBD::new_debug_bit ("timing");
 DebugBits PBD::DEBUG::Threads = PBD::new_debug_bit ("threads");
+DebugBits PBD::DEBUG::Locale = PBD::new_debug_bit ("locale");
 
 /* These are debug bits that are used by backends. Since these are loaded dynamically,
    after command-line parsing, defining them in code that is part of the backend
diff --git a/libs/pbd/enums.cc b/libs/pbd/enums.cc
index e8bb807..fbeed72 100644
--- a/libs/pbd/enums.cc
+++ b/libs/pbd/enums.cc
@@ -39,11 +39,14 @@ setup_libpbd_enums ()
 
 	REGISTER_CLASS_ENUM (Controllable, Toggle);
 	REGISTER_CLASS_ENUM (Controllable, GainLike);
-	REGISTER (controllable_flags);
+	REGISTER_CLASS_ENUM (Controllable, RealTime);
+	REGISTER_CLASS_ENUM (Controllable, NotAutomatable);
+	REGISTER_BITS (controllable_flags);
 
 	REGISTER_CLASS_ENUM (Controllable, InverseGroup);
 	REGISTER_CLASS_ENUM (Controllable, UseGroup);
 	REGISTER_CLASS_ENUM (Controllable, NoGroup);
+	REGISTER_CLASS_ENUM (Controllable, ForGroup);
 	REGISTER (controllable_group_disposition);
 
 }
diff --git a/libs/pbd/enumwriter.cc b/libs/pbd/enumwriter.cc
index ddc8215..7b3aba9 100644
--- a/libs/pbd/enumwriter.cc
+++ b/libs/pbd/enumwriter.cc
@@ -31,7 +31,7 @@
 using namespace std;
 using namespace PBD;
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 EnumWriter* EnumWriter::_instance = 0;
 map<string,string> EnumWriter::hack_table;
diff --git a/libs/pbd/event_loop.cc b/libs/pbd/event_loop.cc
index 08f3c2e..ea3f7a4 100644
--- a/libs/pbd/event_loop.cc
+++ b/libs/pbd/event_loop.cc
@@ -27,7 +27,7 @@
 #include "pbd/error.h"
 #include "pbd/stacktrace.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace PBD;
 using namespace std;
diff --git a/libs/pbd/file_utils.cc b/libs/pbd/file_utils.cc
index 6cf43f3..26f80f9 100644
--- a/libs/pbd/file_utils.cc
+++ b/libs/pbd/file_utils.cc
@@ -57,7 +57,7 @@
 #include "pbd/scoped_file_descriptor.h"
 #include "pbd/stl_delete.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 
diff --git a/libs/pbd/fpu.cc b/libs/pbd/fpu.cc
index 9838b45..7c3e097 100644
--- a/libs/pbd/fpu.cc
+++ b/libs/pbd/fpu.cc
@@ -33,7 +33,7 @@
 #include "pbd/fpu.h"
 #include "pbd/error.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace PBD;
 using namespace std;
@@ -48,32 +48,25 @@ FPU* FPU::_instance (0);
 static void
 __cpuid(int regs[4], int cpuid_leaf)
 {
-        int eax, ebx, ecx, edx;
         asm volatile (
 #if defined(__i386__)
 	        "pushl %%ebx;\n\t"
 #endif
-	        "movl %4, %%eax;\n\t"
 	        "cpuid;\n\t"
-	        "movl %%eax, %0;\n\t"
-	        "movl %%ebx, %1;\n\t"
-	        "movl %%ecx, %2;\n\t"
-	        "movl %%edx, %3;\n\t"
+	        "movl %%eax, (%1);\n\t"
+	        "movl %%ebx, 4(%1);\n\t"
+	        "movl %%ecx, 8(%1);\n\t"
+	        "movl %%edx, 12(%1);\n\t"
 #if defined(__i386__)
 	        "popl %%ebx;\n\t"
 #endif
-	        :"=m" (eax), "=m" (ebx), "=m" (ecx), "=m" (edx)
-	        :"r" (cpuid_leaf)
-	        :"%eax",
+	        :"=a" (cpuid_leaf) /* %eax clobbered by CPUID */
+	        :"S" (regs), "a" (cpuid_leaf)
+	        :
 #if !defined(__i386__)
 	         "%ebx",
 #endif
-	         "%ecx", "%edx");
-
-        regs[0] = eax;
-        regs[1] = ebx;
-        regs[2] = ecx;
-        regs[3] = edx;
+	         "%ecx", "%edx", "memory");
 }
 
 #endif /* !PLATFORM_WINDOWS */
@@ -143,6 +136,11 @@ FPU::FPU ()
 		error << _("FPU object instantiated more than once") << endmsg;
 	}
 
+	if (getenv("ARDOUR_FPU_FLAGS")) {
+		_flags = Flags (atoi (getenv("ARDOUR_FPU_FLAGS")));
+		return;
+	}
+
 #if !( (defined __x86_64__) || (defined __i386__) || (defined _M_X64) || (defined _M_IX86) ) // !ARCH_X86
 	/* Non-Intel architecture, nothing to do here */
 	return;
diff --git a/libs/pbd/i18n.h b/libs/pbd/i18n.h
deleted file mode 100644
index 35516fa..0000000
--- a/libs/pbd/i18n.h
+++ /dev/null
@@ -1,12 +0,0 @@
-#ifndef __i18n_h__
-#define __i18n_h__
-
-#include "pbd/compose.h"
-#include "gettext.h"
-
-#define _(Text) dgettext (PACKAGE, Text)
-#define N_(Text) gettext_noop (Text)
-#define X_(Text) (Text)
-#define I18N(Array) PBD::internationalize (PACKAGE, Array)
-
-#endif // __i18n_h__
diff --git a/libs/pbd/locale_guard.cc b/libs/pbd/locale_guard.cc
index 4ec6498..93ff11e 100644
--- a/libs/pbd/locale_guard.cc
+++ b/libs/pbd/locale_guard.cc
@@ -19,36 +19,113 @@
 
 #include <stdlib.h>
 #include <string.h>
+#include <assert.h>
 #include <locale.h>
 
+#include "pbd/compose.h"
+#include "pbd/debug.h"
+#include "pbd/error.h"
 #include "pbd/locale_guard.h"
 
 using namespace PBD;
 
-// try to avoid calling setlocale() recursively.  this is not thread-safe.
-std::string PBD::LocaleGuard::current;
+/* Neither C nor C++ pick up a user's preferred locale choice without the
+ * application actively taking steps to make this happen.
+ *
+ * For C: setlocale (LC_ALL, "");
+ * For C++ (assuming that the C version was called):
+ *      std::locale::global (std::locale (setlocale (LC_ALL, 0)));
+ *
+ * The application needs to make these calls, probably in main().
+ *
+ * Setting the C++ locale will change the C locale, but not the other way 'round.
+ * and some plugin may change either behind our back.
+ */
 
-LocaleGuard::LocaleGuard (const char* str)
-	: old(0)
+LocaleGuard::LocaleGuard ()
+	: old_c_locale (0)
 {
-	if (current != str) {
-		old = strdup (setlocale (LC_NUMERIC, NULL));
-		if (strcmp (old, str)) {
-			if (setlocale (LC_NUMERIC, str)) {
-				current = str;
-			}
+	/* A LocaleGuard object ensures that the
+	 * LC_NUMERIC/std::locale::numeric aspect of the C and C++ locales are
+	 * set to "C" during its lifetime, so that printf/iostreams use a
+	 * portable format for numeric output (i.e. 1234.5 is always 1234.5 and
+	 * not sometimes 1234,5, as it would be in fr or de locales)
+	 */
+
+	char const * const current_c_locale = setlocale (LC_NUMERIC, 0);
+
+	if (strcmp ("C", current_c_locale) != 0) {
+
+		old_c_locale = strdup (current_c_locale);
+
+		try {
+			/* set the C++ global/default locale to whatever we are using
+			 * now, but with "C" numeric handling.
+			 *
+			 * this also sets the C locale, so no additional call to setlocale() is required.
+			 */
+
+			std::locale::global (std::locale (old_cpp_locale, "C", std::locale::numeric));
+			pre_cpp_locale = std::locale();
+			DEBUG_TRACE (DEBUG::Locale, string_compose ("LG: change C & C++ locale from '%1' => %2\n", old_cpp_locale.name(), pre_cpp_locale.name()));
+
+		} catch (...) {
+			/* Apple in particular have historically done a
+			 * terrible job supporting setlocale and even more so
+			 * with the C++ API. Using any locale other than "C" or
+			 * "POSIX" will fail, and in the case of the C++ API, 
+			 * will throw an exception. In that case, just try to
+			 * use setlocale() to reset *only* the numeric aspect
+			 * of the current locale settings back to "C", which is
+			 * likely to work everywhere.
+			 */
+
+			setlocale (LC_NUMERIC, "C");
+			pre_cpp_locale = std::locale();
+			DEBUG_TRACE (DEBUG::Locale, string_compose ("LG: C++ locale API failed, change just C locale from '%1' => 'C' (C++ locale is %2)\n", old_c_locale, pre_cpp_locale.name()));
 		}
+
 	}
 }
 
 LocaleGuard::~LocaleGuard ()
 {
-	if (old) {
-		if (setlocale (LC_NUMERIC, old)) {
-			current = old;
+	char const * current_c_locale = setlocale (LC_NUMERIC, 0);
+	std::locale current_cpp_locale;
+
+	if (current_cpp_locale != pre_cpp_locale) {
+
+		PBD::warning << string_compose ("LocaleGuard: someone (a plugin) changed the C++ locale from\n\t%1\nto\n\t%2\n, expect non-portable session files. Decimal OK ? %2",
+		                              old_cpp_locale.name(), current_cpp_locale.name(),
+		                              (std::use_facet<std::numpunct<char> >(std::locale()).decimal_point() == '.'))
+		           << endmsg;
+
+		try {
+			/* this resets C & C++ locales */
+			std::locale::global (old_cpp_locale);
+			DEBUG_TRACE (DEBUG::Locale, string_compose ("LG: restore C & C++ locale: '%1'\n", std::locale().name()));
+		} catch (...) {
+			/* see comments in the constructor regarding the
+			 * exception.
+			 *
+			 * This should restore restore numeric handling back to
+			 * the default (which may reflect user
+			 * preferences). This probably can't fail, because
+			 * old_c_locale was already in use during the
+			 * constructor for this object.
+			 *
+			 * Still ... Apple ... locale support ... just sayin' ....
+			 */
+			setlocale (LC_NUMERIC, old_c_locale);
+			DEBUG_TRACE (DEBUG::Locale, string_compose ("LG: C++ locale API failed, restore C locale from %1 to\n'%2'\n(C++ is '%3')\n", current_c_locale, old_c_locale, std::locale().name()));
 		}
 
-		free (old);
+	} else if (old_c_locale && (strcmp (current_c_locale, old_c_locale) != 0)) {
+
+		/* reset only the C locale */
+		setlocale (LC_NUMERIC, old_c_locale);
+		DEBUG_TRACE (DEBUG::Locale, string_compose ("LG: restore C locale from %1 to\n'%2'\n(C++ is '%3')\n", current_c_locale, old_c_locale, std::locale().name()));
 	}
-}
 
+	free (const_cast<char*> (old_c_locale));
+}
diff --git a/libs/pbd/malign.cc b/libs/pbd/malign.cc
index c48544d..59c6c44 100644
--- a/libs/pbd/malign.cc
+++ b/libs/pbd/malign.cc
@@ -25,7 +25,7 @@
 #include "pbd/malign.h"
 #include "pbd/error.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace PBD;
 
diff --git a/libs/pbd/msvc/msvc_pbd.cc b/libs/pbd/msvc/msvc_pbd.cc
index ab79d8f..f49ac53 100644
--- a/libs/pbd/msvc/msvc_pbd.cc
+++ b/libs/pbd/msvc/msvc_pbd.cc
@@ -262,6 +262,47 @@ trunc(double x)
 	return (floor(x));
 }
 
+#if defined(_MSC_VER) && (_MSC_VER < 1800)
+//***************************************************************
+//
+//	expm1()
+//
+// Emulates C99 expm1() using exp().
+//
+//	Returns:
+//
+//    On Success: (('e' raised to the power of 'x') - 1)
+//                (e.g. expm1(1) == 1.7182818).
+//    On Failure: None, except that calling exp(x) should generate
+//                an appropriate error for us (such as INF etc).
+//
+LIBPBD_API double PBD_APICALLTYPE
+expm1(double x)
+{
+	return (exp(x) - (double)1.0);
+}
+
+//***************************************************************
+//
+//	log1p()
+//
+// Emulates C99 log1p() using log().
+//
+//	Returns:
+//
+//    On Success: The natural logarithm of (1 + x)
+//                (e.g. log1p(1) == 0.69314718).
+//    On Failure: None, except that calling log(x) should generate
+//                an appropriate error for us (such as ERANGE etc).
+//
+LIBPBD_API double PBD_APICALLTYPE
+log1p(double x)
+{
+	return (log(x + (double)1.0));
+}
+#endif
+
+#if defined(_MSC_VER) && (_MSC_VER < 1900)
 //***************************************************************
 //
 //	log2()
@@ -280,6 +321,7 @@ log2(double x)
 {
 	return (log(x) / log((double)2.0));
 }
+#endif
 
 namespace PBD {
 
diff --git a/libs/pbd/msvc/msvc_poll.cc b/libs/pbd/msvc/msvc_poll.cc
index 921638a..c18e706 100644
--- a/libs/pbd/msvc/msvc_poll.cc
+++ b/libs/pbd/msvc/msvc_poll.cc
@@ -71,7 +71,7 @@ int   ret = 0;
 
 					if (0 > pos)
 					{
-						// An error occured ('errno' should have been set by '_tell()')
+						// An error occurred ('errno' should have been set by '_tell()')
 						ret = (-1);
 						fds[loop].revents = POLLERR;
 						if (fds[loop].events & POLLRDNORM)
diff --git a/libs/pbd/pbd.cc b/libs/pbd/pbd.cc
index 13383c2..ab0f668 100644
--- a/libs/pbd/pbd.cc
+++ b/libs/pbd/pbd.cc
@@ -42,7 +42,7 @@
 #include "pbd/windows_mmcss.h"
 #endif
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 extern void setup_libpbd_enums ();
 
diff --git a/libs/pbd/pbd/.DS_Store b/libs/pbd/pbd/.DS_Store
deleted file mode 100644
index 5008ddf..0000000
Binary files a/libs/pbd/pbd/.DS_Store and /dev/null differ
diff --git a/libs/pbd/pbd/abstract_ui.cc b/libs/pbd/pbd/abstract_ui.cc
index 40b4ea8..6f03f25 100644
--- a/libs/pbd/pbd/abstract_ui.cc
+++ b/libs/pbd/pbd/abstract_ui.cc
@@ -26,7 +26,7 @@
 #include "pbd/failed_constructor.h"
 #include "pbd/debug.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 #ifdef COMPILER_MSVC
 #include <ardourext/misc.h>  // Needed for 'DECLARE_DEFAULT_COMPARISONS'. Objects in an STL container can be
@@ -444,7 +444,7 @@ AbstractUI<RequestObject>::call_slot (InvalidationRecord* invalidation, const bo
 template<typename RequestObject> void*
 AbstractUI<RequestObject>::request_buffer_factory (uint32_t num_requests)
 {
-	RequestBuffer*  mcr = new RequestBuffer (num_requests);
+	RequestBuffer*  mcr = new RequestBuffer (num_requests); // leaks
 	per_thread_request_buffer.set (mcr);
 	return mcr;
 }
diff --git a/libs/pbd/pbd/command.h b/libs/pbd/pbd/command.h
index 337140e..a9b313f 100644
--- a/libs/pbd/pbd/command.h
+++ b/libs/pbd/pbd/command.h
@@ -28,6 +28,7 @@
 #include "pbd/signals.h"
 #include "pbd/statefuldestructible.h"
 
+/** Base class for Undo/Redo commands and changesets */
 class LIBPBD_API Command : public PBD::StatefulDestructible, public PBD::ScopedConnectionList
 {
 public:
diff --git a/libs/pbd/pbd/controllable.h b/libs/pbd/pbd/controllable.h
index 51c9c64..4168bbc 100644
--- a/libs/pbd/pbd/controllable.h
+++ b/libs/pbd/pbd/controllable.h
@@ -37,7 +37,7 @@ class XMLNode;
 
 namespace PBD {
 
-/* This is a pure virtual class to represent a scalar control.
+/** This is a pure virtual class to represent a scalar control.
  *
  * Note that it contains no storage/state for the controllable thing that it
  * represents. Derived classes must provide set_value()/get_value() methods,
@@ -49,12 +49,13 @@ namespace PBD {
  * as a control whose value can range between 0 and 1.0.
  *
  */
-
 class LIBPBD_API Controllable : public PBD::StatefulDestructible {
   public:
 	enum Flag {
 		Toggle = 0x1,
 		GainLike = 0x2,
+		RealTime = 0x4,
+		NotAutomatable = 0x8,
 	};
 
 	Controllable (const std::string& name, Flag f = Flag (0));
@@ -84,7 +85,11 @@ class LIBPBD_API Controllable : public PBD::StatefulDestructible {
 	enum GroupControlDisposition {
 		InverseGroup,  /* set all controls in the same "group" as this one */
 		NoGroup,     /* set only this control */
-		UseGroup     /* use group settings to decide which group controls are altered */
+		UseGroup,     /* use group settings to decide which group controls are altered */
+		ForGroup     /* this setting is being done *for* the group
+		                (i.e. UseGroup was set in the callchain
+		                somewhere).
+		             */
 	};
 
 	/** Get and Set `internal' value
@@ -123,7 +128,7 @@ class LIBPBD_API Controllable : public PBD::StatefulDestructible {
 
 	static PBD::Signal1<void,Controllable*> Destroyed;
 
-	PBD::Signal0<void> Changed;
+	PBD::Signal2<void,bool,PBD::Controllable::GroupControlDisposition> Changed;
 
 	int set_state (const XMLNode&, int version);
 	XMLNode& get_state ();
diff --git a/libs/pbd/pbd/controllable_descriptor.h b/libs/pbd/pbd/controllable_descriptor.h
deleted file mode 100644
index e4366c8..0000000
--- a/libs/pbd/pbd/controllable_descriptor.h
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
-    Copyright (C) 2009 Paul Davis
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-
-#ifndef __pbd_controllable_descriptor_h__
-#define __pbd_controllable_descriptor_h__
-
-#include <vector>
-#include <string>
-#include <stdint.h>
-
-#include "pbd/libpbd_visibility.h"
-
-namespace PBD {
-
-class LIBPBD_API ControllableDescriptor {
-public:
-    enum TopLevelType {
-	    RemoteControlID,
-	    NamedRoute
-    };
-
-    enum SubType {
-	    Gain,
-	    Trim,
-	    Solo,
-	    Mute,
-	    Recenable,
-	    PanDirection,
-	    PanWidth,
-	    PanElevation,
-	    Balance,
-	    SendGain,
-	    PluginParameter
-    };
-
-    ControllableDescriptor ()
-	    : _top_level_type (RemoteControlID)
-	    , _subtype (Gain)
-	    , _rid (0)
-	    , _banked (false)
-	    , _bank_offset (0)
-    {}
-
-    int set (const std::string&);
-
-    /* it is only valid to call top_level_name() if top_level_type() returns
-       NamedRoute
-    */
-
-    TopLevelType top_level_type() const { return _top_level_type; }
-    const std::string& top_level_name() const { return _top_level_name; }
-
-    SubType subtype() const { return _subtype; }
-
-    uint32_t rid() const;
-    uint32_t target (uint32_t n) const;
-    bool banked() const { return _banked; }
-
-    void set_bank_offset (uint32_t o) { _bank_offset = o; }
-
-private:
-    TopLevelType          _top_level_type;
-    SubType               _subtype;
-    std::string           _top_level_name;
-    uint32_t              _rid;
-    std::vector<uint32_t> _target;
-    uint32_t              _banked;
-    uint32_t              _bank_offset;
-};
-
-}
-
-#endif /* __pbd_controllable_descriptor_h__ */
diff --git a/libs/pbd/pbd/debug.h b/libs/pbd/pbd/debug.h
index 3696e7a..8db198e 100644
--- a/libs/pbd/pbd/debug.h
+++ b/libs/pbd/pbd/debug.h
@@ -58,6 +58,7 @@ namespace PBD {
 		LIBPBD_API extern DebugBits UndoHistory;
 		LIBPBD_API extern DebugBits Timing;
 		LIBPBD_API extern DebugBits Threads;
+		LIBPBD_API extern DebugBits Locale;
 
 		/* See notes in ../debug.cc on why these are defined here */
 
diff --git a/libs/pbd/pbd/floating.h b/libs/pbd/pbd/floating.h
index 86ab4a6..d7d6349 100644
--- a/libs/pbd/pbd/floating.h
+++ b/libs/pbd/pbd/floating.h
@@ -28,6 +28,7 @@
 
 #include <stdint.h>
 
+#include <cstdlib> // abs(int)
 #include <cmath>
 
 #include "pbd/libpbd_visibility.h"
diff --git a/gtk2_ardour/i18n.h b/libs/pbd/pbd/i18n.h
similarity index 100%
rename from gtk2_ardour/i18n.h
rename to libs/pbd/pbd/i18n.h
diff --git a/libs/pbd/pbd/id.h b/libs/pbd/pbd/id.h
index 1f33e6d..5316e7c 100644
--- a/libs/pbd/pbd/id.h
+++ b/libs/pbd/pbd/id.h
@@ -29,6 +29,7 @@
 
 namespace PBD {
 
+/** a unique ID to identify objects numerically */
 class LIBPBD_API ID {
   public:
 	ID ();
diff --git a/libs/pbd/pbd/locale_guard.h b/libs/pbd/pbd/locale_guard.h
index dc82ab4..b10e4d3 100644
--- a/libs/pbd/pbd/locale_guard.h
+++ b/libs/pbd/pbd/locale_guard.h
@@ -22,20 +22,20 @@
 
 #include "pbd/libpbd_visibility.h"
 
-#include <string>
+#include <locale>
 
 namespace PBD {
 
 struct LIBPBD_API LocaleGuard {
-    LocaleGuard (const char*);
-    ~LocaleGuard ();
-
-	static std::string current;
-
-private:
-    char* old;
+  public:
+	LocaleGuard ();
+	~LocaleGuard ();
+
+  private:
+	std::locale old_cpp_locale;
+	std::locale pre_cpp_locale;
+	char const * old_c_locale;
 };
-
 }
 
 #endif /* __pbd_locale_guard__ */
diff --git a/libs/pbd/pbd/msvc_pbd.h b/libs/pbd/pbd/msvc_pbd.h
index 7529619..5a6b550 100644
--- a/libs/pbd/pbd/msvc_pbd.h
+++ b/libs/pbd/pbd/msvc_pbd.h
@@ -232,7 +232,15 @@ LIBPBD_API ssize_t			PBD_APICALLTYPE pwrite(int handle, const void *buf, size_t
 LIBPBD_API int				PBD_APICALLTYPE poll(struct pollfd *fds, nfds_t nfds, int timeout);
 LIBPBD_API double			PBD_APICALLTYPE round(double x);
 LIBPBD_API double			PBD_APICALLTYPE trunc(double x);
-LIBPBD_API double			PBD_APICALLTYPE log2(double x);
+
+#if defined(_MSC_VER) && (_MSC_VER < 1800)
+LIBPBD_API double			PBD_APICALLTYPE expm1(double x);
+LIBPBD_API double			PBD_APICALLTYPE log1p(double x);
+#endif
+
+#if defined(_MSC_VER) && (_MSC_VER < 1900)
+LIBPBD_API double			PBD_APICALLTYPE log2 (double x);
+#endif
 
 namespace PBD {
 
diff --git a/libs/pbd/pbd/natsort.h b/libs/pbd/pbd/natsort.h
new file mode 100644
index 0000000..31c1dd7
--- /dev/null
+++ b/libs/pbd/pbd/natsort.h
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2016 Robin Gareus <robin at gareus.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#ifndef PBD_NATSORT
+#define PBD_NATSORT
+
+#include <ctype.h>
+#include <stdlib.h>
+
+namespace PBD {
+
+inline bool
+naturally_less (const char* a, const char* b)
+{
+	const char* d_a = NULL;
+	const char* d_b = NULL;
+
+	for (;*a && *b; ++a, ++b) {
+		if (isdigit (*a) && isdigit (*b) && !d_a) {
+			d_a = a; d_b = b;
+			continue;
+		}
+		if (d_a) {
+			const int ia = atoi (d_a);
+			const int ib = atoi (d_b);
+			if (ia != ib) {
+				return ia < ib;
+			}
+		}
+		d_a = d_b = NULL;
+		if (*a == *b) {
+			continue;
+		}                                                                                                                                                                                          
+		return *a < *b;
+	}
+
+	if (d_a) {
+		return atoi (d_a) < atoi (d_b);
+	}
+
+	/* if we reach here, either strings are same length and equal
+	 * or one is longer than the other.
+	 */
+
+	if (*a) { return false; }
+	if (*b) { return true; }
+	return false; // equal
+}
+
+} // namespace PBD
+
+#endif // PBD_NATSORT
diff --git a/libs/pbd/pbd/properties.h b/libs/pbd/pbd/properties.h
index 0ba42b8..c97b472 100644
--- a/libs/pbd/pbd/properties.h
+++ b/libs/pbd/pbd/properties.h
@@ -236,8 +236,8 @@ public:
 		if (i == children.end()) {
 			return 0;
 		}
-		XMLProperty* from = (*i)->property ("from");
-		XMLProperty* to = (*i)->property ("to");
+		XMLProperty const * from = (*i)->property ("from");
+		XMLProperty const * to = (*i)->property ("to");
 
 		if (!from || !to) {
 			return 0;
diff --git a/libs/pbd/pbd/reallocpool.h b/libs/pbd/pbd/reallocpool.h
new file mode 100644
index 0000000..d6f8c5c
--- /dev/null
+++ b/libs/pbd/pbd/reallocpool.h
@@ -0,0 +1,120 @@
+/*
+ * Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ *
+ */
+#ifndef _reallocpool_h_
+#define _reallocpool_h_
+
+#ifndef NDEBUG
+//#define RAP_WITH_CALL_STATS // collect statistics on calls counts (light)
+//#define RAP_WITH_HISTOGRAM 513 // collect statistic about allocation size (not bad)
+//#define RAP_WITH_SEGMENT_STATS // collect statistics (expensive)
+#endif
+
+#ifndef RAP_BLOCKSIZE
+#define RAP_BLOCKSIZE 7 // [bytes] power-of-two minus one (optional)
+#endif
+
+#ifdef RAP_WITH_SEGMENT_STATS
+#define RAP_WITH_CALL_STATS
+#endif
+
+#include <string>
+
+#ifndef LIBPBD_API
+#include "pbd/libpbd_visibility.h"
+#endif
+
+namespace PBD {
+
+class LIBPBD_API ReallocPool
+{
+public:
+	ReallocPool (std::string name, size_t bytes);
+	~ReallocPool ();
+
+	void set_name (const std::string& n) { _name = n; }
+
+	static void * lalloc (void* pool, void *ptr, size_t oldsize, size_t newsize) {
+		return static_cast<ReallocPool*>(pool)->_realloc (ptr, oldsize, newsize);
+	}
+
+	void * malloc (size_t size) {
+		return _realloc (NULL, 0, size);
+	}
+
+	void free (void *ptr) {
+		if (ptr) _realloc (ptr, 0, 0);
+	}
+
+	void * realloc (void *ptr, size_t newsize) {
+		return _realloc (ptr, _asize(ptr), newsize);
+	}
+
+	void printstats ();
+	void dumpsegments ();
+
+#ifdef RAP_WITH_CALL_STATS
+	size_t mem_used () const { return _cur_used; }
+#endif
+
+private:
+	std::string _name;
+	size_t _poolsize;
+	char *_pool;
+	char *_mru;
+
+#ifdef RAP_WITH_SEGMENT_STATS
+	size_t _cur_avail;
+	size_t _cur_allocated;
+	size_t _max_allocated;
+	size_t _seg_cur_count;
+	size_t _seg_max_count;
+	size_t _seg_max_used;
+	size_t _seg_max_avail;
+	void collect_segment_stats ();
+#endif
+#ifdef RAP_WITH_CALL_STATS
+	size_t _n_alloc;
+	size_t _n_grow;
+	size_t _n_shrink;
+	size_t _n_free;
+	size_t _n_noop;
+	size_t _n_oom;
+	size_t _cur_used; // cheaper _cur_allocated
+	size_t _max_used; // cheaper _max_allocated
+#endif
+#ifdef RAP_WITH_HISTOGRAM
+	size_t _hist_alloc [RAP_WITH_HISTOGRAM];
+	size_t _hist_free [RAP_WITH_HISTOGRAM];
+	size_t _hist_grow [RAP_WITH_HISTOGRAM];
+	size_t _hist_shrink [RAP_WITH_HISTOGRAM];
+
+	unsigned int hist_bin (size_t s) const;
+	void print_histogram (size_t const * const histogram) const;
+#endif
+
+	void *_realloc (void *ptr, size_t oldsize, size_t newsize);
+	void *_malloc (size_t);
+	void _free (void *ptr);
+	void _shrink (void *, size_t);
+	size_t _asize (void *);
+	void consolidate_ptr (char *);
+};
+
+} /* namespace */
+#endif // _reallocpool_h_
diff --git a/libs/pbd/pbd/ringbufferNPT.h b/libs/pbd/pbd/ringbufferNPT.h
index f01a6f3..267adf8 100644
--- a/libs/pbd/pbd/ringbufferNPT.h
+++ b/libs/pbd/pbd/ringbufferNPT.h
@@ -59,6 +59,7 @@ class /*LIBPBD_API*/ RingBufferNPT
 
 	size_t  read  (T *dest, size_t cnt);
 	size_t  write (const T *src, size_t cnt);
+	size_t  write_one (const T src);
 
 	struct rw_vector {
 	    T *buf[2];
@@ -198,6 +199,12 @@ RingBufferNPT<T>::write (const T *src, size_t cnt)
         return to_write;
 }
 
+template<class T> /*LIBPBD_API*/ size_t
+RingBufferNPT<T>::write_one (const T src)
+{
+	return write (&src, 1);
+}
+
 template<class T> /*LIBPBD_API*/ void
 RingBufferNPT<T>::get_read_vector (typename RingBufferNPT<T>::rw_vector *vec)
 {
diff --git a/libs/pbd/pbd/signals.h b/libs/pbd/pbd/signals.h
index 97cfa65..42727b7 100644
--- a/libs/pbd/pbd/signals.h
+++ b/libs/pbd/pbd/signals.h
@@ -20,6 +20,8 @@
 #ifndef __pbd_signals_h__
 #define __pbd_signals_h__
 
+#include <csignal>
+
 #include <list>
 #include <map>
 
@@ -67,7 +69,7 @@ public:
 #endif
 
 protected:
-        Glib::Threads::Mutex _mutex;
+	mutable Glib::Threads::Mutex _mutex;
 #ifdef DEBUG_PBD_SIGNAL_CONNECTIONS
 	bool _debug_connection;
 #endif
diff --git a/libs/pbd/pbd/signals.py b/libs/pbd/pbd/signals.py
index 9495b70..fbcf1d4 100644
--- a/libs/pbd/pbd/signals.py
+++ b/libs/pbd/pbd/signals.py
@@ -268,11 +268,17 @@ def signal(f, n, v):
     print("\t}", file=f)
 
     print("""
-	bool empty () {
+	bool empty () const {
 		Glib::Threads::Mutex::Lock lm (_mutex);
 		return _slots.empty ();
 	}
 """, file=f)
+    print("""
+	bool size () const {
+		Glib::Threads::Mutex::Lock lm (_mutex);
+		return _slots.size ();
+	}
+""", file=f)
 
     if v:
         tp = comma_separated(["void"] + An)
@@ -286,14 +292,15 @@ def signal(f, n, v):
     print("""
 	boost::shared_ptr<Connection> _connect (slot_function_type f)
 	{
+		boost::shared_ptr<Connection> c (new Connection (this));
+		Glib::Threads::Mutex::Lock lm (_mutex);
+		_slots[c] = f;
 #ifdef DEBUG_PBD_SIGNAL_CONNECTIONS
                 if (_debug_connection) {
+                        std::cerr << "+++++++ CONNECT " << this << " size now " << _slots.size() << std::endl;
                         PBD::stacktrace (std::cerr, 10);
                 }
 #endif
-		boost::shared_ptr<Connection> c (new Connection (this));
-		Glib::Threads::Mutex::Lock lm (_mutex);
-		_slots[c] = f;
 		return c;
 	}""", file=f)
 
@@ -302,6 +309,12 @@ def signal(f, n, v):
 	{
 		Glib::Threads::Mutex::Lock lm (_mutex);
 		_slots.erase (c);
+#ifdef DEBUG_PBD_SIGNAL_CONNECTIONS
+                if (_debug_connection) {
+                        std::cerr << "------- DISCCONNECT " << this << " size now " << _slots.size() << std::endl;
+                        PBD::stacktrace (std::cerr, 10);
+                }
+#endif
 	}
 };    
 """, file=f)
diff --git a/libs/pbd/pbd/statefuldestructible.h b/libs/pbd/pbd/statefuldestructible.h
index 501633d..4c321d2 100644
--- a/libs/pbd/pbd/statefuldestructible.h
+++ b/libs/pbd/pbd/statefuldestructible.h
@@ -26,6 +26,7 @@
 
 namespace PBD {
 
+/** Base class for objects with saveable and undoable state with destruction notification */
 class LIBPBD_API StatefulDestructible : public Stateful, public Destructible
 {
 };
diff --git a/libs/pbd/pbd/system_exec.h b/libs/pbd/pbd/system_exec.h
index d5b14c8..a8a30ba 100644
--- a/libs/pbd/pbd/system_exec.h
+++ b/libs/pbd/pbd/system_exec.h
@@ -37,6 +37,9 @@
 #undef interface // VKamyshniy: to avoid "include/giomm-2.4/giomm/dbusmessage.h:270:94: error: expected ',' or '...' before 'struct'"
 #endif
 
+#else // posix
+#include <sys/types.h>
+#include <sys/wait.h> /* WNOHANG is part of the exposed API */
 #endif
 
 #include <string>
diff --git a/libs/pbd/pbd/tlsf.h b/libs/pbd/pbd/tlsf.h
new file mode 100644
index 0000000..30e53c1
--- /dev/null
+++ b/libs/pbd/pbd/tlsf.h
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ *
+ */
+#ifndef _tlsf_h_
+#define _tlsf_h_
+
+#include <string>
+
+#ifndef LIBPBD_API
+#include "pbd/libpbd_visibility.h"
+#endif
+
+namespace PBD {
+
+class LIBPBD_API TLSF
+{
+public:
+	TLSF (std::string name, size_t bytes);
+	~TLSF ();
+
+	void set_name (const std::string& n) { _name = n; }
+
+	static void * lalloc (void* pool, void* ptr, size_t /* oldsize*/, size_t newsize) {
+		return static_cast<TLSF*>(pool)->_realloc (ptr, newsize);
+	}
+
+	void* malloc (size_t size) { return _malloc (size); }
+
+	void* realloc (void *ptr, size_t newsize) { return _realloc (ptr, newsize); }
+
+	void free (void* ptr) { _free (ptr); }
+
+	size_t get_used_size () const;
+	size_t get_max_size () const;
+
+private:
+	std::string _name;
+	char*_mp;
+
+	void* _malloc (size_t);
+	void* _realloc (void *, size_t);
+	void  _free (void *);
+};
+
+} /* namespace */
+#endif // _reallocpool_h_
diff --git a/libs/pbd/pbd/xml++.h b/libs/pbd/pbd/xml++.h
index 8e0e015..f0956ed 100644
--- a/libs/pbd/pbd/xml++.h
+++ b/libs/pbd/pbd/xml++.h
@@ -28,7 +28,7 @@
  */
 
 #include <string>
-#include <list>
+#include <vector>
 #include <map>
 #include <cstdio>
 #include <cstdarg>
@@ -43,14 +43,14 @@ class XMLTree;
 class XMLNode;
 class XMLProperty;
 
-typedef std::list<XMLNode *>                   XMLNodeList;
-typedef std::list<boost::shared_ptr<XMLNode> > XMLSharedNodeList;
-typedef XMLNodeList::iterator                  XMLNodeIterator;
-typedef XMLNodeList::const_iterator            XMLNodeConstIterator;
-typedef std::list<XMLProperty*>                XMLPropertyList;
-typedef XMLPropertyList::iterator              XMLPropertyIterator;
-typedef XMLPropertyList::const_iterator        XMLPropertyConstIterator;
-typedef std::map<std::string, XMLProperty*>    XMLPropertyMap;
+typedef std::vector<XMLNode *>                   XMLNodeList;
+typedef std::vector<boost::shared_ptr<XMLNode> > XMLSharedNodeList;
+typedef XMLNodeList::iterator                    XMLNodeIterator;
+typedef XMLNodeList::const_iterator              XMLNodeConstIterator;
+typedef std::vector<XMLProperty*>                XMLPropertyList;
+typedef XMLPropertyList::iterator                XMLPropertyIterator;
+typedef XMLPropertyList::const_iterator          XMLPropertyConstIterator;
+typedef std::map<std::string, XMLProperty*>      XMLPropertyMap;
 
 class LIBPBD_API XMLTree {
 public:
@@ -117,10 +117,12 @@ public:
 	std::string attribute_value();
 
 	const XMLPropertyList& properties() const { return _proplist; }
-	XMLProperty*       property(const char*);
-	XMLProperty*       property(const std::string&);
-        const XMLProperty* property(const char* n)   const { return const_cast<XMLNode*>(this)->property(n); }
-        const XMLProperty* property(const std::string& n) const { return const_cast<XMLNode*>(this)->property(n); }
+	XMLProperty const *    property(const char*) const;
+	XMLProperty const *    property(const std::string&) const;
+	XMLProperty *    property(const char*);
+	XMLProperty *    property(const std::string&);
+
+	bool has_property_with_value (const std::string&, const std::string&) const;
 
 	XMLProperty* add_property(const char* name, const std::string& value);
 	XMLProperty* add_property(const char* name, const char* value = "");
diff --git a/libs/pbd/pthread_utils.cc b/libs/pbd/pthread_utils.cc
index 7cd25e4..5daa60a 100644
--- a/libs/pbd/pthread_utils.cc
+++ b/libs/pbd/pthread_utils.cc
@@ -146,7 +146,7 @@ pthread_set_name (const char *str)
 {
 	/* copy string and delete it when exiting */
 
-	thread_name.set (strdup (str));
+	thread_name.set (strdup (str)); // leaks
 }
 
 const char *
diff --git a/libs/pbd/reallocpool.cc b/libs/pbd/reallocpool.cc
new file mode 100644
index 0000000..0bf37f3
--- /dev/null
+++ b/libs/pbd/reallocpool.cc
@@ -0,0 +1,469 @@
+/*
+ * Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+
+#include <stdlib.h>
+#include <string.h>
+#include <cstdio>
+
+#ifndef PLATFORM_WINDOWS
+#include <sys/mman.h>
+#endif
+
+#include "pbd/reallocpool.h"
+
+#ifdef RAP_WITH_SEGMENT_STATS
+#include <assert.h>
+#define STATS_segment collect_segment_stats();
+#define ASSERT assert
+#else
+#define STATS_segment
+#define ASSERT
+#endif
+
+#ifdef RAP_WITH_CALL_STATS
+#define STATS_inc(VAR) ++VAR;
+#define STATS_if(COND, VAR) if (COND) {++VAR;}
+#define STATS_used(DELTA) { _cur_used += (DELTA); if (_cur_used > _max_used) { _max_used = _cur_used; } }
+#else
+#define STATS_inc(VAR)
+#define STATS_if(COND, VAR)
+#define STATS_used(DELTA)
+#endif
+
+#ifdef RAP_WITH_HISTOGRAM
+#define STATS_hist(VAR, SIZE) ++VAR[hist_bin(SIZE)];
+#else
+#define STATS_hist(VAR, SIZE)
+#endif
+
+using namespace PBD;
+
+typedef int poolsize_t;
+
+ReallocPool::ReallocPool (std::string name, size_t bytes)
+	: _name (name)
+	, _poolsize (bytes)
+	, _pool (0)
+#ifdef RAP_WITH_SEGMENT_STATS
+	, _cur_avail (0)
+	, _cur_allocated (0)
+	, _max_allocated (0)
+	, _seg_cur_count (0)
+	, _seg_max_count (0)
+	, _seg_max_used (0)
+	, _seg_max_avail (0)
+#endif
+#ifdef RAP_WITH_CALL_STATS
+	, _n_alloc (0)
+	, _n_grow (0)
+	, _n_shrink (0)
+	, _n_free (0)
+	, _n_noop (0)
+	, _n_oom (0)
+	, _cur_used (0)
+	, _max_used (0)
+#endif
+{
+	_pool = (char*) ::malloc (bytes);
+
+	memset (_pool, 0, bytes); // make resident
+#ifndef PLATFORM_WINDOWS
+	mlock (_pool, bytes);
+#endif
+
+	poolsize_t *in = (poolsize_t*) _pool;
+	*in = - (bytes - sizeof (poolsize_t));
+	_mru = _pool;
+
+#ifdef RAP_WITH_HISTOGRAM
+	for (int i = 0; i < RAP_WITH_HISTOGRAM; ++i) {
+		_hist_alloc[i] = _hist_free[i] = _hist_grow[i] = _hist_shrink[i] = 0;
+	}
+#endif
+}
+
+ReallocPool::~ReallocPool ()
+{
+	STATS_segment;
+	printstats ();
+	::free (_pool);
+	_pool = NULL;
+}
+
+// realloc() does it all, malloc(), realloc() and free()
+void *
+ReallocPool::_realloc (void *ptr, size_t oldsize, size_t newsize) {
+	void *rv = NULL;
+	ASSERT (!ptr || oldsize <= _asize (ptr));
+	oldsize = _asize (ptr); // ignore provided oldsize
+
+	if (ptr == 0 && newsize == 0) {
+		STATS_inc(_n_noop);
+		return NULL;
+	}
+
+	if (ptr == 0) {
+		rv = _malloc (newsize);
+		STATS_if (!rv, _n_oom);
+		STATS_inc(_n_alloc);
+		STATS_hist(_hist_alloc, newsize);
+		STATS_segment;
+		return rv;
+	}
+
+	if (newsize == 0) {
+		STATS_hist(_hist_free, _asize(ptr));
+		STATS_inc(_n_free);
+		STATS_segment;
+		_free (ptr);
+		return NULL;
+	}
+
+	if (newsize == oldsize) {
+		ASSERT (_asize (ptr) <= newsize);
+		STATS_inc(_n_noop);
+		return ptr;
+	}
+
+	if (newsize > oldsize) {
+#ifdef RAP_BLOCKSIZE
+		const size_t ns = (newsize + RAP_BLOCKSIZE) & (~RAP_BLOCKSIZE);
+		if (ns <= _asize(ptr)) {
+			STATS_inc(_n_noop);
+			return ptr;
+		}
+#endif
+		if ((rv = _malloc (newsize))) {
+			memcpy (rv, ptr, oldsize);
+		}
+		if (rv) {
+			_free (ptr);
+		}
+		STATS_if(!rv, _n_oom);
+		STATS_inc(_n_grow);
+		STATS_hist(_hist_grow, newsize);
+		STATS_segment;
+		return rv;
+	}
+
+	if (newsize < oldsize) {
+		ASSERT (_asize (ptr) >= newsize);
+#if 0 // re-allocate
+		if ((rv = _malloc (newsize))) {
+			memccpy (rv, ptr, newsize);
+		}
+		STATS_if(!rv, _n_oom);
+		_free (ptr);
+#elif 1 // shrink current segment
+		const size_t ns = (newsize + RAP_BLOCKSIZE) & (~RAP_BLOCKSIZE);
+		_shrink (ptr, ns);
+		rv = ptr;
+#else // do nothing
+		rv = ptr;
+#endif
+		STATS_inc(_n_shrink);
+		STATS_hist (_hist_shrink, newsize);
+		STATS_segment;
+		return rv;
+	}
+	return NULL; // not reached
+}
+
+#define SEGSIZ (*((poolsize_t*) p))
+
+void
+ReallocPool::consolidate_ptr (char *p) {
+	const poolsize_t sop = sizeof(poolsize_t);
+	if (p - SEGSIZ + sop >= _pool + _poolsize) {
+		return; // reached end
+	}
+	poolsize_t *next = (poolsize_t*)(p - SEGSIZ + sop);
+	while (*next < 0) {
+		SEGSIZ = SEGSIZ + (*next) - sop;
+		if (p - SEGSIZ + sop >= _pool + _poolsize) {
+			break;
+		}
+		next = (poolsize_t*)(p -SEGSIZ + sop);
+	}
+	_mru = p;
+}
+
+void *
+ReallocPool::_malloc (size_t s) {
+	const poolsize_t sop = sizeof(poolsize_t);
+	size_t traversed = 0;
+	char *p = _mru;
+
+#ifdef RAP_BLOCKSIZE
+	s = (s + RAP_BLOCKSIZE) & (~RAP_BLOCKSIZE); // optional, helps to reduce fragmentation
+#endif
+
+	while (1) { // iterates at most once over the available pool
+		ASSERT (SEGSIZ != 0);
+		while (SEGSIZ > 0) {
+			traversed += SEGSIZ + sop;
+			if (traversed >= _poolsize) {
+				return NULL; // reached last segment. OOM.
+			}
+			p += SEGSIZ + sop;
+			if (p == _pool + _poolsize) {
+				p = _pool;
+			}
+		}
+
+		// found free segment.
+		const poolsize_t avail = -SEGSIZ;
+		const poolsize_t sp = (poolsize_t)s;
+		const poolsize_t ss = sop + s;
+
+		if (sp == avail) {
+			// exact match
+			SEGSIZ = -SEGSIZ;
+			STATS_used (s);
+			return (p + sop);
+		}
+
+		if (ss < avail) {
+			// segment is larger than required space,
+			// (we need to fit data + two non-zero poolsize_t)
+			SEGSIZ = sp; // mark area as used.
+			*((poolsize_t*)(p + ss)) = ss - avail; // mark free space after.
+			consolidate_ptr (p + ss);
+			_mru = p + ss;
+			STATS_used (s);
+			return (p + sop);
+		}
+
+		// segment is not large enough
+		consolidate_ptr (p); // try to consolidate with next segment (if any)
+
+		// check segment (again) and skip over too small free ones
+		while (SEGSIZ < 0 && (-SEGSIZ) <= ss && (-SEGSIZ) != sp) {
+			traversed += -SEGSIZ + sop;
+			if (traversed >= _poolsize) {
+				return NULL; // reached last segment. OOM.
+			}
+			p += (-SEGSIZ) + sop;
+			if (p >= _pool + _poolsize) {
+				p = _pool;
+				if (SEGSIZ < 0) consolidate_ptr (p);
+			}
+		}
+	}
+}
+#undef SEGSIZ
+
+void
+ReallocPool::_free (void *ptr) {
+	poolsize_t *in = (poolsize_t*) ptr;
+	--in;
+	*in = -*in; // mark as free
+	//_mru = p + ss;
+	STATS_used (*in);
+}
+
+void
+ReallocPool::_shrink (void *ptr, size_t newsize) {
+	poolsize_t *in = (poolsize_t*) ptr;
+	--in;
+	const poolsize_t avail = *in;
+	const poolsize_t ss = newsize + sizeof(poolsize_t);
+	if (avail <= ss) {
+		return; // can't shrink
+	}
+	const poolsize_t sp = (poolsize_t)newsize;
+	STATS_used (newsize - avail);
+	*in = sp; // set new size
+	char *p = (char*) in;
+	*((poolsize_t*)(p + ss)) = ss - avail; // mark free space after.
+	//_mru = p + ss;
+}
+
+size_t
+ReallocPool::_asize (void *ptr) {
+	if (ptr == 0) return 0;
+	poolsize_t *in = (poolsize_t*) ptr;
+	--in;
+	return (*in);
+}
+
+
+/** STATS **/
+
+void
+ReallocPool::printstats ()
+{
+#ifdef RAP_WITH_SEGMENT_STATS
+	printf ("ReallocPool '%s': used: %ld (%.1f%%) (max: %ld), free: %ld [bytes]\n"
+			"|| segments: cur: %ld (max: %ld), largest-used: %ld, largest-free: %ld\n",
+			_name.c_str(),
+			_cur_allocated, _cur_allocated * 100.f / _poolsize, _max_allocated, _cur_avail,
+			_seg_cur_count, _seg_max_count, _seg_max_used, _seg_max_avail);
+#elif defined RAP_WITH_CALL_STATS
+	printf ("ReallocPool '%s':\n", _name.c_str());
+#endif
+#ifdef RAP_WITH_CALL_STATS
+		printf("|| malloc(): %ld, free(): %ld, realloc()+:%ld, realloc()-: %ld NOOP:%ld OOM:%ld\n",
+			_n_alloc, _n_free, _n_grow, _n_shrink, _n_noop, _n_oom);
+		printf("|| used: %ld / %ld, max: %ld (%.1f%%)\n",
+				_cur_used, _poolsize,
+				_max_used, 100.f *_max_used / _poolsize);
+#endif
+#ifdef RAP_WITH_HISTOGRAM
+		printf("--- malloc()\n");
+		print_histogram (_hist_alloc);
+		printf("--- realloc()/grow-to\n");
+		print_histogram (_hist_grow);
+		printf("--- realloc()/shrink-to\n");
+		print_histogram (_hist_shrink);
+		printf("--- free() histogram\n");
+		print_histogram (_hist_free);
+		printf("--------------------\n");
+#endif
+}
+
+void
+ReallocPool::dumpsegments ()
+{
+	char *p = _pool;
+	const poolsize_t sop = sizeof(poolsize_t);
+	poolsize_t *in = (poolsize_t*) p;
+	unsigned int traversed = 0;
+#ifdef RAP_WITH_CALL_STATS
+	size_t used = 0;
+#endif
+	printf ("<<<<< %s\n", _name.c_str());
+	while (1) {
+		if ((*in) > 0) {
+			printf ("0x%08x used %4d\n", traversed, *in);
+			printf ("0x%08x   data %p\n", traversed + sop , p + sop);
+			traversed += *in + sop;
+			p += *in + sop;
+#ifdef RAP_WITH_CALL_STATS
+			used += *in;
+#endif
+		} else if ((*in) < 0) {
+			printf ("0x%08x free %4d [+%d]\n", traversed, -*in, sop);
+			traversed += -*in + sop;
+			p += -*in + sop;
+		} else {
+			printf ("0x%08x Corrupt!\n", traversed);
+			break;
+		}
+		in = (poolsize_t*) p;
+		if (p == _pool + _poolsize) {
+			printf ("%08x end\n", traversed);
+			break;
+		}
+		if (p > _pool + _poolsize) {
+			printf ("%08x Beyond End!\n", traversed);
+			break;
+		}
+	}
+#ifdef RAP_WITH_CALL_STATS
+	ASSERT (_cur_used == used);
+#endif
+	printf (">>>>>\n");
+}
+
+#ifdef RAP_WITH_SEGMENT_STATS
+void
+ReallocPool::collect_segment_stats ()
+{
+	char *p = _pool;
+	poolsize_t *in = (poolsize_t*) p;
+
+	_cur_allocated = _cur_avail = 0;
+	_seg_cur_count = _seg_max_avail = _seg_max_used = 0;
+
+	while (1) {
+		++_seg_cur_count;
+		if ((*in) > 0) {
+			_cur_allocated += *in;
+			p += *in;
+			if (*in > (poolsize_t)_seg_max_used) {
+				_seg_max_used = *in;
+			}
+		} else {
+			_cur_avail += -*in;
+			p += -*in;
+			if (-*in > (poolsize_t)_seg_max_avail) {
+				_seg_max_avail = -*in;
+			}
+		}
+		p += sizeof(poolsize_t);
+		in = (poolsize_t*) p;
+		if (p == _pool + _poolsize) {
+			break;
+		}
+	}
+	_seg_cur_count = _seg_cur_count;
+
+	if (_cur_allocated > _max_allocated) {
+		_max_allocated = _cur_allocated;
+	}
+	if (_seg_cur_count > _seg_max_count) {
+		_seg_max_count = _seg_cur_count;
+	}
+}
+#endif
+
+#ifdef RAP_WITH_HISTOGRAM
+void
+ReallocPool::print_histogram (size_t const * const histogram) const
+{
+	size_t maxhist = 0;
+	for (int i = 0; i < RAP_WITH_HISTOGRAM; ++i) {
+		if (histogram[i] > maxhist) maxhist = histogram[i];
+	}
+	const int termwidth = 50;
+#ifdef RAP_BLOCKSIZE
+	const int fact = RAP_BLOCKSIZE + 1;
+#endif
+	if (maxhist > 0) for (int i = 0; i < RAP_WITH_HISTOGRAM; ++i) {
+		if (histogram[i] == 0) { continue; }
+		if (i == RAP_WITH_HISTOGRAM -1 ) {
+#ifdef RAP_BLOCKSIZE
+			printf("     > %4d: %7lu ", i * fact, histogram[i]);
+#else
+			printf(">%4d:%7lu ", i * fact, histogram[i]);
+#endif
+		} else {
+#ifdef RAP_BLOCKSIZE
+			printf("%4d .. %4d: %7lu ", i * fact, (i + 1) * fact -1, histogram[i]);
+#else
+			printf("%4d: %7lu ", i * fact, (i + 1) * fact -1 , histogram[i]);
+#endif
+		}
+		int bar_width = (histogram[i] * termwidth ) / maxhist;
+		if (bar_width == 0 && histogram[i] > 0) bar_width = 1;
+		for (int j = 0; j < bar_width; ++j) printf("#");
+		printf("\n");
+	}
+}
+
+unsigned int
+ReallocPool::hist_bin (size_t s) const {
+#ifdef RAP_BLOCKSIZE
+	s = (s + RAP_BLOCKSIZE) & (~RAP_BLOCKSIZE);
+	s /= (RAP_BLOCKSIZE + 1);
+#endif
+	if (s > RAP_WITH_HISTOGRAM - 1) s = RAP_WITH_HISTOGRAM - 1;
+	return s;
+}
+#endif
diff --git a/libs/pbd/stateful.cc b/libs/pbd/stateful.cc
index 3fb11a3..8b8219f 100644
--- a/libs/pbd/stateful.cc
+++ b/libs/pbd/stateful.cc
@@ -35,7 +35,7 @@
 #include "pbd/xml++.h"
 #include "pbd/error.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 
diff --git a/libs/pbd/stateful_diff_command.cc b/libs/pbd/stateful_diff_command.cc
index f7fcd65..5721b58 100644
--- a/libs/pbd/stateful_diff_command.cc
+++ b/libs/pbd/stateful_diff_command.cc
@@ -20,7 +20,7 @@
 #include "pbd/stateful_diff_command.h"
 #include "pbd/property_list.h"
 #include "pbd/demangle.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace PBD;
diff --git a/libs/pbd/test/natsort_test.cc b/libs/pbd/test/natsort_test.cc
new file mode 100644
index 0000000..6e8d19b
--- /dev/null
+++ b/libs/pbd/test/natsort_test.cc
@@ -0,0 +1,20 @@
+#include "natsort_test.h"
+#include "pbd/natsort.h"
+
+CPPUNIT_TEST_SUITE_REGISTRATION (NatSortTest);
+
+using namespace std;
+
+
+void
+NatSortTest::testBasic ()
+{
+	CPPUNIT_ASSERT (!PBD::naturally_less ("a32", "a4"));
+	CPPUNIT_ASSERT (!PBD::naturally_less ("a32", "a04"));
+	CPPUNIT_ASSERT ( PBD::naturally_less ("a32", "a40"));
+	CPPUNIT_ASSERT ( PBD::naturally_less ("a32a", "a32b"));
+	CPPUNIT_ASSERT (!PBD::naturally_less ("a32b", "a32a"));
+	CPPUNIT_ASSERT (!PBD::naturally_less ("abcd", "abc"));
+	CPPUNIT_ASSERT ( PBD::naturally_less ("abc", "abcd"));
+	CPPUNIT_ASSERT (!PBD::naturally_less ("abc", "abc"));
+}
diff --git a/libs/pbd/test/natsort_test.h b/libs/pbd/test/natsort_test.h
new file mode 100644
index 0000000..7dea79a
--- /dev/null
+++ b/libs/pbd/test/natsort_test.h
@@ -0,0 +1,15 @@
+#include <cppunit/TestFixture.h>
+#include <cppunit/extensions/HelperMacros.h>
+
+class NatSortTest : public CppUnit::TestFixture
+{
+	CPPUNIT_TEST_SUITE (NatSortTest);
+	CPPUNIT_TEST (testBasic);
+	CPPUNIT_TEST_SUITE_END ();
+
+public:
+	NatSortTest () { }
+	void testBasic ();
+
+private:
+};
diff --git a/libs/pbd/test/reallocpool_test.cc b/libs/pbd/test/reallocpool_test.cc
new file mode 100644
index 0000000..6e6d615
--- /dev/null
+++ b/libs/pbd/test/reallocpool_test.cc
@@ -0,0 +1,41 @@
+#include <string.h>
+#include <stdlib.h>
+#include "reallocpool_test.h"
+#include "pbd/reallocpool.h"
+
+CPPUNIT_TEST_SUITE_REGISTRATION (ReallocPoolTest);
+
+using namespace std;
+
+ReallocPoolTest::ReallocPoolTest ()
+{
+}
+
+void
+ReallocPoolTest::testBasic ()
+{
+	::srand (0);
+	PBD::ReallocPool *m = new PBD::ReallocPool("TestPool", 256 * 1024);
+
+	for (int l = 0; l < 2 * 1024 * 1024; ++l) {
+		void *x[32];
+		size_t s[32];
+		int cnt = ::rand() % 32;
+		for (int i = 0; i < cnt; ++i) {
+			s[i] = ::rand() % 1024;
+			x[i] = m->malloc (s[i]);
+		}
+		for (int i = 0; i < cnt; ++i) {
+			if (x[i]) {
+				memset (x[i], 0xa5, s[i]);
+			}
+		}
+		for (int i = 0; i < cnt; ++i) {
+			m->free (x[i]);
+		}
+	}
+#ifdef RAP_WITH_CALL_STATS
+	CPPUNIT_ASSERT (m->mem_used() == 0);
+#endif
+	delete (m);
+}
diff --git a/libs/pbd/test/reallocpool_test.h b/libs/pbd/test/reallocpool_test.h
new file mode 100644
index 0000000..fe1d706
--- /dev/null
+++ b/libs/pbd/test/reallocpool_test.h
@@ -0,0 +1,16 @@
+#include <cppunit/TestFixture.h>
+#include <cppunit/extensions/HelperMacros.h>
+#include "glibmm/threads.h"
+
+class ReallocPoolTest : public CppUnit::TestFixture
+{
+	CPPUNIT_TEST_SUITE (ReallocPoolTest);
+	CPPUNIT_TEST (testBasic);
+	CPPUNIT_TEST_SUITE_END ();
+
+public:
+	ReallocPoolTest ();
+	void testBasic ();
+
+private:
+};
diff --git a/libs/pbd/tlsf.cc b/libs/pbd/tlsf.cc
new file mode 100644
index 0000000..5a83159
--- /dev/null
+++ b/libs/pbd/tlsf.cc
@@ -0,0 +1,628 @@
+/*
+ * Two Levels Segregate Fit memory allocator (TLSF)
+ * Version 2.4.6
+ *
+ * Written by Miguel Masmano Tello <mimastel at doctor.upv.es>
+ *
+ * Thanks to Ismael Ripoll for his suggestions and reviews
+ *
+ * Copyright (C) 2008, 2007, 2006, 2005, 2004
+ *
+ * This code is released using a dual license strategy: GPL/LGPL
+ * You can choose the licence that better fits your requirements.
+ *
+ * Released under the terms of the GNU General Public License Version 2.0
+ * Released under the terms of the GNU Lesser General Public License Version 2.1
+ *
+ */
+
+/*
+ * Code contributions:
+ *
+ * (Jul 28 2007)  Herman ten Brugge <hermantenbrugge at home.nl>:
+ *
+ * - Add 64 bit support. It now runs on x86_64 and solaris64.
+ * - I also tested this on vxworks/32and solaris/32 and i386/32 processors.
+ * - Remove assembly code. I could not measure any performance difference
+ *   on my core2 processor. This also makes the code more portable.
+ * - Moved defines/typedefs from tlsf.h to tlsf.c
+ * - Changed MIN_BLOCK_SIZE to sizeof (free_ptr_t) and BHDR_OVERHEAD to
+ *   (sizeof (bhdr_t) - MIN_BLOCK_SIZE). This does not change the fact
+ *    that the minumum size is still sizeof
+ *   (bhdr_t).
+ * - Changed all C++ comment style to C style. (// -> /.* ... *./)
+ * - Used ls_bit instead of ffs and ms_bit instead of fls. I did this to
+ *   avoid confusion with the standard ffs function which returns
+ *   different values.
+ * - Created set_bit/clear_bit fuctions because they are not present
+ *   on x86_64.
+ * - Added locking support + extra file target.h to show how to use it.
+ * - Added get_used_size function (REMOVED in 2.4)
+ * - Added rtl_realloc and rtl_calloc function
+ * - Implemented realloc clever support.
+ * - Added some test code in the example directory.
+ * - Bug fixed (discovered by the rockbox project: www.rockbox.org).
+ *
+ * (Oct 23 2006) Adam Scislowicz:
+ *
+ * - Support for ARMv5 implemented
+ *
+ */
+
+//#define TLSF_STATISTIC 1
+
+#ifndef USE_PRINTF
+#define USE_PRINTF      (1)
+#endif
+
+#include <assert.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifndef TLSF_STATISTIC
+#define    TLSF_STATISTIC     (0)
+#endif
+
+#if TLSF_STATISTIC
+#define TLSF_ADD_SIZE(tlsf, b) do {                                  \
+        tlsf->used_size += (b->size & BLOCK_SIZE) + BHDR_OVERHEAD;   \
+        if (tlsf->used_size > tlsf->max_size)                        \
+            tlsf->max_size = tlsf->used_size;                        \
+        } while(0)
+
+#define TLSF_REMOVE_SIZE(tlsf, b) do {                                \
+        tlsf->used_size -= (b->size & BLOCK_SIZE) + BHDR_OVERHEAD;    \
+    } while(0)
+#else
+#define    TLSF_ADD_SIZE(tlsf, b)         do{}while(0)
+#define    TLSF_REMOVE_SIZE(tlsf, b)    do{}while(0)
+#endif
+
+#include "pbd/tlsf.h"
+
+#if !defined(__GNUC__)
+#ifndef __inline__
+#define __inline__
+#endif
+#endif
+
+/* The  debug functions  only can  be used  when _DEBUG_TLSF_  is set. */
+#ifndef _DEBUG_TLSF_
+#define _DEBUG_TLSF_  (0)
+#endif
+
+/*************************************************************************/
+/* Definition of the structures used by TLSF */
+
+
+/* Some IMPORTANT TLSF parameters */
+/* Unlike the preview TLSF versions, now they are statics */
+#define BLOCK_ALIGN (sizeof(void *) * 2)
+
+#define MAX_FLI        (30)
+#define MAX_LOG2_SLI   (5)
+#define MAX_SLI        (1 << MAX_LOG2_SLI) /* MAX_SLI = 2^MAX_LOG2_SLI */
+
+#define FLI_OFFSET     (6) /* tlsf structure just will manage blocks bigger */
+/* than 128 bytes */
+#define SMALL_BLOCK    (128)
+#define REAL_FLI       (MAX_FLI - FLI_OFFSET)
+#define MIN_BLOCK_SIZE (sizeof (free_ptr_t))
+#define BHDR_OVERHEAD  (sizeof (bhdr_t) - MIN_BLOCK_SIZE)
+#define TLSF_SIGNATURE (0x2A59FA59)
+
+#define PTR_MASK       (sizeof(void *) - 1)
+#define BLOCK_SIZE     (0xFFFFFFFF - PTR_MASK)
+
+#define GET_NEXT_BLOCK(_addr, _r) ((bhdr_t *) ((char *) (_addr) + (_r)))
+#define MEM_ALIGN          ((BLOCK_ALIGN) - 1)
+#define ROUNDUP_SIZE(_r)   (((_r) + MEM_ALIGN) & ~MEM_ALIGN)
+#define ROUNDDOWN_SIZE(_r) ((_r) & ~MEM_ALIGN)
+#define ROUNDUP(_x, _v)    ((((~(_x)) + 1) & ((_v)-1)) + (_x))
+
+#define BLOCK_STATE  (0x1)
+#define PREV_STATE   (0x2)
+
+/* bit 0 of the block size */
+#define FREE_BLOCK   (0x1)
+#define USED_BLOCK   (0x0)
+
+/* bit 1 of the block size */
+#define PREV_FREE    (0x2)
+#define PREV_USED    (0x0)
+
+
+#ifdef USE_PRINTF
+#include <stdio.h>
+# define PRINT_MSG(fmt, args...) printf(fmt, ## args)
+# define ERROR_MSG(fmt, args...) printf(fmt, ## args)
+#else
+# if !defined(PRINT_MSG)
+#  define PRINT_MSG(fmt, args...)
+# endif
+# if !defined(ERROR_MSG)
+#  define ERROR_MSG(fmt, args...)
+# endif
+#endif
+
+typedef unsigned int u32_t; /* NOTE: Make sure that this type is 4 bytes long on your computer */
+typedef unsigned char u8_t; /* NOTE: Make sure that this type is 1 byte on your computer */
+
+typedef struct free_ptr_struct {
+	struct bhdr_struct *prev;
+	struct bhdr_struct *next;
+} free_ptr_t;
+
+typedef struct bhdr_struct {
+	/* This pointer is just valid if the first bit of size is set */
+	struct bhdr_struct *prev_hdr;
+	/* The size is stored in bytes */
+	size_t size;      /* bit 0 indicates whether the block is used and */
+	/* bit 1 allows to know whether the previous block is free */
+	union {
+		struct free_ptr_struct free_ptr;
+		u8_t buffer[1]; /*sizeof(struct free_ptr_struct)]; */
+	} ptr;
+} bhdr_t;
+
+/* This structure is embedded at the beginning of each area, giving us
+ * enough information to cope with a set of areas */
+
+typedef struct area_info_struct {
+	bhdr_t *end;
+	struct area_info_struct *next;
+} area_info_t;
+
+typedef struct TLSF_struct {
+	/* the TLSF's structure signature */
+	u32_t tlsf_signature;
+
+#if TLSF_STATISTIC
+	/* These can not be calculated outside tlsf because we
+	 * do not know the sizes when freeing/reallocing memory. */
+	size_t used_size;
+	size_t max_size;
+#endif
+
+	/* A linked list holding all the existing areas */
+	area_info_t *area_head;
+
+	/* the first-level bitmap */
+	/* This array should have a size of REAL_FLI bits */
+	u32_t fl_bitmap;
+
+	/* the second-level bitmap */
+	u32_t sl_bitmap[REAL_FLI];
+
+	bhdr_t *matrix[REAL_FLI][MAX_SLI];
+} tlsf_t;
+
+
+/******************************************************************/
+/**************     Helping functions    **************************/
+/******************************************************************/
+static __inline__ void set_bit(int nr, u32_t * addr);
+static __inline__ void clear_bit(int nr, u32_t * addr);
+static __inline__ int ls_bit(int x);
+static __inline__ int ms_bit(int x);
+static __inline__ void MAPPING_SEARCH(size_t * _r, int *_fl, int *_sl);
+static __inline__ void MAPPING_INSERT(size_t _r, int *_fl, int *_sl);
+static __inline__ bhdr_t *FIND_SUITABLE_BLOCK(tlsf_t * _tlsf, int *_fl, int *_sl);
+static __inline__ bhdr_t *process_area(void *area, size_t size);
+
+static const int table[] = {
+	-1, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4,
+	4, 4,
+	4, 4, 4, 4, 4, 4, 4,
+	5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+	5,
+	5, 5, 5, 5, 5, 5, 5,
+	6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+	6,
+	6, 6, 6, 6, 6, 6, 6,
+	6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+	6,
+	6, 6, 6, 6, 6, 6, 6,
+	7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+	7,
+	7, 7, 7, 7, 7, 7, 7,
+	7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+	7,
+	7, 7, 7, 7, 7, 7, 7,
+	7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+	7,
+	7, 7, 7, 7, 7, 7, 7,
+	7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+	7,
+	7, 7, 7, 7, 7, 7, 7
+};
+
+static __inline__ int ls_bit(int i)
+{
+	unsigned int a;
+	unsigned int x = i & -i;
+
+	a = x <= 0xffff ? (x <= 0xff ? 0 : 8) : (x <= 0xffffff ? 16 : 24);
+	return table[x >> a] + a;
+}
+
+static __inline__ int ms_bit(int i)
+{
+	unsigned int a;
+	unsigned int x = (unsigned int) i;
+
+	a = x <= 0xffff ? (x <= 0xff ? 0 : 8) : (x <= 0xffffff ? 16 : 24);
+	return table[x >> a] + a;
+}
+
+static __inline__ void set_bit(int nr, u32_t * addr)
+{
+	addr[nr >> 5] |= 1 << (nr & 0x1f);
+}
+
+static __inline__ void clear_bit(int nr, u32_t * addr)
+{
+	addr[nr >> 5] &= ~(1 << (nr & 0x1f));
+}
+
+static __inline__ void MAPPING_SEARCH(size_t * _r, int *_fl, int *_sl)
+{
+	int _t;
+
+	if (*_r < SMALL_BLOCK) {
+		*_fl = 0;
+		*_sl = *_r / (SMALL_BLOCK / MAX_SLI);
+	} else {
+		_t = (1 << (ms_bit(*_r) - MAX_LOG2_SLI)) - 1;
+		*_r = *_r + _t;
+		*_fl = ms_bit(*_r);
+		*_sl = (*_r >> (*_fl - MAX_LOG2_SLI)) - MAX_SLI;
+		*_fl -= FLI_OFFSET;
+		/*if ((*_fl -= FLI_OFFSET) < 0) // FL wil be always >0!
+		 *_fl = *_sl = 0;
+		 */
+		*_r &= ~_t;
+	}
+}
+
+static __inline__ void MAPPING_INSERT(size_t _r, int *_fl, int *_sl)
+{
+	if (_r < SMALL_BLOCK) {
+		*_fl = 0;
+		*_sl = _r / (SMALL_BLOCK / MAX_SLI);
+	} else {
+		*_fl = ms_bit(_r);
+		*_sl = (_r >> (*_fl - MAX_LOG2_SLI)) - MAX_SLI;
+		*_fl -= FLI_OFFSET;
+	}
+}
+
+
+static __inline__ bhdr_t *FIND_SUITABLE_BLOCK(tlsf_t * _tlsf, int *_fl, int *_sl)
+{
+	u32_t _tmp = _tlsf->sl_bitmap[*_fl] & (~0 << *_sl);
+	bhdr_t *_b = NULL;
+
+	if (_tmp) {
+		*_sl = ls_bit(_tmp);
+		_b = _tlsf->matrix[*_fl][*_sl];
+	} else {
+		*_fl = ls_bit(_tlsf->fl_bitmap & (~0 << (*_fl + 1)));
+		if (*_fl > 0) {         /* likely */
+			*_sl = ls_bit(_tlsf->sl_bitmap[*_fl]);
+			_b = _tlsf->matrix[*_fl][*_sl];
+		}
+	}
+	return _b;
+}
+
+
+#define EXTRACT_BLOCK_HDR(_b, _tlsf, _fl, _sl) do {                  \
+        _tlsf -> matrix [_fl] [_sl] = _b -> ptr.free_ptr.next;       \
+        if (_tlsf -> matrix[_fl][_sl])                               \
+            _tlsf -> matrix[_fl][_sl] -> ptr.free_ptr.prev = NULL;   \
+        else {                                                       \
+            clear_bit (_sl, &_tlsf -> sl_bitmap [_fl]);              \
+            if (!_tlsf -> sl_bitmap [_fl])                           \
+                clear_bit (_fl, &_tlsf -> fl_bitmap);                \
+        }                                                            \
+        _b -> ptr.free_ptr.prev =  NULL;                             \
+        _b -> ptr.free_ptr.next =  NULL;                             \
+    }while(0)
+
+
+#define EXTRACT_BLOCK(_b, _tlsf, _fl, _sl) do {                                     \
+        if (_b -> ptr.free_ptr.next)                                                \
+            _b -> ptr.free_ptr.next -> ptr.free_ptr.prev = _b -> ptr.free_ptr.prev; \
+        if (_b -> ptr.free_ptr.prev)                                                \
+            _b -> ptr.free_ptr.prev -> ptr.free_ptr.next = _b -> ptr.free_ptr.next; \
+        if (_tlsf -> matrix [_fl][_sl] == _b) {                                     \
+            _tlsf -> matrix [_fl][_sl] = _b -> ptr.free_ptr.next;                   \
+            if (!_tlsf -> matrix [_fl][_sl]) {                                      \
+                clear_bit (_sl, &_tlsf -> sl_bitmap[_fl]);                          \
+                if (!_tlsf -> sl_bitmap [_fl])                                      \
+                    clear_bit (_fl, &_tlsf -> fl_bitmap);                           \
+            }                                                                       \
+        }                                                                           \
+        _b -> ptr.free_ptr.prev = NULL;                                             \
+        _b -> ptr.free_ptr.next = NULL;                                             \
+    } while(0)
+
+#define INSERT_BLOCK(_b, _tlsf, _fl, _sl) do {                       \
+        _b -> ptr.free_ptr.prev = NULL;                              \
+        _b -> ptr.free_ptr.next = _tlsf -> matrix [_fl][_sl];        \
+        if (_tlsf -> matrix [_fl][_sl])                              \
+            _tlsf -> matrix [_fl][_sl] -> ptr.free_ptr.prev = _b;    \
+        _tlsf -> matrix [_fl][_sl] = _b;                             \
+        set_bit (_sl, &_tlsf -> sl_bitmap [_fl]);                    \
+        set_bit (_fl, &_tlsf -> fl_bitmap);                          \
+    } while(0)
+
+static __inline__ bhdr_t *process_area(void *area, size_t size)
+{
+	bhdr_t *b, *lb, *ib;
+	area_info_t *ai;
+
+	ib = (bhdr_t *) area;
+	ib->size =
+		(sizeof(area_info_t) <
+		 MIN_BLOCK_SIZE) ? MIN_BLOCK_SIZE : ROUNDUP_SIZE(sizeof(area_info_t)) | USED_BLOCK | PREV_USED;
+	b = (bhdr_t *) GET_NEXT_BLOCK(ib->ptr.buffer, ib->size & BLOCK_SIZE);
+	b->size = ROUNDDOWN_SIZE(size - 3 * BHDR_OVERHEAD - (ib->size & BLOCK_SIZE)) | USED_BLOCK | PREV_USED;
+	b->ptr.free_ptr.prev = b->ptr.free_ptr.next = 0;
+	lb = GET_NEXT_BLOCK(b->ptr.buffer, b->size & BLOCK_SIZE);
+	lb->prev_hdr = b;
+	lb->size = 0 | USED_BLOCK | PREV_FREE;
+	ai = (area_info_t *) ib->ptr.buffer;
+	ai->next = 0;
+	ai->end = lb;
+	return ib;
+}
+
+/* ****************************************************************************/
+
+#ifndef PLATFORM_WINDOWS
+#include <sys/mman.h>
+#endif
+
+PBD::TLSF::TLSF (std::string name, size_t mem_pool_size)
+    : _name (name)
+{
+	mem_pool_size = ROUNDUP_SIZE (mem_pool_size);
+	char * mem_pool = (char*) ::malloc (mem_pool_size);
+
+	assert (mem_pool);
+	assert (mem_pool_size >= sizeof(tlsf_t) + BHDR_OVERHEAD * 8);
+	assert (0 == (((unsigned long)mem_pool) & PTR_MASK));
+
+#ifndef PLATFORM_WINDOWS
+	memset (mem_pool, 0, mem_pool_size); // make resident
+	mlock (mem_pool, mem_pool_size);
+#endif
+
+	bhdr_t *b, *ib;
+
+	tlsf_t *tlsf = (tlsf_t *) mem_pool;
+	_mp = mem_pool;
+
+	/* Zeroing the memory pool */
+	memset(_mp, 0, sizeof(tlsf_t));
+
+	tlsf->tlsf_signature = TLSF_SIGNATURE;
+
+	ib = process_area(GET_NEXT_BLOCK
+			(_mp, ROUNDUP_SIZE(sizeof(tlsf_t))), ROUNDDOWN_SIZE(mem_pool_size - sizeof(tlsf_t)));
+	b = GET_NEXT_BLOCK(ib->ptr.buffer, ib->size & BLOCK_SIZE);
+	_free(b->ptr.buffer);
+	tlsf->area_head = (area_info_t *) ib->ptr.buffer;
+
+#if TLSF_STATISTIC
+	tlsf->used_size = mem_pool_size - (b->size & BLOCK_SIZE);
+	tlsf->max_size = tlsf->used_size;
+	PRINT_MSG ("TLSF '%s': free %ld, reserved: %ld [bytes]\n",
+			_name.c_str(),
+			b->size & BLOCK_SIZE,
+			get_used_size());
+#endif
+}
+
+PBD::TLSF::~TLSF ()
+{
+#if TLSF_STATISTIC
+	PRINT_MSG ("TLSF '%s': used: %ld, max: %ld [bytes]\n",
+			_name.c_str(),
+			get_used_size(),
+			get_max_size());
+#endif
+	tlsf_t *tlsf = (tlsf_t *) _mp;
+	tlsf->tlsf_signature = 0;
+	::free (_mp);
+	_mp = NULL;
+}
+
+size_t
+PBD::TLSF::get_used_size () const
+{
+#if TLSF_STATISTIC
+	return ((tlsf_t *) _mp)->used_size;
+#else
+	return 0;
+#endif
+}
+
+size_t
+PBD::TLSF::get_max_size () const
+{
+#if TLSF_STATISTIC
+	return ((tlsf_t *) _mp)->max_size;
+#else
+	return 0;
+#endif
+}
+
+void *
+PBD::TLSF::_malloc (size_t size)
+{
+	tlsf_t *tlsf = (tlsf_t *) _mp;
+	bhdr_t *b, *b2, *next_b;
+	int fl, sl;
+	size_t tmp_size;
+
+	size = (size < MIN_BLOCK_SIZE) ? MIN_BLOCK_SIZE : ROUNDUP_SIZE(size);
+
+	/* Rounding up the requested size and calculating fl and sl */
+	MAPPING_SEARCH(&size, &fl, &sl);
+
+	/* Searching a free block, recall that this function changes the values of fl and sl,
+		 so they are not longer valid when the function fails */
+	b = FIND_SUITABLE_BLOCK(tlsf, &fl, &sl);
+	if (!b)
+		return NULL; /* Not found */
+
+	EXTRACT_BLOCK_HDR(b, tlsf, fl, sl);
+
+	/*-- found: */
+	next_b = GET_NEXT_BLOCK(b->ptr.buffer, b->size & BLOCK_SIZE);
+	/* Should the block be split? */
+	tmp_size = (b->size & BLOCK_SIZE) - size;
+	if (tmp_size >= sizeof(bhdr_t)) {
+		tmp_size -= BHDR_OVERHEAD;
+		b2 = GET_NEXT_BLOCK(b->ptr.buffer, size);
+		b2->size = tmp_size | FREE_BLOCK | PREV_USED;
+		next_b->prev_hdr = b2;
+		MAPPING_INSERT(tmp_size, &fl, &sl);
+		INSERT_BLOCK(b2, tlsf, fl, sl);
+
+		b->size = size | (b->size & PREV_STATE);
+	} else {
+		next_b->size &= (~PREV_FREE);
+		b->size &= (~FREE_BLOCK); /* Now it's used */
+	}
+
+	TLSF_ADD_SIZE(tlsf, b);
+
+	return (void *) b->ptr.buffer;
+}
+
+void
+PBD::TLSF::_free (void *ptr)
+{
+	tlsf_t *tlsf = (tlsf_t *) _mp;
+	bhdr_t *b, *tmp_b;
+	int fl = 0, sl = 0;
+
+	if (!ptr) {
+		return;
+	}
+	b = (bhdr_t *) ((char *) ptr - BHDR_OVERHEAD);
+	b->size |= FREE_BLOCK;
+
+	TLSF_REMOVE_SIZE(tlsf, b);
+
+	b->ptr.free_ptr.prev = NULL;
+	b->ptr.free_ptr.next = NULL;
+	tmp_b = GET_NEXT_BLOCK(b->ptr.buffer, b->size & BLOCK_SIZE);
+	if (tmp_b->size & FREE_BLOCK) {
+		MAPPING_INSERT(tmp_b->size & BLOCK_SIZE, &fl, &sl);
+		EXTRACT_BLOCK(tmp_b, tlsf, fl, sl);
+		b->size += (tmp_b->size & BLOCK_SIZE) + BHDR_OVERHEAD;
+	}
+	if (b->size & PREV_FREE) {
+		tmp_b = b->prev_hdr;
+		MAPPING_INSERT(tmp_b->size & BLOCK_SIZE, &fl, &sl);
+		EXTRACT_BLOCK(tmp_b, tlsf, fl, sl);
+		tmp_b->size += (b->size & BLOCK_SIZE) + BHDR_OVERHEAD;
+		b = tmp_b;
+	}
+	MAPPING_INSERT(b->size & BLOCK_SIZE, &fl, &sl);
+	INSERT_BLOCK(b, tlsf, fl, sl);
+
+	tmp_b = GET_NEXT_BLOCK(b->ptr.buffer, b->size & BLOCK_SIZE);
+	tmp_b->size |= PREV_FREE;
+	tmp_b->prev_hdr = b;
+}
+
+void*
+PBD::TLSF::_realloc(void *ptr, size_t new_size)
+{
+	tlsf_t *tlsf = (tlsf_t *) _mp;
+	void *ptr_aux;
+	unsigned int cpsize;
+	bhdr_t *b, *tmp_b, *next_b;
+	int fl, sl;
+	size_t tmp_size;
+
+	if (!ptr) {
+		if (new_size)
+			return (void *) _malloc (new_size);
+		if (!new_size)
+			return NULL;
+	} else if (!new_size) {
+		_free(ptr);
+		return NULL;
+	}
+
+	b = (bhdr_t *) ((char *) ptr - BHDR_OVERHEAD);
+	next_b = GET_NEXT_BLOCK(b->ptr.buffer, b->size & BLOCK_SIZE);
+	new_size = (new_size < MIN_BLOCK_SIZE) ? MIN_BLOCK_SIZE : ROUNDUP_SIZE(new_size);
+	tmp_size = (b->size & BLOCK_SIZE);
+	if (new_size <= tmp_size) {
+		TLSF_REMOVE_SIZE(tlsf, b);
+		if (next_b->size & FREE_BLOCK) {
+			MAPPING_INSERT(next_b->size & BLOCK_SIZE, &fl, &sl);
+			EXTRACT_BLOCK(next_b, tlsf, fl, sl);
+			tmp_size += (next_b->size & BLOCK_SIZE) + BHDR_OVERHEAD;
+			next_b = GET_NEXT_BLOCK(next_b->ptr.buffer, next_b->size & BLOCK_SIZE);
+			/* We allways reenter this free block because tmp_size will
+				 be greater then sizeof (bhdr_t) */
+		}
+		tmp_size -= new_size;
+		if (tmp_size >= sizeof(bhdr_t)) {
+			tmp_size -= BHDR_OVERHEAD;
+			tmp_b = GET_NEXT_BLOCK(b->ptr.buffer, new_size);
+			tmp_b->size = tmp_size | FREE_BLOCK | PREV_USED;
+			next_b->prev_hdr = tmp_b;
+			next_b->size |= PREV_FREE;
+			MAPPING_INSERT(tmp_size, &fl, &sl);
+			INSERT_BLOCK(tmp_b, tlsf, fl, sl);
+			b->size = new_size | (b->size & PREV_STATE);
+		}
+		TLSF_ADD_SIZE(tlsf, b);
+		return (void *) b->ptr.buffer;
+	}
+	if ((next_b->size & FREE_BLOCK)) {
+		if (new_size <= (tmp_size + (next_b->size & BLOCK_SIZE))) {
+			TLSF_REMOVE_SIZE(tlsf, b);
+			MAPPING_INSERT(next_b->size & BLOCK_SIZE, &fl, &sl);
+			EXTRACT_BLOCK(next_b, tlsf, fl, sl);
+			b->size += (next_b->size & BLOCK_SIZE) + BHDR_OVERHEAD;
+			next_b = GET_NEXT_BLOCK(b->ptr.buffer, b->size & BLOCK_SIZE);
+			next_b->prev_hdr = b;
+			next_b->size &= ~PREV_FREE;
+			tmp_size = (b->size & BLOCK_SIZE) - new_size;
+			if (tmp_size >= sizeof(bhdr_t)) {
+				tmp_size -= BHDR_OVERHEAD;
+				tmp_b = GET_NEXT_BLOCK(b->ptr.buffer, new_size);
+				tmp_b->size = tmp_size | FREE_BLOCK | PREV_USED;
+				next_b->prev_hdr = tmp_b;
+				next_b->size |= PREV_FREE;
+				MAPPING_INSERT(tmp_size, &fl, &sl);
+				INSERT_BLOCK(tmp_b, tlsf, fl, sl);
+				b->size = new_size | (b->size & PREV_STATE);
+			}
+			TLSF_ADD_SIZE(tlsf, b);
+			return (void *) b->ptr.buffer;
+		}
+	}
+
+	if (!(ptr_aux = _malloc (new_size))){
+		return NULL;
+	}
+
+	cpsize = ((b->size & BLOCK_SIZE) > new_size) ? new_size : (b->size & BLOCK_SIZE);
+
+	memcpy(ptr_aux, ptr, cpsize);
+
+	_free(ptr);
+	return ptr_aux;
+}
diff --git a/libs/pbd/windows_timer_utils.cc b/libs/pbd/windows_timer_utils.cc
index ab45e30..0fab935 100644
--- a/libs/pbd/windows_timer_utils.cc
+++ b/libs/pbd/windows_timer_utils.cc
@@ -25,7 +25,7 @@
 #include "pbd/debug.h"
 #include "pbd/error.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 #define DEBUG_TIMING(msg) DEBUG_TRACE (PBD::DEBUG::Timing, msg);
 
diff --git a/libs/pbd/wscript b/libs/pbd/wscript
index 0d11c85..6f872c9 100644
--- a/libs/pbd/wscript
+++ b/libs/pbd/wscript
@@ -37,7 +37,6 @@ libpbd_sources = [
     'configuration_variable.cc',
     'convert.cc',
     'controllable.cc',
-    'controllable_descriptor.cc',
     'crossthread.cc',
     'cpus.cc',
     'debug.cc',
@@ -62,6 +61,7 @@ libpbd_sources = [
     'pool.cc',
     'property_list.cc',
     'pthread_utils.cc',
+    'reallocpool.cc',
     'receiver.cc',
     'resource.cc',
     'search_path.cc',
@@ -77,6 +77,7 @@ libpbd_sources = [
     'textreceiver.cc',
     'timer.cc',
     'timing.cc',
+    'tlsf.cc',
     'transmitter.cc',
     'undo.cc',
     'uuid.cc',
@@ -163,6 +164,8 @@ def build(bld):
                 test/signals_test.cc
                 test/convert_test.cc
                 test/filesystem_test.cc
+                test/natsort_test.cc
+                test/reallocpool_test.cc
                 test/xml_test.cc
                 test/test_common.cc
         '''.split()
diff --git a/libs/pbd/xml++.cc b/libs/pbd/xml++.cc
index 963531c..80fc882 100644
--- a/libs/pbd/xml++.cc
+++ b/libs/pbd/xml++.cc
@@ -6,7 +6,10 @@
  */
 
 #include <iostream>
+
+#include "pbd/stacktrace.h"
 #include "pbd/xml++.h"
+
 #include <libxml/debugXML.h>
 #include <libxml/xpath.h>
 #include <libxml/xpathInternals.h>
@@ -404,7 +407,32 @@ XMLNode::add_content(const string& c)
 	return add_child_copy(XMLNode (string(), c));
 }
 
-XMLProperty*
+XMLProperty const *
+XMLNode::property(const char* n) const
+{
+	string ns(n);
+	map<string,XMLProperty*>::const_iterator iter;
+
+	if ((iter = _propmap.find(ns)) != _propmap.end()) {
+		return iter->second;
+	}
+
+	return 0;
+}
+
+XMLProperty const *
+XMLNode::property(const string& ns) const
+{
+	map<string,XMLProperty*>::const_iterator iter;
+
+	if ((iter = _propmap.find(ns)) != _propmap.end()) {
+		return iter->second;
+	}
+
+	return 0;
+}
+
+XMLProperty *
 XMLNode::property(const char* n)
 {
 	string ns(n);
@@ -417,7 +445,7 @@ XMLNode::property(const char* n)
 	return 0;
 }
 
-XMLProperty*
+XMLProperty *
 XMLNode::property(const string& ns)
 {
 	map<string,XMLProperty*>::iterator iter;
@@ -429,6 +457,17 @@ XMLNode::property(const string& ns)
 	return 0;
 }
 
+bool
+XMLNode::has_property_with_value (const string& key, const string& value) const
+{
+	map<string,XMLProperty*>::const_iterator iter = _propmap.find(key);
+	if (iter != _propmap.end()) {
+		const XMLProperty* p = (iter->second);
+		return (p && p->value() == value);
+	}
+	return false;
+}
+
 XMLProperty*
 XMLNode::add_property(const char* n, const string& v)
 {
@@ -472,7 +511,10 @@ XMLNode::remove_property(const string& n)
 {
 	if (_propmap.find(n) != _propmap.end()) {
 		XMLProperty* p = _propmap[n];
-		_proplist.remove (p);
+		XMLPropertyIterator i = std::find(_proplist.begin(), _proplist.end(), p);
+		if (i != _proplist.end ()) {
+			_proplist.erase (i);
+		}
 		delete p;
 		_propmap.erase(n);
 	}
@@ -492,15 +534,12 @@ void
 XMLNode::remove_nodes(const string& n)
 {
 	XMLNodeIterator i = _children.begin();
-	XMLNodeIterator tmp;
-
 	while (i != _children.end()) {
-		tmp = i;
-		++tmp;
 		if ((*i)->name() == n) {
-			_children.erase (i);
+			i = _children.erase (i);
+		} else {
+			++i;
 		}
-		i = tmp;
 	}
 }
 
@@ -508,16 +547,14 @@ void
 XMLNode::remove_nodes_and_delete(const string& n)
 {
 	XMLNodeIterator i = _children.begin();
-	XMLNodeIterator tmp;
 
 	while (i != _children.end()) {
-		tmp = i;
-		++tmp;
 		if ((*i)->name() == n) {
 			delete *i;
-			_children.erase (i);
+			i = _children.erase (i);
+		} else {
+			++i;
 		}
-		i = tmp;
 	}
 }
 
@@ -525,20 +562,16 @@ void
 XMLNode::remove_nodes_and_delete(const string& propname, const string& val)
 {
 	XMLNodeIterator i = _children.begin();
-	XMLNodeIterator tmp;
-	XMLProperty* prop;
+	XMLProperty const * prop;
 
 	while (i != _children.end()) {
-		tmp = i;
-		++tmp;
-
 		prop = (*i)->property(propname);
 		if (prop && prop->value() == val) {
 			delete *i;
-			_children.erase(i);
+			i = _children.erase(i);
+		} else {
+			++i;
 		}
-
-		i = tmp;
 	}
 }
 
diff --git a/libs/plugins/a-comp.lv2/a-comp#stereo.ttl.in b/libs/plugins/a-comp.lv2/a-comp#stereo.ttl.in
new file mode 100644
index 0000000..591d9c8
--- /dev/null
+++ b/libs/plugins/a-comp.lv2/a-comp#stereo.ttl.in
@@ -0,0 +1,155 @@
+ at prefix doap: <http://usefulinc.com/ns/doap#> .
+ at prefix foaf: <http://xmlns.com/foaf/0.1/> .
+ at prefix lv2:  <http://lv2plug.in/ns/lv2core#> .
+ at prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
+ at prefix rsz:  <http://lv2plug.in/ns/ext/resize-port#> .
+ at prefix unit: <http://lv2plug.in/ns/extensions/units#> .
+
+<http://ardour.org/credits.html>
+	a foaf:Person ;
+	foaf:name "Ardour Team" ;
+	foaf:homepage <http://ardour.org/> .
+
+<urn:ardour:a-comp#stereo>
+    a lv2:Plugin, doap:Project, lv2:CompressorPlugin ;
+
+    lv2:optionalFeature <http://lv2plug.in/ns/lv2core#hardRTCapable>;
+
+    lv2:port [
+        a lv2:InputPort, lv2:ControlPort ;
+        lv2:index 0 ;
+        lv2:name "Attack" ;
+        lv2:symbol "att" ;
+        lv2:default 10.000000 ;
+        lv2:minimum 0.100000 ;
+        lv2:maximum 100.000000 ;
+        unit:unit unit:ms ;
+    ] ,
+    [
+        a lv2:InputPort, lv2:ControlPort ;
+        lv2:index 1 ;
+        lv2:name "Release" ;
+        lv2:symbol "rel" ;
+        lv2:default 80.000000 ;
+        lv2:minimum 1.000000 ;
+        lv2:maximum 500.000000 ;
+        unit:unit unit:ms ;
+    ] ,
+    [
+        a lv2:InputPort, lv2:ControlPort ;
+        lv2:index 2 ;
+        lv2:name "Knee" ;
+        lv2:symbol "kn" ;
+        lv2:default 0.000000 ;
+        lv2:minimum 0.000000 ;
+        lv2:maximum 8.000000 ;
+        unit:unit unit:db ;
+    ] ,
+    [
+        a lv2:InputPort, lv2:ControlPort ;
+        lv2:index 3 ;
+        lv2:name "Ratio" ;
+        lv2:symbol "rat" ;
+        lv2:default 4.000000 ;
+        lv2:minimum 1.000000 ;
+        lv2:maximum 20.000000 ;
+        unit:unit [
+            rdfs:label  " " ;
+            unit:symbol " " ;
+            unit:render "%f  " ;
+        ] ;
+        lv2:portProperty <http://lv2plug.in/ns/ext/port-props#logarithmic> ;
+    ] ,
+    [
+        a lv2:InputPort, lv2:ControlPort ;
+        lv2:index 4 ;
+        lv2:name "Threshold" ;
+        lv2:symbol "thr" ;
+        lv2:default 0.000000 ;
+        lv2:minimum -60.000000 ;
+        lv2:maximum 0.000000 ;
+        unit:unit unit:db ;
+    ] ,
+    [
+        a lv2:InputPort, lv2:ControlPort ;
+        lv2:index 5 ;
+        lv2:name "Makeup" ;
+        lv2:symbol "mak" ;
+        lv2:default 0.000000 ;
+        lv2:minimum 0.000000 ;
+        lv2:maximum 30.000000 ;
+        unit:unit unit:db ;
+    ] ,
+    [
+        a lv2:OutputPort, lv2:ControlPort ;
+        lv2:index 6 ;
+        lv2:name "Gain Reduction" ;
+        lv2:symbol "gr" ;
+        lv2:default 0.000000 ;
+        lv2:minimum 0.000000 ;
+        lv2:maximum 45.000000 ;
+        unit:unit unit:db ;
+    ] ,
+    [
+        a lv2:OutputPort, lv2:ControlPort ;
+        lv2:index 7 ;
+        lv2:name "Output Level" ;
+        lv2:symbol "outlevel" ;
+        lv2:default -45.000000 ;
+        lv2:minimum -45.000000 ;
+        lv2:maximum 0.000000 ;
+        unit:unit unit:db ;
+    ] ,
+    [
+        a lv2:InputPort, lv2:ControlPort ;
+        lv2:index 8 ;
+        lv2:name "Sidechain" ;
+        lv2:symbol "sidech" ;
+        lv2:default 0.000000 ;
+        lv2:minimum 0.000000 ;
+        lv2:maximum 1.000000 ;
+        lv2:portProperty lv2:toggled ;
+    ] ;
+
+    lv2:port [
+        a lv2:InputPort, lv2:AudioPort ;
+        lv2:index 9 ;
+        lv2:symbol "in_1" ;
+        lv2:name "Audio Input 1" ;
+    ] ,
+    [
+        a lv2:InputPort, lv2:AudioPort ;
+        lv2:index 10 ;
+        lv2:symbol "in_2" ;
+        lv2:name "Audio Input 2" ;
+    ] ,
+    [
+        a lv2:InputPort, lv2:AudioPort ;
+        lv2:index 11 ;
+        lv2:symbol "sidechain_in" ;
+        lv2:name "Sidechain Input" ;
+        lv2:portProperty lv2:isSideChain;
+    ],
+    [
+        a lv2:OutputPort, lv2:AudioPort ;
+        lv2:index 12 ;
+        lv2:symbol "out_1" ;
+        lv2:name "Audio Output 1" ;
+    ],
+    [
+        a lv2:OutputPort, lv2:AudioPort ;
+        lv2:index 13 ;
+        lv2:symbol "out_2" ;
+        lv2:name "Audio Output 2" ;
+    ] ;
+
+    rdfs:comment """
+A powerful stereo compressor.
+""" ;
+
+    doap:name "a-Compressor stereo" ;
+    doap:license "GPL v2+" ;
+    doap:maintainer <http://ardour.org/credits.html> ;
+
+    lv2:microVersion 1 ;
+    lv2:minorVersion 1 .
diff --git a/libs/plugins/a-comp.lv2/a-comp.c b/libs/plugins/a-comp.lv2/a-comp.c
new file mode 100644
index 0000000..3b123d2
--- /dev/null
+++ b/libs/plugins/a-comp.lv2/a-comp.c
@@ -0,0 +1,698 @@
+/* a-comp
+ * Copyright (C) 2016 Damien Zammit <damien at zamaudio.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#include <math.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdbool.h>
+
+#ifdef LV2_EXTENDED
+#include <cairo/cairo.h>
+#include "ardour/lv2_extensions.h"
+#endif
+
+#include "lv2/lv2plug.in/ns/lv2core/lv2.h"
+
+#define ACOMP_URI		"urn:ardour:a-comp"
+#define ACOMP_STEREO_URI	"urn:ardour:a-comp#stereo"
+
+typedef enum {
+	ACOMP_ATTACK = 0,
+	ACOMP_RELEASE,
+	ACOMP_KNEE,
+	ACOMP_RATIO,
+	ACOMP_THRESHOLD,
+	ACOMP_MAKEUP,
+
+	ACOMP_GAINR,
+	ACOMP_OUTLEVEL,
+	ACOMP_SIDECHAIN,
+
+	ACOMP_INPUT,
+	ACOMP_SC,
+	ACOMP_OUTPUT,
+} PortIndexMono;
+
+typedef enum {
+	ACOMP_STEREO_ATTACK = 0,
+	ACOMP_STEREO_RELEASE,
+	ACOMP_STEREO_KNEE,
+	ACOMP_STEREO_RATIO,
+	ACOMP_STEREO_THRESHOLD,
+	ACOMP_STEREO_MAKEUP,
+
+	ACOMP_STEREO_GAINR,
+	ACOMP_STEREO_OUTLEVEL,
+	ACOMP_STEREO_SIDECHAIN,
+
+	ACOMP_STEREO_INPUT0,
+	ACOMP_STEREO_INPUT1,
+	ACOMP_STEREO_SC,
+	ACOMP_STEREO_OUTPUT0,
+	ACOMP_STEREO_OUTPUT1,
+} PortIndexStereo;
+
+typedef struct {
+	float* attack;
+	float* release;
+	float* knee;
+	float* ratio;
+	float* thresdb;
+	float* makeup;
+
+	float* gainr;
+	float* outlevel;
+	float* sidechain;
+
+	float* input0;
+	float* input1;
+	float* sc;
+	float* output0;
+	float* output1;
+
+	float srate;
+	float old_yl;
+	float old_y1;
+	float old_yg;
+
+#ifdef LV2_EXTENDED
+	LV2_Inline_Display_Image_Surface surf;
+	bool                     need_expose;
+	cairo_surface_t*         display;
+	LV2_Inline_Display*      queue_draw;
+	uint32_t                 w, h;
+
+	/* ports pointers are only valid during run so we'll
+	 * have to cache them for the display, besides
+	 * we do want to check for changes
+	 */
+	float v_knee;
+	float v_ratio;
+	float v_thresdb;
+	float v_lvl;
+	float v_lvl_in;
+	float v_lvl_out;
+#endif
+} AComp;
+
+static LV2_Handle
+instantiate(const LV2_Descriptor* descriptor,
+            double rate,
+            const char* bundle_path,
+            const LV2_Feature* const* features)
+{
+	AComp* acomp = (AComp*)calloc(1, sizeof(AComp));
+
+	for (int i=0; features[i]; ++i) {
+#ifdef LV2_EXTENDED
+		if (!strcmp(features[i]->URI, LV2_INLINEDISPLAY__queue_draw)) {
+			acomp->queue_draw = (LV2_Inline_Display*) features[i]->data;
+		}
+#endif
+	}
+
+	acomp->srate = rate;
+	acomp->old_yl=acomp->old_y1=acomp->old_yg=0.f;
+#ifdef LV2_EXTENDED
+	acomp->need_expose = true;
+#endif
+
+	return (LV2_Handle)acomp;
+}
+
+
+static void
+connect_port_mono(LV2_Handle instance,
+             uint32_t port,
+             void* data)
+{
+	AComp* acomp = (AComp*)instance;
+
+	switch ((PortIndexMono)port) {
+	case ACOMP_ATTACK:
+		acomp->attack = (float*)data;
+		break;
+	case ACOMP_RELEASE:
+		acomp->release = (float*)data;
+		break;
+	case ACOMP_KNEE:
+		acomp->knee = (float*)data;
+		break;
+	case ACOMP_RATIO:
+		acomp->ratio = (float*)data;
+		break;
+	case ACOMP_THRESHOLD:
+		acomp->thresdb = (float*)data;
+		break;
+	case ACOMP_MAKEUP:
+		acomp->makeup = (float*)data;
+		break;
+	case ACOMP_GAINR:
+		acomp->gainr = (float*)data;
+		break;
+	case ACOMP_OUTLEVEL:
+		acomp->outlevel = (float*)data;
+		break;
+	case ACOMP_SIDECHAIN:
+		acomp->sidechain = (float*)data;
+		break;
+	case ACOMP_INPUT:
+		acomp->input0 = (float*)data;
+		break;
+	case ACOMP_SC:
+		acomp->sc = (float*)data;
+		break;
+	case ACOMP_OUTPUT:
+		acomp->output0 = (float*)data;
+		break;
+	}
+}
+
+static void
+connect_port_stereo(LV2_Handle instance,
+             uint32_t port,
+             void* data)
+{
+	AComp* acomp = (AComp*)instance;
+
+	switch ((PortIndexStereo)port) {
+	case ACOMP_STEREO_ATTACK:
+		acomp->attack = (float*)data;
+		break;
+	case ACOMP_STEREO_RELEASE:
+		acomp->release = (float*)data;
+		break;
+	case ACOMP_STEREO_KNEE:
+		acomp->knee = (float*)data;
+		break;
+	case ACOMP_STEREO_RATIO:
+		acomp->ratio = (float*)data;
+		break;
+	case ACOMP_STEREO_THRESHOLD:
+		acomp->thresdb = (float*)data;
+		break;
+	case ACOMP_STEREO_MAKEUP:
+		acomp->makeup = (float*)data;
+		break;
+	case ACOMP_STEREO_GAINR:
+		acomp->gainr = (float*)data;
+		break;
+	case ACOMP_STEREO_OUTLEVEL:
+		acomp->outlevel = (float*)data;
+		break;
+	case ACOMP_STEREO_SIDECHAIN:
+		acomp->sidechain = (float*)data;
+		break;
+	case ACOMP_STEREO_INPUT0:
+		acomp->input0 = (float*)data;
+		break;
+	case ACOMP_STEREO_INPUT1:
+		acomp->input1 = (float*)data;
+		break;
+	case ACOMP_STEREO_SC:
+		acomp->sc = (float*)data;
+		break;
+	case ACOMP_STEREO_OUTPUT0:
+		acomp->output0 = (float*)data;
+		break;
+	case ACOMP_STEREO_OUTPUT1:
+		acomp->output1 = (float*)data;
+		break;
+	}
+}
+
+// Force already-denormal float value to zero
+static inline float
+sanitize_denormal(float value) {
+	if (!isnormal(value)) {
+		value = 0.f;
+	}
+	return value;
+}
+
+static inline float
+from_dB(float gdb) {
+	return (exp(gdb/20.f*log(10.f)));
+}
+
+static inline float
+to_dB(float g) {
+	return (20.f*log10(g));
+}
+
+static void
+activate(LV2_Handle instance)
+{
+	AComp* acomp = (AComp*)instance;
+
+	*(acomp->gainr) = 0.0f;
+	*(acomp->outlevel) = -45.0f;
+	acomp->old_yl=acomp->old_y1=acomp->old_yg=0.f;
+}
+
+static void
+run_mono(LV2_Handle instance, uint32_t n_samples)
+{
+	AComp* acomp = (AComp*)instance;
+
+	const float* const input = acomp->input0;
+	const float* const sc = acomp->sc;
+	float* const output = acomp->output0;
+
+	float srate = acomp->srate;
+	float width = (6.f * *(acomp->knee)) + 0.01;
+	float cdb=0.f;
+	float attack_coeff = exp(-1000.f/(*(acomp->attack) * srate));
+	float release_coeff = exp(-1000.f/(*(acomp->release) * srate));
+
+	float max = 0.f;
+	float lgaininp = 0.f;
+	float Lgain = 1.f;
+	float Lxg, Lxl, Lyg, Lyl, Ly1;
+	int usesidechain = (*(acomp->sidechain) < 0.5) ? 0 : 1;
+	uint32_t i;
+	float ingain;
+	float in0;
+	float sc0;
+	float ratio = *(acomp->ratio);
+	float thresdb = *(acomp->thresdb);
+
+#ifdef LV2_EXTENDED
+	if (acomp->v_knee != *acomp->knee) {
+		acomp->v_knee = *acomp->knee;
+		acomp->need_expose = true;
+	}
+
+	if (acomp->v_ratio != *acomp->ratio) {
+		acomp->v_ratio = *acomp->ratio;
+		acomp->need_expose = true;
+	}
+
+	if (acomp->v_thresdb != *acomp->thresdb) {
+		acomp->v_thresdb = *acomp->thresdb;
+		acomp->need_expose = true;
+	}
+#endif
+
+	float in_peak = 0;
+
+	for (i = 0; i < n_samples; i++) {
+		in0 = input[i];
+		sc0 = sc[i];
+		ingain = usesidechain ? fabs(sc0) : fabs(in0);
+		in_peak = fmaxf (in_peak, ingain);
+		Lyg = 0.f;
+		Lxg = (ingain==0.f) ? -160.f : to_dB(ingain);
+		Lxg = sanitize_denormal(Lxg);
+
+
+		if (2.f*(Lxg-thresdb) < -width) {
+			Lyg = Lxg;
+		} else if (2.f*(Lxg-thresdb) > width) {
+			Lyg = thresdb + (Lxg-thresdb)/ratio;
+			Lyg = sanitize_denormal(Lyg);
+		} else {
+			Lyg = Lxg + (1.f/ratio-1.f)*(Lxg-thresdb+width/2.f)*(Lxg-thresdb+width/2.f)/(2.f*width);
+		}
+
+		Lxl = Lxg - Lyg;
+
+		acomp->old_y1 = sanitize_denormal(acomp->old_y1);
+		acomp->old_yl = sanitize_denormal(acomp->old_yl);
+		Ly1 = fmaxf(Lxl, release_coeff * acomp->old_y1+(1.f-release_coeff)*Lxl);
+		Lyl = attack_coeff * acomp->old_yl+(1.f-attack_coeff)*Ly1;
+		Ly1 = sanitize_denormal(Ly1);
+		Lyl = sanitize_denormal(Lyl);
+
+		cdb = -Lyl;
+		Lgain = from_dB(cdb);
+
+		*(acomp->gainr) = Lyl;
+
+		lgaininp = in0 * Lgain;
+		output[i] = lgaininp * from_dB(*(acomp->makeup));
+
+		max = (fabsf(output[i]) > max) ? fabsf(output[i]) : sanitize_denormal(max);
+
+		// TODO re-use local variables on stack
+		// store values back to acomp at the end of the inner-loop
+		acomp->old_yl = Lyl;
+		acomp->old_y1 = Ly1;
+		acomp->old_yg = Lyg;
+	}
+
+	*(acomp->outlevel) = (max < 0.0056f) ? -45.f : to_dB(max);
+
+#ifdef LV2_EXTENDED
+	acomp->v_lvl += .1 * (in_peak - acomp->v_lvl);  // crude LPF TODO use n_samples/rate TC
+	const float v_lvl_in = (acomp->v_lvl < 0.001f) ? -60.f : to_dB(acomp->v_lvl);
+	const float v_lvl_out = (max < 0.001f) ? -60.f : to_dB(max);
+	if (fabsf (acomp->v_lvl_out - v_lvl_out) >= 1 || fabsf (acomp->v_lvl_in - v_lvl_in) >= 1) {
+		// >= 1dB difference
+		acomp->need_expose = true;
+		acomp->v_lvl_in = v_lvl_in;
+		acomp->v_lvl_out = v_lvl_out - *acomp->makeup;
+	}
+	if (acomp->need_expose && acomp->queue_draw) {
+		acomp->need_expose = false;
+		acomp->queue_draw->queue_draw (acomp->queue_draw->handle);
+	}
+#endif
+}
+
+static void
+run_stereo(LV2_Handle instance, uint32_t n_samples)
+{
+	AComp* acomp = (AComp*)instance;
+
+	const float* const input0 = acomp->input0;
+	const float* const input1 = acomp->input1;
+	const float* const sc = acomp->sc;
+	float* const output0 = acomp->output0;
+	float* const output1 = acomp->output1;
+
+	float srate = acomp->srate;
+	float width = (6.f * *(acomp->knee)) + 0.01;
+	float cdb=0.f;
+	float attack_coeff = exp(-1000.f/(*(acomp->attack) * srate));
+	float release_coeff = exp(-1000.f/(*(acomp->release) * srate));
+
+	float max = 0.f;
+	float lgaininp = 0.f;
+	float rgaininp = 0.f;
+	float Lgain = 1.f;
+	float Lxg, Lxl, Lyg, Lyl, Ly1;
+	int usesidechain = (*(acomp->sidechain) < 0.5) ? 0 : 1;
+	uint32_t i;
+	float ingain;
+	float in0;
+	float in1;
+	float sc0;
+	float maxabslr;
+	float ratio = *(acomp->ratio);
+	float thresdb = *(acomp->thresdb);
+
+#ifdef LV2_EXTENDED
+	if (acomp->v_knee != *acomp->knee) {
+		acomp->v_knee = *acomp->knee;
+		acomp->need_expose = true;
+	}
+
+	if (acomp->v_ratio != *acomp->ratio) {
+		acomp->v_ratio = *acomp->ratio;
+		acomp->need_expose = true;
+	}
+
+	if (acomp->v_thresdb != *acomp->thresdb) {
+		acomp->v_thresdb = *acomp->thresdb;
+		acomp->need_expose = true;
+	}
+#endif
+
+	float in_peak = 0;
+
+	for (i = 0; i < n_samples; i++) {
+		in0 = input0[i];
+		in1 = input1[i];
+		sc0 = sc[i];
+		maxabslr = fmaxf(fabs(in0), fabs(in1));
+		ingain = usesidechain ? fabs(sc0) : maxabslr;
+		in_peak = fmaxf (in_peak, ingain);
+		Lyg = 0.f;
+		Lxg = (ingain==0.f) ? -160.f : to_dB(ingain);
+		Lxg = sanitize_denormal(Lxg);
+
+
+		if (2.f*(Lxg-thresdb) < -width) {
+			Lyg = Lxg;
+		} else if (2.f*(Lxg-thresdb) > width) {
+			Lyg = thresdb + (Lxg-thresdb)/ratio;
+			Lyg = sanitize_denormal(Lyg);
+		} else {
+			Lyg = Lxg + (1.f/ratio-1.f)*(Lxg-thresdb+width/2.f)*(Lxg-thresdb+width/2.f)/(2.f*width);
+		}
+
+		Lxl = Lxg - Lyg;
+
+		acomp->old_y1 = sanitize_denormal(acomp->old_y1);
+		acomp->old_yl = sanitize_denormal(acomp->old_yl);
+		Ly1 = fmaxf(Lxl, release_coeff * acomp->old_y1+(1.f-release_coeff)*Lxl);
+		Lyl = attack_coeff * acomp->old_yl+(1.f-attack_coeff)*Ly1;
+		Ly1 = sanitize_denormal(Ly1);
+		Lyl = sanitize_denormal(Lyl);
+
+		cdb = -Lyl;
+		Lgain = from_dB(cdb);
+
+		*(acomp->gainr) = Lyl;
+
+		lgaininp = in0 * Lgain;
+		rgaininp = in1 * Lgain;
+		output0[i] = lgaininp * from_dB(*(acomp->makeup));
+		output1[i] = rgaininp * from_dB(*(acomp->makeup));
+
+		max = (fmaxf(fabs(output0[i]), fabs(output1[i])) > max) ? fmaxf(fabs(output0[i]), fabs(output1[i])) : sanitize_denormal(max);
+
+		// TODO re-use local variables on stack
+		// store values back to acomp at the end of the inner-loop
+		acomp->old_yl = Lyl;
+		acomp->old_y1 = Ly1;
+		acomp->old_yg = Lyg;
+	}
+
+	*(acomp->outlevel) = (max < 0.0056f) ? -45.f : to_dB(max);
+
+#ifdef LV2_EXTENDED
+	acomp->v_lvl += .1 * (in_peak - acomp->v_lvl);  // crude LPF TODO use n_samples/rate TC
+	const float v_lvl_in = (acomp->v_lvl < 0.001f) ? -60.f : to_dB(acomp->v_lvl);
+	const float v_lvl_out = (max < 0.001f) ? -60.f : to_dB(max);
+	if (fabsf (acomp->v_lvl_out - v_lvl_out) >= 1 || fabsf (acomp->v_lvl_in - v_lvl_in) >= 1) {
+		// >= 1dB difference
+		acomp->need_expose = true;
+		acomp->v_lvl_in = v_lvl_in;
+		acomp->v_lvl_out = v_lvl_out - *acomp->makeup;
+	}
+	if (acomp->need_expose && acomp->queue_draw) {
+		acomp->need_expose = false;
+		acomp->queue_draw->queue_draw (acomp->queue_draw->handle);
+	}
+#endif
+}
+
+static void
+deactivate(LV2_Handle instance)
+{
+	activate(instance);
+}
+
+static void
+cleanup(LV2_Handle instance)
+{
+#ifdef LV2_EXTENDED
+	AComp* acomp = (AComp*)instance;
+	if (acomp->display) {
+		cairo_surface_destroy (acomp->display);
+	}
+#endif
+
+	free(instance);
+}
+
+
+#ifndef MIN
+#define MIN(A,B) ((A) < (B)) ? (A) : (B)
+#endif
+
+#ifdef LV2_EXTENDED
+static float
+comp_curve (AComp* self, float xg) {
+	const float knee = self->v_knee;
+	const float ratio = self->v_ratio;
+	const float thresdb = self->v_thresdb;
+
+	const float width = 6.f * knee + 0.01f;
+	float yg = 0.f;
+
+	if (2.f * (xg - thresdb) < -width) {
+		yg = xg;
+	} else if (2.f * (xg - thresdb) > width) {
+		yg = thresdb + (xg - thresdb) / ratio;
+	} else {
+		yg = xg + (1.f / ratio - 1.f ) * (xg - thresdb + width / 2.f) * (xg - thresdb + width / 2.f) / (2.f * width);
+	}
+	return yg;
+}
+
+static LV2_Inline_Display_Image_Surface *
+render_inline (LV2_Handle instance, uint32_t w, uint32_t max_h)
+{
+	AComp* self = (AComp*)instance;
+	uint32_t h = MIN (w, max_h);
+
+	if (!self->display || self->w != w || self->h != h) {
+		if (self->display) cairo_surface_destroy(self->display);
+		self->display = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, w, h);
+		self->w = w;
+		self->h = h;
+	}
+
+	cairo_t* cr = cairo_create (self->display);
+
+	// clear background
+	cairo_rectangle (cr, 0, 0, w, h);
+	cairo_set_source_rgba (cr, .2, .2, .2, 1.0);
+	cairo_fill (cr);
+
+	cairo_set_line_width(cr, 1.0);
+
+	// draw grid 10dB steps
+	const double dash1[] = {1, 2};
+	const double dash2[] = {1, 3};
+	cairo_save (cr);
+	cairo_set_line_cap(cr, CAIRO_LINE_CAP_ROUND);
+	cairo_set_dash(cr, dash2, 2, 2);
+	cairo_set_source_rgba (cr, 0.5, 0.5, 0.5, 0.5);
+
+	for (uint32_t d = 1; d < 6; ++d) {
+		const float x = -.5 + floorf (w * (d * 10.f / 60.f));
+		const float y = -.5 + floorf (h * (d * 10.f / 60.f));
+
+		cairo_move_to (cr, x, 0);
+		cairo_line_to (cr, x, h);
+		cairo_stroke (cr);
+
+		cairo_move_to (cr, 0, y);
+		cairo_line_to (cr, w, y);
+		cairo_stroke (cr);
+	}
+	if (self->v_thresdb < 0) {
+		cairo_set_source_rgba (cr, 0.5, 0.5, 0.5, 1.0);
+		const float y = -.5 + floorf (h * (self->v_thresdb / -60.f));
+		cairo_set_dash(cr, dash1, 2, 2);
+		cairo_move_to (cr, 0, y);
+		cairo_line_to (cr, w, y);
+		cairo_stroke (cr);
+		cairo_move_to (cr, 0, h);
+		cairo_line_to (cr, w, 0);
+		cairo_stroke (cr);
+	}
+	cairo_restore (cr);
+
+
+	// draw curve
+	cairo_set_source_rgba (cr, .8, .8, .8, 1.0);
+	cairo_move_to (cr, 0, h);
+
+	for (uint32_t x = 0; x < w; ++x) {
+		// plot -60..0  dB
+		const float x_db = 60.f * (-1.f + x / (float)w);
+		const float y_db = comp_curve (self, x_db);
+		const float y = h * (y_db / -60.f);
+		cairo_line_to (cr, x, y);
+	}
+	cairo_stroke_preserve (cr);
+
+	cairo_line_to (cr, w, h);
+	cairo_close_path (cr);
+	cairo_clip (cr);
+
+	// draw signal level & reduction/gradient
+	const float top = comp_curve (self, 0);
+	cairo_pattern_t* pat = cairo_pattern_create_linear (0.0, 0.0, 0.0, h);
+	if (top > self->v_thresdb) {
+		cairo_pattern_add_color_stop_rgba (pat, 0.0, 0.8, 0.1, 0.1, 0.5);
+		cairo_pattern_add_color_stop_rgba (pat, top / -60.f, 0.8, 0.1, 0.1, 0.5);
+	}
+	if (self->v_knee > 0) {
+		cairo_pattern_add_color_stop_rgba (pat, (self->v_thresdb / -60.f), 0.7, 0.7, 0.2, 0.5);
+		cairo_pattern_add_color_stop_rgba (pat, ((self->v_thresdb - self->v_knee) / -60.f), 0.5, 0.5, 0.5, 0.5);
+	} else {
+		cairo_pattern_add_color_stop_rgba (pat, (self->v_thresdb / -60.f), 0.7, 0.7, 0.2, 0.5);
+		cairo_pattern_add_color_stop_rgba (pat, ((self->v_thresdb - .01) / -60.f), 0.5, 0.5, 0.5, 0.5);
+	}
+	cairo_pattern_add_color_stop_rgba (pat, 1.0, 0.5, 0.5, 0.5, 0.5);
+
+	// maybe cut off at x-position?
+	const float x = w * (self->v_lvl_in + 60) / 60.f;
+	//const float y = h * (self->v_lvl_out + 60) / 60.f;
+	cairo_rectangle (cr, 0, h - x, x, h);
+	if (self->v_ratio > 1.0) {
+		cairo_set_source (cr, pat);
+	} else {
+		cairo_set_source_rgba (cr, 0.5, 0.5, 0.5, 0.5);
+	}
+	cairo_fill (cr);
+
+	cairo_pattern_destroy (pat); // TODO cache pattern
+
+
+	// create RGBA surface
+	cairo_destroy (cr);
+	cairo_surface_flush (self->display);
+	self->surf.width = cairo_image_surface_get_width (self->display);
+	self->surf.height = cairo_image_surface_get_height (self->display);
+	self->surf.stride = cairo_image_surface_get_stride (self->display);
+	self->surf.data = cairo_image_surface_get_data  (self->display);
+
+	return &self->surf;
+}
+#endif
+
+static const void*
+extension_data(const char* uri)
+{
+#ifdef LV2_EXTENDED
+	static const LV2_Inline_Display_Interface display  = { render_inline };
+	if (!strcmp(uri, LV2_INLINEDISPLAY__interface)) {
+		return &display;
+	}
+#endif
+	return NULL;
+}
+
+static const LV2_Descriptor descriptor_mono = {
+	ACOMP_URI,
+	instantiate,
+	connect_port_mono,
+	activate,
+	run_mono,
+	deactivate,
+	cleanup,
+	extension_data
+};
+
+static const LV2_Descriptor descriptor_stereo = {
+	ACOMP_STEREO_URI,
+	instantiate,
+	connect_port_stereo,
+	activate,
+	run_stereo,
+	deactivate,
+	cleanup,
+	extension_data
+};
+
+LV2_SYMBOL_EXPORT
+const LV2_Descriptor*
+lv2_descriptor(uint32_t index)
+{
+	switch (index) {
+	case 0:
+		return &descriptor_mono;
+	case 1:
+		return &descriptor_stereo;
+	default:
+		return NULL;
+	}
+}
diff --git a/libs/plugins/a-comp.lv2/a-comp.ttl.in b/libs/plugins/a-comp.lv2/a-comp.ttl.in
new file mode 100644
index 0000000..058fab8
--- /dev/null
+++ b/libs/plugins/a-comp.lv2/a-comp.ttl.in
@@ -0,0 +1,143 @@
+ at prefix doap: <http://usefulinc.com/ns/doap#> .
+ at prefix foaf: <http://xmlns.com/foaf/0.1/> .
+ at prefix lv2:  <http://lv2plug.in/ns/lv2core#> .
+ at prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
+ at prefix rsz:  <http://lv2plug.in/ns/ext/resize-port#> .
+ at prefix unit: <http://lv2plug.in/ns/extensions/units#> .
+
+<http://ardour.org/credits.html>
+	a foaf:Person ;
+	foaf:name "Ardour Team" ;
+	foaf:homepage <http://ardour.org/> .
+
+<urn:ardour:a-comp>
+    a lv2:Plugin, doap:Project, lv2:CompressorPlugin ;
+
+    lv2:optionalFeature <http://lv2plug.in/ns/lv2core#hardRTCapable>;
+
+    lv2:port [
+        a lv2:InputPort, lv2:ControlPort ;
+        lv2:index 0 ;
+        lv2:name "Attack" ;
+        lv2:symbol "att" ;
+        lv2:default 10.000000 ;
+        lv2:minimum 0.100000 ;
+        lv2:maximum 100.000000 ;
+        unit:unit unit:ms ;
+    ] ,
+    [
+        a lv2:InputPort, lv2:ControlPort ;
+        lv2:index 1 ;
+        lv2:name "Release" ;
+        lv2:symbol "rel" ;
+        lv2:default 80.000000 ;
+        lv2:minimum 1.000000 ;
+        lv2:maximum 500.000000 ;
+        unit:unit unit:ms ;
+    ] ,
+    [
+        a lv2:InputPort, lv2:ControlPort ;
+        lv2:index 2 ;
+        lv2:name "Knee" ;
+        lv2:symbol "kn" ;
+        lv2:default 0.000000 ;
+        lv2:minimum 0.000000 ;
+        lv2:maximum 8.000000 ;
+        unit:unit unit:db ;
+    ] ,
+    [
+        a lv2:InputPort, lv2:ControlPort ;
+        lv2:index 3 ;
+        lv2:name "Ratio" ;
+        lv2:symbol "rat" ;
+        lv2:default 4.000000 ;
+        lv2:minimum 1.000000 ;
+        lv2:maximum 20.000000 ;
+        unit:unit [
+            rdfs:label  " " ;
+            unit:symbol " " ;
+            unit:render "%f  " ;
+        ] ;
+        lv2:portProperty <http://lv2plug.in/ns/ext/port-props#logarithmic> ;
+    ] ,
+    [
+        a lv2:InputPort, lv2:ControlPort ;
+        lv2:index 4 ;
+        lv2:name "Threshold" ;
+        lv2:symbol "thr" ;
+        lv2:default 0.000000 ;
+        lv2:minimum -60.000000 ;
+        lv2:maximum 0.000000 ;
+        unit:unit unit:db ;
+    ] ,
+    [
+        a lv2:InputPort, lv2:ControlPort ;
+        lv2:index 5 ;
+        lv2:name "Makeup" ;
+        lv2:symbol "mak" ;
+        lv2:default 0.000000 ;
+        lv2:minimum 0.000000 ;
+        lv2:maximum 30.000000 ;
+        unit:unit unit:db ;
+    ] ,
+    [
+        a lv2:OutputPort, lv2:ControlPort ;
+        lv2:index 6 ;
+        lv2:name "Gain Reduction" ;
+        lv2:symbol "gr" ;
+        lv2:default 0.000000 ;
+        lv2:minimum 0.000000 ;
+        lv2:maximum 45.000000 ;
+        unit:unit unit:db ;
+    ] ,
+    [
+        a lv2:OutputPort, lv2:ControlPort ;
+        lv2:index 7 ;
+        lv2:name "Output Level" ;
+        lv2:symbol "outlevel" ;
+        lv2:default -45.000000 ;
+        lv2:minimum -45.000000 ;
+        lv2:maximum 0.000000 ;
+        unit:unit unit:db ;
+    ] ,
+    [
+        a lv2:InputPort, lv2:ControlPort ;
+        lv2:index 8 ;
+        lv2:name "Sidechain" ;
+        lv2:symbol "sidech" ;
+        lv2:default 0.000000 ;
+        lv2:minimum 0.000000 ;
+        lv2:maximum 1.000000 ;
+        lv2:portProperty lv2:toggled ;
+    ] ;
+
+    lv2:port [
+        a lv2:InputPort, lv2:AudioPort ;
+        lv2:index 9 ;
+        lv2:symbol "lv2_audio_in_1" ;
+        lv2:name "Audio Input 1" ;
+    ] ,
+    [
+        a lv2:InputPort, lv2:AudioPort ;
+        lv2:index 10 ;
+        lv2:symbol "lv2_sidechain_in" ;
+        lv2:name "Sidechain Input" ;
+        lv2:portProperty lv2:isSideChain;
+    ],
+    [
+        a lv2:OutputPort, lv2:AudioPort ;
+        lv2:index 11 ;
+        lv2:symbol "lv2_audio_out_1" ;
+        lv2:name "Audio Output 1" ;
+    ] ;
+
+    rdfs:comment """
+A powerful mono compressor.
+""" ;
+
+    doap:name "a-Compressor" ;
+		doap:license <http://usefulinc.com/doap/licenses/gpl> ;
+    doap:maintainer <http://ardour.org/credits.html> ;
+
+    lv2:microVersion 1 ;
+    lv2:minorVersion 1 .
diff --git a/libs/plugins/a-comp.lv2/manifest.ttl.in b/libs/plugins/a-comp.lv2/manifest.ttl.in
new file mode 100644
index 0000000..6275985
--- /dev/null
+++ b/libs/plugins/a-comp.lv2/manifest.ttl.in
@@ -0,0 +1,51 @@
+ at prefix lv2:  <http://lv2plug.in/ns/lv2core#> .
+ at prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
+ at prefix pset: <http://lv2plug.in/ns/ext/presets#> .
+
+<urn:ardour:a-comp>
+    a lv2:Plugin ;
+    lv2:binary <a-comp at LIB_EXT@> ;
+    rdfs:seeAlso <a-comp.ttl> .
+
+<urn:ardour:a-comp#stereo>
+    a lv2:Plugin ;
+    lv2:binary <a-comp at LIB_EXT@> ;
+    rdfs:seeAlso <a-comp#stereo.ttl> .
+
+<urn:ardour:a-comp#preset001>
+    a pset:Preset ;
+    lv2:appliesTo <urn:ardour:a-comp> ;
+    rdfs:label "Zero" ;
+    rdfs:seeAlso <presets.ttl> .
+
+<urn:ardour:a-comp#preset002>
+    a pset:Preset ;
+    lv2:appliesTo <urn:ardour:a-comp> ;
+    rdfs:label "PoppySnare" ;
+    rdfs:seeAlso <presets.ttl> .
+
+<urn:ardour:a-comp#preset003>
+    a pset:Preset ;
+    lv2:appliesTo <urn:ardour:a-comp> ;
+    rdfs:label "VocalLeveller" ;
+    rdfs:seeAlso <presets.ttl> .
+
+
+
+<urn:ardour:a-comp#preset001>
+    a pset:Preset ;
+    lv2:appliesTo <urn:ardour:a-comp#stereo> ;
+    rdfs:label "Zero" ;
+    rdfs:seeAlso <presets.ttl> .
+
+<urn:ardour:a-comp#preset002>
+    a pset:Preset ;
+    lv2:appliesTo <urn:ardour:a-comp#stereo> ;
+    rdfs:label "PoppySnare" ;
+    rdfs:seeAlso <presets.ttl> .
+
+<urn:ardour:a-comp#preset003>
+    a pset:Preset ;
+    lv2:appliesTo <urn:ardour:a-comp#stereo> ;
+    rdfs:label "VocalLeveller" ;
+    rdfs:seeAlso <presets.ttl> .
diff --git a/libs/plugins/a-comp.lv2/presets.ttl.in b/libs/plugins/a-comp.lv2/presets.ttl.in
new file mode 100644
index 0000000..9d9b10b
--- /dev/null
+++ b/libs/plugins/a-comp.lv2/presets.ttl.in
@@ -0,0 +1,118 @@
+ at prefix lv2:   <http://lv2plug.in/ns/lv2core#> .
+ at prefix pset:  <http://lv2plug.in/ns/ext/presets#> .
+
+<urn:ardour:a-comp#preset001>
+    lv2:port [
+        lv2:symbol "att" ;
+        pset:value 10.000000 ;
+    ] ,
+    [
+        lv2:symbol "rel" ;
+        pset:value 80.000000 ;
+    ] ,
+    [
+        lv2:symbol "kn" ;
+        pset:value 0.000000 ;
+    ] ,
+    [
+        lv2:symbol "rat" ;
+        pset:value 4.000000 ;
+    ] ,
+    [
+        lv2:symbol "thr" ;
+        pset:value 0.000000 ;
+    ] ,
+    [
+        lv2:symbol "mak" ;
+        pset:value 0.000000 ;
+    ] ,
+    [
+        lv2:symbol "gr" ;
+        pset:value 0.000000 ;
+    ] ,
+    [
+        lv2:symbol "outlevel" ;
+        pset:value -45.000000 ;
+    ] ,
+    [
+        lv2:symbol "sidech" ;
+        pset:value 0.000000 ;
+    ] .
+
+<urn:ardour:a-comp#preset002>
+    lv2:port [
+        lv2:symbol "att" ;
+        pset:value 10.000000 ;
+    ] ,
+    [
+        lv2:symbol "rel" ;
+        pset:value 10.000000 ;
+    ] ,
+    [
+        lv2:symbol "kn" ;
+        pset:value 1.000000 ;
+    ] ,
+    [
+        lv2:symbol "rat" ;
+        pset:value 5.000000 ;
+    ] ,
+    [
+        lv2:symbol "thr" ;
+        pset:value -18.000000 ;
+    ] ,
+    [
+        lv2:symbol "mak" ;
+        pset:value 6.000000 ;
+    ] ,
+    [
+        lv2:symbol "gr" ;
+        pset:value 0.000000 ;
+    ] ,
+    [
+        lv2:symbol "outlevel" ;
+        pset:value -45.000000 ;
+    ] ,
+    [
+        lv2:symbol "sidech" ;
+        pset:value 0.000000 ;
+    ] .
+
+<urn:ardour:a-comp#preset003>
+    lv2:port [
+        lv2:symbol "att" ;
+        pset:value 50.000000 ;
+    ] ,
+    [
+        lv2:symbol "rel" ;
+        pset:value 400.000000 ;
+    ] ,
+    [
+        lv2:symbol "kn" ;
+        pset:value 8.000000 ;
+    ] ,
+    [
+        lv2:symbol "rat" ;
+        pset:value 5.000000 ;
+    ] ,
+    [
+        lv2:symbol "thr" ;
+        pset:value -16.000000 ;
+    ] ,
+    [
+        lv2:symbol "mak" ;
+        pset:value 9.000000 ;
+    ] ,
+    [
+        lv2:symbol "gr" ;
+        pset:value 0.000000 ;
+    ] ,
+    [
+        lv2:symbol "outlevel" ;
+        pset:value -45.000000 ;
+    ] ,
+    [
+        lv2:symbol "sidech" ;
+        pset:value 0.000000 ;
+    ] .
+
+
diff --git a/libs/plugins/a-comp.lv2/wscript b/libs/plugins/a-comp.lv2/wscript
new file mode 100644
index 0000000..f0ebb1d
--- /dev/null
+++ b/libs/plugins/a-comp.lv2/wscript
@@ -0,0 +1,51 @@
+#!/usr/bin/env python
+import os
+import re
+import shutil
+import waflib.extras.autowaf as autowaf
+import waflib.Options as Options, waflib.Utils as Utils
+
+# Mandatory variables
+top = '.'
+out = 'build'
+
+def options(opt):
+    autowaf.set_options(opt)
+
+def configure(conf):
+    conf.load('compiler_c')
+    autowaf.configure(conf)
+    if Options.options.lv2:
+        autowaf.check_pkg(conf, 'lv2', atleast_version='1.0.0',
+                uselib_store='LV2_1_0_0')
+        autowaf.check_pkg(conf, 'cairo', uselib_store='CAIRO', atleast_version='1.12.0') 
+
+def build(bld):
+    bundle = 'a-comp.lv2'
+    module_pat = re.sub('^lib', '', bld.env.cshlib_PATTERN)
+    module_ext = module_pat[module_pat.rfind('.'):]
+
+    if bld.is_defined ('HAVE_LV2'):
+        # Build RDF files
+        for i in ['manifest.ttl', 'a-comp.ttl', 'a-comp#stereo.ttl', 'presets.ttl']:
+            bld(features     = 'subst',
+                source       = i + '.in',
+                target       = '../../LV2/%s/%s' % (bundle, i),
+                install_path = '${LV2DIR}/%s' % bundle,
+                chmod        = Utils.O644,
+                LIB_EXT      = module_ext)
+
+        # Build plugin library
+        obj = bld(features     = 'c cshlib',
+                  source       = 'a-comp.c',
+                  name         = 'a-comp',
+                  cflags       = [ '-fPIC',  bld.env['compiler_flags_dict']['c99'] ],
+                  includes     = [ '../../ardour' ],
+                  target       = '../../LV2/%s/a-comp' % bundle,
+                  install_path = '${LV2DIR}/%s' % bundle,
+                  uselib       = 'CAIRO',
+                  use          = 'LV2_1_0_0'
+                  )
+        obj.env.cshlib_PATTERN = module_pat
+
+# vi:set ts=4 sw=4 et:
diff --git a/libs/plugins/a-delay.lv2/a-delay.c b/libs/plugins/a-delay.lv2/a-delay.c
new file mode 100644
index 0000000..8ad4265
--- /dev/null
+++ b/libs/plugins/a-delay.lv2/a-delay.c
@@ -0,0 +1,489 @@
+/* a-delay
+ * Copyright (C) 2016 Damien Zammit <damien at zamaudio.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#include <math.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "lv2/lv2plug.in/ns/lv2core/lv2.h"
+#include "lv2/lv2plug.in/ns/ext/atom/atom.h"
+#include "lv2/lv2plug.in/ns/ext/time/time.h"
+#include "lv2/lv2plug.in/ns/ext/atom/forge.h"
+#include "lv2/lv2plug.in/ns/ext/urid/urid.h"
+
+#define ADELAY_URI "urn:ardour:a-delay"
+
+// 8 seconds of delay at 96kHz
+#define MAX_DELAY 768000
+
+#ifndef M_PI
+# define M_PI 3.1415926
+#endif
+
+typedef enum {
+	ADELAY_INPUT = 0,
+	ADELAY_OUTPUT,
+
+	ADELAY_BPM,
+
+	ADELAY_INV,
+	ADELAY_SYNC,
+	ADELAY_TIME,
+	ADELAY_DIVISOR,
+	ADELAY_WETDRY,
+	ADELAY_FEEDBACK,
+	ADELAY_LPF,
+	ADELAY_GAIN,
+	
+	ADELAY_DELAYTIME,
+} PortIndex;
+
+
+typedef struct {
+	LV2_URID atom_Blank;
+	LV2_URID atom_Object;
+	LV2_URID atom_Sequence;
+	LV2_URID atom_Long;
+	LV2_URID atom_Int;
+	LV2_URID atom_Float;
+	LV2_URID atom_Double;
+	LV2_URID time_beatUnit;
+	LV2_URID time_beatsPerMinute;
+	LV2_URID time_Position;
+} DelayURIs;
+
+typedef struct {
+	float* input;
+	float* output;
+
+	const LV2_Atom_Sequence* atombpm;
+
+	float* inv;
+	float* sync;
+	float* time;
+	float* divisor;
+	float* wetdry;
+	float* feedback;
+	float* lpf;
+	float* gain;
+	
+	float* delaytime;
+
+	float srate;
+	float bpm;
+	float beatunit;
+	int bpmvalid;
+
+	uint32_t posz;
+	float tap[2];
+	float z[MAX_DELAY];
+	int active;
+	int next;
+	float fbstate;
+	float lpfold;
+	float feedbackold;
+	float divisorold;
+	float gainold;
+	float invertold;
+	float timeold;
+	float delaytimeold;
+	float syncold;
+	float wetdryold;
+	float delaysamplesold;
+	float tau;
+
+	float A0, A1, A2, A3, A4, A5;
+	float B0, B1, B2, B3, B4, B5;
+	float state[4];
+
+	DelayURIs uris;
+	LV2_Atom_Forge forge;
+	LV2_URID_Map* map;
+} ADelay;
+
+static inline void
+map_uris(LV2_URID_Map* map, DelayURIs* uris)
+{
+	uris->atom_Blank          = map->map(map->handle, LV2_ATOM__Blank);
+	uris->atom_Object         = map->map(map->handle, LV2_ATOM__Object);
+	uris->atom_Sequence       = map->map(map->handle, LV2_ATOM__Sequence);
+	uris->atom_Long           = map->map(map->handle, LV2_ATOM__Long);
+	uris->atom_Int            = map->map(map->handle, LV2_ATOM__Int);
+	uris->atom_Float          = map->map(map->handle, LV2_ATOM__Float);
+	uris->atom_Double         = map->map(map->handle, LV2_ATOM__Double);
+	uris->time_beatUnit       = map->map(map->handle, LV2_TIME__beatUnit);
+	uris->time_beatsPerMinute = map->map(map->handle, LV2_TIME__beatsPerMinute);
+	uris->time_Position       = map->map(map->handle, LV2_TIME__Position);
+}
+
+static LV2_Handle
+instantiate(const LV2_Descriptor* descriptor,
+            double rate,
+            const char* bundle_path,
+            const LV2_Feature* const* features)
+{
+	int i;
+	ADelay* adelay = (ADelay*)calloc(1, sizeof(ADelay));
+	if (!adelay) return NULL;
+
+	for (i = 0; features[i]; ++i) {
+		if (!strcmp(features[i]->URI, LV2_URID__map)) {
+			adelay->map = (LV2_URID_Map*)features[i]->data;
+		}
+	}
+
+	if (!adelay->map) {
+		fprintf(stderr, "a-delay.lv2 error: Host does not support urid:map\n");
+		free(adelay);
+		return NULL;
+	}
+
+	map_uris(adelay->map, &adelay->uris);
+	lv2_atom_forge_init(&adelay->forge, adelay->map);
+
+	adelay->srate = rate;
+	adelay->bpmvalid = 0;
+	// 25Hz time constant @ 64fpp
+	adelay->tau = (1.0 - exp(-2.0 * M_PI * 64. * 25. / adelay->srate));
+
+	return (LV2_Handle)adelay;
+}
+
+static void
+connect_port(LV2_Handle instance,
+             uint32_t port,
+             void* data)
+{
+	ADelay* adelay = (ADelay*)instance;
+
+	switch ((PortIndex)port) {
+	case ADELAY_INPUT:
+		adelay->input = (float*)data;
+		break;
+	case ADELAY_OUTPUT:
+		adelay->output = (float*)data;
+		break;
+	case ADELAY_BPM:
+		adelay->atombpm = (const LV2_Atom_Sequence*)data;
+		break;
+	case ADELAY_INV:
+		adelay->inv = (float*)data;
+		break;
+	case ADELAY_SYNC:
+		adelay->sync = (float*)data;
+		break;
+	case ADELAY_TIME:
+		adelay->time = (float*)data;
+		break;
+	case ADELAY_DIVISOR:
+		adelay->divisor = (float*)data;
+		break;
+	case ADELAY_WETDRY:
+		adelay->wetdry = (float*)data;
+		break;
+	case ADELAY_FEEDBACK:
+		adelay->feedback = (float*)data;
+		break;
+	case ADELAY_LPF:
+		adelay->lpf = (float*)data;
+		break;
+	case ADELAY_GAIN:
+		adelay->gain = (float*)data;
+		break;
+	case ADELAY_DELAYTIME:
+		adelay->delaytime = (float*)data;
+		break;
+	}
+}
+
+static inline float
+sanitize_denormal(float value) {
+	if (!isnormal(value)) {
+		value = 0.f;
+	}
+	return value;
+}
+
+static inline float
+from_dB(float gdb) {
+	return (exp(gdb/20.f*log(10.f)));
+}
+
+static inline float
+to_dB(float g) {
+	return (20.f*log10(g));
+}
+
+static inline bool
+is_eq(float a, float b, float small) {
+	return (fabsf(a - b) < small);
+}
+
+static void clearfilter(LV2_Handle instance)
+{
+	ADelay* adelay = (ADelay*)instance;
+
+	adelay->state[0] = adelay->state[1] =
+		adelay->state[2] = adelay->state[3] = 0.f;
+}
+
+static void
+activate(LV2_Handle instance)
+{
+	ADelay* adelay = (ADelay*)instance;
+
+	int i;
+	for (i = 0; i < MAX_DELAY; i++) {
+		adelay->z[i] = 0.f;
+	}
+	adelay->posz = 0;
+	adelay->tap[0] = 0;
+	adelay->tap[1] = 0;
+	adelay->active = 0;
+	adelay->next = 1;
+	adelay->fbstate = 0.f;
+
+	clearfilter(adelay);
+
+	adelay->lpfold = 0.f;
+	adelay->divisorold = 0.f;
+	adelay->gainold = 0.f;
+	adelay->invertold = 0.f;
+	adelay->timeold = 0.f;
+	adelay->delaytimeold = 0.f;
+	adelay->syncold = 0.f;
+	adelay->wetdryold = 0.f;
+	adelay->delaysamplesold = 1.f;
+}
+
+static void lpfRbj(LV2_Handle instance, float fc, float srate)
+{
+	ADelay* adelay = (ADelay*)instance;
+
+	float w0, alpha, cw, sw, q;
+	q = 0.707;
+	w0 = (2. * M_PI * fc / srate);
+	sw = sin(w0);
+	cw = cos(w0);
+	alpha = sw / (2. * q);
+
+	adelay->A0 = 1. + alpha;
+	adelay->A1 = -2. * cw;
+	adelay->A2 = 1. - alpha;
+	adelay->B0 = (1. - cw) / 2.;
+	adelay->B1 = (1. - cw);
+	adelay->B2 = adelay->B0;
+
+	adelay->A3 = 1. + alpha;
+	adelay->A4 = -2. * cw;
+	adelay->A5 = 1. - alpha;
+	adelay->B3 = (1. - cw) / 2.;
+	adelay->B4 = (1. - cw);
+	adelay->B5 = adelay->B3;
+}
+
+static float runfilter(LV2_Handle instance, float in)
+{
+	ADelay* a = (ADelay*)instance;
+
+	float out;
+	in = sanitize_denormal(in);
+
+	out = a->B0/a->A0*in + a->B1/a->A0*a->state[0] + a->B2/a->A0*a->state[1]
+			-a->A1/a->A0*a->state[2] - a->A2/a->A0*a->state[3] + 1e-20;
+
+	a->state[1] = a->state[0];
+	a->state[0] = in;
+	a->state[3] = a->state[2];
+	a->state[2] = out;
+	return out;
+}
+
+static void
+update_bpm(ADelay* self, const LV2_Atom_Object* obj)
+{
+	const DelayURIs* uris = &self->uris;
+
+	// Received new transport bpm/beatunit
+	LV2_Atom *beatunit = NULL, *bpm = NULL;
+	lv2_atom_object_get(obj,
+	                    uris->time_beatUnit, &beatunit,
+	                    uris->time_beatsPerMinute, &bpm,
+	                    NULL);
+	// Tempo changed, update BPM
+	if (bpm && bpm->type == uris->atom_Float) {
+		self->bpm = ((LV2_Atom_Float*)bpm)->body;
+	}
+	// Time signature changed, update beatunit
+	if (beatunit && beatunit->type == uris->atom_Int) {
+		int b = ((LV2_Atom_Int*)beatunit)->body;
+		self->beatunit = (float)b;
+	}
+	if (beatunit && beatunit->type == uris->atom_Double) {
+		double b = ((LV2_Atom_Double*)beatunit)->body;
+		self->beatunit = (float)b;
+	}
+	if (beatunit && beatunit->type == uris->atom_Float) {
+		self->beatunit = ((LV2_Atom_Float*)beatunit)->body;
+	}
+	if (beatunit && beatunit->type == uris->atom_Long) {
+		long int b = ((LV2_Atom_Long*)beatunit)->body;
+		self->beatunit = (float)b;
+	}
+	self->bpmvalid = 1;
+}
+
+static void
+run(LV2_Handle instance, uint32_t n_samples)
+{
+	ADelay* adelay = (ADelay*)instance;
+
+	const float* const input = adelay->input;
+	float* const output = adelay->output;
+
+	float srate = adelay->srate;
+	float tau = adelay->tau;
+
+	uint32_t i;
+	float in;
+	int delaysamples = 0;
+	unsigned int tmp;
+	float inv;
+	float xfade;
+	int recalc;
+	if (*(adelay->inv) < 0.5) {
+		inv = -1.f;
+	} else {
+		inv = 1.f;
+	}
+	
+	recalc = 0;
+	if (*(adelay->inv) != adelay->invertold) {
+		recalc = 1;
+	}
+	if (*(adelay->sync) != adelay->syncold) {
+		recalc = 1;
+	}
+	if (*(adelay->time) != adelay->timeold) {
+		recalc = 1;
+	}
+	if (*(adelay->feedback) != adelay->feedbackold) {
+		recalc = 1;
+	}
+	if (*(adelay->divisor) != adelay->divisorold) {
+		recalc = 1;
+	}
+	if (!is_eq(adelay->lpfold, *adelay->lpf, 0.1)) {
+		adelay->lpfold += tau * (*adelay->lpf - adelay->lpfold);
+		recalc = 1;
+	}
+	if (*(adelay->gain) != adelay->gainold) {
+		recalc = 1;
+	}
+	
+	if (recalc) {
+		lpfRbj(adelay, adelay->lpfold, srate);
+		if (*(adelay->sync) > 0.5f && adelay->bpmvalid) {
+			*(adelay->delaytime) = adelay->beatunit * 1000.f * 60.f / (adelay->bpm * *(adelay->divisor));
+		} else {
+			*(adelay->delaytime) = *(adelay->time);
+		}
+		delaysamples = (int)(*(adelay->delaytime) * srate) / 1000;
+		adelay->tap[adelay->next] = delaysamples;
+	}
+
+	xfade = 0.f;
+	for (i = 0; i < n_samples; i++) {
+		in = input[i];
+		adelay->z[adelay->posz] = in + *adelay->feedback / 100. * adelay->fbstate;
+		adelay->fbstate = 0.f;
+		int p = adelay->posz - adelay->tap[adelay->active]; // active line
+		if (p<0) p += MAX_DELAY;
+		adelay->fbstate += adelay->z[p];
+		
+		if (recalc) {
+			xfade += 1.0f / (float)n_samples;
+			adelay->fbstate *= (1.-xfade);
+			p = adelay->posz - adelay->tap[adelay->next]; // next line
+			if (p<0) p += MAX_DELAY;
+			adelay->fbstate += adelay->z[p] * xfade;
+		}
+		output[i] = from_dB(*(adelay->gain)) * ((100.-*(adelay->wetdry)) / 100. * in + *(adelay->wetdry) / 100. * -inv * runfilter(adelay, adelay->fbstate));
+		if (++(adelay->posz) >= MAX_DELAY) {
+			adelay->posz = 0;
+		}
+	}
+	adelay->feedbackold = *(adelay->feedback);
+	adelay->divisorold = *(adelay->divisor);
+	adelay->gainold = *(adelay->gain);
+	adelay->invertold = *(adelay->inv);
+	adelay->timeold = *(adelay->time);
+	adelay->syncold = *(adelay->sync);
+	adelay->wetdryold = *(adelay->wetdry);
+	adelay->delaytimeold = *(adelay->delaytime);
+	adelay->delaysamplesold = delaysamples;
+	if (recalc) {
+		tmp = adelay->active;
+		adelay->active = adelay->next;
+		adelay->next = tmp;
+	}
+	
+	if (adelay->atombpm) {
+		LV2_Atom_Event* ev = lv2_atom_sequence_begin(&(adelay->atombpm)->body);
+		while(!lv2_atom_sequence_is_end(&(adelay->atombpm)->body, (adelay->atombpm)->atom.size, ev)) {
+			if (ev->body.type == adelay->uris.atom_Blank || ev->body.type == adelay->uris.atom_Object) {
+				const LV2_Atom_Object* obj = (LV2_Atom_Object*)&ev->body;
+				if (obj->body.otype == adelay->uris.time_Position) {
+					update_bpm(adelay, obj);
+				}
+			}
+			ev = lv2_atom_sequence_next(ev);
+		}
+	}
+}
+
+static void
+cleanup(LV2_Handle instance)
+{
+	free(instance);
+}
+
+static const void*
+extension_data(const char* uri)
+{
+	return NULL;
+}
+
+static const LV2_Descriptor descriptor = {
+	ADELAY_URI,
+	instantiate,
+	connect_port,
+	activate,
+	run,
+	NULL,
+	cleanup,
+	extension_data
+};
+
+LV2_SYMBOL_EXPORT
+const LV2_Descriptor*
+lv2_descriptor(uint32_t index)
+{
+	switch (index) {
+	case 0:
+		return &descriptor;
+	default:
+		return NULL;
+	}
+}
diff --git a/libs/plugins/a-delay.lv2/a-delay.ttl.in b/libs/plugins/a-delay.lv2/a-delay.ttl.in
new file mode 100644
index 0000000..2e29038
--- /dev/null
+++ b/libs/plugins/a-delay.lv2/a-delay.ttl.in
@@ -0,0 +1,161 @@
+ at prefix atom: <http://lv2plug.in/ns/ext/atom#> .
+ at prefix doap: <http://usefulinc.com/ns/doap#> .
+ at prefix foaf: <http://xmlns.com/foaf/0.1/> .
+ at prefix lv2:  <http://lv2plug.in/ns/lv2core#> .
+ at prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
+ at prefix rsz:  <http://lv2plug.in/ns/ext/resize-port#> .
+ at prefix unit: <http://lv2plug.in/ns/extensions/units#> .
+ at prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
+
+<http://ardour.org/credits.html>
+	a foaf:Person ;
+	foaf:name "Ardour Team" ;
+	foaf:homepage <http://ardour.org/> .
+
+<urn:ardour:a-delay>
+    a lv2:Plugin, doap:Project, lv2:DelayPlugin ;
+
+    lv2:optionalFeature <http://lv2plug.in/ns/lv2core#hardRTCapable>;
+
+    lv2:requiredFeature <http://lv2plug.in/ns/ext/options#options> ,
+                        <http://lv2plug.in/ns/ext/urid#map> ;
+
+    lv2:port [
+        a lv2:InputPort, lv2:AudioPort ;
+        lv2:index 0 ;
+        lv2:symbol "in_1" ;
+        lv2:name "Audio Input 1" ;
+    ] ;
+
+    lv2:port [
+        a lv2:OutputPort, lv2:AudioPort ;
+        lv2:index 1 ;
+        lv2:symbol "out_1" ;
+        lv2:name "Audio Output 1" ;
+    ] ;
+
+    lv2:port [
+        a lv2:InputPort, atom:AtomPort ;
+        lv2:index 2 ;
+        lv2:name "BPM Input" ;
+        lv2:symbol "bpm_in" ;
+        rsz:minimumSize 2048 ;
+        atom:bufferType atom:Sequence ;
+        atom:supports <http://lv2plug.in/ns/ext/time#Position> ;
+    ] ;
+
+    lv2:port [
+        a lv2:InputPort, lv2:ControlPort ;
+        lv2:index 3 ;
+        lv2:name "Invert" ;
+        lv2:symbol "inv" ;
+        lv2:default 0.000000 ;
+        lv2:minimum 0.000000 ;
+        lv2:maximum 1.000000 ;
+        lv2:portProperty lv2:toggled ;
+    ] ,
+    [
+        a lv2:InputPort, lv2:ControlPort ;
+        lv2:index 4 ;
+        lv2:name "Sync BPM" ;
+        lv2:symbol "sync" ;
+        lv2:default 0.000000 ;
+        lv2:minimum 0.000000 ;
+        lv2:maximum 1.000000 ;
+        lv2:portProperty lv2:toggled ;
+    ] ,
+    [
+        a lv2:InputPort, lv2:ControlPort ;
+        lv2:index 5 ;
+        lv2:name "Time" ;
+        lv2:symbol "time" ;
+        lv2:default 160.000000 ;
+        lv2:minimum 1.000000 ;
+        lv2:maximum 8000.000000 ;
+        unit:unit unit:ms ;
+        lv2:portProperty <http://lv2plug.in/ns/ext/port-props#logarithmic> ;
+    ] ,
+    [
+        a lv2:InputPort, lv2:ControlPort ;
+        lv2:index 6 ;
+        lv2:name "Divisor" ;
+        lv2:symbol "div" ;
+        lv2:default 4 ;
+        lv2:minimum 1 ;
+        lv2:maximum 48 ;
+        lv2:portProperty <http://lv2plug.in/ns/ext/port-props#hasStrictBounds> ;
+        lv2:portProperty lv2:enumeration ;
+        lv2:portProperty lv2:integer ;
+        lv2:scalePoint [ rdfs:label "a - Whole note"; rdf:value 1 ] ;
+        lv2:scalePoint [ rdfs:label "b - Half note"; rdf:value 2 ] ;
+        lv2:scalePoint [ rdfs:label "c - ♩"; rdf:value 4 ] ;
+        lv2:scalePoint [ rdfs:label "d - ♪"; rdf:value 8 ] ;
+        lv2:scalePoint [ rdfs:label "e - ♬"; rdf:value 16 ] ;
+        lv2:scalePoint [ rdfs:label "f - 32nd note"; rdf:value 32 ] ;
+        lv2:scalePoint [ rdfs:label "g - ♩³ (Triplet)"; rdf:value 6 ] ;
+        lv2:scalePoint [ rdfs:label "h - ♪³ (Triplet)"; rdf:value 12 ] ;
+        lv2:scalePoint [ rdfs:label "i - ♬³ (Triplet)"; rdf:value 24 ] ;
+        lv2:scalePoint [ rdfs:label "j - 32nd note (Triplet)"; rdf:value 48 ] ;
+    ] ,
+    [
+        a lv2:InputPort, lv2:ControlPort ;
+        lv2:index 7 ;
+        lv2:name "Dry/Wet" ;
+        lv2:symbol "drywet" ;
+        lv2:default 50.000000 ;
+        lv2:minimum 0.000000 ;
+        lv2:maximum 100.000000 ;
+        unit:unit unit:pc ;
+    ] ,
+    [
+        a lv2:InputPort, lv2:ControlPort ;
+        lv2:index 8 ;
+        lv2:name "Feedback" ;
+        lv2:symbol "feedback" ;
+        lv2:default 20.000000 ;
+        lv2:minimum 0.000000 ;
+        lv2:maximum 100.000000 ;
+        unit:unit unit:pc ;
+    ] ,
+    [
+        a lv2:InputPort, lv2:ControlPort ;
+        lv2:index 9 ;
+        lv2:name "LPF" ;
+        lv2:symbol "lpf" ;
+        lv2:default 6000.000000 ;
+        lv2:minimum 20.000000 ;
+        lv2:maximum 20000.000000 ;
+        unit:unit unit:hz ;
+        lv2:portProperty <http://lv2plug.in/ns/ext/port-props#logarithmic> ;
+    ] ,
+    [
+        a lv2:InputPort, lv2:ControlPort ;
+        lv2:index 10 ;
+        lv2:name "Output Gain" ;
+        lv2:symbol "gain" ;
+        lv2:default 0.000000 ;
+        lv2:minimum -60.000000 ;
+        lv2:maximum 0.000000 ;
+        unit:unit unit:db ;
+    ] ,
+    [
+        a lv2:OutputPort, lv2:ControlPort ;
+        lv2:index 11 ;
+        lv2:name "Delaytime" ;
+        lv2:symbol "delaytime" ;
+        lv2:default 0.000000 ;
+        lv2:minimum 1.000000 ;
+        lv2:maximum 8000.000000 ;
+        unit:unit unit:ms ;
+    ] ;
+
+    rdfs:comment """
+A simple delay plugin
+""" ;
+
+    doap:name "a-Delay" ;
+    doap:license "GPL v2+" ;
+    doap:maintainer <http://ardour.org/credits.html> ;
+
+    lv2:microVersion 1 ;
+    lv2:minorVersion 1 .
diff --git a/libs/plugins/a-delay.lv2/manifest.ttl.in b/libs/plugins/a-delay.lv2/manifest.ttl.in
new file mode 100644
index 0000000..84ca864
--- /dev/null
+++ b/libs/plugins/a-delay.lv2/manifest.ttl.in
@@ -0,0 +1,20 @@
+ at prefix lv2:  <http://lv2plug.in/ns/lv2core#> .
+ at prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
+ at prefix pset: <http://lv2plug.in/ns/ext/presets#> .
+ at prefix ui:   <http://lv2plug.in/ns/extensions/ui#> .
+
+<urn:ardour:a-delay>
+    a lv2:Plugin ;
+    lv2:binary <a-delay at LIB_EXT@> ;
+    rdfs:seeAlso <a-delay.ttl> .
+
+#<urn:ardour:a-delay#ui>
+#    a ui:GtkUI ;
+#    ui:binary <a-delay-ui at LIB_EXT@> ;
+#    rdfs:seeAlso <a-delay.ttl> .
+
+<urn:ardour:a-delay#preset001>
+    a pset:Preset ;
+    lv2:appliesTo <urn:ardour:a-delay> ;
+    rdfs:label "Zero" ;
+    rdfs:seeAlso <presets.ttl> .
diff --git a/libs/plugins/a-delay.lv2/presets.ttl.in b/libs/plugins/a-delay.lv2/presets.ttl.in
new file mode 100644
index 0000000..1bde45c
--- /dev/null
+++ b/libs/plugins/a-delay.lv2/presets.ttl.in
@@ -0,0 +1,38 @@
+ at prefix lv2:   <http://lv2plug.in/ns/lv2core#> .
+ at prefix pset:  <http://lv2plug.in/ns/ext/presets#> .
+
+<urn:ardour:a-delay#preset001>
+    lv2:port [
+        lv2:symbol "inv" ;
+        pset:value 0.000000 ;
+    ] ,
+    [
+        lv2:symbol "sync" ;
+        pset:value 0.000000 ;
+    ] ,
+    [
+        lv2:symbol "time" ;
+        pset:value 160.000000 ;
+    ] ,
+    [
+        lv2:symbol "div" ;
+        pset:value 3 ;
+    ] ,
+    [
+        lv2:symbol "drywet" ;
+        pset:value 50.000000 ;
+    ] ,
+    [
+        lv2:symbol "lpf" ;
+        pset:value 6000.000000 ;
+    ] ,
+    [
+        lv2:symbol "gain" ;
+        pset:value 0.000000 ;
+    ] ,
+    [
+        lv2:symbol "delaytime" ;
+        pset:value 0.000000 ;
+    ] .
+
+
diff --git a/libs/plugins/a-delay.lv2/wscript b/libs/plugins/a-delay.lv2/wscript
new file mode 100644
index 0000000..666ef0d
--- /dev/null
+++ b/libs/plugins/a-delay.lv2/wscript
@@ -0,0 +1,52 @@
+#!/usr/bin/env python
+import os
+import re
+import shutil
+import waflib.extras.autowaf as autowaf
+import waflib.Options as Options, waflib.Utils as Utils
+
+# Mandatory variables
+top = '.'
+out = 'build'
+
+def options(opt):
+    autowaf.set_options(opt)
+
+def configure(conf):
+    conf.load('compiler_c')
+    autowaf.configure(conf)
+    if Options.options.lv2:
+        autowaf.check_pkg(conf, 'lv2', atleast_version='1.0.0',
+                uselib_store='LV2_1_0_0')
+        autowaf.check_pkg(conf, 'cairo', uselib_store='CAIRO', atleast_version='1.12.0') 
+
+def build(bld):
+    bundle = 'a-delay.lv2'
+    module_pat = re.sub('^lib', '', bld.env.cshlib_PATTERN)
+    module_ext = module_pat[module_pat.rfind('.'):]
+
+    if bld.is_defined ('HAVE_LV2'):
+        # Build RDF files
+        for i in ['manifest.ttl', 'a-delay.ttl', 'presets.ttl']:
+            bld(features     = 'subst',
+                source       = i + '.in',
+                target       = '../../LV2/%s/%s' % (bundle, i),
+                install_path = '${LV2DIR}/%s' % bundle,
+                chmod        = Utils.O644,
+                LIB_EXT      = module_ext)
+
+        # Build plugin library
+        obj = bld(features     = 'c cshlib',
+                  source       = 'a-delay.c',
+                  name         = 'a-delay',
+                  cflags       = [ '-fPIC',  bld.env['compiler_flags_dict']['c99'] ],
+                  includes     = [ '../../ardour' ],
+                  target       = '../../LV2/%s/a-delay' % bundle,
+                  install_path = '${LV2DIR}/%s' % bundle,
+                  uselib       = 'CAIRO',
+                  use          = 'LV2_1_0_0'
+                  )
+        obj.env.cshlib_PATTERN = module_pat
+        obj.env.cxxshlib_PATTERN = module_pat
+
+# vi:set ts=4 sw=4 et:
diff --git a/libs/plugins/a-eq.lv2/a-eq.c b/libs/plugins/a-eq.lv2/a-eq.c
new file mode 100644
index 0000000..bb9840d
--- /dev/null
+++ b/libs/plugins/a-eq.lv2/a-eq.c
@@ -0,0 +1,640 @@
+/* a-eq
+ * Copyright (C) 2016 Damien Zammit <damien at zamaudio.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE // needed for M_PI
+#endif
+
+#include <math.h>
+#include <complex.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdbool.h>
+#include <stdio.h>
+
+#include "lv2/lv2plug.in/ns/lv2core/lv2.h"
+
+#ifdef LV2_EXTENDED
+#include <cairo/cairo.h>
+#include "ardour/lv2_extensions.h"
+#endif
+
+#define AEQ_URI	"urn:ardour:a-eq"
+#define BANDS	6
+#ifndef MIN
+#define MIN(A,B) ((A) < (B)) ? (A) : (B)
+#endif
+
+typedef enum {
+	AEQ_FREQL = 0,
+	AEQ_GAINL,
+	AEQ_FREQ1,
+	AEQ_GAIN1,
+	AEQ_BW1,
+	AEQ_FREQ2,
+	AEQ_GAIN2,
+	AEQ_BW2,
+	AEQ_FREQ3,
+	AEQ_GAIN3,
+	AEQ_BW3,
+	AEQ_FREQ4,
+	AEQ_GAIN4,
+	AEQ_BW4,
+	AEQ_FREQH,
+	AEQ_GAINH,
+	AEQ_MASTER,
+	AEQ_FILTOGL,
+	AEQ_FILTOG1,
+	AEQ_FILTOG2,
+	AEQ_FILTOG3,
+	AEQ_FILTOG4,
+	AEQ_FILTOGH,
+	AEQ_INPUT,
+	AEQ_OUTPUT,
+} PortIndex;
+
+static inline double
+to_dB(double g) {
+	return (20.0*log10(g));
+}
+
+static inline double
+from_dB(double gdb) {
+	return (exp(gdb/20.0*log(10.0)));
+}
+
+static inline bool
+is_eq(float a, float b, float small) {
+	return (fabsf(a - b) < small);
+}
+
+struct linear_svf {
+	double g, k;
+	double a[3];
+	double m[3];
+	double s[2];
+};
+
+static void linear_svf_reset(struct linear_svf *self)
+{
+	self->s[0] = self->s[1] = 0.0;
+}
+
+typedef struct {
+	float* f0[BANDS];
+	float* g[BANDS];
+	float* bw[BANDS];
+	float* filtog[BANDS];
+	float* master;
+
+	float srate;
+	float tau;
+
+	float* input;
+	float* output;
+
+	struct linear_svf v_filter[BANDS];
+	float v_g[BANDS];
+	float v_bw[BANDS];
+	float v_f0[BANDS];
+	float v_master;
+
+	bool need_expose;
+
+#ifdef LV2_EXTENDED
+	LV2_Inline_Display_Image_Surface surf;
+	cairo_surface_t*                 display;
+	LV2_Inline_Display*              queue_draw;
+	uint32_t                         w, h;
+#endif
+} Aeq;
+
+static LV2_Handle
+instantiate(const LV2_Descriptor* descriptor,
+            double rate,
+            const char* bundle_path,
+            const LV2_Feature* const* features)
+{
+	Aeq* aeq = (Aeq*)calloc(1, sizeof(Aeq));
+	aeq->srate = rate;
+	aeq->tau = (1.0 - exp(-2.0 * M_PI * 64 * 25. / aeq->srate)); // 25Hz time constant @ 64fpp
+
+#ifdef LV2_EXTENDED
+	for (int i=0; features[i]; ++i) {
+		if (!strcmp(features[i]->URI, LV2_INLINEDISPLAY__queue_draw)) {
+			aeq->queue_draw = (LV2_Inline_Display*) features[i]->data;
+		}
+	}
+#endif
+
+	for (int i = 0; i < BANDS; i++)
+		linear_svf_reset(&aeq->v_filter[i]);
+
+	aeq->need_expose = true;
+#ifdef LV2_EXTENDED
+	aeq->display = NULL;
+#endif
+
+	return (LV2_Handle)aeq;
+}
+
+static void
+connect_port(LV2_Handle instance,
+             uint32_t port,
+             void* data)
+{
+	Aeq* aeq = (Aeq*)instance;
+
+	switch ((PortIndex)port) {
+	case AEQ_FREQL:
+		aeq->f0[0] = (float*)data;
+		break;
+	case AEQ_GAINL:
+		aeq->g[0] = (float*)data;
+		break;
+	case AEQ_FREQ1:
+		aeq->f0[1] = (float*)data;
+		break;
+	case AEQ_GAIN1:
+		aeq->g[1] = (float*)data;
+		break;
+	case AEQ_BW1:
+		aeq->bw[1] = (float*)data;
+		break;
+	case AEQ_FREQ2:
+		aeq->f0[2] = (float*)data;
+		break;
+	case AEQ_GAIN2:
+		aeq->g[2] = (float*)data;
+		break;
+	case AEQ_BW2:
+		aeq->bw[2] = (float*)data;
+		break;
+	case AEQ_FREQ3:
+		aeq->f0[3] = (float*)data;
+		break;
+	case AEQ_GAIN3:
+		aeq->g[3] = (float*)data;
+		break;
+	case AEQ_BW3:
+		aeq->bw[3] = (float*)data;
+		break;
+	case AEQ_FREQ4:
+		aeq->f0[4] = (float*)data;
+		break;
+	case AEQ_GAIN4:
+		aeq->g[4] = (float*)data;
+		break;
+	case AEQ_BW4:
+		aeq->bw[4] = (float*)data;
+		break;
+	case AEQ_FREQH:
+		aeq->f0[5] = (float*)data;
+		break;
+	case AEQ_GAINH:
+		aeq->g[5] = (float*)data;
+		break;
+	case AEQ_MASTER:
+		aeq->master = (float*)data;
+		break;
+	case AEQ_FILTOGL:
+		aeq->filtog[0] = (float*)data;
+		break;
+	case AEQ_FILTOG1:
+		aeq->filtog[1] = (float*)data;
+		break;
+	case AEQ_FILTOG2:
+		aeq->filtog[2] = (float*)data;
+		break;
+	case AEQ_FILTOG3:
+		aeq->filtog[3] = (float*)data;
+		break;
+	case AEQ_FILTOG4:
+		aeq->filtog[4] = (float*)data;
+		break;
+	case AEQ_FILTOGH:
+		aeq->filtog[5] = (float*)data;
+		break;
+	case AEQ_INPUT:
+		aeq->input = (float*)data;
+		break;
+	case AEQ_OUTPUT:
+		aeq->output = (float*)data;
+		break;
+	}
+}
+
+static void
+activate(LV2_Handle instance)
+{
+	int i;
+	Aeq* aeq = (Aeq*)instance;
+
+	for (i = 0; i < BANDS; i++)
+		linear_svf_reset(&aeq->v_filter[i]);
+}
+
+// SVF filters
+// http://www.cytomic.com/files/dsp/SvfLinearTrapOptimised2.pdf
+
+static void linear_svf_set_peq(struct linear_svf *self, float gdb, float sample_rate, float cutoff, float bandwidth)
+{
+	double f0 = (double)cutoff;
+	double q = (double)pow(2.0, 1.0 / bandwidth) / (pow(2.0, bandwidth) - 1.0);
+	double sr = (double)sample_rate;
+	double A = pow(10.0, gdb/40.0);
+
+	self->g = tan(M_PI * (f0 / sr));
+	self->k = 1.0 / (q * A);
+
+	self->a[0] = 1.0 / (1.0 + self->g * (self->g + self->k));
+	self->a[1] = self->g * self->a[0];
+	self->a[2] = self->g * self->a[1];
+
+	self->m[0] = 1.0;
+	self->m[1] = self->k * (A * A - 1.0);
+	self->m[2] = 0.0;
+}
+
+static void linear_svf_set_highshelf(struct linear_svf *self, float gdb, float sample_rate, float cutoff, float resonance)
+{
+	double f0 = (double)cutoff;
+	double q = (double)resonance;
+	double sr = (double)sample_rate;
+	double A = pow(10.0, gdb/40.0);
+
+	self->g = tan(M_PI * (f0 / sr));
+	self->k = 1.0 / q;
+
+	self->a[0] = 1.0 / (1.0 + self->g * (self->g + self->k));
+	self->a[1] = self->g * self->a[0];
+	self->a[2] = self->g * self->a[1];
+
+	self->m[0] = A * A;
+	self->m[1] = self->k * (1.0 - A) * A;
+	self->m[2] = 1.0 - A * A;
+}
+
+static void linear_svf_set_lowshelf(struct linear_svf *self, float gdb, float sample_rate, float cutoff, float resonance)
+{
+	double f0 = (double)cutoff;
+	double q = (double)resonance;
+	double sr = (double)sample_rate;
+	double A = pow(10.0, gdb/40.0);
+
+	self->g = tan(M_PI * (f0 / sr));
+	self->k = 1.0 / q;
+
+	self->a[0] = 1.0 / (1.0 + self->g * (self->g + self->k));
+	self->a[1] = self->g * self->a[0];
+	self->a[2] = self->g * self->a[1];
+
+	self->m[0] = 1.0;
+	self->m[1] = self->k * (A - 1.0);
+	self->m[2] = A * A - 1.0;
+}
+
+static float run_linear_svf(struct linear_svf *self, float in)
+{
+	double v[3];
+	double din = (double)in;
+	double out;
+
+	v[2] = din - self->s[1];
+	v[0] = (self->a[0] * self->s[0]) + (self->a[1] * v[2]);
+	v[1] = self->s[1] + (self->a[1] * self->s[0]) + (self->a[2] * v[2]);
+
+	self->s[0] = (2.0 * v[0]) - self->s[0];
+	self->s[1] = (2.0 * v[1]) - self->s[1];
+
+	out = (self->m[0] * din)
+		+ (self->m[1] * v[0])
+		+ (self->m[2] * v[1]);
+
+	return (float)out;
+}
+
+static void set_params(LV2_Handle instance, int band) {
+	Aeq* aeq = (Aeq*)instance;
+
+	switch (band) {
+	case 0:
+		linear_svf_set_lowshelf(&aeq->v_filter[0], aeq->v_g[0], aeq->srate, aeq->v_f0[0], 0.7071068);
+		break;
+	case 1:
+	case 2:
+	case 3:
+	case 4:
+		linear_svf_set_peq(&aeq->v_filter[band], aeq->v_g[band], aeq->srate, aeq->v_f0[band], aeq->v_bw[band]);
+		break;
+	case 5:
+		linear_svf_set_highshelf(&aeq->v_filter[5], aeq->v_g[5], aeq->srate, aeq->v_f0[5], 0.7071068);
+		break;
+	}
+}
+
+static void
+run(LV2_Handle instance, uint32_t n_samples)
+{
+	Aeq* aeq = (Aeq*)instance;
+
+	const float* const input = aeq->input;
+	float* const output = aeq->output;
+
+	const float tau = aeq->tau;
+	uint32_t offset = 0;
+
+	while (n_samples > 0) {
+		uint32_t block = n_samples;
+		bool any_changed = false;
+
+		// TODO global en/disable
+		if (!is_eq(aeq->v_master, *aeq->master, 0.1)) {
+			aeq->v_master += tau * (*aeq->master - aeq->v_master);
+			any_changed = true;
+		} else {
+			aeq->v_master = *aeq->master;
+		}
+
+		for (int i = 0; i < BANDS; ++i) {
+			bool changed = false;
+
+			if (!is_eq(aeq->v_f0[i], *aeq->f0[i], 0.1)) {
+				aeq->v_f0[i] += tau * (*aeq->f0[i] - aeq->v_f0[i]);
+				changed = true;
+			} else {
+				aeq->v_f0[i] = *aeq->f0[i];
+			}
+
+			if (*aeq->filtog[i] <= 0) {
+				if (!is_eq(aeq->v_g[i], 0.f, 0.05)) {
+					aeq->v_g[i] += tau * (0.0 - aeq->v_g[i]);
+					changed = true;
+				} else {
+					aeq->v_g[i] = 0.0;
+				}
+			} else {
+				if (!is_eq(aeq->v_g[i], *aeq->g[i], 0.05)) {
+					aeq->v_g[i] += tau * (*aeq->g[i] - aeq->v_g[i]);
+					changed = true;
+				} else {
+					aeq->v_g[i] = *aeq->g[i];
+				}
+			}
+
+			if (i != 0 && i != 5) {
+				if (!is_eq(aeq->v_bw[i], *aeq->bw[i], 0.001)) {
+					aeq->v_bw[i] += tau * (*aeq->bw[i] - aeq->v_bw[i]);
+					changed = true;
+				} else {
+					aeq->v_bw[i] = *aeq->bw[i];
+				}
+			}
+
+			if (changed) {
+				set_params(aeq, i);
+				any_changed = true;
+			}
+		}
+
+		if (any_changed) {
+			aeq->need_expose = true;
+			block = MIN (64, n_samples);
+		}
+
+		for (uint32_t i = 0; i < block; ++i) {
+			float in0, out;
+			in0 = input[i + offset];
+			out = in0;
+			for (uint32_t j = 0; j < BANDS; j++) {
+				out = run_linear_svf(&aeq->v_filter[j], out);
+			}
+			output[i + offset] = out * from_dB(*(aeq->master));
+		}
+		n_samples -= block;
+		offset += block;
+	}
+
+#ifdef LV2_EXTENDED
+	if (aeq->need_expose && aeq->queue_draw) {
+		aeq->need_expose = false;
+		aeq->queue_draw->queue_draw (aeq->queue_draw->handle);
+	}
+#endif
+}
+
+static double
+calc_peq(Aeq* self, int i, double omega) {
+	double complex H = 0.0;
+	double complex z = cexp(I * omega);
+	double complex zz = cexp(2. * I * omega);
+	double complex zm = z - 1.0;
+	double complex zp = z + 1.0;
+	double complex zzm = zz - 1.0;
+
+	double A = pow(10.0, self->v_g[i]/40.0);
+	double g = self->v_filter[i].g;
+	double k = self->v_filter[i].k * A;
+	double m1 = k * (A * A - 1.0) / A;
+
+	H = (g*k*zzm + A*(g*zp*(m1*zm) + (zm*zm + g*g*zp*zp))) / (g*k*zzm + A*(zm*zm + g*g*zp*zp));
+	return cabs(H);
+}
+
+static double
+calc_lowshelf(Aeq* self, double omega) {
+	double complex H = 0.0;
+	double complex z = cexp(I * omega);
+	double complex zz = cexp(2. * I * omega);
+	double complex zm = z - 1.0;
+	double complex zp = z + 1.0;
+	double complex zzm = zz - 1.0;
+
+	double A = pow(10.0, self->v_g[0]/40.0);
+	double g = self->v_filter[0].g;
+	double k = self->v_filter[0].k;
+	double m0 = self->v_filter[0].m[0];
+	double m1 = self->v_filter[0].m[1];
+	double m2 = self->v_filter[0].m[2];
+
+	H = (A*m0*zm*zm + g*g*(m0+m2)*zp*zp + sqrt(A)*g*(k*m0+m1) * zzm) / (A*zm*zm + g*g*zp*zp + sqrt(A)*g*k*zzm);
+	return cabs(H);
+}
+
+static double
+calc_highshelf(Aeq* self, double omega) {
+	double complex H = 0.0;
+	double complex z = cexp(I * omega);
+	double complex zz = cexp(2. * I * omega);
+	double complex zm = z - 1.0;
+	double complex zp = z + 1.0;
+	double complex zzm = zz - 1.0;
+
+	double A = pow(10.0, self->v_g[5]/40.0);
+	double g = self->v_filter[5].g;
+	double k = self->v_filter[5].k;
+	double m0 = self->v_filter[5].m[0];
+	double m1 = self->v_filter[5].m[1];
+	double m2 = self->v_filter[5].m[2];
+
+	H = ( sqrt(A) * g * zp * (m1 * zm + sqrt(A)*g*m2*zp) + m0 * ( zm*zm + A*g*g*zp*zp + sqrt(A)*g*k*zzm)) / (zm*zm + A*g*g*zp*zp + sqrt(A)*g*k*zzm);
+	return cabs(H);
+}
+
+#ifdef LV2_EXTENDED
+static float
+eq_curve (Aeq* self, float f) {
+	double response = 1.0;
+	double SR = (double)self->srate;
+	double omega = f * 2. * M_PI / SR;
+
+	// lowshelf
+	response *= calc_lowshelf(self, omega);
+
+	// peq 1 - 4:
+	response *= calc_peq(self, 1, omega);
+	response *= calc_peq(self, 2, omega);
+	response *= calc_peq(self, 3, omega);
+	response *= calc_peq(self, 4, omega);
+
+	// highshelf:
+	response *= calc_highshelf(self, omega);
+
+	return (float)response;
+}
+
+static LV2_Inline_Display_Image_Surface *
+render_inline (LV2_Handle instance, uint32_t w, uint32_t max_h)
+{
+	Aeq* self = (Aeq*)instance;
+	uint32_t h = MIN (1 | (uint32_t)ceilf (w * 9.f / 16.f), max_h);
+
+	if (!self->display || self->w != w || self->h != h) {
+		if (self->display) cairo_surface_destroy(self->display);
+		self->display = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, w, h);
+		self->w = w;
+		self->h = h;
+	}
+
+	cairo_t* cr = cairo_create (self->display);
+
+	// clear background
+	cairo_rectangle (cr, 0, 0, w, h);
+	cairo_set_source_rgba (cr, .2, .2, .2, 1.0);
+	cairo_fill (cr);
+
+	cairo_set_line_width(cr, 1.0);
+
+	// prepare grid drawing
+	cairo_save (cr);
+	const double dash2[] = {1, 3};
+	//cairo_set_line_cap(cr, CAIRO_LINE_CAP_ROUND);
+	cairo_set_dash(cr, dash2, 2, 2);
+	cairo_set_source_rgba (cr, 0.5, 0.5, 0.5, 0.5);
+
+	// draw x-grid 6dB steps
+	for (int32_t d = -18; d <= 18; d+=6) {
+		float y = (float)h * (d / 40.0 + 0.5);
+		y = rint (y) - .5;
+		cairo_move_to (cr, 0, y);
+		cairo_line_to (cr, w, y);
+		cairo_stroke (cr);
+	}
+	// draw y-axis grid 100, 1k, 10K
+	for (int32_t f = 100; f <= 10000; f *= 10) {
+		float x = w * log10 (f / 20.0) / log10 (1000.0);
+		x = rint (x) - .5;
+		cairo_move_to (cr, x, 0);
+		cairo_line_to (cr, x, h);
+		cairo_stroke (cr);
+	}
+
+	cairo_restore (cr);
+
+
+	// draw curve
+	cairo_set_source_rgba (cr, .8, .8, .8, 1.0);
+	cairo_move_to (cr, 0, h);
+
+	for (uint32_t x = 0; x < w; ++x) {
+		// plot 20..20kHz +-20dB
+		const float x_hz = 20.f * powf (1000.f, (float)x / (float)w);
+		const float y_db = to_dB(eq_curve(self, x_hz)) + self->v_master;
+		const float y = (float)h * (-y_db / 40.0 + 0.5);
+		cairo_line_to (cr, x, y);
+	}
+	cairo_stroke_preserve (cr);
+
+	cairo_line_to (cr, w, h);
+	cairo_close_path (cr);
+	cairo_clip (cr);
+
+	// create RGBA surface
+	cairo_destroy (cr);
+	cairo_surface_flush (self->display);
+	self->surf.width = cairo_image_surface_get_width (self->display);
+	self->surf.height = cairo_image_surface_get_height (self->display);
+	self->surf.stride = cairo_image_surface_get_stride (self->display);
+	self->surf.data = cairo_image_surface_get_data  (self->display);
+
+	return &self->surf;
+}
+#endif
+
+static const void*
+extension_data(const char* uri)
+{
+#ifdef LV2_EXTENDED
+	static const LV2_Inline_Display_Interface display  = { render_inline };
+	if (!strcmp(uri, LV2_INLINEDISPLAY__interface)) {
+		return &display;
+	}
+#endif
+	return NULL;
+}
+
+static void
+cleanup(LV2_Handle instance)
+{
+#ifdef LV2_EXTENDED
+	Aeq* aeq = (Aeq*)instance;
+	if (aeq->display) {
+		cairo_surface_destroy (aeq->display);
+	}
+#endif
+	free(instance);
+}
+
+static const LV2_Descriptor descriptor = {
+	AEQ_URI,
+	instantiate,
+	connect_port,
+	activate,
+	run,
+	NULL,
+	cleanup,
+	extension_data
+};
+
+LV2_SYMBOL_EXPORT
+const LV2_Descriptor*
+lv2_descriptor(uint32_t index)
+{
+	switch (index) {
+	case 0:
+		return &descriptor;
+	default:
+		return NULL;
+	}
+}
diff --git a/libs/plugins/a-eq.lv2/a-eq.ttl.in b/libs/plugins/a-eq.lv2/a-eq.ttl.in
new file mode 100644
index 0000000..429e8ea
--- /dev/null
+++ b/libs/plugins/a-eq.lv2/a-eq.ttl.in
@@ -0,0 +1,291 @@
+ at prefix doap: <http://usefulinc.com/ns/doap#> .
+ at prefix foaf: <http://xmlns.com/foaf/0.1/> .
+ at prefix lv2:  <http://lv2plug.in/ns/lv2core#> .
+ at prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
+ at prefix rsz:  <http://lv2plug.in/ns/ext/resize-port#> .
+ at prefix unit: <http://lv2plug.in/ns/extensions/units#> .
+ at prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
+
+<http://ardour.org/credits.html>
+	a foaf:Person ;
+	foaf:name "Ardour Team" ;
+	foaf:homepage <http://ardour.org/> .
+
+unit:hz0
+	a unit:Unit ;
+	rdfs:label "hertz" ;
+	unit:prefixConversion [
+		unit:factor 0.001 ;
+		unit:to unit:khz
+	] ;
+	unit:render "%.0f Hz" ;
+	unit:symbol "Hz" .
+
+<urn:ardour:a-eq>
+    a lv2:Plugin, doap:Project, lv2:FilterPlugin ;
+
+    lv2:optionalFeature <http://lv2plug.in/ns/lv2core#hardRTCapable> ;
+
+    lv2:requiredFeature <http://lv2plug.in/ns/ext/options#options> ,
+                        <http://lv2plug.in/ns/ext/urid#map> ;
+
+    lv2:port [
+        a lv2:InputPort, lv2:ControlPort ;
+        lv2:index 0 ;
+        lv2:name "Frequency L" ;
+        lv2:symbol "freql" ;
+        lv2:default 160.000000 ;
+        lv2:minimum 20.000000 ;
+        lv2:maximum 20000.000000 ;
+        unit:unit unit:hz0 ;
+        lv2:portProperty <http://lv2plug.in/ns/ext/port-props#logarithmic> ;
+    ],
+    [
+        a lv2:InputPort, lv2:ControlPort ;
+        lv2:index 1 ;
+        lv2:name "Gain L" ;
+        lv2:symbol "gl" ;
+        lv2:default 0.000000 ;
+        lv2:minimum -20.000000 ;
+        lv2:maximum 20.000000 ;
+        unit:unit unit:db ;
+    ],
+    [
+        a lv2:InputPort, lv2:ControlPort ;
+        lv2:index 2 ;
+        lv2:name "Frequency 1" ;
+        lv2:symbol "freq1" ;
+        lv2:default 300.000000 ;
+        lv2:minimum 20.000000 ;
+        lv2:maximum 20000.000000 ;
+        unit:unit unit:hz0 ;
+        lv2:portProperty <http://lv2plug.in/ns/ext/port-props#logarithmic> ;
+    ],
+    [
+        a lv2:InputPort, lv2:ControlPort ;
+        lv2:index 3 ;
+        lv2:name "Gain 1" ;
+        lv2:symbol "g1" ;
+        lv2:default 0.000000 ;
+        lv2:minimum -20.000000 ;
+        lv2:maximum 20.000000 ;
+        unit:unit unit:db ;
+    ],
+    [
+        a lv2:InputPort, lv2:ControlPort ;
+        lv2:index 4 ;
+        lv2:name "Bandwidth 1" ;
+        lv2:symbol "bw1" ;
+        lv2:default 1.000000 ;
+        lv2:minimum 0.1000000 ;
+        lv2:maximum 4.000000 ;
+        lv2:portProperty <http://lv2plug.in/ns/ext/port-props#logarithmic> ;
+    ],
+    [
+        a lv2:InputPort, lv2:ControlPort ;
+        lv2:index 5 ;
+        lv2:name "Frequency 2" ;
+        lv2:symbol "freq2" ;
+        lv2:default 1000.000000 ;
+        lv2:minimum 20.000000 ;
+        lv2:maximum 20000.000000 ;
+        unit:unit unit:hz0 ;
+        lv2:portProperty <http://lv2plug.in/ns/ext/port-props#logarithmic> ;
+    ],
+    [
+        a lv2:InputPort, lv2:ControlPort ;
+        lv2:index 6 ;
+        lv2:name "Gain 2" ;
+        lv2:symbol "g2" ;
+        lv2:default 0.000000 ;
+        lv2:minimum -20.000000 ;
+        lv2:maximum 20.000000 ;
+        unit:unit unit:db ;
+    ],
+    [
+        a lv2:InputPort, lv2:ControlPort ;
+        lv2:index 7 ;
+        lv2:name "Bandwidth 2" ;
+        lv2:symbol "bw2" ;
+        lv2:default 1.000000 ;
+        lv2:minimum 0.1000000 ;
+        lv2:maximum 4.000000 ;
+        lv2:portProperty <http://lv2plug.in/ns/ext/port-props#logarithmic> ;
+    ],
+    [
+        a lv2:InputPort, lv2:ControlPort ;
+        lv2:index 8 ;
+        lv2:name "Frequency 3" ;
+        lv2:symbol "freq3" ;
+        lv2:default 2500.000000 ;
+        lv2:minimum 20.000000 ;
+        lv2:maximum 20000.000000 ;
+        unit:unit unit:hz0 ;
+        lv2:portProperty <http://lv2plug.in/ns/ext/port-props#logarithmic> ;
+    ],
+    [
+        a lv2:InputPort, lv2:ControlPort ;
+        lv2:index 9 ;
+        lv2:name "Gain 3" ;
+        lv2:symbol "g3" ;
+        lv2:default 0.000000 ;
+        lv2:minimum -20.000000 ;
+        lv2:maximum 20.000000 ;
+        unit:unit unit:db ;
+    ],
+    [
+        a lv2:InputPort, lv2:ControlPort ;
+        lv2:index 10 ;
+        lv2:name "Bandwidth 3" ;
+        lv2:symbol "bw3" ;
+        lv2:default 1.000000 ;
+        lv2:minimum 0.1000000 ;
+        lv2:maximum 4.000000 ;
+        lv2:portProperty <http://lv2plug.in/ns/ext/port-props#logarithmic> ;
+    ],
+    [
+        a lv2:InputPort, lv2:ControlPort ;
+        lv2:index 11 ;
+        lv2:name "Frequency 4" ;
+        lv2:symbol "freq4" ;
+        lv2:default 6000.000000 ;
+        lv2:minimum 20.000000 ;
+        lv2:maximum 20000.000000 ;
+        unit:unit unit:hz0 ;
+        lv2:portProperty <http://lv2plug.in/ns/ext/port-props#logarithmic> ;
+    ],
+    [
+        a lv2:InputPort, lv2:ControlPort ;
+        lv2:index 12 ;
+        lv2:name "Gain 4" ;
+        lv2:symbol "g4" ;
+        lv2:default 0.000000 ;
+        lv2:minimum -20.000000 ;
+        lv2:maximum 20.000000 ;
+        unit:unit unit:db ;
+    ],
+    [
+        a lv2:InputPort, lv2:ControlPort ;
+        lv2:index 13 ;
+        lv2:name "Bandwidth 4" ;
+        lv2:symbol "bw4" ;
+        lv2:default 1.000000 ;
+        lv2:minimum 0.1000000 ;
+        lv2:maximum 4.000000 ;
+        lv2:portProperty <http://lv2plug.in/ns/ext/port-props#logarithmic> ;
+    ],
+    [
+        a lv2:InputPort, lv2:ControlPort ;
+        lv2:index 14 ;
+        lv2:name "Frequency H" ;
+        lv2:symbol "freqh" ;
+        lv2:default 9000.000000 ;
+        lv2:minimum 20.000000 ;
+        lv2:maximum 20000.000000 ;
+        unit:unit unit:hz0 ;
+        lv2:portProperty <http://lv2plug.in/ns/ext/port-props#logarithmic> ;
+    ],
+    [
+        a lv2:InputPort, lv2:ControlPort ;
+        lv2:index 15 ;
+        lv2:name "Gain H" ;
+        lv2:symbol "gh" ;
+        lv2:default 0.000000 ;
+        lv2:minimum -20.000000 ;
+        lv2:maximum 20.000000 ;
+        unit:unit unit:db ;
+    ],
+    [
+        a lv2:InputPort, lv2:ControlPort ;
+        lv2:index 16 ;
+        lv2:name "Master Gain" ;
+        lv2:symbol "master" ;
+        lv2:default 0.000000 ;
+        lv2:minimum -20.000000 ;
+        lv2:maximum 20.000000 ;
+    ],
+    [
+        a lv2:InputPort, lv2:ControlPort ;
+        lv2:index 17 ;
+        lv2:name "Filter L" ;
+        lv2:symbol "filtogl" ;
+        lv2:default 1.000000 ;
+        lv2:minimum 0.000000 ;
+        lv2:maximum 1.000000 ;
+        lv2:portProperty lv2:toggled ;
+    ],
+    [
+        a lv2:InputPort, lv2:ControlPort ;
+        lv2:index 18 ;
+        lv2:name "Filter 1" ;
+        lv2:symbol "filtog1" ;
+        lv2:default 1.000000 ;
+        lv2:minimum 0.000000 ;
+        lv2:maximum 1.000000 ;
+        lv2:portProperty lv2:toggled ;
+    ],
+    [
+        a lv2:InputPort, lv2:ControlPort ;
+        lv2:index 19 ;
+        lv2:name "Filter 2" ;
+        lv2:symbol "filtog2" ;
+        lv2:default 1.000000 ;
+        lv2:minimum 0.000000 ;
+        lv2:maximum 1.000000 ;
+        lv2:portProperty lv2:toggled ;
+    ],
+    [
+        a lv2:InputPort, lv2:ControlPort ;
+        lv2:index 20 ;
+        lv2:name "Filter 3" ;
+        lv2:symbol "filtog3" ;
+        lv2:default 1.000000 ;
+        lv2:minimum 0.000000 ;
+        lv2:maximum 1.000000 ;
+        lv2:portProperty lv2:toggled ;
+    ],
+    [
+        a lv2:InputPort, lv2:ControlPort ;
+        lv2:index 21 ;
+        lv2:name "Filter 4" ;
+        lv2:symbol "filtog4" ;
+        lv2:default 1.000000 ;
+        lv2:minimum 0.000000 ;
+        lv2:maximum 1.000000 ;
+        lv2:portProperty lv2:toggled ;
+    ],
+    [
+        a lv2:InputPort, lv2:ControlPort ;
+        lv2:index 22 ;
+        lv2:name "Filter H" ;
+        lv2:symbol "filtogh" ;
+        lv2:default 1.000000 ;
+        lv2:minimum 0.000000 ;
+        lv2:maximum 1.000000 ;
+        lv2:portProperty lv2:toggled ;
+    ] ;
+
+    lv2:port [
+        a lv2:InputPort, lv2:AudioPort ;
+        lv2:index 23 ;
+        lv2:symbol "in_1" ;
+        lv2:name "Audio Input 1" ;
+    ] ;
+
+    lv2:port [
+        a lv2:OutputPort, lv2:AudioPort ;
+        lv2:index 24 ;
+        lv2:symbol "out_1" ;
+        lv2:name "Audio Output 1" ;
+    ] ;
+
+    rdfs:comment """
+A basic 4 band EQ.
+""" ;
+
+    doap:name "a-EQ" ;
+    doap:license "GPL v2+" ;
+    doap:maintainer <http://ardour.org/credits.html> ;
+
+    lv2:microVersion 0 ;
+    lv2:minorVersion 1 .
diff --git a/libs/plugins/a-eq.lv2/manifest.ttl.in b/libs/plugins/a-eq.lv2/manifest.ttl.in
new file mode 100644
index 0000000..e446245
--- /dev/null
+++ b/libs/plugins/a-eq.lv2/manifest.ttl.in
@@ -0,0 +1,8 @@
+ at prefix lv2:  <http://lv2plug.in/ns/lv2core#> .
+ at prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
+ at prefix pset: <http://lv2plug.in/ns/ext/presets#> .
+
+<urn:ardour:a-eq>
+    a lv2:Plugin ;
+    lv2:binary <a-eq at LIB_EXT@> ;
+    rdfs:seeAlso <a-eq.ttl> .
diff --git a/libs/plugins/a-eq.lv2/wscript b/libs/plugins/a-eq.lv2/wscript
new file mode 100644
index 0000000..0610ba2
--- /dev/null
+++ b/libs/plugins/a-eq.lv2/wscript
@@ -0,0 +1,52 @@
+#!/usr/bin/env python
+import os
+import re
+import shutil
+import waflib.extras.autowaf as autowaf
+import waflib.Options as Options, waflib.Utils as Utils
+
+# Mandatory variables
+top = '.'
+out = 'build'
+
+def options(opt):
+    autowaf.set_options(opt)
+
+def configure(conf):
+    conf.load('compiler_c')
+    autowaf.configure(conf)
+    if Options.options.lv2:
+        autowaf.check_pkg(conf, 'lv2', atleast_version='1.0.0',
+                uselib_store='LV2_1_0_0')
+        autowaf.check_pkg(conf, 'cairo', uselib_store='CAIRO', atleast_version='1.12.0') 
+
+def build(bld):
+    bundle = 'a-eq.lv2'
+    module_pat = re.sub('^lib', '', bld.env.cshlib_PATTERN)
+    module_ext = module_pat[module_pat.rfind('.'):]
+
+    if bld.is_defined ('HAVE_LV2'):
+        # Build RDF files
+        for i in ['manifest.ttl', 'a-eq.ttl']:
+            bld(features     = 'subst',
+                source       = i + '.in',
+                target       = '../../LV2/%s/%s' % (bundle, i),
+                install_path = '${LV2DIR}/%s' % bundle,
+                chmod        = Utils.O644,
+                LIB_EXT      = module_ext)
+
+        # Build plugin library
+        obj = bld(features     = 'c cshlib',
+                  source       = 'a-eq.c',
+                  name         = 'a-eq',
+                  cflags       = [ '-fPIC',  bld.env['compiler_flags_dict']['c99'] ],
+                  includes     = [ '../../ardour' ],
+                  target       = '../../LV2/%s/a-eq' % bundle,
+                  install_path = '${LV2DIR}/%s' % bundle,
+                  uselib       = 'CAIRO',
+                  use          = 'LV2_1_0_0'
+                  )
+        obj.env.cshlib_PATTERN = module_pat
+        obj.env.cxxshlib_PATTERN = module_pat
+
+# vi:set ts=4 sw=4 et:
diff --git a/libs/plugins/a-reverb.lv2/a-reverb.c b/libs/plugins/a-reverb.lv2/a-reverb.c
new file mode 100644
index 0000000..8763758
--- /dev/null
+++ b/libs/plugins/a-reverb.lv2/a-reverb.c
@@ -0,0 +1,399 @@
+/* a-reverb -- based on b_reverb (setBfree) and FreeVerb
+ *
+ * Copyright (C) 2003-2004 Fredrik Kilander <fk at dsv.su.se>
+ * Copyright (C) 2008-2016 Robin Gareus <robin at gareus.org>
+ * Copyright (C) 2012 Will Panther <pantherb at setbfree.org>
+ * Copyright (C) 2016 Damien Zammit <damien at zamaudio.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE // needed for M_PI
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <math.h>
+#include <string.h>
+
+#define RV_NZ 7
+#define DENORMAL_PROTECT (1e-14)
+
+typedef struct {
+	float* delays[2][RV_NZ]; /**< delay line buffer */
+
+	float* idx0[2][RV_NZ];	/**< Reset pointer ref delays[]*/
+	float* idxp[2][RV_NZ];	/**< Index pointer ref delays[]*/
+	float* endp[2][RV_NZ];	/**< End pointer   ref delays[]*/
+
+	float gain[RV_NZ]; /**< feedback gains */
+	float yy1_0; /**< Previous output sample */
+	float y_1_0; /**< Feedback sample */
+	float yy1_1; /**< Previous output sample */
+	float y_1_1; /**< Feedback sample */
+
+	int end[2][RV_NZ];
+
+	float inputGain;	/**< Input gain value */
+	float fbk;	/**< Feedback gain */
+	float wet;	/**< Output dry gain */
+	float dry;	/**< Output wet gain */
+} b_reverb;
+
+static int
+setReverbPointers (b_reverb *r, int i, int c, const double rate)
+{
+	int e = (r->end[c][i] * rate / 25000.0);
+	e = e | 1;
+	r->delays[c][i] = (float*)realloc ((void*)r->delays[c][i], (e + 2) * sizeof (float));
+	if (!r->delays[c][i]) {
+		return -1;
+	} else {
+		memset (r->delays[c][i], 0 , (e + 2) * sizeof (float));
+	}
+	r->endp[c][i] = r->delays[c][i] + e + 1;
+	r->idx0[c][i] = r->idxp[c][i] = &(r->delays[c][i][0]);
+
+	return 0;
+}
+
+static int
+initReverb (b_reverb *r, const double rate)
+{
+	int err = 0;
+	int stereowidth = 7;
+
+	r->inputGain = powf (10.0, .05 * -20.0);  // -20dB
+	r->fbk = -0.015; /* Feedback gain */
+	r->wet = 0.3;
+	r->dry = 0.7;
+
+	/* feedback combfilter */
+	r->gain[0] = 0.773;
+	r->gain[1] = 0.802;
+	r->gain[2] = 0.753;
+	r->gain[3] = 0.733;
+
+	/* all-pass filter */
+	r->gain[4] = sqrtf (0.5);
+	r->gain[5] = sqrtf (0.5);
+	r->gain[6] = sqrtf (0.5);
+
+	/* delay lines left */
+	r->end[0][0] = 1687;
+	r->end[0][1] = 1601;
+	r->end[0][2] = 2053;
+	r->end[0][3] = 2251;
+
+	/* all pass filters left */
+	r->end[0][4] = 347;
+	r->end[0][5] = 113;
+	r->end[0][6] = 37;
+
+	/* delay lines right */
+	r->end[1][0] = 1687 + stereowidth;
+	r->end[1][1] = 1601 + stereowidth;
+	r->end[1][2] = 2053 + stereowidth;
+	r->end[1][3] = 2251 + stereowidth;
+
+	/* all pass filters right */
+	r->end[0][4] = 347 + stereowidth;
+	r->end[0][5] = 113 + stereowidth;
+	r->end[0][6] = 37 + stereowidth;
+
+	for (int i = 0; i < RV_NZ; ++i) {
+		r->delays[0][i] = NULL;
+		r->delays[1][i] = NULL;
+	}
+
+	r->yy1_0 = 0.0;
+	r->y_1_0 = 0.0;
+	r->yy1_1 = 0.0;
+	r->y_1_1 = 0.0;
+
+	for (int i = 0; i < RV_NZ; i++) {
+		err |= setReverbPointers (r, i, 0, rate);
+		err |= setReverbPointers (r, i, 1, rate);
+	}
+	return err;
+}
+
+static void
+reverb (b_reverb* r,
+        const float* inbuf0,
+        const float* inbuf1,
+        float* outbuf0,
+        float* outbuf1,
+        size_t n_samples)
+{
+	float** const idxp0 = r->idxp[0];
+	float** const idxp1 = r->idxp[1];
+	float* const* const endp0 = r->endp[0];
+	float* const* const endp1 = r->endp[1];
+	float* const* const idx00 = r->idx0[0];
+	float* const* const idx01 = r->idx0[1];
+	const float* const gain = r->gain;
+	const float inputGain = r->inputGain;
+	const float fbk = r->fbk;
+	const float wet = r->wet;
+	const float dry = r->dry;
+
+	const float* xp0 = inbuf0;
+	const float* xp1 = inbuf1;
+	float* yp0 = outbuf0;
+	float* yp1 = outbuf1;
+
+	float y_1_0 = r->y_1_0;
+	float yy1_0 = r->yy1_0;
+	float y_1_1 = r->y_1_1;
+	float yy1_1 = r->yy1_1;
+
+	for (size_t i = 0; i < n_samples; ++i) {
+		int j;
+		float y;
+		const float xo0 = *xp0++;
+		const float xo1 = *xp1++;
+		const float x0 = y_1_0 + (inputGain * xo0);
+		const float x1 = y_1_1 + (inputGain * xo1);
+		float xa = 0.0;
+		float xb = 0.0;
+		/* First we do four feedback comb filters (ie parallel delay lines,
+		 * each with a single tap at the end that feeds back at the start) */
+
+		for (j = 0; j < 4; ++j) {
+			y = *idxp0[j];
+			*idxp0[j] = x0 + (gain[j] * y);
+			if (endp0[j] <= ++(idxp0[j])) {
+				idxp0[j] = idx00[j];
+			}
+			xa += y;
+		}
+		for (; j < 7; ++j) {
+			y = *idxp0[j];
+			*idxp0[j] = gain[j] * (xa + y);
+			if (endp0[j] <= ++(idxp0[j])) {
+				idxp0[j] = idx00[j];
+			}
+			xa = y - xa;
+		}
+
+		y = 0.5f * (xa + yy1_0);
+		yy1_0 = y;
+		y_1_0 = fbk * xa;
+
+		*yp0++ = ((wet * y) + (dry * xo0));
+
+		for (j = 0; j < 4; ++j) {
+			y = *idxp1[j];
+			*idxp1[j] = x1 + (gain[j] * y);
+			if (endp1[j] <= ++(idxp1[j])) {
+				idxp1[j] = idx01[j];
+			}
+			xb += y;
+		}
+		for (; j < 7; ++j) {
+			y = *idxp1[j];
+			*idxp1[j] = gain[j] * (xb + y);
+			if (endp1[j] <= ++(idxp1[j])) {
+				idxp1[j] = idx01[j];
+			}
+			xb = y - xb;
+		}
+
+		y = 0.5f * (xb + yy1_1);
+		yy1_1 = y;
+		y_1_1 = fbk * xb;
+
+		*yp1++ = ((wet * y) + (dry * xo1));
+	}
+
+	r->y_1_0 = y_1_0 + DENORMAL_PROTECT;
+	r->yy1_0 = yy1_0 + DENORMAL_PROTECT;
+	r->y_1_1 = y_1_1 + DENORMAL_PROTECT;
+	r->yy1_1 = yy1_1 + DENORMAL_PROTECT;
+}
+
+/******************************************************************************
+ * LV2 wrapper
+ */
+
+#include "lv2/lv2plug.in/ns/lv2core/lv2.h"
+
+typedef enum {
+	AR_INPUT0     = 0,
+	AR_INPUT1     = 1,
+	AR_OUTPUT0    = 2,
+	AR_OUTPUT1    = 3,
+	AR_MIX        = 4,
+	AR_ROOMSZ     = 5,
+} PortIndex;
+
+typedef struct {
+	float* input0;
+	float* input1;
+	float* output0;
+	float* output1;
+
+	float* mix;
+	float* roomsz;
+
+	float v_mix;
+	float v_roomsz;
+	float srate;
+
+	b_reverb r;
+} AReverb;
+
+static LV2_Handle
+instantiate (const LV2_Descriptor*     descriptor,
+             double                    rate,
+             const char*               bundle_path,
+             const LV2_Feature* const* features)
+{
+	AReverb* self = (AReverb*)calloc (1, sizeof (AReverb));
+	if (!self) {
+		return NULL;
+	}
+	if (initReverb (&self->r, rate)) {
+		return NULL;
+	}
+
+	// these are set in initReverb()
+	self->v_roomsz = 0.75;
+	self->v_mix = 0.1;
+	self->srate = rate;
+
+	return (LV2_Handle)self;
+}
+
+static void
+connect_port (LV2_Handle instance,
+              uint32_t   port,
+              void*      data)
+{
+	AReverb* self = (AReverb*)instance;
+
+	switch ((PortIndex)port) {
+		case AR_INPUT0:
+			self->input0 = (float*)data;
+			break;
+		case AR_INPUT1:
+			self->input1 = (float*)data;
+			break;
+		case AR_OUTPUT0:
+			self->output0 = (float*)data;
+			break;
+		case AR_OUTPUT1:
+			self->output1 = (float*)data;
+			break;
+		case AR_MIX:
+			self->mix = (float*)data;
+			break;
+		case AR_ROOMSZ:
+			self->roomsz = (float*)data;
+			break;
+	}
+}
+
+static void
+run (LV2_Handle instance, uint32_t n_samples)
+{
+	AReverb* self = (AReverb*)instance;
+
+	const float* const input0 = self->input0;
+	const float* const input1 = self->input1;
+	float* const      output0 = self->output0;
+	float* const      output1 = self->output1;
+
+	// 15Hz time constant
+	const float tau = (1.0 - exp(-2.0 * M_PI * n_samples * 15. / self->srate));
+
+	if (*self->mix != self->v_mix) {
+		self->v_mix += tau * ( *self->mix - self->v_mix);
+		self->r.wet = self->v_mix;
+		self->r.dry = 1.0 - self->v_mix;
+	}
+	if (*self->roomsz != self->v_roomsz) {
+		self->v_roomsz += tau * ( *self->roomsz - self->v_roomsz);
+		self->r.gain[0] = 0.773 * self->v_roomsz;
+		self->r.gain[1] = 0.802 * self->v_roomsz;
+		self->r.gain[2] = 0.753 * self->v_roomsz;
+		self->r.gain[3] = 0.733 * self->v_roomsz;
+	}
+
+	reverb (&self->r, input0, input1, output0, output1, n_samples);
+}
+
+static void
+activate (LV2_Handle instance)
+{
+	AReverb* self = (AReverb*)instance;
+
+	self->r.y_1_0 = 0;
+	self->r.yy1_0 = 0;
+	self->r.y_1_1 = 0;
+	self->r.yy1_1 = 0;
+	for (int i = 0; i < RV_NZ; ++i) {
+		self->r.delays[0][i] = NULL;
+		self->r.delays[1][i] = NULL;
+	}
+}
+
+static void
+deactivate (LV2_Handle instance)
+{
+	activate(instance);
+}
+
+static void
+cleanup (LV2_Handle instance)
+{
+	AReverb* self = (AReverb*)instance;
+	for (int i = 0; i < RV_NZ; ++i) {
+		free (self->r.delays[0][i]);
+		free (self->r.delays[1][i]);
+	}
+	free (instance);
+}
+
+static const void*
+extension_data (const char* uri)
+{
+	return NULL;
+}
+
+static const LV2_Descriptor descriptor = {
+	"urn:ardour:a-reverb",
+	instantiate,
+	connect_port,
+	activate,
+	run,
+	deactivate,
+	cleanup,
+	extension_data
+};
+
+LV2_SYMBOL_EXPORT
+const LV2_Descriptor*
+lv2_descriptor (uint32_t index)
+{
+	switch (index) {
+		case 0:
+			return &descriptor;
+		default:
+			return NULL;
+	}
+}
diff --git a/libs/plugins/a-reverb.lv2/a-reverb.ttl.in b/libs/plugins/a-reverb.lv2/a-reverb.ttl.in
new file mode 100644
index 0000000..df9a5d2
--- /dev/null
+++ b/libs/plugins/a-reverb.lv2/a-reverb.ttl.in
@@ -0,0 +1,74 @@
+ at prefix doap: <http://usefulinc.com/ns/doap#> .
+ at prefix foaf: <http://xmlns.com/foaf/0.1/> .
+ at prefix lv2: <http://lv2plug.in/ns/lv2core#> .
+ at prefix mod: <http://moddevices.com/ns/mod#> .
+ at prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
+ at prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
+ at prefix unit: <http://lv2plug.in/ns/extensions/units#> .
+
+<http://ardour.org/credits.html>
+	a foaf:Person ;
+	foaf:name "Ardour Team" ;
+	foaf:homepage <http://ardour.org/> .
+
+<urn:ardour:a-reverb>
+	a doap:Project, lv2:Plugin, lv2:SpatialPlugin ;
+
+	doap:name "a-Reverb";
+	rdfs:comment "A Schroeder Reverberator";
+
+	doap:maintainer <http://ardour.org/credits.html> ;
+	doap:license <http://usefulinc.com/doap/licenses/gpl> ;
+
+	lv2:microVersion 0 ; lv2:minorVersion 2 ;
+	lv2:optionalFeature lv2:hardRTCapable ;
+
+	lv2:port
+	[
+		a lv2:AudioPort ,
+			lv2:InputPort ;
+		lv2:index 0 ;
+		lv2:symbol "in0" ;
+		lv2:name "In 0" ;
+	],
+	[
+		a lv2:AudioPort ,
+			lv2:InputPort ;
+		lv2:index 1 ;
+		lv2:symbol "in1" ;
+		lv2:name "In 1" ;
+	],
+	[
+		a lv2:AudioPort ,
+			lv2:OutputPort ;
+		lv2:index 2 ;
+		lv2:symbol "out0" ;
+		lv2:name "Out 0" ;
+	],
+	[
+		a lv2:AudioPort ,
+			lv2:OutputPort ;
+		lv2:index 3 ;
+		lv2:symbol "out1" ;
+		lv2:name "Out 1" ;
+	],
+	[
+		a lv2:InputPort ,
+			lv2:ControlPort ;
+		lv2:index 4 ;
+		lv2:symbol "blend" ;
+		lv2:name "Blend";
+		lv2:default 0.3;
+		lv2:minimum 0.0 ;
+		lv2:maximum 1.0 ;
+	],
+	[
+		a lv2:InputPort ,
+			lv2:ControlPort ;
+		lv2:index 5 ;
+		lv2:symbol "roomsz" ;
+		lv2:name "Room Size";
+		lv2:default 0.5;
+		lv2:minimum 0.5 ;
+		lv2:maximum 1.0 ;
+	] .
diff --git a/libs/plugins/a-reverb.lv2/manifest.ttl.in b/libs/plugins/a-reverb.lv2/manifest.ttl.in
new file mode 100644
index 0000000..c685139
--- /dev/null
+++ b/libs/plugins/a-reverb.lv2/manifest.ttl.in
@@ -0,0 +1,7 @@
+ at prefix lv2:  <http://lv2plug.in/ns/lv2core#> .
+ at prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
+
+<urn:ardour:a-reverb>
+	a lv2:Plugin ;
+	lv2:binary <a-reverb at LIB_EXT@>  ;
+	rdfs:seeAlso <a-reverb.ttl> .
diff --git a/libs/plugins/a-reverb.lv2/wscript b/libs/plugins/a-reverb.lv2/wscript
new file mode 100644
index 0000000..35601f2
--- /dev/null
+++ b/libs/plugins/a-reverb.lv2/wscript
@@ -0,0 +1,51 @@
+#!/usr/bin/env python
+import os
+import re
+import shutil
+import waflib.extras.autowaf as autowaf
+import waflib.Options as Options, waflib.Utils as Utils
+
+# Mandatory variables
+top = '.'
+out = 'build'
+
+def options(opt):
+    autowaf.set_options(opt)
+
+def configure(conf):
+    conf.load('compiler_c')
+    autowaf.configure(conf)
+    if Options.options.lv2:
+        autowaf.check_pkg(conf, 'lv2', atleast_version='1.0.0',
+                uselib_store='LV2_1_0_0')
+
+def build(bld):
+    bundle = 'a-reverb.lv2'
+    module_pat = re.sub('^lib', '', bld.env.cshlib_PATTERN)
+    module_ext = module_pat[module_pat.rfind('.'):]
+
+    if bld.is_defined ('HAVE_LV2'):
+        # Build RDF files
+        for i in ['manifest.ttl', 'a-reverb.ttl']:
+            bld(features     = 'subst',
+                source       = i + '.in',
+                target       = '../../LV2/%s/%s' % (bundle, i),
+                install_path = '${LV2DIR}/%s' % bundle,
+                chmod        = Utils.O644,
+                LIB_EXT      = module_ext)
+
+        # Build plugin library
+        obj = bld(features     = 'c cshlib',
+                  source       = 'a-reverb.c',
+                  name         = 'a-reverb',
+                  cflags       = [ '-fPIC',  bld.env['compiler_flags_dict']['c99'] ],
+                  includes     = [ '../../ardour' ],
+                  target       = '../../LV2/%s/a-reverb' % bundle,
+                  install_path = '${LV2DIR}/%s' % bundle,
+                  uselib       = 'CAIRO',
+                  use          = 'LV2_1_0_0'
+                  )
+        obj.env.cshlib_PATTERN = module_pat
+        obj.env.cxxshlib_PATTERN = module_pat
+
+# vi:set ts=4 sw=4 et:
diff --git a/libs/plugins/reasonablesynth.lv2/MSVCreasonablesynth/reasonablesynth.vcproj b/libs/plugins/reasonablesynth.lv2/MSVCreasonablesynth/reasonablesynth.vcproj
index b97c721..88866e8 100644
--- a/libs/plugins/reasonablesynth.lv2/MSVCreasonablesynth/reasonablesynth.vcproj
+++ b/libs/plugins/reasonablesynth.lv2/MSVCreasonablesynth/reasonablesynth.vcproj
@@ -42,7 +42,7 @@
 				AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
 				Optimization="0"
 				AdditionalIncludeDirectories="..;..\..\..\pbd;"$(GenericLibraryFolder)\glib-2.0\include";."
-				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;BUILDING_REASONABLESYNTH;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_DEBUG;DEBUG="Debug";ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;BUILDING_REASONABLESYNTH;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_DEBUG;DEBUG="Debug";ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
 				MinimalRebuild="true"
 				RuntimeLibrary="3"
 				WarningLevel="3"
@@ -124,7 +124,7 @@
 				Optimization="2"
 				InlineFunctionExpansion="1"
 				AdditionalIncludeDirectories="..;..\..\..\pbd;"$(GenericLibraryFolder)\glib-2.0\include";."
-				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_REASONABLESYNTH;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;NDEBUG;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_REASONABLESYNTH;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;NDEBUG;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
 				StringPooling="false"
 				RuntimeLibrary="2"
 				EnableEnhancedInstructionSet="1"
@@ -205,7 +205,7 @@
 				AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
 				Optimization="0"
 				AdditionalIncludeDirectories="..;..\..\..\pbd;"$(GenericLibraryFolder)\glib-2.0\include";."
-				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_REASONABLESYNTH;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_REASONABLESYNTH;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
 				StringPooling="false"
 				RuntimeLibrary="2"
 				EnableEnhancedInstructionSet="1"
@@ -288,7 +288,7 @@
 			UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
 			>
 			<File
-				RelativePath="..\..\..\..\icons\win32\msvc_resources.rc"
+				RelativePath="..\..\..\..\gtk2_ardour\win32\msvc_resources.rc"
 				>
 			</File>
 		</Filter>
diff --git a/libs/plugins/reasonablesynth.lv2/lv2.c b/libs/plugins/reasonablesynth.lv2/lv2.c
index 4698cb9..bc3715a 100644
--- a/libs/plugins/reasonablesynth.lv2/lv2.c
+++ b/libs/plugins/reasonablesynth.lv2/lv2.c
@@ -153,6 +153,13 @@ run(LV2_Handle handle, uint32_t n_samples)
         )
     {
       if (ev->body.type == self->midi_MidiEvent) {
+#ifdef DEBUG_MIDI_EVENT // debug midi messages in synth -- not rt-safe(!)
+        printf ("%5d (%d):", ev->time.frames,  ev->body.size);
+        for (uint8_t i = 0; i < ev->body.size; ++i) {
+          printf (" %02x", ((const uint8_t*)(ev+1))[i]);
+        }
+        printf ("\n");
+#endif
         if (written + BUFFER_SIZE_SAMPLES < ev->time.frames
             && ev->time.frames < n_samples) {
           /* first synthesize sound up until the message timestamp */
diff --git a/libs/plugins/reasonablesynth.lv2/reasonablesynth.ttl.in b/libs/plugins/reasonablesynth.lv2/reasonablesynth.ttl.in
index 62921e5..93ade6f 100644
--- a/libs/plugins/reasonablesynth.lv2/reasonablesynth.ttl.in
+++ b/libs/plugins/reasonablesynth.lv2/reasonablesynth.ttl.in
@@ -7,17 +7,16 @@
 @prefix pg:    <http://lv2plug.in/ns/ext/port-groups#> .
 @prefix urid:  <http://lv2plug.in/ns/ext/urid#> .
 
-<http://gareus.org/rgareus#me>
+<http://ardour.org/credits.html>
 	a foaf:Person ;
-	foaf:name "Robin Gareus" ;
-	foaf:mbox <mailto:robin at gareus.org> ;
-	foaf:homepage <http://gareus.org/> .
+	foaf:name "Ardour Team" ;
+	foaf:homepage <http://ardour.org/> .
 
 <https://community.ardour.org/node/7596>
 	a lv2:Plugin, lv2:InstrumentPlugin, doap:Project;
 	doap:license <http://usefulinc.com/doap/licenses/gpl> ;
-	doap:maintainer <http://gareus.org/rgareus#me> ;
-	doap:name "Reasonable Synth";
+	doap:maintainer <http://ardour.org/credits.html> ;
+	doap:name "a-Reasonable Synth";
 	lv2:optionalFeature lv2:hardRTCapable ;
 	lv2:requiredFeature urid:map ;
 	rdfs:comment """A simple synthesizer with no controls at all but a reasonable sound instead. Note that this synth does not respond to any Control or Program Messages. Its main purpose is to act as sensible default on new installations until other plugins are installed.""" ;
diff --git a/libs/ptformat/MSVCptformat/ptformat.vcproj b/libs/ptformat/MSVCptformat/ptformat.vcproj
index 55623e3..aa2b28d 100644
--- a/libs/ptformat/MSVCptformat/ptformat.vcproj
+++ b/libs/ptformat/MSVCptformat/ptformat.vcproj
@@ -60,7 +60,7 @@
 			/>
 			<Tool
 				Name="VCLinkerTool"
-				AdditionalDependencies="pthreadVCE2.lib ws2_32.lib"
+				AdditionalDependencies="pthreadVCE2.lib $(DllPrefix)gthread32$(GlibDllSuffix)D.lib $(DllPrefix)gobject32$(GlibDllSuffix)D.lib $(DllPrefix)gmodule32$(GlibDllSuffix)D.lib $(DllPrefix)glib32$(GlibDllSuffix)D.lib $(DllPrefix)gio32$(GlibDllSuffix)D.lib ws2_32.lib"
 				OutputFile="$(OutDir)\$(DllPrefix)$(ProjectName)32-0D.dll"
 				AdditionalLibraryDirectories="F:\pthread-win32\Pre-built.2\lib"
 				GenerateDebugInformation="true"
@@ -140,7 +140,7 @@
 			/>
 			<Tool
 				Name="VCLinkerTool"
-				AdditionalDependencies="pthreadVCE2.lib ws2_32.lib"
+				AdditionalDependencies="pthreadVCE2.lib $(DllPrefix)gthread32$(GlibDllSuffix).lib $(DllPrefix)gobject32$(GlibDllSuffix).lib $(DllPrefix)gmodule32$(GlibDllSuffix).lib $(DllPrefix)glib32$(GlibDllSuffix).lib $(DllPrefix)gio32$(GlibDllSuffix).lib ws2_32.lib"
 				OutputFile="$(OutDir)\$(DllPrefix)$(ProjectName)32-0.dll"
 				AdditionalLibraryDirectories="F:\pthread-win32\Pre-built.2\lib"
 				SubSystem="2"
@@ -220,7 +220,7 @@
 			/>
 			<Tool
 				Name="VCLinkerTool"
-				AdditionalDependencies="pthreadVCE2.lib ws2_32.lib"
+				AdditionalDependencies="pthreadVCE2.lib $(DllPrefix)gthread32$(GlibDllSuffix)RDC.lib $(DllPrefix)gobject32$(GlibDllSuffix)RDC.lib $(DllPrefix)gmodule32$(GlibDllSuffix)RDC.lib $(DllPrefix)glib32$(GlibDllSuffix)RDC.lib $(DllPrefix)gio32$(GlibDllSuffix)RDC.lib ws2_32.lib"
 				OutputFile="$(OutDir)\$(DllPrefix)$(ProjectName)32-0RDC.dll"
 				AdditionalLibraryDirectories="F:\pthread-win32\Pre-built.2\lib"
 				GenerateDebugInformation="true"
@@ -286,7 +286,7 @@
 			UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
 			>
 			<File
-				RelativePath="..\..\..\icons\win32\msvc_resources.rc"
+				RelativePath="..\..\..\gtk2_ardour\win32\msvc_resources.rc"
 				>
 			</File>
 		</Filter>
diff --git a/libs/ptformat/ptfformat.cc b/libs/ptformat/ptfformat.cc
index 6d055d4..1dba1ac 100644
--- a/libs/ptformat/ptfformat.cc
+++ b/libs/ptformat/ptfformat.cc
@@ -14,13 +14,16 @@
 
 */
 
-#include "ptfformat.h"
-
 #include <stdio.h>
+#include <stdlib.h>
 #include <string>
 #include <string.h>
 #include <assert.h>
 
+#include <glib/gstdio.h>
+
+#include "ptfformat.h"
+
 using namespace std;
 
 static const uint32_t baselut[16] = {
@@ -113,8 +116,9 @@ PTFFormat::load(std::string path, int64_t targetsr) {
 	uint64_t i;
 	uint64_t j;
 	int inv;
+	int err;
 
-	if (! (fp = fopen(path.c_str(), "rb"))) {
+	if (! (fp = g_fopen(path.c_str(), "rb"))) {
 		return -1;
 	}
 
@@ -230,6 +234,12 @@ PTFFormat::load(std::string path, int64_t targetsr) {
 		unxor10();
 	}
 
+	// Special case when ptx is exported to ptf in PT
+	if (v == 3) {
+		version = 11;
+		unxor_ptx_to_ptf();
+	}
+
 	if (version == 0 || version == 5 || version == 7) {
 		/* Haven't detected version yet so decipher */
 		j = 0;
@@ -257,8 +267,12 @@ PTFFormat::load(std::string path, int64_t targetsr) {
 		}
 	}
 
+	if (version < 5 || version > 12)
+		return -1;
 	targetrate = targetsr;
-	parse();
+	err = parse();
+	if (err)
+		return -1;
 	return 0;
 }
 
@@ -299,35 +313,69 @@ PTFFormat::unxor10(void)
 }
 
 void
+PTFFormat::unxor_ptx_to_ptf(void)
+{
+	unsigned char keyy[16] = {	0x00,0x10,0x20,0x30,0x40,0x50,0x60,0x70,
+					0x80,0x90,0xa0,0xb0,0xc0,0xd0,0xe0,0xf0
+	};
+	uint64_t j;
+	uint8_t i;
+
+	for (i = 0, j = 0x10; j < len; j++,i++) {
+		ptfunxored[j] ^= keyy[i];
+		if ((j % 16) == 0) {
+			i = 0;
+			if (ptfunxored[j] % 2 == 0) {
+				ptfunxored[j]++;
+			} else {
+				ptfunxored[j]--;
+			}
+		}
+	}
+}
+
+int
 PTFFormat::parse(void) {
 	if (version == 5) {
 		parse5header();
 		setrates();
+		if (sessionrate < 44100 || sessionrate > 192000)
+		  return -1;
 		parseaudio5();
 		parserest5();
 	} else if (version == 7) {
 		parse7header();
 		setrates();
+		if (sessionrate < 44100 || sessionrate > 192000)
+		  return -1;
 		parseaudio();
 		parserest89();
 	} else if (version == 8) {
 		parse8header();
 		setrates();
+		if (sessionrate < 44100 || sessionrate > 192000)
+		  return -1;
 		parseaudio();
 		parserest89();
 	} else if (version == 9) {
 		parse9header();
 		setrates();
+		if (sessionrate < 44100 || sessionrate > 192000)
+		  return -1;
 		parseaudio();
 		parserest89();
 	} else if (version == 10 || version == 11 || version == 12) {
 		parse10header();
 		setrates();
+		if (sessionrate < 44100 || sessionrate > 192000)
+		  return -1;
 		parseaudio();
 		parserest10();
 	} else {
 		// Should not occur
+		return -1;
 	}
+	return 0;
 }
 
 void
@@ -589,13 +637,18 @@ PTFFormat::parserest5(void) {
 				vector<track_t>::iterator ti;
 				vector<track_t>::iterator bt = tracks.begin();
 				vector<track_t>::iterator et = tracks.end();
-				track_t tr ( name, 0, 0, &r);
+				track_t tr = { name, 0, 0, r };
 				if ((ti = std::find(bt, et, tr)) != et) {
 					tracknumber = (*ti).index;
 				} else {
 					tracknumber = tracks.size() + 1;
 				}
-				track_t t ( name, (uint16_t)tracknumber, uint8_t(0), &r);
+				track_t t = {
+					name,
+					(uint16_t)tracknumber,
+					uint8_t(0),
+					r
+				};
 				tracks.push_back(t);
 			} else {
 				region_t r = {
@@ -610,13 +663,18 @@ PTFFormat::parserest5(void) {
 				vector<track_t>::iterator ti;
 				vector<track_t>::iterator bt = tracks.begin();
 				vector<track_t>::iterator et = tracks.end();
-				track_t tr ( name, 0, 0, &r );
+				track_t tr = { name, 0, 0, r };
 				if ((ti = std::find(bt, et, tr)) != et) {
 					tracknumber = (*ti).index;
 				} else {
 					tracknumber = tracks.size() + 1;
 				}
-				track_t t ( name, (uint16_t)tracknumber, uint8_t(0), &r);
+				track_t t = {
+					name,
+					(uint16_t)tracknumber,
+					uint8_t(0),
+					r
+				};
 				tracks.push_back(t);
 			}
 			rindex++;
@@ -627,11 +685,10 @@ PTFFormat::parserest5(void) {
 }
 
 void
-PTFFormat::resort(std::vector<wav_t> *ws) {
+PTFFormat::resort(std::vector<wav_t>& ws) {
 	int j = 0;
-	std::sort((*ws).begin(), (*ws).end());
-	for (std::vector<wav_t>::iterator i = (*ws).begin();
-			i != (*ws).end(); ++i) {
+	std::sort(ws.begin(), ws.end());
+	for (std::vector<wav_t>::iterator i = ws.begin(); i != ws.end(); ++i) {
 		(*i).index = j;
 		j++;
 	}
@@ -723,8 +780,8 @@ PTFFormat::parseaudio5(void) {
 		numberofwavs--;
 		i += 7;
 	}
-	resort(&actualwavs);
-	resort(&audiofiles);
+	resort(actualwavs);
+	resort(audiofiles);
 }
 
 void
@@ -1297,7 +1354,7 @@ PTFFormat::parserest10(void) {
 					vector<region_t>::iterator finish = regions.end();
 					vector<region_t>::iterator found;
 					if ((found = std::find(begin, finish, tr.reg)) != finish) {
-						tr.set_region (&(*found));
+						tr.reg = (*found);
 					}
 					i = l+16;
 					offset = 0;
diff --git a/libs/ptformat/ptfformat.h b/libs/ptformat/ptfformat.h
index 8b2f58d..3a702aa 100644
--- a/libs/ptformat/ptfformat.h
+++ b/libs/ptformat/ptfformat.h
@@ -32,24 +32,24 @@ public:
 	*/
 	int load(std::string path, int64_t targetsr);
 
-	typedef struct wav {
+	struct wav_t {
 		std::string filename;
 		uint16_t    index;
 
 		int64_t     posabsolute;
 		int64_t     length;
 
-		bool operator <(const struct wav& other) const {
+		bool operator <(const struct wav_t& other) const {
 			return (strcasecmp(this->filename.c_str(),
 					other.filename.c_str()) < 0);
 		}
 
-		bool operator ==(const struct wav& other) const {
+		bool operator ==(const struct wav_t& other) const {
 			return (this->filename == other.filename ||
 				this->index == other.index);
 		}
 
-	} wav_t;
+	};
 
 	typedef struct region {
 		std::string name;
@@ -65,25 +65,6 @@ public:
 	} region_t;
 
 	typedef struct track {
-		track ()
-			: index (0)
-			, playlist (0)
-		{
-			memset ((void*)&reg, 0, sizeof(region_t));
-		}
-
-		track (std::string n, uint16_t i, uint8_t p, region_t *r)
-			: name (n)
-			, index (i)
-			, playlist (p)
-		{
-			set_region (r);
-		}
-
-		void set_region (region_t *r) {
-			memcpy ((void*)&reg, (void*)r, sizeof(region_t));
-		}
-
 		std::string name;
 		uint16_t    index;
 		uint8_t     playlist;
@@ -136,8 +117,9 @@ public:
 
 private:
 	bool foundin(std::string haystack, std::string needle);
-	void parse(void);
+	int parse(void);
 	void unxor10(void);
+	void unxor_ptx_to_ptf(void);
 	void setrates(void);
 	void parse5header(void);
 	void parse7header(void);
@@ -149,7 +131,7 @@ private:
 	void parserest10(void);
 	void parseaudio5(void);
 	void parseaudio(void);
-	void resort(std::vector<wav_t> *ws);
+	void resort(std::vector<wav_t>& ws);
 	uint8_t mostfrequent(uint32_t start, uint32_t stop);
 	std::vector<wav_t> actualwavs;
 	float ratefactor;
diff --git a/libs/surfaces/control_protocol/MSVCardour_cp/ardour_cp.vcproj b/libs/surfaces/control_protocol/MSVCardour_cp/ardour_cp.vcproj
index 62fdfa1..6234c26 100644
--- a/libs/surfaces/control_protocol/MSVCardour_cp/ardour_cp.vcproj
+++ b/libs/surfaces/control_protocol/MSVCardour_cp/ardour_cp.vcproj
@@ -41,8 +41,8 @@
 				Name="VCCLCompilerTool"
 				AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
 				Optimization="0"
-				AdditionalIncludeDirectories="..;..\..\..\ardour;..\..\..\pbd;..\..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\..\surfaces\control_protocol;..\..\..\evoral;..\..\..\libltc;..\..\..\timecode;..\..\..\rubberband;"..\..\..\vamp-sdk";"..\..\..\midi++2";..\..\..\taglib;..\..\..\taglib\taglib;..\..\..\taglib\taglib\toolkit;..\..\..\audiographer;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor""
-				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;BUILDING_ARDOUR_CP;LIBCONTROLCP_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_DEBUG;DEBUG="Debug";ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"ardour_cp\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+				AdditionalIncludeDirectories="..;..\..\..\ardour;..\..\..\pbd;..\..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\..\surfaces\control_protocol;..\..\..\evoral;..\..\..\libltc;..\..\..\timecode;..\..\..\rubberband;"..\..\..\vamp-sdk";"..\..\..\midi++2";..\..\..\taglib;..\..\..\taglib\taglib;..\..\..\taglib\taglib\toolkit;..\..\..\audiographer;..\..\..\lua;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor""
+				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;BUILDING_ARDOUR_CP;LIBCONTROLCP_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_DEBUG;DEBUG="Debug";ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"ardour_cp\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
 				MinimalRebuild="true"
 				RuntimeLibrary="3"
 				WarningLevel="3"
@@ -123,8 +123,8 @@
 				AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
 				Optimization="2"
 				InlineFunctionExpansion="1"
-				AdditionalIncludeDirectories="..;..\..\..\ardour;..\..\..\pbd;..\..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\..\surfaces\control_protocol;..\..\..\evoral;..\..\..\libltc;..\..\..\timecode;..\..\..\rubberband;"..\..\..\vamp-sdk";"..\..\..\midi++2";..\..\..\taglib;..\..\..\taglib\taglib;..\..\..\taglib\taglib\toolkit;..\..\..\audiographer;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor""
-				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_ARDOUR_CP;LIBCONTROLCP_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;NDEBUG;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"ardour_cp\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+				AdditionalIncludeDirectories="..;..\..\..\ardour;..\..\..\pbd;..\..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\..\surfaces\control_protocol;..\..\..\evoral;..\..\..\libltc;..\..\..\timecode;..\..\..\rubberband;"..\..\..\vamp-sdk";"..\..\..\midi++2";..\..\..\taglib;..\..\..\taglib\taglib;..\..\..\taglib\taglib\toolkit;..\..\..\audiographer;..\..\..\lua;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor""
+				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_ARDOUR_CP;LIBCONTROLCP_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;NDEBUG;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"ardour_cp\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
 				StringPooling="false"
 				RuntimeLibrary="2"
 				EnableEnhancedInstructionSet="1"
@@ -204,8 +204,8 @@
 				Name="VCCLCompilerTool"
 				AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
 				Optimization="0"
-				AdditionalIncludeDirectories="..;..\..\..\ardour;..\..\..\pbd;..\..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\..\surfaces\control_protocol;..\..\..\evoral;..\..\..\libltc;..\..\..\timecode;..\..\..\rubberband;"..\..\..\vamp-sdk";"..\..\..\midi++2";..\..\..\taglib;..\..\..\taglib\taglib;..\..\..\taglib\taglib\toolkit;..\..\..\audiographer;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor""
-				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_ARDOUR_CP;LIBCONTROLCP_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"ardour_cp\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+				AdditionalIncludeDirectories="..;..\..\..\ardour;..\..\..\pbd;..\..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\..\surfaces\control_protocol;..\..\..\evoral;..\..\..\libltc;..\..\..\timecode;..\..\..\rubberband;"..\..\..\vamp-sdk";"..\..\..\midi++2";..\..\..\taglib;..\..\..\taglib\taglib;..\..\..\taglib\taglib\toolkit;..\..\..\audiographer;..\..\..\lua;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor""
+				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_ARDOUR_CP;LIBCONTROLCP_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"ardour_cp\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
 				StringPooling="false"
 				RuntimeLibrary="2"
 				EnableEnhancedInstructionSet="1"
@@ -300,7 +300,7 @@
 			UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
 			>
 			<File
-				RelativePath="..\..\..\..\icons\win32\msvc_resources.rc"
+				RelativePath="..\..\..\..\gtk2_ardour\win32\msvc_resources.rc"
 				>
 			</File>
 		</Filter>
diff --git a/libs/surfaces/control_protocol/basic_ui.cc b/libs/surfaces/control_protocol/basic_ui.cc
index fc48b40..74c2802 100644
--- a/libs/surfaces/control_protocol/basic_ui.cc
+++ b/libs/surfaces/control_protocol/basic_ui.cc
@@ -27,7 +27,7 @@
 
 #include "control_protocol/basic_ui.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 
@@ -70,14 +70,39 @@ BasicUI::access_action ( std::string action_path )
 void
 BasicUI::loop_toggle ()
 {
+	if (!session) {
+		return;
+	}
+
+	Location * looploc = session->locations()->auto_loop_location();
+
+	if (!looploc) {
+		return;
+	}
+
 	if (session->get_play_loop()) {
+
+		/* looping enabled, our job is to disable it */
+
 		session->request_play_loop (false);
+
 	} else {
-		session->request_play_loop (true);
-		if (!session->transport_rolling()) {
-			session->request_transport_speed (1.0);
+
+		/* looping not enabled, our job is to enable it.
+
+		   loop-is-NOT-mode: this action always starts the transport rolling.
+		   loop-IS-mode:     this action simply sets the loop play mechanism, but
+		                        does not start transport.
+		*/
+		if (Config->get_loop_is_mode()) {
+			session->request_play_loop (true, false);
+		} else {
+			session->request_play_loop (true, true);
 		}
 	}
+
+	//show the loop markers
+	looploc->set_hidden (false, this);
 }
 
 void
@@ -174,22 +199,56 @@ BasicUI::transport_stop ()
 void
 BasicUI::transport_play (bool from_last_start)
 {
-	bool rolling = session->transport_rolling ();
+	if (!session) {
+		return;
+	}
 
-	if (session->get_play_loop()) {
-		session->request_play_loop (false);
+	if (session->is_auditioning()) {
+		return;
 	}
 
-	if (session->get_play_range ()) {
-		session->request_play_range (0);
+#if 0
+	if (session->config.get_external_sync()) {
+		switch (Config->get_sync_source()) {
+		case Engine:
+			break;
+		default:
+			/* transport controlled by the master */
+			return;
+		}
 	}
+#endif
+
+	bool rolling = session->transport_rolling();
+
+	if (session->get_play_loop()) {
+
+		/* If loop playback is not a mode, then we should cancel
+		   it when this action is requested. If it is a mode
+		   we just leave it in place.
+		*/
 
-	if (from_last_start && rolling) {
-		session->request_locate (session->last_transport_start(), true);
+		if (!Config->get_loop_is_mode()) {
+			/* XXX it is not possible to just leave seamless loop and keep
+			   playing at present (nov 4th 2009)
+			*/
+			if (!Config->get_seamless_loop()) {
+				/* stop loop playback and stop rolling */
+				session->request_play_loop (false, true);
+			} else if (rolling) {
+				/* stop loop playback but keep rolling */
+				session->request_play_loop (false, false);
+			}
+		}
 
+	} else if (session->get_play_range () ) {
+		/* stop playing a range if we currently are */
+		session->request_play_range (0, true);
 	}
 
-	session->request_transport_speed (1.0f);
+	if (!rolling) {
+		session->request_transport_speed (1.0f);
+	}
 }
 
 void
@@ -332,28 +391,27 @@ BasicUI::jump_by_seconds (double secs)
 {
 	framepos_t current = session->transport_frame();
 	double s = (double) current / (double) session->nominal_frame_rate();
-	
+
 	s+= secs;
 	if (s < 0) current = 0;
 	s = s * session->nominal_frame_rate();
-	
+
 	session->request_locate ( floor(s) );
 }
 
 void
 BasicUI::jump_by_bars (double bars)
 {
-	Timecode::BBT_Time bbt;
 	TempoMap& tmap (session->tempo_map());
-	tmap.bbt_time (session->transport_frame(), bbt);
+	Timecode::BBT_Time bbt (tmap.bbt_at_frame (session->transport_frame()));
 
 	bars += bbt.bars;
 	if (bars < 0) bars = 0;
-	
+
 	AnyTime any;
 	any.type = AnyTime::BBT;
 	any.bbt.bars = bars;
-	
+
 	session->request_locate ( session->convert_to_frames (any) );
 }
 
diff --git a/libs/surfaces/control_protocol/control_protocol.cc b/libs/surfaces/control_protocol/control_protocol.cc
index 57b874e..8c2a121 100644
--- a/libs/surfaces/control_protocol/control_protocol.cc
+++ b/libs/surfaces/control_protocol/control_protocol.cc
@@ -22,6 +22,7 @@
 
 #include "ardour/gain_control.h"
 #include "ardour/session.h"
+#include "ardour/record_enable_control.h"
 #include "ardour/route.h"
 #include "ardour/audio_track.h"
 #include "ardour/meter.h"
@@ -45,15 +46,23 @@ PBD::Signal0<void> ControlProtocol::VerticalZoomInAll;
 PBD::Signal0<void> ControlProtocol::VerticalZoomOutAll;
 PBD::Signal0<void> ControlProtocol::VerticalZoomInSelected;
 PBD::Signal0<void> ControlProtocol::VerticalZoomOutSelected;
-PBD::Signal1<void,RouteNotificationListPtr> ControlProtocol::TrackSelectionChanged;
-PBD::Signal1<void,uint32_t> ControlProtocol::AddRouteToSelection;
-PBD::Signal1<void,uint32_t> ControlProtocol::SetRouteSelection;
-PBD::Signal1<void,uint32_t> ControlProtocol::ToggleRouteSelection;
-PBD::Signal1<void,uint32_t> ControlProtocol::RemoveRouteFromSelection;
-PBD::Signal0<void>          ControlProtocol::ClearRouteSelection;
 PBD::Signal0<void>          ControlProtocol::StepTracksDown;
 PBD::Signal0<void>          ControlProtocol::StepTracksUp;
 
+PBD::Signal1<void,boost::shared_ptr<ARDOUR::Stripable> > ControlProtocol::AddStripableToSelection;
+PBD::Signal1<void,boost::shared_ptr<ARDOUR::Stripable> > ControlProtocol::SetStripableSelection;
+PBD::Signal1<void,boost::shared_ptr<ARDOUR::Stripable> > ControlProtocol::ToggleStripableSelection;
+PBD::Signal1<void,boost::shared_ptr<ARDOUR::Stripable> > ControlProtocol::RemoveStripableFromSelection;
+PBD::Signal0<void>          ControlProtocol::ClearStripableSelection;
+
+PBD::Signal1<void,StripableNotificationListPtr> ControlProtocol::StripableSelectionChanged;
+
+Glib::Threads::Mutex ControlProtocol::first_selected_mutex;
+boost::weak_ptr<Stripable> ControlProtocol::_first_selected_stripable;
+StripableNotificationList ControlProtocol::_last_selected;
+bool ControlProtocol::selection_connected = false;
+PBD::ScopedConnection ControlProtocol::selection_connection;
+
 const std::string ControlProtocol::state_node_name ("Protocol");
 
 ControlProtocol::ControlProtocol (Session& s, string str)
@@ -61,6 +70,12 @@ ControlProtocol::ControlProtocol (Session& s, string str)
 	, _name (str)
 	, _active (false)
 {
+	if (!selection_connected) {
+		/* this is all static, connect it only once (and early), for all ControlProtocols */
+
+		StripableSelectionChanged.connect_same_thread (selection_connection, boost::bind (&ControlProtocol::stripable_selection_changed, _1));
+		selection_connected = true;
+	}
 }
 
 ControlProtocol::~ControlProtocol ()
@@ -77,82 +92,18 @@ ControlProtocol::set_active (bool yn)
 void
 ControlProtocol::next_track (uint32_t initial_id)
 {
-	uint32_t limit = session->nroutes();
-	boost::shared_ptr<Route> cr = route_table[0];
-	uint32_t id;
-
-	if (cr) {
-		id = cr->remote_control_id ();
-	} else {
-		id = 0;
-	}
-
-	if (id == limit) {
-		id = 0;
-	} else {
-		id++;
-	}
-
-	while (id <= limit) {
-		if ((cr = session->route_by_remote_id (id)) != 0) {
-			break;
-		}
-		id++;
-	}
-
-	if (id >= limit) {
-		id = 0;
-		while (id != initial_id) {
-			if ((cr = session->route_by_remote_id (id)) != 0) {
-				break;
-			}
-			id++;
-		}
-	}
-
-	route_table[0] = cr;
+	// STRIPABLE route_table[0] = _session->get_nth_stripable (++initial_id, RemoteControlID::Route);
 }
 
 void
 ControlProtocol::prev_track (uint32_t initial_id)
 {
-	uint32_t limit = session->nroutes();
-	boost::shared_ptr<Route> cr = route_table[0];
-	int32_t id;
-
-	if (cr) {
-		id = cr->remote_control_id ();
-	} else {
-		id = 0;
-	}
-
-	if (id == 0) {
-		id = limit;
-	} else {
-		id--;
-	}
-
-	while (id >= 0) {
-		if ((cr = session->route_by_remote_id (id)) != 0) {
-			break;
-		}
-		id--;
-	}
-
-	if (id < 0) {
-		uint32_t i = limit;
-		while (i > initial_id) {
-			if ((cr = session->route_by_remote_id (i)) != 0) {
-				break;
-			}
-			i--;
-		}
+	if (!initial_id) {
+		return;
 	}
-
-	route_table[0] = cr;
+	// STRIPABLE route_table[0] = _session->get_nth_stripable (--initial_id, RemoteControlID::Route);
 }
 
-
 void
 ControlProtocol::set_route_table_size (uint32_t size)
 {
@@ -176,6 +127,7 @@ ControlProtocol::set_route_table (uint32_t table_index, boost::shared_ptr<ARDOUR
 bool
 ControlProtocol::set_route_table (uint32_t table_index, uint32_t remote_control_id)
 {
+#if 0 // STRIPABLE
 	boost::shared_ptr<Route> r = session->route_by_remote_id (remote_control_id);
 
 	if (!r) {
@@ -183,7 +135,7 @@ ControlProtocol::set_route_table (uint32_t table_index, uint32_t remote_control_
 	}
 
 	set_route_table (table_index, r);
-
+#endif
 	return true;
 }
 
@@ -199,7 +151,7 @@ ControlProtocol::route_set_rec_enable (uint32_t table_index, bool yn)
 	boost::shared_ptr<AudioTrack> at = boost::dynamic_pointer_cast<AudioTrack>(r);
 
 	if (at) {
-		at->set_record_enabled (yn, Controllable::NoGroup);
+		at->rec_enable_control()->set_value (1.0, Controllable::UseGroup);
 	}
 }
 
@@ -215,7 +167,7 @@ ControlProtocol::route_get_rec_enable (uint32_t table_index)
 	boost::shared_ptr<AudioTrack> at = boost::dynamic_pointer_cast<AudioTrack>(r);
 
 	if (at) {
-		return at->record_enabled ();
+		return at->rec_enable_control()->get_value();
 	}
 
 	return false;
@@ -248,7 +200,7 @@ ControlProtocol::route_set_gain (uint32_t table_index, float gain)
 	boost::shared_ptr<Route> r = route_table[table_index];
 
 	if (r != 0) {
-		r->set_gain (gain, Controllable::UseGroup);
+		r->gain_control()->set_value (gain, Controllable::UseGroup);
 	}
 }
 
@@ -282,10 +234,9 @@ ControlProtocol::route_get_peak_input_power (uint32_t table_index, uint32_t whic
 		return 0.0f;
 	}
 
-	return r->peak_meter().meter_level (which_input, MeterPeak);
+	return r->peak_meter()->meter_level (which_input, MeterPeak);
 }
 
-
 bool
 ControlProtocol::route_get_muted (uint32_t table_index)
 {
@@ -299,7 +250,7 @@ ControlProtocol::route_get_muted (uint32_t table_index)
 		return false;
 	}
 
-	return r->muted ();
+	return r->mute_control()->muted ();
 }
 
 void
@@ -312,7 +263,7 @@ ControlProtocol::route_set_muted (uint32_t table_index, bool yn)
 	boost::shared_ptr<Route> r = route_table[table_index];
 
 	if (r != 0) {
-		r->set_mute (yn, Controllable::UseGroup);
+		r->mute_control()->set_value (yn ? 1.0 : 0.0, Controllable::UseGroup);
 	}
 }
 
@@ -343,7 +294,7 @@ ControlProtocol::route_set_soloed (uint32_t table_index, bool yn)
 	boost::shared_ptr<Route> r = route_table[table_index];
 
 	if (r != 0) {
-		r->set_solo (yn, Controllable::UseGroup);
+		r->solo_control()->set_value (yn ? 1.0 : 0.0, Controllable::UseGroup);
 	}
 }
 
@@ -391,3 +342,37 @@ ControlProtocol::set_state (XMLNode const & node, int /* version */)
 
 	return 0;
 }
+
+boost::shared_ptr<Stripable>
+ControlProtocol::first_selected_stripable ()
+{
+	Glib::Threads::Mutex::Lock lm (first_selected_mutex);
+	return _first_selected_stripable.lock();
+}
+
+void
+ControlProtocol::set_first_selected_stripable (boost::shared_ptr<Stripable> s)
+{
+	Glib::Threads::Mutex::Lock lm (first_selected_mutex);
+	_first_selected_stripable = s;
+}
+
+void
+ControlProtocol::stripable_selection_changed (StripableNotificationListPtr sp)
+{
+	bool had_selection = !_last_selected.empty();
+
+	_last_selected = *sp;
+
+	{
+		Glib::Threads::Mutex::Lock lm (first_selected_mutex);
+
+		if (!_last_selected.empty()) {
+			if (!had_selection) {
+				_first_selected_stripable = _last_selected.front().lock();
+			}
+		} else {
+			_first_selected_stripable = boost::weak_ptr<Stripable>();
+		}
+	}
+}
diff --git a/libs/surfaces/control_protocol/control_protocol/basic_ui.h b/libs/surfaces/control_protocol/control_protocol/basic_ui.h
index 1509602..43ebcfa 100644
--- a/libs/surfaces/control_protocol/control_protocol/basic_ui.h
+++ b/libs/surfaces/control_protocol/control_protocol/basic_ui.h
@@ -27,6 +27,7 @@
 #include "pbd/signals.h"
 
 #include "ardour/types.h"
+#include "ardour/presentation_info.h"
 
 #include "timecode/time.h"
 
@@ -35,6 +36,7 @@
 namespace ARDOUR {
 	class Session;
 	class SessionEvent;
+	class Stripable;
 }
 
 class LIBCONTROLCP_API BasicUI {
@@ -44,7 +46,7 @@ class LIBCONTROLCP_API BasicUI {
 
 	void add_marker (const std::string& = std::string());
 	void remove_marker_at_playhead ();
-	
+
 //	void mark_in();
 //	void mark_out();
 
diff --git a/libs/surfaces/control_protocol/control_protocol/control_protocol.h b/libs/surfaces/control_protocol/control_protocol/control_protocol.h
index 71e8754..2485ca8 100644
--- a/libs/surfaces/control_protocol/control_protocol/control_protocol.h
+++ b/libs/surfaces/control_protocol/control_protocol/control_protocol.h
@@ -39,6 +39,7 @@ namespace ARDOUR {
 class Route;
 class Session;
 class Bundle;
+class Stripable;
 
 class LIBCONTROLCP_API ControlProtocol : public PBD::Stateful, public PBD::ScopedConnectionList, public BasicUI
 {
@@ -78,18 +79,21 @@ class LIBCONTROLCP_API ControlProtocol : public PBD::Stateful, public PBD::Scope
 	static PBD::Signal0<void> StepTracksDown;
 	static PBD::Signal0<void> StepTracksUp;
 
-	static PBD::Signal1<void,uint32_t> AddRouteToSelection;
-	static PBD::Signal1<void,uint32_t> SetRouteSelection;
-	static PBD::Signal1<void,uint32_t> ToggleRouteSelection;
-	static PBD::Signal1<void,uint32_t> RemoveRouteFromSelection;
-	static PBD::Signal0<void>          ClearRouteSelection;
+	static PBD::Signal1<void,boost::shared_ptr<ARDOUR::Stripable> > AddStripableToSelection;
+	static PBD::Signal1<void,boost::shared_ptr<ARDOUR::Stripable> > SetStripableSelection;
+	static PBD::Signal1<void,boost::shared_ptr<ARDOUR::Stripable> > ToggleStripableSelection;
+	static PBD::Signal1<void,boost::shared_ptr<ARDOUR::Stripable> > RemoveStripableFromSelection;
+	static PBD::Signal0<void>          ClearStripableSelection;
 
 	/* signals that one UI (e.g. the GUI) can emit to get all other UI's to
 	   respond. Typically this will always be GUI->"others" - the GUI pays
 	   no attention to these signals.
 	*/
 
-	static PBD::Signal1<void,RouteNotificationListPtr> TrackSelectionChanged;
+	static PBD::Signal1<void,StripableNotificationListPtr> StripableSelectionChanged;
+
+	static boost::shared_ptr<ARDOUR::Stripable> first_selected_stripable ();
+	static void set_first_selected_stripable (boost::shared_ptr<ARDOUR::Stripable>);
 
 	/* the model here is as follows:
 
@@ -138,6 +142,7 @@ class LIBCONTROLCP_API ControlProtocol : public PBD::Stateful, public PBD::Scope
         int set_state (XMLNode const &, int version);
 
         static const std::string state_node_name;
+        static StripableNotificationList const & last_selected() { return _last_selected; }
 
   protected:
 	std::vector<boost::shared_ptr<ARDOUR::Route> > route_table;
@@ -149,6 +154,14 @@ class LIBCONTROLCP_API ControlProtocol : public PBD::Stateful, public PBD::Scope
   private:
 	LIBCONTROLCP_LOCAL ControlProtocol (const ControlProtocol&); /* noncopyable */
         bool _active;
+
+
+        static Glib::Threads::Mutex first_selected_mutex;
+        static boost::weak_ptr<ARDOUR::Stripable> _first_selected_stripable;
+        static StripableNotificationList _last_selected;
+        static void stripable_selection_changed (StripableNotificationListPtr);
+        static bool selection_connected;
+        static PBD::ScopedConnection selection_connection;
 };
 
 extern "C" {
diff --git a/libs/surfaces/control_protocol/control_protocol/types.h b/libs/surfaces/control_protocol/control_protocol/types.h
index 1d46753..d2e5d07 100644
--- a/libs/surfaces/control_protocol/control_protocol/types.h
+++ b/libs/surfaces/control_protocol/control_protocol/types.h
@@ -26,11 +26,15 @@
 
 namespace ARDOUR {
 	class Route;
+	class Stripable;
 
 	typedef std::vector<boost::weak_ptr<ARDOUR::Route> >    RouteNotificationList;
 	typedef boost::shared_ptr<RouteNotificationList>        RouteNotificationListPtr;
-
 	typedef std::vector<boost::shared_ptr<ARDOUR::Route> >  StrongRouteNotificationList;
+
+	typedef std::vector<boost::weak_ptr<ARDOUR::Stripable> >    StripableNotificationList;
+	typedef boost::shared_ptr<StripableNotificationList>        StripableNotificationListPtr;
+	typedef std::vector<boost::shared_ptr<ARDOUR::Stripable> >  StrongStripableNotificationList;
 }
 
 #endif /* __ardour_control_protocol_types_h__ */
diff --git a/libs/surfaces/control_protocol/wscript b/libs/surfaces/control_protocol/wscript
index b3fcf23..6a11cad 100644
--- a/libs/surfaces/control_protocol/wscript
+++ b/libs/surfaces/control_protocol/wscript
@@ -32,7 +32,8 @@ def build(bld):
     obj.includes     = ['.', './control_protocol']
     obj.name         = 'libardour_cp'
     obj.target       = 'ardourcp'
-    obj.use          = 'libardour'
+    obj.use          = 'libardour libpbd'
+    obj.uselib       = 'GLIBMM SIGCPP XML'
     obj.install_path = bld.env['LIBDIR']
 
 def shutdown():
diff --git a/libs/surfaces/faderport/faderport.cc b/libs/surfaces/faderport/faderport.cc
index 5f5a1a1..0f32b09 100644
--- a/libs/surfaces/faderport/faderport.cc
+++ b/libs/surfaces/faderport/faderport.cc
@@ -26,7 +26,6 @@
 #include <glibmm/fileutils.h>
 #include <glibmm/miscutils.h>
 
-#include "pbd/controllable_descriptor.h"
 #include "pbd/error.h"
 #include "pbd/failed_constructor.h"
 #include "pbd/file_utils.h"
@@ -40,6 +39,7 @@
 #include "ardour/audioengine.h"
 #include "ardour/amp.h"
 #include "ardour/bundle.h"
+#include "ardour/controllable_descriptor.h"
 #include "ardour/debug.h"
 #include "ardour/filesystem_paths.h"
 #include "ardour/midi_port.h"
@@ -47,7 +47,8 @@
 #include "ardour/monitor_processor.h"
 #include "ardour/profile.h"
 #include "ardour/rc_configuration.h"
-#include "ardour/route.h"
+#include "ardour/record_enable_control.h"
+#include "ardour/stripable.h"
 #include "ardour/session.h"
 #include "ardour/session_configuration.h"
 #include "ardour/track.h"
@@ -60,7 +61,7 @@ using namespace PBD;
 using namespace Glib;
 using namespace std;
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 #include "pbd/abstract_ui.cc" // instantiate template
 
@@ -108,7 +109,7 @@ FaderPort::FaderPort (Session& s)
 		);
 
 
-	TrackSelectionChanged.connect (selection_connection, MISSING_INVALIDATOR, boost::bind (&FaderPort::gui_track_selection_changed, this, _1), this);
+	StripableSelectionChanged.connect (selection_connection, MISSING_INVALIDATOR, boost::bind (&FaderPort::gui_track_selection_changed, this, _1), this);
 
 	/* Catch port connections and disconnections */
 	ARDOUR::AudioEngine::instance()->PortConnectedOrDisconnected.connect (port_connection, MISSING_INVALIDATOR, boost::bind (&FaderPort::connection_handler, this, _1, _2, _3, _4, _5), this);
@@ -372,8 +373,8 @@ FaderPort::button_handler (MIDI::Parser &, MIDI::EventTwoBytes* tb)
 		break;
 	case FaderTouch:
 		fader_is_touched = tb->value;
-		if (_current_route) {
-			boost::shared_ptr<AutomationControl> gain = _current_route->gain_control ();
+		if (_current_stripable) {
+			boost::shared_ptr<AutomationControl> gain = _current_stripable->gain_control ();
 			if (gain) {
 				framepos_t now = session->engine().sample_time();
 				if (tb->value) {
@@ -443,7 +444,7 @@ FaderPort::encoder_handler (MIDI::Parser &, MIDI::pitchbend_t pb)
 		last_good_encoder_delta = delta;
 	}
 
-	if (_current_route) {
+	if (_current_stripable) {
 
 		ButtonState trim_modifier;
 		ButtonState width_modifier;
@@ -457,7 +458,7 @@ FaderPort::encoder_handler (MIDI::Parser &, MIDI::pitchbend_t pb)
 		}
 
 		if ((button_state & trim_modifier) == trim_modifier ) {    // mod+encoder = input trim
-			boost::shared_ptr<AutomationControl> trim = _current_route->trim()->gain_control ();
+			boost::shared_ptr<AutomationControl> trim = _current_stripable->trim_control ();
 			if (trim) {
 				float val = trim->get_user();  //for gain elements, the "user" value is in dB
 				val += delta;
@@ -498,16 +499,16 @@ FaderPort::fader_handler (MIDI::Parser &, MIDI::EventTwoBytes* tb)
 	}
 
 	if (was_fader) {
-		if (_current_route) {
-			boost::shared_ptr<AutomationControl> gain = _current_route->gain_control ();
+		if (_current_stripable) {
+			boost::shared_ptr<AutomationControl> gain = _current_stripable->gain_control ();
 			if (gain) {
 				int ival = (fader_msb << 7) | fader_lsb;
 				float val = gain->interface_to_internal (ival/16384.0);
 				/* even though the faderport only controls a
-				   single route at a time, allow the fader to
+				   single stripable at a time, allow the fader to
 				   modify the group, if appropriate.
 				*/
-				_current_route->set_gain (val, Controllable::UseGroup);
+				_current_stripable->gain_control()->set_value (val, Controllable::UseGroup);
 			}
 		}
 	}
@@ -601,11 +602,11 @@ FaderPort::set_active (bool yn)
 bool
 FaderPort::periodic ()
 {
-	if (!_current_route) {
+	if (!_current_stripable) {
 		return true;
 	}
 
-	ARDOUR::AutoState gain_state = _current_route->gain_control()->automation_state();
+	ARDOUR::AutoState gain_state = _current_stripable->gain_control()->automation_state();
 
 	if (gain_state == ARDOUR::Touch || gain_state == ARDOUR::Play) {
 		map_gain ();
@@ -652,10 +653,10 @@ FaderPort::close ()
 	port_connection.disconnect ();
 	blink_connection.disconnect ();
 	selection_connection.disconnect ();
-	route_connections.drop_connections ();
+	stripable_connections.drop_connections ();
 
 #if 0
-	route_connections.drop_connections ();
+	stripable_connections.drop_connections ();
 #endif
 }
 
@@ -1104,68 +1105,67 @@ FaderPort::Button::get_state () const
 }
 
 void
-FaderPort::gui_track_selection_changed (RouteNotificationListPtr routes)
+FaderPort::gui_track_selection_changed (StripableNotificationListPtr stripables)
 {
-	boost::shared_ptr<Route> r;
+	boost::shared_ptr<Stripable> r;
 
-	if (!routes->empty()) {
-		r = routes->front().lock();
+	if (!stripables->empty()) {
+		r = stripables->front().lock();
 	}
 
-	set_current_route (r);
+	set_current_stripable (r);
 }
 
 void
-FaderPort::drop_current_route ()
+FaderPort::drop_current_stripable ()
 {
-	if (_current_route) {
-		if (_current_route == session->monitor_out()) {
-			set_current_route (session->master_out());
+	if (_current_stripable) {
+		if (_current_stripable == session->monitor_out()) {
+			set_current_stripable (session->master_out());
 		} else {
-			set_current_route (boost::shared_ptr<Route>());
+			set_current_stripable (boost::shared_ptr<Stripable>());
 		}
 	}
 }
 
 void
-FaderPort::set_current_route (boost::shared_ptr<Route> r)
+FaderPort::set_current_stripable (boost::shared_ptr<Stripable> r)
 {
-	route_connections.drop_connections ();
+	stripable_connections.drop_connections ();
 
-	_current_route = r;
+	_current_stripable = r;
 
 	/* turn this off. It will be turned on back on in use_master() or
 	   use_monitor() as appropriate.
 	*/
 	get_button(Output).set_led_state (_output_port, false);
 
-	if (_current_route) {
-		_current_route->DropReferences.connect (route_connections, MISSING_INVALIDATOR, boost::bind (&FaderPort::drop_current_route, this), this);
+	if (_current_stripable) {
+		_current_stripable->DropReferences.connect (stripable_connections, MISSING_INVALIDATOR, boost::bind (&FaderPort::drop_current_stripable, this), this);
 
-		_current_route->mute_changed.connect (route_connections, MISSING_INVALIDATOR, boost::bind (&FaderPort::map_mute, this), this);
-		_current_route->solo_changed.connect (route_connections, MISSING_INVALIDATOR, boost::bind (&FaderPort::map_solo, this), this);
-		_current_route->listen_changed.connect (route_connections, MISSING_INVALIDATOR, boost::bind (&FaderPort::map_listen, this), this);
+		_current_stripable->mute_control()->Changed.connect (stripable_connections, MISSING_INVALIDATOR, boost::bind (&FaderPort::map_mute, this), this);
+		_current_stripable->solo_control()->Changed.connect (stripable_connections, MISSING_INVALIDATOR, boost::bind (&FaderPort::map_solo, this), this);
 
-		boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (_current_route);
+		boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (_current_stripable);
 		if (t) {
-			t->RecordEnableChanged.connect (route_connections, MISSING_INVALIDATOR, boost::bind (&FaderPort::map_recenable, this), this);
+			t->rec_enable_control()->Changed.connect (stripable_connections, MISSING_INVALIDATOR, boost::bind (&FaderPort::map_recenable, this), this);
 		}
 
-		boost::shared_ptr<AutomationControl> control = _current_route->gain_control ();
+		boost::shared_ptr<AutomationControl> control = _current_stripable->gain_control ();
 		if (control) {
-			control->Changed.connect (route_connections, MISSING_INVALIDATOR, boost::bind (&FaderPort::map_gain, this), this);
-			control->alist()->automation_state_changed.connect (route_connections, MISSING_INVALIDATOR, boost::bind (&FaderPort::map_auto, this), this);
+			control->Changed.connect (stripable_connections, MISSING_INVALIDATOR, boost::bind (&FaderPort::map_gain, this), this);
+			control->alist()->automation_state_changed.connect (stripable_connections, MISSING_INVALIDATOR, boost::bind (&FaderPort::map_auto, this), this);
 		}
 
-		boost::shared_ptr<MonitorProcessor> mp = _current_route->monitor_control();
+		boost::shared_ptr<MonitorProcessor> mp = _current_stripable->monitor_control();
 		if (mp) {
-			mp->cut_control()->Changed.connect (route_connections, MISSING_INVALIDATOR, boost::bind (&FaderPort::map_cut, this), this);
+			mp->cut_control()->Changed.connect (stripable_connections, MISSING_INVALIDATOR, boost::bind (&FaderPort::map_cut, this), this);
 		}
 	}
 
 	//ToDo: subscribe to the fader automation modes so we can light the LEDs
 
-	map_route_state ();
+	map_stripable_state ();
 }
 
 void
@@ -1175,7 +1175,7 @@ FaderPort::map_auto ()
 	 * the Off button, because this will disable the fader.
 	 */
 
-	boost::shared_ptr<AutomationControl> control = _current_route->gain_control ();
+	boost::shared_ptr<AutomationControl> control = _current_stripable->gain_control ();
 	const AutoState as = control->automation_state ();
 
 	switch (as) {
@@ -1207,7 +1207,7 @@ FaderPort::map_auto ()
 void
 FaderPort::map_cut ()
 {
-	boost::shared_ptr<MonitorProcessor> mp = _current_route->monitor_control();
+	boost::shared_ptr<MonitorProcessor> mp = _current_stripable->monitor_control();
 
 	if (mp) {
 		bool yn = mp->cut_all ();
@@ -1224,11 +1224,11 @@ FaderPort::map_cut ()
 void
 FaderPort::map_mute ()
 {
-	if (_current_route) {
-		if (_current_route->muted()) {
+	if (_current_stripable) {
+		if (_current_stripable->mute_control()->muted()) {
 			stop_blinking (Mute);
 			get_button (Mute).set_led_state (_output_port, true);
-		} else if (_current_route->muted_by_others()) {
+		} else if (_current_stripable->mute_control()->muted_by_others_soloing () || _current_stripable->mute_control()->muted_by_masters()) {
 			start_blinking (Mute);
 		} else {
 			stop_blinking (Mute);
@@ -1241,18 +1241,8 @@ FaderPort::map_mute ()
 void
 FaderPort::map_solo ()
 {
-	if (_current_route) {
-		get_button (Solo).set_led_state (_output_port, _current_route->soloed() || _current_route->listening_via_monitor());
-	} else {
-		get_button (Solo).set_led_state (_output_port, false);
-	}
-}
-
-void
-FaderPort::map_listen ()
-{
-	if (_current_route) {
-		get_button (Solo).set_led_state (_output_port, _current_route->listening_via_monitor());
+	if (_current_stripable) {
+		get_button (Solo).set_led_state (_output_port, _current_stripable->solo_control()->soloed());
 	} else {
 		get_button (Solo).set_led_state (_output_port, false);
 	}
@@ -1261,9 +1251,9 @@ FaderPort::map_listen ()
 void
 FaderPort::map_recenable ()
 {
-	boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (_current_route);
+	boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (_current_stripable);
 	if (t) {
-		get_button (Rec).set_led_state (_output_port, t->record_enabled());
+		get_button (Rec).set_led_state (_output_port, t->rec_enable_control()->get_value());
 	} else {
 		get_button (Rec).set_led_state (_output_port, false);
 	}
@@ -1277,11 +1267,11 @@ FaderPort::map_gain ()
 		return;
 	}
 
-	if (!_current_route) {
+	if (!_current_stripable) {
 		return;
 	}
 
-	boost::shared_ptr<AutomationControl> control = _current_route->gain_control ();
+	boost::shared_ptr<AutomationControl> control = _current_stripable->gain_control ();
 	double val;
 
 	if (!control) {
@@ -1320,9 +1310,9 @@ FaderPort::map_gain ()
 }
 
 void
-FaderPort::map_route_state ()
+FaderPort::map_stripable_state ()
 {
-	if (!_current_route) {
+	if (!_current_stripable) {
 		stop_blinking (Mute);
 		stop_blinking (Solo);
 		get_button (Rec).set_led_state (_output_port, false);
@@ -1332,7 +1322,7 @@ FaderPort::map_route_state ()
 		map_gain ();
 		map_auto ();
 
-		if (_current_route == session->monitor_out()) {
+		if (_current_stripable == session->monitor_out()) {
 			map_cut ();
 		} else {
 			map_mute ();
diff --git a/libs/surfaces/faderport/faderport.h b/libs/surfaces/faderport/faderport.h
index 2706f91..4d5c970 100644
--- a/libs/surfaces/faderport/faderport.h
+++ b/libs/surfaces/faderport/faderport.h
@@ -164,9 +164,9 @@ class FaderPort : public ARDOUR::ControlProtocol, public AbstractUI<FaderPortReq
 	std::list<boost::shared_ptr<ARDOUR::Bundle> > bundles ();
 
   private:
-	boost::shared_ptr<ARDOUR::Route> _current_route;
-	boost::weak_ptr<ARDOUR::Route> pre_master_route;
-	boost::weak_ptr<ARDOUR::Route> pre_monitor_route;
+	boost::shared_ptr<ARDOUR::Stripable> _current_stripable;
+	boost::weak_ptr<ARDOUR::Stripable> pre_master_stripable;
+	boost::weak_ptr<ARDOUR::Stripable> pre_monitor_stripable;
 
 	boost::shared_ptr<ARDOUR::AsyncMIDIPort> _input_port;
 	boost::shared_ptr<ARDOUR::AsyncMIDIPort> _output_port;
@@ -294,17 +294,16 @@ class FaderPort : public ARDOUR::ControlProtocol, public AbstractUI<FaderPortReq
 	void start_blinking (ButtonID);
 	void stop_blinking (ButtonID);
 
-	void set_current_route (boost::shared_ptr<ARDOUR::Route>);
-	void drop_current_route ();
+	void set_current_stripable (boost::shared_ptr<ARDOUR::Stripable>);
+	void drop_current_stripable ();
 	void use_master ();
 	void use_monitor ();
-	void gui_track_selection_changed (ARDOUR::RouteNotificationListPtr);
+	void gui_track_selection_changed (ARDOUR::StripableNotificationListPtr);
 	PBD::ScopedConnection selection_connection;
-	PBD::ScopedConnectionList route_connections;
+	PBD::ScopedConnectionList stripable_connections;
 
-	void map_route_state ();
+	void map_stripable_state ();
 	void map_solo ();
-	void map_listen ();
 	void map_mute ();
 	bool rec_enable_state;
 	void map_recenable ();
diff --git a/libs/surfaces/faderport/gui.cc b/libs/surfaces/faderport/gui.cc
index f56512e..160ba0e 100644
--- a/libs/surfaces/faderport/gui.cc
+++ b/libs/surfaces/faderport/gui.cc
@@ -25,7 +25,7 @@
 #include "pbd/strsplit.h"
 #include "pbd/file_utils.h"
 
-#include "gtkmm2ext/actions.h"
+#include "gtkmm2ext/bindings.h"
 #include "gtkmm2ext/gtk_ui.h"
 #include "gtkmm2ext/gui_thread.h"
 #include "gtkmm2ext/utils.h"
@@ -36,7 +36,7 @@
 #include "faderport.h"
 #include "gui.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace PBD;
 using namespace ARDOUR;
@@ -357,12 +357,14 @@ FPGUI::build_available_action_menu ()
 	vector<string> labels;
 	vector<string> tooltips;
 	vector<string> keys;
-	vector<AccelKey> bindings;
+	vector<Glib::RefPtr<Gtk::Action> > actions;
+
+	Gtkmm2ext::ActionMap::get_all_actions (paths, labels, tooltips, keys, actions);
+
 	typedef std::map<string,TreeIter> NodeMap;
 	NodeMap nodes;
 	NodeMap::iterator r;
 
-	ActionManager::get_all_actions (labels, paths, tooltips, keys, bindings);
 
 	vector<string>::iterator k;
 	vector<string>::iterator p;
@@ -517,7 +519,7 @@ FPGUI::build_mix_action_combo (Gtk::ComboBox& cb, FaderPort::ButtonState bs)
 {
 	vector<pair<string,string> > actions;
 
-	actions.push_back (make_pair (string (_("Toggle Editor & Mixer Windows")), string (X_("Common/toggle-editor-mixer"))));
+	actions.push_back (make_pair (string (_("Toggle Editor & Mixer Windows")), string (X_("Common/toggle-editor-and-mixer"))));
 	actions.push_back (make_pair (string (_("Show/Hide Mixer list")), string (X_("Common/ToggleMixerList"))));
 	actions.push_back (make_pair (string("Toggle Meterbridge"), string(X_("Common/toggle-meterbridge"))));
 	actions.push_back (make_pair (string (_("Show/Hide Editor mixer strip")), string (X_("Editor/show-editor-mixer"))));
diff --git a/libs/surfaces/faderport/i18n.h b/libs/surfaces/faderport/i18n.h
deleted file mode 100644
index dcbbfcf..0000000
--- a/libs/surfaces/faderport/i18n.h
+++ /dev/null
@@ -1,16 +0,0 @@
-#ifndef __i18n_h__
-#define __i18n_h__
-
-#include "pbd/compose.h"
-#include "pbd/convert.h"
-#include "gettext.h"
-
-#include <vector>
-#include <string>
-
-#define _(Text)  dgettext (PACKAGE,Text)
-#define N_(Text) gettext_noop (Text)
-#define X_(Text) Text
-#define I18N(Array) PBD::internationalize (PACKAGE, Array)
-
-#endif // __i18n_h__
diff --git a/libs/surfaces/faderport/operations.cc b/libs/surfaces/faderport/operations.cc
index bb72794..ce6bb3e 100644
--- a/libs/surfaces/faderport/operations.cc
+++ b/libs/surfaces/faderport/operations.cc
@@ -22,6 +22,7 @@
 #include "ardour/pannable.h"
 #include "ardour/plugin_insert.h"
 #include "ardour/rc_configuration.h"
+#include "ardour/record_enable_control.h"
 #include "ardour/session.h"
 #include "ardour/track.h"
 #include "ardour/types.h"
@@ -60,8 +61,8 @@ FaderPort::right ()
 void
 FaderPort::read ()
 {
-	if (_current_route) {
-		boost::shared_ptr<AutomationControl> gain = _current_route->gain_control ();
+	if (_current_stripable) {
+		boost::shared_ptr<AutomationControl> gain = _current_stripable->gain_control ();
 		if (gain) {
 			gain->set_automation_state( (ARDOUR::AutoState) ARDOUR::Play );
 		}
@@ -71,8 +72,8 @@ FaderPort::read ()
 void
 FaderPort::write ()
 {
-	if (_current_route) {
-		boost::shared_ptr<AutomationControl> gain = _current_route->gain_control ();
+	if (_current_stripable) {
+		boost::shared_ptr<AutomationControl> gain = _current_stripable->gain_control ();
 		if (gain) {
 			gain->set_automation_state( (ARDOUR::AutoState) ARDOUR::Write );
 		}
@@ -82,8 +83,8 @@ FaderPort::write ()
 void
 FaderPort::touch ()
 {
-	if (_current_route) {
-		boost::shared_ptr<AutomationControl> gain = _current_route->gain_control ();
+	if (_current_stripable) {
+		boost::shared_ptr<AutomationControl> gain = _current_stripable->gain_control ();
 		if (gain) {
 			gain->set_automation_state( (ARDOUR::AutoState) ARDOUR::Touch );
 		}
@@ -93,8 +94,8 @@ FaderPort::touch ()
 void
 FaderPort::off ()
 {
-	if (_current_route) {
-		boost::shared_ptr<AutomationControl> gain = _current_route->gain_control ();
+	if (_current_stripable) {
+		boost::shared_ptr<AutomationControl> gain = _current_stripable->gain_control ();
 		if (gain) {
 			gain->set_automation_state( (ARDOUR::AutoState) ARDOUR::Off );
 		}
@@ -119,72 +120,60 @@ FaderPort::redo ()
 void
 FaderPort::mute ()
 {
-	if (!_current_route) {
+	if (!_current_stripable) {
 		return;
 	}
 
-	if (_current_route == session->monitor_out()) {
-		boost::shared_ptr<MonitorProcessor> mp = _current_route->monitor_control();
+	if (_current_stripable == session->monitor_out()) {
+		boost::shared_ptr<MonitorProcessor> mp = _current_stripable->monitor_control();
 		mp->set_cut_all (!mp->cut_all());
 		return;
 	}
 
-	boost::shared_ptr<RouteList> rl (new RouteList);
-	rl->push_back (_current_route);
-	session->set_mute (rl, !_current_route->muted());
+	_current_stripable->mute_control()->set_value (!_current_stripable->mute_control()->muted(), PBD::Controllable::UseGroup);
 }
 
 void
 FaderPort::solo ()
 {
-	if (!_current_route) {
+	if (!_current_stripable) {
 		return;
 	}
 
-	boost::shared_ptr<RouteList> rl (new RouteList);
-	rl->push_back (_current_route);
-
-	if (Config->get_solo_control_is_listen_control()) {
-		session->set_listen (rl, !_current_route->listening_via_monitor());
-	} else {
-		session->set_solo (rl, !_current_route->soloed());
-	}
+	_current_stripable->solo_control()->set_value (_current_stripable->solo_control()->soloed(), PBD::Controllable::UseGroup);
 }
 
 void
 FaderPort::rec_enable ()
 {
-	if (!_current_route) {
+	if (!_current_stripable) {
 		return;
 	}
 
-	boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track>(_current_route);
+	boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track>(_current_stripable);
 
 	if (!t) {
 		return;
 	}
 
-	boost::shared_ptr<RouteList> rl (new RouteList);
-	rl->push_back (_current_route);
-
-	session->set_record_enabled (rl, !t->record_enabled());
+	t->rec_enable_control()->set_value (!t->rec_enable_control()->get_value(), Controllable::UseGroup);
 }
 
 void
 FaderPort::use_master ()
 {
-	boost::shared_ptr<Route> r = session->master_out();
+	boost::shared_ptr<Stripable> r = session->master_out();
 	if (r) {
-		if (_current_route == r) {
-			r = pre_master_route.lock();
-			set_current_route (r);
+		if (_current_stripable == r) {
+			r = pre_master_stripable.lock();
+			set_current_stripable (r);
 			get_button(Output).set_led_state (_output_port, false);
 			blinkers.remove (Output);
 		} else {
-			if (_current_route != session->master_out() && _current_route != session->monitor_out()) {
-				pre_master_route = boost::weak_ptr<Route> (_current_route);
+			if (_current_stripable != session->master_out() && _current_stripable != session->monitor_out()) {
+				pre_master_stripable = boost::weak_ptr<Stripable> (_current_stripable);
 			}
-			set_current_route (r);
+			set_current_stripable (r);
 			get_button(Output).set_led_state (_output_port, true);
 			blinkers.remove (Output);
 		}
@@ -194,19 +183,19 @@ FaderPort::use_master ()
 void
 FaderPort::use_monitor ()
 {
-	boost::shared_ptr<Route> r = session->monitor_out();
+	boost::shared_ptr<Stripable> r = session->monitor_out();
 
 	if (r) {
-		if (_current_route == r) {
-			r = pre_monitor_route.lock();
-			set_current_route (r);
+		if (_current_stripable == r) {
+			r = pre_monitor_stripable.lock();
+			set_current_stripable (r);
 			get_button(Output).set_led_state (_output_port, false);
 			blinkers.remove (Output);
 		} else {
-			if (_current_route != session->master_out() && _current_route != session->monitor_out()) {
-				pre_monitor_route = boost::weak_ptr<Route> (_current_route);
+			if (_current_stripable != session->master_out() && _current_stripable != session->monitor_out()) {
+				pre_monitor_stripable = boost::weak_ptr<Stripable> (_current_stripable);
 			}
-			set_current_route (r);
+			set_current_stripable (r);
 			get_button(Output).set_led_state (_output_port, true);
 			blinkers.push_back (Output);
 		}
@@ -217,11 +206,17 @@ FaderPort::use_monitor ()
 void
 FaderPort::ardour_pan_azimuth (int delta)
 {
-	if (!_current_route) {
+	if (!_current_stripable) {
+		return;
+	}
+
+	boost::shared_ptr<Route> r = boost::dynamic_pointer_cast<Route> (_current_stripable);
+
+	if (!r) {
 		return;
 	}
 
-	boost::shared_ptr<Pannable> pannable = _current_route->pannable ();
+	boost::shared_ptr<Pannable> pannable = r->pannable ();
 
 	if (!pannable) {
 		return;
@@ -240,11 +235,17 @@ FaderPort::ardour_pan_azimuth (int delta)
 void
 FaderPort::ardour_pan_width(int delta)
 {
-	if (!_current_route) {
+	if (!_current_stripable) {
 		return;
 	}
 
-	boost::shared_ptr<Pannable> pannable = _current_route->pannable ();
+	boost::shared_ptr<Route> r = boost::dynamic_pointer_cast<Route> (_current_stripable);
+
+	if (!r) {
+		return;
+	}
+
+	boost::shared_ptr<Pannable> pannable = r->pannable ();
 
 	if (!pannable) {
 		return;
@@ -263,12 +264,18 @@ void
 FaderPort::mixbus_pan (int delta)
 {
 #ifdef MIXBUS
-	if (!_current_route) {
+	if (!_current_stripable) {
 		return;
 	}
+	boost::shared_ptr<Route> r = boost::dynamic_pointer_cast<Route> (_current_stripable);
+
+	if (!r) {
+		return;
+	}
+
 
 	const uint32_t port_channel_post_pan = 2; // gtk2_ardour/mixbus_ports.h
-	boost::shared_ptr<ARDOUR::PluginInsert> plug = _current_route->ch_post();
+	boost::shared_ptr<ARDOUR::PluginInsert> plug = r->ch_post();
 
 	if (!plug) {
 		return;
diff --git a/libs/surfaces/faderport/wscript b/libs/surfaces/faderport/wscript
index a0c3a2e..b13796d 100644
--- a/libs/surfaces/faderport/wscript
+++ b/libs/surfaces/faderport/wscript
@@ -26,7 +26,7 @@ def build(bld):
     obj.includes     = [ '.', './faderport']
     obj.name         = 'libardour_faderport'
     obj.target       = 'ardour_faderport'
-    obj.uselib       = 'GTKMM GTK GDK'
+    obj.uselib       = 'GTKMM GTK GDK XML'
     obj.use          = 'libardour libardour_cp libgtkmm2ext libpbd'
     obj.install_path = os.path.join(bld.env['LIBDIR'], 'surfaces')
 
diff --git a/libs/surfaces/frontier/tranzport/tranzport_control_protocol.cc b/libs/surfaces/frontier/tranzport/tranzport_control_protocol.cc
index f093287..5799ab6 100644
--- a/libs/surfaces/frontier/tranzport/tranzport_control_protocol.cc
+++ b/libs/surfaces/frontier/tranzport/tranzport_control_protocol.cc
@@ -67,7 +67,7 @@ using namespace std;
 using namespace sigc;
 using namespace PBD;
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 #include "pbd/abstract_ui.cc"
 
diff --git a/libs/surfaces/generic_midi/MSVCardour_genericmidi/ardour_genericmidi.vcproj b/libs/surfaces/generic_midi/MSVCardour_genericmidi/ardour_genericmidi.vcproj
index 860b5c4..189451d 100644
--- a/libs/surfaces/generic_midi/MSVCardour_genericmidi/ardour_genericmidi.vcproj
+++ b/libs/surfaces/generic_midi/MSVCardour_genericmidi/ardour_genericmidi.vcproj
@@ -41,8 +41,8 @@
 				Name="VCCLCompilerTool"
 				AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
 				Optimization="0"
-				AdditionalIncludeDirectories="..;..\..\..\ardour;..\..\..\pbd;..\..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\..\surfaces\control_protocol;..\..\..\gtkmm2ext;..\..\..\evoral;..\..\..\libltc;..\..\..\timecode;..\..\..\rubberband;"..\..\..\vamp-sdk";"..\..\..\midi++2";..\..\..\taglib;..\..\..\taglib\taglib;..\..\..\taglib\taglib\toolkit;..\..\..\audiographer;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor""
-				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;BUILDING_GENERICMIDI;ARDOURSURFACE_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_DEBUG;DEBUG="Debug";ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"ardour_genericmidi\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+				AdditionalIncludeDirectories="..;..\..\..\ardour;..\..\..\pbd;..\..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\..\surfaces\control_protocol;..\..\..\gtkmm2ext;..\..\..\evoral;..\..\..\libltc;..\..\..\timecode;..\..\..\rubberband;"..\..\..\vamp-sdk";"..\..\..\midi++2";..\..\..\taglib;..\..\..\taglib\taglib;..\..\..\taglib\taglib\toolkit;..\..\..\audiographer;..\..\..\lua;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor""
+				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;BUILDING_GENERICMIDI;ARDOURSURFACE_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_DEBUG;DEBUG="Debug";ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"ardour_genericmidi\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
 				MinimalRebuild="true"
 				RuntimeLibrary="3"
 				WarningLevel="3"
@@ -123,8 +123,8 @@
 				AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
 				Optimization="2"
 				InlineFunctionExpansion="1"
-				AdditionalIncludeDirectories="..;..\..\..\ardour;..\..\..\pbd;..\..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\..\surfaces\control_protocol;..\..\..\gtkmm2ext;..\..\..\evoral;..\..\..\libltc;..\..\..\timecode;..\..\..\rubberband;"..\..\..\vamp-sdk";"..\..\..\midi++2";..\..\..\taglib;..\..\..\taglib\taglib;..\..\..\taglib\taglib\toolkit;..\..\..\audiographer;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor""
-				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_GENERICMIDI;ARDOURSURFACE_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;NDEBUG;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"ardour_genericmidi\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+				AdditionalIncludeDirectories="..;..\..\..\ardour;..\..\..\pbd;..\..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\..\surfaces\control_protocol;..\..\..\gtkmm2ext;..\..\..\evoral;..\..\..\libltc;..\..\..\timecode;..\..\..\rubberband;"..\..\..\vamp-sdk";"..\..\..\midi++2";..\..\..\taglib;..\..\..\taglib\taglib;..\..\..\taglib\taglib\toolkit;..\..\..\audiographer;..\..\..\lua;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor""
+				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_GENERICMIDI;ARDOURSURFACE_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;NDEBUG;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"ardour_genericmidi\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
 				StringPooling="false"
 				RuntimeLibrary="2"
 				EnableEnhancedInstructionSet="1"
@@ -204,8 +204,8 @@
 				Name="VCCLCompilerTool"
 				AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
 				Optimization="0"
-				AdditionalIncludeDirectories="..;..\..\..\ardour;..\..\..\pbd;..\..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\..\surfaces\control_protocol;..\..\..\gtkmm2ext;..\..\..\evoral;..\..\..\libltc;..\..\..\timecode;..\..\..\rubberband;"..\..\..\vamp-sdk";"..\..\..\midi++2";..\..\..\taglib;..\..\..\taglib\taglib;..\..\..\taglib\taglib\toolkit;..\..\..\audiographer;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor""
-				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_GENERICMIDI;ARDOURSURFACE_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"ardour_genericmidi\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+				AdditionalIncludeDirectories="..;..\..\..\ardour;..\..\..\pbd;..\..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\..\surfaces\control_protocol;..\..\..\gtkmm2ext;..\..\..\evoral;..\..\..\libltc;..\..\..\timecode;..\..\..\rubberband;"..\..\..\vamp-sdk";"..\..\..\midi++2";..\..\..\taglib;..\..\..\taglib\taglib;..\..\..\taglib\taglib\toolkit;..\..\..\audiographer;..\..\..\lua;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor""
+				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_GENERICMIDI;ARDOURSURFACE_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"ardour_genericmidi\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
 				StringPooling="false"
 				RuntimeLibrary="2"
 				EnableEnhancedInstructionSet="1"
@@ -328,7 +328,7 @@
 			UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
 			>
 			<File
-				RelativePath="..\..\..\..\icons\win32\msvc_resources.rc"
+				RelativePath="..\..\..\..\gtk2_ardour\win32\msvc_resources.rc"
 				>
 			</File>
 		</Filter>
diff --git a/libs/surfaces/generic_midi/generic_midi_control_protocol.cc b/libs/surfaces/generic_midi/generic_midi_control_protocol.cc
index e319f65..d14a9ca 100644
--- a/libs/surfaces/generic_midi/generic_midi_control_protocol.cc
+++ b/libs/surfaces/generic_midi/generic_midi_control_protocol.cc
@@ -25,7 +25,6 @@
 #include <glibmm/fileutils.h>
 #include <glibmm/miscutils.h>
 
-#include "pbd/controllable_descriptor.h"
 #include "pbd/error.h"
 #include "pbd/failed_constructor.h"
 #include "pbd/file_utils.h"
@@ -37,9 +36,9 @@
 #include "ardour/async_midi_port.h"
 #include "ardour/audioengine.h"
 #include "ardour/audioengine.h"
+#include "ardour/controllable_descriptor.h"
 #include "ardour/filesystem_paths.h"
 #include "ardour/session.h"
-#include "ardour/route.h"
 #include "ardour/midi_ui.h"
 #include "ardour/rc_configuration.h"
 #include "ardour/midiport_manager.h"
@@ -54,7 +53,7 @@ using namespace ARDOUR;
 using namespace PBD;
 using namespace std;
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 #define midi_ui_context() MidiControlUI::instance() /* a UICallback-derived object that specifies the event loop for signal handling */
 
@@ -95,7 +94,7 @@ GenericMidiControlProtocol::GenericMidiControlProtocol (Session& s)
 
 	/* this one is cross-thread */
 
-	Route::RemoteControlIDChange.connect (*this, MISSING_INVALIDATOR, boost::bind (&GenericMidiControlProtocol::reset_controllables, this), midi_ui_context());
+	PresentationInfo::Change.connect (*this, MISSING_INVALIDATOR, boost::bind (&GenericMidiControlProtocol::reset_controllables, this), midi_ui_context());
 
 	/* Catch port connections and disconnections (cross-thread) */
 	ARDOUR::AudioEngine::instance()->PortConnectedOrDisconnected.connect (port_connection, MISSING_INVALIDATOR,
@@ -168,7 +167,7 @@ GenericMidiControlProtocol::reload_maps ()
 
 		MapInfo mi;
 
-		XMLProperty* prop = tree.root()->property ("name");
+		XMLProperty const * prop = tree.root()->property ("name");
 
 		if (!prop) {
 			continue;
@@ -329,9 +328,11 @@ GenericMidiControlProtocol::start_learning (Controllable* c)
 		for (MIDIPendingControllables::iterator i = pending_controllables.begin(); i != pending_controllables.end(); ) {
 			ptmp = i;
 			++ptmp;
-			if (((*i)->first)->get_controllable() == c) {
-				(*i)->second.disconnect();
-				delete (*i)->first;
+			if (((*i)->mc)->get_controllable() == c) {
+				if ((*i)->own_mc) {
+					delete (*i)->mc;
+				}
+				(*i)->connection.disconnect();
 				delete *i;
 				pending_controllables.erase (i);
 			}
@@ -340,6 +341,7 @@ GenericMidiControlProtocol::start_learning (Controllable* c)
 	}
 
 	MIDIControllable* mc = 0;
+	bool own_mc = false;
 
 	for (MIDIControllables::iterator i = controllables.begin(); i != controllables.end(); ++i) {
 		if ((*i)->get_controllable() && ((*i)->get_controllable()->id() == c->id())) {
@@ -350,14 +352,14 @@ GenericMidiControlProtocol::start_learning (Controllable* c)
 
 	if (!mc) {
 		mc = new MIDIControllable (this, *_input_port->parser(), *c, false);
+		own_mc = true;
 	}
 
 	{
 		Glib::Threads::Mutex::Lock lm (pending_lock);
 
-		MIDIPendingControllable* element = new MIDIPendingControllable;
-		element->first = mc;
-		c->LearningFinished.connect_same_thread (element->second, boost::bind (&GenericMidiControlProtocol::learning_stopped, this, mc));
+		MIDIPendingControllable* element = new MIDIPendingControllable (mc, own_mc);
+		c->LearningFinished.connect_same_thread (element->connection, boost::bind (&GenericMidiControlProtocol::learning_stopped, this, mc));
 
 		pending_controllables.push_back (element);
 	}
@@ -377,8 +379,8 @@ GenericMidiControlProtocol::learning_stopped (MIDIControllable* mc)
 		tmp = i;
 		++tmp;
 
-		if ( (*i)->first == mc) {
-			(*i)->second.disconnect();
+		if ( (*i)->mc == mc) {
+			(*i)->connection.disconnect();
 			delete *i;
 			pending_controllables.erase(i);
 		}
@@ -401,10 +403,10 @@ GenericMidiControlProtocol::stop_learning (Controllable* c)
 	*/
 
 	for (MIDIPendingControllables::iterator i = pending_controllables.begin(); i != pending_controllables.end(); ++i) {
-		if (((*i)->first)->get_controllable() == c) {
-			(*i)->first->stop_learning ();
-			dptr = (*i)->first;
-			(*i)->second.disconnect();
+		if (((*i)->mc)->get_controllable() == c) {
+			(*i)->mc->stop_learning ();
+			dptr = (*i)->mc;
+			(*i)->connection.disconnect();
 
 			delete *i;
 			pending_controllables.erase (i);
diff --git a/libs/surfaces/generic_midi/generic_midi_control_protocol.h b/libs/surfaces/generic_midi/generic_midi_control_protocol.h
index a453716..d3709c5 100644
--- a/libs/surfaces/generic_midi/generic_midi_control_protocol.h
+++ b/libs/surfaces/generic_midi/generic_midi_control_protocol.h
@@ -30,11 +30,11 @@
 
 namespace PBD {
 	class Controllable;
-	class ControllableDescriptor;
 }
 
 namespace ARDOUR {
 	class AsyncMIDIPort;
+	class ControllableDescriptor;
 	class MidiPort;
 	class Session;
 }
@@ -63,7 +63,7 @@ class GenericMidiControlProtocol : public ARDOUR::ControlProtocol {
 	int set_feedback (bool yn);
 	bool get_feedback () const;
 
-        boost::shared_ptr<PBD::Controllable> lookup_controllable (const PBD::ControllableDescriptor&) const;
+        boost::shared_ptr<PBD::Controllable> lookup_controllable (const ARDOUR::ControllableDescriptor&) const;
 
 	XMLNode& get_state ();
 	int set_state (const XMLNode&, int version);
@@ -125,7 +125,16 @@ class GenericMidiControlProtocol : public ARDOUR::ControlProtocol {
 	typedef std::list<MIDIAction*> MIDIActions;
 	MIDIActions actions;
 
-	typedef std::pair<MIDIControllable*,PBD::ScopedConnection> MIDIPendingControllable;
+	struct MIDIPendingControllable {
+		MIDIControllable* mc;
+		bool own_mc;
+		PBD::ScopedConnection connection;
+
+		MIDIPendingControllable (MIDIControllable* c, bool omc)
+			: mc (c)
+			, own_mc (omc)
+		{}
+	};
 	typedef std::list<MIDIPendingControllable* > MIDIPendingControllables;
 	MIDIPendingControllables pending_controllables;
         Glib::Threads::Mutex controllables_lock;
diff --git a/libs/surfaces/generic_midi/gmcp_gui.cc b/libs/surfaces/generic_midi/gmcp_gui.cc
index 8e861b3..3c2479b 100644
--- a/libs/surfaces/generic_midi/gmcp_gui.cc
+++ b/libs/surfaces/generic_midi/gmcp_gui.cc
@@ -41,7 +41,7 @@
 
 #include "generic_midi_control_protocol.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 class GMCPGUI : public Gtk::VBox
 {
diff --git a/libs/surfaces/generic_midi/i18n.h b/libs/surfaces/generic_midi/i18n.h
deleted file mode 100644
index dcbbfcf..0000000
--- a/libs/surfaces/generic_midi/i18n.h
+++ /dev/null
@@ -1,16 +0,0 @@
-#ifndef __i18n_h__
-#define __i18n_h__
-
-#include "pbd/compose.h"
-#include "pbd/convert.h"
-#include "gettext.h"
-
-#include <vector>
-#include <string>
-
-#define _(Text)  dgettext (PACKAGE,Text)
-#define N_(Text) gettext_noop (Text)
-#define X_(Text) Text
-#define I18N(Array) PBD::internationalize (PACKAGE, Array)
-
-#endif // __i18n_h__
diff --git a/libs/surfaces/generic_midi/midicontrollable.cc b/libs/surfaces/generic_midi/midicontrollable.cc
index 1051503..b42c9f7 100644
--- a/libs/surfaces/generic_midi/midicontrollable.cc
+++ b/libs/surfaces/generic_midi/midicontrollable.cc
@@ -23,7 +23,6 @@
 #include <iostream>
 
 #include "pbd/error.h"
-#include "pbd/controllable_descriptor.h"
 #include "pbd/xml++.h"
 #include "pbd/stacktrace.h"
 #include "pbd/compose.h"
@@ -34,6 +33,7 @@
 
 #include "ardour/async_midi_port.h"
 #include "ardour/automation_control.h"
+#include "ardour/controllable_descriptor.h"
 #include "ardour/midi_ui.h"
 #include "ardour/utils.h"
 #include "ardour/debug.h"
@@ -173,9 +173,9 @@ MIDIControllable::stop_learning ()
 int
 MIDIControllable::control_to_midi (float val)
 {
-        if (controllable->is_gain_like()) {
-                return gain_to_slider_position (val) * max_value_for_type ();
-        }
+	if (controllable->is_gain_like()) {
+		return gain_to_slider_position (val) * max_value_for_type ();
+	}
 
 	float control_min = controllable->lower ();
 	float control_max = controllable->upper ();
diff --git a/libs/surfaces/generic_midi/midicontrollable.h b/libs/surfaces/generic_midi/midicontrollable.h
index 8c14856..ebae2e9 100644
--- a/libs/surfaces/generic_midi/midicontrollable.h
+++ b/libs/surfaces/generic_midi/midicontrollable.h
@@ -30,7 +30,7 @@
 
 #include "ardour/types.h"
 
-namespace PBD {
+namespace ARDOUR {
 	class ControllableDescriptor;
 }
 
@@ -91,7 +91,7 @@ class MIDIControllable : public PBD::Stateful
 	void set_controllable (PBD::Controllable*);
 	const std::string& current_uri() const { return _current_uri; }
 
-	PBD::ControllableDescriptor& descriptor() const { return *_descriptor; }
+	ARDOUR::ControllableDescriptor& descriptor() const { return *_descriptor; }
 
 	std::string control_description() const { return _control_description; }
 
@@ -116,7 +116,7 @@ class MIDIControllable : public PBD::Stateful
 
 	GenericMidiControlProtocol* _surface;
 	PBD::Controllable* controllable;
-	PBD::ControllableDescriptor* _descriptor;
+	ARDOUR::ControllableDescriptor* _descriptor;
 	std::string     _current_uri;
         MIDI::Parser&   _parser;
 	bool             setting;
diff --git a/libs/surfaces/generic_midi/midifunction.cc b/libs/surfaces/generic_midi/midifunction.cc
index 1f3535f..3a60f53 100644
--- a/libs/surfaces/generic_midi/midifunction.cc
+++ b/libs/surfaces/generic_midi/midifunction.cc
@@ -167,7 +167,8 @@ MIDIFunction::execute ()
 		if (!_argument.empty()) {
 			uint32_t rid;
 			sscanf (_argument.c_str(), "%d", &rid);
-			_ui->SetRouteSelection (rid);
+			// XX fix me ... need to get stripable, not RID
+			//_ui->toggle_selection (rid, ARDOUR::PresentationInfo::Flag (ARDOUR::PresentationInfo::Route|ARDOUR::PresentationInfo::VCA));
 			DEBUG_TRACE (DEBUG::GenericMidi, string_compose ("Function: SetRouteSelection = %1\n", rid));
 		}
 		break;
diff --git a/libs/surfaces/generic_midi/wscript b/libs/surfaces/generic_midi/wscript
index 39a6814..167e1dd 100644
--- a/libs/surfaces/generic_midi/wscript
+++ b/libs/surfaces/generic_midi/wscript
@@ -29,7 +29,7 @@ def build(bld):
     obj.includes     = [ '.', './generic_midi']
     obj.name         = 'libardour_generic_midi'
     obj.target       = 'ardour_generic_midi'
-    obj.uselib       = 'GTKMM GTK GDK'
+    obj.uselib       = 'GTKMM GTK GDK XML'
     obj.use          = 'libardour libardour_cp libgtkmm2ext libpbd'
     obj.install_path = os.path.join(bld.env['LIBDIR'], 'surfaces')
 
diff --git a/libs/surfaces/mackie/MSVCardour_mackie/ardour_mackie.vcproj b/libs/surfaces/mackie/MSVCardour_mackie/ardour_mackie.vcproj
index a7ceed5..02e74cd 100644
--- a/libs/surfaces/mackie/MSVCardour_mackie/ardour_mackie.vcproj
+++ b/libs/surfaces/mackie/MSVCardour_mackie/ardour_mackie.vcproj
@@ -41,8 +41,8 @@
 				Name="VCCLCompilerTool"
 				AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
 				Optimization="0"
-				AdditionalIncludeDirectories="..;..\..\..\ardour;..\..\..\pbd;..\..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\..\surfaces\control_protocol;..\..\..\gtkmm2ext;..\..\..\evoral;..\..\..\libltc;..\..\..\timecode;..\..\..\rubberband;"..\..\..\vamp-sdk";"..\..\..\midi++2";..\..\..\taglib;..\..\..\taglib\taglib;..\..\..\taglib\taglib\toolkit;..\..\..\audiographer;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor""
-				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;BUILDING_ARDOURMACKIE;ARDOURSURFACE_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_DEBUG;DEBUG="Debug";ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"ardour_mackie\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+				AdditionalIncludeDirectories="..;..\..\..\ardour;..\..\..\pbd;..\..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\..\surfaces\control_protocol;..\..\..\gtkmm2ext;..\..\..\evoral;..\..\..\libltc;..\..\..\timecode;..\..\..\rubberband;"..\..\..\vamp-sdk";"..\..\..\midi++2";..\..\..\taglib;..\..\..\taglib\taglib;..\..\..\taglib\taglib\toolkit;..\..\..\audiographer;..\..\..\lua;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor""
+				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;BUILDING_ARDOURMACKIE;ARDOURSURFACE_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_DEBUG;DEBUG="Debug";ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"ardour_mackie\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
 				MinimalRebuild="true"
 				RuntimeLibrary="3"
 				WarningLevel="3"
@@ -123,8 +123,8 @@
 				AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
 				Optimization="2"
 				InlineFunctionExpansion="1"
-				AdditionalIncludeDirectories="..;..\..\..\ardour;..\..\..\pbd;..\..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\..\surfaces\control_protocol;..\..\..\gtkmm2ext;..\..\..\evoral;..\..\..\libltc;..\..\..\timecode;..\..\..\rubberband;"..\..\..\vamp-sdk";"..\..\..\midi++2";..\..\..\taglib;..\..\..\taglib\taglib;..\..\..\taglib\taglib\toolkit;..\..\..\audiographer;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor""
-				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_ARDOURMACKIE;ARDOURSURFACE_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;NDEBUG;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"ardour_mackie\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+				AdditionalIncludeDirectories="..;..\..\..\ardour;..\..\..\pbd;..\..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\..\surfaces\control_protocol;..\..\..\gtkmm2ext;..\..\..\evoral;..\..\..\libltc;..\..\..\timecode;..\..\..\rubberband;"..\..\..\vamp-sdk";"..\..\..\midi++2";..\..\..\taglib;..\..\..\taglib\taglib;..\..\..\taglib\taglib\toolkit;..\..\..\audiographer;..\..\..\lua;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor""
+				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_ARDOURMACKIE;ARDOURSURFACE_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;NDEBUG;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"ardour_mackie\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
 				StringPooling="false"
 				RuntimeLibrary="2"
 				EnableEnhancedInstructionSet="1"
@@ -204,8 +204,8 @@
 				Name="VCCLCompilerTool"
 				AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
 				Optimization="0"
-				AdditionalIncludeDirectories="..;..\..\..\ardour;..\..\..\pbd;..\..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\..\surfaces\control_protocol;..\..\..\gtkmm2ext;..\..\..\evoral;..\..\..\libltc;..\..\..\timecode;..\..\..\rubberband;"..\..\..\vamp-sdk";"..\..\..\midi++2";..\..\..\taglib;..\..\..\taglib\taglib;..\..\..\taglib\taglib\toolkit;..\..\..\audiographer;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor""
-				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_ARDOURMACKIE;ARDOURSURFACE_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"ardour_mackie\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+				AdditionalIncludeDirectories="..;..\..\..\ardour;..\..\..\pbd;..\..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\..\surfaces\control_protocol;..\..\..\gtkmm2ext;..\..\..\evoral;..\..\..\libltc;..\..\..\timecode;..\..\..\rubberband;"..\..\..\vamp-sdk";"..\..\..\midi++2";..\..\..\taglib;..\..\..\taglib\taglib;..\..\..\taglib\taglib\toolkit;..\..\..\audiographer;..\..\..\lua;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor""
+				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_ARDOURMACKIE;ARDOURSURFACE_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"ardour_mackie\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
 				StringPooling="false"
 				RuntimeLibrary="2"
 				EnableEnhancedInstructionSet="1"
@@ -456,7 +456,7 @@
 			UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
 			>
 			<File
-				RelativePath="..\..\..\..\icons\win32\msvc_resources.rc"
+				RelativePath="..\..\..\..\gtk2_ardour\win32\msvc_resources.rc"
 				>
 			</File>
 		</Filter>
diff --git a/libs/surfaces/mackie/device_info.cc b/libs/surfaces/mackie/device_info.cc
index d46937a..dfac991 100644
--- a/libs/surfaces/mackie/device_info.cc
+++ b/libs/surfaces/mackie/device_info.cc
@@ -31,7 +31,7 @@
 
 #include "device_info.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace PBD;
 using namespace ARDOUR;
diff --git a/libs/surfaces/mackie/device_profile.cc b/libs/surfaces/mackie/device_profile.cc
index f67aa3c..ca3f146 100644
--- a/libs/surfaces/mackie/device_profile.cc
+++ b/libs/surfaces/mackie/device_profile.cc
@@ -33,7 +33,7 @@
 #include "mackie_control_protocol.h"
 #include "device_profile.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace PBD;
 using namespace ARDOUR;
diff --git a/libs/surfaces/mackie/gui.cc b/libs/surfaces/mackie/gui.cc
index 5d9208b..0678619 100644
--- a/libs/surfaces/mackie/gui.cc
+++ b/libs/surfaces/mackie/gui.cc
@@ -34,6 +34,7 @@
 #include "pbd/stacktrace.h"
 
 #include "gtkmm2ext/actions.h"
+#include "gtkmm2ext/bindings.h"
 #include "gtkmm2ext/gui_thread.h"
 #include "gtkmm2ext/utils.h"
 
@@ -47,7 +48,7 @@
 #include "surface.h"
 #include "surface_port.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace Gtk;
@@ -451,12 +452,13 @@ MackieControlProtocolGUI::build_available_action_menu ()
 	vector<string> labels;
 	vector<string> tooltips;
 	vector<string> keys;
-	vector<AccelKey> bindings;
+	vector<Glib::RefPtr<Gtk::Action> > actions;
+
 	typedef std::map<string,TreeIter> NodeMap;
 	NodeMap nodes;
 	NodeMap::iterator r;
 
-	ActionManager::get_all_actions (labels, paths, tooltips, keys, bindings);
+	Gtkmm2ext::ActionMap::get_all_actions (paths, labels, tooltips, keys, actions);
 
 	vector<string>::iterator k;
 	vector<string>::iterator p;
@@ -466,8 +468,9 @@ MackieControlProtocolGUI::build_available_action_menu ()
 	available_action_model->clear ();
 
 	/* Because there are button bindings built in that are not
-	in the key binding map, there needs to be a way to undo
-	a profile edit. */
+	   in the key binding map, there needs to be a way to undo
+	   a profile edit.
+	*/
 	TreeIter rowp;
 	TreeModel::Row parent;
 	rowp = available_action_model->append();
diff --git a/libs/surfaces/mackie/gui.h b/libs/surfaces/mackie/gui.h
index 754c4ac..15d2666 100644
--- a/libs/surfaces/mackie/gui.h
+++ b/libs/surfaces/mackie/gui.h
@@ -33,7 +33,7 @@ namespace Gtk {
 
 #include "button.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 namespace ArdourSurface {
 
diff --git a/libs/surfaces/mackie/mackie_control_protocol.cc b/libs/surfaces/mackie/mackie_control_protocol.cc
index a898746..2ea61cc 100644
--- a/libs/surfaces/mackie/mackie_control_protocol.cc
+++ b/libs/surfaces/mackie/mackie_control_protocol.cc
@@ -52,6 +52,7 @@
 #include "ardour/panner.h"
 #include "ardour/panner_shell.h"
 #include "ardour/profile.h"
+#include "ardour/record_enable_control.h"
 #include "ardour/route.h"
 #include "ardour/route_group.h"
 #include "ardour/session.h"
@@ -59,6 +60,7 @@
 #include "ardour/track.h"
 #include "ardour/types.h"
 #include "ardour/audioengine.h"
+#include "ardour/vca_manager.h"
 
 #include "mackie_control_protocol.h"
 
@@ -81,7 +83,7 @@ using namespace Glib;
 using namespace ArdourSurface;
 using namespace Mackie;
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 #include "pbd/abstract_ui.cc" // instantiate template
 
@@ -136,7 +138,7 @@ MackieControlProtocol::MackieControlProtocol (Session& session)
 		_last_bank[i] = 0;
 	}
 
-	TrackSelectionChanged.connect (gui_connections, MISSING_INVALIDATOR, boost::bind (&MackieControlProtocol::gui_track_selection_changed, this, _1, true), this);
+	PresentationInfo::Change.connect (gui_connections, MISSING_INVALIDATOR, boost::bind (&MackieControlProtocol::notify_presentation_info_changed, this), this);
 
 	_instance = this;
 
@@ -210,7 +212,6 @@ MackieControlProtocol::ping_devices ()
 }
 
 // go to the previous track.
-// Assume that get_sorted_routes().size() > route_table.size()
 void
 MackieControlProtocol::prev_track()
 {
@@ -220,145 +221,128 @@ MackieControlProtocol::prev_track()
 }
 
 // go to the next track.
-// Assume that get_sorted_routes().size() > route_table.size()
 void
 MackieControlProtocol::next_track()
 {
-	Sorted sorted = get_sorted_routes();
+	Sorted sorted = get_sorted_stripables();
 	if (_current_initial_bank + n_strips() < sorted.size()) {
 		switch_banks (_current_initial_bank + 1);
 	}
 }
 
 bool
-MackieControlProtocol::route_is_locked_to_strip (boost::shared_ptr<Route> r) const
+MackieControlProtocol::stripable_is_locked_to_strip (boost::shared_ptr<Stripable> r) const
 {
 	for (Surfaces::const_iterator si = surfaces.begin(); si != surfaces.end(); ++si) {
-		if ((*si)->route_is_locked_to_strip (r)) {
+		if ((*si)->stripable_is_locked_to_strip (r)) {
 			return true;
 		}
 	}
 	return false;
 }
 
-// predicate for sort call in get_sorted_routes
-struct RouteByRemoteId
+// predicate for sort call in get_sorted_stripables
+struct StripableByPresentationOrder
 {
-	bool operator () (const boost::shared_ptr<Route> & a, const boost::shared_ptr<Route> & b) const
+	bool operator () (const boost::shared_ptr<Stripable> & a, const boost::shared_ptr<Stripable> & b) const
 	{
-		return a->remote_control_id() < b->remote_control_id();
+		return a->presentation_info().order() < b->presentation_info().order();
 	}
 
-	bool operator () (const Route & a, const Route & b) const
+	bool operator () (const Stripable & a, const Stripable & b) const
 	{
-		return a.remote_control_id() < b.remote_control_id();
+		return a.presentation_info().order() < b.presentation_info().order();
 	}
 
-	bool operator () (const Route * a, const Route * b) const
+	bool operator () (const Stripable * a, const Stripable * b) const
 	{
-		return a->remote_control_id() < b->remote_control_id();
+		return a->presentation_info().order() < b->presentation_info().order();
 	}
 };
 
 MackieControlProtocol::Sorted
-MackieControlProtocol::get_sorted_routes()
+MackieControlProtocol::get_sorted_stripables()
 {
 	Sorted sorted;
 
-	// fetch all routes
-	boost::shared_ptr<RouteList> routes = session->get_routes();
-	set<uint32_t> remote_ids;
+	// fetch all stripables
+	StripableList stripables;
 
-	// routes with remote_id 0 should never be added
-	// TODO verify this with ardour devs
-	// remote_ids.insert (0);
+	session->get_stripables (stripables);
 
-	// sort in remote_id order, and exclude master, control and hidden routes
-	// and any routes that are already set.
+	// sort in presentation order, and exclude master, control and hidden stripables
+	// and any stripables that are already set.
 
-	for (RouteList::iterator it = routes->begin(); it != routes->end(); ++it) {
+	for (StripableList::iterator it = stripables.begin(); it != stripables.end(); ++it) {
 
-		boost::shared_ptr<Route> route = *it;
+		boost::shared_ptr<Stripable> s = *it;
 
-		if (remote_ids.find (route->remote_control_id()) != remote_ids.end()) {
-			continue;
-		}
-
-		if (route->is_auditioner() || route->is_master() || route->is_monitor()) {
+		if (s->presentation_info().special()) {
 			continue;
 		}
 
 		/* don't include locked routes */
 
-		if (route_is_locked_to_strip(route)) {
+		if (stripable_is_locked_to_strip (s)) {
 			continue;
 		}
 
 		switch (_view_mode) {
 		case Mixer:
-			if (! is_hidden(route)) {
-				sorted.push_back (route);
-				remote_ids.insert (route->remote_control_id());
+			if (!s->presentation_info().hidden()) {
+				sorted.push_back (s);
 			}
 			break;
 		case AudioTracks:
-			if (is_audio_track(route) && !is_hidden(route)) {
-				sorted.push_back (route);
-				remote_ids.insert (route->remote_control_id());
+			if (is_audio_track(s) && !s->presentation_info().hidden()) {
+				sorted.push_back (s);
 			}
 			break;
 		case Busses:
 			if (Profile->get_mixbus()) {
 #ifdef MIXBUS
-				if (route->mixbus()) {
-					sorted.push_back (route);
-					remote_ids.insert (route->remote_control_id());
+				if (s->mixbus()) {
+					sorted.push_back (s);
 				}
 #endif
 			} else {
-				if (!is_track(route) && !is_hidden(route)) {
-					sorted.push_back (route);
-					remote_ids.insert (route->remote_control_id());
+				if (!is_track(s) && !s->presentation_info().hidden()) {
+					sorted.push_back (s);
 				}
 			}
 			break;
 		case MidiTracks:
-			if (is_midi_track(route) && !is_hidden(route)) {
-				sorted.push_back (route);
-				remote_ids.insert (route->remote_control_id());
+			if (is_midi_track(s) && !s->presentation_info().hidden()) {
+				sorted.push_back (s);
 			}
 			break;
 		case Plugins:
 			break;
 		case Auxes: // in ardour, for now aux and buss are same. for mixbus, "Busses" are mixbuses, "Auxes" are ardour buses
 #ifdef MIXBUS
-			if (!route->mixbus() && !is_track(route) && !is_hidden(route))
+			if (!s->mixbus() && !is_track() && !s->presentation_info().hidden())
 #else
-			if (!is_track(route) && !is_hidden(route))
+			if (!is_track(s) && !s->presentation_info().hidden())
 #endif
 			{
-				sorted.push_back (route);
-				remote_ids.insert (route->remote_control_id());
+				sorted.push_back (s);
 			}
 			break;
 		case Hidden: // Show all the tracks we have hidden
-			if (is_hidden(route)) {
+			if (s->presentation_info().hidden()) {
 				// maybe separate groups
-				sorted.push_back (route);
-				remote_ids.insert (route->remote_control_id());
+				sorted.push_back (s);
 			}
 			break;
 		case Selected: // For example: a group (this is USER)
-			if (selected(route) && !is_hidden(route)) {
-				sorted.push_back (route);
-				remote_ids.insert (route->remote_control_id());
+			if (s->presentation_info().selected() && !s->presentation_info().hidden()) {
+				sorted.push_back (s);
 			}
 			break;
 		}
-
 	}
 
-	sort (sorted.begin(), sorted.end(), RouteByRemoteId());
+	sort (sorted.begin(), sorted.end(), StripableByPresentationOrder());
 	return sorted;
 }
 
@@ -390,60 +374,68 @@ MackieControlProtocol::switch_banks (uint32_t initial, bool force)
 		return 0;
 	}
 
-	Sorted sorted = get_sorted_routes();
+	Sorted sorted = get_sorted_stripables();
 	uint32_t strip_cnt = n_strips (false); // do not include locked strips
 					       // in this count
 
-	if (initial >= sorted.size()) {
+	if (initial >= sorted.size() && !force) {
+		DEBUG_TRACE (DEBUG::MackieControl, string_compose ("bank target %1 exceeds route range %2\n",
+		                                                   _current_initial_bank, sorted.size()));
 		/* too high, we can't get there */
 		return -1;
 	}
 
 	if (sorted.size() <= strip_cnt && _current_initial_bank == 0 && !force) {
-		/* no banking - not enough routes to fill all strips and we're
+		/* no banking - not enough stripables to fill all strips and we're
 		 * not at the first one.
 		 */
+		DEBUG_TRACE (DEBUG::MackieControl, string_compose ("less routes (%1) than strips (%2) and we're at the end already (%3)\n",
+		                                                   sorted.size(), strip_cnt, _current_initial_bank));
 		return -1;
 	}
 
 	_current_initial_bank = initial;
 	_current_selected_track = -1;
 
-	// Map current bank of routes onto each surface(+strip)
+	// Map current bank of stripables onto each surface(+strip)
 
 	if (_current_initial_bank < sorted.size()) {
 
-		DEBUG_TRACE (DEBUG::MackieControl, string_compose ("switch to %1, %2, available routes %3 on %4 surfaces\n",
+		DEBUG_TRACE (DEBUG::MackieControl, string_compose ("switch to %1, %2, available stripables %3 on %4 surfaces\n",
 								   _current_initial_bank, strip_cnt, sorted.size(),
 								   surfaces.size()));
 
-		// link routes to strips
+		// link stripables to strips
 
 		Sorted::iterator r = sorted.begin() + _current_initial_bank;
 
 		for (Surfaces::iterator si = surfaces.begin(); si != surfaces.end(); ++si) {
-			vector<boost::shared_ptr<Route> > routes;
+			vector<boost::shared_ptr<Stripable> > stripables;
 			uint32_t added = 0;
 
-			DEBUG_TRACE (DEBUG::MackieControl, string_compose ("surface has %1 unlockedstrips\n", (*si)->n_strips (false)));
+			DEBUG_TRACE (DEBUG::MackieControl, string_compose ("surface has %1 unlocked strips\n", (*si)->n_strips (false)));
 
 			for (; r != sorted.end() && added < (*si)->n_strips (false); ++r, ++added) {
-				routes.push_back (*r);
+				stripables.push_back (*r);
 			}
 
-			DEBUG_TRACE (DEBUG::MackieControl, string_compose ("give surface %1 routes\n", routes.size()));
+			DEBUG_TRACE (DEBUG::MackieControl, string_compose ("give surface %1 stripables\n", stripables.size()));
 
-			(*si)->map_routes (routes);
+			(*si)->map_stripables (stripables);
 		}
 
 	} else {
+		/* all strips need to be reset */
+		DEBUG_TRACE (DEBUG::MackieControl, string_compose ("clear all strips, bank target %1  is outside route range %2\n",
+		                                                   _current_initial_bank, sorted.size()));
+		for (Surfaces::iterator si = surfaces.begin(); si != surfaces.end(); ++si) {
+			vector<boost::shared_ptr<Stripable> > stripables;
+			/* pass in an empty stripables list, so that all strips will be reset */
+			(*si)->map_stripables (stripables);
+		}
 		return -1;
 	}
 
-	/* make sure selection is correct */
-
-	_gui_track_selection_changed (&_last_selected_routes, false, false);
-
 	/* current bank has not been saved */
 	session->set_dirty();
 
@@ -650,7 +642,7 @@ MackieControlProtocol::device_ready ()
 {
 	DEBUG_TRACE (DEBUG::MackieControl, string_compose ("device ready init (active=%1)\n", active()));
 	update_surfaces ();
-	set_subview_mode (MackieControlProtocol::None, boost::shared_ptr<Route>());
+	set_subview_mode (MackieControlProtocol::None, boost::shared_ptr<Stripable>());
 	set_flip_mode (Normal);
 }
 
@@ -703,8 +695,10 @@ void
 MackieControlProtocol::connect_session_signals()
 {
 	// receive routes added
-	session->RouteAdded.connect(session_connections, MISSING_INVALIDATOR, boost::bind (&MackieControlProtocol::notify_route_added, this, _1), this);
-	session->RouteAddedOrRemoved.connect(session_connections, MISSING_INVALIDATOR, boost::bind (&MackieControlProtocol::notify_route_added_or_removed, this), this);
+	session->RouteAdded.connect(session_connections, MISSING_INVALIDATOR, boost::bind (&MackieControlProtocol::notify_routes_added, this, _1), this);
+	// receive VCAs added
+	session->vca_manager().VCAAdded.connect(session_connections, MISSING_INVALIDATOR, boost::bind (&MackieControlProtocol::notify_vca_added, this, _1), this);
+
 	// receive record state toggled
 	session->RecordStateChanged.connect(session_connections, MISSING_INVALIDATOR, boost::bind (&MackieControlProtocol::notify_record_state_changed, this), this);
 	// receive transport state changed
@@ -717,12 +711,8 @@ MackieControlProtocol::connect_session_signals()
 	session->SoloActive.connect(session_connections, MISSING_INVALIDATOR, boost::bind (&MackieControlProtocol::notify_solo_active_changed, this, _1), this);
 
 	// make sure remote id changed signals reach here
-	// see also notify_route_added
-	Sorted sorted = get_sorted_routes();
-
-	for (Sorted::iterator it = sorted.begin(); it != sorted.end(); ++it) {
-		(*it)->RemoteControlIDChanged.connect (route_connections, MISSING_INVALIDATOR, boost::bind (&MackieControlProtocol::notify_remote_id_changed, this), this);
-	}
+	// see also notify_stripable_added
+	Sorted sorted = get_sorted_stripables();
 }
 
 void
@@ -867,7 +857,7 @@ MackieControlProtocol::create_surfaces ()
 			XMLNode* this_device = 0;
 			XMLNodeList const& devices = configuration_state->children();
 			for (XMLNodeList::const_iterator d = devices.begin(); d != devices.end(); ++d) {
-				XMLProperty* prop = (*d)->property (X_("name"));
+				XMLProperty const * prop = (*d)->property (X_("name"));
 				if (prop && prop->value() == _device_info.name()) {
 					this_device = *d;
 					break;
@@ -965,7 +955,7 @@ MackieControlProtocol::close()
 {
 	port_connection.disconnect ();
 	session_connections.drop_connections ();
-	route_connections.drop_connections ();
+	stripable_connections.drop_connections ();
 	periodic_connection.disconnect ();
 
 	clear_surfaces();
@@ -1239,7 +1229,7 @@ void MackieControlProtocol::notify_parameter_changed (std::string const & p)
 }
 
 void
-MackieControlProtocol::notify_route_added_or_removed ()
+MackieControlProtocol::notify_stripable_removed ()
 {
 	Glib::Threads::Mutex::Lock lm (surfaces_lock);
 	for (Surfaces::iterator s = surfaces.begin(); s != surfaces.end(); ++s) {
@@ -1247,9 +1237,15 @@ MackieControlProtocol::notify_route_added_or_removed ()
 	}
 }
 
-// RouteList is the set of routes that have just been added
 void
-MackieControlProtocol::notify_route_added (ARDOUR::RouteList & rl)
+MackieControlProtocol::notify_vca_added (ARDOUR::VCAList& vl)
+{
+	refresh_current_bank ();
+}
+
+// RouteList is the set of Routes that have just been added
+void
+MackieControlProtocol::notify_routes_added (ARDOUR::RouteList & rl)
 {
 	{
 		Glib::Threads::Mutex::Lock lm (surfaces_lock);
@@ -1274,13 +1270,6 @@ MackieControlProtocol::notify_route_added (ARDOUR::RouteList & rl)
 	refresh_current_bank();
 
 	// otherwise route added, but current bank needs no updating
-
-	// make sure remote id changes in the new route are handled
-	typedef ARDOUR::RouteList ARS;
-
-	for (ARS::iterator it = rl.begin(); it != rl.end(); ++it) {
-		(*it)->RemoteControlIDChanged.connect (route_connections, MISSING_INVALIDATOR, boost::bind (&MackieControlProtocol::notify_remote_id_changed, this), this);
-	}
 }
 
 void
@@ -1308,7 +1297,7 @@ MackieControlProtocol::notify_solo_active_changed (bool active)
 }
 
 void
-MackieControlProtocol::notify_remote_id_changed()
+MackieControlProtocol::notify_presentation_info_changed ()
 {
 	{
 		Glib::Threads::Mutex::Lock lm (surfaces_lock);
@@ -1318,7 +1307,7 @@ MackieControlProtocol::notify_remote_id_changed()
 		}
 	}
 
-	Sorted sorted = get_sorted_routes();
+	Sorted sorted = get_sorted_stripables();
 	uint32_t sz = n_strips();
 
 	// if a remote id has been moved off the end, we need to shift
@@ -1641,7 +1630,7 @@ MackieControlProtocol::midi_input_handler (IOCondition ioc, MIDI::Port* port)
 
 	if (ioc & IO_IN) {
 
-		DEBUG_TRACE (DEBUG::MackieControl, string_compose ("something happend on  %1\n", port->name()));
+		// DEBUG_TRACE (DEBUG::MackieControl, string_compose ("something happend on  %1\n", port->name()));
 
 		/* Devices using regular JACK MIDI ports will need to have
 		   the x-thread FIFO drained to avoid burning endless CPU.
@@ -1658,7 +1647,7 @@ MackieControlProtocol::midi_input_handler (IOCondition ioc, MIDI::Port* port)
 			}
 		}
 
-		DEBUG_TRACE (DEBUG::MackieControl, string_compose ("data available on %1\n", port->name()));
+		// DEBUG_TRACE (DEBUG::MackieControl, string_compose ("data available on %1\n", port->name()));
 		framepos_t now = session->engine().sample_time();
 		port->parse (now);
 	}
@@ -1676,15 +1665,15 @@ MackieControlProtocol::clear_ports ()
 }
 
 void
-MackieControlProtocol::notify_subview_route_deleted ()
+MackieControlProtocol::notify_subview_stripable_deleted ()
 {
 	/* return to global/mixer view */
-	_subview_route.reset ();
+	_subview_stripable.reset ();
 	set_view_mode (Mixer);
 }
 
 bool
-MackieControlProtocol::subview_mode_would_be_ok (SubViewMode mode, boost::shared_ptr<Route> r)
+MackieControlProtocol::subview_mode_would_be_ok (SubViewMode mode, boost::shared_ptr<Stripable> r)
 {
 	switch (mode) {
 	case None:
@@ -1737,16 +1726,18 @@ MackieControlProtocol::redisplay_subview_mode ()
 }
 
 int
-MackieControlProtocol::set_subview_mode (SubViewMode sm, boost::shared_ptr<Route> r)
+MackieControlProtocol::set_subview_mode (SubViewMode sm, boost::shared_ptr<Stripable> r)
 {
+	DEBUG_TRACE (DEBUG::MackieControl, string_compose ("set subview mode %1 with stripable %2, current flip mode %3\n", sm, (r ? r->name() : string ("null")), _flip_mode));
+
 	if (_flip_mode != Normal) {
 		set_flip_mode (Normal);
 	}
 
-	boost::shared_ptr<Route> old_route = _subview_route;
-
 	if (!subview_mode_would_be_ok (sm, r)) {
 
+		DEBUG_TRACE (DEBUG::MackieControl, "subview mode not OK\n");
+
 		if (r) {
 
 			Glib::Threads::Mutex::Lock lm (surfaces_lock);
@@ -1787,21 +1778,19 @@ MackieControlProtocol::set_subview_mode (SubViewMode sm, boost::shared_ptr<Route
 		return -1;
 	}
 
-	_subview_mode = sm;
+	boost::shared_ptr<Stripable> old_stripable = _subview_stripable;
 
-	if (r) {
-		/* retain _subview_route even if it is reset to null implicitly */
-		_subview_route = r;
-	}
+	_subview_mode = sm;
+	_subview_stripable = r;
 
-	if (r != old_route) {
-		subview_route_connections.drop_connections ();
+	if (_subview_stripable != old_stripable) {
+		subview_stripable_connections.drop_connections ();
 
-		/* Catch the current subview route going away */
-		if (_subview_route) {
-			_subview_route->DropReferences.connect (subview_route_connections, MISSING_INVALIDATOR,
-			                                        boost::bind (&MackieControlProtocol::notify_subview_route_deleted, this),
-			                                        this);
+		/* Catch the current subview stripable going away */
+		if (_subview_stripable) {
+			_subview_stripable->DropReferences.connect (subview_stripable_connections, MISSING_INVALIDATOR,
+			                                            boost::bind (&MackieControlProtocol::notify_subview_stripable_deleted, this),
+			                                            this);
 		}
 	}
 
@@ -1872,7 +1861,7 @@ MackieControlProtocol::set_view_mode (ViewMode m)
 	}
 
 	/* leave subview mode, whatever it was */
-	set_subview_mode (None, boost::shared_ptr<Route>());
+	set_subview_mode (None, boost::shared_ptr<Stripable>());
 	display_view_mode ();
 }
 
@@ -1907,17 +1896,17 @@ MackieControlProtocol::set_flip_mode (FlipMode fm)
 void
 MackieControlProtocol::set_master_on_surface_strip (uint32_t surface, uint32_t strip_number)
 {
-	force_special_route_to_strip (session->master_out(), surface, strip_number);
+	force_special_stripable_to_strip (session->master_out(), surface, strip_number);
 }
 
 void
 MackieControlProtocol::set_monitor_on_surface_strip (uint32_t surface, uint32_t strip_number)
 {
-	force_special_route_to_strip (session->monitor_out(), surface, strip_number);
+	force_special_stripable_to_strip (session->monitor_out(), surface, strip_number);
 }
 
 void
-MackieControlProtocol::force_special_route_to_strip (boost::shared_ptr<Route> r, uint32_t surface, uint32_t strip_number)
+MackieControlProtocol::force_special_stripable_to_strip (boost::shared_ptr<Stripable> r, uint32_t surface, uint32_t strip_number)
 {
 	if (!r) {
 		return;
@@ -1929,7 +1918,7 @@ MackieControlProtocol::force_special_route_to_strip (boost::shared_ptr<Route> r,
 		if ((*s)->number() == surface) {
 			Strip* strip = (*s)->nth_strip (strip_number);
 			if (strip) {
-				strip->set_route (session->master_out());
+				strip->set_stripable (session->master_out());
 				strip->lock_controls ();
 			}
 		}
@@ -1937,73 +1926,11 @@ MackieControlProtocol::force_special_route_to_strip (boost::shared_ptr<Route> r,
 }
 
 void
-MackieControlProtocol::gui_track_selection_changed (ARDOUR::RouteNotificationListPtr rl, bool save_list)
-{
-	_gui_track_selection_changed (rl.get(), save_list, true);
-}
-
-void
-MackieControlProtocol::_gui_track_selection_changed (ARDOUR::RouteNotificationList* rl, bool save_list, bool gui_selection_did_change)
-{
-	/* We need to keep a list of the most recently selected routes around,
-	   but we are not allowed to keep shared_ptr<Route> unless we want to
-	   handle the complexities of route deletion. So instead, the GUI sends
-	   us a notification using weak_ptr<Route>, which we keep a copy
-	   of. For efficiency's sake, however, we convert the weak_ptr's into
-	   shared_ptr<Route> before passing them to however many surfaces (and
-	   thus strips) that we have.
-	*/
-
-	StrongRouteNotificationList srl;
-
-	for (ARDOUR::RouteNotificationList::const_iterator i = rl->begin(); i != rl->end(); ++i) {
-		boost::shared_ptr<ARDOUR::Route> r = (*i).lock();
-		if (r) {
-			srl.push_back (r);
-		}
-	}
-
-	{
-		Glib::Threads::Mutex::Lock lm (surfaces_lock);
-
-		for (Surfaces::iterator s = surfaces.begin(); s != surfaces.end(); ++s) {
-			(*s)->gui_selection_changed (srl);
-		}
-	}
-
-	if (save_list) {
-		_last_selected_routes = *rl;
-	}
-
-	if (gui_selection_did_change) {
-
-		check_fader_automation_state ();
-
-		/* note: this method is also called when we switch banks.
-		 * But ... we don't allow bank switching when in subview mode.
-		 *
-		 * so .. we only have to care about subview mode if the
-		 * GUI selection has changed.
-		 *
-		 * It is possible that first_selected_route() may return null if we
-		 * are no longer displaying/mapping that route. In that case,
-		 * we will exit subview mode. If first_selected_route() is
-		 * null, and subview mode is not None, then the first call to
-		 * set_subview_mode() will fail, and we will reset to None.
-		 */
-
-		if (set_subview_mode (_subview_mode, first_selected_route())) {
-			set_subview_mode (None, boost::shared_ptr<Route>());
-		}
-	}
-}
-
-void
 MackieControlProtocol::check_fader_automation_state ()
 {
 	fader_automation_connections.drop_connections ();
 
-	boost::shared_ptr<Route> r = first_selected_route ();
+	boost::shared_ptr<Stripable> r = first_selected_stripable ();
 
 	if (!r) {
 		update_global_button (Button::Read, off);
@@ -2026,7 +1953,7 @@ MackieControlProtocol::check_fader_automation_state ()
 void
 MackieControlProtocol::update_fader_automation_state ()
 {
-	boost::shared_ptr<Route> r = first_selected_route ();
+	boost::shared_ptr<Stripable> r = first_selected_stripable ();
 
 	if (!r) {
 		update_global_button (Button::Read, off);
@@ -2100,24 +2027,31 @@ MackieControlProtocol::remove_down_select_button (int surface, int strip)
 }
 
 void
-MackieControlProtocol::select_range ()
+MackieControlProtocol::select_range (uint32_t pressed)
 {
-	RouteList routes;
+	StripableList stripables;
+
+	pull_stripable_range (_down_select_buttons, stripables, pressed);
 
-	pull_route_range (_down_select_buttons, routes);
+	DEBUG_TRACE (DEBUG::MackieControl, string_compose ("select range: found %1 stripables, first = %2\n", stripables.size(), stripables.front()->name()));
 
-	DEBUG_TRACE (DEBUG::MackieControl, string_compose ("select range: found %1 routes\n", routes.size()));
+	if (stripables.empty()) {
+		return;
+	}
 
-	if (!routes.empty()) {
-		for (RouteList::iterator r = routes.begin(); r != routes.end(); ++r) {
+	if (stripables.size() == 1 && ControlProtocol::last_selected().size() == 1 && stripables.front()->presentation_info().selected()) {
+		/* cancel selection for one and only selected stripable */
+		ToggleStripableSelection (stripables.front());
+	} else {
+		for (StripableList::iterator s = stripables.begin(); s != stripables.end(); ++s) {
 
 			if (main_modifier_state() == MODIFIER_SHIFT) {
-				ToggleRouteSelection ((*r)->remote_control_id ());
+				ToggleStripableSelection (*s);
 			} else {
-				if (r == routes.begin()) {
-					SetRouteSelection ((*r)->remote_control_id());
+				if (s == stripables.begin()) {
+					SetStripableSelection (*s);
 				} else {
-					AddRouteToSelection ((*r)->remote_control_id());
+					AddStripableToSelection (*s);
 				}
 			}
 		}
@@ -2159,10 +2093,10 @@ MackieControlProtocol::remove_down_button (AutomationType a, int surface, int st
 }
 
 MackieControlProtocol::ControlList
-MackieControlProtocol::down_controls (AutomationType p)
+MackieControlProtocol::down_controls (AutomationType p, uint32_t pressed)
 {
 	ControlList controls;
-	RouteList routes;
+	StripableList stripables;
 
 	DownButtonMap::iterator m = _down_buttons.find (p);
 
@@ -2173,29 +2107,29 @@ MackieControlProtocol::down_controls (AutomationType p)
 	DEBUG_TRACE (DEBUG::MackieControl, string_compose ("looking for down buttons for %1, got %2\n",
 							   p, m->second.size()));
 
-	pull_route_range (m->second, routes);
+	pull_stripable_range (m->second, stripables, pressed);
 
 	switch (p) {
 	case GainAutomation:
-		for (RouteList::iterator r = routes.begin(); r != routes.end(); ++r) {
-			controls.push_back ((*r)->gain_control());
+		for (StripableList::iterator s = stripables.begin(); s != stripables.end(); ++s) {
+			controls.push_back ((*s)->gain_control());
 		}
 		break;
 	case SoloAutomation:
-		for (RouteList::iterator r = routes.begin(); r != routes.end(); ++r) {
-			controls.push_back ((*r)->solo_control());
+		for (StripableList::iterator s = stripables.begin(); s != stripables.end(); ++s) {
+			controls.push_back ((*s)->solo_control());
 		}
 		break;
 	case MuteAutomation:
-		for (RouteList::iterator r = routes.begin(); r != routes.end(); ++r) {
-			controls.push_back ((*r)->mute_control());
+		for (StripableList::iterator s = stripables.begin(); s != stripables.end(); ++s) {
+			controls.push_back ((*s)->mute_control());
 		}
 		break;
 	case RecEnableAutomation:
-		for (RouteList::iterator r = routes.begin(); r != routes.end(); ++r) {
-			boost::shared_ptr<Track> trk = boost::dynamic_pointer_cast<Track> (*r);
-			if (trk) {
-				controls.push_back (trk->rec_enable_control());
+		for (StripableList::iterator s = stripables.begin(); s != stripables.end(); ++s) {
+			boost::shared_ptr<AutomationControl> ac = (*s)->rec_enable_control();
+			if (ac) {
+				controls.push_back (ac);
 			}
 		}
 		break;
@@ -2216,7 +2150,7 @@ struct ButtonRangeSorter {
 };
 
 void
-MackieControlProtocol::pull_route_range (DownButtonList& down, RouteList& selected)
+MackieControlProtocol::pull_stripable_range (DownButtonList& down, StripableList& selected, uint32_t pressed)
 {
 	ButtonRangeSorter cmp;
 
@@ -2266,13 +2200,19 @@ MackieControlProtocol::pull_route_range (DownButtonList& down, RouteList& select
 									   (*s)->number(), fs, ls));
 
 			for (uint32_t n = fs; n < ls; ++n) {
-				boost::shared_ptr<Route> r = (*s)->nth_strip (n)->route();
+				Strip* strip = (*s)->nth_strip (n);
+				boost::shared_ptr<Stripable> r = strip->stripable();
 				if (r) {
-					selected.push_back (r);
+					if (global_index_locked (*strip) == pressed) {
+						selected.push_front (r);
+					} else {
+						selected.push_back (r);
+					}
 				}
 			}
 		}
 	}
+
 }
 
 void
@@ -2396,97 +2336,97 @@ MackieControlProtocol::connection_handler (boost::weak_ptr<ARDOUR::Port> wp1, st
 }
 
 bool
-MackieControlProtocol::is_track (boost::shared_ptr<Route> r) const
+MackieControlProtocol::is_track (boost::shared_ptr<Stripable> r) const
 {
 	return boost::dynamic_pointer_cast<Track>(r) != 0;
 }
 
 bool
-MackieControlProtocol::is_audio_track (boost::shared_ptr<Route> r) const
+MackieControlProtocol::is_audio_track (boost::shared_ptr<Stripable> r) const
 {
 	return boost::dynamic_pointer_cast<AudioTrack>(r) != 0;
 }
 
 bool
-MackieControlProtocol::is_midi_track (boost::shared_ptr<Route> r) const
+MackieControlProtocol::is_midi_track (boost::shared_ptr<Stripable> r) const
 {
 	return boost::dynamic_pointer_cast<MidiTrack>(r) != 0;
 }
 
 bool
-MackieControlProtocol::selected (boost::shared_ptr<Route> r) const
+MackieControlProtocol::is_mapped (boost::shared_ptr<Stripable> r) const
 {
-	const RouteNotificationList* rl = &_last_selected_routes;
+	Glib::Threads::Mutex::Lock lm (surfaces_lock);
 
-	for (ARDOUR::RouteNotificationList::const_iterator i = rl->begin(); i != rl->end(); ++i) {
-		boost::shared_ptr<ARDOUR::Route> rt = (*i).lock();
-		if (rt == r) {
+	for (Surfaces::const_iterator s = surfaces.begin(); s != surfaces.end(); ++s) {
+		if ((*s)->stripable_is_mapped (r)) {
 			return true;
 		}
 	}
+
 	return false;
 }
 
-bool
-MackieControlProtocol::is_hidden (boost::shared_ptr<Route> r) const
+void
+MackieControlProtocol::update_selected (boost::shared_ptr<Stripable> s, bool became_selected)
 {
-	if (!r) {
-		return false;
-	}
-	return (((r->remote_control_id()) >>31) != 0);
-}
+	if (became_selected) {
 
-bool
-MackieControlProtocol::is_mapped (boost::shared_ptr<Route> r) const
-{
-	Glib::Threads::Mutex::Lock lm (surfaces_lock);
+		check_fader_automation_state ();
 
-	for (Surfaces::const_iterator s = surfaces.begin(); s != surfaces.end(); ++s) {
-		if ((*s)->route_is_mapped (r)) {
-			return true;
+		/* It is possible that first_selected_route() may return null if we
+		 * are no longer displaying/mapping that route. In that case,
+		 * we will exit subview mode. If first_selected_route() is
+		 * null, and subview mode is not None, then the first call to
+		 * set_subview_mode() will fail, and we will reset to None.
+		 */
+
+		if (set_subview_mode (_subview_mode, first_selected_stripable())) {
+			set_subview_mode (None, boost::shared_ptr<Stripable>());
 		}
-	}
 
-	return false;
+	}
 }
 
-boost::shared_ptr<Route>
-MackieControlProtocol::first_selected_route () const
+boost::shared_ptr<Stripable>
+MackieControlProtocol::first_selected_stripable () const
 {
-	if (_last_selected_routes.empty()) {
-		return boost::shared_ptr<Route>();
-	}
+	boost::shared_ptr<Stripable> s = ControlProtocol::first_selected_stripable();
 
-	boost::shared_ptr<Route> r = _last_selected_routes.front().lock();
-
-	if (r) {
+	if (s) {
 		/* check it is on one of our surfaces */
 
-		if (is_mapped (r)) {
-			return r;
+		if (is_mapped (s)) {
+			return s;
 		}
 
-		/* route is not mapped. thus, the currently selected route is
+		/* stripable is not mapped. thus, the currently selected stripable is
 		 * not on the surfaces, and so from our perspective, there is
-		 * no currently selected route.
+		 * no currently selected stripable.
 		 */
 
-		r.reset ();
+		s.reset ();
 	}
 
-	return r; /* may be null */
+	return s; /* may be null */
 }
 
-boost::shared_ptr<Route>
-MackieControlProtocol::subview_route () const
+boost::shared_ptr<Stripable>
+MackieControlProtocol::subview_stripable () const
 {
-	return _subview_route;
+	return _subview_stripable;
 }
 
 uint32_t
 MackieControlProtocol::global_index (Strip& strip)
 {
 	Glib::Threads::Mutex::Lock lm (surfaces_lock);
+	return global_index_locked (strip);
+}
+
+uint32_t
+MackieControlProtocol::global_index_locked (Strip& strip)
+{
 	uint32_t global = 0;
 
 	for (Surfaces::const_iterator s = surfaces.begin(); s != surfaces.end(); ++s) {
@@ -2513,7 +2453,7 @@ MackieControlProtocol::request_factory (uint32_t num_requests)
 void
 MackieControlProtocol::set_automation_state (AutoState as)
 {
-	boost::shared_ptr<Route> r = first_selected_route ();
+	boost::shared_ptr<Stripable> r = first_selected_stripable ();
 
 	if (!r) {
 		return;
diff --git a/libs/surfaces/mackie/mackie_control_protocol.h b/libs/surfaces/mackie/mackie_control_protocol.h
index 667f0c3..8d63162 100644
--- a/libs/surfaces/mackie/mackie_control_protocol.h
+++ b/libs/surfaces/mackie/mackie_control_protocol.h
@@ -63,26 +63,6 @@ namespace Mackie {
 
 gboolean ipmidi_input_handler (GIOChannel*, GIOCondition condition, void *data);
 
-/**
-	This handles the plugin duties, and the midi encoding and decoding,
-	and the signal callbacks, mostly from ARDOUR::Route.
-
-	The model of the control surface is handled by classes in controls.h
-
-	What happens is that each strip on the control surface has
-	a corresponding route in ControlProtocol::route_table. When
-	an incoming midi message is signaled, the correct route
-	is looked up, and the relevant changes made to it.
-
-	For each route currently in route_table, there's a RouteSignal object
-	which encapsulates the signals that indicate that there are changes
-	to be sent to the surface. The signals are handled by this class.
-
-	Calls to signal handlers pass a Route object which is used to look
-	up the relevant Strip in Surface. Then the state is retrieved from
-	the Route and encoded as the correct midi message.
-*/
-
 struct MackieControlUIRequest : public BaseUI::BaseRequestObject {
 public:
 	MackieControlUIRequest () {}
@@ -150,25 +130,24 @@ class MackieControlProtocol
 	FlipMode flip_mode () const { return _flip_mode; }
 	ViewMode view_mode () const { return _view_mode; }
 	SubViewMode subview_mode () const { return _subview_mode; }
-	static bool subview_mode_would_be_ok (SubViewMode, boost::shared_ptr<ARDOUR::Route>);
-	boost::shared_ptr<ARDOUR::Route> subview_route() const;
+	static bool subview_mode_would_be_ok (SubViewMode, boost::shared_ptr<ARDOUR::Stripable>);
+	boost::shared_ptr<ARDOUR::Stripable> subview_stripable() const;
 	bool zoom_mode () const { return modifier_state() & MODIFIER_ZOOM; }
 	bool     metering_active () const { return _metering_active; }
 
-	bool is_track (boost::shared_ptr<ARDOUR::Route>) const;
-	bool is_audio_track (boost::shared_ptr<ARDOUR::Route>) const;
-	bool is_midi_track (boost::shared_ptr<ARDOUR::Route>) const;
-	bool selected (boost::shared_ptr<ARDOUR::Route>) const;
-	bool is_hidden (boost::shared_ptr<ARDOUR::Route>) const;
-	bool is_mapped (boost::shared_ptr<ARDOUR::Route>) const;
-	boost::shared_ptr<ARDOUR::Route> first_selected_route () const;
+	bool is_track (boost::shared_ptr<ARDOUR::Stripable>) const;
+	bool is_audio_track (boost::shared_ptr<ARDOUR::Stripable>) const;
+	bool is_midi_track (boost::shared_ptr<ARDOUR::Stripable>) const;
+	bool is_mapped (boost::shared_ptr<ARDOUR::Stripable>) const;
+	boost::shared_ptr<ARDOUR::Stripable> first_selected_stripable () const;
+	void update_selected (boost::shared_ptr<ARDOUR::Stripable>, bool selected);
 
 	void check_fader_automation_state ();
 	void update_fader_automation_state ();
 	void set_automation_state (ARDOUR::AutoState);
 
 	void set_view_mode (ViewMode);
-	int set_subview_mode (SubViewMode, boost::shared_ptr<ARDOUR::Route>);
+	int set_subview_mode (SubViewMode, boost::shared_ptr<ARDOUR::Stripable>);
 	void set_flip_mode (FlipMode);
 	void display_view_mode ();
 
@@ -191,6 +170,7 @@ class MackieControlProtocol
 	boost::shared_ptr<Mackie::Surface> nth_surface (uint32_t) const;
 
 	uint32_t global_index (Mackie::Strip&);
+	uint32_t global_index_locked (Mackie::Strip&);
 
 	std::list<boost::shared_ptr<ARDOUR::Bundle> > bundles ();
 
@@ -205,17 +185,19 @@ class MackieControlProtocol
 
 	void handle_button_event (Mackie::Surface&, Mackie::Button& button, Mackie::ButtonState);
 
-	void notify_subview_route_deleted ();
-	void notify_route_added_or_removed ();
-	void notify_route_added (ARDOUR::RouteList &);
-	void notify_remote_id_changed();
+	void notify_subview_stripable_deleted ();
+	void notify_stripable_removed ();
+	void notify_routes_added (ARDOUR::RouteList &);
+	void notify_vca_added (ARDOUR::VCAList &);
+
+	void notify_presentation_info_changed();
 
 	void recalibrate_faders ();
 	void toggle_backlight ();
 	void set_touch_sensitivity (int);
 
-	/// rebuild the current bank. Called on route added/removed and
-	/// remote id changed.
+	/// rebuild the current bank. Called on route or vca added/removed and
+	/// presentation info changed.
 	void refresh_current_bank();
 
 	// button-related signals
@@ -247,11 +229,11 @@ class MackieControlProtocol
 
 	void add_down_button (ARDOUR::AutomationType, int surface, int strip);
 	void remove_down_button (ARDOUR::AutomationType, int surface, int strip);
-	ControlList down_controls (ARDOUR::AutomationType);
+	ControlList down_controls (ARDOUR::AutomationType, uint32_t pressed);
 
 	void add_down_select_button (int surface, int strip);
 	void remove_down_select_button (int surface, int strip);
-	void select_range ();
+	void select_range (uint32_t pressed);
 
 	int16_t ipmidi_base() const { return _ipmidi_base; }
 	void    set_ipmidi_base (int16_t);
@@ -274,11 +256,11 @@ class MackieControlProtocol
 	void zero_all();
 
 	/**
-	   Fetch the set of routes to be considered for control by the
+	   Fetch the set of Stripables to be considered for control by the
 	   surface. Excluding master, hidden and control routes, and inactive routes
 	*/
-	typedef std::vector<boost::shared_ptr<ARDOUR::Route> > Sorted;
-	Sorted get_sorted_routes();
+	typedef std::vector<boost::shared_ptr<ARDOUR::Stripable> > Sorted;
+	Sorted get_sorted_stripables();
 
 	// bank switching
 	int switch_banks (uint32_t first_remote_id, bool force = false);
@@ -296,7 +278,7 @@ class MackieControlProtocol
 
 	void thread_init ();
 
-	bool route_is_locked_to_strip (boost::shared_ptr<ARDOUR::Route>) const;
+	bool stripable_is_locked_to_strip (boost::shared_ptr<ARDOUR::Stripable>) const;
 
   private:
 
@@ -324,8 +306,8 @@ class MackieControlProtocol
 	uint32_t                 _current_initial_bank;
 	PBD::ScopedConnectionList audio_engine_connections;
 	PBD::ScopedConnectionList session_connections;
-	PBD::ScopedConnectionList route_connections;
-	PBD::ScopedConnectionList subview_route_connections;
+	PBD::ScopedConnectionList stripable_connections;
+	PBD::ScopedConnectionList subview_stripable_connections;
 	PBD::ScopedConnectionList gui_connections;
 	PBD::ScopedConnectionList fader_automation_connections;
 	// timer for two quick marker left presses
@@ -344,7 +326,7 @@ class MackieControlProtocol
 	FlipMode                 _flip_mode;
 	ViewMode                 _view_mode;
 	SubViewMode              _subview_mode;
-	boost::shared_ptr<ARDOUR::Route> _subview_route;
+	boost::shared_ptr<ARDOUR::Stripable> _subview_stripable;
 	int                      _current_selected_track;
 	int                      _modifier_state;
 	ButtonMap                 button_map;
@@ -352,7 +334,6 @@ class MackieControlProtocol
 	bool                      needs_ipmidi_restart;
 	bool                     _metering_active;
 	bool                     _initialized;
-	ARDOUR::RouteNotificationList _last_selected_routes;
 	XMLNode*                 configuration_state;
 	int                      state_version;
 	int                      _last_bank[9];
@@ -377,10 +358,10 @@ class MackieControlProtocol
 	bool midi_input_handler (Glib::IOCondition ioc, MIDI::Port* port);
 	void clear_ports ();
 	void clear_surfaces ();
-	void force_special_route_to_strip (boost::shared_ptr<ARDOUR::Route> r, uint32_t surface, uint32_t strip_number);
+	void force_special_stripable_to_strip (boost::shared_ptr<ARDOUR::Stripable> r, uint32_t surface, uint32_t strip_number);
 	void build_button_map ();
-	void gui_track_selection_changed (ARDOUR::RouteNotificationListPtr, bool save_list);
-	void _gui_track_selection_changed (ARDOUR::RouteNotificationList*, bool save_list, bool gui_did_change);
+	void gui_track_selection_changed (ARDOUR::StripableNotificationListPtr, bool save_list);
+	void _gui_track_selection_changed (ARDOUR::StripableNotificationList*, bool save_list, bool gui_did_change);
 	int ipmidi_restart ();
         void initialize ();
         int set_device_info (const std::string& device_name);
@@ -398,7 +379,7 @@ class MackieControlProtocol
 	DownButtonMap  _down_buttons;
 	DownButtonList _down_select_buttons;
 
-	void pull_route_range (DownButtonList&, ARDOUR::RouteList&);
+	void pull_stripable_range (DownButtonList&, ARDOUR::StripableList&, uint32_t pressed);
 
 	/* implemented button handlers */
 	Mackie::LedState stop_press(Mackie::Button &);
diff --git a/libs/surfaces/mackie/mackie_control_protocol_poll.cc b/libs/surfaces/mackie/mackie_control_protocol_poll.cc
index c04eb52..3fcf245 100644
--- a/libs/surfaces/mackie/mackie_control_protocol_poll.cc
+++ b/libs/surfaces/mackie/mackie_control_protocol_poll.cc
@@ -9,7 +9,7 @@
 #include "midi++/types.h"
 #include "midi++/port.h"
 #include "midi++/manager.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 #include <unistd.h>
 #include <fcntl.h>
diff --git a/libs/surfaces/mackie/mcp_buttons.cc b/libs/surfaces/mackie/mcp_buttons.cc
index 5678bdf..4733327 100644
--- a/libs/surfaces/mackie/mcp_buttons.cc
+++ b/libs/surfaces/mackie/mcp_buttons.cc
@@ -32,7 +32,7 @@
 #include "surface.h"
 #include "fader.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 /* handlers for all buttons, broken into a separate file to avoid clutter in
  * mackie_control_protocol.cc
@@ -102,7 +102,7 @@ MackieControlProtocol::left_press (Button &)
 		return none;
 	}
 
-	Sorted sorted = get_sorted_routes();
+	Sorted sorted = get_sorted_stripables();
 	uint32_t strip_cnt = n_strips ();
 
 	DEBUG_TRACE (DEBUG::MackieControl, string_compose ("bank left with current initial = %1 nstrips = %2 tracks/busses = %3\n",
@@ -130,7 +130,7 @@ MackieControlProtocol::right_press (Button &)
 		return none;
 	}
 
-	Sorted sorted = get_sorted_routes();
+	Sorted sorted = get_sorted_stripables();
 	uint32_t strip_cnt = n_strips();
 	uint32_t route_cnt = sorted.size();
 	uint32_t max_bank = route_cnt / strip_cnt * strip_cnt;
@@ -270,7 +270,7 @@ MackieControlProtocol::channel_left_press (Button &)
 	if (_subview_mode != None) {
 		return none;
 	}
-	Sorted sorted = get_sorted_routes();
+	Sorted sorted = get_sorted_stripables();
 	if (sorted.size() > n_strips()) {
 		prev_track();
 		return on;
@@ -291,7 +291,7 @@ MackieControlProtocol::channel_right_press (Button &)
 	if (_subview_mode != None) {
 		return none;
 	}
-	Sorted sorted = get_sorted_routes();
+	Sorted sorted = get_sorted_stripables();
 	if (sorted.size() > n_strips()) {
 		next_track();
 		return on;
@@ -383,7 +383,7 @@ MackieControlProtocol::save_press (Button &)
 	} else {
 		save_state ();
 	}
-	
+
 	return none;
 }
 
@@ -703,7 +703,7 @@ LedState
 MackieControlProtocol::pan_press (Button &)
 {
 	/* XXX eventually pan may have its own subview mode */
-	set_subview_mode (MackieControlProtocol::None, boost::shared_ptr<Route>());
+	set_subview_mode (MackieControlProtocol::None, boost::shared_ptr<Stripable>());
 	return none;
 }
 LedState
@@ -726,8 +726,7 @@ MackieControlProtocol::plugin_release (Button &)
 LedState
 MackieControlProtocol::eq_press (Button &)
 {
-	boost::shared_ptr<Route> r = first_selected_route ();
-	set_subview_mode (EQ, r);
+	set_subview_mode (EQ, first_selected_stripable ());
 	return none; /* led state handled by set_subview_mode() */
 
 }
@@ -739,8 +738,7 @@ MackieControlProtocol::eq_release (Button &)
 LedState
 MackieControlProtocol::dyn_press (Button &)
 {
-	boost::shared_ptr<Route> r = first_selected_route ();
-	set_subview_mode (Dynamics, r);
+	set_subview_mode (Dynamics, first_selected_stripable ());
 	return none; /* led state handled by set_subview_mode() */
 }
 
@@ -796,7 +794,7 @@ MackieControlProtocol::cancel_press (Button &)
 	if (main_modifier_state() & MODIFIER_SHIFT) {
 		access_action ("Transport/ToggleExternalSync");
 	} else {
-		access_action ("Editor/escape");
+		access_action ("Main/Escape");
 	}
 	return none;
 }
@@ -888,15 +886,9 @@ MackieControlProtocol::clearsolo_press (Mackie::Button&)
 		access_action ("Editor/set-session-from-edit-range");
 		return none;
 	}
-	
-	if (session) {
-		if (session->soloing()) {
-			session->set_solo (session->get_routes(), false);
-		} else if (session->listening()) {
-			session->set_listen (session->get_routes(), false);
-		}
 
-		session->clear_all_solo_state (session->get_routes()); // safeguard, ideally this won't do anything, check the log-window
+	if (session) {
+		session->cancel_all_solo ();
 	}
 	return none;
 }
@@ -911,7 +903,7 @@ MackieControlProtocol::clearsolo_release (Mackie::Button&)
 Mackie::LedState
 MackieControlProtocol::track_press (Mackie::Button&)
 {
-	set_subview_mode (TrackView, first_selected_route());
+	set_subview_mode (TrackView, first_selected_stripable());
 	return none;
 }
 Mackie::LedState
@@ -922,8 +914,7 @@ MackieControlProtocol::track_release (Mackie::Button&)
 Mackie::LedState
 MackieControlProtocol::send_press (Mackie::Button&)
 {
-	boost::shared_ptr<Route> r = first_selected_route ();
-	set_subview_mode (Sends, r);
+	set_subview_mode (Sends, first_selected_stripable());
 	return none; /* led state handled by set_subview_mode() */
 }
 Mackie::LedState
@@ -1066,7 +1057,7 @@ MackieControlProtocol::nudge_release (Mackie::Button&)
 	_modifier_state &= ~MODIFIER_NUDGE;
 
 	/* XXX these action names are stupid, because the action can affect
-	 * regions, markers or the playhead depending on selection state. 
+	 * regions, markers or the playhead depending on selection state.
 	 */
 
 	if (main_modifier_state() & MODIFIER_SHIFT) {
diff --git a/libs/surfaces/mackie/strip.cc b/libs/surfaces/mackie/strip.cc
index e71c9a6..1c2fe8d 100644
--- a/libs/surfaces/mackie/strip.cc
+++ b/libs/surfaces/mackie/strip.cc
@@ -37,14 +37,18 @@
 #include "ardour/debug.h"
 #include "ardour/midi_ui.h"
 #include "ardour/meter.h"
+#include "ardour/monitor_control.h"
 #include "ardour/plugin_insert.h"
 #include "ardour/pannable.h"
 #include "ardour/panner.h"
 #include "ardour/panner_shell.h"
+#include "ardour/phase_control.h"
 #include "ardour/rc_configuration.h"
+#include "ardour/record_enable_control.h"
 #include "ardour/route.h"
 #include "ardour/session.h"
 #include "ardour/send.h"
+#include "ardour/solo_isolate_control.h"
 #include "ardour/track.h"
 #include "ardour/midi_track.h"
 #include "ardour/user_bundle.h"
@@ -163,7 +167,7 @@ Strip::add (Control & control)
 }
 
 void
-Strip::set_route (boost::shared_ptr<Route> r, bool /*with_messages*/)
+Strip::set_stripable (boost::shared_ptr<Stripable> r, bool /*with_messages*/)
 {
 	if (_controls_locked) {
 		return;
@@ -171,7 +175,7 @@ Strip::set_route (boost::shared_ptr<Route> r, bool /*with_messages*/)
 
 	mb_pan_controllable.reset();
 
-	route_connections.drop_connections ();
+	stripable_connections.drop_connections ();
 
 	_solo->set_control (boost::shared_ptr<AutomationControl>());
 	_mute->set_control (boost::shared_ptr<AutomationControl>());
@@ -180,69 +184,68 @@ Strip::set_route (boost::shared_ptr<Route> r, bool /*with_messages*/)
 	_fader->set_control (boost::shared_ptr<AutomationControl>());
 	_vpot->set_control (boost::shared_ptr<AutomationControl>());
 
-	_route = r;
+	_stripable = r;
 
 	reset_saved_values ();
 
 	if (!r) {
+		DEBUG_TRACE (DEBUG::MackieControl, string_compose ("Surface %1 Strip %2 mapped to null route\n", _surface->number(), _index));
 		zero ();
 		return;
 	}
 
-	DEBUG_TRACE (DEBUG::MackieControl, string_compose ("Surface %1 strip %2 now mapping route %3\n",
-							   _surface->number(), _index, _route->name()));
+	DEBUG_TRACE (DEBUG::MackieControl, string_compose ("Surface %1 strip %2 now mapping stripable %3\n",
+							   _surface->number(), _index, _stripable->name()));
 
-	_solo->set_control (_route->solo_control());
-	_mute->set_control (_route->mute_control());
+	_solo->set_control (_stripable->solo_control());
+	_mute->set_control (_stripable->mute_control());
 
-	_route->solo_changed.connect (route_connections, MISSING_INVALIDATOR, boost::bind (&Strip::notify_solo_changed, this), ui_context());
-	_route->listen_changed.connect (route_connections, MISSING_INVALIDATOR, boost::bind (&Strip::notify_solo_changed, this), ui_context());
+	_stripable->solo_control()->Changed.connect (stripable_connections, MISSING_INVALIDATOR, boost::bind (&Strip::notify_solo_changed, this), ui_context());
+	_stripable->mute_control()->Changed.connect(stripable_connections, MISSING_INVALIDATOR, boost::bind (&Strip::notify_mute_changed, this), ui_context());
 
-	_route->mute_control()->Changed.connect(route_connections, MISSING_INVALIDATOR, boost::bind (&Strip::notify_mute_changed, this), ui_context());
-
-	boost::shared_ptr<AutomationControl> pan_control = _route->pan_azimuth_control();
+	boost::shared_ptr<AutomationControl> pan_control = _stripable->pan_azimuth_control();
 	if (pan_control) {
-		pan_control->Changed.connect(route_connections, MISSING_INVALIDATOR, boost::bind (&Strip::notify_panner_azi_changed, this, false), ui_context());
+		pan_control->Changed.connect(stripable_connections, MISSING_INVALIDATOR, boost::bind (&Strip::notify_panner_azi_changed, this, false), ui_context());
 	}
 
-	pan_control = _route->pan_width_control();
+	pan_control = _stripable->pan_width_control();
 	if (pan_control) {
-		pan_control->Changed.connect(route_connections, MISSING_INVALIDATOR, boost::bind (&Strip::notify_panner_width_changed, this, false), ui_context());
+		pan_control->Changed.connect(stripable_connections, MISSING_INVALIDATOR, boost::bind (&Strip::notify_panner_width_changed, this, false), ui_context());
 	}
 
-	_route->gain_control()->Changed.connect(route_connections, MISSING_INVALIDATOR, boost::bind (&Strip::notify_gain_changed, this, false), ui_context());
-	_route->PropertyChanged.connect (route_connections, MISSING_INVALIDATOR, boost::bind (&Strip::notify_property_changed, this, _1), ui_context());
+	_stripable->gain_control()->Changed.connect(stripable_connections, MISSING_INVALIDATOR, boost::bind (&Strip::notify_gain_changed, this, false), ui_context());
+	_stripable->PropertyChanged.connect (stripable_connections, MISSING_INVALIDATOR, boost::bind (&Strip::notify_property_changed, this, _1), ui_context());
+	_stripable->presentation_info().PropertyChanged.connect (stripable_connections, MISSING_INVALIDATOR, boost::bind (&Strip::notify_property_changed, this, _1), ui_context());
 
-	boost::shared_ptr<Track> trk = boost::dynamic_pointer_cast<ARDOUR::Track>(_route);
+	boost::shared_ptr<AutomationControl> rec_enable_control = _stripable->rec_enable_control ();
 
-	if (trk) {
-		_recenable->set_control (trk->rec_enable_control());
-		trk->rec_enable_control()->Changed .connect(route_connections, MISSING_INVALIDATOR, boost::bind (&Strip::notify_record_enable_changed, this), ui_context());
+	if (rec_enable_control) {
+		_recenable->set_control (rec_enable_control);
+		rec_enable_control->Changed.connect (stripable_connections, MISSING_INVALIDATOR, boost::bind (&Strip::notify_record_enable_changed, this), ui_context());
 	}
 
-	// TODO this works when a currently-banked route is made inactive, but not
-	// when a route is activated which should be currently banked.
+	// TODO this works when a currently-banked stripable is made inactive, but not
+	// when a stripable is activated which should be currently banked.
 
-	_route->active_changed.connect (route_connections, MISSING_INVALIDATOR, boost::bind (&Strip::notify_active_changed, this), ui_context());
-	_route->DropReferences.connect (route_connections, MISSING_INVALIDATOR, boost::bind (&Strip::notify_route_deleted, this), ui_context());
+	_stripable->DropReferences.connect (stripable_connections, MISSING_INVALIDATOR, boost::bind (&Strip::notify_stripable_deleted, this), ui_context());
 
-	/* setup legal VPot modes for this route */
+	/* setup legal VPot modes for this stripable */
 
 	possible_pot_parameters.clear();
 
-	if (_route->pan_azimuth_control()) {
+	if (_stripable->pan_azimuth_control()) {
 		possible_pot_parameters.push_back (PanAzimuthAutomation);
 	}
-	if (_route->pan_width_control()) {
+	if (_stripable->pan_width_control()) {
 		possible_pot_parameters.push_back (PanWidthAutomation);
 	}
-	if (_route->pan_elevation_control()) {
+	if (_stripable->pan_elevation_control()) {
 		possible_pot_parameters.push_back (PanElevationAutomation);
 	}
-	if (_route->pan_frontback_control()) {
+	if (_stripable->pan_frontback_control()) {
 		possible_pot_parameters.push_back (PanFrontBackAutomation);
 	}
-	if (_route->pan_lfe_control()) {
+	if (_stripable->pan_lfe_control()) {
 		possible_pot_parameters.push_back (PanLFEAutomation);
 	}
 
@@ -252,7 +255,7 @@ Strip::set_route (boost::shared_ptr<Route> r, bool /*with_messages*/)
 		set_vpot_parameter (_pan_mode);
 	}
 
-	_fader->set_control (_route->gain_control());
+	_fader->set_control (_stripable->gain_control());
 
 	notify_all ();
 }
@@ -260,7 +263,7 @@ Strip::set_route (boost::shared_ptr<Route> r, bool /*with_messages*/)
 void
 Strip::notify_all()
 {
-	if (!_route) {
+	if (!_stripable) {
 		zero ();
 		return;
 	}
@@ -273,6 +276,7 @@ Strip::notify_all()
 	notify_mute_changed ();
 	notify_gain_changed ();
 	notify_property_changed (PBD::PropertyChange (ARDOUR::Properties::name));
+	notify_property_changed (PBD::PropertyChange (ARDOUR::Properties::selected));
 	notify_panner_azi_changed ();
 	notify_panner_width_changed ();
 	notify_record_enable_changed ();
@@ -282,8 +286,8 @@ Strip::notify_all()
 void
 Strip::notify_solo_changed ()
 {
-	if (_route && _solo) {
-		_surface->write (_solo->set_state ((_route->soloed() || _route->listening_via_monitor()) ? on : off));
+	if (_stripable && _solo) {
+		_surface->write (_solo->set_state (_stripable->solo_control()->soloed() ? on : off));
 	}
 }
 
@@ -291,42 +295,40 @@ void
 Strip::notify_mute_changed ()
 {
 	DEBUG_TRACE (DEBUG::MackieControl, string_compose ("Strip %1 mute changed\n", _index));
-	if (_route && _mute) {
-		DEBUG_TRACE (DEBUG::MackieControl, string_compose ("\troute muted ? %1\n", _route->muted()));
-		DEBUG_TRACE (DEBUG::MackieControl, string_compose ("mute message: %1\n", _mute->set_state (_route->muted() ? on : off)));
+	if (_stripable && _mute) {
+		DEBUG_TRACE (DEBUG::MackieControl, string_compose ("\tstripable muted ? %1\n", _stripable->mute_control()->muted()));
+		DEBUG_TRACE (DEBUG::MackieControl, string_compose ("mute message: %1\n", _mute->set_state (_stripable->mute_control()->muted() ? on : off)));
 
-		_surface->write (_mute->set_state (_route->muted() ? on : off));
+		_surface->write (_mute->set_state (_stripable->mute_control()->muted() ? on : off));
 	}
 }
 
 void
 Strip::notify_record_enable_changed ()
 {
-	if (_route && _recenable)  {
-		_surface->write (_recenable->set_state (_route->record_enabled() ? on : off));
+	if (_stripable && _recenable)  {
+		boost::shared_ptr<Track> trk = boost::dynamic_pointer_cast<Track> (_stripable);
+		if (trk) {
+			_surface->write (_recenable->set_state (trk->rec_enable_control()->get_value() ? on : off));
+		}
 	}
 }
 
 void
-Strip::notify_active_changed ()
-{
-	_surface->mcp().refresh_current_bank();
-}
-
-void
-Strip::notify_route_deleted ()
+Strip::notify_stripable_deleted ()
 {
+	_surface->mcp().notify_stripable_removed ();
 	_surface->mcp().refresh_current_bank();
 }
 
 void
 Strip::notify_gain_changed (bool force_update)
 {
-	if (!_route) {
+	if (!_stripable) {
 		return;
 	}
 
-	boost::shared_ptr<AutomationControl> ac = _route->gain_control();
+	boost::shared_ptr<AutomationControl> ac = _stripable->gain_control();
 	Control* control;
 
 	if (!ac) {
@@ -372,15 +374,20 @@ Strip::notify_processor_changed (bool force_update)
 void
 Strip::notify_property_changed (const PropertyChange& what_changed)
 {
-	if (!what_changed.contains (ARDOUR::Properties::name)) {
-		return;
+	if (what_changed.contains (ARDOUR::Properties::name)) {
+		show_stripable_name ();
 	}
 
-	show_route_name ();
+	if (what_changed.contains (ARDOUR::Properties::selected)) {
+		if (_stripable) {
+			_surface->write (_select->set_state (_stripable->presentation_info().selected()));
+			_surface->mcp().update_selected (_stripable, _stripable->presentation_info().selected());
+		}
+	}
 }
 
 void
-Strip::show_route_name ()
+Strip::show_stripable_name ()
 {
 	MackieControlProtocol::SubViewMode svm = _surface->mcp().subview_mode();
 
@@ -390,10 +397,10 @@ Strip::show_route_name ()
 	}
 
 	string fullname = string();
-	if (!_route) {
+	if (!_stripable) {
 		fullname = string();
 	} else {
-		fullname = _route->name();
+		fullname = _stripable->name();
 	}
 
 	if (fullname.length() <= 6) {
@@ -406,7 +413,7 @@ Strip::show_route_name ()
 void
 Strip::notify_send_level_change (AutomationType type, uint32_t send_num, bool force_update)
 {
-	boost::shared_ptr<Route> r = _surface->mcp().subview_route();
+	boost::shared_ptr<Stripable> r = _surface->mcp().subview_stripable();
 
 	if (!r) {
 		/* not in subview mode */
@@ -437,7 +444,7 @@ Strip::notify_send_level_change (AutomationType type, uint32_t send_num, bool fo
 void
 Strip::notify_trackview_change (AutomationType type, uint32_t send_num, bool force_update)
 {
-	boost::shared_ptr<Route> r = _surface->mcp().subview_route();
+	boost::shared_ptr<Stripable> r = _surface->mcp().subview_stripable();
 
 	if (!r) {
 		/* not in subview mode */
@@ -491,7 +498,7 @@ Strip::notify_trackview_change (AutomationType type, uint32_t send_num, bool for
 void
 Strip::notify_eq_change (AutomationType type, uint32_t band, bool force_update)
 {
-	boost::shared_ptr<Route> r = _surface->mcp().subview_route();
+	boost::shared_ptr<Stripable> r = _surface->mcp().subview_stripable();
 
 	if (!r) {
 		/* not in subview mode */
@@ -539,7 +546,7 @@ Strip::notify_eq_change (AutomationType type, uint32_t band, bool force_update)
 void
 Strip::notify_dyn_change (AutomationType type, bool force_update, bool propagate_mode)
 {
-	boost::shared_ptr<Route> r = _surface->mcp().subview_route();
+	boost::shared_ptr<Stripable> r = _surface->mcp().subview_stripable();
 
 	if (!r) {
 		/* not in subview mode */
@@ -593,13 +600,13 @@ Strip::notify_dyn_change (AutomationType type, bool force_update, bool propagate
 void
 Strip::notify_panner_azi_changed (bool force_update)
 {
-	if (!_route) {
+	if (!_stripable) {
 		return;
 	}
 
 	DEBUG_TRACE (DEBUG::MackieControl, string_compose ("pan change for strip %1\n", _index));
 
-	boost::shared_ptr<AutomationControl> pan_control = _route->pan_azimuth_control ();
+	boost::shared_ptr<AutomationControl> pan_control = _stripable->pan_azimuth_control ();
 
 	if (!pan_control) {
 		/* basically impossible, since we're here because that control
@@ -628,13 +635,13 @@ Strip::notify_panner_azi_changed (bool force_update)
 void
 Strip::notify_panner_width_changed (bool force_update)
 {
-	if (!_route) {
+	if (!_stripable) {
 		return;
 	}
 
 	DEBUG_TRACE (DEBUG::MackieControl, string_compose ("pan width change for strip %1\n", _index));
 
-	boost::shared_ptr<AutomationControl> pan_control = _route->pan_width_control ();
+	boost::shared_ptr<AutomationControl> pan_control = _stripable->pan_width_control ();
 
 	if (!pan_control) {
 		/* basically impossible, since we're here because that control
@@ -676,7 +683,7 @@ Strip::select_event (Button&, ButtonState bs)
 
 		DEBUG_TRACE (DEBUG::MackieControl, "add select button on press\n");
 		_surface->mcp().add_down_select_button (_surface->number(), _index);
-		_surface->mcp().select_range ();
+		_surface->mcp().select_range (_surface->mcp().global_index (*this));
 
 	} else {
 		DEBUG_TRACE (DEBUG::MackieControl, "remove select button on release\n");
@@ -732,7 +739,7 @@ Strip::vselect_event (Button&, ButtonState bs)
 			 * explicitly.
 			 */
 
-			boost::shared_ptr<Route> r = _surface->mcp().subview_route();
+			boost::shared_ptr<Stripable> r = _surface->mcp().subview_stripable();
 
 			if (r) {
 
@@ -757,7 +764,7 @@ Strip::vselect_event (Button&, ButtonState bs)
 					} else {
 						/* we just turned it on, show the level
 						*/
-						control = _route->send_level_controllable (global_pos);
+						control = _stripable->send_level_controllable (global_pos);
 						do_parameter_display (BusSendLevel, control->get_value());
 					}
 				}
@@ -786,8 +793,8 @@ Strip::vselect_event (Button&, ButtonState bs)
 		}  else {
 
 #ifdef MIXBUS
-			if (_route) {
-				boost::shared_ptr<AutomationControl> ac = _route->master_send_enable_controllable ();
+			if (_stripable) {
+				boost::shared_ptr<AutomationControl> ac = _stripable->master_send_enable_controllable ();
 				if (ac) {
 					Controllable::GroupControlDisposition gcd;
 
@@ -875,7 +882,8 @@ Strip::handle_button (Button& button, ButtonState bs)
 				 * several down buttons
 				 */
 
-				MackieControlProtocol::ControlList controls = _surface->mcp().down_controls ((AutomationType) control->parameter().type());
+				MackieControlProtocol::ControlList controls = _surface->mcp().down_controls ((AutomationType) control->parameter().type(),
+				                                                                             _surface->mcp().global_index(*this));
 
 
 				DEBUG_TRACE (DEBUG::MackieControl, string_compose ("there are %1 buttons down for control type %2, new value = %3\n",
@@ -945,10 +953,10 @@ Strip::do_parameter_display (AutomationType type, float val)
 			pending_display[1] = buf;
 			screen_hold = true;
 		} else {
-			if (_route) {
-				boost::shared_ptr<Pannable> p = _route->pannable();
-				if (p && _route->panner()) {
-					pending_display[1] =_route->panner()->value_as_string (p->pan_azimuth_control);
+			if (_stripable) {
+				boost::shared_ptr<AutomationControl> pa = _stripable->pan_azimuth_control();
+				if (pa) {
+					pending_display[1] = pa->get_user_string ();
 					screen_hold = true;
 				}
 			}
@@ -956,7 +964,7 @@ Strip::do_parameter_display (AutomationType type, float val)
 		break;
 
 	case PanWidthAutomation:
-		if (_route) {
+		if (_stripable) {
 			snprintf (buf, sizeof (buf), "%5ld%%", lrintf ((val * 200.0)-100));
 			pending_display[1] = buf;
 			screen_hold = true;
@@ -964,7 +972,7 @@ Strip::do_parameter_display (AutomationType type, float val)
 		break;
 
 	case TrimAutomation:
-		if (_route) {
+		if (_stripable) {
 			float dB = accurate_coefficient_to_dB (val);
 			snprintf (buf, sizeof (buf), "%6.1f", dB);
 			pending_display[1] = buf;
@@ -973,7 +981,7 @@ Strip::do_parameter_display (AutomationType type, float val)
 		break;
 
 	case PhaseAutomation:
-		if (_route) {
+		if (_stripable) {
 			if (val < 0.5) {
 				pending_display[1] = "Normal";
 			} else {
@@ -1005,8 +1013,8 @@ Strip::do_parameter_display (AutomationType type, float val)
 		}
 		break;
 	case CompMode:
-		if (_surface->mcp().subview_route()) {
-			pending_display[1] = _surface->mcp().subview_route()->comp_mode_name (val);
+		if (_surface->mcp().subview_stripable()) {
+			pending_display[1] = _surface->mcp().subview_stripable()->comp_mode_name (val);
 		}
 		break;
 	case SoloSafeAutomation:
@@ -1187,17 +1195,17 @@ Strip::redisplay (ARDOUR::microseconds_t now, bool force)
 void
 Strip::update_automation ()
 {
-	if (!_route) {
+	if (!_stripable) {
 		return;
 	}
 
-	ARDOUR::AutoState state = _route->gain_control()->automation_state();
+	ARDOUR::AutoState state = _stripable->gain_control()->automation_state();
 
 	if (state == Touch || state == Play) {
 		notify_gain_changed (false);
 	}
 
-	boost::shared_ptr<AutomationControl> pan_control = _route->pan_azimuth_control ();
+	boost::shared_ptr<AutomationControl> pan_control = _stripable->pan_azimuth_control ();
 	if (pan_control) {
 		state = pan_control->automation_state ();
 		if (state == Touch || state == Play) {
@@ -1205,7 +1213,7 @@ Strip::update_automation ()
 		}
 	}
 
-	pan_control = _route->pan_width_control ();
+	pan_control = _stripable->pan_width_control ();
 	if (pan_control) {
 		state = pan_control->automation_state ();
 		if (state == Touch || state == Play) {
@@ -1217,7 +1225,7 @@ Strip::update_automation ()
 void
 Strip::update_meter ()
 {
-	if (!_route) {
+	if (!_stripable) {
 		return;
 	}
 
@@ -1225,8 +1233,8 @@ Strip::update_meter ()
 		return;
 	}
 
-	if (_meter && _transport_is_rolling && _metering_active) {
-		float dB = const_cast<PeakMeter&> (_route->peak_meter()).meter_level (0, MeterMCP);
+	if (_meter && _transport_is_rolling && _metering_active && _stripable->peak_meter()) {
+		float dB = _stripable->peak_meter()->meter_level (0, MeterMCP);
 		_meter->send_update (*_surface, dB);
 		return;
 	}
@@ -1306,19 +1314,6 @@ Strip::unlock_controls ()
 	_controls_locked = false;
 }
 
-void
-Strip::gui_selection_changed (const ARDOUR::StrongRouteNotificationList& rl)
-{
-	for (ARDOUR::StrongRouteNotificationList::const_iterator i = rl.begin(); i != rl.end(); ++i) {
-		if ((*i) == _route) {
-			_surface->write (_select->set_state (on));
-			return;
-		}
-	}
-
-	_surface->write (_select->set_state (off));
-}
-
 string
 Strip::vpot_mode_string ()
 {
@@ -1359,24 +1354,26 @@ Strip::flip_mode_changed ()
 		boost::shared_ptr<AutomationControl> fader_control = _fader->control();
 
 		if (pot_control && fader_control) {
+
 			_vpot->set_control (fader_control);
 			_fader->set_control (pot_control);
-		}
 
-		if (_surface->mcp().flip_mode() == MackieControlProtocol::Normal) {
-			do_parameter_display (GainAutomation, fader_control->get_value());
-		} else {
-			do_parameter_display (BusSendLevel, fader_control->get_value());
-		}
+			/* update fader with pot value */
 
-		/* update fader */
+			_surface->write (_fader->set_position (pot_control->internal_to_interface (pot_control->get_value ())));
 
-		_surface->write (_fader->set_position (pot_control->internal_to_interface (pot_control->get_value ())));
+			/* update pot with fader value */
 
-		/* update pot */
+			_surface->write (_vpot->set (fader_control->internal_to_interface (fader_control->get_value()), true, Pot::wrap));
 
-		_surface->write (_vpot->set (fader_control->internal_to_interface (fader_control->get_value()), true, Pot::wrap));
 
+			if (_surface->mcp().flip_mode() == MackieControlProtocol::Normal) {
+				do_parameter_display (GainAutomation, fader_control->get_value());
+			} else {
+				do_parameter_display (BusSendLevel, pot_control->get_value());
+			}
+
+		}
 
 	} else {
 		/* do nothing */
@@ -1405,7 +1402,7 @@ Strip::return_to_vpot_mode_display ()
 	if (_surface->mcp().subview_mode() != MackieControlProtocol::None) {
 		/* do nothing - second line shows value of current subview parameter */
 		return;
-	} else if (_route) {
+	} else if (_stripable) {
 		pending_display[1] = vpot_mode_string();
 	} else {
 		pending_display[1] = string();
@@ -1465,7 +1462,7 @@ Strip::next_pot_mode ()
 void
 Strip::subview_mode_changed ()
 {
-	boost::shared_ptr<Route> r = _surface->mcp().subview_route();
+	boost::shared_ptr<Stripable> r = _surface->mcp().subview_stripable();
 
 	subview_connections.drop_connections ();
 
@@ -1473,8 +1470,8 @@ Strip::subview_mode_changed ()
 	case MackieControlProtocol::None:
 		set_vpot_parameter (_pan_mode);
 		/* need to show strip name again */
-		show_route_name ();
-		if (!_route) {
+		show_stripable_name ();
+		if (!_stripable) {
 			_surface->write (_vpot->set (0, true, Pot::wrap));
 			_surface->write (_fader->set_position (0.0));
 		}
@@ -1519,7 +1516,7 @@ Strip::subview_mode_changed ()
 }
 
 void
-Strip::setup_dyn_vpot (boost::shared_ptr<Route> r)
+Strip::setup_dyn_vpot (boost::shared_ptr<Stripable> r)
 {
 	if (!r) {
 		return;
@@ -1604,7 +1601,7 @@ Strip::setup_dyn_vpot (boost::shared_ptr<Route> r)
 }
 
 void
-Strip::setup_eq_vpot (boost::shared_ptr<Route> r)
+Strip::setup_eq_vpot (boost::shared_ptr<Stripable> r)
 {
 	uint32_t bands = r->eq_band_cnt ();
 
@@ -1739,7 +1736,7 @@ Strip::setup_eq_vpot (boost::shared_ptr<Route> r)
 }
 
 void
-Strip::setup_sends_vpot (boost::shared_ptr<Route> r)
+Strip::setup_sends_vpot (boost::shared_ptr<Stripable> r)
 {
 	if (!r) {
 		return;
@@ -1750,6 +1747,8 @@ Strip::setup_sends_vpot (boost::shared_ptr<Route> r)
 	boost::shared_ptr<AutomationControl> pc = r->send_level_controllable (global_pos);
 
 	if (!pc) {
+		/* nothing to control */
+		_vpot->set_control (boost::shared_ptr<AutomationControl>());
 		pending_display[0] = string();
 		pending_display[1] = string();
 		return;
@@ -1764,7 +1763,7 @@ Strip::setup_sends_vpot (boost::shared_ptr<Route> r)
 }
 
 void
-Strip::setup_trackview_vpot (boost::shared_ptr<Route> r)
+Strip::setup_trackview_vpot (boost::shared_ptr<Stripable> r)
 {
 	if (!r) {
 		return;
@@ -1773,6 +1772,8 @@ Strip::setup_trackview_vpot (boost::shared_ptr<Route> r)
 	const uint32_t global_pos = _surface->mcp().global_index (*this);
 
 	if (global_pos >= 8) {
+		/* nothing to control */
+		_vpot->set_control (boost::shared_ptr<AutomationControl>());
 		pending_display[0] = string();
 		pending_display[1] = string();
 		return;
@@ -1848,7 +1849,7 @@ Strip::setup_trackview_vpot (boost::shared_ptr<Route> r)
 void
 Strip::set_vpot_parameter (AutomationType p)
 {
-	if (!_route || (p == NullAutomation)) {
+	if (!_stripable || (p == NullAutomation)) {
 		_vpot->set_control (boost::shared_ptr<AutomationControl>());
 		pending_display[1] = string();
 		return;
@@ -1862,10 +1863,10 @@ Strip::set_vpot_parameter (AutomationType p)
 
 	switch (p) {
 	case PanAzimuthAutomation:
-		pan_control = _route->pan_azimuth_control ();
+		pan_control = _stripable->pan_azimuth_control ();
 		break;
 	case PanWidthAutomation:
-		pan_control = _route->pan_width_control ();
+		pan_control = _stripable->pan_width_control ();
 		break;
 	case PanElevationAutomation:
 		break;
@@ -1888,7 +1889,7 @@ Strip::set_vpot_parameter (AutomationType p)
 bool
 Strip::is_midi_track () const
 {
-	return boost::dynamic_pointer_cast<MidiTrack>(_route) != 0;
+	return boost::dynamic_pointer_cast<MidiTrack>(_stripable) != 0;
 }
 
 void
@@ -1908,7 +1909,7 @@ Strip::notify_metering_state_changed()
 		return;
 	}
 
-	if (!_route || !_meter) {
+	if (!_stripable || !_meter) {
 		return;
 	}
 
diff --git a/libs/surfaces/mackie/strip.h b/libs/surfaces/mackie/strip.h
index 9cce3d2..a095f8e 100644
--- a/libs/surfaces/mackie/strip.h
+++ b/libs/surfaces/mackie/strip.h
@@ -20,7 +20,7 @@
 #include "device_info.h"
 
 namespace ARDOUR {
-	class Route;
+	class Stripable;
 	class Bundle;
 	class ChannelCount;
 }
@@ -53,13 +53,13 @@ public:
 	Strip (Surface&, const std::string & name, int index, const std::map<Button::ID,StripButtonInfo>&);
 	~Strip();
 
-	boost::shared_ptr<ARDOUR::Route> route() const { return _route; }
+	boost::shared_ptr<ARDOUR::Stripable> stripable() const { return _stripable; }
 
 	void add (Control & control);
 	int index() const { return _index; } // zero based
 	Surface* surface() const { return _surface; }
 
-	void set_route (boost::shared_ptr<ARDOUR::Route>, bool with_messages = true);
+	void set_stripable (boost::shared_ptr<ARDOUR::Stripable>, bool with_messages = true);
 
 	// call all signal handlers manually
 	void notify_all ();
@@ -84,8 +84,6 @@ public:
 	void unlock_controls ();
 	bool locked() const { return _controls_locked; }
 
-	void gui_selection_changed (const ARDOUR::StrongRouteNotificationList&);
-
 	void notify_metering_state_changed();
 
 	void block_screen_display_for (uint32_t msecs);
@@ -115,8 +113,8 @@ private:
 	std::string current_display[2];
 	uint64_t _block_screen_redisplay_until;
 	uint64_t return_to_vpot_mode_display_at;
-	boost::shared_ptr<ARDOUR::Route> _route;
-	PBD::ScopedConnectionList route_connections;
+	boost::shared_ptr<ARDOUR::Stripable> _stripable;
+	PBD::ScopedConnectionList stripable_connections;
 	PBD::ScopedConnectionList subview_connections;
 	PBD::ScopedConnectionList send_connections;
 	int       eq_band;
@@ -135,8 +133,7 @@ private:
 	void notify_property_changed (const PBD::PropertyChange&);
 	void notify_panner_azi_changed (bool force_update = true);
 	void notify_panner_width_changed (bool force_update = true);
-	void notify_active_changed ();
-	void notify_route_deleted ();
+	void notify_stripable_deleted ();
 	void notify_processor_changed (bool force_update = true);
 	void update_automation ();
 	void update_meter ();
@@ -155,23 +152,23 @@ private:
 	std::vector<ARDOUR::AutomationType> possible_pot_parameters;
 	std::vector<ARDOUR::AutomationType> possible_trim_parameters;
 	void set_vpot_parameter (ARDOUR::AutomationType);
-	void show_route_name ();
+	void show_stripable_name ();
 
 	void reset_saved_values ();
 
 	bool is_midi_track () const;
 
 	void notify_eq_change (ARDOUR::AutomationType, uint32_t band, bool force);
-	void setup_eq_vpot (boost::shared_ptr<ARDOUR::Route>);
+	void setup_eq_vpot (boost::shared_ptr<ARDOUR::Stripable>);
 
 	void notify_dyn_change (ARDOUR::AutomationType, bool force, bool propagate_mode_change);
-	void setup_dyn_vpot (boost::shared_ptr<ARDOUR::Route>);
+	void setup_dyn_vpot (boost::shared_ptr<ARDOUR::Stripable>);
 
 	void notify_send_level_change (ARDOUR::AutomationType, uint32_t band, bool force);
-	void setup_sends_vpot (boost::shared_ptr<ARDOUR::Route>);
+	void setup_sends_vpot (boost::shared_ptr<ARDOUR::Stripable>);
 
 	void notify_trackview_change (ARDOUR::AutomationType, uint32_t band, bool force);
-	void setup_trackview_vpot (boost::shared_ptr<ARDOUR::Route>);
+	void setup_trackview_vpot (boost::shared_ptr<ARDOUR::Stripable>);
 };
 
 }
diff --git a/libs/surfaces/mackie/surface.cc b/libs/surfaces/mackie/surface.cc
index 274f2b4..ec8192f 100644
--- a/libs/surfaces/mackie/surface.cc
+++ b/libs/surfaces/mackie/surface.cc
@@ -57,7 +57,7 @@
 #include "jog.h"
 #include "meter.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 #ifdef PLATFORM_WINDOWS
 #define random() rand()
@@ -65,7 +65,7 @@
 
 using namespace std;
 using namespace PBD;
-using ARDOUR::Route;
+using ARDOUR::Stripable;
 using ARDOUR::Panner;
 using ARDOUR::Profile;
 using ARDOUR::AutomationControl;
@@ -377,14 +377,16 @@ Surface::master_monitor_may_have_changed ()
 void
 Surface::setup_master ()
 {
-	boost::shared_ptr<Route> m;
+	boost::shared_ptr<Stripable> m;
 
 	if ((m = _mcp.get_session().monitor_out()) == 0) {
 		m = _mcp.get_session().master_out();
 	}
 
 	if (!m) {
-		_master_fader->set_control (boost::shared_ptr<AutomationControl>());
+		if (_master_fader) {
+			_master_fader->set_control (boost::shared_ptr<AutomationControl>());
+		}
 		master_connection.disconnect ();
 		return;
 	}
@@ -673,8 +675,6 @@ Surface::handle_midi_sysex (MIDI::Parser &, MIDI::byte * raw_bytes, size_t count
 {
 	MidiByteArray bytes (count, raw_bytes);
 
-	DEBUG_TRACE (DEBUG::MackieControl, string_compose ("handle_midi_sysex: %1\n", bytes));
-
 	if (_mcp.device_info().no_handshake()) {
 		turn_it_on ();
 	}
@@ -691,6 +691,9 @@ Surface::handle_midi_sysex (MIDI::Parser &, MIDI::byte * raw_bytes, size_t count
 
 	switch (bytes[5]) {
 	case 0x01:
+		if (!_active) {
+			DEBUG_TRACE (DEBUG::MackieControl, string_compose ("handle_midi_sysex: %1\n", bytes));
+		}
 		/* MCP: Device Ready
 		   LCP: Connection Challenge
 		*/
@@ -698,12 +701,17 @@ Surface::handle_midi_sysex (MIDI::Parser &, MIDI::byte * raw_bytes, size_t count
 			DEBUG_TRACE (DEBUG::MackieControl, "Logic Control Device connection challenge\n");
 			write_sysex (host_connection_query (bytes));
 		} else {
-			DEBUG_TRACE (DEBUG::MackieControl, string_compose ("Mackie Control Device ready, current status = %1\n", _active));
+			if (!_active) {
+				DEBUG_TRACE (DEBUG::MackieControl, string_compose ("Mackie Control Device ready, current status = %1\n", _active));
+			}
 			turn_it_on ();
 		}
 		break;
 
 	case 0x06:
+		if (!_active) {
+			DEBUG_TRACE (DEBUG::MackieControl, string_compose ("handle_midi_sysex: %1\n", bytes));
+		}
 		/* Behringer X-Touch Compact: Device Ready
 		*/
 		DEBUG_TRACE (DEBUG::MackieControl, string_compose ("Behringer X-Touch Compact ready, current status = %1\n", _active));
@@ -711,6 +719,7 @@ Surface::handle_midi_sysex (MIDI::Parser &, MIDI::byte * raw_bytes, size_t count
 		break;
 
 	case 0x03: /* LCP Connection Confirmation */
+		DEBUG_TRACE (DEBUG::MackieControl, string_compose ("handle_midi_sysex: %1\n", bytes));
 		DEBUG_TRACE (DEBUG::MackieControl, "Logic Control Device confirms connection, ardour replies\n");
 		if (bytes[4] == 0x10 || bytes[4] == 0x11) {
 			write_sysex (host_connection_confirmation (bytes));
@@ -719,11 +728,13 @@ Surface::handle_midi_sysex (MIDI::Parser &, MIDI::byte * raw_bytes, size_t count
 		break;
 
 	case 0x04: /* LCP: Confirmation Denied */
+		DEBUG_TRACE (DEBUG::MackieControl, string_compose ("handle_midi_sysex: %1\n", bytes));
 		DEBUG_TRACE (DEBUG::MackieControl, "Logic Control Device denies connection\n");
 		_active = false;
 		break;
 
 	default:
+		DEBUG_TRACE (DEBUG::MackieControl, string_compose ("handle_midi_sysex: %1\n", bytes));
 		DEBUG_TRACE (DEBUG::MackieControl, string_compose ("unknown device ID byte %1", (int) bytes[5]));
 		error << "MCP: unknown sysex: " << bytes << endmsg;
 	}
@@ -930,28 +941,29 @@ Surface::write (const MidiByteArray& data)
 }
 
 void
-Surface::map_routes (const vector<boost::shared_ptr<Route> >& routes)
+Surface::map_stripables (const vector<boost::shared_ptr<Stripable> >& stripables)
 {
-	vector<boost::shared_ptr<Route> >::const_iterator r;
+	vector<boost::shared_ptr<Stripable> >::const_iterator r;
 	Strips::iterator s = strips.begin();
 
-	DEBUG_TRACE (DEBUG::MackieControl, string_compose ("Mapping %1 routes\n", routes.size()));
+	DEBUG_TRACE (DEBUG::MackieControl, string_compose ("Mapping %1 stripables to %2 strips\n", stripables.size(), strips.size()));
 
-	for (r = routes.begin(); r != routes.end() && s != strips.end(); ++s) {
+	for (r = stripables.begin(); r != stripables.end() && s != strips.end(); ++s) {
 
-		/* don't try to assign routes to a locked strip. it won't
+		/* don't try to assign stripables to a locked strip. it won't
 		   use it anyway, but if we do, then we get out of sync
 		   with the proposed mapping.
 		*/
 
 		if (!(*s)->locked()) {
-			(*s)->set_route (*r);
+			(*s)->set_stripable (*r);
 			++r;
 		}
 	}
 
 	for (; s != strips.end(); ++s) {
-		(*s)->set_route (boost::shared_ptr<Route>());
+		DEBUG_TRACE (DEBUG::MackieControl, string_compose ("strip %1 being set to null stripable\n", (*s)->index()));
+		(*s)->set_stripable (boost::shared_ptr<Stripable>());
 	}
 }
 
@@ -1139,14 +1151,6 @@ Surface::update_view_mode_display (bool with_helpful_text)
 }
 
 void
-Surface::gui_selection_changed (const ARDOUR::StrongRouteNotificationList& routes)
-{
-	for (Strips::iterator s = strips.begin(); s != strips.end(); ++s) {
-		(*s)->gui_selection_changed (routes);
-	}
-}
-
-void
 Surface::say_hello ()
 {
 	/* wakeup for Mackie Control */
@@ -1171,10 +1175,10 @@ Surface::set_jog_mode (JogWheel::Mode)
 }
 
 bool
-Surface::route_is_locked_to_strip (boost::shared_ptr<Route> r) const
+Surface::stripable_is_locked_to_strip (boost::shared_ptr<Stripable> stripable) const
 {
 	for (Strips::const_iterator s = strips.begin(); s != strips.end(); ++s) {
-		if ((*s)->route() == r && (*s)->locked()) {
+		if ((*s)->stripable() == stripable && (*s)->locked()) {
 			return true;
 		}
 	}
@@ -1182,10 +1186,10 @@ Surface::route_is_locked_to_strip (boost::shared_ptr<Route> r) const
 }
 
 bool
-Surface::route_is_mapped (boost::shared_ptr<Route> r) const
+Surface::stripable_is_mapped (boost::shared_ptr<Stripable> stripable) const
 {
 	for (Strips::const_iterator s = strips.begin(); s != strips.end(); ++s) {
-		if ((*s)->route() == r) {
+		if ((*s)->stripable() == stripable) {
 			return true;
 		}
 	}
diff --git a/libs/surfaces/mackie/surface.h b/libs/surfaces/mackie/surface.h
index ba79f40..3225e23 100644
--- a/libs/surfaces/mackie/surface.h
+++ b/libs/surfaces/mackie/surface.h
@@ -22,7 +22,7 @@ namespace MIDI {
 }
 
 namespace ARDOUR {
-	class Route;
+	class Stripable;
 	class Port;
 }
 
@@ -79,8 +79,8 @@ public:
 	uint32_t n_strips (bool with_locked_strips = true) const;
 	Strip* nth_strip (uint32_t n) const;
 
-	bool route_is_locked_to_strip (boost::shared_ptr<ARDOUR::Route>) const;
-	bool route_is_mapped (boost::shared_ptr<ARDOUR::Route>) const;
+	bool stripable_is_locked_to_strip (boost::shared_ptr<ARDOUR::Stripable>) const;
+	bool stripable_is_mapped (boost::shared_ptr<ARDOUR::Stripable>) const;
 
 	/// This collection owns the groups
 	typedef std::map<std::string,Group*> Groups;
@@ -88,7 +88,7 @@ public:
 
 	SurfacePort& port() const { return *_port; }
 
-	void map_routes (const std::vector<boost::shared_ptr<ARDOUR::Route> >& routes);
+	void map_stripables (const std::vector<boost::shared_ptr<ARDOUR::Stripable> >&);
 
 	const MidiByteArray& sysex_hdr() const;
 
@@ -155,7 +155,6 @@ public:
 	void update_view_mode_display (bool with_helpful_text);
 	void update_flip_mode_display ();
 
-	void gui_selection_changed (const ARDOUR::StrongRouteNotificationList&);
 	void subview_mode_changed ();
 
 	MackieControlProtocol& mcp() const { return _mcp; }
diff --git a/libs/surfaces/mackie/surface_port.cc b/libs/surfaces/mackie/surface_port.cc
index 6f6500f..ddc5a7b 100644
--- a/libs/surfaces/mackie/surface_port.cc
+++ b/libs/surfaces/mackie/surface_port.cc
@@ -41,7 +41,7 @@
 #include "surface.h"
 #include "surface_port.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace PBD;
diff --git a/libs/surfaces/mackie/wscript b/libs/surfaces/mackie/wscript
index 7657d76..b797b4a 100644
--- a/libs/surfaces/mackie/wscript
+++ b/libs/surfaces/mackie/wscript
@@ -41,7 +41,7 @@ def build(bld):
     obj.includes     = [ '.' ]
     obj.name         = 'libardour_mcp'
     obj.target       = 'ardour_mcp'
-    obj.uselib       = 'GTKMM'
+    obj.uselib       = 'GTKMM XML'
     obj.use          = 'libardour libardour_cp libgtkmm2ext'
     obj.install_path = os.path.join(bld.env['LIBDIR'], 'surfaces')
 
diff --git a/libs/surfaces/osc/MSVCardour_osc/ardour_osc.vcproj b/libs/surfaces/osc/MSVCardour_osc/ardour_osc.vcproj
index c542d23..b3faa4b 100644
--- a/libs/surfaces/osc/MSVCardour_osc/ardour_osc.vcproj
+++ b/libs/surfaces/osc/MSVCardour_osc/ardour_osc.vcproj
@@ -41,8 +41,8 @@
 				Name="VCCLCompilerTool"
 				AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
 				Optimization="0"
-				AdditionalIncludeDirectories="..;..\..\..\ardour;..\..\..\pbd;..\..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\..\surfaces\control_protocol;..\..\..\gtkmm2ext;..\..\..\evoral;..\..\..\libltc;..\..\..\timecode;..\..\..\rubberband;"..\..\..\vamp-sdk";"..\..\..\midi++2";..\..\..\taglib;..\..\..\taglib\taglib;..\..\..\taglib\taglib\toolkit;..\..\..\audiographer;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor""
-				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;BUILDING_OSC;ARDOURSURFACE_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_DEBUG;DEBUG="Debug";ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"ardour_osc\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+				AdditionalIncludeDirectories="..;..\..\..\ardour;..\..\..\pbd;..\..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\..\surfaces\control_protocol;..\..\..\gtkmm2ext;..\..\..\evoral;..\..\..\libltc;..\..\..\timecode;..\..\..\rubberband;"..\..\..\vamp-sdk";"..\..\..\midi++2";..\..\..\taglib;..\..\..\taglib\taglib;..\..\..\taglib\taglib\toolkit;..\..\..\audiographer;..\..\..\lua;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor""
+				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;BUILDING_OSC;ARDOURSURFACE_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_DEBUG;DEBUG="Debug";ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"ardour_osc\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
 				MinimalRebuild="true"
 				RuntimeLibrary="3"
 				WarningLevel="3"
@@ -60,7 +60,7 @@
 			/>
 			<Tool
 				Name="VCLinkerTool"
-				AdditionalDependencies="$(DllPrefix)glibmm32$(GlibmmDllSuffix)D.lib $(DllPrefix)giomm32$(GlibmmDllSuffix)D.lib $(DllPrefix)gtkmm32$(GtkmmDllSuffix)D.lib $(DllPrefix)gdkmm32$(GtkmmDllSuffix)D.lib $(DllPrefix)pangomm32$(PangommDllSuffix)D.lib $(DllPrefix)cairomm32$(CairommDllSuffix)D.lib pthreadVCE2.lib $(DllPrefix)gthread32$(GlibDllSuffix)D.lib $(DllPrefix)gobject32$(GlibDllSuffix)D.lib $(DllPrefix)gmodule32$(GlibDllSuffix)D.lib $(DllPrefix)glib32$(GlibDllSuffix)D.lib $(DllPrefix)gio32$(GlibDllSuffix)D.lib $(DllPrefix)gtk32$(GtkDllSuffix)D.lib $(DllPrefix)gdk32$(GtkDllSuffix)D.lib $(DllPrefix)gdk-pixbuf32$(GdkPixbufDllSuffix)D.lib $(DllPrefix)cairo32$(CairoDllSuffix)D.lib $(DllPrefix)pango32$(PangoDllSuffix)D.lib $(DllPrefix)pangocairo32$(PangoDllSuffix)D.lib $(DllPrefix)sigc++32-2.0D.lib $(DllPrefix)ardour32D.lib $(DllPrefix)ardour_cp32D.lib $(DllPrefix)midi++32D.lib $(DllPrefix)pbd32D.lib $(DllPrefix)evoral32D.lib libloD.lib intlD.lib ws2_32.lib psapi.lib iphlpapi.lib wininet.lib kernel32.lib shell32.lib winmm.lib"
+				AdditionalDependencies="$(DllPrefix)glibmm32$(GlibmmDllSuffix)D.lib $(DllPrefix)giomm32$(GlibmmDllSuffix)D.lib $(DllPrefix)gtkmm32$(GtkmmDllSuffix)D.lib $(DllPrefix)gdkmm32$(GtkmmDllSuffix)D.lib $(DllPrefix)pangomm32$(PangommDllSuffix)D.lib $(DllPrefix)cairomm32$(CairommDllSuffix)D.lib pthreadVCE2.lib $(DllPrefix)gthread32$(GlibDllSuffix)D.lib $(DllPrefix)gobject32$(GlibDllSuffix)D.lib $(DllPrefix)gmodule32$(GlibDllSuffix)D.lib $(DllPrefix)glib32$(GlibDllSuffix)D.lib $(DllPrefix)gio32$(GlibDllSuffix)D.lib $(DllPrefix)gtk32$(GtkDllSuffix)D.lib $(DllPrefix)gdk32$(GtkDllSuffix)D.lib $(DllPrefix)gdk-pixbuf32$(GdkPixbufDllSuffix)D.lib $(DllPrefix)cairo32$(CairoDllSuffix)D.lib $(DllPrefix)pango32$(PangoDllSuffix)D.lib $(DllPrefix)pangocairo32$(PangoDllSuffix)D.lib $(DllPrefix)sigc++32-2.0D.lib $(DllPrefix)timecode32D.lib $(DllPrefix)ardour32D.lib $(DllPrefix)ardour_cp32D.lib $(DllPrefix)midi++32D.lib $(DllPrefix)pbd32D.lib $(DllPrefix)evoral32D.lib libloD.lib intlD.lib ws2_32.lib psapi.lib iphlpapi.lib wininet.lib kernel32.lib shell32.lib winmm.lib"
 				OutputFile="$(OutDir)\$(DllPrefix)$(ProjectName)32D.dll"
 				AdditionalLibraryDirectories="F:\pthread-win32\Pre-built.2\lib"
 				IgnoreDefaultLibraryNames="libboost_regex-vc80-mt-gd-1_40.lib;msvcrt.lib;dsound.lib"
@@ -123,8 +123,8 @@
 				AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
 				Optimization="2"
 				InlineFunctionExpansion="1"
-				AdditionalIncludeDirectories="..;..\..\..\ardour;..\..\..\pbd;..\..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\..\surfaces\control_protocol;..\..\..\gtkmm2ext;..\..\..\evoral;..\..\..\libltc;..\..\..\timecode;..\..\..\rubberband;"..\..\..\vamp-sdk";"..\..\..\midi++2";..\..\..\taglib;..\..\..\taglib\taglib;..\..\..\taglib\taglib\toolkit;..\..\..\audiographer;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor""
-				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_OSC;ARDOURSURFACE_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;NDEBUG;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"ardour_osc\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+				AdditionalIncludeDirectories="..;..\..\..\ardour;..\..\..\pbd;..\..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\..\surfaces\control_protocol;..\..\..\gtkmm2ext;..\..\..\evoral;..\..\..\libltc;..\..\..\timecode;..\..\..\rubberband;"..\..\..\vamp-sdk";"..\..\..\midi++2";..\..\..\taglib;..\..\..\taglib\taglib;..\..\..\taglib\taglib\toolkit;..\..\..\audiographer;..\..\..\lua;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor""
+				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_OSC;ARDOURSURFACE_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;NDEBUG;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"ardour_osc\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
 				StringPooling="false"
 				RuntimeLibrary="2"
 				EnableEnhancedInstructionSet="1"
@@ -142,7 +142,7 @@
 			/>
 			<Tool
 				Name="VCLinkerTool"
-				AdditionalDependencies="$(DllPrefix)glibmm32$(GlibmmDllSuffix).lib $(DllPrefix)giomm32$(GlibmmDllSuffix).lib $(DllPrefix)gtkmm32$(GtkmmDllSuffix).lib $(DllPrefix)gdkmm32$(GtkmmDllSuffix).lib $(DllPrefix)pangomm32$(PangommDllSuffix).lib $(DllPrefix)cairomm32$(CairommDllSuffix).lib pthreadVCE2.lib $(DllPrefix)gthread32$(GlibDllSuffix).lib $(DllPrefix)gobject32$(GlibDllSuffix).lib $(DllPrefix)gmodule32$(GlibDllSuffix).lib $(DllPrefix)glib32$(GlibDllSuffix).lib $(DllPrefix)gio32$(GlibDllSuffix).lib $(DllPrefix)gtk32$(GtkDllSuffix).lib $(DllPrefix)gdk32$(GtkDllSuffix).lib $(DllPrefix)gdk-pixbuf32$(GdkPixbufDllSuffix).lib $(DllPrefix)cairo32$(CairoDllSuffix).lib $(DllPrefix)pango32$(PangoDllSuffix).lib $(DllPrefix)pangocairo32$(PangoDllSuffix).lib $(DllPrefix)sigc++32-2.0.lib $(DllPrefix)ardour32.lib $(DllPrefix)ardour_cp32.lib $(DllPrefix)midi++32.lib $(DllPrefix)pbd32.lib $(DllPrefix)evoral32.lib liblo.lib intl.lib ws2_32.lib psapi.lib iphlpapi.lib wininet.lib kernel32.lib shell32.lib winmm.lib"
+				AdditionalDependencies="$(DllPrefix)glibmm32$(GlibmmDllSuffix).lib $(DllPrefix)giomm32$(GlibmmDllSuffix).lib $(DllPrefix)gtkmm32$(GtkmmDllSuffix).lib $(DllPrefix)gdkmm32$(GtkmmDllSuffix).lib $(DllPrefix)pangomm32$(PangommDllSuffix).lib $(DllPrefix)cairomm32$(CairommDllSuffix).lib pthreadVCE2.lib $(DllPrefix)gthread32$(GlibDllSuffix).lib $(DllPrefix)gobject32$(GlibDllSuffix).lib $(DllPrefix)gmodule32$(GlibDllSuffix).lib $(DllPrefix)glib32$(GlibDllSuffix).lib $(DllPrefix)gio32$(GlibDllSuffix).lib $(DllPrefix)gtk32$(GtkDllSuffix).lib $(DllPrefix)gdk32$(GtkDllSuffix).lib $(DllPrefix)gdk-pixbuf32$(GdkPixbufDllSuffix).lib $(DllPrefix)cairo32$(CairoDllSuffix).lib $(DllPrefix)pango32$(PangoDllSuffix).lib $(DllPrefix)pangocairo32$(PangoDllSuffix).lib $(DllPrefix)sigc++32-2.0.lib $(DllPrefix)timecode32.lib $(DllPrefix)ardour32.lib $(DllPrefix)ardour_cp32.lib $(DllPrefix)midi++32.lib $(DllPrefix)pbd32.lib $(DllPrefix)evoral32.lib liblo.lib intl.lib ws2_32.lib psapi.lib iphlpapi.lib wininet.lib kernel32.lib shell32.lib winmm.lib"
 				OutputFile="$(OutDir)\$(DllPrefix)$(ProjectName)32.dll"
 				AdditionalLibraryDirectories="F:\pthread-win32\Pre-built.2\lib"
 				IgnoreDefaultLibraryNames="libboost_regex-vc80-mt-gd-1_40.lib;dsound.lib"
@@ -204,8 +204,8 @@
 				Name="VCCLCompilerTool"
 				AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
 				Optimization="0"
-				AdditionalIncludeDirectories="..;..\..\..\ardour;..\..\..\pbd;..\..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\..\surfaces\control_protocol;..\..\..\gtkmm2ext;..\..\..\evoral;..\..\..\libltc;..\..\..\timecode;..\..\..\rubberband;"..\..\..\vamp-sdk";"..\..\..\midi++2";..\..\..\taglib;..\..\..\taglib\taglib;..\..\..\taglib\taglib\toolkit;..\..\..\audiographer;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor""
-				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_OSC;ARDOURSURFACE_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"ardour_osc\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+				AdditionalIncludeDirectories="..;..\..\..\ardour;..\..\..\pbd;..\..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\..\surfaces\control_protocol;..\..\..\gtkmm2ext;..\..\..\evoral;..\..\..\libltc;..\..\..\timecode;..\..\..\rubberband;"..\..\..\vamp-sdk";"..\..\..\midi++2";..\..\..\taglib;..\..\..\taglib\taglib;..\..\..\taglib\taglib\toolkit;..\..\..\audiographer;..\..\..\lua;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\freetype2";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor""
+				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_OSC;ARDOURSURFACE_DLL_EXPORTS;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PROGRAM_NAME="\"Mixbus3\"";PACKAGE="\"ardour_osc\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
 				StringPooling="false"
 				RuntimeLibrary="2"
 				EnableEnhancedInstructionSet="1"
@@ -224,7 +224,7 @@
 			/>
 			<Tool
 				Name="VCLinkerTool"
-				AdditionalDependencies="$(DllPrefix)glibmm32$(GlibmmDllSuffix)RDC.lib $(DllPrefix)giomm32$(GlibmmDllSuffix)RDC.lib $(DllPrefix)gtkmm32$(GtkmmDllSuffix)RDC.lib $(DllPrefix)gdkmm32$(GtkmmDllSuffix)RDC.lib $(DllPrefix)pangomm32$(PangommDllSuffix)RDC.lib $(DllPrefix)cairomm32$(CairommDllSuffix)RDC.lib pthreadVCE2.lib $(DllPrefix)gthread32$(GlibDllSuffix)RDC.lib $(DllPrefix)gobject32$(GlibDllSuffix)RDC.lib $(DllPrefix)gmodule32$(GlibDllSuffix)RDC.lib $(DllPrefix)glib32$(GlibDllSuffix)RDC.lib $(DllPrefix)gio32$(GlibDllSuffix)RDC.lib $(DllPrefix)gtk32$(GtkDllSuffix)RDC.lib $(DllPrefix)gdk32$(GtkDllSuffix)RDC.lib $(DllPrefix)gdk-pixbuf32$(GdkPixbufDllSuffix)RDC.lib $(DllPrefix)cairo32$(CairoDllSuffix)RDC.lib $(DllPrefix)pango32$(PangoDllSuffix)RDC.lib $(DllPrefix)pangocairo32$(PangoDllSuffix)RDC.lib $(DllPrefix)sigc++32-2.0RDC.lib $(DllPrefix)ardour32RDC.lib $(DllPrefix)ardour_cp32RDC.lib $(DllPrefix)midi++32RDC.lib $(DllPrefix)pbd32RDC.lib $(DllPrefix)evoral32RDC.lib libloRDC.lib intlRDC.lib ws2_32.lib psapi.lib iphlpapi.lib wininet.lib kernel32.lib shell32.lib winmm.lib"
+				AdditionalDependencies="$(DllPrefix)glibmm32$(GlibmmDllSuffix)RDC.lib $(DllPrefix)giomm32$(GlibmmDllSuffix)RDC.lib $(DllPrefix)gtkmm32$(GtkmmDllSuffix)RDC.lib $(DllPrefix)gdkmm32$(GtkmmDllSuffix)RDC.lib $(DllPrefix)pangomm32$(PangommDllSuffix)RDC.lib $(DllPrefix)cairomm32$(CairommDllSuffix)RDC.lib pthreadVCE2.lib $(DllPrefix)gthread32$(GlibDllSuffix)RDC.lib $(DllPrefix)gobject32$(GlibDllSuffix)RDC.lib $(DllPrefix)gmodule32$(GlibDllSuffix)RDC.lib $(DllPrefix)glib32$(GlibDllSuffix)RDC.lib $(DllPrefix)gio32$(GlibDllSuffix)RDC.lib $(DllPrefix)gtk32$(GtkDllSuffix)RDC.lib $(DllPrefix)gdk32$(GtkDllSuffix)RDC.lib $(DllPrefix)gdk-pixbuf32$(GdkPixbufDllSuffix)RDC.lib $(DllPrefix)cairo32$(CairoDllSuffix)RDC.lib $(DllPrefix)pango32$(PangoDllSuffix)RDC.lib $(DllPrefix)pangocairo32$(PangoDllSuffix)RDC.lib $(DllPrefix)sigc++32-2.0RDC.lib $(DllPrefix)timecode32RDC.lib $(DllPrefix)ardour32RDC.lib $(DllPrefix)ardour_cp32RDC.lib $(DllPrefix)midi++32RDC.lib $(DllPrefix)pbd32RDC.lib $(DllPrefix)evoral32RDC.lib libloRDC.lib intlRDC.lib ws2_32.lib psapi.lib iphlpapi.lib wininet.lib kernel32.lib shell32.lib winmm.lib"
 				OutputFile="$(OutDir)\$(DllPrefix)$(ProjectName)32RDC.dll"
 				AdditionalLibraryDirectories="F:\pthread-win32\Pre-built.2\lib"
 				IgnoreDefaultLibraryNames="libboost_regex-vc80-mt-gd-1_40.lib;dsound.lib"
@@ -280,6 +280,10 @@
 				>
 			</File>
 			<File
+				RelativePath="..\osc_global_observer.cc"
+				>
+			</File>
+			<File
 				RelativePath="..\osc_gui.cc"
 				>
 			</File>
@@ -287,6 +291,10 @@
 				RelativePath="..\osc_route_observer.cc"
 				>
 			</File>
+			<File
+				RelativePath="..\osc_select_observer.cc"
+				>
+			</File>
 		</Filter>
 		<Filter
 			Name="Header Files"
@@ -302,9 +310,17 @@
 				>
 			</File>
 			<File
+				RelativePath="..\osc_global_observer.h"
+				>
+			</File>
+			<File
 				RelativePath="..\osc_route_observer.h"
 				>
 			</File>
+			<File
+				RelativePath="..\osc_select_observer.h"
+				>
+			</File>
 		</Filter>
 		<Filter
 			Name="Resource Files"
@@ -312,7 +328,7 @@
 			UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
 			>
 			<File
-				RelativePath="..\..\..\..\icons\win32\msvc_resources.rc"
+				RelativePath="..\..\..\..\gtk2_ardour\win32\msvc_resources.rc"
 				>
 			</File>
 		</Filter>
diff --git a/libs/surfaces/osc/osc.cc b/libs/surfaces/osc/osc.cc
index f51da26..74f3212 100644
--- a/libs/surfaces/osc/osc.cc
+++ b/libs/surfaces/osc/osc.cc
@@ -26,7 +26,7 @@
 #include <fcntl.h>
 
 #include "pbd/gstdio_compat.h"
-#include <glibmm/miscutils.h>
+#include <glibmm.h>
 
 #include <pbd/convert.h>
 #include <pbd/pthread_utils.h>
@@ -38,17 +38,25 @@
 #include "ardour/route.h"
 #include "ardour/audio_track.h"
 #include "ardour/midi_track.h"
+#include "ardour/monitor_control.h"
 #include "ardour/dB.h"
 #include "ardour/filesystem_paths.h"
 #include "ardour/panner.h"
 #include "ardour/plugin.h"
 #include "ardour/plugin_insert.h"
+#include "ardour/presentation_info.h"
 #include "ardour/send.h"
+#include "ardour/phase_control.h"
+#include "ardour/solo_isolate_control.h"
+#include "ardour/solo_safe_control.h"
+#include "ardour/vca_manager.h"
 
+#include "osc_select_observer.h"
 #include "osc.h"
 #include "osc_controllable.h"
 #include "osc_route_observer.h"
-#include "i18n.h"
+#include "osc_global_observer.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 using namespace std;
@@ -81,9 +89,10 @@ OSC::OSC (Session& s, uint32_t port)
 	, _shutdown (false)
 	, _osc_server (0)
 	, _osc_unix_server (0)
-	, _namespace_root ("/ardour")
 	, _send_route_changes (true)
 	, _debugmode (Off)
+	, tick (true)
+	, bank_dirty (false)
 	, gui (0)
 {
 	_instance = this;
@@ -234,6 +243,25 @@ OSC::start ()
 
 	BaseUI::run ();
 
+	// start timers for metering, timecode and heartbeat.
+	// timecode and metering run at 100
+	Glib::RefPtr<Glib::TimeoutSource> periodic_timeout = Glib::TimeoutSource::create (100); // milliseconds
+	periodic_connection = periodic_timeout->connect (sigc::mem_fun (*this, &OSC::periodic));
+	periodic_timeout->attach (main_loop()->get_context());
+
+	// catch changes to selection for GUI_select mode
+	StripableSelectionChanged.connect (session_connections, MISSING_INVALIDATOR, boost::bind (&OSC::gui_selection_changed, this), this);
+
+	// catch track reordering
+	// receive routes added
+	session->RouteAdded.connect(session_connections, MISSING_INVALIDATOR, boost::bind (&OSC::notify_routes_added, this, _1), this);
+	// receive VCAs added
+	session->vca_manager().VCAAdded.connect(session_connections, MISSING_INVALIDATOR, boost::bind (&OSC::notify_vca_added, this, _1), this);
+	// order changed
+	PresentationInfo::Change.connect (session_connections, MISSING_INVALIDATOR, boost::bind (&OSC::recalcbanks, this), this);
+
+	_select = boost::shared_ptr<Stripable>();
+
 	return 0;
 }
 
@@ -251,7 +279,12 @@ OSC::thread_init ()
 	}
 
 	if (_osc_server) {
+#ifdef PLATFORM_WINDOWS
+		Glib::RefPtr<IOChannel> chan = Glib::IOChannel::create_from_win32_socket (lo_server_get_socket_fd (_osc_server));
+		Glib::RefPtr<IOSource> src  = IOSource::create (chan, IO_IN|IO_HUP|IO_ERR);
+#else
 		Glib::RefPtr<IOSource> src  = IOSource::create (lo_server_get_socket_fd (_osc_server), IO_IN|IO_HUP|IO_ERR);
+#endif
 		src->connect (sigc::bind (sigc::mem_fun (*this, &OSC::osc_input_handler), _osc_server));
 		src->attach (_main_loop->get_context());
 		remote_server = src->gobj();
@@ -299,6 +332,8 @@ OSC::stop ()
 		::g_unlink (_osc_url_file.c_str() );
 	}
 
+	periodic_connection.disconnect ();
+	session_connections.drop_connections ();
 	// Delete any active route observers
 	for (RouteObservers::iterator x = route_observers.begin(); x != route_observers.end();) {
 
@@ -311,6 +346,26 @@ OSC::stop ()
 			++x;
 		}
 	}
+// Should maybe do global_observers too
+	for (GlobalObservers::iterator x = global_observers.begin(); x != global_observers.end();) {
+
+		OSCGlobalObserver* gc;
+
+		if ((gc = dynamic_cast<OSCGlobalObserver*>(*x)) != 0) {
+			delete *x;
+			x = global_observers.erase (x);
+		} else {
+			++x;
+		}
+	}
+// delete select observers
+	for (uint32_t it = 0; it < _surface.size(); ++it) {
+		OSCSurface* sur = &_surface[it];
+		OSCSelectObserver* so;
+		if ((so = dynamic_cast<OSCSelectObserver*>(sur->sel_obs)) != 0) {
+			delete so;
+		}
+	}
 
 	return 0;
 }
@@ -335,151 +390,204 @@ OSC::register_callbacks()
 
 #define REGISTER_CALLBACK(serv,path,types, function) lo_server_add_method (serv, path, types, OSC::_ ## function, this)
 
-		REGISTER_CALLBACK (serv, "/routes/list", "", routes_list);
-		REGISTER_CALLBACK (serv, "/ardour/add_marker", "", add_marker);
-		REGISTER_CALLBACK (serv, "/ardour/access_action", "s", access_action);
-		REGISTER_CALLBACK (serv, "/ardour/loop_toggle", "", loop_toggle);
-		REGISTER_CALLBACK (serv, "/ardour/loop_location", "ii", loop_location);
-		REGISTER_CALLBACK (serv, "/ardour/goto_start", "", goto_start);
-		REGISTER_CALLBACK (serv, "/ardour/goto_end", "", goto_end);
-		REGISTER_CALLBACK (serv, "/ardour/rewind", "", rewind);
-		REGISTER_CALLBACK (serv, "/ardour/ffwd", "", ffwd);
-		REGISTER_CALLBACK (serv, "/ardour/transport_stop", "", transport_stop);
-		REGISTER_CALLBACK (serv, "/ardour/transport_play", "", transport_play);
-		REGISTER_CALLBACK (serv, "/ardour/transport_frame", "", transport_frame);
-		REGISTER_CALLBACK (serv, "/ardour/transport_speed", "", transport_speed);
-		REGISTER_CALLBACK (serv, "/ardour/record_enabled", "", record_enabled);
-		REGISTER_CALLBACK (serv, "/ardour/set_transport_speed", "f", set_transport_speed);
-		REGISTER_CALLBACK (serv, "/ardour/locate", "ii", locate);
-		REGISTER_CALLBACK (serv, "/ardour/save_state", "", save_state);
-		REGISTER_CALLBACK (serv, "/ardour/prev_marker", "", prev_marker);
-		REGISTER_CALLBACK (serv, "/ardour/next_marker", "", next_marker);
-		REGISTER_CALLBACK (serv, "/ardour/undo", "", undo);
-		REGISTER_CALLBACK (serv, "/ardour/redo", "", redo);
-		REGISTER_CALLBACK (serv, "/ardour/toggle_punch_in", "", toggle_punch_in);
-		REGISTER_CALLBACK (serv, "/ardour/toggle_punch_out", "", toggle_punch_out);
-		REGISTER_CALLBACK (serv, "/ardour/rec_enable_toggle", "", rec_enable_toggle);
-		REGISTER_CALLBACK (serv, "/ardour/toggle_all_rec_enables", "", toggle_all_rec_enables);
-		REGISTER_CALLBACK (serv, "/ardour/all_tracks_rec_in", "f", all_tracks_rec_in);
-		REGISTER_CALLBACK (serv, "/ardour/all_tracks_rec_out", "f", all_tracks_rec_out);
-		REGISTER_CALLBACK (serv, "/ardour/remove_marker", "", remove_marker_at_playhead);
-		REGISTER_CALLBACK (serv, "/ardour/jump_bars", "f", jump_by_bars);
-		REGISTER_CALLBACK (serv, "/ardour/jump_seconds", "f", jump_by_seconds);
-		REGISTER_CALLBACK (serv, "/ardour/mark_in", "", mark_in);
-		REGISTER_CALLBACK (serv, "/ardour/mark_out", "", mark_out);
-		REGISTER_CALLBACK (serv, "/ardour/toggle_click", "", toggle_click);
-		REGISTER_CALLBACK (serv, "/ardour/midi_panic", "", midi_panic);
-		REGISTER_CALLBACK (serv, "/ardour/toggle_roll", "", toggle_roll);
-		REGISTER_CALLBACK (serv, "/ardour/stop_forget", "", stop_forget);
-		REGISTER_CALLBACK (serv, "/ardour/set_punch_range", "", set_punch_range);
-		REGISTER_CALLBACK (serv, "/ardour/set_loop_range", "", set_loop_range);
-		REGISTER_CALLBACK (serv, "/ardour/set_session_range", "", set_session_range);
-		REGISTER_CALLBACK (serv, "/ardour/toggle_monitor_mute", "", toggle_monitor_mute);
-		REGISTER_CALLBACK (serv, "/ardour/toggle_monitor_dim", "", toggle_monitor_dim);
-		REGISTER_CALLBACK (serv, "/ardour/toggle_monitor_mono", "", toggle_monitor_mono);
-		REGISTER_CALLBACK (serv, "/ardour/quick_snapshot_switch", "", quick_snapshot_switch);
-		REGISTER_CALLBACK (serv, "/ardour/quick_snapshot_stay", "", quick_snapshot_stay);
-		REGISTER_CALLBACK (serv, "/ardour/fit_1_track", "", fit_1_track);
-		REGISTER_CALLBACK (serv, "/ardour/fit_2_tracks", "", fit_2_tracks);
-		REGISTER_CALLBACK (serv, "/ardour/fit_4_tracks", "", fit_4_tracks);
-		REGISTER_CALLBACK (serv, "/ardour/fit_8_tracks", "", fit_8_tracks);
-		REGISTER_CALLBACK (serv, "/ardour/fit_16_tracks", "", fit_16_tracks);
-		REGISTER_CALLBACK (serv, "/ardour/fit_32_tracks", "", fit_32_tracks);
-		REGISTER_CALLBACK (serv, "/ardour/fit_all_tracks", "", fit_all_tracks);
-		REGISTER_CALLBACK (serv, "/ardour/zoom_100_ms", "", zoom_100_ms);
-		REGISTER_CALLBACK (serv, "/ardour/zoom_1_sec", "", zoom_1_sec);
-		REGISTER_CALLBACK (serv, "/ardour/zoom_10_sec", "", zoom_10_sec);
-		REGISTER_CALLBACK (serv, "/ardour/zoom_1_min", "", zoom_1_min);
-		REGISTER_CALLBACK (serv, "/ardour/zoom_5_min", "", zoom_5_min);
-		REGISTER_CALLBACK (serv, "/ardour/zoom_10_min", "", zoom_10_min);
-		REGISTER_CALLBACK (serv, "/ardour/zoom_to_session", "", zoom_to_session);
-		REGISTER_CALLBACK (serv, "/ardour/temporal_zoom_in", "f", temporal_zoom_in);
-		REGISTER_CALLBACK (serv, "/ardour/temporal_zoom_out", "f", temporal_zoom_out);
-		REGISTER_CALLBACK (serv, "/ardour/scroll_up_1_track", "f", scroll_up_1_track);
-		REGISTER_CALLBACK (serv, "/ardour/scroll_dn_1_track", "f", scroll_dn_1_track);
-		REGISTER_CALLBACK (serv, "/ardour/scroll_up_1_page", "f", scroll_up_1_page);
-		REGISTER_CALLBACK (serv, "/ardour/scroll_dn_1_page", "f", scroll_dn_1_page);
-
-
-		/*
-		 * NOTE: these messages are provided for (arguably broken) apps
-		 *   that MUST send float args ( TouchOSC and Lemur ).
-		 * Normally these ardour transport messages don't require an argument,
-		 * so we're providing redundant calls with vestigial "float" args.
-		 *
-		 * These controls are active on 1.0 only (to prevent duplicate action on
-		 * press "/button 1", and release "/button 0")
-		 * http://hexler.net/docs/touchosc-controls-reference
-		 */
-		REGISTER_CALLBACK (serv, "/ardour/pushbutton/loop_toggle", "f", loop_toggle);
-		REGISTER_CALLBACK (serv, "/ardour/pushbutton/add_marker", "f", add_marker);
-		REGISTER_CALLBACK (serv, "/ardour/pushbutton/goto_start", "f", goto_start);
-		REGISTER_CALLBACK (serv, "/ardour/pushbutton/goto_end", "f", goto_end);
-		REGISTER_CALLBACK (serv, "/ardour/pushbutton/rewind", "f", rewind);
-		REGISTER_CALLBACK (serv, "/ardour/pushbutton/ffwd", "f", ffwd);
-		REGISTER_CALLBACK (serv, "/ardour/pushbutton/transport_stop", "f", transport_stop);
-		REGISTER_CALLBACK (serv, "/ardour/pushbutton/transport_play", "f", transport_play);
-		REGISTER_CALLBACK (serv, "/ardour/pushbutton/save_state", "f", save_state);
-		REGISTER_CALLBACK (serv, "/ardour/pushbutton/prev_marker", "f", prev_marker);
-		REGISTER_CALLBACK (serv, "/ardour/pushbutton/next_marker", "f", next_marker);
-		REGISTER_CALLBACK (serv, "/ardour/pushbutton/undo", "f", undo);
-		REGISTER_CALLBACK (serv, "/ardour/pushbutton/redo", "f", redo);
-		REGISTER_CALLBACK (serv, "/ardour/pushbutton/toggle_punch_in", "f", toggle_punch_in);
-		REGISTER_CALLBACK (serv, "/ardour/pushbutton/toggle_punch_out", "f", toggle_punch_out);
-		REGISTER_CALLBACK (serv, "/ardour/pushbutton/rec_enable_toggle", "f", rec_enable_toggle);
-		REGISTER_CALLBACK (serv, "/ardour/pushbutton/toggle_all_rec_enables", "f", toggle_all_rec_enables);
-		REGISTER_CALLBACK (serv, "/ardour/pushbutton/all_tracks_rec_in", "f", all_tracks_rec_in);
-		REGISTER_CALLBACK (serv, "/ardour/pushbutton/all_tracks_rec_out", "f", all_tracks_rec_out);
-		REGISTER_CALLBACK (serv, "/ardour/pushbutton/remove_marker", "f", remove_marker_at_playhead);
-		REGISTER_CALLBACK (serv, "/ardour/pushbutton/mark_in", "f", mark_in);
-		REGISTER_CALLBACK (serv, "/ardour/pushbutton/mark_out", "f", mark_out);
-		REGISTER_CALLBACK (serv, "/ardour/pushbutton/toggle_click", "f", toggle_click);
-		REGISTER_CALLBACK (serv, "/ardour/pushbutton/midi_panic", "f", midi_panic);
-		REGISTER_CALLBACK (serv, "/ardour/pushbutton/toggle_roll", "f", toggle_roll);
-		REGISTER_CALLBACK (serv, "/ardour/pushbutton/stop_forget", "f", stop_forget);
-		REGISTER_CALLBACK (serv, "/ardour/pushbutton/set_punch_range", "f", set_punch_range);
-		REGISTER_CALLBACK (serv, "/ardour/pushbutton/set_loop_range", "f", set_loop_range);
-		REGISTER_CALLBACK (serv, "/ardour/pushbutton/set_session_range", "f", set_session_range);
-		REGISTER_CALLBACK (serv, "/ardour/pushbutton/toggle_monitor_mute", "f", toggle_monitor_mute);
-		REGISTER_CALLBACK (serv, "/ardour/pushbutton/toggle_monitor_dim", "f", toggle_monitor_dim);
-		REGISTER_CALLBACK (serv, "/ardour/pushbutton/toggle_monitor_mono", "f", toggle_monitor_mono);
-		REGISTER_CALLBACK (serv, "/ardour/pushbutton/quick_snapshot_switch", "f", quick_snapshot_switch);
-		REGISTER_CALLBACK (serv, "/ardour/pushbutton/quick_snapshot_stay", "f", quick_snapshot_stay);
-		REGISTER_CALLBACK (serv, "/ardour/pushbutton/fit_1_track", "f", fit_1_track);
-		REGISTER_CALLBACK (serv, "/ardour/pushbutton/fit_2_tracks", "f", fit_2_tracks);
-		REGISTER_CALLBACK (serv, "/ardour/pushbutton/fit_4_tracks", "f", fit_4_tracks);
-		REGISTER_CALLBACK (serv, "/ardour/pushbutton/fit_8_tracks", "f", fit_8_tracks);
-		REGISTER_CALLBACK (serv, "/ardour/pushbutton/fit_16_tracks", "f", fit_16_tracks);
-		REGISTER_CALLBACK (serv, "/ardour/pushbutton/fit_32_tracks", "f", fit_32_tracks);
-		REGISTER_CALLBACK (serv, "/ardour/pushbutton/fit_all_tracks", "f", fit_all_tracks);
-		REGISTER_CALLBACK (serv, "/ardour/pushbutton/zoom_100_ms", "f", zoom_100_ms);
-		REGISTER_CALLBACK (serv, "/ardour/pushbutton/zoom_1_sec", "f", zoom_1_sec);
-		REGISTER_CALLBACK (serv, "/ardour/pushbutton/zoom_10_sec", "f", zoom_10_sec);
-		REGISTER_CALLBACK (serv, "/ardour/pushbutton/zoom_1_min", "f", zoom_1_min);
-		REGISTER_CALLBACK (serv, "/ardour/pushbutton/zoom_5_min", "f", zoom_5_min);
-		REGISTER_CALLBACK (serv, "/ardour/pushbutton/zoom_10_min", "f", zoom_10_min);
-		REGISTER_CALLBACK (serv, "/ardour/pushbutton/zoom_to_session", "f", zoom_to_session);
-		REGISTER_CALLBACK (serv, "/ardour/pushbutton/temporal_zoom_in", "f", temporal_zoom_in);
-		REGISTER_CALLBACK (serv, "/ardour/pushbutton/temporal_zoom_out", "f", temporal_zoom_out);
-		REGISTER_CALLBACK (serv, "/ardour/pushbutton/scroll_up_1_track", "f", scroll_up_1_track);
-		REGISTER_CALLBACK (serv, "/ardour/pushbutton/scroll_dn_1_track", "f", scroll_dn_1_track);
-		REGISTER_CALLBACK (serv, "/ardour/pushbutton/scroll_up_1_page", "f", scroll_up_1_page);
-		REGISTER_CALLBACK (serv, "/ardour/pushbutton/scroll_dn_1_page", "f", scroll_dn_1_page);
+		// Some controls have optional "f" for feedback or touchosc
+		// http://hexler.net/docs/touchosc-controls-reference
+
+		REGISTER_CALLBACK (serv, "/set_surface", "iiii", set_surface);
+		REGISTER_CALLBACK (serv, "/set_surface/feedback", "i", set_surface_feedback);
+		REGISTER_CALLBACK (serv, "/set_surface/bank_size", "i", set_surface_bank_size);
+		REGISTER_CALLBACK (serv, "/set_surface/gainmode", "i", set_surface_gainmode);
+		REGISTER_CALLBACK (serv, "/set_surface/strip_types", "i", set_surface_strip_types);
+		REGISTER_CALLBACK (serv, "/strip/list", "", routes_list);
+		REGISTER_CALLBACK (serv, "/add_marker", "", add_marker);
+		REGISTER_CALLBACK (serv, "/add_marker", "f", add_marker);
+		REGISTER_CALLBACK (serv, "/access_action", "s", access_action);
+		REGISTER_CALLBACK (serv, "/loop_toggle", "", loop_toggle);
+		REGISTER_CALLBACK (serv, "/loop_toggle", "f", loop_toggle);
+		REGISTER_CALLBACK (serv, "/loop_location", "ii", loop_location);
+		REGISTER_CALLBACK (serv, "/goto_start", "", goto_start);
+		REGISTER_CALLBACK (serv, "/goto_start", "f", goto_start);
+		REGISTER_CALLBACK (serv, "/goto_end", "", goto_end);
+		REGISTER_CALLBACK (serv, "/goto_end", "f", goto_end);
+		REGISTER_CALLBACK (serv, "/rewind", "", rewind);
+		REGISTER_CALLBACK (serv, "/rewind", "f", rewind);
+		REGISTER_CALLBACK (serv, "/ffwd", "", ffwd);
+		REGISTER_CALLBACK (serv, "/ffwd", "f", ffwd);
+		REGISTER_CALLBACK (serv, "/transport_stop", "", transport_stop);
+		REGISTER_CALLBACK (serv, "/transport_stop", "f", transport_stop);
+		REGISTER_CALLBACK (serv, "/transport_play", "", transport_play);
+		REGISTER_CALLBACK (serv, "/transport_play", "f", transport_play);
+		REGISTER_CALLBACK (serv, "/transport_frame", "", transport_frame);
+		REGISTER_CALLBACK (serv, "/transport_speed", "", transport_speed);
+		REGISTER_CALLBACK (serv, "/record_enabled", "", record_enabled);
+		REGISTER_CALLBACK (serv, "/set_transport_speed", "f", set_transport_speed);
+		// locate ii is position and bool roll
+		REGISTER_CALLBACK (serv, "/locate", "ii", locate);
+		REGISTER_CALLBACK (serv, "/save_state", "", save_state);
+		REGISTER_CALLBACK (serv, "/save_state", "f", save_state);
+		REGISTER_CALLBACK (serv, "/prev_marker", "", prev_marker);
+		REGISTER_CALLBACK (serv, "/prev_marker", "f", prev_marker);
+		REGISTER_CALLBACK (serv, "/next_marker", "", next_marker);
+		REGISTER_CALLBACK (serv, "/next_marker", "f", next_marker);
+		REGISTER_CALLBACK (serv, "/undo", "", undo);
+		REGISTER_CALLBACK (serv, "/undo", "f", undo);
+		REGISTER_CALLBACK (serv, "/redo", "", redo);
+		REGISTER_CALLBACK (serv, "/redo", "f", redo);
+		REGISTER_CALLBACK (serv, "/toggle_punch_in", "", toggle_punch_in);
+		REGISTER_CALLBACK (serv, "/toggle_punch_in", "f", toggle_punch_in);
+		REGISTER_CALLBACK (serv, "/toggle_punch_out", "", toggle_punch_out);
+		REGISTER_CALLBACK (serv, "/toggle_punch_out", "f", toggle_punch_out);
+		REGISTER_CALLBACK (serv, "/rec_enable_toggle", "", rec_enable_toggle);
+		REGISTER_CALLBACK (serv, "/rec_enable_toggle", "f", rec_enable_toggle);
+		REGISTER_CALLBACK (serv, "/toggle_all_rec_enables", "", toggle_all_rec_enables);
+		REGISTER_CALLBACK (serv, "/toggle_all_rec_enables", "f", toggle_all_rec_enables);
+		REGISTER_CALLBACK (serv, "/all_tracks_rec_in", "f", all_tracks_rec_in);
+		REGISTER_CALLBACK (serv, "/all_tracks_rec_out", "f", all_tracks_rec_out);
+		REGISTER_CALLBACK (serv, "/cancel_all_solos", "f", cancel_all_solos);
+		REGISTER_CALLBACK (serv, "/remove_marker", "", remove_marker_at_playhead);
+		REGISTER_CALLBACK (serv, "/remove_marker", "f", remove_marker_at_playhead);
+		REGISTER_CALLBACK (serv, "/jump_bars", "f", jump_by_bars);
+		REGISTER_CALLBACK (serv, "/jump_seconds", "f", jump_by_seconds);
+		REGISTER_CALLBACK (serv, "/mark_in", "", mark_in);
+		REGISTER_CALLBACK (serv, "/mark_in", "f", mark_in);
+		REGISTER_CALLBACK (serv, "/mark_out", "", mark_out);
+		REGISTER_CALLBACK (serv, "/mark_out", "f", mark_out);
+		REGISTER_CALLBACK (serv, "/toggle_click", "", toggle_click);
+		REGISTER_CALLBACK (serv, "/toggle_click", "f", toggle_click);
+		REGISTER_CALLBACK (serv, "/midi_panic", "", midi_panic);
+		REGISTER_CALLBACK (serv, "/midi_panic", "f", midi_panic);
+		REGISTER_CALLBACK (serv, "/toggle_roll", "", toggle_roll);
+		REGISTER_CALLBACK (serv, "/toggle_roll", "f", toggle_roll);
+		REGISTER_CALLBACK (serv, "/stop_forget", "", stop_forget);
+		REGISTER_CALLBACK (serv, "/stop_forget", "f", stop_forget);
+		REGISTER_CALLBACK (serv, "/set_punch_range", "", set_punch_range);
+		REGISTER_CALLBACK (serv, "/set_punch_range", "f", set_punch_range);
+		REGISTER_CALLBACK (serv, "/set_loop_range", "", set_loop_range);
+		REGISTER_CALLBACK (serv, "/set_loop_range", "f", set_loop_range);
+		REGISTER_CALLBACK (serv, "/set_session_range", "", set_session_range);
+		REGISTER_CALLBACK (serv, "/set_session_range", "f", set_session_range);
+		// /toggle_monitor_* not working (comented out)
+		REGISTER_CALLBACK (serv, "/toggle_monitor_mute", "", toggle_monitor_mute);
+		REGISTER_CALLBACK (serv, "/toggle_monitor_mute", "f", toggle_monitor_mute);
+		REGISTER_CALLBACK (serv, "/toggle_monitor_dim", "", toggle_monitor_dim);
+		REGISTER_CALLBACK (serv, "/toggle_monitor_dim", "f", toggle_monitor_dim);
+		REGISTER_CALLBACK (serv, "/toggle_monitor_mono", "", toggle_monitor_mono);
+		REGISTER_CALLBACK (serv, "/toggle_monitor_mono", "f", toggle_monitor_mono);
+		REGISTER_CALLBACK (serv, "/quick_snapshot_switch", "", quick_snapshot_switch);
+		REGISTER_CALLBACK (serv, "/quick_snapshot_switch", "f", quick_snapshot_switch);
+		REGISTER_CALLBACK (serv, "/quick_snapshot_stay", "", quick_snapshot_stay);
+		REGISTER_CALLBACK (serv, "/quick_snapshot_stay", "f", quick_snapshot_stay);
+		REGISTER_CALLBACK (serv, "/fit_1_track", "", fit_1_track);
+		REGISTER_CALLBACK (serv, "/fit_1_track", "f", fit_1_track);
+		REGISTER_CALLBACK (serv, "/fit_2_tracks", "", fit_2_tracks);
+		REGISTER_CALLBACK (serv, "/fit_2_tracks", "f", fit_2_tracks);
+		REGISTER_CALLBACK (serv, "/fit_4_tracks", "", fit_4_tracks);
+		REGISTER_CALLBACK (serv, "/fit_4_tracks", "f", fit_4_tracks);
+		REGISTER_CALLBACK (serv, "/fit_8_tracks", "", fit_8_tracks);
+		REGISTER_CALLBACK (serv, "/fit_8_tracks", "f", fit_8_tracks);
+		REGISTER_CALLBACK (serv, "/fit_16_tracks", "", fit_16_tracks);
+		REGISTER_CALLBACK (serv, "/fit_16_tracks", "f", fit_16_tracks);
+		REGISTER_CALLBACK (serv, "/fit_32_tracks", "", fit_32_tracks);
+		REGISTER_CALLBACK (serv, "/fit_32_tracks", "f", fit_32_tracks);
+		REGISTER_CALLBACK (serv, "/fit_all_tracks", "", fit_all_tracks);
+		REGISTER_CALLBACK (serv, "/fit_all_tracks", "f", fit_all_tracks);
+		REGISTER_CALLBACK (serv, "/zoom_100_ms", "", zoom_100_ms);
+		REGISTER_CALLBACK (serv, "/zoom_100_ms", "f", zoom_100_ms);
+		REGISTER_CALLBACK (serv, "/zoom_1_sec", "", zoom_1_sec);
+		REGISTER_CALLBACK (serv, "/zoom_1_sec", "f", zoom_1_sec);
+		REGISTER_CALLBACK (serv, "/zoom_10_sec", "", zoom_10_sec);
+		REGISTER_CALLBACK (serv, "/zoom_10_sec", "f", zoom_10_sec);
+		REGISTER_CALLBACK (serv, "/zoom_1_min", "", zoom_1_min);
+		REGISTER_CALLBACK (serv, "/zoom_1_min", "f", zoom_1_min);
+		REGISTER_CALLBACK (serv, "/zoom_5_min", "", zoom_5_min);
+		REGISTER_CALLBACK (serv, "/zoom_5_min", "f", zoom_5_min);
+		REGISTER_CALLBACK (serv, "/zoom_10_min", "", zoom_10_min);
+		REGISTER_CALLBACK (serv, "/zoom_10_min", "f", zoom_10_min);
+		REGISTER_CALLBACK (serv, "/zoom_to_session", "", zoom_to_session);
+		REGISTER_CALLBACK (serv, "/zoom_to_session", "f", zoom_to_session);
+		REGISTER_CALLBACK (serv, "/temporal_zoom_in", "f", temporal_zoom_in);
+		REGISTER_CALLBACK (serv, "/temporal_zoom_in", "", temporal_zoom_in);
+		REGISTER_CALLBACK (serv, "/temporal_zoom_out", "", temporal_zoom_out);
+		REGISTER_CALLBACK (serv, "/temporal_zoom_out", "f", temporal_zoom_out);
+		REGISTER_CALLBACK (serv, "/scroll_up_1_track", "f", scroll_up_1_track);
+		REGISTER_CALLBACK (serv, "/scroll_up_1_track", "", scroll_up_1_track);
+		REGISTER_CALLBACK (serv, "/scroll_dn_1_track", "f", scroll_dn_1_track);
+		REGISTER_CALLBACK (serv, "/scroll_dn_1_track", "", scroll_dn_1_track);
+		REGISTER_CALLBACK (serv, "/scroll_up_1_page", "f", scroll_up_1_page);
+		REGISTER_CALLBACK (serv, "/scroll_up_1_page", "", scroll_up_1_page);
+		REGISTER_CALLBACK (serv, "/scroll_dn_1_page", "f", scroll_dn_1_page);
+		REGISTER_CALLBACK (serv, "/scroll_dn_1_page", "", scroll_dn_1_page);
+		REGISTER_CALLBACK (serv, "/bank_up", "", bank_up);
+		REGISTER_CALLBACK (serv, "/bank_up", "f", bank_up);
+		REGISTER_CALLBACK (serv, "/bank_down", "", bank_down);
+		REGISTER_CALLBACK (serv, "/bank_down", "f", bank_down);
+
+		// controls for "special" strips
+		REGISTER_CALLBACK (serv, "/master/gain", "f", master_set_gain);
+		REGISTER_CALLBACK (serv, "/master/fader", "f", master_set_fader);
+		REGISTER_CALLBACK (serv, "/master/mute", "i", master_set_mute);
+		REGISTER_CALLBACK (serv, "/master/trimdB", "f", master_set_trim);
+		REGISTER_CALLBACK (serv, "/master/pan_stereo_position", "f", master_set_pan_stereo_position);
+		REGISTER_CALLBACK (serv, "/monitor/gain", "f", monitor_set_gain);
+		REGISTER_CALLBACK (serv, "/monitor/fader", "f", monitor_set_fader);
+
+		// Controls for the Selected strip
+		REGISTER_CALLBACK (serv, "/select/recenable", "i", sel_recenable);
+		REGISTER_CALLBACK (serv, "/select/record_safe", "i", sel_recsafe);
+		REGISTER_CALLBACK (serv, "/select/mute", "i", sel_mute);
+		REGISTER_CALLBACK (serv, "/select/solo", "i", sel_solo);
+		REGISTER_CALLBACK (serv, "/select/solo_iso", "i", sel_solo_iso);
+		REGISTER_CALLBACK (serv, "/select/solo_safe", "i", sel_solo_safe);
+		REGISTER_CALLBACK (serv, "/select/monitor_input", "i", sel_monitor_input);
+		REGISTER_CALLBACK (serv, "/select/monitor_disk", "i", sel_monitor_disk);
+		REGISTER_CALLBACK (serv, "/select/polarity", "i", sel_phase);
+		REGISTER_CALLBACK (serv, "/select/gain", "f", sel_gain);
+		REGISTER_CALLBACK (serv, "/select/fader", "f", sel_fader);
+		REGISTER_CALLBACK (serv, "/select/trimdB", "f", sel_trim);
+		REGISTER_CALLBACK (serv, "/select/pan_stereo_position", "f", sel_pan_position);
+		REGISTER_CALLBACK (serv, "/select/pan_stereo_width", "f", sel_pan_width);
+		REGISTER_CALLBACK (serv, "/select/send_gain", "if", sel_sendgain);
+		REGISTER_CALLBACK (serv, "/select/send_fader", "if", sel_sendfader);
+		REGISTER_CALLBACK (serv, "/select/send_enable", "if", sel_sendenable);
+		REGISTER_CALLBACK (serv, "/select/expand", "i", sel_expand);
+		REGISTER_CALLBACK (serv, "/select/pan_elevation_position", "f", sel_pan_elevation);
+		REGISTER_CALLBACK (serv, "/select/pan_frontback_position", "f", sel_pan_frontback);
+		REGISTER_CALLBACK (serv, "/select/pan_lfe_control", "f", sel_pan_lfe);
+		REGISTER_CALLBACK (serv, "/select/comp_enable", "f", sel_comp_enable);
+		REGISTER_CALLBACK (serv, "/select/comp_threshold", "f", sel_comp_threshold);
+		REGISTER_CALLBACK (serv, "/select/comp_speed", "f", sel_comp_speed);
+		REGISTER_CALLBACK (serv, "/select/comp_mode", "f", sel_comp_mode);
+		REGISTER_CALLBACK (serv, "/select/comp_makeup", "f", sel_comp_makeup);
+		REGISTER_CALLBACK (serv, "/select/eq_enable", "f", sel_eq_enable);
+		REGISTER_CALLBACK (serv, "/select/eq_hpf", "f", sel_eq_hpf);
+		REGISTER_CALLBACK (serv, "/select/eq_gain", "if", sel_eq_gain);
+		REGISTER_CALLBACK (serv, "/select/eq_freq", "if", sel_eq_freq);
+		REGISTER_CALLBACK (serv, "/select/eq_q", "if", sel_eq_q);
+		REGISTER_CALLBACK (serv, "/select/eq_shape", "if", sel_eq_shape);
 
 		/* These commands require the route index in addition to the arg; TouchOSC (et al) can't use these  */ 
-		REGISTER_CALLBACK (serv, "/ardour/routes/mute", "ii", route_mute);
-		REGISTER_CALLBACK (serv, "/ardour/routes/solo", "ii", route_solo);
-		REGISTER_CALLBACK (serv, "/ardour/routes/recenable", "ii", route_recenable);
-		REGISTER_CALLBACK (serv, "/ardour/routes/gainabs", "if", route_set_gain_abs);
-		REGISTER_CALLBACK (serv, "/ardour/routes/gaindB", "if", route_set_gain_dB);
-		REGISTER_CALLBACK (serv, "/ardour/routes/trimabs", "if", route_set_trim_abs);
-		REGISTER_CALLBACK (serv, "/ardour/routes/trimdB", "if", route_set_trim_dB);
-		REGISTER_CALLBACK (serv, "/ardour/routes/pan_stereo_position", "if", route_set_pan_stereo_position);
-		REGISTER_CALLBACK (serv, "/ardour/routes/pan_stereo_width", "if", route_set_pan_stereo_width);
-		REGISTER_CALLBACK (serv, "/ardour/routes/plugin/parameter", "iiif", route_plugin_parameter);
-		REGISTER_CALLBACK (serv, "/ardour/routes/plugin/parameter/print", "iii", route_plugin_parameter_print);
-		REGISTER_CALLBACK (serv, "/ardour/routes/send/gainabs", "iif", route_set_send_gain_abs);
-		REGISTER_CALLBACK (serv, "/ardour/routes/send/gaindB", "iif", route_set_send_gain_dB);
+		REGISTER_CALLBACK (serv, "/strip/mute", "ii", route_mute);
+		REGISTER_CALLBACK (serv, "/strip/solo", "ii", route_solo);
+		REGISTER_CALLBACK (serv, "/strip/solo_iso", "ii", route_solo_iso);
+		REGISTER_CALLBACK (serv, "/strip/solo_safe", "ii", route_solo_safe);
+		REGISTER_CALLBACK (serv, "/strip/recenable", "ii", route_recenable);
+		REGISTER_CALLBACK (serv, "/strip/record_safe", "ii", route_recsafe);
+		REGISTER_CALLBACK (serv, "/strip/monitor_input", "ii", route_monitor_input);
+		REGISTER_CALLBACK (serv, "/strip/monitor_disk", "ii", route_monitor_disk);
+		REGISTER_CALLBACK (serv, "/strip/expand", "ii", strip_expand);
+		REGISTER_CALLBACK (serv, "/strip/select", "ii", strip_gui_select);
+		REGISTER_CALLBACK (serv, "/strip/polarity", "ii", strip_phase);
+		REGISTER_CALLBACK (serv, "/strip/gain", "if", route_set_gain_dB);
+		REGISTER_CALLBACK (serv, "/strip/fader", "if", route_set_gain_fader);
+		REGISTER_CALLBACK (serv, "/strip/trimdB", "if", route_set_trim_dB);
+		REGISTER_CALLBACK (serv, "/strip/pan_stereo_position", "if", route_set_pan_stereo_position);
+		REGISTER_CALLBACK (serv, "/strip/pan_stereo_width", "if", route_set_pan_stereo_width);
+		REGISTER_CALLBACK (serv, "/strip/plugin/parameter", "iiif", route_plugin_parameter);
+		// prints to cerr only
+		REGISTER_CALLBACK (serv, "/strip/plugin/parameter/print", "iii", route_plugin_parameter_print);
+		REGISTER_CALLBACK (serv, "/strip/send/gain", "iif", route_set_send_gain_dB);
+		REGISTER_CALLBACK (serv, "/strip/send/fader", "iif", route_set_send_fader);
+		REGISTER_CALLBACK (serv, "/strip/send/enable", "iif", route_set_send_enable);
 
 		/* still not-really-standardized query interface */
 		//REGISTER_CALLBACK (serv, "/ardour/*/#current_value", "", current_value);
@@ -543,8 +651,11 @@ OSC::get_unix_server_url()
 }
 
 void
-OSC::listen_to_route (boost::shared_ptr<Route> route, lo_address addr)
+OSC::listen_to_route (boost::shared_ptr<Stripable> strip, lo_address addr)
 {
+	if (!strip) {
+		return;
+	}
 	/* avoid duplicate listens */
 
 	for (RouteObservers::iterator x = route_observers.begin(); x != route_observers.end(); ++x) {
@@ -553,24 +664,34 @@ OSC::listen_to_route (boost::shared_ptr<Route> route, lo_address addr)
 
 		if ((ro = dynamic_cast<OSCRouteObserver*>(*x)) != 0) {
 
-			int res = strcmp(lo_address_get_hostname(ro->address()), lo_address_get_hostname(addr));
+			int res = strcmp(lo_address_get_url(ro->address()), lo_address_get_url(addr));
 
-			if (ro->route() == route && res == 0) {
+			if (ro->strip() == strip && res == 0) {
 				return;
 			}
 		}
 	}
 
-	OSCRouteObserver* o = new OSCRouteObserver (route, addr);
+	OSCSurface *s = get_surface(addr);
+	uint32_t ssid = get_sid (strip, addr);
+	OSCRouteObserver* o = new OSCRouteObserver (strip, addr, ssid, s->gainmode, s->feedback);
 	route_observers.push_back (o);
 
-	route->DropReferences.connect (*this, MISSING_INVALIDATOR, boost::bind (&OSC::drop_route, this, boost::weak_ptr<Route> (route)), this);
+	strip->DropReferences.connect (*this, MISSING_INVALIDATOR, boost::bind (&OSC::route_lost, this, boost::weak_ptr<Stripable> (strip)), this);
+}
+
+void
+OSC::route_lost (boost::weak_ptr<Stripable> wr)
+{
+	tick = false;
+	drop_route (wr);
+	bank_dirty = true;
 }
 
 void
-OSC::drop_route (boost::weak_ptr<Route> wr)
+OSC::drop_route (boost::weak_ptr<Stripable> wr)
 {
-	boost::shared_ptr<Route> r = wr.lock ();
+	boost::shared_ptr<Stripable> r = wr.lock ();
 
 	if (!r) {
 		return;
@@ -582,7 +703,7 @@ OSC::drop_route (boost::weak_ptr<Route> wr)
 
 		if ((rc = dynamic_cast<OSCRouteObserver*>(*x)) != 0) {
 
-			if (rc->route() == r) {
+			if (rc->strip() == r) {
 				delete *x;
 				x = route_observers.erase (x);
 			} else {
@@ -595,7 +716,7 @@ OSC::drop_route (boost::weak_ptr<Route> wr)
 }
 
 void
-OSC::end_listen (boost::shared_ptr<Route> r, lo_address addr)
+OSC::end_listen (boost::shared_ptr<Stripable> r, lo_address addr)
 {
 	RouteObservers::iterator x;
 
@@ -606,9 +727,9 @@ OSC::end_listen (boost::shared_ptr<Route> r, lo_address addr)
 
 		if ((ro = dynamic_cast<OSCRouteObserver*>(*x)) != 0) {
 
-			int res = strcmp(lo_address_get_hostname(ro->address()), lo_address_get_hostname(addr));
+			int res = strcmp(lo_address_get_url(ro->address()), lo_address_get_url(addr));
 
-			if (ro->route() == r && res == 0) {
+			if (ro->strip() == r && res == 0) {
 				delete *x;
 				x = route_observers.erase (x);
 			}
@@ -653,13 +774,13 @@ OSC::send_current_value (const char* path, lo_arg** argv, int argc, lo_message m
 		lo_message_add_string (reply, "bad syntax");
 	} else {
 		id = argv[0]->i;
-		r = session->route_by_remote_id (id);
+		r = session->get_remote_nth_route (id);
 
 		if (!r) {
 			lo_message_add_string (reply, "not found");
 		} else {
 
-			if (strcmp (path, "/routes/state") == 0) {
+			if (strcmp (path, "/strip/state") == 0) {
 
 				if (boost::dynamic_pointer_cast<AudioTrack>(r)) {
 					lo_message_add_string (reply, "AT");
@@ -675,11 +796,11 @@ OSC::send_current_value (const char* path, lo_arg** argv, int argc, lo_message m
 				lo_message_add_int32 (reply, r->muted());
 				lo_message_add_int32 (reply, r->soloed());
 
-			} else if (strcmp (path, "/routes/mute") == 0) {
+			} else if (strcmp (path, "/strip/mute") == 0) {
 
 				lo_message_add_int32 (reply, (float) r->muted());
 
-			} else if (strcmp (path, "/routes/solo") == 0) {
+			} else if (strcmp (path, "/strip/solo") == 0) {
 
 				lo_message_add_int32 (reply, r->soloed());
 			}
@@ -713,7 +834,7 @@ OSC::catchall (const char *path, const char* types, lo_arg **argv, int argc, lo_
 		current_value_query (path, len, argv, argc, msg);
 		ret = 0;
 
-	} else if (strcmp (path, "/routes/listen") == 0) {
+	} else if (strcmp (path, "/strip/listen") == 0) {
 
 		cerr << "set up listener\n";
 
@@ -724,7 +845,7 @@ OSC::catchall (const char *path, const char* types, lo_arg **argv, int argc, lo_
 		} else {
 			for (int n = 0; n < argc; ++n) {
 
-				boost::shared_ptr<Route> r = session->route_by_remote_id (argv[n]->i);
+				boost::shared_ptr<Route> r = session->get_remote_nth_route (argv[n]->i);
 
 				if (!r) {
 					lo_message_add_string (reply, "not found");
@@ -743,11 +864,11 @@ OSC::catchall (const char *path, const char* types, lo_arg **argv, int argc, lo_
 
 		ret = 0;
 
-	} else if (strcmp (path, "/routes/ignore") == 0) {
+	} else if (strcmp (path, "/strip/ignore") == 0) {
 
 		for (int n = 0; n < argc; ++n) {
 
-			boost::shared_ptr<Route> r = session->route_by_remote_id (argv[n]->i);
+			boost::shared_ptr<Route> r = session->get_remote_nth_route (argv[n]->i);
 
 			if (r) {
 				end_listen (r, lo_message_get_source (msg));
@@ -756,31 +877,101 @@ OSC::catchall (const char *path, const char* types, lo_arg **argv, int argc, lo_
 
 		ret = 0;
 	} else if (argc == 1 && types[0] == 'f') { // single float -- probably TouchOSC
-		if (!strncmp (path, "/ardour/routes/gainabs/", 23) && strlen (path) > 23) {
-			int rid = atoi (&path[23]);
-			// use some power-scale mapping??
-			route_set_gain_abs (rid, argv[0]->f);
+		if (!strncmp (path, "/strip/gain/", 12) && strlen (path) > 12) {
+			// in dB
+			int ssid = atoi (&path[12]);
+			route_set_gain_dB (ssid, argv[0]->f, msg);
+			ret = 0;
+		}
+		else if (!strncmp (path, "/strip/fader/", 13) && strlen (path) > 13) {
+			// in fader position
+			int ssid = atoi (&path[13]);
+			route_set_gain_fader (ssid, argv[0]->f, msg);
+			ret = 0;
+		}
+		else if (!strncmp (path, "/strip/trimdB/", 14) && strlen (path) > 14) {
+			int ssid = atoi (&path[14]);
+			route_set_trim_dB (ssid, argv[0]->f, msg);
+			ret = 0;
+		}
+		else if (!strncmp (path, "/strip/pan_stereo_position/", 27) && strlen (path) > 27) {
+			int ssid = atoi (&path[27]);
+			route_set_pan_stereo_position (ssid, argv[0]->f, msg);
+			ret = 0;
+		}
+		else if (!strncmp (path, "/strip/mute/", 12) && strlen (path) > 12) {
+			int ssid = atoi (&path[12]);
+			route_mute (ssid, argv[0]->f == 1.0, msg);
+			ret = 0;
+		}
+		else if (!strncmp (path, "/strip/solo/", 12) && strlen (path) > 12) {
+			int ssid = atoi (&path[12]);
+			route_solo (ssid, argv[0]->f == 1.0, msg);
+			ret = 0;
+		}
+		else if (!strncmp (path, "/strip/monitor_input/", 21) && strlen (path) > 21) {
+			int ssid = atoi (&path[21]);
+			route_monitor_input (ssid, argv[0]->f == 1.0, msg);
+			ret = 0;
+		}
+		else if (!strncmp (path, "/strip/monitor_disk/", 20) && strlen (path) > 20) {
+			int ssid = atoi (&path[20]);
+			route_monitor_disk (ssid, argv[0]->f == 1.0, msg);
+			ret = 0;
+		}
+		else if (!strncmp (path, "/strip/recenable/", 17) && strlen (path) > 17) {
+			int ssid = atoi (&path[17]);
+			route_recenable (ssid, argv[0]->f == 1.0, msg);
+			ret = 0;
+		}
+		else if (!strncmp (path, "/strip/record_safe/", 19) && strlen (path) > 19) {
+			int ssid = atoi (&path[19]);
+			route_recsafe (ssid, argv[0]->f == 1.0, msg);
+			ret = 0;
+		}
+		else if (!strncmp (path, "/strip/expand/", 14) && strlen (path) > 14) {
+			int ssid = atoi (&path[14]);
+			strip_expand (ssid, argv[0]->f == 1.0, msg);
+			ret = 0;
+		}
+		else if (!strncmp (path, "/strip/select/", 14) && strlen (path) > 14) {
+			int ssid = atoi (&path[14]);
+			strip_gui_select (ssid, argv[0]->f == 1.0, msg);
+			ret = 0;
+		}
+		else if (!strncmp (path, "/select/send_gain/", 18) && strlen (path) > 18) {
+			int ssid = atoi (&path[18]);
+			sel_sendgain (ssid, argv[0]->f, msg);
+			ret = 0;
+		}
+		else if (!strncmp (path, "/select/send_fader/", 19) && strlen (path) > 19) {
+			int ssid = atoi (&path[19]);
+			sel_sendfader (ssid, argv[0]->f, msg);
+			ret = 0;
+		}
+		else if (!strncmp (path, "/select/send_enable/", 20) && strlen (path) > 20) {
+			int ssid = atoi (&path[20]);
+			sel_sendenable (ssid, argv[0]->f, msg);
 			ret = 0;
 		}
-		else if (!strncmp (path, "/ardour/routes/trimabs/", 23) && strlen (path) > 23) {
-			int rid = atoi (&path[23]);
-			// normalize 0..1 ?
-			route_set_trim_abs (rid, argv[0]->f);
+		else if (!strncmp (path, "/select/eq_gain/", 16) && strlen (path) > 16) {
+			int ssid = atoi (&path[16]);
+			sel_eq_gain (ssid, argv[0]->f, msg);
 			ret = 0;
 		}
-		else if (!strncmp (path, "/ardour/routes/mute/", 20) && strlen (path) > 20) {
-			int rid = atoi (&path[20]);
-			route_mute (rid, argv[0]->f == 1.0);
+		else if (!strncmp (path, "/select/eq_freq/", 16) && strlen (path) > 16) {
+			int ssid = atoi (&path[16]);
+			sel_eq_freq (ssid, argv[0]->f , msg);
 			ret = 0;
 		}
-		else if (!strncmp (path, "/ardour/routes/solo/", 20) && strlen (path) > 20) {
-			int rid = atoi (&path[20]);
-			route_solo (rid, argv[0]->f == 1.0);
+		else if (!strncmp (path, "/select/eq_q/", 13) && strlen (path) > 13) {
+			int ssid = atoi (&path[13]);
+			sel_eq_q (ssid, argv[0]->f, msg);
 			ret = 0;
 		}
-		else if (!strncmp (path, "/ardour/routes/recenable/", 25) && strlen (path) > 25) {
-			int rid = atoi (&path[25]);
-			route_recenable (rid, argv[0]->f == 1.0);
+		else if (!strncmp (path, "/select/eq_shape/", 17) && strlen (path) > 17) {
+			int ssid = atoi (&path[17]);
+			sel_eq_shape (ssid, argv[0]->f, msg);
 			ret = 0;
 		}
 	}
@@ -869,6 +1060,7 @@ OSC::session_exported (std::string path, std::string name)
 {
 	lo_address listener = lo_address_new (NULL, "7770");
 	lo_send (listener, "/session/exported", "ss", path.c_str(), name.c_str());
+	lo_address_free (listener);
 }
 
 // end "Application Hook" Handlers //
@@ -943,7 +1135,7 @@ OSC::routes_list (lo_message msg)
 	}
 	for (int n = 0; n < (int) session->nroutes(); ++n) {
 
-		boost::shared_ptr<Route> r = session->route_by_remote_id (n);
+		boost::shared_ptr<Route> r = session->get_remote_nth_route (n);
 
 		if (r) {
 
@@ -962,13 +1154,16 @@ OSC::routes_list (lo_message msg)
 			lo_message_add_int32 (reply, r->n_outputs().n_audio());
 			lo_message_add_int32 (reply, r->muted());
 			lo_message_add_int32 (reply, r->soloed());
-			lo_message_add_int32 (reply, r->remote_control_id());
+			/* XXX Can only use order at this point */
+			//lo_message_add_int32 (reply, r->presentation_info().order());
+			// try this instead.
+			lo_message_add_int32 (reply, get_sid (r, lo_message_get_source (msg)));
 
 			if (boost::dynamic_pointer_cast<AudioTrack>(r)
 					|| boost::dynamic_pointer_cast<MidiTrack>(r)) {
 
 				boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track>(r);
-				lo_message_add_int32 (reply, t->record_enabled());
+				lo_message_add_int32 (reply, (int32_t) t->rec_enable_control()->get_value());
 			}
 
 			//Automatically listen to routes listed
@@ -991,6 +1186,358 @@ OSC::routes_list (lo_message msg)
 	lo_message_free (reply);
 }
 
+int
+OSC::cancel_all_solos ()
+{
+	session->cancel_all_solo ();
+	return 0;
+}
+
+int
+OSC::set_surface (uint32_t b_size, uint32_t strips, uint32_t fb, uint32_t gm, lo_message msg)
+{
+	OSCSurface *s = get_surface(lo_message_get_source (msg));
+	s->bank_size = b_size;
+	s->strip_types = strips;
+	s->feedback = fb;
+	s->gainmode = gm;
+	// set bank and strip feedback
+	set_bank(s->bank, msg);
+
+	global_feedback (s->feedback, lo_message_get_source (msg), s->gainmode);
+	return 0;
+}
+
+int
+OSC::set_surface_bank_size (uint32_t bs, lo_message msg)
+{
+	OSCSurface *s = get_surface(lo_message_get_source (msg));
+	s->bank_size = bs;
+
+	// set bank and strip feedback
+	set_bank(s->bank, msg);
+	return 0;
+}
+
+int
+OSC::set_surface_strip_types (uint32_t st, lo_message msg)
+{
+	OSCSurface *s = get_surface(lo_message_get_source (msg));
+	s->strip_types = st;
+
+	// set bank and strip feedback
+	set_bank(s->bank, msg);
+	return 0;
+}
+
+
+int
+OSC::set_surface_feedback (uint32_t fb, lo_message msg)
+{
+	OSCSurface *s = get_surface(lo_message_get_source (msg));
+	s->feedback = fb;
+
+	// set bank and strip feedback
+	set_bank(s->bank, msg);
+
+	// Set global/master feedback
+	global_feedback (s->feedback, lo_message_get_source (msg), s->gainmode);
+	return 0;
+}
+
+
+int
+OSC::set_surface_gainmode (uint32_t gm, lo_message msg)
+{
+	OSCSurface *s = get_surface(lo_message_get_source (msg));
+	s->gainmode = gm;
+
+	// set bank and strip feedback
+	set_bank(s->bank, msg);
+
+	// Set global/master feedback
+	global_feedback (s->feedback, lo_message_get_source (msg), s->gainmode);
+	return 0;
+}
+
+OSC::OSCSurface *
+OSC::get_surface (lo_address addr)
+{
+	string r_url;
+	char * rurl;
+	rurl = lo_address_get_url (addr);
+	r_url = rurl;
+	free (rurl);
+	for (uint32_t it = 0; it < _surface.size(); ++it) {
+		//find setup for this server
+		if (!_surface[it].remote_url.find(r_url)){
+			return &_surface[it];
+		}
+	}
+	// if we do this when OSC is started we get the wrong stripable
+	// we don't need this until we actually have a surface to deal with
+	if (!_select || (_select != ControlProtocol::first_selected_stripable())) {
+		gui_selection_changed();
+	}
+
+	// No surface create one with default values
+	OSCSurface s;
+	s.remote_url = r_url;
+	s.bank = 1;
+	s.bank_size = 0; // need to find out how many strips there are
+	s.strip_types = 31; // 31 is tracks, busses, and VCAs (no master/monitor)
+	s.feedback = 0;
+	s.gainmode = 0;
+	s.sel_obs = 0;
+	s.expand = 0;
+	s.expand_enable = false;
+	s.strips = get_sorted_stripables(s.strip_types);
+
+	s.nstrips = s.strips.size();
+	_surface.push_back (s);
+
+	return &_surface[_surface.size() - 1];
+}
+
+// setup global feedback for a surface
+void
+OSC::global_feedback (bitset<32> feedback, lo_address addr, uint32_t gainmode)
+{
+	// first destroy global observer for this surface
+	GlobalObservers::iterator x;
+	for (x = global_observers.begin(); x != global_observers.end();) {
+
+		OSCGlobalObserver* ro;
+
+		if ((ro = dynamic_cast<OSCGlobalObserver*>(*x)) != 0) {
+
+			int res = strcmp(lo_address_get_url(ro->address()), lo_address_get_url(addr));
+
+			if (res == 0) {
+				delete *x;
+				x = global_observers.erase (x);
+			} else {
+				++x;
+			}
+		} else {
+			++x;
+		}
+	}
+	if (feedback[4] || feedback[3] || feedback[5] || feedback[6]) {
+		// create a new Global Observer for this surface
+		OSCGlobalObserver* o = new OSCGlobalObserver (*session, addr, gainmode, /*s->*/feedback);
+		global_observers.push_back (o);
+	}
+}
+
+void
+OSC::notify_routes_added (ARDOUR::RouteList &)
+{
+	// not sure if we need this PI change seems to cover
+	//recalcbanks();
+}
+
+void
+OSC::notify_vca_added (ARDOUR::VCAList &)
+{
+	// not sure if we need this PI change seems to cover
+	//recalcbanks();
+}
+
+void
+OSC::recalcbanks ()
+{
+	tick = false;
+	bank_dirty = true;
+}
+
+void
+OSC::_recalcbanks ()
+{
+	if (!_select || (_select != ControlProtocol::first_selected_stripable())) {
+		_select = ControlProtocol::first_selected_stripable();
+	}
+
+	// do a set_bank for each surface we know about.
+	for (uint32_t it = 0; it < _surface.size(); ++it) {
+		OSCSurface* sur = &_surface[it];
+		// find lo_address
+		lo_address addr = lo_address_new_from_url (sur->remote_url.c_str());
+		_set_bank (sur->bank, addr);
+	}
+}
+
+/*
+ * This gets called not only when bank changes but also:
+ *  - bank size change
+ *  - feedback change
+ *  - strip types changes
+ *  - fadermode changes
+ *  - stripable creation/deletion/flag
+ *  - to refresh what is "displayed"
+ * Basically any time the bank needs to be rebuilt
+ */
+int
+OSC::set_bank (uint32_t bank_start, lo_message msg)
+{
+	return _set_bank (bank_start, lo_message_get_source (msg));
+}
+
+// set bank is callable with either message or address
+int
+OSC::_set_bank (uint32_t bank_start, lo_address addr)
+{
+	if (!session) {
+		return -1;
+	}
+	// no nstripables yet
+	if (!session->nroutes()) {
+		return -1;
+	}
+
+	OSCSurface *s = get_surface (addr);
+
+	// revert any expand to select
+	 s->expand = 0;
+	 s->expand_enable = false;
+	_strip_select (ControlProtocol::first_selected_stripable(), addr);
+
+	// undo all listeners for this url
+	StripableList stripables;
+	session->get_stripables (stripables);
+	for (StripableList::iterator it = stripables.begin(); it != stripables.end(); ++it) {
+
+		boost::shared_ptr<Stripable> stp = *it;
+		if (stp) {
+			end_listen (stp, addr);
+		}
+	}
+
+	s->strips = get_sorted_stripables(s->strip_types);
+	s->nstrips = s->strips.size();
+
+	uint32_t b_size;
+	if (!s->bank_size) {
+		// no banking - bank includes all stripables
+		b_size = s->nstrips;
+	} else {
+		b_size = s->bank_size;
+	}
+
+	// Do limits checking
+	if (bank_start < 1) bank_start = 1;
+	if (b_size >= s->nstrips)  {
+		bank_start = 1;
+	} else if (bank_start > ((s->nstrips - b_size) + 1)) {
+		// top bank is always filled if there are enough strips for at least one bank
+		bank_start = (uint32_t)((s->nstrips - b_size) + 1);
+	}
+	//save bank in case we have had to change it
+	s->bank = bank_start;
+
+	if (s->feedback[0] || s->feedback[1]) {
+
+		for (uint32_t n = bank_start; n < (min ((b_size + bank_start), s->nstrips + 1)); ++n) {
+			if (n <= s->strips.size()) {
+				boost::shared_ptr<Stripable> stp = s->strips[n - 1];
+
+				if (stp) {
+					listen_to_route(stp, addr);
+				}
+			}
+		}
+	}
+	// light bankup or bankdown buttons if it is possible to bank in that direction
+	if (s->feedback[4]) {
+		// these two messages could be bundled
+		lo_message reply;
+		reply = lo_message_new ();
+		if ((s->bank > (s->nstrips - s->bank_size)) || (s->nstrips < s->bank_size)) {
+			lo_message_add_int32 (reply, 0);
+		} else {
+			lo_message_add_int32 (reply, 1);
+		}
+		lo_send_message (addr, "/bank_up", reply);
+		lo_message_free (reply);
+		reply = lo_message_new ();
+		if (s->bank > 1) {
+			lo_message_add_int32 (reply, 1);
+		} else {
+			lo_message_add_int32 (reply, 0);
+		}
+		lo_send_message (addr, "/bank_down", reply);
+		lo_message_free (reply);
+	}
+	bank_dirty = false;
+	tick = true;
+	return 0;
+}
+
+int
+OSC::bank_up (lo_message msg)
+{
+	if (!session) {
+		return -1;
+	}
+	OSCSurface *s = get_surface(lo_message_get_source (msg));
+	set_bank (s->bank + s->bank_size, msg);
+	return 0;
+}
+
+int
+OSC::bank_down (lo_message msg)
+{
+	if (!session) {
+		return -1;
+	}
+	OSCSurface *s = get_surface(lo_message_get_source (msg));
+	if (s->bank < s->bank_size) {
+		set_bank (1, msg);
+	} else {
+		set_bank (s->bank - s->bank_size, msg);
+	}
+	return 0;
+}
+
+uint32_t
+OSC::get_sid (boost::shared_ptr<ARDOUR::Stripable> strip, lo_address addr)
+{
+	if (!strip) {
+		return 0;
+	}
+
+	OSCSurface *s = get_surface(addr);
+
+	uint32_t b_size;
+	if (!s->bank_size) {
+		// no banking
+		b_size = s->nstrips;
+	} else {
+		b_size = s->bank_size;
+	}
+
+	for (uint32_t n = s->bank; n < (min ((b_size + s->bank), s->nstrips + 1)); ++n) {
+		if (n <= s->strips.size()) {
+			if (strip == s->strips[n-1]) {
+				return n - s->bank + 1;
+			}
+		}
+	}
+	// failsafe... should never get here.
+	return 0;
+}
+
+boost::shared_ptr<ARDOUR::Stripable>
+OSC::get_strip (uint32_t ssid, lo_address addr)
+{
+	OSCSurface *s = get_surface(addr);
+	if (ssid && ((ssid + s->bank - 2) < s->nstrips)) {
+		return s->strips[ssid + s->bank - 2];
+	}
+	// guess it is out of range
+	return boost::shared_ptr<ARDOUR::Stripable>();
+}
+
 void
 OSC::transport_frame (lo_message msg)
 {
@@ -1002,7 +1549,7 @@ OSC::transport_frame (lo_message msg)
 	lo_message reply = lo_message_new ();
 	lo_message_add_int64 (reply, pos);
 
-	lo_send_message (lo_message_get_source (msg), "/ardour/transport_frame", reply);
+	lo_send_message (lo_message_get_source (msg), "/transport_frame", reply);
 
 	lo_message_free (reply);
 }
@@ -1018,7 +1565,7 @@ OSC::transport_speed (lo_message msg)
 	lo_message reply = lo_message_new ();
 	lo_message_add_double (reply, ts);
 
-	lo_send_message (lo_message_get_source (msg), "/ardour/transport_speed", reply);
+	lo_send_message (lo_message_get_source (msg), "/transport_speed", reply);
 
 	lo_message_free (reply);
 }
@@ -1034,222 +1581,991 @@ OSC::record_enabled (lo_message msg)
 	lo_message reply = lo_message_new ();
 	lo_message_add_int32 (reply, re);
 
-	lo_send_message (lo_message_get_source (msg), "/ardour/record_enabled", reply);
+	lo_send_message (lo_message_get_source (msg), "/record_enabled", reply);
 
 	lo_message_free (reply);
 }
 
+// master and monitor calls
+int
+OSC::master_set_gain (float dB)
+{
+	if (!session) return -1;
+	boost::shared_ptr<Stripable> s = session->master_out();
+	if (s) {
+		if (dB < -192) {
+			s->gain_control()->set_value (0.0, PBD::Controllable::NoGroup);
+		} else {
+			s->gain_control()->set_value (dB_to_coefficient (dB), PBD::Controllable::NoGroup);
+		}
+	}
+	return 0;
+}
 
 int
-OSC::route_mute (int rid, int yn)
+OSC::master_set_fader (float position)
 {
 	if (!session) return -1;
+	boost::shared_ptr<Stripable> s = session->master_out();
+	if (s) {
+		s->gain_control()->set_value (slider_position_to_gain_with_max (position, 2.0), PBD::Controllable::NoGroup);
+	}
+	return 0;
+}
 
-	boost::shared_ptr<Route> r = session->route_by_remote_id (rid);
+int
+OSC::master_set_trim (float dB)
+{
+	if (!session) return -1;
+	boost::shared_ptr<Stripable> s = session->master_out();
 
-	if (r) {
-		r->set_mute (yn, PBD::Controllable::NoGroup);
+	if (s) {
+		s->trim_control()->set_value (dB_to_coefficient (dB), PBD::Controllable::NoGroup);
 	}
 
 	return 0;
 }
 
 int
-OSC::route_solo (int rid, int yn)
+OSC::master_set_pan_stereo_position (float position, lo_message msg)
 {
 	if (!session) return -1;
 
-	boost::shared_ptr<Route> r = session->route_by_remote_id (rid);
+	float endposition = .5;
+	boost::shared_ptr<Stripable> s = session->master_out();
+
+	if (s) {
+		if (s->pan_azimuth_control()) {
+			s->pan_azimuth_control()->set_value (s->pan_azimuth_control()->interface_to_internal (position), PBD::Controllable::NoGroup);
+			endposition = s->pan_azimuth_control()->internal_to_interface (s->pan_azimuth_control()->get_value ());
+		}
+	}
+	OSCSurface *sur = get_surface(lo_message_get_source (msg));
+
+	if (sur->feedback[4]) {
+		lo_message reply = lo_message_new ();
+		lo_message_add_float (reply, endposition);
 
-	if (r) {
-		boost::shared_ptr<RouteList> rl (new RouteList);
-		rl->push_back (r);
-		session->set_solo (rl, yn, Session::rt_cleanup, PBD::Controllable::NoGroup);
+		lo_send_message (lo_message_get_source (msg), "/master/pan_stereo_position", reply);
+		lo_message_free (reply);
 	}
 
 	return 0;
 }
 
 int
-OSC::route_recenable (int rid, int yn)
+OSC::master_set_mute (uint32_t state)
 {
 	if (!session) return -1;
 
-	boost::shared_ptr<Route> r = session->route_by_remote_id (rid);
+	boost::shared_ptr<Stripable> s = session->master_out();
 
-	if (r) {
-		r->set_record_enabled (yn, PBD::Controllable::NoGroup);
+	if (s) {
+		s->mute_control()->set_value (state, PBD::Controllable::NoGroup);
 	}
 
 	return 0;
 }
 
 int
-OSC::route_set_gain_abs (int rid, float level)
+OSC::monitor_set_gain (float dB)
 {
 	if (!session) return -1;
+	boost::shared_ptr<Stripable> s = session->monitor_out();
 
-	boost::shared_ptr<Route> r = session->route_by_remote_id (rid);
-
-	if (r) {
-		r->set_gain (level, PBD::Controllable::NoGroup);
+	if (s) {
+		if (dB < -192) {
+			s->gain_control()->set_value (0.0, PBD::Controllable::NoGroup);
+		} else {
+			s->gain_control()->set_value (dB_to_coefficient (dB), PBD::Controllable::NoGroup);
+		}
 	}
-
 	return 0;
 }
 
 int
-OSC::route_set_gain_dB (int rid, float dB)
+OSC::monitor_set_fader (float position)
 {
-	return route_set_gain_abs (rid, dB_to_coefficient (dB));
+	if (!session) return -1;
+	boost::shared_ptr<Stripable> s = session->monitor_out();
+	if (s) {
+		s->gain_control()->set_value (slider_position_to_gain_with_max (position, 2.0), PBD::Controllable::NoGroup);
+	}
+	return 0;
 }
 
-
+// strip calls
 int
-OSC::route_set_trim_abs (int rid, float level)
+OSC::route_mute (int ssid, int yn, lo_message msg)
 {
 	if (!session) return -1;
+	boost::shared_ptr<Stripable> s = get_strip (ssid, lo_message_get_source (msg));
 
-	boost::shared_ptr<Route> r = session->route_by_remote_id (rid);
-
-	if (r) {
-		r->set_trim (level, PBD::Controllable::NoGroup);
+	if (s) {
+		if (s->mute_control()) {
+			s->mute_control()->set_value (yn ? 1.0 : 0.0, PBD::Controllable::NoGroup);
+			return 0;
+		}
 	}
 
-	return 0;
+	return route_send_fail ("mute", ssid, 0, lo_message_get_source (msg));
 }
 
 int
-OSC::route_set_trim_dB (int rid, float dB)
+OSC::sel_mute (uint32_t yn, lo_message msg)
 {
-	return route_set_trim_abs(rid, dB_to_coefficient (dB));
+	OSCSurface *sur = get_surface(lo_message_get_source (msg));
+	boost::shared_ptr<Stripable> s;
+	if (sur->expand_enable) {
+		s = get_strip (sur->expand, lo_message_get_source (msg));
+	} else {
+		s = _select;
+	}
+	if (s) {
+		if (s->mute_control()) {
+			s->mute_control()->set_value (yn ? 1.0 : 0.0, PBD::Controllable::NoGroup);
+			return 0;
+		}
+	}
+	return sel_fail ("mute", 0, lo_message_get_source (msg));
 }
 
-
 int
-OSC::route_set_pan_stereo_position (int rid, float pos)
+OSC::route_solo (int ssid, int yn, lo_message msg)
 {
 	if (!session) return -1;
+	boost::shared_ptr<Stripable> s = get_strip (ssid, lo_message_get_source (msg));
 
-	boost::shared_ptr<Route> r = session->route_by_remote_id (rid);
-
-	if (r) {
-		boost::shared_ptr<Panner> panner = r->panner();
-		if (panner) {
-			panner->set_position (pos);
+	if (s) {
+		if (s->solo_control()) {
+			s->solo_control()->set_value (yn ? 1.0 : 0.0, PBD::Controllable::NoGroup);
+			return 0;
 		}
 	}
 
-	return 0;
-
+	return route_send_fail ("solo", ssid, 0, lo_message_get_source (msg));
 }
 
 int
-OSC::route_set_pan_stereo_width (int rid, float pos)
+OSC::route_solo_iso (int ssid, int yn, lo_message msg)
 {
 	if (!session) return -1;
+	boost::shared_ptr<Stripable> s = get_strip (ssid, lo_message_get_source (msg));
 
-	boost::shared_ptr<Route> r = session->route_by_remote_id (rid);
-
-	if (r) {
-		boost::shared_ptr<Panner> panner = r->panner();
-		if (panner) {
-			panner->set_width (pos);
+	if (s) {
+		if (s->solo_isolate_control()) {
+			s->solo_isolate_control()->set_value (yn ? 1.0 : 0.0, PBD::Controllable::NoGroup);
+			return 0;
 		}
 	}
 
-	return 0;
-
+	return route_send_fail ("solo_iso", ssid, 0, lo_message_get_source (msg));
 }
 
 int
-OSC::route_set_send_gain_abs (int rid, int sid, float val)
+OSC::route_solo_safe (int ssid, int yn, lo_message msg)
 {
-	if (!session) {
-		return -1;
-	}
-
-	boost::shared_ptr<Route> r = session->route_by_remote_id (rid);
+	if (!session) return -1;
+	boost::shared_ptr<Stripable> s = get_strip (ssid, lo_message_get_source (msg));
 
-	if (!r) {
-		return -1;
+	if (s) {
+		if (s->solo_safe_control()) {
+			s->solo_safe_control()->set_value (yn ? 1.0 : 0.0, PBD::Controllable::NoGroup);
+			return 0;
+		}
 	}
 
-	/* revert to zero-based counting */
+	return route_send_fail ("solo_safe", ssid, 0, lo_message_get_source (msg));
+}
+
+int
+OSC::sel_solo (uint32_t yn, lo_message msg)
+{
+	OSCSurface *sur = get_surface(lo_message_get_source (msg));
+	boost::shared_ptr<Stripable> s;
+	if (sur->expand_enable) {
+		s = get_strip (sur->expand, lo_message_get_source (msg));
+	} else {
+		s = _select;
+	}
+	if (s) {
+		if (s->solo_control()) {
+			s->solo_control()->set_value (yn ? 1.0 : 0.0, PBD::Controllable::NoGroup);
+			return 0;
+		}
+	}
+	return sel_fail ("solo", 0, lo_message_get_source (msg));
+}
+
+int
+OSC::sel_solo_iso (uint32_t yn, lo_message msg)
+{
+	OSCSurface *sur = get_surface(lo_message_get_source (msg));
+	boost::shared_ptr<Stripable> s;
+	if (sur->expand_enable) {
+		s = get_strip (sur->expand, lo_message_get_source (msg));
+	} else {
+		s = _select;
+	}
+	if (s) {
+		if (s->solo_isolate_control()) {
+			s->solo_isolate_control()->set_value (yn ? 1.0 : 0.0, PBD::Controllable::NoGroup);
+			return 0;
+		}
+	}
+	return sel_fail ("solo_iso", 0, lo_message_get_source (msg));
+}
+
+int
+OSC::sel_solo_safe (uint32_t yn, lo_message msg)
+{
+	OSCSurface *sur = get_surface(lo_message_get_source (msg));
+	boost::shared_ptr<Stripable> s;
+	if (sur->expand_enable) {
+		s = get_strip (sur->expand, lo_message_get_source (msg));
+	} else {
+		s = _select;
+	}
+	if (s) {
+		if (s->solo_safe_control()) {
+			s->solo_safe_control()->set_value (yn ? 1.0 : 0.0, PBD::Controllable::NoGroup);
+			return 0;
+		}
+	}
+	return sel_fail ("solo_safe", 0, lo_message_get_source (msg));
+}
+
+int
+OSC::sel_recenable (uint32_t yn, lo_message msg)
+{
+	OSCSurface *sur = get_surface(lo_message_get_source (msg));
+	boost::shared_ptr<Stripable> s;
+	if (sur->expand_enable) {
+		s = get_strip (sur->expand, lo_message_get_source (msg));
+	} else {
+		s = _select;
+	}
+	if (s) {
+		if (s->rec_enable_control()) {
+			s->rec_enable_control()->set_value (yn ? 1.0 : 0.0, PBD::Controllable::NoGroup);
+			return 0;
+		}
+	}
+	return sel_fail ("recenable", 0, lo_message_get_source (msg));
+}
+
+int
+OSC::route_recenable (int ssid, int yn, lo_message msg)
+{
+	if (!session) return -1;
+	boost::shared_ptr<Stripable> s = get_strip (ssid, lo_message_get_source (msg));
+
+	if (s) {
+		if (s->rec_enable_control()) {
+			s->rec_enable_control()->set_value (yn, PBD::Controllable::UseGroup);
+			if (s->rec_enable_control()->get_value()) {
+				return 0;
+			}
+		}
+	}
+	return route_send_fail ("recenable", ssid, 0, lo_message_get_source (msg));
+}
+
+int
+OSC::sel_recsafe (uint32_t yn, lo_message msg)
+{
+	OSCSurface *sur = get_surface(lo_message_get_source (msg));
+	boost::shared_ptr<Stripable> s;
+	if (sur->expand_enable) {
+		s = get_strip (sur->expand, lo_message_get_source (msg));
+	} else {
+		s = _select;
+	}
+	if (s) {
+		if (s->rec_safe_control()) {
+			s->rec_safe_control()->set_value (yn ? 1.0 : 0.0, PBD::Controllable::NoGroup);
+			return 0;
+		}
+	}
+	return sel_fail ("record_safe", 0, lo_message_get_source (msg));
+}
+
+int
+OSC::route_recsafe (int ssid, int yn, lo_message msg)
+{
+	if (!session) return -1;
+	boost::shared_ptr<Stripable> s = get_strip (ssid, lo_message_get_source (msg));
+	if (s) {
+		if (s->rec_safe_control()) {
+			s->rec_safe_control()->set_value (yn, PBD::Controllable::UseGroup);
+			if (s->rec_safe_control()->get_value()) {
+				return 0;
+			}
+		}
+	}
+	return route_send_fail ("record_safe", ssid, 0,lo_message_get_source (msg));
+}
+
+int
+OSC::route_monitor_input (int ssid, int yn, lo_message msg)
+{
+	if (!session) return -1;
+	boost::shared_ptr<Stripable> s = get_strip (ssid, lo_message_get_source (msg));
+
+	if (s) {
+		boost::shared_ptr<Track> track = boost::dynamic_pointer_cast<Track> (s);
+		if (track) {
+			if (track->monitoring_control()) {
+				track->monitoring_control()->set_value (yn ? 1.0 : 0.0, PBD::Controllable::NoGroup);
+				return 0;
+			}
+		}
+	}
+
+	return route_send_fail ("monitor_input", ssid, 0, lo_message_get_source (msg));
+}
+
+int
+OSC::sel_monitor_input (uint32_t yn, lo_message msg)
+{
+	OSCSurface *sur = get_surface(lo_message_get_source (msg));
+	boost::shared_ptr<Stripable> s;
+	if (sur->expand_enable) {
+		s = get_strip (sur->expand, lo_message_get_source (msg));
+	} else {
+		s = _select;
+	}
+	if (s) {
+		boost::shared_ptr<Track> track = boost::dynamic_pointer_cast<Track> (s);
+		if (track) {
+			if (track->monitoring_control()) {
+				track->monitoring_control()->set_value (yn ? 1.0 : 0.0, PBD::Controllable::NoGroup);
+				return 0;
+			}
+		}
+	}
+	return sel_fail ("monitor_input", 0, lo_message_get_source (msg));
+}
+
+int
+OSC::route_monitor_disk (int ssid, int yn, lo_message msg)
+{
+	if (!session) return -1;
+	boost::shared_ptr<Stripable> s = get_strip (ssid, lo_message_get_source (msg));
+
+	if (s) {
+		boost::shared_ptr<Track> track = boost::dynamic_pointer_cast<Track> (s);
+		if (track) {
+			if (track->monitoring_control()) {
+				track->monitoring_control()->set_value (yn ? 2.0 : 0.0, PBD::Controllable::NoGroup);
+				return 0;
+			}
+		}
+	}
+
+	return route_send_fail ("monitor_disk", ssid, 0, lo_message_get_source (msg));
+}
+
+int
+OSC::sel_monitor_disk (uint32_t yn, lo_message msg)
+{
+	OSCSurface *sur = get_surface(lo_message_get_source (msg));
+	boost::shared_ptr<Stripable> s;
+	if (sur->expand_enable) {
+		s = get_strip (sur->expand, lo_message_get_source (msg));
+	} else {
+		s = _select;
+	}
+	if (s) {
+		boost::shared_ptr<Track> track = boost::dynamic_pointer_cast<Track> (s);
+		if (track) {
+			if (track->monitoring_control()) {
+				track->monitoring_control()->set_value (yn ? 2.0 : 0.0, PBD::Controllable::NoGroup);
+				return 0;
+			}
+		}
+	}
+	return sel_fail ("monitor_disk", 0, lo_message_get_source (msg));
+}
+
+
+int
+OSC::strip_phase (int ssid, int yn, lo_message msg)
+{
+	if (!session) return -1;
+	boost::shared_ptr<Stripable> s = get_strip (ssid, lo_message_get_source (msg));
+
+	if (s) {
+		if (s->phase_control()) {
+			s->phase_control()->set_value (yn ? 1.0 : 0.0, PBD::Controllable::NoGroup);
+			return 0;
+		}
+	}
+
+	return route_send_fail ("polarity", ssid, 0, lo_message_get_source (msg));
+}
+
+int
+OSC::sel_phase (uint32_t yn, lo_message msg)
+{
+	OSCSurface *sur = get_surface(lo_message_get_source (msg));
+	boost::shared_ptr<Stripable> s;
+	if (sur->expand_enable) {
+		s = get_strip (sur->expand, lo_message_get_source (msg));
+	} else {
+		s = _select;
+	}
+	if (s) {
+		if (s->phase_control()) {
+			s->phase_control()->set_value (yn ? 1.0 : 0.0, PBD::Controllable::NoGroup);
+			return 0;
+		}
+	}
+	return sel_fail ("polarity", 0, lo_message_get_source (msg));
+}
+
+int
+OSC::strip_expand (int ssid, int yn, lo_message msg)
+{
+	OSCSurface *sur = get_surface(lo_message_get_source (msg));
+	sur->expand_enable = (bool) yn;
+	sur->expand = ssid;
+	boost::shared_ptr<Stripable> s;
+	if (yn) {
+		s = get_strip (ssid, lo_message_get_source (msg));
+	} else {
+		s = ControlProtocol::first_selected_stripable();
+	}
+
+	return _strip_select (s, lo_message_get_source (msg));
+}
+
+int
+OSC::_strip_select (boost::shared_ptr<Stripable> s, lo_address addr)
+{
+	if (!session) {
+		return -1;
+	}
+	OSCSurface *sur = get_surface(addr);
+	if (sur->sel_obs) {
+		delete sur->sel_obs;
+		sur->sel_obs = 0;
+	}
+	if (s) {
+		OSCSelectObserver* sel_fb = new OSCSelectObserver (s, addr, sur->gainmode, sur->feedback);
+		s->DropReferences.connect (*this, MISSING_INVALIDATOR, boost::bind (&OSC::recalcbanks, this), this);
+		sur->sel_obs = sel_fb;
+	} else if (sur->expand_enable) {
+		sur->expand = 0;
+		sur->expand_enable = false;
+		if (_select) {
+			OSCSelectObserver* sel_fb = new OSCSelectObserver (_select, addr, sur->gainmode, sur->feedback);
+			_select->DropReferences.connect (*this, MISSING_INVALIDATOR, boost::bind (&OSC::recalcbanks, this), this);
+			sur->sel_obs = sel_fb;
+		}
+	} else {
+		route_send_fail ("select", sur->expand, 0 , addr);
+	}
+	//update buttons on surface
+	int b_s = sur->bank_size;
+	if (!b_s) { // bank size 0 means we need to know how many strips there are.
+		b_s = sur->nstrips;
+	}
+	for (int i = 1;  i <= b_s; i++) {
+		string path = "expand";
+
+		if ((i == (int) sur->expand) && sur->expand_enable) {
+			lo_message reply = lo_message_new ();
+			if (sur->feedback[2]) {
+				ostringstream os;
+				os << "/strip/" << path << "/" << i;
+				path = os.str();
+			} else {
+				ostringstream os;
+				os << "/strip/" << path;
+				path = os.str();
+				lo_message_add_int32 (reply, i);
+			}
+			lo_message_add_float (reply, (float) 1);
+
+			lo_send_message (addr, path.c_str(), reply);
+			lo_message_free (reply);
+			reply = lo_message_new ();
+			lo_message_add_float (reply, 1.0);
+			lo_send_message (addr, "/select/expand", reply);
+			lo_message_free (reply);
+
+		} else {
+			lo_message reply = lo_message_new ();
+			lo_message_add_int32 (reply, i);
+			lo_message_add_float (reply, 0.0);
+			lo_send_message (addr, "/strip/expand", reply);
+			lo_message_free (reply);
+		}
+	}
+	if (!sur->expand_enable) {
+		lo_message reply = lo_message_new ();
+		lo_message_add_float (reply, 0.0);
+		lo_send_message (addr, "/select/expand", reply);
+		lo_message_free (reply);
+	}
+
+	return 0;
+}
+
+int
+OSC::strip_gui_select (int ssid, int yn, lo_message msg)
+{
+	//ignore button release
+	if (!yn) return 0;
+
+	if (!session) {
+		route_send_fail ("select", ssid, 0, lo_message_get_source (msg));
+		return -1;
+	}
+	OSCSurface *sur = get_surface(lo_message_get_source (msg));
+	sur->expand_enable = false;
+	boost::shared_ptr<Stripable> s = get_strip (ssid, lo_message_get_source (msg));
+	if (s) {
+		SetStripableSelection (s);
+	} else {
+		route_send_fail ("select", ssid, 0, lo_message_get_source (msg));
+	}
+
+	return 0;
+}
+
+int
+OSC::sel_expand (uint32_t state, lo_message msg)
+{
+	OSCSurface *sur = get_surface(lo_message_get_source (msg));
+	boost::shared_ptr<Stripable> s;
+	sur->expand_enable = (bool) state;
+	if (state && sur->expand) {
+		s = get_strip (sur->expand, lo_message_get_source (msg));
+	} else {
+		s = ControlProtocol::first_selected_stripable();
+	}
+
+	return _strip_select (s, lo_message_get_source (msg));
+}
+
+int
+OSC::route_set_gain_abs (int ssid, float level, lo_message msg)
+{
+	if (!session) return -1;
+	boost::shared_ptr<Stripable> s = get_strip (ssid, lo_message_get_source (msg));
+
+	if (s) {
+		if (s->gain_control()) {
+			s->gain_control()->set_value (level, PBD::Controllable::NoGroup);
+		} else {
+			return 1;
+		}
+	} else {
+		return 1;
+	}
+
+	return 0;
+}
+
+int
+OSC::route_set_gain_dB (int ssid, float dB, lo_message msg)
+{
+	if (!session) {
+		route_send_fail ("gain", ssid, -193, lo_message_get_source (msg));
+		return -1;
+	}
+	int ret;
+	if (dB < -192) {
+		ret = route_set_gain_abs (ssid, 0.0, msg);
+	} else {
+		ret = route_set_gain_abs (ssid, dB_to_coefficient (dB), msg);
+	}
+	if (ret != 0) {
+		return route_send_fail ("gain", ssid, -193, lo_message_get_source (msg));
+	}
+	return 0;
+}
+
+int
+OSC::sel_gain (float val, lo_message msg)
+{
+	OSCSurface *sur = get_surface(lo_message_get_source (msg));
+	boost::shared_ptr<Stripable> s;
+	if (sur->expand_enable) {
+		s = get_strip (sur->expand, lo_message_get_source (msg));
+	} else {
+		s = _select;
+	}
+	if (s) {
+		float abs;
+		if (val < -192) {
+			abs = 0;
+		} else {
+			abs = dB_to_coefficient (val);
+		}
+		if (s->gain_control()) {
+			s->gain_control()->set_value (abs, PBD::Controllable::NoGroup);
+			return 0;
+		}
+	}
+	return sel_fail ("gain", -193, lo_message_get_source (msg));
+}
+
+int
+OSC::route_set_gain_fader (int ssid, float pos, lo_message msg)
+{
+	if (!session) {
+		route_send_fail ("fader", ssid, 0, lo_message_get_source (msg));
+		return -1;
+	}
+	int ret;
+	ret = route_set_gain_abs (ssid, slider_position_to_gain_with_max (pos, 2.0), msg);
+	if (ret != 0) {
+		return route_send_fail ("fader", ssid, 0, lo_message_get_source (msg));
+	}
+	return 0;
+}
+
+int
+OSC::sel_fader (float val, lo_message msg)
+{
+	OSCSurface *sur = get_surface(lo_message_get_source (msg));
+	boost::shared_ptr<Stripable> s;
+	if (sur->expand_enable) {
+		s = get_strip (sur->expand, lo_message_get_source (msg));
+	} else {
+		s = _select;
+	}
+	if (s) {
+		float abs;
+		abs = slider_position_to_gain_with_max (val, 2.0);
+		if (s->gain_control()) {
+			s->gain_control()->set_value (abs, PBD::Controllable::NoGroup);
+			return 0;
+		}
+	}
+	return sel_fail ("fader", 0, lo_message_get_source (msg));
+}
+
+int
+OSC::route_set_trim_abs (int ssid, float level, lo_message msg)
+{
+	if (!session) return -1;
+	boost::shared_ptr<Stripable> s = get_strip (ssid, lo_message_get_source (msg));
+
+	if (s) {
+		if (s->trim_control()) {
+			s->trim_control()->set_value (level, PBD::Controllable::NoGroup);
+			return 0;
+		}
+
+	}
+
+	return -1;
+}
+
+int
+OSC::route_set_trim_dB (int ssid, float dB, lo_message msg)
+{
+	int ret;
+	ret = route_set_trim_abs(ssid, dB_to_coefficient (dB), msg);
+	if (ret != 0) {
+		return route_send_fail ("trimdB", ssid, 0, lo_message_get_source (msg));
+	}
+
+return 0;
+}
+
+int
+OSC::sel_trim (float val, lo_message msg)
+{
+	OSCSurface *sur = get_surface(lo_message_get_source (msg));
+	boost::shared_ptr<Stripable> s;
+	if (sur->expand_enable) {
+		s = get_strip (sur->expand, lo_message_get_source (msg));
+	} else {
+		s = _select;
+	}
+	if (s) {
+		if (s->trim_control()) {
+			s->trim_control()->set_value (dB_to_coefficient (val), PBD::Controllable::NoGroup);
+			return 0;
+		}
+	}
+	return sel_fail ("trimdB", 0, lo_message_get_source (msg));
+}
+
+int
+OSC::sel_pan_position (float val, lo_message msg)
+{
+	OSCSurface *sur = get_surface(lo_message_get_source (msg));
+	boost::shared_ptr<Stripable> s;
+	if (sur->expand_enable) {
+		s = get_strip (sur->expand, lo_message_get_source (msg));
+	} else {
+		s = _select;
+	}
+	if (s) {
+		if(s->pan_azimuth_control()) {
+			s->pan_azimuth_control()->set_value (s->pan_azimuth_control()->interface_to_internal (val), PBD::Controllable::NoGroup);
+			return sel_fail ("pan_stereo_position", s->pan_azimuth_control()->internal_to_interface (s->pan_azimuth_control()->get_value ()), lo_message_get_source (msg));
+			return 0;
+		}
+	}
+	return sel_fail ("pan_stereo_position", 0.5, lo_message_get_source (msg));
+}
+
+int
+OSC::sel_pan_width (float val, lo_message msg)
+{
+	OSCSurface *sur = get_surface(lo_message_get_source (msg));
+	boost::shared_ptr<Stripable> s;
+	if (sur->expand_enable) {
+		s = get_strip (sur->expand, lo_message_get_source (msg));
+	} else {
+		s = _select;
+	}
+	if (s) {
+		if (s->pan_width_control()) {
+			s->pan_width_control()->set_value (s->pan_width_control()->interface_to_internal (val), PBD::Controllable::NoGroup);
+			return 0;
+		}
+	}
+	return sel_fail ("pan_stereo_width", 1, lo_message_get_source (msg));
+}
+
+int
+OSC::route_set_pan_stereo_position (int ssid, float pos, lo_message msg)
+{
+	if (!session) return -1;
+	boost::shared_ptr<Stripable> s = get_strip (ssid, lo_message_get_source (msg));
+
+	if (s) {
+		if(s->pan_azimuth_control()) {
+			s->pan_azimuth_control()->set_value (s->pan_azimuth_control()->interface_to_internal (pos), PBD::Controllable::NoGroup);
+			return route_send_fail ("pan_stereo_position", ssid, s->pan_azimuth_control()->internal_to_interface (s->pan_azimuth_control()->get_value ()), lo_message_get_source (msg));
+		}
+	}
+
+	return route_send_fail ("pan_stereo_position", ssid, 0.5, lo_message_get_source (msg));
+}
+
+int
+OSC::route_set_pan_stereo_width (int ssid, float pos, lo_message msg)
+{
+	if (!session) return -1;
+	boost::shared_ptr<Stripable> s = get_strip (ssid, lo_message_get_source (msg));
+
+	if (s) {
+		if (s->pan_width_control()) {
+			s->pan_width_control()->set_value (pos, PBD::Controllable::NoGroup);
+			return 0;
+		}
+	}
+
+	return route_send_fail ("pan_stereo_width", ssid, 1, lo_message_get_source (msg));
+}
+
+int
+OSC::route_set_send_gain_dB (int ssid, int id, float val, lo_message msg)
+{
+	if (!session) {
+		return -1;
+	}
+	boost::shared_ptr<Stripable> s = get_strip (ssid, lo_message_get_source (msg));
+	float abs;
+	if (s) {
+		if (id > 0) {
+			--id;
+		}
+#ifdef MIXBUS
+		abs = val;
+#else
+		if (val < -192) {
+			abs = 0;
+		} else {
+			abs = dB_to_coefficient (val);
+		}
+#endif
+		if (s->send_level_controllable (id)) {
+			s->send_level_controllable (id)->set_value (abs, PBD::Controllable::NoGroup);
+			return 0;
+		}
+	}
+	return 0;
+}
+
+int
+OSC::route_set_send_fader (int ssid, int id, float val, lo_message msg)
+{
+	if (!session) {
+		return -1;
+	}
+	boost::shared_ptr<Stripable> s = get_strip (ssid, lo_message_get_source (msg));
+	float abs;
+	if (s) {
+
+		if (id > 0) {
+			--id;
+		}
+
+		if (s->send_level_controllable (id)) {
+#ifdef MIXBUS
+			abs = s->send_level_controllable(id)->interface_to_internal (val);
+#else
+			abs = slider_position_to_gain_with_max (val, 2.0);
+#endif
+			s->send_level_controllable (id)->set_value (abs, PBD::Controllable::NoGroup);
+			return 0;
+		}
+	}
+	return 0;
+}
 
-	if (sid > 0) {
-		--sid;
+int
+OSC::sel_sendgain (int id, float val, lo_message msg)
+{
+	OSCSurface *sur = get_surface(lo_message_get_source (msg));
+	boost::shared_ptr<Stripable> s;
+	if (sur->expand_enable) {
+		s = get_strip (sur->expand, lo_message_get_source (msg));
+	} else {
+		s = _select;
+	}
+	float abs;
+	if (s) {
+		if (id > 0) {
+			--id;
+		}
+#ifdef MIXBUS
+		abs = val;
+#else
+		if (val < -192) {
+			abs = 0;
+		} else {
+			abs = dB_to_coefficient (val);
+		}
+#endif
+		if (s->send_level_controllable (id)) {
+			s->send_level_controllable (id)->set_value (abs, PBD::Controllable::NoGroup);
+			return 0;
+		}
 	}
+	return sel_send_fail ("send_gain", id + 1, -193, lo_message_get_source (msg));
+}
 
-	boost::shared_ptr<Processor> p = r->nth_send (sid);
+int
+OSC::sel_sendfader (int id, float val, lo_message msg)
+{
+	OSCSurface *sur = get_surface(lo_message_get_source (msg));
+	boost::shared_ptr<Stripable> s;
+	if (sur->expand_enable) {
+		s = get_strip (sur->expand, lo_message_get_source (msg));
+	} else {
+		s = _select;
+	}
+	float abs;
+	if (s) {
 
-	if (p) {
-		boost::shared_ptr<Send> s = boost::dynamic_pointer_cast<Send>(p);
-		boost::shared_ptr<Amp> a = s->amp();
+		if (id > 0) {
+			--id;
+		}
 
-		if (a) {
-			a->gain_control()->set_value (val, PBD::Controllable::NoGroup);
+		if (s->send_level_controllable (id)) {
+#ifdef MIXBUS
+			abs = s->send_level_controllable(id)->interface_to_internal (val);
+#else
+			abs = slider_position_to_gain_with_max (val, 2.0);
+#endif
+			s->send_level_controllable (id)->set_value (abs, PBD::Controllable::NoGroup);
+			return 0;
 		}
 	}
-	return 0;
+	return sel_send_fail ("send_fader", id, 0, lo_message_get_source (msg));
 }
 
 int
-OSC::route_set_send_gain_dB (int rid, int sid, float val)
+OSC::route_set_send_enable (int ssid, int sid, float val, lo_message msg)
 {
 	if (!session) {
 		return -1;
 	}
+	boost::shared_ptr<Stripable> s = get_strip (ssid, lo_message_get_source (msg));
 
-	boost::shared_ptr<Route> r = session->route_by_remote_id (rid);
+	if (s) {
 
-	if (!r) {
-		return -1;
-	}
+		/* revert to zero-based counting */
+
+		if (sid > 0) {
+			--sid;
+		}
 
-	/* revert to zero-based counting */
+		if (s->send_enable_controllable (sid)) {
+			s->send_enable_controllable (sid)->set_value (val, PBD::Controllable::NoGroup);
+			return 0;
+		}
 
-	if (sid > 0) {
-		--sid;
-	}
+		if (s->send_level_controllable (sid)) {
+			return 0;
+		}
 
-	boost::shared_ptr<Processor> p = r->nth_send (sid);
+	}
 
-	if (p) {
-		boost::shared_ptr<Send> s = boost::dynamic_pointer_cast<Send>(p);
-		boost::shared_ptr<Amp> a = s->amp();
+	return -1;
+}
 
-		if (a) {
-			a->gain_control()->set_value (dB_to_coefficient (val), PBD::Controllable::NoGroup);
+int
+OSC::sel_sendenable (int id, float val, lo_message msg)
+{
+	OSCSurface *sur = get_surface(lo_message_get_source (msg));
+	boost::shared_ptr<Stripable> s;
+	if (sur->expand_enable) {
+		s = get_strip (sur->expand, lo_message_get_source (msg));
+	} else {
+		s = _select;
+	}
+	if (s) {
+		if (id > 0) {
+			--id;
+		}
+		if (s->send_enable_controllable (id)) {
+			s->send_enable_controllable (id)->set_value (val, PBD::Controllable::NoGroup);
+			return 0;
+		}
+		if (s->send_level_controllable (id)) {
+			return sel_send_fail ("send_enable", id + 1, 1, lo_message_get_source (msg));
 		}
 	}
-	return 0;
+	return sel_send_fail ("send_enable", id + 1, 0, lo_message_get_source (msg));
 }
 
 int
-OSC::route_plugin_parameter (int rid, int piid, int par, float val)
+OSC::route_plugin_parameter (int ssid, int piid, int par, float val, lo_message msg)
 {
 	if (!session)
 		return -1;
+	boost::shared_ptr<Stripable> s = get_strip (ssid, lo_message_get_source (msg));
 
-	boost::shared_ptr<Route> r = session->route_by_remote_id (rid);
+	boost::shared_ptr<Route> r = boost::dynamic_pointer_cast<Route> (s);
 
 	if (!r) {
-		PBD::error << "OSC: Invalid Remote Control ID '" << rid << "'" << endmsg;
+		PBD::error << "OSC: Invalid Remote Control ID '" << ssid << "'" << endmsg;
 		return -1;
 	}
 
 	boost::shared_ptr<Processor> redi=r->nth_plugin (piid);
 
 	if (!redi) {
-		PBD::error << "OSC: cannot find plugin # " << piid << " for RID '" << rid << "'" << endmsg;
+		PBD::error << "OSC: cannot find plugin # " << piid << " for RID '" << ssid << "'" << endmsg;
 		return -1;
 	}
 
 	boost::shared_ptr<PluginInsert> pi;
 
 	if (!(pi = boost::dynamic_pointer_cast<PluginInsert>(redi))) {
-		PBD::error << "OSC: given processor # " << piid << " on RID '" << rid << "' is not a Plugin." << endmsg;
+		PBD::error << "OSC: given processor # " << piid << " on RID '" << ssid << "' is not a Plugin." << endmsg;
 		return -1;
 	}
 
@@ -1259,39 +2575,41 @@ OSC::route_plugin_parameter (int rid, int piid, int par, float val)
 	uint32_t controlid = pip->nth_parameter (par,ok);
 
 	if (!ok) {
-		PBD::error << "OSC: Cannot find parameter # " << par <<  " for plugin # " << piid << " on RID '" << rid << "'" << endmsg;
+		PBD::error << "OSC: Cannot find parameter # " << par <<  " for plugin # " << piid << " on RID '" << ssid << "'" << endmsg;
 		return -1;
 	}
 
 	if (!pip->parameter_is_input(controlid)) {
-		PBD::error << "OSC: Parameter # " << par <<  " for plugin # " << piid << " on RID '" << rid << "' is not a control input" << endmsg;
+		PBD::error << "OSC: Parameter # " << par <<  " for plugin # " << piid << " on RID '" << ssid << "' is not a control input" << endmsg;
 		return -1;
 	}
 
 	ParameterDescriptor pd;
 	pi->plugin()->get_parameter_descriptor (controlid,pd);
 
-	if (val >= pd.lower && val < pd.upper) {
+	if (val >= pd.lower && val <= pd.upper) {
 
 		boost::shared_ptr<AutomationControl> c = pi->automation_control (Evoral::Parameter(PluginAutomation, 0, controlid));
 		// cerr << "parameter:" << redi->describe_parameter(controlid) << " val:" << val << "\n";
 		c->set_value (val, PBD::Controllable::NoGroup);
 	} else {
-		PBD::warning << "OSC: Parameter # " << par <<  " for plugin # " << piid << " on RID '" << rid << "' is out of range" << endmsg;
+		PBD::warning << "OSC: Parameter # " << par <<  " for plugin # " << piid << " on RID '" << ssid << "' is out of range" << endmsg;
 		PBD::info << "OSC: Valid range min=" << pd.lower << " max=" << pd.upper << endmsg;
 	}
 
 	return 0;
 }
 
+//prints to cerr only
 int
-OSC::route_plugin_parameter_print (int rid, int piid, int par)
+OSC::route_plugin_parameter_print (int ssid, int piid, int par, lo_message msg)
 {
 	if (!session) {
 		return -1;
 	}
+	boost::shared_ptr<Stripable> s = get_strip (ssid, lo_message_get_source (msg));
 
-	boost::shared_ptr<Route> r = session->route_by_remote_id (rid);
+	boost::shared_ptr<Route> r = boost::dynamic_pointer_cast<Route> (s);
 
 	if (!r) {
 		return -1;
@@ -1332,11 +2650,445 @@ OSC::route_plugin_parameter_print (int rid, int piid, int par)
 	return 0;
 }
 
+// select
+
+int
+OSC::sel_pan_elevation (float val, lo_message msg)
+{
+	OSCSurface *sur = get_surface(lo_message_get_source (msg));
+	boost::shared_ptr<Stripable> s;
+	if (sur->expand_enable) {
+		s = get_strip (sur->expand, lo_message_get_source (msg));
+	} else {
+		s = _select;
+	}
+	if (s) {
+		if (s->pan_elevation_control()) {
+			s->pan_elevation_control()->set_value (s->pan_elevation_control()->interface_to_internal (val), PBD::Controllable::NoGroup);
+			return 0;
+		}
+	}
+	return sel_fail ("pan_elevation_position", 0, lo_message_get_source (msg));
+}
+
+int
+OSC::sel_pan_frontback (float val, lo_message msg)
+{
+	OSCSurface *sur = get_surface(lo_message_get_source (msg));
+	boost::shared_ptr<Stripable> s;
+	if (sur->expand_enable) {
+		s = get_strip (sur->expand, lo_message_get_source (msg));
+	} else {
+		s = _select;
+	}
+	if (s) {
+		if (s->pan_frontback_control()) {
+			s->pan_frontback_control()->set_value (s->pan_frontback_control()->interface_to_internal (val), PBD::Controllable::NoGroup);
+			return 0;
+		}
+	}
+	return sel_fail ("pan_frontback_position", 0.5, lo_message_get_source (msg));
+}
+
+int
+OSC::sel_pan_lfe (float val, lo_message msg)
+{
+	OSCSurface *sur = get_surface(lo_message_get_source (msg));
+	boost::shared_ptr<Stripable> s;
+	if (sur->expand_enable) {
+		s = get_strip (sur->expand, lo_message_get_source (msg));
+	} else {
+		s = _select;
+	}
+	if (s) {
+		if (s->pan_lfe_control()) {
+			s->pan_lfe_control()->set_value (s->pan_lfe_control()->interface_to_internal (val), PBD::Controllable::NoGroup);
+			return 0;
+		}
+	}
+	return sel_fail ("pan_lfe_control", 0, lo_message_get_source (msg));
+}
+
+// compressor control
+int
+OSC::sel_comp_enable (float val, lo_message msg)
+{
+	OSCSurface *sur = get_surface(lo_message_get_source (msg));
+	boost::shared_ptr<Stripable> s;
+	if (sur->expand_enable) {
+		s = get_strip (sur->expand, lo_message_get_source (msg));
+	} else {
+		s = _select;
+	}
+	if (s) {
+		if (s->comp_enable_controllable()) {
+			s->comp_enable_controllable()->set_value (s->comp_enable_controllable()->interface_to_internal (val), PBD::Controllable::NoGroup);
+			return 0;
+		}
+	}
+	return sel_fail ("comp_enable", 0, lo_message_get_source (msg));
+}
+
+int
+OSC::sel_comp_threshold (float val, lo_message msg)
+{
+	OSCSurface *sur = get_surface(lo_message_get_source (msg));
+	boost::shared_ptr<Stripable> s;
+	if (sur->expand_enable) {
+		s = get_strip (sur->expand, lo_message_get_source (msg));
+	} else {
+		s = _select;
+	}
+	if (s) {
+		if (s->comp_threshold_controllable()) {
+			s->comp_threshold_controllable()->set_value (s->comp_threshold_controllable()->interface_to_internal (val), PBD::Controllable::NoGroup);
+			return 0;
+		}
+	}
+	return sel_fail ("comp_threshold", 0, lo_message_get_source (msg));
+}
+
+int
+OSC::sel_comp_speed (float val, lo_message msg)
+{
+	OSCSurface *sur = get_surface(lo_message_get_source (msg));
+	boost::shared_ptr<Stripable> s;
+	if (sur->expand_enable) {
+		s = get_strip (sur->expand, lo_message_get_source (msg));
+	} else {
+		s = _select;
+	}
+	if (s) {
+		if (s->comp_speed_controllable()) {
+			s->comp_speed_controllable()->set_value (s->comp_speed_controllable()->interface_to_internal (val), PBD::Controllable::NoGroup);
+			return 0;
+		}
+	}
+	return sel_fail ("comp_speed", 0, lo_message_get_source (msg));
+}
+
+int
+OSC::sel_comp_mode (float val, lo_message msg)
+{
+	OSCSurface *sur = get_surface(lo_message_get_source (msg));
+	boost::shared_ptr<Stripable> s;
+	if (sur->expand_enable) {
+		s = get_strip (sur->expand, lo_message_get_source (msg));
+	} else {
+		s = _select;
+	}
+	if (s) {
+		if (s->comp_mode_controllable()) {
+			s->comp_mode_controllable()->set_value (s->comp_mode_controllable()->interface_to_internal (val), PBD::Controllable::NoGroup);
+			return 0;
+		}
+	}
+	return sel_fail ("comp_mode", 0, lo_message_get_source (msg));
+}
+
+int
+OSC::sel_comp_makeup (float val, lo_message msg)
+{
+	OSCSurface *sur = get_surface(lo_message_get_source (msg));
+	boost::shared_ptr<Stripable> s;
+	if (sur->expand_enable) {
+		s = get_strip (sur->expand, lo_message_get_source (msg));
+	} else {
+		s = _select;
+	}
+	if (s) {
+		if (s->comp_makeup_controllable()) {
+			s->comp_makeup_controllable()->set_value (s->comp_makeup_controllable()->interface_to_internal (val), PBD::Controllable::NoGroup);
+			return 0;
+		}
+	}
+	return sel_fail ("comp_makeup", 0, lo_message_get_source (msg));
+}
+
+// EQ control
+
+int
+OSC::sel_eq_enable (float val, lo_message msg)
+{
+	OSCSurface *sur = get_surface(lo_message_get_source (msg));
+	boost::shared_ptr<Stripable> s;
+	if (sur->expand_enable) {
+		s = get_strip (sur->expand, lo_message_get_source (msg));
+	} else {
+		s = _select;
+	}
+	if (s) {
+		if (s->eq_enable_controllable()) {
+			s->eq_enable_controllable()->set_value (s->eq_enable_controllable()->interface_to_internal (val), PBD::Controllable::NoGroup);
+			return 0;
+		}
+	}
+	return sel_fail ("eq_enable", 0, lo_message_get_source (msg));
+}
+
+int
+OSC::sel_eq_hpf (float val, lo_message msg)
+{
+	OSCSurface *sur = get_surface(lo_message_get_source (msg));
+	boost::shared_ptr<Stripable> s;
+	if (sur->expand_enable) {
+		s = get_strip (sur->expand, lo_message_get_source (msg));
+	} else {
+		s = _select;
+	}
+	if (s) {
+		if (s->eq_hpf_controllable()) {
+			s->eq_hpf_controllable()->set_value (s->eq_hpf_controllable()->interface_to_internal (val), PBD::Controllable::NoGroup);
+			return 0;
+		}
+	}
+	return sel_fail ("eq_hpf", 0, lo_message_get_source (msg));
+}
+
+int
+OSC::sel_eq_gain (int id, float val, lo_message msg)
+{
+	OSCSurface *sur = get_surface(lo_message_get_source (msg));
+	boost::shared_ptr<Stripable> s;
+	if (sur->expand_enable) {
+		s = get_strip (sur->expand, lo_message_get_source (msg));
+	} else {
+		s = _select;
+	}
+	if (s) {
+		if (id > 0) {
+			--id;
+		}
+		if (s->eq_gain_controllable (id)) {
+			s->eq_gain_controllable (id)->set_value (s->eq_gain_controllable(id)->interface_to_internal (val), PBD::Controllable::NoGroup);
+			return 0;
+		}
+	}
+	return sel_send_fail ("eq_gain", id + 1, 0, lo_message_get_source (msg));
+}
+
+int
+OSC::sel_eq_freq (int id, float val, lo_message msg)
+{
+	OSCSurface *sur = get_surface(lo_message_get_source (msg));
+	boost::shared_ptr<Stripable> s;
+	if (sur->expand_enable) {
+		s = get_strip (sur->expand, lo_message_get_source (msg));
+	} else {
+		s = _select;
+	}
+	if (s) {
+		if (id > 0) {
+			--id;
+		}
+		if (s->eq_freq_controllable (id)) {
+			s->eq_freq_controllable (id)->set_value (s->eq_freq_controllable(id)->interface_to_internal (val), PBD::Controllable::NoGroup);
+			return 0;
+		}
+	}
+	return sel_send_fail ("eq_freq", id + 1, 0, lo_message_get_source (msg));
+}
+
+int
+OSC::sel_eq_q (int id, float val, lo_message msg)
+{
+	OSCSurface *sur = get_surface(lo_message_get_source (msg));
+	boost::shared_ptr<Stripable> s;
+	if (sur->expand_enable) {
+		s = get_strip (sur->expand, lo_message_get_source (msg));
+	} else {
+		s = _select;
+	}
+	if (s) {
+		if (id > 0) {
+			--id;
+		}
+		if (s->eq_q_controllable (id)) {
+			s->eq_q_controllable (id)->set_value (s->eq_q_controllable(id)->interface_to_internal (val), PBD::Controllable::NoGroup);
+			return 0;
+		}
+	}
+	return sel_send_fail ("eq_q", id + 1, 0, lo_message_get_source (msg));
+}
+
+int
+OSC::sel_eq_shape (int id, float val, lo_message msg)
+{
+	OSCSurface *sur = get_surface(lo_message_get_source (msg));
+	boost::shared_ptr<Stripable> s;
+	if (sur->expand_enable) {
+		s = get_strip (sur->expand, lo_message_get_source (msg));
+	} else {
+		s = _select;
+	}
+	if (s) {
+		if (id > 0) {
+			--id;
+		}
+		if (s->eq_shape_controllable (id)) {
+			s->eq_shape_controllable (id)->set_value (s->eq_shape_controllable(id)->interface_to_internal (val), PBD::Controllable::NoGroup);
+			return 0;
+		}
+	}
+	return sel_send_fail ("eq_shape", id + 1, 0, lo_message_get_source (msg));
+}
+
+void
+OSC::gui_selection_changed ()
+{
+	boost::shared_ptr<Stripable> strip = ControlProtocol::first_selected_stripable();
+
+	if (strip) {
+		_select = strip;
+		for (uint32_t it = 0; it < _surface.size(); ++it) {
+			OSCSurface* sur = &_surface[it];
+			if(!sur->expand_enable) {
+				lo_address addr = lo_address_new_from_url (sur->remote_url.c_str());
+				_strip_select (strip, addr);
+			}
+		}
+	}
+}
+
+// timer callbacks
+bool
+OSC::periodic (void)
+{
+	if (!tick) {
+		Glib::usleep(100); // let flurry of signals subside
+		if (global_init) {
+			for (uint32_t it = 0; it < _surface.size(); it++) {
+				OSCSurface* sur = &_surface[it];
+				lo_address addr = lo_address_new_from_url (sur->remote_url.c_str());
+				global_feedback (sur->feedback, addr, sur->gainmode);
+			}
+			global_init = false;
+			tick = true;
+		}
+		if (bank_dirty) {
+			_recalcbanks ();
+			bank_dirty = false;
+			tick = true;
+		}
+	}
+
+	for (GlobalObservers::iterator x = global_observers.begin(); x != global_observers.end(); x++) {
+
+		OSCGlobalObserver* go;
+
+		if ((go = dynamic_cast<OSCGlobalObserver*>(*x)) != 0) {
+			go->tick();
+		}
+	}
+	for (RouteObservers::iterator x = route_observers.begin(); x != route_observers.end(); x++) {
+
+		OSCRouteObserver* ro;
+
+		if ((ro = dynamic_cast<OSCRouteObserver*>(*x)) != 0) {
+			ro->tick();
+		}
+	}
+	for (uint32_t it = 0; it < _surface.size(); it++) {
+		OSCSurface* sur = &_surface[it];
+		OSCSelectObserver* so;
+		if ((so = dynamic_cast<OSCSelectObserver*>(sur->sel_obs)) != 0) {
+			so->tick();
+		}
+	}
+	return true;
+}
+
+int
+OSC::route_send_fail (string path, uint32_t ssid, float val, lo_address addr)
+{
+	OSCSurface *sur = get_surface(addr);
+
+	ostringstream os;
+	lo_message reply;
+	if (ssid) {
+		reply = lo_message_new ();
+		if (sur->feedback[2]) {
+			os << "/strip/" << path << "/" << ssid;
+		} else {
+			os << "/strip/" << path;
+			lo_message_add_int32 (reply, ssid);
+		}
+		string str_pth = os.str();
+		lo_message_add_float (reply, (float) val);
+
+		lo_send_message (addr, str_pth.c_str(), reply);
+		lo_message_free (reply);
+	}
+	if ((_select == get_strip (ssid, addr)) || ((sur->expand == ssid) && (sur->expand_enable))) {
+		os.str("");
+		os << "/select/" << path;
+		string sel_pth = os.str();
+		reply = lo_message_new ();
+		lo_message_add_float (reply, (float) val);
+		lo_send_message (addr, sel_pth.c_str(), reply);
+		lo_message_free (reply);
+	}
+
+	return 0;
+}
+
+int
+OSC::sel_fail (string path, float val, lo_address addr)
+{
+	ostringstream os;
+	os.str("");
+	os << "/select/" << path;
+	string sel_pth = os.str();
+	lo_message reply = lo_message_new ();
+	lo_message_add_float (reply, (float) val);
+	lo_send_message (addr, sel_pth.c_str(), reply);
+	lo_message_free (reply);
+
+	return 0;
+}
+
+int
+OSC::sel_send_fail (string path, uint32_t id, float val, lo_address addr)
+{
+	OSCSurface *sur = get_surface(addr);
+
+	ostringstream os;
+	lo_message reply;
+	reply = lo_message_new ();
+	if (sur->feedback[2]) {
+		os << "/select/" << path << "/" << id;
+	} else {
+		os << "/select/" << path;
+		lo_message_add_int32 (reply, id);
+	}
+	string str_pth = os.str();
+	lo_message_add_float (reply, (float) val);
+
+	lo_send_message (addr, str_pth.c_str(), reply);
+	lo_message_free (reply);
+
+	return 0;
+}
+
 XMLNode&
 OSC::get_state ()
 {
 	XMLNode& node (ControlProtocol::get_state());
 	node.add_property("debugmode", (int) _debugmode); // TODO: enum2str
+	if (_surface.size()) {
+		XMLNode* config = new XMLNode (X_("Configurations"));
+		for (uint32_t it = 0; it < _surface.size(); ++it) {
+			OSCSurface* sur = &_surface[it];
+			XMLNode* devnode = new XMLNode (X_("Configuration"));
+			devnode->add_property (X_("url"), sur->remote_url);
+			devnode->add_property (X_("bank-size"), sur->bank_size);
+			devnode->add_property (X_("strip-types"), sur->strip_types.to_ulong());
+			devnode->add_property (X_("feedback"), sur->feedback.to_ulong());
+			devnode->add_property (X_("gainmode"), sur->gainmode);
+			config->add_child_nocopy (*devnode);
+		}
+		node.add_child_nocopy (*config);
+	}
 	return node;
 }
 
@@ -1350,6 +3102,116 @@ OSC::set_state (const XMLNode& node, int version)
 	if (p) {
 		_debugmode = OSCDebugMode (PBD::atoi(p->value ()));
 	}
+	XMLNode* cnode = node.child (X_("Configurations"));
+
+	if (cnode) {
+		XMLNodeList const& devices = cnode->children();
+		for (XMLNodeList::const_iterator d = devices.begin(); d != devices.end(); ++d) {
+			XMLProperty const * prop = (*d)->property (X_("url"));
+			if (prop) {
+				OSCSurface s;
+				bank_dirty = true;
+				s.remote_url = prop->value();
+				prop = (*d)->property (X_("bank-size"));
+				if (prop) {
+					s.bank_size = atoi (prop->value().c_str());
+				}
+				prop = (*d)->property (X_("strip-types"));
+				if (prop) {
+					s.strip_types = atoi (prop->value().c_str());
+				}
+				prop = (*d)->property (X_("feedback"));
+				if (prop) {
+					s.feedback = atoi (prop->value().c_str());
+				}
+				prop = (*d)->property (X_("gainmode"));
+				if (prop) {
+					s.gainmode = atoi (prop->value().c_str());
+				}
+				s.bank = 1;
+				s.sel_obs = 0;
+				s.expand = 0;
+				s.expand_enable = false;
+				s.strips = get_sorted_stripables(s.strip_types);
+				s.nstrips = s.strips.size();
+				_surface.push_back (s);
+			}
+		}
+	}
+	global_init = true;
+	tick = false;
 
 	return 0;
 }
+
+// predicate for sort call in get_sorted_stripables
+struct StripableByPresentationOrder
+{
+	bool operator () (const boost::shared_ptr<Stripable> & a, const boost::shared_ptr<Stripable> & b) const
+	{
+		return a->presentation_info().order() < b->presentation_info().order();
+	}
+
+	bool operator () (const Stripable & a, const Stripable & b) const
+	{
+		return a.presentation_info().order() < b.presentation_info().order();
+	}
+
+	bool operator () (const Stripable * a, const Stripable * b) const
+	{
+		return a->presentation_info().order() < b->presentation_info().order();
+	}
+};
+
+OSC::Sorted
+OSC::get_sorted_stripables(std::bitset<32> types)
+{
+	Sorted sorted;
+
+	// fetch all stripables
+	StripableList stripables;
+
+	session->get_stripables (stripables);
+
+	// Look for stripables that match bit in sur->strip_types
+	for (StripableList::iterator it = stripables.begin(); it != stripables.end(); ++it) {
+
+		boost::shared_ptr<Stripable> s = *it;
+		if ((!types[9]) && (s->presentation_info().flags() & PresentationInfo::Hidden)) {
+			// do nothing... skip it
+		} else {
+
+			if (types[0] && (s->presentation_info().flags() & PresentationInfo::AudioTrack)) {
+				sorted.push_back (s);
+			} else
+			if (types[1] && (s->presentation_info().flags() & PresentationInfo::MidiTrack)) {
+				sorted.push_back (s);
+			} else
+			if (types[2] && (s->presentation_info().flags() & PresentationInfo::AudioBus)) {
+				sorted.push_back (s);
+			} else
+			if (types[3] && (s->presentation_info().flags() & PresentationInfo::MidiBus)) {
+				sorted.push_back (s);
+			} else
+			if (types[4] && (s->presentation_info().flags() & PresentationInfo::VCA)) {
+				sorted.push_back (s);
+			} else
+			if (types[8] && (s->presentation_info().flags() & PresentationInfo::Selected)) {
+				sorted.push_back (s);
+			} else
+			if (types[9] && (s->presentation_info().flags() & PresentationInfo::Hidden)) {
+				sorted.push_back (s);
+			}
+		}
+	}
+	sort (sorted.begin(), sorted.end(), StripableByPresentationOrder());
+	// Master/Monitor might be anywhere... we put them at the end - Sorry ;)
+	if (types[5]) {
+		sorted.push_back (session->master_out());
+	}
+	if (types[6]) {
+		sorted.push_back (session->monitor_out());
+	}
+	return sorted;
+}
+
diff --git a/libs/surfaces/osc/osc.h b/libs/surfaces/osc/osc.h
index a3b83e0..a30d84e 100644
--- a/libs/surfaces/osc/osc.h
+++ b/libs/surfaces/osc/osc.h
@@ -21,6 +21,8 @@
 #define ardour_osc_h
 
 #include <string>
+#include <vector>
+#include <bitset>
 
 #include <sys/time.h>
 #include <pthread.h>
@@ -37,10 +39,12 @@
 #include "ardour/types.h"
 #include "control_protocol/control_protocol.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 class OSCControllable;
 class OSCRouteObserver;
+class OSCGlobalObserver;
+class OSCSelectObserver;
 
 namespace ARDOUR {
 class Session;
@@ -80,7 +84,6 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
 	int set_feedback (bool yn);
 	bool get_feedback () const;
 
-	void set_namespace_root (std::string);
 
 	int start ();
 	int stop ();
@@ -93,6 +96,46 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
 		All
 	};
 
+	typedef std::vector<boost::shared_ptr<ARDOUR::Stripable> > Sorted;
+	Sorted get_sorted_stripables(std::bitset<32> types);
+
+// keep a surface's global setup by remote server url
+	struct OSCSurface {
+	public:
+		std::string remote_url;		// the url these setting belong to
+		uint32_t bank;				// current bank
+		uint32_t bank_size;			// size of banks for this surface
+		std::bitset<32> strip_types;// what strip types are a part of this bank
+		uint32_t nstrips;			// how many strips are there for strip_types
+		std::bitset<32> feedback;	// What is fed back? strips/meters/timecode/bar_beat/global
+		int gainmode;				// what kind of faders do we have Gain db or position 0 to 1?
+		uint32_t expand;			// Used by /select/select
+		bool expand_enable;			// use expand instead of select
+		OSCSelectObserver* sel_obs;	// So we can sync select feedback with selected channel
+		Sorted strips;				// list of stripables for this surface
+	};
+		/*
+		 * feedback bits:
+		 * [0] - Strips - buttons
+		 * [1] - Strips - variables (pots/faders)
+		 * [2] - Strips - Send SSID as path extension
+		 * [3] - Send heart beat to surface
+		 * [4] - Send feedback for master/global buttons/variables
+		 * [5] - Send Bar and Beat
+		 * [6] - Send Time code
+		 * [7] - Send metering as dB or positional depending on gainmode
+		 * [8] - Send metering as 16 bits (led strip)
+		 * [9] - Send signal present (signal greater than -20dB)
+		 * [10] - Send Playhead position as samples
+		 * [11] - Send Playhead position as minutes seconds
+		 * [12]	- Send Playhead position like primary/secondary GUI clocks
+		 */
+
+
+// storage for  each surface's settings
+	typedef std::vector<OSCSurface> Surface;
+	Surface _surface;
+
 	std::string get_server_url ();
 	void set_debug_mode (OSCDebugMode m) { _debugmode = m; }
 	OSCDebugMode get_debug_mode () { return _debugmode; }
@@ -114,9 +157,12 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
 	lo_server _osc_unix_server;
 	std::string _osc_unix_socket_path;
 	std::string _osc_url_file;
-	std::string _namespace_root;
 	bool _send_route_changes;
 	OSCDebugMode _debugmode;
+	bool tick;
+	bool bank_dirty;
+	bool global_init;
+	boost::shared_ptr<ARDOUR::Stripable> _select;	// which stripable out of /surface/stripables is gui selected
 
 	void register_callbacks ();
 
@@ -129,6 +175,10 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
 	// end "Application Hook" handles
 
 	std::string get_unix_server_url ();
+	OSCSurface * get_surface (lo_address addr);
+	uint32_t get_sid (boost::shared_ptr<ARDOUR::Stripable> strip, lo_address addr);
+	boost::shared_ptr<ARDOUR::Stripable> get_strip (uint32_t ssid, lo_address addr);
+	void global_feedback (std::bitset<32> feedback, lo_address addr, uint32_t gainmode);
 
 	void send_current_value (const char* path, lo_arg** argv, int argc, lo_message msg);
 	void current_value_query (const char* path, size_t len, lo_arg **argv, int argc, lo_message msg);
@@ -154,6 +204,7 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
         } \
         int cb_ ## name (const char *path, const char *types, lo_arg **argv, int argc, void *data) { \
 		OSC_DEBUG;              \
+		if (argc > 0 && !strcmp (types, "f") && argv[0]->f != 1.0) { return 0; } \
 		name (data);		\
 		return 0;		\
 	}
@@ -162,6 +213,8 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
 	PATH_CALLBACK_MSG(transport_frame);
 	PATH_CALLBACK_MSG(transport_speed);
 	PATH_CALLBACK_MSG(record_enabled);
+	PATH_CALLBACK_MSG(bank_up);
+	PATH_CALLBACK_MSG(bank_down);
 
 #define PATH_CALLBACK(name) \
         static int _ ## name (const char *path, const char *types, lo_arg **argv, int argc, void *data, void *user_data) { \
@@ -193,6 +246,7 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
 	PATH_CALLBACK(toggle_all_rec_enables);
 	PATH_CALLBACK(all_tracks_rec_in);
 	PATH_CALLBACK(all_tracks_rec_out);
+	PATH_CALLBACK(cancel_all_solos);
 	PATH_CALLBACK(remove_marker_at_playhead);
 	PATH_CALLBACK(mark_in);
 	PATH_CALLBACK(mark_out);
@@ -246,6 +300,57 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
 
 	PATH_CALLBACK1(jump_by_bars,f,);
 	PATH_CALLBACK1(jump_by_seconds,f,);
+	PATH_CALLBACK1(master_set_gain,f,);
+	PATH_CALLBACK1(master_set_fader,f,);
+	PATH_CALLBACK1(master_set_trim,f,);
+	PATH_CALLBACK1(master_set_mute,i,);
+	PATH_CALLBACK1(monitor_set_gain,f,);
+	PATH_CALLBACK1(monitor_set_fader,f,);
+
+#define PATH_CALLBACK1_MSG(name,arg1type)			\
+        static int _ ## name (const char *path, const char *types, lo_arg **argv, int argc, void *data, void *user_data) { \
+		return static_cast<OSC*>(user_data)->cb_ ## name (path, types, argv, argc, data); \
+        } \
+        int cb_ ## name (const char *path, const char *types, lo_arg **argv, int argc, void *data) { \
+		OSC_DEBUG;              \
+                if (argc > 0) {						\
+			name (argv[0]->arg1type, data); \
+                }							\
+		return 0;						\
+	}
+
+	// pan position needs message info to send feedback
+	PATH_CALLBACK1_MSG(master_set_pan_stereo_position,f);
+
+	PATH_CALLBACK1_MSG(set_surface_bank_size,i);
+	PATH_CALLBACK1_MSG(set_surface_strip_types,i);
+	PATH_CALLBACK1_MSG(set_surface_feedback,i);
+	PATH_CALLBACK1_MSG(set_surface_gainmode,i);
+	PATH_CALLBACK1_MSG(sel_recenable,i);
+	PATH_CALLBACK1_MSG(sel_recsafe,i);
+	PATH_CALLBACK1_MSG(sel_mute,i);
+	PATH_CALLBACK1_MSG(sel_solo,i);
+	PATH_CALLBACK1_MSG(sel_solo_iso,i);
+	PATH_CALLBACK1_MSG(sel_solo_safe,i);
+	PATH_CALLBACK1_MSG(sel_monitor_input,i);
+	PATH_CALLBACK1_MSG(sel_monitor_disk,i);
+	PATH_CALLBACK1_MSG(sel_phase,i);
+	PATH_CALLBACK1_MSG(sel_gain,f);
+	PATH_CALLBACK1_MSG(sel_fader,f);
+	PATH_CALLBACK1_MSG(sel_trim,f);
+	PATH_CALLBACK1_MSG(sel_pan_position,f);
+	PATH_CALLBACK1_MSG(sel_pan_width,f);
+	PATH_CALLBACK1_MSG(sel_pan_elevation,f);
+	PATH_CALLBACK1_MSG(sel_pan_frontback,f);
+	PATH_CALLBACK1_MSG(sel_pan_lfe,f);
+	PATH_CALLBACK1_MSG(sel_comp_enable,f);
+	PATH_CALLBACK1_MSG(sel_comp_threshold,f);
+	PATH_CALLBACK1_MSG(sel_comp_speed,f);
+	PATH_CALLBACK1_MSG(sel_comp_mode,f);
+	PATH_CALLBACK1_MSG(sel_comp_makeup,f);
+	PATH_CALLBACK1_MSG(sel_eq_enable,f);
+	PATH_CALLBACK1_MSG(sel_eq_hpf,f);
+	PATH_CALLBACK1_MSG(sel_expand,i);
 
 #define PATH_CALLBACK2(name,arg1type,arg2type)			\
         static int _ ## name (const char *path, const char *types, lo_arg **argv, int argc, void *data, void *user_data) { \
@@ -259,14 +364,26 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
 		return 0;						\
 	}
 
+#define PATH_CALLBACK2_MSG(name,arg1type,arg2type)			\
+        static int _ ## name (const char *path, const char *types, lo_arg **argv, int argc, void *data, void *user_data) { \
+		return static_cast<OSC*>(user_data)->cb_ ## name (path, types, argv, argc, data); \
+        } \
+        int cb_ ## name (const char *path, const char *types, lo_arg **argv, int argc, void *data) { \
+		OSC_DEBUG;              \
+                if (argc > 1) {						\
+			name (argv[0]->arg1type, argv[1]->arg2type, data); \
+                }							\
+		return 0;						\
+	}
+
 #define PATH_CALLBACK3(name,arg1type,arg2type,arg3type)                \
         static int _ ## name (const char *path, const char *types, lo_arg **argv, int argc, void *data, void *user_data) { \
                return static_cast<OSC*>(user_data)->cb_ ## name (path, types, argv, argc, data); \
         } \
-        int cb_ ## name (const char *path, const char *types, lo_arg **argv, int argc, void *) { \
+        int cb_ ## name (const char *path, const char *types, lo_arg **argv, int argc, void *data) { \
 		OSC_DEBUG;              \
                 if (argc > 1) {                                                \
-                 name (argv[0]->arg1type, argv[1]->arg2type,argv[2]->arg3type); \
+                 name (argv[0]->arg1type, argv[1]->arg2type,argv[2]->arg3type, data); \
                 }                                                      \
                return 0;                                               \
        }
@@ -275,55 +392,152 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
         static int _ ## name (const char *path, const char *types, lo_arg **argv, int argc, void *data, void *user_data) { \
                return static_cast<OSC*>(user_data)->cb_ ## name (path, types, argv, argc, data); \
         } \
-        int cb_ ## name (const char *path, const char *types, lo_arg **argv, int argc, void *) { \
+        int cb_ ## name (const char *path, const char *types, lo_arg **argv, int argc, void *data) { \
 		OSC_DEBUG;              \
                 if (argc > 1) {                                                \
-                 name (argv[0]->arg1type, argv[1]->arg2type,argv[2]->arg3type,argv[3]->arg4type); \
+                 name (argv[0]->arg1type, argv[1]->arg2type,argv[2]->arg3type,argv[3]->arg4type, data); \
                 }                                                      \
                return 0;                                               \
        }
 
-        PATH_CALLBACK2(locate,i,i);
-        PATH_CALLBACK2(loop_location,i,i);
-	PATH_CALLBACK2(route_mute,i,i);
-	PATH_CALLBACK2(route_solo,i,i);
-	PATH_CALLBACK2(route_recenable,i,i);
-	PATH_CALLBACK2(route_set_gain_abs,i,f);
-	PATH_CALLBACK2(route_set_gain_dB,i,f);
-	PATH_CALLBACK2(route_set_trim_abs,i,f);
-	PATH_CALLBACK2(route_set_trim_dB,i,f);
-	PATH_CALLBACK2(route_set_pan_stereo_position,i,f);
-	PATH_CALLBACK2(route_set_pan_stereo_width,i,f);
-        PATH_CALLBACK3(route_set_send_gain_abs,i,i,f);
-        PATH_CALLBACK3(route_set_send_gain_dB,i,i,f);
-        PATH_CALLBACK4(route_plugin_parameter,i,i,i,f);
-        PATH_CALLBACK3(route_plugin_parameter_print,i,i,i);
-
-	int route_mute (int rid, int yn);
-	int route_solo (int rid, int yn);
-	int route_recenable (int rid, int yn);
-	int route_set_gain_abs (int rid, float level);
-	int route_set_gain_dB (int rid, float dB);
-	int route_set_trim_abs (int rid, float level);
-	int route_set_trim_dB (int rid, float dB);
-	int route_set_pan_stereo_position (int rid, float left_right_fraction);
-	int route_set_pan_stereo_width (int rid, float percent);
-	int route_set_send_gain_abs (int rid, int sid, float val);
-	int route_set_send_gain_dB (int rid, int sid, float val);
-	int route_plugin_parameter (int rid, int piid,int par, float val);
-	int route_plugin_parameter_print (int rid, int piid,int par);
-
-	void listen_to_route (boost::shared_ptr<ARDOUR::Route>, lo_address);
-	void end_listen (boost::shared_ptr<ARDOUR::Route>, lo_address);
-	void drop_route (boost::weak_ptr<ARDOUR::Route>);
+	PATH_CALLBACK2_MSG(sel_sendgain,i,f);
+	PATH_CALLBACK2_MSG(sel_sendfader,i,f);
+	PATH_CALLBACK2_MSG(sel_sendenable,i,f);
+	PATH_CALLBACK2_MSG(sel_eq_gain,i,f);
+	PATH_CALLBACK2_MSG(sel_eq_freq,i,f);
+	PATH_CALLBACK2_MSG(sel_eq_q,i,f);
+	PATH_CALLBACK2_MSG(sel_eq_shape,i,f);
+
+	PATH_CALLBACK4(set_surface,i,i,i,i);
+	PATH_CALLBACK2(locate,i,i);
+	PATH_CALLBACK2(loop_location,i,i);
+	PATH_CALLBACK2_MSG(route_mute,i,i);
+	PATH_CALLBACK2_MSG(route_solo,i,i);
+	PATH_CALLBACK2_MSG(route_solo_iso,i,i);
+	PATH_CALLBACK2_MSG(route_solo_safe,i,i);
+	PATH_CALLBACK2_MSG(route_recenable,i,i);
+	PATH_CALLBACK2_MSG(route_recsafe,i,i);
+	PATH_CALLBACK2_MSG(route_monitor_input,i,i);
+	PATH_CALLBACK2_MSG(route_monitor_disk,i,i);
+	PATH_CALLBACK2_MSG(strip_phase,i,i);
+	PATH_CALLBACK2_MSG(strip_expand,i,i);
+	PATH_CALLBACK2_MSG(strip_gui_select,i,i);
+	PATH_CALLBACK2_MSG(route_set_gain_dB,i,f);
+	PATH_CALLBACK2_MSG(route_set_gain_fader,i,f);
+	PATH_CALLBACK2_MSG(route_set_trim_dB,i,f);
+	PATH_CALLBACK2_MSG(route_set_pan_stereo_position,i,f);
+	PATH_CALLBACK2_MSG(route_set_pan_stereo_width,i,f);
+	PATH_CALLBACK3(route_set_send_gain_dB,i,i,f);
+	PATH_CALLBACK3(route_set_send_fader,i,i,f);
+	PATH_CALLBACK3(route_set_send_enable,i,i,f);
+	PATH_CALLBACK4(route_plugin_parameter,i,i,i,f);
+	PATH_CALLBACK3(route_plugin_parameter_print,i,i,i);
+
+	int route_mute (int rid, int yn, lo_message msg);
+	int route_solo (int rid, int yn, lo_message msg);
+	int route_solo_iso (int rid, int yn, lo_message msg);
+	int route_solo_safe (int rid, int yn, lo_message msg);
+	int route_recenable (int rid, int yn, lo_message msg);
+	int route_recsafe (int ssid, int yn, lo_message msg);
+	int route_monitor_input (int rid, int yn, lo_message msg);
+	int route_monitor_disk (int rid, int yn, lo_message msg);
+	int strip_phase (int rid, int yn, lo_message msg);
+	int strip_expand (int rid, int yn, lo_message msg);
+	int _strip_select (boost::shared_ptr<ARDOUR::Stripable> s, lo_address addr);
+	int strip_gui_select (int rid, int yn, lo_message msg);
+	int route_set_gain_abs (int rid, float level, lo_message msg);
+	int route_set_gain_dB (int rid, float dB, lo_message msg);
+	int route_set_gain_fader (int rid, float pos, lo_message msg);
+	int route_set_trim_abs (int rid, float level, lo_message msg);
+	int route_set_trim_dB (int rid, float dB, lo_message msg);
+	int route_set_pan_stereo_position (int rid, float left_right_fraction, lo_message msg);
+	int route_set_pan_stereo_width (int rid, float percent, lo_message msg);
+	int route_set_send_gain_dB (int rid, int sid, float val, lo_message msg);
+	int route_set_send_fader (int rid, int sid, float val, lo_message msg);
+	int route_set_send_enable (int rid, int sid, float val, lo_message msg);
+	int route_plugin_parameter (int rid, int piid,int par, float val, lo_message msg);
+	int route_plugin_parameter_print (int rid, int piid,int par, lo_message msg);
+
+	//banking functions
+	int set_bank (uint32_t bank_start, lo_message msg);
+	int _set_bank (uint32_t bank_start, lo_address addr);
+	int bank_up (lo_message msg);
+	int bank_down (lo_message msg);
+	int set_surface (uint32_t b_size, uint32_t strips, uint32_t fb, uint32_t gmode, lo_message msg);
+	int set_surface_bank_size (uint32_t bs, lo_message msg);
+	int set_surface_strip_types (uint32_t st, lo_message msg);
+	int set_surface_feedback (uint32_t fb, lo_message msg);
+	int set_surface_gainmode (uint32_t gm, lo_message msg);
+
+	int master_set_gain (float dB);
+	int master_set_fader (float position);
+	int master_set_trim (float dB);
+	int master_set_pan_stereo_position (float position, lo_message msg);
+	int master_set_mute (uint32_t state);
+	int monitor_set_gain (float dB);
+	int monitor_set_fader (float position);
+	int sel_recenable (uint32_t state, lo_message msg);
+	int sel_recsafe (uint32_t state, lo_message msg);
+	int sel_mute (uint32_t state, lo_message msg);
+	int sel_solo (uint32_t state, lo_message msg);
+	int sel_solo_iso (uint32_t state, lo_message msg);
+	int sel_solo_safe (uint32_t state, lo_message msg);
+	int sel_monitor_input (uint32_t state, lo_message msg);
+	int sel_monitor_disk (uint32_t state, lo_message msg);
+	int sel_phase (uint32_t state, lo_message msg);
+	int sel_gain (float state, lo_message msg);
+	int sel_fader (float state, lo_message msg);
+	int sel_trim (float val, lo_message msg);
+	int sel_pan_position (float val, lo_message msg);
+	int sel_pan_width (float val, lo_message msg);
+	int sel_sendgain (int id, float dB, lo_message msg);
+	int sel_sendfader (int id, float pos, lo_message msg);
+	int sel_sendenable (int id, float pos, lo_message msg);
+	int sel_expand (uint32_t state, lo_message msg);
+	int sel_pan_elevation (float val, lo_message msg);
+	int sel_pan_frontback (float val, lo_message msg);
+	int sel_pan_lfe (float val, lo_message msg);
+	int sel_comp_enable (float val, lo_message msg);
+	int sel_comp_threshold (float val, lo_message msg);
+	int sel_comp_speed (float val, lo_message msg);
+	int sel_comp_mode (float val, lo_message msg);
+	int sel_comp_makeup (float val, lo_message msg);
+	int sel_eq_enable (float val, lo_message msg);
+	int sel_eq_hpf (float val, lo_message msg);
+	int sel_eq_gain (int id, float val, lo_message msg);
+	int sel_eq_freq (int id, float val, lo_message msg);
+	int sel_eq_q (int id, float val, lo_message msg);
+	int sel_eq_shape (int id, float val, lo_message msg);
+
+	void listen_to_route (boost::shared_ptr<ARDOUR::Stripable>, lo_address);
+	void end_listen (boost::shared_ptr<ARDOUR::Stripable>, lo_address);
+	void drop_route (boost::weak_ptr<ARDOUR::Stripable>);
+	void route_lost (boost::weak_ptr<ARDOUR::Stripable>);
+	void gui_selection_changed (void);
 
 	void route_name_changed (const PBD::PropertyChange&, boost::weak_ptr<ARDOUR::Route> r, lo_address addr);
+	void recalcbanks ();
+	void _recalcbanks ();
+	void notify_routes_added (ARDOUR::RouteList &);
+	void notify_vca_added (ARDOUR::VCAList &);
 
 	void update_clock ();
+	int cancel_all_solos ();
+	bool periodic (void);
+	sigc::connection periodic_connection;
+	PBD::ScopedConnectionList session_connections;
+
+	int route_send_fail (std::string path, uint32_t ssid, float val, lo_address addr);
+	int sel_send_fail (std::string path, uint32_t id, float val, lo_address addr);
+	int sel_fail (std::string path, float val, lo_address addr);
 
 	typedef std::list<OSCRouteObserver*> RouteObservers;
 
 	RouteObservers route_observers;
+
+	typedef std::list<OSCGlobalObserver*> GlobalObservers;
+	GlobalObservers global_observers;
+
 	void debugmsg (const char *prefix, const char *path, const char* types, lo_arg **argv, int argc);
 
 	static OSC* _instance;
diff --git a/libs/surfaces/osc/osc_controllable.cc b/libs/surfaces/osc/osc_controllable.cc
index 2cd4c31..23bc4a7 100644
--- a/libs/surfaces/osc/osc_controllable.cc
+++ b/libs/surfaces/osc/osc_controllable.cc
@@ -27,7 +27,6 @@
 #include "osc.h"
 #include "osc_controllable.h"
 
-using namespace sigc;
 using namespace PBD;
 using namespace ARDOUR;
 using namespace ArdourSurface;
@@ -90,7 +89,9 @@ OSCRouteControllable::send_change_message ()
 {
 	lo_message msg = lo_message_new ();
 
-	lo_message_add_int32 (msg, _route->remote_control_id());
+	/* Can only send ID part of RID at present */
+
+	lo_message_add_int32 (msg, _route->presentation_info().order());
 	lo_message_add_float (msg, (float) controllable->get_value());
 
 	/* XXX thread issues */
diff --git a/libs/surfaces/osc/osc_global_observer.cc b/libs/surfaces/osc/osc_global_observer.cc
new file mode 100644
index 0000000..72928e3
--- /dev/null
+++ b/libs/surfaces/osc/osc_global_observer.cc
@@ -0,0 +1,382 @@
+/*
+    Copyright (C) 2009 Paul Davis
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#include "boost/lambda/lambda.hpp"
+
+#include "ardour/session.h"
+#include "ardour/dB.h"
+#include "ardour/meter.h"
+
+#include "osc.h"
+#include "osc_global_observer.h"
+
+#include "pbd/i18n.h"
+
+using namespace std;
+using namespace PBD;
+using namespace ARDOUR;
+using namespace ArdourSurface;
+
+OSCGlobalObserver::OSCGlobalObserver (Session& s, lo_address a, uint32_t gm, std::bitset<32> fb)
+	: gainmode (gm)
+	,feedback (fb)
+{
+	if (feedback[4]) {
+		addr = lo_address_new (lo_address_get_hostname(a) , lo_address_get_port(a));
+		session = &s;
+		_last_frame = -1;
+
+		// connect to all the things we want to send feed back from
+
+		/*
+		* 	Master (todo)
+		* 		Pan width
+		*/
+
+		// Master channel first
+		boost::shared_ptr<Stripable> strip = session->master_out();
+
+		boost::shared_ptr<Controllable> mute_controllable = boost::dynamic_pointer_cast<Controllable>(strip->mute_control());
+		mute_controllable->Changed.connect (strip_connections, MISSING_INVALIDATOR, bind (&OSCGlobalObserver::send_change_message, this, X_("/master/mute"), strip->mute_control()), OSC::instance());
+		send_change_message ("/master/mute", strip->mute_control());
+
+		boost::shared_ptr<Controllable> trim_controllable = boost::dynamic_pointer_cast<Controllable>(strip->trim_control());
+		trim_controllable->Changed.connect (strip_connections, MISSING_INVALIDATOR, bind (&OSCGlobalObserver::send_trim_message, this, X_("/master/trimdB"), strip->trim_control()), OSC::instance());
+		send_trim_message ("/master/trimdB", strip->trim_control());
+
+		boost::shared_ptr<Controllable> pan_controllable = boost::dynamic_pointer_cast<Controllable>(strip->pan_azimuth_control());
+		if (pan_controllable) {
+			pan_controllable->Changed.connect (strip_connections, MISSING_INVALIDATOR, bind (&OSCGlobalObserver::send_change_message, this, X_("/master/pan_stereo_position"), strip->pan_azimuth_control()), OSC::instance());
+			send_change_message ("/master/pan_stereo_position", strip->pan_azimuth_control());
+		}
+
+		boost::shared_ptr<Controllable> gain_controllable = boost::dynamic_pointer_cast<Controllable>(strip->gain_control());
+		if (gainmode) {
+			gain_controllable->Changed.connect (strip_connections, MISSING_INVALIDATOR, bind (&OSCGlobalObserver::send_gain_message, this, X_("/master/fader"), strip->gain_control()), OSC::instance());
+			send_gain_message ("/master/fader", strip->gain_control());
+		} else {
+			gain_controllable->Changed.connect (strip_connections, MISSING_INVALIDATOR, bind (&OSCGlobalObserver::send_gain_message, this, X_("/master/gain"), strip->gain_control()), OSC::instance());
+			send_gain_message ("/master/gain", strip->gain_control());
+		}
+
+		// monitor stuff next
+		/*
+		* 	Monitor (todo)
+		* 		Mute
+		* 		Dim
+		* 		Mono
+		* 		Rude Solo
+		* 		etc.
+		*/
+		strip = session->monitor_out();
+		if (strip) {
+
+			// Hmm, it seems the monitor mute is not at route->mute_control()
+			/*boost::shared_ptr<Controllable> mute_controllable2 = boost::dynamic_pointer_cast<Controllable>(strip->mute_control());
+			//mute_controllable = boost::dynamic_pointer_cast<Controllable>(r2->mute_control());
+			mute_controllable2->Changed.connect (monitor_mute_connection, MISSING_INVALIDATOR, bind (&OSCGlobalObserver::send_change_message, this, X_("/monitor/mute"), strip->mute_control()), OSC::instance());
+			send_change_message ("/monitor/mute", strip->mute_control());
+			*/
+			gain_controllable = boost::dynamic_pointer_cast<Controllable>(strip->gain_control());
+			if (gainmode) {
+				gain_controllable->Changed.connect (strip_connections, MISSING_INVALIDATOR, bind (&OSCGlobalObserver::send_gain_message, this, X_("/monitor/fader"), strip->gain_control()), OSC::instance());
+				send_gain_message ("/monitor/fader", strip->gain_control());
+			} else {
+				gain_controllable->Changed.connect (strip_connections, MISSING_INVALIDATOR, bind (&OSCGlobalObserver::send_gain_message, this, X_("/monitor/gain"), strip->gain_control()), OSC::instance());
+				send_gain_message ("/monitor/gain", strip->gain_control());
+			}
+		}
+
+		/*
+		* 	Transport (todo)
+		* 		punchin/out
+		*/
+		//Transport feedback
+		session->TransportStateChange.connect(session_connections, MISSING_INVALIDATOR, boost::bind (&OSCGlobalObserver::send_transport_state_changed, this), OSC::instance());
+		send_transport_state_changed ();
+		session->TransportLooped.connect(session_connections, MISSING_INVALIDATOR, boost::bind (&OSCGlobalObserver::send_transport_state_changed, this), OSC::instance());
+		session->RecordStateChanged.connect(session_connections, MISSING_INVALIDATOR, boost::bind (&OSCGlobalObserver::send_record_state_changed, this), OSC::instance());
+		send_record_state_changed ();
+
+		// session feedback
+		session->StateSaved.connect(session_connections, MISSING_INVALIDATOR, boost::bind (&OSCGlobalObserver::send_session_saved, this, _1), OSC::instance());
+		send_session_saved (session->snap_name());
+		session->SoloActive.connect(session_connections, MISSING_INVALIDATOR, boost::bind (&OSCGlobalObserver::solo_active, this, _1), OSC::instance());
+		solo_active (session->soloing() || session->listening());
+
+		/*
+		* 	Maybe (many) more
+		*/
+	}
+}
+
+OSCGlobalObserver::~OSCGlobalObserver ()
+{
+
+	strip_connections.drop_connections ();
+	session_connections.drop_connections ();
+
+	lo_address_free (addr);
+}
+
+void
+OSCGlobalObserver::tick ()
+{
+	framepos_t now_frame = session->transport_frame();
+	if (now_frame != _last_frame) {
+		if (feedback[6]) { // timecode enabled
+			Timecode::Time timecode;
+			session->timecode_time (now_frame, timecode);
+
+			// Timecode mode: Hours/Minutes/Seconds/Frames
+			ostringstream os;
+			os << setw(2) << setfill('0') << timecode.hours;
+			os << ':';
+			os << setw(2) << setfill('0') << timecode.minutes;
+			os << ':';
+			os << setw(2) << setfill('0') << timecode.seconds;
+			os << ':';
+			os << setw(2) << setfill('0') << timecode.frames;
+
+			lo_message msg = lo_message_new ();
+			lo_message_add_string (msg, os.str().c_str());
+			lo_send_message (addr, "/position/smpte", msg);
+			lo_message_free (msg);
+		}
+		if (feedback[5]) { // Bar beat enabled
+			Timecode::BBT_Time bbt_time;
+
+			session->bbt_time (now_frame, bbt_time);
+
+			// semantics:  BBB/bb/tttt
+			ostringstream os;
+
+			os << setw(3) << setfill('0') << bbt_time.bars;
+			os << '|';
+			os << setw(2) << setfill('0') << bbt_time.beats;
+			os << '|';
+			os << setw(4) << setfill('0') << bbt_time.ticks;
+
+			lo_message msg = lo_message_new ();
+			lo_message_add_string (msg, os.str().c_str());
+			lo_send_message (addr, "/position/bbt", msg);
+			lo_message_free (msg);
+		}
+		if (feedback[11]) { // minutes/seconds enabled
+			framepos_t left = now_frame;
+			int hrs = (int) floor (left / (session->frame_rate() * 60.0f * 60.0f));
+			left -= (framecnt_t) floor (hrs * session->frame_rate() * 60.0f * 60.0f);
+			int mins = (int) floor (left / (session->frame_rate() * 60.0f));
+			left -= (framecnt_t) floor (mins * session->frame_rate() * 60.0f);
+			int secs = (int) floor (left / (float) session->frame_rate());
+			left -= (framecnt_t) floor ((double)(secs * session->frame_rate()));
+			int millisecs = floor (left * 1000.0 / (float) session->frame_rate());
+
+			// Min/sec mode: Hours/Minutes/Seconds/msec
+			ostringstream os;
+			os << setw(2) << setfill('0') << hrs;
+			os << ':';
+			os << setw(2) << setfill('0') << mins;
+			os << ':';
+			os << setw(2) << setfill('0') << secs;
+			os << '.';
+			os << setw(3) << setfill('0') << millisecs;
+
+			lo_message msg = lo_message_new ();
+			lo_message_add_string (msg, os.str().c_str());
+			lo_send_message (addr, "/position/time", msg);
+			lo_message_free (msg);
+		}
+		if (feedback[10]) { // samples
+			ostringstream os;
+			os << now_frame;
+			lo_message msg = lo_message_new ();
+			lo_message_add_string (msg, os.str().c_str());
+			lo_send_message (addr, "/position/samples", msg);
+			lo_message_free (msg);
+		}
+		_last_frame = now_frame;
+	}
+	if (feedback[3]) { //heart beat enabled
+		if (_heartbeat == 10) {
+			lo_message msg = lo_message_new ();
+			lo_message_add_float (msg, 1.0);
+			lo_send_message (addr, "/heartbeat", msg);
+			lo_message_free (msg);
+		}
+		if (!_heartbeat) {
+			lo_message msg = lo_message_new ();
+			lo_message_add_float (msg, 0.0);
+			lo_send_message (addr, "/heartbeat", msg);
+			lo_message_free (msg);
+		}
+		_heartbeat++;
+		if (_heartbeat > 20) _heartbeat = 0;
+	}
+	if (feedback[7] || feedback[8] || feedback[9]) { // meters enabled
+		// the only meter here is master
+		float now_meter = session->master_out()->peak_meter()->meter_level(0, MeterMCP);
+		if (now_meter < -94) now_meter = -193;
+		if (_last_meter != now_meter) {
+			if (feedback[7] || feedback[8]) {
+				lo_message msg = lo_message_new ();
+				if (gainmode && feedback[7]) {
+					// change from db to 0-1
+					lo_message_add_float (msg, ((now_meter + 94) / 100));
+					lo_send_message (addr, "/master/meter", msg);
+				} else if ((!gainmode) && feedback[7]) {
+					lo_message_add_float (msg, now_meter);
+					lo_send_message (addr, "/master/meter", msg);
+				} else if (feedback[8]) {
+					uint32_t ledlvl = (uint32_t)(((now_meter + 54) / 3.75)-1);
+					uint32_t ledbits = ~(0xfff<<ledlvl);
+					lo_message_add_int32 (msg, ledbits);
+					lo_send_message (addr, "/master/meter", msg);
+				}
+				lo_message_free (msg);
+			}
+			if (feedback[9]) {
+				lo_message msg = lo_message_new ();
+				float signal;
+				if (now_meter < -40) {
+					signal = 0;
+				} else {
+					signal = 1;
+				}
+				lo_message_add_float (msg, signal);
+				lo_send_message (addr, "/master/signal", msg);
+				lo_message_free (msg);
+			}
+		}
+		_last_meter = now_meter;
+
+	}
+}
+
+void
+OSCGlobalObserver::send_change_message (string path, boost::shared_ptr<Controllable> controllable)
+{
+	lo_message msg = lo_message_new ();
+
+	lo_message_add_float (msg, (float) controllable->get_value());
+
+
+	lo_send_message (addr, path.c_str(), msg);
+	lo_message_free (msg);
+}
+
+void
+OSCGlobalObserver::send_gain_message (string path, boost::shared_ptr<Controllable> controllable)
+{
+	lo_message msg = lo_message_new ();
+
+	if (gainmode) {
+		lo_message_add_float (msg, gain_to_slider_position (controllable->get_value()));
+	} else {
+		if (controllable->get_value() < 1e-15) {
+			lo_message_add_float (msg, -200);
+		} else {
+			lo_message_add_float (msg, accurate_coefficient_to_dB (controllable->get_value()));
+		}
+	}
+
+	lo_send_message (addr, path.c_str(), msg);
+	lo_message_free (msg);
+}
+
+void
+OSCGlobalObserver::send_trim_message (string path, boost::shared_ptr<Controllable> controllable)
+{
+	lo_message msg = lo_message_new ();
+
+	lo_message_add_float (msg, (float) accurate_coefficient_to_dB (controllable->get_value()));
+
+	lo_send_message (addr, path.c_str(), msg);
+	lo_message_free (msg);
+}
+
+
+void
+OSCGlobalObserver::send_transport_state_changed()
+{
+
+	lo_message msg = lo_message_new ();
+	lo_message_add_int32 (msg, session->get_play_loop());
+	lo_send_message (addr, "/loop_toggle", msg);
+	lo_message_free (msg);
+
+	msg = lo_message_new ();
+	lo_message_add_int32 (msg, session->transport_speed() == 1.0);
+	lo_send_message (addr, "/transport_play", msg);
+	lo_message_free (msg);
+
+	msg = lo_message_new ();
+	lo_message_add_int32 (msg, session->transport_stopped ());
+	lo_send_message (addr, "/transport_stop", msg);
+	lo_message_free (msg);
+
+	msg = lo_message_new ();
+	lo_message_add_int32 (msg, session->transport_speed() < 0.0);
+	lo_send_message (addr, "/rewind", msg);
+	lo_message_free (msg);
+
+	msg = lo_message_new ();
+	lo_message_add_int32 (msg, (session->transport_speed() != 1.0 && session->transport_speed() > 0.0));
+	lo_send_message (addr, "/ffwd", msg);
+	lo_message_free (msg);
+
+}
+
+void
+OSCGlobalObserver::send_record_state_changed ()
+{
+	lo_message msg = lo_message_new ();
+	lo_message_add_int32 (msg, (int)session->get_record_enabled ());
+	lo_send_message (addr, "/rec_enable_toggle", msg);
+	lo_message_free (msg);
+
+	msg = lo_message_new ();
+	if (session->have_rec_enabled_track ()) {
+		lo_message_add_int32 (msg, 1);
+	} else {
+		lo_message_add_int32 (msg, 0);
+	}
+	lo_send_message (addr, "/record_tally", msg);
+	lo_message_free (msg);
+
+}
+
+void
+OSCGlobalObserver::send_session_saved (std::string name)
+{
+	lo_message msg = lo_message_new ();
+	lo_message_add_string (msg, name.c_str());
+	lo_send_message (addr, "/session_name", msg);
+	lo_message_free (msg);
+
+}
+
+void
+OSCGlobalObserver::solo_active (bool active)
+{
+	lo_message msg = lo_message_new ();
+	lo_message_add_float (msg, (float) active);
+	lo_send_message (addr, "/cancel_all_solos", msg);
+	lo_message_free (msg);
+}
diff --git a/libs/surfaces/osc/osc_global_observer.h b/libs/surfaces/osc/osc_global_observer.h
new file mode 100644
index 0000000..845b9b9
--- /dev/null
+++ b/libs/surfaces/osc/osc_global_observer.h
@@ -0,0 +1,66 @@
+/*
+    Copyright (C) 2009 Paul Davis
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#ifndef __osc_oscglobalobserver_h__
+#define __osc_oscglobalobserver_h__
+
+#include <string>
+#include <boost/shared_ptr.hpp>
+#include <sigc++/sigc++.h>
+#include <lo/lo.h>
+
+#include "pbd/controllable.h"
+#include "pbd/stateful.h"
+#include "ardour/types.h"
+
+class OSCGlobalObserver
+{
+
+  public:
+	OSCGlobalObserver (ARDOUR::Session& s, lo_address addr, uint32_t gainmode, std::bitset<32> feedback);
+	~OSCGlobalObserver ();
+
+	lo_address address() const { return addr; };
+	void tick (void);
+
+  private:
+
+	PBD::ScopedConnectionList strip_connections;
+	PBD::ScopedConnectionList session_connections;
+
+
+	lo_address addr;
+	std::string path;
+	uint32_t gainmode;
+	std::bitset<32> feedback;
+	ARDOUR::Session* session;
+	framepos_t _last_frame;
+	uint32_t _heartbeat;
+	float _last_meter;
+
+	void send_change_message (std::string path, boost::shared_ptr<PBD::Controllable> controllable);
+	void send_gain_message (std::string path, boost::shared_ptr<PBD::Controllable> controllable);
+	void send_trim_message (std::string path, boost::shared_ptr<PBD::Controllable> controllable);
+	void send_transport_state_changed(void);
+	void send_record_state_changed (void);
+	void send_session_saved (std::string name);
+	void solo_active (bool active);
+};
+
+#endif /* __osc_oscglobalobserver_h__ */
diff --git a/libs/surfaces/osc/osc_gui.cc b/libs/surfaces/osc/osc_gui.cc
index 7879b75..9fd2fce 100644
--- a/libs/surfaces/osc/osc_gui.cc
+++ b/libs/surfaces/osc/osc_gui.cc
@@ -33,7 +33,7 @@
 
 #include "osc.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 namespace ArdourSurface {
 
diff --git a/libs/surfaces/osc/osc_route_observer.cc b/libs/surfaces/osc/osc_route_observer.cc
index 8bb511b..7c9374a 100644
--- a/libs/surfaces/osc/osc_route_observer.cc
+++ b/libs/surfaces/osc/osc_route_observer.cc
@@ -19,73 +19,221 @@
 
 #include "boost/lambda/lambda.hpp"
 
-#include "ardour/route.h"
-#include "ardour/audio_track.h"
-#include "ardour/midi_track.h"
+#include "ardour/session.h"
+#include "ardour/track.h"
+#include "ardour/monitor_control.h"
+#include "ardour/dB.h"
+#include "ardour/meter.h"
 
 #include "osc.h"
 #include "osc_route_observer.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace PBD;
 using namespace ARDOUR;
 using namespace ArdourSurface;
 
-OSCRouteObserver::OSCRouteObserver (boost::shared_ptr<Route> r, lo_address a)
-	: _route (r)
+OSCRouteObserver::OSCRouteObserver (boost::shared_ptr<Stripable> s, lo_address a, uint32_t ss, uint32_t gm, std::bitset<32> fb)
+	: _strip (s)
+	,ssid (ss)
+	,gainmode (gm)
+	,feedback (fb)
 {
 	addr = lo_address_new (lo_address_get_hostname(a) , lo_address_get_port(a));
 
-	_route->PropertyChanged.connect (name_changed_connection, MISSING_INVALIDATOR, boost::bind (&OSCRouteObserver::name_changed, this, boost::lambda::_1), OSC::instance());
+	if (feedback[0]) { // buttons are separate feedback
+		_strip->PropertyChanged.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCRouteObserver::name_changed, this, boost::lambda::_1), OSC::instance());
+		name_changed (ARDOUR::Properties::name);
 
-	if (boost::dynamic_pointer_cast<AudioTrack>(_route) || boost::dynamic_pointer_cast<MidiTrack>(_route)) {
+		_strip->mute_control()->Changed.connect (strip_connections, MISSING_INVALIDATOR, bind (&OSCRouteObserver::send_change_message, this, X_("/strip/mute"), _strip->mute_control()), OSC::instance());
+		send_change_message ("/strip/mute", _strip->mute_control());
 
-		boost::shared_ptr<Track> track = boost::dynamic_pointer_cast<Track>(r);
-		boost::shared_ptr<Controllable> rec_controllable = boost::dynamic_pointer_cast<Controllable>(track->rec_enable_control());
+		_strip->solo_control()->Changed.connect (strip_connections, MISSING_INVALIDATOR, bind (&OSCRouteObserver::send_change_message, this, X_("/strip/solo"), _strip->solo_control()), OSC::instance());
+		send_change_message ("/strip/solo", _strip->solo_control());
 
-		rec_controllable->Changed.connect (rec_changed_connection, MISSING_INVALIDATOR, bind (&OSCRouteObserver::send_change_message, this, X_("/route/rec"), track->rec_enable_control()), OSC::instance());
+		boost::shared_ptr<Track> track = boost::dynamic_pointer_cast<Track> (_strip);
+		if (track) {
+			track->monitoring_control()->Changed.connect (strip_connections, MISSING_INVALIDATOR, bind (&OSCRouteObserver::send_monitor_status, this, track->monitoring_control()), OSC::instance());
+			send_monitor_status (track->monitoring_control());
+		}
+
+		boost::shared_ptr<AutomationControl> rec_controllable = _strip->rec_enable_control ();
+		if (rec_controllable) {
+			rec_controllable->Changed.connect (strip_connections, MISSING_INVALIDATOR, bind (&OSCRouteObserver::send_change_message, this, X_("/strip/recenable"), _strip->rec_enable_control()), OSC::instance());
+			send_change_message ("/strip/recenable", _strip->rec_enable_control());
+		}
+		boost::shared_ptr<AutomationControl> recsafe_controllable = _strip->rec_safe_control ();
+		if (rec_controllable) {
+			recsafe_controllable->Changed.connect (strip_connections, MISSING_INVALIDATOR, bind (&OSCRouteObserver::send_change_message, this, X_("/strip/record_safe"), _strip->rec_safe_control()), OSC::instance());
+			send_change_message ("/strip/record_safe", _strip->rec_safe_control());
+		}
+		_strip->presentation_info().PropertyChanged.connect (strip_connections, MISSING_INVALIDATOR, bind (&OSCRouteObserver::send_select_status, this, _1), OSC::instance());
+		send_select_status (ARDOUR::Properties::selected);
 	}
 
-	boost::shared_ptr<Controllable> mute_controllable = boost::dynamic_pointer_cast<Controllable>(_route->mute_control());
-	mute_controllable->Changed.connect (mute_changed_connection, MISSING_INVALIDATOR, bind (&OSCRouteObserver::send_change_message, this, X_("/route/mute"), _route->mute_control()), OSC::instance());
+	if (feedback[1]) { // level controls
+		if (gainmode) {
+			_strip->gain_control()->Changed.connect (strip_connections, MISSING_INVALIDATOR, bind (&OSCRouteObserver::send_gain_message, this, X_("/strip/fader"), _strip->gain_control()), OSC::instance());
+			send_gain_message ("/strip/fader", _strip->gain_control());
+		} else {
+			_strip->gain_control()->Changed.connect (strip_connections, MISSING_INVALIDATOR, bind (&OSCRouteObserver::send_gain_message, this, X_("/strip/gain"), _strip->gain_control()), OSC::instance());
+			send_gain_message ("/strip/gain", _strip->gain_control());
+		}
 
-	boost::shared_ptr<Controllable> solo_controllable = boost::dynamic_pointer_cast<Controllable>(_route->solo_control());
-	solo_controllable->Changed.connect (solo_changed_connection, MISSING_INVALIDATOR, bind (&OSCRouteObserver::send_change_message, this, X_("/route/solo"), _route->solo_control()), OSC::instance());
+		boost::shared_ptr<Controllable> trim_controllable = boost::dynamic_pointer_cast<Controllable>(_strip->trim_control());
+		if (trim_controllable) {
+			trim_controllable->Changed.connect (strip_connections, MISSING_INVALIDATOR, bind (&OSCRouteObserver::send_trim_message, this, X_("/strip/trimdB"), _strip->trim_control()), OSC::instance());
+			send_trim_message ("/strip/trimdB", _strip->trim_control());
+		}
 
-	boost::shared_ptr<Controllable> gain_controllable = boost::dynamic_pointer_cast<Controllable>(_route->gain_control());
-	gain_controllable->Changed.connect (gain_changed_connection, MISSING_INVALIDATOR, bind (&OSCRouteObserver::send_change_message, this, X_("/route/gain"), _route->gain_control()), OSC::instance());
+		boost::shared_ptr<Controllable> pan_controllable = boost::dynamic_pointer_cast<Controllable>(_strip->pan_azimuth_control());
+		if (pan_controllable) {
+			pan_controllable->Changed.connect (strip_connections, MISSING_INVALIDATOR, bind (&OSCRouteObserver::send_change_message, this, X_("/strip/pan_stereo_position"), _strip->pan_azimuth_control()), OSC::instance());
+			send_change_message ("/strip/pan_stereo_position", _strip->pan_azimuth_control());
+		}
+	}
+	tick();
 }
 
 OSCRouteObserver::~OSCRouteObserver ()
 {
-	name_changed_connection.disconnect();
-	rec_changed_connection.disconnect();
-	mute_changed_connection.disconnect();
-	solo_changed_connection.disconnect();
-	gain_changed_connection.disconnect();
+
+	strip_connections.drop_connections ();
+	// all strip buttons should be off and faders 0 and etc.
+	clear_strip ("/strip/expand", 0);
+	if (feedback[0]) { // buttons are separate feedback
+		lo_message msg = lo_message_new ();
+		// name is a string do it first
+		string path = "/strip/name";
+		if (feedback[2]) {
+			path = set_path (path);
+		} else {
+			lo_message_add_int32 (msg, ssid);
+		}
+		lo_message_add_string (msg, " ");
+
+		lo_send_message (addr, path.c_str(), msg);
+		lo_message_free (msg);
+		clear_strip ("/strip/mute", 0);
+		clear_strip ("/strip/solo", 0);
+		clear_strip ("/strip/recenable", 0);
+		clear_strip ("/strip/record_safe", 0);
+		clear_strip ("/strip/monitor_input", 0);
+		clear_strip ("/strip/monitor_disk", 0);
+		clear_strip ("/strip/gui_select", 0);
+		clear_strip ("/strip/select", 0);
+	}
+	if (feedback[1]) { // level controls
+		if (gainmode) {
+			clear_strip ("/strip/fader", 0);
+		} else {
+			clear_strip ("/strip/gain", -193);
+		}
+		clear_strip ("/strip/trimdB", 0);
+		clear_strip ("/strip/pan_stereo_position", 0.5);
+	}
+	if (feedback[9]) {
+		clear_strip ("/strip/signal", 0);
+	}
+	if (feedback[7]) {
+		if (gainmode) {
+			clear_strip ("/strip/meter", 0);
+		} else {
+			clear_strip ("/strip/meter", -193);
+		}
+	}else if (feedback[8]) {
+		clear_strip ("/strip/meter", 0);
+	}
 
 	lo_address_free (addr);
 }
 
 void
+OSCRouteObserver::tick ()
+{
+	if (feedback[7] || feedback[8] || feedback[9]) { // meters enabled
+		// the only meter here is master
+		float now_meter;
+		if (_strip->peak_meter()) {
+			now_meter = _strip->peak_meter()->meter_level(0, MeterMCP);
+		} else {
+			now_meter = -193;
+		}
+		if (now_meter < -120) now_meter = -193;
+		if (_last_meter != now_meter) {
+			if (feedback[7] || feedback[8]) {
+				string path = "/strip/meter";
+				lo_message msg = lo_message_new ();
+				if (feedback[2]) {
+					path = set_path (path);
+				} else {
+					lo_message_add_int32 (msg, ssid);
+				}
+				if (gainmode && feedback[7]) {
+					lo_message_add_float (msg, ((now_meter + 94) / 100));
+					lo_send_message (addr, path.c_str(), msg);
+				} else if ((!gainmode) && feedback[7]) {
+					lo_message_add_float (msg, now_meter);
+					lo_send_message (addr, path.c_str(), msg);
+				} else if (feedback[8]) {
+					uint32_t ledlvl = (uint32_t)(((now_meter + 54) / 3.75)-1);
+					uint16_t ledbits = ~(0xfff<<ledlvl);
+					lo_message_add_int32 (msg, ledbits);
+					lo_send_message (addr, path.c_str(), msg);
+				}
+				lo_message_free (msg);
+			}
+			if (feedback[9]) {
+				string path = "/strip/signal";
+				lo_message msg = lo_message_new ();
+				if (feedback[2]) {
+					path = set_path (path);
+				} else {
+					lo_message_add_int32 (msg, ssid);
+				}
+				float signal;
+				if (now_meter < -40) {
+					signal = 0;
+				} else {
+					signal = 1;
+				}
+				lo_message_add_float (msg, signal);
+				lo_send_message (addr, path.c_str(), msg);
+				lo_message_free (msg);
+			}
+		}
+		_last_meter = now_meter;
+
+	}
+
+}
+
+void
 OSCRouteObserver::name_changed (const PBD::PropertyChange& what_changed)
 {
 	if (!what_changed.contains (ARDOUR::Properties::name)) {
 	    return;
 	}
 
-	if (!_route) {
+	if (!_strip) {
 		return;
 	}
 
 	lo_message msg = lo_message_new ();
 
-	lo_message_add_int32 (msg, _route->remote_control_id());
-	lo_message_add_string (msg, _route->name().c_str());
+	// ssid is the strip on the surface this observer refers to
+	// not part of the internal ordering.
+	string path = "/strip/name";
+	if (feedback[2]) {
+		path = set_path (path);
+	} else {
+		lo_message_add_int32 (msg, ssid);
+	}
+	lo_message_add_string (msg, _strip->name().c_str());
 
-	lo_send_message (addr, "/route/name", msg);
+	lo_send_message (addr, path.c_str(), msg);
 	lo_message_free (msg);
 }
 
@@ -94,13 +242,146 @@ OSCRouteObserver::send_change_message (string path, boost::shared_ptr<Controllab
 {
 	lo_message msg = lo_message_new ();
 
-	lo_message_add_int32 (msg, _route->remote_control_id());
-	lo_message_add_float (msg, (float) controllable->get_value());
+	if (feedback[2]) {
+		path = set_path (path);
+	} else {
+		lo_message_add_int32 (msg, ssid);
+	}
+	float val = controllable->get_value();
+	lo_message_add_float (msg, (float) controllable->internal_to_interface (val));
+
+	lo_send_message (addr, path.c_str(), msg);
+	lo_message_free (msg);
+}
+
+void
+OSCRouteObserver::send_monitor_status (boost::shared_ptr<Controllable> controllable)
+{
+	int disk, input;
+	float val = controllable->get_value();
+	switch ((int) val) {
+		case 1:
+			disk = 0;
+			input = 1;
+			break;
+		case 2:
+			disk = 1;
+			input = 0;
+			break;
+		default:
+			disk = 0;
+			input = 0;
+	}
+
+	lo_message msg = lo_message_new ();
+	string path = "/strip/monitor_input";
+	if (feedback[2]) {
+		path = set_path (path);
+	} else {
+		lo_message_add_int32 (msg, ssid);
+	}
+	lo_message_add_int32 (msg, (float) input);
+	lo_send_message (addr, path.c_str(), msg);
+	lo_message_free (msg);
+
+	msg = lo_message_new ();
+	path = "/strip/monitor_disk";
+	if (feedback[2]) {
+		path = set_path (path);
+	} else {
+		lo_message_add_int32 (msg, ssid);
+	}
+	lo_message_add_int32 (msg, (float) disk);
+	lo_send_message (addr, path.c_str(), msg);
+	lo_message_free (msg);
+
+}
+
+void
+OSCRouteObserver::send_trim_message (string path, boost::shared_ptr<Controllable> controllable)
+{
+	lo_message msg = lo_message_new ();
+
+	if (feedback[2]) {
+		path = set_path (path);
+	} else {
+		lo_message_add_int32 (msg, ssid);
+	}
 
-	/* XXX thread issues */
+	lo_message_add_float (msg, (float) accurate_coefficient_to_dB (controllable->get_value()));
 
-	//std::cerr << "ORC: send " << path << " = " << controllable->get_value() << std::endl;
+	lo_send_message (addr, path.c_str(), msg);
+	lo_message_free (msg);
+}
+
+void
+OSCRouteObserver::send_gain_message (string path, boost::shared_ptr<Controllable> controllable)
+{
+	lo_message msg = lo_message_new ();
+
+	if (feedback[2]) {
+		path = set_path (path);
+	} else {
+		lo_message_add_int32 (msg, ssid);
+	}
+
+	if (gainmode) {
+		lo_message_add_float (msg, gain_to_slider_position (controllable->get_value()));
+	} else {
+		if (controllable->get_value() < 1e-15) {
+			lo_message_add_float (msg, -200);
+		} else {
+			lo_message_add_float (msg, accurate_coefficient_to_dB (controllable->get_value()));
+		}
+	}
 
 	lo_send_message (addr, path.c_str(), msg);
 	lo_message_free (msg);
 }
+
+string
+OSCRouteObserver::set_path (string path)
+{
+	if (feedback[2]) {
+  ostringstream os;
+  os << path << "/" << ssid;
+  path = os.str();
+	}
+	return path;
+}
+
+void
+OSCRouteObserver::clear_strip (string path, float val)
+{
+	lo_message msg = lo_message_new ();
+	if (feedback[2]) {
+		path = set_path (path);
+	} else {
+		lo_message_add_int32 (msg, ssid);
+	}
+	lo_message_add_float (msg, val);
+
+	lo_send_message (addr, path.c_str(), msg);
+	lo_message_free (msg);
+
+}
+
+void
+OSCRouteObserver::send_select_status (const PropertyChange& what)
+{
+	if (what == PropertyChange(ARDOUR::Properties::selected)) {
+		if (_strip) {
+			string path = "/strip/select";
+
+			lo_message msg = lo_message_new ();
+			if (feedback[2]) {
+				path = set_path (path);
+			} else {
+				lo_message_add_int32 (msg, ssid);
+			}
+			lo_message_add_float (msg, _strip->is_selected());
+			lo_send_message (addr, path.c_str(), msg);
+			lo_message_free (msg);
+		}
+	}
+}
diff --git a/libs/surfaces/osc/osc_route_observer.h b/libs/surfaces/osc/osc_route_observer.h
index 7153da7..7a0213d 100644
--- a/libs/surfaces/osc/osc_route_observer.h
+++ b/libs/surfaces/osc/osc_route_observer.h
@@ -21,6 +21,7 @@
 #define __osc_oscrouteobserver_h__
 
 #include <string>
+#include <bitset>
 #include <boost/shared_ptr.hpp>
 #include <sigc++/sigc++.h>
 #include <lo/lo.h>
@@ -33,27 +34,34 @@ class OSCRouteObserver
 {
 
   public:
-	OSCRouteObserver (boost::shared_ptr<ARDOUR::Route>, lo_address addr);
+	OSCRouteObserver (boost::shared_ptr<ARDOUR::Stripable>, lo_address addr, uint32_t sid, uint32_t gainmode, std::bitset<32> feedback);
 	~OSCRouteObserver ();
 
-	boost::shared_ptr<ARDOUR::Route> route () const { return _route; }
+	boost::shared_ptr<ARDOUR::Stripable> strip () const { return _strip; }
 	lo_address address() const { return addr; };
+	void tick (void);
+	void send_select_status (const PBD::PropertyChange&);
 
   private:
-	boost::shared_ptr<ARDOUR::Route> _route;
-	//boost::shared_ptr<Controllable> _controllable;
+	boost::shared_ptr<ARDOUR::Stripable> _strip;
 
-	PBD::ScopedConnection name_changed_connection;
-	PBD::ScopedConnection rec_changed_connection;
-	PBD::ScopedConnection mute_changed_connection;
-	PBD::ScopedConnection solo_changed_connection;
-	PBD::ScopedConnection gain_changed_connection;
+	PBD::ScopedConnectionList strip_connections;
 
 	lo_address addr;
 	std::string path;
+	uint32_t ssid;
+	uint32_t gainmode;
+	std::bitset<32> feedback;
+	float _last_meter;
+
 
 	void name_changed (const PBD::PropertyChange& what_changed);
 	void send_change_message (std::string path, boost::shared_ptr<PBD::Controllable> controllable);
+	void send_monitor_status (boost::shared_ptr<PBD::Controllable> controllable);
+	void send_gain_message (std::string path, boost::shared_ptr<PBD::Controllable> controllable);
+	void send_trim_message (std::string path, boost::shared_ptr<PBD::Controllable> controllable);
+	std::string set_path (std::string path);
+	void clear_strip (std::string path, float val);
 };
 
 #endif /* __osc_oscrouteobserver_h__ */
diff --git a/libs/surfaces/osc/osc_select_observer.cc b/libs/surfaces/osc/osc_select_observer.cc
new file mode 100644
index 0000000..657b46f
--- /dev/null
+++ b/libs/surfaces/osc/osc_select_observer.cc
@@ -0,0 +1,672 @@
+/*
+    Copyright (C) 2009 Paul Davis
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#include <vector>
+#include "boost/lambda/lambda.hpp"
+
+#include "ardour/session.h"
+#include "ardour/track.h"
+#include "ardour/monitor_control.h"
+#include "ardour/dB.h"
+#include "ardour/meter.h"
+#include "ardour/phase_control.h"
+#include "ardour/solo_isolate_control.h"
+#include "ardour/solo_safe_control.h"
+#include "ardour/route.h"
+
+#include "osc.h"
+#include "osc_select_observer.h"
+
+#include "pbd/i18n.h"
+
+using namespace std;
+using namespace PBD;
+using namespace ARDOUR;
+using namespace ArdourSurface;
+
+OSCSelectObserver::OSCSelectObserver (boost::shared_ptr<Stripable> s, lo_address a, uint32_t gm, std::bitset<32> fb)
+	: _strip (s)
+	,gainmode (gm)
+	,feedback (fb)
+	,nsends (0)
+{
+	addr = lo_address_new (lo_address_get_hostname(a) , lo_address_get_port(a));
+
+	if (feedback[0]) { // buttons are separate feedback
+		_strip->PropertyChanged.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::name_changed, this, boost::lambda::_1), OSC::instance());
+		name_changed (ARDOUR::Properties::name);
+
+		_strip->mute_control()->Changed.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::change_message, this, X_("/select/mute"), _strip->mute_control()), OSC::instance());
+		change_message ("/select/mute", _strip->mute_control());
+
+		_strip->solo_control()->Changed.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::change_message, this, X_("/select/solo"), _strip->solo_control()), OSC::instance());
+		change_message ("/select/solo", _strip->solo_control());
+
+		if (_strip->solo_isolate_control()) {
+			_strip->solo_isolate_control()->Changed.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::change_message, this, X_("/select/solo_iso"), _strip->solo_isolate_control()), OSC::instance());
+			change_message ("/select/solo_iso", _strip->solo_isolate_control());
+		}
+
+		if (_strip->solo_safe_control()) {
+			_strip->solo_safe_control()->Changed.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::change_message, this, X_("/select/solo_safe"), _strip->solo_safe_control()), OSC::instance());
+			change_message ("/select/solo_safe", _strip->solo_safe_control());
+		}
+
+		boost::shared_ptr<Track> track = boost::dynamic_pointer_cast<Track> (_strip);
+		if (track) {
+			track->monitoring_control()->Changed.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::monitor_status, this, track->monitoring_control()), OSC::instance());
+			monitor_status (track->monitoring_control());
+		}
+
+		boost::shared_ptr<AutomationControl> rec_controllable = _strip->rec_enable_control ();
+		if (rec_controllable) {
+			rec_controllable->Changed.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::change_message, this, X_("/select/recenable"), _strip->rec_enable_control()), OSC::instance());
+			change_message ("/select/recenable", _strip->rec_enable_control());
+		}
+
+		boost::shared_ptr<AutomationControl> recsafe_controllable = _strip->rec_safe_control ();
+		if (recsafe_controllable) {
+			recsafe_controllable->Changed.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::change_message, this, X_("/select/record_safe"), _strip->rec_safe_control()), OSC::instance());
+			change_message ("/select/record_safe", _strip->rec_safe_control());
+		}
+
+		boost::shared_ptr<AutomationControl> phase_controllable = _strip->phase_control ();
+		if (phase_controllable) {
+			phase_controllable->Changed.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::change_message, this, X_("/select/polarity"), _strip->phase_control()), OSC::instance());
+			change_message ("/select/polarity", _strip->phase_control());
+		}
+
+	}
+
+	if (feedback[1]) { // level controls
+		if (gainmode) {
+			_strip->gain_control()->Changed.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::gain_message, this, X_("/select/fader"), _strip->gain_control()), OSC::instance());
+			gain_message ("/select/fader", _strip->gain_control());
+		} else {
+			_strip->gain_control()->Changed.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::gain_message, this, X_("/select/gain"), _strip->gain_control()), OSC::instance());
+			gain_message ("/select/gain", _strip->gain_control());
+		}
+
+		boost::shared_ptr<Controllable> trim_controllable = boost::dynamic_pointer_cast<Controllable>(_strip->trim_control());
+		if (trim_controllable) {
+			trim_controllable->Changed.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::trim_message, this, X_("/select/trimdB"), _strip->trim_control()), OSC::instance());
+			trim_message ("/select/trimdB", _strip->trim_control());
+		}
+
+		boost::shared_ptr<Controllable> pan_controllable = boost::dynamic_pointer_cast<Controllable>(_strip->pan_azimuth_control());
+		if (pan_controllable) {
+			pan_controllable->Changed.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::change_message, this, X_("/select/pan_stereo_position"), _strip->pan_azimuth_control()), OSC::instance());
+			change_message ("/select/pan_stereo_position", _strip->pan_azimuth_control());
+		}
+
+		boost::shared_ptr<Controllable> width_controllable = boost::dynamic_pointer_cast<Controllable>(_strip->pan_width_control());
+		if (width_controllable) {
+			width_controllable->Changed.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::change_message, this, X_("/select/pan_stereo_width"), _strip->pan_width_control()), OSC::instance());
+			change_message ("/select/pan_stereo_width", _strip->pan_width_control());
+		}
+
+	}
+	if (feedback[13]) { // Well known controls
+		// Rest of possible pan controls... Untested because I can't find a way to get them in the GUI :)
+		if (_strip->pan_elevation_control ()) {
+			_strip->pan_elevation_control()->Changed.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::change_message, this, X_("/select/pan_elevation_position"), _strip->pan_elevation_control()), OSC::instance());
+			change_message ("/select/pan_elevation_position", _strip->pan_elevation_control());
+		}
+		if (_strip->pan_frontback_control ()) {
+			_strip->pan_frontback_control()->Changed.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::change_message, this, X_("/select/pan_frontback_position"), _strip->pan_frontback_control()), OSC::instance());
+			change_message ("/select/pan_frontback_position", _strip->pan_frontback_control());
+		}
+		if (_strip->pan_lfe_control ()) {
+			_strip->pan_lfe_control()->Changed.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::change_message, this, X_("/select/pan_lfe_control"), _strip->pan_lfe_control()), OSC::instance());
+			change_message ("/select/pan_lfe_control", _strip->pan_lfe_control());
+		}
+
+		// sends and eq
+		// detecting processor changes requires cast to route
+		boost::shared_ptr<Route> r = boost::dynamic_pointer_cast<Route>(_strip);
+		if (r) {
+			r->processors_changed.connect  (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::send_restart, this, -1), OSC::instance());
+			send_init();
+			eq_init();
+		}
+
+		// Compressor
+		if (_strip->comp_enable_controllable ()) {
+			_strip->comp_enable_controllable ()->Changed.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::enable_message, this, X_("/select/comp_enable"), _strip->comp_enable_controllable()), OSC::instance());
+			enable_message ("/select/comp_enable", _strip->comp_enable_controllable());
+		}
+		if (_strip->comp_threshold_controllable ()) {
+			_strip->comp_threshold_controllable ()->Changed.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::change_message, this, X_("/select/comp_threshold"), _strip->comp_threshold_controllable()), OSC::instance());
+			change_message ("/select/comp_threshold", _strip->comp_threshold_controllable());
+		}
+		if (_strip->comp_speed_controllable ()) {
+			_strip->comp_speed_controllable ()->Changed.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::change_message, this, X_("/select/comp_speed"), _strip->comp_speed_controllable()), OSC::instance());
+			change_message ("/select/comp_speed", _strip->comp_speed_controllable());
+		}
+		if (_strip->comp_mode_controllable ()) {
+			_strip->comp_mode_controllable ()->Changed.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::comp_mode, this), OSC::instance());
+			comp_mode ();
+		}
+		if (_strip->comp_makeup_controllable ()) {
+			_strip->comp_makeup_controllable ()->Changed.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::change_message, this, X_("/select/comp_makeup"), _strip->comp_makeup_controllable()), OSC::instance());
+			change_message ("/select/comp_makeup", _strip->comp_makeup_controllable());
+		}
+
+	}
+
+	tick();
+}
+
+OSCSelectObserver::~OSCSelectObserver ()
+{
+
+	strip_connections.drop_connections ();
+	// all strip buttons should be off and faders 0 and etc.
+	clear_strip ("/select/expand", 0);
+	if (feedback[0]) { // buttons are separate feedback
+		text_message ("/select/name", " ");
+		text_message ("/select/comment", " ");
+		clear_strip ("/select/mute", 0);
+		clear_strip ("/select/solo", 0);
+		clear_strip ("/select/recenable", 0);
+		clear_strip ("/select/record_safe", 0);
+		clear_strip ("/select/monitor_input", 0);
+		clear_strip ("/select/monitor_disk", 0);
+		clear_strip ("/select/polarity", 0);
+		clear_strip ("/select/n_inputs", 0);
+		clear_strip ("/select/n_outputs", 0);
+	}
+	if (feedback[1]) { // level controls
+		if (gainmode) {
+			clear_strip ("/select/fader", 0);
+		} else {
+			clear_strip ("/select/gain", -193);
+		}
+		clear_strip ("/select/trimdB", 0);
+		clear_strip ("/select/pan_stereo_position", 0.5);
+		clear_strip ("/select/pan_stereo_width", 1);
+	}
+	if (feedback[9]) {
+		clear_strip ("/select/signal", 0);
+	}
+	if (feedback[7]) {
+		if (gainmode) {
+			clear_strip ("/select/meter", 0);
+		} else {
+			clear_strip ("/select/meter", -193);
+		}
+	}else if (feedback[8]) {
+		clear_strip ("/select/meter", 0);
+	}
+	if (feedback[13]) { // Well known controls
+		clear_strip ("/select/pan_elevation_position", 0);
+		clear_strip ("/select/pan_frontback_position", .5);
+		clear_strip ("/select/pan_lfe_control", 0);
+		clear_strip ("/select/comp_enable", 0);
+		clear_strip ("/select/comp_threshold", 0);
+		clear_strip ("/select/comp_speed", 0);
+		clear_strip ("/select/comp_mode", 0);
+		text_message ("/select/comp_mode_name", " ");
+		text_message ("/select/comp_speed_name", " ");
+		clear_strip ("/select/comp_makeup", 0);
+	}
+	send_end();
+	eq_end();
+
+	lo_address_free (addr);
+}
+
+void
+OSCSelectObserver::send_init()
+{
+	// we don't know how many there are, so find out.
+	bool sends;
+	do {
+		sends = false;
+		if (_strip->send_level_controllable (nsends)) {
+			_strip->send_level_controllable(nsends)->Changed.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::send_gain, this, nsends, _strip->send_level_controllable(nsends)), OSC::instance());
+			send_timeout.push_back (0);
+			send_gain (nsends, _strip->send_level_controllable(nsends));
+			sends = true;
+		}
+
+		if (_strip->send_enable_controllable (nsends)) {
+			_strip->send_enable_controllable(nsends)->Changed.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::enable_message_with_id, this, X_("/select/send_enable"), nsends + 1, _strip->send_enable_controllable(nsends)), OSC::instance());
+			enable_message_with_id ("/select/send_enable", nsends + 1, _strip->send_enable_controllable(nsends));
+			sends = true;
+		} else if (sends) {
+			// not used by Ardour, just mixbus so in Ardour always true
+			clear_strip_with_id ("/select/send_enable", nsends + 1, 1);
+		}
+		// this should get signalled by the route the send goes to, (TODO)
+		if (!gainmode && sends) { // if the gain control is there, this is too
+			text_with_id ("/select/send_name", nsends + 1, _strip->send_name(nsends));
+		}
+		// Send numbers are 0 based, OSC is 1 based so this gets incremented at the end
+		if (sends) {
+			nsends++;
+		}
+	} while (sends);
+}
+
+void
+OSCSelectObserver::send_end ()
+{
+	send_connections.drop_connections ();
+	for (uint32_t i = 1; i <= nsends; i++) {
+		if (gainmode) {
+			clear_strip_with_id ("/select/send_fader", i, 0);
+		} else {
+			clear_strip_with_id ("/select/send_gain", i, -193);
+		}
+		// next enable
+		clear_strip_with_id ("/select/send_enable", i, 0);
+		// next name
+		text_with_id ("/select/send_name", i, " ");
+	}
+	nsends = 0;
+}
+
+void
+OSCSelectObserver::send_restart(int x)
+{
+	send_end();
+	send_init();
+}
+
+void
+OSCSelectObserver::tick ()
+{
+	if (feedback[7] || feedback[8] || feedback[9]) { // meters enabled
+		float now_meter;
+		if (_strip->peak_meter()) {
+			now_meter = _strip->peak_meter()->meter_level(0, MeterMCP);
+		} else {
+			now_meter = -193;
+		}
+		if (now_meter < -144) now_meter = -193;
+		if (_last_meter != now_meter) {
+			if (feedback[7] || feedback[8]) {
+				string path = "/select/meter";
+				lo_message msg = lo_message_new ();
+				if (gainmode && feedback[7]) {
+					lo_message_add_float (msg, ((now_meter + 94) / 100));
+					lo_send_message (addr, path.c_str(), msg);
+				} else if ((!gainmode) && feedback[7]) {
+					lo_message_add_float (msg, now_meter);
+					lo_send_message (addr, path.c_str(), msg);
+				} else if (feedback[8]) {
+					uint32_t ledlvl = (uint32_t)(((now_meter + 54) / 3.75)-1);
+					uint16_t ledbits = ~(0xfff<<ledlvl);
+					lo_message_add_int32 (msg, ledbits);
+					lo_send_message (addr, path.c_str(), msg);
+				}
+				lo_message_free (msg);
+			}
+			if (feedback[9]) {
+				string path = "/select/signal";
+				lo_message msg = lo_message_new ();
+				float signal;
+				if (now_meter < -40) {
+					signal = 0;
+				} else {
+					signal = 1;
+				}
+				lo_message_add_float (msg, signal);
+				lo_send_message (addr, path.c_str(), msg);
+				lo_message_free (msg);
+			}
+		}
+		_last_meter = now_meter;
+
+	}
+	if (feedback[1]) {
+		if (gain_timeout) {
+			if (gain_timeout == 1) {
+				text_message ("/select/name", _strip->name());
+			}
+			gain_timeout--;
+		}
+	}
+	if (feedback[13]) {
+		for (uint32_t i = 0; i < send_timeout.size(); i++) {
+			if (send_timeout[i]) {
+				if (send_timeout[i] == 1) {
+					text_with_id ("/select/send_name", i + 1, _strip->send_name(i));
+				}
+				send_timeout[i]--;
+			}
+		}
+	}
+
+}
+
+void
+OSCSelectObserver::name_changed (const PBD::PropertyChange& what_changed)
+{
+	if (!what_changed.contains (ARDOUR::Properties::name)) {
+		return;
+	}
+
+	if (!_strip) {
+		return;
+	}
+
+	text_message ("/select/name", _strip->name());
+	boost::shared_ptr<Route> route = boost::dynamic_pointer_cast<Route> (_strip);
+	if (route) {
+		//spit out the comment at the same time
+		text_message ("/select/comment", route->comment());
+		// lets tell the surface how many inputs this strip has
+		clear_strip ("/select/n_inputs", (float) route->n_inputs().n_total());
+		// lets tell the surface how many outputs this strip has
+		clear_strip ("/select/n_outputs", (float) route->n_outputs().n_total());
+	}
+}
+
+void
+OSCSelectObserver::change_message (string path, boost::shared_ptr<Controllable> controllable)
+{
+	lo_message msg = lo_message_new ();
+	float val = controllable->get_value();
+
+	lo_message_add_float (msg, (float) controllable->internal_to_interface (val));
+
+	lo_send_message (addr, path.c_str(), msg);
+	lo_message_free (msg);
+}
+
+void
+OSCSelectObserver::enable_message (string path, boost::shared_ptr<Controllable> controllable)
+{
+	float val = controllable->get_value();
+	if (val) {
+		clear_strip (path, 1);
+	} else {
+		clear_strip (path, 0);
+	}
+
+}
+
+void
+OSCSelectObserver::change_message_with_id (string path, uint32_t id, boost::shared_ptr<Controllable> controllable)
+{
+	lo_message msg = lo_message_new ();
+	float val = controllable->get_value();
+	if (feedback[2]) {
+		path = set_path (path, id);
+	} else {
+		lo_message_add_int32 (msg, id);
+	}
+
+	lo_message_add_float (msg, (float) controllable->internal_to_interface (val));
+
+	lo_send_message (addr, path.c_str(), msg);
+	lo_message_free (msg);
+}
+
+void
+OSCSelectObserver::enable_message_with_id (string path, uint32_t id, boost::shared_ptr<Controllable> controllable)
+{
+	float val = controllable->get_value();
+	if (val) {
+		clear_strip_with_id (path, id, 1);
+	} else {
+		clear_strip_with_id (path, id, 0);
+	}
+}
+
+void
+OSCSelectObserver::text_message (string path, std::string text)
+{
+	lo_message msg = lo_message_new ();
+
+	lo_message_add_string (msg, text.c_str());
+
+	lo_send_message (addr, path.c_str(), msg);
+	lo_message_free (msg);
+}
+
+void
+OSCSelectObserver::monitor_status (boost::shared_ptr<Controllable> controllable)
+{
+	int disk, input;
+	float val = controllable->get_value();
+	switch ((int) val) {
+		case 1:
+			disk = 0;
+			input = 1;
+			break;
+		case 2:
+			disk = 1;
+			input = 0;
+			break;
+		default:
+			disk = 0;
+			input = 0;
+	}
+
+	clear_strip ("/select/monitor_input", (float) input);
+	clear_strip ("/select/monitor_disk", (float) disk);
+}
+
+void
+OSCSelectObserver::trim_message (string path, boost::shared_ptr<Controllable> controllable)
+{
+	lo_message msg = lo_message_new ();
+
+	lo_message_add_float (msg, (float) accurate_coefficient_to_dB (controllable->get_value()));
+
+	lo_send_message (addr, path.c_str(), msg);
+	lo_message_free (msg);
+}
+
+void
+OSCSelectObserver::gain_message (string path, boost::shared_ptr<Controllable> controllable)
+{
+	lo_message msg = lo_message_new ();
+
+	if (gainmode) {
+		lo_message_add_float (msg, gain_to_slider_position (controllable->get_value()));
+		text_message ("/select/name", string_compose ("%1%2%3", std::fixed, std::setprecision(2), accurate_coefficient_to_dB (controllable->get_value())));
+		gain_timeout = 8;
+	} else {
+		if (controllable->get_value() < 1e-15) {
+			lo_message_add_float (msg, -200);
+		} else {
+			lo_message_add_float (msg, accurate_coefficient_to_dB (controllable->get_value()));
+		}
+	}
+
+	lo_send_message (addr, path.c_str(), msg);
+	lo_message_free (msg);
+}
+
+void
+OSCSelectObserver::send_gain (uint32_t id, boost::shared_ptr<PBD::Controllable> controllable)
+{
+	lo_message msg = lo_message_new ();
+	string path;
+	float value;
+	float db;
+#ifdef MIXBUS
+		db = controllable->get_value();
+#else
+		if (controllable->get_value() < 1e-15) {
+			db = -193;
+		} else {
+			db = accurate_coefficient_to_dB (controllable->get_value());
+		}
+#endif
+
+	if (gainmode) {
+		path = "/select/send_fader";
+#ifdef MIXBUS
+		value = controllable->internal_to_interface (controllable->get_value());
+#else
+		value = gain_to_slider_position (controllable->get_value());
+#endif
+	text_with_id ("/select/send_name" , id + 1, string_compose ("%1%2%3", std::fixed, std::setprecision(2), db));
+	if (send_timeout.size() > id) {
+		send_timeout[id] = 8;
+	}
+	} else {
+		path = "/select/send_gain";
+		value = db;
+	}
+
+	if (feedback[2]) {
+		path = set_path (path, id + 1);
+	} else {
+		lo_message_add_int32 (msg, id + 1);
+	}
+
+	lo_message_add_float (msg, value);
+	lo_send_message (addr, path.c_str(), msg);
+	lo_message_free (msg);
+}
+
+void
+OSCSelectObserver::text_with_id (string path, uint32_t id, string name)
+{
+	lo_message msg = lo_message_new ();
+	if (feedback[2]) {
+		path = set_path (path, id);
+	} else {
+		lo_message_add_int32 (msg, id);
+	}
+
+	lo_message_add_string (msg, name.c_str());
+
+	lo_send_message (addr, path.c_str(), msg);
+	lo_message_free (msg);
+}
+
+void
+OSCSelectObserver::comp_mode ()
+{
+	change_message ("/select/comp_mode", _strip->comp_mode_controllable());
+	text_message ("/select/comp_mode_name", _strip->comp_mode_name(_strip->comp_mode_controllable()->get_value()));
+	text_message ("/select/comp_speed_name", _strip->comp_speed_name(_strip->comp_mode_controllable()->get_value()));
+}
+
+void
+OSCSelectObserver::eq_init()
+{
+	// HPF and enable are special case, rest are in bands
+	if (_strip->eq_hpf_controllable ()) {
+		_strip->eq_hpf_controllable ()->Changed.connect (eq_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::change_message, this, X_("/select/eq_hpf"), _strip->eq_hpf_controllable()), OSC::instance());
+		change_message ("/select/eq_hpf", _strip->eq_hpf_controllable());
+	}
+	if (_strip->eq_enable_controllable ()) {
+		_strip->eq_enable_controllable ()->Changed.connect (eq_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::enable_message, this, X_("/select/eq_enable"), _strip->eq_enable_controllable()), OSC::instance());
+		enable_message ("/select/eq_enable", _strip->eq_enable_controllable());
+	}
+
+	uint32_t eq_bands = _strip->eq_band_cnt ();
+	if (!eq_bands) {
+		return;
+	}
+
+	for (uint32_t i = 0; i < eq_bands; i++) {
+		if (_strip->eq_band_name(i).size()) {
+			text_with_id ("/select/eq_band_name", i + 1, _strip->eq_band_name (i));
+		}
+		if (_strip->eq_gain_controllable (i)) {
+			_strip->eq_gain_controllable(i)->Changed.connect (eq_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::change_message_with_id, this, X_("/select/eq_gain"), i + 1, _strip->eq_gain_controllable(i)), OSC::instance());
+			change_message_with_id ("/select/eq_gain", i + 1, _strip->eq_gain_controllable(i));
+		}
+		if (_strip->eq_freq_controllable (i)) {
+			_strip->eq_freq_controllable(i)->Changed.connect (eq_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::change_message_with_id, this, X_("/select/eq_freq"), i + 1, _strip->eq_freq_controllable(i)), OSC::instance());
+			change_message_with_id ("/select/eq_freq", i + 1, _strip->eq_freq_controllable(i));
+		}
+		if (_strip->eq_q_controllable (i)) {
+			_strip->eq_q_controllable(i)->Changed.connect (eq_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::change_message_with_id, this, X_("/select/eq_q"), i + 1, _strip->eq_q_controllable(i)), OSC::instance());
+			change_message_with_id ("/select/eq_q", i + 1, _strip->eq_q_controllable(i));
+		}
+		if (_strip->eq_shape_controllable (i)) {
+			_strip->eq_shape_controllable(i)->Changed.connect (eq_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::change_message_with_id, this, X_("/select/eq_shape"), i + 1, _strip->eq_shape_controllable(i)), OSC::instance());
+			change_message_with_id ("/select/eq_shape", i + 1, _strip->eq_shape_controllable(i));
+		}
+	}
+}
+
+void
+OSCSelectObserver::eq_end ()
+{
+	//need to check feedback for [13]
+	eq_connections.drop_connections ();
+	clear_strip ("/select/eq_hpf", 0);
+	clear_strip ("/select/eq_enable", 0);
+
+	for (uint32_t i = 1; i <= _strip->eq_band_cnt (); i++) {
+		text_with_id ("/select/eq_band_name", i, " ");
+		clear_strip_with_id ("/select/eq_gain", i, 0);
+		clear_strip_with_id ("/select/eq_freq", i, 0);
+		clear_strip_with_id ("/select/eq_q", i, 0);
+		clear_strip_with_id ("/select/eq_shape", i, 0);
+
+
+	}
+}
+
+void
+OSCSelectObserver::eq_restart(int x)
+{
+	eq_end();
+	eq_init();
+}
+
+string
+OSCSelectObserver::set_path (string path, uint32_t id)
+{
+	if (feedback[2]) {
+		path = string_compose ("%1/%2", path, id);
+	}
+	return path;
+}
+
+void
+OSCSelectObserver::clear_strip (string path, float val)
+{
+	lo_message msg = lo_message_new ();
+	lo_message_add_float (msg, val);
+
+	lo_send_message (addr, path.c_str(), msg);
+	lo_message_free (msg);
+
+}
+
+void
+OSCSelectObserver::clear_strip_with_id (string path, uint32_t id, float val)
+{
+	lo_message msg = lo_message_new ();
+	if (feedback[2]) {
+		path = set_path (path, id);
+	} else {
+		lo_message_add_int32 (msg, id);
+	}
+
+	lo_message_add_float (msg, val);
+
+	lo_send_message (addr, path.c_str(), msg);
+	lo_message_free (msg);
+
+}
+
diff --git a/libs/surfaces/osc/osc_select_observer.h b/libs/surfaces/osc/osc_select_observer.h
new file mode 100644
index 0000000..d3abc20
--- /dev/null
+++ b/libs/surfaces/osc/osc_select_observer.h
@@ -0,0 +1,86 @@
+/*
+    Copyright (C) 2009 Paul Davis
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#ifndef __osc_oscselectobserver_h__
+#define __osc_oscselectobserver_h__
+
+#include <string>
+#include <bitset>
+#include <boost/shared_ptr.hpp>
+#include <sigc++/sigc++.h>
+#include <lo/lo.h>
+
+#include "pbd/controllable.h"
+#include "pbd/stateful.h"
+#include "ardour/types.h"
+
+class OSCSelectObserver
+{
+
+  public:
+	OSCSelectObserver (boost::shared_ptr<ARDOUR::Stripable>, lo_address addr, uint32_t gainmode, std::bitset<32> feedback);
+	~OSCSelectObserver ();
+
+	boost::shared_ptr<ARDOUR::Stripable> strip () const { return _strip; }
+	lo_address address() const { return addr; };
+	void tick (void);
+
+  private:
+	boost::shared_ptr<ARDOUR::Stripable> _strip;
+
+	PBD::ScopedConnectionList strip_connections;
+	// sends and eq need their own
+	PBD::ScopedConnectionList send_connections;
+	PBD::ScopedConnectionList eq_connections;
+
+	lo_address addr;
+	std::string path;
+	uint32_t gainmode;
+	std::bitset<32> feedback;
+	std::vector<int> send_timeout;
+	uint32_t gain_timeout;
+	float _last_meter;
+	uint32_t nsends;
+
+
+	void name_changed (const PBD::PropertyChange& what_changed);
+	void change_message (std::string path, boost::shared_ptr<PBD::Controllable> controllable);
+	void enable_message (std::string path, boost::shared_ptr<PBD::Controllable> controllable);
+	void comp_mode (void);
+	void change_message_with_id (std::string path, uint32_t id, boost::shared_ptr<PBD::Controllable> controllable);
+	void enable_message_with_id (std::string path, uint32_t id, boost::shared_ptr<PBD::Controllable> controllable);
+	void text_message (std::string path, std::string text);
+	void text_with_id (std::string path, uint32_t id, std::string name);
+	void monitor_status (boost::shared_ptr<PBD::Controllable> controllable);
+	void gain_message (std::string path, boost::shared_ptr<PBD::Controllable> controllable);
+	void trim_message (std::string path, boost::shared_ptr<PBD::Controllable> controllable);
+	// sends stuff
+	void send_init (void);
+	void send_end (void);
+	void send_restart (int);
+	void send_gain (uint32_t id, boost::shared_ptr<PBD::Controllable> controllable);
+	void eq_init (void);
+	void eq_end (void);
+	void eq_restart (int);
+	std::string set_path (std::string path, uint32_t id);
+	void clear_strip (std::string path, float val);
+	void clear_strip_with_id (std::string path, uint32_t id, float val);
+};
+
+#endif /* __osc_oscselectobserver_h__ */
diff --git a/libs/surfaces/osc/wscript b/libs/surfaces/osc/wscript
index 48f24f6..6f2bbfa 100644
--- a/libs/surfaces/osc/wscript
+++ b/libs/surfaces/osc/wscript
@@ -18,6 +18,8 @@ def build(bld):
             osc.cc
             osc_controllable.cc
             osc_route_observer.cc
+            osc_select_observer.cc
+            osc_global_observer.cc
             interface.cc
             osc_gui.cc
     '''
diff --git a/libs/surfaces/tranzport/button_events.cc b/libs/surfaces/tranzport/button_events.cc
index 1b070b3..ebc00f9 100644
--- a/libs/surfaces/tranzport/button_events.cc
+++ b/libs/surfaces/tranzport/button_events.cc
@@ -26,7 +26,7 @@ using namespace std;
 using namespace sigc;
 using namespace PBD;
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 #include <pbd/abstract_ui.cc>
 
diff --git a/libs/surfaces/tranzport/general.cc b/libs/surfaces/tranzport/general.cc
index 35d2f2b..2b39aaa 100644
--- a/libs/surfaces/tranzport/general.cc
+++ b/libs/surfaces/tranzport/general.cc
@@ -26,7 +26,7 @@ using namespace std;
 using namespace sigc;
 using namespace PBD;
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 #include <pbd/abstract_ui.cc>
 // HA, I don't need this anymore
diff --git a/libs/surfaces/tranzport/init.cc b/libs/surfaces/tranzport/init.cc
index 459da81..1e284b5 100644
--- a/libs/surfaces/tranzport/init.cc
+++ b/libs/surfaces/tranzport/init.cc
@@ -26,7 +26,7 @@ using namespace std;
 using namespace sigc;
 using namespace PBD;
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 #include <pbd/abstract_ui.cc>
 
diff --git a/libs/surfaces/tranzport/io_usb.cc b/libs/surfaces/tranzport/io_usb.cc
index 56d270b..c9c595e 100644
--- a/libs/surfaces/tranzport/io_usb.cc
+++ b/libs/surfaces/tranzport/io_usb.cc
@@ -36,7 +36,7 @@ using namespace std;
 using namespace sigc;
 using namespace PBD;
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 #include <pbd/abstract_ui.cc>
 
diff --git a/libs/surfaces/tranzport/show.cc b/libs/surfaces/tranzport/show.cc
index 544bb3d..027665e 100644
--- a/libs/surfaces/tranzport/show.cc
+++ b/libs/surfaces/tranzport/show.cc
@@ -44,7 +44,7 @@ using namespace std;
 using namespace sigc;
 using namespace PBD;
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 #include "pbd/abstract_ui.cc"
 
diff --git a/libs/surfaces/tranzport/state.cc b/libs/surfaces/tranzport/state.cc
index 59eaef0..f9988a1 100644
--- a/libs/surfaces/tranzport/state.cc
+++ b/libs/surfaces/tranzport/state.cc
@@ -38,7 +38,7 @@ using namespace std;
 using namespace sigc;
 using namespace PBD;
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 #include "pbd/abstract_ui.cc"
 
diff --git a/libs/surfaces/tranzport/wheel.cc b/libs/surfaces/tranzport/wheel.cc
index d90e0e2..00a66f9 100644
--- a/libs/surfaces/tranzport/wheel.cc
+++ b/libs/surfaces/tranzport/wheel.cc
@@ -38,7 +38,7 @@ using namespace std;
 using namespace sigc;
 using namespace PBD;
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 #include "pbd/abstract_ui.cc"
 
diff --git a/libs/surfaces/tranzport/wheel_modes.cc b/libs/surfaces/tranzport/wheel_modes.cc
index 6880218..1882ad5 100644
--- a/libs/surfaces/tranzport/wheel_modes.cc
+++ b/libs/surfaces/tranzport/wheel_modes.cc
@@ -48,7 +48,7 @@ using namespace std;
 using namespace sigc;
 using namespace PBD;
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 #include <pbd/abstract_ui.cc>
 
diff --git a/libs/surfaces/wiimote/wiimote.cc b/libs/surfaces/wiimote/wiimote.cc
index d86dbbc..df16bc0 100644
--- a/libs/surfaces/wiimote/wiimote.cc
+++ b/libs/surfaces/wiimote/wiimote.cc
@@ -24,7 +24,7 @@
 #include "pbd/error.h"
 #include "ardour/debug.h"
 #include "ardour/session.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 #include "wiimote.h"
 
diff --git a/libs/timecode/MSVCtimecode/timecode.vcproj b/libs/timecode/MSVCtimecode/timecode.vcproj
index c074235..0e9f13b 100644
--- a/libs/timecode/MSVCtimecode/timecode.vcproj
+++ b/libs/timecode/MSVCtimecode/timecode.vcproj
@@ -42,7 +42,7 @@
 				AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
 				Optimization="0"
 				AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\rubberband;"..\..\vamp-sdk";"..\..\midi++2";..\..\taglib;..\..\taglib\taglib;..\..\taglib\taglib\toolkit;..\..\audiographer;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\glibmm";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor";"$(GenericIncludeFolder)\lilv-0";"$(GenericIncludeFolder)\suil-0";"$(GenericIncludeFolder)\serd-0";"$(GenericIncludeFolder)\sord-0";"$(GenericIncludeFolder)\lv2";"$(GenericIncludeFolder)\sratom-0""
-				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;BUILDING_TIMECODE;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;LIBTIMECODE_DLL_EXPORTS;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_DEBUG;DEBUG="Debug";ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PACKAGE="\"ardour3_timecode\"";PROGRAM_NAME="\"Mixbus3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;BUILDING_TIMECODE;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;LIBTIMECODE_DLL_EXPORTS;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;_DEBUG;DEBUG="Debug";ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PACKAGE="\"ardour3_timecode\"";PROGRAM_NAME="\"Mixbus3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
 				MinimalRebuild="true"
 				RuntimeLibrary="3"
 				WarningLevel="3"
@@ -122,7 +122,7 @@
 				Optimization="2"
 				InlineFunctionExpansion="1"
 				AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\rubberband;"..\..\vamp-sdk";"..\..\midi++2";..\..\taglib;..\..\taglib\taglib;..\..\taglib\taglib\toolkit;..\..\audiographer;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\glibmm";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor";"$(GenericIncludeFolder)\lilv-0";"$(GenericIncludeFolder)\suil-0";"$(GenericIncludeFolder)\serd-0";"$(GenericIncludeFolder)\sord-0";"$(GenericIncludeFolder)\lv2";"$(GenericIncludeFolder)\sratom-0""
-				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_TIMECODE;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;LIBTIMECODE_DLL_EXPORTS;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;NDEBUG;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PACKAGE="\"ardour3_timecode\"";PROGRAM_NAME="\"Mixbus3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_TIMECODE;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;LIBTIMECODE_DLL_EXPORTS;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;NDEBUG;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PACKAGE="\"ardour3_timecode\"";PROGRAM_NAME="\"Mixbus3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
 				StringPooling="false"
 				RuntimeLibrary="2"
 				EnableEnhancedInstructionSet="1"
@@ -201,7 +201,7 @@
 				AdditionalOptions="/FI$(TargetSxsFolder)\targetsxs.h"
 				Optimization="0"
 				AdditionalIncludeDirectories="..;..\..\ardour;..\..\pbd;..\..\fst;"$(GenericIncludeFolder)\ardourext";..\..\surfaces\control_protocol;..\..\evoral;..\..\libltc;..\..\rubberband;"..\..\vamp-sdk";"..\..\midi++2";..\..\taglib;..\..\taglib\taglib;..\..\taglib\taglib\toolkit;..\..\audiographer;"$(GenericLibraryFolder)\glib-2.0\include";"$(GenericIncludeFolder)\glibmm";"$(GenericIncludeFolder)\libsndfile";"$(GenericIncludeFolder)\gtk-2.0";"$(GenericIncludeFolder)\cairo";"$(GenericIncludeFolder)\pango-1.0";"$(GenericIncludeFolder)\gtk-2.0\gdk";"$(GenericIncludeFolder)\atk-2.0";"$(GenericIncludeFolder)\lrdf";"$(GenericIncludeFolder)\raptor";"$(GenericIncludeFolder)\lilv-0";"$(GenericIncludeFolder)\suil-0";"$(GenericIncludeFolder)\serd-0";"$(GenericIncludeFolder)\sord-0";"$(GenericIncludeFolder)\lv2";"$(GenericIncludeFolder)\sratom-0""
-				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_TIMECODE;RUBBERBAND_IS_IN_WIN_STATIC_LIB;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;LIBTIMECODE_DLL_EXPORTS;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PACKAGE="\"ardour3_timecode\"";PROGRAM_NAME="\"Mixbus3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
+				PreprocessorDefinitions="PLATFORM_WINDOWS;COMPILER_MSVC;UINTSDEFINED=1;_SECURE_SCL=0;BUILDING_TIMECODE;RUBBERBAND_IS_IN_WIN_STATIC_LIB;LUA_BUILD_AS_DLL;USE_CAIRO_IMAGE_SURFACE;NOMINMAX;NO_POSIX_MEMALIGN;LIBTIMECODE_DLL_EXPORTS;INCLUDE_ARDOUR_MISCELLANEOUS=1;BOOST_REGEX_DYN_LINK;BOOST_REGEX_NO_LIB;BOOST_CHRONO_NO_LIB;BOOST_SYSTEM_NO_LIB;BOOST_THREAD_NO_LIB;BOOST_DATE_TIME_NO_LIB;GNU_WIN32;WIN32;_WIN32;ARCH_X86;USE_XMMINTRIN;BUILD_SSE_OPTIMIZATIONS;ENABLE_NLS;PACKAGE="\"ardour3_timecode\"";PROGRAM_NAME="\"Mixbus3\"";_REENTRANT;_USE_MATH_DEFINES;_LARGEFILE_SOURCE;_LARGEFILE64_SOURCE;LIBC_DISABLE_DEPRECATED;BOOST_SYSTEM_NO_DEPRECATED;__STDC_LIMIT_MACROS;__STDC_FORMAT_MACROS;INTERNAL_SHARED_LIBS=1;JACK_SESSION=1;HAVE_GLIB=1;HAVE_GTHREAD=1;HAVE_SNDFILE=1;HAVE_GIOMM=1;HAVE_CURL=1;HAVE_LO=1;HAVE_MODE_T=1;PHONE_HOME=1;FREESOUND=1;WINDOWS_KEY=\"Mod4><Super\";IS_OSX=0;HAVE_XML=1;HAVE_UUID=1;HAVE_LIBS_PBD=1;HAVE_JACK=1;HAVE_LIBS_MIDIPP2=1;HAVE_LIBS_EVORAL=1;HAVE_FFTW3=1;HAVE_FFTW3F=1;HAVE_AUBIO=1;HAVE_LIBS_VAMP_SDK=1;HAVE_LIBS_VAMP_PLUGINS=1;HAVE_LIBS_TAGLIB=1;HAVE_LIBS_LIBLTC=1;HAVE_LIBS_RUBBERBAND=1;HAVE_CONTROL_PROTOCOL=1;HAVE_FRONTIER=1;HAVE_GENERIC_MIDI=1;HAVE_MACKIE=1;HAVE_OSC=1;HAVE_TRANZPORT=1;HAVE_WIIMOTE=1;HAVE_LIBS_SURFACES=1;HAVE_2IN2OUT=1;HAVE_1IN2OUT=1;HAVE_VBAP=1;HAVE_LIBS_PANNERS=1;HAVE_LIBS_TIMECODE=1;HAVE_LRDF=1;HAVE_SAMPLERATE=1;HAVE_SERD=1;HAVE_SORD=1;HAVE_SRATOM=1;HAVE_LILV=1;HAVE_LILV_0_16_0=1;HAVE_OGG=1;HAVE_FLAC=1;HAVE_RUBBERBAND=1;USE_RUBBERBAND=1;HAVE_JACK_SESSION=1;HAVE_UNISTD=1;HAVE_JACK_ON_INFO_SHUTDOWN=1;HAVE_JACK_VIDEO_SUPPORT=1;HAVE_BOOST_SCOPED_PTR_HPP=1;HAVE_BOOST_PTR_CONTAINER_PTR_LIST_HPP=1;HAVE_LIBS_ARDOUR=1;HAVE_GTKMM=1;HAVE_GTK=1;HAVE_LIBS_GTKMM2EXT=1;HAVE_LIBS_CLEARLOOKS_NEWER=1;HAVE_BOOST_FORMAT_HPP=1;HAVE_LIBS_AUDIOGRAPHER=1;HAVE_GNOMECANVAS=0;HAVE_GNOMECANVASMM=0;HAVE_X11=0;HAVE_FONTCONFIG=1;HAVE_BOOST_SHARED_PTR_HPP=1;HAVE_BOOST_WEAK_PTR_HPP=1;HAVE_GTK2_ARDOUR=1;HAVE_EXPORT=1;HAVE_MIDI_MAPS=1;HAVE_MCP=1;HAVE_PATCHFILES=1;HAVE_TOOLS_SANITY_CHECK=1;SMF_VERSION=\"1.2\";CURRENT_SESSION_FILE_VERSION=3001"
 				StringPooling="false"
 				RuntimeLibrary="2"
 				EnableEnhancedInstructionSet="1"
@@ -290,7 +290,7 @@
 			UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
 			>
 			<File
-				RelativePath="..\..\..\icons\win32\msvc_resources.rc"
+				RelativePath="..\..\..\gtk2_ardour\win32\msvc_resources.rc"
 				>
 			</File>
 		</Filter>
diff --git a/libs/vamp-plugins/Onset.cpp b/libs/vamp-plugins/Onset.cpp
index 93f90f9..03e35ba 100644
--- a/libs/vamp-plugins/Onset.cpp
+++ b/libs/vamp-plugins/Onset.cpp
@@ -166,6 +166,12 @@ Onset::reset()
                                              lrintf(m_inputSampleRate));
 
     m_lastOnset = Vamp::RealTime::zeroTime - m_delay - m_delay;
+#else
+    if (m_onsetdet) aubio_onsetdetection_free(m_onsetdet);
+    if (m_peakpick) del_aubio_peakpicker(m_peakpick);
+
+    m_peakpick = new_aubio_peakpicker(m_threshold);
+    m_onsetdet = new_aubio_onsetdetection(m_onsettype, m_blockSize, m_channelCount);
 #endif
 }
 
diff --git a/libs/vamp-plugins/TruePeak.cpp b/libs/vamp-plugins/TruePeak.cpp
index 82c56c8..18f5a26 100644
--- a/libs/vamp-plugins/TruePeak.cpp
+++ b/libs/vamp-plugins/TruePeak.cpp
@@ -439,11 +439,14 @@ TruePeakdsp::reset ()
 	_p = 0;
 }
 
-void
+bool
 TruePeakdsp::init (float fsamp)
 {
 	_src.setup(fsamp, fsamp * 4.0, 1, 24, 1.0);
 	_buf = (float*) malloc(32768 * sizeof(float));
+	if (!_buf) {
+		return false;
+	}
 
 	/* q/d initialize */
 	float zero[8192];
@@ -455,6 +458,7 @@ TruePeakdsp::init (float fsamp)
 	_src.out_count = 32768;
 	_src.out_data = _buf;
 	_src.process ();
+	return true;
 }
 
 }
@@ -522,13 +526,15 @@ VampTruePeak::initialise(size_t channels, size_t stepSize, size_t blockSize)
 		return false;
 	}
 
-	if (blockSize > 8192) {
+	if (blockSize == 0 || blockSize > 8192) {
 		return false;
 	}
 
-	m_blockSize = blockSize;
+	if (!_meter.init (m_inputSampleRate)) {
+		return false;
+	}
 
-	_meter.init (m_inputSampleRate);
+	m_blockSize = blockSize;
 
 	return true;
 }
diff --git a/libs/vamp-plugins/TruePeak.h b/libs/vamp-plugins/TruePeak.h
index 5e3ff9d..ab83251 100644
--- a/libs/vamp-plugins/TruePeak.h
+++ b/libs/vamp-plugins/TruePeak.h
@@ -123,7 +123,7 @@ public:
 	void  read (float &m, float &p);
 	void  reset (void);
 
-	void init (float fsamp);
+	bool init (float fsamp);
 
 private:
 
diff --git a/libs/vamp-plugins/ebu_r128_proc.cc b/libs/vamp-plugins/ebu_r128_proc.cc
index 5675171..b18b9bc 100644
--- a/libs/vamp-plugins/ebu_r128_proc.cc
+++ b/libs/vamp-plugins/ebu_r128_proc.cc
@@ -24,6 +24,14 @@
 #include <math.h>
 #include "ebu_r128_proc.h"
 
+#ifdef COMPILER_MSVC
+#include <float.h>
+// C99 'isfinite()' is not available in MSVC.
+#define isfinite_local(val) (bool)_finite((double)val)
+#else
+#define isfinite_local isfinite
+#endif
+
 namespace Fons {
 
 float Ebu_r128_hist::_bin_power [100] = { 0.0f };
@@ -223,8 +231,8 @@ void Ebu_r128_proc::process (int nfram, const float *const *input)
 	    _wrind &= 63;
 	    _loudness_M = addfrags (8);
 	    _loudness_S = addfrags (60);
-	    if (!isfinite(_loudness_M) || _loudness_M < -200.f) _loudness_M = -200.0f;
-	    if (!isfinite(_loudness_S) || _loudness_S < -200.f) _loudness_S = -200.0f;
+	    if (!isfinite_local(_loudness_M) || _loudness_M < -200.f) _loudness_M = -200.0f;
+	    if (!isfinite_local(_loudness_S) || _loudness_S < -200.f) _loudness_S = -200.0f;
             if (_loudness_M > _maxloudn_M) _maxloudn_M = _loudness_M;
             if (_loudness_S > _maxloudn_S) _maxloudn_S = _loudness_S;
 	    if (_integr)
@@ -329,10 +337,10 @@ float Ebu_r128_proc::detect_process (int nfram)
 	}
 	if (_nchan == 1) si = 2 * sj;
 	else si += _chan_gain [i] * sj;
-	S->_z1 = !isfinite(z1) ? 0 : z1;
-	S->_z2 = !isfinite(z2) ? 0 : z2;
-	S->_z3 = !isfinite(z3) ? 0 : z3;
-	S->_z4 = !isfinite(z4) ? 0 : z4;
+	S->_z1 = !isfinite_local(z1) ? 0 : z1;
+	S->_z2 = !isfinite_local(z2) ? 0 : z2;
+	S->_z3 = !isfinite_local(z3) ? 0 : z3;
+	S->_z4 = !isfinite_local(z4) ? 0 : z4;
     }
     return si;
 }
diff --git a/libs/vamp-plugins/wscript b/libs/vamp-plugins/wscript
index 856ffe2..f7f64af 100644
--- a/libs/vamp-plugins/wscript
+++ b/libs/vamp-plugins/wscript
@@ -52,9 +52,11 @@ def build(bld):
     obj.target       = 'ardourvampplugins'
     obj.uselib       = 'FFTW3F VAMPSDK'
     obj.use          = 'libvampplugin libqmdsp'
-    obj.defines      = [ 'ARDOUR_VAMP_PLUGINS_DLL_EPORTS' ]
     autowaf.ensure_visible_symbols (obj, True)
-    if bld.is_defined('HAVE_AUBIO'):
+    if bld.is_defined('HAVE_AUBIO4'):
+        obj.source += ' Onset.cpp '
+        obj.uselib += ' AUBIO4 '
+    elif bld.is_defined('HAVE_AUBIO'):
         obj.source += ' Onset.cpp '
         obj.uselib += ' AUBIO '
     obj.vnum         = LIBARDOURVAMPPLUGINS_LIB_VERSION
diff --git a/libs/vfork/exec_wrapper.c b/libs/vfork/exec_wrapper.c
index e1669fb..adc568f 100644
--- a/libs/vfork/exec_wrapper.c
+++ b/libs/vfork/exec_wrapper.c
@@ -113,5 +113,14 @@ int main(int argc, char *argv[]) {
 	char buf = 0;
 	(void) write(pok[1], &buf, 1 );
 	close_fd(&pok[1]);
+
+#ifdef __clang_analyzer__
+	// the clang static analyzer warns about a memleak here,
+	// but we don't care. The OS will clean up after us in a jiffy.
+	for (i=0; envp && envp[i]; ++i) {
+		free (envp[i]);
+	}
+	free (envp);
+#endif
 	return -1;
 }
diff --git a/midi_maps/M-Audio_Axiom_Air_25_2015_Model_Transport_Only.map b/midi_maps/M-Audio_Axiom_Air_25_2015_Model_Transport_Only.map
new file mode 100644
index 0000000..704b79a
--- /dev/null
+++ b/midi_maps/M-Audio_Axiom_Air_25_2015_Model_Transport_Only.map
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ArdourMIDIBindings version="1.0.0" name="M-Audio Axiom Air 25 (2015 Model) - Transport Controls">
+
+<!-- Based on file by Chooch Schubert -->
+<!-- Simplified and updated by Guy Sherman in Jan 2016 -->
+
+<!-- NB: loop-toggle and Transport/Record are a bit weird out-of-the-box: it will only stay enabled while you press the button -->
+<!-- To fix them: reconfigure the record button from a Momentary switch to a Toggle switch as in ... -->
+<!-- this manual: http://m-audio.de/download/file/fid/803 On page 8. Then look at page 10 for instructions -->
+<!-- on saving this into the keyboard's persistent memory -->
+
+<!-- Transport Controls -->
+  <Binding channel="1" ctl="113" function="loop-toggle"/>
+  <Binding channel="1" ctl="114" function="transport-start"/>
+  <Binding channel="1" ctl="115" function="transport-end"/>
+  <Binding channel="1" ctl="116" function="transport-stop"/>
+  <Binding channel="1" ctl="117" function="transport-roll"/>
+
+  <Binding channel="1" ctl="118" action="Transport/Record"/>
+
+
+</ArdourMIDIBindings>
diff --git a/midi_maps/M-Audio_Oxygen61v3.map b/midi_maps/M-Audio_Oxygen61v3.map
new file mode 100644
index 0000000..91d709e
--- /dev/null
+++ b/midi_maps/M-Audio_Oxygen61v3.map
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ArdourMIDIBindings version="1.0.0" name="M-Audio Oxygen 61 v3">
+  <!-- 2016-01-17 Sebastiaan Lokhorst: initial version -->
+  <!-- Preset 1 in the Oxygen 61 v3 -->
+
+  <!-- Faders, mapped to track gain 1-8 and Master -->
+  <Binding channel="1" ctl="74" uri="/route/gain 1"/>
+  <Binding channel="1" ctl="71" uri="/route/gain 2"/>
+  <Binding channel="1" ctl="91" uri="/route/gain 3"/>
+  <Binding channel="1" ctl="93" uri="/route/gain 4"/>
+  <Binding channel="1" ctl="73" uri="/route/gain 5"/>
+  <Binding channel="1" ctl="72" uri="/route/gain 6"/>
+  <Binding channel="1" ctl="5" uri="/route/gain 7"/>
+  <Binding channel="1" ctl="84" uri="/route/gain 8"/>
+  <Binding channel="1" ctl="7" uri="/bus/gain master"/>
+
+  <!-- Buttons below the faders, mapped to track mute 1-8 and Master -->
+  <Binding channel="1" pgm="0" uri="/route/mute 1"/>
+  <Binding channel="1" pgm="1" uri="/route/mute 2"/>
+  <Binding channel="1" pgm="2" uri="/route/mute 3"/>
+  <Binding channel="1" pgm="3" uri="/route/mute 4"/>
+  <Binding channel="1" pgm="4" uri="/route/mute 5"/>
+  <Binding channel="1" pgm="5" uri="/route/mute 6"/>
+  <Binding channel="1" pgm="6" uri="/route/mute 7"/>
+  <Binding channel="1" pgm="7" uri="/route/mute 8"/>
+  <Binding channel="1" pgm="8" uri="/bus/mute master"/>
+
+  <!-- Encoders, mapped to pan direction -->
+  <Binding channel="1" ctl="75" uri="/route/pandirection 1"/>
+  <Binding channel="1" ctl="76" uri="/route/pandirection 2"/>
+  <Binding channel="1" ctl="92" uri="/route/pandirection 3"/>
+  <Binding channel="1" ctl="95" uri="/route/pandirection 4"/>
+  <Binding channel="1" ctl="10" uri="/route/pandirection 5"/>
+  <Binding channel="1" ctl="77" uri="/route/pandirection 6"/>
+  <Binding channel="1" ctl="78" uri="/route/pandirection 7"/>
+  <Binding channel="1" ctl="79" uri="/route/pandirection 8"/>
+
+  <!-- Transport controls -->
+  <Binding channel="16" ctl="113" function="loop-toggle"/>
+  <Binding channel="16" ctl="114" function="transport-start"/>
+  <Binding channel="16" ctl="115" function="transport-end"/>
+  <Binding channel="16" ctl="116" function="transport-stop"/>
+  <Binding channel="16" ctl="117" function="transport-roll"/>
+  <Binding channel="16" ctl="118" function="rec-enable"/>
+
+</ArdourMIDIBindings>
diff --git a/midi_maps/akai-mpd-32.map b/midi_maps/akai-mpd-32.map
new file mode 100644
index 0000000..a11535b
--- /dev/null
+++ b/midi_maps/akai-mpd-32.map
@@ -0,0 +1,115 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ArdourMIDIBindings version="1.0.0" name="AKAI MPD32 by samtuke">
+
+  <!-- NOTE: This map uses 'Cubase' (Preset 3) on the MPD -->
+
+  <!-- Set bank-size to 8 -->
+  <DeviceInfo bank-size="8"/>
+  
+  <!-- Unused
+  Set switch track
+  <Binding channel="16" ctl="110" function="prev-bank"/>
+  <Binding channel="16" ctl="111" function="next-bank"/>
+  -->
+  
+  <!-- Set basic transport controls -->
+  <Binding channel="1" ctl="115" function="transport-start"/>
+  <Binding channel="1" ctl="116" function="transport-end"/>
+  <Binding channel="1" ctl="117" function="transport-stop"/>
+  <Binding channel="1" ctl="118" function="transport-roll"/>
+  <Binding channel="1" ctl="119" function="rec-enable"/>
+  <Binding channel="1" ctl="119" function="rec-disable"/>
+
+  <!-- Unused
+  Set master volume fader
+  <Binding channel="16" ctl="41" uri="/bus/gain master"/>
+  -->
+
+  <!-- Set faders -->
+  <Binding channel="1" ctl="7" uri="/route/gain 1"/>
+  <Binding channel="2" ctl="7" uri="/route/gain 2"/>
+  <Binding channel="3" ctl="7" uri="/route/gain 3"/>
+  <Binding channel="4" ctl="7" uri="/route/gain 4"/>
+  <Binding channel="5" ctl="7" uri="/route/gain 5"/>
+  <Binding channel="6" ctl="7" uri="/route/gain 6"/>
+  <Binding channel="7" ctl="7" uri="/route/gain 7"/>
+  <Binding channel="8" ctl="7" uri="/route/gain 8"/>
+  <Binding channel="9" ctl="7" uri="/route/gain 9"/>
+  <Binding channel="10" ctl="7" uri="/route/gain 10"/>
+  <Binding channel="11" ctl="7" uri="/route/gain 11"/>
+  <Binding channel="12" ctl="7" uri="/route/gain 12"/>
+  <Binding channel="13" ctl="7" uri="/route/gain 13"/>
+  <Binding channel="14" ctl="7" uri="/route/gain 14"/>
+  <Binding channel="15" ctl="7" uri="/route/gain 15"/>
+  <Binding channel="16" ctl="7" uri="/route/gain 16"/>
+  <Binding channel="17" ctl="7" uri="/route/gain 17"/>
+  <Binding channel="18" ctl="7" uri="/route/gain 18"/>
+  <Binding channel="19" ctl="7" uri="/route/gain 19"/>
+  <Binding channel="20" ctl="7" uri="/route/gain 20"/>
+  <Binding channel="21" ctl="7" uri="/route/gain 21"/>
+  <Binding channel="22" ctl="7" uri="/route/gain 22"/>
+  <Binding channel="23" ctl="7" uri="/route/gain 23"/>
+  <Binding channel="24" ctl="7" uri="/route/gain 24"/>
+  
+  <!-- Set knobs to correspond to plugin attributes -->
+  <Binding channel="1" ctl="10" uri="/route/plugin/parameter B1 1 1"/>
+  <Binding channel="2" ctl="10" uri="/route/plugin/parameter B1 1 2"/>
+  <Binding channel="3" ctl="10" uri="/route/plugin/parameter B1 1 3"/>
+  <Binding channel="4" ctl="10" uri="/route/plugin/parameter B1 1 4"/>
+  <Binding channel="5" ctl="10" uri="/route/plugin/parameter B1 1 5"/>
+  <Binding channel="6" ctl="10" uri="/route/plugin/parameter B1 1 6"/>
+  <Binding channel="7" ctl="10" uri="/route/plugin/parameter B1 1 7"/>
+  <Binding channel="8" ctl="10" uri="/route/plugin/parameter B1 1 8"/>
+  <Binding channel="9" ctl="10" uri="/route/plugin/parameter B1 1 9"/>
+  <Binding channel="10" ctl="10" uri="/route/plugin/parameter B1 1 10"/>
+  <Binding channel="11" ctl="10" uri="/route/plugin/parameter B1 1 11"/>
+  <Binding channel="12" ctl="10" uri="/route/plugin/parameter B1 1 12"/>
+  <Binding channel="13" ctl="10" uri="/route/plugin/parameter B1 1 13"/>
+  <Binding channel="14" ctl="10" uri="/route/plugin/parameter B1 1 14"/>
+  <Binding channel="15" ctl="10" uri="/route/plugin/parameter B1 1 15"/>
+  <Binding channel="16" ctl="10" uri="/route/plugin/parameter B1 1 16"/>
+  <Binding channel="17" ctl="10" uri="/route/plugin/parameter B1 1 17"/>
+  <Binding channel="18" ctl="10" uri="/route/plugin/parameter B1 1 18"/>
+  <Binding channel="19" ctl="10" uri="/route/plugin/parameter B1 1 19"/>
+  <Binding channel="20" ctl="10" uri="/route/plugin/parameter B1 1 20"/>
+  <Binding channel="21" ctl="10" uri="/route/plugin/parameter B1 1 21"/>
+  <Binding channel="22" ctl="10" uri="/route/plugin/parameter B1 1 22"/>
+  <Binding channel="23" ctl="10" uri="/route/plugin/parameter B1 1 23"/>
+  <Binding channel="24" ctl="10" uri="/route/plugin/parameter B1 1 24"/>
+
+  <!-- Unused
+  Set master mute button
+  <Binding channel="16" ctl="57" uri="/bus/mute master"/>
+  -->
+
+  <!-- Set mute buttons beneath faders to correspond to banks --> 
+  <Binding channel="1" ctl="64" uri="/route/mute B1"/>    
+  <Binding channel="2" ctl="64" uri="/route/mute B2"/> 
+  <Binding channel="3" ctl="64" uri="/route/mute B3"/> 
+  <Binding channel="4" ctl="64" uri="/route/mute B4"/>
+  <Binding channel="5" ctl="64" uri="/route/mute B5"/>
+  <Binding channel="6" ctl="64" uri="/route/mute B6"/>
+  <Binding channel="7" ctl="64" uri="/route/mute B7"/>
+  <Binding channel="8" ctl="64" uri="/route/mute B8"/>
+  <Binding channel="9" ctl="64" uri="/route/mute B9"/>
+  <Binding channel="10" ctl="64" uri="/route/mute B10"/>
+  <Binding channel="11" ctl="64" uri="/route/mute B11"/>
+  <Binding channel="12" ctl="64" uri="/route/mute B12"/>
+  <Binding channel="13" ctl="64" uri="/route/mute B13"/>
+  <Binding channel="14" ctl="64" uri="/route/mute B14"/>
+  <Binding channel="15" ctl="64" uri="/route/mute B15"/>
+  <Binding channel="16" ctl="64" uri="/route/mute B16"/>
+  <Binding channel="17" ctl="64" uri="/route/mute B17"/>
+  <Binding channel="18" ctl="64" uri="/route/mute B18"/>
+  <Binding channel="19" ctl="64" uri="/route/mute B19"/>
+  <Binding channel="20" ctl="64" uri="/route/mute B20"/>
+  <Binding channel="21" ctl="64" uri="/route/mute B21"/>
+  <Binding channel="22" ctl="64" uri="/route/mute B22"/>
+  <Binding channel="23" ctl="64" uri="/route/mute B23"/>
+  <Binding channel="24" ctl="64" uri="/route/mute B24"/>
+
+  <!-- Pan, unused for now
+  <Binding channel="1"  ctl="75"  uri="/route/pan B2"/>
+  -->
+
+</ArdourMIDIBindings>
diff --git a/midi_maps/m-audio-oxygen61v3.map b/midi_maps/m-audio-oxygen61v3.map
new file mode 100644
index 0000000..08a2707
--- /dev/null
+++ b/midi_maps/m-audio-oxygen61v3.map
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ArdourMIDIBindings version="1.0.0" name="M-Audio Oxygen61 V3 by samtuke">
+
+  <!-- NOTE: This map uses 'P.10' (program 10) on the keyboard, which is the direct link program. Make sure you have set your program to 10 to use it with this map -->
+
+  <!-- The keyboard has 9 faders, but one of them is always master volume, so set bank-size to 8 -->
+  <DeviceInfo bank-size="8"/>
+  
+  <!-- Set arrows labelled 'track' on keyboard to switch banks -->
+  <Binding channel="16" ctl="110" function="prev-bank"/>
+  <Binding channel="16" ctl="111" function="next-bank"/>
+  
+  <!-- Set basic transport controls -->
+  <Binding channel="16" ctl="113" function="loop-toggle"/>
+  <Binding channel="16" ctl="114" function="transport-start"/>
+  <Binding channel="16" ctl="115" function="transport-end"/>
+  <Binding channel="16" ctl="116" function="transport-stop"/>
+  <Binding channel="16" ctl="117" function="transport-roll"/>
+  <Binding channel="16" ctl="118" function="rec-enable"/>
+  <Binding channel="16" ctl="118" function="rec-disable"/>
+
+  <!-- Set master volume fader, this is far right most fader labelled C9 and is master volume on all banks by default -->
+  <Binding channel="16" ctl="41" uri="/bus/gain master"/>
+
+  <!-- Set faders 1-8 to corresponding banks -->
+  <Binding channel="16" ctl="33" uri="/route/gain 1"/>
+  <Binding channel="16" ctl="34" uri="/route/gain 2"/>
+  <Binding channel="16" ctl="35" uri="/route/gain 3"/>
+  <Binding channel="16" ctl="36" uri="/route/gain 4"/>
+  <Binding channel="16" ctl="37" uri="/route/gain 5"/>
+  <Binding channel="16" ctl="38" uri="/route/gain 6"/>
+  <Binding channel="16" ctl="39" uri="/route/gain 7"/>
+  <Binding channel="16" ctl="40" uri="/route/gain 8"/>
+  
+  <!-- Set knobs to correspond to plugin attributes -->
+  <Binding channel="16" ctl="17" uri="/route/plugin/parameter B1 1 1"/>
+  <Binding channel="16" ctl="18" uri="/route/plugin/parameter B1 1 2"/>
+  <Binding channel="16" ctl="19" uri="/route/plugin/parameter B1 1 3"/>
+  <Binding channel="16" ctl="20" uri="/route/plugin/parameter B1 1 4"/>
+  <Binding channel="16" ctl="21" uri="/route/plugin/parameter B1 1 5"/>
+  <Binding channel="16" ctl="22" uri="/route/plugin/parameter B1 1 6"/>
+  <Binding channel="16" ctl="23" uri="/route/plugin/parameter B1 1 7"/>
+  <Binding channel="16" ctl="24" uri="/route/plugin/parameter B1 1 8"/>
+ 
+  <!-- Set master mute button -->
+  <Binding channel="16" ctl="57" uri="/bus/mute master"/>
+
+  <!-- Set mute buttons beneath faders to correspond to banks --> 
+  <Binding channel="16" ctl="49" uri="/route/mute B1"/>    
+  <Binding channel="16" ctl="50" uri="/route/mute B2"/> 
+  <Binding channel="16" ctl="51" uri="/route/mute B3"/> 
+  <Binding channel="16" ctl="52" uri="/route/mute B4"/>
+  <Binding channel="16" ctl="53" uri="/route/mute B5"/>
+  <Binding channel="16" ctl="54" uri="/route/mute B6"/>
+  <Binding channel="16" ctl="55" uri="/route/mute B7"/>
+  <Binding channel="16" ctl="56" uri="/route/mute B8"/>
+
+  <!-- Pan, unused for now
+  <Binding channel="1"  ctl="75"  uri="/route/pan B2"/>
+  -->
+
+</ArdourMIDIBindings>
diff --git a/patchfiles/MIDIEvents10.dtd b/patchfiles/MIDIEvents10.dtd
new file mode 100644
index 0000000..cca10cd
--- /dev/null
+++ b/patchfiles/MIDIEvents10.dtd
@@ -0,0 +1,195 @@
+<!--
+	XML DTD for MIDI messages
+	
+	Version 1.0, 19 January 2003
+	
+	Formal Public Identifier:
+		"-//MIDI Manufacturers Association//DTD MIDIEvents 1.0//EN"
+
+	URI:
+		"http://www.midi.org/dtds/MIDIEvents10.dtd"
+
+	Parameter entities which must be defined before use:
+		%ChannelRequired;		#IMPLIED
+									for use in contexts, where the event is always
+									rechannelized
+								#REQUIRED
+									when channel messages require Channel attribute
+
+	e.g.
+		<!ENTITY % MIDIDTD PUBLIC	"-//MIDI Manufacturers Association//DTD MIDIEvents 1.0//EN"
+									"http://www.midi.org/dtds/MIDIEvents10.dtd" >
+		%MIDIDTD;
+-->
+
+<!--
+	CHANNEL MESSAGES
+	
+	Attribute values:
+		Note, Velocity, Pressure, Control, Value, Number are all 0..127
+		except: PitchBend's Value is 0..16383
+-->
+
+<!ELEMENT NoteOn EMPTY>
+	<!ATTLIST NoteOn
+		Channel		(1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16)	%ChannelRequired;
+		Note		NMTOKEN										#REQUIRED
+		Velocity	NMTOKEN										#REQUIRED>
+
+<!ELEMENT NoteOff EMPTY>
+	<!ATTLIST NoteOff
+		Channel		(1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16)	%ChannelRequired;
+		Note		NMTOKEN										#REQUIRED
+		Velocity	NMTOKEN										#REQUIRED>
+
+<!ELEMENT PolyKeyPressure EMPTY>
+	<!ATTLIST PolyKeyPressure
+		Channel		(1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16)	%ChannelRequired;
+		Note		NMTOKEN										#REQUIRED
+		Pressure	NMTOKEN										#REQUIRED>
+
+<!ELEMENT ControlChange EMPTY>
+	<!ATTLIST ControlChange
+		Channel		(1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16)	%ChannelRequired;
+		Control		NMTOKEN										#REQUIRED
+		Value		NMTOKEN										#REQUIRED>
+
+<!ELEMENT ProgramChange EMPTY>
+	<!ATTLIST ProgramChange
+		Channel		(1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16)	%ChannelRequired;
+		Number		NMTOKEN										#REQUIRED>
+
+<!ELEMENT ChannelKeyPressure EMPTY>
+	<!ATTLIST ChannelKeyPressure
+		Channel		(1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16)	%ChannelRequired;
+		Pressure	NMTOKEN										#REQUIRED>
+
+<!ELEMENT PitchBendChange EMPTY>
+	<!ATTLIST PitchBendChange
+		Channel		(1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16)	%ChannelRequired;
+		Value		NMTOKEN										#REQUIRED>
+
+<!--
+	Channel mode messages
+-->
+<!ELEMENT AllSoundOff EMPTY>
+	<!ATTLIST AllSoundOff
+		Channel		(1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16)	%ChannelRequired;>
+
+<!ELEMENT ResetAllControllers EMPTY>
+	<!ATTLIST ResetAllControllers
+		Channel		(1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16)	%ChannelRequired;>
+
+<!ELEMENT LocalControl EMPTY>
+	<!ATTLIST LocalControl
+		Channel		(1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16)	%ChannelRequired;
+		Value		(off|on)									#REQUIRED>
+
+<!ELEMENT AllNotesOff EMPTY>
+	<!ATTLIST AllNotesOff
+		Channel		(1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16)	%ChannelRequired;>
+
+<!ELEMENT OmniOff EMPTY>
+	<!ATTLIST OmniOff
+		Channel		(1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16)	%ChannelRequired;>
+
+<!ELEMENT OmniOn EMPTY>
+	<!ATTLIST OmniOn
+		Channel		(1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16)	%ChannelRequired;>
+
+<!ELEMENT MonoMode EMPTY>
+	<!ATTLIST MonoMode
+		Channel		(1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16)	%ChannelRequired;
+		Value		NMTOKEN                                     #REQUIRED>
+
+<!ELEMENT PolyMode EMPTY>
+	<!ATTLIST PolyMode
+		Channel		(1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16)	%ChannelRequired;>
+
+<!--
+	14-bit control changes:
+		Value is 0..16383
+	
+		ControlChange14's Control is MSB 0..31
+		RPNN and NRPN are 0..16383
+-->
+
+<!ELEMENT ControlChange14 EMPTY>
+	<!ATTLIST ControlChange14
+		Channel		(1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16)	%ChannelRequired;
+		Control		NMTOKEN										#REQUIRED
+		Value		NMTOKEN										#REQUIRED>	
+
+<!ELEMENT RPNChange EMPTY>
+	<!ATTLIST RPNChange
+		Channel		(1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16)	%ChannelRequired;
+		RPN			NMTOKEN										#REQUIRED
+		Value		NMTOKEN										#REQUIRED>
+
+<!ELEMENT NRPNChange EMPTY>
+	<!ATTLIST NRPNChange
+		Channel		(1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16)	%ChannelRequired;
+		NRPN		NMTOKEN										#REQUIRED
+		Value		NMTOKEN										#REQUIRED>
+
+
+<!--
+	SYSTEM MESSAGES
+-->
+
+<!ELEMENT SysEx (#PCDATA | SysExDeviceID | SysExChannel)*>		
+	<!-- contains string of hex bytes without radix information, e.g.:
+	<SysEx>F0 01 02 <SysExDeviceID/> 03 04 05 <SysExChannel Multiplier="1" Offset="32"/> F7</SysEx>	
+	-->
+
+<!ELEMENT SysExDeviceID EMPTY>		<!-- Byte as a function of user-visible Device ID
+										e.g. 17 as the default on many Roland devices.
+										Most sysex messages will use this element. -->
+	<!ATTLIST SysExDeviceID
+		Multiplier	NMTOKEN	"1"
+		Offset		NMTOKEN	"0">	<!-- multiplier and offset are decimal -->	
+		
+<!ELEMENT SysExChannel	EMPTY>		<!-- Byte as a function of MIDI Channel 1-16, for
+										specialized situations where a sys-ex message
+										is being directed to a specific MIDI channel.
+										Generally only older devices require use of this. -->
+	<!ATTLIST SysExChannel
+		Multiplier	NMTOKEN	"1"
+		Offset		NMTOKEN	"0">	<!-- multiplier and offset are decimal -->
+			
+<!ELEMENT MTCQuarterFrame EMPTY>
+	<!ATTLIST MTCQuarterFrame
+		MessageType	(FrameLSNibble | FrameMSNibble |
+			SecsLSNibble  | SecsMSNibble  |
+			MinsLSNibble  | MinsMSNibble  |
+			HrsLSNibble	  | HrsMSNibbleSMPTEType)				#REQUIRED
+		DataNibble		NMTOKEN									#REQUIRED>
+
+<!ELEMENT SongPositionPointer EMPTY>
+	<!ATTLIST SongPositionPointer
+		Position	NMTOKEN		#REQUIRED>	<!-- 0-16383 -->
+
+<!ELEMENT SongSelect EMPTY>
+	<!ATTLIST SongSelect
+		Number		NMTOKEN		#REQUIRED>	<!-- 0-127 -->
+
+<!ELEMENT TuneRequest EMPTY>
+<!ELEMENT TimingClock EMPTY>
+<!ELEMENT Start EMPTY>
+<!ELEMENT Continue EMPTY>
+<!ELEMENT Stop EMPTY>
+<!ELEMENT ActiveSensing EMPTY>
+<!ELEMENT SystemReset EMPTY>
+
+<!--
+	ENTITIES
+-->
+
+<!ENTITY % MIDIChannelVoiceMessage "(NoteOn | NoteOff | PolyKeyPressure | ControlChange | ProgramChange
+	| ChannelKeyPressure | PitchBendChange)">
+<!ENTITY % MIDIChannelModeMessage "(AllSoundOff | ResetAllControllers | LocalControl | AllNotesOff
+	| OmniOff | OmniOn | MonoMode | PolyMode)">
+<!ENTITY % MIDIChannelMessage "(%MIDIChannelVoiceMessage; | %MIDIChannelModeMessage;)">
+<!ENTITY % MIDISystemMessage "(SysEx | MTCQuarterFrame | SongPositionPointer | SongSelect
+	| TuneRequest | TimingClock | Start | Continue | Stop | ActiveSensing | SystemReset)">
+<!ENTITY % MIDIMessage "(%MIDIChannelMessage; | %MIDISystemMessage; )">
diff --git a/patchfiles/MIDINameDocument10.dtd b/patchfiles/MIDINameDocument10.dtd
index 24befd1..5a95f64 100644
--- a/patchfiles/MIDINameDocument10.dtd
+++ b/patchfiles/MIDINameDocument10.dtd
@@ -150,7 +150,7 @@
 -->
 <!ENTITY % ChannelRequired "#IMPLIED">
 <!ENTITY % MIDIDTD PUBLIC	"-//MIDI Manufacturers Association//DTD MIDIEvents 1.0//EN"
-							"http://www.midi.org/dtds/MIDIEvents10.dtd" >
+							"MIDIEvents10.dtd" >
 %MIDIDTD;
 
 <!ELEMENT MIDICommands (MIDIDelay | %MIDIChannelMessage; | SysEx)+ >
diff --git a/patchfiles/Waldorf_Blofeld.midnam b/patchfiles/Waldorf_Blofeld.midnam
index 90df745..0675e76 100644
--- a/patchfiles/Waldorf_Blofeld.midnam
+++ b/patchfiles/Waldorf_Blofeld.midnam
@@ -5,7 +5,7 @@
   <MasterDeviceNames>
     <Manufacturer>Waldorf</Manufacturer>
     <Model>Blofeld</Model>
-    <CustomDeviceMode Name="">
+    <CustomDeviceMode Name="Default">
       <ChannelNameSetAssignments>
         <ChannelNameSetAssign Channel="1" NameSet="Presets"/>
         <ChannelNameSetAssign Channel="2" NameSet="Presets"/>
@@ -44,6 +44,7 @@
         <AvailableChannel Channel="15" Available="true"/>
         <AvailableChannel Channel="16" Available="true"/>
       </AvailableForChannels>
+      <UsesControlNameList Name="Controls"/>
       <PatchBank Name="Presets A" ROM="false">
         <MIDICommands>
           <ControlChange Control="0" Value="0"/>
@@ -392,7 +393,7 @@
       <Patch Number="C036" Name="C036 PolySequencer" ProgramChange="35"/>
       <Patch Number="C037" Name="C037 PowerLead" ProgramChange="36"/>
       <Patch Number="C038" Name="C038 Harp" ProgramChange="37"/>
-      <Patch Number="C039" Name="C039 PPG Nylons  PROX" ProgramChange="38"/>
+      <Patch Number="C039" Name="C039 PPG Nylons PROX" ProgramChange="38"/>
       <Patch Number="C040" Name="C040 Pure Key" ProgramChange="39"/>
       <Patch Number="C041" Name="C041 PWMaster" ProgramChange="40"/>
       <Patch Number="C042" Name="C042 Qazzio" ProgramChange="41"/>
@@ -581,7 +582,7 @@
       <Patch Number="D095" Name="D095 Slow Wavetrip" ProgramChange="94"/>
       <Patch Number="D096" Name="D096 Soap" ProgramChange="95"/>
       <Patch Number="D097" Name="D097 Soar" ProgramChange="96"/>
-      <Patch Number="D098" Name="D098 Soft  Pad" ProgramChange="97"/>
+      <Patch Number="D098" Name="D098 Soft Pad" ProgramChange="97"/>
       <Patch Number="D099" Name="D099 Sonnenaufgang" ProgramChange="98"/>
       <Patch Number="D100" Name="D100 Speak _ Hold" ProgramChange="99"/>
       <Patch Number="D101" Name="D101 Straight Pad" ProgramChange="100"/>
@@ -1021,8 +1022,8 @@
       <Patch Number="H015" Name="H015 Gastrology" ProgramChange="14"/>
       <Patch Number="H016" Name="H016 HawaiGlider" ProgramChange="15"/>
       <Patch Number="H017" Name="H017 Into Mout" ProgramChange="16"/>
-      <Patch Number="H018" Name="H018 LFO  Speeddwn" ProgramChange="17"/>
-      <Patch Number="H019" Name="H019 LFO  Speedup" ProgramChange="18"/>
+      <Patch Number="H018" Name="H018 LFO Speeddwn" ProgramChange="17"/>
+      <Patch Number="H019" Name="H019 LFO Speedup" ProgramChange="18"/>
       <Patch Number="H020" Name="H020 LilaBell" ProgramChange="19"/>
       <Patch Number="H021" Name="H021 Living Water" ProgramChange="20"/>
       <Patch Number="H022" Name="H022 LosAngeles2019" ProgramChange="21"/>
@@ -1133,5 +1134,770 @@
       <Patch Number="H127" Name="H127 Zap Stick" ProgramChange="126"/>
       <Patch Number="H128" Name="H128 Zwitscher 1" ProgramChange="127"/>
     </PatchNameList>
+    <ValueNameList Name="Minus64Plus63">
+        <Value Number="0" Name="-64"/>
+        <Value Number="1" Name="-63"/>
+        <Value Number="2" Name="-62"/>
+        <Value Number="3" Name="-61"/>
+        <Value Number="4" Name="-60"/>
+        <Value Number="5" Name="-59"/>
+        <Value Number="6" Name="-58"/>
+        <Value Number="7" Name="-57"/>
+        <Value Number="8" Name="-56"/>
+        <Value Number="9" Name="-55"/>
+        <Value Number="10" Name="-54"/>
+        <Value Number="11" Name="-53"/>
+        <Value Number="12" Name="-52"/>
+        <Value Number="13" Name="-51"/>
+        <Value Number="14" Name="-50"/>
+        <Value Number="15" Name="-49"/>
+        <Value Number="16" Name="-48"/>
+        <Value Number="17" Name="-47"/>
+        <Value Number="18" Name="-46"/>
+        <Value Number="19" Name="-45"/>
+        <Value Number="20" Name="-44"/>
+        <Value Number="21" Name="-43"/>
+        <Value Number="22" Name="-42"/>
+        <Value Number="23" Name="-41"/>
+        <Value Number="24" Name="-40"/>
+        <Value Number="25" Name="-39"/>
+        <Value Number="26" Name="-38"/>
+        <Value Number="27" Name="-37"/>
+        <Value Number="28" Name="-36"/>
+        <Value Number="29" Name="-35"/>
+        <Value Number="30" Name="-34"/>
+        <Value Number="31" Name="-33"/>
+        <Value Number="32" Name="-32"/>
+        <Value Number="33" Name="-31"/>
+        <Value Number="34" Name="-30"/>
+        <Value Number="35" Name="-29"/>
+        <Value Number="36" Name="-28"/>
+        <Value Number="37" Name="-27"/>
+        <Value Number="38" Name="-26"/>
+        <Value Number="39" Name="-25"/>
+        <Value Number="40" Name="-24"/>
+        <Value Number="41" Name="-23"/>
+        <Value Number="42" Name="-22"/>
+        <Value Number="43" Name="-21"/>
+        <Value Number="44" Name="-20"/>
+        <Value Number="45" Name="-19"/>
+        <Value Number="46" Name="-18"/>
+        <Value Number="47" Name="-17"/>
+        <Value Number="48" Name="-16"/>
+        <Value Number="49" Name="-15"/>
+        <Value Number="50" Name="-14"/>
+        <Value Number="51" Name="-13"/>
+        <Value Number="52" Name="-12"/>
+        <Value Number="53" Name="-11"/>
+        <Value Number="54" Name="-10"/>
+        <Value Number="55" Name="-9"/>
+        <Value Number="56" Name="-8"/>
+        <Value Number="57" Name="-7"/>
+        <Value Number="58" Name="-6"/>
+        <Value Number="59" Name="-5"/>
+        <Value Number="60" Name="-4"/>
+        <Value Number="61" Name="-3"/>
+        <Value Number="62" Name="-2"/>
+        <Value Number="63" Name="-1"/>
+        <Value Number="64" Name="0"/>
+        <Value Number="65" Name="+1"/>
+        <Value Number="66" Name="+2"/>
+        <Value Number="67" Name="+3"/>
+        <Value Number="68" Name="+4"/>
+        <Value Number="69" Name="+5"/>
+        <Value Number="70" Name="+6"/>
+        <Value Number="71" Name="+7"/>
+        <Value Number="72" Name="+8"/>
+        <Value Number="73" Name="+9"/>
+        <Value Number="74" Name="+10"/>
+        <Value Number="75" Name="+11"/>
+        <Value Number="76" Name="+12"/>
+        <Value Number="77" Name="+13"/>
+        <Value Number="78" Name="+14"/>
+        <Value Number="79" Name="+15"/>
+        <Value Number="80" Name="+16"/>
+        <Value Number="81" Name="+17"/>
+        <Value Number="82" Name="+18"/>
+        <Value Number="83" Name="+19"/>
+        <Value Number="84" Name="+20"/>
+        <Value Number="85" Name="+21"/>
+        <Value Number="86" Name="+22"/>
+        <Value Number="87" Name="+23"/>
+        <Value Number="88" Name="+24"/>
+        <Value Number="89" Name="+25"/>
+        <Value Number="90" Name="+26"/>
+        <Value Number="91" Name="+27"/>
+        <Value Number="92" Name="+28"/>
+        <Value Number="93" Name="+29"/>
+        <Value Number="94" Name="+30"/>
+        <Value Number="95" Name="+31"/>
+        <Value Number="96" Name="+32"/>
+        <Value Number="97" Name="+33"/>
+        <Value Number="98" Name="+34"/>
+        <Value Number="99" Name="+35"/>
+        <Value Number="100" Name="+36"/>
+        <Value Number="101" Name="+37"/>
+        <Value Number="102" Name="+38"/>
+        <Value Number="103" Name="+39"/>
+        <Value Number="104" Name="+40"/>
+        <Value Number="105" Name="+41"/>
+        <Value Number="106" Name="+42"/>
+        <Value Number="107" Name="+43"/>
+        <Value Number="108" Name="+44"/>
+        <Value Number="109" Name="+45"/>
+        <Value Number="110" Name="+46"/>
+        <Value Number="111" Name="+47"/>
+        <Value Number="112" Name="+48"/>
+        <Value Number="113" Name="+49"/>
+        <Value Number="114" Name="+50"/>
+        <Value Number="115" Name="+51"/>
+        <Value Number="116" Name="+52"/>
+        <Value Number="117" Name="+53"/>
+        <Value Number="118" Name="+54"/>
+        <Value Number="119" Name="+55"/>
+        <Value Number="120" Name="+56"/>
+        <Value Number="121" Name="+57"/>
+        <Value Number="122" Name="+58"/>
+        <Value Number="123" Name="+59"/>
+        <Value Number="124" Name="+60"/>
+        <Value Number="125" Name="+61"/>
+        <Value Number="126" Name="+62"/>
+        <Value Number="127" Name="+63"/>
+    </ValueNameList>
+    <ValueNameList Name="OscShapes">
+        <Value Number="0" Name="Off"/>
+        <Value Number="1" Name="Pulse"/>
+        <Value Number="2" Name="Sawtooth"/>
+        <Value Number="3" Name="Triangle"/>
+        <Value Number="4" Name="Sine"/>
+        <Value Number="5" Name="Alt 1"/>
+        <Value Number="6" Name="Alt 2"/>
+        <Value Number="7" Name="Resonant"/>
+        <Value Number="8" Name="Resonant 2"/>
+        <Value Number="9" Name="MatteSyn"/>
+        <Value Number="10" Name="Sqr-Sweep"/>
+        <Value Number="11" Name="Bellish"/>
+        <Value Number="12" Name="Put-Sweep"/>
+        <Value Number="13" Name="Saw-Sweep"/>
+        <Value Number="14" Name="MellowSaw"/>
+        <Value Number="15" Name="Feedback"/>
+        <Value Number="16" Name="Add Harm"/>
+        <Value Number="17" Name="Reso 3 HP"/>
+        <Value Number="18" Name="Wind Syn"/>
+        <Value Number="19" Name="High Harm"/>
+        <Value Number="20" Name="Clipper"/>
+        <Value Number="21" Name="Organ Syn"/>
+        <Value Number="22" Name="SquareSaw"/>
+        <Value Number="23" Name="Formant 1"/>
+        <Value Number="24" Name="Polated"/>
+        <Value Number="25" Name="Transient"/>
+        <Value Number="26" Name="ElectricP"/>
+        <Value Number="27" Name="Robotic"/>
+        <Value Number="28" Name="StrongHrm"/>
+        <Value Number="29" Name="PercOrgan"/>
+        <Value Number="30" Name="ClipSweep"/>
+        <Value Number="31" Name="ResoHarms"/>
+        <Value Number="32" Name="2 Echoes"/>
+        <Value Number="33" Name="Formant 2"/>
+        <Value Number="34" Name="FmntVocal"/>
+        <Value Number="35" Name="MicroSync"/>
+        <Value Number="36" Name="Micro PWM"/>
+        <Value Number="37" Name="Glassy"/>
+        <Value Number="38" Name="Square HP"/>
+        <Value Number="39" Name="Saw Sync 1"/>
+        <Value Number="40" Name="Saw Sync 2"/>
+        <Value Number="41" Name="Saw Sync 3"/>
+        <Value Number="42" Name="Pulse Sync 1"/>
+        <Value Number="43" Name="Pulse Sync 2"/>
+        <Value Number="44" Name="Pulse Sync 3"/>
+        <Value Number="45" Name="Sine Sync 1"/>
+        <Value Number="46" Name="Sine Sync 2"/>
+        <Value Number="47" Name="Sine Sync 3"/>
+        <Value Number="48" Name="PWM Pulse"/>
+        <Value Number="49" Name="PWM Saw"/>
+        <Value Number="50" Name="Fuzz Wave"/>
+        <Value Number="51" Name="Distorted"/>
+        <Value Number="52" Name="HeavyFuzz"/>
+        <Value Number="53" Name="Fuzz Sync"/>
+        <Value Number="54" Name="K+Strong1"/>
+        <Value Number="55" Name="K+Strong2"/>
+        <Value Number="56" Name="K+Strong3"/>
+        <Value Number="57" Name="1-2-3-4-5"/>
+        <Value Number="58" Name="19/twenty"/>
+        <Value Number="59" Name="Wavetrip1"/>
+        <Value Number="60" Name="Wavetrip2"/>
+        <Value Number="61" Name="Wavetrip3"/>
+        <Value Number="62" Name="Wavetrip4"/>
+        <Value Number="63" Name="MaleVoice"/>
+        <Value Number="64" Name="Low Piano"/>
+        <Value Number="65" Name="ResoSweep"/>
+        <Value Number="66" Name="Xmas Bell"/>
+        <Value Number="67" Name="FM Piano"/>
+        <Value Number="68" Name="Fat Organ"/>
+        <Value Number="69" Name="Vibes"/>
+        <Value Number="70" Name="Chorus 2"/>
+        <Value Number="71" Name="True PWM"/>
+        <Value Number="72" Name="Upper Waves"/>
+        <Value Number="73" Name="reserved"/>
+        <Value Number="74" Name="reserved"/>
+        <Value Number="75" Name="reserved"/>
+        <Value Number="76" Name="reserved"/>
+        <Value Number="77" Name="reserved"/>
+        <Value Number="78" Name="reserved"/>
+        <Value Number="79" Name="reserved"/>
+        <Value Number="80" Name="reserved"/>
+        <Value Number="81" Name="reserved"/>
+        <Value Number="82" Name="reserved"/>
+        <Value Number="83" Name="reserved"/>
+        <Value Number="84" Name="reserved"/>
+        <Value Number="85" Name="reserved"/>
+        <Value Number="86" Name="User Wavetable 80"/>
+        <Value Number="87" Name="User Wavetable 81"/>
+        <Value Number="88" Name="User Wavetable 82"/>
+        <Value Number="89" Name="User Wavetable 83"/>
+        <Value Number="90" Name="User Wavetable 84"/>
+        <Value Number="91" Name="User Wavetable 85"/>
+        <Value Number="92" Name="User Wavetable 86"/>
+        <Value Number="93" Name="User Wavetable 87"/>
+        <Value Number="94" Name="User Wavetable 88"/>
+        <Value Number="95" Name="User Wavetable 89"/>
+        <Value Number="96" Name="User Wavetable 90"/>
+        <Value Number="97" Name="User Wavetable 91"/>
+        <Value Number="98" Name="User Wavetable 92"/>
+        <Value Number="99" Name="User Wavetable 93"/>
+        <Value Number="100" Name="User Wavetable 94"/>
+        <Value Number="101" Name="User Wavetable 95"/>
+        <Value Number="102" Name="User Wavetable 96"/>
+        <Value Number="103" Name="User Wavetable 97"/>
+        <Value Number="104" Name="User Wavetable 98"/>
+        <Value Number="105" Name="User Wavetable 99"/>
+        <Value Number="106" Name="User Wavetable 100"/>
+        <Value Number="107" Name="User Wavetable 101"/>
+        <Value Number="108" Name="User Wavetable 102"/>
+        <Value Number="109" Name="User Wavetable 103"/>
+        <Value Number="110" Name="User Wavetable 104"/>
+        <Value Number="111" Name="User Wavetable 105"/>
+        <Value Number="112" Name="User Wavetable 106"/>
+        <Value Number="113" Name="User Wavetable 107"/>
+        <Value Number="114" Name="User Wavetable 108"/>
+        <Value Number="115" Name="User Wavetable 109"/>
+        <Value Number="116" Name="User Wavetable 110"/>
+        <Value Number="117" Name="User Wavetable 111"/>
+        <Value Number="118" Name="User Wavetable 112"/>
+        <Value Number="119" Name="User Wavetable 113"/>
+        <Value Number="120" Name="User Wavetable 114"/>
+        <Value Number="121" Name="User Wavetable 115"/>
+        <Value Number="122" Name="User Wavetable 116"/>
+        <Value Number="123" Name="User Wavetable 117"/>
+        <Value Number="124" Name="User Wavetable 118"/>
+        <Value Number="125" Name="-"/>
+        <Value Number="126" Name="-"/>
+        <Value Number="127" Name="-"/>
+    </ValueNameList>
+    <ValueNameList Name="LFOShapes">
+        <Value Number="0" Name="Sine"/>
+        <Value Number="1" Name="Triangle"/>
+        <Value Number="2" Name="Square"/>
+        <Value Number="3" Name="Sawtooth"/>
+        <Value Number="4" Name="Random"/>
+        <Value Number="6" Name="S&H"/>
+    </ValueNameList>
+    <ValueNameList Name="OffOn">
+        <Value Number="0" Name="Off"/>
+        <Value Number="2" Name="On"/>
+    </ValueNameList>
+    <ValueNameList Name="Octaves">
+        <Value Number="16" Name="128'"/>
+        <Value Number="28" Name="64'"/>
+        <Value Number="40" Name="32'"/>
+        <Value Number="52" Name="16'"/>
+        <Value Number="64" Name="8'"/>
+        <Value Number="76" Name="4'"/>
+        <Value Number="88" Name="2'"/>
+        <Value Number="100" Name="1'"/>
+        <Value Number="112" Name="1/2'"/>
+    </ValueNameList>
+    <ValueNameList Name="Semitones">
+        <Value Number="52" Name="-12"/>
+        <Value Number="53" Name="-11"/>
+        <Value Number="54" Name="-10"/>
+        <Value Number="55" Name="-9"/>
+        <Value Number="56" Name="-8"/>
+        <Value Number="57" Name="-7"/>
+        <Value Number="58" Name="-6"/>
+        <Value Number="59" Name="-5"/>
+        <Value Number="60" Name="-4"/>
+        <Value Number="61" Name="-3"/>
+        <Value Number="62" Name="-2"/>
+        <Value Number="63" Name="-1"/>
+        <Value Number="64" Name="0"/>
+        <Value Number="65" Name="+1"/>
+        <Value Number="66" Name="+2"/>
+        <Value Number="67" Name="+3"/>
+        <Value Number="68" Name="+4"/>
+        <Value Number="69" Name="+5"/>
+        <Value Number="70" Name="+6"/>
+        <Value Number="71" Name="+7"/>
+        <Value Number="72" Name="+8"/>
+        <Value Number="73" Name="+9"/>
+        <Value Number="74" Name="+10"/>
+        <Value Number="75" Name="+11"/>
+        <Value Number="76" Name="+12"/>
+    </ValueNameList>
+    <ValueNameList Name="Balances">
+        <Value Number="0" Name="F1 64"/>
+        <Value Number="1" Name="F1 63"/>
+        <Value Number="2" Name="F1 62"/>
+        <Value Number="3" Name="F1 61"/>
+        <Value Number="4" Name="F1 60"/>
+        <Value Number="5" Name="F1 59"/>
+        <Value Number="6" Name="F1 58"/>
+        <Value Number="7" Name="F1 57"/>
+        <Value Number="8" Name="F1 56"/>
+        <Value Number="9" Name="F1 55"/>
+        <Value Number="10" Name="F1 54"/>
+        <Value Number="11" Name="F1 53"/>
+        <Value Number="12" Name="F1 52"/>
+        <Value Number="13" Name="F1 51"/>
+        <Value Number="14" Name="F1 50"/>
+        <Value Number="15" Name="F1 49"/>
+        <Value Number="16" Name="F1 48"/>
+        <Value Number="17" Name="F1 47"/>
+        <Value Number="18" Name="F1 46"/>
+        <Value Number="19" Name="F1 45"/>
+        <Value Number="20" Name="F1 44"/>
+        <Value Number="21" Name="F1 43"/>
+        <Value Number="22" Name="F1 42"/>
+        <Value Number="23" Name="F1 41"/>
+        <Value Number="24" Name="F1 40"/>
+        <Value Number="25" Name="F1 39"/>
+        <Value Number="26" Name="F1 38"/>
+        <Value Number="27" Name="F1 37"/>
+        <Value Number="28" Name="F1 36"/>
+        <Value Number="29" Name="F1 35"/>
+        <Value Number="30" Name="F1 34"/>
+        <Value Number="31" Name="F1 33"/>
+        <Value Number="32" Name="F1 32"/>
+        <Value Number="33" Name="F1 31"/>
+        <Value Number="34" Name="F1 30"/>
+        <Value Number="35" Name="F1 29"/>
+        <Value Number="36" Name="F1 28"/>
+        <Value Number="37" Name="F1 27"/>
+        <Value Number="38" Name="F1 26"/>
+        <Value Number="39" Name="F1 25"/>
+        <Value Number="40" Name="F1 24"/>
+        <Value Number="41" Name="F1 23"/>
+        <Value Number="42" Name="F1 22"/>
+        <Value Number="43" Name="F1 21"/>
+        <Value Number="44" Name="F1 20"/>
+        <Value Number="45" Name="F1 19"/>
+        <Value Number="46" Name="F1 18"/>
+        <Value Number="47" Name="F1 17"/>
+        <Value Number="48" Name="F1 16"/>
+        <Value Number="49" Name="F1 15"/>
+        <Value Number="50" Name="F1 14"/>
+        <Value Number="51" Name="F1 13"/>
+        <Value Number="52" Name="F1 12"/>
+        <Value Number="53" Name="F1 11"/>
+        <Value Number="54" Name="F1 10"/>
+        <Value Number="55" Name="F1 9"/>
+        <Value Number="56" Name="F1 8"/>
+        <Value Number="57" Name="F1 7"/>
+        <Value Number="58" Name="F1 6"/>
+        <Value Number="59" Name="F1 5"/>
+        <Value Number="60" Name="F1 4"/>
+        <Value Number="61" Name="F1 3"/>
+        <Value Number="62" Name="F1 2"/>
+        <Value Number="63" Name="F1 1"/>
+        <Value Number="64" Name="middle"/>
+        <Value Number="65" Name="F2 1"/>
+        <Value Number="66" Name="F2 2"/>
+        <Value Number="67" Name="F2 3"/>
+        <Value Number="68" Name="F2 4"/>
+        <Value Number="69" Name="F2 5"/>
+        <Value Number="70" Name="F2 6"/>
+        <Value Number="71" Name="F2 7"/>
+        <Value Number="72" Name="F2 8"/>
+        <Value Number="73" Name="F2 9"/>
+        <Value Number="74" Name="F2 10"/>
+        <Value Number="75" Name="F2 11"/>
+        <Value Number="76" Name="F2 12"/>
+        <Value Number="77" Name="F2 13"/>
+        <Value Number="78" Name="F2 14"/>
+        <Value Number="79" Name="F2 15"/>
+        <Value Number="80" Name="F2 16"/>
+        <Value Number="81" Name="F2 17"/>
+        <Value Number="82" Name="F2 18"/>
+        <Value Number="83" Name="F2 19"/>
+        <Value Number="84" Name="F2 20"/>
+        <Value Number="85" Name="F2 21"/>
+        <Value Number="86" Name="F2 22"/>
+        <Value Number="87" Name="F2 23"/>
+        <Value Number="88" Name="F2 24"/>
+        <Value Number="89" Name="F2 25"/>
+        <Value Number="90" Name="F2 26"/>
+        <Value Number="91" Name="F2 27"/>
+        <Value Number="92" Name="F2 28"/>
+        <Value Number="93" Name="F2 29"/>
+        <Value Number="94" Name="F2 30"/>
+        <Value Number="95" Name="F2 31"/>
+        <Value Number="96" Name="F2 32"/>
+        <Value Number="97" Name="F2 33"/>
+        <Value Number="98" Name="F2 34"/>
+        <Value Number="99" Name="F2 35"/>
+        <Value Number="100" Name="F2 36"/>
+        <Value Number="101" Name="F2 37"/>
+        <Value Number="102" Name="F2 38"/>
+        <Value Number="103" Name="F2 39"/>
+        <Value Number="104" Name="F2 40"/>
+        <Value Number="105" Name="F2 41"/>
+        <Value Number="106" Name="F2 42"/>
+        <Value Number="107" Name="F2 43"/>
+        <Value Number="108" Name="F2 44"/>
+        <Value Number="109" Name="F2 45"/>
+        <Value Number="110" Name="F2 46"/>
+        <Value Number="111" Name="F2 47"/>
+        <Value Number="112" Name="F2 48"/>
+        <Value Number="113" Name="F2 49"/>
+        <Value Number="114" Name="F2 50"/>
+        <Value Number="115" Name="F2 51"/>
+        <Value Number="116" Name="F2 52"/>
+        <Value Number="117" Name="F2 53"/>
+        <Value Number="118" Name="F2 54"/>
+        <Value Number="119" Name="F2 55"/>
+        <Value Number="120" Name="F2 56"/>
+        <Value Number="121" Name="F2 57"/>
+        <Value Number="122" Name="F2 58"/>
+        <Value Number="123" Name="F2 59"/>
+        <Value Number="124" Name="F2 60"/>
+        <Value Number="125" Name="F2 61"/>
+        <Value Number="126" Name="F2 62"/>
+        <Value Number="127" Name="F2 63"/>
+    </ValueNameList>
+    <ValueNameList Name="FilterTypes">
+        <Value Number="0" Name="Bypass"/>
+        <Value Number="1" Name="Low Pass 24dB"/>
+        <Value Number="2" Name="Low Pass 12dB"/>
+        <Value Number="3" Name="Band Pass 24dB"/>
+        <Value Number="4" Name="Band Pass 12dB"/>
+        <Value Number="5" Name="High Pass 24dB"/>
+        <Value Number="6" Name="High Pass 12dB"/>
+        <Value Number="7" Name="Notch 24dB"/>
+        <Value Number="8" Name="Notch 12dB"/>
+        <Value Number="9" Name="Comb+"/>
+        <Value Number="10" Name="Comb-"/>
+        <Value Number="12" Name="PPG Low Pass"/>
+    </ValueNameList>
+    <ControlNameList Name="Controls">
+        <Control Type="7bit" Number="1" Name="Modulation Wheel"/>
+        <Control Type="7bit" Number="2" Name="Breath Control"/>
+        <Control Type="7bit" Number="4" Name="Foot Control"/>
+        <Control Type="7bit" Number="5" Name="Glide Rate"/>
+        <Control Type="7bit" Number="7" Name="Channel Volume"/>
+        <Control Type="7bit" Number="8" Name="Balance"/>
+        <Control Type="7bit" Number="10" Name="Pan"/>
+        <Control Type="7bit" Number="11" Name="Expression"/>
+        <Control Type="7bit" Number="12" Name="Arp Range">
+            <Values Min="0" Max="127">
+                <ValueNameList>
+                    <Value Number="0" Name="1 Octave"/>
+                    <Value Number="1" Name="2 Octaves"/>
+                    <Value Number="2" Name="3 Octaves"/>
+                    <Value Number="3" Name="4 Octaves"/>
+                    <Value Number="4" Name="5 Octaves"/>
+                    <Value Number="5" Name="6 Octaves"/>
+                    <Value Number="6" Name="7 Octaves"/>
+                    <Value Number="7" Name="8 Octaves"/>
+                    <Value Number="8" Name="9 Octaves"/>
+                    <Value Number="10" Name="10 Octaves"/>
+                </ValueNameList>
+            </Values>
+        </Control>
+        <Control Type="7bit" Number="13" Name="Arp Length">
+            <Values Min="0" Max="127">
+                <ValueNameList>
+                    <Value Number="0" Name="1 step"/>
+                    <Value Number="1" Name="2 steps"/>
+                    <Value Number="2" Name="3 steps"/>
+                    <Value Number="3" Name="4 steps"/>
+                    <Value Number="4" Name="5 steps"/>
+                    <Value Number="5" Name="6 steps"/>
+                    <Value Number="6" Name="7 steps"/>
+                    <Value Number="7" Name="8 steps"/>
+                    <Value Number="8" Name="9 steps"/>
+                    <Value Number="9" Name="10 steps"/>
+                    <Value Number="10" Name="11 steps"/>
+                    <Value Number="11" Name="12 steps"/>
+                    <Value Number="12" Name="13 steps"/>
+                    <Value Number="13" Name="14 steps"/>
+                    <Value Number="14" Name="15 steps"/>
+                    <Value Number="16" Name="16 steps"/>
+                </ValueNameList>
+            </Values>
+        </Control>
+        <Control Type="7bit" Number="14" Name="Arp Active">
+            <Values Min="0" Max="127">
+                <ValueNameList>
+                    <Value Number="0" Name="Off"/>
+                    <Value Number="1" Name="On"/>
+                    <Value Number="2" Name="One shot"/>
+                    <Value Number="4" Name="Hold"/>
+                </ValueNameList>
+            </Values>
+        </Control>
+        <Control Type="7bit" Number="15" Name="LFO 1 Shape">
+            <Values Min="0" Max="6">
+                <UsesValueNameList Name="LFOShapes"/>
+            </Values>
+        </Control>
+        <Control Type="7bit" Number="16" Name="LFO 1 Speed"/>
+        <Control Type="7bit" Number="17" Name="LFO 1 Sync">
+            <Values Min="0" Max="2">
+                <UsesValueNameList Name="OffOn"/>
+            </Values>
+        </Control>
+        <Control Type="7bit" Number="18" Name="LFO 1 Delay"/>
+        <Control Type="7bit" Number="19" Name="LFO 2 Shape">
+            <Values Min="0" Max="6">
+                <UsesValueNameList Name="LFOShapes"/>
+            </Values>
+        </Control>
+        <Control Type="7bit" Number="20" Name="LFO 2 Speed"/>
+        <Control Type="7bit" Number="21" Name="LFO 2 Sync">
+            <Values Min="0" Max="2">
+                <UsesValueNameList Name="OffOn"/>
+            </Values>
+        </Control>
+        <Control Type="7bit" Number="22" Name="LFO 2 Delay"/>
+        <Control Type="7bit" Number="23" Name="LFO 3 Shape">
+            <Values Min="0" Max="6">
+                <UsesValueNameList Name="LFOShapes"/>
+            </Values>
+        </Control>
+        <Control Type="7bit" Number="24" Name="LFO 3 Speed"/>
+        <Control Type="7bit" Number="25" Name="LFO 3 Sync">
+            <Values Min="0" Max="2">
+                <UsesValueNameList Name="OffOn"/>
+            </Values>
+        </Control>
+        <Control Type="7bit" Number="26" Name="LFO 3 Delay"/>
+        <Control Type="7bit" Number="27" Name="OSC 1 Octave">
+            <Values Min="16" Max="112">
+                <UsesValueNameList Name="Octaves"/>
+            </Values>
+        </Control>
+        <Control Type="7bit" Number="28" Name="OSC 1 Semitone">
+            <Values Min="52" Max="76">
+                <UsesValueNameList Name="Semitones"/>
+            </Values>
+        </Control>
+        <Control Type="7bit" Number="29" Name="OSC 1 Detune">
+            <Values Min="0" Max="127">
+                <UsesValueNameList Name="Minus64Plus63"/>
+            </Values>
+        </Control>
+        <Control Type="7bit" Number="30" Name="OSC 1 FM"/>
+        <Control Type="7bit" Number="31" Name="OSC 1 Shape">
+            <Values Min="0" Max="127">
+                <UsesValueNameList Name="OscShapes"/>
+            </Values>
+        </Control>
+        <Control Type="7bit" Number="32" Name="Bank Select LSB"/>
+        <Control Type="7bit" Number="33" Name="OSC 1 PW"/>
+        <Control Type="7bit" Number="34" Name="OSC 1 PWM">
+            <Values Min="0" Max="127">
+                <UsesValueNameList Name="Minus64Plus63"/>
+            </Values>
+        </Control>
+        <Control Type="7bit" Number="35" Name="OSC 2 Octave">
+            <Values Min="16" Max="112">
+                <UsesValueNameList Name="Octaves"/>
+            </Values>
+        </Control>
+        <Control Type="7bit" Number="36" Name="OSC 2 Semitone">
+            <Values Min="52" Max="76">
+                <UsesValueNameList Name="Semitones"/>
+            </Values>
+        </Control>
+        <Control Type="7bit" Number="37" Name="OSC 2 Detune">
+            <Values Min="0" Max="127">
+                <UsesValueNameList Name="Minus64Plus63"/>
+            </Values>
+        </Control>
+        <Control Type="7bit" Number="38" Name="OSC 2 FM"/>
+        <Control Type="7bit" Number="39" Name="OSC 2 Shape">
+            <Values Min="0" Max="127">
+                <UsesValueNameList Name="OscShapes"/>
+            </Values>
+        </Control>
+        <Control Type="7bit" Number="40" Name="OSC 2 PW"/>
+        <Control Type="7bit" Number="41" Name="OSC 2 PWM">
+            <Values Min="0" Max="127">
+                <UsesValueNameList Name="Minus64Plus63"/>
+            </Values>
+        </Control>
+        <Control Type="7bit" Number="42" Name="OSC 3 Octave">
+            <Values Min="16" Max="112">
+                <UsesValueNameList Name="Octaves"/>
+            </Values>
+        </Control>
+        <Control Type="7bit" Number="43" Name="OSC 3 Semitone">
+            <Values Min="52" Max="76">
+                <UsesValueNameList Name="Semitones"/>
+            </Values>
+        </Control>
+        <Control Type="7bit" Number="44" Name="OSC 3 Detune">
+            <Values Min="0" Max="127">
+                <UsesValueNameList Name="Minus64Plus63"/>
+            </Values>
+        </Control>
+        <Control Type="7bit" Number="45" Name="OSC 3 FM"/>
+        <Control Type="7bit" Number="46" Name="OSC 3 Shape">
+            <Values Min="0" Max="127">
+                <UsesValueNameList Name="OscShapes"/>
+            </Values>
+        </Control>
+        <Control Type="7bit" Number="47" Name="OSC 3 PW"/>
+        <Control Type="7bit" Number="48" Name="OSC 3 PWM">
+            <Values Min="0" Max="127">
+                <UsesValueNameList Name="Minus64Plus63"/>
+            </Values>
+        </Control>
+        <Control Type="7bit" Number="49" Name="Sync">
+            <Values Min="0" Max="2">
+                <UsesValueNameList Name="OffOn"/>
+            </Values>
+        </Control>
+        <Control Type="7bit" Number="50" Name="Pitchmod"/>
+        <Control Type="7bit" Number="51" Name="Glide Mode">
+            <Values Min="0" Max="4">
+                <ValueNameList>
+                    <Value Number="0" Name="Portamento"/>
+                    <Value Number="1" Name="Fingered Portamento"/>
+                    <Value Number="2" Name="Glissando"/>
+                    <Value Number="4" Name="Fingered Glissando"/>
+                </ValueNameList>
+            </Values>
+        </Control>
+        <Control Type="7bit" Number="52" Name="OSC 1 Level"/>
+        <Control Type="7bit" Number="53" Name="OSC 1 Balance">
+            <Values Min="0" Max="127">
+                <UsesValueNameList Name="Balances"/>
+            </Values>
+        </Control>
+        <Control Type="7bit" Number="54" Name="Ringmod Level"/>
+        <Control Type="7bit" Number="55" Name="Ringmod Balance">
+            <Values Min="0" Max="127">
+                <UsesValueNameList Name="Balances"/>
+            </Values>
+        </Control>
+        <Control Type="7bit" Number="56" Name="OSC 2 Level"/>
+        <Control Type="7bit" Number="57" Name="OSC 2 Balance">
+            <Values Min="0" Max="127">
+                <UsesValueNameList Name="Balances"/>
+            </Values>
+        </Control>
+        <Control Type="7bit" Number="58" Name="OSC 3 Level"/>
+        <Control Type="7bit" Number="59" Name="OSC 3 Balance">
+            <Values Min="0" Max="127">
+                <UsesValueNameList Name="Balances"/>
+            </Values>
+        </Control>
+        <Control Type="7bit" Number="60" Name="Noise Level"/>
+        <Control Type="7bit" Number="61" Name="Noise Balance">
+            <Values Min="0" Max="127">
+                <UsesValueNameList Name="Balances"/>
+            </Values>
+        </Control>
+        <Control Type="7bit" Number="62" Name="Noise Colour"/>
+        <Control Type="7bit" Number="64" Name="Sustain Pedal"/>
+        <Control Type="7bit" Number="65" Name="Glide Active">
+            <Values Min="0" Max="2">
+                <UsesValueNameList Name="OffOn"/>
+            </Values>
+        </Control>
+        <Control Type="7bit" Number="66" Name="Sostenuto">
+            <Values Min="0" Max="2">
+                <UsesValueNameList Name="OffOn"/>
+            </Values>
+        </Control>
+        <Control Type="7bit" Number="67" Name="Routing">
+            <Values Min="0" Max="2">
+                <ValueNameList>
+                    <Value Number="0" Name="serial"/>
+                    <Value Number="2" Name="parallel"/>
+                </ValueNameList>
+            </Values>
+        </Control>
+        <Control Type="7bit" Number="68" Name="Filter 1 Type">
+            <Values Min="0" Max="127">
+                <UsesValueNameList Name="FilterTypes"/>
+            </Values>
+        </Control>
+        <Control Type="7bit" Number="69" Name="Filter 1 Cutoff"/>
+        <Control Type="7bit" Number="70" Name="Filter 1 Resonance"/>
+        <Control Type="7bit" Number="71" Name="Filter 1 Drive"/>
+        <Control Type="7bit" Number="72" Name="Filter 1 Keytrack"/>
+        <Control Type="7bit" Number="73" Name="Filter 1 Env. Amount"/>
+        <Control Type="7bit" Number="74" Name="Filter 1 Env. Velocity"/>
+        <Control Type="7bit" Number="75" Name="Filter 1 CutoffMod"/>
+        <Control Type="7bit" Number="76" Name="Filter 1 FM"/>
+        <Control Type="7bit" Number="77" Name="Filter 1 Pan"/>
+        <Control Type="7bit" Number="78" Name="Filter 1 Panmod"/>
+        <Control Type="7bit" Number="79" Name="Filter 2 Type">
+            <Values Min="0" Max="12">
+                <UsesValueNameList Name="FilterTypes"/>
+            </Values>
+        </Control>
+        <Control Type="7bit" Number="80" Name="Filter 2 Cutoff"/>
+        <Control Type="7bit" Number="81" Name="Filter 2 Resonance"/>
+        <Control Type="7bit" Number="82" Name="Filter 2 Drive"/>
+        <Control Type="7bit" Number="83" Name="Filter 2 Keytrack"/>
+        <Control Type="7bit" Number="84" Name="Filter 2 Env. Amount"/>
+        <Control Type="7bit" Number="85" Name="Filter 2 Env. Velocity"/>
+        <Control Type="7bit" Number="86" Name="Filter 2 CutoffMod"/>
+        <Control Type="7bit" Number="87" Name="Filter 2 FM"/>
+        <Control Type="7bit" Number="88" Name="Filter 2 Pan"/>
+        <Control Type="7bit" Number="89" Name="Filter 2 Panmod"/>
+        <Control Type="7bit" Number="90" Name="Amp Volume"/>
+        <Control Type="7bit" Number="91" Name="Amp Velocity"/>
+        <Control Type="7bit" Number="92" Name="Amp Mod"/>
+        <Control Type="7bit" Number="93" Name="FX 1 Mix"/>
+        <Control Type="7bit" Number="94" Name="FX 2 Mix"/>
+        <Control Type="7bit" Number="95" Name="Filter Env. Attack"/>
+        <Control Type="7bit" Number="96" Name="Filter Env. Decay"/>
+        <Control Type="7bit" Number="97" Name="Filter Env. Sustain"/>
+        <Control Type="7bit" Number="98" Name="Filter Env. Decay 2"/>
+        <Control Type="7bit" Number="99" Name="Filter Env. Sustain 2"/>
+        <Control Type="7bit" Number="100" Name="Filter Env. Release"/>
+        <Control Type="7bit" Number="101" Name="Amp Env. Attack"/>
+        <Control Type="7bit" Number="102" Name="Amp Env. Decay"/>
+        <Control Type="7bit" Number="103" Name="Amp Env. Sustain"/>
+        <Control Type="7bit" Number="104" Name="Amp Env. Decay 2"/>
+        <Control Type="7bit" Number="105" Name="Amp Env. Sustain 2"/>
+        <Control Type="7bit" Number="106" Name="Amp Env. Release"/>
+        <Control Type="7bit" Number="107" Name="Env. 3 Attack"/>
+        <Control Type="7bit" Number="108" Name="Env. 3 Decay"/>
+        <Control Type="7bit" Number="109" Name="Env. 3 Sustain"/>
+        <Control Type="7bit" Number="110" Name="Env. 3 Decay 2"/>
+        <Control Type="7bit" Number="111" Name="Env. 3 Sustain 2"/>
+        <Control Type="7bit" Number="112" Name="Env. 3 Release"/>
+        <Control Type="7bit" Number="113" Name="Env. 4 Attack"/>
+        <Control Type="7bit" Number="114" Name="Env. 4 Decay"/>
+        <Control Type="7bit" Number="115" Name="Env. 4 Sustain"/>
+        <Control Type="7bit" Number="116" Name="Env. 4 Decay 2"/>
+        <Control Type="7bit" Number="117" Name="Env. 4 Sustain 2"/>
+        <Control Type="7bit" Number="118" Name="Env. 4 Release"/>
+        <Control Type="7bit" Number="121" Name="Reset All Controllers"/>
+        <Control Type="7bit" Number="122" Name="Local Control">
+            <Values Min="0" Max="2">
+                <UsesValueNameList Name="OffOn"/>
+            </Values>
+        </Control>
+        <Control Type="7bit" Number="124" Name="Omni Mode Off"/>
+        <Control Type="7bit" Number="125" Name="Omni Mode On"/>
+        <Control Type="7bit" Number="126" Name="Poly Mode On/Off"/>
+        <Control Type="7bit" Number="127" Name="Poly Mode On"/>
+    </ControlNameList>
   </MasterDeviceNames>
 </MIDINameDocument>
diff --git a/scripts/HiAndLowPass.lua b/scripts/HiAndLowPass.lua
new file mode 100644
index 0000000..5dd3dfa
--- /dev/null
+++ b/scripts/HiAndLowPass.lua
@@ -0,0 +1,396 @@
+ardour {
+	["type"]    = "dsp",
+	name        = "a-High/Low Pass Filter",
+	category    = "Filter",
+	license     = "GPLv2",
+	author      = "Ardour Team",
+	description = [[High and Low Pass Filter with de-zipped controls, written in Ardour-Lua]]
+}
+
+function dsp_ioconfig ()
+	return
+	{
+		-- allow any number of I/O as long as port-count matches
+		{ audio_in = -1, audio_out = -1},
+	}
+end
+
+
+function dsp_params ()
+	return
+	{
+		{ ["type"] = "input", name = "High Pass Steepness", min = 0, max = 4, default = 1, enum = true, scalepoints =
+			{
+				["Off"] = 0,
+				["12dB/oct"] = 1,
+				["24dB/oct"] = 2,
+				["36dB/oct"] = 3,
+				["48dB/oct"] = 4,
+			}
+		},
+		{ ["type"] = "input", name = "High Pass Cut off frequency", min =   5, max = 20000, default = 100, unit="Hz", logarithmic = true },
+		{ ["type"] = "input", name = "High Pass Resonance",         min = 0.1, max = 6,     default = .707, logarithmic = true },
+
+		{ ["type"] = "input", name = "Low Pass Steepness", min = 0, max = 4, default = 1, enum = true, scalepoints =
+			{
+				["Off"] = 0,
+				["12dB/oct"] = 1,
+				["24dB/oct"] = 2,
+				["36dB/oct"] = 3,
+				["48dB/oct"] = 4,
+			}
+		},
+		{ ["type"] = "input", name = "Low Pass Cut off frequency",  min =  20, max = 20000, default = 18000, unit="Hz", logarithmic = true },
+		{ ["type"] = "input", name = "Low Pass Resonance",          min = 0.1, max = 6,     default = .707, logarithmic = true },
+	}
+end
+
+-- these globals are *not* shared between DSP and UI
+local hp = {}  -- the biquad high-pass filter instances (DSP)
+local lp = {}  -- the biquad high-pass filter instances (DSP)
+local filt = nil -- the biquad filter instance (GUI, response)
+local cur = {0, 0, 0, 0, 0, 0} -- current parameters
+local lpf = 0.03 -- parameter low-pass filter time-constant
+local chn = 0 -- channel/filter count
+local lpf_chunk = 0 -- chunk size for audio processing when interpolating parameters
+local max_freq = 20000
+
+local mem = nil -- memory x-fade buffer
+
+function dsp_init (rate)
+	-- allocate some mix-buffer
+	mem = ARDOUR.DSP.DspShm (8192)
+
+	-- max allowed cut-off frequency
+	max_freq = .499 * rate
+
+	-- create a table of objects to share with the GUI
+	local tbl = {}
+	tbl['samplerate'] = rate
+	tbl['max_freq'] = max_freq
+	self:table ():set (tbl)
+
+
+	-- Parameter smoothing: we want to filter out parameter changes that are
+	-- faster than 15Hz, and interpolate between parameter values.
+	-- For performance reasons, we want to ensure that two consecutive values
+	-- of the interpolated "steepness" are less that 1 apart. By choosing the
+	-- interpolation chunk size to be 64 in most cases, but 32 if the rate is
+	-- strictly less than 22kHz (there's only 8kHz in standard rates), we can
+	-- ensure that steepness interpolation will never change the parameter by
+	-- more than ~0.86.
+	lpf_chunk = 64
+	if rate < 22000 then lpf_chunk = 32 end
+	-- We apply a discrete version of the standard RC low-pass, with a cutoff
+	-- frequency of 15Hz. For more information about the underlying math, see
+	-- https://en.wikipedia.org/wiki/Low-pass_filter#Discrete-time_realization
+	-- (here Δt is lpf_chunk / rate)
+	local R = 2 * math.pi * lpf_chunk * 15 -- Hz
+	lpf = R / (R + rate)
+end
+
+function dsp_configure (ins, outs)
+	assert (ins:n_audio () == outs:n_audio ())
+	local tbl = self:table ():get () -- get shared memory table
+
+	chn = ins:n_audio ()
+	cur = {0, 0, 0, 0, 0, 0}
+
+	hp = {}
+	lp = {}
+
+	collectgarbage ()
+
+	for c = 1, chn do
+		hp[c] = {}
+		lp[c] = {}
+		-- initialize filters
+		-- http://manual.ardour.org/lua-scripting/class_reference/#ARDOUR:DSP:Biquad
+
+		-- A different Biquad is needed for each pass and channel because they
+		-- remember the last two samples seen during the last call of Biquad:run().
+		-- For continuity these have to come from the previous audio chunk of the
+		-- same channel and pass and would be clobbered if the same Biquad was
+		-- called several times by cycle.
+		for k = 1,4 do
+			hp[c][k] = ARDOUR.DSP.Biquad (tbl['samplerate'])
+			lp[c][k] = ARDOUR.DSP.Biquad (tbl['samplerate'])
+		end
+	end
+end
+
+function santize_params (ctrl)
+	-- don't allow manual cross-fades. enforce enums
+	ctrl[1] = math.floor(ctrl[1] + .5)
+	ctrl[4] = math.floor(ctrl[4] + .5)
+
+	-- high pass, clamp range
+	ctrl[2] = math.min (max_freq, math.max (5, ctrl[2]))
+	ctrl[3] = math.min (6, math.max (0.1, ctrl[3]))
+
+	-- low pass, clamp range
+	ctrl[5] = math.min (max_freq, math.max (20, ctrl[5]))
+	ctrl[6] = math.min (6, math.max (0.1, ctrl[6]))
+	return ctrl
+end
+
+-- helper functions for parameter interpolation
+function param_changed (ctrl)
+	for p = 1,6 do
+		if ctrl[p] ~= cur[p] then
+			return true
+		end
+	end
+	return false
+end
+
+function low_pass_filter_param (old, new, limit)
+	if math.abs (old - new) < limit  then
+		return new
+	else
+		return old + lpf * (new - old)
+	end
+end
+
+-- apply parameters, re-compute filter coefficients if needed
+function apply_params (ctrl)
+	if not param_changed (ctrl) then
+		return
+	end
+
+	-- low-pass filter ctrl parameter values, smooth transition
+	cur[1] = low_pass_filter_param (cur[1], ctrl[1], 0.05) -- HP order x-fade
+	cur[2] = low_pass_filter_param (cur[2], ctrl[2], 1.0)  -- HP freq/Hz
+	cur[3] = low_pass_filter_param (cur[3], ctrl[3], 0.01) -- HP quality
+	cur[4] = low_pass_filter_param (cur[4], ctrl[4], 0.05) -- LP order x-fade
+	cur[5] = low_pass_filter_param (cur[5], ctrl[5], 1.0)  -- LP freq/Hz
+	cur[6] = low_pass_filter_param (cur[6], ctrl[6], 0.01) -- LP quality
+
+	for c = 1, chn do
+		for k = 1,4 do
+			hp[c][k]:compute (ARDOUR.DSP.BiquadType.HighPass, cur[2], cur[3], 0)
+			lp[c][k]:compute (ARDOUR.DSP.BiquadType.LowPass,  cur[5], cur[6], 0)
+		end
+	end
+end
+
+
+-- the actual DSP callback
+function dsp_run (ins, outs, n_samples)
+	assert (n_samples < 8192)
+	assert (#ins == chn)
+	local ctrl = santize_params (CtrlPorts:array ())
+
+	local changed = false
+	local siz = n_samples
+	local off = 0
+
+	-- if a parameter was changed, process at most lpf_chunk samples
+	-- at a time and interpolate parameters until the current settings
+	-- match the target values
+	if param_changed (ctrl) then
+		changed = true
+		siz = lpf_chunk
+	end
+
+	while n_samples > 0 do
+		if changed then apply_params (ctrl) end
+		if siz > n_samples then siz = n_samples end
+
+		local ho = math.floor(cur[1])
+		local lo = math.floor(cur[4])
+
+		-- process all channels
+		for c = 1, #ins do
+
+			-- High Pass
+			local xfade = cur[1] - ho
+
+			-- prepare scratch memory
+			ARDOUR.DSP.copy_vector (mem:to_float (off), ins[c]:offset (off), siz)
+
+			-- run at least |ho| biquads...
+			for k = 1,ho do
+				hp[c][k]:run (mem:to_float (off), siz)
+			end
+			ARDOUR.DSP.copy_vector (outs[c]:offset (off), mem:to_float (off), siz)
+
+			-- mix the output of |ho| biquads (with weight |1-xfade|)
+			-- with the output of |ho+1| biquads (with weight |xfade|)
+			if xfade > 0 then
+				ARDOUR.DSP.apply_gain_to_buffer (outs[c]:offset (off), siz, 1 - xfade)
+				hp[c][ho+1]:run (mem:to_float (off), siz)
+				ARDOUR.DSP.mix_buffers_with_gain (outs[c]:offset (off), mem:to_float (off), siz, xfade)
+				-- also run the next biquad because it needs to have the correct state
+				-- in case it start affecting the next chunck of output. Higher order
+				-- ones are guaranteed not to be needed for the next run because the
+				-- interpolated order won't increase more than 0.86 in one step thanks
+				-- to the choice of the value of |lpf|.
+				if ho + 2 <= 4 then hp[c][ho+2]:run (mem:to_float (off), siz) end
+			elseif ho + 1 <= 4 then
+				-- run the next biquad in case it is used next chunk
+				hp[c][ho+1]:run (mem:to_float (off), siz)
+			end
+
+			-- Low Pass
+			xfade = cur[4] - lo
+
+			-- prepare scratch memory (from high pass output)
+			ARDOUR.DSP.copy_vector (mem:to_float (off), outs[c]:offset (off), siz)
+
+			-- run at least |lo| biquads...
+			for k = 1,lo do
+				lp[c][k]:run (mem:to_float (off), siz)
+			end
+			ARDOUR.DSP.copy_vector (outs[c]:offset (off), mem:to_float (off), siz)
+
+			-- mix the output of |lo| biquads (with weight |1-xfade|)
+			-- with the output of |lo+1| biquads (with weight |xfade|)
+			if xfade > 0 then
+				ARDOUR.DSP.apply_gain_to_buffer (outs[c]:offset (off), siz, 1 - xfade)
+				lp[c][lo+1]:run (mem:to_float (off), siz)
+				ARDOUR.DSP.mix_buffers_with_gain (outs[c]:offset (off), mem:to_float (off), siz, xfade)
+				-- also run the next biquad in case it start affecting the next
+				-- chunck of output.
+				if lo + 2 <= 4 then lp[c][lo+2]:run (mem:to_float (off), siz) end
+			elseif lo + 1 <= 4 then
+				-- run the next biquad in case it is used next chunk
+				lp[c][lo+1]:run (mem:to_float (off), siz)
+			end
+
+		end
+
+		n_samples = n_samples - siz
+		off = off + siz
+	end
+
+	if changed then
+		-- notify display
+		self:queue_draw ()
+	end
+end
+
+
+-------------------------------------------------------------------------------
+--- inline display
+
+function round (n)
+	return math.floor (n + .5)
+end
+
+function freq_at_x (x, w)
+	-- frequency in Hz at given x-axis pixel
+	return 20 * 1000 ^ (x / w)
+end
+
+function x_at_freq (f, w)
+	-- x-axis pixel for given frequency, power-scale
+	return w * math.log (f / 20.0) / math.log (1000.0)
+end
+
+function db_to_y (db, h)
+	-- y-axis gain mapping
+	if db < -60 then db = -60 end
+	if db >  12 then db =  12 end
+	return -.5 + round (0.2 * h) - h * db / 60
+end
+
+function grid_db (ctx, w, h, db)
+	-- draw horizontal grid line
+	-- note that a cairo pixel at Y spans [Y - 0.5 to Y + 0.5]
+	local y = -.5 + round (db_to_y (db, h))
+	ctx:move_to (0, y)
+	ctx:line_to (w, y)
+	ctx:stroke ()
+end
+
+function grid_freq (ctx, w, h, f)
+	-- draw vertical grid line
+	local x = -.5 + round (x_at_freq (f, w))
+	ctx:move_to (x, 0)
+	ctx:line_to (x, h)
+	ctx:stroke ()
+end
+
+function response (ho, lo, f)
+	-- calculate transfer function response for given
+	-- hi/po pass order at given frequency [Hz]
+	local db = ho * filt['hp']:dB_at_freq (f)
+	return db + lo * filt['lp']:dB_at_freq (f)
+end
+
+function render_inline (ctx, w, max_h)
+	if not filt then
+		local tbl = self:table ():get () -- get shared memory table
+		-- instantiate filter (to calculate the transfer function's response)
+		filt = {}
+		filt['hp'] = ARDOUR.DSP.Biquad (tbl['samplerate'])
+		filt['lp'] = ARDOUR.DSP.Biquad (tbl['samplerate'])
+		max_freq   = tbl['max_freq']
+	end
+
+	local ctrl = santize_params (CtrlPorts:array ())
+	-- set filter coefficients if they have changed
+	if param_changed (ctrl) then
+		for k = 1,6 do cur[k] = ctrl[k] end
+		filt['hp']:compute (ARDOUR.DSP.BiquadType.HighPass, cur[2], cur[3], 0)
+		filt['lp']:compute (ARDOUR.DSP.BiquadType.LowPass,  cur[5], cur[6], 0)
+	end
+
+	-- calc height of inline display
+	local h = 1 | math.ceil (w * 9 / 16) -- use 16:9 aspect, odd number of y pixels
+	if (h > max_h) then h = max_h end -- but at most max-height
+
+	-- ctx is a http://cairographics.org/ context
+	-- http://manual.ardour.org/lua-scripting/class_reference/#Cairo:Context
+
+	-- clear background
+	ctx:rectangle (0, 0, w, h)
+	ctx:set_source_rgba (.2, .2, .2, 1.0)
+	ctx:fill ()
+	ctx:rectangle (0, 0, w, h)
+	ctx:clip ()
+
+	-- set line width: 1px
+	ctx:set_line_width (1.0)
+
+	-- draw grid
+	local dash3 = C.DoubleVector ()
+	local dash2 = C.DoubleVector ()
+	dash2:add ({1, 2})
+	dash3:add ({1, 3})
+	ctx:set_dash (dash2, 2) -- dotted line: 1 pixel 2 space
+	ctx:set_source_rgba (.5, .5, .5, .8)
+	grid_db (ctx, w, h, 0)
+	ctx:set_dash (dash3, 2) -- dashed line: 1 pixel 3 space
+	ctx:set_source_rgba (.5, .5, .5, .5)
+	grid_db (ctx, w, h, -12)
+	grid_db (ctx, w, h, -24)
+	grid_db (ctx, w, h, -36)
+	grid_freq (ctx, w, h, 100)
+	grid_freq (ctx, w, h, 1000)
+	grid_freq (ctx, w, h, 10000)
+	ctx:unset_dash ()
+
+	-- draw transfer function line
+	local ho = math.floor(cur[1])
+	local lo = math.floor(cur[4])
+
+	ctx:set_source_rgba (.8, .8, .8, 1.0)
+	ctx:move_to (-.5, db_to_y (response(ho, lo, freq_at_x (0, w)), h))
+	for x = 1,w do
+		local db = response(ho, lo, freq_at_x (x, w))
+		ctx:line_to (-.5 + x, db_to_y (db, h))
+	end
+	-- stoke a line, keep the path
+	ctx:stroke_preserve ()
+
+	-- fill area to zero under the curve
+	ctx:line_to (w, -.5 + round (db_to_y (0, h)))
+	ctx:line_to (0, -.5 + round (db_to_y (0, h)))
+	ctx:close_path ()
+	ctx:set_source_rgba (.5, .5, .5, .5)
+	ctx:fill ()
+
+	return {w, h}
+end
diff --git a/scripts/_amp1.lua b/scripts/_amp1.lua
new file mode 100644
index 0000000..03be396
--- /dev/null
+++ b/scripts/_amp1.lua
@@ -0,0 +1,47 @@
+ardour {
+	["type"]    = "dsp",
+	name        = "Simple Amp",
+	category    = "Example",
+	license     = "MIT",
+	author      = "Ardour Lua Task Force",
+	description = [[
+	An Example DSP Plugin for processing audio, to
+	be used with Ardour's Lua scripting facility.]]
+}
+
+
+-- return possible i/o configurations
+function dsp_ioconfig ()
+	-- -1, -1 = any number of channels as long as input and output count matches
+	return { [1] = { audio_in = -1, audio_out = -1}, }
+end
+
+-- optional function, called when configuring the plugin
+function dsp_configure (ins, outs)
+	-- store configuration in global variable
+	audio_ins = ins:n_audio();
+	local audio_outs = outs:n_audio()
+	assert (audio_ins == audio_outs)
+end
+
+-- this variant asks for a complete *copy* of the
+-- audio data in a lua-table.
+-- after processing the data is copied back.
+--
+-- this also exemplifies the direct "connect and run" process function,
+-- where the channel-mapping needs to be done in lua.
+
+function dsp_runmap (bufs, in_map, out_map, n_samples, offset)
+	for c = 1,audio_ins do
+		-- Note: lua starts counting at 1, ardour's ChanMapping::get() at 0
+		local ib = in_map:get(ARDOUR.DataType("audio"), c - 1); -- get id of mapped input buffer for given channel
+		local ob = out_map:get(ARDOUR.DataType("audio"), c - 1); -- get id of mapped output buffer for given channel
+		assert (ib ~= ARDOUR.ChanMapping.Invalid);
+		assert (ob ~= ARDOUR.ChanMapping.Invalid);
+		local a = bufs:get_audio (ib):data (offset):get_table(n_samples) -- copy audio-data from input buffer
+		for s = 1,n_samples do
+			a[s] = a[s] * 2; -- amplify data in lua table
+		end
+		bufs:get_audio(ob):data(offset):set_table(a, n_samples) -- copy back
+	end
+end
diff --git a/scripts/_amp2.lua b/scripts/_amp2.lua
new file mode 100644
index 0000000..89d11fc
--- /dev/null
+++ b/scripts/_amp2.lua
@@ -0,0 +1,51 @@
+ardour {
+	["type"]    = "dsp",
+	name        = "Simple Amp II",
+	category    = "Example",
+	license     = "MIT",
+	author      = "Ardour Lua Task Force",
+	description = [[
+	An Example DSP Plugin for processing audio, to
+	be used with Ardour's Lua scripting facility.]]
+}
+
+-- see amp1.lua
+function dsp_ioconfig ()
+	return { [1] = { audio_in = -1, audio_out = -1}, }
+end
+
+function dsp_configure (ins, outs)
+	audio_ins = ins:n_audio();
+	local audio_outs = outs:n_audio()
+	assert (audio_ins == audio_outs)
+end
+
+
+-- this variant modifies the audio data in-place
+-- in Ardour's buffer.
+--
+-- It relies on the fact that by default Ardour requires
+-- plugins to process data in-place (zero copy).
+--
+-- Every assignment directly calls a c-function behind
+-- the scenes to get/set the value.
+-- It's a bit more efficient than "Amp I" on most systems.
+
+function dsp_runmap (bufs, in_map, out_map, n_samples, offset)
+	for c = 1,audio_ins do
+		-- ensure that processing does happen in-place
+		local ib = in_map:get(ARDOUR.DataType("audio"), c - 1); -- get id of mapped input buffer for given cannel
+		local ob = out_map:get(ARDOUR.DataType("audio"), c - 1); -- get id of mapped output buffer for given cannel
+		assert (ib ~= ARDOUR.ChanMapping.Invalid);
+		assert (ob ~= ARDOUR.ChanMapping.Invalid);
+
+		local bi = bufs:get_audio(ib)
+		local bo = bufs:get_audio(ob)
+		assert (bi:sameinstance(bo))
+
+		local a = bufs:get_audio(ib):data(offset):array() -- get a reference (pointer to array)
+		for s = 1,n_samples do
+			a[s] = a[s] * 2; -- modify data in-place (shared with ardour)
+		end
+	end
+end
diff --git a/scripts/_amp3.lua b/scripts/_amp3.lua
new file mode 100644
index 0000000..bb1a589
--- /dev/null
+++ b/scripts/_amp3.lua
@@ -0,0 +1,44 @@
+ardour {
+	["type"]    = "dsp",
+	name        = "Simple Amp III",
+	category    = "Example",
+	license     = "MIT",
+	author      = "Ardour Lua Task Force",
+	description = [[
+	An Example DSP Plugin for processing audio, to
+	be used with Ardour's Lua scripting facility.]]
+}
+
+function dsp_ioconfig ()
+	return
+	{
+		{ audio_in = -1, audio_out = -1},
+	}
+end
+
+
+function dsp_params ()
+	return
+	{
+		{ ["type"] = "input", name = "Gain", min = -20, max = 20, default = 6, unit="dB", scalepoints = { ["0"] = 0, ["twice as loud"] = 6 , ["half as loud"] = -6 } },
+	}
+end
+
+
+-- use ardour's vectorized functions
+--
+-- This is as efficient as Ardour doing it itself in C++
+-- Lua function overhead is negligible
+--
+-- this also exemplifies the /simpler/ way of delegating the
+-- channel-mapping to ardour.
+
+function dsp_run (ins, outs, n_samples)
+	local ctrl = CtrlPorts:array() -- get control port array (read/write)
+	local gain = ARDOUR.DSP.dB_to_coefficient (ctrl[1])
+	assert (#ins == #outs) -- ensure that we can run in-place (channel count matches)
+	for c = 1,#ins do
+		assert (ins[c]:sameinstance(outs[c])) -- check in-place
+		ARDOUR.DSP.apply_gain_to_buffer (ins[c], n_samples, gain); -- process in-place
+	end
+end
diff --git a/scripts/_biquad_filter.lua b/scripts/_biquad_filter.lua
new file mode 100644
index 0000000..c0dec8b
--- /dev/null
+++ b/scripts/_biquad_filter.lua
@@ -0,0 +1,280 @@
+ardour {
+	["type"]    = "dsp",
+	name        = "Biquad Filter",
+	category    = "Filter",
+	license     = "MIT",
+	author      = "Ardour Lua Task Force",
+	description = [[A Versatile Filter Plugin]]
+}
+
+function dsp_ioconfig ()
+	return
+	{
+		-- allow any number of I/O as long as port-count matches
+		{ audio_in = -1, audio_out = -1},
+	}
+end
+
+
+function dsp_params ()
+	return
+	{
+		{ ["type"] = "input", name = "Enable", min = 0, max = 1, default = 1, bypass = true, toggled = true },
+		{ ["type"] = "input", name = "Type", min = 0, max = 4, default = 0, enum = true, scalepoints =
+			{
+				["Peaking"]    = 0,
+				["Low Shelf"]  = 1,
+				["High Shelf"] = 2,
+				["Low Pass"]   = 3,
+				["High Pass"]  = 4,
+			}
+		},
+		{ ["type"] = "input", name = "Gain", min = -20, max = 20,    default = 0,    unit="dB" },
+		{ ["type"] = "input", name = "Freq", min =  20, max = 20000, default = 1000, unit="Hz", logarithmic = true },
+		{ ["type"] = "input", name = "Q",    min = 0.1, max = 8,     default = .707, logarithmic = true },
+	}
+end
+
+-- translate type parameter to DSP enum
+-- http://manual.ardour.org/lua-scripting/class_reference/#ARDOUR.DSP.Biquad.Type
+function map_type (t)
+	if     t == 1 then
+		return ARDOUR.DSP.BiquadType.LowShelf
+	elseif t == 2 then
+		return ARDOUR.DSP.BiquadType.HighShelf
+	elseif t == 3 then
+		return ARDOUR.DSP.BiquadType.LowPass
+	elseif t == 4 then
+		return ARDOUR.DSP.BiquadType.HighPass
+	else
+		return ARDOUR.DSP.BiquadType.Peaking
+	end
+end
+
+function ctrl_data ()
+	local ctrl = CtrlPorts:array ()
+	if ctrl[1] <= 0 then -- when disabled
+		ctrl[3] = 0; -- force gain to 0dB
+	end
+	return ctrl
+end
+
+-- these globals are *not* shared between DSP and UI
+local filters = {}  -- the biquad filter instances (DSP)
+local filt -- the biquad filter instance (GUI, response)
+local cur = {0, 0, 0, 0, 0} -- current parameters
+local lpf = 0.03 -- parameter low-pass filter time-constant
+local chn = 0 -- channel/filter count
+
+function dsp_init (rate)
+	self:shmem ():allocate (1) -- shared mem to tell the GUI the samplerate
+	local cfg = self:shmem ():to_int (0):array ()
+	cfg[1] = rate
+	-- http://manual.ardour.org/lua-scripting/class_reference/#ARDOUR:DSP:Biquad
+	filt = ARDOUR.DSP.Biquad (rate) -- initialize filter
+	lpf = 13000 / rate -- interpolation time constant
+end
+
+function dsp_configure (ins, outs)
+	assert (ins:n_audio () == outs:n_audio ())
+	local cfg = self:shmem ():to_int (0):array ()
+	local rate = cfg[1]
+	chn = ins:n_audio ()
+	for c = 1, chn do
+		filters[c] = ARDOUR.DSP.Biquad (rate) -- initialize filters
+	end
+	cur = {0, 0, 0, 0, 0}
+end
+
+-- helper functions for parameter interpolation
+function param_changed (ctrl)
+	if ctrl[2] == cur[2] and ctrl[3] == cur[3] and ctrl[4] == cur[4] and ctrl[5] == cur[5] then
+		return false
+	end
+	return true
+end
+
+function low_pass_filter_param (old, new, limit)
+	if math.abs (old - new) < limit  then
+		return new
+	else
+		return old + lpf * (new - old)
+	end
+end
+
+-- apply parameters, re-compute filter coefficients if needed
+function apply_params (ctrl)
+	if not param_changed (ctrl) then
+		return
+	end
+
+	if cur[2] ~= ctrl[2] then
+		-- reset filter state when type changes
+		filt:reset ()
+		for k = 2,5 do cur[k] = ctrl[k] end
+	else
+		-- low-pass filter ctrl parameter values, smooth transition
+		cur[3] = low_pass_filter_param (cur[3], ctrl[3], 0.1) -- gain/dB
+		cur[4] = low_pass_filter_param (cur[4], ctrl[4], 1.0) -- freq/Hz
+		cur[5] = low_pass_filter_param (cur[5], ctrl[5], 0.01) -- quality
+	end
+
+	for c = 1, chn do
+		filters[c]:compute (map_type (cur[2]), cur[4], cur[5], cur[3])
+	end
+end
+
+
+-- the actual DSP callback
+function dsp_run (ins, outs, n_samples)
+	local changed = false
+	local siz = n_samples
+	local off = 0
+	local ctrl = ctrl_data ()
+
+	-- if a parameter was changed, process at most 64 samples at a time
+	-- and interpolate parameters until the current settings match
+	-- the target values
+	if param_changed (ctrl) then
+		changed = true
+		siz = 64
+	end
+
+	while n_samples > 0 do
+		if changed then apply_params (ctrl) end
+		if siz > n_samples then siz = n_samples end
+
+		-- process all channels
+		for c = 1,#ins do
+			-- check if output and input buffers for this channel are identical
+			-- http://manual.ardour.org/lua-scripting/class_reference/#C:FloatArray
+			if ins[c]:sameinstance (outs[c]) then
+				filters[c]:run (ins[c]:offset (off), siz) -- in-place processing
+			else
+				-- http://manual.ardour.org/lua-scripting/class_reference/#ARDOUR:DSP
+				ARDOUR.DSP.copy_vector (outs[c]:offset (off), ins[c]:offset (off), siz)
+				filters[c]:run (outs[c]:offset (off), siz)
+			end
+		end
+
+		n_samples = n_samples - siz
+		off = off + siz
+	end
+
+	if changed then
+		-- notify display
+		self:queue_draw ()
+	end
+end
+
+
+-------------------------------------------------------------------------------
+--- inline display
+
+function round (n)
+	return math.floor (n + .5)
+end
+
+function freq_at_x (x, w)
+	-- x-axis pixel for given freq, power-scale
+	return 20 * 1000 ^ (x / w)
+end
+
+function x_at_freq (f, w)
+	-- frequency at given x-axis pixel
+	return w * math.log (f / 20.0) / math.log (1000.0)
+end
+
+function db_to_y (db, h)
+	-- y-axis gain mapping
+	if db < -20 then db = -20 end
+	if db >  20 then db =  20 end
+	return -.5 + 0.5 * h * (1 - db / 20)
+end
+
+function grid_db (ctx, w, h, db)
+	-- draw horizontal grid line
+	local y = -.5 + round (db_to_y (db, h))
+	ctx:move_to (0, y)
+	ctx:line_to (w, y)
+	ctx:stroke ()
+end
+
+function grid_freq (ctx, w, h, f)
+	-- draw vertical grid line
+	local x = -.5 + round (x_at_freq (f, w))
+	ctx:move_to (x, 0)
+	ctx:line_to (x, h)
+	ctx:stroke ()
+end
+
+function render_inline (ctx, w, max_h)
+	if not filt then
+		-- the GUI is separate from the DSP, but the GUI needs to know
+		-- the sample-rate that the DSP is using.
+		local shmem = self:shmem () -- get shared memory region
+		local cfg = shmem:to_int (0):array () -- "cast" into lua-table
+		-- instantiate filter (to calculate the transfer function's response)
+		filt = ARDOUR.DSP.Biquad (cfg[1])
+	end
+
+	-- set filter coefficients if they have changed
+	if param_changed (CtrlPorts:array ()) then
+		local ctrl = ctrl_data ()
+		for k = 2,5 do cur[k] = ctrl[k] end
+		filt:compute (map_type (cur[2]), cur[4], cur[5], cur[3])
+	end
+
+	-- calc height of inline display
+	local h = math.ceil (w * 10 / 16) -- use 16:10 aspect
+	h = 2 * round (h / 2) -- with an even number of vertical pixels
+	if (h > max_h) then h = max_h end -- but at most max-height
+
+	-- ctx is a http://cairographics.org/ context
+	-- http://manual.ardour.org/lua-scripting/class_reference/#Cairo:Context
+
+	-- clear background
+	ctx:rectangle (0, 0, w, h)
+	ctx:set_source_rgba (.2, .2, .2, 1.0)
+	ctx:fill ()
+
+	-- set line width: 1px
+	-- Note: a cairo pixel at [1,1]  spans [0.5->1.5 , 0.5->1.5]
+	-- hence the offset -0.5 in various move_to(), line_to() calls
+	ctx:set_line_width (1.0)
+
+	-- draw grid
+	local dash3 = C.DoubleVector ()
+	dash3:add ({1, 3})
+	ctx:set_dash (dash3, 2) -- dotted line
+	ctx:set_source_rgba (.5, .5, .5, .5)
+	grid_db (ctx, w, h, 0)
+	grid_db (ctx, w, h, 6)
+	grid_db (ctx, w, h, 12)
+	grid_db (ctx, w, h, 18)
+	grid_db (ctx, w, h, -6)
+	grid_db (ctx, w, h, -12)
+	grid_db (ctx, w, h, -18)
+	grid_freq (ctx, w, h, 100)
+	grid_freq (ctx, w, h, 1000)
+	grid_freq (ctx, w, h, 10000)
+	ctx:unset_dash ()
+
+	-- draw transfer function line
+	ctx:set_source_rgba (.8, .8, .8, 1.0)
+	ctx:move_to (-.5, db_to_y (filt:dB_at_freq (freq_at_x (0, w)), h))
+	for x = 1,w do
+		local db = filt:dB_at_freq (freq_at_x (x, w))
+		ctx:line_to (-.5 + x, db_to_y (db, h))
+	end
+	ctx:stroke_preserve ()
+
+	-- fill area to zero under the curve
+	ctx:line_to (w, -.5 + h * .5)
+	ctx:line_to (0, -.5 + h * .5)
+	ctx:close_path ()
+	ctx:set_source_rgba (.5, .5, .5, .5)
+	ctx:fill ()
+
+	return {w, h}
+end
diff --git a/scripts/_hook_test.lua b/scripts/_hook_test.lua
new file mode 100644
index 0000000..fa5a853
--- /dev/null
+++ b/scripts/_hook_test.lua
@@ -0,0 +1,41 @@
+ardour {
+	["type"]    = "EditorHook",
+	name        = "Callback Example",
+	author      = "Ardour Lua Task Force",
+	description = "Rewind On Solo Change, Write a file when regions are moved",
+}
+
+function signals ()
+	s = LuaSignal.Set()
+	--s:add ({[LuaSignal.SoloActive] = true, [LuaSignal.RegionPropertyChanged] = true})
+	s:add (
+		{
+			[LuaSignal.SoloActive] = true,
+			[LuaSignal.RegionPropertyChanged] = true
+		}
+	)
+	--for k,v in pairs (s:table()) do print (k, v) end
+	return s
+end
+
+function factory (params)
+	return function (signal, ref, ...)
+		print (signal, ref, ...)
+
+		if (signal == LuaSignal.SoloActive) then
+			Session:goto_start()
+		end
+
+		if (signal == LuaSignal.RegionPropertyChanged) then
+			obj,pch = ...
+			file = io.open ("/tmp/test" ,"a")
+			io.output (file)
+			io.write (string.format ("Region: '%s' pos-changed: %s, length-changed: %s\n",
+				obj:name (),
+				tostring (pch:containsFramePos (ARDOUR.Properties.Start)),
+				tostring (pch:containsFramePos (ARDOUR.Properties.Length))
+				))
+			io.close (file)
+		end
+	end
+end
diff --git a/scripts/_osc_hook_example.lua b/scripts/_osc_hook_example.lua
new file mode 100644
index 0000000..fdcda4b
--- /dev/null
+++ b/scripts/_osc_hook_example.lua
@@ -0,0 +1,52 @@
+ardour {
+	["type"]    = "EditorHook",
+	name        = "OSC Callback Example",
+	author      = "Ardour Lua Task Force",
+	description = "Send OSC messages",
+}
+
+function action_params ()
+	return
+	{
+		["uri"] = { title = "OSC URI ", default = "osc.udp://localhost:7890"},
+	}
+end
+
+
+function signals ()
+	s = LuaSignal.Set()
+	s:add (
+		{
+			[LuaSignal.SoloActive] = true,
+			[LuaSignal.RegionPropertyChanged] = true,
+			[LuaSignal.Exported] = true,
+			[LuaSignal.TransportStateChange] = true
+		}
+	)
+	return s
+end
+
+function factory (params)
+	return function (signal, ref, ...)
+		local uri = params["unique"] or "osc.udp://localhost:7890"
+		local tx = ARDOUR.LuaOSC.Address (uri)
+		-- debug print (stdout)
+		-- print (signal, ref, ...)
+
+		if (signal == LuaSignal.Exported) then
+			tx:send ("/session/exported", "ss", ...)
+		elseif (signal == LuaSignal.SoloActive) then
+			tx:send ("/session/solo_changed", "")
+		elseif (signal == LuaSignal.TransportStateChange) then
+			tx:send ("/session/transport", "if",
+				Session:transport_frame(), Session:transport_speed())
+		elseif (signal == LuaSignal.RegionPropertyChanged) then
+			obj,pch = ...
+			tx:send ("/region_property_changed", "sTTiii",
+				obj:name (),
+				(pch:containsFramePos (ARDOUR.Properties.Start)),
+				(pch:containsFramePos (ARDOUR.Properties.Length)),
+				obj:position (), obj:start (), obj:length ())
+		end
+	end
+end
diff --git a/scripts/_rawmidi.lua b/scripts/_rawmidi.lua
new file mode 100644
index 0000000..672a37d
--- /dev/null
+++ b/scripts/_rawmidi.lua
@@ -0,0 +1,111 @@
+ardour {
+	["type"]    = "dsp",
+	name        = "Midi Passthru",
+	category    = "Example",
+	license     = "MIT",
+	author      = "Ardour Lua Task Force",
+	description = [[An Example Audio/MIDI Passthrough Plugin using Buffer Pointers]]
+}
+
+-- return possible audio i/o configurations
+function dsp_ioconfig ()
+	-- -1, -1 = any number of channels as long as input and output count matches
+	-- require 1 MIDI in, 1 MIDI out.
+	return { { midi_in = 1, midi_out = 1, audio_in = -1, audio_out = -1}, }
+end
+
+-- "dsp_runmap" uses Ardour's internal processor API, eqivalent to
+-- 'connect_and_run()". There is no overhead (mapping, translating buffers).
+-- The lua implementation is responsible to map all the buffers directly.
+function dsp_runmap (bufs, in_map, out_map, n_samples, offset)
+
+	-- http://manual.ardour.org/lua-scripting/class_reference/#ARDOUR:ChanMapping
+
+	local ib = in_map:get (ARDOUR.DataType ("midi"), 0) -- get index of the 1st mapped midi input buffer
+	assert (ib ~= ARDOUR.ChanMapping.Invalid)
+
+	if ib ~= ARDOUR.ChanMapping.Invalid then
+		-- http://manual.ardour.org/lua-scripting/class_reference/#ARDOUR:MidiBuffer
+		local mb = bufs:get_midi (ib) -- get the mapped buffer
+		local events = mb:table () -- copy event list into a lua table
+
+		-- iterate over all MIDI events
+		for _, e in pairs (events) do
+			-- e is-a http://manual.ardour.org/lua-scripting/class_reference/#Evoral:MidiEvent
+
+			-- do something with the event e.g.
+			print (e:channel (), e:time (), e:size (), e:buffer ():array ()[1], e:buffer ():get_table (e:size ())[1])
+		end
+	end
+
+	----
+	-- The following code is needed with "dsp_runmap" to work for arbitrary pin connections
+	-- this passes though all audio/midi data unprocessed.
+
+	ARDOUR.DSP.process_map (bufs, in_map, out_map, n_samples, offset, ARDOUR.DataType ("audio"))
+	ARDOUR.DSP.process_map (bufs, in_map, out_map, n_samples, offset, ARDOUR.DataType ("midi"))
+
+	-- equivalent lua code.
+	-- NOTE: the lua implementation below is intended for io-config [-1,-1].
+	-- It only works for actually mapped channels due to in_map:count() out_map:count()
+	-- being identical to the i/o pin count in this case.
+	--
+	-- Plugins that have multiple possible configurations will need to implement
+	-- dsp_configure() and remember the actual channel count.
+	--
+	-- ARDOUR.DSP.process_map() does iterate over the mapping itself and works generally.
+	-- Still the lua code below does lend itself as elaborate example.
+	--
+	--[[
+
+	local audio_ins = in_map:count (): n_audio () -- number of mapped audio input buffers
+	local audio_outs = out_map:count (): n_audio () -- number of mapped audio output buffers
+	assert (audio_outs, audio_ins) -- ioconfig [-1, -1]: must match
+
+	-- copy audio data if any
+	for c = 1, audio_ins do
+		local ib = in_map:get (ARDOUR.DataType ("audio"), c - 1) -- get index of mapped input buffer
+		local ob = out_map:get (ARDOUR.DataType ("audio"), c - 1) -- get index of mapped output buffer
+		if ib ~= ARDOUR.ChanMapping.Invalid and ob ~= ARDOUR.ChanMapping.Invalid and ib ~= ob then
+			-- http://manual.ardour.org/lua-scripting/class_reference/#ARDOUR:DSP
+			-- http://manual.ardour.org/lua-scripting/class_reference/#ARDOUR:AudioBuffer
+			ARDOUR.DSP.copy_vector (bufs:get_audio (ob):data (offset), bufs:get_audio (ib):data (offset), n_samples)
+		end
+	end
+	-- Clear unconnected output buffers.
+	-- In case we're processing in-place some buffers may be identical,
+	-- so this must be done *after* copying relvant data from that port.
+	for c = 1, audio_outs do
+		local ib = in_map:get (ARDOUR.DataType ("audio"), c - 1)
+		local ob = out_map:get (ARDOUR.DataType ("audio"), c - 1)
+		if ib == ARDOUR.ChanMapping.Invalid and ob ~= ARDOUR.ChanMapping.Invalid then
+			bufs:get_audio (ob):silence (n_samples, offset)
+		end
+	end
+
+	-- copy midi data
+	local midi_ins = in_map:count (): n_midi () -- number of midi input buffers
+	local midi_outs = out_map:count (): n_midi () -- number of midi input buffers
+
+	-- with midi_in=1, midi_out=1 in dsp_ioconfig
+	-- the following will always be true
+	assert (midi_ins == 1)
+	assert (midi_outs == 1)
+
+	for c = 1, midi_ins do
+		local ib = in_map:get (ARDOUR.DataType ("midi"), c - 1)
+		local ob = out_map:get (ARDOUR.DataType ("midi"), c - 1)
+		if ib ~= ARDOUR.ChanMapping.Invalid and ob ~= ARDOUR.ChanMapping.Invalid and ib ~= ob then
+			bufs:get_midi (ob):copy (bufs:get_midi (ib))
+		end
+	end
+	-- silence unused midi outputs
+	for c = 1, midi_outs do
+		local ib = in_map:get (ARDOUR.DataType ("midi"), c - 1)
+		local ob = out_map:get (ARDOUR.DataType ("midi"), c - 1)
+		if ib == ARDOUR.ChanMapping.Invalid and ob ~= ARDOUR.ChanMapping.Invalid then
+			bufs:get_midi (ob):silence (n_samples, offset)
+		end
+	end
+	--]]
+end
diff --git a/scripts/_session_test.lua b/scripts/_session_test.lua
new file mode 100644
index 0000000..6a4a372
--- /dev/null
+++ b/scripts/_session_test.lua
@@ -0,0 +1,34 @@
+ardour {
+	["type"]    = "session",
+	name        = "Good Night",
+	author      = "Ardour Lua Task Force",
+	description = [[
+	Example Ardour Session Script.
+	Session scripts are called at the beginning of every process-callback (before doing any audio processing).
+	This example stops the transport after rolling for a configurable time which can be set when instantiating the script.]]
+}
+
+function sess_params ()
+	return
+	{
+		["print"]  = { title = "Debug Print (yes/no)", default = "no", optional = true },
+		["time"] = { title = "Timeout (sec)", default = "90", optional = false },
+	}
+end
+
+function factory (params)
+	return function (n_samples)
+		local p = params["print"] or "no"
+		local timeout = params["time"] or 90
+		a = a or 0
+		if p ~= "no" then print (a, n_samples, Session:frame_rate (), Session:transport_rolling ()) end -- debug output (not rt safe)
+		if (not Session:transport_rolling()) then
+			a = 0
+			return
+		end
+		a = a + n_samples
+		if (a > timeout * Session:frame_rate()) then
+			Session:request_transport_speed(0.0, true)
+		end
+	end
+end
diff --git a/scripts/_varispeed_callback.lua b/scripts/_varispeed_callback.lua
new file mode 100644
index 0000000..c61a15d
--- /dev/null
+++ b/scripts/_varispeed_callback.lua
@@ -0,0 +1,32 @@
+ardour {
+	["type"]    = "EditorHook",
+	name        = "Varispeed Test - 100ms Callback",
+	author      = "Ardour Lua Task Force",
+	description = "An example script that invokes a callback a every 0.1sec and modifies the transport speed",
+}
+
+function signals ()
+	s = LuaSignal.Set()
+	s:add (
+		{
+			[LuaSignal.LuaTimerDS] = true,
+		}
+	)
+	return s
+end
+
+function factory (params)
+	-- upindex variables
+	local cnt = 0
+	local speed = 0
+	local delta = 0.01
+	return function (signal, ref, ...)
+		cnt = (cnt + 1) % 5 -- divide clock: every half a second
+		if cnt == 0 then
+			if speed < -0.25 then delta = delta * -1 end
+			if speed >  0.25 then delta = delta * -1 end
+			speed = speed + delta
+			Session:request_transport_speed (speed)
+		end
+	end
+end
diff --git a/scripts/addscopes.lua b/scripts/addscopes.lua
new file mode 100644
index 0000000..d0785dc
--- /dev/null
+++ b/scripts/addscopes.lua
@@ -0,0 +1,57 @@
+ardour {
+	["type"]    = "EditorAction",
+	name        = "Add Scopes",
+	license     = "MIT",
+	author      = "Ardour Team",
+	description = [[Add 'Inline Scope' Lua Processor to all Tracks]]
+}
+
+function action_params ()
+	return
+	{
+		["unique"]   = { title = "Only add Scope if non is present already (yes/no)", default = "yes"},
+		["position"] = { title = "Insert Position from top (0,..)",                   default = "0"},
+	}
+end
+
+
+function factory (params)
+	return function ()
+		-- get configuration
+		local p = params or {}
+		local uniq = p["unique"] or "yes"
+		local pos = p["position"] or 0
+
+		-- loop over all tracks
+		for t in Session:get_tracks():iter() do
+			local insert = true;
+
+			-- check if a scope is already present
+			if uniq ~= "no" then
+				local proc;
+				local i = 0;
+				repeat
+					-- get Nth Ardour::Processor
+					proc = t:nth_plugin (i)
+					-- check if it's a scope
+					if (not proc:isnil() and proc:display_name () == "Inline Scope") then
+						insert = false;
+					end
+					i = i + 1
+				until proc:isnil() or insert == false
+			end
+
+			-- create a new processor and insert it
+			if insert then
+				local a = ARDOUR.LuaAPI.new_luaproc(Session, "Inline Scope");
+				if (not a:isnil()) then
+					t:add_processor_by_index(a, pos, nil, true)
+					ARDOUR.LuaAPI.set_processor_param (a, 0, 5) -- timescale 5sec
+					-- ARDOUR.LuaAPI.set_processor_param (a, 1, 1) -- logscale on
+					-- ARDOUR.LuaAPI.set_processor_param (a, 2, 3) -- "Max" height
+					a = nil -- explicitly drop shared-ptr reference
+				end
+			end
+		end
+	end
+end
diff --git a/scripts/amp4.lua b/scripts/amp4.lua
new file mode 100644
index 0000000..6254082
--- /dev/null
+++ b/scripts/amp4.lua
@@ -0,0 +1,119 @@
+ardour {
+	["type"]    = "dsp",
+	name        = "a-Amplifier",
+	category    = "Amplifier",
+	license     = "MIT",
+	author      = "Ardour Team",
+	description = [[Versatile +/- 20dB multichannel amplifier]]
+}
+
+function dsp_ioconfig ()
+	return
+	{
+		-- -1, -1 = any number of channels as long as input and output count matches
+		{ audio_in = -1, audio_out = -1},
+	}
+end
+
+
+function dsp_params ()
+	return
+	{
+		{ ["type"] = "input", name = "Gain", min = -20, max = 20, default = 0, unit="dB"},
+	}
+end
+
+local lpf = 0.02 -- parameter low-pass filter time-constant
+local cur_gain = 0 -- current smoothed gain (dB)
+
+-- called once when plugin is instantiated
+function dsp_init (rate)
+	lpf = 780 / rate -- interpolation time constant
+end
+
+function low_pass_filter_param (old, new, limit)
+	if math.abs (old - new) < limit  then
+		return new
+	else
+		return old + lpf * (new - old)
+	end
+end
+
+-- the DSP callback function
+-- "ins" and "outs" are http://manual.ardour.org/lua-scripting/class_reference/#C:FloatArray
+function dsp_run (ins, outs, n_samples)
+	local ctrl = CtrlPorts:array() -- get control port array (read/write)
+	local siz = n_samples -- samples remaining to process
+	local off = 0 -- already processed samples
+	local changed = false
+
+	-- if the gain parameter was changed, process at most 32 samples at a time
+	-- and interpolate gain until the current settings match the target values
+	if cur_gain ~= ctrl[1] then
+		changed = true
+		siz = 32
+	end
+
+	while n_samples > 0 do
+		if siz > n_samples then siz = n_samples end -- process at most "remaining samples"
+		if changed then
+			-- smooth gain changes above 0.02 dB difference
+			cur_gain = low_pass_filter_param (cur_gain, ctrl[1], 0.02)
+		end
+
+		local gain = ARDOUR.DSP.dB_to_coefficient (cur_gain) -- 10 ^ (0.05 * cur_gain)
+
+		for c = 1,#ins do -- process all channels
+			-- check if output and input buffers for this channel are identical
+			-- http://manual.ardour.org/lua-scripting/class_reference/#C:FloatArray
+			if not ins[c]:sameinstance (outs[c]) then
+				-- http://manual.ardour.org/lua-scripting/class_reference/#ARDOUR:DSP
+				ARDOUR.DSP.copy_vector (outs[c]:offset (off), ins[c]:offset (off), siz)
+			end
+			ARDOUR.DSP.apply_gain_to_buffer (outs[c]:offset (off), siz, gain); -- apply-gain, process in-place
+		end
+		n_samples = n_samples - siz
+		off = off + siz
+	end
+
+--[[
+	if changed then
+		self:queue_draw () -- notify display
+	end
+--]]
+end
+
+-------------------------------------------------------------------------------
+--- inline display + text example
+
+--[[
+local txt = nil -- cache pango context globally
+
+function render_inline (ctx, w, max_h)
+	local ctrl = CtrlPorts:array () -- get control ports
+
+	if not txt then
+		-- allocate PangoLayout and set font
+		--http://manual.ardour.org/lua-scripting/class_reference/#Cairo:PangoLayout
+		txt = Cairo.PangoLayout (ctx, "Mono 8px")
+	end
+
+	txt:set_text (string.format ("%+.2f dB", ctrl[1]));
+	tw, th = txt:get_pixel_size ()
+
+	local h = th + 4 -- use text-height with 4px padding
+	if (h > max_h) then h = max_h end -- but at most max-height
+
+	-- clear background
+	ctx:rectangle (0, 0, w, h)
+	ctx:set_source_rgba (.2, .2, .2, 1.0)
+	ctx:fill ()
+
+	-- center text
+	ctx:set_source_rgba (.8, .8, .8, 1.0)
+	ctx:move_to (.5 * (w - tw), .5 * (h - th))
+	txt:show_in_cairo_context (ctx)
+
+	return {w, h}
+end
+--]]
diff --git a/scripts/bounce_replace.lua b/scripts/bounce_replace.lua
new file mode 100644
index 0000000..07518a4
--- /dev/null
+++ b/scripts/bounce_replace.lua
@@ -0,0 +1,64 @@
+ardour { ["type"] = "EditorAction", name = "Bounce+Replace Regions",
+	license     = "MIT",
+	author      = "Ardour Team",
+	description = [[Bounce selected regions with processing and replace region]]
+}
+
+function factory (params) return function ()
+	-- there is currently no direct way to find the track
+	-- corresponding to a [selected] region
+	function find_track_for_region (region_id)
+		for route in Session:get_tracks():iter() do
+			local track = route:to_track();
+			local pl = track:playlist ()
+			if not pl:region_by_id (region_id):isnil () then
+				return track
+			end
+		end
+		assert (0); -- can't happen, region must be in a playlist
+	end
+
+	-- get selection
+	-- http://manual.ardour.org/lua-scripting/class_reference/#ArdourUI:Selection
+	local sel = Editor:get_selection ()
+
+	-- prepare undo operation
+	Session:begin_reversible_command ("Bounce+Replace Regions")
+	local add_undo = false -- keep track if something has changed
+
+	-- Iterate over Regions part of the selection
+	-- http://manual.ardour.org/lua-scripting/class_reference/#ArdourUI:RegionSelection
+	for r in sel.regions:regionlist ():iter () do
+		-- each of the items 'r' is a
+		-- http://manual.ardour.org/lua-scripting/class_reference/#ARDOUR:Region
+
+		local track = find_track_for_region (r:to_stateful():id())
+		local playlist = track:playlist ()
+
+		-- clear existing changes, prepare "diff" of state for undo
+		playlist:to_stateful ():clear_changes ()
+
+		-- bounce the region with processing
+		local region = track:bounce_range (r:position (), r:position() + r:length (), ARDOUR.InterThreadInfo (), track:main_outs (), false);
+
+		-- remove old region..
+		playlist:remove_region (r);
+		-- ..and add the newly bounced one
+		playlist:add_region (region, r:position (), 1, false)
+
+		-- create a diff of the performed work, add it to the session's undo stack
+		-- and check if it is not empty
+		if not Session:add_stateful_diff_command (playlist:to_statefuldestructible ()):empty () then
+			add_undo = true
+		end
+	end
+
+	-- all done, commit the combined Undo Operation
+	if add_undo then
+		-- the 'nil' Command here mean to use the collected diffs added above
+		Session:commit_reversible_command (nil)
+	else
+		Session:abort_reversible_command ()
+	end
+
+end end
diff --git a/scripts/midi_rewite.lua b/scripts/midi_rewite.lua
new file mode 100644
index 0000000..4dfc28a
--- /dev/null
+++ b/scripts/midi_rewite.lua
@@ -0,0 +1,34 @@
+ardour {
+	["type"]    = "session",
+	name        = "Rewrite Midi",
+	license     = "MIT",
+	author      = "Ardour Lua Task Force",
+	description = [[An example session script preprocesses midi buffers.]]
+}
+
+function factory ()
+	-- this function is called in every process cycle, before processing
+	return function (n_samples)
+		_, t = Session:engine ():get_ports (ARDOUR.DataType.midi (), ARDOUR.PortList ())
+		for p in t[2]:iter () do
+			if not p:receives_input () then goto next end
+
+			if not p:name () == "MIDI/midi_in 1" then goto next end
+
+			midiport = p:to_midiport ()
+			assert (not midiport:isnil ())
+			mb = midiport:get_midi_buffer (n_samples);
+
+			events = mb:table() -- copy event list into lua table
+			mb:silence (n_samples, 0); -- clear existing buffer
+
+			for _,e in pairs (events) do
+				-- e is-a http://manual.ardour.org/lua-scripting/class_reference/#Evoral:MidiEvent
+				e:set_channel (2)
+				mb:push_event (e)
+			end
+
+			::next::
+		end
+	end
+end
diff --git a/scripts/midifilter.lua b/scripts/midifilter.lua
new file mode 100644
index 0000000..3ff61d3
--- /dev/null
+++ b/scripts/midifilter.lua
@@ -0,0 +1,38 @@
+ardour {
+	["type"]    = "dsp",
+	name        = "Midi Filter",
+	category    = "Example", -- "Utility"
+	license     = "MIT",
+	author      = "Ardour Lua Task Force",
+	description = [[An Example Midi Filter for prototyping.]]
+}
+
+function dsp_ioconfig ()
+	return { { midi_in = 1, midi_out = 1, audio_in = 0, audio_out = 0}, }
+end
+
+function dsp_run (_, _, n_samples)
+	assert (type(midiin) == "table")
+	assert (type(midiout) == "table")
+	local cnt = 1;
+
+	function tx_midi (time, data)
+		midiout[cnt] = {}
+		midiout[cnt]["time"] = time;
+		midiout[cnt]["data"] = data;
+		cnt = cnt + 1;
+	end
+
+	-- for each incoming midi event
+	for _,b in pairs (midiin) do
+		local t = b["time"] -- t = [ 1 .. n_samples ]
+		local d = b["data"] -- get midi-event
+
+		if (#d == 3 and bit32.band (d[1], 240) == 144) then -- note on
+			tx_midi (t, d)
+		end
+		if (#d == 3 and bit32.band (d[1], 240) == 128) then -- note off
+			tx_midi (t, d)
+		end
+	end
+end
diff --git a/scripts/midigenerator.lua b/scripts/midigenerator.lua
new file mode 100644
index 0000000..4ef4bf4
--- /dev/null
+++ b/scripts/midigenerator.lua
@@ -0,0 +1,48 @@
+ardour {
+	["type"]    = "dsp",
+	name        = "Midi Generator",
+	category    = "Example", -- "Utility"
+	license     = "MIT",
+	author      = "Ardour Lua Task Force",
+	description = [[An Example Midi Generator for prototyping.]]
+}
+
+function dsp_ioconfig ()
+	return { { midi_out = 1, audio_in = 0, audio_out = 0}, }
+end
+
+local tme = 0 -- sample-counter
+local seq = 1 -- sequence-step
+local spb = 0 -- samples per beat
+
+local midi_sequence = {
+	{ 0x90, 64, 127 },
+	{ 0x80, 64,   0 },
+}
+
+function dsp_init (rate)
+	local bpm = 120
+	spb = rate * 60 / bpm
+	if spb < 2 then spb = 2 end
+end
+
+function dsp_run (_, _, n_samples)
+	assert (type(midiout) == "table")
+	assert (spb > 1)
+	local m = 1
+
+	for time = 1,n_samples do -- not very efficient
+		-- TODO, timestamp the sequence in beats, calc/skip to next event
+		tme = tme + 1
+
+		if tme >= spb then
+			midiout[m] = {}
+			midiout[m]["time"] = time
+			midiout[m]["data"] = midi_sequence[seq]
+
+			tme = 0
+			m = m + 1
+			if seq == #midi_sequence then seq = 1 else seq = seq + 1 end
+		end
+	end
+end
diff --git a/scripts/midimon.lua b/scripts/midimon.lua
new file mode 100644
index 0000000..7f58fd3
--- /dev/null
+++ b/scripts/midimon.lua
@@ -0,0 +1,213 @@
+ardour {
+	["type"]    = "dsp",
+	name        = "a-MIDI Monitor",
+	category    = "Visualization",
+	license     = "GPLv2",
+	author      = "Ardour Team",
+	description = [[Display recent MIDI events inline in the mixer strip]]
+}
+
+local maxevents = 20
+local ringsize = maxevents * 3
+local evlen = 3
+local hpadding, vpadding = 4, 2
+
+function dsp_ioconfig ()
+	return { { midi_in = 1, midi_out = 1, audio_in = -1, audio_out = -1}, }
+end
+
+function dsp_params ()
+	return
+	{
+		{ ["type"] = "input",
+			name = "Font size",
+			doc = "Text size used by the monitor to display midi events",
+			min = 4, max = 12, default = 7, integer = true },
+		{ ["type"] = "input",
+			name = "Line count",
+			doc = "How many events will be shown at most",
+			min = 1, max = maxevents, default = 6, integer = true },
+		{ ["type"] = "input",
+			name = "Hexadecimal",
+			doc = "If enabled, values will be printed in hexadecimal notation",
+			min = 0, max = 1, default = 0, toggled = true },
+		{ ["type"] = "input",
+			name = "System messages",
+			doc = "If enabled, the monitor will show System Control and Real-Time messages",
+			min = 0, max = 1, default = 0, toggled = true },
+		{ ["type"] = "input",
+			name = "Numeric Notes",
+			doc = "If enabled, note-events displayed numerically",
+			min = 0, max = 1, default = 0, toggled = true },
+	}
+end
+
+function dsp_init (rate)
+	-- create a shmem space to hold latest midi events
+	-- a int representing the index of the last event, and
+	-- a C-table as storage for events.
+	self:shmem():allocate(1 + ringsize*evlen)
+	self:shmem():atomic_set_int(0, 1)
+	local buffer = self:shmem():to_int(1):array()
+	for i = 1, ringsize*evlen do
+		buffer[i] = -1 -- sentinel for empty slot
+	end
+end
+
+function dsp_runmap (bufs, in_map, out_map, n_samples, offset)
+	local pos = self:shmem():atomic_get_int(0)
+	local buffer = self:shmem():to_int(1):array()
+
+	-- passthrough all data
+	ARDOUR.DSP.process_map (bufs, in_map, out_map, n_samples, offset, ARDOUR.DataType ("audio"))
+	ARDOUR.DSP.process_map (bufs, in_map, out_map, n_samples, offset, ARDOUR.DataType ("midi"))
+
+	-- then fill the event buffer
+	local ib = in_map:get (ARDOUR.DataType ("midi"), 0) -- index of 1st midi input
+
+	if ib ~= ARDOUR.ChanMapping.Invalid then
+		local events = bufs:get_midi (ib):table () -- copy event list into a lua table
+
+		-- iterate over all MIDI events
+		for _, e in pairs (events) do
+			local ev = e:buffer():array()
+			pos = pos % ringsize + 1
+			-- copy the data
+			for j = 1, math.min(e:size(),evlen) do
+				buffer[(pos-1)*evlen + j] = ev[j]
+			end
+			-- zero unused slots
+			for j = e:size()+1, evlen do
+				buffer[(pos-1)*evlen + j] = 0
+			end
+		end
+	end
+
+	self:shmem():atomic_set_int(0, pos)
+
+	self:queue_draw ()
+end
+
+local txt = nil -- a pango context
+local cursize = 0
+local hex = nil
+local format_note = nil
+local show_scm = nil
+
+function format_note_name(b)
+	return string.format ("%5s", ARDOUR.ParameterDescriptor.midi_note_name (b))
+end
+
+function format_note_num(b)
+	return string.format (hex, b)
+end
+
+
+function show_midi(ctx, x, y, buffer, event)
+	local base = (event - 1) * evlen
+	if buffer[base+1] == -1 then return false end
+	local evtype = buffer[base + 1] >> 4
+	local channel = (buffer[base + 1] & 15) + 1 -- for System Common Messages this has no use
+	if evtype == 8 then
+		txt:set_text(string.format("%02u \u{2669}Off%s" .. hex, channel, format_note(buffer[base+2]), buffer[base+3]))
+	elseif evtype == 9 then
+		txt:set_text(string.format("%02u \u{2669}On %s" .. hex, channel, format_note(buffer[base+2]), buffer[base+3]))
+	elseif evtype == 10 then
+		txt:set_text(string.format("%02u \u{2669}KP %s" .. hex, channel, format_note(buffer[base+2]), buffer[base+3]))
+	elseif evtype == 11 then
+		txt:set_text(string.format("%02u CC  " .. hex .. hex, channel, buffer[base+2], buffer[base+3]))
+	elseif evtype == 12 then
+		txt:set_text(string.format("%02u PRG " .. hex, channel, buffer[base+2]))
+	elseif evtype == 13 then
+		txt:set_text(string.format("%02u  KP " .. hex, channel, buffer[base+2]))
+	elseif evtype == 14 then
+		txt:set_text(string.format("%02u PBnd" .. hex, channel, buffer[base+2] | buffer[base+3] << 7))
+	elseif show_scm > 0 then -- System Common Message
+		local message = buffer[base + 1] & 15
+		if message == 0 then
+			txt:set_text("-- SysEx")
+		elseif message == 1 then
+			txt:set_text(string.format("-- Time Code" .. hex, buffer[base+2]))
+		elseif message == 2 then
+			txt:set_text(string.format("-- Song Pos" .. hex, buffer[base+2] | buffer[base+3] << 7))
+		elseif message == 3 then
+			txt:set_text(string.format("-- Select Song" .. hex, buffer[base+2]))
+		elseif message == 6 then
+			txt:set_text("-- Tune Rq")
+		elseif message == 8 then
+			txt:set_text("-- Timing")
+		elseif message == 10 then
+			txt:set_text("-- Start")
+		elseif message == 11 then
+			txt:set_text("-- Continue")
+		elseif message == 12 then
+			txt:set_text("-- Stop")
+		elseif message == 14 then
+			txt:set_text("-- Active")
+		elseif message == 15 then
+			txt:set_text("-- Reset")
+		else
+			return false
+		end
+	else
+		return false
+	end
+	ctx:move_to (x, y)
+	txt:show_in_cairo_context (ctx)
+	return true
+end
+
+function render_inline (ctx, displaywidth, max_h)
+	local ctrl = CtrlPorts:array ()
+	local pos = self:shmem():atomic_get_int(0)
+	local buffer = self:shmem():to_int(1):array()
+	local count = ctrl[2]
+
+	if not txt or cursize ~= ctrl[1] then
+		cursize = math.floor(ctrl[1])
+		txt = Cairo.PangoLayout (ctx, "Mono " .. cursize)
+	end
+
+	if ctrl[3] > 0 then hex = " %02X" else hex = " %3u" end
+	show_scm = ctrl[4]
+
+	if ctrl[5] > 0 then
+		format_note = format_note_num
+	else
+		format_note = format_note_name
+	end
+
+	-- compute the size of the display
+	txt:set_text("0")
+	local _, lineheight = txt:get_pixel_size()
+	local displayheight = math.min(vpadding + (lineheight + vpadding) * count, max_h)
+
+	-- compute starting position (pango anchors text at north-west corner)
+	local x, y = hpadding, displayheight - lineheight - vpadding
+
+	-- clear background
+	ctx:rectangle (0, 0, displaywidth, displayheight)
+	ctx:set_source_rgba (.2, .2, .2, 1.0)
+	ctx:fill ()
+
+	-- color of latest event
+	ctx:set_source_rgba (1.0, 1.0, 1.0, 1.0)
+
+	-- print events
+	for i = pos, 1, -1 do
+		if y < 0 then break end
+		if show_midi(ctx, x, y, buffer, i) then
+			y = y - lineheight - vpadding
+			ctx:set_source_rgba (.8, .8, .8, 1.0)
+		end
+	end
+	for i = ringsize, pos+1, -1 do
+		if y < 0 then break end
+		if show_midi(ctx, x, y, buffer, i) then
+			y = y - lineheight - vpadding
+			ctx:set_source_rgba (.8, .8, .8, 1.0)
+		end
+	end
+
+	return {displaywidth, displayheight}
+end
diff --git a/scripts/remove_unknown_procs.lua b/scripts/remove_unknown_procs.lua
new file mode 100644
index 0000000..0461e88
--- /dev/null
+++ b/scripts/remove_unknown_procs.lua
@@ -0,0 +1,23 @@
+ardour { ["type"] = "EditorAction", name = "Remove Unknown Plugins",
+	license     = "MIT",
+	author      = "Ardour Team",
+	description = [[Remove all unknown plugins/processors from all tracks and busses]]
+}
+
+function factory (params) return function ()
+	-- iterate over all tracks and busses
+	for route in Session:get_routes ():iter () do
+		-- route is-a http://manual.ardour.org/lua-scripting/class_reference/#ARDOUR:Route
+		local i = 0;
+		repeat
+			proc = route:nth_processor (i)
+			-- proc is a http://manual.ardour.org/lua-scripting/class_reference/#ARDOUR:Processor
+			-- try cast it to http://manual.ardour.org/lua-scripting/class_reference/#ARDOUR:UnknownProcessor
+			if not proc:isnil () and not proc:to_unknownprocessor ():isnil () then
+				route:remove_processor (proc, nil, true)
+			else
+				i = i + 1
+			end
+		until proc:isnil ()
+	end
+end end
diff --git a/scripts/rewind.lua b/scripts/rewind.lua
new file mode 100644
index 0000000..88e1506
--- /dev/null
+++ b/scripts/rewind.lua
@@ -0,0 +1,12 @@
+ardour {
+	["type"]    = "EditorAction",
+	name        = "Rewind",
+	author      = "Ardour Lua Task Force",
+	description = [[An Example Ardour Editor Action Script.]]
+}
+
+function factory (params)
+	return function ()
+		Session:goto_start()
+	end
+end
diff --git a/scripts/s_chanmap.lua b/scripts/s_chanmap.lua
new file mode 100644
index 0000000..7bc070c
--- /dev/null
+++ b/scripts/s_chanmap.lua
@@ -0,0 +1,34 @@
+ardour { ["type"] = "Snippet", name = "plugin channel-map dev" }
+
+function factory () return function ()
+	-- first track needs to be stereo and have a stereo plugin
+	-- (x42-eq with spectrum display, per channel processing,
+	--  and pre/post visualization is very handy here)
+
+	function checksetup (r)
+		-- fail if Route ID 1 is not present or not stereo
+		assert (r and not r:isnil())
+                assert (r:n_inputs():n_audio() == 2)
+		-- check first Plugin and make sure it is a "Plugin Insert"
+		if not r:nth_plugin(0):isnil() and not r:nth_plugin(0):to_insert():isnil() then return end
+		-- insert x42-eq at the top.
+		local proc = ARDOUR.LuaAPI.new_plugin(Session, "http://gareus.org/oss/lv2/fil4#stereo", ARDOUR.PluginType.LV2, "");
+		r:add_processor_by_index(proc, 0, nil, true)
+	end
+
+	r = Session:get_remote_nth_route(1)
+	checksetup (r)
+	pi = r:nth_plugin(0):to_insert()
+
+	pi:set_no_inplace (true)
+
+	cm = ARDOUR.ChanMapping()
+	--cm:set(ARDOUR.DataType("Audio"), 0, 0)
+	cm:set(ARDOUR.DataType("Audio"), 1, 0)
+	pi:set_input_map (0, cm)
+
+	cm = ARDOUR.ChanMapping()
+	--cm:set(ARDOUR.DataType("Audio"), 0, 0)
+	cm:set(ARDOUR.DataType("Audio"), 1, 0)
+	pi:set_output_map (0, cm)
+end end
diff --git a/scripts/s_fader_automation.lua b/scripts/s_fader_automation.lua
new file mode 100644
index 0000000..aaac7ad
--- /dev/null
+++ b/scripts/s_fader_automation.lua
@@ -0,0 +1,63 @@
+ardour { ["type"] = "Snippet", name = "Fader Automation" }
+
+function factory () return function ()
+	local playhead = Session:transport_frame ()
+	local samplerate = Session:nominal_frame_rate ()
+
+	-- get selected tracks
+	rl = Editor:get_selection ().tracks:routelist ()
+
+	-- prepare undo operation
+	Session:begin_reversible_command ("Fancy Fade Out")
+	local add_undo = false -- keep track if something has changed
+
+	-- iterate over selected tracks
+	for r in rl:iter () do
+		local ac = r:amp ():gain_control () -- ARDOUR:AutomationControl
+		local al = ac:alist () -- ARDOUR:AutomationList (state, high-level)
+		local cl = al:list ()  -- Evoral:ControlList (actual events)
+
+		if cl:isnil () then
+			goto out
+		end
+
+		-- set automation state to "Touch"
+		ac:set_automation_state (ARDOUR.AutoState.Touch)
+
+		-- query the value at the playhead position
+		local g = cl:eval (playhead)
+
+		-- get state for undo
+		local before = al:get_state ()
+
+		-- delete all events after the playhead...
+		cl:truncate_end (playhead)
+
+		-- ...and generate some new ones.
+		for i=0,50 do
+			-- use a sqrt fade-out (the shape is recognizable, and otherwise
+			-- not be possible to achieve with existing ardour fade shapes)
+			cl:add (playhead + i * samplerate / 50,
+			        g * (1 - math.sqrt (i / 50)),
+			        false, true)
+		end
+
+		-- remove dense events
+		cl:thin (20)
+
+		-- save undo
+		local after = al:get_state ()
+		Session:add_command (al:memento_command (before, after))
+		add_undo = true
+
+		::out::
+	end
+
+	-- all done, commit the combined Undo Operation
+	if add_undo then
+		-- the 'nil' Commend here mean to use the collected diffs added above
+		Session:commit_reversible_command (nil)
+	else
+		Session:abort_reversible_command ()
+	end
+end end
diff --git a/scripts/s_foreach_track.lua b/scripts/s_foreach_track.lua
new file mode 100644
index 0000000..c1c6ed8
--- /dev/null
+++ b/scripts/s_foreach_track.lua
@@ -0,0 +1,10 @@
+ardour { ["type"] = "Snippet", name = "Foreach Track" }
+
+function factory () return function ()
+	for r in Session:get_tracks():iter() do
+		print (r:name())
+		-- see http://manual.ardour.org/lua-scripting/class_reference/#ARDOUR:Track
+		-- for available methods e.g.
+		r:set_active (true, nil)
+	end
+end end
diff --git a/scripts/s_plugin_automation.lua b/scripts/s_plugin_automation.lua
new file mode 100644
index 0000000..56129ff
--- /dev/null
+++ b/scripts/s_plugin_automation.lua
@@ -0,0 +1,43 @@
+ardour { ["type"] = "Snippet", name = "Plugin automation" }
+
+function factory () return function ()
+	-- query playhead position and session sample-rate
+	local playhead = Session:transport_frame ()
+	local samplerate = Session:nominal_frame_rate ()
+
+	-- get Track/Bus with RID 3
+	local r = Session:get_remote_nth_route(3)
+	-- make sure the track object exists
+	assert (not r:isnil ())
+
+	-- get AutomationList, ControlList and ParameterDescriptor
+	-- of the first plugin's first parameter
+	-- see http://manual.ardour.org/lua-scripting/class_reference/#ARDOUR:LuaAPI
+	local al, cl, pd = ARDOUR.LuaAPI.plugin_automation (r:nth_plugin (0), 0)
+
+	if not al:isnil () then
+		print ("Parameter Range", pd.lower, pd.upper)
+		print ("Current value", cl:eval (playhead))
+
+		-- prepare undo operation
+		Session:begin_reversible_command ("Automatix")
+		-- remember current AutomationList state
+		local before = al:get_state()
+
+		-- remove future automation
+		cl:truncate_end (playhead)
+
+		-- add new data points after the playhead 1 sec, min..max
+		-- without guard-points, but with initial (..., false, true)
+		for i=0,10 do
+			cl:add (playhead + i * samplerate / 10,
+				 pd.lower + math.sqrt (i / 10) * (pd.upper - pd.lower),
+				 false, true)
+		end
+
+		-- save undo
+		local after = al:get_state()
+		Session:add_command (al:memento_command(before, after))
+		Session:commit_reversible_command (nil)
+	end
+end end
diff --git a/scripts/s_pluginutils.lua b/scripts/s_pluginutils.lua
new file mode 100644
index 0000000..3af803a
--- /dev/null
+++ b/scripts/s_pluginutils.lua
@@ -0,0 +1,36 @@
+ardour { ["type"] = "Snippet", name = "Plugin Utils" }
+
+function factory () return function ()
+
+	-------------------------------------------------------------------------------
+	-- add a Plugin (here LV2) to all mono tracks that contain the pattern "dru"
+	-- and load a plugin-preset (if it exists)
+	for r in Session:get_routes():iter() do
+		if (string.match (r:name(), "dru") and r:n_inputs():n_audio() == 1) then
+			local proc = ARDOUR.LuaAPI.new_plugin(Session, "http://gareus.org/oss/lv2/fil4#mono", ARDOUR.PluginType.LV2, "cutbass");
+			r:add_processor_by_index(proc, 0, nil, true)
+		end
+	end
+
+
+	-------------------------------------------------------------------------------
+	-- load a plugin preset
+	route = Session:get_remote_nth_route(2)
+	-- to 4th plugin (from top), ardour starts counting at zero
+	plugin = route:nth_plugin(3):to_insert():plugin(0)
+	ps = plugin:preset_by_label("cutbass") -- get preset by name
+	print (ps.uri)
+	plugin:load_preset (ps)
+
+
+	-------------------------------------------------------------------------------
+	-- add a LuaProcessor (here "Scope") to all tracks
+	for t in Session:get_tracks():iter() do
+		local pos = 0 -- insert at the top
+		local proc = ARDOUR.LuaAPI.new_luaproc(Session, "Inline Scope");
+		t:add_processor_by_index(proc, pos, nil, true)
+		-- optionally set some parameters
+		ARDOUR.LuaAPI.set_processor_param (proc, 0, 5) -- timescale 5sec
+	end
+
+end end
diff --git a/scripts/s_portengine.lua b/scripts/s_portengine.lua
new file mode 100644
index 0000000..5bbcabd
--- /dev/null
+++ b/scripts/s_portengine.lua
@@ -0,0 +1,33 @@
+ardour { ["type"] = "Snippet", name = "portengine" }
+function factory () return function ()
+
+	a = Session:engine()
+	print ("----- Port objects from Ardour's engine ----");
+	_, t = a:get_ports (ARDOUR.DataType("audio"), ARDOUR.PortList())
+	-- table 't' holds argument references. t[2] is the PortList
+	for p in t[2]:iter() do
+		print (p:name())
+	end
+
+	print ("----- Port names queries from the backend ----");
+	_, t = a:get_backend_ports ("", ARDOUR.DataType("audio"), 0, C.StringVector())
+	-- table 't' holds argument references. t[4] is the StringVector
+	for n in t[4]:iter() do
+		print (n)
+	end
+
+	print ("----- Connections from the backend ----");
+	_, t = a:get_backend_ports ("", ARDOUR.DataType("audio"), ARDOUR.PortFlags.IsOutput, C.StringVector())
+	for n in t[4]:iter() do
+		local printed_name = false;
+		_, ct = a:get_connections (n, C.StringVector())
+		for c in ct[2]:iter() do
+			if (not printed_name) then
+				printed_name = true;
+				print (n)
+			end
+			print (" ->", c)
+		end
+	end
+
+end end
diff --git a/scripts/s_replaceplugin.lua b/scripts/s_replaceplugin.lua
new file mode 100644
index 0000000..4cef07c
--- /dev/null
+++ b/scripts/s_replaceplugin.lua
@@ -0,0 +1,11 @@
+ardour { ["type"] = "Snippet", name = "Replace Plugin" }
+
+function factory () return function ()
+
+	route = Session:get_remote_nth_route(1)
+	old = route:nth_plugin(0)
+	new = ARDOUR.LuaAPI.new_plugin(Session, "http://gareus.org/oss/lv2/fil4#stereo", ARDOUR.PluginType.LV2, "");
+	route:replace_processor (old, new, nil)
+	old = nil new = nil -- explicitly drop references (unless they're local vars)
+
+end end
diff --git a/scripts/s_selection.lua b/scripts/s_selection.lua
new file mode 100644
index 0000000..1963ac1
--- /dev/null
+++ b/scripts/s_selection.lua
@@ -0,0 +1,60 @@
+ardour { ["type"] = "Snippet", name = "Editor Selection" }
+
+function factory () return function ()
+	-- http://manual.ardour.org/lua-scripting/class_reference/#ArdourUI:Selection
+	-- the Ardour Selection can include multiple items
+	-- (regions, tracks, ranges, markers, automation, midi-notes etc)
+	local sel = Editor:get_selection ()
+
+	--
+	-- At the point of writing the following data items are available
+	--
+	
+	-- Range selection, total span of all ranges (0, 0 if no time range is selected)
+	if sel.time:start () < sel.time:end_frame () then
+		print ("Total Range:", sel.time:start (), sel.time:end_frame ())
+	end
+
+	-- Range selection, individual ranges.
+	for ar in sel.time:iter () do
+		-- each of the items is a
+		-- http://manual.ardour.org/lua-scripting/class_reference/#ARDOUR:AudioRange
+		print ("Range:", ar.id, ar.start, ar._end)
+	end
+
+	-- Track/Bus Selection
+	-- http://manual.ardour.org/lua-scripting/class_reference/#ArdourUI:TrackSelection
+	for r in sel.tracks:routelist ():iter () do
+		-- each of the items is a
+		-- http://manual.ardour.org/lua-scripting/class_reference/#ARDOUR:Route
+		print ("Route:", r:name ())
+	end
+
+	-- Region selection
+	-- http://manual.ardour.org/lua-scripting/class_reference/#ArdourUI:RegionSelection
+	for r in sel.regions:regionlist ():iter () do
+		-- each of the items is a
+		-- http://manual.ardour.org/lua-scripting/class_reference/#ARDOUR:Region
+		print ("Region:", r:name ())
+	end
+
+	-- Markers
+	-- http://manual.ardour.org/lua-scripting/class_reference/#ArdourUI:MarkerSelection
+	-- Note: Marker selection is not cleared and currently (Ardour-4.7) points
+	--       to the most recently selected marker.
+	for m in sel.markers:iter () do
+		-- each of the items is a
+		-- http://manual.ardour.org/lua-scripting/class_reference/#ARDOURUI::ArdourMarker
+		print ("Marker:", m:name (), m:position(), m:_type())
+	end
+
+	----------------------------------------------------------
+	-- The total time extents of all selected regions and ranges
+	local ok, ext = Editor:get_selection_extents (0, 0)
+	if ok then
+		print ("Selection Extents:", ext[1], ext[2])
+	else
+		print ("No region or range is selected")
+	end
+
+end end
diff --git a/scripts/scope.lua b/scripts/scope.lua
new file mode 100644
index 0000000..1952c10
--- /dev/null
+++ b/scripts/scope.lua
@@ -0,0 +1,229 @@
+ardour {
+	["type"]    = "dsp",
+	name        = "a-Inline Scope",
+	category    = "Visualization",
+	license     = "MIT",
+	author      = "Ardour Team",
+	description = [[Mixer strip inline waveform display]]
+}
+
+-- return possible i/o configurations
+function dsp_ioconfig ()
+	-- -1, -1 = any number of channels as long as input and output count matches
+	return { [1] = { audio_in = -1, audio_out = -1}, }
+end
+
+function dsp_params ()
+	return
+	{
+		{ ["type"] = "input", name = "Timescale", min = .1, max = 5, default = 2, unit="sec", logarithmic = true },
+		{ ["type"] = "input", name = "Logscale", min = 0, max = 1, default = 0, toggled = true },
+		{ ["type"] = "input", name = "Height (Aspect)", min = 0, max = 3, default = 1, enum = true, scalepoints =
+			{
+				["Min"] = 0,
+				["16:10"] = 1,
+				["1:1"] = 2,
+				["Max"] = 3
+			}
+		},
+	}
+end
+
+
+function dsp_init (rate)
+	-- global variables (DSP part only)
+	samplerate = rate
+	bufsiz = 6 * rate
+	dpy_hz = rate / 25
+	dpy_wr = 0
+end
+
+function dsp_configure (ins, outs)
+	-- store configuration in global variable
+	audio_ins = ins:n_audio ()
+	-- allocate shared memory area
+	-- this is used to speed up DSP computaton (using a C array)
+	-- and to share data with the GUI
+	self:shmem ():allocate (4 + bufsiz * audio_ins)
+	self:shmem ():clear ()
+	self:shmem ():atomic_set_int (0, 0)
+	local cfg = self:shmem ():to_int (1):array ()
+	cfg[1] = samplerate
+	cfg[2] = bufsiz
+	cfg[3] = audio_ins
+end
+
+function dsp_runmap (bufs, in_map, out_map, n_samples, offset)
+	local shmem = self:shmem ()
+	local write_ptr = shmem:atomic_get_int (0)
+
+	for c = 1,audio_ins do
+		-- Note: lua starts counting at 1, ardour's ChanMapping::get() at 0
+		local ib = in_map:get (ARDOUR.DataType ("audio"), c - 1); -- get id of mapped input buffer for given cannel
+		local ob = out_map:get (ARDOUR.DataType ("audio"), c - 1); -- get id of mapped output buffer for given cannel
+		local chn_off = 4 + bufsiz * (c - 1)
+		if (ib ~= ARDOUR.ChanMapping.Invalid) then
+			if (write_ptr + n_samples < bufsiz) then
+				ARDOUR.DSP.copy_vector (shmem:to_float (write_ptr + chn_off), bufs:get_audio (ib):data (offset), n_samples)
+			else
+				local w0 = bufsiz - write_ptr;
+				ARDOUR.DSP.copy_vector (shmem:to_float (write_ptr + chn_off), bufs:get_audio (ib):data (offset), w0)
+				ARDOUR.DSP.copy_vector (shmem:to_float (chn_off)            , bufs:get_audio (ib):data (offset + w0), n_samples - w0)
+			end
+			if (ob ~= ARDOUR.ChanMapping.Invalid and ib ~= ob) then
+				ARDOUR.DSP.copy_vector (bufs:get_audio (ob):data (offset), bufs:get_audio (ib):data (offset), n_samples)
+			end
+		else
+			if (write_ptr + n_samples < bufsiz) then
+				ARDOUR.DSP.memset (shmem:to_float (write_ptr + chn_off), 0, n_samples)
+			else
+				local w0 = bufsiz - write_ptr;
+				ARDOUR.DSP.memset (shmem:to_float (write_ptr + chn_off), 0, w0)
+				ARDOUR.DSP.memset (shmem:to_float (chn_off)            , 0, n_samples - w0)
+			end
+		end
+	end
+	-- clear unconnected inplace buffers
+	for c = 1,audio_ins do
+		local ib = in_map:get (ARDOUR.DataType ("audio"), c - 1); -- get id of mapped input buffer for given cannel
+		local ob = out_map:get (ARDOUR.DataType ("audio"), c - 1); -- get id of mapped output buffer for given cannel
+		if (ib == ARDOUR.ChanMapping.Invalid and ob ~= ARDOUR.ChanMapping.Invalid) then
+			bufs:get_audio (ob):silence (n_samples, offset)
+		end
+	end
+
+	write_ptr = (write_ptr + n_samples) % bufsiz
+	shmem:atomic_set_int (0, write_ptr)
+
+	-- emit QueueDraw every FPS
+	dpy_wr = dpy_wr + n_samples
+	if (dpy_wr > dpy_hz) then
+		dpy_wr = dpy_wr % dpy_hz;
+		self:queue_draw ()
+	end
+end
+
+
+-- helper function for drawing symmetric grid
+function gridline (ctx, x, xr, h, val)
+	ctx:move_to (math.floor (.5 + x + val * xr) -.5, 1)
+	ctx:line_to (math.floor (.5 + x + val * xr) -.5, h - 1)
+	ctx:stroke ()
+	ctx:move_to (math.floor (.5 + x - val * xr) -.5, 1)
+	ctx:line_to (math.floor (.5 + x - val * xr) -.5, h - 1)
+	ctx:stroke ()
+end
+
+function render_inline (ctx, w, max_h)
+	local ctrl = CtrlPorts:array () -- get control port array (read/write)
+	local shmem = self:shmem () -- get shared memory region
+	local cfg = shmem:to_int (1):array () -- "cast" into lua-table
+	local rate = cfg[1]
+	local buf_size = cfg[2]
+	local n_chn = cfg[3]
+
+	-- get settings
+	local timescale = ctrl[1] or 1.0 -- display size in seconds
+	local logscale = ctrl[2] or 0; logscale = logscale > 0 -- logscale
+	local hmode = ctrl[3] or 1 -- height mode
+
+	-- calc height
+	if hmode == 0 then
+		h = math.ceil (w * 10 / 16)
+		if (h > 44) then
+			h = 44
+		end
+	elseif (hmode == 2) then
+		h = w
+	elseif (hmode == 3) then
+		h = max_h
+	else
+		h = math.ceil (w * 10 / 16)
+	end
+
+	if (h > max_h) then
+		h = max_h
+	end
+
+	-- display settings
+	local spp = math.floor (timescale * rate / (h - 2)) -- samples per pixel
+	local spl = spp * (h - 1) -- total number of audio samples to read
+	local read_ptr = (shmem:atomic_get_int (0) + buf_size - spl - 1) % buf_size -- read pointer
+	local xr = math.ceil ((w - 2) * (0.47 / n_chn)) -- x-axis range (per channel)
+
+	-- clear background
+	ctx:rectangle (0, 0, w, h)
+	ctx:set_source_rgba (.2, .2, .2, 1.0)
+	ctx:fill ()
+
+	-- prepare drawing
+	ctx:set_line_width (1.0)
+	local dash3 = C.DoubleVector ()
+	dash3:add ({1, 3})
+	local dash4 = C.DoubleVector ()
+	dash4:add ({1, 4})
+
+	-- plot every channel
+	for c = 1,n_chn do
+		local x = math.floor ((w - 2) * (c - .5) / n_chn) + 1.5  -- x-axis center for given channel
+
+		-- draw grid --
+		ctx:set_source_rgba (.5, .5, .5, 1.0)
+		ctx:move_to (x, 1) ctx:line_to (x, h - 1) ctx:stroke ()
+
+		ctx:set_dash (dash4, 2)
+		ctx:set_source_rgba (.4, .4, .4, 1.0)
+		if (logscale) then
+			gridline (ctx, x, xr, h, ARDOUR.DSP.log_meter(-18))
+			gridline (ctx, x, xr, h, ARDOUR.DSP.log_meter(-6))
+			ctx:set_dash (dash3, 2)
+			ctx:set_source_rgba (.5, .1, .1, 1.0)
+			gridline (ctx, x, xr, h, ARDOUR.DSP.log_meter(-3))
+		else
+			gridline (ctx, x, xr, h, .1258)
+			gridline (ctx, x, xr, h, .5)
+			ctx:set_dash (dash3, 2)
+			ctx:set_source_rgba (.5, .1, .1, 1.0)
+			gridline (ctx, x, xr, h, .7079)
+		end
+		ctx:unset_dash ()
+		ctx:set_source_rgba (.5, .1, .1, 0.7)
+		gridline (ctx, x, xr, h, 1)
+
+
+		-- prepare waveform display drawing
+		ctx:set_source_rgba (.8, .8, .8, .7)
+		ctx:save ()
+		ctx:rectangle (math.floor (x - xr), 0, math.ceil (2 * xr), h)
+		ctx:clip ()
+
+		local chn_off = 4 + buf_size * (c - 1)
+		local buf_off = read_ptr;
+
+		-- iterate over every y-axis pixel
+		for y = 1, h - 1 do
+			local s_min = 0
+			local s_max = 0
+			-- calc min/max values for given range
+			if (buf_off + spp < buf_size) then
+				_, s_min, s_max = table.unpack (ARDOUR.DSP.peaks (shmem:to_float (chn_off + buf_off), s_min, s_max, spp))
+			else
+				local r0 = buf_size - buf_off;
+				_, s_min, s_max = table.unpack (ARDOUR.DSP.peaks (shmem:to_float (chn_off + buf_off), s_min, s_max, r0))
+				_, s_min, s_max = table.unpack (ARDOUR.DSP.peaks (shmem:to_float (chn_off)          , s_min, s_max, spp - r0))
+			end
+			buf_off = (buf_off + spp) % buf_size;
+
+			if (logscale) then
+				s_max = ARDOUR.DSP.log_meter_coeff (s_max)
+				s_min = - ARDOUR.DSP.log_meter_coeff (-s_min)
+			end
+
+			ctx:move_to (x + s_min * xr, h - y + .5)
+			ctx:line_to (x + s_max * xr, h - y + .5)
+		end
+		ctx:stroke ()
+		ctx:restore ()
+	end
+	return {w, h}
+end
diff --git a/scripts/spectrogram.lua b/scripts/spectrogram.lua
new file mode 100644
index 0000000..4f55a65
--- /dev/null
+++ b/scripts/spectrogram.lua
@@ -0,0 +1,330 @@
+ardour {
+	["type"]    = "dsp",
+	name        = "a-Inline Spectrogram",
+	category    = "Visualization",
+	license     = "MIT",
+	author      = "Ardour Team",
+	description = [[Mixer strip inline spectrum display]]
+}
+
+-- return possible i/o configurations
+function dsp_ioconfig ()
+	-- -1, -1 = any number of channels as long as input and output count matches
+	return { [1] = { audio_in = -1, audio_out = -1}, }
+end
+
+function dsp_params ()
+	return
+	{
+		{ ["type"] = "input", name = "Logscale", min = 0, max = 1, default = 0, toggled = true },
+		{ ["type"] = "input", name = "1/f scale", min = 0, max = 1, default = 1, toggled = true },
+		{ ["type"] = "input", name = "FFT Size", min = 0, max = 4, default = 3, enum = true, scalepoints =
+			{
+				["512"]  = 0,
+				["1024"] = 1,
+				["2048"] = 2,
+				["4096"] = 3,
+				["8192"] = 4,
+			}
+		},
+		{ ["type"] = "input", name = "Height (Aspect)", min = 0, max = 3, default = 1, enum = true, scalepoints =
+			{
+				["Min"] = 0,
+				["16:10"] = 1,
+				["1:1"] = 2,
+				["Max"] = 3
+			}
+		},
+		{ ["type"] = "input", name = "Range", min = 20, max = 160, default = 60, unit="dB"},
+		{ ["type"] = "input", name = "Offset", min = -40, max = 40, default = 0, unit="dB"},
+	}
+end
+
+-- a C memory area.
+-- It needs to be in global scope.
+-- When the variable is set to nil, the allocated memory is free()ed.
+-- the memory can be interpeted as float* for use in DSP, or read/write
+-- to a C++ Ringbuffer instance.
+-- http://manual.ardour.org/lua-scripting/class_reference/#ARDOUR:DSP:DspShm
+local cmem = nil
+
+function dsp_init (rate)
+	-- global variables (DSP part only)
+	dpy_hz = rate / 25
+	dpy_wr = 0
+
+	-- create a ringbuffer to hold (float) audio-data
+	-- http://manual.ardour.org/lua-scripting/class_reference/#PBD:RingBufferF
+	rb = PBD.RingBufferF (2 * rate)
+
+	-- allocate memory, local mix buffer
+	cmem = ARDOUR.DSP.DspShm (8192)
+
+	-- create a table of objects to share with the GUI
+	local tbl = {}
+	tbl['rb'] = rb;
+	tbl['samplerate'] = rate
+
+	-- "self" is a special DSP variable referring
+	-- to the plugin instance itself.
+	--
+	-- "table()" is-a http://manual.ardour.org/lua-scripting/class_reference/#ARDOUR.LuaTableRef
+	-- which allows to store/retrieve lua-tables to share them other interpreters
+	self:table ():set (tbl);
+end
+
+-- "dsp_runmap" uses Ardour's internal processor API, eqivalent to
+-- 'connect_and_run()". There is no overhead (mapping, translating buffers).
+-- The lua implementation is responsible to map all the buffers directly.
+function dsp_runmap (bufs, in_map, out_map, n_samples, offset)
+	-- here we sum all audio input channels channels and then copy the data to a ringbuffer
+	-- for the GUI to process later
+
+	local audio_ins = in_map:count (): n_audio () -- number of audio input buffers
+	local ccnt = 0 -- processed channel count
+	local mem = cmem:to_float(0) -- a "FloatArray", float* for direct C API usage from the previously allocated buffer
+	for c = 1,audio_ins do
+		-- see http://manual.ardour.org/lua-scripting/class_reference/#ARDOUR:ChanMapping
+		-- Note: lua starts counting at 1, ardour's ChanMapping::get() at 0
+		local ib = in_map:get (ARDOUR.DataType ("audio"), c - 1) -- get index of mapped input buffer
+		local ob = out_map:get (ARDOUR.DataType ("audio"), c - 1) -- get index of mapped output buffer
+
+		-- check if the input is connected to a buffer
+		if (ib ~= ARDOUR.ChanMapping.Invalid) then
+
+			-- http://manual.ardour.org/lua-scripting/class_reference/#ARDOUR:AudioBuffer
+			-- http://manual.ardour.org/lua-scripting/class_reference/#ARDOUR:DSP
+			if c == 1 then
+				-- first channel, copy as-is
+				ARDOUR.DSP.copy_vector (mem, bufs:get_audio (ib):data (offset), n_samples)
+			else
+				-- all other channels, add to existing data.
+				ARDOUR.DSP.mix_buffers_no_gain (mem, bufs:get_audio (ib):data (offset), n_samples)
+			end
+			ccnt = ccnt + 1;
+
+			-- copy data to output (if not processing in-place)
+			if (ob ~= ARDOUR.ChanMapping.Invalid and ib ~= ob) then
+				ARDOUR.DSP.copy_vector (bufs:get_audio (ob):data (offset), bufs:get_audio (ib):data (offset), n_samples)
+			end
+		end
+	end
+
+	-- Clear unconnected output buffers.
+	-- In case we're processing in-place some buffers may be identical,
+	-- so this must be done  *after processing*.
+	for c = 1,audio_ins do
+		local ib = in_map:get (ARDOUR.DataType ("audio"), c - 1)
+		local ob = out_map:get (ARDOUR.DataType ("audio"), c - 1)
+		if (ib == ARDOUR.ChanMapping.Invalid and ob ~= ARDOUR.ChanMapping.Invalid) then
+			bufs:get_audio (ob):silence (n_samples, offset)
+		end
+	end
+
+	-- Normalize gain (1 / channel-count)
+	if ccnt > 1 then
+		ARDOUR.DSP.apply_gain_to_buffer (mem, n_samples, 1 / ccnt)
+	end
+
+	-- if no channels were processed, feed silence.
+	if ccnt == 0 then
+		ARDOUR.DSP.memset (mem, 0, n_samples)
+	end
+
+	-- write data to the ringbuffer
+	-- http://manual.ardour.org/lua-scripting/class_reference/#PBD:RingBufferF
+	rb:write (mem, n_samples)
+
+	-- emit QueueDraw every FPS
+	-- TODO: call every FFT window-size worth of samples, at most every FPS
+	dpy_wr = dpy_wr + n_samples
+	if (dpy_wr > dpy_hz) then
+		dpy_wr = dpy_wr % dpy_hz
+		self:queue_draw ()
+	end
+end
+
+----------------------------------------------------------------
+-- GUI
+
+local fft = nil
+local read_ptr = 0
+local line = 0
+local img = nil
+local fft_size = 0
+local last_log = false
+
+function render_inline (ctx, w, max_h)
+	local ctrl = CtrlPorts:array () -- get control port array (read/write)
+	local tbl = self:table ():get () -- get shared memory table
+	local rate = tbl['samplerate']
+	if not cmem then
+		cmem = ARDOUR.DSP.DspShm (0)
+	end
+
+	-- get settings
+	local logscale = ctrl[1] or 0; logscale = logscale > 0 -- x-axis logscale
+	local pink = ctrl[2] or 0; pink = pink > 0 -- 1/f scale
+	local fftsizeenum = ctrl[3] or 3 -- fft-size enum
+	local hmode = ctrl[4] or 1 -- height mode enum
+	local dbrange = ctrl[5] or 60
+	local gaindb = ctrl[6] or 0
+
+	local fftsize
+	if fftsizeenum == 0 then fftsize = 512
+	elseif fftsizeenum == 1 then fftsize = 1024
+	elseif fftsizeenum == 2 then fftsize = 2048
+	elseif fftsizeenum == 4 then fftsize = 8192
+	else fftsize = 4096
+	end
+
+	if fftsize ~= fft_size then
+		fft_size = fftsize
+		fft = nil
+	end
+
+	if dbrange < 20 then dbrange = 20; end
+	if dbrange > 160 then dbrange = 160; end
+	if gaindb < -40 then dbrange = -40; end
+	if gaindb >  40 then dbrange =  40; end
+
+
+	if not fft then
+		fft = ARDOUR.DSP.FFTSpectrum (fft_size, rate)
+		cmem:allocate (fft_size)
+	end
+
+	if last_log ~= logscale then
+		last_log = logscale
+		img = nil
+		line = 0
+	end
+
+	-- calc height
+	if hmode == 0 then
+		h = math.ceil (w * 10 / 16)
+		if (h > 44) then
+			h = 44
+		end
+	elseif (hmode == 2) then
+		h = w
+	elseif (hmode == 3) then
+		h = max_h
+	else
+		h = math.ceil (w * 10 / 16)
+	end
+	if (h > max_h) then
+		h = max_h
+	end
+
+	-- re-create image surface
+	if not img or img:get_width() ~= w or img:get_height () ~= h then
+		img = Cairo.ImageSurface (Cairo.Format.ARGB32, w, h)
+		line = 0
+	end
+	local ictx = img:context ()
+
+	local bins = fft_size / 2 - 1 -- fft bin count
+	local bpx = bins / w  -- bins per x-pixel (linear)
+	local fpb = rate / fft_size -- freq-step per bin
+	local f_e = rate / 2 / fpb -- log-scale exponent
+	local f_b = w / math.log (fft_size / 2) -- inverse log-scale base
+	local f_l = math.log (fft_size / rate) * f_b -- inverse logscale lower-bound
+
+	local rb = tbl['rb'];
+	local mem = cmem:to_float (0)
+
+	while (rb:read_space() >= fft_size) do
+		-- process one line / buffer
+		rb:read (mem, fft_size)
+		fft:set_data_hann (mem, fft_size, 0)
+		fft:execute ()
+
+		-- draw spectrum
+		assert (bpx >= 1)
+
+		-- scroll
+		if line == 0 then line = h - 1; else line = line - 1; end
+
+		-- clear this line
+		ictx:set_source_rgba (0, 0, 0, 1)
+		ictx:rectangle (0, line, w, 1)
+		ictx:fill ()
+
+		for x = 0, w - 1 do
+			local pk = 0
+			local b0, b1
+			if logscale then
+				-- 20 .. 20k
+				b0 = math.floor (f_e ^ (x / w))
+				b1 = math.floor (f_e ^ ((x + 1) / w))
+			else
+				b0 = math.floor (x * bpx)
+				b1 = math.floor ((x + 1) * bpx)
+			end
+
+			if b1 >= b0 and b1 <= bins and b0 >= 0 then
+				for i = b0, b1 do
+					local level = gaindb + fft:power_at_bin (i, pink and i or 1) -- pink ? i : 1
+					if level > -dbrange then
+						local p = (dbrange + level) / dbrange
+						if p > pk then pk = p; end
+					end
+				end
+			end
+			if pk > 0.0 then
+				if pk > 1.0 then pk = 1.0; end
+				ictx:set_source_rgba (ARDOUR.LuaAPI.hsla_to_rgba (.70 - .72 * pk, .9, .3 + pk * .4));
+				ictx:rectangle (x, line, 1, 1)
+				ictx:fill ()
+			end
+		end
+	end
+
+	-- copy image surface
+	if line == 0 then
+		img:set_as_source (ctx, 0, 0)
+		ctx:rectangle (0, 0, w, h)
+		ctx:fill ()
+	else
+		local yp = h - line - 1;
+		img:set_as_source (ctx, 0, yp)
+		ctx:rectangle (0, yp, w, line)
+		ctx:fill ()
+
+		img:set_as_source (ctx, 0, -line)
+		ctx:rectangle (0, 0, w, yp)
+		ctx:fill ()
+	end
+
+
+	-- draw grid on top
+	function x_at_freq (f)
+		if logscale then
+			return f_l + f_b * math.log (f)
+		else
+			return 2 * w * f / rate;
+		end
+	end
+
+	function grid_freq (f)
+		-- draw vertical grid line
+		local x = .5 + math.floor (x_at_freq (f))
+		ctx:move_to (x, 0)
+		ctx:line_to (x, h)
+		ctx:stroke ()
+	end
+
+	-- draw grid on top
+	local dash3 = C.DoubleVector ()
+	dash3:add ({1, 3})
+	ctx:set_line_width (1.0)
+	ctx:set_dash (dash3, 2) -- dotted line
+	ctx:set_source_rgba (.5, .5, .5, .8)
+	grid_freq (100)
+	grid_freq (1000)
+	grid_freq (10000)
+	ctx:unset_dash ()
+
+	return {w, h}
+end
diff --git a/scripts/split_all_markers.lua b/scripts/split_all_markers.lua
new file mode 100644
index 0000000..8c4cdb1
--- /dev/null
+++ b/scripts/split_all_markers.lua
@@ -0,0 +1,70 @@
+ardour { ["type"] = "EditorAction", name = "Marker Split",
+	license     = "MIT",
+	author      = "Ardour Team",
+	description = [[Split regions on selected tracks at all locations markers]]
+}
+
+function factory (params) return function ()
+
+	local loc = Session:locations () -- all marker locations
+
+	-- http://manual.ardour.org/lua-scripting/class_reference/#ArdourUI:Selection
+	local sel = Editor:get_selection ()
+
+	-- prepare undo operation
+	-- see http://manual.ardour.org/lua-scripting/class_reference/#ARDOUR:Session
+	Session:begin_reversible_command ("Auto Region Split")
+	local add_undo = false -- keep track if something has changed
+
+	-- Track/Bus Selection -- iterate over all Editor-GUI selected tracks
+	-- http://manual.ardour.org/lua-scripting/class_reference/#ArdourUI:TrackSelection
+	for r in sel.tracks:routelist ():iter () do
+		-- each of the items 'r' is-a
+		-- http://manual.ardour.org/lua-scripting/class_reference/#ARDOUR:Route
+
+		local track = r:to_track () -- see if it's a track
+		if track:isnil () then
+			-- if not, skip it
+			goto continue
+		end
+
+		-- get track's playlist
+		-- http://manual.ardour.org/lua-scripting/class_reference/#ARDOUR:Playlist
+		local playlist = track:playlist ()
+
+		-- clear existing changes, prepare "diff" of state for undo
+		playlist:to_stateful ():clear_changes ()
+
+		-- iterate over all location markers
+		for l in loc:list ():iter () do
+			if l:is_mark() then
+				-- get all regions on the given track's playlist (may be stacked)
+				for reg in playlist:regions_at (l:start ()):iter () do
+					playlist:split_region (reg, l:start (), 0)
+					-- the above operation will invalidate the playlist's region list:
+					-- split creates 2 new regions.
+					--
+					-- Hence this script does it the way it does: the inner-most loop
+					-- is over playlist-regions.
+				end
+			end
+		end
+
+		-- collect undo data
+		if not Session:add_stateful_diff_command (playlist:to_statefuldestructible ()):empty () then
+			-- is something has changed, we need to save it at the end.
+			add_undo = true
+		end
+
+		::continue::
+	end
+
+	-- all done, commit the combined Undo Operation
+	if add_undo then
+		-- the 'nil' Command here mean to use the collected diffs added above
+		Session:commit_reversible_command (nil)
+	else
+		Session:abort_reversible_command ()
+	end
+
+end end
diff --git a/scripts/stop_at_marker.lua b/scripts/stop_at_marker.lua
new file mode 100644
index 0000000..f710a9f
--- /dev/null
+++ b/scripts/stop_at_marker.lua
@@ -0,0 +1,40 @@
+ardour {
+	["type"]    = "session",
+	name        = "Stop at Marker",
+	license     = "MIT",
+	author      = "Ardour Lua Task Force",
+	description = [[An example session script which stops the transport on every location marker when rolling forward.]]
+}
+
+function factory ()
+	return function (n_samples)
+		if (not Session:transport_rolling ()) then
+			-- not rolling, nothing to do.
+			return
+		end
+
+		local pos = Session:transport_frame () -- current playhead position
+		local loc = Session:locations () -- all marker locations
+
+		-- find first marker after the current playhead position, ignore loop + punch ranges
+		-- (this only works when rolling forward, to extend this example see
+		-- http://manual.ardour.org/lua-scripting/class_reference/#ARDOUR:Locations )
+		local m = loc:first_mark_after (pos, false)
+
+		if (m == -1) then
+			-- no marker was found
+			return
+		end
+
+		-- since ardour may split the process cycle for events,
+		-- n_samples may be smaller.
+		local blk = Session:get_block_size ()
+
+		-- transport stop can only happen on a process-cycle boundary.
+		-- This callback happens from within the process callback,
+		-- so we need to queue it ahead of time.
+		if (pos + n_samples + blk >= m and pos + n_samples < m) then
+			Session:request_transport_speed (0.0, true)
+		end
+	end
+end
diff --git a/scripts/synth1.lua b/scripts/synth1.lua
new file mode 100644
index 0000000..2a8288b
--- /dev/null
+++ b/scripts/synth1.lua
@@ -0,0 +1,100 @@
+ardour {
+	["type"]    = "dsp",
+	name        = "Simple Synth",
+	category    = "Instrument",
+	license     = "MIT",
+	author      = "Ardour Lua Task Force",
+	description = [[An Example Synth for Prototyping.]]
+}
+
+function dsp_ioconfig ()
+	return
+	{
+	--	{ midi_in = 1, audio_in = 0, audio_out = -1}, -- any number of channels
+	--	{ midi_in = 1, audio_in = 0, audio_out =  1}, -- values >  0, precisely N channels
+		{ midi_in = 1, audio_in = 0, audio_out =  2}, -- values >  0, precisely N channels
+		{ midi_in = 1, audio_in = 0, audio_out =  4}, -- values >  0, precisely N channels
+		{ midi_in = 1, audio_in = 0, audio_out =  8}, -- values >  0, precisely N channels
+	--	{ midi_in = 1, audio_in = 0, audio_out = -6}, -- values < -2, up to -N channels, here 1,..,6
+	}
+end
+
+local note_table = {}
+local active_notes = {}
+local phases = {}
+local env = .01;
+
+function dsp_init (rate)
+	for n = 1,128 do
+		note_table [n] = (440 / 32) * 2^((n - 10.0) / 12.0) / rate
+	end
+	env = 100 / rate
+end
+
+function dsp_run (ins, outs, n_samples)
+	-- initialize output buffer
+	local a = {}
+	for s = 1, n_samples do a[s] = 0 end
+
+
+	-- very basic synth, simple sine, basic envelope
+	local function synth (s_start, s_end)
+		for n,v in pairs (active_notes) do
+			local vel = v["vel"] or 0
+			local tgt = v["tvel"];
+			for s = s_start,s_end do
+				local phase = phases[n] or 0
+				vel = vel + env * (tgt - vel)
+				a[s] = a[s] + math.sin(6.283185307 * phase) * vel / 167
+				phase = phase + note_table[n]
+				if (phase > 1.0) then
+					phases[n] = phase - 2.0
+				else
+					phases[n] = phase
+				end
+			end
+			if vel < 1 and tgt == 0 then
+				active_notes[n] = nil
+			else
+				active_notes[n]["vel"] = vel;
+			end
+		end
+	end
+
+	local tme = 1
+	-- parse midi messages
+	assert (type(midiin) == "table") -- global table of midi events (for now)
+	for _,b in pairs (midiin) do
+		local t = b["time"] -- t = [ 1 .. n_samples ]
+
+		-- synth sound until event
+		synth(tme, t)
+		tme = t + 1
+
+		local d = b["data"] -- get midi-event
+		-- we ignore the midi channel
+		if (#d == 3 and bit32.band (d[1], 240) == 144) then -- note on
+			local n = 1 + d[2];
+			active_notes[n] = active_notes[n] or {}
+			active_notes[n]["tvel"] = d[3]
+		end
+		if (#d == 3 and bit32.band (d[1], 240) == 128) then -- note off
+			local n = 1 + d[2];
+			active_notes[n] = active_notes[n] or {}
+			active_notes[n]["tvel"] = 0
+		end
+		if (#d == 3 and bit32.band (d[1], 240) == 176) then -- CC
+			if (d[2] == 120 or d[2] == 123) then -- panic
+				active_notes = {}
+			end
+		end
+	end
+
+	-- synth rest of cycle
+	synth(tme, n_samples)
+
+	-- copy
+	for c = 1,#outs do
+		outs[c]:set_table(a, n_samples)
+	end
+end
diff --git a/scripts/tomsloop.lua b/scripts/tomsloop.lua
new file mode 100644
index 0000000..0f424e7
--- /dev/null
+++ b/scripts/tomsloop.lua
@@ -0,0 +1,125 @@
+ardour { ["type"] = "EditorAction", name = "Tom's Loop",
+	license     = "MIT",
+	author      = "Ardour Team",
+	description = [[Bounce the loop-range of all non muted audio tracks, paste N times at playhead]]
+}
+
+function action_params ()
+	return { ["times"]   = { title = "Number of copies to add", default = "1"}, }
+end
+
+function factory (params) return function ()
+	-- get options
+	local p = params or {}
+	local n_paste  = tonumber (p["times"] or 1)
+	assert (n_paste > 0)
+
+	local proc     = ARDOUR.LuaAPI.nil_proc () -- bounce w/o processing
+	local itt      = ARDOUR.InterThreadInfo () -- bounce progress info (unused)
+
+	local loop     = Session:locations ():auto_loop_location ()
+	local playhead = Session:transport_frame ()
+
+	-- make sure we have a loop, and the playhead (edit point) is after it
+	if not loop then
+		print ("A Loop range must be set.")
+		goto errorout
+	end
+	assert (loop:start () < loop:_end ())
+	if loop:_end () >= playhead then
+		print ("The Playhead (paste point) needs to be after the loop.")
+		goto errorout
+	end
+
+	-- prepare undo operation
+	Session:begin_reversible_command ("Tom's Loop")
+	local add_undo = false -- keep track if something has changed
+
+	-- prefer solo'ed tracks
+	local soloed_track_found = false
+	for route in Session:get_tracks ():iter () do
+		if route:soloed () then
+			soloed_track_found = true
+			break
+		end
+	end
+
+	-- count regions that are bounced
+	local n_regions_created = 0
+
+	-- loop over all tracks in the session
+	for route in Session:get_tracks ():iter () do
+		if soloed_track_found then
+			-- skip not soloed tracks
+			if not route:soloed () then
+				goto continue
+			end
+		end
+
+		-- skip muted tracks (also applies to soloed + muted)
+		if route:muted () then
+			goto continue
+		end
+
+		-- at this point the track is either soloed (if at least one track is soloed)
+		-- or not muted (if no track is soloed)
+
+		-- test if bouncing is possible
+		local track = route:to_track ()
+		if not track:bounceable (proc, false) then
+			goto continue
+		end
+
+		-- only audio tracks
+		local playlist = track:playlist ()
+		if playlist:data_type ():to_string () ~= "audio" then
+			goto continue
+		end
+
+		-- check if there is at least one unmuted region in the loop-range
+		local reg_unmuted_count = 0
+		for reg in playlist:regions_touched (loop:start (), loop:_end ()):iter () do
+			if not reg:muted() then
+				reg_unmuted_count = reg_unmuted_count + 1
+			end
+		end
+
+		if reg_unmuted_count < 1 then
+			goto continue
+		end
+
+		-- clear existing changes, prepare "diff" of state for undo
+		playlist:to_stateful ():clear_changes ()
+
+		-- do the actual work
+		local region = track:bounce_range (loop:start (), loop:_end (), itt, proc, false)
+		playlist:add_region (region, playhead, n_paste, false)
+
+		n_regions_created = n_regions_created + 1
+
+		-- create a diff of the performed work, add it to the session's undo stack
+		-- and check if it is not empty
+		if not Session:add_stateful_diff_command (playlist:to_statefuldestructible ()):empty () then
+			add_undo = true
+		end
+
+		::continue::
+	end
+
+	--advance playhead so it's just after the newly added regions
+	if n_regions_created > 0 then
+		Session:request_locate((playhead + loop:length() * n_paste),false)
+	end
+
+	-- all done, commit the combined Undo Operation
+	if add_undo then
+		-- the 'nil' Command here mean to use the collected diffs added above
+		Session:commit_reversible_command (nil)
+	else
+		Session:abort_reversible_command ()
+	end
+
+	print ("bounced " .. n_regions_created .. " regions from loop range (" .. loop:length() ..  " frames) to playhead @ frame # " .. playhead)
+
+	::errorout::
+end end
diff --git a/scripts/voice_activate.lua b/scripts/voice_activate.lua
new file mode 100644
index 0000000..64c1ba0
--- /dev/null
+++ b/scripts/voice_activate.lua
@@ -0,0 +1,53 @@
+ardour {
+	["type"]    = "dsp",
+	name        = "Voice/Level Activate",
+	category    = "Utility",
+	author      = "Ardour Lua Task Force",
+	license     = "MIT",
+	description = [[Roll the transport when the signal level on the plugin's input exceeds a given threshold.]]
+}
+
+function dsp_ioconfig ()
+	return
+	{
+		-- support all in/out as long as input port count equals output port count
+		{ audio_in = -1, audio_out = -1},
+	}
+end
+
+function dsp_params ()
+	return
+	{
+		{ ["type"] = "input", name = "Threshold", min = -20, max = 0, default = -6, doc = "Threshold in dBFS for all channels" },
+		{ ["type"] = "output", name = "Level", min = -120, max = 0 },
+	}
+end
+
+function dsp_configure (ins, outs)
+	n_channels = ins:n_audio()
+end
+
+function dsp_runmap (bufs, in_map, out_map, n_samples, offset)
+	local ctrl = CtrlPorts:array() -- get control port array (read/write)
+
+	if Session:transport_rolling() then
+		-- don't do anything if the transport is already rolling
+		ctrl[2] = -math.huge -- set control output port value
+		return
+	end
+
+	local threshold = 10 ^ (.05 * ctrl[1]) -- dBFS to coefficient
+	local level = -math.huge
+
+	for c = 1,n_channels do
+		local b = in_map:get(ARDOUR.DataType("audio"), c - 1) -- get id of audio-buffer for the given channel
+		if b ~= ARDOUR.ChanMapping.Invalid then -- check if channel is mapped
+			local a = ARDOUR.DSP.compute_peak(bufs:get_audio(b):data(offset), n_samples, 0) -- compute digital peak
+			if a > threshold then
+					Session:request_transport_speed(1.0, true)
+			end
+			if a > level then level = a end -- max level of all channels
+		end
+	end
+	ctrl[2] = ARDOUR.DSP.accurate_coefficient_to_dB (level) -- set control output port value
+end
diff --git a/scripts/wscript b/scripts/wscript
new file mode 100644
index 0000000..a820a1f
--- /dev/null
+++ b/scripts/wscript
@@ -0,0 +1,16 @@
+#!/usr/bin/python
+
+import os
+
+top = '.'
+out = 'build'
+
+def configure(conf):
+    pass
+
+def build(bld):
+    scripts = bld.path.ant_glob ('*.lua', excl=['^_*'])
+    bld.install_files (os.path.join(bld.env['DATADIR'], 'scripts'), scripts)
+
+def options(opt):
+    pass
diff --git a/session_utils/common.cc b/session_utils/common.cc
index 9353c76..8d1cdec 100644
--- a/session_utils/common.cc
+++ b/session_utils/common.cc
@@ -86,7 +86,7 @@ class MyEventLoop : public sigc::trackable, public EventLoop
 static MyEventLoop *event_loop;
 
 void
-SessionUtils::init ()
+SessionUtils::init (bool print_log)
 {
 	if (!ARDOUR::init (false, true, localedir)) {
 		cerr << "Ardour failed to initialize\n" << endl;
@@ -97,10 +97,12 @@ SessionUtils::init ()
 	EventLoop::set_event_loop_for_thread (event_loop);
 	SessionEvent::create_per_thread_pool ("util", 512);
 
-	test_receiver.listen_to (error);
-	test_receiver.listen_to (info);
-	test_receiver.listen_to (fatal);
-	test_receiver.listen_to (warning);
+	if (print_log) {
+		test_receiver.listen_to (error);
+		test_receiver.listen_to (info);
+		test_receiver.listen_to (fatal);
+		test_receiver.listen_to (warning);
+	}
 }
 
 // TODO return NULL, rather than exit() ?!
@@ -113,6 +115,9 @@ static Session * _load_session (string dir, string state)
 		::exit (EXIT_FAILURE);
 	}
 
+	engine->set_input_channels (256);
+	engine->set_output_channels (256);
+
 	float sr;
 	SampleFormat sf;
 
@@ -120,18 +125,18 @@ static Session * _load_session (string dir, string state)
 	if (Session::get_info_from_path (s, sr, sf) == 0) {
 		if (engine->set_sample_rate (sr)) {
 			std::cerr << "Cannot set session's samplerate.\n";
-			::exit (EXIT_FAILURE);
+			return 0;
 		}
 	} else {
 		std::cerr << "Cannot get samplerate from session.\n";
-		::exit (EXIT_FAILURE);
+		return 0;
 	}
 
 	init_post_engine ();
 
 	if (engine->start () != 0) {
 		std::cerr << "Cannot start Audio/MIDI engine\n";
-		::exit (EXIT_FAILURE);
+		return 0;
 	}
 
 	Session* session = new Session (*engine, dir, state);
@@ -140,7 +145,7 @@ static Session * _load_session (string dir, string state)
 }
 
 Session *
-SessionUtils::load_session (string dir, string state)
+SessionUtils::load_session (string dir, string state, bool exit_at_failure)
 {
 	Session* s = 0;
 	try {
@@ -158,6 +163,9 @@ SessionUtils::load_session (string dir, string state)
 		cerr << "unknown exception.\n";
 		::exit (EXIT_FAILURE);
 	}
+	if (!s && exit_at_failure) {
+		::exit (EXIT_FAILURE);
+	}
 	return s;
 }
 
diff --git a/session_utils/common.h b/session_utils/common.h
index 5263e84..fcfd043 100644
--- a/session_utils/common.h
+++ b/session_utils/common.h
@@ -16,7 +16,7 @@ class TestReceiver : public Receiver
 namespace SessionUtils {
 
 	/** initialize libardour */
-	void init ();
+	void init (bool print_log = true);
 
 	/** clean up, stop Processing Engine
 	 * @param s Session to close (may me NULL)
@@ -26,7 +26,7 @@ namespace SessionUtils {
 	/** @param dir Session directory.
 	 *  @param state Session state file, without .ardour suffix.
 	 */
-	ARDOUR::Session * load_session (std::string dir, std::string state);
+	ARDOUR::Session * load_session (std::string dir, std::string state, bool exit_at_failure = true);
 
 	/** close session and stop engine
 	 * @param s Session to close (may me NULL)
diff --git a/session_utils/copy-mixer.cc b/session_utils/copy-mixer.cc
new file mode 100644
index 0000000..825b4e0
--- /dev/null
+++ b/session_utils/copy-mixer.cc
@@ -0,0 +1,360 @@
+#include <iostream>
+#include <cstdlib>
+#include <getopt.h>
+#include <glibmm.h>
+
+#include "pbd/basename.h"
+#include "pbd/stateful.h"
+#include "ardour/filename_extensions.h"
+#include "ardour/send.h"
+#include "ardour/track.h"
+
+#include "common.h"
+
+#define X_(Text) Text
+
+using namespace std;
+using namespace ARDOUR;
+using namespace SessionUtils;
+
+static bool opt_debug_dump = false;
+static bool opt_copy_busses = false;
+static bool opt_verbose = false;
+static bool opt_log = false;
+
+/* this is copied from  Session::new_route_from_template */
+static void
+trim_state_for_mixer_copy (Session*s, XMLNode& node)
+{
+	/* trim bitslots from listen sends so that new ones are used */
+	XMLNodeList children = node.children ();
+	for (XMLNodeList::iterator i = children.begin (); i != children.end (); ++i) {
+		if ((*i)->name() == X_("Processor")) {
+			/* ForceIDRegeneration does not catch the following */
+			XMLProperty const * role = (*i)->property (X_("role"));
+			XMLProperty const * type = (*i)->property (X_("type"));
+			if (role && role->value () == X_("Aux")) {
+				/* check if the target bus exists,
+				 * HERE: we use the bus-name (not target-id)
+				 */
+				XMLProperty const * target = (*i)->property (X_("name"));
+				if (!target) {
+					(*i)->add_property ("type", "dangling-aux-send");
+					continue;
+				}
+				boost::shared_ptr<Route> r = s->route_by_name (target->value ());
+				if (!r || boost::dynamic_pointer_cast<Track> (r)) {
+					(*i)->add_property ("type", "dangling-aux-send");
+					continue;
+				}
+				(*i)->add_property ("target", r->id ().to_s ());
+			}
+			if (role && role->value () == X_("Listen")) {
+				(*i)->remove_property (X_("bitslot"));
+			}
+			else if (role && (role->value () == X_("Send") || role->value () == X_("Aux"))) {
+				char buf[32];
+				Delivery::Role xrole;
+				uint32_t bitslot = 0;
+				xrole = Delivery::Role (string_2_enum (role->value (), xrole));
+				std::string name = Send::name_and_id_new_send (*s, xrole, bitslot, false);
+				snprintf (buf, sizeof (buf), "%" PRIu32, bitslot);
+				(*i)->remove_property (X_("bitslot"));
+				(*i)->remove_property (X_("name"));
+				(*i)->add_property ("bitslot", buf);
+				(*i)->add_property ("name", name);
+			}
+			else if (type && type->value () == X_("intreturn")) {
+				// ignore, in case bus existed in old session,
+				// tracks in old session may be connected to it.
+				// if the bus is new, new_route_from_template()
+				// will have re-created an ID.
+				(*i)->add_property ("type", "ignore-aux-return");
+			}
+			else if (type && type->value () == X_("return")) {
+				// Return::set_state() generates a new one
+				(*i)->remove_property (X_("bitslot"));
+			}
+			else if (type && type->value () == X_("port")) {
+				// PortInsert::set_state() handles the bitslot
+				(*i)->remove_property (X_("bitslot"));
+				(*i)->add_property ("ignore-name", "1");
+			}
+		}
+	}
+}
+
+static void
+copy_mixer_settings (Session*s, boost::shared_ptr<Route> dst, XMLNode& state)
+{
+	PBD::Stateful::ForceIDRegeneration force_ids;
+
+	trim_state_for_mixer_copy (s, state);
+	state.remove_nodes_and_delete ("Diskstream");
+	state.remove_nodes_and_delete ("Automation");
+	if (opt_debug_dump) {
+		state.dump (cout);
+	}
+
+	dst->set_state (state, PBD::Stateful::loading_state_version);
+}
+
+static int
+copy_session_routes (
+		const std::string& src_path, const std::string& src_name,
+		const std::string& dst_path, const std::string& dst_load, const std::string& dst_save)
+{
+	SessionUtils::init (opt_log);
+	Session* s = 0;
+
+	typedef std::map<std::string,XMLNode*> StateMap;
+	StateMap routestate;
+	StateMap buslist;
+
+	s = SessionUtils::load_session (src_path, src_name, false);
+
+	if (!s) {
+		fprintf (stderr, "Cannot load source session %s/%s.\n", src_path.c_str (), src_name.c_str ());
+		SessionUtils::cleanup ();
+		return -1;
+	}
+
+	/* get route state from first session */
+	boost::shared_ptr<RouteList> rl = s->get_routes ();
+	for (RouteList::iterator i = rl->begin (); i != rl->end (); ++i) {
+		boost::shared_ptr<Route> r = *i;
+		if (r->is_master () || r->is_monitor () || r->is_auditioner ()) {
+			continue;
+		}
+		XMLNode& state (r->get_state ());
+		routestate[r->name ()] = &state;
+		if (boost::dynamic_pointer_cast<Track> (r)) {
+			continue;
+		}
+		buslist[r->name ()] = &state;
+	}
+	rl.reset ();
+	SessionUtils::unload_session (s);
+
+
+	/* open target session */
+	s = SessionUtils::load_session (dst_path, dst_load);
+	if (!s) {
+		fprintf (stderr, "Cannot load target session %s/%s.\n", dst_path.c_str (), dst_load.c_str ());
+		SessionUtils::cleanup ();
+		return -1;
+	}
+
+	/* iterate over all busses in the src session, add missing ones to target */
+	if (opt_copy_busses) {
+		rl = s->get_routes ();
+		for (StateMap::const_iterator i = buslist.begin (); i != buslist.end (); ++i) {
+			if (s->route_by_name (i->first)) {
+				continue;
+			}
+			XMLNode& rs (*(i->second));
+			s->new_route_from_template (1, rs, rs.property (X_("name"))->value (), NewPlaylist);
+		}
+	}
+
+	/* iterate over all *busses* in the target session.
+	 * setup internal return targets.
+	 */
+	rl = s->get_routes ();
+	for (RouteList::iterator i = rl->begin (); i != rl->end (); ++i) {
+		boost::shared_ptr<Route> r = *i;
+		/* skip special busses */
+		if (r->is_master () || r->is_monitor () || r->is_auditioner ()) {
+			continue;
+		}
+		if (boost::dynamic_pointer_cast<Track> (r)) {
+			continue;
+		}
+		/* find matching route by name */
+		std::map<std::string,XMLNode*>::iterator it = routestate.find (r->name ());
+		if (it == routestate.end ()) {
+			if (opt_verbose) {
+				printf (" -- no match for '%s'\n", (*i)->name ().c_str ());
+			}
+			continue;
+		}
+		if (opt_verbose) {
+			printf ("-- found match '%s'\n", (*i)->name ().c_str ());
+		}
+		XMLNode *state = it->second;
+		// copy state
+		copy_mixer_settings (s, r, *state);
+	}
+
+	/* iterate over all tracks in the target session.. */
+	rl = s->get_routes ();
+	for (RouteList::iterator i = rl->begin (); i != rl->end (); ++i) {
+		boost::shared_ptr<Route> r = *i;
+		/* skip special busses */
+		if (r->is_master () || r->is_monitor () || r->is_auditioner ()) {
+			continue;
+		}
+		if (!boost::dynamic_pointer_cast<Track> (r)) {
+			continue;
+		}
+
+		/* find matching route by name */
+		std::map<std::string,XMLNode*>::iterator it = routestate.find (r->name ());
+		if (it == routestate.end ()) {
+			if (opt_verbose) {
+				printf (" -- no match for '%s'\n", (*i)->name ().c_str ());
+			}
+			continue;
+		}
+		if (opt_verbose) {
+			printf ("-- found match '%s'\n", (*i)->name ().c_str ());
+		}
+		XMLNode *state = it->second;
+		/* copy state */
+		copy_mixer_settings (s, r, *state);
+	}
+
+	s->save_state (dst_save);
+
+	rl.reset ();
+	SessionUtils::unload_session (s);
+
+	// clean up.
+	for (StateMap::iterator i = routestate.begin (); i != routestate.end (); ++i) {
+		XMLNode *state = i->second;
+		delete state;
+	}
+
+	SessionUtils::cleanup ();
+	return 0;
+}
+
+
+static void usage (int status) {
+	// help2man compatible format (standard GNU help-text)
+	printf (UTILNAME " - copy mixer settings from one session to another.\n\n");
+	printf ("Usage: " UTILNAME " [ OPTIONS ] <src> <dst>\n\n");
+
+	printf ("Options:\n\
+  -h, --help                 display this help and exit\n\
+  -b, --bus-copy             add busses present in src to dst\n\
+  -d, --debug                print pre-processed XML for each route\n\
+  -l, --log-messages         display libardour log messages\n\
+  -s, --snapshot <name>      create a new snapshot in dst\n\
+  -v, --verbose              show perfomed copy opeations\n\
+  -V, --version              print version information and exit\n\
+\n");
+
+	printf ("\n\
+This utility copies mixer-settings from the src-session to the dst-session.\n\
+Both <src> and <dst> are paths to .ardour session files.\n\
+If --snapshot is not given, the <dst> session file is overwritten.\n\
+When --snapshot is set, a new snaphot in the <dst> session is created.\n\
+\n");
+
+	printf ("Report bugs to <http://tracker.ardour.org/>\n"
+	        "Website: <http://ardour.org/>\n");
+	::exit (status);
+}
+
+static bool ends_with (std::string const& value, std::string const& ending)
+{
+	if (ending.size() > value.size()) return false;
+	return std::equal(ending.rbegin(), ending.rend(), value.rbegin());
+}
+
+int main (int argc, char* argv[])
+{
+	const char *optstring = "bhls:Vv";
+
+	const struct option longopts[] = {
+		{ "bus-copy",     required_argument, 0, 'b' },
+		{ "debug",        no_argument,       0, 'd' },
+		{ "help",         no_argument,       0, 'h' },
+		{ "log-messages", no_argument,       0, 'l' },
+		{ "snapshot",     no_argument,       0, 's' },
+		{ "version",      no_argument,       0, 'V' },
+		{ "vebose",       no_argument,       0, 'v' },
+	};
+
+	int c = 0;
+	std::string dst_snapshot_name = "";
+
+	while (EOF != (c = getopt_long (argc, argv,
+					optstring, longopts, (int *) 0))) {
+		switch (c) {
+			case 'b':
+				opt_copy_busses = true;
+				break;
+
+			case 'd':
+				opt_debug_dump = true;
+				break;
+
+			case 'h':
+				usage (0);
+				break;
+
+			case 'l':
+				opt_log = true;
+				break;
+
+			case 's':
+				dst_snapshot_name = optarg;
+				break;
+
+			case 'V':
+				printf ("ardour-utils version %s\n\n", VERSIONSTRING);
+				printf ("Copyright (C) GPL 2016 Robin Gareus <robin at gareus.org>\n");
+				exit (0);
+				break;
+
+			case 'v':
+				opt_verbose = true;
+				break;
+
+			default:
+					usage (EXIT_FAILURE);
+					break;
+		}
+	}
+
+	// TODO parse path/name  from a single argument.
+
+	if (optind + 2 > argc) {
+		usage (EXIT_FAILURE);
+	}
+
+	std::string src = argv[optind];
+	std::string dst = argv[optind + 1];
+
+	// statefile_suffix
+
+	if (!ends_with (src, statefile_suffix)) {
+		fprintf (stderr, "source is not a .ardour session file.\n");
+		exit (1);
+	}
+	if (!ends_with (dst, statefile_suffix)) {
+		fprintf (stderr, "target is not a .ardour session file.\n");
+		exit (1);
+	}
+	if (!Glib::file_test (src, Glib::FILE_TEST_IS_REGULAR)) {
+		fprintf (stderr, "source is not a regular file.\n");
+		exit (1);
+	}
+	if (!Glib::file_test (dst, Glib::FILE_TEST_IS_REGULAR)) {
+		fprintf (stderr, "target is not a regular file.\n");
+		exit (1);
+	}
+
+	std::string src_path = Glib::path_get_dirname (src);
+	std::string src_name = PBD::basename_nosuffix (src);
+	std::string dst_path = Glib::path_get_dirname (dst);
+	std::string dst_name = PBD::basename_nosuffix (dst);
+
+	// TODO check if src != dst ..
+	return copy_session_routes (
+			src_path, src_name,
+			dst_path, dst_name,
+			dst_snapshot_name);
+}
diff --git a/session_utils/export.cc b/session_utils/export.cc
index 13f7898..6ea7e2b 100644
--- a/session_utils/export.cc
+++ b/session_utils/export.cc
@@ -124,7 +124,7 @@ static int export_session (Session *session,
 		double progress = 0.0;
 		switch (status->active_job) {
 		case ExportStatus::Normalizing:
-			progress = ((float) status->current_normalize_cycle) / status->total_normalize_cycles;
+			progress = ((float) status->current_postprocessing_cycle) / status->total_postprocessing_cycles;
 			printf ("* Normalizing %.1f%%      \r", 100. * progress); fflush (stdout);
 			break;
 		case ExportStatus::Exporting:
@@ -147,12 +147,12 @@ static int export_session (Session *session,
 
 static void usage (int status) {
 	// help2man compatible format (standard GNU help-text)
-	printf ("export - export an ardour session from the commandline.\n\n");
-	printf ("Usage: export [ OPTIONS ] <session-dir> <session-name>\n\n");
+	printf (UTILNAME " - export an ardour session from the commandline.\n\n");
+	printf ("Usage: " UTILNAME " [ OPTIONS ] <session-dir> <session/snapshot-name>\n\n");
 	printf ("Options:\n\
   -h, --help                 display this help and exit\n\
   -n, --normalize            normalize signal level (to 0dBFS)\n\
-  -o, --output  <file>       set expected [initial] framerate\n\
+  -o, --output  <file>       export output file name\n\
   -s, --samplerate <rate>    samplerate to use (default: 48000)\n\
   -V, --version              print version information and exit\n\
 \n");
diff --git a/session_utils/wscript b/session_utils/wscript
index a001fb9..6218634 100644
--- a/session_utils/wscript
+++ b/session_utils/wscript
@@ -48,13 +48,14 @@ def build_ardour_util(bld, util):
                      ]
     obj.defines = [
         'VERSIONSTRING="' + str(bld.env['VERSION']) + '"',
+        'UTILNAME="'   + str(pgmprefix + '-' + util) + '"',
         'DATA_DIR="'   + os.path.normpath(bld.env['DATADIR']) + '"',
         'CONFIG_DIR="' + os.path.normpath(bld.env['SYSCONFDIR']) + '"',
         'LOCALEDIR="'  + os.path.join(os.path.normpath(bld.env['DATADIR']), 'locale') + '"',
         'PACKAGE="'    + "ARDOURUTILS" + '"',
         ]
     obj.install_path = bld.env['LIBDIR'] + '/utils'
-    obj.uselib       = 'UUID FLAC FONTCONFIG GLIBMM GTHREAD OGG CURL DL'
+    obj.uselib       = 'UUID FLAC FONTCONFIG GLIBMM GTHREAD OGG CURL DL XML'
     obj.uselib       += ' FFTW3F'
     obj.uselib       += ' AUDIOUNITS OSX LO '
     obj.uselib       += ' TAGLIB '
diff --git a/system_config b/system_config
index 02e4f1e..55f3cf5 100644
--- a/system_config
+++ b/system_config
@@ -4,6 +4,7 @@
     <Option name="auto-connect-standard-busses" value="1"/>
     <Option name="output-auto-connect" value="2"/>
     <Option name="input-auto-connect" value="1"/>
+    <Option name="strict-io" value="1"/>
     <Option name="tracks-auto-naming" value="1"/>
     <Option name="trace-midi-input" value="0"/>
     <Option name="trace-midi-output" value="0"/>
@@ -29,7 +30,6 @@
     <Option name="ltc-output-volume" value="0.125893"/>
     <Option name="feedback-interval-ms" value="100"/>
     <Option name="use-tranzport" value="0"/>
-    <Option name="remote-model" value="1"/>
     <Option name="minimum-disk-read-bytes" value="262144"/>
     <Option name="minimum-disk-write-bytes" value="262144"/>
     <Option name="midi-readahead" value="1"/>
@@ -39,6 +39,7 @@
     <Option name="midi-track-buffer-seconds" value="1"/>
     <Option name="disk-choice-space-threshold" value="57600000"/>
     <Option name="auto-analyse-audio" value="0"/>
+    <Option name="transient-sensitivity" value="50"/>
     <Option name="osc-port" value="3819"/>
     <Option name="use-osc" value="0"/>
     <Option name="layer-model" value="1"/>
@@ -72,12 +73,14 @@
     <Option name="click-sound" value=""/>
     <Option name="click-emphasis-sound" value=""/>
     <Option name="click-gain" value="1"/>
+    <Option name="use-click-emphasis" value="1"/>
     <Option name="skip-playback" value="1"/>
     <Option name="plugins-stop-with-transport" value="0"/>
     <Option name="stop-recording-on-xrun" value="0"/>
     <Option name="create-xrun-marker" value="1"/>
     <Option name="stop-at-session-end" value="0"/>
     <Option name="seamless-loop" value="0"/>
+    <Option name="preroll-seconds" value="1"/>
     <Option name="loop-is-mode" value="0"/>
     <Option name="preroll" value="0"/>
     <Option name="postroll" value="0"/>
@@ -94,6 +97,7 @@
     <Option name="meter-type-master" value="16"/>
     <Option name="meter-type-track" value="4"/>
     <Option name="meter-type-bus" value="4"/>
+    <Option name="try-autostart-engine" value="0"/>
     <Option name="auditioner-output-left" value="default"/>
     <Option name="auditioner-output-right" value="default"/>
     <Option name="replicate-missing-region-channels" value="0"/>
@@ -123,6 +127,8 @@
     <Option name="verbose-plugin-scan" value="1"/>
     <Option name="vst-scan-timeout" value="600"/>
     <Option name="discover-audio-units" value="0"/>
+    <Option name="ask-replace-instrument" value="1"/>
+    <Option name="ask-setup-instrument" value="1"/>
     <Option name="plugin-path-vst" value="@default@"/>
     <Option name="plugin-path-lxvst" value="@default@"/>
     <Option name="denormal-protection" value="0"/>
@@ -136,6 +142,8 @@
     <Option name="video-server-docroot" value="/"/>
     <Option name="show-video-export-info" value="1"/>
     <Option name="show-video-server-dialog" value="0"/>
+    <Option name="export-preroll" value="10"/>
+    <Option name="export-silence-threshold" value="-inf"/>
   </Config>
   <Metadata/>
   <ControlProtocols/>
diff --git a/tools/clang-format b/tools/clang-format
new file mode 100644
index 0000000..e014125
--- /dev/null
+++ b/tools/clang-format
@@ -0,0 +1,25 @@
+---
+
+Language: Cpp
+AlignAfterOpenBracket: 'true'
+AlignTrailingComments: 'true'
+AlwaysBreakTemplateDeclarations: 'true'
+AllowShortBlocksOnASingleLine: 'false'
+AllowShortCaseLabelsOnASingleLine: 'false'
+AllowShortFunctionsOnASingleLine: All
+AllowShortIfStatementsOnASingleLine: 'false'
+AllowShortLoopsOnASingleLine: 'false'
+AlwaysBreakAfterDefinitionReturnType: 'true'
+BasedOnStyle: LLVM
+BreakBeforeBraces: 'Linux'
+BreakConstructorInitializersBeforeComma: 'true'
+ColumnLimit: '100'
+ConstructorInitializerAllOnOneLineOrOnePerLine: 'true'
+IndentCaseLabels: 'false'
+NamespaceIndentation: 'None'
+PenaltyReturnTypeOnItsOwnLine: '1'
+PointerAlignment: Left
+SpaceBeforeParens: Always
+TabWidth: '2'
+UseTab: ForIndentation
+
diff --git a/tools/ctagsparse.py b/tools/ctagsparse.py
new file mode 100755
index 0000000..989d40c
--- /dev/null
+++ b/tools/ctagsparse.py
@@ -0,0 +1,10 @@
+#!/usr/bin/python
+import csv
+
+# ctags -o /tmp/atag.csv --fields=+afiKkmnsSzt libs/ardour/ardour/export_format_specification.h 
+
+f = open('/tmp/atag.csv', 'rb')
+reader = csv.reader(f, delimiter='\t')
+for row in reader:
+    if len(row) > 7:
+        print row[7]
diff --git a/tools/define_versions.sh b/tools/define_versions.sh
index a0642ce..37eca61 100644
--- a/tools/define_versions.sh
+++ b/tools/define_versions.sh
@@ -8,7 +8,7 @@ else
     EXTENDED_RE=-r
 fi
 
-GIT_REV_REGEXP='([0-9][0-9]*)\.([0-9][0-9]*)\-?(rc[0-9]*)?-?([0-9][0-9]*)?(-g([a-f0-9]+))?'
+GIT_REV_REGEXP='([0-9][0-9]*)\.([0-9][0-9]*)\-?([pr][rc]e?[0-9]*)?-?([0-9][0-9]*)?(-g([a-f0-9]+))?'
 
 major_version=`cut -d'"' -f2 < ../../libs/ardour/revision.cc | sed $EXTENDED_RE -e 1d -e "s/$GIT_REV_REGEXP/\1/"`
 minor_version=`cut -d'"' -f2 < ../../libs/ardour/revision.cc | sed $EXTENDED_RE -e 1d -e "s/$GIT_REV_REGEXP/\2/"`
@@ -20,6 +20,9 @@ micro_version=`cut -d'"' -f2 < ../../libs/ardour/revision.cc | sed $EXTENDED_RE
 
 #
 # RC e.g. 8.1-rc3 (optional)
+# OR
+# PRE e.g. 9.3-pre0 (optional)
+#
 # Tracks does not use -rcN based tagging
 #
 rc=`cut -d'"' -f2 < ../../libs/ardour/revision.cc | sed $EXTENDED_RE -e 1d -e "s/$GIT_REV_REGEXP/\3/"`
diff --git a/tools/doxy2json/Makefile b/tools/doxy2json/Makefile
new file mode 100644
index 0000000..885b756
--- /dev/null
+++ b/tools/doxy2json/Makefile
@@ -0,0 +1,18 @@
+TARGET=doxy2json
+
+CXX=clang++
+CXXFLAGS=`llvm-config --cxxflags --ldflags` -lclang -std=c++11 -O2 -Wall -Wextra -pthread
+LOADLIBES=-lclang
+
+ifeq ($(shell uname -s), Darwin)
+CXXFLAGS+=-stdlib=libstdc++
+endif
+
+all: $(TARGET)
+
+$(TARGET): $(TARGET).cc
+
+clean:
+	@rm -f $(TARGET)
+
+.PHONY: test
diff --git a/tools/doxy2json/ardourdoc.sh b/tools/doxy2json/ardourdoc.sh
new file mode 100755
index 0000000..b9e7db8
--- /dev/null
+++ b/tools/doxy2json/ardourdoc.sh
@@ -0,0 +1,71 @@
+#!/bin/bash
+cd `dirname $0`
+set -e
+make
+cd ../..
+test -f libs/ardour/ardour/ardour.h
+LLVMINCLUDE="-I /usr/lib/llvm-3.6/include -I /usr/lib/llvm-3.6/lib/clang/3.6.2/include/"
+
+TMPFILE=`mktemp`
+trap 'rm -f $TMPFILE' exit SIGINT SIGTERM
+
+echo "# analyzing source.. -> $TMPFILE"
+time ./tools/doxy2json/doxy2json -j 4 \
+	$LLVMINCLUDE \
+	-D PACKAGE=\"doc\" \
+	-D PROGRAM_NAME=\"Ardour\" -D PROGRAM_VERSION=\"4\" -D LOCALEDIR=\"/\" \
+	-D ARCH_X86 -D CONFIG_ARCH=\"x86_64\" -D WAF_BUILD \
+	-D HAVE_AUBIO=1 -D HAVE_ALSA=1 -D HAVE_GLIB=1 -D HAVE_LIBS_LUA=1 -D HAVE_XML=1 -D PTFORMAT=1 \
+	-D HAVE_SAMPLERATE=1 -D HAVE_LV2=1 -D HAVE_LV2_1_2_0=1 -D HAVE_LV2_1_10_0=1 -D HAVE_SERD=1 -D HAVE_SORD=1 -D HAVE_SRATOM=1 -D HAVE_LILV=1 -D HAVE_LV2_1_0_0=1 \
+	-D HAVE_LILV_0_16_0=1 -D HAVE_LILV_0_19_2=1 -D HAVE_LILV_0_21_3=1 -D HAVE_SUIL=1 -D LV2_SUPPORT=1 -D LV2_EXTENDED=1 -D HAVE_GTK=1 -D HAVE_LIBS_GTKMM2EXT=1 \
+	-D HAVE_X11=1  -D LXVST_64BIT=1 -D LXVST_SUPPORT=1 -D HAVE_TAGLIB=1 -D HAVE_POSIX_MEMALIGN=1 -D HAVE_VAMPSDK=1 -D HAVE_VAMPHOSTSDK=1 -D HAVE_RUBBERBAND=1 -D ENABLE_NLS=1 \
+	-D HAVE_CURL=1 -D HAVE_LO=1 -D HAVE_LRDF=1 \
+	-I libs/ardour -I libs/pbd -I libs/lua -I gtk2_ardour -I libs/timecode -I libs/audiographer -I libs/ptformat -I libs/fst \
+	-I libs/ltc -I libs/evoral -I libs/canvas -I libs/gtkmm2ext -I libs/midi++2 -I libs/surfaces/control_protocol -I libs \
+	-I build/libs/pbd -I build/libs/ardour -I build/gtk2_ardour \
+	`pkg-config --cflags glib-2.0 glibmm-2.4 cairomm-1.0 gtkmm-2.4 libxml-2.0 lilv-0 suil-0 | sed 's/-std=c++11 //;s/-pthread //'` \
+	-X "_" -X "::" -X "sigc" -X "Atk::" -X "Gdk::" -X "Gtk::" -X "Gio::" \
+	-X "Glib::" -X "Pango::" -X "luabridge::" \
+	\
+	libs/ardour/*.cc libs/pbd/*.cc \
+	gtk2_ardour/*.cc \
+	/usr/include/cairomm-1.0/cairomm/context.h \
+> $TMPFILE
+
+ls -lh $TMPFILE
+
+echo "# consolidating JSON"
+php << EOF
+<?php
+\$json = file_get_contents ('$TMPFILE');
+\$api = array ();
+foreach (json_decode (\$json, true) as \$a) {
+	if (!isset (\$a['decl'])) { continue; }
+
+	\$a['decl'] = str_replace ('size_t', 'unsigned long', \$a['decl']);
+	\$a['decl'] = str_replace ('uint32_t', 'unsigned int', \$a['decl']);
+	\$a['decl'] = str_replace ('int32_t', 'int', \$a['decl']);
+	\$a['decl'] = str_replace ('framepos_t', 'long', \$a['decl']);
+	\$a['decl'] = str_replace ('framecnt_t', 'long', \$a['decl']);
+	\$a['decl'] = str_replace ('frameoffset_t', 'long', \$a['decl']);
+	\$a['decl'] = str_replace ('int64_t', 'long', \$a['decl']);
+	\$a['decl'] = str_replace ('uint8_t', 'unsigned char', \$a['decl']);
+	\$a['decl'] = str_replace ('pframes_t', 'unsigned int', \$a['decl']);
+	\$a['decl'] = str_replace ('uint64_t', 'unsigned long', \$a['decl']);
+	\$a['decl'] = str_replace ('const char', 'char', \$a['decl']);
+	\$a['decl'] = str_replace ('const float', 'float', \$a['decl']);
+	\$a['decl'] = str_replace ('const double', 'double', \$a['decl']);
+	\$a['decl'] = str_replace ('const long', 'long', \$a['decl']);
+	\$a['decl'] = str_replace ('const unsigned int', 'unsigned int', \$a['decl']);
+	\$a['decl'] = str_replace ('const unsigned long', 'unsigned long', \$a['decl']);
+	\$canon = str_replace (' *', '*', \$a['decl']);
+	\$api[\$canon] = \$a;
+}
+\$jout = array ();
+foreach (\$api as \$k => \$a) {
+	\$jout[] = \$a;
+}
+file_put_contents('doc/ardourapi.json.gz', gzencode (json_encode (\$jout, JSON_PRETTY_PRINT)));
+EOF
+
+ls -l doc/ardourapi.json.gz
diff --git a/tools/doxy2json/doxy2json.cc b/tools/doxy2json/doxy2json.cc
new file mode 100644
index 0000000..accfdc2
--- /dev/null
+++ b/tools/doxy2json/doxy2json.cc
@@ -0,0 +1,368 @@
+/* extract doxygen comments from C++ header files
+ *
+ * Copyright (C) 2016 Robin Gareus <robin at gareus.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <stdlib.h>
+#include <unistd.h>
+#include <getopt.h>
+#include <pthread.h>
+#include <cstdio>
+#include <cstring>
+#include <sstream>
+#include <iomanip>
+#include <algorithm>
+#include <map>
+#include <vector>
+#include <clang-c/Index.h>
+#include <clang-c/Documentation.h>
+
+struct Dox2jsConfig {
+	Dox2jsConfig () : clang_argc (3), clang_argv (0), excl_argc (0), excl_argv (0)
+	{
+		excl_argv = (char**) calloc (1, sizeof (char*));
+		clang_argv = (char**) malloc (clang_argc * sizeof (char*));
+		clang_argv[0] = strdup ("-x");
+		clang_argv[1] = strdup ("c++");
+		clang_argv[2] = strdup ("-std=c++11");
+	}
+
+	~Dox2jsConfig () {
+		for (int i = 0; i < clang_argc; ++i) {
+			free (clang_argv[i]);
+		}
+		for (int i = 0; excl_argv[i]; ++i) {
+			free (excl_argv[i]);
+		}
+		free (clang_argv);
+		free (excl_argv);
+	}
+
+	void add_clang_arg (const char *a) {
+		clang_argv = (char**) realloc (clang_argv, (clang_argc + 1) * sizeof (char*));
+		clang_argv[clang_argc++] = strdup (a);
+	}
+
+	void add_exclude (const char *a) {
+		excl_argv = (char**) realloc (excl_argv, (excl_argc + 2) * sizeof (char*));
+		excl_argv[excl_argc++] = strdup (a);
+		excl_argv[excl_argc] = NULL;
+	}
+
+	int    clang_argc;
+	char** clang_argv;
+	int    excl_argc;
+	char** excl_argv;
+};
+
+typedef std::map <std::string, std::string> ResultMap;
+
+struct dox2js {
+	Dox2jsConfig *cfg;
+	ResultMap results;
+};
+
+struct ProcessQueue {
+	ProcessQueue (std::vector<char*>* files, ResultMap* r, Dox2jsConfig* c, pthread_mutex_t* lck, bool report, bool check)
+		: fq (files)
+		, rm (r)
+		, djc (c)
+		, lock (lck)
+		, total (files->size ())
+		, done (0)
+		, report_progress (report)
+		, check_compile (check)
+	{ }
+
+	std::vector<char*>* fq;
+	ResultMap *rm;
+	Dox2jsConfig *djc;
+	pthread_mutex_t* lock;
+	unsigned int total;
+	unsigned int done;
+	bool report_progress;
+	bool check_compile;
+};
+
+
+static const char*
+kind_to_txt (CXCursor cursor)
+{
+	CXCursorKind kind  = clang_getCursorKind (cursor);
+	switch (kind) {
+		case CXCursor_StructDecl   : return "Struct";
+		case CXCursor_EnumDecl     : return "Enum";
+		case CXCursor_UnionDecl    : return "Union";
+		case CXCursor_FunctionDecl : return "C Function";
+		case CXCursor_VarDecl      : return "Variable";
+		case CXCursor_ClassDecl    : return "C++ Class";
+		case CXCursor_CXXMethod    : return "C++ Method";
+		case CXCursor_Namespace    : return "C++ Namespace";
+		case CXCursor_Constructor  : return "C++ Constructor";
+		case CXCursor_Destructor   : return "C++ Destructor";
+		case CXCursor_FieldDecl    : return "Data Member/Field";
+		default: break;
+	}
+	return "";
+}
+
+static std::string
+escape_json (const std::string &s)
+{
+	std::ostringstream o;
+	for (auto c = s.cbegin (); c != s.cend (); c++) {
+		switch (*c) {
+			case '"':  o << "\\\""; break;
+			case '\\': o << "\\\\"; break;
+			case '\n': o << "\\n"; break;
+			case '\r': o << "\\r"; break;
+			case '\t': o << "\\t"; break;
+			default:
+				if ('\x00' <= *c && *c <= '\x1f') {
+					o << "\\u" << std::hex << std::setw (4) << std::setfill ('0') << (int)*c;
+				} else {
+				  o << *c;
+				}
+		}
+	}
+	return o.str ();
+}
+
+static std::string
+recurse_parents (CXCursor cr) {
+	std::string rv;
+	CXCursor pc = clang_getCursorSemanticParent (cr);
+	if (CXCursor_TranslationUnit == clang_getCursorKind (pc)) {
+		return rv;
+	}
+	if (!clang_Cursor_isNull (pc)) {
+		rv += recurse_parents (pc);
+		rv += clang_getCString (clang_getCursorDisplayName (pc));
+		rv += "::";
+	}
+	return rv;
+}
+
+static bool
+check_excludes (const std::string& decl, CXClientData d) {
+	struct Dox2jsConfig* djc = (struct Dox2jsConfig*) d;
+	char** excl = djc->excl_argv;
+	for (int i = 0; excl[i]; ++i) {
+		if (decl.compare (0, strlen (excl[i]), excl[i]) == 0) {
+			return true;
+		}
+	}
+	return false;
+}
+
+static enum CXChildVisitResult
+traverse (CXCursor cr, CXCursor /*parent*/, CXClientData d)
+{
+	struct dox2js* dj = (struct dox2js*) d;
+	CXComment c = clang_Cursor_getParsedComment (cr);
+
+	if (clang_Comment_getKind (c) != CXComment_Null
+			&& clang_isDeclaration (clang_getCursorKind (cr))
+			&& 0 != strlen (kind_to_txt (cr))
+		 ) {
+
+		// TODO: resolve typedef enum { .. } name;
+		// use clang_getCursorDefinition (clang_getCanonicalCursor (cr)) ??
+		std::string decl = recurse_parents (cr);
+		decl += clang_getCString (clang_getCursorDisplayName (cr));
+
+		if (decl.empty () || check_excludes (decl, dj->cfg)) {
+			return CXChildVisit_Recurse;
+		}
+
+		std::ostringstream o;
+		o << "{ \"decl\" : \"" << decl << "\",\n";
+
+		if (clang_Cursor_isVariadic (cr)) {
+			o << "  \"variadic\" : true,\n";
+		}
+
+		CXSourceLocation  loc = clang_getCursorLocation (cr);
+		CXFile file; unsigned line, col, off;
+		clang_getFileLocation (loc, &file, &line, &col, &off);
+
+		o << "  \"kind\" : \"" << kind_to_txt (cr) << "\",\n"
+			<< "  \"src\" : \"" << clang_getCString (clang_getFileName (file)) << ":" << line << "\",\n"
+			<< "  \"doc\" : \"" << escape_json (clang_getCString (clang_FullComment_getAsHTML (c))) << "\"\n"
+			<< "},\n";
+
+		dj->results[decl] = o.str ();
+	}
+	return CXChildVisit_Recurse;
+}
+
+static ResultMap
+process_file (const char* fn, struct Dox2jsConfig *djc, bool check)
+{
+	dox2js dj;
+	dj.cfg = djc;
+
+	if (check) {
+		fprintf (stderr, "--- %s ---\n", fn);
+	}
+	CXIndex index = clang_createIndex (0, check ? 1 : 0);
+	CXTranslationUnit tu = clang_createTranslationUnitFromSourceFile (index, fn, djc->clang_argc, djc->clang_argv, 0, 0);
+
+	if (tu == NULL) {
+		fprintf (stderr, "Cannot create translation unit for src: %s\n", fn);
+		return ResultMap ();
+	}
+
+	clang_visitChildren (clang_getTranslationUnitCursor (tu), traverse, (CXClientData) &dj);
+
+	clang_disposeTranslationUnit (tu);
+	clang_disposeIndex (index);
+	return dj.results;
+}
+
+static void*
+process_thread (void *d)
+{
+	struct ProcessQueue* proc = (struct ProcessQueue*) d;
+	pthread_mutex_lock (proc->lock);
+
+	while (1) {
+		if (proc->fq->empty ()) {
+			break;
+		}
+		char* fn = strdup (proc->fq->back ());
+		proc->fq->pop_back ();
+		pthread_mutex_unlock (proc->lock);
+
+		ResultMap rm = process_file (fn, proc->djc, proc->check_compile);
+		free (fn);
+
+		pthread_mutex_lock (proc->lock);
+		for (ResultMap::const_iterator i = rm.begin (); i != rm.end (); ++i) {
+			(*proc->rm)[i->first] = i->second;
+		}
+		++proc->done;
+
+		if (proc->report_progress) {
+			fprintf (stderr, "progress: %4.1f%%  [%4d / %4d] decl: %ld         \r",
+					100.f * proc->done / (float)proc->total, proc->done, proc->total,
+					proc->rm->size ());
+		}
+	}
+	pthread_mutex_unlock (proc->lock);
+	pthread_exit (NULL);
+	return NULL;
+}
+
+
+static void
+usage (int status)
+{
+	printf ("doxy2json - extract doxygen doc from C++ headers.\n\n");
+	fprintf (stderr, "Usage: dox2json [-I path]* [-X exclude]* <filename> [filename]*\n");
+	exit (status);
+}
+
+int main (int argc, char** argv)
+{
+	struct Dox2jsConfig djc;
+
+#define MAX_THREADS 16
+	pthread_t threads[MAX_THREADS];
+
+	bool report_progress = false;
+	bool check_compile = false;
+	size_t num_threads = 1;
+  int c;
+	while (EOF != (c = getopt (argc, argv, "j:D:I:TX:"))) {
+		switch (c) {
+			case 'j':
+				num_threads = std::max (1, std::min ((int)MAX_THREADS, atoi (optarg)));
+				break;
+			case 'I':
+				djc.add_clang_arg ("-I");
+				djc.add_clang_arg (optarg);
+				break;
+			case 'D':
+				djc.add_clang_arg ("-D");
+				djc.add_clang_arg (optarg);
+				break;
+			case 'X':
+				djc.add_exclude (optarg);
+				break;
+			case 'T':
+				check_compile = true;
+				break;
+			case 'h':
+				usage (0);
+			default:
+				usage (EXIT_FAILURE);
+				break;
+		}
+	}
+
+	if (optind >= argc) {
+		usage (EXIT_FAILURE);
+	}
+
+	const int total = (argc - optind);
+	if (total > 6 && !check_compile) {
+		report_progress = true;
+	}
+
+	ResultMap results;
+	std::vector<char*> src;
+	pthread_mutex_t lock;
+	pthread_mutex_init (&lock, NULL);
+
+	for (int i = optind; i < argc; ++i) {
+		src.push_back (argv[i]);
+	}
+
+	if (check_compile) {
+		num_threads = 1;
+	} else {
+		num_threads = std::min (src.size (), num_threads);
+	}
+
+	struct ProcessQueue proc (&src, &results, &djc, &lock, report_progress, check_compile);
+
+	for (unsigned int i = 0; i < num_threads; ++i) {
+		int rc = pthread_create (&threads[i], NULL, process_thread, (void *)&proc);
+		if (rc) {
+			fprintf (stderr, "failed to create thread.\n");
+			exit(EXIT_FAILURE);
+		}
+	}
+
+	pthread_yield();
+
+	for (unsigned int i = 0; i < num_threads; ++i) {
+		pthread_join (threads[i], NULL);
+	}
+
+	if (!check_compile) {
+		printf ("[\n");
+		for (std::map <std::string, std::string>::const_iterator i = results.begin (); i != results.end (); ++i) {
+			printf ("%s\n", (*i).second.c_str ());
+		}
+		printf ("{} ]\n");
+	}
+
+	pthread_mutex_destroy (&lock);
+
+  return 0;
+}
diff --git a/tools/fmt-bindings b/tools/fmt-bindings
index aa76afe..d2dd1ad 100755
--- a/tools/fmt-bindings
+++ b/tools/fmt-bindings
@@ -2,7 +2,9 @@
 
 # import module
 use Getopt::Long; 
-
+use File::Basename;
+use File::Spec;
+    
 $semicolon = ";"; # help out stupid emacs
 $title = "Ardour Shortcuts";
 $in_group_def = 0;
@@ -12,6 +14,8 @@ $group_key;
 $group_number = 0;
 %group_names;
 %group_text;
+%owner_bindings;
+%group_owners;
 %group_bindings;
 %modifier_map;
 %group_numbering;
@@ -19,8 +23,8 @@ $group_number = 0;
 
 $platform = linux;
 $winkey = 'Win';
-$make_cheatsheet = 1;
-$make_accelmap = 0;
+$make_cheatsheet = 0;
+$make_accelmap = 1;
 $merge_from = "";
 $html = 0;
 
@@ -31,20 +35,12 @@ GetOptions ("platform=s" => \$platform,
 	    "merge=s" => \$merge_from,
             "html" => \$html);
 
-#
-# The use of a separate @WINDOW@ meta-modifier was a mistake and needs to be removed from the bindings.in file.
-# There is no separate key/modifier we can use for this, so inevitably it will be the same modifier as one of
-# the other meta-modifiers. This means, for example, that @WINDOW at -b could be same as @SECONDARY at -b with no
-# warnings given. One of the bindings will work, one won't.
-#
-
 if ($platform eq "darwin") {
 
     $gtk_modifier_map{'PRIMARY'} = 'Primary'; # GTK supports Primary to allow platform-independent binding to the "primary" modifier, which on OS X is Command
     $gtk_modifier_map{'SECONDARY'} = 'Control';
     $gtk_modifier_map{'TERTIARY'} = 'Shift';
     $gtk_modifier_map{'LEVEL4'} = 'Mod1'; 
-    $gtk_modifier_map{'WINDOW'} = 'Control';
 
     # cs_modifier_map == "Cheat Sheet Modifier Map"
     # Used to control what gets shown in the
@@ -54,7 +50,6 @@ if ($platform eq "darwin") {
     $cs_modifier_map{'SECONDARY'} = 'Control';
     $cs_modifier_map{'TERTIARY'} = 'Shift';
     $cs_modifier_map{'LEVEL4'} = 'Opt';
-    $cs_modifier_map{'WINDOW'} = 'Control';
 
     # used to display what gets shown in the
     # cheat sheet for mouse bindings. Differs
@@ -65,7 +60,6 @@ if ($platform eq "darwin") {
     $mouse_modifier_map{'SECONDARY'} = 'Ctrl';
     $mouse_modifier_map{'TERTIARY'} = 'Shift';
     $mouse_modifier_map{'LEVEL4'} = 'Opt';
-    $mouse_modifier_map{'WINDOW'} = 'Ctrl';
 
 } else {
 
@@ -73,7 +67,6 @@ if ($platform eq "darwin") {
     $gtk_modifier_map{'SECONDARY'} = 'Alt';
     $gtk_modifier_map{'TERTIARY'} = 'Shift';
     $gtk_modifier_map{'LEVEL4'} = $winkey;  # something like "Mod4><Super" 
-    $gtk_modifier_map{'WINDOW'} = 'Alt';
 
     # cs_modifier_map == "Cheat Sheet Modifier Map"
     # Used to control what gets shown in the
@@ -83,7 +76,6 @@ if ($platform eq "darwin") {
     $cs_modifier_map{'SECONDARY'} = 'Alt';
     $cs_modifier_map{'TERTIARY'} = 'Shift';
     $cs_modifier_map{'LEVEL4'} = 'Win';
-    $cs_modifier_map{'WINDOW'} = 'Alt';
 
     # used to display what gets shown in the
     # cheat sheet for mouse bindings. Differs
@@ -94,7 +86,6 @@ if ($platform eq "darwin") {
     $mouse_modifier_map{'SECONDARY'} = 'Alt';
     $mouse_modifier_map{'TERTIARY'} = 'Shift';
     $mouse_modifier_map{'LEVEL4'} = 'Win';
-    $mouse_modifier_map{'WINDOW'} = 'Alt';
 }
 
 %keycodes = ();
@@ -186,10 +177,15 @@ if ($merge_from) {
 }
 
 if ($make_accelmap && !$merge_from) {
-    print ";; this accelmap was produced by tools/fmt-bindings\n";
+    print "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
 }
 
-while (<>) {
+$bindings_name = basename ($ARGV[0]);
+$bindings_name =~ s/.bindings\.in$//;
+
+open SOURCE, "<", $ARGV[0] or die $!;
+
+while (<SOURCE>) {
     next if /^$semicolon/;
 
     if (/^\$/) {
@@ -214,7 +210,13 @@ while (<>) {
 
 	s/^%//;
 	chop;
-	($group_key,$group_name) = split (/\s+/, $_, 2);
+	($group_key,$owner,$group_name) = split (/\s+/, $_, 3);
+	if ($make_accelmap) {
+	    if (!exists ($owner_bindings{$owner})) {
+		$owner_bindings{$owner} = [ [] ];
+	    }
+	    $group_owners{$group_key} = $owner;
+	}
 	$group_number++;
 	$group_text = "";
 	$in_group_def = 1;
@@ -240,6 +242,10 @@ while (<>) {
 	chop;
 	($key,$action,$binding,$text) = split (/\|/, $_, 4);
 
+	$gkey = $key;
+	$gkey =~ s/^-//;
+	$owner = $group_owners{$gkey};
+
 	# substitute bindings
 
 	$gtk_binding = $binding;
@@ -258,18 +264,28 @@ while (<>) {
 	    }
 	} 
 
-	# print the accelmap output
+	# store the accelmap output
 
 	if ($key =~ /^\+/) {
 	    # remove + and don't print it in the accelmap
 	    $key =~ s/^\+//;
 	} else {
-	    # include this in the accelmap
-	    if (!$merge_from && $make_accelmap) {
-		foreach $k (keys %gtk_modifier_map) {
-		    $gtk_binding =~ s/\@$k\@/$gtk_modifier_map{$k}/;
-		}
-		print "(gtk_accel_path \"<Actions>/$action\" \"$gtk_binding\")\n";
+	    # include this in the accelmap if it is part of a group that has an "owner"
+	    if (!$merge_from && $make_accelmap && exists ($owner_bindings{$owner})) {
+
+		$b = $binding;
+		$b =~ s/<@//g;
+		$b =~ s/@>//g;
+		$b =~ s/PRIMARY/Primary-/;
+		$b =~ s/SECONDARY/Secondary-/;
+		$b =~ s/TERTIARY/Tertiary-/;
+		$b =~ s/LEVEL4/Level4-/;
+
+		$g = $group_names{$gkey};
+		$g =~ s/\\&/&/g;
+
+		$bref = $owner_bindings{$owner};
+		push (@$bref, [ $action, $b, $g]);
 	    }
 	}
 
@@ -281,12 +297,43 @@ while (<>) {
 	$bref = $group_bindings{$key};
 	push (@$bref, [$binding, $text]);
 
+	$sref = $section_text{$key};
+	push (@$sref, [$owner]);
+	
 	next;
     }
 
     next;
 }
 
+if ($make_accelmap) {
+    print "<BindingSet name=\"" . $bindings_name . "\">\n";
+    
+    foreach $owner (keys %owner_bindings) {
+	print " <Bindings name=\"$owner\">\n  <Press>\n";
+	$bindings = $owner_bindings{$owner};
+	shift (@$bindings); # remove initial empty element
+	for my $binding (@$bindings) {
+	    print '   <Binding key="' . @$binding[1] . '" action="' . @$binding[0] . '" group="' . @$binding[2] . "\"/>\n";
+	}
+        print "  </Press>\n </Bindings>\n";
+    }
+
+    # merge in the "fixed" bindings that are not defined by the argument given to this program
+    # this covers things like the step editor, monitor and processor box bindings
+
+    foreach $hardcoded_bindings ("mixer.bindings", "step_editing.bindings", "monitor.bindings", "processor_box.bindings") {
+	$path = File::Spec->catfile (dirname ($ARGV[0]), $hardcoded_bindings);
+	open HARDCODED, "<", $path or die $!;
+	while (<HARDCODED>) {
+	    print $_;
+	}
+	close HARDCODED;
+    }
+    
+    print "</BindingSet>\n";
+}
+
 if ($make_accelmap || !$make_cheatsheet) {
     exit 0;
 }
diff --git a/tools/fmt-luadoc.php b/tools/fmt-luadoc.php
new file mode 100755
index 0000000..7f7b35d
--- /dev/null
+++ b/tools/fmt-luadoc.php
@@ -0,0 +1,1021 @@
+#!/usr/bin/php
+<?php
+## USAGE
+#
+## generate doc/luadoc.json.gz (lua binding doc)
+# ./waf configure --luadoc ....
+# ./waf
+# ./gtk2_ardour/arluadoc > doc/luadoc.json.gz
+#
+## generate doc/ardourapi.json.gz (ardour header doxygen doc)
+# cd ../../tools/doxy2json
+# ./ardourdoc.sh
+# cd -
+#
+## format HTML (using this scripterl)
+# php tools/fmt-luadoc.php > /tmp/luadoc.html
+#
+
+$options = getopt("m");
+if (isset ($options['m'])) {
+	$HTMLOUTPUT = false; ## set to false to output ardour-manual
+} else {
+	$HTMLOUTPUT = true; ## set to false to output ardour-manual
+}
+
+################################################################################
+################################################################################
+
+$json = gzdecode (file_get_contents (dirname (__FILE__).'/../doc/luadoc.json.gz'));
+$doc = array ();
+$ardourversion = '';
+foreach (json_decode ($json, true) as $b) {
+	if (!isset ($b['type'])) {
+		if (isset ($b['version'])) { $ardourversion = $b['version']; }
+		continue;
+	}
+	# reserved lua words
+	$b ['lua'] = preg_replace ('/:_end/', ':end', $b ['lua']);
+	$b ['lua'] = preg_replace ('/:_type/', ':type', $b ['lua']);
+	$b ['ldec'] = preg_replace ('/ const/', '', preg_replace ('/ const&/', '', $b['decl']));
+	if (isset ($b['ret'])) {
+		$b['ret'] = preg_replace ('/ const/', '', preg_replace ('/ const&/', '', $b['ret']));
+	}
+	$doc[] = $b;
+}
+
+if (count ($doc) == 0) {
+	fwrite (STDERR, "Failed to read luadoc.json\n");
+	exit (1);
+}
+
+################################################################################
+## Global result variables
+################################################################################
+
+$classlist = array ();
+$constlist = array ();
+
+
+################################################################################
+## Pre-process the data, collect functions, parse arguments, cross reference
+################################################################################
+
+
+################################################################################
+# some internal helper functions first
+
+$funclist = array ();
+$classes = array ();
+$consts = array ();
+
+function my_die ($msg) {
+	fwrite (STDERR, $msg."\n");
+	exit (1);
+}
+
+##function ptr_strip ($ctype) {
+#	# boost::shared_ptr<std::list<boost::shared_ptr<ARDOUR::Route>> > >
+#	# -> std::list<ARDOUR::Route>
+#	$ctype = preg_replace ('/boost::shared_ptr<([^>]*)[ ]*>/', '$1', $ctype);
+#	return preg_replace ('/boost::shared_ptr<([^>]*)[ ]*>/', '$1', $ctype);
+#}
+
+function arg2lua ($argtype, $flags = 0) {
+	global $classes;
+	global $consts;
+
+	# LuaBridge abstracts C++ references
+	$flags |= preg_match ('/&$/', $argtype);
+	$arg = preg_replace ('/&$/', '', $argtype);
+	$arg = preg_replace ('/ $/', '', $arg);
+
+	# filter out basic types
+	$builtin = array ('float', 'double', 'bool', 'std::string', 'int', 'long', 'unsigned long', 'unsigned int', 'unsigned char', 'char', 'void', 'char*', 'unsigned char*', 'void*');
+	if (in_array ($arg, $builtin)) {
+		return array ($arg => $flags);
+	}
+
+	# check Class declarations first
+	foreach (array_merge ($classes, $consts) as $b) {
+		if ($b['ldec'] == $arg) {
+			return array ($b['lua'] => $flags);
+		}
+	}
+
+	# strip class pointers -- TODO Check C'tor for given class
+	$arg = preg_replace ('/[&*]*$/', '', $argtype);
+	foreach (array_merge ($classes, $consts) as $b) {
+		if ($b['ldec'] == $arg) {
+			return array ($b['lua'] => $flags);
+		}
+	}
+	if ($flags & 2) {
+		return array ($argtype => ($flags | 4));
+	} else {
+		return array ('--MISSING (' . $argtype . ')--' => ($flags | 4));
+	}
+}
+
+function stripclass ($classname, $name) {
+	$classname .= ':';
+	if (strpos ($name, $classname) !== 0) {
+		my_die ('invalid class prefix: ' .$classname. ' -- '. $name);
+	}
+	return substr ($name, strlen ($classname));
+}
+
+function datatype ($decl) {
+	# TODO handle spaces in type. Works because
+	# we don't yet have templated types (with_space <here >)
+	return substr ($decl, 0, strrpos ($decl, ' '));
+}
+
+function luafn2class ($lua) {
+	return substr ($lua, 0, strrpos ($lua, ':'));
+}
+
+function luafn2name ($lua) {
+	$fn = strrpos ($lua, ':');
+	if ($fn !== 0 && strlen($lua) > $fn + 1) {
+		return substr ($lua, $fn + 1);
+	}
+	my_die ('invalid class prefix: '. $name);
+}
+
+
+function checkclass ($b) {
+	global $classlist;
+	if (!isset ($classlist[luafn2class ($b['lua'])])) {
+		my_die ('MISSING CLASS FOR '. print_r ($b['lua'], true));
+	}
+}
+
+# parse functions argument list to lua-names
+function decl2args ($decl) {
+	$start = strrpos ($decl, '(');
+	$end = strrpos ($decl, ')');
+	$args = substr ($decl, $start + 1, $end - $start - 1);
+	$arglist = preg_split ('/, */', $args);
+	$rv = array ();
+	foreach ($arglist as $a) {
+		if (empty ($a)) { continue; }
+		$rv[] = arg2lua ($a);
+	}
+	return $rv;
+}
+
+function canonical_ctor ($b) {
+	$rv = '';
+	if (preg_match('/[^(]*\(([^)*]*)\*\)(\(.*\))/', $b['decl'], $matches)) {
+		$lc = luafn2class ($b['lua']);
+		$cn = str_replace (':', '::', $lc);
+		$fn = substr ($lc, 1 + strrpos ($lc, ':'));
+		$rv = $cn . '::'. $fn . $matches[2];
+	}
+	return $rv;
+}
+
+function canonical_decl ($b) {
+	$rv = '';
+	$pfx = '';
+	# match clang's declatation format
+	if (preg_match('/[^(]*\(([^)*]*)\*\)\((.*)\)/', $b['decl'], $matches)) {
+		if (strpos ($b['type'], 'Free Function') !== false) {
+			$pfx = str_replace (':', '::', luafn2class ($b['lua'])) . '::';
+		}
+		$fn = substr ($b['lua'], 1 + strrpos ($b['lua'], ':'));
+		$rv = $matches[1] . $fn . '(';
+		$arglist = preg_split ('/, */', $matches[2]);
+		$first = true;
+		foreach ($arglist as $a) {
+			if (!$first) { $rv .= ', '; }; $first = false;
+			if (empty ($a)) { continue; }
+			$a = preg_replace ('/([^>]) >/', '$1>', $a);
+			$a = preg_replace ('/^Cairo::/', '', $a); // special case cairo enums
+			$a = preg_replace ('/([^ ])&/', '$1 &', $a);
+			$a = str_replace ('vector', 'std::vector', $a);
+			$a = str_replace ('std::string', 'string', $a);
+			$a = str_replace ('string const', 'const string', $a);
+			$a = str_replace ('string', 'std::string', $a);
+			$rv .= $a;
+		}
+		$rv .= ')';
+	}
+	return $pfx . $rv;
+}
+
+################################################################################
+# step 1: build class indices
+
+foreach ($doc as $b) {
+	if (strpos ($b['type'], "[C] ") === 0) {
+		$classes[] = $b;
+		$classlist[$b['lua']] = $b;
+		if (strpos ($b['type'], 'Pointer Class') === false) {
+			$classdecl[$b['ldec']] = $b;
+		}
+	}
+}
+
+foreach ($classes as $c) {
+	if (strpos ($c['type'], 'Pointer Class') !== false) { continue; }
+	if (isset ($c['parent'])) {
+		if (isset ($classdecl[$c['parent']])) {
+			$classlist[$c['lua']]['luaparent'][] = $classdecl[$c['parent']]['lua'];
+		} else {
+			my_die ('unknown parent class: ' . print_r ($c, true));
+		}
+	}
+}
+
+# step 2: extract constants/enum
+foreach ($doc as $b) {
+	switch ($b['type']) {
+	case "Constant/Enum":
+	case "Constant/Enum Member":
+		if (strpos ($b['ldec'], '::') === false) {
+			# for extern c enums, use the Lua Namespace
+			$b['ldec'] = str_replace (':', '::', luafn2class ($b['lua']));
+		}
+		$ns = str_replace ('::', ':', $b['ldec']);
+		$constlist[$ns][] = $b;
+		# arg2lua lookup
+		$b['lua'] = $ns;
+		$consts[] = $b;
+		break;
+	default:
+		break;
+	}
+}
+
+# step 3: process functions
+foreach ($doc as $b) {
+	switch ($b['type']) {
+	case "Constructor":
+	case "Weak/Shared Pointer Constructor":
+		checkclass ($b);
+		$classlist[luafn2class ($b['lua'])]['ctor'][] = array (
+			'name' => luafn2class ($b['lua']),
+			'args' => decl2args ($b['ldec']),
+			'cand' => canonical_ctor ($b)
+		);
+		break;
+	case "Data Member":
+		checkclass ($b);
+		$classlist[luafn2class ($b['lua'])]['data'][] = array (
+			'name' => $b['lua'],
+			'ret'  => arg2lua (datatype ($b['ldec']))
+		);
+		break;
+	case "Static C Function":
+		checkclass ($b);
+		if (strpos ($b['lua'], 'ARDOUR:DataType:') === 0) {
+			# special case ARDOUR:DataType convenience c'tor
+			$args = array ();
+			$ret = array (luafn2class ($b['lua']) => 0);
+			$canon = 'ARDOUR::LuaAPI::datatype_ctor_'.strtolower (luafn2name ($b['lua'])).'(lua_State*)';
+		} else {
+			my_die ('unhandled Static C: ' . print_r($b, true));
+		}
+		$classlist[luafn2class ($b['lua'])]['func'][] = array (
+			'bind' => $b,
+			'name' => $b['lua'],
+			'args' => $args,
+			'ret'  => $ret,
+			'ref'  => false,
+			'ext'  => false,
+			'cand' => $canon
+		);
+		break;
+	case "C Function":
+		# we required C functions to be in a class namespace
+	case "Ext C Function":
+		checkclass ($b);
+		$args = array (array ('--lua--' => 0));
+		$ret = array ('...' => 0);
+		$ns = luafn2class ($b['lua']);
+		$cls = $classlist[$ns];
+		if (preg_match ('/.*<([^>]*)[ ]*>/', $cls['ldec'], $templ)) {
+			# std::vector, std::list types
+			switch (stripclass($ns, $b['lua'])) {
+			case 'add':
+				#$args = array (array ('LuaTable {'.$templ[1].'}' => 0));
+				$args = array (arg2lua ($templ[1], 2));
+				$ret = array ('LuaTable' => 0);
+				break;
+			case 'iter':
+				$args = array ();
+				$ret = array ('LuaIter' => 0);
+				break;
+			case 'table':
+				$args = array ();
+				$ret = array ('LuaTable' => 0);
+				break;
+			default:
+				break;
+			}
+		} else if (strpos ($cls['type'], ' Array') !== false) {
+			# catches  C:FloatArray, C:IntArray
+			$templ = preg_replace ('/[&*]*$/', '', $cls['ldec']);
+			switch (stripclass($ns, $b['lua'])) {
+			case 'array':
+				$args = array ();
+				$ret = array ('LuaMetaTable' => 0);
+				break;
+			case 'get_table':
+				$args = array ();
+				$ret = array ('LuaTable' => 0);
+				break;
+			case 'set_table':
+				$args = array (array ('LuaTable {'.$templ.'}' => 0));
+				$ret = array ('void' => 0);
+				break;
+			default:
+				break;
+			}
+		}
+		$classlist[luafn2class ($b['lua'])]['func'][] = array (
+			'bind' => $b,
+			'name' => $b['lua'],
+			'args' => $args,
+			'ret'  => $ret,
+			'ref'  => true,
+			'ext'  => true,
+			'cand' => canonical_decl ($b)
+		);
+		break;
+	case "Free C Function":
+		$funclist[luafn2class ($b['lua'])][] = array (
+			'bind' => $b,
+			'name' => $b['lua'],
+			'args' => $args,
+			'ret'  => $ret,
+			'ref'  => false,
+			'ext'  => true,
+			'cand' => str_replace (':', '::', $b['lua']).'(lua_State*)'
+		);
+		break;
+	case "Free Function":
+	case "Free Function RefReturn":
+		$funclist[luafn2class ($b['lua'])][] = array (
+			'bind' => $b,
+			'name' => $b['lua'],
+			'args' => decl2args ($b['ldec']),
+			'ret'  => arg2lua ($b['ret']),
+			'ref'  => (strpos ($b['type'], "RefReturn") !== false),
+			'cand' => canonical_decl ($b)
+		);
+		break;
+	case "Member Function":
+	case "Member Function RefReturn":
+	case "Member Pointer Function":
+	case "Weak/Shared Pointer Function":
+	case "Weak/Shared Pointer Function RefReturn":
+	case "Weak/Shared Null Check":
+	case "Static Member Function":
+		checkclass ($b);
+		$classlist[luafn2class ($b['lua'])]['func'][] = array (
+			'bind' => $b,
+			'name' => $b['lua'],
+			'args' => decl2args ($b['ldec']),
+			'ret'  => arg2lua ($b['ret']),
+			'ref'  => (strpos ($b['type'], "RefReturn") !== false),
+			'cand' => canonical_decl ($b)
+		);
+		break;
+	case "Cast":
+	case "Weak/Shared Pointer Cast":
+		checkclass ($b);
+		$classlist[luafn2class ($b['lua'])]['cast'][] = array (
+			'bind' => $b,
+			'name' => $b['lua'],
+			'args' => decl2args ($b['ldec']),
+			'ret'  => arg2lua ($b['ret']),
+			'ref'  => (strpos ($b['type'], "RefReturn") !== false),
+			'cand' => canonical_decl ($b)
+		);
+		break;
+	case "Constant/Enum":
+	case "Constant/Enum Member":
+		# already handled -> $consts
+		break;
+	default:
+		if (strpos ($b['type'], "[C] ") !== 0) {
+			my_die ('unhandled type: ' . $b['type']);
+		}
+		break;
+	}
+}
+
+
+# step 4: collect/group/sort
+
+# step 4a: unify weak/shared Ptr classes
+foreach ($classlist as $ns => $cl) {
+	if (strpos ($cl['type'], ' Array') !== false) {
+		$classlist[$ns]['arr'] = true;
+		$classlist[$ns]['cdecl'] = $cl['decl'];
+		continue;
+	}
+	foreach ($classes as $c) {
+		if ($c['lua'] == $ns) {
+			if (strpos ($c['type'], 'Pointer Class') !== false) {
+				$classlist[$ns]['ptr'] = true;
+				$classlist[$ns]['cdecl'] = 'boost::shared_ptr< '.$c['decl']. ' >, boost::weak_ptr< '.$c['decl']. ' >';
+				break;
+			} else {
+				$classlist[$ns]['cdecl'] = $c['decl'];
+			}
+		}
+	}
+}
+
+# step4b: sanity check
+foreach ($classlist as $ns => $cl) {
+	if (isset ($classes[$ns]['parent']) && !isset ($classlist[$ns]['luaparent'])) {
+		my_die ('missing parent class: ' . print_r ($cl, true));
+	}
+}
+
+# step 4c: merge free functions into classlist
+foreach ($funclist as $ns => $fl) {
+	if (isset ($classlist[$ns])) {
+		my_die ('Free Funcion in existing namespace: '.$ns.' '. print_r ($ns, true));
+	}
+	$classlist[$ns]['func'] = $fl;
+	$classlist[$ns]['free'] = true;
+}
+
+# step 4d: order to chaos
+# no array_multisort() here, sub-types are sorted after merging parents
+ksort ($classlist);
+
+
+################################################################################
+################################################################################
+################################################################################
+
+
+#### -- split here --  ####
+
+# from here on, only $classlist and $constlist arrays are relevant.
+# we also pull in C++ header annotation from doxygen to $api
+
+
+# read documentation from doxygen
+$json = gzdecode (file_get_contents (dirname (__FILE__).'/../doc/ardourapi.json.gz'));
+$api = array ();
+foreach (json_decode ($json, true) as $a) {
+	if (!isset ($a['decl'])) { continue; }
+	if (empty ($a['decl'])) { continue; }
+	$canon = str_replace (' *', '*', $a['decl']);
+	$api[$canon] = $a;
+}
+
+# keep track of found/missing doc
+$dox_found = 0;
+$dox_miss = 0;
+
+# retrive a value from $api
+function doxydoc ($canonical_declaration) {
+	global $api;
+	global $dox_found;
+	global $dox_miss;
+	if (isset ($api[$canonical_declaration])) {
+		$dox_found++;
+		return $api[$canonical_declaration]['doc'];
+	}
+	// remove template namespace e.g.
+	//  "ARDOUR::Track::bounceable(boost::shared_ptr<ARDOUR::Processor>"
+	//  "ARDOUR::Track::bounceable(boost::shared_ptr<Processor>"
+	$cn = preg_replace ('/<[^>]*::([^>]*)>/', '<$1>', $canonical_declaration);
+	if (isset ($api[$cn])) {
+		$dox_found++;
+		return $api[$cn]['doc'];
+	}
+	#fwrite (STDERR, $canonical_declaration."\n"); # XXX DEBUG
+
+	$dox_miss++;
+	return '';
+}
+
+################################################################################
+# OUTPUT
+################################################################################
+
+
+################################################################################
+# Helper functions
+define ('NL', "\n");
+
+# constructors, enums (constants) use a dot.  (e.g. "LuaOSC.Address" -> "LuaOSC.Address" )
+function ctorname ($name) {
+	return htmlentities (str_replace (':', '.', $name));
+}
+
+# strip class prefix (e.g "Evoral:MidiEvent:channel"  -> "channel")
+function shortname ($name) {
+	return htmlentities (substr ($name, strrpos ($name, ':') + 1));
+}
+
+# retrieve variable name from    array["VARNAME"] => FLAGS
+function varname ($a) {
+	return array_keys ($a)[0];
+}
+
+# recusively collect class parents (derived classes)
+function traverse_parent ($ns, &$inherited) {
+	global $classlist;
+	$rv = '';
+	if (isset ($classlist[$ns]['luaparent'])) {
+		$parents = array_unique ($classlist[$ns]['luaparent']);
+		asort ($parents);
+		foreach ($parents as $p) {
+			if (!empty ($rv)) { $rv .= ', '; }
+			$rv .= typelink ($p);
+			$inherited[$p] = $classlist[$p];
+			traverse_parent ($p, $inherited);
+		}
+	}
+	return $rv;
+}
+
+# create a cross-reference to a type (class or enum)
+# *all* <a> links are generated here, currently anchors on a single page.
+function typelink ($a, $short = false, $argcls = '', $linkcls = '', $suffix = '') {
+	global $classlist;
+	global $constlist;
+	if (isset($classlist[$a]['free'])) {
+		return '<a class="'.$linkcls.'" href="#'.htmlentities ($a).'">'.($short ? shortname($a) : ctorname($a)).$suffix.'</a>';
+	} else if (in_array ($a, array_keys ($classlist))) {
+		return '<a class="'.$linkcls.'" href="#'.htmlentities($a).'">'.($short ? shortname($a) : htmlentities($a)).$suffix.'</a>';
+	} else if (in_array ($a, array_keys ($constlist))) {
+		return '<a class="'.$linkcls.'" href="#'.ctorname ($a).'">'.($short ? shortname($a) : ctorname($a)).$suffix.'</a>';
+	} else {
+		return '<span class="'.$argcls.'">'.htmlentities($a).$suffix.'</span>';
+	}
+}
+
+# output format function arguments
+function format_args ($args) {
+	$rv = '<span class="functionargs"> (';
+	$first = true;
+	foreach ($args as $a) {
+		if (!$first) { $rv .= ', '; }; $first = false;
+		$flags = $a[varname ($a)];
+		if ($flags & 2) {
+			$rv .= '<em>LuaTable</em> {'.typelink (varname ($a), true, 'em').'}';
+		}
+		elseif ($flags & 1) {
+			$rv .= typelink (varname ($a), true, 'em', '', '&');
+		}
+		else {
+			$rv .= typelink (varname ($a), true, 'em');
+		}
+	}
+	$rv .= ')</span>';
+	return $rv;
+}
+
+# format doxygen documentation for class-definition
+function format_doxyclass ($cl) {
+	$rv = '';
+	if (isset ($cl['decl'])) {
+		$doc = doxydoc ($cl['decl']);
+		if (!empty ($doc)) {
+			$rv.= '<div class="classdox">'.$doc.'</div>'.NL;
+		}
+	}
+	return $rv;
+}
+
+# format doxygen documentation for class-members
+function format_doxydoc ($f) {
+	$rv = '';
+	if (isset ($f['cand'])) {
+		$doc = doxydoc ($f['cand']);
+		if (!empty ($doc)) {
+			$rv.= '<tr><td></td><td class="doc" colspan="2"><div class="dox">'.$doc;
+			$rv.= '</div></td></tr>'.NL;
+		} else if (0) { # debug
+			$rv.= '<tr><td></td><td class="doc" colspan="2"><p>'.htmlentities($f['cand']).'</p>';
+			$rv.= '</td></tr>'.NL;
+		}
+	}
+	return $rv;
+}
+
+# usort() callback for class-members
+function name_sort_cb ($a, $b) {
+	return strcmp ($a['name'], $b['name']);
+}
+
+# main output function for every class
+function format_class_members ($ns, $cl, &$dups) {
+	$rv = '';
+	# print contructor - if any
+	if (isset ($cl['ctor'])) {
+		usort ($cl['ctor'], 'name_sort_cb');
+		$rv.= ' <tr><th colspan="3">Constructor</th></tr>'.NL;
+		foreach ($cl['ctor'] as $f) {
+			$rv.= ' <tr><td class="def">ℂ</td><td class="decl">';
+			$rv.= '<span class="functionname">'.ctorname ($f['name']).'</span>';
+			$rv.= format_args ($f['args']);
+			$rv.= '</td><td class="fill"></td></tr>'.NL;
+			# doxygen documentation (may be empty)
+			$rv.= format_doxydoc($f);
+		}
+	}
+
+	# strip duplicates (inherited or derived methods)
+	# e.g  AudioTrack -> Track -> Route -> SessionObject -> Stateful
+	# all 5 have "isnil()"
+	$nondups = array ();
+	if (isset ($cl['func'])) {
+		foreach ($cl['func'] as $f) {
+			if (in_array (stripclass ($ns, $f['name']), $dups)) { continue; }
+			$nondups[] = $f;
+		}
+	}
+
+	# print methods - if any
+	if (count ($nondups) > 0) {
+		usort ($nondups, 'name_sort_cb');
+		$rv.= ' <tr><th colspan="3">Methods</th></tr>'.NL;
+		foreach ($nondups as $f) {
+			$dups[] = stripclass ($ns, $f['name']);
+			# return value/type
+			$rv.= ' <tr><td class="def">';
+			if ($f['ref'] && isset ($f['ext'])) {
+				# external C functions
+				$rv.= '<em>'.varname ($f['ret']).'</em>';
+			} elseif ($f['ref'] && varname ($f['ret']) == 'void') {
+				# void functions with reference args
+				$rv.= '<em>LuaTable</em>(...)';
+			} elseif ($f['ref']) {
+				# functions with reference args and return value
+				$rv.= '<em>LuaTable</em>('.typelink (varname ($f['ret']), true, 'em').', ...)';
+			} else {
+				# normal class members
+				$rv.= typelink (varname ($f['ret']), true, 'em');
+			}
+			# function declaration and arguments
+			$rv.= '</td><td class="decl">';
+			$rv.= '<span class="functionname"><abbr title="'.htmlentities($f['bind']['decl']).'">'.stripclass ($ns, $f['name']).'</abbr></span>';
+			$rv.= format_args ($f['args']);
+			$rv.= '</td><td class="fill"></td></tr>'.NL;
+			# doxygen documentation (may be empty)
+			$rv.= format_doxydoc($f);
+		}
+	}
+	# print cast - if any
+	if (isset ($cl['cast'])) {
+		usort ($cl['cast'], 'name_sort_cb');
+		$rv.= ' <tr><th colspan="3">Cast</th></tr>'.NL;
+		foreach ($cl['cast'] as $f) {
+			$rv.= ' <tr><td class="def">';
+			$rv.= typelink (varname ($f['ret']), true, 'em');
+			# function declaration and arguments
+			$rv.= '</td><td class="decl">';
+			$rv.= '<span class="functionname"><abbr title="'.htmlentities($f['bind']['decl']).'">'.stripclass ($ns, $f['name']).'</abbr></span>';
+			$rv.= format_args ($f['args']);
+			$rv.= '</td><td class="fill"></td></tr>'.NL;
+			# doxygen documentation (may be empty)
+			$rv.= format_doxydoc($f);
+		}
+	}
+
+	# print data members - if any
+	if (isset ($cl['data'])) {
+		usort ($cl['data'], 'name_sort_cb');
+		$rv.= ' <tr><th colspan="3">Data Members</th></tr>'.NL;
+		foreach ($cl['data'] as $f) {
+			$rv.= ' <tr><td class="def">'.typelink (array_keys ($f['ret'])[0], false, 'em').'</td><td class="decl">';
+			$rv.= '<span class="functionname">'.stripclass ($ns, $f['name']).'</span>';
+			$rv.= '</td><td class="fill"></td></tr>'.NL;
+		}
+	}
+	return $rv;
+}
+
+
+################################################################################
+# Start Output
+
+if ($HTMLOUTPUT) {
+
+?><!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
+<head>
+<title>Ardour Lua Bindings</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<style type="text/css">
+div.header         { text-align:center; }
+div.header h2      { margin:0; }
+div.header p       { margin:.25em; text-align:center; }
+div.luafooter      { text-align:center; font-size:80%; color: #888; margin: 2em 0; }
+#luaref            { max-width:60em; margin: 1em auto; }
+
+#luaref h2                 { margin:2em 0 0 0; padding:0em; border-bottom: 1px solid black; }
+#luaref h3.cls             { margin:2em 0 0 0; padding: 0 0 0 1em; border: 1px dashed #6666ee; }
+#luaref h3.cls abbr        { text-decoration:none; cursor:default; }
+#luaref h4.cls             { margin:1em 0 0 0; }
+#luaref h3.class           { background-color: #aaee66; }
+#luaref h3.enum            { background-color: #aaaaaa; }
+#luaref h3.pointerclass    { background-color: #eeaa66; }
+#luaref h3.array           { background-color: #66aaee; }
+#luaref h3.opaque          { background-color: #6666aa; }
+#luaref p                  { text-align: justify; }
+#luaref p.cdecl            { text-align: right; float:right; font-size:90%; margin:0; padding: 0 0 0 1em; }
+#luaref ul.classindex      { columns: 2; -webkit-columns: 2; -moz-columns: 2; }
+#luaref div.clear          { clear:both; }
+#luaref p.classinfo        { margin: .25em 0; }
+#luaref div.code           { width:80%; margin:.5em auto; }
+#luaref div.code div       { width:45%; }
+#luaref div.code pre       { line-height: 1.2em; margin: .25em 0; }
+#luaref div.code samp      { color: green; font-weight: bold; background-color: #eee; }
+#luaref div.classdox       { padding: .1em 1em; }
+#luaref div.classdox p     { margin: .5em 0 .5em .6em; }
+#luaref div.classdox p     { margin: .5em 0 .5em .6em; }
+#luaref div.classdox       { padding: .1em 1em; }
+#luaref div.classdox p     { margin: .5em 0 .5em .6em; }
+#luaref table.classmembers { width: 100%; }
+#luaref table.classmembers th      { text-align:left; border-bottom:1px solid black; padding-top:1em; }
+#luaref table.classmembers td.def  { text-align:right; padding-right:.5em;  white-space: nowrap; }
+#luaref table.classmembers td.decl { text-align:left; padding-left:.5em; white-space: nowrap; }
+#luaref table.classmembers td.doc  { text-align:left; padding-left:.6em; line-height: 1.2em; font-size:80%; }
+#luaref table.classmembers td.doc div.dox {background-color:#eee; padding: .1em 1em; }
+#luaref table.classmembers td.doc p { margin: .5em 0; }
+#luaref table.classmembers td.doc p.para-brief { font-size:120%; }
+#luaref table.classmembers td.doc p.para-returns { font-size:120%; }
+#luaref table.classmembers td.doc dl { font-size:120%; line-height: 1.3em; }
+#luaref table.classmembers td.doc dt { font-style: italic; }
+#luaref table.classmembers td.fill { width: 99%; }
+#luaref table.classmembers span.em { font-style: italic; }
+#luaref span.functionname abbr     { text-decoration:none; cursor:default; }
+</style>
+</head>
+<body>
+<div class="header">
+<h2>Ardour Lua Bindings</h2>
+<p>
+<a href="#h_classes">Class Documentation</a>
+ | 
+<a href="#h_enum">Enum/Constants</a>
+ | 
+<a href="#h_index">Index</a>
+</p>
+</div>
+
+<!-- #### SNIP #### !-->
+
+<?php
+
+} else {
+
+?>
+---
+layout: default
+style: luadoc
+title: Class Reference
+---
+
+<p class="warning">
+This documentation is far from complete may be inaccurate and subject to change.
+</p>
+
+<?php
+}
+?>
+
+<div id="luaref">
+
+<?php
+
+################################################################################
+# some general documentation -- should really go elsehere
+
+?>
+
+<h2 id="h_intro">Overview</h2>
+<p>
+The top-level entry point are <?=typelink('ARDOUR:Session')?> and <?=typelink('ArdourUI:Editor')?>.
+Most other Classes are used indirectly starting with a Session function. e.g. Session:get_routes().
+</p>
+<p>
+A few classes are dedicated to certain script types, e.g. Lua DSP processors have exclusive access to
+<?=typelink('ARDOUR:DSP')?> and <?=typelink('ARDOUR:ChanMapping')?>. Action Hooks Scripts to
+<?=typelink('LuaSignal:Set')?> etc.
+</p>
+<p>
+Detailed documentation (parameter names, method description) is not yet available. Please stay tuned.
+</p>
+<h3>Short introduction to Ardour classes</h3>
+<p>
+Ardour's structure is object oriented. The main object is the Session. A Session contains Audio Tracks, Midi Tracks and Busses.
+Audio and Midi tracks are derived from a more general "Track" Object,  which in turn is derived from a "Route" (aka Bus).
+(We say "An Audio Track <em>is-a</em> Track <em>is-a</em> Route").
+Tracks contain specifics. For Example a track <em>has-a</em> diskstream (for file i/o).
+</p>
+<p>
+Operations are performed on objects. One gets a reference to an object and then calls a method.
+e.g <code>obj = Session:route_by_name("Audio")   obj:set_name("Guitar")</code>.
+</p>
+<p>
+Lua automatically follows C++ class inheritance. e.g one can directly call all SessionObject and Route methods on Track object. However lua does not automatically promote objects. A Route object which just happens to be a Track needs to be explicily cast to a Track. Methods for casts are provided with each class. Note that the cast may fail and return a <em>nil</em> reference.
+</p>
+<p>
+Likewise multiple inheritance is a <a href="http://www.lua.org/pil/16.3.html">non-trivial issue</a> in lua. To avoid performance penalties involved with lookups, explicit casts are required in this case. One example is <?=typelink('ARDOUR:SessionObject')?> which is-a StatefulDestructible which inhertis from both Stateful and Destructible.
+</p>
+<p>
+Object lifetimes are managed by the Session. Most Objects cannot be directly created, but one asks the Session to create or destroy them. This is mainly due to realtime constrains:
+you cannot simply remove a track that is currently processing audio. There are various <em>factory</em> methods for object creation or removal.
+</p>
+<h3>Pass by Reference</h3>
+<p>
+Since lua functions are closures, C++ methods that pass arguments by reference cannot be used as-is.
+All parameters passed to a C++ method which uses references are returned as Lua Table.
+If the C++ method also returns a value it is prefixed. Two parameters are returned: the value and a Lua Table holding the parameters.
+</p>
+
+<div class="code">
+	<div style="float:left;">C++
+
+<pre><code class="cxx">void set_ref (int& var, long& val)
+{
+	printf ("%d %ld\n", var, val);
+	var = 5;
+	val = 7;
+}
+</code></pre>
+
+	</div>
+	<div style="float:right;">Lua
+
+<pre><code class="lua">local var = 0;
+ref = set_ref (var, 2);
+-- output from C++ printf()
+</code><samp class="lua">0 2</samp><code>
+-- var is still 0 here
+print (ref[1], ref[2])
+</code><samp class="lua">5 7</samp></pre>
+
+	</div>
+</div>
+<div class="clear"></div>
+<div class="code">
+	<div style="float:left;">
+
+<pre><code class="cxx">int set_ref2 (int &var, std::string unused)
+{
+	var = 5;
+	return 3;
+}
+</code></pre>
+
+	</div>
+	<div style="float:right;">
+<pre><code class="lua">rv, ref = set_ref2 (0, "hello");
+print (rv, ref[1], ref[2])
+</code><samp class="lua">3 5 hello</samp></pre>
+	</div>
+</div>
+<div class="clear"></div>
+
+<h3>Pointer Classes</h3>
+<p>
+Libardour makes extensive use of reference counted <code>boost::shared_ptr</code> to manage lifetimes.
+The Lua bindings provide a complete abstration of this. There are no pointers in lua.
+For example a <?=typelink('ARDOUR:Route')?> is a pointer in C++, but lua functions operate on it like it was a class instance.
+</p>
+<p>
+<code>shared_ptr</code> are reference counted. Once assigned to a lua variable, the C++ object will be kept and remains valid.
+It is good practice to assign references to lua <code>local</code> variables or reset the variable to <code>nil</code> to drop the ref.
+</p>
+<p>
+All pointer classes have a <code>isnil ()</code> method. This is for two cases:
+Construction may fail. e.g. <code><?=typelink('ARDOUR:LuaAPI')?>.newplugin()</code>
+may not be able to find the given plugin and hence cannot create an object.
+</p>
+<p>
+The second case if for <code>boost::weak_ptr</code>. As opposed to <code>boost::shared_ptr</code> weak-pointers are not reference counted.
+The object may vanish at any time.
+If lua code calls a method on a nil object, the interpreter will raise an exception and the script will not continue.
+This is not unlike <code>a = nil a:test()</code> which results in en error "<em>attempt to index a nil value</em>".
+</p>
+<p>
+From the lua side of things there is no distinction between weak and shared pointers. They behave identically.
+Below they're inidicated in orange and have an arrow to indicate the pointer type.
+Pointer Classes cannot be created in lua scripts. It always requires a call to C++ to create the Object and obtain a reference to it.
+</p>
+
+
+<?php
+
+#################################
+# Main output function -- Classes
+
+echo '<h2 id="h_classes">Class Documentation</h2>'.NL;
+foreach ($classlist as $ns => $cl) {
+	$dups = array ();
+	$tbl =  format_class_members ($ns, $cl, $dups);
+
+	# format class title - depending on type
+	if (empty ($tbl)) {
+		# classes with no members (no ctor, no methods, no data)
+		echo '<h3 id="'.htmlentities ($ns).'" class="cls opaque"><abbr title="Opaque Object">∅</abbr> '.htmlentities ($ns).'</h3>'.NL;
+	}
+	else if (isset ($classlist[$ns]['free'])) {
+		# free functions (no class)
+		echo '<h3 id="'.htmlentities ($ns).'" class="cls freeclass"><abbr title="Namespace">ℕ</abbr> '.ctorname($ns).'</h3>'.NL;
+	}
+	else if (isset ($classlist[$ns]['arr'])) {
+		# C Arrays
+		echo '<h3 id="'.htmlentities ($ns).'" class="cls array"><abbr title="C Array">⋯</abbr> '.htmlentities ($ns).'</h3>'.NL;
+	}
+	else if (isset ($classlist[$ns]['ptr'])) {
+		# Pointer Classes
+		echo '<h3 id="'.htmlentities ($ns).'" class="cls pointerclass"><abbr title="Pointer Class">↠</abbr> '. htmlentities ($ns).'</h3>'.NL;
+	}
+	else {
+		# Normal Class
+		echo '<h3 id="'.htmlentities ($ns).'" class="cls class"><abbr title="Class">∁</abbr> '.htmlentities ($ns).'</h3>'.NL;
+	}
+
+	# show original C++ declaration
+	if (isset ($cl['cdecl'])) {
+		echo '<p class="cdecl"><em>C‡</em>: '.htmlentities ($cl['cdecl']).'</p>'.NL;
+	}
+
+	# print class inheritance (direct parent *name* only)
+	$inherited = array ();
+	$isa = traverse_parent ($ns, $inherited);
+	if (!empty ($isa)) {
+		echo ' <p class="classinfo">is-a: '.$isa.'</p>'.NL;
+	}
+	echo '<div class="clear"></div>'.NL;
+
+
+	# class documentation (if any)
+	echo format_doxyclass ($cl);
+
+	# member documentation
+	if (empty ($tbl)) {
+		echo '<p class="classinfo">This class object is only used indirectly as return-value and function-parameter. It provides no methods by itself.</p>'.NL;
+	} else {
+		echo '<table class="classmembers">'.NL;
+		echo $tbl;
+		echo ' </table>'.NL;
+	}
+
+	# traverse parent classes (all inherited members)
+	foreach ($inherited as $pns => $pcl) {
+		$tbl = format_class_members ($pns, $pcl, $dups);
+		if (!empty ($tbl)) {
+			echo '<h4 class="cls">Inherited from '.$pns.'</h4>'.NL;
+			echo '<table class="classmembers">'.NL;
+			echo $tbl;
+			echo '</table>'.NL;
+		}
+	}
+}
+
+####################
+# Enum and Constants
+
+echo '<h2 id="h_enum">Enum/Constants</h2>'.NL;
+foreach ($constlist as $ns => $cs) {
+	echo '<h3 id="'.ctorname ($ns).'" class="cls enum"><abbr title="Enum">∈</abbr> '.ctorname ($ns).'</h3>'.NL;
+	echo '<ul class="enum">'.NL;
+	foreach ($cs as $c) {
+		echo '<li class="const">'.ctorname ($c['lua']).'</li>'.NL;
+	}
+	echo '</ul>'.NL;
+}
+
+######################
+# Index of all classes
+
+echo '<h2 id="h_index" >Class Index</h2>'.NL;
+echo '<ul class="classindex">'.NL;
+foreach ($classlist as $ns => $cl) {
+	echo '<li>'.typelink($ns).'</li>'.NL;
+}
+echo '</ul>'.NL;
+
+
+# see how far there is still to go...
+fwrite (STDERR, "Found $dox_found annotations. missing: $dox_miss\n");
+echo '<!-- '.$dox_found.' / '.$dox_miss.' !-->'.NL;
+
+?>
+</div>
+<div class="luafooter">Ardour <?=$ardourversion?>  -  <?=date('r')?></div>
+<?php
+
+if ($HTMLOUTPUT) {
+	echo '<!-- #### SNIP #### !-->'.NL;
+	echo '</body>'.NL;
+	echo '</html>'.NL;
+}
diff --git a/tools/gccabicheck/Makefile b/tools/gccabicheck/Makefile
index 2949e46..e891d85 100644
--- a/tools/gccabicheck/Makefile
+++ b/tools/gccabicheck/Makefile
@@ -1,7 +1,7 @@
 CFLAGS = -Wall
 LOADLIBES = -ldl
 
-gcc-glibmm-abi-check:
+gcc-glibmm-abi-check: abicheck.c
 	$(CC) $(CPPFLAGS) $(CFLAGS) \
 		-o gcc-glibmm-abi-check \
 		abicheck.c \
diff --git a/tools/gccabicheck/wscript b/tools/gccabicheck/wscript
index ecef5c6..afdb99f 100644
--- a/tools/gccabicheck/wscript
+++ b/tools/gccabicheck/wscript
@@ -2,6 +2,8 @@
 from waflib.extras import autowaf as autowaf
 from waflib import Options
 import os
+import re
+import sys
 
 # Mandatory variables
 top = '.'
@@ -19,5 +21,6 @@ def build(bld):
     obj.source = [ 'abicheck.c' ]
     obj.target = 'gcc-glibmm-abi-check'
     obj.name = 'gcc-glibmm-abi-check'
-    obj.lib = 'dl'
+    if re.search ("freebsd", sys.platform) == None:
+        obj.lib = 'dl'
     obj.install_path = None
diff --git a/tools/jacktest.c b/tools/jacktest.c
index 62a6a08..d75dad5 100644
--- a/tools/jacktest.c
+++ b/tools/jacktest.c
@@ -10,7 +10,7 @@ jack_port_t *input_port;
 jack_port_t *output_port;
 jack_client_t *client;
 int loopsize = 25000;
-int xrun_occured = 0;
+int xrun_occurred = 0;
 int consecutive_xruns = 0;
 float first_xrun = 0.0f;
 float last_load = 0.0f;
@@ -59,14 +59,14 @@ process (jack_nframes_t nframes, void *arg)
 		printf ("loopsize = %d\n", loopsize);
 	}
 
-	if (xrun_occured) {
+	if (xrun_occurred) {
 		if (consecutive_xruns == 0) {
 			first_xrun = last_load;
 		}
 		consecutive_xruns++;
 	}
 
-	xrun_occured = 0;
+	xrun_occurred = 0;
 
 	if (consecutive_xruns >= 10) {
 		fprintf (stderr, "Stopping with load = %f (first xrun at %f)\n", last_load, first_xrun);
@@ -90,8 +90,8 @@ jack_shutdown (void *arg)
 int
 jack_xrun (void *arg)
 {
-	fprintf (stderr, "xrun occured with loop size = %d\n", loopsize);
-	xrun_occured = 1;
+	fprintf (stderr, "xrun occurred with loop size = %d\n", loopsize);
+	xrun_occurred = 1;
 	return 0;
 }
 
diff --git a/tools/linux_packaging/build b/tools/linux_packaging/build
index f25cd2f..cee48ce 100755
--- a/tools/linux_packaging/build
+++ b/tools/linux_packaging/build
@@ -36,6 +36,7 @@ GCC5ABI=false
 USEWINE=false
 BUILDTYPE=""
 NOSTRIP="libsuil|libserd|libsord|liblilv|libsratom|liblrdf|libardour|libpbd|libevoral"
+: ${HARRISONCHANNELSTRIP=harrison_channelstrip}
 
 
 if [ $# -eq 0 ] ; then
@@ -66,7 +67,20 @@ while [ $# -gt 0 ] ; do
 		VENDOR=Harrison ;
 		EXENAME=mixbus ;
 		shift ;;
+	--mixbus32c)
+		MIXBUS=1;
+		WITH_HARRISON_LV2=1 ;
+		WITH_X42_LV2=1 ;
+		WITH_NLS=1 ;
+		WITH_LADSPA=;
+		STRIP=all
+		APPNAME=Mixbus32C ;
+		VENDOR=Harrison ;
+		EXENAME=mixbus32c ;
+		major_version=""
+		shift ;;
 	--public)
+		WITH_HARRISON_LV2=1 ;
 		WITH_NLS=1 ;
 		WITH_LADSPA=;
 		STRIP=all ;
@@ -90,6 +104,7 @@ while [ $# -gt 0 ] ; do
 	--nls) WITH_NLS=1 ; shift ;;
 	--harvid) WITH_HARVID=1 ; shift ;;
 	--gcc5abi) GCC5ABI=true ; shift ;;
+	--chanstrip) HARRISONCHANNELSTRIP=$2 ; shift; shift ;;
 
 	*)
 		#catch all for unknown arguments
@@ -172,11 +187,13 @@ Surfaces=$APPLIB/surfaces
 Panners=$APPLIB/panners
 Backends=$APPLIB/backends
 
+Themes=$Shared/themes
 Templates=$Shared/templates
 ExportFormats=$Shared/export
 Locale=$Shared/locale
 MidiMaps=$Shared/midi_maps
 PatchFiles=$Shared/patchfiles
+LuaScripts=$Shared/scripts
 MackieControl=$Shared/mcp
 
 if [ x$PRINT_SYSDEPS != x ] ; then
@@ -205,10 +222,12 @@ mkdir -p $APPBIN
 mkdir -p $APPLIB
 mkdir -p $Etc
 mkdir -p $Shared
+mkdir -p $Themes
 mkdir -p $Locale
 mkdir -p $Surfaces
 mkdir -p $MidiMaps
 mkdir -p $PatchFiles
+mkdir -p $LuaScripts
 mkdir -p $MackieControl
 mkdir -p $ExportFormats
 mkdir -p $Panners
@@ -372,6 +391,15 @@ for x in $BUILD_ROOT/../patchfiles/*.midnam ; do
     cp "$x" $PatchFiles
 done
 
+# Lua Scripts Files
+# got to be careful with names here
+for x in $BUILD_ROOT/../scripts/*.lua ; do
+	  if test "${x:0:1}" = "_"; then
+			continue;
+		fi
+    cp "$x" $LuaScripts
+done
+
 # MackieControl data
 # got to be careful with names here
 for x in $BUILD_ROOT/../mcp/*.device $BUILD_ROOT/../mcp/*.profile ; do
@@ -445,7 +473,15 @@ OURLIBS=$OURLIBDIR/vamp-sdk:$OURLIBDIR/surfaces/control_protocol:$OURLIBDIR/ardo
 echo $OURLIBS${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}
 
 checkedIdx=0
-deplibs=
+
+# these are dynamically loaded by NSS
+deplibs="libfreeblpriv3.so libsoftokn3.so libnsspem.so"
+cp -v $GTKSTACK_ROOT/lib/libsoftokn3.so $Libraries/
+cp -v $GTKSTACK_ROOT/lib/libfreeblpriv3.so $Libraries/
+cp -v $GTKSTACK_ROOT/lib/libnsspem.so $Libraries/
+chrpath -r foo $Libraries/libsoftokn3.so
+chrpath -r foo $Libraries/libfreeblpriv3.so
+chrpath -r foo $Libraries/libnsspem.so
 
 while [ true ] ; do
 	missing=false
@@ -557,23 +593,25 @@ find $APPLIB/ -name "*.so*" -print0 | xargs -0 chmod a+rx
 echo "Copying other stuff to $APPDIR  ..."
 
 # these are all generated by waf
-cp $BUILD_ROOT/gtk2_ardour/mnemonic-us.bindings  $Etc
+cp $BUILD_ROOT/gtk2_ardour/ardour.keys  $Etc
 cp $BUILD_ROOT/gtk2_ardour/ardour.menus $Etc
 cp $BUILD_ROOT/gtk2_ardour/clearlooks.rc $Etc
 cp $BUILD_ROOT/gtk2_ardour/default_ui_config $Etc
 
 # Copied directly from source tree
 
+mkdir ${Shared}/icons
+mkdir ${Shared}/resources
 cp ../../system_config $Etc/system_config
-cp ../../gtk2_ardour/dark.colors $Etc
 cp ../../instant.xml $Shared/instant.xml
-cp ../../gtk2_ardour/step_editing.bindings $Etc
-cp ../../gtk2_ardour/mixer.bindings $Etc
-cp -r ../../gtk2_ardour/icons $Shared
-cp -r ../../gtk2_ardour/pixmaps $Shared
-cp -r ../../gtk2_ardour/splash.png $Shared
-cp -r ../../gtk2_ardour/small-splash.png $Shared
-cp -r ../../gtk2_ardour/ArdourMono.ttf $Shared
+cp ../../gtk2_ardour/icons/*.png ${Shared}/icons
+cp -r ../../gtk2_ardour/icons/cursor_* ${Shared}/icons/
+cp ../../gtk2_ardour/ArdourMono.ttf $Shared
+cp ../../gtk2_ardour/resources/${APPNAME}-* ${Shared}/resources/
+
+# Themes: only install those named for this app
+lower_case_appname=`echo $APPNAME | tr '[:upper:]' '[:lower:]'`
+cp ../../gtk2_ardour/themes/*-${lower_case_appname}.colors $Themes
 
 #
 # put sooper sekrit ingredients here and they will be copied
@@ -619,34 +657,43 @@ if test -n "$MIXBUS"; then
 
 	mkdir -p $APPLIB/ladspa/strip/
 	curl -s -S --fail -# \
-		-z "${CACHEDIR}/harrison_channelstrip.${HARCH}.so" \
-		-o "${CACHEDIR}/harrison_channelstrip.${HARCH}.so" \
-		"http://www.harrisonconsoles.com/mixbus/mb3/beta/harrison-dsp/harrison_channelstrip.${HARCH}.so"
+		-z "${CACHEDIR}/${HARRISONCHANNELSTRIP}.${HARCH}.so" \
+		-o "${CACHEDIR}/${HARRISONCHANNELSTRIP}.${HARCH}.so" \
+		"http://www.harrisonconsoles.com/mixbus/mb3/beta/harrison-dsp/${HARRISONCHANNELSTRIP}.${HARCH}.so"
+
+	cp "${CACHEDIR}/${HARRISONCHANNELSTRIP}.${HARCH}.so" \
+		$APPLIB/ladspa/strip/${HARRISONCHANNELSTRIP}.so
+	chmod +x $APPLIB/ladspa/strip/${HARRISONCHANNELSTRIP}.so
+
+	echo "Adding Harrison Vamp Plugins"
+
+	if test "$GCC5ABI" = "true"; then
+		VAMPARCH="${HARCH}gcc5"
+	else
+		VAMPARCH="${HARCH}"
+	fi
+	curl -s -S --fail -# \
+		-z "${CACHEDIR}/harrison_vamp.${VAMPARCH}.so" \
+		-o "${CACHEDIR}/harrison_vamp.${VAMPARCH}.so" \
+		"http://www.harrisonconsoles.com/mixbus/mb3/beta/harrison-dsp/harrison_vamp.${VAMPARCH}.so"
 
-	cp "${CACHEDIR}/harrison_channelstrip.${HARCH}.so" \
-		$APPLIB/ladspa/strip/harrison_channelstrip.so
-	chmod +x $APPLIB/ladspa/strip/harrison_channelstrip.so
+	cp "${CACHEDIR}/harrison_vamp.${VAMPARCH}.so" \
+		$APPLIB/harrison_vamp.so
+	chmod +x $APPLIB/harrison_vamp.so
 fi
 
 if test x$WITH_X42_LV2 != x ; then
-	METERS_VERSION=$(curl -s -S http://x42-plugins.com/x42/linux/x42-meters.latest.txt)
-	rsync -a -q --partial \
-		rsync://x42-plugins.com/x42/linux/x42-meters-lv2-linux-${WARCH}-${METERS_VERSION}.zip \
-		"${CACHEDIR}/x42-meters-lv2-linux-${WARCH}-${METERS_VERSION}.zip"
-	unzip -q -d "$APPLIB/LV2/" "${CACHEDIR}/x42-meters-lv2-linux-${WARCH}-${METERS_VERSION}.zip"
-
-	SETBFREE_VERSION=$(curl -s -S http://x42-plugins.com/x42/linux/setBfree.latest.txt)
-	rsync -a -q --partial \
-		rsync://x42-plugins.com/x42/linux/setBfree-lv2-linux-${WARCH}-${SETBFREE_VERSION}.zip \
-		"${CACHEDIR}/setBfree-lv2-linux-${WARCH}-${SETBFREE_VERSION}.zip"
-	unzip -q -d "$APPLIB/LV2/" "${CACHEDIR}/setBfree-lv2-linux-${WARCH}-${SETBFREE_VERSION}.zip"
-
-	MIDIFILTER_VERSION=$(curl -s -S http://x42-plugins.com/x42/linux/x42-midifilter.latest.txt)
-	rsync -a -q --partial \
-		rsync://x42-plugins.com/x42/linux/x42-midifilter-lv2-linux-${WARCH}-${MIDIFILTER_VERSION}.zip \
-		"${CACHEDIR}/x42-midifilter-lv2-linux-${WARCH}-${MIDIFILTER_VERSION}.zip"
-	unzip -q -d "$APPLIB/LV2/" "${CACHEDIR}/x42-midifilter-lv2-linux-${WARCH}-${MIDIFILTER_VERSION}.zip"
+	mkdir -p $APPLIB/LV2
+
+	echo "Adding x42 Plugins"
 
+	for proj in x42-meters x42-midifilter x42-midimap x42-stereoroute x42-eq setBfree; do
+		X42_VERSION=$(curl -s -S http://x42-plugins.com/x42/linux/${proj}.latest.txt)
+		rsync -a -q --partial \
+			rsync://x42-plugins.com/x42/linux/${proj}-lv2-linux-${WARCH}-${X42_VERSION}.zip \
+			"${CACHEDIR}/${proj}-lv2-linux-${WARCH}-${X42_VERSION}.zip"
+		unzip -q -d "$APPLIB/LV2/" "${CACHEDIR}/${proj}-lv2-linux-${WARCH}-${X42_VERSION}.zip"
+	done
 fi
 ################################################################################
 
@@ -698,8 +745,8 @@ fi
 
 echo "Building tarball ..."
 
-rm -f $APPDIR.tar.bz2
-tar -cjf $APPDIR.tar.bz2 $APPDIR
+rm -f $APPDIR.tar
+tar -cf $APPDIR.tar $APPDIR
 
 echo "Calculating bundle size"
 du -sb $APPDIR/  | awk '{print $1}' > $APPDIR.size
diff --git a/tools/linux_packaging/package b/tools/linux_packaging/package
index 3614df1..9ec7502 100755
--- a/tools/linux_packaging/package
+++ b/tools/linux_packaging/package
@@ -13,6 +13,8 @@ GCC5ABI="F"
 MAKESELF=""
 BUILD_ROOT=../../build
 
+MAKESELFOPTS="--bzip2"
+
 if [ $# -eq 0 ] ; then
 	echo ""	 
 	echo "ERROR - Please specify build type"
@@ -36,6 +38,9 @@ while [ $# -gt 0 ] ; do
 	--mixbus)
 		APPNAME=Mixbus ;
 		shift ;;
+	--mixbus32c)
+		APPNAME=Mixbus32C ;
+		shift ;;
 	--public)
 		APPNAME=Ardour ;
 		shift ;;
@@ -48,6 +53,8 @@ while [ $# -gt 0 ] ; do
 
 	--gcc5abi) GCC5ABI="T" ; shift ;;
 
+	--xz) MAKESELFOPTS="--xz --complevel 9" ; shift ;;
+
 	*)
 		#catch all for unknown arguments
 		echo ""
@@ -72,9 +79,9 @@ if [ ! -z ${BUILDTYPE} ]; then
 	X86_64_BUNDLE="${X86_64_BUNDLE}-${BUILDTYPE}"
 fi 
 
-if [ ! -e ${X86_BUNDLE}.tar.bz2 ] ; then
+if [ ! -e ${X86_BUNDLE}.tar ] ; then
 	echo ""
-	echo "Can't locate x86 bundle file ${X86_BUNDLE}.tar.bz2"
+	echo "Can't locate x86 bundle file ${X86_BUNDLE}.tar"
 	echo ""
 elif [ ! -e ${X86_BUNDLE}.size ] ; then
 	echo ""
@@ -84,9 +91,9 @@ else
 	X86_BUNDLE_OK="T"
 fi
 
-if [ ! -e ${X86_64_BUNDLE}.tar.bz2 ]; then
+if [ ! -e ${X86_64_BUNDLE}.tar ]; then
 	echo ""
-	echo "Can't locate x86_64 bundle file ${X86_64_BUNDLE}.tar.bz2"
+	echo "Can't locate x86_64 bundle file ${X86_64_BUNDLE}.tar"
 	echo ""
 elif [ ! -e ${X86_64_BUNDLE}.size ]; then
 	echo ""
@@ -145,7 +152,7 @@ fi
 
 echo "Cleaning up any old package files for this build"
 #Get rid of any old packages of this same name.
-rm -f ${PACKAGE}.tar.bz2
+rm -f ${PACKAGE}.tar
 rm -rf ${PACKAGE}
 
 
@@ -153,12 +160,12 @@ echo "Creating new package dir..."
 mkdir ${PACKAGE}
 
 if [ "${X86_BUNDLE_OK}" = "T" ]; then
-	mv ${X86_BUNDLE}.tar.bz2 ${PACKAGE}
+	mv ${X86_BUNDLE}.tar ${PACKAGE}
 	mv ${X86_BUNDLE}.size ${PACKAGE}/.${X86_BUNDLE}.size
 fi
 
 if [ "${X86_64_BUNDLE_OK}" = "T" ]; then
-	mv ${X86_64_BUNDLE}.tar.bz2 ${PACKAGE}
+	mv ${X86_64_BUNDLE}.tar ${PACKAGE}
 	mv ${X86_64_BUNDLE}.size ${PACKAGE}/.${X86_64_BUNDLE}.size
 fi
 
@@ -178,7 +185,7 @@ fi
 
 if test -n "$MAKESELF"; then
 	echo "Creating self-extracting installer"
-	$MAKESELF --nocomp ${PACKAGE}/ ${PACKAGE}.run ${APPNAME} ./install.sh
+	$MAKESELF ${MAKESELFOPTS} ${PACKAGE}/ ${PACKAGE}.run ${APPNAME} ./install.sh
 else
 	echo "Creating tarball..."
 	tar -cf ${PACKAGE}.tar ${PACKAGE}
diff --git a/tools/linux_packaging/stage2.run.in b/tools/linux_packaging/stage2.run.in
index e22162b..eb8e3d5 100755
--- a/tools/linux_packaging/stage2.run.in
+++ b/tools/linux_packaging/stage2.run.in
@@ -31,6 +31,7 @@ USER_NAME=$(logname)
 
 #### Global Variables ####
 HAS_XDG="T"
+MULTABI_BUNDLE=""
 
 ########################
 # Function Definitions
@@ -229,6 +230,20 @@ case `uname -m` in
 		;;
 esac
 
+###################
+# Determine gcc ABI
+###################
+
+if test -n "$MULTABI_BUNDLE"; then
+	if ${NORM_USER} "${PKG_PATH}/.gcc-glibmm-abi-check --fail --gcc4 > /dev/null"; then
+		ABI=-gcc4
+	else
+		ABI=-gcc5
+	fi
+else
+	ABI=
+fi
+
 ####################
 # Check disk space
 ####################
@@ -237,15 +252,15 @@ esac
 # in case they are on different devices
 echo "Checking for required disk space"
 
-if [ ! -e .${PGM_NAME}_${ARCH}-*.size ]; then
+if [ ! -e .${PGM_NAME}_${ARCH}${ABI}-*.size ]; then
 	echo ""
-	echo "!!! ERROR !!! Can't locate .size file for ${ARCH} bundle."
-	echo "This package is broken or does not support ${ARCH}."
+	echo "!!! ERROR !!! Can't locate .size file for ${ARCH}${ABI} bundle."
+	echo "This package is broken or does not support ${ARCH}${ABI}."
 	echo ""
 	read -p "Press ENTER to exit installer:" BLAH
 	exit 1
 else
-	REQUIRED_BYTES=$(cat .${PGM_NAME}_${ARCH}-*.size)
+	REQUIRED_BYTES=$(cat .${PGM_NAME}_${ARCH}${ABI}-*.size)
 
 	#Installer needs 2x the space since the bundle is unpacked locally and then copied
 	REQUIRED_BYTES=$(($REQUIRED_BYTES + $REQUIRED_BYTES))
@@ -281,34 +296,36 @@ fi
 # Determine C11 stdlibc++ ABI
 #############################
 
-if %REPLACE_GCC5%; then
-	# Ardour was compiled with gcc5, warn on gcc4 systems
-	if ! ${NORM_USER} "${PKG_PATH}/.gcc-glibmm-abi-check --gcc5 > /dev/null"; then
-		echo ""
-		echo "WARNING: GCC4/5 libstdc++ ABI Mismatch"
-		echo ""
-		echo "${PGM_NAME} was compiled with gcc5, your system uses an older version of the"
-		echo "standard c++ library. Plugins on your system may not load or plugin-UIs"
-		echo "may cause crashes."
-		echo ""
-		ANSWER=$(VaildateYesNoQuestion "Continue anyway?")
-		if test "n" = $ANSWER; then
-			exit 1
+if test -z "$ABI"; then
+	if %REPLACE_GCC5%; then
+		# Ardour was compiled with gcc5, warn on gcc4 systems
+		if ! ${NORM_USER} "${PKG_PATH}/.gcc-glibmm-abi-check --gcc5 > /dev/null"; then
+			echo ""
+			echo "WARNING: GCC4/5 libstdc++ ABI Mismatch"
+			echo ""
+			echo "${PGM_NAME} was compiled with gcc5, your system uses an older version of the"
+			echo "standard c++ library. Plugins on your system may not load or plugin-UIs"
+			echo "may cause crashes."
+			echo ""
+			ANSWER=$(VaildateYesNoQuestion "Continue anyway?")
+			if test "n" = $ANSWER; then
+				exit 1
+			fi
 		fi
-	fi
-else
-	# Ardour was compiled with gcc4, warn on gcc5 systems
-	if ! ${NORM_USER} "${PKG_PATH}/.gcc-glibmm-abi-check --gcc4 > /dev/null"; then
-		echo ""
-		echo "WARNING: GCC4/5 libstdc++ ABI Mismatch"
-		echo ""
-		echo "${PGM_NAME} was compiled with gcc4, your system uses a newer version of the"
-		echo "standard c++ library. Plugins on your system may not load or plugin-UIs"
-		echo "may cause crashes."
-		echo ""
-		ANSWER=$(VaildateYesNoQuestion "Continue anyway?")
-		if test "n" = $ANSWER; then
-			exit 1
+	else
+		# Ardour was compiled with gcc4, warn on gcc5 systems
+		if ! ${NORM_USER} "${PKG_PATH}/.gcc-glibmm-abi-check --gcc4 > /dev/null"; then
+			echo ""
+			echo "WARNING: GCC4/5 libstdc++ ABI Mismatch"
+			echo ""
+			echo "${PGM_NAME} was compiled with gcc4, your system uses a newer version of the"
+			echo "standard c++ library. Plugins on your system may not load or plugin-UIs"
+			echo "may cause crashes."
+			echo ""
+			ANSWER=$(VaildateYesNoQuestion "Continue anyway?")
+			if test "n" = $ANSWER; then
+				exit 1
+			fi
 		fi
 	fi
 fi
@@ -334,19 +351,19 @@ FILESYSTEM_TYPE=$(df -P -T "${PKG_PATH}" | grep / | awk '{print $2}')
 echo "Bundle is on ${FILESYSTEM_TYPE} filesystem"
 
 # untar the correct bundle for us to install
-echo "Unpacking bundle for $ARCH"
+echo "Unpacking bundle for $ARCH${ABI}"
 
-if [ ! -e ${PGM_NAME}_${ARCH}-*.tar.bz2 ]; then
+if [ ! -e ${PGM_NAME}_${ARCH}${ABI}-*.tar ]; then
 	echo ""
-	echo "!!! ERROR !!! Can't locate ${ARCH} bundle file."
+	echo "!!! ERROR !!! Can't locate ${ARCH}${ABI} bundle file."
 	echo ""
 	read -p "Press ENTER to exit installer:" BLAH
 	exit 1
 fi
 
-if ! tar -xjf ${PGM_NAME}_${ARCH}-*.tar.bz2; then
+if ! tar -xf ${PGM_NAME}_${ARCH}${ABI}-*.tar; then
 	echo ""
-	echo "!!! ERROR !!! Can't unpack ${ARCH} bundle file."
+	echo "!!! ERROR !!! Can't unpack ${ARCH}${ABI} bundle file."
 	echo ""
 	read -p "Press ENTER to exit installer:" BLAH
 	exit 1
@@ -410,10 +427,18 @@ if %REPLACE_WINE%; then
 	# if this check were quick and easy.. it should be done in the startup-script, but it's not
 	# so here we go... (updating wine may require re-installing ardour)
 	#
+	# on recent Ubuntu wine does load both:
+	#   /usr/lib/i386-linux-gnu/libwine.so.1
+	# AND
+	#   /usr/lib/x86_64-linux-gnu/libwine.so.1
+	# so we need to work around this (thanks).
+	# (this hack break 64bit LinuxVST builds, but we don't do those anyway)
+
 	LIBWINE=$(
 		LD_DEBUG=files wine `pwd`/${BUNDLE_DIR}/lib/ardour-vst-scanner.exe.so 2>&1 \
 						 | grep -e "calling init:.*libwine" \
 						 | sed 's/^.*calling init: //' \
+						 | grep -v x86_64-linux-gnu \
 						 | uniq \
 			)
 	if ! test -f "$LIBWINE"; then
@@ -492,7 +517,7 @@ else
 fi
 
 PGM_EXEC_PATH="${INSTALL_DEST_BASE}/${PGM_FULL_NAME}/bin/${PGM_EXEC_FILE}"
-ICON_PATH="${INSTALL_DEST_BASE}/${PGM_FULL_NAME}/share/icons"
+ICON_PATH="${INSTALL_DEST_BASE}/${PGM_FULL_NAME}/share/resources"
 MENU_FILE_PATH="${INSTALL_DEST_BASE}/${PGM_FULL_NAME}/share"
 
 ################################
@@ -500,7 +525,7 @@ MENU_FILE_PATH="${INSTALL_DEST_BASE}/${PGM_FULL_NAME}/share"
 ################################
 
 # uninstall any older versions
-UNINSTALLERS=$(find ${INSTALL_DEST_BASE} -maxdepth 1 -type f -name "${PGM_NAME}*.uninstall.sh")
+UNINSTALLERS=$(find ${INSTALL_DEST_BASE} -maxdepth 1 -type f -name "${PGM_NAME}-*.uninstall.sh")
 if [ ! -z "$UNINSTALLERS" ];
 then
 	for i in $UNINSTALLERS; do
@@ -555,15 +580,15 @@ ${SUPER} mv /tmp/${MENU_FILE} ${MENU_FILE_PATH}/.
 if [ "T" = ${HAS_XDG} ];
 then
 	echo "Adding ${PGM_NAME} to the applications menu"
-	${SUPER} xdg-icon-resource install --context apps --size 16 ${ICON_PATH}/${PGM_NAME_LOWER}_icon_16px.png ${ICON_NAME}
-	${SUPER} xdg-icon-resource install --context apps --size 22 ${ICON_PATH}/${PGM_NAME_LOWER}_icon_22px.png ${ICON_NAME}
-	${SUPER} xdg-icon-resource install --context apps --size 32 ${ICON_PATH}/${PGM_NAME_LOWER}_icon_32px.png ${ICON_NAME}
-	${SUPER} xdg-icon-resource install --context apps --size 48 ${ICON_PATH}/${PGM_NAME_LOWER}_icon_48px.png ${ICON_NAME}
-	${SUPER} xdg-icon-resource install --context apps --size 256 ${ICON_PATH}/${PGM_NAME_LOWER}_icon_256px.png ${ICON_NAME}
+	${SUPER} xdg-icon-resource install --context apps --size 16 ${ICON_PATH}/${PGM_NAME}-icon_16px.png ${ICON_NAME}
+	${SUPER} xdg-icon-resource install --context apps --size 22 ${ICON_PATH}/${PGM_NAME}-icon_22px.png ${ICON_NAME}
+	${SUPER} xdg-icon-resource install --context apps --size 32 ${ICON_PATH}/${PGM_NAME}-icon_32px.png ${ICON_NAME}
+	${SUPER} xdg-icon-resource install --context apps --size 48 ${ICON_PATH}/${PGM_NAME}-icon_48px.png ${ICON_NAME}
+	${SUPER} xdg-icon-resource install --context apps --size 256 ${ICON_PATH}/${PGM_NAME}-icon_256px.png ${ICON_NAME}
 
-	if [ -e ${ICON_PATH}/${PGM_NAME_LOWER}_icon.svg -a -d /usr/share/icons/hicolor/scalable/apps ]; 
+	if [ -e ${ICON_PATH}/${PGM_NAME}_icon.svg -a -d /usr/share/icons/hicolor/scalable/apps ];
 	then
-		${SUPER} cp -f ${ICON_PATH}/${PGM_NAME_LOWER}_icon.svg  /usr/share/icons/hicolor/scalable/apps/${ICON_NAME}.svg
+		${SUPER} cp -f ${ICON_PATH}/${PGM_NAME}_icon.svg  /usr/share/icons/hicolor/scalable/apps/${ICON_NAME}.svg
 	fi
 
 	${SUPER} xdg-desktop-menu install ${MENU_FILE_PATH}/${MENU_FILE}
diff --git a/tools/luadevel/ardour-lua.sh.in b/tools/luadevel/ardour-lua.sh.in
new file mode 100644
index 0000000..50d6e6e
--- /dev/null
+++ b/tools/luadevel/ardour-lua.sh.in
@@ -0,0 +1,9 @@
+#!/bin/sh
+
+export LD_LIBRARY_PATH=@LIBDIR@${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}
+export ARDOUR_DATA_PATH=@DATADIR@
+export ARDOUR_CONFIG_PATH=@CONFDIR@
+export ARDOUR_DLL_PATH=@LIBDIR@
+export VAMP_PATH=@LIBDIR@/vamp
+
+exec @LIBDIR@/luasession "$@"
diff --git a/tools/luadevel/devel.cc b/tools/luadevel/devel.cc
new file mode 100644
index 0000000..9bbe313
--- /dev/null
+++ b/tools/luadevel/devel.cc
@@ -0,0 +1,587 @@
+#include <stdint.h>
+#include <cstdio>
+#include <iostream>
+#include <string>
+#include <list>
+#include <vector>
+
+#define LIBPBD_API
+#include "../../libs/pbd/pbd/reallocpool.h"
+#include "../../libs/pbd/reallocpool.cc"
+
+#include <readline/readline.h>
+#include <readline/history.h>
+
+#include "lua/luastate.h"
+#include "LuaBridge/LuaBridge.h"
+
+static void my_lua_print (std::string s) {
+	std::cout << s << "\n";
+}
+
+luabridge::LuaRef::Proxy&
+luabridge::LuaRef::Proxy::clone_instance (const void* classkey, void* p) {
+  lua_rawgeti (m_L, LUA_REGISTRYINDEX, m_tableRef);
+  lua_rawgeti (m_L, LUA_REGISTRYINDEX, m_keyRef);
+
+	luabridge::UserdataPtr::push_raw (m_L, p, classkey);
+
+  lua_rawset (m_L, -3);
+  lua_pop (m_L, 1);
+  return *this;
+}
+
+
+
+class A {
+	public:
+		A() { printf ("CTOR %p\n", this); _int = 4; for (int i = 0; i < 256; ++i) {arr[i] = i; ar2[i] = i/256.0; ar3[i] = i;} }
+		~A() { printf ("DTOR\n"); }
+
+		void set_int (int a) { _int = a; }
+		int  get_int () const { return _int; }
+
+		int& get_ref () { return _int; }
+		int get_arg (int &a) { printf ("a = %d\n", a);  a = _int; printf ("a = %d\n", a); return 1; }
+		void get_arg2 (int &a, int& b) {  a = _int; b = 100; }
+		void get_args (std::string &a) {  a = "hello"; }
+		void set_ref (int const &a) { _int = a; }
+
+		float * get_arr () { return arr; }
+		float * get_ar2 () { return ar2; }
+		int * get_ar3 () { return ar3; }
+
+		void set_list (std::list<std::string> sl) { _sl = sl; }
+		std::list<std::string>& get_list () { return _sl; }
+
+		uint32_t minone() { return -1; }
+		void pointer (float*f) const { printf ("PTR %p", f); }
+
+		enum EN {
+			RV1 = 1, RV2, RV3
+		};
+
+		enum EN ret_enum () { return _en;}
+		void set_enum (enum EN en) { _en = en; }
+
+	private:
+		std::list<std::string> _sl;
+		int _int;
+		enum EN _en;
+		float arr[256];
+		float ar2[256];
+		int ar3[256];
+};
+
+
+class LuaTableRef {
+	public:
+		LuaTableRef () {}
+		~LuaTableRef () {}
+
+		int get (lua_State* L) {
+			luabridge::LuaRef rv (luabridge::newTable (L));
+			for (std::vector<LuaTableEntry>::const_iterator i = _data.begin (); i != _data.end (); ++i) {
+				switch ((*i).keytype) {
+					case LUA_TSTRING:
+						assign(&rv, i->k_s, *i);
+						break;
+					case LUA_TNUMBER:
+						assign(&rv, i->k_n, *i);
+						break;
+				}
+			}
+			luabridge::push (L, rv);
+			return 1;
+		}
+
+		int set (lua_State* L) {
+			if (!lua_istable (L, -1)) { return luaL_error (L, "argument is not a table"); }
+			_data.clear ();
+
+			lua_pushvalue (L, -1);
+			lua_pushnil (L);
+			while (lua_next (L, -2)) {
+				lua_pushvalue (L, -2);
+
+				LuaTableEntry s (lua_type(L, -1), lua_type(L, -2));
+				switch (lua_type(L, -1)) {
+					case LUA_TSTRING:
+						s.k_s = luabridge::Stack<std::string>::get (L, -1);
+						break;
+						;
+					case LUA_TNUMBER:
+						s.k_n = luabridge::Stack<unsigned int>::get (L, -1);
+						break;
+					default:
+						// invalid key
+						lua_pop (L, 2);
+						continue;
+				}
+
+				switch(lua_type(L, -2)) {
+					case LUA_TSTRING:
+						s.s = luabridge::Stack<std::string>::get (L, -2);
+						break;
+					case LUA_TBOOLEAN:
+						s.b = lua_toboolean (L, -2);
+						break;
+					case LUA_TNUMBER:
+						s.n = lua_tonumber (L, -2);
+						break;
+					case LUA_TUSERDATA:
+						{
+							bool ok = false;
+							lua_getmetatable (L, -2);
+							lua_rawgetp (L, -1, luabridge::getIdentityKey ());
+							if (lua_isboolean (L, -1)) {
+								lua_pop (L, 1);
+								const void* key = lua_topointer (L, -1);
+								lua_pop (L, 1);
+								void const* classkey = findclasskey (L, key);
+
+								if (classkey) {
+									ok = true;
+									s.c = classkey;
+									s.p = luabridge::Userdata::get_ptr (L, -2);
+								}
+							}  else {
+								lua_pop (L, 2);
+							}
+
+							if (ok) {
+								break;
+							}
+							// invalid userdata -- fall through
+						}
+						// no break
+					case LUA_TFUNCTION: // no support -- we could... string.format("%q", string.dump(value, true))
+					case LUA_TTABLE: // no nested tables, sorry.
+					case LUA_TNIL: // fallthrough
+					default:
+						// invalid value
+						lua_pop (L, 2);
+						continue;
+				}
+
+				_data.push_back(s);
+				lua_pop (L, 2);
+			}
+			return 0;
+		}
+
+		static void* findclasskey (lua_State *L, const void* key)
+		{
+			lua_pushvalue(L, LUA_REGISTRYINDEX);
+			lua_pushnil (L);
+			while (lua_next (L, -2)) {
+				lua_pushvalue (L, -2);
+				if (lua_topointer(L, -2) == key) {
+					void* rv = lua_touserdata (L, -1);
+					lua_pop (L, 4);
+					return rv;
+				}
+				lua_pop (L, 2);
+			}
+			lua_pop (L, 1);
+			return NULL;
+		}
+
+	private:
+		struct LuaTableEntry {
+			LuaTableEntry (int kt, int vt)
+				: keytype (kt)
+				, valuetype (vt)
+			{ }
+
+			int keytype;
+			std::string k_s;
+			unsigned int k_n;
+
+			int valuetype;
+			// LUA_TUSERDATA
+			const void* c;
+			void* p;
+			// LUA_TBOOLEAN
+			bool b;
+			// LUA_TSTRING:
+			std::string s;
+			// LUA_TNUMBER:
+			double n;
+		};
+
+		template<typename T>
+		static void assign (luabridge::LuaRef* rv, T key, const LuaTableEntry& s)
+		{
+			switch (s.valuetype) {
+				case LUA_TSTRING:
+					(*rv)[key] = s.s;
+					break;
+				case LUA_TBOOLEAN:
+					(*rv)[key] = s.b;
+					break;
+				case LUA_TNUMBER:
+					(*rv)[key] = s.n;
+					break;
+				case LUA_TUSERDATA:
+					(*rv)[key].clone_instance (s.c, s.p);
+					break;
+				default:
+					assert (0);
+					break;
+			}
+		}
+
+		std::vector<LuaTableEntry> _data;
+};
+
+
+#if 0
+static void* findclasskey (lua_State *L, const void* key)
+{
+	lua_pushvalue(L, LUA_REGISTRYINDEX);
+	lua_pushnil (L);
+	while (lua_next (L, -2)) {
+		lua_pushvalue (L, -2);
+		if (lua_topointer(L, -2) == key) {
+			void* rv = lua_touserdata (L, -1);
+			lua_pop (L, 4);
+			return rv;
+		}
+		lua_pop (L, 2);
+	}
+	lua_pop (L, 1);
+	return NULL;
+}
+
+static int tableSerialize (lua_State *L)
+{
+	if (!lua_istable (L, -1)) { return luaL_error (L, "argument is not a table"); }
+
+	luabridge::LuaRef rv (luabridge::newTable (L));
+	std::cout << "CLASS A KEY: " << luabridge::ClassInfo <A>::getClassKey () << "\n";
+	lua_rawgetp (L, LUA_REGISTRYINDEX, luabridge::ClassInfo <A>::getClassKey ());
+	std::cout << " CLASS A TABLE PTR=" << lua_topointer (L, -1) << "\n";
+	lua_pop (L, 1);
+	// for k,v in pairs (debug.getregistry ()) do print (k,v) end
+
+	lua_pushvalue (L, -1);
+	lua_pushnil (L);
+	while (lua_next (L, -2)) {
+		lua_pushvalue (L, -2);
+		unsigned int const i = luabridge::Stack<unsigned int>::get (L, -1);
+		int t = lua_type(L, -2);
+		switch(t) {
+			case LUA_TSTRING:
+				std::cout << "  " << i << ": '" << lua_tostring(L, -2) << "'\n";
+				rv[i] = lua_tostring(L, -2);
+				break;
+			case LUA_TBOOLEAN:
+				std::cout << "  " << i << ": " <<
+					(lua_toboolean(L, -2) ? "true" : "false") << "\n";
+				rv[i] = lua_toboolean(L, -2);
+				break;
+			case LUA_TNUMBER:
+				std::cout << "  " << i << ": " << lua_tonumber(L, -2) << "\n";
+				rv[i] = lua_tonumber(L, -2);
+				break;
+			case LUA_TUSERDATA:
+				{
+					lua_getmetatable (L, -2);
+					lua_rawgetp (L, -1, luabridge::getIdentityKey ());
+					if (lua_isboolean (L, -1)) {
+						lua_pop (L, 1);
+						const void* key = lua_topointer (L, -1);
+						lua_pop (L, 1);
+						void const* classkey = findclasskey (L, key);
+
+						if (classkey) {
+							void* p = luabridge::Userdata::get_ptr (L, -2);
+							rv[i].clone_instance (classkey, p);
+						}
+					}  else {
+						lua_pop (L, 2);
+					}
+				}
+				break;
+			case LUA_TNIL:
+			case LUA_TTABLE:
+			case LUA_TFUNCTION:
+			case LUA_TLIGHTUSERDATA:
+			default:
+				std::cout << "  " << i << ": TYPE=" << t << ": " << lua_topointer(L, -2)<< "\n";
+				break;
+		}
+		lua_pop (L, 2);
+	}
+	lua_pop (L, 1);
+	lua_pop (L, 2);
+
+	luabridge::push (L, rv);
+	return 1;
+}
+#endif
+
+LuaTableRef globalref;
+
+int runone (LuaState& lua)
+{
+#if 0
+	LuaState lua (*new LuaState);
+#elif 0
+	PBD::ReallocPool _mempool ("Devel", 1048576);
+	LuaState lua (lua_newstate (&PBD::ReallocPool::lalloc, &_mempool));
+#endif
+	lua.Print.connect (&my_lua_print);
+	lua_State* L = lua.getState();
+
+
+#if 1
+	luabridge::getGlobalNamespace (L)
+		.beginNamespace ("Test")
+		.beginStdList <std::string> ("StringList")
+		.endClass ()
+		.endNamespace ();
+
+	luabridge::getGlobalNamespace (L)
+		.beginNamespace ("Test")
+		.beginStdVector <std::string> ("StringVector")
+		.endClass ()
+		.endNamespace ();
+
+	luabridge::getGlobalNamespace (L)
+		.beginNamespace ("Test")
+		.beginStdMap <std::string,std::string> ("StringStringMap")
+		.endClass ()
+		.endNamespace ();
+
+	luabridge::getGlobalNamespace (L)
+		.beginNamespace ("Test")
+		.beginStdSet <std::string> ("StringSet")
+		.endClass ()
+		.endNamespace ();
+
+
+	luabridge::getGlobalNamespace (L)
+		.beginNamespace ("Test")
+		.registerArray <float> ("FloatArray")
+		.registerArray <int> ("IntArray")
+		.beginClass <A> ("A")
+		.addConstructor <void (*) ()> ()
+		.addFunction ("set_int", &A::set_int)
+		.addFunction ("get_int", &A::get_int)
+		.addRefFunction ("get_arg", &A::get_arg)
+		.addRefFunction ("get_arg2", &A::get_arg2)
+		.addRefFunction ("get_args", &A::get_args)
+		.addFunction ("set_ref", &A::set_ref)
+		.addFunction ("get_list", &A::get_list)
+		.addFunction ("set_list", &A::set_list)
+		.addFunction ("ret_enum", &A::ret_enum)
+		.addFunction ("set_enum", &A::set_enum)
+		.addFunction ("get_arr", &A::get_arr)
+		.addFunction ("get_ar2", &A::get_ar2)
+		.addFunction ("get_ar3", &A::get_ar3)
+		.endClass ()
+		.endNamespace ();
+
+	luabridge::getGlobalNamespace (L)
+		.beginNamespace ("Test")
+		.beginClass <A> ("A")
+		.addFunction ("pointer", &A::pointer)
+		.addFunction ("minone", &A::minone)
+		.addConst ("cologne", 4711)
+		.endClass ()
+		.addConst ("koln", 4711)
+		.endNamespace ();
+#endif
+	luabridge::getGlobalNamespace (L)
+		.beginNamespace ("Dump")
+
+		.beginClass <LuaTableRef> ("TableRef")
+		.addCFunction ("get", &LuaTableRef::get)
+		.addCFunction ("set", &LuaTableRef::set)
+		.endClass ()
+
+		//.addCFunction ("dump", tableSerialize)
+		.endNamespace ();
+
+	luabridge::push <LuaTableRef *> (L, &globalref);
+	lua_setglobal (L, "ref");
+
+
+#if 0 // session  script test
+	lua.do_command (
+			"function ArdourSession ()"
+			"  local self = { scripts = {}, instances = {} }"
+			""
+			"  local foreach = function (fn)"
+			"   for n, s in pairs (self.scripts) do"
+			"    fn (n, s)"
+			"   end"
+			"  end"
+			""
+			"  local run = function ()"
+			"   for n, s in pairs (self.instances) do"
+			"     local status, err = pcall (s)"
+			"     if not status then print ('fn \"'.. n .. '\": ', err) end"
+			"   end"
+			"   collectgarbage()"
+			"  end"
+			""
+			"  local add = function (n, f, a)"
+			"   assert(type(n) == 'string', 'function-name must be string')"
+			"   assert(type(f) == 'function', 'Given script is a not a function')"
+			"   assert(type(a) == 'table' or type(a) == 'nil', 'Given argument is invalid')"
+			"   assert(self.scripts[n] == nil, 'Callback \"'.. n ..'\" already exists.')"
+			"   self.scripts[n] = { ['f'] = f, ['a'] = a }"
+			"   local env = { print = print, Session = Session, tostring = tostring, assert = assert, ipairs = ipairs, error = error, string = string, type = type, tonumber = tonumber, collectgarbage = collectgarbage, pairs = pairs, math = math, table = table, pcall = pcall }"
+			"   self.instances[n] = load (string.dump(f), nil, nil, env)(a)"
+			"  end"
+			""
+			"  local remove = function (n)"
+			"   self.scripts[n] = nil"
+			"  end"
+			""
+			"  local list = function ()"
+			"   local rv = {}"
+			"   foreach (function (n) rv[n] = true end)"
+			"   return rv"
+			"  end"
+			""
+			"  local function basic_serialize (o)"
+			"    if type(o) == \"number\" then"
+			"     return tostring(o)"
+			"    else"
+			"     return string.format(\"%q\", o)"
+			"    end"
+			"  end"
+			""
+			"  local function serialize (name, value)"
+			"   local rv = name .. ' = '"
+			"   if type(value) == \"number\" or type(value) == \"string\" or type(value) == \"nil\" then"
+			"    return rv .. basic_serialize(value) .. ' '"
+			"   elseif type(value) == \"table\" then"
+			"    rv = rv .. '{} '"
+			"    for k,v in pairs(value) do"
+			"     local fieldname = string.format(\"%s[%s]\", name, basic_serialize(k))"
+			"     rv = rv .. serialize(fieldname, v) .. ' '"
+			"    end"
+			"    return rv;"
+			"   elseif type(value) == \"function\" then"
+			"     return rv .. string.format(\"%q\", string.dump(value))"
+			"   else"
+			"    error('cannot save a ' .. type(value))"
+			"   end"
+			"  end"
+			""
+			""
+			"  local save = function ()"
+			"   return (serialize('scripts', self.scripts))"
+			"  end"
+			""
+			"  local restore = function (state)"
+			"   self.scripts = {}"
+			"   load (state)()"
+			"   print (scripts)"
+			"   for n, s in pairs (scripts) do"
+			"    add (n, load(s['f']), s['a'])"
+			"   end"
+			"  end"
+			""
+			" return { run = run, add = add, remove = remove,"
+		  "          list = list, foreach = foreach,"
+			"          restore = restore, save = save}"
+			" end"
+			" "
+			" sess = ArdourSession ()"
+			" ArdourSession = nil"
+			);
+
+	luabridge::LuaRef *lua_run;
+	luabridge::LuaRef *lua_add;
+	luabridge::LuaRef *lua_del;
+	luabridge::LuaRef *lua_save;
+	luabridge::LuaRef *lua_load;
+	{
+		luabridge::LuaRef lua_sess = luabridge::getGlobal (L, "sess");
+		lua.do_command ("sess = nil"); // hide it.
+		lua.do_command ("collectgarbage()");
+
+		lua_run = new luabridge::LuaRef(lua_sess["run"]);
+		lua_add = new luabridge::LuaRef(lua_sess["add"]);
+		lua_del = new luabridge::LuaRef(lua_sess["remove"]);
+		lua_save = new luabridge::LuaRef(lua_sess["save"]);
+		lua_load = new luabridge::LuaRef(lua_sess["restore"]);
+	}
+	lua.do_command ("collectgarbage()");
+
+#if 1
+	lua.do_command ("function factory (t) return function () local p = t or { } local a = t[1] or 'Nibor' print ('Hello ' .. a) end end");
+	luabridge::LuaRef lua_fact = luabridge::getGlobal (L, "factory");
+	luabridge::LuaRef tbl_arg (luabridge::newTable(L));
+	//tbl_arg[1] = "Robin";
+	(*lua_add)("t2", lua_fact, tbl_arg);
+#else
+	lua.do_command ("function factory (t) return function () print ('Boo') end end");
+	luabridge::LuaRef lua_fact = luabridge::getGlobal (L, "factory");
+	(*lua_add)("t2", lua_fact());
+#endif
+
+	lua.do_command ("function factory (t) return function () print ('Ahoy') end end");
+	luabridge::LuaRef lua_fact2 = luabridge::getGlobal (L, "factory");
+	(*lua_add)("t1", lua_fact2);
+
+	luabridge::LuaRef savedstate ((*lua_save)());
+	std::string saved = savedstate.cast<std::string>();
+
+	(*lua_del)("t2");
+
+	try {
+		(*lua_run)();
+	} catch (luabridge::LuaException const& e) { printf ("LuaException: %s\n", e.what ()); }
+
+	(*lua_load)(saved);
+
+	for (int i = 0; i < 2; ++i) {
+	lua.do_command ("collectgarbage()");
+	lua.collect_garbage ();
+	try {
+		(*lua_run)();
+	} catch (luabridge::LuaException const& e) { printf ("LuaException: %s\n", e.what ()); }
+	}
+
+#endif
+
+	add_history("a = Test:A() b = 2 c = 3 d = 'a'");
+	add_history("x = a:get_arg(b)  y = a:get_arg2(b, c)  z = a:get_args(d) ");
+	add_history("for i,n in ipairs(y) do print (i, n); end");
+	add_history("t = {} t[2] = 7; t[3] = Test:A() t[4] = Test:A() ref:set (t);  f = ref:get()");
+
+	/////////////////////////////////////////////////////////////////////////////
+	char *line;
+	while ((line = readline ("> "))) {
+		if (!strcmp (line, "quit")) {
+			break;
+		}
+		if (strlen(line) == 0) {
+			//lua.do_command("collectgarbage();");
+			continue;
+		}
+		if (!lua.do_command (line)) {
+			add_history(line); // OK
+		} else {
+			add_history(line); // :)
+		}
+	}
+	printf("\n");
+	return 0;
+}
+
+int main (int argc, char **argv)
+{
+	LuaState lua1;
+	LuaState lua2;
+	runone (lua1);
+	printf ("=====\n");
+	runone (lua2);
+}
diff --git a/tools/luadevel/luasession.cc b/tools/luadevel/luasession.cc
new file mode 100644
index 0000000..a131bb4
--- /dev/null
+++ b/tools/luadevel/luasession.cc
@@ -0,0 +1,457 @@
+#include <stdint.h>
+#include <assert.h>
+
+#include <cstdio>
+#include <iostream>
+#include <string>
+#include <list>
+#include <vector>
+
+#include <glibmm.h>
+
+#include "pbd/debug.h"
+#include "pbd/event_loop.h"
+#include "pbd/error.h"
+#include "pbd/failed_constructor.h"
+#include "pbd/pthread_utils.h"
+#include "pbd/reallocpool.h"
+#include "pbd/receiver.h"
+#include "pbd/transmitter.h"
+
+#include "ardour/ardour.h"
+#include "ardour/audioengine.h"
+#include "ardour/filename_extensions.h"
+#include "ardour/filesystem_paths.h"
+#include "ardour/luabindings.h"
+#include "ardour/session.h"
+#include "ardour/types.h"
+#include "ardour/vst_types.h"
+
+#include <readline/readline.h>
+#include <readline/history.h>
+
+#include "lua/luastate.h"
+#include "LuaBridge/LuaBridge.h"
+
+using namespace std;
+using namespace ARDOUR;
+using namespace PBD;
+
+static const char* localedir = LOCALEDIR;
+static PBD::ScopedConnectionList engine_connections;
+static PBD::ScopedConnectionList session_connections;
+static Session* session = NULL;
+static LuaState* lua;
+static bool keep_running = true;
+
+/* extern VST functions */
+int vstfx_init (void*) { return 0; }
+void vstfx_exit () {}
+void vstfx_destroy_editor (VSTState*) {}
+
+class LuaReceiver : public Receiver
+{
+  protected:
+    void receive (Transmitter::Channel chn, const char * str)
+		{
+			const char *prefix = "";
+
+			switch (chn) {
+				case Transmitter::Error:
+					prefix = "[ERROR]: ";
+					break;
+				case Transmitter::Info:
+					/* ignore */
+					return;
+				case Transmitter::Warning:
+					prefix = "[WARNING]: ";
+					break;
+				case Transmitter::Fatal:
+					prefix = "[FATAL]: ";
+					break;
+				case Transmitter::Throw:
+					/* this isn't supposed to happen */
+					abort ();
+			}
+
+			/* note: iostreams are already thread-safe: no external
+				 lock required.
+				 */
+
+			std::cout << prefix << str << std::endl;
+
+			if (chn == Transmitter::Fatal) {
+				::exit (9);
+			}
+		}
+};
+
+class MyEventLoop : public sigc::trackable, public EventLoop
+{
+	public:
+		MyEventLoop (std::string const& name) : EventLoop (name) {
+			run_loop_thread = Glib::Threads::Thread::self ();
+		}
+
+		void call_slot (InvalidationRecord* ir, const boost::function<void()>& f) {
+			if (Glib::Threads::Thread::self () == run_loop_thread) {
+				cout << string_compose ("%1/%2 direct dispatch of call slot via functor @ %3, invalidation %4\n", event_loop_name(), pthread_name(), &f, ir);
+				f ();
+			} else {
+				cout << string_compose ("%1/%2 queue call-slot using functor @ %3, invalidation %4\n", event_loop_name(), pthread_name(), &f, ir);
+				assert (!ir);
+				f (); // XXX TODO, queue and process during run ()
+			}
+		}
+
+		void run () {
+			; // TODO process Events, if any
+		}
+
+		Glib::Threads::Mutex& slot_invalidation_mutex () { return request_buffer_map_lock; }
+
+	private:
+		Glib::Threads::Thread* run_loop_thread;
+		Glib::Threads::Mutex   request_buffer_map_lock;
+};
+
+static MyEventLoop *event_loop = NULL;
+
+/* ****************************************************************************/
+/* internal helper fn and callbacks */
+
+static int do_audio_midi_setup (uint32_t desired_sample_rate)
+{
+	return AudioEngine::instance ()->start ();
+}
+
+static void init ()
+{
+	if (!ARDOUR::init (false, true, localedir)) {
+		cerr << "Ardour failed to initialize\n" << endl;
+		::exit (EXIT_FAILURE);
+	}
+
+	assert (!event_loop);
+	event_loop = new MyEventLoop ("lua");
+	EventLoop::set_event_loop_for_thread (event_loop);
+	SessionEvent::create_per_thread_pool ("lua", 4096);
+
+	static LuaReceiver lua_receiver;
+
+	lua_receiver.listen_to (error);
+	lua_receiver.listen_to (info);
+	lua_receiver.listen_to (fatal);
+	lua_receiver.listen_to (warning);
+
+	ARDOUR::Session::AudioEngineSetupRequired.connect_same_thread (engine_connections, &do_audio_midi_setup);
+}
+
+static void set_session (ARDOUR::Session *s)
+{
+	session = s;
+	assert (lua);
+	lua_State* L = lua->getState ();
+	LuaBindings::set_session (L, session);
+	lua->collect_garbage (); // drop references
+}
+
+static void unset_session ()
+{
+	session_connections.drop_connections ();
+	set_session (NULL);
+}
+
+static int prepare_engine ()
+{
+	AudioEngine* engine = AudioEngine::instance ();
+
+	if (!engine->current_backend ()) {
+		if (!engine->set_backend ("None (Dummy)", "Unit-Test", "")) {
+			std::cerr << "Cannot create Audio/MIDI engine\n";
+			return -1;
+		}
+	}
+
+	if (!engine->current_backend ()) {
+		std::cerr << "Cannot create Audio/MIDI engine\n";
+		return -1;
+	}
+
+	if (engine->running ()) {
+		engine->stop ();
+	}
+	return 0;
+}
+
+static int start_engine (uint32_t rate)
+{
+	AudioEngine* engine = AudioEngine::instance ();
+
+	if (engine->set_sample_rate (rate)) {
+		std::cerr << "Cannot set session's samplerate.\n";
+		return -1;
+	}
+
+	if (engine->start () != 0) {
+		std::cerr << "Cannot start Audio/MIDI engine\n";
+		return -1;
+	}
+
+	init_post_engine ();
+	return 0;
+}
+
+static Session * _create_session (string dir, string state, uint32_t rate) // throws
+{
+	if (prepare_engine ()) {
+		return 0;
+	}
+
+	std::string s = Glib::build_filename (dir, state + statefile_suffix);
+	if (Glib::file_test (dir, Glib::FILE_TEST_EXISTS)) {
+		std::cerr << "Session already exists: " << s << "\n";
+		return 0;
+	}
+
+	if (start_engine (rate)) {
+		return 0;
+	}
+
+	// TODO add option/bindings for this
+	BusProfile bus_profile;
+	bus_profile.master_out_channels = 2;
+	bus_profile.input_ac = AutoConnectPhysical;
+	bus_profile.output_ac = AutoConnectMaster;
+	bus_profile.requested_physical_in = 0; // use all available
+	bus_profile.requested_physical_out = 0; // use all available
+
+	AudioEngine* engine = AudioEngine::instance ();
+	Session* session = new Session (*engine, dir, state, &bus_profile);
+	return session;
+}
+
+static Session * _load_session (string dir, string state) // throws
+{
+	if (prepare_engine ()) {
+		return 0;
+	}
+
+	float sr;
+	SampleFormat sf;
+	std::string s = Glib::build_filename (dir, state + statefile_suffix);
+	if (!Glib::file_test (dir, Glib::FILE_TEST_EXISTS)) {
+		std::cerr << "Cannot find session: " << s << "\n";
+		return 0;
+	}
+
+	if (Session::get_info_from_path (s, sr, sf) != 0) {
+		std::cerr << "Cannot get samplerate from session.\n";
+		return 0;
+	}
+
+	if (start_engine (sr)) {
+		return 0;
+	}
+
+	AudioEngine* engine = AudioEngine::instance ();
+	Session* session = new Session (*engine, dir, state);
+	return session;
+}
+
+/* ****************************************************************************/
+/* lua bound functions */
+
+static Session* create_session (string dir, string state, uint32_t rate)
+{
+	Session* s = 0;
+	if (session) {
+		cerr << "Session already open" << "\n";
+		return 0;
+	}
+	try {
+		s = _create_session (dir, state, rate);
+	} catch (failed_constructor& e) {
+		cerr << "failed_constructor: " << e.what () << "\n";
+		return 0;
+	} catch (AudioEngine::PortRegistrationFailure& e) {
+		cerr << "PortRegistrationFailure: " << e.what () << "\n";
+		return 0;
+	} catch (exception& e) {
+		cerr << "exception: " << e.what () << "\n";
+		return 0;
+	} catch (...) {
+		cerr << "unknown exception.\n";
+		return 0;
+	}
+	Glib::usleep (1000000); // allow signal propagation, callback/thread-pool setup
+	if (!s) {
+		return 0;
+	}
+	set_session (s);
+	s->DropReferences.connect_same_thread (session_connections, &unset_session);
+	return s;
+}
+
+static Session* load_session (string dir, string state)
+{
+	Session* s = 0;
+	if (session) {
+		cerr << "Session already open" << "\n";
+		return 0;
+	}
+	try {
+		s = _load_session (dir, state);
+	} catch (failed_constructor& e) {
+		cerr << "failed_constructor: " << e.what () << "\n";
+		return 0;
+	} catch (AudioEngine::PortRegistrationFailure& e) {
+		cerr << "PortRegistrationFailure: " << e.what () << "\n";
+		return 0;
+	} catch (exception& e) {
+		cerr << "exception: " << e.what () << "\n";
+		return 0;
+	} catch (...) {
+		cerr << "unknown exception.\n";
+		return 0;
+	}
+	Glib::usleep (1000000); // allow signal propagation, callback/thread-pool setup
+	if (!s) {
+		return 0;
+	}
+	set_session (s);
+	s->DropReferences.connect_same_thread (session_connections, &unset_session);
+	return s;
+}
+
+static int set_debug_options (const char *opts)
+{
+	return PBD::parse_debug_options (opts);
+}
+
+static void close_session ()
+{
+	delete session;
+	assert (!session);
+}
+
+static int close_session_lua (lua_State *L)
+{
+	if (!session) {
+		cerr << "No open session" << "\n";
+		return 0;
+	}
+	close_session ();
+	return 0;
+}
+
+static void delay (float d) {
+	if (d > 0) {
+		Glib::usleep (d * 1000000);
+	}
+}
+
+static int do_quit (lua_State *L)
+{
+	keep_running = false;
+	return 0;
+}
+
+/* ****************************************************************************/
+
+static void my_lua_print (std::string s) {
+	std::cout << s << "\n";
+}
+
+static void setup_lua ()
+{
+	assert (!lua);
+
+	lua = new LuaState ();
+	lua->Print.connect (&my_lua_print);
+	lua_State* L = lua->getState ();
+
+	LuaBindings::stddef (L);
+	LuaBindings::common (L);
+	LuaBindings::session (L);
+	LuaBindings::osc (L);
+
+	luabridge::getGlobalNamespace (L)
+		.beginNamespace ("_G")
+		.addFunction ("create_session", &create_session)
+		.addFunction ("load_session", &load_session)
+		.addFunction ("close_session", &close_session)
+		.addFunction ("sleep", &delay)
+		.addFunction ("quit", &do_quit)
+		.addFunction ("set_debug_options", &set_debug_options)
+		.endNamespace ();
+
+	// add a Session::close() method
+	luabridge::getGlobalNamespace (L)
+		.beginNamespace ("ARDOUR")
+		.beginClass <Session> ("Session")
+		.addExtCFunction ("close", &close_session_lua)
+		.endClass ()
+		.endNamespace ();
+
+	// push instance to global namespace (C++ lifetime)
+	luabridge::push <AudioEngine *> (L, AudioEngine::create ());
+	lua_setglobal (L, "AudioEngine");
+
+	AudioEngine::instance ()->stop ();
+}
+
+int main (int argc, char **argv)
+{
+	init ();
+	setup_lua ();
+
+	using_history ();
+	std::string histfile = Glib::build_filename (user_config_directory(), "/luahist");
+
+	read_history (histfile.c_str());
+
+	char *line = NULL;
+	while (keep_running && (line = readline ("> "))) {
+		event_loop->run();
+		if (!strcmp (line, "quit")) {
+			free (line); line = NULL;
+			break;
+		}
+
+		if (strlen (line) == 0) {
+			free (line); line = NULL;
+			continue;
+		}
+
+		if (lua->do_command (line)) {
+			// error
+		}
+
+		add_history (line);
+		event_loop->run();
+		free (line); line = NULL;
+	}
+	free (line);
+	printf ("\n");
+
+	if (session) {
+		close_session ();
+	}
+
+	engine_connections.drop_connections ();
+
+	delete lua;
+	lua = NULL;
+
+	write_history (histfile.c_str());
+
+	AudioEngine::instance ()->stop ();
+	AudioEngine::destroy ();
+
+	// cleanup
+	ARDOUR::cleanup ();
+	delete event_loop;
+	pthread_cancel_all ();
+	return 0;
+}
diff --git a/tools/luadevel/wscript b/tools/luadevel/wscript
new file mode 100755
index 0000000..3190380
--- /dev/null
+++ b/tools/luadevel/wscript
@@ -0,0 +1,93 @@
+#!/usr/bin/env python
+from waflib.extras import autowaf as autowaf
+from waflib import Options, TaskGen
+import waflib.Logs as Logs, waflib.Utils as Utils
+import os
+import shutil
+import sys
+import re
+import time
+from waflib.Task import Task
+
+top = '.'
+out = 'build'
+
+def options(opt):
+    autowaf.set_options(opt)
+
+def configure(conf):
+    conf.load('misc')
+    conf.load('compiler_cxx')
+    conf.check_cc(function_name='readline',
+            header_name='stdio.h readline/readline.h',
+            lib='readline',
+            uselib_store='READLINE',
+            mandatory=False)
+    autowaf.configure(conf)
+
+def build(bld):
+    VERSION = "%s.%s" % (bld.env['MAJOR'], bld.env['MINOR'])
+    if not bld.is_defined('HAVE_READLINE'):
+            return;
+    # no wine
+    if bld.is_defined('WINDOWS_VST_SUPPORT') and bld.env['build_target'] != 'mingw':
+        return
+
+    if bld.env['build_target'] != 'mingw':
+    # TEST/DEVEL TOOL #######################
+        obj = bld (features = 'cxx c cxxprogram')
+        obj.source       = 'devel.cc'
+        obj.target       = 'devel'
+        obj.uselib       = ['SIGCPP', 'READLINE']
+        obj.use          = ['liblua']
+        obj.install_path = None
+    #########################################
+
+    # commandline luasession wrapper
+    obj              = bld(features = 'subst')
+    obj.source       = 'ardour-lua.sh.in'
+    obj.target       = 'ardour' + str (bld.env['MAJOR']) + '-lua'
+    obj.chmod        = Utils.O755
+    obj.install_path = bld.env['BINDIR']
+    obj.LIBDIR       = os.path.normpath(bld.env['DLLDIR'])
+    obj.DATADIR      = os.path.normpath(bld.env['DATADIR'])
+    obj.CONFDIR      = os.path.normpath(bld.env['CONFDIR'])
+
+    # commandline luasession
+    obj = bld (features = 'cxx c cxxprogram')
+    obj.source       = 'luasession.cc'
+    obj.target       = 'luasession'
+    obj.includes     = ['../libs']
+    obj.use          = ['liblua'
+                        'libpbd',
+                        'libardour',
+                        'libardour_cp',
+                        'libtimecode',
+                        'libmidipp',
+                     ]
+    obj.defines = [
+        'VERSIONSTRING="' + str(bld.env['VERSION']) + '"',
+        'DATA_DIR="'   + os.path.normpath(bld.env['DATADIR']) + '"',
+        'CONFIG_DIR="' + os.path.normpath(bld.env['SYSCONFDIR']) + '"',
+        'LOCALEDIR="'  + os.path.join(os.path.normpath(bld.env['DATADIR']), 'locale') + '"',
+        'PACKAGE="'    + "ARDOURUTILS" + '"',
+        ]
+
+    obj.uselib       = 'UUID FLAC FONTCONFIG GLIBMM GTHREAD OGG CURL DL XML'
+    obj.uselib       += ' FFTW3F'
+    obj.uselib       += ' AUDIOUNITS OSX LO '
+    obj.uselib       += ' TAGLIB '
+    obj.uselib       += ' READLINE '
+
+    if sys.platform == 'darwin':
+        obj.uselib += ' AUDIOUNITS OSX'
+        obj.use    += ' libappleutility'
+
+    #if bld.env['build_target'] == 'mingw':
+    #    if bld.env['DEBUG'] == False:
+    #        obj.linkflags = ['-mwindows']
+
+    if bld.is_defined('NEED_INTL'):
+        obj.linkflags = ' -lintl'
+
+    obj.install_path = bld.env['DLLDIR']
diff --git a/icons/Ardour Mouse Cursors.svg b/tools/misc_resources/Ardour Mouse Cursors.svg
similarity index 100%
rename from icons/Ardour Mouse Cursors.svg
rename to tools/misc_resources/Ardour Mouse Cursors.svg
diff --git a/icons/Music_dynamic_forte.svg b/tools/misc_resources/Music_dynamic_forte.svg
similarity index 100%
rename from icons/Music_dynamic_forte.svg
rename to tools/misc_resources/Music_dynamic_forte.svg
diff --git a/icons/Music_dynamic_fortissimo.svg b/tools/misc_resources/Music_dynamic_fortissimo.svg
similarity index 100%
rename from icons/Music_dynamic_fortissimo.svg
rename to tools/misc_resources/Music_dynamic_fortissimo.svg
diff --git a/icons/Music_dynamic_fortississimo.svg b/tools/misc_resources/Music_dynamic_fortississimo.svg
similarity index 100%
rename from icons/Music_dynamic_fortississimo.svg
rename to tools/misc_resources/Music_dynamic_fortississimo.svg
diff --git a/icons/Music_dynamic_mezzo_forte.svg b/tools/misc_resources/Music_dynamic_mezzo_forte.svg
similarity index 100%
rename from icons/Music_dynamic_mezzo_forte.svg
rename to tools/misc_resources/Music_dynamic_mezzo_forte.svg
diff --git a/icons/Music_dynamic_mezzo_piano.svg b/tools/misc_resources/Music_dynamic_mezzo_piano.svg
similarity index 100%
rename from icons/Music_dynamic_mezzo_piano.svg
rename to tools/misc_resources/Music_dynamic_mezzo_piano.svg
diff --git a/icons/Music_dynamic_pianissimo.svg b/tools/misc_resources/Music_dynamic_pianissimo.svg
similarity index 100%
rename from icons/Music_dynamic_pianissimo.svg
rename to tools/misc_resources/Music_dynamic_pianissimo.svg
diff --git a/icons/Music_dynamic_pianississimo.svg b/tools/misc_resources/Music_dynamic_pianississimo.svg
similarity index 100%
rename from icons/Music_dynamic_pianississimo.svg
rename to tools/misc_resources/Music_dynamic_pianississimo.svg
diff --git a/icons/Music_dynamic_piano.svg b/tools/misc_resources/Music_dynamic_piano.svg
similarity index 100%
rename from icons/Music_dynamic_piano.svg
rename to tools/misc_resources/Music_dynamic_piano.svg
diff --git a/gtk2_ardour/icons/app-icon_tango.svg b/tools/misc_resources/app-icon_tango.svg
similarity index 100%
rename from gtk2_ardour/icons/app-icon_tango.svg
rename to tools/misc_resources/app-icon_tango.svg
diff --git a/icons/ardour_bw.ai b/tools/misc_resources/ardour_bw.ai
similarity index 100%
rename from icons/ardour_bw.ai
rename to tools/misc_resources/ardour_bw.ai
diff --git a/icons/ardour_bw.svg b/tools/misc_resources/ardour_bw.svg
similarity index 100%
rename from icons/ardour_bw.svg
rename to tools/misc_resources/ardour_bw.svg
diff --git a/icons/ardour_track-bus_list_states.svg b/tools/misc_resources/ardour_track-bus_list_states.svg
similarity index 100%
rename from icons/ardour_track-bus_list_states.svg
rename to tools/misc_resources/ardour_track-bus_list_states.svg
diff --git a/icons/chord.svg b/tools/misc_resources/chord.svg
similarity index 100%
rename from icons/chord.svg
rename to tools/misc_resources/chord.svg
diff --git a/gtk2_ardour/icons/crossfade_in_default.svg b/tools/misc_resources/crossfade_in_default.svg
similarity index 100%
rename from gtk2_ardour/icons/crossfade_in_default.svg
rename to tools/misc_resources/crossfade_in_default.svg
diff --git a/gtk2_ardour/icons/crossfade_out_default.svg b/tools/misc_resources/crossfade_out_default.svg
similarity index 100%
rename from gtk2_ardour/icons/crossfade_out_default.svg
rename to tools/misc_resources/crossfade_out_default.svg
diff --git a/icons/eighthnote.svg b/tools/misc_resources/eighthnote.svg
similarity index 100%
rename from icons/eighthnote.svg
rename to tools/misc_resources/eighthnote.svg
diff --git a/icons/fade_in_cursor.svg b/tools/misc_resources/fade_in_cursor.svg
similarity index 100%
rename from icons/fade_in_cursor.svg
rename to tools/misc_resources/fade_in_cursor.svg
diff --git a/icons/fade_out_cursor.svg b/tools/misc_resources/fade_out_cursor.svg
similarity index 100%
rename from icons/fade_out_cursor.svg
rename to tools/misc_resources/fade_out_cursor.svg
diff --git a/icons/halfnote.svg b/tools/misc_resources/halfnote.svg
similarity index 100%
rename from icons/halfnote.svg
rename to tools/misc_resources/halfnote.svg
diff --git a/icons/i_beam_cursor.svg b/tools/misc_resources/i_beam_cursor.svg
similarity index 100%
rename from icons/i_beam_cursor.svg
rename to tools/misc_resources/i_beam_cursor.svg
diff --git a/icons/icon/ardour.icns b/tools/misc_resources/icon/ardour.icns
similarity index 100%
rename from icons/icon/ardour.icns
rename to tools/misc_resources/icon/ardour.icns
diff --git a/icons/icon/ardour_icon_mac.png b/tools/misc_resources/icon/ardour_icon_mac.png
similarity index 100%
rename from icons/icon/ardour_icon_mac.png
rename to tools/misc_resources/icon/ardour_icon_mac.png
diff --git a/icons/icon/ardour_icon_mac_mask.png b/tools/misc_resources/icon/ardour_icon_mac_mask.png
similarity index 100%
rename from icons/icon/ardour_icon_mac_mask.png
rename to tools/misc_resources/icon/ardour_icon_mac_mask.png
diff --git a/icons/icon/ardour_icon_tango_16px.xcf b/tools/misc_resources/icon/ardour_icon_tango_16px.xcf
similarity index 100%
rename from icons/icon/ardour_icon_tango_16px.xcf
rename to tools/misc_resources/icon/ardour_icon_tango_16px.xcf
diff --git a/icons/icon/ardour_icon_tango_16px_blue.png b/tools/misc_resources/icon/ardour_icon_tango_16px_blue.png
similarity index 100%
rename from icons/icon/ardour_icon_tango_16px_blue.png
rename to tools/misc_resources/icon/ardour_icon_tango_16px_blue.png
diff --git a/icons/icon/ardour_icon_tango_16px_red.png b/tools/misc_resources/icon/ardour_icon_tango_16px_red.png
similarity index 100%
rename from icons/icon/ardour_icon_tango_16px_red.png
rename to tools/misc_resources/icon/ardour_icon_tango_16px_red.png
diff --git a/icons/icon/ardour_icon_tango_22px.xcf b/tools/misc_resources/icon/ardour_icon_tango_22px.xcf
similarity index 100%
rename from icons/icon/ardour_icon_tango_22px.xcf
rename to tools/misc_resources/icon/ardour_icon_tango_22px.xcf
diff --git a/icons/icon/ardour_icon_tango_22px_blue.png b/tools/misc_resources/icon/ardour_icon_tango_22px_blue.png
similarity index 100%
rename from icons/icon/ardour_icon_tango_22px_blue.png
rename to tools/misc_resources/icon/ardour_icon_tango_22px_blue.png
diff --git a/icons/icon/ardour_icon_tango_22px_red.png b/tools/misc_resources/icon/ardour_icon_tango_22px_red.png
similarity index 100%
rename from icons/icon/ardour_icon_tango_22px_red.png
rename to tools/misc_resources/icon/ardour_icon_tango_22px_red.png
diff --git a/icons/icon/ardour_icon_tango_32px.xcf b/tools/misc_resources/icon/ardour_icon_tango_32px.xcf
similarity index 100%
rename from icons/icon/ardour_icon_tango_32px.xcf
rename to tools/misc_resources/icon/ardour_icon_tango_32px.xcf
diff --git a/icons/icon/ardour_icon_tango_32px_blue.png b/tools/misc_resources/icon/ardour_icon_tango_32px_blue.png
similarity index 100%
rename from icons/icon/ardour_icon_tango_32px_blue.png
rename to tools/misc_resources/icon/ardour_icon_tango_32px_blue.png
diff --git a/icons/icon/ardour_icon_tango_32px_red.png b/tools/misc_resources/icon/ardour_icon_tango_32px_red.png
similarity index 100%
rename from icons/icon/ardour_icon_tango_32px_red.png
rename to tools/misc_resources/icon/ardour_icon_tango_32px_red.png
diff --git a/icons/icon/ardour_icon_tango_48px.xcf b/tools/misc_resources/icon/ardour_icon_tango_48px.xcf
similarity index 100%
rename from icons/icon/ardour_icon_tango_48px.xcf
rename to tools/misc_resources/icon/ardour_icon_tango_48px.xcf
diff --git a/icons/icon/ardour_icon_tango_48px_blue.png b/tools/misc_resources/icon/ardour_icon_tango_48px_blue.png
similarity index 100%
rename from icons/icon/ardour_icon_tango_48px_blue.png
rename to tools/misc_resources/icon/ardour_icon_tango_48px_blue.png
diff --git a/icons/icon/ardour_icon_tango_48px_red.png b/tools/misc_resources/icon/ardour_icon_tango_48px_red.png
similarity index 100%
rename from icons/icon/ardour_icon_tango_48px_red.png
rename to tools/misc_resources/icon/ardour_icon_tango_48px_red.png
diff --git a/gtk2_ardour/icons/join_tools.svg b/tools/misc_resources/join_tools.svg
similarity index 100%
rename from gtk2_ardour/icons/join_tools.svg
rename to tools/misc_resources/join_tools.svg
diff --git a/gtk2_ardour/icons/metronome.svg b/tools/misc_resources/metronome.svg
similarity index 100%
rename from gtk2_ardour/icons/metronome.svg
rename to tools/misc_resources/metronome.svg
diff --git a/gtk2_ardour/icons/midi_panic.svg b/tools/misc_resources/midi_panic.svg
similarity index 100%
rename from gtk2_ardour/icons/midi_panic.svg
rename to tools/misc_resources/midi_panic.svg
diff --git a/icons/midi_socket.svg b/tools/misc_resources/midi_socket.svg
similarity index 100%
rename from icons/midi_socket.svg
rename to tools/misc_resources/midi_socket.svg
diff --git a/icons/quarternote.svg b/tools/misc_resources/quarternote.svg
similarity index 100%
rename from icons/quarternote.svg
rename to tools/misc_resources/quarternote.svg
diff --git a/tools/misc_resources/search.svg b/tools/misc_resources/search.svg
new file mode 100644
index 0000000..2b88568
--- /dev/null
+++ b/tools/misc_resources/search.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   version="1.1"
+   width="16"
+   height="16"
+   id="svg2"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="search.svg"
+   inkscape:export-filename="/home/buhr/projects/ardour/gtk2_ardour/icons/search.png"
+   inkscape:export-xdpi="135.31609"
+   inkscape:export-ydpi="135.31609">
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="2560"
+     inkscape:window-height="1390"
+     id="namedview4941"
+     showgrid="false"
+     inkscape:zoom="36.75"
+     inkscape:cx="20.233694"
+     inkscape:cy="2.6993399"
+     inkscape:window-x="0"
+     inkscape:window-y="25"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="svg2" />
+  <defs
+     id="defs4">
+    <linearGradient
+       id="linearGradient4757">
+      <stop
+         id="stop4759"
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop4761"
+         style="stop-color:#c1c1c1;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <radialGradient
+       cx="4.1535583"
+       cy="4.6999545"
+       r="4.5"
+       fx="4.1535583"
+       fy="4.6999545"
+       id="radialGradient4763"
+       xlink:href="#linearGradient4757"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.99954653,1.0095465,-0.64253295,0.64896107,3.1580713,-3.0083174)" />
+  </defs>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <path
+     style="fill:none;stroke:#5a5a5a;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+     d="M 14.7,14.7 10,10"
+     id="path4781"
+     inkscape:connector-curvature="0"
+     sodipodi:nodetypes="cc" />
+  <g
+     transform="translate(0,-1036.3622)"
+     id="layer1"
+     style="stroke:#5a5a5a;stroke-opacity:1">
+    <path
+       d="m 11,6.5 a 4.5,4.5 0 1 1 -9,0 4.5,4.5 0 1 1 9,0 z"
+       transform="matrix(1.2222222,0,0,1.2222222,-1.9444445,1034.4178)"
+       id="path3987"
+       style="fill:url(#radialGradient4763);fill-opacity:1;stroke:#5a5a5a;stroke-width:0.81818181;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+  </g>
+</svg>
diff --git a/icons/sixteenthnote.svg b/tools/misc_resources/sixteenthnote.svg
similarity index 100%
rename from icons/sixteenthnote.svg
rename to tools/misc_resources/sixteenthnote.svg
diff --git a/icons/sixyfourthnote.svg b/tools/misc_resources/sixyfourthnote.svg
similarity index 100%
rename from icons/sixyfourthnote.svg
rename to tools/misc_resources/sixyfourthnote.svg
diff --git a/icons/thirtysecondnote.svg b/tools/misc_resources/thirtysecondnote.svg
similarity index 100%
rename from icons/thirtysecondnote.svg
rename to tools/misc_resources/thirtysecondnote.svg
diff --git a/gtk2_ardour/icons/transport_end.svg b/tools/misc_resources/transport_end.svg
similarity index 100%
rename from gtk2_ardour/icons/transport_end.svg
rename to tools/misc_resources/transport_end.svg
diff --git a/gtk2_ardour/icons/transport_icons.svg b/tools/misc_resources/transport_icons.svg
similarity index 100%
rename from gtk2_ardour/icons/transport_icons.svg
rename to tools/misc_resources/transport_icons.svg
diff --git a/gtk2_ardour/icons/transport_play.svg b/tools/misc_resources/transport_play.svg
similarity index 100%
rename from gtk2_ardour/icons/transport_play.svg
rename to tools/misc_resources/transport_play.svg
diff --git a/gtk2_ardour/icons/transport_range.svg b/tools/misc_resources/transport_range.svg
similarity index 100%
rename from gtk2_ardour/icons/transport_range.svg
rename to tools/misc_resources/transport_range.svg
diff --git a/gtk2_ardour/icons/transport_record.svg b/tools/misc_resources/transport_record.svg
similarity index 100%
rename from gtk2_ardour/icons/transport_record.svg
rename to tools/misc_resources/transport_record.svg
diff --git a/gtk2_ardour/icons/transport_start.svg b/tools/misc_resources/transport_start.svg
similarity index 100%
rename from gtk2_ardour/icons/transport_start.svg
rename to tools/misc_resources/transport_start.svg
diff --git a/gtk2_ardour/icons/transport_stop.svg b/tools/misc_resources/transport_stop.svg
similarity index 100%
rename from gtk2_ardour/icons/transport_stop.svg
rename to tools/misc_resources/transport_stop.svg
diff --git a/gtk2_ardour/icons/tw_edit_icons_07.xcf b/tools/misc_resources/tw_edit_icons_07.xcf
similarity index 100%
rename from gtk2_ardour/icons/tw_edit_icons_07.xcf
rename to tools/misc_resources/tw_edit_icons_07.xcf
diff --git a/icons/wholenote.svg b/tools/misc_resources/wholenote.svg
similarity index 100%
rename from icons/wholenote.svg
rename to tools/misc_resources/wholenote.svg
diff --git a/icons/zoom_full.svg b/tools/misc_resources/zoom_full.svg
similarity index 100%
rename from icons/zoom_full.svg
rename to tools/misc_resources/zoom_full.svg
diff --git a/icons/zoom_in.svg b/tools/misc_resources/zoom_in.svg
similarity index 100%
rename from icons/zoom_in.svg
rename to tools/misc_resources/zoom_in.svg
diff --git a/icons/zoom_in_cursor.svg b/tools/misc_resources/zoom_in_cursor.svg
similarity index 100%
rename from icons/zoom_in_cursor.svg
rename to tools/misc_resources/zoom_in_cursor.svg
diff --git a/icons/zoom_out.svg b/tools/misc_resources/zoom_out.svg
similarity index 100%
rename from icons/zoom_out.svg
rename to tools/misc_resources/zoom_out.svg
diff --git a/icons/zoom_out_cursor.svg b/tools/misc_resources/zoom_out_cursor.svg
similarity index 100%
rename from icons/zoom_out_cursor.svg
rename to tools/misc_resources/zoom_out_cursor.svg
diff --git a/tools/osx_packaging/osx_build b/tools/osx_packaging/osx_build
index f7226bc..68bb675 100755
--- a/tools/osx_packaging/osx_build
+++ b/tools/osx_packaging/osx_build
@@ -16,6 +16,7 @@ mkdir -p "$CACHEDIR"
 
 SAE=
 MIXBUS=
+MIXBUS32C=
 WITH_HARVID=1
 WITH_HARRISON_LV2=
 WITH_X42_LV2=
@@ -24,6 +25,10 @@ STRIP=1
 PRINT_SYSDEPS=
 WITH_NLS=
 
+: ${HARRISONCHANNELSTRIP=harrison_channelstrip}
+
+. ../define_versions.sh
+
 while [ $# -gt 0 ] ; do
     echo "arg = $1"
     case $1 in
@@ -49,9 +54,23 @@ while [ $# -gt 0 ] ; do
 		PRODUCT_PKG_DIR=Mixbus;
 		APPNAME=Mixbus ;
 		shift ;;
+	--mixbus32c) MIXBUS=1;
+		MIXBUS32C=1;
+		WITH_HARRISON_LV2=1 ;
+		WITH_X42_LV2=1 ;
+		WITH_NLS=1 ;
+		SAE= ;
+		WITH_LADSPA=;
+		STRIP= ;
+		PRODUCT_PKG_DIR=Mixbus32C;
+		APPNAME=Mixbus32C-${major_version} ;
+		major_version=""
+		shift ;;
 	--public)
 		SAE= ;
 		WITH_LADSPA=1;
+		WITH_HARRISON_LV2=1 ;
+		WITH_X42_LV2=1 ;
 		PRODUCT_PKG_DIR=Ardour;
 		APPNAME=Ardour ;
 		shift ;;
@@ -71,6 +90,7 @@ while [ $# -gt 0 ] ; do
 	--nostrip) STRIP= ; shift ;;
 	--sysdeps) PRINT_SYSDEPS=1; shift ;;
 	--nls) WITH_NLS=1 ; shift ;;
+	--chanstrip) HARRISONCHANNELSTRIP=$2 ; shift; shift ;;
     esac
 done
 
@@ -79,7 +99,6 @@ if test -z "$PRODUCT_PKG_DIR" -o -z "$APPNAME"; then
 	exit 1
 fi
 
-. ../define_versions.sh
 echo "Version is $release_version"
 if [ "x$commit" != "x" ] ; then
     info_string="$release_version ($commit) built on `hostname` by `whoami` on `date`"
@@ -124,7 +143,9 @@ MidiMaps=$Shared/midi_maps
 ExportFormats=$Shared/export
 Templates=$Shared/templates
 PatchFiles=$Shared/patchfiles
+LuaScripts=$Shared/scripts
 MackieControl=$Shared/mcp
+Themes=$Shared/themes
 
 if [ x$PRINT_SYSDEPS != x ] ; then
 #
@@ -161,6 +182,8 @@ mkdir -p $Frameworks/modules
 mkdir -p $Etc
 mkdir -p $MackieControl
 mkdir -p $PatchFiles
+mkdir -p $LuaScripts
+mkdir -p $Themes
 
 # maybe set variables
 env=""
@@ -174,7 +197,7 @@ if test x$SAE != x ; then
     env="$env<key>ARDOUR_KEYBOARD_LAYOUT</key><string>de-nokeypad</string>"
     env="$env<key>ARDOUR_UI_CONF</key><string>ardour3_ui_sae.conf</string>"
 elif test x$MIXBUS != x ; then
-    appname="Mixbus"
+    appname=$APPNAME
     EXECUTABLE=${appname}${major_version}
     env="$env<key>ARDOUR_MIXBUS</key><string>true</string>"
     #
@@ -236,6 +259,8 @@ cp $BUILD_ROOT/gtk2_ardour/ardour-$release_version $APPROOT/MacOS/$MAIN_EXECUTAB
 if test x$SAE != x ; then
     # cp $BUILD_ROOT/gtk2_ardour/evtest $APPROOT/MacOS/gtkevents
     cp  Ardour3-SAE.icns $Resources/appIcon.icns
+elif test x$MIXBUS32C != x ; then
+    cp  Mixbus32C.icns $Resources/appIcon.icns
 elif test x$MIXBUS != x ; then
     cp  Mixbus.icns $Resources/appIcon.icns
 else
@@ -373,6 +398,15 @@ for x in $BUILD_ROOT/../patchfiles/*.midnam ; do
     cp "$x" $PatchFiles
 done
 
+# Lua Script Files
+# got to be careful with names here
+for x in $BUILD_ROOT/../scripts/*.lua ; do
+	  if test "${x:0:1}" = "_"; then
+			continue;
+		fi
+    cp "$x" $LuaScripts
+done
+
 # MackieControl data
 # got to be careful with names here
 for x in $BUILD_ROOT/../mcp/*.device $BUILD_ROOT/../mcp/*.profile ; do
@@ -448,25 +482,26 @@ echo
 
 echo "Copying other stuff to $APPDIR  ..."
 
-#cp $BUILD_ROOT/gtk2_ardour/ergonomic-us.bindings  $Resources
-
-cp $BUILD_ROOT/gtk2_ardour/mnemonic-us.bindings  $Resources
+cp $BUILD_ROOT/gtk2_ardour/ardour.keys  $Resources
 cp $BUILD_ROOT/gtk2_ardour/ardour.menus $Resources
 cp $BUILD_ROOT/gtk2_ardour/default_ui_config $Resources
 cp $BUILD_ROOT/gtk2_ardour/clearlooks.rc $Resources
 
 # Copied directly from source tree
 
+mkdir ${Resources}/icons
+mkdir ${Resources}/resources
 cp ../../system_config $Resources/system_config
 cp ../../instant.xml $Resources/instant.xml
-cp ../../gtk2_ardour/step_editing.bindings $Resources
-cp ../../gtk2_ardour/mixer.bindings $Resources
-cp -r ../../gtk2_ardour/icons $Resources
-cp -r ../../gtk2_ardour/pixmaps $Resources
-cp ../../gtk2_ardour/dark.colors $Resources
-cp -R ../../gtk2_ardour/splash.png $Shared
-cp -R ../../gtk2_ardour/small-splash.png $Shared
-cp -R ../../gtk2_ardour/ArdourMono.ttf $Shared
+cp ../../gtk2_ardour/icons/*.png ${Resources}/icons/
+cp -r ../../gtk2_ardour/icons/cursor_* ${Resources}/icons/
+cp ../../gtk2_ardour/ArdourMono.ttf $Shared
+cp ../../gtk2_ardour/resources/${PRODUCT_PKG_DIR}-* ${Resources}/resources/
+
+
+# Themes: only install those named for this app
+lower_case_appname=`echo $APPNAME | tr '[:upper:]' '[:lower:]'`
+cp ../../gtk2_ardour/themes/*-${lower_case_appname}.colors $Themes
 
 # go through and recursively remove any .svn dirs in the bundle
 for svndir in `find $APPDIR -name .svn -type dir`; do
@@ -505,7 +540,7 @@ done
 
 echo "Fixing up library names ..."
 # now do the same for all the libraries we include
-for libdir in $Frameworks $Frameworks/modules $Surfaces $Panners $Backends ; do
+for libdir in $Frameworks $Frameworks/modules $Surfaces $Panners $Backends $Frameworks/LV2/* ; do
 
     libbase=`basename $libdir`
     
@@ -583,7 +618,7 @@ if file ${PRODUCT_PKG_DIR}/$APPROOT/MacOS/$MAIN_EXECUTABLE | grep -q x86_64; the
 	OSX_BENSID=osx64
 elif file ${PRODUCT_PKG_DIR}/$APPROOT/MacOS/$MAIN_EXECUTABLE | grep -q ppc; then
 	OSX_ARCH=ppc
-	OSX_BENSID=ppc
+	OSX_BENSID=osxppc
 else
 	OSX_ARCH=i386
 	OSX_BENSID=osx32
@@ -644,26 +679,14 @@ if test x$WITH_X42_LV2 != x ; then
 	echo "bundling x42 plugins"
 	mkdir -p "${PRODUCT_PKG_DIR}/${APPROOT}/lib/LV2"
 
-	METERS_VERSION=$(curl -s -S http://x42-plugins.com/x42/osx/x42-meters.latest.txt)
-	rsync -a -q --partial \
-		rsync://x42-plugins.com/x42/osx/x42-meters-lv2-osx-${METERS_VERSION}.zip \
-		"$CACHEDIR/x42-meters-lv2-osx-${METERS_VERSION}.zip"
-	bsdtar -C "${PRODUCT_PKG_DIR}/${APPROOT}/lib/LV2/" -xf \
-		"$CACHEDIR/x42-meters-lv2-osx-${METERS_VERSION}.zip"
-
-	SETBFREE_VERSION=$(curl -s -S http://x42-plugins.com/x42/osx/setBfree.latest.txt)
-	rsync -a -q --partial \
-		rsync://x42-plugins.com/x42/osx/setBfree-lv2-osx-${SETBFREE_VERSION}.zip \
-		"$CACHEDIR/setBfree-lv2-osx-${SETBFREE_VERSION}.zip"
-	bsdtar -C "${PRODUCT_PKG_DIR}/${APPROOT}/lib/LV2/" -xf \
-		"$CACHEDIR/setBfree-lv2-osx-${SETBFREE_VERSION}.zip"
-
-	MIDIFILTER_VERSION=$(curl -s -S http://x42-plugins.com/x42/osx/x42-midifilter.latest.txt)
-	rsync -a -q --partial \
-		rsync://x42-plugins.com/x42/osx/x42-midifilter-lv2-osx-${MIDIFILTER_VERSION}.zip \
-		"$CACHEDIR/x42-midifilter-lv2-osx-${MIDIFILTER_VERSION}.zip"
-	bsdtar -C "${PRODUCT_PKG_DIR}/${APPROOT}/lib/LV2/" -xf \
-		"$CACHEDIR/x42-midifilter-lv2-osx-${MIDIFILTER_VERSION}.zip"
+	for proj in x42-meters x42-midifilter x42-midimap x42-stereoroute x42-eq setBfree; do
+		X42_VERSION=$(curl -s -S http://x42-plugins.com/x42/osx/${proj}.latest.txt)
+		rsync -a -q --partial \
+			rsync://x42-plugins.com/x42/osx/${proj}-lv2-osx-${X42_VERSION}.zip \
+			"$CACHEDIR/${proj}-lv2-osx-${X42_VERSION}.zip"
+		bsdtar -C "${PRODUCT_PKG_DIR}/${APPROOT}/lib/LV2/" -xf \
+			"$CACHEDIR/${proj}-lv2-osx-${X42_VERSION}.zip"
+	done
 
 	for file in ${PRODUCT_PKG_DIR}/${APPROOT}/lib/LV2/*/*.dylib ; do
 		lipo -extract_family ${OSX_ARCH} ${file} -output ${file}.thin
@@ -672,17 +695,27 @@ if test x$WITH_X42_LV2 != x ; then
 fi
 
 if test -n "$MIXBUS"; then
-	echo "deploying harrison tools for $OSX_BENSID"
+	echo "deploying harrison channelstrip for $OSX_BENSID"
 
 	mkdir -p "${PRODUCT_PKG_DIR}/${APPROOT}/lib/ladspa/strip"
 
 	curl -s -S --fail -#  \
-		-z "${CACHEDIR}/harrison_channelstrip.${OSX_BENSID}.so" \
-		-o "${CACHEDIR}/harrison_channelstrip.${OSX_BENSID}.so" \
-		"http://www.harrisonconsoles.com/mixbus/mb3/beta/harrison-dsp/harrison_channelstrip.${OSX_BENSID}.so"
+		-z "${CACHEDIR}/${HARRISONCHANNELSTRIP}.${OSX_BENSID}.so" \
+		-o "${CACHEDIR}/${HARRISONCHANNELSTRIP}.${OSX_BENSID}.so" \
+		"http://www.harrisonconsoles.com/mixbus/mb3/beta/harrison-dsp/${HARRISONCHANNELSTRIP}.${OSX_BENSID}.so"
+
+	cp "${CACHEDIR}/${HARRISONCHANNELSTRIP}.${OSX_BENSID}.so" \
+		"${PRODUCT_PKG_DIR}/${APPROOT}/lib/ladspa/strip/${HARRISONCHANNELSTRIP}.so"
+
+	echo "deploying harrison vamp plugins for $OSX_BENSID"
+
+	curl -s -S --fail -#  \
+		-z "${CACHEDIR}/harrison_vamp.${OSX_BENSID}.dylib" \
+		-o "${CACHEDIR}/harrison_vamp.${OSX_BENSID}.dylib" \
+		"http://www.harrisonconsoles.com/mixbus/mb3/beta/harrison-dsp/harrison_vamp.${OSX_BENSID}.dylib"
 
-	cp "${CACHEDIR}/harrison_channelstrip.${OSX_BENSID}.so" \
-		"${PRODUCT_PKG_DIR}/${APPROOT}/lib/ladspa/strip/harrison_channelstrip.so"
+	cp "${CACHEDIR}/harrison_vamp.${OSX_BENSID}.dylib" \
+		"${PRODUCT_PKG_DIR}/${APPROOT}/lib/harrison_vamp.dylib"
 fi
 ################################################################################
 
diff --git a/tools/update_luadoc.sh b/tools/update_luadoc.sh
new file mode 100755
index 0000000..07001ca
--- /dev/null
+++ b/tools/update_luadoc.sh
@@ -0,0 +1,27 @@
+#!/bin/sh
+## ardour needs to be configured with  --luadoc and build should be up-to date.
+
+cd `dirname $0`
+DIR=`pwd`
+set -e
+test -f ../libs/ardour/ardour/ardour.h
+test -e ../gtk2_ardour/arluadoc
+test -e ../build/gtk2_ardour/luadoc
+
+# generate ../doc/ardourapi.json.gz
+if test -z "$1"; then
+	./doxy2json/ardourdoc.sh
+fi
+
+# generate ../doc/luadoc.json.gz
+$DIR/../gtk2_ardour/arluadoc
+
+if test -f $HOME/src/ardour-manual/_manual/24_lua-scripting/02_class_reference.html; then
+	php $DIR/fmt-luadoc.php -m > $HOME/src/ardour-manual/_manual/24_lua-scripting/02_class_reference.html
+	ls -l $HOME/src/ardour-manual/_manual/24_lua-scripting/02_class_reference.html
+	cd $HOME/src/ardour-manual/
+	./build.rb
+else
+	php $DIR/fmt-luadoc.php > /tmp/luadoc.html
+	ls -l /tmp/luadoc.html
+fi
diff --git a/tools/waflib.patch b/tools/waflib.patch
new file mode 100644
index 0000000..c5f2f18
--- /dev/null
+++ b/tools/waflib.patch
@@ -0,0 +1,13 @@
+diff --git a/waflib/Tools/c_config.py b/waflib/Tools/c_config.py
+index ee1c5c2..0672f3d 100644
+--- a/waflib/Tools/c_config.py
++++ b/waflib/Tools/c_config.py
+@@ -150,6 +150,8 @@ def parse_flags(self, line, uselib, env=None, force_static=False):
+ 		elif st == '-L':
+ 			if not ot: ot = lst.pop(0)
+ 			appu('LIBPATH_' + uselib, [ot])
++		elif x.startswith('-std=c++'):
++			app('CXXFLAGS_' + uselib, [x])
+ 		elif x == '-pthread' or x.startswith('+') or x.startswith('-std'):
+ 			app('CFLAGS_' + uselib, [x])
+ 			app('CXXFLAGS_' + uselib, [x])
diff --git a/tools/x-win/package.sh b/tools/x-win/package.sh
index b16c454..9d878dc 100755
--- a/tools/x-win/package.sh
+++ b/tools/x-win/package.sh
@@ -16,6 +16,19 @@ test -f gtk2_ardour/wscript || exit 1
 : ${MAKEFLAGS=-j4}
 : ${TMPDIR=/var/tmp}
 : ${SRCCACHE=/var/tmp/winsrc}  # source-code tgz cache
+: ${HARRISONCHANNELSTRIP=harrison_channelstrip}
+
+# see also wscript, video_tool_paths.cc, bundle_env_mingw.cc
+# registry keys based on this are used there
+PROGRAM_NAME=Ardour
+PROGRAM_KEY=Ardour
+PROGRAM_VERSION=${major_version}
+
+PRODUCT_NAME=ardour
+PRODUCT_VERSION=${major_version}
+
+WITH_HARRISON_LV2=1 ;
+WITH_X42_LV2=1 ;
 
 # TODO: grep from build/config.log instead
 while [ $# -gt 0 ] ; do
@@ -25,23 +38,27 @@ while [ $# -gt 0 ] ; do
 			MIXBUS=1
 			WITH_HARRISON_LV2=1 ;
 			WITH_X42_LV2=1 ;
+			PROGRAM_NAME=Mixbus
+			PROGRAM_KEY=Mixbus
+			PRODUCT_NAME=mixbus
 			shift ;;
+		--mixbus32c)
+			MIXBUS=1
+			WITH_HARRISON_LV2=1 ;
+			WITH_X42_LV2=1 ;
+			PRODUCT_NAME=mixbus32c
+			PROGRAM_KEY=Mixbus32C
+			PROGRAM_NAME=Mixbus32C-${PROGRAM_VERSION}
+			PROGRAM_VERSION=""
+			shift ;;
+		--chanstrip) HARRISONCHANNELSTRIP=$2 ; shift; shift ;;
 	esac
 done
 
-# see also wscript, video_tool_paths.cc, bundle_env_mingw.cc
-# registry keys based on this are used there
-PROGRAM_NAME=Ardour
-PRODUCT_NAME=ardour
-PROGRAM_VERSION=${major_version}
 
 LOWERCASE_DIRNAME=ardour${major_version}
 STATEFILE_SUFFIX=ardour # see filename_extensions.cc
 
-if test -n "$MIXBUS"; then
-	PROGRAM_NAME=Mixbus
-	PRODUCT_NAME=mixbus
-fi
 
 # derived variables
 PRODUCT_ID=${PROGRAM_NAME}${PROGRAM_VERSION}
@@ -233,23 +250,13 @@ if test x$WITH_X42_LV2 != x ; then
 
 	echo "Adding x42 Plugins"
 
-	METERS_VERSION=$(curl -s -S http://x42-plugins.com/x42/win/x42-meters.latest.txt)
-	rsync -a -q --partial \
-		rsync://x42-plugins.com/x42/win/x42-meters-lv2-${WARCH}-${METERS_VERSION}.zip \
-		"${SRCCACHE}/x42-meters-lv2-${WARCH}-${METERS_VERSION}.zip"
-	unzip -q -d "$ALIBDIR/LV2/" "${SRCCACHE}/x42-meters-lv2-${WARCH}-${METERS_VERSION}.zip"
-
-	SETBFREE_VERSION=$(curl -s -S http://x42-plugins.com/x42/win/setBfree.latest.txt)
-	rsync -a -q --partial \
-		rsync://x42-plugins.com/x42/win/setBfree-lv2-${WARCH}-${SETBFREE_VERSION}.zip \
-		"${SRCCACHE}/setBfree-lv2-${WARCH}-${SETBFREE_VERSION}.zip"
-	unzip -q -d "$ALIBDIR/LV2/" "${SRCCACHE}/setBfree-lv2-${WARCH}-${SETBFREE_VERSION}.zip"
-
-	MIDIFILTER_VERSION=$(curl -s -S http://x42-plugins.com/x42/win/x42-midifilter.latest.txt)
-	rsync -a -q --partial \
-		rsync://x42-plugins.com/x42/win/x42-midifilter-lv2-${WARCH}-${MIDIFILTER_VERSION}.zip \
-		"${SRCCACHE}/x42-midifilter-lv2-${WARCH}-${MIDIFILTER_VERSION}.zip"
-	unzip -q -d "$ALIBDIR/LV2/" "${SRCCACHE}/x42-midifilter-lv2-${WARCH}-${MIDIFILTER_VERSION}.zip"
+	for proj in x42-meters x42-midifilter x42-midimap x42-stereoroute x42-eq setBfree; do
+		X42_VERSION=$(curl -s -S http://x42-plugins.com/x42/win/${proj}.latest.txt)
+		rsync -a -q --partial \
+			rsync://x42-plugins.com/x42/win/${proj}-lv2-${WARCH}-${X42_VERSION}.zip \
+			"${SRCCACHE}/${proj}-lv2-${WARCH}-${X42_VERSION}.zip"
+		unzip -q -d "$ALIBDIR/LV2/" "${SRCCACHE}/${proj}-lv2-${WARCH}-${X42_VERSION}.zip"
+	done
 fi
 
 if test x$WITH_HARRISON_LV2 != x ; then
@@ -269,12 +276,22 @@ if test -n "$MIXBUS"; then
 
 	mkdir -p $ALIBDIR/ladspa/strip
 	curl -s -S --fail -# \
-		-z "${SRCCACHE}/harrison_channelstrip.${WARCH}.dll" \
-		-o "${SRCCACHE}/harrison_channelstrip.${WARCH}.dll" \
-		"http://www.harrisonconsoles.com/mixbus/mb3/beta/harrison-dsp/harrison_channelstrip.${WARCH}.dll"
+		-z "${SRCCACHE}/${HARRISONCHANNELSTRIP}.${WARCH}.dll" \
+		-o "${SRCCACHE}/${HARRISONCHANNELSTRIP}.${WARCH}.dll" \
+		"http://www.harrisonconsoles.com/mixbus/mb3/beta/harrison-dsp/${HARRISONCHANNELSTRIP}.${WARCH}.dll"
+
+	cp "${SRCCACHE}/${HARRISONCHANNELSTRIP}.${WARCH}.dll" \
+		"$ALIBDIR/ladspa/strip/${HARRISONCHANNELSTRIP}.dll"
+
+	echo "Deploying Harrison Vamp Plugins"
+	mkdir -p $ALIBDIR/vamp
+	curl -s -S --fail -# \
+		-z "${SRCCACHE}/harrison_vamp.${WARCH}.dll" \
+		-o "${SRCCACHE}/harrison_vamp.${WARCH}.dll" \
+		"http://www.harrisonconsoles.com/mixbus/mb3/beta/harrison-dsp/harrison_vamp.${WARCH}.dll"
 
-	cp "${SRCCACHE}/harrison_channelstrip.${WARCH}.dll" \
-		"$ALIBDIR/ladspa/strip/harrison_channelstrip.dll"
+	cp "${SRCCACHE}/harrison_vamp.${WARCH}.dll" \
+		"$ALIBDIR/vamp/harrison_vamp.dll"
 fi
 
 ( cd $DESTDIR ; find . ) > ${TMPDIR}/file_list.txt
@@ -313,7 +330,7 @@ Name "${PROGRAM_NAME}${PROGRAM_VERSION}"
 OutFile "${OUTFILE}"
 RequestExecutionLevel admin
 InstallDir "\$${PGF}\\${PRODUCT_ID}"
-InstallDirRegKey HKLM "Software\\${PROGRAM_NAME}\\${PRODUCT_ID}\\$WARCH" "Install_Dir"
+InstallDirRegKey HKLM "Software\\${PRODUCT_NAME}\\${PRODUCT_ID}\\$WARCH" "Install_Dir"
 !define MUI_ICON "share\\${PRODUCT_ICON}"
 
 EOF
@@ -362,7 +379,7 @@ Section "${PROGRAM_NAME}${PROGRAM_VERSION} (required)" SecMainProg
   File /r share
   File /nonfatal debug.bat
   File /nonfatal /r gdb
-  WriteRegStr HKLM "Software\\${PROGRAM_NAME}\\v${PROGRAM_VERSION}\\$WARCH" "Install_Dir" "\$INSTDIR"
+  WriteRegStr HKLM "Software\\${PROGRAM_KEY}\\v${major_version}\\$WARCH" "Install_Dir" "\$INSTDIR"
   WriteRegStr HKLM "Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\${PRODUCT_ID}-${WARCH}" "DisplayName" "${PROGRAM_NAME}${PROGRAM_VERSION}"
   WriteRegStr HKLM "Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\${PRODUCT_ID}-${WARCH}" "UninstallString" '"\$INSTDIR\\uninstall.exe"'
   WriteRegDWORD HKLM "Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\${PRODUCT_ID}-${WARCH}" "NoModify" 1
@@ -380,7 +397,7 @@ if test -z "$NOVIDEOTOOLS"; then
 
 	cat >> $NSISFILE << EOF
 Section "Videotimeline Tools" SecVideo
-  WriteRegStr HKLM "Software\\${PROGRAM_NAME}\\v${PROGRAM_VERSION}\\video" "Install_Dir" "\$INSTDIR\\video"
+  WriteRegStr HKLM "Software\\${PROGRAM_KEY}\\v${major_version}\\video" "Install_Dir" "\$INSTDIR\\video"
   SetOutPath \$INSTDIR
   File /r video
 SectionEnd
@@ -441,7 +458,7 @@ Section "Uninstall"
   SetShellVarContext all
   DeleteRegKey HKLM "Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\${PRODUCT_ID}-${WARCH}"
   DeleteRegKey HKLM "Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\${PRODUCT_ID}"
-  DeleteRegKey HKLM "Software\\${PROGRAM_NAME}\\v${PROGRAM_VERSION}"
+  DeleteRegKey HKLM "Software\\${PROGRAM_KEY}\\v${major_version}"
   RMDir /r "\$INSTDIR\\bin"
   RMDir /r "\$INSTDIR\\lib"
   RMDir /r "\$INSTDIR\\share"
diff --git a/vst/ardourvst.in b/vst/ardourvst.in
index 9cf8807..639acb4 100644
--- a/vst/ardourvst.in
+++ b/vst/ardourvst.in
@@ -1,13 +1,14 @@
 #!/bin/sh
 
 #
-# Running Ardour requires these 3 variables to be set
+# Running Ardour requires these variables to be set
 #
 
 export ARDOUR_DATA_PATH=@DATADIR@
 export ARDOUR_CONFIG_PATH=@CONFDIR@
 export ARDOUR_DLL_PATH=@LIBDIR@
 
+export VAMP_PATH=@LIBDIR@/vamp${VAMP_PATH:+:$VAMP_PATH}
 export GTK_PATH=@LIBDIR@${GTK_PATH:+:$GTK_PATH}
 export LD_LIBRARY_PATH=@LIBDIR@${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}
 
@@ -15,5 +16,3 @@ export LD_LIBRARY_PATH=@LIBDIR@${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}
 export ARDOUR_SELF="$0"
 
 exec wine @LIBDIR@/ardour- at VERSION@-vst.exe.so "$@"
-
-
diff --git a/wscript b/wscript
index 4635eaf..fce1359 100644
--- a/wscript
+++ b/wscript
@@ -135,10 +135,11 @@ clang_dict['sse'] = ''
 clang_dict['fpmath-sse'] = ''
 clang_dict['xmmintrinsics'] = ''
 clang_dict['silence-unused-arguments'] = '-Qunused-arguments'
-clang_dict['extra-cxx-warnings'] = [ '-Woverloaded-virtual', '-Wno-mismatched-tags' ]
+clang_dict['extra-cxx-warnings'] = [ '-Woverloaded-virtual', '-Wno-mismatched-tags', '-Wno-cast-align', '-Wno-unused-local-typedefs' ]
 clang_dict['cxx-strict'] = [ '-ansi', '-Wnon-virtual-dtor', '-Woverloaded-virtual', '-fstrict-overflow' ]
 clang_dict['strict'] = ['-Wall', '-Wcast-align', '-Wextra', '-Wwrite-strings' ]
 clang_dict['generic-x86'] = [ '-arch', 'i386' ]
+clang_dict['full-optimization'] = [ '-O3', '-fomit-frame-pointer', '-ffast-math', ]
 compiler_flags_dictionaries['clang'] = clang_dict;
 
 clang_darwin_dict = compiler_flags_dictionaries['clang'].copy();
@@ -147,7 +148,7 @@ clang_darwin_dict['full-optimization'] = [ '-O3', '-ffast-math', '-fstrength-red
 compiler_flags_dictionaries['clang-darwin'] = clang_darwin_dict;
 
 def fetch_git_revision ():
-    cmd = "git describe HEAD | sed 's/^[A-Za-z]*+//'"
+    cmd = "git describe HEAD | sed 's/^[A-Za-z0-9]*+//'"
     output = subprocess.Popen(cmd, shell=True, stderr=subprocess.STDOUT, stdout=subprocess.PIPE).communicate()[0].splitlines()
     rev = output[0].decode ('utf-8')
     return rev
@@ -203,6 +204,7 @@ children = [
         'libs/qm-dsp',
         'libs/vamp-plugins',
         'libs/libltc',
+        'libs/lua',
         'libs/ptformat',
         # core ardour libraries
         'libs/pbd',
@@ -217,11 +219,16 @@ children = [
         'libs/audiographer',
         'libs/canvas',
         'libs/plugins/reasonablesynth.lv2',
+        'libs/plugins/a-comp.lv2',
+        'libs/plugins/a-delay.lv2',
+        'libs/plugins/a-eq.lv2',
+        'libs/plugins/a-reverb.lv2',
         'gtk2_ardour',
         'export',
         'midi_maps',
         'mcp',
         'patchfiles',
+        'scripts',
         'headless',
         'session_utils',
         # shared helper binaries (plugin-scanner, exec-wrapper)
@@ -229,6 +236,7 @@ children = [
         'libs/vfork',
         'libs/ardouralsautil',
         'cfgtool',
+        'tools/luadevel',
 ]
 
 i18n_children = [
@@ -390,7 +398,7 @@ int main() { return 0; }''',
         #
         compiler_flags.append ('-U__STRICT_ANSI__')
 
-    if opt.use_libcpp:
+    if opt.use_libcpp or conf.env['build_host'] in [ 'el_capitan' ]:
        cxx_flags.append('--stdlib=libc++')
        linker_flags.append('--stdlib=libc++')
 
@@ -402,7 +410,7 @@ int main() { return 0; }''',
             # from requiring a full path to requiring just the header name.
             cxx_flags.append('-DCARBON_FLAT_HEADERS')
 
-            if not opt.use_libcpp:
+            if not opt.use_libcpp and not conf.env['build_host'] in [ 'el_capitan' ]:
                 cxx_flags.append('--stdlib=libstdc++')
                 linker_flags.append('--stdlib=libstdc++')
             # Prevents visibility issues in standard headers
@@ -564,6 +572,9 @@ int main() { return 0; }''',
     if opt.stl_debug:
         cxx_flags.append("-D_GLIBCXX_DEBUG")
 
+    if re.search ("freebsd", sys.platform) != None:
+        linker_flags.append('-lexecinfo')
+
     if conf.env['DEBUG_RT_ALLOC']:
         compiler_flags.append('-DDEBUG_RT_ALLOC')
         linker_flags.append('-ldl')
@@ -607,6 +618,10 @@ int main() { return 0; }''',
     if Options.options.program_name.lower() == "mixbus":
         compiler_flags.append ('-DMIXBUS')
 
+    if Options.options.program_name.lower() == "mixbus32c":
+        compiler_flags.append ('-DMIXBUS')
+        compiler_flags.append ('-DMIXBUS32C')
+
     compiler_flags.append ('-DPROGRAM_NAME="' + Options.options.program_name + '"')
     compiler_flags.append ('-DPROGRAM_VERSION="' + PROGRAM_VERSION + '"')
 
@@ -629,6 +644,16 @@ int main() { return 0; }''',
     conf.env.append_value('CXXFLAGS', cxx_flags)
     conf.env.append_value('LINKFLAGS', linker_flags)
 
+def create_resource_file(icon):
+    try:
+        text = 'IDI_ICON1 ICON DISCARDABLE "icons/' + icon + '.ico"\n'
+        o = open('gtk2_ardour/windows_icon.rc', 'w')
+        o.write(text)
+        o.close()
+    except IOError:
+        print('Could not open gtk2_ardour/windows_icon.rc for writing\n')
+        sys.exit(-1)
+
 def is_tracks_build (conf):
         return conf.env['PROGRAM_NAME'] == 'Tracks Live'
 
@@ -678,6 +703,8 @@ def options(opt):
                    help='Build internal libs as static libraries')
     opt.add_option('--use-external-libs', action='store_true', default=False, dest='use_external_libs',
                    help='Use external/system versions of some bundled libraries')
+    opt.add_option('--luadoc', action='store_true', default=False, dest='luadoc',
+                    help='Compile Tool to dump LuaBindings (needs C++11)')
     opt.add_option('--lv2', action='store_true', default=True, dest='lv2',
                     help='Compile with support for LV2 (if Lilv+Suil is available)')
     opt.add_option('--no-lv2', action='store_false', dest='lv2',
@@ -741,6 +768,8 @@ def options(opt):
                     help='Turn on AddressSanitizer (requires GCC >= 4.8 or clang >= 3.1)')
     opt.add_option('--ptformat', action='store_true', default=False, dest='ptformat',
                     help='Turn on PT session import option')
+    opt.add_option('--no-threaded-waveviews', action='store_true', default=False, dest='no_threaded_waveviews',
+                    help='Disable threaded waveview rendering')
 
     for i in children:
         opt.recurse(i)
@@ -844,9 +873,7 @@ def configure(conf):
         conf.define ('HAVE_COREAUDIO', 1)
         conf.define ('AUDIOUNIT_SUPPORT', 1)
 
-        conf.define ('GTKOSX', 1)
         conf.define ('TOP_MENUBAR',1)
-        conf.define ('GTKOSX',1)
 
         # It would be nice to be able to use this to force back-compatibility with 10.4
         # but even by the time of 11, the 10.4 SDK is no longer available in any normal
@@ -894,6 +921,10 @@ def configure(conf):
             print ('No Carbon support available for this build\n')
 
 
+    if Options.options.luadoc:
+        conf.env['LUABINDINGDOC'] = True
+        conf.define ('LUABINDINGDOC', 1)
+
     if Options.options.internal_shared_libs:
         conf.define('INTERNAL_SHARED_LIBS', 1)
 
@@ -916,7 +947,10 @@ def configure(conf):
     # executing a test program is n/a when cross-compiling
     if Options.options.dist_target != 'mingw':
         if Options.options.dist_target != 'msvc':
-            conf.check_cc(function_name='dlopen', header_name='dlfcn.h', lib='dl', uselib_store='DL')
+            if re.search ("freebsd", sys.platform) != None:
+                conf.check_cc(function_name='dlopen', header_name='dlfcn.h', uselib_store='DL')
+            else:
+                conf.check_cc(function_name='dlopen', header_name='dlfcn.h', lib='dl', uselib_store='DL')
         conf.check_cxx(fragment = "#include <boost/version.hpp>\nint main(void) { return (BOOST_VERSION >= 103900 ? 0 : 1); }\n",
                   execute = "1",
                   mandatory = True,
@@ -1079,7 +1113,10 @@ int main () { return 0; }
     if opts.ptformat:
         conf.define('PTFORMAT', 1)
         conf.env['PTFORMAT'] = True
-
+    if opts.no_threaded_waveviews:
+        conf.define('NO_THREADED_WAVEVIEWS', 1)
+        conf.env['NO_THREADED_WAVEVIEWS'] = True
+        
     backends = opts.with_backends.split(',')
 
     if not backends:
@@ -1159,8 +1196,10 @@ const char* const ardour_config_info = "\\n\\
     write_config_text('Freedesktop files',     opts.freedesktop)
     write_config_text('Libjack linking',       conf.env['libjack_link'])
     write_config_text('Libjack metadata',      conf.is_defined ('HAVE_JACK_METADATA'))
+    write_config_text('Lua Binding Doc',       conf.is_defined('LUABINDINGDOC'))
     write_config_text('LV2 UI embedding',      conf.is_defined('HAVE_SUIL'))
     write_config_text('LV2 support',           conf.is_defined('LV2_SUPPORT'))
+    write_config_text('LV2 extensions',        conf.is_defined('LV2_EXTENDED'))
     write_config_text('LXVST support',         conf.is_defined('LXVST_SUPPORT'))
     write_config_text('OGG',                   conf.is_defined('HAVE_OGG'))
     write_config_text('Phone home',            conf.is_defined('PHONE_HOME'))
@@ -1178,16 +1217,12 @@ const char* const ardour_config_info = "\\n\\
     write_config_text('Wiimote support',       conf.is_defined('BUILD_WIIMOTE'))
     write_config_text('Windows key',           opts.windows_key)
 
-    print ('\nBackends:')
-    
     write_config_text('PortAudio Backend',     conf.env['BUILD_PABACKEND'])
     write_config_text('CoreAudio/Midi Backend',conf.env['BUILD_CORECRAPPITA'])
     write_config_text('ALSA Backend',          conf.env['BUILD_ALSABACKEND'])
     write_config_text('Dummy backend',         conf.env['BUILD_DUMMYBACKEND'])
     write_config_text('JACK Backend',          conf.env['BUILD_JACKBACKEND'])
 
-    print ('\n')
-    
     write_config_text('C compiler flags',      conf.env['CFLAGS'])
     write_config_text('C++ compiler flags',    conf.env['CXXFLAGS'])
     write_config_text('Linker flags',          conf.env['LINKFLAGS'])
@@ -1196,6 +1231,9 @@ const char* const ardour_config_info = "\\n\\
     config_text.close ()
     print('')
 
+    if Options.options.dist_target == 'mingw' or Options.options.dist_target == 'msvc':
+        create_resource_file(Options.options.program_name.lower())
+
 def build(bld):
     create_stored_revision()
 

-- 
ardour Debian packaging



More information about the pkg-multimedia-commits mailing list